diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/index.html b/index.html new file mode 100644 index 00000000..03b53610 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +Under construction diff --git a/odoc/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 00000000..0acaaff0 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_AMS-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Bold.woff2 b/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 00000000..f390922e Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 00000000..75344a1f Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 b/odoc/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 00000000..395f28be Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Fraktur-Bold.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Fraktur-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 00000000..735f6948 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Fraktur-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Main-Bold.woff2 b/odoc/_odoc_support/fonts/KaTeX_Main-Bold.woff2 new file mode 100644 index 00000000..ab2ad21d Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Main-Bold.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Main-BoldItalic.woff2 b/odoc/_odoc_support/fonts/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 00000000..5931794d Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Main-BoldItalic.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Main-Italic.woff2 b/odoc/_odoc_support/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 00000000..b50920e1 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Main-Italic.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Main-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 00000000..eb24a7ba Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Main-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 b/odoc/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 00000000..29657023 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Math-BoldItalic.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Math-Italic.woff2 b/odoc/_odoc_support/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 00000000..215c143f Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Math-Italic.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_SansSerif-Bold.woff2 b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 00000000..cfaa3bda Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Bold.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 00000000..349c06dc Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Italic.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_SansSerif-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 00000000..a90eea85 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_SansSerif-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Script-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 00000000..b3048fc1 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Script-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 00000000..c5a8462f Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Size1-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Size2-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Size2-Regular.woff2 new file mode 100644 index 00000000..e1bccfe2 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Size2-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Size3-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Size3-Regular.woff2 new file mode 100644 index 00000000..249a2866 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Size3-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 00000000..680c1308 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Size4-Regular.woff2 differ diff --git a/odoc/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 b/odoc/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 00000000..771f1af7 Binary files /dev/null and b/odoc/_odoc_support/fonts/KaTeX_Typewriter-Regular.woff2 differ diff --git a/odoc/_odoc_support/highlight.pack.js b/odoc/_odoc_support/highlight.pack.js new file mode 100644 index 00000000..a3731597 --- /dev/null +++ b/odoc/_odoc_support/highlight.pack.js @@ -0,0 +1,461 @@ +/*! + Highlight.js v11.7.0 (git: 82688fad18) + (c) 2006-2022 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";var e={exports:{}};function t(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] +;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} +e.exports=t,e.exports.default=t;class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} +const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" +;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const a=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class c{constructor(){ +this.rootNode=a(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=a({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} +function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} +function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} +function b(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} +r+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], +"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} +const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, +contains:[]},n);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, +contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function B(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function H(e,t){ +void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},C=["of","and","for","in","not","or","if","then","parent","list","value"] +;function $(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ +return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) +},G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) +;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ +function t(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s +;if(s.isCompiled)return a +;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), +s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null +;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), +c=s.keywords.$pattern, +delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), +s.end&&(a.endRe=t(a.end)), +a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), +s.illegal&&(a.illegalRe=t(s.illegal)), +s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ +starts:e.starts?r(e.starts):null +}):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) +})),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ +return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ +const i=Object.create(null),r=Object.create(null),s=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function b(e){ +return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) +;const o=s.result?s.result:E(s.language,s.code,n) +;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" +;for(;t;){n+=S.substring(e,t.index) +;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ +const[e,i]=s +;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i +;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(S) +;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top +}else e=x(S,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ +if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] +;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ +value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) +;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ +return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N +;N.endScope&&N.endScope._wrap?(d(), +M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), +u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), +d(),s.excludeEnd&&(S=n));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent +}while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} +let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 +;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ +if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=s,"begin"===s.type)return(e=>{ +const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] +;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) +;return i.skip?S+=t:(i.excludeBegin&&(S+=t), +d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) +;if("illegal"===s.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} +if("illegal"===s.type&&""===a)return 1 +;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=a,a.length}const y=O(e) +;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] +;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ +for(N.matcher.considerAll();;){ +A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) +;j=e.index+n} +return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ +language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, +context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} +;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ +const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} +;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) +;r.unshift(n);const s=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o +;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(k("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,s.language),e.result={language:s.language,re:s.relevance, +relevance:s.relevance},s.secondBest&&(e.secondBest={ +language:s.secondBest.language,relevance:s.secondBest.relevance +}),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ +"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 +}function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} +function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +r[e.toLowerCase()]=t}))}function N(e){const t=O(e) +;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, +highlightElement:w, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, +initHighlighting:()=>{ +_(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +_(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;K(t),r=c} +r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, +autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} +}),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 +},t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, +anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) +;return Object.assign(t,A),t})({});return te}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `xml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[t,i,l,c]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ +className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ +className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} +})();hljs.registerLanguage("xml",e)})();/*! `markdown` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, +end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, +relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] +}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) +;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) +})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})() +;hljs.registerLanguage("markdown",e)})();/*! `plaintext` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0})})() +;hljs.registerLanguage("plaintext",t)})();/*! `ocaml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>({name:"OCaml",aliases:["ml"], +keywords:{$pattern:"[a-z_]\\w*!?", +keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref", +literal:"true false"},illegal:/\/\/|>>/,contains:[{className:"literal", +begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},e.COMMENT("\\(\\*","\\*\\)",{ +contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{ +className:"type",begin:"`[A-Z][\\w']*"},{className:"type", +begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0 +},e.inherit(e.APOS_STRING_MODE,{className:"string",relevance:0 +}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),{className:"number", +begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)", +relevance:0},{begin:/->/}]})})();hljs.registerLanguage("ocaml",e)})();/*! `python` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,i=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:i, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},t={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:s,illegal:/#/},l={begin:/\{\{/,relevance:0},b={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},o="[0-9](_?[0-9])*",c=`(\\b(${o}))?\\.(${o})|\\b(${o})\\.`,d="\\b|"+i.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${o})|(${c}))[eE][+-]?(${o})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${o})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:s, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s, +contains:["self",t,g,b,e.HASH_COMMENT_MODE]}]};return r.contains=[b,g,t],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s, +illegal:/(<\/|->|\?)|=>/,contains:[t,g,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},b,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,b]}]}}})() +;hljs.registerLanguage("python",e)})();/*! `reasonml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",s="("+["||","++","**","+.","*","/","*.","/.","..."].map((e=>e.split("").map((e=>"\\"+e)).join(""))).join("|")+"|\\|>|&&|==|===)",i="\\s+"+s+"\\s+",r={ +keyword:"and as asr assert begin class constraint do done downto else end exception external for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new nonrec object of open or private rec sig struct then to try type val virtual when while with", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ", +literal:"true false" +},l="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",t={ +className:"number",relevance:0,variants:[{begin:l},{begin:"\\(-"+l+"\\)"}]},c={ +className:"operator",relevance:0,begin:s},o=[{className:"identifier", +relevance:0,begin:n},c,t],g=[e.QUOTE_STRING_MODE,c,{className:"module", +begin:"\\b"+a,returnBegin:!0,relevance:0,end:".",contains:[{ +className:"identifier",begin:a,relevance:0}]}],b=[{className:"module", +begin:"\\b"+a,returnBegin:!0,end:".",relevance:0,contains:[{ +className:"identifier",begin:a,relevance:0}]}],m={className:"function", +relevance:0,keywords:r,variants:[{begin:"\\s(\\(\\.?.*?\\)|"+n+")\\s*=>", +end:"\\s*=>",returnBegin:!0,relevance:0,contains:[{className:"params", +variants:[{begin:n},{ +begin:"~?[a-z$_][0-9a-zA-Z$_]*(\\s*:\\s*[a-z$_][0-9a-z$_]*(\\(\\s*('?[a-z$_][0-9a-z$_]*\\s*(,'?[a-z$_][0-9a-z$_]*\\s*)*)?\\))?){0,2}" +},{begin:/\(\s*\)/}]}]},{begin:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",end:"\\s=>", +returnBegin:!0,relevance:0,contains:[{className:"params",relevance:0,variants:[{ +begin:n,end:"(,|\\n|\\))",relevance:0,contains:[c,{className:"typing",begin:":", +end:"(,|\\n)",returnBegin:!0,relevance:0,contains:b}]}]}]},{ +begin:"\\(\\.\\s"+n+"\\)\\s*=>"}]};g.push(m);const d={className:"constructor", +begin:a+"\\(",end:"\\)",illegal:"\\n",keywords:r, +contains:[e.QUOTE_STRING_MODE,c,{className:"params",begin:"\\b"+n}]},u={ +className:"pattern-match",begin:"\\|",returnBegin:!0,keywords:r,end:"=>", +relevance:0,contains:[d,c,{relevance:0,className:"constructor",begin:a}]},v={ +className:"module-access",keywords:r,returnBegin:!0,variants:[{ +begin:"\\b("+a+"\\.)+"+n},{begin:"\\b("+a+"\\.)+\\(",end:"\\)",returnBegin:!0, +contains:[m,{begin:"\\(",end:"\\)",relevance:0,skip:!0}].concat(g)},{ +begin:"\\b("+a+"\\.)+\\{",end:/\}/}],contains:g};return b.push(v),{ +name:"ReasonML",aliases:["re"],keywords:r,illegal:"(:-|:=|\\$\\{|\\+=)", +contains:[e.COMMENT("/\\*","\\*/",{illegal:"^(#,\\/\\/)"}),{ +className:"character",begin:"'(\\\\[^']+|[^'])'",illegal:"\\n",relevance:0 +},e.QUOTE_STRING_MODE,{className:"literal",begin:"\\(\\)",relevance:0},{ +className:"literal",begin:"\\[\\|",end:"\\|\\]",relevance:0,contains:o},{ +className:"literal",begin:"\\[",end:"\\]",relevance:0,contains:o},d,{ +className:"operator",begin:i,illegal:"--\x3e",relevance:0 +},t,e.C_LINE_COMMENT_MODE,u,m,{className:"module-def", +begin:"\\bmodule\\s+"+n+"\\s+"+a+"\\s+=\\s+\\{",end:/\}/,returnBegin:!0, +keywords:r,relevance:0,contains:[{className:"module",relevance:0,begin:a},{ +begin:/\{/,end:/\}/,relevance:0,skip:!0}].concat(g)},v]}}})() +;hljs.registerLanguage("reasonml",e)})(); \ No newline at end of file diff --git a/odoc/_odoc_support/katex.min.css b/odoc/_odoc_support/katex.min.css new file mode 100644 index 00000000..5f1f8576 --- /dev/null +++ b/odoc/_odoc_support/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.15.2"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/odoc/_odoc_support/katex.min.js b/odoc/_odoc_support/katex.min.js new file mode 100644 index 00000000..e4d78f24 --- /dev/null +++ b/odoc/_odoc_support/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Zn}});var r=function e(t,r){this.position=void 0;var n,a="KaTeX parse error: "+t,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;n=i.start;var s=i.end;n===o.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");a+=(n>15?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15":">","<":"<",'"':""","'":"'"},o=/[&><"']/g;var s=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(o,(function(e){return i[e]}))},hyphenate:function(e){return e.replace(a,"-$1").toLowerCase()},getBaseElem:s,isCharacterBox:function(e){var t=s(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(e){return"#"+e}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(e,t){return t.push(e),t}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(e){return Math.max(0,e)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(e){return Math.max(0,e)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(e){return Math.max(0,e)},cli:"-e, --max-expand ",cliProcessor:function(e){return"Infinity"===e?1/0:parseInt(e)}},globalGroup:{type:"boolean",cli:!1}};function m(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var c=function(){function e(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},h)if(h.hasOwnProperty(t)){var r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:m(r)}}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){e.url&&!e.protocol&&(e.protocol=l.protocolFromUrl(e.url));var t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)},e}(),u=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return p[d[this.id]]},t.sub=function(){return p[f[this.id]]},t.fracNum=function(){return p[g[this.id]]},t.fracDen=function(){return p[v[this.id]]},t.cramp=function(){return p[b[this.id]]},t.text=function(){return p[y[this.id]]},t.isTight=function(){return this.size>=2},e}(),p=[new u(0,0,!1),new u(1,0,!0),new u(2,1,!1),new u(3,1,!0),new u(4,2,!1),new u(5,2,!0),new u(6,3,!1),new u(7,3,!0)],d=[4,5,4,5,6,7,6,7],f=[5,5,5,5,7,7,7,7],g=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],x={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},w=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var k=[];function S(e){for(var t=0;t=k[t]&&e<=k[t+1])return!0;return!1}w.forEach((function(e){return e.blocks.forEach((function(e){return k.push.apply(k,e)}))}));var M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t=5?0:e>=3?1:2]){var r=N[t]={cssEmPerMu:B.quad[t]/18};for(var n in B)B.hasOwnProperty(n)&&(r[n]=B[n][t])}return N[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();H.BASESIZE=6;var E=H,L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},P=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},F=function(e,t){var r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},V=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((function(e){return e})).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Y=function(e){var t=document.createElement(e);for(var r in t.className=G(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var a=0;a"},W=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"span")},t.toMarkup=function(){return X.call(this,"span")},e}(),_=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"a")},t.toMarkup=function(){return X.call(this,"a")},e}(),j=function(){function e(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=a[0]&&e<=a[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=V(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=G(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=l.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');var a=l.escape(this.text);return e?(t+=">",t+=a,t+=""):a},e}(),K=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r":""},e}(),Q=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="","\\gt",!0),ie(oe,le,be,"\u2208","\\in",!0),ie(oe,le,be,"\ue020","\\@not"),ie(oe,le,be,"\u2282","\\subset",!0),ie(oe,le,be,"\u2283","\\supset",!0),ie(oe,le,be,"\u2286","\\subseteq",!0),ie(oe,le,be,"\u2287","\\supseteq",!0),ie(oe,he,be,"\u2288","\\nsubseteq",!0),ie(oe,he,be,"\u2289","\\nsupseteq",!0),ie(oe,le,be,"\u22a8","\\models"),ie(oe,le,be,"\u2190","\\leftarrow",!0),ie(oe,le,be,"\u2264","\\le"),ie(oe,le,be,"\u2264","\\leq",!0),ie(oe,le,be,"<","\\lt",!0),ie(oe,le,be,"\u2192","\\rightarrow",!0),ie(oe,le,be,"\u2192","\\to"),ie(oe,he,be,"\u2271","\\ngeq",!0),ie(oe,he,be,"\u2270","\\nleq",!0),ie(oe,le,ye,"\xa0","\\ "),ie(oe,le,ye,"\xa0","\\space"),ie(oe,le,ye,"\xa0","\\nobreakspace"),ie(se,le,ye,"\xa0","\\ "),ie(se,le,ye,"\xa0"," "),ie(se,le,ye,"\xa0","\\space"),ie(se,le,ye,"\xa0","\\nobreakspace"),ie(oe,le,ye,null,"\\nobreak"),ie(oe,le,ye,null,"\\allowbreak"),ie(oe,le,ve,",",","),ie(oe,le,ve,";",";"),ie(oe,he,ce,"\u22bc","\\barwedge",!0),ie(oe,he,ce,"\u22bb","\\veebar",!0),ie(oe,le,ce,"\u2299","\\odot",!0),ie(oe,le,ce,"\u2295","\\oplus",!0),ie(oe,le,ce,"\u2297","\\otimes",!0),ie(oe,le,xe,"\u2202","\\partial",!0),ie(oe,le,ce,"\u2298","\\oslash",!0),ie(oe,he,ce,"\u229a","\\circledcirc",!0),ie(oe,he,ce,"\u22a1","\\boxdot",!0),ie(oe,le,ce,"\u25b3","\\bigtriangleup"),ie(oe,le,ce,"\u25bd","\\bigtriangledown"),ie(oe,le,ce,"\u2020","\\dagger"),ie(oe,le,ce,"\u22c4","\\diamond"),ie(oe,le,ce,"\u22c6","\\star"),ie(oe,le,ce,"\u25c3","\\triangleleft"),ie(oe,le,ce,"\u25b9","\\triangleright"),ie(oe,le,ge,"{","\\{"),ie(se,le,xe,"{","\\{"),ie(se,le,xe,"{","\\textbraceleft"),ie(oe,le,ue,"}","\\}"),ie(se,le,xe,"}","\\}"),ie(se,le,xe,"}","\\textbraceright"),ie(oe,le,ge,"{","\\lbrace"),ie(oe,le,ue,"}","\\rbrace"),ie(oe,le,ge,"[","\\lbrack",!0),ie(se,le,xe,"[","\\lbrack",!0),ie(oe,le,ue,"]","\\rbrack",!0),ie(se,le,xe,"]","\\rbrack",!0),ie(oe,le,ge,"(","\\lparen",!0),ie(oe,le,ue,")","\\rparen",!0),ie(se,le,xe,"<","\\textless",!0),ie(se,le,xe,">","\\textgreater",!0),ie(oe,le,ge,"\u230a","\\lfloor",!0),ie(oe,le,ue,"\u230b","\\rfloor",!0),ie(oe,le,ge,"\u2308","\\lceil",!0),ie(oe,le,ue,"\u2309","\\rceil",!0),ie(oe,le,xe,"\\","\\backslash"),ie(oe,le,xe,"\u2223","|"),ie(oe,le,xe,"\u2223","\\vert"),ie(se,le,xe,"|","\\textbar",!0),ie(oe,le,xe,"\u2225","\\|"),ie(oe,le,xe,"\u2225","\\Vert"),ie(se,le,xe,"\u2225","\\textbardbl"),ie(se,le,xe,"~","\\textasciitilde"),ie(se,le,xe,"\\","\\textbackslash"),ie(se,le,xe,"^","\\textasciicircum"),ie(oe,le,be,"\u2191","\\uparrow",!0),ie(oe,le,be,"\u21d1","\\Uparrow",!0),ie(oe,le,be,"\u2193","\\downarrow",!0),ie(oe,le,be,"\u21d3","\\Downarrow",!0),ie(oe,le,be,"\u2195","\\updownarrow",!0),ie(oe,le,be,"\u21d5","\\Updownarrow",!0),ie(oe,le,fe,"\u2210","\\coprod"),ie(oe,le,fe,"\u22c1","\\bigvee"),ie(oe,le,fe,"\u22c0","\\bigwedge"),ie(oe,le,fe,"\u2a04","\\biguplus"),ie(oe,le,fe,"\u22c2","\\bigcap"),ie(oe,le,fe,"\u22c3","\\bigcup"),ie(oe,le,fe,"\u222b","\\int"),ie(oe,le,fe,"\u222b","\\intop"),ie(oe,le,fe,"\u222c","\\iint"),ie(oe,le,fe,"\u222d","\\iiint"),ie(oe,le,fe,"\u220f","\\prod"),ie(oe,le,fe,"\u2211","\\sum"),ie(oe,le,fe,"\u2a02","\\bigotimes"),ie(oe,le,fe,"\u2a01","\\bigoplus"),ie(oe,le,fe,"\u2a00","\\bigodot"),ie(oe,le,fe,"\u222e","\\oint"),ie(oe,le,fe,"\u222f","\\oiint"),ie(oe,le,fe,"\u2230","\\oiiint"),ie(oe,le,fe,"\u2a06","\\bigsqcup"),ie(oe,le,fe,"\u222b","\\smallint"),ie(se,le,pe,"\u2026","\\textellipsis"),ie(oe,le,pe,"\u2026","\\mathellipsis"),ie(se,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u22ef","\\@cdots",!0),ie(oe,le,pe,"\u22f1","\\ddots",!0),ie(oe,le,xe,"\u22ee","\\varvdots"),ie(oe,le,me,"\u02ca","\\acute"),ie(oe,le,me,"\u02cb","\\grave"),ie(oe,le,me,"\xa8","\\ddot"),ie(oe,le,me,"~","\\tilde"),ie(oe,le,me,"\u02c9","\\bar"),ie(oe,le,me,"\u02d8","\\breve"),ie(oe,le,me,"\u02c7","\\check"),ie(oe,le,me,"^","\\hat"),ie(oe,le,me,"\u20d7","\\vec"),ie(oe,le,me,"\u02d9","\\dot"),ie(oe,le,me,"\u02da","\\mathring"),ie(oe,le,de,"\ue131","\\@imath"),ie(oe,le,de,"\ue237","\\@jmath"),ie(oe,le,xe,"\u0131","\u0131"),ie(oe,le,xe,"\u0237","\u0237"),ie(se,le,xe,"\u0131","\\i",!0),ie(se,le,xe,"\u0237","\\j",!0),ie(se,le,xe,"\xdf","\\ss",!0),ie(se,le,xe,"\xe6","\\ae",!0),ie(se,le,xe,"\u0153","\\oe",!0),ie(se,le,xe,"\xf8","\\o",!0),ie(se,le,xe,"\xc6","\\AE",!0),ie(se,le,xe,"\u0152","\\OE",!0),ie(se,le,xe,"\xd8","\\O",!0),ie(se,le,me,"\u02ca","\\'"),ie(se,le,me,"\u02cb","\\`"),ie(se,le,me,"\u02c6","\\^"),ie(se,le,me,"\u02dc","\\~"),ie(se,le,me,"\u02c9","\\="),ie(se,le,me,"\u02d8","\\u"),ie(se,le,me,"\u02d9","\\."),ie(se,le,me,"\xb8","\\c"),ie(se,le,me,"\u02da","\\r"),ie(se,le,me,"\u02c7","\\v"),ie(se,le,me,"\xa8",'\\"'),ie(se,le,me,"\u02dd","\\H"),ie(se,le,me,"\u25ef","\\textcircled");var we={"--":!0,"---":!0,"``":!0,"''":!0};ie(se,le,xe,"\u2013","--",!0),ie(se,le,xe,"\u2013","\\textendash"),ie(se,le,xe,"\u2014","---",!0),ie(se,le,xe,"\u2014","\\textemdash"),ie(se,le,xe,"\u2018","`",!0),ie(se,le,xe,"\u2018","\\textquoteleft"),ie(se,le,xe,"\u2019","'",!0),ie(se,le,xe,"\u2019","\\textquoteright"),ie(se,le,xe,"\u201c","``",!0),ie(se,le,xe,"\u201c","\\textquotedblleft"),ie(se,le,xe,"\u201d","''",!0),ie(se,le,xe,"\u201d","\\textquotedblright"),ie(oe,le,xe,"\xb0","\\degree",!0),ie(se,le,xe,"\xb0","\\degree"),ie(se,le,xe,"\xb0","\\textdegree",!0),ie(oe,le,xe,"\xa3","\\pounds"),ie(oe,le,xe,"\xa3","\\mathsterling",!0),ie(se,le,xe,"\xa3","\\pounds"),ie(se,le,xe,"\xa3","\\textsterling",!0),ie(oe,he,xe,"\u2720","\\maltese"),ie(se,he,xe,"\u2720","\\maltese");for(var ke='0123456789/@."',Se=0;Set&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>n&&(n=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Xe=function(e,t,r,n){var a=new W(e,t,r,n);return Ye(a),a},We=function(e,t,r,n){return new W(e,t,r,n)},_e=function(e){var t=new A(e);return Ye(t),t},je=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},$e={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ze={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ke={fontMap:$e,makeSymbol:Ge,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ve(e,"Main-Bold",t).metrics?Ge(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===ae[t][e].font?Ge(e,"Main-Regular",t,r,n):Ge(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Xe,makeSvgSpan:We,makeLineSpan:function(e,t,r){var n=Xe([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=V(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var a=new _(e,t,r,n);return Ye(a),a},makeFragment:_e,wrapFragment:function(e,t){return e instanceof A?Xe([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,a=n,i=1;i0&&(o.push(kt(s,t)),s=[]),o.push(a[l]));s.length>0&&o.push(kt(s,t)),r?((i=kt(ft(r,t,!0))).classes=["tag"],o.push(i)):n&&o.push(n);var m=mt(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=V(m.height+m.depth),m.depth&&(c.style.verticalAlign=V(-m.depth))}return m}function Mt(e){return new A(e)}var zt=function(){function e(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(var r=0;r0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(var r=0;r"},t.toText=function(){return this.children.map((function(e){return e.toText()})).join("")},e}(),At=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return l.escape(this.toText())},t.toText=function(){return this.text},e}(),Tt={MathNode:zt,TextNode:At,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",V(this.width)),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:Mt},Bt=function(e,t,r){return!ae[t][e]||!ae[t][e].replace||55349===e.charCodeAt(0)||we.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=ae[t][e].replace),new Tt.TextNode(e)},Ct=function(e){return 1===e.length?e[0]:new Tt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var a=e.text;return l.contains(["\\imath","\\jmath"],a)?null:(ae[n][a]&&ae[n][a].replace&&(a=ae[n][a].replace),q(a,Ke.fontMap[r].fontName,n)?Ke.fontMap[r].variant:null)},Nt=function(e,t,r){if(1===e.length){var n=Rt(e[0],t);return r&&n instanceof zt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var a,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),a=s}return i},It=function(e,t,r){return Ct(Nt(e,t,r))},Rt=function(e,t){if(!e)return new Tt.MathNode("mrow");if(it[e.type])return it[e.type](e,t);throw new n("Got group of unknown type: '"+e.type+"'")};function Ot(e,t,r,n,a){var i,o=Nt(e,r);i=1===o.length&&o[0]instanceof zt&&l.contains(["mrow","mtable"],o[0].type)?o[0]:new Tt.MathNode("mrow",o);var s=new Tt.MathNode("annotation",[new Tt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var h=new Tt.MathNode("semantics",[i,s]),m=new Tt.MathNode("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&m.setAttribute("display","block");var c=a?"katex":"katex-mathml";return Ke.makeSpan([c],[m])}var Ht=function(e){return new E({style:e.displayMode?x.DISPLAY:x.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Et=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ke.makeSpan(r,[e])}return e},Lt=function(e,t,r){var n,a=Ht(r);if("mathml"===r.output)return Ot(e,t,a,r.displayMode,!0);if("html"===r.output){var i=St(e,a);n=Ke.makeSpan(["katex"],[i])}else{var o=Ot(e,t,a,r.displayMode,!1),s=St(e,a);n=Ke.makeSpan(["katex"],[o,s])}return Et(n,r)},Dt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,n,a){var i,o=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(i=Ke.makeSpan(["stretchy",t],[],a),"fbox"===t){var s=a.color&&a.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new K(l,{width:"100%",height:V(o)});i=Ke.makeSvgSpan([],[h],a)}return i.height=o,i.style.height=V(o),i},Vt=function(e){var t=new Tt.MathNode("mo",[new Tt.TextNode(Dt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Gt=function(e,t){var r=function(){var r=4e5,n=e.label.substr(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){var a,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===n||"widecheck"===n?(a=420,r=2364,o=.42,i=n+"4"):(a=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][h],a=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=n+h):(r=[0,600,1033,2339,2340][h],a=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var m=new J(i),c=new K([m],{width:"100%",height:V(o),viewBox:"0 0 "+r+" "+a,preserveAspectRatio:"none"});return{span:Ke.makeSvgSpan([],[c],t),minWidth:0,height:o}}var u,p,d,f=[],g=Pt[n],v=g[0],b=g[1],y=g[2],x=y/1e3,w=v.length;if(1===w)u=["hide-tail"],p=[g[3]];else if(2===w)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(n.style.minWidth=V(a)),n};function Ut(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Yt(e){var t=Xt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Xt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}var Wt=function(e,t){var r,n,a;e&&"supsub"===e.type?(r=(n=Ut(e.base,"accent")).base,e.base=r,a=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(wt(e,t)),e.base=n):r=(n=Ut(e,"accent")).base;var i=wt(r,t.havingCrampedStyle()),o=0;if(n.isShifty&&l.isCharacterBox(r)){var s=l.getBaseElem(r);o=ee(wt(s,t.havingCrampedStyle())).skew}var h,m="\\c"===n.label,c=m?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Gt(n,t),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+V(2*o)+")",marginLeft:V(2*o)}:void 0}]},t);else{var u,p;"\\vec"===n.label?(u=Ke.staticSvg("vec",t),p=Ke.svgData.vec[1]):((u=ee(u=Ke.makeOrd({mode:n.mode,text:n.label},t,"textord"))).italic=0,p=u.width,m&&(c+=u.depth)),h=Ke.makeSpan(["accent-body"],[u]);var d="\\textcircled"===n.label;d&&(h.classes.push("accent-full"),c=i.height);var f=o;d||(f-=p/2),h.style.left=V(f),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}var g=Ke.makeSpan(["mord","accent"],[h],t);return a?(a.children[0]=g,a.height=Math.max(g.height,a.height),a.classes[0]="mord",a):g},_t=function(e,t){var r=e.isStretchy?Vt(e.label):new Tt.MathNode("mo",[Bt(e.label,e.mode)]),n=new Tt.MathNode("mover",[Rt(e.base,t),r]);return n.setAttribute("accent","true"),n},jt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(e){return"\\"+e})).join("|"));ot({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=lt(t[0]),n=!jt.test(e.funcName),a=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:a,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(e,t){var r=t[0],n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:a}},htmlBuilder:function(e,t){var r=wt(e.base,t),n=Gt(e,t),a="\\utilde"===e.label?.12:0,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:function(e,t){var r=Vt(e.label),n=new Tt.MathNode("munder",[Rt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var $t=function(e){var t=new Tt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};ot({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,a=e.funcName;return{type:"xArrow",mode:n.mode,label:a,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,a=t.havingStyle(n.sup()),i=Ke.wrapFragment(wt(e.body,a,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(a=t.havingStyle(n.sub()),(r=Ke.wrapFragment(wt(e.below,a,t),t)).classes.push(o+"-arrow-pad"));var s,l=Gt(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Ke.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder:function(e,t){var r,n=Vt(e.label);if(n.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var a=$t(Rt(e.body,t));if(e.below){var i=$t(Rt(e.below,t));r=new Tt.MathNode("munderover",[n,i,a])}else r=new Tt.MathNode("mover",[n,a])}else if(e.below){var o=$t(Rt(e.below,t));r=new Tt.MathNode("munder",[n,o])}else r=$t(),r=new Tt.MathNode("mover",[n,r]);return r}});var Zt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Kt=function(e){return"textord"===e.type&&"@"===e.text};function Jt(e,t,r){var n=Zt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}ot({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder:function(e,t){var r=t.havingStyle(t.style.sup()),n=Ke.wrapFragment(wt(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=V(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mrow",[Rt(e.label,t)]);return(r=new Tt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Tt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),ot({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var r=Ke.wrapFragment(wt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:function(e,t){return new Tt.MathNode("mrow",[Rt(e.fragment,t)])}}),ot({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,a=Ut(t[0],"ordgroup").body,i="",o=0;o=1114111)throw new n("\\@char with invalid code point "+i);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var Qt=function(e,t){var r=ft(e.body,t.withColor(e.color),!1);return Ke.makeFragment(r)},er=function(e,t){var r=Nt(e.body,t.withColor(e.color)),n=new Tt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};ot({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(e,t){var r=e.parser,n=Ut(t[0],"color-token").color,a=t[1];return{type:"color",mode:r.mode,color:n,body:ht(a)}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(e,t){var r=e.parser,n=e.breakOnTokenText,a=Ut(t[0],"color-token").color;r.gullet.macros.set("\\current@color",a);var i=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:a,body:i}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=r[0],i=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:i,size:a&&Ut(a,"size").value}},htmlBuilder:function(e,t){var r=Ke.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=V(F(e.size,t)))),r},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",V(F(e.size,t)))),r}});var tr={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},rr=function(e){var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},nr=function(e,t,r,n){var a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)};ot({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(e){var t=e.parser,r=e.funcName;t.consumeSpaces();var a=t.fetch();if(tr[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=tr[a.text]),Ut(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",a)}}),ot({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,a=t.gullet.popToken(),i=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new n("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new n('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new n('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new n("Expected a macro definition");l[s].push(a.text)}var h=t.gullet.consumeArg().tokens;return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(i,{tokens:h,numArgs:s,delimiters:l},r===tr[r]),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken());t.gullet.consumeSpaces();var a=function(e){var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t}(t);return nr(t,n,a,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken()),a=t.gullet.popToken(),i=t.gullet.popToken();return nr(t,n,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(a),{type:"internal",mode:t.mode}}});var ar=function(e,t,r){var n=q(ae.math[e]&&ae.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},ir=function(e,t,r,n){var a=r.havingBaseStyle(t),i=Ke.makeSpan(n.concat(a.sizingClasses(r)),[e],r),o=a.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=a.sizeMultiplier,i},or=function(e,t,r){var n=t.havingBaseStyle(r),a=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=V(a),e.height-=a,e.depth+=a},sr=function(e,t,r,n,a,i){var o=function(e,t,r,n){return Ke.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,a,n),s=ir(Ke.makeSpan(["delimsizing","size"+t],[o],n),x.TEXT,n,i);return r&&or(s,n,x.TEXT),s},lr=function(e,t,r){var n;return n="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Ke.makeSpan(["delimsizinginner",n],[Ke.makeSpan([],[Ke.makeSymbol(e,t,r)])])}},hr=function(e,t,r){var n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],a=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new K([a],{width:V(n),height:V(t),style:"width:"+V(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Ke.makeSvgSpan([],[i],r);return o.height=t,o.style.height=V(t),o.style.width=V(n),{type:"elem",elem:o}},mr={type:"kern",size:-.008},cr=["|","\\lvert","\\rvert","\\vert"],ur=["\\|","\\lVert","\\rVert","\\Vert"],pr=function(e,t,r,n,a,i){var o,s,h,m;o=h=m=e,s=null;var c="Size1-Regular";"\\uparrow"===e?h=m="\u23d0":"\\Uparrow"===e?h=m="\u2016":"\\downarrow"===e?o=h="\u23d0":"\\Downarrow"===e?o=h="\u2016":"\\updownarrow"===e?(o="\\uparrow",h="\u23d0",m="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",h="\u2016",m="\\Downarrow"):l.contains(cr,e)?h="\u2223":l.contains(ur,e)?h="\u2225":"["===e||"\\lbrack"===e?(o="\u23a1",h="\u23a2",m="\u23a3",c="Size4-Regular"):"]"===e||"\\rbrack"===e?(o="\u23a4",h="\u23a5",m="\u23a6",c="Size4-Regular"):"\\lfloor"===e||"\u230a"===e?(h=o="\u23a2",m="\u23a3",c="Size4-Regular"):"\\lceil"===e||"\u2308"===e?(o="\u23a1",h=m="\u23a2",c="Size4-Regular"):"\\rfloor"===e||"\u230b"===e?(h=o="\u23a5",m="\u23a6",c="Size4-Regular"):"\\rceil"===e||"\u2309"===e?(o="\u23a4",h=m="\u23a5",c="Size4-Regular"):"("===e||"\\lparen"===e?(o="\u239b",h="\u239c",m="\u239d",c="Size4-Regular"):")"===e||"\\rparen"===e?(o="\u239e",h="\u239f",m="\u23a0",c="Size4-Regular"):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",m="\u23a9",h="\u23aa",c="Size4-Regular");var u=ar(o,c,a),p=u.height+u.depth,d=ar(h,c,a),f=d.height+d.depth,g=ar(m,c,a),v=g.height+g.depth,b=0,y=1;if(null!==s){var w=ar(s,c,a);b=w.height+w.depth,y=2}var k=p+v+b,S=k+Math.max(0,Math.ceil((t-k)/(y*f)))*y*f,M=n.fontMetrics().axisHeight;r&&(M*=n.sizeMultiplier);var z=S/2-M,A=[];if(A.push(lr(m,c,a)),A.push(mr),null===s){var T=S-p-v+.016;A.push(hr(h,T,n))}else{var B=(S-p-v-b)/2+.016;A.push(hr(h,B,n)),A.push(mr),A.push(lr(s,c,a)),A.push(mr),A.push(hr(h,B,n))}A.push(mr),A.push(lr(o,c,a));var C=n.havingBaseStyle(x.TEXT),q=Ke.makeVList({positionType:"bottom",positionData:z,children:A},C);return ir(Ke.makeSpan(["delimsizing","mult"],[q],C),x.TEXT,n,i)},dr=.08,fr=function(e,t,r,n,a){var i=function(e,t,r){t*=1e3;var n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),o=new J(e,i),s=new K([o],{width:"400em",height:V(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ke.makeSvgSpan(["hide-tail"],[s],a)},gr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],vr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],br=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],yr=[0,1.2,1.8,2.4,3],xr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],wr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"stack"}],kr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Sr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},Mr=function(e,t,r,n){for(var a=Math.min(2,3-n.style.size);at)return r[a]}return r[r.length-1]},zr=function(e,t,r,n,a,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=l.contains(br,e)?xr:l.contains(gr,e)?kr:wr;var s=Mr(e,t,o,n);return"small"===s.type?function(e,t,r,n,a,i){var o=Ke.makeSymbol(e,"Main-Regular",a,n),s=ir(o,t,n,i);return r&&or(s,n,t),s}(e,s.style,r,n,a,i):"large"===s.type?sr(e,s.size,r,n,a,i):pr(e,t,r,n,a,i)},Ar={sqrtImage:function(e,t){var r,n,a=t.havingBaseSizing(),i=Mr("\\surd",e*a.sizeMultiplier,kr,a),o=a.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=fr("sqrtMain",l=(1+s+dr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",n=.833/o):"large"===i.type?(m=1080*yr[i.size],h=(yr[i.size]+s)/o,l=(yr[i.size]+s+dr)/o,(r=fr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",n=1/o):(l=e+s+dr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=fr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",n=1.056),r.height=h,r.style.height=V(l),{span:r,advanceWidth:n,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(gr,e)||l.contains(br,e))return sr(e,t,!1,r,a,i);if(l.contains(vr,e))return pr(e,yr[t],!1,r,a,i);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:yr,customSizedDelim:zr,leftRightDelim:function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return zr(e,h,!0,n,a,i)}},Tr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Br=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Cr(e,t){var r=Xt(e);if(r&&l.contains(Br,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function qr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}ot({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var r=Cr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Tr[e.funcName].size,mclass:Tr[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?Ke.makeSpan([e.mclass]):Ar.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(Bt(e.delim,e.mode));var r=new Tt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=V(Ar.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),ot({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Cr(t[0],e).text,color:r}}}),ot({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=Cr(t[0],e),n=e.parser;++n.leftrightDepth;var a=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var i=Ut(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:a,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(e,t){qr(e);for(var r,n,a=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[Rt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var a=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+a+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};ot({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:a,backgroundColor:i,body:o}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=Ut(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:a,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),ot({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"enclose",mode:r.mode,label:n,body:a}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var Rr={};function Or(e){for(var t=e.type,r=e.names,n=e.props,a=e.handler,i=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:a},l=0;l1||!c)&&g.pop(),b.length0&&(y+=.25),m.push({pos:y,isDashed:e[t]})}for(w(o[0]),r=0;r0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=f),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,h[r]=z,w(o[r+1])}var C,q,N=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],O=[];if(e.tags&&e.tags.some((function(e){return e})))for(r=0;r=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=l.deflt(P.pregap,p))&&((C=Ke.makeSpan(["arraycolsep"],[])).style.width=V(W),R.push(C));var _=[];for(r=0;r0){for(var K=Ke.makeLineSpan("hline",t,c),J=Ke.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:h,shift:0}];m.length>0;){var ee=m.pop(),te=ee.pos-N;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}h=Ke.makeVList({positionType:"individualShift",children:Q},t)}if(0===O.length)return Ke.makeSpan(["mord"],[h],t);var re=Ke.makeVList({positionType:"individualShift",children:O},t);return re=Ke.makeSpan(["tag"],[re],t),Ke.makeFragment([h,re])},Xr={c:"center ",l:"left ",r:"right "},Wr=function(e,t){for(var r=[],n=new Tt.MathNode("mtd",[],["mtr-glue"]),a=new Tt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var p=e.cols,d="",f=!1,g=0,v=p.length;"separator"===p[0].type&&(c+="top ",g=1),"separator"===p[p.length-1].type&&(c+="bottom ",v-=1);for(var b=g;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o="split"===e.envName,s=Gr(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Vr(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c0&&u&&(f=1),a[p]={type:"align",align:d,pregap:f,postgap:0}}return s.colSeparationType=u?"align":"alignat",s};Or({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Gr(e.parser,a,Ur(e.envName))},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var i=e.parser;if(i.consumeSpaces(),"["===i.fetch().text){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),a.cols=[{type:"align",align:r}]}}var o=Gr(e.parser,a,Ur(e.envName)),s=Math.max.apply(Math,[0].concat(o.body.map((function(e){return e.length}))));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Gr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new n("{subarray} can contain only one column");return a},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Ur(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){l.contains(["gather","gather*"],e.envName)&&Fr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Vr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){Fr(e);var t={autoTag:Vr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return Fr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,i,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(u)>-1))throw new n('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var f=!0,g=c+1;g=x.SCRIPT.id?r.text():x.DISPLAY:"text"===e&&r.size===x.DISPLAY.size?r=x.TEXT:"script"===e?r=x.SCRIPT:"scriptscript"===e&&(r=x.SCRIPTSCRIPT),r},nn=function(e,t){var r,n=rn(e.size,t.style),a=n.fracNum(),i=n.fracDen();r=t.havingStyle(a);var o=wt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(u=t.fontMetrics().num2,p=c):(u=t.fontMetrics().num3,p=3*c),d=t.fontMetrics().denom2),h){var w=t.fontMetrics().axisHeight;u-o.depth-(w+.5*m)0&&(t="."===(t=e)?null:t),t};ot({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r,n=e.parser,a=t[4],i=t[5],o=lt(t[0]),s="atom"===o.type&&"open"===o.family?sn(o.text):null,l=lt(t[1]),h="atom"===l.type&&"close"===l.family?sn(l.text):null,m=Ut(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var u="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){var d=Ut(p.body[0],"textord");u=on[Number(d.text)]}}else p=Ut(p,"textord"),u=on[Number(p.text)];return{type:"genfrac",mode:n.mode,numer:a,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:u}},htmlBuilder:nn,mathmlBuilder:an}),ot({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ut(t[0],"size").value,token:n}}}),ot({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Ut(t[1],"infix").size),i=t[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:nn,mathmlBuilder:an});var ln=function(e,t){var r,n,a=t.style;"supsub"===e.type?(r=e.sup?wt(e.sup,t.havingStyle(a.sup()),t):wt(e.sub,t.havingStyle(a.sub()),t),n=Ut(e.base,"horizBrace")):n=Ut(e,"horizBrace");var i,o=wt(n.base,t.havingBaseStyle(x.DISPLAY)),s=Gt(n,t);if(n.isOver?(i=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Ke.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t);i=n.isOver?Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Ke.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t)};ot({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:ln,mathmlBuilder:function(e,t){var r=Vt(e.label);return new Tt.MathNode(e.isOver?"mover":"munder",[Rt(e.base,t),r])}}),ot({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],a=Ut(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:a})?{type:"href",mode:r.mode,href:a,body:ht(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var r=ft(e.body,t,!1);return Ke.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=It(e.body,t);return r instanceof zt||(r=new zt("mrow",[r])),r.setAttribute("href",e.href),r}}),ot({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ut(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var a=[],i=0;i0&&(n=F(e.totalheight,t)-r);var a=0;e.width.number>0&&(a=F(e.width,t));var i={height:V(r+n)};a>0&&(i.width=V(a)),n>0&&(i.verticalAlign=V(-n));var o=new j(e.src,e.alt,i);return o.height=r,o.depth=n,o},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var n=F(e.height,t),a=0;if(e.totalheight.number>0&&(a=F(e.totalheight,t)-n,r.setAttribute("valign",V(-a))),r.setAttribute("height",V(n+a)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",V(i))}return r.setAttribute("src",e.src),r}}),ot({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=Ut(t[0],"size");if(r.settings.strict){var i="m"===n[1],o="mu"===a.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+a.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:a.value}},htmlBuilder:function(e,t){return Ke.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=F(e.dimension,t);return new Tt.SpaceNode(r)}}),ot({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:a}},htmlBuilder:function(e,t){var r;"clap"===e.alignment?(r=Ke.makeSpan([],[wt(e.body,t)]),r=Ke.makeSpan(["inner"],[r],t)):r=Ke.makeSpan(["inner"],[wt(e.body,t)]);var n=Ke.makeSpan(["fix"],[]),a=Ke.makeSpan([e.alignment],[r,n],t),i=Ke.makeSpan(["strut"]);return i.style.height=V(a.height+a.depth),a.depth&&(i.style.verticalAlign=V(-a.depth)),a.children.unshift(i),a=Ke.makeSpan(["thinbox"],[a],t),Ke.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mpadded",[Rt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),ot({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=e.funcName,n=e.parser,a=n.mode;n.switchMode("math");var i="\\("===r?"\\)":"$",o=n.parseExpression(!1,i);return n.expect(i),n.switchMode(a),{type:"styling",mode:n.mode,style:"text",body:o}}}),ot({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new n("Mismatched "+e.funcName)}});var mn=function(e,t){switch(t.style.size){case x.DISPLAY.size:return e.display;case x.TEXT.size:return e.text;case x.SCRIPT.size:return e.script;case x.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};ot({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ht(t[0]),text:ht(t[1]),script:ht(t[2]),scriptscript:ht(t[3])}},htmlBuilder:function(e,t){var r=mn(e,t),n=ft(r,t,!1);return Ke.makeFragment(n)},mathmlBuilder:function(e,t){var r=mn(e,t);return It(r,t)}});var cn=function(e,t,r,n,a,i,o){e=Ke.makeSpan([],[e]);var s,h,m,c=r&&l.isCharacterBox(r);if(t){var u=wt(t,n.havingStyle(a.sup()),n);h={elem:u,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-u.depth)}}if(r){var p=wt(r,n.havingStyle(a.sub()),n);s={elem:p,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-p.height)}}if(h&&s){var d=n.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(s){var f=e.height-o;m=Ke.makeVList({positionType:"top",positionData:f,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;var g=e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:g,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}var v=[m];if(s&&0!==i&&!c){var b=Ke.makeSpan(["mspace"],[],n);b.style.marginRight=V(i),v.unshift(b)}return Ke.makeSpan(["mop","op-limits"],v,n)},un=["\\smallint"],pn=function(e,t){var r,n,a,i=!1;"supsub"===e.type?(r=e.sup,n=e.sub,a=Ut(e.base,"op"),i=!0):a=Ut(e,"op");var o,s=t.style,h=!1;if(s.size===x.DISPLAY.size&&a.symbol&&!l.contains(un,a.name)&&(h=!0),a.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(c=a.name.substr(1),a.name="oiint"===c?"\\iint":"\\iiint"),o=Ke.makeSymbol(a.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),c.length>0){var u=o.italic,p=Ke.staticSvg(c+"Size"+(h?"2":"1"),t);o=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),a.name="\\"+c,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var d=ft(a.body,t,!0);1===d.length&&d[0]instanceof Z?(o=d[0]).classes[0]="mop":o=Ke.makeSpan(["mop"],d,t)}else{for(var f=[],g=1;g0){for(var s=a.body.map((function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ft(s,t.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height",V(a)):(s.setAttribute("height",V(a)),s.setAttribute("depth",V(-a))),s.setAttribute("voffset",V(a)),s}});var yn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];ot({type:"sizing",names:yn,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!1,r);return{type:"sizing",mode:a.mode,size:yn.indexOf(n)+1,body:i}},htmlBuilder:function(e,t){var r=t.havingSize(e.size);return bn(e.body,r,t)},mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Nt(e.body,r),a=new Tt.MathNode("mstyle",n);return a.setAttribute("mathsize",V(r.sizeMultiplier)),a}}),ot({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=!1,i=!1,o=r[0]&&Ut(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=V(m);var p=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(x.SCRIPTSCRIPT),f=wt(e.index,d,t),g=.6*(p.height-p.depth),v=Ke.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),b=Ke.makeSpan(["root"],[v]);return Ke.makeSpan(["mord","sqrt"],[b,p],t)}return Ke.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Tt.MathNode("mroot",[Rt(r,t),Rt(n,t)]):new Tt.MathNode("msqrt",[Rt(r,t)])}});var xn={display:x.DISPLAY,text:x.TEXT,script:x.SCRIPT,scriptscript:x.SCRIPTSCRIPT};ot({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:a.mode,style:o,body:i}},htmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r).withFont("");return bn(e.body,n,t)},mathmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r),a=Nt(e.body,n),i=new Tt.MathNode("mstyle",a),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});var wn=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===x.DISPLAY.size||r.alwaysHandleSupSub)?pn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===x.DISPLAY.size||r.limits)?vn:null:"accent"===r.type?l.isCharacterBox(r.base)?Wt:null:"horizBrace"===r.type&&!e.sub===r.isOver?ln:null:null};st({type:"supsub",htmlBuilder:function(e,t){var r=wn(e,t);if(r)return r(e,t);var n,a,i,o=e.base,s=e.sup,h=e.sub,m=wt(o,t),c=t.fontMetrics(),u=0,p=0,d=o&&l.isCharacterBox(o);if(s){var f=t.havingStyle(t.style.sup());n=wt(s,f,t),d||(u=m.height-f.fontMetrics().supDrop*f.sizeMultiplier/t.sizeMultiplier)}if(h){var g=t.havingStyle(t.style.sub());a=wt(h,g,t),d||(p=m.depth+g.fontMetrics().subDrop*g.sizeMultiplier/t.sizeMultiplier)}i=t.style===x.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=V(.5/c.ptPerEm/b),w=null;if(a){var k=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(m instanceof Z||k)&&(w=V(-m.italic))}if(n&&a){u=Math.max(u,i,n.depth+.25*c.xHeight),p=Math.max(p,c.sub2);var S=4*c.defaultRuleThickness;if(u-n.depth-(a.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:a,shift:p,marginRight:y,marginLeft:w},{type:"elem",elem:n,shift:-u,marginRight:y}];v=Ke.makeVList({positionType:"individualShift",children:z},t)}else if(a){p=Math.max(p,c.sub1,a.height-.8*c.xHeight);var A=[{type:"elem",elem:a,marginLeft:w,marginRight:y}];v=Ke.makeVList({positionType:"shift",positionData:p,children:A},t)}else{if(!n)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,n.depth+.25*c.xHeight),v=Ke.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:n,marginRight:y}]},t)}var T=yt(m,"right")||"mord";return Ke.makeSpan([T],[m,Ke.makeSpan(["msupsub"],[v])],t)},mathmlBuilder:function(e,t){var r,n=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(n=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var a,i=[Rt(e.base,t)];if(e.sub&&i.push(Rt(e.sub,t)),e.sup&&i.push(Rt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;a=o&&"op"===o.type&&o.limits&&t.style===x.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===x.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;a=s&&"op"===s.type&&s.limits&&(t.style===x.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===x.DISPLAY)?"munder":"msub"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&(t.style===x.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===x.DISPLAY)?"mover":"msup"}return new Tt.MathNode(a,i)}}),st({type:"atom",htmlBuilder:function(e,t){return Ke.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[Bt(e.text,e.mode)]);if("bin"===e.family){var n=qt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var kn={mi:"italic",mn:"normal",mtext:"normal"};st({type:"mathord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mi",[Bt(e.text,e.mode,t)]),n=qt(e,t)||"italic";return n!==kn[r.type]&&r.setAttribute("mathvariant",n),r}}),st({type:"textord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=Bt(e.text,e.mode,t),a=qt(e,t)||"normal";return r="text"===e.mode?new Tt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Tt.MathNode("mn",[n]):"\\prime"===e.text?new Tt.MathNode("mo",[n]):new Tt.MathNode("mi",[n]),a!==kn[r.type]&&r.setAttribute("mathvariant",a),r}});var Sn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};st({type:"spacing",htmlBuilder:function(e,t){if(Mn.hasOwnProperty(e.text)){var r=Mn[e.text].className||"";if("text"===e.mode){var a=Ke.makeOrd(e,t,"textord");return a.classes.push(r),a}return Ke.makeSpan(["mspace",r],[Ke.mathsym(e.text,e.mode,t)],t)}if(Sn.hasOwnProperty(e.text))return Ke.makeSpan(["mspace",Sn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!Mn.hasOwnProperty(e.text)){if(Sn.hasOwnProperty(e.text))return new Tt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return new Tt.MathNode("mtext",[new Tt.TextNode("\xa0")])}});var zn=function(){var e=new Tt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};st({type:"tag",mathmlBuilder:function(e,t){var r=new Tt.MathNode("mtable",[new Tt.MathNode("mtr",[zn(),new Tt.MathNode("mtd",[It(e.body,t)]),zn(),new Tt.MathNode("mtd",[It(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var An={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Tn={"\\textbf":"textbf","\\textmd":"textmd"},Bn={"\\textit":"textit","\\textup":"textup"},Cn=function(e,t){var r=e.font;return r?An[r]?t.withTextFontFamily(An[r]):Tn[r]?t.withTextFontWeight(Tn[r]):t.withTextFontShape(Bn[r]):t};ot({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"text",mode:r.mode,body:ht(a),font:n}},htmlBuilder:function(e,t){var r=Cn(e,t),n=ft(e.body,r,!0);return Ke.makeSpan(["mord","text"],n,r)},mathmlBuilder:function(e,t){var r=Cn(e,t);return It(e.body,r)}}),ot({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=Ke.makeLineSpan("underline-line",t),a=t.fontMetrics().defaultRuleThickness,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a},{type:"elem",elem:n},{type:"kern",size:3*a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[new Tt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Tt.MathNode("munder",[Rt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),ot({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=t.fontMetrics().axisHeight,a=.5*(r.height-n-(r.depth+n));return Ke.makeVList({positionType:"shift",positionData:a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){return new Tt.MathNode("mpadded",[Rt(e.body,t)],["vcenter"])}}),ot({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=qn(e),n=[],a=t.havingStyle(t.style.text()),i=0;i0;)this.endGroup()},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,r){if(void 0===r&&(r=!1),r){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t},e}(),Hn=Hr;Er("\\noexpand",(function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Er("\\expandafter",(function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Er("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Er("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Er("\\@ifnextchar",(function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Er("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Er("\\TextOrMath",(function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));var En={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Er("\\char",(function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=En[r.text])||a>=t)throw new n("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=En[e.future().text])&&i":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Er("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Dn?t=Dn[r]:("\\not"===r.substr(0,4)||r in ae.math&&l.contains(["bin","rel"],ae.math[r].group))&&(t="\\dotsb"),t}));var Pn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Er("\\dotso",(function(e){return e.future().text in Pn?"\\ldots\\,":"\\ldots"})),Er("\\dotsc",(function(e){var t=e.future().text;return t in Pn&&","!==t?"\\ldots\\,":"\\ldots"})),Er("\\cdots",(function(e){return e.future().text in Pn?"\\@cdots\\,":"\\@cdots"})),Er("\\dotsb","\\cdots"),Er("\\dotsm","\\cdots"),Er("\\dotsi","\\!\\cdots"),Er("\\dotsx","\\ldots\\,"),Er("\\DOTSI","\\relax"),Er("\\DOTSB","\\relax"),Er("\\DOTSX","\\relax"),Er("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Er("\\,","\\tmspace+{3mu}{.1667em}"),Er("\\thinspace","\\,"),Er("\\>","\\mskip{4mu}"),Er("\\:","\\tmspace+{4mu}{.2222em}"),Er("\\medspace","\\:"),Er("\\;","\\tmspace+{5mu}{.2777em}"),Er("\\thickspace","\\;"),Er("\\!","\\tmspace-{3mu}{.1667em}"),Er("\\negthinspace","\\!"),Er("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Er("\\negthickspace","\\tmspace-{5mu}{.277em}"),Er("\\enspace","\\kern.5em "),Er("\\enskip","\\hskip.5em\\relax"),Er("\\quad","\\hskip1em\\relax"),Er("\\qquad","\\hskip2em\\relax"),Er("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Er("\\tag@paren","\\tag@literal{({#1})}"),Er("\\tag@literal",(function(e){if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Er("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Er("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Er("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Er("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Er("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),Er("\\newline","\\\\\\relax"),Er("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Fn=V(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Er("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Er("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Er("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Er("\\@hspace","\\hskip #1\\relax"),Er("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Er("\\ordinarycolon",":"),Er("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Er("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Er("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Er("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Er("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Er("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Er("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Er("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Er("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Er("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Er("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Er("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Er("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Er("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Er("\u2237","\\dblcolon"),Er("\u2239","\\eqcolon"),Er("\u2254","\\coloneqq"),Er("\u2255","\\eqqcolon"),Er("\u2a74","\\Coloneqq"),Er("\\ratio","\\vcentcolon"),Er("\\coloncolon","\\dblcolon"),Er("\\colonequals","\\coloneqq"),Er("\\coloncolonequals","\\Coloneqq"),Er("\\equalscolon","\\eqqcolon"),Er("\\equalscoloncolon","\\Eqqcolon"),Er("\\colonminus","\\coloneq"),Er("\\coloncolonminus","\\Coloneq"),Er("\\minuscolon","\\eqcolon"),Er("\\minuscoloncolon","\\Eqcolon"),Er("\\coloncolonapprox","\\Colonapprox"),Er("\\coloncolonsim","\\Colonsim"),Er("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Er("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Er("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Er("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Er("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Er("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Er("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Er("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Er("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Er("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Er("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Er("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Er("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Er("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Er("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Er("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Er("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Er("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Er("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Er("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Er("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Er("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Er("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Er("\\imath","\\html@mathml{\\@imath}{\u0131}"),Er("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Er("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Er("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Er("\u27e6","\\llbracket"),Er("\u27e7","\\rrbracket"),Er("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Er("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Er("\u2983","\\lBrace"),Er("\u2984","\\rBrace"),Er("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Er("\u29b5","\\minuso"),Er("\\darr","\\downarrow"),Er("\\dArr","\\Downarrow"),Er("\\Darr","\\Downarrow"),Er("\\lang","\\langle"),Er("\\rang","\\rangle"),Er("\\uarr","\\uparrow"),Er("\\uArr","\\Uparrow"),Er("\\Uarr","\\Uparrow"),Er("\\N","\\mathbb{N}"),Er("\\R","\\mathbb{R}"),Er("\\Z","\\mathbb{Z}"),Er("\\alef","\\aleph"),Er("\\alefsym","\\aleph"),Er("\\Alpha","\\mathrm{A}"),Er("\\Beta","\\mathrm{B}"),Er("\\bull","\\bullet"),Er("\\Chi","\\mathrm{X}"),Er("\\clubs","\\clubsuit"),Er("\\cnums","\\mathbb{C}"),Er("\\Complex","\\mathbb{C}"),Er("\\Dagger","\\ddagger"),Er("\\diamonds","\\diamondsuit"),Er("\\empty","\\emptyset"),Er("\\Epsilon","\\mathrm{E}"),Er("\\Eta","\\mathrm{H}"),Er("\\exist","\\exists"),Er("\\harr","\\leftrightarrow"),Er("\\hArr","\\Leftrightarrow"),Er("\\Harr","\\Leftrightarrow"),Er("\\hearts","\\heartsuit"),Er("\\image","\\Im"),Er("\\infin","\\infty"),Er("\\Iota","\\mathrm{I}"),Er("\\isin","\\in"),Er("\\Kappa","\\mathrm{K}"),Er("\\larr","\\leftarrow"),Er("\\lArr","\\Leftarrow"),Er("\\Larr","\\Leftarrow"),Er("\\lrarr","\\leftrightarrow"),Er("\\lrArr","\\Leftrightarrow"),Er("\\Lrarr","\\Leftrightarrow"),Er("\\Mu","\\mathrm{M}"),Er("\\natnums","\\mathbb{N}"),Er("\\Nu","\\mathrm{N}"),Er("\\Omicron","\\mathrm{O}"),Er("\\plusmn","\\pm"),Er("\\rarr","\\rightarrow"),Er("\\rArr","\\Rightarrow"),Er("\\Rarr","\\Rightarrow"),Er("\\real","\\Re"),Er("\\reals","\\mathbb{R}"),Er("\\Reals","\\mathbb{R}"),Er("\\Rho","\\mathrm{P}"),Er("\\sdot","\\cdot"),Er("\\sect","\\S"),Er("\\spades","\\spadesuit"),Er("\\sub","\\subset"),Er("\\sube","\\subseteq"),Er("\\supe","\\supseteq"),Er("\\Tau","\\mathrm{T}"),Er("\\thetasym","\\vartheta"),Er("\\weierp","\\wp"),Er("\\Zeta","\\mathrm{Z}"),Er("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Er("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Er("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Er("\\bra","\\mathinner{\\langle{#1}|}"),Er("\\ket","\\mathinner{|{#1}\\rangle}"),Er("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Er("\\Bra","\\left\\langle#1\\right|"),Er("\\Ket","\\left|#1\\right\\rangle"),Er("\\angln","{\\angl n}"),Er("\\blue","\\textcolor{##6495ed}{#1}"),Er("\\orange","\\textcolor{##ffa500}{#1}"),Er("\\pink","\\textcolor{##ff00af}{#1}"),Er("\\red","\\textcolor{##df0030}{#1}"),Er("\\green","\\textcolor{##28ae7b}{#1}"),Er("\\gray","\\textcolor{gray}{#1}"),Er("\\purple","\\textcolor{##9d38bd}{#1}"),Er("\\blueA","\\textcolor{##ccfaff}{#1}"),Er("\\blueB","\\textcolor{##80f6ff}{#1}"),Er("\\blueC","\\textcolor{##63d9ea}{#1}"),Er("\\blueD","\\textcolor{##11accd}{#1}"),Er("\\blueE","\\textcolor{##0c7f99}{#1}"),Er("\\tealA","\\textcolor{##94fff5}{#1}"),Er("\\tealB","\\textcolor{##26edd5}{#1}"),Er("\\tealC","\\textcolor{##01d1c1}{#1}"),Er("\\tealD","\\textcolor{##01a995}{#1}"),Er("\\tealE","\\textcolor{##208170}{#1}"),Er("\\greenA","\\textcolor{##b6ffb0}{#1}"),Er("\\greenB","\\textcolor{##8af281}{#1}"),Er("\\greenC","\\textcolor{##74cf70}{#1}"),Er("\\greenD","\\textcolor{##1fab54}{#1}"),Er("\\greenE","\\textcolor{##0d923f}{#1}"),Er("\\goldA","\\textcolor{##ffd0a9}{#1}"),Er("\\goldB","\\textcolor{##ffbb71}{#1}"),Er("\\goldC","\\textcolor{##ff9c39}{#1}"),Er("\\goldD","\\textcolor{##e07d10}{#1}"),Er("\\goldE","\\textcolor{##a75a05}{#1}"),Er("\\redA","\\textcolor{##fca9a9}{#1}"),Er("\\redB","\\textcolor{##ff8482}{#1}"),Er("\\redC","\\textcolor{##f9685d}{#1}"),Er("\\redD","\\textcolor{##e84d39}{#1}"),Er("\\redE","\\textcolor{##bc2612}{#1}"),Er("\\maroonA","\\textcolor{##ffbde0}{#1}"),Er("\\maroonB","\\textcolor{##ff92c6}{#1}"),Er("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Er("\\maroonD","\\textcolor{##ca337c}{#1}"),Er("\\maroonE","\\textcolor{##9e034e}{#1}"),Er("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Er("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Er("\\purpleC","\\textcolor{##aa87ff}{#1}"),Er("\\purpleD","\\textcolor{##7854ab}{#1}"),Er("\\purpleE","\\textcolor{##543b78}{#1}"),Er("\\mintA","\\textcolor{##f5f9e8}{#1}"),Er("\\mintB","\\textcolor{##edf2df}{#1}"),Er("\\mintC","\\textcolor{##e0e5cc}{#1}"),Er("\\grayA","\\textcolor{##f6f7f7}{#1}"),Er("\\grayB","\\textcolor{##f0f1f2}{#1}"),Er("\\grayC","\\textcolor{##e3e5e6}{#1}"),Er("\\grayD","\\textcolor{##d6d8da}{#1}"),Er("\\grayE","\\textcolor{##babec2}{#1}"),Er("\\grayF","\\textcolor{##888d93}{#1}"),Er("\\grayG","\\textcolor{##626569}{#1}"),Er("\\grayH","\\textcolor{##3b3e40}{#1}"),Er("\\grayI","\\textcolor{##21242c}{#1}"),Er("\\kaBlue","\\textcolor{##314453}{#1}"),Er("\\kaGreen","\\textcolor{##71B307}{#1}");var Vn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Gn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new On(Hn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new Rn(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.endGroups=function(){this.macros.endGroups()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var a=this.consumeArg(["]"]);n=a.tokens,r=a.end}else{var i=this.consumeArg();n=i.tokens,t=i.start,r=i.end}return this.pushToken(new Dr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArg=function(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,i=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new n("Extra }",a)}else if("EOF"===a.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===i.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:i,end:a}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting");var i=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(i=i.slice()).length-1;s>=0;--s){var l=i[s];if("#"===l.text){if(0===s)throw new n("Incomplete placeholder at end of macro body",l);if("#"===(l=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new n("Not a valid argument number",l);var h;(h=i).splice.apply(h,[s,2].concat(o[+l.text-1]))}}}return this.pushTokens(i),i},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof Dr)return e.treatAsRelax&&(e.text="\\relax"),this.stack.pop()}throw new Error},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new Dr(e)]):void 0},t.expandTokens=function(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;){var n=this.expandOnce(!0);n instanceof Dr&&(n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map((function(e){return e.text})).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var n="function"==typeof t?t(this):t;if("string"==typeof n){var a=0;if(-1!==n.indexOf("#"))for(var i=n.replace(/##/g,"");-1!==i.indexOf("#"+(a+1));)++a;for(var o=new Rn(n,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:a}}return n},t.isDefined=function(e){return this.macros.has(e)||Nn.hasOwnProperty(e)||ae.math.hasOwnProperty(e)||ae.text.hasOwnProperty(e)||Vn.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Nn.hasOwnProperty(e)&&!Nn[e].primitive},e}(),Un={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Yn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Xn=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Gn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}},t.subparse=function(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new Dr("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r},t.parseExpression=function(t,r){for(var n=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==e.endOfExpression.indexOf(a.text))break;if(r&&a.text===r)break;if(t&&Nn[a.text]&&Nn[a.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&n.push(i)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)},t.handleInfixNodes=function(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var s,l=ae[this.mode][t].group,h=Lr.range(e);if(te.hasOwnProperty(l)){var m=l;s={type:"atom",mode:this.mode,family:m,loc:h,text:t}}else s={type:l,mode:this.mode,loc:h,text:t};i=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:"text",loc:Lr.range(e),text:t}}if(this.consume(),o)for(var c=0;cli { + margin-left: 22px; +} + +ol>li { + margin-left: 27.2px; +} + +li>*:first-child { + margin-top: 0 +} + +/* Text alignements, this should be forbidden. */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +/* Links and anchors */ + +a { + text-decoration: none; + color: var(--link-color); +} + +a:hover { + box-shadow: 0 1px 0 0 var(--link-color); +} + +/* Linked highlight */ +*:target { + background-color: var(--target-background) !important; + box-shadow: 0 0px 0 1px var(--target-shadow) !important; + border-radius: 1px; +} + +*:hover > a.anchor { + visibility: visible; +} + +a.anchor:before { + content: "#"; +} + +a.anchor:hover { + box-shadow: none; + text-decoration: none; + color: var(--anchor-hover); +} + +a.anchor { + visibility: hidden; + position: absolute; + /* top: 0px; */ + /* margin-left: -3ex; */ + margin-left: -1.3em; + font-weight: normal; + font-style: normal; + padding-right: 0.4em; + padding-left: 0.4em; + /* To remain selectable */ + color: var(--anchor-color); +} + +.spec > a.anchor { + margin-left: -2.3em; + padding-right: 0.9em; +} + +.xref-unresolved { + color: #2C94BD; +} +.xref-unresolved:hover { + box-shadow: 0 1px 0 0 var(--xref-shadow); +} + +/* Section and document divisions. + Until at least 4.03 many of the modules of the stdlib start at .h7, + we restart the sequence there like h2 */ + +h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { + font-family: "Fira Sans", Helvetica, Arial, sans-serif; + font-weight: 400; + padding-top: 0.1em; + line-height: 1.2; + overflow-wrap: break-word; +} + +h1 { + font-weight: 500; + font-size: 2.441em; +} + +h1 { + font-weight: 500; + font-size: 1.953em; + box-shadow: 0 1px 0 0 var(--header-shadow); +} + +h2 { + font-size: 1.563em; +} + +h3 { + font-size: 1.25em; +} + +small, .font_small { + font-size: 0.8em; +} + +h1 code, h1 tt { + font-size: inherit; + font-weight: inherit; +} + +h2 code, h2 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h4 { + font-size: 1.12em; +} + +/* Comment delimiters, hidden but accessible to screen readers and + selected for copy/pasting */ + +/* Taken from bootstrap */ +/* See also https://stackoverflow.com/a/27769435/4220738 */ +.comment-delim { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Preformatted and code */ + +tt, code, pre { + font-family: "Fira Mono", courier; + font-weight: 400; +} + +pre { + padding: 0.1em; + border: 1px solid var(--pre-border-color); + border-radius: 5px; + overflow-x: auto; +} + +p code, +li code { + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +p a > code { + color: var(--link-color); +} + +code { + white-space: pre-wrap; +} + +/* Code blocks (e.g. Examples) */ + +pre code { + font-size: 0.893rem; +} + +/* Code lexemes */ + +.keyword { + font-weight: 500; +} + +.arrow { white-space: nowrap } + +/* Module member specification */ + +.spec { + background-color: var(--spec-summary-background); + border-radius: 3px; + border-left: 4px solid var(--spec-summary-border-color); + border-right: 5px solid transparent; + padding: 0.35em 0.5em; +} + +li:not(:last-child) > .def-doc { + margin-bottom: 15px; +} + +/* Spacing between items */ +div.odoc-spec,.odoc-include { + margin-bottom: 2em; +} + +.spec.type .variant p, .spec.type .record p { + margin: 5px; +} + +.spec.type .variant, .spec.type .record { + margin-left: 2ch; + list-style: none; + display: flex; + flex-wrap: wrap; + row-gap: 4px; +} + +.spec.type .record > code, .spec.type .variant > code { + min-width: 40%; +} + +.spec.type > ol { + margin-top: 0; + margin-bottom: 0; +} + +.spec.type .record > .def-doc, .spec.type .variant > .def-doc { + min-width:50%; + padding: 0.25em 0.5em; + margin-left: 10%; + border-radius: 3px; + flex-grow:1; + background: var(--main-background); + box-shadow: 2px 2px 4px lightgrey; +} + +div.def { + margin-top: 0; + text-indent: -2ex; + padding-left: 2ex; +} + +div.def-doc>*:first-child { + margin-top: 0; +} + +/* Collapsible inlined include and module */ + +.odoc-include details { + position: relative; +} + +.odoc-include.shadowed-include { + display: none; +} + +.odoc-include details:after { + z-index: -100; + display: block; + content: " "; + position: absolute; + border-radius: 0 1ex 1ex 0; + right: -20px; + top: 1px; + bottom: 1px; + width: 15px; + background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); + box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); +} + +.odoc-include summary { + position: relative; + margin-bottom: 1em; + cursor: pointer; + outline: none; +} + +.odoc-include summary:hover { + background-color: var(--spec-summary-hover-background); +} + +/* FIXME: Does not work in Firefox. */ +.odoc-include summary::-webkit-details-marker { + color: #888; + transform: scaleX(-1); + position: absolute; + top: calc(50% - 5px); + height: 11px; + right: -29px; +} + +/* Records and variants FIXME */ + +div.def table { + text-indent: 0em; + padding: 0; + margin-left: -2ex; +} + +td.def { + padding-left: 2ex; +} + +td.def-doc *:first-child { + margin-top: 0em; +} + +/* Lists of @tags */ + +.at-tags { list-style-type: none; margin-left: -3ex; } +.at-tags li { padding-left: 3ex; text-indent: -3ex; } +.at-tags .at-tag { text-transform: capitalize } + +/* Lists of modules */ + +.modules { list-style-type: none; margin-left: -3ex; } +.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } +.modules .synopsis { padding-left: 1ch; } + +/* Odig package index */ + +.packages { list-style-type: none; margin-left: -3ex; } +.packages li { padding-left: 3ex; text-indent: -3ex } +.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } +.packages .version { font-size: 10px; color: var(--by-name-version-color); } +.packages .synopsis { padding-left: 1ch } + +.by-name nav a { + text-transform: uppercase; + font-size: 18px; + margin-right: 1ex; + color: var(--by-name-nav-link-color,); + display: inline-block; +} + +.by-tag nav a { + margin-right: 1ex; + color: var(--by-name-nav-link-color); + display: inline-block; +} + +.by-tag ol { list-style-type: none; } +.by-tag ol.tags li { margin-left: 1ch; display: inline-block } +.by-tag td:first-child { text-transform: uppercase; } + +/* Odig package page */ + +.package nav { + display: inline; + font-size: 14px; + font-weight: normal; +} + +.package .version { + font-size: 14px; +} + +.package.info { + margin: 0; +} + +.package.info td:first-child { + font-style: italic; + padding-right: 2ex; +} + +.package.info ul { + list-style-type: none; + display: inline; + margin: 0; +} + +.package.info li { + display: inline-block; + margin: 0; + margin-right: 1ex; +} + +#info-authors li, #info-maintainers li { + display: block; +} + +/* Sidebar and TOC */ + +.odoc-toc:before { + display: block; + content: "Contents"; + text-transform: uppercase; + font-size: 1em; + margin: 1.414em 0 0.5em; + font-weight: 500; + color: var(--toc-before-color); + line-height: 1.2; +} + +.odoc-toc { + position: fixed; + top: 0px; + bottom: 0px; + left: 0px; + max-width: 30ex; + min-width: 26ex; + width: 20%; + background: var(--toc-background); + overflow: auto; + color: var(--toc-color); + padding-left: 2ex; + padding-right: 2ex; +} + +.odoc-toc ul li a { + font-family: "Fira Sans", sans-serif; + font-size: 0.95em; + color: var(--color); + font-weight: 400; + line-height: 1.6em; + display: block; +} + +.odoc-toc ul li a:hover { + box-shadow: none; + text-decoration: underline; +} + +/* First level titles */ + +.odoc-toc>ul>li>a { + font-weight: 500; +} + +.odoc-toc li ul { + margin: 0px; +} + +.odoc-toc ul { + list-style-type: none; +} + +.odoc-toc ul li { + margin: 0; +} +.odoc-toc>ul>li { + margin-bottom: 0.3em; +} + +.odoc-toc ul li li { + border-left: 1px solid var(--toc-list-border); + margin-left: 5px; + padding-left: 12px; +} + +/* Mobile adjustements. */ + +@media only screen and (max-width: 95ex) { + body.odoc { + margin: 2em; + } + .odoc-toc { + position: static; + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0.2em 1em; + border-radius: 5px; + margin-bottom: 2em; + } +} + +/* Print adjustements. */ + +@media print { + body { + color: black; + background: white; + } + body nav:first-child { + visibility: hidden; + } +} + +/* Syntax highlighting (based on github-gist) */ + +.hljs { + display: block; + background: var(--code-background); + padding: 0.5em; + color: var(--color); + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #a71d5d; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: 500; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/*--------------------------------------------------------------------------- + Copyright (c) 2016 The odoc contributors + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ---------------------------------------------------------------------------*/ diff --git a/odoc/fmlib/Fmlib/index.html b/odoc/fmlib/Fmlib/index.html new file mode 100644 index 00000000..eea8be2e --- /dev/null +++ b/odoc/fmlib/Fmlib/index.html @@ -0,0 +1,2 @@ + +Fmlib (fmlib.Fmlib)

Module Fmlib

\ No newline at end of file diff --git a/odoc/fmlib/index.html b/odoc/fmlib/index.html new file mode 100644 index 00000000..d75521d8 --- /dev/null +++ b/odoc/fmlib/index.html @@ -0,0 +1,2 @@ + +index (fmlib.index)

Fmlib

The library Fmlib supports functional programming in Ocaml with managed effects. It has the following components:

  • Fmlib_js Low level interface to javascript via js_of_ocaml

All libraries of Fmlib are prefixed by Fmlib_ to avoid nameclashes with any other used libraries.

Installation

Fmlib can be installed easily with the help of the ocaml package manager opam:

    opam install fmlib

The components of Fmlib can be installed separately via opam.

Design and Implementation

The design and the implementation of some modules is described in this document.

Design Philosophy

All components of Fmlib work independently of any input/output methods i.e. they can be used in any environment.

The printers do not actually print. They generate a lazy stream of characters which can be output on any medium.

The parsers do not actually read from input. They work in push mode. You can choose your input method and you push the characters into the parser.

The library is functional in the sense that it avoids mutation or uses mutation only locally to improve performance. Exception handling is avoided as well. The module Fmlib_std.Result can be used to achieve the same effect as exception handling.

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Attribute/index.html b/odoc/fmlib_browser/Fmlib_browser/Attribute/index.html new file mode 100644 index 00000000..6dab41ca --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Attribute/index.html @@ -0,0 +1,29 @@ + +Attribute (fmlib_browser.Fmlib_browser.Attribute)

Module Fmlib_browser.Attribute

Attributes of Dom Elements.

There are four types of attributes:

  • style attributes: Color, font size, etc.
  • property attributes: arbitrary javascript values as properties of the corresponding dom element.
  • attributes: string valued attributes to give the element an id, a classname, etc.
  • handler attributes: React to user interactions (mouse clicks, ...) on the html element.

Sometimes the distinction between properties and attributes is quite subtle. To the best of my knowledge each added attribute adds a property with the same name (except when the name is a javascript keyword like "class") to the html element. But not all properties even if it is a string value adds an attribute to the element.

Generic Interface

 

type 'msg t

Type of an attribute potentially generating a message of type 'msg.

val style : string -> string -> 'msg t

style key value Add a style attribute to the html element.

Examples:

style "color"  "red"
+style "margin" "20px"
val property : string -> Value.t -> 'msg t

property key value Add a javascript property to the html element.

val attribute : string -> string -> 'msg t

attribute key value Add an attribute to the html element.

Examples:

attribute "id" "my_element"
+attribute "class" "container"
val handler : + string -> + Event_flag.stop -> + Event_flag.prevent -> + 'msg Decoder.t -> + 'msg t

handler event_type stop_flag prevent_flag decoder

Attribute representing an event listener on an html element. The two flags decide if the event is propagated upwards in the dom tree and if default action (some events like clicking on an anchor element cause default actions in the browser) is prevented.

The decoder decodes the javascript event object into a message of type 'msg.

Starting from the event object information from the whole dom tree up to the root can be decode. Each event object has a target (which is the element on which it is fired). The target element has a tag name, can have various properties etc. For more details on event objects see the event api.

More information on event handlers.

val map : ('a -> 'b) -> 'a t -> 'b t

map f a Map an attribute creating messages of type 'a to an attribute creating messages of type 'b.

Handler

val on : string -> 'msg Decoder.t -> 'msg t

on event_type decoder

is equivalent to handler event_type Event_flag.no_stop Event_flag.no_prevent decoder

val on_click : 'msg -> 'msg t

on_click m produce the message m on mouse click.

Common style attributes

val font_size : string -> 'msg t

Example font_size "20px"

Abbreviates style "font-size" "20px".

val color : string -> 'msg t

Example color "red"

Abbreviates style "color" "red".

val background_color : string -> 'msg t

Example background_color "powderblue"

Abbreviates style "background-color" "powderblue".

val height : string -> 'msg t

Example height "200px"

Abbreviates style "height" "200px".

val width : string -> 'msg t

Example width "200px"

Abbreviates style "width" "200px".

Margin, border, padding and content

               +--------------------------------+
+               |         margin                 |
+               |  +----border-----------------+ |
+               |  |      padding              | |
+               |  |   +---------------------+ | |
+               |  |   |                     | | |
+               |  |   |                     | | |
+               |  |   |      content        | | |
+               |  |   |                     | | |
+               |  |   +---------------------+ | |
+               |  +---------------------------+ |
+               |                                |
+               +--------------------------------+
val margin : string -> 'msg t

Examples

margin "25px"
+margin "25px 50px"              top/bottom 25px, left/right 50px
+margin "25px 50px 75px 100px"   top, right, bottom, left

margin str abbreviates style "margin" str

val padding : string -> 'msg t

Examples

padding "25px"
+padding "25px 50px"              top/bottom 25px, left/right 50px
+padding "25px 50px 75px 100px"   top, right, bottom, left

padding str abbreviates style "padding" str

val border_style : string -> 'msg t

Examples

border_style "solid"
+border_style "dotted"
+border_style "dashed"

border_style str abbreviates style "border-style" str

val border_width : string -> 'msg t

Examples

border_width "3px"
+border_width "thick"
+border_width "medium"
val border_color : string -> 'msg t

Example

border_color "red"

Common attributes

val id : string -> 'msg t

"id" attribute

val class_ : string -> 'msg t

"class" attribute

val href : string -> 'msg t

"href" attribute

val src : string -> 'msg t

"src" attribute

val title : string -> 'msg t

"title" attribute to display tooltips

Input elements

val value : string -> 'msg t

The value property of the element (usually an input element)

Each time the user enters something to the input element (text for input type 'text', slider position for input type 'range', date for input type 'date'), the value property changes. Using the value property in the virtual dom overwrites whatever the user has written into the input element. Using a 'value' attribute in the virtual dom does *not* overwrite the user value.

val placeholder : string -> 'msg t
val on_input : (string -> 'msg) -> 'msg t
\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Command/index.html b/odoc/fmlib_browser/Fmlib_browser/Command/index.html new file mode 100644 index 00000000..f2ced022 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Command/index.html @@ -0,0 +1,2 @@ + +Command (fmlib_browser.Fmlib_browser.Command)

Module Fmlib_browser.Command

Commands to be executed as a result of an update operation.

An elementary command consists of a Task to be executed.

type _ t

msg t is the type of a command generating an object of type msg to inject it into the update function of the application.

val none : _ t

An empty command.

val batch : 'm t list -> 'm t

batch lst A list of commands to be executed.

val perform : ('m, Task.empty) Task.t -> 'm t

perform task Perform the non failing task and send the message generated by the task to the application.

val just_do : (unit, Task.empty) Task.t -> 'm t

perform task Perform the non failing task and don't send any message to the application.

val attempt : (('a, 'e) Stdlib.result -> 'm) -> ('a, 'e) Task.t -> 'm t

attemp f task Attempt the possibly failing task and map the result via the function f into a message to send to the application.

val map : ('a -> 'b) -> 'a t -> 'b t
\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Decoder/index.html b/odoc/fmlib_browser/Fmlib_browser/Decoder/index.html new file mode 100644 index 00000000..a6f19c83 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Decoder/index.html @@ -0,0 +1,33 @@ + +Decoder (fmlib_browser.Fmlib_browser.Decoder)

Module Fmlib_browser.Decoder

Decoder for Javascript Values

Overview

Suppose we have the following ocaml types

type sex = Male | Female
+
+type tp = {
+    name:   string;
+    age:    int;
+    sex:    sex
+}

and we want to decode the javascript object

{name: "Jonathan", sex: "male", age: 55}

The we can use the following decoder

let decode: tp Decode.t =
+    let open Decode in
+    let* name = field "name" string in
+    let* age  = field "age"  int    in
+    let* sex  =
+        field
+            "sex"
+            (
+                let* str = string in
+                match str with
+                | "male" ->
+                    return Male
+                | "female" ->
+                    return Female
+                | _ ->
+                    fail
+            )
+    in
+    return {name; age; sex}

The decoder decode decodes any javascript object which has the fields name age and sex with a value of the appropriate type into the corresponding ocaml record.

API

General

 

type 'a t

'a t Type of a decoder which decodes a javascript value into an optional object of type 'a.

val run : 'a t -> Value.t -> 'a option

run decoder value Run the decoder on a javascript value. If the decoder succeeds with value a, then return Some a. Otherwise return None.

val return : 'a -> 'a t

return a Succeed with a regardless what the javascript object is.

val fail : 'a t

Fail immediately.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

dec >>= f

Equivalent to

let* v = dec in
+f v
val let* : 'a t -> ('a -> 'b t) -> 'b t

Combine decoders.

Example:

let* a = dec1 in
+dec2 a

First decode the javascript value with decoder dec1. In case of success with the value a, use decoder dec2 which can depend on a.

let* is useful to decode various fields of an object.

let* f1 = field "name1" dec1 in
+let* f2 = field "name2" dec2 in
+...
+return ...
val map : ('a -> 'b) -> 'a t -> 'b t

map f dec Decode using dec and in case of success, map the decoded value a to f a.

val (</>) : 'a t -> 'a t -> 'a t

dec1 </> dec2 First try decoder dec1. If it succeeds, return the decoded value. In case dec1 fails, use dec2 to decode the javascript value.

Basic decoders

 

val null : 'a -> 'a t

null v If the javascript value is null, then return v. Otherwise fail.

val undefined : 'a -> 'a t

undefined v If the javascript value is undefined, then return v. Otherwise fail.

val int : int t

Decode an integer value i.e. a number between -2^31 and 2^31 - 1.

val bool : bool t

Decode a boolean value.

val float : float t

Decode a floating point value i.e. a number.

val string : string t

Decode a string value. The decoding converts the javascript string from utf16 into an ocaml utf8 string.

Complex decoders

 

val field : string -> 'a t -> 'a t

field name dec Decode the field named name in the javascript object with the decoder dec.

val array : 'a t -> 'a array t

array dec Decode a javascript array into an ocaml array using dec to decode elements.

val option : 'a t -> 'a option t

option dec In case the javascript object is null succeed with None. Otherwise use dec to decode the object and in case of success wrap the result with Some.

Examples:

run (option int) Value.null         ~>      Some None
+run (option int) (Value.int 5)      ~>      Some (Some 5)
+run (option int) (Value.string "a") ~>      None
\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Event_flag/index.html b/odoc/fmlib_browser/Fmlib_browser/Event_flag/index.html new file mode 100644 index 00000000..cdf58fdc --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Event_flag/index.html @@ -0,0 +1,2 @@ + +Event_flag (fmlib_browser.Fmlib_browser.Event_flag)

Module Fmlib_browser.Event_flag

Event flags to stop propagation and prevent default action.

type prevent
type stop
val prevent : prevent

Prevent default handling.

val no_prevent : prevent

Do not prevent default handling.

val stop : stop

Stop event propagation.

val no_stop : stop

Do not stop event propagation.

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Html/index.html b/odoc/fmlib_browser/Fmlib_browser/Html/index.html new file mode 100644 index 00000000..26cdd947 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Html/index.html @@ -0,0 +1,7 @@ + +Html (fmlib_browser.Fmlib_browser.Html)

Module Fmlib_browser.Html

Virtual Dom

Primitives

type 'msg t

Type of a virtual dom node potentially generating a message of type 'msg.

val text : string -> 'msg t

text str Create a text node.

val node : string -> 'msg Attribute.t list -> 'msg t list -> 'msg t

node tag attrs children

Create an html element with a tagname, a list of attributes and a list of children.

val node_ns : + string -> + string -> + 'msg Attribute.t list -> + 'msg t list -> + 'msg t

node namespace tag attrs children

Like node, but creates the node within a namespace e.g. "http://www.w3.org/2000/svg" for svg elements.

val svg_node : string -> 'msg Attribute.t list -> 'msg t list -> 'msg t

svg_node tag attrs children

Create an svg element with a tagname, a list of attributes and a list of children. An svg element is a node in the namespace "http://www.w3.org/2000/svg".

val map : ('a -> 'b) -> 'a t -> 'b t

map f vdom

Map a virtual dom vdom creating messages of type 'a to a virtual dom creating messages of type 'b.

val keyed : string -> 'msg Attribute.t list -> (string * 'msg t) list -> 'msg t

keyed tag attrs children

Like node, but add a unique identifier to each child node. This makes adding, removing and modifying child nodes more efficient. The dom diffing algorithm compares child nodes with the same identifier.

Headers

val h1 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h1 attrs children is equivalent to node "h1" attrs children.

val h2 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h2 attrs children is equivalent to node "h2" attrs children.

val h3 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h3 attrs children is equivalent to node "h3" attrs children.

val h4 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h4 attrs children is equivalent to node "h4" attrs children.

val h5 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h5 attrs children is equivalent to node "h5" attrs children.

val h6 : 'msg Attribute.t list -> 'msg t list -> 'msg t

h6 attrs children is equivalent to node "h6" attrs children.

Grouping Content

val div : 'msg Attribute.t list -> 'msg t list -> 'msg t

div attrs children is equivalent to node "div" attrs children.

val span : 'msg Attribute.t list -> 'msg t list -> 'msg t

span attrs children is equivalent to node "span" attrs children.

val pre : 'msg Attribute.t list -> 'msg t list -> 'msg t

pre attrs children is equivalent to node "pre" attrs children.

val p : 'msg Attribute.t list -> 'msg t list -> 'msg t

p attrs children is equivalent to node "p" attrs children.

Input

val button : 'msg Attribute.t list -> 'msg t list -> 'msg t

button attrs children is equivalent to node "button" attrs children.

val input : 'msg Attribute.t list -> 'msg t list -> 'msg t

input attrs children is equivalent to node "input" attrs children.

val label : 'msg Attribute.t list -> 'msg t list -> 'msg t

label attrs children is equivalent to node "label" attrs children.

val textarea : 'msg Attribute.t list -> 'msg t list -> 'msg t

textarea attrs children is equivalent to node "textarea" attrs children.

val select : 'msg Attribute.t list -> 'msg t list -> 'msg t

select attrs children is equivalent to node "select" attrs children.

Lists

val ol : 'msg Attribute.t list -> 'msg t list -> 'msg t

ol attrs children is equivalent to node "ol" attrs children.

val ul : 'msg Attribute.t list -> 'msg t list -> 'msg t

ul attrs children is equivalent to node "ul" attrs children.

val li : 'msg Attribute.t list -> 'msg t list -> 'msg t

li attrs children is equivalent to node "li" attrs children.

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Random/index.html b/odoc/fmlib_browser/Fmlib_browser/Random/index.html new file mode 100644 index 00000000..506d59da --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Random/index.html @@ -0,0 +1,2 @@ + +Random (fmlib_browser.Fmlib_browser.Random)

Module Fmlib_browser.Random

Generate Random Numbers

type 'a t

Generator, generating random values of type 'a.

val constant : 'a -> 'a t

constant a Generate the same value every time.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

rand >>= f Generate the random value a using the generator rand, and then use f a to generate a random value b.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* a = rand in f a is the same as rand >>= f.

val map : ('a -> 'b) -> 'a t -> 'b t

map f rand Use rand to generate a random value and then map it by f.

val int : int -> int t

int bound A random generator which generates numbers n satisfying 0 <= n < bound.

Precondition: 0 < bound

val float : float -> float t

float bound A random generator which generates numbers n satisfying 0.0 <= n <= bound.

Precondition: 0 <= bound

val bool : bool t

Generate a random boolean value.

val choose : 'a list -> 'a t

uniform lst Generate a random value of the list lst.

Precondition: List must not be empty lst <> []

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Subscription/index.html b/odoc/fmlib_browser/Fmlib_browser/Subscription/index.html new file mode 100644 index 00000000..7ab67fc3 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Subscription/index.html @@ -0,0 +1,3 @@ + +Subscription (fmlib_browser.Fmlib_browser.Subscription)

Module Fmlib_browser.Subscription

Subscriptions to global events.

Basics

type 'm t
val none : 'm t
val batch : 'm t list -> 'm t
val map : ('a -> 'b) -> 'a t -> 'b t

Events on the window object

val on_window : string -> 'm Decoder.t -> 'm t

on_window event_type decode

Subscribe to window events of type event_type. Examples

on_window "resize"  decode
+on_window "keydown" decode

Incoming messages from javascript

val on_message : 'm Decoder.t -> 'm t

on_message decode

Subscribe to incoming messages from the javascript world. If there is an incoming message (a javascript object) then decode the object with the help of the function decode and send the decoded value as a message to the update function of the application.

Timer events

val every : int -> (Time.t -> 'm) -> 'm t

every millis f Subscribe to an event which is fired every millis milliseconds. Use f to map the posix time into a message for the update function.

val on_animation : (Time.t -> 'm) -> 'm t

on_animation f

Subscribe to the requestAnimationFrame event. The callback gets the posix time at the event.

Keyboard events

val on_keydown : (string -> 'm) -> 'm t
val on_keyup : (string -> 'm) -> 'm t

Mouse events

The following mouse event subscriptions just decode the clientX and clientY value of the mouse event. But a mouse event has much more information. You can get a customized subscription which decodes more mouse event data by just writing a decoder decode which decodes all values from a mouse event which are of interest and subscribe to the mouse event e.g. by on_window "mouseup" decode.

val on_mouse_down : (int -> int -> 'm) -> 'm t

Subscribe to mousedown events.

val on_mouse_move : (int -> int -> 'm) -> 'm t

Subscribe to mousemove events.

val on_mouse_up : (int -> int -> 'm) -> 'm t

Subscribe to mouseup events.

Window resize

val on_resize : (int -> int -> 'm) -> 'm t

on_resize f Subscribe to the window resize event and report the innerWidth and innerHeight properties to the function f to generate the message for the update function.

Visibility change

val on_visibility_change : (string -> 'm) -> 'm t

on_visibility_change f Subscribe to the window visibility change event and report the visibility state which is either "visible" or "hidden" to the function f to generate the message for the update function.

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Task/index.html b/odoc/fmlib_browser/Fmlib_browser/Task/index.html new file mode 100644 index 00000000..45cfdae1 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Task/index.html @@ -0,0 +1,20 @@ + +Task (fmlib_browser.Fmlib_browser.Task)

Module Fmlib_browser.Task

Tasks to be performed within Commands

Error types

type empty =
  1. | []
type http_error = [
  1. | `Http_status of int
    (*
    • 0: no internet, server not found, timeout, ...
    • 401: bad request
    • 403: forbidden
    • 404: page not found
    • ...
    *)
  2. | `Http_no_json
    (*

    Resource is not a valid json file

    *)
  3. | `Http_decode
    (*

    Resource is a valid json file, but the decoder could not decode the corresponding javascript object.

    *)
]
type not_found = [
  1. | `Not_found
]

Basic type and functions

type ('a, +'e) t

Task succeeding with a value of type 'a or failing with an error object of type 'e

val succeed : 'a -> ('a, 'e) t
val return : 'a -> ('a, 'e) t
val fail : 'e -> ('a, 'e) t
val result : ('a, 'e) Stdlib.result -> ('a, 'e) t
val (>>=) : ('a, 'e) t -> ('a -> ('b, 'e) t) -> ('b, 'e) t
val let* : ('a, 'e) t -> ('a -> ('b, 'e) t) -> ('b, 'e) t
val map : ('a -> 'b) -> ('a, 'e) t -> ('b, 'e) t

Write to the console

val log_string : string -> (unit, 'e) t

log_string str Write str to the console.

val log_value : Value.t -> (unit, 'e) t

log_value v Write the javascript object v to the console.

Messages to the javascript world

val send_to_javascript : Value.t -> (unit, 'e) t

send_to_javascript value Send the javascript object value to the surrounding javascript world.

Focus and blur elements

val focus : string -> (unit, not_found) t

focus id Put the dom element with id into focus.

val blur : string -> (unit, not_found) t

blur id Unfocus the dom element with id.

Defer tasks a certain time

val sleep : int -> 'a -> ('a, 'e) t

sleep millis a Sleep for millis milliseconds and then return a.

Examples:

let* _ = sleep 1000 () in       (* sleep 1000 milliseconds *)
+task                            (* and then execute [task] *)
+
+let* a = task1 >>= sleep 1000   (* excute [task1] and return result
+                                   [a] after 1000 milliseconds *)
+in
+task2 a                         (* then execute [task2 a] *)
val next_tick : 'a -> ('a, 'e) t

next_tick a Return a in the next tick of the event loop.

Example: Execute task in the next round of the event loop.

let* _ = next_tick () in
+task

Time and time zone

val now : (Time.t, 'e) t

Get the current time.

val time_zone : (Time.Zone.t, 'e) t

Get the current time zone.

Random values

val random : 'a Random.t -> ('a, 'e) t

random ran Execute the random generator rand and return the generated random value.

Http requests

val http_text : + string -> + string -> + (string * string) list -> + string -> + (string, http_error) t

http_text method url headers body

Make a http method request to url with headers and body. Expect the response as a string.

Method is one of GET, POST, DELETE, ... .

Then headers and the body can be empty.

val http_json : + string -> + string -> + (string * string) list -> + string -> + 'a Decoder.t -> + ('a, http_error) t
\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Time/Zone/index.html b/odoc/fmlib_browser/Fmlib_browser/Time/Zone/index.html new file mode 100644 index 00000000..b059c80c --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Time/Zone/index.html @@ -0,0 +1,2 @@ + +Zone (fmlib_browser.Fmlib_browser.Time.Zone)

Module Time.Zone

Time zone

A time zone is the offset in minutes from utc. Time zones westward of utc get a positive offset, eastward of utc a negative offset.

type t
val utc : t
val make : int -> t

make offset Time zone offset minutes westward of utc.

make (-60) is the zone of central european winter time. It is one hour eastward of utc.

val offset : t -> int

offset zone The offset of zone in minutes westward of utc.

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Time/index.html b/odoc/fmlib_browser/Fmlib_browser/Time/index.html new file mode 100644 index 00000000..72e811a9 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Time/index.html @@ -0,0 +1,2 @@ + +Time (fmlib_browser.Fmlib_browser.Time)

Module Fmlib_browser.Time

Posix Time

Posix time is the number of milliseconds passed since the beginning of the unix epoch i.e. since 1.1.1970 in utc i.e. universal coordinated time.

In order to get the time in your time zone you need a time zone.

module Zone : sig ... end

Time zone

type t
val zero : t

1.1.1970 in utc.

val of_float : float -> t
val to_float : t -> float

In order to get a year, month, ... you need the utc time and the time zone you are in.

val year : t -> Zone.t -> int

year time zone The year of time in zone.

val month : t -> Zone.t -> int

month time zone The month of time in zone.

January is month 0.

val day_of_month : t -> Zone.t -> int

day_of_month time zone The day of the month of time in zone.

First day of the month is day 0.

val hour : t -> Zone.t -> int

0 - 23

val minute : t -> Zone.t -> int

0 - 59

val second : t -> Zone.t -> int

0 - 59

val milli_second : t -> Zone.t -> int

0 - 999

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/Value/index.html b/odoc/fmlib_browser/Fmlib_browser/Value/index.html new file mode 100644 index 00000000..50e099f1 --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/Value/index.html @@ -0,0 +1,7 @@ + +Value (fmlib_browser.Fmlib_browser.Value)

Module Fmlib_browser.Value

Javascript Values

Javascript values are necessary to comunicate with the javascript world. In order to send a message to the surrounding javascript (see Task.send_to_javascript) a javascript value is needed. The following functions can be used to construct arbitrary javascript values (no functions, just data).

E.g. if you want to construct the javascript object

        {first_name: "John", last_name: "Doe", age: 45}

you just write

record
+    [|
+      "first_name", string "John"
+    ; "last_name", string "Doe"
+    ; "age", int 45
+    |]
type t
val null : t

The javascript value null

val string : string -> t

string str The javascript string str

val int : int -> t

int 5 The javascript number 5.

val bool : bool -> t

bool true The javascript value true.

val float : float -> t

float 5 The javascript number 5.

val record : (string * t) array -> t

record [| "a", int 5; "b", string "hello"|] is the javascript value {a: 5, b: 'hello'}|.

val array : t array -> t

array [|int 5; string "hello"; bool true|] is the javascript array [5, "hello", true].

\ No newline at end of file diff --git a/odoc/fmlib_browser/Fmlib_browser/index.html b/odoc/fmlib_browser/Fmlib_browser/index.html new file mode 100644 index 00000000..263a0fcd --- /dev/null +++ b/odoc/fmlib_browser/Fmlib_browser/index.html @@ -0,0 +1,47 @@ + +Fmlib_browser (fmlib_browser.Fmlib_browser)

Module Fmlib_browser

Web Applications Running in the Browser

This library helps to write web applications which run in the browser. See some simple live examples and look into the source code.

For a step by step introduction see "Introduction to Web Applications".

Utilities

module Random : sig ... end

Generate Random Numbers

module Time : sig ... end

Posix Time

module Event_flag : sig ... end

Event flags to stop propagation and prevent default action.

Encode and Decode Javascript Values

module Value : sig ... end

Javascript Values

module Decoder : sig ... end

Decoder for Javascript Values

Virtual Dom

module Attribute : sig ... end

Attributes of Dom Elements.

module Html : sig ... end

Virtual Dom

Commands and Subscriptions

module Task : sig ... end

Tasks to be performed within Commands

module Command : sig ... end

Commands to be executed as a result of an update operation.

module Subscription : sig ... end

Subscriptions to global events.

Debugging

val debug : string -> unit

debug str Log str to the console as a side effect.

val debug_value : Value.t -> unit

debug_value v a Log the javascript value v to the console as a side effect.

Sandbox Applications

A sandbox application has only limited user interactions. A sandbox application cannot execute commands. It can only get messages from user interactions like mouse clicks, keyboard strokes on elements in focus etc.

The dom of a sandbox application is put directly under the body of the html page i.e. it occupies the whole browser window.

val sandbox : + 'state -> + ('state -> 'msg Html.t) -> + ('state -> 'msg -> 'state) -> + unit

sandbox state view update

A sandbox application is started with the command

let _ = sandbox state view update

and it needs only a very simple html file of the form

        <!-- file: index.html -->
+        <!DOCTYPE html>
+        <html>
+            <head>
+                <script type="text/javascript" src="webapp.js">
+                </script>
+            </head>
+            <body>
+            </body>
+        </html>

The application is started on the onload event of the browser window.

val sandbox_plus : + 'state -> + ('state -> 'msg Html.t) -> + ('state -> 'msg Subscription.t) -> + ('state -> 'msg -> 'state) -> + unit

sandbox_plus state view subs update

A sandbox_plus application is like a sandbox application. In addition it can receive notifications.

Full Web Application

A full web application has full user interaction, can execute arbitrary commands and subscribe to all possible global events.

val application : + string -> + ('state * 'msg Command.t) Decoder.t -> + ('state -> 'msg Html.t * string) -> + ('state -> 'msg Subscription.t) -> + ('state -> 'msg -> 'state * 'msg Command.t) -> + unit

application my_app init view subs update

Browser application named my_app on the javascript side. The application creates the global object named my_app which contains the two functions init and post.

The application is started on the javascript side with

        my_app.init ({
+            data: <initialisation object>,
+            onMessage: <function to receive messages on the javascript side from
+                        the application>
+        })

The javascript code can post messages to the application by

        my_app.post (message)
val basic_application : + 'state -> + 'msg Command.t -> + ('state -> 'msg Html.t * string) -> + ('state -> 'msg Subscription.t) -> + ('state -> 'msg -> 'state * 'msg Command.t) -> + unit

basic_application state command view subs update

A basic_application is like an application which cannot interact with the surrounding javascript. I.e. it cannot receive initialization date, it cannot receive messages and cannot send messages from the javscript world.

Element Application

An element application is like application above with the difference that the dom is inserted directly under a certain element of the dom tree. The web application generated by the library does not touch the dom outside the user chosen element.

Purpose of the element application: Use an already written webapplication in javascript and add certain functions written in ocaml by using this library.

The element application offers a smooth path to start using the library without rewriting an already existing application from scratch.

The javascript part and the ocaml part can communicate via message passing i.e. the javascript part can post a javascript object to ocaml (see Subscription.on_message) and the ocaml part can send javascript objects (see Value and Task.send_to_javascript).

val element : + string -> + ('state * 'msg Command.t) Decoder.t -> + ('state -> 'msg Html.t) -> + ('state -> 'msg Subscription.t) -> + ('state -> 'msg -> 'state * 'msg Command.t) -> + unit

element my_app init view subs update

Browser application named my_app on the javascript side. The application creates the global object named my_app which contains the two functions init and post.

The application is started on the javascript side with

        my_app.init ({
+            data: <initialisation object>,
+            element_id: <id of the element under which the application works>,
+            onMessage: <function to receive messages on the javascript side from
+                        the application>
+        })

The javascript code can post messages to the application by

        my_app.post (message)
\ No newline at end of file diff --git a/odoc/fmlib_browser/doc.html b/odoc/fmlib_browser/doc.html new file mode 100644 index 00000000..f8de9513 --- /dev/null +++ b/odoc/fmlib_browser/doc.html @@ -0,0 +1,2 @@ + +doc (fmlib_browser.doc)

Introduction to Web Applications

Up API

\ No newline at end of file diff --git a/odoc/fmlib_browser/doc_event_handler.html b/odoc/fmlib_browser/doc_event_handler.html new file mode 100644 index 00000000..a1218b6f --- /dev/null +++ b/odoc/fmlib_browser/doc_event_handler.html @@ -0,0 +1,19 @@ + +doc_event_handler (fmlib_browser.doc_event_handler)

Event Handler

Getting started Up

The code in a browser application is event driven. Each pressing of a key, moving of the mouse etc. generates a javascript event and the browser checks if there is an event handler installed and call the event handling function with the event. This architecture is quite universal and flexible.

In the library Fmlib_browser each event of interest has to be decoded into a message (whose type is user defined) and the message together with the state (also user defined) is passed to the user defined update function to compute the new state and new commands.

In order to write customized event handlers we need decoders to decode information available in the javascript world into a message. The module Attribute has a function handler with the signature

val handler:
+    string                      (* event type e.g. "mouseenter"    *)
+    -> Event_flag.stop          (* stop propagation flag           *)
+    -> Event_flag.prevent       (* prevent default action flag     *)
+    -> 'm Decoder.t             (* decode the event into a message *)
+    -> 'm Attribute.t

An event handler is added on a html element of the virtual dom if the html element has a handler attribute.

A simple handler to get notified on mouse clicks looks like

let on_click (m: 'msg): 'msg Attribute.t =
+    let open Attribute in
+    handler
+        "click"
+        Event_flag.no_stop
+        Event_flag.no_prevent
+        Decoder.(return m)

A decoder which returns on each mouseclick the tag name of the clicked element:

let on_click_tagname: string Attribute.t =
+    let open Attribute in
+    handler
+        "click"
+        Event_flag.no_stop
+        Event_flag.no_prevent
+        Decoder.(field "target" (field "tagName" string))

Getting started Up

\ No newline at end of file diff --git a/odoc/fmlib_browser/doc_getting_started.html b/odoc/fmlib_browser/doc_getting_started.html new file mode 100644 index 00000000..5bd52522 --- /dev/null +++ b/odoc/fmlib_browser/doc_getting_started.html @@ -0,0 +1,99 @@ + +doc_getting_started (fmlib_browser.doc_getting_started)

Getting Started

Overview Up Event Handler

Installation

The library Fmlib_browser is best installed via opam issuing the command

    opam install fmlib_browser

Write the application

In this section we write first a very simple application with a counter value and two buttons to decrease and increase the counter value. Here is the ocaml source file which implements the application.

(* file: counter.ml *)
+open Fmlib_browser
+
+(* The type of the state is [int]. Therefore no type declaration is
+   necessary for the state. *)
+
+let type msg =
+    | Decrement
+    | Increment
+
+let view (counter: int): msg Html.t =
+    let open Html in
+    let open Attribute in
+    div []
+        [ button
+            [color "blue"; on_click Decrement]
+            [text "-"]
+        ; span
+            [background_color "silver"; font_size "20px"]
+            [text (string_of_int counter)]
+        ; button
+            [color "blue"; on_click Increment]
+            [text "+"]
+        ]
+
+let update (counter: int): msg -> int = function
+    | Decrement ->
+        counter - 1
+    | Increment ->
+        counter + 1
+
+let _ =
+    sandbox         (* very simple applications are sandbox applications *)
+        0           (* initial state *)
+        view        (* view function *)
+        update      (* update function *)

Compile the application via dune

The application in the file webapp.ml has to be compiled to javascript. This is done with the help of js_of_ocaml. The following dune file can be used:

    (executable
+      (name counter)
+      (modes js)                    ; Activate compilation to javascript
+      (libraries fmlib_browser)     ; Use the library
+    )
+
+    (rule
+        (targets counter.js)         ; Generate the file 'counter.js'
+        (deps    counter.bc.js)
+        (mode   (promote (until-clean)))
+        (action (copy counter.bc.js counter.js))
+    )

The application is compiled via one of the commands

    dune build ./counter.js
+
+    dune build --profile release ./counter.js

The first one generates the file counter.js with a lot of diagnostic information. The second one generates a much smaller file counter.js with no diagnostic information.

Html file

Furthermore we need a html file.

    <!-- file: index.html -->
+    <!DOCTYPE html>
+    <html>
+        <head>
+            <script type="text/javascript" src="counter.js">
+            </script>
+        </head>
+        <body>
+        </body>
+    </html>

The sandbox application installs itself as an event listener for the onload event and creates and updates the dom directly below the body element of the html document. Everything in the html file below the body element will be overwritten.

Now you have the files webapp.js and index.html in your source directory. By loading index.html into the browser (either from a webserver or from disk), the browser loads the application webapp.js and fires the onload event which starts the application.

A digital clock

In order to demonstrate commands and subscriptions with a simple example we write an application displaying a digital clock. We want the webpage to look like

    10:15:37

to represent the time of 10 o'clock and 15 minutes and 37 seconds. The current time has to be updated each second.

The state of the application contains the posix time and the current time zone.

(* file: clock.ml *)
+
+open Fmlib_browser
+
+type state = {
+    time: Time.t;
+    zone: Time.Zone.t;
+}

The application has to be informed about the current time and time zone and has to receive a notification each second to update the time. The following message type contains the needed information.

type msg =
+    | Time of Time.t            (* message for the current time   *)
+    | Zone of Time.Zone.t       (* message for the current time zone *)

We use a minimal view function to render the current time in a browser window.

let view (state: state): msg Html.t * string =
+    let open Html in
+    h2
+        []
+        [text (
+            Printf.sprintf "%02d:%02d:%02d"
+                (Time.hour   state.zone state.time)
+                (Time.minute state.zone state.time)
+                (Time.second state.zone state.time))
+        ]
+    ,
+    "Digital clock"

For a full blown application the view function returns the virtual dom and the title of the page.

The update function is quite straightforward.

let update (state: state): msg -> state * msg Command.t =
+function
+    | Time time ->
+        {state with time}, Command.none
+    | Zone zone ->
+        {state with zone}, Command.none

We need a subscription function to get each second a notification of the new time.

let subscription (_: state): msg Subscription.t =
+    Subscription.every 1000 (fun time -> Time time)

We need a message Time time each second independently from the system state. The time for repeating timers is expressed in milliseconds.

In order to start the application we need an initial state and an initial command.

initial_state: state =
+    {time = Time.zero; zone = Time.Zone.utc}
+
+initial_command: msg Command =
+    Command.batch [
+         Command.perform Task.(map (fun time -> Time time) now)
+         ;
+         Command.perform Task.(map (fun zone -> Zone zone) time_zone)
+    ]

The task now returns the current posix time and the task time_zone returns the current time zone. However the application needs messages which can be fed into the update function. Therefore the results have to be mapped to messages. Unfortunately ocaml does not allow constructors to be used like functions, therefore two small anonymous function are needed to do the mapping.

Initially we set the time to zero and the time zone to utc. This is evidently not correct. Therefore we immediately start commands which get the current time and the current time zone.

The application is started by

let _ =
+    basic_application
+        initial_state
+        initial_command
+        view
+        subscription
+        update

The corresponding dune and html files are the same as for the counter example.

\ No newline at end of file diff --git a/odoc/fmlib_browser/doc_overview.html b/odoc/fmlib_browser/doc_overview.html new file mode 100644 index 00000000..d68434c8 --- /dev/null +++ b/odoc/fmlib_browser/doc_overview.html @@ -0,0 +1,41 @@ + +doc_overview (fmlib_browser.doc_overview)

Overview

Up Getting Started

Basics

The library Fmlib_browser helps to write web applications which run in the browser in a pure functional style. It mimics the elm language in ocaml.

The core of a functional web application is a system state and 2 main functions to describe the behaviour of a web application.

  1. The system state: It contains all relevant data of the application. For a pure static page with no interaction with the user the state is just the unit value (). For an application representing a counter which can be increased or decreased by clicking on buttons the state is an int which represents the value of the counter.
  2. A view function: This function maps the state into a virtual dom. The virtual dom is a description of what the user sees on the screen. Furthermore the virtual dom contains elements like buttons or text fields which produce messages. The messages are dispatched to the update function.
  3. An update function: The update function maps the state of the application and a message to a new state.

Static webpage

If we just want to display a static page with a grocery list the functions are quite simple.

type message    (* no constructor, i.e. no message can be created. *)
+
+let view (): unit Html.t =
+    let open Html in
+    let open Attribute in
+    ol [attribute "start" "51"] [
+        li [] [text "Milk"];
+        li [] [text "Honey"];
+        li [] [text "Meet"]
+    ]
+
+let update () (_: message): unit =
+    assert false (* Function can never be called because [message] has no
+                    constructor *)

The only interesting part of the example is the view function. The function uses the modules Html and Attribute to construct the virtual dom. The virtual dom is a tree describing the displayed page. The corresponding html markup looks like

    <ol start="51">
+        <li> Milk </li>
+        <li> Honey </li>
+        <li> Meet </li>
+    </ol>

and the rendered page would look like

    51. Milk
+    52. Honey
+    53. Meet

The module Html has two basic functions and a lot of abbreviations to construct a virtual dom. The two basic functions are

text: string -> 'a Html.t

to construct a text node (i.e. a leaf in the virtual dom tree) and

node: string -> 'a Attribute.t list -> 'a Html.t list -> 'a Html.t

where node tag attrs children constructs an element node with a tagname (div, h1, ...) a list of attributes and a list of children.

The function call li [] [text "Milk"] is just an abbreviation for

node "li" [] [text "Milk"]

Webpage with user interaction

A simple webpage with user interaction is a page which looks like

    -  10 +

where - and + are buttons which can be clicked on. A mouse click on - decrements the counter and a mouse click on + increments the counter.

The following code generates such an application:

type msg =
+    | Decrement
+    | Increment
+
+let view (counter: int): msg Html.t =
+    div []
+        [
+          button [on_click Decrement] [text "-"]
+        ; text (string_of_int counter)
+        ; button [on_click Increment] [text "+"]
+        ]
+
+let update (counter: int): msg -> int = function
+    | Decrement ->
+        counter - 1
+    | Increment ->
+        counter + 1

The corresponding html markup looks like

    <div>
+        <button> - </button>
+        5
+        <button> + </button>
+    </div>

However the button elements get event listeners which, when pressed, either increment or decrement the state. The counter value changes on each click on one of the buttons dynamically.

Commands and Subscriptions

For practical web applications there are more interactions needed than just reactions to mouse clicks. A web application based on Fmlib_browser is able to

  • send http requests
  • get the current time and the time zone
  • send and receive messages to and from the surrounding javascript
  • generate random values
  • get notifications at certain points in time
  • get notifications when the browser window is resized
  • focus and blur html elements (text input fields)
  • write to the console
  • get notifications on keyboard actions (keydown, keyup) and mouse actions (down, up, move).
  • ...

In order to make this possible the library Fmlib_browser offers commands and subscriptions.

Commands can be generated via the update function. A full blown update function has the signature

update: state -> msg -> state * msg Command.t

i.e. based on the current state and the current message the update function computes a new state and a command (which can be a set of commands as well). A value of type msg Command.t represents a command which terminates with a message which will be dispatched to the update function after command completion.

In order to generate notifications to the application the user writes a function with the signature

subscription: state -> msg Subscription.t

I.e. depending on the state of the application several (or no) subscription can be activated.

After each state change (i.e. execution of the update function) the library uses the new state and computes via the user supplied subscription the possibly new, changed or removed subscriptions and installs and/or removes the corresponding event listeners.

User and library code

All code provided by the user is and has to be purely functional. All user data like the state are immutable. The functions view, subscription and update must not have side effects (at least no visible side effects). The library Fmlib_browser handles all effectful commands and mutability needed in the resulting javascript code.

The library functions hold the current user state and the current virtual dom. The library installs an event listener on the requestAnimationFrame event of the browser.

If the state has changed since the last animation frame then the library uses the view function to generate the corresponding virtual dom. It does a dom diffing between the new virtual dom and the stored current dom and executes the minimal actions to make the real dom to look like requested in the new virtual dom.

Since modifications of the real dom might be expensive the library tries to minimize accesses to the real dom.

The library installs the necessary event listeners on the corresponding dom elements and on all event targets which are needed to get the required notifications.

Each fired event of interest generates an object of the message type and is fed together with the state to the user supplied update function to generate an new state and an optional command.

After receiving a new state and a command from the user supplied update function the library uses the user supplied subscription function to update event listeners (if necessary) and executes the command which might produce new messages.

The new messages are dispatched to the update function on the next tick of the javascript event loop to avoid long blockings of the event loop.

Up Getting Started

\ No newline at end of file diff --git a/odoc/fmlib_browser/index.html b/odoc/fmlib_browser/index.html new file mode 100644 index 00000000..841ecc03 --- /dev/null +++ b/odoc/fmlib_browser/index.html @@ -0,0 +1,2 @@ + +index (fmlib_browser.index)

Web Applications

Documentation

Introduction to Web Applications

API

Fmlib_browser

Examples

Sources of the examples.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Base/Decode/index.html b/odoc/fmlib_js/Fmlib_js/Base/Decode/index.html new file mode 100644 index 00000000..3f6deb94 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Base/Decode/index.html @@ -0,0 +1,33 @@ + +Decode (fmlib_js.Fmlib_js.Base.Decode)

Module Base.Decode

Decode javascript values into ocaml values.

Overview

Suppose we have the following ocaml types

type sex = Male | Female
+
+type tp = {
+    name:   string;
+    age:    int;
+    sex:    sex
+}

and we want to decode the javascript object

{name: "Jonathan", sex: "male", age: 55}

The we can use the following decoder

let decode: tp Decode.t =
+    let open Decode in
+    let* name = field "name" string in
+    let* age  = field "age"  int    in
+    let* sex  =
+        field
+            "sex"
+            (
+                let* str = string in
+                match str with
+                | "male" ->
+                    return Male
+                | "female" ->
+                    return Female
+                | _ ->
+                    fail
+            )
+    in
+    return {name; age; sex}

The decoder decode decodes any javascript object which has the fields name age and sex with a value of the appropriate type into the corresponding ocaml record.

API

type 'a t = Value.t -> 'a option

'a t Type of a decoder which decodes a javascript value into an optional object of type 'a.

Returns an object of type 'a, if the decoder can decode the javascript value into an object of type 'a. Otherwise returns None.

val return : 'a -> 'a t

return a Return a regardless what the javascript object is.

val fail : 'a t

Immediately fail i.e. return None.

val value : Value.t t

Return the javascript value.

val let* : 'a t -> ('a -> 'b t) -> 'b t

Combine decoders.

Example:

let* a = decoder1 in
+decoder2 a

First decode the javascript value with decoder decoder1. In case of success with the value a, use decoder decoder2 which can depend on a.

let* is useful to decode various fields of an object.

let* f1 = field "name1" dec1 in
+let* f2 = field "name2" dec2 in
+...
+return ...
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

dec >>= f

Equivalent to

let* v = dec in
+f v
val (</>) : 'a t -> 'a t -> 'a t

dec1 </> dec2 First try decoder dec1. If it succeeds, return the decoded value. In case dec1 fails, use dec2 to decode the javascript value.

val map : ('a -> 'b) -> 'a t -> 'b t

map f dec Decode using dec and in case of success, map the decoded value a to f a.

val null : 'a -> 'a t

null v If the javascript value is null, then return v. Otherwise fail.

val undefined : 'a -> 'a t

undefined v If the javascript value is undefined, then return v. Otherwise fail.

val float : float t

Decode a floating point value i.e. a number.

val int : int t

Decode an integer value i.e. a number between -2^31 and 2^31 - 1.

val bool : bool t

Decode a boolean value.

val string : string t

Decode a string value. The decoding converts the javascript string from utf16 into an ocaml utf8 string.

val _function : (Value.t array -> Value.t) t

Decode a javascript function into an ocaml function.

Since javascript function can accept any number of arguments, the returned function is an ocaml function which accepts an array of javascript values and returns a javascript value.

The function can use decoders to decode its arguments and use the module Value to generate the result.

val _method : (Value.t -> Value.t array -> Value.t) t

Decode a javascript method into an ocaml function.

The decoded function accepts a javascript value which is bound to this and and array of javascript value arguments.

A call f obj args is compiled to the javascript call f.apply(obj,args).

If the javascript function is not a method, then it ignores the object argument.

val field : string -> 'a t -> 'a t

field name dec Decode the field named name in the javascript object with the decoder dec.

val array : 'a t -> 'a array t

array dec Decode a javascript array into an ocaml array using dec to decode elements.

val option : 'a t -> 'a option t

option dec In case the javascript object is null return Some None. Otherwise use dec to decode the object and in case of success wrap the result with Some.

Examples:

(option int) Value.null         ~>      Some None
+(option int) (Value.int 5)      ~>      Some (Some 5)
+(option int) (Value.string "a") ~>      None
\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Base/Main/index.html b/odoc/fmlib_js/Fmlib_js/Base/Main/index.html new file mode 100644 index 00000000..d635c3e7 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Base/Main/index.html @@ -0,0 +1,62 @@ + +Main (fmlib_js.Fmlib_js.Base.Main)

Module Base.Main

Javascript Exceptions

type js_error

Type of a javascript exception.

val of_exception : exn -> js_error option

of_exception exn returns Some js_error if the exception exn is an exception raised by javascript code and None if exn is an exception raised by ocaml code.

val raise_js_error : js_error -> 'a

Raise the javascript exception js_error

val raise_js : string -> 'a

raise_js error Raise a javascript exception.

Logging

val log_string : string -> unit

log_string str Log the string str via console.log.

val log_value : Value.t -> unit

log_value v Log the javascript value v via console.log.

Node Module

The functions in this section allow the creation of node modules which can interact with the surrounding javascript code. The communication is based on message passing. The javascript side can send messages into the node module implemented in ocaml and the ocaml side can send messages to the javascript side.

In order to start the node module, initialisation data can be provided.

The implementation of the node module on the ocaml side is done by providing a function of the following type.

type ('state, 'msg) node_function = 'state -> (Value.t -> unit) -> 'msg -> unit

Type of the implementation function of the node module.

The implementation function has the form

let node (state: 'state) (callback: Value.t -> unit): 'msg -> unit =
+    ... (* initialisation code *)
+    ...
+    fun msg ->
+        ... (* receive a message from the javascript side *)
+        ...

Having a node function and a state and a message decoder, a node module is generated by a call to the following function.

val node_module : + 'state Decode.t -> + 'msg Decode.t -> + ('state, 'msg) node_function -> + unit

node_module state_decode msg_decode node_function

An ocaml program my_app.ml with an ocaml statement of the form

let _ =
+    node_module state_decode msg_decode node_function

compiles to my_app.js which can be loaded as a module in a nodejs script via

           var my_app = require('./my_app.js')

The javascript value my_app is a javascript object of the form

           {init: (initial_state, callback) => { ... }}

which can be used in the following way:

            function callback (msg) {
+                ...     // actions on receiving a message from 'my_app'
+            }
+            var state =
+                     ... // initial state which can be decoded
+                         // by 'state_decode'
+
+            var post_to_my_app = my_app.init(state, callback)
+
+            post_to_my_app (msg)    // send message to 'my_app',
+                                    // must be decodable via 'msg_decode'

Browser Application

The function in this section allow the creation of browser applications which can interact with the surrounding javascript code. The communication is base on message passing. The javascript side can send messages into the ocaml browser application and vice versa.

The implementation of a browser application with javascript interop on the ocaml side is done by providing a function of the following type.

type ('state, 'msg) browser_function = + 'state -> + string option -> + (Value.t -> unit) -> + 'msg -> + unit

Type of the implementation function of the browser application with javascript interop.

The browser function has the form

let browser
+    (state: 'state)                 (* initial state *)
+    (element: string option)        (* optional element id *)
+    (callback: Value.t -> unit)     (* send messages to javascript *)
+    : 'msg -> unit
+    =
+    ... (* initialisation code *)
+    ...
+    fun msg ->
+        ... (* receive a message from the javascript side *)
+        ...
val browser_application : + string -> + 'state Decode.t -> + 'msg Decode.t -> + ('state, 'msg) browser_function -> + unit

browser_application state_decode msg_decode browser_function

An ocaml program my_app.ml with an ocaml statement of the form

let _ =
+    browser_application
+        "my_app"            (* Unique name in the browser *)
+        state_decode
+        msg_decode
+        browser_function

can be compiled to a javascript file my_app.js. This file my_app.js can be included within a html page in a script tag

            <script type="text/javascript" src="my_app.js"></script>

In the html file we need some javascript code to interact with the browser application.

 <script>
+            var state = ...         // javascript value which can be decoded
+                                    // by 'state_decode'
+
+            var postMessage         // variable representing a function to
+                                    // post messages to 'my_app'
+
+            var callback (msg) {
+                ...                 // actions on receiving messages from
+                ...                 // 'my_app'
+                ...
+                postMessage (...)   // send a message to 'my_app'
+            }
+            </script>

At the end of the body the application my_app can be started by

            <script>
+                postMessage = my_app.init (state, 'element_id', callback)
+            </script>

Warning: The ocaml browser application shall not be initialized before the body and in particular the element is available. Therefore it is best to initialize the application at the end of the html body.

It is convenient to initialize the browser application with an element id below which the browser application should install itself in the dom tree. This can be used to avoid conflicting dom accesses between the javascript side and the ocaml browser application.

Global Environment

If your application written in ocaml wants to communicate with javascript code, then the following functions might be interesting.

With the function make_global it is possible to make a javascript value generated via ocaml available to the surrounding javascript code. In many cases you will make a function globally available to the javascript code. This function can receive initialization data and callback functions. With the callback functions you can post messages to the surrounding javascript code. Furthermore the globally accessible function might return a function which can be used by the surrounding javscript code to post messages to the ocaml application.

If you write a web worker, you have to make function with the name onmessage available to the global environment. This function has type Value.t -> Value.t and it usually returns Value.undefined. Via get_global you can find out, if a function named postMessage exists (it exists in the global environment of a webworker) and then you can use this function to send messages to the creator of the web worker.

val make_global : string -> Value.t -> unit

make_global name value Make the javascript value value accessible from javascript code via the global name name.

Caution:

If the global name name already exists, it will be overwritten. This has fatal consequences if you overwrite e.g. setTimeout or document or other other used global variables or global functions.

It is recommended to use some prefix like my_app_... in name in order to not pollute the global namespace.

val get_global : string -> Value.t option

get_global name Check, if name exists in the global enviroment and if yes, return the corresponding javascript value. Use Decode to check, if the global is a function, an object, a number etc.

val new_global : string -> Value.t array -> Value.t

new_global constructor args

Construct a new javascript object using the constructor constructor feeding it with the arguments args.

Precondition: The constructor must exist and it has to accept the arguments. If not, an exception is thrown.

val export : (string * Value.t) array -> unit

export [| name1, val1; name2, val2; ... |]

Export the javascript object consisting of the fields name1, name2, ... to the surrounding javascript code.

This function is used if you want to write a module to be used in a node application. In the javascript code you write

var my_app = require('./my_app.js')

and then the javascript variable my_app is an object containing all the exported fields.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Base/Value/index.html b/odoc/fmlib_js/Fmlib_js/Base/Value/index.html new file mode 100644 index 00000000..f7304868 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Base/Value/index.html @@ -0,0 +1,2 @@ + +Value (fmlib_js.Fmlib_js.Base.Value)

Module Base.Value

Generate javascript values from ocaml values.

type t

Type of a javascript value.

val null : t

The javascript value null.

val undefined : t

The javascript value undefined.

val int : int -> t

int i The integer i as a javascript value.

This function is the identity function, because int is represented in javascript as a number which is a 64 bit floating point value.

As long as we stay within ocaml code, 32 bit signed integer arithmetics is done.

val float : float -> t

float v The floating point value v as a javascript value.

This function is the identity function, because float is represented in javascript as a number which is a 64 bit floating point value.

val bool : bool -> t

bool b Convert the ocaml boolean value b into a javascript boolean value.

val string : string -> t

string s Convert the ocaml string s into a javascript string.

In ocaml a string is a sequence of bytes and in javascript a string is a sequence of utf16 code points.

val _object : (string * t) array -> t

_object [|name1, value1; name2, value2; ...|]

Make the javascript object {name1: value1, name2: value2, ...}.

val array : t array -> t

array arr Convert the ocaml array arr of javascript objects into the corresponding javascript array.

val function1 : (t -> t) -> t

function1 f Convert the ocaml function f of type t -> t into the corresponding javascript function.

No actual conversion is necessary, because ocaml functions are compiled to javascript functions.

However javascript cannot do currying i.e. partial application. In javascript the corresponding function can be called with zero or more arguments.

If there are arguments missing, then the function will be called with sufficient arguments filled up by undefined.

If more arguments are supplied, then the superfluous arguments are ignored.

val function2 : (t -> t -> t) -> t

function2 f See function1, just that here f is a two argument function.

val function3 : (t -> t -> t -> t) -> t

function3 f See function1, just that here f is a three argument function.

val stringify : t -> t option

stringify v convert the javascript value v to a json string. This possible only if the javascript value is one of:

  • null
  • boolean
  • number
  • string
  • object
  • array
val parse : t -> t option

parse v parse the javascript value (which must be a string) as a json value and converts it into the corresponding javascript object.

Precondition: v is a javascript string and a valid json string.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Base/index.html b/odoc/fmlib_js/Fmlib_js/Base/index.html new file mode 100644 index 00000000..7b6ae30f --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Base/index.html @@ -0,0 +1,2 @@ + +Base (fmlib_js.Fmlib_js.Base)

Module Fmlib_js.Base

Basic functions for the interaction between ocaml and javascript.

module Value : sig ... end

Generate javascript values from ocaml values.

module Decode : sig ... end

Decode javascript values into ocaml values.

Some global functions.

module Main : sig ... end
\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Date/index.html b/odoc/fmlib_js/Fmlib_js/Date/index.html new file mode 100644 index 00000000..6bfc3119 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Date/index.html @@ -0,0 +1,6 @@ + +Date (fmlib_js.Fmlib_js.Date)

Module Fmlib_js.Date

The javascript date object

The javascript date object is the number of milliseconds passed from 1.1.1970 UTC. The date object has no time zone. Its value of milliseconds is always since 1.1.1970 UTC.

All access functions (except for value) like day, hours, ... etc. return the values valid in the timezone of your system. I.e. hours + (of_value 0.) does not return 0 but the hour in the timezone of your system at 1.1.1970 UTC.

If you have a date object d and want the day, hour, ... in another timezone which has offset0 to UTC you can do the following:

let d0 =
+    add
+        ((Float.of_int (zone_offset d - offset0)) *. 60000)
+        d

Then day d0, hours d0, ... are the values in the desired timezone.

type t
val now : unit -> t

Construct a new date object at the current time.

val value : t -> float

The number of milliseconds passed since 1.1.1970 UTC.

val of_value : float -> t

of_value millis Construct a new date object pointing to 1.1.1970 UTC + ms milliseconds.

val zone_offset : t -> int

Timezone offset in minutes from UTC. Westward positive, eastward negative.

val add : float -> t -> t

add ms date Add ms milliseconds to the current time and return the new date object.

val make : int -> int -> int -> int -> int -> int -> int -> t

make year month day hour minute second millis Make a date object for the current time zone.

val day : t -> int

The day of the week.

sunday .. saturday ~> 0 .. 6

val date : t -> int

The date in the month starting with 1.

val month : t -> int

The month (1-12)

val year : t -> int

The year.

val hours : t -> int

The hour (0-23).

val minutes : t -> int

The minute (0-59).

val seconds : t -> int

The second (0-59).

val milliseconds : t -> int

The millisecond (0-999).

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Document/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Document/index.html new file mode 100644 index 00000000..7cd45f22 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Document/index.html @@ -0,0 +1,2 @@ + +Document (fmlib_js.Fmlib_js.Dom.Document)

Module Dom.Document

type t

Document type.

val title : t -> string

The title of the document.

val set_title : string -> t -> unit

set_title str doc Set the title of the document.

val body : t -> Element.t

The body of the document.

Precondition: The document must have been loaded!

Never call this function before the page has been loaded.

val find : string -> t -> Element.t option

find id doc Find the element with the id attribute id in the document doc. Uses the javascript method getElementById.

val create_element : string -> t -> Element.t

create_element tag doc Create a new element with tag.

val create_text_node : string -> t -> Node.t

create_text_node text doc Create a new text node with content text.

val create_element_ns : string -> string -> t -> Element.t

create_element_ns namespace name doc

Like create_element, but creates the element within a namespace, e.g. "http://www.w3.org/2000/svg".

val create_document_fragment : t -> Node.t

Create a new document fragment.

A document fragment is a special node with no parent. Adding children to the fragment does not affect the dom i.e. does not cause reflow and repaint, because the fragment is not part of the active dom.

If you call

node.append(fragment)

all the children the fragment are appended to node instead of the fragment, leaving an empty fragment behind.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Element/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Element/index.html new file mode 100644 index 00000000..32ad39d6 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Element/index.html @@ -0,0 +1,7 @@ + +Element (fmlib_js.Fmlib_js.Dom.Element)

Module Dom.Element

Element node.

type t

Type of an element node.

val node : t -> Node.t

Element viewed as a node. All elements are nodes, therefore no conversion is necessary.

val scroll_width : t -> int

Width of the element, including content not visible due to overflow.

It includes padding, but not the border and margins.

val scroll_height : t -> int

Height of the element, including content not visible due to overflow. It includes padding, but not margin and border.

val client_width : t -> int

Width of the visible part of the element with padding, without border and margins.

val client_height : t -> int

Height of the visible part of the element. It includes padding, but not margins, border and scrollbars.

val scroll_left : t -> int

Number of pixels the element's content is scrolled from its left edge.

val scroll_top : t -> int

Number of pixels the element's content is scrolled vertically.

val set_scroll_left : int -> t -> unit

set_scroll_left pxs element Set the left scroll position to pxs.

val set_scroll_top : int -> t -> unit

set_scroll_top pxs element Set the top scroll position to pxs.

val style : t -> Style.t

Style attribute of the element.

val set_attribute : string -> string -> t -> unit

set_attribute name value element Set the attribute name to value on element.

Examples:

set_attribute "id"    "my-node"  element
+set_attribute "class" "my-class" element
+set_attribute "href"  "https://github.com" element
+set_attribute "type"  "range"    element
+set_attribute "type"  "password" element
+set_attribute "placeholder" "sample-text" element
val remove_attribute : string -> t -> unit

remove_attribute name element Remove the attribute name from element.

val set_property : string -> Base.Value.t -> t -> unit

set_property name value element Set the property name to value in element.

The distinction between attributes and properties is subtle. Attribute have always a string value and implicitely set the corresponding property as well. A property can have any javascript value and does not set the corresponding attribute, even if the property has a string value.

Examples:

set_property "value" "my-text" input_element
val delete_property : string -> t -> unit

delete_property name element Delete the property name from element.

val focus : t -> unit

Put the element into keyboard focus.

val blur : t -> unit

Unfocus the element.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/History/index.html b/odoc/fmlib_js/Fmlib_js/Dom/History/index.html new file mode 100644 index 00000000..299b8ca7 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/History/index.html @@ -0,0 +1,2 @@ + +History (fmlib_js.Fmlib_js.Dom.History)

Module Dom.History

Module representing the browser history.

type t
val go : int -> t -> unit
val push_state : Base.Value.t -> string -> string -> t -> unit

push_state state title url Push a new url onto the history stack without loading the page.

The title is ignored by many browsers.

The url can be relative or absolute. If its relative, it is resolved relative to the current url.

Precondition: url must be of the same origin as the current url.

The state is included in the corresponding popstate event as state property. The popstate event fires if the user navigates to the corresponding url.

Note: Neither push_state nor replace_state do trigger a popstate event. A popstate event is triggered only by navigation (back, forward button). At the popstate event the new location has already been set.

val replace_state : Base.Value.t -> string -> string -> t -> unit

Like push_state but without pushing a new state onto the history. Just replace the current entry in the history stack.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Location/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Location/index.html new file mode 100644 index 00000000..5c88518a --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Location/index.html @@ -0,0 +1,5 @@ + +Location (fmlib_js.Fmlib_js.Dom.Location)

Module Dom.Location

Module representing location.

General structure of an url or uri:

        https://example.com:8042/over/there?name=ferret#nose
+        \___/   \______________/\_________/ \_________/ \__/
+          |            |            |            |        |
+        scheme     authority       path        query   fragment
type t
val href : t -> string

The full url string of the location.

val protocol : t -> string

The protocol i.e. either http or https.

val host : t -> string

The host name i.e. the part of the authority before the port.

val port : t -> string

Port number as a string. If there is no explicit port, then the empty string is returned.

val pathname : t -> string

An initial '/' followed by the path of the url of the location (or an empty string if there is no path).

The query string.

val hash : t -> string

The fragment part of the url.

val assign : string -> t -> unit

assign url window Load the url.

val reload : t -> unit

Reload the current page.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Node/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Node/index.html new file mode 100644 index 00000000..5c9987cf --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Node/index.html @@ -0,0 +1,9 @@ + +Node (fmlib_js.Fmlib_js.Dom.Node)

Module Dom.Node

A node in the dom tree.

type t
val event_target : t -> Event_target.t

The node viewed as an event target.

val parent : t -> t option

The optional parent of the node.

val first : t -> t option

The optional first child of a node.

val next : t -> t option

The optional next sibling of a node.

val append : t -> t -> unit

apppend child parent Append child to the end of the children of parent

If child is already a child of another node, it is removed from the other node. A node can be a child of only one parent node.

val remove : t -> t -> unit

remove child parent Remove child from parent

Precondition: child must be a child of parent.

If you are not sure that child belongs to parent, get parent child and check (by physical equality ==) that the computed parent and parent are the same.

Procedure to remove all children from a node:

let rec remove_children (node: t): unit =
+    match first node with
+    | None ->
+        ()
+    | Some child ->
+        remove child node;
+        remove_children node    (* tail recursion, compiled to a
+                                   javascript loop. *)
val replace : t -> t -> t -> unit

replace new_child old_child parent

Put new_child at the position of old_child within parent which is the parent of old_child.

Precondition: old_child must be a child of parent.

val remove_children : t -> unit

remove_children parent Remove all children from parent.

val node_value : t -> string

The value of the node. The text for text nodes.

val set_node_value : string -> t -> unit

Set the node value.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Style/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Style/index.html new file mode 100644 index 00000000..d5a641ee --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Style/index.html @@ -0,0 +1,3 @@ + +Style (fmlib_js.Fmlib_js.Dom.Style)

Module Dom.Style

Inline style of a document element.

type t
val set : string -> string -> t -> unit

set name value style Set the property name to value in style.

Examples:

set "background-color" "red"      style
+set "border"           "10px red" style
val remove : string -> t -> unit

remove name style Remove the property name from style.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/Window/index.html b/odoc/fmlib_js/Fmlib_js/Dom/Window/index.html new file mode 100644 index 00000000..2d5bab0f --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/Window/index.html @@ -0,0 +1,2 @@ + +Window (fmlib_js.Fmlib_js.Dom.Window)

Module Dom.Window

Module representing a browser window.

Use this module only in code executing within a browswer window. Don't use it in node and not in a web worker either.

The window object is an event target for the following events and many more which can propagate from inner elements.

  • load
  • resize
  • popstate
type t
val get : unit -> t

Get the window object.

val event_target : t -> Event_target.t

The window as an event target.

val document : t -> Document.t

The document of the window.

val history : t -> History.t

Browser history.

val location : t -> Location.t

Location object.

val on_next_animation : (float -> unit) -> t -> unit

on_next_animation callback window

The callback is called on the next animation frame. Usually a browser has 60 frames per second.

The argument received by the callback is the time in milliseconds since the current document has been loaded.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Dom/index.html b/odoc/fmlib_js/Fmlib_js/Dom/index.html new file mode 100644 index 00000000..74bff5ac --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Dom/index.html @@ -0,0 +1,10 @@ + +Dom (fmlib_js.Fmlib_js.Dom)

Module Fmlib_js.Dom

The content of a browser window.

    Hierarchy:
+
+        Document                        Text node
+
+        Element                         Character data
+
+                        Node
+
+                        Event Target

I.e. a document is an element which is a node which is an event target. A text node is an event target as well.

Each document has a body element which is the root of the visible document.

Nodes can form a tree. I.e. each node has an optional parent, an optional first child and an optional sibling. There are methods to add and remove children from a node.

Note: Use the code only within a browser window. Never in node and never in a worker thread.

module Node : sig ... end

A node in the dom tree.

module Style : sig ... end

Inline style of a document element.

module Element : sig ... end

Element node.

module Document : sig ... end
module Location : sig ... end

Module representing location.

module History : sig ... end

Module representing the browser history.

module Window : sig ... end

Module representing a browser window.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Event/index.html b/odoc/fmlib_js/Fmlib_js/Event/index.html new file mode 100644 index 00000000..d4f596f9 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Event/index.html @@ -0,0 +1,4 @@ + +Event (fmlib_js.Fmlib_js.Event)

Module Fmlib_js.Event

Browser events.

type t

Type type of an event.

val value : t -> Base.Value.t

The event viewed as a javascript value.

val stop_propagation : t -> unit

Stop the event from bubbling up the dom tree.

val prevent_default : t -> unit

Don't do the browser's default action associated with the event.

E.g. the default action for a mouse click on an anchor <a href=".."> + ... </a> is to load the page given in href. The call prevent_default + event inhibits this default behaviour.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Event_target/index.html b/odoc/fmlib_js/Fmlib_js/Event_target/index.html new file mode 100644 index 00000000..5a14c952 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Event_target/index.html @@ -0,0 +1,2 @@ + +Event_target (fmlib_js.Fmlib_js.Event_target)

Module Fmlib_js.Event_target

Event_targets in the browser

type t

Type of an event target.

val add : string -> (Event.t -> unit) -> t -> unit

add type handler target

Add for the event type type the listener handler to the event target tgt (javascript method addEventListener).

val remove : string -> (Event.t -> unit) -> t -> unit

remove type handler target

Remove for the event type type the listener handler off the event target tgt (javascript method removeEventListener).

Note: The same handler might be added for several event types. The function remove only removes the handler for the specific event type.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Http_request/index.html b/odoc/fmlib_js/Fmlib_js/Http_request/index.html new file mode 100644 index 00000000..720b63cd --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Http_request/index.html @@ -0,0 +1,11 @@ + +Http_request (fmlib_js.Fmlib_js.Http_request)

Module Fmlib_js.Http_request

Http requests made in the browser.

This module uses the javascript object XMLHttpRequest to make http requests.

type t

Type of a http request object

All properties of an http request object see.

val event_target : t -> Event_target.t

View the request as an event target.

It is recommended to add a listener for the loadend event which is fired after completion (successful or unsuccessful) of the request.

The lister shall check the status property (200: Ok, 404: not found, ...). In case of success, the property responseText is a nullable string which contains the response.

Status codes see.

The following decoder can be used to decode the status and the response text of a terminated request:

Base.Decode.(
+    field "target"
+        (let* status   = field "status" int in
+         let* response = field "responseText" (option string) in
+         return (status, response))
+)
val make : string -> string -> (string * string) list -> string -> t

make method url headers body

val ready_state : t -> int

Ready state of the request

0: request not initialized
+1: open has been called
+2: send has been called
+3: loading
+4: complete
val status : t -> int

The status of the completed http request

E.g.: 200: Ok, 403: forbidden, 404: not found, ...

val response_text_value : t -> Base.Value.t

The response text of the completed http request as a javascript value.

val response_text_string : t -> string

The response text of the completed http request as a string.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Timer/index.html b/odoc/fmlib_js/Fmlib_js/Timer/index.html new file mode 100644 index 00000000..0375fcd3 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Timer/index.html @@ -0,0 +1,2 @@ + +Timer (fmlib_js.Fmlib_js.Timer)

Module Fmlib_js.Timer

One shot timers and interval timers

type timer

Type of a one shot timer.

type interval

Type of an interval timer.

val set : (unit -> unit) -> int -> timer

set callback millis Start a one shot timer which runs millis milliseconds and after that executes callback ().

The function returns a timer object which can be used to stop the timer.

val clear : timer -> unit

clear timer Stop the timer timer. The call has no effect if timer has already fired.

val set_interval : (unit -> unit) -> int -> interval

set_interval callback millis Start a timer which executes callback () every millis milliseconds.

The function returns an interval object which can be used to stop the timer.

val clear_interval : interval -> unit

clear_interval timer Stop the interval timer timer.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Web_worker/Simulate/index.html b/odoc/fmlib_js/Fmlib_js/Web_worker/Simulate/index.html new file mode 100644 index 00000000..6be38ea0 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Web_worker/Simulate/index.html @@ -0,0 +1,7 @@ + +Simulate (fmlib_js.Fmlib_js.Web_worker.Simulate)

Module Web_worker.Simulate

Simulate the behaviour of a webworker in the main thread.

type t

Type of the simulator of the webworker.

val start : + 'rcv Base.Decode.t -> + ('rcv -> unit) -> + 'msg Base.Decode.t -> + 'msg worker_function -> + t

start decode callback dec wfun Create and start a simulator of the webworker whose behaviour is described by the pair (dec, wfun).

val post_message : Base.Value.t -> t -> unit

post_message msg w Send the message msg to the webworker simulator w.

val terminate : t -> unit

terminate w Terminate the webworker simulator w.

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/Web_worker/index.html b/odoc/fmlib_js/Fmlib_js/Web_worker/index.html new file mode 100644 index 00000000..587d3135 --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/Web_worker/index.html @@ -0,0 +1,52 @@ + +Web_worker (fmlib_js.Fmlib_js.Web_worker)

Module Fmlib_js.Web_worker

Create webworker in the main thread and in the worker thread.

Overview

Basics

An application using webworker has two parts:

  • A creator which creates the webworker
  • An implementation of a webworker

The creator and the worker can communicate only by sending messages. Usually in javascript a webworker is created by

        function callback (msg) {
+            // actions on receiving messages from the worker
+        }
+        var worker = new Worker('url_to_worker.js')
+        worker.onmessage = callback
+
+        worker.postMessage (...)    // send a message to the worker

Then there is a javascript implementation of the worker.

        function onmessage (msg) {
+            // actions on receiving a message from the creator
+            ...
+            postMessage (...)       // send a message to the creator
+        }
+
+        ...                         // initialization code
+
+        postMessage (...)           // optional initial message to the creator
+        ...

Both parts the creator part and the implementation part can be implemented in ocaml and this module provides functions to support that.

Creator Code

The call

let worker = Web_worker.start "url" decode callback

starts a worker whose implementation can be found at "url". decode is a decoder to decode messages from the webworker and the function callback processes the decoded messages.

decode: 'msg Decode.t
+
+callback: 'msg -> unit

If the message received from the webworker cannot be decoded, the event will be logged via console.log.

The webworker has a function post to send messages to the worker. I.e. at any time you can call

Web_worker.post msg worker

where msg is an arbitrary javascript value i.e. msg: Value.t.

The command

Web_worker.terminate worker

terminates the worker.

Warning: If the html where the code of the creator resides has been loaded into the browser with an url like file://...., and the url of the command Webworker.start url decode callback is relative, then the browser cannot load the worker. The worker code must always be loaded from a server (which can be a local server).

Implementation Code

In ocaml the implementation of a web worker has two components:

  • A decoder decode to decode messages which are received as javascript values into ocaml values.
  • An implementation function of the form
let worker (post: Value.t -> unit): 'msg -> unit =
+    ... (* initialization code *)
+    ...
+    fun msg ->
+        ... (* code executed on receiving a decoded message of type
+               ['msg] *)
+        ...

Having the decoder and the worker function, the actual webworker is made by the command

make decode worker

The make function retrieves the javascript function postMessage which must be available in the implementation environment of a webworker and decodes all incoming messages from the creator. make calls worker in a curried form. First to provide it with the retrieve function postMessage and subsequently on each decoded incoming message.

If a message from the creator cannot be decoded, then the event is logged in the console.

API

Creator Code

type t

Type of a web worker in the creator which can receive messages of type 'msg from the actual worker.

val start : string -> 'msg Base.Decode.t -> ('msg -> unit) -> t

start url decode callback

Create a webworker loaded from url and register the callback callback to receive messages from the webworker. Use the decoder decode to decode messages received from the webworker.

val post_message : Base.Value.t -> t -> unit

post msg w Post the message msg to the worker w.

val terminate : t -> unit

terminate worker Terminate the webworker worker.

Implementation Code

type 'msg worker_function = (Base.Value.t -> unit) -> 'msg -> unit

Type of a worker function.

A worker function f of that type is called in a curried form. In the first call, it receives a function to post messages to its creator.

let g = f post

In subsequent calls, it receives messages from its creator

g msg
val make : 'msg Base.Decode.t -> 'msg worker_function -> unit

make decode f

Make the actual webworker. decode is a decoder for incoming messages. f is the main function of the worker. f is called in a curried form. The first call is

let g = f post

where post is the function to send messages back to the creator of the worker.

Then each time a message is received from the creator of the webworker, the message is decoded by decode. In case of success with the ocaml object msg the function call g msg is made.

The function make might raise 2 possible exceptions:

  • It cannot find a global object postMessage i.e. it does not run in a webworker environment.
  • It finds a global object postMessage but the object is not a function. This indicates as well that it is not executed in a webworker environment.

If during the execution of the worker messages arrive which cannot be decoded successfully by decode, then this event is logged.

Simulation

Sometimes it is useful to simulated the behaviour of a webworker in the main thread. As opposed to a real webworker, a simulator runs in the main thread and therefore can block the event loop for a certain amount of time.

Recall that a real webworker is started in the main thread by

let worker = Web_worker.start "url" decode callback

where decode is a decoder for messages received from the worker and callback is a function which is called on each received message from the worker.

The behaviour of a worker is completely described by the pair (dec,wfun) where dec is a decoder for messages received from the creator and wfun is a workerfunction.

The simulator is started from the main thread by

let worker = Web_worker.Simulate.start decode callback dec fun

and there are the functions

Web_worker.Simulate.post_message msg worker
+
+Web_worker.Simulate.terminate worker

to send messages to the worker and to terminate the worker.

module Simulate : sig ... end

Simulate the behaviour of a webworker in the main thread.

It is also possible to simulate the behaviour of a web worker written in ocaml within javascript code. Let's assume that the webworker is defined by the pair (decode, wfun). Then we write an ocaml file with the content

let decode = ...
+
+let wfun = ...
+
+let _ =
+    Web_worker.Simulate.simulate_js "Simulated_worker" decode wfun

and compile it to worker.js. Then instead of writing a html file

    <html>
+        <body>
+            ...
+            <script>
+                var worker = new Worker("worker.js")
+                worker.onmessage = (msg) => {...}
+                worker.postMessage (msg)
+            </script>
+        </body>
+    </html>

we write the html file

    <html>
+        <head>
+            <script type="text/javascript" src="worker.js"></script>
+        </head>
+        <body>
+            ...
+            <script>
+                var worker = Simulated_worker ((msg) => ... )
+                worker.postMessage (msg)
+            </script>
+        </body>
+    </html>
val simulate_js : string -> 'msg Base.Decode.t -> 'msg worker_function -> unit

simulate_js name decode wfun

Create a simulation of a webworker given by (decode, wfun) and make it accessible from the javascript code under the name name.

In javascript you write var worker = name (callback) to start the worker and worker.postMessage(msg) to send a message to the worker. Furthermore it is possible to terminate the worker by worker.terminate().

\ No newline at end of file diff --git a/odoc/fmlib_js/Fmlib_js/index.html b/odoc/fmlib_js/Fmlib_js/index.html new file mode 100644 index 00000000..6e732e6a --- /dev/null +++ b/odoc/fmlib_js/Fmlib_js/index.html @@ -0,0 +1,2 @@ + +Fmlib_js (fmlib_js.Fmlib_js)

Module Fmlib_js

Javascript wrappers.

Common Modules

Usable in a browser window, a worker thread in the browser and node.

module Base : sig ... end

Basic functions for the interaction between ocaml and javascript.

module Timer : sig ... end

One shot timers and interval timers

module Date : sig ... end

The javascript date object

Common Browser Modules

Usable in a browser window or in a worker thread in the browser.

module Event : sig ... end

Browser events.

module Event_target : sig ... end

Event_targets in the browser

module Http_request : sig ... end

Http requests made in the browser.

module Web_worker : sig ... end

Create webworker in the main thread and in the worker thread.

Browser Window Modules

module Dom : sig ... end

The content of a browser window.

\ No newline at end of file diff --git a/odoc/fmlib_js/index.html b/odoc/fmlib_js/index.html new file mode 100644 index 00000000..af91ad46 --- /dev/null +++ b/odoc/fmlib_js/index.html @@ -0,0 +1,108 @@ + +index (fmlib_js.index)

Javascript Wrapper Library

Fmlib_js is a library to generate javascript code from ocaml code. The library uses js_of_ocaml to do the actual javascript generation.

API

Entry point: Fmlib_js

Basics

Fmlib_js is

  • Thin: It just wraps javascript functions. So you only pay what you ask for.
  • Typesafe: If it compiles there are no type errors at runtime. The library handles all unsafe operations which are possible in js_of_ocaml in a type safe manner.
  • Minimalistic: It provides the most important primitives only.
  • not object oriented: It avoids wrapping javascript objects in ocaml objects.

The types in Fmlib_js are opaque i.e. you have Document.t, Node.t and Value.t to represent a browser window document, a node in the dom tree and a javascript value and in the module only functions to access the objects. Therefore the ocaml compiler can give you precise error messages.

This design decision is based on the fact that classes and objects (i.e. the object oriented features of ocaml) are rarely used and many ocaml programmers (like the author of Fmlib_js) are not very familiar with the object oriented part of ocaml. Many ocaml programmers write and use modules and functions within the modules. Therefore Fmlib_js uses only this part of the ocaml language.

The library is minimalistic and it is assumed that the programmer writes his own convenience functions to combine the primitives in a way appropriate for his application.

For data exchange between ocaml and javascript we have the module Fmlib_js.Base.Value to generate arbitrary javascript values and Fmlib_js.Base.Decode to decode javascript values into ocaml values. All conversions are type safe. If you successfully decode a javascript value into an ocaml value of a certain type, it is guaranteed that the ocaml value has the type.

The module Fmlib_js.Base.Main provides functionality to interface with the global environment of javascript.

With the module Fmlib_js.Dom it is possible to access the complete dom tree in a browser window.

It is assumed the programmer of an ocaml application to be compiled to javascript wants to stay mainly in the domain of ocaml and has some limited functionality to interface with javascript.

Fmlib_js is not purely functional in the sense that it avoids mutation. Since it is just a thin wrapper around javascript functions and javascript functions have mutability, the thin wrapper has mutability as well.

It is the goal to provide additional functionality based on Fmlib_js which allows to write purely declarative web and node applications. Fmlib_js provide the basic functionality to interface with javascript.

Currently only browser functionality is sufficiently covered. Future releases of Fmlib_js will cover node functionality as well like file system access, starting of child processes, building web servers etc.

How to use Fmlib_js

Install the library via opam by

opam install fmlib_js

Let's assume you have a file `my_app.ml` using the library Fmlib_js. A typical dune file looks like

(executable
+    (name my_app)
+    (modes js)
+    (libraries fmlib_js)
+)

Having that, the command

dune build ./my_app.bc.js

issued from the directory of my_app.ml compiles your application into the build directory of your dune project (usually _build/default/path/to/my_app/my_app.bc.js).

If you want all unused functions removed from the generated javascript file, you can issue the command

dune build --profile release ./my_app.bc.js

Compiling with the release profile reduces the size of the generated javascript file dramatically.

In many cases it is convenient to have the compiled javascript file in the source directory of my_app.ml with the name my_app.js. This can be achieved by adding the following rule to the dune file

(rule
+    (targets my_app.js)
+    (deps    my_app.bc.js)
+    (mode (promote (until-clean)))
+    (action (copy %{deps} %{targets}))
+)

If the application is a browser application you can write a simple html file my_app.html with the content

<html>
+    <head>
+        <script type="text/javascript" src="my_app.js"></script>
+    </head>
+    <body>
+        <script>
+            ... optional start command ...
+        </script>
+    </body>
+</html>

and load the html file into the browser.

An optional start command is necessary, if the application has been designed to be started by a start command. If the application starts itself automatically by registering an event listener on the load event of the browser window, then there is no need for a start command.

In many cases an explicit start command is convenient to send to the application some initialization data.

A Single Page Web Application

In order to demonstrate the basic functionality of the library we write a very rudimentary single page application. A single page application has the feature that it has access to the browser history and pushing the forward or the backward button does not issue a page load. The application just displays different pages depending on the local part of the url.

Our example single page application should have the layout

Page 1          (* Headline for the selected page *)
+
+goto page 1     (* Button to change the page on click *)
+goto page 2
+goto page 3

By clicking on one of the buttons, the application shall change the headline to indicate the new page and pushing a new entry to the browser history such that each visited page has an own entry in the browser history.

Furthermore the application shall be notified when the user navigates forward or backward and display the corresponding page without triggering a reload of the application.

As a first step in the file my_app.ml we open the library and specifically the dom access modules.

open Fmlib_js
+open Dom

We need a headline and a clickable element for each choice. Therefore we write a function which let us create an element containing a text node.

let text_element (tag: string) (text: string) (document: Document.t)
+    : Element.t
+    =
+    let el   = Document.create_element   tag  document in
+    let txt  = Document.create_text_node text document in
+    Node.append txt (Element.node el);
+        (* append 'txt' node to the children of 'el' *)
+    el

Html elements are nodes. But in the library an element has type Element.t and a dom node has type Node.t. The function Element.node views an element as a node. See Fmlib_js.Dom.Element and Fmlib_js.Dom.Node for details.

In order to change the page in our simple application we just have to replace the headline by a new headline. The whole page is a div which contains the header and a navigation element. The Node module has functions to retrieve the first child and to replace a node by another node.

let change (h: Element.t) (page: Element.t): unit =
+    let open Element in
+    let page = Element.node page
+    and h    = Element.node h
+    in
+    match Node.first page with
+    | None ->
+        assert false (* Illegal call *)
+    | Some old_header ->
+        Node.replace h old_header page

We design our page element in a way that it always has a first child. Therefore we can ignore the illegal case that there is no first child.

Next comes the main function which generates the whole application. First we make some important data accessible.

let make _: unit =
+    let window  = Window.get ()
+    in
+    let doc      = Window.document window
+    and history  = Window.history  window
+    and location = Window.location window
+    in
+    let open Document in
+    let open Element in
+    ...

Then we create the elements of the page.

let page = create_element "div" doc in
+let nav  = create_element "nav" doc in
+let el1  = text_element "div" "go to page1" doc
+and el2  = text_element "div" "go to page2" doc
+and el3  = text_element "div" "go to page3" doc
+and h1   = text_element "h1"  "Page1" doc
+and h2   = text_element "h1"  "Page2" doc
+and h3   = text_element "h1"  "Page3" doc
+in

We use the fragment #page2 in the url to indicate that we are on page 2. The initial hash is

let hash = Location.hash location in

Based on the hash we can find the correct header to display

let find_header (hash: string): Element.t =
+    match hash with
+    | "#page1" -> h1
+    | "#page2" -> h2
+    | "#page3" -> h3
+    | _ -> h1
+in

The default case is page 1.

Every go to page needs a click handler to start a page change. We write a generic function to add a click handler.

let add_click (hash: string) (h: Element.t) (el: Element.t): unit =
+    Event_target.add
+        "click"
+        (fun _ ->
+             change h page;
+             History.push_state Base.Value.null "" hash history
+        )
+        (Node.event_target (node el))
+in

The click handler changes the header of the page to a new header h and pushes the new relative url hash to the browser history. The click handler is added to the element el.

Now we can wire the nodes and install the click handlers by

Node.append (node el1) (node nav);
+Node.append (node el2) (node nav);
+Node.append (node el3) (node nav);
+Node.append (node (find_header hash))  (node page);
+Node.append (node nav)  (node page);
+Node.append (node page) (node (Document.body doc));
+add_click "#page1" h1 el1;
+add_click "#page2" h2 el2;
+add_click "#page3" h3 el3;

In order to be able to react to clicks on the forward and backward button of the browser we need an event handler for the event type popstate of the browser window which does the corresponding page change.

Event_target.add
+    "popstate"
+    (fun _ ->
+        change
+            (Location.hash location |> find_header)
+            page
+    )
+    (Window.event_target window)

This completes the main function make.

The function make must not be executed before the html of the application is loaded into the browser. Reason: Before the loading the body of the document is not available and therefore the main function which accesses the body will crash.

There are three methods to call make after the page load.

The first method is to install an event listener for the load event on the browser window.

let _ =
+    Event_target.add
+        "load"
+        make
+        Window.(event_target (get ()))

The second method is to make a start command available to the surrounding javascript by

let _ =
+    let open Base in
+    Main.make_global
+        "start_application"
+        Value.(function1 (fun _ -> make (); undefined))

and start the application in the html file

<html>
+    <head>
+        <script type="text/javascript" src="my_app.js"></script>
+    </head>
+    <body>
+        <script>
+            start_application ()
+        </script>
+    </body>
+</html>

The third and simplest method is to call make directly within the application

let _ = make ()

and include the application code at the end of the body

<html>
+    <body>
+        <script type="text/javascript" src="my_app.js"></script>
+    </body>
+</html>

Summary: With a few lines of code we have created a single page application.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/Make/Parser/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/Make/Parser/index.html new file mode 100644 index 00000000..1c7aac8e --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/Make/Parser/index.html @@ -0,0 +1,2 @@ + +Parser (fmlib_parse.Fmlib_parse.Character.Make.Parser)

Module Make.Parser

A parser is a consumer of tokens. At the end of consumption there is a result which is either a successfully parsed structure or a syntax or semantic error.

A parser p is a sink of token. As long as it signals needs_more p more token can be pushed into the parser via put token p or the input stream can be ended via put_end p.

has_result p is equivalent to not (needs_more p). has_result p signals that the parser has either succeeded or failed.

If it has succeeded the final value is available via final p.

There are two types of failure:

  • Syntax error: In that case failed_expectations p returns the list of failed expectations.
  • Semantic error: In that case failed_semantic p returns the encountered semantic error.

The function state returns the user state.

The function lookaheads returns a pair. The first part of the pair is an array of unprocessed lookahead token and the second part is a flag indicating if the endtoken has been received via put_end.

type token = char

Token type.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

type state = State.t

User state.

type final = Final.t

Type of the final object constructed in case of success.

type expect = string * Indent.expectation option

Type of a failed expectation.

type semantic = Semantic.t

Type a semantic error.

type t

Type of the final parser.

val needs_more : t -> bool

needs_more p Does the parser p need more token?

val has_result : t -> bool

has_result p Has the parser p ended parsing and either succeeded or failed?

has_result p is the same as not (needs_more p)

val has_ended : t -> bool
  • deprecated

    Use has_result.

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val put : token -> t -> t

put token p Push token into the parser p.

Even if the parser has ended, more token can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val has_failed_semantic : t -> bool

has_failed_semantic p Has the parser p failed with a semantic error?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

val failed_semantic : t -> semantic

failed_semantic p The failed semantic error.

Precondition: has_failed_semantic p

val state : t -> state

state p The user state of the parser p.

Can be called at any time.

val has_lookahead : t -> bool

has_lookahead p Are there any unconsumed lookahead tokens in the buffer or has the end token not yet been consumed?

val first_lookahead_token : t -> token option

The first lookahead token.

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

val lookaheads : t -> token array * bool

lookaheads p The lookahead token and and end flag of the parser p.

The end flag indicates that the end token has already been received via put_end p.

val position : t -> Position.t

position p The current position in the input stream.

Can be called at any time.

val line : t -> int

line p The current line in the input stream.

Can be called at any time.

val column : t -> int

column p The current column in the input stream.

Can be called at any time.

val run_on_string : string -> t -> t

run_on_string str p Run the parser p on the string str.

val run_on_channel : Stdlib.in_channel -> t -> t

run_on_channel ic p Run the parser p on input channel ic.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-1-State/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-1-State/index.html new file mode 100644 index 00000000..4ff1471e --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-1-State/index.html @@ -0,0 +1,2 @@ + +State (fmlib_parse.Fmlib_parse.Character.Make.State)

Parameter Make.State

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-2-Final/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-2-Final/index.html new file mode 100644 index 00000000..4c71269d --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-2-Final/index.html @@ -0,0 +1,2 @@ + +Final (fmlib_parse.Fmlib_parse.Character.Make.Final)

Parameter Make.Final

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-3-Semantic/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-3-Semantic/index.html new file mode 100644 index 00000000..0474ce51 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/Make/argument-3-Semantic/index.html @@ -0,0 +1,2 @@ + +Semantic (fmlib_parse.Fmlib_parse.Character.Make.Semantic)

Parameter Make.Semantic

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/Make/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/Make/index.html new file mode 100644 index 00000000..f55427c6 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/Make/index.html @@ -0,0 +1,41 @@ + +Make (fmlib_parse.Fmlib_parse.Character.Make)

Module Character.Make

  • State: User state.
  • Final: Final result type of the parser.
  • Semantic: Semantic error message (triggered by fail error)

Parameters

Signature

Final Parser

module Parser : sig ... end

A parser is a consumer of tokens. At the end of consumption there is a result which is either a successfully parsed structure or a syntax or semantic error.

Generic Combinators

Basic Combinators

type _ t

'a t Type of a parse combinator returning an 'a.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

p >>= f

Parse first the input according to the combinator p. In case of success, feed the returned value of p into the function f to get the combinator to parse next.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* x = p in f x is equivalent to p >>= f

The let* combinator let us express parsing sequences conveniently. Example:

let* x = p in       (* parse [p], result [x] in case of success. *)
+let* y = q x in     (* parse [q x], result [y] ... *)
+let* z = r x y in   (* ... *)
+...
+return f x y z ...

The wildcard let* _ = ... can be used to ignore results of intermediate parsing steps.

val map : ('a -> 'b) -> 'a t -> 'b t

map f p

Try combinator p. In case of success, map the returned value x to f + x. In case of failure, do nothing.

map f p is equivalent to let* x = p in return (f x).

val map_and_update : (State.t -> 'a -> 'b * State.t) -> 'a t -> 'b t

map_and_update f p

Try combinator p. In case of success, map the returned state state and value a to f state a. In case of failure, do nothing.

val succeed : 'a -> 'a t

succeed a

Succeed immediately without consuming token. Return object a as result.

val return : 'a -> 'a t

return a is equivalent to succeed a.

val unexpected : string -> 'a t

unexpected expect triggers a syntax error signalling the expectation expect.

val clear_last_expectation : 'a -> 'a t

clear_last_expectation p Clear last failed expectation.

This is useful e.g. after stripping whitespace. Since stripping whitespace means skip_one_or_more ws or skip_zero_or_more ws, after skipping whitespace the parser can still expect more whitespace. Therefore there is a failed expectation *whitespace* on the stack. However you rarely want this expectation to be reported.

val fail : Semantic.t -> 'a t

fail error triggers a semantic error.

val (</>) : 'a t -> 'a t -> 'a t

p </> q

Try first combinator p. In case of success or failure with consumed token, p </> q is equivalent to p.

If p fails without consuming token, then p </> q is equivalent to q.

val choices : 'a t -> 'a t list -> 'a t

choices p [q r t ...] is equivalent to p </> q </> r </> t </> ....

val (<?>) : 'a t -> string -> 'a t

p <?> expect

Try combinator p. In case of success or failure with consumed token, p <?> expect is equivalent to p.

If p fails without consuming token, then the failed expectations are replaced with the failed expectation expect.

Usually p is a combinator implementing a choice between various alternatives of a grammar construct. The <?> combinator allows to replace the set of failed grammar alternatives with a higher abstraction of the failed expectation. E.g. instead of getting the failed expectations identifier, '(', -, ... we can get the failed expectation expression.

val no_expectations : 'a t -> 'a t

no_expectations p

Parse the combinator p.

  • p fails: no_expectations p fails with the same error.
  • p succeeds without consuming tokens: no_expectations p succeeds without any added expectations.
  • p succeeds and consumes some token: no_expectations p succeeds without any expectations.

Many combinators can succeed with expectations. E.g. the combinator optional p expects a p and succeeds if it does not encounter a construct described by p. All repetitive combinators like one_or_more try to consume as many items as possible. At the end they are still expecting an item.

This combinator allows to clear such unneeded expectations. It is particularly useful when removing whitespace. The expectation of whitespace is not a meaningful error message to the user.

State Combinators

val get : State.t t

Get the current user state.

val set : State.t -> unit t

Set the user state.

val update : (State.t -> State.t) -> unit t

update f Update the user state using f.

val get_and_update : (State.t -> State.t) -> State.t t

get_and_update f Get the current user state and then update the user state. The returned value is the old state.

val state_around : + (State.t -> State.t) -> + 'a t -> + (State.t -> 'a -> State.t -> State.t) -> + 'a t

state_around before p after

If s0 is the initial state, then execute p with the start state before s0 and set the update the final state s1 by after s0 a s1 where a is the returned value in case of success and s1 is the final state after executing p.

Optional Elements

val optional : 'a t -> 'a option t

optional p

Try combinator p.

  • Success: Return Some a where a is the returned value.
  • Failure without consuming token: Return None
  • Failure with consuming token: Remain in the error state.

Repetition

val zero_or_more_fold_left : 'r -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

zero_or_more_fold_left start f p

Try the combinator p as often as possible. Accumulate the results to the start value start using the folding function f.

val one_or_more_fold_left : ('a -> 'r t) -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

one_or_more_fold_left first f p

Try the combinator p at least once and then as often as possible. Put the first value returned by p into the function first returning a result and accumulate the subsequent values as often as possible and accumulate the results to the start value returned by first using the folding function f.

val zero_or_more : 'a t -> 'a list t

zero_or_more p Parse zero or more occurrences of p and return the collected result in a list.

val one_or_more : 'a t -> ('a * 'a list) t

zero_or_more p Parse one or more occurrences of p and return the collected results as a pair of the first value and a list of the remaining values.

val skip_zero_or_more : 'a t -> int t

skip_zero_or_more p Parse zero or more occurrences of p, ignore the result and return the number of occurrences.

val skip_one_or_more : 'a t -> int t

skip_one_or_more p Parse one or more occurrences of p, ignore the result and return the number of occurrences.

val one_or_more_separated : + ('item -> 'r t) -> + ('r -> 'sep -> 'item -> 'r t) -> + 'item t -> + 'sep t -> + 'r t

one_or_more_separated first next p sep

Parse one or more occurrences of p separated by sep. Use first to convert the first occurrence of p into the result and use next to accumulate the results.

Parenthesized expressions

val parenthesized : + ('lpar -> 'a -> 'rpar -> 'b t) -> + 'lpar t -> + (unit -> 'a t) -> + ('lpar -> 'rpar t) -> + 'b t

parenthesized make lpar p rpar

Parse an expression recognized by the combinator p enclosed within parentheses. lpar recognizes the left parenthesis and rpar recognizes the right parenthesis. The value returned by lpar is given to rpar. With that mechanism it is possible to recognize matching parentheses of different kinds.

After successful parsing the function make is called with the final value (and the parentheses).

The combinator p is entered as a thunk in order to be able to call it recursively. In the combinator parenthesized the combinator p is called only guardedly. Therefore the combinator p can contain nested parenthesized expressions.

Precondition: The combinator lpar has to consume at least one token in case of success.

Operator expressions

val operator_expression : + 'exp t -> + 'op t option -> + 'op t -> + ('op -> 'op -> bool t) -> + ('op -> 'exp -> 'exp t) -> + ('exp -> 'op -> 'exp -> 'exp t) -> + 'exp t
operator_expression
+    primary         (* Parse a primary expression *)
+    unary_operator  (* Parse a unary operator *)
+    binary_operator (* Parse a binary operator *)
+    is_left         (* Is the left operator binding stronger? *)
+    make_unary      (* Make a unary expression from the operator and
+                       its operand *)
+    make_binary     (* Make a binary expression from the operator
+                       and its operands *)

Parse an operator expression by using the following combinators:

  • is_left o1 o2 decides, if the operator o1 on the left has more binding power than the operator o2. I.e. if the unary operator u has more binding power than the binary operator o, then u a o b is parsed as (u a) o b. If the binary operator o1 has more binding power than the binary operator o2, then a o1 b o2 b is parsed as (a + o1 b) o2 c.
  • make_unary u a makes the unary expression (u a).
  • make_binary a o b makes the binary expression (a o b).
  • primary parses a primary expression.
  • unary_operator parses a unary operator.
  • binary_operator parses a binary operator.

Precondition: primary, unary_operator and binary_operator have to consume at least one token in case of success. Otherwise infinite recursion can happen.

Backtracking

val backtrack : 'a t -> string -> 'a t

backtrack p expect

Try the combinator p. In case of failure with consuming token, push the consumed token back to the lookahead and let it fail without consuming token. Use expect to record the failed expectation.

Backtracking reduces the performance, because the token pushed back to the lookahead have to be parsed again. Try to avoid backtracking whenever possible.

val followed_by : 'a t -> string -> 'a t

followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the followed_by parser succeeds without consuming token. Otherwise it fails without consuming tokens.

val not_followed_by : 'a t -> string -> unit t

not_followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the not_followed_by parser fails without consuming token. Otherwise it succeeds without consuming tokens.

followed_by and not_followed_by can be used to peek into the token stream without consuming token.

Location Combinator

val located : 'a t -> 'a Located.t t

located p Parse p and return its result with its start and end position.

Note: If p removes whitespace at the end, the returned end position is at the end of the whitespace. This is not what you usually want. Therefore first parse the essential part located and then remove the whitespace.

val position : Position.t t

The current position in the file.

Indentation Combinators

The indentation of a normal construct is the indentation of its leftmost token. The indentation of a vertically aligned construct is the indentation of its first token.

val indent : int -> 'a t -> 'a t

indent i p Indent p by i columns relative to its parent.

Precondition: 0 <= i

The indentation of p is defined by the indentation of its first token. The first token has to be indented at least i columns relative to the parent of p. After the first token of p has been parsed successfully, all subsequent tokens must have at least the same indentation.

Note: Indentation of p relative to its parent only makes sense, if the first token of p is not the first token of its parent! I.e. the parent of p should have consumed at least one token before the parsing of p starts.

CAUTION WITH ALIGNMENT !!

If you want to align a certain number of constructs vertically it is mandatory to indent the whole block of constructs. Do not indent the individual items to be aligned. Indent the whole block.

Reason: The parent of the block usually has already consumed some token and the indentation of a construct is the position of the leftmost token. If you don't indent the aligned block, then it will be aligned with the leftmost token of the parent construct. This is usually not intended and a common pitfall. Any indentation e.g. zero indentation is ok.

val align : 'a t -> 'a t

align p

Use the start position of the first token of p to align it with other constructs. If p does not consume any token, then align p has no effect.

Alignment makes sense if there are at least two combinators which are aligned and indented. E.g. suppose there are two combinators p and q. Then we can form

indent 1 (
+        let* a = align p in
+        let* b = align q in
+        return (a,b)
+)

This combinator parses p whose first token has to be indented at least one column relative to its parent. And then it parses q whose first token must be aligned with the first token of p.

The indentation decouples the alignment of p and q with other aligned siblings or parents. indent 0 ... can be used to make the indentation optional.

val left_align : 'a t -> 'a t

left_align p

Align a construct described by p at its leftmost possible column. If a whole block of constructs have to be vertically left aligned, then it is important that at least the first construct is left aligned. The subsequent constructs will be aligned exactly vertically. For the subsequent constructs left_align has the same effect as align.

val detach : 'a t -> 'a t

detach p Parse p without any indentation and alignment restrictions.

Detachment is needed to parse whitespace. The whitespace at the beginning of a line never satisfies any nontrivial indentation or aligment requirements.

Character Combinators

val expect_end : string -> 'a -> 'a t

expect_end error a Expect the end of token stream.

In case of success return a.

In case of failure return the syntax error with the error string error.

val charp : (char -> bool) -> string -> char t

charp p expect Parse a character which satisfies the predicate p.

In case of failure, report the failed expectation expect.

val range : char -> char -> char t

range c1 c2 Parses a charager in the range between c1 and c2, i.e. a character c which satisfies c1 <= c && c <= c2.

val char : char -> char t

char c Parse the character c.

val one_of_chars : string -> string -> char t

one_of_chars str expect

Parse one of the characters in the string str. In case of failure, report the failed expectation expect.

val string : string -> string t

string str Parse the string str.

val uppercase_letter : char t

Parse an uppercase letter.

val lowercase_letter : char t

Parse a lowercase letter.

val letter : char t

Parse a letter.

val digit_char : char t

Parse a digit 0..9 and return it as character.

val digit : int t

Parse a digit and return it as number.

val word : (char -> bool) -> (char -> bool) -> string -> string t

word first inner error

Parse a word which starts with a character satisfying the predicate first followed by zero or more characters satisfying the predicate inner. In case of failure add the expectation error.

val hex_uppercase : int t

Equivalent to range 'A' 'F' and then converted to the corresponding number between 10 and 15.

val hex_lowercase : int t

Equivalent to range 'a' 'f' and then converted to the corresponding number between 10 and 15.

val hex_digit : int t

Parse a hexadecimal digit and return the corresponding number between 0 and 15.

val base64 : (string -> 'r) -> (string -> 'r -> 'r) -> 'r t

base64 start next Parse a base64 encoding into an object of type 'r.

A base64 encoding is a sequence of zero or more base64 characters (A-Za-z0-9+/) grouped into sequences of 4 characters and optionally padded with the character =. Each group of 2-4 base64 characters are decoded into a string of 1-3 bytes.

start gets the first 1-3 bytes and next gets all subsequent 1-3 bytes until the end of the encoding is reached.

val string_of_base64 : string t

Parse a base64 encoding and decode it into a string.

Lexer support

val lexer : 'a t -> 'tok -> 'tok t -> (Position.range * 'tok) t

lexer whitespace end_token tok

A lexer combinator.

  • The whitespace combinator recognizes a possibly empty sequence of whitespace (usually blanks, tabs, newlines, comments, ...).
  • end_token is a token which the lexer returns when it has successfully consumed the end of input.
  • tok is a combinator recognizing tokens (usually tok1 </> tok2 </> ... </> tokn).

The lexer combinator recognizes tokens in an input stream of the form

           WS Token WS Token .... WS EOF

Note: If a combinator fails to recognize a token and having consumed some input, then the subsequent combinators are not used anymore as alternatives. Therefore if there are tokens which can begin with the same prefix, then it is necessary to make the recognition of the common prefixes backtrackable in all but the last combinator recognizing a token with the same prefix. The same applies to whitespace if part of the whitespace can begin like a token.

Examples:

  • comment: "// ...."
  • division operator: "/"

In this case the recognition at least of the first slash of the comment has to be backtrackable.

Make the Final Parser

val make : State.t -> Final.t t -> Parser.t

make state c

Make a parser which starts in state state and parses a construct defined by the combinator c. The token stream must be ended by put_end, otherwise the parse won't succeed.

val make_partial : State.t -> Final.t t -> Parser.t

make_partial state c

Make parser which analyzes a part of the input stream. The parser starts in state state and parses a construct defined by the combinator c. The parser can succeed even if no end token has been pushed into the parser.

val restart_partial : Final.t t -> Parser.t -> Parser.t

restart_partial c p

Restart the partial parser p by using the combinator c to recognize the next part of the input stream. The restarted parser starts with the state and the file position of p.

Preconditions:

  • has_succeeded p
  • not (has_consumed_end p)
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Character/index.html b/odoc/fmlib_parse/Fmlib_parse/Character/index.html new file mode 100644 index 00000000..8f604bc5 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Character/index.html @@ -0,0 +1,6 @@ + +Character (fmlib_parse.Fmlib_parse.Character)

Module Fmlib_parse.Character

Character Parser: An indentation sensitive parser which parses streams of characters i.e. the token type is char.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/argument-1-Parser/index.html b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/argument-1-Parser/index.html new file mode 100644 index 00000000..3ab431d7 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/argument-1-Parser/index.html @@ -0,0 +1,2 @@ + +Parser (fmlib_parse.Fmlib_parse.Error_reporter.Make.Parser)

Parameter Make.Parser

type t
type expect = string * Indent.expectation option
type semantic
val has_failed_syntax : t -> bool
val failed_expectations : t -> expect list
val failed_semantic : t -> semantic
val position : t -> Position.t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/index.html b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/index.html new file mode 100644 index 00000000..09772ddb --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/Make/index.html @@ -0,0 +1,11 @@ + +Make (fmlib_parse.Fmlib_parse.Error_reporter.Make)

Module Error_reporter.Make

Generate the error reporter from a failed parser.

The Parser has to be a failed parser i.e. a parser which has ended either with a syntax error or a semantic error.

Parameters

Signature

Types

type semantic = Parser.semantic

Type of the semantic error.

type t

The type of the reporter.

Make an error reporter

val make_syntax : Parser.t -> t

Make an error reported for a parser which has failed with a syntax error.

Precondition: Parser.has_failed_syntax p

val make : + (semantic -> Position.range) -> + (semantic -> Fmlib_pretty.Print.doc) -> + Parser.t -> + t

make semantic_range semantic_doc p

Generate an error reporter from

  • semantic_range: Function which computes from a semantic error a range in the source file where the error occurred.
  • semantic_doc: Function which computes from a semantic error a pretty print document.
  • p: The parser which ended in an error state

The functions for semantic errors have to be provided by the user because semantic errors are transparent to the parser. In case the parser cannot end in a semantic error (i.e. no fail combinator has been used), then use make_syntax.

Run the error reporter

In order to run the error reporter some kind of a stream is needed which represents the source code where an error has occurred. The reporter extracts a source snippet which contains the error and marks the error position. After the code snippet it adds an error message describing the error.

val run_on_string : string -> t -> Fmlib_pretty.Print.doc

run the reporter on a string which represents the source code.

val run_on_channel : Stdlib.in_channel -> t -> Fmlib_pretty.Print.doc

run the reporter on an input channel which represents the source code. Note that the input channel must be positioned at the start.

val run_on_channels : + Stdlib.in_channel -> + int -> + Stdlib.out_channel -> + t -> + unit

run_on_channels ic width oc r

Run the reporter on an input channel which represents the source code. Note that the input channel must be positioned at the start.

Then write the error report with the text width width to the output channel oc.

Run with inverted control

type item = char

This type makes the error reporter an instance of Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

Does the reporter need more characters from the source file?

val put : char -> t -> t

Put a character from the source file into the reporter.

val put_end : t -> t

Tell the reporter that there are no more characters in the input source.

val document : t -> Fmlib_pretty.Print.doc

The document containing a source snippet which contains the marked error and the error message.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Error_reporter/index.html b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/index.html new file mode 100644 index 00000000..fda1d316 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/index.html @@ -0,0 +1,28 @@ + +Error_reporter (fmlib_parse.Fmlib_parse.Error_reporter)

Module Fmlib_parse.Error_reporter

Convenience module to generate readable error messages.

An error reporter is a parser which reparses the input stream, extracts the failed code snippet and prints the error nicely formatted.

For semantic errors, the module needs support from the user to convert a semantic error into a pretty print document.

The error reporter generates a pretty print document (details about pretty print documents see Fmlib_pretty.Print) of the form

       code snippet containing the error with markers at the error
+
+       description of the error

The description of the error is in case of a syntax error a description of what might have been expected at the error position and in case of a semantic error whatever the user provides as an error description.

The generated error report has one of the following forms:

  • Syntax error:

            25 |      xxxx
    +        26 |
    +        27 |    line with something unexpected
    +                          ^
    +
    +        I have encountered something unexpected. I was expecting one of
    +
    +            - xxx
    +            - yyy
    +            - zzz
    +            ...
  • Semantic error on one line:

            25 |      xxxx
    +        26 |
    +        27 |    line with error
    +                          ^^^^^
    +
    +        User supplied description of the semantic error
  • Semantic error spanning several lines

            25 |      xxxx
    +        26 |
    +                          v----------
    +        27 |    xxx yyy   error start
    +        28 |      err err err err err
    +        29 |          err err err
    +        30 |       err error end zzz
    +              -----------------^
    +
    +        User supplied description of the semantic error
module type FAILED_PARSER = sig ... end

Needed functions from a failed parser i.e. a parser which has failed either with a syntax error or a semantic error.

module Make (Parser : FAILED_PARSER) : sig ... end

Generate the error reporter from a failed parser.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Error_reporter/module-type-FAILED_PARSER/index.html b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/module-type-FAILED_PARSER/index.html new file mode 100644 index 00000000..2fca760c --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Error_reporter/module-type-FAILED_PARSER/index.html @@ -0,0 +1,2 @@ + +FAILED_PARSER (fmlib_parse.Fmlib_parse.Error_reporter.FAILED_PARSER)

Module type Error_reporter.FAILED_PARSER

Needed functions from a failed parser i.e. a parser which has failed either with a syntax error or a semantic error.

type t
type expect = string * Indent.expectation option
type semantic
val has_failed_syntax : t -> bool
val failed_expectations : t -> expect list
val failed_semantic : t -> semantic
val position : t -> Position.t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/Parser/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/Parser/index.html new file mode 100644 index 00000000..b1e6a262 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/Parser/index.html @@ -0,0 +1,2 @@ + +Parser (fmlib_parse.Fmlib_parse.Generic.Make.Parser)

Module Make.Parser

The final parser.

A parser p is a sink of token. As long as it signals needs_more p more token can be pushed into the parser via put token p or the input stream can be ended via put_end p.

has_result p is equivalent to not (needs_more p). has_result p signals that the parser has either succeeded or failed.

If it has succeeded the final value is available via final p.

There are two types of failure:

  • Syntax error: In that case failed_expectations p returns the list of failed expectations.
  • Semantic error: In that case failed_semantic p returns the encountered semantic error.

The function state returns the user state.

The function lookaheads returns a pair. The first part of the pair is an array of unprocessed lookahead token and the second part is a flag indicating if the endtoken has been received via put_end.

type token = Token.t

Token type.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

type state = State.t

User state.

type final = Final.t

Type of the final object constructed in case of success.

type expect = Expect.t

Type of a failed expectation.

type semantic = Semantic.t

Type a semantic error.

type t

Type of the final parser.

val needs_more : t -> bool

needs_more p Does the parser p need more token?

val has_result : t -> bool

has_result p Has the parser p ended parsing and either succeeded or failed?

has_result p is the same as not (needs_more p)

val has_ended : t -> bool
  • deprecated

    Use has_result.

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val put : token -> t -> t

put token p Push token into the parser p.

Even if the parser has ended, more token can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val has_failed_semantic : t -> bool

has_failed_semantic p Has the parser p failed with a semantic error?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

val failed_semantic : t -> semantic

failed_semantic p The failed semantic error.

Precondition: has_failed_semantic p

val state : t -> state

state p The user state of the parser p.

Can be called at any time.

val has_lookahead : t -> bool

has_lookahead p Are there any unconsumed lookahead tokens in the buffer or has the end token not yet been consumed?

val first_lookahead_token : t -> token option

The first lookahead token.

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

val lookaheads : t -> token array * bool

lookaheads p The lookahead token and and end flag of the parser p.

The end flag indicates that the end token has already been received via put_end p.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-1-Token/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-1-Token/index.html new file mode 100644 index 00000000..3408d206 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-1-Token/index.html @@ -0,0 +1,2 @@ + +Token (fmlib_parse.Fmlib_parse.Generic.Make.Token)

Parameter Make.Token

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-2-State/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-2-State/index.html new file mode 100644 index 00000000..2d369461 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-2-State/index.html @@ -0,0 +1,2 @@ + +State (fmlib_parse.Fmlib_parse.Generic.Make.State)

Parameter Make.State

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-3-Expect/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-3-Expect/index.html new file mode 100644 index 00000000..071656e6 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-3-Expect/index.html @@ -0,0 +1,2 @@ + +Expect (fmlib_parse.Fmlib_parse.Generic.Make.Expect)

Parameter Make.Expect

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-4-Semantic/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-4-Semantic/index.html new file mode 100644 index 00000000..bb8d7f22 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-4-Semantic/index.html @@ -0,0 +1,2 @@ + +Semantic (fmlib_parse.Fmlib_parse.Generic.Make.Semantic)

Parameter Make.Semantic

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-5-Final/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-5-Final/index.html new file mode 100644 index 00000000..4df98777 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/argument-5-Final/index.html @@ -0,0 +1,2 @@ + +Final (fmlib_parse.Fmlib_parse.Generic.Make.Final)

Parameter Make.Final

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/Make/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/index.html new file mode 100644 index 00000000..2d9ee765 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/Make/index.html @@ -0,0 +1,43 @@ + +Make (fmlib_parse.Fmlib_parse.Generic.Make)

Module Generic.Make

  • Token.t Token type
  • State.t Type of the user state
  • Expect.t Type of syntax messages which are generated, when something has been expected but not found.
  • Semantic.t Type of semantic error messages. Triggered by fail + error.
  • Final.t Type of the returned object, when parsing has finished.

Parameters

Signature

Final parser

module Parser : sig ... end

The final parser.

Generic Combinators

type state = State.t
type expect = Expect.t
type semantic = Semantic.t

Basic Combinators

type _ t

'a t Type of a parse combinator returning an 'a.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

p >>= f

Parse first the input according to the combinator p. In case of success, feed the returned value of p into the function f to get the combinator to parse next.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* x = p in f x is equivalent to p >>= f

The let* combinator let us express parsing sequences conveniently. Example:

let* x = p in       (* parse [p], result [x] in case of success. *)
+let* y = q x in     (* parse [q x], result [y] ... *)
+let* z = r x y in   (* ... *)
+...
+return f x y z ...

The wildcard let* _ = ... can be used to ignore results of intermediate parsing steps.

val map : ('a -> 'b) -> 'a t -> 'b t

map f p

Try combinator p. In case of success, map the returned value x to f + x. In case of failure, do nothing.

map f p is equivalent to let* x = p in return (f x).

val map_and_update : (state -> 'a -> 'b * state) -> 'a t -> 'b t

map_and_update f p

Try combinator p. In case of success, map the returned state state and value a to f state a. In case of failure, do nothing.

val succeed : 'a -> 'a t

succeed a

Succeed immediately without consuming token. Return object a as result.

val return : 'a -> 'a t

return a is equivalent to succeed a.

val unexpected : expect -> 'a t

unexpected expect triggers a syntax error signalling the expectation expect.

val clear_last_expectation : 'a -> 'a t

clear_last_expectation p Clear last failed expectation.

This is useful e.g. after stripping whitespace. Since stripping whitespace means skip_one_or_more ws or skip_zero_or_more ws, after skipping whitespace the parser can still expect more whitespace. Therefore there is a failed expectation *whitespace* on the stack. However you rarely want this expectation to be reported.

val fail : semantic -> 'a t

fail error triggers a semantic error.

val (</>) : 'a t -> 'a t -> 'a t

p </> q

Try first combinator p. In case of success or failure with consumed token, p </> q is equivalent to p.

If p fails without consuming token, then p </> q is equivalent to q.

val choices : 'a t -> 'a t list -> 'a t

choices p [q r t ...] is equivalent to p </> q </> r </> t </> ....

val (<?>) : 'a t -> expect -> 'a t

p <?> expect

Try combinator p. In case of success or failure with consumed token, p <?> expect is equivalent to p.

If p fails without consuming token, then the failed expectations are replaced with the failed expectation expect.

Usually p is a combinator implementing a choice between various alternatives of a grammar construct. The <?> combinator allows to replace the set of failed grammar alternatives with a higher abstraction of the failed expectation. E.g. instead of getting the failed expectations identifier, '(', -, ... we can get the failed expectation expression.

val no_expectations : 'a t -> 'a t

no_expectations p

Parse the combinator p.

  • p fails: no_expectations p fails with the same error.
  • p succeeds without consuming tokens: no_expectations p succeeds without any added expectations.
  • p succeeds and consumes some token: no_expectations p succeeds without any expectations.

Many combinators can succeed with expectations. E.g. the combinator optional p expects a p and succeeds if it does not encounter a construct described by p. All repetitive combinators like one_or_more try to consume as many items as possible. At the end they are still expecting an item.

This combinator allows to clear such unneeded expectations. It is particularly useful when removing whitespace. The expectation of whitespace is not a meaningful error message to the user.

State Combinators

val get : state t

Get the current user state.

val set : state -> unit t

Set the user state.

val update : (state -> state) -> unit t

update f Update the user state using f.

val get_and_update : (state -> state) -> state t

get_and_update f Get the current user state and then update the user state. The returned value is the old state.

val state_around : + (state -> state) -> + 'a t -> + (state -> 'a -> state -> state) -> + 'a t

state_around before p after

If s0 is the initial state, then execute p with the start state before s0 and set the update the final state s1 by after s0 a s1 where a is the returned value in case of success and s1 is the final state after executing p.

Optional Elements

val optional : 'a t -> 'a option t

optional p

Try combinator p.

  • Success: Return Some a where a is the returned value.
  • Failure without consuming token: Return None
  • Failure with consuming token: Remain in the error state.

Repetition

val zero_or_more_fold_left : 'r -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

zero_or_more_fold_left start f p

Try the combinator p as often as possible. Accumulate the results to the start value start using the folding function f.

val one_or_more_fold_left : ('a -> 'r t) -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

one_or_more_fold_left first f p

Try the combinator p at least once and then as often as possible. Put the first value returned by p into the function first returning a result and accumulate the subsequent values as often as possible and accumulate the results to the start value returned by first using the folding function f.

val zero_or_more : 'a t -> 'a list t

zero_or_more p Parse zero or more occurrences of p and return the collected result in a list.

val one_or_more : 'a t -> ('a * 'a list) t

zero_or_more p Parse one or more occurrences of p and return the collected results as a pair of the first value and a list of the remaining values.

val skip_zero_or_more : 'a t -> int t

skip_zero_or_more p Parse zero or more occurrences of p, ignore the result and return the number of occurrences.

val skip_one_or_more : 'a t -> int t

skip_one_or_more p Parse one or more occurrences of p, ignore the result and return the number of occurrences.

val one_or_more_separated : + ('item -> 'r t) -> + ('r -> 'sep -> 'item -> 'r t) -> + 'item t -> + 'sep t -> + 'r t

one_or_more_separated first next p sep

Parse one or more occurrences of p separated by sep. Use first to convert the first occurrence of p into the result and use next to accumulate the results.

Parenthesized expressions

val parenthesized : + ('lpar -> 'a -> 'rpar -> 'b t) -> + 'lpar t -> + (unit -> 'a t) -> + ('lpar -> 'rpar t) -> + 'b t

parenthesized make lpar p rpar

Parse an expression recognized by the combinator p enclosed within parentheses. lpar recognizes the left parenthesis and rpar recognizes the right parenthesis. The value returned by lpar is given to rpar. With that mechanism it is possible to recognize matching parentheses of different kinds.

After successful parsing the function make is called with the final value (and the parentheses).

The combinator p is entered as a thunk in order to be able to call it recursively. In the combinator parenthesized the combinator p is called only guardedly. Therefore the combinator p can contain nested parenthesized expressions.

Precondition: The combinator lpar has to consume at least one token in case of success.

Operator expressions

val operator_expression : + 'exp t -> + 'op t option -> + 'op t -> + ('op -> 'op -> bool t) -> + ('op -> 'exp -> 'exp t) -> + ('exp -> 'op -> 'exp -> 'exp t) -> + 'exp t
operator_expression
+    primary         (* Parse a primary expression *)
+    unary_operator  (* Parse a unary operator *)
+    binary_operator (* Parse a binary operator *)
+    is_left         (* Is the left operator binding stronger? *)
+    make_unary      (* Make a unary expression from the operator and
+                       its operand *)
+    make_binary     (* Make a binary expression from the operator
+                       and its operands *)

Parse an operator expression by using the following combinators:

  • is_left o1 o2 decides, if the operator o1 on the left has more binding power than the operator o2. I.e. if the unary operator u has more binding power than the binary operator o, then u a o b is parsed as (u a) o b. If the binary operator o1 has more binding power than the binary operator o2, then a o1 b o2 b is parsed as (a + o1 b) o2 c.
  • make_unary u a makes the unary expression (u a).
  • make_binary a o b makes the binary expression (a o b).
  • primary parses a primary expression.
  • unary_operator parses a unary operator.
  • binary_operator parses a binary operator.

Precondition: primary, unary_operator and binary_operator have to consume at least one token in case of success. Otherwise infinite recursion can happen.

Backtracking

val backtrack : 'a t -> expect -> 'a t

backtrack p expect

Try the combinator p. In case of failure with consuming token, push the consumed token back to the lookahead and let it fail without consuming token. Use expect to record the failed expectation.

Backtracking reduces the performance, because the token pushed back to the lookahead have to be parsed again. Try to avoid backtracking whenever possible.

val followed_by : 'a t -> expect -> 'a t

followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the followed_by parser succeeds without consuming token. Otherwise it fails without consuming tokens.

val not_followed_by : 'a t -> expect -> unit t

not_followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the not_followed_by parser fails without consuming token. Otherwise it succeeds without consuming tokens.

followed_by and not_followed_by can be used to peek into the token stream without consuming token.

Elementary Parsing Step

val step : + (State.t -> Token.t option -> ('a * State.t, Expect.t) Stdlib.result) -> + 'a t

step f

Elementary parsing step.

The function f is called with two arguments:

  • The current state
  • The next lookahead token (or none, if the end of the token stream has been reached).

f must return either an object of type 'a and a new state if it accepts the token, or a failed expectation if it rejects the token.

val expect_end : (State.t -> Expect.t) -> 'a -> 'a t

expect_end error a Expect the end of input.

In case of success return a. In case of failure (i.e. not yet at the end of input) then compute via error the syntax error from the state.

WARNING: This combinator only makes sense if you generate your parser with make_parser. If you generate your parser with make then the end of input is automatically expected after the toplevel construct.

Update Failed Expectations

val update_expectations : + (State.t -> Token.t option -> Expect.t) -> + 'a t -> + 'a t

Make the Final Parser

val make : State.t -> Final.t t -> (State.t -> Expect.t) -> Parser.t

make state p e Makes a parser.

  • state Initial state
  • p Combinator which returns in case of success an object of type Final.t
  • e Error function. Generates an expectation from the state. The function is used if an other token arrives at the expected end of input.

The generated parser expects a token stream which can be successfully parsed by the combinator p. It can succeed only if an end token is pushed to the parser.

val make_partial : State.t -> Final.t t -> Parser.t

make_partial state c.

Makes a parser which starts in state state and parses a construct defined by the combinator c. The parser can succeed, even if no end token is pushed to the parser.

val restart_partial : Final.t t -> Parser.t -> Parser.t

restart_partial c p

Restart the partial parser p by using the combinator c to recognize the next part of the input stream. The restarted parser starts with the state of p.

Preconditions:

  • has_succeeded p
  • not (has_consumed_end p)
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Generic/index.html b/odoc/fmlib_parse/Fmlib_parse/Generic/index.html new file mode 100644 index 00000000..98813a03 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Generic/index.html @@ -0,0 +1,8 @@ + +Generic (fmlib_parse.Fmlib_parse.Generic)

Module Fmlib_parse.Generic

A Generic Parser where all parameters are customizable.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Indent/index.html b/odoc/fmlib_parse/Fmlib_parse/Indent/index.html new file mode 100644 index 00000000..6bc51964 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Indent/index.html @@ -0,0 +1,4 @@ + +Indent (fmlib_parse.Fmlib_parse.Indent)

Module Fmlib_parse.Indent

The allowed indentations: Helper module for indentation sensitive parsing.

type expectation =
  1. | Indent of int
    (*

    Indent n An indentation of at least n columns is expected.

    *)
  2. | Align of int
    (*

    Align n Start at colmun n is expected.

    *)
  3. | Align_between of int * int
    (*

    Align_between a b Start between the columns a and b is expected.

    *)

The expected indentiation.

type violation = expectation
  • deprecated

    Use expectation!

val group : + ('a * expectation option) list -> + (expectation option * 'a list) list

group lst Group the list of expectations.

Failed expectations with the same indentation expectation (or not indentation expectation) are grouped into one list. The sequence is not changed.

type t

Allowed indentations

val expectation : t -> expectation option

expectation ind The expected indentation or alignment. Returns None if all positions are allowed.

val initial : t

Initially all indentations 0,1,... are allowed and no alignment is required.

val check_position : int -> t -> expectation option

check_position col ind Return a violated expectation, if pos is not an allowed indentation position. Otherwise return None.

val token : int -> t -> t

token pos ind Accept a token at column pos.

Preconditions: is_position_allowed pos ind.

val align : t -> t

align ind Set the alignment flag.

The next token sets the indentation set to {pos} where pos is the column of the token and clears the aligment flag.

val left_align : t -> t

left_align ind Set the alignment flag and the indentation set to {pos} where pos is the lower bound of the current set of indentation positions.

val end_align : t -> t -> t

end_align ind0 ind End the aligned sequence i.e. handle the corner case that the aligned sequence is empty.

val start_indent : int -> t -> t

start_indent i ind Start an indented grammar construct indented by at least i relative to its parent.

If the aligmnent flag is set, indentation is ignored.

Precondition: 0 <= incr

val end_indent : int -> t -> t -> t

end_indent i ind0 ind End the current indentation which has been started with and indentation of i columns relative to ind0.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/index.html new file mode 100644 index 00000000..070ff072 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/index.html @@ -0,0 +1,2 @@ + +Interfaces (fmlib_parse.Fmlib_parse.Interfaces)

Module Fmlib_parse.Interfaces

Module types

module type MINIMAL_PARSER = sig ... end

A minimal parser is a sink of tokens which either succeeds or returns a list of failed syntax expectations.

module type NORMAL_PARSER = sig ... end

A normal parser parses a stream of tokens like a MINIMAL_PARSER. In addition it can have a state and semantic errors.

module type FULL_PARSER = sig ... end

A full parser parses a stream of tokens like a MINIMAL_PARSER. In addition it can have a state, semantic errors and gives access to the lookahead tokens.

module type LEXER = sig ... end

A lexer is a restartable parser where the tokens are characters.

module type PARSER = sig ... end
module type COMBINATOR = sig ... end
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-COMBINATOR/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-COMBINATOR/index.html new file mode 100644 index 00000000..c083f819 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-COMBINATOR/index.html @@ -0,0 +1,37 @@ + +COMBINATOR (fmlib_parse.Fmlib_parse.Interfaces.COMBINATOR)

Module type Interfaces.COMBINATOR

type state
type expect
type semantic

Basic Combinators

type _ t

'a t Type of a parse combinator returning an 'a.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

p >>= f

Parse first the input according to the combinator p. In case of success, feed the returned value of p into the function f to get the combinator to parse next.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* x = p in f x is equivalent to p >>= f

The let* combinator let us express parsing sequences conveniently. Example:

let* x = p in       (* parse [p], result [x] in case of success. *)
+let* y = q x in     (* parse [q x], result [y] ... *)
+let* z = r x y in   (* ... *)
+...
+return f x y z ...

The wildcard let* _ = ... can be used to ignore results of intermediate parsing steps.

val map : ('a -> 'b) -> 'a t -> 'b t

map f p

Try combinator p. In case of success, map the returned value x to f + x. In case of failure, do nothing.

map f p is equivalent to let* x = p in return (f x).

val map_and_update : (state -> 'a -> 'b * state) -> 'a t -> 'b t

map_and_update f p

Try combinator p. In case of success, map the returned state state and value a to f state a. In case of failure, do nothing.

val succeed : 'a -> 'a t

succeed a

Succeed immediately without consuming token. Return object a as result.

val return : 'a -> 'a t

return a is equivalent to succeed a.

val unexpected : expect -> 'a t

unexpected expect triggers a syntax error signalling the expectation expect.

val clear_last_expectation : 'a -> 'a t

clear_last_expectation p Clear last failed expectation.

This is useful e.g. after stripping whitespace. Since stripping whitespace means skip_one_or_more ws or skip_zero_or_more ws, after skipping whitespace the parser can still expect more whitespace. Therefore there is a failed expectation *whitespace* on the stack. However you rarely want this expectation to be reported.

val fail : semantic -> 'a t

fail error triggers a semantic error.

val (</>) : 'a t -> 'a t -> 'a t

p </> q

Try first combinator p. In case of success or failure with consumed token, p </> q is equivalent to p.

If p fails without consuming token, then p </> q is equivalent to q.

val choices : 'a t -> 'a t list -> 'a t

choices p [q r t ...] is equivalent to p </> q </> r </> t </> ....

val (<?>) : 'a t -> expect -> 'a t

p <?> expect

Try combinator p. In case of success or failure with consumed token, p <?> expect is equivalent to p.

If p fails without consuming token, then the failed expectations are replaced with the failed expectation expect.

Usually p is a combinator implementing a choice between various alternatives of a grammar construct. The <?> combinator allows to replace the set of failed grammar alternatives with a higher abstraction of the failed expectation. E.g. instead of getting the failed expectations identifier, '(', -, ... we can get the failed expectation expression.

val no_expectations : 'a t -> 'a t

no_expectations p

Parse the combinator p.

  • p fails: no_expectations p fails with the same error.
  • p succeeds without consuming tokens: no_expectations p succeeds without any added expectations.
  • p succeeds and consumes some token: no_expectations p succeeds without any expectations.

Many combinators can succeed with expectations. E.g. the combinator optional p expects a p and succeeds if it does not encounter a construct described by p. All repetitive combinators like one_or_more try to consume as many items as possible. At the end they are still expecting an item.

This combinator allows to clear such unneeded expectations. It is particularly useful when removing whitespace. The expectation of whitespace is not a meaningful error message to the user.

State Combinators

val get : state t

Get the current user state.

val set : state -> unit t

Set the user state.

val update : (state -> state) -> unit t

update f Update the user state using f.

val get_and_update : (state -> state) -> state t

get_and_update f Get the current user state and then update the user state. The returned value is the old state.

val state_around : + (state -> state) -> + 'a t -> + (state -> 'a -> state -> state) -> + 'a t

state_around before p after

If s0 is the initial state, then execute p with the start state before s0 and set the update the final state s1 by after s0 a s1 where a is the returned value in case of success and s1 is the final state after executing p.

Optional Elements

val optional : 'a t -> 'a option t

optional p

Try combinator p.

  • Success: Return Some a where a is the returned value.
  • Failure without consuming token: Return None
  • Failure with consuming token: Remain in the error state.

Repetition

val zero_or_more_fold_left : 'r -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

zero_or_more_fold_left start f p

Try the combinator p as often as possible. Accumulate the results to the start value start using the folding function f.

val one_or_more_fold_left : ('a -> 'r t) -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

one_or_more_fold_left first f p

Try the combinator p at least once and then as often as possible. Put the first value returned by p into the function first returning a result and accumulate the subsequent values as often as possible and accumulate the results to the start value returned by first using the folding function f.

val zero_or_more : 'a t -> 'a list t

zero_or_more p Parse zero or more occurrences of p and return the collected result in a list.

val one_or_more : 'a t -> ('a * 'a list) t

zero_or_more p Parse one or more occurrences of p and return the collected results as a pair of the first value and a list of the remaining values.

val skip_zero_or_more : 'a t -> int t

skip_zero_or_more p Parse zero or more occurrences of p, ignore the result and return the number of occurrences.

val skip_one_or_more : 'a t -> int t

skip_one_or_more p Parse one or more occurrences of p, ignore the result and return the number of occurrences.

val one_or_more_separated : + ('item -> 'r t) -> + ('r -> 'sep -> 'item -> 'r t) -> + 'item t -> + 'sep t -> + 'r t

one_or_more_separated first next p sep

Parse one or more occurrences of p separated by sep. Use first to convert the first occurrence of p into the result and use next to accumulate the results.

Parenthesized expressions

val parenthesized : + ('lpar -> 'a -> 'rpar -> 'b t) -> + 'lpar t -> + (unit -> 'a t) -> + ('lpar -> 'rpar t) -> + 'b t

parenthesized make lpar p rpar

Parse an expression recognized by the combinator p enclosed within parentheses. lpar recognizes the left parenthesis and rpar recognizes the right parenthesis. The value returned by lpar is given to rpar. With that mechanism it is possible to recognize matching parentheses of different kinds.

After successful parsing the function make is called with the final value (and the parentheses).

The combinator p is entered as a thunk in order to be able to call it recursively. In the combinator parenthesized the combinator p is called only guardedly. Therefore the combinator p can contain nested parenthesized expressions.

Precondition: The combinator lpar has to consume at least one token in case of success.

Operator expressions

val operator_expression : + 'exp t -> + 'op t option -> + 'op t -> + ('op -> 'op -> bool t) -> + ('op -> 'exp -> 'exp t) -> + ('exp -> 'op -> 'exp -> 'exp t) -> + 'exp t
operator_expression
+    primary         (* Parse a primary expression *)
+    unary_operator  (* Parse a unary operator *)
+    binary_operator (* Parse a binary operator *)
+    is_left         (* Is the left operator binding stronger? *)
+    make_unary      (* Make a unary expression from the operator and
+                       its operand *)
+    make_binary     (* Make a binary expression from the operator
+                       and its operands *)

Parse an operator expression by using the following combinators:

  • is_left o1 o2 decides, if the operator o1 on the left has more binding power than the operator o2. I.e. if the unary operator u has more binding power than the binary operator o, then u a o b is parsed as (u a) o b. If the binary operator o1 has more binding power than the binary operator o2, then a o1 b o2 b is parsed as (a + o1 b) o2 c.
  • make_unary u a makes the unary expression (u a).
  • make_binary a o b makes the binary expression (a o b).
  • primary parses a primary expression.
  • unary_operator parses a unary operator.
  • binary_operator parses a binary operator.

Precondition: primary, unary_operator and binary_operator have to consume at least one token in case of success. Otherwise infinite recursion can happen.

Backtracking

val backtrack : 'a t -> expect -> 'a t

backtrack p expect

Try the combinator p. In case of failure with consuming token, push the consumed token back to the lookahead and let it fail without consuming token. Use expect to record the failed expectation.

Backtracking reduces the performance, because the token pushed back to the lookahead have to be parsed again. Try to avoid backtracking whenever possible.

val followed_by : 'a t -> expect -> 'a t

followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the followed_by parser succeeds without consuming token. Otherwise it fails without consuming tokens.

val not_followed_by : 'a t -> expect -> unit t

not_followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the not_followed_by parser fails without consuming token. Otherwise it succeeds without consuming tokens.

followed_by and not_followed_by can be used to peek into the token stream without consuming token.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-FULL_PARSER/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-FULL_PARSER/index.html new file mode 100644 index 00000000..b06d91e1 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-FULL_PARSER/index.html @@ -0,0 +1,2 @@ + +FULL_PARSER (fmlib_parse.Fmlib_parse.Interfaces.FULL_PARSER)

Module type Interfaces.FULL_PARSER

A full parser parses a stream of tokens like a MINIMAL_PARSER. In addition it can have a state, semantic errors and gives access to the lookahead tokens.

type t

Type of the parser.

Feeding Tokens

type token

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Semantic Errors

type semantic

Type of semantic errors.

val has_failed_semantic : t -> bool

Has the parser failed because of a semantic error?

val failed_semantic : t -> semantic

The semantic error encountered.

Precondition: A semantic error has occurred.

State

type state

Type of the state of the parser (in many cases unit)

val state : t -> state

The state of the parser.

Lookaheads

val first_lookahead_token : t -> token option

The first lookahead token (or None in case there is none).

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-LEXER/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-LEXER/index.html new file mode 100644 index 00000000..2648b226 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-LEXER/index.html @@ -0,0 +1,2 @@ + +LEXER (fmlib_parse.Fmlib_parse.Interfaces.LEXER)

Module type Interfaces.LEXER

A lexer is a restartable parser where the tokens are characters.

A lexer analyses a stream of characters and groups the stream of characters into tokens. It usually strips off whitespace. I.e. a lexer expects a stream of characters of the form

            WS Token WS Token ... WS Token WS EOS

WS is a possibly empty sequence of whitespace characters like blanks, tabs and newlines and comments. Token represents a legal token. EOS represents the end of the stream.

A lexer is in one of three states:

  • needs_more: The lexer needs more characters from the stream of characters in order to decide the next correct token or the end of input. The lexer is ready to receive more characters via put or to receive the end of input via put_end.
  • has_succeeded: The lexer has found a correct token or detected the end of input. In this state (except at the end of inpute) the lexer can be restarted to find the next token.
  • has_failed_syntax: The lexer has detected a character (or the end of intput) which cannot be part of a legal token.

In the state has_succeeded the lexer signals via has_consumed_end that the end of input has been reached.

A module conforming to the module type LEXER can be used in the module Parse_with_lexer to create a two stage parser where the lexer handles tokens and a combinator parser handles the higher level constructs.

type t

Type of the parser.

Feeding Tokens

type token = char

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect = string * Indent.expectation option

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Lookahead

val has_consumed_end : t -> bool

Has the lexer consumed the end of input?

Position

val position : t -> Position.t

Line and column number of the current position of the lexer.

Restart

A lexer does not consume the entire input stream. It just consumes characters until a token has been recognized. In case of the successful recognition of a token, it returns the token (see final). Then it can be restarted to recognize the next token.

val restart : t -> t

restart p

Next lexer, ready to recognize the next token of the input stream.

All lookaheads from the previous lexer are pushed onto the new lexer which starts a the position where the previous lexer finished.

Preconditions:

  • has_succeeded p
  • not (has_consumed_end p)
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-MINIMAL_PARSER/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-MINIMAL_PARSER/index.html new file mode 100644 index 00000000..aa770d36 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-MINIMAL_PARSER/index.html @@ -0,0 +1,2 @@ + +MINIMAL_PARSER (fmlib_parse.Fmlib_parse.Interfaces.MINIMAL_PARSER)

Module type Interfaces.MINIMAL_PARSER

A minimal parser is a sink of tokens which either succeeds or returns a list of failed syntax expectations.

type t

Type of the parser.

Feeding Tokens

type token

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-NORMAL_PARSER/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-NORMAL_PARSER/index.html new file mode 100644 index 00000000..2982c9fd --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-NORMAL_PARSER/index.html @@ -0,0 +1,2 @@ + +NORMAL_PARSER (fmlib_parse.Fmlib_parse.Interfaces.NORMAL_PARSER)

Module type Interfaces.NORMAL_PARSER

A normal parser parses a stream of tokens like a MINIMAL_PARSER. In addition it can have a state and semantic errors.

type t

Type of the parser.

Feeding Tokens

type token

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Semantic Errors

type semantic

Type of semantic errors.

val has_failed_semantic : t -> bool

Has the parser failed because of a semantic error?

val failed_semantic : t -> semantic

The semantic error encountered.

Precondition: A semantic error has occurred.

State

type state

Type of the state of the parser (in many cases unit)

val state : t -> state

The state of the parser.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-PARSER/index.html b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-PARSER/index.html new file mode 100644 index 00000000..ad88016b --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Interfaces/module-type-PARSER/index.html @@ -0,0 +1,2 @@ + +PARSER (fmlib_parse.Fmlib_parse.Interfaces.PARSER)

Module type Interfaces.PARSER

A parser p is a sink of token. As long as it signals needs_more p more token can be pushed into the parser via put token p or the input stream can be ended via put_end p.

has_result p is equivalent to not (needs_more p). has_result p signals that the parser has either succeeded or failed.

If it has succeeded the final value is available via final p.

There are two types of failure:

  • Syntax error: In that case failed_expectations p returns the list of failed expectations.
  • Semantic error: In that case failed_semantic p returns the encountered semantic error.

The function state returns the user state.

The function lookaheads returns a pair. The first part of the pair is an array of unprocessed lookahead token and the second part is a flag indicating if the endtoken has been received via put_end.

type token

Token type.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

type state

User state.

type final

Type of the final object constructed in case of success.

type expect

Type of a failed expectation.

type semantic

Type a semantic error.

type t

Type of the final parser.

val needs_more : t -> bool

needs_more p Does the parser p need more token?

val has_result : t -> bool

has_result p Has the parser p ended parsing and either succeeded or failed?

has_result p is the same as not (needs_more p)

val has_ended : t -> bool
  • deprecated

    Use has_result.

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val put : token -> t -> t

put token p Push token into the parser p.

Even if the parser has ended, more token can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val has_failed_semantic : t -> bool

has_failed_semantic p Has the parser p failed with a semantic error?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

val failed_semantic : t -> semantic

failed_semantic p The failed semantic error.

Precondition: has_failed_semantic p

val state : t -> state

state p The user state of the parser p.

Can be called at any time.

val has_lookahead : t -> bool

has_lookahead p Are there any unconsumed lookahead tokens in the buffer or has the end token not yet been consumed?

val first_lookahead_token : t -> token option

The first lookahead token.

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

val lookaheads : t -> token array * bool

lookaheads p The lookahead token and and end flag of the parser p.

The end flag indicates that the end token has already been received via put_end p.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Located/index.html b/odoc/fmlib_parse/Fmlib_parse/Located/index.html new file mode 100644 index 00000000..15f9a2dc --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Located/index.html @@ -0,0 +1,2 @@ + +Located (fmlib_parse.Fmlib_parse.Located)

Module Fmlib_parse.Located

A parsing construct located within a file.

type 'a t = Position.range * 'a

'a t Type of an object which is located within a file, i.e. which has a start and an end position.

val make : Position.range -> 'a -> 'a t

make range object Make object located in range.

val value : 'a t -> 'a

value loc The located object.

val start : 'a t -> Position.t

start loc The start position of the located object loc.

val _end : 'a t -> Position.t

_end loc The end position of the located object loc.

val range : 'a t -> Position.range

range loc The pair consisting of start position and end position of the located object loc.

val map : ('a -> 'b) -> 'a t -> 'b t

map f loc Map the value within the located object loc via the function f.

Equivalent to make (range loc) (value loc |> f).

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-1-State/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-1-State/index.html new file mode 100644 index 00000000..38444292 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-1-State/index.html @@ -0,0 +1,2 @@ + +State (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.State)

Parameter Make.State

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-2-Token/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-2-Token/index.html new file mode 100644 index 00000000..65d5ba77 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-2-Token/index.html @@ -0,0 +1,2 @@ + +Token (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.Token)

Parameter Make.Token

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-3-Final/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-3-Final/index.html new file mode 100644 index 00000000..671c0cc7 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-3-Final/index.html @@ -0,0 +1,2 @@ + +Final (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.Final)

Parameter Make.Final

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-4-Semantic/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-4-Semantic/index.html new file mode 100644 index 00000000..8294130e --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-4-Semantic/index.html @@ -0,0 +1,2 @@ + +Semantic (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.Semantic)

Parameter Make.Semantic

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-5-Lex/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-5-Lex/index.html new file mode 100644 index 00000000..609edde1 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-5-Lex/index.html @@ -0,0 +1,2 @@ + +Lex (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.Lex)

Parameter Make.Lex

A lexer analyses a stream of characters and groups the stream of characters into tokens. It usually strips off whitespace. I.e. a lexer expects a stream of characters of the form

            WS Token WS Token ... WS Token WS EOS

WS is a possibly empty sequence of whitespace characters like blanks, tabs and newlines and comments. Token represents a legal token. EOS represents the end of the stream.

A lexer is in one of three states:

  • needs_more: The lexer needs more characters from the stream of characters in order to decide the next correct token or the end of input. The lexer is ready to receive more characters via put or to receive the end of input via put_end.
  • has_succeeded: The lexer has found a correct token or detected the end of input. In this state (except at the end of inpute) the lexer can be restarted to find the next token.
  • has_failed_syntax: The lexer has detected a character (or the end of intput) which cannot be part of a legal token.

In the state has_succeeded the lexer signals via has_consumed_end that the end of input has been reached.

A module conforming to the module type LEXER can be used in the module Parse_with_lexer to create a two stage parser where the lexer handles tokens and a combinator parser handles the higher level constructs.

type t

Type of the parser.

Feeding Tokens

type token = char

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final = Position.range * Token.t

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect = string * Indent.expectation option

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Lookahead

val has_consumed_end : t -> bool

Has the lexer consumed the end of input?

Position

val position : t -> Position.t

Line and column number of the current position of the lexer.

Restart

A lexer does not consume the entire input stream. It just consumes characters until a token has been recognized. In case of the successful recognition of a token, it returns the token (see final). Then it can be restarted to recognize the next token.

val restart : t -> t

restart p

Next lexer, ready to recognize the next token of the input stream.

All lookaheads from the previous lexer are pushed onto the new lexer which starts a the position where the previous lexer finished.

Preconditions:

  • has_succeeded p
  • not (has_consumed_end p)
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-6-Parse/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-6-Parse/index.html new file mode 100644 index 00000000..dc278db4 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/argument-6-Parse/index.html @@ -0,0 +1,2 @@ + +Parse (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make.Parse)

Parameter Make.Parse

type t

Type of the parser.

Feeding Tokens

type token = Position.range * Token.t

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final = Final.t

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect = string * Indent.expectation option

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Semantic Errors

type semantic = Semantic.t

Type of semantic errors.

val has_failed_semantic : t -> bool

Has the parser failed because of a semantic error?

val failed_semantic : t -> semantic

The semantic error encountered.

Precondition: A semantic error has occurred.

State

type state = State.t

Type of the state of the parser (in many cases unit)

val state : t -> state

The state of the parser.

Lookaheads

val first_lookahead_token : t -> token option

The first lookahead token (or None in case there is none).

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/index.html new file mode 100644 index 00000000..c93e0254 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/Make/index.html @@ -0,0 +1,13 @@ + +Make (fmlib_parse.Fmlib_parse.Parse_with_lexer.Make)

Module Parse_with_lexer.Make

Generate the parser with a lexer and a token parser.

The generated parser parses a stream of characters. The lexer is used to convert the stream of characters into a stream of tokens of type Position.range * Token.t which are fed into the token parser.

The type of tokens is char.

type token = char

Type of syntax expectations:

type expect = string * Indent.expectation option

Parameters

module State : ANY
module Token : ANY
module Final : ANY
module Semantic : ANY
module Parse : + Interfaces.FULL_PARSER + with type state = State.t + and type token = Position.range * Token.t + and type expect = string * Indent.expectation option + and type final = Final.t + and type semantic = Semantic.t

Signature

include Interfaces.NORMAL_PARSER + with type token = char + and type final = Final.t + and type expect = string * Indent.expectation option + and type semantic = Semantic.t + and type state = State.t
type t

Type of the parser.

Feeding Tokens

type token = char

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final = Final.t

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect = string * Indent.expectation option

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Semantic Errors

type semantic = Semantic.t

Type of semantic errors.

val has_failed_semantic : t -> bool

Has the parser failed because of a semantic error?

val failed_semantic : t -> semantic

The semantic error encountered.

Precondition: A semantic error has occurred.

State

type state = State.t

Type of the state of the parser (in many cases unit)

val state : t -> state

The state of the parser.

Lexer and Parser

val make : Lex.t -> Parse.t -> t

make lex parse Make the parser from a lexer and a parser.

val lex : t -> Lex.t

The lexer part of the parser.

val parse : t -> Parse.t

The parser part of the parser.

Position

val position : t -> Position.t

The current position in the input.

Run on a String

val run_on_string : string -> t -> t

run_on_string str p Run the parser p on the string str.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/index.html b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/index.html new file mode 100644 index 00000000..3292ec98 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Parse_with_lexer/index.html @@ -0,0 +1,15 @@ + +Parse_with_lexer (fmlib_parse.Fmlib_parse.Parse_with_lexer)

Module Fmlib_parse.Parse_with_lexer

A parser which works with two components: A lexer which splits up the input into a sequence of tokens and parser which parses the tokens.

The parser needs two components, a lexer and a parser. The lexer works on streams of characters and produces tokens of type Position.range * Token.t. The parser consumes tokens of type Position.range * Token.t and produces the parsed constructs in case of success.

module type ANY = Fmlib_std.Interfaces.ANY
module Make + (State : ANY) + (Token : ANY) + (Final : ANY) + (Semantic : ANY) + (Lex : Interfaces.LEXER with type final = Position.range * Token.t) + (Parse : + Interfaces.FULL_PARSER + with type state = State.t + and type token = Position.range * Token.t + and type expect = string * Indent.expectation option + and type final = Final.t + and type semantic = Semantic.t) : + sig ... end

Generate the parser with a lexer and a token parser.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Position/index.html b/odoc/fmlib_parse/Fmlib_parse/Position/index.html new file mode 100644 index 00000000..bc77d3e0 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Position/index.html @@ -0,0 +1,2 @@ + +Position (fmlib_parse.Fmlib_parse.Position)

Module Fmlib_parse.Position

Represent a position in a text file.

type t

Position in a text file.

type range = t * t
val start : t

Position with points to the start of a textfile (line = 0, column = 0).

val line : t -> int

line pos The line number corresponding to the position p. Note: The first line is line 0.

val column : t -> int

column pos The column number corresponding to the position p. Note: The first column is column 0.

val next : char -> t -> t

next next_char pos: Advance the position by using the next character. If the next character is a newline, then the line number is increment and the column number is reset to 0.

val next_line : t -> t

next_line pos Advance the position to the start of the next line.

val next_column : t -> t

next_column pos Advance the column position by 1.

val is_less_equal : t -> t -> bool

is_less_equal p1 p2 Are p1 and p2 in the correct order i.e. p2 is not before p1.

val is_valid_range : range -> bool

Is the range a valid range in a file i.e. are both positions valid and is the first position before or at the second position?

val merge : range -> range -> range

merge range_1 range_2

Merge the ranges range_1 and range_2 i.e. when range_1 = (pos1, _) and range_2 = (_, pos2) then the merged range is (pos1, pos2).

Precondition: Both are valid ranges and range_1 starts before range_2 and range_1 ends before range_2.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/Parser/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/Parser/index.html new file mode 100644 index 00000000..5daf5d14 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/Parser/index.html @@ -0,0 +1,2 @@ + +Parser (fmlib_parse.Fmlib_parse.Token_parser.Make.Parser)

Module Make.Parser

type t

Type of the parser.

Feeding Tokens

type token = Position.range * Token.t

Type of the tokens.

type item = token

In order to conform to the interface Fmlib_std.Interfaces.SINK.

val needs_more : t -> bool

needs_more p Does the parser p need more tokens?

val put : token -> t -> t

put tok p Push token tok into the parser p.

Even if the parser has ended, more tokens can be pushed into the parser. The parser stores the token as lookahead token.

If the parser has already received the end of the token stream via put_end, then all subsequent tokens are ignored.

val put_end : t -> t

put_end p Push and end token into the parser p.

Success

type final = Final.t

Type of the final result.

val has_succeeded : t -> bool

has_succeeded p Has the parser p succeeded?

val final : t -> final

final p The final object constructed by the parser p in case of success.

Precondition: has_succeeded p

Syntax Errors

type expect = string * Indent.expectation option

Type of expectations.

val has_failed_syntax : t -> bool

has_failed_syntax p Has the parser p failed with a syntax error?

val failed_expectations : t -> expect list

failed_expectations p The failed expectations due to a syntax error.

Precondition: has_failed_syntax p

Semantic Errors

type semantic = Semantic.t

Type of semantic errors.

val has_failed_semantic : t -> bool

Has the parser failed because of a semantic error?

val failed_semantic : t -> semantic

The semantic error encountered.

Precondition: A semantic error has occurred.

State

type state = State.t

Type of the state of the parser (in many cases unit)

val state : t -> state

The state of the parser.

Lookaheads

val first_lookahead_token : t -> token option

The first lookahead token (or None in case there is none).

val has_received_end : t -> bool

has_received_end p Has the parser p already received the end of token stream via put_end?

val has_consumed_end : t -> bool

has_consumed_end p Has the parser p already received the end of token stream via put_end and consumed it?

val fold_lookahead : 'a -> (token -> 'a -> 'a) -> ('a -> 'a) -> t -> 'a

fold_lookahead a ftok fend p

Fold the lookahead tokens with the start value a and the folding function ftok. At the end of the lookahead tokens, call fend if there is an unconsumed end.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-1-State/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-1-State/index.html new file mode 100644 index 00000000..e0a8f687 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-1-State/index.html @@ -0,0 +1,2 @@ + +State (fmlib_parse.Fmlib_parse.Token_parser.Make.State)

Parameter Make.State

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-2-Token/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-2-Token/index.html new file mode 100644 index 00000000..29913308 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-2-Token/index.html @@ -0,0 +1,2 @@ + +Token (fmlib_parse.Fmlib_parse.Token_parser.Make.Token)

Parameter Make.Token

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-3-Final/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-3-Final/index.html new file mode 100644 index 00000000..d66a66ed --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-3-Final/index.html @@ -0,0 +1,2 @@ + +Final (fmlib_parse.Fmlib_parse.Token_parser.Make.Final)

Parameter Make.Final

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-4-Semantic/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-4-Semantic/index.html new file mode 100644 index 00000000..c7f1ce53 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/argument-4-Semantic/index.html @@ -0,0 +1,2 @@ + +Semantic (fmlib_parse.Fmlib_parse.Token_parser.Make.Semantic)

Parameter Make.Semantic

type t
\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/index.html new file mode 100644 index 00000000..aa0ccc21 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/Make/index.html @@ -0,0 +1,51 @@ + +Make (fmlib_parse.Fmlib_parse.Token_parser.Make)

Module Token_parser.Make

  • State: User state.
  • Token: Token (pure token without position information). The generated parser receives an actual token together with information about the location in the file.
  • Final: Final result of a successful parse.
  • Syntax: Represents what has been syntactically expected and has not been received.
  • Semantic: Semantic error message (triggered by fail).

Parameters

Signature

module Parser : + Interfaces.FULL_PARSER + with type state = State.t + and type token = Position.range * Token.t + and type expect = string * Indent.expectation option + and type final = Final.t + and type semantic = Semantic.t
type state = State.t
type expect = Stdlib.String.t
type semantic = Semantic.t

Basic Combinators

type _ t

'a t Type of a parse combinator returning an 'a.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

p >>= f

Parse first the input according to the combinator p. In case of success, feed the returned value of p into the function f to get the combinator to parse next.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* x = p in f x is equivalent to p >>= f

The let* combinator let us express parsing sequences conveniently. Example:

let* x = p in       (* parse [p], result [x] in case of success. *)
+let* y = q x in     (* parse [q x], result [y] ... *)
+let* z = r x y in   (* ... *)
+...
+return f x y z ...

The wildcard let* _ = ... can be used to ignore results of intermediate parsing steps.

val map : ('a -> 'b) -> 'a t -> 'b t

map f p

Try combinator p. In case of success, map the returned value x to f + x. In case of failure, do nothing.

map f p is equivalent to let* x = p in return (f x).

val map_and_update : (state -> 'a -> 'b * state) -> 'a t -> 'b t

map_and_update f p

Try combinator p. In case of success, map the returned state state and value a to f state a. In case of failure, do nothing.

val succeed : 'a -> 'a t

succeed a

Succeed immediately without consuming token. Return object a as result.

val return : 'a -> 'a t

return a is equivalent to succeed a.

val unexpected : expect -> 'a t

unexpected expect triggers a syntax error signalling the expectation expect.

val clear_last_expectation : 'a -> 'a t

clear_last_expectation p Clear last failed expectation.

This is useful e.g. after stripping whitespace. Since stripping whitespace means skip_one_or_more ws or skip_zero_or_more ws, after skipping whitespace the parser can still expect more whitespace. Therefore there is a failed expectation *whitespace* on the stack. However you rarely want this expectation to be reported.

val fail : semantic -> 'a t

fail error triggers a semantic error.

val (</>) : 'a t -> 'a t -> 'a t

p </> q

Try first combinator p. In case of success or failure with consumed token, p </> q is equivalent to p.

If p fails without consuming token, then p </> q is equivalent to q.

val choices : 'a t -> 'a t list -> 'a t

choices p [q r t ...] is equivalent to p </> q </> r </> t </> ....

val (<?>) : 'a t -> expect -> 'a t

p <?> expect

Try combinator p. In case of success or failure with consumed token, p <?> expect is equivalent to p.

If p fails without consuming token, then the failed expectations are replaced with the failed expectation expect.

Usually p is a combinator implementing a choice between various alternatives of a grammar construct. The <?> combinator allows to replace the set of failed grammar alternatives with a higher abstraction of the failed expectation. E.g. instead of getting the failed expectations identifier, '(', -, ... we can get the failed expectation expression.

val no_expectations : 'a t -> 'a t

no_expectations p

Parse the combinator p.

  • p fails: no_expectations p fails with the same error.
  • p succeeds without consuming tokens: no_expectations p succeeds without any added expectations.
  • p succeeds and consumes some token: no_expectations p succeeds without any expectations.

Many combinators can succeed with expectations. E.g. the combinator optional p expects a p and succeeds if it does not encounter a construct described by p. All repetitive combinators like one_or_more try to consume as many items as possible. At the end they are still expecting an item.

This combinator allows to clear such unneeded expectations. It is particularly useful when removing whitespace. The expectation of whitespace is not a meaningful error message to the user.

State Combinators

val get : state t

Get the current user state.

val set : state -> unit t

Set the user state.

val update : (state -> state) -> unit t

update f Update the user state using f.

val get_and_update : (state -> state) -> state t

get_and_update f Get the current user state and then update the user state. The returned value is the old state.

val state_around : + (state -> state) -> + 'a t -> + (state -> 'a -> state -> state) -> + 'a t

state_around before p after

If s0 is the initial state, then execute p with the start state before s0 and set the update the final state s1 by after s0 a s1 where a is the returned value in case of success and s1 is the final state after executing p.

Optional Elements

val optional : 'a t -> 'a option t

optional p

Try combinator p.

  • Success: Return Some a where a is the returned value.
  • Failure without consuming token: Return None
  • Failure with consuming token: Remain in the error state.

Repetition

val zero_or_more_fold_left : 'r -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

zero_or_more_fold_left start f p

Try the combinator p as often as possible. Accumulate the results to the start value start using the folding function f.

val one_or_more_fold_left : ('a -> 'r t) -> ('r -> 'a -> 'r t) -> 'a t -> 'r t

one_or_more_fold_left first f p

Try the combinator p at least once and then as often as possible. Put the first value returned by p into the function first returning a result and accumulate the subsequent values as often as possible and accumulate the results to the start value returned by first using the folding function f.

val zero_or_more : 'a t -> 'a list t

zero_or_more p Parse zero or more occurrences of p and return the collected result in a list.

val one_or_more : 'a t -> ('a * 'a list) t

zero_or_more p Parse one or more occurrences of p and return the collected results as a pair of the first value and a list of the remaining values.

val skip_zero_or_more : 'a t -> int t

skip_zero_or_more p Parse zero or more occurrences of p, ignore the result and return the number of occurrences.

val skip_one_or_more : 'a t -> int t

skip_one_or_more p Parse one or more occurrences of p, ignore the result and return the number of occurrences.

val one_or_more_separated : + ('item -> 'r t) -> + ('r -> 'sep -> 'item -> 'r t) -> + 'item t -> + 'sep t -> + 'r t

one_or_more_separated first next p sep

Parse one or more occurrences of p separated by sep. Use first to convert the first occurrence of p into the result and use next to accumulate the results.

Parenthesized expressions

val parenthesized : + ('lpar -> 'a -> 'rpar -> 'b t) -> + 'lpar t -> + (unit -> 'a t) -> + ('lpar -> 'rpar t) -> + 'b t

parenthesized make lpar p rpar

Parse an expression recognized by the combinator p enclosed within parentheses. lpar recognizes the left parenthesis and rpar recognizes the right parenthesis. The value returned by lpar is given to rpar. With that mechanism it is possible to recognize matching parentheses of different kinds.

After successful parsing the function make is called with the final value (and the parentheses).

The combinator p is entered as a thunk in order to be able to call it recursively. In the combinator parenthesized the combinator p is called only guardedly. Therefore the combinator p can contain nested parenthesized expressions.

Precondition: The combinator lpar has to consume at least one token in case of success.

Operator expressions

val operator_expression : + 'exp t -> + 'op t option -> + 'op t -> + ('op -> 'op -> bool t) -> + ('op -> 'exp -> 'exp t) -> + ('exp -> 'op -> 'exp -> 'exp t) -> + 'exp t
operator_expression
+    primary         (* Parse a primary expression *)
+    unary_operator  (* Parse a unary operator *)
+    binary_operator (* Parse a binary operator *)
+    is_left         (* Is the left operator binding stronger? *)
+    make_unary      (* Make a unary expression from the operator and
+                       its operand *)
+    make_binary     (* Make a binary expression from the operator
+                       and its operands *)

Parse an operator expression by using the following combinators:

  • is_left o1 o2 decides, if the operator o1 on the left has more binding power than the operator o2. I.e. if the unary operator u has more binding power than the binary operator o, then u a o b is parsed as (u a) o b. If the binary operator o1 has more binding power than the binary operator o2, then a o1 b o2 b is parsed as (a + o1 b) o2 c.
  • make_unary u a makes the unary expression (u a).
  • make_binary a o b makes the binary expression (a o b).
  • primary parses a primary expression.
  • unary_operator parses a unary operator.
  • binary_operator parses a binary operator.

Precondition: primary, unary_operator and binary_operator have to consume at least one token in case of success. Otherwise infinite recursion can happen.

Backtracking

val backtrack : 'a t -> expect -> 'a t

backtrack p expect

Try the combinator p. In case of failure with consuming token, push the consumed token back to the lookahead and let it fail without consuming token. Use expect to record the failed expectation.

Backtracking reduces the performance, because the token pushed back to the lookahead have to be parsed again. Try to avoid backtracking whenever possible.

val followed_by : 'a t -> expect -> 'a t

followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the followed_by parser succeeds without consuming token. Otherwise it fails without consuming tokens.

val not_followed_by : 'a t -> expect -> unit t

not_followed_by p expect

Parses p and backtracks (i.e. all tokens of p will be pushed back to the lookahead). In case p succeeds, the not_followed_by parser fails without consuming token. Otherwise it succeeds without consuming tokens.

followed_by and not_followed_by can be used to peek into the token stream without consuming token.

Elementary Parsing Step

val step : + Stdlib.String.t -> + (State.t -> Position.range -> Token.t -> ('a * State.t) option) -> + 'a t

step expect f

Elementary parsing step.

expect describes the expectation in case the parsing step fails.

Failure can happen in 3 cases:

  • The end of input has been reached.
  • The next token is not indented properly.
  • The function f indicates an unexpected token by returning None.

The function f is called with two arguments.

  • The current state.
  • The start and end position of the next token.
  • The next token.

f has to return an object of type 'a and a new state, if it accepts the token. Or it returns the expectation, if the current token does not satisfy its expectation.

End of Input

val expect_end : 'a -> 'a t

expect_end a

Parse the end of input and return an a in case of success.

If p is a parser which parses some construct then p >>= expect_end succeeds if p succeeds and is immediately followed by the end of input.

Located Constructs

val located : 'a t -> (Position.range * 'a) t

located p Parse p and return the parse value together with its location in the file.

Indentation and Alignment

val indent : int -> 'a t -> 'a t

indent i p

Parse p indented at least i columns relative to its parent.

Precondition: 0 <= i

The indentation of p is defined by the indentation of its leftmost token. The leftmost token has to be indented at least i columns relative to the parent of p.

val align : 'a t -> 'a t

align p

Use the start position of the first token of p to align it with other constructs.

In an aligned construct the first token is the leftmost token.

Alignment makes sense if there are at least two combinators which are aligned and indented. E.g. suppose there are two combinators p and q. Then we can form

indent 1 (
+    align (
+        let* a = align p in
+        let* b = align q in
+        return (a,b)
+))

This combinator parses p whose first token has to be indented at least one column relative to its parent. And then it parses q whose first token must be aligned with the first token of p.

The indentation decouples the alignment of p and q with other aligned siblings or parents. indent 0 ... can be used to make the indentation optional.

val left_align : 'a t -> 'a t

Like align but the leftmost token have to be at the lowest allowed column.

If a whole sequence of aligned constructs have to be left aligned, then at least the first item of the sequence has to be left aligned.

val detach : 'a t -> 'a t

detach p Parse p as if there were no indentation and alignment requirements.

Make the Parser

val make : State.t -> Final.t t -> Parser.t

make s p Make the parser from the combinator p and start it in state s.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/Token_parser/index.html b/odoc/fmlib_parse/Fmlib_parse/Token_parser/index.html new file mode 100644 index 00000000..d4ba9214 --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/Token_parser/index.html @@ -0,0 +1,7 @@ + +Token_parser (fmlib_parse.Fmlib_parse.Token_parser)

Module Fmlib_parse.Token_parser

Token Parser: A parser which parses streams of user supplied tokens.

It supports layout parsing and friendly error messages.

The token parser is a functor which needs a module Token to describe the type of tokens. The generated parser receives tokens of type Position.range * Token.t. I.e. the lexer has to parse the tokens which are usually a token type (identifier, number, keyword, ...) and a string representing the actual token. Furthermore the lexer has to provide position information of the location of the token in the source file.

The combinators in a token parser work with tokens of type Token.t.

The generated parser works with tokens of type Position.range * Token.t.

\ No newline at end of file diff --git a/odoc/fmlib_parse/Fmlib_parse/index.html b/odoc/fmlib_parse/Fmlib_parse/index.html new file mode 100644 index 00000000..2c5c5eae --- /dev/null +++ b/odoc/fmlib_parse/Fmlib_parse/index.html @@ -0,0 +1,2 @@ + +Fmlib_parse (fmlib_parse.Fmlib_parse)

Module Fmlib_parse

Parsing Library

Documentation

Introduction to Combinator Parsing

Utilities

module Position : sig ... end

Represent a position in a text file.

module Located : sig ... end

A parsing construct located within a file.

module Indent : sig ... end

The allowed indentations: Helper module for indentation sensitive parsing.

module Error_reporter : sig ... end

Convenience module to generate readable error messages.

module Interfaces : sig ... end

Module types

Parsers

Parse streams of characters

Character parsers are the simplest parsers. The tokens are characters. In order to generate a character parser you just need 3 modules. A State module which in many cases is just Unit, a module Final to describe the type of the construct which the parser returns after successful parsing and a module Semantic which describes the semantic errors (the parser itself handles just syntax errors).

module Character : sig ... end

Character Parser: An indentation sensitive parser which parses streams of characters i.e. the token type is char.

Parsing with lexers

Sometimes pure character parser are not very efficient if a lot of backtracking is necessary (and for many languages backtracking is necessary). Backtracking causes all characters of a failed construct to be pushed back into the lookahead and rescanning all characters for a different construct.

For these cases the library offers parsers with 2 layers. A lexer and a token parser. The lexer parses the lexical tokens. A lexer usually needs no or very little backtracking. The token parser receives the already parsed tokens where each token is a unit consisting of all parsed characters. In case of backtracking the token parser just pushes back the whole tokens (not character by character) into the lookahead and reparses the whole tokens (again not character by character).

module Token_parser : sig ... end

Token Parser: A parser which parses streams of user supplied tokens.

module Parse_with_lexer : sig ... end

A parser which works with two components: A lexer which splits up the input into a sequence of tokens and parser which parses the tokens.

Full generic parser

All parsers of the library are based on this generic parser. The user usually does not write a generic parser.

module Generic : sig ... end

A Generic Parser where all parameters are customizable.

\ No newline at end of file diff --git a/odoc/fmlib_parse/index.html b/odoc/fmlib_parse/index.html new file mode 100644 index 00000000..a59a014a --- /dev/null +++ b/odoc/fmlib_parse/index.html @@ -0,0 +1,2 @@ + +index (fmlib_parse.index)

Combinator Parsing

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse.html b/odoc/fmlib_parse/parse.html new file mode 100644 index 00000000..4efb0552 --- /dev/null +++ b/odoc/fmlib_parse/parse.html @@ -0,0 +1,2 @@ + +parse (fmlib_parse.parse)

Introduction to Combinator Parsing

Up API

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_calculator.html b/odoc/fmlib_parse/parse_calculator.html new file mode 100644 index 00000000..f2d251ae --- /dev/null +++ b/odoc/fmlib_parse/parse_calculator.html @@ -0,0 +1,174 @@ + +parse_calculator (fmlib_parse.parse_calculator)

Calculator Example

Up

Features

In the following example we want to write a parser which parses and evaluates numeric expressions of the form

1 + 2 * 3
+
+(1 + 2) * 3
+
+1 + - 2 * 3
+
+1 + 2 ^ - 3

We have one unary operator - and the binary operators +, -, *, / and ^ and assume the usual precedence rules and associativity rules for arithmetic expressions.

All numbers are integer numbers.

Division by zero and negative exponents shall be flagged as errors.

Blanks and newlines shall be ignored.

Operators

We want to assign to each operator a precedence and an associativity.

type assoc =
+    | Left
+    | Right
+
+
+type info = int * assoc

We find the information of the operators with the help of a map

module Map:
+sig
+    find: char -> info
+end
+=
+struct
+    include Map.Make (Char)
+
+    let add_left (c: char) (i: int) (m: 'info t): 'info t =
+        add c (i, Left) m
+
+    let add_right (c: char) (i: int) (m: 'info t): 'info t =
+        add c (i, Right) m
+
+    let map: 'info t =
+        empty
+        |> add_left  '+' 0
+        |> add_left  '-' 0
+        |> add_left  '*' 1
+        |> add_left  '/' 1
+        |> add_right '^' 2
+
+    let find (c: char): info =
+        match find_opt c map with
+        | None ->
+            assert false (* illegal call *)
+        | Some i ->
+            i
+end

Character Parser

We write the parser as a lexerless parser i.e. we use a character parser which uses characters as tokens.

module CP = Character.Make (Unit) (Int) (String)
+
+open CP

No state is needed, our final construct is an integer (the value of the expression) and semantic error messages are strings.

Since there is no lexer, it is necessary to recognize and remove whitespace.

let whitespace: int t =
+    skip_zero_or_more (char ' ' </> char '\n')
+
+let lexeme (p: 'a t): 'a t =
+    let* a = p in
+    let* _ = whitespace in
+    return a

Sequences of zero or more blanks and newlines are treated as whitespace. A lexeme is any construct followed by optional whitespace. The lexeme combinator is convenient. It allows us to write a combinator p without considering whitespace. Then lexeme p parses the construct described by p and removes the whitespace which after the construct.

Operators and Numbers

let unary_operator: char t =
+    lexeme (char '-')
+
+let binary_operator: char t =
+    let op_chars = "+-*/^"
+    in
+    one_of_chars op_chars "binary operator"
+    |>
+    lexeme
+
+let number: int t =
+    one_or_more
+        return
+        (fun v d -> 10 * v + d |> return)
+        digit
+    |>
+    lexeme

Parentheses

let lpar: char t =
+    lexeme (
+        map (fun _ -> ')') (char '(')
+        </>
+        map (fun _ -> ']') (char '[')
+    )
+
+let rpar (c: char): char t =
+    lexeme (char c)

lpar recognizes a left parenthesis. '(' and '[' are allowed as opening parenthesis. The combinator left returns the expected closing parenthesis.

rpar recognizes the closing parenthesis. It is given the expected closing parenthesis.

Associating Operators

If the parser finds an expression of the form unop1 e1 op2 e2 it has to decide if op1 binds stronger than op2 and parse it like (unop1 e1) op2 e2.

The same applies to the binary expression e1 op1 e2 op2 e3. If op1 binds stronger than op2 then the parser has to parse it like (e1 op1 e2) op2 e3.

We use the precedence and associativity information of the operators to write the decision procedure.

let is_left (c1: char) (c2: char): bool t =
+    (* Does the left operator 'c1' bind stronger than 'c2'? *)
+    let (p1, a1) = Map.find c1
+    and (p2, _ ) = Map.find c2
+    in
+    return (
+        p1 > p2
+        ||
+        (
+            p1 = p2
+            &&
+            a1 = Left
+        )
+    )

Performing the Operations

To perform a unary operation (which in our case is just the unary minus) we write the combinator

let make_unary (u: char) (a: int): int t =
+    assert (u = '-');
+    return ((-1) * a)

For the binary operations we need a function to do the exponentiation.

let power (a: int) (b: int): int =
+    assert (b <> 0);
+    let rec pow b res =
+        if b = 0 then
+            res
+        else
+            pow (b - 1) (a * res)
+    in
+    pow b 1

Division and exponentiation can fail. The correct semantic action is described by the following combinator.

let make_binary (a: int) (o: char) (b: int): int t =
+    match o with
+    | '+' ->
+        return (a + b)
+    | '-' ->
+        return (a - b)
+    | '*' ->
+        return (a * b)
+    | '/' ->
+        if b = 0 then
+            fail "Division by zero"
+        else
+            return (a / b)
+    | '^' ->
+        if b < 0 then
+            fail "Negative exponent"
+        else
+            return (power a b)
+    | _ ->
+        assert false (* cannot happen *)

Expression Combinator and Parser

With the help of the library function operator_expression and parenthesized a combinator which parses an arbitrarily deep expression can be written easily.

let rec expr (): int t =
+    let primary (): int t =
+        parenthesized
+            (fun _ a _ -> return a)
+            lpar
+            expr
+            rpar
+        </>
+        number
+    in
+    operator_expression
+        (primary ())
+        (Some unary_operator)
+        binary_operator
+        is_left
+        make_unary
+        make_binary

An expression is an operator expression where the primary expression is either a parenthesized expression or a number.

All used combinators remove whitespace after each construct. There remains to remove initial whitespace. The final parser is constructed by

let parse: Parser.t =
+    make () (let* _ = whitespace in expr ())

Some Unit Tests

Some unit tests show that the parser works as expected.

let%test _ =
+    let open Parser in
+    let p = run_on_string " 1 +,2 + 2 " parse (* syntax error *)
+    in
+    has_failed_syntax p
+    &&
+    column p = 4
let%test _ =
+    let open Parser in
+    let p = run_on_string " 1 + 2 , + 2 " parse (* syntax error *)
+    in
+    has_failed_syntax p
+    &&
+    column p = 7
let%test _ =
+    let p = Parser.run_on_string "1 - 2 - 3" parse in
+    Parser.(
+        has_succeeded p
+        &&
+        final p = -4
+    )
let%test _ =
+    let p = Parser.run_on_string " 1 + 2 ^ 3" parse in
+    Parser.(
+        has_succeeded p
+        &&
+        final p = 9
+    )
let%test _ =
+    let p = Parser.run_on_string "1 + - 2 * 3" parse in
+    Parser.(
+        has_succeeded p
+        &&
+        final p = -5
+    )
let%test _ =
+    let open Parser in
+    let p = run_on_string "1 + 2 ^  - 3" parse (* semantic error *)
+    in
+    has_failed_semantic p
+    &&
+    failed_semantic p = "Negative exponent"
let%test _ =
+    let open Parser in
+    let p = run_on_string "1 + 2 ^  (3 / 0) " parse (* semantic error *)
+    in
+    has_failed_semantic p
+    &&
+    failed_semantic p = "Division by zero"

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_error.html b/odoc/fmlib_parse/parse_error.html new file mode 100644 index 00000000..7d1e67fc --- /dev/null +++ b/odoc/fmlib_parse/parse_error.html @@ -0,0 +1,95 @@ + +parse_error (fmlib_parse.parse_error)

Error Messages

Up

Basics

The parsers in Fmlib_parse support the generation of user friendly error messages. There are 2 types of errors:

  • Syntax errors: Something unexpecting appeared in the input stream. The parser has a list of expectations. In the generic parser Fmlib_parse.Generic.Make the type of syntactic expectation is customizable. In the other parsers an expectation is described by a string and an optional indentation expectation (see chapter Indentation Sensitivity for more information on indentation expectations).
  • Semantic errors: The parser has been able to successfully parse some construct but failed to perform the corresponding semantic action. Semantic errors are not issued by the library. Semantic errors are always issued by the user by invoking fail error where error is the user specific error message.

Syntax Errors

Available Error Information

Why is there a list of expectations in case of a syntax error? Because of alternatives like p </> q </> r. If this construct fails syntactically because all three combinators have failed without consuming any token, then the expectations of all three combinators are in the list of syntax expectations.

Remember that alternatives are tried only if a combiator fails without consuming tokens (this can be enforced by backtracking). If in p </> q </> r the combinator p fails by consuming tokens, then the alternatives are not even tried. However p has failed because it encountered something unexpected after successfully consuming some tokens. At that specific state it has some expectations which are reported as errors.

In order to generate syntax error messages the following functions are available in a parser:

  • has_failed_syntax parse: Has the parser parse failed because it detected something unexpected in the input stream.
  • position parse: The position (line number and column number) where the parser parse has finished parsing (either successfully or because of a failure). In case of a syntax error the position points exactly to the start of the unexpected token in the input stream. This function is not available in the generic parser, because the generic parser does not know of any positions.
  • lookaheads parse: A pair consisting of the unconsumed lookahead tokens of the parser parse and a flag which indicates if the end of input has been reached after the lookahead tokens. If there are no unconsumed lookahead tokens and the end stream has been reached, then the end of input has been unexpected.
  • failed_expectations parse: The list of failed expectations of the parser parse. In case of the generic parser the failed expectations are a list of user specific expectations. For the character and token parser each expectation in the list of failed expectations is a pair consisting of

    • a string describing the failed expectation
    • an optional indentation expectation (see Fmlib_parse.Indent) if the current position does not satisfy the indentation specification

With these functions it is possible to write quite informative error messages.

Let us look at some syntax errors in the calculator example.

012345678901234567890
+
+1 + ,2 + 2

There is an unexpected comma in line 0 at column 4. The first lookahead token is ','.

At the position of the comma, the parser would expect one of the following:

  • An additional whitespace character, either blank or newline.
  • A unary minus.
  • An opening parenthesis, either '(' or '['
  • A digit starting the next number.

With the available information it is possible to generate an error message like:

    0 | 1 + ,2 + 2
+            ^
+    I have found an unexpected ','. I was expecting one of
+    - ' '
+    - '\n'
+    - '-'
+    - '('
+    - '['
+    - digit

Improved Syntax Errors

The error message in the previous section is already quite readable. However it can be improved by giving the user more relevant information.

It is quite useless to inform the user about expected whitespace. Whitespace can occur nearly everywhere. This does not give any information. In the library there is a generic combinator no_expectations to wrap combinators like the whitespace combinator.

If we use

let whitespace: int t =
+    char ' ' </> char '\n'
+    |> skip_zero_or_more
+    |> no_expectations

as the whitespace combinator then we get rid of the useless information about expected whitespace characters.

We can do better with the expected parentheses. It is more instructive to the user to tell him that an opening parenthesis has been expected than telling each parenthesis as a separated expectation.

By using

let lpar: char t =
+    lexeme (
+        map (fun _ -> ')') (char '(')
+        </>
+        map (fun _ -> ']') (char '[')
+    )
+    <?>
+    "opening parenthesis '(' or '['"

we give to the user a more instructive error message. The operator <?> let us collapse several failed alternatives into a more abstract expectation. With p +</> q </> r <?> "message" we bundle the 3 expectations into one expectation.

We can use <?> to improve the error message above furthermore. It is better to report about an expected number than reporting an expected digit. We can achieve this by

let number: int t =
+    one_or_more
+        (fun d -> d)
+        (fun v d -> 10 * v + d)
+        digit
+    |>
+    no_expectations
+    <?>
+    "number"
+    |>
+    lexeme

Here we have added the no_expectations combinator in order to not report the expectation of one more digit in case that there have been already sufficient digits to form a number.

With all these improvements we are able to generate the following error message:

    0 | 1 + ,2 + 2
+            ^
+    I have found an unexpected ','. I was expecting one of
+    - '-'
+    - opening parenthesis '(' or '['
+    - number

Maybe it would be even better to report unary '-' instead of '-'.

Semantic Errors

Semantic errors are triggered by the user by calling fail error where error is the semantic error message. In the calculator example we have triggered an error message when division by zero or a negative exponent occurred.

The position returned by position parse is not very interesting. The parser has already found a syntactically valid construct. Therefore the position points beyond the end of the construct. In order to form an informative error message we want to have the start position and the end position of the construct which failed semantically.

In the character parser there is a combinator located. If we wrap the combinator p in located p then we get the result of p with the start and end position.

The located combinator is useful only for constructs which do not have trailing whitespace. We are usually interested in the position range of the construct without the whitespace.

In the calculator example of the previous chapter the recommended wrapping of operators and numbers is the following:

type operator = Position.range * char
+type operand  = Position.range * int
+
+let unary_operator: operator t =
+    lexeme (char '-' |> located)
+
+let binary_operator: operator t =
+    let op_chars = "+-*/^"
+    in
+    one_of_chars op_chars "binary operator"
+    |>
+    located
+    |>
+    lexeme
+
+let number: operand t =
+    one_or_more
+        (fun d -> d)
+        (fun v d -> 10 * v + d)
+        digit
+    |>
+    located
+    |>
+    no_expectations
+    <?>
+    "number"
+    |>
+    lexeme

Note that the located combinator is called before removing the whitespace (i.e. calling lexeme).

With this modification we get all operators and the numbers with the additional range information.

The combinator make_binary has to be modified to use this information correctly in the success cases and in the case of a semantic failure.

let make_binary
+        (((p1, _), a): operand)
+        ((_, o): operator)
+        (((pb1, p2), b): operand)
+    : operand t
+    =
+    match o with
+    | '+' ->
+        return ((p1, p2), a + b)
+    ...
+    | '/' ->
+        if b = 0 then
+            fail ((pb1, p2), "Zero divisor")
+        else
+            return ((p1, p2), a / b)
+    | '^' ->
+        if b < 0 then
+            fail ((pb1, p2), "Negative exponent")
+        else
+            return ((p1, p2), power a b)
+    ...

In this case the type of the semantic error has to be described by the module

module Semantic =
+struct
+    type t = Position.range * string
+end

and not by the module String.

Suppose we feed the calculator parser with the following input

1 + 2 / (4 - 4)

The parser fails semantically because division by zero is not allowed. With the available error information we can generate the following error message:

    0 | 1 + 2 / (4 - 4)
+                 ^^^^^
+
+    I have encountered a
+
+        Zero divisor
+
+    which is not allowed.

In the token parser there is no located combinator. There is no need, because the tokens already contain the range information.

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_format.html b/odoc/fmlib_parse/parse_format.html new file mode 100644 index 00000000..3b21b5a9 --- /dev/null +++ b/odoc/fmlib_parse/parse_format.html @@ -0,0 +1,61 @@ + +parse_format (fmlib_parse.parse_format)

Format Error Messages Nicely

Up

As shown in the previous chapter there is support in the combinators to collect expressive information concering errors during parsing. The parsers in this library support the collection of position information as well (only the generic parser has no support for position information).

At the end of the parsing, the parser has either succeeded or failed because of a syntax error or a semantic error. There are functions like failed_expectations and failed_semantic which return the corresponding error information.

It is not too difficult to use the error information and print some expressive error messages. However it is tedious to do this by hand. The parsing library has some support to print the error messages nicely.

Form

Let's look at the calculator example with the following input:

    1
+    + 6^2 * 200
+    - (100 - 50^3)
+    +, 300
+    - 2

Parsing this input will result in a syntax error at the unexpected comma.

The functions in this library help us to generate the following error message:

    1 | 1
+    2 | + 6^2 * 200
+    3 | - (100 - 50^3)
+    4 | +, 300
+         ^
+
+    At the marker I was expecting one of the following:
+
+        - unary operator
+        - number
+        - opening parenthesis '(' or '['

If we feed the calculator with the input

    1 +
+    + 6^2 * 200
+    - (100 - 50^3)
+    + 300 / (100 - 50 - 20 - 30)
+    - 2

it is possible to generate the error message

    1 | 1
+    2 | + 6^2 * 200
+    3 | - (100 - 50^3)
+    4 | + 300 / (100 - 50 - 20 - 10)
+                 ^^^^^^^^^^^^^^^^^^
+
+    Zero divisor

Syntax Errors

The module  Error_reporter makes the generation of error messages easy.

Let's assume that we have a failed parser p which has failed because of a syntax error. An error reporter can be generated from p by Error_reporter.make_syntax p.

Let's call the error reporter r. The error reporter needs some form of the input stream to extract the relevant source snippet. If the parser has read the input from an input channel ic then we can generate the error message by

seek_in ic 0;   (* Reposition the input channel to the start. *)
+
+let doc =
+    Error_reporter.run_on_channel ic r

The generated doc has type Fmlib_pretty.Print.doc. doc is a representation of the error message. The module Fmlib_pretty.Print has functions to layout the message with a certain text width and write the document to a channel (i.e. file), to convert it to a string etc.

If we want to write the error message to stderr we just issue the call

Fmlib_pretty.Print.(
+    layout 80 doc       (* Layout with text width 80 *)
+    |>
+    write_to_channel stderr
+)

and we are ready.

Semantic Errors

If the fail combinator has been used in the parser p, then the parser can fail either with a syntax error or a semantic error. Since semantic errors are transparent to the parser (they are encapsuled in the functor argument Semantic) some support is needed from the user to generate the error message.

The user has to provide two functions to describe the semantic error:

  • semantic_range: Semantic.t -> Position.range: Compute the start and end position of the semantic error.
  • semantic_message: Semantic.t -> Fmlib_pretty.Print.doc: Compute the specific error message.

In the calculator example we have used Position.range * string as the type of semantic errors. The two needed functions are in that case fairly trivial.

let semantic_range error =
+    fst error
+
+let semantic_message error =
+    snd error
+    |>
+    Fmlib_pretty.Print.text

Having a parser p which failed either because of a syntax or semantic error we can generate an error message by

seek_in 0 ic;
+
+Error_reporter.(
+    make
+        semantic_range
+        semantic_message
+        p
+    |>
+    run_on_channel ic
+    |>
+    Fmlib_pretty.Print.layout 80
+    |>
+    Fmlib_pretty.write_to_channel stderr
+)

Because it is very frequent to read from a file represented by an input channel and to write the error message to stderr the above sequence can be shortened to

seek_in 0 ic;
+
+Error_reporter.(
+    make
+        semantic_range
+        semantic_message
+        p
+    |>
+    run_on_channels ic 80 stderr
+)

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_indentation.html b/odoc/fmlib_parse/parse_indentation.html new file mode 100644 index 00000000..befe20ba --- /dev/null +++ b/odoc/fmlib_parse/parse_indentation.html @@ -0,0 +1,161 @@ + +parse_indentation (fmlib_parse.parse_indentation)

Indentation Sensitivity

Up

Situation

Most programming languages express hierarchical structures by some kind of parentheses. Algol like languages use begin end, C like languages use curly braces {, } to enclose blocks of code. Since blocks can be nested inside blocks, the hierarchical or tree structure is well expressed by the syntax.

For the human reader blocks are usually indented to make the hierarchical structure graphically visible. Programming languages like Haskell and Python ommit the parentheses and express the hierarchical structure by indentation. I.e. the indentation is part of the grammar. This is pleasing to the eye, because many parentheses can be ommitted.

The hierarchical structure in the following schematical source file is immediately visible without the need of parentheses.

    xxxxxxxxxxx
+        xxx
+        xxx
+            xxxxxxx
+    xxxxxxxx
+        xxx

Lower level blocks are indented with respect to their parent block and siblings at the same level are vertically aligned.

Because of this good readability configuration languages like yaml have become very popular.

Unfortunately there are not many parsers available which support indentation sensitivity. The library Fmlib_parse has support to parse languages whose grammar uses indentation to structure blocks hierarchically.

Indentation Combinators

In order to support indentation sensitivity, all constructs parsed by combinators have a certain indentation. Usually the identation of a construct is the start column of its leftmost token. For aligned constructs the first token must be the leftmost token.

Indented Block

If p is a combinator parsing a certain construct, then

indent 4 p

is a combinator which parses p indented at least 4 columns with respect to its parent.

Aligned Blocks

In order to align blocks vertically we need at least two combinators p and q whose constructs have to be vertically aligned.

The combinator

(
+    let* a = align p in
+    let* b = align q in
+    return (a, b)
+)
+|> indent 4         (* Note: Indentation of the whole block is
+                             mandatory!! Never forget!! *)

parses a construct with the structure

    xxxxxx
+        pppppp
+        qqqqqq

where xxxxxx belongs to the outer structure.

It is straightforward to parse a list of aligned constructs where the combinator p parses an individual item.

one_or_more (align p) |> indent 0

Note that some indentation is always necessary. The indentation can be zero. If no indentation is given then the parser tries to align the items recognized by p vertically below the leftmost token of the surrounding construct. This is usually not intended and a common pitfall.

Ignore Indentation

Sometimes it is necessary to ignore the indentation. The combinator

detach p

parses a construct described by the combinator p and ignores all indentation and alignment requirements at that position. This combinator is necessary in order to parse whitespace, because whitespace at the start of a line does not respect any indentation or alignment requirement.

Error Reporting

With layout parsing a syntax error can have two reasons:

  • A token is not the expected one.
  • A token does not start at an allowed position.

When a parser fails with a syntax error, it reports a list of failed expectations. Each failed expectations has two parts. A message describing the syntactic construct expected an an optional indentation expectation. If the indentation expectation is present, then the syntax error occurred because the token appeared at a not allowed position.

Because of the presence of biased choice and optional constructs in the combinators, multiple syntax expectations can fail. Therefore the parsers return a list of syntax expectations in case of a syntax error. In order make the expectations more informative for the user, it is common to use constructs like

p </> q </> r <?> "some higher level expectation"

The <?> works as expected with layout parsing when the operator is used inside the indent and alignment combinators. When positioned outside, the parser works correctly, but the error messages might be misleading.

(* Correct placement of '<?>' *)
+p
+</>
+q
+<?> "p or q"
+|> align
+|> one_or_more
+
+(* Wrong placement of '<?>' *)
+p
+</>
+q
+|> align
+<?> "p or q"
+|> one_or_more

If p and q fail because they are not properly aligned, their expectations are reported with the correct failed alignment expectation. In the correct sequence the operator <?> still sees the failed alignment and reports the more expressive expectation with the same failed alignment expectation. In the wrong sequence the <?> operator does not see the alignment requirement any more and reports the more expressive expectation without the failed alignment requirement.

Example

In this example we write a parser which parses a very simplified subset of yaml.

Requirements

Here are some examples of yaml structures and the corresponding json structure which the parser should recognize

    Hello Mr. Spock # some comment
+
+        json: "Hello Mr. Spock"
+
+    "Hello: Blabla#"
+
+        json: "Hello: Blabla#"
+
+    - - - hello
+
+        json: [[["hello"]]]
+
+    1: 11: hello
+       12: ""
+       "###": hash
+
+        json: {"1": {"11": "hello", "12": "", "###": "hash"}}
+
+    k1:
+    - 1
+    - - 1.1
+      - 1.2
+    k2: s2
+
+        json: {"k1": ["1", ["1.1", "1.2"]], "k2": "s2"}

Scalars and keys in key value pairs come in two flavors. Either a sequence of characters spanning to a colon or a newline or a sequence of characters enclosed in double quotes. We don't treat escape sequences and strings in single quotes here. Here we focus on the implementation of the indentation requirements.

Note that key value pairs have to be indented, if they occur as a substructure. Lists as a value of a key value pair do not need to be indented. The - is sufficient to indicate the start of a list.

Yaml Structure

The final construct of the parser shall be a yaml value according to the following module:

module Yaml =
+struct
+    type t =
+        | Scalar of string
+        | List   of t list
+        | Record of (string * t) list
+
+    let scalar str = Scalar str
+
+    let list lst = List lst
+
+    let record lst = Record lst
+
+    let rec to_json: t -> string =
+        (* recursive function to map a yaml value into a json string
+           for testing purposes *)
+end

Basic Combinators

We parse the yaml structure with the lexerless character parser.

module CP = Character.Make (Unit) (Yaml) (Unit)
+open CP

A yaml comment starts with a hash sign # and spans to the end of the line.

let comment: char t =
+    let* _ = char '#' in
+    let* _ =
+        (charp (fun c -> c <> '\n') "comment character")
+        |> skip_zero_or_more
+    in
+    return '#'

Whitespace is any sequence of zero or more blanks, newlines and comments.

let whitespace: int t =
+    char ' ' </> char '\n' </> comment
+    |> skip_zero_or_more
+    |> no_expectations  (* no expected whitespace in syntax errors *)
+    |> detach           (* whitespace does not repect indentation *)
+
+
+let lexeme (p: 'a t): 'a t =
+    (* Remove whitespace after 'p' *)
+    let* a = p in
+    let* _ = whitespace in
+    return a

In order to handle scalars and keys we need raw strings spanning to a colon or a newline and quoted strings.

let raw_string: string t =
+    let expect  = "chars not containing colon and newline" in
+    let inner c = c <> '\n' && c <> ':' && c <> '#' in
+    let first c = c <> '"' && inner c
+    in
+    (word first inner expect)
+    |> map String.trim
+    |> lexeme
+
+let quoted_string: string t =
+    let expect = "chars except newline and dquote" in
+    let ok c = c <> '\n' && c <> '"'
+    in
+    let* _   = char '"' in
+    let* str = (word ok ok expect) </> return "" in
+    let* _   = char '"' |> lexeme
+    in
+    return str
+
+let scalar: Yaml.t t =
+    (quoted_string </> raw_string)
+    |> map Yaml.scalar
+    <?> "scalar"

The start of a list element is indicated by -. We use the combinator dash to recognize the start of a list element.

let dash: char t =
+    char '-' |> lexeme

The key in a key value pair is either a raw string or a quoted string followed by a colon. The combinator recognizing a key has to backtrack, because a string not followed by a colon can still be a yaml scalar.

let key: string t =
+    backtrack
+        (
+            let* str = raw_string </> quoted_string in
+            let* _   = char ':' |> lexeme in
+            return str
+        )
+        "<key>:"

Recursive Yaml Parsing

Now we have to parse recursively according to the recursive definition of a yaml structure. A yaml value is either a scalar, a sequence (i.e. list) of items or a record of key value pairs.

let rec yaml (): Yaml.t t =
+    sequence_block ()
+    </>
+    record_block ()
+    </>
+    scalar
+
+and sequence_block ...
+and record_block ...

The first alternative is the sequence, because a sequence can be easily recognized by the first character -. If something doesn't start with a dash, then it is certainly not a sequence and the remaining alternatives can be tried.

We have to try to find a record before a scalar because a record can start with a scalar which represents the key of the first key value pair. If there is no colon after the key, then a pure scalar can be tried. Therefore we have made the combinator key backtrackable in order to fail without consuming any character.

A sequence block is a list of one or more aligned sequence elements. The implementation is straightforward.

and sequence_block (): Yaml.t t =
+    one_or_more
+        (
+            sequence_element ()
+            <?>
+            "list element: \"- <yaml value>\""
+            |> align
+        )
+    |> map (fun (a, lst) -> Yaml.list (a :: lst))
+    <?> "sequence of aligned \"- <yaml value>\""
+
+and sequence_element (): Yaml.t t =
+    let* _ = dash in
+    yaml () |> indent 1

Note that all sequence elements are vertically aligned and the yaml values after the dash have to be indented at least by one column.

        # legal sequence element            # illegal sequence element
+        -                                   -
+          k1: 100                           k1: 100
+          k2: 200                           k2: 200

A record block is a sequence of aligned key value pairs.

and record_block (): Yaml.t t =
+    one_or_more
+        (
+            record_element ()
+            <?> "\"<key>: <yaml value>\""
+            |> align
+        )
+    |> map (fun (a, lst) -> Yaml.record (a :: lst))
+    <?> "sequence of aligned \"<key>: <yaml value>\""
+
+and record_element (): (string * Yaml.t) t =
+    let* str = key in
+    let* y   =
+        sequence_block () |> indent 0
+        </>
+        (record_block () </> scalar |> indent 1)
+    in
+    return (str, y)

Note the subtlety of the indentation of sequence blocks and record blocks and scalars.

        # legal record element              # illegal record element
+        key:                                key:
+        - item1                             k1: value1
+        - item2                             k2: value2

Note furthermore that each aligned block is within some indentation (zero or more columns). This is important. Without some indentation the parsers try to align the elements in the block with some outer elements (which usually fails). It is a common pitfall to forget the indentation.

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_lex.html b/odoc/fmlib_parse/parse_lex.html new file mode 100644 index 00000000..fcd70153 --- /dev/null +++ b/odoc/fmlib_parse/parse_lex.html @@ -0,0 +1,19 @@ + +parse_lex (fmlib_parse.parse_lex)

Separation of Parsing and Lexing

Up

Overview

In many cases it is appropriate to separate parsing and lexing. A lexer breaks up the input stream into tokens like identifiers, parentheses, numbers, strings etc. Furthermore usually the lexer strips off whitespace. The parser handles the grammar of the language by using the tokens as primitives.

This approach has several advantages:

  • For a real language the complexity of parsing a source file is separated into two managable sized parts.
  • Handling whitespace in the parser makes the parser unnecessarily complex.
  • As soon as a language has identifiers and keywords where the keywords look syntactically like identifiers, a parser handling characters directly requires a lot of backtracking which makes the parser inefficient. A lexer can recognize identifiers and after successful recognition of an identifier it checks by using an efficient lookup table if the identifier is a keyword.

However many combinator libraries do not offer the possibility to split up the parsing task into a lexer and a parser. `Fmlib_parse` supports the splitting up of lexing and parsing with a lot of functionality.

How to write a lexer

A lexer analyzes the input stream consisting of characters in the following way:

    WS Token WS Token WS .... WS EOF

where WS is a possibly empty sequence of whitespace like blanks, tabs, newlines, comments etc. Token is a lexically correct token. EOF represents the end of the input stream.

Since the lexer has to succeed immediately after recognizing a syntactically correct token it is not a normal parser which succeeds only after having seen the end of input. Therefore a lexer is a partial parser. After having successfully recognized a token the lexer must be restartable to recognize the next token or to recognize the end of input.

The easiest way to write a lexer with the help of Fmlib_parse is to use Fmlib_parse.Character by doing the following steps:

  • Define a module Token and Token_plus of the following form:

    module Token = struct
    +    type t =
    +        T1 of ...
    +        T2 of ...
    +        ...
    +        End (* end of input *)
    +    ...
    +end
    +
    +module Token_plus = struct
    +    type t = Position.range * Token
    +end
  • Write a combinator whitespace which recogizes zero or more occurrences of whitespace. The definition of whitespace depends on the language.
  • Write a combinator for each token which recognizes the token e.g. tok1, tok2, ...
  • Use Fmlib_parse.Character.Make.lexer with the definition

    let token: Token_plus.t t =
    +    lexer
    +        whitespace
    +        Token.End
    +        (
    +            tok1 </> tok2 </> tok3 </> ...
    +        )

    to have a combinator which recognizes tokens and strips off whitespace.

Look into https://github.com/hbr/fmlib/blob/master/src/parse/test_json.ml to see an example with a simple json parser on how it works.

How to write a parser

Write the parser using Fmlib_parse.Token_parser to write the parser which uses Token.t as the primitive tokens. Look into the same example as above.

How to wire the lexer and the parser

Use Fmlib_parse.Parse_with_lexer to generate the final parser which scans a stream of characters breaks the input up into tokens by using the lexer and analyzes the grammar by using the token parser. See same example as above.

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_overview.html b/odoc/fmlib_parse/parse_overview.html new file mode 100644 index 00000000..4916b06e --- /dev/null +++ b/odoc/fmlib_parse/parse_overview.html @@ -0,0 +1,32 @@ + +parse_overview (fmlib_parse.parse_overview)

Overview

Up

Features

The parsers of this library implement parsers for Parsing Expression Grammars with parsing combinators. They have the following main features:

  • Like all combinator parsers (e.g. like parsec of Haskell) you have the full flexibility of a functional language. There is no preprocessing step where the parser has to be generated from the grammar.
  • All parsers are incremental and work in push mode. You can parse part of the input stream, look into the state of the parser. Store the parser at different locations and resume parsing at any location in the input stream.
  • It is possible to parse indentation sensitive grammars.

These features in combination are to the best of our knowledge unique in Fmlib_parse.

Parsing expression grammars are very similar to context free grammers. There are two main differences:

  • The choice between alternatives is biased. I.e. if parsing of the first alternative succeeds, then the next one is not parsed.
  • Left recursion is forbidden.

Accepting these restrictions leads to fairly efficient parser which can be implemented directly in a functional language.

Main Modules

All parsers in this library are combinator parsers.

All parsers are functors which need some other modules to be instantiated. All parsers have to be instantiated with the following modules:

  • Final: The type Final.t is the type of the final construct which the parser returns after successful parsing.
  • State: The type State.t is any type of state which the user wants to read, write or update during parsing. It can be accessed at any time. If the user does not need a state, then the module Unit of ocaml's standard library can be used.
  • Semantic: During parsing the user is able to recognize semantic errors. There is a function fail error which let the parser fail with a semantic error with the error object of type Semantic.t.

E.g. if you want to write a parser which parses a stream of characters then you should write a module which looks like

module State =
+struct
+    type t = ...        (* your user state *)
+    ...
+end
+
+module Final =
+struct
+    type t = ...        (* type of the final construct *)
+    ...
+end
+
+module Semantic =
+struct
+    type t = ...        (* type of semantic error *)
+    ...
+end
+
+module Basic = Fmlib_parse.Character.Make (State) (Final) (Semantic)
+
+open Basic
+
+...

After that you write combinators starting from the basic combinators of Basic until you have a combinator which represents a parser for the whole input stream i.e. a combinator of type Final.t Basic.t. Finally you use Basic.make to generate the actual parser of type Basic.Parser.t. The next sections show how to work with combinators and how to generate the actual parser.

Combinators

The grammar is described by combinators. A combinator of type 'a t returns an object of type 'a after successful parsing.

Basic Combinators

There are the following basic combinators:

  • return: 'a -> 'a t The combinator return 5 immediately succeeds without consuming tokens with the value 5.
  • fail: Semantic.t -> 'a t The combinator fail "Division by zero" immediately fails with the corresponding semantic error message (assuming Semantic = String).

As the name implies combinators can be combined to form more complex combinators.

Sequencing

If we have the combinators p: 'a t, q: 'a -> 'b t and r: 'a -> 'b -> 'c t and a function f: 'a -> 'b -> 'c -> 'd then we can form

let* a = p in
+let* b = q a in
+let* c = r a b in
+return (f a b c)

which is a combinator of type 'd t. This combinator describes a parser which first parses p. In case of success p returns the value a. Then the parser described by q a is exectuted which returns in case of success the value b. The the parser described by r a b is executed which returns in case of success the value c. Then the parser succeeds by returning f a b c.

Choice

In order to describe syntactic alternatives there is the choice operator </>: 'a t -> 'a t -> ' t. If we have combinators p: 'a t, q: 'a t and r: 'a t then the combinator

p </> q </> r

starts by using the combinator p. If p succeeds the whole choice succeeds. If p fails without consuming tokens, the parsing resumes with the combinator q. If it succeeds then the whole choice succeeds. If q fails without consuming tokens, then the last combinator r is used.

The expression p </> q is a biased choice, because the first alternative has priority. If the first alternative succeeds the next one is not tried.

If one of the alternatives in a biased choice fails after consuming some token, then the whole construct fails. Backtracking is needed (see next section) to restore consumed tokens.

Repetition

If you have a combinator p of type 'a t which parses a certain construct, it is often necessary to parse a sequence of one or more or zero or more repetitions of the construct. All parsers have combinators to parse repetitions of a given combinator. E.g.

list_zero_or_more p

parses zero or more occurrences of the constructs parsed by p and returns them in a list. There are more combinators which parse repetitions like one_or_more, skip_one_or_more, zero_or_more, one_or_more_separated ... All these combinators can be found in Fmlib_parse.Interfaces.COMBINATOR.

Operator Expressions

Recognizing operator expressions with unary and binary operators are a very common task for parsers. It is not very complicated to make a combinator recognizing operator expressions by using a combinator of basic combinators. However many cases can be parsed by using the combinator operator_expression.

This combinator needs combinators to

  • parse parentheses
  • parse unary and binary operators like -, +, *, ...
  • parse primary expressions

Usually primary expressions are constants, identifiers or functions applied to arguments.

Furthermore combinators are needed which

  • decide the precedence and associativity of operators
  • make unary and binary expressions from the operator and the operand(s).

The calculator example shows a simple but typical use case for this combinator.

Backtracking

Sometimes it is not possible for a combinator to fail without consuming some token. This is the case, if the first token is not sufficient to decide whether the alternative is the correct one.

In order to make such a parser fail without consuming any token it can be wrapped with the backtracking combinator. If the combinator p fails after consuming one or more tokens, then backtrack p expect fails with the expectation expect without consuming any token. The consumed tokens are pushed back to the lookahead and the original state is reestablished.

Backtracking has a cost because the consumed tokens have to be buffered and the original state has to be stored. The most efficient parsers do not use backtracking. However sometimes it is inevitable to backtrack.

State

Every parser can be instantiated with a state module. In compilers typically a symbol table is part of the state.

There are combinators to access the state during parsing. Some examples:

  • get: State.t t Get the state.
  • put: State.t -> unit t Set the state.
  • update: (State.t -> State.t) -> unit t Update the state.

E.g. a source file in a programming language consists of a sequence of definitions. After successful parsing of a definition the new definition can be added to the state with the following code:

let* (name, def) = definition   (* parse a definition *)
+in
+update
+    (State.add_definition name def)

where the module State has a function with the signature add_definition: string -> definition -> t -> t.

Make a Parser

Let's assume we have a combinator c with the type Final.t t. Then

make state c

generates a parser of type Basic.Parser.t. Let's assume p is the generated parser. Then we have the following functions to inspect the parser p:

  • Basic.Parser.needs_more p: Does the parser p need more tokens?
  • Basic.Parser.state p: The state of the parser.
  • Basic.Parser.has_result p: Has the parser p succeeded or failed?
  • Basic.Parser.has_succeeded p: Has the parser p succeeded?
  • Basic.Parser.final p: The final result of the parser. Requires that the parser has succeeded.

In order to handle errors there are the following functions:

  • Basic.Parser.has_failed_syntax p: Has the parser p failed with a syntax error?
  • Basic.Parser.failed_expectations p: The list of failed expectations.
  • Basic.Parser.has_failed_semantic p: Has the parser p failed with a semantic error?
  • Basic.Parser.failed_semantic p: The encountered semantic error.

In order to push tokens into the parser p we have the function

Basic.Parser.put token p

The function returns a new parser which has either consumed the token successfully and needs more tokens or has a result (success or failure).

At the end of the token stream there is the function

Basic.Parser.put_end p

The function returns a new parser. After encountering the end, a result is available, either success or failure.

Note the inversion of control. The generated parser does not read from an input stream. Instead of reading from an input stream tokens are pushed into the parser.

Tokens can be pushed even after the parser has a result. The not needed tokens are just pushed as lookahead tokens and can be recovered by Basic.Parser.lookaheads p.

After signalling the end by put_end p to the parser, it is no longer allowed to push tokens into the parser.

Running the Parser on Streams

The generated parsers have inversion of control. However it is not necessary to use the inversion of control. A character parser can be run on a string or on an input channel.

Basic.Parser.run_on_string "..." p
+
+Basic.Parser.run_channel ic p   (* 'ic' is an input channel *)

Up

\ No newline at end of file diff --git a/odoc/fmlib_parse/parse_recursion.html b/odoc/fmlib_parse/parse_recursion.html new file mode 100644 index 00000000..21b2e16e --- /dev/null +++ b/odoc/fmlib_parse/parse_recursion.html @@ -0,0 +1,38 @@ + +parse_recursion (fmlib_parse.parse_recursion)

Recursion in Combinators

Up API

Grammars are usually recursive. Combinators have to be recursive as well in order to reflect the recursiveness of grammars properly.

Combinator parsers implement parsing expression grammars and not context free grammars. The main differences of parsing expression grammars to context free grammars are:

  • Choice is biased (if the first alternative succeeds, then other alternatives are not tried).
  • Left recursion is not allowed.

Users are usually happy about the biased choice because this avoids a lot of ambiguity which can happen in context free grammars.

However it is easy to fall into the trap of left recursion which leads to an infinite recursion when implemented with combinator parsing.

This section describes the basic rule which avoids left recursion:

Never call a combinator recursively when the recursive call is not guarded.

Guarded Recursion

What does guarded recursion mean?

Suppose you want to write a recursive combinator crec which you want to call recursively in the body. Then the combinator has to have the structure

let rec crec arg1 arg2 ...
+    =
+    let* a = p in   (* 'p' has to consume at least one token in case
+                        of success. *)
+    crec ...        (* guarded recursive call *)

The same applies to mutually recursive functions. At any position of a recursive call, the call has to be guarded. I.e. before starting a new recursion loop at least one token has to be consumed.

Since let* and (>>=) are the same operators just with different syntactic sugar, the following code is valid as well.

let rec crec arg1 arg2 ...
+    =
+    p >>= (fun a -> crec ...)

The parser described by the combinator p has to consume at least one token. In case of success it returns some a. With that result the function fun a -> +crec ... is called. Therefore the recursive call does not happen before at least one token has been consumed.

Repetition Example

All parsers in the library have combinators which parse sequences of zero or more and sequences of one or more items. We implement here a constructor to parse zero or more items of type 'a returned by a combinator p as a list of 'as.

zero_or_more (p: 'a t): 'a list t =
+    let rec many lst =
+        (
+            let* a = p  (* 'p' has to consume at least one token *)
+            in
+            many (a :: lst) (* guarded recursive call *)
+        )
+        </>
+        return (List.rev lst)
+    in
+    many []

Here the combinator many starts by parsing one item by using the combinator p.

In case of success it adds the item in front of the list does the same again.

In case of failure there are no more items in the input stream and therefore the combinator returns the list. It has to reverse the list because the later items have been pushed to the front of the list.

The above code reflects the grammar rule

    sequence ::=
+        empty
+        |
+        item sequence

which avoids left recursion.

Mutual Recursion

In mutually recursive functions the guard condition is the same. Before closing a recursion loop at least one token has to be consumed. The following code describes schematically a valid mutual recursion where the guard condition is satisfied.

let rec crec1 ... =
+    ( ... )
+    </>
+    crec2 ...               (* unguarded call; ok *)
+
+and crec2 ... =
+    crec3 ...               (* unguarded call; ok *)
+    </>
+    (
+        let* b = q ...      (* guard consuming tokens *)
+        let* c = crec2 ...  (* guarded recursive call *)
+        ...
+    )
+
+and crec3 ... =
+    let* a = p ...          (* guard consuming tokens *)
+    let* b = crec1 ...      (* guarded recursive call   *)

Up API

\ No newline at end of file diff --git a/odoc/fmlib_pretty/Fmlib_pretty/Print/index.html b/odoc/fmlib_pretty/Fmlib_pretty/Print/index.html new file mode 100644 index 00000000..24ffc9b2 --- /dev/null +++ b/odoc/fmlib_pretty/Fmlib_pretty/Print/index.html @@ -0,0 +1,5 @@ + +Print (fmlib_pretty.Fmlib_pretty.Print)

Module Fmlib_pretty.Print

Pretty Printer: Generate nicely formatted ascii text.

Documentation

Pretty Printing Overview

API

Types

type doc

A document which can be pretty printed.

type t

A pretty printed document as a readable character stream.

type item = char

The item type in the readable stream is char.

Layout a Document

val layout : int -> doc -> t

layout width doc Layout the document doc with a the line width into a character stream.

val layout_with_ribbon : int -> int -> doc -> t

layout width ribbon doc Layout the document doc with a the line width and the ribbon width. Note: width is the complete line width and ribbon is the line width minus the indentation of the current line.

Character Stream

val has_more : t -> bool

has_more s Does the stream s have more characters to read? 

val peek : t -> char

peek s The next character in the stream s.

Precondition: has_more s

val advance : t -> t

advance s The character stream s advanced by one position. I.e. the first character popped off the stream.

Precondition: has_more s

val string_of : t -> string

string_of s A string representation of the stream s.

val write_to_channel : Stdlib.out_channel -> t -> unit

write_to_channel oc s Write the stream s to the output channel oc.

Document Combinators

This section describes all combinators which can be used to generate documents and combine them into bigger documents.

Basic Combinators

val empty : doc

An empty document.

val text : string -> doc

text str A document with the unbreakable string str. It is highly recommended that the string does not contain newlines. Newlines in a text string confuse the layouter.

val substring : string -> int -> int -> doc

substring str start length A document with the unbreakable string str starting at position start and having length.

val char : char -> doc

char c A document with the character c.

val fill : int -> char -> doc

fill n c A document with n repetitions of the character c.

val break : string -> doc

break str A break hint with the alternative text str.

val space : doc

space A break hint with a blank as alternative text.

val cut : doc

cut A break hint with an empty alternative text.

val (<+>) : doc -> doc -> doc

doc1 <+> doc2 Concatentate the documents doc1 and doc2.

val (>>) : doc -> (unit -> doc) -> doc

doc >> lazy_doc Concatenate the document doc with the lazy document lazy_doc.

val group : doc -> doc

group doc

Treat all break hints belonging directly to doc consistently. Either print all as newlines or print all with their alternative text.

This is the basic operation to decide break hints.

If the whole group and all text which follows until the next break hint after the group fits on a line, then all break hints (directly or indirectly) in the group are flattened i.e. printed with their alternative texts.

If the whole group does not fit, then all break hints belonging directly to the group are printed as effective newlines. The break hints of inner groups are considered separately.

val nest : int -> doc -> doc

nest n doc

The document doc indented by n blanks.

This is the basic function to indicate a substructure to the pretty printer. The substructure is indented with respect to the parent document.

The indentation is valid after each effective line break. It is usually convenient to group the whole substructure and put a break hint before the group and group the parent structure and the substructure. This makes sure that either the parent and the child fit on a line or the child begins on a newline and is indented. See the function parent_child below which does exactly that.

val with_width : int -> doc -> doc

with_width n doc Format the document doc with line width.

Use this combinator if you want to format the internal document doc with a different line width than the overall document.

val with_ribbon : int -> doc -> doc

with_ribbon n doc Format the document doc with ribbon width.

Use this combinator if you want to format the internal document doc with a different ribbon width than the overall document.

Convenience Combinators

val parent_child : string -> int -> doc -> doc -> doc

parent_child hint indent parent child

Put the parent and the child in a group and separate them by a break hint with the alternative text hint. Furthermore put the child in a separate group.

Equivalent to

parent
+<+> break hint
+<+> nest indent (group child)
+|> group
val cat : doc list -> doc

cat list Concatenate all documents in the list of documents.

val separated_by : doc -> doc list -> doc

separated_by sep list Concatenate all documents in the list of documents separated by sep.

val pack : string -> doc list -> doc

pack str list Pack as much documents of the list of documents as possible into a line. I.e. separate all documents by a break hint with str as an alternative text.

val stack : string -> doc list -> doc

stack str list The same as separated_by (break str) list.

val stack_or_pack : string -> doc list -> doc

stack_or_pack str list Separate all documents of the list by a break hint with alternative text str and either print all break hints as newlines of with the alternative text str.

val wrap_words : string -> doc

wrap_words str Split the string str into words (words are substrings of str not containing blanks) and pack as many of them onto a line.

val paragraphs : doc list -> doc

paragraphs ps

Print the paragraphs in ps separated by newlines. The function works best if each paragraph ends in a newline. paragraphs ps is equivalent to separated_by cut ps.

\ No newline at end of file diff --git a/odoc/fmlib_pretty/Fmlib_pretty/index.html b/odoc/fmlib_pretty/Fmlib_pretty/index.html new file mode 100644 index 00000000..86d83f9d --- /dev/null +++ b/odoc/fmlib_pretty/Fmlib_pretty/index.html @@ -0,0 +1,2 @@ + +Fmlib_pretty (fmlib_pretty.Fmlib_pretty)

Module Fmlib_pretty

Pretty Print

module Print : sig ... end

Pretty Printer: Generate nicely formatted ascii text.

\ No newline at end of file diff --git a/odoc/fmlib_pretty/index.html b/odoc/fmlib_pretty/index.html new file mode 100644 index 00000000..c3cd529a --- /dev/null +++ b/odoc/fmlib_pretty/index.html @@ -0,0 +1,2 @@ + +index (fmlib_pretty.index)

Generate nicely formatted ascii text

\ No newline at end of file diff --git a/odoc/fmlib_pretty/pretty.html b/odoc/fmlib_pretty/pretty.html new file mode 100644 index 00000000..109b4244 --- /dev/null +++ b/odoc/fmlib_pretty/pretty.html @@ -0,0 +1,105 @@ + +pretty (fmlib_pretty.pretty)

Pretty Printing Overview

Up API

Basics

The pretty printer allows to print nicely formatted ascii text. The user generates a document with break hints. The primitives to generate documents are

  • empty Empty document.
  • text str Document which contains the string str. str should not contain newlines in order not to interfere with the formatter.
  • break str Break hint with alternative text str.
  • doc2 <+> doc2 Concatenation of the documents doc1 and doc2
  • nest indent doc Indented document.
  • group doc Treat all top level break hints of doc consistently i.e. either print all break hints with their alternative text or as a newline.

With these primitives a surprisingly rich set of formattings can be made.

The user generates documents not only by using the primitives. There are a lot of convenience functions to make document generation easy.

Document creation is done lazily. Only very few resources are consumed in producing a document. The work starts with the layout function. The layout function does the layout and never buffers more than one line.

Layout is done lazily as well. The layout generates a stream of characters. Lines are formatted only if the characters of the line are pulled out of the stream.

If you just create a document and layout it but you never use the stream, then no work is done.

Term Printing

The usage of the pretty printer is best explained by an example. Suppose we want to print the function application f a b (g c d) e where the function names and arguments might have different length. We create a document which represents the structure by

let doc =
+    group (
+        text "f" <+> space <+>
+        indent
+            2
+            (stack_or_pack
+                " "
+                [text "a";
+                 text "b";
+                 group (
+                     text "(g" <+> space <+>
+                     indent
+                        2
+                        (stack_or_pack " " [text "c"; text "d"])
+                     <+> text ")");
+                 text "e"])
+    )

where text "blabla" is a document with some unbreakable text, <+> concatenates two documents, space is a break hint whose alternative text is a blank, stack_or_pack atxt [...] stacks a list of documents separated by a break hint with the alternative text atxt.

The command

let stream = layout 5 doc 

creates a stream of characters which is nicely formatted using a desired line width of 5 characters. Since 5 characters are not enough to put any of the subterms completely on a line, the output is

123456789012345
+f
+  a
+  b
+  (g
+    c
+    d)
+  d

i.e. each break hint is printed as a newline.

If we give the pretty printer a line width of 10, it could pack the application g c d on a line and print

123456789012345
+f
+  a
+  b
+  (g c d)
+  d

If the pretty printer has enough line width e.g. a line width of 15, it can put the whole expression on a line.

123456789012345
+f a b (g c d) d

By using stack_or_pack we instructed the pretty printer to either print all break hints as newlines or all break hints with their alternative texts. If we use pack instead of stack_or_pack, the pretty printer tries to pack as many arguments as possible on a line.

E.g. with a line width of 11 and using pack instead of stack_or_pack we get the output

123456789012345
+f
+  a b
+  (g c d) d

With a line width of 10 and using pack we get

123456789012345
+f
+  a b
+  (g c d)
+  d

because the pretty printer cannot pack (g c d) and d on a single line.

Character Stream

The basic type t of the pretty printer is a lazy character stream. I.e. characters are only generated if needed. The pretty printer implements the interface Fmlib_std.Interfaces.SOURCE to represent a character stream. You can ask the stream has_more r whether there are more characters in the stream and peek r to get the next character. The instruction advance r returns the stream r advanced by one character position.

The pretty printer has a function string_of r to return a string representation of the character stream.

However you very rarely need a string representation of a character stream. All functions in Fmlib are able to handle character streams.

Formatted Paragraphs

There are functions to generate formatted paragraphs with indentation.

let words =
+    wrap_words "bla bla bla bla bla bla bla" <+> cut
+
+let doc = paragraphs [
+    words;
+    words;
+    nest 4 words;
+    words;
+]
+
+let stream = layout 16 doc

The stream produces the following output

12345678901234567890
+
+bla bla bla bla
+bla bla bla
+
+bla bla bla bla
+bla bla bla
+
+    bla bla bla
+    bla bla bla
+    bla
+
+bla bla bla bla
+bla bla bla

Generate Documents

Clearly, it is tedious to write documents by hand. Usually you have some tree like structure and you want to generate a document from the tree structure.

Let's assume you have a tree structure like

type tree =
+    { name: string; children: tree list; }
+
+let leaf (name: string): tree =
+    {name; children = [] }
+
+let tree (name: string) (children: tree list): tree =
+    {name; children}

Write a function which converts the tree structure to a document.

let doc_of_tree (tree: tree): doc =
+    let rec doc is_top tree =
+        match tree.children with
+        | [] ->
+            text tree.name
+        | _ ->
+            let d =
+                parent_child
+                    " " 2
+                    (text tree.name)
+                    (children tree.children ())
+            in
+            if is_top then
+                d
+            else
+                char '(' <+> d <+> char ')'
+    and children lst () =
+        match lst with
+        | [last] ->
+            doc false last
+        | head :: tail ->
+            doc false head <+> space
+            >> children tail    (* Lazy concatenation!! *)
+        | [] ->
+            assert false (* 'lst' is never empty *)
+    in
+    doc true tree

Then the simple command

tree
+    "f"
+    [leaf "a";
+     leaf "b";
+     tree "g" [leaf "c"; leaf "d"];
+     leaf "e"]
+|> layout 10

generates the character stream

123456789012345
+f
+  a
+  b
+  (g c d)
+  e

Note the usage of the lazy concatentation operator >> in the recursive part of the function handling the children. This makes sure that even if the tree structure is hugh, the iteration over it is done only on demand. I.e. recursive calls are made only if the corresponding characters are needed when processing the character stream.

Up API

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Array/Map/argument-1-Key/index.html b/odoc/fmlib_std/Fmlib_std/Array/Map/argument-1-Key/index.html new file mode 100644 index 00000000..f499bb75 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Array/Map/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (fmlib_std.Fmlib_std.Array.Map.Key)

Parameter Map.Key

type t

Type of elements which have a linear order.

val compare : t -> t -> int

compare a b Compare the values a and b, both of type t. Return values:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Array/Map/index.html b/odoc/fmlib_std/Fmlib_std/Array/Map/index.html new file mode 100644 index 00000000..3b7a2e58 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Array/Map/index.html @@ -0,0 +1,2 @@ + +Map (fmlib_std.Fmlib_std.Array.Map)

Module Array.Map

A map based on arrays

Parameters

Signature

include Interfaces.MAP with type key = Key.t
type key = Key.t

Type of the keys

type 'a t

Type of a map with keys of type key and values of type 'a.

val is_empty : 'a t -> bool

Is the map empty?

val cardinal : 'a t -> int

cardinal map The cardinality of the map i.e. the number of key value pairs in the map.

val fold_left : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accue key value yielding a new accumulator by consuming one key value pair.

val fold_right : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu key value yielding a new accumulator by consuming one key value pair.

val bindings : 'a t -> (key * 'a) list

The list of key value pairs in the map in ascending order.

val find_opt : key -> 'a t -> 'a option

find_opt key map

Find the value which is bound to the key key in the map map. Return None if no value is bound to key.

val empty : 'a t

The empty map.

val add : key -> 'a -> 'a t -> 'a t

add key value map Add the key value pair key, value to the map. If the map has already a key value pair with the key key then overwrite the old value with the new value.

val remove : key -> 'a t -> 'a t

remove key map Remove the key value pair with the key key from the map map. If the key is not present, then do nothing.

val update : key -> ('a option -> 'a option) -> 'a t -> 'a t

update key f map

Update the value bound to the key key in the map map by the update function f. If no value is bound to key then f None is called. If value is bound to key then f (Some value) is called.

If f returns None then no value is added and the old binding is deleted (if it existed before).

If f return Some new_value then the old value is updated, if existed, or the new value is added if no old value existed before.

val pair : int -> 'a t -> Key.t * 'a

pair i map The ith key value pair of map.

Precondition: 0 <= i && i < cardinal map

val singleton : Key.t -> 'a -> 'a t

singleton key value The map with the only key value pair (key,value).

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Array/Set/argument-1-Key/index.html b/odoc/fmlib_std/Fmlib_std/Array/Set/argument-1-Key/index.html new file mode 100644 index 00000000..3c16badd --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Array/Set/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (fmlib_std.Fmlib_std.Array.Set.Key)

Parameter Set.Key

type t

Type of elements which have a linear order.

val compare : t -> t -> int

compare a b Compare the values a and b, both of type t. Return values:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Array/Set/index.html b/odoc/fmlib_std/Fmlib_std/Array/Set/index.html new file mode 100644 index 00000000..65d69b61 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Array/Set/index.html @@ -0,0 +1,2 @@ + +Set (fmlib_std.Fmlib_std.Array.Set)

Module Array.Set

A set based on arrays

Parameters

Signature

include Interfaces.SET with type item = Key.t
type item = Key.t

Type of elements of the set.

type t

Type of the set of elements of type item.

val is_empty : t -> bool

Is the set empty?

val cardinal : t -> int

The cardinality of the set i.e. the number of its elements.

val mem : item -> t -> bool

mem element set Is element a member of the set set?

val fold_left : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val fold_right : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val elements : t -> item list

The elements of the set in ascending order returned as a list.

val empty : t

The empty set.

val add : item -> t -> t

add element set Add the element element to the set set. If the element is already in the set, then do nothing.

val remove : item -> t -> t

remove element set Remove the element element from the set set. If the element is not in the set, then do nothing.

val element : int -> t -> Key.t

element i set The ith element of the set.

val index_of : Key.t -> t -> int option

index_of e set Compute the index of the element e within the set set, if e is in the set.

val singleton : Key.t -> t

singleton e The singleton set with the only element e.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Array/index.html b/odoc/fmlib_std/Fmlib_std/Array/index.html new file mode 100644 index 00000000..4789d2c1 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Array/index.html @@ -0,0 +1,9 @@ + +Array (fmlib_std.Fmlib_std.Array)

Module Fmlib_std.Array

A thin wrapper around Stdlib.Array with additional functions and sets and maps based on arrays

Use Stdlib.Array in case you need functions which are not contained in this module. There are no problems using Fmlib_std.Array and Stdlib.Array, because both datatypes are identical.

Futhermore there are the modules Set and Map which implement finite sets and finite maps based on sorted arrays. For small sets and maps, the array based implementations are superior to tree based implementations like avl trees or red black trees, because they have a better cache behaviour.

Basic Array Functions

type 'a t = 'a array
val length : 'a t -> int

length arr The length of the array arr.

val valid_index : int -> 'a t -> bool

valid_index i arr Is i a valid index into the array arr?

val is_empty : 'a t -> bool

Is the array empty?

val has_some : 'a t -> bool

Does the array have at least one element?

val get : 'a t -> int -> 'a

get arr i The ith element of the array arr.

Precondition: 0 <= i && i < length [arr]

val first : 'a t -> 'a

first xs The first element of the array xs.

Precondition: has_some xs

val last : 'a t -> 'a

last xs The last element of the array xs.

Precondition: has_some xs

val set : 'a t -> int -> 'a -> unit

set arr i value Set the ith element of the array arr to value.

Precondition: 0 <= i && i < length [arr]

val make : int -> 'a -> 'a t

Same as Stdlib.Array.make

val init : int -> (int -> 'a) -> 'a t

Same as Stdlib.Array.init

val append : 'a t -> 'a t -> 'a t

append xs ys Concatenate the two arrays xs and ys.

val insert : int -> 'a -> 'a t -> 'a t

insert i x xs Insert the element x at position i into the array xs.

Make place by pushing up the elements i, i + 1, ... one position.

Precondition: 0 <= i && i <= length xs.

val replace : int -> 'a -> 'a t -> 'a t

replace i x xs Replace the ith element of xs by x.

Precondition. 0 <= i && i < length xs

val remove : int -> 'a t -> 'a t

remove i xs Remove the ith element from the array xs.

Precondition: 0 <= i && i < length xs.

val remove_first : 'a t -> 'a t

remove_first xs Remove the first element from the array xs.

Precondition: has_some xs

val remove_last : 'a t -> 'a t

remove_last xs Remove the last element from the array xs.

Precondition: has_some xs

val map : ('a -> 'b) -> 'a t -> 'b t

map f arr Create a new array by mapping all elements of the original array by the function f.

val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

fold_left f start arr

Fold the folding function f with start value start over the array arr.

Compute

(f (... (f (f start arr.(0)) arr.(1)) ...) arr.(n - 1)

where n = length arr.

val foldi_left : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'a

foldi_left f start arr

Like fold_left with the current index as an additional argument to the folding function.

val fold_right : ('b -> 'a -> 'a) -> 'b array -> 'a -> 'a

fold_right f arr start

Compute

f arr.(0) (f arr.(1) ( ... (f arr.(n - 1) start) ... ))

where n = length arr

val copy : 'a t -> 'a t

Make a copy of the array.

val sub : 'a t -> int -> int -> 'a t

sub arr start len The subarray of arr starting at start with lenght len.

Precondition: 0 <= start && start + len <= length arr

val blit : 'a t -> int -> 'a t -> int -> int -> unit

blit src src_pos dst dst_pos len

Copy len values from array src starting at src_pos to array dst starting at dst_pos.

val find : ('a -> bool) -> 'a t -> int option

find p arr

Find the element satisfying the predicate p in the array arr. Return None if no such element exists.

val for_all : ('a -> bool) -> 'a t -> bool

for_all p arr

Do all elements of the array arr satisfy the predicate p?

val exists : ('a -> bool) -> 'a t -> bool

exists p arr

Exists an element of the array arr which satisfies the predicate p?

val push : 'a -> 'a t -> 'a t

push a arr Push element a to the rear end of the array arr.

val push_front : 'a -> 'a t -> 'a t

push_front a arr Push element a to the front end of the array arr.

val to_list : 'a t -> 'a list

to_list arr Convert the array arr to a list with the same content.

val of_list : 'a list -> 'a array

of_list lst Convert the list lst to an array with the same content.

val binsearch : + ('key -> 'key -> int) -> + ('a -> 'key) -> + 'key -> + 'a t -> + int * bool

binsearch compare key_of key arr

Search the position of key in arr. Assume that the array arr is sorted without duplicates. It returns the pair position, exact_flag with the meaning

exact_flag          =>      key = key_of arr.(position)
+
+not exact_flag      =>      key < key_of arr.(position)

Corner case: position = length arr, exact_flg = false. This corresponds to a fictitious key of +infinity at the illegal position length arr.

The array arr consists of elements of type 'a. The function key_of extracts a key from an element of the array. The keys are compared using the comparison function compare with the usual meaning:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

Sets and Maps based on arrays

module Set (Key : Interfaces.SORTABLE) : sig ... end

A set based on arrays

module Map (Key : Interfaces.SORTABLE) : sig ... end

A map based on arrays

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/argument-1-Value/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/argument-1-Value/index.html new file mode 100644 index 00000000..bb3b8715 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/argument-1-Value/index.html @@ -0,0 +1,2 @@ + +Value (fmlib_std.Fmlib_std.Btree.Map.Source.Value)

Parameter Source.Value

type t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/index.html new file mode 100644 index 00000000..19987594 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Map/Source/index.html @@ -0,0 +1,2 @@ + +Source (fmlib_std.Fmlib_std.Btree.Map.Source)

Module Map.Source

Module which satisfies the interface Interfaces.SOURCE

Parameters

Signature

type 'a map = 'a t

Standard API

include Interfaces.SOURCE with type item = Key.t * Value.t
type item = Key.t * Value.t

Type of items coming from the source.

type t

t A stream of items.

val has_more : t -> bool

has_more s Does the stream s have more items?

val peek : t -> item

peek s Peek the next item from the stream s.

Precondition: has_more s

val advance : t -> t

advance s Pop the top item off the stream s.

Precondition: has_more s

Create a stream

val make : Value.t map -> t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Map/argument-1-Key/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Map/argument-1-Key/index.html new file mode 100644 index 00000000..ed686e6a --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Map/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (fmlib_std.Fmlib_std.Btree.Map.Key)

Parameter Map.Key

type t

Type of elements which have a linear order.

val compare : t -> t -> int

compare a b Compare the values a and b, both of type t. Return values:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Map/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Map/index.html new file mode 100644 index 00000000..b38ee5da --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Map/index.html @@ -0,0 +1,2 @@ + +Map (fmlib_std.Fmlib_std.Btree.Map)

Module Btree.Map

A finite map implemented by a B tree.

Parameters

Signature

Map API

include Interfaces.MAP with type key = Key.t
type key = Key.t

Type of the keys

type 'a t

Type of a map with keys of type key and values of type 'a.

val is_empty : 'a t -> bool

Is the map empty?

val cardinal : 'a t -> int

cardinal map The cardinality of the map i.e. the number of key value pairs in the map.

val fold_left : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accue key value yielding a new accumulator by consuming one key value pair.

val fold_right : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu key value yielding a new accumulator by consuming one key value pair.

val bindings : 'a t -> (key * 'a) list

The list of key value pairs in the map in ascending order.

val find_opt : key -> 'a t -> 'a option

find_opt key map

Find the value which is bound to the key key in the map map. Return None if no value is bound to key.

val empty : 'a t

The empty map.

val add : key -> 'a -> 'a t -> 'a t

add key value map Add the key value pair key, value to the map. If the map has already a key value pair with the key key then overwrite the old value with the new value.

val remove : key -> 'a t -> 'a t

remove key map Remove the key value pair with the key key from the map map. If the key is not present, then do nothing.

val update : key -> ('a option -> 'a option) -> 'a t -> 'a t

update key f map

Update the value bound to the key key in the map map by the update function f. If no value is bound to key then f None is called. If value is bound to key then f (Some value) is called.

If f returns None then no value is added and the old binding is deleted (if it existed before).

If f return Some new_value then the old value is updated, if existed, or the new value is added if no old value existed before.

Stream of key value pairs

All key value pairs of a finite map can be considered as a sorted list of key value pairs. It is possible to iterate over this sequence with the help of the function fold_left. However this function performs the whole iteration.

Sometimes it is desirable to iterate over the sequence of the sorted key value pairs and keep the control over the iteration. For that purpose it is convenient to have the finite map as a stream of key value pairs.

type 'a source

Type of a stream of key value pairs.

val make_source : 'a t -> 'a source

Convert the map into a stream of key value pairs.

val has_more : 'a source -> bool

Has the stream of key value pairs more elements?

val peek : 'a source -> Key.t * 'a

The next key value pair of the stream.

val advance : 'a source -> 'a source

advances source Advance the stream by one element.

Precondition: has_more source

module Source (Value : Interfaces.ANY) : sig ... end

Module which satisfies the interface Interfaces.SOURCE

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Set/Source/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Set/Source/index.html new file mode 100644 index 00000000..64693d58 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Set/Source/index.html @@ -0,0 +1,2 @@ + +Source (fmlib_std.Fmlib_std.Btree.Set.Source)

Module Set.Source

type set = t

Standard API

include Interfaces.SOURCE with type item = Key.t
type item = Key.t

Type of items coming from the source.

type t

t A stream of items.

val has_more : t -> bool

has_more s Does the stream s have more items?

val peek : t -> item

peek s Peek the next item from the stream s.

Precondition: has_more s

val advance : t -> t

advance s Pop the top item off the stream s.

Precondition: has_more s

Create a stream

val make : set -> t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Set/argument-1-Key/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Set/argument-1-Key/index.html new file mode 100644 index 00000000..b14e6ecd --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Set/argument-1-Key/index.html @@ -0,0 +1,2 @@ + +Key (fmlib_std.Fmlib_std.Btree.Set.Key)

Parameter Set.Key

type t

Type of elements which have a linear order.

val compare : t -> t -> int

compare a b Compare the values a and b, both of type t. Return values:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/Set/index.html b/odoc/fmlib_std/Fmlib_std/Btree/Set/index.html new file mode 100644 index 00000000..8a1fd254 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/Set/index.html @@ -0,0 +1,2 @@ + +Set (fmlib_std.Fmlib_std.Btree.Set)

Module Btree.Set

A finite set implemented by a B tree.

Parameters

Signature

Set API

include Interfaces.SET with type item = Key.t
type item = Key.t

Type of elements of the set.

type t

Type of the set of elements of type item.

val is_empty : t -> bool

Is the set empty?

val cardinal : t -> int

The cardinality of the set i.e. the number of its elements.

val mem : item -> t -> bool

mem element set Is element a member of the set set?

val fold_left : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val fold_right : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val elements : t -> item list

The elements of the set in ascending order returned as a list.

val empty : t

The empty set.

val add : item -> t -> t

add element set Add the element element to the set set. If the element is already in the set, then do nothing.

val remove : item -> t -> t

remove element set Remove the element element from the set set. If the element is not in the set, then do nothing.

Stream of elements

module Source : sig ... end
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Btree/index.html b/odoc/fmlib_std/Fmlib_std/Btree/index.html new file mode 100644 index 00000000..8ed19021 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Btree/index.html @@ -0,0 +1,2 @@ + +Btree (fmlib_std.Fmlib_std.Btree)

Module Fmlib_std.Btree

Sets and maps based on B trees.

module Set (Key : Interfaces.SORTABLE) : sig ... end

A finite set implemented by a B tree.

module Map (Key : Interfaces.SORTABLE) : sig ... end

A finite map implemented by a B tree.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Deque/index.html b/odoc/fmlib_std/Fmlib_std/Deque/index.html new file mode 100644 index 00000000..c39b3066 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Deque/index.html @@ -0,0 +1,2 @@ + +Deque (fmlib_std.Fmlib_std.Deque)

Module Fmlib_std.Deque

A double ended queue. Insert from both ends, pop only from the front.

type _ t

'a t A double ended queue with element type 'a.

val is_empty : _ t -> bool

is_empty q Is the queue q empty?

val has_some : _ t -> bool

has_some q Does the queue have elements?

val empty : _ t

empty The empty queue.

val push_front : 'a -> 'a t -> 'a t

push_front e q Push the element e to the front of the queue q.

val push_rear : 'a -> 'a t -> 'a t

push_rear e q Push the element e to the rear of the queue q.

val pop_front : 'a t -> ('a * 'a t) option

pop_front q Pop the front element.

val update_first : ('a -> 'a) -> 'a t -> 'a t

update_first f q Update the first element of the queue q with the update function f.

val update_last : ('a -> 'a) -> 'a t -> 'a t

update_last f q Update the last element of the queue q with the update function f.

val to_list : 'a t -> 'a list

to_list q Convert the queue q to a list.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Int/index.html b/odoc/fmlib_std/Fmlib_std/Int/index.html new file mode 100644 index 00000000..fd32d8a0 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Int/index.html @@ -0,0 +1,2 @@ + +Int (fmlib_std.Fmlib_std.Int)

Module Fmlib_std.Int

Module to represent the type int

type t = int
val compare : t -> t -> int

compare i j compare the two numbers i and j.

val iterate : t -> ('a -> 'a) -> 'a -> 'a

iterate n f start iterates the function f n times on the start value start.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/index.html new file mode 100644 index 00000000..013ca47a --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/index.html @@ -0,0 +1,2 @@ + +Interfaces (fmlib_std.Fmlib_std.Interfaces)

Module Fmlib_std.Interfaces

Standard Module Types

module type ANY = sig ... end

Interface for a module which has a type t.

module type MAP = sig ... end

Interface for a finite map i.e. a set of key value pairs.

module type MONAD = sig ... end

Interface for a module with a monadic container.

module type SET = sig ... end

Interface for a finite set.

module type SORTABLE = sig ... end

Interface for a sortable type. A type is sortable, if it has a comparison function.

module type SOURCE = sig ... end

Interface for a source of items i.e. a stream.

module type SINK = sig ... end

Interface for a sink of items.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-ANY/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-ANY/index.html new file mode 100644 index 00000000..d0ff1698 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-ANY/index.html @@ -0,0 +1,2 @@ + +ANY (fmlib_std.Fmlib_std.Interfaces.ANY)

Module type Interfaces.ANY

Interface for a module which has a type t.

type t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MAP/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MAP/index.html new file mode 100644 index 00000000..e1524e6f --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MAP/index.html @@ -0,0 +1,2 @@ + +MAP (fmlib_std.Fmlib_std.Interfaces.MAP)

Module type Interfaces.MAP

Interface for a finite map i.e. a set of key value pairs.

type key

Type of the keys

type 'a t

Type of a map with keys of type key and values of type 'a.

val is_empty : 'a t -> bool

Is the map empty?

val cardinal : 'a t -> int

cardinal map The cardinality of the map i.e. the number of key value pairs in the map.

val fold_left : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accue key value yielding a new accumulator by consuming one key value pair.

val fold_right : ('accu -> key -> 'a -> 'accu) -> 'accu -> 'a t -> 'accu

fold_left f start map

Fold the bindings in the map map from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu key value yielding a new accumulator by consuming one key value pair.

val bindings : 'a t -> (key * 'a) list

The list of key value pairs in the map in ascending order.

val find_opt : key -> 'a t -> 'a option

find_opt key map

Find the value which is bound to the key key in the map map. Return None if no value is bound to key.

val empty : 'a t

The empty map.

val add : key -> 'a -> 'a t -> 'a t

add key value map Add the key value pair key, value to the map. If the map has already a key value pair with the key key then overwrite the old value with the new value.

val remove : key -> 'a t -> 'a t

remove key map Remove the key value pair with the key key from the map map. If the key is not present, then do nothing.

val update : key -> ('a option -> 'a option) -> 'a t -> 'a t

update key f map

Update the value bound to the key key in the map map by the update function f. If no value is bound to key then f None is called. If value is bound to key then f (Some value) is called.

If f returns None then no value is added and the old binding is deleted (if it existed before).

If f return Some new_value then the old value is updated, if existed, or the new value is added if no old value existed before.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MONAD/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MONAD/index.html new file mode 100644 index 00000000..1359d9a1 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-MONAD/index.html @@ -0,0 +1,2 @@ + +MONAD (fmlib_std.Fmlib_std.Interfaces.MONAD)

Module type Interfaces.MONAD

Interface for a module with a monadic container.

type _ t

'a t is a monadic container with elements of type 'a.

val return : 'a -> 'a t

return a puts the elements a into a monadic container.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

m >> f extracts elements of of the monadic container m and applies the function f to them which puts them back into a monadic container.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* a = m in f a is the same as m >>= f.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SET/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SET/index.html new file mode 100644 index 00000000..1fbaa348 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SET/index.html @@ -0,0 +1,2 @@ + +SET (fmlib_std.Fmlib_std.Interfaces.SET)

Module type Interfaces.SET

Interface for a finite set.

type item

Type of elements of the set.

type t

Type of the set of elements of type item.

val is_empty : t -> bool

Is the set empty?

val cardinal : t -> int

The cardinality of the set i.e. the number of its elements.

val mem : item -> t -> bool

mem element set Is element a member of the set set?

val fold_left : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from left to right i.e. lexically ascending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val fold_right : ('accu -> item -> 'accu) -> 'accu -> t -> 'accu

fold_left f start set

Fold the elements of the set set from right to left i.e. lexically descending using the start value start for the accumulator and the folding function f where f is applied f accu element yielding a new accumulator value by consuming one element.

val elements : t -> item list

The elements of the set in ascending order returned as a list.

val empty : t

The empty set.

val add : item -> t -> t

add element set Add the element element to the set set. If the element is already in the set, then do nothing.

val remove : item -> t -> t

remove element set Remove the element element from the set set. If the element is not in the set, then do nothing.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SINK/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SINK/index.html new file mode 100644 index 00000000..67532690 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SINK/index.html @@ -0,0 +1,2 @@ + +SINK (fmlib_std.Fmlib_std.Interfaces.SINK)

Module type Interfaces.SINK

Interface for a sink of items.

type item

Type of items to be received by the sink.

type t

t A sink for items.

val needs_more : t -> bool

needs_more s Is the sink s able to accept more items?

val put : item -> t -> t

put item sink Put the item to the sink.

Precondition: needs_more sink.

val put_end : t -> t

put_end sink signals to the sink that there are no more items coming.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SORTABLE/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SORTABLE/index.html new file mode 100644 index 00000000..8e0476e3 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SORTABLE/index.html @@ -0,0 +1,2 @@ + +SORTABLE (fmlib_std.Fmlib_std.Interfaces.SORTABLE)

Module type Interfaces.SORTABLE

Interface for a sortable type. A type is sortable, if it has a comparison function.

type t

Type of elements which have a linear order.

val compare : t -> t -> int

compare a b Compare the values a and b, both of type t. Return values:

compare a b < 0 if and only if a < b

compare a b = 0 if and only if a = b

compare a b > 0 if and only if a > b

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SOURCE/index.html b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SOURCE/index.html new file mode 100644 index 00000000..42bd64fb --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Interfaces/module-type-SOURCE/index.html @@ -0,0 +1,2 @@ + +SOURCE (fmlib_std.Fmlib_std.Interfaces.SOURCE)

Module type Interfaces.SOURCE

Interface for a source of items i.e. a stream.

type item

Type of items coming from the source.

type t

t A stream of items.

val has_more : t -> bool

has_more s Does the stream s have more items?

val peek : t -> item

peek s Peek the next item from the stream s.

Precondition: has_more s

val advance : t -> t

advance s Pop the top item off the stream s.

Precondition: has_more s

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/List/Monadic/argument-1-M/index.html b/odoc/fmlib_std/Fmlib_std/List/Monadic/argument-1-M/index.html new file mode 100644 index 00000000..2e301853 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/List/Monadic/argument-1-M/index.html @@ -0,0 +1,2 @@ + +M (fmlib_std.Fmlib_std.List.Monadic.M)

Parameter Monadic.M

type _ t

'a t is a monadic container with elements of type 'a.

val return : 'a -> 'a t

return a puts the elements a into a monadic container.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

m >> f extracts elements of of the monadic container m and applies the function f to them which puts them back into a monadic container.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* a = m in f a is the same as m >>= f.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/List/Monadic/index.html b/odoc/fmlib_std/Fmlib_std/List/Monadic/index.html new file mode 100644 index 00000000..c0eefb95 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/List/Monadic/index.html @@ -0,0 +1,11 @@ + +Monadic (fmlib_std.Fmlib_std.List.Monadic)

Module List.Monadic

Monadic list functions

Parameters

Signature

val fold_left : ('a -> 'b -> 'b M.t) -> 'a t -> 'b -> 'b M.t

fold_left f lst start leftfolds the function f over the list lst starting with the value start. Continuation of the fold is determined by the bind operator >>= of the monad M. E.g. if the monad M is Option the folding stops as soon as f e acc returns the value None.

fold_left f [a b c ...] s =
+  M.(f a s   >>= fun acc ->
+     f b acc >>= fun acc ->
+     f c acc >>= fun acc ->
+     ...)
val fold_right : ('a -> 'b -> 'b M.t) -> 'a t -> 'b -> 'b M.t

The same as fold_left just right folding.

fold_right f [... x y z] s =
+fold_left f (rev [... x y z]) s =
+  M.(f z s   >>= fun acc ->
+     f y acc >>= fun acc ->
+     f x acc >>= fun acc ->
+     ...)
val foldi_left : (int -> 'a -> 'b -> 'b M.t) -> 'a t -> 'b -> 'b M.t

The same as fold_left except that the folding function receives the position of the first argument in the list as an additional argument.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/List/index.html b/odoc/fmlib_std/Fmlib_std/List/index.html new file mode 100644 index 00000000..cef1ad27 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/List/index.html @@ -0,0 +1,4 @@ + +List (fmlib_std.Fmlib_std.List)

Module Fmlib_std.List

A thin wrapper around Stdlib.List which avoids throwing exceptions and with some additional monadic functions.

In case you need functions from the module List of the ocaml standard library, just use Stdlib.List

List Monad

type 'a t = 'a list

A list of values of type 'a.

val return : 'a -> 'a t

return a makes a singleton list with the element a.

val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

l >>= f applies the function f to all elements of the list l and concatenates all lists.

val let* : 'a t -> ('a -> 'b t) -> 'b t

let* a = m in f a is equivalent to m >>= f.

val (>=>) : ('a -> 'b t) -> ('b -> 'c t) -> 'a -> 'c t

f >=> g composes the two monadic functions f and g.

val (<*>) : ('a -> 'b) t -> 'a t -> 'b t

flst <*> lst is equivalent to flst >>= fun f -> map f lst i.e. it maps all functions contained in flst over the list lst and then concatenates the results.

val join : 'a list list -> 'a list

join is the same as concat.

Modified list functions

val find : ('a -> bool) -> 'a t -> 'a option

find p l finds an element e in the list l which satisfies p e.

List functions from Stdlib

val append : 'a list -> 'a list -> 'a list

append a b concatenate the lists a and b.

Synonym a @ b.

val concat : 'a list list -> 'a list

concat ll concatenates all lists contained in the list of lists ll.

val split : ('a * 'b) list -> 'a list * 'b list

Transform a list of pairs into a pair of lists.

val rev : 'a list -> 'a list

rev a reverses the list a.

val rev_append : 'a list -> 'a list -> 'a list

rev_append a b prepends the lists rev a in front of the list b.

val length : 'a t -> int

length l The length of the list l.

val filter : ('a -> bool) -> 'a t -> 'a t

filter p l Returns a list with all the elements of l which satisfy the predicate p.

val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a

fold_left f s l

Compute f (f ... (f a b1) ... bn-1) bn where l = [b1; ...; bn-1; bn]

val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b

like fold_left, just iterate from right to left.

val map : ('a -> 'b) -> 'a list -> 'b list

map f l returns a list where all elements of l are mapped by the function f.

val mapi : (int -> 'a -> 'b) -> 'a list -> 'b list

mapi f l map all elements of the list l with the mapping function f which receives the index of the element (starting at zero) and the element.

val rev_map : ('a -> 'b) -> 'a list -> 'b list

rev_map f l The same as map (rev l). rev_map is tail recursive.

val for_all : ('a -> bool) -> 'a list -> bool

for_all p l checks, if all elements in the list l satisfy the predicate p.

val exists : ('a -> bool) -> 'a list -> bool

exists p l checks, if some element in the list l satisfies the predicate p.

Additional list functions

val split_head_tail : 'a t -> 'a * 'a t

split_head_tail l split the list in its head and tail part.

Precondition: The list is not empty.

val map_and_filter : ('a -> 'b option) -> 'a list -> 'b list

map_and_filter f list maps the list with f and removes the element for which f e = None.

val split_at : ('a -> bool) -> 'a t -> 'a t * 'a t

split_at p lst scans the list until it finds the first element satisfying p and returns the prefix and the remainder starting at the encountered element. If the second list is empty, then there is no element in the list satisfying p.

val transpose : 'a list list -> 'a list list

transpose list_of_rows returns the list of columns.

Preconditions:

  • The list of rows must not be empty.
  • All rows in the list of rows must not be empty and have the same length.

Example:

transpose [ [1; 2; 3]; [4; 5; 6] ]
+=
+[ [1; 4]; [2; 5]; [3; 6] ]

Monadic list functions

module Monadic (M : Interfaces.MONAD) : sig ... end

Monadic list functions

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Option/index.html b/odoc/fmlib_std/Fmlib_std/Option/index.html new file mode 100644 index 00000000..7dd99041 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Option/index.html @@ -0,0 +1,6 @@ + +Option (fmlib_std.Fmlib_std.Option)

Module Fmlib_std.Option

Optional elements of a certain type.

type 'a t = 'a option

'a t Type of an optional object of type 'a

val return : 'a -> 'a t

return a Equivalent to Some a.

val fail : 'a t

Equivalent to None.

val let* : 'a t -> ('a -> 'b t) -> 'b t

Chaining of operations which return optional elements.

Example:

let* a = op1 ... in (* 'op1 ... ' returns an optional element *)
+let* b = op2 ... in
+let* c = op3 ... in
+...
+return (f a b c ...)
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t

opt >>= f Equivalent to let* v = opt in f v.

val map : ('a -> 'b) -> 'a t -> 'b t

map f m Map the element of m by f, if exists.

val to_list : 'a t -> 'a list

to_list a Returns a one element list or an empty list.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Rb_array/index.html b/odoc/fmlib_std/Fmlib_std/Rb_array/index.html new file mode 100644 index 00000000..7a3497d0 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Rb_array/index.html @@ -0,0 +1,2 @@ + +Rb_array (fmlib_std.Fmlib_std.Rb_array)

Module Fmlib_std.Rb_array

A Radix Balanced Array. A functional long array which allows fast random access, fast insertion and deletion at the rear end.

In functional programming lists are one of the most pervasive datastructures. They allow fast insertion and deletion at one end (in case of lists at the front end). But they have one disadvantage: Randow access is very expensive. In order to retrieve the ith element a procedure of time complexity i is needed.

Arrays allow fast random access. However insertion and deletion is expensive, because copying and shifting of the elements is required to insert or delete elements. The performance hit can be significant for long arrays.

However insertion and deletion in arrays is cheap as long the array fits into the cache line of a modern microprocessor.

The radix balanced array stores the information within array chunks which are not bigger than a cache line (usually 32 machine words or more on todays microprocessors).

In order to have a fast random access a radix balanced tree structure is used where each interior node fits into a cache line as well.

E.g. in radix balanced arrays it is possible to access individual elements of the array with 3 indirections if the array has one million elements.

type 'a t

A radix balanced array storing elements of type 'a.

val length : 'a t -> int

The number of elements in the array.

val is_empty : 'a t -> bool

Is the array empty?

val has_some : 'a t -> bool

Is there at least one element in the array?

val first : 'a t -> 'a

first t The first element of the array t.

Precondition: has_some t

val last : 'a t -> 'a

last t The last element of the array t.

Precondition: has_some t

val element : int -> 'a t -> 'a

element i t The ith element of the array t.

Precondition: i < length t

val empty : 'a t

The empty array.

val replace : int -> 'a -> 'a t -> 'a t

replace i e t Replace the ith element of the array t by the new element e.

Precondition: i < length t

val push : 'a -> 'a t -> 'a t

push e t Append the element e at the rear end of the array t.

val pop : 'a t -> 'a * 'a t

pop t Pop the last element off the array t and return the pair consisting of the last element and the array where the last element has been removed.

Precondition: has_some t

val pop_opt : 'a t -> ('a * 'a t) option

pop t Pop the last element off the array t and return the pair consisting of the last element and the array where the last element has been removed. Return None in case the array t is empty.

val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b t -> 'a

fold_left f start t Fold the array t from left to right using the folding function f with start value start.

Same as fold_left on lists and plain arrays.

val foldi_left : ('a -> int -> 'b -> 'a) -> 'a -> 'b t -> 'a

Like fold_left with the current element index as an additional argument.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Result/Monad/argument-1-E/index.html b/odoc/fmlib_std/Fmlib_std/Result/Monad/argument-1-E/index.html new file mode 100644 index 00000000..092a9f5d --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Result/Monad/argument-1-E/index.html @@ -0,0 +1,2 @@ + +E (fmlib_std.Fmlib_std.Result.Monad.E)

Parameter Monad.E

type t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Result/Monad/index.html b/odoc/fmlib_std/Fmlib_std/Result/Monad/index.html new file mode 100644 index 00000000..ec87fe2c --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Result/Monad/index.html @@ -0,0 +1,2 @@ + +Monad (fmlib_std.Fmlib_std.Result.Monad)

Module Result.Monad

The result type encapsulated in a module which satisfies the monadic interface.

Parameters

module E : Interfaces.ANY

Signature

type 'a t = ('a, E.t) Stdlib.result
val return : 'a -> 'a t
val fail : E.t -> 'a t
val to_option : 'a t -> 'a option
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
val let* : 'a t -> ('a -> 'b t) -> 'b t
\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Result/index.html b/odoc/fmlib_std/Fmlib_std/Result/index.html new file mode 100644 index 00000000..8929bc3c --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Result/index.html @@ -0,0 +1,40 @@ + +Result (fmlib_std.Fmlib_std.Result)

Module Fmlib_std.Result

Result: Handling results of operations which can fail

Overview

Operations returning a result type can be used to have some functional exception handling.

Let's say that you have some operatios returning a result object.

let op1 ...  : (int,    error) result  = ...
+let op2 ...  : (char,   error) result = ...
+let op3 ...  : (string, error) result = ...
+let op3 ...  : (t,      error) result = ...

You can chain these operations by concentrating on the success case only and handling the error case at the end of the chain.

match
+    let* i = op1 ...  in
+    let* c = op2 ... i ...  in
+    let* s = op3 ... i ... c ...  in
+    op4 ... i ... c ... s
+with
+| Ok x ->
+    (* Handling of the success case *)
+| Error e ->
+    (* Handling of the error case which might have
+       occurred in any of the steps *)

A simple example:

type 'a r = ('a, string) result
+
+let add (a: int r) (b: int r): int r =
+    let* x = a in
+    let* y = b in
+    Ok (x + y)
+
+let divide (a: int r) (b: int r): int r =
+    let* x = a in
+    let* y = b in
+    if y = 0 then
+        Error "Division by Zero"
+    else
+        Ok (x / y)
+
+assert (
+    add (Ok 1) (divide (Ok 2) (Ok 0))
+    =
+    Error "Division by Zero"
+)
+
+assert (
+    add (Ok 1) (divide (Ok 10) (Ok 2))
+    =
+    Ok 6
+)

API

type ('a, 'e) t = ('a, 'e) Stdlib.result

'a is the result type in case of success and 'e is the result type in case of failure. It is implemented by the ocaml type result from the ocaml standard library.

val return : 'a -> ('a, 'e) t

return a Equivalent to Ok a.

val fail : 'e -> ('a, 'e) t

fail e Equivalent to Error e.

val to_option : ('a, 'e) t -> 'a option

to_option r Map r to an optional element i.e. Some a in case of Ok a and None in case of Error _.

val (>>=) : ('a, 'e) t -> ('a -> ('b, 'e) t) -> ('b, 'e) t

m >>= f

maps success result m to f a. In case of an error result f is not called and the error remains.

val let* : ('a, 'e) t -> ('a -> ('b, 'e) t) -> ('b, 'e) t

let* a = m in f a is the same as m >>= f

val map : ('a -> 'b) -> ('a, 'e) t -> ('b, 'e) t

map f m Map the result in m via the function f.

val map_error : ('e -> 'f) -> ('a, 'e) t -> ('a, 'f) t

map_error f m Map the error in m via the function f.

val get : ('a, Void.t) t -> 'a

get m Get the ok content of a result object which cannot have errors.

Monad

module Monad (E : Interfaces.ANY) : sig ... end

The result type encapsulated in a module which satisfies the monadic interface.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/String/From_source/argument-1-S/index.html b/odoc/fmlib_std/Fmlib_std/String/From_source/argument-1-S/index.html new file mode 100644 index 00000000..884743d1 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/String/From_source/argument-1-S/index.html @@ -0,0 +1,2 @@ + +S (fmlib_std.Fmlib_std.String.From_source.S)

Parameter From_source.S

type item = char

Type of items coming from the source.

type t

t A stream of items.

val has_more : t -> bool

has_more s Does the stream s have more items?

val peek : t -> item

peek s Peek the next item from the stream s.

Precondition: has_more s

val advance : t -> t

advance s Pop the top item off the stream s.

Precondition: has_more s

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/String/From_source/index.html b/odoc/fmlib_std/Fmlib_std/String/From_source/index.html new file mode 100644 index 00000000..e6b6630c --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/String/From_source/index.html @@ -0,0 +1,2 @@ + +From_source (fmlib_std.Fmlib_std.String.From_source)

Module String.From_source

Conversion of a source of characters to a string.

Parameters

module S : Interfaces.SOURCE with type item = char

Signature

val make : S.t -> t

make s Convert the stream s of characters to a string.

val make_with_size : int -> S.t -> t

make_with_size n s Convert the stream s of characters to a string where n is an estimate of the length of the string.

The function works internally with a buffer. n is used to guide the buffer allocation and the resizing of the buffer. The better the estimate, the fewer buffer allocations and resizes are necessary.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/String/To_source/index.html b/odoc/fmlib_std/Fmlib_std/String/To_source/index.html new file mode 100644 index 00000000..5c5f52bc --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/String/To_source/index.html @@ -0,0 +1,2 @@ + +To_source (fmlib_std.Fmlib_std.String.To_source)

Module String.To_source

Conversion of a string to a source of characters.

include Interfaces.SOURCE with type item = char
type item = char

Type of items coming from the source.

type t

t A stream of items.

val has_more : t -> bool

has_more s Does the stream s have more items?

val peek : t -> item

peek s Peek the next item from the stream s.

Precondition: has_more s

val advance : t -> t

advance s Pop the top item off the stream s.

Precondition: has_more s

val make : string -> t

make str A character stream generated from the string str.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/String/index.html b/odoc/fmlib_std/Fmlib_std/String/index.html new file mode 100644 index 00000000..f2330d87 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/String/index.html @@ -0,0 +1,2 @@ + +String (fmlib_std.Fmlib_std.String)

Module Fmlib_std.String

A small wrapper around Stdlib.String with some extra functions.

Use Stdlib.String if you need functions from the ocaml standard library which are not in this module.

type t = string

A standard ocaml string.

val is_prefix : t -> t -> bool

is_prefix a b Is a a prefix of b?

val is_suffix : t -> t -> bool

is_suffix a b Is a a suffix of b?

val reverse : t -> t

reverse s reverses the string s.

val compare : t -> t -> int

compare s1 s2 Compare the strings s1 and s2.

Return -1, if s1 is lexicographically smaller than s2 Return 0, if both string are equal Return +1, if s1 is lexicographically greater than s2

val one : char -> t

one c A string with the character c as the only character.

val find : (char -> bool) -> int -> t -> int

find p start str Find the position of the first character starting from start in the string str which satisfies the predicate p. If no character can be found return the length of the string.

val has : (char -> bool) -> int -> t -> bool

has p start str Does the string str starting from position start have a character satisfying the predicate p?

val find_bwd : (char -> bool) -> int -> t -> int

find_bwd p beyond str Find the position of the first character before beyond in the string str which satisfies the predicate p. Return -1, if no character can be found.

val list : t -> char list

list str Convert the string str to a list of characters.

val of_list : char list -> t

of_list l Convert the list l of characters to a string.

val length : t -> int

length str The length of the string str.

val get : t -> int -> char

get str i The ith character of the string str.

Precondition: 0 <= i && i < length str

val sub : t -> int -> int -> t

sub str start len The substring of str starting at start with length len.

Precondition: 0 <= start <= start + len <= length str

val concat : string -> string list -> string

concat sep str_list Concatenate the strings in the string list str_list and put the separator sep between them.

val split_on_char : char -> string -> string list

split_on_char c str Split the string str on each occurrence of the character c into a list of strings.

val make : int -> char -> t

make n c Make a string with n copies of the character c.

val init : int -> (int -> char) -> t

init n f Make a string of length n where the ith character is f i.

module To_source : sig ... end

Conversion of a string to a source of characters.

module From_source (S : Interfaces.SOURCE with type item = char) : sig ... end

Conversion of a source of characters to a string.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/Void/index.html b/odoc/fmlib_std/Fmlib_std/Void/index.html new file mode 100644 index 00000000..a4f5cc76 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/Void/index.html @@ -0,0 +1,2 @@ + +Void (fmlib_std.Fmlib_std.Void)

Module Fmlib_std.Void

Void.t is the type of an object which cannot exist.

type t

Type of a nonexisting object.

val absurd : t -> 'a

absurd n Return an object of any type.

This function is possible, because there never can be an object n of type t.

\ No newline at end of file diff --git a/odoc/fmlib_std/Fmlib_std/index.html b/odoc/fmlib_std/Fmlib_std/index.html new file mode 100644 index 00000000..0fe52547 --- /dev/null +++ b/odoc/fmlib_std/Fmlib_std/index.html @@ -0,0 +1,2 @@ + +Fmlib_std (fmlib_std.Fmlib_std)

Module Fmlib_std

Standard Data Types.

Common Interfaces

module Interfaces : sig ... end

Standard Module Types

Data Types

module Array : sig ... end

A thin wrapper around Stdlib.Array with additional functions and sets and maps based on arrays

module Btree : sig ... end

Sets and maps based on B trees.

module Deque : sig ... end

A double ended queue. Insert from both ends, pop only from the front.

module Rb_array : sig ... end

A Radix Balanced Array. A functional long array which allows fast random access, fast insertion and deletion at the rear end.

module Int : sig ... end

Module to represent the type int

module List : sig ... end

A thin wrapper around Stdlib.List which avoids throwing exceptions and with some additional monadic functions.

module Option : sig ... end

Optional elements of a certain type.

module Result : sig ... end

Result: Handling results of operations which can fail

module String : sig ... end

A small wrapper around Stdlib.String with some extra functions.

module Void : sig ... end

Void.t is the type of an object which cannot exist.

\ No newline at end of file diff --git a/odoc/fmlib_std/index.html b/odoc/fmlib_std/index.html new file mode 100644 index 00000000..7fe8495b --- /dev/null +++ b/odoc/fmlib_std/index.html @@ -0,0 +1,6 @@ + +index (fmlib_std.index)

Standard Types

Fmlib_std is a library of standard types. It has a lot of thin wrappers around modules of ocaml's standard library like Fmlib_std.Array, Fmlib_std.List etc. with some additional functionality and it contains some types which are not part of ocaml's standard library like e.g. Fmlib_std.Deque, Fmlib_std.Btree.

Usage

Install the library via

    opam install fmlib_std

In order to compile program named foo with the help of dune write a dune file like

    (executable
+        (name foo)
+        (libraries fmlib_std ...)
+        ...
+    )

API

Fmlib_std

\ No newline at end of file diff --git a/odoc/index.html b/odoc/index.html new file mode 100644 index 00000000..2ebe4a86 --- /dev/null +++ b/odoc/index.html @@ -0,0 +1,24 @@ + + + + index + + + + + +
+
+

OCaml package documentation

+
    +
  1. fmlib
  2. +
  3. fmlib_browser
  4. +
  5. fmlib_js
  6. +
  7. fmlib_parse
  8. +
  9. fmlib_pretty
  10. +
  11. fmlib_std
  12. +
+
+
+ + \ No newline at end of file diff --git a/odoc/odoc.support/fonts/KaTeX_AMS-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 00000000..0acaaff0 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_AMS-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Caligraphic-Bold.woff2 b/odoc/odoc.support/fonts/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 00000000..f390922e Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 00000000..75344a1f Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 b/odoc/odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 00000000..395f28be Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Fraktur-Bold.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Fraktur-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 00000000..735f6948 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Fraktur-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Main-Bold.woff2 b/odoc/odoc.support/fonts/KaTeX_Main-Bold.woff2 new file mode 100644 index 00000000..ab2ad21d Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Main-Bold.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 b/odoc/odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 00000000..5931794d Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Main-BoldItalic.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Main-Italic.woff2 b/odoc/odoc.support/fonts/KaTeX_Main-Italic.woff2 new file mode 100644 index 00000000..b50920e1 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Main-Italic.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Main-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Main-Regular.woff2 new file mode 100644 index 00000000..eb24a7ba Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Main-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 b/odoc/odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 00000000..29657023 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Math-BoldItalic.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Math-Italic.woff2 b/odoc/odoc.support/fonts/KaTeX_Math-Italic.woff2 new file mode 100644 index 00000000..215c143f Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Math-Italic.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 b/odoc/odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 00000000..cfaa3bda Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_SansSerif-Bold.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 b/odoc/odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 00000000..349c06dc Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_SansSerif-Italic.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_SansSerif-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 00000000..a90eea85 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_SansSerif-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Script-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Script-Regular.woff2 new file mode 100644 index 00000000..b3048fc1 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Script-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Size1-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Size1-Regular.woff2 new file mode 100644 index 00000000..c5a8462f Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Size1-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Size2-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Size2-Regular.woff2 new file mode 100644 index 00000000..e1bccfe2 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Size2-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Size3-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Size3-Regular.woff2 new file mode 100644 index 00000000..249a2866 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Size3-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Size4-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Size4-Regular.woff2 new file mode 100644 index 00000000..680c1308 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Size4-Regular.woff2 differ diff --git a/odoc/odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 b/odoc/odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 00000000..771f1af7 Binary files /dev/null and b/odoc/odoc.support/fonts/KaTeX_Typewriter-Regular.woff2 differ diff --git a/odoc/odoc.support/highlight.pack.js b/odoc/odoc.support/highlight.pack.js new file mode 100644 index 00000000..a3731597 --- /dev/null +++ b/odoc/odoc.support/highlight.pack.js @@ -0,0 +1,461 @@ +/*! + Highlight.js v11.7.0 (git: 82688fad18) + (c) 2006-2022 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";var e={exports:{}};function t(e){ +return e instanceof Map?e.clear=e.delete=e.set=()=>{ +throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((n=>{var i=e[n] +;"object"!=typeof i||Object.isFrozen(i)||t(i)})),e} +e.exports=t,e.exports.default=t;class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function i(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function r(e,...t){const n=Object.create(null);for(const t in e)n[t]=e[t] +;return t.forEach((e=>{for(const t in e)n[t]=e[t]})),n} +const s=e=>!!e.scope||e.sublanguage&&e.language;class o{constructor(e,t){ +this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){ +this.buffer+=i(e)}openNode(e){if(!s(e))return;let t="" +;t=e.sublanguage?"language-"+e.language:((e,{prefix:t})=>{if(e.includes(".")){ +const n=e.split(".") +;return[`${t}${n.shift()}`,...n.map(((e,t)=>`${e}${"_".repeat(t+1)}`))].join(" ") +}return`${t}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(t)} +closeNode(e){s(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const a=(e={})=>{const t={children:[]} +;return Object.assign(t,e),t};class c{constructor(){ +this.rootNode=a(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const t=a({scope:e}) +;this.add(t),this.stack.push(t)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){ +return"string"==typeof t?e.addText(t):t.children&&(e.openNode(t), +t.children.forEach((t=>this._walk(e,t))),e.closeNode(t)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +c._collapse(e)})))}}class l extends c{constructor(e){super(),this.options=e} +addKeyword(e,t){""!==e&&(this.openNode(t),this.addText(e),this.closeNode())} +addText(e){""!==e&&this.add(e)}addSublanguage(e,t){const n=e.root +;n.sublanguage=!0,n.language=t,this.add(n)}toHTML(){ +return new o(this,this.options).value()}finalize(){return!0}}function g(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return p("(?=",e,")")} +function u(e){return p("(?:",e,")*")}function h(e){return p("(?:",e,")?")} +function p(...e){return e.map((e=>g(e))).join("")}function f(...e){const t=(e=>{ +const t=e[e.length-1] +;return"object"==typeof t&&t.constructor===Object?(e.splice(e.length-1,1),t):{} +})(e);return"("+(t.capture?"":"?:")+e.map((e=>g(e))).join("|")+")"} +function b(e){return RegExp(e.toString()+"|").exec("").length-1} +const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function E(e,{joinWith:t}){let n=0;return e.map((e=>{n+=1;const t=n +;let i=g(e),r="";for(;i.length>0;){const e=m.exec(i);if(!e){r+=i;break} +r+=i.substring(0,e.index), +i=i.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?r+="\\"+(Number(e[1])+t):(r+=e[0], +"("===e[0]&&n++)}return r})).map((e=>`(${e})`)).join(t)} +const x="[a-zA-Z]\\w*",w="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",_="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",O="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},N={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},M=(e,t,n={})=>{const i=r({scope:"comment",begin:e,end:t, +contains:[]},n);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const s=f("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:p(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},S=M("//","$"),R=M("/\\*","\\*/"),j=M("#","$");var A=Object.freeze({ +__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:x,UNDERSCORE_IDENT_RE:w, +NUMBER_RE:y,C_NUMBER_RE:_,BINARY_NUMBER_RE:O, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const t=/^#![ ]*\// +;return e.binary&&(e.begin=p(t,/.*\b/,e.binary,/\b.*/)),r({scope:"meta",begin:t, +end:/$/,relevance:0,"on:begin":(e,t)=>{0!==e.index&&t.ignoreMatch()}},e)}, +BACKSLASH_ESCAPE:v,APOS_STRING_MODE:N,QUOTE_STRING_MODE:k,PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:R,HASH_COMMENT_MODE:j, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},C_NUMBER_MODE:{scope:"number", +begin:_,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:O,relevance:0}, +REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, +end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, +contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:x,relevance:0}, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:w,relevance:0},METHOD_GUARD:{ +begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{ +t.data._beginMatch!==e[1]&&t.ignoreMatch()}})});function I(e,t){ +"."===e.input[e.index-1]&&t.ignoreMatch()}function T(e,t){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function L(e,t){ +t&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=I,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function B(e,t){ +Array.isArray(e.illegal)&&(e.illegal=f(...e.illegal))}function D(e,t){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function H(e,t){ +void 0===e.relevance&&(e.relevance=1)}const P=(e,t)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const n=Object.assign({},e);Object.keys(e).forEach((t=>{delete e[t] +})),e.keywords=n.keywords,e.begin=p(n.beforeMatch,d(n.begin)),e.starts={ +relevance:0,contains:[Object.assign(n,{endsParent:!0})] +},e.relevance=0,delete n.beforeMatch +},C=["of","and","for","in","not","or","if","then","parent","list","value"] +;function $(e,t,n="keyword"){const i=Object.create(null) +;return"string"==typeof e?r(n,e.split(" ")):Array.isArray(e)?r(n,e):Object.keys(e).forEach((n=>{ +Object.assign(i,$(e[n],t,n))})),i;function r(e,n){ +t&&(n=n.map((e=>e.toLowerCase()))),n.forEach((t=>{const n=t.split("|") +;i[n[0]]=[e,U(n[0],n[1])]}))}}function U(e,t){ +return t?Number(t):(e=>C.includes(e.toLowerCase()))(e)?0:1}const z={},K=e=>{ +console.error(e)},W=(e,...t)=>{console.log("WARN: "+e,...t)},X=(e,t)=>{ +z[`${e}/${t}`]||(console.log(`Deprecated as of ${e}. ${t}`),z[`${e}/${t}`]=!0) +},G=Error();function Z(e,t,{key:n}){let i=0;const r=e[n],s={},o={} +;for(let e=1;e<=t.length;e++)o[e+i]=r[e],s[e+i]=!0,i+=b(t[e-1]) +;e[n]=o,e[n]._emit=s,e[n]._multi=!0}function F(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=E(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=E(e.end,{joinWith:""})}})(e)}function V(e){ +function t(t,n){ +return RegExp(g(t),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(n?"g":"")) +}class n{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,t){ +t.position=this.position++,this.matchIndexes[this.matchAt]=t,this.regexes.push([t,e]), +this.matchAt+=b(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=t(E(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const t=this.matcherRe.exec(e);if(!t)return null +;const n=t.findIndex(((e,t)=>t>0&&void 0!==e)),i=this.matchIndexes[n] +;return t.splice(0,n),Object.assign(t,i)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const t=new n +;return this.rules.slice(e).forEach((([e,n])=>t.addRule(e,n))), +t.compile(),this.multiRegexes[e]=t,t}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,t){ +this.rules.push([e,t]),"begin"===t.type&&this.count++}exec(e){ +const t=this.getMatcher(this.regexIndex);t.lastIndex=this.lastIndex +;let n=t.exec(e) +;if(this.resumingScanAtSamePosition())if(n&&n.index===this.lastIndex);else{ +const t=this.getMatcher(0);t.lastIndex=this.lastIndex+1,n=t.exec(e)} +return n&&(this.regexIndex+=n.position+1, +this.regexIndex===this.count&&this.considerAll()),n}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=r(e.classNameAliases||{}),function n(s,o){const a=s +;if(s.isCompiled)return a +;[T,D,F,P].forEach((e=>e(s,o))),e.compilerExtensions.forEach((e=>e(s,o))), +s.__beforeBegin=null,[L,B,H].forEach((e=>e(s,o))),s.isCompiled=!0;let c=null +;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), +c=s.keywords.$pattern, +delete s.keywords.$pattern),c=c||/\w+/,s.keywords&&(s.keywords=$(s.keywords,e.case_insensitive)), +a.keywordPatternRe=t(c,!0), +o&&(s.begin||(s.begin=/\B|\b/),a.beginRe=t(a.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), +s.end&&(a.endRe=t(a.end)), +a.terminatorEnd=g(a.end)||"",s.endsWithParent&&o.terminatorEnd&&(a.terminatorEnd+=(s.end?"|":"")+o.terminatorEnd)), +s.illegal&&(a.illegalRe=t(s.illegal)), +s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((t=>r(e,{ +variants:null},t)))),e.cachedVariants?e.cachedVariants:q(e)?r(e,{ +starts:e.starts?r(e.starts):null +}):Object.isFrozen(e)?r(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{n(e,a) +})),s.starts&&n(s.starts,o),a.matcher=(e=>{const t=new i +;return e.contains.forEach((e=>t.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&t.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&t.addRule(e.illegal,{type:"illegal"}),t})(a),a}(e)}function q(e){ +return!!e&&(e.endsWithParent||q(e.starts))}class J extends Error{ +constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}} +const Y=i,Q=r,ee=Symbol("nomatch");var te=(t=>{ +const i=Object.create(null),r=Object.create(null),s=[];let o=!0 +;const a="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let g={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function b(e){ +return g.noHighlightRe.test(e)}function m(e,t,n){let i="",r="" +;"object"==typeof t?(i=e, +n=t.ignoreIllegals,r=t.language):(X("10.7.0","highlight(lang, code, ...args) has been deprecated."), +X("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +r=e,i=t),void 0===n&&(n=!0);const s={code:i,language:r};k("before:highlight",s) +;const o=s.result?s.result:E(s.language,s.code,n) +;return o.code=s.code,k("after:highlight",o),o}function E(e,t,r,s){ +const c=Object.create(null);function l(){if(!N.keywords)return void M.addText(S) +;let e=0;N.keywordPatternRe.lastIndex=0;let t=N.keywordPatternRe.exec(S),n="" +;for(;t;){n+=S.substring(e,t.index) +;const r=y.case_insensitive?t[0].toLowerCase():t[0],s=(i=r,N.keywords[i]);if(s){ +const[e,i]=s +;if(M.addText(n),n="",c[r]=(c[r]||0)+1,c[r]<=7&&(R+=i),e.startsWith("_"))n+=t[0];else{ +const n=y.classNameAliases[e]||e;M.addKeyword(t[0],n)}}else n+=t[0] +;e=N.keywordPatternRe.lastIndex,t=N.keywordPatternRe.exec(S)}var i +;n+=S.substring(e),M.addText(n)}function d(){null!=N.subLanguage?(()=>{ +if(""===S)return;let e=null;if("string"==typeof N.subLanguage){ +if(!i[N.subLanguage])return void M.addText(S) +;e=E(N.subLanguage,S,!0,k[N.subLanguage]),k[N.subLanguage]=e._top +}else e=x(S,N.subLanguage.length?N.subLanguage:null) +;N.relevance>0&&(R+=e.relevance),M.addSublanguage(e._emitter,e.language) +})():l(),S=""}function u(e,t){let n=1;const i=t.length-1;for(;n<=i;){ +if(!e._emit[n]){n++;continue}const i=y.classNameAliases[e[n]]||e[n],r=t[n] +;i?M.addKeyword(r,i):(S=r,l(),S=""),n++}}function h(e,t){ +return e.scope&&"string"==typeof e.scope&&M.openNode(y.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,y.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +S=""):e.beginScope._multi&&(u(e.beginScope,t),S="")),N=Object.create(e,{parent:{ +value:N}}),N}function p(e,t,i){let r=((e,t)=>{const n=e&&e.exec(t) +;return n&&0===n.index})(e.endRe,i);if(r){if(e["on:end"]){const i=new n(e) +;e["on:end"](t,i),i.isMatchIgnored&&(r=!1)}if(r){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return p(e.parent,t,i)}function f(e){ +return 0===N.matcher.regexIndex?(S+=e[0],1):(I=!0,0)}function b(e){ +const n=e[0],i=t.substring(e.index),r=p(N,e,i);if(!r)return ee;const s=N +;N.endScope&&N.endScope._wrap?(d(), +M.addKeyword(n,N.endScope._wrap)):N.endScope&&N.endScope._multi?(d(), +u(N.endScope,e)):s.skip?S+=n:(s.returnEnd||s.excludeEnd||(S+=n), +d(),s.excludeEnd&&(S=n));do{ +N.scope&&M.closeNode(),N.skip||N.subLanguage||(R+=N.relevance),N=N.parent +}while(N!==r.parent);return r.starts&&h(r.starts,e),s.returnEnd?0:n.length} +let m={};function w(i,s){const a=s&&s[0];if(S+=i,null==a)return d(),0 +;if("begin"===m.type&&"end"===s.type&&m.index===s.index&&""===a){ +if(S+=t.slice(s.index,s.index+1),!o){const t=Error(`0 width match regex (${e})`) +;throw t.languageName=e,t.badRule=m.rule,t}return 1} +if(m=s,"begin"===s.type)return(e=>{ +const t=e[0],i=e.rule,r=new n(i),s=[i.__beforeBegin,i["on:begin"]] +;for(const n of s)if(n&&(n(e,r),r.isMatchIgnored))return f(t) +;return i.skip?S+=t:(i.excludeBegin&&(S+=t), +d(),i.returnBegin||i.excludeBegin||(S=t)),h(i,e),i.returnBegin?0:t.length})(s) +;if("illegal"===s.type&&!r){ +const e=Error('Illegal lexeme "'+a+'" for mode "'+(N.scope||"")+'"') +;throw e.mode=N,e}if("end"===s.type){const e=b(s);if(e!==ee)return e} +if("illegal"===s.type&&""===a)return 1 +;if(A>1e5&&A>3*s.index)throw Error("potential infinite loop, way more iterations than matches") +;return S+=a,a.length}const y=O(e) +;if(!y)throw K(a.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const _=V(y);let v="",N=s||_;const k={},M=new g.__emitter(g);(()=>{const e=[] +;for(let t=N;t!==y;t=t.parent)t.scope&&e.unshift(t.scope) +;e.forEach((e=>M.openNode(e)))})();let S="",R=0,j=0,A=0,I=!1;try{ +for(N.matcher.considerAll();;){ +A++,I?I=!1:N.matcher.considerAll(),N.matcher.lastIndex=j +;const e=N.matcher.exec(t);if(!e)break;const n=w(t.substring(j,e.index),e) +;j=e.index+n} +return w(t.substring(j)),M.closeAllNodes(),M.finalize(),v=M.toHTML(),{ +language:e,value:v,relevance:R,illegal:!1,_emitter:M,_top:N}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:Y(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:j, +context:t.slice(j-100,j+100),mode:n.mode,resultSoFar:v},_emitter:M};if(o)return{ +language:e,value:Y(t),illegal:!1,relevance:0,errorRaised:n,_emitter:M,_top:N} +;throw n}}function x(e,t){t=t||g.languages||Object.keys(i);const n=(e=>{ +const t={value:Y(e),illegal:!1,relevance:0,_top:c,_emitter:new g.__emitter(g)} +;return t._emitter.addText(e),t})(e),r=t.filter(O).filter(N).map((t=>E(t,e,!1))) +;r.unshift(n);const s=r.sort(((e,t)=>{ +if(e.relevance!==t.relevance)return t.relevance-e.relevance +;if(e.language&&t.language){if(O(e.language).supersetOf===t.language)return 1 +;if(O(t.language).supersetOf===e.language)return-1}return 0})),[o,a]=s,l=o +;return l.secondBest=a,l}function w(e){let t=null;const n=(e=>{ +let t=e.className+" ";t+=e.parentNode?e.parentNode.className:"" +;const n=g.languageDetectRe.exec(t);if(n){const t=O(n[1]) +;return t||(W(a.replace("{}",n[1])), +W("Falling back to no-highlight mode for this block.",e)),t?n[1]:"no-highlight"} +return t.split(/\s+/).find((e=>b(e)||O(e)))})(e);if(b(n))return +;if(k("before:highlightElement",{el:e,language:n +}),e.children.length>0&&(g.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),g.throwUnescapedHTML))throw new J("One of your code blocks includes unescaped HTML.",e.innerHTML) +;t=e;const i=t.textContent,s=n?m(i,{language:n,ignoreIllegals:!0}):x(i) +;e.innerHTML=s.value,((e,t,n)=>{const i=t&&r[t]||n +;e.classList.add("hljs"),e.classList.add("language-"+i) +})(e,n,s.language),e.result={language:s.language,re:s.relevance, +relevance:s.relevance},s.secondBest&&(e.secondBest={ +language:s.secondBest.language,relevance:s.secondBest.relevance +}),k("after:highlightElement",{el:e,result:s,text:i})}let y=!1;function _(){ +"loading"!==document.readyState?document.querySelectorAll(g.cssSelector).forEach(w):y=!0 +}function O(e){return e=(e||"").toLowerCase(),i[e]||i[r[e]]} +function v(e,{languageName:t}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +r[e.toLowerCase()]=t}))}function N(e){const t=O(e) +;return t&&!t.disableAutodetect}function k(e,t){const n=e;s.forEach((e=>{ +e[n]&&e[n](t)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +y&&_()}),!1),Object.assign(t,{highlight:m,highlightAuto:x,highlightAll:_, +highlightElement:w, +highlightBlock:e=>(X("10.7.0","highlightBlock will be removed entirely in v12.0"), +X("10.7.0","Please use highlightElement now."),w(e)),configure:e=>{g=Q(g,e)}, +initHighlighting:()=>{ +_(),X("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +_(),X("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let r=null;try{r=n(t)}catch(t){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!o)throw t;K(t),r=c} +r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&v(r.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete i[e] +;for(const t of Object.keys(r))r[t]===e&&delete r[t]}, +listLanguages:()=>Object.keys(i),getLanguage:O,registerAliases:v, +autoDetection:N,inherit:Q,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=t=>{ +e["before:highlightBlock"](Object.assign({block:t.el},t)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=t=>{ +e["after:highlightBlock"](Object.assign({block:t.el},t))})})(e),s.push(e)} +}),t.debugMode=()=>{o=!1},t.safeMode=()=>{o=!0 +},t.versionString="11.7.0",t.regex={concat:p,lookahead:d,either:f,optional:h, +anyNumberOfTimes:u};for(const t in A)"object"==typeof A[t]&&e.exports(A[t]) +;return Object.assign(t,A),t})({});return te}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs);/*! `xml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const a=e.regex,n=a.concat(/[\p{L}_]/u,a.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),s={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},t={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},i=e.inherit(t,{begin:/\(/,end:/\)/}),c=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),l=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),r={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[t,l,c,i,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[t,i,l,c]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[l]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[r],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[r],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:a.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:n,relevance:0,starts:r}]},{ +className:"tag",begin:a.concat(/<\//,a.lookahead(a.concat(n,/>/))),contains:[{ +className:"name",begin:n,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}} +})();hljs.registerLanguage("xml",e)})();/*! `markdown` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{const n={begin:/<\/?[A-Za-z_]/, +end:">",subLanguage:"xml",relevance:0},a={variants:[{begin:/\[.+?\]\[.*?\]/, +relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},i={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},s={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},c=e.inherit(i,{contains:[] +}),t=e.inherit(s,{contains:[]});i.contains.push(t),s.contains.push(c) +;let g=[n,a];return[i,s,c,t].forEach((e=>{e.contains=e.contains.concat(g) +})),g=g.concat(i,s),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:g},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:g}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:g, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}})() +;hljs.registerLanguage("markdown",e)})();/*! `plaintext` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var t=(()=>{"use strict";return t=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0})})() +;hljs.registerLanguage("plaintext",t)})();/*! `ocaml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>({name:"OCaml",aliases:["ml"], +keywords:{$pattern:"[a-z_]\\w*!?", +keyword:"and as assert asr begin class constraint do done downto else end exception external for fun function functor if in include inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method mod module mutable new object of open! open or private rec sig struct then to try type val! val virtual when while with parser value", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit in_channel out_channel ref", +literal:"true false"},illegal:/\/\/|>>/,contains:[{className:"literal", +begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0},e.COMMENT("\\(\\*","\\*\\)",{ +contains:["self"]}),{className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{ +className:"type",begin:"`[A-Z][\\w']*"},{className:"type", +begin:"\\b[A-Z][\\w']*",relevance:0},{begin:"[a-z_]\\w*'[\\w']*",relevance:0 +},e.inherit(e.APOS_STRING_MODE,{className:"string",relevance:0 +}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),{className:"number", +begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)", +relevance:0},{begin:/->/}]})})();hljs.registerLanguage("ocaml",e)})();/*! `python` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n=e.regex,a=/[\p{XID_Start}_]\p{XID_Continue}*/u,i=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],s={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:i, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},t={className:"meta",begin:/^(>>>|\.\.\.) /},r={className:"subst",begin:/\{/, +end:/\}/,keywords:s,illegal:/#/},l={begin:/\{\{/,relevance:0},b={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,t],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,t,l,r]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,l,r]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,l,r]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},o="[0-9](_?[0-9])*",c=`(\\b(${o}))?\\.(${o})|\\b(${o})\\.`,d="\\b|"+i.join("|"),g={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${o})|(${c}))[eE][+-]?(${o})[jJ]?(?=${d})`},{begin:`(${c})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${d})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${d})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${d})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${d})`},{begin:`\\b(${o})[jJ](?=${d})` +}]},p={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:s, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:s, +contains:["self",t,g,b,e.HASH_COMMENT_MODE]}]};return r.contains=[b,g,t],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:s, +illegal:/(<\/|->|\?)|=>/,contains:[t,g,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},b,p,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,a],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,a,/\s*/,/\(\s*/,a,/\s*\)/]},{match:[/\bclass/,/\s+/,a]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[g,m,b]}]}}})() +;hljs.registerLanguage("python",e)})();/*! `reasonml` grammar compiled for Highlight.js 11.7.0 */ +(()=>{var e=(()=>{"use strict";return e=>{ +const n="~?[a-z$_][0-9a-zA-Z$_]*",a="`?[A-Z$_][0-9a-zA-Z$_]*",s="("+["||","++","**","+.","*","/","*.","/.","..."].map((e=>e.split("").map((e=>"\\"+e)).join(""))).join("|")+"|\\|>|&&|==|===)",i="\\s+"+s+"\\s+",r={ +keyword:"and as asr assert begin class constraint do done downto else end exception external for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new nonrec object of open or private rec sig struct then to try type val virtual when while with", +built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ", +literal:"true false" +},l="\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",t={ +className:"number",relevance:0,variants:[{begin:l},{begin:"\\(-"+l+"\\)"}]},c={ +className:"operator",relevance:0,begin:s},o=[{className:"identifier", +relevance:0,begin:n},c,t],g=[e.QUOTE_STRING_MODE,c,{className:"module", +begin:"\\b"+a,returnBegin:!0,relevance:0,end:".",contains:[{ +className:"identifier",begin:a,relevance:0}]}],b=[{className:"module", +begin:"\\b"+a,returnBegin:!0,end:".",relevance:0,contains:[{ +className:"identifier",begin:a,relevance:0}]}],m={className:"function", +relevance:0,keywords:r,variants:[{begin:"\\s(\\(\\.?.*?\\)|"+n+")\\s*=>", +end:"\\s*=>",returnBegin:!0,relevance:0,contains:[{className:"params", +variants:[{begin:n},{ +begin:"~?[a-z$_][0-9a-zA-Z$_]*(\\s*:\\s*[a-z$_][0-9a-z$_]*(\\(\\s*('?[a-z$_][0-9a-z$_]*\\s*(,'?[a-z$_][0-9a-z$_]*\\s*)*)?\\))?){0,2}" +},{begin:/\(\s*\)/}]}]},{begin:"\\s\\(\\.?[^;\\|]*\\)\\s*=>",end:"\\s=>", +returnBegin:!0,relevance:0,contains:[{className:"params",relevance:0,variants:[{ +begin:n,end:"(,|\\n|\\))",relevance:0,contains:[c,{className:"typing",begin:":", +end:"(,|\\n)",returnBegin:!0,relevance:0,contains:b}]}]}]},{ +begin:"\\(\\.\\s"+n+"\\)\\s*=>"}]};g.push(m);const d={className:"constructor", +begin:a+"\\(",end:"\\)",illegal:"\\n",keywords:r, +contains:[e.QUOTE_STRING_MODE,c,{className:"params",begin:"\\b"+n}]},u={ +className:"pattern-match",begin:"\\|",returnBegin:!0,keywords:r,end:"=>", +relevance:0,contains:[d,c,{relevance:0,className:"constructor",begin:a}]},v={ +className:"module-access",keywords:r,returnBegin:!0,variants:[{ +begin:"\\b("+a+"\\.)+"+n},{begin:"\\b("+a+"\\.)+\\(",end:"\\)",returnBegin:!0, +contains:[m,{begin:"\\(",end:"\\)",relevance:0,skip:!0}].concat(g)},{ +begin:"\\b("+a+"\\.)+\\{",end:/\}/}],contains:g};return b.push(v),{ +name:"ReasonML",aliases:["re"],keywords:r,illegal:"(:-|:=|\\$\\{|\\+=)", +contains:[e.COMMENT("/\\*","\\*/",{illegal:"^(#,\\/\\/)"}),{ +className:"character",begin:"'(\\\\[^']+|[^'])'",illegal:"\\n",relevance:0 +},e.QUOTE_STRING_MODE,{className:"literal",begin:"\\(\\)",relevance:0},{ +className:"literal",begin:"\\[\\|",end:"\\|\\]",relevance:0,contains:o},{ +className:"literal",begin:"\\[",end:"\\]",relevance:0,contains:o},d,{ +className:"operator",begin:i,illegal:"--\x3e",relevance:0 +},t,e.C_LINE_COMMENT_MODE,u,m,{className:"module-def", +begin:"\\bmodule\\s+"+n+"\\s+"+a+"\\s+=\\s+\\{",end:/\}/,returnBegin:!0, +keywords:r,relevance:0,contains:[{className:"module",relevance:0,begin:a},{ +begin:/\{/,end:/\}/,relevance:0,skip:!0}].concat(g)},v]}}})() +;hljs.registerLanguage("reasonml",e)})(); \ No newline at end of file diff --git a/odoc/odoc.support/katex.min.css b/odoc/odoc.support/katex.min.css new file mode 100644 index 00000000..5f1f8576 --- /dev/null +++ b/odoc/odoc.support/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.15.2"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/odoc/odoc.support/katex.min.js b/odoc/odoc.support/katex.min.js new file mode 100644 index 00000000..e4d78f24 --- /dev/null +++ b/odoc/odoc.support/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Zn}});var r=function e(t,r){this.position=void 0;var n,a="KaTeX parse error: "+t,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;n=i.start;var s=i.end;n===o.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");a+=(n>15?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15":">","<":"<",'"':""","'":"'"},o=/[&><"']/g;var s=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(o,(function(e){return i[e]}))},hyphenate:function(e){return e.replace(a,"-$1").toLowerCase()},getBaseElem:s,isCharacterBox:function(e){var t=s(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(e){return"#"+e}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(e,t){return t.push(e),t}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(e){return Math.max(0,e)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(e){return Math.max(0,e)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(e){return Math.max(0,e)},cli:"-e, --max-expand ",cliProcessor:function(e){return"Infinity"===e?1/0:parseInt(e)}},globalGroup:{type:"boolean",cli:!1}};function m(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var c=function(){function e(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},h)if(h.hasOwnProperty(t)){var r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:m(r)}}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){e.url&&!e.protocol&&(e.protocol=l.protocolFromUrl(e.url));var t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)},e}(),u=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return p[d[this.id]]},t.sub=function(){return p[f[this.id]]},t.fracNum=function(){return p[g[this.id]]},t.fracDen=function(){return p[v[this.id]]},t.cramp=function(){return p[b[this.id]]},t.text=function(){return p[y[this.id]]},t.isTight=function(){return this.size>=2},e}(),p=[new u(0,0,!1),new u(1,0,!0),new u(2,1,!1),new u(3,1,!0),new u(4,2,!1),new u(5,2,!0),new u(6,3,!1),new u(7,3,!0)],d=[4,5,4,5,6,7,6,7],f=[5,5,5,5,7,7,7,7],g=[2,3,4,5,6,7,6,7],v=[3,3,5,5,7,7,7,7],b=[1,1,3,3,5,5,7,7],y=[0,1,2,3,2,3,2,3],x={DISPLAY:p[0],TEXT:p[2],SCRIPT:p[4],SCRIPTSCRIPT:p[6]},w=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var k=[];function S(e){for(var t=0;t=k[t]&&e<=k[t+1])return!0;return!1}w.forEach((function(e){return e.blocks.forEach((function(e){return k.push.apply(k,e)}))}));var M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},A=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t=5?0:e>=3?1:2]){var r=N[t]={cssEmPerMu:B.quad[t]/18};for(var n in B)B.hasOwnProperty(n)&&(r[n]=B[n][t])}return N[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();H.BASESIZE=6;var E=H,L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},P=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},F=function(e,t){var r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},V=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((function(e){return e})).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var n=t.getColor();n&&(this.style.color=n)}},Y=function(e){var t=document.createElement(e);for(var r in t.className=G(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var n in this.attributes)this.attributes.hasOwnProperty(n)&&t.setAttribute(n,this.attributes[n]);for(var a=0;a"},W=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"span")},t.toMarkup=function(){return X.call(this,"span")},e}(),_=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return Y.call(this,"a")},t.toMarkup=function(){return X.call(this,"a")},e}(),j=function(){function e(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=a[0]&&e<=a[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=$[this.text])}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=V(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=G(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=l.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');var a=l.escape(this.text);return e?(t+=">",t+=a,t+=""):a},e}(),K=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r":""},e}(),Q=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="","\\gt",!0),ie(oe,le,be,"\u2208","\\in",!0),ie(oe,le,be,"\ue020","\\@not"),ie(oe,le,be,"\u2282","\\subset",!0),ie(oe,le,be,"\u2283","\\supset",!0),ie(oe,le,be,"\u2286","\\subseteq",!0),ie(oe,le,be,"\u2287","\\supseteq",!0),ie(oe,he,be,"\u2288","\\nsubseteq",!0),ie(oe,he,be,"\u2289","\\nsupseteq",!0),ie(oe,le,be,"\u22a8","\\models"),ie(oe,le,be,"\u2190","\\leftarrow",!0),ie(oe,le,be,"\u2264","\\le"),ie(oe,le,be,"\u2264","\\leq",!0),ie(oe,le,be,"<","\\lt",!0),ie(oe,le,be,"\u2192","\\rightarrow",!0),ie(oe,le,be,"\u2192","\\to"),ie(oe,he,be,"\u2271","\\ngeq",!0),ie(oe,he,be,"\u2270","\\nleq",!0),ie(oe,le,ye,"\xa0","\\ "),ie(oe,le,ye,"\xa0","\\space"),ie(oe,le,ye,"\xa0","\\nobreakspace"),ie(se,le,ye,"\xa0","\\ "),ie(se,le,ye,"\xa0"," "),ie(se,le,ye,"\xa0","\\space"),ie(se,le,ye,"\xa0","\\nobreakspace"),ie(oe,le,ye,null,"\\nobreak"),ie(oe,le,ye,null,"\\allowbreak"),ie(oe,le,ve,",",","),ie(oe,le,ve,";",";"),ie(oe,he,ce,"\u22bc","\\barwedge",!0),ie(oe,he,ce,"\u22bb","\\veebar",!0),ie(oe,le,ce,"\u2299","\\odot",!0),ie(oe,le,ce,"\u2295","\\oplus",!0),ie(oe,le,ce,"\u2297","\\otimes",!0),ie(oe,le,xe,"\u2202","\\partial",!0),ie(oe,le,ce,"\u2298","\\oslash",!0),ie(oe,he,ce,"\u229a","\\circledcirc",!0),ie(oe,he,ce,"\u22a1","\\boxdot",!0),ie(oe,le,ce,"\u25b3","\\bigtriangleup"),ie(oe,le,ce,"\u25bd","\\bigtriangledown"),ie(oe,le,ce,"\u2020","\\dagger"),ie(oe,le,ce,"\u22c4","\\diamond"),ie(oe,le,ce,"\u22c6","\\star"),ie(oe,le,ce,"\u25c3","\\triangleleft"),ie(oe,le,ce,"\u25b9","\\triangleright"),ie(oe,le,ge,"{","\\{"),ie(se,le,xe,"{","\\{"),ie(se,le,xe,"{","\\textbraceleft"),ie(oe,le,ue,"}","\\}"),ie(se,le,xe,"}","\\}"),ie(se,le,xe,"}","\\textbraceright"),ie(oe,le,ge,"{","\\lbrace"),ie(oe,le,ue,"}","\\rbrace"),ie(oe,le,ge,"[","\\lbrack",!0),ie(se,le,xe,"[","\\lbrack",!0),ie(oe,le,ue,"]","\\rbrack",!0),ie(se,le,xe,"]","\\rbrack",!0),ie(oe,le,ge,"(","\\lparen",!0),ie(oe,le,ue,")","\\rparen",!0),ie(se,le,xe,"<","\\textless",!0),ie(se,le,xe,">","\\textgreater",!0),ie(oe,le,ge,"\u230a","\\lfloor",!0),ie(oe,le,ue,"\u230b","\\rfloor",!0),ie(oe,le,ge,"\u2308","\\lceil",!0),ie(oe,le,ue,"\u2309","\\rceil",!0),ie(oe,le,xe,"\\","\\backslash"),ie(oe,le,xe,"\u2223","|"),ie(oe,le,xe,"\u2223","\\vert"),ie(se,le,xe,"|","\\textbar",!0),ie(oe,le,xe,"\u2225","\\|"),ie(oe,le,xe,"\u2225","\\Vert"),ie(se,le,xe,"\u2225","\\textbardbl"),ie(se,le,xe,"~","\\textasciitilde"),ie(se,le,xe,"\\","\\textbackslash"),ie(se,le,xe,"^","\\textasciicircum"),ie(oe,le,be,"\u2191","\\uparrow",!0),ie(oe,le,be,"\u21d1","\\Uparrow",!0),ie(oe,le,be,"\u2193","\\downarrow",!0),ie(oe,le,be,"\u21d3","\\Downarrow",!0),ie(oe,le,be,"\u2195","\\updownarrow",!0),ie(oe,le,be,"\u21d5","\\Updownarrow",!0),ie(oe,le,fe,"\u2210","\\coprod"),ie(oe,le,fe,"\u22c1","\\bigvee"),ie(oe,le,fe,"\u22c0","\\bigwedge"),ie(oe,le,fe,"\u2a04","\\biguplus"),ie(oe,le,fe,"\u22c2","\\bigcap"),ie(oe,le,fe,"\u22c3","\\bigcup"),ie(oe,le,fe,"\u222b","\\int"),ie(oe,le,fe,"\u222b","\\intop"),ie(oe,le,fe,"\u222c","\\iint"),ie(oe,le,fe,"\u222d","\\iiint"),ie(oe,le,fe,"\u220f","\\prod"),ie(oe,le,fe,"\u2211","\\sum"),ie(oe,le,fe,"\u2a02","\\bigotimes"),ie(oe,le,fe,"\u2a01","\\bigoplus"),ie(oe,le,fe,"\u2a00","\\bigodot"),ie(oe,le,fe,"\u222e","\\oint"),ie(oe,le,fe,"\u222f","\\oiint"),ie(oe,le,fe,"\u2230","\\oiiint"),ie(oe,le,fe,"\u2a06","\\bigsqcup"),ie(oe,le,fe,"\u222b","\\smallint"),ie(se,le,pe,"\u2026","\\textellipsis"),ie(oe,le,pe,"\u2026","\\mathellipsis"),ie(se,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u2026","\\ldots",!0),ie(oe,le,pe,"\u22ef","\\@cdots",!0),ie(oe,le,pe,"\u22f1","\\ddots",!0),ie(oe,le,xe,"\u22ee","\\varvdots"),ie(oe,le,me,"\u02ca","\\acute"),ie(oe,le,me,"\u02cb","\\grave"),ie(oe,le,me,"\xa8","\\ddot"),ie(oe,le,me,"~","\\tilde"),ie(oe,le,me,"\u02c9","\\bar"),ie(oe,le,me,"\u02d8","\\breve"),ie(oe,le,me,"\u02c7","\\check"),ie(oe,le,me,"^","\\hat"),ie(oe,le,me,"\u20d7","\\vec"),ie(oe,le,me,"\u02d9","\\dot"),ie(oe,le,me,"\u02da","\\mathring"),ie(oe,le,de,"\ue131","\\@imath"),ie(oe,le,de,"\ue237","\\@jmath"),ie(oe,le,xe,"\u0131","\u0131"),ie(oe,le,xe,"\u0237","\u0237"),ie(se,le,xe,"\u0131","\\i",!0),ie(se,le,xe,"\u0237","\\j",!0),ie(se,le,xe,"\xdf","\\ss",!0),ie(se,le,xe,"\xe6","\\ae",!0),ie(se,le,xe,"\u0153","\\oe",!0),ie(se,le,xe,"\xf8","\\o",!0),ie(se,le,xe,"\xc6","\\AE",!0),ie(se,le,xe,"\u0152","\\OE",!0),ie(se,le,xe,"\xd8","\\O",!0),ie(se,le,me,"\u02ca","\\'"),ie(se,le,me,"\u02cb","\\`"),ie(se,le,me,"\u02c6","\\^"),ie(se,le,me,"\u02dc","\\~"),ie(se,le,me,"\u02c9","\\="),ie(se,le,me,"\u02d8","\\u"),ie(se,le,me,"\u02d9","\\."),ie(se,le,me,"\xb8","\\c"),ie(se,le,me,"\u02da","\\r"),ie(se,le,me,"\u02c7","\\v"),ie(se,le,me,"\xa8",'\\"'),ie(se,le,me,"\u02dd","\\H"),ie(se,le,me,"\u25ef","\\textcircled");var we={"--":!0,"---":!0,"``":!0,"''":!0};ie(se,le,xe,"\u2013","--",!0),ie(se,le,xe,"\u2013","\\textendash"),ie(se,le,xe,"\u2014","---",!0),ie(se,le,xe,"\u2014","\\textemdash"),ie(se,le,xe,"\u2018","`",!0),ie(se,le,xe,"\u2018","\\textquoteleft"),ie(se,le,xe,"\u2019","'",!0),ie(se,le,xe,"\u2019","\\textquoteright"),ie(se,le,xe,"\u201c","``",!0),ie(se,le,xe,"\u201c","\\textquotedblleft"),ie(se,le,xe,"\u201d","''",!0),ie(se,le,xe,"\u201d","\\textquotedblright"),ie(oe,le,xe,"\xb0","\\degree",!0),ie(se,le,xe,"\xb0","\\degree"),ie(se,le,xe,"\xb0","\\textdegree",!0),ie(oe,le,xe,"\xa3","\\pounds"),ie(oe,le,xe,"\xa3","\\mathsterling",!0),ie(se,le,xe,"\xa3","\\pounds"),ie(se,le,xe,"\xa3","\\textsterling",!0),ie(oe,he,xe,"\u2720","\\maltese"),ie(se,he,xe,"\u2720","\\maltese");for(var ke='0123456789/@."',Se=0;Set&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>n&&(n=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Xe=function(e,t,r,n){var a=new W(e,t,r,n);return Ye(a),a},We=function(e,t,r,n){return new W(e,t,r,n)},_e=function(e){var t=new A(e);return Ye(t),t},je=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},$e={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ze={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Ke={fontMap:$e,makeSymbol:Ge,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ve(e,"Main-Bold",t).metrics?Ge(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===ae[t][e].font?Ge(e,"Main-Regular",t,r,n):Ge(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Xe,makeSvgSpan:We,makeLineSpan:function(e,t,r){var n=Xe([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=V(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var a=new _(e,t,r,n);return Ye(a),a},makeFragment:_e,wrapFragment:function(e,t){return e instanceof A?Xe([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,a=n,i=1;i0&&(o.push(kt(s,t)),s=[]),o.push(a[l]));s.length>0&&o.push(kt(s,t)),r?((i=kt(ft(r,t,!0))).classes=["tag"],o.push(i)):n&&o.push(n);var m=mt(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=V(m.height+m.depth),m.depth&&(c.style.verticalAlign=V(-m.depth))}return m}function Mt(e){return new A(e)}var zt=function(){function e(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(var r=0;r0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(var r=0;r"},t.toText=function(){return this.children.map((function(e){return e.toText()})).join("")},e}(),At=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return l.escape(this.toText())},t.toText=function(){return this.text},e}(),Tt={MathNode:zt,TextNode:At,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",V(this.width)),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:Mt},Bt=function(e,t,r){return!ae[t][e]||!ae[t][e].replace||55349===e.charCodeAt(0)||we.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=ae[t][e].replace),new Tt.TextNode(e)},Ct=function(e){return 1===e.length?e[0]:new Tt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var a=e.text;return l.contains(["\\imath","\\jmath"],a)?null:(ae[n][a]&&ae[n][a].replace&&(a=ae[n][a].replace),q(a,Ke.fontMap[r].fontName,n)?Ke.fontMap[r].variant:null)},Nt=function(e,t,r){if(1===e.length){var n=Rt(e[0],t);return r&&n instanceof zt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var a,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),a=s}return i},It=function(e,t,r){return Ct(Nt(e,t,r))},Rt=function(e,t){if(!e)return new Tt.MathNode("mrow");if(it[e.type])return it[e.type](e,t);throw new n("Got group of unknown type: '"+e.type+"'")};function Ot(e,t,r,n,a){var i,o=Nt(e,r);i=1===o.length&&o[0]instanceof zt&&l.contains(["mrow","mtable"],o[0].type)?o[0]:new Tt.MathNode("mrow",o);var s=new Tt.MathNode("annotation",[new Tt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var h=new Tt.MathNode("semantics",[i,s]),m=new Tt.MathNode("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&m.setAttribute("display","block");var c=a?"katex":"katex-mathml";return Ke.makeSpan([c],[m])}var Ht=function(e){return new E({style:e.displayMode?x.DISPLAY:x.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Et=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Ke.makeSpan(r,[e])}return e},Lt=function(e,t,r){var n,a=Ht(r);if("mathml"===r.output)return Ot(e,t,a,r.displayMode,!0);if("html"===r.output){var i=St(e,a);n=Ke.makeSpan(["katex"],[i])}else{var o=Ot(e,t,a,r.displayMode,!1),s=St(e,a);n=Ke.makeSpan(["katex"],[o,s])}return Et(n,r)},Dt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,n,a){var i,o=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(i=Ke.makeSpan(["stretchy",t],[],a),"fbox"===t){var s=a.color&&a.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new Q({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new K(l,{width:"100%",height:V(o)});i=Ke.makeSvgSpan([],[h],a)}return i.height=o,i.style.height=V(o),i},Vt=function(e){var t=new Tt.MathNode("mo",[new Tt.TextNode(Dt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Gt=function(e,t){var r=function(){var r=4e5,n=e.label.substr(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){var a,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===n||"widecheck"===n?(a=420,r=2364,o=.42,i=n+"4"):(a=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][h],a=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=n+h):(r=[0,600,1033,2339,2340][h],a=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var m=new J(i),c=new K([m],{width:"100%",height:V(o),viewBox:"0 0 "+r+" "+a,preserveAspectRatio:"none"});return{span:Ke.makeSvgSpan([],[c],t),minWidth:0,height:o}}var u,p,d,f=[],g=Pt[n],v=g[0],b=g[1],y=g[2],x=y/1e3,w=v.length;if(1===w)u=["hide-tail"],p=[g[3]];else if(2===w)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(n.style.minWidth=V(a)),n};function Ut(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Yt(e){var t=Xt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Xt(e){return e&&("atom"===e.type||re.hasOwnProperty(e.type))?e:null}var Wt=function(e,t){var r,n,a;e&&"supsub"===e.type?(r=(n=Ut(e.base,"accent")).base,e.base=r,a=function(e){if(e instanceof W)return e;throw new Error("Expected span but got "+String(e)+".")}(wt(e,t)),e.base=n):r=(n=Ut(e,"accent")).base;var i=wt(r,t.havingCrampedStyle()),o=0;if(n.isShifty&&l.isCharacterBox(r)){var s=l.getBaseElem(r);o=ee(wt(s,t.havingCrampedStyle())).skew}var h,m="\\c"===n.label,c=m?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Gt(n,t),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+V(2*o)+")",marginLeft:V(2*o)}:void 0}]},t);else{var u,p;"\\vec"===n.label?(u=Ke.staticSvg("vec",t),p=Ke.svgData.vec[1]):((u=ee(u=Ke.makeOrd({mode:n.mode,text:n.label},t,"textord"))).italic=0,p=u.width,m&&(c+=u.depth)),h=Ke.makeSpan(["accent-body"],[u]);var d="\\textcircled"===n.label;d&&(h.classes.push("accent-full"),c=i.height);var f=o;d||(f-=p/2),h.style.left=V(f),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}var g=Ke.makeSpan(["mord","accent"],[h],t);return a?(a.children[0]=g,a.height=Math.max(g.height,a.height),a.classes[0]="mord",a):g},_t=function(e,t){var r=e.isStretchy?Vt(e.label):new Tt.MathNode("mo",[Bt(e.label,e.mode)]),n=new Tt.MathNode("mover",[Rt(e.base,t),r]);return n.setAttribute("accent","true"),n},jt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(e){return"\\"+e})).join("|"));ot({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=lt(t[0]),n=!jt.test(e.funcName),a=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:a,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(e,t){var r=t[0],n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Wt,mathmlBuilder:_t}),ot({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:a}},htmlBuilder:function(e,t){var r=wt(e.base,t),n=Gt(e,t),a="\\utilde"===e.label?.12:0,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:function(e,t){var r=Vt(e.label),n=new Tt.MathNode("munder",[Rt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var $t=function(e){var t=new Tt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};ot({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,a=e.funcName;return{type:"xArrow",mode:n.mode,label:a,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,a=t.havingStyle(n.sup()),i=Ke.wrapFragment(wt(e.body,a,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(a=t.havingStyle(n.sub()),(r=Ke.wrapFragment(wt(e.below,a,t),t)).classes.push(o+"-arrow-pad"));var s,l=Gt(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Ke.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder:function(e,t){var r,n=Vt(e.label);if(n.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var a=$t(Rt(e.body,t));if(e.below){var i=$t(Rt(e.below,t));r=new Tt.MathNode("munderover",[n,i,a])}else r=new Tt.MathNode("mover",[n,a])}else if(e.below){var o=$t(Rt(e.below,t));r=new Tt.MathNode("munder",[n,o])}else r=$t(),r=new Tt.MathNode("mover",[n,r]);return r}});var Zt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Kt=function(e){return"textord"===e.type&&"@"===e.text};function Jt(e,t,r){var n=Zt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}ot({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder:function(e,t){var r=t.havingStyle(t.style.sup()),n=Ke.wrapFragment(wt(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=V(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mrow",[Rt(e.label,t)]);return(r=new Tt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Tt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),ot({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var r=Ke.wrapFragment(wt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:function(e,t){return new Tt.MathNode("mrow",[Rt(e.fragment,t)])}}),ot({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,a=Ut(t[0],"ordgroup").body,i="",o=0;o=1114111)throw new n("\\@char with invalid code point "+i);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var Qt=function(e,t){var r=ft(e.body,t.withColor(e.color),!1);return Ke.makeFragment(r)},er=function(e,t){var r=Nt(e.body,t.withColor(e.color)),n=new Tt.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};ot({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(e,t){var r=e.parser,n=Ut(t[0],"color-token").color,a=t[1];return{type:"color",mode:r.mode,color:n,body:ht(a)}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(e,t){var r=e.parser,n=e.breakOnTokenText,a=Ut(t[0],"color-token").color;r.gullet.macros.set("\\current@color",a);var i=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:a,body:i}},htmlBuilder:Qt,mathmlBuilder:er}),ot({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:1,argTypes:["size"],allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=r[0],i=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:i,size:a&&Ut(a,"size").value}},htmlBuilder:function(e,t){var r=Ke.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=V(F(e.size,t)))),r},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",V(F(e.size,t)))),r}});var tr={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},rr=function(e){var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},nr=function(e,t,r,n){var a=e.gullet.macros.get(r.text);null==a&&(r.noexpand=!0,a={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,a,n)};ot({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(e){var t=e.parser,r=e.funcName;t.consumeSpaces();var a=t.fetch();if(tr[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=tr[a.text]),Ut(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",a)}}),ot({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,a=t.gullet.popToken(),i=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new n("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new n('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new n('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new n("Expected a macro definition");l[s].push(a.text)}var h=t.gullet.consumeArg().tokens;return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(i,{tokens:h,numArgs:s,delimiters:l},r===tr[r]),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken());t.gullet.consumeSpaces();var a=function(e){var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t}(t);return nr(t,n,a,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),ot({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,r=e.funcName,n=rr(t.gullet.popToken()),a=t.gullet.popToken(),i=t.gullet.popToken();return nr(t,n,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(a),{type:"internal",mode:t.mode}}});var ar=function(e,t,r){var n=q(ae.math[e]&&ae.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},ir=function(e,t,r,n){var a=r.havingBaseStyle(t),i=Ke.makeSpan(n.concat(a.sizingClasses(r)),[e],r),o=a.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=a.sizeMultiplier,i},or=function(e,t,r){var n=t.havingBaseStyle(r),a=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=V(a),e.height-=a,e.depth+=a},sr=function(e,t,r,n,a,i){var o=function(e,t,r,n){return Ke.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,a,n),s=ir(Ke.makeSpan(["delimsizing","size"+t],[o],n),x.TEXT,n,i);return r&&or(s,n,x.TEXT),s},lr=function(e,t,r){var n;return n="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Ke.makeSpan(["delimsizinginner",n],[Ke.makeSpan([],[Ke.makeSymbol(e,t,r)])])}},hr=function(e,t,r){var n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],a=new J("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new K([a],{width:V(n),height:V(t),style:"width:"+V(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Ke.makeSvgSpan([],[i],r);return o.height=t,o.style.height=V(t),o.style.width=V(n),{type:"elem",elem:o}},mr={type:"kern",size:-.008},cr=["|","\\lvert","\\rvert","\\vert"],ur=["\\|","\\lVert","\\rVert","\\Vert"],pr=function(e,t,r,n,a,i){var o,s,h,m;o=h=m=e,s=null;var c="Size1-Regular";"\\uparrow"===e?h=m="\u23d0":"\\Uparrow"===e?h=m="\u2016":"\\downarrow"===e?o=h="\u23d0":"\\Downarrow"===e?o=h="\u2016":"\\updownarrow"===e?(o="\\uparrow",h="\u23d0",m="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",h="\u2016",m="\\Downarrow"):l.contains(cr,e)?h="\u2223":l.contains(ur,e)?h="\u2225":"["===e||"\\lbrack"===e?(o="\u23a1",h="\u23a2",m="\u23a3",c="Size4-Regular"):"]"===e||"\\rbrack"===e?(o="\u23a4",h="\u23a5",m="\u23a6",c="Size4-Regular"):"\\lfloor"===e||"\u230a"===e?(h=o="\u23a2",m="\u23a3",c="Size4-Regular"):"\\lceil"===e||"\u2308"===e?(o="\u23a1",h=m="\u23a2",c="Size4-Regular"):"\\rfloor"===e||"\u230b"===e?(h=o="\u23a5",m="\u23a6",c="Size4-Regular"):"\\rceil"===e||"\u2309"===e?(o="\u23a4",h=m="\u23a5",c="Size4-Regular"):"("===e||"\\lparen"===e?(o="\u239b",h="\u239c",m="\u239d",c="Size4-Regular"):")"===e||"\\rparen"===e?(o="\u239e",h="\u239f",m="\u23a0",c="Size4-Regular"):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",m="\u23a9",h="\u23aa",c="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",m="\u23ad",h="\u23aa",c="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",m="\u23a9",h="\u23aa",c="Size4-Regular");var u=ar(o,c,a),p=u.height+u.depth,d=ar(h,c,a),f=d.height+d.depth,g=ar(m,c,a),v=g.height+g.depth,b=0,y=1;if(null!==s){var w=ar(s,c,a);b=w.height+w.depth,y=2}var k=p+v+b,S=k+Math.max(0,Math.ceil((t-k)/(y*f)))*y*f,M=n.fontMetrics().axisHeight;r&&(M*=n.sizeMultiplier);var z=S/2-M,A=[];if(A.push(lr(m,c,a)),A.push(mr),null===s){var T=S-p-v+.016;A.push(hr(h,T,n))}else{var B=(S-p-v-b)/2+.016;A.push(hr(h,B,n)),A.push(mr),A.push(lr(s,c,a)),A.push(mr),A.push(hr(h,B,n))}A.push(mr),A.push(lr(o,c,a));var C=n.havingBaseStyle(x.TEXT),q=Ke.makeVList({positionType:"bottom",positionData:z,children:A},C);return ir(Ke.makeSpan(["delimsizing","mult"],[q],C),x.TEXT,n,i)},dr=.08,fr=function(e,t,r,n,a){var i=function(e,t,r){t*=1e3;var n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),o=new J(e,i),s=new K([o],{width:"400em",height:V(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Ke.makeSvgSpan(["hide-tail"],[s],a)},gr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],vr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],br=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],yr=[0,1.2,1.8,2.4,3],xr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],wr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"stack"}],kr=[{type:"small",style:x.SCRIPTSCRIPT},{type:"small",style:x.SCRIPT},{type:"small",style:x.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Sr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},Mr=function(e,t,r,n){for(var a=Math.min(2,3-n.style.size);at)return r[a]}return r[r.length-1]},zr=function(e,t,r,n,a,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=l.contains(br,e)?xr:l.contains(gr,e)?kr:wr;var s=Mr(e,t,o,n);return"small"===s.type?function(e,t,r,n,a,i){var o=Ke.makeSymbol(e,"Main-Regular",a,n),s=ir(o,t,n,i);return r&&or(s,n,t),s}(e,s.style,r,n,a,i):"large"===s.type?sr(e,s.size,r,n,a,i):pr(e,t,r,n,a,i)},Ar={sqrtImage:function(e,t){var r,n,a=t.havingBaseSizing(),i=Mr("\\surd",e*a.sizeMultiplier,kr,a),o=a.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=fr("sqrtMain",l=(1+s+dr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",n=.833/o):"large"===i.type?(m=1080*yr[i.size],h=(yr[i.size]+s)/o,l=(yr[i.size]+s+dr)/o,(r=fr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",n=1/o):(l=e+s+dr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=fr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",n=1.056),r.height=h,r.style.height=V(l),{span:r,advanceWidth:n,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(gr,e)||l.contains(br,e))return sr(e,t,!1,r,a,i);if(l.contains(vr,e))return pr(e,yr[t],!1,r,a,i);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:yr,customSizedDelim:zr,leftRightDelim:function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return zr(e,h,!0,n,a,i)}},Tr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Br=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Cr(e,t){var r=Xt(e);if(r&&l.contains(Br,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function qr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}ot({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var r=Cr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Tr[e.funcName].size,mclass:Tr[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?Ke.makeSpan([e.mclass]):Ar.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(Bt(e.delim,e.mode));var r=new Tt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=V(Ar.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),ot({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Cr(t[0],e).text,color:r}}}),ot({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=Cr(t[0],e),n=e.parser;++n.leftrightDepth;var a=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var i=Ut(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:a,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(e,t){qr(e);for(var r,n,a=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[Rt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var a=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+a+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};ot({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:a,backgroundColor:i,body:o}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ut(t[0],"color-token").color,o=Ut(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:a,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),ot({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"enclose",mode:r.mode,label:n,body:a}},htmlBuilder:Nr,mathmlBuilder:Ir}),ot({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var Rr={};function Or(e){for(var t=e.type,r=e.names,n=e.props,a=e.handler,i=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:a},l=0;l1||!c)&&g.pop(),b.length0&&(y+=.25),m.push({pos:y,isDashed:e[t]})}for(w(o[0]),r=0;r0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=f),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,h[r]=z,w(o[r+1])}var C,q,N=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],O=[];if(e.tags&&e.tags.some((function(e){return e})))for(r=0;r=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=l.deflt(P.pregap,p))&&((C=Ke.makeSpan(["arraycolsep"],[])).style.width=V(W),R.push(C));var _=[];for(r=0;r0){for(var K=Ke.makeLineSpan("hline",t,c),J=Ke.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:h,shift:0}];m.length>0;){var ee=m.pop(),te=ee.pos-N;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}h=Ke.makeVList({positionType:"individualShift",children:Q},t)}if(0===O.length)return Ke.makeSpan(["mord"],[h],t);var re=Ke.makeVList({positionType:"individualShift",children:O},t);return re=Ke.makeSpan(["tag"],[re],t),Ke.makeFragment([h,re])},Xr={c:"center ",l:"left ",r:"right "},Wr=function(e,t){for(var r=[],n=new Tt.MathNode("mtd",[],["mtr-glue"]),a=new Tt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var p=e.cols,d="",f=!1,g=0,v=p.length;"separator"===p[0].type&&(c+="top ",g=1),"separator"===p[p.length-1].type&&(c+="bottom ",v-=1);for(var b=g;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o="split"===e.envName,s=Gr(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Vr(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c0&&u&&(f=1),a[p]={type:"align",align:d,pregap:f,postgap:0}}return s.colSeparationType=u?"align":"alignat",s};Or({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Gr(e.parser,a,Ur(e.envName))},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var i=e.parser;if(i.consumeSpaces(),"["===i.fetch().text){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),a.cols=[{type:"align",align:r}]}}var o=Gr(e.parser,a,Ur(e.envName)),s=Math.max.apply(Math,[0].concat(o.body.map((function(e){return e.length}))));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var r=(Xt(t[0])?[t[0]]:Ut(t[0],"ordgroup").body).map((function(e){var t=Yt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Gr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new n("{subarray} can contain only one column");return a},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=Gr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Ur(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){l.contains(["gather","gather*"],e.envName)&&Fr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Vr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:_r,htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){Fr(e);var t={autoTag:Vr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Gr(e.parser,t,"display")},htmlBuilder:Yr,mathmlBuilder:Wr}),Or({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return Fr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,i,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(u)>-1))throw new n('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var f=!0,g=c+1;g=x.SCRIPT.id?r.text():x.DISPLAY:"text"===e&&r.size===x.DISPLAY.size?r=x.TEXT:"script"===e?r=x.SCRIPT:"scriptscript"===e&&(r=x.SCRIPTSCRIPT),r},nn=function(e,t){var r,n=rn(e.size,t.style),a=n.fracNum(),i=n.fracDen();r=t.havingStyle(a);var o=wt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(u=t.fontMetrics().num2,p=c):(u=t.fontMetrics().num3,p=3*c),d=t.fontMetrics().denom2),h){var w=t.fontMetrics().axisHeight;u-o.depth-(w+.5*m)0&&(t="."===(t=e)?null:t),t};ot({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r,n=e.parser,a=t[4],i=t[5],o=lt(t[0]),s="atom"===o.type&&"open"===o.family?sn(o.text):null,l=lt(t[1]),h="atom"===l.type&&"close"===l.family?sn(l.text):null,m=Ut(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var u="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){var d=Ut(p.body[0],"textord");u=on[Number(d.text)]}}else p=Ut(p,"textord"),u=on[Number(p.text)];return{type:"genfrac",mode:n.mode,numer:a,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:u}},htmlBuilder:nn,mathmlBuilder:an}),ot({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ut(t[0],"size").value,token:n}}}),ot({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Ut(t[1],"infix").size),i=t[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:nn,mathmlBuilder:an});var ln=function(e,t){var r,n,a=t.style;"supsub"===e.type?(r=e.sup?wt(e.sup,t.havingStyle(a.sup()),t):wt(e.sub,t.havingStyle(a.sub()),t),n=Ut(e.base,"horizBrace")):n=Ut(e,"horizBrace");var i,o=wt(n.base,t.havingBaseStyle(x.DISPLAY)),s=Gt(n,t);if(n.isOver?(i=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Ke.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t);i=n.isOver?Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Ke.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Ke.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t)};ot({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:ln,mathmlBuilder:function(e,t){var r=Vt(e.label);return new Tt.MathNode(e.isOver?"mover":"munder",[Rt(e.base,t),r])}}),ot({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],a=Ut(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:a})?{type:"href",mode:r.mode,href:a,body:ht(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var r=ft(e.body,t,!1);return Ke.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=It(e.body,t);return r instanceof zt||(r=new zt("mrow",[r])),r.setAttribute("href",e.href),r}}),ot({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ut(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var a=[],i=0;i0&&(n=F(e.totalheight,t)-r);var a=0;e.width.number>0&&(a=F(e.width,t));var i={height:V(r+n)};a>0&&(i.width=V(a)),n>0&&(i.verticalAlign=V(-n));var o=new j(e.src,e.alt,i);return o.height=r,o.depth=n,o},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var n=F(e.height,t),a=0;if(e.totalheight.number>0&&(a=F(e.totalheight,t)-n,r.setAttribute("valign",V(-a))),r.setAttribute("height",V(n+a)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",V(i))}return r.setAttribute("src",e.src),r}}),ot({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=Ut(t[0],"size");if(r.settings.strict){var i="m"===n[1],o="mu"===a.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+a.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:a.value}},htmlBuilder:function(e,t){return Ke.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=F(e.dimension,t);return new Tt.SpaceNode(r)}}),ot({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:a}},htmlBuilder:function(e,t){var r;"clap"===e.alignment?(r=Ke.makeSpan([],[wt(e.body,t)]),r=Ke.makeSpan(["inner"],[r],t)):r=Ke.makeSpan(["inner"],[wt(e.body,t)]);var n=Ke.makeSpan(["fix"],[]),a=Ke.makeSpan([e.alignment],[r,n],t),i=Ke.makeSpan(["strut"]);return i.style.height=V(a.height+a.depth),a.depth&&(i.style.verticalAlign=V(-a.depth)),a.children.unshift(i),a=Ke.makeSpan(["thinbox"],[a],t),Ke.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mpadded",[Rt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),ot({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=e.funcName,n=e.parser,a=n.mode;n.switchMode("math");var i="\\("===r?"\\)":"$",o=n.parseExpression(!1,i);return n.expect(i),n.switchMode(a),{type:"styling",mode:n.mode,style:"text",body:o}}}),ot({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new n("Mismatched "+e.funcName)}});var mn=function(e,t){switch(t.style.size){case x.DISPLAY.size:return e.display;case x.TEXT.size:return e.text;case x.SCRIPT.size:return e.script;case x.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};ot({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ht(t[0]),text:ht(t[1]),script:ht(t[2]),scriptscript:ht(t[3])}},htmlBuilder:function(e,t){var r=mn(e,t),n=ft(r,t,!1);return Ke.makeFragment(n)},mathmlBuilder:function(e,t){var r=mn(e,t);return It(r,t)}});var cn=function(e,t,r,n,a,i,o){e=Ke.makeSpan([],[e]);var s,h,m,c=r&&l.isCharacterBox(r);if(t){var u=wt(t,n.havingStyle(a.sup()),n);h={elem:u,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-u.depth)}}if(r){var p=wt(r,n.havingStyle(a.sub()),n);s={elem:p,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-p.height)}}if(h&&s){var d=n.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(s){var f=e.height-o;m=Ke.makeVList({positionType:"top",positionData:f,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:V(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},n)}else{if(!h)return e;var g=e.depth+o;m=Ke.makeVList({positionType:"bottom",positionData:g,children:[{type:"elem",elem:e},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:V(i)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}var v=[m];if(s&&0!==i&&!c){var b=Ke.makeSpan(["mspace"],[],n);b.style.marginRight=V(i),v.unshift(b)}return Ke.makeSpan(["mop","op-limits"],v,n)},un=["\\smallint"],pn=function(e,t){var r,n,a,i=!1;"supsub"===e.type?(r=e.sup,n=e.sub,a=Ut(e.base,"op"),i=!0):a=Ut(e,"op");var o,s=t.style,h=!1;if(s.size===x.DISPLAY.size&&a.symbol&&!l.contains(un,a.name)&&(h=!0),a.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(c=a.name.substr(1),a.name="oiint"===c?"\\iint":"\\iiint"),o=Ke.makeSymbol(a.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),c.length>0){var u=o.italic,p=Ke.staticSvg(c+"Size"+(h?"2":"1"),t);o=Ke.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),a.name="\\"+c,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var d=ft(a.body,t,!0);1===d.length&&d[0]instanceof Z?(o=d[0]).classes[0]="mop":o=Ke.makeSpan(["mop"],d,t)}else{for(var f=[],g=1;g0){for(var s=a.body.map((function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ft(s,t.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height",V(a)):(s.setAttribute("height",V(a)),s.setAttribute("depth",V(-a))),s.setAttribute("voffset",V(a)),s}});var yn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];ot({type:"sizing",names:yn,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!1,r);return{type:"sizing",mode:a.mode,size:yn.indexOf(n)+1,body:i}},htmlBuilder:function(e,t){var r=t.havingSize(e.size);return bn(e.body,r,t)},mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Nt(e.body,r),a=new Tt.MathNode("mstyle",n);return a.setAttribute("mathsize",V(r.sizeMultiplier)),a}}),ot({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=!1,i=!1,o=r[0]&&Ut(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=V(m);var p=Ke.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(x.SCRIPTSCRIPT),f=wt(e.index,d,t),g=.6*(p.height-p.depth),v=Ke.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),b=Ke.makeSpan(["root"],[v]);return Ke.makeSpan(["mord","sqrt"],[b,p],t)}return Ke.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Tt.MathNode("mroot",[Rt(r,t),Rt(n,t)]):new Tt.MathNode("msqrt",[Rt(r,t)])}});var xn={display:x.DISPLAY,text:x.TEXT,script:x.SCRIPT,scriptscript:x.SCRIPTSCRIPT};ot({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:a.mode,style:o,body:i}},htmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r).withFont("");return bn(e.body,n,t)},mathmlBuilder:function(e,t){var r=xn[e.style],n=t.havingStyle(r),a=Nt(e.body,n),i=new Tt.MathNode("mstyle",a),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});var wn=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===x.DISPLAY.size||r.alwaysHandleSupSub)?pn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===x.DISPLAY.size||r.limits)?vn:null:"accent"===r.type?l.isCharacterBox(r.base)?Wt:null:"horizBrace"===r.type&&!e.sub===r.isOver?ln:null:null};st({type:"supsub",htmlBuilder:function(e,t){var r=wn(e,t);if(r)return r(e,t);var n,a,i,o=e.base,s=e.sup,h=e.sub,m=wt(o,t),c=t.fontMetrics(),u=0,p=0,d=o&&l.isCharacterBox(o);if(s){var f=t.havingStyle(t.style.sup());n=wt(s,f,t),d||(u=m.height-f.fontMetrics().supDrop*f.sizeMultiplier/t.sizeMultiplier)}if(h){var g=t.havingStyle(t.style.sub());a=wt(h,g,t),d||(p=m.depth+g.fontMetrics().subDrop*g.sizeMultiplier/t.sizeMultiplier)}i=t.style===x.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=V(.5/c.ptPerEm/b),w=null;if(a){var k=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(m instanceof Z||k)&&(w=V(-m.italic))}if(n&&a){u=Math.max(u,i,n.depth+.25*c.xHeight),p=Math.max(p,c.sub2);var S=4*c.defaultRuleThickness;if(u-n.depth-(a.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:a,shift:p,marginRight:y,marginLeft:w},{type:"elem",elem:n,shift:-u,marginRight:y}];v=Ke.makeVList({positionType:"individualShift",children:z},t)}else if(a){p=Math.max(p,c.sub1,a.height-.8*c.xHeight);var A=[{type:"elem",elem:a,marginLeft:w,marginRight:y}];v=Ke.makeVList({positionType:"shift",positionData:p,children:A},t)}else{if(!n)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,n.depth+.25*c.xHeight),v=Ke.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:n,marginRight:y}]},t)}var T=yt(m,"right")||"mord";return Ke.makeSpan([T],[m,Ke.makeSpan(["msupsub"],[v])],t)},mathmlBuilder:function(e,t){var r,n=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(n=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var a,i=[Rt(e.base,t)];if(e.sub&&i.push(Rt(e.sub,t)),e.sup&&i.push(Rt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;a=o&&"op"===o.type&&o.limits&&t.style===x.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===x.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;a=s&&"op"===s.type&&s.limits&&(t.style===x.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===x.DISPLAY)?"munder":"msub"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&(t.style===x.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===x.DISPLAY)?"mover":"msup"}return new Tt.MathNode(a,i)}}),st({type:"atom",htmlBuilder:function(e,t){return Ke.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[Bt(e.text,e.mode)]);if("bin"===e.family){var n=qt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var kn={mi:"italic",mn:"normal",mtext:"normal"};st({type:"mathord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mi",[Bt(e.text,e.mode,t)]),n=qt(e,t)||"italic";return n!==kn[r.type]&&r.setAttribute("mathvariant",n),r}}),st({type:"textord",htmlBuilder:function(e,t){return Ke.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=Bt(e.text,e.mode,t),a=qt(e,t)||"normal";return r="text"===e.mode?new Tt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Tt.MathNode("mn",[n]):"\\prime"===e.text?new Tt.MathNode("mo",[n]):new Tt.MathNode("mi",[n]),a!==kn[r.type]&&r.setAttribute("mathvariant",a),r}});var Sn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Mn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};st({type:"spacing",htmlBuilder:function(e,t){if(Mn.hasOwnProperty(e.text)){var r=Mn[e.text].className||"";if("text"===e.mode){var a=Ke.makeOrd(e,t,"textord");return a.classes.push(r),a}return Ke.makeSpan(["mspace",r],[Ke.mathsym(e.text,e.mode,t)],t)}if(Sn.hasOwnProperty(e.text))return Ke.makeSpan(["mspace",Sn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!Mn.hasOwnProperty(e.text)){if(Sn.hasOwnProperty(e.text))return new Tt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return new Tt.MathNode("mtext",[new Tt.TextNode("\xa0")])}});var zn=function(){var e=new Tt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};st({type:"tag",mathmlBuilder:function(e,t){var r=new Tt.MathNode("mtable",[new Tt.MathNode("mtr",[zn(),new Tt.MathNode("mtd",[It(e.body,t)]),zn(),new Tt.MathNode("mtd",[It(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var An={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Tn={"\\textbf":"textbf","\\textmd":"textmd"},Bn={"\\textit":"textit","\\textup":"textup"},Cn=function(e,t){var r=e.font;return r?An[r]?t.withTextFontFamily(An[r]):Tn[r]?t.withTextFontWeight(Tn[r]):t.withTextFontShape(Bn[r]):t};ot({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"text",mode:r.mode,body:ht(a),font:n}},htmlBuilder:function(e,t){var r=Cn(e,t),n=ft(e.body,r,!0);return Ke.makeSpan(["mord","text"],n,r)},mathmlBuilder:function(e,t){var r=Cn(e,t);return It(e.body,r)}}),ot({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=Ke.makeLineSpan("underline-line",t),a=t.fontMetrics().defaultRuleThickness,i=Ke.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a},{type:"elem",elem:n},{type:"kern",size:3*a},{type:"elem",elem:r}]},t);return Ke.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Tt.MathNode("mo",[new Tt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Tt.MathNode("munder",[Rt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),ot({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=wt(e.body,t),n=t.fontMetrics().axisHeight,a=.5*(r.height-n-(r.depth+n));return Ke.makeVList({positionType:"shift",positionData:a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){return new Tt.MathNode("mpadded",[Rt(e.body,t)],["vcenter"])}}),ot({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=qn(e),n=[],a=t.havingStyle(t.style.text()),i=0;i0;)this.endGroup()},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,r){if(void 0===r&&(r=!1),r){for(var n=0;n0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t},e}(),Hn=Hr;Er("\\noexpand",(function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Er("\\expandafter",(function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Er("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Er("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Er("\\@ifnextchar",(function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Er("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Er("\\TextOrMath",(function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));var En={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Er("\\char",(function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=En[r.text])||a>=t)throw new n("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=En[e.future().text])&&i":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Er("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Dn?t=Dn[r]:("\\not"===r.substr(0,4)||r in ae.math&&l.contains(["bin","rel"],ae.math[r].group))&&(t="\\dotsb"),t}));var Pn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Er("\\dotso",(function(e){return e.future().text in Pn?"\\ldots\\,":"\\ldots"})),Er("\\dotsc",(function(e){var t=e.future().text;return t in Pn&&","!==t?"\\ldots\\,":"\\ldots"})),Er("\\cdots",(function(e){return e.future().text in Pn?"\\@cdots\\,":"\\@cdots"})),Er("\\dotsb","\\cdots"),Er("\\dotsm","\\cdots"),Er("\\dotsi","\\!\\cdots"),Er("\\dotsx","\\ldots\\,"),Er("\\DOTSI","\\relax"),Er("\\DOTSB","\\relax"),Er("\\DOTSX","\\relax"),Er("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Er("\\,","\\tmspace+{3mu}{.1667em}"),Er("\\thinspace","\\,"),Er("\\>","\\mskip{4mu}"),Er("\\:","\\tmspace+{4mu}{.2222em}"),Er("\\medspace","\\:"),Er("\\;","\\tmspace+{5mu}{.2777em}"),Er("\\thickspace","\\;"),Er("\\!","\\tmspace-{3mu}{.1667em}"),Er("\\negthinspace","\\!"),Er("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Er("\\negthickspace","\\tmspace-{5mu}{.277em}"),Er("\\enspace","\\kern.5em "),Er("\\enskip","\\hskip.5em\\relax"),Er("\\quad","\\hskip1em\\relax"),Er("\\qquad","\\hskip2em\\relax"),Er("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Er("\\tag@paren","\\tag@literal{({#1})}"),Er("\\tag@literal",(function(e){if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Er("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Er("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Er("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Er("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Er("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),Er("\\newline","\\\\\\relax"),Er("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Fn=V(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Er("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Er("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Fn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Er("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Er("\\@hspace","\\hskip #1\\relax"),Er("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Er("\\ordinarycolon",":"),Er("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Er("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Er("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Er("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Er("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Er("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Er("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Er("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Er("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Er("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Er("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Er("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Er("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Er("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Er("\u2237","\\dblcolon"),Er("\u2239","\\eqcolon"),Er("\u2254","\\coloneqq"),Er("\u2255","\\eqqcolon"),Er("\u2a74","\\Coloneqq"),Er("\\ratio","\\vcentcolon"),Er("\\coloncolon","\\dblcolon"),Er("\\colonequals","\\coloneqq"),Er("\\coloncolonequals","\\Coloneqq"),Er("\\equalscolon","\\eqqcolon"),Er("\\equalscoloncolon","\\Eqqcolon"),Er("\\colonminus","\\coloneq"),Er("\\coloncolonminus","\\Coloneq"),Er("\\minuscolon","\\eqcolon"),Er("\\minuscoloncolon","\\Eqcolon"),Er("\\coloncolonapprox","\\Colonapprox"),Er("\\coloncolonsim","\\Colonsim"),Er("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Er("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Er("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Er("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Er("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Er("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Er("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Er("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Er("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Er("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Er("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Er("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Er("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Er("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Er("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Er("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Er("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Er("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Er("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Er("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Er("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Er("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Er("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Er("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Er("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Er("\\imath","\\html@mathml{\\@imath}{\u0131}"),Er("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Er("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Er("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Er("\u27e6","\\llbracket"),Er("\u27e7","\\rrbracket"),Er("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Er("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Er("\u2983","\\lBrace"),Er("\u2984","\\rBrace"),Er("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Er("\u29b5","\\minuso"),Er("\\darr","\\downarrow"),Er("\\dArr","\\Downarrow"),Er("\\Darr","\\Downarrow"),Er("\\lang","\\langle"),Er("\\rang","\\rangle"),Er("\\uarr","\\uparrow"),Er("\\uArr","\\Uparrow"),Er("\\Uarr","\\Uparrow"),Er("\\N","\\mathbb{N}"),Er("\\R","\\mathbb{R}"),Er("\\Z","\\mathbb{Z}"),Er("\\alef","\\aleph"),Er("\\alefsym","\\aleph"),Er("\\Alpha","\\mathrm{A}"),Er("\\Beta","\\mathrm{B}"),Er("\\bull","\\bullet"),Er("\\Chi","\\mathrm{X}"),Er("\\clubs","\\clubsuit"),Er("\\cnums","\\mathbb{C}"),Er("\\Complex","\\mathbb{C}"),Er("\\Dagger","\\ddagger"),Er("\\diamonds","\\diamondsuit"),Er("\\empty","\\emptyset"),Er("\\Epsilon","\\mathrm{E}"),Er("\\Eta","\\mathrm{H}"),Er("\\exist","\\exists"),Er("\\harr","\\leftrightarrow"),Er("\\hArr","\\Leftrightarrow"),Er("\\Harr","\\Leftrightarrow"),Er("\\hearts","\\heartsuit"),Er("\\image","\\Im"),Er("\\infin","\\infty"),Er("\\Iota","\\mathrm{I}"),Er("\\isin","\\in"),Er("\\Kappa","\\mathrm{K}"),Er("\\larr","\\leftarrow"),Er("\\lArr","\\Leftarrow"),Er("\\Larr","\\Leftarrow"),Er("\\lrarr","\\leftrightarrow"),Er("\\lrArr","\\Leftrightarrow"),Er("\\Lrarr","\\Leftrightarrow"),Er("\\Mu","\\mathrm{M}"),Er("\\natnums","\\mathbb{N}"),Er("\\Nu","\\mathrm{N}"),Er("\\Omicron","\\mathrm{O}"),Er("\\plusmn","\\pm"),Er("\\rarr","\\rightarrow"),Er("\\rArr","\\Rightarrow"),Er("\\Rarr","\\Rightarrow"),Er("\\real","\\Re"),Er("\\reals","\\mathbb{R}"),Er("\\Reals","\\mathbb{R}"),Er("\\Rho","\\mathrm{P}"),Er("\\sdot","\\cdot"),Er("\\sect","\\S"),Er("\\spades","\\spadesuit"),Er("\\sub","\\subset"),Er("\\sube","\\subseteq"),Er("\\supe","\\supseteq"),Er("\\Tau","\\mathrm{T}"),Er("\\thetasym","\\vartheta"),Er("\\weierp","\\wp"),Er("\\Zeta","\\mathrm{Z}"),Er("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Er("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Er("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Er("\\bra","\\mathinner{\\langle{#1}|}"),Er("\\ket","\\mathinner{|{#1}\\rangle}"),Er("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Er("\\Bra","\\left\\langle#1\\right|"),Er("\\Ket","\\left|#1\\right\\rangle"),Er("\\angln","{\\angl n}"),Er("\\blue","\\textcolor{##6495ed}{#1}"),Er("\\orange","\\textcolor{##ffa500}{#1}"),Er("\\pink","\\textcolor{##ff00af}{#1}"),Er("\\red","\\textcolor{##df0030}{#1}"),Er("\\green","\\textcolor{##28ae7b}{#1}"),Er("\\gray","\\textcolor{gray}{#1}"),Er("\\purple","\\textcolor{##9d38bd}{#1}"),Er("\\blueA","\\textcolor{##ccfaff}{#1}"),Er("\\blueB","\\textcolor{##80f6ff}{#1}"),Er("\\blueC","\\textcolor{##63d9ea}{#1}"),Er("\\blueD","\\textcolor{##11accd}{#1}"),Er("\\blueE","\\textcolor{##0c7f99}{#1}"),Er("\\tealA","\\textcolor{##94fff5}{#1}"),Er("\\tealB","\\textcolor{##26edd5}{#1}"),Er("\\tealC","\\textcolor{##01d1c1}{#1}"),Er("\\tealD","\\textcolor{##01a995}{#1}"),Er("\\tealE","\\textcolor{##208170}{#1}"),Er("\\greenA","\\textcolor{##b6ffb0}{#1}"),Er("\\greenB","\\textcolor{##8af281}{#1}"),Er("\\greenC","\\textcolor{##74cf70}{#1}"),Er("\\greenD","\\textcolor{##1fab54}{#1}"),Er("\\greenE","\\textcolor{##0d923f}{#1}"),Er("\\goldA","\\textcolor{##ffd0a9}{#1}"),Er("\\goldB","\\textcolor{##ffbb71}{#1}"),Er("\\goldC","\\textcolor{##ff9c39}{#1}"),Er("\\goldD","\\textcolor{##e07d10}{#1}"),Er("\\goldE","\\textcolor{##a75a05}{#1}"),Er("\\redA","\\textcolor{##fca9a9}{#1}"),Er("\\redB","\\textcolor{##ff8482}{#1}"),Er("\\redC","\\textcolor{##f9685d}{#1}"),Er("\\redD","\\textcolor{##e84d39}{#1}"),Er("\\redE","\\textcolor{##bc2612}{#1}"),Er("\\maroonA","\\textcolor{##ffbde0}{#1}"),Er("\\maroonB","\\textcolor{##ff92c6}{#1}"),Er("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Er("\\maroonD","\\textcolor{##ca337c}{#1}"),Er("\\maroonE","\\textcolor{##9e034e}{#1}"),Er("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Er("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Er("\\purpleC","\\textcolor{##aa87ff}{#1}"),Er("\\purpleD","\\textcolor{##7854ab}{#1}"),Er("\\purpleE","\\textcolor{##543b78}{#1}"),Er("\\mintA","\\textcolor{##f5f9e8}{#1}"),Er("\\mintB","\\textcolor{##edf2df}{#1}"),Er("\\mintC","\\textcolor{##e0e5cc}{#1}"),Er("\\grayA","\\textcolor{##f6f7f7}{#1}"),Er("\\grayB","\\textcolor{##f0f1f2}{#1}"),Er("\\grayC","\\textcolor{##e3e5e6}{#1}"),Er("\\grayD","\\textcolor{##d6d8da}{#1}"),Er("\\grayE","\\textcolor{##babec2}{#1}"),Er("\\grayF","\\textcolor{##888d93}{#1}"),Er("\\grayG","\\textcolor{##626569}{#1}"),Er("\\grayH","\\textcolor{##3b3e40}{#1}"),Er("\\grayI","\\textcolor{##21242c}{#1}"),Er("\\kaBlue","\\textcolor{##314453}{#1}"),Er("\\kaGreen","\\textcolor{##71B307}{#1}");var Vn={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Gn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new On(Hn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new Rn(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.endGroups=function(){this.macros.endGroups()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var a=this.consumeArg(["]"]);n=a.tokens,r=a.end}else{var i=this.consumeArg();n=i.tokens,t=i.start,r=i.end}return this.pushToken(new Dr("EOF",r.loc)),this.pushTokens(n),t.range(r,"")},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArg=function(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,i=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new n("Extra }",a)}else if("EOF"===a.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===i.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:i,end:a}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting");var i=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(i=i.slice()).length-1;s>=0;--s){var l=i[s];if("#"===l.text){if(0===s)throw new n("Incomplete placeholder at end of macro body",l);if("#"===(l=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new n("Not a valid argument number",l);var h;(h=i).splice.apply(h,[s,2].concat(o[+l.text-1]))}}}return this.pushTokens(i),i},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof Dr)return e.treatAsRelax&&(e.text="\\relax"),this.stack.pop()}throw new Error},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new Dr(e)]):void 0},t.expandTokens=function(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;){var n=this.expandOnce(!0);n instanceof Dr&&(n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map((function(e){return e.text})).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var n="function"==typeof t?t(this):t;if("string"==typeof n){var a=0;if(-1!==n.indexOf("#"))for(var i=n.replace(/##/g,"");-1!==i.indexOf("#"+(a+1));)++a;for(var o=new Rn(n,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:a}}return n},t.isDefined=function(e){return this.macros.has(e)||Nn.hasOwnProperty(e)||ae.math.hasOwnProperty(e)||ae.text.hasOwnProperty(e)||Vn.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Nn.hasOwnProperty(e)&&!Nn[e].primitive},e}(),Un={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Yn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Xn=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Gn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}},t.subparse=function(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new Dr("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r},t.parseExpression=function(t,r){for(var n=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==e.endOfExpression.indexOf(a.text))break;if(r&&a.text===r)break;if(t&&Nn[a.text]&&Nn[a.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&n.push(i)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)},t.handleInfixNodes=function(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var s,l=ae[this.mode][t].group,h=Lr.range(e);if(te.hasOwnProperty(l)){var m=l;s={type:"atom",mode:this.mode,family:m,loc:h,text:t}}else s={type:l,mode:this.mode,loc:h,text:t};i=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:"text",loc:Lr.range(e),text:t}}if(this.consume(),o)for(var c=0;cli { + margin-left: 22px; +} + +ol>li { + margin-left: 27.2px; +} + +li>*:first-child { + margin-top: 0 +} + +/* Text alignements, this should be forbidden. */ + +.left { + text-align: left; +} + +.right { + text-align: right; +} + +.center { + text-align: center; +} + +/* Links and anchors */ + +a { + text-decoration: none; + color: var(--link-color); +} + +a:hover { + box-shadow: 0 1px 0 0 var(--link-color); +} + +/* Linked highlight */ +*:target { + background-color: var(--target-background) !important; + box-shadow: 0 0px 0 1px var(--target-shadow) !important; + border-radius: 1px; +} + +*:hover > a.anchor { + visibility: visible; +} + +a.anchor:before { + content: "#"; +} + +a.anchor:hover { + box-shadow: none; + text-decoration: none; + color: var(--anchor-hover); +} + +a.anchor { + visibility: hidden; + position: absolute; + /* top: 0px; */ + /* margin-left: -3ex; */ + margin-left: -1.3em; + font-weight: normal; + font-style: normal; + padding-right: 0.4em; + padding-left: 0.4em; + /* To remain selectable */ + color: var(--anchor-color); +} + +.spec > a.anchor { + margin-left: -2.3em; + padding-right: 0.9em; +} + +.xref-unresolved { + color: #2C94BD; +} +.xref-unresolved:hover { + box-shadow: 0 1px 0 0 var(--xref-shadow); +} + +/* Section and document divisions. + Until at least 4.03 many of the modules of the stdlib start at .h7, + we restart the sequence there like h2 */ + +h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 { + font-family: "Fira Sans", Helvetica, Arial, sans-serif; + font-weight: 400; + padding-top: 0.1em; + line-height: 1.2; + overflow-wrap: break-word; +} + +h1 { + font-weight: 500; + font-size: 2.441em; +} + +h1 { + font-weight: 500; + font-size: 1.953em; + box-shadow: 0 1px 0 0 var(--header-shadow); +} + +h2 { + font-size: 1.563em; +} + +h3 { + font-size: 1.25em; +} + +small, .font_small { + font-size: 0.8em; +} + +h1 code, h1 tt { + font-size: inherit; + font-weight: inherit; +} + +h2 code, h2 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h3 code, h3 tt { + font-size: inherit; + font-weight: inherit; +} + +h4 { + font-size: 1.12em; +} + +/* Comment delimiters, hidden but accessible to screen readers and + selected for copy/pasting */ + +/* Taken from bootstrap */ +/* See also https://stackoverflow.com/a/27769435/4220738 */ +.comment-delim { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +/* Preformatted and code */ + +tt, code, pre { + font-family: "Fira Mono", courier; + font-weight: 400; +} + +pre { + padding: 0.1em; + border: 1px solid var(--pre-border-color); + border-radius: 5px; + overflow-x: auto; +} + +p code, +li code { + background-color: var(--li-code-background); + color: var(--li-code-color); + border-radius: 3px; + padding: 0 0.3ex; +} + +p a > code { + color: var(--link-color); +} + +code { + white-space: pre-wrap; +} + +/* Code blocks (e.g. Examples) */ + +pre code { + font-size: 0.893rem; +} + +/* Code lexemes */ + +.keyword { + font-weight: 500; +} + +.arrow { white-space: nowrap } + +/* Module member specification */ + +.spec { + background-color: var(--spec-summary-background); + border-radius: 3px; + border-left: 4px solid var(--spec-summary-border-color); + border-right: 5px solid transparent; + padding: 0.35em 0.5em; +} + +li:not(:last-child) > .def-doc { + margin-bottom: 15px; +} + +/* Spacing between items */ +div.odoc-spec,.odoc-include { + margin-bottom: 2em; +} + +.spec.type .variant p, .spec.type .record p { + margin: 5px; +} + +.spec.type .variant, .spec.type .record { + margin-left: 2ch; + list-style: none; + display: flex; + flex-wrap: wrap; + row-gap: 4px; +} + +.spec.type .record > code, .spec.type .variant > code { + min-width: 40%; +} + +.spec.type > ol { + margin-top: 0; + margin-bottom: 0; +} + +.spec.type .record > .def-doc, .spec.type .variant > .def-doc { + min-width:50%; + padding: 0.25em 0.5em; + margin-left: 10%; + border-radius: 3px; + flex-grow:1; + background: var(--main-background); + box-shadow: 2px 2px 4px lightgrey; +} + +div.def { + margin-top: 0; + text-indent: -2ex; + padding-left: 2ex; +} + +div.def-doc>*:first-child { + margin-top: 0; +} + +/* Collapsible inlined include and module */ + +.odoc-include details { + position: relative; +} + +.odoc-include.shadowed-include { + display: none; +} + +.odoc-include details:after { + z-index: -100; + display: block; + content: " "; + position: absolute; + border-radius: 0 1ex 1ex 0; + right: -20px; + top: 1px; + bottom: 1px; + width: 15px; + background: var(--spec-details-after-background, rgba(0, 4, 15, 0.05)); + box-shadow: 0 0px 0 1px var(--spec-details-after-shadow, rgba(204, 204, 204, 0.53)); +} + +.odoc-include summary { + position: relative; + margin-bottom: 1em; + cursor: pointer; + outline: none; +} + +.odoc-include summary:hover { + background-color: var(--spec-summary-hover-background); +} + +/* FIXME: Does not work in Firefox. */ +.odoc-include summary::-webkit-details-marker { + color: #888; + transform: scaleX(-1); + position: absolute; + top: calc(50% - 5px); + height: 11px; + right: -29px; +} + +/* Records and variants FIXME */ + +div.def table { + text-indent: 0em; + padding: 0; + margin-left: -2ex; +} + +td.def { + padding-left: 2ex; +} + +td.def-doc *:first-child { + margin-top: 0em; +} + +/* Lists of @tags */ + +.at-tags { list-style-type: none; margin-left: -3ex; } +.at-tags li { padding-left: 3ex; text-indent: -3ex; } +.at-tags .at-tag { text-transform: capitalize } + +/* Lists of modules */ + +.modules { list-style-type: none; margin-left: -3ex; } +.modules li { padding-left: 3ex; text-indent: -3ex; margin-top: 5px } +.modules .synopsis { padding-left: 1ch; } + +/* Odig package index */ + +.packages { list-style-type: none; margin-left: -3ex; } +.packages li { padding-left: 3ex; text-indent: -3ex } +.packages li a.anchor { padding-right: 0.5ch; padding-left: 3ch; } +.packages .version { font-size: 10px; color: var(--by-name-version-color); } +.packages .synopsis { padding-left: 1ch } + +.by-name nav a { + text-transform: uppercase; + font-size: 18px; + margin-right: 1ex; + color: var(--by-name-nav-link-color,); + display: inline-block; +} + +.by-tag nav a { + margin-right: 1ex; + color: var(--by-name-nav-link-color); + display: inline-block; +} + +.by-tag ol { list-style-type: none; } +.by-tag ol.tags li { margin-left: 1ch; display: inline-block } +.by-tag td:first-child { text-transform: uppercase; } + +/* Odig package page */ + +.package nav { + display: inline; + font-size: 14px; + font-weight: normal; +} + +.package .version { + font-size: 14px; +} + +.package.info { + margin: 0; +} + +.package.info td:first-child { + font-style: italic; + padding-right: 2ex; +} + +.package.info ul { + list-style-type: none; + display: inline; + margin: 0; +} + +.package.info li { + display: inline-block; + margin: 0; + margin-right: 1ex; +} + +#info-authors li, #info-maintainers li { + display: block; +} + +/* Sidebar and TOC */ + +.odoc-toc:before { + display: block; + content: "Contents"; + text-transform: uppercase; + font-size: 1em; + margin: 1.414em 0 0.5em; + font-weight: 500; + color: var(--toc-before-color); + line-height: 1.2; +} + +.odoc-toc { + position: fixed; + top: 0px; + bottom: 0px; + left: 0px; + max-width: 30ex; + min-width: 26ex; + width: 20%; + background: var(--toc-background); + overflow: auto; + color: var(--toc-color); + padding-left: 2ex; + padding-right: 2ex; +} + +.odoc-toc ul li a { + font-family: "Fira Sans", sans-serif; + font-size: 0.95em; + color: var(--color); + font-weight: 400; + line-height: 1.6em; + display: block; +} + +.odoc-toc ul li a:hover { + box-shadow: none; + text-decoration: underline; +} + +/* First level titles */ + +.odoc-toc>ul>li>a { + font-weight: 500; +} + +.odoc-toc li ul { + margin: 0px; +} + +.odoc-toc ul { + list-style-type: none; +} + +.odoc-toc ul li { + margin: 0; +} +.odoc-toc>ul>li { + margin-bottom: 0.3em; +} + +.odoc-toc ul li li { + border-left: 1px solid var(--toc-list-border); + margin-left: 5px; + padding-left: 12px; +} + +/* Mobile adjustements. */ + +@media only screen and (max-width: 95ex) { + body.odoc { + margin: 2em; + } + .odoc-toc { + position: static; + width: auto; + min-width: unset; + max-width: unset; + border: none; + padding: 0.2em 1em; + border-radius: 5px; + margin-bottom: 2em; + } +} + +/* Print adjustements. */ + +@media print { + body { + color: black; + background: white; + } + body nav:first-child { + visibility: hidden; + } +} + +/* Syntax highlighting (based on github-gist) */ + +.hljs { + display: block; + background: var(--code-background); + padding: 0.5em; + color: var(--color); + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag { + color: #a71d5d; +} + +.hljs-type, +.hljs-class .hljs-title { + color: #458; + font-weight: 500; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/*--------------------------------------------------------------------------- + Copyright (c) 2016 The odoc contributors + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + ---------------------------------------------------------------------------*/ diff --git a/webapp/circles.html b/webapp/circles.html new file mode 100644 index 00000000..0fcd3b5f --- /dev/null +++ b/webapp/circles.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/webapp/circles.js b/webapp/circles.js new file mode 100644 index 00000000..56990443 --- /dev/null +++ b/webapp/circles.js @@ -0,0 +1,66746 @@ +//# 1 ".circles.eobjs/jsoo/circles.bc.runtime.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=runtime, use-js-string=true, version=5.1.1 + +//# 7 ".circles.eobjs/jsoo/circles.bc.runtime.js" +(function + (Object){ + typeof globalThis !== "object" + && + (this + ? get() + : (Object.defineProperty + (Object.prototype, "_T_", {configurable: true, get: get}), + _T_)); + function get(){ + var global = this || self; + global.globalThis = global; + delete Object.prototype._T_; + } + } + (Object)); +(function(globalThis){ + "use strict"; + function caml_int64_is_zero(x){return + x.isZero();} + function caml_str_repeat(n, s){ + if(n == 0) return ""; + if(s.repeat) return s.repeat(n); + var r = "", l = 0; + for(;;){ + if(n & 1) r += s; + n >>= 1; + if(n == 0) return r; + s += s; + l++; + if(l == 9) s.slice(0, 1); + } + } + var caml_int64_offset = Math.pow(2, - 24); + function caml_raise_constant(tag){throw tag;} + var caml_global_data = [0]; + function caml_raise_zero_divide(){ + caml_raise_constant(caml_global_data.Division_by_zero); + } + function MlInt64(lo, mi, hi){ + this.lo = lo & 0xffffff; + this.mi = mi & 0xffffff; + this.hi = hi & 0xffff; + } + MlInt64.prototype.caml_custom = "_j"; + MlInt64.prototype.copy = + function(){return new MlInt64(this.lo, this.mi, this.hi);}; + MlInt64.prototype.ucompare = + function(x){ + if(this.hi > x.hi) return 1; + if(this.hi < x.hi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.compare = + function(x){ + var hi = this.hi << 16, xhi = x.hi << 16; + if(hi > xhi) return 1; + if(hi < xhi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.neg = + function(){ + var + lo = - this.lo, + mi = - this.mi + (lo >> 24), + hi = - this.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.add = + function(x){ + var + lo = this.lo + x.lo, + mi = this.mi + x.mi + (lo >> 24), + hi = this.hi + x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.sub = + function(x){ + var + lo = this.lo - x.lo, + mi = this.mi - x.mi + (lo >> 24), + hi = this.hi - x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.mul = + function(x){ + var + lo = this.lo * x.lo, + mi = (lo * caml_int64_offset | 0) + this.mi * x.lo + this.lo * x.mi, + hi = + (mi * caml_int64_offset | 0) + this.hi * x.lo + this.mi * x.mi + + this.lo * x.hi; + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.isZero = + function(){return (this.lo | this.mi | this.hi) == 0;}; + MlInt64.prototype.isNeg = function(){return this.hi << 16 < 0;}; + MlInt64.prototype.and = + function(x){ + return new MlInt64(this.lo & x.lo, this.mi & x.mi, this.hi & x.hi); + }; + MlInt64.prototype.or = + function(x){ + return new MlInt64(this.lo | x.lo, this.mi | x.mi, this.hi | x.hi); + }; + MlInt64.prototype.xor = + function(x){ + return new MlInt64(this.lo ^ x.lo, this.mi ^ x.mi, this.hi ^ x.hi); + }; + MlInt64.prototype.shift_left = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo << s, + this.mi << s | this.lo >> 24 - s, + this.hi << s | this.mi >> 24 - s); + if(s < 48) + return new + MlInt64 + (0, this.lo << s - 24, this.mi << s - 24 | this.lo >> 48 - s); + return new MlInt64(0, 0, this.lo << s - 48); + }; + MlInt64.prototype.shift_right_unsigned = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | this.hi << 24 - s, + this.hi >> s); + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, this.hi >> s - 24, 0); + return new MlInt64(this.hi >> s - 48, 0, 0); + }; + MlInt64.prototype.shift_right = + function(s){ + s = s & 63; + if(s == 0) return this; + var h = this.hi << 16 >> 16; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | h << 24 - s, + this.hi << 16 >> s >>> 16); + var sign = this.hi << 16 >> 31; + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, + this.hi << 16 >> s - 24 >> 16, + sign & 0xffff); + return new MlInt64(this.hi << 16 >> s - 32, sign, sign); + }; + MlInt64.prototype.lsl1 = + function(){ + this.hi = this.hi << 1 | this.mi >> 23; + this.mi = (this.mi << 1 | this.lo >> 23) & 0xffffff; + this.lo = this.lo << 1 & 0xffffff; + }; + MlInt64.prototype.lsr1 = + function(){ + this.lo = (this.lo >>> 1 | this.mi << 23) & 0xffffff; + this.mi = (this.mi >>> 1 | this.hi << 23) & 0xffffff; + this.hi = this.hi >>> 1; + }; + MlInt64.prototype.udivmod = + function(x){ + var + offset = 0, + modulus = this.copy(), + divisor = x.copy(), + quotient = new MlInt64(0, 0, 0); + while(modulus.ucompare(divisor) > 0){offset++; divisor.lsl1();} + while(offset >= 0){ + offset--; + quotient.lsl1(); + if(modulus.ucompare(divisor) >= 0){ + quotient.lo++; + modulus = modulus.sub(divisor); + } + divisor.lsr1(); + } + return {quotient: quotient, modulus: modulus}; + }; + MlInt64.prototype.div = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi ^ y.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var q = x.udivmod(y).quotient; + if(sign & 0x8000) q = q.neg(); + return q; + }; + MlInt64.prototype.mod = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var r = x.udivmod(y).modulus; + if(sign & 0x8000) r = r.neg(); + return r; + }; + MlInt64.prototype.toInt = function(){return this.lo | this.mi << 24;}; + MlInt64.prototype.toFloat = + function(){ + return (this.hi << 16) * Math.pow(2, 32) + this.mi * Math.pow(2, 24) + + this.lo; + }; + MlInt64.prototype.toArray = + function(){ + return [this.hi >> 8, + this.hi & 0xff, + this.mi >> 16, + this.mi >> 8 & 0xff, + this.mi & 0xff, + this.lo >> 16, + this.lo >> 8 & 0xff, + this.lo & 0xff]; + }; + MlInt64.prototype.lo32 = + function(){return this.lo | (this.mi & 0xff) << 24;}; + MlInt64.prototype.hi32 = + function(){return this.mi >>> 8 & 0xffff | this.hi << 16;}; + function caml_int64_of_int32(x){ + return new MlInt64(x & 0xffffff, x >> 24 & 0xffffff, x >> 31 & 0xffff); + } + function caml_int64_to_int32(x){return x.toInt();} + function caml_int64_is_negative(x){return + x.isNeg();} + function caml_int64_neg(x){return x.neg();} + function caml_jsbytes_of_string(x){return x;} + function jsoo_sys_getenv(n){ + var process = globalThis.process; + if(process && process.env && process.env[n] != undefined) + return process.env[n]; + if(globalThis.jsoo_static_env && globalThis.jsoo_static_env[n]) + return globalThis.jsoo_static_env[n]; + } + var caml_record_backtrace_flag = 0; + (function(){ + var r = jsoo_sys_getenv("OCAMLRUNPARAM"); + if(r !== undefined){ + var l = r.split(","); + for(var i = 0; i < l.length; i++) + if(l[i] == "b"){ + caml_record_backtrace_flag = 1; + break; + } + else if(l[i].startsWith("b=")) + caml_record_backtrace_flag = + l[i].slice(2); + else + continue; + } + } + ()); + function caml_exn_with_js_backtrace(exn, force){ + if(! exn.js_error || force || exn[0] == 248) + exn.js_error = new globalThis.Error("Js exception containing backtrace"); + return exn; + } + function caml_maybe_attach_backtrace(exn, force){ + return caml_record_backtrace_flag + ? caml_exn_with_js_backtrace(exn, force) + : exn; + } + function caml_raise_with_arg(tag, arg){ + throw caml_maybe_attach_backtrace([0, tag, arg]); + } + function caml_string_of_jsbytes(x){return x;} + function caml_raise_with_string(tag, msg){ + caml_raise_with_arg(tag, caml_string_of_jsbytes(msg)); + } + function caml_invalid_argument(msg){ + caml_raise_with_string(caml_global_data.Invalid_argument, msg); + } + function caml_parse_format(fmt){ + fmt = caml_jsbytes_of_string(fmt); + var len = fmt.length; + if(len > 31) caml_invalid_argument("format_int: format too long"); + var + f = + {justify: "+", + signstyle: "-", + filler: " ", + alternate: false, + base: 0, + signedconv: false, + width: 0, + uppercase: false, + sign: 1, + prec: - 1, + conv: "f"}; + for(var i = 0; i < len; i++){ + var c = fmt.charAt(i); + switch(c){ + case "-": + f.justify = "-"; break; + case "+": + case " ": + f.signstyle = c; break; + case "0": + f.filler = "0"; break; + case "#": + f.alternate = true; break; + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + f.width = 0; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.width = f.width * 10 + c; i++;} + i--; + break; + case ".": + f.prec = 0; + i++; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.prec = f.prec * 10 + c; i++;} + i--; + case "d": + case "i": + f.signedconv = true; + case "u": + f.base = 10; break; + case "x": + f.base = 16; break; + case "X": + f.base = 16; f.uppercase = true; break; + case "o": + f.base = 8; break; + case "e": + case "f": + case "g": + f.signedconv = true; f.conv = c; break; + case "E": + case "F": + case "G": + f.signedconv = true; + f.uppercase = true; + f.conv = c.toLowerCase(); + break; + } + } + return f; + } + function caml_finish_formatting(f, rawbuffer){ + if(f.uppercase) rawbuffer = rawbuffer.toUpperCase(); + var len = rawbuffer.length; + if(f.signedconv && (f.sign < 0 || f.signstyle != "-")) len++; + if(f.alternate){if(f.base == 8) len += 1; if(f.base == 16) len += 2;} + var buffer = ""; + if(f.justify == "+" && f.filler == " ") + for(var i = len; i < f.width; i++) buffer += " "; + if(f.signedconv) + if(f.sign < 0) + buffer += "-"; + else if(f.signstyle != "-") buffer += f.signstyle; + if(f.alternate && f.base == 8) buffer += "0"; + if(f.alternate && f.base == 16) buffer += f.uppercase ? "0X" : "0x"; + if(f.justify == "+" && f.filler == "0") + for(var i = len; i < f.width; i++) buffer += "0"; + buffer += rawbuffer; + if(f.justify == "-") for(var i = len; i < f.width; i++) buffer += " "; + return caml_string_of_jsbytes(buffer); + } + function caml_int64_format(fmt, x){ + var f = caml_parse_format(fmt); + if(f.signedconv && caml_int64_is_negative(x)){f.sign = - 1; x = caml_int64_neg(x);} + var + buffer = "", + wbase = caml_int64_of_int32(f.base), + cvtbl = "0123456789abcdef"; + do{ + var p = x.udivmod(wbase); + x = p.quotient; + buffer = cvtbl.charAt(caml_int64_to_int32(p.modulus)) + buffer; + } + while + (! caml_int64_is_zero(x)); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - buffer.length; + if(n > 0) buffer = caml_str_repeat(n, "0") + buffer; + } + return caml_finish_formatting(f, buffer); + } + function caml_expm1_float(x){return Math.expm1(x);} + function caml_ml_condition_broadcast(t){return 0;} + function jsoo_is_ascii(s){ + if(s.length < 24){ + for(var i = 0; i < s.length; i++) if(s.charCodeAt(i) > 127) return false; + return true; + } + else + return ! /[^\x00-\x7f]/.test(s); + } + function caml_utf16_of_utf8(s){ + for(var b = "", t = "", c, c1, c2, v, i = 0, l = s.length; i < l; i++){ + c1 = s.charCodeAt(i); + if(c1 < 0x80){ + for(var j = i + 1; j < l && (c1 = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + v = 1; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c1 << 6); + if(c1 < 0xe0){ + v = c - 0x3080; + if(v < 0x80) v = 1; + } + else{ + v = 2; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c << 6); + if(c1 < 0xf0){ + v = c - 0xe2080; + if(v < 0x800 || v >= 0xd7ff && v < 0xe000) v = 2; + } + else{ + v = 3; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128 && c1 < 0xf5){ + v = c2 - 0x3c82080 + (c << 6); + if(v < 0x10000 || v > 0x10ffff) v = 3; + } + } + } + } + } + if(v < 4){ + i -= v; + t += "\ufffd"; + } + else if(v > 0xffff) + t += String.fromCharCode(0xd7c0 + (v >> 10), 0xdc00 + (v & 0x3FF)); + else + t += String.fromCharCode(v); + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_jsstring_of_string(s){ + if(jsoo_is_ascii(s)) return s; + return caml_utf16_of_utf8(s); + } + function fs_node_supported(){ + return typeof globalThis.process !== "undefined" + && typeof globalThis.process.versions !== "undefined" + && typeof globalThis.process.versions.node !== "undefined"; + } + function make_path_is_absolute(){ + function posix(path){ + if(path.charAt(0) === "/") return ["", path.substring(1)]; + return; + } + function win32(path){ + var + splitDeviceRe = + /^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/, + result = splitDeviceRe.exec(path), + device = result[1] || "", + isUnc = Boolean(device && device.charAt(1) !== ":"); + if(Boolean(result[2] || isUnc)){ + var root = result[1] || "", sep = result[2] || ""; + return [root, path.substring(root.length + sep.length)]; + } + return; + } + return fs_node_supported() && globalThis.process + && globalThis.process.platform + ? globalThis.process.platform === "win32" ? win32 : posix + : posix; + } + var path_is_absolute = make_path_is_absolute(); + function caml_trailing_slash(name){ + return name.slice(- 1) !== "/" ? name + "/" : name; + } + if(fs_node_supported() && globalThis.process && globalThis.process.cwd) + var caml_current_dir = globalThis.process.cwd().replace(/\\/g, "/"); + else + var caml_current_dir = "/static"; + caml_current_dir = caml_trailing_slash(caml_current_dir); + function caml_make_path(name){ + name = caml_jsstring_of_string(name); + if(! path_is_absolute(name)) name = caml_current_dir + name; + var + comp0 = path_is_absolute(name), + comp = comp0[1].split("/"), + ncomp = []; + for(var i = 0; i < comp.length; i++) + switch(comp[i]){ + case "..": + if(ncomp.length > 1) ncomp.pop(); break; + case ".": break; + case "": break; + default: ncomp.push(comp[i]); break; + } + ncomp.unshift(comp0[0]); + ncomp.orig = name; + return ncomp; + } + function caml_utf8_of_utf16(s){ + for(var b = "", t = b, c, d, i = 0, l = s.length; i < l; i++){ + c = s.charCodeAt(i); + if(c < 0x80){ + for(var j = i + 1; j < l && (c = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + if(c < 0x800){ + t += String.fromCharCode(0xc0 | c >> 6); + t += String.fromCharCode(0x80 | c & 0x3f); + } + else if(c < 0xd800 || c >= 0xdfff) + t += + String.fromCharCode + (0xe0 | c >> 12, 0x80 | c >> 6 & 0x3f, 0x80 | c & 0x3f); + else if + (c >= 0xdbff || i + 1 == l || (d = s.charCodeAt(i + 1)) < 0xdc00 + || d > 0xdfff) + t += "\xef\xbf\xbd"; + else{ + i++; + c = (c << 10) + d - 0x35fdc00; + t += + String.fromCharCode + (0xf0 | c >> 18, + 0x80 | c >> 12 & 0x3f, + 0x80 | c >> 6 & 0x3f, + 0x80 | c & 0x3f); + } + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_string_of_jsstring(s){ + return jsoo_is_ascii(s) + ? caml_string_of_jsbytes(s) + : caml_string_of_jsbytes(caml_utf8_of_utf16(s)); + } + var + unix_error = + ["E2BIG", + "EACCES", + "EAGAIN", + "EBADF", + "EBUSY", + "ECHILD", + "EDEADLK", + "EDOM", + "EEXIST", + "EFAULT", + "EFBIG", + "EINTR", + "EINVAL", + "EIO", + "EISDIR", + "EMFILE", + "EMLINK", + "ENAMETOOLONG", + "ENFILE", + "ENODEV", + "ENOENT", + "ENOEXEC", + "ENOLCK", + "ENOMEM", + "ENOSPC", + "ENOSYS", + "ENOTDIR", + "ENOTEMPTY", + "ENOTTY", + "ENXIO", + "EPERM", + "EPIPE", + "ERANGE", + "EROFS", + "ESPIPE", + "ESRCH", + "EXDEV", + "EWOULDBLOCK", + "EINPROGRESS", + "EALREADY", + "ENOTSOCK", + "EDESTADDRREQ", + "EMSGSIZE", + "EPROTOTYPE", + "ENOPROTOOPT", + "EPROTONOSUPPORT", + "ESOCKTNOSUPPORT", + "EOPNOTSUPP", + "EPFNOSUPPORT", + "EAFNOSUPPORT", + "EADDRINUSE", + "EADDRNOTAVAIL", + "ENETDOWN", + "ENETUNREACH", + "ENETRESET", + "ECONNABORTED", + "ECONNRESET", + "ENOBUFS", + "EISCONN", + "ENOTCONN", + "ESHUTDOWN", + "ETOOMANYREFS", + "ETIMEDOUT", + "ECONNREFUSED", + "EHOSTDOWN", + "EHOSTUNREACH", + "ELOOP", + "EOVERFLOW"]; + function make_unix_err_args(code, syscall, path, errno){ + var variant = unix_error.indexOf(code); + if(variant < 0){if(errno == null) errno = - 9999; variant = [0, errno];} + var + args = + [variant, + caml_string_of_jsstring(syscall || ""), + caml_string_of_jsstring(path || "")]; + return args; + } + var caml_named_values = {}; + function caml_named_value(nm){return caml_named_values[nm];} + function caml_raise_with_args(tag, args){ + throw caml_maybe_attach_backtrace([0, tag].concat(args)); + } + function caml_subarray_to_jsbytes(a, i, len){ + var f = String.fromCharCode; + if(i == 0 && len <= 4096 && len == a.length) return f.apply(null, a); + var s = ""; + for(; 0 < len; i += 1024, len -= 1024) + s += f.apply(null, a.slice(i, i + Math.min(len, 1024))); + return s; + } + function caml_convert_string_to_bytes(s){ + if(s.t == 2) + s.c += caml_str_repeat(s.l - s.c.length, "\0"); + else + s.c = caml_subarray_to_jsbytes(s.c, 0, s.c.length); + s.t = 0; + } + function MlBytes(tag, contents, length){ + this.t = tag; + this.c = contents; + this.l = length; + } + MlBytes.prototype.toString = + function(){ + switch(this.t){ + case 9: + return this.c; + default: caml_convert_string_to_bytes(this); + case 0: + if(jsoo_is_ascii(this.c)){this.t = 9; return this.c;} this.t = 8; + case 8: + return this.c; + } + }; + MlBytes.prototype.toUtf16 = + function(){ + var r = this.toString(); + if(this.t == 9) return r; + return caml_utf16_of_utf8(r); + }; + MlBytes.prototype.slice = + function(){ + var content = this.t == 4 ? this.c.slice() : this.c; + return new MlBytes(this.t, content, this.l); + }; + function caml_is_ml_bytes(s){return s instanceof MlBytes;} + function caml_is_ml_string(s){ + return typeof s === "string" && ! /[^\x00-\xff]/.test(s); + } + function caml_bytes_of_array(a){ + if(! (a instanceof Uint8Array)) a = new Uint8Array(a); + return new MlBytes(4, a, a.length); + } + function caml_bytes_of_jsbytes(s){return new MlBytes(0, s, s.length);} + function caml_bytes_of_string(s){ + return caml_bytes_of_jsbytes(caml_jsbytes_of_string(s)); + } + function caml_raise_sys_error(msg){ + caml_raise_with_string(caml_global_data.Sys_error, msg); + } + function caml_raise_no_such_file(name){ + caml_raise_sys_error(name + ": No such file or directory"); + } + function caml_convert_bytes_to_array(s){ + var a = new Uint8Array(s.l), b = s.c, l = b.length, i = 0; + for(; i < l; i++) a[i] = b.charCodeAt(i); + for(l = s.l; i < l; i++) a[i] = 0; + s.c = a; + s.t = 4; + return a; + } + function caml_uint8_array_of_bytes(s){ + if(s.t != 4) caml_convert_bytes_to_array(s); + return s.c; + } + function caml_create_bytes(len){ + if(len < 0) caml_invalid_argument("Bytes.create"); + return new MlBytes(len ? 2 : 9, "", len); + } + function caml_ml_bytes_length(s){return s.l;} + function caml_blit_bytes(s1, i1, s2, i2, len){ + if(len == 0) return 0; + if(i2 == 0 && (len >= s2.l || s2.t == 2 && len >= s2.c.length)){ + s2.c = + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else if(s2.t == 2 && i2 == s2.c.length){ + s2.c += + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else{ + if(s2.t != 4) caml_convert_bytes_to_array(s2); + var c1 = s1.c, c2 = s2.c; + if(s1.t == 4) + if(i2 <= i1) + for(var i = 0; i < len; i++) c2[i2 + i] = c1[i1 + i]; + else + for(var i = len - 1; i >= 0; i--) c2[i2 + i] = c1[i1 + i]; + else{ + var l = Math.min(len, c1.length - i1); + for(var i = 0; i < l; i++) c2[i2 + i] = c1.charCodeAt(i1 + i); + for(; i < len; i++) c2[i2 + i] = 0; + } + } + return 0; + } + function MlFile(){} + function MlFakeFile(content){this.data = content;} + MlFakeFile.prototype = new MlFile(); + MlFakeFile.prototype.constructor = MlFakeFile; + MlFakeFile.prototype.truncate = + function(len){ + var old = this.data; + this.data = caml_create_bytes(len | 0); + caml_blit_bytes(old, 0, this.data, 0, len); + }; + MlFakeFile.prototype.length = + function(){return caml_ml_bytes_length(this.data);}; + MlFakeFile.prototype.write = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen){ + var new_str = caml_create_bytes(offset + len), old_data = this.data; + this.data = new_str; + caml_blit_bytes(old_data, 0, this.data, 0, clen); + } + caml_blit_bytes(caml_bytes_of_array(buf), pos, this.data, offset, len); + return 0; + }; + MlFakeFile.prototype.read = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen) len = clen - offset; + if(len){ + var data = caml_create_bytes(len | 0); + caml_blit_bytes(this.data, offset, data, 0, len); + buf.set(caml_uint8_array_of_bytes(data), pos); + } + return len; + }; + function MlFakeFd(name, file, flags){ + this.file = file; + this.name = name; + this.flags = flags; + } + MlFakeFd.prototype.err_closed = + function(){ + caml_raise_sys_error(this.name + ": file descriptor already closed"); + }; + MlFakeFd.prototype.length = + function(){if(this.file) return this.file.length(); this.err_closed();}; + MlFakeFd.prototype.write = + function(offset, buf, pos, len){ + if(this.file) return this.file.write(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.read = + function(offset, buf, pos, len){ + if(this.file) return this.file.read(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.close = function(){this.file = undefined;}; + function MlFakeDevice(root, f){ + this.content = {}; + this.root = root; + this.lookupFun = f; + } + MlFakeDevice.prototype.nm = function(name){return this.root + name;}; + MlFakeDevice.prototype.create_dir_if_needed = + function(name){ + var comp = name.split("/"), res = ""; + for(var i = 0; i < comp.length - 1; i++){ + res += comp[i] + "/"; + if(this.content[res]) continue; + this.content[res] = Symbol("directory"); + } + }; + MlFakeDevice.prototype.slash = + function(name){return /\/$/.test(name) ? name : name + "/";}; + MlFakeDevice.prototype.lookup = + function(name){ + if(! this.content[name] && this.lookupFun){ + var + res = + this.lookupFun + (caml_string_of_jsbytes(this.root), caml_string_of_jsbytes(name)); + if(res !== 0){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_bytes_of_string(res[1])); + } + } + }; + MlFakeDevice.prototype.exists = + function(name){ + if(name == "") return 1; + var name_slash = this.slash(name); + if(this.content[name_slash]) return 1; + this.lookup(name); + return this.content[name] ? 1 : 0; + }; + MlFakeDevice.prototype.isFile = + function(name){return this.exists(name) && ! this.is_dir(name) ? 1 : 0;}; + MlFakeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + var unix_error = raise_unix && caml_named_value("Unix.Unix_error"); + if(this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("EEXIST", "mkdir", this.nm(name))); + else + caml_raise_sys_error(name + ": File exists"); + var parent = /^(.*)\/[^/]+/.exec(name); + parent = parent && parent[1] || ""; + if(! this.exists(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": No such file or directory"); + if(! this.is_dir(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": Not a directory"); + this.create_dir_if_needed(this.slash(name)); + }; + MlFakeDevice.prototype.rmdir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + name_slash = name == "" ? "" : this.slash(name), + r = new RegExp("^" + name_slash + "([^/]+)"); + if(! this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": Not a directory"); + for(var n in this.content) + if(n.match(r)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTEMPTY", "rmdir", this.nm(name))); + else + caml_raise_sys_error(this.nm(name) + ": Directory not empty"); + delete this.content[name_slash]; + }; + MlFakeDevice.prototype.readdir = + function(name){ + var name_slash = name == "" ? "" : this.slash(name); + if(! this.exists(name)) + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) caml_raise_sys_error(name + ": Not a directory"); + var r = new RegExp("^" + name_slash + "([^/]+)"), seen = {}, a = []; + for(var n in this.content){ + var m = n.match(r); + if(m && ! seen[m[1]]){seen[m[1]] = true; a.push(m[1]);} + } + return a; + }; + MlFakeDevice.prototype.opendir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + a = this.readdir(name), + c = false, + i = 0; + return {readSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + if(i == a.length) return null; + var entry = a[i]; + i++; + return {name: entry}; + }, + closeSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + c = true; + a = []; + }}; + }; + MlFakeDevice.prototype.is_dir = + function(name){ + if(name == "") return true; + var name_slash = this.slash(name); + return this.content[name_slash] ? 1 : 0; + }; + MlFakeDevice.prototype.unlink = + function(name){ + var ok = this.content[name] ? true : false; + delete this.content[name]; + return ok; + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.register = + function(name, content){ + var file; + if(this.content[name]) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + if(caml_is_ml_bytes(content)) file = new MlFakeFile(content); + if(caml_is_ml_string(content)) + file = new MlFakeFile(caml_bytes_of_string(content)); + else if(content instanceof Array) + file = new MlFakeFile(caml_bytes_of_array(content)); + else if(typeof content === "string") + file = new MlFakeFile(caml_bytes_of_jsbytes(content)); + else if(content.toString){ + var + bytes = + caml_bytes_of_string(caml_string_of_jsstring(content.toString())); + file = new MlFakeFile(bytes); + } + if(file){ + this.create_dir_if_needed(name); + this.content[name] = file; + } + else + caml_raise_sys_error + (this.nm(name) + " : registering file with invalid content type"); + }; + MlFakeDevice.prototype.constructor = MlFakeDevice; + function caml_ml_string_length(s){return s.length;} + function caml_string_unsafe_get(s, i){return s.charCodeAt(i);} + function caml_uint8_array_of_string(s){ + var l = caml_ml_string_length(s), a = new Array(l), i = 0; + for(; i < l; i++) a[i] = caml_string_unsafe_get(s, i); + return a; + } + function caml_bytes_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_bytes_unsafe_set(s, i, c){ + c &= 0xff; + if(s.t != 4){ + if(i == s.c.length){ + s.c += String.fromCharCode(c); + if(i + 1 == s.l) s.t = 0; + return 0; + } + caml_convert_bytes_to_array(s); + } + s.c[i] = c; + return 0; + } + function caml_bytes_set(s, i, c){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_set(s, i, c); + } + function MlNodeFd(fd, flags){ + this.fs = require("fs"); + this.fd = fd; + this.flags = flags; + } + MlNodeFd.prototype = new MlFile(); + MlNodeFd.prototype.constructor = MlNodeFd; + MlNodeFd.prototype.truncate = + function(len){ + try{this.fs.ftruncateSync(this.fd, len | 0);} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.length = + function(){ + try{return this.fs.fstatSync(this.fd).size;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.write = + function(offset, buf, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + this.fs.writeSync(this.fd, buf, buf_offset, len); + else + this.fs.writeSync(this.fd, buf, buf_offset, len, offset); + } + catch(err){caml_raise_sys_error(err.toString());} + return 0; + }; + MlNodeFd.prototype.read = + function(offset, a, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + var read = this.fs.readSync(this.fd, a, buf_offset, len); + else + var read = this.fs.readSync(this.fd, a, buf_offset, len, offset); + return read; + } + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.close = + function(){ + try{this.fs.closeSync(this.fd); return 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + function MlNodeDevice(root){this.fs = require("fs"); this.root = root;} + MlNodeDevice.prototype.nm = function(name){return this.root + name;}; + MlNodeDevice.prototype.exists = + function(name){ + try{return this.fs.existsSync(this.nm(name)) ? 1 : 0;} + catch(err){return 0;} + }; + MlNodeDevice.prototype.isFile = + function(name){ + try{return this.fs.statSync(this.nm(name)).isFile() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + try{this.fs.mkdirSync(this.nm(name), {mode: mode}); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rmdir = + function(name, raise_unix){ + try{this.fs.rmdirSync(this.nm(name)); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readdir = + function(name, raise_unix){ + try{return this.fs.readdirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.is_dir = + function(name){ + try{return this.fs.statSync(this.nm(name)).isDirectory() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.unlink = + function(name, raise_unix){ + try{ + var b = this.fs.existsSync(this.nm(name)) ? 1 : 0; + this.fs.unlinkSync(this.nm(name)); + return b; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.open = + function(name, f, raise_unix){ + var consts = require("constants"), res = 0; + for(var key in f) + switch(key){ + case "rdonly": + res |= consts.O_RDONLY; break; + case "wronly": + res |= consts.O_WRONLY; break; + case "append": + res |= consts.O_WRONLY | consts.O_APPEND; break; + case "create": + res |= consts.O_CREAT; break; + case "truncate": + res |= consts.O_TRUNC; break; + case "excl": + res |= consts.O_EXCL; break; + case "binary": + res |= consts.O_BINARY; break; + case "text": + res |= consts.O_TEXT; break; + case "nonblock": + res |= consts.O_NONBLOCK; break; + } + try{ + var + fd = this.fs.openSync(this.nm(name), res), + isCharacterDevice = + this.fs.lstatSync(this.nm(name)).isCharacterDevice(); + f.isCharacterDevice = isCharacterDevice; + return new MlNodeFd(fd, f); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rename = + function(o, n, raise_unix){ + try{this.fs.renameSync(this.nm(o), this.nm(n));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.stat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.statSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.lstat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.lstatSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.symlink = + function(to_dir, target, path, raise_unix){ + try{ + this.fs.symlinkSync + (this.nm(target), this.nm(path), to_dir ? "dir" : "file"); + return 0; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readlink = + function(name, raise_unix){ + try{ + var link = this.fs.readlinkSync(this.nm(name), "utf8"); + return caml_string_of_jsstring(link); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.opendir = + function(name, raise_unix){ + try{return this.fs.opendirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.raise_nodejs_error = + function(err, raise_unix){ + var unix_error = caml_named_value("Unix.Unix_error"); + if(raise_unix && unix_error){ + var + args = make_unix_err_args(err.code, err.syscall, err.path, err.errno); + caml_raise_with_args(unix_error, args); + } + else + caml_raise_sys_error(err.toString()); + }; + MlNodeDevice.prototype.stats_from_js = + function(js_stats){ + var file_kind; + if(js_stats.isFile()) + file_kind = 0; + else if(js_stats.isDirectory()) + file_kind = 1; + else if(js_stats.isCharacterDevice()) + file_kind = 2; + else if(js_stats.isBlockDevice()) + file_kind = 3; + else if(js_stats.isSymbolicLink()) + file_kind = 4; + else if(js_stats.isFIFO()) + file_kind = 5; + else if(js_stats.isSocket()) file_kind = 6; + return [0, + js_stats.dev, + js_stats.ino, + file_kind, + js_stats.mode, + js_stats.nlink, + js_stats.uid, + js_stats.gid, + js_stats.rdev, + js_stats.size, + js_stats.atimeMs, + js_stats.mtimeMs, + js_stats.ctimeMs]; + }; + MlNodeDevice.prototype.constructor = MlNodeDevice; + function caml_get_root(path){ + var x = path_is_absolute(path); + if(! x) return; + return x[0] + "/"; + } + function caml_failwith(msg){ + if(! caml_global_data.Failure) + caml_global_data.Failure = [248, caml_string_of_jsbytes("Failure"), - 3]; + caml_raise_with_string(caml_global_data.Failure, msg); + } + var + caml_root = + caml_get_root(caml_current_dir) + || caml_failwith("unable to compute caml_root"), + jsoo_mount_point = []; + if(fs_node_supported()) + jsoo_mount_point.push + ({path: caml_root, device: new MlNodeDevice(caml_root)}); + else + jsoo_mount_point.push + ({path: caml_root, device: new MlFakeDevice(caml_root)}); + jsoo_mount_point.push + ({path: "/static/", device: new MlFakeDevice("/static/")}); + function resolve_fs_device(name){ + var + path = caml_make_path(name), + name = path.join("/"), + name_slash = caml_trailing_slash(name), + res; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var m = jsoo_mount_point[i]; + if + (name_slash.search(m.path) == 0 + && (! res || res.path.length < m.path.length)) + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + if(! res && fs_node_supported()){ + var root = caml_get_root(name); + if(root && root.match(/^[a-zA-Z]:\/$/)){ + var m = {path: root, device: new MlNodeDevice(root)}; + jsoo_mount_point.push(m); + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + } + if(res) return res; + caml_raise_sys_error("no device found for " + name_slash); + } + function caml_sys_is_directory(name){ + var root = resolve_fs_device(name), a = root.device.is_dir(root.rest); + return a ? 1 : 0; + } + function caml_raise_not_found(){ + caml_raise_constant(caml_global_data.Not_found); + } + function caml_sys_getenv(name){ + var r = jsoo_sys_getenv(caml_jsstring_of_string(name)); + if(r === undefined) caml_raise_not_found(); + return caml_string_of_jsstring(r); + } + function shift_right_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = len1 - 1; i >= 0; i--){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a >>> nbits | wrap; + wrap = a << 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + var caml_gr_state; + function caml_gr_state_get(){ + if(caml_gr_state) return caml_gr_state; + throw caml_maybe_attach_backtrace + ([0, + caml_named_value("Graphics.Graphic_failure"), + caml_string_of_jsbytes("Not initialized")]); + } + function caml_gr_point_color(x, y){ + var + s = caml_gr_state_get(), + im = s.context.getImageData(x, s.height - y, 1, 1), + d = im.data; + return (d[0] << 16) + (d[1] << 8) + d[2]; + } + function caml_runtime_events_user_resolve(){return 0;} + var MlObjectTable; + if(typeof globalThis.WeakMap === "undefined") + MlObjectTable = + function(){ + function NaiveLookup(objs){this.objs = objs;} + NaiveLookup.prototype.get = + function(v){ + for(var i = 0; i < this.objs.length; i++) + if(this.objs[i] === v) return i; + }; + NaiveLookup.prototype.set = function(){}; + return function(){ + this.objs = []; + this.lookup = new NaiveLookup(this.objs);}; + } + (); + else + MlObjectTable = + function(){this.objs = []; this.lookup = new globalThis.WeakMap();}; + MlObjectTable.prototype.store = + function(v){this.lookup.set(v, this.objs.length); this.objs.push(v);}; + MlObjectTable.prototype.recall = + function(v){ + var i = this.lookup.get(v); + return i === undefined ? undefined : this.objs.length - i; + }; + function caml_sys_rename(o, n){ + var o_root = resolve_fs_device(o), n_root = resolve_fs_device(n); + if(o_root.device != n_root.device) + caml_failwith("caml_sys_rename: cannot move file between two filesystem"); + if(! o_root.device.rename) + caml_failwith("caml_sys_rename: no implemented"); + o_root.device.rename(o_root.rest, n_root.rest); + } + function caml_log10_float(x){return Math.log10(x);} + var caml_runtime_warnings = 0; + function caml_ml_enable_runtime_warnings(bool){caml_runtime_warnings = bool; return 0; + } + function caml_classify_float(x){ + if(isFinite(x)){ + if(Math.abs(x) >= 2.2250738585072014e-308) return 0; + if(x != 0) return 1; + return 2; + } + return isNaN(x) ? 4 : 3; + } + var caml_ml_channels = new Array(); + function caml_refill(chan){ + if(chan.refill != null){ + var str = chan.refill(), str_a = caml_uint8_array_of_string(str); + if(str_a.length == 0) + chan.refill = null; + else{ + if(chan.buffer.length < chan.buffer_max + str_a.length){ + var b = new Uint8Array(chan.buffer_max + str_a.length); + b.set(chan.buffer); + chan.buffer = b; + } + chan.buffer.set(str_a, chan.buffer_max); + chan.offset += str_a.length; + chan.buffer_max += str_a.length; + } + } + else{ + var + nread = + chan.file.read + (chan.offset, + chan.buffer, + chan.buffer_max, + chan.buffer.length - chan.buffer_max); + chan.offset += nread; + chan.buffer_max += nread; + } + } + function caml_array_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_ml_input_scan_line(chanid){ + var chan = caml_ml_channels[chanid], p = chan.buffer_curr; + do + if(p >= chan.buffer_max){ + if(chan.buffer_curr > 0){ + chan.buffer.set(chan.buffer.subarray(chan.buffer_curr), 0); + p -= chan.buffer_curr; + chan.buffer_max -= chan.buffer_curr; + chan.buffer_curr = 0; + } + if(chan.buffer_max >= chan.buffer.length) return - chan.buffer_max | 0; + var prev_max = chan.buffer_max; + caml_refill(chan); + if(prev_max == chan.buffer_max) return - chan.buffer_max | 0; + } + while + (chan.buffer[p++] != 10); + return p - chan.buffer_curr | 0; + } + function caml_gc_minor(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(true); + return 0; + } + function caml_ml_condition_new(unit){return {condition: 1};} + function caml_int64_of_bytes(a){ + return new + MlInt64 + (a[7] << 0 | a[6] << 8 | a[5] << 16, + a[4] << 0 | a[3] << 8 | a[2] << 16, + a[1] << 0 | a[0] << 8); + } + function caml_ba_uint8_get64(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3), + b5 = ba.get(ofs + 4), + b6 = ba.get(ofs + 5), + b7 = ba.get(ofs + 6), + b8 = ba.get(ofs + 7); + return caml_int64_of_bytes([b8, b7, b6, b5, b4, b3, b2, b1]); + } + function caml_int64_to_bytes(x){return x.toArray();} + function caml_int64_marshal(writer, v, sizes){ + var b = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) writer.write(8, b[i]); + sizes[0] = 8; + sizes[1] = 8; + } + function caml_ba_num_dims(ba){return ba.dims.length;} + function caml_wrap_exception(e){ + { + if(e instanceof Array) return e; + var exn; + if + (globalThis.RangeError && e instanceof globalThis.RangeError + && e.message + && e.message.match(/maximum call stack/i)) + exn = caml_global_data.Stack_overflow; + else if + (globalThis.InternalError && e instanceof globalThis.InternalError + && e.message + && e.message.match(/too much recursion/i)) + exn = caml_global_data.Stack_overflow; + else if(e instanceof globalThis.Error && caml_named_value("jsError")) + exn = [0, caml_named_value("jsError"), e]; + else + exn = [0, caml_global_data.Failure, caml_string_of_jsstring(String(e))]; + if(e instanceof globalThis.Error) exn.js_error = e; + return exn; + } + } + function caml_create_file(name, content){ + var root = resolve_fs_device(name); + if(! root.device.register) caml_failwith("cannot register file"); + root.device.register(root.rest, content); + return 0; + } + function jsoo_create_file(name, content){ + var + name = caml_string_of_jsbytes(name), + content = caml_string_of_jsbytes(content); + return caml_create_file(name, content); + } + function caml_fs_init(){ + var tmp = globalThis.caml_fs_tmp; + if(tmp) + for(var i = 0; i < tmp.length; i++) + jsoo_create_file(tmp[i].name, tmp[i].content); + globalThis.jsoo_create_file = jsoo_create_file; + globalThis.caml_fs_tmp = []; + return 0; + } + function caml_mul(a, b){return Math.imul(a, b);} + function caml_hash_mix_int(h, d){ + d = caml_mul(d, 0xcc9e2d51 | 0); + d = d << 15 | d >>> 32 - 15; + d = caml_mul(d, 0x1b873593); + h ^= d; + h = h << 13 | h >>> 32 - 13; + return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0; + } + function caml_hash_mix_jsbytes(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = + s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16 + | s.charCodeAt(i + 3) << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s.charCodeAt(i + 2) << 16; + case 2: + w |= s.charCodeAt(i + 1) << 8; + case 1: + w |= s.charCodeAt(i); h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_hash_mix_string(h, v){ + return caml_hash_mix_jsbytes(h, caml_jsbytes_of_string(v)); + } + var Base_internalhash_fold_string = caml_hash_mix_string; + function caml_get_continuation_callstack(){return [0];} + var caml_parser_trace = 0; + function caml_set_parser_trace(bool){ + var oldflag = caml_parser_trace; + caml_parser_trace = bool; + return oldflag; + } + function caml_list_of_js_array(a){ + var l = 0; + for(var i = a.length - 1; i >= 0; i--){var e = a[i]; l = [0, e, l];} + return l; + } + function num_digits_nat(nat, ofs, len){ + for(var i = len - 1; i >= 0; i--) if(nat.data[ofs + i] != 0) return i + 1; + return 1; + } + function caml_hash_nat(x){ + var len = num_digits_nat(x, 0, x.data.length), h = 0; + for(var i = 0; i < len; i++) h = caml_hash_mix_int(h, x.data[i]); + return h; + } + function caml_call_gen(f, args){ + var + n = f.l >= 0 ? f.l : f.l = f.length, + argsLen = args.length, + d = n - argsLen; + if(d == 0) + return f.apply(null, args); + else if(d < 0){ + var g = f.apply(null, args.slice(0, n)); + if(typeof g !== "function") return g; + return caml_call_gen(g, args.slice(n)); + } + else{ + switch(d){ + case 1: + { + var + g = + function(x){ + var nargs = new Array(argsLen + 1); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + return f.apply(null, nargs); + }; + break; + } + case 2: + { + var + g = + function(x, y){ + var nargs = new Array(argsLen + 2); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + nargs[argsLen + 1] = y; + return f.apply(null, nargs); + }; + break; + } + default: + var + g = + function(){ + var + extra_args = arguments.length == 0 ? 1 : arguments.length, + nargs = new Array(args.length + extra_args); + for(var i = 0; i < args.length; i++) nargs[i] = args[i]; + for(var i = 0; i < arguments.length; i++) + nargs[args.length + i] = arguments[i]; + return caml_call_gen(f, nargs); + }; + } + g.l = d; + return g; + } + } + var caml_callback = caml_call_gen; + function caml_js_wrap_callback_arguments(f){ + return function(){ + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, [args]);}; + } + function caml_sys_chdir(dir){ + var root = resolve_fs_device(dir); + if(root.device.exists(root.rest)){ + if(root.rest) + caml_current_dir = caml_trailing_slash(root.path + root.rest); + else + caml_current_dir = root.path; + return 0; + } + else + caml_raise_no_such_file(caml_jsbytes_of_string(dir)); + } + function caml_obj_tag(x){ + if(x instanceof Array && x[0] == x[0] >>> 0) + return x[0]; + else if(caml_is_ml_bytes(x)) + return 252; + else if(caml_is_ml_string(x)) + return 252; + else if(x instanceof Function || typeof x == "function") + return 247; + else if(x && x.caml_custom) return 255; else return 1000; + } + function caml_obj_update_tag(b, o, n){ + if(b[0] == o){b[0] = n; return 1;} + return 0; + } + var caml_ml_domain_unique_token_ = [0]; + function caml_ml_domain_unique_token(unit){return caml_ml_domain_unique_token_; + } + function caml_lazy_update_to_forcing(o){ + var t = caml_obj_tag(o); + if(t != 246 && t != 250 && t != 244) return 4; + if(caml_obj_update_tag(o, 246, 244)) + return 0; + else{ + var field0 = o[1]; + t = o[0]; + if(t == 244) + return field0 == caml_ml_domain_unique_token(0) ? 1 : 2; + else if(t == 250) return 3; else return 2; + } + } + function caml_gc_counters(){return [254, 0, 0, 0];} + function caml_gr_synchronize(){ + caml_failwith("caml_gr_synchronize not Implemented"); + } + function caml_unix_closedir(dir_handle){ + try{dir_handle.pointer.closeSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "closedir", dir_handle.path)); + } + } + function caml_unix_opendir(path){ + var root = resolve_fs_device(path); + if(! root.device.opendir) + caml_failwith("caml_unix_opendir: not implemented"); + var dir_handle = root.device.opendir(root.rest, true); + return {pointer: dir_handle, path: path}; + } + function caml_unix_rewinddir(dir_handle){ + caml_unix_closedir(dir_handle); + var new_dir_handle = caml_unix_opendir(dir_handle.path); + dir_handle.pointer = new_dir_handle.pointer; + return 0; + } + function caml_raise_end_of_file(){ + caml_raise_constant(caml_global_data.End_of_file); + } + function caml_unix_readdir(dir_handle){ + var entry; + try{entry = dir_handle.pointer.readSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "readdir", dir_handle.path)); + } + if(entry === null) + caml_raise_end_of_file(); + else + return caml_string_of_jsstring(entry.name); + } + function caml_unix_findfirst(path){ + var path_js = caml_jsstring_of_string(path); + path_js = path_js.replace(/(^|[\\\/])\*\.\*$/, ""); + path = caml_string_of_jsstring(path_js); + var + dir_handle = caml_unix_opendir(path), + first_entry = caml_unix_readdir(dir_handle); + return [0, first_entry, dir_handle]; + } + function caml_is_continuation_tag(t){return t == 245 ? 1 : 0;} + var log2_ok = Math.log2 && Math.log2(1.1235582092889474E+307) == 1020; + function jsoo_floor_log2(x){ + if(log2_ok) return Math.floor(Math.log2(x)); + var i = 0; + if(x == 0) return - Infinity; + if(x >= 1) while(x >= 2){x /= 2; i++;} else while(x < 1){x *= 2; i--;} + return i; + } + function caml_int32_bits_of_float(x){ + var float32a = new Float32Array(1); + float32a[0] = x; + var int32a = new Int32Array(float32a.buffer); + return int32a[0] | 0; + } + function caml_int64_create_lo_mi_hi(lo, mi, hi){return new MlInt64(lo, mi, hi); + } + function caml_int64_bits_of_float(x){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_int64_create_lo_mi_hi(1, 0, 0x7ff0); + return x > 0 + ? caml_int64_create_lo_mi_hi(0, 0, 0x7ff0) + : caml_int64_create_lo_mi_hi(0, 0, 0xfff0); + } + var sign = x == 0 && 1 / x == - Infinity ? 0x8000 : x >= 0 ? 0 : 0x8000; + if(sign) x = - x; + var exp = jsoo_floor_log2(x) + 1023; + if(exp <= 0){ + exp = 0; + x /= Math.pow(2, - 1026); + } + else{ + x /= Math.pow(2, exp - 1027); + if(x < 16){x *= 2; exp -= 1;} + if(exp == 0) x /= 2; + } + var k = Math.pow(2, 24), r3 = x | 0; + x = (x - r3) * k; + var r2 = x | 0; + x = (x - r2) * k; + var r1 = x | 0; + r3 = r3 & 0xf | sign | exp << 4; + return caml_int64_create_lo_mi_hi(r1, r2, r3); + } + function caml_ba_serialize(writer, ba, sz){ + writer.write(32, ba.dims.length); + writer.write(32, ba.kind | ba.layout << 8); + if(ba.caml_custom == "_bigarr02") + for(var i = 0; i < ba.dims.length; i++) + if(ba.dims[i] < 0xffff) + writer.write(16, ba.dims[i]); + else{ + writer.write(16, 0xffff); + writer.write(32, 0); + writer.write(32, ba.dims[i]); + } + else + for(var i = 0; i < ba.dims.length; i++) writer.write(32, ba.dims[i]); + switch(ba.kind){ + case 2: + case 3: + case 12: + for(var i = 0; i < ba.data.length; i++) writer.write(8, ba.data[i]); + break; + case 4: + case 5: + for(var i = 0; i < ba.data.length; i++) writer.write(16, ba.data[i]); + break; + case 6: + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 8: + case 9: + writer.write(8, 0); + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 7: + for(var i = 0; i < ba.data.length / 2; i++){ + var b = caml_int64_to_bytes(ba.get(i)); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 1: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i))); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 0: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int32_bits_of_float(ba.get(i)); + writer.write(32, b); + } + break; + case 10: + for(var i = 0; i < ba.data.length / 2; i++){ + var j = ba.get(i); + writer.write(32, caml_int32_bits_of_float(j[1])); + writer.write(32, caml_int32_bits_of_float(j[2])); + } + break; + case 11: + for(var i = 0; i < ba.data.length / 2; i++){ + var + complex = ba.get(i), + b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[1])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[2])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + } + sz[0] = (4 + ba.dims.length) * 4; + sz[1] = (4 + ba.dims.length) * 8; + } + function caml_ba_get_size_per_element(kind){ + switch(kind){case 7:case 10:case 11: return 2;default: return 1; + } + } + function caml_ba_create_buffer(kind, size){ + var view; + switch(kind){ + case 0: + view = Float32Array; break; + case 1: + view = Float64Array; break; + case 2: + view = Int8Array; break; + case 3: + view = Uint8Array; break; + case 4: + view = Int16Array; break; + case 5: + view = Uint16Array; break; + case 6: + view = Int32Array; break; + case 7: + view = Int32Array; break; + case 8: + view = Int32Array; break; + case 9: + view = Int32Array; break; + case 10: + view = Float32Array; break; + case 11: + view = Float64Array; break; + case 12: + view = Uint8Array; break; + } + if(! view) caml_invalid_argument("Bigarray.create: unsupported kind"); + var data = new view(size * caml_ba_get_size_per_element(kind)); + return data; + } + function caml_int32_float_of_bits(x){ + var int32a = new Int32Array(1); + int32a[0] = x; + var float32a = new Float32Array(int32a.buffer); + return float32a[0]; + } + function caml_int64_float_of_bits(x){ + var lo = x.lo, mi = x.mi, hi = x.hi, exp = (hi & 0x7fff) >> 4; + if(exp == 2047) + return (lo | mi | hi & 0xf) == 0 + ? hi & 0x8000 ? - Infinity : Infinity + : NaN; + var k = Math.pow(2, - 24), res = (lo * k + mi) * k + (hi & 0xf); + if(exp > 0){ + res += 16; + res *= Math.pow(2, exp - 1027); + } + else + res *= Math.pow(2, - 1026); + if(hi & 0x8000) res = - res; + return res; + } + function caml_ba_get_size(dims){ + var n_dims = dims.length, size = 1; + for(var i = 0; i < n_dims; i++){ + if(dims[i] < 0) + caml_invalid_argument("Bigarray.create: negative dimension"); + size = size * dims[i]; + } + return size; + } + function caml_int64_create_lo_hi(lo, hi){ + return new + MlInt64 + (lo & 0xffffff, + lo >>> 24 & 0xff | (hi & 0xffff) << 8, + hi >>> 16 & 0xffff); + } + function caml_int64_hi32(v){return v.hi32();} + function caml_int64_lo32(v){return v.lo32();} + var caml_ba_custom_name = "_bigarr02"; + function Ml_Bigarray(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray.prototype.caml_custom = caml_ba_custom_name; + Ml_Bigarray.prototype.offset = + function(arg){ + var ofs = 0; + if(typeof arg === "number") arg = [arg]; + if(! (arg instanceof Array)) + caml_invalid_argument("bigarray.js: invalid offset"); + if(this.dims.length != arg.length) + caml_invalid_argument("Bigarray.get/set: bad number of dimensions"); + if(this.layout == 0) + for(var i = 0; i < this.dims.length; i++){ + if(arg[i] < 0 || arg[i] >= this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + arg[i]; + } + else + for(var i = this.dims.length - 1; i >= 0; i--){ + if(arg[i] < 1 || arg[i] > this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + (arg[i] - 1); + } + return ofs; + }; + Ml_Bigarray.prototype.get = + function(ofs){ + switch(this.kind){ + case 7: + var l = this.data[ofs * 2 + 0], h = this.data[ofs * 2 + 1]; + return caml_int64_create_lo_hi(l, h); + case 10: + case 11: + var r = this.data[ofs * 2 + 0], i = this.data[ofs * 2 + 1]; + return [254, r, i]; + default: return this.data[ofs]; + } + }; + Ml_Bigarray.prototype.set = + function(ofs, v){ + switch(this.kind){ + case 7: + this.data[ofs * 2 + 0] = caml_int64_lo32(v); + this.data[ofs * 2 + 1] = caml_int64_hi32(v); + break; + case 10: + case 11: + this.data[ofs * 2 + 0] = v[1]; this.data[ofs * 2 + 1] = v[2]; break; + default: this.data[ofs] = v; break; + } + return 0; + }; + Ml_Bigarray.prototype.fill = + function(v){ + switch(this.kind){ + case 7: + var a = caml_int64_lo32(v), b = caml_int64_hi32(v); + if(a == b) + this.data.fill(a); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? a : b; + break; + case 10: + case 11: + var im = v[1], re = v[2]; + if(im == re) + this.data.fill(im); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? im : re; + break; + default: this.data.fill(v); break; + } + }; + Ml_Bigarray.prototype.compare = + function(b, total){ + if(this.layout != b.layout || this.kind != b.kind){ + var k1 = this.kind | this.layout << 8, k2 = b.kind | b.layout << 8; + return k2 - k1; + } + if(this.dims.length != b.dims.length) + return b.dims.length - this.dims.length; + for(var i = 0; i < this.dims.length; i++) + if(this.dims[i] != b.dims[i]) return this.dims[i] < b.dims[i] ? - 1 : 1; + switch(this.kind){ + case 0: + case 1: + case 10: + case 11: + var x, y; + for(var i = 0; i < this.data.length; i++){ + x = this.data[i]; + y = b.data[i]; + if(x < y) return - 1; + if(x > y) return 1; + if(x != y){ + if(! total) return NaN; + if(x == x) return 1; + if(y == y) return - 1; + } + } + break; + case 7: + for(var i = 0; i < this.data.length; i += 2){ + if(this.data[i + 1] < b.data[i + 1]) return - 1; + if(this.data[i + 1] > b.data[i + 1]) return 1; + if(this.data[i] >>> 0 < b.data[i] >>> 0) return - 1; + if(this.data[i] >>> 0 > b.data[i] >>> 0) return 1; + } + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 8: + case 9: + case 12: + for(var i = 0; i < this.data.length; i++){ + if(this.data[i] < b.data[i]) return - 1; + if(this.data[i] > b.data[i]) return 1; + } + break; + } + return 0; + }; + function Ml_Bigarray_c_1_1(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray_c_1_1.prototype = new Ml_Bigarray(); + Ml_Bigarray_c_1_1.prototype.offset = + function(arg){ + if(typeof arg !== "number") + if(arg instanceof Array && arg.length == 1) + arg = arg[0]; + else + caml_invalid_argument("Ml_Bigarray_c_1_1.offset"); + if(arg < 0 || arg >= this.dims[0]) caml_array_bound_error(); + return arg; + }; + Ml_Bigarray_c_1_1.prototype.get = function(ofs){return this.data[ofs];}; + Ml_Bigarray_c_1_1.prototype.set = + function(ofs, v){this.data[ofs] = v; return 0;}; + Ml_Bigarray_c_1_1.prototype.fill = + function(v){this.data.fill(v); return 0;}; + function caml_ba_create_unsafe(kind, layout, dims, data){ + var size_per_element = caml_ba_get_size_per_element(kind); + if(caml_ba_get_size(dims) * size_per_element != data.length) + caml_invalid_argument("length doesn't match dims"); + if(layout == 0 && dims.length == 1 && size_per_element == 1) + return new Ml_Bigarray_c_1_1(kind, layout, dims, data); + return new Ml_Bigarray(kind, layout, dims, data); + } + function caml_ba_deserialize(reader, sz, name){ + var num_dims = reader.read32s(); + if(num_dims < 0 || num_dims > 16) + caml_failwith("input_value: wrong number of bigarray dimensions"); + var + tag = reader.read32s(), + kind = tag & 0xff, + layout = tag >> 8 & 1, + dims = []; + if(name == "_bigarr02") + for(var i = 0; i < num_dims; i++){ + var size_dim = reader.read16u(); + if(size_dim == 0xffff){ + var size_dim_hi = reader.read32u(), size_dim_lo = reader.read32u(); + if(size_dim_hi != 0) + caml_failwith("input_value: bigarray dimension overflow in 32bit"); + size_dim = size_dim_lo; + } + dims.push(size_dim); + } + else + for(var i = 0; i < num_dims; i++) dims.push(reader.read32u()); + var + size = caml_ba_get_size(dims), + data = caml_ba_create_buffer(kind, size), + ba = caml_ba_create_unsafe(kind, layout, dims, data); + switch(kind){ + case 2: + for(var i = 0; i < size; i++) data[i] = reader.read8s(); break; + case 3: + case 12: + for(var i = 0; i < size; i++) data[i] = reader.read8u(); break; + case 4: + for(var i = 0; i < size; i++) data[i] = reader.read16s(); break; + case 5: + for(var i = 0; i < size; i++) data[i] = reader.read16u(); break; + case 6: + for(var i = 0; i < size; i++) data[i] = reader.read32s(); break; + case 8: + case 9: + var sixty = reader.read8u(); + if(sixty) + caml_failwith + ("input_value: cannot read bigarray with 64-bit OCaml ints"); + for(var i = 0; i < size; i++) data[i] = reader.read32s(); + break; + case 7: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var int64 = caml_int64_of_bytes(t); + ba.set(i, int64); + } + break; + case 1: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var f = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, f); + } + break; + case 0: + for(var i = 0; i < size; i++){ + var f = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, f); + } + break; + case 10: + for(var i = 0; i < size; i++){ + var + re = caml_int32_float_of_bits(reader.read32s()), + im = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, [254, re, im]); + } + break; + case 11: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var re = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var im = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, [254, re, im]); + } + break; + } + sz[0] = (4 + num_dims) * 4; + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_ba_compare(a, b, total){return a.compare(b, total);} + function caml_hash_mix_int64(h, v){ + h = caml_hash_mix_int(h, caml_int64_lo32(v)); + h = caml_hash_mix_int(h, caml_int64_hi32(v)); + return h; + } + function caml_hash_mix_float(h, v0){ + return caml_hash_mix_int64(h, caml_int64_bits_of_float(v0)); + } + function caml_ba_hash(ba){ + var num_elts = caml_ba_get_size(ba.dims), h = 0; + switch(ba.kind){ + case 2: + case 3: + case 12: + if(num_elts > 256) num_elts = 256; + var w = 0, i = 0; + for(i = 0; i + 4 <= ba.data.length; i += 4){ + w = + ba.data[i + 0] | ba.data[i + 1] << 8 | ba.data[i + 2] << 16 + | ba.data[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(num_elts & 3){ + case 3: + w = ba.data[i + 2] << 16; + case 2: + w |= ba.data[i + 1] << 8; + case 1: + w |= ba.data[i + 0]; h = caml_hash_mix_int(h, w); + } + break; + case 4: + case 5: + if(num_elts > 128) num_elts = 128; + var w = 0, i = 0; + for(i = 0; i + 2 <= ba.data.length; i += 2){ + w = ba.data[i + 0] | ba.data[i + 1] << 16; + h = caml_hash_mix_int(h, w); + } + if((num_elts & 1) != 0) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 6: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 8: + case 9: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 7: + if(num_elts > 32) num_elts = 32; + num_elts *= 2; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 10: + num_elts *= 2; + case 0: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + case 11: + num_elts *= 2; + case 1: + if(num_elts > 32) num_elts = 32; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + } + return h; + } + function caml_int32_unmarshal(reader, size){size[0] = 4; return reader.read32s(); + } + function caml_nativeint_unmarshal(reader, size){ + switch(reader.read8u()){ + case 1: + size[0] = 4; return reader.read32s(); + case 2: + caml_failwith("input_value: native integer value too large"); + default: caml_failwith("input_value: ill-formed native integer"); + } + } + function caml_int64_unmarshal(reader, size){ + var t = new Array(8); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + size[0] = 8; + return caml_int64_of_bytes(t); + } + function caml_int64_compare(x, y, total){return x.compare(y);} + function caml_int64_hash(v){return v.lo32() ^ v.hi32();} + var + caml_custom_ops = + {"_j": + {deserialize: caml_int64_unmarshal, + serialize: caml_int64_marshal, + fixed_length: 8, + compare: caml_int64_compare, + hash: caml_int64_hash}, + "_i": {deserialize: caml_int32_unmarshal, fixed_length: 4}, + "_n": {deserialize: caml_nativeint_unmarshal, fixed_length: 4}, + "_bigarray": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarray"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}, + "_bigarr02": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarr02"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}}; + function caml_compare_val_get_custom(a){ + return caml_custom_ops[a.caml_custom] + && caml_custom_ops[a.caml_custom].compare; + } + function caml_compare_val_number_custom(num, custom, swap, total){ + var comp = caml_compare_val_get_custom(custom); + if(comp){ + var x = swap > 0 ? comp(custom, num, total) : comp(num, custom, total); + if(total && x != x) return swap; + if(+ x != + x) return + x; + if((x | 0) != 0) return x | 0; + } + return swap; + } + function caml_compare_val_tag(a){ + if(typeof a === "number") + return 1000; + else if(caml_is_ml_bytes(a)) + return 252; + else if(caml_is_ml_string(a)) + return 1252; + else if(a instanceof Array && a[0] === a[0] >>> 0 && a[0] <= 255){var tag = a[0] | 0; return tag == 254 ? 0 : tag;} + else if(a instanceof String) + return 12520; + else if(typeof a == "string") + return 12520; + else if(a instanceof Number) + return 1000; + else if(a && a.caml_custom) + return 1255; + else if(a && a.compare) + return 1256; + else if(typeof a == "function") + return 1247; + else if(typeof a == "symbol") return 1251; + return 1001; + } + function caml_int_compare(a, b){ + if(a < b) return - 1; + if(a == b) return 0; + return 1; + } + function caml_string_compare(s1, s2){ + return s1 < s2 ? - 1 : s1 > s2 ? 1 : 0; + } + function caml_bytes_compare(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? - 1 : s1.c > s2.c ? 1 : 0; + } + function caml_compare_val(a, b, total){ + var stack = []; + for(;;){ + if(! (total && a === b)){ + var tag_a = caml_compare_val_tag(a); + if(tag_a == 250){a = a[1]; continue;} + var tag_b = caml_compare_val_tag(b); + if(tag_b == 250){b = b[1]; continue;} + if(tag_a !== tag_b){ + if(tag_a == 1000){ + if(tag_b == 1255) + return caml_compare_val_number_custom(a, b, - 1, total); + return - 1; + } + if(tag_b == 1000){ + if(tag_a == 1255) + return caml_compare_val_number_custom(b, a, 1, total); + return 1; + } + return tag_a < tag_b ? - 1 : 1; + } + switch(tag_a){ + case 247: + caml_invalid_argument("compare: functional value"); break; + case 248: + var x = caml_int_compare(a[2], b[2]); if(x != 0) return x | 0; break; + case 249: + caml_invalid_argument("compare: functional value"); break; + case 250: + caml_invalid_argument("equal: got Forward_tag, should not happen"); + break; + case 251: + caml_invalid_argument("equal: abstract value"); break; + case 252: + if(a !== b){ + var x = caml_bytes_compare(a, b); + if(x != 0) return x | 0; + } + break; + case 253: + caml_invalid_argument("equal: got Double_tag, should not happen"); + break; + case 254: + caml_invalid_argument + ("equal: got Double_array_tag, should not happen"); + break; + case 255: + caml_invalid_argument("equal: got Custom_tag, should not happen"); + break; + case 1247: + caml_invalid_argument("compare: functional value"); break; + case 1255: + var comp = caml_compare_val_get_custom(a); + if(comp != caml_compare_val_get_custom(b)) + return a.caml_custom < b.caml_custom ? - 1 : 1; + if(! comp) caml_invalid_argument("compare: abstract value"); + var x = comp(a, b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1256: + var x = a.compare(b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1000: + a = + a; + b = + b; + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1001: + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1251: + if(a !== b){if(! total) return NaN; return 1;} break; + case 1252: + var a = caml_jsbytes_of_string(a), b = caml_jsbytes_of_string(b); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 12520: + var a = a.toString(), b = b.toString(); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 246: + case 254: + default: + if(caml_is_continuation_tag(tag_a)){ + caml_invalid_argument("compare: continuation value"); + break; + } + if(a.length != b.length) return a.length < b.length ? - 1 : 1; + if(a.length > 1) stack.push(a, b, 1); + break; + } + } + if(stack.length == 0) return 0; + var i = stack.pop(); + b = stack.pop(); + a = stack.pop(); + if(i + 1 < a.length) stack.push(a, b, i + 1); + a = a[i]; + b = b[i]; + } + } + function caml_greaterthan(x, y){ + return + (caml_compare_val(x, y, false) > 0); + } + function div_helper(a, b, c){ + var + x = a * 65536 + (b >>> 16), + y = Math.floor(x / c) * 65536, + z = x % c * 65536, + w = z + (b & 0x0000FFFF); + return [y + Math.floor(w / c), w % c]; + } + function div_digit_nat(natq, ofsq, natr, ofsr, nat1, ofs1, len, nat2, ofs2){ + var rem = nat1.data[ofs1 + len - 1] >>> 0; + for(var i = len - 2; i >= 0; i--){ + var + x = div_helper(rem, nat1.data[ofs1 + i] >>> 0, nat2.data[ofs2] >>> 0); + natq.data[ofsq + i] = x[0]; + rem = x[1]; + } + natr.data[ofsr] = rem; + return 0; + } + function num_leading_zero_bits_in_digit(nat, ofs){ + var a = nat.data[ofs], b = 0; + if(a & 0xFFFF0000){b += 16; a >>>= 16;} + if(a & 0xFF00){b += 8; a >>>= 8;} + if(a & 0xF0){b += 4; a >>>= 4;} + if(a & 12){b += 2; a >>>= 2;} + if(a & 2){b += 1; a >>>= 1;} + if(a & 1) b += 1; + return 32 - b; + } + function shift_left_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = 0; i < len1; i++){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a << nbits | wrap; + wrap = a >>> 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + function MlNat(x){ + this.data = new Int32Array(x); + this.length = this.data.length + 2; + } + MlNat.prototype.caml_custom = "_nat"; + function create_nat(size){ + var arr = new MlNat(size); + for(var i = 0; i < size; i++) arr.data[i] = - 1; + return arr; + } + function set_to_zero_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) nat.data[ofs + i] = 0; + return 0; + } + function incr_nat(nat, ofs, len, carry_in){ + var carry = carry_in; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) + carry; + nat.data[ofs + i] = x | 0; + if(x == x >>> 0){carry = 0; break;} else carry = 1; + } + return carry; + } + function add_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var carry = carry_in; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry; + nat1.data[ofs1 + i] = x; + if(x == x >>> 0) carry = 0; else carry = 1; + } + return incr_nat(nat1, ofs1 + len2, len1 - len2, carry); + } + function nat_of_array(l){return new MlNat(l);} + function mult_digit_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3){ + var carry = 0, a = nat3.data[ofs3] >>> 0; + for(var i = 0; i < len2; i++){ + var + x1 = + (nat1.data[ofs1 + i] >>> 0) + + (nat2.data[ofs2 + i] >>> 0) * (a & 0x0000FFFF) + + carry, + x2 = (nat2.data[ofs2 + i] >>> 0) * (a >>> 16); + carry = Math.floor(x2 / 65536); + var x3 = x1 + x2 % 65536 * 65536; + nat1.data[ofs1 + i] = x3; + carry += Math.floor(x3 / 4294967296); + } + return len2 < len1 && carry + ? add_nat + (nat1, ofs1 + len2, len1 - len2, nat_of_array([carry]), 0, 1, 0) + : carry; + } + function decr_nat(nat, ofs, len, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) - borrow; + nat.data[ofs + i] = x; + if(x >= 0){borrow = 0; break;} else borrow = 1; + } + return borrow == 1 ? 0 : 1; + } + function sub_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow; + nat1.data[ofs1 + i] = x; + if(x >= 0) borrow = 0; else borrow = 1; + } + return decr_nat(nat1, ofs1 + len2, len1 - len2, borrow == 1 ? 0 : 1); + } + function compare_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var + a = num_digits_nat(nat1, ofs1, len1), + b = num_digits_nat(nat2, ofs2, len2); + if(a > b) return 1; + if(a < b) return - 1; + for(var i = len1 - 1; i >= 0; i--){ + if(nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0) return 1; + if(nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0) return - 1; + } + return 0; + } + function div_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + if(len2 == 1){ + div_digit_nat(nat1, ofs1 + 1, nat1, ofs1, nat1, ofs1, len1, nat2, ofs2); + return 0; + } + var s = num_leading_zero_bits_in_digit(nat2, ofs2 + len2 - 1); + shift_left_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + shift_left_nat(nat1, ofs1, len1, nat_of_array([0]), 0, s); + var d = (nat2.data[ofs2 + len2 - 1] >>> 0) + 1, a = create_nat(len2 + 1); + for(var i = len1 - 1; i >= len2; i--){ + var + quo = + d == 4294967296 + ? nat1.data[ofs1 + i] >>> 0 + : div_helper + (nat1.data[ofs1 + i] >>> 0, nat1.data[ofs1 + i - 1] >>> 0, d) + [0]; + set_to_zero_nat(a, 0, len2 + 1); + mult_digit_nat(a, 0, len2 + 1, nat2, ofs2, len2, nat_of_array([quo]), 0); + sub_nat(nat1, ofs1 + i - len2, len2 + 1, a, 0, len2 + 1, 1); + while + (nat1.data[ofs1 + i] != 0 + || compare_nat(nat1, ofs1 + i - len2, len2, nat2, ofs2, len2) >= 0){ + quo = quo + 1; + sub_nat(nat1, ofs1 + i - len2, len2 + 1, nat2, ofs2, len2, 1); + } + nat1.data[ofs1 + i] = quo; + } + shift_right_nat(nat1, ofs1, len2, nat_of_array([0]), 0, s); + shift_right_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + return 0; + } + function caml_ba_blit(src, dst){ + if(dst.dims.length != src.dims.length) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + for(var i = 0; i < dst.dims.length; i++) + if(dst.dims[i] != src.dims[i]) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + dst.data.set(src.data); + return 0; + } + function is_digit_int(nat, ofs){if(nat.data[ofs] >= 0) return 1; return 0;} + function caml_int64_div(x, y){return x.div(y);} + function caml_js_html_entities(s){ + var entity = /^&#?[0-9a-zA-Z]+;$/; + if(s.match(entity)){ + var str, temp = document.createElement("p"); + temp.innerHTML = s; + str = temp.textContent || temp.innerText; + temp = null; + return str; + } + else + caml_failwith("Invalid entity " + s); + } + function caml_string_unsafe_set(s, i, c){ + caml_failwith("caml_string_unsafe_set"); + } + function caml_int64_of_float(x){ + if(x < 0) x = Math.ceil(x); + return new + MlInt64 + (x & 0xffffff, + Math.floor(x * caml_int64_offset) & 0xffffff, + Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff); + } + function caml_ml_channel_size_64(chanid){ + var chan = caml_ml_channels[chanid]; + return caml_int64_of_float(chan.file.length()); + } + function caml_ba_set_2(ba, i0, i1, v){ + ba.set(ba.offset([i0, i1]), v); + return 0; + } + var + caml_argv = + function(){ + var process = globalThis.process, main = "a.out", args = []; + if(process && process.argv && process.argv.length > 1){ + var argv = process.argv; + main = argv[1]; + args = argv.slice(2); + } + var p = caml_string_of_jsstring(main), args2 = [0, p]; + for(var i = 0; i < args.length; i++) + args2.push(caml_string_of_jsstring(args[i])); + return args2; + } + (), + caml_executable_name = caml_argv[1]; + function caml_js_eval_string(s){return eval(caml_jsstring_of_string(s));} + function serialize_nat(writer, nat, sz){ + var len = nat.data.length; + writer.write(32, len); + for(var i = 0; i < len; i++) writer.write(32, nat.data[i]); + sz[0] = len * 4; + sz[1] = len * 8; + } + function caml_memprof_set(_control){return 0;} + function caml_sys_exit(code){ + if(globalThis.quit) globalThis.quit(code); + if(globalThis.process && globalThis.process.exit) + globalThis.process.exit(code); + caml_invalid_argument("Function 'exit' not implemented"); + } + function caml_channel_descriptor(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.fd; + } + function caml_js_from_array(a){return a.slice(1);} + function caml_ba_reshape(ba, vind){ + vind = caml_js_from_array(vind); + var new_dim = [], num_dims = vind.length; + if(num_dims < 0 || num_dims > 16) + caml_invalid_argument("Bigarray.reshape: bad number of dimensions"); + var num_elts = 1; + for(var i = 0; i < num_dims; i++){ + new_dim[i] = vind[i]; + if(new_dim[i] < 0) + caml_invalid_argument("Bigarray.reshape: negative dimension"); + num_elts = num_elts * new_dim[i]; + } + var size = caml_ba_get_size(ba.dims); + if(num_elts != size) + caml_invalid_argument("Bigarray.reshape: size mismatch"); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dim, ba.data); + } + var caml_oo_last_id = 0; + function caml_set_oo_id(b){b[2] = caml_oo_last_id++; return b;} + function caml_gr_fill_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.fillRect(x, s.height - y, w, - h); + return 0; + } + function caml_bigstring_blit_string_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_string_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_string(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + function caml_gr_set_window_title(name){ + var s = caml_gr_state_get(); + s.title = name; + var jsname = caml_jsstring_of_string(name); + if(s.set_title) s.set_title(jsname); + return 0; + } + function caml_get_global_data(){return caml_global_data;} + function caml_int64_shift_right_unsigned(x, s){return x.shift_right_unsigned(s); + } + function caml_ba_uint8_get16(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + var b1 = ba.get(ofs), b2 = ba.get(ofs + 1); + return b1 | b2 << 8; + } + function caml_compare(a, b){return caml_compare_val(a, b, true);} + var + caml_MD5Transform = + function(){ + function add(x, y){return x + y | 0;} + function xx(q, a, b, x, s, t){ + a = add(add(a, q), add(x, t)); + return add(a << s | a >>> 32 - s, b); + } + function ff(a, b, c, d, x, s, t){ + return xx(b & c | ~ b & d, a, b, x, s, t); + } + function gg(a, b, c, d, x, s, t){ + return xx(b & d | c & ~ d, a, b, x, s, t); + } + function hh(a, b, c, d, x, s, t){return xx(b ^ c ^ d, a, b, x, s, t);} + function ii(a, b, c, d, x, s, t){ + return xx(c ^ (b | ~ d), a, b, x, s, t); + } + return function(w, buffer){ + var a = w[0], b = w[1], c = w[2], d = w[3]; + a = ff(a, b, c, d, buffer[0], 7, 0xD76AA478); + d = ff(d, a, b, c, buffer[1], 12, 0xE8C7B756); + c = ff(c, d, a, b, buffer[2], 17, 0x242070DB); + b = ff(b, c, d, a, buffer[3], 22, 0xC1BDCEEE); + a = ff(a, b, c, d, buffer[4], 7, 0xF57C0FAF); + d = ff(d, a, b, c, buffer[5], 12, 0x4787C62A); + c = ff(c, d, a, b, buffer[6], 17, 0xA8304613); + b = ff(b, c, d, a, buffer[7], 22, 0xFD469501); + a = ff(a, b, c, d, buffer[8], 7, 0x698098D8); + d = ff(d, a, b, c, buffer[9], 12, 0x8B44F7AF); + c = ff(c, d, a, b, buffer[10], 17, 0xFFFF5BB1); + b = ff(b, c, d, a, buffer[11], 22, 0x895CD7BE); + a = ff(a, b, c, d, buffer[12], 7, 0x6B901122); + d = ff(d, a, b, c, buffer[13], 12, 0xFD987193); + c = ff(c, d, a, b, buffer[14], 17, 0xA679438E); + b = ff(b, c, d, a, buffer[15], 22, 0x49B40821); + a = gg(a, b, c, d, buffer[1], 5, 0xF61E2562); + d = gg(d, a, b, c, buffer[6], 9, 0xC040B340); + c = gg(c, d, a, b, buffer[11], 14, 0x265E5A51); + b = gg(b, c, d, a, buffer[0], 20, 0xE9B6C7AA); + a = gg(a, b, c, d, buffer[5], 5, 0xD62F105D); + d = gg(d, a, b, c, buffer[10], 9, 0x02441453); + c = gg(c, d, a, b, buffer[15], 14, 0xD8A1E681); + b = gg(b, c, d, a, buffer[4], 20, 0xE7D3FBC8); + a = gg(a, b, c, d, buffer[9], 5, 0x21E1CDE6); + d = gg(d, a, b, c, buffer[14], 9, 0xC33707D6); + c = gg(c, d, a, b, buffer[3], 14, 0xF4D50D87); + b = gg(b, c, d, a, buffer[8], 20, 0x455A14ED); + a = gg(a, b, c, d, buffer[13], 5, 0xA9E3E905); + d = gg(d, a, b, c, buffer[2], 9, 0xFCEFA3F8); + c = gg(c, d, a, b, buffer[7], 14, 0x676F02D9); + b = gg(b, c, d, a, buffer[12], 20, 0x8D2A4C8A); + a = hh(a, b, c, d, buffer[5], 4, 0xFFFA3942); + d = hh(d, a, b, c, buffer[8], 11, 0x8771F681); + c = hh(c, d, a, b, buffer[11], 16, 0x6D9D6122); + b = hh(b, c, d, a, buffer[14], 23, 0xFDE5380C); + a = hh(a, b, c, d, buffer[1], 4, 0xA4BEEA44); + d = hh(d, a, b, c, buffer[4], 11, 0x4BDECFA9); + c = hh(c, d, a, b, buffer[7], 16, 0xF6BB4B60); + b = hh(b, c, d, a, buffer[10], 23, 0xBEBFBC70); + a = hh(a, b, c, d, buffer[13], 4, 0x289B7EC6); + d = hh(d, a, b, c, buffer[0], 11, 0xEAA127FA); + c = hh(c, d, a, b, buffer[3], 16, 0xD4EF3085); + b = hh(b, c, d, a, buffer[6], 23, 0x04881D05); + a = hh(a, b, c, d, buffer[9], 4, 0xD9D4D039); + d = hh(d, a, b, c, buffer[12], 11, 0xE6DB99E5); + c = hh(c, d, a, b, buffer[15], 16, 0x1FA27CF8); + b = hh(b, c, d, a, buffer[2], 23, 0xC4AC5665); + a = ii(a, b, c, d, buffer[0], 6, 0xF4292244); + d = ii(d, a, b, c, buffer[7], 10, 0x432AFF97); + c = ii(c, d, a, b, buffer[14], 15, 0xAB9423A7); + b = ii(b, c, d, a, buffer[5], 21, 0xFC93A039); + a = ii(a, b, c, d, buffer[12], 6, 0x655B59C3); + d = ii(d, a, b, c, buffer[3], 10, 0x8F0CCC92); + c = ii(c, d, a, b, buffer[10], 15, 0xFFEFF47D); + b = ii(b, c, d, a, buffer[1], 21, 0x85845DD1); + a = ii(a, b, c, d, buffer[8], 6, 0x6FA87E4F); + d = ii(d, a, b, c, buffer[15], 10, 0xFE2CE6E0); + c = ii(c, d, a, b, buffer[6], 15, 0xA3014314); + b = ii(b, c, d, a, buffer[13], 21, 0x4E0811A1); + a = ii(a, b, c, d, buffer[4], 6, 0xF7537E82); + d = ii(d, a, b, c, buffer[11], 10, 0xBD3AF235); + c = ii(c, d, a, b, buffer[2], 15, 0x2AD7D2BB); + b = ii(b, c, d, a, buffer[9], 21, 0xEB86D391); + w[0] = add(a, w[0]); + w[1] = add(b, w[1]); + w[2] = add(c, w[2]); + w[3] = add(d, w[3]);}; + } + (); + function caml_MD5Update(ctx, input, input_len){ + var in_buf = ctx.len & 0x3f, input_pos = 0; + ctx.len += input_len; + if(in_buf){ + var missing = 64 - in_buf; + if(input_len < missing){ + ctx.b8.set(input.subarray(0, input_len), in_buf); + return; + } + ctx.b8.set(input.subarray(0, missing), in_buf); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= missing; + input_pos += missing; + } + while(input_len >= 64){ + ctx.b8.set(input.subarray(input_pos, input_pos + 64), 0); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= 64; + input_pos += 64; + } + if(input_len) + ctx.b8.set(input.subarray(input_pos, input_pos + input_len), 0); + } + function caml_runtime_events_read_poll(cursor, callbacks, num){return 0;} + function caml_fresh_oo_id(){return caml_oo_last_id++;} + function caml_int64_to_float(x){return x.toFloat();} + function caml_ba_get_1(ba, i0){return ba.get(ba.offset(i0));} + function caml_bigstring_memcmp(s1, pos1, s2, pos2, len){ + for(var i = 0; i < len; i++){ + var a = caml_ba_get_1(s1, pos1 + i), b = caml_ba_get_1(s2, pos2 + i); + if(a < b) return - 1; + if(a > b) return 1; + } + return 0; + } + function caml_new_string(s){return caml_string_of_jsbytes(s);} + function caml_erf_float(x){ + var + a1 = 0.254829592, + a2 = - 0.284496736, + a3 = 1.421413741, + a4 = - 1.453152027, + a5 = 1.061405429, + p = 0.3275911, + sign = 1; + if(x < 0) sign = - 1; + x = Math.abs(x); + var + t = 1.0 / (1.0 + p * x), + y = + 1.0 + - + ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + * Math.exp(- (x * x)); + return sign * y; + } + function caml_ba_uint8_get32(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3); + return b1 << 0 | b2 << 8 | b3 << 16 | b4 << 24; + } + function caml_raw_backtrace_length(){return 0;} + function caml_str_initialize(unit){return 0;} + function caml_obj_block(tag, size){ + var o = new Array(size + 1); + o[0] = tag; + for(var i = 1; i <= size; i++) o[i] = 0; + return o; + } + function caml_gr_clear_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = s.width; + s.canvas.height = s.height; + return 0; + } + function bigstring_to_array_buffer(bs){return bs.data.buffer;} + function caml_sys_const_naked_pointers_checked(_unit){return 0;} + function lxor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] ^= nat2.data[ofs2]; return 0; + } + function caml_obj_add_offset(v, offset){ + caml_failwith("Obj.add_offset is not supported"); + } + function caml_final_release(){return 0;} + var caml_marshal_header_size = 20; + function caml_js_to_array(a){ + var len = a.length, b = new Array(len + 1); + b[0] = 0; + for(var i = 0; i < len; i++) b[i + 1] = a[i]; + return b; + } + function caml_sys_is_regular_file(name){ + var root = resolve_fs_device(name); + return root.device.isFile(root.rest); + } + function caml_gr_plot(x, y){ + var + s = caml_gr_state_get(), + im = s.context.createImageData(1, 1), + d = im.data, + color = s.color; + d[0] = color >> 16 & 0xff; + d[1] = color >> 8 & 0xff, d[2] = color >> 0 & 0xff; + d[3] = 0xFF; + s.x = x; + s.y = y; + s.context.putImageData(im, x, s.height - y); + return 0; + } + function caml_bytes_set64(s, i, i64){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = caml_int64_to_bytes(i64); + for(var j = 0; j < 8; j++) caml_bytes_unsafe_set(s, i + 7 - j, a[j]); + return 0; + } + function caml_string_set16(s, i, i16){caml_failwith("caml_string_set16");} + function caml_int64_bswap(x){ + var y = caml_int64_to_bytes(x); + return caml_int64_of_bytes + ([y[7], y[6], y[5], y[4], y[3], y[2], y[1], y[0]]); + } + function caml_gc_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_lex_array(s){ + s = caml_jsbytes_of_string(s); + var l = s.length / 2, a = new Array(l); + for(var i = 0; i < l; i++) + a[i] = (s.charCodeAt(2 * i) | s.charCodeAt(2 * i + 1) << 8) << 16 >> 16; + return a; + } + function caml_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0) return - base - 1; + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + function caml_sys_file_exists(name){ + var root = resolve_fs_device(name); + return root.device.exists(root.rest); + } + function caml_convert_raw_backtrace_slot(){ + caml_failwith("caml_convert_raw_backtrace_slot"); + } + function caml_array_sub(a, i, len){ + var a2 = new Array(len + 1); + a2[0] = 0; + for(var i2 = 1, i1 = i + 1; i2 <= len; i2++, i1++) a2[i2] = a[i1]; + return a2; + } + function caml_bytes_equal(s1, s2){ + if(s1 === s2) return 1; + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c == s2.c ? 1 : 0; + } + function caml_gr_size_x(){var s = caml_gr_state_get(); return s.width;} + function Base_int_math_int32_clz(x){ + var n = 32, y; + y = x >> 16; + if(y != 0){n = n - 16; x = y;} + y = x >> 8; + if(y != 0){n = n - 8; x = y;} + y = x >> 4; + if(y != 0){n = n - 4; x = y;} + y = x >> 2; + if(y != 0){n = n - 2; x = y;} + y = x >> 1; + if(y != 0) return n - 2; + return n - x; + } + function caml_ml_debug_info_status(){return 0;} + function caml_atomic_fetch_add(ref, i){ + var old = ref[1]; + ref[1] += i; + return old; + } + var + os_type = + globalThis.process && globalThis.process.platform + && globalThis.process.platform == "win32" + ? "Cygwin" + : "Unix"; + function caml_sys_const_ostype_cygwin(){return os_type == "Cygwin" ? 1 : 0; + } + function caml_cosh_float(x){return Math.cosh(x);} + function MlMutex(){this.locked = false;} + function caml_ml_mutex_new(unit){return new MlMutex();} + var caml_ephe_key_offset = 3; + function caml_ephe_check_key(x, i){ + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : 1; + } + function caml_hash_mix_final(h){ + h ^= h >>> 16; + h = caml_mul(h, 0x85ebca6b | 0); + h ^= h >>> 13; + h = caml_mul(h, 0xc2b2ae35 | 0); + h ^= h >>> 16; + return h; + } + function caml_gr_text_size(txt){ + var + s = caml_gr_state_get(), + w = s.context.measureText(caml_jsstring_of_string(txt)).width; + return [0, w, s.text_size]; + } + function caml_lex_run_mem(s, i, mem, curr_pos){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) + mem[dst + 1] = curr_pos; + else + mem[dst + 1] = mem[src + 1]; + } + } + function caml_lex_run_tag(s, i, mem){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) mem[dst + 1] = - 1; else mem[dst + 1] = mem[src + 1]; + } + } + function caml_new_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_mem = 10, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5, + lex_base_code = 6, + lex_backtrk_code = 7, + lex_default_code = 8, + lex_trans_code = 9, + lex_check_code = 10, + lex_code = 11; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + if(! tbl.lex_default_code){ + tbl.lex_base_code = caml_lex_array(tbl[lex_base_code]); + tbl.lex_backtrk_code = caml_lex_array(tbl[lex_backtrk_code]); + tbl.lex_check_code = caml_lex_array(tbl[lex_check_code]); + tbl.lex_trans_code = caml_lex_array(tbl[lex_trans_code]); + tbl.lex_default_code = caml_lex_array(tbl[lex_default_code]); + } + if(tbl.lex_code == null) + tbl.lex_code = caml_jsbytes_of_string(tbl[lex_code]); + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0){ + var pc_off = tbl.lex_base_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + return - base - 1; + } + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + var pc_off = tbl.lex_backtrk_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + var pstate = state; + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else{ + var base_code = tbl.lex_base_code[pstate], pc_off; + if(tbl.lex_check_code[base_code + c] == pstate) + pc_off = tbl.lex_trans_code[base_code + c]; + else + pc_off = tbl.lex_default_code[pstate]; + if(pc_off > 0) + caml_lex_run_mem + (tbl.lex_code, pc_off, lexbuf[lex_mem], lexbuf[lex_curr_pos]); + if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + } + function caml_ba_uint8_set64(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var v = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) ba.set(ofs + i, v[7 - i]); + return 0; + } + function caml_sys_executable_name(a){return caml_executable_name;} + function caml_lessequal(x, y){ + return + (caml_compare_val(x, y, false) <= 0); + } + function caml_acosh_float(x){return Math.acosh(x);} + function caml_MD5Init(){ + var + buffer = new ArrayBuffer(64), + b32 = new Uint32Array(buffer), + b8 = new Uint8Array(buffer); + return {len: 0, + w: + new Uint32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476]), + b32: b32, + b8: b8}; + } + function caml_ml_flush(chanid){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) caml_raise_sys_error("Cannot flush a closed channel"); + if(! chan.buffer || chan.buffer_curr == 0) return 0; + if(chan.output) + chan.output(caml_subarray_to_jsbytes(chan.buffer, 0, chan.buffer_curr)); + else + chan.file.write(chan.offset, chan.buffer, 0, chan.buffer_curr); + chan.offset += chan.buffer_curr; + chan.buffer_curr = 0; + return 0; + } + function caml_seek_out(chanid, pos){ + caml_ml_flush(chanid); + var chan = caml_ml_channels[chanid]; + chan.offset = pos; + return 0; + } + function caml_ml_seek_out_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_out(chanid, pos); + } + function compare_nat_real(nat1, nat2){ + return compare_nat(nat1, 0, nat1.data.length, nat2, 0, nat2.data.length); + } + function caml_gc_set(_control){return 0;} + function caml_js_get(o, f){return o[f];} + function caml_unix_isatty(fileDescriptor){ + if(fs_node_supported()){ + var tty = require("tty"); + return tty.isatty(fileDescriptor) ? 1 : 0; + } + else + return 0; + } + function caml_ml_set_buffered(chanid, v){ + caml_ml_channels[chanid].buffered = v; + if(! v) caml_ml_flush(chanid); + return 0; + } + function caml_hash_mix_bytes_arr(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = s[i] | s[i + 1] << 8 | s[i + 2] << 16 | s[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s[i + 2] << 16; + case 2: + w |= s[i + 1] << 8; + case 1: + w |= s[i]; h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_ml_bytes_content(s){ + switch(s.t & 6){ + default: caml_convert_string_to_bytes(s); + case 0: + return s.c; + case 4: + return s.c; + } + } + function caml_hash_mix_bytes(h, v){ + var content = caml_ml_bytes_content(v); + return typeof content === "string" + ? caml_hash_mix_jsbytes(h, content) + : caml_hash_mix_bytes_arr(h, content); + } + function caml_hash(count, limit, seed, obj){ + var queue, rd, wr, sz, num, h, v, i, len; + sz = limit; + if(sz < 0 || sz > 256) sz = 256; + num = count; + h = seed; + queue = [obj]; + rd = 0; + wr = 1; + while(rd < wr && num > 0){ + v = queue[rd++]; + if(v && v.caml_custom){ + if + (caml_custom_ops[v.caml_custom] && caml_custom_ops[v.caml_custom].hash){ + var hh = caml_custom_ops[v.caml_custom].hash(v); + h = caml_hash_mix_int(h, hh); + num--; + } + } + else if(v instanceof Array && v[0] === (v[0] | 0)) + switch(v[0]){ + case 248: + h = caml_hash_mix_int(h, v[2]); num--; break; + case 250: + queue[--rd] = v[1]; break; + default: + if(caml_is_continuation_tag(v[0])) break; + var tag = v.length - 1 << 10 | v[0]; + h = caml_hash_mix_int(h, tag); + for(i = 1, len = v.length; i < len; i++){if(wr >= sz) break; queue[wr++] = v[i]; + } + break; + } + else if(caml_is_ml_bytes(v)){ + h = caml_hash_mix_bytes(h, v); + num--; + } + else if(caml_is_ml_string(v)){ + h = caml_hash_mix_string(h, v); + num--; + } + else if(typeof v === "string"){ + h = caml_hash_mix_jsbytes(h, v); + num--; + } + else if(v === (v | 0)){ + h = caml_hash_mix_int(h, v + v + 1); + num--; + } + else if(v === + v){h = caml_hash_mix_float(h, v); num--;} + } + h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function Base_hash_string(s){return caml_hash(1, 1, 0, s);} + function caml_gc_compaction(){return 0;} + function caml_ephe_get_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_key"); + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : [0, weak]; + } + function caml_unix_localtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(d.getFullYear(), 0, 1).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000), + jan = new Date(d.getFullYear(), 0, 1), + jul = new Date(d.getFullYear(), 6, 1), + stdTimezoneOffset = + Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + return [0, + d.getSeconds(), + d.getMinutes(), + d.getHours(), + d.getDate(), + d.getMonth(), + d.getFullYear() - 1900, + d.getDay(), + doy, + d.getTimezoneOffset() < stdTimezoneOffset | 0]; + } + function caml_unix_mktime(tm){ + var + d = new Date(tm[6] + 1900, tm[5], tm[4], tm[3], tm[2], tm[1]).getTime(), + t = Math.floor(d / 1000), + tm2 = caml_unix_localtime(t); + return [0, t, tm2]; + } + function caml_bigstring_blit_bytes_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_bytes_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_bytes(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + var caml_sys_fds = new Array(3); + function caml_sys_close(fd){ + var file = caml_sys_fds[fd]; + if(file) file.close(); + delete caml_sys_fds[fd]; + return 0; + } + function caml_ml_close_channel(chanid){ + var chan = caml_ml_channels[chanid]; + chan.opened = false; + caml_sys_close(chan.fd); + return 0; + } + function Base_int_math_int_pow_stub(base, exponent){ + var one = 1, mul = [one, base, one, one], res = one; + while(! exponent == 0){ + mul[1] = mul[1] * mul[3] | 0; + mul[2] = mul[1] * mul[1] | 0; + mul[3] = mul[2] * mul[1] | 0; + res = res * mul[exponent & 3] | 0; + exponent = exponent >> 2; + } + return res; + } + function caml_atomic_exchange(ref, v){ + var r = ref[1]; + ref[1] = v; + return r; + } + function caml_sys_isatty(_chan){return 0;} + function is_digit_zero(nat, ofs){ + if(nat.data[ofs] == 0) return 1; + return 0; + } + function caml_unix_lstat(name){ + var root = resolve_fs_device(name); + if(! root.device.lstat) caml_failwith("caml_unix_lstat: not implemented"); + return root.device.lstat(root.rest, true); + } + function caml_unix_lstat_64(name){ + var r = caml_unix_lstat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_js_set(o, f, v){o[f] = v; return 0;} + function caml_array_get(array, index){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + return array[index + 1]; + } + function caml_continuation_use_noexc(cont){ + var stack = cont[1]; + cont[1] = 0; + return stack; + } + function caml_unix_rmdir(name){ + var root = resolve_fs_device(name); + if(! root.device.rmdir) caml_failwith("caml_unix_rmdir: not implemented"); + return root.device.rmdir(root.rest, true); + } + function caml_log2_float(x){return Math.log2(x);} + function caml_gc_huge_fallback_count(unit){return 0;} + function caml_runtime_events_resume(){return 0;} + function caml_spacetime_only_works_for_native_code(){ + caml_failwith("Spacetime profiling only works for native code"); + } + function caml_int64_sub(x, y){return x.sub(y);} + function caml_seek_in(chanid, pos){ + var chan = caml_ml_channels[chanid]; + if(chan.refill != null) caml_raise_sys_error("Illegal seek"); + if + (pos >= chan.offset - chan.buffer_max && pos <= chan.offset + && chan.file.flags.binary) + chan.buffer_curr = chan.buffer_max - (chan.offset - pos); + else{chan.offset = pos; chan.buffer_curr = 0; chan.buffer_max = 0;} + return 0; + } + function caml_ml_seek_in_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_in(chanid, pos); + } + var caml_domain_id = 0; + function caml_ml_mutex_unlock(t){t.locked = false; return 0;} + var caml_domain_latest_idx = 1; + function caml_domain_spawn(f, mutex){ + var id = caml_domain_latest_idx++, old = caml_domain_id; + caml_domain_id = id; + caml_callback(f, [0]); + caml_domain_id = old; + caml_ml_mutex_unlock(mutex); + return id; + } + function caml_unix_mkdir(name, perm){ + var root = resolve_fs_device(name); + if(! root.device.mkdir) caml_failwith("caml_unix_mkdir: not implemented"); + return root.device.mkdir(root.rest, perm, true); + } + function caml_int64_shift_left(x, s){return x.shift_left(s);} + function caml_notequal(x, y){ + return + (caml_compare_val(x, y, false) != 0); + } + function caml_sys_const_int_size(){return 32;} + function caml_js_wrap_callback(f){ + return function(){ + var len = arguments.length; + if(len > 0){ + var args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + } + else + args = [undefined]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_js_wrap_meth_callback(f){ + return function(){ + var len = arguments.length, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_is_js(){return 1;} + var Base_internalhash_fold_float = caml_hash_mix_float; + function caml_lazy_update_to_forward(o){ + caml_obj_update_tag(o, 244, 250); + return 0; + } + function caml_ba_dim(ba, i){ + if(i < 0 || i >= ba.dims.length) caml_invalid_argument("Bigarray.dim"); + return ba.dims[i]; + } + function caml_ba_dim_1(ba){return caml_ba_dim(ba, 0);} + function caml_js_meth_call(o, f, args){ + return o[caml_jsstring_of_string(f)].apply(o, caml_js_from_array(args)); + } + var caml_ephe_data_offset = 2; + function caml_weak_create(n){ + if(n < 0) caml_invalid_argument("Weak.create"); + var x = [251, "caml_ephe_list_head"]; + x.length = caml_ephe_key_offset + n; + return x; + } + function caml_ephe_create(n){var x = caml_weak_create(n); return x;} + function caml_js_to_byte_string(s){return caml_string_of_jsbytes(s);} + function caml_trampoline(res){ + var c = 1; + while(res && res.joo_tramp){ + res = res.joo_tramp.apply(null, res.joo_args); + c++; + } + return res; + } + function caml_maybe_print_stats(unit){return 0;} + function caml_bytes_unsafe_get(s, i){ + switch(s.t & 6){ + default: if(i >= s.c.length) return 0; + case 0: + return s.c.charCodeAt(i); + case 4: + return s.c[i]; + } + } + function caml_bytes_get64(s, i){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_bytes_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + var caml_custom_event_index = 0; + function caml_runtime_events_user_register + (event_name, event_tag, event_type){ + caml_custom_event_index += 1; + return [0, caml_custom_event_index, event_name, event_type, event_tag]; + } + function caml_unix_has_symlink(unit){return fs_node_supported() ? 1 : 0;} + function caml_ephe_set_key(x, i, v){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if(v instanceof Object && globalThis.WeakRef){ + if(x[1].register) x[1].register(v, undefined, v); + x[caml_ephe_key_offset + i] = new globalThis.WeakRef(v); + } + else + x[caml_ephe_key_offset + i] = v; + return 0; + } + function caml_ephe_unset_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if + (globalThis.WeakRef + && x[caml_ephe_key_offset + i] instanceof globalThis.WeakRef + && x[1].unregister){ + var old = x[caml_ephe_key_offset + i].deref(); + if(old !== undefined){ + var count = 0; + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key === old) count++; + } + } + if(count == 1) x[1].unregister(old); + } + } + x[caml_ephe_key_offset + i] = undefined; + return 0; + } + function caml_weak_set(x, i, v){ + if(v == 0) caml_ephe_unset_key(x, i); else caml_ephe_set_key(x, i, v[1]); + return 0; + } + function caml_sys_remove(name){ + var root = resolve_fs_device(name), ok = root.device.unlink(root.rest); + if(ok == 0) caml_raise_no_such_file(caml_jsbytes_of_string(name)); + return 0; + } + function caml_string_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_string_get32(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 3) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1), + b3 = caml_string_unsafe_get(s, i + 2), + b4 = caml_string_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_bytes_get(s, i){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_get(s, i); + } + function caml_hypot_float(x, y){return Math.hypot(x, y);} + function caml_js_call(f, o, args){ + return f.apply(o, caml_js_from_array(args)); + } + function caml_sys_const_max_wosize(){return 0x7FFFFFFF / 4 | 0;} + function caml_unix_inet_addr_of_string(){return 0;} + function Base_am_testing(x){return 0;} + function caml_bytes_lessthan(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? 1 : 0; + } + function caml_erfc_float(x){return 1 - caml_erf_float(x);} + function caml_gr_fill_poly(ar){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(ar[1][1], s.height - ar[1][2]); + for(var i = 2; i < ar.length; i++) + s.context.lineTo(ar[i][1], s.height - ar[i][2]); + s.context.lineTo(ar[1][1], s.height - ar[1][2]); + s.context.fill(); + return 0; + } + function caml_gc_quick_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_ml_input_char(chanid){ + var chan = caml_ml_channels[chanid]; + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) caml_raise_end_of_file(); + var res = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + return res; + } + function caml_ml_input_int(chanid){ + var chan = caml_ml_channels[chanid], res = 0; + for(var i = 0; i < 4; i++) + res = (res << 8) + caml_ml_input_char(chanid) | 0; + return res | 0; + } + function caml_gr_display_mode(){ + caml_failwith("caml_gr_display_mode not Implemented"); + } + function caml_obj_reachable_words(o){return 0;} + function nth_digit_nat(nat, ofs){return nat.data[ofs];} + function caml_array_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_float_of_string(s){ + var res; + s = caml_jsbytes_of_string(s); + res = + s; + if(s.length > 0 && res === res) return res; + s = s.replace(/_/g, ""); + res = + s; + if(s.length > 0 && res === res || /^[+-]?nan$/i.test(s)) return res; + var m = /^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?/i.exec(s); + if(m){ + var + m3 = m[3].replace(/0+$/, ""), + mantissa = parseInt(m[1] + m[2] + m3, 16), + exponent = (m[5] | 0) - 4 * m3.length; + res = mantissa * Math.pow(2, exponent); + return res; + } + if(/^\+?inf(inity)?$/i.test(s)) return Infinity; + if(/^-inf(inity)?$/i.test(s)) return - Infinity; + caml_failwith("float_of_string"); + } + function caml_sys_getcwd(){ + return caml_string_of_jsbytes(caml_current_dir); + } + function caml_int64_add(x, y){return x.add(y);} + function caml_int64_mul(x, y){return x.mul(y);} + function caml_int64_ult(x, y){return x.ucompare(y) < 0;} + function caml_parse_sign_and_base(s){ + var i = 0, len = caml_ml_string_length(s), base = 10, sign = 1; + if(len > 0) + switch(caml_string_unsafe_get(s, i)){ + case 45: + i++; sign = - 1; break; + case 43: + i++; sign = 1; break; + } + if(i + 1 < len && caml_string_unsafe_get(s, i) == 48) + switch(caml_string_unsafe_get(s, i + 1)){ + case 120: + case 88: + base = 16; i += 2; break; + case 111: + case 79: + base = 8; i += 2; break; + case 98: + case 66: + base = 2; i += 2; break; + case 117: + case 85: + i += 2; break; + } + return [i, sign, base]; + } + function caml_parse_digit(c){ + if(c >= 48 && c <= 57) return c - 48; + if(c >= 65 && c <= 90) return c - 55; + if(c >= 97 && c <= 122) return c - 87; + return - 1; + } + function caml_int64_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + base64 = caml_int64_of_int32(base), + threshold = + new MlInt64(0xffffff, 0xfffffff, 0xffff).udivmod(base64).quotient, + c = caml_string_unsafe_get(s, i), + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = caml_int64_of_int32(d); + for(;;){ + i++; + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + if(caml_int64_ult(threshold, res)) caml_failwith("int_of_string"); + d = caml_int64_of_int32(d); + res = caml_int64_add(caml_int64_mul(base64, res), d); + if(caml_int64_ult(res, d)) caml_failwith("int_of_string"); + } + if(i != caml_ml_string_length(s)) caml_failwith("int_of_string"); + if(base == 10 && caml_int64_ult(new MlInt64(0, 0, 0x8000), res)) + caml_failwith("int_of_string"); + if(sign < 0) res = caml_int64_neg(res); + return res; + } + function caml_ba_set_1(ba, i0, v){ba.set(ba.offset(i0), v); return 0;} + function caml_int64_xor(x, y){return x.xor(y);} + function caml_int64_or(x, y){return x.or(y);} + function caml_lxm_next(v){ + function shift_l(x, k){return caml_int64_shift_left(x, k);} + function shift_r(x, k){return caml_int64_shift_right_unsigned(x, k);} + function or(a, b){return caml_int64_or(a, b);} + function xor(a, b){return caml_int64_xor(a, b);} + function add(a, b){return caml_int64_add(a, b);} + function mul(a, b){return caml_int64_mul(a, b);} + function rotl(x, k){return or(shift_l(x, k), shift_r(x, 64 - k));} + function get(a, i){return caml_ba_get_1(a, i);} + function set(a, i, x){return caml_ba_set_1(a, i, x);} + var + M = caml_int64_of_string(caml_new_string("0xd1342543de82ef95")), + daba = caml_int64_of_string(caml_new_string("0xdaba0b6eb09322e3")), + z, + q0, + q1, + st = v, + a = get(st, 0), + s = get(st, 1), + x0 = get(st, 2), + x1 = get(st, 3); + z = add(s, x0); + z = mul(xor(z, shift_r(z, 32)), daba); + z = mul(xor(z, shift_r(z, 32)), daba); + z = xor(z, shift_r(z, 32)); + set(st, 1, add(mul(s, M), a)); + var q0 = x0, q1 = x1; + q1 = xor(q1, q0); + q0 = rotl(q0, 24); + q0 = xor(xor(q0, q1), shift_l(q1, 16)); + q1 = rotl(q1, 37); + set(st, 2, q0); + set(st, 3, q1); + return z; + } + function caml_sys_const_big_endian(){return 0;} + function caml_list_to_js_array(l){ + var a = []; + for(; l !== 0; l = l[2]) a.push(l[1]); + return a; + } + var + caml_output_val = + function(){ + function Writer(){this.chunk = [];} + Writer.prototype = + {chunk_idx: 20, + block_len: 0, + obj_counter: 0, + size_32: 0, + size_64: 0, + write: + function(size, value){ + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_at: + function(pos, size, value){ + var pos = pos; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[pos++] = value >> i & 0xFF; + }, + write_code: + function(size, code, value){ + this.chunk[this.chunk_idx++] = code; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_shared: + function(offset){ + if(offset < 1 << 8) + this.write_code(8, 0x04, offset); + else if(offset < 1 << 16) + this.write_code(16, 0x05, offset); + else + this.write_code(32, 0x06, offset); + }, + pos: function(){return this.chunk_idx;}, + finalize: + function(){ + this.block_len = this.chunk_idx - 20; + this.chunk_idx = 0; + this.write(32, 0x8495A6BE); + this.write(32, this.block_len); + this.write(32, this.obj_counter); + this.write(32, this.size_32); + this.write(32, this.size_64); + return this.chunk; + }}; + return function(v, flags){ + flags = caml_list_to_js_array(flags); + var + no_sharing = flags.indexOf(0) !== - 1, + closures = flags.indexOf(1) !== - 1; + if(closures) + console.warn + ("in caml_output_val: flag Marshal.Closures is not supported."); + var + writer = new Writer(), + stack = [], + intern_obj_table = no_sharing ? null : new MlObjectTable(); + function memo(v){ + if(no_sharing) return false; + var existing_offset = intern_obj_table.recall(v); + if(existing_offset){ + writer.write_shared(existing_offset); + return true; + } + else{intern_obj_table.store(v); return false;} + } + function extern_rec(v){ + if(v.caml_custom){ + if(memo(v)) return; + var + name = v.caml_custom, + ops = caml_custom_ops[name], + sz_32_64 = [0, 0]; + if(! ops.serialize) + caml_invalid_argument("output_value: abstract value (Custom)"); + if(ops.fixed_length == undefined){ + writer.write(8, 0x18); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var header_pos = writer.pos(); + for(var i = 0; i < 12; i++) writer.write(8, 0); + ops.serialize(writer, v, sz_32_64); + writer.write_at(header_pos, 32, sz_32_64[0]); + writer.write_at(header_pos + 4, 32, 0); + writer.write_at(header_pos + 8, 32, sz_32_64[1]); + } + else{ + writer.write(8, 0x19); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var old_pos = writer.pos(); + ops.serialize(writer, v, sz_32_64); + if(ops.fixed_length != writer.pos() - old_pos) + caml_failwith + ("output_value: incorrect fixed sizes specified by " + name); + } + writer.size_32 += 2 + (sz_32_64[0] + 3 >> 2); + writer.size_64 += 2 + (sz_32_64[1] + 7 >> 3); + } + else if(v instanceof Array && v[0] === (v[0] | 0)){ + if(v[0] == 251) + caml_failwith("output_value: abstract value (Abstract)"); + if(caml_is_continuation_tag(v[0])) + caml_invalid_argument("output_value: continuation value"); + if(v.length > 1 && memo(v)) return; + if(v[0] < 16 && v.length - 1 < 8) + writer.write(8, 0x80 + v[0] + (v.length - 1 << 4)); + else + writer.write_code(32, 0x08, v.length - 1 << 10 | v[0]); + writer.size_32 += v.length; + writer.size_64 += v.length; + if(v.length > 1) stack.push(v, 1); + } + else if(caml_is_ml_bytes(v)){ + if(! caml_is_ml_bytes(caml_string_of_jsbytes(""))) + caml_failwith + ("output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]"); + if(memo(v)) return; + var len = caml_ml_bytes_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_bytes_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(caml_is_ml_string(v)){ + var len = caml_ml_string_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_string_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(v != (v | 0)){ + var type_of_v = typeof v; + caml_failwith("output_value: abstract value (" + type_of_v + ")"); + } + else if(v >= 0 && v < 0x40) + writer.write(8, 0X40 + v); + else if(v >= - (1 << 7) && v < 1 << 7) + writer.write_code(8, 0x00, v); + else if(v >= - (1 << 15) && v < 1 << 15) + writer.write_code(16, 0x01, v); + else + writer.write_code(32, 0x02, v); + } + extern_rec(v); + while(stack.length > 0){ + var i = stack.pop(), v = stack.pop(); + if(i + 1 < v.length) stack.push(v, i + 1); + extern_rec(v[i]); + } + if(intern_obj_table) + writer.obj_counter = intern_obj_table.objs.length; + writer.finalize(); + return writer.chunk;}; + } + (); + function caml_string_of_array(a){ + return caml_string_of_jsbytes(caml_subarray_to_jsbytes(a, 0, a.length)); + } + function caml_output_value_to_string(v, flags){ + return caml_string_of_array(caml_output_val(v, flags)); + } + function caml_raise_not_a_dir(name){ + caml_raise_sys_error(name + ": Not a directory"); + } + function caml_sys_system_command(cmd){ + var cmd = caml_jsstring_of_string(cmd); + if(typeof require != "undefined"){ + var child_process = require("child_process"); + if(child_process && child_process.execSync) + try{child_process.execSync(cmd, {stdio: "inherit"}); return 0;} + catch(e){return 1;} + } + else + return 127; + } + function caml_js_error_of_exception(exn){ + if(exn.js_error) return exn.js_error; + return null; + } + function caml_unix_getuid(unit){ + if(globalThis.process && globalThis.process.getuid) + return globalThis.process.getuid(); + caml_raise_not_found(); + } + function deserialize_nat(reader, sz){ + var len = reader.read32s(), nat = new MlNat(len); + for(var i = 0; i < len; i++) nat.data[i] = reader.read32s(); + sz[0] = len * 4; + return nat; + } + function initialize_nat(){ + caml_custom_ops["_nat"] = + {deserialize: deserialize_nat, + serialize: serialize_nat, + hash: caml_hash_nat}; + } + function caml_bytes_of_utf16_jsstring(s){ + var tag = 9; + if(! jsoo_is_ascii(s)) tag = 8, s = caml_utf8_of_utf16(s); + return new MlBytes(tag, s, s.length); + } + function caml_gr_open_subwindow(a, b, c, d){ + caml_failwith("caml_gr_open_subwindow not Implemented"); + } + function UInt8ArrayReader(s, i){this.s = s; this.i = i;} + UInt8ArrayReader.prototype = + {read8u: function(){return this.s[this.i++];}, + read8s: function(){return this.s[this.i++] << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 8 | s[i + 1]; + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 24 >> 16 | s[i + 1]; + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]) >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]; + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_array(this.s.subarray(i, i + len)); + }, + readuint8array: + function(len){ + var i = this.i; + this.i = i + len; + return this.s.subarray(i, i + len); + }}; + function caml_marshal_data_size(s, ofs){ + var r = new UInt8ArrayReader(caml_uint8_array_of_bytes(s), ofs); + function readvlq(overflow){ + var c = r.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = r.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + switch(r.read32u()){ + case 0x8495A6BE: + var header_len = 20, data_len = r.read32u(); break; + case 0x8495A6BD: + var + header_len = r.read8u() & 0x3F, + overflow = [false], + data_len = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("Marshal.data_size: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + default: caml_failwith("Marshal.data_size: bad object"); break; + } + return header_len - caml_marshal_header_size + data_len; + } + function MlStringReader(s, i){ + this.s = caml_jsbytes_of_string(s); + this.i = i; + } + MlStringReader.prototype = + {read8u: function(){return this.s.charCodeAt(this.i++);}, + read8s: function(){return this.s.charCodeAt(this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 8 | s.charCodeAt(i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 24 >> 16 | s.charCodeAt(i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3); + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_jsbytes(this.s.substring(i, i + len)); + }, + readuint8array: + function(len){ + var b = new Uint8Array(len), s = this.s, i = this.i; + for(var j = 0; j < len; j++) b[j] = s.charCodeAt(i + j); + this.i = i + len; + return b; + }}; + var + zstd_decompress = + function(){ + "use strict"; + var + ab = ArrayBuffer, + u8 = Uint8Array, + u16 = Uint16Array, + i16 = Int16Array, + u32 = Uint32Array, + i32 = Int32Array; + function slc(v, s, e){ + if(u8.prototype.slice) return u8.prototype.slice.call(v, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + var n = new u8(e - s); + n.set(v.subarray(s, e)); + return n; + } + function fill(v, n, s, e){ + if(u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + for(; s < e; ++s) v[s] = n; + return v; + } + function cpw(v, t, s, e){ + if(u8.prototype.copyWithin) + return u8.prototype.copyWithin.call(v, t, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + while(s < e) v[t++] = v[s++]; + } + var + ec = + ["invalid zstd data", + "window size too large (>2046MB)", + "invalid block type", + "FSE accuracy too high", + "match distance too far back", + "unexpected EOF"]; + function err(ind, msg, nt){ + var e = new Error(msg || ec[ind]); + e.code = ind; + if(! nt) throw e; + return e; + } + function rb(d, b, n){ + var i = 0, o = 0; + for(; i < n; ++i) o |= d[b++] << (i << 3); + return o; + } + function b4(d, b){ + return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; + } + function rzfh(dat, w){ + var n3 = dat[0] | dat[1] << 8 | dat[2] << 16; + if(n3 == 0x2FB528 && dat[3] == 253){ + var + flg = dat[4], + ss = flg >> 5 & 1, + cc = flg >> 2 & 1, + df = flg & 3, + fcf = flg >> 6; + if(flg & 8) err(0); + var bt = 6 - ss, db = df == 3 ? 4 : df, di = rb(dat, bt, db); + bt += db; + var + fsb = fcf ? 1 << fcf : ss, + fss = rb(dat, bt, fsb) + (fcf == 1 && 256), + ws = fss; + if(! ss){ + var wb = 1 << 10 + (dat[5] >> 3); + ws = wb + (wb >> 3) * (dat[5] & 7); + } + if(ws > 2145386496) err(1); + var buf = new u8((w == 1 ? fss || ws : w ? 0 : ws) + 12); + buf[0] = 1, buf[4] = 4, buf[8] = 8; + return {b: bt + fsb, + y: 0, + l: 0, + d: di, + w: w && w != 1 ? w : buf.subarray(12), + e: ws, + o: new i32(buf.buffer, 0, 3), + u: fss, + c: cc, + m: Math.min(131072, ws)}; + } + else if((n3 >> 4 | dat[3] << 20) == 0x184D2A5) return b4(dat, 4) + 8; + err(0); + } + function msb(val){ + var bits = 0; + for(; 1 << bits <= val; ++bits) ; + return bits - 1; + } + function rfse(dat, bt, mal){ + var tpos = (bt << 3) + 4, al = (dat[bt] & 15) + 5; + if(al > mal) err(3); + var + sz = 1 << al, + probs = sz, + sym = - 1, + re = - 1, + i = - 1, + ht = sz, + buf = new ab(512 + (sz << 2)), + freq = new i16(buf, 0, 256), + dstate = new u16(buf, 0, 256), + nstate = new u16(buf, 512, sz), + bb1 = 512 + (sz << 1), + syms = new u8(buf, bb1, sz), + nbits = new u8(buf, bb1 + sz); + while(sym < 255 && probs > 0){ + var + bits = msb(probs + 1), + cbt = tpos >> 3, + msk = (1 << bits + 1) - 1, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7) + & msk, + msk1fb = (1 << bits) - 1, + msv = msk - probs - 1, + sval = val & msk1fb; + if(sval < msv) + tpos += bits, val = sval; + else{tpos += bits + 1; if(val > msk1fb) val -= msv;} + freq[++sym] = --val; + if(val == - 1){probs += val; syms[--ht] = sym;} else probs -= val; + if(! val) + do{ + var rbt = tpos >> 3; + re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3; + tpos += 2; + sym += re; + } + while + (re == 3); + } + if(sym > 255 || probs) err(0); + var sympos = 0, sstep = (sz >> 1) + (sz >> 3) + 3, smask = sz - 1; + for(var s = 0; s <= sym; ++s){ + var sf = freq[s]; + if(sf < 1){dstate[s] = - sf; continue;} + for(i = 0; i < sf; ++i){ + syms[sympos] = s; + do sympos = sympos + sstep & smask;while(sympos >= ht); + } + } + if(sympos) err(0); + for(i = 0; i < sz; ++i){ + var ns = dstate[syms[i]]++, nb = nbits[i] = al - msb(ns); + nstate[i] = (ns << nb) - sz; + } + return [tpos + 7 >> 3, {b: al, s: syms, n: nbits, t: nstate}]; + } + function rhu(dat, bt){ + var + i = 0, + wc = - 1, + buf = new u8(292), + hb = dat[bt], + hw = buf.subarray(0, 256), + rc = buf.subarray(256, 268), + ri = new u16(buf.buffer, 268); + if(hb < 128){ + var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1]; + bt += hb; + var epos = ebt << 3, lb = dat[bt]; + if(! lb) err(0); + var + st1 = 0, + st2 = 0, + btr1 = fdt.b, + btr2 = btr1, + fpos = (++bt << 3) - 8 + msb(lb); + for(;;){ + fpos -= btr1; + if(fpos < epos) break; + var cbt = fpos >> 3; + st1 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1; + hw[++wc] = fdt.s[st1]; + fpos -= btr2; + if(fpos < epos) break; + cbt = fpos >> 3; + st2 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1; + hw[++wc] = fdt.s[st2]; + btr1 = fdt.n[st1]; + st1 = fdt.t[st1]; + btr2 = fdt.n[st2]; + st2 = fdt.t[st2]; + } + if(++wc > 255) err(0); + } + else{ + wc = hb - 127; + for(; i < wc; i += 2){ + var byte = dat[++bt]; + hw[i] = byte >> 4; + hw[i + 1] = byte & 15; + } + ++bt; + } + var wes = 0; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + if(wt > 11) err(0); + wes += wt && 1 << wt - 1; + } + var mb = msb(wes) + 1, ts = 1 << mb, rem = ts - wes; + if(rem & rem - 1) err(0); + hw[wc++] = msb(rem) + 1; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + ++rc[hw[i] = wt && mb + 1 - wt]; + } + var + hbuf = new u8(ts << 1), + syms = hbuf.subarray(0, ts), + nb = hbuf.subarray(ts); + ri[mb] = 0; + for(i = mb; i > 0; --i){ + var pv = ri[i]; + fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i)); + } + if(ri[0] != ts) err(0); + for(i = 0; i < wc; ++i){ + var bits = hw[i]; + if(bits){ + var code = ri[bits]; + fill(syms, i, code, ri[bits] = code + (1 << mb - bits)); + } + } + return [bt, {n: nb, b: mb, s: syms}]; + } + var + dllt = + rfse + (new + u8 + ([81, + 16, + 99, + 140, + 49, + 198, + 24, + 99, + 12, + 33, + 196, + 24, + 99, + 102, + 102, + 134, + 70, + 146, + 4]), + 0, + 6) + [1], + dmlt = + rfse + (new + u8 + ([33, + 20, + 196, + 24, + 99, + 140, + 33, + 132, + 16, + 66, + 8, + 33, + 132, + 16, + 66, + 8, + 33, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 36, + 9]), + 0, + 6) + [1], + doct = + rfse + (new u8([32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2]), + 0, + 5) + [1]; + function b2bl(b, s){ + var len = b.length, bl = new i32(len); + for(var i = 0; i < len; ++i){bl[i] = s; s += 1 << b[i];} + return bl; + } + var + llb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 16843009, + 50528770, + 134678020, + 202050057, + 269422093]).buffer, + 0, + 36), + llbl = b2bl(llb, 0), + mlb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16843009, + 50528770, + 117769220, + 185207048, + 252579084, + 16]).buffer, + 0, + 53), + mlbl = b2bl(mlb, 3); + function dhu(dat, out, hu){ + var + len = dat.length, + ss = out.length, + lb = dat[len - 1], + msk = (1 << hu.b) - 1, + eb = - hu.b; + if(! lb) err(0); + var + st = 0, + btr = hu.b, + pos = (len << 3) - 8 + msb(lb) - btr, + i = - 1; + for(; pos > eb && i < ss;){ + var + cbt = pos >> 3, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7); + st = (st << btr | val) & msk; + out[++i] = hu.s[st]; + pos -= btr = hu.n[st]; + } + if(pos != eb || i + 1 != ss) err(0); + } + function dhu4(dat, out, hu){ + var + bt = 6, + ss = out.length, + sz1 = ss + 3 >> 2, + sz2 = sz1 << 1, + sz3 = sz1 + sz2; + dhu + (dat.subarray(bt, bt += dat[0] | dat[1] << 8), + out.subarray(0, sz1), + hu); + dhu + (dat.subarray(bt, bt += dat[2] | dat[3] << 8), + out.subarray(sz1, sz2), + hu); + dhu + (dat.subarray(bt, bt += dat[4] | dat[5] << 8), + out.subarray(sz2, sz3), + hu); + dhu(dat.subarray(bt), out.subarray(sz3), hu); + } + function rzb(dat, st, out){ + var _a, bt = st.b, b0 = dat[bt], btype = b0 >> 1 & 3; + st.l = b0 & 1; + var + sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13, + ebt = (bt += 3) + sz; + if(btype == 1){ + if(bt >= dat.length) return; + st.b = bt + 1; + if(out){fill(out, dat[bt], st.y, st.y += sz); return out;} + return fill(new u8(sz), dat[bt]); + } + if(ebt > dat.length) return; + if(btype == 0){ + st.b = ebt; + if(out){ + out.set(dat.subarray(bt, ebt), st.y); + st.y += sz; + return out; + } + return slc(dat, bt, ebt); + } + if(btype == 2){ + var + b3 = dat[bt], + lbt = b3 & 3, + sf = b3 >> 2 & 3, + lss = b3 >> 4, + lcs = 0, + s4 = 0; + if(lbt < 2) + if(sf & 1) + lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12); + else + lss = b3 >> 3; + else{ + s4 = sf; + if(sf < 2) + lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2; + else if(sf == 2) + lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12, + lcs = dat[bt] >> 2 | dat[++bt] << 6; + else + lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12, + lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10; + } + ++bt; + var + buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m), + spl = buf.length - lss; + if(lbt == 0) + buf.set(dat.subarray(bt, bt += lss), spl); + else if(lbt == 1) + fill(buf, dat[bt++], spl); + else{ + var hu = st.h; + if(lbt == 2){ + var hud = rhu(dat, bt); + lcs += bt - (bt = hud[0]); + st.h = hu = hud[1]; + } + else if(! hu) err(0); + (s4 ? dhu4 : dhu) + (dat.subarray(bt, bt += lcs), buf.subarray(spl), hu); + } + var ns = dat[bt++]; + if(ns){ + if(ns == 255) + ns = (dat[bt++] | dat[bt++] << 8) + 0x7F00; + else if(ns > 127) ns = ns - 128 << 8 | dat[bt++]; + var scm = dat[bt++]; + if(scm & 3) err(0); + var dts = [dmlt, doct, dllt]; + for(var i = 2; i > - 1; --i){ + var md = scm >> (i << 1) + 2 & 3; + if(md == 1){ + var rbuf = new u8([0, 0, dat[bt++]]); + dts[i] = + {s: rbuf.subarray(2, 3), + n: rbuf.subarray(0, 1), + t: new u16(rbuf.buffer, 0, 1), + b: 0}; + } + else if(md == 2) + _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1]; + else if(md == 3){if(! st.t) err(0); dts[i] = st.t[i];} + } + var + _b = st.t = dts, + mlt = _b[0], + oct = _b[1], + llt = _b[2], + lb = dat[ebt - 1]; + if(! lb) err(0); + var + spos = (ebt << 3) - 8 + msb(lb) - llt.b, + cbt = spos >> 3, + oubt = 0, + lst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1; + cbt = (spos -= oct.b) >> 3; + var + ost = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1; + cbt = (spos -= mlt.b) >> 3; + var + mst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1; + for(++ns; --ns;){ + var + llc = llt.s[lst], + lbtr = llt.n[lst], + mlc = mlt.s[mst], + mbtr = mlt.n[mst], + ofc = oct.s[ost], + obtr = oct.n[ost]; + cbt = (spos -= ofc) >> 3; + var + ofp = 1 << ofc, + off = + ofp + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16 + | dat[cbt + 3] << 24) + >>> (spos & 7) + & ofp - 1); + cbt = (spos -= mlb[mlc]) >> 3; + var + ml = + mlbl[mlc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << mlb[mlc]) - 1); + cbt = (spos -= llb[llc]) >> 3; + var + ll = + llbl[llc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << llb[llc]) - 1); + cbt = (spos -= lbtr) >> 3; + lst = + llt.t[lst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1); + cbt = (spos -= mbtr) >> 3; + mst = + mlt.t[mst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1); + cbt = (spos -= obtr) >> 3; + ost = + oct.t[ost] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1); + if(off > 3){ + st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off -= 3; + } + else{ + var idx = off - (ll != 0); + if(idx){ + off = idx == 3 ? st.o[0] - 1 : st.o[idx]; + if(idx > 1) st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off; + } + else + off = st.o[0]; + } + for(var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i]; + oubt += ll, spl += ll; + var stin = oubt - off; + if(stin < 0){ + var len = - stin, bs = st.e + stin; + if(len > ml) len = ml; + for(var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i]; + oubt += len, ml -= len, stin = 0; + } + for(var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i]; + oubt += ml; + } + if(oubt != spl) + while(spl < buf.length) buf[oubt++] = buf[spl++]; + else + oubt = buf.length; + if(out) st.y += oubt; else buf = slc(buf, 0, oubt); + } + else if(out){ + st.y += lss; + if(spl) for(var i = 0; i < lss; ++i) buf[i] = buf[spl + i]; + } + else if(spl) buf = slc(buf, spl); + st.b = ebt; + return buf; + } + err(2); + } + function cct(bufs, ol){ + if(bufs.length == 1) return bufs[0]; + var buf = new u8(ol); + for(var i = 0, b = 0; i < bufs.length; ++i){ + var chk = bufs[i]; + buf.set(chk, b); + b += chk.length; + } + return buf; + } + return function(dat, buf){ + var bt = 0, bufs = [], nb = + ! buf, ol = 0; + for(; dat.length;){ + var st = rzfh(dat, nb || buf); + if(typeof st == "object"){ + if(nb){ + buf = null; + if(st.w.length == st.u){bufs.push(buf = st.w); ol += st.u;} + } + else{bufs.push(buf); st.e = 0;} + for(; ! st.l;){ + var blk = rzb(dat, st, buf); + if(! blk) err(5); + if(buf) + st.e = st.y; + else{ + bufs.push(blk); + ol += blk.length; + cpw(st.w, 0, blk.length); + st.w.set(blk, st.w.length - blk.length); + } + } + bt = st.b + st.c * 4; + } + else + bt = st; + dat = dat.subarray(bt); + } + return cct(bufs, ol);}; + } + (); + function caml_float_of_bytes(a){ + return caml_int64_float_of_bits(caml_int64_of_bytes(a)); + } + function caml_input_value_from_reader(reader, ofs){ + function readvlq(overflow){ + var c = reader.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = reader.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + var magic = reader.read32u(); + switch(magic){ + case 0x8495A6BE: + var + header_len = 20, + compressed = 0, + data_len = reader.read32u(), + uncompressed_data_len = data_len, + num_objects = reader.read32u(), + _size_32 = reader.read32u(), + _size_64 = reader.read32u(); + break; + case 0x8495A6BD: + var + header_len = reader.read8u() & 0x3F, + compressed = 1, + overflow = [false], + data_len = readvlq(overflow), + uncompressed_data_len = readvlq(overflow), + num_objects = readvlq(overflow), + _size_32 = readvlq(overflow), + _size_64 = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on a 32-bit platform"); + break; + default: + caml_failwith("caml_input_value_from_reader: bad object"); break; + } + var + stack = [], + intern_obj_table = num_objects > 0 ? [] : null, + obj_counter = 0; + function intern_rec(reader){ + var code = reader.read8u(); + if(code >= 0x40) + if(code >= 0x80){ + var tag = code & 0xF, size = code >> 4 & 0x7, v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + } + else + return code & 0x3F; + else if(code >= 0x20){ + var len = code & 0x1F, v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + } + else + switch(code){ + case 0x00: + return reader.read8s(); + case 0x01: + return reader.read16s(); + case 0x02: + return reader.read32s(); + case 0x03: + caml_failwith("input_value: integer too large"); break; + case 0x04: + var offset = reader.read8u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x05: + var offset = reader.read16u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x06: + var offset = reader.read32u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x08: + var + header = reader.read32u(), + tag = header & 0xFF, + size = header >> 10, + v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + case 0x13: + caml_failwith("input_value: data block too large"); break; + case 0x09: + var len = reader.read8u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0A: + var len = reader.read32u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0C: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[7 - i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0B: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0E: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0D: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x07: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0F: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x10: + case 0x11: + caml_failwith("input_value: code pointer"); break; + case 0x12: + case 0x18: + case 0x19: + var c, s = ""; + while((c = reader.read8u()) != 0) s += String.fromCharCode(c); + var ops = caml_custom_ops[s], expected_size; + if(! ops) + caml_failwith("input_value: unknown custom block identifier"); + switch(code){ + case 0x12: break; + case 0x19: + if(! ops.fixed_length) + caml_failwith("input_value: expected a fixed-size custom block"); + expected_size = ops.fixed_length; + break; + case 0x18: + expected_size = reader.read32u(); + reader.read32s(); + reader.read32s(); + break; + } + var + old_pos = reader.i, + size = [0], + v = ops.deserialize(reader, size); + if(expected_size != undefined) + if(expected_size != size[0]) + caml_failwith + ("input_value: incorrect length of serialized custom block"); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + default: caml_failwith("input_value: ill-formed message"); + } + } + if(compressed) + var + data = reader.readuint8array(data_len), + res = new Uint8Array(uncompressed_data_len), + res = zstd_decompress(data, res), + reader = new UInt8ArrayReader(res, 0); + var res = intern_rec(reader); + while(stack.length > 0){ + var size = stack.pop(), v = stack.pop(), d = v.length; + if(d < size) stack.push(v, size); + v[d] = intern_rec(reader); + } + if(typeof ofs != "number") ofs[0] = reader.i; + return res; + } + function caml_string_of_bytes(s){ + s.t & 6 && caml_convert_string_to_bytes(s); + return caml_string_of_jsbytes(s.c); + } + function caml_input_value_from_bytes(s, ofs){ + var + reader = + new + MlStringReader + (caml_string_of_bytes(s), typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_input_value(chanid){ + var + chan = caml_ml_channels[chanid], + header = new Uint8Array(caml_marshal_header_size); + function block(buffer, offset, n){ + var r = 0; + while(r < n){ + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) break; + buffer[offset + r] = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + r++; + } + return r; + } + var r = block(header, 0, caml_marshal_header_size); + if(r == 0) + caml_raise_end_of_file(); + else if(r < caml_marshal_header_size) + caml_failwith("input_value: truncated object"); + var + len = caml_marshal_data_size(caml_bytes_of_array(header), 0), + buf = new Uint8Array(len + caml_marshal_header_size); + buf.set(header, 0); + var r = block(buf, caml_marshal_header_size, len); + if(r < len) + caml_failwith("input_value: truncated object " + r + " " + len); + var + offset = [0], + res = caml_input_value_from_bytes(caml_bytes_of_array(buf), offset); + chan.offset = chan.offset + offset[0]; + return res; + } + function caml_input_value_to_outside_heap(c){return caml_input_value(c);} + function caml_atomic_cas(ref, o, n){ + if(ref[1] === o){ref[1] = n; return 1;} + return 0; + } + function caml_copysign_float(x, y){ + if(y == 0) y = 1 / y; + x = Math.abs(x); + return y < 0 ? - x : x; + } + function caml_gr_set_text_size(size){ + var s = caml_gr_state_get(); + s.text_size = size; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_atomic_load(ref){return ref[1];} + function caml_MD5Final(ctx){ + var in_buf = ctx.len & 0x3f; + ctx.b8[in_buf] = 0x80; + in_buf++; + if(in_buf > 56){ + for(var j = in_buf; j < 64; j++) ctx.b8[j] = 0; + caml_MD5Transform(ctx.w, ctx.b32); + for(var j = 0; j < 56; j++) ctx.b8[j] = 0; + } + else + for(var j = in_buf; j < 56; j++) ctx.b8[j] = 0; + ctx.b32[14] = ctx.len << 3; + ctx.b32[15] = ctx.len >> 29 & 0x1FFFFFFF; + caml_MD5Transform(ctx.w, ctx.b32); + var t = new Uint8Array(16); + for(var i = 0; i < 4; i++) + for(var j = 0; j < 4; j++) t[i * 4 + j] = ctx.w[i] >> 8 * j & 0xFF; + return t; + } + function caml_md5_bytes(s, ofs, len){ + var ctx = caml_MD5Init(), a = caml_uint8_array_of_bytes(s); + caml_MD5Update(ctx, a.subarray(ofs, ofs + len), len); + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_ba_set_generic(ba, i, v){ + ba.set(ba.offset(caml_js_from_array(i)), v); + return 0; + } + function caml_ml_condition_wait(t, mutext){return 0;} + function caml_string_lessequal(s1, s2){return s1 <= s2 ? 1 : 0;} + function caml_string_greaterequal(s1, s2){return caml_string_lessequal(s2, s1); + } + function caml_nextafter_float(x, y){ + if(isNaN(x) || isNaN(y)) return NaN; + if(x == y) return y; + if(x == 0) return y < 0 ? - Math.pow(2, - 1074) : Math.pow(2, - 1074); + var bits = caml_int64_bits_of_float(x), one = caml_int64_of_int32(1); + if(x < y == x > 0) + bits = caml_int64_add(bits, one); + else + bits = caml_int64_sub(bits, one); + return caml_int64_float_of_bits(bits); + } + function caml_gr_size_y(){var s = caml_gr_state_get(); return s.height;} + function caml_pos_in(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset - (chan.buffer_max - chan.buffer_curr) | 0; + } + function caml_ml_pos_in(chanid){return caml_pos_in(chanid);} + function caml_int64_and(x, y){return x.and(y);} + function Base_int_math_int64_pow_stub(base, exponent){ + var + one = caml_int64_create_lo_hi(1, 0), + mul = [one, base, one, one], + res = one; + while(! caml_int64_is_zero(exponent)){ + mul[1] = caml_int64_mul(mul[1], mul[3]); + mul[2] = caml_int64_mul(mul[1], mul[1]); + mul[3] = caml_int64_mul(mul[2], mul[1]); + res = caml_int64_mul(res, mul[caml_int64_lo32(exponent) & 3]); + exponent = caml_int64_shift_right_unsigned(exponent, 2); + } + return res; + } + function caml_sys_const_word_size(){return 32;} + function caml_runtime_events_pause(){return 0;} + function caml_unix_unlink(name){ + var root = resolve_fs_device(name); + if(! root.device.unlink) + caml_failwith("caml_unix_unlink: not implemented"); + return root.device.unlink(root.rest, true); + } + function caml_sys_open_for_node(fd, flags){ + if(flags.name) + try{ + var fs = require("fs"), fd2 = fs.openSync(flags.name, "rs"); + return new MlNodeFd(fd2, flags); + } + catch(e){} + return new MlNodeFd(fd, flags); + } + function MlFakeFd_out(fd, flags){ + MlFakeFile.call(this, caml_create_bytes(0)); + this.log = function(s){return 0;}; + if(fd == 1 && typeof console.log == "function") + this.log = console.log; + else if(fd == 2 && typeof console.error == "function") + this.log = console.error; + else if(typeof console.log == "function") this.log = console.log; + this.flags = flags; + } + MlFakeFd_out.prototype.length = function(){return 0;}; + MlFakeFd_out.prototype.write = + function(offset, buf, pos, len){ + if(this.log){ + if + (len > 0 && pos >= 0 && pos + len <= buf.length + && buf[pos + len - 1] == 10) + len--; + var src = caml_create_bytes(len); + caml_blit_bytes(caml_bytes_of_array(buf), pos, src, 0, len); + this.log(src.toUtf16()); + return 0; + } + caml_raise_sys_error(this.fd + ": file descriptor already closed"); + }; + MlFakeFd_out.prototype.read = + function(offset, buf, pos, len){ + caml_raise_sys_error(this.fd + ": file descriptor is write only"); + }; + MlFakeFd_out.prototype.close = function(){this.log = undefined;}; + function caml_sys_open_internal(file, idx){ + if(idx == undefined) idx = caml_sys_fds.length; + caml_sys_fds[idx] = file; + return idx | 0; + } + function caml_sys_open(name, flags, _perms){ + var f = {}; + while(flags){ + switch(flags[1]){ + case 0: + f.rdonly = 1; break; + case 1: + f.wronly = 1; break; + case 2: + f.append = 1; break; + case 3: + f.create = 1; break; + case 4: + f.truncate = 1; break; + case 5: + f.excl = 1; break; + case 6: + f.binary = 1; break; + case 7: + f.text = 1; break; + case 8: + f.nonblock = 1; break; + } + flags = flags[2]; + } + if(f.rdonly && f.wronly) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_text and Open_binary are not compatible"); + var root = resolve_fs_device(name), file = root.device.open(root.rest, f); + return caml_sys_open_internal(file, undefined); + } + (function(){ + function file(fd, flags){ + return fs_node_supported() + ? caml_sys_open_for_node(fd, flags) + : new MlFakeFd_out(fd, flags); + } + caml_sys_open_internal + (file(0, {rdonly: 1, altname: "/dev/stdin", isCharacterDevice: true}), + 0); + caml_sys_open_internal + (file(1, {buffered: 2, wronly: 1, isCharacterDevice: true}), 1); + caml_sys_open_internal + (file(2, {buffered: 2, wronly: 1, isCharacterDevice: true}), 2); + } + ()); + function caml_string_get(s, i){ + if(i >>> 0 >= caml_ml_string_length(s)) caml_string_bound_error(); + return caml_string_unsafe_get(s, i); + } + var + re_match = + function(){ + var + re_word_letters = + [0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0x03, + 0xFE, + 0xFF, + 0xFF, + 0x87, + 0xFE, + 0xFF, + 0xFF, + 0x07, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0xFF, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0x7F, + 0xFF], + opcodes = + {CHAR: 0, + CHARNORM: 1, + STRING: 2, + STRINGNORM: 3, + CHARCLASS: 4, + BOL: 5, + EOL: 6, + WORDBOUNDARY: 7, + BEGGROUP: 8, + ENDGROUP: 9, + REFGROUP: 10, + ACCEPT: 11, + SIMPLEOPT: 12, + SIMPLESTAR: 13, + SIMPLEPLUS: 14, + GOTO: 15, + PUSHBACK: 16, + SETMARK: 17, + CHECKPROGRESS: 18}; + function is_word_letter(c){ + return re_word_letters[c >> 3] >> (c & 7) & 1; + } + function in_bitset(s, i){ + return caml_string_get(s, i >> 3) >> (i & 7) & 1; + } + function re_match_impl(re, s, pos, partial){ + var + prog = caml_js_from_array(re[1]), + cpool = caml_js_from_array(re[2]), + normtable = caml_jsbytes_of_string(re[3]), + numgroups = re[4] | 0, + numregisters = re[5] | 0, + startchars = re[6] | 0, + s = caml_uint8_array_of_string(s), + pc = 0, + quit = false, + stack = [], + groups = new Array(numgroups), + re_register = new Array(numregisters); + for(var i = 0; i < groups.length; i++) + groups[i] = {start: - 1, end: - 1}; + groups[0].start = pos; + function backtrack(){ + while(stack.length){ + var item = stack.pop(); + if(item.undo) + item.undo.obj[item.undo.prop] = item.undo.value; + else if(item.pos){pc = item.pos.pc; pos = item.pos.txt; return;} + } + quit = true; + } + function push(item){stack.push(item);} + function accept(){ + groups[0].end = pos; + var result = new Array(1 + groups.length * 2); + result[0] = 0; + for(var i = 0; i < groups.length; i++){ + var g = groups[i]; + if(g.start < 0 || g.end < 0) g.start = g.end = - 1; + result[2 * i + 1] = g.start; + result[2 * i + 1 + 1] = g.end; + } + return result; + } + function prefix_match(){ + if(partial) return accept(); else backtrack(); + } + while(! quit){ + var + op = prog[pc] & 0xff, + sarg = prog[pc] >> 8, + uarg = sarg & 0xff, + c = s[pos], + group; + pc++; + switch(op){ + case opcodes.CHAR: + if(pos === s.length){prefix_match(); break;} + if(c === uarg) pos++; else backtrack(); + break; + case opcodes.CHARNORM: + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === uarg) pos++; else backtrack(); + break; + case opcodes.STRING: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(c === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.STRINGNORM: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.CHARCLASS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) pos++; else backtrack(); + break; + case opcodes.BOL: + if(pos > 0 && s[pos - 1] != 10) backtrack(); break; + case opcodes.EOL: + if(pos < s.length && s[pos] != 10) backtrack(); break; + case opcodes.WORDBOUNDARY: + if(pos == 0){ + if(pos === s.length){prefix_match(); break;} + if(is_word_letter(s[0])) break; + backtrack(); + } + else if(pos === s.length){ + if(is_word_letter(s[pos - 1])) break; + backtrack(); + } + else{ + if(is_word_letter(s[pos - 1]) != is_word_letter(s[pos])) break; + backtrack(); + } + break; + case opcodes.BEGGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "start", value: group.start}}); + group.start = pos; + break; + case opcodes.ENDGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "end", value: group.end}}); + group.end = pos; + break; + case opcodes.REFGROUP: + group = groups[uarg]; + if(group.start < 0 || group.end < 0){backtrack(); break;} + for(var i = group.start; i < group.end; i++){ + if(pos === s.length){prefix_match(); break;} + if(s[i] != s[pos]){backtrack(); break;} + pos++; + } + break; + case opcodes.SIMPLEOPT: + if(in_bitset(cpool[uarg], c)) pos++; break; + case opcodes.SIMPLESTAR: + while(in_bitset(cpool[uarg], c)) c = s[++pos]; break; + case opcodes.SIMPLEPLUS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) + do c = s[++pos];while(in_bitset(cpool[uarg], c)); + else + backtrack(); + break; + case opcodes.ACCEPT: return accept(); + case opcodes.GOTO: + pc = pc + sarg; break; + case opcodes.PUSHBACK: + push({pos: {pc: pc + sarg, txt: pos}}); break; + case opcodes.SETMARK: + push + ({undo: {obj: re_register, prop: uarg, value: re_register[uarg]}}); + re_register[uarg] = pos; + break; + case opcodes.CHECKPROGRESS: + if(re_register[uarg] === pos) backtrack(); break; + default: throw new Error("Invalid bytecode"); + } + } + return 0; + } + return re_match_impl; + } + (); + function re_search_backward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_backward"); + while(pos >= 0){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos--; + } + return [0]; + } + function caml_js_from_string(s){return caml_jsstring_of_string(s);} + function caml_ba_sub(ba, ofs, len){ + var changed_dim, mul = 1; + if(ba.layout == 0){ + for(var i = 1; i < ba.dims.length; i++) mul = mul * ba.dims[i]; + changed_dim = 0; + } + else{ + for(var i = 0; i < ba.dims.length - 1; i++) mul = mul * ba.dims[i]; + changed_dim = ba.dims.length - 1; + ofs = ofs - 1; + } + if(ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim]) + caml_invalid_argument("Bigarray.sub: bad sub-array"); + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) new_dims[i] = ba.dims[i]; + new_dims[changed_dim] = len; + mul *= caml_ba_get_size_per_element(ba.kind); + var new_data = ba.data.subarray(ofs * mul, (ofs + len) * mul); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dims, new_data); + } + function caml_gc_full_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_ml_mutex_try_lock(t){ + if(! t.locked){t.locked = true; return 1;} + return 0; + } + function caml_bytes_set32(s, i, i32){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b4 = 0xFF & i32 >> 24, + b3 = 0xFF & i32 >> 16, + b2 = 0xFF & i32 >> 8, + b1 = 0xFF & i32; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + caml_bytes_unsafe_set(s, i + 2, b3); + caml_bytes_unsafe_set(s, i + 3, b4); + return 0; + } + function caml_gr_sigio_signal(){return 0;} + function caml_ba_uint8_set32(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + ba.set(ofs + 2, v >>> 16 & 0xff); + ba.set(ofs + 3, v >>> 24 & 0xff); + return 0; + } + function caml_sys_const_ostype_unix(){return os_type == "Unix" ? 1 : 0;} + function caml_unix_gmtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000); + return [0, + d.getUTCSeconds(), + d.getUTCMinutes(), + d.getUTCHours(), + d.getUTCDate(), + d.getUTCMonth(), + d.getUTCFullYear() - 1900, + d.getUTCDay(), + doy, + false | 0]; + } + function caml_signbit_float(x){if(x == 0) x = 1 / x; return x < 0 ? 1 : 0;} + function caml_gr_current_x(){var s = caml_gr_state_get(); return s.x;} + function caml_gr_set_line_width(w){ + var s = caml_gr_state_get(); + s.line_width = w; + s.context.lineWidth = w; + return 0; + } + function caml_gr_set_font(f){ + var s = caml_gr_state_get(); + s.font = f; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_gr_set_color(color){ + var s = caml_gr_state_get(); + function convert(number){ + var str = "" + number.toString(16); + while(str.length < 2) str = "0" + str; + return str; + } + var r = color >> 16 & 0xff, g = color >> 8 & 0xff, b = color >> 0 & 0xff; + s.color = color; + var c_str = "#" + convert(r) + convert(g) + convert(b); + s.context.fillStyle = c_str; + s.context.strokeStyle = c_str; + return 0; + } + function caml_gr_moveto(x, y){ + var s = caml_gr_state_get(); + s.x = x; + s.y = y; + return 0; + } + function caml_gr_resize_window(w, h){ + var s = caml_gr_state_get(); + s.width = w; + s.height = h; + s.canvas.width = w; + s.canvas.height = h; + return 0; + } + function caml_gr_state_init(){ + caml_gr_moveto(caml_gr_state.x, caml_gr_state.y); + caml_gr_resize_window(caml_gr_state.width, caml_gr_state.height); + caml_gr_set_line_width(caml_gr_state.line_width); + caml_gr_set_text_size(caml_gr_state.text_size); + caml_gr_set_font(caml_gr_state.font); + caml_gr_set_color(caml_gr_state.color); + caml_gr_set_window_title(caml_gr_state.title); + caml_gr_state.context.textBaseline = "bottom"; + } + function caml_ba_kind_of_typed_array(ta){ + var kind; + if(ta instanceof Float32Array) + kind = 0; + else if(ta instanceof Float64Array) + kind = 1; + else if(ta instanceof Int8Array) + kind = 2; + else if(ta instanceof Uint8Array) + kind = 3; + else if(ta instanceof Int16Array) + kind = 4; + else if(ta instanceof Uint16Array) + kind = 5; + else if(ta instanceof Int32Array) + kind = 6; + else if(ta instanceof Uint32Array) + kind = 6; + else + caml_invalid_argument("caml_ba_kind_of_typed_array: unsupported kind"); + return kind; + } + function caml_ba_from_typed_array(ta){ + var kind = caml_ba_kind_of_typed_array(ta); + return caml_ba_create_unsafe(kind, 0, [ta.length], ta); + } + function caml_ml_seek_out(chanid, pos){return caml_seek_out(chanid, pos);} + function caml_js_typeof(o){return typeof o;} + function caml_string_hash(h, v){ + var h = caml_hash_mix_string(h, v), h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function caml_restore_raw_backtrace(exn, bt){return 0;} + function Base_int_math_int32_ctz(x){ + if(x === 0) return 32; + var n = 1; + if((x & 0x0000FFFF) === 0){n = n + 16; x = x >> 16;} + if((x & 0x000000FF) === 0){n = n + 8; x = x >> 8;} + if((x & 0x0000000F) === 0){n = n + 4; x = x >> 4;} + if((x & 0x00000003) === 0){n = n + 2; x = x >> 2;} + return n - (x & 1); + } + function Base_int_math_nativeint_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_gr_lineto(x, y){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(s.x, s.height - s.y); + s.context.lineTo(x, s.height - y); + s.context.stroke(); + s.x = x; + s.y = y; + return 0; + } + function caml_js_function_arity(f){return f.l >= 0 ? f.l : f.l = f.length;} + function caml_js_wrap_meth_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f) - 1, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_dim_3(ba){return caml_ba_dim(ba, 2);} + function caml_is_special_exception(exn){ + switch(exn[2]){case - 8:case - 11:case - 12: return 1;default: return 0; + } + } + function caml_format_exception(exn){ + var r = ""; + if(exn[0] == 0){ + r += exn[1][1]; + if + (exn.length == 3 && exn[2][0] == 0 && caml_is_special_exception(exn[1])) + var bucket = exn[2], start = 1; + else + var start = 2, bucket = exn; + r += "("; + for(var i = start; i < bucket.length; i++){ + if(i > start) r += ", "; + var v = bucket[i]; + if(typeof v == "number") + r += v.toString(); + else if(v instanceof MlBytes) + r += '"' + v.toString() + '"'; + else if(typeof v == "string") + r += '"' + v.toString() + '"'; + else + r += "_"; + } + r += ")"; + } + else if(exn[0] == 248) r += exn[1]; + return r; + } + function caml_fatal_uncaught_exception(err){ + if(err instanceof Array && (err[0] == 0 || err[0] == 248)){ + var handler = caml_named_value("Printexc.handle_uncaught_exception"); + if(handler) + caml_callback(handler, [err, false]); + else{ + var + msg = caml_format_exception(err), + at_exit = caml_named_value("Pervasives.do_at_exit"); + if(at_exit) caml_callback(at_exit, [0]); + console.error("Fatal error: exception " + msg + "\n"); + if(err.js_error) throw err.js_error; + } + } + else + throw err; + } + function caml_ephe_check_data(x){ + return x[caml_ephe_data_offset] === undefined ? 0 : 1; + } + function caml_bytes_get16(s, i){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_obj_make_forward(b, v){b[0] = 250; b[1] = v; return 0;} + function caml_js_from_bool(x){return ! ! x;} + function caml_ml_set_channel_name(chanid, name){ + var chan = caml_ml_channels[chanid]; + chan.name = name; + return 0; + } + function caml_exp2_float(x){return Math.pow(2, x);} + function caml_gr_close_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = 0; + s.canvas.height = 0; + return 0; + } + var Base_internalhash_fold_int = caml_hash_mix_int; + function caml_ml_domain_cpu_relax(unit){return 0;} + function caml_create_string(len){caml_invalid_argument("String.create");} + function Base_int_math_nativeint_clz(x){return Base_int_math_int32_clz(x);} + function caml_ml_input_block(chanid, ba, i, l){ + var + chan = caml_ml_channels[chanid], + n = l, + avail = chan.buffer_max - chan.buffer_curr; + if(l <= avail){ + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + l), i); + chan.buffer_curr += l; + } + else if(avail > 0){ + ba.set + (chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + avail), i); + chan.buffer_curr += avail; + n = avail; + } + else{ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + var avail = chan.buffer_max - chan.buffer_curr; + if(n > avail) n = avail; + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + n), i); + chan.buffer_curr += n; + } + return n | 0; + } + function caml_md5_chan(chanid, toread){ + var ctx = caml_MD5Init(), buffer = new Uint8Array(4096); + if(toread < 0) + while(true){ + var read = caml_ml_input_block(chanid, buffer, 0, buffer.length); + if(read == 0) break; + caml_MD5Update(ctx, buffer.subarray(0, read), read); + } + else + while(toread > 0){ + var + read = + caml_ml_input_block + (chanid, buffer, 0, toread > buffer.length ? buffer.length : toread); + if(read == 0) caml_raise_end_of_file(); + caml_MD5Update(ctx, buffer.subarray(0, read), read); + toread -= read; + } + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_atanh_float(x){return Math.atanh(x);} + function caml_ml_condition_signal(t){return 0;} + function caml_unix_findnext(dir_handle){return caml_unix_readdir(dir_handle); + } + function caml_ml_output_bytes(chanid, buffer, offset, len){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) + caml_raise_sys_error("Cannot output to a closed channel"); + var buffer = caml_uint8_array_of_bytes(buffer); + buffer = buffer.subarray(offset, offset + len); + if(chan.buffer_curr + buffer.length > chan.buffer.length){ + var b = new Uint8Array(chan.buffer_curr + buffer.length); + b.set(chan.buffer); + chan.buffer = b; + } + switch(chan.buffered){ + case 0: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + caml_ml_flush(chanid); + break; + case 1: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + break; + case 2: + var id = buffer.lastIndexOf(10); + if(id < 0){ + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + } + else{ + chan.buffer.set(buffer.subarray(0, id + 1), chan.buffer_curr); + chan.buffer_curr += id + 1; + caml_ml_flush(chanid); + chan.buffer.set(buffer.subarray(id + 1), chan.buffer_curr); + chan.buffer_curr += buffer.length - id - 1; + } + break; + } + return 0; + } + function caml_ml_output(chanid, buffer, offset, len){ + return caml_ml_output_bytes + (chanid, caml_bytes_of_string(buffer), offset, len); + } + function caml_ml_domain_id(unit){return caml_domain_id;} + function caml_ephe_get_data(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, x[caml_ephe_data_offset]]; + } + function caml_xmlhttprequest_create(unit){ + if(typeof globalThis.XMLHttpRequest !== "undefined") + try{return new globalThis.XMLHttpRequest();}catch(e){} + if(typeof globalThis.activeXObject !== "undefined"){ + try{return new globalThis.activeXObject("Msxml2.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Msxml3.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Microsoft.XMLHTTP");}catch(e){} + } + caml_failwith("Cannot create a XMLHttpRequest"); + } + function caml_trampoline_return(f, args){return {joo_tramp: f, joo_args: args}; + } + function caml_ml_is_buffered(chanid){ + return caml_ml_channels[chanid].buffered ? 1 : 0; + } + function Base_int_math_int64_clz(x){ + var n = 64, y; + y = caml_int64_shift_right_unsigned(x, 32); + if(! caml_int64_is_zero(y)){n = n - 32; x = y;} + y = caml_int64_shift_right_unsigned(x, 16); + if(! caml_int64_is_zero(y)){n = n - 16; x = y;} + y = caml_int64_shift_right_unsigned(x, 8); + if(! caml_int64_is_zero(y)){n = n - 8; x = y;} + y = caml_int64_shift_right_unsigned(x, 4); + if(! caml_int64_is_zero(y)){n = n - 4; x = y;} + y = caml_int64_shift_right_unsigned(x, 2); + if(! caml_int64_is_zero(y)){n = n - 2; x = y;} + y = caml_int64_shift_right_unsigned(x, 1); + if(! caml_int64_is_zero(y)) return n - 2; + return n - caml_int64_to_int32(x); + } + function caml_array_append(a1, a2){ + var l1 = a1.length, l2 = a2.length, l = l1 + l2 - 1, a = new Array(l); + a[0] = 0; + var i = 1, j = 1; + for(; i < l1; i++) a[i] = a1[i]; + for(; i < l; i++, j++) a[i] = a2[j]; + return a; + } + function caml_unix_gettimeofday(){return new Date().getTime() / 1000;} + function caml_unix_time(){return Math.floor(caml_unix_gettimeofday());} + function caml_ml_set_channel_refill(chanid, f){ + caml_ml_channels[chanid].refill = f; + return 0; + } + function caml_runtime_events_create_cursor(target){return {};} + function caml_fill_bytes(s, i, l, c){ + if(l > 0) + if(i == 0 && (l >= s.l || s.t == 2 && l >= s.c.length)) + if(c == 0){ + s.c = ""; + s.t = 2; + } + else{ + s.c = caml_str_repeat(l, String.fromCharCode(c)); + s.t = l == s.l ? 0 : 2; + } + else{ + if(s.t != 4) caml_convert_bytes_to_array(s); + for(l += i; i < l; i++) s.c[i] = c; + } + return 0; + } + function caml_js_expr(s){ + console.error("caml_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_ml_runtime_warnings_enabled(_unit){return caml_runtime_warnings; + } + function caml_output_value_to_bytes(v, flags){ + return caml_bytes_of_array(caml_output_val(v, flags)); + } + function caml_eventlog_resume(unit){return 0;} + function caml_md5_string(s, ofs, len){ + return caml_md5_bytes(caml_bytes_of_string(s), ofs, len); + } + function caml_array_of_string(x){return caml_uint8_array_of_string(x);} + function caml_string_equal(s1, s2){if(s1 === s2) return 1; return 0;} + function caml_jsoo_flags_use_js_string(unit){return 1;} + function caml_output_value_to_buffer(s, ofs, len, v, flags){ + var t = caml_output_val(v, flags); + if(t.length > len) caml_failwith("Marshal.to_buffer: buffer overflow"); + caml_blit_bytes(t, 0, s, ofs, t.length); + return 0; + } + function re_replacement_text(repl, groups, orig){ + var + repl = caml_jsbytes_of_string(repl), + len = repl.length, + orig = caml_jsbytes_of_string(orig), + res = "", + n = 0, + cur, + start, + end, + c; + while(n < len){ + cur = repl.charAt(n++); + if(cur != "\\") + res += cur; + else{ + if(n == len) caml_failwith("Str.replace: illegal backslash sequence"); + cur = repl.charAt(n++); + switch(cur){ + case "\\": + res += cur; break; + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + c = + cur; + if(c * 2 >= groups.length - 1) + caml_failwith("Str.replace: reference to unmatched group"); + start = caml_array_get(groups, c * 2); + end = caml_array_get(groups, c * 2 + 1); + if(start == - 1) + caml_failwith("Str.replace: reference to unmatched group"); + res += orig.slice(start, end); + break; + default: res += "\\" + cur; + } + } + } + return caml_string_of_jsbytes(res); + } + function caml_pure_js_expr(s){ + console.error("caml_pure_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_blit_string(a, b, c, d, e){ + caml_blit_bytes(caml_bytes_of_string(a), b, c, d, e); + return 0; + } + function blit_nat(nat1, ofs1, nat2, ofs2, len){ + for(var i = 0; i < len; i++) nat1.data[ofs1 + i] = nat2.data[ofs2 + i]; + return 0; + } + function caml_bigstring_blit_ba_to_bytes(ba1, pos1, bytes2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(pos2 + len > caml_ml_bytes_length(bytes2)) caml_array_bound_error(); + var slice = ba1.data.slice(ofs1, ofs1 + len); + caml_blit_bytes(caml_bytes_of_array(slice), 0, bytes2, pos2, len); + return 0; + } + function caml_unix_stat(name){ + var root = resolve_fs_device(name); + if(! root.device.stat) caml_failwith("caml_unix_stat: not implemented"); + return root.device.stat(root.rest, true); + } + function caml_register_named_value(nm, v){ + caml_named_values[caml_jsbytes_of_string(nm)] = v; + return 0; + } + function jsoo_create_file_extern(name, content){ + if(globalThis.jsoo_create_file) + globalThis.jsoo_create_file(name, content); + else{ + if(! globalThis.caml_fs_tmp) globalThis.caml_fs_tmp = []; + globalThis.caml_fs_tmp.push({name: name, content: content}); + } + return 0; + } + function caml_unix_stat_64(name){ + var r = caml_unix_stat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_to_js_string(s){return caml_jsstring_of_string(s);} + function caml_ml_mutex_lock(t){ + if(t.locked) + caml_failwith("Mutex.lock: mutex already locked. Cannot wait."); + else + t.locked = true; + return 0; + } + function re_search_forward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_forward"); + while(pos <= caml_ml_string_length(s)){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos++; + } + return [0]; + } + function caml_make_vect(len, init){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 0; + for(var i = 1; i < len; i++) b[i] = init; + return b; + } + function caml_ml_seek_in(chanid, pos){return caml_seek_in(chanid, pos);} + function caml_sys_read_directory(name){ + var + root = resolve_fs_device(name), + a = root.device.readdir(root.rest), + l = new Array(a.length + 1); + l[0] = 0; + for(var i = 0; i < a.length; i++) l[i + 1] = caml_string_of_jsbytes(a[i]); + return l; + } + function caml_ml_output_char(chanid, c){ + var s = caml_string_of_jsbytes(String.fromCharCode(c)); + caml_ml_output(chanid, s, 0, 1); + return 0; + } + function caml_sys_const_ostype_win32(){return os_type == "Win32" ? 1 : 0;} + function caml_obj_is_block(x){return + (x instanceof Array);} + function caml_obj_set_raw_field(o, i, v){return o[i + 1] = v;} + function caml_js_var(x){ + var x = caml_jsstring_of_string(x); + if(! x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/)) + console.error + ('caml_js_var: "' + x + + '" is not a valid JavaScript variable. continuing ..'); + return eval(x); + } + function caml_trunc_float(x){return Math.trunc(x);} + function caml_ephe_unset_data(x){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(x[1] instanceof globalThis.FinalizationRegistry) + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].unregister(key); + } + } + x[caml_ephe_data_offset] = undefined; + return 0; + } + function caml_ephe_set_data(x, data){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(! (x[1] instanceof globalThis.FinalizationRegistry)){ + x[1] = + new + globalThis.FinalizationRegistry + (function(){caml_ephe_unset_data(x);}); + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].register(key, undefined, key); + } + } + } + x[caml_ephe_data_offset] = data; + return 0; + } + function caml_ephe_blit_data(src, dst){ + var n = src[caml_ephe_data_offset]; + if(n === undefined) + caml_ephe_unset_data(dst); + else + caml_ephe_set_data(dst, n); + return 0; + } + var Base_internalhash_fold_int64 = caml_hash_mix_int64; + function caml_is_printable(c){return + (c > 31 && c < 127);} + function caml_bytes_lessequal(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c <= s2.c ? 1 : 0; + } + function caml_array_of_bytes(x){return caml_uint8_array_of_bytes(x);} + function caml_equal(x, y){return + (caml_compare_val(x, y, false) == 0);} + function re_partial_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.partial_match"); + var res = re_match(re, s, pos, 1); + return res ? res : [0]; + } + function caml_sys_random_seed(){ + if(globalThis.crypto) + if(typeof globalThis.crypto.getRandomValues === "function"){ + var a = new Uint32Array(1); + globalThis.crypto.getRandomValues(a); + return [0, a[0]]; + } + else if(globalThis.crypto.randomBytes === "function"){ + var buff = globalThis.crypto.randomBytes(4), a = new Uint32Array(buff); + return [0, a[0]]; + } + var now = new Date().getTime(), x = now ^ 0xffffffff * Math.random(); + return [0, x]; + } + var all_finalizers = new globalThis.Set(); + function caml_final_register_called_without_value(cb, a){ + if(globalThis.FinalizationRegistry && a instanceof Object){ + var + x = + new + globalThis.FinalizationRegistry + (function(x){all_finalizers.delete(x); cb(0); return;}); + x.register(a, x); + all_finalizers.add(x); + } + return 0; + } + function caml_ba_get_2(ba, i0, i1){return ba.get(ba.offset([i0, i1]));} + function caml_ba_uint8_set16(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + return 0; + } + function caml_lazy_reset_to_lazy(o){ + caml_obj_update_tag(o, 244, 246); + return 0; + } + function caml_js_delete(o, f){delete o[f]; return 0;} + function caml_int_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + len = caml_ml_string_length(s), + threshold = - 1 >>> 0, + c = i < len ? caml_string_unsafe_get(s, i) : 0, + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = d; + for(i++; i < len; i++){ + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + res = base * res + d; + if(res > threshold) caml_failwith("int_of_string"); + } + if(i != len) caml_failwith("int_of_string"); + res = sign * res; + if(base == 10 && (res | 0) != res) caml_failwith("int_of_string"); + return res | 0; + } + function caml_list_mount_point(){ + var prev = 0; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var old = prev; + prev = [0, caml_string_of_jsbytes(jsoo_mount_point[i].path), old]; + } + return prev; + } + var + caml_marshal_constants = + {PREFIX_SMALL_BLOCK: 0x80, + PREFIX_SMALL_INT: 0x40, + PREFIX_SMALL_STRING: 0x20, + CODE_INT8: 0x00, + CODE_INT16: 0x01, + CODE_INT32: 0x02, + CODE_INT64: 0x03, + CODE_SHARED8: 0x04, + CODE_SHARED16: 0x05, + CODE_SHARED32: 0x06, + CODE_BLOCK32: 0x08, + CODE_BLOCK64: 0x13, + CODE_STRING8: 0x09, + CODE_STRING32: 0x0A, + CODE_DOUBLE_BIG: 0x0B, + CODE_DOUBLE_LITTLE: 0x0C, + CODE_DOUBLE_ARRAY8_BIG: 0x0D, + CODE_DOUBLE_ARRAY8_LITTLE: 0x0E, + CODE_DOUBLE_ARRAY32_BIG: 0x0F, + CODE_DOUBLE_ARRAY32_LITTLE: 0x07, + CODE_CODEPOINTER: 0x10, + CODE_INFIXPOINTER: 0x11, + CODE_CUSTOM: 0x12, + CODE_CUSTOM_LEN: 0x18, + CODE_CUSTOM_FIXED: 0x19}; + function caml_obj_raw_field(o, i){return o[i + 1];} + function caml_js_equals(x, y){return + (x == y);} + function caml_obj_compare_and_swap(x, i, old, n){ + if(x[i + 1] == old){x[i + 1] = n; return 1;} + return 0; + } + function bigstring_to_typed_array(bs){return bs.data;} + function caml_gr_arc_aux(ctx, cx, cy, ry, rx, a1, a2){ + while(a1 > a2) a2 += 360; + a1 /= 180; + a2 /= 180; + var + rot = 0, + xPos, + yPos, + xPos_prev, + yPos_prev, + space = 2, + num = (a2 - a1) * Math.PI * ((rx + ry) / 2) / space | 0, + delta = (a2 - a1) * Math.PI / num, + i = a1 * Math.PI; + for(var j = 0; j <= num; j++){ + xPos = + cx - rx * Math.sin(i) * Math.sin(rot * Math.PI) + + ry * Math.cos(i) * Math.cos(rot * Math.PI); + xPos = xPos.toFixed(2); + yPos = + cy + ry * Math.cos(i) * Math.sin(rot * Math.PI) + + rx * Math.sin(i) * Math.cos(rot * Math.PI); + yPos = yPos.toFixed(2); + if(j == 0) + ctx.moveTo(xPos, yPos); + else if(xPos_prev != xPos || yPos_prev != yPos) ctx.lineTo(xPos, yPos); + xPos_prev = xPos; + yPos_prev = yPos; + i -= delta; + } + return 0; + } + function caml_gr_fill_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.fill(); + return 0; + } + function caml_ba_slice(ba, vind){ + vind = caml_js_from_array(vind); + var num_inds = vind.length, index = [], sub_dims = [], ofs; + if(num_inds > ba.dims.length) + caml_invalid_argument("Bigarray.slice: too many indices"); + if(ba.layout == 0){ + for(var i = 0; i < num_inds; i++) index[i] = vind[i]; + for(; i < ba.dims.length; i++) index[i] = 0; + sub_dims = ba.dims.slice(num_inds); + } + else{ + for(var i = 0; i < num_inds; i++) + index[ba.dims.length - num_inds + i] = vind[i]; + for(var i = 0; i < ba.dims.length - num_inds; i++) index[i] = 1; + sub_dims = ba.dims.slice(0, ba.dims.length - num_inds); + } + ofs = ba.offset(index); + var + size = caml_ba_get_size(sub_dims), + size_per_element = caml_ba_get_size_per_element(ba.kind), + new_data = + ba.data.subarray + (ofs * size_per_element, (ofs + size) * size_per_element); + return caml_ba_create_unsafe(ba.kind, ba.layout, sub_dims, new_data); + } + function caml_js_wrap_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f), args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_kind(ba){return ba.kind;} + function caml_alloc_dummy_infix(){ + return function f(x){return caml_call_gen(f.fun, [x]);}; + } + function caml_js_fun_call(f, a){ + switch(a.length){ + case 1: + return f(); + case 2: + return f(a[1]); + case 3: + return f(a[1], a[2]); + case 4: + return f(a[1], a[2], a[3]); + case 5: + return f(a[1], a[2], a[3], a[4]); + case 6: + return f(a[1], a[2], a[3], a[4], a[5]); + case 7: + return f(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return f(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + return f.apply(null, caml_js_from_array(a)); + } + function caml_gc_major_slice(work){return 0;} + function caml_js_pure_expr(f){return caml_callback(f, [0]);} + function compare_digits_nat(nat1, ofs1, nat2, ofs2){ + if(nat1.data[ofs1] > nat2.data[ofs2]) return 1; + if(nat1.data[ofs1] < nat2.data[ofs2]) return - 1; + return 0; + } + function caml_ml_input(chanid, b, i, l){ + var ba = caml_uint8_array_of_bytes(b); + return caml_ml_input_block(chanid, ba, i, l); + } + function caml_gr_wait_event(_evl){ + caml_failwith + ("caml_gr_wait_event not Implemented: use Graphics_js instead"); + } + function caml_gr_sigio_handler(){return 0;} + function caml_hash_mix_bigstring(h, bs){ + return caml_hash_mix_bytes_arr(h, bs.data); + } + function caml_record_backtrace(b){ + caml_record_backtrace_flag = b; + return 0; + } + function caml_unix_cleanup(){} + function caml_sys_get_config(){ + return [0, caml_string_of_jsbytes(os_type), 32, 0]; + } + function caml_sys_const_backend_type(){ + return [0, caml_string_of_jsbytes("js_of_ocaml")]; + } + function caml_obj_is_shared(x){return 1;} + function caml_ml_out_channels_list(){ + var l = 0; + for(var c = 0; c < caml_ml_channels.length; c++) + if + (caml_ml_channels[c] && caml_ml_channels[c].opened + && caml_ml_channels[c].out) + l = [0, caml_ml_channels[c].fd, l]; + return l; + } + function caml_asinh_float(x){return Math.asinh(x);} + function caml_pos_out(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset + chan.buffer_curr; + } + function bigstring_of_array_buffer(ab){ + var ta = new Uint8Array(ab); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_mod(x, y){if(y == 0) caml_raise_zero_divide(); return x % y;} + function caml_ba_init(){return 0;} + function caml_unix_filedescr_of_fd(x){return x;} + function re_string_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.string_match"); + var res = re_match(re, s, pos, 0); + return res ? res : [0]; + } + function BigStringReader(bs, i){this.s = bs; this.i = i;} + BigStringReader.prototype = + {read8u: function(){return caml_ba_get_1(this.s, this.i++);}, + read8s: function(){return caml_ba_get_1(this.s, this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 8 | caml_ba_get_1(s, i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 24 >> 16 | caml_ba_get_1(s, i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3); + }, + readstr: + function(len){ + var i = this.i, arr = new Array(len); + for(var j = 0; j < len; j++) arr[j] = caml_ba_get_1(this.s, i + j); + this.i = i + len; + return caml_string_of_array(arr); + }, + readuint8array: + function(len){ + var i = this.i, offset = this.offset(i); + this.i = i + len; + return this.s.data.subarray(offset, offset + len); + }}; + function caml_gr_dump_image(im){ + var data = [0]; + for(var i = 0; i < im.height; i++){ + data[i + 1] = [0]; + for(var j = 0; j < im.width; j++){ + var + o = i * (im.width * 4) + j * 4, + r = im.data[o + 0], + g = im.data[o + 1], + b = im.data[o + 2]; + data[i + 1][j + 1] = (r << 16) + (g << 8) + b; + } + } + return data; + } + function caml_ba_get_generic(ba, i){ + var ofs = ba.offset(caml_js_from_array(i)); + return ba.get(ofs); + } + function caml_unix_startup(){} + function caml_get_exception_backtrace(){return 0;} + function caml_format_float(fmt, x){ + function toFixed(x, dp){ + if(Math.abs(x) < 1.0) + return x.toFixed(dp); + else{ + var e = parseInt(x.toString().split("+")[1]); + if(e > 20){ + e -= 20; + x /= Math.pow(10, e); + x += new Array(e + 1).join("0"); + if(dp > 0) x = x + "." + new Array(dp + 1).join("0"); + return x; + } + else + return x.toFixed(dp); + } + } + var s, f = caml_parse_format(fmt), prec = f.prec < 0 ? 6 : f.prec; + if(x < 0 || x == 0 && 1 / x == - Infinity){f.sign = - 1; x = - x;} + if(isNaN(x)){ + s = "nan"; + f.filler = " "; + } + else if(! isFinite(x)){ + s = "inf"; + f.filler = " "; + } + else + switch(f.conv){ + case "e": + var s = x.toExponential(prec), i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + case "f": + s = toFixed(x, prec); break; + case "g": + prec = prec ? prec : 1; + s = x.toExponential(prec - 1); + var j = s.indexOf("e"), exp = + s.slice(j + 1); + if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec){ + var i = j - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1) + s.slice(j); + i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + } + else{ + var p = prec; + if(exp < 0){ + p -= exp + 1; + s = x.toFixed(p); + } + else + while(s = x.toFixed(p), s.length > prec + 1) p--; + if(p){ + var i = s.length - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1); + } + } + break; + } + return caml_finish_formatting(f, s); + } + function caml_mount_autoload(name, f){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")); + jsoo_mount_point.push({path: name, device: new MlFakeDevice(name, f)}); + return 0; + } + function Base_int_math_int_clz(x){return Base_int_math_int32_clz(x);} + function caml_string_lessthan(s1, s2){return s1 < s2 ? 1 : 0;} + function caml_string_greaterthan(s1, s2){return caml_string_lessthan(s2, s1); + } + function caml_div(x, y){ + if(y == 0) caml_raise_zero_divide(); + return x / y | 0; + } + function caml_obj_dup(x){ + var l = x.length, a = new Array(l); + for(var i = 0; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ephe_get_data_copy(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, caml_obj_dup(x[caml_ephe_data_offset])]; + } + function caml_memprof_start(rate, stack_size, tracker){return 0;} + function caml_sys_get_argv(a){return [0, caml_argv[1], caml_argv];} + function caml_ml_domain_set_name(_name){return 0;} + function caml_js_to_bool(x){return + x;} + function caml_gr_create_image(x, y){ + var s = caml_gr_state_get(); + return s.context.createImageData(x, y); + } + function caml_ephe_get_key_copy(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_copy"); + var y = caml_ephe_get_key(x, i); + if(y === 0) return y; + var z = y[1]; + if(z instanceof Array) return [0, caml_obj_dup(z)]; + return y; + } + function caml_lessthan(x, y){return + (caml_compare_val(x, y, false) < 0);} + function caml_raw_backtrace_next_slot(){return 0;} + function caml_build_symbols(toc){ + var symb; + while(toc) + if(caml_jsstring_of_string(toc[1][1]) == "SYJS"){symb = toc[1][2]; break;} + else + toc = toc[2]; + var r = {}; + if(symb) + for(var i = 1; i < symb.length; i++) + r[caml_jsstring_of_string(symb[i][1])] = symb[i][2]; + return r; + } + function caml_register_global(n, v, name_opt){ + if(name_opt){ + var name = name_opt; + if(globalThis.toplevelReloc) + n = caml_callback(globalThis.toplevelReloc, [name]); + else if(caml_global_data.toc){ + if(! caml_global_data.symbols) + caml_global_data.symbols = caml_build_symbols(caml_global_data.toc); + var nid = caml_global_data.symbols[name]; + if(nid >= 0) + n = nid; + else + caml_failwith("caml_register_global: cannot locate " + name); + } + } + caml_global_data[n + 1] = v; + if(name_opt) caml_global_data[name_opt] = v; + } + function mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3){ + var carry = 0; + for(var i = 0; i < len3; i++) + carry += + mult_digit_nat + (nat1, ofs1 + i, len1 - i, nat2, ofs2, len2, nat3, ofs3 + i); + return carry; + } + function square_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var carry = 0; + carry += add_nat(nat1, ofs1, len1, nat1, ofs1, len1, 0); + carry += mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat2, ofs2, len2); + return carry; + } + function caml_js_from_float(x){return x;} + function caml_floatarray_create(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_gc_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_get_major_credit(n){return 0;} + function caml_sys_modify_argv(arg){caml_argv = arg; return 0;} + var caml_method_cache = []; + function caml_get_public_method(obj, tag, cacheid){ + var meths = obj[1], ofs = caml_method_cache[cacheid]; + if(ofs === undefined) + for(var i = caml_method_cache.length; i < cacheid; i++) + caml_method_cache[i] = 0; + else if(meths[ofs] === tag) return meths[ofs - 1]; + var li = 3, hi = meths[1] * 2 + 1, mi; + while(li < hi){ + mi = li + hi >> 1 | 1; + if(tag < meths[mi + 1]) hi = mi - 2; else li = mi; + } + caml_method_cache[cacheid] = li + 1; + return tag == meths[li + 1] ? meths[li] : 0; + } + function caml_js_get_console(){ + var + c = console, + m = + ["log", + "debug", + "info", + "warn", + "error", + "assert", + "dir", + "dirxml", + "trace", + "group", + "groupCollapsed", + "groupEnd", + "time", + "timeEnd"]; + function f(){} + for(var i = 0; i < m.length; i++) if(! c[m[i]]) c[m[i]] = f; + return c; + } + function caml_sys_unsafe_getenv(name){return caml_sys_getenv(name);} + function caml_ml_open_descriptor_in(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.wronly) caml_raise_sys_error("fd " + fd + " is writeonly"); + var + refill = null, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: false, + buffer_curr: 0, + buffer_max: 0, + buffer: new Uint8Array(65536), + refill: refill}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function bigstring_of_typed_array(ba){ + var + ta = + new + Uint8Array + (ba.buffer, ba.byteOffset, ba.length * ba.BYTES_PER_ELEMENT); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_round_float(x){return Math.round(x);} + function caml_ojs_new_arr(c, a){ + switch(a.length){ + case 0: + return new c(); + case 1: + return new c(a[0]); + case 2: + return new c(a[0], a[1]); + case 3: + return new c(a[0], a[1], a[2]); + case 4: + return new c(a[0], a[1], a[2], a[3]); + case 5: + return new c(a[0], a[1], a[2], a[3], a[4]); + case 6: + return new c(a[0], a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); + } + function F(){return c.apply(this, a);} + F.prototype = c.prototype; + return new F(); + } + function complement_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) + nat.data[ofs + i] = (- 1 >>> 0) - (nat.data[ofs + i] >>> 0); + } + var caml_domain_dls = [0]; + function caml_domain_dls_set(a){caml_domain_dls = a;} + function caml_lazy_read_result(o){ + return caml_obj_tag(o) == 250 ? o[1] : o; + } + var caml_js_regexps = {amp: /&/g, lt: / 1023){ + exp -= 1023; + x *= Math.pow(2, 1023); + if(exp > 1023){exp -= 1023; x *= Math.pow(2, 1023);} + } + if(exp < - 1023){exp += 1023; x *= Math.pow(2, - 1023);} + x *= Math.pow(2, exp); + return x; + } + function caml_gr_state_set(ctx){ + caml_gr_state = ctx; + caml_gr_state_init(); + return 0; + } + function caml_js_wrap_callback_strict(arity, f){ + return function(){ + var + n = arguments.length, + args = new Array(arity), + len = Math.min(arguments.length, arity); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_gc_minor_words(unit){return 0;} + function caml_get_current_callstack(){return [0];} + function land_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] &= nat2.data[ofs2]; return 0; + } + function caml_int64_mod(x, y){return x.mod(y);} + function caml_obj_set_tag(x, tag){x[0] = tag; return 0;} + function caml_int32_bswap(x){ + return (x & 0x000000FF) << 24 | (x & 0x0000FF00) << 8 + | (x & 0x00FF0000) >>> 8 + | (x & 0xFF000000) >>> 24; + } + function caml_ba_set_3(ba, i0, i1, i2, v){ + ba.set(ba.offset([i0, i1, i2]), v); + return 0; + } + function caml_js_instanceof(o, c){return o instanceof c ? 1 : 0;} + function caml_get_major_bucket(n){return 0;} + function nth_digit_nat_native(nat, ofs){return nat.data[ofs];} + function set_digit_nat_native(nat, ofs, digit){nat.data[ofs] = digit; return 0; + } + function caml_string_set64(s, i, i64){caml_failwith("caml_string_set64");} + function caml_gr_state_create(canvas, w, h){ + var context = canvas.getContext("2d"); + return {context: context, + canvas: canvas, + x: 0, + y: 0, + width: w, + height: h, + line_width: 1, + font: caml_string_of_jsbytes("fixed"), + text_size: 26, + color: 0x000000, + title: caml_string_of_jsbytes("")}; + } + function caml_gr_draw_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.stroke(); + return 0; + } + function caml_ba_map_file(vfd, kind, layout, shared, dims, pos){caml_failwith("caml_ba_map_file not implemented"); + } + function caml_ba_map_file_bytecode(argv, argn){ + return caml_ba_map_file + (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); + } + function caml_ba_create_from(data1, data2, jstyp, kind, layout, dims){ + if(data2 || caml_ba_get_size_per_element(kind) == 2) + caml_invalid_argument + ("caml_ba_create_from: use return caml_ba_create_unsafe"); + return caml_ba_create_unsafe(kind, layout, dims, data1); + } + function caml_tanh_float(x){return Math.tanh(x);} + function Base_int_math_int_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_runtime_events_start(){return 0;} + function caml_gr_draw_str(str){ + var s = caml_gr_state_get(), m = s.context.measureText(str), dx = m.width; + s.context.fillText(str, s.x, s.height - s.y); + s.x += dx | 0; + return 0; + } + function caml_gr_draw_string(str){ + caml_gr_draw_str(caml_jsstring_of_string(str)); + return 0; + } + function caml_gr_draw_char(c){ + caml_gr_draw_str(String.fromCharCode(c)); + return 0; + } + function caml_unmount(name){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")), + idx = - 1; + for(var i = 0; i < jsoo_mount_point.length; i++) + if(jsoo_mount_point[i].path == name) idx = i; + if(idx > - 1) jsoo_mount_point.splice(idx, 1); + return 0; + } + function caml_bigstring_blit_ba_to_ba(ba1, pos1, ba2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1), ofs2 = ba2.offset(pos2); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = ba1.data.subarray(ofs1, ofs1 + len); + ba2.data.set(slice, pos2); + return 0; + } + function caml_input_value_from_string(s, ofs){ + var reader = new MlStringReader(s, typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_ml_pos_in_64(chanid){ + return caml_int64_of_float(caml_pos_in(chanid)); + } + function caml_gr_draw_image(im, x, y){ + var s = caml_gr_state_get(); + if(! im.image){ + var canvas = document.createElement("canvas"); + canvas.width = s.width; + canvas.height = s.height; + canvas.getContext("2d").putImageData(im, 0, 0); + var image = new globalThis.Image(); + image.onload = + function(){ + s.context.drawImage(image, x, s.height - im.height - y); + im.image = image; + }; + image.src = canvas.toDataURL("image/png"); + } + else + s.context.drawImage(im.image, x, s.height - im.height - y); + return 0; + } + function caml_register_channel_for_spacetime(_channel){return 0;} + function caml_string_set(s, i, c){caml_failwith("caml_string_set");} + function caml_sys_rmdir(name){ + var root = resolve_fs_device(name); + root.device.rmdir(root.rest); + return 0; + } + function caml_unix_symlink(to_dir, src, dst){ + var src_root = resolve_fs_device(src), dst_root = resolve_fs_device(dst); + if(src_root.device != dst_root.device) + caml_failwith + ("caml_unix_symlink: cannot symlink between two filesystems"); + if(! src_root.device.symlink) + caml_failwith("caml_unix_symlink: not implemented"); + return src_root.device.symlink(to_dir, src_root.rest, dst_root.rest, true); + } + function Base_int_math_int64_ctz(x){ + if(caml_int64_is_zero(x)) return 64; + var n = 1; + function is_zero(x){return caml_int64_is_zero(x);} + function land(x, y){return caml_int64_and(x, y);} + function small_int64(x){return caml_int64_create_lo_mi_hi(x, 0, 0);} + if + (is_zero(land(x, caml_int64_create_lo_mi_hi(0xFFFFFF, 0x0000FF, 0x0000)))){n = n + 32; x = caml_int64_shift_right_unsigned(x, 32);} + if(is_zero(land(x, small_int64(0x00FFFF)))){ + n = n + 16; + x = caml_int64_shift_right_unsigned(x, 16); + } + if(is_zero(land(x, small_int64(0x0000FF)))){ + n = n + 8; + x = caml_int64_shift_right_unsigned(x, 8); + } + if(is_zero(land(x, small_int64(0x00000F)))){ + n = n + 4; + x = caml_int64_shift_right_unsigned(x, 4); + } + if(is_zero(land(x, small_int64(0x000003)))){ + n = n + 2; + x = caml_int64_shift_right_unsigned(x, 2); + } + return n - caml_int64_to_int32(caml_int64_and(x, small_int64(0x000001))); + } + function caml_ml_pos_out(chanid){return caml_pos_out(chanid);} + function Base_caml_exn_is_most_recent_exn(x){return 1;} + function caml_spacetime_enabled(_unit){return 0;} + function caml_bytes_notequal(s1, s2){return 1 - caml_bytes_equal(s1, s2);} + function caml_runtime_parameters(_unit){return caml_string_of_jsbytes("");} + function caml_js_object(a){ + var o = {}; + for(var i = 1; i < a.length; i++){ + var p = a[i]; + o[caml_jsstring_of_string(p[1])] = p[2]; + } + return o; + } + function caml_ba_create(kind, layout, dims_ml){ + var + dims = caml_js_from_array(dims_ml), + data = caml_ba_create_buffer(kind, caml_ba_get_size(dims)); + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_gr_remember_mode(){ + caml_failwith("caml_gr_remember_mode not Implemented"); + } + function Base_internalhash_get_hash_value(seed){ + var h = caml_hash_mix_final(seed); + return h & 0x3FFFFFFF; + } + function caml_fma_float(x, y, z){ + var + SPLIT = Math.pow(2, 27) + 1, + MIN_VALUE = Math.pow(2, - 1022), + EPSILON = Math.pow(2, - 52), + C = 416, + A = Math.pow(2, + C), + B = Math.pow(2, - C); + function multiply(a, b){ + var + at = SPLIT * a, + ahi = at - (at - a), + alo = a - ahi, + bt = SPLIT * b, + bhi = bt - (bt - b), + blo = b - bhi, + p = a * b, + e = ahi * bhi - p + ahi * blo + alo * bhi + alo * blo; + return {p: p, e: e}; + } + function add(a, b){ + var s = a + b, v = s - a, e = a - (s - v) + (b - v); + return {s: s, e: e}; + } + function adjust(x, y){ + return x !== 0 && y !== 0 && SPLIT * x - (SPLIT * x - x) === x + ? x * (1 + (x < 0 ? - 1 : + 1) * (y < 0 ? - 1 : + 1) * EPSILON) + : x; + } + if + (x === 0 || x !== x || x === + (1 / 0) || x === - (1 / 0) || y === 0 + || y !== y + || y === + (1 / 0) + || y === - (1 / 0)) + return x * y + z; + if(z === 0) return x * y; + if(z !== z || z === + (1 / 0) || z === - (1 / 0)) return z; + var scale = 1; + while(Math.abs(x) > A){scale *= A; x *= B;} + while(Math.abs(y) > A){scale *= A; y *= B;} + if(scale === 1 / 0) return x * y * scale; + while(Math.abs(x) < B){scale *= B; x *= A;} + while(Math.abs(y) < B){scale *= B; y *= A;} + if(scale === 0) return z; + var xs = x, ys = y, zs = z / scale; + if(Math.abs(zs) > Math.abs(xs * ys) * 4 / EPSILON) return z; + if(Math.abs(zs) < Math.abs(xs * ys) * EPSILON / 4 * EPSILON / 4) + zs = (z < 0 ? - 1 : + 1) * MIN_VALUE; + var + xy = multiply(xs, ys), + s = add(xy.p, zs), + u = add(xy.e, s.e), + i = add(s.s, u.s), + f = i.s + adjust(i.e, u.e); + if(f === 0) return f; + var fs = f * scale; + if(Math.abs(fs) > MIN_VALUE) return fs; + return fs + adjust(f - fs / scale, i.e) * scale; + } + function caml_recommended_domain_count(unit){return 1;} + function caml_bswap16(x){return (x & 0x00FF) << 8 | (x & 0xFF00) >> 8;} + function caml_ml_set_binary_mode(chanid, mode){ + var chan = caml_ml_channels[chanid]; + chan.file.flags.text = ! mode; + chan.file.flags.binary = mode; + return 0; + } + function caml_final_register(){return 0;} + function caml_gr_draw_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.strokeRect(x, s.height - y, w, - h); + return 0; + } + function caml_string_get16(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 1) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_output_value(chanid, v, flags){ + var s = caml_output_value_to_string(v, flags); + caml_ml_output(chanid, s, 0, caml_ml_string_length(s)); + return 0; + } + function caml_ba_get_3(ba, i0, i1, i2){ + return ba.get(ba.offset([i0, i1, i2])); + } + function caml_ephe_blit_key(a1, i1, a2, i2, len){ + caml_array_blit + (a1, + caml_ephe_key_offset + i1 - 1, + a2, + caml_ephe_key_offset + i2 - 1, + len); + return 0; + } + var caml_initial_time = new Date().getTime() * 0.001; + function caml_sys_time(){ + var now = new Date().getTime(); + return now * 0.001 - caml_initial_time; + } + function caml_sys_time_include_children(b){return caml_sys_time();} + function Base_clear_caml_backtrace_pos(x){return 0;} + function caml_check_bound(array, index){ + if(index >>> 0 >= array.length - 1) caml_array_bound_error(); + return array; + } + function caml_unix_getpwuid(unit){caml_raise_not_found();} + function caml_ba_to_typed_array(ba){return ba.data;} + function caml_domain_dls_get(unit){return caml_domain_dls;} + function caml_bytes_get32(s, i){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1), + b3 = caml_bytes_unsafe_get(s, i + 2), + b4 = caml_bytes_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_frexp_float(x){ + if(x == 0 || ! isFinite(x)) return [0, x, 0]; + var neg = x < 0; + if(neg) x = - x; + var exp = Math.max(- 1023, jsoo_floor_log2(x) + 1); + x *= Math.pow(2, - exp); + while(x < 0.5){x *= 2; exp--;} + while(x >= 1){x *= 0.5; exp++;} + if(neg) x = - x; + return [0, x, exp]; + } + function caml_string_get64(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 7) caml_string_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_string_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + function caml_js_error_option_of_exception(exn){ + if(exn.js_error) return [0, exn.js_error]; + return 0; + } + function caml_ml_pos_out_64(chanid){ + return caml_int64_of_float(caml_pos_out(chanid)); + } + function caml_unix_findclose(dir_handle){return caml_unix_closedir(dir_handle); + } + function caml_gr_close_subwindow(a){ + caml_failwith("caml_gr_close_subwindow not Implemented"); + } + function caml_floatarray_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_get_minor_free(unit){return 0;} + function caml_set_static_env(k, v){ + if(! globalThis.jsoo_static_env) globalThis.jsoo_static_env = {}; + globalThis.jsoo_static_env[k] = v; + return 0; + } + function caml_ba_change_layout(ba, layout){ + if(ba.layout == layout) return ba; + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) + new_dims[i] = ba.dims[ba.dims.length - i - 1]; + return caml_ba_create_unsafe(ba.kind, layout, new_dims, ba.data); + } + function Base_hash_double(d){return caml_hash(1, 1, 0, d);} + function caml_js_new(c, a){ + switch(a.length){ + case 1: + return new c(); + case 2: + return new c(a[1]); + case 3: + return new c(a[1], a[2]); + case 4: + return new c(a[1], a[2], a[3]); + case 5: + return new c(a[1], a[2], a[3], a[4]); + case 6: + return new c(a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return new c(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + function F(){return c.apply(this, caml_js_from_array(a));} + F.prototype = c.prototype; + return new F(); + } + function caml_gr_current_y(){var s = caml_gr_state_get(); return s.y;} + function caml_format_int(fmt, i){ + if(caml_jsbytes_of_string(fmt) == "%d") + return caml_string_of_jsbytes("" + i); + var f = caml_parse_format(fmt); + if(i < 0) if(f.signedconv){f.sign = - 1; i = - i;} else i >>>= 0; + var s = i.toString(f.base); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - s.length; + if(n > 0) s = caml_str_repeat(n, "0") + s; + } + return caml_finish_formatting(f, s); + } + function jsoo_effect_not_supported(){ + caml_failwith("Effect handlers are not supported"); + } + function caml_continuation_use_and_update_handler_noexc + (cont, hval, hexn, heff){ + var stack = caml_continuation_use_noexc(cont); + stack[3] = [0, hval, hexn, heff]; + return stack; + } + function caml_obj_truncate(x, s){ + if(s <= 0 || s + 1 > x.length) caml_invalid_argument("Obj.truncate"); + if(x.length != s + 1) x.length = s + 1; + return 0; + } + function caml_js_to_string(s){return caml_string_of_jsstring(s);} + function is_digit_odd(nat, ofs){if(nat.data[ofs] & 1) return 1; return 0;} + function caml_runtime_variant(_unit){return caml_string_of_jsbytes("");} + function caml_ml_open_descriptor_out(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.rdonly) caml_raise_sys_error("fd " + fd + " is readonly"); + var + buffered = file.flags.buffered !== undefined ? file.flags.buffered : 1, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: true, + buffer_curr: 0, + buffer: new Uint8Array(65536), + buffered: buffered}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function caml_array_concat(l){ + var a = [0]; + while(l !== 0){ + var b = l[1]; + for(var i = 1; i < b.length; i++) a.push(b[i]); + l = l[2]; + } + return a; + } + function caml_gr_open_graph(info){ + var info = caml_jsstring_of_string(info); + function get(name){ + var res = info.match("(^|,) *" + name + " *= *([a-zA-Z0-9_]+) *(,|$)"); + if(res) return res[2]; + } + var specs = []; + if(! (info == "")) specs.push(info); + var target = get("target"); + if(! target) target = ""; + var status = get("status"); + if(! status) specs.push("status=1"); + var w = get("width"); + w = w ? parseInt(w) : 200; + specs.push("width=" + w); + var h = get("height"); + h = h ? parseInt(h) : 200; + specs.push("height=" + h); + var win = globalThis.open("about:blank", target, specs.join(",")); + if(! win) caml_failwith("Graphics.open_graph: cannot open the window"); + var doc = win.document, canvas = doc.createElement("canvas"); + canvas.width = w; + canvas.height = h; + var ctx = caml_gr_state_create(canvas, w, h); + ctx.set_title = function(title){doc.title = title;}; + caml_gr_state_set(ctx); + var body = doc.body; + body.style.margin = "0px"; + body.appendChild(canvas); + return 0; + } + function caml_make_float_vect(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_cbrt_float(x){return Math.cbrt(x);} + function caml_eventlog_pause(unit){return 0;} + function caml_memprof_stop(unit){return 0;} + function caml_greaterequal(x, y){ + return + (caml_compare_val(x, y, false) >= 0); + } + function caml_get_exception_raw_backtrace(){return [0];} + function caml_log1p_float(x){return Math.log1p(x);} + var ms_to_nano = caml_int64_of_int32(1000 * 1000); + function time_now_nanoseconds_since_unix_epoch_or_zero(){ + var ms = Date.now(), ms_i63 = caml_int64_of_float(ms * 2); + return caml_int64_mul(ms_i63, ms_to_nano); + } + function caml_runtime_events_free_cursor(cursor){return 0;} + function caml_lazy_make_forward(v){return [250, v];} + function lor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] |= nat2.data[ofs2]; return 0; + } + function caml_gr_blit_image(im, x, y){ + var + s = caml_gr_state_get(), + im2 = + s.context.getImageData + (x, s.height - im.height - y, im.width, im.height); + for(var i = 0; i < im2.data.length; i += 4){ + im.data[i] = im2.data[i]; + im.data[i + 1] = im2.data[i + 1]; + im.data[i + 2] = im2.data[i + 2]; + im.data[i + 3] = im2.data[i + 3]; + } + return 0; + } + function caml_gr_window_id(a){ + caml_failwith("caml_gr_window_id not Implemented"); + } + function caml_js_on_ie(){ + var ua = globalThis.navigator ? globalThis.navigator.userAgent : ""; + return ua.indexOf("MSIE") != - 1 && ua.indexOf("Opera") != 0; + } + function caml_int64_shift_right(x, s){return x.shift_right(s);} + function caml_ba_layout(ba){return ba.layout;} + function caml_convert_raw_backtrace(){return [0];} + function caml_array_set(array, index, newval){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + array[index + 1] = newval; + return 0; + } + function caml_alloc_stack(hv, hx, hf){return 0;} + function caml_bytes_greaterequal(s1, s2){return caml_bytes_lessequal(s2, s1); + } + function set_digit_nat(nat, ofs, digit){nat.data[ofs] = digit; return 0;} + function caml_bytes_set16(s, i, i16){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var b2 = 0xFF & i16 >> 8, b1 = 0xFF & i16; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + return 0; + } + function caml_gr_doc_of_state(state){ + if(state.canvas.ownerDocument) return state.canvas.ownerDocument; + } + function caml_ml_output_int(chanid, i){ + var + arr = [i >> 24 & 0xFF, i >> 16 & 0xFF, i >> 8 & 0xFF, i & 0xFF], + s = caml_string_of_array(arr); + caml_ml_output(chanid, s, 0, 4); + return 0; + } + function caml_obj_with_tag(tag, x){ + var l = x.length, a = new Array(l); + a[0] = tag; + for(var i = 1; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ml_channel_size(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.file.length(); + } + function caml_raw_backtrace_slot(){ + caml_invalid_argument + ("Printexc.get_raw_backtrace_slot: index out of bounds"); + } + function caml_hexstring_of_float(x, prec, style){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_string_of_jsstring("nan"); + return caml_string_of_jsstring(x > 0 ? "infinity" : "-infinity"); + } + var sign = x == 0 && 1 / x == - Infinity ? 1 : x >= 0 ? 0 : 1; + if(sign) x = - x; + var exp = 0; + if(x == 0) + ; + else if(x < 1) + while(x < 1 && exp > - 1022){x *= 2; exp--;} + else + while(x >= 2){x /= 2; exp++;} + var exp_sign = exp < 0 ? "" : "+", sign_str = ""; + if(sign) + sign_str = "-"; + else + switch(style){ + case 43: + sign_str = "+"; break; + case 32: + sign_str = " "; break; + default: break; + } + if(prec >= 0 && prec < 13){ + var cst = Math.pow(2, prec * 4); + x = Math.round(x * cst) / cst; + } + var x_str = x.toString(16); + if(prec >= 0){ + var idx = x_str.indexOf("."); + if(idx < 0) + x_str += "." + caml_str_repeat(prec, "0"); + else{ + var size = idx + 1 + prec; + if(x_str.length < size) + x_str += caml_str_repeat(size - x_str.length, "0"); + else + x_str = x_str.substr(0, size); + } + } + return caml_string_of_jsstring + (sign_str + "0x" + x_str + "p" + exp_sign + exp.toString(10)); + } + function caml_runtime_events_user_write(event, event_content){return 0;} + function caml_js_wrap_meth_callback_strict(arity, f){ + return function(){ + var args = new Array(arity + 1), len = Math.min(arguments.length, arity); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_unix_readlink(name){ + var root = resolve_fs_device(name); + if(! root.device.readlink) + caml_failwith("caml_unix_readlink: not implemented"); + return root.device.readlink(root.rest, true); + } + function caml_backtrace_status(_unit){ + return caml_record_backtrace_flag ? 1 : 0; + } + function caml_install_signal_handler(){return 0;} + function caml_sys_argv(a){return caml_argv;} + function caml_ba_fill(ba, v){ba.fill(v); return 0;} + function caml_modf_float(x){ + if(isFinite(x)){ + var neg = 1 / x < 0; + x = Math.abs(x); + var i = Math.floor(x), f = x - i; + if(neg){i = - i; f = - f;} + return [0, f, i]; + } + if(isNaN(x)) return [0, NaN, NaN]; + return [0, 1 / x, x]; + } + function caml_gc_get(){return [0, 0, 0, 0, 0, 0, 0, 0, 0];} + function caml_float_compare(x, y){ + if(x === y) return 0; + if(x < y) return - 1; + if(x > y) return 1; + if(x === x) return 1; + if(y === y) return - 1; + return 0; + } + function caml_string_set32(s, i, i32){caml_failwith("caml_string_set32");} + function caml_parse_engine(tables, env, cmd, arg){ + var + ERRCODE = 256, + loop = 6, + testshift = 7, + shift = 8, + shift_recover = 9, + reduce = 10, + READ_TOKEN = 0, + RAISE_PARSE_ERROR = 1, + GROW_STACKS_1 = 2, + GROW_STACKS_2 = 3, + COMPUTE_SEMANTIC_ACTION = 4, + CALL_ERROR_FUNCTION = 5, + env_s_stack = 1, + env_v_stack = 2, + env_symb_start_stack = 3, + env_symb_end_stack = 4, + env_stacksize = 5, + env_stackbase = 6, + env_curr_char = 7, + env_lval = 8, + env_symb_start = 9, + env_symb_end = 10, + env_asp = 11, + env_rule_len = 12, + env_rule_number = 13, + env_sp = 14, + env_state = 15, + env_errflag = 16, + tbl_transl_const = 2, + tbl_transl_block = 3, + tbl_lhs = 4, + tbl_len = 5, + tbl_defred = 6, + tbl_dgoto = 7, + tbl_sindex = 8, + tbl_rindex = 9, + tbl_gindex = 10, + tbl_tablesize = 11, + tbl_table = 12, + tbl_check = 13, + tbl_names_const = 15, + tbl_names_block = 16; + function log(x){ + var s = caml_string_of_jsbytes(x + "\n"); + caml_ml_output(2, s, 0, caml_ml_string_length(s)); + } + function token_name(names, number){ + var str = caml_jsstring_of_string(names); + if(str[0] == "\x00") return ""; + return str.split("\x00")[number]; + } + function print_token(state, tok){ + var token, kind; + if(tok instanceof Array){ + token = token_name(tables[tbl_names_block], tok[0]); + if(typeof tok[1] == "number") + kind = "" + tok[1]; + else if(typeof tok[1] == "string") + kind = tok[1]; + else if(tok[1] instanceof MlBytes) + kind = caml_jsbytes_of_string(tok[1]); + else + kind = "_"; + log("State " + state + ": read token " + token + "(" + kind + ")"); + } + else{ + token = token_name(tables[tbl_names_const], tok); + log("State " + state + ": read token " + token); + } + } + if(! tables.dgoto){ + tables.defred = caml_lex_array(tables[tbl_defred]); + tables.sindex = caml_lex_array(tables[tbl_sindex]); + tables.check = caml_lex_array(tables[tbl_check]); + tables.rindex = caml_lex_array(tables[tbl_rindex]); + tables.table = caml_lex_array(tables[tbl_table]); + tables.len = caml_lex_array(tables[tbl_len]); + tables.lhs = caml_lex_array(tables[tbl_lhs]); + tables.gindex = caml_lex_array(tables[tbl_gindex]); + tables.dgoto = caml_lex_array(tables[tbl_dgoto]); + } + var + res = 0, + n, + n1, + n2, + state1, + sp = env[env_sp], + state = env[env_state], + errflag = env[env_errflag]; + exit: + for(;;) + next: + switch(cmd){ + case 0: + state = 0; errflag = 0; + case 6: + n = tables.defred[state]; + if(n != 0){cmd = reduce; break;} + if(env[env_curr_char] >= 0){cmd = testshift; break;} + res = READ_TOKEN; + break exit; + case 1: + if(arg instanceof Array){ + env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1]; + env[env_lval] = arg[1]; + } + else{ + env[env_curr_char] = tables[tbl_transl_const][arg + 1]; + env[env_lval] = 0; + } + if(caml_parser_trace) print_token(state, arg); + case 7: + n1 = tables.sindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){cmd = shift; break;} + n1 = tables.rindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){ + n = tables.table[n2]; + cmd = reduce; + break; + } + if(errflag <= 0){res = CALL_ERROR_FUNCTION; break exit;} + case 5: + if(errflag < 3){ + errflag = 3; + for(;;){ + state1 = env[env_s_stack][sp + 1]; + n1 = tables.sindex[state1]; + n2 = n1 + ERRCODE; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == ERRCODE){ + if(caml_parser_trace) log("Recovering in state " + state1); + cmd = shift_recover; + break next; + } + else{ + if(caml_parser_trace) log("Discarding state " + state1); + if(sp <= env[env_stackbase]){ + if(caml_parser_trace) log("No more states to discard"); + return RAISE_PARSE_ERROR; + } + sp--; + } + } + } + else{ + if(env[env_curr_char] == 0) return RAISE_PARSE_ERROR; + if(caml_parser_trace) log("Discarding last token read"); + env[env_curr_char] = - 1; + cmd = loop; + break; + } + case 8: + env[env_curr_char] = - 1; if(errflag > 0) errflag--; + case 9: + if(caml_parser_trace) + log("State " + state + ": shift to state " + tables.table[n2]); + state = tables.table[n2]; + sp++; + if(sp >= env[env_stacksize]){res = GROW_STACKS_1; break exit;} + case 2: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = env[env_lval]; + env[env_symb_start_stack][sp + 1] = env[env_symb_start]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end]; + cmd = loop; + break; + case 10: + if(caml_parser_trace) log("State " + state + ": reduce by rule " + n); + var m = tables.len[n]; + env[env_asp] = sp; + env[env_rule_number] = n; + env[env_rule_len] = m; + sp = sp - m + 1; + m = tables.lhs[n]; + state1 = env[env_s_stack][sp]; + n1 = tables.gindex[m]; + n2 = n1 + state1; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == state1) + state = tables.table[n2]; + else + state = tables.dgoto[m]; + if(sp >= env[env_stacksize]){res = GROW_STACKS_2; break exit;} + case 3: + res = COMPUTE_SEMANTIC_ACTION; break exit; + case 4: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = arg; + var asp = env[env_asp]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + if(sp > asp) + env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + cmd = loop; + break; + default: return RAISE_PARSE_ERROR; + } + env[env_sp] = sp; + env[env_state] = state; + env[env_errflag] = errflag; + return res; + } + function caml_jsoo_flags_effects(unit){return 0;} + function caml_update_dummy(x, y){ + if(typeof y === "function"){x.fun = y; return 0;} + if(y.fun){x.fun = y.fun; return 0;} + var i = y.length; + while(i--) x[i] = y[i]; + return 0; + } + function caml_array_fill(array, ofs, len, v){ + for(var i = 0; i < len; i++) array[ofs + i + 1] = v; + return 0; + } + function caml_sys_mkdir(name, perm){ + var root = resolve_fs_device(name); + root.device.mkdir(root.rest, perm); + return 0; + } + function caml_string_notequal(s1, s2){ + return 1 - caml_string_equal(s1, s2); + } + function caml_bytes_greaterthan(s1, s2){return caml_bytes_lessthan(s2, s1); + } + function caml_gr_make_image(arr){ + var + s = caml_gr_state_get(), + h = arr.length - 1, + w = arr[1].length - 1, + im = s.context.createImageData(w, h); + for(var i = 0; i < h; i++) + for(var j = 0; j < w; j++){ + var c = arr[i + 1][j + 1], o = i * (w * 4) + j * 4; + if(c == - 1){ + im.data[o + 0] = 0; + im.data[o + 1] = 0; + im.data[o + 2] = 0; + im.data[o + 3] = 0; + } + else{ + im.data[o + 0] = c >> 16 & 0xff; + im.data[o + 1] = c >> 8 & 0xff; + im.data[o + 2] = c >> 0 & 0Xff; + im.data[o + 3] = 0xff; + } + } + return im; + } + function Base_int_math_int_popcount(v){ + v = v - (v >>> 1 & 0x55555555); + v = (v & 0x33333333) + (v >>> 2 & 0x33333333); + return (v + (v >>> 4) & 0xF0F0F0F) * 0x1010101 >>> 24; + } + function caml_ml_set_channel_output(chanid, f){ + var chan = caml_ml_channels[chanid]; + chan.output = function(s){f(s);}; + return 0; + } + function caml_read_file_content(name){ + var + name = typeof name == "string" ? caml_string_of_jsbytes(name) : name, + root = resolve_fs_device(name); + if(root.device.exists(root.rest)){ + var + file = root.device.open(root.rest, {rdonly: 1}), + len = file.length(), + buf = new Uint8Array(len); + file.read(0, buf, 0, len); + return caml_string_of_array(buf); + } + caml_raise_no_such_file(caml_jsbytes_of_string(name)); + } + function caml_js_to_float(x){return x;} + function caml_setup_uncaught_exception_handler(){ + var process = globalThis.process; + if(process && process.on) + process.on + ("uncaughtException", + function(err, origin){ + caml_fatal_uncaught_exception(err); + process.exit(2); + }); + else if(globalThis.addEventListener) + globalThis.addEventListener + ("error", + function(event){ + if(event.error) caml_fatal_uncaught_exception(event.error); + }); + } + caml_setup_uncaught_exception_handler(); + globalThis.jsoo_runtime = + {time_now_nanoseconds_since_unix_epoch_or_zero: + time_now_nanoseconds_since_unix_epoch_or_zero, + Base_am_testing: Base_am_testing, + Base_hash_double: Base_hash_double, + Base_hash_string: Base_hash_string, + Base_int_math_int64_pow_stub: Base_int_math_int64_pow_stub, + Base_int_math_int_pow_stub: Base_int_math_int_pow_stub, + Base_int_math_int64_ctz: Base_int_math_int64_ctz, + Base_int_math_nativeint_ctz: Base_int_math_nativeint_ctz, + Base_int_math_int_ctz: Base_int_math_int_ctz, + Base_int_math_int32_ctz: Base_int_math_int32_ctz, + Base_int_math_int64_clz: Base_int_math_int64_clz, + Base_int_math_nativeint_clz: Base_int_math_nativeint_clz, + Base_int_math_int_clz: Base_int_math_int_clz, + Base_int_math_int32_clz: Base_int_math_int32_clz, + Base_caml_exn_is_most_recent_exn: Base_caml_exn_is_most_recent_exn, + Base_clear_caml_backtrace_pos: Base_clear_caml_backtrace_pos, + Base_int_math_int_popcount: Base_int_math_int_popcount, + Base_internalhash_get_hash_value: Base_internalhash_get_hash_value, + Base_internalhash_fold_string: Base_internalhash_fold_string, + Base_internalhash_fold_float: Base_internalhash_fold_float, + Base_internalhash_fold_int: Base_internalhash_fold_int, + Base_internalhash_fold_int64: Base_internalhash_fold_int64, + caml_runtime_events_read_poll: caml_runtime_events_read_poll, + caml_runtime_events_free_cursor: caml_runtime_events_free_cursor, + caml_runtime_events_create_cursor: caml_runtime_events_create_cursor, + caml_runtime_events_resume: caml_runtime_events_resume, + caml_runtime_events_pause: caml_runtime_events_pause, + caml_runtime_events_start: caml_runtime_events_start, + caml_runtime_events_user_resolve: caml_runtime_events_user_resolve, + caml_runtime_events_user_write: caml_runtime_events_user_write, + caml_runtime_events_user_register: caml_runtime_events_user_register, + caml_custom_event_index: caml_custom_event_index, + zstd_decompress: zstd_decompress, + jsoo_effect_not_supported: jsoo_effect_not_supported, + caml_ml_condition_signal: caml_ml_condition_signal, + caml_ml_condition_broadcast: caml_ml_condition_broadcast, + caml_ml_condition_wait: caml_ml_condition_wait, + caml_ml_condition_new: caml_ml_condition_new, + caml_get_continuation_callstack: caml_get_continuation_callstack, + caml_continuation_use_and_update_handler_noexc: + caml_continuation_use_and_update_handler_noexc, + caml_continuation_use_noexc: caml_continuation_use_noexc, + caml_alloc_stack: caml_alloc_stack, + caml_ml_mutex_unlock: caml_ml_mutex_unlock, + caml_ml_mutex_try_lock: caml_ml_mutex_try_lock, + caml_ml_mutex_lock: caml_ml_mutex_lock, + caml_ml_mutex_new: caml_ml_mutex_new, + MlMutex: MlMutex, + caml_lxm_next: caml_lxm_next, + caml_ml_domain_cpu_relax: caml_ml_domain_cpu_relax, + caml_ml_domain_id: caml_ml_domain_id, + caml_domain_spawn: caml_domain_spawn, + caml_domain_id: caml_domain_id, + caml_recommended_domain_count: caml_recommended_domain_count, + caml_ml_domain_set_name: caml_ml_domain_set_name, + caml_ml_domain_unique_token: caml_ml_domain_unique_token, + caml_atomic_exchange: caml_atomic_exchange, + caml_atomic_fetch_add: caml_atomic_fetch_add, + caml_atomic_cas: caml_atomic_cas, + caml_atomic_load: caml_atomic_load, + caml_domain_dls_get: caml_domain_dls_get, + caml_domain_dls_set: caml_domain_dls_set, + caml_domain_dls: caml_domain_dls, + caml_ephe_check_data: caml_ephe_check_data, + caml_ephe_unset_data: caml_ephe_unset_data, + caml_ephe_set_data: caml_ephe_set_data, + caml_ephe_get_data_copy: caml_ephe_get_data_copy, + caml_ephe_get_data: caml_ephe_get_data, + caml_ephe_blit_data: caml_ephe_blit_data, + caml_ephe_blit_key: caml_ephe_blit_key, + caml_ephe_check_key: caml_ephe_check_key, + caml_ephe_get_key_copy: caml_ephe_get_key_copy, + caml_ephe_get_key: caml_ephe_get_key, + caml_weak_set: caml_weak_set, + caml_weak_create: caml_weak_create, + caml_ephe_create: caml_ephe_create, + caml_ephe_unset_key: caml_ephe_unset_key, + caml_ephe_set_key: caml_ephe_set_key, + caml_ephe_data_offset: caml_ephe_data_offset, + caml_ephe_key_offset: caml_ephe_key_offset, + caml_unix_inet_addr_of_string: caml_unix_inet_addr_of_string, + caml_unix_findclose: caml_unix_findclose, + caml_unix_findnext: caml_unix_findnext, + caml_unix_findfirst: caml_unix_findfirst, + caml_unix_rewinddir: caml_unix_rewinddir, + caml_unix_closedir: caml_unix_closedir, + caml_unix_readdir: caml_unix_readdir, + caml_unix_opendir: caml_unix_opendir, + caml_unix_has_symlink: caml_unix_has_symlink, + caml_unix_getpwuid: caml_unix_getpwuid, + caml_unix_getuid: caml_unix_getuid, + caml_unix_unlink: caml_unix_unlink, + caml_unix_readlink: caml_unix_readlink, + caml_unix_symlink: caml_unix_symlink, + caml_unix_rmdir: caml_unix_rmdir, + caml_unix_mkdir: caml_unix_mkdir, + caml_unix_lstat_64: caml_unix_lstat_64, + caml_unix_lstat: caml_unix_lstat, + caml_unix_stat_64: caml_unix_stat_64, + caml_unix_stat: caml_unix_stat, + make_unix_err_args: make_unix_err_args, + caml_unix_isatty: caml_unix_isatty, + caml_unix_filedescr_of_fd: caml_unix_filedescr_of_fd, + caml_unix_cleanup: caml_unix_cleanup, + caml_unix_startup: caml_unix_startup, + caml_unix_mktime: caml_unix_mktime, + caml_unix_localtime: caml_unix_localtime, + caml_unix_gmtime: caml_unix_gmtime, + caml_unix_time: caml_unix_time, + caml_unix_gettimeofday: caml_unix_gettimeofday, + caml_str_initialize: caml_str_initialize, + re_replacement_text: re_replacement_text, + re_partial_match: re_partial_match, + re_string_match: re_string_match, + re_search_backward: re_search_backward, + re_search_forward: re_search_forward, + re_match: re_match, + caml_sys_is_regular_file: caml_sys_is_regular_file, + caml_spacetime_only_works_for_native_code: + caml_spacetime_only_works_for_native_code, + caml_register_channel_for_spacetime: caml_register_channel_for_spacetime, + caml_sys_const_naked_pointers_checked: + caml_sys_const_naked_pointers_checked, + caml_spacetime_enabled: caml_spacetime_enabled, + caml_ml_runtime_warnings_enabled: caml_ml_runtime_warnings_enabled, + caml_ml_enable_runtime_warnings: caml_ml_enable_runtime_warnings, + caml_runtime_warnings: caml_runtime_warnings, + caml_install_signal_handler: caml_install_signal_handler, + caml_runtime_parameters: caml_runtime_parameters, + caml_runtime_variant: caml_runtime_variant, + caml_sys_isatty: caml_sys_isatty, + caml_sys_get_config: caml_sys_get_config, + os_type: os_type, + caml_sys_const_backend_type: caml_sys_const_backend_type, + caml_sys_const_ostype_cygwin: caml_sys_const_ostype_cygwin, + caml_sys_const_ostype_win32: caml_sys_const_ostype_win32, + caml_sys_const_ostype_unix: caml_sys_const_ostype_unix, + caml_sys_const_max_wosize: caml_sys_const_max_wosize, + caml_sys_const_int_size: caml_sys_const_int_size, + caml_sys_const_word_size: caml_sys_const_word_size, + caml_sys_const_big_endian: caml_sys_const_big_endian, + caml_sys_random_seed: caml_sys_random_seed, + caml_sys_time_include_children: caml_sys_time_include_children, + caml_sys_time: caml_sys_time, + caml_sys_system_command: caml_sys_system_command, + caml_sys_executable_name: caml_sys_executable_name, + caml_sys_modify_argv: caml_sys_modify_argv, + caml_sys_argv: caml_sys_argv, + caml_sys_get_argv: caml_sys_get_argv, + caml_executable_name: caml_executable_name, + caml_argv: caml_argv, + caml_sys_unsafe_getenv: caml_sys_unsafe_getenv, + caml_sys_getenv: caml_sys_getenv, + jsoo_sys_getenv: jsoo_sys_getenv, + caml_set_static_env: caml_set_static_env, + caml_fatal_uncaught_exception: caml_fatal_uncaught_exception, + caml_format_exception: caml_format_exception, + caml_is_special_exception: caml_is_special_exception, + caml_sys_exit: caml_sys_exit, + caml_raise_sys_error: caml_raise_sys_error, + caml_maybe_print_stats: caml_maybe_print_stats, + caml_is_printable: caml_is_printable, + caml_get_global_data: caml_get_global_data, + caml_register_global: caml_register_global, + caml_build_symbols: caml_build_symbols, + caml_global_data: caml_global_data, + caml_named_value: caml_named_value, + caml_register_named_value: caml_register_named_value, + caml_named_values: caml_named_values, + caml_call_gen: caml_call_gen, + caml_set_parser_trace: caml_set_parser_trace, + caml_parse_engine: caml_parse_engine, + caml_parser_trace: caml_parser_trace, + caml_is_continuation_tag: caml_is_continuation_tag, + caml_lazy_read_result: caml_lazy_read_result, + caml_lazy_reset_to_lazy: caml_lazy_reset_to_lazy, + caml_lazy_update_to_forward: caml_lazy_update_to_forward, + caml_lazy_update_to_forcing: caml_lazy_update_to_forcing, + caml_obj_update_tag: caml_obj_update_tag, + caml_obj_add_offset: caml_obj_add_offset, + caml_obj_reachable_words: caml_obj_reachable_words, + caml_obj_set_raw_field: caml_obj_set_raw_field, + caml_obj_raw_field: caml_obj_raw_field, + caml_fresh_oo_id: caml_fresh_oo_id, + caml_set_oo_id: caml_set_oo_id, + caml_oo_last_id: caml_oo_last_id, + caml_get_public_method: caml_get_public_method, + caml_lazy_make_forward: caml_lazy_make_forward, + caml_obj_is_shared: caml_obj_is_shared, + caml_obj_compare_and_swap: caml_obj_compare_and_swap, + caml_obj_make_forward: caml_obj_make_forward, + caml_obj_truncate: caml_obj_truncate, + caml_obj_dup: caml_obj_dup, + caml_obj_with_tag: caml_obj_with_tag, + caml_obj_block: caml_obj_block, + caml_obj_set_tag: caml_obj_set_tag, + caml_obj_tag: caml_obj_tag, + caml_obj_is_block: caml_obj_is_block, + caml_alloc_dummy_infix: caml_alloc_dummy_infix, + caml_update_dummy: caml_update_dummy, + deserialize_nat: deserialize_nat, + serialize_nat: serialize_nat, + lxor_digit_nat: lxor_digit_nat, + lor_digit_nat: lor_digit_nat, + land_digit_nat: land_digit_nat, + compare_nat_real: compare_nat_real, + compare_nat: compare_nat, + compare_digits_nat: compare_digits_nat, + shift_right_nat: shift_right_nat, + div_nat: div_nat, + div_digit_nat: div_digit_nat, + div_helper: div_helper, + shift_left_nat: shift_left_nat, + square_nat: square_nat, + mult_nat: mult_nat, + mult_digit_nat: mult_digit_nat, + sub_nat: sub_nat, + decr_nat: decr_nat, + complement_nat: complement_nat, + add_nat: add_nat, + incr_nat: incr_nat, + is_digit_odd: is_digit_odd, + is_digit_zero: is_digit_zero, + is_digit_int: is_digit_int, + num_leading_zero_bits_in_digit: num_leading_zero_bits_in_digit, + num_digits_nat: num_digits_nat, + nth_digit_nat_native: nth_digit_nat_native, + set_digit_nat_native: set_digit_nat_native, + nth_digit_nat: nth_digit_nat, + set_digit_nat: set_digit_nat, + blit_nat: blit_nat, + set_to_zero_nat: set_to_zero_nat, + create_nat: create_nat, + nat_of_array: nat_of_array, + caml_hash_nat: caml_hash_nat, + MlNat: MlNat, + initialize_nat: initialize_nat, + caml_array_of_bytes: caml_array_of_bytes, + caml_array_of_string: caml_array_of_string, + caml_js_to_string: caml_js_to_string, + caml_to_js_string: caml_to_js_string, + caml_js_from_string: caml_js_from_string, + caml_new_string: caml_new_string, + caml_js_to_byte_string: caml_js_to_byte_string, + caml_is_ml_string: caml_is_ml_string, + caml_ml_bytes_content: caml_ml_bytes_content, + caml_is_ml_bytes: caml_is_ml_bytes, + caml_bytes_of_jsbytes: caml_bytes_of_jsbytes, + caml_string_of_jsstring: caml_string_of_jsstring, + caml_jsstring_of_string: caml_jsstring_of_string, + caml_jsbytes_of_string: caml_jsbytes_of_string, + caml_string_of_jsbytes: caml_string_of_jsbytes, + caml_bytes_of_string: caml_bytes_of_string, + caml_string_of_bytes: caml_string_of_bytes, + caml_string_lessthan: caml_string_lessthan, + caml_string_lessequal: caml_string_lessequal, + caml_string_equal: caml_string_equal, + caml_string_compare: caml_string_compare, + caml_ml_string_length: caml_ml_string_length, + caml_string_unsafe_set: caml_string_unsafe_set, + caml_string_unsafe_get: caml_string_unsafe_get, + caml_ml_bytes_length: caml_ml_bytes_length, + caml_blit_string: caml_blit_string, + caml_blit_bytes: caml_blit_bytes, + caml_fill_bytes: caml_fill_bytes, + caml_bytes_greaterthan: caml_bytes_greaterthan, + caml_string_greaterthan: caml_string_greaterthan, + caml_bytes_greaterequal: caml_bytes_greaterequal, + caml_string_greaterequal: caml_string_greaterequal, + caml_bytes_lessthan: caml_bytes_lessthan, + caml_bytes_lessequal: caml_bytes_lessequal, + caml_bytes_notequal: caml_bytes_notequal, + caml_string_notequal: caml_string_notequal, + caml_bytes_equal: caml_bytes_equal, + caml_bytes_compare: caml_bytes_compare, + caml_bytes_of_array: caml_bytes_of_array, + caml_string_of_array: caml_string_of_array, + caml_create_bytes: caml_create_bytes, + caml_create_string: caml_create_string, + caml_uint8_array_of_string: caml_uint8_array_of_string, + caml_uint8_array_of_bytes: caml_uint8_array_of_bytes, + caml_convert_bytes_to_array: caml_convert_bytes_to_array, + caml_convert_string_to_bytes: caml_convert_string_to_bytes, + MlBytes: MlBytes, + caml_bytes_of_utf16_jsstring: caml_bytes_of_utf16_jsstring, + caml_bytes_set: caml_bytes_set, + caml_string_set64: caml_string_set64, + caml_bytes_set64: caml_bytes_set64, + caml_string_set32: caml_string_set32, + caml_bytes_set32: caml_bytes_set32, + caml_string_set16: caml_string_set16, + caml_bytes_set16: caml_bytes_set16, + caml_string_set: caml_string_set, + caml_bytes_get: caml_bytes_get, + caml_bytes_get64: caml_bytes_get64, + caml_string_get64: caml_string_get64, + caml_bytes_get32: caml_bytes_get32, + caml_string_get32: caml_string_get32, + caml_bytes_get16: caml_bytes_get16, + caml_string_get16: caml_string_get16, + caml_string_get: caml_string_get, + caml_bytes_bound_error: caml_bytes_bound_error, + caml_string_bound_error: caml_string_bound_error, + caml_bytes_unsafe_set: caml_bytes_unsafe_set, + caml_bytes_unsafe_get: caml_bytes_unsafe_get, + jsoo_is_ascii: jsoo_is_ascii, + caml_utf16_of_utf8: caml_utf16_of_utf8, + caml_utf8_of_utf16: caml_utf8_of_utf16, + caml_subarray_to_jsbytes: caml_subarray_to_jsbytes, + caml_str_repeat: caml_str_repeat, + caml_md5_bytes: caml_md5_bytes, + caml_MD5Final: caml_MD5Final, + caml_MD5Update: caml_MD5Update, + caml_MD5Init: caml_MD5Init, + caml_MD5Transform: caml_MD5Transform, + caml_md5_string: caml_md5_string, + caml_md5_chan: caml_md5_chan, + caml_output_value_to_buffer: caml_output_value_to_buffer, + caml_output_value_to_bytes: caml_output_value_to_bytes, + caml_output_value_to_string: caml_output_value_to_string, + caml_output_val: caml_output_val, + MlObjectTable: MlObjectTable, + caml_marshal_data_size: caml_marshal_data_size, + caml_marshal_header_size: caml_marshal_header_size, + caml_input_value_from_reader: caml_input_value_from_reader, + caml_custom_ops: caml_custom_ops, + caml_nativeint_unmarshal: caml_nativeint_unmarshal, + caml_int32_unmarshal: caml_int32_unmarshal, + caml_int64_marshal: caml_int64_marshal, + caml_int64_unmarshal: caml_int64_unmarshal, + caml_input_value_from_bytes: caml_input_value_from_bytes, + caml_input_value_from_string: caml_input_value_from_string, + caml_float_of_bytes: caml_float_of_bytes, + BigStringReader: BigStringReader, + MlStringReader: MlStringReader, + UInt8ArrayReader: UInt8ArrayReader, + caml_marshal_constants: caml_marshal_constants, + caml_new_lex_engine: caml_new_lex_engine, + caml_lex_engine: caml_lex_engine, + caml_lex_array: caml_lex_array, + caml_js_error_of_exception: caml_js_error_of_exception, + caml_xmlhttprequest_create: caml_xmlhttprequest_create, + caml_js_get_console: caml_js_get_console, + caml_js_html_entities: caml_js_html_entities, + caml_js_html_escape: caml_js_html_escape, + caml_js_on_ie: caml_js_on_ie, + caml_js_object: caml_js_object, + caml_pure_js_expr: caml_pure_js_expr, + caml_js_expr: caml_js_expr, + caml_js_eval_string: caml_js_eval_string, + caml_js_equals: caml_js_equals, + caml_js_function_arity: caml_js_function_arity, + caml_js_wrap_meth_callback_unsafe: caml_js_wrap_meth_callback_unsafe, + caml_js_wrap_meth_callback_strict: caml_js_wrap_meth_callback_strict, + caml_js_wrap_meth_callback_arguments: + caml_js_wrap_meth_callback_arguments, + caml_js_wrap_meth_callback: caml_js_wrap_meth_callback, + caml_js_wrap_callback_unsafe: caml_js_wrap_callback_unsafe, + caml_js_wrap_callback_strict: caml_js_wrap_callback_strict, + caml_js_wrap_callback_arguments: caml_js_wrap_callback_arguments, + caml_js_wrap_callback: caml_js_wrap_callback, + caml_ojs_new_arr: caml_ojs_new_arr, + caml_js_new: caml_js_new, + caml_js_meth_call: caml_js_meth_call, + caml_js_fun_call: caml_js_fun_call, + caml_js_call: caml_js_call, + caml_js_var: caml_js_var, + caml_list_to_js_array: caml_list_to_js_array, + caml_list_of_js_array: caml_list_of_js_array, + caml_js_to_array: caml_js_to_array, + caml_js_from_array: caml_js_from_array, + caml_js_to_float: caml_js_to_float, + caml_js_from_float: caml_js_from_float, + caml_js_to_bool: caml_js_to_bool, + caml_js_from_bool: caml_js_from_bool, + caml_js_error_option_of_exception: caml_js_error_option_of_exception, + caml_exn_with_js_backtrace: caml_exn_with_js_backtrace, + caml_maybe_attach_backtrace: caml_maybe_attach_backtrace, + caml_wrap_exception: caml_wrap_exception, + caml_jsoo_flags_effects: caml_jsoo_flags_effects, + caml_jsoo_flags_use_js_string: caml_jsoo_flags_use_js_string, + caml_is_js: caml_is_js, + caml_callback: caml_callback, + caml_trampoline_return: caml_trampoline_return, + caml_trampoline: caml_trampoline, + caml_js_typeof: caml_js_typeof, + caml_js_instanceof: caml_js_instanceof, + caml_js_delete: caml_js_delete, + caml_js_get: caml_js_get, + caml_js_set: caml_js_set, + caml_js_pure_expr: caml_js_pure_expr, + caml_ml_set_buffered: caml_ml_set_buffered, + caml_ml_is_buffered: caml_ml_is_buffered, + caml_ml_output_int: caml_ml_output_int, + caml_ml_pos_out_64: caml_ml_pos_out_64, + caml_ml_pos_out: caml_ml_pos_out, + caml_pos_out: caml_pos_out, + caml_ml_seek_out_64: caml_ml_seek_out_64, + caml_ml_seek_out: caml_ml_seek_out, + caml_seek_out: caml_seek_out, + caml_output_value: caml_output_value, + caml_ml_output_char: caml_ml_output_char, + caml_ml_output: caml_ml_output, + caml_ml_output_bytes: caml_ml_output_bytes, + caml_ml_flush: caml_ml_flush, + caml_ml_input_scan_line: caml_ml_input_scan_line, + caml_ml_pos_in_64: caml_ml_pos_in_64, + caml_ml_pos_in: caml_ml_pos_in, + caml_pos_in: caml_pos_in, + caml_ml_seek_in_64: caml_ml_seek_in_64, + caml_ml_seek_in: caml_ml_seek_in, + caml_seek_in: caml_seek_in, + caml_ml_input_int: caml_ml_input_int, + caml_ml_input_char: caml_ml_input_char, + caml_input_value_to_outside_heap: caml_input_value_to_outside_heap, + caml_input_value: caml_input_value, + caml_ml_input_block: caml_ml_input_block, + caml_ml_input: caml_ml_input, + caml_refill: caml_refill, + caml_ml_set_channel_refill: caml_ml_set_channel_refill, + caml_ml_set_channel_output: caml_ml_set_channel_output, + caml_ml_channel_size_64: caml_ml_channel_size_64, + caml_ml_channel_size: caml_ml_channel_size, + caml_ml_close_channel: caml_ml_close_channel, + caml_ml_set_binary_mode: caml_ml_set_binary_mode, + caml_channel_descriptor: caml_channel_descriptor, + caml_ml_open_descriptor_in: caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out: caml_ml_open_descriptor_out, + caml_ml_out_channels_list: caml_ml_out_channels_list, + caml_ml_channels: caml_ml_channels, + caml_ml_set_channel_name: caml_ml_set_channel_name, + caml_sys_open: caml_sys_open, + caml_sys_close: caml_sys_close, + caml_sys_fds: caml_sys_fds, + caml_int64_bswap: caml_int64_bswap, + caml_int32_bswap: caml_int32_bswap, + caml_bswap16: caml_bswap16, + caml_mod: caml_mod, + caml_div: caml_div, + caml_mul: caml_mul, + caml_int_of_string: caml_int_of_string, + caml_parse_digit: caml_parse_digit, + caml_parse_sign_and_base: caml_parse_sign_and_base, + caml_format_int: caml_format_int, + caml_int64_hash: caml_int64_hash, + caml_int64_to_bytes: caml_int64_to_bytes, + caml_int64_of_bytes: caml_int64_of_bytes, + caml_int64_hi32: caml_int64_hi32, + caml_int64_lo32: caml_int64_lo32, + caml_int64_create_lo_hi: caml_int64_create_lo_hi, + caml_int64_create_lo_mi_hi: caml_int64_create_lo_mi_hi, + caml_int64_of_string: caml_int64_of_string, + caml_int64_format: caml_int64_format, + caml_int64_of_float: caml_int64_of_float, + caml_int64_to_float: caml_int64_to_float, + caml_int64_to_int32: caml_int64_to_int32, + caml_int64_of_int32: caml_int64_of_int32, + caml_int64_mod: caml_int64_mod, + caml_int64_div: caml_int64_div, + caml_int64_shift_right: caml_int64_shift_right, + caml_int64_shift_right_unsigned: caml_int64_shift_right_unsigned, + caml_int64_shift_left: caml_int64_shift_left, + caml_int64_xor: caml_int64_xor, + caml_int64_or: caml_int64_or, + caml_int64_and: caml_int64_and, + caml_int64_is_negative: caml_int64_is_negative, + caml_int64_is_zero: caml_int64_is_zero, + caml_int64_mul: caml_int64_mul, + caml_int64_sub: caml_int64_sub, + caml_int64_add: caml_int64_add, + caml_int64_neg: caml_int64_neg, + caml_int64_compare: caml_int64_compare, + caml_int64_ult: caml_int64_ult, + MlInt64: MlInt64, + caml_int64_offset: caml_int64_offset, + caml_float_of_string: caml_float_of_string, + caml_format_float: caml_format_float, + caml_fma_float: caml_fma_float, + caml_erfc_float: caml_erfc_float, + caml_erf_float: caml_erf_float, + caml_cbrt_float: caml_cbrt_float, + caml_round_float: caml_round_float, + caml_atanh_float: caml_atanh_float, + caml_tanh_float: caml_tanh_float, + caml_asinh_float: caml_asinh_float, + caml_sinh_float: caml_sinh_float, + caml_acosh_float: caml_acosh_float, + caml_cosh_float: caml_cosh_float, + caml_log10_float: caml_log10_float, + caml_hypot_float: caml_hypot_float, + caml_log2_float: caml_log2_float, + caml_log1p_float: caml_log1p_float, + caml_exp2_float: caml_exp2_float, + caml_expm1_float: caml_expm1_float, + caml_signbit_float: caml_signbit_float, + caml_copysign_float: caml_copysign_float, + caml_float_compare: caml_float_compare, + caml_frexp_float: caml_frexp_float, + caml_ldexp_float: caml_ldexp_float, + caml_modf_float: caml_modf_float, + caml_classify_float: caml_classify_float, + caml_int32_float_of_bits: caml_int32_float_of_bits, + caml_trunc_float: caml_trunc_float, + caml_nextafter_float: caml_nextafter_float, + caml_int64_float_of_bits: caml_int64_float_of_bits, + caml_hexstring_of_float: caml_hexstring_of_float, + caml_int32_bits_of_float: caml_int32_bits_of_float, + caml_int64_bits_of_float: caml_int64_bits_of_float, + jsoo_floor_log2: jsoo_floor_log2, + caml_string_hash: caml_string_hash, + caml_hash: caml_hash, + caml_hash_mix_string: caml_hash_mix_string, + caml_hash_mix_bytes: caml_hash_mix_bytes, + caml_hash_mix_bytes_arr: caml_hash_mix_bytes_arr, + caml_hash_mix_jsbytes: caml_hash_mix_jsbytes, + caml_hash_mix_int64: caml_hash_mix_int64, + caml_hash_mix_float: caml_hash_mix_float, + caml_hash_mix_final: caml_hash_mix_final, + caml_hash_mix_int: caml_hash_mix_int, + caml_gr_close_subwindow: caml_gr_close_subwindow, + caml_gr_open_subwindow: caml_gr_open_subwindow, + caml_gr_window_id: caml_gr_window_id, + caml_gr_display_mode: caml_gr_display_mode, + caml_gr_remember_mode: caml_gr_remember_mode, + caml_gr_synchronize: caml_gr_synchronize, + caml_gr_wait_event: caml_gr_wait_event, + caml_gr_sigio_signal: caml_gr_sigio_signal, + caml_gr_sigio_handler: caml_gr_sigio_handler, + caml_gr_blit_image: caml_gr_blit_image, + caml_gr_create_image: caml_gr_create_image, + caml_gr_draw_image: caml_gr_draw_image, + caml_gr_dump_image: caml_gr_dump_image, + caml_gr_make_image: caml_gr_make_image, + caml_gr_text_size: caml_gr_text_size, + caml_gr_set_text_size: caml_gr_set_text_size, + caml_gr_set_font: caml_gr_set_font, + caml_gr_draw_string: caml_gr_draw_string, + caml_gr_draw_char: caml_gr_draw_char, + caml_gr_draw_str: caml_gr_draw_str, + caml_gr_fill_arc: caml_gr_fill_arc, + caml_gr_fill_poly: caml_gr_fill_poly, + caml_gr_fill_rect: caml_gr_fill_rect, + caml_gr_set_line_width: caml_gr_set_line_width, + caml_gr_draw_arc: caml_gr_draw_arc, + caml_gr_arc_aux: caml_gr_arc_aux, + caml_gr_draw_rect: caml_gr_draw_rect, + caml_gr_lineto: caml_gr_lineto, + caml_gr_current_y: caml_gr_current_y, + caml_gr_current_x: caml_gr_current_x, + caml_gr_moveto: caml_gr_moveto, + caml_gr_point_color: caml_gr_point_color, + caml_gr_plot: caml_gr_plot, + caml_gr_set_color: caml_gr_set_color, + caml_gr_size_y: caml_gr_size_y, + caml_gr_size_x: caml_gr_size_x, + caml_gr_clear_graph: caml_gr_clear_graph, + caml_gr_resize_window: caml_gr_resize_window, + caml_gr_set_window_title: caml_gr_set_window_title, + caml_gr_close_graph: caml_gr_close_graph, + caml_gr_doc_of_state: caml_gr_doc_of_state, + caml_gr_state_create: caml_gr_state_create, + caml_gr_state_init: caml_gr_state_init, + caml_gr_open_graph: caml_gr_open_graph, + caml_gr_state_set: caml_gr_state_set, + caml_gr_state_get: caml_gr_state_get, + caml_gr_state: caml_gr_state, + caml_get_major_credit: caml_get_major_credit, + caml_get_major_bucket: caml_get_major_bucket, + caml_get_minor_free: caml_get_minor_free, + caml_gc_minor_words: caml_gc_minor_words, + caml_gc_major_slice: caml_gc_major_slice, + caml_gc_huge_fallback_count: caml_gc_huge_fallback_count, + caml_eventlog_pause: caml_eventlog_pause, + caml_eventlog_resume: caml_eventlog_resume, + caml_memprof_stop: caml_memprof_stop, + caml_memprof_start: caml_memprof_start, + caml_final_release: caml_final_release, + caml_final_register_called_without_value: + caml_final_register_called_without_value, + caml_final_register: caml_final_register, + caml_memprof_set: caml_memprof_set, + caml_gc_get: caml_gc_get, + caml_gc_set: caml_gc_set, + caml_gc_stat: caml_gc_stat, + caml_gc_quick_stat: caml_gc_quick_stat, + caml_gc_counters: caml_gc_counters, + caml_gc_compaction: caml_gc_compaction, + caml_gc_full_major: caml_gc_full_major, + caml_gc_major: caml_gc_major, + caml_gc_minor: caml_gc_minor, + caml_sys_open_for_node: caml_sys_open_for_node, + MlNodeFd: MlNodeFd, + MlNodeDevice: MlNodeDevice, + fs_node_supported: fs_node_supported, + MlFakeFd: MlFakeFd, + MlFakeFd_out: MlFakeFd_out, + MlFakeFile: MlFakeFile, + MlFakeDevice: MlFakeDevice, + caml_read_file_content: caml_read_file_content, + jsoo_create_file: jsoo_create_file, + caml_create_file: caml_create_file, + caml_fs_init: caml_fs_init, + jsoo_create_file_extern: jsoo_create_file_extern, + caml_ba_map_file_bytecode: caml_ba_map_file_bytecode, + caml_ba_map_file: caml_ba_map_file, + caml_sys_rmdir: caml_sys_rmdir, + caml_sys_mkdir: caml_sys_mkdir, + caml_sys_rename: caml_sys_rename, + caml_sys_is_directory: caml_sys_is_directory, + caml_sys_remove: caml_sys_remove, + caml_sys_read_directory: caml_sys_read_directory, + caml_sys_file_exists: caml_sys_file_exists, + caml_raise_not_a_dir: caml_raise_not_a_dir, + caml_raise_no_such_file: caml_raise_no_such_file, + caml_sys_chdir: caml_sys_chdir, + caml_sys_getcwd: caml_sys_getcwd, + caml_unmount: caml_unmount, + caml_mount_autoload: caml_mount_autoload, + resolve_fs_device: resolve_fs_device, + caml_list_mount_point: caml_list_mount_point, + jsoo_mount_point: jsoo_mount_point, + caml_make_path: caml_make_path, + path_is_absolute: path_is_absolute, + MlFile: MlFile, + caml_root: caml_root, + caml_get_root: caml_get_root, + caml_current_dir: caml_current_dir, + caml_trailing_slash: caml_trailing_slash, + caml_finish_formatting: caml_finish_formatting, + caml_parse_format: caml_parse_format, + caml_array_bound_error: caml_array_bound_error, + caml_raise_not_found: caml_raise_not_found, + caml_raise_zero_divide: caml_raise_zero_divide, + caml_raise_end_of_file: caml_raise_end_of_file, + caml_invalid_argument: caml_invalid_argument, + caml_failwith: caml_failwith, + caml_raise_with_string: caml_raise_with_string, + caml_raise_with_args: caml_raise_with_args, + caml_raise_with_arg: caml_raise_with_arg, + caml_raise_constant: caml_raise_constant, + caml_lessthan: caml_lessthan, + caml_lessequal: caml_lessequal, + caml_greaterthan: caml_greaterthan, + caml_greaterequal: caml_greaterequal, + caml_notequal: caml_notequal, + caml_equal: caml_equal, + caml_int_compare: caml_int_compare, + caml_compare: caml_compare, + caml_compare_val: caml_compare_val, + caml_compare_val_number_custom: caml_compare_val_number_custom, + caml_compare_val_get_custom: caml_compare_val_get_custom, + caml_compare_val_tag: caml_compare_val_tag, + caml_bigstring_blit_ba_to_bytes: caml_bigstring_blit_ba_to_bytes, + caml_bigstring_blit_bytes_to_ba: caml_bigstring_blit_bytes_to_ba, + caml_bigstring_blit_string_to_ba: caml_bigstring_blit_string_to_ba, + caml_bigstring_blit_ba_to_ba: caml_bigstring_blit_ba_to_ba, + caml_bigstring_memcmp: caml_bigstring_memcmp, + bigstring_of_typed_array: bigstring_of_typed_array, + bigstring_of_array_buffer: bigstring_of_array_buffer, + bigstring_to_typed_array: bigstring_to_typed_array, + bigstring_to_array_buffer: bigstring_to_array_buffer, + caml_hash_mix_bigstring: caml_hash_mix_bigstring, + caml_ba_from_typed_array: caml_ba_from_typed_array, + caml_ba_kind_of_typed_array: caml_ba_kind_of_typed_array, + caml_ba_to_typed_array: caml_ba_to_typed_array, + caml_ba_hash: caml_ba_hash, + caml_ba_create_from: caml_ba_create_from, + caml_ba_deserialize: caml_ba_deserialize, + caml_ba_serialize: caml_ba_serialize, + caml_ba_reshape: caml_ba_reshape, + caml_ba_slice: caml_ba_slice, + caml_ba_sub: caml_ba_sub, + caml_ba_blit: caml_ba_blit, + caml_ba_fill: caml_ba_fill, + caml_ba_set_3: caml_ba_set_3, + caml_ba_set_2: caml_ba_set_2, + caml_ba_set_1: caml_ba_set_1, + caml_ba_uint8_set64: caml_ba_uint8_set64, + caml_ba_uint8_set32: caml_ba_uint8_set32, + caml_ba_uint8_set16: caml_ba_uint8_set16, + caml_ba_set_generic: caml_ba_set_generic, + caml_ba_get_3: caml_ba_get_3, + caml_ba_get_2: caml_ba_get_2, + caml_ba_get_1: caml_ba_get_1, + caml_ba_uint8_get64: caml_ba_uint8_get64, + caml_ba_uint8_get32: caml_ba_uint8_get32, + caml_ba_uint8_get16: caml_ba_uint8_get16, + caml_ba_get_generic: caml_ba_get_generic, + caml_ba_dim_3: caml_ba_dim_3, + caml_ba_dim_2: caml_ba_dim_2, + caml_ba_dim_1: caml_ba_dim_1, + caml_ba_dim: caml_ba_dim, + caml_ba_num_dims: caml_ba_num_dims, + caml_ba_layout: caml_ba_layout, + caml_ba_kind: caml_ba_kind, + caml_ba_change_layout: caml_ba_change_layout, + caml_ba_create: caml_ba_create, + caml_ba_create_unsafe: caml_ba_create_unsafe, + caml_ba_compare: caml_ba_compare, + Ml_Bigarray_c_1_1: Ml_Bigarray_c_1_1, + Ml_Bigarray: Ml_Bigarray, + caml_ba_custom_name: caml_ba_custom_name, + caml_ba_create_buffer: caml_ba_create_buffer, + caml_ba_get_size_per_element: caml_ba_get_size_per_element, + caml_ba_get_size: caml_ba_get_size, + caml_ba_init: caml_ba_init, + caml_convert_raw_backtrace_slot: caml_convert_raw_backtrace_slot, + caml_get_current_callstack: caml_get_current_callstack, + caml_restore_raw_backtrace: caml_restore_raw_backtrace, + caml_raw_backtrace_slot: caml_raw_backtrace_slot, + caml_raw_backtrace_next_slot: caml_raw_backtrace_next_slot, + caml_raw_backtrace_length: caml_raw_backtrace_length, + caml_convert_raw_backtrace: caml_convert_raw_backtrace, + caml_record_backtrace: caml_record_backtrace, + caml_get_exception_raw_backtrace: caml_get_exception_raw_backtrace, + caml_get_exception_backtrace: caml_get_exception_backtrace, + caml_backtrace_status: caml_backtrace_status, + caml_ml_debug_info_status: caml_ml_debug_info_status, + caml_record_backtrace_flag: caml_record_backtrace_flag, + caml_floatarray_create: caml_floatarray_create, + caml_make_float_vect: caml_make_float_vect, + caml_make_vect: caml_make_vect, + caml_check_bound: caml_check_bound, + caml_array_fill: caml_array_fill, + caml_array_get: caml_array_get, + caml_array_set: caml_array_set, + caml_floatarray_blit: caml_floatarray_blit, + caml_array_blit: caml_array_blit, + caml_array_concat: caml_array_concat, + caml_array_append: caml_array_append, + caml_array_sub: caml_array_sub}; + var + cst_Assert_failure = "Assert_failure", + cst_Division_by_zero = "Division_by_zero", + cst_End_of_file = "End_of_file", + cst_Failure = "Failure", + cst_Invalid_argument = "Invalid_argument", + cst_Match_failure = "Match_failure", + cst_Not_found = "Not_found", + cst_Out_of_memory = "Out_of_memory", + cst_Stack_overflow = "Stack_overflow", + cst_Sys_blocked_io = "Sys_blocked_io", + cst_Sys_error = "Sys_error", + cst_Undefined_recursive_module = "Undefined_recursive_module"; + caml_fs_init(); + caml_register_global(0, [248, cst_Out_of_memory, -1], cst_Out_of_memory); + caml_register_global(1, [248, cst_Sys_error, -2], cst_Sys_error); + caml_register_global(2, [248, cst_Failure, -3], cst_Failure); + caml_register_global + (3, [248, cst_Invalid_argument, -4], cst_Invalid_argument); + caml_register_global(4, [248, cst_End_of_file, -5], cst_End_of_file); + caml_register_global + (5, [248, cst_Division_by_zero, -6], cst_Division_by_zero); + caml_register_global(6, [248, cst_Not_found, -7], cst_Not_found); + caml_register_global(7, [248, cst_Match_failure, -8], cst_Match_failure); + caml_register_global(8, [248, cst_Stack_overflow, -9], cst_Stack_overflow); + caml_register_global(9, [248, cst_Sys_blocked_io, -10], cst_Sys_blocked_io); + caml_register_global + (10, [248, cst_Assert_failure, -11], cst_Assert_failure); + caml_register_global + (11, + [248, cst_Undefined_recursive_module, -12], + cst_Undefined_recursive_module); + return; + } + (globalThis)); + + +(function(a){"use strict";var +dB="Fmlib_browser__Attribute",dA="Js_of_ocaml__EventSource",hf=271,hg="Base__String0",dy="Sexplib0",dz="Fmlib_browser__Task",hd=151,he=273,dx="Stdlib__Seq",du="Base__Container_intf",dv="Js_of_ocaml__Url",dw="Base__List1",hb="Base__Blit_intf",hc="Circles",ds=158,dt=272,ha="Base__Binary_searchable",dq="Base__Map_intf",dr="Base__Int32",dp="Base__Hashable",dn="Stdlib__BytesLabels",dm=115,dl="Base__Equal",g$="Sexplib0__Sexp_conv",dk="Base__Int_intf",g8="Fmlib_std__Array",g9="Ppx_compare_lib",g_=239,g7=221,dj="Fmlib_std__Void",dh="Stdlib__Printf",di=299,g3=261,g4=241,g5=105,g6="Base__Comparable",df="Ppx_inline_test_lib__Runtime",dg=102,g1="CamlinternalLazy",g2="Js_of_ocaml__Dom_svg",dd="Stdlib__String",de=152,gY="Sexplib0__Sexp",gZ=213,g0=150,dc="Stdlib__Result",gW="Base__Linked_queue",gX=212,gU="Fmlib_std__Btree",gV=179,c$=266,da="Base__Invariant_intf",db="Base__Pretty_printer",c9="Js_of_ocaml__Import",c_=287,gT=247,c7="Base__Monad_intf",c8=167,gR="Stdlib__Random",gS="Base__Int63_emul",gP=116,gQ=161,c6="Base__Word_size",gN="Fmlib_browser__Time",gO=126,c5="Failure",gL="Stdlib__Oo",gM="Base__Sexp_with_comparable",gK=121,gI="Base__Applicative_intf",gJ="Base__Nothing",c2="CamlinternalOO",c3=214,c4=195,cY="Stdlib__Array",cZ=256,c0="Fmlib_browser__Event_flag",c1="Base__Uchar",gH="Base__Linked_queue0",cX="Fmlib_js__Event_target",cW="Base__Int64",gG=111,cV=293,gE=201,gF="Base__Comparable_intf",cU="Base__Import",gD=270,cT="Fmlib_std__Option",gB="Stdlib__Lazy",gC="Inline_test_config",cQ="Stdlib__Map",cR="Stdlib__Char",cS=148,cO=193,cP="Stdlib__Ephemeron",gz=252,gA="Base__Buffer_intf",cN="Base__List0",cM=259,gy="Fmlib_browser__Subscription",cK="Stdlib__In_channel",cL="Base__Int_math",gw="Stdlib",gx="Base__Map",gv="Base__Floatable",cJ="Base__Sign",gu=125,cI=211,gt="Base__Intable",cH=219,gs="Js_of_ocaml__Geolocation",cG=240,gp="Stdlib__Bytes",gq="Base__Ordered_collection_common0",gr=103,cF=178,gm="Stdlib__Unit",gn="Stdlib__Option",go="Js_of_ocaml__IntersectionObserver",cE="Base__Stringable",gk="Base__Unit",gl="Base__Set",cB=297,cC=301,cD=202,gi="Base__Or_error",gj=170,cz="Stdlib__Complex",cA="Stdlib__StdLabels",gh="Stdlib__Float",cy=295,ge="Js_of_ocaml__WebGL",gf="Base__Ordered_collection_common",gg="Base__Bytes",gd="Assert_failure",cx="Base__Info",gb="Base__Variant",gc="Base__Char",cw="Base__Hashable_intf",f$="Base__Stack_intf",ga=224,cv=145,ct=260,cu=204,cs="Js_of_ocaml__Worker",f_=222,co=257,cp="Base__Result",cq="Std_exit",cr="Base__Sexpable",f7=123,f8=191,f9="Stdlib__MoreLabels",f6="Base__Ppx_enumerate_lib",f5="Fmlib_std__Deque",f4=281,f3="Base__Bytes_tr",f2="Stdlib__Obj",f1=249,cn="Js_of_ocaml__Json",f0=248,fX="Sexplib0__",fY=231,fZ="Base",cj="Jsoo_runtime__",ck="CamlinternalMod",cl="Base__Error",cm="Base__Array_permute",ci="Base__Formatter",fW=133,ch=138,fT=277,fU="Js_of_ocaml__Js",fV=187,cg="Base__Hex_lexer",ce="Stdlib__Bigarray",cf=104,fS=253,cd=128,ca="Invalid_argument",cb="Fmlib_browser__Dictionary",cc="Fmlib_browser__Subscriptions",fR=122,b$=113,fQ=106,fP="Base__Uniform_array",b9=278,b_="Stdlib__Scanf",fO=119,b7="Base__Ppx_compare_lib",b8="Fmlib_browser__Random",fN="Fmlib_std__Interfaces",fM="Js_of_ocaml__Dom_html",fL="Base__Float",fK="Js_of_ocaml__",b3="Stdlib__Bool",b4="Division_by_zero",b5=292,b6="Base__Hash_set_intf",fI=258,fJ=101,b2=185,fH=199,b1="Base__Uchar0",fG=274,b0=140,fF=169,bY=223,bZ=208,fE="Stdlib__Domain",fC=175,fD="Base__Char0",bW=130,bX=242,fz="Stdlib__Mutex",fA=117,fB="Base__Sys0",fy="Fmlib_js__Dom",bV=107,fx=127,bT="Stdlib__StringLabels",bU="Base__Ordering",fv=114,fw="CamlinternalFormatBasics",bR="Js_of_ocaml__XmlHttpRequest",bS=244,bQ=229,ft="Stdlib__Uchar",fu="Base__Queue",bP=184,fs=153,bO=124,fq=109,fr=283,bK="Sys_error",bL=302,bM="Fmlib_browser__Command",bN="Base__Identifiable_intf",fp="Base__Binary_searchable_intf",bJ="Ppx_hash_lib",fm="Stdlib__Lexing",fn="CamlinternalFormat",fo=171,bI="Base__Blit",bH="Stdlib__Int",bF="Js_of_ocaml__Jstable",bG="Base__Field",fk=188,fl="End_of_file",bC="Base__Either0",bD=263,bE="Base__Hash_intf",fh=286,fi="Base__Hash_set",fj=251,bA=142,bB="Base__String",fg="Base__Avltree",bz="Fmlib_browser__Vdom",fe="Stack_overflow",ff="Base__Poly0",by="Stdlib__Nativeint",bx="Base__Monad",fd="Base__Pow_overflow_bounds",bw="Base__Int0",fb=118,fc="Base__Hashtbl",bv=216,bu="Js_of_ocaml__File",fa="Fmlib_browser",bt=282,e$="Stdlib__Fun",br=159,bs=289,e9="Base__Sys",e_=149,e7=269,e8="Stdlib__Weak",e6="Fmlib_std__List",bp=238,bq=132,e5=197,bo=176,e4="Base__Maybe_bound",bm="Stdlib__ArrayLabels",bn="Base__Binary_search",e3="Stdlib__Buffer",bk=144,bl="Js_of_ocaml__ResizeObserver",bi="Fmlib_std__String",bj="Base__Set_intf",bh="Base__Ppx_hash_lib",e2=290,bf="Stdlib__Out_channel",bg="Base__T",e1="Base__Fieldslib",be="Base__",ba="Stdlib__Either",bb=183,bc=129,bd=165,a_=215,a$=146,eY="Fmlib_browser__Browser",eZ=225,e0=182,a9="Base__Indexed_container",eX="Base__Bytes0",a8="Base__Sexp",eW="Stdlib__Sys",a6="Base__Queue_intf",a7="Base__Obj_array",eV=255,eU="Ppx_sexp_conv_lib",a4="Fmlib_js__Base",a5=235,eT=228,a3=163,eS="Base__Array0",eR=220,a2=168,a1=164,aX="Js_of_ocaml__Dom",aY=218,aZ="Fmlib_browser__Url",a0=205,eQ="Fmlib_browser__Handler",aV="Fmlib_std__Int",aW=139,aT="Not_found",aU="Base__Lazy",eO="Sexplib0__Sexp_conv_grammar",eP=254,aQ="Js_of_ocaml__PerformanceObserver",aR="Base__Source_code_position",aS=246,aP="Base__Int63",aO="Base__Option",eN="Stdlib__Digest",aN=233,eM="Stdlib__Callback",aM="Js_of_ocaml__Form",eL=294,aL=262,aK=276,aI="Base__Random_repr",aJ="Base__List",eK=134,aG="Stdlib__Printexc",aH=296,eJ=131,eI=196,aF=206,eH="Fmlib_js__Event",eF="Js_of_ocaml__CSS",eG=190,aC="Js_of_ocaml__Lib_version",aD=288,aE="Base__Container",eC="Js_of_ocaml__Typed_array",eD=194,eE="Base__Hash",aA="Base__Option_array",aB=236,az=298,eB="Base__Applicative",aw="Out_of_memory",ax=268,ay="Base__Identifiable",eA=177,at="Shadow_stdlib",au="Js_of_ocaml__Intl",av="Base__Sign0",aq="Js_of_ocaml__Sys_js",ar=267,as="Base__Int_conversions",ez=173,an="Base__With_return",ao=203,ap="Base__Bool",al="Stdlib__Filename",am="Base__Info_intf",ey="Stdlib__Semaphore",ai=156,aj="Js_of_ocaml__MutationObserver",ak="Base__Popcount",ex="Stdlib__Marshal",ag=280,ah="Base__Staged",ew="Js_of_ocaml__Regexp",ev="Stdlib__Set",af="Base__Exn",ae="Js_of_ocaml__Dom_events",ad="Sys_blocked_io",es="Base__Comparator",et=275,eu="Base__Stack",er=110,eq=217,ep="Fmlib_js__Date",ac="Base__Source_code_position0",en="Stdlib__Queue",eo=143,$="Stdlib__Parsing",aa=198,ab="Fmlib_browser__",_="Fmlib_std__Rb_array",Y=210,Z=285,el=112,em="Base__Array",X=227,ek="Base__Hasher",ej="Js_of_ocaml",W="Base__Int",U="Stdlib__Condition",V="Fmlib_browser__Assert_failure",eh="Ppx_enumerate_lib",ei=209,eg="Fmlib_js__Timer",ef=291,T=174,R=230,S="Sexplib0__Sexp_conv_error",ed="Caml",ee=237,Q="Fmlib_std__",ec="Fmlib_std__Result",O="Stdlib__Format",P="Base__Fn",ea="Match_failure",eb="Fmlib_js__Web_worker",d8=147,d9=192,d_="Base__Float0",d$="Base__Either",N=166,M="Sexplib0__Sexp_grammar",d7="Base__Invariant",d6=154,L="Base__Either_intf",J="Jsoo_runtime",K=172,H="Stdlib__Effect",I="Fmlib_js__Http_request",d5=186,G="Ppx_inline_test_lib",F=245,d2="Js_of_ocaml__Firebug",d3="Base__Buffer",d4="Base__Backtrace",D="Base__Variantslib",E=226,d1="Base__Nativeint",C="Base__Sign_or_nan",d0=120,B="Stdlib__Arg",dY="Base__Import0",dZ="Base__Indexed_container_intf",A=207,w=135,x=155,y="Jsoo_runtime__Runtime_version",z=136,dW="Stdlib__List",dX="Base__Sequence",dV="Stdlib__Atomic",v=100,dU=157,u=232,dT="Sexplib0__Sexpable",t=162,dS="Stdlib__Int64",dQ="Base__Comparisons",dR=300,r=180,s=284,dP="Fmlib_js__",q=189,dO="Stdlib__Gc",p=250,m="Base__Printf",n="Stdlib__ListLabels",o="Stdlib__Hashtbl",k="Base_internalhash_types",l="Base__Hashtbl_intf",dM="Stdlib__Int32",dN="Base__Random",dL=137,i="Base__Type_equal",j=234,dJ=264,dK="Stdlib__Stack",g=279,h=141,dE="Js_of_ocaml__WebSockets",dF=108,dG="Jane_street_headers",dH="Base__Ref",dI=243,e=160,f=200,dC="Undefined_recursive_module",dD=265,c="Time_now",d=181,hh=a.jsoo_runtime,b=hh.caml_get_global_data();b.prim_count=867;var +hi=[2,fZ],hj=[2,eB],hk=[2,em],hl=[0,0,[2,fg],aS,[0,0,[2,d4],eP,0,1],2],hm=[2,cm],hn=[0,0,[2,bI],q,0,1],ho=[2,fp],hp=[0,0,[2,ha],fV,0,1],hq=[0,0,[2,gg],bZ,0,1],hr=[2,gA],hs=[0,0,[2,ap],bX,[0,0,[2,d3],fS,0,1],2],ht=[2,gc],hu=[0,0,[2,f3],a0,0,1],hv=[2,gF],hw=[0,0,[2,g6],eA,0,1],hx=[2,aE],hy=[2,d$],hz=[0,0,[2,cl],K,0,1],hA=[2,dl],hB=[0,0,[2,L],eG,0,1],hC=[0,0,[2,P],c8,0,1],hD=[2,gv],hE=[0,[0,0,[2,bG],de,[0,0,[2,e1],fj,0,1],2],[2,fL],p,[0,0,[2,d_],cD,0,1],3],hF=[0,[0,[0,0,[2,fi],f1,0,1],[2,b6],f0,0,2],[2,dp],gV,0,3],hG=[2,bE],hH=[0,0,[2,eE],bq,0,1],hI=[0,[0,0,[2,ay],e0,0,1],[2,bN],d,[0,0,[2,cU],z,0,1],2],hJ=[2,cg],hK=[0,0,[2,ek],X,[0,[0,0,[2,fc],gT,0,1],[2,l],F,0,2],3],hL=[2,dZ],hM=[0,0,[2,a9],c4,0,1],hN=[0,0,[2,W],eq,0,1],hO=[2,am],hP=[0,0,[2,cW],cG,0,1],hQ=[2,gS],hR=[0,0,[2,dr],dI,[0,0,[2,aP],bS,0,1],2],hS=[0,0,[2,d7],ez,0,1],hT=[2,gt],hU=[0,0,[2,dk],gX,[0,0,[2,cL],c3,0,1],2],hV=[0,0,[2,gW],g_,0,1],hW=[2,aU],hX=[2,aJ],hY=[0,[0,0,[2,gx],ee,0,1],[2,dq],bQ,0,2],hZ=[2,dw],h0=[2,bx],h1=[2,a7],h2=[0,[0,0,[2,d1],aB,0,1],[2,gJ],a5,0,2],h3=[2,aA],h4=[2,gf],h5=[2,bU],h6=[2,ak],h7=[2,f6],h8=[2,db],h9=[2,dN],h_=[0,[0,0,[2,fu],j,0,1],[2,a6],aN,0,2],h$=[2,dH],ia=[2,bj],ib=[0,0,[2,gl],fY,0,1],ic=[0,[0,0,[2,C],eZ,0,1],[2,aR],ga,0,2],id=[2,av],ie=[0,[0,0,[2,gM],E,0,1],[2,cr],d9,[0,0,[2,cJ],bv,0,1],2],ig=[0,0,[2,bB],A,0,1],ih=[2,ah],ii=[0,[0,0,[2,eu],bY,0,1],[2,f$],g7,0,2],ij=[2,cE],ik=[0,0,[2,b1],f,0,1],il=[2,c1],im=[0,[0,0,[2,bg],eR,0,1],[2,i],cH,0,2],io=[2,gk],ip=[2,D],iq=[2,c6],ir=[2,ed],is=[2,fw],it=[0,0,[2,hc],cC,0,1],iu=[2,c2],iv=[0,0,[2,ck],64,0,1],iw=[2,fl],ix=[0,[0,0,[2,eY],di,0,1],[2,bM],az,0,2],iy=[2,dB],iz=[0,[0,0,[2,fa],dR,0,1],[2,ab],Z,[0,0,[2,V],cV,0,1],2],iA=[0,[0,0,[2,b8],eL,0,1],[2,gy],aH,[0,[0,0,[2,cc],cB,0,1],[2,dz],cy,0,2],3],iB=[2,eQ],iC=[0,0,[2,c0],c_,0,1],iD=[2,dP],iE=[0,0,[2,aZ],bs,[0,0,[2,bz],b5,0,1],2],iF=[2,eH],iG=[0,[0,0,[2,ep],s,0,1],[2,fy],fr,0,2],iH=[0,0,[2,eb],f4,0,1],iI=[2,eg],iJ=[0,0,[2,I],bt,0,1],iK=[2,f5],iL=[0,0,[2,gU],et,0,1],iM=[0,0,[2,dj],dD,[0,0,[2,gC],er,0,1],2],iN=[2,bi],iO=[0,[0,[0,0,[2,e6],he,0,1],[2,cT],gD,[0,0,[2,_],dt,0,1],2],[2,ec],ax,0,3],iP=[0,0,[2,eF],fJ,0,1],iQ=[2,fK],iR=[0,[0,0,[2,dG],cZ,0,1],[2,ej],fq,0,2],iS=[0,0,[2,g2],gr,[0,0,[2,dA],cf,0,1],2],iT=[2,fM],iU=[0,0,[2,ae],dg,0,1],iV=[0,0,[2,gs],fQ,0,1],iW=[2,aM],iX=[0,0,[2,d2],g5,0,1],iY=[0,[0,0,[2,cn],v,0,1],[2,bF],99,0,2],iZ=[2,fU],i0=[0,0,[2,go],bV,[0,0,[2,au],dF,0,1],2],i1=[2,aQ],i2=[0,0,[2,aj],98,0,1],i3=[2,bl],i4=[2,ge],i5=[0,0,[2,dv],93,0,1],i6=[2,y],i7=[2,g9],i8=[0,0,[2,G],aL,[0,0,[2,df],bD,0,1],2],i9=[2,bJ],i_=[2,fX],i$=[0,0,[2,S],fb,0,1],ja=[2,g$],jb=[0,0,[2,at],gK,0,1],jc=[2,dT],jd=[2,cq],je=[2,dn],jf=[2,eN],jg=[2,H],jh=[0,0,[2,al],66,0,1],ji=[2,cP],jj=[2,O],jk=[0,0,[2,cK],74,0,1],jl=[2,o],jm=[2,n],jn=[2,f9],jo=[0,0,[2,bf],75,0,1],jp=[2,gn],jq=[0,0,[2,gL],63,0,1],jr=[2,dh],js=[0,0,[2,aG],51,0,1],jt=[2,gR],ju=[2,ey],jv=[0,0,[2,b_],60,0,1],jw=[0,0,[2,cA],73,0,1],jx=[2,dK],jy=[2,e8],jz=[2,c];b.toc=[0,[0,"SYMB",[0,303,[0,[0,[0,[0,[0,[0,[0,0,[2,gd],0,[0,0,hi,eV,0,1],2],[2,be],fR,[0,[0,0,hj,d8,0,1],[2,gI],a$,[0,0,hk,e5,0,1],2],3],[2,eS],fx,[0,[0,[0,0,hm,bd,hl,3],[2,bn],b2,[0,hp,ho,d5,hn,2],4],[2,hb],fk,[0,[0,hs,hr,gz,hq,3],[2,eX],cS,[0,hu,ht,ao,0,2],4],5],6],[2,fD],cd,[0,[0,[0,[0,hw,hv,bo,0,2],[2,es],e_,0,3],[2,dQ],g0,[0,[0,0,hx,br,0,1],[2,du],ds,[0,0,hy,cO,0,1],2],4],[2,bC],hd,[0,[0,[0,hB,hA,N,hz,2],[2,af],b0,[0,hE,hD,gE,hC,4],5],[2,ci],ch,[0,[0,hH,hG,bc,hF,4],[2,cw],cF,[0,hK,hJ,ei,hI,4],5],6],7],8],[2,dY],bO,[0,[0,[0,[0,[0,hM,hL,eD,0,2],[2,cx],fo,[0,0,hO,gQ,hN,2],3],[2,bw],bW,[0,[0,hR,hQ,g4,hP,3],[2,as],Y,[0,hU,hT,cI,hS,3],4],5],[2,da],x,[0,[0,[0,0,hW,e,hV,2],[2,gH],bp,[0,0,hX,gj,0,1],3],[2,cN],eJ,[0,[0,0,hZ,ai,hY,3],[2,e4],eT,[0,0,h0,cv,0,1],4],5],6],[2,c7],bk,[0,[0,[0,[0,h2,h1,aa,0,3],[2,aO],f8,[0,0,h3,f_,0,1],4],[2,gi],T,[0,[0,0,h4,bP,0,1],[2,gq],t,[0,0,h5,a2,0,1],2],5],[2,ff],f7,[0,[0,[0,0,h6,a_,0,1],[2,fd],gZ,0,2],[2,b7],fW,[0,[0,0,h7,cu,0,1],[2,bh],eK,[0,0,h8,aW,0,1],2],3],6],7],9],[2,m],gu,[0,[0,[0,[0,[0,[0,h_,h9,a1,0,3],[2,aI],a3,[0,0,h$,u,0,1],4],[2,cp],dU,[0,0,[2,dX],eI,[0,ib,ia,R,0,2],3],5],[2,a8],w,[0,[0,[0,ie,id,fC,ic,3],[2,ac],d6,[0,ii,ih,aF,ig,3],4],[2,hg],fs,[0,[0,0,ij,r,0,1],[2,e9],fF,0,2],5],6],[2,fB],gO,[0,[0,[0,[0,im,il,aY,ik,3],[2,fP],fH,[0,0,io,bb,0,1],4],[2,gb],bA,[0,[0,0,ip,eo,0,1],[2,an],h,[0,0,iq,dL,0,1],2],5],[2,k],gG,[0,[0,[0,0,ir,el,0,1],[2,fn],48,[0,0,is,12,0,1],2],[2,g1],18,[0,[0,iv,iu,62,it,2],[2,b4],1,[0,0,iw,2,0,1],3],4],6],7],[2,c5],3,[0,[0,[0,[0,[0,iz,iy,ef,ix,3],[2,cb],fh,[0,iC,iB,e2,iA,4],5],[2,gN],aD,[0,[0,iE,iD,aK,0,3],[2,a4],fT,[0,iG,iF,b9,0,3],4],6],[2,cX],g,[0,[0,[0,iJ,iI,ag,iH,2],[2,Q],dJ,0,3],[2,g8],hf,[0,[0,iL,iK,fG,0,2],[2,aV],e7,0,3],4],7],[2,fN],c$,[0,[0,[0,[0,iO,iN,ar,iM,4],[2,ca],4,[0,iR,iQ,80,iP,3],5],[2,aX],83,[0,[0,iU,iT,86,iS,3],[2,bu],85,[0,iX,iW,87,iV,2],4],6],[2,c9],81,[0,[0,[0,i0,iZ,82,iY,3],[2,aC],94,[0,i2,i1,97,0,2],4],[2,ew],92,[0,[0,0,i3,96,0,1],[2,aq],95,0,2],5],7],8],9],10],[2,eC],84,[0,[0,[0,[0,[0,[0,[0,i5,i4,91,0,2],[2,dE],90,0,3],[2,cs],89,[0,0,[2,bR],88,0,1],4],[2,J],79,[0,[0,0,[2,cj],77,[0,0,i6,78,0,1],2],[2,ea],5,[0,0,[2,aT],6,0,1],3],5],[2,aw],7,[0,[0,[0,[0,0,i7,fI,0,1],[2,eh],cM,[0,0,i9,ct,i8,3],4],[2,eU],co,[0,0,[2,dy],d0,[0,0,i_,b$,0,1],2],5],[2,gY],fv,[0,[0,[0,0,ja,fA,i$,2],[2,eO],gP,0,3],[2,M],dm,[0,[0,0,jc,fO,jb,2],[2,fe],8,[0,0,jd,bL,0,1],3],4],6],7],[2,gw],13,[0,[0,[0,[0,0,[2,B],50,0,1],[2,cY],32,[0,0,[2,bm],68,0,1],2],[2,dV],17,[0,0,[2,ce],55,0,1],3],[2,b3],23,[0,[0,[0,0,[2,e3],43,0,1],[2,gp],28,[0,[0,0,je,70,0,1],[2,eM],61,0,2],3],[2,cR],24,[0,[0,0,[2,cz],67,0,1],[2,U],45,[0,[0,0,jf,54,0,1],[2,fE],47,[0,0,jg,76,0,1],2],3],4],5],8],[2,ba],14,[0,[0,[0,[0,[0,[0,0,ji,65,jh,2],[2,gh],33,[0,0,jj,59,0,1],3],[2,e$],52,[0,0,[2,dO],53,[0,0,jl,57,jk,2],3],4],[2,bH],27,[0,0,[2,dM],34,[0,0,[2,dS],35,0,1],2],5],[2,gB],19,[0,[0,[0,0,[2,fm],37,0,1],[2,dW],26,[0,[0,0,jm,69,0,1],[2,cQ],40,0,2],3],[2,ex],31,[0,[0,[0,0,jn,72,0,1],[2,fz],44,0,2],[2,by],36,0,3],4],6],[2,f2],16,[0,[0,[0,[0,[0,jq,jp,21,jo,2],[2,$],38,[0,js,jr,49,0,2],3],[2,en],42,[0,[0,0,jt,56,0,1],[2,dc],22,[0,jv,ju,46,0,2],3],4],[2,dx],20,[0,[0,0,[2,ev],39,[0,0,jx,41,jw,2],3],[2,dd],29,[0,0,[2,bT],71,0,1],4],5],[2,eW],15,[0,[0,0,[2,ft],25,[0,0,[2,gm],30,[0,0,jy,58,0,1],2],3],[2,ad],9,[0,0,[2,bK],10,[0,[0,0,jz,g3,0,1],[2,dC],11,0,2],3],4],6],7],9],11]]],[0,[0,"SYJS",[0,[0,dC,11],[0,c,g3],[0,bK,10],[0,ad,9],[0,e8,58],[0,gm,30],[0,ft,25],[0,eW,15],[0,bT,71],[0,dd,29],[0,cA,73],[0,dK,41],[0,ev,39],[0,dx,20],[0,ey,46],[0,b_,60],[0,dc,22],[0,gR,56],[0,en,42],[0,dh,49],[0,aG,51],[0,$,38],[0,bf,75],[0,gn,21],[0,gL,63],[0,f2,16],[0,by,36],[0,fz,44],[0,f9,72],[0,ex,31],[0,cQ,40],[0,n,69],[0,dW,26],[0,fm,37],[0,gB,19],[0,dS,35],[0,dM,34],[0,bH,27],[0,cK,74],[0,o,57],[0,dO,53],[0,e$,52],[0,O,59],[0,gh,33],[0,al,66],[0,cP,65],[0,ba,14],[0,H,76],[0,fE,47],[0,eN,54],[0,U,45],[0,cz,67],[0,cR,24],[0,eM,61],[0,dn,70],[0,gp,28],[0,e3,43],[0,b3,23],[0,ce,55],[0,dV,17],[0,bm,68],[0,cY,32],[0,B,50],[0,gw,13],[0,cq,bL],[0,fe,8],[0,at,gK],[0,dT,fO],[0,M,dm],[0,eO,gP],[0,S,fb],[0,g$,fA],[0,gY,fv],[0,fX,b$],[0,dy,d0],[0,eU,co],[0,df,bD],[0,G,aL],[0,bJ,ct],[0,eh,cM],[0,g9,fI],[0,aw,7],[0,aT,6],[0,ea,5],[0,y,78],[0,cj,77],[0,J,79],[0,bR,88],[0,cs,89],[0,dE,90],[0,ge,91],[0,dv,93],[0,eC,84],[0,aq,95],[0,bl,96],[0,ew,92],[0,aQ,97],[0,aj,98],[0,aC,94],[0,bF,99],[0,cn,v],[0,fU,82],[0,au,dF],[0,go,bV],[0,c9,81],[0,gs,fQ],[0,aM,87],[0,d2,g5],[0,bu,85],[0,dA,cf],[0,g2,gr],[0,fM,86],[0,ae,dg],[0,aX,83],[0,eF,fJ],[0,fK,80],[0,ej,fq],[0,dG,cZ],[0,ca,4],[0,gC,er],[0,dj,dD],[0,bi,ar],[0,ec,ax],[0,_,dt],[0,cT,gD],[0,e6,he],[0,fN,c$],[0,aV,e7],[0,f5,fG],[0,gU,et],[0,g8,hf],[0,Q,dJ],[0,eb,f4],[0,eg,ag],[0,I,bt],[0,cX,g],[0,eH,b9],[0,fy,fr],[0,ep,s],[0,a4,fT],[0,dP,aK],[0,bz,b5],[0,aZ,bs],[0,gN,aD],[0,dz,cy],[0,cc,cB],[0,gy,aH],[0,b8,eL],[0,eQ,e2],[0,c0,c_],[0,cb,fh],[0,bM,az],[0,eY,di],[0,dB,ef],[0,V,cV],[0,ab,Z],[0,fa,dR],[0,c5,3],[0,fl,2],[0,b4,1],[0,hc,cC],[0,c2,62],[0,ck,64],[0,g1,18],[0,fw,12],[0,fn,48],[0,ed,el],[0,k,gG],[0,c6,dL],[0,an,h],[0,D,eo],[0,gb,bA],[0,gk,bb],[0,fP,fH],[0,b1,f],[0,c1,aY],[0,i,cH],[0,bg,eR],[0,fB,gO],[0,e9,fF],[0,cE,r],[0,hg,fs],[0,bB,A],[0,ah,aF],[0,f$,g7],[0,eu,bY],[0,ac,d6],[0,aR,ga],[0,C,eZ],[0,av,fC],[0,cJ,bv],[0,cr,d9],[0,gM,E],[0,a8,w],[0,bj,R],[0,gl,fY],[0,dX,eI],[0,cp,dU],[0,dH,u],[0,aI,a3],[0,dN,a1],[0,a6,aN],[0,fu,j],[0,m,gu],[0,db,aW],[0,bh,eK],[0,f6,cu],[0,b7,fW],[0,fd,gZ],[0,ak,a_],[0,ff,f7],[0,bU,a2],[0,gq,t],[0,gf,bP],[0,gi,T],[0,aA,f_],[0,aO,f8],[0,a7,aa],[0,gJ,a5],[0,d1,aB],[0,c7,bk],[0,bx,cv],[0,e4,eT],[0,dq,bQ],[0,gx,ee],[0,dw,ai],[0,cN,eJ],[0,aJ,gj],[0,gH,bp],[0,gW,g_],[0,aU,e],[0,da,x],[0,d7,ez],[0,gt,cI],[0,cL,c3],[0,dk,gX],[0,as,Y],[0,cW,cG],[0,gS,g4],[0,aP,bS],[0,dr,dI],[0,bw,bW],[0,W,eq],[0,am,gQ],[0,cx,fo],[0,dZ,eD],[0,a9,c4],[0,dY,bO],[0,cU,z],[0,bN,d],[0,ay,e0],[0,cg,ei],[0,l,F],[0,fc,gT],[0,ek,X],[0,cw,cF],[0,dp,gV],[0,b6,f0],[0,fi,f1],[0,bE,bc],[0,eE,bq],[0,ci,ch],[0,P,c8],[0,gv,gE],[0,d_,cD],[0,fL,p],[0,e1,fj],[0,bG,de],[0,af,b0],[0,cl,K],[0,dl,N],[0,L,eG],[0,bC,hd],[0,d$,cO],[0,du,ds],[0,aE,br],[0,dQ,g0],[0,es,e_],[0,gF,bo],[0,g6,eA],[0,fD,cd],[0,gc,ao],[0,f3,a0],[0,eX,cS],[0,gg,bZ],[0,gA,gz],[0,d3,fS],[0,ap,bX],[0,hb,fk],[0,bI,q],[0,fp,d5],[0,ha,fV],[0,bn,b2],[0,d4,eP],[0,fg,aS],[0,cm,bd],[0,eS,fx],[0,em,e5],[0,gI,a$],[0,eB,d8],[0,be,fR],[0,fZ,eV],[0,gd,0]]],[0,[0,"CRCS",0],[0,[0,"PRIM","%caml_format_int_special\0%direct_int_div\0%direct_int_mod\0%direct_int_mul\0%identity\0%int_add\0%int_and\0%int_asr\0%int_div\0%int_lsl\0%int_lsr\0%int_mod\0%int_mul\0%int_neg\0%int_or\0%int_sub\0%int_xor\0Base_am_testing\0Base_caml_exn_is_most_recent_exn\0Base_clear_caml_backtrace_pos\0Base_hash_double\0Base_hash_string\0Base_int_math_int32_clz\0Base_int_math_int32_ctz\0Base_int_math_int64_clz\0Base_int_math_int64_ctz\0Base_int_math_int64_pow_stub\0Base_int_math_int_clz\0Base_int_math_int_ctz\0Base_int_math_int_popcount\0Base_int_math_int_pow_stub\0Base_int_math_nativeint_clz\0Base_int_math_nativeint_ctz\0Base_internalhash_fold_float\0Base_internalhash_fold_int\0Base_internalhash_fold_int64\0Base_internalhash_fold_string\0Base_internalhash_get_hash_value\0BigStringReader\0MlBytes\0MlFakeDevice\0MlFakeFd\0MlFakeFd_out\0MlFakeFile\0MlFile\0MlInt64\0MlMutex\0MlNat\0MlNodeDevice\0MlNodeFd\0MlObjectTable\0MlStringReader\0Ml_Bigarray\0Ml_Bigarray_c_1_1\0UInt8ArrayReader\0add_nat\0bigstring_of_array_buffer\0bigstring_of_typed_array\0bigstring_to_array_buffer\0bigstring_to_typed_array\0blit_nat\0caml_MD5Final\0caml_MD5Init\0caml_MD5Transform\0caml_MD5Update\0caml_abs_float\0caml_acos_float\0caml_acosh_float\0caml_add_float\0caml_alloc_dummy\0caml_alloc_dummy_float\0caml_alloc_dummy_infix\0caml_alloc_stack\0caml_argv\0caml_array_append\0caml_array_blit\0caml_array_bound_error\0caml_array_concat\0caml_array_fill\0caml_array_get\0caml_array_get_addr\0caml_array_get_float\0caml_array_of_bytes\0caml_array_of_string\0caml_array_set\0caml_array_set_addr\0caml_array_set_float\0caml_array_sub\0caml_array_unsafe_get\0caml_array_unsafe_get_float\0caml_array_unsafe_set\0caml_array_unsafe_set_float\0caml_asin_float\0caml_asinh_float\0caml_atan2_float\0caml_atan_float\0caml_atanh_float\0caml_atomic_cas\0caml_atomic_exchange\0caml_atomic_fetch_add\0caml_atomic_load\0caml_ba_blit\0caml_ba_change_layout\0caml_ba_compare\0caml_ba_create\0caml_ba_create_buffer\0caml_ba_create_from\0caml_ba_create_unsafe\0caml_ba_custom_name\0caml_ba_deserialize\0caml_ba_dim\0caml_ba_dim_1\0caml_ba_dim_2\0caml_ba_dim_3\0caml_ba_fill\0caml_ba_from_typed_array\0caml_ba_get_1\0caml_ba_get_2\0caml_ba_get_3\0caml_ba_get_generic\0caml_ba_get_size\0caml_ba_get_size_per_element\0caml_ba_hash\0caml_ba_init\0caml_ba_kind\0caml_ba_kind_of_typed_array\0caml_ba_layout\0caml_ba_map_file\0caml_ba_map_file_bytecode\0caml_ba_num_dims\0caml_ba_reshape\0caml_ba_serialize\0caml_ba_set_1\0caml_ba_set_2\0caml_ba_set_3\0caml_ba_set_generic\0caml_ba_slice\0caml_ba_sub\0caml_ba_to_typed_array\0caml_ba_uint8_get16\0caml_ba_uint8_get32\0caml_ba_uint8_get64\0caml_ba_uint8_set16\0caml_ba_uint8_set32\0caml_ba_uint8_set64\0caml_backtrace_status\0caml_bigstring_blit_ba_to_ba\0caml_bigstring_blit_ba_to_bytes\0caml_bigstring_blit_bytes_to_ba\0caml_bigstring_blit_string_to_ba\0caml_bigstring_memcmp\0caml_blit_bytes\0caml_blit_string\0caml_bswap16\0caml_build_symbols\0caml_bytes_bound_error\0caml_bytes_compare\0caml_bytes_equal\0caml_bytes_get\0caml_bytes_get16\0caml_bytes_get32\0caml_bytes_get64\0caml_bytes_greaterequal\0caml_bytes_greaterthan\0caml_bytes_lessequal\0caml_bytes_lessthan\0caml_bytes_notequal\0caml_bytes_of_array\0caml_bytes_of_jsbytes\0caml_bytes_of_string\0caml_bytes_of_utf16_jsstring\0caml_bytes_set\0caml_bytes_set16\0caml_bytes_set32\0caml_bytes_set64\0caml_bytes_unsafe_get\0caml_bytes_unsafe_set\0caml_call_gen\0caml_callback\0caml_cbrt_float\0caml_ceil_float\0caml_channel_descriptor\0caml_check_bound\0caml_classify_float\0caml_compare\0caml_compare_val\0caml_compare_val_get_custom\0caml_compare_val_number_custom\0caml_compare_val_tag\0caml_continuation_use_and_update_handler_noexc\0caml_continuation_use_noexc\0caml_convert_bytes_to_array\0caml_convert_raw_backtrace\0caml_convert_raw_backtrace_slot\0caml_convert_string_to_bytes\0caml_copysign_float\0caml_cos_float\0caml_cosh_float\0caml_create_bytes\0caml_create_file\0caml_create_string\0caml_current_dir\0caml_custom_event_index\0caml_custom_ops\0caml_div\0caml_div_float\0caml_domain_dls\0caml_domain_dls_get\0caml_domain_dls_set\0caml_domain_id\0caml_domain_spawn\0caml_ensure_stack_capacity\0caml_ephe_blit_data\0caml_ephe_blit_key\0caml_ephe_check_data\0caml_ephe_check_key\0caml_ephe_create\0caml_ephe_data_offset\0caml_ephe_get_data\0caml_ephe_get_data_copy\0caml_ephe_get_key\0caml_ephe_get_key_copy\0caml_ephe_key_offset\0caml_ephe_set_data\0caml_ephe_set_key\0caml_ephe_unset_data\0caml_ephe_unset_key\0caml_eq_float\0caml_equal\0caml_erf_float\0caml_erfc_float\0caml_eventlog_pause\0caml_eventlog_resume\0caml_executable_name\0caml_exn_with_js_backtrace\0caml_exp2_float\0caml_exp_float\0caml_expm1_float\0caml_failwith\0caml_fatal_uncaught_exception\0caml_fill_bytes\0caml_fill_string\0caml_final_register\0caml_final_register_called_without_value\0caml_final_release\0caml_finish_formatting\0caml_float_compare\0caml_float_of_bytes\0caml_float_of_int\0caml_float_of_string\0caml_floatarray_blit\0caml_floatarray_create\0caml_floatarray_get\0caml_floatarray_set\0caml_floatarray_unsafe_get\0caml_floatarray_unsafe_set\0caml_floor_float\0caml_fma_float\0caml_fmod_float\0caml_format_exception\0caml_format_float\0caml_format_int\0caml_fresh_oo_id\0caml_frexp_float\0caml_fs_init\0caml_gc_compaction\0caml_gc_counters\0caml_gc_full_major\0caml_gc_get\0caml_gc_huge_fallback_count\0caml_gc_major\0caml_gc_major_slice\0caml_gc_minor\0caml_gc_minor_words\0caml_gc_quick_stat\0caml_gc_set\0caml_gc_stat\0caml_ge_float\0caml_get_continuation_callstack\0caml_get_current_callstack\0caml_get_exception_backtrace\0caml_get_exception_raw_backtrace\0caml_get_global_data\0caml_get_major_bucket\0caml_get_major_credit\0caml_get_minor_free\0caml_get_public_method\0caml_get_root\0caml_global_data\0caml_gr_arc_aux\0caml_gr_blit_image\0caml_gr_clear_graph\0caml_gr_close_graph\0caml_gr_close_subwindow\0caml_gr_create_image\0caml_gr_current_x\0caml_gr_current_y\0caml_gr_display_mode\0caml_gr_doc_of_state\0caml_gr_draw_arc\0caml_gr_draw_char\0caml_gr_draw_image\0caml_gr_draw_rect\0caml_gr_draw_str\0caml_gr_draw_string\0caml_gr_dump_image\0caml_gr_fill_arc\0caml_gr_fill_poly\0caml_gr_fill_rect\0caml_gr_lineto\0caml_gr_make_image\0caml_gr_moveto\0caml_gr_open_graph\0caml_gr_open_subwindow\0caml_gr_plot\0caml_gr_point_color\0caml_gr_remember_mode\0caml_gr_resize_window\0caml_gr_set_color\0caml_gr_set_font\0caml_gr_set_line_width\0caml_gr_set_text_size\0caml_gr_set_window_title\0caml_gr_sigio_handler\0caml_gr_sigio_signal\0caml_gr_size_x\0caml_gr_size_y\0caml_gr_state\0caml_gr_state_create\0caml_gr_state_get\0caml_gr_state_init\0caml_gr_state_set\0caml_gr_synchronize\0caml_gr_text_size\0caml_gr_wait_event\0caml_gr_window_id\0caml_greaterequal\0caml_greaterthan\0caml_gt_float\0caml_hash\0caml_hash_mix_bigstring\0caml_hash_mix_bytes\0caml_hash_mix_bytes_arr\0caml_hash_mix_final\0caml_hash_mix_float\0caml_hash_mix_int\0caml_hash_mix_int64\0caml_hash_mix_jsbytes\0caml_hash_mix_string\0caml_hash_nat\0caml_hexstring_of_float\0caml_hypot_float\0caml_input_value\0caml_input_value_from_bytes\0caml_input_value_from_reader\0caml_input_value_from_string\0caml_input_value_to_outside_heap\0caml_install_signal_handler\0caml_int32_add\0caml_int32_and\0caml_int32_bits_of_float\0caml_int32_bswap\0caml_int32_compare\0caml_int32_div\0caml_int32_float_of_bits\0caml_int32_format\0caml_int32_mod\0caml_int32_mul\0caml_int32_neg\0caml_int32_of_float\0caml_int32_of_int\0caml_int32_of_string\0caml_int32_or\0caml_int32_shift_left\0caml_int32_shift_right\0caml_int32_shift_right_unsigned\0caml_int32_sub\0caml_int32_to_float\0caml_int32_to_int\0caml_int32_unmarshal\0caml_int32_xor\0caml_int64_add\0caml_int64_and\0caml_int64_bits_of_float\0caml_int64_bswap\0caml_int64_compare\0caml_int64_create_lo_hi\0caml_int64_create_lo_mi_hi\0caml_int64_div\0caml_int64_float_of_bits\0caml_int64_format\0caml_int64_hash\0caml_int64_hi32\0caml_int64_is_negative\0caml_int64_is_zero\0caml_int64_lo32\0caml_int64_marshal\0caml_int64_mod\0caml_int64_mul\0caml_int64_neg\0caml_int64_of_bytes\0caml_int64_of_float\0caml_int64_of_int\0caml_int64_of_int32\0caml_int64_of_nativeint\0caml_int64_of_string\0caml_int64_offset\0caml_int64_or\0caml_int64_shift_left\0caml_int64_shift_right\0caml_int64_shift_right_unsigned\0caml_int64_sub\0caml_int64_to_bytes\0caml_int64_to_float\0caml_int64_to_int\0caml_int64_to_int32\0caml_int64_to_nativeint\0caml_int64_ult\0caml_int64_unmarshal\0caml_int64_xor\0caml_int_compare\0caml_int_of_float\0caml_int_of_string\0caml_invalid_argument\0caml_is_continuation_tag\0caml_is_js\0caml_is_ml_bytes\0caml_is_ml_string\0caml_is_printable\0caml_is_special_exception\0caml_js_call\0caml_js_delete\0caml_js_equals\0caml_js_error_of_exception\0caml_js_error_option_of_exception\0caml_js_eval_string\0caml_js_expr\0caml_js_from_array\0caml_js_from_bool\0caml_js_from_float\0caml_js_from_string\0caml_js_fun_call\0caml_js_function_arity\0caml_js_get\0caml_js_get_console\0caml_js_html_entities\0caml_js_html_escape\0caml_js_instanceof\0caml_js_meth_call\0caml_js_new\0caml_js_object\0caml_js_on_ie\0caml_js_pure_expr\0caml_js_set\0caml_js_to_array\0caml_js_to_bool\0caml_js_to_byte_string\0caml_js_to_float\0caml_js_to_string\0caml_js_typeof\0caml_js_var\0caml_js_wrap_callback\0caml_js_wrap_callback_arguments\0caml_js_wrap_callback_strict\0caml_js_wrap_callback_unsafe\0caml_js_wrap_meth_callback\0caml_js_wrap_meth_callback_arguments\0caml_js_wrap_meth_callback_strict\0caml_js_wrap_meth_callback_unsafe\0caml_jsbytes_of_string\0caml_jsoo_flags_effects\0caml_jsoo_flags_use_js_string\0caml_jsstring_of_string\0caml_lazy_make_forward\0caml_lazy_read_result\0caml_lazy_reset_to_lazy\0caml_lazy_update_to_forcing\0caml_lazy_update_to_forward\0caml_ldexp_float\0caml_le_float\0caml_lessequal\0caml_lessthan\0caml_lex_array\0caml_lex_engine\0caml_list_mount_point\0caml_list_of_js_array\0caml_list_to_js_array\0caml_log10_float\0caml_log1p_float\0caml_log2_float\0caml_log_float\0caml_lt_float\0caml_lxm_next\0caml_make_array\0caml_make_float_vect\0caml_make_path\0caml_make_vect\0caml_marshal_constants\0caml_marshal_data_size\0caml_marshal_header_size\0caml_maybe_attach_backtrace\0caml_maybe_print_stats\0caml_md5_bytes\0caml_md5_chan\0caml_md5_string\0caml_memprof_set\0caml_memprof_start\0caml_memprof_stop\0caml_ml_bytes_content\0caml_ml_bytes_length\0caml_ml_channel_size\0caml_ml_channel_size_64\0caml_ml_channels\0caml_ml_close_channel\0caml_ml_condition_broadcast\0caml_ml_condition_new\0caml_ml_condition_signal\0caml_ml_condition_wait\0caml_ml_debug_info_status\0caml_ml_domain_cpu_relax\0caml_ml_domain_id\0caml_ml_domain_set_name\0caml_ml_domain_unique_token\0caml_ml_enable_runtime_warnings\0caml_ml_flush\0caml_ml_input\0caml_ml_input_block\0caml_ml_input_char\0caml_ml_input_int\0caml_ml_input_scan_line\0caml_ml_is_buffered\0caml_ml_mutex_lock\0caml_ml_mutex_new\0caml_ml_mutex_try_lock\0caml_ml_mutex_unlock\0caml_ml_open_descriptor_in\0caml_ml_open_descriptor_out\0caml_ml_out_channels_list\0caml_ml_output\0caml_ml_output_bytes\0caml_ml_output_char\0caml_ml_output_int\0caml_ml_pos_in\0caml_ml_pos_in_64\0caml_ml_pos_out\0caml_ml_pos_out_64\0caml_ml_runtime_warnings_enabled\0caml_ml_seek_in\0caml_ml_seek_in_64\0caml_ml_seek_out\0caml_ml_seek_out_64\0caml_ml_set_binary_mode\0caml_ml_set_buffered\0caml_ml_set_channel_name\0caml_ml_set_channel_output\0caml_ml_set_channel_refill\0caml_ml_string_length\0caml_mod\0caml_modf_float\0caml_mount_autoload\0caml_mul\0caml_mul_float\0caml_named_value\0caml_named_values\0caml_nativeint_add\0caml_nativeint_and\0caml_nativeint_bswap\0caml_nativeint_compare\0caml_nativeint_div\0caml_nativeint_format\0caml_nativeint_mod\0caml_nativeint_mul\0caml_nativeint_neg\0caml_nativeint_of_float\0caml_nativeint_of_int\0caml_nativeint_of_int32\0caml_nativeint_of_string\0caml_nativeint_or\0caml_nativeint_shift_left\0caml_nativeint_shift_right\0caml_nativeint_shift_right_unsigned\0caml_nativeint_sub\0caml_nativeint_to_float\0caml_nativeint_to_int\0caml_nativeint_to_int32\0caml_nativeint_unmarshal\0caml_nativeint_xor\0caml_neg_float\0caml_neq_float\0caml_new_lex_engine\0caml_new_string\0caml_nextafter_float\0caml_notequal\0caml_obj_add_offset\0caml_obj_block\0caml_obj_compare_and_swap\0caml_obj_dup\0caml_obj_is_block\0caml_obj_is_shared\0caml_obj_make_forward\0caml_obj_raw_field\0caml_obj_reachable_words\0caml_obj_set_raw_field\0caml_obj_set_tag\0caml_obj_tag\0caml_obj_truncate\0caml_obj_update_tag\0caml_obj_with_tag\0caml_ojs_new_arr\0caml_oo_last_id\0caml_output_val\0caml_output_value\0caml_output_value_to_buffer\0caml_output_value_to_bytes\0caml_output_value_to_string\0caml_parse_digit\0caml_parse_engine\0caml_parse_format\0caml_parse_sign_and_base\0caml_parser_trace\0caml_pos_in\0caml_pos_out\0caml_power_float\0caml_pure_js_expr\0caml_raise_constant\0caml_raise_end_of_file\0caml_raise_no_such_file\0caml_raise_not_a_dir\0caml_raise_not_found\0caml_raise_sys_error\0caml_raise_with_arg\0caml_raise_with_args\0caml_raise_with_string\0caml_raise_zero_divide\0caml_raw_backtrace_length\0caml_raw_backtrace_next_slot\0caml_raw_backtrace_slot\0caml_read_file_content\0caml_recommended_domain_count\0caml_record_backtrace\0caml_record_backtrace_flag\0caml_refill\0caml_register_channel_for_spacetime\0caml_register_global\0caml_register_named_value\0caml_restore_raw_backtrace\0caml_root\0caml_round_float\0caml_runtime_events_create_cursor\0caml_runtime_events_free_cursor\0caml_runtime_events_pause\0caml_runtime_events_read_poll\0caml_runtime_events_resume\0caml_runtime_events_start\0caml_runtime_events_user_register\0caml_runtime_events_user_resolve\0caml_runtime_events_user_write\0caml_runtime_parameters\0caml_runtime_variant\0caml_runtime_warnings\0caml_seek_in\0caml_seek_out\0caml_set_oo_id\0caml_set_parser_trace\0caml_set_static_env\0caml_signbit_float\0caml_sin_float\0caml_sinh_float\0caml_spacetime_enabled\0caml_spacetime_only_works_for_native_code\0caml_sqrt_float\0caml_str_initialize\0caml_str_repeat\0caml_string_bound_error\0caml_string_compare\0caml_string_equal\0caml_string_get\0caml_string_get16\0caml_string_get32\0caml_string_get64\0caml_string_greaterequal\0caml_string_greaterthan\0caml_string_hash\0caml_string_lessequal\0caml_string_lessthan\0caml_string_notequal\0caml_string_of_array\0caml_string_of_bytes\0caml_string_of_jsbytes\0caml_string_of_jsstring\0caml_string_set\0caml_string_set16\0caml_string_set32\0caml_string_set64\0caml_string_unsafe_get\0caml_string_unsafe_set\0caml_sub_float\0caml_subarray_to_jsbytes\0caml_sys_argv\0caml_sys_chdir\0caml_sys_close\0caml_sys_const_backend_type\0caml_sys_const_big_endian\0caml_sys_const_int_size\0caml_sys_const_max_wosize\0caml_sys_const_naked_pointers_checked\0caml_sys_const_ostype_cygwin\0caml_sys_const_ostype_unix\0caml_sys_const_ostype_win32\0caml_sys_const_word_size\0caml_sys_executable_name\0caml_sys_exit\0caml_sys_fds\0caml_sys_file_exists\0caml_sys_get_argv\0caml_sys_get_config\0caml_sys_getcwd\0caml_sys_getenv\0caml_sys_is_directory\0caml_sys_is_regular_file\0caml_sys_isatty\0caml_sys_mkdir\0caml_sys_modify_argv\0caml_sys_open\0caml_sys_open_for_node\0caml_sys_random_seed\0caml_sys_read_directory\0caml_sys_remove\0caml_sys_rename\0caml_sys_rmdir\0caml_sys_system_command\0caml_sys_time\0caml_sys_time_include_children\0caml_sys_unsafe_getenv\0caml_tan_float\0caml_tanh_float\0caml_to_js_string\0caml_trailing_slash\0caml_trampoline\0caml_trampoline_return\0caml_trunc_float\0caml_uint8_array_of_bytes\0caml_uint8_array_of_string\0caml_unix_cleanup\0caml_unix_closedir\0caml_unix_filedescr_of_fd\0caml_unix_findclose\0caml_unix_findfirst\0caml_unix_findnext\0caml_unix_getpwuid\0caml_unix_gettimeofday\0caml_unix_getuid\0caml_unix_gmtime\0caml_unix_has_symlink\0caml_unix_inet_addr_of_string\0caml_unix_isatty\0caml_unix_localtime\0caml_unix_lstat\0caml_unix_lstat_64\0caml_unix_mkdir\0caml_unix_mktime\0caml_unix_opendir\0caml_unix_readdir\0caml_unix_readlink\0caml_unix_rewinddir\0caml_unix_rmdir\0caml_unix_startup\0caml_unix_stat\0caml_unix_stat_64\0caml_unix_symlink\0caml_unix_time\0caml_unix_unlink\0caml_unmount\0caml_update_dummy\0caml_utf16_of_utf8\0caml_utf8_of_utf16\0caml_weak_blit\0caml_weak_check\0caml_weak_create\0caml_weak_get\0caml_weak_get_copy\0caml_weak_set\0caml_wrap_exception\0caml_xmlhttprequest_create\0compare_digits_nat\0compare_nat\0compare_nat_real\0complement_nat\0create_nat\0decr_nat\0deserialize_nat\0div_digit_nat\0div_helper\0div_nat\0fs_node_supported\0incr_nat\0initialize_nat\0is_digit_int\0is_digit_odd\0is_digit_zero\0jsoo_create_file\0jsoo_create_file_extern\0jsoo_effect_not_supported\0jsoo_floor_log2\0jsoo_is_ascii\0jsoo_mount_point\0jsoo_sys_getenv\0land_digit_nat\0lor_digit_nat\0lxor_digit_nat\0make_unix_err_args\0mult_digit_nat\0mult_nat\0nat_of_array\0nth_digit_nat\0nth_digit_nat_native\0num_digits_nat\0num_leading_zero_bits_in_digit\0os_type\0path_is_absolute\0re_match\0re_partial_match\0re_replacement_text\0re_search_backward\0re_search_forward\0re_string_match\0resolve_fs_device\0serialize_nat\0set_digit_nat\0set_digit_nat_native\0set_to_zero_nat\0shift_left_nat\0shift_right_nat\0square_nat\0sub_nat\0time_now_nanoseconds_since_unix_epoch_or_zero\0unix_closedir\0unix_getpwuid\0unix_gettimeofday\0unix_getuid\0unix_gmtime\0unix_has_symlink\0unix_inet_addr_of_string\0unix_isatty\0unix_localtime\0unix_lstat\0unix_lstat_64\0unix_mkdir\0unix_mktime\0unix_opendir\0unix_readdir\0unix_readlink\0unix_rewinddir\0unix_rmdir\0unix_stat\0unix_stat_64\0unix_symlink\0unix_time\0unix_unlink\0win_cleanup\0win_filedescr_of_channel\0win_findclose\0win_findfirst\0win_findnext\0win_handle_fd\0win_startup\0zstd_decompress\0"],0]]]];return}(globalThis)); + +//# 1 "../../../.js/default/stdlib/stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function erase_rel(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, erase_rel(rest)]; + case 1: + var rest$0 = param[1]; return [1, erase_rel(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, erase_rel(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, erase_rel(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, erase_rel(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, erase_rel(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, erase_rel(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, erase_rel(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; + return [8, ty, erase_rel(rest$7)]; + case 9: + var rest$8 = param[3], ty1 = param[1]; + return [9, ty1, ty1, erase_rel(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, erase_rel(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, erase_rel(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, erase_rel(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, erase_rel(rest$12)]; + default: var rest$13 = param[1]; return [14, erase_rel(rest$13)]; + } + } + function concat_fmtty(fmtty1, fmtty2){ + if(typeof fmtty1 === "number") return fmtty2; + switch(fmtty1[0]){ + case 0: + var rest = fmtty1[1]; return [0, concat_fmtty(rest, fmtty2)]; + case 1: + var rest$0 = fmtty1[1]; return [1, concat_fmtty(rest$0, fmtty2)]; + case 2: + var rest$1 = fmtty1[1]; return [2, concat_fmtty(rest$1, fmtty2)]; + case 3: + var rest$2 = fmtty1[1]; return [3, concat_fmtty(rest$2, fmtty2)]; + case 4: + var rest$3 = fmtty1[1]; return [4, concat_fmtty(rest$3, fmtty2)]; + case 5: + var rest$4 = fmtty1[1]; return [5, concat_fmtty(rest$4, fmtty2)]; + case 6: + var rest$5 = fmtty1[1]; return [6, concat_fmtty(rest$5, fmtty2)]; + case 7: + var rest$6 = fmtty1[1]; return [7, concat_fmtty(rest$6, fmtty2)]; + case 8: + var rest$7 = fmtty1[2], ty = fmtty1[1]; + return [8, ty, concat_fmtty(rest$7, fmtty2)]; + case 9: + var rest$8 = fmtty1[3], ty2 = fmtty1[2], ty1 = fmtty1[1]; + return [9, ty1, ty2, concat_fmtty(rest$8, fmtty2)]; + case 10: + var rest$9 = fmtty1[1]; return [10, concat_fmtty(rest$9, fmtty2)]; + case 11: + var rest$10 = fmtty1[1]; return [11, concat_fmtty(rest$10, fmtty2)]; + case 12: + var rest$11 = fmtty1[1]; return [12, concat_fmtty(rest$11, fmtty2)]; + case 13: + var rest$12 = fmtty1[1]; return [13, concat_fmtty(rest$12, fmtty2)]; + default: + var rest$13 = fmtty1[1]; return [14, concat_fmtty(rest$13, fmtty2)]; + } + } + function concat_fmt(fmt1, fmt2){ + if(typeof fmt1 === "number") return fmt2; + switch(fmt1[0]){ + case 0: + var rest = fmt1[1]; return [0, concat_fmt(rest, fmt2)]; + case 1: + var rest$0 = fmt1[1]; return [1, concat_fmt(rest$0, fmt2)]; + case 2: + var rest$1 = fmt1[2], pad = fmt1[1]; + return [2, pad, concat_fmt(rest$1, fmt2)]; + case 3: + var rest$2 = fmt1[2], pad$0 = fmt1[1]; + return [3, pad$0, concat_fmt(rest$2, fmt2)]; + case 4: + var rest$3 = fmt1[4], prec = fmt1[3], pad$1 = fmt1[2], iconv = fmt1[1]; + return [4, iconv, pad$1, prec, concat_fmt(rest$3, fmt2)]; + case 5: + var + rest$4 = fmt1[4], + prec$0 = fmt1[3], + pad$2 = fmt1[2], + iconv$0 = fmt1[1]; + return [5, iconv$0, pad$2, prec$0, concat_fmt(rest$4, fmt2)]; + case 6: + var + rest$5 = fmt1[4], + prec$1 = fmt1[3], + pad$3 = fmt1[2], + iconv$1 = fmt1[1]; + return [6, iconv$1, pad$3, prec$1, concat_fmt(rest$5, fmt2)]; + case 7: + var + rest$6 = fmt1[4], + prec$2 = fmt1[3], + pad$4 = fmt1[2], + iconv$2 = fmt1[1]; + return [7, iconv$2, pad$4, prec$2, concat_fmt(rest$6, fmt2)]; + case 8: + var + rest$7 = fmt1[4], + prec$3 = fmt1[3], + pad$5 = fmt1[2], + fconv = fmt1[1]; + return [8, fconv, pad$5, prec$3, concat_fmt(rest$7, fmt2)]; + case 9: + var rest$8 = fmt1[2], pad$6 = fmt1[1]; + return [9, pad$6, concat_fmt(rest$8, fmt2)]; + case 10: + var rest$9 = fmt1[1]; return [10, concat_fmt(rest$9, fmt2)]; + case 11: + var rest$10 = fmt1[2], str = fmt1[1]; + return [11, str, concat_fmt(rest$10, fmt2)]; + case 12: + var rest$11 = fmt1[2], chr = fmt1[1]; + return [12, chr, concat_fmt(rest$11, fmt2)]; + case 13: + var rest$12 = fmt1[3], fmtty = fmt1[2], pad$7 = fmt1[1]; + return [13, pad$7, fmtty, concat_fmt(rest$12, fmt2)]; + case 14: + var rest$13 = fmt1[3], fmtty$0 = fmt1[2], pad$8 = fmt1[1]; + return [14, pad$8, fmtty$0, concat_fmt(rest$13, fmt2)]; + case 15: + var rest$14 = fmt1[1]; return [15, concat_fmt(rest$14, fmt2)]; + case 16: + var rest$15 = fmt1[1]; return [16, concat_fmt(rest$15, fmt2)]; + case 17: + var rest$16 = fmt1[2], fmting_lit = fmt1[1]; + return [17, fmting_lit, concat_fmt(rest$16, fmt2)]; + case 18: + var rest$17 = fmt1[2], fmting_gen = fmt1[1]; + return [18, fmting_gen, concat_fmt(rest$17, fmt2)]; + case 19: + var rest$18 = fmt1[1]; return [19, concat_fmt(rest$18, fmt2)]; + case 20: + var rest$19 = fmt1[3], char_set = fmt1[2], width_opt = fmt1[1]; + return [20, width_opt, char_set, concat_fmt(rest$19, fmt2)]; + case 21: + var rest$20 = fmt1[2], counter = fmt1[1]; + return [21, counter, concat_fmt(rest$20, fmt2)]; + case 22: + var rest$21 = fmt1[1]; return [22, concat_fmt(rest$21, fmt2)]; + case 23: + var rest$22 = fmt1[2], ign = fmt1[1]; + return [23, ign, concat_fmt(rest$22, fmt2)]; + default: + var rest$23 = fmt1[3], f = fmt1[2], arity = fmt1[1]; + return [24, arity, f, concat_fmt(rest$23, fmt2)]; + } + } + var CamlinternalFormatBasics = [0, concat_fmtty, erase_rel, concat_fmt]; + runtime.caml_register_global + (0, CamlinternalFormatBasics, "CamlinternalFormatBasics"); + return; + } + (globalThis)); + +//# 180 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_false$0 = "false", + cst_true$0 = "true", + caml_atomic_cas = runtime.caml_atomic_cas, + caml_atomic_load = runtime.caml_atomic_load, + caml_blit_string = runtime.caml_blit_string, + caml_create_bytes = runtime.caml_create_bytes, + caml_float_of_string = runtime.caml_float_of_string, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_channel_size = runtime.caml_ml_channel_size, + caml_ml_channel_size_64 = runtime.caml_ml_channel_size_64, + caml_ml_close_channel = runtime.caml_ml_close_channel, + caml_ml_flush = runtime.caml_ml_flush, + caml_ml_input = runtime.caml_ml_input, + caml_ml_input_char = runtime.caml_ml_input_char, + caml_ml_open_descriptor_in = runtime.caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out = runtime.caml_ml_open_descriptor_out, + caml_ml_output = runtime.caml_ml_output, + caml_ml_output_bytes = runtime.caml_ml_output_bytes, + caml_ml_output_char = runtime.caml_ml_output_char, + caml_ml_set_binary_mode = runtime.caml_ml_set_binary_mode, + caml_ml_set_channel_name = runtime.caml_ml_set_channel_name, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_sys_open = runtime.caml_sys_open, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = "%,", + cst = ".", + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Invalid_argument = global_data.Invalid_argument, + Failure = global_data.Failure, + Match_failure = global_data.Match_failure, + Assert_failure = global_data.Assert_failure, + Not_found = global_data.Not_found, + Out_of_memory = global_data.Out_of_memory, + Stack_overflow = global_data.Stack_overflow, + Sys_error = global_data.Sys_error, + End_of_file = global_data.End_of_file, + Division_by_zero = global_data.Division_by_zero, + Sys_blocked_io = global_data.Sys_blocked_io, + Undefined_recursive_module = global_data.Undefined_recursive_module, + cst_really_input = "really_input", + cst_input = "input", + _l_ = [0, 0, [0, 6, 0]], + _k_ = [0, 0, [0, 7, 0]], + cst_output_substring = "output_substring", + cst_output = "output", + _j_ = [0, 1, [0, 3, [0, 4, [0, 6, 0]]]], + _i_ = [0, 1, [0, 3, [0, 4, [0, 7, 0]]]], + _g_ = [0, 1], + _h_ = [0, 0], + cst_bool_of_string = "bool_of_string", + cst_true = cst_true$0, + cst_false = cst_false$0, + cst_char_of_int = "char_of_int", + cst_Stdlib_Exit = "Stdlib.Exit", + _a_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 32752), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 65520), + _c_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 32752), + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32751), + _e_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 16), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 15536); + function failwith(s){ + throw caml_maybe_attach_backtrace([0, Failure, s], 1); + } + function invalid_arg(s){ + throw caml_maybe_attach_backtrace([0, Invalid_argument, s], 1); + } + var Exit = [248, cst_Stdlib_Exit, runtime.caml_fresh_oo_id(0)]; + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return runtime.caml_greaterequal(x, y) ? x : y;} + function abs(x){return 0 <= x ? x : - x | 0;} + function lnot(x){return x ^ -1;} + var + infinity = caml_int64_float_of_bits(_a_), + neg_infinity = caml_int64_float_of_bits(_b_), + nan = caml_int64_float_of_bits(_c_), + max_float = caml_int64_float_of_bits(_d_), + min_float = caml_int64_float_of_bits(_e_), + epsilon_float = caml_int64_float_of_bits(_f_), + max_int = 2147483647, + min_int = -2147483648; + function symbol(s1, s2){ + var + l1 = caml_ml_string_length(s1), + l2 = caml_ml_string_length(s2), + s = caml_create_bytes(l1 + l2 | 0); + caml_blit_string(s1, 0, s, 0, l1); + caml_blit_string(s2, 0, s, l1, l2); + return caml_string_of_bytes(s); + } + function char_of_int(n){ + if(0 <= n && 255 >= n) return n; + return invalid_arg(cst_char_of_int); + } + function string_of_bool(b){return b ? cst_true : cst_false;} + function bool_of_string(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal + (param, cst_true$0) + ? invalid_arg(cst_bool_of_string) + : 1 + : 0; + } + function bool_of_string_opt(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal(param, cst_true$0) ? 0 : _g_ + : _h_; + } + function string_of_int(n){return "" + n;} + function int_of_string_opt(s){ + try{var _B_ = [0, caml_int_of_string(s)]; return _B_;} + catch(_C_){ + var _A_ = caml_wrap_exception(_C_); + if(_A_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_A_, 0); + } + } + function valid_float_lexem(s){ + var l = caml_ml_string_length(s), i = 0; + for(;;){ + if(l <= i) return symbol(s, cst); + var match = runtime.caml_string_get(s, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return s; + var i$0 = i + 1 | 0, i = i$0; + } + } + function string_of_float(f){ + return valid_float_lexem(runtime.caml_format_float("%.12g", f)); + } + function float_of_string_opt(s){ + try{var _y_ = [0, caml_float_of_string(s)]; return _y_;} + catch(_z_){ + var _x_ = caml_wrap_exception(_z_); + if(_x_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_x_, 0); + } + } + function symbol$0(l1, l2){ + if(! l1) return l2; + var tl = l1[2], hd = l1[1]; + return [0, hd, symbol$0(tl, l2)]; + } + var + stdin = caml_ml_open_descriptor_in(0), + stdout = caml_ml_open_descriptor_out(1), + stderr = caml_ml_open_descriptor_out(2); + function open_out_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_out(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_out(name){return open_out_gen(_i_, 438, name);} + function open_out_bin(name){return open_out_gen(_j_, 438, name);} + function flush_all(param){ + var param$0 = runtime.caml_ml_out_channels_list(0); + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + try{caml_ml_flush(a);} + catch(_w_){ + var _v_ = caml_wrap_exception(_w_); + if(_v_[1] !== Sys_error) throw caml_maybe_attach_backtrace(_v_, 0); + } + var param$0 = l; + } + } + function output_bytes(oc, s){ + return caml_ml_output_bytes(oc, s, 0, caml_ml_bytes_length(s)); + } + function output_string(oc, s){ + return caml_ml_output(oc, s, 0, caml_ml_string_length(s)); + } + function output(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_output_bytes(oc, s, ofs, len); + return invalid_arg(cst_output); + } + function output_substring(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(s) - len | 0) >= ofs) + return caml_ml_output(oc, s, ofs, len); + return invalid_arg(cst_output_substring); + } + function output_value(chan, v){ + return runtime.caml_output_value(chan, v, 0); + } + function close_out(oc){ + caml_ml_flush(oc); + return caml_ml_close_channel(oc); + } + function close_out_noerr(oc){ + try{caml_ml_flush(oc);}catch(_u_){} + try{var _s_ = caml_ml_close_channel(oc); return _s_;}catch(_t_){return 0;} + } + function open_in_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_in(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_in(name){return open_in_gen(_k_, 0, name);} + function open_in_bin(name){return open_in_gen(_l_, 0, name);} + function input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_input(ic, s, ofs, len); + return invalid_arg(cst_input); + } + function unsafe_really_input(ic, s, ofs, len){ + var ofs$0 = ofs, len$0 = len; + for(;;){ + if(0 >= len$0) return 0; + var r = caml_ml_input(ic, s, ofs$0, len$0); + if(0 === r) throw caml_maybe_attach_backtrace(End_of_file, 1); + var + len$1 = len$0 - r | 0, + ofs$1 = ofs$0 + r | 0, + ofs$0 = ofs$1, + len$0 = len$1; + } + } + function really_input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return unsafe_really_input(ic, s, ofs, len); + return invalid_arg(cst_really_input); + } + function really_input_string(ic, len){ + var s = caml_create_bytes(len); + really_input(ic, s, 0, len); + return caml_string_of_bytes(s); + } + function input_line(chan){ + function build_result(buf, pos, param){ + var pos$0 = pos, param$0 = param; + for(;;){ + if(! param$0) return buf; + var tl = param$0[2], hd = param$0[1], len = caml_ml_bytes_length(hd); + runtime.caml_blit_bytes(hd, 0, buf, pos$0 - len | 0, len); + var pos$1 = pos$0 - len | 0, pos$0 = pos$1, param$0 = tl; + } + } + var accu = 0, len = 0; + for(;;){ + var n = runtime.caml_ml_input_scan_line(chan); + if(0 === n){ + if(! accu) throw caml_maybe_attach_backtrace(End_of_file, 1); + var _r_ = build_result(caml_create_bytes(len), len, accu); + } + else{ + if(0 >= n){ + var beg = caml_create_bytes(- n | 0); + caml_ml_input(chan, beg, 0, - n | 0); + var + len$1 = len - n | 0, + accu$0 = [0, beg, accu], + accu = accu$0, + len = len$1; + continue; + } + var res = caml_create_bytes(n - 1 | 0); + caml_ml_input(chan, res, 0, n - 1 | 0); + caml_ml_input_char(chan); + if(accu) + var + len$0 = (len + n | 0) - 1 | 0, + _r_ = build_result(caml_create_bytes(len$0), len$0, [0, res, accu]); + else + var _r_ = res; + } + return caml_string_of_bytes(_r_); + } + } + function close_in_noerr(ic){ + try{var _p_ = caml_ml_close_channel(ic); return _p_;}catch(_q_){return 0;} + } + function print_char(c){return caml_ml_output_char(stdout, c);} + function print_string(s){return output_string(stdout, s);} + function print_bytes(s){return output_bytes(stdout, s);} + function print_int(i){return output_string(stdout, "" + i);} + function print_float(f){return output_string(stdout, string_of_float(f));} + function print_endline(s){ + output_string(stdout, s); + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function print_newline(param){ + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function prerr_char(c){return caml_ml_output_char(stderr, c);} + function prerr_string(s){return output_string(stderr, s);} + function prerr_bytes(s){return output_bytes(stderr, s);} + function prerr_int(i){return output_string(stderr, "" + i);} + function prerr_float(f){return output_string(stderr, string_of_float(f));} + function prerr_endline(s){ + output_string(stderr, s); + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function prerr_newline(param){ + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function read_line(param){caml_ml_flush(stdout); return input_line(stdin);} + function read_int(param){return caml_int_of_string(read_line(0));} + function read_int_opt(param){return int_of_string_opt(read_line(0));} + function read_float(param){return caml_float_of_string(read_line(0));} + function read_float_opt(param){return float_of_string_opt(read_line(0));} + function string_of_format(param){var str = param[2]; return str;} + function symbol$1(param, _n_){ + var + str2 = _n_[2], + fmt2 = _n_[1], + str1 = param[2], + fmt1 = param[1], + _o_ = symbol(str1, symbol(cst$0, str2)); + return [0, caml_call2(CamlinternalFormatBasics[3], fmt1, fmt2), _o_]; + } + var exit_function = [0, flush_all]; + function at_exit(f){ + for(;;){ + var + f_yet_to_run = [0, 1], + old_exit = caml_atomic_load(exit_function), + new_exit$0 = + function(f_yet_to_run, old_exit){ + function new_exit(param){ + if(caml_atomic_cas(f_yet_to_run, 1, 0)) caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return new_exit; + }, + new_exit = new_exit$0(f_yet_to_run, old_exit), + success = caml_atomic_cas(exit_function, old_exit, new_exit), + _m_ = 1 - success; + if(_m_) continue; + return _m_; + } + } + var do_domain_local_at_exit = [0, function(param){return 0;}]; + function do_at_exit(param){ + caml_call1(do_domain_local_at_exit[1], 0); + return caml_call1(caml_atomic_load(exit_function), 0); + } + function exit(retcode){ + do_at_exit(0); + return runtime.caml_sys_exit(retcode); + } + runtime.caml_register_named_value("Pervasives.do_at_exit", do_at_exit); + var + Stdlib = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + caml_ml_flush, + flush_all, + caml_ml_output_char, + output_string, + output_bytes, + output, + output_substring, + caml_ml_output_char, + runtime.caml_ml_output_int, + output_value, + runtime.caml_ml_seek_out, + runtime.caml_ml_pos_out, + caml_ml_channel_size, + close_out, + close_out_noerr, + caml_ml_set_binary_mode, + open_in, + open_in_bin, + open_in_gen, + caml_ml_input_char, + input_line, + input, + really_input, + really_input_string, + caml_ml_input_char, + runtime.caml_ml_input_int, + runtime.caml_input_value, + runtime.caml_ml_seek_in, + runtime.caml_ml_pos_in, + caml_ml_channel_size, + caml_ml_close_channel, + close_in_noerr, + caml_ml_set_binary_mode, + [0, + runtime.caml_ml_seek_out_64, + runtime.caml_ml_pos_out_64, + caml_ml_channel_size_64, + runtime.caml_ml_seek_in_64, + runtime.caml_ml_pos_in_64, + caml_ml_channel_size_64], + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(45, Stdlib, "Stdlib"); + return; + } + (globalThis)); + +//# 764 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + ocaml_version = "5.0.0", + ocaml_release = [0, 5, 0, 0, 0], + Stdlib = global_data.Stdlib, + executable_name = runtime.caml_sys_executable_name(0), + os_type = runtime.caml_sys_get_config(0)[1], + backend_type = [0, "js_of_ocaml"], + unix = runtime.caml_sys_const_ostype_unix(0), + win32 = runtime.caml_sys_const_ostype_win32(0), + cygwin = runtime.caml_sys_const_ostype_cygwin(0), + max_array_length = runtime.caml_sys_const_max_wosize(0), + max_floatarray_length = max_array_length / 2 | 0, + max_string_length = (4 * max_array_length | 0) - 1 | 0, + cst_Stdlib_Sys_Break = "Stdlib.Sys.Break", + big_endian = 0, + word_size = 32, + int_size = 32; + function getenv_opt(s){ + try{var _d_ = [0, runtime.caml_sys_getenv(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var interactive = [0, 0]; + function set_signal(sig_num, sig_beh){return 0;} + var + Break = [248, cst_Stdlib_Sys_Break, runtime.caml_fresh_oo_id(0)], + sigabrt = -1, + sigalrm = -2, + sigfpe = -3, + sighup = -4, + sigill = -5, + sigint = -6, + sigkill = -7, + sigpipe = -8, + sigquit = -9, + sigsegv = -10, + sigterm = -11, + sigusr1 = -12, + sigusr2 = -13, + sigchld = -14, + sigcont = -15, + sigstop = -16, + sigtstp = -17, + sigttin = -18, + sigttou = -19, + sigvtalrm = -20, + sigprof = -21, + sigbus = -22, + sigpoll = -23, + sigsys = -24, + sigtrap = -25, + sigurg = -26, + sigxcpu = -27, + sigxfsz = -28; + function catch_break(on){return on ? 0 : 0;} + var development_version = 0; + function Make(_b_, _a_){return [0, 1];} + var + Immediate64 = [0, Make], + Stdlib_Sys = + [0, + executable_name, + getenv_opt, + interactive, + os_type, + backend_type, + unix, + win32, + cygwin, + word_size, + int_size, + big_endian, + max_string_length, + max_array_length, + max_floatarray_length, + set_signal, + sigabrt, + sigalrm, + sigfpe, + sighup, + sigill, + sigint, + sigkill, + sigpipe, + sigquit, + sigsegv, + sigterm, + sigusr1, + sigusr2, + sigchld, + sigcont, + sigstop, + sigtstp, + sigttin, + sigttou, + sigvtalrm, + sigprof, + sigbus, + sigpoll, + sigsys, + sigtrap, + sigurg, + sigxcpu, + sigxfsz, + Break, + catch_break, + ocaml_version, + development_version, + ocaml_release, + runtime.caml_ml_enable_runtime_warnings, + runtime.caml_ml_runtime_warnings_enabled, + Immediate64]; + runtime.caml_register_global(4, Stdlib_Sys, "Stdlib__Sys"); + return; + } + (globalThis)); + +//# 893 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Obj_extension_constructor$1 = "Obj.extension_constructor", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Obj_Ephemeron_blit_key = "Obj.Ephemeron.blit_key", + cst_Obj_Ephemeron_check_key = "Obj.Ephemeron.check_key", + cst_Obj_Ephemeron_unset_key = "Obj.Ephemeron.unset_key", + cst_Obj_Ephemeron_set_key = "Obj.Ephemeron.set_key", + cst_Obj_Ephemeron_get_key_copy = "Obj.Ephemeron.get_key_copy", + cst_Obj_Ephemeron_get_key = "Obj.Ephemeron.get_key", + cst_Obj_Ephemeron_create = "Obj.Ephemeron.create", + cst_Obj_extension_constructor$0 = cst_Obj_extension_constructor$1, + cst_Obj_extension_constructor = cst_Obj_extension_constructor$1, + _a_ = [0, "obj.ml", 97, 4]; + function is_block(a){return 1 - (typeof a === "number" ? 1 : 0);} + var + double_field = runtime.caml_array_get, + set_double_field = runtime.caml_array_set, + first_non_constant_constructor = 0, + last_non_constant_constructor_ = 243, + forcing_tag = 244, + cont_tag = 245, + lazy_tag = 246, + closure_tag = 247, + object_tag = 248, + infix_tag = 249, + forward_tag = 250, + no_scan_tag = 251, + abstract_tag = 251, + string_tag = 252, + double_tag = 253, + double_array_tag = 254, + custom_tag = 255, + int_tag = 1000, + out_of_heap_tag = 1001, + unaligned_tag = 1002; + function info(obj){ + if(caml_obj_tag(obj) !== 247) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + info = runtime.caml_obj_raw_field(obj, 1), + arity = 64 === Stdlib_Sys[9] ? info >> 56 : info >> 24, + start_env = info << 8 >>> 9 | 0; + return [0, arity, start_env]; + } + function of_val(x){ + var switch$0 = 0; + if(is_block(x) && caml_obj_tag(x) !== 248 && 1 <= x.length - 1){var slot = x[1]; switch$0 = 1;} + if(! switch$0) var slot = x; + var switch$1 = 0; + if(is_block(slot) && caml_obj_tag(slot) === 248){var name = slot[1]; switch$1 = 1;} + if(! switch$1) + var name = caml_call1(Stdlib[1], cst_Obj_extension_constructor$0); + return caml_obj_tag(name) === 252 + ? slot + : caml_call1(Stdlib[1], cst_Obj_extension_constructor); + } + function name(slot){return slot[1];} + function id(slot){return slot[2];} + var + Extension_constructor = [0, of_val, name, id], + max_ephe_length = Stdlib_Sys[13] - 2 | 0; + function create(l){ + var _g_ = 0 <= l ? 1 : 0, _h_ = _g_ ? l <= max_ephe_length ? 1 : 0 : _g_; + if(1 - _h_) caml_call1(Stdlib[1], cst_Obj_Ephemeron_create); + return runtime.caml_ephe_create(l); + } + function length(x){return x.length - 1 - 2 | 0;} + function raise_if_invalid_offset(e, o, msg){ + var + _d_ = 0 <= o ? 1 : 0, + _e_ = _d_ ? o < length(e) ? 1 : 0 : _d_, + _f_ = 1 - _e_; + return _f_ ? caml_call1(Stdlib[1], msg) : _f_; + } + function get_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key); + return runtime.caml_ephe_get_key(e, o); + } + function get_key_copy(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key_copy); + return runtime.caml_ephe_get_key_copy(e, o); + } + function set_key(e, o, x){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_set_key); + return runtime.caml_ephe_set_key(e, o, x); + } + function unset_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_unset_key); + return runtime.caml_ephe_unset_key(e, o); + } + function check_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_check_key); + return runtime.caml_ephe_check_key(e, o); + } + function blit_key(e1, o1, e2, o2, l){ + if + (0 <= l + && + 0 <= o1 + && (length(e1) - l | 0) >= o1 && 0 <= o2 && (length(e2) - l | 0) >= o2){ + var + _b_ = 0 !== l ? 1 : 0, + _c_ = _b_ ? runtime.caml_ephe_blit_key(e1, o1, e2, o2, l) : _b_; + return _c_; + } + return caml_call1(Stdlib[1], cst_Obj_Ephemeron_blit_key); + } + var + Stdlib_Obj = + [0, + is_block, + double_field, + set_double_field, + first_non_constant_constructor, + last_non_constant_constructor_, + forcing_tag, + cont_tag, + lazy_tag, + closure_tag, + object_tag, + infix_tag, + forward_tag, + no_scan_tag, + abstract_tag, + string_tag, + double_tag, + double_array_tag, + custom_tag, + int_tag, + out_of_heap_tag, + unaligned_tag, + [0, info], + Extension_constructor, + [0, + create, + length, + get_key, + get_key_copy, + set_key, + unset_key, + check_key, + blit_key, + runtime.caml_ephe_get_data, + runtime.caml_ephe_get_data_copy, + runtime.caml_ephe_set_data, + runtime.caml_ephe_unset_data, + runtime.caml_ephe_check_data, + runtime.caml_ephe_blit_data, + max_ephe_length]]; + runtime.caml_register_global(13, Stdlib_Obj, "Stdlib__Obj"); + return; + } + (globalThis)); + +//# 1063 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_atomic_exchange = runtime.caml_atomic_exchange, + caml_atomic_fetch_add = runtime.caml_atomic_fetch_add; + function set(r, x){caml_atomic_exchange(r, x); return 0;} + function incr(r){caml_atomic_fetch_add(r, 1); return 0;} + function decr(r){caml_atomic_fetch_add(r, -1); return 0;} + var + _a_ = caml_atomic_fetch_add, + _b_ = runtime.caml_atomic_cas, + _c_ = caml_atomic_exchange, + _d_ = runtime.caml_atomic_load, + Stdlib_Atomic = + [0, + function(_e_){return [0, _e_];}, + _d_, + set, + _c_, + _b_, + _a_, + incr, + decr]; + runtime.caml_register_global(0, Stdlib_Atomic, "Stdlib__Atomic"); + return; + } + (globalThis)); + +//# 1094 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_lazy_update_to_forward = runtime.caml_lazy_update_to_forward, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = + [248, "CamlinternalLazy.Undefined", runtime.caml_fresh_oo_id(0)]; + function force_gen_lazy_block(only_val, blk){ + if(0 !== runtime.caml_lazy_update_to_forcing(blk)) + throw caml_maybe_attach_backtrace(Undefined, 1); + if(only_val){ + var closure$0 = blk[1]; + blk[1] = 0; + var result$0 = caml_call1(closure$0, 0); + blk[1] = result$0; + caml_lazy_update_to_forward(blk); + return result$0; + } + var closure = blk[1]; + blk[1] = 0; + try{ + var result = caml_call1(closure, 0); + blk[1] = result; + caml_lazy_update_to_forward(blk); + return result; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + blk[1] = function(param){throw caml_maybe_attach_backtrace(e, 0);}; + runtime.caml_lazy_reset_to_lazy(blk); + throw caml_maybe_attach_backtrace(e, 0); + } + } + function force_lazy_block(blk){return force_gen_lazy_block(0, blk);} + function force_gen(only_val, lzv){ + var t = runtime.caml_obj_tag(lzv); + if(t === Stdlib_Obj[12]) return lzv[1]; + if(t === Stdlib_Obj[6]) throw caml_maybe_attach_backtrace(Undefined, 1); + return t !== Stdlib_Obj[8] ? lzv : force_gen_lazy_block(only_val, lzv); + } + var CamlinternalLazy = [0, Undefined, force_lazy_block, force_gen]; + runtime.caml_register_global(2, CamlinternalLazy, "CamlinternalLazy"); + return; + } + (globalThis)); + +//# 1153 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = CamlinternalLazy[1]; + function force_val(l){return caml_call2(CamlinternalLazy[3], 1, l);} + function from_fun(f){ + var x = runtime.caml_obj_block(Stdlib_Obj[8], 1); + x[1] = f; + return x; + } + function from_val(v){ + var t = caml_obj_tag(v); + if + (t !== Stdlib_Obj[12] + && t !== Stdlib_Obj[8] && t !== Stdlib_Obj[6] && t !== Stdlib_Obj[16]) + return v; + return runtime.caml_lazy_make_forward(v); + } + function is_val(l){ + var _i_ = Stdlib_Obj[8]; + return caml_obj_tag(l) !== _i_ ? 1 : 0; + } + function map(f, x){ + return [246, + function(_f_){ + var _g_ = caml_obj_tag(x); + if(250 === _g_) + var _h_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _g_ && 244 !== _g_){var _h_ = x; switch$0 = 1;} + if(! switch$0) var _h_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _h_); + }]; + } + function map_val(f, x){ + if(! is_val(x)) + return [246, + function(_c_){ + var _d_ = caml_obj_tag(x); + if(250 === _d_) + var _e_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = x; switch$0 = 1;} + if(! switch$0) var _e_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _e_); + }]; + var _a_ = caml_obj_tag(x); + if(250 === _a_) + var _b_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _a_ && 244 !== _a_){var _b_ = x; switch$0 = 1;} + if(! switch$0) var _b_ = caml_call1(CamlinternalLazy[2], x); + } + return from_val(caml_call1(f, _b_)); + } + var + Stdlib_Lazy = + [0, Undefined, map, is_val, from_val, map_val, from_fun, force_val]; + runtime.caml_register_global(2, Stdlib_Lazy, "Stdlib__Lazy"); + return; + } + (globalThis)); + +//# 1238 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Atomic = global_data.Stdlib__Atomic, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib = global_data.Stdlib, + Stdlib_Lazy = global_data.Stdlib__Lazy, + _a_ = [0, "seq.ml", 596, 4], + cst_Seq_drop = "Seq.drop", + cst_Seq_take = "Seq.take", + cst_Seq_init = "Seq.init", + cst_Stdlib_Seq_Forced_twice = "Stdlib.Seq.Forced_twice"; + function empty(param){return 0;} + function return$0(x, param){return [0, x, empty];} + function cons(x, next, param){return [0, x, next];} + function append(seq1, seq2, param){ + var match = caml_call1(seq1, 0); + if(! match) return caml_call1(seq2, 0); + var next = match[2], x = match[1]; + return [0, x, function(_aM_){return append(next, seq2, _aM_);}]; + } + function map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + function _aK_(_aL_){return map(f, next, _aL_);} + return [0, caml_call1(f, x), _aK_]; + } + function filter_map(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1], match$0 = caml_call1(f, x); + if(match$0){ + var y = match$0[1]; + return [0, y, function(_aJ_){return filter_map(f, next, _aJ_);}]; + } + var seq$0 = next; + } + } + function filter(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + if(caml_call1(f, x)) + return [0, x, function(_aI_){return filter(f, next, _aI_);}]; + var seq$0 = next; + } + } + function concat(seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aG_ = 0; + return append(x, function(_aH_){return concat(next, _aH_);}, _aG_); + } + function flat_map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aD_ = 0; + function _aE_(_aF_){return flat_map(f, next, _aF_);} + return append(caml_call1(f, x), _aE_, _aD_); + } + function fold_left(f, acc, seq){ + var acc$0 = acc, seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return acc$0; + var + next = match[2], + x = match[1], + acc$1 = caml_call2(f, acc$0, x), + acc$0 = acc$1, + seq$0 = next; + } + } + function iter(f, seq){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + caml_call1(f, x); + var seq$0 = next; + } + } + function unfold(f, u, param){ + var match = caml_call1(f, u); + if(! match) return 0; + var match$0 = match[1], u$0 = match$0[2], x = match$0[1]; + return [0, x, function(_aC_){return unfold(f, u$0, _aC_);}]; + } + function is_empty(xs){return caml_call1(xs, 0) ? 0 : 1;} + function uncons(xs){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, [0, x, xs$0]]; + } + function length(xs$1){ + var accu = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var xs$0 = match[2], accu$0 = accu + 1 | 0, accu = accu$0, xs = xs$0; + } + } + function iteri(f, xs$1){ + var i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + caml_call2(f, i, x); + var i$0 = i + 1 | 0, i = i$0, xs = xs$0; + } + } + function fold_lefti(f, accu$1, xs$1){ + var accu = accu$1, i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var + xs$0 = match[2], + x = match[1], + accu$0 = caml_call3(f, accu, i, x), + i$0 = i + 1 | 0, + accu = accu$0, + i = i$0, + xs = xs$0; + } + } + function for_all(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], _aB_ = caml_call1(p, x); + if(! _aB_) return _aB_; + var xs$0 = xs$1; + } + } + function exists(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], _aA_ = caml_call1(p, x); + if(_aA_) return _aA_; + var xs$0 = xs$1; + } + } + function find(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1]; + if(caml_call1(p, x)) return [0, x]; + var xs$0 = xs$1; + } + } + function find_map(f, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], result = caml_call1(f, x); + if(result) return result; + var xs$0 = xs$1; + } + } + function iter2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1]; + caml_call2(f, x, y); + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function fold_left2(f, accu, xs, ys){ + var accu$0 = accu, xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return accu$0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return accu$0; + var + ys$1 = match$0[2], + y = match$0[1], + accu$1 = caml_call3(f, accu$0, x, y), + accu$0 = accu$1, + xs$0 = xs$1, + ys$0 = ys$1; + } + } + function for_all2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], _az_ = caml_call2(f, x, y); + if(! _az_) return _az_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function exists2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1], _ay_ = caml_call2(f, x, y); + if(_ay_) return _ay_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function equal(eq, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(match){ + if(match$0){ + var + ys$1 = match$0[2], + y = match$0[1], + xs$1 = match[2], + x = match[1], + _ax_ = caml_call2(eq, x, y); + if(! _ax_) return _ax_; + var xs$0 = xs$1, ys$0 = ys$1; + continue; + } + } + else if(! match$0) return 1; + return 0; + } + } + function compare(cmp, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(! match) return match$0 ? -1 : 0; + var xs$1 = match[2], x = match[1]; + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], c = caml_call2(cmp, x, y); + if(0 !== c) return c; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function init_aux(f, i, j, param){ + if(i >= j) return 0; + var _au_ = i + 1 | 0; + function _av_(_aw_){return init_aux(f, _au_, j, _aw_);} + return [0, caml_call1(f, i), _av_]; + } + function init(n, f){ + if(0 > n) return caml_call1(Stdlib[1], cst_Seq_init); + var _as_ = 0; + return function(_at_){return init_aux(f, _as_, n, _at_);}; + } + function repeat(x, param){ + return [0, x, function(_ar_){return repeat(x, _ar_);}]; + } + function forever(f, param){ + function _ap_(_aq_){return forever(f, _aq_);} + return [0, caml_call1(f, 0), _ap_]; + } + function cycle_nonempty(xs, param){ + var _an_ = 0; + return append(xs, function(_ao_){return cycle_nonempty(xs, _ao_);}, _an_); + } + function cycle(xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + function _ak_(_am_){return cycle_nonempty(xs, _am_);} + return [0, x, function(_al_){return append(xs$0, _ak_, _al_);}]; + } + function iterate1(f, x, param){ + var y = caml_call1(f, x); + return [0, y, function(_aj_){return iterate1(f, y, _aj_);}]; + } + function iterate(f, x){ + function _ag_(_ai_){return iterate1(f, x, _ai_);} + return function(_ah_){return [0, x, _ag_];}; + } + function mapi_aux(f, i, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _ad_ = i + 1 | 0; + function _ae_(_af_){return mapi_aux(f, _ad_, xs$0, _af_);} + return [0, caml_call2(f, i, x), _ae_]; + } + function mapi(f, xs){ + var _ab_ = 0; + return function(_ac_){return mapi_aux(f, _ab_, xs, _ac_);}; + } + function tail_scan(f, s, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], s$0 = caml_call2(f, s, x); + return [0, s$0, function(_aa_){return tail_scan(f, s$0, xs$0, _aa_);}]; + } + function scan(f, s, xs){ + function _Z_(_$_){return tail_scan(f, s, xs, _$_);} + return function(___){return [0, s, _Z_];}; + } + function take_aux(n, xs){ + return 0 === n + ? empty + : function + (param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, take_aux(n - 1 | 0, xs$0)]; + }; + } + function take(n, xs){ + if(n < 0) caml_call1(Stdlib[1], cst_Seq_take); + return take_aux(n, xs); + } + function drop(n, xs){ + return 0 <= n + ? 0 + === n + ? xs + : function + (param){ + var n$0 = n, xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], n$1 = n$0 - 1 | 0; + if(0 === n$1) return caml_call1(xs$1, 0); + var n$0 = n$1, xs$0 = xs$1; + } + } + : caml_call1(Stdlib[1], cst_Seq_drop); + } + function take_while(p, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return caml_call1(p, x) + ? [0, x, function(_Y_){return take_while(p, xs$0, _Y_);}] + : 0; + } + function drop_while(p, xs, param){ + var xs$0 = xs; + for(;;){ + var node = caml_call1(xs$0, 0); + if(! node) return 0; + var xs$1 = node[2], x = node[1]; + if(! caml_call1(p, x)) return node; + var xs$0 = xs$1; + } + } + function group(eq, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _P_ = caml_call1(eq, x); + function _Q_(_X_){return drop_while(_P_, xs$0, _X_);} + function _R_(_W_){return group(eq, _Q_, _W_);} + var _S_ = caml_call1(eq, x); + function _T_(_V_){return take_while(_S_, xs$0, _V_);} + return [0, function(_U_){return [0, x, _T_];}, _R_]; + } + var + Forced_twice = + [248, cst_Stdlib_Seq_Forced_twice, runtime.caml_fresh_oo_id(0)], + to_lazy = Stdlib_Lazy[6]; + function failure(param){ + throw caml_maybe_attach_backtrace(Forced_twice, 1); + } + function memoize(xs){ + function s$0(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, memoize(xs$0)]; + } + var s = caml_call1(to_lazy, s$0); + return function(_O_){ + var _N_ = runtime.caml_obj_tag(s); + if(250 === _N_) return s[1]; + if(246 !== _N_ && 244 !== _N_) return s; + return caml_call1(CamlinternalLazy[2], s);}; + } + function once(xs){ + function f(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, once(xs$0)]; + } + var action = caml_call1(Stdlib_Atomic[1], f); + return function(param){ + var f = caml_call2(Stdlib_Atomic[4], action, failure); + return caml_call1(f, 0);}; + } + function zip(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + return [0, [0, x, y], function(_M_){return zip(xs$0, ys$0, _M_);}]; + } + function map2(f, xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + function _K_(_L_){return map2(f, xs$0, ys$0, _L_);} + return [0, caml_call2(f, x, y), _K_]; + } + function interleave(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return caml_call1(ys, 0); + var xs$0 = match[2], x = match[1]; + return [0, x, function(_J_){return interleave(ys, xs$0, _J_);}]; + } + function sorted_merge1(cmp, x, xs, y, ys){ + return 0 < caml_call2(cmp, x, y) + ? [0, + y, + function(_H_){ + var match = caml_call1(ys, 0); + if(! match) return [0, x, xs]; + var ys$0 = match[2], y = match[1]; + return sorted_merge1(cmp, x, xs, y, ys$0); + }] + : [0, + x, + function(_I_){ + var match = caml_call1(xs, 0); + if(! match) return [0, y, ys]; + var xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys); + }]; + } + function sorted_merge(cmp, xs, ys, param){ + var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0); + if(match){ + if(match$0){ + var ys$0 = match$0[2], y = match$0[1], xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys$0); + } + var c = match; + } + else{if(! match$0) return 0; var c = match$0;} + return c; + } + function map_fst(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], x = match[1][1]; + return [0, x, function(_G_){return map_fst(xys$0, _G_);}]; + } + function map_snd(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], y = match[1][2]; + return [0, y, function(_F_){return map_snd(xys$0, _F_);}]; + } + function unzip(xys){ + function _C_(_E_){return map_snd(xys, _E_);} + return [0, function(_D_){return map_fst(xys, _D_);}, _C_]; + } + function filter_map_find_left_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){ + var y = match$0[1]; + return [0, + y, + function(_B_){return filter_map_find_left_map(f, xs$1, _B_);}]; + } + var xs$0 = xs$1; + } + } + function filter_map_find_right_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){var xs$0 = xs$1; continue;} + var z = match$0[1]; + return [0, + z, + function(_A_){return filter_map_find_right_map(f, xs$1, _A_);}]; + } + } + function partition_map(f, xs){ + function _x_(_z_){return filter_map_find_right_map(f, xs, _z_);} + return [0, + function(_y_){return filter_map_find_left_map(f, xs, _y_);}, + _x_]; + } + function partition(p, xs){ + function _t_(x){return 1 - caml_call1(p, x);} + function _u_(_w_){return filter(_t_, xs, _w_);} + return [0, function(_v_){return filter(p, xs, _v_);}, _u_]; + } + function peel(xss){ + return unzip(function(_s_){return filter_map(uncons, xss, _s_);}); + } + function transpose(xss, param){ + var match = peel(xss), tails = match[2], heads = match[1]; + if(! is_empty(heads)) + return [0, heads, function(_r_){return transpose(tails, _r_);}]; + if(is_empty(tails)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function _b_(remainders, xss, param){ + var match = caml_call1(xss, 0); + if(! match) return transpose(remainders, 0); + var xss$0 = match[2], xs = match[1], match$0 = caml_call1(xs, 0); + if(match$0){ + var + xs$0 = match$0[2], + x = match$0[1], + match$1 = peel(remainders), + tails = match$1[2], + heads = match$1[1], + _l_ = function(_q_){return [0, xs$0, tails];}, + _m_ = function(_p_){return _b_(_l_, xss$0, _p_);}; + return [0, function(_o_){return [0, x, heads];}, _m_]; + } + var + match$2 = peel(remainders), + tails$0 = match$2[2], + heads$0 = match$2[1]; + return [0, heads$0, function(_n_){return _b_(tails$0, xss$0, _n_);}]; + } + function map_product(f, xs, ys){ + function _f_(x){ + function _j_(y){return caml_call2(f, x, y);} + return function(_k_){return map(_j_, ys, _k_);}; + } + function xss(_i_){return map(_f_, xs, _i_);} + function _e_(_h_){return _b_(empty, xss, _h_);} + return function(_g_){return concat(_e_, _g_);}; + } + function product(xs, ys){ + return map_product(function(x, y){return [0, x, y];}, xs, ys); + } + function of_dispenser(it){ + function c(param){ + var match = caml_call1(it, 0); + if(! match) return 0; + var x = match[1]; + return [0, x, c]; + } + return c; + } + function to_dispenser(xs){ + var s = [0, xs]; + return function(param){ + var match = caml_call1(s[1], 0); + if(! match) return 0; + var xs = match[2], x = match[1]; + s[1] = xs; + return [0, x];}; + } + function ints(i, param){ + var _c_ = i + 1 | 0; + return [0, i, function(_d_){return ints(_c_, _d_);}]; + } + var + Stdlib_Seq = + [0, + is_empty, + uncons, + length, + iter, + fold_left, + iteri, + fold_lefti, + for_all, + exists, + find, + find_map, + iter2, + fold_left2, + for_all2, + exists2, + equal, + compare, + empty, + return$0, + cons, + init, + unfold, + repeat, + forever, + cycle, + iterate, + map, + mapi, + filter, + filter_map, + scan, + take, + drop, + take_while, + drop_while, + group, + memoize, + Forced_twice, + once, + transpose, + append, + concat, + flat_map, + flat_map, + zip, + map2, + interleave, + sorted_merge, + product, + map_product, + unzip, + unzip, + partition_map, + partition, + of_dispenser, + to_dispenser, + ints]; + runtime.caml_register_global(10, Stdlib_Seq, "Stdlib__Seq"); + return; + } + (globalThis)); + +//# 2020 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + cst_result_is_Ok = "result is Ok _", + cst_result_is_Error = "result is Error _"; + function ok(v){return [0, v];} + function error(e){return [1, e];} + function value(r, default$0){ + if(0 !== r[0]) return default$0; + var v = r[1]; + return v; + } + function get_ok(param){ + if(0 !== param[0]) return caml_call1(Stdlib[1], cst_result_is_Error); + var v = param[1]; + return v; + } + function get_error(param){ + if(0 === param[0]) return caml_call1(Stdlib[1], cst_result_is_Ok); + var e = param[1]; + return e; + } + function bind(r, f){ + if(0 !== r[0]) return r; + var v = r[1]; + return caml_call1(f, v); + } + function join(e){if(0 !== e[0]) return e; var r = e[1]; return r;} + function map(f, e){ + if(0 !== e[0]) return e; + var v = e[1]; + return [0, caml_call1(f, v)]; + } + function map_error(f, v){ + if(0 === v[0]) return v; + var e = v[1]; + return [1, caml_call1(f, e)]; + } + function fold(ok, error, param){ + if(0 === param[0]){var v = param[1]; return caml_call1(ok, v);} + var e = param[1]; + return caml_call1(error, e); + } + function iter(f, param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return caml_call1(f, v); + } + function iter_error(f, param){ + if(0 === param[0]) return 0; + var e = param[1]; + return caml_call1(f, e); + } + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function equal(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 === r1[0]){var v1 = r1[1]; return caml_call2(ok, v0, v1);} + } + else{ + var e0 = r0[1]; + if(0 !== r1[0]){var e1 = r1[1]; return caml_call2(error, e0, e1);} + } + return 0; + } + function compare(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 !== r1[0]) return -1; + var v1 = r1[1]; + return caml_call2(ok, v0, v1); + } + var e0 = r0[1]; + if(0 === r1[0]) return 1; + var e1 = r1[1]; + return caml_call2(error, e0, e1); + } + function to_option(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v]; + } + function to_list(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v, 0]; + } + function to_seq(param){ + if(0 !== param[0]) return Stdlib_Seq[18]; + var v = param[1]; + return caml_call1(Stdlib_Seq[19], v); + } + var + Stdlib_Result = + [0, + ok, + error, + value, + get_ok, + get_error, + bind, + join, + map, + map_error, + fold, + iter, + iter_error, + is_ok, + is_error, + equal, + compare, + to_option, + to_list, + to_seq]; + runtime.caml_register_global(4, Stdlib_Result, "Stdlib__Result"); + return; + } + (globalThis)); + +//# 2183 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_string_of_bytes = runtime.caml_string_of_bytes; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "\\\\", + cst$0 = "\\'", + Stdlib = global_data.Stdlib, + cst_b = "\\b", + cst_t = "\\t", + cst_n = "\\n", + cst_r = "\\r", + cst_Char_chr = "Char.chr"; + function chr(n){ + if(0 <= n && 255 >= n) return n; + return caml_call1(Stdlib[1], cst_Char_chr); + } + function escaped(c){ + var switch$0 = 0; + if(40 <= c){ + if(92 === c) return cst; + if(127 > c) switch$0 = 1; + } + else if(32 <= c){ + if(39 <= c) return cst$0; + switch$0 = 1; + } + else if(14 > c) + switch(c){ + case 8: + return cst_b; + case 9: + return cst_t; + case 10: + return cst_n; + case 13: + return cst_r; + } + if(switch$0){ + var s$0 = caml_create_bytes(1); + caml_bytes_unsafe_set(s$0, 0, c); + return caml_string_of_bytes(s$0); + } + var s = caml_create_bytes(4); + caml_bytes_unsafe_set(s, 0, 92); + caml_bytes_unsafe_set(s, 1, 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s, 2, 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s, 3, 48 + (c % 10 | 0) | 0); + return caml_string_of_bytes(s); + } + function lowercase_ascii(c){return 25 < c - 65 >>> 0 ? c : c + 32 | 0;} + function uppercase_ascii(c){return 25 < c - 97 >>> 0 ? c : c - 32 | 0;} + function compare(c1, c2){return c1 - c2 | 0;} + function equal(c1, c2){return 0 === (c1 - c2 | 0) ? 1 : 0;} + var + Stdlib_Char = + [0, chr, escaped, lowercase_ascii, uppercase_ascii, compare, equal]; + runtime.caml_register_global(8, Stdlib_Char, "Stdlib__Char"); + return; + } + (globalThis)); + +//# 2257 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_uchar_ml = "uchar.ml", + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + err_no_pred = "U+0000 has no predecessor", + err_no_succ = "U+10FFFF has no successor", + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + _d_ = [0, cst_uchar_ml, 88, 18], + _c_ = [0, cst_uchar_ml, 91, 7], + _b_ = [0, cst_uchar_ml, 80, 18], + _a_ = [0, cst_uchar_ml, 85, 7], + cst_is_not_a_latin1_character = " is not a latin1 character", + cst_U = "U+", + cst_is_not_an_Unicode_scalar_v = " is not an Unicode scalar value", + min = 0, + max = 1114111, + lo_bound = 55295, + hi_bound = 57344, + bom = 65279, + rep = 65533; + function succ(u){ + return u === 55295 + ? hi_bound + : u === 1114111 ? caml_call1(Stdlib[1], err_no_succ) : u + 1 | 0; + } + function pred(u){ + return u === 57344 + ? lo_bound + : u === 0 ? caml_call1(Stdlib[1], err_no_pred) : u - 1 | 0; + } + function is_valid(i){ + var _o_ = 0 <= i ? 1 : 0, _p_ = _o_ ? i <= 55295 ? 1 : 0 : _o_; + if(_p_) + var _q_ = _p_; + else + var _r_ = 57344 <= i ? 1 : 0, _q_ = _r_ ? i <= 1114111 ? 1 : 0 : _r_; + return _q_; + } + function of_int(i){ + if(is_valid(i)) return i; + var + _n_ = + caml_call2 + (Stdlib[28], caml_format_int("%X", i), cst_is_not_an_Unicode_scalar_v); + return caml_call1(Stdlib[1], _n_); + } + function is_char(u){return u < 256 ? 1 : 0;} + function of_char(c){return c;} + function to_char(u){ + if(255 >= u) return u; + var + _l_ = + caml_call2 + (Stdlib[28], + caml_format_int("%04X", u), + cst_is_not_a_latin1_character), + _m_ = caml_call2(Stdlib[28], cst_U, _l_); + return caml_call1(Stdlib[1], _m_); + } + function unsafe_to_char(_k_){return _k_;} + function equal(_j_, _i_){return _j_ === _i_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function hash(_h_){return _h_;} + function utf_decode_is_valid(d){return 1 === (d >>> 27 | 0) ? 1 : 0;} + function utf_decode_length(d){return (d >>> 24 | 0) & 7;} + function utf_decode_uchar(d){return d & 16777215;} + function utf_decode(n, u){return (8 | n) << 24 | u;} + function utf_decode_invalid(n){return n << 24 | 65533;} + function utf_8_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u) return 1; + if(2047 >= u) return 2; + if(65535 >= u) return 3; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return 4; + } + function utf_16_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u) return 2; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 4; + } + function _e_(_g_){return _g_;} + var + Stdlib_Uchar = + [0, + min, + max, + bom, + rep, + succ, + pred, + is_valid, + of_int, + function(_f_){return _f_;}, + _e_, + is_char, + of_char, + to_char, + unsafe_to_char, + equal, + compare, + hash, + utf_decode_is_valid, + utf_decode_uchar, + utf_decode_length, + utf_decode, + utf_decode_invalid, + utf_8_byte_length, + utf_16_byte_length]; + runtime.caml_register_global(13, Stdlib_Uchar, "Stdlib__Uchar"); + return; + } + (globalThis)); + +//# 2393 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_List_nth$1 = "List.nth", + caml_compare = runtime.caml_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_List_map2 = "List.map2", + cst_List_iter2 = "List.iter2", + cst_List_fold_left2 = "List.fold_left2", + cst_List_fold_right2 = "List.fold_right2", + cst_List_for_all2 = "List.for_all2", + cst_List_exists2 = "List.exists2", + _b_ = [0, 0, 0], + cst_List_combine = "List.combine", + cst_List_rev_map2 = "List.rev_map2", + cst_List_init = "List.init", + cst_List_nth$0 = cst_List_nth$1, + cst_nth = "nth", + cst_List_nth = cst_List_nth$1, + cst_tl = "tl", + cst_hd = "hd"; + function length(l$0){ + var len = 0, param = l$0; + for(;;){ + if(! param) return len; + var l = param[2], len$0 = len + 1 | 0, len = len$0, param = l; + } + } + function cons(a, l){return [0, a, l];} + function hd(param){ + if(! param) return caml_call1(Stdlib[2], cst_hd); + var a = param[1]; + return a; + } + function tl(param){ + if(! param) return caml_call1(Stdlib[2], cst_tl); + var l = param[2]; + return l; + } + function nth(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return caml_call1(Stdlib[2], cst_nth); + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return a; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function nth_opt(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth$0); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0; + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + var append = Stdlib[37]; + function rev_append(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + a = l1$0[1], + l2$1 = [0, a, l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function rev(l){return rev_append(l, 0);} + function init_aux(i, n, f){ + if(n <= i) return 0; + var r = caml_call1(f, i); + return [0, r, init_aux(i + 1 | 0, n, f)]; + } + var rev_init_threshold = typeof Stdlib_Sys[5] === "number" ? 10000 : 50; + function init(len, f){ + if(0 > len) return caml_call1(Stdlib[1], cst_List_init); + if(rev_init_threshold >= len) return init_aux(0, len, f); + var acc = 0, i = 0; + for(;;){ + if(len <= i) return rev(acc); + var + i$0 = i + 1 | 0, + acc$0 = [0, caml_call1(f, i), acc], + acc = acc$0, + i = i$0; + } + } + function flatten(param){ + if(! param) return 0; + var r = param[2], l = param[1], _J_ = flatten(r); + return caml_call2(Stdlib[37], l, _J_); + } + function map(f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call1(f, a); + return [0, r, map(f, l)]; + } + function _a_(i, f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call2(f, i, a); + return [0, r, _a_(i + 1 | 0, f, l)]; + } + function mapi(f, l){return _a_(0, f, l);} + function rev_map(f, l){ + var accu = 0, param = l; + for(;;){ + if(! param) return accu; + var + l$0 = param[2], + a = param[1], + accu$0 = [0, caml_call1(f, a), accu], + accu = accu$0, + param = l$0; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + caml_call1(f, a); + var param$0 = l; + } + } + function iteri(f, l$0){ + var i = 0, param = l$0; + for(;;){ + if(! param) return 0; + var l = param[2], a = param[1]; + caml_call2(f, i, a); + var i$0 = i + 1 | 0, i = i$0, param = l; + } + } + function fold_left(f, accu, l){ + var accu$0 = accu, l$0 = l; + for(;;){ + if(! l$0) return accu$0; + var + l$1 = l$0[2], + a = l$0[1], + accu$1 = caml_call2(f, accu$0, a), + accu$0 = accu$1, + l$0 = l$1; + } + } + function fold_right(f, l, accu){ + if(! l) return accu; + var l$0 = l[2], a = l[1]; + return caml_call2(f, a, fold_right(f, l$0, accu)); + } + function map2(f, l1, l2){ + if(l1){ + if(l2){ + var + l2$0 = l2[2], + a2 = l2[1], + l1$0 = l1[2], + a1 = l1[1], + r = caml_call2(f, a1, a2); + return [0, r, map2(f, l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_map2); + } + function rev_map2(f, l1, l2){ + var accu = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$0 = [0, caml_call2(f, a1, a2), accu], + accu = accu$0, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu; + return caml_call1(Stdlib[1], cst_List_rev_map2); + } + } + function iter2(f, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var l2$1 = l2$0[2], a2 = l2$0[1], l1$1 = l1$0[2], a1 = l1$0[1]; + caml_call2(f, a1, a2); + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_iter2); + } + } + function fold_left2(f, accu, l1, l2){ + var accu$0 = accu, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$1 = caml_call3(f, accu$0, a1, a2), + accu$0 = accu$1, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu$0; + return caml_call1(Stdlib[1], cst_List_fold_left2); + } + } + function fold_right2(f, l1, l2, accu){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return caml_call3(f, a1, a2, fold_right2(f, l1$0, l2$0, accu)); + } + } + else if(! l2) return accu; + return caml_call1(Stdlib[1], cst_List_fold_right2); + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var l = param$0[2], a = param$0[1], _I_ = caml_call1(p, a); + if(! _I_) return _I_; + var param$0 = l; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _H_ = caml_call1(p, a); + if(_H_) return _H_; + var param$0 = l; + } + } + function for_all2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _G_ = caml_call2(p, a1, a2); + if(! _G_) return _G_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return caml_call1(Stdlib[1], cst_List_for_all2); + } + } + function exists2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _F_ = caml_call2(p, a1, a2); + if(_F_) return _F_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_exists2); + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1], + _E_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_E_) return _E_; + var param$0 = l; + } + } + function memq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _D_ = a === x ? 1 : 0; + if(_D_) return _D_; + var param$0 = l; + } + } + function assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return b; + var param$0 = l; + } + } + function assoc_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return [0, b]; + var param$0 = l; + } + } + function assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return b; + var param$0 = l; + } + } + function assq_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return [0, b]; + var param$0 = l; + } + } + function mem_assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1][1], + _C_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_C_) return _C_; + var param$0 = l; + } + } + function mem_assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1][1], _B_ = a === x ? 1 : 0; + if(_B_) return _B_; + var param$0 = l; + } + } + function remove_assoc(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return 0 === caml_compare(a, x) ? l : [0, pair, remove_assoc(x, l)]; + } + function remove_assq(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return a === x ? l : [0, pair, remove_assq(x, l)]; + } + function find(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return x; + var param$0 = l; + } + } + function find_opt(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return [0, x]; + var param$0 = l; + } + } + function find_map(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1], result = caml_call1(f, x); + if(result) return result; + var param$0 = l; + } + } + function find_all(p){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1]; + if(caml_call1(p, x)){ + var accu$1 = [0, x, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function filteri(p, l){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + acc$0 = caml_call2(p, i, x) ? [0, x, acc] : acc, + i$0 = i + 1 | 0, + i = i$0, + acc = acc$0, + param = l$0; + } + } + function filter_map(f){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1], match = caml_call1(f, x); + if(match){ + var v = match[1], accu$1 = [0, v, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function concat_map(f, l){ + var acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + xs = caml_call1(f, x), + acc$0 = rev_append(xs, acc), + acc = acc$0, + param = l$0; + } + } + function fold_left_map(f, accu, l){ + var accu$0 = accu, l_accu = 0, param = l; + for(;;){ + if(! param) return [0, accu$0, rev(l_accu)]; + var + l$0 = param[2], + x = param[1], + match = caml_call2(f, accu$0, x), + x$0 = match[2], + accu$1 = match[1], + l_accu$0 = [0, x$0, l_accu], + accu$0 = accu$1, + l_accu = l_accu$0, + param = l$0; + } + } + function partition(p, l){ + var yes = 0, no = 0, param = l; + for(;;){ + if(! param){var _A_ = rev(no); return [0, rev(yes), _A_];} + var l$0 = param[2], x = param[1]; + if(caml_call1(p, x)){ + var yes$0 = [0, x, yes], yes = yes$0, param = l$0; + continue; + } + var no$0 = [0, x, no], no = no$0, param = l$0; + } + } + function partition_map(p, l){ + var left = 0, right = 0, param = l; + for(;;){ + if(! param){var _z_ = rev(right); return [0, rev(left), _z_];} + var l$0 = param[2], x = param[1], match = caml_call1(p, x); + if(0 === match[0]){ + var v = match[1], left$0 = [0, v, left], left = left$0, param = l$0; + continue; + } + var + v$0 = match[1], + right$0 = [0, v$0, right], + right = right$0, + param = l$0; + } + } + function split(param){ + if(! param) return _b_; + var + l = param[2], + match = param[1], + y = match[2], + x = match[1], + match$0 = split(l), + ry = match$0[2], + rx = match$0[1]; + return [0, [0, x, rx], [0, y, ry]]; + } + function combine(l1, l2){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return [0, [0, a1, a2], combine(l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_combine); + } + function merge(cmp, l1, l2){ + if(! l1) return l2; + if(! l2) return l1; + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + return 0 < caml_call2(cmp, h1, h2) + ? [0, h2, merge(cmp, l1, t2)] + : [0, h1, merge(cmp, t1, l2)]; + } + function stable_sort(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x2, [0, x1, 0]] + : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _y_ = l[2]; + if(_y_){ + var match$2 = _y_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _y_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x1$0, [0, x2$0, [0, x3, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h1, accu], l1 = t1, accu = accu$0; + continue; + } + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var _x_ = rev_append(l1, accu); + } + else + var _x_ = rev_append(l2, accu); + return [0, _x_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x1, [0, x2, 0]] + : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _w_ = l[2]; + if(_w_){ + var match$2 = _w_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _w_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x1$0, [0, x2$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h2, accu], l2 = t2, accu = accu$0; + continue; + } + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var _v_ = rev_append(l1, accu); + } + else + var _v_ = rev_append(l2, accu); + return [0, _v_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function sort_uniq(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 <= c$0 ? [0, x2, [0, x1, 0]] : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _p_ = l[2]; + if(_p_){ + var match$2 = _p_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _p_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _q_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 <= c$2 ? [0, x3, [0, x2$0, 0]] : [0, x2$0, [0, x3, 0]], + s$0 = _q_; + else if(0 <= c$1){ + var c$3 = caml_call2(cmp, x1$0, x3); + if(0 === c$3) + var _r_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 <= c$3) + var + c$4 = caml_call2(cmp, x2$0, x3), + _s_ = + 0 === c$4 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + <= c$4 + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]], + _r_ = _s_; + else + var _r_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + var s$0 = _r_; + } + else{ + var c$5 = caml_call2(cmp, x2$0, x3); + if(0 === c$5) + var _t_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 <= c$5) + var + c$6 = caml_call2(cmp, x1$0, x3), + _u_ = + 0 === c$6 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + <= c$6 + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]], + _t_ = _u_; + else + var _t_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + var s$0 = _t_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 < c){ + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var accu$2 = [0, h2, accu], l2 = t2, accu = accu$2; + continue; + } + var _o_ = rev_append(l1, accu); + } + else + var _o_ = rev_append(l2, accu); + return [0, _o_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 < c$0 ? [0, x1, [0, x2, 0]] : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _i_ = l[2]; + if(_i_){ + var match$2 = _i_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _i_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _j_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 < c$2 ? [0, x2$0, [0, x3, 0]] : [0, x3, [0, x2$0, 0]], + s$0 = _j_; + else if(0 < c$1){ + var c$3 = caml_call2(cmp, x2$0, x3); + if(0 === c$3) + var _k_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 < c$3) + var _k_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + else + var + c$4 = caml_call2(cmp, x1$0, x3), + _l_ = + 0 === c$4 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + < c$4 + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]], + _k_ = _l_; + var s$0 = _k_; + } + else{ + var c$5 = caml_call2(cmp, x1$0, x3); + if(0 === c$5) + var _m_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 < c$5) + var _m_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + else + var + c$6 = caml_call2(cmp, x2$0, x3), + _n_ = + 0 === c$6 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + < c$6 + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]], + _m_ = _n_; + var s$0 = _m_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 <= c){ + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var accu$2 = [0, h1, accu], l1 = t1, accu = accu$2; + continue; + } + var _h_ = rev_append(l1, accu); + } + else + var _h_ = rev_append(l2, accu); + return [0, _h_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function compare_lengths(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + if(! l2$0) return 1; + var l2$1 = l2$0[2], l1$1 = l1$0[2], l1$0 = l1$1, l2$0 = l2$1; + } + } + function compare_length_with(l, n){ + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0 === n$0 ? 0 : 0 < n$0 ? -1 : 1; + var l$1 = l$0[2]; + if(0 >= n$0) return 1; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function equal(eq, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _g_ = caml_call2(eq, a1, a2); + if(! _g_) return _g_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return 0; + } + } + function compare(cmp, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + var l1$1 = l1$0[2], a1 = l1$0[1]; + if(! l2$0) return 1; + var l2$1 = l2$0[2], a2 = l2$0[1], c = caml_call2(cmp, a1, a2); + if(0 !== c) return c; + var l1$0 = l1$1, l2$0 = l2$1; + } + } + function to_seq(l){ + function aux(l, param){ + if(! l) return 0; + var tail = l[2], x = l[1]; + return [0, x, function(_f_){return aux(tail, _f_);}]; + } + return function(_e_){return aux(l, _e_);}; + } + function of_seq(seq){ + function direct(depth, seq){ + if(0 === depth){ + var _c_ = 0, _d_ = function(acc, x){return [0, x, acc];}; + return rev(caml_call3(Stdlib_Seq[5], _d_, _c_, seq)); + } + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + return [0, x, direct(depth - 1 | 0, next)]; + } + return direct(500, seq); + } + var + Stdlib_List = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + flatten, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + find_all, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + stable_sort, + stable_sort, + stable_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(18, Stdlib_List, "Stdlib__List"); + return; + } + (globalThis)); + +//# 3492 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, zero = 0, one = 1, minus_one = -1; + function abs(x){return 0 <= x ? x : - x | 0;} + var max_int = 2147483647, min_int = -2147483648; + function lognot(x){return x ^ -1;} + function equal(_b_, _a_){return _b_ === _a_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function min(x, y){return x <= y ? x : y;} + function max(x, y){return y <= x ? x : y;} + function to_string(x){return "" + x;} + var + Stdlib_Int = + [0, + zero, + one, + minus_one, + abs, + max_int, + min_int, + lognot, + equal, + compare, + min, + max, + to_string]; + runtime.caml_register_global(1, Stdlib_Int, "Stdlib__Int"); + return; + } + (globalThis)); + +//# 3525 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_bytes_ml = "bytes.ml", + cst_index_out_of_bounds$3 = "index out of bounds", + caml_blit_bytes = runtime.caml_blit_bytes, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_get16 = runtime.caml_bytes_get16, + caml_bytes_get32 = runtime.caml_bytes_get32, + caml_bytes_get64 = runtime.caml_bytes_get64, + caml_bytes_of_string = runtime.caml_bytes_of_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fill_bytes = runtime.caml_fill_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Char = global_data.Stdlib__Char, + cst_index_out_of_bounds$2 = cst_index_out_of_bounds$3, + _f_ = [0, cst_bytes_ml, 820, 20], + _e_ = [0, cst_bytes_ml, 831, 9], + cst_index_out_of_bounds$1 = cst_index_out_of_bounds$3, + cst_index_out_of_bounds$0 = cst_index_out_of_bounds$3, + _d_ = [0, cst_bytes_ml, 766, 20], + _c_ = [0, cst_bytes_ml, 777, 9], + cst_index_out_of_bounds = cst_index_out_of_bounds$3, + _b_ = [0, cst_bytes_ml, 654, 20], + _a_ = [0, cst_bytes_ml, 679, 9], + cst_Bytes_of_seq_cannot_grow_b = "Bytes.of_seq: cannot grow bytes", + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_Bytes_concat = "Bytes.concat", + cst_String_blit_Bytes_blit_str = "String.blit / Bytes.blit_string", + cst_Bytes_blit = "Bytes.blit", + cst_String_fill_Bytes_fill = "String.fill / Bytes.fill", + cst_Bytes_extend = "Bytes.extend", + cst_String_sub_Bytes_sub = "String.sub / Bytes.sub"; + function make(n, c){ + var s = caml_create_bytes(n); + caml_fill_bytes(s, 0, n, c); + return s; + } + function init(n, f){ + var s = caml_create_bytes(n), _aq_ = n - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + caml_bytes_unsafe_set(s, i, caml_call1(f, i)); + var _ar_ = i + 1 | 0; + if(_aq_ !== i){var i = _ar_; continue;} + break; + } + } + return s; + } + var empty = caml_create_bytes(0); + function copy(s){ + var len = caml_ml_bytes_length(s), r = caml_create_bytes(len); + caml_blit_bytes(s, 0, r, 0, len); + return r; + } + function to_string(b){return caml_string_of_bytes(copy(b));} + function of_string(s){return copy(caml_bytes_of_string(s));} + function sub(s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs){ + var r = caml_create_bytes(len); + caml_blit_bytes(s, ofs, r, 0, len); + return r; + } + return caml_call1(Stdlib[1], cst_String_sub_Bytes_sub); + } + function sub_string(b, ofs, len){ + return caml_string_of_bytes(sub(b, ofs, len)); + } + function symbol(a, b){ + var + c = a + b | 0, + _ao_ = b < 0 ? 1 : 0, + match = c < 0 ? 1 : 0, + switch$0 = 0; + if(a < 0){ + if(_ao_ && ! match) switch$0 = 1; + } + else if(! _ao_ && match) switch$0 = 1; + return switch$0 ? caml_call1(Stdlib[1], cst_Bytes_extend) : c; + } + function extend(s, left, right){ + var + len = symbol(symbol(caml_ml_bytes_length(s), left), right), + r = caml_create_bytes(len); + if(0 <= left) + var dstoff = left, srcoff = 0; + else + var dstoff = 0, srcoff = - left | 0; + var + cpylen = + caml_call2 + (Stdlib_Int[10], + caml_ml_bytes_length(s) - srcoff | 0, + len - dstoff | 0); + if(0 < cpylen) caml_blit_bytes(s, srcoff, r, dstoff, cpylen); + return r; + } + function fill(s, ofs, len, c){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_fill_bytes(s, ofs, len, c); + return caml_call1(Stdlib[1], cst_String_fill_Bytes_fill); + } + function blit(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (caml_ml_bytes_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return caml_blit_bytes(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_Bytes_blit); + } + function blit_string(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (runtime.caml_ml_string_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return runtime.caml_blit_string(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_String_blit_Bytes_blit_str); + } + function iter(f, a){ + var _am_ = caml_ml_bytes_length(a) - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, caml_bytes_unsafe_get(a, i)); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iteri(f, a){ + var _aj_ = caml_ml_bytes_length(a) - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, i, caml_bytes_unsafe_get(a, i)); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function concat(sep, l){ + if(! l) return empty; + var seplen = caml_ml_bytes_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_bytes_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Bytes_concat), + acc = acc$0, + param = tl; + continue; + } + var _ah_ = caml_ml_bytes_length(hd) + acc | 0; + } + else + var _ah_ = acc; + var dst = caml_create_bytes(_ah_), pos = pos$1, param$0 = l; + for(;;){ + if(! param$0) return dst; + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + caml_blit_bytes + (sep, 0, dst, pos + caml_ml_bytes_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_bytes_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + return dst; + } + } + } + function cat(s1, s2){ + var + l1 = caml_ml_bytes_length(s1), + l2 = caml_ml_bytes_length(s2), + r = caml_create_bytes(l1 + l2 | 0); + caml_blit_bytes(s1, 0, r, 0, l1); + caml_blit_bytes(s2, 0, r, l1, l2); + return r; + } + function is_space(param){ + var _ag_ = param - 9 | 0, switch$0 = 0; + if(4 < _ag_ >>> 0){ + if(23 === _ag_) switch$0 = 1; + } + else if(2 !== _ag_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + var len = caml_ml_bytes_length(s), i = [0, 0]; + for(;;){ + if(i[1] < len && is_space(caml_bytes_unsafe_get(s, i[1]))){i[1]++; continue;} + var j = [0, len - 1 | 0]; + for(;;){ + if(i[1] <= j[1] && is_space(caml_bytes_unsafe_get(s, j[1]))){j[1] += -1; continue;} + return i[1] <= j[1] ? sub(s, i[1], (j[1] - i[1] | 0) + 1 | 0) : empty; + } + } + } + function unsafe_escape(s){ + var n = [0, 0], _$_ = caml_ml_bytes_length(s) - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i$0 = ___; + for(;;){ + var match = caml_bytes_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _ad_ = match - 34 | 0, switch$1 = 0; + if(58 < _ad_ >>> 0){ + if(93 > _ad_) switch$1 = 1; + } + else if(56 < _ad_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _ae_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){ + case 0: + var _ae_ = 4; break; + case 1: + var _ae_ = 2; break; + } + n[1] = n[1] + _ae_ | 0; + var _af_ = i$0 + 1 | 0; + if(_$_ !== i$0){var i$0 = _af_; continue;} + break; + } + } + if(n[1] === caml_ml_bytes_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _ab_ = caml_ml_bytes_length(s) - 1 | 0, _aa_ = 0; + if(_ab_ >= 0){ + var i = _aa_; + for(;;){ + var c = caml_bytes_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c / 100 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c % 10 | 0) | 0); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _ac_ = i + 1 | 0; + if(_ab_ !== i){var i = _ac_; continue;} + break; + } + } + return s$0; + } + function escaped(b){var b$0 = copy(b); return unsafe_escape(b$0);} + function map(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _Y_ = l - 1 | 0, _X_ = 0; + if(_Y_ >= 0){ + var i = _X_; + for(;;){ + caml_bytes_unsafe_set(r, i, caml_call1(f, caml_bytes_unsafe_get(s, i))); + var _Z_ = i + 1 | 0; + if(_Y_ !== i){var i = _Z_; continue;} + break; + } + } + return r; + } + function mapi(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _V_ = l - 1 | 0, _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + caml_bytes_unsafe_set + (r, i, caml_call2(f, i, caml_bytes_unsafe_get(s, i))); + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _S_ = caml_ml_bytes_length(a) - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + r[1] = caml_call2(f, r[1], caml_bytes_unsafe_get(a, i)); + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _P_ = caml_ml_bytes_length(a) - 1 | 0; + if(_P_ >= 0){ + var i = _P_; + for(;;){ + r[1] = caml_call2(f, caml_bytes_unsafe_get(a, i), r[1]); + var _Q_ = i - 1 | 0; + if(0 !== i){var i = _Q_; continue;} + break; + } + } + return r[1]; + } + function exists(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, caml_bytes_unsafe_get(s, i))) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, caml_bytes_unsafe_get(s, i))) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function uppercase_ascii(s){return map(Stdlib_Char[4], s);} + function lowercase_ascii(s){return map(Stdlib_Char[3], s);} + function apply1(f, s){ + if(0 === caml_ml_bytes_length(s)) return s; + var r = copy(s); + caml_bytes_unsafe_set(r, 0, caml_call1(f, caml_bytes_unsafe_get(s, 0))); + return r; + } + function capitalize_ascii(s){return apply1(Stdlib_Char[4], s);} + function uncapitalize_ascii(s){return apply1(Stdlib_Char[3], s);} + function starts_with(prefix, s){ + var + len_s = caml_ml_bytes_length(s), + len_pre = caml_ml_bytes_length(prefix), + _O_ = len_pre <= len_s ? 1 : 0; + if(! _O_) return _O_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_bytes_unsafe_get(s, i) !== caml_bytes_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_bytes_length(s), + len_suf = caml_ml_bytes_length(suffix), + diff = len_s - len_suf | 0, + _N_ = 0 <= diff ? 1 : 0; + if(! _N_) return _N_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_bytes_unsafe_get(s, diff + i | 0) + !== caml_bytes_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_bytes_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_bytes_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _L_ = 1; return _L_;} + catch(_M_){ + var _K_ = caml_wrap_exception(_M_); + if(_K_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_K_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_bytes_length(s) > i) + try{rindex_rec(s, i, c); var _I_ = 1; return _I_;} + catch(_J_){ + var _H_ = caml_wrap_exception(_J_); + if(_H_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_H_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + var compare = runtime.caml_bytes_compare; + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_bytes_length(s)], + _D_ = caml_ml_bytes_length(s) - 1 | 0; + if(_D_ >= 0){ + var i = _D_; + for(;;){ + if(caml_bytes_unsafe_get(s, i) === sep){ + var _F_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _F_]; + j[1] = i; + } + var _G_ = i - 1 | 0; + if(0 !== i){var i = _G_; continue;} + break; + } + } + var _E_ = r[1]; + return [0, sub(s, 0, j[1]), _E_]; + } + function to_seq(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _B_ = i + 1 | 0; + return [0, x, function(_C_){return aux(_B_, _C_);}]; + } + var _z_ = 0; + return function(_A_){return aux(_z_, _A_);}; + } + function to_seqi(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _x_ = i + 1 | 0; + return [0, [0, i, x], function(_y_){return aux(_x_, _y_);}]; + } + var _v_ = 0; + return function(_w_){return aux(_v_, _w_);}; + } + function of_seq(i){ + var n = [0, 0], buf = [0, make(256, 0)]; + function _u_(c){ + if(n[1] === caml_ml_bytes_length(buf[1])){ + var + new_len = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(buf[1]) | 0, + Stdlib_Sys[12]); + if(caml_ml_bytes_length(buf[1]) === new_len) + caml_call1(Stdlib[2], cst_Bytes_of_seq_cannot_grow_b); + var new_buf = make(new_len, 0); + blit(buf[1], 0, new_buf, 0, n[1]); + buf[1] = new_buf; + } + caml_bytes_set(buf[1], n[1], c); + n[1]++; + return 0; + } + caml_call2(Stdlib_Seq[4], _u_, i); + return sub(buf[1], 0, n[1]); + } + function unsafe_get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function unsafe_get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int8(b, i){ + var _s_ = Stdlib_Sys[10] - 8 | 0, _t_ = Stdlib_Sys[10] - 8 | 0; + return caml_bytes_get(b, i) << _t_ >> _s_; + } + function get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int16_ne(b, i){ + var _q_ = Stdlib_Sys[10] - 16 | 0, _r_ = Stdlib_Sys[10] - 16 | 0; + return caml_bytes_get16(b, i) << _r_ >> _q_; + } + function get_int16_le(b, i){ + var _o_ = Stdlib_Sys[10] - 16 | 0, _p_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_le(b, i) << _p_ >> _o_; + } + function get_int16_be(b, i){ + var _m_ = Stdlib_Sys[10] - 16 | 0, _n_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_be(b, i) << _n_ >> _m_; + } + function get_int32_le(b, i){ + return Stdlib_Sys[11] + ? caml_int32_bswap(caml_bytes_get32(b, i)) + : caml_bytes_get32(b, i); + } + function get_int32_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get32(b, i) + : caml_int32_bswap(caml_bytes_get32(b, i)); + } + function get_int64_le(b, i){ + return Stdlib_Sys[11] + ? caml_int64_bswap(caml_bytes_get64(b, i)) + : caml_bytes_get64(b, i); + } + function get_int64_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get64(b, i) + : caml_int64_bswap(caml_bytes_get64(b, i)); + } + function unsafe_set_uint16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function unsafe_set_uint16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function set_int16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int32_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, caml_int32_bswap(x)) + : caml_bytes_set32(b, i, x); + } + function set_int32_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, x) + : caml_bytes_set32(b, i, caml_int32_bswap(x)); + } + function set_int64_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, caml_int64_bswap(x)) + : caml_bytes_set64(b, i, x); + } + function set_int64_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, x) + : caml_bytes_set64(b, i, caml_int64_bswap(x)); + } + var + set_uint8 = caml_bytes_set, + set_uint16_ne = caml_bytes_set16, + dec_invalid = Stdlib_Uchar[22]; + function dec_ret(n, u){ + var _l_ = caml_call1(Stdlib_Uchar[9], u); + return caml_call2(Stdlib_Uchar[21], n, _l_); + } + function not_in_x80_to_xBF(b){return 2 !== (b >>> 6 | 0) ? 1 : 0;} + function not_in_xA0_to_xBF(b){return 5 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x80_to_x9F(b){return 4 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x90_to_xBF(b){ + var _j_ = b < 144 ? 1 : 0, _k_ = _j_ || (191 < b ? 1 : 0); + return _k_; + } + function not_in_x80_to_x8F(b){return 8 !== (b >>> 4 | 0) ? 1 : 0;} + function utf_8_uchar_3(b0, b1, b2){ + return (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; + } + function utf_8_uchar_4(b0, b1, b2, b3){ + return (b0 & 7) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; + } + function get_utf_8_uchar(b, i){ + var b0 = caml_bytes_get(b, i), max = caml_ml_bytes_length(b) - 1 | 0; + if(224 <= b0){ + var switch$0 = 0; + if(237 <= b0){ + if(245 > b0) + switch(b0 - 237 | 0){ + case 0: + var i$0 = i + 1 | 0; + if(max < i$0) return caml_call1(dec_invalid, 1); + var b1 = caml_bytes_unsafe_get(b, i$0); + if(not_in_x80_to_x9F(b1)) return caml_call1(dec_invalid, 1); + var i$1 = i$0 + 1 | 0; + if(max < i$1) return caml_call1(dec_invalid, 2); + var b2 = caml_bytes_unsafe_get(b, i$1); + return not_in_x80_to_xBF(b2) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1, b2)); + case 3: + var i$4 = i + 1 | 0; + if(max < i$4) return caml_call1(dec_invalid, 1); + var b1$1 = caml_bytes_unsafe_get(b, i$4); + if(not_in_x90_to_xBF(b1$1)) return caml_call1(dec_invalid, 1); + var i$5 = i$4 + 1 | 0; + if(max < i$5) return caml_call1(dec_invalid, 2); + var b2$1 = caml_bytes_unsafe_get(b, i$5); + if(not_in_x80_to_xBF(b2$1)) return caml_call1(dec_invalid, 2); + var i$6 = i$5 + 1 | 0; + if(max < i$6) return caml_call1(dec_invalid, 3); + var b3 = caml_bytes_unsafe_get(b, i$6); + return not_in_x80_to_xBF(b3) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$1, b2$1, b3)); + case 7: + var i$10 = i + 1 | 0; + if(max < i$10) return caml_call1(dec_invalid, 1); + var b1$3 = caml_bytes_unsafe_get(b, i$10); + if(not_in_x80_to_x8F(b1$3)) return caml_call1(dec_invalid, 1); + var i$11 = i$10 + 1 | 0; + if(max < i$11) return caml_call1(dec_invalid, 2); + var b2$3 = caml_bytes_unsafe_get(b, i$11); + if(not_in_x80_to_xBF(b2$3)) return caml_call1(dec_invalid, 2); + var i$12 = i$11 + 1 | 0; + if(max < i$12) return caml_call1(dec_invalid, 3); + var b3$1 = caml_bytes_unsafe_get(b, i$12); + return not_in_x80_to_xBF(b3$1) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$3, b2$3, b3$1)); + case 1: + case 2: + switch$0 = 1; break; + default: + var i$7 = i + 1 | 0; + if(max < i$7) return caml_call1(dec_invalid, 1); + var b1$2 = caml_bytes_unsafe_get(b, i$7); + if(not_in_x80_to_xBF(b1$2)) return caml_call1(dec_invalid, 1); + var i$8 = i$7 + 1 | 0; + if(max < i$8) return caml_call1(dec_invalid, 2); + var b2$2 = caml_bytes_unsafe_get(b, i$8); + if(not_in_x80_to_xBF(b2$2)) return caml_call1(dec_invalid, 2); + var i$9 = i$8 + 1 | 0; + if(max < i$9) return caml_call1(dec_invalid, 3); + var b3$0 = caml_bytes_unsafe_get(b, i$9); + return not_in_x80_to_xBF(b3$0) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$2, b2$2, b3$0)); + } + } + else{ + if(225 > b0){ + var i$13 = i + 1 | 0; + if(max < i$13) return caml_call1(dec_invalid, 1); + var b1$4 = caml_bytes_unsafe_get(b, i$13); + if(not_in_xA0_to_xBF(b1$4)) return caml_call1(dec_invalid, 1); + var i$14 = i$13 + 1 | 0; + if(max < i$14) return caml_call1(dec_invalid, 2); + var b2$4 = caml_bytes_unsafe_get(b, i$14); + return not_in_x80_to_xBF(b2$4) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$4, b2$4)); + } + switch$0 = 1; + } + if(switch$0){ + var i$2 = i + 1 | 0; + if(max < i$2) return caml_call1(dec_invalid, 1); + var b1$0 = caml_bytes_unsafe_get(b, i$2); + if(not_in_x80_to_xBF(b1$0)) return caml_call1(dec_invalid, 1); + var i$3 = i$2 + 1 | 0; + if(max < i$3) return caml_call1(dec_invalid, 2); + var b2$0 = caml_bytes_unsafe_get(b, i$3); + return not_in_x80_to_xBF(b2$0) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$0, b2$0)); + } + } + else{ + if(128 > b0) return dec_ret(1, b0); + if(194 <= b0){ + var i$15 = i + 1 | 0; + if(max < i$15) return caml_call1(dec_invalid, 1); + var b1$5 = caml_bytes_unsafe_get(b, i$15); + return not_in_x80_to_xBF(b1$5) + ? caml_call1(dec_invalid, 1) + : dec_ret(2, (b0 & 31) << 6 | b1$5 & 63); + } + } + return caml_call1(dec_invalid, 1); + } + function set_utf_8_uchar(b, i, u){ + function set(_i_, _h_, _g_){ + caml_bytes_unsafe_set(_i_, _h_, _g_); + return 0; + } + var + max = caml_ml_bytes_length(b) - 1 | 0, + u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u$0){caml_bytes_set(b, i, u$0); return 1;} + if(2047 >= u$0){ + var last$1 = i + 1 | 0; + return max < last$1 + ? 0 + : (caml_bytes_set + (b, i, 192 | u$0 >>> 6 | 0), + set(b, last$1, 128 | u$0 & 63), + 2); + } + if(65535 >= u$0){ + var last$0 = i + 2 | 0; + return max < last$0 + ? 0 + : (caml_bytes_set + (b, i, 224 | u$0 >>> 12 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last$0, 128 | u$0 & 63), + 3); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var last = i + 3 | 0; + return max < last + ? 0 + : (caml_bytes_set + (b, i, 240 | u$0 >>> 18 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 12 | 0) & 63), + set(b, i + 2 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last, 128 | u$0 & 63), + 4); + } + function is_valid_utf_8(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + var match = caml_bytes_unsafe_get(b, i); + if(224 <= match){ + var switch$0 = 0; + if(237 <= match){ + if(245 > match) + switch(match - 237 | 0){ + case 0: + var last = i + 2 | 0; + if + (max >= last + && + ! + not_in_x80_to_x9F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last))){var i$0 = last + 1 | 0, i = i$0; continue;} + return 0; + case 3: + var last$1 = i + 3 | 0; + if + (max >= last$1 + && + ! + not_in_x90_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$1))){var i$2 = last$1 + 1 | 0, i = i$2; continue;} + return 0; + case 7: + var last$3 = i + 3 | 0; + if + (max >= last$3 + && + ! + not_in_x80_to_x8F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$3))){var i$4 = last$3 + 1 | 0, i = i$4; continue;} + return 0; + case 1: + case 2: + switch$0 = 1; break; + default: + var last$2 = i + 3 | 0; + if + (max >= last$2 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$2))){var i$3 = last$2 + 1 | 0, i = i$3; continue;} + return 0; + } + } + else{ + if(225 > match){ + var last$4 = i + 2 | 0; + if + (max >= last$4 + && + ! + not_in_xA0_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$4))){var i$5 = last$4 + 1 | 0, i = i$5; continue;} + return 0; + } + switch$0 = 1; + } + if(switch$0){ + var last$0 = i + 2 | 0; + if + (max >= last$0 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$0))){var i$1 = last$0 + 1 | 0, i = i$1; continue;} + return 0; + } + } + else{ + if(128 > match){var i$7 = i + 1 | 0, i = i$7; continue;} + if(194 <= match){ + var last$5 = i + 1 | 0; + if + (max >= last$5 + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$5))){var i$6 = last$5 + 1 | 0, i = i$6; continue;} + return 0; + } + } + return 0; + } + } + function get_utf_16be_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_be(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds); + } + function set_utf_16be_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_be(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_be(b, i, hi); + unsafe_set_uint16_be(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$0); + } + function is_valid_utf_16be(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_be(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + function get_utf_16le_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_le(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$1); + } + function set_utf_16le_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_le(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_le(b, i, hi); + unsafe_set_uint16_le(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$2); + } + function is_valid_utf_16le(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_le(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + var + Stdlib_Bytes = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + runtime.caml_bytes_equal, + starts_with, + ends_with, + caml_string_of_bytes, + caml_bytes_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + caml_bytes_get, + get_int8, + caml_bytes_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + caml_bytes_get32, + get_int32_be, + get_int32_le, + caml_bytes_get64, + get_int64_be, + get_int64_le, + set_uint8, + caml_bytes_set, + set_uint16_ne, + set_int16_be, + set_int16_le, + caml_bytes_set16, + set_int16_be, + set_int16_le, + caml_bytes_set32, + set_int32_be, + set_int32_le, + caml_bytes_set64, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(30, Stdlib_Bytes, "Stdlib__Bytes"); + return; + } + (globalThis)); + +//# 4733 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$0 = "", + caml_blit_string = runtime.caml_blit_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_hash = runtime.caml_string_hash, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + empty = cst$0, + Stdlib = global_data.Stdlib, + Stdlib_Bytes = global_data.Stdlib__Bytes, + bts = Stdlib_Bytes[44], + bos = Stdlib_Bytes[45], + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_String_concat = "String.concat"; + function make(n, c){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[1], n, c)); + } + function init(n, f){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[2], n, f)); + } + var of_bytes = Stdlib_Bytes[6], to_bytes = Stdlib_Bytes[5]; + function sub(s, ofs, len){ + var _X_ = caml_call1(bos, s); + return caml_call1(bts, caml_call3(Stdlib_Bytes[7], _X_, ofs, len)); + } + var blit = Stdlib_Bytes[12]; + function concat(sep, l){ + if(! l) return cst; + var seplen = caml_ml_string_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_string_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_String_concat), + acc = acc$0, + param = tl; + continue; + } + var _W_ = caml_ml_string_length(hd) + acc | 0; + } + else + var _W_ = acc; + var dst = runtime.caml_create_bytes(_W_), pos = pos$1, param$0 = l; + for(;;){ + if(param$0){ + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + caml_blit_string + (sep, 0, dst, pos + caml_ml_string_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_string_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + } + return caml_call1(bts, dst); + } + } + } + var cat = Stdlib[28]; + function iter(f, s){ + var _U_ = caml_ml_string_length(s) - 1 | 0, _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_call1(f, caml_string_unsafe_get(s, i)); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return 0; + } + function iteri(f, s){ + var _R_ = caml_ml_string_length(s) - 1 | 0, _Q_ = 0; + if(_R_ >= 0){ + var i = _Q_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(s, i)); + var _S_ = i + 1 | 0; + if(_R_ !== i){var i = _S_; continue;} + break; + } + } + return 0; + } + function map(f, s){ + var _P_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[17], f, _P_)); + } + function mapi(f, s){ + var _O_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[18], f, _O_)); + } + function fold_right(f, x, a){ + var _N_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[20], f, _N_, a); + } + function fold_left(f, a, x){ + var _M_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[19], f, a, _M_); + } + function exists(f, s){ + var _L_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[22], f, _L_); + } + function for_all(f, s){ + var _K_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[21], f, _K_); + } + function is_space(param){ + var _J_ = param - 9 | 0, switch$0 = 0; + if(4 < _J_ >>> 0){ + if(23 === _J_) switch$0 = 1; + } + else if(2 !== _J_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + if(caml_string_equal(s, cst$0)) return s; + if + (! + is_space(caml_string_unsafe_get(s, 0)) + && + ! + is_space(caml_string_unsafe_get(s, caml_ml_string_length(s) - 1 | 0))) + return s; + var _I_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[23], _I_)); + } + function escaped(s){ + var b = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[87], b)); + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_string_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_string_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) + return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _G_ = 1; return _G_;} + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_F_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_string_length(s) > i) + try{rindex_rec(s, i, c); var _D_ = 1; return _D_;} + catch(_E_){ + var _C_ = caml_wrap_exception(_E_); + if(_C_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_C_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + function uppercase_ascii(s){ + var _B_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[36], _B_)); + } + function lowercase_ascii(s){ + var _A_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[37], _A_)); + } + function capitalize_ascii(s){ + var _z_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[38], _z_)); + } + function uncapitalize_ascii(s){ + var _y_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[39], _y_)); + } + function starts_with(prefix, s){ + var + len_s = caml_ml_string_length(s), + len_pre = caml_ml_string_length(prefix), + _x_ = len_pre <= len_s ? 1 : 0; + if(! _x_) return _x_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_string_unsafe_get(s, i) !== caml_string_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_string_length(s), + len_suf = caml_ml_string_length(suffix), + diff = len_s - len_suf | 0, + _w_ = 0 <= diff ? 1 : 0; + if(! _w_) return _w_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_string_unsafe_get(s, diff + i | 0) + !== caml_string_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function hash(x){return caml_string_hash(0, x);} + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_string_length(s)], + _s_ = caml_ml_string_length(s) - 1 | 0; + if(_s_ >= 0){ + var i = _s_; + for(;;){ + if(caml_string_unsafe_get(s, i) === sep){ + var _u_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _u_]; + j[1] = i; + } + var _v_ = i - 1 | 0; + if(0 !== i){var i = _v_; continue;} + break; + } + } + var _t_ = r[1]; + return [0, sub(s, 0, j[1]), _t_]; + } + var compare = runtime.caml_string_compare; + function to_seq(s){ + var _r_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[47], _r_); + } + function to_seqi(s){ + var _q_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[48], _q_); + } + function of_seq(g){ + return caml_call1(bts, caml_call1(Stdlib_Bytes[49], g)); + } + function get_utf_8_uchar(s, i){ + var _p_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[50], _p_, i); + } + function is_valid_utf_8(s){ + var _o_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[52], _o_); + } + function get_utf_16be_uchar(s, i){ + var _n_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[53], _n_, i); + } + function is_valid_utf_16be(s){ + var _m_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[55], _m_); + } + function get_utf_16le_uchar(s, i){ + var _l_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[56], _l_, i); + } + function is_valid_utf_16le(s){ + var _k_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[58], _k_); + } + function get_int8(s, i){ + var _j_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[60], _j_, i); + } + function get_uint16_le(s, i){ + var _i_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[63], _i_, i); + } + function get_uint16_be(s, i){ + var _h_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[62], _h_, i); + } + function get_int16_ne(s, i){ + var _g_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[64], _g_, i); + } + function get_int16_le(s, i){ + var _f_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[66], _f_, i); + } + function get_int16_be(s, i){ + var _e_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[65], _e_, i); + } + function get_int32_le(s, i){ + var _d_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[69], _d_, i); + } + function get_int32_be(s, i){ + var _c_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[68], _c_, i); + } + function get_int64_le(s, i){ + var _b_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[72], _b_, i); + } + function get_int64_be(s, i){ + var _a_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[71], _a_, i); + } + var + Stdlib_String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + caml_string_equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + runtime.caml_string_get, + get_int8, + runtime.caml_string_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + runtime.caml_string_get32, + hash, + caml_string_hash, + get_int32_be, + get_int32_le, + runtime.caml_string_get64, + get_int64_be, + get_int64_le]; + runtime.caml_register_global(12, Stdlib_String, "Stdlib__String"); + return; + } + (globalThis)); + +//# 5208 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = "()"; + function equal(param, _b_){return 1;} + function compare(param, _a_){return 0;} + function to_string(param){return cst;} + var Stdlib_Unit = [0, equal, compare, to_string]; + runtime.caml_register_global(1, Stdlib_Unit, "Stdlib__Unit"); + return; + } + (globalThis)); + +//# 5286 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_array_sub = runtime.caml_array_sub, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Floatarray = [0], + _a_ = [0, "array.ml", 319, 4], + cst_Array_combine = "Array.combine", + cst_Array_exists2 = "Array.exists2", + cst_Array_for_all2 = "Array.for_all2", + cst_Array_map2_arrays_must_hav = + "Array.map2: arrays must have the same length", + cst_Array_iter2_arrays_must_ha = + "Array.iter2: arrays must have the same length", + cst_Array_blit = "Array.blit", + cst_Array_fill = "Array.fill", + cst_Array_sub = "Array.sub", + cst_Array_init = "Array.init", + cst_Stdlib_Array_Bottom = "Stdlib.Array.Bottom"; + function init(l, f){ + if(0 === l) return [0]; + if(0 > l) return caml_call1(Stdlib[1], cst_Array_init); + var res = caml_make_vect(l, caml_call1(f, 0)), _as_ = l - 1 | 0, _ar_ = 1; + if(_as_ >= 1){ + var i = _ar_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _at_ = i + 1 | 0; + if(_as_ !== i){var i = _at_; continue;} + break; + } + } + return res; + } + function make_matrix(sx, sy, init){ + var res = caml_make_vect(sx, [0]), _ap_ = sx - 1 | 0, _ao_ = 0; + if(_ap_ >= 0){ + var x = _ao_; + for(;;){ + res[1 + x] = caml_make_vect(sy, init); + var _aq_ = x + 1 | 0; + if(_ap_ !== x){var x = _aq_; continue;} + break; + } + } + return res; + } + function copy(a){ + var l = a.length - 1; + return 0 === l ? [0] : caml_array_sub(a, 0, l); + } + function append(a1, a2){ + var l1 = a1.length - 1; + return 0 === l1 + ? copy(a2) + : 0 + === a2.length - 1 + ? caml_array_sub(a1, 0, l1) + : runtime.caml_array_append(a1, a2); + } + function sub(a, ofs, len){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return caml_array_sub(a, ofs, len); + return caml_call1(Stdlib[1], cst_Array_sub); + } + function fill(a, ofs, len, v){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return runtime.caml_array_fill(a, ofs, len, v); + return caml_call1(Stdlib[1], cst_Array_fill); + } + function blit(a1, ofs1, a2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (a1.length - 1 - len | 0) >= ofs1 + && 0 <= ofs2 && (a2.length - 1 - len | 0) >= ofs2) + return runtime.caml_array_blit(a1, ofs1, a2, ofs2, len); + return caml_call1(Stdlib[1], cst_Array_blit); + } + function iter(f, a){ + var _am_ = a.length - 1 - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, a[1 + i]); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Array_iter2_arrays_must_ha); + var _aj_ = a.length - 1 - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call1(f, a[1])), + _ag_ = l - 1 | 0, + _af_ = 1; + if(_ag_ >= 1){ + var i = _af_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _ah_ = i + 1 | 0; + if(_ag_ !== i){var i = _ah_; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Array_map2_arrays_must_hav); + if(0 === la) return [0]; + var + r = caml_make_vect(la, caml_call2(f, a[1], b[1])), + _ad_ = la - 1 | 0, + _ac_ = 1; + if(_ad_ >= 1){ + var i = _ac_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call2(f, 0, a[1])), + _Z_ = l - 1 | 0, + _Y_ = 1; + if(_Z_ >= 1){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function to_list(a){ + var i$1 = a.length - 1 - 1 | 0, i = i$1, res = 0; + for(;;){ + if(0 > i) return res; + var res$0 = [0, a[1 + i], res], i$0 = i - 1 | 0, i = i$0, res = res$0; + } + } + function list_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + t = param$0[2], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = t; + } + } + function of_list(l){ + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + a = caml_make_vect(list_length(0, l), hd), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i + 1 | 0, i = i$0, param = tl$0; + } + } + function fold_left(f, x, a){ + var r = [0, x], _W_ = a.length - 1 - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r[1]; + } + function fold_left_map(f, acc, input_array){ + var len = input_array.length - 1; + if(0 === len) return [0, acc, [0]]; + var + match = caml_call2(f, acc, input_array[1]), + elt = match[2], + acc$0 = match[1], + output_array = caml_make_vect(len, elt), + acc$1 = [0, acc$0], + _T_ = len - 1 | 0, + _S_ = 1; + if(_T_ >= 1){ + var i = _S_; + for(;;){ + var + match$0 = caml_call2(f, acc$1[1], input_array[1 + i]), + elt$0 = match$0[2], + acc$2 = match$0[1]; + acc$1[1] = acc$2; + output_array[1 + i] = elt$0; + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return [0, acc$1[1], output_array]; + } + function fold_right(f, a, x){ + var r = [0, x], _Q_ = a.length - 1 - 1 | 0; + if(_Q_ >= 0){ + var i = _Q_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _R_ = i - 1 | 0; + if(0 !== i){var i = _R_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_for_all2); + var i = 0; + for(;;){ + if(i === n1) return 1; + if(! caml_call2(p, l1[1 + i], l2[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function exists2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_exists2); + var i = 0; + for(;;){ + if(i === n1) return 0; + if(caml_call2(p, l1[1 + i], l2[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === runtime.caml_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function memq(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x === a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_opt(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var x = a[1 + i]; + if(caml_call1(p, x)) return [0, x]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_map(f, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var r = caml_call1(f, a[1 + i]); + if(r) return r; + var i$0 = i + 1 | 0, i = i$0; + } + } + function split(x){ + if(runtime.caml_equal(x, [0])) return [0, [0], [0]]; + var + match = x[1], + b0 = match[2], + a0 = match[1], + n = x.length - 1, + a = caml_make_vect(n, a0), + b = caml_make_vect(n, b0), + _O_ = n - 1 | 0, + _N_ = 1; + if(_O_ >= 1){ + var i = _N_; + for(;;){ + var match$0 = x[1 + i], bi = match$0[2], ai = match$0[1]; + a[1 + i] = ai; + b[1 + i] = bi; + var _P_ = i + 1 | 0; + if(_O_ !== i){var i = _P_; continue;} + break; + } + } + return [0, a, b]; + } + function combine(a, b){ + var na = a.length - 1, nb = b.length - 1; + if(na !== nb) caml_call1(Stdlib[1], cst_Array_combine); + if(0 === na) return [0]; + var x = caml_make_vect(na, [0, a[1], b[1]]), _L_ = na - 1 | 0, _K_ = 1; + if(_L_ >= 1){ + var i = _K_; + for(;;){ + x[1 + i] = [0, a[1 + i], b[1 + i]]; + var _M_ = i + 1 | 0; + if(_L_ !== i){var i = _M_; continue;} + break; + } + } + return x; + } + var Bottom = [248, cst_Stdlib_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + var _D_ = i31 + 1 | 0, _E_ = caml_check_bound(a, _D_)[1 + _D_]; + if(caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _E_) < 0) + x[1] = i31 + 1 | 0; + var + _F_ = i31 + 2 | 0, + _G_ = caml_check_bound(a, _F_)[1 + _F_], + _H_ = x[1]; + if(caml_call2(cmp, caml_check_bound(a, _H_)[1 + _H_], _G_) < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if((i31 + 1 | 0) < l){ + var _I_ = i31 + 1 | 0, _J_ = caml_check_bound(a, _I_)[1 + _I_]; + if(0 > caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _J_)) + return i31 + 1 | 0; + } + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _x_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_x_ >= 0){ + var i$6 = _x_; + for(;;){ + var e$1 = caml_check_bound(a, i$6)[1 + i$6]; + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_check_bound(a, j)[1 + j], e$1)){ + var _u_ = caml_check_bound(a, j)[1 + j]; + caml_check_bound(a, i)[1 + i] = _u_; + var i = j; + continue; + } + caml_check_bound(a, i)[1 + i] = e$1; + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_check_bound(a, i$0)[1 + i$0] = e$1; + } + var _C_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _C_; continue;} + break; + } + } + var _y_ = l - 1 | 0; + if(_y_ >= 2){ + var i$4 = _y_; + a: + for(;;){ + var e$0 = caml_check_bound(a, i$4)[1 + i$4]; + a[1 + i$4] = caml_check_bound(a, 0)[1]; + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1), _v_ = caml_check_bound(a, j$0)[1 + j$0]; + caml_check_bound(a, i$1)[1 + i$1] = _v_; + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(0 <= caml_call2(cmp, caml_check_bound(a, father)[1 + father], e$0)) + caml_check_bound(a, i$3)[1 + i$3] = e$0; + else{ + var _w_ = caml_check_bound(a, father)[1 + father]; + caml_check_bound(a, i$3)[1 + i$3] = _w_; + if(0 < father){var i$3 = father; continue;} + caml_check_bound(a, 0)[1] = e$0; + } + var _B_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _B_; continue a;} + break; + } + } + break; + } + } + var _z_ = 1 < l ? 1 : 0; + if(_z_){ + var e = caml_check_bound(a, 1)[2]; + a[2] = caml_check_bound(a, 0)[1]; + a[1] = e; + var _A_ = 0; + } + else + var _A_ = _z_; + return _A_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_check_bound(src2, src2ofs)[1 + src2ofs], + s1$1 = caml_check_bound(a, src1ofs)[1 + src1ofs], + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_check_bound(dst, d)[1 + d] = s2; + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_check_bound(src2, i2$0)[1 + i2$0], + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_check_bound(dst, d)[1 + d] = s1; + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_check_bound(a, i1$0)[1 + i1$0], + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _m_ = len - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + a: + for(;;){ + var + _n_ = srcofs + i | 0, + e = caml_check_bound(a, _n_)[1 + _n_], + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if(dstofs <= j[1]){ + var _o_ = j[1]; + if(0 < caml_call2(cmp, caml_check_bound(dst, _o_)[1 + _o_], e)){ + var + _p_ = j[1], + _q_ = caml_check_bound(dst, _p_)[1 + _p_], + _r_ = j[1] + 1 | 0; + caml_check_bound(dst, _r_)[1 + _r_] = _q_; + j[1] += -1; + continue; + } + } + var _s_ = j[1] + 1 | 0; + caml_check_bound(dst, _s_)[1 + _s_] = e; + var _t_ = i + 1 | 0; + if(_m_ !== i){var i = _t_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var + l1 = l / 2 | 0, + l2 = l - l1 | 0, + t = caml_make_vect(l2, caml_check_bound(a, 0)[1]); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _j_ = i + 1 | 0; + return [0, x, function(_k_){return aux(_j_, _k_);}]; + } + var _h_ = 0; + return function(_i_){return aux(_h_, _i_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _f_ = i + 1 | 0; + return [0, [0, i, x], function(_g_){return aux(_f_, _g_);}]; + } + var _d_ = 0; + return function(_e_){return aux(_d_, _e_);}; + } + function of_seq(i$2){ + var _b_ = 0; + function _c_(acc, x){return [0, x, acc];} + var l = caml_call3(Stdlib_Seq[5], _c_, _b_, i$2); + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + len = list_length(0, l), + a = caml_make_vect(len, hd), + i$1 = len - 2 | 0, + i = i$1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i - 1 | 0, i = i$0, param = tl$0; + } + } + var + Stdlib_Array = + [0, + init, + make_matrix, + append, + runtime.caml_array_concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(14, Stdlib_Array, "Stdlib__Array"); + return; + } + (globalThis)); + +//# 5961 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Float_array_blit$1 = "Float.array.blit", + cst_float_ml = "float.ml", + caml_array_get = runtime.caml_array_get, + caml_array_set = runtime.caml_array_set, + caml_float_compare = runtime.caml_float_compare, + caml_floatarray_blit = runtime.caml_floatarray_blit, + caml_floatarray_create = runtime.caml_floatarray_create, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_nextafter_float = runtime.caml_nextafter_float, + caml_signbit_float = runtime.caml_signbit_float, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + _b_ = [0, cst_float_ml, 395, 6], + cst_Float_Array_map2_arrays_mu = + "Float.Array.map2: arrays must have the same length", + cst_Float_Array_iter2_arrays_m = + "Float.Array.iter2: arrays must have the same length", + cst_Float_array_blit = cst_Float_array_blit$1, + cst_Float_array_blit$0 = cst_Float_array_blit$1, + cst_Float_Array_fill = "Float.Array.fill", + cst_Float_Array_sub = "Float.Array.sub", + _a_ = [0, cst_float_ml, 222, 14], + cst_Float_Array_concat = "Float.Array.concat", + cst_Float_Array_init = "Float.Array.init", + cst_Stdlib_Float_Array_Bottom = "Stdlib.Float.Array.Bottom", + zero = 0., + one = 1., + minus_one = -1.; + function is_finite(x){return x - x == 0. ? 1 : 0;} + function is_infinite(x){return 1. / x == 0. ? 1 : 0;} + function is_nan(x){return x != x ? 1 : 0;} + var + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon = Stdlib[27], + of_string_opt = Stdlib[36], + to_string = Stdlib[35], + pi = 3.141592653589793; + function is_integer(x){ + var _aq_ = x == runtime.caml_trunc_float(x) ? 1 : 0; + return _aq_ ? is_finite(x) : _aq_; + } + function succ(x){return caml_nextafter_float(x, infinity);} + function pred(x){return caml_nextafter_float(x, neg_infinity);} + function equal(x, y){return 0 === caml_float_compare(x, y) ? 1 : 0;} + function min(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? x : y; + } + return y != y ? y : x; + } + function max(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? y : x; + } + return x != x ? x : y; + } + function min_max(x, y){ + if(x == x && y == y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + return [0, nan, nan]; + } + function min_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? x : y; + } + return x != x ? y : x; + } + function max_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? y : x; + } + return y != y ? x : y; + } + function min_max_num(x, y){ + if(x != x) return [0, y, y]; + if(y != y) return [0, x, x]; + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + function hash(x){return runtime.caml_hash(10, 100, 0, x);} + function unsafe_fill(a, ofs, len, v){ + var _ao_ = (ofs + len | 0) - 1 | 0; + if(_ao_ >= ofs){ + var i = ofs; + for(;;){ + a[1 + i] = v; + var _ap_ = i + 1 | 0; + if(_ao_ !== i){var i = _ap_; continue;} + break; + } + } + return 0; + } + function check(a, ofs, len, msg){ + var _ak_ = ofs < 0 ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else{ + var _am_ = len < 0 ? 1 : 0; + if(_am_) + var _al_ = _am_; + else + var + _an_ = (ofs + len | 0) < 0 ? 1 : 0, + _al_ = _an_ || (a.length - 1 < (ofs + len | 0) ? 1 : 0); + } + return _al_ ? caml_call1(Stdlib[1], msg) : _al_; + } + function make(n, v){ + var result = caml_floatarray_create(n); + unsafe_fill(result, 0, n, v); + return result; + } + function init(l, f){ + if(0 > l) return caml_call1(Stdlib[1], cst_Float_Array_init); + var res = caml_floatarray_create(l), _ai_ = l - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _aj_ = i + 1 | 0; + if(_ai_ !== i){var i = _aj_; continue;} + break; + } + } + return res; + } + function append(a1, a2){ + var + l1 = a1.length - 1, + l2 = a2.length - 1, + result = caml_floatarray_create(l1 + l2 | 0); + caml_floatarray_blit(a1, 0, result, 0, l1); + caml_floatarray_blit(a2, 0, result, l1, l2); + return result; + } + function concat(l){ + var acc = 0, param = l; + for(;;){ + if(param){ + var + tl = param[2], + hd = param[1], + x = hd.length - 1 + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Float_Array_concat), + acc = acc$0, + param = tl; + continue; + } + var result = caml_floatarray_create(acc), l$0 = l, i = 0; + for(;;){ + if(l$0){ + var tl$0 = l$0[2], hd$0 = l$0[1], hlen = hd$0.length - 1; + caml_floatarray_blit(hd$0, 0, result, i, hlen); + var i$0 = i + hlen | 0, l$0 = tl$0, i = i$0; + continue; + } + if(i === acc) return result; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + } + function sub(a, ofs, len){ + check(a, ofs, len, cst_Float_Array_sub); + var result = caml_floatarray_create(len); + caml_floatarray_blit(a, ofs, result, 0, len); + return result; + } + function copy(a){ + var l = a.length - 1, result = caml_floatarray_create(l); + caml_floatarray_blit(a, 0, result, 0, l); + return result; + } + function fill(a, ofs, len, v){ + check(a, ofs, len, cst_Float_Array_fill); + return unsafe_fill(a, ofs, len, v); + } + function blit(src, sofs, dst, dofs, len){ + check(src, sofs, len, cst_Float_array_blit); + check(dst, dofs, len, cst_Float_array_blit$0); + return caml_floatarray_blit(src, sofs, dst, dofs, len); + } + function to_list(a){ + function _af_(_ag_){return a[1 + _ag_];} + return caml_call2(Stdlib_List[10], a.length - 1, _af_); + } + function of_list(l){ + var + result = caml_floatarray_create(caml_call1(Stdlib_List[1], l)), + i = 0, + l$0 = l; + for(;;){ + if(! l$0) return result; + var t = l$0[2], h = l$0[1]; + result[1 + i] = h; + var i$0 = i + 1 | 0, i = i$0, l$0 = t; + } + } + function iter(f, a){ + var _ad_ = a.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + caml_call1(f, a[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Float_Array_iter2_arrays_m); + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Z_ = l - 1 | 0, + _Y_ = 0; + if(_Z_ >= 0){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Float_Array_map2_arrays_mu); + var r = caml_floatarray_create(la), _W_ = la - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _T_ = a.length - 1 - 1 | 0, _S_ = 0; + if(_T_ >= 0){ + var i = _S_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Q_ = l - 1 | 0, + _P_ = 0; + if(_Q_ >= 0){ + var i = _P_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var _R_ = i + 1 | 0; + if(_Q_ !== i){var i = _R_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _N_ = a.length - 1 - 1 | 0, _M_ = 0; + if(_N_ >= 0){ + var i = _M_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _O_ = i + 1 | 0; + if(_N_ !== i){var i = _O_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _K_ = a.length - 1 - 1 | 0; + if(_K_ >= 0){ + var i = _K_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _L_ = i - 1 | 0; + if(0 !== i){var i = _L_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === caml_float_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem_ieee(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x == a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + var + Bottom = [248, cst_Stdlib_Float_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + if + (caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0)) + < 0) + x[1] = i31 + 1 | 0; + if + (caml_call2 + (cmp, caml_array_get(a, x[1]), caml_array_get(a, i31 + 2 | 0)) + < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if + ((i31 + 1 | 0) < l + && + 0 + > + caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0))) + return i31 + 1 | 0; + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _E_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_E_ >= 0){ + var i$6 = _E_; + for(;;){ + var e$1 = caml_array_get(a, i$6); + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_array_get(a, j), e$1)){ + caml_array_set(a, i, caml_array_get(a, j)); + var i = j; + continue; + } + caml_array_set(a, i, e$1); + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_array_set(a, i$0, e$1); + } + var _J_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _J_; continue;} + break; + } + } + var _F_ = l - 1 | 0; + if(_F_ >= 2){ + var i$4 = _F_; + a: + for(;;){ + var e$0 = caml_array_get(a, i$4); + caml_array_set(a, i$4, caml_array_get(a, 0)); + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1); + caml_array_set(a, i$1, caml_array_get(a, j$0)); + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(0 <= caml_call2(cmp, caml_array_get(a, father), e$0)) + caml_array_set(a, i$3, e$0); + else{ + caml_array_set(a, i$3, caml_array_get(a, father)); + if(0 < father){var i$3 = father; continue;} + caml_array_set(a, 0, e$0); + } + var _I_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _I_; continue a;} + break; + } + } + break; + } + } + var _G_ = 1 < l ? 1 : 0; + if(_G_){ + var e = caml_array_get(a, 1); + caml_array_set(a, 1, caml_array_get(a, 0)); + var _H_ = caml_array_set(a, 0, e); + } + else + var _H_ = _G_; + return _H_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_array_get(src2, src2ofs), + s1$1 = caml_array_get(a, src1ofs), + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_array_set(dst, d, s2); + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_array_get(src2, i2$0), + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_array_set(dst, d, s1); + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_array_get(a, i1$0), + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _C_ = len - 1 | 0, _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + a: + for(;;){ + var + e = caml_array_get(a, srcofs + i | 0), + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if + (dstofs <= j[1] && 0 < caml_call2(cmp, caml_array_get(dst, j[1]), e)){ + caml_array_set(dst, j[1] + 1 | 0, caml_array_get(dst, j[1])); + j[1] += -1; + continue; + } + caml_array_set(dst, j[1] + 1 | 0, e); + var _D_ = i + 1 | 0; + if(_C_ !== i){var i = _D_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var l1 = l / 2 | 0, l2 = l - l1 | 0, t = caml_floatarray_create(l2); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _z_ = i + 1 | 0; + return [0, x, function(_A_){return aux(_z_, _A_);}]; + } + var _x_ = 0; + return function(_y_){return aux(_x_, _y_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _v_ = i + 1 | 0; + return [0, [0, i, x], function(_w_){return aux(_v_, _w_);}]; + } + var _t_ = 0; + return function(_u_){return aux(_t_, _u_);}; + } + function of_seq(i$2){ + var _r_ = 0; + function _s_(acc, x){return [0, x, acc];} + var + l = caml_call3(Stdlib_Seq[5], _s_, _r_, i$2), + len = caml_call1(Stdlib_List[1], l), + a = caml_floatarray_create(len), + i$1 = len - 1 | 0, + i = i$1, + param = l; + for(;;){ + if(! param) return a; + var tl = param[2], hd = param[1]; + a[1 + i] = hd; + var i$0 = i - 1 | 0, i = i$0, param = tl; + } + } + function map_to_array(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = runtime.caml_make_vect(l, caml_call1(f, a[1])), + _p_ = l - 1 | 0, + _o_ = 1; + if(_p_ >= 1){ + var i = _o_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return r; + } + function map_from_array(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _m_ = l - 1 | 0, + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return r; + } + var + _c_ = caml_floatarray_create, + _d_ = caml_array_set, + _e_ = caml_array_get, + _f_ = + [0, + function(_k_){return _k_.length - 1;}, + _e_, + _d_, + make, + _c_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _g_ = caml_floatarray_create, + _h_ = caml_array_set, + _i_ = caml_array_get, + Stdlib_Float = + [0, + zero, + one, + minus_one, + succ, + pred, + infinity, + neg_infinity, + nan, + pi, + max_float, + min_float, + epsilon, + is_finite, + is_infinite, + is_nan, + is_integer, + of_string_opt, + to_string, + caml_float_compare, + equal, + min, + max, + min_max, + min_num, + max_num, + min_max_num, + hash, + [0, + function(_j_){return _j_.length - 1;}, + _i_, + _h_, + make, + _g_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _f_]; + runtime.caml_register_global(22, Stdlib_Float, "Stdlib__Float"); + return; + } + (globalThis)); + +//# 6723 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "int32.ml", 69, 6], + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var min_int = -2147483648, max_int = 2147483647; + function lognot(n){return n ^ -1;} + var _a_ = Stdlib_Sys[9]; + if(32 === _a_) + var + max_int$0 = Stdlib[19], + unsigned_to_int = + function(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + }; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var unsigned_to_int = function(n){return [0, n & -1];}; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _d_ = [0, runtime.caml_int_of_string(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n + 2147483648 | 0, m + 2147483648 | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Int32 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(14, Stdlib_Int32, "Stdlib__Int32"); + return; + } + (globalThis)); + +//# 6815 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_sub = runtime.caml_int64_sub, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + zero = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + one = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + minus_one = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + min_int = runtime.caml_int64_create_lo_mi_hi(0, 0, 32768), + max_int = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Stdlib = global_data.Stdlib, + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function succ(n){return runtime.caml_int64_add(n, _a_);} + function pred(n){return caml_int64_sub(n, _b_);} + function abs(n){ + return caml_greaterequal(n, _c_) ? n : runtime.caml_int64_neg(n); + } + function lognot(n){return runtime.caml_int64_xor(n, _d_);} + var max_int$0 = runtime.caml_int64_of_int32(Stdlib[19]); + function unsigned_to_int(n){ + if + (0 >= caml_int64_compare(zero, n) + && 0 >= caml_int64_compare(n, max_int$0)) + return [0, runtime.caml_int64_to_int32(n)]; + return 0; + } + function to_string(n){return runtime.caml_int64_format("%d", n);} + function of_string_opt(s){ + try{var _f_ = [0, runtime.caml_int64_of_string(s)]; return _f_;} + catch(_g_){ + var _e_ = caml_wrap_exception(_g_); + if(_e_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_e_, 0); + } + } + function compare(x, y){return caml_int64_compare(x, y);} + function equal(x, y){return 0 === caml_int64_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int64_compare + (caml_int64_sub(n, min_int), caml_int64_sub(m, min_int)); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, zero)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var + q = + runtime.caml_int64_shift_left + (runtime.caml_int64_div + (runtime.caml_int64_shift_right_unsigned(n, 1), d), + 1), + r = caml_int64_sub(n, caml_int64_mul(q, d)); + return 0 <= unsigned_compare(r, d) ? succ(q) : q; + } + function unsigned_rem(n, d){ + return caml_int64_sub(n, caml_int64_mul(unsigned_div(n, d), d)); + } + var + Stdlib_Int64 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(11, Stdlib_Int64, "Stdlib__Int64"); + return; + } + (globalThis)); + +//# 6912 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var + size = Stdlib_Sys[9], + min_int = 1 << (size - 1 | 0), + max_int = min_int - 1 | 0; + function lognot(n){return n ^ -1;} + var max_int$0 = Stdlib[19]; + function unsigned_to_int(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _b_ = [0, runtime.caml_int_of_string(s)]; return _b_;} + catch(_c_){ + var _a_ = caml_wrap_exception(_c_); + if(_a_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_a_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n - min_int | 0, m - min_int | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Nativeint = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + size, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(12, Stdlib_Nativeint, "Stdlib__Nativeint"); + return; + } + (globalThis)); + +//# 6997 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = "", + caml_bytes_get = runtime.caml_bytes_get, + caml_check_bound = runtime.caml_check_bound, + caml_create_bytes = runtime.caml_create_bytes, + caml_ml_bytes_length = runtime.caml_ml_bytes_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + dummy_pos = [0, cst, 0, 0, -1], + zero_pos = [0, cst, 1, 0, 0], + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + cst_Lexing_lex_refill_cannot_g = "Lexing.lex_refill: cannot grow buffer"; + function engine(tbl, state, buf){ + var + result = runtime.caml_lex_engine(tbl, state, buf), + _F_ = 0 <= result ? 1 : 0, + _G_ = _F_ ? buf[12] !== dummy_pos ? 1 : 0 : _F_; + if(_G_){ + buf[11] = buf[12]; + var _H_ = buf[12]; + buf[12] = [0, _H_[1], _H_[2], _H_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function new_engine(tbl, state, buf){ + var + result = runtime.caml_new_lex_engine(tbl, state, buf), + _C_ = 0 <= result ? 1 : 0, + _D_ = _C_ ? buf[12] !== dummy_pos ? 1 : 0 : _C_; + if(_D_){ + buf[11] = buf[12]; + var _E_ = buf[12]; + buf[12] = [0, _E_[1], _E_[2], _E_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function from_function(opt, read_fun){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _o_ = with_positions ? zero_pos : dummy_pos, + _p_ = with_positions ? zero_pos : dummy_pos, + aux_buffer = caml_create_bytes(512), + _q_ = [0], + _r_ = 0, + _s_ = 0, + _t_ = 0, + _u_ = 0, + _v_ = 0, + _w_ = 0, + _x_ = 0, + _y_ = caml_create_bytes(1024); + return [0, + function(lexbuf){ + var + read = + caml_call2 + (read_fun, aux_buffer, caml_ml_bytes_length(aux_buffer)), + n = 0 < read ? read : (lexbuf[9] = 1, 0); + if(caml_ml_bytes_length(lexbuf[2]) < (lexbuf[3] + n | 0)){ + if + (((lexbuf[3] - lexbuf[5] | 0) + n | 0) + <= caml_ml_bytes_length(lexbuf[2])) + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + lexbuf[2], + 0, + lexbuf[3] - lexbuf[5] | 0); + else{ + var + newlen = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(lexbuf[2]) | 0, + Stdlib_Sys[12]); + if(newlen < ((lexbuf[3] - lexbuf[5] | 0) + n | 0)) + caml_call1(Stdlib[2], cst_Lexing_lex_refill_cannot_g); + var newbuf = caml_create_bytes(newlen); + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + newbuf, + 0, + lexbuf[3] - lexbuf[5] | 0); + lexbuf[2] = newbuf; + } + var s = lexbuf[5]; + lexbuf[4] = lexbuf[4] + s | 0; + lexbuf[6] = lexbuf[6] - s | 0; + lexbuf[5] = 0; + lexbuf[7] = lexbuf[7] - s | 0; + lexbuf[3] = lexbuf[3] - s | 0; + var t = lexbuf[10], _A_ = t.length - 1 - 1 | 0, _z_ = 0; + if(_A_ >= 0){ + var i = _z_; + for(;;){ + var v = caml_check_bound(t, i)[1 + i]; + if(0 <= v) caml_check_bound(t, i)[1 + i] = v - s | 0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + } + caml_call5 + (Stdlib_Bytes[11], aux_buffer, 0, lexbuf[2], lexbuf[3], n); + lexbuf[3] = lexbuf[3] + n | 0; + return 0; + }, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_]; + } + function from_channel(with_positions, ic){ + return from_function + (with_positions, + function(buf, n){return caml_call4(Stdlib[84], ic, buf, 0, n);}); + } + function from_string(opt, s){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _d_ = with_positions ? zero_pos : dummy_pos, + _e_ = with_positions ? zero_pos : dummy_pos, + _f_ = [0], + _g_ = 1, + _h_ = 0, + _i_ = 0, + _j_ = 0, + _k_ = 0, + _l_ = 0, + _m_ = runtime.caml_ml_string_length(s), + _n_ = caml_call1(Stdlib_Bytes[5], s); + return [0, + function(lexbuf){lexbuf[9] = 1; return 0;}, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_, + _f_, + _e_, + _d_]; + } + function set_position(lexbuf, position){ + lexbuf[12] = [0, lexbuf[12][1], position[2], position[3], position[4]]; + lexbuf[4] = position[4]; + return 0; + } + function set_filename(lexbuf, fname){ + var _c_ = lexbuf[12]; + lexbuf[12] = [0, fname, _c_[2], _c_[3], _c_[4]]; + return 0; + } + function with_positions(lexbuf){return lexbuf[12] !== dummy_pos ? 1 : 0;} + function lexeme(lexbuf){ + var len = lexbuf[6] - lexbuf[5] | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], lexbuf[5], len); + } + function sub_lexeme(lexbuf, i1, i2){ + var len = i2 - i1 | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len); + } + function sub_lexeme_opt(lexbuf, i1, i2){ + if(0 > i1) return 0; + var len = i2 - i1 | 0; + return [0, caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len)]; + } + function sub_lexeme_char(lexbuf, i){return caml_bytes_get(lexbuf[2], i);} + function sub_lexeme_char_opt(lexbuf, i){ + return 0 <= i ? [0, caml_bytes_get(lexbuf[2], i)] : 0; + } + function lexeme_char(lexbuf, i){ + return caml_bytes_get(lexbuf[2], lexbuf[5] + i | 0); + } + function lexeme_start(lexbuf){return lexbuf[11][4];} + function lexeme_end(lexbuf){return lexbuf[12][4];} + function lexeme_start_p(lexbuf){return lexbuf[11];} + function lexeme_end_p(lexbuf){return lexbuf[12];} + function new_line(lexbuf){ + var + lcp = lexbuf[12], + _a_ = lcp !== dummy_pos ? 1 : 0, + _b_ = + _a_ + ? (lexbuf[12] = [0, lcp[1], lcp[2] + 1 | 0, lcp[4], lcp[4]], 0) + : _a_; + return _b_; + } + function flush_input(lb){ + lb[6] = 0; + lb[4] = 0; + var lcp = lb[12]; + if(lcp !== dummy_pos) + lb[12] = [0, lcp[1], zero_pos[2], zero_pos[3], zero_pos[4]]; + lb[3] = 0; + return 0; + } + var + Stdlib_Lexing = + [0, + dummy_pos, + from_channel, + from_string, + from_function, + set_position, + set_filename, + with_positions, + lexeme, + lexeme_char, + lexeme_start, + lexeme_end, + lexeme_start_p, + lexeme_end_p, + new_line, + flush_input, + sub_lexeme, + sub_lexeme_opt, + sub_lexeme_char, + sub_lexeme_char_opt, + engine, + new_engine]; + runtime.caml_register_global(7, Stdlib_Lexing, "Stdlib__Lexing"); + return; + } + (globalThis)); + +//# 7276 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Lexing = global_data.Stdlib__Lexing, + YYexit = [248, "Stdlib.Parsing.YYexit", caml_fresh_oo_id(0)], + Parse_error = [248, "Stdlib.Parsing.Parse_error", caml_fresh_oo_id(0)], + env = + [0, + caml_make_vect(100, 0), + caml_make_vect(100, 0), + caml_make_vect(100, Stdlib_Lexing[1]), + caml_make_vect(100, Stdlib_Lexing[1]), + 100, + 0, + 0, + 0, + Stdlib_Lexing[1], + Stdlib_Lexing[1], + 0, + 0, + 0, + 0, + 0, + 0], + cst_syntax_error = "syntax error"; + function grow_stacks(param){ + var + oldsize = env[5], + newsize = oldsize * 2 | 0, + new_s = caml_make_vect(newsize, 0), + new_v = caml_make_vect(newsize, 0), + new_start = caml_make_vect(newsize, Stdlib_Lexing[1]), + new_end = caml_make_vect(newsize, Stdlib_Lexing[1]); + caml_call5(Stdlib_Array[8], env[1], 0, new_s, 0, oldsize); + env[1] = new_s; + caml_call5(Stdlib_Array[8], env[2], 0, new_v, 0, oldsize); + env[2] = new_v; + caml_call5(Stdlib_Array[8], env[3], 0, new_start, 0, oldsize); + env[3] = new_start; + caml_call5(Stdlib_Array[8], env[4], 0, new_end, 0, oldsize); + env[4] = new_end; + env[5] = newsize; + return 0; + } + function clear_parser(param){ + caml_call4(Stdlib_Array[7], env[2], 0, env[5], 0); + env[8] = 0; + return 0; + } + var current_lookahead_fun = [0, function(param){return 0;}]; + function yyparse(tables, start, lexer, lexbuf){ + var + init_asp = env[11], + init_sp = env[14], + init_stackbase = env[6], + init_state = env[15], + init_curr_char = env[7], + init_lval = env[8], + init_errflag = env[16]; + env[6] = env[14] + 1 | 0; + env[7] = start; + env[10] = lexbuf[12]; + try{ + var cmd = 0, arg = 0; + for(;;) + switch(runtime.caml_parse_engine(tables, env, cmd, arg)){ + case 0: + var arg$0 = caml_call1(lexer, lexbuf); + env[9] = lexbuf[11]; + env[10] = lexbuf[12]; + var cmd = 1, arg = arg$0; + continue; + case 1: + throw caml_maybe_attach_backtrace(Parse_error, 1); + case 2: + grow_stacks(0); var cmd = 2, arg = 0; continue; + case 3: + grow_stacks(0); var cmd = 3, arg = 0; continue; + case 4: + try{ + var + _i_ = env[13], + _j_ = caml_call1(caml_check_bound(tables[1], _i_)[1 + _i_], env), + _k_ = 4, + value = _j_, + action = _k_; + } + catch(_m_){ + var _h_ = caml_wrap_exception(_m_); + if(_h_ !== Parse_error) throw caml_maybe_attach_backtrace(_h_, 0); + var value = 0, action = 5; + } + var cmd = action, arg = value; + continue; + default: + caml_call1(tables[14], cst_syntax_error); + var cmd = 5, arg = 0; + continue; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), curr_char = env[7]; + env[11] = init_asp; + env[14] = init_sp; + env[6] = init_stackbase; + env[15] = init_state; + env[7] = init_curr_char; + env[8] = init_lval; + env[16] = init_errflag; + if(exn[1] === YYexit){var v = exn[2]; return v;} + current_lookahead_fun[1] = + function(tok){ + if(! caml_call1(Stdlib_Obj[1], tok)) + return caml_check_bound(tables[2], tok)[1 + tok] === curr_char ? 1 : 0; + var _l_ = runtime.caml_obj_tag(tok); + return caml_check_bound(tables[3], _l_)[1 + _l_] === curr_char ? 1 : 0; + }; + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function peek_val(env, n){ + var _g_ = env[11] - n | 0; + return caml_check_bound(env[2], _g_)[1 + _g_]; + } + function symbol_start_pos(param){ + var i$1 = env[12], i = i$1; + for(;;){ + if(0 >= i){ + var _f_ = env[11]; + return caml_check_bound(env[4], _f_)[1 + _f_]; + } + var + _d_ = (env[11] - i | 0) + 1 | 0, + st = caml_check_bound(env[3], _d_)[1 + _d_], + _e_ = (env[11] - i | 0) + 1 | 0, + en = caml_check_bound(env[4], _e_)[1 + _e_]; + if(runtime.caml_notequal(st, en)) return st; + var i$0 = i - 1 | 0, i = i$0; + } + } + function symbol_end_pos(param){ + var _c_ = env[11]; + return caml_check_bound(env[4], _c_)[1 + _c_]; + } + function rhs_start_pos(n){ + var _b_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[3], _b_)[1 + _b_]; + } + function rhs_end_pos(n){ + var _a_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[4], _a_)[1 + _a_]; + } + function symbol_start(param){return symbol_start_pos(0)[4];} + function symbol_end(param){return symbol_end_pos(0)[4];} + function rhs_start(n){return rhs_start_pos(n)[4];} + function rhs_end(n){return rhs_end_pos(n)[4];} + function is_current_lookahead(tok){ + return caml_call1(current_lookahead_fun[1], tok); + } + function parse_error(param){return 0;} + var + Stdlib_Parsing = + [0, + symbol_start, + symbol_end, + rhs_start, + rhs_end, + symbol_start_pos, + symbol_end_pos, + rhs_start_pos, + rhs_end_pos, + clear_parser, + Parse_error, + runtime.caml_set_parser_trace, + YYexit, + yyparse, + peek_val, + is_current_lookahead, + parse_error]; + runtime.caml_register_global(7, Stdlib_Parsing, "Stdlib__Parsing"); + return; + } + (globalThis)); + +//# 7488 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set_bal$3 = "Set.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + cst_Set_remove_min_elt = "Set.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, 0, 0], + _c_ = [0, "set.ml", 570, 18], + cst_Set_bal = cst_Set_bal$3, + cst_Set_bal$0 = cst_Set_bal$3, + cst_Set_bal$1 = cst_Set_bal$3, + cst_Set_bal$2 = cst_Set_bal$3, + Stdlib_Set = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[4]; + return h; + } + function create(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + var _Z_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Z_]; + } + function bal(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Set_bal$0); + var lr = l[3], lv = l[2], ll = l[1], _U_ = height(lr); + if(_U_ <= height(ll)) return create(ll, lv, create(lr, v, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Set_bal); + var lrr = lr[3], lrv = lr[2], lrl = lr[1], _V_ = create(lrr, v, r); + return create(create(ll, lv, lrl), lrv, _V_); + } + if((hl + 2 | 0) >= hr){ + var _Y_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Y_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Set_bal$2); + var rr = r[3], rv = r[2], rl = r[1], _W_ = height(rl); + if(_W_ <= height(rr)) return create(create(l, v, rl), rv, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Set_bal$1); + var rlr = rl[3], rlv = rl[2], rll = rl[1], _X_ = create(rlr, rv, rr); + return create(create(l, v, rll), rlv, _X_); + } + function add(x, t){ + if(! t) return [0, 0, x, 0, 1]; + var r = t[3], v = t[2], l = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c) return t; + if(0 <= c){var rr = add(x, r); return r === rr ? t : bal(l, v, rr);} + var ll = add(x, l); + return l === ll ? t : bal(ll, v, r); + } + function singleton(x){return [0, 0, x, 0, 1];} + function add_min_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(add_min_element(x, l), v, r); + } + function add_max_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(l, v, add_max_element(x, r)); + } + function join(l, v, r){ + if(! l) return add_min_element(v, r); + if(! r) return add_max_element(v, l); + var + rh = r[4], + rr = r[3], + rv = r[2], + rl = r[1], + lh = l[4], + lr = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, join(lr, v, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, rl), rv, rr) + : create(l, v, r); + } + function min_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return v; + } + } + function min_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function max_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return v; + } + } + function max_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function remove_min_elt(param){ + if(! param) return caml_call1(Stdlib[1], cst_Set_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[3], v = param[2]; + return bal(remove_min_elt(l), v, r); + } + var r$0 = param[3]; + return r$0; + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var _T_ = remove_min_elt(t2); + return join(t1, min_elt(t2), _T_); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, 1, r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, r)]; + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _S_ = 0 === c ? 1 : 0; + if(_S_) return _S_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function remove(x, t){ + if(! t) return 0; + var t2 = t[3], v = t[2], t1 = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c){ + if(! t1) return t2; + if(! t2) return t1; + var _R_ = remove_min_elt(t2); + return bal(t1, min_elt(t2), _R_); + } + if(0 <= c){ + var rr = remove(x, t2); + return t2 === rr ? t : bal(t1, v, rr); + } + var ll = remove(x, t1); + return t1 === ll ? t : bal(ll, v, t2); + } + function union(s1, s2){ + if(! s1) return s2; + if(! s2) return s1; + var + h2 = s2[4], + r2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[4], + r1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + if(1 === h2) return add(v2, s1); + var + match = split(v1, s2), + r2$0 = match[3], + l2$0 = match[1], + _P_ = union(r1, r2$0); + return join(union(l1, l2$0), v1, _P_); + } + if(1 === h1) return add(v1, s2); + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + l1$0 = match$0[1], + _Q_ = union(r1$0, r2); + return join(union(l1$0, l2), v2, _Q_); + } + function inter(s1, s2){ + if(! s1) return 0; + if(! s2) return 0; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _M_ = split(v1, s2), + l2 = _M_[1]; + if(_M_[2]){ + var r2 = _M_[3], _N_ = inter(r1, r2); + return join(inter(l1, l2), v1, _N_); + } + var r2$0 = _M_[3], _O_ = inter(r1, r2$0); + return concat(inter(l1, l2), _O_); + } + function split_bis(x, param){ + if(! param) return [0, 0, function(param){return 0;}]; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return 0; + if(0 <= c){ + var match = split_bis(x, r); + if(! match) return 0; + var rr = match[2], lr = match[1]; + return [0, join(l, v, lr), rr]; + } + var match$0 = split_bis(x, l); + if(! match$0) return 0; + var rl = match$0[2], ll = match$0[1]; + return [0, + ll, + function(param){return join(caml_call1(rl, 0), v, r);}]; + } + function disjoint(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(s1$0 && s2$0){ + var r1 = s1$0[3], v1 = s1$0[2], l1 = s1$0[1]; + if(s1$0 === s2$0) return 0; + var match = split_bis(v1, s2$0); + if(! match) return 0; + var r2 = match[2], l2 = match[1], _L_ = disjoint(l1, l2); + if(! _L_) return _L_; + var s2$1 = caml_call1(r2, 0), s1$0 = r1, s2$0 = s2$1; + continue; + } + return 1; + } + } + function diff(s1, s2){ + if(! s1) return 0; + if(! s2) return s1; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _I_ = split(v1, s2), + l2 = _I_[1]; + if(_I_[2]){ + var r2 = _I_[3], _J_ = diff(r1, r2); + return concat(diff(l1, l2), _J_); + } + var r2$0 = _I_[3], _K_ = diff(r1, r2$0); + return join(diff(l1, l2), v1, _K_); + } + function cons_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, r, e$0], + s$0 = l, + e$0 = e$1; + } + } + function compare(s1, s2){ + var + e2$2 = cons_enum(s2, 0), + e1$2 = cons_enum(s1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[3], + r2 = e2[2], + v2 = e2[1], + e1$0 = e1[3], + r1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(s1, s2){return 0 === compare(s1, s2) ? 1 : 0;} + function subset(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(! s1$0) return 1; + if(! s2$0) return 0; + var + r2 = s2$0[3], + v2 = s2$0[2], + l2 = s2$0[1], + r1 = s1$0[3], + v1 = s1$0[2], + l1 = s1$0[1], + c = caml_call2(Ord[1], v1, v2); + if(0 === c){ + var _F_ = subset(l1, l2); + if(! _F_) return _F_; + var s1$0 = r1, s2$0 = r2; + continue; + } + if(0 <= c){ + var _G_ = subset([0, 0, v1, r1, 0], r2); + if(! _G_) return _G_; + var s1$0 = l1; + continue; + } + var _H_ = subset([0, l1, v1, 0, 0], l2); + if(! _H_) return _H_; + var s1$0 = r1; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call1(f, v); + var param$0 = r; + } + } + function fold(f, s, accu){ + var s$0 = s, accu$0 = accu; + for(;;){ + if(! s$0) return accu$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + accu$1 = caml_call2(f, v, fold(f, l, accu$0)), + s$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call1(p, v); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call1(p, v); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function filter(p, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = filter(p, l), + pv = caml_call1(p, v), + r$0 = filter(p, r); + if(! pv) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return t; + return join(l$0, v, r$0); + } + function partition(p, param){ + if(! param) return _b_; + var + r = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pv = caml_call1(p, v), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pv){var _x_ = concat(lf, rf); return [0, join(lt, v, rt), _x_];} + var _y_ = join(lf, v, rf); + return [0, concat(lt, rt), _y_]; + } + function cardinal(param){ + if(! param) return 0; + var r = param[3], l = param[1], _w_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _w_ | 0; + } + function elements_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, v, elements_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function elements(s){return elements_aux(0, s);} + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return v; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, v]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function try_join(l, v, r){ + var switch$0 = 0; + if(0 !== l){ + var _v_ = max_elt(l); + if(0 <= caml_call2(Ord[1], _v_, v)) switch$0 = 1; + } + if(! switch$0){ + var switch$1 = 0; + if(0 !== r){ + var _u_ = min_elt(r); + if(0 <= caml_call2(Ord[1], v, _u_)) switch$1 = 1; + } + if(! switch$1) return join(l, v, r); + } + return union(l, add(v, r)); + } + function map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = map(f, l), + v$0 = caml_call1(f, v), + r$0 = map(f, r); + if(l === l$0 && v === v$0 && r === r$0) return t; + return try_join(l$0, v$0, r$0); + } + function filter_map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + t1 = filter_map(f, l), + v$0 = caml_call1(f, v), + t2 = filter_map(f, r); + if(v$0){ + var v$1 = v$0[1]; + if(l === t1 && v === v$1 && r === t2) return t; + return try_join(t1, v$1, t2); + } + if(! t1) return t2; + if(! t2) return t1; + var _t_ = remove_min_elt(t2); + return try_join(t1, min_elt(t2), _t_); + } + function of_list(l){ + if(! l) return empty; + var _o_ = l[2], x0 = l[1]; + if(! _o_) return singleton(x0); + var _p_ = _o_[2], x1 = _o_[1]; + if(! _p_) return add(x1, singleton(x0)); + var _q_ = _p_[2], x2 = _p_[1]; + if(! _q_) return add(x2, add(x1, singleton(x0))); + var _r_ = _q_[2], x3 = _q_[1]; + if(! _r_) return add(x3, add(x2, add(x1, singleton(x0)))); + if(_r_[2]){ + var + l$0 = caml_call2(Stdlib_List[59], Ord[1], l), + sub = + function(n, l){ + if(3 >= n >>> 0) + switch(n){ + case 0: + return [0, 0, l]; + case 1: + if(l){ + var l$3 = l[2], x0 = l[1]; + return [0, [0, 0, x0, 0, 1], l$3]; + } + break; + case 2: + if(l){ + var match$1 = l[2]; + if(match$1){ + var l$4 = match$1[2], x1 = match$1[1], x0$0 = l[1]; + return [0, [0, [0, 0, x0$0, 0, 1], x1, 0, 2], l$4]; + } + } + break; + default: + if(l){ + var _s_ = l[2]; + if(_s_){ + var match$2 = _s_[2]; + if(match$2){ + var + l$5 = match$2[2], + x2 = match$2[1], + x1$0 = _s_[1], + x0$1 = l[1]; + return [0, + [0, [0, 0, x0$1, 0, 1], x1$0, [0, 0, x2, 0, 1], 2], + l$5]; + } + } + } + } + var + nl = n / 2 | 0, + match = sub(nl, l), + l$0 = match[2], + left = match[1]; + if(! l$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + l$1 = l$0[2], + mid = l$0[1], + match$0 = sub((n - nl | 0) - 1 | 0, l$1), + l$2 = match$0[2], + right = match$0[1]; + return [0, create(left, mid, right), l$2]; + }; + return sub(caml_call1(Stdlib_List[1], l$0), l$0)[1]; + } + var x4 = _r_[1]; + return add(x4, add(x3, add(x2, add(x1, singleton(x0))))); + } + function add_seq(i, m){ + function _n_(s, x){return add(x, s);} + return caml_call3(Stdlib_Seq[5], _n_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _l_ = cons_enum(t, rest); + return [0, x, function(_m_){return seq_of_enum(_l_, _m_);}]; + } + function to_seq(c){ + var _j_ = cons_enum(c, 0); + return function(_k_){return seq_of_enum(_j_, _k_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _h_ = snoc_enum(t, rest); + return [0, x, function(_i_){return rev_seq_of_enum(_h_, _i_);}]; + } + function to_rev_seq(c){ + var _f_ = snoc_enum(c, 0); + return function(_g_){return rev_seq_of_enum(_f_, _g_);}; + } + function to_seq_from(low, s){ + var s$0 = s, c = 0; + for(;;){ + if(s$0){ + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, r, c], s$0 = l, c = c$0; continue;} + var s$0 = r; + continue; + } + var _d_ = [0, v, r, c]; + } + else + var _d_ = c; + return function(_e_){return seq_of_enum(_d_, _e_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + singleton, + remove, + union, + inter, + disjoint, + diff, + compare, + equal, + subset, + iter, + map, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + elements, + min_elt, + min_elt_opt, + max_elt, + max_elt_opt, + min_elt, + min_elt_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + of_list, + to_seq_from, + to_seq, + to_rev_seq, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(12, Stdlib_Set, "Stdlib__Set"); + return; + } + (globalThis)); + +//# 8299 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Map_bal$3 = "Map.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Seq = global_data.Stdlib__Seq, + cst_Map_remove_min_elt = "Map.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, "map.ml", 400, 10], + _c_ = [0, 0, 0], + cst_Map_bal = cst_Map_bal$3, + cst_Map_bal$0 = cst_Map_bal$3, + cst_Map_bal$1 = cst_Map_bal$3, + cst_Map_bal$2 = cst_Map_bal$3, + Stdlib_Map = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[5]; + return h; + } + function create(l, x, d, r){ + var + hl = height(l), + hr = height(r), + _L_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _L_]; + } + function singleton(x, d){return [0, 0, x, d, 0, 1];} + function bal(l, x, d, r){ + if(l) var h = l[5], hl = h; else var hl = 0; + if(r) var h$0 = r[5], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Map_bal$0); + var lr = l[4], ld = l[3], lv = l[2], ll = l[1], _G_ = height(lr); + if(_G_ <= height(ll)) + return create(ll, lv, ld, create(lr, x, d, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Map_bal); + var + lrr = lr[4], + lrd = lr[3], + lrv = lr[2], + lrl = lr[1], + _H_ = create(lrr, x, d, r); + return create(create(ll, lv, ld, lrl), lrv, lrd, _H_); + } + if((hl + 2 | 0) >= hr){ + var _K_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _K_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Map_bal$2); + var rr = r[4], rd = r[3], rv = r[2], rl = r[1], _I_ = height(rl); + if(_I_ <= height(rr)) return create(create(l, x, d, rl), rv, rd, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Map_bal$1); + var + rlr = rl[4], + rld = rl[3], + rlv = rl[2], + rll = rl[1], + _J_ = create(rlr, rv, rd, rr); + return create(create(l, x, d, rll), rlv, rld, _J_); + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function add(x, data, m){ + if(! m) return [0, 0, x, data, 0, 1]; + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d === data ? m : [0, l, x, data, r, h]; + if(0 <= c){ + var rr = add(x, data, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = add(x, data, l); + return l === ll ? m : bal(ll, v, d, r); + } + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, d]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _F_ = 0 === c ? 1 : 0; + if(_F_) return _F_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function min_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function min_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function max_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function max_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function remove_min_binding(param){ + if(! param) return caml_call1(Stdlib[1], cst_Map_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[4], d = param[3], v = param[2]; + return bal(remove_min_binding(l), v, d, r); + } + var r$0 = param[4]; + return r$0; + } + function _d_(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return bal(t1, x, d, remove_min_binding(t2)); + } + function remove(x, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return _d_(l, r); + if(0 <= c){ + var rr = remove(x, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = remove(x, l); + return l === ll ? m : bal(ll, v, d, r); + } + function update(x, f, m){ + if(! m){ + var match$0 = caml_call1(f, 0); + if(! match$0) return 0; + var data$0 = match$0[1]; + return [0, 0, x, data$0, 0, 1]; + } + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c){ + var match = caml_call1(f, [0, d]); + if(! match) return _d_(l, r); + var data = match[1]; + return d === data ? m : [0, l, x, data, r, h]; + } + if(0 <= c){ + var rr = update(x, f, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = update(x, f, l); + return l === ll ? m : bal(ll, v, d, r); + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[4], d = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call2(f, v, d); + var param$0 = r; + } + } + function map(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = map(f, l), + d$0 = caml_call1(f, d), + r$0 = map(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function mapi(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = mapi(f, l), + d$0 = caml_call2(f, v, d), + r$0 = mapi(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function fold(f, m, accu){ + var m$0 = m, accu$0 = accu; + for(;;){ + if(! m$0) return accu$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + accu$1 = caml_call3(f, v, d, fold(f, l, accu$0)), + m$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call2(p, v, d); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call2(p, v, d); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function add_min_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(add_min_binding(k, x, l), v, d, r); + } + function add_max_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(l, v, d, add_max_binding(k, x, r)); + } + function join(l, v, d, r){ + if(! l) return add_min_binding(v, d, r); + if(! r) return add_max_binding(v, d, l); + var + rh = r[5], + rr = r[4], + rd = r[3], + rv = r[2], + rl = r[1], + lh = l[5], + lr = l[4], + ld = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, ld, join(lr, v, d, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, d, rl), rv, rd, rr) + : create(l, v, d, r); + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return join(t1, x, d, remove_min_binding(t2)); + } + function concat_or_join(t1, v, d, t2){ + if(! d) return concat(t1, t2); + var d$0 = d[1]; + return join(t1, v, d$0, t2); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, [0, d], r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, d, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, d, r)]; + } + function merge(f, s1, s2){ + if(s1){ + var h1 = s1[5], r1 = s1[4], d1 = s1[3], v1 = s1[2], l1 = s1[1]; + if(height(s2) <= h1){ + var + match = split(v1, s2), + r2 = match[3], + d2 = match[2], + l2 = match[1], + _v_ = merge(f, r1, r2), + _w_ = caml_call3(f, v1, [0, d1], d2); + return concat_or_join(merge(f, l1, l2), v1, _w_, _v_); + } + } + else if(! s2) return 0; + if(! s2) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + r2$0 = s2[4], + d2$0 = s2[3], + v2 = s2[2], + l2$0 = s2[1], + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + _x_ = merge(f, r1$0, r2$0), + _y_ = caml_call3(f, v2, d1$0, [0, d2$0]); + return concat_or_join(merge(f, l1$0, l2$0), v2, _y_, _x_); + } + function union(f, s1, s2){ + if(s1){ + if(s2){ + var + h2 = s2[5], + r2 = s2[4], + d2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[5], + r1 = s1[4], + d1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + var + match = split(v1, s2), + r2$0 = match[3], + d2$0 = match[2], + l2$0 = match[1], + l = union(f, l1, l2$0), + r = union(f, r1, r2$0); + if(! d2$0) return join(l, v1, d1, r); + var d2$1 = d2$0[1]; + return concat_or_join(l, v1, caml_call3(f, v1, d1, d2$1), r); + } + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + l$0 = union(f, l1$0, l2), + r$0 = union(f, r1$0, r2); + if(! d1$0) return join(l$0, v2, d2, r$0); + var d1$1 = d1$0[1]; + return concat_or_join(l$0, v2, caml_call3(f, v2, d1$1, d2), r$0); + } + var s = s1; + } + else + var s = s2; + return s; + } + function filter(p, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + l$0 = filter(p, l), + pvd = caml_call2(p, v, d), + r$0 = filter(p, r); + if(! pvd) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return m; + return join(l$0, v, d, r$0); + } + function filter_map(f, param){ + if(! param) return 0; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = filter_map(f, l), + fvd = caml_call2(f, v, d), + r$0 = filter_map(f, r); + if(! fvd) return concat(l$0, r$0); + var d$0 = fvd[1]; + return join(l$0, v, d$0, r$0); + } + function partition(p, param){ + if(! param) return _c_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pvd = caml_call2(p, v, d), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pvd){ + var _t_ = concat(lf, rf); + return [0, join(lt, v, d, rt), _t_]; + } + var _u_ = join(lf, v, d, rf); + return [0, concat(lt, rt), _u_]; + } + function cons_enum(m, e){ + var m$0 = m, e$0 = e; + for(;;){ + if(! m$0) return e$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + e$1 = [0, v, d, r, e$0], + m$0 = l, + e$0 = e$1; + } + } + function compare(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var c$0 = caml_call2(cmp, d1, d2); + if(0 !== c$0) return c$0; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? 0 : 1; + if(! e2) return 0; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + _q_ = 0 === caml_call2(Ord[1], v1, v2) ? 1 : 0; + if(_q_){ + var _r_ = caml_call2(cmp, d1, d2); + if(_r_){ + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + continue; + } + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function cardinal(param){ + if(! param) return 0; + var r = param[4], l = param[1], _p_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _p_ | 0; + } + function bindings_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, [0, v, d], bindings_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function bindings(s){return bindings_aux(0, s);} + function add_seq(i, m){ + function _o_(m, param){ + var v = param[2], k = param[1]; + return add(k, v, m); + } + return caml_call3(Stdlib_Seq[5], _o_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _m_ = cons_enum(t, rest); + return [0, [0, k, v], function(_n_){return seq_of_enum(_m_, _n_);}]; + } + function to_seq(m){ + var _k_ = cons_enum(m, 0); + return function(_l_){return seq_of_enum(_k_, _l_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[4], + d = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, d, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _i_ = snoc_enum(t, rest); + return [0, + [0, k, v], + function(_j_){return rev_seq_of_enum(_i_, _j_);}]; + } + function to_rev_seq(c){ + var _g_ = snoc_enum(c, 0); + return function(_h_){return rev_seq_of_enum(_g_, _h_);}; + } + function to_seq_from(low, m){ + var m$0 = m, c = 0; + for(;;){ + if(m$0){ + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, d, r, c], m$0 = l, c = c$0; continue;} + var m$0 = r; + continue; + } + var _e_ = [0, v, d, r, c]; + } + else + var _e_ = c; + return function(_f_){return seq_of_enum(_e_, _f_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + update, + singleton, + remove, + merge, + union, + compare, + equal, + iter, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + bindings, + min_binding, + min_binding_opt, + max_binding, + max_binding_opt, + min_binding, + min_binding_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + map, + mapi, + to_seq, + to_rev_seq, + to_seq_from, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(11, Stdlib_Map, "Stdlib__Map"); + return; + } + (globalThis)); + +//# 9131 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Empty = [248, "Stdlib.Stack.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0];} + function clear(s){s[1] = 0; s[2] = 0; return 0;} + function copy(s){return [0, s[1], s[2]];} + function push(x, s){s[1] = [0, x, s[1]]; s[2] = s[2] + 1 | 0; return 0;} + function pop(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return hd; + } + function pop_opt(s){ + var match = s[1]; + if(! match) return 0; + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return [0, hd]; + } + function top(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var hd = match[1]; + return hd; + } + function top_opt(s){ + var match = s[1]; + if(! match) return 0; + var hd = match[1]; + return [0, hd]; + } + function is_empty(s){return 0 === s[1] ? 1 : 0;} + function length(s){return s[2];} + function iter(f, s){return caml_call2(Stdlib_List[17], f, s[1]);} + function fold(f, acc, s){return caml_call3(Stdlib_List[25], f, acc, s[1]);} + function to_seq(s){return caml_call1(Stdlib_List[61], s[1]);} + function add_seq(q, i){ + function _a_(x){return push(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var s = create(0); add_seq(s, g); return s;} + var + Stdlib_Stack = + [0, + Empty, + create, + push, + pop, + pop_opt, + top, + top_opt, + clear, + copy, + is_empty, + length, + iter, + fold, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(3, Stdlib_Stack, "Stdlib__Stack"); + return; + } + (globalThis)); + +//# 9225 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Empty = [248, "Stdlib.Queue.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0, 0];} + function clear(q){q[1] = 0; q[2] = 0; q[3] = 0; return 0;} + function add(x, q){ + var cell = [0, x, 0], match = q[3]; + return match + ? (q[1] = q[1] + 1 | 0, match[2] = cell, q[3] = cell, 0) + : (q[1] = 1, q[2] = cell, q[3] = cell, 0); + } + function peek(q){ + var match = q[2]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var content = match[1]; + return content; + } + function peek_opt(q){ + var match = q[2]; + if(! match) return 0; + var content = match[1]; + return [0, content]; + } + function take(q){ + var _g_ = q[2]; + if(! _g_) throw caml_maybe_attach_backtrace(Empty, 1); + var content = _g_[1]; + if(_g_[2]){ + var next = _g_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return content; + } + clear(q); + return content; + } + function take_opt(q){ + var _f_ = q[2]; + if(! _f_) return 0; + var content = _f_[1]; + if(_f_[2]){ + var next = _f_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return [0, content]; + } + clear(q); + return [0, content]; + } + function copy(q){ + var cell$0 = q[2], q_res = [0, q[1], 0, 0], prev = 0, cell = cell$0; + for(;;){ + if(! cell){q_res[3] = prev; return q_res;} + var content = cell[1], next = cell[2], prev$0 = [0, content, 0]; + if(prev) prev[2] = prev$0; else q_res[2] = prev$0; + var prev = prev$0, cell = next; + } + } + function is_empty(q){return 0 === q[1] ? 1 : 0;} + function length(q){return q[1];} + function iter(f, q){ + var cell$0 = q[2], cell = cell$0; + for(;;){ + if(! cell) return 0; + var content = cell[1], next = cell[2]; + caml_call1(f, content); + var cell = next; + } + } + function fold(f, accu$1, q){ + var cell$0 = q[2], accu = accu$1, cell = cell$0; + for(;;){ + if(! cell) return accu; + var + content = cell[1], + next = cell[2], + accu$0 = caml_call2(f, accu, content), + accu = accu$0, + cell = next; + } + } + function transfer(q1, q2){ + var _e_ = 0 < q1[1] ? 1 : 0; + if(! _e_) return _e_; + var match = q2[3]; + return match + ? (q2 + [1] + = q2[1] + q1[1] | 0, + match[2] = q1[2], + q2[3] = q1[3], + clear(q1)) + : (q2[1] = q1[1], q2[2] = q1[2], q2[3] = q1[3], clear(q1)); + } + function to_seq(q){ + function aux(c, param){ + if(! c) return 0; + var x = c[1], next = c[2]; + return [0, x, function(_d_){return aux(next, _d_);}]; + } + var _b_ = q[2]; + return function(_c_){return aux(_b_, _c_);}; + } + function add_seq(q, i){ + function _a_(x){return add(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var q = create(0); add_seq(q, g); return q;} + var + Stdlib_Queue = + [0, + Empty, + create, + add, + add, + take, + take_opt, + take, + peek, + peek_opt, + peek, + clear, + copy, + is_empty, + length, + iter, + fold, + transfer, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(2, Stdlib_Queue, "Stdlib__Queue"); + return; + } + (globalThis)); + +//# 9380 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_blit_string = runtime.caml_blit_string, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Assert_failure = global_data.Assert_failure, + cst_Buffer_truncate = "Buffer.truncate", + _a_ = [0, "buffer.ml", 220, 9], + cst_Buffer_add_channel = "Buffer.add_channel", + cst_Buffer_add_substring_add_s = "Buffer.add_substring/add_subbytes", + cst_Buffer_add_cannot_grow_buf = "Buffer.add: cannot grow buffer", + cst_Buffer_nth = "Buffer.nth", + cst_Buffer_blit = "Buffer.blit", + cst_Buffer_sub = "Buffer.sub"; + function create(n){ + var + n$0 = 1 <= n ? n : 1, + n$1 = Stdlib_Sys[12] < n$0 ? Stdlib_Sys[12] : n$0, + s = caml_create_bytes(n$1); + return [0, [0, s, n$1], 0, s]; + } + function contents(b){return caml_call3(Stdlib_Bytes[8], b[1][1], 0, b[2]);} + function to_bytes(b){return caml_call3(Stdlib_Bytes[7], b[1][1], 0, b[2]);} + function sub(b, ofs, len){ + if(0 <= ofs && 0 <= len && (b[2] - len | 0) >= ofs) + return caml_call3(Stdlib_Bytes[8], b[1][1], ofs, len); + return caml_call1(Stdlib[1], cst_Buffer_sub); + } + function blit(src, srcoff, dst, dstoff, len){ + if + (0 <= len + && + 0 <= srcoff + && + (src[2] - len | 0) >= srcoff + && 0 <= dstoff && (caml_ml_bytes_length(dst) - len | 0) >= dstoff) + return caml_call5(Stdlib_Bytes[11], src[1][1], srcoff, dst, dstoff, len); + return caml_call1(Stdlib[1], cst_Buffer_blit); + } + function nth(b, ofs){ + var position = b[2], match = b[1], length = match[2], buffer = match[1]; + if(0 <= ofs && position > ofs && length >= position) + return runtime.caml_bytes_unsafe_get(buffer, ofs); + return caml_call1(Stdlib[1], cst_Buffer_nth); + } + function length(b){return b[2];} + function clear(b){b[2] = 0; return 0;} + function reset(b){ + b[2] = 0; + var inner = [0, b[3], caml_ml_bytes_length(b[3])]; + b[1] = inner; + return 0; + } + function resize(b, more){ + var old_pos = b[2], old_len = b[1][2], new_len = [0, old_len]; + for(;;){ + if(new_len[1] < (old_pos + more | 0)){ + new_len[1] = 2 * new_len[1] | 0; + continue; + } + if(Stdlib_Sys[12] < new_len[1]) + if((old_pos + more | 0) <= Stdlib_Sys[12]) + new_len[1] = Stdlib_Sys[12]; + else + caml_call1(Stdlib[2], cst_Buffer_add_cannot_grow_buf); + var new_buffer = caml_create_bytes(new_len[1]); + caml_call5(Stdlib_Bytes[11], b[1][1], 0, new_buffer, 0, b[2]); + b[1] = [0, new_buffer, new_len[1]]; + return 0; + } + } + function add_char(b, c){ + var pos = b[2], match = b[1], length = match[2], buffer = match[1]; + if(length <= pos){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], c); + } + else + caml_bytes_unsafe_set(buffer, pos, c); + b[2] = pos + 1 | 0; + return 0; + } + var uchar_utf_8_byte_length_max = 4, uchar_utf_16_byte_length_max = 4; + function add_utf_8_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_8_byte_length_max); + var n = caml_call3(Stdlib_Bytes[51], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_8_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16be_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[54], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16le_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[57], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_substring(b, s, offset, len){ + var _r_ = offset < 0 ? 1 : 0; + if(_r_) + var _s_ = _r_; + else + var + _t_ = len < 0 ? 1 : 0, + _s_ = _t_ || ((caml_ml_string_length(s) - len | 0) < offset ? 1 : 0); + if(_s_) caml_call1(Stdlib[1], cst_Buffer_add_substring_add_s); + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, offset, b[1][1], b[2], len); + } + else + caml_blit_string(s, offset, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_subbytes(b, s, offset, len){ + return add_substring(b, caml_call1(Stdlib_Bytes[44], s), offset, len); + } + function add_string(b, s){ + var + len = caml_ml_string_length(s), + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = b[2] + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, 0, b[1][1], b[2], len); + } + else + caml_blit_string(s, 0, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_bytes(b, s){ + return add_string(b, caml_call1(Stdlib_Bytes[44], s)); + } + function add_buffer(b, bs){return add_subbytes(b, bs[1][1], 0, bs[2]);} + function add_channel(b, ic, to_read$1){ + var + _p_ = to_read$1 < 0 ? 1 : 0, + _q_ = _p_ || (Stdlib_Sys[12] < to_read$1 ? 1 : 0); + if(_q_) caml_call1(Stdlib[1], cst_Buffer_add_channel); + if(b[1][2] < (b[2] + to_read$1 | 0)) resize(b, to_read$1); + var + ofs$1 = b[2], + buf = b[1][1], + already_read = 0, + ofs = ofs$1, + to_read = to_read$1; + for(;;){ + if(0 !== to_read){ + var r = caml_call4(Stdlib[84], ic, buf, ofs, to_read); + if(0 !== r){ + var + already_read$0 = already_read + r | 0, + ofs$0 = ofs + r | 0, + to_read$0 = to_read - r | 0, + already_read = already_read$0, + ofs = ofs$0, + to_read = to_read$0; + continue; + } + } + b[2] = b[2] + already_read | 0; + if(already_read < to_read$1) + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return 0; + } + } + function output_buffer(oc, b){ + return caml_call4(Stdlib[68], oc, b[1][1], 0, b[2]); + } + function add_substitute(b, f, s){ + var lim$1 = caml_ml_string_length(s), previous = 32, i$4 = 0; + for(;;){ + if(i$4 >= lim$1){ + var _o_ = 92 === previous ? 1 : 0; + return _o_ ? add_char(b, previous) : _o_; + } + var previous$0 = caml_string_get(s, i$4); + if(36 !== previous$0){ + if(92 === previous){ + add_char(b, 92); + add_char(b, previous$0); + var i$6 = i$4 + 1 | 0, previous = 32, i$4 = i$6; + continue; + } + if(92 === previous$0){ + var i$7 = i$4 + 1 | 0, previous = previous$0, i$4 = i$7; + continue; + } + add_char(b, previous$0); + var i$8 = i$4 + 1 | 0, previous = previous$0, i$4 = i$8; + continue; + } + if(92 === previous){ + add_char(b, previous$0); + var i$5 = i$4 + 1 | 0, previous = 32, i$4 = i$5; + continue; + } + var start$0 = i$4 + 1 | 0; + if(lim$1 <= start$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var opening = caml_string_get(s, start$0), switch$0 = 0; + if(40 !== opening && 123 !== opening){ + var + start = start$0 + 1 | 0, + lim$0 = caml_ml_string_length(s), + i$2 = start; + for(;;){ + if(lim$0 <= i$2) + var stop$0 = lim$0; + else{ + var match = caml_string_get(s, i$2), switch$1 = 0; + if(91 <= match){ + if(97 <= match){ + if(123 > match) switch$1 = 1; + } + else if(95 === match) switch$1 = 1; + } + else + if(58 <= match){ + if(65 <= match) switch$1 = 1; + } + else if(48 <= match) switch$1 = 1; + if(switch$1){var i$3 = i$2 + 1 | 0, i$2 = i$3; continue;} + var stop$0 = i$2; + } + var + match$0 = + [0, + caml_call3(Stdlib_String[15], s, start$0, stop$0 - start$0 | 0), + stop$0]; + switch$0 = 1; + break; + } + } + if(! switch$0){ + var new_start = start$0 + 1 | 0, k$2 = 0; + if(40 === opening) + var closing = 41; + else{ + if(123 !== opening) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var closing = 125; + } + var lim = caml_ml_string_length(s), k = k$2, stop = new_start; + for(;;){ + if(lim <= stop) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_get(s, stop) === opening){ + var i = stop + 1 | 0, k$0 = k + 1 | 0, k = k$0, stop = i; + continue; + } + if(caml_string_get(s, stop) !== closing){ + var i$1 = stop + 1 | 0, stop = i$1; + continue; + } + if(0 !== k){ + var i$0 = stop + 1 | 0, k$1 = k - 1 | 0, k = k$1, stop = i$0; + continue; + } + var + match$0 = + [0, + caml_call3 + (Stdlib_String[15], s, new_start, (stop - start$0 | 0) - 1 | 0), + stop + 1 | 0]; + break; + } + } + var next_i = match$0[2], ident = match$0[1]; + add_string(b, caml_call1(f, ident)); + var previous = 32, i$4 = next_i; + } + } + function truncate(b, len){ + if(0 <= len && b[2] >= len){b[2] = len; return 0;} + return caml_call1(Stdlib[1], cst_Buffer_truncate); + } + function to_seq(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _m_ = i + 1 | 0; + return [0, x, function(_n_){return aux(_m_, _n_);}]; + } + var _k_ = 0; + return function(_l_){return aux(_k_, _l_);}; + } + function to_seqi(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _i_ = i + 1 | 0; + return [0, [0, i, x], function(_j_){return aux(_i_, _j_);}]; + } + var _g_ = 0; + return function(_h_){return aux(_g_, _h_);}; + } + function add_seq(b, seq){ + function _e_(_f_){return add_char(b, _f_);} + return caml_call2(Stdlib_Seq[4], _e_, seq); + } + function of_seq(i){var b = create(32); add_seq(b, i); return b;} + function add_int8(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 1 | 0; + if(length < new_position){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], x); + } + else + caml_bytes_unsafe_set(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 2 | 0; + if(length < new_position){ + resize(b, 2); + caml_bytes_set16(b[1][1], b[2], x); + } + else + caml_bytes_set16(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int32_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 4 | 0; + if(length < new_position){ + resize(b, 4); + caml_bytes_set32(b[1][1], b[2], x); + } + else + caml_bytes_set32(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int64_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 8 | 0; + if(length < new_position){ + resize(b, 8); + caml_bytes_set64(b[1][1], b[2], x); + } + else + caml_bytes_set64(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_le(b, x){ + var _d_ = Stdlib_Sys[11] ? caml_bswap16(x) : x; + return add_int16_ne(b, _d_); + } + function add_int16_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_bswap16(x); + return add_int16_ne(b, x$0); + } + function add_int32_le(b, x){ + var _c_ = Stdlib_Sys[11] ? caml_int32_bswap(x) : x; + return add_int32_ne(b, _c_); + } + function add_int32_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int32_bswap(x); + return add_int32_ne(b, x$0); + } + function add_int64_le(b, x){ + var _b_ = Stdlib_Sys[11] ? caml_int64_bswap(x) : x; + return add_int64_ne(b, _b_); + } + function add_int64_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int64_bswap(x); + return add_int64_ne(b, x$0); + } + var + Stdlib_Buffer = + [0, + create, + contents, + to_bytes, + sub, + blit, + nth, + length, + clear, + reset, + output_buffer, + truncate, + add_char, + add_utf_8_uchar, + add_utf_16le_uchar, + add_utf_16be_uchar, + add_string, + add_bytes, + add_substring, + add_subbytes, + add_substitute, + add_buffer, + add_channel, + to_seq, + to_seqi, + add_seq, + of_seq, + add_int8, + add_int8, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int32_ne, + add_int32_be, + add_int32_le, + add_int64_ne, + add_int64_be, + add_int64_le]; + runtime.caml_register_global(14, Stdlib_Buffer, "Stdlib__Buffer"); + return; + } + (globalThis)); + +//# 9889 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Mutex = + [0, + runtime.caml_ml_mutex_new, + runtime.caml_ml_mutex_lock, + runtime.caml_ml_mutex_try_lock, + runtime.caml_ml_mutex_unlock]; + runtime.caml_register_global(0, Stdlib_Mutex, "Stdlib__Mutex"); + return; + } + (globalThis)); + +//# 9905 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Condition = + [0, + runtime.caml_ml_condition_new, + runtime.caml_ml_condition_wait, + runtime.caml_ml_condition_signal, + runtime.caml_ml_condition_broadcast]; + runtime.caml_register_global(0, Stdlib_Condition, "Stdlib__Condition"); + return; + } + (globalThis)); + +//# 10012 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_domain_dls_set = runtime.caml_domain_dls_set, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_domain_id = runtime.caml_ml_domain_id, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Mutex = global_data.Stdlib__Mutex, + Stdlib_Condition = global_data.Stdlib__Condition, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Array = global_data.Stdlib__Array, + cst_internal_error_Am_I_alread = "internal error: Am I already finished?", + cst_first_domain_already_spawn = "first domain already spawned"; + function cpu_relax(param){return runtime.caml_ml_domain_cpu_relax(0);} + var unique_value = [0, 0]; + function create_dls(param){ + var st = caml_make_vect(8, unique_value); + return caml_domain_dls_set(st); + } + create_dls(0); + var + key_counter = caml_call1(Stdlib_Atomic[1], 0), + parent_keys = caml_call1(Stdlib_Atomic[1], 0); + function new_key(split_from_parent, init_orphan){ + var + idx = caml_call2(Stdlib_Atomic[6], key_counter, 1), + k = [0, idx, init_orphan]; + if(split_from_parent){ + var split = split_from_parent[1], ki = [0, k, split]; + for(;;){ + var l = caml_call1(Stdlib_Atomic[2], parent_keys); + if(1 - caml_call3(Stdlib_Atomic[5], parent_keys, l, [0, ki, l])) + continue; + break; + } + } + return k; + } + function maybe_grow(idx){ + var st = runtime.caml_domain_dls_get(0), sz = st.length - 1; + if(idx < sz) return st; + var new_sz = sz; + for(;;){ + if(idx < new_sz){ + var new_st = caml_make_vect(new_sz, unique_value); + caml_call5(Stdlib_Array[8], st, 0, new_st, 0, sz); + caml_domain_dls_set(new_st); + return new_st; + } + var s = 2 * new_sz | 0, new_sz = s; + } + } + function set(param, x){ + var idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = x; + return 0; + } + function get(param){ + var + init = param[2], + idx = param[1], + st = maybe_grow(idx), + v = caml_check_bound(st, idx)[1 + idx]; + if(v !== unique_value) return v; + var v$0 = caml_call1(init, 0); + caml_check_bound(st, idx)[1 + idx] = v$0; + return v$0; + } + function get_id(param){var domain = param[1]; return domain;} + function self(param){return caml_ml_domain_id(0);} + function is_main_domain(param){return 0 === caml_ml_domain_id(0) ? 1 : 0;} + var + first_domain_spawned = caml_call1(Stdlib_Atomic[1], 0), + first_spawn_function = [0, function(param){return 0;}]; + function before_first_spawn(f){ + if(caml_call1(Stdlib_Atomic[2], first_domain_spawned)) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_first_domain_already_spawn], 1); + var old_f = first_spawn_function[1]; + function new_f(param){caml_call1(old_f, 0); return caml_call1(f, 0);} + first_spawn_function[1] = new_f; + return 0; + } + var at_exit_key = new_key(0, function(param, _e_){return 0;}); + function at_exit(f){ + var old_exit = get(at_exit_key); + function new_exit(param){ + caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return set(at_exit_key, new_exit); + } + function do_at_exit(param){ + var f = get(at_exit_key); + return caml_call1(f, 0); + } + Stdlib[104][1] = do_at_exit; + function spawn(f){ + if(1 - caml_call1(Stdlib_Atomic[2], first_domain_spawned)){ + caml_call2(Stdlib_Atomic[3], first_domain_spawned, 1); + caml_call1(first_spawn_function[1], 0); + first_spawn_function[1] = function(param){return 0;}; + } + var _a_ = caml_call1(Stdlib_Atomic[2], parent_keys); + function _b_(param){ + var split = param[2], k = param[1], idx = k[1]; + return [0, idx, caml_call1(split, get(k))]; + } + var + pk = caml_call2(Stdlib_List[19], _b_, _a_), + term_mutex = caml_call1(Stdlib_Mutex[1], 0), + term_condition = caml_call1(Stdlib_Condition[1], 0), + term_state = [0, 0]; + function body(param){ + var switch$0 = 0; + try{ + create_dls(0); + var + _c_ = + function(param){ + var v = param[2], idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = v; + return 0; + }; + caml_call2(Stdlib_List[17], _c_, pk); + var res = caml_call1(f, 0); + } + catch(ex$0){ + var ex = caml_wrap_exception(ex$0), result = [1, ex]; + switch$0 = 1; + } + if(! switch$0) var result = [0, res]; + try{do_at_exit(0); var result$0 = result;} + catch(ex){ + var + ex$0 = caml_wrap_exception(ex), + _d_ = 0 === result[0] ? [1, ex$0] : result, + result$0 = _d_; + } + caml_call1(Stdlib_Mutex[2], term_mutex); + return term_state[1] + ? caml_call1(Stdlib[2], cst_internal_error_Am_I_alread) + : (term_state + [1] + = [0, result$0], + caml_call1(Stdlib_Condition[4], term_condition)); + } + return [0, + runtime.caml_domain_spawn(body, term_mutex), + term_mutex, + term_condition, + term_state]; + } + function join(param){ + var + term_state = param[4], + term_condition = param[3], + term_mutex = param[2]; + caml_call1(Stdlib_Mutex[2], term_mutex); + for(;;){ + var match = term_state[1]; + if(! match){ + caml_call2(Stdlib_Condition[2], term_condition, term_mutex); + continue; + } + var res = match[1]; + caml_call1(Stdlib_Mutex[4], term_mutex); + if(0 === res[0]){var x = res[1]; return x;} + var ex = res[1]; + throw caml_maybe_attach_backtrace(ex, 1); + } + } + var + recommended_domain_count = runtime.caml_recommended_domain_count, + Stdlib_Domain = + [0, + spawn, + join, + get_id, + self, + before_first_spawn, + at_exit, + cpu_relax, + is_main_domain, + recommended_domain_count, + [0, new_key, get, set]]; + runtime.caml_register_global(8, Stdlib_Domain, "Stdlib__Domain"); + return; + } + (globalThis)); + +//# 10233 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$43 = "", + cst_and = " and ", + cst_Li$3 = "%Li", + cst_i$3 = "%i", + cst_li$3 = "%li", + cst_ni$3 = "%ni", + cst_u$0 = "%u", + cst$42 = "' '", + cst$41 = "'#'", + cst$39 = "'*'", + cst$40 = "'+'", + cst$44 = ", ", + cst_0$3 = "0", + cst_at_character_number = ": at character number ", + cst$38 = "@[", + cst$37 = "@{", + cst_bad_input_format_type_mism = + "bad input: format type mismatch between ", + cst_bad_input_format_type_mism$0 = + "bad input: format type mismatch between %S and %S", + cst_camlinternalFormat_ml = "camlinternalFormat.ml", + cst_invalid_format = "invalid format ", + cst_precision$3 = "precision", + caml_blit_string = runtime.caml_blit_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_format_float = runtime.caml_format_float, + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$9 = "%{", + cst$10 = "%}", + cst$11 = "%(", + cst$12 = "%)", + cst$13 = "%?", + cst$18 = cst$37, + cst$19 = cst$38, + cst$20 = cst$37, + cst$21 = cst$38, + cst$22 = cst$37, + cst$23 = cst$38, + cst$26 = cst$39, + cst$24 = "'-'", + cst$25 = cst$39, + cst$27 = cst$40, + cst$28 = cst$41, + cst$29 = cst$42, + cst$30 = cst$40, + cst$31 = "'_'", + sub_format = [0, 0, cst$43], + formatting_lit = [0, "@;", 1, 0], + cst$35 = cst$41, + cst$32 = cst$40, + cst$33 = cst$40, + cst$34 = cst$42, + cst$36 = cst$40, + cst$17 = ".", + cst$14 = "%!", + cst$15 = cst$37, + cst$16 = cst$38, + cst$8 = "%%", + cst$0 = "@]", + cst$1 = "@}", + cst$2 = "@?", + cst$3 = "@\n", + cst$4 = "@.", + cst$5 = "@@", + cst$6 = "@%", + cst$7 = "@", + cst = ".*", + Assert_failure = global_data.Assert_failure, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Int = global_data.Stdlib__Int, + cst_c = "%c", + cst_s = "%s", + cst_i = cst_i$3, + cst_li = cst_li$3, + cst_ni = cst_ni$3, + cst_Li = cst_Li$3, + cst_f = "%f", + cst_B = "%B", + cst_a = "%a", + cst_t = "%t", + cst_r = "%r", + cst_r$0 = "%_r", + _b_ = [0, cst_camlinternalFormat_ml, 850, 23], + _m_ = [0, cst_camlinternalFormat_ml, 814, 21], + _e_ = [0, cst_camlinternalFormat_ml, 815, 21], + _n_ = [0, cst_camlinternalFormat_ml, 818, 21], + _f_ = [0, cst_camlinternalFormat_ml, 819, 21], + _o_ = [0, cst_camlinternalFormat_ml, 822, 19], + _g_ = [0, cst_camlinternalFormat_ml, 823, 19], + _p_ = [0, cst_camlinternalFormat_ml, 826, 22], + _h_ = [0, cst_camlinternalFormat_ml, 827, 22], + _q_ = [0, cst_camlinternalFormat_ml, 831, 30], + _i_ = [0, cst_camlinternalFormat_ml, 832, 30], + _k_ = [0, cst_camlinternalFormat_ml, 836, 26], + _c_ = [0, cst_camlinternalFormat_ml, 837, 26], + _l_ = [0, cst_camlinternalFormat_ml, 846, 28], + _d_ = [0, cst_camlinternalFormat_ml, 847, 28], + _j_ = [0, cst_camlinternalFormat_ml, 851, 23], + _s_ = [0, cst_camlinternalFormat_ml, 1558, 4], + cst_Printf_bad_conversion = "Printf: bad conversion %[", + _t_ = [0, cst_camlinternalFormat_ml, 1626, 39], + _u_ = [0, cst_camlinternalFormat_ml, 1649, 31], + _v_ = [0, cst_camlinternalFormat_ml, 1650, 31], + cst_Printf_bad_conversion$0 = "Printf: bad conversion %_", + _w_ = [0, cst_camlinternalFormat_ml, 1830, 8], + ___ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _Z_ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _C_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", duplicate flag ", [1, 0]]]]]], + "invalid format %S: at character number %d, duplicate flag %C"], + cst_0 = cst_0$3, + cst_padding = "padding", + _D_ = [0, 1, 0], + _E_ = [0, 0], + cst_precision = cst_precision$3, + _F_ = [1, 0], + _G_ = [1, 1], + cst_0$2 = "'0'", + cst_0$0 = cst_0$3, + _I_ = [1, 1], + cst_0$1 = cst_0$3, + cst_precision$0 = cst_precision$3, + _H_ = [1, 1], + cst_precision$1 = cst_precision$3, + _M_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + ", flag ", + [1, + [11, + " is only allowed after the '", + [12, 37, [11, "', before padding and precision", 0]]]]]]]]], + "invalid format %S: at character number %d, flag %C is only allowed after the '%%', before padding and precision"], + _J_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, ', invalid conversion "', [12, 37, [0, [12, 34, 0]]]]]]]], + 'invalid format %S: at character number %d, invalid conversion "%%%c"'], + _K_ = [0, 0], + cst_padding$0 = "`padding'", + _L_ = [0, 0], + cst_precision$2 = "`precision'", + _N_ = [0, [12, 64, 0]], + _O_ = [0, "@ ", 1, 0], + _P_ = [0, "@,", 0, 0], + _Q_ = [2, 60], + _R_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": '", + [12, + 37, + [11, + "' alone is not accepted in character sets, use ", + [12, + 37, + [12, + 37, + [11, " instead at position ", [4, 0, 0, 0, [12, 46, 0]]]]]]]]]], + "invalid format %S: '%%' alone is not accepted in character sets, use %%%% instead at position %d."], + _S_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": integer ", + [4, 0, 0, 0, [11, " is greater than the limit ", [4, 0, 0, 0, 0]]]]]], + "invalid format %S: integer %d is greater than the limit %d"], + cst_digit = "digit", + _T_ = [0, cst_camlinternalFormat_ml, 2837, 11], + _U_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ': unclosed sub-format, expected "', + [12, 37, [0, [11, '" at character number ', [4, 0, 0, 0, 0]]]]]]], + 'invalid format %S: unclosed sub-format, expected "%%%c" at character number %d'], + cst_character = "character ')'", + cst_character$0 = "character '}'", + _V_ = [0, cst_camlinternalFormat_ml, 2899, 34], + _W_ = [0, cst_camlinternalFormat_ml, 2935, 28], + _X_ = [0, cst_camlinternalFormat_ml, 2957, 11], + _Y_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + cst$44, + [2, + 0, + [11, + " is incompatible with '", + [0, [11, "' in sub-format ", [3, 0, 0]]]]]]]]]], + "invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S"], + _B_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, cst$44, [2, 0, [11, " expected, read ", [1, 0]]]]]]]], + "invalid format %S: at character number %d, %s expected, read %C"], + _A_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", '", [0, [11, "' without ", [2, 0, 0]]]]]]]], + "invalid format %S: at character number %d, '%c' without %s"], + cst_non_zero_widths_are_unsupp = + "non-zero widths are unsupported for %c conversions", + cst_unexpected_end_of_format = "unexpected end of format", + _z_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, cst_at_character_number, [4, 0, 0, 0, [11, cst$44, [2, 0, 0]]]]]], + "invalid format %S: at character number %d, %s"], + _y_ = + [0, + [11, "invalid box description ", [3, 0, 0]], + "invalid box description %S"], + _x_ = [0, 0, 4], + cst_nan = "nan", + cst_neg_infinity = "neg_infinity", + cst_infinity = "infinity", + _r_ = [0, 103], + cst_nd$0 = "%+nd", + cst_nd$1 = "% nd", + cst_ni$1 = "%+ni", + cst_ni$2 = "% ni", + cst_nx = "%nx", + cst_nx$0 = "%#nx", + cst_nX = "%nX", + cst_nX$0 = "%#nX", + cst_no = "%no", + cst_no$0 = "%#no", + cst_nd = "%nd", + cst_ni$0 = cst_ni$3, + cst_nu = "%nu", + cst_ld$0 = "%+ld", + cst_ld$1 = "% ld", + cst_li$1 = "%+li", + cst_li$2 = "% li", + cst_lx = "%lx", + cst_lx$0 = "%#lx", + cst_lX = "%lX", + cst_lX$0 = "%#lX", + cst_lo = "%lo", + cst_lo$0 = "%#lo", + cst_ld = "%ld", + cst_li$0 = cst_li$3, + cst_lu = "%lu", + cst_Ld$0 = "%+Ld", + cst_Ld$1 = "% Ld", + cst_Li$1 = "%+Li", + cst_Li$2 = "% Li", + cst_Lx = "%Lx", + cst_Lx$0 = "%#Lx", + cst_LX = "%LX", + cst_LX$0 = "%#LX", + cst_Lo = "%Lo", + cst_Lo$0 = "%#Lo", + cst_Ld = "%Ld", + cst_Li$0 = cst_Li$3, + cst_Lu = "%Lu", + cst_d$0 = "%+d", + cst_d$1 = "% d", + cst_i$1 = "%+i", + cst_i$2 = "% i", + cst_x = "%x", + cst_x$0 = "%#x", + cst_X = "%X", + cst_X$0 = "%#X", + cst_o = "%o", + cst_o$0 = "%#o", + cst_d = "%d", + cst_i$0 = cst_i$3, + cst_u = cst_u$0, + cst_0c = "0c", + _a_ = [0, 0, 0], + cst_CamlinternalFormat_Type_mi = "CamlinternalFormat.Type_mismatch"; + function create_char_set(param){return caml_call2(Stdlib_Bytes[1], 32, 0);} + function add_in_char_set(char_set, c){ + var + str_ind = c >>> 3 | 0, + mask = 1 << (c & 7), + _dU_ = runtime.caml_bytes_get(char_set, str_ind) | mask; + return caml_bytes_set(char_set, str_ind, caml_call1(Stdlib[29], _dU_)); + } + function freeze_char_set(char_set){ + return caml_call1(Stdlib_Bytes[6], char_set); + } + function rev_char_set(char_set){ + var char_set$0 = create_char_set(0), i = 0; + for(;;){ + var _dS_ = caml_string_get(char_set, i) ^ 255; + caml_bytes_set(char_set$0, i, caml_call1(Stdlib[29], _dS_)); + var _dT_ = i + 1 | 0; + if(31 === i) return caml_call1(Stdlib_Bytes[44], char_set$0); + var i = _dT_; + } + } + function is_in_char_set(char_set, c){ + var str_ind = c >>> 3 | 0, mask = 1 << (c & 7); + return 0 !== (caml_string_get(char_set, str_ind) & mask) ? 1 : 0; + } + function pad_of_pad_opt(pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return [0, 1, width]; + } + function param_format_of_ignored_format(ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + return [0, [0, fmt]]; + case 1: + return [0, [1, fmt]]; + case 2: + return [0, [19, fmt]]; + default: return [0, [22, fmt]]; + } + switch(ign[0]){ + case 0: + var pad_opt = ign[1]; return [0, [2, pad_of_pad_opt(pad_opt), fmt]]; + case 1: + var pad_opt$0 = ign[1]; + return [0, [3, pad_of_pad_opt(pad_opt$0), fmt]]; + case 2: + var pad_opt$1 = ign[2], iconv = ign[1]; + return [0, [4, iconv, pad_of_pad_opt(pad_opt$1), 0, fmt]]; + case 3: + var pad_opt$2 = ign[2], iconv$0 = ign[1]; + return [0, [5, iconv$0, pad_of_pad_opt(pad_opt$2), 0, fmt]]; + case 4: + var pad_opt$3 = ign[2], iconv$1 = ign[1]; + return [0, [6, iconv$1, pad_of_pad_opt(pad_opt$3), 0, fmt]]; + case 5: + var pad_opt$4 = ign[2], iconv$2 = ign[1]; + return [0, [7, iconv$2, pad_of_pad_opt(pad_opt$4), 0, fmt]]; + case 6: + var prec_opt = ign[2], pad_opt$5 = ign[1]; + if(prec_opt) + var ndec = prec_opt[1], _dR_ = [0, ndec]; + else + var _dR_ = 0; + return [0, [8, _a_, pad_of_pad_opt(pad_opt$5), _dR_, fmt]]; + case 7: + var pad_opt$6 = ign[1]; + return [0, [9, pad_of_pad_opt(pad_opt$6), fmt]]; + case 8: + var fmtty = ign[2], pad_opt$7 = ign[1]; + return [0, [13, pad_opt$7, fmtty, fmt]]; + case 9: + var fmtty$0 = ign[2], pad_opt$8 = ign[1]; + return [0, [14, pad_opt$8, fmtty$0, fmt]]; + case 10: + var char_set = ign[2], width_opt = ign[1]; + return [0, [20, width_opt, char_set, fmt]]; + default: var counter = ign[1]; return [0, [21, counter, fmt]]; + } + } + function default_float_precision(fconv){return 5 === fconv[2] ? 12 : -6;} + function buffer_create(init_size){ + return [0, 0, caml_create_bytes(init_size)]; + } + function buffer_check_size(buf, overhead){ + var + len = runtime.caml_ml_bytes_length(buf[2]), + min_len = buf[1] + overhead | 0, + _dP_ = len < min_len ? 1 : 0; + if(_dP_){ + var + new_len = caml_call2(Stdlib_Int[11], len * 2 | 0, min_len), + new_str = caml_create_bytes(new_len); + caml_call5(Stdlib_Bytes[11], buf[2], 0, new_str, 0, len); + buf[2] = new_str; + var _dQ_ = 0; + } + else + var _dQ_ = _dP_; + return _dQ_; + } + function buffer_add_char(buf, c){ + buffer_check_size(buf, 1); + caml_bytes_set(buf[2], buf[1], c); + buf[1] = buf[1] + 1 | 0; + return 0; + } + function buffer_add_string(buf, s){ + var str_len = caml_ml_string_length(s); + buffer_check_size(buf, str_len); + caml_call5(Stdlib_String[48], s, 0, buf[2], buf[1], str_len); + buf[1] = buf[1] + str_len | 0; + return 0; + } + function buffer_contents(buf){ + return caml_call3(Stdlib_Bytes[8], buf[2], 0, buf[1]); + } + function char_of_iconv(iconv){ + switch(iconv){ + case 6: + case 7: + return 120; + case 8: + case 9: + return 88; + case 10: + case 11: + return 111; + case 12: + case 15: + return 117; + case 0: + case 1: + case 2: + case 13: + return 100; + default: return 105; + } + } + function char_of_fconv(opt, fconv){ + if(opt) var sth = opt[1], cF = sth; else var cF = 70; + switch(fconv[2]){ + case 0: + return 102; + case 1: + return 101; + case 2: + return 69; + case 3: + return 103; + case 4: + return 71; + case 5: + return cF; + case 6: + return 104; + case 7: + return 72; + default: return 70; + } + } + function bprint_padty(buf, padty){ + switch(padty){ + case 0: + return buffer_add_char(buf, 45); + case 1: + return 0; + default: return buffer_add_char(buf, 48); + } + } + function bprint_ignored_flag(buf, ign_flag){ + return ign_flag ? buffer_add_char(buf, 95) : ign_flag; + } + function bprint_pad_opt(buf, pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], width)); + } + function bprint_padding(buf, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]){ + var n = pad[2], padty = pad[1]; + bprint_padty(buf, padty); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + var padty$0 = pad[1]; + bprint_padty(buf, padty$0); + return buffer_add_char(buf, 42); + } + function bprint_precision(buf, prec){ + if(typeof prec === "number") + return prec ? buffer_add_string(buf, cst) : 0; + var n = prec[1]; + buffer_add_char(buf, 46); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + function bprint_iconv_flag(buf, iconv){ + switch(iconv){ + case 1: + case 4: + return buffer_add_char(buf, 43); + case 2: + case 5: + return buffer_add_char(buf, 32); + case 7: + case 9: + case 11: + case 13: + case 14: + case 15: + return buffer_add_char(buf, 35); + default: return 0; + } + } + function bprint_altint_fmt(buf, ign_flag, iconv, pad, prec, c){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad); + bprint_precision(buf, prec); + buffer_add_char(buf, c); + return buffer_add_char(buf, char_of_iconv(iconv)); + } + function bprint_fconv_flag(buf, fconv){ + switch(fconv[1]){ + case 0: break; + case 1: + buffer_add_char(buf, 43); break; + default: buffer_add_char(buf, 32); + } + return 8 <= fconv[2] ? buffer_add_char(buf, 35) : 0; + } + function string_of_formatting_lit(formatting_lit){ + if(typeof formatting_lit === "number") + switch(formatting_lit){ + case 0: + return cst$0; + case 1: + return cst$1; + case 2: + return cst$2; + case 3: + return cst$3; + case 4: + return cst$4; + case 5: + return cst$5; + default: return cst$6; + } + switch(formatting_lit[0]){ + case 0: + var str = formatting_lit[1]; return str; + case 1: + var str$0 = formatting_lit[1]; return str$0; + default: + var c = formatting_lit[1], _dO_ = caml_call2(Stdlib_String[1], 1, c); + return caml_call2(Stdlib[28], cst$7, _dO_); + } + } + function bprint_char_literal(buf, chr){ + return 37 === chr + ? buffer_add_string(buf, cst$8) + : buffer_add_char(buf, chr); + } + function bprint_string_literal(buf, str){ + var _dM_ = caml_ml_string_length(str) - 1 | 0, _dL_ = 0; + if(_dM_ >= 0){ + var i = _dL_; + for(;;){ + bprint_char_literal(buf, caml_string_get(str, i)); + var _dN_ = i + 1 | 0; + if(_dM_ !== i){var i = _dN_; continue;} + break; + } + } + return 0; + } + function bprint_fmtty(buf, fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1]; + buffer_add_string(buf, cst_c); + var fmtty$0 = fmtty$1; + continue; + case 1: + var fmtty$2 = fmtty$0[1]; + buffer_add_string(buf, cst_s); + var fmtty$0 = fmtty$2; + continue; + case 2: + var fmtty$3 = fmtty$0[1]; + buffer_add_string(buf, cst_i); + var fmtty$0 = fmtty$3; + continue; + case 3: + var fmtty$4 = fmtty$0[1]; + buffer_add_string(buf, cst_li); + var fmtty$0 = fmtty$4; + continue; + case 4: + var fmtty$5 = fmtty$0[1]; + buffer_add_string(buf, cst_ni); + var fmtty$0 = fmtty$5; + continue; + case 5: + var fmtty$6 = fmtty$0[1]; + buffer_add_string(buf, cst_Li); + var fmtty$0 = fmtty$6; + continue; + case 6: + var fmtty$7 = fmtty$0[1]; + buffer_add_string(buf, cst_f); + var fmtty$0 = fmtty$7; + continue; + case 7: + var fmtty$8 = fmtty$0[1]; + buffer_add_string(buf, cst_B); + var fmtty$0 = fmtty$8; + continue; + case 8: + var fmtty$9 = fmtty$0[2], sub_fmtty = fmtty$0[1]; + buffer_add_string(buf, cst$9); + bprint_fmtty(buf, sub_fmtty); + buffer_add_string(buf, cst$10); + var fmtty$0 = fmtty$9; + continue; + case 9: + var fmtty$10 = fmtty$0[3], sub_fmtty$0 = fmtty$0[1]; + buffer_add_string(buf, cst$11); + bprint_fmtty(buf, sub_fmtty$0); + buffer_add_string(buf, cst$12); + var fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1]; + buffer_add_string(buf, cst_a); + var fmtty$0 = fmtty$11; + continue; + case 11: + var fmtty$12 = fmtty$0[1]; + buffer_add_string(buf, cst_t); + var fmtty$0 = fmtty$12; + continue; + case 12: + var fmtty$13 = fmtty$0[1]; + buffer_add_string(buf, cst$13); + var fmtty$0 = fmtty$13; + continue; + case 13: + var fmtty$14 = fmtty$0[1]; + buffer_add_string(buf, cst_r); + var fmtty$0 = fmtty$14; + continue; + default: + var fmtty$15 = fmtty$0[1]; + buffer_add_string(buf, cst_r$0); + var fmtty$0 = fmtty$15; + continue; + } + } + } + function int_of_custom_arity(param){ + if(! param) return 0; + var x = param[1]; + return 1 + int_of_custom_arity(x) | 0; + } + function string_of_fmt(fmt){ + var buf = buffer_create(16); + function fmtiter(fmt, ign_flag){ + var fmt$0 = fmt, ign_flag$0 = ign_flag; + a: + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 99); + var fmt$0 = rest, ign_flag$0 = 0; + continue; + case 1: + var rest$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 67); + var fmt$0 = rest$0, ign_flag$0 = 0; + continue; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad); + buffer_add_char(buf, 115); + var fmt$0 = rest$1, ign_flag$0 = 0; + continue; + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$0); + buffer_add_char(buf, 83); + var fmt$0 = rest$2, ign_flag$0 = 0; + continue; + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad$1); + bprint_precision(buf, prec); + buffer_add_char(buf, char_of_iconv(iconv)); + var fmt$0 = rest$3, ign_flag$0 = 0; + continue; + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$0, pad$2, prec$0, 108); + var fmt$0 = rest$4, ign_flag$0 = 0; + continue; + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$1, pad$3, prec$1, 110); + var fmt$0 = rest$5, ign_flag$0 = 0; + continue; + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$2, pad$4, prec$2, 76); + var fmt$0 = rest$6, ign_flag$0 = 0; + continue; + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_fconv_flag(buf, fconv); + bprint_padding(buf, pad$5); + bprint_precision(buf, prec$3); + buffer_add_char(buf, char_of_fconv(0, fconv)); + var fmt$0 = rest$7, ign_flag$0 = 0; + continue; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$6); + buffer_add_char(buf, 66); + var fmt$0 = rest$8, ign_flag$0 = 0; + continue; + case 10: + var rest$9 = fmt$0[1]; + buffer_add_string(buf, cst$14); + var fmt$0 = rest$9; + continue; + case 11: + var rest$10 = fmt$0[2], str = fmt$0[1]; + bprint_string_literal(buf, str); + var fmt$0 = rest$10; + continue; + case 12: + var rest$11 = fmt$0[2], chr = fmt$0[1]; + bprint_char_literal(buf, chr); + var fmt$0 = rest$11; + continue; + case 13: + var rest$12 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt); + buffer_add_char(buf, 123); + bprint_fmtty(buf, fmtty); + buffer_add_char(buf, 37); + buffer_add_char(buf, 125); + var fmt$0 = rest$12, ign_flag$0 = 0; + continue; + case 14: + var rest$13 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt$0); + buffer_add_char(buf, 40); + bprint_fmtty(buf, fmtty$0); + buffer_add_char(buf, 37); + buffer_add_char(buf, 41); + var fmt$0 = rest$13, ign_flag$0 = 0; + continue; + case 15: + var rest$14 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 97); + var fmt$0 = rest$14, ign_flag$0 = 0; + continue; + case 16: + var rest$15 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 116); + var fmt$0 = rest$15, ign_flag$0 = 0; + continue; + case 17: + var rest$16 = fmt$0[2], fmting_lit = fmt$0[1]; + bprint_string_literal(buf, string_of_formatting_lit(fmting_lit)); + var fmt$0 = rest$16; + continue; + case 18: + var rest$17 = fmt$0[2], fmting_gen = fmt$0[1]; + if(0 === fmting_gen[0]){ + var str$0 = fmting_gen[1][2]; + buffer_add_string(buf, cst$15); + buffer_add_string(buf, str$0); + } + else{ + var str$1 = fmting_gen[1][2]; + buffer_add_string(buf, cst$16); + buffer_add_string(buf, str$1); + } + var fmt$0 = rest$17; + continue; + case 19: + var rest$18 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 114); + var fmt$0 = rest$18, ign_flag$0 = 0; + continue; + case 20: + var rest$19 = fmt$0[3], char_set = fmt$0[2], width_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, width_opt); + var + print_char = + function(buf, i){ + var c = caml_call1(Stdlib[29], i); + return 37 === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 37)) + : 64 + === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 64)) + : buffer_add_char(buf, c); + }; + buffer_add_char(buf, 91); + var + set = + is_in_char_set(char_set, 0) + ? (buffer_add_char(buf, 94), rev_char_set(char_set)) + : char_set, + is_alone$0 = + function(set){ + function is_alone(c){ + var + after = caml_call1(Stdlib_Char[1], c + 1 | 0), + before = caml_call1(Stdlib_Char[1], c - 1 | 0), + _dH_ = is_in_char_set(set, c); + if(_dH_) + var + _dI_ = is_in_char_set(set, before), + _dJ_ = _dI_ ? is_in_char_set(set, after) : _dI_, + _dK_ = 1 - _dJ_; + else + var _dK_ = _dH_; + return _dK_; + } + return is_alone; + }, + is_alone = is_alone$0(set); + if(is_alone(93)) buffer_add_char(buf, 93); + var i = 1; + b: + for(;;){ + if(i < 256){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i))){var i$0 = i + 1 | 0, i = i$0; continue;} + var switcher = caml_call1(Stdlib[29], i) - 45 | 0, switch$0 = 0; + if(48 < switcher >>> 0) + if(210 <= switcher) print_char(buf, 255); else switch$0 = 1; + else{ + if(46 < switcher - 1 >>> 0){ + var i$2 = i + 1 | 0, i = i$2; + continue; + } + switch$0 = 1; + } + if(switch$0){ + var i$1 = i + 1 | 0; + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1))){ + print_char(buf, i$1 - 1 | 0); + var i$6 = i$1 + 1 | 0, i = i$6; + continue; + } + var + switcher$0 = caml_call1(Stdlib[29], i$1) - 45 | 0, + switch$1 = 0; + if(48 < switcher$0 >>> 0){ + if(210 <= switcher$0){ + print_char(buf, 254); + print_char(buf, 255); + switch$1 = 1; + } + } + else if + (46 < switcher$0 - 1 >>> 0 + && ! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + var i$5 = i$1 + 1 | 0, i = i$5; + continue; + } + if(! switch$1){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + print_char(buf, i$1); + var i$4 = i$1 + 2 | 0, i = i$4; + continue; + } + var j = i$1 + 2 | 0, i$3 = i$1 - 1 | 0, j$0 = j; + for(;;){ + if + (256 !== j$0 + && is_in_char_set(set, caml_call1(Stdlib[29], j$0))){var j$1 = j$0 + 1 | 0, j$0 = j$1; continue;} + print_char(buf, i$3); + print_char(buf, 45); + print_char(buf, j$0 - 1 | 0); + if(j$0 < 256){var i$7 = j$0 + 1 | 0, i = i$7; continue b;} + break; + } + } + } + } + if(is_alone(45)) buffer_add_char(buf, 45); + buffer_add_char(buf, 93); + var fmt$0 = rest$19, ign_flag$0 = 0; + continue a; + } + case 21: + var rest$20 = fmt$0[2], counter = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + switch(counter){ + case 0: + var _dD_ = 108; break; + case 1: + var _dD_ = 110; break; + default: var _dD_ = 78; + } + buffer_add_char(buf, _dD_); + var fmt$0 = rest$20, ign_flag$0 = 0; + continue; + case 22: + var rest$21 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_string_literal(buf, cst_0c); + var fmt$0 = rest$21, ign_flag$0 = 0; + continue; + case 23: + var + rest$22 = fmt$0[2], + ign = fmt$0[1], + fmt$1 = param_format_of_ignored_format(ign, rest$22)[1], + fmt$0 = fmt$1, + ign_flag$0 = 1; + continue; + default: + var + rest$23 = fmt$0[3], + arity = fmt$0[1], + _dF_ = int_of_custom_arity(arity), + _dE_ = 1; + if(_dF_ >= 1){ + var i$8 = _dE_; + for(;;){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 63); + var _dG_ = i$8 + 1 | 0; + if(_dF_ !== i$8){var i$8 = _dG_; continue;} + break; + } + } + var fmt$0 = rest$23, ign_flag$0 = 0; + continue; + } + } + } + fmtiter(fmt, 0); + return buffer_contents(buf); + } + function symm(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, symm(rest)]; + case 1: + var rest$0 = param[1]; return [1, symm(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, symm(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, symm(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, symm(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, symm(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, symm(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, symm(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; return [8, ty, symm(rest$7)]; + case 9: + var rest$8 = param[3], ty2 = param[2], ty1 = param[1]; + return [9, ty2, ty1, symm(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, symm(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, symm(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, symm(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, symm(rest$12)]; + default: var rest$13 = param[1]; return [14, symm(rest$13)]; + } + } + function fmtty_rel_det(param){ + if(typeof param !== "number") + switch(param[0]){ + case 0: + var + rest = param[1], + match = fmtty_rel_det(rest), + de = match[4], + ed = match[3], + af = match[2], + fa = match[1], + _di_ = function(param){caml_call1(af, 0); return 0;}; + return [0, + function(param){caml_call1(fa, 0); return 0;}, + _di_, + ed, + de]; + case 1: + var + rest$0 = param[1], + match$0 = fmtty_rel_det(rest$0), + de$0 = match$0[4], + ed$0 = match$0[3], + af$0 = match$0[2], + fa$0 = match$0[1], + _dj_ = function(param){caml_call1(af$0, 0); return 0;}; + return [0, + function(param){caml_call1(fa$0, 0); return 0;}, + _dj_, + ed$0, + de$0]; + case 2: + var + rest$1 = param[1], + match$1 = fmtty_rel_det(rest$1), + de$1 = match$1[4], + ed$1 = match$1[3], + af$1 = match$1[2], + fa$1 = match$1[1], + _dk_ = function(param){caml_call1(af$1, 0); return 0;}; + return [0, + function(param){caml_call1(fa$1, 0); return 0;}, + _dk_, + ed$1, + de$1]; + case 3: + var + rest$2 = param[1], + match$2 = fmtty_rel_det(rest$2), + de$2 = match$2[4], + ed$2 = match$2[3], + af$2 = match$2[2], + fa$2 = match$2[1], + _dl_ = function(param){caml_call1(af$2, 0); return 0;}; + return [0, + function(param){caml_call1(fa$2, 0); return 0;}, + _dl_, + ed$2, + de$2]; + case 4: + var + rest$3 = param[1], + match$3 = fmtty_rel_det(rest$3), + de$3 = match$3[4], + ed$3 = match$3[3], + af$3 = match$3[2], + fa$3 = match$3[1], + _dm_ = function(param){caml_call1(af$3, 0); return 0;}; + return [0, + function(param){caml_call1(fa$3, 0); return 0;}, + _dm_, + ed$3, + de$3]; + case 5: + var + rest$4 = param[1], + match$4 = fmtty_rel_det(rest$4), + de$4 = match$4[4], + ed$4 = match$4[3], + af$4 = match$4[2], + fa$4 = match$4[1], + _dn_ = function(param){caml_call1(af$4, 0); return 0;}; + return [0, + function(param){caml_call1(fa$4, 0); return 0;}, + _dn_, + ed$4, + de$4]; + case 6: + var + rest$5 = param[1], + match$5 = fmtty_rel_det(rest$5), + de$5 = match$5[4], + ed$5 = match$5[3], + af$5 = match$5[2], + fa$5 = match$5[1], + _do_ = function(param){caml_call1(af$5, 0); return 0;}; + return [0, + function(param){caml_call1(fa$5, 0); return 0;}, + _do_, + ed$5, + de$5]; + case 7: + var + rest$6 = param[1], + match$6 = fmtty_rel_det(rest$6), + de$6 = match$6[4], + ed$6 = match$6[3], + af$6 = match$6[2], + fa$6 = match$6[1], + _dp_ = function(param){caml_call1(af$6, 0); return 0;}; + return [0, + function(param){caml_call1(fa$6, 0); return 0;}, + _dp_, + ed$6, + de$6]; + case 8: + var + rest$7 = param[2], + match$7 = fmtty_rel_det(rest$7), + de$7 = match$7[4], + ed$7 = match$7[3], + af$7 = match$7[2], + fa$7 = match$7[1], + _dq_ = function(param){caml_call1(af$7, 0); return 0;}; + return [0, + function(param){caml_call1(fa$7, 0); return 0;}, + _dq_, + ed$7, + de$7]; + case 9: + var + rest$8 = param[3], + ty2 = param[2], + ty1 = param[1], + match$8 = fmtty_rel_det(rest$8), + de$8 = match$8[4], + ed$8 = match$8[3], + af$8 = match$8[2], + fa$8 = match$8[1], + ty = trans(symm(ty1), ty2), + match$9 = fmtty_rel_det(ty), + jd = match$9[4], + dj = match$9[3], + ga = match$9[2], + ag = match$9[1], + _dr_ = + function(param){caml_call1(jd, 0); caml_call1(de$8, 0); return 0;}, + _ds_ = + function(param){caml_call1(ed$8, 0); caml_call1(dj, 0); return 0;}, + _dt_ = + function(param){caml_call1(ga, 0); caml_call1(af$8, 0); return 0;}; + return [0, + function(param){ + caml_call1(fa$8, 0); + caml_call1(ag, 0); + return 0; + }, + _dt_, + _ds_, + _dr_]; + case 10: + var + rest$9 = param[1], + match$10 = fmtty_rel_det(rest$9), + de$9 = match$10[4], + ed$9 = match$10[3], + af$9 = match$10[2], + fa$9 = match$10[1], + _du_ = function(param){caml_call1(af$9, 0); return 0;}; + return [0, + function(param){caml_call1(fa$9, 0); return 0;}, + _du_, + ed$9, + de$9]; + case 11: + var + rest$10 = param[1], + match$11 = fmtty_rel_det(rest$10), + de$10 = match$11[4], + ed$10 = match$11[3], + af$10 = match$11[2], + fa$10 = match$11[1], + _dv_ = function(param){caml_call1(af$10, 0); return 0;}; + return [0, + function(param){caml_call1(fa$10, 0); return 0;}, + _dv_, + ed$10, + de$10]; + case 12: + var + rest$11 = param[1], + match$12 = fmtty_rel_det(rest$11), + de$11 = match$12[4], + ed$11 = match$12[3], + af$11 = match$12[2], + fa$11 = match$12[1], + _dw_ = function(param){caml_call1(af$11, 0); return 0;}; + return [0, + function(param){caml_call1(fa$11, 0); return 0;}, + _dw_, + ed$11, + de$11]; + case 13: + var + rest$12 = param[1], + match$13 = fmtty_rel_det(rest$12), + de$12 = match$13[4], + ed$12 = match$13[3], + af$12 = match$13[2], + fa$12 = match$13[1], + _dx_ = function(param){caml_call1(de$12, 0); return 0;}, + _dy_ = function(param){caml_call1(ed$12, 0); return 0;}, + _dz_ = function(param){caml_call1(af$12, 0); return 0;}; + return [0, + function(param){caml_call1(fa$12, 0); return 0;}, + _dz_, + _dy_, + _dx_]; + default: + var + rest$13 = param[1], + match$14 = fmtty_rel_det(rest$13), + de$13 = match$14[4], + ed$13 = match$14[3], + af$13 = match$14[2], + fa$13 = match$14[1], + _dA_ = function(param){caml_call1(de$13, 0); return 0;}, + _dB_ = function(param){caml_call1(ed$13, 0); return 0;}, + _dC_ = function(param){caml_call1(af$13, 0); return 0;}; + return [0, + function(param){caml_call1(fa$13, 0); return 0;}, + _dC_, + _dB_, + _dA_]; + } + function _df_(param){return 0;} + function _dg_(param){return 0;} + function _dh_(param){return 0;} + return [0, function(param){return 0;}, _dh_, _dg_, _df_]; + } + function trans(ty1, ty2){ + var switch$0 = 0; + if(typeof ty1 === "number"){ + if(typeof ty2 === "number") return 0; + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + } + else + switch(ty1[0]){ + case 0: + var rest1 = ty1[1], switch$1 = 0; + if(typeof ty2 === "number") + switch$1 = 1; + else + switch(ty2[0]){ + case 0: + var rest2 = ty2[1]; return [0, trans(rest1, rest2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$1 = 1; + } + if(switch$1) switch$0 = 7; + break; + case 1: + var rest1$0 = ty1[1], switch$2 = 0; + if(typeof ty2 === "number") + switch$2 = 1; + else + switch(ty2[0]){ + case 1: + var rest2$0 = ty2[1]; return [1, trans(rest1$0, rest2$0)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$2 = 1; + } + if(switch$2) switch$0 = 7; + break; + case 2: + var rest1$1 = ty1[1], switch$3 = 0; + if(typeof ty2 === "number") + switch$3 = 1; + else + switch(ty2[0]){ + case 2: + var rest2$1 = ty2[1]; return [2, trans(rest1$1, rest2$1)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$3 = 1; + } + if(switch$3) switch$0 = 7; + break; + case 3: + var rest1$2 = ty1[1], switch$4 = 0; + if(typeof ty2 === "number") + switch$4 = 1; + else + switch(ty2[0]){ + case 3: + var rest2$2 = ty2[1]; return [3, trans(rest1$2, rest2$2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$4 = 1; + } + if(switch$4) switch$0 = 7; + break; + case 4: + var rest1$3 = ty1[1], switch$5 = 0; + if(typeof ty2 === "number") + switch$5 = 1; + else + switch(ty2[0]){ + case 4: + var rest2$3 = ty2[1]; return [4, trans(rest1$3, rest2$3)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$5 = 1; + } + if(switch$5) switch$0 = 7; + break; + case 5: + var rest1$4 = ty1[1], switch$6 = 0; + if(typeof ty2 === "number") + switch$6 = 1; + else + switch(ty2[0]){ + case 5: + var rest2$4 = ty2[1]; return [5, trans(rest1$4, rest2$4)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$6 = 1; + } + if(switch$6) switch$0 = 7; + break; + case 6: + var rest1$5 = ty1[1], switch$7 = 0; + if(typeof ty2 === "number") + switch$7 = 1; + else + switch(ty2[0]){ + case 6: + var rest2$5 = ty2[1]; return [6, trans(rest1$5, rest2$5)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$7 = 1; + } + if(switch$7) switch$0 = 7; + break; + case 7: + var rest1$6 = ty1[1], switch$8 = 0; + if(typeof ty2 === "number") + switch$8 = 1; + else + switch(ty2[0]){ + case 7: + var rest2$6 = ty2[1]; return [7, trans(rest1$6, rest2$6)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$8 = 1; + } + if(switch$8) switch$0 = 7; + break; + case 8: + var rest1$7 = ty1[2], ty1$0 = ty1[1], switch$9 = 0; + if(typeof ty2 === "number") + switch$9 = 1; + else + switch(ty2[0]){ + case 8: + var + rest2$7 = ty2[2], + ty2$0 = ty2[1], + _de_ = trans(rest1$7, rest2$7); + return [8, trans(ty1$0, ty2$0), _de_]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$9 = 1; + } + if(switch$9) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + break; + case 9: + var rest1$8 = ty1[3], ty12 = ty1[2], ty11 = ty1[1], switch$10 = 0; + if(typeof ty2 === "number") + switch$10 = 1; + else + switch(ty2[0]){ + case 8: + switch$0 = 5; break; + case 9: + var + rest2$8 = ty2[3], + ty22 = ty2[2], + ty21 = ty2[1], + ty = trans(symm(ty12), ty21), + match = fmtty_rel_det(ty), + f4 = match[4], + f2 = match[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + return [9, ty11, ty22, trans(rest1$8, rest2$8)]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$10 = 1; + } + if(switch$10) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + break; + case 10: + var rest1$9 = ty1[1]; + if(typeof ty2 !== "number" && 10 === ty2[0]){ + var rest2$9 = ty2[1]; + return [10, trans(rest1$9, rest2$9)]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + case 11: + var rest1$10 = ty1[1], switch$11 = 0; + if(typeof ty2 === "number") + switch$11 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + var rest2$10 = ty2[1]; return [11, trans(rest1$10, rest2$10)]; + default: switch$11 = 1; + } + if(switch$11) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + break; + case 12: + var rest1$11 = ty1[1], switch$12 = 0; + if(typeof ty2 === "number") + switch$12 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + var rest2$11 = ty2[1]; return [12, trans(rest1$11, rest2$11)]; + default: switch$12 = 1; + } + if(switch$12) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + break; + case 13: + var rest1$12 = ty1[1], switch$13 = 0; + if(typeof ty2 === "number") + switch$13 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + var rest2$12 = ty2[1]; return [13, trans(rest1$12, rest2$12)]; + default: switch$13 = 1; + } + if(switch$13) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + break; + default: + var rest1$13 = ty1[1], switch$14 = 0; + if(typeof ty2 === "number") + switch$14 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + var rest2$13 = ty2[1]; return [14, trans(rest1$13, rest2$13)]; + default: switch$14 = 1; + } + if(switch$14) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + } + switch(switch$0){ + case 0: + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + case 1: + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + case 3: + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + case 4: + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + case 5: + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + case 6: + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + default: throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function fmtty_of_padding_fmtty(pad, fmtty){ + return typeof pad === "number" ? fmtty : 0 === pad[0] ? fmtty : [2, fmtty]; + } + function fmtty_of_custom(arity, fmtty){ + if(! arity) return fmtty; + var arity$0 = arity[1]; + return [12, fmtty_of_custom(arity$0, fmtty)]; + } + function fmtty_of_fmt(fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var rest = fmtty$0[1]; return [0, fmtty_of_fmt(rest)]; + case 1: + var rest$0 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$0)]; + case 2: + var rest$1 = fmtty$0[2], pad = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad, [1, fmtty_of_fmt(rest$1)]); + case 3: + var rest$2 = fmtty$0[2], pad$0 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$0, [1, fmtty_of_fmt(rest$2)]); + case 4: + var + rest$3 = fmtty$0[4], + prec = fmtty$0[3], + pad$1 = fmtty$0[2], + ty_rest = fmtty_of_fmt(rest$3), + prec_ty = fmtty_of_precision_fmtty(prec, [2, ty_rest]); + return fmtty_of_padding_fmtty(pad$1, prec_ty); + case 5: + var + rest$4 = fmtty$0[4], + prec$0 = fmtty$0[3], + pad$2 = fmtty$0[2], + ty_rest$0 = fmtty_of_fmt(rest$4), + prec_ty$0 = fmtty_of_precision_fmtty(prec$0, [3, ty_rest$0]); + return fmtty_of_padding_fmtty(pad$2, prec_ty$0); + case 6: + var + rest$5 = fmtty$0[4], + prec$1 = fmtty$0[3], + pad$3 = fmtty$0[2], + ty_rest$1 = fmtty_of_fmt(rest$5), + prec_ty$1 = fmtty_of_precision_fmtty(prec$1, [4, ty_rest$1]); + return fmtty_of_padding_fmtty(pad$3, prec_ty$1); + case 7: + var + rest$6 = fmtty$0[4], + prec$2 = fmtty$0[3], + pad$4 = fmtty$0[2], + ty_rest$2 = fmtty_of_fmt(rest$6), + prec_ty$2 = fmtty_of_precision_fmtty(prec$2, [5, ty_rest$2]); + return fmtty_of_padding_fmtty(pad$4, prec_ty$2); + case 8: + var + rest$7 = fmtty$0[4], + prec$3 = fmtty$0[3], + pad$5 = fmtty$0[2], + ty_rest$3 = fmtty_of_fmt(rest$7), + prec_ty$3 = fmtty_of_precision_fmtty(prec$3, [6, ty_rest$3]); + return fmtty_of_padding_fmtty(pad$5, prec_ty$3); + case 9: + var rest$8 = fmtty$0[2], pad$6 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$6, [7, fmtty_of_fmt(rest$8)]); + case 10: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 11: + var fmtty$2 = fmtty$0[2], fmtty$0 = fmtty$2; continue; + case 12: + var fmtty$3 = fmtty$0[2], fmtty$0 = fmtty$3; continue; + case 13: + var rest$9 = fmtty$0[3], ty = fmtty$0[2]; + return [8, ty, fmtty_of_fmt(rest$9)]; + case 14: + var rest$10 = fmtty$0[3], ty$0 = fmtty$0[2]; + return [9, ty$0, ty$0, fmtty_of_fmt(rest$10)]; + case 15: + var rest$11 = fmtty$0[1]; return [10, fmtty_of_fmt(rest$11)]; + case 16: + var rest$12 = fmtty$0[1]; return [11, fmtty_of_fmt(rest$12)]; + case 17: + var fmtty$4 = fmtty$0[2], fmtty$0 = fmtty$4; continue; + case 18: + var + rest$13 = fmtty$0[2], + formatting_gen = fmtty$0[1], + _db_ = fmtty_of_fmt(rest$13); + if(0 === formatting_gen[0]) + var fmt = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt); + else + var fmt$0 = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt$0); + return caml_call2(CamlinternalFormatBasics[1], _dc_, _db_); + case 19: + var rest$14 = fmtty$0[1]; return [13, fmtty_of_fmt(rest$14)]; + case 20: + var rest$15 = fmtty$0[3]; return [1, fmtty_of_fmt(rest$15)]; + case 21: + var rest$16 = fmtty$0[2]; return [2, fmtty_of_fmt(rest$16)]; + case 22: + var rest$17 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$17)]; + case 23: + var fmtty$5 = fmtty$0[2], ign = fmtty$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + return [14, fmtty_of_fmt(fmtty$5)]; + default: var fmtty$0 = fmtty$5; continue; + } + switch(ign[0]){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + var fmtty$0 = fmtty$5; continue; + case 3: + var fmtty$0 = fmtty$5; continue; + case 4: + var fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$0 = fmtty$5; continue; + case 6: + var fmtty$0 = fmtty$5; continue; + case 7: + var fmtty$0 = fmtty$5; continue; + case 8: + var fmtty$0 = fmtty$5; continue; + case 9: + var fmtty$6 = ign[2], _dd_ = fmtty_of_fmt(fmtty$5); + return caml_call2(CamlinternalFormatBasics[1], fmtty$6, _dd_); + case 10: + var fmtty$0 = fmtty$5; continue; + default: var fmtty$0 = fmtty$5; continue; + } + default: + var rest$18 = fmtty$0[3], arity = fmtty$0[1]; + return fmtty_of_custom(arity, fmtty_of_fmt(rest$18)); + } + } + } + function fmtty_of_precision_fmtty(prec, fmtty){ + return typeof prec === "number" ? prec ? [2, fmtty] : fmtty : fmtty; + } + var + Type_mismatch = + [248, cst_CamlinternalFormat_Type_mi, runtime.caml_fresh_oo_id(0)]; + function type_padding(pad, fmtty){ + if(typeof pad === "number") return [0, 0, fmtty]; + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + return [0, [0, padty, w], fmtty]; + } + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var rest = fmtty[1], padty$0 = pad[1]; + return [0, [1, padty$0], rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_padprec(pad, prec, fmtty){ + var match = type_padding(pad, fmtty); + if(typeof prec !== "number"){ + var rest$1 = match[2], pad$2 = match[1], p = prec[1]; + return [0, pad$2, [0, p], rest$1]; + } + if(! prec){ + var rest$0 = match[2], pad$1 = match[1]; + return [0, pad$1, 0, rest$0]; + } + var match$0 = match[2]; + if(typeof match$0 !== "number" && 2 === match$0[0]){ + var rest = match$0[1], pad$0 = match[1]; + return [0, pad$0, 1, rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_format(fmt, fmtty){ + var _da_ = type_format_gen(fmt, fmtty); + if(typeof _da_[2] !== "number") + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var fmt$0 = _da_[1]; + return fmt$0; + } + function type_ignored_param_one(ign, fmt, fmtty){ + var + match = type_format_gen(fmt, fmtty), + fmtty$0 = match[2], + fmt$0 = match[1]; + return [0, [23, ign, fmt$0], fmtty$0]; + } + function type_format_gen(fmt, fmtty0){ + if(typeof fmt === "number") return [0, 0, fmtty0]; + switch(fmt[0]){ + case 0: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest = fmtty0[1], + fmt_rest = fmt[1], + match = type_format_gen(fmt_rest, fmtty_rest), + fmtty = match[2], + fmt$0 = match[1]; + return [0, [0, fmt$0], fmtty]; + } + break; + case 1: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest$0 = fmtty0[1], + fmt_rest$0 = fmt[1], + match$0 = type_format_gen(fmt_rest$0, fmtty_rest$0), + fmtty$0 = match$0[2], + fmt$1 = match$0[1]; + return [0, [1, fmt$1], fmtty$0]; + } + break; + case 2: + var + fmt_rest$1 = fmt[2], + pad = fmt[1], + match$1 = type_padding(pad, fmtty0), + pad$0 = match$1[1], + match$2 = match$1[2]; + if(typeof match$2 !== "number" && 1 === match$2[0]){ + var + fmtty_rest$1 = match$2[1], + match$3 = type_format_gen(fmt_rest$1, fmtty_rest$1), + fmtty$1 = match$3[2], + fmt$2 = match$3[1]; + return [0, [2, pad$0, fmt$2], fmtty$1]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 3: + var + fmt_rest$2 = fmt[2], + pad$1 = fmt[1], + match$4 = type_padding(pad$1, fmtty0), + pad$2 = match$4[1], + match$5 = match$4[2]; + if(typeof match$5 !== "number" && 1 === match$5[0]){ + var + fmtty_rest$2 = match$5[1], + match$6 = type_format_gen(fmt_rest$2, fmtty_rest$2), + fmtty$2 = match$6[2], + fmt$3 = match$6[1]; + return [0, [3, pad$2, fmt$3], fmtty$2]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 4: + var + fmt_rest$3 = fmt[4], + prec = fmt[3], + pad$3 = fmt[2], + iconv = fmt[1], + match$7 = type_padprec(pad$3, prec, fmtty0), + pad$4 = match$7[1], + match$8 = match$7[3]; + if(typeof match$8 !== "number" && 2 === match$8[0]){ + var + fmtty_rest$3 = match$8[1], + prec$0 = match$7[2], + match$9 = type_format_gen(fmt_rest$3, fmtty_rest$3), + fmtty$3 = match$9[2], + fmt$4 = match$9[1]; + return [0, [4, iconv, pad$4, prec$0, fmt$4], fmtty$3]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 5: + var + fmt_rest$4 = fmt[4], + prec$1 = fmt[3], + pad$5 = fmt[2], + iconv$0 = fmt[1], + match$10 = type_padprec(pad$5, prec$1, fmtty0), + pad$6 = match$10[1], + match$11 = match$10[3]; + if(typeof match$11 !== "number" && 3 === match$11[0]){ + var + fmtty_rest$4 = match$11[1], + prec$2 = match$10[2], + match$12 = type_format_gen(fmt_rest$4, fmtty_rest$4), + fmtty$4 = match$12[2], + fmt$5 = match$12[1]; + return [0, [5, iconv$0, pad$6, prec$2, fmt$5], fmtty$4]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 6: + var + fmt_rest$5 = fmt[4], + prec$3 = fmt[3], + pad$7 = fmt[2], + iconv$1 = fmt[1], + match$13 = type_padprec(pad$7, prec$3, fmtty0), + pad$8 = match$13[1], + match$14 = match$13[3]; + if(typeof match$14 !== "number" && 4 === match$14[0]){ + var + fmtty_rest$5 = match$14[1], + prec$4 = match$13[2], + match$15 = type_format_gen(fmt_rest$5, fmtty_rest$5), + fmtty$5 = match$15[2], + fmt$6 = match$15[1]; + return [0, [6, iconv$1, pad$8, prec$4, fmt$6], fmtty$5]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 7: + var + fmt_rest$6 = fmt[4], + prec$5 = fmt[3], + pad$9 = fmt[2], + iconv$2 = fmt[1], + match$16 = type_padprec(pad$9, prec$5, fmtty0), + pad$10 = match$16[1], + match$17 = match$16[3]; + if(typeof match$17 !== "number" && 5 === match$17[0]){ + var + fmtty_rest$6 = match$17[1], + prec$6 = match$16[2], + match$18 = type_format_gen(fmt_rest$6, fmtty_rest$6), + fmtty$6 = match$18[2], + fmt$7 = match$18[1]; + return [0, [7, iconv$2, pad$10, prec$6, fmt$7], fmtty$6]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 8: + var + fmt_rest$7 = fmt[4], + prec$7 = fmt[3], + pad$11 = fmt[2], + fconv = fmt[1], + match$19 = type_padprec(pad$11, prec$7, fmtty0), + pad$12 = match$19[1], + match$20 = match$19[3]; + if(typeof match$20 !== "number" && 6 === match$20[0]){ + var + fmtty_rest$7 = match$20[1], + prec$8 = match$19[2], + match$21 = type_format_gen(fmt_rest$7, fmtty_rest$7), + fmtty$7 = match$21[2], + fmt$8 = match$21[1]; + return [0, [8, fconv, pad$12, prec$8, fmt$8], fmtty$7]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 9: + var + fmt_rest$8 = fmt[2], + pad$13 = fmt[1], + match$22 = type_padding(pad$13, fmtty0), + pad$14 = match$22[1], + match$23 = match$22[2]; + if(typeof match$23 !== "number" && 7 === match$23[0]){ + var + fmtty_rest$8 = match$23[1], + match$24 = type_format_gen(fmt_rest$8, fmtty_rest$8), + fmtty$8 = match$24[2], + fmt$9 = match$24[1]; + return [0, [9, pad$14, fmt$9], fmtty$8]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 10: + var + fmt_rest$9 = fmt[1], + match$25 = type_format_gen(fmt_rest$9, fmtty0), + fmtty$9 = match$25[2], + fmt$10 = match$25[1]; + return [0, [10, fmt$10], fmtty$9]; + case 11: + var + fmt_rest$10 = fmt[2], + str = fmt[1], + match$26 = type_format_gen(fmt_rest$10, fmtty0), + fmtty$10 = match$26[2], + fmt$11 = match$26[1]; + return [0, [11, str, fmt$11], fmtty$10]; + case 12: + var + fmt_rest$11 = fmt[2], + chr = fmt[1], + match$27 = type_format_gen(fmt_rest$11, fmtty0), + fmtty$11 = match$27[2], + fmt$12 = match$27[1]; + return [0, [12, chr, fmt$12], fmtty$11]; + case 13: + if(typeof fmtty0 !== "number" && 8 === fmtty0[0]){ + var + fmtty_rest$9 = fmtty0[2], + sub_fmtty = fmtty0[1], + fmt_rest$12 = fmt[3], + sub_fmtty$0 = fmt[2], + pad_opt = fmt[1]; + if(caml_notequal([0, sub_fmtty$0], [0, sub_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$28 = type_format_gen(fmt_rest$12, fmtty_rest$9), + fmtty$12 = match$28[2], + fmt$13 = match$28[1]; + return [0, [13, pad_opt, sub_fmtty, fmt$13], fmtty$12]; + } + break; + case 14: + if(typeof fmtty0 !== "number" && 9 === fmtty0[0]){ + var + fmtty_rest$10 = fmtty0[3], + sub_fmtty1 = fmtty0[1], + fmt_rest$13 = fmt[3], + sub_fmtty$1 = fmt[2], + pad_opt$0 = fmt[1], + _c__ = [0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty$1)], _c__)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$29 = + type_format_gen + (fmt_rest$13, + caml_call1(CamlinternalFormatBasics[2], fmtty_rest$10)), + fmtty$13 = match$29[2], + fmt$14 = match$29[1]; + return [0, [14, pad_opt$0, sub_fmtty1, fmt$14], fmtty$13]; + } + break; + case 15: + if(typeof fmtty0 !== "number" && 10 === fmtty0[0]){ + var + fmtty_rest$11 = fmtty0[1], + fmt_rest$14 = fmt[1], + match$30 = type_format_gen(fmt_rest$14, fmtty_rest$11), + fmtty$14 = match$30[2], + fmt$15 = match$30[1]; + return [0, [15, fmt$15], fmtty$14]; + } + break; + case 16: + if(typeof fmtty0 !== "number" && 11 === fmtty0[0]){ + var + fmtty_rest$12 = fmtty0[1], + fmt_rest$15 = fmt[1], + match$31 = type_format_gen(fmt_rest$15, fmtty_rest$12), + fmtty$15 = match$31[2], + fmt$16 = match$31[1]; + return [0, [16, fmt$16], fmtty$15]; + } + break; + case 17: + var + fmt_rest$16 = fmt[2], + formatting_lit = fmt[1], + match$32 = type_format_gen(fmt_rest$16, fmtty0), + fmtty$16 = match$32[2], + fmt$17 = match$32[1]; + return [0, [17, formatting_lit, fmt$17], fmtty$16]; + case 18: + var fmt_rest$17 = fmt[2], formatting_gen = fmt[1]; + if(0 === formatting_gen[0]){ + var + match$36 = formatting_gen[1], + str$0 = match$36[2], + fmt1 = match$36[1], + match$37 = type_format_gen(fmt1, fmtty0), + fmtty2 = match$37[2], + fmt2 = match$37[1], + match$38 = type_format_gen(fmt_rest$17, fmtty2), + fmtty3 = match$38[2], + fmt3 = match$38[1]; + return [0, [18, [0, [0, fmt2, str$0]], fmt3], fmtty3]; + } + var + match$39 = formatting_gen[1], + str$1 = match$39[2], + fmt1$0 = match$39[1], + match$40 = type_format_gen(fmt1$0, fmtty0), + fmtty2$0 = match$40[2], + fmt2$0 = match$40[1], + match$41 = type_format_gen(fmt_rest$17, fmtty2$0), + fmtty3$0 = match$41[2], + fmt3$0 = match$41[1]; + return [0, [18, [1, [0, fmt2$0, str$1]], fmt3$0], fmtty3$0]; + case 19: + if(typeof fmtty0 !== "number" && 13 === fmtty0[0]){ + var + fmtty_rest$13 = fmtty0[1], + fmt_rest$18 = fmt[1], + match$33 = type_format_gen(fmt_rest$18, fmtty_rest$13), + fmtty$17 = match$33[2], + fmt$18 = match$33[1]; + return [0, [19, fmt$18], fmtty$17]; + } + break; + case 20: + if(typeof fmtty0 !== "number" && 1 === fmtty0[0]){ + var + fmtty_rest$14 = fmtty0[1], + fmt_rest$19 = fmt[3], + char_set = fmt[2], + width_opt = fmt[1], + match$34 = type_format_gen(fmt_rest$19, fmtty_rest$14), + fmtty$18 = match$34[2], + fmt$19 = match$34[1]; + return [0, [20, width_opt, char_set, fmt$19], fmtty$18]; + } + break; + case 21: + if(typeof fmtty0 !== "number" && 2 === fmtty0[0]){ + var + fmtty_rest$15 = fmtty0[1], + fmt_rest$20 = fmt[2], + counter = fmt[1], + match$35 = type_format_gen(fmt_rest$20, fmtty_rest$15), + fmtty$19 = match$35[2], + fmt$20 = match$35[1]; + return [0, [21, counter, fmt$20], fmtty$19]; + } + break; + case 23: + var rest = fmt[2], ign = fmt[1]; + if(typeof ign !== "number") + switch(ign[0]){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + return type_ignored_param_one(ign, rest, fmtty0); + case 3: + return type_ignored_param_one(ign, rest, fmtty0); + case 4: + return type_ignored_param_one(ign, rest, fmtty0); + case 5: + return type_ignored_param_one(ign, rest, fmtty0); + case 6: + return type_ignored_param_one(ign, rest, fmtty0); + case 7: + return type_ignored_param_one(ign, rest, fmtty0); + case 8: + var sub_fmtty$2 = ign[2], pad_opt$1 = ign[1]; + return type_ignored_param_one + ([8, pad_opt$1, sub_fmtty$2], rest, fmtty0); + case 9: + var + sub_fmtty$3 = ign[2], + pad_opt$2 = ign[1], + _c$_ = type_ignored_format_substituti(sub_fmtty$3, rest, fmtty0), + match$43 = _c$_[2], + fmtty$21 = match$43[2], + fmt$22 = match$43[1], + sub_fmtty$4 = _c$_[1]; + return [0, [23, [9, pad_opt$2, sub_fmtty$4], fmt$22], fmtty$21]; + case 10: + return type_ignored_param_one(ign, rest, fmtty0); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + switch(ign){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + if(typeof fmtty0 !== "number" && 14 === fmtty0[0]){ + var + fmtty_rest$16 = fmtty0[1], + match$42 = type_format_gen(rest, fmtty_rest$16), + fmtty$20 = match$42[2], + fmt$21 = match$42[1]; + return [0, [23, 2, fmt$21], fmtty$20]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_ignored_format_substituti(sub_fmtty, fmt, fmtty){ + if(typeof sub_fmtty === "number") + return [0, 0, type_format_gen(fmt, fmtty)]; + switch(sub_fmtty[0]){ + case 0: + if(typeof fmtty !== "number" && 0 === fmtty[0]){ + var + fmtty_rest = fmtty[1], + sub_fmtty_rest = sub_fmtty[1], + match = + type_ignored_format_substituti(sub_fmtty_rest, fmt, fmtty_rest), + fmt$0 = match[2], + sub_fmtty_rest$0 = match[1]; + return [0, [0, sub_fmtty_rest$0], fmt$0]; + } + break; + case 1: + if(typeof fmtty !== "number" && 1 === fmtty[0]){ + var + fmtty_rest$0 = fmtty[1], + sub_fmtty_rest$1 = sub_fmtty[1], + match$0 = + type_ignored_format_substituti(sub_fmtty_rest$1, fmt, fmtty_rest$0), + fmt$1 = match$0[2], + sub_fmtty_rest$2 = match$0[1]; + return [0, [1, sub_fmtty_rest$2], fmt$1]; + } + break; + case 2: + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var + fmtty_rest$1 = fmtty[1], + sub_fmtty_rest$3 = sub_fmtty[1], + match$1 = + type_ignored_format_substituti(sub_fmtty_rest$3, fmt, fmtty_rest$1), + fmt$2 = match$1[2], + sub_fmtty_rest$4 = match$1[1]; + return [0, [2, sub_fmtty_rest$4], fmt$2]; + } + break; + case 3: + if(typeof fmtty !== "number" && 3 === fmtty[0]){ + var + fmtty_rest$2 = fmtty[1], + sub_fmtty_rest$5 = sub_fmtty[1], + match$2 = + type_ignored_format_substituti(sub_fmtty_rest$5, fmt, fmtty_rest$2), + fmt$3 = match$2[2], + sub_fmtty_rest$6 = match$2[1]; + return [0, [3, sub_fmtty_rest$6], fmt$3]; + } + break; + case 4: + if(typeof fmtty !== "number" && 4 === fmtty[0]){ + var + fmtty_rest$3 = fmtty[1], + sub_fmtty_rest$7 = sub_fmtty[1], + match$3 = + type_ignored_format_substituti(sub_fmtty_rest$7, fmt, fmtty_rest$3), + fmt$4 = match$3[2], + sub_fmtty_rest$8 = match$3[1]; + return [0, [4, sub_fmtty_rest$8], fmt$4]; + } + break; + case 5: + if(typeof fmtty !== "number" && 5 === fmtty[0]){ + var + fmtty_rest$4 = fmtty[1], + sub_fmtty_rest$9 = sub_fmtty[1], + match$4 = + type_ignored_format_substituti(sub_fmtty_rest$9, fmt, fmtty_rest$4), + fmt$5 = match$4[2], + sub_fmtty_rest$10 = match$4[1]; + return [0, [5, sub_fmtty_rest$10], fmt$5]; + } + break; + case 6: + if(typeof fmtty !== "number" && 6 === fmtty[0]){ + var + fmtty_rest$5 = fmtty[1], + sub_fmtty_rest$11 = sub_fmtty[1], + match$5 = + type_ignored_format_substituti + (sub_fmtty_rest$11, fmt, fmtty_rest$5), + fmt$6 = match$5[2], + sub_fmtty_rest$12 = match$5[1]; + return [0, [6, sub_fmtty_rest$12], fmt$6]; + } + break; + case 7: + if(typeof fmtty !== "number" && 7 === fmtty[0]){ + var + fmtty_rest$6 = fmtty[1], + sub_fmtty_rest$13 = sub_fmtty[1], + match$6 = + type_ignored_format_substituti + (sub_fmtty_rest$13, fmt, fmtty_rest$6), + fmt$7 = match$6[2], + sub_fmtty_rest$14 = match$6[1]; + return [0, [7, sub_fmtty_rest$14], fmt$7]; + } + break; + case 8: + if(typeof fmtty !== "number" && 8 === fmtty[0]){ + var + fmtty_rest$7 = fmtty[2], + sub2_fmtty = fmtty[1], + sub_fmtty_rest$15 = sub_fmtty[2], + sub2_fmtty$0 = sub_fmtty[1]; + if(caml_notequal([0, sub2_fmtty$0], [0, sub2_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$7 = + type_ignored_format_substituti + (sub_fmtty_rest$15, fmt, fmtty_rest$7), + fmt$8 = match$7[2], + sub_fmtty_rest$16 = match$7[1]; + return [0, [8, sub2_fmtty, sub_fmtty_rest$16], fmt$8]; + } + break; + case 9: + if(typeof fmtty !== "number" && 9 === fmtty[0]){ + var + fmtty_rest$8 = fmtty[3], + sub2_fmtty$1 = fmtty[2], + sub1_fmtty = fmtty[1], + sub_fmtty_rest$17 = sub_fmtty[3], + sub2_fmtty$2 = sub_fmtty[2], + sub1_fmtty$0 = sub_fmtty[1], + _c8_ = [0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty$0)], _c8_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var _c9_ = [0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$2)], _c9_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + sub_fmtty$0 = trans(symm(sub1_fmtty), sub2_fmtty$1), + match$8 = fmtty_rel_det(sub_fmtty$0), + f4 = match$8[4], + f2 = match$8[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + var + match$9 = + type_ignored_format_substituti + (caml_call1(CamlinternalFormatBasics[2], sub_fmtty_rest$17), + fmt, + fmtty_rest$8), + fmt$9 = match$9[2], + sub_fmtty_rest$18 = match$9[1]; + return [0, + [9, sub1_fmtty, sub2_fmtty$1, symm(sub_fmtty_rest$18)], + fmt$9]; + } + break; + case 10: + if(typeof fmtty !== "number" && 10 === fmtty[0]){ + var + fmtty_rest$9 = fmtty[1], + sub_fmtty_rest$19 = sub_fmtty[1], + match$10 = + type_ignored_format_substituti + (sub_fmtty_rest$19, fmt, fmtty_rest$9), + fmt$10 = match$10[2], + sub_fmtty_rest$20 = match$10[1]; + return [0, [10, sub_fmtty_rest$20], fmt$10]; + } + break; + case 11: + if(typeof fmtty !== "number" && 11 === fmtty[0]){ + var + fmtty_rest$10 = fmtty[1], + sub_fmtty_rest$21 = sub_fmtty[1], + match$11 = + type_ignored_format_substituti + (sub_fmtty_rest$21, fmt, fmtty_rest$10), + fmt$11 = match$11[2], + sub_fmtty_rest$22 = match$11[1]; + return [0, [11, sub_fmtty_rest$22], fmt$11]; + } + break; + case 13: + if(typeof fmtty !== "number" && 13 === fmtty[0]){ + var + fmtty_rest$11 = fmtty[1], + sub_fmtty_rest$23 = sub_fmtty[1], + match$12 = + type_ignored_format_substituti + (sub_fmtty_rest$23, fmt, fmtty_rest$11), + fmt$12 = match$12[2], + sub_fmtty_rest$24 = match$12[1]; + return [0, [13, sub_fmtty_rest$24], fmt$12]; + } + break; + case 14: + if(typeof fmtty !== "number" && 14 === fmtty[0]){ + var + fmtty_rest$12 = fmtty[1], + sub_fmtty_rest$25 = sub_fmtty[1], + match$13 = + type_ignored_format_substituti + (sub_fmtty_rest$25, fmt, fmtty_rest$12), + fmt$13 = match$13[2], + sub_fmtty_rest$26 = match$13[1]; + return [0, [14, sub_fmtty_rest$26], fmt$13]; + } + break; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function recast(fmt, fmtty){ + var _c7_ = symm(fmtty); + return type_format(fmt, caml_call1(CamlinternalFormatBasics[2], _c7_)); + } + function fix_padding(padty, width, str){ + var + len = caml_ml_string_length(str), + padty$0 = 0 <= width ? padty : 0, + width$0 = caml_call1(Stdlib[18], width); + if(width$0 <= len) return str; + var + _c6_ = 2 === padty$0 ? 48 : 32, + res = caml_call2(Stdlib_Bytes[1], width$0, _c6_); + switch(padty$0){ + case 0: + caml_call5(Stdlib_String[48], str, 0, res, 0, len); break; + case 1: + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + break; + default: + var switch$0 = 0; + if(0 < len){ + var switch$1 = 0; + if + (43 !== caml_string_get(str, 0) + && 45 !== caml_string_get(str, 0) && 32 !== caml_string_get(str, 0)){switch$0 = 1; switch$1 = 1;} + if(! switch$1){ + caml_bytes_set(res, 0, caml_string_get(str, 0)); + caml_call5 + (Stdlib_String[48], + str, + 1, + res, + (width$0 - len | 0) + 1 | 0, + len - 1 | 0); + } + } + else + switch$0 = 1; + if(switch$0){ + var switch$2 = 0; + if(1 < len && 48 === caml_string_get(str, 0)){ + var switch$3 = 0; + if(120 === caml_string_get(str, 1) || 88 === caml_string_get(str, 1)) + switch$3 = 1; + if(switch$3){ + caml_bytes_set(res, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res, + (width$0 - len | 0) + 2 | 0, + len - 2 | 0); + switch$2 = 1; + } + } + if(! switch$2) + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + } + } + return caml_call1(Stdlib_Bytes[44], res); + } + function fix_int_precision(prec, str){ + var + prec$0 = caml_call1(Stdlib[18], prec), + len = caml_ml_string_length(str), + c = caml_string_get(str, 0), + switch$0 = 0; + if(58 <= c){ + if(71 <= c){ + if(5 >= c - 97 >>> 0) switch$0 = 1; + } + else if(65 <= c) switch$0 = 1; + } + else{ + var switch$1 = 0; + if(32 === c) + switch$1 = 1; + else if(43 <= c) + switch(c - 43 | 0){ + case 5: + if(len < (prec$0 + 2 | 0) && 1 < len){ + var switch$2 = 0; + if + (120 !== caml_string_get(str, 1) && 88 !== caml_string_get(str, 1)) + switch$2 = 1; + if(! switch$2){ + var res$1 = caml_call2(Stdlib_Bytes[1], prec$0 + 2 | 0, 48); + caml_bytes_set(res$1, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res$1, + (prec$0 - len | 0) + 4 | 0, + len - 2 | 0); + return caml_call1(Stdlib_Bytes[44], res$1); + } + } + switch$0 = 1; + break; + case 0: + case 2: + switch$1 = 1; break; + case 1: + case 3: + case 4: break; + default: switch$0 = 1; + } + if(switch$1 && len < (prec$0 + 1 | 0)){ + var res$0 = caml_call2(Stdlib_Bytes[1], prec$0 + 1 | 0, 48); + caml_bytes_set(res$0, 0, c); + caml_call5 + (Stdlib_String[48], + str, + 1, + res$0, + (prec$0 - len | 0) + 2 | 0, + len - 1 | 0); + return caml_call1(Stdlib_Bytes[44], res$0); + } + } + if(switch$0 && len < prec$0){ + var res = caml_call2(Stdlib_Bytes[1], prec$0, 48); + caml_call5(Stdlib_String[48], str, 0, res, prec$0 - len | 0, len); + return caml_call1(Stdlib_Bytes[44], res); + } + return str; + } + function string_to_caml_string(str){ + var + str$0 = caml_call1(Stdlib_String[24], str), + l = caml_ml_string_length(str$0), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 34); + caml_blit_string(str$0, 0, res, 1, l); + return caml_call1(Stdlib_Bytes[44], res); + } + function format_of_fconv(fconv, prec){ + var + prec$0 = caml_call1(Stdlib[18], prec), + symb = char_of_fconv(_r_, fconv), + buf = buffer_create(16); + buffer_add_char(buf, 37); + bprint_fconv_flag(buf, fconv); + buffer_add_char(buf, 46); + buffer_add_string(buf, caml_call1(Stdlib_Int[12], prec$0)); + buffer_add_char(buf, symb); + return buffer_contents(buf); + } + function transform_int_alt(iconv, s){ + if(13 > iconv) return s; + var n = [0, 0], _c1_ = caml_ml_string_length(s) - 1 | 0, _c0_ = 0; + if(_c1_ >= 0){ + var i$0 = _c0_; + for(;;){ + if(9 >= caml_string_unsafe_get(s, i$0) - 48 >>> 0) n[1]++; + var _c5_ = i$0 + 1 | 0; + if(_c1_ !== i$0){var i$0 = _c5_; continue;} + break; + } + } + var + digits = n[1], + buf = + caml_create_bytes + (caml_ml_string_length(s) + ((digits - 1 | 0) / 3 | 0) | 0), + pos = [0, 0]; + function put(c){caml_bytes_set(buf, pos[1], c); pos[1]++; return 0;} + var + left = [0, ((digits - 1 | 0) % 3 | 0) + 1 | 0], + _c3_ = caml_ml_string_length(s) - 1 | 0, + _c2_ = 0; + if(_c3_ >= 0){ + var i = _c2_; + for(;;){ + var c = caml_string_unsafe_get(s, i); + if(9 < c - 48 >>> 0) + put(c); + else{if(0 === left[1]){put(95); left[1] = 3;} left[1] += -1; put(c);} + var _c4_ = i + 1 | 0; + if(_c3_ !== i){var i = _c4_; continue;} + break; + } + } + return caml_call1(Stdlib_Bytes[44], buf); + } + function convert_int(iconv, n){ + switch(iconv){ + case 1: + var _cZ_ = cst_d$0; break; + case 2: + var _cZ_ = cst_d$1; break; + case 4: + var _cZ_ = cst_i$1; break; + case 5: + var _cZ_ = cst_i$2; break; + case 6: + var _cZ_ = cst_x; break; + case 7: + var _cZ_ = cst_x$0; break; + case 8: + var _cZ_ = cst_X; break; + case 9: + var _cZ_ = cst_X$0; break; + case 10: + var _cZ_ = cst_o; break; + case 11: + var _cZ_ = cst_o$0; break; + case 0: + case 13: + var _cZ_ = cst_d; break; + case 3: + case 14: + var _cZ_ = cst_i$0; break; + default: var _cZ_ = cst_u; + } + return transform_int_alt(iconv, caml_format_int(_cZ_, n)); + } + function convert_int32(iconv, n){ + switch(iconv){ + case 1: + var _cY_ = cst_ld$0; break; + case 2: + var _cY_ = cst_ld$1; break; + case 4: + var _cY_ = cst_li$1; break; + case 5: + var _cY_ = cst_li$2; break; + case 6: + var _cY_ = cst_lx; break; + case 7: + var _cY_ = cst_lx$0; break; + case 8: + var _cY_ = cst_lX; break; + case 9: + var _cY_ = cst_lX$0; break; + case 10: + var _cY_ = cst_lo; break; + case 11: + var _cY_ = cst_lo$0; break; + case 0: + case 13: + var _cY_ = cst_ld; break; + case 3: + case 14: + var _cY_ = cst_li$0; break; + default: var _cY_ = cst_lu; + } + return transform_int_alt(iconv, caml_format_int(_cY_, n)); + } + function convert_nativeint(iconv, n){ + switch(iconv){ + case 1: + var _cX_ = cst_nd$0; break; + case 2: + var _cX_ = cst_nd$1; break; + case 4: + var _cX_ = cst_ni$1; break; + case 5: + var _cX_ = cst_ni$2; break; + case 6: + var _cX_ = cst_nx; break; + case 7: + var _cX_ = cst_nx$0; break; + case 8: + var _cX_ = cst_nX; break; + case 9: + var _cX_ = cst_nX$0; break; + case 10: + var _cX_ = cst_no; break; + case 11: + var _cX_ = cst_no$0; break; + case 0: + case 13: + var _cX_ = cst_nd; break; + case 3: + case 14: + var _cX_ = cst_ni$0; break; + default: var _cX_ = cst_nu; + } + return transform_int_alt(iconv, caml_format_int(_cX_, n)); + } + function convert_int64(iconv, n){ + switch(iconv){ + case 1: + var _cW_ = cst_Ld$0; break; + case 2: + var _cW_ = cst_Ld$1; break; + case 4: + var _cW_ = cst_Li$1; break; + case 5: + var _cW_ = cst_Li$2; break; + case 6: + var _cW_ = cst_Lx; break; + case 7: + var _cW_ = cst_Lx$0; break; + case 8: + var _cW_ = cst_LX; break; + case 9: + var _cW_ = cst_LX$0; break; + case 10: + var _cW_ = cst_Lo; break; + case 11: + var _cW_ = cst_Lo$0; break; + case 0: + case 13: + var _cW_ = cst_Ld; break; + case 3: + case 14: + var _cW_ = cst_Li$0; break; + default: var _cW_ = cst_Lu; + } + return transform_int_alt(iconv, runtime.caml_int64_format(_cW_, n)); + } + function convert_float(fconv, prec, x){ + function hex(param){ + switch(fconv[1]){ + case 0: + var sign = 45; break; + case 1: + var sign = 43; break; + default: var sign = 32; + } + return runtime.caml_hexstring_of_float(x, prec, sign); + } + function caml_special_val(str){ + var match = runtime.caml_classify_float(x); + return 3 === match + ? x < 0. ? cst_neg_infinity : cst_infinity + : 4 <= match ? cst_nan : str; + } + switch(fconv[2]){ + case 5: + var + str = caml_format_float(format_of_fconv(fconv, prec), x), + len = caml_ml_string_length(str), + i = 0; + for(;;){ + if(i === len) + var _cT_ = 0; + else{ + var _cS_ = caml_string_get(str, i) - 46 | 0, switch$0 = 0; + if(23 < _cS_ >>> 0){ + if(55 === _cS_) switch$0 = 1; + } + else if(21 < _cS_ - 1 >>> 0) switch$0 = 1; + if(! switch$0){var i$0 = i + 1 | 0, i = i$0; continue;} + var _cT_ = 1; + } + var _cU_ = _cT_ ? str : caml_call2(Stdlib[28], str, cst$17); + return caml_special_val(_cU_); + } + case 6: + return hex(0); + case 7: + var _cV_ = hex(0); return caml_call1(Stdlib_String[25], _cV_); + case 8: + return caml_special_val(hex(0)); + default: return caml_format_float(format_of_fconv(fconv, prec), x); + } + } + function string_of_fmtty(fmtty){ + var buf = buffer_create(16); + bprint_fmtty(buf, fmtty); + return buffer_contents(buf); + } + function make_int_padding_precision(k, acc, fmt, pad, prec, trans, iconv){ + if(typeof pad === "number"){ + if(typeof prec === "number") + return prec + ? function + (p, x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = caml_call2(trans, iconv, x); + return make_printf(k, [4, acc, str], fmt); + }; + var p = prec[1]; + return function(x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt);}; + } + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + if(typeof prec === "number") + return prec + ? function + (p, x){ + var + str = + fix_padding + (padty, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = fix_padding(padty, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$0 = prec[1]; + return function(x){ + var + str = + fix_padding + (padty, w, fix_int_precision(p$0, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + var padty$0 = pad[1]; + if(typeof prec === "number") + return prec + ? function + (w, p, x){ + var + str = + fix_padding + (padty$0, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (w, x){ + var str = fix_padding(padty$0, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$1 = prec[1]; + return function(w, x){ + var + str = + fix_padding + (padty$0, w, fix_int_precision(p$1, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + function make_padding(k, acc, fmt, pad, trans){ + if(typeof pad === "number") + return function(x){ + var new_acc = [4, acc, caml_call1(trans, x)]; + return make_printf(k, new_acc, fmt);}; + if(0 === pad[0]){ + var width = pad[2], padty = pad[1]; + return function(x){ + var new_acc = [4, acc, fix_padding(padty, width, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + var padty$0 = pad[1]; + return function(w, x){ + var new_acc = [4, acc, fix_padding(padty$0, w, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + function make_printf$0(counter, k, acc, fmt){ + var k$0 = k, acc$0 = acc, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, acc$0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest);}; + case 1: + var rest$0 = fmt$0[1]; + return function(c){ + var + str = caml_call1(Stdlib_Char[2], c), + l = caml_ml_string_length(str), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 39); + caml_blit_string(str, 0, res, 1, l); + var new_acc = [4, acc$0, caml_call1(Stdlib_Bytes[44], res)]; + return make_printf(k$0, new_acc, rest$0);}; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + return make_padding + (k$0, acc$0, rest$1, pad, function(str){return str;}); + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$2, pad$0, string_to_caml_string); + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$3, pad$1, prec, convert_int, iconv); + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$4, pad$2, prec$0, convert_int32, iconv$0); + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + return make_int_padding_precision + (k$0, + acc$0, + rest$5, + pad$3, + prec$1, + convert_nativeint, + iconv$1); + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$6, pad$4, prec$2, convert_int64, iconv$2); + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + if(typeof pad$5 === "number"){ + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x); + return make_printf(k$0, [4, acc$0, str], rest$7); + }; + var p = prec$3[1]; + return function(x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + if(0 === pad$5[0]){ + var w = pad$5[2], padty = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = fix_padding(padty, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$0 = prec$3[1]; + return function(x){ + var str = fix_padding(padty, w, convert_float(fconv, p$0, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + var padty$0 = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (w, p, x){ + var + str = fix_padding(padty$0, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (w, x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty$0, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$1 = prec$3[1]; + return function(w, x){ + var str = fix_padding(padty$0, w, convert_float(fconv, p$1, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$8, pad$6, Stdlib[30]); + case 10: + var + rest$9 = fmt$0[1], + acc$1 = [7, acc$0], + acc$0 = acc$1, + fmt$0 = rest$9; + continue; + case 11: + var + rest$10 = fmt$0[2], + str = fmt$0[1], + acc$2 = [2, acc$0, str], + acc$0 = acc$2, + fmt$0 = rest$10; + continue; + case 12: + var + rest$11 = fmt$0[2], + chr = fmt$0[1], + acc$3 = [3, acc$0, chr], + acc$0 = acc$3, + fmt$0 = rest$11; + continue; + case 13: + var + rest$12 = fmt$0[3], + sub_fmtty = fmt$0[2], + ty = string_of_fmtty(sub_fmtty); + return function(str){ + return make_printf(k$0, [4, acc$0, ty], rest$12);}; + case 14: + var rest$13 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _cR_ = recast(fmt, fmtty); + return make_printf + (k$0, + acc$0, + caml_call2(CamlinternalFormatBasics[3], _cR_, rest$13));}; + case 15: + var rest$14 = fmt$0[1]; + return function(f, x){ + return make_printf + (k$0, + [6, acc$0, function(o){return caml_call2(f, o, x);}], + rest$14);}; + case 16: + var rest$15 = fmt$0[1]; + return function(f){return make_printf(k$0, [6, acc$0, f], rest$15);}; + case 17: + var + rest$16 = fmt$0[2], + fmting_lit = fmt$0[1], + acc$4 = [0, acc$0, fmting_lit], + acc$0 = acc$4, + fmt$0 = rest$16; + continue; + case 18: + var _cP_ = fmt$0[1]; + if(0 === _cP_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _cP_[1][1], + k$3 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [0, kacc]], rest); + } + return k$0; + }, + k$1 = k$3(acc$0, k$0, rest$17), + k$0 = k$1, + acc$0 = 0, + fmt$0 = fmt$1; + continue; + } + var + rest$18 = fmt$0[2], + fmt$2 = _cP_[1][1], + k$4 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [1, kacc]], rest); + } + return k$0; + }, + k$2 = k$4(acc$0, k$0, rest$18), + k$0 = k$2, + acc$0 = 0, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + case 20: + var + rest$19 = fmt$0[3], + new_acc = [8, acc$0, cst_Printf_bad_conversion]; + return function(param){return make_printf(k$0, new_acc, rest$19);}; + case 21: + var rest$20 = fmt$0[2]; + return function(n){ + var new_acc = [4, acc$0, caml_format_int(cst_u$0, n)]; + return make_printf(k$0, new_acc, rest$20);}; + case 22: + var rest$21 = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest$21);}; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (make_ignored_param$0, [0, k$0, acc$0, ign, rest$22]); + var counter$1 = counter + 1 | 0; + return make_ignored_param$0(counter$1, k$0, acc$0, ign, rest$22); + default: + var + rest$23 = fmt$0[3], + f = fmt$0[2], + arity = fmt$0[1], + _cQ_ = caml_call1(f, 0); + if(counter >= 50) + return caml_trampoline_return + (make_custom$0, [0, k$0, acc$0, rest$23, arity, _cQ_]); + var counter$0 = counter + 1 | 0; + return make_custom$0(counter$0, k$0, acc$0, rest$23, arity, _cQ_); + } + } + } + function make_ignored_param$0(counter, k, acc, ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$1 = counter + 1 | 0; + return make_invalid_arg(counter$1, k, acc, fmt); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$2 = counter + 1 | 0; + return make_invalid_arg(counter$2, k, acc, fmt); + } + switch(ign[0]){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$3 = counter + 1 | 0; + return make_invalid_arg(counter$3, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$4 = counter + 1 | 0; + return make_invalid_arg(counter$4, k, acc, fmt); + case 2: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$5 = counter + 1 | 0; + return make_invalid_arg(counter$5, k, acc, fmt); + case 3: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$6 = counter + 1 | 0; + return make_invalid_arg(counter$6, k, acc, fmt); + case 4: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$7 = counter + 1 | 0; + return make_invalid_arg(counter$7, k, acc, fmt); + case 5: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$8 = counter + 1 | 0; + return make_invalid_arg(counter$8, k, acc, fmt); + case 6: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$9 = counter + 1 | 0; + return make_invalid_arg(counter$9, k, acc, fmt); + case 7: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$10 = counter + 1 | 0; + return make_invalid_arg(counter$10, k, acc, fmt); + case 8: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$11 = counter + 1 | 0; + return make_invalid_arg(counter$11, k, acc, fmt); + case 9: + var fmtty = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (make_from_fmtty$0, [0, k, acc, fmtty, fmt]); + var counter$14 = counter + 1 | 0; + return make_from_fmtty$0(counter$14, k, acc, fmtty, fmt); + case 10: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$12 = counter + 1 | 0; + return make_invalid_arg(counter$12, k, acc, fmt); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$13 = counter + 1 | 0; + return make_invalid_arg(counter$13, k, acc, fmt); + } + } + function make_from_fmtty$0(counter, k, acc, fmtty, fmt){ + if(typeof fmtty !== "number") + switch(fmtty[0]){ + case 0: + var rest = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest, fmt);}; + case 1: + var rest$0 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$0, fmt);}; + case 2: + var rest$1 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$1, fmt);}; + case 3: + var rest$2 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$2, fmt);}; + case 4: + var rest$3 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$3, fmt);}; + case 5: + var rest$4 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$4, fmt);}; + case 6: + var rest$5 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$5, fmt);}; + case 7: + var rest$6 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$6, fmt);}; + case 8: + var rest$7 = fmtty[2]; + return function(param){return make_from_fmtty(k, acc, rest$7, fmt);}; + case 9: + var + rest$8 = fmtty[3], + ty2 = fmtty[2], + ty1 = fmtty[1], + ty = trans(symm(ty1), ty2); + return function(param){ + return make_from_fmtty + (k, + acc, + caml_call2(CamlinternalFormatBasics[1], ty, rest$8), + fmt);}; + case 10: + var rest$9 = fmtty[1]; + return function(param, _cO_){ + return make_from_fmtty(k, acc, rest$9, fmt);}; + case 11: + var rest$10 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$10, fmt);}; + case 12: + var rest$11 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$11, fmt);}; + case 13: + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + } + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + } + function make_invalid_arg(counter, k, acc, fmt){ + var _cN_ = [8, acc, cst_Printf_bad_conversion$0]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cN_, fmt]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cN_, fmt); + } + function make_custom$0(counter, k, acc, rest, arity, f){ + if(arity){ + var arity$0 = arity[1]; + return function(x){ + return make_custom(k, acc, rest, arity$0, caml_call1(f, x));}; + } + var _cM_ = [4, acc, f]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cM_, rest]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cM_, rest); + } + function make_printf(k, acc, fmt){ + return caml_trampoline(make_printf$0(0, k, acc, fmt)); + } + function make_ignored_param(k, acc, ign, fmt){ + return caml_trampoline(make_ignored_param$0(0, k, acc, ign, fmt)); + } + function make_from_fmtty(k, acc, fmtty, fmt){ + return caml_trampoline(make_from_fmtty$0(0, k, acc, fmtty, fmt)); + } + function make_custom(k, acc, rest, arity, f){ + return caml_trampoline(make_custom$0(0, k, acc, rest, arity, f)); + } + function fn_of_padding_precision(k, o, fmt, pad, prec){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var _cl_ = make_iprintf(k, o, fmt); + return function(_cL_){return _cl_;}; + } + if(prec){ + var _ci_ = make_iprintf(k, o, fmt), _cj_ = function(_cK_){return _ci_;}; + return function(_cJ_){return _cj_;}; + } + var _ck_ = make_iprintf(k, o, fmt); + return function(_cI_){return _ck_;}; + } + if(0 === pad[0]){ + if(typeof prec !== "number"){ + var _cp_ = make_iprintf(k, o, fmt); + return function(_cH_){return _cp_;}; + } + if(prec){ + var _cm_ = make_iprintf(k, o, fmt), _cn_ = function(_cG_){return _cm_;}; + return function(_cF_){return _cn_;}; + } + var _co_ = make_iprintf(k, o, fmt); + return function(_cE_){return _co_;}; + } + if(typeof prec !== "number"){ + var _cv_ = make_iprintf(k, o, fmt), _cw_ = function(_cD_){return _cv_;}; + return function(_cC_){return _cw_;}; + } + if(prec){ + var + _cq_ = make_iprintf(k, o, fmt), + _cr_ = function(_cB_){return _cq_;}, + _cs_ = function(_cA_){return _cr_;}; + return function(_cz_){return _cs_;}; + } + var _ct_ = make_iprintf(k, o, fmt); + function _cu_(_cy_){return _ct_;} + return function(_cx_){return _cu_;}; + } + function make_iprintf$0(counter, k, o, fmt){ + var k$0 = k, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, o); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], _by_ = make_iprintf(k$0, o, rest); + return function(_ch_){return _by_;}; + case 1: + var rest$0 = fmt$0[1], _bz_ = make_iprintf(k$0, o, rest$0); + return function(_cg_){return _bz_;}; + case 2: + var _bA_ = fmt$0[1]; + if(typeof _bA_ === "number"){ + var rest$1 = fmt$0[2], _bB_ = make_iprintf(k$0, o, rest$1); + return function(_cf_){return _bB_;}; + } + if(0 === _bA_[0]){ + var rest$2 = fmt$0[2], _bC_ = make_iprintf(k$0, o, rest$2); + return function(_ce_){return _bC_;}; + } + var + rest$3 = fmt$0[2], + _bD_ = make_iprintf(k$0, o, rest$3), + _bE_ = function(_cd_){return _bD_;}; + return function(_cc_){return _bE_;}; + case 3: + var _bF_ = fmt$0[1]; + if(typeof _bF_ === "number"){ + var rest$4 = fmt$0[2], _bG_ = make_iprintf(k$0, o, rest$4); + return function(_cb_){return _bG_;}; + } + if(0 === _bF_[0]){ + var rest$5 = fmt$0[2], _bH_ = make_iprintf(k$0, o, rest$5); + return function(_ca_){return _bH_;}; + } + var + rest$6 = fmt$0[2], + _bI_ = make_iprintf(k$0, o, rest$6), + _bJ_ = function(_b$_){return _bI_;}; + return function(_b__){return _bJ_;}; + case 4: + var rest$7 = fmt$0[4], prec = fmt$0[3], pad = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$7, pad, prec); + case 5: + var rest$8 = fmt$0[4], prec$0 = fmt$0[3], pad$0 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$8, pad$0, prec$0); + case 6: + var rest$9 = fmt$0[4], prec$1 = fmt$0[3], pad$1 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$9, pad$1, prec$1); + case 7: + var rest$10 = fmt$0[4], prec$2 = fmt$0[3], pad$2 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$10, pad$2, prec$2); + case 8: + var rest$11 = fmt$0[4], prec$3 = fmt$0[3], pad$3 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$11, pad$3, prec$3); + case 9: + var _bK_ = fmt$0[1]; + if(typeof _bK_ === "number"){ + var rest$12 = fmt$0[2], _bL_ = make_iprintf(k$0, o, rest$12); + return function(_b9_){return _bL_;}; + } + if(0 === _bK_[0]){ + var rest$13 = fmt$0[2], _bM_ = make_iprintf(k$0, o, rest$13); + return function(_b8_){return _bM_;}; + } + var + rest$14 = fmt$0[2], + _bN_ = make_iprintf(k$0, o, rest$14), + _bO_ = function(_b7_){return _bN_;}; + return function(_b6_){return _bO_;}; + case 10: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 11: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 12: + var rest$17 = fmt$0[2], fmt$0 = rest$17; continue; + case 13: + var rest$18 = fmt$0[3], _bP_ = make_iprintf(k$0, o, rest$18); + return function(_b5_){return _bP_;}; + case 14: + var rest$19 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _b4_ = recast(fmt, fmtty); + return make_iprintf + (k$0, + o, + caml_call2(CamlinternalFormatBasics[3], _b4_, rest$19));}; + case 15: + var + rest$20 = fmt$0[1], + _bQ_ = make_iprintf(k$0, o, rest$20), + _bR_ = function(_b3_){return _bQ_;}; + return function(_b2_){return _bR_;}; + case 16: + var rest$21 = fmt$0[1], _bS_ = make_iprintf(k$0, o, rest$21); + return function(_b1_){return _bS_;}; + case 17: + var rest$22 = fmt$0[2], fmt$0 = rest$22; continue; + case 18: + var _bT_ = fmt$0[1]; + if(0 === _bT_[0]){ + var + rest$23 = fmt$0[2], + fmt$1 = _bT_[1][1], + k$3 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$1 = k$3(k$0, rest$23), + k$0 = k$1, + fmt$0 = fmt$1; + continue; + } + var + rest$24 = fmt$0[2], + fmt$2 = _bT_[1][1], + k$4 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$2 = k$4(k$0, rest$24), + k$0 = k$2, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + case 20: + var rest$25 = fmt$0[3], _bU_ = make_iprintf(k$0, o, rest$25); + return function(_b0_){return _bU_;}; + case 21: + var rest$26 = fmt$0[2], _bV_ = make_iprintf(k$0, o, rest$26); + return function(_bZ_){return _bV_;}; + case 22: + var rest$27 = fmt$0[1], _bW_ = make_iprintf(k$0, o, rest$27); + return function(_bY_){return _bW_;}; + case 23: + var rest$28 = fmt$0[2], ign = fmt$0[1], _bX_ = 0; + return make_ignored_param + (function(param){return caml_call1(k$0, o);}, + _bX_, + ign, + rest$28); + default: + var rest$29 = fmt$0[3], arity = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (fn_of_custom_arity$0, [0, k$0, o, rest$29, arity]); + var counter$0 = counter + 1 | 0; + return fn_of_custom_arity$0(counter$0, k$0, o, rest$29, arity); + } + } + } + function fn_of_custom_arity$0(counter, k, o, fmt, param){ + if(param){ + var arity = param[1], _bw_ = fn_of_custom_arity(k, o, fmt, arity); + return function(_bx_){return _bw_;}; + } + if(counter >= 50) + return caml_trampoline_return(make_iprintf$0, [0, k, o, fmt]); + var counter$0 = counter + 1 | 0; + return make_iprintf$0(counter$0, k, o, fmt); + } + function make_iprintf(k, o, fmt){ + return caml_trampoline(make_iprintf$0(0, k, o, fmt)); + } + function fn_of_custom_arity(k, o, fmt, param){ + return caml_trampoline(fn_of_custom_arity$0(0, k, o, fmt, param)); + } + function output_acc(o, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + output_acc(o, p); + return caml_call2(Stdlib[66], o, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$18); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$19); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + output_acc(o, p$3); + return caml_call1(f, o); + case 7: + var p$4 = acc$0[1]; + output_acc(o, p$4); + return caml_call1(Stdlib[63], o); + case 8: + var msg = acc$0[2], p$5 = acc$0[1]; + output_acc(o, p$5); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + output_acc(o, p$1); + return caml_call2(Stdlib[66], o, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + output_acc(o, p$2); + return caml_call2(Stdlib[65], o, c); + } + } + } + function bufput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + bufput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$20); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$21); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + bufput_acc(b, p$3); + return caml_call1(f, b); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + bufput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + bufput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + bufput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function strput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + strput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$22); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$23); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + strput_acc(b, p$3); + var _bv_ = caml_call1(f, 0); + return caml_call2(Stdlib_Buffer[16], b, _bv_); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + strput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + strput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + strput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function failwith_message(param){ + var fmt = param[1], buf = caml_call1(Stdlib_Buffer[1], 256); + function k(acc){ + strput_acc(buf, acc); + var _bu_ = caml_call1(Stdlib_Buffer[2], buf); + return caml_call1(Stdlib[2], _bu_); + } + return make_printf(k, 0, fmt); + } + function open_box_of_string(str){ + if(runtime.caml_string_equal(str, cst$43)) return _x_; + var len = caml_ml_string_length(str); + function invalid_box(param){ + return caml_call1(failwith_message(_y_), str); + } + function parse_spaces(i){ + var i$0 = i; + for(;;){ + if(i$0 === len) return i$0; + var match = caml_string_get(str, i$0); + if(9 !== match && 32 !== match) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + var wstart = parse_spaces(0), wend = wstart; + for(;;){ + if(wend !== len && 25 >= caml_string_get(str, wend) - 97 >>> 0){var j = wend + 1 | 0, wend = j; continue;} + var + box_name = caml_call3(Stdlib_String[15], str, wstart, wend - wstart | 0), + nstart = parse_spaces(wend), + nend = nstart; + for(;;){ + if(nend !== len){ + var match = caml_string_get(str, nend), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(switch$0){var j$0 = nend + 1 | 0, nend = j$0; continue;} + } + if(nstart === nend) + var indent = 0; + else + try{ + var + _bs_ = + runtime.caml_int_of_string + (caml_call3(Stdlib_String[15], str, nstart, nend - nstart | 0)), + indent = _bs_; + } + catch(_bt_){ + var _br_ = caml_wrap_exception(_bt_); + if(_br_[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(_br_, 0); + var indent = invalid_box(0); + } + var exp_end = parse_spaces(nend); + if(exp_end !== len) invalid_box(0); + var switch$1 = 0; + if + (caml_string_notequal(box_name, cst$43) + && caml_string_notequal(box_name, "b")) + var + box_type = + caml_string_notequal(box_name, "h") + ? caml_string_notequal + (box_name, "hov") + ? caml_string_notequal + (box_name, "hv") + ? caml_string_notequal(box_name, "v") ? invalid_box(0) : 1 + : 2 + : 3 + : 0; + else + switch$1 = 1; + if(switch$1) var box_type = 4; + return [0, indent, box_type]; + } + } + } + function make_padding_fmt_ebb(pad, fmt){ + if(typeof pad === "number") return [0, 0, fmt]; + if(0 === pad[0]){var w = pad[2], s = pad[1]; return [0, [0, s, w], fmt];} + var s$0 = pad[1]; + return [0, [1, s$0], fmt]; + } + function make_padprec_fmt_ebb(pad, prec, fmt){ + if(typeof prec === "number") + var match = prec ? [0, 1, fmt] : [0, 0, fmt]; + else + var p = prec[1], match = [0, [0, p], fmt]; + var prec$0 = match[1]; + if(typeof pad === "number") return [0, 0, prec$0, fmt]; + if(0 === pad[0]){ + var w = pad[2], s = pad[1]; + return [0, [0, s, w], prec$0, fmt]; + } + var s$0 = pad[1]; + return [0, [1, s$0], prec$0, fmt]; + } + function fmt_ebb_of_string(legacy_behavior, str){ + if(legacy_behavior) + var flag = legacy_behavior[1], legacy_behavior$0 = flag; + else + var legacy_behavior$0 = 1; + function invalid_format_message(str_ind, msg){ + return caml_call3(failwith_message(_z_), str, str_ind, msg); + } + function unexpected_end_of_format(end_ind){ + return invalid_format_message(end_ind, cst_unexpected_end_of_format); + } + function invalid_format_without(str_ind, c, s){ + return caml_call4(failwith_message(_A_), str, str_ind, c, s); + } + function expected_character(str_ind, expected, read){ + return caml_call4(failwith_message(_B_), str, str_ind, expected, read); + } + function add_literal(lit_start, str_ind, fmt){ + var size = str_ind - lit_start | 0; + return 0 === size + ? [0, fmt] + : 1 + === size + ? [0, [12, caml_string_get(str, lit_start), fmt]] + : [0, + [11, + caml_call3(Stdlib_String[15], str, lit_start, size), + fmt]]; + } + function parse(lit_start, end_ind){ + var str_ind = lit_start; + for(;;){ + if(str_ind === end_ind) return add_literal(lit_start, str_ind, 0); + var match = caml_string_get(str, str_ind); + if(37 === match){ + var str_ind$2 = str_ind + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var + match$1 = + 95 === caml_string_get(str, str_ind$2) + ? parse_flags(str_ind, str_ind$2 + 1 | 0, end_ind, 1) + : parse_flags(str_ind, str_ind$2, end_ind, 0), + fmt_rest = match$1[1]; + return add_literal(lit_start, str_ind, fmt_rest); + } + if(64 !== match){ + var str_ind$1 = str_ind + 1 | 0, str_ind = str_ind$1; + continue; + } + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) + var match$0 = _N_; + else{ + var c = caml_string_get(str, str_ind$0), switch$0 = 0; + if(65 <= c) + if(94 <= c){ + var switcher = c - 123 | 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var match$0 = parse_tag(1, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$2 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 1, fmt_rest$2]]; + } + } + else if(91 <= c) + switch(c - 91 | 0){ + case 0: + var match$0 = parse_tag(0, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$3 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 0, fmt_rest$3]]; + } + else + switch$0 = 1; + else if(10 === c) + var + fmt_rest$4 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 3, fmt_rest$4]]; + else if(32 <= c) + switch(c - 32 | 0){ + case 0: + var + fmt_rest$5 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _O_, fmt_rest$5]]; + break; + case 5: + var switch$1 = 0; + if + ((str_ind$0 + 1 | 0) < end_ind + && 37 === caml_string_get(str, str_ind$0 + 1 | 0)) + var + fmt_rest$6 = parse(str_ind$0 + 2 | 0, end_ind)[1], + match$0 = [0, [17, 6, fmt_rest$6]]; + else + switch$1 = 1; + if(switch$1) + var + fmt_rest$7 = parse(str_ind$0, end_ind)[1], + match$0 = [0, [12, 64, fmt_rest$7]]; + break; + case 12: + var + fmt_rest$8 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _P_, fmt_rest$8]]; + break; + case 14: + var + fmt_rest$9 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 4, fmt_rest$9]]; + break; + case 27: + var str_ind$3 = str_ind$0 + 1 | 0; + try{ + var + _bg_ = str_ind$3 === end_ind ? 1 : 0, + _bh_ = _bg_ || (60 !== caml_string_get(str, str_ind$3) ? 1 : 0); + if(_bh_) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + str_ind_1 = parse_spaces(str_ind$3 + 1 | 0, end_ind), + match$2 = caml_string_get(str, str_ind_1), + switch$2 = 0; + if(48 <= match$2){ + if(58 > match$2) switch$2 = 1; + } + else if(45 === match$2) switch$2 = 1; + if(! switch$2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + match$3 = parse_integer(str_ind_1, end_ind), + width = match$3[2], + str_ind_2 = match$3[1], + str_ind_3 = parse_spaces(str_ind_2, end_ind), + switcher$0 = caml_string_get(str, str_ind_3) - 45 | 0, + switch$3 = 0; + if(12 < switcher$0 >>> 0) + if(17 === switcher$0) + var + s = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_3 - str_ind$3 | 0) + 3 | 0), + _bi_ = [0, s, width, 0], + _bj_ = str_ind_3 + 1 | 0, + formatting_lit$0 = _bi_, + next_ind = _bj_; + else + switch$3 = 1; + else if(1 < switcher$0 - 1 >>> 0){ + var + match$4 = parse_integer(str_ind_3, end_ind), + offset = match$4[2], + str_ind_4 = match$4[1], + str_ind_5 = parse_spaces(str_ind_4, end_ind); + if(62 !== caml_string_get(str, str_ind_5)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$0 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_5 - str_ind$3 | 0) + 3 | 0), + _bk_ = [0, s$0, width, offset], + _bl_ = str_ind_5 + 1 | 0, + formatting_lit$0 = _bk_, + next_ind = _bl_; + } + else + switch$3 = 1; + if(switch$3) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + } + catch(_bq_){ + var _bf_ = caml_wrap_exception(_bq_); + if(_bf_ !== Stdlib[8] && _bf_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bf_, 0); + var formatting_lit$0 = formatting_lit, next_ind = str_ind$3; + } + var + fmt_rest$12 = parse(next_ind, end_ind)[1], + match$0 = [0, [17, formatting_lit$0, fmt_rest$12]]; + break; + case 28: + var str_ind$4 = str_ind$0 + 1 | 0; + try{ + var + str_ind_1$0 = parse_spaces(str_ind$4, end_ind), + match$6 = caml_string_get(str, str_ind_1$0), + switch$4 = 0; + if(48 <= match$6){ + if(58 > match$6) switch$4 = 1; + } + else if(45 === match$6) switch$4 = 1; + if(switch$4){ + var + match$7 = parse_integer(str_ind_1$0, end_ind), + size = match$7[2], + str_ind_2$0 = match$7[1], + str_ind_3$0 = parse_spaces(str_ind_2$0, end_ind); + if(62 !== caml_string_get(str, str_ind_3$0)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$1 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$4 - 2 | 0, + (str_ind_3$0 - str_ind$4 | 0) + 3 | 0), + _bo_ = [0, [0, str_ind_3$0 + 1 | 0, [1, s$1, size]]]; + } + else + var _bo_ = 0; + var _bn_ = _bo_; + } + catch(_bp_){ + var _bm_ = caml_wrap_exception(_bp_); + if(_bm_ !== Stdlib[8] && _bm_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bm_, 0); + var _bn_ = 0; + } + if(_bn_) + var + match$5 = _bn_[1], + formatting_lit$1 = match$5[2], + next_ind$0 = match$5[1], + fmt_rest$13 = parse(next_ind$0, end_ind)[1], + _be_ = [0, [17, formatting_lit$1, fmt_rest$13]]; + else + var + fmt_rest$14 = parse(str_ind$4, end_ind)[1], + _be_ = [0, [17, _Q_, fmt_rest$14]]; + var match$0 = _be_; + break; + case 31: + var + fmt_rest$10 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 2, fmt_rest$10]]; + break; + case 32: + var + fmt_rest$11 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 5, fmt_rest$11]]; + break; + default: switch$0 = 1; + } + else + switch$0 = 1; + if(switch$0) + var + fmt_rest$1 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, [2, c], fmt_rest$1]]; + } + var fmt_rest$0 = match$0[1]; + return add_literal(lit_start, str_ind, fmt_rest$0); + } + } + function parse_conversion + (pct_ind, + str_ind, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + symb){ + var + plus_used = [0, 0], + hash_used = [0, 0], + space_used = [0, 0], + ign_used = [0, 0], + pad_used = [0, 0], + prec_used = [0, 0]; + function get_plus(param){plus_used[1] = 1; return plus;} + function get_hash(param){hash_used[1] = 1; return hash;} + function get_space(param){space_used[1] = 1; return space;} + function get_ign(param){ign_used[1] = 1; return ign;} + function get_pad(param){pad_used[1] = 1; return pad;} + function get_prec(param){prec_used[1] = 1; return prec;} + function get_padprec(param){pad_used[1] = 1; return padprec;} + function get_int_pad(param){ + var pad = get_pad(0), match = get_prec(0); + if(typeof match === "number" && ! match) return pad; + if(typeof pad === "number") return 0; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _H_ + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$1) + : pad; + if(2 > pad[1]) return pad; + var n = pad[2]; + return legacy_behavior$0 + ? [0, 1, n] + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$0); + } + function check_no_0(symb, pad){ + if(typeof pad === "number") return pad; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _I_ + : incompatible_flag(pct_ind, str_ind, symb, cst_0$1) + : pad; + if(2 > pad[1]) return pad; + var width = pad[2]; + return legacy_behavior$0 + ? [0, 1, width] + : incompatible_flag(pct_ind, str_ind, symb, cst_0$0); + } + function opt_of_pad(c, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]) + switch(pad[1]){ + case 0: + var width = pad[2]; + return legacy_behavior$0 + ? [0, width] + : incompatible_flag(pct_ind, str_ind, c, cst$24); + case 1: + var width$0 = pad[2]; return [0, width$0]; + default: + var width$1 = pad[2]; + return legacy_behavior$0 + ? [0, width$1] + : incompatible_flag(pct_ind, str_ind, c, cst_0$2); + } + return incompatible_flag(pct_ind, str_ind, c, cst$25); + } + function get_pad_opt(c){return opt_of_pad(c, get_pad(0));} + function get_padprec_opt(c){return opt_of_pad(c, get_padprec(0));} + var switch$0 = 0; + if(124 <= symb) + switch$0 = 1; + else + switch(symb){ + case 33: + var + fmt_rest$5 = parse(str_ind, end_ind)[1], + fmt_result = [0, [10, fmt_rest$5]]; + break; + case 40: + var + sub_end = search_subformat_end(str_ind, end_ind, 41), + fmt_rest$7 = parse(sub_end + 2 | 0, end_ind)[1], + sub_fmt = parse(str_ind, sub_end)[1], + sub_fmtty = fmtty_of_fmt(sub_fmt); + if(get_ign(0)) + var + ignored$2 = [9, get_pad_opt(95), sub_fmtty], + _aN_ = [0, [23, ignored$2, fmt_rest$7]]; + else + var _aN_ = [0, [14, get_pad_opt(40), sub_fmtty, fmt_rest$7]]; + var fmt_result = _aN_; + break; + case 44: + var fmt_result = parse(str_ind, end_ind); break; + case 67: + var + fmt_rest$10 = parse(str_ind, end_ind)[1], + _aP_ = + get_ign(0) ? [0, [23, 1, fmt_rest$10]] : [0, [1, fmt_rest$10]], + fmt_result = _aP_; + break; + case 78: + var fmt_rest$14 = parse(str_ind, end_ind)[1], counter$0 = 2; + if(get_ign(0)) + var + ignored$6 = [11, counter$0], + _aV_ = [0, [23, ignored$6, fmt_rest$14]]; + else + var _aV_ = [0, [21, counter$0, fmt_rest$14]]; + var fmt_result = _aV_; + break; + case 83: + var + pad$6 = check_no_0(symb, get_padprec(0)), + fmt_rest$15 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$7 = [1, get_padprec_opt(95)], + _aW_ = [0, [23, ignored$7, fmt_rest$15]]; + else + var + match$5 = make_padding_fmt_ebb(pad$6, fmt_rest$15), + fmt_rest$16 = match$5[2], + pad$7 = match$5[1], + _aW_ = [0, [3, pad$7, fmt_rest$16]]; + var fmt_result = _aW_; + break; + case 91: + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var + char_set = create_char_set(0), + add_char = function(c){return add_in_char_set(char_set, c);}, + add_range = + function(c$0, c){ + if(c >= c$0){ + var i = c$0; + for(;;){ + add_in_char_set(char_set, caml_call1(Stdlib[29], i)); + var _bd_ = i + 1 | 0; + if(c !== i){var i = _bd_; continue;} + break; + } + } + return 0; + }, + fail_single_percent = + function(str_ind){ + return caml_call2(failwith_message(_R_), str, str_ind); + }, + parse_char_set_content = + function(counter, str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(45 === c){ + add_char(45); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + } + if(93 === c) return str_ind$0 + 1 | 0; + var _bc_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_after_char$0, [0, _bc_, end_ind, c]); + var counter$0 = counter + 1 | 0; + return parse_char_set_after_char$0(counter$0, _bc_, end_ind, c); + } + }, + parse_char_set_after_char$0 = + function(counter, str_ind, end_ind, c){ + var str_ind$0 = str_ind, c$0 = c; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c$1 = caml_string_get(str, str_ind$0), switch$0 = 0; + if(46 <= c$1){ + if(64 === c$1) + switch$0 = 1; + else if(93 === c$1){add_char(c$0); return str_ind$0 + 1 | 0;} + } + else if(37 === c$1) + switch$0 = 1; + else if(45 <= c$1){ + var str_ind$2 = str_ind$0 + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var c$2 = caml_string_get(str, str_ind$2); + if(37 === c$2){ + if((str_ind$2 + 1 | 0) === end_ind) + unexpected_end_of_format(end_ind); + var c$3 = caml_string_get(str, str_ind$2 + 1 | 0); + if(37 !== c$3 && 64 !== c$3) + return fail_single_percent(str_ind$2); + add_range(c$0, c$3); + var _ba_ = str_ind$2 + 2 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _ba_, end_ind]); + var counter$2 = counter + 1 | 0; + return parse_char_set_content(counter$2, _ba_, end_ind); + } + if(93 === c$2){ + add_char(c$0); + add_char(45); + return str_ind$2 + 1 | 0; + } + add_range(c$0, c$2); + var _bb_ = str_ind$2 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _bb_, end_ind]); + var counter$1 = counter + 1 | 0; + return parse_char_set_content(counter$1, _bb_, end_ind); + } + if(switch$0 && 37 === c$0){ + add_char(c$1); + var _a$_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _a$_, end_ind]); + var counter$0 = counter + 1 | 0; + return parse_char_set_content(counter$0, _a$_, end_ind); + } + if(37 === c$0) fail_single_percent(str_ind$0); + add_char(c$0); + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + c$0 = c$1; + } + }, + parse_char_set_after_char = + function(str_ind, end_ind, c){ + return caml_trampoline + (parse_char_set_after_char$0(0, str_ind, end_ind, c)); + }; + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + if(94 === caml_string_get(str, str_ind)) + var str_ind$0 = str_ind + 1 | 0, reverse = 1, str_ind$1 = str_ind$0; + else + var reverse = 0, str_ind$1 = str_ind; + if(str_ind$1 === end_ind) unexpected_end_of_format(end_ind); + var + c = caml_string_get(str, str_ind$1), + next_ind = parse_char_set_after_char(str_ind$1 + 1 | 0, end_ind, c), + char_set$0 = freeze_char_set(char_set), + char_set$1 = reverse ? rev_char_set(char_set$0) : char_set$0, + fmt_rest$19 = parse(next_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$9 = [10, get_pad_opt(95), char_set$1], + _a1_ = [0, [23, ignored$9, fmt_rest$19]]; + else + var _a1_ = [0, [20, get_pad_opt(91), char_set$1, fmt_rest$19]]; + var fmt_result = _a1_; + break; + case 97: + var + fmt_rest$20 = parse(str_ind, end_ind)[1], + fmt_result = [0, [15, fmt_rest$20]]; + break; + case 99: + var + char_format = + function(fmt_rest){ + return get_ign(0) ? [0, [23, 0, fmt_rest]] : [0, [0, fmt_rest]]; + }, + fmt_rest$21 = parse(str_ind, end_ind)[1], + match$7 = get_pad_opt(99); + if(match$7){ + if(0 === match$7[1]) + var + _a2_ = + get_ign(0) ? [0, [23, 3, fmt_rest$21]] : [0, [22, fmt_rest$21]], + _a3_ = _a2_; + else + var + _a3_ = + legacy_behavior$0 + ? char_format(fmt_rest$21) + : invalid_format_message + (str_ind, cst_non_zero_widths_are_unsupp); + var _a4_ = _a3_; + } + else + var _a4_ = char_format(fmt_rest$21); + var fmt_result = _a4_; + break; + case 114: + var + fmt_rest$22 = parse(str_ind, end_ind)[1], + _a5_ = + get_ign(0) ? [0, [23, 2, fmt_rest$22]] : [0, [19, fmt_rest$22]], + fmt_result = _a5_; + break; + case 115: + var + pad$9 = check_no_0(symb, get_padprec(0)), + fmt_rest$23 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$10 = [0, get_padprec_opt(95)], + _a6_ = [0, [23, ignored$10, fmt_rest$23]]; + else + var + match$8 = make_padding_fmt_ebb(pad$9, fmt_rest$23), + fmt_rest$24 = match$8[2], + pad$10 = match$8[1], + _a6_ = [0, [2, pad$10, fmt_rest$24]]; + var fmt_result = _a6_; + break; + case 116: + var + fmt_rest$25 = parse(str_ind, end_ind)[1], + fmt_result = [0, [16, fmt_rest$25]]; + break; + case 123: + var + sub_end$0 = search_subformat_end(str_ind, end_ind, 125), + sub_fmt$0 = parse(str_ind, sub_end$0)[1], + fmt_rest$26 = parse(sub_end$0 + 2 | 0, end_ind)[1], + sub_fmtty$0 = fmtty_of_fmt(sub_fmt$0); + if(get_ign(0)) + var + ignored$11 = [8, get_pad_opt(95), sub_fmtty$0], + _a7_ = [0, [23, ignored$11, fmt_rest$26]]; + else + var _a7_ = [0, [13, get_pad_opt(123), sub_fmtty$0, fmt_rest$26]]; + var fmt_result = _a7_; + break; + case 66: + case 98: + var + pad$3 = check_no_0(symb, get_padprec(0)), + fmt_rest$8 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$3 = [7, get_padprec_opt(95)], + _aO_ = [0, [23, ignored$3, fmt_rest$8]]; + else + var + match$3 = make_padding_fmt_ebb(pad$3, fmt_rest$8), + fmt_rest$9 = match$3[2], + pad$4 = match$3[1], + _aO_ = [0, [9, pad$4, fmt_rest$9]]; + var fmt_result = _aO_; + break; + case 37: + case 64: + var + fmt_rest$6 = parse(str_ind, end_ind)[1], + fmt_result = [0, [12, symb, fmt_rest$6]]; + break; + case 76: + case 108: + case 110: + var switch$1 = 0; + if(str_ind === end_ind) + switch$1 = 1; + else{ + var + symb$0 = caml_string_get(str, str_ind), + _a8_ = symb$0 - 88 | 0, + switch$2 = 0; + if(32 >= _a8_ >>> 0) + switch(_a8_){ + case 0: + case 12: + case 17: + case 23: + case 29: + case 32: + var _aU_ = 1; switch$2 = 1; break; + } + if(! switch$2) var _aU_ = 0; + if(_aU_) switch$0 = 1; else switch$1 = 1; + } + if(switch$1){ + var fmt_rest$13 = parse(str_ind, end_ind)[1], switch$3 = 0; + if(108 <= symb){ + if(111 > symb) + switch(symb - 108 | 0){ + case 0: + var counter = 0; switch$3 = 1; break; + case 1: break; + default: var counter = 1; switch$3 = 1; + } + } + else if(76 === symb){var counter = 2; switch$3 = 1;} + if(! switch$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _V_], 1); + if(get_ign(0)) + var + ignored$5 = [11, counter], + _aT_ = [0, [23, ignored$5, fmt_rest$13]]; + else + var _aT_ = [0, [21, counter, fmt_rest$13]]; + var fmt_result = _aT_; + } + break; + case 32: + case 35: + case 43: + case 45: + case 95: + var + fmt_result = caml_call3(failwith_message(_M_), str, pct_ind, symb); + break; + case 88: + case 100: + case 105: + case 111: + case 117: + case 120: + var + _aX_ = get_space(0), + _aY_ = get_hash(0), + iconv$2 = + compute_int_conv(pct_ind, str_ind, get_plus(0), _aY_, _aX_, symb), + fmt_rest$17 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$8 = [2, iconv$2, get_pad_opt(95)], + _aZ_ = [0, [23, ignored$8, fmt_rest$17]]; + else + var + _a0_ = get_prec(0), + match$6 = make_padprec_fmt_ebb(get_int_pad(0), _a0_, fmt_rest$17), + fmt_rest$18 = match$6[3], + prec$4 = match$6[2], + pad$8 = match$6[1], + _aZ_ = [0, [4, iconv$2, pad$8, prec$4, fmt_rest$18]]; + var fmt_result = _aZ_; + break; + case 69: + case 70: + case 71: + case 72: + case 101: + case 102: + case 103: + case 104: + var + space$1 = get_space(0), + hash$1 = get_hash(0), + plus$2 = get_plus(0), + flag = + plus$2 + ? space$1 + ? legacy_behavior$0 + ? 1 + : incompatible_flag(pct_ind, str_ind, 32, cst$36) + : 1 + : space$1 ? 2 : 0, + switch$4 = 0; + if(73 <= symb){ + var switcher = symb - 101 | 0; + if(3 < switcher >>> 0) + switch$4 = 1; + else{ + switch(switcher){ + case 0: + var _a9_ = 1; break; + case 1: + var _a9_ = 0; break; + case 2: + var _a9_ = 3; break; + default: var _a9_ = 6; + } + var kind = _a9_; + } + } + else if(69 <= symb){ + var switch$5 = 0; + switch(symb - 69 | 0){ + case 0: + var _a__ = 2; break; + case 1: + switch$4 = 1; switch$5 = 1; break; + case 2: + var _a__ = 4; break; + default: var _a__ = 7; + } + if(! switch$5) var kind = _a__; + } + else + switch$4 = 1; + if(switch$4){ + var switch$6 = 0; + if(hash$1){ + if(70 === symb){var kind = 8; switch$6 = 1;} + } + else if(70 === symb){var kind = 5; switch$6 = 1;} + if(! switch$6) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + } + var + fconv = [0, flag, kind], + fmt_rest$11 = parse(str_ind, end_ind)[1]; + if(get_ign(0)){ + var match = get_prec(0); + if(typeof match === "number") + var + _aQ_ = match ? incompatible_flag(pct_ind, str_ind, 95, cst$26) : 0; + else + var ndec = match[1], _aQ_ = [0, ndec]; + var + ignored$4 = [6, get_pad_opt(95), _aQ_], + _aR_ = [0, [23, ignored$4, fmt_rest$11]]; + } + else + var + _aS_ = get_prec(0), + match$4 = make_padprec_fmt_ebb(get_pad(0), _aS_, fmt_rest$11), + fmt_rest$12 = match$4[3], + prec$3 = match$4[2], + pad$5 = match$4[1], + _aR_ = [0, [8, fconv, pad$5, prec$3, fmt_rest$12]]; + var fmt_result = _aR_; + break; + default: switch$0 = 1; + } + if(switch$0){ + var switch$7 = 0; + if(108 <= symb){ + if(111 > symb){ + var switch$8 = 0; + switch(symb - 108 | 0){ + case 0: + var + _ax_ = caml_string_get(str, str_ind), + _ay_ = get_space(0), + _az_ = get_hash(0), + iconv = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _az_, _ay_, _ax_), + fmt_rest = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored = [3, iconv, get_pad_opt(95)], + _aA_ = [0, [23, ignored, fmt_rest]]; + else + var + _aC_ = get_prec(0), + match$0 = make_padprec_fmt_ebb(get_int_pad(0), _aC_, fmt_rest), + fmt_rest$0 = match$0[3], + prec$0 = match$0[2], + pad$0 = match$0[1], + _aA_ = [0, [5, iconv, pad$0, prec$0, fmt_rest$0]]; + var _aB_ = _aA_; + switch$8 = 1; + break; + case 1: break; + default: + var + _aD_ = caml_string_get(str, str_ind), + _aE_ = get_space(0), + _aF_ = get_hash(0), + iconv$0 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aF_, _aE_, _aD_), + fmt_rest$1 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$0 = [4, iconv$0, get_pad_opt(95)], + _aG_ = [0, [23, ignored$0, fmt_rest$1]]; + else + var + _aH_ = get_prec(0), + match$1 = make_padprec_fmt_ebb(get_int_pad(0), _aH_, fmt_rest$1), + fmt_rest$2 = match$1[3], + prec$1 = match$1[2], + pad$1 = match$1[1], + _aG_ = [0, [6, iconv$0, pad$1, prec$1, fmt_rest$2]]; + var _aB_ = _aG_; + switch$8 = 1; + } + if(switch$8){var fmt_result = _aB_; switch$7 = 1;} + } + } + else if(76 === symb){ + var + _aI_ = caml_string_get(str, str_ind), + _aJ_ = get_space(0), + _aK_ = get_hash(0), + iconv$1 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aK_, _aJ_, _aI_), + fmt_rest$3 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$1 = [5, iconv$1, get_pad_opt(95)], + _aL_ = [0, [23, ignored$1, fmt_rest$3]]; + else + var + _aM_ = get_prec(0), + match$2 = make_padprec_fmt_ebb(get_int_pad(0), _aM_, fmt_rest$3), + fmt_rest$4 = match$2[3], + prec$2 = match$2[2], + pad$2 = match$2[1], + _aL_ = [0, [7, iconv$1, pad$2, prec$2, fmt_rest$4]]; + var fmt_result = _aL_; + switch$7 = 1; + } + if(! switch$7) + var + fmt_result = + caml_call3(failwith_message(_J_), str, str_ind - 1 | 0, symb); + } + if(1 - legacy_behavior$0){ + var _ao_ = 1 - plus_used[1], plus$0 = _ao_ ? plus : _ao_; + if(plus$0) incompatible_flag(pct_ind, str_ind, symb, cst$27); + var _ap_ = 1 - hash_used[1], hash$0 = _ap_ ? hash : _ap_; + if(hash$0) incompatible_flag(pct_ind, str_ind, symb, cst$28); + var _aq_ = 1 - space_used[1], space$0 = _aq_ ? space : _aq_; + if(space$0) incompatible_flag(pct_ind, str_ind, symb, cst$29); + var + _ar_ = 1 - pad_used[1], + _as_ = _ar_ ? caml_notequal([0, pad], _K_) : _ar_; + if(_as_) incompatible_flag(pct_ind, str_ind, symb, cst_padding$0); + var + _at_ = 1 - prec_used[1], + _au_ = _at_ ? caml_notequal([0, prec], _L_) : _at_; + if(_au_){ + var _av_ = ign ? 95 : symb; + incompatible_flag(pct_ind, str_ind, _av_, cst_precision$2); + } + var plus$1 = ign ? plus : ign; + if(plus$1) incompatible_flag(pct_ind, str_ind, 95, cst$30); + } + var _aw_ = 1 - ign_used[1], ign$0 = _aw_ ? ign : _aw_; + if(ign$0){ + var switch$9 = 0; + if(38 <= symb){ + if(44 !== symb && 64 !== symb) switch$9 = 1; + } + else if(33 !== symb && 37 > symb) switch$9 = 1; + var switch$10 = 0; + if(switch$9 || ! legacy_behavior$0) switch$10 = 1; + if(switch$10) incompatible_flag(pct_ind, str_ind, symb, cst$31); + } + return fmt_result; + } + function parse_after_precision + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad, prec){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + function parse_conv(padprec){ + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + caml_string_get(str, str_ind)); + } + if(typeof pad !== "number") return parse_conv(pad); + if(typeof prec === "number" && ! prec) return parse_conv(0); + if(minus){ + if(typeof prec === "number") return parse_conv(_F_); + var n = prec[1]; + return parse_conv([0, 0, n]); + } + if(typeof prec === "number") return parse_conv(_G_); + var n$0 = prec[1]; + return parse_conv([0, 1, n$0]); + } + function parse_after_padding + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var symb = caml_string_get(str, str_ind); + if(46 !== symb) + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + 0, + pad, + symb); + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + function parse_literal(minus, str_ind){ + var + match = parse_positive(str_ind, end_ind, 0), + prec = match[2], + new_ind = match[1]; + return parse_after_precision + (pct_ind, + new_ind, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + [0, prec]); + } + var symb$0 = caml_string_get(str, str_ind$0); + if(48 <= symb$0){ + if(58 > symb$0) return parse_literal(minus, str_ind$0); + } + else if(42 <= symb$0) + switch(symb$0 - 42 | 0){ + case 0: + return parse_after_precision + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + 1); + case 1: + case 3: + if(legacy_behavior$0){ + var + _an_ = str_ind$0 + 1 | 0, + minus$0 = minus || (45 === symb$0 ? 1 : 0); + return parse_literal(minus$0, _an_); + } + break; + } + return legacy_behavior$0 + ? parse_after_precision + (pct_ind, + str_ind$0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + _E_) + : invalid_format_without(str_ind$0 - 1 | 0, 46, cst_precision); + } + function parse_flags(pct_ind, str_ind, end_ind, ign){ + var + zero = [0, 0], + minus = [0, 0], + plus = [0, 0], + space = [0, 0], + hash = [0, 0]; + function set_flag(str_ind, flag){ + var _ak_ = flag[1], _al_ = _ak_ ? 1 - legacy_behavior$0 : _ak_; + if(_al_){ + var _am_ = caml_string_get(str, str_ind); + caml_call3(failwith_message(_C_), str, str_ind, _am_); + } + flag[1] = 1; + return 0; + } + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var switcher = caml_string_get(str, str_ind$0) - 32 | 0; + if(16 >= switcher >>> 0) + switch(switcher){ + case 0: + set_flag(str_ind$0, space); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + case 3: + set_flag(str_ind$0, hash); + var str_ind$2 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$2; + continue; + case 11: + set_flag(str_ind$0, plus); + var str_ind$3 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$3; + continue; + case 13: + set_flag(str_ind$0, minus); + var str_ind$4 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$4; + continue; + case 16: + set_flag(str_ind$0, zero); + var str_ind$5 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$5; + continue; + } + var + space$0 = space[1], + hash$0 = hash[1], + plus$0 = plus[1], + minus$0 = minus[1], + zero$0 = zero[1]; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var + padty = + zero$0 + ? minus$0 + ? legacy_behavior$0 + ? 0 + : incompatible_flag(pct_ind, str_ind$0, 45, cst_0) + : 2 + : minus$0 ? 0 : 1, + match = caml_string_get(str, str_ind$0); + if(48 <= match){ + if(58 > match){ + var + match$0 = parse_positive(str_ind$0, end_ind, 0), + width = match$0[2], + new_ind = match$0[1]; + return parse_after_padding + (pct_ind, + new_ind, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [0, padty, width]); + } + } + else if(42 === match) + return parse_after_padding + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [1, padty]); + switch(padty){ + case 0: + if(1 - legacy_behavior$0) + invalid_format_without(str_ind$0 - 1 | 0, 45, cst_padding); + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + case 1: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + default: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + _D_); + } + } + } + function parse_tag(is_open_tag, str_ind, end_ind){ + try{ + if(str_ind === end_ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(60 !== caml_string_get(str, str_ind)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var ind = caml_call3(Stdlib_String[31], str, str_ind + 1 | 0, 62); + if(end_ind <= ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + sub_str = + caml_call3 + (Stdlib_String[15], str, str_ind, (ind - str_ind | 0) + 1 | 0), + fmt_rest$0 = parse(ind + 1 | 0, end_ind)[1], + sub_fmt = parse(str_ind, ind + 1 | 0)[1], + sub_format$0 = [0, sub_fmt, sub_str], + formatting$0 = is_open_tag ? [0, sub_format$0] : [1, sub_format$0], + _ai_ = [0, [18, formatting$0, fmt_rest$0]]; + return _ai_; + } + catch(_aj_){ + var _ah_ = caml_wrap_exception(_aj_); + if(_ah_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ah_, 0); + var + fmt_rest = parse(str_ind, end_ind)[1], + formatting = is_open_tag ? [0, sub_format] : [1, sub_format]; + return [0, [18, formatting, fmt_rest]]; + } + } + function parse_spaces(str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + if(32 !== caml_string_get(str, str_ind$0)) return str_ind$0; + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + } + } + function parse_positive(str_ind, end_ind, acc){ + var str_ind$0 = str_ind, acc$0 = acc; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(9 < c - 48 >>> 0) return [0, str_ind$0, acc$0]; + var new_acc = (acc$0 * 10 | 0) + (c - 48 | 0) | 0; + if(Stdlib_Sys[12] < new_acc){ + var _ag_ = Stdlib_Sys[12]; + return caml_call3(failwith_message(_S_), str, new_acc, _ag_); + } + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + acc$0 = new_acc; + } + } + function parse_integer(str_ind, end_ind){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var match = caml_string_get(str, str_ind); + if(48 <= match){ + if(58 > match) return parse_positive(str_ind, end_ind, 0); + } + else if(45 === match){ + if((str_ind + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind + 1 | 0); + if(9 < c - 48 >>> 0) + return expected_character(str_ind + 1 | 0, cst_digit, c); + var + match$0 = parse_positive(str_ind + 1 | 0, end_ind, 0), + n = match$0[2], + next_ind = match$0[1]; + return [0, next_ind, - n | 0]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + } + function search_subformat_end(str_ind, end_ind, c){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) + caml_call3(failwith_message(_U_), str, c, end_ind); + if(37 !== caml_string_get(str, str_ind$0)){ + var str_ind$7 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$7; + continue; + } + if((str_ind$0 + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + if(caml_string_get(str, str_ind$0 + 1 | 0) === c) return str_ind$0; + var match = caml_string_get(str, str_ind$0 + 1 | 0); + if(95 <= match){ + if(123 <= match){ + if(126 > match) + switch(match - 123 | 0){ + case 0: + var + sub_end = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 125), + str_ind$2 = sub_end + 2 | 0, + str_ind$0 = str_ind$2; + continue; + case 1: break; + default: + return expected_character(str_ind$0 + 1 | 0, cst_character, 125); + } + } + else if(96 > match){ + if((str_ind$0 + 2 | 0) === end_ind) unexpected_end_of_format(end_ind); + var match$0 = caml_string_get(str, str_ind$0 + 2 | 0); + if(40 === match$0){ + var + sub_end$0 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 41), + str_ind$3 = sub_end$0 + 2 | 0, + str_ind$0 = str_ind$3; + continue; + } + if(123 === match$0){ + var + sub_end$1 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 125), + str_ind$4 = sub_end$1 + 2 | 0, + str_ind$0 = str_ind$4; + continue; + } + var str_ind$5 = str_ind$0 + 3 | 0, str_ind$0 = str_ind$5; + continue; + } + } + else{ + if(40 === match){ + var + sub_end$2 = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 41), + str_ind$6 = sub_end$2 + 2 | 0, + str_ind$0 = str_ind$6; + continue; + } + if(41 === match) + return expected_character(str_ind$0 + 1 | 0, cst_character$0, 41); + } + var str_ind$1 = str_ind$0 + 2 | 0, str_ind$0 = str_ind$1; + } + } + function incompatible_flag(pct_ind, str_ind, symb, option){ + var + subfmt = + caml_call3(Stdlib_String[15], str, pct_ind, str_ind - pct_ind | 0); + return caml_call5 + (failwith_message(_Y_), str, pct_ind, option, symb, subfmt); + } + function compute_int_conv(pct_ind, str_ind, plus, hash, space, symb){ + var plus$0 = plus, hash$0 = hash, space$0 = space; + for(;;){ + var switch$0 = 0; + if(plus$0){ + if(hash$0) + switch$0 = 1; + else if(! space$0){ + if(100 === symb) return 1; + if(105 === symb) return 4; + } + } + else if(hash$0) + if(space$0) + switch$0 = 1; + else{ + var switcher$0 = symb - 88 | 0; + if(32 < switcher$0 >>> 0) + switch$0 = 1; + else + switch(switcher$0){ + case 0: + return 9; + case 12: + return 13; + case 17: + return 14; + case 23: + return 11; + case 29: + return 15; + case 32: + return 7; + default: switch$0 = 1; + } + } + else if(space$0){ + if(100 === symb) return 2; + if(105 === symb) return 5; + } + else{ + var switcher$1 = symb - 88 | 0; + if(32 >= switcher$1 >>> 0) + switch(switcher$1){ + case 0: + return 8; + case 12: + return 0; + case 17: + return 3; + case 23: + return 10; + case 29: + return 12; + case 32: + return 6; + } + } + if(switch$0){ + var switcher = symb - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 0: + if(legacy_behavior$0) return 9; break; + case 23: + if(legacy_behavior$0) return 11; break; + case 32: + if(legacy_behavior$0) return 7; break; + case 12: + case 17: + case 29: + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$35); + var hash$0 = 0; + continue; + } + } + if(! plus$0){ + if(! space$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _W_], 1); + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$34); + var space$0 = 0; + continue; + } + if(space$0){ + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, 32, cst$32); + var space$0 = 0; + continue; + } + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$33); + var plus$0 = 0; + } + } + return parse(0, caml_ml_string_length(str)); + } + function format_of_string_fmtty(str, fmtty){ + var fmt = fmt_ebb_of_string(0, str)[1]; + try{var _ae_ = [0, type_format(fmt, fmtty), str]; return _ae_;} + catch(_af_){ + var _ac_ = caml_wrap_exception(_af_); + if(_ac_ !== Type_mismatch) throw caml_maybe_attach_backtrace(_ac_, 0); + var _ad_ = string_of_fmtty(fmtty); + return caml_call2(failwith_message(_Z_), str, _ad_); + } + } + function format_of_string_format(str, param){ + var + str$0 = param[2], + fmt = param[1], + fmt$0 = fmt_ebb_of_string(0, str)[1]; + try{ + var _aa_ = [0, type_format(fmt$0, fmtty_of_fmt(fmt)), str]; + return _aa_; + } + catch(_ab_){ + var _$_ = caml_wrap_exception(_ab_); + if(_$_ === Type_mismatch) + return caml_call2(failwith_message(___), str, str$0); + throw caml_maybe_attach_backtrace(_$_, 0); + } + } + var + CamlinternalFormat = + [0, + is_in_char_set, + rev_char_set, + create_char_set, + add_in_char_set, + freeze_char_set, + param_format_of_ignored_format, + make_printf, + make_iprintf, + output_acc, + bufput_acc, + strput_acc, + type_format, + fmt_ebb_of_string, + format_of_string_fmtty, + format_of_string_format, + char_of_iconv, + string_of_formatting_lit, + string_of_fmtty, + string_of_fmt, + open_box_of_string, + symm, + trans, + recast]; + runtime.caml_register_global(197, CamlinternalFormat, "CamlinternalFormat"); + return; + } + (globalThis)); + +//# 15574 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Buffer = global_data.Stdlib__Buffer, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib; + function kfprintf(k, o, param){ + var fmt = param[1], _g_ = 0; + function _h_(acc){ + caml_call2(CamlinternalFormat[9], o, acc); + return caml_call1(k, o); + } + return caml_call3(CamlinternalFormat[7], _h_, _g_, fmt); + } + function kbprintf(k, b, param){ + var fmt = param[1], _e_ = 0; + function _f_(acc){ + caml_call2(CamlinternalFormat[10], b, acc); + return caml_call1(k, b); + } + return caml_call3(CamlinternalFormat[7], _f_, _e_, fmt); + } + function ikfprintf(k, oc, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, oc, fmt); + } + function fprintf(oc, fmt){ + return kfprintf(function(_d_){return 0;}, oc, fmt); + } + function bprintf(b, fmt){ + return kbprintf(function(_c_){return 0;}, b, fmt); + } + function ifprintf(oc, fmt){ + return ikfprintf(function(_b_){return 0;}, oc, fmt); + } + function ibprintf(b, fmt){ + return ikfprintf(function(_a_){return 0;}, b, fmt); + } + function printf(fmt){return fprintf(Stdlib[39], fmt);} + function eprintf(fmt){return fprintf(Stdlib[40], fmt);} + function ksprintf(k, param){ + var fmt = param[1]; + function k$0(acc){ + var buf = caml_call1(Stdlib_Buffer[1], 64); + caml_call2(CamlinternalFormat[11], buf, acc); + return caml_call1(k, caml_call1(Stdlib_Buffer[2], buf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(function(s){return s;}, fmt);} + var + Stdlib_Printf = + [0, + fprintf, + printf, + eprintf, + sprintf, + bprintf, + ifprintf, + ibprintf, + kfprintf, + ikfprintf, + ksprintf, + kbprintf, + ikfprintf, + ksprintf]; + runtime.caml_register_global(3, Stdlib_Printf, "Stdlib__Printf"); + return; + } + (globalThis)); + +//# 15665 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$7 = "", + cst$9 = " ", + cst_Display_this_list_of_optio$1 = " Display this list of options", + cst_s = "%s", + cst_help$4 = "--help", + cst_help$3 = "-help", + cst$8 = ".\n", + cst_a_float$1 = "a float", + cst_an_integer$1 = "an integer", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$6 = "\n", + cst$3 = cst$7, + cst$4 = " ", + cst$5 = cst$7, + cst$2 = "(?)", + cst = "}", + cst$0 = "|", + cst$1 = "{", + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + Bad = [248, "Stdlib.Arg.Bad", caml_fresh_oo_id(0)], + Help = [248, "Stdlib.Arg.Help", caml_fresh_oo_id(0)], + Stop = [248, "Stdlib.Arg.Stop", caml_fresh_oo_id(0)], + _v_ = [0, [2, 0, [0, 0]], "%s%c"], + _p_ = [0, [2, 0, 0], cst_s], + _q_ = [0, [2, 0, 0], cst_s], + _n_ = [0, [2, 0, 0], cst_s], + _o_ = [0, [2, 0, 0], cst_s], + _l_ = [0, [2, 0, 0], cst_s], + _m_ = [0, [2, 0, 0], cst_s], + cst_a_boolean = "a boolean", + cst_an_integer = cst_an_integer$1, + cst_an_integer$0 = cst_an_integer$1, + cst_a_float = cst_a_float$1, + cst_a_float$0 = cst_a_float$1, + cst_one_of = "one of: ", + cst_Arg_Expand_is_is_only_allo = + "Arg.Expand is is only allowed with Arg.parse_and_expand_argv_dynamic", + cst_no_argument = "no argument", + _f_ = + [0, + [2, 0, [11, ": unknown option '", [2, 0, [11, "'.\n", 0]]]], + "%s: unknown option '%s'.\n"], + _i_ = + [0, + [2, + 0, + [11, + ": wrong argument '", + [2, + 0, + [11, + "'; option '", + [2, 0, [11, "' expects ", [2, 0, [11, cst$8, 0]]]]]]]], + "%s: wrong argument '%s'; option '%s' expects %s.\n"], + _j_ = + [0, + [2, 0, [11, ": option '", [2, 0, [11, "' needs an argument.\n", 0]]]], + "%s: option '%s' needs an argument.\n"], + _k_ = [0, [2, 0, [11, ": ", [2, 0, [11, cst$8, 0]]]], "%s: %s.\n"], + _g_ = [0, cst_help$3], + _h_ = [0, cst_help$4], + _e_ = [0, [2, 0, 0], cst_s], + _d_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + cst_help$2 = cst_help$3, + cst_Display_this_list_of_optio = cst_Display_this_list_of_optio$1, + cst_help = cst_help$3, + cst_help$1 = cst_help$4, + cst_Display_this_list_of_optio$0 = cst_Display_this_list_of_optio$1, + cst_help$0 = cst_help$4, + _c_ = [0, cst_help$3], + _a_ = [0, [11, cst$9, [2, 0, [12, 32, [2, 0, [12, 10, 0]]]]], " %s %s\n"], + _b_ = + [0, + [11, cst$9, [2, 0, [12, 32, [2, 0, [2, 0, [12, 10, 0]]]]]], + " %s %s%s\n"], + cst_none = ""; + function assoc3(x, l){ + var l$0 = l; + for(;;){ + if(! l$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var match = l$0[1], y2 = match[2], y1 = match[1]; + if(caml_equal(y1, x)) return y2; + var t = l$0[2], l$0 = t; + } + } + function make_symlist(prefix, sep, suffix, l){ + if(! l) return cst_none; + var t = l[2], h = l[1], _aD_ = caml_call2(Stdlib[28], prefix, h); + function _aE_(x, y){ + var _aG_ = caml_call2(Stdlib[28], sep, y); + return caml_call2(Stdlib[28], x, _aG_); + } + var _aF_ = caml_call3(Stdlib_List[25], _aE_, _aD_, t); + return caml_call2(Stdlib[28], _aF_, suffix); + } + function help_action(param){ + throw caml_maybe_attach_backtrace([0, Stop, _c_], 1); + } + function add_help(speclist){ + try{assoc3(cst_help$2, speclist); var _aA_ = 0, add1 = _aA_;} + catch(_aC_){ + var _aw_ = caml_wrap_exception(_aC_); + if(_aw_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_aw_, 0); + var + add1 = + [0, + [0, cst_help, [0, help_action], cst_Display_this_list_of_optio], + 0]; + } + try{assoc3(cst_help$1, speclist); var _az_ = 0, add2 = _az_;} + catch(_aB_){ + var _ax_ = caml_wrap_exception(_aB_); + if(_ax_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ax_, 0); + var + add2 = + [0, + [0, cst_help$0, [0, help_action], cst_Display_this_list_of_optio$0], + 0]; + } + var _ay_ = caml_call2(Stdlib[37], add1, add2); + return caml_call2(Stdlib[37], speclist, _ay_); + } + function usage_b(buf, speclist, errmsg){ + caml_call3(Stdlib_Printf[5], buf, _d_, errmsg); + var _as_ = add_help(speclist); + function _at_(param){ + var + doc = param[3], + spec = param[2], + key = param[1], + _au_ = 0 < caml_ml_string_length(doc) ? 1 : 0; + if(! _au_) return _au_; + if(11 !== spec[0]) + return caml_call4(Stdlib_Printf[5], buf, _a_, key, doc); + var l = spec[1], _av_ = make_symlist(cst$1, cst$0, cst, l); + return caml_call5(Stdlib_Printf[5], buf, _b_, key, _av_, doc); + } + return caml_call2(Stdlib_List[17], _at_, _as_); + } + function usage_string(speclist, errmsg){ + var b = caml_call1(Stdlib_Buffer[1], 200); + usage_b(b, speclist, errmsg); + return caml_call1(Stdlib_Buffer[2], b); + } + function usage(speclist, errmsg){ + var _ar_ = usage_string(speclist, errmsg); + return caml_call2(Stdlib_Printf[3], _e_, _ar_); + } + var current = [0, 0]; + function int_of_string_opt(x){ + try{var _ap_ = [0, runtime.caml_int_of_string(x)]; return _ap_;} + catch(_aq_){ + var _ao_ = caml_wrap_exception(_aq_); + if(_ao_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_ao_, 0); + } + } + function float_of_string_opt(x){ + try{var _am_ = [0, runtime.caml_float_of_string(x)]; return _am_;} + catch(_an_){ + var _al_ = caml_wrap_exception(_an_); + if(_al_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_al_, 0); + } + } + function parse_and_expand_argv_dynamic_ + (allow_expand, current, argv, speclist, anonfun, errmsg){ + var initpos = current[1]; + function convert_error(error){ + var + b = caml_call1(Stdlib_Buffer[1], 200), + progname = + initpos < argv[1].length - 1 + ? caml_check_bound(argv[1], initpos)[1 + initpos] + : cst$2; + switch(error[0]){ + case 0: + var s = error[1]; + if + (caml_string_notequal(s, cst_help$4) + && caml_string_notequal(s, cst_help$3)) + caml_call4(Stdlib_Printf[5], b, _f_, progname, s); + break; + case 1: + var expected = error[3], arg = error[2], opt = error[1]; + caml_call6(Stdlib_Printf[5], b, _i_, progname, arg, opt, expected); + break; + case 2: + var s$0 = error[1]; + caml_call4(Stdlib_Printf[5], b, _j_, progname, s$0); + break; + default: + var s$1 = error[1]; + caml_call4(Stdlib_Printf[5], b, _k_, progname, s$1); + } + usage_b(b, speclist[1], errmsg); + if(! caml_equal(error, _g_) && ! caml_equal(error, _h_)) + return [0, Bad, caml_call1(Stdlib_Buffer[2], b)]; + return [0, Help, caml_call1(Stdlib_Buffer[2], b)]; + } + current[1]++; + for(;;){ + if(current[1] >= argv[1].length - 1) return 0; + try{ + var + _Y_ = current[1], + s = caml_check_bound(argv[1], _Y_)[1 + _Y_], + switch$0 = 0; + if(1 <= caml_ml_string_length(s) && 45 === caml_string_get(s, 0)){ + try{ + var + follow$1 = 0, + _aa_ = assoc3(s, speclist[1]), + follow$0 = follow$1, + action = _aa_; + } + catch(_aj_){ + var _Z_ = caml_wrap_exception(_aj_); + if(_Z_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_Z_, 0); + try{ + var + i = caml_call2(Stdlib_String[35], s, 61), + len = caml_ml_string_length(s), + arg = + caml_call3(Stdlib_String[15], s, i + 1 | 0, len - (i + 1 | 0) | 0), + keyword = caml_call3(Stdlib_String[15], s, 0, i), + follow = [0, arg], + _$_ = assoc3(keyword, speclist[1]), + follow$0 = follow, + action = _$_; + } + catch(_ak_){ + var ___ = caml_wrap_exception(_ak_); + if(___ === Stdlib[8]) + throw caml_maybe_attach_backtrace([0, Stop, [0, s]], 1); + throw caml_maybe_attach_backtrace(___, 0); + } + } + var + no_arg$0 = + function(s, follow){ + function no_arg(param){ + if(! follow) return 0; + var arg = follow[1]; + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_no_argument]], 1); + } + return no_arg; + }, + no_arg = no_arg$0(s, follow$0), + get_arg$0 = + function(s, follow){ + function get_arg(param){ + if(follow){var arg = follow[1]; return arg;} + if((current[1] + 1 | 0) >= argv[1].length - 1) + throw caml_maybe_attach_backtrace([0, Stop, [2, s]], 1); + var _ai_ = current[1] + 1 | 0; + return caml_check_bound(argv[1], _ai_)[1 + _ai_]; + } + return get_arg; + }, + get_arg = get_arg$0(s, follow$0), + consume_arg$0 = + function(follow){ + function consume_arg(param){return follow ? 0 : (current[1]++, 0);} + return consume_arg; + }, + consume_arg = consume_arg$0(follow$0), + treat_action$0 = + function(s, no_arg, get_arg, consume_arg){ + function treat_action(param){ + switch(param[0]){ + case 0: + var f = param[1]; no_arg(0); return caml_call1(f, 0); + case 1: + var f$0 = param[1], arg = get_arg(0); + try{var _ac_ = [0, caml_call1(Stdlib[32], arg)], match = _ac_;} + catch(_ah_){ + var _ab_ = caml_wrap_exception(_ah_); + if(_ab_[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace(_ab_, 0); + var match = 0; + } + if(! match) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_a_boolean]], 1); + var s$0 = match[1]; + caml_call1(f$0, s$0); + return consume_arg(0); + case 2: + var r = param[1]; no_arg(0); r[1] = 1; return 0; + case 3: + var r$0 = param[1]; no_arg(0); r$0[1] = 0; return 0; + case 4: + var f$1 = param[1], arg$0 = get_arg(0); + caml_call1(f$1, arg$0); + return consume_arg(0); + case 5: + var r$1 = param[1]; r$1[1] = get_arg(0); return consume_arg(0); + case 6: + var + f$2 = param[1], + arg$1 = get_arg(0), + match$0 = int_of_string_opt(arg$1); + if(! match$0) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$1, cst_an_integer]], 1); + var x = match$0[1]; + caml_call1(f$2, x); + return consume_arg(0); + case 7: + var + r$2 = param[1], + arg$2 = get_arg(0), + match$1 = int_of_string_opt(arg$2); + if(! match$1) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$2, cst_an_integer$0]], 1); + var x$0 = match$1[1]; + r$2[1] = x$0; + return consume_arg(0); + case 8: + var + f$3 = param[1], + arg$3 = get_arg(0), + match$2 = float_of_string_opt(arg$3); + if(! match$2) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$3, cst_a_float]], 1); + var x$1 = match$2[1]; + caml_call1(f$3, x$1); + return consume_arg(0); + case 9: + var + r$3 = param[1], + arg$4 = get_arg(0), + match$3 = float_of_string_opt(arg$4); + if(! match$3) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$4, cst_a_float$0]], 1); + var x$2 = match$3[1]; + r$3[1] = x$2; + return consume_arg(0); + case 10: + var specs = param[1]; + no_arg(0); + return caml_call2(Stdlib_List[17], treat_action, specs); + case 11: + var f$4 = param[2], symb = param[1], arg$5 = get_arg(0); + if(caml_call2(Stdlib_List[36], arg$5, symb)){ + caml_call1(f$4, arg$5); + return consume_arg(0); + } + var _ad_ = make_symlist(cst$5, cst$4, cst$3, symb); + throw caml_maybe_attach_backtrace + ([0, + Stop, + [1, s, arg$5, caml_call2(Stdlib[28], cst_one_of, _ad_)]], + 1); + case 12: + var f$5 = param[1]; + no_arg(0); + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) return 0; + var _ae_ = current[1] + 1 | 0; + caml_call1(f$5, caml_check_bound(argv[1], _ae_)[1 + _ae_]); + consume_arg(0); + } + case 13: + var f$6 = param[1]; + no_arg(0); + var acc = [0, 0]; + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) + return caml_call1(f$6, caml_call1(Stdlib_List[9], acc[1])); + var _ag_ = current[1] + 1 | 0, _af_ = acc[1]; + acc[1] = [0, caml_check_bound(argv[1], _ag_)[1 + _ag_], _af_]; + consume_arg(0); + } + default: + var f$7 = param[1]; + if(1 - allow_expand) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Arg_Expand_is_is_only_allo], 1); + var arg$6 = get_arg(0), newarg = caml_call1(f$7, arg$6); + consume_arg(0); + var + before = + caml_call3(Stdlib_Array[5], argv[1], 0, current[1] + 1 | 0), + after = + caml_call3 + (Stdlib_Array[5], + argv[1], + current[1] + 1 | 0, + (argv[1].length - 1 - current[1] | 0) - 1 | 0); + argv[1] = + caml_call1 + (Stdlib_Array[4], [0, before, [0, newarg, [0, after, 0]]]); + return 0; + } + } + return treat_action; + }, + treat_action = treat_action$0(s, no_arg, get_arg, consume_arg); + treat_action(action); + switch$0 = 1; + } + if(! switch$0) caml_call1(anonfun, s); + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var m = exn[2]; + throw caml_maybe_attach_backtrace(convert_error([3, m]), 1); + } + if(exn[1] !== Stop) throw caml_maybe_attach_backtrace(exn, 0); + var e = exn[2]; + throw caml_maybe_attach_backtrace(convert_error(e), 1); + } + current[1]++; + } + } + function parse_and_expand_argv_dynamic + (current, argv, speclist, anonfun, errmsg){ + return parse_and_expand_argv_dynamic_ + (1, current, argv, speclist, anonfun, errmsg); + } + function parse_argv_dynamic(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_and_expand_argv_dynamic_ + (0, current$0, [0, argv], speclist, anonfun, errmsg); + } + function parse_argv(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_argv_dynamic + ([0, current$0], argv, [0, speclist], anonfun, errmsg); + } + function parse(l, f, msg){ + try{var _X_ = parse_argv(0, caml_sys_argv(0), l, f, msg); return _X_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _l_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _m_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_dynamic(l, f, msg){ + try{ + var _W_ = parse_argv_dynamic(0, caml_sys_argv(0), l, f, msg); + return _W_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _n_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _o_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_expand(l, f, msg){ + try{ + var + argv = [0, caml_sys_argv(0)], + spec = [0, l], + current$0 = [0, current[1]], + _V_ = parse_and_expand_argv_dynamic(current$0, argv, spec, f, msg); + return _V_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _p_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _q_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function second_word(s){ + var len = caml_ml_string_length(s); + function loop(n){ + var n$0 = n; + for(;;){ + if(len <= n$0) return len; + if(32 !== caml_string_get(s, n$0)) return n$0; + var n$1 = n$0 + 1 | 0, n$0 = n$1; + } + } + try{var n$0 = caml_call2(Stdlib_String[35], s, 9);} + catch(_T_){ + var _R_ = caml_wrap_exception(_T_); + if(_R_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_R_, 0); + try{var n = caml_call2(Stdlib_String[35], s, 32);} + catch(_U_){ + var _S_ = caml_wrap_exception(_U_); + if(_S_ === Stdlib[8]) return len; + throw caml_maybe_attach_backtrace(_S_, 0); + } + return loop(n + 1 | 0); + } + return loop(n$0 + 1 | 0); + } + function max_arg_len(cur, param){ + var doc = param[3], spec = param[2], kwd = param[1]; + if(11 === spec[0]) + return caml_call2(Stdlib_Int[11], cur, caml_ml_string_length(kwd)); + var _Q_ = caml_ml_string_length(kwd) + second_word(doc) | 0; + return caml_call2(Stdlib_Int[11], cur, _Q_); + } + function replace_leading_tab(s){ + var seen = [0, 0]; + function _P_(c){ + if(9 === c && ! seen[1]){seen[1] = 1; return 32;} + return c; + } + return caml_call2(Stdlib_String[17], _P_, s); + } + function align(opt, speclist){ + if(opt) var sth = opt[1], limit = sth; else var limit = Stdlib[19]; + var + completed = add_help(speclist), + len = caml_call3(Stdlib_List[25], max_arg_len, 0, completed), + len$0 = caml_call2(Stdlib_Int[10], len, limit); + function _J_(ksd){ + var kwd = ksd[1], spec = ksd[2]; + if(! caml_string_notequal(ksd[3], cst$7)) return ksd; + if(11 === spec[0]){ + var + msg$0 = ksd[3], + cutcol$0 = second_word(msg$0), + _M_ = caml_call2(Stdlib_Int[11], 0, len$0 - cutcol$0 | 0) + 3 | 0, + spaces$0 = caml_call2(Stdlib_String[1], _M_, 32), + _N_ = replace_leading_tab(msg$0), + _O_ = caml_call2(Stdlib[28], spaces$0, _N_); + return [0, kwd, spec, caml_call2(Stdlib[28], cst$6, _O_)]; + } + var + msg = ksd[3], + spec$0 = ksd[2], + cutcol = second_word(msg), + kwd_len = caml_ml_string_length(kwd), + diff = (len$0 - kwd_len | 0) - cutcol | 0; + if(0 >= diff) return [0, kwd, spec$0, replace_leading_tab(msg)]; + var + spaces = caml_call2(Stdlib_String[1], diff, 32), + _K_ = replace_leading_tab(msg), + prefix = caml_call3(Stdlib_String[15], _K_, 0, cutcol), + suffix = + caml_call3 + (Stdlib_String[15], + msg, + cutcol, + caml_ml_string_length(msg) - cutcol | 0), + _L_ = caml_call2(Stdlib[28], spaces, suffix); + return [0, kwd, spec$0, caml_call2(Stdlib[28], prefix, _L_)]; + } + return caml_call2(Stdlib_List[19], _J_, completed); + } + function read_aux(trim, sep, file){ + var + ic = caml_call1(Stdlib[80], file), + buf = caml_call1(Stdlib_Buffer[1], 200), + words = [0, 0]; + function stash(param){ + var word = caml_call1(Stdlib_Buffer[2], buf); + if(trim){ + var len = caml_ml_string_length(word), switch$0 = 0; + if(0 < len && 13 === caml_string_get(word, len - 1 | 0)){ + var _I_ = caml_call3(Stdlib_String[15], word, 0, len - 1 | 0); + switch$0 = 1; + } + if(! switch$0) var _I_ = word; + var word$0 = _I_; + } + else + var word$0 = word; + words[1] = [0, word$0, words[1]]; + return caml_call1(Stdlib_Buffer[8], buf); + } + try{ + for(;;){ + var c = caml_call1(Stdlib[82], ic); + if(c === sep) stash(0); else caml_call2(Stdlib_Buffer[12], buf, c); + } + } + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_F_, 0); + if(0 < caml_call1(Stdlib_Buffer[7], buf)) stash(0); + caml_call1(Stdlib[93], ic); + var _G_ = caml_call1(Stdlib_List[9], words[1]); + return caml_call1(Stdlib_Array[10], _G_); + } + } + var _r_ = 10, _s_ = 1; + function read_arg(_E_){return read_aux(_s_, _r_, _E_);} + var _t_ = 0, _u_ = 0; + function read_arg0(_D_){return read_aux(_u_, _t_, _D_);} + function write_aux(sep, file, args){ + var oc = caml_call1(Stdlib[61], file); + function _C_(s){return caml_call4(Stdlib_Printf[1], oc, _v_, s, sep);} + caml_call2(Stdlib_Array[11], _C_, args); + return caml_call1(Stdlib[76], oc); + } + var _w_ = 10; + function write_arg(_A_, _B_){return write_aux(_w_, _A_, _B_);} + var _x_ = 0; + function write_arg0(_y_, _z_){return write_aux(_x_, _y_, _z_);} + var + Stdlib_Arg = + [0, + parse, + parse_dynamic, + parse_argv, + parse_argv_dynamic, + parse_and_expand_argv_dynamic, + parse_expand, + Help, + Bad, + usage, + usage_string, + align, + current, + read_arg, + read_arg0, + write_arg, + write_arg0]; + runtime.caml_register_global(54, Stdlib_Arg, "Stdlib__Arg"); + return; + } + (globalThis)); + +//# 16364 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_s = "%s\n", + cst_Program_not_linked_with_g_$0 = + "(Program not linked with -g, cannot print stack backtrace)\n", + cst_characters = ", characters ", + cst_Fatal_error_exception = "Fatal error: exception ", + cst_Fatal_error_exception_s = "Fatal error: exception %s\n", + cst_Uncaught_exception = "Uncaught exception: ", + cst_Uncaught_exception_s = "Uncaught exception: %s\n", + caml_check_bound = runtime.caml_check_bound, + caml_get_exception_raw_backtra = runtime.caml_get_exception_raw_backtrace, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$4, + cst$3 = cst$4, + partial = [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, 0]]], + cst$1 = cst$4, + cst$2 = cst$4, + cst = "_", + locfmt = + [0, + [11, + 'File "', + [2, + 0, + [11, + '", line ', + [4, + 0, + 0, + 0, + [11, + cst_characters, + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [11, ": ", [2, 0, 0]]]]]]]]]], + 'File "%s", line %d, characters %d-%d: %s'], + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Obj = global_data.Stdlib__Obj, + printers = caml_call1(Stdlib_Atomic[1], 0), + _c_ = [0, [11, ", ", [2, 0, [2, 0, 0]]], ", %s%s"], + _o_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _p_ = + [0, + [11, + "Fatal error in uncaught exception handler: exception ", + [2, 0, [12, 10, 0]]], + "Fatal error in uncaught exception handler: exception %s\n"], + cst_Fatal_error_out_of_memory_ = + "Fatal error: out of memory in uncaught exception handler", + _n_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _l_ = [0, [2, 0, [12, 10, 0]], cst_s], + cst_Program_not_linked_with_g_ = cst_Program_not_linked_with_g_$0, + _j_ = [0, [2, 0, [12, 10, 0]], cst_s], + _k_ = + [0, + [11, cst_Program_not_linked_with_g_$0, 0], + cst_Program_not_linked_with_g_$0], + cst_Raised_at = "Raised at", + cst_Re_raised_at = "Re-raised at", + cst_Raised_by_primitive_operat = "Raised by primitive operation at", + cst_Called_from = "Called from", + cst_inlined = " (inlined)", + _h_ = + [0, + [2, + 0, + [12, + 32, + [2, + 0, + [11, + ' in file "', + [2, + 0, + [12, + 34, + [2, + 0, + [11, ", line ", [4, 0, 0, 0, [11, cst_characters, partial]]]]]]]]]], + '%s %s in file "%s"%s, line %d, characters %d-%d'], + _i_ = [0, [2, 0, [11, " unknown location", 0]], "%s unknown location"], + _g_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + _f_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + cst_Out_of_memory = "Out of memory", + cst_Stack_overflow = "Stack overflow", + cst_Pattern_matching_failed = "Pattern matching failed", + cst_Assertion_failed = "Assertion failed", + cst_Undefined_recursive_module = "Undefined recursive module", + _d_ = [0, [12, 40, [2, 0, [2, 0, [12, 41, 0]]]], "(%s%s)"], + _e_ = [0, [12, 40, [2, 0, [12, 41, 0]]], "(%s)"], + _b_ = [0, [4, 0, 0, 0, 0], "%d"], + _a_ = [0, [3, 0, 0], "%S"], + _m_ = + [0, + cst$4, + "(Cannot print locations:\n bytecode executable program file not found)", + "(Cannot print locations:\n bytecode executable program file appears to be corrupt)", + "(Cannot print locations:\n bytecode executable program file has wrong magic number)", + "(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"]; + function field(x, i){ + var f = x[1 + i]; + if(! caml_call1(Stdlib_Obj[1], f)) + return caml_call2(Stdlib_Printf[4], _b_, f); + var _al_ = Stdlib_Obj[15]; + if(caml_obj_tag(f) === _al_) return caml_call2(Stdlib_Printf[4], _a_, f); + var _am_ = Stdlib_Obj[16]; + return caml_obj_tag(f) === _am_ ? caml_call1(Stdlib[35], f) : cst; + } + function other_fields(x, i){ + if(x.length - 1 <= i) return cst$0; + var _aj_ = other_fields(x, i + 1 | 0), _ak_ = field(x, i); + return caml_call3(Stdlib_Printf[4], _c_, _ak_, _aj_); + } + function use_printers(x){ + var param = caml_call1(Stdlib_Atomic[2], printers); + for(;;){ + if(! param) return 0; + var tl = param[2], hd = param[1], switch$0 = 0; + try{var val = caml_call1(hd, x);}catch(_ai_){switch$0 = 1;} + if(! switch$0 && val){var s = val[1]; return [0, s];} + var param = tl; + } + } + function string_of_extension_constructo(t){ + if(0 === caml_obj_tag(t)){ + var constructor = t[1][1], match = t.length - 1; + if(2 < match >>> 0) + var + _ae_ = other_fields(t, 2), + _af_ = field(t, 1), + _ah_ = caml_call3(Stdlib_Printf[4], _d_, _af_, _ae_); + else + switch(match){ + case 0: + var _ah_ = cst$1; break; + case 1: + var _ah_ = cst$2; break; + default: + var + _ag_ = field(t, 1), + _ah_ = caml_call2(Stdlib_Printf[4], _e_, _ag_); + } + var match$0 = [0, constructor, [0, _ah_]]; + } + else + var match$0 = [0, t[1], 0]; + var fields_opt = match$0[2], constructor$0 = match$0[1]; + if(! fields_opt) return constructor$0; + var f = fields_opt[1]; + return caml_call2(Stdlib[28], constructor$0, f); + } + function to_string_default(x){ + if(x === Stdlib[9]) return cst_Out_of_memory; + if(x === Stdlib[10]) return cst_Stack_overflow; + if(x[1] === Stdlib[4]){ + var match = x[2], char$0 = match[3], line = match[2], file = match[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file, + line, + char$0, + char$0 + 5 | 0, + cst_Pattern_matching_failed); + } + if(x[1] === Stdlib[5]){ + var + match$0 = x[2], + char$1 = match$0[3], + line$0 = match$0[2], + file$0 = match$0[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$0, + line$0, + char$1, + char$1 + 6 | 0, + cst_Assertion_failed); + } + if(x[1] !== Stdlib[15]) return string_of_extension_constructo(x); + var + match$1 = x[2], + char$2 = match$1[3], + line$1 = match$1[2], + file$1 = match$1[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$1, + line$1, + char$2, + char$2 + 6 | 0, + cst_Undefined_recursive_module); + } + function to_string(e){ + var match = use_printers(e); + if(! match) return to_string_default(e); + var s = match[1]; + return s; + } + function print(fct, arg){ + try{var _ad_ = caml_call1(fct, arg); return _ad_;} + catch(x$0){ + var x = caml_wrap_exception(x$0), _ac_ = to_string(x); + caml_call2(Stdlib_Printf[3], _f_, _ac_); + caml_call1(Stdlib[63], Stdlib[40]); + throw caml_maybe_attach_backtrace(x, 0); + } + } + function catch$0(fct, arg){ + try{var _ab_ = caml_call1(fct, arg); return _ab_;} + catch(x$0){ + var x = caml_wrap_exception(x$0); + caml_call1(Stdlib[63], Stdlib[39]); + var _aa_ = to_string(x); + caml_call2(Stdlib_Printf[3], _g_, _aa_); + return caml_call1(Stdlib[99], 2); + } + } + function raw_backtrace_entries(bt){return bt;} + function convert_raw_backtrace(bt){ + return [0, runtime.caml_convert_raw_backtrace(bt)]; + } + function format_backtrace_slot(pos, slot){ + function info(is_raise){ + return is_raise + ? 0 === pos ? cst_Raised_at : cst_Re_raised_at + : 0 === pos ? cst_Raised_by_primitive_operat : cst_Called_from; + } + if(0 === slot[0]){ + var + _U_ = slot[5], + _V_ = slot[4], + _W_ = slot[3], + _X_ = slot[6] ? cst_inlined : cst$3, + _Y_ = slot[2], + _Z_ = slot[7], + ___ = info(slot[1]); + return [0, + caml_call8 + (Stdlib_Printf[4], _h_, ___, _Z_, _Y_, _X_, _W_, _V_, _U_)]; + } + if(slot[1]) return 0; + var _$_ = info(0); + return [0, caml_call2(Stdlib_Printf[4], _i_, _$_)]; + } + function print_raw_backtrace(outchan, raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return caml_call2(Stdlib_Printf[1], outchan, _k_); + var a = backtrace[1], _S_ = a.length - 1 - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[1], outchan, _j_, str); + } + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return 0; + } + function print_backtrace(outchan){ + return print_raw_backtrace(outchan, caml_get_exception_raw_backtra(0)); + } + function raw_backtrace_to_string(raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return cst_Program_not_linked_with_g_; + var + a = backtrace[1], + b = caml_call1(Stdlib_Buffer[1], 1024), + _P_ = a.length - 1 - 1 | 0, + _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[5], b, _l_, str); + } + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return caml_call1(Stdlib_Buffer[2], b); + } + function backtrace_slot_is_raise(param){ + return 0 === param[0] ? param[1] : param[1]; + } + function backtrace_slot_is_inline(param){return 0 === param[0] ? param[6] : 0; + } + function backtrace_slot_location(param){ + return 0 === param[0] + ? [0, [0, param[2], param[3], param[4], param[5]]] + : 0; + } + function backtrace_slot_defname(param){ + if(0 === param[0] && runtime.caml_string_notequal(param[7], cst$4)) + return [0, param[7]]; + return 0; + } + function backtrace_slots(raw_backtrace){ + var match = convert_raw_backtrace(raw_backtrace); + if(! match) return 0; + var backtrace = match[1], i$1 = backtrace.length - 1 - 1 | 0, i = i$1; + for(;;){ + if(-1 === i) + var _N_ = 0; + else{ + var _M_ = 0 === caml_check_bound(backtrace, i)[1 + i][0] ? 1 : 0; + if(! _M_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _N_ = _M_; + } + return _N_ ? [0, backtrace] : 0; + } + } + function backtrace_slots_of_raw_entry(entry){return backtrace_slots([0, entry]); + } + function raw_backtrace_length(bt){return bt.length - 1;} + function get_backtrace(param){ + return raw_backtrace_to_string(caml_get_exception_raw_backtra(0)); + } + function register_printer(fn){ + for(;;){ + var + old_printers = caml_call1(Stdlib_Atomic[2], printers), + new_printers = [0, fn, old_printers], + success = + caml_call3(Stdlib_Atomic[5], printers, old_printers, new_printers), + _L_ = 1 - success; + if(_L_) continue; + return _L_; + } + } + function exn_slot(x){return 0 === caml_obj_tag(x) ? x[1] : x;} + function exn_slot_id(x){var slot = exn_slot(x); return slot[2];} + function exn_slot_name(x){var slot = exn_slot(x); return slot[1];} + var errors = _m_.slice(); + function default_uncaught_exception_han(exn, raw_backtrace){ + var _I_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _n_, _I_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var status = runtime.caml_ml_debug_info_status(0); + if(status < 0){ + var + _J_ = caml_call1(Stdlib[18], status), + _K_ = caml_check_bound(errors, _J_)[1 + _J_]; + caml_call1(Stdlib[53], _K_); + } + return caml_call1(Stdlib[63], Stdlib[40]); + } + var uncaught_exception_handler = [0, default_uncaught_exception_han]; + function set_uncaught_exception_handler(fn){ + uncaught_exception_handler[1] = fn; + return 0; + } + var empty_backtrace = [0]; + function handle_uncaught_exception(exn$0, debugger_in_use){ + try{ + try{ + var + raw_backtrace = + debugger_in_use ? empty_backtrace : caml_get_exception_raw_backtra(0); + try{caml_call1(Stdlib[103], 0);}catch(_H_){} + try{ + var + _D_ = caml_call2(uncaught_exception_handler[1], exn$0, raw_backtrace), + _C_ = _D_; + } + catch(exn$1){ + var + exn = caml_wrap_exception(exn$1), + raw_backtrace$0 = caml_get_exception_raw_backtra(0), + _A_ = to_string(exn$0); + caml_call2(Stdlib_Printf[3], _o_, _A_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var _B_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _p_, _B_); + print_raw_backtrace(Stdlib[40], raw_backtrace$0); + var _C_ = caml_call1(Stdlib[63], Stdlib[40]); + } + var _E_ = _C_; + } + catch(_G_){ + var _z_ = caml_wrap_exception(_G_); + if(_z_ !== Stdlib[9]) throw caml_maybe_attach_backtrace(_z_, 0); + var _E_ = caml_call1(Stdlib[53], cst_Fatal_error_out_of_memory_); + } + return _E_; + } + catch(_F_){return 0;} + } + runtime.caml_register_named_value + ("Printexc.handle_uncaught_exception", handle_uncaught_exception); + function _q_(_y_){return runtime.caml_raw_backtrace_next_slot(_y_);} + function _r_(_x_){return runtime.caml_convert_raw_backtrace_slot(_x_);} + function _s_(_w_, _v_){return runtime.caml_raw_backtrace_slot(_w_, _v_);} + var + _t_ = + [0, + backtrace_slot_is_raise, + backtrace_slot_is_inline, + backtrace_slot_location, + backtrace_slot_defname, + format_backtrace_slot], + Stdlib_Printexc = + [0, + to_string, + to_string_default, + print, + catch$0, + print_backtrace, + get_backtrace, + runtime.caml_record_backtrace, + runtime.caml_backtrace_status, + register_printer, + use_printers, + raw_backtrace_entries, + function(_u_){return caml_get_exception_raw_backtra(_u_);}, + print_raw_backtrace, + raw_backtrace_to_string, + default_uncaught_exception_han, + set_uncaught_exception_handler, + backtrace_slots, + backtrace_slots_of_raw_entry, + _t_, + raw_backtrace_length, + _s_, + _r_, + _q_, + exn_slot_id, + exn_slot_name, + string_of_extension_constructo]; + runtime.caml_register_global(42, Stdlib_Printexc, "Stdlib__Printexc"); + return; + } + (globalThis)); + +//# 17098 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Digest_from_hex$1 = "Digest.from_hex", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_md5_string = runtime.caml_md5_string, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_String = global_data.Stdlib__String, + compare = Stdlib_String[9], + equal = Stdlib_String[8], + cst_Digest_from_hex$0 = cst_Digest_from_hex$1, + cst_Digest_from_hex = cst_Digest_from_hex$1, + cst_Digest_to_hex = "Digest.to_hex", + cst_Digest_substring = "Digest.substring"; + function string(str){ + return caml_md5_string(str, 0, caml_ml_string_length(str)); + } + function bytes(b){return string(caml_call1(Stdlib_Bytes[44], b));} + function substring(str, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(str) - len | 0) >= ofs) + return caml_md5_string(str, ofs, len); + return caml_call1(Stdlib[1], cst_Digest_substring); + } + function subbytes(b, ofs, len){ + return substring(caml_call1(Stdlib_Bytes[44], b), ofs, len); + } + function file(filename){ + var ic = caml_call1(Stdlib[80], filename); + try{var d = runtime.caml_md5_chan(ic, -1);} + catch(e$0){ + var e = caml_wrap_exception(e$0); + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(e, 0); + } + caml_call1(Stdlib[93], ic); + return d; + } + function output(chan, digest){return caml_call2(Stdlib[66], chan, digest);} + function input(chan){return caml_call2(Stdlib[86], chan, 16);} + function char_hex(n){var _e_ = 10 <= n ? 87 : 48; return n + _e_ | 0;} + function to_hex(d){ + if(16 !== caml_ml_string_length(d)) + caml_call1(Stdlib[1], cst_Digest_to_hex); + var result = caml_create_bytes(32), i = 0; + for(;;){ + var x = caml_string_get(d, i); + caml_bytes_unsafe_set(result, i * 2 | 0, char_hex(x >>> 4 | 0)); + caml_bytes_unsafe_set(result, (i * 2 | 0) + 1 | 0, char_hex(x & 15)); + var _d_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _d_; + } + } + function from_hex(s){ + if(32 !== caml_ml_string_length(s)) + caml_call1(Stdlib[1], cst_Digest_from_hex); + function digit(c){ + if(65 <= c){ + if(97 <= c){ + if(103 > c) return (c - 97 | 0) + 10 | 0; + } + else if(71 > c) return (c - 65 | 0) + 10 | 0; + } + else if(9 >= c - 48 >>> 0) return c - 48 | 0; + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Digest_from_hex$0], 1); + } + var result = caml_create_bytes(16), i = 0; + for(;;){ + var + i$0 = 2 * i | 0, + _a_ = digit(caml_string_get(s, i$0 + 1 | 0)), + _b_ = (digit(caml_string_get(s, i$0)) << 4) + _a_ | 0; + runtime.caml_bytes_set(result, i, caml_call1(Stdlib_Char[1], _b_)); + var _c_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _c_; + } + } + var + Stdlib_Digest = + [0, + compare, + equal, + string, + bytes, + substring, + subbytes, + file, + output, + input, + to_hex, + from_hex]; + runtime.caml_register_global(8, Stdlib_Digest, "Stdlib__Digest"); + return; + } + (globalThis)); + +//# 17219 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Bigarray_Array3_of_array_n$1 = + "Bigarray.Array3.of_array: non-cubic data", + caml_ba_change_layout = runtime.caml_ba_change_layout, + caml_ba_create = runtime.caml_ba_create, + caml_ba_dim_1 = runtime.caml_ba_dim_1, + caml_ba_dim_2 = runtime.caml_ba_dim_2, + caml_ba_kind = runtime.caml_ba_kind, + caml_ba_num_dims = runtime.caml_ba_num_dims, + caml_ba_reshape = runtime.caml_ba_reshape, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_ba_set_2 = runtime.caml_ba_set_2, + caml_ba_set_3 = runtime.caml_ba_set_3, + caml_ba_set_generic = runtime.caml_ba_set_generic, + caml_ba_slice = runtime.caml_ba_slice, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Bigarray_array3_of_genarra = "Bigarray.array3_of_genarray", + cst_Bigarray_array2_of_genarra = "Bigarray.array2_of_genarray", + cst_Bigarray_array1_of_genarra = "Bigarray.array1_of_genarray", + cst_Bigarray_array0_of_genarra = "Bigarray.array0_of_genarray", + cst_Bigarray_Array3_of_array_n = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array3_of_array_n$0 = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array2_of_array_n = + "Bigarray.Array2.of_array: non-rectangular data", + float32 = 0, + float64 = 1, + int8_signed = 2, + int8_unsigned = 3, + int16_signed = 4, + int16_unsigned = 5, + int32 = 6, + int64 = 7, + int$0 = 8, + nativeint = 9, + complex32 = 10, + complex64 = 11, + char$0 = 12; + function kind_size_in_bytes(param){ + switch(param){ + case 0: + return 4; + case 1: + return 8; + case 2: + return 1; + case 3: + return 1; + case 4: + return 2; + case 5: + return 2; + case 6: + return 4; + case 7: + return 8; + case 8: + return Stdlib_Sys[9] / 8 | 0; + case 9: + return Stdlib_Sys[9] / 8 | 0; + case 10: + return 8; + case 11: + return 16; + default: return 1; + } + } + var c_layout = 0, fortran_layout = 1; + function cloop(arr, idx, f, col, max){ + if(col === idx.length - 1) + return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _am_ = caml_check_bound(max, col)[1 + col] - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var j = _al_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + cloop(arr, idx, f, col + 1 | 0, max); + var _an_ = j + 1 | 0; + if(_am_ !== j){var j = _an_; continue;} + break; + } + } + return 0; + } + function floop(arr, idx, f, col, max){ + if(0 > col) return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _aj_ = caml_check_bound(max, col)[1 + col], _ai_ = 1; + if(_aj_ >= 1){ + var j = _ai_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + floop(arr, idx, f, col - 1 | 0, max); + var _ak_ = j + 1 | 0; + if(_aj_ !== j){var j = _ak_; continue;} + break; + } + } + return 0; + } + function init(kind, layout, dims, f){ + var arr = caml_ba_create(kind, layout, dims), dlen = dims.length - 1; + return layout + ? (floop + (arr, caml_make_vect(dlen, 1), f, dlen - 1 | 0, dims), + arr) + : (cloop(arr, caml_make_vect(dlen, 0), f, 0, dims), arr); + } + function dims(a){ + var + n = caml_ba_num_dims(a), + d = caml_make_vect(n, 0), + _af_ = n - 1 | 0, + _ae_ = 0; + if(_af_ >= 0){ + var i = _ae_; + for(;;){ + var _ag_ = runtime.caml_ba_dim(a, i); + caml_check_bound(d, i)[1 + i] = _ag_; + var _ah_ = i + 1 | 0; + if(_af_ !== i){var i = _ah_; continue;} + break; + } + } + return d; + } + function size_in_bytes(arr){ + var + _ac_ = dims(arr), + _ad_ = caml_call3(Stdlib_Array[15], caml_mul, 1, _ac_); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _ad_); + } + function create(kind, layout){return caml_ba_create(kind, layout, [0]);} + function get(arr){return runtime.caml_ba_get_generic(arr, [0]);} + function set(arr){ + var _aa_ = [0]; + return function(_ab_){return caml_ba_set_generic(arr, _aa_, _ab_);}; + } + function size_in_bytes$0(arr){ + return kind_size_in_bytes(caml_ba_kind(arr)); + } + function of_value(kind, layout, v){ + var a = create(kind, layout); + caml_call1(set(a), v); + return a; + } + function create$0(kind, layout, dim){ + return caml_ba_create(kind, layout, [0, dim]); + } + function size_in_bytes$1(arr){ + var _$_ = caml_ba_dim_1(arr); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _$_); + } + function slice(a, n){ + return runtime.caml_ba_layout(a) + ? caml_ba_slice(a, [0, n]) + : caml_ba_slice(a, [0, n]); + } + function init$0(kind, layout, dim, f){ + var arr = create$0(kind, layout, dim); + if(layout){ + var _Z_ = 1; + if(dim >= 1){ + var i$0 = _Z_; + for(;;){ + caml_ba_set_1(arr, i$0, caml_call1(f, i$0)); + var ___ = i$0 + 1 | 0; + if(dim !== i$0){var i$0 = ___; continue;} + break; + } + } + return arr; + } + var _X_ = dim - 1 | 0, _W_ = 0; + if(_X_ >= 0){ + var i = _W_; + for(;;){ + caml_ba_set_1(arr, i, caml_call1(f, i)); + var _Y_ = i + 1 | 0; + if(_X_ !== i){var i = _Y_; continue;} + break; + } + } + return arr; + } + function of_array(kind, layout, data){ + var + ba = create$0(kind, layout, data.length - 1), + ofs = layout ? 1 : 0, + _U_ = data.length - 1 - 1 | 0, + _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_ba_set_1(ba, i + ofs | 0, caml_check_bound(data, i)[1 + i]); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return ba; + } + function create$1(kind, layout, dim1, dim2){ + return caml_ba_create(kind, layout, [0, dim1, dim2]); + } + function size_in_bytes$2(arr){ + var _R_ = caml_ba_dim_2(arr), _S_ = caml_ba_dim_1(arr); + return caml_mul(caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _S_), _R_); + } + function slice_left(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right(a, n){return caml_ba_slice(a, [0, n]);} + function init$1(kind, layout, dim1, dim2, f){ + var arr = create$1(kind, layout, dim1, dim2); + if(layout){ + var _N_ = 1; + if(dim2 >= 1){ + var j$0 = _N_; + for(;;){ + var _O_ = 1; + if(dim1 >= 1){ + var i$0 = _O_; + for(;;){ + caml_ba_set_2(arr, i$0, j$0, caml_call2(f, i$0, j$0)); + var _Q_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _Q_; continue;} + break; + } + } + var _P_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _P_; continue;} + break; + } + } + return arr; + } + var _I_ = dim1 - 1 | 0, _H_ = 0; + if(_I_ >= 0){ + var i = _H_; + for(;;){ + var _K_ = dim2 - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var j = _J_; + for(;;){ + caml_ba_set_2(arr, i, j, caml_call2(f, i, j)); + var _M_ = j + 1 | 0; + if(_K_ !== j){var j = _M_; continue;} + break; + } + } + var _L_ = i + 1 | 0; + if(_I_ !== i){var i = _L_; continue;} + break; + } + } + return arr; + } + function of_array$0(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + ba = create$1(kind, layout, dim1, dim2), + ofs = layout ? 1 : 0, + _C_ = dim1 - 1 | 0, + _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array2_of_array_n); + var _E_ = dim2 - 1 | 0, _D_ = 0; + if(_E_ >= 0){ + var j = _D_; + for(;;){ + caml_ba_set_2 + (ba, i + ofs | 0, j + ofs | 0, caml_check_bound(row, j)[1 + j]); + var _G_ = j + 1 | 0; + if(_E_ !== j){var j = _G_; continue;} + break; + } + } + var _F_ = i + 1 | 0; + if(_C_ !== i){var i = _F_; continue;} + break; + } + } + return ba; + } + function create$2(kind, layout, dim1, dim2, dim3){ + return caml_ba_create(kind, layout, [0, dim1, dim2, dim3]); + } + function size_in_bytes$3(arr){ + var + _y_ = runtime.caml_ba_dim_3(arr), + _z_ = caml_ba_dim_2(arr), + _A_ = caml_ba_dim_1(arr); + return caml_mul + (caml_mul + (caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _A_), _z_), + _y_); + } + function slice_left_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_right_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_left_2(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right_2(a, n){return caml_ba_slice(a, [0, n]);} + function init$2(kind, layout, dim1, dim2, dim3, f){ + var arr = create$2(kind, layout, dim1, dim2, dim3); + if(layout){ + var _s_ = 1; + if(dim3 >= 1){ + var k$0 = _s_; + for(;;){ + var _t_ = 1; + if(dim2 >= 1){ + var j$0 = _t_; + for(;;){ + var _v_ = 1; + if(dim1 >= 1){ + var i$0 = _v_; + for(;;){ + caml_ba_set_3(arr, i$0, j$0, k$0, caml_call3(f, i$0, j$0, k$0)); + var _x_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _x_; continue;} + break; + } + } + var _w_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _w_; continue;} + break; + } + } + var _u_ = k$0 + 1 | 0; + if(dim3 !== k$0){var k$0 = _u_; continue;} + break; + } + } + return arr; + } + var _k_ = dim1 - 1 | 0, _j_ = 0; + if(_k_ >= 0){ + var i = _j_; + for(;;){ + var _m_ = dim2 - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var j = _l_; + for(;;){ + var _p_ = dim3 - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var k = _o_; + for(;;){ + caml_ba_set_3(arr, i, j, k, caml_call3(f, i, j, k)); + var _r_ = k + 1 | 0; + if(_p_ !== k){var k = _r_; continue;} + break; + } + } + var _q_ = j + 1 | 0; + if(_m_ !== j){var j = _q_; continue;} + break; + } + } + var _n_ = i + 1 | 0; + if(_k_ !== i){var i = _n_; continue;} + break; + } + } + return arr; + } + function of_array$1(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + dim3 = + 0 === dim2 + ? 0 + : caml_check_bound(caml_check_bound(data, 0)[1], 0)[1].length - 1, + ba = create$2(kind, layout, dim1, dim2, dim3), + ofs = layout ? 1 : 0, + _b_ = dim1 - 1 | 0, + _a_ = 0; + if(_b_ >= 0){ + var i = _a_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n); + var _d_ = dim2 - 1 | 0, _c_ = 0; + if(_d_ >= 0){ + var j = _c_; + for(;;){ + var col = caml_check_bound(row, j)[1 + j]; + if(col.length - 1 !== dim3) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n$0); + var _g_ = dim3 - 1 | 0, _f_ = 0; + if(_g_ >= 0){ + var k = _f_; + for(;;){ + caml_ba_set_3 + (ba, + i + ofs | 0, + j + ofs | 0, + k + ofs | 0, + caml_check_bound(col, k)[1 + k]); + var _i_ = k + 1 | 0; + if(_g_ !== k){var k = _i_; continue;} + break; + } + } + var _h_ = j + 1 | 0; + if(_d_ !== j){var j = _h_; continue;} + break; + } + } + var _e_ = i + 1 | 0; + if(_b_ !== i){var i = _e_; continue;} + break; + } + } + return ba; + } + function array0_of_genarray(a){ + return 0 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array0_of_genarra); + } + function array1_of_genarray(a){ + return 1 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array1_of_genarra); + } + function array2_of_genarray(a){ + return 2 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array2_of_genarra); + } + function array3_of_genarray(a){ + return 3 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array3_of_genarra); + } + function reshape_0(a){return caml_ba_reshape(a, [0]);} + function reshape_1(a, dim1){return caml_ba_reshape(a, [0, dim1]);} + function reshape_2(a, dim1, dim2){ + return caml_ba_reshape(a, [0, dim1, dim2]); + } + function reshape_3(a, dim1, dim2, dim3){ + return caml_ba_reshape(a, [0, dim1, dim2, dim3]); + } + var + Stdlib_Bigarray = + [0, + float32, + float64, + complex32, + complex64, + int8_signed, + int8_unsigned, + int16_signed, + int16_unsigned, + int$0, + int32, + int64, + nativeint, + char$0, + kind_size_in_bytes, + c_layout, + fortran_layout, + [0, init, dims, size_in_bytes], + [0, + create, + of_value, + caml_ba_change_layout, + size_in_bytes$0, + get, + set, + of_value], + [0, + create$0, + init$0, + caml_ba_change_layout, + size_in_bytes$1, + slice, + of_array], + [0, + create$1, + init$1, + caml_ba_change_layout, + size_in_bytes$2, + slice_left, + slice_right, + of_array$0], + [0, + create$2, + init$2, + caml_ba_change_layout, + size_in_bytes$3, + slice_left_1, + slice_right_1, + slice_left_2, + slice_right_2, + of_array$1], + array0_of_genarray, + array1_of_genarray, + array2_of_genarray, + array3_of_genarray, + caml_ba_reshape, + reshape_0, + reshape_1, + reshape_2, + reshape_3]; + runtime.caml_register_global(10, Stdlib_Bigarray, "Stdlib__Bigarray"); + return; + } + (globalThis)); + +//# 17760 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_ba_blit = runtime.caml_ba_blit, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_bytes_set = runtime.caml_bytes_set, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessequal = runtime.caml_lessequal, + caml_lxm_next = runtime.caml_lxm_next, + caml_mod = runtime.caml_mod, + caml_notequal = runtime.caml_notequal, + caml_sys_random_seed = runtime.caml_sys_random_seed; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib = global_data.Stdlib, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Digest = global_data.Stdlib__Digest, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Bigarray = global_data.Stdlib__Bigarray, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + _j_ = runtime.caml_int64_create_lo_mi_hi(14371852, 15349651, 22696), + _k_ = runtime.caml_int64_create_lo_mi_hi(12230193, 11438743, 35013), + _l_ = runtime.caml_int64_create_lo_mi_hi(1424933, 15549263, 2083), + _m_ = runtime.caml_int64_create_lo_mi_hi(9492471, 4696708, 43520), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_Random_int64 = "Random.int64", + cst_Random_int32 = "Random.int32", + cst_Random_full_int = "Random.full_int", + cst_Random_int = "Random.int", + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0); + function create(param){return caml_call3(Stdlib_Bigarray[19][1], 7, 0, 4);} + function set(s, i1, i2, i3, i4){ + caml_ba_set_1(s, 0, runtime.caml_int64_or(i1, _a_)); + caml_ba_set_1(s, 1, i2); + var i3$0 = caml_notequal(i3, _b_) ? i3 : _e_; + caml_ba_set_1(s, 2, i3$0); + var i4$0 = caml_notequal(i4, _c_) ? i4 : _d_; + return caml_ba_set_1(s, 3, i4$0); + } + function mk(i1, i2, i3, i4){ + var s = create(0); + set(s, i1, i2, i3, i4); + return s; + } + function copy(s){var s$0 = create(0); caml_ba_blit(s, s$0); return s$0;} + function reinit(s, seed){ + var + n = seed.length - 1, + b = runtime.caml_create_bytes((n * 8 | 0) + 1 | 0), + _p_ = n - 1 | 0, + _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var _t_ = caml_int64_of_int32(runtime.caml_check_bound(seed, i)[1 + i]); + caml_call3(Stdlib_Bytes[86], b, i * 8 | 0, _t_); + var _u_ = i + 1 | 0; + if(_p_ !== i){var i = _u_; continue;} + break; + } + } + caml_bytes_set(b, n * 8 | 0, 1); + var d1 = caml_call1(Stdlib_Digest[4], b); + caml_bytes_set(b, n * 8 | 0, 2); + var + d2 = caml_call1(Stdlib_Digest[4], b), + _q_ = caml_call2(Stdlib_String[64], d2, 8), + _r_ = caml_call2(Stdlib_String[64], d2, 0), + _s_ = caml_call2(Stdlib_String[64], d1, 8); + return set(s, caml_call2(Stdlib_String[64], d1, 0), _s_, _r_, _q_); + } + function make(seed){var s = create(0); reinit(s, seed); return s;} + function make_self_init(param){return make(caml_sys_random_seed(0));} + function bits(s){ + return caml_int64_to_int32(caml_lxm_next(s)) & 1073741823; + } + function intaux(s, n){ + for(;;){ + var r = bits(s), v = caml_mod(r, n); + if(((1073741823 - n | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function int$0(s, bound){ + if(1073741823 >= bound && 0 < bound) return intaux(s, bound); + return caml_call1(Stdlib[1], cst_Random_int); + } + function full_int(s, bound){ + if(0 >= bound) return caml_call1(Stdlib[1], cst_Random_full_int); + if(1073741823 >= bound) return intaux(s, bound); + for(;;){ + var + _n_ = Stdlib[19], + r = caml_int64_to_int32(caml_lxm_next(s)) & _n_, + v = caml_mod(r, bound); + if(((Stdlib[19] - bound | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function bits32(s){return caml_int64_to_int32(caml_lxm_next(s));} + function int32(s, bound){ + if(caml_lessequal(bound, 0)) + return caml_call1(Stdlib[1], cst_Random_int32); + for(;;){ + var r = bits32(s) >>> 1 | 0, v = caml_mod(r, bound); + if(caml_greaterthan(r - v | 0, (Stdlib_Int32[9] - bound | 0) + 1 | 0)) + continue; + return v; + } + } + var bits64 = caml_lxm_next; + function int64(s, bound){ + if(caml_lessequal(bound, _g_)) + return caml_call1(Stdlib[1], cst_Random_int64); + for(;;){ + var + r = caml_int64_shift_right_unsigne(caml_lxm_next(s), 1), + v = runtime.caml_int64_mod(r, bound); + if + (caml_greaterthan + (caml_int64_sub(r, v), + runtime.caml_int64_add(caml_int64_sub(Stdlib_Int64[9], bound), _f_))) + continue; + return v; + } + } + var + nativebits = + 32 === Stdlib_Nativeint[9] + ? function(s){return bits32(s);} + : function(s){return caml_int64_to_int32(caml_lxm_next(s));}, + nativeint = + 32 === Stdlib_Nativeint[9] + ? function(s, bound){return int32(s, bound);} + : function + (s, bound){ + return caml_int64_to_int32(int64(s, caml_int64_of_int32(bound))); + }; + function float$0(s, bound){ + for(;;){ + var b = caml_lxm_next(s), n = caml_int64_shift_right_unsigne(b, 11); + if(caml_notequal(n, _h_)) + return runtime.caml_int64_to_float(n) * 1.1102230246251565e-16 * bound; + } + } + function bool(s){return runtime.caml_lessthan(caml_lxm_next(s), _i_);} + function split(s){ + var + i1 = caml_lxm_next(s), + i2 = caml_lxm_next(s), + i3 = caml_lxm_next(s), + i4 = caml_lxm_next(s); + return mk(i1, i2, i3, i4); + } + function mk_default(param){return mk(_m_, _l_, _k_, _j_);} + var random_key = caml_call2(Stdlib_Domain[10][1], [0, split], mk_default); + function bits$0(param){ + return bits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function int$1(bound){ + return int$0(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function full_int$0(bound){ + return full_int(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int32$0(bound){ + return int32(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function nativeint$0(bound){ + return nativeint(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int64$0(bound){ + return int64(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function float$1(scale){ + return float$0(caml_call1(Stdlib_Domain[10][2], random_key), scale); + } + function bool$0(param){ + return bool(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits32$0(param){ + return bits32(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits64$0(param){ + return caml_lxm_next(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function nativebits$0(param){ + return nativebits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function full_init(seed){ + return reinit(caml_call1(Stdlib_Domain[10][2], random_key), seed); + } + function init(seed){return full_init([0, seed]);} + function self_init(param){return full_init(caml_sys_random_seed(0));} + function split$0(param){ + return split(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function get_state(param){ + return copy(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function set_state(s){ + return caml_ba_blit(s, caml_call1(Stdlib_Domain[10][2], random_key)); + } + var + Stdlib_Random = + [0, + init, + full_init, + self_init, + bits$0, + int$1, + full_int$0, + int32$0, + nativeint$0, + int64$0, + float$1, + bool$0, + bits32$0, + bits64$0, + nativebits$0, + [0, + make, + make_self_init, + copy, + bits, + int$0, + full_int, + int32, + nativeint, + int64, + float$0, + bool, + bits32, + bits64, + nativebits, + split], + get_state, + set_state, + split$0]; + runtime.caml_register_global(29, Stdlib_Random, "Stdlib__Random"); + return; + } + (globalThis)); + +//# 18037 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_compare = runtime.caml_compare, + caml_hash = runtime.caml_hash, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array; + global_data.Assert_failure; + var + Stdlib_String = global_data.Stdlib__String, + cst_Hashtbl_unsupported_hash_t = "Hashtbl: unsupported hash table format", + _d_ = [0, 0]; + function ongoing_traversal(h){ + var _aB_ = h.length - 1 < 4 ? 1 : 0, _aC_ = _aB_ || (h[4] < 0 ? 1 : 0); + return _aC_; + } + function flip_ongoing_traversal(h){h[4] = - h[4] | 0; return 0;} + try{var _f_ = caml_sys_getenv("OCAMLRUNPARAM"), params = _f_;} + catch(_az_){ + var _a_ = caml_wrap_exception(_az_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + try{var _e_ = caml_sys_getenv("CAMLRUNPARAM"), _c_ = _e_;} + catch(_aA_){ + var _b_ = caml_wrap_exception(_aA_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var _c_ = cst; + } + var params = _c_; + } + var + randomized_default = caml_call2(Stdlib_String[14], params, 82), + randomized = caml_call1(Stdlib_Atomic[1], randomized_default); + function randomize(param){ + return caml_call2(Stdlib_Atomic[3], randomized, 1); + } + function is_randomized(param){ + return caml_call1(Stdlib_Atomic[2], randomized); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function power_2_above(x, n){ + var x$0 = x; + for(;;){ + if(n <= x$0) return x$0; + if(Stdlib_Sys[13] < (x$0 * 2 | 0)) return x$0; + var x$1 = x$0 * 2 | 0, x$0 = x$1; + } + } + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, initial_size); + if(random) + var + _ay_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _ay_); + else + var seed = 0; + return [0, 0, caml_make_vect(s, 0), seed, s]; + } + function clear(h){ + var _ax_ = 0 < h[1] ? 1 : 0; + return _ax_ + ? (h + [1] + = 0, + caml_call4(Stdlib_Array[7], h[2], 0, h[2].length - 1, 0)) + : _ax_; + } + function reset(h){ + var len = h[2].length - 1; + if(4 <= h.length - 1 && len !== caml_call1(Stdlib[18], h[4])){ + h[1] = 0; + h[2] = caml_make_vect(caml_call1(Stdlib[18], h[4]), 0); + return 0; + } + return clear(h); + } + function copy_bucketlist(param){ + if(! param) return 0; + var + key = param[1], + data = param[2], + next = param[3], + prec$1 = [0, key, data, next], + prec = prec$1, + param$0 = next; + for(;;){ + if(! param$0) return prec$1; + var + key$0 = param$0[1], + data$0 = param$0[2], + next$0 = param$0[3], + prec$0 = [0, key$0, data$0, next$0]; + prec[3] = prec$0; + var prec = prec$0, param$0 = next$0; + } + } + function copy(h){ + var + _au_ = h[4], + _av_ = h[3], + _aw_ = caml_call2(Stdlib_Array[13], copy_bucketlist, h[2]); + return [0, h[1], _aw_, _av_, _au_]; + } + function length(h){return h[1];} + function insert_all_buckets(indexfun, inplace, odata, ndata){ + var + nsize = ndata.length - 1, + ndata_tail = caml_make_vect(nsize, 0), + _ao_ = odata.length - 1 - 1 | 0, + _an_ = 0; + if(_ao_ >= 0){ + var i$0 = _an_; + a: + for(;;){ + var cell$1 = caml_check_bound(odata, i$0)[1 + i$0], cell = cell$1; + for(;;){ + if(cell){ + var + key = cell[1], + data = cell[2], + next = cell[3], + cell$0 = inplace ? cell : [0, key, data, 0], + nidx = caml_call1(indexfun, key), + match = caml_check_bound(ndata_tail, nidx)[1 + nidx]; + if(match) + match[3] = cell$0; + else + caml_check_bound(ndata, nidx)[1 + nidx] = cell$0; + caml_check_bound(ndata_tail, nidx)[1 + nidx] = cell$0; + var cell = next; + continue; + } + var _at_ = i$0 + 1 | 0; + if(_ao_ !== i$0){var i$0 = _at_; continue a;} + break; + } + break; + } + } + if(inplace){ + var _aq_ = nsize - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + var match$0 = caml_check_bound(ndata_tail, i)[1 + i]; + if(match$0) match$0[3] = 0; + var _as_ = i + 1 | 0; + if(_aq_ !== i){var i = _as_; continue;} + break; + } + } + var _ar_ = 0; + } + else + var _ar_ = inplace; + return _ar_; + } + function resize(indexfun, h){ + var + odata = h[2], + osize = odata.length - 1, + nsize = osize * 2 | 0, + _am_ = nsize < Stdlib_Sys[13] ? 1 : 0; + if(! _am_) return _am_; + var ndata = caml_make_vect(nsize, 0), inplace = 1 - ongoing_traversal(h); + h[2] = ndata; + return insert_all_buckets(caml_call1(indexfun, h), inplace, odata, ndata); + } + function iter(f, h){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], _ai_ = d.length - 1 - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + a: + for(;;){ + var param = caml_check_bound(d, i)[1 + i]; + for(;;){ + if(param){ + var key = param[1], data = param[2], next = param[3]; + caml_call2(f, key, data); + var param = next; + continue; + } + var _al_ = i + 1 | 0; + if(_ai_ !== i){var i = _al_; continue a;} + break; + } + break; + } + } + var _aj_ = 1 - old_trav, _ak_ = _aj_ ? flip_ongoing_traversal(h) : _aj_; + return _ak_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function filter_map_inplace(f, h){ + var d = h[2], old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var _ad_ = d.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + a: + for(;;){ + var slot$0 = caml_check_bound(h[2], i)[1 + i], prec = 0, slot = slot$0; + for(;;){ + if(slot){ + var + key = slot[1], + data = slot[2], + next = slot[3], + match = caml_call2(f, key, data); + if(! match){h[1] = h[1] - 1 | 0; var slot = next; continue;} + var data$0 = match[1]; + if(prec) + prec[3] = slot; + else + caml_check_bound(h[2], i)[1 + i] = slot; + slot[2] = data$0; + var prec = slot, slot = next; + continue; + } + if(prec) prec[3] = 0; else caml_check_bound(h[2], i)[1 + i] = 0; + var _ag_ = i + 1 | 0; + if(_ad_ !== i){var i = _ag_; continue a;} + break; + } + break; + } + } + var _ae_ = 1 - old_trav, _af_ = _ae_ ? flip_ongoing_traversal(h) : _ae_; + return _af_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function fold(f, h, init){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], accu$1 = [0, init], _$_ = d.length - 1 - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i = ___; + a: + for(;;){ + var + accu$2 = accu$1[1], + b$0 = caml_check_bound(d, i)[1 + i], + b = b$0, + accu = accu$2; + for(;;){ + if(b){ + var + key = b[1], + data = b[2], + next = b[3], + accu$0 = caml_call3(f, key, data, accu), + b = next, + accu = accu$0; + continue; + } + accu$1[1] = accu; + var _ab_ = i + 1 | 0; + if(_$_ !== i){var i = _ab_; continue a;} + break; + } + break; + } + } + if(1 - old_trav) flip_ongoing_traversal(h); + var _aa_ = accu$1[1]; + return _aa_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + next = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = next; + } + } + function stats(h){ + var _U_ = h[2], _V_ = 0; + function _W_(m, b){ + var _Z_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _Z_); + } + var + mbl = caml_call3(Stdlib_Array[15], _W_, _V_, _U_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _X_ = h[2]; + function _Y_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _Y_, _X_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function to_seq(tbl){ + var tbl_data = tbl[2]; + function aux(i, buck, param){ + var i$0 = i, buck$0 = buck; + for(;;){ + if(buck$0){ + var key = buck$0[1], data = buck$0[2], next = buck$0[3]; + return [0, [0, key, data], function(_T_){return aux(i$0, next, _T_);}]; + } + if(i$0 === tbl_data.length - 1) return 0; + var + buck$1 = caml_check_bound(tbl_data, i$0)[1 + i$0], + i$1 = i$0 + 1 | 0, + i$0 = i$1, + buck$0 = buck$1; + } + } + var _Q_ = 0, _R_ = 0; + return function(_S_){return aux(_R_, _Q_, _S_);}; + } + function to_seq_keys(m){ + var _N_ = to_seq(m); + function _O_(_P_){return _P_[1];} + return caml_call2(Stdlib_Seq[27], _O_, _N_); + } + function to_seq_values(m){ + var _K_ = to_seq(m); + function _L_(_M_){return _M_[2];} + return caml_call2(Stdlib_Seq[27], _L_, _K_); + } + function MakeSeeded(H){ + function key_index(h, key){ + var _J_ = h[2].length - 1 - 1 | 0; + return caml_call2(H[2], h[3], key) & _J_; + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _I_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _I_ ? resize(key_index, h) : _I_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(caml_call2(H[1], k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var + _H_ = key_index(h, key), + match = caml_check_bound(h[2], _H_)[1 + _H_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var + _G_ = key_index(h, key), + match = caml_check_bound(h[2], _G_)[1 + _G_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], d = param$0[2], next = param$0[3]; + if(caml_call2(H[1], k, key)) return [0, d, find_in_bucket(next)]; + var param$0 = next; + } + } + var _F_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _F_)[1 + _F_]); + } + function replace(h, key, data){ + var + i = key_index(h, key), + l = caml_check_bound(h[2], i)[1 + i], + slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(! caml_call2(H[1], k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _C_ = 0; + } + else + var _C_ = 1; + if(_C_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _D_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_D_) return resize(key_index, h); + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function mem(h, key){ + var + _B_ = key_index(h, key), + param = caml_check_bound(h[2], _B_)[1 + _B_]; + for(;;){ + if(! param) return 0; + var k = param[1], next = param[3], _A_ = caml_call2(H[1], k, key); + if(_A_) return _A_; + var param = next; + } + } + function add_seq(tbl, i){ + function _z_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _z_, i); + } + function replace_seq(tbl, i){ + function _y_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _y_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + iter = include[12], + filter_map_inplace = include[13], + fold = include[14], + length = include[15], + stats = include[16], + to_seq = include[17], + to_seq_keys = include[18], + to_seq_values = include[19], + add_seq = include[20], + replace_seq = include[21], + _x_ = include[1]; + function create(sz){return caml_call2(_x_, _d_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function hash(x){return caml_hash(10, 100, 0, x);} + function hash_param(n1, n2, x){return caml_hash(n1, n2, 0, x);} + function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);} + function key_index(h, key){ + return 4 <= h.length - 1 + ? caml_hash(10, 100, h[3], key) & (h[2].length - 1 - 1 | 0) + : caml_call1(Stdlib[1], cst_Hashtbl_unsupported_hash_t); + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _w_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _w_ ? resize(key_index, h) : _w_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(0 === caml_compare(k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var _v_ = key_index(h, key), match = caml_check_bound(h[2], _v_)[1 + _v_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var _u_ = key_index(h, key), match = caml_check_bound(h[2], _u_)[1 + _u_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], data = param$0[2], next = param$0[3]; + if(0 === caml_compare(k, key)) return [0, data, find_in_bucket(next)]; + var param$0 = next; + } + } + var _t_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _t_)[1 + _t_]); + } + function replace(h, key, data){ + var i = key_index(h, key), l = caml_check_bound(h[2], i)[1 + i], slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(0 !== caml_compare(k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _q_ = 0; + } + else + var _q_ = 1; + if(_q_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _r_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_r_) return resize(key_index, h); + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function mem(h, key){ + var _p_ = key_index(h, key), param = caml_check_bound(h[2], _p_)[1 + _p_]; + for(;;){ + if(! param) return 0; + var + k = param[1], + next = param[3], + _o_ = 0 === caml_compare(k, key) ? 1 : 0; + if(_o_) return _o_; + var param = next; + } + } + function add_seq(tbl, i){ + function _n_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _n_, i); + } + function replace_seq(tbl, i){ + function _m_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _m_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + function rebuild(opt, h){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, h[2].length - 1); + if(random) + var + _g_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _g_); + else + var seed = 4 <= h.length - 1 ? h[3] : 0; + var + _h_ = 4 <= h.length - 1 ? h[4] : s, + h$0 = [0, h[1], caml_make_vect(s, 0), seed, _h_], + _i_ = h$0[2], + _j_ = h[2], + _k_ = 0; + insert_all_buckets + (function(_l_){return key_index(h$0, _l_);}, _k_, _j_, _i_); + return h$0; + } + var + Stdlib_Hashtbl = + [0, + create, + clear, + reset, + copy, + add, + find, + find_opt, + find_all, + mem, + remove, + replace, + iter, + filter_map_inplace, + fold, + length, + randomize, + is_randomized, + rebuild, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq, + Make, + MakeSeeded, + hash, + seeded_hash, + hash_param, + caml_hash]; + runtime.caml_register_global(16, Stdlib_Hashtbl, "Stdlib__Hashtbl"); + return; + } + (globalThis)); + +//# 19349 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$16 = "", + cst$15 = ">", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$14 = ".", + cst$11 = cst$15, + cst$12 = "<\/", + cst$13 = cst$16, + cst$8 = cst$15, + cst$9 = "<", + cst$10 = cst$16, + cst$7 = "\n", + cst$3 = cst$16, + cst$4 = cst$16, + cst$5 = cst$16, + cst$6 = cst$16, + cst = cst$16, + cst$0 = cst$16, + cst$1 = cst$16, + cst$2 = cst$16, + Stdlib_Queue = global_data.Stdlib__Queue, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _f_ = [3, 0, 3], + cst_Format_pp_set_geometry = "Format.pp_set_geometry: ", + _e_ = [1, "max_indent < 2"], + _c_ = [1, "margin <= max_indent"], + _d_ = [0, 0], + _b_ = [0, cst$16], + _a_ = [0, cst$16, 0, cst$16], + cst_Stdlib_Format_String_tag = "Stdlib.Format.String_tag"; + function id(x){return x;} + var + String_tag = + [248, cst_Stdlib_Format_String_tag, runtime.caml_fresh_oo_id(0)], + zero = 0, + unknown = -1; + function pp_enqueue(state, token){ + state[13] = state[13] + token[3] | 0; + return caml_call2(Stdlib_Queue[3], token, state[28]); + } + var pp_infinity = 1000000010; + function pp_output_string(state, s){ + return caml_call3(state[17], s, 0, caml_ml_string_length(s)); + } + function pp_output_newline(state){return caml_call1(state[19], 0);} + function format_pp_text(state, size, text){ + state[9] = state[9] - size | 0; + pp_output_string(state, text); + state[11] = 0; + return 0; + } + function format_string(state, s){ + var _bQ_ = runtime.caml_string_notequal(s, cst$16); + return _bQ_ ? format_pp_text(state, caml_ml_string_length(s), s) : _bQ_; + } + function break_new_line(state, param, width){ + var after = param[3], offset = param[2], before = param[1]; + format_string(state, before); + pp_output_newline(state); + state[11] = 1; + var + indent = (state[6] - width | 0) + offset | 0, + real_indent = caml_call2(Stdlib_Int[10], state[8], indent); + state[10] = real_indent; + state[9] = state[6] - state[10] | 0; + var n = state[10]; + caml_call1(state[21], n); + return format_string(state, after); + } + function break_line(state, width){ + return break_new_line(state, _a_, width); + } + function break_same_line(state, param){ + var after = param[3], width = param[2], before = param[1]; + format_string(state, before); + state[9] = state[9] - width | 0; + caml_call1(state[20], width); + return format_string(state, after); + } + function format_pp_token(state, size$0, param){ + if(typeof param === "number") + switch(param){ + case 0: + var match$3 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$3) return 0; + var + tabs = match$3[1][1], + add_tab = + function(n, ls){ + if(! ls) return [0, n, 0]; + var l = ls[2], x = ls[1]; + return runtime.caml_lessthan(n, x) + ? [0, n, ls] + : [0, x, add_tab(n, l)]; + }; + tabs[1] = add_tab(state[6] - state[9] | 0, tabs[1]); + return 0; + case 1: + caml_call1(Stdlib_Stack[5], state[2]); return 0; + case 2: + caml_call1(Stdlib_Stack[5], state[3]); return 0; + case 3: + var match$4 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$4) return pp_output_newline(state); + var width$0 = match$4[1][2]; + return break_line(state, width$0); + case 4: + var _bO_ = state[10] !== (state[6] - state[9] | 0) ? 1 : 0; + if(! _bO_) return _bO_; + var match$1 = caml_call1(Stdlib_Queue[6], state[28]); + if(! match$1) return 0; + var match$2 = match$1[1], size = match$2[1], length = match$2[3]; + state[12] = state[12] - length | 0; + state[9] = state[9] + size | 0; + return 0; + default: + var match$5 = caml_call1(Stdlib_Stack[5], state[5]); + if(! match$5) return 0; + var tag_name = match$5[1], marker = caml_call1(state[25], tag_name); + return pp_output_string(state, marker); + } + switch(param[0]){ + case 0: + var s = param[1]; return format_pp_text(state, size$0, s); + case 1: + var + breaks = param[2], + fits = param[1], + off = breaks[2], + before = breaks[1], + match$6 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$6) return 0; + var + match$7 = match$6[1], + width$1 = match$7[2], + box_type$0 = match$7[1]; + switch(box_type$0){ + case 0: + return break_same_line(state, fits); + case 1: + return break_new_line(state, breaks, width$1); + case 2: + return break_new_line(state, breaks, width$1); + case 3: + return state[9] < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + case 4: + return state[11] + ? break_same_line(state, fits) + : state + [9] + < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : ((state + [6] + - width$1 + | 0) + + off + | 0) + < state[10] + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + default: return break_same_line(state, fits); + } + case 2: + var + off$0 = param[2], + n = param[1], + insertion_point = state[6] - state[9] | 0, + match$8 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$8) return 0; + var tabs$0 = match$8[1][1], match$9 = tabs$0[1]; + if(match$9){ + var first = match$9[1], param$0 = tabs$0[1]; + for(;;){ + if(param$0){ + var tail = param$0[2], head = param$0[1]; + if(insertion_point > head){var param$0 = tail; continue;} + var _bP_ = head; + } + else + var _bP_ = first; + var tab = _bP_; + break; + } + } + else + var tab = insertion_point; + var offset = tab - insertion_point | 0; + return 0 <= offset + ? break_same_line(state, [0, cst$0, offset + n | 0, cst]) + : break_new_line + (state, [0, cst$2, tab + off$0 | 0, cst$1], state[6]); + case 3: + var + ty = param[2], + off$1 = param[1], + insertion_point$0 = state[6] - state[9] | 0; + if(state[8] < insertion_point$0){ + var match = caml_call1(Stdlib_Stack[7], state[2]); + if(match){ + var match$0 = match[1], width = match$0[2], box_type = match$0[1]; + if(state[9] < width && 3 >= box_type - 1 >>> 0) + break_line(state, width); + } + else + pp_output_newline(state); + } + var + width$2 = state[9] - off$1 | 0, + box_type$1 = 1 === ty ? 1 : state[9] < size$0 ? ty : 5; + return caml_call2(Stdlib_Stack[3], [0, box_type$1, width$2], state[2]); + case 4: + var tbox = param[1]; + return caml_call2(Stdlib_Stack[3], tbox, state[3]); + default: + var + tag_name$0 = param[1], + marker$0 = caml_call1(state[24], tag_name$0); + pp_output_string(state, marker$0); + return caml_call2(Stdlib_Stack[3], tag_name$0, state[5]); + } + } + function advance_left(state){ + for(;;){ + var match = caml_call1(Stdlib_Queue[9], state[28]); + if(! match) return 0; + var + match$0 = match[1], + size = match$0[1], + length = match$0[3], + token = match$0[2], + pending_count = state[13] - state[12] | 0, + _bM_ = 0 <= size ? 1 : 0, + _bN_ = _bM_ || (state[9] <= pending_count ? 1 : 0); + if(! _bN_) return _bN_; + caml_call1(Stdlib_Queue[5], state[28]); + var size$0 = 0 <= size ? size : pp_infinity; + format_pp_token(state, size$0, token); + state[12] = length + state[12] | 0; + } + } + function enqueue_advance(state, tok){ + pp_enqueue(state, tok); + return advance_left(state); + } + function enqueue_string_as(state, size, s){ + return enqueue_advance(state, [0, size, [0, s], size]); + } + function initialize_scan_stack(stack){ + caml_call1(Stdlib_Stack[8], stack); + var queue_elem = [0, unknown, _b_, 0]; + return caml_call2(Stdlib_Stack[3], [0, -1, queue_elem], stack); + } + function set_size(state, ty){ + var match = caml_call1(Stdlib_Stack[7], state[1]); + if(! match) return 0; + var + match$0 = match[1], + queue_elem = match$0[2], + left_total = match$0[1], + size = queue_elem[1]; + if(left_total < state[12]) return initialize_scan_stack(state[1]); + var _bI_ = queue_elem[2]; + if(typeof _bI_ !== "number") + switch(_bI_[0]){ + case 3: + var + _bK_ = 1 - ty, + _bL_ = + _bK_ + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : _bK_; + return _bL_; + case 1: + case 2: + var + _bJ_ = + ty + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : ty; + return _bJ_; + } + return 0; + } + function scan_push(state, b, token){ + pp_enqueue(state, token); + if(b) set_size(state, 1); + var elem = [0, state[13], token]; + return caml_call2(Stdlib_Stack[3], elem, state[1]); + } + function pp_open_box_gen(state, indent, br_ty){ + state[14] = state[14] + 1 | 0; + if(state[14] < state[15]){ + var size = - state[13] | 0, elem = [0, size, [3, indent, br_ty], 0]; + return scan_push(state, 0, elem); + } + var _bH_ = state[14] === state[15] ? 1 : 0; + if(! _bH_) return _bH_; + var s = state[16]; + return enqueue_string_as(state, caml_ml_string_length(s), s); + } + function pp_close_box(state, param){ + var _bF_ = 1 < state[14] ? 1 : 0; + if(_bF_){ + if(state[14] < state[15]){ + pp_enqueue(state, [0, zero, 1, 0]); + set_size(state, 1); + set_size(state, 0); + } + state[14] = state[14] - 1 | 0; + var _bG_ = 0; + } + else + var _bG_ = _bF_; + return _bG_; + } + function pp_open_stag(state, tag_name){ + if(state[22]){ + caml_call2(Stdlib_Stack[3], tag_name, state[4]); + caml_call1(state[26], tag_name); + } + var _bE_ = state[23]; + if(! _bE_) return _bE_; + var token = [5, tag_name]; + return pp_enqueue(state, [0, zero, token, 0]); + } + function pp_close_stag(state, param){ + if(state[23]) pp_enqueue(state, [0, zero, 5, 0]); + var _bC_ = state[22]; + if(_bC_){ + var match = caml_call1(Stdlib_Stack[5], state[4]); + if(match){ + var tag_name = match[1]; + return caml_call1(state[27], tag_name); + } + var _bD_ = 0; + } + else + var _bD_ = _bC_; + return _bD_; + } + function pp_set_print_tags(state, b){state[22] = b; return 0;} + function pp_set_mark_tags(state, b){state[23] = b; return 0;} + function pp_get_print_tags(state, param){return state[22];} + function pp_get_mark_tags(state, param){return state[23];} + function pp_set_tags(state, b){ + pp_set_print_tags(state, b); + return pp_set_mark_tags(state, b); + } + function pp_get_formatter_stag_function(state, param){ + return [0, state[24], state[25], state[26], state[27]]; + } + function pp_set_formatter_stag_function(state, param){ + var pct = param[4], pot = param[3], mct = param[2], mot = param[1]; + state[24] = mot; + state[25] = mct; + state[26] = pot; + state[27] = pct; + return 0; + } + function pp_rinit(state){ + state[12] = 1; + state[13] = 1; + caml_call1(Stdlib_Queue[11], state[28]); + initialize_scan_stack(state[1]); + caml_call1(Stdlib_Stack[8], state[2]); + caml_call1(Stdlib_Stack[8], state[3]); + caml_call1(Stdlib_Stack[8], state[4]); + caml_call1(Stdlib_Stack[8], state[5]); + state[10] = 0; + state[14] = 0; + state[9] = state[6]; + return pp_open_box_gen(state, 0, 3); + } + function pp_flush_queue(state, b){ + var _bA_ = state[4]; + function _bB_(param){return pp_close_stag(state, 0);} + caml_call2(Stdlib_Stack[12], _bB_, _bA_); + for(;;){ + if(1 < state[14]){pp_close_box(state, 0); continue;} + state[13] = pp_infinity; + advance_left(state); + if(b) pp_output_newline(state); + return pp_rinit(state); + } + } + function pp_print_as_size(state, size, s){ + var _bz_ = state[14] < state[15] ? 1 : 0; + return _bz_ ? enqueue_string_as(state, size, s) : _bz_; + } + function pp_print_as(state, isize, s){ + return pp_print_as_size(state, isize, s); + } + function pp_print_string(state, s){ + return pp_print_as(state, caml_ml_string_length(s), s); + } + function pp_print_bytes(state, s){ + return pp_print_as + (state, + runtime.caml_ml_bytes_length(s), + caml_call1(Stdlib_Bytes[6], s)); + } + function pp_print_int(state, i){ + return pp_print_string(state, caml_call1(Stdlib_Int[12], i)); + } + function pp_print_float(state, f){ + return pp_print_string(state, caml_call1(Stdlib[35], f)); + } + function pp_print_bool(state, b){ + return pp_print_string(state, caml_call1(Stdlib[30], b)); + } + function pp_print_char(state, c){ + return pp_print_as(state, 1, caml_call2(Stdlib_String[1], 1, c)); + } + function pp_open_hbox(state, param){return pp_open_box_gen(state, 0, 0);} + function pp_open_vbox(state, indent){ + return pp_open_box_gen(state, indent, 1); + } + function pp_open_hvbox(state, indent){ + return pp_open_box_gen(state, indent, 2); + } + function pp_open_hovbox(state, indent){ + return pp_open_box_gen(state, indent, 3); + } + function pp_open_box(state, indent){ + return pp_open_box_gen(state, indent, 4); + } + function pp_print_newline(state, param){ + pp_flush_queue(state, 1); + return caml_call1(state[18], 0); + } + function pp_print_flush(state, param){ + pp_flush_queue(state, 0); + return caml_call1(state[18], 0); + } + function pp_force_newline(state, param){ + var _by_ = state[14] < state[15] ? 1 : 0; + return _by_ ? enqueue_advance(state, [0, zero, 3, 0]) : _by_; + } + function pp_print_if_newline(state, param){ + var _bx_ = state[14] < state[15] ? 1 : 0; + return _bx_ ? enqueue_advance(state, [0, zero, 4, 0]) : _bx_; + } + function pp_print_custom_break(state, fits, breaks){ + var + after = fits[3], + width = fits[2], + before = fits[1], + _bw_ = state[14] < state[15] ? 1 : 0; + if(! _bw_) return _bw_; + var + size = - state[13] | 0, + token = [1, fits, breaks], + length = + (caml_ml_string_length(before) + width | 0) + + caml_ml_string_length(after) + | 0, + elem = [0, size, token, length]; + return scan_push(state, 1, elem); + } + function pp_print_break(state, width, offset){ + return pp_print_custom_break + (state, [0, cst$6, width, cst$5], [0, cst$4, offset, cst$3]); + } + function pp_print_space(state, param){return pp_print_break(state, 1, 0);} + function pp_print_cut(state, param){return pp_print_break(state, 0, 0);} + function pp_open_tbox(state, param){ + state[14] = state[14] + 1 | 0; + var _bv_ = state[14] < state[15] ? 1 : 0; + if(! _bv_) return _bv_; + var elem = [0, zero, [4, [0, [0, 0]]], 0]; + return enqueue_advance(state, elem); + } + function pp_close_tbox(state, param){ + var _bs_ = 1 < state[14] ? 1 : 0; + if(_bs_){ + var _bt_ = state[14] < state[15] ? 1 : 0; + if(_bt_){ + var elem = [0, zero, 2, 0]; + enqueue_advance(state, elem); + state[14] = state[14] - 1 | 0; + var _bu_ = 0; + } + else + var _bu_ = _bt_; + } + else + var _bu_ = _bs_; + return _bu_; + } + function pp_print_tbreak(state, width, offset){ + var _br_ = state[14] < state[15] ? 1 : 0; + if(! _br_) return _br_; + var size = - state[13] | 0, elem = [0, size, [2, width, offset], width]; + return scan_push(state, 1, elem); + } + function pp_print_tab(state, param){return pp_print_tbreak(state, 0, 0);} + function pp_set_tab(state, param){ + var _bq_ = state[14] < state[15] ? 1 : 0; + if(! _bq_) return _bq_; + var elem = [0, zero, 0, 0]; + return enqueue_advance(state, elem); + } + function pp_set_max_boxes(state, n){ + var _bo_ = 1 < n ? 1 : 0, _bp_ = _bo_ ? (state[15] = n, 0) : _bo_; + return _bp_; + } + function pp_get_max_boxes(state, param){return state[15];} + function pp_over_max_boxes(state, param){return state[14] === state[15] ? 1 : 0; + } + function pp_set_ellipsis_text(state, s){state[16] = s; return 0;} + function pp_get_ellipsis_text(state, param){return state[16];} + function pp_limit(n){return n < 1000000010 ? n : 1000000009;} + function pp_set_max_indent(state, n$0){ + var _bn_ = 1 < n$0 ? 1 : 0; + if(! _bn_) return _bn_; + var n$1 = state[6] - n$0 | 0, _bm_ = 1 <= n$1 ? 1 : 0; + if(! _bm_) return _bm_; + var n = pp_limit(n$1); + state[7] = n; + state[8] = state[6] - state[7] | 0; + return pp_rinit(state); + } + function pp_get_max_indent(state, param){return state[8];} + function pp_set_margin(state, n){ + var _bk_ = 1 <= n ? 1 : 0; + if(! _bk_) return _bk_; + var n$0 = pp_limit(n); + state[6] = n$0; + if(state[8] <= state[6]) + var new_max_indent = state[8]; + else + var + _bl_ = + caml_call2(Stdlib_Int[11], state[6] - state[7] | 0, state[6] / 2 | 0), + new_max_indent = caml_call2(Stdlib_Int[11], _bl_, 1); + return pp_set_max_indent(state, new_max_indent); + } + function validate_geometry(param){ + var margin = param[2], max_indent = param[1]; + return 2 <= max_indent ? margin <= max_indent ? _c_ : _d_ : _e_; + } + function check_geometry(geometry){ + return 0 === validate_geometry(geometry)[0] ? 1 : 0; + } + function pp_get_margin(state, param){return state[6];} + function pp_set_full_geometry(state, param){ + var margin = param[2], max_indent = param[1]; + pp_set_margin(state, margin); + pp_set_max_indent(state, max_indent); + return 0; + } + function pp_set_geometry(state, max_indent, margin){ + var + geometry = [0, max_indent, margin], + match = validate_geometry(geometry); + if(0 === match[0]) return pp_set_full_geometry(state, geometry); + var + msg = match[1], + _bj_ = caml_call2(Stdlib[28], cst_Format_pp_set_geometry, msg); + throw caml_maybe_attach_backtrace([0, Stdlib[6], _bj_], 1); + } + function pp_safe_set_geometry(state, max_indent, margin){ + var geometry = [0, max_indent, margin]; + return 0 === validate_geometry(geometry)[0] + ? pp_set_full_geometry(state, geometry) + : 0; + } + function pp_get_geometry(state, param){return [0, state[8], state[6]];} + function pp_update_geometry(state, update){ + var geometry = pp_get_geometry(state, 0); + return pp_set_full_geometry(state, caml_call1(update, geometry)); + } + function pp_set_formatter_out_functions(state, param){ + var j = param[5], i = param[4], h = param[3], g = param[2], f = param[1]; + state[17] = f; + state[18] = g; + state[19] = h; + state[20] = i; + state[21] = j; + return 0; + } + function pp_get_formatter_out_functions(state, param){ + return [0, state[17], state[18], state[19], state[20], state[21]]; + } + function pp_set_formatter_output_functi(state, f, g){state[17] = f; state[18] = g; return 0; + } + function pp_get_formatter_output_functi(state, param){return [0, state[17], state[18]]; + } + function display_newline(state, param){ + return caml_call3(state[17], cst$7, 0, 1); + } + var blank_line = caml_call2(Stdlib_String[1], 80, 32); + function display_blanks(state, n){ + var n$0 = n; + for(;;){ + var _bi_ = 0 < n$0 ? 1 : 0; + if(! _bi_) return _bi_; + if(80 >= n$0) return caml_call3(state[17], blank_line, 0, n$0); + caml_call3(state[17], blank_line, 0, 80); + var n$1 = n$0 - 80 | 0, n$0 = n$1; + } + } + function pp_set_formatter_out_channel(state, oc){ + state[17] = caml_call1(Stdlib[69], oc); + state[18] = function(param){return caml_call1(Stdlib[63], oc);}; + state[19] = function(_bh_){return display_newline(state, _bh_);}; + state[20] = function(_bg_){return display_blanks(state, _bg_);}; + state[21] = function(_bf_){return display_blanks(state, _bf_);}; + return 0; + } + function default_pp_mark_open_tag(param){ + if(param[1] !== String_tag) return cst$10; + var s = param[2], _be_ = caml_call2(Stdlib[28], s, cst$8); + return caml_call2(Stdlib[28], cst$9, _be_); + } + function default_pp_mark_close_tag(param){ + if(param[1] !== String_tag) return cst$13; + var s = param[2], _bd_ = caml_call2(Stdlib[28], s, cst$11); + return caml_call2(Stdlib[28], cst$12, _bd_); + } + function default_pp_print_open_tag(_bc_){return 0;} + function default_pp_print_close_tag(_bb_){return 0;} + function pp_make_formatter(f, g, h, i, j){ + var + pp_queue = caml_call1(Stdlib_Queue[2], 0), + sys_tok = [0, unknown, _f_, 0]; + caml_call2(Stdlib_Queue[3], sys_tok, pp_queue); + var scan_stack = caml_call1(Stdlib_Stack[2], 0); + initialize_scan_stack(scan_stack); + caml_call2(Stdlib_Stack[3], [0, 1, sys_tok], scan_stack); + var + _a9_ = Stdlib[19], + _a__ = caml_call1(Stdlib_Stack[2], 0), + _a$_ = caml_call1(Stdlib_Stack[2], 0), + _ba_ = caml_call1(Stdlib_Stack[2], 0); + return [0, + scan_stack, + caml_call1(Stdlib_Stack[2], 0), + _ba_, + _a$_, + _a__, + 78, + 10, + 68, + 78, + 0, + 1, + 1, + 1, + 1, + _a9_, + cst$14, + f, + g, + h, + i, + j, + 0, + 0, + default_pp_mark_open_tag, + default_pp_mark_close_tag, + default_pp_print_open_tag, + default_pp_print_close_tag, + pp_queue]; + } + function formatter_of_out_functions(out_funs){ + return pp_make_formatter + (out_funs[1], out_funs[2], out_funs[3], out_funs[4], out_funs[5]); + } + function make_formatter(output, flush){ + function _a1_(_a8_){return 0;} + function _a2_(_a7_){return 0;} + var + ppf = + pp_make_formatter(output, flush, function(_a6_){return 0;}, _a2_, _a1_); + ppf[19] = function(_a5_){return display_newline(ppf, _a5_);}; + ppf[20] = function(_a4_){return display_blanks(ppf, _a4_);}; + ppf[21] = function(_a3_){return display_blanks(ppf, _a3_);}; + return ppf; + } + function formatter_of_out_channel(oc){ + function _a0_(param){return caml_call1(Stdlib[63], oc);} + return make_formatter(caml_call1(Stdlib[69], oc), _a0_); + } + function formatter_of_buffer(b){ + function _aY_(_aZ_){return 0;} + return make_formatter(caml_call1(Stdlib_Buffer[18], b), _aY_); + } + var pp_buffer_size = 512; + function pp_make_buffer(param){ + return caml_call1(Stdlib_Buffer[1], pp_buffer_size); + } + var + stdbuf = pp_make_buffer(0), + std_formatter = formatter_of_out_channel(Stdlib[39]), + err_formatter = formatter_of_out_channel(Stdlib[40]), + str_formatter = formatter_of_buffer(stdbuf), + stdbuf_key = caml_call2(Stdlib_Domain[10][1], 0, pp_make_buffer); + caml_call2(Stdlib_Domain[10][3], stdbuf_key, stdbuf); + function _g_(param){ + return formatter_of_buffer(caml_call1(Stdlib_Domain[10][2], stdbuf_key)); + } + var str_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _g_); + caml_call2(Stdlib_Domain[10][3], str_formatter_key, str_formatter); + function buffered_out_string(key, str, ofs, len){ + var _aX_ = caml_call1(Stdlib_Domain[10][2], key); + return caml_call4(Stdlib_Buffer[18], _aX_, str, ofs, len); + } + function buffered_out_flush(oc, key, param){ + var + buf = caml_call1(Stdlib_Domain[10][2], key), + len = caml_call1(Stdlib_Buffer[7], buf), + str = caml_call1(Stdlib_Buffer[2], buf); + caml_call4(Stdlib[69], oc, str, 0, len); + caml_call1(Stdlib[63], oc); + return caml_call1(Stdlib_Buffer[8], buf); + } + function _h_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var std_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _h_); + function _i_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var err_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _i_); + function _j_(param){ + function _aG_(_aW_){return 0;} + function _aH_(_aV_){return 0;} + function _aI_(_aU_){return 0;} + var _aJ_ = Stdlib[39]; + function _aK_(_aT_){return buffered_out_flush(_aJ_, std_buf_key, _aT_);} + var + ppf = + pp_make_formatter + (function(_aQ_, _aR_, _aS_){ + return buffered_out_string(std_buf_key, _aQ_, _aR_, _aS_); + }, + _aK_, + _aI_, + _aH_, + _aG_); + ppf[19] = function(_aP_){return display_newline(ppf, _aP_);}; + ppf[20] = function(_aO_){return display_blanks(ppf, _aO_);}; + ppf[21] = function(_aN_){return display_blanks(ppf, _aN_);}; + function _aL_(_aM_){return pp_print_flush(ppf, _aM_);} + caml_call1(Stdlib_Domain[6], _aL_); + return ppf; + } + var std_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _j_); + caml_call2(Stdlib_Domain[10][3], std_formatter_key, std_formatter); + function _k_(param){ + function _ap_(_aF_){return 0;} + function _aq_(_aE_){return 0;} + function _ar_(_aD_){return 0;} + var _as_ = Stdlib[40]; + function _at_(_aC_){return buffered_out_flush(_as_, err_buf_key, _aC_);} + var + ppf = + pp_make_formatter + (function(_az_, _aA_, _aB_){ + return buffered_out_string(err_buf_key, _az_, _aA_, _aB_); + }, + _at_, + _ar_, + _aq_, + _ap_); + ppf[19] = function(_ay_){return display_newline(ppf, _ay_);}; + ppf[20] = function(_ax_){return display_blanks(ppf, _ax_);}; + ppf[21] = function(_aw_){return display_blanks(ppf, _aw_);}; + function _au_(_av_){return pp_print_flush(ppf, _av_);} + caml_call1(Stdlib_Domain[6], _au_); + return ppf; + } + var err_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _k_); + caml_call2(Stdlib_Domain[10][3], err_formatter_key, err_formatter); + function get_std_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key); + } + function get_err_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], err_formatter_key); + } + function get_str_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], str_formatter_key); + } + function get_stdbuf(param){ + return caml_call1(Stdlib_Domain[10][2], stdbuf_key); + } + function flush_buffer_formatter(buf, ppf){ + pp_flush_queue(ppf, 0); + var s = caml_call1(Stdlib_Buffer[2], buf); + caml_call1(Stdlib_Buffer[9], buf); + return s; + } + function flush_str_formatter(param){ + var + stdbuf = caml_call1(Stdlib_Domain[10][2], stdbuf_key), + str_formatter = caml_call1(Stdlib_Domain[10][2], str_formatter_key); + return flush_buffer_formatter(stdbuf, str_formatter); + } + function make_synchronized_formatter(output, flush){ + function _an_(param){ + var + buf = caml_call1(Stdlib_Buffer[1], pp_buffer_size), + output$0 = caml_call1(Stdlib_Buffer[18], buf); + function flush$0(param){ + var _ao_ = caml_call1(Stdlib_Buffer[7], buf); + caml_call3(output, caml_call1(Stdlib_Buffer[2], buf), 0, _ao_); + caml_call1(Stdlib_Buffer[8], buf); + return caml_call1(flush, 0); + } + return make_formatter(output$0, flush$0); + } + return caml_call2(Stdlib_Domain[10][1], 0, _an_); + } + function synchronized_formatter_of_out_(oc){ + function _am_(param){return caml_call1(Stdlib[63], oc);} + return make_synchronized_formatter(caml_call1(Stdlib[69], oc), _am_); + } + function make_symbolic_output_buffer(param){return [0, 0];} + function clear_symbolic_output_buffer(sob){sob[1] = 0; return 0;} + function get_symbolic_output_buffer(sob){ + return caml_call1(Stdlib_List[9], sob[1]); + } + function flush_symbolic_output_buffer(sob){ + var items = get_symbolic_output_buffer(sob); + clear_symbolic_output_buffer(sob); + return items; + } + function add_symbolic_output_item(sob, item){sob[1] = [0, item, sob[1]]; return 0; + } + function formatter_of_symbolic_output_b(sob){ + function f(s, i, n){ + return add_symbolic_output_item + (sob, [0, caml_call3(Stdlib_String[15], s, i, n)]); + } + function g(_al_){return add_symbolic_output_item(sob, 0);} + function h(_ak_){return add_symbolic_output_item(sob, 1);} + function i(n){return add_symbolic_output_item(sob, [1, n]);} + function j(n){return add_symbolic_output_item(sob, [2, n]);} + return pp_make_formatter(f, g, h, i, j); + } + function open_hbox(v){ + return pp_open_hbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_vbox(v){ + return pp_open_vbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hvbox(v){ + return pp_open_hvbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hovbox(v){ + return pp_open_hovbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_box(v){ + return pp_open_box(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_box(v){ + return pp_close_box + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_stag(v){ + return pp_open_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_stag(v){ + return pp_close_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_as(v, w){ + return pp_print_as + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_string(v){ + return pp_print_string + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bytes(v){ + return pp_print_bytes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_int(v){ + return pp_print_int + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_float(v){ + return pp_print_float + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_char(v){ + return pp_print_char + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bool(v){ + return pp_print_bool + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_break(v, w){ + return pp_print_break + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_cut(v){ + return pp_print_cut + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_space(v){ + return pp_print_space + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function force_newline(v){ + return pp_force_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_flush(v){ + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_newline(v){ + return pp_print_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_if_newline(v){ + return pp_print_if_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_tbox(v){ + return pp_open_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_tbox(v){ + return pp_close_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tbreak(v, w){ + return pp_print_tbreak + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function set_tab(v){ + return pp_set_tab(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tab(v){ + return pp_print_tab + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_margin(v){ + return pp_set_margin + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_margin(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[6]; + } + function set_max_indent(v){ + return pp_set_max_indent + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_indent(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[8]; + } + function set_geometry(max_indent, margin){ + return pp_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function safe_set_geometry(max_indent, margin){ + return pp_safe_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function get_geometry(v){ + return pp_get_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function update_geometry(v){ + return pp_update_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_max_boxes(v){ + return pp_set_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_boxes(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[15]; + } + function over_max_boxes(v){ + return pp_over_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_ellipsis_text(v){ + return pp_set_ellipsis_text + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_ellipsis_text(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[16]; + } + function set_formatter_out_channel(v){ + return pp_set_formatter_out_channel + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_out_functions(v){ + return pp_set_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_out_functions(v){ + return pp_get_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_output_functions(v, w){ + return pp_set_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function get_formatter_output_functions(v){ + return pp_get_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_stag_functions(v){ + return pp_set_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_stag_functions(v){ + return pp_get_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_print_tags(v){ + return pp_set_print_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_print_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[22]; + } + function set_mark_tags(v){ + return pp_set_mark_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_mark_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[23]; + } + function set_tags(v){ + return pp_set_tags(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function pp_print_list(opt, pp_v, ppf, param){ + var opt$0 = opt, param$0 = param; + for(;;){ + if(opt$0) + var sth = opt$0[1], pp_sep = sth; + else + var pp_sep = pp_print_cut; + if(! param$0) return 0; + var v = param$0[1]; + if(! param$0[2]) return caml_call2(pp_v, ppf, v); + var vs = param$0[2]; + caml_call2(pp_v, ppf, v); + caml_call2(pp_sep, ppf, 0); + var opt$1 = [0, pp_sep], opt$0 = opt$1, param$0 = vs; + } + } + function pp_print_seq(opt, pp_v, ppf, seq$1){ + if(opt) var sth = opt[1], pp_sep = sth; else var pp_sep = pp_print_cut; + var match$0 = caml_call1(seq$1, 0); + if(! match$0) return 0; + var seq$2 = match$0[2], v$0 = match$0[1]; + caml_call2(pp_v, ppf, v$0); + var seq = seq$2; + for(;;){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var seq$0 = match[2], v = match[1]; + caml_call2(pp_sep, ppf, 0); + caml_call2(pp_v, ppf, v); + var seq = seq$0; + } + } + function pp_print_text(ppf, s){ + var len = caml_ml_string_length(s), left = [0, 0], right = [0, 0]; + function flush(param){ + pp_print_string + (ppf, caml_call3(Stdlib_String[15], s, left[1], right[1] - left[1] | 0)); + right[1]++; + left[1] = right[1]; + return 0; + } + for(;;){ + if(right[1] === len){ + var _aj_ = left[1] !== len ? 1 : 0; + return _aj_ ? flush(0) : _aj_; + } + var match = runtime.caml_string_get(s, right[1]); + if(10 === match){ + flush(0); + pp_force_newline(ppf, 0); + } + else if(32 === match){flush(0); pp_print_space(ppf, 0);} else right[1]++; + } + } + function pp_print_option(opt, pp_v, ppf, param){ + if(opt) + var sth = opt[1], none = sth; + else + var none = function(param, _ai_){return 0;}; + if(! param) return caml_call2(none, ppf, 0); + var v = param[1]; + return caml_call2(pp_v, ppf, v); + } + function pp_print_result(ok, error, ppf, param){ + if(0 === param[0]){var v = param[1]; return caml_call2(ok, ppf, v);} + var e = param[1]; + return caml_call2(error, ppf, e); + } + function pp_print_either(left, right, ppf, param){ + if(0 === param[0]){var l = param[1]; return caml_call2(left, ppf, l);} + var r = param[1]; + return caml_call2(right, ppf, r); + } + function compute_tag(output, tag_acc){ + var + buf = caml_call1(Stdlib_Buffer[1], 16), + ppf = formatter_of_buffer(buf); + caml_call2(output, ppf, tag_acc); + pp_print_flush(ppf, 0); + var len = caml_call1(Stdlib_Buffer[7], buf); + return 2 <= len + ? caml_call3(Stdlib_Buffer[4], buf, 1, len - 2 | 0) + : caml_call1(Stdlib_Buffer[2], buf); + } + function output_formatting_lit(ppf, fmting_lit){ + if(typeof fmting_lit === "number") + switch(fmting_lit){ + case 0: + return pp_close_box(ppf, 0); + case 1: + return pp_close_stag(ppf, 0); + case 2: + return pp_print_flush(ppf, 0); + case 3: + return pp_force_newline(ppf, 0); + case 4: + return pp_print_newline(ppf, 0); + case 5: + return pp_print_char(ppf, 64); + default: return pp_print_char(ppf, 37); + } + switch(fmting_lit[0]){ + case 0: + var offset = fmting_lit[3], width = fmting_lit[2]; + return pp_print_break(ppf, width, offset); + case 1: + return 0; + default: + var c = fmting_lit[1]; + pp_print_char(ppf, 64); + return pp_print_char(ppf, c); + } + } + function output_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + output_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + output_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(output_acc, acc$0)]); + } + var acc$1 = match[1]; + output_acc(ppf, p$0); + var + _$_ = compute_tag(output_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _$_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _aa_ = acc[1], switch$1 = 0; + if(typeof _aa_ === "number" || ! (0 === _aa_[0])) + switch$1 = 1; + else{ + var _ab_ = _aa_[2], switch$2 = 0; + if(typeof _ab_ === "number" || ! (1 === _ab_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _ab_[2], p$2 = _aa_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _aa_; switch$0 = 2;} + break; + case 3: + var _ac_ = acc[1], switch$3 = 0; + if(typeof _ac_ === "number" || ! (0 === _ac_[0])) + switch$3 = 1; + else{ + var _ad_ = _ac_[2], switch$4 = 0; + if(typeof _ad_ === "number" || ! (1 === _ad_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _ad_[2], p$4 = _ac_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _ac_; switch$0 = 3;} + break; + case 4: + var _ae_ = acc[1], switch$5 = 0; + if(typeof _ae_ === "number" || ! (0 === _ae_[0])) + switch$5 = 1; + else{ + var _af_ = _ae_[2], switch$6 = 0; + if(typeof _af_ === "number" || ! (1 === _af_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _af_[2], p$2 = _ae_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _ae_; switch$0 = 2;} + break; + case 5: + var _ag_ = acc[1], switch$7 = 0; + if(typeof _ag_ === "number" || ! (0 === _ag_[0])) + switch$7 = 1; + else{ + var _ah_ = _ag_[2], switch$8 = 0; + if(typeof _ah_ === "number" || ! (1 === _ah_[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = _ah_[2], p$4 = _ag_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _ag_; switch$0 = 3;} + break; + case 6: + var f$0 = acc[2], p$5 = acc[1]; + output_acc(ppf, p$5); + return caml_call1(f$0, ppf); + case 7: + var p$6 = acc[1]; output_acc(ppf, p$6); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$7 = acc[1]; + output_acc(ppf, p$7); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + output_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + output_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + output_acc(ppf, p$1); return pp_print_string(ppf, s); + default: output_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function strput_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + strput_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + strput_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(strput_acc, acc$0)]); + } + var acc$1 = match[1]; + strput_acc(ppf, p$0); + var + _S_ = compute_tag(strput_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _S_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _T_ = acc[1], switch$1 = 0; + if(typeof _T_ === "number" || ! (0 === _T_[0])) + switch$1 = 1; + else{ + var _U_ = _T_[2], switch$2 = 0; + if(typeof _U_ === "number" || ! (1 === _U_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _U_[2], p$2 = _T_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _T_; switch$0 = 2;} + break; + case 3: + var _V_ = acc[1], switch$3 = 0; + if(typeof _V_ === "number" || ! (0 === _V_[0])) + switch$3 = 1; + else{ + var _W_ = _V_[2], switch$4 = 0; + if(typeof _W_ === "number" || ! (1 === _W_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _W_[2], p$4 = _V_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _V_; switch$0 = 3;} + break; + case 4: + var _X_ = acc[1], switch$5 = 0; + if(typeof _X_ === "number" || ! (0 === _X_[0])) + switch$5 = 1; + else{ + var _Y_ = _X_[2], switch$6 = 0; + if(typeof _Y_ === "number" || ! (1 === _Y_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _Y_[2], p$2 = _X_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _X_; switch$0 = 2;} + break; + case 5: + var _Z_ = acc[1], switch$7 = 0; + if(typeof _Z_ === "number" || ! (0 === _Z_[0])) + switch$7 = 1; + else{ + var ___ = _Z_[2], switch$8 = 0; + if(typeof ___ === "number" || ! (1 === ___[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = ___[2], p$4 = _Z_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _Z_; switch$0 = 3;} + break; + case 6: + var p$5 = acc[1]; + if(typeof p$5 !== "number" && 0 === p$5[0]){ + var match$1 = p$5[2]; + if(typeof match$1 !== "number" && 1 === match$1[0]){ + var f$1 = acc[2], size$1 = match$1[2], p$6 = p$5[1]; + strput_acc(ppf, p$6); + return pp_print_as_size(ppf, size$1, caml_call1(f$1, 0)); + } + } + var f$0 = acc[2]; + strput_acc(ppf, p$5); + return pp_print_string(ppf, caml_call1(f$0, 0)); + case 7: + var p$7 = acc[1]; strput_acc(ppf, p$7); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$8 = acc[1]; + strput_acc(ppf, p$8); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + strput_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + strput_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + strput_acc(ppf, p$1); return pp_print_string(ppf, s); + default: strput_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function kfprintf(k, ppf, param){ + var fmt = param[1], _Q_ = 0; + function _R_(acc){output_acc(ppf, acc); return caml_call1(k, ppf);} + return caml_call3(CamlinternalFormat[7], _R_, _Q_, fmt); + } + function ikfprintf(k, ppf, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, ppf, fmt); + } + function ifprintf(ppf, param){ + var fmt = param[1], _N_ = 0; + function _O_(_P_){return 0;} + return caml_call3(CamlinternalFormat[8], _O_, _N_, fmt); + } + function fprintf(ppf){ + function _K_(_M_){return 0;} + return function(_L_){return kfprintf(_K_, ppf, _L_);}; + } + function printf(param){ + var fmt = param[1], _I_ = 0; + function _J_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _J_, _I_, fmt); + } + function eprintf(param){ + var fmt = param[1], _G_ = 0; + function _H_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _H_, _G_, fmt); + } + function kdprintf(k, param){ + var fmt = param[1], _E_ = 0; + function _F_(acc){ + return caml_call1(k, function(ppf){return output_acc(ppf, acc);}); + } + return caml_call3(CamlinternalFormat[7], _F_, _E_, fmt); + } + function dprintf(fmt){return kdprintf(function(i){return i;}, fmt);} + function ksprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + strput_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(id, fmt);} + function kasprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + output_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function asprintf(fmt){return kasprintf(id, fmt);} + function flush_standard_formatters(param){ + pp_print_flush(caml_call1(Stdlib_Domain[10][2], std_formatter_key), 0); + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), 0); + } + caml_call1(Stdlib[100], flush_standard_formatters); + function _l_(param){ + flush_standard_formatters(0); + var + fs = pp_get_formatter_out_functions(std_formatter, 0), + _m_ = fs[5], + _n_ = fs[4], + _o_ = fs[3], + _p_ = Stdlib[39]; + function _q_(_D_){return buffered_out_flush(_p_, std_buf_key, _D_);} + pp_set_formatter_out_functions + (std_formatter, + [0, + function(_A_, _B_, _C_){ + return buffered_out_string(std_buf_key, _A_, _B_, _C_); + }, + _q_, + _o_, + _n_, + _m_]); + var + fs$0 = pp_get_formatter_out_functions(err_formatter, 0), + _r_ = fs$0[5], + _s_ = fs$0[4], + _t_ = fs$0[3], + _u_ = Stdlib[40]; + function _v_(_z_){return buffered_out_flush(_u_, err_buf_key, _z_);} + return pp_set_formatter_out_functions + (err_formatter, + [0, + function(_w_, _x_, _y_){ + return buffered_out_string(err_buf_key, _w_, _x_, _y_); + }, + _v_, + _t_, + _s_, + _r_]); + } + caml_call1(Stdlib_Domain[5], _l_); + var + Stdlib_Format = + [0, + pp_open_box, + open_box, + pp_close_box, + close_box, + pp_open_hbox, + open_hbox, + pp_open_vbox, + open_vbox, + pp_open_hvbox, + open_hvbox, + pp_open_hovbox, + open_hovbox, + pp_print_string, + print_string, + pp_print_bytes, + print_bytes, + pp_print_as, + print_as, + pp_print_int, + print_int, + pp_print_float, + print_float, + pp_print_char, + print_char, + pp_print_bool, + print_bool, + pp_print_space, + print_space, + pp_print_cut, + print_cut, + pp_print_break, + print_break, + pp_print_custom_break, + pp_force_newline, + force_newline, + pp_print_if_newline, + print_if_newline, + pp_print_flush, + print_flush, + pp_print_newline, + print_newline, + pp_set_margin, + set_margin, + pp_get_margin, + get_margin, + pp_set_max_indent, + set_max_indent, + pp_get_max_indent, + get_max_indent, + check_geometry, + pp_set_geometry, + set_geometry, + pp_safe_set_geometry, + safe_set_geometry, + pp_update_geometry, + update_geometry, + pp_get_geometry, + get_geometry, + pp_set_max_boxes, + set_max_boxes, + pp_get_max_boxes, + get_max_boxes, + pp_over_max_boxes, + over_max_boxes, + pp_open_tbox, + open_tbox, + pp_close_tbox, + close_tbox, + pp_set_tab, + set_tab, + pp_print_tab, + print_tab, + pp_print_tbreak, + print_tbreak, + pp_set_ellipsis_text, + set_ellipsis_text, + pp_get_ellipsis_text, + get_ellipsis_text, + String_tag, + pp_open_stag, + open_stag, + pp_close_stag, + close_stag, + pp_set_tags, + set_tags, + pp_set_print_tags, + set_print_tags, + pp_set_mark_tags, + set_mark_tags, + pp_get_print_tags, + get_print_tags, + pp_get_mark_tags, + get_mark_tags, + pp_set_formatter_out_channel, + set_formatter_out_channel, + pp_set_formatter_output_functi, + set_formatter_output_functions, + pp_get_formatter_output_functi, + get_formatter_output_functions, + pp_set_formatter_out_functions, + set_formatter_out_functions, + pp_get_formatter_out_functions, + get_formatter_out_functions, + pp_set_formatter_stag_function, + set_formatter_stag_functions, + pp_get_formatter_stag_function, + get_formatter_stag_functions, + formatter_of_out_channel, + synchronized_formatter_of_out_, + std_formatter, + get_std_formatter, + err_formatter, + get_err_formatter, + formatter_of_buffer, + stdbuf, + get_stdbuf, + str_formatter, + get_str_formatter, + flush_str_formatter, + make_formatter, + make_synchronized_formatter, + formatter_of_out_functions, + make_symbolic_output_buffer, + clear_symbolic_output_buffer, + get_symbolic_output_buffer, + flush_symbolic_output_buffer, + add_symbolic_output_item, + formatter_of_symbolic_output_b, + pp_print_list, + pp_print_seq, + pp_print_text, + pp_print_option, + pp_print_result, + pp_print_either, + fprintf, + printf, + eprintf, + sprintf, + asprintf, + dprintf, + ifprintf, + kfprintf, + kdprintf, + ikfprintf, + ksprintf, + kasprintf]; + runtime.caml_register_global(35, Stdlib_Format, "Stdlib__Format"); + return; + } + (globalThis)); + +//# 21019 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = '"', + cst$6 = "-", + cst_character = "character ", + cst_scanf_ml = "scanf.ml", + cst_scanf_bad_conversion$3 = 'scanf: bad conversion "%*"', + cst_scanning_of = "scanning of ", + caml_bytes_get = runtime.caml_bytes_get, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$5, + cst$4 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + cst$0 = cst$5, + cst = cst$6, + CamlinternalFormat = global_data.CamlinternalFormat, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib_String = global_data.Stdlib__String, + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Buffer = global_data.Stdlib__Buffer, + _r_ = [0, 91], + _q_ = [0, 123], + cst_end_of_input_not_found = "end of input not found", + cst_scanf_bad_conversion_a = 'scanf: bad conversion "%a"', + cst_scanf_bad_conversion_t = 'scanf: bad conversion "%t"', + cst_scanf_missing_reader = "scanf: missing reader", + _s_ = [0, cst_scanf_ml, 1414, 13], + cst_scanf_bad_conversion_custo = + 'scanf: bad conversion "%?" (custom converter)', + cst_scanf_bad_conversion = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$0 = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$1 = 'scanf: bad conversion "%-"', + cst_scanf_bad_conversion$2 = cst_scanf_bad_conversion$3, + _t_ = [0, [3, 0, [10, 0]], "%S%!"], + cst_in_format = ' in format "', + _p_ = [0, 37, ""], + _o_ = + [0, + [11, + "scanf: bad input at char number ", + [4, 3, 0, 0, [11, ": ", [2, 0, 0]]]], + "scanf: bad input at char number %i: %s"], + _n_ = + [0, + [11, "the character ", [1, [11, " cannot start a boolean", 0]]], + "the character %C cannot start a boolean"], + _m_ = + [0, + [11, "bad character hexadecimal encoding \\", [0, [0, 0]]], + "bad character hexadecimal encoding \\%c%c"], + _l_ = + [0, + [11, "bad character decimal encoding \\", [0, [0, [0, 0]]]], + "bad character decimal encoding \\%c%c%c"], + cst_an = "an", + cst_x = "x", + cst_nfinity = "nfinity", + cst_digits = "digits", + _k_ = + [0, + [11, + cst_character, + [1, [11, " is not a valid ", [2, 0, [11, " digit", 0]]]]], + "character %C is not a valid %s digit"], + cst_decimal_digits = "decimal digits", + _j_ = + [0, + [11, cst_character, [1, [11, " is not a decimal digit", 0]]], + "character %C is not a decimal digit"], + cst_0b = "0b", + cst_0o = "0o", + cst_0u = "0u", + cst_0x = "0x", + _i_ = [0, cst_scanf_ml, 516, 9], + _h_ = + [0, + [11, "invalid boolean '", [2, 0, [12, 39, 0]]], + "invalid boolean '%s'"], + _g_ = + [0, + [11, "looking for ", [1, [11, ", found ", [1, 0]]]], + "looking for %C, found %C"], + cst_not_a_valid_float_in_hexad = + "not a valid float in hexadecimal notation", + cst_no_dot_or_exponent_part_fo = + "no dot or exponent part found in float token", + _f_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, + " failed: premature end of file occurred before end of token", + 0]]], + "scanning of %s failed: premature end of file occurred before end of token"], + _e_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, " failed: the specified length was too short for token", 0]]], + "scanning of %s failed: the specified length was too short for token"], + _d_ = + [0, + [11, "illegal escape character ", [1, 0]], + "illegal escape character %C"], + cst_unnamed_function = "unnamed function", + cst_unnamed_character_string = "unnamed character string", + cst_unnamed_Stdlib_input_chann = "unnamed Stdlib input channel", + cst_Stdlib_Scanf_Scan_failure = "Stdlib.Scanf.Scan_failure", + cst_binary = "binary", + cst_octal = "octal", + cst_hexadecimal = "hexadecimal", + cst_a_Char = "a Char", + cst_a_String = "a String", + null_char = 0; + function next_char(ib){ + try{ + var c = caml_call1(ib[7], 0); + ib[2] = c; + ib[3] = 1; + ib[4] = ib[4] + 1 | 0; + if(10 === c) ib[5] = ib[5] + 1 | 0; + return c; + } + catch(_bb_){ + var _ba_ = caml_wrap_exception(_bb_); + if(_ba_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_ba_, 0); + ib[2] = null_char; + ib[3] = 0; + ib[1] = 1; + return null_char; + } + } + function peek_char(ib){return ib[3] ? ib[2] : next_char(ib);} + function checked_peek_char(ib){ + var c = peek_char(ib); + if(ib[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return c; + } + function end_of_input(ib){peek_char(ib); return ib[1];} + function beginning_of_input(ib){return 0 === ib[4] ? 1 : 0;} + function name_of_input(ib){ + var match = ib[9]; + if(typeof match === "number") + return 0 === match ? cst_unnamed_function : cst_unnamed_character_string; + if(0 === match[0]) return cst_unnamed_Stdlib_input_chann; + var fname = match[1]; + return fname; + } + function char_count(ib){return ib[3] ? ib[4] - 1 | 0 : ib[4];} + function invalidate_current_char(ib){ib[3] = 0; return 0;} + function token_string(ib){ + var + token_buffer = ib[8], + tok = caml_call1(Stdlib_Buffer[2], token_buffer); + caml_call1(Stdlib_Buffer[8], token_buffer); + ib[6] = ib[6] + 1 | 0; + return tok; + } + function skip_char(width, ib){invalidate_current_char(ib); return width;} + function ignore_char(width, ib){return skip_char(width - 1 | 0, ib);} + function store_char(width, ib, c){ + caml_call2(Stdlib_Buffer[12], ib[8], c); + return ignore_char(width, ib); + } + var default_token_buffer_size = 1024; + function create(iname, next){ + return [0, + 0, + null_char, + 0, + 0, + 0, + 0, + next, + caml_call1(Stdlib_Buffer[1], default_token_buffer_size), + iname]; + } + function from_string(s){ + var i = [0, 0], len = caml_ml_string_length(s); + function next(param){ + if(len <= i[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + var c = caml_string_get(s, i[1]); + i[1]++; + return c; + } + return create(1, next); + } + var _a_ = 0; + function from_function(_a$_){return create(_a_, _a$_);} + var len = 1024; + function scan_close_at_end(ic){ + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function scan_raise_at_end(ic){ + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function from_ic(scan_close_ic, iname, ic){ + var + buf = runtime.caml_create_bytes(1024), + i = [0, 0], + lim = [0, 0], + eof = [0, 0]; + function next(param){ + if(i[1] < lim[1]){var c = caml_bytes_get(buf, i[1]); i[1]++; return c;} + if(eof[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + lim[1] = caml_call4(Stdlib[84], ic, buf, 0, len); + return 0 === lim[1] + ? (eof[1] = 1, caml_call1(scan_close_ic, ic)) + : (i[1] = 1, caml_bytes_get(buf, 0)); + } + return create(iname, next); + } + var stdin = from_ic(scan_raise_at_end, [1, cst, Stdlib[38]], Stdlib[38]); + function open_in_file(open_in, fname){ + if(! caml_string_notequal(fname, cst$6)) return stdin; + var ic = caml_call1(open_in, fname); + return from_ic(scan_close_at_end, [1, fname, ic], ic); + } + var _b_ = Stdlib[79]; + function open_in(_a__){return open_in_file(_b_, _a__);} + var _c_ = Stdlib[80]; + function open_in_bin(_a9_){return open_in_file(_c_, _a9_);} + function from_channel(ic){return from_ic(scan_raise_at_end, [0, ic], ic);} + function close_in(ib){ + var match = ib[9]; + if(typeof match === "number") return 0; + if(0 === match[0]){var ic = match[1]; return caml_call1(Stdlib[93], ic);} + var ic$0 = match[2]; + return caml_call1(Stdlib[93], ic$0); + } + var + Scan_failure = + [248, cst_Stdlib_Scanf_Scan_failure, runtime.caml_fresh_oo_id(0)]; + function bad_input(s){ + throw caml_maybe_attach_backtrace([0, Scan_failure, s], 1); + } + function bad_input_escape(c){ + return bad_input(caml_call2(Stdlib_Printf[4], _d_, c)); + } + function bad_token_length(message){ + return bad_input(caml_call2(Stdlib_Printf[4], _e_, message)); + } + function bad_float(param){ + return bad_input(cst_no_dot_or_exponent_part_fo); + } + function bad_hex_float(param){ + return bad_input(cst_not_a_valid_float_in_hexad); + } + function character_mismatch(c, ci){ + return bad_input(caml_call3(Stdlib_Printf[4], _g_, c, ci)); + } + function check_this_char(ib, c){ + var ci = checked_peek_char(ib); + return ci === c ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function check_char(ib, c$0){ + if(10 === c$0){ + var ci = checked_peek_char(ib); + return 10 === ci + ? invalidate_current_char(ib) + : 13 + === ci + ? (invalidate_current_char(ib), check_this_char(ib, 10)) + : character_mismatch(10, ci); + } + if(32 !== c$0) return check_this_char(ib, c$0); + for(;;){ + var c = peek_char(ib), _a7_ = 1 - ib[1]; + if(! _a7_) return _a7_; + var _a8_ = c - 9 | 0, switch$0 = 0; + if(4 < _a8_ >>> 0){ + if(23 === _a8_) switch$0 = 1; + } + else if(1 < _a8_ - 2 >>> 0) switch$0 = 1; + if(! switch$0) return 0; + invalidate_current_char(ib); + } + } + function token_char(ib){return caml_string_get(token_string(ib), 0);} + function token_bool(ib){ + var s = token_string(ib); + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? bad_input(caml_call2(Stdlib_Printf[4], _h_, s)) + : 1 + : 0; + } + function integer_conversion_of_char(param){ + var switcher = param - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 10: + return 0; + case 12: + return 1; + case 17: + return 2; + case 23: + return 3; + case 29: + return 4; + case 0: + case 32: + return 5; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + } + function token_int_literal(conv, ib){ + switch(conv){ + case 0: + var + _a3_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0b, _a3_); + break; + case 3: + var + _a4_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0o, _a4_); + break; + case 4: + var + _a5_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0u, _a5_); + break; + case 5: + var + _a6_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0x, _a6_); + break; + default: var tok = token_string(ib); + } + var l = caml_ml_string_length(tok); + if(0 !== l && 43 === caml_string_get(tok, 0)) + return caml_call3(Stdlib_String[15], tok, 1, l - 1 | 0); + return tok; + } + function token_float(ib){ + return runtime.caml_float_of_string(token_string(ib)); + } + function scan_decimal_digit_star(width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(58 <= c){ + if(95 === c){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + } + else if(48 <= c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + return width$0; + } + } + function scan_decimal_digit_plus(width, ib){ + if(0 === width) return bad_token_length(cst_decimal_digits); + var c = checked_peek_char(ib); + if(9 < c - 48 >>> 0) + return bad_input(caml_call2(Stdlib_Printf[4], _j_, c)); + var width$0 = store_char(width, ib, c); + return scan_decimal_digit_star(width$0, ib); + } + function scan_digit_plus(basis, digitp, width$2, ib){ + if(0 === width$2) return bad_token_length(cst_digits); + var c$0 = checked_peek_char(ib); + if(! caml_call1(digitp, c$0)) + return bad_input(caml_call3(Stdlib_Printf[4], _k_, c$0, basis)); + var width$3 = store_char(width$2, ib, c$0), width = width$3; + for(;;){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(caml_call1(digitp, c)){ + var width$0 = store_char(width, ib, c), width = width$0; + continue; + } + if(95 !== c) return width; + var width$1 = ignore_char(width, ib), width = width$1; + } + } + function is_binary_digit(param){return 1 < param - 48 >>> 0 ? 0 : 1;} + function scan_binary_int(_a1_, _a2_){ + return scan_digit_plus(cst_binary, is_binary_digit, _a1_, _a2_); + } + function is_octal_digit(param){return 7 < param - 48 >>> 0 ? 0 : 1;} + function scan_octal_int(_aZ_, _a0_){ + return scan_digit_plus(cst_octal, is_octal_digit, _aZ_, _a0_); + } + function is_hexa_digit(param){ + var _aY_ = param - 48 | 0, switch$0 = 0; + if(22 < _aY_ >>> 0){ + if(5 >= _aY_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _aY_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function scan_hexadecimal_int(_aW_, _aX_){ + return scan_digit_plus(cst_hexadecimal, is_hexa_digit, _aW_, _aX_); + } + function scan_sign(width, ib){ + var c = checked_peek_char(ib), switcher = c - 43 | 0; + if(2 >= switcher >>> 0) + switch(switcher){ + case 0: + return store_char(width, ib, c); + case 1: break; + default: return store_char(width, ib, c); + } + return width; + } + function scan_optionally_signed_decimal(width, ib){ + var width$0 = scan_sign(width, ib); + return scan_decimal_digit_plus(width$0, ib); + } + function scan_int_conversion(conv, width$1, ib){ + switch(conv){ + case 0: + return scan_binary_int(width$1, ib); + case 1: + return scan_optionally_signed_decimal(width$1, ib); + case 2: + var width$0 = scan_sign(width$1, ib), c = checked_peek_char(ib); + if(48 !== c) return scan_decimal_digit_plus(width$0, ib); + var width = store_char(width$0, ib, c); + if(0 === width) return width; + var c$0 = peek_char(ib); + if(ib[1]) return width; + var switch$0 = 0; + if(99 <= c$0){ + if(111 === c$0) return scan_octal_int(store_char(width, ib, c$0), ib); + if(120 === c$0) switch$0 = 1; + } + else if(88 === c$0) + switch$0 = 1; + else if(98 <= c$0) + return scan_binary_int(store_char(width, ib, c$0), ib); + return switch$0 + ? scan_hexadecimal_int(store_char(width, ib, c$0), ib) + : scan_decimal_digit_star(width, ib); + case 3: + return scan_octal_int(width$1, ib); + case 4: + return scan_decimal_digit_plus(width$1, ib); + default: return scan_hexadecimal_int(width$1, ib); + } + } + function scan_fractional_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + return ib[1] + ? width + : 9 + < c - 48 >>> 0 + ? width + : scan_decimal_digit_star(store_char(width, ib, c), ib); + } + function scan_exponent_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(69 !== c && 101 !== c) return width; + return scan_optionally_signed_decimal(store_char(width, ib, c), ib); + } + function scan_float(width$1, precision, ib){ + var + width = scan_sign(width$1, ib), + width$0 = scan_decimal_digit_star(width, ib); + if(0 === width$0) return [0, width$0, precision]; + var c = peek_char(ib); + if(ib[1]) return [0, width$0, precision]; + if(46 !== c) return [0, scan_exponent_part(width$0, ib), precision]; + var + width$2 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$2, precision), + width$3 = + width$2 - (precision$0 - scan_fractional_part(precision$0, ib) | 0) | 0; + return [0, scan_exponent_part(width$3, ib), precision$0]; + } + function check_case_insensitive_string(width, ib, error, str){ + function lowercase(c){ + return 25 < c - 65 >>> 0 + ? c + : caml_call1(Stdlib[29], (c - 65 | 0) + 97 | 0); + } + var + len = caml_ml_string_length(str), + width$0 = [0, width], + _aT_ = len - 1 | 0, + _aS_ = 0; + if(_aT_ >= 0){ + var i = _aS_; + for(;;){ + var c = peek_char(ib), _aU_ = lowercase(caml_string_get(str, i)); + if(lowercase(c) !== _aU_) caml_call1(error, 0); + if(0 === width$0[1]) caml_call1(error, 0); + width$0[1] = store_char(width$0[1], ib, c); + var _aV_ = i + 1 | 0; + if(_aT_ !== i){var i = _aV_; continue;} + break; + } + } + return width$0[1]; + } + function scan_hex_float(width, precision, ib){ + var _aF_ = 0 === width ? 1 : 0, _aG_ = _aF_ || end_of_input(ib); + if(_aG_) bad_hex_float(0); + var + width$0 = scan_sign(width, ib), + _aH_ = 0 === width$0 ? 1 : 0, + _aI_ = _aH_ || end_of_input(ib); + if(_aI_) bad_hex_float(0); + var c = peek_char(ib), switch$0 = 0; + if(78 <= c){ + var switcher = c - 79 | 0; + if(30 < switcher >>> 0){ + if(32 > switcher){ + var + width$1 = store_char(width$0, ib, c), + _aJ_ = 0 === width$1 ? 1 : 0, + _aK_ = _aJ_ || end_of_input(ib); + if(_aK_) bad_hex_float(0); + return check_case_insensitive_string + (width$1, ib, bad_hex_float, cst_an); + } + } + else if(26 === switcher) switch$0 = 1; + } + else{ + if(48 === c){ + var + width$3 = store_char(width$0, ib, c), + _aN_ = 0 === width$3 ? 1 : 0, + _aO_ = _aN_ || end_of_input(ib); + if(_aO_) bad_hex_float(0); + var + width$4 = + check_case_insensitive_string(width$3, ib, bad_hex_float, cst_x); + if(0 !== width$4 && ! end_of_input(ib)){ + var _aP_ = peek_char(ib) - 46 | 0, switch$1 = 0; + if(34 < _aP_ >>> 0){ + if(66 === _aP_) switch$1 = 1; + } + else if(32 < _aP_ - 1 >>> 0) switch$1 = 1; + var width$5 = switch$1 ? width$4 : scan_hexadecimal_int(width$4, ib); + if(0 !== width$5 && ! end_of_input(ib)){ + var c$0 = peek_char(ib); + if(46 === c$0){ + var width$6 = store_char(width$5, ib, c$0), switch$2 = 0; + if(0 !== width$6 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$3 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$6, precision), + width$10 = + width$6 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$3 = 1; + } + if(! switch$3) var width$10 = width$6; + var width$7 = width$10; + switch$2 = 1; + } + if(! switch$2) var width$7 = width$6; + var width$8 = width$7; + } + else + var width$8 = width$5; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$1 = peek_char(ib); + if(80 !== c$1 && 112 !== c$1) return width$8; + var + width$9 = store_char(width$8, ib, c$1), + _aQ_ = 0 === width$9 ? 1 : 0, + _aR_ = _aQ_ || end_of_input(ib); + if(_aR_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return width$5; + } + return width$4; + } + if(73 === c) switch$0 = 1; + } + if(! switch$0) return bad_hex_float(0); + var + width$2 = store_char(width$0, ib, c), + _aL_ = 0 === width$2 ? 1 : 0, + _aM_ = _aL_ || end_of_input(ib); + if(_aM_) bad_hex_float(0); + return check_case_insensitive_string + (width$2, ib, bad_hex_float, cst_nfinity); + } + function scan_caml_float_rest(width, precision, ib){ + var _aB_ = 0 === width ? 1 : 0, _aC_ = _aB_ || end_of_input(ib); + if(_aC_) bad_float(0); + var + width$0 = scan_decimal_digit_star(width, ib), + _aD_ = 0 === width$0 ? 1 : 0, + _aE_ = _aD_ || end_of_input(ib); + if(_aE_) bad_float(0); + var c = peek_char(ib), switcher = c - 69 | 0; + if(32 < switcher >>> 0){ + if(-23 === switcher){ + var + width$1 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$1, precision), + width_precision = scan_fractional_part(precision$0, ib), + frac_width = precision$0 - width_precision | 0, + width$2 = width$1 - frac_width | 0; + return scan_exponent_part(width$2, ib); + } + } + else if(30 < switcher - 1 >>> 0) return scan_exponent_part(width$0, ib); + return bad_float(0); + } + function scan_caml_float(width, precision, ib){ + var _an_ = 0 === width ? 1 : 0, _ao_ = _an_ || end_of_input(ib); + if(_ao_) bad_float(0); + var + width$0 = scan_sign(width, ib), + _ap_ = 0 === width$0 ? 1 : 0, + _aq_ = _ap_ || end_of_input(ib); + if(_aq_) bad_float(0); + var c = peek_char(ib); + if(49 <= c){ + if(58 > c){ + var + width$1 = store_char(width$0, ib, c), + _ar_ = 0 === width$1 ? 1 : 0, + _as_ = _ar_ || end_of_input(ib); + if(_as_) bad_float(0); + return scan_caml_float_rest(width$1, precision, ib); + } + } + else if(48 <= c){ + var + width$2 = store_char(width$0, ib, c), + _at_ = 0 === width$2 ? 1 : 0, + _au_ = _at_ || end_of_input(ib); + if(_au_) bad_float(0); + var c$0 = peek_char(ib); + if(88 !== c$0 && 120 !== c$0) + return scan_caml_float_rest(width$2, precision, ib); + var + width$3 = store_char(width$2, ib, c$0), + _av_ = 0 === width$3 ? 1 : 0, + _aw_ = _av_ || end_of_input(ib); + if(_aw_) bad_float(0); + var + width$4 = scan_hexadecimal_int(width$3, ib), + _ax_ = 0 === width$4 ? 1 : 0, + _ay_ = _ax_ || end_of_input(ib); + if(_ay_) bad_float(0); + var c$1 = peek_char(ib), switcher = c$1 - 80 | 0, switch$0 = 0; + if(32 < switcher >>> 0) + if(-34 === switcher){ + var width$5 = store_char(width$4, ib, c$1), switch$1 = 0; + if(0 !== width$5 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$2 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$5, precision), + width$10 = + width$5 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$2 = 1; + } + if(! switch$2) var width$10 = width$5; + var width$6 = width$10; + switch$1 = 1; + } + if(! switch$1) var width$6 = width$5; + var width$7 = width$6; + } + else + switch$0 = 1; + else if(30 < switcher - 1 >>> 0) + var width$7 = width$4; + else + switch$0 = 1; + var width$8 = switch$0 ? bad_float(0) : width$7; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$2 = peek_char(ib); + if(80 !== c$2 && 112 !== c$2) return width$8; + var + width$9 = store_char(width$8, ib, c$2), + _az_ = 0 === width$9 ? 1 : 0, + _aA_ = _az_ || end_of_input(ib); + if(_aA_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return bad_float(0); + } + function scan_string(stp, width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(stp){ + var c$0 = stp[1]; + if(c === c$0) return skip_char(width$0, ib); + var width$1 = store_char(width$0, ib, c), width$0 = width$1; + continue; + } + var _am_ = c - 9 | 0, switch$0 = 0; + if(4 < _am_ >>> 0){ + if(23 === _am_) switch$0 = 1; + } + else if(1 < _am_ - 2 >>> 0) switch$0 = 1; + if(switch$0) return width$0; + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + } + } + function hexadecimal_value_of_char(c){ + return 97 <= c ? c - 87 | 0 : 65 <= c ? c - 55 | 0 : c - 48 | 0; + } + function check_next_char(message, width, ib){ + if(0 === width) return bad_token_length(message); + var c = peek_char(ib); + return ib[1] ? bad_input(caml_call2(Stdlib_Printf[4], _f_, message)) : c; + } + function check_next_char_for_char(_ak_, _al_){ + return check_next_char(cst_a_Char, _ak_, _al_); + } + function check_next_char_for_string(_ai_, _aj_){ + return check_next_char(cst_a_String, _ai_, _aj_); + } + function scan_backslash_char(width, ib){ + var c0 = check_next_char_for_char(width, ib), switch$0 = 0; + if(40 <= c0){ + if(58 <= c0){ + var switcher = c0 - 92 | 0; + if(28 >= switcher >>> 0) + switch(switcher){ + case 28: + var + get_digit = + function(param){ + var c = next_char(ib), _ah_ = c - 48 | 0, switch$0 = 0; + if(22 < _ah_ >>> 0){ + if(5 >= _ah_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _ah_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? c : bad_input_escape(c); + }, + c1 = get_digit(0), + c2 = get_digit(0), + _ad_ = hexadecimal_value_of_char(c2), + c$0 = (16 * hexadecimal_value_of_char(c1) | 0) + _ad_ | 0, + switch$1 = 0; + if(0 <= c$0 && 255 >= c$0){ + var _af_ = caml_call1(Stdlib[29], c$0); + switch$1 = 1; + } + if(! switch$1) + var _af_ = bad_input(caml_call3(Stdlib_Printf[4], _m_, c1, c2)); + return store_char(width - 2 | 0, ib, _af_); + case 0: + case 6: + case 18: + case 22: + case 24: + switch$0 = 1; break; + } + } + else if(48 <= c0){ + var + get_digit$0 = + function(param){ + var c = next_char(ib); + return 9 < c - 48 >>> 0 ? bad_input_escape(c) : c; + }, + c1$0 = get_digit$0(0), + c2$0 = get_digit$0(0), + c = + ((100 * (c0 - 48 | 0) | 0) + (10 * (c1$0 - 48 | 0) | 0) | 0) + + (c2$0 - 48 | 0) + | 0, + switch$2 = 0; + if(0 <= c && 255 >= c){ + var _ag_ = caml_call1(Stdlib[29], c); + switch$2 = 1; + } + if(! switch$2) + var + _ag_ = bad_input(caml_call4(Stdlib_Printf[4], _l_, c0, c1$0, c2$0)); + return store_char(width - 2 | 0, ib, _ag_); + } + } + else if(34 === c0 || 39 <= c0) switch$0 = 1; + if(! switch$0) return bad_input_escape(c0); + var switch$3 = 0; + if(110 <= c0) + if(117 <= c0) + switch$3 = 1; + else + switch(c0 - 110 | 0){ + case 0: + var _ae_ = 10; break; + case 4: + var _ae_ = 13; break; + case 6: + var _ae_ = 9; break; + default: switch$3 = 1; + } + else if(98 === c0) var _ae_ = 8; else switch$3 = 1; + if(switch$3) var _ae_ = c0; + return store_char(width, ib, _ae_); + } + function scan_caml_string(width, ib){ + function find_stop$0(counter, width){ + var width$0 = width; + for(;;){ + var c = check_next_char_for_string(width$0, ib); + if(34 === c) return ignore_char(width$0, ib); + if(92 !== c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + var + width$1 = ignore_char(width$0, ib), + match = check_next_char_for_string(width$1, ib); + if(10 === match){ + var _ab_ = ignore_char(width$1, ib); + if(counter >= 50) + return caml_trampoline_return(skip_spaces, [0, _ab_]); + var counter$0 = counter + 1 | 0; + return skip_spaces(counter$0, _ab_); + } + if(13 !== match){ + var width$4 = scan_backslash_char(width$1, ib), width$0 = width$4; + continue; + } + var width$3 = ignore_char(width$1, ib); + if(10 !== check_next_char_for_string(width$3, ib)){ + var width$5 = store_char(width$3, ib, 13), width$0 = width$5; + continue; + } + var _ac_ = ignore_char(width$3, ib); + if(counter >= 50) return caml_trampoline_return(skip_spaces, [0, _ac_]); + var counter$1 = counter + 1 | 0; + return skip_spaces(counter$1, _ac_); + } + } + function skip_spaces(counter, width){ + var width$0 = width; + for(;;){ + if(32 === check_next_char_for_string(width$0, ib)){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + if(counter >= 50) + return caml_trampoline_return(find_stop$0, [0, width$0]); + var counter$0 = counter + 1 | 0; + return find_stop$0(counter$0, width$0); + } + } + function find_stop(width){return caml_trampoline(find_stop$0(0, width));} + var c = checked_peek_char(ib); + return 34 === c + ? find_stop(ignore_char(width, ib)) + : character_mismatch(34, c); + } + function scan_chars_in_char_set(char_set, scan_indic, width, ib){ + function scan_chars(i, stp){ + var i$0 = i; + for(;;){ + var c = peek_char(ib), _Z_ = 0 < i$0 ? 1 : 0; + if(_Z_){ + var ___ = 1 - ib[1]; + if(___) + var + _$_ = caml_call2(CamlinternalFormat[1], char_set, c), + _aa_ = _$_ ? c !== stp ? 1 : 0 : _$_; + else + var _aa_ = ___; + } + else + var _aa_ = _Z_; + if(! _aa_) return _aa_; + store_char(Stdlib[19], ib, c); + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + if(! scan_indic) return scan_chars(width, -1); + var c = scan_indic[1]; + scan_chars(width, c); + var _Y_ = 1 - ib[1]; + if(! _Y_) return _Y_; + var ci = peek_char(ib); + return c === ci ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function scanf_bad_input(ib, x){ + if(x[1] === Scan_failure) + var s = x[2]; + else{ + if(x[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(x, 1); + var s = x[2]; + } + var i = char_count(ib); + return bad_input(caml_call3(Stdlib_Printf[4], _o_, i, s)); + } + function width_of_pad_opt(pad_opt){ + if(! pad_opt) return Stdlib[19]; + var width = pad_opt[1]; + return width; + } + function stopper_of_formatting_lit(fmting){ + if(6 === fmting) return _p_; + var + str = caml_call1(CamlinternalFormat[17], fmting), + stp = caml_string_get(str, 1), + sub_str = + caml_call3 + (Stdlib_String[15], str, 2, caml_ml_string_length(str) - 2 | 0); + return [0, stp, sub_str]; + } + function take_format_readers$0(counter, k, fmt){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k, 0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], fmt$0 = rest; continue; + case 1: + var rest$0 = fmt$0[1], fmt$0 = rest$0; continue; + case 2: + var rest$1 = fmt$0[2], fmt$0 = rest$1; continue; + case 3: + var rest$2 = fmt$0[2], fmt$0 = rest$2; continue; + case 4: + var rest$3 = fmt$0[4], fmt$0 = rest$3; continue; + case 5: + var rest$4 = fmt$0[4], fmt$0 = rest$4; continue; + case 6: + var rest$5 = fmt$0[4], fmt$0 = rest$5; continue; + case 7: + var rest$6 = fmt$0[4], fmt$0 = rest$6; continue; + case 8: + var rest$7 = fmt$0[4], fmt$0 = rest$7; continue; + case 9: + var rest$8 = fmt$0[2], fmt$0 = rest$8; continue; + case 10: + var rest$9 = fmt$0[1], fmt$0 = rest$9; continue; + case 11: + var rest$10 = fmt$0[2], fmt$0 = rest$10; continue; + case 12: + var rest$11 = fmt$0[2], fmt$0 = rest$11; continue; + case 13: + var rest$12 = fmt$0[3], fmt$0 = rest$12; continue; + case 14: + var + rest$13 = fmt$0[3], + fmtty = fmt$0[2], + _V_ = caml_call1(CamlinternalFormat[21], fmtty), + _W_ = caml_call1(CamlinternalFormatBasics[2], _V_); + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, _W_, rest$13]); + var counter$0 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$0, k, _W_, rest$13); + case 15: + var rest$14 = fmt$0[1], fmt$0 = rest$14; continue; + case 16: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 17: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 18: + var _X_ = fmt$0[1]; + if(0 === _X_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _X_[1][1], + fmt$2 = caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$17), + fmt$0 = fmt$2; + continue; + } + var + rest$18 = fmt$0[2], + fmt$3 = _X_[1][1], + fmt$4 = caml_call2(CamlinternalFormatBasics[3], fmt$3, rest$18), + fmt$0 = fmt$4; + continue; + case 19: + var fmt_rest = fmt$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, fmt_rest);}; + case 20: + var rest$19 = fmt$0[3], fmt$0 = rest$19; continue; + case 21: + var rest$20 = fmt$0[2], fmt$0 = rest$20; continue; + case 22: + var rest$21 = fmt$0[1], fmt$0 = rest$21; continue; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, rest$22);}; + default: var fmt$0 = rest$22; continue; + } + switch(ign[0]){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + var fmt$0 = rest$22; continue; + case 3: + var fmt$0 = rest$22; continue; + case 4: + var fmt$0 = rest$22; continue; + case 5: + var fmt$0 = rest$22; continue; + case 6: + var fmt$0 = rest$22; continue; + case 7: + var fmt$0 = rest$22; continue; + case 8: + var fmt$0 = rest$22; continue; + case 9: + var fmtty$0 = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, fmtty$0, rest$22]); + var counter$1 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$1, k, fmtty$0, rest$22); + case 10: + var fmt$0 = rest$22; continue; + default: var fmt$0 = rest$22; continue; + } + default: var rest$23 = fmt$0[3], fmt$0 = rest$23; continue; + } + } + } + function take_fmtty_format_readers$0(counter, k, fmtty, fmt){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 !== "number") + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 1: + var fmtty$2 = fmtty$0[1], fmtty$0 = fmtty$2; continue; + case 2: + var fmtty$3 = fmtty$0[1], fmtty$0 = fmtty$3; continue; + case 3: + var fmtty$4 = fmtty$0[1], fmtty$0 = fmtty$4; continue; + case 4: + var fmtty$5 = fmtty$0[1], fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$6 = fmtty$0[1], fmtty$0 = fmtty$6; continue; + case 6: + var fmtty$7 = fmtty$0[1], fmtty$0 = fmtty$7; continue; + case 7: + var fmtty$8 = fmtty$0[1], fmtty$0 = fmtty$8; continue; + case 8: + var fmtty$9 = fmtty$0[2], fmtty$0 = fmtty$9; continue; + case 9: + var + rest = fmtty$0[3], + ty2 = fmtty$0[2], + ty1 = fmtty$0[1], + _U_ = caml_call1(CamlinternalFormat[21], ty1), + ty = caml_call2(CamlinternalFormat[22], _U_, ty2), + fmtty$10 = caml_call2(CamlinternalFormatBasics[1], ty, rest), + fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1], fmtty$0 = fmtty$11; continue; + case 11: + var fmtty$12 = fmtty$0[1], fmtty$0 = fmtty$12; continue; + case 12: + var fmtty$13 = fmtty$0[1], fmtty$0 = fmtty$13; continue; + case 13: + var fmt_rest = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest, fmt);}; + default: + var fmt_rest$0 = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest$0, fmt);}; + } + if(counter >= 50) + return caml_trampoline_return(take_format_readers$0, [0, k, fmt]); + var counter$0 = counter + 1 | 0; + return take_format_readers$0(counter$0, k, fmt); + } + } + function take_format_readers(k, fmt){ + return caml_trampoline(take_format_readers$0(0, k, fmt)); + } + function take_fmtty_format_readers(k, fmtty, fmt){ + return caml_trampoline(take_fmtty_format_readers$0(0, k, fmtty, fmt)); + } + function pad_prec_scanf(ib, fmt, readers, pad, prec, scan, token){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var p = prec[1]; + caml_call3(scan, Stdlib[19], p, ib); + var x$0 = caml_call1(token, ib); + return [0, x$0, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion); + caml_call3(scan, Stdlib[19], Stdlib[19], ib); + var x = caml_call1(token, ib); + return [0, x, make_scanf(ib, fmt, readers)]; + } + if(0 !== pad[0]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$2); + if(! pad[1]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$1); + var w = pad[2]; + if(typeof prec !== "number"){ + var p$0 = prec[1]; + caml_call3(scan, w, p$0, ib); + var x$2 = caml_call1(token, ib); + return [0, x$2, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$0); + caml_call3(scan, w, Stdlib[19], ib); + var x$1 = caml_call1(token, ib); + return [0, x$1, make_scanf(ib, fmt, readers)]; + } + function make_scanf(ib, fmt, readers){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + store_char(0, ib, checked_peek_char(ib)); + var c$1 = token_char(ib); + return [0, c$1, make_scanf(ib, rest, readers)]; + case 1: + var + rest$0 = fmt$0[1], + width$0 = 0, + find_stop = + function(width){ + var c = check_next_char_for_char(width, ib); + return 39 === c + ? ignore_char(width, ib) + : character_mismatch(39, c); + }, + c = checked_peek_char(ib); + if(39 === c){ + var + width = ignore_char(width$0, ib), + c$0 = check_next_char_for_char(width, ib); + if(92 === c$0) + find_stop(scan_backslash_char(ignore_char(width, ib), ib)); + else + find_stop(store_char(width, ib, c$0)); + } + else + character_mismatch(39, c); + var c$2 = token_char(ib); + return [0, c$2, make_scanf(ib, rest$0, readers)]; + case 2: + var pad = fmt$0[1], match = fmt$0[2]; + if(typeof match !== "number") + switch(match[0]){ + case 17: + var + rest$2 = match[2], + fmting_lit = match[1], + match$0 = stopper_of_formatting_lit(fmting_lit), + str = match$0[2], + stp = match$0[1], + scan$0 = + function(width, param, ib){ + return scan_string([0, stp], width, ib); + }, + str_rest = [11, str, rest$2]; + return pad_prec_scanf + (ib, str_rest, readers, pad, 0, scan$0, token_string); + case 18: + var _G_ = match[1]; + if(0 === _G_[0]){ + var + rest$3 = match[2], + fmt$1 = _G_[1][1], + scan$1 = + function(width, param, ib){ + return scan_string(_q_, width, ib); + }; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$3), + readers, + pad, + 0, + scan$1, + token_string); + } + var + rest$4 = match[2], + fmt$2 = _G_[1][1], + scan$2 = + function(width, param, ib){return scan_string(_r_, width, ib);}; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$2, rest$4), + readers, + pad, + 0, + scan$2, + token_string); + } + var + rest$1 = fmt$0[2], + scan = function(width, param, ib){return scan_string(0, width, ib);}; + return pad_prec_scanf(ib, rest$1, readers, pad, 0, scan, token_string); + case 3: + var + rest$5 = fmt$0[2], + pad$0 = fmt$0[1], + scan$3 = + function(width, param, ib){return scan_caml_string(width, ib);}; + return pad_prec_scanf + (ib, rest$5, readers, pad$0, 0, scan$3, token_string); + case 4: + var + rest$6 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1], + conv = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv)), + scan$4 = + function(width, param, ib){ + return scan_int_conversion(conv, width, ib); + }; + return pad_prec_scanf + (ib, + rest$6, + readers, + pad$1, + prec, + scan$4, + function(ib){ + return caml_int_of_string(token_int_literal(conv, ib)); + }); + case 5: + var + rest$7 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1], + conv$0 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$0)), + scan$5 = + function(width, param, ib){ + return scan_int_conversion(conv$0, width, ib); + }; + return pad_prec_scanf + (ib, + rest$7, + readers, + pad$2, + prec$0, + scan$5, + function(ib){ + return caml_int_of_string(token_int_literal(conv$0, ib)); + }); + case 6: + var + rest$8 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1], + conv$1 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$1)), + scan$6 = + function(width, param, ib){ + return scan_int_conversion(conv$1, width, ib); + }; + return pad_prec_scanf + (ib, + rest$8, + readers, + pad$3, + prec$1, + scan$6, + function(ib){ + return caml_int_of_string(token_int_literal(conv$1, ib)); + }); + case 7: + var + rest$9 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1], + conv$2 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$2)), + scan$7 = + function(width, param, ib){ + return scan_int_conversion(conv$2, width, ib); + }; + return pad_prec_scanf + (ib, + rest$9, + readers, + pad$4, + prec$2, + scan$7, + function(ib){ + return runtime.caml_int64_of_string + (token_int_literal(conv$2, ib)); + }); + case 8: + switch(fmt$0[1][2]){ + case 5: + case 8: + var rest$11 = fmt$0[4], prec$4 = fmt$0[3], pad$6 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$11, + readers, + pad$6, + prec$4, + scan_caml_float, + token_float); + case 6: + case 7: + var rest$12 = fmt$0[4], prec$5 = fmt$0[3], pad$7 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$12, + readers, + pad$7, + prec$5, + scan_hex_float, + token_float); + default: + var rest$10 = fmt$0[4], prec$3 = fmt$0[3], pad$5 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$10, + readers, + pad$5, + prec$3, + scan_float, + token_float); + } + case 9: + var + rest$13 = fmt$0[2], + pad$8 = fmt$0[1], + scan$8 = + function(param, _T_, ib){ + var + c = checked_peek_char(ib), + m = + 102 === c + ? 5 + : 116 + === c + ? 4 + : bad_input(caml_call2(Stdlib_Printf[4], _n_, c)); + return scan_string(0, m, ib); + }; + return pad_prec_scanf + (ib, rest$13, readers, pad$8, 0, scan$8, token_bool); + case 10: + var rest$14 = fmt$0[1]; + if(! end_of_input(ib)) return bad_input(cst_end_of_input_not_found); + var fmt$0 = rest$14; + continue; + case 11: + var + rest$15 = fmt$0[2], + str$0 = fmt$0[1], + _H_ = function(_S_){return check_char(ib, _S_);}; + caml_call2(Stdlib_String[29], _H_, str$0); + var fmt$0 = rest$15; + continue; + case 12: + var rest$16 = fmt$0[2], chr = fmt$0[1]; + check_char(ib, chr); + var fmt$0 = rest$16; + continue; + case 13: + var rest$17 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt), ib); + var s = token_string(ib); + try{ + var _I_ = caml_call2(CamlinternalFormat[14], s, fmtty), fmt$3 = _I_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt$3 = bad_input(msg); + } + return [0, fmt$3, make_scanf(ib, rest$17, readers)]; + case 14: + var rest$18 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt$0), ib); + var s$0 = token_string(ib); + try{ + var + fmt$6 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + fmt$7 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + _K_ = caml_call1(CamlinternalFormat[21], fmtty$0), + _L_ = caml_call1(CamlinternalFormatBasics[2], _K_), + fmt$8 = caml_call2(CamlinternalFormat[12], fmt$7, _L_), + _M_ = caml_call1(CamlinternalFormatBasics[2], fmtty$0), + _N_ = caml_call2(CamlinternalFormat[12], fmt$6, _M_), + fmt$5 = fmt$8, + fmt$4 = _N_; + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(exn$0, 0); + var + msg$0 = exn$0[2], + _J_ = bad_input(msg$0), + fmt$5 = _J_[2], + fmt$4 = _J_[1]; + } + return [0, + [0, fmt$4, s$0], + make_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$5, rest$18), + readers)]; + case 15: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_a); + case 16: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_t); + case 17: + var + rest$19 = fmt$0[2], + formatting_lit = fmt$0[1], + _O_ = caml_call1(CamlinternalFormat[17], formatting_lit), + _P_ = function(_R_){return check_char(ib, _R_);}; + caml_call2(Stdlib_String[29], _P_, _O_); + var fmt$0 = rest$19; + continue; + case 18: + var _Q_ = fmt$0[1]; + if(0 === _Q_[0]){ + var rest$20 = fmt$0[2], fmt$9 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 123); + var + fmt$10 = caml_call2(CamlinternalFormatBasics[3], fmt$9, rest$20), + fmt$0 = fmt$10; + continue; + } + var rest$21 = fmt$0[2], fmt$11 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 91); + var + fmt$12 = caml_call2(CamlinternalFormatBasics[3], fmt$11, rest$21), + fmt$0 = fmt$12; + continue; + case 19: + var fmt_rest = fmt$0[1]; + if(! readers) return caml_call1(Stdlib[1], cst_scanf_missing_reader); + var + readers_rest = readers[2], + reader = readers[1], + x = caml_call1(reader, ib); + return [0, x, make_scanf(ib, fmt_rest, readers_rest)]; + case 20: + var width_opt = fmt$0[1], match$1 = fmt$0[3]; + if(typeof match$1 !== "number" && 17 === match$1[0]){ + var + rest$23 = match$1[2], + fmting_lit$0 = match$1[1], + char_set$0 = fmt$0[2], + match$2 = stopper_of_formatting_lit(fmting_lit$0), + str$1 = match$2[2], + stp$0 = match$2[1], + width$2 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set$0, [0, stp$0], width$2, ib); + var s$2 = token_string(ib), str_rest$0 = [11, str$1, rest$23]; + return [0, s$2, make_scanf(ib, str_rest$0, readers)]; + } + var + rest$22 = fmt$0[3], + char_set = fmt$0[2], + width$1 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set, 0, width$1, ib); + var s$1 = token_string(ib); + return [0, s$1, make_scanf(ib, rest$22, readers)]; + case 21: + var rest$24 = fmt$0[2], counter = fmt$0[1]; + switch(counter){ + case 0: + var count = ib[5]; break; + case 1: + var count = char_count(ib); break; + default: var count = ib[6]; + } + return [0, count, make_scanf(ib, rest$24, readers)]; + case 22: + var rest$25 = fmt$0[1], c$3 = checked_peek_char(ib); + return [0, c$3, make_scanf(ib, rest$25, readers)]; + case 23: + var + rest$26 = fmt$0[2], + ign = fmt$0[1], + fmt$13 = caml_call2(CamlinternalFormat[6], ign, rest$26)[1], + match$3 = make_scanf(ib, fmt$13, readers); + if(! match$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + var arg_rest = match$3[2]; + return arg_rest; + default: return caml_call1(Stdlib[1], cst_scanf_bad_conversion_custo); + } + } + } + function kscanf_gen(ib, ef, af, param){ + var str = param[2], fmt = param[1]; + function k(readers, f$1){ + caml_call1(Stdlib_Buffer[9], ib[8]); + try{var args$1 = make_scanf(ib, fmt, readers);} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0); + if + (exc[1] !== Scan_failure && exc[1] !== Stdlib[7] && exc !== Stdlib[12]){ + if(exc[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exc, 0); + var + msg = exc[2], + _C_ = caml_call1(Stdlib_String[24], str), + _D_ = caml_call2(Stdlib[28], _C_, cst$0), + _E_ = caml_call2(Stdlib[28], cst_in_format, _D_), + _F_ = caml_call2(Stdlib[28], msg, _E_); + return caml_call1(Stdlib[1], _F_); + } + return caml_call2(ef, ib, exc); + } + var f = f$1, args = args$1; + for(;;){ + if(! args) return caml_call1(af, f); + var + args$0 = args[2], + x = args[1], + f$0 = caml_call1(f, x), + f = f$0, + args = args$0; + } + } + return take_format_readers(k, fmt); + } + function kscanf(ib, ef, fmt){ + return kscanf_gen(ib, ef, function(x){return x;}, fmt); + } + function kscanf_opt(ib, fmt){ + function _A_(x){return [0, x];} + return kscanf_gen(ib, function(param, _B_){return 0;}, _A_, fmt); + } + function bscanf(ib, fmt){return kscanf(ib, scanf_bad_input, fmt);} + function bscanf_opt(ib, fmt){return kscanf_opt(ib, fmt);} + function ksscanf(s, ef, fmt){return kscanf(from_string(s), ef, fmt);} + function sscanf(s, fmt){ + return kscanf(from_string(s), scanf_bad_input, fmt); + } + function sscanf_opt(s, fmt){return kscanf_opt(from_string(s), fmt);} + function scanf(fmt){return kscanf(stdin, scanf_bad_input, fmt);} + function scanf_opt(fmt){return kscanf_opt(stdin, fmt);} + function bscanf_format(ib, format, f){ + scan_caml_string(Stdlib[19], ib); + var str = token_string(ib); + try{var _z_ = caml_call2(CamlinternalFormat[15], str, format), fmt = _z_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt = bad_input(msg); + } + return caml_call1(f, fmt); + } + function sscanf_format(s, format, f){ + return bscanf_format(from_string(s), format, f); + } + function format_from_string(s, fmt){ + function _w_(x){return x;} + var + _x_ = caml_call1(Stdlib_String[24], s), + _y_ = caml_call2(Stdlib[28], _x_, cst$1); + return sscanf_format(caml_call2(Stdlib[28], cst$2, _y_), fmt, _w_); + } + function unescaped(s){ + function _u_(x){return x;} + var _v_ = caml_call2(Stdlib[28], s, cst$3); + return caml_call1(sscanf(caml_call2(Stdlib[28], cst$4, _v_), _t_), _u_); + } + var + Stdlib_Scanf = + [0, + [0, + stdin, + open_in, + open_in_bin, + close_in, + open_in, + open_in_bin, + from_string, + from_function, + from_channel, + end_of_input, + beginning_of_input, + name_of_input], + Scan_failure, + bscanf, + bscanf_opt, + sscanf, + sscanf_opt, + scanf, + scanf_opt, + kscanf, + ksscanf, + bscanf_format, + sscanf_format, + format_from_string, + unescaped]; + runtime.caml_register_global(64, Stdlib_Scanf, "Stdlib__Scanf"); + return; + } + (globalThis)); + +//# 22718 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_register_named_value = runtime.caml_register_named_value, + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + register = caml_register_named_value; + function register_exception(name, exn){ + var + _a_ = Stdlib_Obj[10], + slot = runtime.caml_obj_tag(exn) === _a_ ? exn : exn[1]; + return caml_register_named_value(name, slot); + } + var Stdlib_Callback = [0, register, register_exception]; + runtime.caml_register_global(1, Stdlib_Callback, "Stdlib__Callback"); + return; + } + (globalThis)); + +//# 23686 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, 0], + _b_ = [0, 0], + _a_ = [0, 0]; + function MakeSeeded(H){ + var + prng = [246, function(_aM_){return caml_call1(Stdlib_Random[15][2], 0);}]; + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Hashtbl[17], 0); + var x = 16; + for(;;){ + if(initial_size > x && Stdlib_Sys[13] >= (x * 2 | 0)){var x$0 = x * 2 | 0, x = x$0; continue;} + if(random){ + var _aK_ = runtime.caml_obj_tag(prng); + if(250 === _aK_) + var _aL_ = prng[1]; + else{ + var switch$0 = 0; + if(246 !== _aK_ && 244 !== _aK_){var _aL_ = prng; switch$0 = 1;} + if(! switch$0) var _aL_ = caml_call1(CamlinternalLazy[2], prng); + } + var seed = caml_call1(Stdlib_Random[15][4], _aL_); + } + else + var seed = 0; + return [0, 0, caml_make_vect(x, 0), seed, x]; + } + } + function clear(h){ + h[1] = 0; + var len = h[2].length - 1, _aI_ = len - 1 | 0, _aH_ = 0; + if(_aI_ >= 0){ + var i = _aH_; + for(;;){ + caml_check_bound(h[2], i)[1 + i] = 0; + var _aJ_ = i + 1 | 0; + if(_aI_ !== i){var i = _aJ_; continue;} + break; + } + } + return 0; + } + function reset(h){ + var len = h[2].length - 1; + return len === h[4] + ? clear(h) + : (h[1] = 0, h[2] = caml_make_vect(h[4], 0), 0); + } + function copy(h){ + var _aE_ = h[4], _aF_ = h[3], _aG_ = caml_call1(Stdlib_Array[6], h[2]); + return [0, h[1], _aG_, _aF_, _aE_]; + } + function key_index(h, hkey){return hkey & (h[2].length - 1 - 1 | 0);} + function clean(h){ + function do_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hkey = param$0[1], rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var rest$0 = param$0[3], c$0 = param$0[2]; + return [0, hkey, c$0, do_bucket(rest$0)]; + } + h[1] = h[1] - 1 | 0; + var param$0 = rest; + } + } + var d = h[2], _aC_ = d.length - 1 - 1 | 0, _aB_ = 0; + if(_aC_ >= 0){ + var i = _aB_; + for(;;){ + d[1 + i] = do_bucket(caml_check_bound(d, i)[1 + i]); + var _aD_ = i + 1 | 0; + if(_aC_ !== i){var i = _aD_; continue;} + break; + } + } + return 0; + } + function resize(h){ + var odata = h[2], osize = odata.length - 1, nsize = osize * 2 | 0; + clean(h); + var + _av_ = nsize < Stdlib_Sys[13] ? 1 : 0, + _aw_ = _av_ ? (osize >>> 1 | 0) <= h[1] ? 1 : 0 : _av_; + if(_aw_){ + var ndata = caml_make_vect(nsize, 0); + h[2] = ndata; + var + insert_bucket = + function(param){ + if(! param) return 0; + var rest = param[3], data = param[2], hkey = param[1]; + insert_bucket(rest); + var nidx = key_index(h, hkey); + ndata[1 + nidx] = + [0, hkey, data, caml_check_bound(ndata, nidx)[1 + nidx]]; + return 0; + }, + _ay_ = osize - 1 | 0, + _ax_ = 0; + if(_ay_ >= 0){ + var i = _ax_; + for(;;){ + insert_bucket(caml_check_bound(odata, i)[1 + i]); + var _aA_ = i + 1 | 0; + if(_ay_ !== i){var i = _aA_; continue;} + break; + } + } + var _az_ = 0; + } + else + var _az_ = _aw_; + return _az_; + } + function add(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + container = caml_call2(H[1], key, info), + bucket = [0, hkey, container, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _au_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _au_ ? resize(h) : _au_; + } + function remove(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function remove_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], next = param$0[3], c = param$0[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + h[1] = h[1] - 1 | 0; return next; + case 1: + return [0, hk, c, remove_bucket(next)]; + default: h[1] = h[1] - 1 | 0; var param$0 = next; continue; + } + var next$0 = param$0[3], c$0 = param$0[2]; + return [0, hk, c$0, remove_bucket(next$0)]; + } + } + var + i = key_index(h, hkey), + _at_ = remove_bucket(caml_check_bound(h[2], i)[1 + i]); + caml_check_bound(h[2], i)[1 + i] = _at_; + return 0; + } + function find(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _as_ = key_index(h, hkey), + param = caml_check_bound(h[2], _as_)[1 + _as_]; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], rest = param[3], c = param[2]; + if(hkey !== hk){var rest$0 = param[3], param = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return d;} + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + } + } + function find_opt(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _ar_ = key_index(h, hkey), + param = caml_check_bound(h[2], _ar_)[1 + _ar_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + var d = caml_call1(H[4], c); + if(d) return d; + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + var rest$0 = param[3], param = rest$0; + } + } + function find_all(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], rest = param$0[3], c = param$0[2]; + if(hkey !== hk){var rest$0 = param$0[3], param$0 = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return [0, d, find_in_bucket(rest)];} + var param$0 = rest; + continue; + case 1: + var param$0 = rest; continue; + default: var param$0 = rest; continue; + } + } + } + var _aq_ = key_index(h, hkey); + return find_in_bucket(caml_check_bound(h[2], _aq_)[1 + _aq_]); + } + function replace(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + l = caml_check_bound(h[2], i)[1 + i]; + try{ + var param = l; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], next = param[3], c = param[2]; + if(hkey !== hk){var next$0 = param[3], param = next$0; continue;} + if(caml_call2(H[3], c, key)){var param = next; continue;} + var _am_ = caml_call3(H[5], c, key, info); + return _am_; + } + } + catch(_ap_){ + var _an_ = caml_wrap_exception(_ap_); + if(_an_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_an_, 0); + var container = caml_call2(H[1], key, info); + caml_check_bound(h[2], i)[1 + i] = [0, hkey, container, l]; + h[1] = h[1] + 1 | 0; + var _ao_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _ao_ ? resize(h) : _ao_; + } + } + function mem(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _al_ = key_index(h, hkey), + param = caml_check_bound(h[2], _al_)[1 + _al_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hk !== hkey){var rest$0 = param[3], param = rest$0; continue;} + if(! caml_call2(H[3], c, key)) return 1; + var param = rest; + } + } + function length(h){return h[1];} + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + rest = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = rest; + } + } + function stats(h){ + var _af_ = h[2], _ag_ = 0; + function _ah_(m, b){ + var _ak_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _ak_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ah_, _ag_, _af_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ai_ = h[2]; + function _aj_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _aj_, _ai_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function bucket_length_alive(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var accu$1 = accu$0 + 1 | 0, accu$0 = accu$1, param$0 = rest; + continue; + } + var rest$0 = param$0[3], param$0 = rest$0; + } + } + function stats_alive(h){ + var size = [0, 0], _$_ = h[2], _aa_ = 0; + function _ab_(m, b){ + var _ae_ = bucket_length_alive(0, b); + return caml_call2(Stdlib_Int[11], m, _ae_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ab_, _aa_, _$_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ac_ = h[2]; + function _ad_(b){ + var l = bucket_length_alive(0, b); + size[1] = size[1] + l | 0; + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _ad_, _ac_); + return [0, size[1], h[2].length - 1, mbl, histo]; + } + function add_seq(tbl, i){ + function ___(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], ___, i); + } + function replace_seq(tbl, i){ + function _Z_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _Z_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function create(param){return caml_call1(Stdlib_Obj[24][1], 1);} + function get_key(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function check_key(t){return caml_call2(Stdlib_Obj[24][7], t, 0);} + function get_data(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make(key, data){ + var eph = create(0); + set_data(eph, data); + set_key(eph, key); + return eph; + } + function query(eph, key){ + var match = get_key(eph); + if(! match) return 0; + var k = match[1]; + return k === key ? get_data(eph) : 0; + } + function MakeSeeded$0(H){ + function create$0(k, d){ + var c = create(0); + set_data(c, d); + set_key(c, k); + return c; + } + var seeded_hash = H[2]; + function equal(c, k){ + var match = get_key(c); + if(! match) return 2; + var k$0 = match[1]; + return caml_call2(H[1], k, k$0) ? 0 : 1; + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + set_key(c, k); + return set_data(c, d); + } + return MakeSeeded + ([0, + create$0, + seeded_hash, + equal, + get_data, + set_key_data, + check_key]); + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$0([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _Y_ = include[1]; + function create(sz){return caml_call2(_Y_, _a_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$0(param){return [0, 0];} + function add(b, k, d){ + var _X_ = b[1]; + b[1] = [0, make(k, d), _X_]; + return 0; + } + function test_key(k, e){ + var match = get_key(e); + if(match){var x = match[1]; if(x === k) return 1;} + return 0; + } + function remove(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_key(k, h)){b[1] = caml_call2(Stdlib_List[12], acc, t); return 0;} + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find(b, k){ + var _U_ = b[1]; + function _V_(_W_){return test_key(k, _W_);} + var match = caml_call2(Stdlib_List[39], _V_, _U_); + if(! match) return 0; + var e = match[1]; + return get_data(e); + } + function length(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear(b){b[1] = 0; return 0;} + function create$0(param){return caml_call1(Stdlib_Obj[24][1], 2);} + function get_key1(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key1(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function get_key2(t){return caml_call2(Stdlib_Obj[24][3], t, 1);} + function set_key2(t, k){return caml_call3(Stdlib_Obj[24][5], t, 1, k);} + function get_data$0(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$0(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$1(key1, key2, data){ + var eph = create$0(0); + set_data$0(eph, data); + set_key1(eph, key1); + set_key2(eph, key2); + return eph; + } + function query$0(eph, key1, key2){ + var match = get_key1(eph); + if(! match) return 0; + var k = match[1]; + if(k !== key1) return 0; + var match$0 = get_key2(eph); + if(! match$0) return 0; + var k$0 = match$0[1]; + return k$0 === key2 ? get_data$0(eph) : 0; + } + function MakeSeeded$1(H1, H2){ + function create(param, d){ + var k2 = param[2], k1 = param[1], c = create$0(0); + set_data$0(c, d); + set_key1(c, k1); + set_key2(c, k2); + return c; + } + function seeded_hash(seed, param){ + var + k2 = param[2], + k1 = param[1], + _T_ = caml_call2(H2[2], seed, k2) * 65599 | 0; + return caml_call2(H1[2], seed, k1) + _T_ | 0; + } + function equal(c, param){ + var + k2 = param[2], + k1 = param[1], + match = get_key1(c), + match$0 = get_key2(c); + if(match && match$0){ + var k2$0 = match$0[1], k1$0 = match[1]; + if(caml_call2(H1[1], k1, k1$0) && caml_call2(H2[1], k2, k2$0)) return 0; + return 1; + } + return 2; + } + function set_key_data(c, param, d){ + var k2 = param[2], k1 = param[1]; + caml_call1(Stdlib_Obj[24][12], c); + set_key1(c, k1); + set_key2(c, k2); + return set_data$0(c, d); + } + function check_key(c){ + var _S_ = caml_call2(Stdlib_Obj[24][7], c, 0); + return _S_ ? caml_call2(Stdlib_Obj[24][7], c, 1) : _S_; + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$0, + set_key_data, + check_key]); + } + function Make$0(H1, H2){ + var equal = H2[1]; + function seeded_hash(seed, x){return caml_call1(H2[2], x);} + var equal$0 = H1[1], _Q_ = [0, equal, seeded_hash]; + function seeded_hash$0(seed, x){return caml_call1(H1[2], x);} + var + include = MakeSeeded$1([0, equal$0, seeded_hash$0], _Q_), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _R_ = include[1]; + function create(sz){return caml_call2(_R_, _b_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$2(param){return [0, 0];} + function add$0(b, k1, k2, d){ + var _P_ = b[1]; + b[1] = [0, make$1(k1, k2, d), _P_]; + return 0; + } + function test_keys(k1, k2, e){ + var match = get_key1(e), match$0 = get_key2(e); + if(match && match$0){ + var x2 = match$0[1], x1 = match[1]; + if(x1 === k1 && x2 === k2) return 1; + } + return 0; + } + function remove$0(b, k1, k2){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys(k1, k2, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$0(b, k1, k2){ + var _M_ = b[1]; + function _N_(_O_){return test_keys(k1, k2, _O_);} + var match = caml_call2(Stdlib_List[39], _N_, _M_); + if(! match) return 0; + var e = match[1]; + return get_data$0(e); + } + function length$0(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$0(b){b[1] = 0; return 0;} + function create$1(n){return caml_call1(Stdlib_Obj[24][1], n);} + function length$1(k){return caml_call1(Stdlib_Obj[24][2], k);} + function get_key$0(t, n){return caml_call2(Stdlib_Obj[24][3], t, n);} + function set_key$0(t, n, k){return caml_call3(Stdlib_Obj[24][5], t, n, k);} + function get_data$1(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$1(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$3(keys, data){ + var l = keys.length - 1, eph = create$1(l); + set_data$1(eph, data); + var _K_ = l - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var i = _J_; + for(;;){ + set_key$0(eph, i, caml_check_bound(keys, i)[1 + i]); + var _L_ = i + 1 | 0; + if(_K_ !== i){var i = _L_; continue;} + break; + } + } + return eph; + } + function query$1(eph, keys){ + var l = length$1(eph); + try{ + if(l !== keys.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _F_ = l - 1 | 0, _E_ = 0; + if(_F_ >= 0){ + var i = _E_; + for(;;){ + var match = get_key$0(eph, i); + if(! match) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var k = match[1]; + if(k !== caml_check_bound(keys, i)[1 + i]) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _H_ = i + 1 | 0; + if(_F_ !== i){var i = _H_; continue;} + break; + } + } + var _G_ = get_data$1(eph); + return _G_; + } + catch(_I_){ + var _D_ = caml_wrap_exception(_I_); + if(_D_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_D_, 0); + } + } + function MakeSeeded$2(H){ + function create(k, d){ + var c = create$1(k.length - 1); + set_data$1(c, d); + var _B_ = k.length - 1 - 1 | 0, _A_ = 0; + if(_B_ >= 0){ + var i = _A_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _C_ = i + 1 | 0; + if(_B_ !== i){var i = _C_; continue;} + break; + } + } + return c; + } + function seeded_hash(seed, k){ + var h = [0, 0], _w_ = k.length - 1 - 1 | 0, _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + var _x_ = h[1], _y_ = caml_check_bound(k, i)[1 + i]; + h[1] = (caml_call2(H[2], seed, _y_) * 65599 | 0) + _x_ | 0; + var _z_ = i + 1 | 0; + if(_w_ !== i){var i = _z_; continue;} + break; + } + } + return h[1]; + } + function equal(c, k){ + var len = k.length - 1, len$0 = length$1(c); + if(len !== len$0) return 1; + var i$1 = len - 1 | 0, i = i$1; + for(;;){ + if(0 > i) return 0; + var match = get_key$0(c, i); + if(! match) return 2; + var ki = match[1], _u_ = caml_check_bound(k, i)[1 + i]; + if(! caml_call2(H[1], _u_, ki)) return 1; + var i$0 = i - 1 | 0, i = i$0; + } + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + var _s_ = k.length - 1 - 1 | 0, _r_ = 0; + if(_s_ >= 0){ + var i = _r_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _t_ = i + 1 | 0; + if(_s_ !== i){var i = _t_; continue;} + break; + } + } + return set_data$1(c, d); + } + function check_key(c){ + var i$1 = length$1(c) - 1 | 0, i = i$1; + for(;;){ + var _p_ = i < 0 ? 1 : 0; + if(_p_) + var _q_ = _p_; + else{ + var _o_ = caml_call2(Stdlib_Obj[24][7], c, i); + if(_o_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _q_ = _o_; + } + return _q_; + } + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$1, + set_key_data, + check_key]); + } + function Make$1(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$2([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _n_ = include[1]; + function create(sz){return caml_call2(_n_, _c_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$4(param){return [0, 0];} + function add$1(b, k, d){ + var _m_ = b[1]; + b[1] = [0, make$3(k, d), _m_]; + return 0; + } + function test_keys$0(k, e){ + try{ + if(length$1(e) !== k.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _i_ = k.length - 1 - 1 | 0, _h_ = 0; + if(_i_ >= 0){ + var i = _h_; + for(;;){ + var match = get_key$0(e, i), switch$0 = 0; + if(match){ + var x = match[1]; + if(x === caml_check_bound(k, i)[1 + i]){ + var _k_ = i + 1 | 0; + if(_i_ !== i){var i = _k_; continue;} + switch$0 = 1; + } + } + if(! switch$0) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + break; + } + } + var _j_ = 1; + return _j_; + } + catch(_l_){ + var _g_ = caml_wrap_exception(_l_); + if(_g_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_g_, 0); + } + } + function remove$1(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys$0(k, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$1(b, k){ + var _d_ = b[1]; + function _e_(_f_){return test_keys$0(k, _f_);} + var match = caml_call2(Stdlib_List[39], _e_, _d_); + if(! match) return 0; + var e = match[1]; + return get_data$1(e); + } + function length$2(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$1(b){b[1] = 0; return 0;} + var + Stdlib_Ephemeron = + [0, + [0, + make, + query, + Make, + MakeSeeded$0, + [0, make$0, add, remove, find, length, clear]], + [0, + make$1, + query$0, + Make$0, + MakeSeeded$1, + [0, make$2, add$0, remove$0, find$0, length$0, clear$0]], + [0, + make$3, + query$1, + Make$1, + MakeSeeded$2, + [0, make$4, add$1, remove$1, find$1, length$2, clear$1]]]; + runtime.caml_register_global(13, Stdlib_Ephemeron, "Stdlib__Ephemeron"); + return; + } + (globalThis)); + +//# 24626 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$19 = "", + cst$23 = " ", + cst_2$1 = " 2>", + cst_2_1$1 = " 2>&1", + cst$22 = " <", + cst$21 = " >", + cst$20 = '"', + cst$24 = ".", + cst$25 = "..", + cst$28 = "../", + cst$27 = "./", + cst$26 = "/", + cst_dev_null = "/dev/null", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$18 = cst$19, + cst$17 = cst$19, + cst$16 = cst$19, + cst$8 = cst$21, + cst$15 = cst$19, + cst$9 = cst$22, + cst$14 = cst$19, + cst$10 = cst$23, + cst$11 = cst$23, + cst$12 = cst$20, + cst$13 = cst$19, + cst$6 = cst$20, + cst$7 = cst$20, + cst$4 = cst$19, + cst = cst$21, + cst$3 = cst$19, + cst$0 = cst$22, + cst$2 = cst$19, + cst$1 = cst$23, + null$0 = cst_dev_null, + current_dir_name = cst$24, + parent_dir_name = cst$25, + dir_sep = cst$26, + quotequote = "'\\''", + null$1 = "NUL", + current_dir_name$0 = cst$24, + parent_dir_name$0 = cst$25, + dir_sep$0 = "\\", + cst$5 = cst$24, + null$2 = cst_dev_null, + current_dir_name$1 = cst$24, + parent_dir_name$1 = cst$25, + dir_sep$1 = cst$26, + Stdlib = global_data.Stdlib, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_String = global_data.Stdlib__String, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Sys = global_data.Stdlib__Sys, + _i_ = [0, 7, 0], + _h_ = [0, 1, [0, 3, [0, 5, 0]]], + _e_ = [0, [2, 0, [4, 6, [0, 2, 6], 0, [2, 0, 0]]], "%s%06x%s"], + cst_Filename_chop_extension = "Filename.chop_extension", + cst_Filename_chop_suffix = "Filename.chop_suffix", + _c_ = [0, cst$20, 0], + cst_2_1$0 = cst_2_1$1, + cst_2$0 = cst_2$1, + cst_Filename_quote_command_bad = "Filename.quote_command: bad file name ", + cst_2_1 = cst_2_1$1, + cst_2 = cst_2$1, + cst_tmp = "/tmp"; + function generic_basename(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$3 = caml_ml_string_length(name) - 1 | 0, n = n$3; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var p = n + 1 | 0, n$1 = n; + for(;;){ + if(0 > n$1) return caml_call3(Stdlib_String[15], name, 0, p); + if(caml_call2(is_dir_sep, name, n$1)) + return caml_call3 + (Stdlib_String[15], name, n$1 + 1 | 0, (p - n$1 | 0) - 1 | 0); + var n$2 = n$1 - 1 | 0, n$1 = n$2; + } + } + } + function generic_dirname(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$5 = caml_ml_string_length(name) - 1 | 0, n = n$5; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var n$1 = n; + for(;;){ + if(0 > n$1) return current_dir_name; + if(! caml_call2(is_dir_sep, name, n$1)){ + var n$2 = n$1 - 1 | 0, n$1 = n$2; + continue; + } + var n$3 = n$1; + for(;;){ + if(0 > n$3) return caml_call3(Stdlib_String[15], name, 0, 1); + if(! caml_call2(is_dir_sep, name, n$3)) + return caml_call3(Stdlib_String[15], name, 0, n$3 + 1 | 0); + var n$4 = n$3 - 1 | 0, n$3 = n$4; + } + } + } + } + function is_dir_sep(s, i){return 47 === caml_string_get(s, i) ? 1 : 0;} + function is_relative(n){ + var + _aK_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _aL_ = _aK_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + return _aL_; + } + function is_implicit(n){ + var _aF_ = is_relative(n); + if(_aF_){ + var + _aG_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aH_ = + _aG_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_aH_) + var + _aI_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _aJ_ = + _aI_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + else + var _aJ_ = _aH_; + } + else + var _aJ_ = _aF_; + return _aJ_; + } + function check_suffix(name, suff){ + return caml_call2(Stdlib_String[11], suff, name); + } + function chop_suffix_opt(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s); + return caml_string_equal(r, suffix) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _k_ = caml_sys_getenv("TMPDIR"), temp_dir_name = _k_;} + catch(_aE_){ + var _a_ = caml_wrap_exception(_aE_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + var temp_dir_name = cst_tmp; + } + function quote(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 39); + var _aB_ = l - 1 | 0, _aA_ = 0; + if(_aB_ >= 0){ + var i = _aA_; + for(;;){ + if(39 === caml_string_get(s, i)) + caml_call2(Stdlib_Buffer[16], b, quotequote); + else{ + var _aD_ = caml_string_get(s, i); + caml_call2(Stdlib_Buffer[12], b, _aD_); + } + var _aC_ = i + 1 | 0; + if(_aB_ !== i){var i = _aC_; continue;} + break; + } + } + caml_call2(Stdlib_Buffer[12], b, 39); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_command(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _ap_ = cst_2_1; + else + var _az_ = quote(f), _ap_ = caml_call2(Stdlib[28], cst_2, _az_); + var _aq_ = _ap_; + } + else + var _aq_ = cst$4; + if(stdout) + var + f$0 = stdout[1], + _ar_ = quote(f$0), + _as_ = caml_call2(Stdlib[28], cst, _ar_); + else + var _as_ = cst$3; + var _at_ = caml_call2(Stdlib[28], _as_, _aq_); + if(stdin) + var + f$1 = stdin[1], + _au_ = quote(f$1), + _av_ = caml_call2(Stdlib[28], cst$0, _au_); + else + var _av_ = cst$2; + var + _aw_ = caml_call2(Stdlib[28], _av_, _at_), + _ax_ = caml_call2(Stdlib_List[19], quote, [0, cmd, args]), + _ay_ = caml_call2(Stdlib_String[6], cst$1, _ax_); + return caml_call2(Stdlib[28], _ay_, _aw_); + } + function basename(_ao_){ + return generic_basename(is_dir_sep, current_dir_name, _ao_); + } + function dirname(_an_){ + return generic_dirname(is_dir_sep, current_dir_name, _an_); + } + var + Unix = + [0, + null$0, + current_dir_name, + parent_dir_name, + dir_sep, + is_dir_sep, + is_relative, + is_implicit, + check_suffix, + chop_suffix_opt, + temp_dir_name, + quote, + quote_command, + basename, + dirname]; + function is_dir_sep$0(s, i){ + var c = caml_string_get(s, i), _ak_ = 47 === c ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else + var _am_ = 92 === c ? 1 : 0, _al_ = _am_ || (58 === c ? 1 : 0); + return _al_; + } + function is_relative$0(n){ + var + _ae_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _af_ = _ae_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + if(_af_){ + var + _ag_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _ah_ = _ag_ || (92 !== caml_string_get(n, 0) ? 1 : 0); + if(_ah_) + var + _ai_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aj_ = _ai_ || (58 !== caml_string_get(n, 1) ? 1 : 0); + else + var _aj_ = _ah_; + } + else + var _aj_ = _af_; + return _aj_; + } + function is_implicit$0(n){ + var _X_ = is_relative$0(n); + if(_X_){ + var + _Y_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _Z_ = + _Y_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_Z_){ + var + ___ = caml_ml_string_length(n) < 2 ? 1 : 0, + _$_ = + ___ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), ".\\"); + if(_$_){ + var + _aa_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ab_ = + _aa_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + if(_ab_) + var + _ac_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ad_ = + _ac_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), "..\\"); + else + var _ad_ = _ab_; + } + else + var _ad_ = _$_; + } + else + var _ad_ = _Z_; + } + else + var _ad_ = _X_; + return _ad_; + } + function check_suffix$0(name, suff){ + var + _U_ = caml_ml_string_length(suff) <= caml_ml_string_length(name) ? 1 : 0; + if(_U_) + var + s = + caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0, + caml_ml_string_length(suff)), + _V_ = caml_call1(Stdlib_String[26], suff), + _W_ = caml_string_equal(caml_call1(Stdlib_String[26], s), _V_); + else + var _W_ = _U_; + return _W_; + } + function chop_suffix_opt$0(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var + r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s), + _T_ = caml_call1(Stdlib_String[26], suffix); + return caml_string_equal(caml_call1(Stdlib_String[26], r), _T_) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _j_ = caml_sys_getenv("TEMP"), temp_dir_name$0 = _j_;} + catch(_S_){ + var _b_ = caml_wrap_exception(_S_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var temp_dir_name$0 = cst$5; + } + function quote$0(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + function add_bs(n){ + var _Q_ = 1; + if(n >= 1){ + var j = _Q_; + for(;;){ + caml_call2(Stdlib_Buffer[12], b, 92); + var _R_ = j + 1 | 0; + if(n !== j){var j = _R_; continue;} + break; + } + } + return 0; + } + function loop$0(counter, i){ + var i$0 = i; + for(;;){ + if(i$0 === l) return caml_call2(Stdlib_Buffer[12], b, 34); + var c = caml_string_get(s, i$0); + if(34 === c){ + var _O_ = 0; + if(counter >= 50) + return caml_trampoline_return(loop_bs, [0, _O_, i$0]); + var counter$1 = counter + 1 | 0; + return loop_bs(counter$1, _O_, i$0); + } + if(92 !== c){ + caml_call2(Stdlib_Buffer[12], b, c); + var i$1 = i$0 + 1 | 0, i$0 = i$1; + continue; + } + var _P_ = 0; + if(counter >= 50) return caml_trampoline_return(loop_bs, [0, _P_, i$0]); + var counter$0 = counter + 1 | 0; + return loop_bs(counter$0, _P_, i$0); + } + } + function loop_bs(counter, n, i){ + var n$0 = n, i$0 = i; + for(;;){ + if(i$0 === l){caml_call2(Stdlib_Buffer[12], b, 34); return add_bs(n$0);} + var match = caml_string_get(s, i$0); + if(34 === match){ + add_bs((2 * n$0 | 0) + 1 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + var _N_ = i$0 + 1 | 0; + if(counter >= 50) return caml_trampoline_return(loop$0, [0, _N_]); + var counter$1 = counter + 1 | 0; + return loop$0(counter$1, _N_); + } + if(92 === match){ + var i$1 = i$0 + 1 | 0, n$1 = n$0 + 1 | 0, n$0 = n$1, i$0 = i$1; + continue; + } + add_bs(n$0); + if(counter >= 50) return caml_trampoline_return(loop$0, [0, i$0]); + var counter$0 = counter + 1 | 0; + return loop$0(counter$0, i$0); + } + } + function loop(i){return caml_trampoline(loop$0(0, i));} + loop(0); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_cmd_filename(f){ + if + (! + caml_call2(Stdlib_String[14], f, 34) + && ! caml_call2(Stdlib_String[14], f, 37)){ + if(! caml_call2(Stdlib_String[14], f, 32)) return f; + var _M_ = caml_call2(Stdlib[28], f, cst$6); + return caml_call2(Stdlib[28], cst$7, _M_); + } + var _L_ = caml_call2(Stdlib[28], cst_Filename_quote_command_bad, f); + return caml_call1(Stdlib[2], _L_); + } + function quote_command$0(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _x_ = cst_2_1$0; + else + var + _J_ = quote_cmd_filename(f), + _x_ = caml_call2(Stdlib[28], cst_2$0, _J_); + var _y_ = _x_; + } + else + var _y_ = cst$16; + var _z_ = [0, _y_, _c_]; + if(stdout) + var + f$0 = stdout[1], + _A_ = quote_cmd_filename(f$0), + _B_ = caml_call2(Stdlib[28], cst$8, _A_); + else + var _B_ = cst$15; + var _C_ = [0, _B_, _z_]; + if(stdin) + var + f$1 = stdin[1], + _D_ = quote_cmd_filename(f$1), + _E_ = caml_call2(Stdlib[28], cst$9, _D_); + else + var _E_ = cst$14; + var + _G_ = caml_call2(Stdlib_List[19], quote$0, args), + s = caml_call2(Stdlib_String[6], cst$10, _G_), + b = caml_call1(Stdlib_Buffer[1], caml_ml_string_length(s) + 20 | 0), + _F_ = [0, _E_, _C_]; + function _w_(c){ + var switch$0 = 0; + if(62 <= c){ + var _K_ = c - 63 | 0; + if(60 < _K_ >>> 0){ + if(62 > _K_) switch$0 = 1; + } + else if(31 === _K_) switch$0 = 1; + } + else + if(42 <= c){ + if(60 === c) switch$0 = 1; + } + else if(33 <= c) + switch(c - 33 | 0){case 2:case 3:case 6: break;default: switch$0 = 1;} + return switch$0 + ? (caml_call2 + (Stdlib_Buffer[12], b, 94), + caml_call2(Stdlib_Buffer[12], b, c)) + : caml_call2(Stdlib_Buffer[12], b, c); + } + caml_call2(Stdlib_String[29], _w_, s); + var + _H_ = [0, cst$11, [0, caml_call1(Stdlib_Buffer[2], b), _F_]], + _I_ = [0, cst$12, [0, quote_cmd_filename(cmd), _H_]]; + return caml_call2(Stdlib_String[6], cst$13, _I_); + } + function drive_and_path(s){ + var _s_ = 2 <= caml_ml_string_length(s) ? 1 : 0; + if(_s_){ + var param = caml_string_get(s, 0), switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + var + _t_ = switch$0 ? 1 : 0, + _u_ = _t_ ? 58 === caml_string_get(s, 1) ? 1 : 0 : _t_; + } + else + var _u_ = _s_; + if(! _u_) return [0, cst$17, s]; + var + _v_ = + caml_call3(Stdlib_String[15], s, 2, caml_ml_string_length(s) - 2 | 0); + return [0, caml_call3(Stdlib_String[15], s, 0, 2), _v_]; + } + function dirname$0(s){ + var + match = drive_and_path(s), + path = match[2], + drive = match[1], + dir = generic_dirname(is_dir_sep$0, current_dir_name$0, path); + return caml_call2(Stdlib[28], drive, dir); + } + function basename$0(s){ + var path = drive_and_path(s)[2]; + return generic_basename(is_dir_sep$0, current_dir_name$0, path); + } + var + Win32 = + [0, + null$1, + current_dir_name$0, + parent_dir_name$0, + dir_sep$0, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name$0, + quote$0, + quote_command$0, + basename$0, + dirname$0]; + function basename$1(_r_){ + return generic_basename(is_dir_sep$0, current_dir_name$1, _r_); + } + function dirname$1(_q_){ + return generic_dirname(is_dir_sep$0, current_dir_name$1, _q_); + } + var + Cygwin = + [0, + null$2, + current_dir_name$1, + parent_dir_name$1, + dir_sep$1, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name, + quote, + quote_command, + basename$1, + dirname$1], + _d_ = Stdlib_Sys[4], + Sysdeps = + caml_string_notequal(_d_, "Cygwin") + ? caml_string_notequal(_d_, "Win32") ? Unix : Win32 + : Cygwin, + null$3 = Sysdeps[1], + current_dir_name$2 = Sysdeps[2], + parent_dir_name$2 = Sysdeps[3], + dir_sep$2 = Sysdeps[4], + is_dir_sep$1 = Sysdeps[5], + is_relative$1 = Sysdeps[6], + is_implicit$1 = Sysdeps[7], + check_suffix$1 = Sysdeps[8], + chop_suffix_opt$1 = Sysdeps[9], + temp_dir_name$1 = Sysdeps[10], + quote$1 = Sysdeps[11], + quote_command$1 = Sysdeps[12], + basename$2 = Sysdeps[13], + dirname$2 = Sysdeps[14]; + function concat(dirname, filename){ + var l = caml_ml_string_length(dirname); + if(0 !== l && ! is_dir_sep$1(dirname, l - 1 | 0)){ + var _p_ = caml_call2(Stdlib[28], dir_sep$2, filename); + return caml_call2(Stdlib[28], dirname, _p_); + } + return caml_call2(Stdlib[28], dirname, filename); + } + function chop_suffix(name, suff){ + return check_suffix$1(name, suff) + ? caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0) + : caml_call1(Stdlib[1], cst_Filename_chop_suffix); + } + function extension_len(name){ + var i$3 = caml_ml_string_length(name) - 1 | 0, i0 = i$3; + for(;;){ + if(0 <= i0 && ! is_dir_sep$1(name, i0)){ + if(46 !== caml_string_get(name, i0)){ + var i$2 = i0 - 1 | 0, i0 = i$2; + continue; + } + var i$1 = i0 - 1 | 0, i = i$1; + for(;;){ + if(0 <= i && ! is_dir_sep$1(name, i)){ + if(46 !== caml_string_get(name, i)) + return caml_ml_string_length(name) - i0 | 0; + var i$0 = i - 1 | 0, i = i$0; + continue; + } + return 0; + } + } + return 0; + } + } + function extension(name){ + var l = extension_len(name); + return 0 === l + ? cst$18 + : caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - l | 0, + l); + } + function chop_extension(name){ + var l = extension_len(name); + return 0 === l + ? caml_call1(Stdlib[1], cst_Filename_chop_extension) + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + function remove_extension(name){ + var l = extension_len(name); + return 0 === l + ? name + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function temp_file_name(temp_dir, prefix, suffix){ + var + random_state = caml_call1(Stdlib_Domain[10][2], prng_key), + rnd = caml_call1(Stdlib_Random[15][4], random_state) & 16777215; + return concat + (temp_dir, caml_call4(Stdlib_Printf[4], _e_, prefix, rnd, suffix)); + } + function _f_(param){return temp_dir_name$1;} + var + _g_ = [0, function(_o_){return _o_;}], + current_temp_dir_name = caml_call2(Stdlib_Domain[10][1], _g_, _f_); + function set_temp_dir_name(s){ + return caml_call2(Stdlib_Domain[10][3], current_temp_dir_name, s); + } + function get_temp_dir_name(param){ + return caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + } + function temp_file(opt, prefix, suffix){ + if(opt) + var sth = opt[1], temp_dir = sth; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + runtime.caml_sys_close(runtime.caml_sys_open(name, _h_, 384)); + return name; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + function open_temp_file(opt, _m_, _l_, prefix, suffix){ + if(opt) var sth = opt[1], mode = sth; else var mode = _i_; + if(_m_) var sth$0 = _m_[1], perms = sth$0; else var perms = 384; + if(_l_) + var sth$1 = _l_[1], temp_dir = sth$1; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + var + _n_ = + [0, + name, + caml_call3(Stdlib[62], [0, 1, [0, 3, [0, 5, mode]]], perms, name)]; + return _n_; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + var + Stdlib_Filename = + [0, + current_dir_name$2, + parent_dir_name$2, + dir_sep$2, + concat, + is_relative$1, + is_implicit$1, + check_suffix$1, + chop_suffix, + chop_suffix_opt$1, + extension, + remove_extension, + chop_extension, + basename$2, + dirname$2, + null$3, + temp_file, + open_temp_file, + get_temp_dir_name, + set_temp_dir_name, + quote$1, + quote_command$1]; + runtime.caml_register_global(65, Stdlib_Filename, "Stdlib__Filename"); + return; + } + (globalThis)); + +//# 25489 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + init = Stdlib_Array[1], + make_matrix = Stdlib_Array[2], + append = Stdlib_Array[3], + concat = Stdlib_Array[4], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + fill = Stdlib_Array[7], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + iter = Stdlib_Array[11], + iteri = Stdlib_Array[12], + map = Stdlib_Array[13], + mapi = Stdlib_Array[14], + fold_left = Stdlib_Array[15], + fold_left_map = Stdlib_Array[16], + fold_right = Stdlib_Array[17], + iter2 = Stdlib_Array[18], + map2 = Stdlib_Array[19], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + for_all2 = Stdlib_Array[22], + exists2 = Stdlib_Array[23], + mem = Stdlib_Array[24], + memq = Stdlib_Array[25], + find_opt = Stdlib_Array[26], + find_map = Stdlib_Array[27], + split = Stdlib_Array[28], + combine = Stdlib_Array[29], + sort = Stdlib_Array[30], + stable_sort = Stdlib_Array[31], + fast_sort = Stdlib_Array[32], + to_seq = Stdlib_Array[33], + to_seqi = Stdlib_Array[34], + of_seq = Stdlib_Array[35], + Floatarray = Stdlib_Array[36], + Stdlib_ArrayLabels = + [0, + init, + make_matrix, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + fast_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(1, Stdlib_ArrayLabels, "Stdlib__ArrayLabels"); + return; + } + (globalThis)); + +//# 25577 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + length = Stdlib_List[1], + compare_lengths = Stdlib_List[2], + compare_length_with = Stdlib_List[3], + cons = Stdlib_List[4], + hd = Stdlib_List[5], + tl = Stdlib_List[6], + nth = Stdlib_List[7], + nth_opt = Stdlib_List[8], + rev = Stdlib_List[9], + init = Stdlib_List[10], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + flatten = Stdlib_List[14], + equal = Stdlib_List[15], + compare = Stdlib_List[16], + iter = Stdlib_List[17], + iteri = Stdlib_List[18], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + filter_map = Stdlib_List[22], + concat_map = Stdlib_List[23], + fold_left_map = Stdlib_List[24], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + iter2 = Stdlib_List[27], + map2 = Stdlib_List[28], + rev_map2 = Stdlib_List[29], + fold_left2 = Stdlib_List[30], + fold_right2 = Stdlib_List[31], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + for_all2 = Stdlib_List[34], + exists2 = Stdlib_List[35], + mem = Stdlib_List[36], + memq = Stdlib_List[37], + find = Stdlib_List[38], + find_opt = Stdlib_List[39], + find_map = Stdlib_List[40], + filter = Stdlib_List[41], + find_all = Stdlib_List[42], + filteri = Stdlib_List[43], + partition = Stdlib_List[44], + partition_map = Stdlib_List[45], + assoc = Stdlib_List[46], + assoc_opt = Stdlib_List[47], + assq = Stdlib_List[48], + assq_opt = Stdlib_List[49], + mem_assoc = Stdlib_List[50], + mem_assq = Stdlib_List[51], + remove_assoc = Stdlib_List[52], + remove_assq = Stdlib_List[53], + split = Stdlib_List[54], + combine = Stdlib_List[55], + sort = Stdlib_List[56], + stable_sort = Stdlib_List[57], + fast_sort = Stdlib_List[58], + sort_uniq = Stdlib_List[59], + merge = Stdlib_List[60], + to_seq = Stdlib_List[61], + of_seq = Stdlib_List[62], + Stdlib_ListLabels = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + concat, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + filter, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + sort, + stable_sort, + fast_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(1, Stdlib_ListLabels, "Stdlib__ListLabels"); + return; + } + (globalThis)); + +//# 25717 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + make = Stdlib_Bytes[1], + init = Stdlib_Bytes[2], + empty = Stdlib_Bytes[3], + copy = Stdlib_Bytes[4], + of_string = Stdlib_Bytes[5], + to_string = Stdlib_Bytes[6], + sub = Stdlib_Bytes[7], + sub_string = Stdlib_Bytes[8], + extend = Stdlib_Bytes[9], + fill = Stdlib_Bytes[10], + blit = Stdlib_Bytes[11], + blit_string = Stdlib_Bytes[12], + concat = Stdlib_Bytes[13], + cat = Stdlib_Bytes[14], + iter = Stdlib_Bytes[15], + iteri = Stdlib_Bytes[16], + map = Stdlib_Bytes[17], + mapi = Stdlib_Bytes[18], + fold_left = Stdlib_Bytes[19], + fold_right = Stdlib_Bytes[20], + for_all = Stdlib_Bytes[21], + exists = Stdlib_Bytes[22], + trim = Stdlib_Bytes[23], + escaped = Stdlib_Bytes[24], + index = Stdlib_Bytes[25], + index_opt = Stdlib_Bytes[26], + rindex = Stdlib_Bytes[27], + rindex_opt = Stdlib_Bytes[28], + index_from = Stdlib_Bytes[29], + index_from_opt = Stdlib_Bytes[30], + rindex_from = Stdlib_Bytes[31], + rindex_from_opt = Stdlib_Bytes[32], + contains = Stdlib_Bytes[33], + contains_from = Stdlib_Bytes[34], + rcontains_from = Stdlib_Bytes[35], + uppercase_ascii = Stdlib_Bytes[36], + lowercase_ascii = Stdlib_Bytes[37], + capitalize_ascii = Stdlib_Bytes[38], + uncapitalize_ascii = Stdlib_Bytes[39], + compare = Stdlib_Bytes[40], + equal = Stdlib_Bytes[41], + starts_with = Stdlib_Bytes[42], + ends_with = Stdlib_Bytes[43], + unsafe_to_string = Stdlib_Bytes[44], + unsafe_of_string = Stdlib_Bytes[45], + split_on_char = Stdlib_Bytes[46], + to_seq = Stdlib_Bytes[47], + to_seqi = Stdlib_Bytes[48], + of_seq = Stdlib_Bytes[49], + get_utf_8_uchar = Stdlib_Bytes[50], + set_utf_8_uchar = Stdlib_Bytes[51], + is_valid_utf_8 = Stdlib_Bytes[52], + get_utf_16be_uchar = Stdlib_Bytes[53], + set_utf_16be_uchar = Stdlib_Bytes[54], + is_valid_utf_16be = Stdlib_Bytes[55], + get_utf_16le_uchar = Stdlib_Bytes[56], + set_utf_16le_uchar = Stdlib_Bytes[57], + is_valid_utf_16le = Stdlib_Bytes[58], + get_uint8 = Stdlib_Bytes[59], + get_int8 = Stdlib_Bytes[60], + get_uint16_ne = Stdlib_Bytes[61], + get_uint16_be = Stdlib_Bytes[62], + get_uint16_le = Stdlib_Bytes[63], + get_int16_ne = Stdlib_Bytes[64], + get_int16_be = Stdlib_Bytes[65], + get_int16_le = Stdlib_Bytes[66], + get_int32_ne = Stdlib_Bytes[67], + get_int32_be = Stdlib_Bytes[68], + get_int32_le = Stdlib_Bytes[69], + get_int64_ne = Stdlib_Bytes[70], + get_int64_be = Stdlib_Bytes[71], + get_int64_le = Stdlib_Bytes[72], + set_uint8 = Stdlib_Bytes[73], + set_int8 = Stdlib_Bytes[74], + set_uint16_ne = Stdlib_Bytes[75], + set_uint16_be = Stdlib_Bytes[76], + set_uint16_le = Stdlib_Bytes[77], + set_int16_ne = Stdlib_Bytes[78], + set_int16_be = Stdlib_Bytes[79], + set_int16_le = Stdlib_Bytes[80], + set_int32_ne = Stdlib_Bytes[81], + set_int32_be = Stdlib_Bytes[82], + set_int32_le = Stdlib_Bytes[83], + set_int64_ne = Stdlib_Bytes[84], + set_int64_be = Stdlib_Bytes[85], + set_int64_le = Stdlib_Bytes[86], + unsafe_escape = Stdlib_Bytes[87], + Stdlib_BytesLabels = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + equal, + starts_with, + ends_with, + unsafe_to_string, + unsafe_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + set_uint8, + set_int8, + set_uint16_ne, + set_uint16_be, + set_uint16_le, + set_int16_ne, + set_int16_be, + set_int16_le, + set_int32_ne, + set_int32_be, + set_int32_le, + set_int64_ne, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(1, Stdlib_BytesLabels, "Stdlib__BytesLabels"); + return; + } + (globalThis)); + +//# 25907 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + equal = Stdlib_String[8], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + Stdlib_StringLabels = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le]; + runtime.caml_register_global + (1, Stdlib_StringLabels, "Stdlib__StringLabels"); + return; + } + (globalThis)); + +//# 26052 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Set = global_data.Stdlib__Set, + Stdlib_Map = global_data.Stdlib__Map, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_MoreLabels = [0, Stdlib_Hashtbl, Stdlib_Map, Stdlib_Set]; + runtime.caml_register_global(3, Stdlib_MoreLabels, "Stdlib__MoreLabels"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 18 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + s = "5.1.1", + git_version = "", + Jsoo_runtime_Runtime_version = [0, s, git_version]; + runtime.caml_register_global + (2, Jsoo_runtime_Runtime_version, "Jsoo_runtime__Runtime_version"); + return; + } + (globalThis)); + +//# 33 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Jsoo_runtime_Runtime_version = global_data.Jsoo_runtime__Runtime_version, + Stdlib_Callback = global_data.Stdlib__Callback, + Js = [0], + Config = [0], + version = Jsoo_runtime_Runtime_version[1], + git_version = Jsoo_runtime_Runtime_version[2], + Sys = [0, Config, version, git_version], + Exn = [248, "Jsoo_runtime.Error.Exn", runtime.caml_fresh_oo_id(0)]; + caml_call2(Stdlib_Callback[2], "jsError", [0, Exn, [0]]); + function raise(exn){throw exn;} + var + Error = + [0, + raise, + runtime.caml_exn_with_js_backtrace, + runtime.caml_js_error_option_of_exception, + Exn], + For_compatibility_only = [0], + Bigstring = [0], + Typed_array = [0, Bigstring], + Int64 = [0], + Jsoo_runtime = + [0, Js, Sys, Error, For_compatibility_only, Typed_array, Int64]; + runtime.caml_register_global(5, Jsoo_runtime, "Jsoo_runtime"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 19 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + Stdlib_Char = global_data.Stdlib__Char, + Poly = [0]; + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, max, min], + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + equal = runtime.caml_string_equal, + String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + equal], + chr = Stdlib_Char[1], + escaped$0 = Stdlib_Char[2], + lowercase_ascii$0 = Stdlib_Char[3], + uppercase_ascii$0 = Stdlib_Char[4], + compare$0 = Stdlib_Char[5]; + function equal$0(x, y){return x === y ? 1 : 0;} + var + Char = + [0, + chr, + escaped$0, + lowercase_ascii$0, + uppercase_ascii$0, + compare$0, + equal$0], + max$0 = Int_replace_polymorphic_compar[1], + min$0 = Int_replace_polymorphic_compar[2], + Js_of_ocaml_Import = + [0, Poly, Int_replace_polymorphic_compar, String, Char, max$0, min$0]; + runtime.caml_register_global(2, Js_of_ocaml_Import, "Js_of_ocaml__Import"); + return; + } + (globalThis)); + +//# 188 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + jsoo_exports = typeof module === "object" && module.exports || globalThis, + runtime = globalThis.jsoo_runtime, + cst_parseFloat$0 = "parseFloat", + cst_parseInt$0 = "parseInt", + caml_js_get = runtime.caml_js_get, + caml_js_set = runtime.caml_js_set, + caml_js_wrap_callback = runtime.caml_js_wrap_callback, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Import = global_data.Js_of_ocaml__Import, + Stdlib = global_data.Stdlib, + Jsoo_runtime = global_data.Jsoo_runtime, + Stdlib_Printexc = global_data.Stdlib__Printexc, + global = globalThis, + Unsafe = [0, global], + null$0 = null, + undefined$0 = undefined, + cst_function = "function", + cst_parseFloat = cst_parseFloat$0, + cst_parseInt = cst_parseInt$0; + function return$0(_z_){return _z_;} + function map(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function bind(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function test(x){return 1 - (x == null$0 ? 1 : 0);} + function iter(x, f){ + var _y_ = 1 - (x == null$0 ? 1 : 0); + return _y_ ? caml_call1(f, x) : _y_; + } + function case$0(x, f, g){ + return x == null$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get(x, f){return x == null$0 ? caml_call1(f, 0) : x;} + function option(x){if(! x) return null$0; var x$0 = x[1]; return x$0;} + function to_option(x){ + function _x_(x){return [0, x];} + return case$0(x, function(param){return 0;}, _x_); + } + var + Opt = + [0, + null$0, + return$0, + map, + bind, + test, + iter, + case$0, + get, + option, + to_option]; + function return$1(_w_){return _w_;} + function map$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function bind$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function test$0(x){return x !== undefined$0 ? 1 : 0;} + function iter$0(x, f){ + var _v_ = x !== undefined$0 ? 1 : 0; + return _v_ ? caml_call1(f, x) : _v_; + } + function case$1(x, f, g){ + return x === undefined$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get$0(x, f){return x === undefined$0 ? caml_call1(f, 0) : x;} + function option$0(x){ + if(! x) return undefined$0; + var x$0 = x[1]; + return x$0; + } + function to_option$0(x){ + function _u_(x){return [0, x];} + return case$1(x, function(param){return 0;}, _u_); + } + var + Optdef = + [0, + undefined$0, + return$1, + map$0, + bind$0, + test$0, + iter$0, + case$1, + get$0, + option$0, + to_option$0]; + function coerce(x, f, g){ + function _s_(param){return caml_call1(g, x);} + var _t_ = caml_call1(f, x); + return caml_call2(Opt[8], _t_, _s_); + } + function coerce_opt(x, f, g){ + function _q_(param){return caml_call1(g, x);} + var _r_ = caml_call2(Opt[4], x, f); + return caml_call2(Opt[8], _r_, _q_); + } + var + true$0 = true, + false$0 = false, + nfc = "NFC", + nfd = "NFD", + nfkc = "NFKC", + nfkd = "NFKD", + t0 = Unsafe[1], + string_constr = t0.String, + t1 = Unsafe[1], + regExp = t1.RegExp, + t2 = Unsafe[1], + object_constructor = t2.Object; + function object_keys(o){return object_constructor.keys(o);} + var + t5 = Unsafe[1], + array_constructor = t5.Array, + array_get = caml_js_get, + array_set = caml_js_set; + function array_map(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call1(f, x);})); + } + function array_mapi(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call2(f, idx, x);})); + } + function str_array(_p_){return _p_;} + function match_result(_o_){return _o_;} + var + t8 = Unsafe[1], + date_constr = t8.Date, + t9 = Unsafe[1], + math = t9.Math, + t10 = Unsafe[1], + error_constr = t10.Error, + include = Jsoo_runtime[3], + raise = include[1], + exn_with_js_backtrace = include[2], + of_exn = include[3], + Error = include[4]; + function name(t11){return caml_string_of_jsstring(t11.name);} + function message(t12){return caml_string_of_jsstring(t12.message);} + function stack(t13){ + var _n_ = caml_call2(Opt[3], t13.stack, caml_string_of_jsstring); + return caml_call1(Opt[10], _n_); + } + function to_string(e){return caml_string_of_jsstring(e.toString());} + function raise_js_error(e){return caml_call1(raise, e);} + function string_of_error(e){return to_string(e);} + var t15 = Unsafe[1], JSON = t15.JSON; + function decodeURI(s){var t16 = Unsafe[1]; return t16.decodeURI(s);} + function decodeURIComponent(s){ + var t17 = Unsafe[1]; + return t17.decodeURIComponent(s); + } + function encodeURI(s){var t18 = Unsafe[1]; return t18.encodeURI(s);} + function encodeURIComponent(s){ + var t19 = Unsafe[1]; + return t19.encodeURIComponent(s); + } + function escape(s){var t20 = Unsafe[1]; return t20.escape(s);} + function unescape(s){var t21 = Unsafe[1]; return t21.unescape(s);} + function isNaN(i){var t22 = Unsafe[1]; return t22.isNaN(i) | 0;} + function parseInt(s){ + var t23 = Unsafe[1], s$0 = t23.parseInt(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseInt) : s$0; + } + function parseFloat(s){ + var t24 = Unsafe[1], s$0 = t24.parseFloat(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseFloat) : s$0; + } + function _a_(param){ + if(param[1] !== Error) return 0; + var e = param[2]; + return [0, to_string(e)]; + } + caml_call1(Stdlib_Printexc[9], _a_); + function _b_(e){ + return e instanceof array_constructor + ? 0 + : [0, caml_string_of_jsstring(e.toString())]; + } + caml_call1(Stdlib_Printexc[9], _b_); + function export_js(field, x){ + var _l_ = caml_string_of_jsstring(typeof x), switch$0 = 0; + if + (caml_call2(Js_of_ocaml_Import[3][64], _l_, cst_function) && 0 < x.length){var _m_ = caml_js_wrap_callback(x); switch$0 = 1;} + if(! switch$0) var _m_ = x; + return jsoo_exports[field] = _m_; + } + function export$0(field, x){ + return export_js(runtime.caml_jsstring_of_string(field), x); + } + function export_all(obj){ + var keys = object_keys(obj); + return keys.forEach + (caml_js_wrap_callback + (function(key, param, _k_){return export_js(key, obj[key]);})); + } + var _c_ = runtime.caml_js_error_of_exception; + function _d_(_j_){return _j_;} + var + _e_ = + [0, + to_string, + name, + message, + stack, + raise, + exn_with_js_backtrace, + of_exn, + Error, + function(_i_){return _i_;}, + _d_]; + function _f_(_h_){return _h_;} + var + Js_of_ocaml_Js = + [0, + null$0, + function(_g_){return _g_;}, + undefined$0, + _f_, + Opt, + Optdef, + true$0, + false$0, + nfd, + nfc, + nfkd, + nfkc, + string_constr, + regExp, + regExp, + regExp, + object_keys, + array_constructor, + array_constructor, + array_get, + array_set, + array_map, + array_mapi, + str_array, + match_result, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + math, + error_constr, + _e_, + JSON, + decodeURI, + decodeURIComponent, + encodeURI, + encodeURIComponent, + escape, + unescape, + isNaN, + parseInt, + parseFloat, + coerce, + coerce_opt, + export$0, + export_all, + Unsafe, + string_of_error, + raise_js_error, + exn_with_js_backtrace, + _c_, + Error]; + runtime.caml_register_global(43, Js_of_ocaml_Js, "Js_of_ocaml__Js"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function pre_test_hook(_a_){return 0;} + var Inline_test_config = [0, pre_test_hook]; + runtime.caml_register_global(0, Inline_test_config, "Inline_test_config"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_internalhash_types = [0]; + runtime.caml_register_global + (0, Base_internalhash_types, "Base_internalhash_types"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.caml/caml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.caml/caml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + invalid_arg = Stdlib[1], + failwith = Stdlib[2], + Exit = Stdlib[3], + Match_failure = Stdlib[4], + Assert_failure = Stdlib[5], + Invalid_argument = Stdlib[6], + Failure = Stdlib[7], + Not_found = Stdlib[8], + Out_of_memory = Stdlib[9], + Stack_overflow = Stdlib[10], + Sys_error = Stdlib[11], + End_of_file = Stdlib[12], + Division_by_zero = Stdlib[13], + Sys_blocked_io = Stdlib[14], + Undefined_recursive_module = Stdlib[15], + min = Stdlib[16], + max = Stdlib[17], + abs = Stdlib[18], + max_int = Stdlib[19], + min_int = Stdlib[20], + lnot = Stdlib[21], + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon_float = Stdlib[27], + symbol = Stdlib[28], + char_of_int = Stdlib[29], + string_of_bool = Stdlib[30], + bool_of_string_opt = Stdlib[31], + bool_of_string = Stdlib[32], + string_of_int = Stdlib[33], + int_of_string_opt = Stdlib[34], + string_of_float = Stdlib[35], + float_of_string_opt = Stdlib[36], + symbol$0 = Stdlib[37], + stdin = Stdlib[38], + stdout = Stdlib[39], + stderr = Stdlib[40], + print_char = Stdlib[41], + print_string = Stdlib[42], + print_bytes = Stdlib[43], + print_int = Stdlib[44], + print_float = Stdlib[45], + print_endline = Stdlib[46], + print_newline = Stdlib[47], + prerr_char = Stdlib[48], + prerr_string = Stdlib[49], + prerr_bytes = Stdlib[50], + prerr_int = Stdlib[51], + prerr_float = Stdlib[52], + prerr_endline = Stdlib[53], + prerr_newline = Stdlib[54], + read_line = Stdlib[55], + read_int_opt = Stdlib[56], + read_int = Stdlib[57], + read_float_opt = Stdlib[58], + read_float = Stdlib[59], + open_out = Stdlib[60], + open_out_bin = Stdlib[61], + open_out_gen = Stdlib[62], + flush = Stdlib[63], + flush_all = Stdlib[64], + output_char = Stdlib[65], + output_string = Stdlib[66], + output_bytes = Stdlib[67], + output = Stdlib[68], + output_substring = Stdlib[69], + output_byte = Stdlib[70], + output_binary_int = Stdlib[71], + output_value = Stdlib[72], + seek_out = Stdlib[73], + pos_out = Stdlib[74], + out_channel_length = Stdlib[75], + close_out = Stdlib[76], + close_out_noerr = Stdlib[77], + set_binary_mode_out = Stdlib[78], + open_in = Stdlib[79], + open_in_bin = Stdlib[80], + open_in_gen = Stdlib[81], + input_char = Stdlib[82], + input_line = Stdlib[83], + input = Stdlib[84], + really_input = Stdlib[85], + really_input_string = Stdlib[86], + input_byte = Stdlib[87], + input_binary_int = Stdlib[88], + input_value = Stdlib[89], + seek_in = Stdlib[90], + pos_in = Stdlib[91], + in_channel_length = Stdlib[92], + close_in = Stdlib[93], + close_in_noerr = Stdlib[94], + set_binary_mode_in = Stdlib[95], + LargeFile = Stdlib[96], + string_of_format = Stdlib[97], + symbol$1 = Stdlib[98], + exit = Stdlib[99], + at_exit = Stdlib[100], + valid_float_lexem = Stdlib[101], + unsafe_really_input = Stdlib[102], + do_at_exit = Stdlib[103], + do_domain_local_at_exit = Stdlib[104], + Caml = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + LargeFile, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Caml, "Caml"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/sexplib0/sexplib0.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "(", + cst$12 = "()", + cst$13 = ")", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$2 = cst$11, + cst$3 = cst$12, + cst$4 = cst$13, + cst$5 = " ", + cst$6 = cst$11, + cst$7 = cst$12, + cst$8 = cst$13, + cst$10 = cst$12, + cst$9 = cst$12, + cst = "\\", + cst$0 = ' "', + cst$1 = '"', + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Format = global_data.Stdlib__Format, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib = global_data.Stdlib, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _b_ = [0, [15, [17, 2, 0]], "%a@?"], + _a_ = [0, 0, 0], + cst_n = "\\n", + cst_Sexplib0_Sexp_Not_found_s = "Sexplib0__Sexp.Not_found_s", + cst_Sexplib0_Sexp_Of_sexp_erro = "Sexplib0__Sexp.Of_sexp_error"; + function sexp_of_t(t){return t;} + function t_of_sexp(t){return t;} + function compare(a$0, b$0){ + if(a$0 === b$0) return 0; + if(0 === a$0[0]){ + var a$1 = a$0[1]; + if(0 !== b$0[0]) return -1; + var b$1 = b$0[1]; + return caml_call2(Stdlib_StringLabels[9], a$1, b$1); + } + var a$2 = a$0[1]; + if(0 === b$0[0]) return 1; + var b$2 = b$0[1], a = a$2, b = b$2; + for(;;){ + if(! a) return b ? -1 : 0; + if(! b) return 1; + var ys = b[2], y = b[1], xs = a[2], x = a[1], res = compare(x, y); + if(0 !== res) return res; + var a = xs, b = ys; + } + } + function equal(a, b){return 0 === compare(a, b) ? 1 : 0;} + var + Not_found_s = [248, cst_Sexplib0_Sexp_Not_found_s, caml_fresh_oo_id(0)], + Of_sexp_error = [248, cst_Sexplib0_Sexp_Of_sexp_erro, caml_fresh_oo_id(0)], + default_indent = [0, 1]; + function must_escape(str){ + var len = caml_ml_string_length(str), _x_ = 0 === len ? 1 : 0; + if(_x_) return _x_; + var ix$1 = len - 1 | 0, ix = ix$1; + for(;;){ + var match = caml_string_get(str, ix), switch$0 = 0; + if(92 <= match){ + var switcher = match - 93 | 0; + if(33 < switcher >>> 0) + if(0 <= switcher) switch$0 = 2; else switch$0 = 1; + else if(31 === switcher){ + var _y_ = 0 < ix ? 1 : 0; + if(_y_){ + var + next = ix - 1 | 0, + _z_ = caml_string_get(str, next), + _A_ = caml_call2(Stdlib_Char[6], _z_, 35); + if(! _A_){var ix = next; continue;} + var _B_ = _A_; + } + else + var _B_ = _y_; + return _B_; + } + } + else + if(42 <= match){ + if(59 === match) switch$0 = 1; + } + else if(33 <= match) + switch(match - 33 | 0){ + case 2: + var _D_ = 0 < ix ? 1 : 0; + if(_D_){ + var + next$0 = ix - 1 | 0, + _E_ = caml_string_get(str, next$0), + _F_ = caml_call2(Stdlib_Char[6], _E_, 124); + if(! _F_){var ix = next$0; continue;} + var _G_ = _F_; + } + else + var _G_ = _D_; + return _G_; + case 1: + case 7: + case 8: + switch$0 = 1; break; + } + else + switch$0 = 2; + switch(switch$0){ + case 0: + var _C_ = 0 < ix ? 1 : 0; + if(! _C_) return _C_; + var ix$0 = ix - 1 | 0, ix = ix$0; + continue; + case 1: + return 1; + default: return 1; + } + } + } + function escaped(s){ + var n = [0, 0], _n_ = caml_ml_string_length(s) - 1 | 0, _m_ = 0; + if(_n_ >= 0){ + var i$0 = _m_; + for(;;){ + var match = caml_string_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _u_ = match - 34 | 0, switch$1 = 0; + if(58 < _u_ >>> 0){ + if(93 > _u_) switch$1 = 1; + } + else if(56 < _u_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _v_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){case 0: var _v_ = 4; break;case 1: var _v_ = 2; break; + } + n[1] = n[1] + _v_ | 0; + var _w_ = i$0 + 1 | 0; + if(_n_ !== i$0){var i$0 = _w_; continue;} + break; + } + } + if(n[1] === caml_ml_string_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _p_ = caml_ml_string_length(s) - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var c = caml_string_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + var _r_ = caml_call1(Stdlib_Char[1], 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _r_); + n[1]++; + var + _s_ = caml_call1(Stdlib_Char[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _s_); + n[1]++; + var _t_ = caml_call1(Stdlib_Char[1], 48 + (c % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _t_); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return caml_call1(Stdlib_BytesLabels[44], s$0); + } + function esc_str(str){ + var + estr = escaped(str), + elen = caml_ml_string_length(estr), + res = caml_create_bytes(elen + 2 | 0); + caml_call5(Stdlib_Bytes[12], estr, 0, res, 1, elen); + caml_bytes_unsafe_set(res, 0, 34); + caml_bytes_unsafe_set(res, elen + 1 | 0, 34); + return caml_call1(Stdlib_BytesLabels[44], res); + } + function index_of_newline(str, start){ + try{ + var _k_ = [0, caml_call3(Stdlib_StringLabels[31], str, start, 10)]; + return _k_; + } + catch(_l_){ + var _j_ = caml_wrap_exception(_l_); + if(_j_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_j_, 0); + } + } + function mach_maybe_esc_str(str){ + return must_escape(str) ? esc_str(str) : str; + } + function pp_hum_indent(indent, ppf, param){ + if(0 === param[0]){ + var str = param[1]; + if(! must_escape(str)) return caml_call2(Stdlib_Format[13], ppf, str); + var match = index_of_newline(str, 0); + if(match) + var + index = match[1], + _g_ = (index + 1 | 0) === caml_ml_string_length(str) ? 1 : 0; + else + var _g_ = 1; + if(_g_){ + var _h_ = esc_str(str); + return caml_call2(Stdlib_Format[13], ppf, _h_); + } + caml_call2(Stdlib_Format[1], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst$0); + var index$0 = 0; + for(;;){ + var next_newline = index_of_newline(str, index$0); + if(next_newline) + var end_pos = next_newline[1], end_pos$0 = end_pos; + else + var end_pos$0 = caml_ml_string_length(str); + var + next_line = + caml_call3 + (Stdlib_StringLabels[15], str, index$0, end_pos$0 - index$0 | 0), + _i_ = escaped(next_line); + caml_call2(Stdlib_Format[13], ppf, _i_); + if(next_newline){ + var newline_index = next_newline[1]; + caml_call2(Stdlib_Format[13], ppf, cst); + caml_call2(Stdlib_Format[34], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst_n); + var index$1 = newline_index + 1 | 0, index$0 = index$1; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$1); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + var match$0 = param[1]; + if(! match$0) return caml_call2(Stdlib_Format[13], ppf, cst$3); + var t = match$0[2], h = match$0[1]; + caml_call2(Stdlib_Format[1], ppf, indent); + caml_call2(Stdlib_Format[13], ppf, cst$2); + pp_hum_indent(indent, ppf, h); + var param$0 = t; + for(;;){ + if(param$0){ + var t$0 = param$0[2], h$0 = param$0[1]; + caml_call2(Stdlib_Format[27], ppf, 0); + pp_hum_indent(indent, ppf, h$0); + var param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$4); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + function pp_mach_internal(may_need_space, ppf, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Format[13], ppf, cst$5); + caml_call2(Stdlib_Format[13], ppf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Format[13], ppf, cst$7); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Format[13], ppf, cst$6); + var + may_need_space$0 = pp_mach_internal(0, ppf, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = pp_mach_internal(may_need_space$1, ppf, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$8); + return 0; + } + } + function pp_hum(ppf, sexp){ + return pp_hum_indent(default_indent[1], ppf, sexp); + } + function pp_mach(ppf, sexp){pp_mach_internal(0, ppf, sexp); return 0;} + function size_loop(acc, param){ + var c = acc[2], v = acc[1]; + if(0 === param[0]){ + var str = param[1]; + return [0, v + 1 | 0, c + caml_ml_string_length(str) | 0]; + } + var lst = param[1]; + return caml_call3(Stdlib_ListLabels[25], size_loop, acc, lst); + } + function size(sexp){return size_loop(_a_, sexp);} + function to_buffer_hum(buf, opt, sexp){ + if(opt) + var sth = opt[1], indent = sth; + else + var indent = default_indent[1]; + var ppf = caml_call1(Stdlib_Format[114], buf); + function _d_(_e_, _f_){return pp_hum_indent(indent, _e_, _f_);} + return caml_call4(Stdlib_Format[135], ppf, _b_, _d_, sexp); + } + function to_buffer_mach(buf, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Buffer[12], buf, 32); + caml_call2(Stdlib_Buffer[16], buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Buffer[16], buf, cst$9); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Buffer[12], buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Buffer[12], buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function to_buffer_gen(buf, add_char, add_string, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(add_char, buf, 32); + caml_call2(add_string, buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(add_string, buf, cst$10); return 0;} + var t = match[2], h = match[1]; + caml_call2(add_char, buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(add_char, buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function buffer(param){return caml_call1(Stdlib_Buffer[1], 1024);} + function to_string_hum(indent, sexp){ + if(0 === sexp[0]){ + var str = sexp[1], _c_ = index_of_newline(str, 0) ? 0 : 1; + if(_c_) return mach_maybe_esc_str(str); + } + var buf = buffer(0); + to_buffer_hum(buf, indent, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + function to_string_mach(sexp){ + if(0 === sexp[0]){var str = sexp[1]; return mach_maybe_esc_str(str);} + var buf = buffer(0); + to_buffer_mach(buf, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + var of_float_style = [0, 1009018843], of_int_style = [0, 1009018843]; + function message(name, fields){ + function conv_fields(param){ + if(! param) return 0; + var + rest = param[2], + match = param[1], + fsexp = match[2], + fname = match[1]; + return runtime.caml_string_notequal(fname, "") + ? [0, [1, [0, [0, fname], [0, fsexp, 0]]], conv_fields(rest)] + : [0, fsexp, conv_fields(rest)]; + } + return [1, [0, [0, name], conv_fields(fields)]]; + } + var + Sexplib0_Sexp = + [0, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp_mach, + to_string_hum, + to_string_mach, + to_string_mach, + of_float_style, + of_int_style, + [0, + size, + buffer, + to_buffer_mach, + to_buffer_hum, + to_buffer_mach, + to_buffer_gen, + mach_maybe_esc_str, + must_escape, + esc_str]]; + runtime.caml_register_global(26, Sexplib0_Sexp, "Sexplib0__Sexp"); + return; + } + (globalThis)); + +//# 555 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + doc_comment_tag = "sexp_grammar.doc_comment"; + function coerce(t){return t;} + var Sexplib0_Sexp_grammar = [0, coerce, doc_comment_tag]; + runtime.caml_register_global + (1, Sexplib0_Sexp_grammar, "Sexplib0__Sexp_grammar"); + return; + } + (globalThis)); + +//# 570 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + unit_sexp_grammar = [2, 0], + sexp_t_sexp_grammar = [0, "Sexp.t"], + empty_sexp_grammar = [4, 0], + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + bool_sexp_grammar = 0, + string_sexp_grammar = 4, + bytes_sexp_grammar = 4, + char_sexp_grammar = 1, + int_sexp_grammar = 2, + float_sexp_grammar = 3, + int32_sexp_grammar = 2, + int64_sexp_grammar = 2, + nativeint_sexp_grammar = 2; + function ref_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function lazy_t_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function option_sexp_grammar(param){return [1, param];} + function list_sexp_grammar(param){return [2, [1, param]];} + function array_sexp_grammar(param){return [2, [1, param]];} + var + Sexplib0_Sexp_conv_grammar = + [0, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + empty_sexp_grammar, + empty_sexp_grammar]; + runtime.caml_register_global + (4, Sexplib0_Sexp_conv_grammar, "Sexplib0__Sexp_conv_grammar"); + return; + } + (globalThis)); + +//# 632 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Assert_failure$0 = "Assert_failure", + cst_None = "None", + cst_Some = "Some", + cst_none = "none", + cst_option_of_sexp_only_none_c$1 = "option_of_sexp: only none can be atom", + cst_some = "some", + cst_src_sexp_conv_ml = "src/sexp_conv.ml", + caml_check_bound = runtime.caml_check_bound, + caml_float_of_string = runtime.caml_float_of_string, + caml_format_float = runtime.caml_format_float, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Stdlib_Parsing = global_data.Stdlib__Parsing, + Stdlib_Queue = global_data.Stdlib__Queue, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Stdlib_Obj = global_data.Stdlib__Obj, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Ephemeron = global_data.Stdlib__Ephemeron, + Sexplib0_Sexp_conv_grammar = global_data.Sexplib0__Sexp_conv_grammar, + _aF_ = [0, 0], + _aG_ = [0, 1], + _aB_ = [0, "Sexplib.Conv.Of_sexp_error"], + _aC_ = [0, cst_src_sexp_conv_ml, 410, 15], + _ay_ = [0, 0], + _az_ = [0, 0], + cst_Assert_failure = cst_Assert_failure$0, + _av_ = [0, cst_src_sexp_conv_ml, 334, 15], + _ar_ = [0, "Exit"], + _as_ = [0, cst_src_sexp_conv_ml, 338, 15], + _an_ = [0, "End_of_file"], + _ao_ = [0, cst_src_sexp_conv_ml, 342, 15], + _aj_ = [0, "Failure"], + _ak_ = [0, cst_src_sexp_conv_ml, 346, 15], + _af_ = [0, "Not_found"], + _ag_ = [0, cst_src_sexp_conv_ml, 350, 15], + _ab_ = [0, "Invalid_argument"], + _ac_ = [0, cst_src_sexp_conv_ml, 354, 15], + cst_Match_failure = "Match_failure", + ___ = [0, cst_src_sexp_conv_ml, 358, 15], + _W_ = [0, "Not_found_s"], + _X_ = [0, cst_src_sexp_conv_ml, 362, 15], + _S_ = [0, "Sys_error"], + _T_ = [0, cst_src_sexp_conv_ml, 366, 15], + _O_ = [0, "Arg.Help"], + _P_ = [0, cst_src_sexp_conv_ml, 370, 15], + _K_ = [0, "Arg.Bad"], + _L_ = [0, cst_src_sexp_conv_ml, 374, 15], + _G_ = [0, "Lazy.Undefined"], + _H_ = [0, cst_src_sexp_conv_ml, 378, 15], + _C_ = [0, "Parsing.Parse_error"], + _D_ = [0, cst_src_sexp_conv_ml, 382, 15], + _y_ = [0, "Queue.Empty"], + _z_ = [0, cst_src_sexp_conv_ml, 386, 15], + _u_ = [0, "Scanf.Scan_failure"], + _v_ = [0, cst_src_sexp_conv_ml, 390, 15], + _q_ = [0, "Stack.Empty"], + _r_ = [0, cst_src_sexp_conv_ml, 394, 15], + _m_ = [0, "Sys.Break"], + _n_ = [0, cst_src_sexp_conv_ml, 398, 15], + _j_ = + [0, + [2, + 0, + [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, [12, 58, [4, 0, 0, 0, 0]]]]]]], + "%s %s:%d:%d"], + cst_fun_of_sexp_cannot_convert = + "fun_of_sexp: cannot convert function values", + cst_opaque_of_sexp_cannot_conv = + "opaque_of_sexp: cannot convert opaque values", + cst_hashtbl_of_sexp_tuple_list = "hashtbl_of_sexp: tuple list needed", + cst_hashtbl_of_sexp_list_neede = "hashtbl_of_sexp: list needed", + cst_array_of_sexp_list_needed = "array_of_sexp: list needed", + cst_list_of_sexp_list_needed = "list_of_sexp: list needed", + cst_triple_of_sexp_list_needed = "triple_of_sexp: list needed", + cst_triple_of_sexp_list_must_c = + "triple_of_sexp: list must contain exactly three elements only", + cst_pair_of_sexp_list_needed = "pair_of_sexp: list needed", + cst_pair_of_sexp_list_must_con = + "pair_of_sexp: list must contain exactly two elements only", + cst_option_of_sexp_only_none_c = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_r = + "option_of_sexp: list must represent optional value", + cst_option_of_sexp_only_none_c$0 = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_b = "option_of_sexp: list must be (some el)", + cst_nativeint_of_sexp = "nativeint_of_sexp: ", + cst_nativeint_of_sexp_atom_nee = "nativeint_of_sexp: atom needed", + cst_int64_of_sexp = "int64_of_sexp: ", + cst_int64_of_sexp_atom_needed = "int64_of_sexp: atom needed", + cst_int32_of_sexp = "int32_of_sexp: ", + cst_int32_of_sexp_atom_needed = "int32_of_sexp: atom needed", + cst_float_of_sexp = "float_of_sexp: ", + cst_float_of_sexp_atom_needed = "float_of_sexp: atom needed", + cst_int_of_sexp = "int_of_sexp: ", + cst_int_of_sexp_atom_needed = "int_of_sexp: atom needed", + cst_char_of_sexp_atom_string_m = + "char_of_sexp: atom string must contain one character only", + cst_char_of_sexp_atom_needed = "char_of_sexp: atom needed", + cst_bytes_of_sexp_atom_needed = "bytes_of_sexp: atom needed", + cst_string_of_sexp_atom_needed = "string_of_sexp: atom needed", + cst_bool_of_sexp_unknown_strin = "bool_of_sexp: unknown string", + cst_bool_of_sexp_atom_needed = "bool_of_sexp: atom needed", + cst_unit_of_sexp_empty_list_ne = "unit_of_sexp: empty list needed", + _i_ = [0, 2], + _h_ = [0, 2], + _f_ = [0, ""], + _e_ = [0, ""], + _b_ = [0, cst_some], + _c_ = [1, 0], + _d_ = [0, cst_none], + _a_ = [1, 0], + default_string_of_float = + [0, + function(x){ + var y = caml_format_float("%.15G", x); + return caml_float_of_string(y) == x + ? y + : caml_format_float("%.17G", x); + }], + read_old_option_format = [0, 1], + write_old_option_format = [0, 1]; + function list_map(f, l){ + var _bo_ = caml_call2(Stdlib_ListLabels[21], f, l); + return caml_call1(Stdlib_ListLabels[9], _bo_); + } + function sexp_of_unit(param){return _a_;} + function sexp_of_bool(b){return [0, caml_call1(Stdlib[30], b)];} + function sexp_of_string(str){return [0, str];} + function sexp_of_bytes(bytes){ + return [0, caml_call1(Stdlib_BytesLabels[6], bytes)]; + } + function sexp_of_char(c){ + return [0, caml_call2(Stdlib_StringLabels[1], 1, c)]; + } + function sexp_of_int(n){return [0, caml_call1(Stdlib[33], n)];} + function sexp_of_float(n){ + return [0, caml_call1(default_string_of_float[1], n)]; + } + function sexp_of_int32(n){return [0, caml_call1(Stdlib_Int32[14], n)];} + function sexp_of_int64(n){return [0, caml_call1(Stdlib_Int64[14], n)];} + function sexp_of_nativeint(n){ + return [0, caml_call1(Stdlib_Nativeint[15], n)]; + } + function sexp_of_ref(sexp_of_a, rf){return caml_call1(sexp_of_a, rf[1]);} + function sexp_of_lazy_t(sexp_of_a, lv){ + var _bm_ = runtime.caml_obj_tag(lv); + if(250 === _bm_) + var _bn_ = lv[1]; + else{ + var switch$0 = 0; + if(246 !== _bm_ && 244 !== _bm_){var _bn_ = lv; switch$0 = 1;} + if(! switch$0) var _bn_ = caml_call1(CamlinternalLazy[2], lv); + } + return caml_call1(sexp_of_a, _bn_); + } + function sexp_of_option(sexp_of_a, param){ + if(! param) return write_old_option_format[1] ? _c_ : _d_; + var x = param[1]; + return write_old_option_format[1] + ? [1, [0, caml_call1(sexp_of_a, x), 0]] + : [1, [0, _b_, [0, caml_call1(sexp_of_a, x), 0]]]; + } + function sexp_of_pair(sexp_of_a, sexp_of_b, param){ + var b = param[2], a = param[1], _bl_ = [0, caml_call1(sexp_of_b, b), 0]; + return [1, [0, caml_call1(sexp_of_a, a), _bl_]]; + } + function sexp_of_triple(sexp_of_a, sexp_of_b, sexp_of_c, param){ + var + c = param[3], + b = param[2], + a = param[1], + _bj_ = [0, caml_call1(sexp_of_c, c), 0], + _bk_ = [0, caml_call1(sexp_of_b, b), _bj_]; + return [1, [0, caml_call1(sexp_of_a, a), _bk_]]; + } + function sexp_of_list(sexp_of_a, lst){ + var _bi_ = caml_call2(Stdlib_ListLabels[21], sexp_of_a, lst); + return [1, caml_call1(Stdlib_ListLabels[9], _bi_)]; + } + function sexp_of_array(sexp_of_a, ar){ + var lst_ref = [0, 0], _bf_ = ar.length - 1 - 1 | 0; + if(_bf_ >= 0){ + var i = _bf_; + for(;;){ + var _bg_ = lst_ref[1]; + lst_ref[1] = + [0, caml_call1(sexp_of_a, caml_check_bound(ar, i)[1 + i]), _bg_]; + var _bh_ = i - 1 | 0; + if(0 !== i){var i = _bh_; continue;} + break; + } + } + return [1, lst_ref[1]]; + } + function sexp_of_hashtbl(sexp_of_key, sexp_of_val, htbl){ + function coll(k, v, acc){ + var _be_ = [0, caml_call1(sexp_of_val, v), 0]; + return [0, [1, [0, caml_call1(sexp_of_key, k), _be_]], acc]; + } + return [1, caml_call3(Stdlib_MoreLabels[1][14], coll, htbl, 0)]; + } + function sexp_of_opaque(param){return _e_;} + function sexp_of_fun(param){return _f_;} + function equal(_bd_, _bc_){return _bd_ === _bc_ ? 1 : 0;} + var + hash = Stdlib_Obj[23][3], + Exn_table = caml_call1(Stdlib_Ephemeron[1][3], [0, equal, hash]), + the_exn_table = caml_call1(Exn_table[1], 17); + function add(opt, param, extension_constructor, sexp_of_exn){ + if(opt) var sth = opt[1], printexc = sth; else var printexc = 1; + return caml_call3 + (Exn_table[5], + the_exn_table, + extension_constructor, + [0, sexp_of_exn, printexc]); + } + function find_auto(for_printexc, exn){ + var + extension_constructor = caml_call1(Stdlib_Obj[23][1], exn), + match = caml_call2(Exn_table[8], the_exn_table, extension_constructor); + if(! match) return 0; + var match$0 = match[1], printexc = match$0[2], sexp_of_exn = match$0[1]; + if(for_printexc && ! printexc) return 0; + return [0, caml_call1(sexp_of_exn, exn)]; + } + function size(param){return caml_call1(Exn_table[18], the_exn_table)[1];} + var For_unit_tests_only = [0, size]; + function sexp_of_exn_opt(exn){return find_auto(0, exn);} + function sexp_of_exn(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return [1, [0, [0, caml_call1(Stdlib_Printexc[1], exn)], 0]]; + var sexp = match[1]; + return sexp; + } + function exn_to_string(e){ + var _bb_ = sexp_of_exn(e); + return caml_call2(Sexplib0_Sexp[13], 0, _bb_); + } + function _g_(exn){ + var match = find_auto(1, exn); + if(! match) return 0; + var sexp = match[1]; + return [0, caml_call2(Sexplib0_Sexp[13], _h_, sexp)]; + } + caml_call1(Stdlib_Printexc[9], _g_); + function printexc_prefer_sexp(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return caml_call1(Stdlib_Printexc[1], exn); + var sexp = match[1]; + return caml_call2(Sexplib0_Sexp[13], _i_, sexp); + } + var Of_sexp_error = Sexplib0_Sexp[6], record_check_extra_fields = [0, 1]; + function of_sexp_error_exn(exc, sexp){ + throw caml_maybe_attach_backtrace([0, Of_sexp_error, exc, sexp], 1); + } + function of_sexp_error(what, sexp){ + throw caml_maybe_attach_backtrace + ([0, Of_sexp_error, [0, Stdlib[7], what], sexp], 1); + } + function unit_of_sexp(sexp){ + if(1 === sexp[0] && ! sexp[1]) return 0; + return of_sexp_error(cst_unit_of_sexp_empty_list_ne, sexp); + } + function bool_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bool_of_sexp_atom_needed, sexp); + var _ba_ = sexp[1]; + if(caml_string_notequal(_ba_, "False")){ + var switch$0 = 0; + if(caml_string_notequal(_ba_, "True")) + if(caml_string_notequal(_ba_, "false")){ + if(caml_string_notequal(_ba_, "true")) + return of_sexp_error(cst_bool_of_sexp_unknown_strin, sexp); + } + else + switch$0 = 1; + if(! switch$0) return 1; + } + return 0; + } + function string_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_string_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return str; + } + function bytes_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bytes_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return caml_call1(Stdlib_BytesLabels[5], str); + } + function char_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_char_of_sexp_atom_needed, sexp); + var str = sexp[1]; + if(1 !== runtime.caml_ml_string_length(str)) + of_sexp_error(cst_char_of_sexp_atom_string_m, sexp); + return runtime.caml_string_get(str, 0); + } + function int_of_sexp(sexp){ + if(0 !== sexp[0]) return of_sexp_error(cst_int_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a$_ = caml_int_of_string(str); return _a$_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a__ = exn_to_string(exc); + return of_sexp_error(caml_call2(Stdlib[28], cst_int_of_sexp, _a__), sexp); + } + } + function float_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_float_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a9_ = caml_float_of_string(str); return _a9_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a8_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_float_of_sexp, _a8_), sexp); + } + } + function int32_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int32_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a7_ = caml_int_of_string(str); return _a7_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a6_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int32_of_sexp, _a6_), sexp); + } + } + function int64_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int64_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a5_ = runtime.caml_int64_of_string(str); return _a5_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a4_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int64_of_sexp, _a4_), sexp); + } + } + function nativeint_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_nativeint_of_sexp_atom_nee, sexp); + var str = sexp[1]; + try{var _a3_ = caml_int_of_string(str); return _a3_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a2_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_nativeint_of_sexp, _a2_), sexp); + } + } + function ref_of_sexp(a_of_sexp, sexp){ + return [0, caml_call1(a_of_sexp, sexp)]; + } + function lazy_t_of_sexp(a_of_sexp, sexp){ + var _a1_ = caml_call1(a_of_sexp, sexp); + return caml_call1(Stdlib_Lazy[4], _a1_); + } + function option_of_sexp(a_of_sexp, sexp){ + if(! read_old_option_format[1]){ + if(0 === sexp[0]){ + var _aW_ = sexp[1]; + if + (caml_string_notequal(_aW_, cst_None) + && caml_string_notequal(_aW_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c$0, sexp); + return 0; + } + var _aX_ = sexp[1]; + if(_aX_){ + var _aY_ = _aX_[1]; + if(0 === _aY_[0]){ + var _aZ_ = _aY_[1], switch$2 = 0; + if + (! + caml_string_notequal(_aZ_, cst_Some) + || ! caml_string_notequal(_aZ_, cst_some)) + switch$2 = 1; + if(switch$2){ + var _a0_ = _aX_[2]; + if(_a0_ && ! _a0_[2]){ + var el$0 = _a0_[1]; + return [0, caml_call1(a_of_sexp, el$0)]; + } + } + } + } + return of_sexp_error(cst_option_of_sexp_list_must_b, sexp); + } + if(0 === sexp[0]){ + var _aR_ = sexp[1]; + if + (caml_string_notequal(_aR_, cst_None) + && caml_string_notequal(_aR_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c, sexp); + } + else{ + var _aS_ = sexp[1]; + if(_aS_){ + var _aT_ = _aS_[1]; + if(_aS_[2]){ + var switch$0 = 0; + if(0 === _aT_[0]){ + var _aU_ = _aT_[1], switch$1 = 0; + if + (! + caml_string_notequal(_aU_, cst_Some) + || ! caml_string_notequal(_aU_, cst_some)) + switch$1 = 1; + if(switch$1){ + var _aV_ = _aS_[2]; + if(! _aV_[2]){var el = _aV_[1]; switch$0 = 1;} + } + } + if(! switch$0) + return of_sexp_error(cst_option_of_sexp_list_must_r, sexp); + } + else + var el = _aT_; + return [0, caml_call1(a_of_sexp, el)]; + } + } + return 0; + } + function pair_of_sexp(a_of_sexp, b_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_pair_of_sexp_list_needed, sexp); + var _aP_ = sexp[1]; + if(_aP_){ + var _aQ_ = _aP_[2]; + if(_aQ_ && ! _aQ_[2]){ + var + b_sexp = _aQ_[1], + a_sexp = _aP_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp); + return [0, a, b]; + } + } + return of_sexp_error(cst_pair_of_sexp_list_must_con, sexp); + } + function triple_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_triple_of_sexp_list_needed, sexp); + var _aM_ = sexp[1]; + if(_aM_){ + var _aN_ = _aM_[2]; + if(_aN_){ + var _aO_ = _aN_[2]; + if(_aO_ && ! _aO_[2]){ + var + c_sexp = _aO_[1], + b_sexp = _aN_[1], + a_sexp = _aM_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp), + c = caml_call1(c_of_sexp, c_sexp); + return [0, a, b, c]; + } + } + } + return of_sexp_error(cst_triple_of_sexp_list_must_c, sexp); + } + function list_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_list_of_sexp_list_needed, sexp); + var + lst = sexp[1], + rev_lst = caml_call2(Stdlib_ListLabels[21], a_of_sexp, lst); + return caml_call1(Stdlib_ListLabels[9], rev_lst); + } + function array_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_array_of_sexp_list_needed, sexp); + var match = sexp[1]; + if(! match) return [0]; + var + t = match[2], + h = match[1], + len = caml_call1(Stdlib_ListLabels[1], t) + 1 | 0, + res = runtime.caml_make_vect(len, caml_call1(a_of_sexp, h)), + i = 1, + param = t; + for(;;){ + if(! param) return res; + var t$0 = param[2], h$0 = param[1], _aL_ = caml_call1(a_of_sexp, h$0); + caml_check_bound(res, i)[1 + i] = _aL_; + var i$0 = i + 1 | 0, i = i$0, param = t$0; + } + } + function hashtbl_of_sexp(key_of_sexp, val_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_hashtbl_of_sexp_list_neede, sexp); + var lst = sexp[1], htbl = caml_call2(Stdlib_MoreLabels[1][1], 0, 0); + function act(param){ + if(1 === param[0]){ + var _aH_ = param[1]; + if(_aH_){ + var _aI_ = _aH_[2]; + if(_aI_ && ! _aI_[2]){ + var + v_sexp = _aI_[1], + k_sexp = _aH_[1], + _aJ_ = caml_call1(val_of_sexp, v_sexp), + _aK_ = caml_call1(key_of_sexp, k_sexp); + return caml_call3(Stdlib_MoreLabels[1][5], htbl, _aK_, _aJ_); + } + } + } + return of_sexp_error(cst_hashtbl_of_sexp_tuple_list, sexp); + } + caml_call2(Stdlib_ListLabels[17], act, lst); + return htbl; + } + function opaque_of_sexp(sexp){ + return of_sexp_error(cst_opaque_of_sexp_cannot_conv, sexp); + } + function fun_of_sexp(sexp){ + return of_sexp_error(cst_fun_of_sexp_cannot_convert, sexp); + } + var + unit_sexp_grammar = Sexplib0_Sexp_conv_grammar[1], + bool_sexp_grammar = Sexplib0_Sexp_conv_grammar[2], + string_sexp_grammar = Sexplib0_Sexp_conv_grammar[3], + bytes_sexp_grammar = Sexplib0_Sexp_conv_grammar[4], + char_sexp_grammar = Sexplib0_Sexp_conv_grammar[5], + int_sexp_grammar = Sexplib0_Sexp_conv_grammar[6], + float_sexp_grammar = Sexplib0_Sexp_conv_grammar[7], + int32_sexp_grammar = Sexplib0_Sexp_conv_grammar[8], + int64_sexp_grammar = Sexplib0_Sexp_conv_grammar[9], + nativeint_sexp_grammar = Sexplib0_Sexp_conv_grammar[10], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[11], + ref_sexp_grammar = Sexplib0_Sexp_conv_grammar[12], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[13], + option_sexp_grammar = Sexplib0_Sexp_conv_grammar[14], + list_sexp_grammar = Sexplib0_Sexp_conv_grammar[15], + array_sexp_grammar = Sexplib0_Sexp_conv_grammar[16], + opaque_sexp_grammar = Sexplib0_Sexp_conv_grammar[17], + fun_sexp_grammar = Sexplib0_Sexp_conv_grammar[18]; + function get_flc_error(name, param){ + var chr = param[3], line = param[2], file = param[1]; + return [0, caml_call5(Stdlib_Printf[4], _j_, name, file, line, chr)]; + } + var _k_ = 0; + function _l_(param){ + if(param === Stdlib_Sys[44]) return _m_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + var _o_ = [0, [0, Stdlib_Sys[44], _l_], _k_]; + function _p_(param){ + if(param === Stdlib_Stack[1]) return _q_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var _s_ = [0, [0, Stdlib_Stack[1], _p_], _o_]; + function _t_(param){ + if(param[1] !== Stdlib_Scanf[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var arg = param[2]; + return [1, [0, _u_, [0, [0, arg], 0]]]; + } + var _w_ = [0, [0, Stdlib_Scanf[2], _t_], _s_]; + function _x_(param){ + if(param === Stdlib_Queue[1]) return _y_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + var _A_ = [0, [0, Stdlib_Queue[1], _x_], _w_]; + function _B_(param){ + if(param === Stdlib_Parsing[10]) return _C_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + } + var _E_ = [0, [0, Stdlib_Parsing[10], _B_], _A_]; + function _F_(param){ + if(param === Stdlib_Lazy[1]) return _G_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + } + var _I_ = [0, [0, Stdlib_Lazy[1], _F_], _E_]; + function _J_(param){ + if(param[1] !== Stdlib_Arg[8]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + var arg = param[2]; + return [1, [0, _K_, [0, [0, arg], 0]]]; + } + var _M_ = [0, [0, Stdlib_Arg[8], _J_], _I_]; + function _N_(param){ + if(param[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _P_], 1); + var arg = param[2]; + return [1, [0, _O_, [0, [0, arg], 0]]]; + } + var _Q_ = [0, [0, Stdlib_Arg[7], _N_], _M_]; + function _R_(param){ + if(param[1] !== Stdlib[11]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + var arg = param[2]; + return [1, [0, _S_, [0, [0, arg], 0]]]; + } + var _U_ = [0, [0, Stdlib[11], _R_], _Q_]; + function _V_(param){ + if(param[1] !== Sexplib0_Sexp[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + var arg = param[2]; + return [1, [0, _W_, [0, arg, 0]]]; + } + var _Y_ = [0, [0, Sexplib0_Sexp[5], _V_], _U_]; + function _Z_(param){ + if(param[1] !== Stdlib[4]) + throw caml_maybe_attach_backtrace([0, Assert_failure, ___], 1); + var arg = param[2]; + return get_flc_error(cst_Match_failure, arg); + } + var _$_ = [0, [0, Stdlib[4], _Z_], _Y_]; + function _aa_(param){ + if(param[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ac_], 1); + var arg = param[2]; + return [1, [0, _ab_, [0, [0, arg], 0]]]; + } + var _ad_ = [0, [0, Stdlib[6], _aa_], _$_]; + function _ae_(param){ + if(param === Stdlib[8]) return _af_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ag_], 1); + } + var _ah_ = [0, [0, Stdlib[8], _ae_], _ad_]; + function _ai_(param){ + if(param[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ak_], 1); + var arg = param[2]; + return [1, [0, _aj_, [0, [0, arg], 0]]]; + } + var _al_ = [0, [0, Stdlib[7], _ai_], _ah_]; + function _am_(param){ + if(param === Stdlib[12]) return _an_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ao_], 1); + } + var _ap_ = [0, [0, Stdlib[12], _am_], _al_]; + function _aq_(param){ + if(param === Stdlib[3]) return _ar_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _as_], 1); + } + var _at_ = [0, [0, Stdlib[3], _aq_], _ap_]; + function _au_(param){ + if(param[1] !== Stdlib[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _av_], 1); + var arg = param[2]; + return get_flc_error(cst_Assert_failure, arg); + } + var _aw_ = [0, [0, Stdlib[5], _au_], _at_]; + function _ax_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_az_, _ay_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _ax_, _aw_); + var + _aA_ = 0, + _aD_ = + [0, + [0, + Of_sexp_error, + function(param){ + if(param[1] !== Of_sexp_error) + throw caml_maybe_attach_backtrace([0, Assert_failure, _aC_], 1); + var sexp = param[3], exc = param[2]; + return [1, [0, _aB_, [0, sexp_of_exn(exc), [0, sexp, 0]]]]; + }], + _aA_]; + function _aE_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_aG_, _aF_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _aE_, _aD_); + var + Sexplib0_Sexp_conv = + [0, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + [0, add, For_unit_tests_only]]; + runtime.caml_register_global + (117, Sexplib0_Sexp_conv, "Sexplib0__Sexp_conv"); + return; + } + (globalThis)); + +//# 1429 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = " ", + cst_has_incorrect_number_of_ar = " has incorrect number of arguments", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_Printf = global_data.Stdlib__Printf, + Of_sexp_error = Sexplib0_Sexp_conv[25], + cst_of_sexp_trying_to_convert_ = + "_of_sexp: trying to convert an empty type", + cst_of_sexp_the_empty_list_is_ = + "_of_sexp: the empty list is an invalid polymorphic variant", + cst_of_sexp_a_nested_list_is_a = + "_of_sexp: a nested list is an invalid polymorphic variant", + cst_of_sexp_polymorphic_varian$0 = + "_of_sexp: polymorphic variant tag takes an argument", + _e_ = + [0, + [2, + 0, + [11, + "_of_sexp: polymorphic variant tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: polymorphic variant tag %S has incorrect number of arguments"], + cst_of_sexp_polymorphic_varian = + "_of_sexp: polymorphic variant does not take arguments", + cst_of_sexp_no_matching_varian = "_of_sexp: no matching variant found", + cst_of_sexp_cannot_convert_val = + "_of_sexp: cannot convert values of types resulting from polymorphic record fields", + cst_of_sexp_list_instead_of_at = + "_of_sexp: list instead of atom for record expected", + _d_ = + [0, + [2, + 0, + [11, + "_of_sexp: the following record elements were undefined: ", + [2, 0, 0]]], + "%s_of_sexp: the following record elements were undefined: %s"], + cst_extra_fields = "extra fields", + cst_duplicate_fields = "duplicate fields", + _c_ = + [0, + [2, 0, [11, "_of_sexp: ", [2, 0, [11, ": ", [2, 0, 0]]]]], + "%s_of_sexp: %s: %s"], + cst_of_sexp_record_conversion_$0 = + "_of_sexp: record conversion: only pairs expected, their first element must be an atom", + cst_of_sexp_record_conversion_ = + "_of_sexp: record conversion: a [sexp.bool] field was given a payload.", + cst_of_sexp_unexpected_variant = + "_of_sexp: unexpected variant constructor", + cst_of_sexp_expected_a_variant$0 = + "_of_sexp: expected a variant type, saw an empty list", + cst_of_sexp_expected_a_variant = + "_of_sexp: expected a variant type, saw a nested list", + cst_of_sexp_this_constructor_r = + "_of_sexp: this constructor requires arguments", + _b_ = + [0, + [2, + 0, + [11, + "_of_sexp: sum tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: sum tag %S has incorrect number of arguments"], + cst_of_sexp_this_constructor_d = + "_of_sexp: this constructor does not take arguments", + _a_ = + [0, + [2, + 0, + [11, "_of_sexp: tuple of size ", [4, 0, 0, 0, [11, " expected", 0]]]], + "%s_of_sexp: tuple of size %d expected"], + cst_Sexplib0_Sexp_conv_error_N = + "Sexplib0__Sexp_conv_error.No_variant_match"; + function tuple_of_size_n_expected(loc, n, sexp){ + var _t_ = caml_call3(Stdlib_Printf[4], _a_, loc, n); + return caml_call2(Sexplib0_Sexp_conv[27], _t_, sexp); + } + function stag_no_args(loc, sexp){ + var _s_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_d); + return caml_call2(Sexplib0_Sexp_conv[27], _s_, sexp); + } + function stag_incorrect_n_args(loc, tag, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _b_, loc, tag); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function stag_takes_args(loc, sexp){ + var _r_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_r); + return caml_call2(Sexplib0_Sexp_conv[27], _r_, sexp); + } + function nested_list_invalid_sum(loc, sexp){ + var _q_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _q_, sexp); + } + function empty_list_invalid_sum(loc, sexp){ + var _p_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant$0); + return caml_call2(Sexplib0_Sexp_conv[27], _p_, sexp); + } + function unexpected_stag(loc, sexp){ + var _o_ = caml_call2(Stdlib[28], loc, cst_of_sexp_unexpected_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _o_, sexp); + } + function record_sexp_bool_with_payload(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_only_pairs_expected(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_superfluous_fields(what, loc, rev_fld_names, sexp){ + var + _n_ = caml_call1(Stdlib_ListLabels[9], rev_fld_names), + fld_names_str = caml_call2(Stdlib_StringLabels[6], cst, _n_), + msg = caml_call4(Stdlib_Printf[4], _c_, loc, what, fld_names_str); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_duplicate_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_duplicate_fields, loc, rev_fld_names, sexp); + } + function record_extra_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_extra_fields, loc, rev_fld_names, sexp); + } + function record_get_undefined_loop(fields, param){ + var fields$0 = fields, param$0 = param; + for(;;){ + if(! param$0){ + var _m_ = caml_call1(Stdlib_ListLabels[9], fields$0); + return caml_call2(Stdlib_StringLabels[6], cst$0, _m_); + } + var _l_ = param$0[1]; + if(_l_[1]){ + var + rest = param$0[2], + field = _l_[2], + fields$1 = [0, field, fields$0], + fields$0 = fields$1, + param$0 = rest; + continue; + } + var rest$0 = param$0[2], param$0 = rest$0; + } + } + function record_undefined_elements(loc, sexp, lst){ + var + undefined$0 = record_get_undefined_loop(0, lst), + msg = caml_call3(Stdlib_Printf[4], _d_, loc, undefined$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_list_instead_atom(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_list_instead_of_at); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_poly_field_value(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_cannot_convert_val); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + var + No_variant_match = + [248, cst_Sexplib0_Sexp_conv_error_N, runtime.caml_fresh_oo_id(0)]; + function no_variant_match(param){ + throw caml_maybe_attach_backtrace(No_variant_match, 1); + } + function no_matching_variant_found(loc, sexp){ + var _k_ = caml_call2(Stdlib[28], loc, cst_of_sexp_no_matching_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _k_, sexp); + } + function ptag_no_args(loc, sexp){ + var _j_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _j_, sexp); + } + function ptag_incorrect_n_args(loc, cnstr, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _e_, loc, cnstr); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function ptag_takes_args(loc, sexp){ + var _i_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian$0); + return caml_call2(Sexplib0_Sexp_conv[27], _i_, sexp); + } + function nested_list_invalid_poly_var(loc, sexp){ + var _h_ = caml_call2(Stdlib[28], loc, cst_of_sexp_a_nested_list_is_a); + return caml_call2(Sexplib0_Sexp_conv[27], _h_, sexp); + } + function empty_list_invalid_poly_var(loc, sexp){ + var _g_ = caml_call2(Stdlib[28], loc, cst_of_sexp_the_empty_list_is_); + return caml_call2(Sexplib0_Sexp_conv[27], _g_, sexp); + } + function empty_type(loc, sexp){ + var _f_ = caml_call2(Stdlib[28], loc, cst_of_sexp_trying_to_convert_); + return caml_call2(Sexplib0_Sexp_conv[27], _f_, sexp); + } + var + Sexplib0_Sexp_conv_error = + [0, + Of_sexp_error, + tuple_of_size_n_expected, + stag_no_args, + stag_incorrect_n_args, + stag_takes_args, + nested_list_invalid_sum, + empty_list_invalid_sum, + unexpected_stag, + record_sexp_bool_with_payload, + record_only_pairs_expected, + record_superfluous_fields, + record_duplicate_fields, + record_extra_fields, + record_get_undefined_loop, + record_undefined_elements, + record_list_instead_atom, + record_poly_field_value, + No_variant_match, + no_variant_match, + no_matching_variant_found, + ptag_no_args, + ptag_incorrect_n_args, + ptag_takes_args, + nested_list_invalid_poly_var, + empty_list_invalid_poly_var, + empty_type]; + runtime.caml_register_global + (30, Sexplib0_Sexp_conv_error, "Sexplib0__Sexp_conv_error"); + return; + } + (globalThis)); + +//# 1689 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Sexplib0_Sexpable = [0]; + runtime.caml_register_global(0, Sexplib0_Sexpable, "Sexplib0__Sexpable"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + invalid_arg = Caml[1], + failwith = Caml[2], + Exit = Caml[3], + Not_found = Caml[8], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int = Caml[19], + min_int = Caml[20], + lnot = Caml[21], + infinity = Caml[22], + neg_infinity = Caml[23], + nan = Caml[24], + max_float = Caml[25], + min_float = Caml[26], + epsilon_float = Caml[27], + symbol = Caml[28], + char_of_int = Caml[29], + string_of_bool = Caml[30], + bool_of_string_opt = Caml[31], + bool_of_string = Caml[32], + string_of_int = Caml[33], + int_of_string_opt = Caml[34], + string_of_float = Caml[35], + float_of_string_opt = Caml[36], + symbol$0 = Caml[37], + stdin = Caml[38], + stdout = Caml[39], + stderr = Caml[40], + print_char = Caml[41], + print_string = Caml[42], + print_bytes = Caml[43], + print_int = Caml[44], + print_float = Caml[45], + print_endline = Caml[46], + print_newline = Caml[47], + prerr_char = Caml[48], + prerr_string = Caml[49], + prerr_bytes = Caml[50], + prerr_int = Caml[51], + prerr_float = Caml[52], + prerr_endline = Caml[53], + prerr_newline = Caml[54], + read_line = Caml[55], + read_int_opt = Caml[56], + read_int = Caml[57], + read_float_opt = Caml[58], + read_float = Caml[59], + open_out = Caml[60], + open_out_bin = Caml[61], + open_out_gen = Caml[62], + flush = Caml[63], + flush_all = Caml[64], + output_char = Caml[65], + output_string = Caml[66], + output_bytes = Caml[67], + output = Caml[68], + output_substring = Caml[69], + output_byte = Caml[70], + output_binary_int = Caml[71], + output_value = Caml[72], + seek_out = Caml[73], + pos_out = Caml[74], + out_channel_length = Caml[75], + close_out = Caml[76], + close_out_noerr = Caml[77], + set_binary_mode_out = Caml[78], + open_in = Caml[79], + open_in_bin = Caml[80], + open_in_gen = Caml[81], + input_char = Caml[82], + input_line = Caml[83], + input = Caml[84], + really_input = Caml[85], + really_input_string = Caml[86], + input_byte = Caml[87], + input_binary_int = Caml[88], + input_value = Caml[89], + seek_in = Caml[90], + pos_in = Caml[91], + in_channel_length = Caml[92], + close_in = Caml[93], + close_in_noerr = Caml[94], + set_binary_mode_in = Caml[95], + string_of_format = Caml[97], + symbol$1 = Caml[98], + exit = Caml[99], + at_exit = Caml[100], + valid_float_lexem = Caml[101], + unsafe_really_input = Caml[102], + do_at_exit = Caml[103], + do_domain_local_at_exit = Caml[104], + Shadow_stdlib = + [0, + invalid_arg, + failwith, + Exit, + Not_found, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Shadow_stdlib, "Shadow_stdlib"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base/base.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_compare = runtime.caml_compare, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml; + function descending(x, y){return caml_compare(y, x);} + var + max = Caml[17], + min = Caml[16], + Base_Poly0 = [0, caml_compare, descending, min, max]; + runtime.caml_register_global(1, Base_Poly0, "Base__Poly0"); + return; + } + (globalThis)); + +//# 36 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_equal = runtime.caml_bytes_equal, + caml_bytes_greaterequal = runtime.caml_bytes_greaterequal, + caml_bytes_lessequal = runtime.caml_bytes_lessequal, + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int_compare = runtime.caml_int_compare, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_notequal = runtime.caml_notequal, + caml_string_equal = runtime.caml_string_equal, + caml_string_greaterequal = runtime.caml_string_greaterequal, + caml_string_lessequal = runtime.caml_string_lessequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Poly0 = global_data.Base__Poly0, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Shadow_stdlib = global_data.Shadow_stdlib, + Caml = global_data.Caml, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + invalid_arg = Caml[1], + failwith = Caml[2], + Exit$0 = Caml[3], + Match_failure = Caml[4], + Assert_failure = Caml[5], + Invalid_argument = Caml[6], + Failure = Caml[7], + Out_of_memory = Caml[9], + Stack_overflow = Caml[10], + Sys_error = Caml[11], + End_of_file = Caml[12], + Division_by_zero = Caml[13], + Sys_blocked_io = Caml[14], + Undefined_recursive_module = Caml[15], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int$0 = Caml[19], + min_int$0 = Caml[20], + lnot = Caml[21], + infinity$0 = Caml[22], + neg_infinity$0 = Caml[23], + nan$0 = Caml[24], + max_float$0 = Caml[25], + min_float$0 = Caml[26], + epsilon_float$0 = Caml[27], + symbol$0 = Caml[28], + char_of_int$0 = Caml[29], + string_of_bool$0 = Caml[30], + bool_of_string_opt$0 = Caml[31], + bool_of_string$0 = Caml[32], + string_of_int$0 = Caml[33], + int_of_string_opt$0 = Caml[34], + string_of_float$0 = Caml[35], + float_of_string_opt$0 = Caml[36], + symbol$1 = Caml[37], + stdin$0 = Caml[38], + stdout$0 = Caml[39], + stderr$0 = Caml[40], + print_char$0 = Caml[41], + print_string$0 = Caml[42], + print_bytes$0 = Caml[43], + print_int$0 = Caml[44], + print_float$0 = Caml[45], + print_endline$0 = Caml[46], + print_newline$0 = Caml[47], + prerr_char$0 = Caml[48], + prerr_string$0 = Caml[49], + prerr_bytes$0 = Caml[50], + prerr_int$0 = Caml[51], + prerr_float$0 = Caml[52], + prerr_endline$0 = Caml[53], + prerr_newline$0 = Caml[54], + read_line$0 = Caml[55], + read_int_opt$0 = Caml[56], + read_int$0 = Caml[57], + read_float_opt$0 = Caml[58], + read_float$0 = Caml[59], + open_out$0 = Caml[60], + open_out_bin$0 = Caml[61], + open_out_gen$0 = Caml[62], + flush$0 = Caml[63], + flush_all$0 = Caml[64], + output_char$0 = Caml[65], + output_string$0 = Caml[66], + output_bytes$0 = Caml[67], + output$0 = Caml[68], + output_substring$0 = Caml[69], + output_byte$0 = Caml[70], + output_binary_int$0 = Caml[71], + output_value$0 = Caml[72], + seek_out$0 = Caml[73], + pos_out$0 = Caml[74], + out_channel_length$0 = Caml[75], + close_out$0 = Caml[76], + close_out_noerr$0 = Caml[77], + set_binary_mode_out$0 = Caml[78], + open_in$0 = Caml[79], + open_in_bin$0 = Caml[80], + open_in_gen$0 = Caml[81], + input_char$0 = Caml[82], + input_line$0 = Caml[83], + input$0 = Caml[84], + really_input$0 = Caml[85], + really_input_string$0 = Caml[86], + input_byte$0 = Caml[87], + input_binary_int$0 = Caml[88], + input_value$0 = Caml[89], + seek_in$0 = Caml[90], + pos_in$0 = Caml[91], + in_channel_length$0 = Caml[92], + close_in$0 = Caml[93], + close_in_noerr$0 = Caml[94], + set_binary_mode_in$0 = Caml[95], + LargeFile = Caml[96], + string_of_format$0 = Caml[97], + symbol$2 = Caml[98], + exit$0 = Caml[99], + at_exit$0 = Caml[100], + valid_float_lexem$0 = Caml[101], + unsafe_really_input$0 = Caml[102], + do_at_exit$0 = Caml[103], + do_domain_local_at_exit$0 = Caml[104], + Not_found$0 = Caml[8], + Caml$0 = + [0, + invalid_arg, + failwith, + Exit$0, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int$0, + min_int$0, + lnot, + infinity$0, + neg_infinity$0, + nan$0, + max_float$0, + min_float$0, + epsilon_float$0, + symbol$0, + char_of_int$0, + string_of_bool$0, + bool_of_string_opt$0, + bool_of_string$0, + string_of_int$0, + int_of_string_opt$0, + string_of_float$0, + float_of_string_opt$0, + symbol$1, + stdin$0, + stdout$0, + stderr$0, + print_char$0, + print_string$0, + print_bytes$0, + print_int$0, + print_float$0, + print_endline$0, + print_newline$0, + prerr_char$0, + prerr_string$0, + prerr_bytes$0, + prerr_int$0, + prerr_float$0, + prerr_endline$0, + prerr_newline$0, + read_line$0, + read_int_opt$0, + read_int$0, + read_float_opt$0, + read_float$0, + open_out$0, + open_out_bin$0, + open_out_gen$0, + flush$0, + flush_all$0, + output_char$0, + output_string$0, + output_bytes$0, + output$0, + output_substring$0, + output_byte$0, + output_binary_int$0, + output_value$0, + seek_out$0, + pos_out$0, + out_channel_length$0, + close_out$0, + close_out_noerr$0, + set_binary_mode_out$0, + open_in$0, + open_in_bin$0, + open_in_gen$0, + input_char$0, + input_line$0, + input$0, + really_input$0, + really_input_string$0, + input_byte$0, + input_binary_int$0, + input_value$0, + seek_in$0, + pos_in$0, + in_channel_length$0, + close_in$0, + close_in_noerr$0, + set_binary_mode_in$0, + LargeFile, + string_of_format$0, + symbol$2, + exit$0, + at_exit$0, + valid_float_lexem$0, + unsafe_really_input$0, + do_at_exit$0, + do_domain_local_at_exit$0, + Not_found$0]; + function bool_to_int(x){return x;} + function symbol$3(_V_, _U_){return _V_ !== _U_ ? 1 : 0;} + var symbol$4 = runtime.caml_mul; + function symbol$5(_T_, _S_){return Math.pow(_T_, _S_);} + function symbol$6(_R_, _Q_){return _R_ * _Q_;} + function symbol$7(_P_, _O_){return _P_ + _O_ | 0;} + function symbol$8(_N_, _M_){return _N_ + _M_;} + function symbol$9(_L_, _K_){return _L_ - _K_ | 0;} + function symbol$10(_J_, _I_){return _J_ - _I_;} + var symbol$11 = runtime.caml_div; + function symbol$12(_H_, _G_){return _H_ / _G_;} + var ascending = caml_int_compare; + function descending(x, y){return caml_int_compare(y, x);} + function max$0(x, y){return y <= x ? x : y;} + function min$0(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, ascending, descending, max$0, min$0], + ascending$0 = Int_replace_polymorphic_compar[1], + descending$0 = Int_replace_polymorphic_compar[2], + max$1 = Int_replace_polymorphic_compar[3], + min$1 = Int_replace_polymorphic_compar[4], + symbol$13 = caml_lessthan, + symbol$14 = caml_lessequal, + symbol$15 = caml_notequal, + symbol$16 = caml_equal, + symbol$17 = caml_greaterthan, + symbol$18 = caml_greaterequal; + function ascending$1(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$1(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare = caml_int_compare, equal = caml_equal; + function max$2(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$2(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int32_replace_polymorphic_comp = + [0, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + ascending$1, + descending$1, + compare, + equal, + max$2, + min$2]; + function ascending$2(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$2(x, y){return caml_call2(Base_Poly0[2], x, y);} + function max$3(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$3(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int64_replace_polymorphic_comp = + [0, ascending$2, descending$2, max$3, min$3], + symbol$19 = caml_lessthan, + symbol$20 = caml_lessequal, + symbol$21 = caml_notequal, + symbol$22 = caml_equal, + symbol$23 = caml_greaterthan, + symbol$24 = caml_greaterequal; + function ascending$3(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$3(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare, equal$0 = caml_equal; + function max$4(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$4(x, y){return caml_lessequal(x, y) ? x : y;} + var + Nativeint_replace_polymorphic_ = + [0, + symbol$19, + symbol$20, + symbol$21, + symbol$22, + symbol$23, + symbol$24, + ascending$3, + descending$3, + compare$0, + equal$0, + max$4, + min$4]; + function symbol$25(x, y){return x < y ? 1 : 0;} + function symbol$26(x, y){return x <= y ? 1 : 0;} + function symbol$27(x, y){return x !== y ? 1 : 0;} + function symbol$28(x, y){return x === y ? 1 : 0;} + function symbol$29(x, y){return y < x ? 1 : 0;} + function symbol$30(x, y){return y <= x ? 1 : 0;} + function ascending$4(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$4(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$1 = caml_int_compare; + function equal$1(x, y){return x === y ? 1 : 0;} + function max$5(x, y){return y <= x ? x : y;} + function min$5(x, y){return x <= y ? x : y;} + var + Bool_replace_polymorphic_compa = + [0, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + ascending$4, + descending$4, + compare$1, + equal$1, + max$5, + min$5]; + function symbol$31(x, y){return x < y ? 1 : 0;} + function symbol$32(x, y){return x <= y ? 1 : 0;} + function symbol$33(x, y){return x !== y ? 1 : 0;} + function symbol$34(x, y){return x === y ? 1 : 0;} + function symbol$35(x, y){return y < x ? 1 : 0;} + function symbol$36(x, y){return y <= x ? 1 : 0;} + function ascending$5(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$5(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$2 = caml_int_compare; + function equal$2(x, y){return x === y ? 1 : 0;} + function max$6(x, y){return y <= x ? x : y;} + function min$6(x, y){return x <= y ? x : y;} + var + Char_replace_polymorphic_compa = + [0, + symbol$31, + symbol$32, + symbol$33, + symbol$34, + symbol$35, + symbol$36, + ascending$5, + descending$5, + compare$2, + equal$2, + max$6, + min$6]; + function i(x){return caml_call1(Stdlib_Uchar[10], x);} + function symbol$37(x, y){var _F_ = i(y); return i(x) < _F_ ? 1 : 0;} + function symbol$38(x, y){var _E_ = i(y); return i(x) <= _E_ ? 1 : 0;} + function symbol$39(x, y){var _D_ = i(y); return i(x) !== _D_ ? 1 : 0;} + function symbol$40(x, y){var _C_ = i(y); return i(x) === _C_ ? 1 : 0;} + function symbol$41(x, y){var _B_ = i(y); return _B_ < i(x) ? 1 : 0;} + function symbol$42(x, y){var _A_ = i(y); return _A_ <= i(x) ? 1 : 0;} + function ascending$6(x, y){ + var _y_ = i(y), _z_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[1], _z_, _y_); + } + function descending$6(x, y){ + var _w_ = i(y), _x_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[2], _x_, _w_); + } + function compare$3(x, y){ + var _v_ = i(y); + return caml_int_compare(i(x), _v_); + } + function equal$3(x, y){var _u_ = i(y); return i(x) === _u_ ? 1 : 0;} + function max$7(x, y){return symbol$42(x, y) ? x : y;} + function min$7(x, y){return symbol$38(x, y) ? x : y;} + var + Uchar_replace_polymorphic_comp = + [0, + i, + symbol$37, + symbol$38, + symbol$39, + symbol$40, + symbol$41, + symbol$42, + ascending$6, + descending$6, + compare$3, + equal$3, + max$7, + min$7]; + function symbol$43(x, y){return x < y ? 1 : 0;} + function symbol$44(x, y){return x <= y ? 1 : 0;} + function symbol$45(x, y){return x != y ? 1 : 0;} + function symbol$46(x, y){return x == y ? 1 : 0;} + function symbol$47(x, y){return y < x ? 1 : 0;} + function symbol$48(x, y){return y <= x ? 1 : 0;} + function ascending$7(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$7(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$4 = runtime.caml_float_compare; + function equal$4(x, y){return x == y ? 1 : 0;} + function max$8(x, y){return y <= x ? x : y;} + function min$8(x, y){return x <= y ? x : y;} + var + Float_replace_polymorphic_comp = + [0, + symbol$43, + symbol$44, + symbol$45, + symbol$46, + symbol$47, + symbol$48, + ascending$7, + descending$7, + compare$4, + equal$4, + max$8, + min$8], + symbol$49 = runtime.caml_string_lessthan, + symbol$50 = caml_string_lessequal, + symbol$51 = runtime.caml_string_notequal, + symbol$52 = caml_string_equal, + symbol$53 = runtime.caml_string_greaterthan, + symbol$54 = caml_string_greaterequal; + function ascending$8(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$8(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$5 = runtime.caml_string_compare, equal$5 = caml_string_equal; + function max$9(x, y){return caml_string_greaterequal(x, y) ? x : y;} + function min$9(x, y){return caml_string_lessequal(x, y) ? x : y;} + var + String_replace_polymorphic_com = + [0, + symbol$49, + symbol$50, + symbol$51, + symbol$52, + symbol$53, + symbol$54, + ascending$8, + descending$8, + compare$5, + equal$5, + max$9, + min$9], + symbol$55 = runtime.caml_bytes_lessthan, + symbol$56 = caml_bytes_lessequal, + symbol$57 = runtime.caml_bytes_notequal, + symbol$58 = caml_bytes_equal, + symbol$59 = runtime.caml_bytes_greaterthan, + symbol$60 = caml_bytes_greaterequal; + function ascending$9(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$9(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$6 = runtime.caml_bytes_compare, equal$6 = caml_bytes_equal; + function max$10(x, y){return caml_bytes_greaterequal(x, y) ? x : y;} + function min$10(x, y){return caml_bytes_lessequal(x, y) ? x : y;} + var + Bytes_replace_polymorphic_comp = + [0, + symbol$55, + symbol$56, + symbol$57, + symbol$58, + symbol$59, + symbol$60, + ascending$9, + descending$9, + compare$6, + equal$6, + max$10, + min$10], + symbol$61 = Caml$0[36], + symbol$62 = Caml$0[27]; + function symbol$63(_t_){return - _t_ | 0;} + function symbol$64(_s_){return - _s_;} + function asr(_r_, _q_){return _r_ >> _q_;} + function land(_p_, _o_){return _p_ & _o_;} + var lnot$0 = Caml$0[20]; + function lor(_n_, _m_){return _n_ | _m_;} + function lsl(_l_, _k_){return _l_ << _k_;} + function lsr(_j_, _i_){return _j_ >>> _i_ | 0;} + function lxor(_h_, _g_){return _h_ ^ _g_;} + var mod = runtime.caml_mod, abs$0 = Caml$0[17], failwith$0 = Caml$0[2]; + function fst(_f_){return _f_[1];} + var invalid_arg$0 = Caml$0[1]; + function snd(_e_){return _e_[2];} + function phys_equal(_d_, _c_){return _d_ === _c_ ? 1 : 0;} + function decr(_b_){_b_[1] += -1; return 0;} + function incr(_a_){_a_[1]++; return 0;} + var + float_of_string = runtime.caml_float_of_string, + am_testing = runtime.Base_am_testing(0), + Base_Import0 = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml$0, + bool_to_int, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + Int_replace_polymorphic_compar, + ascending$0, + descending$0, + max$1, + min$1, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$61, + symbol$62, + symbol$63, + symbol$64, + asr, + land, + lnot$0, + lor, + lsl, + lsr, + lxor, + mod, + abs$0, + failwith$0, + fst, + invalid_arg$0, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing]; + runtime.caml_register_global(4, Base_Import0, "Base__Import0"); + return; + } + (globalThis)); + +//# 777 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Stdlib_Printf = global_data.Stdlib__Printf, + sprintf = Stdlib_Printf[4], + bprintf = Stdlib_Printf[5], + ifprintf = Stdlib_Printf[6], + ksprintf = Stdlib_Printf[10], + kbprintf = Stdlib_Printf[11]; + function failwithf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[124], s);}, + fmt); + } + function invalid_argf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[126], s);}, + fmt); + } + var + Base_Printf = + [0, + ifprintf, + sprintf, + bprintf, + ksprintf, + kbprintf, + failwithf, + invalid_argf]; + runtime.caml_register_global(2, Base_Printf, "Base__Printf"); + return; + } + (globalThis)); + +//# 829 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + Stdlib_Sys = global_data.Stdlib__Sys, + backend_type = Stdlib_Sys[5], + interactive = Stdlib_Sys[3], + os_type = Stdlib_Sys[4], + unix = Stdlib_Sys[6], + win32 = Stdlib_Sys[7], + cygwin = Stdlib_Sys[8], + word_size_in_bits = Stdlib_Sys[9], + int_size_in_bits = Stdlib_Sys[10], + big_endian = Stdlib_Sys[11], + max_string_length = Stdlib_Sys[12], + max_array_length = Stdlib_Sys[13], + runtime_variant = runtime.caml_runtime_variant, + runtime_parameters = runtime.caml_runtime_parameters, + argv = caml_sys_argv(0), + _a_ = + [0, + [11, + "Sys.getenv_exn: environment variable ", + [2, 0, [11, " is not set", 0]]], + "Sys.getenv_exn: environment variable %s is not set"]; + function get_argv(param){return caml_sys_argv(0);} + var + ocaml_version = Stdlib_Sys[46], + enable_runtime_warnings = Stdlib_Sys[49], + runtime_warnings_enabled = Stdlib_Sys[50]; + function getenv_exn(var$0){ + try{var _e_ = caml_sys_getenv(var$0); return _e_;} + catch(_f_){ + var _d_ = caml_wrap_exception(_f_); + if(_d_ === Base_Import0[85][104]) + return caml_call3(Base_Printf[6], _a_, var$0, 0); + throw caml_maybe_attach_backtrace(_d_, 0); + } + } + function getenv(var$0){ + try{var x = caml_sys_getenv(var$0);} + catch(_c_){ + var _b_ = caml_wrap_exception(_c_); + if(_b_ === Base_Import0[85][104]) return 0; + throw caml_maybe_attach_backtrace(_b_, 0); + } + return [0, x]; + } + var + Break = Stdlib_Sys[44], + Base_Sys0 = + [0, + backend_type, + interactive, + os_type, + unix, + win32, + cygwin, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + argv, + get_argv, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv_exn, + getenv, + Break]; + runtime.caml_register_global(4, Base_Sys0, "Base__Sys0"); + return; + } + (globalThis)); + +//# 923 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ArrayLabels = global_data.Stdlib__ArrayLabels; + global_data.Stdlib; + var + Base_Printf = global_data.Base__Printf, + Base_Sys0 = global_data.Base__Sys0, + invalid_argf = Base_Printf[7], + Array = [0], + max_length = Base_Sys0[11]; + function create(len, x){return runtime.caml_make_vect(len, x);} + function create_float_uninitialized(len){ + return runtime.caml_make_float_vect(len); + } + var + append = Stdlib_ArrayLabels[3], + blit = Stdlib_ArrayLabels[8], + concat = Stdlib_ArrayLabels[4], + copy = Stdlib_ArrayLabels[6], + fill = Stdlib_ArrayLabels[7], + init = Stdlib_ArrayLabels[1], + make_matrix = Stdlib_ArrayLabels[2], + of_list = Stdlib_ArrayLabels[10], + sub = Stdlib_ArrayLabels[5], + to_list = Stdlib_ArrayLabels[9]; + function fold(t, init, f){ + return caml_call3(Stdlib_ArrayLabels[15], f, init, t); + } + function fold_right(t, f, init){ + return caml_call3(Stdlib_ArrayLabels[17], f, t, init); + } + function iter(t, f){return caml_call2(Stdlib_ArrayLabels[11], f, t);} + function iteri(t, f){return caml_call2(Stdlib_ArrayLabels[12], f, t);} + function map(t, f){return caml_call2(Stdlib_ArrayLabels[13], f, t);} + function mapi(t, f){return caml_call2(Stdlib_ArrayLabels[14], f, t);} + function stable_sort(t, compare){ + return caml_call2(Stdlib_ArrayLabels[31], compare, t); + } + function swap(t, i, j){ + var + elt_i = caml_check_bound(t, i)[1 + i], + elt_j = caml_check_bound(t, j)[1 + j]; + t[1 + i] = elt_j; + t[1 + j] = elt_i; + return 0; + } + var + Base_Array0 = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap]; + runtime.caml_register_global(6, Base_Array0, "Base__Array0"); + return; + } + (globalThis)); + +//# 1018 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Printf = global_data.Base__Printf, + Stdlib_Char = global_data.Stdlib__Char, + failwithf = Base_Printf[6], + escaped = Stdlib_Char[2], + lowercase = Stdlib_Char[3], + _a_ = + [0, + [11, "Char.of_int_exn got integer out of range: ", [4, 0, 0, 0, 0]], + "Char.of_int_exn got integer out of range: %d"]; + function to_int(_e_){return _e_;} + function unsafe_of_int(_d_){return _d_;} + var uppercase = Stdlib_Char[4]; + function int_is_ok(i){ + var _b_ = 0 <= i ? 1 : 0, _c_ = _b_ ? i <= 255 ? 1 : 0 : _b_; + return _c_; + } + var min_value = 0, max_value = 255; + function of_int(i){return int_is_ok(i) ? [0, i] : 0;} + function of_int_exn(i){ + return int_is_ok(i) ? i : caml_call3(failwithf, _a_, i, 0); + } + function equal(t1, t2){return t1 === t2 ? 1 : 0;} + var + Base_Char0 = + [0, + failwithf, + escaped, + lowercase, + to_int, + unsafe_of_int, + uppercase, + int_is_ok, + min_value, + max_value, + of_int, + of_int_exn, + equal]; + runtime.caml_register_global(3, Base_Char0, "Base__Char0"); + return; + } + (globalThis)); + +//# 1072 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Hash_intf = [0]; + runtime.caml_register_global(0, Base_Hash_intf, "Base__Hash_intf"); + return; + } + (globalThis)); + +//# 1082 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + to_string = Caml[33], + of_string = runtime.caml_int_of_string; + function to_float(_c_){return _c_;} + function of_float(_b_){return _b_ | 0;} + var max_value = Caml[19], min_value = Caml[20]; + function succ(_a_){return _a_ + 1 | 0;} + var + Base_Int0 = + [0, + to_string, + of_string, + to_float, + of_float, + max_value, + min_value, + succ]; + runtime.caml_register_global(1, Base_Int0, "Base__Int0"); + return; + } + (globalThis)); + +//# 1112 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + hd_exn = Stdlib_ListLabels[5], + length = Stdlib_ListLabels[1], + rev_append = Stdlib_ListLabels[12], + tl_exn = Stdlib_ListLabels[6], + unzip = Stdlib_ListLabels[54]; + function exists(t, f){return caml_call2(Stdlib_ListLabels[33], f, t);} + function exists2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[35], f, l1, l2); + } + function fold(t, init, f){ + return caml_call3(Stdlib_ListLabels[25], f, init, t); + } + function fold2_ok(l1, l2, init, f){ + return caml_call4(Stdlib_ListLabels[30], f, init, l1, l2); + } + function for_all(t, f){return caml_call2(Stdlib_ListLabels[32], f, t);} + function for_all2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[34], f, l1, l2); + } + function iter(t, f){return caml_call2(Stdlib_ListLabels[17], f, t);} + function iter2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[27], f, l1, l2); + } + function nontail_map(t, f){return caml_call2(Stdlib_ListLabels[19], f, t);} + function nontail_mapi(t, f){ + return caml_call2(Stdlib_ListLabels[20], f, t); + } + function partition(t, f){return caml_call2(Stdlib_ListLabels[44], f, t);} + function rev_map(t, f){return caml_call2(Stdlib_ListLabels[21], f, t);} + function rev_map2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[29], f, l1, l2); + } + function sort(l, compare){ + return caml_call2(Stdlib_ListLabels[56], compare, l); + } + function stable_sort(l, compare){ + return caml_call2(Stdlib_ListLabels[57], compare, l); + } + function rev(res){ + if(res){ + var match = res[2]; + if(match){ + var rest = match[2], y = match[1], x = res[1]; + return caml_call2(rev_append, rest, [0, y, [0, x, 0]]); + } + } + return res; + } + function fold_right(l, f, init){ + if(! l) return init; + function _a_(a, b){return caml_call2(f, b, a);} + return fold(rev(l), init, _a_); + } + var + Base_List0 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right]; + runtime.caml_register_global(1, Base_List0, "Base__List0"); + return; + } + (globalThis)); + +//# 1219 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + description = "internalhash", + Base_Import0 = global_data.Base__Import0, + Base_Int0 = global_data.Base__Int0, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_List0 = global_data.Base__List0, + Base_Char0 = global_data.Base__Char0; + function Folding(Hash){ + function hash_fold_unit(s, param){return s;} + var + hash_fold_int = Hash[2], + hash_fold_int64 = Hash[3], + hash_fold_float = Hash[4], + hash_fold_string = Hash[5]; + function as_int(f, s, x){ + return caml_call2(hash_fold_int, s, caml_call1(f, x)); + } + function _Q_(_ar_){return _ar_;} + function hash_fold_int32(_ap_, _aq_){return as_int(_Q_, _ap_, _aq_);} + var _R_ = Base_Char0[4]; + function hash_fold_char(_an_, _ao_){return as_int(_R_, _an_, _ao_);} + function _S_(param){return param ? 1 : 0;} + function hash_fold_bool(_al_, _am_){return as_int(_S_, _al_, _am_);} + function hash_fold_nativeint(s, x){ + return caml_call2(hash_fold_int64, s, runtime.caml_int64_of_int32(x)); + } + function hash_fold_option(hash_fold_elem, s, param){ + if(! param) return caml_call2(hash_fold_int, s, 0); + var x = param[1]; + return caml_call2(hash_fold_elem, caml_call2(hash_fold_int, s, 1), x); + } + function hash_fold_list(hash_fold_elem, s$1, list$1){ + var + s$2 = caml_call2(hash_fold_int, s$1, caml_call1(Base_List0[2], list$1)), + s = s$2, + list = list$1; + for(;;){ + if(! list) return s; + var + list$0 = list[2], + x = list[1], + s$0 = caml_call2(hash_fold_elem, s, x), + s = s$0, + list = list$0; + } + } + function hash_fold_lazy_t(hash_fold_elem, s, x){ + var _aj_ = runtime.caml_obj_tag(x); + if(250 === _aj_) + var _ak_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _aj_ && 244 !== _aj_){var _ak_ = x; switch$0 = 1;} + if(! switch$0) var _ak_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call2(hash_fold_elem, s, _ak_); + } + function hash_fold_ref_frozen(hash_fold_elem, s, x){return caml_call2(hash_fold_elem, s, x[1]); + } + function hash_fold_array_frozen(hash_fold_elem, s$1, array){ + var + s$2 = caml_call2(hash_fold_int, s$1, array.length - 1), + s = s$2, + i = 0; + for(;;){ + if(i === array.length - 1) return s; + var + e = array[1 + i], + i$0 = caml_call2(Base_Import0[91], i, 1), + s$0 = caml_call2(hash_fold_elem, s, e), + s = s$0, + i = i$0; + } + } + function hash_nativeint(x){ + var + _ah_ = caml_call1(Hash[6], 0), + _ai_ = hash_fold_nativeint(caml_call2(Hash[7], 0, _ah_), x); + return caml_call1(Hash[8], _ai_); + } + function hash_int64(x){ + var + _af_ = caml_call1(Hash[6], 0), + _ag_ = caml_call2(hash_fold_int64, caml_call2(Hash[7], 0, _af_), x); + return caml_call1(Hash[8], _ag_); + } + function hash_int32(x){ + var + _ad_ = caml_call1(Hash[6], 0), + _ae_ = hash_fold_int32(caml_call2(Hash[7], 0, _ad_), x); + return caml_call1(Hash[8], _ae_); + } + function hash_char(x){ + var + _ab_ = caml_call1(Hash[6], 0), + _ac_ = hash_fold_char(caml_call2(Hash[7], 0, _ab_), x); + return caml_call1(Hash[8], _ac_); + } + function hash_int(x){ + var + _$_ = caml_call1(Hash[6], 0), + _aa_ = caml_call2(hash_fold_int, caml_call2(Hash[7], 0, _$_), x); + return caml_call1(Hash[8], _aa_); + } + function hash_bool(x){ + var + _Z_ = caml_call1(Hash[6], 0), + ___ = hash_fold_bool(caml_call2(Hash[7], 0, _Z_), x); + return caml_call1(Hash[8], ___); + } + function hash_string(x){ + var + _X_ = caml_call1(Hash[6], 0), + _Y_ = caml_call2(hash_fold_string, caml_call2(Hash[7], 0, _X_), x); + return caml_call1(Hash[8], _Y_); + } + function hash_float(x){ + var + _V_ = caml_call1(Hash[6], 0), + _W_ = caml_call2(hash_fold_float, caml_call2(Hash[7], 0, _V_), x); + return caml_call1(Hash[8], _W_); + } + function hash_unit(x){ + var _T_ = caml_call1(Hash[6], 0), _U_ = caml_call2(Hash[7], 0, _T_); + return caml_call1(Hash[8], _U_); + } + return [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit]; + } + function F(Hash){ + var + description = Hash[1], + fold_int = Hash[2], + fold_int64 = Hash[3], + fold_float = Hash[4], + fold_string = Hash[5], + alloc = Hash[6], + reset = Hash[7], + get_hash_value = Hash[8], + For_tests = Hash[9]; + function create(seed, param){ + return caml_call2(reset, seed, caml_call1(alloc, 0)); + } + function of_fold(hash_fold_t, t){ + return caml_call1 + (get_hash_value, caml_call2(hash_fold_t, create(0, 0), t)); + } + var Builtin = Folding(Hash); + function run(seed, folder, x){ + var + _O_ = caml_call1(Hash[6], 0), + _P_ = caml_call2(folder, caml_call2(Hash[7], seed, _O_), x); + return caml_call1(Hash[8], _P_); + } + return [0, + description, + fold_int, + fold_int64, + fold_float, + fold_string, + alloc, + reset, + get_hash_value, + For_tests, + create, + of_fold, + Builtin, + run]; + } + function alloc(param){return 0;} + function reset(opt, t){ + if(opt) var sth = opt[1], seed = sth; else var seed = 0; + return seed; + } + var compare_state = runtime.caml_int_compare; + function state_to_string(state){return caml_call1(Base_Int0[1], state);} + var For_tests = [0, compare_state, state_to_string]; + function create(seed, param){return reset(seed, 0);} + function run(seed, folder, x){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(folder, reset(seed, 0), x)); + } + function of_fold(hash_fold_t, t){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(hash_fold_t, create(0, 0), t)); + } + function _a_(_N_){return runtime.Base_internalhash_get_hash_value(_N_);} + function _b_(_M_, _L_){ + return runtime.Base_internalhash_fold_string(_M_, _L_); + } + function _c_(_K_, _J_){ + return runtime.Base_internalhash_fold_float(_K_, _J_); + } + function _d_(_I_, _H_){ + return runtime.Base_internalhash_fold_int64(_I_, _H_); + } + var + Folding$0 = + Folding + ([0, + description, + function(_G_, _F_){ + return runtime.Base_internalhash_fold_int(_G_, _F_); + }, + _d_, + _c_, + _b_, + alloc, + reset, + _a_, + For_tests]), + hash_fold_nativeint = Folding$0[1], + hash_fold_int64 = Folding$0[2], + hash_fold_int32 = Folding$0[3], + hash_fold_char = Folding$0[4], + hash_fold_int = Folding$0[5], + hash_fold_bool = Folding$0[6], + hash_fold_string = Folding$0[7], + hash_fold_float = Folding$0[8], + hash_fold_unit = Folding$0[9], + hash_fold_option = Folding$0[10], + hash_fold_list = Folding$0[11], + hash_fold_lazy_t = Folding$0[12], + hash_fold_ref_frozen = Folding$0[13], + hash_fold_array_frozen = Folding$0[14], + hash_nativeint = Folding$0[15], + hash_int64 = Folding$0[16], + hash_int32 = Folding$0[17], + hash_string = Folding$0[21], + hash_char = Base_Char0[4]; + function hash_int(t){ + var + _t_ = caml_call2(Base_Import0[119], t, 21), + _u_ = caml_call1(Base_Import0[117], t), + t$0 = caml_call2(Base_Import0[91], _u_, _t_), + _v_ = caml_call2(Base_Import0[120], t$0, 24), + t$1 = caml_call2(Base_Import0[121], t$0, _v_), + _w_ = caml_call2(Base_Import0[119], t$1, 8), + _x_ = caml_call2(Base_Import0[119], t$1, 3), + _y_ = caml_call2(Base_Import0[91], t$1, _x_), + t$2 = caml_call2(Base_Import0[91], _y_, _w_), + _z_ = caml_call2(Base_Import0[120], t$2, 14), + t$3 = caml_call2(Base_Import0[121], t$2, _z_), + _A_ = caml_call2(Base_Import0[119], t$3, 4), + _B_ = caml_call2(Base_Import0[119], t$3, 2), + _C_ = caml_call2(Base_Import0[91], t$3, _B_), + t$4 = caml_call2(Base_Import0[91], _C_, _A_), + _D_ = caml_call2(Base_Import0[120], t$4, 28), + t$5 = caml_call2(Base_Import0[121], t$4, _D_), + _E_ = caml_call2(Base_Import0[119], t$5, 31); + return caml_call2(Base_Import0[91], t$5, _E_); + } + function hash_bool(x){return x ? 1 : 0;} + function hash_unit(param){return 0;} + var + _e_ = + [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + function(_s_){return runtime.Base_hash_double(_s_);}, + hash_unit]; + function _f_(_r_){return runtime.Base_internalhash_get_hash_value(_r_);} + function _g_(_q_, _p_){ + return runtime.Base_internalhash_fold_string(_q_, _p_); + } + function _h_(_o_, _n_){ + return runtime.Base_internalhash_fold_float(_o_, _n_); + } + function _i_(_m_, _l_){ + return runtime.Base_internalhash_fold_int64(_m_, _l_); + } + var + Base_Hash = + [0, + F, + description, + function(_k_, _j_){ + return runtime.Base_internalhash_fold_int(_k_, _j_); + }, + _i_, + _h_, + _g_, + alloc, + reset, + _f_, + For_tests, + create, + of_fold, + _e_, + run]; + runtime.caml_register_global(6, Base_Hash, "Base__Hash"); + return; + } + (globalThis)); + +//# 1572 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_which_is_abstract_in_an_im = + ", which is abstract in an implementation.", + caml_equal = runtime.caml_equal, + caml_float_compare = runtime.caml_float_compare, + caml_int_compare = runtime.caml_int_compare; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + phys_equal = Base_Import0[128], + _b_ = + [0, + [11, + "Equal called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Equal called on the type %s, which is abstract in an implementation."], + _a_ = + [0, + [11, + "Compare called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Compare called on the type %s, which is abstract in an implementation."]; + function compare_abstract(type_name, param, _u_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _a_, type_name); + } + function equal_abstract(type_name, param, _t_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _b_, type_name); + } + var + Comparable = [0], + Equal = [0], + compare_bool = caml_int_compare, + compare_char = caml_int_compare, + compare_float = caml_float_compare, + compare_int = caml_int_compare, + compare_int32 = caml_int_compare; + function compare_int64(_s_, _r_){ + return runtime.caml_int64_compare(_s_, _r_); + } + var + compare_nativeint = caml_int_compare, + compare_string = runtime.caml_string_compare, + compare_unit = caml_int_compare; + function compare_array(compare_elt, a, b){ + if(caml_call2(phys_equal, a, b)) return 0; + var + len_a = a.length - 1, + len_b = b.length - 1, + ret = caml_int_compare(len_a, len_b); + if(0 !== ret) return ret; + var i = 0; + for(;;){ + if(i === len_a) return 0; + var l = a[1 + i], r = b[1 + i], res = caml_call2(compare_elt, l, r); + if(0 !== res) return res; + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + } + } + function compare_list(compare_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + res = caml_call2(compare_elt, x, y); + if(0 !== res) return res; + var a$0 = xs, b$0 = ys; + } + } + function compare_option(compare_elt, a, b){ + if(! a) return b ? -1 : 0; + var a$0 = a[1]; + if(! b) return 1; + var b$0 = b[1]; + return caml_call2(compare_elt, a$0, b$0); + } + function compare_ref(compare_elt, a, b){ + return caml_call2(compare_elt, a[1], b[1]); + } + function equal_bool(_q_, _p_){return _q_ === _p_ ? 1 : 0;} + function equal_char(_o_, _n_){return _o_ === _n_ ? 1 : 0;} + function equal_int(_m_, _l_){return _m_ === _l_ ? 1 : 0;} + var + equal_int32 = caml_equal, + equal_int64 = caml_equal, + equal_nativeint = caml_equal, + equal_string = runtime.caml_string_equal; + function equal_unit(_k_, _j_){return _k_ === _j_ ? 1 : 0;} + function equal_float(x, y){return caml_float_compare(x, y) === 0 ? 1 : 0;} + function equal_array(equal_elt, a, b){ + var _d_ = caml_call2(phys_equal, a, b); + if(_d_) + var _e_ = _d_; + else{ + var + len_a = a.length - 1, + len_b = b.length - 1, + _f_ = len_a === len_b ? 1 : 0; + if(_f_){ + var i = 0; + for(;;){ + var _g_ = i === len_a ? 1 : 0; + if(_g_) + var _h_ = _g_; + else{ + var l = a[1 + i], r = b[1 + i], _i_ = caml_call2(equal_elt, l, r); + if(_i_){ + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + continue; + } + var _h_ = _i_; + } + return _h_; + } + } + var _e_ = _f_; + } + return _e_; + } + function equal_list(equal_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(a$0){ + if(b$0){ + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + _c_ = caml_call2(equal_elt, x, y); + if(! _c_) return _c_; + var a$0 = xs, b$0 = ys; + continue; + } + } + else if(! b$0) return 1; + return 0; + } + } + function equal_option(equal_elt, a, b){ + if(a){ + if(b){ + var b$0 = b[1], a$0 = a[1]; + return caml_call2(equal_elt, a$0, b$0); + } + } + else if(! b) return 1; + return 0; + } + function equal_ref(equal_elt, a, b){ + return caml_call2(equal_elt, a[1], b[1]); + } + var + Base_Ppx_compare_lib = + [0, + phys_equal, + compare_abstract, + equal_abstract, + Comparable, + Equal, + [0, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref]]; + runtime.caml_register_global + (4, Base_Ppx_compare_lib, "Base__Ppx_compare_lib"); + return; + } + (globalThis)); + +//# 1799 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_update_dummy = runtime.caml_update_dummy; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + t_of_sexp = Sexplib0_Sexp[1], + sexp_of_t = Sexplib0_Sexp[2], + equal = Sexplib0_Sexp[3], + Not_found_s = Sexplib0_Sexp[5], + Of_sexp_error = Sexplib0_Sexp[6], + message = Sexplib0_Sexp[7], + default_indent = Sexplib0_Sexp[8], + pp_hum = Sexplib0_Sexp[9], + pp_hum_indent = Sexplib0_Sexp[10], + pp_mach = Sexplib0_Sexp[11], + pp = Sexplib0_Sexp[12], + to_string_hum = Sexplib0_Sexp[13], + to_string_mach = Sexplib0_Sexp[14], + to_string = Sexplib0_Sexp[15], + of_float_style = Sexplib0_Sexp[16], + of_int_style = Sexplib0_Sexp[17], + Private = Sexplib0_Sexp[18]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + if(0 === a_001[0]){ + var a_003 = a_001[1]; + if(0 !== b_002[0]) return -1; + var b_004 = b_002[1]; + return caml_call2(Base_Ppx_compare_lib[6][8], a_003, b_004); + } + var a_005 = a_001[1]; + if(0 === b_002[0]) return 1; + var b_006 = b_002[1]; + return caml_call3(Base_Ppx_compare_lib[6][11], compare, a_005, b_006); + } + var + hash_fold_t = function _f_(_d_, _e_){return _f_.fun(_d_, _e_);}, + hash = function _c_(_b_){return _c_.fun(_b_);}; + caml_update_dummy + (hash_fold_t, + function(hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(Base_Hash[13][7], hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call3(Base_Hash[13][11], hash_fold_t, hsv$1, a0$0); + }); + caml_update_dummy + (hash, + function(arg){ + var + hsv = caml_call2(Base_Hash[11], 0, 0), + _a_ = caml_call2(hash_fold_t, hsv, arg); + return caml_call1(Base_Hash[9], _a_); + }); + var t_sexp_grammar = Sexplib0_Sexp_conv[59], of_string = 0; + function invariant(param){return 0;} + var + Base_Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + Private, + t_sexp_grammar, + invariant, + of_string]; + runtime.caml_register_global(4, Base_Sexp, "Base__Sexp"); + return; + } + (globalThis)); + +//# 1912 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Sexp = global_data.Base__Sexp, + Exit = Base_Import0[1], + Not_found = Base_Import0[2], + max_int = Base_Import0[3], + min_int = Base_Import0[4], + infinity = Base_Import0[5], + neg_infinity = Base_Import0[6], + nan = Base_Import0[7], + max_float = Base_Import0[8], + min_float = Base_Import0[9], + epsilon_float = Base_Import0[10], + char_of_int = Base_Import0[11], + string_of_bool = Base_Import0[12], + bool_of_string_opt = Base_Import0[13], + bool_of_string = Base_Import0[14], + string_of_int = Base_Import0[15], + int_of_string_opt = Base_Import0[16], + string_of_float = Base_Import0[17], + float_of_string_opt = Base_Import0[18], + stdin = Base_Import0[19], + stdout = Base_Import0[20], + stderr = Base_Import0[21], + print_char = Base_Import0[22], + print_string = Base_Import0[23], + print_bytes = Base_Import0[24], + print_int = Base_Import0[25], + print_float = Base_Import0[26], + print_endline = Base_Import0[27], + print_newline = Base_Import0[28], + prerr_char = Base_Import0[29], + prerr_string = Base_Import0[30], + prerr_bytes = Base_Import0[31], + prerr_int = Base_Import0[32], + prerr_float = Base_Import0[33], + prerr_endline = Base_Import0[34], + prerr_newline = Base_Import0[35], + read_line = Base_Import0[36], + read_int_opt = Base_Import0[37], + read_int = Base_Import0[38], + read_float_opt = Base_Import0[39], + read_float = Base_Import0[40], + open_out = Base_Import0[41], + open_out_bin = Base_Import0[42], + open_out_gen = Base_Import0[43], + flush = Base_Import0[44], + flush_all = Base_Import0[45], + output_char = Base_Import0[46], + output_string = Base_Import0[47], + output_bytes = Base_Import0[48], + output = Base_Import0[49], + output_substring = Base_Import0[50], + output_byte = Base_Import0[51], + output_binary_int = Base_Import0[52], + output_value = Base_Import0[53], + seek_out = Base_Import0[54], + pos_out = Base_Import0[55], + out_channel_length = Base_Import0[56], + close_out = Base_Import0[57], + close_out_noerr = Base_Import0[58], + set_binary_mode_out = Base_Import0[59], + open_in = Base_Import0[60], + open_in_bin = Base_Import0[61], + open_in_gen = Base_Import0[62], + input_char = Base_Import0[63], + input_line = Base_Import0[64], + input = Base_Import0[65], + really_input = Base_Import0[66], + really_input_string = Base_Import0[67], + input_byte = Base_Import0[68], + input_binary_int = Base_Import0[69], + input_value = Base_Import0[70], + seek_in = Base_Import0[71], + pos_in = Base_Import0[72], + in_channel_length = Base_Import0[73], + close_in = Base_Import0[74], + close_in_noerr = Base_Import0[75], + set_binary_mode_in = Base_Import0[76], + string_of_format = Base_Import0[77], + symbol = Base_Import0[78], + exit = Base_Import0[79], + at_exit = Base_Import0[80], + valid_float_lexem = Base_Import0[81], + unsafe_really_input = Base_Import0[82], + do_at_exit = Base_Import0[83], + do_domain_local_at_exit = Base_Import0[84], + Caml = Base_Import0[85], + bool_to_int = Base_Import0[86], + symbol$0 = Base_Import0[87], + symbol$1 = Base_Import0[88], + symbol$2 = Base_Import0[89], + symbol$3 = Base_Import0[90], + symbol$4 = Base_Import0[91], + symbol$5 = Base_Import0[92], + symbol$6 = Base_Import0[93], + symbol$7 = Base_Import0[94], + symbol$8 = Base_Import0[95], + symbol$9 = Base_Import0[96], + Int_replace_polymorphic_compar = Base_Import0[97], + ascending = Base_Import0[98], + descending = Base_Import0[99], + max = Base_Import0[100], + min = Base_Import0[101], + Int32_replace_polymorphic_comp = Base_Import0[102], + Int64_replace_polymorphic_comp = Base_Import0[103], + Nativeint_replace_polymorphic_ = Base_Import0[104], + Bool_replace_polymorphic_compa = Base_Import0[105], + Char_replace_polymorphic_compa = Base_Import0[106], + Uchar_replace_polymorphic_comp = Base_Import0[107], + Float_replace_polymorphic_comp = Base_Import0[108], + String_replace_polymorphic_com = Base_Import0[109], + Bytes_replace_polymorphic_comp = Base_Import0[110], + symbol$10 = Base_Import0[111], + symbol$11 = Base_Import0[112], + symbol$12 = Base_Import0[113], + symbol$13 = Base_Import0[114], + asr = Base_Import0[115], + land = Base_Import0[116], + lnot = Base_Import0[117], + lor = Base_Import0[118], + lsl = Base_Import0[119], + lsr = Base_Import0[120], + lxor = Base_Import0[121], + mod = Base_Import0[122], + abs = Base_Import0[123], + failwith = Base_Import0[124], + fst = Base_Import0[125], + invalid_arg = Base_Import0[126], + snd = Base_Import0[127], + phys_equal = Base_Import0[128], + decr = Base_Import0[129], + incr = Base_Import0[130], + float_of_string = Base_Import0[131], + am_testing = Base_Import0[132], + default_string_of_float = Sexplib0_Sexp_conv[1], + write_old_option_format = Sexplib0_Sexp_conv[2], + read_old_option_format = Sexplib0_Sexp_conv[3], + list_map = Sexplib0_Sexp_conv[4], + sexp_of_unit = Sexplib0_Sexp_conv[5], + sexp_of_bool = Sexplib0_Sexp_conv[6], + sexp_of_string = Sexplib0_Sexp_conv[7], + sexp_of_bytes = Sexplib0_Sexp_conv[8], + sexp_of_char = Sexplib0_Sexp_conv[9], + sexp_of_int = Sexplib0_Sexp_conv[10], + sexp_of_float = Sexplib0_Sexp_conv[11], + sexp_of_int32 = Sexplib0_Sexp_conv[12], + sexp_of_int64 = Sexplib0_Sexp_conv[13], + sexp_of_nativeint = Sexplib0_Sexp_conv[14], + sexp_of_ref = Sexplib0_Sexp_conv[15], + sexp_of_lazy_t = Sexplib0_Sexp_conv[16], + sexp_of_option = Sexplib0_Sexp_conv[17], + sexp_of_pair = Sexplib0_Sexp_conv[18], + sexp_of_triple = Sexplib0_Sexp_conv[19], + sexp_of_list = Sexplib0_Sexp_conv[20], + sexp_of_array = Sexplib0_Sexp_conv[21], + sexp_of_hashtbl = Sexplib0_Sexp_conv[22], + sexp_of_opaque = Sexplib0_Sexp_conv[23], + sexp_of_fun = Sexplib0_Sexp_conv[24], + Of_sexp_error = Sexplib0_Sexp_conv[25], + record_check_extra_fields = Sexplib0_Sexp_conv[26], + of_sexp_error = Sexplib0_Sexp_conv[27], + of_sexp_error_exn = Sexplib0_Sexp_conv[28], + unit_of_sexp = Sexplib0_Sexp_conv[29], + bool_of_sexp = Sexplib0_Sexp_conv[30], + string_of_sexp = Sexplib0_Sexp_conv[31], + bytes_of_sexp = Sexplib0_Sexp_conv[32], + char_of_sexp = Sexplib0_Sexp_conv[33], + int_of_sexp = Sexplib0_Sexp_conv[34], + float_of_sexp = Sexplib0_Sexp_conv[35], + int32_of_sexp = Sexplib0_Sexp_conv[36], + int64_of_sexp = Sexplib0_Sexp_conv[37], + nativeint_of_sexp = Sexplib0_Sexp_conv[38], + ref_of_sexp = Sexplib0_Sexp_conv[39], + lazy_t_of_sexp = Sexplib0_Sexp_conv[40], + option_of_sexp = Sexplib0_Sexp_conv[41], + pair_of_sexp = Sexplib0_Sexp_conv[42], + triple_of_sexp = Sexplib0_Sexp_conv[43], + list_of_sexp = Sexplib0_Sexp_conv[44], + array_of_sexp = Sexplib0_Sexp_conv[45], + hashtbl_of_sexp = Sexplib0_Sexp_conv[46], + opaque_of_sexp = Sexplib0_Sexp_conv[47], + fun_of_sexp = Sexplib0_Sexp_conv[48], + unit_sexp_grammar = Sexplib0_Sexp_conv[49], + bool_sexp_grammar = Sexplib0_Sexp_conv[50], + string_sexp_grammar = Sexplib0_Sexp_conv[51], + bytes_sexp_grammar = Sexplib0_Sexp_conv[52], + char_sexp_grammar = Sexplib0_Sexp_conv[53], + int_sexp_grammar = Sexplib0_Sexp_conv[54], + float_sexp_grammar = Sexplib0_Sexp_conv[55], + int32_sexp_grammar = Sexplib0_Sexp_conv[56], + int64_sexp_grammar = Sexplib0_Sexp_conv[57], + nativeint_sexp_grammar = Sexplib0_Sexp_conv[58], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv[59], + ref_sexp_grammar = Sexplib0_Sexp_conv[60], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv[61], + option_sexp_grammar = Sexplib0_Sexp_conv[62], + list_sexp_grammar = Sexplib0_Sexp_conv[63], + array_sexp_grammar = Sexplib0_Sexp_conv[64], + opaque_sexp_grammar = Sexplib0_Sexp_conv[65], + fun_sexp_grammar = Sexplib0_Sexp_conv[66], + sexp_of_exn = Sexplib0_Sexp_conv[67], + printexc_prefer_sexp = Sexplib0_Sexp_conv[68], + sexp_of_exn_opt = Sexplib0_Sexp_conv[69], + Exn_converter = Sexplib0_Sexp_conv[70], + _a_ = Base_Hash[13], + hash_fold_nativeint = _a_[1], + hash_fold_int64 = _a_[2], + hash_fold_int32 = _a_[3], + hash_fold_char = _a_[4], + hash_fold_int = _a_[5], + hash_fold_bool = _a_[6], + hash_fold_string = _a_[7], + hash_fold_float = _a_[8], + hash_fold_unit = _a_[9], + hash_fold_option = _a_[10], + hash_fold_list = _a_[11], + hash_fold_lazy_t = _a_[12], + hash_fold_ref_frozen = _a_[13], + hash_fold_array_frozen = _a_[14], + hash_nativeint = _a_[15], + hash_int64 = _a_[16], + hash_int32 = _a_[17], + hash_char = _a_[18], + hash_int = _a_[19], + hash_bool = _a_[20], + hash_string = _a_[21], + hash_float = _a_[22], + hash_unit = _a_[23], + include = Base_Ppx_compare_lib[6], + compare_bool = include[1], + compare_char = include[2], + compare_float = include[3], + compare_int = include[4], + compare_int32 = include[5], + compare_int64 = include[6], + compare_nativeint = include[7], + compare_string = include[8], + compare_unit = include[9], + compare_array = include[10], + compare_list = include[11], + compare_option = include[12], + compare_ref = include[13], + equal_bool = include[14], + equal_char = include[15], + equal_float = include[16], + equal_int = include[17], + equal_int32 = include[18], + equal_int64 = include[19], + equal_nativeint = include[20], + equal_string = include[21], + equal_unit = include[22], + equal_array = include[23], + equal_list = include[24], + equal_option = include[25], + equal_ref = include[26], + Not_found_s = Base_Sexp[7], + Base_Import = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml, + bool_to_int, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + Int_replace_polymorphic_compar, + ascending, + descending, + max, + min, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$10, + symbol$11, + symbol$12, + symbol$13, + asr, + land, + lnot, + lor, + lsl, + lsr, + lxor, + mod, + abs, + failwith, + fst, + invalid_arg, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + Exn_converter, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref, + Not_found_s]; + runtime.caml_register_global(5, Base_Import, "Base__Import"); + return; + } + (globalThis)); + +//# 2438 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + Base_Import = global_data.Base__Import, + _a_ = [0, "W64"], + _b_ = [0, "W32"], + cst_unknown_word_size = "unknown word size"; + function sexp_of_t(param){return param ? _a_ : _b_;} + function num_bits(param){return param ? 64 : 32;} + var + _c_ = Base_Sys0[7], + word_size = + 32 === _c_ + ? 0 + : 64 === _c_ ? 1 : caml_call1(Base_Import[124], cst_unknown_word_size), + Base_Word_size = [0, sexp_of_t, num_bits, word_size]; + runtime.caml_register_global(5, Base_Word_size, "Base__Word_size"); + return; + } + (globalThis)); + +//# 2479 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Format = global_data.Stdlib__Format, + Base_Import = global_data.Base__Import, + r = [0, [0, "Base.Sexp.pp_hum", 0]], + cst_pp = ".pp"; + function all(param){return r[1];} + function register(p){r[1] = [0, p, r[1]]; return 0;} + function Register_pp(M){ + var pp = M[1], module_name = M[2]; + register(caml_call2(Base_Import[112], M[2], cst_pp)); + return [0, pp, module_name]; + } + function _a_(_c_){return [0, Register_pp(_c_)[1]];} + var + Base_Pretty_printer = + [0, + all, + function(M){ + var module_name = M[1]; + function pp(formatter, t){ + var _b_ = caml_call1(M[2], t); + return caml_call2(Stdlib_Format[13], formatter, _b_); + } + return [0, Register_pp([0, pp, module_name])[1]]; + }, + _a_, + register]; + runtime.caml_register_global + (4, Base_Pretty_printer, "Base__Pretty_printer"); + return; + } + (globalThis)); + +//# 2529 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_2 = "<2>", + cst_src_exn_ml = "src/exn.ml", + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Exn", + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Import = global_data.Base__Import, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Sexp = global_data.Base__Sexp, + Base_Printf = global_data.Base__Printf, + Assert_failure = global_data.Assert_failure, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + sexp_of_t = Base_Import[199], + exit = Base_Import[85][98], + Finally = [248, "Base__Exn.Finally", caml_fresh_oo_id(0)], + _k_ = + [0, + [11, "Exn.handle_uncaught could not print; exiting anyway\n", [10, 0]], + "Exn.handle_uncaught could not print; exiting anyway\n%!"], + _j_ = + [0, + [18, + [1, [0, [11, cst_2, 0], cst_2]], + [11, + "Uncaught exception:", + [17, + 3, + [17, + 3, + [18, [1, [0, 0, ""]], [15, [17, 0, [17, 0, [17, 3, [17, 4, 0]]]]]]]]]], + "@[<2>Uncaught exception:@\n@\n@[%a@]@]@\n@."], + _i_ = [0, 2], + _h_ = [0, cst_src_exn_ml, 54, 6], + _e_ = [0, "exn.ml.Reraised"], + _f_ = [0, cst_src_exn_ml, 33, 11], + _b_ = [0, "exn.ml.Finally"], + _c_ = [0, cst_src_exn_ml, 19, 11], + cst_Base_Exn_Reraised = "Base__Exn.Reraised", + cst_Base_Exn_Sexp = "Base__Exn.Sexp"; + function _a_(param){ + if(param[1] !== Finally) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + arg1_002 = param[3], + arg0_001 = param[2], + res0_003 = caml_call1(sexp_of_t, arg0_001), + res1_004 = caml_call1(sexp_of_t, arg1_002); + return [1, [0, _b_, [0, res0_003, [0, res1_004, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Finally, _a_); + var Reraised = [248, cst_Base_Exn_Reraised, caml_fresh_oo_id(0)]; + function _d_(param){ + if(param[1] !== Reraised) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + arg1_006 = param[3], + arg0_005 = param[2], + res0_007 = caml_call1(Base_Import[139], arg0_005), + res1_008 = caml_call1(sexp_of_t, arg1_006); + return [1, [0, _e_, [0, res0_007, [0, res1_008, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Reraised, _d_); + var Sexp = [248, cst_Base_Exn_Sexp, caml_fresh_oo_id(0)]; + function _g_(param){ + if(param[1] !== Sexp) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var t = param[2]; + return t; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Sexp, _g_); + function create_s(sexp){return [0, Sexp, sexp];} + function raise_with_original_backtrace(t, backtrace){ + runtime.caml_restore_raw_backtrace(t, backtrace); + throw caml_maybe_attach_backtrace(t, 0); + } + function reraise(exn, str){ + var exn$0 = [0, Reraised, str, exn]; + if(! runtime.Base_caml_exn_is_most_recent_exn(exn)) + throw caml_maybe_attach_backtrace(exn$0, 1); + var bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace(exn$0, bt); + } + function reraisef(exc, format){ + function _y_(str, param){return reraise(exc, str);} + return caml_call2(Base_Printf[4], _y_, format); + } + function to_string(exc){ + var _x_ = caml_call1(Base_Import[199], exc); + return caml_call2(Base_Sexp[15], _i_, _x_); + } + function to_string_mach(exc){ + var _w_ = caml_call1(Base_Import[199], exc); + return caml_call1(Base_Sexp[16], _w_); + } + var sexp_of_t$0 = Base_Import[199]; + function protectx(f, x, finally$0){ + try{var res = caml_call1(f, x);} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + try{caml_call1(finally$0, x);} + catch(final_exn$0){ + var final_exn = caml_wrap_exception(final_exn$0); + return raise_with_original_backtrace([0, Finally, exn, final_exn], bt); + } + return raise_with_original_backtrace(exn, bt); + } + caml_call1(finally$0, x); + return res; + } + function protect(f, finally$0){return protectx(f, 0, finally$0);} + function does_raise(f){ + try{caml_call1(f, 0); var _u_ = 0; return _u_;}catch(_v_){return 1;} + } + function pp(ppf, t){ + var match = caml_call1(Base_Import[201], t); + if(match){ + var sexp = match[1]; + return caml_call2(Base_Sexp[11], ppf, sexp); + } + var _t_ = caml_call1(Stdlib_Printexc[1], t); + return caml_call2(Stdlib_Format[13], ppf, _t_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1]; + function print_with_backtrace(exc, raw_backtrace){ + caml_call3(Stdlib_Format[137], _j_, pp$0, exc); + if(caml_call1(Stdlib_Printexc[8], 0)) + caml_call2(Stdlib_Printexc[13], Base_Import[85][39], raw_backtrace); + return caml_call1(Base_Import[85][62], Base_Import[85][39]); + } + function handle_uncaught_aux(do_at_exit, exit, f){ + try{var _p_ = caml_call1(f, 0); return _p_;} + catch(exc$0){ + var + exc = caml_wrap_exception(exc$0), + raw_backtrace = caml_call1(Stdlib_Printexc[12], 0); + if(do_at_exit) try{caml_call1(Base_Import[85][102], 0);}catch(_s_){} + try{print_with_backtrace(exc, raw_backtrace);} + catch(_q_){try{caml_call1(Stdlib_Printf[3], _k_);}catch(_r_){}} + return caml_call1(exit, 1); + } + } + function handle_uncaught_and_exit(f){ + return handle_uncaught_aux(1, exit, f); + } + function handle_uncaught(must_exit, f){ + var exit$0 = must_exit ? exit : function(_o_){return 0;}; + return handle_uncaught_aux(must_exit, exit$0, f); + } + function reraise_uncaught(str, func){ + try{var _n_ = caml_call1(func, 0); return _n_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace([0, Reraised, str, exn], bt); + } + } + function raise_without_backtrace(e){ + runtime.Base_clear_caml_backtrace_pos(0); + throw e; + } + function initialize_module(param){ + return caml_call1(Stdlib_Printexc[16], print_with_backtrace); + } + function clear_backtrace(_m_){ + return runtime.Base_clear_caml_backtrace_pos(_m_); + } + var + Private = [0, clear_backtrace], + Base_Exn = + [0, + sexp_of_t$0, + pp$0, + Finally, + Reraised, + create_s, + raise_without_backtrace, + raise_with_original_backtrace, + reraise, + reraisef, + to_string, + to_string_mach, + protectx, + protect, + handle_uncaught, + handle_uncaught_and_exit, + reraise_uncaught, + does_raise, + function(_l_){return runtime.Base_caml_exn_is_most_recent_exn(_l_);}, + initialize_module, + Private]; + runtime.caml_register_global(21, Base_Exn, "Base__Exn"); + return; + } + (globalThis)); + +//# 2761 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Exn = global_data.Base__Exn, + cst_use_of_return_from_a_with_ = + "use of [return] from a [with_return] that already returned", + cst_Return = "Return"; + function with_return(f){ + var + Return = [248, cst_Return, runtime.caml_fresh_oo_id(0)], + is_alive = [0, 1]; + function return$0(a){ + if(1 - is_alive[1]) + caml_call1(Base_Import[124], cst_use_of_return_from_a_with_); + return caml_call1(Base_Exn[6], [0, Return, a]); + } + try{var a$0 = caml_call1(f, return$0); is_alive[1] = 0; return a$0;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + is_alive[1] = 0; + if(exn[1] !== Return) throw caml_maybe_attach_backtrace(exn, 0); + var a = exn[2]; + return a; + } + } + function with_return_option(f){ + return with_return + (function(return$0){ + caml_call1(f, function(a){return caml_call1(return$0, [0, a]);}); + return 0; + }); + } + function prepend(param, f){ + return function(x){return caml_call1(param, caml_call1(f, x));}; + } + var Base_With_return = [0, with_return, with_return_option, prepend]; + runtime.caml_register_global(4, Base_With_return, "Base__With_return"); + return; + } + (globalThis)); + +//# 2833 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function S_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S3(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_to_S_indexed(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + } + function S3_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_indexed_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + var + Base_Monad_intf = + [0, + S_to_S2, + S2_to_S3, + S_to_S_indexed, + S2_to_S, + S3_to_S2, + S_indexed_to_S2]; + runtime.caml_register_global(0, Base_Monad_intf, "Base__Monad_intf"); + return; + } + (globalThis)); + +//# 3008 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0; + function Make_general(_s_){ + var bind = _s_[1], return$0 = _s_[3]; + function map_via_bind(ma, f){ + function _t_(a){ + var _u_ = caml_call1(f, a); + return caml_call1(_s_[3], _u_); + } + return caml_call2(_s_[1], ma, _t_); + } + var match = _s_[2]; + if(typeof match === "number") + var map = map_via_bind; + else + var x = match[2], map = x; + function symbol_bind(t, f){return caml_call2(bind, t, f);} + function symbol_map(t, f){return caml_call2(map, t, f);} + var + Monad_infix = [0, symbol_bind, symbol_map], + symbol_bind$0 = Monad_infix[1], + symbol_map$0 = Monad_infix[2], + symbol_bind$1 = Monad_infix[1], + symbol_map$1 = Monad_infix[2]; + function both(a, b){ + return caml_call2 + (symbol_bind$1, + a, + function(a){ + return caml_call2 + (symbol_map$1, b, function(b){return [0, a, b];}); + }); + } + var + Open_on_rhs = [0], + Let_syntax = [0, return$0, bind, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind$1, symbol_map$1, Let_syntax]; + function join(t){ + return caml_call2(symbol_bind$0, t, function(t){return t;}); + } + function ignore_m(t){ + return caml_call2(map, t, function(param){return 0;}); + } + function loop(vs, param){ + if(! param) return caml_call1(return$0, caml_call1(Base_List0[21], vs)); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(v){return loop([0, v, vs], ts);}); + } + function all(ts){return loop(0, ts);} + function all_unit(param){ + if(! param) return caml_call1(return$0, 0); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(param){return all_unit(ts);}); + } + return [0, + bind, + return$0, + map_via_bind, + map, + Monad_infix, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + join, + ignore_m, + all, + all_unit]; + } + function Make_indexed(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _r_ = Make_general([0, bind, map, return$0]); + return [0, + _r_[6], + _r_[7], + _r_[8], + _r_[5], + _r_[1], + _r_[2], + _r_[4], + _r_[9], + _r_[10], + _r_[11], + _r_[12]]; + } + function Make3(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _q_ = Make_general([0, bind, map, return$0]); + return [0, + _q_[6], + _q_[7], + _q_[8], + _q_[5], + _q_[1], + _q_[2], + _q_[4], + _q_[9], + _q_[10], + _q_[11], + _q_[12]]; + } + function Make2(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _p_ = Make_general([0, bind, map, return$0]); + return [0, + _p_[6], + _p_[7], + _p_[8], + _p_[5], + _p_[1], + _p_[2], + _p_[4], + _p_[9], + _p_[10], + _p_[11], + _p_[12]]; + } + function Make(M){ + var + bind = M[1], + return$0 = M[2], + map = M[3], + _o_ = Make_general([0, bind, map, return$0]); + return [0, + _o_[6], + _o_[7], + _o_[5], + _o_[1], + _o_[2], + _o_[4], + _o_[9], + _o_[10], + _o_[11], + _o_[12], + _o_[8]]; + } + function Of_monad_general(Monad, M){ + function return$0(a){ + var _n_ = caml_call1(Monad[3], a); + return caml_call1(M[2], _n_); + } + function bind(t, f){ + function _j_(a){ + var _m_ = caml_call1(f, a); + return caml_call1(M[1], _m_); + } + var _k_ = caml_call1(M[1], t), _l_ = caml_call2(Monad[1], _k_, _j_); + return caml_call1(M[2], _l_); + } + var + map = + [0, + -198771759, + function(t, f){ + var _h_ = caml_call1(M[1], t), _i_ = caml_call2(Monad[2], _h_, f); + return caml_call1(M[2], _i_); + }]; + return Make_general([0, bind, map, return$0]); + } + function bind(a, f){return caml_call1(f, a);} + function return$0(a){return a;} + var + map = [0, -198771759, function(a, f){return caml_call1(f, a);}], + include = Make([0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11], + Ident = + [0, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + function _a_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _g_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _g_[6], + _g_[7], + _g_[8], + _g_[5], + _g_[1], + _g_[2], + _g_[4], + _g_[9], + _g_[10], + _g_[11], + _g_[12]]; + } + function _b_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _f_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _f_[6], + _f_[7], + _f_[8], + _f_[5], + _f_[1], + _f_[2], + _f_[4], + _f_[9], + _f_[10], + _f_[11], + _f_[12]]; + } + function _c_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _e_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _e_[6], + _e_[7], + _e_[8], + _e_[5], + _e_[1], + _e_[2], + _e_[4], + _e_[9], + _e_[10], + _e_[11], + _e_[12]]; + } + var + Base_Monad = + [0, + Make, + Make2, + Make3, + Make_indexed, + function(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[4], + return$0 = Monad[5], + map = Monad[6], + _d_ = + Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _d_[6], + _d_[7], + _d_[5], + _d_[1], + _d_[2], + _d_[4], + _d_[9], + _d_[10], + _d_[11], + _d_[12], + _d_[8]]; + }, + _c_, + _b_, + _a_, + Ident]; + runtime.caml_register_global(1, Base_Monad, "Base__Monad"); + return; + } + (globalThis)); + +//# 3323 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Applicative_intf = [0]; + runtime.caml_register_global + (0, Base_Applicative_intf, "Base__Applicative_intf"); + return; + } + (globalThis)); + +//# 3334 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0; + function S_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S3(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S3_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Make3(_M_){ + var return$0 = _M_[1], symbol = _M_[2]; + function derived_map(t, f){ + return caml_call2(symbol, caml_call1(return$0, f), t); + } + var match = _M_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function map2(ta, tb, f){ + return caml_call2(symbol, caml_call2(map, ta, f), tb); + } + function map3(ta, tb, tc, f){ + return caml_call2 + (symbol, caml_call2(symbol, caml_call2(map, ta, f), tb), tc); + } + function all(ts){ + var _O_ = caml_call1(return$0, 0); + function _P_(x, xs){return [0, x, xs];} + function _Q_(_R_){return function(_S_){return map2(_R_, _S_, _P_);};} + return caml_call3(Base_List0[22], ts, _Q_, _O_); + } + function both(ta, tb){ + return map2(ta, tb, function(a, b){return [0, a, b];}); + } + function symbol$0(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(param, y){return y;}), + u), + v); + } + function symbol$1(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(x, param){return x;}), + u), + v); + } + function all_unit(ts){ + var _N_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _N_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make3([0, return$0, apply, map]); + } + function Make(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make2([0, return$0, apply, map]); + } + function Make_let_syntax3(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + return$1 = X[1], + map$0 = X[2], + both$0 = X[3], + symbol$2 = X[4], + symbol$3 = X[5], + symbol$4 = X[6], + symbol_map$0 = X[7], + Let_syntax = + [0, + return$1, + map$0, + both$0, + symbol$2, + symbol$3, + symbol$4, + symbol_map$0, + Impl], + Let_syntax$0 = + [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + Let_syntax]; + return [0, Let_syntax$0]; + } + function Make_let_syntax2(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7]; + return Make_let_syntax3 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl); + } + function Make3_using_map2(_D_){ + var return$0 = _D_[1], map2 = _D_[2]; + function symbol(tf, ta){ + return caml_call3(map2, tf, ta, function(f, a){return caml_call1(f, a);}); + } + function derived_map(t, f){return symbol(caml_call1(return$0, f), t);} + var match = _D_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function both(ta, tb){ + return caml_call3(map2, ta, tb, function(a, b){return [0, a, b];}); + } + function map3(ta, tb, tc, f){ + function _L_(fab, c){return caml_call1(fab, c);} + return caml_call3(map2, caml_call3(map2, ta, tb, f), tc, _L_); + } + function all(ts){ + var _F_ = caml_call1(return$0, 0); + function _G_(x, xs){return [0, x, xs];} + function _H_(_I_){ + var _J_ = caml_call1(map2, _I_); + return function(_K_){return caml_call2(_J_, _K_, _G_);}; + } + return caml_call3(Base_List0[22], ts, _H_, _F_); + } + function symbol$0(u, v){ + return caml_call3(map2, u, v, function(param, y){return y;}); + } + function symbol$1(u, v){ + return caml_call3(map2, u, v, function(x, param){return x;}); + } + function all_unit(ts){ + var _E_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _E_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make3_using_map2([0, return$0, map2, map]); + } + function Make_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make2_using_map2([0, return$0, map2, map]); + } + function Of_monad2(M){ + var return$0 = M[6]; + function apply(mf, mx){ + function _C_(f){return caml_call2(M[7], mx, f);} + return caml_call2(M[5], mf, _C_); + } + var map = [0, -198771759, M[7]]; + return Make2([0, return$0, apply, map]); + } + function Of_monad(M){ + var + symbol_bind = M[1], + symbol_map = M[2], + Monad_infix = M[3], + bind = M[4], + return$0 = M[5], + map = M[6], + join = M[7], + ignore_m = M[8], + all = M[9], + all_unit = M[10], + Let_syntax = M[11]; + return Of_monad2 + ([0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]); + } + function Compose(F, G){ + function return$0(a){ + var _B_ = caml_call1(F[1], a); + return caml_call1(G[1], _B_); + } + function apply(tf, tx){ + var _A_ = caml_call2(G[2], tf, F[8]); + return caml_call2(G[8], _A_, tx); + } + function custom_map(t, f){ + var _x_ = F[2]; + function _y_(_z_){return caml_call2(_x_, _z_, f);} + return caml_call2(G[2], t, _y_); + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Pair(F, G){ + function return$0(a){ + var _w_ = caml_call1(G[1], a); + return [0, caml_call1(F[1], a), _w_]; + } + function apply(tf, tx){ + var + _r_ = caml_call1(Base_Import[127], tx), + _s_ = caml_call1(Base_Import[127], tf), + _t_ = caml_call2(G[8], _s_, _r_), + _u_ = caml_call1(Base_Import[125], tx), + _v_ = caml_call1(Base_Import[125], tf); + return [0, caml_call2(F[8], _v_, _u_), _t_]; + } + function custom_map(t, f){ + var + _o_ = caml_call1(Base_Import[127], t), + _p_ = caml_call2(G[2], _o_, f), + _q_ = caml_call1(Base_Import[125], t); + return [0, caml_call2(F[2], _q_, f), _p_]; + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function _a_(_l_, _k_, _j_){ + var _m_ = Make_let_syntax3(_l_, _k_, _j_)[1], _n_ = _m_[8]; + return [0, + [0, + _m_[1], + _m_[4], + _m_[5], + _m_[6], + _m_[7], + [0, _n_[1], _n_[2], _n_[3], _n_[8]]]]; + } + function _b_(_g_, _f_, _e_){ + var _h_ = Make_let_syntax2(_g_, _f_, _e_)[1], _i_ = _h_[8]; + return [0, + [0, + _h_[1], + _h_[4], + _h_[5], + _h_[6], + _h_[7], + [0, _i_[1], _i_[2], _i_[3], _i_[8]]]]; + } + var + Base_Applicative = + [0, + S2_to_S, + S_to_S2, + S3_to_S2, + S2_to_S3, + Make, + Make2, + Make3, + function(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + _c_ = + Make_let_syntax2 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl) + [1], + _d_ = _c_[8]; + return [0, + [0, + _c_[1], + _c_[4], + _c_[5], + _c_[6], + _c_[7], + [0, _d_[1], _d_[2], _d_[3], _d_[8]]]]; + }, + _b_, + _a_, + Make_using_map2, + Make2_using_map2, + Make3_using_map2, + Of_monad, + Of_monad2, + Compose, + Pair]; + runtime.caml_register_global(2, Base_Applicative, "Base__Applicative"); + return; + } + (globalThis)); + +//# 3868 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Base_Sys0 = global_data.Base__Sys0, + Primitives = [0], + max_length = Base_Sys0[10], + blit = Stdlib_BytesLabels[11], + blit_string = Stdlib_BytesLabels[12], + compare = Stdlib_BytesLabels[40], + copy = Stdlib_BytesLabels[4], + create = runtime.caml_create_bytes, + fill = Stdlib_BytesLabels[10], + make = Stdlib_BytesLabels[1], + map = Stdlib_BytesLabels[17], + mapi = Stdlib_BytesLabels[18], + sub = Stdlib_BytesLabels[7], + unsafe_blit = runtime.caml_blit_bytes, + to_string = Stdlib_BytesLabels[6], + of_string = Stdlib_BytesLabels[5]; + function unsafe_to_string(s){return caml_call1(Stdlib_BytesLabels[44], s);} + var + unsafe_of_string_promise_no_mu = Stdlib_BytesLabels[45], + Base_Bytes0 = + [0, + Primitives, + max_length, + blit, + blit_string, + compare, + copy, + create, + fill, + make, + map, + mapi, + sub, + unsafe_blit, + to_string, + of_string, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(2, Base_Bytes0, "Base__Bytes0"); + return; + } + (globalThis)); + +//# 3924 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var Module = [0], _a_ = [0, "_"]; + function make(compare, sexp_of_t){ + var comparator = [0, compare, sexp_of_t]; + return [0, comparator]; + } + function S_to_S1(S){var comparator = S[1]; return [0, comparator];} + function Make1(M){ + var comparator = [0, M[1], M[2]]; + return [0, comparator]; + } + var compare = runtime.caml_compare; + function sexp_of_t(param){return _a_;} + var + include = Make1([0, compare, sexp_of_t]), + comparator = include[1], + Poly = [0, comparator]; + function Derived(M){ + function comparator(a){ + var _d_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _d_]; + } + return [0, comparator]; + } + function Derived2(M){ + function comparator(a, b){ + var _c_ = caml_call2(M[2], a[2], b[2]); + return [0, caml_call2(M[1], a[1], b[1]), _c_]; + } + return [0, comparator]; + } + function Derived_phantom(M){ + function comparator(a){ + var _b_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _b_]; + } + return [0, comparator]; + } + var + Base_Comparator = + [0, + make, + Poly, + Module, + S_to_S1, + function(M){var comparator = [0, M[1], M[2]]; return [0, comparator];}, + Make1, + Derived, + Derived2, + Derived_phantom]; + runtime.caml_register_global(1, Base_Comparator, "Base__Comparator"); + return; + } + (globalThis)); + +//# 4201 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Sys0 = global_data.Base__Sys0, + Base_Import0 = global_data.Base__Import0, + String = [0], + max_length = Base_Sys0[10], + symbol = Base_Import0[112], + capitalize = Stdlib_StringLabels[27], + compare = Stdlib_StringLabels[9]; + function copy(x){ + var _a_ = caml_call1(Base_Bytes0[15], x); + return caml_call1(Base_Bytes0[16], _a_); + } + var + escaped = Stdlib_StringLabels[24], + lowercase = Stdlib_StringLabels[26], + make = Stdlib_StringLabels[1], + sub = Stdlib_StringLabels[15], + uncapitalize = Stdlib_StringLabels[28], + unsafe_blit = runtime.caml_blit_string, + uppercase = Stdlib_StringLabels[25]; + function concat(opt, l){ + if(opt) var sth = opt[1], sep = sth; else var sep = cst$0; + if(! l) return cst; + if(l[2]) return caml_call2(Stdlib_StringLabels[6], sep, l); + var x = l[1]; + return x; + } + function iter(t, f){return caml_call2(Stdlib_StringLabels[29], f, t);} + var + Base_String0 = + [0, + String, + max_length, + symbol, + capitalize, + compare, + copy, + escaped, + lowercase, + make, + sub, + uncapitalize, + unsafe_blit, + uppercase, + concat, + iter]; + runtime.caml_register_global(6, Base_String0, "Base__String0"); + return; + } + (globalThis)); + +//# 4273 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ":"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$1, + cst$0 = cst$1, + Base_Import = global_data.Base__Import, + Base_Int0 = global_data.Base__Int0, + Base_String0 = global_data.Base__String0, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Comparator = global_data.Base__Comparator, + _a_ = [0, "pos_cnum"], + _b_ = [0, "pos_bol"], + _c_ = [0, "pos_lnum"], + _d_ = [0, "pos_fname"]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + var n = caml_call2(Base_Import[233], a_001[1], b_002[1]); + if(0 !== n) return n; + var n$0 = caml_call2(Base_Import[229], a_001[2], b_002[2]); + if(0 !== n$0) return n$0; + var n$1 = caml_call2(Base_Import[229], a_001[3], b_002[3]); + return 0 === n$1 ? caml_call2(Base_Import[229], a_001[4], b_002[4]) : n$1; + } + function hash_fold_t(hsv, arg){ + var + hsv$0 = caml_call2(Base_Import[209], hsv, arg[1]), + hsv$1 = caml_call2(Base_Import[207], hsv$0, arg[2]), + hsv$2 = caml_call2(Base_Import[207], hsv$1, arg[3]); + return caml_call2(Base_Import[207], hsv$2, arg[4]); + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function sexp_of_t(param){ + var + pos_cnum_010 = param[4], + pos_bol_008 = param[3], + pos_lnum_006 = param[2], + pos_fname_004 = param[1], + arg_011 = caml_call1(Base_Import[142], pos_cnum_010), + bnds_003 = [0, [1, [0, _a_, [0, arg_011, 0]]], 0], + arg_009 = caml_call1(Base_Import[142], pos_bol_008), + bnds_003$0 = [0, [1, [0, _b_, [0, arg_009, 0]]], bnds_003], + arg_007 = caml_call1(Base_Import[142], pos_lnum_006), + bnds_003$1 = [0, [1, [0, _c_, [0, arg_007, 0]]], bnds_003$0], + arg_005 = caml_call1(Base_Import[139], pos_fname_004), + bnds_003$2 = [0, [1, [0, _d_, [0, arg_005, 0]]], bnds_003$1]; + return [1, bnds_003$2]; + } + var + T = [0, compare, hash_fold_t, hash, sexp_of_t], + compare$0 = T[1], + hash_fold_t$0 = T[2], + hash$0 = T[3], + include = caml_call1(Base_Comparator[5], [0, T[1], T[4]]), + comparator = include[1]; + function make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol){ + var + _e_ = caml_call2(Base_Import[93], pos_cnum, pos_bol), + _f_ = [0, cst, [0, caml_call1(Base_Int0[1], _e_), 0]], + _g_ = + [0, + pos_fname, + [0, cst$0, [0, caml_call1(Base_Int0[1], pos_lnum), _f_]]]; + return caml_call2(Base_String0[14], 0, _g_); + } + function to_string(param){ + var + pos_cnum = param[4], + pos_bol = param[3], + pos_lnum = param[2], + pos_fname = param[1]; + return make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol); + } + function sexp_of_t$0(t){return [0, to_string(t)];} + var + Base_Source_code_position0 = + [0, + T, + compare$0, + hash_fold_t$0, + hash$0, + comparator, + make_location_string, + to_string, + sexp_of_t$0]; + runtime.caml_register_global + (12, Base_Source_code_position0, "Base__Source_code_position0"); + return; + } + (globalThis)); + +//# 4392 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0, + hd_exn = Base_List0[1], + length = Base_List0[2], + rev_append = Base_List0[3], + tl_exn = Base_List0[4], + unzip = Base_List0[5], + exists = Base_List0[6], + exists2_ok = Base_List0[7], + fold = Base_List0[8], + fold2_ok = Base_List0[9], + for_all = Base_List0[10], + for_all2_ok = Base_List0[11], + iter = Base_List0[12], + iter2_ok = Base_List0[13], + nontail_map = Base_List0[14], + nontail_mapi = Base_List0[15], + partition = Base_List0[16], + rev_map = Base_List0[17], + rev_map2_ok = Base_List0[18], + sort = Base_List0[19], + stable_sort = Base_List0[20], + rev = Base_List0[21], + fold_right = Base_List0[22]; + function is_empty(param){return param ? 0 : 1;} + function partition_map(t, f){ + var t$0 = t, fst = 0, snd = 0; + for(;;){ + if(! t$0){ + var _a_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _a_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x); + if(0 === match[0]){ + var y = match[1], fst$0 = [0, y, fst], t$0 = t$1, fst = fst$0; + continue; + } + var y$0 = match[1], snd$0 = [0, y$0, snd], t$0 = t$1, snd = snd$0; + } + } + var + Base_List1 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right, + is_empty, + partition_map]; + runtime.caml_register_global(1, Base_List1, "Base__List1"); + return; + } + (globalThis)); + +//# 4476 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Error$0 = "Error", + cst_Ok$0 = "Ok", + cst_error = "error", + cst_ok = "ok", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_005 = "result.ml.t", + Base_List1 = global_data.Base__List1, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Monad = global_data.Base__Monad, + _c_ = [0, 0], + cst_Error = cst_Error$0, + cst_Ok = cst_Ok$0, + _a_ = [0, cst_Ok$0], + _b_ = [0, cst_Error$0]; + function t_of_sexp(of_a_001, of_b_002, sexp_007){ + if(0 === sexp_007[0]){ + var _f_ = sexp_007[1], switch$0 = 0; + if(caml_string_notequal(_f_, cst_Error$0)){ + var switch$1 = 0; + if(caml_string_notequal(_f_, cst_Ok$0)){ + if(caml_string_notequal(_f_, cst_error)) + if(caml_string_notequal(_f_, cst_ok)) switch$0 = 1; else switch$1 = 1; + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + else{ + var _g_ = sexp_007[1]; + if(! _g_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_007); + var _h_ = _g_[1]; + if(0 !== _h_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_007); + var tag_008 = _h_[1], switch$2 = 0; + if(caml_string_notequal(tag_008, cst_Error$0)){ + var switch$3 = 0; + if(caml_string_notequal(tag_008, cst_Ok$0)){ + if(caml_string_notequal(tag_008, cst_error)) + if(caml_string_notequal(tag_008, cst_ok)) + switch$2 = 1; + else + switch$3 = 1; + } + else + switch$3 = 1; + if(switch$3){ + var sexp_args_009 = _g_[2]; + if(sexp_args_009 && ! sexp_args_009[2]){ + var + arg0_010 = sexp_args_009[1], + res0_011 = caml_call1(of_a_001, arg0_010); + return [0, res0_011]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + if(! switch$2){ + var sexp_args_014 = _g_[2]; + if(sexp_args_014 && ! sexp_args_014[2]){ + var + arg0_015 = sexp_args_014[1], + res0_016 = caml_call1(of_b_002, arg0_015); + return [1, res0_016]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_007); + } + function sexp_of_t(of_a_019, of_b_020, param){ + if(0 === param[0]){ + var arg0_021 = param[1], res0_022 = caml_call1(of_a_019, arg0_021); + return [1, [0, _a_, [0, res0_022, 0]]]; + } + var arg0_023 = param[1], res0_024 = caml_call1(of_b_020, arg0_023); + return [1, [0, _b_, [0, res0_024, 0]]]; + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Ok, [0, [0, a_sexp_grammar, 0]]]], + [0, [1, [0, cst_Error, [0, [0, b_sexp_grammar, 0]]]], 0]]]]; + } + function compare(cmp_a, cmp_b, a_027, b_028){ + if(caml_call2(Base_Ppx_compare_lib[1], a_027, b_028)) return 0; + if(0 === a_027[0]){ + var a_029 = a_027[1]; + if(0 !== b_028[0]) return -1; + var b_030 = b_028[1]; + return caml_call2(cmp_a, a_029, b_030); + } + var a_031 = a_027[1]; + if(0 === b_028[0]) return 1; + var b_032 = b_028[1]; + return caml_call2(cmp_b, a_031, b_032); + } + function equal(cmp_a, cmp_b, a_033, b_034){ + if(caml_call2(Base_Ppx_compare_lib[1], a_033, b_034)) return 1; + if(0 === a_033[0]){ + var a_035 = a_033[1]; + if(0 !== b_034[0]) return 0; + var b_036 = b_034[1]; + return caml_call2(cmp_a, a_035, b_036); + } + var a_037 = a_033[1]; + if(0 === b_034[0]) return 0; + var b_038 = b_034[1]; + return caml_call2(cmp_b, a_037, b_038); + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + } + function bind(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return caml_call1(f, x$0); + } + var + map = + [0, + -198771759, + function(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return [0, caml_call1(f, x$0)]; + }]; + function return$0(x){return [0, x];} + var + include = caml_call1(Base_Monad[2], [0, bind, map, return$0]), + symbol_bind = include[1], + symbol_map = include[2], + Let_syntax = include[3], + Monad_infix = include[4], + bind$0 = include[5], + return$1 = include[6], + map$0 = include[7], + join = include[8], + ignore_m = include[9], + all = include[10], + all_unit = include[11]; + function invariant(check_ok, check_error, t){ + if(0 === t[0]){var ok = t[1]; return caml_call1(check_ok, ok);} + var error = t[1]; + return caml_call1(check_error, error); + } + function fail(x){return [1, x];} + function failf(format){return caml_call2(Base_Printf[4], fail, format);} + function map_error(t, f){ + if(0 === t[0]) return t; + var x = t[1]; + return [1, caml_call1(f, x)]; + } + function bind$1(x, f){ + if(0 === x[0]) return x; + var e = x[1]; + return caml_call1(f, e); + } + var map$1 = [0, -198771759, map_error]; + function return$2(e){return [1, e];} + var Error = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]); + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function ok(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function error(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function of_option(opt, error){ + if(! opt) return [1, error]; + var x = opt[1]; + return [0, x]; + } + function iter(v, f){ + if(0 !== v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function iter_error(v, f){ + if(0 === v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function to_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function of_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function ok_if_true(bool, error){return bool ? _c_ : [1, error];} + function try_with(f){ + try{var _e_ = [0, caml_call1(f, 0)]; return _e_;} + catch(exn$0){var exn = caml_wrap_exception(exn$0); return [1, exn];} + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var exn = param[1]; + throw caml_maybe_attach_backtrace(exn, 1); + } + function ok_or_failwith(param){ + if(0 === param[0]){var x = param[1]; return x;} + var str = param[1]; + return caml_call1(Base_Import[124], str); + } + function combine(t1, t2, ok, err){ + if(0 === t1[0]){ + var ok1 = t1[1]; + if(0 === t2[0]){var ok2 = t2[1]; return [0, caml_call2(ok, ok1, ok2)];} + var e = t2[1]; + } + else{ + var err1 = t1[1]; + if(0 !== t2[0]){ + var err2 = t2[1]; + return [1, caml_call2(err, err1, err2)]; + } + var e = err1; + } + return [1, e]; + } + function combine_errors(l){ + var + match = caml_call2(Base_List1[24], l, to_either), + errs = match[2], + ok = match[1]; + return errs ? [1, errs] : [0, ok]; + } + function combine_errors_unit(l){ + function _d_(param){return 0;} + return caml_call2(map$0, combine_errors(l), _d_); + } + var + Base_Result = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + equal, + hash_fold_t, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind$0, + return$1, + join, + ignore_m, + all, + all_unit, + Error, + invariant, + fail, + failf, + is_ok, + is_error, + ok, + ok_exn, + ok_or_failwith, + error, + of_option, + iter, + iter_error, + map$0, + map_error, + combine, + combine_errors, + combine_errors_unit, + to_either, + of_either, + to_either, + ok_if_true, + try_with, + [0, is_ok, is_error]]; + runtime.caml_register_global(21, Base_Result, "Base__Result"); + return; + } + (globalThis)); + +//# 4816 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Continue_or_stop = [0], + Export = [0, Continue_or_stop], + Continue_or_stop$0 = Export[1], + Base_Container_intf = [0, Export, Continue_or_stop$0]; + runtime.caml_register_global + (0, Base_Container_intf, "Base__Container_intf"); + return; + } + (globalThis)); + +//# 4832 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Array0 = global_data.Base__Array0, + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iter(fold, t, f){ + return caml_call3 + (fold, t, 0, function(param, a){return caml_call1(f, a);}); + } + function count(fold, t, f){ + return caml_call3 + (fold, + t, + 0, + function(n, a){ + return caml_call1(f, a) ? caml_call2(Base_Import[91], n, 1) : n; + }); + } + function sum(fold, M){ + return function(t, f){ + function _h_(n, a){ + var _i_ = caml_call1(f, a); + return caml_call2(M[2], n, _i_); + } + return caml_call3(fold, t, M[1], _h_);}; + } + function fold_result(fold, init, f, t){ + return caml_call1 + (with_return, + function(param){ + return [0, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var e = caml_call2(f, acc, item); + if(0 !== e[0]) return caml_call1(param, e); + var x = e[1]; + return x; + })]; + }); + } + function fold_until(fold, init, f, finish, t){ + return caml_call1 + (with_return, + function(param){ + return caml_call1 + (finish, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var match = caml_call2(f, acc, item); + if(0 === match[0]){var x = match[1]; return x;} + var x$0 = match[1]; + return caml_call1(param, x$0); + })); + }); + } + function min_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var min = acc[1]; + return 0 < caml_call2(compare, min, elt) ? [0, elt] : acc; + }); + } + function max_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var max = acc[1]; + return 0 <= caml_call2(compare, max, elt) ? acc : [0, elt]; + }); + } + function length(fold, c){ + return caml_call3 + (fold, + c, + 0, + function(acc, param){return caml_call2(Base_Import[91], acc, 1);}); + } + function is_empty(iter, c){ + return caml_call1 + (with_return, + function(r){ + caml_call2(iter, c, function(param){return caml_call1(r, 0);}); + return 1; + }); + } + function exists(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _g_ = caml_call1(f, x); + return _g_ ? caml_call1(r, 1) : _g_; + }); + return 0; + }); + } + function for_all(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _f_ = 1 - caml_call1(f, x); + return _f_ ? caml_call1(r, 0) : _f_; + }); + return 1; + }); + } + function find_map(iter, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + t, + function(x){ + var res = caml_call1(f, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function find(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _e_ = caml_call1(f, x); + return _e_ ? caml_call1(r, [0, x]) : _e_; + }); + return 0; + }); + } + function to_list(fold, c){ + var _d_ = caml_call3(fold, c, 0, function(acc, x){return [0, x, acc];}); + return caml_call1(Base_List0[21], _d_); + } + function to_array(length, iter, c){ + var array = [0, [0]], i = [0, 0]; + caml_call2 + (iter, + c, + function(x){ + if(0 === i[1]){ + var _b_ = caml_call1(length, c); + array[1] = caml_call2(Base_Array0[4], _b_, x); + } + var _c_ = i[1]; + runtime.caml_check_bound(array[1], _c_)[1 + _c_] = x; + return caml_call1(Base_Import[130], i); + }); + return array[1]; + } + function Make_gen(T){ + var fold = T[1], match = T[2]; + if(typeof match === "number") + var iter$0 = function(t, f){return iter(fold, t, f);}; + else + var iter$1 = match[2], iter$0 = iter$1; + var match$0 = T[3]; + if(typeof match$0 === "number") + var length$0 = function(t){return length(fold, t);}; + else + var length$1 = match$0[2], length$0 = length$1; + function is_empty$0(t){return is_empty(iter$0, t);} + function sum$0(m, t){return caml_call1(sum(fold, m), t);} + function count$0(t, f){return count(fold, t, f);} + function exists$0(t, f){return exists(iter$0, t, f);} + function for_all$0(t, f){return for_all(iter$0, t, f);} + function find_map$0(t, f){return find_map(iter$0, t, f);} + function find$0(t, f){return find(iter$0, t, f);} + function to_list$0(t){return to_list(fold, t);} + function to_array$0(t){return to_array(length$0, iter$0, t);} + function min_elt$0(t, compare){return min_elt(fold, t, compare);} + function max_elt$0(t, compare){return max_elt(fold, t, compare);} + function fold_result$0(t, init, f){return fold_result(fold, init, f, t);} + function fold_until$0(t, init, f, finish){ + return fold_until(fold, init, f, finish, t); + } + return [0, + length$0, + is_empty$0, + iter$0, + fold, + fold_result$0, + fold_until$0, + exists$0, + for_all$0, + count$0, + sum$0, + find$0, + find_map$0, + to_list$0, + to_array$0, + min_elt$0, + max_elt$0]; + } + function _a_(T){ + var + fold = T[2], + iter = T[3], + length = T[4], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, elt){ + return caml_call2(exists, t, caml_call1(T[1][1], elt)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + } + var + Base_Container = + [0, + iter, + count, + min_elt, + max_elt, + length, + to_list, + sum, + fold_result, + fold_until, + is_empty, + exists, + for_all, + find, + find_map, + to_array, + function(T){ + var + fold = T[1], + iter = T[2], + length = T[3], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, a, equal){ + return caml_call2(exists, t, caml_call1(equal, a)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + }, + _a_, + Make_gen]; + runtime.caml_register_global(4, Base_Container, "Base__Container"); + return; + } + (globalThis)); + +//# 5186 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Import = global_data.Base__Import, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Base_Hash = global_data.Base__Hash, + Base_Monad = global_data.Base__Monad, + Undefined = Stdlib_Lazy[1], + is_val = Stdlib_Lazy[3], + from_val = Stdlib_Lazy[4], + from_fun = Stdlib_Lazy[6], + force_val = Stdlib_Lazy[7], + t_of_sexp = Base_Import[172], + sexp_of_t = Base_Import[148], + cst_unforced_lazy = ""; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[193], a_sexp_grammar); + } + function _a_(t, f){ + return [246, + function(_q_){ + var _r_ = caml_obj_tag(t); + if(250 === _r_) + var _s_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _r_ && 244 !== _r_){var _s_ = t; switch$0 = 1;} + if(! switch$0) var _s_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(f, _s_); + }]; + } + function compare(compare_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 0; + var _m_ = caml_obj_tag(t2); + if(250 === _m_) + var _n_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _m_ && 244 !== _m_){var _n_ = t2; switch$0 = 1;} + if(! switch$0) var _n_ = caml_call1(CamlinternalLazy[2], t2); + } + var _o_ = caml_obj_tag(t1); + if(250 === _o_) + var _p_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _o_ && 244 !== _o_){var _p_ = t1; switch$1 = 1;} + if(! switch$1) var _p_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(compare_a, _p_, _n_); + } + function equal(equal_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 1; + var _i_ = caml_obj_tag(t2); + if(250 === _i_) + var _j_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _i_ && 244 !== _i_){var _j_ = t2; switch$0 = 1;} + if(! switch$0) var _j_ = caml_call1(CamlinternalLazy[2], t2); + } + var _k_ = caml_obj_tag(t1); + if(250 === _k_) + var _l_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _k_ && 244 !== _k_){var _l_ = t1; switch$1 = 1;} + if(! switch$1) var _l_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(equal_a, _l_, _j_); + } + var hash_fold_t = Base_Hash[13][12]; + function return$0(x){return caml_call1(from_val, x);} + function bind(t, f){ + return [246, + function(_d_){ + var _e_ = caml_obj_tag(t); + if(250 === _e_) + var _f_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _e_ && 244 !== _e_){var _f_ = t; switch$0 = 1;} + if(! switch$0) var _f_ = caml_call1(CamlinternalLazy[2], t); + } + var _g_ = caml_call1(f, _f_), _h_ = caml_obj_tag(_g_); + if(250 === _h_) return _g_[1]; + if(246 !== _h_ && 244 !== _h_) return _g_; + return caml_call1(CamlinternalLazy[2], _g_); + }]; + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function sexp_of_t$0(sexp_of_a, t){ + if(! caml_call1(is_val, t)) + return caml_call1(Base_Import[139], cst_unforced_lazy); + var _b_ = caml_obj_tag(t); + if(250 === _b_) + var _c_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = t; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(sexp_of_a, _c_); + } + var + T_unforcing = [0, sexp_of_t$0], + Base_Lazy = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + Undefined, + force_val, + from_fun, + from_val, + is_val, + T_unforcing]; + runtime.caml_register_global(6, Base_Lazy, "Base__Lazy"); + return; + } + (globalThis)); + +//# 5351 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Info_intf = [0]; + runtime.caml_register_global(0, Base_Info_intf, "Base__Info_intf"); + return; + } + (globalThis)); + +//# 5361 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + invalid_argf = Base_Printf[7], + _a_ = + [0, + [11, "Negative position: ", [4, 0, 0, 0, 0]], + "Negative position: %d"], + _b_ = + [0, [11, "Negative length: ", [4, 0, 0, 0, 0]], "Negative length: %d"], + _c_ = + [0, + [11, + "pos + len past end: ", + [4, 0, 0, 0, [11, " + ", [4, 0, 0, 0, [11, " > ", [4, 0, 0, 0, 0]]]]]], + "pos + len past end: %d + %d > %d"]; + function slow_check_pos_len_exn(pos, len, total_length){ + if(pos < 0) caml_call3(invalid_argf, _a_, pos, 0); + if(len < 0) caml_call3(invalid_argf, _b_, len, 0); + var _h_ = caml_call2(Base_Import[93], total_length, len) < pos ? 1 : 0; + return _h_ + ? caml_call5(invalid_argf, _c_, pos, len, total_length, 0) + : _h_; + } + function check_pos_len_exn(pos, len, total_length){ + var + stop = caml_call2(Base_Import[91], pos, len), + _d_ = caml_call2(Base_Import[93], total_length, stop), + _e_ = caml_call2(Base_Import[118], pos, len), + _f_ = caml_call2(Base_Import[118], _e_, stop), + _g_ = caml_call2(Base_Import[118], _f_, _d_) < 0 ? 1 : 0; + return _g_ ? slow_check_pos_len_exn(pos, len, total_length) : _g_; + } + function get_pos_len_exn(opt, len, param, total_length){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], len$0 = i; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + check_pos_len_exn(pos, len$0, total_length); + return [0, pos, len$0]; + } + var + Private = [0, slow_check_pos_len_exn], + Base_Ordered_collection_common = + [0, get_pos_len_exn, check_pos_len_exn, Private]; + runtime.caml_register_global + (5, Base_Ordered_collection_common, "Base__Ordered_collection_common0"); + return; + } + (globalThis)); + +//# 5435 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Lazy = global_data.Stdlib__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy; + function of_state(_f_){return _f_;} + var Repr = [0, of_state]; + function assign(dst, src){ + var _b_ = caml_obj_tag(dst); + if(250 === _b_) + var _c_ = dst[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = dst; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], dst); + } + var dst$0 = caml_call1(Repr[1], _c_), _d_ = caml_obj_tag(src); + if(250 === _d_) + var _e_ = src[1]; + else{ + var switch$1 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = src; switch$1 = 1;} + if(! switch$1) var _e_ = caml_call1(CamlinternalLazy[2], src); + } + var src$0 = caml_call1(Repr[1], _e_); + return runtime.caml_ba_blit(src$0, dst$0); + } + function make_default(default$0){ + function split_from_parent(v){ + return caml_call2(Stdlib_Lazy[5], Stdlib_Random[15][15], v); + } + function _a_(param){return default$0;} + return caml_call2(Stdlib_Domain[10][1], [0, split_from_parent], _a_); + } + function get_state(random_key){ + return caml_call1(Stdlib_Domain[10][2], random_key); + } + var Base_Random_repr = [0, Repr, assign, make_default, get_state]; + runtime.caml_register_global(4, Base_Random_repr, "Base__Random_repr"); + return; + } + (globalThis)); + +//# 5495 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_add = runtime.caml_int64_add, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_left = runtime.caml_int64_shift_left, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_int64_xor = runtime.caml_int64_xor, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random_repr = global_data.Base__Random_repr, + Base_Import = global_data.Base__Import, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Int0 = global_data.Base__Int0, + Base_Printf = global_data.Base__Printf, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + Base_Lazy = global_data.Base__Lazy, + Base_Char0 = global_data.Base__Char0, + Base_Word_size = global_data.Base__Word_size, + cst_float = "float", + cst_int64 = "int64", + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_nativeint = "nativeint", + cst_int32 = "int32", + cst_int = "int", + _a_ = + [0, + [11, + "Random.", + [2, + 0, + [11, ": crossed bounds [", [2, 0, [11, " > ", [2, 0, [12, 93, 0]]]]]]], + "Random.%s: crossed bounds [%s > %s]"], + cst_initializing_Random_with_a = + "initializing Random with a nondeterministic seed is forbidden in inline tests"; + function forbid_nondeterminism_in_tests(allow_in_tests){ + var _M_ = Base_Import[132]; + if(! _M_) return _M_; + if(allow_in_tests && allow_in_tests[1]) return 0; + return caml_call1(Base_Import[124], cst_initializing_Random_with_a); + } + function bits(t){ + var _K_ = caml_obj_tag(t); + if(250 === _K_) + var _L_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _K_ && 244 !== _K_){var _L_ = t; switch$0 = 1;} + if(! switch$0) var _L_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][4], _L_); + } + function bool(t){ + var _I_ = caml_obj_tag(t); + if(250 === _I_) + var _J_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _I_ && 244 !== _I_){var _J_ = t; switch$0 = 1;} + if(! switch$0) var _J_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][11], _J_); + } + function int$0(t, x){ + var _G_ = caml_obj_tag(t); + if(250 === _G_) + var _H_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _G_ && 244 !== _G_){var _H_ = t; switch$0 = 1;} + if(! switch$0) var _H_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][5], _H_, x); + } + function int32(t, x){ + var _E_ = caml_obj_tag(t); + if(250 === _E_) + var _F_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _E_ && 244 !== _E_){var _F_ = t; switch$0 = 1;} + if(! switch$0) var _F_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][7], _F_, x); + } + function int64(t, x){ + var _C_ = caml_obj_tag(t); + if(250 === _C_) + var _D_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _C_ && 244 !== _C_){var _D_ = t; switch$0 = 1;} + if(! switch$0) var _D_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][9], _D_, x); + } + function nativeint(t, x){ + var _A_ = caml_obj_tag(t); + if(250 === _A_) + var _B_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _A_ && 244 !== _A_){var _B_ = t; switch$0 = 1;} + if(! switch$0) var _B_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][8], _B_, x); + } + function make(seed){ + var _z_ = caml_call1(Stdlib_Random[15][1], seed); + return caml_call1(Base_Lazy[21], _z_); + } + function copy(t){ + var _w_ = caml_obj_tag(t); + if(250 === _w_) + var _x_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _w_ && 244 !== _w_){var _x_ = t; switch$0 = 1;} + if(! switch$0) var _x_ = caml_call1(CamlinternalLazy[2], t); + } + var _y_ = caml_call1(Stdlib_Random[15][3], _x_); + return caml_call1(Base_Lazy[21], _y_); + } + function char$0(t){ + var _v_ = int$0(t, 256); + return caml_call1(Base_Char0[5], _v_); + } + function ascii(t){ + var _u_ = int$0(t, 128); + return caml_call1(Base_Char0[5], _u_); + } + function make_self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + var _t_ = caml_call1(Stdlib_Random[15][2], 0); + return caml_call1(Base_Lazy[21], _t_); + } + var assign = Base_Random_repr[2]; + if(Base_Import[132]){ + var t = caml_call1(Stdlib_Random[16], 0); + caml_call1(Stdlib_Random[1], 137); + var default$0 = caml_call1(Base_Lazy[21], t); + } + else + var + default$0 = + [246, + function(param){ + var _r_ = make_self_init(0, 0), _s_ = caml_obj_tag(_r_); + if(250 === _s_) return _r_[1]; + if(246 !== _s_ && 244 !== _s_) return _r_; + return caml_call1(CamlinternalLazy[2], _r_); + }]; + function int_on_64bits(t, bound){ + return 1073741823 < bound + ? caml_int64_to_int32(int64(t, caml_int64_of_int32(bound))) + : int$0(t, bound); + } + function int_on_32bits(t, bound){ + return 1073741823 < bound ? int32(t, bound) : int$0(t, bound); + } + var int$1 = Base_Word_size[3] ? int_on_64bits : int_on_32bits; + function bits$0(state){return caml_int64_of_int32(bits(state));} + function full_range_int64(state){ + var + _p_ = caml_int64_shift_left(bits$0(state), 60), + _q_ = caml_int64_xor(caml_int64_shift_left(bits$0(state), 30), _p_); + return caml_int64_xor(bits$0(state), _q_); + } + function bits$1(state){return bits(state);} + function full_range_int32(state){ + var _o_ = bits$1(state) << 30; + return bits$1(state) ^ _o_; + } + function full_range_int_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_int_on_32bits(state){return full_range_int32(state);} + var + full_range_int_on_64bits$0 = + Base_Word_size[3] ? full_range_int_on_64bits : full_range_int_on_32bits; + function full_range_nativeint_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_nativeint_on_32bits(state){return full_range_int32(state); + } + var + full_range_nativeint = + Base_Word_size[3] + ? full_range_nativeint_on_64bits + : full_range_nativeint_on_32bits; + function raise_crossed_bounds + (name, lower_bound, upper_bound, string_of_bound){ + var + _m_ = caml_call1(string_of_bound, upper_bound), + _n_ = caml_call1(string_of_bound, lower_bound); + return caml_call5(Base_Printf[6], _a_, name, _n_, _m_, 0); + } + function int_incl(state, lo, hi){ + if(hi < lo) raise_crossed_bounds(cst_int, lo, hi, Base_Int0[1]); + var diff = caml_call2(Base_Import[93], hi, lo); + if(diff === Base_Int0[5]){ + var + _i_ = Base_Int0[5], + _j_ = full_range_int_on_64bits$0(state), + _k_ = caml_call2(Base_Import[116], _j_, _i_); + return caml_call2(Base_Import[91], lo, _k_); + } + if(0 <= diff){ + var _l_ = int$1(state, caml_call1(Base_Int0[7], diff)); + return caml_call2(Base_Import[91], lo, _l_); + } + for(;;){ + var int$0 = full_range_int_on_64bits$0(state); + if(lo <= int$0 && int$0 <= hi) return int$0; + } + } + function int32_incl(state, lo, hi){ + if(caml_call2(Base_Import[102][5], lo, hi)) + raise_crossed_bounds(cst_int32, lo, hi, Stdlib_Int32[14]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[102][4], diff, Stdlib_Int32[9])){ + var _h_ = Stdlib_Int32[9]; + return lo + (full_range_int32(state) & _h_) | 0; + } + if(caml_call2(Base_Import[102][6], diff, 0)) + return lo + int32(state, caml_call1(Stdlib_Int32[6], diff)) | 0; + for(;;){ + var int$0 = full_range_int32(state); + if + (caml_call2(Base_Import[102][6], int$0, lo) + && caml_call2(Base_Import[102][2], int$0, hi)) + return int$0; + } + } + function nativeint_incl(state, lo, hi){ + if(caml_call2(Base_Import[104][5], lo, hi)) + raise_crossed_bounds(cst_nativeint, lo, hi, Stdlib_Nativeint[15]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[104][4], diff, Stdlib_Nativeint[10])){ + var _g_ = Stdlib_Nativeint[10]; + return lo + (full_range_nativeint(state) & _g_) | 0; + } + if(caml_call2(Base_Import[104][6], diff, 0)) + return lo + nativeint(state, caml_call1(Stdlib_Nativeint[6], diff)) | 0; + for(;;){ + var int$0 = full_range_nativeint(state); + if + (caml_call2(Base_Import[104][6], int$0, lo) + && caml_call2(Base_Import[104][2], int$0, hi)) + return int$0; + } + } + function int64_incl(state, lo, hi){ + if(runtime.caml_greaterthan(lo, hi)) + raise_crossed_bounds(cst_int64, lo, hi, Stdlib_Int64[14]); + var diff = runtime.caml_int64_sub(hi, lo); + if(runtime.caml_equal(diff, Stdlib_Int64[9])){ + var _f_ = Stdlib_Int64[9]; + return caml_int64_add + (lo, runtime.caml_int64_and(full_range_int64(state), _f_)); + } + if(caml_greaterequal(diff, _b_)) + return caml_int64_add + (lo, int64(state, caml_call1(Stdlib_Int64[6], diff))); + for(;;){ + var int$0 = full_range_int64(state); + if(caml_greaterequal(int$0, lo) && runtime.caml_lessequal(int$0, hi)) + return int$0; + } + } + function float$0(state, hi){ + for(;;){ + var + r1 = bits(state), + r2 = bits(state), + _d_ = caml_call2(Base_Import[90], r1, 9.313225746154785e-10), + _e_ = caml_call2(Base_Import[92], _d_, r2), + result = caml_call2(Base_Import[90], _e_, 9.313225746154785e-10); + if(caml_call2(Base_Import[108][1], result, 1.)) + return caml_call2(Base_Import[90], result, hi); + } + } + function float_range(state, lo, hi){ + if(caml_call2(Base_Import[108][5], lo, hi)) + raise_crossed_bounds(cst_float, lo, hi, Base_Import[85][34]); + var _c_ = float$0(state, caml_call2(Base_Import[94], hi, lo)); + return caml_call2(Base_Import[92], lo, _c_); + } + var default$1 = caml_call1(Base_Random_repr[3], default$0); + function bits$2(param){ + return bits(caml_call1(Base_Random_repr[4], default$1)); + } + function int$2(x){ + return int$1(caml_call1(Base_Random_repr[4], default$1), x); + } + function int32$0(x){ + return int32(caml_call1(Base_Random_repr[4], default$1), x); + } + function nativeint$0(x){ + return nativeint(caml_call1(Base_Random_repr[4], default$1), x); + } + function int64$0(x){ + return int64(caml_call1(Base_Random_repr[4], default$1), x); + } + function float$1(x){ + return float$0(caml_call1(Base_Random_repr[4], default$1), x); + } + function int_incl$0(x, y){ + return int_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int32_incl$0(x, y){ + return int32_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function nativeint_incl$0(x, y){ + return nativeint_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int64_incl$0(x, y){ + return int64_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function float_range$0(x, y){ + return float_range(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function bool$0(param){ + return bool(caml_call1(Base_Random_repr[4], default$1)); + } + function char$1(param){ + return char$0(caml_call1(Base_Random_repr[4], default$1)); + } + function ascii$0(param){ + return ascii(caml_call1(Base_Random_repr[4], default$1)); + } + function full_init(seed){ + var t = caml_call1(Base_Random_repr[4], default$1); + return caml_call2(assign, t, make(seed)); + } + function init(seed){return full_init([0, seed]);} + function self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + return full_init(runtime.caml_sys_random_seed(0)); + } + function set_state(s){ + return caml_call2(assign, caml_call1(Base_Random_repr[4], default$1), s); + } + var + Base_Random = + [0, + init, + full_init, + self_init, + bits$2, + int$2, + int32$0, + nativeint$0, + int64$0, + float$1, + int_incl$0, + int32_incl$0, + nativeint_incl$0, + int64_incl$0, + float_range$0, + bool$0, + char$1, + ascii$0, + [0, + default$0, + make, + make_self_init, + copy, + bits, + int$1, + int32, + nativeint, + int64, + float$0, + int_incl, + int32_incl, + nativeint_incl, + int64_incl, + float_range, + bool, + char$0, + ascii], + set_state]; + runtime.caml_register_global(24, Base_Random, "Base__Random"); + return; + } + (globalThis)); + +//# 5907 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + Base_Array0 = global_data.Base__Array0, + invalid_argf = Base_Array0[1], + Array = Base_Array0[2], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + blit = Base_Array0[7], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23]; + function permute(opt, _a_, len, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(_a_) var sth$0 = _a_[1], pos = sth$0; else var pos = 0; + var total_length = t.length - 1; + if(len) + var l = len[1], len$0 = l; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + caml_call3(Base_Ordered_collection_common[2], pos, len$0, total_length); + var num_swaps = caml_call2(Base_Import[93], len$0, 1); + if(num_swaps >= 1){ + var i = num_swaps; + for(;;){ + var + this_i = caml_call2(Base_Import[91], pos, i), + _b_ = caml_call2(Base_Import[91], i, 1), + _c_ = caml_call2(Base_Random[18][6], random_state, _b_), + random_i = caml_call2(Base_Import[91], pos, _c_); + caml_call3(swap, t, this_i, random_i); + var _d_ = i - 1 | 0; + if(1 !== i){var i = _d_; continue;} + break; + } + } + return 0; + } + var + Base_Array_permute = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap, + permute]; + runtime.caml_register_global(4, Base_Array_permute, "Base__Array_permute"); + return; + } + (globalThis)); + +//# 6023 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import; + function const$0(c, param){return c;} + function non(f, x){return 1 - caml_call1(f, x);} + function forever(f){ + try{for(;;) caml_call1(f, 0);} + catch(e$0){var e = caml_wrap_exception(e$0); return e;} + } + function compose(f, g, x){return caml_call1(f, caml_call1(g, x));} + function flip(f, x, y){return caml_call2(f, y, x);} + function apply_n_times(n, f, x){ + var n$0 = n, x$0 = x; + for(;;){ + if(0 >= n$0) return x$0; + var + x$1 = caml_call1(f, x$0), + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + x$0 = x$1; + } + } + var Base_Fn = [0, const$0, non, forever, apply_n_times, compose, flip]; + runtime.caml_register_global(1, Base_Fn, "Base__Fn"); + return; + } + (globalThis)); + +//# 6069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Equal = "Equal", + cst_Greater = "Greater", + cst_Less = "Less", + cst_equal = "equal", + cst_greater = "greater", + cst_less = "less", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, [0, 2, 0]]], + error_source_005 = "ordering.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Less, 0]], + [0, [1, [0, cst_Equal, 0]], [0, [1, [0, cst_Greater, 0]], 0]]]]], + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + compare = caml_int_compare, + _a_ = [0, cst_Less], + _b_ = [0, cst_Equal], + _c_ = [0, cst_Greater]; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function t_of_sexp(sexp_006){ + if(0 === sexp_006[0]){ + var _d_ = sexp_006[1], switch$0 = 0; + if(caml_string_notequal(_d_, cst_Equal)){ + var switch$1 = 0; + if(caml_string_notequal(_d_, cst_Greater)){ + var switch$2 = 0; + if(caml_string_notequal(_d_, cst_Less)){ + if(caml_string_notequal(_d_, cst_equal)) + if(caml_string_notequal(_d_, cst_greater)) + if(caml_string_notequal(_d_, cst_less)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 0; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 1; + } + else{ + var _e_ = sexp_006[1]; + if(! _e_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_006); + var _f_ = _e_[1]; + if(0 !== _f_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_006); + var _g_ = _f_[1], switch$3 = 0; + if(caml_string_notequal(_g_, cst_Equal)){ + var switch$4 = 0; + if(caml_string_notequal(_g_, cst_Greater)){ + var switch$5 = 0; + if(caml_string_notequal(_g_, cst_Less)){ + if(caml_string_notequal(_g_, cst_equal)) + if(caml_string_notequal(_g_, cst_greater)) + if(caml_string_notequal(_g_, cst_less)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_006); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + function equal(a, b){return 0 === caml_int_compare(a, b) ? 1 : 0;} + var Export = [0]; + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + var + Base_Ordering = + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + all, + equal, + of_int, + to_int, + Export]; + runtime.caml_register_global(20, Base_Ordering, "Base__Ordering"); + return; + } + (globalThis)); + +//# 6223 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + backend_type = Base_Sys0[1], + interactive = Base_Sys0[2], + os_type = Base_Sys0[3], + unix = Base_Sys0[4], + win32 = Base_Sys0[5], + cygwin = Base_Sys0[6], + word_size_in_bits = Base_Sys0[7], + int_size_in_bits = Base_Sys0[8], + big_endian = Base_Sys0[9], + max_string_length = Base_Sys0[10], + max_array_length = Base_Sys0[11], + runtime_variant = Base_Sys0[12], + runtime_parameters = Base_Sys0[13], + argv = Base_Sys0[14], + get_argv = Base_Sys0[15], + ocaml_version = Base_Sys0[16], + enable_runtime_warnings = Base_Sys0[17], + runtime_warnings_enabled = Base_Sys0[18], + getenv_exn = Base_Sys0[19], + getenv = Base_Sys0[20], + Base_Sys = + [0, + get_argv, + argv, + interactive, + os_type, + unix, + win32, + cygwin, + backend_type, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv, + getenv_exn]; + runtime.caml_register_global(1, Base_Sys, "Base__Sys"); + return; + } + (globalThis)); + +//# 6279 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = " <> ", + cst$0 = ": ", + cst_length_mismatch_in = "length mismatch in ", + cst_src_list_ml = "src/list.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_022 = "list.ml.Assoc.t", + Base_Import = global_data.Base__Import, + Base_Container = global_data.Base__Container, + Assert_failure = global_data.Assert_failure, + Base_Random = global_data.Base__Random, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Result = global_data.Base__Result, + Base_Ordering = global_data.Base__Ordering, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_List1 = global_data.Base__List1, + Base_Printf = global_data.Base__Printf, + Base_Sys = global_data.Base__Sys, + Base_Applicative = global_data.Base__Applicative, + Base_Monad = global_data.Base__Monad, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + hd_exn = Base_List1[1], + length = Base_List1[2], + rev_append = Base_List1[3], + tl_exn = Base_List1[4], + exists = Base_List1[6], + exists2_ok = Base_List1[7], + fold_left = Base_List1[8], + fold2_ok = Base_List1[9], + for_all = Base_List1[10], + for_all2_ok = Base_List1[11], + iter = Base_List1[12], + iter2_ok = Base_List1[13], + nontail_map = Base_List1[14], + rev_map = Base_List1[17], + rev_map2_ok = Base_List1[18], + sort = Base_List1[19], + stable_sort = Base_List1[20], + rev = Base_List1[21], + fold_right = Base_List1[22], + is_empty = Base_List1[23], + partition_map = Base_List1[24], + invalid_argf = Base_Printf[7], + t_of_sexp = Base_Import[176], + sexp_of_t = Base_Import[152], + cst_List_last = "List.last", + _s_ = [0, "list.ml.Transpose_got_lists_of_different_lengths"], + _t_ = [0, cst_src_list_ml, 1301, 13], + cst_List_random_element_exn_em = "List.random_element_exn: empty list", + cst_List_drop_last_exn_empty_l = "List.drop_last_exn: empty list", + _q_ = + [0, + [11, "List.chunks_of: Expected length > 0, got ", [4, 0, 0, 0, 0]], + "List.chunks_of: Expected length > 0, got %d"], + cst_List_sub = "List.sub", + _o_ = [0, cst_src_list_ml, 1045, 12], + _n_ = [0, cst_src_list_ml, 933, 4], + _m_ = [0, [11, "List.init ", [4, 0, 0, 0, 0]], "List.init %d"], + cst_List_reduce_balanced_exn = "List.reduce_balanced_exn", + _l_ = [0, cst_src_list_ml, 661, 14], + cst_List_reduce_exn = "List.reduce_exn", + _k_ = + [0, + [11, + "length mismatch in zip_exn: ", + [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]], + "length mismatch in zip_exn: %d <> %d"], + cst_map3_exn = "map3_exn", + cst_rev_map3_exn = "rev_map3_exn", + _j_ = [0, cst_src_list_ml, 528, 11], + cst_map2_exn = "map2_exn", + cst_exists2_exn = "exists2_exn", + cst_for_all2_exn = "for_all2_exn", + cst_fold2_exn = "fold2_exn", + cst_rev_map2_exn = "rev_map2_exn", + cst_iter2_exn = "iter2_exn", + _e_ = + [0, + [11, + cst_length_mismatch_in, + [2, + 0, + [11, + cst$0, + [4, + 0, + 0, + 0, + [11, + cst, + [4, + 0, + 0, + 0, + [11, " || ", [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]]]]]], + "length mismatch in %s: %d <> %d || %d <> %d"], + _d_ = + [0, + [11, + cst_length_mismatch_in, + [2, 0, [11, cst$0, [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _c_ = + [0, + [11, + "List.nth_exn ", + [4, 0, 0, 0, [11, " called on list of length ", [4, 0, 0, 0, 0]]]], + "List.nth_exn %d called on list of length %d"], + cst_List_range_stride_must_be_ = "List.range: stride must be non-zero", + cst_List_range_stride_function$0 = + "List.range': stride function cannot change direction", + cst_List_range_stride_function = + "List.range': stride function cannot return the same value", + _a_ = [0, "Ok"], + _b_ = [0, "Unequal_lengths"], + _f_ = [0, "List.find_map_exn: not found"], + _g_ = [0, "List.find_exn: not found"], + _h_ = [0, "List.findi_exn: not found"], + _i_ = [0, "List.find_mapi_exn: not found"], + _p_ = [0, "List.Assoc.find_exn: not found"], + cst_Base_List_Transpose_got_li = + "Base__List.Transpose_got_lists_of_different_lengths"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[195], a_sexp_grammar); + } + function compare(cmp_a, a_006, b_007){ + if(caml_call2(Base_Ppx_compare_lib[1], a_006, b_007)) return 0; + if(! a_006) return b_007 ? 1 : 0; + var a_008 = a_006[1]; + if(! b_007) return -1; + var b_009 = b_007[1]; + return caml_call2(cmp_a, a_008, b_009); + } + function sexp_of_t$0(of_a_010, param){ + if(! param) return _b_; + var arg0_011 = param[1], res0_012 = caml_call1(of_a_010, arg0_011); + return [1, [0, _a_, [0, res0_012, 0]]]; + } + var Or_unequal_lengths = [0, compare, sexp_of_t$0]; + function invariant(f, t){return caml_call2(iter, t, f);} + function of_list(t){return t;} + function range(compare, stride, opt, _a0_, start_i, stop_i){ + if(opt) var sth = opt[1], start = sth; else var start = 104758188; + if(_a0_) var sth$0 = _a0_[1], stop = sth$0; else var stop = -160346914; + var next_i = caml_call1(stride, start_i); + function order(x, y){ + var _a2_ = caml_call2(compare, x, y); + return caml_call1(Base_Ordering[9], _a2_); + } + function raise_stride_cannot_return_sam(param){ + return caml_call1(Base_Import[126], cst_List_range_stride_function); + } + switch(order(start_i, next_i)){ + case 0: + var initial_stride_order = 847855481; break; + case 1: + var initial_stride_order = raise_stride_cannot_return_sam(0); break; + default: var initial_stride_order = 85047514; + } + var + start_i$0 = 104758188 <= start ? start_i : next_i, + i = start_i$0, + accum = 0; + for(;;){ + var i_to_stop_order = order(i, stop_i), switch$0 = 0; + switch(i_to_stop_order){ + case 0: + switch$0 = 847855481 <= initial_stride_order ? 1 : 2; break; + case 1: + var _a1_ = 104758188 <= stop ? [0, i, accum] : accum; break; + default: switch$0 = 847855481 <= initial_stride_order ? 2 : 1; + } + switch(switch$0){ + case 1: + var next_i$0 = caml_call1(stride, i), switch$1 = 0; + switch(order(i, next_i$0)){ + case 0: + switch$1 = 847855481 <= initial_stride_order ? 2 : 1; break; + case 1: + var _a1_ = raise_stride_cannot_return_sam(0); break; + default: switch$1 = 847855481 <= initial_stride_order ? 1 : 2; + } + switch(switch$1){ + case 1: + var + _a1_ = + caml_call1(Base_Import[126], cst_List_range_stride_function$0); + break; + case 2: + var accum$0 = [0, i, accum], i = next_i$0, accum = accum$0; + continue; + } + break; + case 2: + var _a1_ = accum; break; + } + return caml_call1(rev, _a1_); + } + } + function range$0(opt, _aX_, _aW_, start_i, stop_i){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_aX_) var sth$0 = _aX_[1], start = sth$0; else var start = 104758188; + if(_aW_) var sth$1 = _aW_[1], stop = sth$1; else var stop = -160346914; + if(0 === stride) + caml_call1(Base_Import[126], cst_List_range_stride_must_be_); + var _aY_ = [0, stop], _aZ_ = [0, start]; + return range + (runtime.caml_int_compare, + function(x){return caml_call2(Base_Import[91], x, stride);}, + _aZ_, + _aY_, + start_i, + stop_i); + } + function hd(t){if(! t) return 0; var x = t[1]; return [0, x];} + function tl(t){if(! t) return 0; var t$0 = t[2]; return [0, t$0];} + function nth(t, n){ + if(0 > n) return 0; + var t$0 = t, n$0 = n; + for(;;){ + if(! t$0) return 0; + var t$1 = t$0[2], a = t$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = t$1, n$0 = n$1; + } + } + function nth_exn(t, n){ + var match = nth(t, n); + if(! match) + return caml_call4(invalid_argf, _c_, n, caml_call1(length, t), 0); + var a = match[1]; + return a; + } + function unordered_append(l1, l2){ + if(l1){ + if(l2) return caml_call2(rev_append, l1, l2); + var l = l1; + } + else + var l = l2; + return l; + } + function of_lists(l1, l2){ + var a = l1, b = l2, shared_length = 0; + for(;;){ + if(a){ + if(b){ + var + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b) return [0, shared_length]; + return [1, shared_length, a, b]; + } + } + function check_length2_exn(name, l1, l2){ + var match = of_lists(l1, l2); + if(0 === match[0]) return 0; + var + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aT_ = caml_call1(length, tail_of_b), + _aU_ = caml_call2(Base_Import[91], shared_length, _aT_), + _aV_ = caml_call1(length, tail_of_a); + return caml_call5 + (invalid_argf, + _d_, + name, + caml_call2(Base_Import[91], shared_length, _aV_), + _aU_, + 0); + } + function check_length2(l1, l2, f){ + return 0 === of_lists(l1, l2)[0] ? [0, caml_call2(f, l1, l2)] : 0; + } + function of_lists$0(l1, l2, l3){ + var a = l1, b = l2, c = l3, shared_length = 0; + for(;;){ + if(a){ + if(b && c){ + var + c$0 = c[2], + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + c = c$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b && ! c) return [0, shared_length]; + return [1, shared_length, a, b, c]; + } + } + function check_length3_exn(name, l1, l2, l3){ + var match = of_lists$0(l1, l2, l3); + if(0 === match[0]) return 0; + var + tail_of_c = match[4], + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aQ_ = caml_call1(length, tail_of_a), + n1 = caml_call2(Base_Import[91], shared_length, _aQ_), + _aR_ = caml_call1(length, tail_of_b), + n2 = caml_call2(Base_Import[91], shared_length, _aR_), + _aS_ = caml_call1(length, tail_of_c), + n3 = caml_call2(Base_Import[91], shared_length, _aS_); + return caml_call7(invalid_argf, _e_, name, n1, n2, n2, n3, 0); + } + function check_length3(l1, l2, l3, f){ + return 0 === of_lists$0(l1, l2, l3)[0] + ? [0, caml_call3(f, l1, l2, l3)] + : 0; + } + function iter2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aN_){ + var _aO_ = caml_call1(iter2_ok, _aN_); + return function(_aP_){return caml_call2(_aO_, _aP_, f);}; + }); + } + function iter2_exn(l1, l2, f){ + check_length2_exn(cst_iter2_exn, l1, l2); + return caml_call3(iter2_ok, l1, l2, f); + } + function rev_map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aK_){ + var _aL_ = caml_call1(rev_map2_ok, _aK_); + return function(_aM_){return caml_call2(_aL_, _aM_, f);}; + }); + } + function rev_map2_exn(l1, l2, f){ + check_length2_exn(cst_rev_map2_exn, l1, l2); + return caml_call3(rev_map2_ok, l1, l2, f); + } + function fold2(l1, l2, init, f){ + return check_length2 + (l1, + l2, + function(_aH_){ + var _aI_ = caml_call1(fold2_ok, _aH_); + return function(_aJ_){return caml_call3(_aI_, _aJ_, init, f);}; + }); + } + function fold2_exn(l1, l2, init, f){ + check_length2_exn(cst_fold2_exn, l1, l2); + return caml_call4(fold2_ok, l1, l2, init, f); + } + function for_all2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aE_){ + var _aF_ = caml_call1(for_all2_ok, _aE_); + return function(_aG_){return caml_call2(_aF_, _aG_, f);}; + }); + } + function for_all2_exn(l1, l2, f){ + check_length2_exn(cst_for_all2_exn, l1, l2); + return caml_call3(for_all2_ok, l1, l2, f); + } + function exists2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aB_){ + var _aC_ = caml_call1(exists2_ok, _aB_); + return function(_aD_){return caml_call2(_aC_, _aD_, f);}; + }); + } + function exists2_exn(l1, l2, f){ + check_length2_exn(cst_exists2_exn, l1, l2); + return caml_call3(exists2_ok, l1, l2, f); + } + function mem(t, a, equal){ + var param = t; + for(;;){ + if(! param) return 0; + var bs = param[2], b = param[1], _aA_ = caml_call2(equal, a, b); + if(_aA_) return _aA_; + var param = bs; + } + } + function rev_filter(t, f){ + var accu = 0, param = t; + for(;;){ + if(! param) return accu; + var l = param[2], x = param[1]; + if(caml_call1(f, x)){ + var accu$0 = [0, x, accu], accu = accu$0, param = l; + continue; + } + var param = l; + } + } + function filter(t, f){return caml_call1(rev, rev_filter(t, f));} + function find_map(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1], r = caml_call1(f, x); + if(r) return r; + var param = l; + } + } + var not_found = [0, Base_Import[252], _f_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1]; + if(caml_call1(f, x)) return [0, x]; + var param = l; + } + } + var not_found$0 = [0, Base_Import[252], _g_]; + function find_exn(t, f){ + var t$0 = t; + for(;;){ + if(! t$0) throw caml_maybe_attach_backtrace(not_found$0, 1); + var t$1 = t$0[2], x = t$0[1]; + if(caml_call1(f, x)) return x; + var t$0 = t$1; + } + } + function findi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1]; + if(caml_call2(f, i, x)) return [0, [0, i, x]]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$1 = [0, Base_Import[252], _h_]; + function findi_exn(t, f){ + var match = findi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$1, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1], result = caml_call2(f, i, x); + if(result) return result; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$2 = [0, Base_Import[252], _i_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$2, 1); + var x = match[1]; + return x; + } + function for_alli(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 1; + var tl = t$0[2], hd = t$0[1], _az_ = caml_call2(f, i, hd); + if(! _az_) return _az_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + function existsi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var tl = t$0[2], hd = t$0[1], _ay_ = caml_call2(f, i, hd); + if(_ay_) return _ay_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + var to_array = Base_Array0[13]; + function to_list(t){return t;} + var max_non_tailcall = typeof Base_Sys[8] === "number" ? 1000 : 50; + function count_append(l1, l2, count){ + if(! l2) return l1; + if(! l1) return l2; + var _au_ = l1[2], x1 = l1[1]; + if(! _au_) return [0, x1, l2]; + var _av_ = _au_[2], x2 = _au_[1]; + if(! _av_) return [0, x1, [0, x2, l2]]; + var _aw_ = _av_[2], x3 = _av_[1]; + if(! _aw_) return [0, x1, [0, x2, [0, x3, l2]]]; + var match = _aw_[2], x4 = _aw_[1]; + if(! match) return [0, x1, [0, x2, [0, x3, [0, x4, l2]]]]; + var + tl = match[2], + x5 = match[1], + _ax_ = + max_non_tailcall < count + ? caml_call2(rev_append, caml_call1(rev, tl), l2) + : count_append(tl, l2, caml_call2(Base_Import[91], count, 1)); + return [0, x1, [0, x2, [0, x3, [0, x4, [0, x5, _ax_]]]]]; + } + function append(l1, l2){return count_append(l1, l2, 0);} + function count_map(f, l, ctr){ + if(! l) return 0; + var _aq_ = l[2], x1$0 = l[1]; + if(! _aq_){var f1$3 = caml_call1(f, x1$0); return [0, f1$3, 0];} + var _ar_ = _aq_[2], x2$0 = _aq_[1]; + if(! _ar_){ + var f1$2 = caml_call1(f, x1$0), f2$2 = caml_call1(f, x2$0); + return [0, f1$2, [0, f2$2, 0]]; + } + var _as_ = _ar_[2], x3$0 = _ar_[1]; + if(! _as_){ + var + f1$1 = caml_call1(f, x1$0), + f2$1 = caml_call1(f, x2$0), + f3$1 = caml_call1(f, x3$0); + return [0, f1$1, [0, f2$1, [0, f3$1, 0]]]; + } + var match$1 = _as_[2], x4$0 = _as_[1]; + if(! match$1){ + var + f1$0 = caml_call1(f, x1$0), + f2$0 = caml_call1(f, x2$0), + f3$0 = caml_call1(f, x3$0), + f4$0 = caml_call1(f, x4$0); + return [0, f1$0, [0, f2$0, [0, f3$0, [0, f4$0, 0]]]]; + } + var + tl = match$1[2], + x5$0 = match$1[1], + f1 = caml_call1(f, x1$0), + f2 = caml_call1(f, x2$0), + f3 = caml_call1(f, x3$0), + f4 = caml_call1(f, x4$0), + f5 = caml_call1(f, x5$0); + if(max_non_tailcall < ctr){ + var bs$0 = 0, xs = tl; + for(;;){ + if(xs){ + var _aj_ = xs[2]; + if(_aj_){ + var _ak_ = _aj_[2]; + if(_ak_){ + var _al_ = _ak_[2]; + if(_al_){ + var _am_ = _al_[2]; + if(_am_){ + var _an_ = _am_[2]; + if(_an_){ + var _ao_ = _an_[2]; + if(_ao_){ + var _ap_ = _ao_[2]; + if(_ap_){ + var match$0 = _ap_[2]; + if(match$0){ + var + xs$0 = match$0[2], + x8 = match$0[1], + x7 = _ap_[1], + x6 = _ao_[1], + x5 = _an_[1], + x4 = _am_[1], + x3 = _al_[1], + x2 = _ak_[1], + x1 = _aj_[1], + x0 = xs[1], + y0$0 = caml_call1(f, x0), + y1$0 = caml_call1(f, x1), + y2$0 = caml_call1(f, x2), + y3$0 = caml_call1(f, x3), + y4$0 = caml_call1(f, x4), + y5$0 = caml_call1(f, x5), + y6$0 = caml_call1(f, x6), + y7$0 = caml_call1(f, x7), + y8$0 = caml_call1(f, x8), + bs$1 = + [0, + [0, y0$0, y1$0, y2$0, y3$0, y4$0, y5$0, y6$0, y7$0, y8$0], + bs$0], + bs$0 = bs$1, + xs = xs$0; + continue; + } + } + } + } + } + } + } + } + } + var ys$1 = caml_call2(nontail_map, xs, f), ys = ys$1, param = bs$0; + for(;;){ + if(param){ + var + bs = param[2], + match = param[1], + y8 = match[9], + y7 = match[8], + y6 = match[7], + y5 = match[6], + y4 = match[5], + y3 = match[4], + y2 = match[3], + y1 = match[2], + y0 = match[1], + ys$0 = + [0, + y0, + [0, + y1, + [0, y2, [0, y3, [0, y4, [0, y5, [0, y6, [0, y7, [0, y8, ys]]]]]]]]], + ys = ys$0, + param = bs; + continue; + } + var _at_ = ys; + break; + } + break; + } + } + else + var _at_ = count_map(f, tl, caml_call2(Base_Import[91], ctr, 1)); + return [0, f1, [0, f2, [0, f3, [0, f4, [0, f5, _at_]]]]]; + } + function map(l, f){return count_map(f, l, 0);} + function folding_map(t, init, f){ + var acc = [0, init]; + return map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function symbol_map(l, f){return map(l, f);} + function map2_ok(l1, l2, f){ + return caml_call1(rev, caml_call3(rev_map2_ok, l1, l2, f)); + } + function map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_ah_){ + return function(_ai_){return map2_ok(_ah_, _ai_, f);}; + }); + } + function map2_exn(l1, l2, f){ + check_length2_exn(cst_map2_exn, l1, l2); + return map2_ok(l1, l2, f); + } + function rev_map3_ok(l1, l2, l3, f){ + var l1$0 = l1, l2$0 = l2, l3$0 = l3, ac = 0; + for(;;){ + if(l1$0){ + if(l2$0 && l3$0){ + var + l3$1 = l3$0[2], + x3 = l3$0[1], + l2$1 = l2$0[2], + x2 = l2$0[1], + l1$1 = l1$0[2], + x1 = l1$0[1], + ac$0 = [0, caml_call3(f, x1, x2, x3), ac], + l1$0 = l1$1, + l2$0 = l2$1, + l3$0 = l3$1, + ac = ac$0; + continue; + } + } + else if(! l2$0 && ! l3$0) return ac; + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function rev_map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ae_){ + return function(_af_){ + return function(_ag_){ + return rev_map3_ok(_ae_, _af_, _ag_, f);};}; + }); + } + function rev_map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_rev_map3_exn, l1, l2, l3); + return rev_map3_ok(l1, l2, l3, f); + } + function map3_ok(l1, l2, l3, f){ + return caml_call1(rev, rev_map3_ok(l1, l2, l3, f)); + } + function map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ab_){ + return function(_ac_){ + return function(_ad_){return map3_ok(_ab_, _ac_, _ad_, f);};}; + }); + } + function map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_map3_exn, l1, l2, l3); + return map3_ok(l1, l2, l3, f); + } + function rev_map_append(l1, l2, f){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + h = l1$0[1], + l2$1 = [0, caml_call1(f, h), l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function unzip(list){ + var list$2 = caml_call1(rev, list), list$0 = list$2, l1 = 0, l2 = 0; + for(;;){ + if(! list$0) return [0, l1, l2]; + var + list$1 = list$0[2], + match = list$0[1], + y = match[2], + x = match[1], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0; + } + } + function unzip3(list){ + var + list$2 = caml_call1(rev, list), + list$0 = list$2, + l1 = 0, + l2 = 0, + l3 = 0; + for(;;){ + if(! list$0) return [0, l1, l2, l3]; + var + list$1 = list$0[2], + match = list$0[1], + z = match[3], + y = match[2], + x = match[1], + l3$0 = [0, z, l3], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0, + l3 = l3$0; + } + } + function zip_exn(l1, l2){ + try{ + var _$_ = map2_ok(l1, l2, function(a, b){return [0, a, b];}); + return _$_; + } + catch(_aa_){ + var ___ = caml_call1(length, l2); + return caml_call4(invalid_argf, _k_, caml_call1(length, l1), ___, 0); + } + } + function zip(l1, l2){ + return map2(l1, l2, function(a, b){return [0, a, b];}); + } + function rev_mapi(l, f){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return acc; + var + t = param[2], + h = param[1], + acc$0 = [0, caml_call2(f, i, h), acc], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + acc = acc$0, + param = t; + } + } + function mapi(l, f){return caml_call1(rev, rev_mapi(l, f));} + function folding_mapi(t, init, f){ + var acc = [0, init]; + return mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function iteri(l, f){ + caml_call3 + (fold_left, + l, + 0, + function(i, x){ + caml_call2(f, i, x); + return caml_call2(Base_Import[91], i, 1); + }); + return 0; + } + function foldi(t, init, f){ + var + _Y_ = + caml_call3 + (fold_left, + t, + [0, 0, init], + function(param, v){ + var acc = param[2], i = param[1], _Z_ = caml_call3(f, i, acc, v); + return [0, caml_call2(Base_Import[91], i, 1), _Z_]; + }); + return caml_call1(Base_Import[127], _Y_); + } + function filteri(l, f){ + return caml_call1 + (rev, + foldi + (l, + 0, + function(pos, acc, x){ + return caml_call2(f, pos, x) ? [0, x, acc] : acc; + })); + } + function reduce(l, f){ + if(! l) return 0; + var tl = l[2], hd = l[1]; + return [0, caml_call3(fold_left, tl, hd, f)]; + } + function reduce_exn(l, f){ + var match = reduce(l, f); + if(! match) return caml_call1(Base_Import[126], cst_List_reduce_exn); + var v = match[1]; + return v; + } + function reduce_balanced(l, f){ + function step_accum(num, acc, x){ + var num$0 = num, acc$0 = acc, x$0 = x; + for(;;){ + if(0 === caml_call2(Base_Import[116], num$0, 1)) return [0, x$0, acc$0]; + if(! acc$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + acc$1 = acc$0[2], + y = acc$0[1], + x$1 = caml_call2(f, y, x$0), + num$1 = caml_call2(Base_Import[115], num$0, 1), + num$0 = num$1, + acc$0 = acc$1, + x$0 = x$1; + } + } + var match = foldi(l, 0, step_accum); + if(! match) return 0; + var xs = match[2], x = match[1]; + return [0, + caml_call3 + (fold_left, xs, x, function(x, y){return caml_call2(f, y, x);})]; + } + function reduce_balanced_exn(l, f){ + var match = reduce_balanced(l, f); + if(! match) + return caml_call1(Base_Import[126], cst_List_reduce_balanced_exn); + var v = match[1]; + return v; + } + function groupi(l, break$0){ + var + groups = + foldi + (l, + 0, + function(i, acc, x){ + if(! acc) return [0, [0, x, 0], 0]; + var tl = acc[2], current_group = acc[1]; + return caml_call3(break$0, i, caml_call1(hd_exn, current_group), x) + ? [0, [0, x, 0], [0, current_group, tl]] + : [0, [0, x, current_group], tl]; + }); + return groups ? caml_call2(rev_map, groups, rev) : 0; + } + function group(l, break$0){ + return groupi(l, function(param, x, y){return caml_call2(break$0, x, y);}); + } + function sort_and_group(l, compare){ + var _X_ = caml_call2(stable_sort, l, compare); + return group + (_X_, + function(x, y){return 0 !== caml_call2(compare, x, y) ? 1 : 0;}); + } + function concat_map(l, f){ + var acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call1(f, hd), acc), + acc = acc$0, + param = tl; + } + } + function concat_mapi(l, f){ + var cont = 0, acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call2(f, cont, hd), acc), + cont$0 = caml_call2(Base_Import[91], cont, 1), + cont = cont$0, + acc = acc$0, + param = tl; + } + } + function merge(l1, l2, compare){ + var acc = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return caml_call2(rev_append, acc, l2$0); + if(! l2$0) return caml_call2(rev_append, acc, l1$0); + var t2 = l2$0[2], h2 = l2$0[1], t1 = l1$0[2], h1 = l1$0[1]; + if(0 < caml_call2(compare, h1, h2)){ + var acc$0 = [0, h2, acc], acc = acc$0, l2$0 = t2; + continue; + } + var acc$1 = [0, h1, acc], acc = acc$1, l1$0 = t1; + } + } + function map2$0(a, b, f){ + return concat_map + (a, + function(x){ + return map(b, function(y){return caml_call2(f, x, y);}); + }); + } + function return$0(x){return [0, x, 0];} + function symbol_bind(t, f){return concat_map(t, f);} + var + map$0 = [0, -198771759, map], + Applicative = + caml_call1(Base_Applicative[11], [0, return$0, map2$0, map$0]), + map$1 = [0, -198771759, map], + Monad = caml_call1(Base_Monad[1], [0, concat_map, return$0, map$1]), + all = Monad[9], + all_unit = Monad[10], + ignore_m = Monad[8], + join = Monad[7], + apply = Applicative[8], + both = Applicative[3], + map3$0 = Applicative[10], + symbol = Applicative[4], + symbol$0 = Applicative[6], + symbol$1 = Applicative[5], + symbol$2 = Applicative[4], + symbol$3 = Applicative[6], + symbol$4 = Applicative[5], + Open_on_rhs = [0], + Let_syntax = [0, return$0, concat_map, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind, symbol_map, Let_syntax], + Monad_infix = [0, symbol_bind, symbol_map]; + function last_exn(list){ + var list$0 = list; + for(;;){ + if(! list$0) return caml_call1(Base_Import[126], cst_List_last); + var x = list$0[1]; + if(! list$0[2]) return x; + var list$1 = list$0[2], list$0 = list$1; + } + } + function last(list){ + var list$0 = list; + for(;;){ + if(! list$0) return 0; + var x = list$0[1]; + if(! list$0[2]) return [0, x]; + var list$1 = list$0[2], list$0 = list$1; + } + } + function is_prefix(list, prefix, equal){ + var list$0 = list, prefix$0 = prefix; + for(;;){ + if(! prefix$0) return 1; + var prefix$1 = prefix$0[2], hd = prefix$0[1]; + if(! list$0) return 0; + var + list$1 = list$0[2], + hd$0 = list$0[1], + _W_ = caml_call2(equal, hd, hd$0); + if(! _W_) return _W_; + var list$0 = list$1, prefix$0 = prefix$1; + } + } + function find_consecutive_duplicate(t, equal){ + if(! t) return 0; + var t$0 = t[2], a1 = t[1], a1$0 = a1, t$1 = t$0; + for(;;){ + if(! t$1) return 0; + var t$2 = t$1[2], a2 = t$1[1]; + if(caml_call2(equal, a1$0, a2)) return [0, [0, a1$0, a2]]; + var a1$0 = a2, t$1 = t$2; + } + } + function remove_consecutive_duplicates(opt, list, equal){ + if(opt) + var sth = opt[1], which_to_keep = sth; + else + var which_to_keep = 847656566; + if(! list) return 0; + var + tl$0 = list[2], + to_keep$2 = list[1], + to_keep = to_keep$2, + accum = 0, + param = tl$0; + for(;;){ + if(! param) return caml_call1(rev, [0, to_keep, accum]); + var tl = param[2], to_keep$0 = param[1]; + if(caml_call2(equal, to_keep$0, to_keep)){ + var + to_keep$1 = 847656566 <= which_to_keep ? to_keep$0 : to_keep, + to_keep = to_keep$1, + param = tl; + continue; + } + var + accum$0 = [0, to_keep, accum], + to_keep = to_keep$0, + accum = accum$0, + param = tl; + } + } + function dedup_and_sort(list, compare){ + if(list && list[2]){ + var + equal = + function(x$0, x){return 0 === caml_call2(compare, x$0, x) ? 1 : 0;}, + sorted = caml_call2(sort, list, compare); + return remove_consecutive_duplicates(0, sorted, equal); + } + return list; + } + function find_a_dup(l, compare){ + var sorted = caml_call2(sort, l, compare), l$0 = sorted; + for(;;){ + if(l$0){ + var tl = l$0[2]; + if(tl){ + var hd2 = tl[1], hd1 = l$0[1]; + if(0 === caml_call2(compare, hd1, hd2)) return [0, hd1]; + var l$0 = tl; + continue; + } + } + return 0; + } + } + function contains_dup(lst, compare){ + return find_a_dup(lst, compare) ? 1 : 0; + } + function find_all_dups(l, compare){ + function compare$0(a, b){ + var _V_ = caml_call2(compare, a, b); + return caml_call2(Base_Import[88], -1, _V_); + } + var sorted = caml_call2(sort, l, compare$0); + if(! sorted) return 0; + var + sorted$2 = sorted[2], + prev$1 = sorted[1], + sorted$0 = sorted$2, + prev = prev$1, + already_recorded = 0, + acc = 0; + for(;;){ + if(! sorted$0) return acc; + var sorted$1 = sorted$0[2], prev$0 = sorted$0[1]; + if(0 !== compare$0(prev, prev$0)){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 0; + continue; + } + if(already_recorded){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 1; + continue; + } + var + acc$0 = [0, prev$0, acc], + sorted$0 = sorted$1, + prev = prev$0, + already_recorded = 1, + acc = acc$0; + } + } + function all_equal(t$0, equal){ + if(! t$0) return 0; + var xs$0 = t$0[2], x$0 = t$0[1], t = xs$0; + for(;;){ + if(t){ + var xs = t[2], x = t[1], _T_ = caml_call2(equal, x, x$0); + if(_T_){var t = xs; continue;} + var _U_ = _T_; + } + else + var _U_ = 1; + return _U_ ? [0, x$0] : 0; + } + } + function count(t, f){ + return caml_call3(Base_Container[2], fold_left, t, f); + } + function sum(m, t, f){ + return caml_call4(Base_Container[7], fold_left, m, t, f); + } + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold_left, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold_left, t, compare); + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _m_, n, 0); + var i = n, accum = 0; + for(;;){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + if(0 === i) return accum; + var + accum$0 = [0, caml_call1(f, caml_call2(Base_Import[93], i, 1)), accum], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + accum = accum$0; + } + } + function rev_filter_map(l, f){ + var l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call1(f, hd); + if(match){ + var x = match[1], accum$0 = [0, x, accum], l$0 = tl, accum = accum$0; + continue; + } + var l$0 = tl; + } + } + function filter_map(l, f){return caml_call1(rev, rev_filter_map(l, f));} + function rev_filter_mapi(l, f){ + var i = 0, l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call2(f, i, hd); + if(match){ + var + x = match[1], + accum$0 = [0, x, accum], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + l$0 = tl, + accum = accum$0; + continue; + } + var i$1 = caml_call2(Base_Import[91], i, 1), i = i$1, l$0 = tl; + } + } + function filter_mapi(l, f){return caml_call1(rev, rev_filter_mapi(l, f));} + function filter_opt(l){return filter_map(l, function(_S_){return _S_;});} + function partition3_map(t, f){ + var t$0 = t, fst = 0, snd = 0, trd = 0; + for(;;){ + if(! t$0){ + var _Q_ = caml_call1(rev, trd), _R_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _R_, _Q_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x), _P_ = match[1]; + if(4152137 === _P_){ + var y = match[2], snd$0 = [0, y, snd], t$0 = t$1, snd = snd$0; + continue; + } + if(4202758 <= _P_){ + var y$0 = match[2], trd$0 = [0, y$0, trd], t$0 = t$1, trd = trd$0; + continue; + } + var y$1 = match[2], fst$0 = [0, y$1, fst], t$0 = t$1, fst = fst$0; + } + } + function partition_tf(t, f){ + function f$0(x){return caml_call1(f, x) ? [0, x] : [1, x];} + return caml_call2(partition_map, t, f$0); + } + function partition_result(t){ + return caml_call2(partition_map, t, Base_Result[35]); + } + function t_of_sexp$0(of_a_014, of_b_015, x_023){ + function _M_(sexp_021){ + if(1 === sexp_021[0]){ + var _N_ = sexp_021[1]; + if(_N_){ + var _O_ = _N_[2]; + if(_O_ && ! _O_[2]){ + var + arg1_018 = _O_[1], + arg0_017 = _N_[1], + res0_019 = caml_call1(of_a_014, arg0_017), + res1_020 = caml_call1(of_b_015, arg1_018); + return [0, res0_019, res1_020]; + } + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[2], error_source_022, 2, sexp_021); + } + return caml_call2(Base_Import[176], _M_, x_023); + } + function sexp_of_t$1(of_a_024, of_b_025, x_030){ + function _L_(param){ + var + arg1_027 = param[2], + arg0_026 = param[1], + res0_028 = caml_call1(of_a_024, arg0_026), + res1_029 = caml_call1(of_b_025, arg1_027); + return [1, [0, res0_028, [0, res1_029, 0]]]; + } + return caml_call2(Base_Import[152], _L_, x_030); + } + function t_sexp_grammar$0(a_sexp_grammar, b_sexp_grammar){ + return caml_call1 + (Base_Import[195], + [2, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]); + } + function pair_of_group(list){ + if(! list) throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + var k = list[1][1]; + return [0, k, map(list, Base_Import[127])]; + } + function group$0(alist, equal){ + return map + (group + (alist, + function(param, _K_){ + var y = _K_[1], x = param[1]; + return 1 - caml_call2(equal, x, y); + }), + pair_of_group); + } + function sort_and_group$0(alist, compare){ + return map + (sort_and_group + (alist, + function(param, _J_){ + var y = _J_[1], x = param[1]; + return caml_call2(compare, x, y); + }), + pair_of_group); + } + function find$0(t, equal, key){ + var + match = + find + (t, + function(param){ + var key$0 = param[1]; + return caml_call2(equal, key, key$0); + }); + if(! match) return 0; + var x = match[1]; + return [0, caml_call1(Base_Import[127], x)]; + } + var not_found$3 = [0, Base_Import[252], _p_]; + function find_exn$0(t, equal, key){ + var match = find$0(t, equal, key); + if(! match) throw caml_maybe_attach_backtrace(not_found$3, 1); + var value = match[1]; + return value; + } + function mem$0(t, equal, key){return find$0(t, equal, key) ? 1 : 0;} + function remove(t, equal, key){ + return filter + (t, + function(param){ + var key$0 = param[1]; + return 1 - caml_call2(equal, key, key$0); + }); + } + function add(t, equal, key, value){ + return [0, [0, key, value], remove(t, equal, key)]; + } + function inverse(t){ + return map + (t, + function(param){ + var y = param[2], x = param[1]; + return [0, y, x]; + }); + } + function map$2(t, f){ + return map + (t, + function(param){ + var value = param[2], key = param[1]; + return [0, key, caml_call1(f, value)]; + }); + } + function sub(l, pos, len){ + var _F_ = pos < 0 ? 1 : 0; + if(_F_) + var _G_ = _F_; + else{ + var _H_ = len < 0 ? 1 : 0; + if(_H_) + var _G_ = _H_; + else + var + _I_ = caml_call1(length, l), + _G_ = caml_call2(Base_Import[93], _I_, len) < pos ? 1 : 0; + } + if(_G_) caml_call1(Base_Import[126], cst_List_sub); + return caml_call1 + (rev, + foldi + (l, + 0, + function(i, acc, el){ + if(pos <= i && i < caml_call2(Base_Import[91], pos, len)) + return [0, el, acc]; + return acc; + })); + } + function split_n(t_orig, n){ + if(0 >= n) return [0, 0, t_orig]; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return [0, caml_call1(rev, accum), t]; + if(! t) return [0, t_orig, 0]; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function take(t_orig, n){ + if(0 >= n) return 0; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return caml_call1(rev, accum); + if(! t) return t_orig; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function drop(t, n){ + var t$0 = t, n$0 = n; + for(;;){ + if(t$0){ + var tl = t$0[2]; + if(0 < n$0){ + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = tl, n$0 = n$1; + continue; + } + } + return t$0; + } + } + function chunks_of(l, length){ + if(length <= 0) caml_call3(invalid_argf, _q_, length, 0); + var acc = 0, l$0 = l; + for(;;){ + if(! l$0) return caml_call1(rev, acc); + var + match = split_n(l$0, length), + l$1 = match[2], + sublist = match[1], + acc$0 = [0, sublist, acc], + acc = acc$0, + l$0 = l$1; + } + } + function split_while(xs, f){ + var acc = 0, t = xs; + for(;;){ + if(t){ + var tl = t[2], hd = t[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, t = tl; + continue; + } + } + return [0, caml_call1(rev, acc), t]; + } + } + function take_while(xs, f){ + var acc = 0, param = xs; + for(;;){ + if(param){ + var tl = param[2], hd = param[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, param = tl; + continue; + } + } + return caml_call1(rev, acc); + } + } + function drop_while(t, f){ + var t$0 = t; + for(;;){ + if(t$0){ + var tl = t$0[2], hd = t$0[1]; + if(caml_call1(f, hd)){var t$0 = tl; continue;} + } + return t$0; + } + } + function drop_last(t){ + var match = caml_call1(rev, t); + if(! match) return 0; + var lst = match[2]; + return [0, caml_call1(rev, lst)]; + } + function drop_last_exn(t){ + var match = drop_last(t); + if(! match) + return caml_call1(Base_Import[124], cst_List_drop_last_exn_empty_l); + var lst = match[1]; + return lst; + } + function cartesian_product(list1, list2){ + if(caml_call1(is_empty, list2)) return 0; + var l1 = list1, accum = 0; + for(;;){ + if(! l1) return caml_call1(rev, accum); + var + tl = l1[2], + hd = l1[1], + accum$0 = + caml_call2 + (rev_append, + map + (list2, function(hd){return function(x){return [0, hd, x];};}(hd)), + accum), + l1 = tl, + accum = accum$0; + } + } + function concat(l){return caml_call3(fold_right, l, append, 0);} + function concat_no_order(l){ + return caml_call3 + (fold_left, + l, + 0, + function(acc, l){return caml_call2(rev_append, l, acc);}); + } + function cons(x, l){return [0, x, l];} + function is_sorted(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _E_ = caml_call2(compare, x1, x2) <= 0 ? 1 : 0; + if(! _E_) return _E_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + function is_sorted_strictly(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _D_ = caml_call2(compare, x1, x2) < 0 ? 1 : 0; + if(! _D_) return _D_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + var Infix = [0, append]; + function permute(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(list){ + var _C_ = list[2]; + if(_C_){ + if(_C_[2]){ + var arr = caml_call1(Base_Array0[13], list); + caml_call4(Base_Array_permute[24], [0, random_state], 0, 0, arr); + return caml_call1(Base_Array0[15], arr); + } + var y = _C_[1], x = list[1]; + return caml_call1(Base_Random[18][16], random_state) + ? [0, y, [0, x, 0]] + : list; + } + } + return list; + } + function random_element_exn(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(caml_call1(is_empty, list)) + return caml_call1(Base_Import[124], cst_List_random_element_exn_em); + var _B_ = caml_call1(length, list); + return nth_exn(list, caml_call2(Base_Random[18][6], random_state, _B_)); + } + function random_element(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{ + var _z_ = [0, random_element_exn([0, random_state], list)]; + return _z_; + } + catch(_A_){return 0;} + } + function compare$0(cmp, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + n = caml_call2(cmp, x, y); + if(0 !== n) return n; + var a$0 = xs, b$0 = ys; + } + } + var hash_fold_t = Base_Import[213]; + function equal(equal, t1, t2){ + var t1$0 = t1, t2$0 = t2; + for(;;){ + if(t1$0){ + if(t2$0){ + var + t2$1 = t2$0[2], + x2 = t2$0[1], + t1$1 = t1$0[2], + x1 = t1$0[1], + _y_ = caml_call2(equal, x1, x2); + if(! _y_) return _y_; + var t1$0 = t1$1, t2$0 = t2$1; + continue; + } + } + else if(! t2$0) return 1; + return 0; + } + } + function transpose(rows$0){ + var rows = rows$0, columns = 0, do_rev = 1; + a: + for(;;){ + var t = rows, column_acc = 0, trimmed_rows = 0, found_empty = 0; + for(;;){ + if(! t){ + if(! column_acc && ! trimmed_rows) + return [0, caml_call1(rev, columns)]; + if(found_empty) return 0; + var + column = do_rev ? caml_call1(rev, column_acc) : column_acc, + do_rev$0 = 1 - do_rev, + columns$0 = [0, column, columns], + rows = trimmed_rows, + columns = columns$0, + do_rev = do_rev$0; + continue a; + } + var match = t[1]; + if(match){ + var + tl = t[2], + xs = match[2], + x = match[1], + trimmed = [0, xs, trimmed_rows], + column_acc$0 = [0, x, column_acc], + t = tl, + column_acc = column_acc$0, + trimmed_rows = trimmed; + continue; + } + var tl$0 = t[2], t = tl$0, found_empty = 1; + } + } + } + var + Transpose_got_lists_of_differe = + [248, cst_Base_List_Transpose_got_li, runtime.caml_fresh_oo_id(0)]; + function _r_(param){ + if(param[1] !== Transpose_got_lists_of_differe) + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + var + arg0_031 = param[2], + res0_032 = caml_call2(Base_Import[152], Base_Import[142], arg0_031); + return [1, [0, _s_, [0, res0_032, 0]]]; + } + caml_call4 + (Sexplib0_Sexp_conv[70][1], 0, 0, Transpose_got_lists_of_differe, _r_); + function transpose_exn(l){ + var match = transpose(l); + if(! match) + throw caml_maybe_attach_backtrace + ([0, Transpose_got_lists_of_differe, map(l, length)], 1); + var l$0 = match[1]; + return l$0; + } + function intersperse(t, sep){ + if(! t) return 0; + var xs = t[2], x = t[1], _x_ = 0; + return [0, + x, + caml_call3 + (fold_right, + xs, + function(y, acc){return [0, sep, [0, y, acc]];}, + _x_)]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold_left, init, f, t); + } + function fold_until(t, init, f){ + var _v_ = caml_call3(Base_Container[9], fold_left, init, f); + return function(_w_){return caml_call2(_v_, _w_, t);}; + } + function is_suffix(list, suffix, equal_elt){ + var + list_len = caml_call1(length, list), + suffix_len = caml_call1(length, suffix), + _u_ = suffix_len <= list_len ? 1 : 0; + return _u_ + ? equal + (equal_elt, + drop(list, caml_call2(Base_Import[93], list_len, suffix_len)), + suffix) + : _u_; + } + var + Base_List = + [0, + compare$0, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + mem, + length, + is_empty, + iter, + fold_left, + fold_result, + fold_until, + exists, + for_all, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + [0, + both, + symbol, + symbol$1, + symbol$0, + apply, + map2$0, + map3$0, + [0, symbol$2, symbol$4, symbol$3, symbol_map], + symbol_bind, + symbol_map, + [0, symbol_bind, symbol_map], + concat_map, + return$0, + map, + join, + ignore_m, + all, + all_unit, + [0, return$0, symbol_bind, symbol_map, Let_syntax]], + symbol_bind, + symbol_map, + Monad_infix, + concat_map, + return$0, + join, + ignore_m, + all, + all_unit, + Let_syntax$0, + Or_unequal_lengths, + of_list, + nth, + nth_exn, + rev, + rev_append, + unordered_append, + rev_map, + iter2_exn, + iter2, + rev_map2_exn, + rev_map2, + fold2_exn, + fold2, + for_alli, + for_all2_exn, + for_all2, + existsi, + exists2_exn, + exists2, + filter, + rev_filter, + filteri, + partition_map, + partition3_map, + partition_tf, + partition_result, + split_n, + sort, + stable_sort, + merge, + hd, + tl, + hd_exn, + tl_exn, + findi, + findi_exn, + find_exn, + find_map_exn, + find_mapi, + find_mapi_exn, + append, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + concat_map, + concat_mapi, + map2_exn, + map2, + rev_map3_exn, + rev_map3, + map3_exn, + map3, + rev_map_append, + fold_right, + fold_left, + unzip, + unzip3, + zip, + zip_exn, + mapi, + rev_mapi, + iteri, + foldi, + reduce_exn, + reduce, + reduce_balanced, + reduce_balanced_exn, + group, + groupi, + sort_and_group, + chunks_of, + last, + last_exn, + is_prefix, + is_suffix, + find_consecutive_duplicate, + remove_consecutive_duplicates, + dedup_and_sort, + find_a_dup, + contains_dup, + find_all_dups, + all_equal, + count, + counti, + range$0, + range, + init, + rev_filter_map, + rev_filter_mapi, + filter_map, + filter_mapi, + filter_opt, + [0, + t_of_sexp$0, + sexp_of_t$1, + t_sexp_grammar$0, + add, + find$0, + find_exn$0, + mem$0, + remove, + map$2, + inverse, + group$0, + sort_and_group$0], + sub, + take, + drop, + take_while, + drop_while, + split_while, + drop_last, + drop_last_exn, + concat, + concat_no_order, + cons, + cartesian_product, + permute, + random_element, + random_element_exn, + is_sorted, + is_sorted_strictly, + equal, + Infix, + transpose, + transpose_exn, + intersperse]; + runtime.caml_register_global(54, Base_List, "Base__List"); + return; + } + (globalThis)); + +//# 8248 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = ": ", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$4 = "", + cst$3 = "; ", + cst = cst$5, + cst$0 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + t_sexp_grammar = [0, "Info.t"], + module_name = "Base.Info", + Stdlib_Format = global_data.Stdlib__Format, + Base_Exn = global_data.Base__Exn, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Lazy = global_data.Base__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy, + Assert_failure = global_data.Assert_failure, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_String0 = global_data.Base__String0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + _l_ = [0, "src/info.ml", 204, 6], + _a_ = [0, "Could_not_construct"], + _b_ = [0, "String"], + _c_ = [0, "Exn"], + _d_ = [0, "Sexp"], + _e_ = [0, "Tag_sexp"], + _f_ = [0, "Tag_t"], + _g_ = [0, "Tag_arg"], + _h_ = [0, "Of_list"], + _i_ = [0, "With_backtrace"], + cst_could_not_construct_info = "could not construct info: ", + _j_ = + [0, + [11, "and ", [4, 0, 0, 0, [11, " more info", 0]]], + "and %d more info"], + cst_Backtrace = "\nBacktrace:\n", + cst_Base_Info_Exn = "Base__Info.Exn"; + function sexp_of_t(param){ + switch(param[0]){ + case 0: + var arg0_001 = param[1], res0_002 = caml_call1(Base_Sexp[4], arg0_001); + return [1, [0, _a_, [0, res0_002, 0]]]; + case 1: + var + arg0_003 = param[1], + res0_004 = caml_call1(Base_Import[139], arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + case 2: + var + arg0_005 = param[1], + res0_006 = caml_call1(Base_Import[199], arg0_005); + return [1, [0, _c_, [0, res0_006, 0]]]; + case 3: + var arg0_007 = param[1], res0_008 = caml_call1(Base_Sexp[4], arg0_007); + return [1, [0, _d_, [0, res0_008, 0]]]; + case 4: + var + arg2_011 = param[3], + arg1_010 = param[2], + arg0_009 = param[1], + res0_012 = caml_call1(Base_Import[139], arg0_009), + res1_013 = caml_call1(Base_Sexp[4], arg1_010), + res2_014 = + caml_call2 + (Base_Import[149], Base_Source_code_position0[8], arg2_011); + return [1, [0, _e_, [0, res0_012, [0, res1_013, [0, res2_014, 0]]]]]; + case 5: + var + arg1_016 = param[2], + arg0_015 = param[1], + res0_017 = caml_call1(Base_Import[139], arg0_015), + res1_018 = sexp_of_t(arg1_016); + return [1, [0, _f_, [0, res0_017, [0, res1_018, 0]]]]; + case 6: + var + arg2_021 = param[3], + arg1_020 = param[2], + arg0_019 = param[1], + res0_022 = caml_call1(Base_Import[139], arg0_019), + res1_023 = caml_call1(Base_Sexp[4], arg1_020), + res2_024 = sexp_of_t(arg2_021); + return [1, [0, _g_, [0, res0_022, [0, res1_023, [0, res2_024, 0]]]]]; + case 7: + var + arg1_026 = param[2], + arg0_025 = param[1], + res0_027 = caml_call2(Base_Import[149], Base_Import[142], arg0_025), + res1_028 = caml_call2(Base_Import[152], sexp_of_t, arg1_026); + return [1, [0, _h_, [0, res0_027, [0, res1_028, 0]]]]; + default: + var + arg1_030 = param[2], + arg0_029 = param[1], + res0_031 = sexp_of_t(arg0_029), + res1_032 = caml_call1(Base_Import[139], arg1_030); + return [1, [0, _i_, [0, res0_031, [0, res1_032, 0]]]]; + } + } + function to_strings_hum(t, ac){ + var t$0 = t, ac$0 = ac; + for(;;) + switch(t$0[0]){ + case 0: + var sexp = t$0[1]; + return [0, + cst_could_not_construct_info, + [0, caml_call1(Base_Sexp[16], sexp), ac$0]]; + case 1: + var string = t$0[1]; return [0, string, ac$0]; + case 2: + var exn = t$0[1], _R_ = caml_call1(Base_Exn[1], exn); + return [0, caml_call1(Base_Sexp[16], _R_), ac$0]; + case 3: + var sexp$0 = t$0[1]; + return [0, caml_call1(Base_Sexp[16], sexp$0), ac$0]; + case 4: + var sexp$1 = t$0[2], tag = t$0[1]; + return [0, + tag, + [0, cst, [0, caml_call1(Base_Sexp[16], sexp$1), ac$0]]]; + case 5: + var t$1 = t$0[2], tag$0 = t$0[1]; + return [0, tag$0, [0, cst$0, to_strings_hum(t$1, ac$0)]]; + case 6: + var + t$2 = t$0[3], + sexp$2 = t$0[2], + tag$1 = t$0[1], + _S_ = [0, cst$1, to_strings_hum(t$2, ac$0)], + body = [0, caml_call1(Base_Sexp[16], sexp$2), _S_]; + return 0 === caml_ml_string_length(tag$1) + ? body + : [0, tag$1, [0, cst$2, body]]; + case 7: + var ts = t$0[2], trunc_after = t$0[1]; + if(trunc_after){ + var max = trunc_after[1], n = caml_call1(Base_List[7], ts); + if(n <= max) + var ts$0 = ts; + else + var + _V_ = caml_call2(Base_Import[93], n, max), + _W_ = [0, [1, caml_call2(Base_Printf[2], _j_, _V_)], 0], + _X_ = caml_call2(Base_List[131], ts, max), + ts$0 = caml_call2(Base_Import[111], _X_, _W_); + var ts$1 = ts$0; + } + else + var ts$1 = ts; + var + _T_ = + function(ac, t){ + var ac$0 = caml_call1(Base_List[8], ac) ? ac : [0, cst$3, ac]; + return to_strings_hum(t, ac$0); + }, + _U_ = caml_call1(Base_List[38], ts$1); + return caml_call3(Base_List[10], _U_, ac$0, _T_); + default: + var + backtrace = t$0[2], + t$3 = t$0[1], + ac$1 = [0, cst_Backtrace, [0, backtrace, ac$0]], + t$0 = t$3, + ac$0 = ac$1; + continue; + } + } + function to_sexps_hum(t, ac){ + switch(t[0]){ + case 0: + return [0, sexp_of_t(t), ac]; + case 1: + var string = t[1]; return [0, [0, string], ac]; + case 2: + var exn = t[1]; return [0, caml_call1(Base_Exn[1], exn), ac]; + case 3: + var sexp = t[1]; return [0, sexp, ac]; + case 4: + var here = t[3], sexp$0 = t[2], tag = t[1]; + if(here) + var + here$0 = here[1], + _O_ = [0, caml_call1(Base_Source_code_position0[8], here$0), 0]; + else + var _O_ = 0; + return [0, [1, [0, [0, tag], [0, sexp$0, _O_]]], ac]; + case 5: + var t$0 = t[2], tag$0 = t[1]; + return [0, [1, [0, [0, tag$0], to_sexps_hum(t$0, 0)]], ac]; + case 6: + var + t$1 = t[3], + sexp$1 = t[2], + tag$1 = t[1], + body = [0, sexp$1, to_sexps_hum(t$1, 0)]; + return 0 === caml_ml_string_length(tag$1) + ? [0, [1, body], ac] + : [0, [1, [0, [0, tag$1], body]], ac]; + case 7: + var + ts = t[2], + _P_ = function(ac, t){return to_sexps_hum(t, ac);}, + _Q_ = caml_call1(Base_List[38], ts); + return caml_call3(Base_List[10], _Q_, ac, _P_); + default: + var backtrace = t[2], t$2 = t[1]; + return [0, [1, [0, to_sexp_hum(t$2), [0, [0, backtrace], 0]]], ac]; + } + } + function to_sexp_hum(t){ + var sexps = to_sexps_hum(t, 0); + if(sexps && ! sexps[2]){var sexp = sexps[1]; return sexp;} + return [1, sexps]; + } + function protect(f){ + try{var _N_ = caml_call1(f, 0); return _N_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return [0, caml_call1(Base_Exn[1], exn)]; + } + } + function to_message(info){ + return protect + (function(param){ + var _M_ = caml_obj_tag(info); + if(250 === _M_) return info[1]; + if(246 !== _M_ && 244 !== _M_) return info; + return caml_call1(CamlinternalLazy[2], info); + }); + } + function of_message(t){return [250, t];} + function invariant(param){return 0;} + function sexp_of_t$0(t){return to_sexp_hum(to_message(t));} + function t_of_sexp(sexp){return [246, function(_L_){return [3, sexp];}];} + function compare(t1, t2){ + var _J_ = sexp_of_t$0(t2), _K_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[6], _K_, _J_); + } + function equal(t1, t2){ + var _H_ = sexp_of_t$0(t2), _I_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[5], _I_, _H_); + } + function hash_fold_t(state, t){ + var _G_ = sexp_of_t$0(t); + return caml_call2(Base_Sexp[1], state, _G_); + } + function hash(t){return caml_call3(Base_Hash[14], 0, hash_fold_t, t);} + function to_string_hum(t){ + var message = to_message(t); + if(1 === message[0]){var s = message[1]; return s;} + var _F_ = to_sexp_hum(message); + return caml_call2(Base_Sexp[15], 0, _F_); + } + function to_string_hum_deprecated(t){ + var t$0 = to_message(t), _E_ = to_strings_hum(t$0, 0); + return caml_call2(Base_String0[14], 0, _E_); + } + function to_string_mach(t){ + var _D_ = sexp_of_t$0(t); + return caml_call1(Base_Sexp[16], _D_); + } + function of_lazy(l){ + return [246, + function(_A_){ + return protect + (function(param){ + var _B_ = caml_obj_tag(l); + if(250 === _B_) + var _C_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _B_ && 244 !== _B_){var _C_ = l; switch$0 = 1;} + if(! switch$0) var _C_ = caml_call1(CamlinternalLazy[2], l); + } + return [1, _C_]; + }); + }]; + } + function of_lazy_sexp(l){ + return [246, + function(_x_){ + return protect + (function(param){ + var _y_ = caml_obj_tag(l); + if(250 === _y_) + var _z_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _y_ && 244 !== _y_){var _z_ = l; switch$0 = 1;} + if(! switch$0) var _z_ = caml_call1(CamlinternalLazy[2], l); + } + return [3, _z_]; + }); + }]; + } + function of_lazy_t(lazy_t){return caml_call1(Base_Lazy[13], lazy_t);} + function of_string(message){ + return caml_call1(Base_Lazy[21], [1, message]); + } + function createf(format){ + return caml_call2(Base_Printf[4], of_string, format); + } + function of_thunk(f){ + return [246, + function(_w_){ + return protect(function(param){return [1, caml_call1(f, 0)];}); + }]; + } + function create(here, strict, tag, x, sexp_of_x){ + return strict + ? [250, [4, tag, caml_call1(sexp_of_x, x), here]] + : [246, + function(_v_){ + return protect + (function(param){ + return [4, tag, caml_call1(sexp_of_x, x), here]; + }); + }]; + } + function create_s(sexp){return caml_call1(Base_Lazy[21], [3, sexp]);} + function tag(t, tag){ + return [246, function(param){return [5, tag, to_message(t)];}]; + } + function tag_s_lazy(t, tag){ + return [246, + function(_r_){ + return protect + (function(param){ + var _s_ = to_message(t), _t_ = caml_obj_tag(tag); + if(250 === _t_) + var _u_ = tag[1]; + else{ + var switch$0 = 0; + if(246 !== _t_ && 244 !== _t_){var _u_ = tag; switch$0 = 1;} + if(! switch$0) + var _u_ = caml_call1(CamlinternalLazy[2], tag); + } + return [6, cst$4, _u_, _s_]; + }); + }]; + } + function tag_s(t, tag){ + return tag_s_lazy(t, caml_call1(Base_Lazy[21], tag)); + } + function tag_arg(t, tag, x, sexp_of_x){ + return [246, + function(_p_){ + return protect + (function(param){ + var _q_ = to_message(t); + return [6, tag, caml_call1(sexp_of_x, x), _q_]; + }); + }]; + } + function of_list(trunc_after, ts){ + return [246, + function(param){ + return [7, + trunc_after, + caml_call2(Base_List[76], ts, to_message)]; + }]; + } + var Exn = [248, cst_Base_Info_Exn, runtime.caml_fresh_oo_id(0)]; + function _k_(param){ + if(param[1] !== Exn) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var t = param[2]; + return sexp_of_t$0(t); + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Exn, _k_); + function to_exn(t){ + if(! caml_call1(Base_Lazy[22], t)) return [0, Exn, t]; + var _o_ = caml_obj_tag(t); + if(250 === _o_) + var match = t[1]; + else{ + var switch$0 = 0; + if(246 !== _o_ && 244 !== _o_){var match = t; switch$0 = 1;} + if(! switch$0) var match = caml_call1(CamlinternalLazy[2], t); + } + if(2 !== match[0]) return [0, Exn, t]; + var exn = match[1]; + return exn; + } + function of_exn(backtrace, exn){ + if(backtrace){ + var match = backtrace[1]; + if(typeof match === "number") + var _n_ = [0, caml_call1(Stdlib_Printexc[6], 0)]; + else + var s = match[2], _n_ = [0, s]; + var backtrace$0 = _n_; + } + else + var backtrace$0 = 0; + if(exn[1] === Exn){ + var t = exn[2]; + if(! backtrace$0) return t; + var backtrace$1 = backtrace$0[1]; + return [246, function(param){return [8, to_message(t), backtrace$1];}]; + } + if(! backtrace$0) return caml_call1(Base_Lazy[21], [2, exn]); + var backtrace$2 = backtrace$0[1]; + return [246, + function(param){ + return [8, [3, caml_call1(Base_Exn[1], exn)], backtrace$2]; + }]; + } + function pp(ppf, t){ + var _m_ = to_string_hum(t); + return caml_call2(Stdlib_Format[13], ppf, _m_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Info = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + [0, sexp_of_t, to_message, of_message]]; + runtime.caml_register_global(37, Base_Info, "Base__Info"); + return; + } + (globalThis)); + +//# 8735 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + t_sexp_grammar = [0, "Error.t"], + module_name = "Base.Error", + Base_Info = global_data.Base__Info, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Info[1], + equal = Base_Info[2], + hash_fold_t = Base_Info[3], + hash = Base_Info[4], + t_of_sexp = Base_Info[5], + sexp_of_t = Base_Info[6], + invariant = Base_Info[8], + to_string_hum = Base_Info[9], + to_string_mach = Base_Info[10], + to_string_hum_deprecated = Base_Info[11], + of_string = Base_Info[12], + of_lazy = Base_Info[13], + of_lazy_sexp = Base_Info[14], + of_thunk = Base_Info[15], + of_lazy_t = Base_Info[16], + create = Base_Info[17], + create_s = Base_Info[18], + createf = Base_Info[19], + tag = Base_Info[20], + tag_s = Base_Info[21], + tag_s_lazy = Base_Info[22], + tag_arg = Base_Info[23], + of_list = Base_Info[24], + of_exn = Base_Info[25], + to_exn = Base_Info[26], + pp = Base_Info[27], + Internal_repr = Base_Info[28]; + function raise(t){ + throw caml_maybe_attach_backtrace(caml_call1(to_exn, t), 1); + } + function raise_s(sexp){return raise(caml_call1(create_s, sexp));} + function to_info(t){return t;} + function of_info(t){return t;} + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Error = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + Internal_repr, + raise, + raise_s, + to_info, + of_info]; + runtime.caml_register_global(4, Base_Error, "Base__Error"); + return; + } + (globalThis)); + +//# 8898 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List = global_data.Base__List, + Base_Error = global_data.Base__Error, + Base_With_return = global_data.Base__With_return, + Assert_failure = global_data.Assert_failure, + Base_Result = global_data.Base__Result, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Applicative = global_data.Base__Applicative, + ignore_m = Base_Result[14], + join = Base_Result[13], + return$0 = Base_Result[12], + bind = Base_Result[11], + symbol_bind = Base_Result[7], + _c_ = [0, "src/or_error.ml", 135, 22], + cst_unimplemented = "unimplemented", + _b_ = [0, 3553398], + _a_ = Base_Result[30]; + function compare(cmp_a, a_001, b_002){ + return caml_call4(Base_Result[4], cmp_a, Base_Error[1], a_001, b_002); + } + function equal(cmp_a, a_007, b_008){ + return caml_call4(Base_Result[5], cmp_a, Base_Error[2], a_007, b_008); + } + function hash_fold_t(hash_fold_a, hsv, arg){ + return caml_call4(Base_Result[6], hash_fold_a, Base_Error[3], hsv, arg); + } + function t_of_sexp(of_a_013, x_015){ + return caml_call3(Base_Result[1], of_a_013, Base_Error[5], x_015); + } + function sexp_of_t(of_a_016, x_017){ + return caml_call3(Base_Result[2], of_a_016, Base_Error[6], x_017); + } + function t_sexp_grammar(a_sexp_grammar){ + return caml_call2(Base_Result[3], a_sexp_grammar, Base_Error[7]); + } + function invariant(invariant_a, t){ + if(0 === t[0]){var a = t[1]; return caml_call1(invariant_a, a);} + var error = t[1]; + return caml_call1(Base_Error[8], error); + } + function apply(f, x){ + function _y_(e1, e2){ + return caml_call2(Base_Error[24], 0, [0, e1, [0, e2, 0]]); + } + function _z_(f, x){return caml_call1(f, x);} + return caml_call4(Base_Result[32], f, x, _z_, _y_); + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13], + include$0 = Base_Result[10], + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Open_on_rhs = [0], + ok = Base_Result[23], + is_ok = Base_Result[21], + is_error = Base_Result[22]; + function try_with(opt, f){ + if(opt) var sth = opt[1], backtrace = sth; else var backtrace = 0; + try{var _x_ = [0, caml_call1(f, 0)]; return _x_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), _w_ = backtrace ? _b_ : 0; + return [1, caml_call2(Base_Error[25], _w_, exn)]; + } + } + function try_with_join(backtrace, f){ + return caml_call1(join, try_with(backtrace, f)); + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var err = param[1]; + return caml_call1(Base_Error[29], err); + } + function of_exn(backtrace, exn){ + return [1, caml_call2(Base_Error[25], backtrace, exn)]; + } + function of_exn_result(backtrace, z){ + if(0 === z[0]) return z; + var exn = z[1]; + return of_exn(backtrace, exn); + } + function error(here, strict, message, a, sexp_of_a){ + return [1, + caml_call5(Base_Error[17], here, strict, message, a, sexp_of_a)]; + } + function error_s(sexp){return [1, caml_call1(Base_Error[18], sexp)];} + function error_string(message){ + return [1, caml_call1(Base_Error[12], message)]; + } + function errorf(format){ + return caml_call2(Base_Printf[4], error_string, format); + } + function tag(t, tag){ + var _t_ = Base_Error[20]; + function _u_(_v_){return caml_call2(_t_, _v_, tag);} + return caml_call2(Base_Result[31], t, _u_); + } + function tag_s(t, tag){ + var _q_ = Base_Error[21]; + function _r_(_s_){return caml_call2(_q_, _s_, tag);} + return caml_call2(Base_Result[31], t, _r_); + } + function tag_s_lazy(t, tag){ + var _n_ = Base_Error[22]; + function _o_(_p_){return caml_call2(_n_, _p_, tag);} + return caml_call2(Base_Result[31], t, _o_); + } + function tag_arg(t, message, a, sexp_of_a){ + function _m_(e){ + return caml_call4(Base_Error[23], e, message, a, sexp_of_a); + } + return caml_call2(Base_Result[31], t, _m_); + } + function unimplemented(s){ + return error(0, 0, cst_unimplemented, s, Base_Import[139]); + } + function combine_errors(l){ + var arg = Base_Error[24]; + function _k_(eta){return caml_call2(arg, 0, eta);} + var _l_ = caml_call1(Base_Result[33], l); + return caml_call2(Base_Result[31], _l_, _k_); + } + function combine_errors_unit(l){ + function _i_(param){return 0;} + var _j_ = combine_errors(l); + return caml_call2(Base_Result[30], _j_, _i_); + } + function filter_ok_at_least_one(l){ + var + match = caml_call2(Base_List[57], l, Base_Result[35]), + errs = match[2], + ok = match[1]; + return ok ? [0, ok] : [1, caml_call2(Base_Error[24], 0, errs)]; + } + function find_ok(l){ + var match = caml_call2(Base_List[17], l, Base_Result[23]); + if(match){var x = match[1]; return [0, x];} + function _g_(param){ + if(0 === param[0]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var err = param[1]; + return err; + } + var _h_ = caml_call2(Base_List[76], l, _g_); + return [1, caml_call2(Base_Error[24], 0, _h_)]; + } + function find_map_ok(l, f){ + function _d_(param){ + function _e_(elt){ + var x = caml_call1(f, elt); + if(0 === x[0]) return caml_call1(param, x); + var err = x[1]; + return err; + } + var _f_ = caml_call2(Base_List[76], l, _e_); + return [1, caml_call2(Base_Error[24], 0, _f_)]; + } + return caml_call1(Base_With_return[1], _d_); + } + var + map$1 = Base_Result[30], + iter = Base_Result[28], + iter_error = Base_Result[29], + Base_Or_error = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + invariant, + symbol_bind, + symbol_map, + Base_Result[10], + bind, + return$1, + join, + ignore_m, + all, + all_unit, + [0, + return$1, + symbol_bind$0, + symbol_map$0, + [0, return$1, bind, map$0, both, Open_on_rhs]], + is_ok, + is_error, + try_with, + try_with_join, + ok, + ok_exn, + of_exn, + of_exn_result, + error, + error_s, + error_string, + errorf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + unimplemented, + map$1, + iter, + iter_error, + combine_errors, + combine_errors_unit, + filter_ok_at_least_one, + find_ok, + find_map_ok]; + runtime.caml_register_global(11, Base_Or_error, "Base__Or_error"); + return; + } + (globalThis)); + +//# 9171 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Neg = "Neg", + cst_Pos = "Pos", + cst_Zero = "Zero", + cst_neg = "neg", + cst_pos = "pos", + cst_zero = "zero", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_003 = "sign0.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Neg, 0]], + [0, [1, [0, cst_Zero, 0]], [0, [1, [0, cst_Pos, 0]], 0]]]]], + all = [0, 0, [0, 1, [0, 2, 0]]], + module_name = "Base.Sign", + Base_Import = global_data.Base__Import, + Base_Poly0 = global_data.Base__Poly0, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + _a_ = [0, cst_Neg], + _b_ = [0, cst_Zero], + _c_ = [0, cst_Pos]; + function t_of_sexp(sexp_004){ + if(0 === sexp_004[0]){ + var _e_ = sexp_004[1], switch$0 = 0; + if(caml_string_notequal(_e_, cst_Neg)){ + var switch$1 = 0; + if(caml_string_notequal(_e_, cst_Pos)){ + var switch$2 = 0; + if(caml_string_notequal(_e_, cst_Zero)){ + if(caml_string_notequal(_e_, cst_neg)) + if(caml_string_notequal(_e_, cst_pos)) + if(caml_string_notequal(_e_, cst_zero)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 1; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 0; + } + else{ + var _f_ = sexp_004[1]; + if(! _f_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_003, sexp_004); + var _g_ = _f_[1]; + if(0 !== _g_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_003, sexp_004); + var _h_ = _g_[1], switch$3 = 0; + if(caml_string_notequal(_h_, cst_Neg)){ + var switch$4 = 0; + if(caml_string_notequal(_h_, cst_Pos)){ + var switch$5 = 0; + if(caml_string_notequal(_h_, cst_Zero)){ + if(caml_string_notequal(_h_, cst_neg)) + if(caml_string_notequal(_h_, cst_pos)) + if(caml_string_notequal(_h_, cst_zero)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_003, sexp_004); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + var compare = caml_int_compare; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function symbol(x, y){return x < y ? 1 : 0;} + function symbol$0(x, y){return x <= y ? 1 : 0;} + function symbol$1(x, y){return x !== y ? 1 : 0;} + function symbol$2(x, y){return x === y ? 1 : 0;} + function symbol$3(x, y){return y < x ? 1 : 0;} + function symbol$4(x, y){return y <= x ? 1 : 0;} + function ascending(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare; + function equal(x, y){return x === y ? 1 : 0;} + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Replace_polymorphic_compare = + [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + ascending, + descending, + compare$0, + equal, + max, + min]; + function of_string(s){return t_of_sexp(caml_call1(Base_Import[139], s));} + function to_string(t){ + var _d_ = sexp_of_t(t); + return caml_call1(Base_Import[163], _d_); + } + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + var + Base_Sign0 = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + all, + Replace_polymorphic_compare, + of_string, + to_string, + to_int, + to_int, + module_name, + of_int]; + runtime.caml_register_global(23, Base_Sign0, "Base__Sign0"); + return; + } + (globalThis)); + +//# 9355 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Comparable_intf = [0]; + runtime.caml_register_global + (0, Base_Comparable_intf, "Base__Comparable_intf"); + return; + } + (globalThis)); + +//# 9366 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_clamp_requires_min_max$1 = "clamp requires [min <= max]", + cst_max$1 = "max", + cst_min$1 = "min", + cst_src_comparable_ml = "src/comparable.ml", + caml_compare = runtime.caml_compare, + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparator = global_data.Base__Comparator, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Poly0 = global_data.Base__Poly0, + Base_Sign0 = global_data.Base__Sign0, + cst_max$0 = cst_max$1, + cst_min$0 = cst_min$1, + cst_clamp_requires_min_max$0 = cst_clamp_requires_min_max$1, + _b_ = [0, cst_src_comparable_ml, 133, 4], + cst_max = cst_max$1, + cst_min = cst_min$1, + cst_clamp_requires_min_max = cst_clamp_requires_min_max$1, + _a_ = [0, cst_src_comparable_ml, 47, 4]; + function geq(cmp, a, b){return 0 <= caml_call2(cmp, a, b) ? 1 : 0;} + function leq(cmp, a, b){return caml_call2(cmp, a, b) <= 0 ? 1 : 0;} + function equal(cmp, a, b){return 0 === caml_call2(cmp, a, b) ? 1 : 0;} + function min(cmp, t$0, t){return leq(cmp, t$0, t) ? t$0 : t;} + function max(cmp, t$0, t){return geq(cmp, t$0, t) ? t$0 : t;} + function Infix(T){ + function symbol(a, b){ + var cmp = T[1]; + return 0 < caml_call2(cmp, a, b) ? 1 : 0; + } + function symbol$0(a, b){ + var cmp = T[1]; + return caml_call2(cmp, a, b) < 0 ? 1 : 0; + } + function symbol$1(a, b){return geq(T[1], a, b);} + function symbol$2(a, b){return leq(T[1], a, b);} + function symbol$3(a, b){return equal(T[1], a, b);} + function symbol$4(a, b){ + var cmp = T[1]; + return 0 !== caml_call2(cmp, a, b) ? 1 : 0; + } + return [0, symbol$1, symbol$2, symbol$3, symbol, symbol$0, symbol$4]; + } + function Polymorphic_compare(T){ + var + include = Infix(T), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + compare = T[1]; + function min$0(t$0, t){return min(compare, t$0, t);} + function max$0(t$0, t){return max(compare, t$0, t);} + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$1, + compare, + min$0, + max$0]; + } + function Make_using_comparator(T){ + var + sexp_of_t = T[1], + comparator = T[2], + compare = comparator[1], + Replace_polymorphic_compare = Polymorphic_compare([0, compare]), + symbol = Replace_polymorphic_compare[1], + symbol$0 = Replace_polymorphic_compare[2], + symbol$1 = Replace_polymorphic_compare[3], + symbol$2 = Replace_polymorphic_compare[4], + symbol$3 = Replace_polymorphic_compare[5], + symbol$4 = Replace_polymorphic_compare[6], + equal = Replace_polymorphic_compare[7], + compare$0 = Replace_polymorphic_compare[8], + min = Replace_polymorphic_compare[9], + max = Replace_polymorphic_compare[10]; + function descending(t$0, t){return caml_call2(compare$0, t, t$0);} + function between(t, low, high){ + var _s_ = caml_call2(symbol$0, low, t); + return _s_ ? caml_call2(symbol$0, t, high) : _s_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(symbol$3, t, min) + ? min + : caml_call2(symbol$0, t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(symbol$0, min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(symbol$2, min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _p_ = [0, [0, cst_max$0, caml_call1(sexp_of_t, max)], 0], + _q_ = [0, [0, cst_min$0, caml_call1(sexp_of_t, min)], _p_], + _r_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max$0, _q_); + return caml_call1(Base_Or_error[35], _r_); + } + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + compare$0, + descending, + between, + clamp_exn, + clamp, + comparator]; + } + function Make(T){ + var + sexp_of_t = T[2], + include = caml_call1(Base_Comparator[5], T), + comparator = include[1]; + return Make_using_comparator([0, sexp_of_t, comparator]); + } + function Inherit(C, T){ + var sexp_of_t = T[1]; + function compare(t$0, t){ + var _n_ = caml_call1(T[2], t), _o_ = caml_call1(T[2], t$0); + return caml_call2(C[1], _o_, _n_); + } + return Make([0, compare, sexp_of_t]); + } + function lexicographic(cmps, x, y){ + var param = cmps; + for(;;){ + if(! param) return 0; + var cmps$0 = param[2], cmp = param[1], res = caml_call2(cmp, x, y); + if(0 !== res) return res; + var param = cmps$0; + } + } + function lift(cmp, f, x, y){ + var _m_ = caml_call1(f, y); + return caml_call2(cmp, caml_call1(f, x), _m_); + } + function reverse(cmp, x, y){return caml_call2(cmp, y, x);} + function _c_(_i_){ + var _j_ = _i_[3], _k_ = _i_[1]; + function is_positive(t){return 0 < caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_non_negative(t){return 0 <= caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_negative(t){return caml_call2(_k_, t, _j_) < 0 ? 1 : 0;} + function is_non_positive(t){return caml_call2(_k_, t, _j_) <= 0 ? 1 : 0;} + function sign(t){ + var _l_ = caml_call2(_k_, t, _j_); + return caml_call1(Base_Sign0[13], _l_); + } + return [0, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign]; + } + var + Base_Comparable = + [0, + lexicographic, + lift, + reverse, + equal, + max, + min, + Infix, + Polymorphic_compare, + Inherit, + Make, + Make_using_comparator, + function(T){ + var + sexp_of_t = T[1], + ascending = Base_Poly0[1], + descending = Base_Poly0[2], + min = Base_Poly0[3], + max = Base_Poly0[4]; + function between(t, low, high){ + var + _g_ = caml_lessequal(low, t), + _h_ = _g_ ? caml_lessequal(t, high) : _g_; + return _h_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _d_ = [0, [0, cst_max, caml_call1(T[1], max)], 0], + _e_ = [0, [0, cst_min, caml_call1(T[1], min)], _d_], + _f_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _e_); + return caml_call1(Base_Or_error[35], _f_); + } + var + include = + caml_call1(Base_Comparator[5], [0, caml_compare, sexp_of_t]), + comparator = include[1]; + return [0, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + caml_equal, + caml_compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + }, + _c_]; + runtime.caml_register_global(14, Base_Comparable, "Base__Comparable"); + return; + } + (globalThis)); + +//# 9715 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Identifiable_intf = [0]; + runtime.caml_register_global + (0, Base_Identifiable_intf, "Base__Identifiable_intf"); + return; + } + (globalThis)); + +//# 9726 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer; + function _a_(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _c_ = caml_call1(Base_Comparable[11], [0, T[5], T[9]]), + symbol = _c_[1], + symbol$0 = _c_[2], + symbol$1 = _c_[3], + symbol$2 = _c_[4], + symbol$3 = _c_[5], + symbol$4 = _c_[6], + equal = _c_[7], + compare = _c_[8], + min = _c_[9], + max = _c_[10], + ascending = _c_[11], + descending = _c_[12], + between = _c_[13], + clamp_exn = _c_[14], + clamp = _c_[15], + comparator = _c_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + } + var + Base_Identifiable = + [0, + function(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _b_ = caml_call1(Base_Comparable[10], [0, T[1], T[5]]), + symbol = _b_[1], + symbol$0 = _b_[2], + symbol$1 = _b_[3], + symbol$2 = _b_[4], + symbol$3 = _b_[5], + symbol$4 = _b_[6], + equal = _b_[7], + compare = _b_[8], + min = _b_[9], + max = _b_[10], + ascending = _b_[11], + descending = _b_[12], + between = _b_[13], + clamp_exn = _b_[14], + clamp = _b_[15], + comparator = _b_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + }, + _a_]; + runtime.caml_register_global(2, Base_Identifiable, "Base__Identifiable"); + return; + } + (globalThis)); + +//# 9858 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$0 = "()"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + all = [0, 0, 0], + module_name = "Base.Unit", + Base_Import = global_data.Base__Import, + Base_Identifiable = global_data.Base__Identifiable, + hash_fold_t = Base_Import[211], + func = Base_Import[225], + cst_Base_Unit_of_string_expect = "Base.Unit.of_string: () expected"; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[161], + sexp_of_t = Base_Import[137], + t_sexp_grammar = Base_Import[181]; + function compare(param, _a_){return 0;} + function of_string(param){ + return runtime.caml_string_notequal(param, cst$0) + ? caml_call1(Base_Import[124], cst_Base_Unit_of_string_expect) + : 0; + } + function to_string(param){return cst;} + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + symbol = include[7], + symbol$0 = include[8], + symbol$1 = include[9], + symbol$2 = include[10], + symbol$3 = include[11], + symbol$4 = include[12], + equal = include[13], + compare$0 = include[14], + min = include[15], + max = include[16], + ascending = include[17], + descending = include[18], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + pp = include[23], + hashable = include[24]; + function invariant(param){return 0;} + var + Base_Unit = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant]; + runtime.caml_register_global(7, Base_Unit, "Base__Unit"); + return; + } + (globalThis)); + +//# 9964 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Base_Or_error = global_data.Base__Or_error, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + get_pos_len_exn = Base_Ordered_collection_common[1], + check_pos_len_exn = Base_Ordered_collection_common[2], + Private = Base_Ordered_collection_common[3]; + function get_pos_len(pos, len, param, total_length){ + try{ + var _a_ = [0, caml_call4(get_pos_len_exn, pos, len, 0, total_length)]; + return _a_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exn, 0); + var s = exn[2]; + return caml_call1(Base_Or_error[36], s); + } + } + var + Base_Ordered_collection_common$0 = + [0, get_pos_len_exn, check_pos_len_exn, Private, get_pos_len]; + runtime.caml_register_global + (3, Base_Ordered_collection_common$0, "Base__Ordered_collection_common"); + return; + } + (globalThis)); + +//# 10013 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Fn = global_data.Base__Fn; + function find_first_satisfying(pos, len, t, get, length, pred){ + var + _e_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _e_), + len$0 = match[2], + pos$0 = match[1], + _f_ = caml_call2(Base_Import[91], pos$0, len$0), + hi$0 = caml_call2(Base_Import[93], _f_, 1), + lo$1 = pos$0, + hi = hi$0; + for(;;){ + if(8 < caml_call2(Base_Import[93], hi, lo$1)){ + var + _c_ = caml_call2(Base_Import[93], hi, lo$1), + _d_ = caml_call2(Base_Import[95], _c_, 2), + mid = caml_call2(Base_Import[91], lo$1, _d_); + if(caml_call1(pred, caml_call2(get, t, mid))){var hi = mid; continue;} + var lo$2 = caml_call2(Base_Import[91], mid, 1), lo$1 = lo$2; + continue; + } + var lo = lo$1; + for(;;){ + if(hi < lo) return 0; + if(caml_call1(pred, caml_call2(get, t, lo))) return [0, lo]; + var lo$0 = caml_call2(Base_Import[91], lo, 1), lo = lo$0; + } + } + } + function find_last_satisfying(pos, len, t, pred, get, length){ + var + _a_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _a_), + len$0 = match[2], + pos$0 = match[1]; + if(0 === len$0) return 0; + var + match$0 = + find_first_satisfying + ([0, pos$0], [0, len$0], t, get, length, caml_call1(Base_Fn[2], pred)); + if(match$0){ + var i = match$0[1]; + return i === pos$0 ? 0 : [0, caml_call2(Base_Import[93], i, 1)]; + } + var _b_ = caml_call2(Base_Import[91], pos$0, len$0); + return [0, caml_call2(Base_Import[93], _b_, 1)]; + } + function binary_search(pos, len, t, length, get, compare, how, v){ + if(-839473056 <= how) + return 200870407 <= how + ? 926943384 + <= how + ? find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}) + : find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) < 0 ? 1 : 0;}, + get, + length) + : -253007807 + <= how + ? find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length) + : find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 < caml_call2(compare, x, v) ? 1 : 0;}); + if(-1055410545 <= how){ + var + match = + find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length); + if(match){ + var x = match[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x), v)) return [0, x]; + } + return 0; + } + var + match$0 = + find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}); + if(match$0){ + var x$0 = match$0[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x$0), v)) + return [0, x$0]; + } + return 0; + } + function binary_search_segmented(pos, len, t, length, get, segment_of, how){ + function is_left(x){ + return 847852583 <= caml_call1(segment_of, x) ? 1 : 0; + } + function is_right(x){return 1 - is_left(x);} + return 125585502 <= how + ? find_last_satisfying(pos, len, t, is_left, get, length) + : find_first_satisfying(pos, len, t, get, length, is_right); + } + var Base_Binary_search = [0, binary_search, binary_search_segmented]; + runtime.caml_register_global(3, Base_Binary_search, "Base__Binary_search"); + return; + } + (globalThis)); + +//# 10167 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + all = + [0, + 200870407, + [0, + -253007807, + [0, -1055410545, [0, -1056898635, [0, 926943384, [0, -839473056, 0]]]]]], + all$0 = [0, 125585502, [0, -63348021, 0]], + Which_target_by_key = [0, all], + Which_target_by_segment = [0, all$0], + Base_Binary_searchable_intf = + [0, Which_target_by_key, Which_target_by_segment]; + runtime.caml_register_global + (2, Base_Binary_searchable_intf, "Base__Binary_searchable_intf"); + return; + } + (globalThis)); + +//# 10190 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Binary_search = global_data.Base__Binary_search; + function Make_gen(T){ + var get = T[1], length = T[2]; + function binary_search(pos, len, t, compare, how, v){ + return caml_call8 + (Base_Binary_search[1], + pos, + len, + t, + length, + get, + compare, + how, + v); + } + function binary_search_segmented(pos, len, t, segment_of, how){ + return caml_call7 + (Base_Binary_search[2], + pos, + len, + t, + length, + get, + segment_of, + how); + } + return [0, get, length, binary_search, binary_search_segmented]; + } + function _a_(T){ + var get = T[1], length = T[2], _c_ = Make_gen([0, get, length]); + return [0, _c_[3], _c_[4]]; + } + var + Base_Binary_searchable = + [0, + function(T){ + var get = T[1], length = T[2], _b_ = Make_gen([0, get, length]); + return [0, _b_[3], _b_[4]]; + }, + _a_]; + runtime.caml_register_global + (1, Base_Binary_searchable, "Base__Binary_searchable"); + return; + } + (globalThis)); + +//# 10253 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Blit_intf = [0]; + runtime.caml_register_global(0, Base_Blit_intf, "Base__Blit_intf"); + return; + } + (globalThis)); + +//# 10263 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common; + function Make_gen(Src, Dst){ + var unsafe_blit = Dst[3]; + function blit(src, src_pos, dst, dst_pos, len){ + var _q_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], src_pos, len, _q_); + var _r_ = caml_call1(Dst[1], dst); + caml_call3(Base_Ordered_collection_common[2], dst_pos, len, _r_); + var _s_ = 0 < len ? 1 : 0; + return _s_ + ? caml_call5(unsafe_blit, src, src_pos, dst, dst_pos, len) + : _s_; + } + function blito(src, opt, _o_, dst, _n_, param){ + if(opt) var sth = opt[1], src_pos = sth; else var src_pos = 0; + if(_o_) + var sth$0 = _o_[1], src_len = sth$0; + else + var + _p_ = caml_call1(Src[1], src), + src_len = caml_call2(Base_Import[93], _p_, src_pos); + if(_n_) var sth$1 = _n_[1], dst_pos = sth$1; else var dst_pos = 0; + return blit(src, src_pos, dst, dst_pos, src_len); + } + function sub(src, pos, len){ + var _m_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], pos, len, _m_); + var dst = caml_call2(Dst[2], len, src); + if(0 < len) caml_call5(unsafe_blit, src, pos, dst, 0, len); + return dst; + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var + _l_ = caml_call1(Src[1], src), + i$0 = caml_call2(Base_Import[93], _l_, pos); + return sub(src, pos, i$0); + } + return [0, unsafe_blit, blit, blito, sub, subo]; + } + function Make_to_string(T, To_bytes){ + function sub(src, pos, len){ + var _k_ = caml_call3(To_bytes[4], src, pos, len); + return caml_call1(Base_Bytes0[16], _k_); + } + function subo(pos, len, src){ + var _j_ = caml_call3(To_bytes[5], pos, len, src); + return caml_call1(Base_Bytes0[16], _j_); + } + return [0, sub, subo]; + } + function _a_(_h_){ + var _i_ = Make_gen([0, _h_[2]], [0, _h_[2], _h_[1], _h_[3]]); + return [0, _i_[2], _i_[3], _i_[1], _i_[4], _i_[5]]; + } + function _b_(_e_){ + var _f_ = [0, _e_[2], _e_[1], _e_[3]], _g_ = Make_gen([0, _f_[1]], _f_); + return [0, _g_[2], _g_[3], _g_[1], _g_[4], _g_[5]]; + } + function _c_(Src, Dst){ + var length = Dst[1]; + function create_like(len, param){return caml_call1(Dst[2], len);} + var + unsafe_blit = Dst[3], + length$0 = Src[1], + _d_ = Make_gen([0, length$0], [0, length, create_like, unsafe_blit]); + return [0, _d_[2], _d_[3], _d_[1], _d_[4], _d_[5]]; + } + var + Base_Blit = + [0, + function(Sequence){ + function create_like(len, param){return caml_call1(Sequence[2], len);} + var + length = Sequence[1], + unsafe_blit = Sequence[3], + include = + Make_gen([0, length], [0, length, create_like, unsafe_blit]), + unsafe_blit$0 = include[1], + blit = include[2], + blito = include[3], + sub = include[4], + subo = include[5]; + return [0, blit, blito, unsafe_blit$0, sub, subo]; + }, + _c_, + Make_to_string, + _b_, + _a_]; + runtime.caml_register_global(3, Base_Blit, "Base__Blit"); + return; + } + (globalThis)); + +//# 10400 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Container = global_data.Base__Container, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_Error = global_data.Base__Error, + Base_Import = global_data.Base__Import, + Base_Monad = global_data.Base__Monad, + Base_Applicative = global_data.Base__Applicative, + compare = Base_Import[237], + hash_fold_t = Base_Import[212], + t_of_sexp = Base_Import[173], + sexp_of_t = Base_Import[149], + cst_Option_value_exn = "Option.value_exn", + cst_Option_value_exn_None = "Option.value_exn None"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[194], a_sexp_grammar); + } + function is_none(param){return param ? 0 : 1;} + function is_some(param){return param ? 1 : 0;} + function value_map(o, default$0, f){ + if(! o) return default$0; + var x = o[1]; + return caml_call1(f, x); + } + function iter(o, f){ + if(! o) return 0; + var a = o[1]; + return caml_call1(f, a); + } + function invariant(f, t){return iter(t, f);} + function call(x, f){ + if(! f) return 0; + var f$0 = f[1]; + return caml_call1(f$0, x); + } + function value(t, default$0){ + if(! t) return default$0; + var x = t[1]; + return x; + } + function value_exn(here, error, message, t){ + if(t){var x = t[1]; return x;} + if(here){ + var p = here[1]; + if(error) + var + e = error[1], + _g_ = + caml_call2 + (Base_Import[150], Base_Error[6], Base_Source_code_position0[8]), + _h_ = value(message, cst), + _i_ = caml_call5(Base_Error[17], 0, 0, _h_, [0, e, p], _g_); + else if(message) + var + m = message[1], + _i_ = + caml_call5(Base_Error[17], 0, 0, m, p, Base_Source_code_position0[8]); + else + var + _i_ = + caml_call5 + (Base_Error[17], + 0, + 0, + cst_Option_value_exn, + p, + Base_Source_code_position0[8]); + var error$0 = _i_; + } + else if(error){ + var e$0 = error[1]; + if(message) + var m$0 = message[1], _j_ = caml_call2(Base_Error[20], e$0, m$0); + else + var _j_ = e$0; + var error$0 = _j_; + } + else if(message) + var m$1 = message[1], error$0 = caml_call1(Base_Error[12], m$1); + else + var error$0 = caml_call1(Base_Error[12], cst_Option_value_exn_None); + return caml_call1(Base_Error[29], error$0); + } + function value_or_thunk(o, default$0){ + if(! o) return caml_call1(default$0, 0); + var x = o[1]; + return x; + } + function to_array(t){if(! t) return [0]; var x = t[1]; return [0, x];} + function to_list(t){if(! t) return 0; var x = t[1]; return [0, x, 0];} + function min_elt(t, param){return t;} + function max_elt(t, param){return t;} + function sum(M){return function(t, f){return value_map(t, M[1], f);};} + function for_all(t, f){ + if(! t) return 1; + var x = t[1]; + return caml_call1(f, x); + } + function exists(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x); + } + function mem(t, a, equal){ + if(! t) return 0; + var a$0 = t[1]; + return caml_call2(equal, a, a$0); + } + function length(t){return t ? 1 : 0;} + function fold(t, init, f){ + if(! t) return init; + var x = t[1]; + return caml_call2(f, init, x); + } + function count(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a) ? 1 : 0; + } + function find(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x) ? t : 0; + } + function find_map(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a); + } + function equal(f, t$0, t){ + if(t$0){ + if(t){var x = t[1], x$0 = t$0[1]; return caml_call2(f, x$0, x);} + } + else if(! t) return 1; + return 0; + } + function some(x){return [0, x];} + function first_some(x, y){return x ? x : y;} + function some_if(cond, x){return cond ? [0, x] : 0;} + function merge(a, b, f){ + if(a){ + if(b){var b$0 = b[1], a$0 = a[1]; return [0, caml_call2(f, a$0, b$0)];} + var x = a; + } + else + var x = b; + return x; + } + function filter(t, f){ + if(t){var v = t[1]; if(caml_call1(f, v)) return t;} + return 0; + } + function try_with(f){ + try{var x = caml_call1(f, 0);}catch(_f_){return 0;} + return [0, x]; + } + function try_with_join(f){ + try{var x = caml_call1(f, 0); return x;}catch(_e_){return 0;} + } + function _a_(t, f){ + if(! t) return 0; + var a = t[1]; + return [0, caml_call1(f, a)]; + } + function apply(f, x){if(! f) return 0; var f$0 = f[1]; return _a_(x, f$0);} + function return$0(x){return [0, x];} + var map = [0, -198771759, _a_]; + function bind(o, f){ + if(! o) return 0; + var x = o[1]; + return caml_call1(f, x); + } + var + _b_ = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = _b_[1], + Monad_infix = _b_[3], + bind$0 = _b_[4], + join = _b_[7], + ignore_m = _b_[8], + Let_syntax = _b_[11], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _c_ = caml_call3(Base_Container[9], fold, init, f); + return function(_d_){return caml_call2(_c_, _d_, t);}; + } + var + Base_Option = + [0, + compare, + hash_fold_t, + t_sexp_grammar, + equal, + invariant, + t_of_sexp, + sexp_of_t, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + value, + value_exn, + value_map, + value_or_thunk, + fold, + mem, + length, + iter, + exists, + for_all, + find, + find_map, + to_list, + to_array, + call, + merge, + filter, + try_with, + try_with_join, + some, + first_some, + some_if, + is_none, + is_some, + is_none, + fold_result, + fold_until, + min_elt, + max_elt, + count, + sum]; + runtime.caml_register_global(9, Base_Option, "Base__Option"); + return; + } + (globalThis)); + +//# 10698 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + cst_Sexpable_Of_stringable_t_o = + "Sexpable.Of_stringable.t_of_sexp expected an atom, but got a list"; + function Of_sexpable(Sexpable, M){ + function t_of_sexp(sexp){ + var s = caml_call1(Sexpable[1], sexp); + try{var _i_ = caml_call1(M[2], s); return _i_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){ + var _h_ = caml_call1(M[1], t); + return caml_call1(Sexpable[2], _h_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable1(Sexpable, M){ + function t_of_sexp(a_of_sexp, sexp){ + var s = caml_call2(Sexpable[1], a_of_sexp, sexp); + try{var _g_ = caml_call1(M[2], s); return _g_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, t){ + var _f_ = caml_call1(M[1], t); + return caml_call2(Sexpable[2], sexp_of_a, _f_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable2(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, sexp){ + var s = caml_call3(Sexpable[1], a_of_sexp, b_of_sexp, sexp); + try{var _e_ = caml_call1(M[2], s); return _e_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, t){ + var _d_ = caml_call1(M[1], t); + return caml_call3(Sexpable[2], sexp_of_a, sexp_of_b, _d_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable3(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + var s = caml_call4(Sexpable[1], a_of_sexp, b_of_sexp, c_of_sexp, sexp); + try{var _c_ = caml_call1(M[2], s); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, sexp_of_c, t){ + var _b_ = caml_call1(M[1], t); + return caml_call4(Sexpable[2], sexp_of_a, sexp_of_b, sexp_of_c, _b_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_stringable(M){ + function t_of_sexp(sexp){ + if(0 !== sexp[0]) + return caml_call2 + (Base_Import[159], cst_Sexpable_Of_stringable_t_o, sexp); + var s = sexp[1]; + try{var _a_ = caml_call1(M[1], s); return _a_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){return [0, caml_call1(M[2], t)];} + return [0, t_of_sexp, sexp_of_t]; + } + var + Base_Sexpable = + [0, + Of_sexpable, + Of_sexpable1, + Of_sexpable2, + Of_sexpable3, + Of_stringable]; + runtime.caml_register_global(2, Base_Sexpable, "Base__Sexpable"); + return; + } + (globalThis)); + +//# 11151 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Indexed_container_intf = [0]; + runtime.caml_register_global + (0, Base_Indexed_container_intf, "Base__Indexed_container_intf"); + return; + } + (globalThis)); + +//# 11162 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Container = global_data.Base__Container, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iteri(fold, t, f){ + caml_call3 + (fold, t, 0, function(i, x){caml_call2(f, i, x); return i + 1 | 0;}); + return 0; + } + function foldi(fold, t, init, f){ + var i = [0, 0]; + return caml_call3 + (fold, + t, + init, + function(acc, v){ + var acc$0 = caml_call3(f, i[1], acc, v); + i[1] = i[1] + 1 | 0; + return acc$0; + }); + } + function counti(foldi, t, f){ + return caml_call3 + (foldi, + t, + 0, + function(i, n, a){return caml_call2(f, i, a) ? n + 1 | 0 : n;}); + } + function existsi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _d_ = caml_call2(f, i, x); + return _d_ ? caml_call1(r, 1) : _d_; + }); + return 0; + }); + } + function for_alli(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _c_ = 1 - caml_call2(f, i, x); + return _c_ ? caml_call1(r, 0) : _c_; + }); + return 1; + }); + } + function find_mapi(iteri, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + t, + function(i, x){ + var res = caml_call2(f, i, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function findi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _b_ = caml_call2(f, i, x); + return _b_ ? caml_call1(r, [0, [0, i, x]]) : _b_; + }); + return 0; + }); + } + function Make_gen(T){ + var + include = caml_call1(Base_Container[18], [0, T[1], T[2], T[3]]), + length = include[1], + is_empty = include[2], + iter = include[3], + fold = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + match = T[4]; + if(typeof match === "number") + var iteri$0 = function(t, f){return iteri(fold, t, f);}; + else + var iteri$1 = match[2], iteri$0 = iteri$1; + var match$0 = T[5]; + if(typeof match$0 === "number") + var foldi$0 = function(t, init, f){return foldi(fold, t, init, f);}; + else + var foldi$1 = match$0[2], foldi$0 = foldi$1; + function counti$0(t, f){return counti(foldi$0, t, f);} + function existsi$0(t, f){return existsi(iteri$0, t, f);} + function for_alli$0(t, f){return for_alli(iteri$0, t, f);} + function find_mapi$0(t, f){return find_mapi(iteri$0, t, f);} + function findi$0(t, f){return findi(iteri$0, t, f);} + return [0, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi$0, + for_alli$0, + counti$0, + findi$0, + find_mapi$0]; + } + function _a_(T){ + var + C = caml_call1(Base_Container[17], [0, T[1], T[2], T[3], T[4]]), + mem = C[1], + fold = T[2], + iter = T[3], + length = T[4], + iteri = T[5], + foldi = T[6], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + } + var + Base_Indexed_container = + [0, + foldi, + iteri, + counti, + existsi, + for_alli, + findi, + find_mapi, + function(T){ + var + C = caml_call1(Base_Container[16], [0, T[1], T[2], T[3]]), + mem = C[1], + fold = T[1], + iter = T[2], + length = T[3], + iteri = T[4], + foldi = T[5], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + }, + _a_, + Make_gen]; + runtime.caml_register_global + (2, Base_Indexed_container, "Base__Indexed_container"); + return; + } + (globalThis)); + +//# 11463 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Both$0 = "Both", + cst_Left$0 = "Left", + cst_Right$0 = "Right", + cst_Sequence_nth$1 = "Sequence.nth", + cst_both = "both", + cst_left = "left", + cst_right = "right", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_025 = "sequence.ml.Merge_with_duplicates_element.t", + Base_List1 = global_data.Base__List1, + Base_With_return = global_data.Base__With_return, + Base_Import = global_data.Base__Import, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Result = global_data.Base__Result, + Base_Container = global_data.Base__Container, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + Base_Monad = global_data.Base__Monad, + _j_ = [0, 0], + cst_Sequence_cycle_list_exn = "Sequence.cycle_list_exn", + cst_Sequence_drop = "Sequence.drop", + cst_Sequence_take = "Sequence.take", + cst_Sequence_sub = "Sequence.sub", + cst_Sequence_reduce_exn = "Sequence.reduce_exn", + cst_Sequence_find_exn = "Sequence.find_exn", + cst_Sequence_chunks_exn = "Sequence.chunks_exn", + cst_Sequence_tl_exn = "Sequence.tl_exn", + cst_hd_exn = "hd_exn", + cst_Both = cst_Both$0, + cst_Right = cst_Right$0, + cst_Left = cst_Left$0, + _g_ = [0, cst_Left$0], + _h_ = [0, cst_Right$0], + _i_ = [0, cst_Both$0], + cst_Sequence_nth$0 = cst_Sequence_nth$1, + cst_Sequence_nth = cst_Sequence_nth$1, + _f_ = [0, "src/sequence.ml", 259, 14], + _e_ = [0, 0, 0], + _a_ = [0, "Done"], + _b_ = [0, "Skip"], + _c_ = [0, "Yield"]; + function sexp_of_t(of_a_001, of_s_002, param){ + if(typeof param === "number") return _a_; + if(0 === param[0]){ + var arg0_003 = param[1], res0_004 = caml_call1(of_s_002, arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + } + var + arg1_006 = param[2], + arg0_005 = param[1], + res0_007 = caml_call1(of_a_001, arg0_005), + res1_008 = caml_call1(of_s_002, arg1_006); + return [1, [0, _c_, [0, res0_007, [0, res1_008, 0]]]]; + } + var Step = [0, sexp_of_t]; + function next_step(param){ + var f = param[2], s = param[1], match = caml_call1(f, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, s$0, f]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, s$1, f]]; + } + function delayed_fold_step(s, init, f, finish){ + function loop(s, next, finish, f, acc){ + var match = caml_call1(next, s); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){ + var s$0 = match[1]; + return caml_call3 + (f, + acc, + 0, + function(_Z_){return loop(s$0, next, finish, f, _Z_);}); + } + var s$1 = match[2], a = match[1]; + return caml_call3 + (f, + acc, + [0, a], + function(_Y_){return loop(s$1, next, finish, f, _Y_);}); + } + var next = s[2], s$0 = s[1]; + return loop(s$0, next, finish, f, init); + } + var Expert = [0, next_step, delayed_fold_step]; + function unfold_step(init, f){return [0, init, f];} + function unfold(init, f){ + return [0, + init, + function(s){ + var match = caml_call1(f, s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [1, a, s$0]; + }]; + } + function unfold_with(s, init, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, init, s$0], + function(param){ + var s = param[2], seed = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, seed, s$0]]; + } + var + s$1 = match[2], + a = match[1], + match$0 = caml_call2(f, seed, a); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var seed$0 = match$0[1]; + return [0, [0, seed$0, s$1]]; + } + var seed$1 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, seed$1, s$1]]; + }]; + } + function unfold_with_and_finish + (s, init, running_step, inner_finished, finishing_step){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -172306698, [0, init, s$0]], + function(state){ + if(301075099 <= state[1]){ + var + state$0 = state[2], + match = caml_call1(finishing_step, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var state$1 = match[1]; + return [0, [0, 301075099, state$1]]; + } + var state$2 = match[2], y = match[1]; + return [1, y, [0, 301075099, state$2]]; + } + var + match$0 = state[2], + inner_state = match$0[2], + state$3 = match$0[1], + match$1 = caml_call1(next, inner_state); + if(typeof match$1 === "number") + return [0, [0, 301075099, caml_call1(inner_finished, state$3)]]; + if(0 === match$1[0]){ + var inner_state$0 = match$1[1]; + return [0, [0, -172306698, [0, state$3, inner_state$0]]]; + } + var + inner_state$1 = match$1[2], + x = match$1[1], + match$2 = caml_call2(running_step, state$3, x); + if(typeof match$2 === "number") return 0; + if(0 === match$2[0]){ + var state$4 = match$2[1]; + return [0, [0, -172306698, [0, state$4, inner_state$1]]]; + } + var state$5 = match$2[2], y$0 = match$2[1]; + return [1, y$0, [0, -172306698, [0, state$5, inner_state$1]]]; + }]; + } + function of_list(l){ + return [0, + l, + function(param){ + if(! param) return 0; + var l = param[2], x = param[1]; + return [1, x, l]; + }]; + } + function fold(t, init, f){ + var next = t[2], seed$2 = t[1], seed = seed$2, v = init; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return v; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var + seed$1 = match[2], + a = match[1], + v$0 = caml_call2(f, v, a), + seed = seed$1, + v = v$0; + } + } + function to_list_rev(t){ + return fold(t, 0, function(l, x){return [0, x, l];}); + } + function to_list(param){ + var next = param[2], s = param[1]; + function to_list(s, next, i){ + var s$0 = s; + for(;;){ + if(0 === i){ + var t = [0, s$0, next], _X_ = to_list_rev(t); + return caml_call1(Base_List1[21], _X_); + } + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, a, to_list(s$2, next, caml_call2(Base_Import[93], i, 1))]; + } + } + return to_list(s, next, 500); + } + function sexp_of_t$0(sexp_of_a, t){ + var _W_ = to_list(t); + return caml_call2(Base_Import[152], sexp_of_a, _W_); + } + function range(opt, _V_, _U_, start_v, stop_v){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_V_) var sth$0 = _V_[1], start = sth$0; else var start = 104758188; + if(_U_) var sth$1 = _U_[1], stop = sth$1; else var stop = -160346914; + var + step = + 104758188 <= stop + ? 0 + <= stride + ? function + (i){ + return stop_v < i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i < stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : 0 + <= stride + ? function + (i){ + return stop_v <= i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i <= stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + }, + init = + 104758188 <= start + ? start_v + : caml_call2(Base_Import[91], start_v, stride); + return [0, init, step]; + } + function of_lazy(t_lazy){ + return [0, + t_lazy, + function(t_lazy){ + var _T_ = caml_obj_tag(t_lazy); + if(250 === _T_) + var match = t_lazy[1]; + else{ + var switch$0 = 0; + if(246 !== _T_ && 244 !== _T_){ + var match = t_lazy; + switch$0 = 1; + } + if(! switch$0) + var match = caml_call1(CamlinternalLazy[2], t_lazy); + } + var next = match[2], s = match[1], match$0 = caml_call1(next, s); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$0 = match$0[1], v = [0, s$0, next]; + return [0, v]; + } + var s$1 = match$0[2], x = match$0[1], v$0 = [0, s$1, next]; + return [1, x, v$0]; + }]; + } + function _d_(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var s$0 = match[2], a = match[1]; + return [1, caml_call1(f, a), s$0]; + }]; + } + function mapi(t, f){ + var next = t[2], s = t[1]; + return [0, + [0, 0, s], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var + s$1 = match[2], + a = match[1], + _S_ = [0, caml_call2(Base_Import[91], i, 1), s$1]; + return [1, caml_call2(f, i, a), _S_]; + }]; + } + function folding_map(t, init, f){ + return unfold_with + (t, + init, + function(acc, x){ + var + match = caml_call2(f, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, acc$0]; + }); + } + function folding_mapi(t, init, f){ + return unfold_with + (t, + [0, 0, init], + function(param, x){ + var + acc = param[2], + i = param[1], + match = caml_call3(f, i, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, [0, caml_call2(Base_Import[91], i, 1), acc$0]]; + }); + } + function filter(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var a = match[1], s$0 = match[2]; + if(caml_call1(f, a)) return [1, a, s$0]; + var s$1 = match[2]; + return [0, s$1]; + }]; + } + function filteri(t, f){ + var _Q_ = Base_Import[127]; + function _R_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return _d_(filter(mapi(t, function(i, s){return [0, i, s];}), _R_), _Q_); + } + function length(t){ + var next = t[2], seed = t[1], i = 0, s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return i; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s = s$1; + } + } + function to_array(t){ + var + match = + fold + (t, + _e_, + function(param, x){ + var i = param[2], l = param[1]; + return [0, [0, x, l], caml_call2(Base_Import[91], i, 1)]; + }), + len = match[2], + l = match[1]; + if(! l) return [0]; + var + l$0 = l[2], + x = l[1], + a = caml_call2(Base_Array0[4], len, x), + i$1 = caml_call2(Base_Import[93], len, 2), + i = i$1, + l$1 = l$0; + for(;;){ + if(l$1){ + var l$2 = l$1[2], x$0 = l$1[1]; + runtime.caml_check_bound(a, i)[1 + i] = x$0; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, l$1 = l$2; + continue; + } + if(-1 === i) return a; + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + } + function find(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(caml_call1(f, a)) return [0, a]; + var s$0 = match[2]; + } + var s = s$0; + } + } + function find_map(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call1(f, a); + if(some_b) return some_b; + var s = s$1; + } + } + function find_mapi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call2(f, i, a); + if(some_b) return some_b; + var i$0 = caml_call2(Base_Import[91], i, 1), s = s$1, i = i$0; + } + } + function for_all(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(! caml_call1(f, a)) return 0; + var s$0 = match[2]; + } + var s = s$0; + } + } + function for_alli(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(! caml_call2(f, i, a)) return 0; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function exists(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{var a = match[1]; if(caml_call1(f, a)) return 1; var s$0 = match[2]; + } + var s = s$0; + } + } + function existsi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(caml_call2(f, i, a)) return 1; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function iter(t, f){ + var next = t[2], seed$2 = t[1], seed = seed$2; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var seed$1 = match[2], a = match[1]; + caml_call1(f, a); + var seed = seed$1; + } + } + function is_empty(t){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 !== match[0]) return 0; + var s$0 = match[1], s = s$0; + } + } + function mem(t, a, equal){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var b = match[1]; + if(caml_call2(equal, a, b)) return 1; + var s$0 = match[2]; + } + var s = s$0; + } + } + var empty = [0, 0, function(param){return 0;}]; + function bind(t, f){ + return [0, + [0, empty, t], + function(param){ + var + rest = param[2], + match = param[1], + next = match[2], + seed = match[1], + match$0 = caml_call1(next, seed); + if(typeof match$0 === "number"){ + var + next$0 = rest[2], + seed$0 = rest[1], + match$1 = caml_call1(next$0, seed$0); + if(typeof match$1 === "number") return 0; + if(0 === match$1[0]){ + var s = match$1[1]; + return [0, [0, empty, [0, s, next$0]]]; + } + var s$0 = match$1[2], a = match$1[1]; + return [0, [0, caml_call1(f, a), [0, s$0, next$0]]]; + } + if(0 === match$0[0]){ + var s$1 = match$0[1]; + return [0, [0, [0, s$1, next], rest]]; + } + var s$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, [0, s$2, next], rest]]; + }]; + } + function return$0(x){ + return [0, + [0, x], + function(param){ + if(! param) return 0; + var x = param[1]; + return [1, x, 0]; + }]; + } + var + map = [0, -198771759, _d_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function nth(s, n){ + if(0 > n) return 0; + var next = s[2], s$3 = s[1], i = n, s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(caml_call2(Base_Import[128], i, 0)) return [0, a]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, s$0 = s$2; + } + } + function nth_exn(s, n){ + if(0 > n) return caml_call1(Base_Import[126], cst_Sequence_nth$0); + var match = nth(s, n); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_nth); + var x = match[1]; + return x; + } + function compare(cmp_a, cmp_b, a_011, b_012){ + if(caml_call2(Base_Ppx_compare_lib[1], a_011, b_012)) return 0; + switch(a_011[0]){ + case 0: + var a_013 = a_011[1]; + if(0 !== b_012[0]) return -1; + var b_014 = b_012[1]; + return caml_call2(cmp_a, a_013, b_014); + case 1: + var a_015 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + var b_016 = b_012[1]; return caml_call2(cmp_b, a_015, b_016); + default: return -1; + } + break; + default: + var a_019 = a_011[2], a_017 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + return 1; + default: + var + b_020 = b_012[2], + b_018 = b_012[1], + n = caml_call2(cmp_a, a_017, b_018); + return 0 === n ? caml_call2(cmp_b, a_019, b_020) : n; + } + } + return 1; + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + switch(arg[0]){ + case 0: + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + case 1: + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + default: + var + a1 = arg[2], + a0$1 = arg[1], + hsv$2 = caml_call2(Base_Hash[3], hsv, 2), + hsv$3 = caml_call2(hash_fold_a, hsv$2, a0$1); + return caml_call2(hash_fold_b, hsv$3, a1); + } + } + function t_of_sexp(of_a_021, of_b_022, sexp_027){ + if(0 === sexp_027[0]){ + var _M_ = sexp_027[1], switch$0 = 0; + if(caml_string_notequal(_M_, cst_Both$0)){ + var switch$1 = 0; + if(caml_string_notequal(_M_, cst_Left$0)){ + var switch$2 = 0; + if(caml_string_notequal(_M_, cst_Right$0)){ + if(caml_string_notequal(_M_, cst_both)) + if(caml_string_notequal(_M_, cst_left)) + if(caml_string_notequal(_M_, cst_right)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else{ + var _N_ = sexp_027[1]; + if(! _N_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_025, sexp_027); + var _O_ = _N_[1]; + if(0 !== _O_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_025, sexp_027); + var tag_028 = _O_[1], switch$3 = 0; + if(caml_string_notequal(tag_028, cst_Both$0)){ + var switch$4 = 0; + if(caml_string_notequal(tag_028, cst_Left$0)){ + var switch$5 = 0; + if(caml_string_notequal(tag_028, cst_Right$0)){ + if(caml_string_notequal(tag_028, cst_both)) + if(caml_string_notequal(tag_028, cst_left)) + if(caml_string_notequal(tag_028, cst_right)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5){ + var sexp_args_034 = _N_[2]; + if(sexp_args_034 && ! sexp_args_034[2]){ + var + arg0_035 = sexp_args_034[1], + res0_036 = caml_call1(of_b_022, arg0_035); + return [1, res0_036]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + else + switch$4 = 1; + if(switch$4){ + var sexp_args_029 = _N_[2]; + if(sexp_args_029 && ! sexp_args_029[2]){ + var + arg0_030 = sexp_args_029[1], + res0_031 = caml_call1(of_a_021, arg0_030); + return [0, res0_031]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + if(! switch$3){ + var sexp_args_039 = _N_[2]; + if(sexp_args_039){ + var _P_ = sexp_args_039[2]; + if(_P_ && ! _P_[2]){ + var + arg1_041 = _P_[1], + arg0_040 = sexp_args_039[1], + res0_042 = caml_call1(of_a_021, arg0_040), + res1_043 = caml_call1(of_b_022, arg1_041); + return [2, res0_042, res1_043]; + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_025, sexp_027); + } + function sexp_of_t$1(of_a_046, of_b_047, param){ + switch(param[0]){ + case 0: + var arg0_048 = param[1], res0_049 = caml_call1(of_a_046, arg0_048); + return [1, [0, _g_, [0, res0_049, 0]]]; + case 1: + var arg0_050 = param[1], res0_051 = caml_call1(of_b_047, arg0_050); + return [1, [0, _h_, [0, res0_051, 0]]]; + default: + var + arg1_053 = param[2], + arg0_052 = param[1], + res0_054 = caml_call1(of_a_046, arg0_052), + res1_055 = caml_call1(of_b_047, arg1_053); + return [1, [0, _i_, [0, res0_054, [0, res1_055, 0]]]]; + } + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Left, [0, [0, a_sexp_grammar, 0]]]], + [0, + [1, [0, cst_Right, [0, [0, b_sexp_grammar, 0]]]], + [0, + [1, + [0, + cst_Both, + [0, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]]], + 0]]]]]; + } + var + Merge_with_duplicates_element = + [0, compare, hash_fold_t, t_of_sexp, sexp_of_t$1, t_sexp_grammar]; + function merge_with_duplicates(param, _L_, compare){ + var next2 = _L_[2], s2 = _L_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [1, b], [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, [0, a], [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 <= comparison + ? 0 + === comparison + ? [1, [2, a, b$0], [0, [0, s1$1], [0, s2$3]]] + : [1, [1, b$0], [0, s1, [0, s2$3]]] + : [1, [0, a], [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function merge_deduped_and_sorted(s1, s2, compare){ + function _K_(param){var x = param[1]; return x;} + return caml_call2(map$0, merge_with_duplicates(s1, s2, compare), _K_); + } + function merge_sorted(param, _J_, compare){ + var next2 = _J_[2], s2 = _J_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, b, [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, a, [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 < comparison + ? [1, b$0, [0, s1, [0, s2$3]]] + : [1, a, [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function hd(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[1]; + return [0, a]; + } + } + function hd_exn(s){ + var match = hd(s); + if(! match) return caml_call1(Base_Import[124], cst_hd_exn); + var a = match[1]; + return a; + } + function tl(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") + var match$0 = 0; + else{ + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[2], match$0 = [0, a]; + } + if(! match$0) return 0; + var s$3 = match$0[1]; + return [0, [0, s$3, next]]; + } + } + function tl_eagerly_exn(s){ + var match = tl(s); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_tl_exn); + var s$0 = match[1]; + return s$0; + } + function lift_identity(next, s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, 316735838, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, 316735838, s$1]]; + } + function next(s){ + var next = s[2], s$3 = s[1], s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, [0, a, [0, s$2, next]]]; + } + } + function filter_opt(s){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var match$0 = match[1]; + if(match$0){ + var s$1 = match[2], a = match$0[1]; + return [1, a, s$1]; + } + var s$2 = match[2]; + return [0, s$2]; + }]; + } + function filter_map(s, f){return filter_opt(caml_call2(map$0, s, f));} + function filter_mapi(s, f){ + function _I_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return filter_map(mapi(s, function(i, s){return [0, i, s];}), _I_); + } + function split_n(s, n){ + var next = s[2], s$3 = s[1], s$0 = s$3, i = n, accum = 0; + for(;;){ + if(0 >= i) return [0, caml_call1(Base_List1[21], accum), [0, s$0, next]]; + var match = caml_call1(next, s$0); + if(typeof match === "number") + return [0, caml_call1(Base_List1[21], accum), empty]; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + a = match[1], + accum$0 = [0, a, accum], + i$0 = caml_call2(Base_Import[93], i, 1), + s$0 = s$2, + i = i$0, + accum = accum$0; + } + } + function chunks_exn(t, n){ + return 0 < n + ? [0, + t, + function(t){ + var match = split_n(t, n), xs = match[1]; + if(! xs) return 0; + var t$0 = match[2]; + return [1, xs, t$0]; + }] + : caml_call1(Base_Import[126], cst_Sequence_chunks_exn); + } + function findi(s, f){ + function _H_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return find(mapi(s, function(i, s){return [0, i, s];}), _H_); + } + function find_exn(s, f){ + var match = find(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_find_exn); + var x = match[1]; + return x; + } + function append(s1, s2){ + var next2 = s2[2], s2$0 = s2[1], next1 = s1[2], s1$0 = s1[1]; + return [0, + [0, 472258093, s1$0], + function(param){ + if(472258093 <= param[1]){ + var s1 = param[2], match = caml_call1(next1, s1); + if(typeof match === "number") return [0, [0, -630817751, s2$0]]; + if(0 === match[0]){ + var s1$0 = match[1]; + return [0, [0, 472258093, s1$0]]; + } + var s1$1 = match[2], a = match[1]; + return [1, a, [0, 472258093, s1$1]]; + } + var s2 = param[2], match$0 = caml_call1(next2, s2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s2$1 = match$0[1]; + return [0, [0, -630817751, s2$1]]; + } + var s2$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, -630817751, s2$2]]; + }]; + } + function concat_map(s, f){return caml_call2(bind$0, s, f);} + function concat(s){return concat_map(s, function(_G_){return _G_;});} + function concat_mapi(s, f){ + function _F_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return concat_map(mapi(s, function(i, s){return [0, i, s];}), _F_); + } + function zip(param, _D_){ + var next2 = _D_[2], s2 = _D_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var _E_ = param[1], switch$0 = 0; + if(typeof _E_ === "number") + switch$0 = 1; + else if(1 === _E_[0]){ + var match = param[2], s1$0 = _E_[2], a = _E_[1]; + if(typeof match !== "number"){ + if(0 === match[0]){ + var s2$0 = param[2][1]; + return [0, [0, _E_, caml_call1(next2, s2$0)]]; + } + var s2$1 = match[2], b = match[1]; + return [1, [0, a, b], [0, [0, s1$0], [0, s2$1]]]; + } + } + if(! switch$0 && typeof param[2] !== "number"){ + var s2 = param[2], s1 = _E_[1]; + return [0, [0, caml_call1(next1, s1), s2]]; + } + return 0; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function zip_full(param, _C_){ + var next2 = _C_[2], s2 = _C_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [0, -57574468, b], [0, 0, caml_call1(next2, s2$0)]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var match$0 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof match$0 === "number") + return [1, [0, 847852583, a], [0, caml_call1(next1, s1$1), 0]]; + if(0 !== match$0[0]){ + var s2$2 = match$0[2], b$0 = match$0[1]; + return [1, [0, 737457313, [0, a, b$0]], [0, [0, s1$1], [0, s2$2]]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function bounded_length(param, at_most){ + var next = param[2], seed = param[1], i = 0, seed$0 = seed; + for(;;){ + if(at_most < i) return 85047514; + var match = caml_call1(next, seed$0); + if(typeof match === "number") return [0, 16394, i]; + if(0 === match[0]){var seed$1 = match[1], seed$0 = seed$1; continue;} + var + seed$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + seed$0 = seed$2; + } + } + function length_is_bounded_by(opt, max, t){ + if(opt) var sth = opt[1], min = sth; else var min = -1; + if(max){ + var max$0 = max[1], match$0 = bounded_length(t, max$0); + if(typeof match$0 !== "number" && 16394 === match$0[1]){var len = match$0[2]; if(min <= len) return 1;} + return 0; + } + var next = t[2], s = t[1], s$0 = s, acc = 0; + for(;;){ + if(min <= acc) return 1; + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + acc$0 = caml_call2(Base_Import[91], acc, 1), + s$0 = s$2, + acc = acc$0; + } + } + function iteri(s, f){ + function _B_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return iter(mapi(s, function(i, s){return [0, i, s];}), _B_); + } + function foldi(s, init, f){ + function _A_(acc, param){ + var s = param[2], i = param[1]; + return caml_call3(f, i, acc, s); + } + return fold(mapi(s, function(i, s){return [0, i, s];}), init, _A_); + } + function reduce(s, f){ + var match = next(s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [0, fold(s$0, a, f)]; + } + function reduce_exn(s, f){ + var match = reduce(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_reduce_exn); + var res = match[1]; + return res; + } + function group(param, break$0){ + var next = param[2], s = param[1]; + return [0, + [0, [0, 0, s]], + function(param){ + if(! param) return 0; + var + match = param[1], + s = match[2], + acc = match[1], + match$0 = caml_call1(next, s); + if(typeof match$0 !== "number" && 0 === match$0[0]){ + var s$2 = match$0[1]; + return [0, [0, [0, acc, s$2]]]; + } + if(acc){ + if(typeof match$0 === "number") + return [1, caml_call1(Base_List1[21], acc), 0]; + var s$0 = match$0[2], cur = match$0[1], prev = acc[1]; + return caml_call2(break$0, prev, cur) + ? [1, + caml_call1(Base_List1[21], acc), + [0, [0, [0, cur, 0], s$0]]] + : [0, [0, [0, [0, cur, acc], s$0]]]; + } + if(typeof match$0 === "number") return 0; + var s$1 = match$0[2], cur$0 = match$0[1]; + return [0, [0, [0, [0, cur$0, 0], s$1]]]; + }]; + } + function find_consecutive_duplicate(param, equal){ + var next = param[2], s = param[1], last_elt = 0, s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(last_elt){ + var b = last_elt[1]; + if(caml_call2(equal, a, b)) return [0, [0, b, a]]; + } + var last_elt$0 = [0, a], last_elt = last_elt$0, s$0 = s$2; + } + } + function remove_consecutive_duplicates(s, equal){ + return unfold_with + (s, + 0, + function(prev, a){ + if(prev){ + var b = prev[1]; + if(caml_call2(equal, a, b)) return [0, [0, a]]; + } + return [1, a, [0, a]]; + }); + } + function count(s, f){return length(filter(s, f));} + function counti(t, f){return length(filteri(t, f));} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function init(n, f){ + return [0, + 0, + function(i){ + if(n <= i) return 0; + var _z_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_call1(f, i), _z_]; + }]; + } + function sub(s, pos, len){ + var _x_ = pos < 0 ? 1 : 0, _y_ = _x_ || (len < 0 ? 1 : 0); + if(_y_) caml_call1(Base_Import[124], cst_Sequence_sub); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= caml_call2(Base_Import[93], i, pos)) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(pos <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_take); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= i) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + }]; + } + function drop(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_drop); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(len <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var a = match[1], s$1 = match[2]; + return caml_call1(f, a) ? [1, a, s$1] : 0; + }]; + } + function drop_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -557110719, s$0], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var s$0 = param[2], match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$1 = match[1]; + return [0, [0, -557110719, s$1]]; + } + var a = match[1], s$2 = match[2]; + if(caml_call1(f, a)) return [0, [0, -557110719, s$2]]; + var s$3 = match[2]; + return [1, a, [0, 316735838, s$3]]; + }]; + } + function shift_right(s, x){ + var next = s[2], seed = s[1]; + return [0, + [0, -433944719, [0, seed, x]], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var match = param[2], x = match[2], seed = match[1]; + return [1, x, [0, 316735838, seed]]; + }]; + } + function shift_right_with_list(s, l){return append(of_list(l), s);} + var Infix = [0, append]; + function intersperse(s, sep){ + var next = s[2], s$0 = s[1]; + return [0, + [0, 815032112, s$0], + function(param){ + var _w_ = param[1]; + if(815032112 === _w_){ + var s = param[2], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, 815032112, s$0]]; + } + var s$1 = match[2], a = match[1]; + return [1, a, [0, 951752159, s$1]]; + } + if(951752159 > _w_){ + var match$1 = param[2], s$5 = match$1[2], a$1 = match$1[1]; + return [1, a$1, [0, 951752159, s$5]]; + } + var s$2 = param[2], match$0 = caml_call1(next, s$2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$3 = match$0[1]; + return [0, [0, 951752159, s$3]]; + } + var s$4 = match$0[2], a$0 = match$0[1]; + return [1, sep, [0, -571577571, [0, a$0, s$4]]]; + }]; + } + function repeat(x){return [0, x, function(x){return [1, x, x];}];} + function cycle_list_exn(xs){ + if(caml_call1(Base_List1[23], xs)) + caml_call1(Base_Import[126], cst_Sequence_cycle_list_exn); + var s = of_list(xs); + function _v_(param){return s;} + return concat_map(repeat(0), _v_); + } + function cartesian_product(sa, sb){ + return concat_map(sa, function(a){return zip(repeat(a), sb);}); + } + function singleton(x){return caml_call1(return$1, x);} + function delayed_fold(s, init, f, finish){ + function _u_(acc, option, k){ + if(! option) return caml_call1(k, acc); + var a = option[1]; + return caml_call3(f, acc, a, k); + } + return caml_call4(Expert[2], s, init, _u_, finish); + } + function fold_m(bind, return$0, t, init, f){ + function _t_(acc, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, acc), k); + var a = option[1]; + return caml_call2(bind, caml_call2(f, acc, a), k); + } + return caml_call4(Expert[2], t, init, _t_, return$0); + } + function iter_m(bind, return$0, t, f){ + function _s_(param, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, 0), k); + var a = option[1]; + return caml_call2(bind, caml_call1(f, a), k); + } + return caml_call4(Expert[2], t, 0, _s_, return$0); + } + function fold_until(s, init, f, finish){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], match$0 = caml_call2(f, acc, a); + if(0 === match$0[0]){ + var acc$0 = match$0[1], s$0 = s$2, acc = acc$0; + continue; + } + var x = match$0[1]; + return x; + } + } + function fold_result(s, init, f){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(Base_Result[12], acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], e = caml_call2(f, acc, a); + if(0 !== e[0]) return e; + var acc$0 = e[1], s$0 = s$2, acc = acc$0; + } + } + function force_eagerly(t){return of_list(to_list(t));} + function memoize(param){ + var next = param[2], s = param[1]; + function memoize(s){ + return [0, + [246, + function(_r_){ + var s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [1, a, memoize(s$2)]; + } + }]]; + } + function _p_(param){ + var l = param[1], _q_ = caml_obj_tag(l); + if(250 === _q_) return l[1]; + if(246 !== _q_ && 244 !== _q_) return l; + return caml_call1(CamlinternalLazy[2], l); + } + return [0, memoize(s), _p_]; + } + function drop_eagerly(s, len){ + var next = s[2], s$3 = s[1], i = 0, s$0 = s$3; + for(;;){ + if(len <= i) return [0, s$0, next]; + var match = caml_call1(next, s$0); + if(typeof match === "number") return empty; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s$0 = s$2; + } + } + function drop_while_option(param, f){ + var next = param[2], s = param[1], s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], x = match[1]; + if(! caml_call1(f, x)) return [0, [0, x, [0, s$2, next]]]; + var s$0 = s$2; + } + } + function compare$0(compare_a, t1, t2){ + function _l_(r){ + function _m_(param){ + var _n_ = param[1]; + if(737457313 !== _n_) + return 847852583 <= _n_ ? caml_call1(r, 1) : caml_call1(r, -1); + var + match = param[2], + v2 = match[2], + v1 = match[1], + c = caml_call2(compare_a, v1, v2), + _o_ = 0 !== c ? 1 : 0; + return _o_ ? caml_call1(r, c) : _o_; + } + iter(zip_full(t1, t2), _m_); + return 0; + } + return caml_call1(Base_With_return[1], _l_); + } + function equal(equal_a, t1, t2){ + function _k_(param){ + if(737457313 !== param[1]) return 0; + var match = param[2], a2 = match[2], a1 = match[1]; + return caml_call2(equal_a, a1, a2); + } + return for_all(zip_full(t1, t2), _k_); + } + function round_robin(list){ + function next(param){ + var done_stack = param[2], todo_stack = param[1]; + if(! todo_stack) + return caml_call1(Base_List1[23], done_stack) + ? 0 + : [0, [0, caml_call1(Base_List1[21], done_stack), 0]]; + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f = match[2], + s = match[1], + match$0 = caml_call1(f, s); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack]]; + if(0 === match$0[0]){ + var s$0 = match$0[1]; + return [0, [0, [0, [0, s$0, f], todo_stack$0], done_stack]]; + } + var s$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s$1, f], done_stack]]]; + } + var state = [0, list, 0]; + return [0, state, next]; + } + function interleave(param){ + var f1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[3], done_stack = param[2], todo_stack = param[1]; + if(todo_stack){ + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f2 = match[2], + s2 = match[1], + match$0 = caml_call1(f2, s2); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack, s1]]; + if(0 === match$0[0]){ + var s2$0 = match$0[1]; + return [0, [0, todo_stack$0, [0, [0, s2$0, f2], done_stack], s1]]; + } + var s2$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s2$1, f2], done_stack], s1]]; + } + var match$1 = caml_call1(f1, s1); + if(typeof match$1 === "number") + return done_stack + ? [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1]] + : 0; + if(0 === match$1[0]){ + var s1$0 = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1$0]]; + } + var s1$1 = match$1[2], t = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], [0, t, done_stack]), 0, s1$1]]; + } + var state = [0, 0, 0, s1]; + return [0, state, next]; + } + function interleaved_cartesian_product(s1, s2){ + return interleave + (caml_call2 + (map$0, + s1, + function(x1){ + return caml_call2 + (map$0, s2, function(x2){return [0, x1, x2];}); + })); + } + function of_seq(seq){ + return [0, + seq, + function(seq){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var tl = match[2], hd = match[1]; + return [1, hd, tl]; + }]; + } + function to_seq(param){ + var next = param[2], state = param[1]; + function loop(state){ + var state$0 = state; + for(;;){ + var match = caml_call1(next, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var state$1 = match[1], state$0 = state$1; continue;} + var state$2 = match[2], hd = match[1]; + return [0, hd, function(param){return loop(state$2);}]; + } + } + return function(param){return loop(state);}; + } + function return$2(x, k){return caml_call1(k, x);} + function bind$1(m, f, k){ + return caml_call1 + (m, + function(a){var m = caml_call1(f, a); return caml_call1(m, k);}); + } + var + map$1 = + [0, + -198771759, + function(m, f, k){ + return caml_call1 + (m, function(a){return caml_call1(k, caml_call1(f, a));}); + }], + include$0 = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]), + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Let_syntax$0 = include$0[3], + Monad_infix$0 = include$0[4], + bind$2 = include$0[5], + return$3 = include$0[6], + map$2 = include$0[7], + join$0 = include$0[8], + ignore_m$0 = include$0[9], + all$0 = include$0[10], + all_unit$0 = include$0[11]; + function yield$0(e, k){return [0, [1, e, k]];} + function of_sequence(sequence){ + return delayed_fold + (sequence, + 0, + function(param, x, k, f){ + return [0, [1, x, function(param){return caml_call2(k, 0, f);}]]; + }, + return$3); + } + function run(t){ + function init(param){return caml_call1(t, function(param){return _j_;});} + function f(thunk){return caml_call1(thunk, 0)[1];} + return [0, init, f]; + } + var + Base_Sequence = + [0, + sexp_of_t$0, + equal, + compare$0, + mem, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi, + iteri, + existsi, + counti, + findi, + find_mapi, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + empty, + next, + Step, + unfold_step, + unfold, + unfold_with, + unfold_with_and_finish, + nth, + nth_exn, + folding_map, + folding_mapi, + mapi, + filteri, + filter, + merge_deduped_and_sorted, + merge_deduped_and_sorted, + merge_sorted, + Merge_with_duplicates_element, + merge_with_duplicates, + hd, + hd_exn, + tl, + tl_eagerly_exn, + find_exn, + for_alli, + append, + concat, + concat_map, + concat_mapi, + interleave, + round_robin, + zip, + zip_full, + reduce_exn, + reduce, + group, + find_consecutive_duplicate, + remove_consecutive_duplicates, + range, + init, + filter_map, + filter_mapi, + filter_opt, + sub, + take, + drop, + drop_eagerly, + take_while, + drop_while, + drop_while_option, + split_n, + chunks_exn, + shift_right, + shift_right_with_list, + drop, + Infix, + cartesian_product, + interleaved_cartesian_product, + intersperse, + cycle_list_exn, + repeat, + singleton, + delayed_fold, + fold_m, + iter_m, + to_list_rev, + of_list, + of_lazy, + memoize, + force_eagerly, + bounded_length, + length_is_bounded_by, + of_seq, + to_seq, + [0, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + Monad_infix$0, + bind$2, + return$3, + map$2, + join$0, + ignore_m$0, + all$0, + all_unit$0, + yield$0, + of_sequence, + run], + Expert]; + runtime.caml_register_global(48, Base_Sequence, "Base__Sequence"); + return; + } + (globalThis)); + +//# 13251 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_array_ml = "src/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Base_Import = global_data.Base__Import, + Base_Sequence = global_data.Base__Sequence, + Base_Random = global_data.Base__Random, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Container = global_data.Base__Container, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Base_Binary_searchable = global_data.Base__Binary_searchable, + Base_Blit = global_data.Base__Blit, + invalid_argf = Base_Array0[1], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23], + compare = Base_Import[235], + t_of_sexp = Base_Import[177], + sexp_of_t = Base_Import[153], + _g_ = [0, cst_src_array_ml, 858, 8], + cst_Array_transpose_exn = "Array.transpose_exn", + cst_Array_zip_exn = "Array.zip_exn", + cst_Array_random_element_exn_e = "Array.random_element_exn: empty array", + cst_Array_reduce_exn = "Array.reduce_exn", + _d_ = [0, "Array.find_exn: not found"], + _c_ = [0, "Array.findi_exn: not found"], + cst_Array_for_all2_exn = "Array.for_all2_exn", + cst_Array_exists2_exn = "Array.exists2_exn", + cst_Array_fold2_exn = "Array.fold2_exn", + cst_Array_map2_exn = "Array.map2_exn", + cst_Array_iter2_exn = "Array.iter2_exn", + _b_ = + [0, + [11, + "length mismatch in ", + [2, 0, [11, ": ", [4, 0, 0, 0, [11, " <> ", [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _a_ = [0, cst_src_array_ml, 435, 14], + _e_ = [0, "Array.find_map_exn: not found"], + _f_ = [0, "Array.find_mapi_exn: not found"]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[196], a_sexp_grammar); + } + function get(_aL_, _aK_){return caml_check_bound(_aL_, _aK_)[1 + _aK_];} + function set(_aJ_, _aI_, _aH_){ + caml_check_bound(_aJ_, _aI_)[1 + _aI_] = _aH_; + return 0; + } + function swap$0(arr, i, j){ + var tmp = get(arr, i); + set(arr, i, get(arr, j)); + return set(arr, j, tmp); + } + function sort(arr, compare, left, right){ + var _aF_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aF_){ + var pos = _aF_; + a: + for(;;){ + var v = get(arr, pos), final_pos = pos; + for(;;){ + var i_next = caml_call2(Base_Import[93], final_pos, 1); + if(left <= i_next && 0 < caml_call2(compare, get(arr, i_next), v)){ + set(arr, final_pos, get(arr, i_next)); + var final_pos = i_next; + continue; + } + set(arr, final_pos, v); + var _aG_ = pos + 1 | 0; + if(right !== pos){var pos = _aG_; continue a;} + break; + } + break; + } + } + return 0; + } + var Insertion_sort = [0, sort]; + function heapify(arr, compare, root, left, right){ + var root$0 = root; + for(;;){ + var + relative_root = caml_call2(Base_Import[93], root$0, left), + _ay_ = caml_call2(Base_Import[88], 2, relative_root), + _az_ = caml_call2(Base_Import[91], _ay_, left), + left_child = caml_call2(Base_Import[91], _az_, 1), + _aA_ = caml_call2(Base_Import[88], 2, relative_root), + _aB_ = caml_call2(Base_Import[91], _aA_, left), + right_child = caml_call2(Base_Import[91], _aB_, 2), + switch$0 = 0; + if(left_child <= right){ + var _aC_ = get(arr, root$0); + if(0 < caml_call2(compare, get(arr, left_child), _aC_)){var largest = left_child; switch$0 = 1;} + } + if(! switch$0) var largest = root$0; + var switch$1 = 0; + if(right_child <= right){ + var _aD_ = get(arr, largest); + if(0 < caml_call2(compare, get(arr, right_child), _aD_)){var largest$0 = right_child; switch$1 = 1;} + } + if(! switch$1) var largest$0 = largest; + var _aE_ = largest$0 !== root$0 ? 1 : 0; + if(! _aE_) return _aE_; + swap$0(arr, root$0, largest$0); + var root$0 = largest$0; + } + } + function sort$0(arr, compare, left, right){ + var + _at_ = caml_call2(Base_Import[91], left, right), + _au_ = caml_call2(Base_Import[95], _at_, 2); + if(_au_ >= left){ + var i = _au_; + for(;;){ + heapify(arr, compare, i, left, right); + var _av_ = i - 1 | 0; + if(left !== i){var i = _av_; continue;} + break; + } + } + var _aw_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aw_){ + var i$0 = right; + for(;;){ + swap$0(arr, left, i$0); + heapify(arr, compare, left, left, caml_call2(Base_Import[93], i$0, 1)); + var _ax_ = i$0 - 1 | 0; + if(_aw_ !== i$0){var i$0 = _ax_; continue;} + break; + } + } + return 0; + } + var Heap_sort = [0, sort$0]; + function five_element_sort(arr, compare, m1, m2, m3, m4, m5){ + function compare_and_swap(i, j){ + var + _ar_ = get(arr, j), + _as_ = 0 < caml_call2(compare, get(arr, i), _ar_) ? 1 : 0; + return _as_ ? swap$0(arr, i, j) : _as_; + } + compare_and_swap(m1, m2); + compare_and_swap(m4, m5); + compare_and_swap(m1, m3); + compare_and_swap(m2, m3); + compare_and_swap(m1, m4); + compare_and_swap(m3, m4); + compare_and_swap(m2, m5); + compare_and_swap(m2, m3); + return compare_and_swap(m4, m5); + } + function intro_sort(arr, max_depth, compare, left, right){ + var max_depth$0 = max_depth, left$0 = left; + a: + for(;;){ + var + _aq_ = caml_call2(Base_Import[93], right, left$0), + len = caml_call2(Base_Import[91], _aq_, 1); + if(32 >= len) + return caml_call4(Insertion_sort[1], arr, compare, left$0, right); + if(0 > max_depth$0) + return caml_call4(Heap_sort[1], arr, compare, left$0, right); + var + max_depth$1 = caml_call2(Base_Import[93], max_depth$0, 1), + _ap_ = caml_call2(Base_Import[93], right, left$0), + sixth = caml_call2(Base_Import[95], _ap_, 6), + m1 = caml_call2(Base_Import[91], left$0, sixth), + m2 = caml_call2(Base_Import[91], m1, sixth), + m3 = caml_call2(Base_Import[91], m2, sixth), + m4 = caml_call2(Base_Import[91], m3, sixth), + m5 = caml_call2(Base_Import[91], m4, sixth); + five_element_sort(arr, compare, m1, m2, m3, m4, m5); + var + m2_val = get(arr, m2), + m3_val = get(arr, m3), + m4_val = get(arr, m4), + match = + 0 === caml_call2(compare, m2_val, m3_val) + ? [0, m2_val, m3_val, 1] + : 0 + === caml_call2(compare, m3_val, m4_val) + ? [0, m3_val, m4_val, 1] + : [0, m2_val, m4_val, 0], + middle_sorted = match[3], + pivot2 = match[2], + pivot1 = match[1], + l$0 = left$0, + p$1 = left$0, + r$2 = right; + b: + for(;;){ + if(r$2 < p$1){ + intro_sort + (arr, + max_depth$1, + compare, + left$0, + caml_call2(Base_Import[93], l$0, 1)); + if(1 - middle_sorted) intro_sort(arr, max_depth$1, compare, l$0, r$2); + var + left$1 = caml_call2(Base_Import[91], r$2, 1), + max_depth$0 = max_depth$1, + left$0 = left$1; + continue a; + } + var pv = get(arr, p$1); + if(0 > caml_call2(compare, pv, pivot1)){ + swap$0(arr, p$1, l$0); + var + p$0 = caml_call2(Base_Import[91], p$1, 1), + l = caml_call2(Base_Import[91], l$0, 1), + l$0 = l, + p$1 = p$0; + continue; + } + if(0 >= caml_call2(compare, pv, pivot2)){ + var p = caml_call2(Base_Import[91], p$1, 1), p$1 = p; + continue; + } + var r = r$2; + for(;;){ + if(p$1 < r && 0 < caml_call2(compare, get(arr, r), pivot2)){ + var r$0 = caml_call2(Base_Import[93], r, 1), r = r$0; + continue; + } + swap$0(arr, r, p$1); + var r$1 = caml_call2(Base_Import[93], r, 1), r$2 = r$1; + continue b; + } + } + } + } + function sort$1(arr, compare, left, right){ + return intro_sort(arr, 32, compare, left, right); + } + var Intro_sort = [0, sort$1, five_element_sort]; + function sort$2(pos, len, arr, compare){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], pos, len, 0, arr.length - 1), + len$0 = match[2], + pos$0 = match[1], + _an_ = caml_call2(Base_Import[91], pos$0, len$0), + _ao_ = caml_call2(Base_Import[93], _an_, 1); + return caml_call4(Intro_sort[1], arr, compare, pos$0, _ao_); + } + function to_array(t){return t;} + function is_empty(t){return 0 === t.length - 1 ? 1 : 0;} + function is_sorted(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 < caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function is_sorted_strictly(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 <= caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function merge(a1, a2, compare){ + var l1 = a1.length - 1, l2 = a2.length - 1; + if(0 === l1) return caml_call1(copy, a2); + if(0 === l2) return caml_call1(copy, a1); + var _ai_ = a1[1 + caml_call2(Base_Import[93], l1, 1)]; + if(0 <= caml_call2(compare, a2[1], _ai_)) + return caml_call2(append, a1, a2); + var _aj_ = a2[1 + caml_call2(Base_Import[93], l2, 1)]; + if(0 < caml_call2(compare, a1[1], _aj_)) + return caml_call2(append, a2, a1); + var + len = caml_call2(Base_Import[91], l1, l2), + merged = caml_call2(create, len, a1[1]), + a1_index = [0, 0], + a2_index = [0, 0], + _al_ = caml_call2(Base_Import[93], len, 1), + _ak_ = 0; + if(_al_ >= 0){ + var i = _ak_; + for(;;){ + var + use_a1 = + l1 === a1_index[1] + ? 0 + : l2 + === a2_index[1] + ? 1 + : caml_call2 + (compare, a1[1 + a1_index[1]], a2[1 + a2_index[1]]) + <= 0 + ? 1 + : 0; + if(use_a1){ + merged[1 + i] = a1[1 + a1_index[1]]; + a1_index[1] = caml_call2(Base_Import[91], a1_index[1], 1); + } + else{ + merged[1 + i] = a2[1 + a2_index[1]]; + a2_index[1] = caml_call2(Base_Import[91], a2_index[1], 1); + } + var _am_ = i + 1 | 0; + if(_al_ !== i){var i = _am_; continue;} + break; + } + } + return merged; + } + function copy_matrix(_ah_){return caml_call2(map, _ah_, copy);} + function folding_map(t, init, f){ + var acc = [0, init]; + return caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _af_ = caml_call3(Base_Container[9], fold, init, f); + return function(_ag_){return caml_call2(_af_, _ag_, t);}; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function foldi(t, init, f){ + var + acc = [0, init], + _ad_ = caml_call2(Base_Import[93], t.length - 1, 1), + _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + acc[1] = caml_call3(f, i, acc[1], t[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return acc[1]; + } + function folding_mapi(t, init, f){ + var acc = [0, init]; + return caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function concat_map(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(map, t, f))); + } + function concat_mapi(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(mapi, t, f))); + } + function rev_inplace(t){ + var i = [0, 0], j = [0, caml_call2(Base_Import[93], t.length - 1, 1)]; + for(;;){ + if(i[1] >= j[1]) return 0; + caml_call3(swap, t, i[1], j[1]); + caml_call1(Base_Import[130], i); + caml_call1(Base_Import[129], j); + } + } + function rev(t){ + var t$0 = caml_call1(copy, t); + rev_inplace(t$0); + return t$0; + } + function of_list_rev(l){ + if(! l) return [0]; + var + l$0 = l[2], + a = l[1], + _$_ = caml_call1(Base_List[7], l$0), + len = caml_call2(Base_Import[91], 1, _$_), + t = caml_call2(create, len, a), + r = [0, l$0], + _aa_ = caml_call2(Base_Import[93], len, 2); + if(_aa_ >= 0){ + var i = _aa_; + for(;;){ + var match = r[1]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var l$1 = match[2], a$0 = match[1]; + caml_check_bound(t, i)[1 + i] = a$0; + r[1] = l$1; + var _ab_ = i - 1 | 0; + if(0 !== i){var i = _ab_; continue;} + break; + } + } + return t; + } + function of_list_map(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _Z_ = caml_call1(f, hd), + ___ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, ___), _Z_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call1(f, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_mapi(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _X_ = caml_call2(f, 0, hd), + _Y_ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, _Y_), _X_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call2(f, i, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_rev_map(xs, f){ + var t = of_list_map(xs, f); + rev_inplace(t); + return t; + } + function of_list_rev_mapi(xs, f){ + var t = of_list_mapi(xs, f); + rev_inplace(t); + return t; + } + function filter_mapi(t, f){ + var + r = [0, [0]], + k = [0, 0], + _V_ = caml_call2(Base_Import[93], t.length - 1, 1), + _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + var match = caml_call2(f, i, t[1 + i]); + if(match){ + var a = match[1]; + if(0 === k[1]) r[1] = caml_call2(create, t.length - 1, a); + r[1][1 + k[1]] = a; + caml_call1(Base_Import[130], k); + } + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return k[1] === t.length - 1 + ? r[1] + : 0 < k[1] ? caml_call3(sub, r[1], 0, k[1]) : [0]; + } + function filter_map(t, f){ + return filter_mapi(t, function(i, a){return caml_call1(f, a);}); + } + function filter_opt(t){return filter_map(t, function(_T_){return _T_;});} + function check_length2_exn(name, t1, t2){ + var n1 = t1.length - 1, n2 = t2.length - 1, _S_ = n1 !== n2 ? 1 : 0; + return _S_ ? caml_call5(invalid_argf, _b_, name, n1, n2, 0) : _S_; + } + function iter2_exn(t1, t2, f){ + check_length2_exn(cst_Array_iter2_exn, t1, t2); + return caml_call2 + (iteri, t1, function(i, x1){return caml_call2(f, x1, t2[1 + i]);}); + } + function map2_exn(t1, t2, f){ + check_length2_exn(cst_Array_map2_exn, t1, t2); + return caml_call2 + (init, + t1.length - 1, + function(i){return caml_call2(f, t1[1 + i], t2[1 + i]);}); + } + function fold2_exn(t1, t2, init, f){ + check_length2_exn(cst_Array_fold2_exn, t1, t2); + return foldi + (t1, + init, + function(i, ac, x){return caml_call3(f, ac, x, t2[1 + i]);}); + } + function filter(t, f){ + return filter_map(t, function(x){return caml_call1(f, x) ? [0, x] : 0;}); + } + function filteri(t, f){ + return filter_mapi + (t, function(i, x){return caml_call2(f, i, x) ? [0, x] : 0;}); + } + function exists(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call1(f, t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function existsi(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function mem(t, a, equal){return exists(t, caml_call1(equal, a));} + function for_all(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call1(f, t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function for_alli(t, f){ + var + length = t.length - 1, + i = [0, caml_call2(Base_Import[93], length, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function exists2_exn(t1, t2, f){ + check_length2_exn(cst_Array_exists2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function for_all2_exn(t1, t2, f){ + check_length2_exn(cst_Array_for_all2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){caml_call1(Base_Import[129], i); continue;} + result[1] = 0; + continue; + } + return result[1]; + } + } + function equal(equal, t1, t2){ + var _R_ = t1.length - 1 === t2.length - 1 ? 1 : 0; + return _R_ ? for_all2_exn(t1, t2, equal) : _R_; + } + function map_inplace(t, f){ + var _P_ = caml_call2(Base_Import[93], t.length - 1, 1), _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + t[1 + i] = caml_call1(f, t[1 + i]); + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return 0; + } + function findi_internal(t, f, if_found, if_not_found){ + var length = t.length - 1; + if(0 === length) return caml_call1(if_not_found, 0); + var i = [0, 0], found = [0, 0], value_found = [0, t[1]]; + for(;;){ + if(! found[1] && i[1] < length){ + var value = t[1 + i[1]]; + if(caml_call2(f, i[1], value)){ + value_found[1] = value; + found[1] = 1; + } + else + caml_call1(Base_Import[130], i); + continue; + } + return found[1] + ? caml_call2(if_found, i[1], value_found[1]) + : caml_call1(if_not_found, 0); + } + } + function findi(t, f){ + function _N_(param){return 0;} + return findi_internal + (t, f, function(i, value){return [0, [0, i, value]];}, _N_); + } + function findi_exn(t, f){ + function _M_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _c_], 1); + } + return findi_internal + (t, f, function(i, value){return [0, i, value];}, _M_); + } + function find_exn(t, f){ + function _K_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _d_], 1); + } + function _L_(param, value){return value;} + return findi_internal + (t, function(i, x){return caml_call1(f, x);}, _L_, _K_); + } + function find(t, f){ + function _I_(param){var x = param[2]; return x;} + var _J_ = findi(t, function(i, x){return caml_call1(f, x);}); + return caml_call2(Base_Option[21], _J_, _I_); + } + function find_map(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call1(f, value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found = [0, Base_Import[252], _e_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call2(f, i[1], value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found$0 = [0, Base_Import[252], _f_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$0, 1); + var x = match[1]; + return x; + } + function find_consecutive_duplicate(t, equal){ + var n = t.length - 1; + if(1 >= n) return 0; + var result = [0, 0], i = [0, 1], prev = [0, t[1]]; + for(;;){ + if(i[1] >= n) return result[1]; + var cur = t[1 + i[1]]; + if(caml_call2(equal, cur, prev[1])){ + result[1] = [0, [0, prev[1], cur]]; + i[1] = n; + } + else{prev[1] = cur; caml_call1(Base_Import[130], i);} + } + } + function reduce(t, f){ + if(0 === t.length - 1) return 0; + var + r = [0, t[1]], + _G_ = caml_call2(Base_Import[93], t.length - 1, 1), + _F_ = 1; + if(_G_ >= 1){ + var i = _F_; + for(;;){ + r[1] = caml_call2(f, r[1], t[1 + i]); + var _H_ = i + 1 | 0; + if(_G_ !== i){var i = _H_; continue;} + break; + } + } + return [0, r[1]]; + } + function reduce_exn(t, f){ + var match = reduce(t, f); + if(! match) return caml_call1(Base_Import[126], cst_Array_reduce_exn); + var v = match[1]; + return v; + } + var permute = Base_Array_permute[24]; + function random_element_exn(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(is_empty(t)) + return caml_call1(Base_Import[124], cst_Array_random_element_exn_e); + var _E_ = caml_call2(Base_Random[18][6], random_state, t.length - 1); + return caml_check_bound(t, _E_)[1 + _E_]; + } + function random_element(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{var _C_ = [0, random_element_exn([0, random_state], t)]; return _C_;} + catch(_D_){return 0;} + } + function zip(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? 0 + : [0, map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];})]; + } + function zip_exn(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? caml_call1(Base_Import[124], cst_Array_zip_exn) + : map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];}); + } + function unzip(t){ + var n = t.length - 1; + if(0 === n) return [0, [0], [0]]; + var + match = caml_check_bound(t, 0)[1], + y = match[2], + x = match[1], + res1 = caml_call2(create, n, x), + res2 = caml_call2(create, n, y), + _A_ = caml_call2(Base_Import[93], n, 1), + _z_ = 1; + if(_A_ >= 1){ + var i = _z_; + for(;;){ + var + match$0 = caml_check_bound(t, i)[1 + i], + y$0 = match$0[2], + x$0 = match$0[1]; + caml_check_bound(res1, i)[1 + i] = x$0; + caml_check_bound(res2, i)[1 + i] = y$0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + return [0, res1, res2]; + } + function sorted_copy(t, compare){ + var t1 = caml_call1(copy, t); + sort$2(0, 0, t1, compare); + return t1; + } + function partitioni_tf(t, f){ + var + both = + caml_call2 + (mapi, + t, + function(i, x){return caml_call2(f, i, x) ? [0, x] : [1, x];}), + trues = + filter_map + (both, + function(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + }), + falses = + filter_map + (both, + function(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + }); + return [0, trues, falses]; + } + function partition_tf(t, f){ + return partitioni_tf(t, function(i, x){return caml_call1(f, x);}); + } + function last(t){ + var _y_ = caml_call2(Base_Import[93], t.length - 1, 1); + return caml_check_bound(t, _y_)[1 + _y_]; + } + function to_sequence_mutable(t){ + function _w_(i){ + if(t.length - 1 <= i) return 0; + var _x_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_check_bound(t, i)[1 + i], _x_]; + } + return caml_call2(Base_Sequence[41], 0, _w_); + } + function to_sequence(t){return to_sequence_mutable(caml_call1(copy, t));} + function cartesian_product(t1, t2){ + if(! is_empty(t1) && ! is_empty(t2)){ + var + n1 = t1.length - 1, + n2 = t2.length - 1, + _l_ = caml_check_bound(t2, 0)[1], + _m_ = [0, caml_check_bound(t1, 0)[1], _l_], + t = caml_call2(create, caml_call2(Base_Import[88], n1, n2), _m_), + r = [0, 0], + _o_ = caml_call2(Base_Import[93], n1, 1), + _n_ = 0; + if(_o_ >= 0){ + var i1 = _n_; + for(;;){ + var _q_ = caml_call2(Base_Import[93], n2, 1), _p_ = 0; + if(_q_ >= 0){ + var i2 = _p_; + for(;;){ + var + _s_ = caml_check_bound(t2, i2)[1 + i2], + _t_ = [0, caml_check_bound(t1, i1)[1 + i1], _s_], + _u_ = r[1]; + caml_check_bound(t, _u_)[1 + _u_] = _t_; + caml_call1(Base_Import[130], r); + var _v_ = i2 + 1 | 0; + if(_q_ !== i2){var i2 = _v_; continue;} + break; + } + } + var _r_ = i1 + 1 | 0; + if(_o_ !== i1){var i1 = _r_; continue;} + break; + } + } + return t; + } + return [0]; + } + function transpose(tt){ + if(0 === tt.length - 1) return [0, [0]]; + var width = tt.length - 1, depth = caml_check_bound(tt, 0)[1].length - 1; + return exists(tt, function(t){return t.length - 1 !== depth ? 1 : 0;}) + ? 0 + : [0, + caml_call2 + (init, + depth, + function(d){ + return caml_call2 + (init, + width, + function(w){ + return caml_check_bound(caml_check_bound(tt, w)[1 + w], d) + [1 + d]; + }); + })]; + } + function transpose_exn(tt){ + var match = transpose(tt); + if(! match) return caml_call1(Base_Import[126], cst_Array_transpose_exn); + var tt$0 = match[1]; + return tt$0; + } + function get$0(_k_, _j_){return caml_check_bound(_k_, _j_)[1 + _j_];} + function length(_i_){return _i_.length - 1;} + var + include = caml_call1(Base_Binary_searchable[2], [0, get$0, length]), + binary_search = include[1], + binary_search_segmented = include[2]; + function length$0(_h_){return _h_.length - 1;} + function create_like(len, t){ + if(0 === len) return [0]; + if(0 < t.length - 1) + return caml_call2(create, len, caml_check_bound(t, 0)[1]); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + var + unsafe_blit = runtime.caml_array_blit, + include$0 = + caml_call1(Base_Blit[4], [0, create_like, length$0, unsafe_blit]), + blit = include$0[1], + blito = include$0[2], + unsafe_blit$0 = include$0[3], + sub$0 = include$0[4], + subo = include$0[5]; + function invariant(invariant_a, t){ + return caml_call2(iter, t, invariant_a); + } + var + Base_Array = + [0, + compare, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + binary_search, + binary_search_segmented, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + max_length, + create, + create_float_uninitialized, + init, + make_matrix, + copy_matrix, + append, + concat, + copy, + fill, + blit, + blito, + unsafe_blit$0, + sub$0, + subo, + of_list, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + iteri, + mapi, + foldi, + fold_right, + sort$2, + stable_sort, + is_sorted, + is_sorted_strictly, + merge, + concat_map, + concat_mapi, + partition_tf, + partitioni_tf, + cartesian_product, + transpose, + transpose_exn, + filter_opt, + filter_map, + filter_mapi, + for_alli, + existsi, + counti, + iter2_exn, + map2_exn, + fold2_exn, + for_all2_exn, + exists2_exn, + filter, + filteri, + swap, + rev_inplace, + rev, + of_list_rev, + of_list_map, + of_list_mapi, + of_list_rev_map, + of_list_rev_mapi, + map_inplace, + find_exn, + find_map_exn, + findi, + findi_exn, + find_mapi, + find_mapi_exn, + find_consecutive_duplicate, + reduce, + reduce_exn, + permute, + random_element, + random_element_exn, + zip, + zip_exn, + unzip, + sorted_copy, + last, + equal, + to_sequence, + to_sequence_mutable, + [0, [0, Insertion_sort, Heap_sort, Intro_sort]]]; + runtime.caml_register_global(28, Base_Array, "Base__Array"); + return; + } + (globalThis)); + +//# 14994 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_float0_ml = "src/float0.ml", + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int64_neg = runtime.caml_int64_neg, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_Printf = global_data.Base__Printf, + Stdlib_Float = global_data.Stdlib__Float, + _g_ = [0, cst_src_float0_ml, 170, 4], + _f_ = [0, cst_src_float0_ml, 174, 4], + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = [0, runtime.caml_int64_create_lo_mi_hi(0, 0, 0)], + _a_ = + [0, + [8, + [0, 0, 0], + 0, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [8, + [0, 0, 0], + 0, + 0, + [11, " in float0.ml: modulus should be positive", 0]]]]]], + "%f %% %f in float0.ml: modulus should be positive"]; + function ceil(_p_){return Math.ceil(_p_);} + function floor(_o_){return Math.floor(_o_);} + function mod_float(_n_, _m_){return _n_ % _m_;} + var + modf = runtime.caml_modf_float, + float_of_string = runtime.caml_float_of_string, + nan = Base_Import[85][23], + infinity = Base_Import[85][21], + neg_infinity = Base_Import[85][22], + max_finite_value = Base_Import[85][24], + epsilon_float = Base_Import[85][26], + classify_float = runtime.caml_classify_float; + function abs_float(_l_){return Math.abs(_l_);} + var is_integer = Stdlib_Float[16]; + function symbol(_k_, _j_){return Math.pow(_k_, _j_);} + function symbol$0(a, b){ + if(caml_call2(Base_Import[108][1], b, 0.)) + caml_call4(Base_Printf[7], _a_, a, b, 0); + var m = a % b; + return caml_call2(Base_Import[108][1], m, 0.) + ? caml_call2(Base_Import[92], m, b) + : m; + } + var frexp = runtime.caml_frexp_float, ldexp = runtime.caml_ldexp_float; + function is_nan(x){return caml_call2(Base_Import[108][3], x, x);} + function to_int64_preserve_order(t){ + return is_nan(t) + ? 0 + : caml_call2 + (Base_Import[108][4], t, 0.) + ? _b_ + : caml_call2 + (Base_Import[108][5], t, 0.) + ? [0, caml_int64_bits_of_float(t)] + : [0, + caml_int64_neg + (caml_int64_bits_of_float(caml_call1(Base_Import[114], t)))]; + } + function to_int64_preserve_order_exn(x){ + var _i_ = to_int64_preserve_order(x); + return caml_call4(Base_Option[28], 0, 0, 0, _i_); + } + function of_int64_preserve_order(x){ + return runtime.caml_greaterequal(x, _c_) + ? caml_int64_float_of_bits(x) + : caml_call1 + (Base_Import[114], caml_int64_float_of_bits(caml_int64_neg(x))); + } + function one_ulp(dir, t){ + var match = to_int64_preserve_order(t); + if(! match) return Base_Import[85][23]; + var x = match[1], _h_ = 759637122 <= dir ? _d_ : _e_; + return of_int64_preserve_order(runtime.caml_int64_add(x, _h_)); + } + function upper_bound_for_int(num_bits){ + var exp = caml_call2(Base_Import[93], num_bits, 1); + return one_ulp(759637122, Math.pow(2., exp)); + } + function is_x_minus_one_exact(x){ + return 1 + - + runtime.caml_equal + (caml_int64_bits_of_float(x), + caml_int64_bits_of_float(caml_call2(Base_Import[94], x, 1.))); + } + function lower_bound_for_int(num_bits){ + var + exp = caml_call2(Base_Import[93], num_bits, 1), + min_int_as_float = caml_call1(Base_Import[114], Math.pow(2., exp)); + if(53 <= caml_call2(Base_Import[93], num_bits, 1)){ + if(is_x_minus_one_exact(min_int_as_float)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + return min_int_as_float; + } + if(is_x_minus_one_exact(min_int_as_float)) + return one_ulp(19067, caml_call2(Base_Import[94], min_int_as_float, 1.)); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[108][1], t, min) + ? min + : caml_call2(Base_Import[108][1], max, t) ? max : t; + } + var x = 0.; + function box(f){return caml_call2(Base_Import[92], f, x);} + var + include = Base_Import[108], + symbol$1 = include[1], + symbol$2 = include[2], + symbol$3 = include[3], + symbol$4 = include[4], + symbol$5 = include[5], + symbol$6 = include[6], + ascending = include[7], + descending = include[8], + compare = include[9], + equal = include[10], + max = include[11], + min = include[12], + Base_Float0 = + [0, + ceil, + floor, + mod_float, + modf, + float_of_string, + nan, + infinity, + neg_infinity, + max_finite_value, + epsilon_float, + classify_float, + abs_float, + is_integer, + symbol, + symbol$0, + frexp, + ldexp, + is_nan, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + upper_bound_for_int, + is_x_minus_one_exact, + lower_bound_for_int, + clamp_unchecked, + box, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + ascending, + descending, + compare, + equal, + max, + min]; + runtime.caml_register_global(21, Base_Float0, "Base__Float0"); + return; + } + (globalThis)); + +//# 15197 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Char", + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Stdlib_Format = global_data.Stdlib__Format, + Base_String0 = global_data.Base__String0, + Base_Char0 = global_data.Base__Char0, + Base_Identifiable = global_data.Base__Identifiable, + Base_Array0 = global_data.Base__Array0, + Base_Comparable = global_data.Base__Comparable, + failwithf = Base_Char0[1], + escaped = Base_Char0[2], + lowercase = Base_Char0[3], + to_int = Base_Char0[4], + unsafe_of_int = Base_Char0[5], + uppercase = Base_Char0[6], + min_value = Base_Char0[8], + max_value = Base_Char0[9], + of_int = Base_Char0[10], + of_int_exn = Base_Char0[11], + compare = Base_Import[227], + hash_fold_t = Base_Import[206], + func = Base_Import[220], + cst_char = "char", + cst_Char_get_hex_digit_exn_not = + "Char.get_hex_digit_exn: not a hexadecimal digit", + _d_ = + [0, + [11, "Char.get_digit_exn ", [1, [11, ": not a digit", 0]]], + "Char.get_digit_exn %C: not a digit"], + _b_ = [0, [1, 0], "%C"], + _a_ = [0, [11, "Char.of_string: ", [3, 0, 0]], "Char.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[165], + sexp_of_t = Base_Import[141], + t_sexp_grammar = Base_Import[185]; + function to_string(t){return caml_call2(Base_String0[9], 1, t);} + function of_string(s){ + return 1 === runtime.caml_ml_string_length(s) + ? runtime.caml_string_get(s, 0) + : caml_call3(failwithf, _a_, s, 0); + } + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + hashable = include[24]; + function pp(fmt, c){return caml_call3(Stdlib_Format[135], fmt, _b_, c);} + function invariant(param){return 0;} + var + _c_ = caml_call2(Base_Array0[11], 256, unsafe_of_int), + all = caml_call1(Base_Array0[15], _c_); + function is_lowercase(param){return 25 < param - 97 >>> 0 ? 0 : 1;} + function is_uppercase(param){return 25 < param - 65 >>> 0 ? 0 : 1;} + function is_print(param){return 94 < param - 32 >>> 0 ? 0 : 1;} + function is_whitespace(param){ + var switch$0 = 0; + if(14 <= param){ + if(32 === param) switch$0 = 1; + } + else if(9 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_digit(param){return 9 < param - 48 >>> 0 ? 0 : 1;} + function is_alpha(param){ + var switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_alphanum(param){ + var _u_ = param - 48 | 0, switch$0 = 0; + if(42 < _u_ >>> 0){ + if(25 >= _u_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _u_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_digit_unsafe(t){ + var _s_ = caml_call1(to_int, 48), _t_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _t_, _s_); + } + function get_digit_exn(t){ + return is_digit(t) + ? get_digit_unsafe(t) + : caml_call3(failwithf, _d_, t, 0); + } + function get_digit(t){return is_digit(t) ? [0, get_digit_unsafe(t)] : 0;} + function is_hex_digit(param){ + var _r_ = param - 48 | 0, switch$0 = 0; + if(22 < _r_ >>> 0){ + if(5 >= _r_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _r_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_lower(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 97 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_upper(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 65 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_hex_digit_exn(t){ + if(65 <= t){ + if(97 <= t){ + if(103 > t){ + var + _j_ = caml_call1(to_int, 97), + _k_ = caml_call1(to_int, t), + _l_ = caml_call2(Base_Import[93], _k_, _j_); + return caml_call2(Base_Import[91], _l_, 10); + } + } + else if(71 > t){ + var + _m_ = caml_call1(to_int, 65), + _n_ = caml_call1(to_int, t), + _o_ = caml_call2(Base_Import[93], _n_, _m_); + return caml_call2(Base_Import[91], _o_, 10); + } + } + else if(9 >= t - 48 >>> 0){ + var _p_ = caml_call1(to_int, 48), _q_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _q_, _p_); + } + var + _h_ = [0, [0, cst_char, caml_call1(sexp_of_t$0, t)], 0], + _i_ = caml_call2(Base_Sexp[9], cst_Char_get_hex_digit_exn_not, _h_); + return caml_call1(Base_Error[30], _i_); + } + function get_hex_digit(t){ + return is_hex_digit(t) ? [0, get_hex_digit_exn(t)] : 0; + } + var + symbol = Base_Import[106][6], + symbol$0 = Base_Import[106][2], + symbol$1 = Base_Import[106][4], + symbol$2 = Base_Import[106][5], + symbol$3 = Base_Import[106][1], + symbol$4 = Base_Import[106][3], + O = [0, symbol, symbol$0, symbol$1, symbol$2, symbol$3, symbol$4], + t_of_sexp$1 = Base_Import[165], + sexp_of_t$1 = Base_Import[141], + t_sexp_grammar$0 = Base_Import[185]; + function compare$0(c1, c2){ + var _f_ = caml_call1(lowercase, c2), _g_ = caml_call1(lowercase, c1); + return caml_call2(Base_Import[106][9], _g_, _f_); + } + function hash_fold_t$1(state, t){ + var _e_ = caml_call1(lowercase, t); + return caml_call2(Base_Import[206], state, _e_); + } + function hash$1(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$1, t);} + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$1]), + symbol$5 = include$0[1], + symbol$6 = include$0[2], + symbol$7 = include$0[3], + symbol$8 = include$0[4], + symbol$9 = include$0[5], + symbol$10 = include$0[6], + equal = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between$0 = include$0[13], + clamp_exn$0 = include$0[14], + clamp$0 = include$0[15], + comparator$0 = include$0[16], + include$1 = Base_Import[106], + symbol$11 = include$1[1], + symbol$12 = include$1[2], + symbol$13 = include$1[3], + symbol$14 = include$1[4], + symbol$15 = include$1[5], + symbol$16 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$0 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_Char = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$16, + symbol$12, + symbol$14, + symbol$15, + symbol$11, + symbol$13, + equal$0, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + O, + to_int, + of_int, + of_int_exn, + unsafe_of_int, + escaped, + lowercase, + uppercase, + is_digit, + is_lowercase, + is_uppercase, + is_alpha, + is_alphanum, + is_print, + is_whitespace, + get_digit, + get_digit_exn, + is_hex_digit, + is_hex_digit_lower, + is_hex_digit_upper, + get_hex_digit, + get_hex_digit_exn, + min_value, + max_value, + [0, + hash_fold_t$1, + hash$1, + t_of_sexp$1, + sexp_of_t$1, + t_sexp_grammar$0, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + equal, + compare$1, + min, + max, + ascending, + descending, + between$0, + clamp_exn$0, + clamp$0, + comparator$0]]; + runtime.caml_register_global(16, Base_Char, "Base__Char"); + return; + } + (globalThis)); + +//# 15530 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_unsafe_get = runtime.caml_string_unsafe_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Char = global_data.Base__Char, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import0 = global_data.Base__Import0; + function tr_create_map(target, replacement){ + var tr_map = caml_call1(Base_Bytes0[7], 256), i$3 = 0; + for(;;){ + caml_bytes_unsafe_set(tr_map, i$3, caml_call1(Base_Char[31], i$3)); + var _j_ = i$3 + 1 | 0; + if(255 !== i$3){var i$3 = _j_; continue;} + var + _b_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)) + - 1 + | 0, + _a_ = 0; + if(_b_ >= 0){ + var i$2 = _a_; + for(;;){ + var + index$0 = + caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$2)); + caml_bytes_unsafe_set + (tr_map, index$0, caml_string_unsafe_get(replacement, i$2)); + var _i_ = i$2 + 1 | 0; + if(_b_ !== i$2){var i$2 = _i_; continue;} + break; + } + } + var + last_replacement = + caml_string_unsafe_get + (replacement, caml_ml_string_length(replacement) - 1 | 0), + _c_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)), + _d_ = caml_ml_string_length(target) - 1 | 0; + if(_d_ >= _c_){ + var i$1 = _c_; + for(;;){ + var + index = caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$1)); + caml_bytes_unsafe_set(tr_map, index, last_replacement); + var _h_ = i$1 + 1 | 0; + if(_d_ !== i$1){var i$1 = _h_; continue;} + break; + } + } + var + first_target = runtime.caml_string_get(target, 0), + _f_ = + caml_bytes_unsafe_get(tr_map, caml_call1(Base_Char[29], first_target)); + if(! caml_call2(Base_Char[14], _f_, first_target)){ + var i = 0; + for(;;){ + if(256 === i) + var _g_ = 0; + else{ + var _e_ = caml_call1(Base_Char[31], i); + if(! caml_call2(Base_Char[14], caml_bytes_unsafe_get(tr_map, i), _e_)){var i$0 = i + 1 | 0, i = i$0; continue;} + var _g_ = 1; + } + if(! _g_) return 0; + break; + } + } + return [0, caml_call1(Base_Bytes0[16], tr_map)]; + } + } + var Base_Bytes_tr = [0, tr_create_map]; + runtime.caml_register_global(3, Base_Bytes_tr, "Base__Bytes_tr"); + return; + } + (globalThis)); + +//# 15631 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function stage(_b_){return _b_;} + function unstage(_a_){return _a_;} + var Base_Staged = [0, stage, unstage]; + runtime.caml_register_global(0, Base_Staged, "Base__Staged"); + return; + } + (globalThis)); + +//# 15644 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "", + cst_case_sensitive = "case_sensitive", + cst_char$1 = "char", + cst_escape_char$1 = "escape_char", + cst_pattern = "pattern", + cst_pos$1 = "pos", + cst_src_string_ml = "src/string.ml", + cst_str$1 = "str", + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$10 = cst$11, + cst$9 = cst$11, + cst$8 = cst$11, + cst$6 = cst$11, + cst$7 = cst$11, + cst$5 = cst$11, + cst$4 = cst$11, + cst$3 = cst$11, + cst$2 = cst$11, + cst$1 = cst$11, + cst$0 = cst$11, + cst = cst$11, + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Array0 = global_data.Base__Array0, + Stdlib_Format = global_data.Stdlib__Format, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Indexed_container = global_data.Base__Indexed_container, + Base_Container = global_data.Base__Container, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_String0 = global_data.Base__String0, + Base_Printf = global_data.Base__Printf, + Base_Error = global_data.Base__Error, + Base_Staged = global_data.Base__Staged, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + max_length = Base_String0[2], + symbol = Base_String0[3], + capitalize = Base_String0[4], + compare = Base_String0[5], + copy = Base_String0[6], + escaped = Base_String0[7], + lowercase = Base_String0[8], + make = Base_String0[9], + uncapitalize = Base_String0[11], + uppercase = Base_String0[13], + concat = Base_String0[14], + iter = Base_String0[15], + invalid_argf = Base_Printf[7], + raise_s = Base_Error[30], + stage = Base_Staged[1], + hash_fold_t = Base_Import[209], + func = Base_Import[223], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _G_ = [0, cst_src_string_ml, 1587, 2], + _F_ = [0, cst_src_string_ml, 1573, 19], + cst_char$0 = cst_char$1, + cst_pos$0 = cst_pos$1, + cst_escape_char$0 = cst_escape_char$1, + cst_str$0 = cst_str$1, + cst_rindex_from_exn_not_found = "rindex_from_exn: not found", + cst_rindex_from = "rindex_from", + cst_char = cst_char$1, + cst_pos = cst_pos$1, + cst_escape_char = cst_escape_char$1, + cst_str = cst_str$1, + cst_index_from_exn_not_found = "index_from_exn: not found", + cst_index_from = "index_from", + cst_is_char_literal = "is_char_literal", + cst_is_char_escaped = "is_char_escaped", + cst_is_char_escaping = "is_char_escaping", + _E_ = [0, [2, 0, [11, ": out of bounds", 0]], "%s: out of bounds"], + cst_escapeworthy_map = "escapeworthy_map", + cst_c_to = "c_to", + cst_c_from = "c_from", + cst_escapeworthy_map_not_one_t = "escapeworthy_map not one-to-one", + _D_ = [0, [3, 0, 0], "%S"], + _C_ = + [0, + [11, "String.chop_suffix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_suffix_exn %S %S"], + _B_ = + [0, + [11, "String.chop_prefix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_prefix_exn %S %S"], + cst_tr_multi_replacement_is_em = "tr_multi replacement is empty string", + _A_ = [0, cst_src_string_ml, 765, 17], + cst_suffix = "suffix", + cst_prefix = "prefix", + cst_drop_suffix = "drop_suffix", + cst_drop_prefix = "drop_prefix", + cst_expecting_nonnegative_argu = " expecting nonnegative argument", + _x_ = [0, [11, "String.init ", [4, 0, 0, 0, 0]], "String.init %d"], + _p_ = + [0, + [11, + "String.is_substring_at: invalid index ", + [4, 0, 0, 0, [11, " for string of length ", [4, 0, 0, 0, 0]]]], + "String.is_substring_at: invalid index %d for string of length %d"], + _g_ = [0, "kmp_array"], + _h_ = [0, cst_case_sensitive], + _i_ = [0, cst_pattern], + cst_substring = "substring", + cst_Substring_not_found = "Substring not found", + _e_ = [0, cst_case_sensitive], + _f_ = [0, cst_pattern], + cst_String_rindex_from_exn = "String.rindex_from_exn", + cst_String_index_from_exn = "String.index_from_exn", + _a_ = [0, "String.index_exn: not found"], + _b_ = [0, "String.index_from_exn: not found"], + _c_ = [0, "String.rindex_exn: not found"], + _d_ = [0, "String.rindex_from_exn: not found"], + _y_ = [0, "String.lsplit2_exn: not found"], + _z_ = [0, "String.rsplit2_exn: not found"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[163], + sexp_of_t = Base_Import[139], + t_sexp_grammar = Base_Import[183], + hashable = [0, hash, compare, sexp_of_t], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function sub(src, pos, len){ + if(0 === pos && len === caml_ml_string_length(src)) return src; + caml_call3 + (Base_Ordered_collection_common[2], pos, len, caml_ml_string_length(src)); + if(0 === len) return cst; + var dst = caml_call1(Base_Bytes0[7], len); + runtime.caml_blit_string(src, pos, dst, 0, len); + return caml_call1(Base_Bytes0[16], dst); + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var i$0 = caml_call2(Base_Import[93], caml_ml_string_length(src), pos); + return sub(src, pos, i$0); + } + function contains(opt, len, t, char$0){ + if(opt) var sth = opt[1], pos$1 = sth; else var pos$1 = 0; + var + total_length = caml_ml_string_length(t), + _dt_ = caml_call2(Base_Import[93], total_length, pos$1), + len$0 = caml_call2(Base_Option[27], len, _dt_); + caml_call3(Base_Ordered_collection_common[2], pos$1, len$0, total_length); + var end = caml_call2(Base_Import[91], pos$1, len$0), pos = pos$1; + for(;;){ + var _dq_ = pos < end ? 1 : 0; + if(_dq_){ + var + _dr_ = + caml_call2(Base_Char[15], caml_string_unsafe_get(t, pos), char$0); + if(! _dr_){ + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + continue; + } + var _ds_ = _dr_; + } + else + var _ds_ = _dq_; + return _ds_; + } + } + function is_empty(t){return 0 === caml_ml_string_length(t) ? 1 : 0;} + function index_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(len <= pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[91], pos$0, 1), pos$0 = pos$1; + } + } + function index_exn_internal(t, not_found, char$0){ + return index_from_exn_internal + (t, 0, caml_ml_string_length(t), not_found, char$0); + } + var not_found = [0, Base_Import[252], _a_]; + function index_exn(t, char$0){ + return index_exn_internal(t, not_found, char$0); + } + var not_found$0 = [0, Base_Import[252], _b_]; + function index_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(0 <= pos && len >= pos) + return index_from_exn_internal(t, pos, len, not_found$0, char$0); + return caml_call1(Base_Import[126], cst_String_index_from_exn); + } + function rindex_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(0 > pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[93], pos$0, 1), pos$0 = pos$1; + } + } + function rindex_exn_internal(t, not_found, char$0){ + var len = caml_ml_string_length(t); + return rindex_from_exn_internal + (t, caml_call2(Base_Import[93], len, 1), len, not_found, char$0); + } + var not_found$1 = [0, Base_Import[252], _c_]; + function rindex_exn(t, char$0){ + return rindex_exn_internal(t, not_found$1, char$0); + } + var not_found$2 = [0, Base_Import[252], _d_]; + function rindex_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(-1 <= pos && len > pos) + return rindex_from_exn_internal(t, pos, len, not_found$2, char$0); + return caml_call1(Base_Import[126], cst_String_rindex_from_exn); + } + function index(t, char$0){ + try{var _do_ = [0, index_exn(t, char$0)]; return _do_;} + catch(_dp_){ + var _dn_ = caml_wrap_exception(_dp_); + if(_dn_[1] !== Base_Import[252] && _dn_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dn_, 0); + return 0; + } + } + function rindex(t, char$0){ + try{var _dl_ = [0, rindex_exn(t, char$0)]; return _dl_;} + catch(_dm_){ + var _dk_ = caml_wrap_exception(_dm_); + if(_dk_[1] !== Base_Import[252] && _dk_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dk_, 0); + return 0; + } + } + function index_from(t, pos, char$0){ + try{var _di_ = [0, index_from_exn(t, pos, char$0)]; return _di_;} + catch(_dj_){ + var _dh_ = caml_wrap_exception(_dj_); + if(_dh_[1] !== Base_Import[252] && _dh_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dh_, 0); + return 0; + } + } + function rindex_from(t, pos, char$0){ + try{var _df_ = [0, rindex_from_exn(t, pos, char$0)]; return _df_;} + catch(_dg_){ + var _de_ = caml_wrap_exception(_dg_); + if(_de_[1] !== Base_Import[252] && _de_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_de_, 0); + return 0; + } + } + function sexp_of_t$0(param){ + var + case_sensitive = param[2], + pattern = param[1], + _dd_ = + [0, + [1, [0, _e_, [0, caml_call1(Base_Import[138], case_sensitive), 0]]], + 0]; + return [1, + [0, + [1, [0, _f_, [0, caml_call1(Base_Import[139], pattern), 0]]], + _dd_]]; + } + function pattern(t){return t[1];} + function case_sensitive(t){return t[2];} + function kmp_internal_loop + (matched_chars, next_text_char, pattern, kmp_array, char_equal){ + var matched_chars$0 = [0, matched_chars]; + for(;;){ + if + (0 < matched_chars$0[1] + && + ! + caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))){ + matched_chars$0[1] = + kmp_array[1 + caml_call2(Base_Import[93], matched_chars$0[1], 1)]; + continue; + } + if + (caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))) + matched_chars$0[1] = caml_call2(Base_Import[91], matched_chars$0[1], 1); + return matched_chars$0[1]; + } + } + function get_char_equal(case_sensitive){ + return case_sensitive ? Base_Char[15] : Base_Char[52][12]; + } + function create(pattern, case_sensitive){ + var + n = caml_ml_string_length(pattern), + kmp_array = caml_call2(Base_Array0[4], n, -1); + if(0 < n){ + var char_equal = get_char_equal(case_sensitive); + kmp_array[1] = 0; + var + matched_chars = [0, 0], + _db_ = caml_call2(Base_Import[93], n, 1), + _da_ = 1; + if(_db_ >= 1){ + var i = _da_; + for(;;){ + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], + caml_string_unsafe_get(pattern, i), + pattern, + kmp_array, + char_equal); + kmp_array[1 + i] = matched_chars[1]; + var _dc_ = i + 1 | 0; + if(_db_ !== i){var i = _dc_; continue;} + break; + } + } + } + return [0, pattern, case_sensitive, kmp_array]; + } + function index_internal(opt, param){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + return function(text){ + if + (0 <= pos + && + caml_call2 + (Base_Import[93], + caml_ml_string_length(text), + caml_ml_string_length(pattern)) + >= pos){ + var + char_equal = get_char_equal(case_sensitive), + j = [0, pos], + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text); + for(;;){ + if(j[1] < n && matched_chars[1] < k){ + var next_text_char = caml_string_unsafe_get(text, j[1]); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + j[1] = caml_call2(Base_Import[91], j[1], 1); + continue; + } + return matched_chars[1] === k + ? caml_call2(Base_Import[93], j[1], k) + : -1; + } + } + return -1;}; + } + function matches(t, str){ + return 0 <= caml_call1(index_internal(0, t), str) ? 1 : 0; + } + function index$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + return 0 <= p ? [0, p] : 0; + } + function index_exn$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + if(0 <= p) return p; + var _c$_ = [0, [0, cst_substring, caml_call1(Base_Import[139], t[1])], 0]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Substring_not_found, _c$_)); + } + function index_all(param, may_overlap, text){ + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + if(0 === caml_ml_string_length(pattern)){ + var + _c5_ = function(_c__){return _c__;}, + _c6_ = caml_call2(Base_Import[91], 1, caml_ml_string_length(text)); + return caml_call2(Base_List[123], _c6_, _c5_); + } + var + char_equal = get_char_equal(case_sensitive), + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text), + found = [0, 0], + _c7_ = 0; + if(n >= 0){ + var j = _c7_; + for(;;){ + if(matched_chars[1] === k){ + var _c8_ = found[1]; + found[1] = [0, caml_call2(Base_Import[93], j, k), _c8_]; + matched_chars[1] = + may_overlap ? kmp_array[1 + caml_call2(Base_Import[93], k, 1)] : 0; + } + if(j < n){ + var next_text_char = caml_string_unsafe_get(text, j); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + } + var _c9_ = j + 1 | 0; + if(n !== j){var j = _c9_; continue;} + break; + } + } + return caml_call1(Base_List[38], found[1]); + } + function replace_first(pos, t, s, with$0){ + var match = index$0(pos, t, s); + if(! match) return s; + var + i = match[1], + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + _cZ_ = caml_call2(Base_Import[91], len_s, len_with), + _c0_ = caml_call2(Base_Import[93], _cZ_, len_t), + dst = caml_call1(Base_Bytes0[7], _c0_); + caml_call5(Base_Bytes0[4], s, 0, dst, 0, i); + caml_call5(Base_Bytes0[4], with$0, 0, dst, i, len_with); + var + _c1_ = caml_call2(Base_Import[93], len_s, i), + _c2_ = caml_call2(Base_Import[93], _c1_, len_t), + _c3_ = caml_call2(Base_Import[91], i, len_with), + _c4_ = caml_call2(Base_Import[91], i, len_t); + caml_call5(Base_Bytes0[4], s, _c4_, dst, _c3_, _c2_); + return caml_call1(Base_Bytes0[16], dst); + } + function replace_all(t, s, with$0){ + var matches = index_all(t, 0, s); + if(! matches) return s; + var + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + num_matches = caml_call1(Base_List[7], matches), + _cR_ = caml_call2(Base_Import[93], len_with, len_t), + _cS_ = caml_call2(Base_Import[88], _cR_, num_matches), + _cT_ = caml_call2(Base_Import[91], len_s, _cS_), + dst = caml_call1(Base_Bytes0[7], _cT_), + next_dst_pos = [0, 0], + next_src_pos = [0, 0]; + function _cU_(i){ + var len = caml_call2(Base_Import[93], i, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], len); + var _cW_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + caml_call5(Base_Bytes0[4], with$0, 0, dst, _cW_, len_with); + var _cX_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + next_dst_pos[1] = caml_call2(Base_Import[91], _cX_, len_with); + var _cY_ = caml_call2(Base_Import[91], next_src_pos[1], len); + next_src_pos[1] = caml_call2(Base_Import[91], _cY_, len_t); + return 0; + } + caml_call2(Base_List[9], matches, _cU_); + var _cV_ = caml_call2(Base_Import[93], len_s, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], _cV_); + return caml_call1(Base_Bytes0[16], dst); + } + function split_on(t, s){ + var + pattern_len = caml_ml_string_length(t[1]), + matches = index_all(t, 0, s); + function _cM_(i, j){ + var + _cP_ = caml_call2(Base_Import[93], j, i), + _cQ_ = caml_call2(Base_Import[93], _cP_, pattern_len); + return sub(s, caml_call2(Base_Import[91], i, pattern_len), _cQ_); + } + var + _cN_ = + caml_call2(Base_Import[111], matches, [0, caml_ml_string_length(s), 0]), + _cO_ = [0, caml_call1(Base_Import[113], pattern_len), matches]; + return caml_call3(Base_List[83], _cO_, _cN_, _cM_); + } + function equal(a_002, b_003){ + if(caml_call2(Base_Ppx_compare_lib[1], a_002, b_003)) return 1; + var _cJ_ = caml_call2(Base_Import[246], a_002[1], b_003[1]); + if(_cJ_){ + var _cK_ = caml_call2(Base_Import[239], a_002[2], b_003[2]); + if(_cK_) + return caml_call3 + (Base_Import[248], Base_Import[242], a_002[3], b_003[3]); + var _cL_ = _cK_; + } + else + var _cL_ = _cJ_; + return _cL_; + } + function sexp_of_t$1(param){ + var + kmp_array_011 = param[3], + case_sensitive_009 = param[2], + pattern_007 = param[1], + arg_012 = caml_call2(Base_Import[153], Base_Import[142], kmp_array_011), + bnds_006 = [0, [1, [0, _g_, [0, arg_012, 0]]], 0], + arg_010 = caml_call1(Base_Import[138], case_sensitive_009), + bnds_006$0 = [0, [1, [0, _h_, [0, arg_010, 0]]], bnds_006], + arg_008 = caml_call1(Base_Import[139], pattern_007), + bnds_006$1 = [0, [1, [0, _i_, [0, arg_008, 0]]], bnds_006$0]; + return [1, bnds_006$1]; + } + function representation(_cI_){return _cI_;} + var Private = [0, equal, sexp_of_t$1, representation]; + function substr_index_gen(case_sensitive, pos, t, pattern){return index$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_exn_gen(case_sensitive, pos, t, pattern){return index_exn$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_all_gen(case_sensitive, t, may_overlap, pattern){return index_all(create(pattern, case_sensitive), may_overlap, t); + } + function substr_replace_first_gen(case_sensitive, pos, t, pattern){ + var _cG_ = create(pattern, case_sensitive); + return function(_cH_){return replace_first(pos, _cG_, t, _cH_);}; + } + function substr_replace_all_gen(case_sensitive, t, pattern){ + var _cE_ = create(pattern, case_sensitive); + return function(_cF_){return replace_all(_cE_, t, _cF_);}; + } + function is_substring_gen(case_sensitive, t, substring){ + var _cD_ = substr_index_gen(case_sensitive, 0, t, substring); + return caml_call1(Base_Option[50], _cD_); + } + var _j_ = 1; + function substr_index(_cA_, _cB_, _cC_){ + return substr_index_gen(_j_, _cA_, _cB_, _cC_); + } + var _k_ = 1; + function substr_index_exn(_cx_, _cy_, _cz_){ + return substr_index_exn_gen(_k_, _cx_, _cy_, _cz_); + } + var _l_ = 1; + function substr_index_all(_cu_, _cv_, _cw_){ + return substr_index_all_gen(_l_, _cu_, _cv_, _cw_); + } + var _m_ = 1; + function substr_replace_first(_cr_, _cs_, _ct_){ + return substr_replace_first_gen(_m_, _cr_, _cs_, _ct_); + } + var _n_ = 1; + function substr_replace_all(_cp_, _cq_){ + return substr_replace_all_gen(_n_, _cp_, _cq_); + } + var _o_ = 1; + function is_substring(_cn_, _co_){ + return is_substring_gen(_o_, _cn_, _co_); + } + function is_substring_at_gen(str, str_pos$1, sub, char_equal){ + var + str_len = caml_ml_string_length(str), + sub_len = caml_ml_string_length(sub), + _ck_ = str_pos$1 < 0 ? 1 : 0, + _cl_ = _ck_ || (str_len < str_pos$1 ? 1 : 0); + if(_cl_) caml_call4(invalid_argf, _p_, str_pos$1, str_len, 0); + var + _cm_ = caml_call2(Base_Import[91], str_pos$1, sub_len) <= str_len ? 1 : 0; + if(! _cm_) return _cm_; + var str_pos = str_pos$1, sub_pos = 0; + for(;;){ + if(sub_pos === sub_len) return 1; + if + (! + caml_call2 + (char_equal, + caml_string_unsafe_get(str, str_pos), + caml_string_unsafe_get(sub, sub_pos))) + return 0; + var + sub_pos$0 = caml_call2(Base_Import[91], sub_pos, 1), + str_pos$0 = caml_call2(Base_Import[91], str_pos, 1), + str_pos = str_pos$0, + sub_pos = sub_pos$0; + } + } + function is_suffix_gen(string, suffix, char_equal){ + var + string_len = caml_ml_string_length(string), + suffix_len = caml_ml_string_length(suffix), + _cj_ = suffix_len <= string_len ? 1 : 0; + return _cj_ + ? is_substring_at_gen + (string, + caml_call2(Base_Import[93], string_len, suffix_len), + suffix, + char_equal) + : _cj_; + } + function is_prefix_gen(string, prefix, char_equal){ + var + string_len = caml_ml_string_length(string), + prefix_len = caml_ml_string_length(prefix), + _ci_ = prefix_len <= string_len ? 1 : 0; + return _ci_ ? is_substring_at_gen(string, 0, prefix, char_equal) : _ci_; + } + var + t_of_sexp$0 = Base_Import[163], + sexp_of_t$2 = Base_Import[139], + t_sexp_grammar$0 = Base_Import[183]; + function compare$0(string1, string2){ + if(caml_call2(Base_Import[128], string1, string2)) return 0; + var + len2 = caml_ml_string_length(string2), + len1 = caml_ml_string_length(string1), + pos = 0; + for(;;){ + if(pos === len1) return pos === len2 ? 0 : -1; + if(pos === len2) return 1; + var + c2 = caml_string_unsafe_get(string2, pos), + c1 = caml_string_unsafe_get(string1, pos), + _cg_ = caml_call1(Base_Char[34], c2), + _ch_ = caml_call1(Base_Char[34], c1), + c = caml_call2(Base_Char[16], _ch_, _cg_); + if(0 !== c) return c; + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + } + } + function hash_fold_t$0(state, t){ + var + len = caml_ml_string_length(t), + state$0 = [0, caml_call2(Base_Import[207], state, len)], + _cd_ = caml_call2(Base_Import[93], len, 1), + _cc_ = 0; + if(_cd_ >= 0){ + var pos = _cc_; + for(;;){ + var _ce_ = caml_call1(Base_Char[34], caml_string_unsafe_get(t, pos)); + state$0[1] = caml_call2(Base_Import[206], state$0[1], _ce_); + var _cf_ = pos + 1 | 0; + if(_cd_ !== pos){var pos = _cf_; continue;} + break; + } + } + return state$0[1]; + } + function hash$0(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$0, t);} + function is_suffix(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[52][12]); + } + function is_prefix(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[52][12]); + } + var _q_ = 0; + function substr_index$0(_b$_, _ca_, _cb_){ + return substr_index_gen(_q_, _b$_, _ca_, _cb_); + } + var _r_ = 0; + function substr_index_exn$0(_b8_, _b9_, _b__){ + return substr_index_exn_gen(_r_, _b8_, _b9_, _b__); + } + var _s_ = 0; + function substr_index_all$0(_b5_, _b6_, _b7_){ + return substr_index_all_gen(_s_, _b5_, _b6_, _b7_); + } + var _t_ = 0; + function substr_replace_first$0(_b2_, _b3_, _b4_){ + return substr_replace_first_gen(_t_, _b2_, _b3_, _b4_); + } + var _u_ = 0; + function substr_replace_all$0(_b0_, _b1_){ + return substr_replace_all_gen(_u_, _b0_, _b1_); + } + var _v_ = 0; + function is_substring$0(_bY_, _bZ_){ + return is_substring_gen(_v_, _bY_, _bZ_); + } + var _w_ = Base_Char[52][12]; + function is_substring_at(_bV_){ + return function(_bW_){ + return function(_bX_){ + return is_substring_at_gen(_bV_, _bW_, _bX_, _w_);};}; + } + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$2]), + symbol$0 = include$0[1], + symbol$1 = include$0[2], + symbol$2 = include$0[3], + symbol$3 = include$0[4], + symbol$4 = include$0[5], + symbol$5 = include$0[6], + equal$0 = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between = include$0[13], + clamp_exn = include$0[14], + clamp = include$0[15], + comparator$0 = include$0[16]; + function of_string(_bU_){return _bU_;} + function to_string(_bT_){return _bT_;} + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _x_, n, 0); + var + t = caml_call1(Base_Bytes0[7], n), + _bR_ = caml_call2(Base_Import[93], n, 1), + _bQ_ = 0; + if(_bR_ >= 0){ + var i = _bQ_; + for(;;){ + caml_bytes_set(t, i, caml_call1(f, i)); + var _bS_ = i + 1 | 0; + if(_bR_ !== i){var i = _bS_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t); + } + function to_list(s){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_string_length(s), 1), + acc = 0, + i = i$1; + for(;;){ + if(0 > i) return acc; + var + i$0 = caml_call2(Base_Import[93], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function to_list_rev(s){ + var len = caml_ml_string_length(s), acc = 0, i = 0; + for(;;){ + if(i === len) return acc; + var + i$0 = caml_call2(Base_Import[91], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function rev(t){ + var + len = caml_ml_string_length(t), + res = caml_call1(Base_Bytes0[7], len), + _bN_ = caml_call2(Base_Import[93], len, 1), + _bM_ = 0; + if(_bN_ >= 0){ + var i = _bM_; + for(;;){ + var _bO_ = caml_call2(Base_Import[93], len, 1); + caml_bytes_unsafe_set + (res, + i, + caml_string_unsafe_get(t, caml_call2(Base_Import[93], _bO_, i))); + var _bP_ = i + 1 | 0; + if(_bN_ !== i){var i = _bP_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], res); + } + var not_found$3 = [0, Base_Import[252], _y_]; + function lsplit2_exn(line, delim){ + var + pos = index_exn_internal(line, not_found$3, delim), + _bJ_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bK_ = caml_call2(Base_Import[93], _bJ_, 1), + _bL_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bK_); + return [0, sub(line, 0, pos), _bL_]; + } + var not_found$4 = [0, Base_Import[252], _z_]; + function rsplit2_exn(line, delim){ + var + pos = rindex_exn_internal(line, not_found$4, delim), + _bG_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bH_ = caml_call2(Base_Import[93], _bG_, 1), + _bI_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bH_); + return [0, sub(line, 0, pos), _bI_]; + } + function lsplit2(line, on){ + try{var _bE_ = [0, lsplit2_exn(line, on)]; return _bE_;} + catch(_bF_){ + var _bD_ = caml_wrap_exception(_bF_); + if(_bD_[1] !== Base_Import[252] && _bD_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bD_, 0); + return 0; + } + } + function rsplit2(line, on){ + try{var _bB_ = [0, rsplit2_exn(line, on)]; return _bB_;} + catch(_bC_){ + var _bA_ = caml_wrap_exception(_bC_); + if(_bA_[1] !== Base_Import[252] && _bA_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bA_, 0); + return 0; + } + } + function char_list_mem(l, c){ + var l$0 = l; + for(;;){ + if(! l$0) return 0; + var tl = l$0[2], hd = l$0[1], _bz_ = caml_call2(Base_Char[15], hd, c); + if(_bz_) return _bz_; + var l$0 = tl; + } + } + function split_gen(str, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + last_pos = caml_ml_string_length(str), + pos$1 = caml_call2(Base_Import[93], last_pos, 1), + acc = 0, + last_pos$1 = last_pos, + last_pos$0 = pos$1; + for(;;){ + if(-1 === last_pos$0) return [0, sub(str, 0, last_pos$1), acc]; + if(is_delim(caml_string_get(str, last_pos$0))){ + var + pos1 = caml_call2(Base_Import[91], last_pos$0, 1), + sub_str = sub(str, pos1, caml_call2(Base_Import[93], last_pos$1, pos1)), + pos = caml_call2(Base_Import[93], last_pos$0, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + last_pos$1 = last_pos$0, + last_pos$0 = pos; + continue; + } + var + pos$0 = caml_call2(Base_Import[93], last_pos$0, 1), + last_pos$0 = pos$0; + } + } + function split(str, on){return split_gen(str, [0, -1044422954, on]);} + function split_on_chars(str, chars){ + return split_gen(str, [0, 552554919, chars]); + } + function back_up_at_newline(t, pos, eol){ + var switch$0 = 0; + if(0 < pos[1]){ + var _bx_ = caml_string_get(t, caml_call2(Base_Import[93], pos[1], 1)); + if(caml_call2(Base_Char[15], _bx_, 13)){var _by_ = 2; switch$0 = 1;} + } + if(! switch$0) var _by_ = 1; + pos[1] = caml_call2(Base_Import[93], pos[1], _by_); + eol[1] = caml_call2(Base_Import[91], pos[1], 1); + return 0; + } + function split_lines(t){ + var n = caml_ml_string_length(t); + if(0 === n) return 0; + var + pos = [0, caml_call2(Base_Import[93], n, 1)], + eol = [0, n], + ac = [0, 0], + _bt_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[15], _bt_, 10)) back_up_at_newline(t, pos, eol); + for(;;){ + if(0 > pos[1]){var _bw_ = ac[1]; return [0, sub(t, 0, eol[1]), _bw_];} + var _bu_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[14], _bu_, 10)){ + caml_call1(Base_Import[129], pos); + continue; + } + var start = caml_call2(Base_Import[91], pos[1], 1), _bv_ = ac[1]; + ac[1] = + [0, sub(t, start, caml_call2(Base_Import[93], eol[1], start)), _bv_]; + back_up_at_newline(t, pos, eol); + } + } + function is_suffix$0(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[15]); + } + function is_prefix$0(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[15]); + } + function is_substring_at$0(s, pos, substring){ + return is_substring_at_gen(s, pos, substring, Base_Char[15]); + } + function wrap_sub_n(t, n, name, pos, len, on_error){ + if(0 <= n) + try{var _bq_ = sub(t, pos, len); return _bq_;} + catch(_bs_){return on_error;} + var _br_ = caml_call2(symbol, name, cst_expecting_nonnegative_argu); + return caml_call1(Base_Import[126], _br_); + } + function drop_prefix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_prefix, + n, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$0); + } + function drop_suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_suffix, + 0, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$1); + } + function prefix(t, n){return wrap_sub_n(t, n, cst_prefix, 0, n, t);} + function suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_suffix, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + n, + t); + } + function lfindi(opt, t, f){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var n = caml_ml_string_length(t), i = pos; + for(;;){ + if(i === n) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function find(t, f){ + var match = lfindi(0, t, function(param, c){return caml_call1(f, c);}); + if(! match) return 0; + var i = match[1]; + return [0, caml_string_get(t, i)]; + } + function find_map(t, f){ + var n = caml_ml_string_length(t), i = 0; + for(;;){ + if(i === n) return 0; + var res = caml_call1(f, caml_string_get(t, i)); + if(res) return res; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function rfindi(pos, t, f){ + if(pos) + var pos$0 = pos[1], pos$1 = pos$0; + else + var pos$1 = caml_call2(Base_Import[93], caml_ml_string_length(t), 1); + var i = pos$1; + for(;;){ + if(0 > i) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0; + } + } + function last_non_drop(drop, t){ + return rfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function rstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop(drop, t); + if(! match) return cst$2; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function first_non_drop(drop, t){ + return lfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function lstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop(drop, t); + if(! match) return cst$3; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop(drop, t); + if(! match) return cst$4; + var first = match[1], match$0 = last_non_drop(drop, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var last = match$0[1], _bp_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _bp_, 1)); + } + } + return t; + } + function mapi(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bn_ = caml_call2(Base_Import[93], l, 1), + _bm_ = 0; + if(_bn_ >= 0){ + var i = _bm_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call2(f, i, caml_string_get(t, i))); + var _bo_ = i + 1 | 0; + if(_bn_ !== i){var i = _bo_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function map(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bk_ = caml_call2(Base_Import[93], l, 1), + _bj_ = 0; + if(_bk_ >= 0){ + var i = _bj_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call1(f, caml_string_get(t, i))); + var _bl_ = i + 1 | 0; + if(_bk_ !== i){var i = _bl_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function to_array(s){ + function _bi_(i){return caml_string_get(s, i);} + return caml_call2(Base_Array0[11], caml_ml_string_length(s), _bi_); + } + function exists(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bf_ = i < len ? 1 : 0; + if(_bf_){ + var _bg_ = caml_call1(f, caml_string_get(s, i)); + if(! _bg_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bh_ = _bg_; + } + else + var _bh_ = _bf_; + return _bh_; + } + } + function for_all(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bc_ = i === len ? 1 : 0; + if(_bc_) + var _bd_ = _bc_; + else{ + var _be_ = caml_call1(f, caml_string_get(s, i)); + if(_be_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bd_ = _be_; + } + return _bd_; + } + } + function fold(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call2(f, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call3(f, i, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function iteri(t, f){ + var + _ba_ = caml_call2(Base_Import[93], caml_ml_string_length(t), 1), + _a$_ = 0; + if(_ba_ >= 0){ + var i = _a$_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(t, i)); + var _bb_ = i + 1 | 0; + if(_ba_ !== i){var i = _bb_; continue;} + break; + } + } + return 0; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t){return caml_call2(Base_Container[3], fold, t);} + function max_elt(t){return caml_call2(Base_Container[4], fold, t);} + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _a9_ = caml_call3(Base_Container[9], fold, init, f); + return function(_a__){return caml_call2(_a9_, _a__, t);}; + } + function find_mapi(t, f){ + return caml_call3(Base_Indexed_container[7], iteri, t, f); + } + function findi(t, f){ + return caml_call3(Base_Indexed_container[6], iteri, t, f); + } + function counti(t, f){ + return caml_call3(Base_Indexed_container[3], foldi, t, f); + } + function for_alli(t, f){ + return caml_call3(Base_Indexed_container[5], iteri, t, f); + } + function existsi(t, f){ + return caml_call3(Base_Indexed_container[4], iteri, t, f); + } + function mem(t, c){ + var len = caml_ml_string_length(t), i = 0; + for(;;){ + var _a6_ = i < len ? 1 : 0; + if(_a6_){ + var _a7_ = caml_call2(Base_Char[15], c, caml_string_unsafe_get(t, i)); + if(! _a7_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _a8_ = _a7_; + } + else + var _a8_ = _a6_; + return _a8_; + } + } + function tr(target, replacement, s){ + return caml_call2(Base_Char[15], target, replacement) + ? s + : mem + (s, target) + ? map + (s, + function(c){ + return caml_call2(Base_Char[15], c, target) + ? replacement + : c; + }) + : s; + } + function tr_multi(target, replacement){ + if(is_empty(target)) + return caml_call1(stage, function(_a5_){return _a5_;}); + if(is_empty(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_em); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_a4_){return _a4_;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + return exists + (s, + function(c){ + var + _a3_ = + caml_string_unsafe_get(tr_map, caml_call1(Base_Char[29], c)); + return caml_call2(Base_Char[14], c, _a3_); + }) + ? map + (s, + function(c){ + return caml_string_unsafe_get + (tr_map, caml_call1(Base_Char[29], c)); + }) + : s; + }); + } + function concat_array(sep, ar){ + return caml_call2(concat, sep, caml_call1(Base_Array0[15], ar)); + } + function concat_map(sep, s, f){ + var _a2_ = to_array(s); + return concat_array(sep, caml_call2(Base_Array0[20], _a2_, f)); + } + function filter(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n && caml_call1(f, caml_string_get(t, i[1]))){caml_call1(Base_Import[130], i); continue;} + if(i[1] === n) return t; + var + _a0_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _a0_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _a1_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _a1_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call1(f, c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function filteri(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n){ + var _aX_ = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], _aX_)){ + caml_call1(Base_Import[130], i); + continue; + } + } + if(i[1] === n) return t; + var + _aY_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _aY_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _aZ_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _aZ_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function chop_prefix(s, prefix){ + return is_prefix$0(s, prefix) + ? [0, drop_prefix(s, caml_ml_string_length(prefix))] + : 0; + } + function chop_prefix_if_exists(s, prefix){ + return is_prefix$0(s, prefix) + ? drop_prefix(s, caml_ml_string_length(prefix)) + : s; + } + function chop_prefix_exn(s, prefix){ + var match = chop_prefix(s, prefix); + if(! match) return caml_call4(invalid_argf, _B_, s, prefix, 0); + var str = match[1]; + return str; + } + function chop_suffix(s, suffix){ + return is_suffix$0(s, suffix) + ? [0, drop_suffix(s, caml_ml_string_length(suffix))] + : 0; + } + function chop_suffix_if_exists(s, suffix){ + return is_suffix$0(s, suffix) + ? drop_suffix(s, caml_ml_string_length(suffix)) + : s; + } + function chop_suffix_exn(s, suffix){ + var match = chop_suffix(s, suffix); + if(! match) return caml_call4(invalid_argf, _C_, s, suffix, 0); + var str = match[1]; + return str; + } + function shorter(a, b){ + return caml_ml_string_length(a) <= caml_ml_string_length(b) ? a : b; + } + function shortest(list){ + if(! list) return cst$5; + var rest = list[2], first = list[1]; + return caml_call3(Base_List[10], rest, first, shorter); + } + function pos_from_left(param, i){return i;} + function pos_from_right(t, i){ + var _aW_ = caml_call2(Base_Import[93], caml_ml_string_length(t), i); + return caml_call2(Base_Import[93], _aW_, 1); + } + function common_generic2_length_loop(a, b, get_pos, max_len, len_so_far){ + var len_so_far$0 = len_so_far; + for(;;){ + if(max_len <= len_so_far$0) return max_len; + var + _aU_ = caml_string_unsafe_get(b, caml_call2(get_pos, b, len_so_far$0)), + _aV_ = caml_string_unsafe_get(a, caml_call2(get_pos, a, len_so_far$0)); + if(! caml_call2(Base_Char[15], _aV_, _aU_)) return len_so_far$0; + var + len_so_far$1 = caml_call2(Base_Import[91], len_so_far$0, 1), + len_so_far$0 = len_so_far$1; + } + } + function common_generic2_length(a, b, get_pos){ + var + max_len = + caml_call2 + (Base_Import[101], caml_ml_string_length(a), caml_ml_string_length(b)); + return common_generic2_length_loop(a, b, get_pos, max_len, 0); + } + function common_generic_length_loop(first, list, get_pos, max_len){ + var first$0 = first, list$0 = list, max_len$0 = max_len; + for(;;){ + if(! list$0) return max_len$0; + var + rest = list$0[2], + second = list$0[1], + max_len$1 = + common_generic2_length_loop(first$0, second, get_pos, max_len$0, 0), + first$0 = second, + list$0 = rest, + max_len$0 = max_len$1; + } + } + function common_generic_length(list, get_pos){ + if(! list) return 0; + var + rest = list[2], + first = list[1], + max_len = caml_ml_string_length(shortest(list)); + return common_generic_length_loop(first, rest, get_pos, max_len); + } + function common_generic2(a, b, get_pos, take){ + var len = common_generic2_length(a, b, get_pos); + return caml_call2(take, shorter(a, b), len); + } + function common_generic(list, get_pos, take){ + if(! list) return cst$7; + var + rest = list[2], + first = list[1], + s = shortest(list), + max_len = caml_ml_string_length(s); + if(0 === max_len) return cst$6; + var len = common_generic_length_loop(first, rest, get_pos, max_len); + return caml_call2(take, s, len); + } + function common_prefix(list){ + return common_generic(list, pos_from_left, prefix); + } + function common_suffix(list){ + return common_generic(list, pos_from_right, suffix); + } + function common_prefix2(a, b){ + return common_generic2(a, b, pos_from_left, prefix); + } + function common_suffix2(a, b){ + return common_generic2(a, b, pos_from_right, suffix); + } + function common_prefix_length(list){ + return common_generic_length(list, pos_from_left); + } + function common_suffix_length(list){ + return common_generic_length(list, pos_from_right); + } + function common_prefix2_length(a, b){ + return common_generic2_length(a, b, pos_from_left); + } + function common_suffix2_length(a, b){ + return common_generic2_length(a, b, pos_from_right); + } + function pp(ppf, string){ + return caml_call3(Stdlib_Format[135], ppf, _D_, string); + } + function of_char(c){return caml_call2(make, 1, c);} + function of_char_list(l){ + var + _aS_ = caml_call1(Base_List[7], l), + t = caml_call1(Base_Bytes0[7], _aS_); + function _aT_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _aT_); + return caml_call1(Base_Bytes0[16], t); + } + function build_and_validate_escapeworth + (escapeworthy_map, escape_char, func){ + var + escapeworthy_map$0 = + caml_call3 + (Base_List[129][7], escapeworthy_map, Base_Char[15], escape_char) + ? escapeworthy_map + : [0, [0, escape_char, escape_char], escapeworthy_map], + arr = caml_call2(Base_Array0[4], 256, -1), + vals = caml_call2(Base_Array0[4], 256, 0), + param = escapeworthy_map$0; + for(;;){ + if(! param) return [0, arr]; + var l = param[2], match = param[1], c_to = match[2], c_from = match[1]; + if(919809722 <= func) + var v = c_from, k = caml_call1(Base_Char[29], c_to); + else + var k$0 = caml_call1(Base_Char[29], c_from), v = c_to, k = k$0; + if(-1 === caml_check_bound(arr, k)[1 + k]){ + var _aK_ = caml_call1(Base_Char[29], v); + if(! caml_check_bound(vals, _aK_)[1 + _aK_]){ + var _aQ_ = caml_call1(Base_Char[29], v); + caml_check_bound(arr, k)[1 + k] = _aQ_; + var _aR_ = caml_call1(Base_Char[29], v); + caml_check_bound(vals, _aR_)[1 + _aR_] = 1; + var param = l; + continue; + } + } + var + _aL_ = caml_call2(Base_Import[150], Base_Import[141], Base_Import[141]), + _aM_ = + [0, + [0, + cst_escapeworthy_map, + caml_call2(Base_Import[152], _aL_, escapeworthy_map$0)], + 0], + _aN_ = [0, [0, cst_c_to, caml_call1(Base_Import[141], c_to)], _aM_], + _aO_ = [0, [0, cst_c_from, caml_call1(Base_Import[141], c_from)], _aN_], + _aP_ = caml_call2(Base_Sexp[9], cst_escapeworthy_map_not_one_t, _aO_); + return caml_call1(Base_Or_error[35], _aP_); + } + } + function escape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 258914209); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var + to_escape_len = [0, 0], + to_escape = + foldi + (src, + 0, + function(i, acc, c){ + var + _aJ_ = caml_call1(Base_Char[29], c), + n = caml_check_bound(escapeworthy, _aJ_)[1 + _aJ_]; + return -1 === n + ? acc + : (caml_call1 + (Base_Import[130], to_escape_len), + [0, [0, i, caml_call1(Base_Char[32], n)], acc]); + }); + if(! to_escape) return src; + var + last_idx = caml_ml_string_length(src), + last_dst_pos = + caml_call2(Base_Import[91], last_idx, to_escape_len[1]), + dst = caml_call1(Base_Bytes0[7], last_dst_pos), + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param = to_escape; + for(;;){ + if(param){ + var + to_escape$0 = param[2], + match = param[1], + escaped_char = match[2], + last_idx$1 = match[1], + _aH_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _aH_, 1), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aI_ = caml_call2(Base_Import[91], last_idx$1, 1); + caml_call5(Base_Bytes0[4], src, _aI_, dst, dst_pos, len); + var last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 2); + caml_bytes_set(dst, last_dst_pos$1, escape_char); + caml_bytes_set + (dst, + caml_call2(Base_Import[91], last_dst_pos$1, 1), + escaped_char); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param = to_escape$0; + continue; + } + caml_call5(Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + return caml_call1(Base_Bytes0[16], dst); + } + }]; + } + function escape_gen_exn(escapeworthy_map, escape_char){ + var _aG_ = escape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _aG_)); + } + function escape(escapeworthy, escape_char){ + var + _aE_ = caml_call2(Base_List[114], escapeworthy, Base_Char[16]), + _aF_ = Base_List[76], + escapeworthy_map = caml_call2(_aF_, _aE_, function(c){return [0, c, c];}); + return escape_gen_exn(escapeworthy_map, escape_char); + } + function unescape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 919809722); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var i = 0, status = -512962225, to_unescape = 0; + for(;;){ + if(caml_ml_string_length(src) <= i){ + if(! to_unescape) return src; + var + to_unescape$0 = to_unescape[2], + idx = to_unescape[1], + _ax_ = caml_call1(Base_List[7], to_unescape), + _ay_ = + caml_call2 + (Base_Import[93], caml_ml_string_length(src), _ax_), + dst = caml_call1(Base_Bytes0[7], _ay_), + loop = + function(last_idx, last_dst_pos, param){ + var + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param$0 = param; + for(;;){ + if(! param$0) + return caml_call5 + (Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + var + to_unescape = param$0[2], + last_idx$1 = param$0[1], + _az_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _az_, 2), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aA_ = caml_call2(Base_Import[91], last_idx$1, 2); + caml_call5(Base_Bytes0[4], src, _aA_, dst, dst_pos, len); + var + last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 1), + _aB_ = + caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)), + _aC_ = caml_call1(Base_Char[29], _aB_), + n = caml_check_bound(escapeworthy, _aC_)[1 + _aC_], + _aD_ = + -1 === n + ? caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)) + : caml_call1(Base_Char[32], n); + caml_bytes_set(dst, last_dst_pos$1, _aD_); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param$0 = to_unescape; + } + }; + if + (idx + < caml_call2(Base_Import[93], caml_ml_string_length(src), 1)) + loop + (caml_ml_string_length(src), + caml_ml_bytes_length(dst), + to_unescape); + else + loop + (caml_call2(Base_Import[93], caml_ml_string_length(src), 1), + caml_ml_bytes_length(dst), + to_unescape$0); + return caml_call1(Base_Bytes0[16], dst); + } + if(-512962225 <= status) + var + _aw_ = caml_string_get(src, i), + status$0 = + caml_call2(Base_Char[15], _aw_, escape_char) + ? -767030498 + : -512962225; + else + var status$0 = -244189789; + var + acc = + -512962225 <= status$0 ? to_unescape : [0, i, to_unescape], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + status = status$0, + to_unescape = acc; + } + }]; + } + function unescape_gen_exn(escapeworthy_map, escape_char){ + var _av_ = unescape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _av_)); + } + function unescape(escape_char){return unescape_gen_exn(0, escape_char);} + function preceding_escape_chars(str, escape_char, pos){ + var p$1 = caml_call2(Base_Import[93], pos, 1), p = p$1, cnt = 0; + for(;;){ + if(0 <= p){ + var _au_ = caml_string_get(str, p); + if(! caml_call2(Base_Char[14], _au_, escape_char)){ + var + cnt$0 = caml_call2(Base_Import[91], cnt, 1), + p$0 = caml_call2(Base_Import[93], p, 1), + p = p$0, + cnt = cnt$0; + continue; + } + } + return cnt; + } + } + function update_escape_status(str, escape_char, i, param){ + if(-512962225 > param) return -244189789; + var _at_ = caml_string_get(str, i); + return caml_call2(Base_Char[15], _at_, escape_char) + ? -767030498 + : -512962225; + } + function escape_status(str, escape_char, pos){ + var + _ar_ = preceding_escape_chars(str, escape_char, pos), + odd = 1 === caml_call2(Base_Import[122], _ar_, 2) ? 1 : 0, + _as_ = caml_string_get(str, pos), + match = caml_call2(Base_Char[15], _as_, escape_char); + return odd ? -244189789 : match ? -767030498 : -512962225; + } + function check_bound(str, pos, function_name){ + var + _ap_ = caml_ml_string_length(str) <= pos ? 1 : 0, + _aq_ = _ap_ || (pos < 0 ? 1 : 0); + return _aq_ ? caml_call3(invalid_argf, _E_, function_name, 0) : _aq_; + } + function is_char_escaping(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaping); + return -512962225 <= escape_status(str, escape_char, pos) ? 0 : 1; + } + function is_char_escaped(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaped); + return -244189789 <= escape_status(str, escape_char, pos) ? 1 : 0; + } + function is_char_literal(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_literal); + return -512962225 === escape_status(str, escape_char, pos) ? 1 : 0; + } + function index_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_index_from); + var + status$1 = escape_status(str, escape_char, pos), + i = pos, + status = status$1; + for(;;){ + if(pos <= i){ + var _an_ = -512962225 === status ? 1 : 0; + if(_an_){ + var _ao_ = caml_string_get(str, i); + if(caml_call2(Base_Char[15], _ao_, char$0)) return [0, i]; + } + } + var i$0 = caml_call2(Base_Import[91], i, 1); + if(caml_ml_string_length(str) <= i$0) return 0; + var + status$0 = update_escape_status(str, escape_char, i$0, status), + i = i$0, + status = status$0; + } + } + function index_from_exn$0(str, escape_char, pos, char$0){ + var match = index_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _aj_ = [0, [0, cst_char, caml_call1(Base_Import[141], char$0)], 0], + _ak_ = [0, [0, cst_pos, caml_call1(Base_Import[142], pos)], _aj_], + _al_ = + [0, + [0, cst_escape_char, caml_call1(Base_Import[141], escape_char)], + _ak_], + _am_ = [0, [0, cst_str, caml_call1(sexp_of_t, str)], _al_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_index_from_exn_not_found, _am_)); + } + function index$1(str, escape_char, char$0){ + return index_from$0(str, escape_char, 0, char$0); + } + function index_exn$1(str, escape_char, char$0){ + return index_from_exn$0(str, escape_char, 0, char$0); + } + function rindex_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_rindex_from); + if(caml_call2(Base_Char[15], char$0, escape_char)) return 0; + var pos$0 = pos; + for(;;){ + if(0 > pos$0) return 0; + var escape_chars = preceding_escape_chars(str, escape_char, pos$0); + if(0 === caml_call2(Base_Import[122], escape_chars, 2)){ + var _ah_ = caml_string_get(str, pos$0); + if(caml_call2(Base_Char[15], _ah_, char$0)) return [0, pos$0]; + } + var + _ai_ = caml_call2(Base_Import[93], pos$0, escape_chars), + pos$1 = caml_call2(Base_Import[93], _ai_, 1), + pos$0 = pos$1; + } + } + function rindex_from_exn$0(str, escape_char, pos, char$0){ + var match = rindex_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _ad_ = [0, [0, cst_char$0, caml_call1(Base_Import[141], char$0)], 0], + _ae_ = [0, [0, cst_pos$0, caml_call1(Base_Import[142], pos)], _ad_], + _af_ = + [0, + [0, cst_escape_char$0, caml_call1(Base_Import[141], escape_char)], + _ae_], + _ag_ = [0, [0, cst_str$0, caml_call1(sexp_of_t, str)], _af_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_rindex_from_exn_not_found, _ag_)); + } + function rindex$0(str, escape_char, char$0){ + return is_empty(str) + ? 0 + : rindex_from$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function rindex_exn$0(str, escape_char, char$0){ + return rindex_from_exn$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function split_gen$0(str, escape_char, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + len = caml_ml_string_length(str), + acc = 0, + status = -512962225, + last_pos = 0, + pos = 0; + for(;;){ + if(pos === len){ + var + _ab_ = + [0, + sub(str, last_pos, caml_call2(Base_Import[93], len, last_pos)), + acc]; + return caml_call1(Base_List[38], _ab_); + } + var + status$0 = update_escape_status(str, escape_char, pos, status), + _ac_ = -512962225 === status$0 ? 1 : 0; + if(_ac_ && is_delim(caml_string_get(str, pos))){ + var + sub_str = + sub(str, last_pos, caml_call2(Base_Import[93], pos, last_pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + last_pos$0 = caml_call2(Base_Import[91], pos, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + status = status$0, + last_pos = last_pos$0, + pos = pos$0; + continue; + } + var + pos$1 = caml_call2(Base_Import[91], pos, 1), + status = status$0, + pos = pos$1; + } + } + function split$0(str, on){ + var _$_ = [0, -1044422954, on]; + return function(_aa_){return split_gen$0(str, _aa_, _$_);}; + } + function split_on_chars$0(str, chars){ + var _Z_ = [0, 552554919, chars]; + return function(___){return split_gen$0(str, ___, _Z_);}; + } + function split_at(str, pos){ + var + _W_ = caml_call2(Base_Import[93], caml_ml_string_length(str), pos), + _X_ = caml_call2(Base_Import[93], _W_, 1), + _Y_ = sub(str, caml_call2(Base_Import[91], pos, 1), _X_); + return [0, sub(str, 0, pos), _Y_]; + } + function lsplit2$0(str, on, escape_char){ + function _U_(x){return split_at(str, x);} + var _V_ = index$1(str, escape_char, on); + return caml_call2(Base_Option[21], _V_, _U_); + } + function rsplit2$0(str, on, escape_char){ + function _S_(x){return split_at(str, x);} + var _T_ = rindex$0(str, escape_char, on); + return caml_call2(Base_Option[21], _T_, _S_); + } + function lsplit2_exn$0(str, on, escape_char){ + return split_at(str, index_exn$1(str, escape_char, on)); + } + function rsplit2_exn$0(str, on, escape_char){ + return split_at(str, rindex_exn$0(str, escape_char, on)); + } + function last_non_drop_literal(drop, escape_char, t){ + return rfindi + (0, + t, + function(i, c){ + var _P_ = 1 - caml_call1(drop, c); + if(_P_) + var _Q_ = _P_; + else{ + var _R_ = is_char_escaping(t, escape_char, i); + if(! _R_) return is_char_escaped(t, escape_char, i); + var _Q_ = _R_; + } + return _Q_; + }); + } + function first_non_drop_literal(drop, escape_char, t){ + return lfindi + (0, + t, + function(i, c){ + var _M_ = 1 - caml_call1(drop, c); + if(_M_) + var _N_ = _M_; + else{ + var _O_ = is_char_escaping(t, escape_char, i); + if(! _O_) return is_char_escaped(t, escape_char, i); + var _N_ = _O_; + } + return _N_; + }); + } + function rstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop_literal(drop, escape_char, t); + if(! match) return cst$8; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function lstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$9; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$10; + var + first = match[1], + match$0 = last_non_drop_literal(drop, escape_char, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var last = match$0[1], _L_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _L_, 1)); + } + } + return t; + } + function between$0(t, low, high){ + var _K_ = caml_call2(Base_Import[109][2], low, t); + return _K_ ? caml_call2(Base_Import[109][2], t, high) : _K_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[109][1], t, min) + ? min + : caml_call2(Base_Import[109][2], t, max) ? t : max; + } + function clamp_exn$0(t, min, max){ + if(caml_call2(Base_Import[109][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + } + function clamp$0(t, min, max){ + if(! caml_call2(Base_Import[109][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _H_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _I_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _H_], + _J_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _I_); + return caml_call1(Base_Or_error[35], _J_); + } + function create$0(opt, pattern){ + if(opt) + var sth = opt[1], case_sensitive = sth; + else + var case_sensitive = 1; + return create(pattern, case_sensitive); + } + var + include$1 = Base_Import[109], + symbol$6 = include$1[1], + symbol$7 = include$1[2], + symbol$8 = include$1[3], + symbol$9 = include$1[4], + symbol$10 = include$1[5], + symbol$11 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$1 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_String = + [0, + t_sexp_grammar, + sub, + subo, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + iteri, + existsi, + for_alli, + counti, + findi, + find_mapi, + hash_fold_t, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$11, + symbol$7, + symbol$9, + symbol$10, + symbol$6, + symbol$8, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator, + pp, + hashable, + invariant, + max_length, + make, + copy, + init, + symbol, + concat, + escaped, + contains, + uppercase, + lowercase, + capitalize, + uncapitalize, + [0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$2, + t_sexp_grammar$0, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal$0, + compare$1, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator$0, + is_suffix, + is_prefix, + is_substring$0, + is_substring_at, + substr_index$0, + substr_index_exn$0, + substr_index_all$0, + substr_replace_first$0, + substr_replace_all$0], + index, + index_exn, + index_from, + index_from_exn, + rindex, + rindex_exn, + rindex_from, + rindex_from_exn, + [0, + sexp_of_t$0, + create$0, + pattern, + case_sensitive, + matches, + index$0, + index_exn$0, + index_all, + replace_first, + replace_all, + split_on, + Private], + substr_index, + substr_index_exn, + substr_index_all, + substr_replace_first, + substr_replace_all, + is_substring, + is_substring_at$0, + to_list_rev, + rev, + is_suffix$0, + is_prefix$0, + lsplit2_exn, + rsplit2_exn, + lsplit2, + rsplit2, + split, + split_on_chars, + split_lines, + lfindi, + rfindi, + lstrip, + rstrip, + strip, + map, + mapi, + foldi, + concat_map, + filter, + filteri, + tr, + tr_multi, + chop_suffix_exn, + chop_prefix_exn, + chop_suffix, + chop_prefix, + chop_suffix_if_exists, + chop_prefix_if_exists, + suffix, + prefix, + drop_suffix, + drop_prefix, + common_suffix, + common_prefix, + common_suffix_length, + common_prefix_length, + common_suffix2, + common_prefix2, + common_suffix2_length, + common_prefix2_length, + concat_array, + equal$1, + of_char, + of_char_list, + [0, + escape_gen_exn, + escape_gen, + escape, + unescape_gen_exn, + unescape_gen, + unescape, + is_char_escaping, + is_char_escaped, + is_char_literal, + index$1, + index_exn$1, + rindex$0, + rindex_exn$0, + index_from$0, + index_from_exn$0, + rindex_from$0, + rindex_from_exn$0, + split$0, + split_on_chars$0, + lsplit2$0, + lsplit2_exn$0, + rsplit2$0, + rsplit2_exn$0, + lstrip_literal, + rstrip_literal, + strip_literal]]; + runtime.caml_register_global(86, Base_String, "Base__String"); + return; + } + (globalThis)); + +//# 17841 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Bytes", + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Array0 = global_data.Base__Array0, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Staged = global_data.Base__Staged, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Blit = global_data.Base__Blit, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + stage = Base_Staged[1], + t_of_sexp = Base_Import[164], + sexp_of_t = Base_Import[140], + t_sexp_grammar = Base_Import[184], + max_length = Base_Bytes0[2], + compare = Base_Bytes0[5], + copy = Base_Bytes0[6], + create = Base_Bytes0[7], + fill = Base_Bytes0[8], + make = Base_Bytes0[9], + map = Base_Bytes0[10], + mapi = Base_Bytes0[11], + unsafe_blit = Base_Bytes0[13], + to_string = Base_Bytes0[14], + of_string = Base_Bytes0[15], + unsafe_to_string = Base_Bytes0[16], + unsafe_of_string_promise_no_mu = Base_Bytes0[17], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _c_ = [0, "src/bytes.ml", 128, 2], + cst_tr_multi_replacement_is_th = + "tr_multi: replacement is the empty string", + _b_ = [0, [11, "Bytes.init ", [4, 0, 0, 0, 0]], "Bytes.init %d"], + _a_ = [0, [3, 0, 0], "%S"]; + function pp(fmt, t){ + var _y_ = caml_call1(to_string, t); + return caml_call3(Stdlib_Format[135], fmt, _a_, _y_); + } + function create$0(len){return caml_call1(create, len);} + var + To_bytes = + caml_call1 + (Base_Blit[1], [0, caml_ml_bytes_length, create$0, unsafe_blit]), + blit = To_bytes[1], + blito = To_bytes[2], + unsafe_blit$0 = To_bytes[3], + sub = To_bytes[4], + subo = To_bytes[5], + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + To_string = caml_call1(caml_call1(Base_Blit[3], [0]), To_bytes); + function create$1(len){return caml_call1(create, len);} + var + length = caml_ml_bytes_length, + unsafe_blit$1 = runtime.caml_blit_string, + length$0 = caml_ml_string_length, + From_string = + caml_call1 + (caml_call1(Base_Blit[2], [0, length$0]), + [0, length, create$1, unsafe_blit$1]); + function invariant(param){return 0;} + function init(n, f){ + if(n < 0) caml_call3(Base_Printf[7], _b_, n, 0); + var + t = caml_call1(create, n), + _w_ = caml_call2(Base_Import[93], n, 1), + _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + caml_bytes_unsafe_set(t, i, caml_call1(f, i)); + var _x_ = i + 1 | 0; + if(_w_ !== i){var i = _x_; continue;} + break; + } + } + return t; + } + function of_char_list(l){ + var t = caml_call1(create, caml_call1(Base_List[7], l)); + function _u_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _u_); + return t; + } + function to_list(t){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_bytes_length(t), 1), + i = i$1, + acc = 0; + for(;;){ + if(0 > i) return acc; + var + acc$0 = [0, caml_bytes_unsafe_get(t, i), acc], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + acc = acc$0; + } + } + function to_array(t){ + function _t_(i){return caml_bytes_unsafe_get(t, i);} + return caml_call2(Base_Array0[11], caml_ml_bytes_length(t), _t_); + } + function map$0(t, f){return caml_call2(map, f, t);} + function mapi$0(t, f){return caml_call2(mapi, f, t);} + function fold(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call2(f, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call3(f, pos, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function tr(target, replacement, s){ + var + _r_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _q_ = 0; + if(_r_ >= 0){ + var i = _q_; + for(;;){ + if(caml_call2(Base_Char[15], caml_bytes_unsafe_get(s, i), target)) + caml_bytes_unsafe_set(s, i, replacement); + var _s_ = i + 1 | 0; + if(_r_ !== i){var i = _s_; continue;} + break; + } + } + return 0; + } + function tr_multi(target, replacement){ + if(0 === caml_ml_string_length(target)) + return caml_call1(stage, function(_p_){return 0;}); + if(0 === caml_ml_string_length(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_th); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_o_){return 0;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + var + _m_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + caml_bytes_unsafe_set + (s, + i, + runtime.caml_string_unsafe_get + (tr_map, + caml_call1(Base_Char[29], caml_bytes_unsafe_get(s, i)))); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return 0; + }); + } + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[110][2], low, t); + return _k_ ? caml_call2(Base_Import[110][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[110][1], t, min) + ? min + : caml_call2(Base_Import[110][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[110][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[110][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function contains(pos, len, t, char$0){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], + pos, + len, + 0, + caml_ml_bytes_length(t)), + len$0 = match[2], + pos$0 = match[1], + last = caml_call2(Base_Import[91], pos$0, len$0), + i = pos$0; + for(;;){ + var _d_ = i < last ? 1 : 0; + if(_d_){ + var + _e_ = caml_bytes_get(t, i), + _f_ = caml_call2(Base_Char[15], _e_, char$0); + if(! _f_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _g_ = _f_; + } + else + var _g_ = _d_; + return _g_; + } + } + var + include$0 = Base_Import[110], + symbol = include$0[1], + symbol$0 = include$0[2], + symbol$1 = include$0[3], + symbol$2 = include$0[4], + symbol$3 = include$0[5], + symbol$4 = include$0[6], + ascending = include$0[7], + descending = include$0[8], + compare$0 = include$0[9], + equal = include$0[10], + max = include$0[11], + min = include$0[12], + Base_Bytes = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + blit, + blito, + unsafe_blit$0, + sub, + subo, + symbol$4, + symbol$0, + symbol$2, + symbol$3, + symbol, + symbol$1, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + of_string, + to_string, + pp$0, + invariant, + To_string, + From_string, + create, + make, + map$0, + mapi$0, + copy, + init, + of_char_list, + caml_bytes_get, + caml_bytes_set, + fill, + tr, + tr_multi, + to_list, + to_array, + fold, + foldi, + contains, + max_length, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(24, Base_Bytes, "Base__Bytes"); + return; + } + (globalThis)); + +//# 18184 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + ocaml_lex_tables = + [0, + "\0\0\0\0\x01\0\x01\0\x02\0\x1b\0R\0i\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\x01\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + "\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\x02\0\0\0\0\0\x01\0\x03\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\x06\0\x04\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\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\x06\0\x04\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\x07\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\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\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\0\0\x02\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\xff\xff\xff\xff\x01\0\x03\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\x03\0\x05\0\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + cst, + cst, + cst, + cst, + cst, + cst], + Stdlib_Lexing = global_data.Stdlib__Lexing; + function parse_hex(lexbuf){ + var ocaml_lex_state = 0; + for(;;){ + var + ocaml_lex_state$0 = + caml_call3 + (Stdlib_Lexing[20], ocaml_lex_tables, ocaml_lex_state, lexbuf); + if(0 === ocaml_lex_state$0){ + var + body = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 3 | 0, lexbuf[6]); + return [0, body]; + } + if(1 === ocaml_lex_state$0){ + var + body$0 = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 2 | 0, lexbuf[6]); + return [1, body$0]; + } + caml_call1(lexbuf[1], lexbuf); + var ocaml_lex_state = ocaml_lex_state$0; + } + } + var Base_Hex_lexer = [0, parse_hex]; + runtime.caml_register_global(2, Base_Hex_lexer, "Base__Hex_lexer"); + return; + } + (globalThis)); + +//# 18245 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_int$3 = "int", + cst_int32$3 = "int32", + cst_int64$3 = "int64", + cst_nativeint$2 = "nativeint", + cst_src_int_conversions_ml = "src/int_conversions.ml", + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Hex_lexer = global_data.Base__Hex_lexer, + Stdlib_Lexing = global_data.Stdlib__Lexing, + Base_Option = global_data.Base__Option, + Base_Char = global_data.Base__Char, + Base_String = global_data.Base__String, + Base_Printf = global_data.Base__Printf, + Base_Import = global_data.Base__Import, + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + Base_Sexpable = global_data.Base__Sexpable, + Base_Bytes = global_data.Base__Bytes, + Base_Sys0 = global_data.Base__Sys0, + Base_Word_size = global_data.Base__Word_size, + Assert_failure = global_data.Assert_failure, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Int0 = global_data.Base__Int0, + Base_Sexp = global_data.Base__Sexp, + _g_ = + [0, + [2, 0, [11, ".of_string: invalid input ", [3, 0, 0]]], + "%s.of_string: invalid input %S"], + cst_0x = "-0x", + cst_0x$0 = "0x", + cst_int63 = "int63", + cst_int64$2 = cst_int64$3, + cst_nativeint$1 = cst_nativeint$2, + cst_int64$1 = cst_int64$3, + cst_int32$2 = cst_int32$3, + cst_nativeint$0 = cst_nativeint$2, + cst_int32$1 = cst_int32$3, + cst_int64$0 = cst_int64$3, + cst_int$2 = cst_int$3, + cst_nativeint = cst_nativeint$2, + cst_int$1 = cst_int$3, + cst_int64 = cst_int64$3, + cst_int$0 = cst_int$3, + cst_int32$0 = cst_int32$3, + cst_int32 = cst_int32$3, + cst_int = cst_int$3, + _a_ = + [0, + [11, + "conversion from ", + [2, + 0, + [11, + " to ", + [2, 0, [11, " failed: ", [2, 0, [11, " is out of range", 0]]]]]]], + "conversion from %s to %s failed: %s is out of range"], + _m_ = [0, cst_src_int_conversions_ml, 19, 9], + _l_ = [0, cst_src_int_conversions_ml, 75, 9], + _k_ = [0, cst_src_int_conversions_ml, 96, 9], + _j_ = [0, cst_src_int_conversions_ml, 148, 9], + _i_ = [0, cst_src_int_conversions_ml, 176, 9]; + function convert_failure(x, a, b, to_string){ + var _S_ = caml_call1(to_string, x); + return caml_call5(Base_Printf[6], _a_, a, b, _S_, 0); + } + var + num_bits_int = Base_Sys0[8], + num_bits_nativeint = caml_call1(Base_Word_size[2], Base_Word_size[3]), + num_bits_int32 = 32, + num_bits_int64 = 64; + if(63 !== num_bits_int && 31 !== num_bits_int && 32 !== num_bits_int) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + var + min_int32 = Stdlib_Int32[10], + max_int32 = Stdlib_Int32[9], + min_int64 = Stdlib_Int64[10], + max_int64 = Stdlib_Int64[9], + min_nativeint = Stdlib_Nativeint[11], + max_nativeint = Stdlib_Nativeint[10], + int64_to_string = Stdlib_Int64[14], + nativeint_to_string = Stdlib_Nativeint[15], + _b_ = Base_Import[85][32], + _c_ = Stdlib_Int32[14]; + function int32_to_int_trunc(_R_){return _R_;} + function int_to_int32_trunc(_Q_){return _Q_;} + var + int_is_representable_as_int32 = + num_bits_int <= 32 + ? function(param){return 1;} + : function + (x){ + var + _O_ = caml_call2(Base_Import[229], min_int32, x) <= 0 ? 1 : 0, + _P_ = + _O_ + ? caml_call2(Base_Import[229], x, max_int32) <= 0 ? 1 : 0 + : _O_; + return _P_; + }; + if(32 <= num_bits_int) + var _d_ = function(param){return 1;}; + else + var + min$4 = Base_Int0[6], + max$4 = Base_Int0[5], + _d_ = + function(x){ + var + _M_ = caml_call2(Base_Import[230], min$4, x) <= 0 ? 1 : 0, + _N_ = _M_ ? caml_call2(Base_Import[230], x, max$4) <= 0 ? 1 : 0 : _M_; + return _N_; + }; + function int_to_int32(x){ + return int_is_representable_as_int32(x) ? [0, x] : 0; + } + function int32_to_int(x){return _d_(x) ? [0, x] : 0;} + function int_to_int32_exn(x){ + return int_is_representable_as_int32(x) + ? x + : convert_failure(x, cst_int, cst_int32, _b_); + } + function int32_to_int_exn(x){ + return _d_(x) ? x : convert_failure(x, cst_int32$0, cst_int$0, _c_); + } + if(num_bits_int >= 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + int_to_int64 = caml_int64_of_int32, + int64_to_int_trunc = caml_int64_to_int32, + min = caml_int64_of_int32(Base_Int0[6]), + max = caml_int64_of_int32(Base_Int0[5]); + function int64_is_representable_as_int(x){ + var + _K_ = caml_call2(Base_Import[231], min, x) <= 0 ? 1 : 0, + _L_ = _K_ ? caml_call2(Base_Import[231], x, max) <= 0 ? 1 : 0 : _K_; + return _L_; + } + function int64_to_int(x){ + return int64_is_representable_as_int(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int_exn(x){ + return int64_is_representable_as_int(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64, cst_int$1, int64_to_string); + } + if(num_bits_int > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + function int_to_nativeint(_J_){return _J_;} + function nativeint_to_int_trunc(_I_){return _I_;} + if(num_bits_nativeint <= num_bits_int) + var _e_ = function(param){return 1;}; + else + var + min$3 = Base_Int0[6], + max$3 = Base_Int0[5], + _e_ = + function(x){ + var + _G_ = caml_call2(Base_Import[232], min$3, x) <= 0 ? 1 : 0, + _H_ = _G_ ? caml_call2(Base_Import[232], x, max$3) <= 0 ? 1 : 0 : _G_; + return _H_; + }; + function nativeint_to_int(x){return _e_(x) ? [0, x] : 0;} + function nativeint_to_int_exn(x){ + return _e_(x) + ? x + : convert_failure + (x, cst_nativeint, cst_int$2, nativeint_to_string); + } + var + int32_to_int64 = caml_int64_of_int32, + int64_to_int32_trunc = caml_int64_to_int32, + min$0 = caml_int64_of_int32(min_int32), + max$0 = caml_int64_of_int32(max_int32); + function int64_is_representable_as_int3(x){ + var + _E_ = caml_call2(Base_Import[231], min$0, x) <= 0 ? 1 : 0, + _F_ = _E_ ? caml_call2(Base_Import[231], x, max$0) <= 0 ? 1 : 0 : _E_; + return _F_; + } + function int64_to_int32(x){ + return int64_is_representable_as_int3(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int32_exn(x){ + return int64_is_representable_as_int3(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64$0, cst_int32$1, int64_to_string); + } + if(32 > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + function int32_to_nativeint(_D_){return _D_;} + function nativeint_to_int32_trunc(_C_){return _C_;} + var + _f_ = + num_bits_nativeint <= 32 + ? function(param){return 1;} + : function + (x){ + var + _A_ = caml_call2(Base_Import[232], min_int32, x) <= 0 ? 1 : 0, + _B_ = + _A_ + ? caml_call2(Base_Import[232], x, max_int32) <= 0 ? 1 : 0 + : _A_; + return _B_; + }; + function nativeint_to_int32(x){return _f_(x) ? [0, x] : 0;} + function nativeint_to_int32_exn(x){ + return _f_(x) + ? x + : convert_failure + (x, cst_nativeint$0, cst_int32$2, nativeint_to_string); + } + if(num_bits_nativeint > 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var + int64_to_nativeint_trunc = caml_int64_to_int32, + nativeint_to_int64 = caml_int64_of_int32; + if(64 <= num_bits_nativeint) + var int64_is_representable_as_nati = function(param){return 1;}; + else + var + min$2 = caml_int64_of_int32(min_nativeint), + max$2 = caml_int64_of_int32(max_nativeint), + int64_is_representable_as_nati = + function(x){ + var + _y_ = caml_call2(Base_Import[231], min$2, x) <= 0 ? 1 : 0, + _z_ = _y_ ? caml_call2(Base_Import[231], x, max$2) <= 0 ? 1 : 0 : _y_; + return _z_; + }; + function int64_to_nativeint(x){ + return int64_is_representable_as_nati(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_nativeint_exn(x){ + return int64_is_representable_as_nati(x) + ? caml_int64_to_int32(x) + : convert_failure + (x, cst_int64$1, cst_nativeint$1, int64_to_string); + } + var + min$1 = caml_int64_shift_right(min_int64, 1), + max$1 = caml_int64_shift_right(max_int64, 1); + function int64_is_representable_as_int6(x){ + var + _w_ = caml_call2(Base_Import[231], min$1, x) <= 0 ? 1 : 0, + _x_ = _w_ ? caml_call2(Base_Import[231], x, max$1) <= 0 ? 1 : 0 : _w_; + return _x_; + } + function int64_fit_on_int63_exn(x){ + return int64_is_representable_as_int6(x) + ? 0 + : convert_failure(x, cst_int64$2, cst_int63, int64_to_string); + } + function insert_delimiter_every(input, delimiter, chars_per_delimiter){ + var input_length = runtime.caml_ml_string_length(input); + if(input_length <= chars_per_delimiter) return input; + var match = caml_string_get(input, 0), switch$0 = 0; + if(43 !== match && 45 !== match){var has_sign = 0; switch$0 = 1;} + if(! switch$0) var has_sign = 1; + var + num_digits = + has_sign ? caml_call2(Base_Import[93], input_length, 1) : input_length, + _t_ = caml_call2(Base_Import[93], num_digits, 1), + num_delimiters = caml_call2(Base_Import[95], _t_, chars_per_delimiter), + output_length = caml_call2(Base_Import[91], input_length, num_delimiters), + output = caml_call1(Base_Bytes[31], output_length), + input_pos = [0, caml_call2(Base_Import[93], input_length, 1)], + output_pos = [0, caml_call2(Base_Import[93], output_length, 1)], + num_chars_until_delimiter = [0, chars_per_delimiter], + first_digit_pos = has_sign ? 1 : 0; + for(;;){ + if(first_digit_pos <= input_pos[1]){ + if(0 === num_chars_until_delimiter[1]){ + caml_call3(Base_Bytes[39], output, output_pos[1], delimiter); + caml_call1(Base_Import[129], output_pos); + num_chars_until_delimiter[1] = chars_per_delimiter; + } + var _u_ = caml_string_get(input, input_pos[1]); + caml_call3(Base_Bytes[39], output, output_pos[1], _u_); + caml_call1(Base_Import[129], input_pos); + caml_call1(Base_Import[129], output_pos); + caml_call1(Base_Import[129], num_chars_until_delimiter); + continue; + } + if(has_sign){ + var _v_ = caml_string_get(input, 0); + caml_call3(Base_Bytes[39], output, 0, _v_); + } + return caml_call1(Base_Bytes[49], output); + } + } + function insert_delimiter(input, delimiter){ + return insert_delimiter_every(input, delimiter, 3); + } + function insert_underscores(input){return insert_delimiter(input, 95);} + var sexp_of_int_style = Base_Sexp[19]; + function _h_(I){ + var compare = I[1], hash_fold_t = I[2], func = I[3]; + function hash(x){return caml_call1(func, x);} + var chars_per_delimiter = 4; + function to_string(delimiter, t){ + if(delimiter) + var + delimiter$0 = delimiter[1], + make_suffix = + function(t){ + return insert_delimiter_every + (caml_call1(I[4], t), delimiter$0, chars_per_delimiter); + }; + else + var make_suffix = I[4]; + if(caml_call2(I[7], t, I[6])){ + var _r_ = caml_call1(make_suffix, caml_call1(I[8], t)); + return caml_call2(Base_Import[112], cst_0x, _r_); + } + var _s_ = caml_call1(make_suffix, t); + return caml_call2(Base_Import[112], cst_0x$0, _s_); + } + function to_string$0(t){return to_string(0, t);} + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return to_string([0, delimiter], t); + } + function invalid(str){ + return caml_call4(Base_Printf[6], _g_, I[9], str, 0); + } + function of_string_with_delimiter(str){ + function _p_(c){return caml_call2(Base_Char[14], c, 95);} + var _q_ = caml_call2(Base_String[98], str, _p_); + return caml_call1(I[5], _q_); + } + function of_string(str){ + var lex = caml_call2(Stdlib_Lexing[3], 0, str); + function _n_(param){return caml_call1(Base_Hex_lexer[1], lex);} + var result = caml_call1(Base_Option[44], _n_); + if(lex[6] !== lex[3]) return invalid(str); + if(! result) return invalid(str); + var match = result[1]; + if(0 === match[0]){ + var body = match[1], _o_ = of_string_with_delimiter(body); + return caml_call1(I[8], _o_); + } + var body$0 = match[1]; + return of_string_with_delimiter(body$0); + } + var + t_sexp_grammar = caml_call1(Sexplib0_Sexp_grammar[1], Base_String[1]), + include = caml_call1(Base_Sexpable[5], [0, of_string, to_string$0]), + t_of_sexp = include[1], + sexp_of_t = include[2]; + return [0, + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + hash, + of_string, + to_string$0, + to_string_hum]]; + } + var + Base_Int_conversions = + [0, + int_to_int32, + int_to_int32_exn, + int_to_int32_trunc, + int_to_int64, + int_to_nativeint, + int32_to_int, + int32_to_int_exn, + int32_to_int_trunc, + int32_to_int64, + int32_to_nativeint, + int64_to_int, + int64_to_int_exn, + int64_to_int_trunc, + int64_to_int32, + int64_to_int32_exn, + int64_to_int32_trunc, + int64_to_nativeint, + int64_to_nativeint_exn, + int64_to_nativeint_trunc, + int64_fit_on_int63_exn, + int64_is_representable_as_int6, + nativeint_to_int, + nativeint_to_int_exn, + nativeint_to_int_trunc, + nativeint_to_int32, + nativeint_to_int32_exn, + nativeint_to_int32_trunc, + nativeint_to_int64, + num_bits_int, + num_bits_int32, + num_bits_int64, + num_bits_nativeint, + function(I){ + var chars_per_delimiter = 3; + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return insert_delimiter_every + (caml_call1(I[1], t), delimiter, chars_per_delimiter); + } + function sexp_of_t(t){ + var + s = caml_call1(I[1], t), + s$0 = + 1009018843 <= sexp_of_int_style[1] + ? s + : insert_delimiter_every(s, 95, chars_per_delimiter); + return [0, s$0]; + } + return [0, to_string_hum, sexp_of_t]; + }, + _h_, + sexp_of_int_style, + insert_delimiter_every, + insert_delimiter, + insert_underscores]; + runtime.caml_register_global + (44, Base_Int_conversions, "Base__Int_conversions"); + return; + } + (globalThis)); + +//# 18718 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Int_intf = [0]; + runtime.caml_register_global(0, Base_Int_intf, "Base__Int_intf"); + return; + } + (globalThis)); + +//# 18728 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + overflow_bound_max_int63_on_in = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + overflow_bound_max_int64_value = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Base_Import = global_data.Base__Import, + Base_Int_conversions = global_data.Base__Int_conversions, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + int32_positive_overflow_bounds = + [0, + 2147483647, + 2147483647, + 46340, + 1290, + 215, + 73, + 35, + 21, + 14, + 10, + 8, + 7, + 5, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1].slice + (), + overflow_bound_max_int_value = caml_call2(Base_Import[120], -1, 1), + switcher = Base_Int_conversions[29] - 31 | 0, + _g_ = [0, "src/pow_overflow_bounds.ml", 218, 9], + _a_ = runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _c_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _i_ = + [0, + 1073741823, + 1073741823, + 32767, + 1023, + 181, + 63, + 31, + 19, + 13, + 10, + 7, + 6, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1], + _d_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + runtime.caml_int64_create_lo_mi_hi(1664510, 0, 0), + runtime.caml_int64_create_lo_mi_hi(46340, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5404, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1290, 0, 0), + runtime.caml_int64_create_lo_mi_hi(463, 0, 0), + runtime.caml_int64_create_lo_mi_hi(215, 0, 0), + runtime.caml_int64_create_lo_mi_hi(118, 0, 0), + runtime.caml_int64_create_lo_mi_hi(73, 0, 0), + runtime.caml_int64_create_lo_mi_hi(49, 0, 0), + runtime.caml_int64_create_lo_mi_hi(35, 0, 0), + runtime.caml_int64_create_lo_mi_hi(27, 0, 0), + runtime.caml_int64_create_lo_mi_hi(21, 0, 0), + runtime.caml_int64_create_lo_mi_hi(17, 0, 0), + runtime.caml_int64_create_lo_mi_hi(14, 0, 0), + runtime.caml_int64_create_lo_mi_hi(12, 0, 0), + runtime.caml_int64_create_lo_mi_hi(10, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _e_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(324403, 181, 0), + runtime.caml_int64_create_lo_mi_hi(2097151, 0, 0), + runtime.caml_int64_create_lo_mi_hi(55108, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6208, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1448, 0, 0), + runtime.caml_int64_create_lo_mi_hi(511, 0, 0), + runtime.caml_int64_create_lo_mi_hi(234, 0, 0), + runtime.caml_int64_create_lo_mi_hi(127, 0, 0), + runtime.caml_int64_create_lo_mi_hi(78, 0, 0), + runtime.caml_int64_create_lo_mi_hi(52, 0, 0), + runtime.caml_int64_create_lo_mi_hi(38, 0, 0), + runtime.caml_int64_create_lo_mi_hi(28, 0, 0), + runtime.caml_int64_create_lo_mi_hi(22, 0, 0), + runtime.caml_int64_create_lo_mi_hi(18, 0, 0), + runtime.caml_int64_create_lo_mi_hi(15, 0, 0), + runtime.caml_int64_create_lo_mi_hi(13, 0, 0), + runtime.caml_int64_create_lo_mi_hi(11, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _f_ = + [0, + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(16452813, 16777034, 65535), + runtime.caml_int64_create_lo_mi_hi(14680065, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16722108, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16771008, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16775768, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776705, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776982, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777089, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777138, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777164, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777178, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777188, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777194, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777198, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777201, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777203, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777205, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777207, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777208, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535)], + overflow_bound_max_int32_value = 2147483647; + if(1 < switcher >>> 0){ + if(32 !== switcher) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var + int_positive_overflow_bounds = + [0, + caml_int64_to_int32(_c_), + caml_int64_to_int32(_b_), + caml_int64_to_int32(_a_), + 1664510, + 46340, + 5404, + 1290, + 463, + 215, + 118, + 73, + 49, + 35, + 27, + 21, + 17, + 14, + 12, + 10, + 9, + 8, + 7, + 7, + 6, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1]; + } + else if(switcher) + var + _h_ = function(_j_){return _j_;}, + int_positive_overflow_bounds = + caml_call2(Base_Array0[20], int32_positive_overflow_bounds, _h_); + else + var int_positive_overflow_bounds = _i_.slice(); + var + int63_on_int64_positive_overfl = _d_.slice(), + int64_positive_overflow_bounds = _e_.slice(), + int64_negative_overflow_bounds = _f_.slice(), + Base_Pow_overflow_bounds = + [0, + overflow_bound_max_int32_value, + int32_positive_overflow_bounds, + overflow_bound_max_int_value, + int_positive_overflow_bounds, + overflow_bound_max_int63_on_in, + int63_on_int64_positive_overfl, + overflow_bound_max_int64_value, + int64_positive_overflow_bounds, + int64_negative_overflow_bounds]; + runtime.caml_register_global + (16, Base_Pow_overflow_bounds, "Base__Pow_overflow_bounds"); + return; + } + (globalThis)); + +//# 19189 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_exponent_can_not_be_negati = "exponent can not be negative", + cst_integer_overflow_in_pow = "integer overflow in pow", + caml_check_bound = runtime.caml_check_bound, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessthan = runtime.caml_lessthan; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Pow_overflow_bounds = global_data.Base__Pow_overflow_bounds, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + invalid_argf = Base_Printf[7], + _m_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _l_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _j_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _k_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = + [0, [11, cst_integer_overflow_in_pow, 0], cst_integer_overflow_in_pow], + _a_ = + [0, + [11, cst_exponent_can_not_be_negati, 0], + cst_exponent_can_not_be_negati]; + function negative_exponent(param){ + return caml_call2(Base_Printf[7], _a_, 0); + } + function overflow(param){return caml_call2(Base_Printf[7], _b_, 0);} + function int_pow(base, exponent){ + if(exponent < 0) negative_exponent(0); + var _J_ = 1 < caml_call1(Base_Import[123], base) ? 1 : 0; + if(_J_){ + var _K_ = 63 < exponent ? 1 : 0; + if(_K_) + var _L_ = _K_; + else + var + _M_ = + caml_check_bound(Base_Pow_overflow_bounds[4], exponent)[1 + exponent], + _L_ = _M_ < caml_call1(Base_Import[123], base) ? 1 : 0; + } + else + var _L_ = _J_; + if(_L_) overflow(0); + return runtime.Base_int_math_int_pow_stub(base, exponent); + } + var abs = Stdlib_Int64[8]; + function int64_pow(base, exponent){ + if(caml_lessthan(exponent, _c_)) negative_exponent(0); + var + _A_ = caml_greaterthan(base, _d_), + _B_ = _A_ || caml_lessthan(base, _h_); + if(_B_){ + var _C_ = caml_greaterthan(exponent, _e_); + if(_C_) + var _D_ = _C_; + else{ + var _E_ = runtime.caml_greaterequal(base, _f_); + if(_E_) + var + _F_ = caml_int64_to_int32(exponent), + _G_ = + caml_greaterthan + (base, caml_check_bound(Base_Pow_overflow_bounds[8], _F_)[1 + _F_]); + else + var _G_ = _E_; + if(_G_) + var _D_ = _G_; + else{ + var _H_ = caml_lessthan(base, _g_); + if(_H_) + var + _I_ = caml_int64_to_int32(exponent), + _D_ = + caml_lessthan + (base, + caml_check_bound(Base_Pow_overflow_bounds[9], _I_)[1 + _I_]); + else + var _D_ = _H_; + } + } + } + else + var _D_ = _B_; + if(_D_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + function int63_pow_on_int64(base, exponent){ + if(caml_lessthan(exponent, _i_)) negative_exponent(0); + var _v_ = caml_greaterthan(caml_call1(abs, base), _j_); + if(_v_){ + var _w_ = caml_greaterthan(exponent, _k_); + if(_w_) + var _x_ = _w_; + else + var + _y_ = caml_int64_to_int32(exponent), + _z_ = caml_check_bound(Base_Pow_overflow_bounds[6], _y_)[1 + _y_], + _x_ = caml_greaterthan(caml_call1(abs, base), _z_); + } + else + var _x_ = _v_; + if(_x_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + var + Private = [0, int_pow, int64_pow, int63_pow_on_int64], + Base_Int_math = + [0, + function(X){ + function symbol(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _u_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _l_, caml_call1(X[4], x), _u_, 0); + } + var rval = caml_call2(X[20], x, y); + return caml_call2(X[14], rval, X[18]) + ? caml_call2(X[5], rval, y) + : rval; + } + var one = caml_call1(X[19], 1); + function symbol$0(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _r_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _m_, caml_call1(X[4], x), _r_, 0); + } + if(! caml_call2(X[14], x, X[18])) return caml_call2(X[8], x, y); + var _s_ = caml_call2(X[5], x, one), _t_ = caml_call2(X[8], _s_, y); + return caml_call2(X[6], _t_, one); + } + function symbol$1(x, y){ + var _p_ = caml_call1(X[2], y), _q_ = caml_call1(X[2], x); + return caml_call2(Base_Import[96], _q_, _p_); + } + function round_down(i, modulus){ + var _o_ = symbol(i, modulus); + return caml_call2(X[6], i, _o_); + } + function round_up(i, modulus){ + var remainder = symbol(i, modulus); + if(caml_call2(X[12], remainder, X[18])) return i; + var _n_ = caml_call2(X[5], i, modulus); + return caml_call2(X[6], _n_, remainder); + } + function round_towards_zero(i, to_multiple_of){ + return caml_call2(X[12], i, X[18]) + ? X[18] + : caml_call2 + (X[13], i, X[18]) + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + function round_nearest(i, modulus){ + var + remainder = symbol(i, modulus), + modulus_minus_remainder = caml_call2(X[6], modulus, remainder); + return caml_call2(X[11], modulus_minus_remainder, remainder) + ? caml_call2(X[5], i, modulus_minus_remainder) + : caml_call2(X[6], i, remainder); + } + function round(opt, i, to_multiple_of){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? round_towards_zero(i, to_multiple_of) + : round_nearest(i, to_multiple_of) + : 759637122 + <= dir + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + return [0, + symbol, + symbol$0, + symbol$1, + round, + round_towards_zero, + round_down, + round_up, + round_nearest]; + }, + Private]; + runtime.caml_register_global(17, Base_Int_math, "Base__Int_math"); + return; + } + (globalThis)); + +//# 19427 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + global_data = runtime.caml_get_global_data(), + m1 = runtime.caml_int64_create_lo_mi_hi(5592405, 5592405, 21845), + m2 = runtime.caml_int64_create_lo_mi_hi(3355443, 3355443, 13107), + m4 = runtime.caml_int64_create_lo_mi_hi(986895, 986895, 3855), + h01 = runtime.caml_int64_create_lo_mi_hi(65793, 65793, 257), + mask = runtime.caml_int64_create_lo_mi_hi(16777215, 255, 0), + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "src/popcount.ml", 45, 9]; + function int64_popcount(x){ + var + x$0 = + runtime.caml_int64_sub + (x, caml_int64_and(caml_int64_shift_right_unsigne(x, 1), m1)), + x$1 = + caml_int64_add + (caml_int64_and(x$0, m2), + caml_int64_and(caml_int64_shift_right_unsigne(x$0, 2), m2)), + x$2 = + caml_int64_and + (caml_int64_add(x$1, caml_int64_shift_right_unsigne(x$1, 4)), m4); + return runtime.caml_int64_to_int32 + (caml_int64_shift_right_unsigne + (runtime.caml_int64_mul(x$2, h01), 56)); + } + function int32_popcount(x){ + return int64_popcount(caml_int64_and(caml_int64_of_int32(x), mask)); + } + var _a_ = Stdlib_Nativeint[9]; + if(32 === _a_) + var nativeint_popcount = function(x){return int32_popcount(x);}; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + nativeint_popcount = + function(x){return int64_popcount(caml_int64_of_int32(x));}; + } + var + Base_Popcount = + [0, + function(_c_){return runtime.Base_int_math_int_popcount(_c_);}, + int32_popcount, + int64_popcount, + nativeint_popcount]; + runtime.caml_register_global(8, Base_Popcount, "Base__Popcount"); + return; + } + (globalThis)); + +//# 19489 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Sign0 = global_data.Base__Sign0, + Base_Identifiable = global_data.Base__Identifiable, + t_sexp_grammar = Base_Sign0[3], + all = Base_Sign0[6], + Replace_polymorphic_compare = Base_Sign0[7], + to_int = Base_Sign0[10], + of_int = Base_Sign0[13], + _a_ = + caml_call1 + (Base_Identifiable[1], + [0, + Base_Sign0[4], + Base_Sign0[5], + Base_Sign0[11], + Base_Sign0[1], + Base_Sign0[2], + Base_Sign0[8], + Base_Sign0[9], + Base_Sign0[12]]), + hash_fold_t = _a_[1], + hash = _a_[2], + t_of_sexp = _a_[3], + sexp_of_t = _a_[4], + of_string = _a_[5], + to_string = _a_[6], + between = _a_[19], + clamp_exn = _a_[20], + clamp = _a_[21], + comparator = _a_[22], + pp = _a_[23], + hashable = _a_[24]; + function to_float(param){ + switch(param){case 0: return -1.;case 1: return 0.;default: return 1.; + } + } + function flip(param){ + switch(param){case 0: return 2;case 1: return 1;default: return 0; + } + } + function symbol(t$0, t){ + var _b_ = caml_call1(to_int, t), _c_ = caml_call1(to_int, t$0); + return caml_call1(of_int, caml_call2(Base_Import[88], _c_, _b_)); + } + var + symbol$0 = Replace_polymorphic_compare[1], + symbol$1 = Replace_polymorphic_compare[2], + symbol$2 = Replace_polymorphic_compare[3], + symbol$3 = Replace_polymorphic_compare[4], + symbol$4 = Replace_polymorphic_compare[5], + symbol$5 = Replace_polymorphic_compare[6], + ascending = Replace_polymorphic_compare[7], + descending = Replace_polymorphic_compare[8], + compare = Replace_polymorphic_compare[9], + equal = Replace_polymorphic_compare[10], + max = Replace_polymorphic_compare[11], + min = Replace_polymorphic_compare[12], + Base_Sign = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$5, + symbol$1, + symbol$3, + symbol$4, + symbol$0, + symbol$2, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + of_int, + to_int, + to_float, + flip, + symbol]; + runtime.caml_register_global(6, Base_Sign, "Base__Sign"); + return; + } + (globalThis)); + +//# 19602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_x = "%x", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_div = runtime.caml_div, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int.Hex", + module_name$0 = "Base.Int", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Float0 = global_data.Base__Float0, + Base_Int0 = global_data.Base__Int0, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Int_math = global_data.Base__Int_math, + Base_Error = global_data.Base__Error, + Base_Sign = global_data.Base__Sign, + Base_Popcount = global_data.Base__Popcount, + to_string = Base_Int0[1], + of_string = Base_Int0[2], + hash_fold_t = Base_Import[207], + func = Base_Import[221], + _u_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _t_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + cst_Int_ceil_log2_got_invalid_ = "[Int.ceil_log2] got invalid input", + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + _g_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/int.ml", 108, 2], + _e_ = [0, [4, 6, 0, 0, 0], cst_x], + _d_ = [0, [4, 6, 0, 0, 0], cst_x], + _b_ = + [0, + [11, + "Int.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int.of_float: argument (%f) is out of range or NaN"], + _a_ = [0, [11, "Int.of_string: ", [3, 0, 0]], "Int.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[166], + sexp_of_t = Base_Import[142], + t_sexp_grammar = Base_Import[186], + hashable = [0, hash, caml_int_compare, sexp_of_t], + compare = caml_int_compare; + function of_string$0(s){ + try{var _aF_ = caml_call1(of_string, s); return _aF_;} + catch(_aG_){return caml_call3(Base_Printf[6], _a_, s, 0);} + } + var + num_bits = Base_Int_conversions[29], + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function to_float(_aE_){return _aE_;} + function of_float_unchecked(_aD_){return _aD_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _aC_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _b_, _aC_, 0); + } + var + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + _c_ = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, 0]), + is_positive = _c_[1], + is_non_negative = _c_[2], + is_negative = _c_[3], + is_non_positive = _c_[4], + include = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include[1], + sexp_of_t$0 = include[2], + compare$0 = Base_Import[229], + hash_fold_t$0 = Base_Import[207], + func$0 = Base_Import[221], + zero = 0, + one = 1, + minus_one = -1; + function hash$0(x){return caml_call1(func$0, x);} + var neg = Base_Import[113]; + function symbol(_aB_, _aA_){return _aB_ < _aA_ ? 1 : 0;} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$1(s){ + function _ay_(_az_){return _az_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _ay_); + } + var + include$0 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$1, + zero, + symbol, + neg, + module_name]), + Hex = include$0[1], + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$1[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _aw_ = low <= t ? 1 : 0, _ax_ = _aw_ ? t <= high ? 1 : 0 : _aw_; + return _ax_; + } + function clamp_unchecked(t, min, max){ + return t < min ? min : t <= max ? t : max; + } + function clamp_exn(t, min, max){ + if(min <= max) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(max >= min) return [0, clamp_unchecked(t, min, max)]; + var + _at_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _au_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _at_], + _av_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _au_); + return caml_call1(Base_Or_error[35], _av_); + } + function pred(i){return caml_call2(Base_Import[93], i, 1);} + function succ(i){return caml_call2(Base_Import[91], i, 1);} + function to_int(i){return i;} + function of_int_exn(i){return i;} + var + max_value = Base_Import[85][18], + min_value = Base_Import[85][19], + of_int32 = Base_Int_conversions[6], + of_int32_exn = Base_Int_conversions[7], + to_int32 = Base_Int_conversions[1], + to_int32_exn = Base_Int_conversions[2], + of_int64 = Base_Int_conversions[11], + of_int64_exn = Base_Int_conversions[12], + to_int64 = Base_Int_conversions[4], + of_nativeint = Base_Int_conversions[22], + of_nativeint_exn = Base_Int_conversions[23], + to_nativeint = Base_Int_conversions[5], + max_value_30_bits = 1073741823; + function abs(x){return caml_call1(Base_Import[123], x);} + function rem(a, b){return caml_call2(Base_Import[122], a, b);} + function incr(_as_){_as_[1]++; return 0;} + function decr(_ar_){_ar_[1] += -1; return 0;} + function shift_right(a, b){return caml_call2(Base_Import[115], a, b);} + function shift_right_logical(a, b){ + return caml_call2(Base_Import[120], a, b); + } + function shift_left(a, b){return caml_call2(Base_Import[119], a, b);} + function bit_not(a){return caml_call1(Base_Import[117], a);} + function bit_or(a, b){return caml_call2(Base_Import[118], a, b);} + function bit_and(a, b){return caml_call2(Base_Import[116], a, b);} + function bit_xor(a, b){return caml_call2(Base_Import[121], a, b);} + var pow = Base_Int_math[2][1]; + function symbol$0(b, e){return caml_call2(pow, b, e);} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _g_, 0); + } + function ceil_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + x$0 = caml_call2(Base_Import[93], x, 1), + _al_ = caml_call2(Base_Import[120], x$0, 1), + x$1 = caml_call2(Base_Import[118], x$0, _al_), + _am_ = caml_call2(Base_Import[120], x$1, 2), + x$2 = caml_call2(Base_Import[118], x$1, _am_), + _an_ = caml_call2(Base_Import[120], x$2, 4), + x$3 = caml_call2(Base_Import[118], x$2, _an_), + _ao_ = caml_call2(Base_Import[120], x$3, 8), + x$4 = caml_call2(Base_Import[118], x$3, _ao_), + _ap_ = caml_call2(Base_Import[120], x$4, 16), + x$5 = caml_call2(Base_Import[118], x$4, _ap_), + _aq_ = caml_call2(Base_Import[120], x$5, 32), + x$6 = caml_call2(Base_Import[118], x$5, _aq_); + return caml_call2(Base_Import[91], x$6, 1); + } + function floor_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + _ae_ = caml_call2(Base_Import[120], x, 1), + x$0 = caml_call2(Base_Import[118], x, _ae_), + _af_ = caml_call2(Base_Import[120], x$0, 2), + x$1 = caml_call2(Base_Import[118], x$0, _af_), + _ag_ = caml_call2(Base_Import[120], x$1, 4), + x$2 = caml_call2(Base_Import[118], x$1, _ag_), + _ah_ = caml_call2(Base_Import[120], x$2, 8), + x$3 = caml_call2(Base_Import[118], x$2, _ah_), + _ai_ = caml_call2(Base_Import[120], x$3, 16), + x$4 = caml_call2(Base_Import[118], x$3, _ai_), + _aj_ = caml_call2(Base_Import[120], x$4, 32), + x$5 = caml_call2(Base_Import[118], x$4, _aj_), + _ak_ = caml_call2(Base_Import[120], x$5, 1); + return caml_call2(Base_Import[93], x$5, _ak_); + } + function is_pow2(x){ + if(x <= 0) non_positive_argument(0); + var _ad_ = caml_call2(Base_Import[93], x, 1); + return 0 === caml_call2(Base_Import[116], x, _ad_) ? 1 : 0; + } + function floor_log2(i){ + if(i <= 0){ + var _aa_ = [0, [0, cst, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _aa_)); + } + var + _ab_ = runtime.Base_int_math_int_clz(i), + _ac_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _ac_, _ab_); + } + function ceil_log2(i){ + if(i <= 0){ + var ___ = [0, [0, cst$0, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_ceil_log2_got_invalid_, ___)); + } + if(1 === i) return 0; + var + _$_ = runtime.Base_int_math_int_clz(caml_call2(Base_Import[93], i, 1)); + return caml_call2(Base_Import[93], num_bits, _$_); + } + var sign = Base_Sign[27], popcount = Base_Popcount[1]; + function _h_(_Z_){return - _Z_ | 0;} + function _i_(_Y_, _X_){return _Y_ !== _X_ ? 1 : 0;} + function _j_(_W_, _V_){return _W_ < _V_ ? 1 : 0;} + function _k_(_U_, _T_){return _T_ < _U_ ? 1 : 0;} + function _l_(_S_, _R_){return _S_ === _R_ ? 1 : 0;} + function _m_(_Q_, _P_){return _Q_ <= _P_ ? 1 : 0;} + function _n_(_O_, _N_){return _N_ <= _O_ ? 1 : 0;} + function _o_(_M_){return - _M_ | 0;} + var _p_ = caml_div, _q_ = runtime.caml_mul; + function _r_(_L_, _K_){return _L_ - _K_ | 0;} + var + _s_ = + [0, + of_float, + to_float, + of_string$0, + to_string, + function(_J_, _I_){return _J_ + _I_ | 0;}, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + abs, + _h_, + zero, + of_int_exn, + rem], + F = caml_call1(Base_Int_math[1], _s_), + round = F[4], + round_towards_zero = F[5], + round_down = F[6], + round_up = F[7], + round_nearest = F[8]; + function symbol$1(x, y){ + if(y <= 0){ + var _G_ = caml_call1(to_string, y), _H_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _t_, _H_, _G_, 0); + } + var rval = rem(x, y); + return rval < 0 ? rval + y | 0 : rval; + } + function symbol$2(x, y){ + if(y <= 0){ + var _E_ = caml_call1(to_string, y), _F_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _u_, _F_, _E_, 0); + } + return x < 0 ? caml_div(x + 1 | 0, y) - 1 | 0 : caml_div(x, y); + } + function symbol$3(x, y){return caml_call2(Base_Import[96], x, y);} + var + lnot = Base_Import[117], + include$2 = Base_Import[97], + ascending = include$2[1], + descending = include$2[2], + max = include$2[3], + min = include$2[4], + _v_ = [0, [0, F[1], F[2], F[3]]], + _w_ = [0, symbol$0, lnot, abs, zero, symbol$1, symbol$2, symbol$3]; + function _x_(_D_){return runtime.Base_int_math_int_ctz(_D_);} + function _y_(_C_){return runtime.Base_int_math_int_clz(_C_);} + var + _z_ = caml_int_compare, + Base_Int = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string$0, + to_string, + function(_B_, _A_){return _B_ === _A_ ? 1 : 0;}, + _z_, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _y_, + _x_, + _w_, + symbol$0, + lnot, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + max_value_30_bits, + of_int_exn, + to_int, + of_int32, + to_int32, + of_int64, + of_nativeint, + to_nativeint, + _v_]; + runtime.caml_register_global(33, Base_Int, "Base__Int"); + return; + } + (globalThis)); + +//# 20450 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_T = [0]; + runtime.caml_register_global(0, Base_T, "Base__T"); + return; + } + (globalThis)); + +//# 21496 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sexp = global_data.Base__Sexp, + Base_Comparable = global_data.Base__Comparable, + hash_fold_t = Base_Sexp[1], + hash = Base_Sexp[2], + t_of_sexp = Base_Sexp[3], + sexp_of_t = Base_Sexp[4], + Not_found_s = Base_Sexp[7], + Of_sexp_error = Base_Sexp[8], + message = Base_Sexp[9], + default_indent = Base_Sexp[10], + pp_hum = Base_Sexp[11], + pp_hum_indent = Base_Sexp[12], + pp_mach = Base_Sexp[13], + pp = Base_Sexp[14], + to_string_hum = Base_Sexp[15], + to_string_mach = Base_Sexp[16], + to_string = Base_Sexp[17], + of_float_style = Base_Sexp[18], + of_int_style = Base_Sexp[19], + t_sexp_grammar = Base_Sexp[21], + invariant = Base_Sexp[22], + of_string = Base_Sexp[23], + include = caml_call1(Base_Comparable[10], [0, Base_Sexp[6], Base_Sexp[4]]), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + equal = include[7], + compare = include[8], + min = include[9], + max = include[10], + ascending = include[11], + descending = include[12], + between = include[13], + clamp_exn = include[14], + clamp = include[15], + comparator = include[16], + Base_Sexp_with_comparable = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + runtime.caml_register_global + (2, Base_Sexp_with_comparable, "Base__Sexp_with_comparable"); + return; + } + (globalThis)); + +//# 24602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Exn = global_data.Base__Exn, + Base_List = global_data.Base__List, + Base_Import = global_data.Base__Import, + compare = Base_Import[238], + equal = Base_Import[251], + t_of_sexp = Base_Import[171], + sexp_of_t = Base_Import[147]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[192], a_sexp_grammar); + } + function swap(t1, t2){ + var tmp = t1[1]; + t1[1] = t2[1]; + t2[1] = tmp; + return 0; + } + function replace(t, f){t[1] = caml_call1(f, t[1]); return 0;} + function set_temporarily(t, a, f){ + var restore_to = t[1]; + t[1] = a; + function _b_(param){t[1] = restore_to; return 0;} + return caml_call2(Base_Exn[13], f, _b_); + } + function set(param){var a = param[2], r = param[1]; r[1] = a; return 0;} + function sets(ts){return caml_call2(Base_List[9], ts, set);} + function snapshot(param){var r = param[1]; return [0, r, r[1]];} + function sets_temporarily(and_values, f){ + var restore_to = caml_call2(Base_List[76], and_values, snapshot); + sets(and_values); + function _a_(param){return sets(restore_to);} + return caml_call2(Base_Exn[13], f, _a_); + } + var + Base_Ref = + [0, + compare, + equal, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + swap, + replace, + set_temporarily, + [0, set, sets, snapshot], + sets_temporarily]; + runtime.caml_register_global(3, Base_Ref, "Base__Ref"); + return; + } + (globalThis)); + +//# 25513 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_nx = "%nx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_lessequal = runtime.caml_lessequal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Nativeint.Hex", + module_name$0 = "Base.Nativeint", + Base_Int_math = global_data.Base__Int_math, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Printf = global_data.Base__Printf, + Base_Float0 = global_data.Base__Float0, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Word_size = global_data.Base__Word_size, + Base_Error = global_data.Base__Error, + Base_Popcount = global_data.Base__Popcount, + include = Base_Import[104], + compare = include[9], + hash_fold_t = Base_Import[203], + func = Base_Import[217], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/nativeint.ml", 202, 2], + cst_Nativeint_ceil_log2_got_in = "[Nativeint.ceil_log2] got invalid input", + cst_Nativeint_floor_log2_got_i = + "[Nativeint.floor_log2] got invalid input", + _e_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + _d_ = + [0, + [11, + "Nativeint.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Nativeint.of_float: argument (%f) is out of range or NaN"], + _c_ = [0, [6, 6, 0, 0, 0], cst_nx], + _b_ = [0, [6, 6, 0, 0, 0], cst_nx]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[170], + sexp_of_t = Base_Import[146], + t_sexp_grammar = Base_Import[190], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[104][9], + to_string = Stdlib_Nativeint[15], + of_string = runtime.caml_int_of_string, + comparator = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t])[1], + zero = Stdlib_Nativeint[1], + _a_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + is_positive = _a_[1], + is_non_negative = _a_[2], + is_negative = _a_[3], + is_non_positive = _a_[4], + sign = _a_[5], + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$0 = include$0[2], + compare$1 = Base_Import[232], + hash_fold_t$0 = Base_Import[203], + func$0 = Base_Import[217]; + function hash$0(x){return caml_call1(func$0, x);} + var zero$0 = Stdlib_Nativeint[1]; + function neg(_U_){return - _U_ | 0;} + var symbol = Base_Import[104][1]; + function to_string$0(i){return caml_call2(Base_Printf[2], _b_, i);} + function of_string$0(s){ + function _S_(_T_){return _T_;} + return caml_call3(Stdlib_Scanf[5], s, _c_, _S_); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$1, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero$0, + symbol, + neg, + module_name]), + Hex = include$1[1], + include$2 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$2[1]; + function invariant(param){return 0;} + var + num_bits = caml_call1(Base_Word_size[2], Base_Word_size[3]), + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function shift_right_logical(_R_, _Q_){return _R_ >>> _Q_ | 0;} + function shift_right(_P_, _O_){return _P_ >> _O_;} + function shift_left(_N_, _M_){return _N_ << _M_;} + var bit_not = Stdlib_Nativeint[12]; + function bit_xor(_L_, _K_){return _L_ ^ _K_;} + function bit_or(_J_, _I_){return _J_ | _I_;} + function bit_and(_H_, _G_){return _H_ & _G_;} + var + min_value = Stdlib_Nativeint[11], + max_value = Stdlib_Nativeint[10], + abs = Stdlib_Nativeint[8], + pred = Stdlib_Nativeint[7], + succ = Stdlib_Nativeint[6], + rem = runtime.caml_mod; + function symbol$0(_F_){return - _F_ | 0;} + var + minus_one = Stdlib_Nativeint[3], + one = Stdlib_Nativeint[2], + zero$1 = Stdlib_Nativeint[1]; + function to_float(_E_){return _E_;} + function of_float_unchecked(_D_){return _D_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _C_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _d_, _C_, 0); + } + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _e_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Nativeint[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0, + x$6 = x$5 | x$5 >>> 32 | 0; + return caml_call1(Stdlib_Nativeint[6], x$6); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0, + x$5 = x$4 | x$4 >>> 32 | 0; + return x$5 - (x$5 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var _B_ = x & caml_call1(Stdlib_Nativeint[7], x); + return caml_call2(Base_Import[104][4], _B_, 0); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _y_ = [0, [0, cst, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_floor_log2_got_i, _y_)); + } + var + _z_ = runtime.Base_int_math_nativeint_clz(i), + _A_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _A_, _z_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _w_ = [0, [0, cst$0, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_ceil_log2_got_in, _w_)); + } + if(caml_call2(Stdlib_Nativeint[18], i, Stdlib_Nativeint[2])) return 0; + var + _x_ = + runtime.Base_int_math_nativeint_clz(caml_call1(Stdlib_Nativeint[7], i)); + return caml_call2(Base_Import[93], num_bits, _x_); + } + function between(t, low, high){ + var _v_ = caml_call2(Base_Import[104][2], low, t); + return _v_ ? caml_call2(Base_Import[104][2], t, high) : _v_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[104][1], t, min) + ? min + : caml_call2(Base_Import[104][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[104][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[104][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _s_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _t_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _s_], + _u_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _t_); + return caml_call1(Base_Or_error[35], _u_); + } + var symbol$1 = runtime.caml_div, symbol$2 = runtime.caml_mul; + function symbol$3(_r_, _q_){return _r_ - _q_ | 0;} + function symbol$4(_p_, _o_){return _p_ + _o_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_nativeint(t){return t;} + function to_nativeint(t){return t;} + var + popcount = Base_Popcount[4], + of_int_exn = Base_Int_conversions[5], + to_int = Base_Int_conversions[22], + to_int_exn = Base_Int_conversions[23], + to_int_trunc = Base_Int_conversions[24], + of_int32 = Base_Int_conversions[10], + to_int32 = Base_Int_conversions[25], + to_int32_exn = Base_Int_conversions[26], + to_int32_trunc = Base_Int_conversions[27], + of_int64 = Base_Int_conversions[17], + of_int64_exn = Base_Int_conversions[18], + of_int64_trunc = Base_Int_conversions[19], + to_int64 = Base_Int_conversions[28]; + function pow(b, e){ + var _m_ = caml_call1(to_int_exn, e), _n_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _n_, _m_)); + } + function symbol$5(b, e){return pow(b, e);} + var + _g_ = Base_Import[104], + symbol$6 = _g_[3], + symbol$7 = _g_[1], + symbol$8 = _g_[5], + symbol$9 = _g_[4], + symbol$10 = _g_[2], + symbol$11 = _g_[6], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + of_int_exn, + rem]), + symbol$12 = include$3[1], + symbol$13 = include$3[2], + symbol$14 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[104], + symbol$15 = include$4[1], + symbol$16 = include$4[2], + symbol$17 = include$4[3], + symbol$18 = include$4[4], + symbol$19 = include$4[5], + symbol$20 = include$4[6], + ascending = include$4[7], + descending = include$4[8], + compare$2 = include$4[9], + equal = include$4[10], + max = include$4[11], + min = include$4[12], + _h_ = runtime.caml_int32_bswap, + _i_ = + [0, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _j_(_l_){return runtime.Base_int_math_nativeint_ctz(_l_);} + var + Base_Nativeint = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$20, + symbol$16, + symbol$18, + symbol$19, + symbol$15, + symbol$17, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero$1, + one, + minus_one, + symbol$4, + symbol$3, + symbol$2, + symbol$5, + symbol$0, + symbol$0, + symbol$13, + symbol$12, + symbol$1, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_k_){return runtime.Base_int_math_nativeint_clz(_k_);}, + _j_, + _i_, + of_int_exn, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + to_int_trunc, + to_int32_trunc, + of_int64_trunc, + _h_]; + runtime.caml_register_global(34, Base_Nativeint, "Base__Nativeint"); + return; + } + (globalThis)); + +//# 29983 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_Lx = "%Lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_or = runtime.caml_int64_or, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int64.Hex", + module_name$0 = "Base.Int64", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[204], + func = Base_Import[218], + _e_ = [0, [7, 6, 0, 0, 0], cst_Lx], + _d_ = [0, [7, 6, 0, 0, 0], cst_Lx], + cst_Int64_ceil_log2_got_invali = "[Int64.ceil_log2] got invalid input", + cst_Int64_floor_log2_got_inval = "[Int64.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int64.ml", 100, 2], + _a_ = + [0, + [11, + "Int64.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int64.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[169], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + hashable = [0, hash, Stdlib_Int64[15], sexp_of_t]; + function compare(_C_, _B_){return caml_int64_compare(_C_, _B_);} + var + to_string = Stdlib_Int64[14], + of_string = runtime.caml_int64_of_string, + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 64), + float_upper_bound = caml_call1(Base_Float0[23], 64), + float_of_bits = runtime.caml_int64_float_of_bits, + bits_of_float = runtime.caml_int64_bits_of_float, + shift_right_logical = caml_int64_shift_right_unsigne, + shift_right = runtime.caml_int64_shift_right, + shift_left = runtime.caml_int64_shift_left, + bit_not = Stdlib_Int64[11], + bit_xor = runtime.caml_int64_xor, + bit_or = caml_int64_or, + bit_and = caml_int64_and, + min_value = Stdlib_Int64[10], + max_value = Stdlib_Int64[9], + abs = Stdlib_Int64[8], + pred = Stdlib_Int64[7], + succ = Stdlib_Int64[6], + pow = Base_Int_math[2][2], + rem = runtime.caml_int64_mod, + neg = caml_int64_neg, + minus_one = Stdlib_Int64[3], + one = Stdlib_Int64[2], + zero = Stdlib_Int64[1], + to_float = runtime.caml_int64_to_float, + of_float_unchecked = caml_int64_of_float, + num_bits = 64; + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return caml_int64_of_float(f); + var _A_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _A_, 0); + } + function symbol(b, e){return caml_call2(pow, b, e);} + function bswap16(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 48); + } + function bswap32(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 32); + } + function bswap48(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 16); + } + var + include$0 = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5]; + function invariant(param){return 0;} + function between(t, low, high){ + var + _y_ = caml_lessequal(low, t), + _z_ = _y_ ? caml_lessequal(t, high) : _y_; + return _z_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _v_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _w_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _v_], + _x_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _w_); + return caml_call1(Base_Or_error[35], _x_); + } + function incr(r){r[1] = caml_int64_add(r[1], one); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one); return 0;} + function of_int64_exn(_u_){return _u_;} + function to_int64(t){return t;} + var + popcount = Base_Popcount[3], + of_int_exn = caml_int64_of_int32, + to_int = Base_Int_conversions[11], + to_int_exn = Base_Int_conversions[12], + of_int32_exn = caml_int64_of_int32, + to_int32 = Base_Int_conversions[14], + to_int32_exn = Base_Int_conversions[15], + of_nativeint = Base_Int_conversions[28], + to_nativeint = Base_Int_conversions[17], + to_nativeint_exn = Base_Int_conversions[18], + raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int64[7], x), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 1)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 2)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 4)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 8)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 16)), + x$6 = caml_int64_or(x$5, caml_int64_shift_right_unsigne(x$5, 32)); + return caml_call1(Stdlib_Int64[6], x$6); + } + function floor_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_int64_or(x, caml_int64_shift_right_unsigne(x, 1)), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 2)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 4)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 8)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 16)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 32)); + return caml_int64_sub(x$5, caml_int64_shift_right_unsigne(x$5, 1)); + } + function is_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var _t_ = Stdlib_Int64[1]; + return caml_equal(caml_int64_and(x, caml_call1(Stdlib_Int64[7], x)), _t_); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _q_ = [0, [0, cst, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_floor_log2_got_inval, _q_)); + } + var + _r_ = runtime.Base_int_math_int64_clz(i), + _s_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _s_, _r_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _o_ = [0, [0, cst$0, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_ceil_log2_got_invali, _o_)); + } + if(caml_call2(Stdlib_Int64[17], i, Stdlib_Int64[2])) return 0; + var _p_ = runtime.Base_int_math_int64_clz(caml_call1(Stdlib_Int64[7], i)); + return caml_call2(Base_Import[93], num_bits, _p_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare$0 = Base_Import[231], + hash_fold_t$0 = Base_Import[204], + func$0 = Base_Import[218]; + function hash$0(x){return caml_call1(func$0, x);} + var symbol$0 = caml_lessthan; + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _m_(_n_){return _n_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _m_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$0, + neg, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + caml_int64_add, + caml_int64_sub, + runtime.caml_int64_mul, + runtime.caml_int64_div, + caml_int64_neg, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + abs, + caml_int64_neg, + zero, + of_int_exn, + rem]), + symbol$1 = include$3[1], + symbol$2 = include$3[2], + symbol$3 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[103], + ascending = include$4[1], + descending = include$4[2], + max = include$4[3], + min = include$4[4], + _f_ = [0, symbol, bit_not, abs, zero, symbol$1, symbol$2, symbol$3]; + function _g_(_l_){return runtime.Base_int_math_int64_ctz(_l_);} + function _h_(_k_){return runtime.Base_int_math_int64_clz(_k_);} + var + Base_Int64 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + caml_equal, + function(_j_, _i_){return caml_int64_compare(_j_, _i_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _h_, + _g_, + _f_, + symbol, + bit_not, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + to_int, + to_int32, + of_nativeint, + to_nativeint, + bits_of_float, + float_of_bits, + bswap16, + bswap32, + bswap48]; + runtime.caml_register_global(29, Base_Int64, "Base__Int64"); + return; + } + (globalThis)); + +//# 30380 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_int63_emul_ml = "src/int63_emul.ml", + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_string = runtime.caml_int64_of_string, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + mask = runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + module_name = "Base.Int63.Hex", + module_name$0 = "Base.Int63", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Int64 = global_data.Base__Int64, + Base_String = global_data.Base__String, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Base_Popcount = global_data.Base__Popcount, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Import[231], + hash_fold_t = Base_Import[204], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + cst_0x = "0x", + _l_ = [0, [7, 6, 0, 0, 0], "%Lx"], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _k_ = [0, cst_src_int63_emul_ml, 317, 2], + _i_ = + [0, + [11, + "Int63.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int63.of_float: argument (%f) is out of range or NaN"], + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = + [0, + [11, "Int63.of_string: invalid input ", [3, 0, 0]], + "Int63.of_string: invalid input %S"], + _e_ = [0, cst_src_int63_emul_ml, 114, 20], + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function wrap_exn(x){ + caml_call1(Base_Int_conversions[20], x); + return caml_int64_mul(x, _a_); + } + function wrap_modulo(x){return caml_int64_mul(x, _c_);} + function unwrap(x){return caml_int64_shift_right(x, 1);} + function m(x){return caml_int64_and(x, mask);} + function invariant(t){ + if(caml_equal(m(t), t)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + } + var + symbol = caml_int64_add, + symbol$0 = caml_int64_sub, + symbol$1 = caml_int64_neg; + function abs(x){return caml_call1(Stdlib_Int64[8], x);} + var one = wrap_exn(_f_); + function succ(a){return caml_int64_add(a, one);} + function pred(a){return caml_int64_sub(a, one);} + var min_value = m(Stdlib_Int64[10]), max_value = m(Stdlib_Int64[9]); + function bit_not(x){return m(caml_call1(Stdlib_Int64[11], x));} + var + bit_and = caml_int64_and, + bit_xor = runtime.caml_int64_xor, + bit_or = runtime.caml_int64_or, + shift_left = runtime.caml_int64_shift_left; + function shift_right(x, i){return m(caml_int64_shift_right(x, i));} + function shift_right_logical(x, i){ + return m(caml_int64_shift_right_unsigne(x, i)); + } + var f = Base_Int_math[2][3]; + function pow(a, b){ + return caml_int64_mul + (caml_call2 + (f, caml_int64_shift_right(a, 1), caml_int64_shift_right(b, 1)), + _d_); + } + function symbol$2(a, b){ + return caml_int64_mul(a, caml_int64_shift_right(b, 1)); + } + function symbol$3(a, b){return wrap_modulo(runtime.caml_int64_div(a, b));} + var rem = runtime.caml_int64_mod; + function popcount(x){return caml_call1(Base_Popcount[3], x);} + function to_int64(t){return caml_int64_shift_right(t, 1);} + function of_int64(t){ + return caml_call1(Base_Int_conversions[21], t) + ? [0, caml_int64_mul(t, _b_)] + : 0; + } + function of_int64_exn(t){return wrap_exn(t);} + function of_int64_trunc(t){return wrap_modulo(t);} + function t_of_sexp(x){return wrap_exn(caml_call1(Base_Import[169], x));} + function sexp_of_t$0(x){ + return caml_call1(Base_Import[145], caml_int64_shift_right(x, 1)); + } + function compare$0(x, y){return caml_call2(compare, x, y);} + function is_pow2(x){ + return caml_call1(Base_Int64[67], caml_int64_shift_right(x, 1)); + } + function clz(x){return caml_call1(Base_Int64[68], x);} + function ctz(x){ + return caml_call1(Base_Int64[69], caml_int64_shift_right(x, 1)); + } + function floor_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function ceil_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function floor_log2(x){ + return caml_call1(Base_Int64[66], caml_int64_shift_right(x, 1)); + } + function ceil_log2(x){ + return caml_call1(Base_Int64[65], caml_int64_shift_right(x, 1)); + } + function hash(x){return caml_call1(Stdlib_MoreLabels[1][28], x);} + var hashable = [0, hash, compare$0, sexp_of_t$0]; + function invalid_str(x){return caml_call3(Base_Printf[6], _g_, x, 0);} + function to_string(x){ + return caml_call1(Stdlib_Int64[14], caml_int64_shift_right(x, 1)); + } + function of_string(str){ + try{ + var len = caml_ml_string_length(str); + if(0 < len){ + var switcher = caml_string_get(str, 0) - 43 | 0, switch$0 = 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var sign = 4003188, pos = 1; break; + case 1: + switch$0 = 1; break; + default: var sign = 3901488, pos = 1; + } + if(switch$0) var sign = 4003188, pos = 0; + } + else + var sign = 4003188, pos = 0; + if(caml_call2(Base_Import[91], pos, 2) < len) + var + c1 = caml_string_get(str, pos), + c2 = caml_string_get(str, caml_call2(Base_Import[91], pos, 1)), + match = + 48 === c1 + ? 9 < c2 - 48 >>> 0 ? [0, sign, 0] : [0, sign, 1] + : [0, sign, 1]; + else + var match = [0, sign, 1]; + var signedness = match[2]; + if(signedness) + var _w_ = of_int64_exn(caml_int64_of_string(str)); + else{ + if(4003188 <= sign) + var pos_str = str; + else + var + _x_ = caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + pos_str = caml_call3(Base_String[2], str, 1, _x_); + var int64 = caml_int64_of_string(pos_str); + if(caml_lessthan(int64, _h_)) invalid_str(str); + var + int63 = wrap_modulo(int64), + int63$0 = 4003188 <= sign ? int63 : caml_int64_neg(int63), + _w_ = int63$0; + } + return _w_; + } + catch(_y_){return invalid_str(str);} + } + function bswap16(t){ + return wrap_modulo + (caml_call1(Base_Int64[84], caml_int64_shift_right(t, 1))); + } + function bswap32(t){ + return wrap_modulo + (caml_call1(Base_Int64[85], caml_int64_shift_right(t, 1))); + } + function bswap48(t){ + return wrap_modulo + (caml_call1(Base_Int64[86], caml_int64_shift_right(t, 1))); + } + var + float_lower_bound = caml_call1(Base_Float0[25], 63), + float_upper_bound = caml_call1(Base_Float0[23], 63), + minus_one = wrap_exn(Stdlib_Int64[3]), + one$0 = wrap_exn(Stdlib_Int64[2]), + zero = wrap_exn(Stdlib_Int64[1]), + num_bits = 63; + function to_float(x){ + return runtime.caml_int64_to_float(caml_int64_shift_right(x, 1)); + } + function of_float_unchecked(x){return wrap_modulo(caml_int64_of_float(x));} + function of_float(t){ + if + (caml_call2(Base_Import[108][6], t, float_lower_bound) + && caml_call2(Base_Import[108][2], t, float_upper_bound)) + return wrap_modulo(caml_int64_of_float(t)); + var _v_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _i_, _v_, 0); + } + var + _j_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t$0, zero]), + is_positive = _j_[1], + is_non_negative = _j_[2], + is_negative = _j_[3], + is_non_positive = _j_[4], + sign = _j_[5]; + function between(t, low, high){ + var + _t_ = caml_lessequal(low, t), + _u_ = _t_ ? caml_lessequal(t, high) : _t_; + return _u_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _q_ = [0, [0, cst_max, sexp_of_t$0(max)], 0], + _r_ = [0, [0, cst_min, sexp_of_t$0(min)], _q_], + _s_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _r_); + return caml_call1(Base_Or_error[35], _s_); + } + function symbol$4(b, e){return pow(b, e);} + function incr(r){r[1] = caml_int64_add(r[1], one$0); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one$0); return 0;} + function of_int(x){ + return wrap_exn(caml_call1(Base_Int_conversions[4], x)); + } + function of_int_exn(x){return of_int(x);} + function to_int(x){ + return caml_call1(Base_Int_conversions[11], caml_int64_shift_right(x, 1)); + } + function to_int_exn(x){ + return caml_call1(Base_Int_conversions[12], caml_int64_shift_right(x, 1)); + } + function to_int_trunc(x){ + return caml_call1(Base_Int_conversions[13], caml_int64_shift_right(x, 1)); + } + function of_int32(x){ + return wrap_exn(caml_call1(Base_Int_conversions[9], x)); + } + function of_int32_exn(x){return of_int32(x);} + function to_int32(x){ + return caml_call1(Base_Int_conversions[14], caml_int64_shift_right(x, 1)); + } + function to_int32_exn(x){ + return caml_call1(Base_Int_conversions[15], caml_int64_shift_right(x, 1)); + } + function to_int32_trunc(x){ + return caml_call1(Base_Int_conversions[16], caml_int64_shift_right(x, 1)); + } + function of_nativeint(x){ + return of_int64(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_exn(x){ + return wrap_exn(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_trunc(x){ + return of_int64_trunc(caml_call1(Base_Int_conversions[28], x)); + } + function to_nativeint(x){ + return caml_call1(Base_Int_conversions[17], caml_int64_shift_right(x, 1)); + } + function to_nativeint_exn(x){ + return caml_call1(Base_Int_conversions[18], caml_int64_shift_right(x, 1)); + } + function to_nativeint_trunc(x){ + return caml_call1(Base_Int_conversions[19], caml_int64_shift_right(x, 1)); + } + var + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$1 = include$0[2]; + function hash$0(x){return hash(x);} + var symbol$5 = caml_lessthan; + function to_string$0(i){ + return caml_call2 + (Base_Printf[2], _l_, caml_int64_shift_right_unsigne(i, 1)); + } + function of_string$0(s){ + return of_string(caml_call2(Base_Import[112], cst_0x, s)); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$5, + symbol$1, + module_name]), + Hex = include$1[1]; + function to_string$1(x){return to_string(x);} + var + pp = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string$1])[1], + symbol$6 = caml_notequal, + symbol$7 = caml_lessthan, + symbol$8 = caml_greaterthan, + symbol$9 = caml_equal, + symbol$10 = caml_lessequal, + symbol$11 = caml_greaterequal, + include$2 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + of_int_exn, + rem]), + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + round = include$2[4], + round_towards_zero = include$2[5], + round_down = include$2[6], + round_up = include$2[7], + round_nearest = include$2[8], + Repr = [0], + include$3 = Base_Import[103], + ascending = include$3[1], + descending = include$3[2], + max = include$3[3], + min = include$3[4], + repr = 1, + _m_ = [0, wrap_exn, unwrap], + _n_ = + [0, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$4, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical], + Base_Int63_emul = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + to_string, + caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + caml_notequal, + caml_equal, + function(_p_, _o_){return runtime.caml_int64_compare(_p_, _o_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one$0, + minus_one, + symbol, + symbol$0, + symbol$2, + symbol$4, + symbol$1, + symbol$1, + symbol$13, + symbol$12, + symbol$3, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _n_, + of_int, + to_int, + to_int_trunc, + of_int32, + to_int32, + to_int32_trunc, + of_int64, + of_int64_trunc, + of_nativeint, + to_nativeint, + of_nativeint_trunc, + to_nativeint_trunc, + bswap16, + bswap32, + bswap48, + _m_, + Repr, + repr]; + runtime.caml_register_global(34, Base_Int63_emul, "Base__Int63_emul"); + return; + } + (globalThis)); + +//# 30933 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_bool_ml = "src/bool.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, 0]], + module_name = "Base.Bool", + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Printf = global_data.Base__Printf, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + invalid_argf = Base_Printf[7], + compare = Base_Import[226], + hash_fold_t = Base_Import[208], + func = Base_Import[222], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, cst_src_bool_ml, 56, 2], + _a_ = + [0, + [11, "Bool.of_string: expected true or false but got ", [2, 0, 0]], + "Bool.of_string: expected true or false but got %s"], + _c_ = [0, cst_src_bool_ml, 83, 9]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[162], + sexp_of_t = Base_Import[138], + t_sexp_grammar = Base_Import[182], + hashable = [0, hash, compare, sexp_of_t]; + function of_string(s){ + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? caml_call3(invalid_argf, _a_, s, 0) + : 1 + : 0; + } + var + to_string = Base_Import[85][29], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + include$0 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$0[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[105][2], low, t); + return _k_ ? caml_call2(Base_Import[105][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[105][1], t, min) + ? min + : caml_call2(Base_Import[105][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[105][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[105][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function to_int(x){return caml_call1(Base_Import[86], x);} + function symbol(a, b){ + var _f_ = to_int(b), _g_ = to_int(a); + return caml_call2(Base_Import[118], _g_, _f_); + } + function symbol$0(a, b){ + var _d_ = to_int(b), _e_ = to_int(a); + return caml_call2(Base_Import[116], _e_, _d_); + } + if(1 === to_int(1) && 0 === to_int(0)){ + var + include$1 = Base_Import[105], + symbol$1 = include$1[1], + symbol$2 = include$1[2], + symbol$3 = include$1[3], + symbol$4 = include$1[4], + symbol$5 = include$1[5], + symbol$6 = include$1[6], + ascending = include$1[7], + descending = include$1[8], + compare$0 = include$1[9], + equal = include$1[10], + max = include$1[11], + min = include$1[12], + Base_Bool = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$6, + symbol$2, + symbol$4, + symbol$5, + symbol$1, + symbol$3, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + to_int, + [0, symbol$0, symbol]]; + runtime.caml_register_global(17, Base_Bool, "Base__Bool"); + return; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + (globalThis)); + +//# 31089 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_lx = "%lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int32.Hex", + module_name$0 = "Base.Int32", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Int_math = global_data.Base__Int_math, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[205], + func = Base_Import[219], + _e_ = [0, [5, 6, 0, 0, 0], cst_lx], + _d_ = [0, [5, 6, 0, 0, 0], cst_lx], + cst_Int32_ceil_log2_got_invali = "[Int32.ceil_log2] got invalid input", + cst_Int32_floor_log2_got_inval = "[Int32.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int32.ml", 97, 4], + _a_ = + [0, + [11, + "Int32.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int32.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[168], + sexp_of_t = Base_Import[144], + t_sexp_grammar = Base_Import[188], + hashable = [0, hash, Stdlib_Int32[15], sexp_of_t]; + function ascending(x, y){return caml_call2(Stdlib_Int32[15], x, y);} + var + to_string = Stdlib_Int32[14], + of_string = runtime.caml_int_of_string, + include = caml_call1(Base_Comparator[5], [0, ascending, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 32), + float_upper_bound = caml_call1(Base_Float0[23], 32), + float_of_bits = runtime.caml_int32_float_of_bits, + bits_of_float = runtime.caml_int32_bits_of_float, + num_bits = 32; + function shift_right_logical(_S_, _R_){return _S_ >>> _R_ | 0;} + function shift_right(_Q_, _P_){return _Q_ >> _P_;} + function shift_left(_O_, _N_){return _O_ << _N_;} + var bit_not = Stdlib_Int32[11]; + function bit_xor(_M_, _L_){return _M_ ^ _L_;} + function bit_or(_K_, _J_){return _K_ | _J_;} + function bit_and(_I_, _H_){return _I_ & _H_;} + var + min_value = Stdlib_Int32[10], + max_value = Stdlib_Int32[9], + abs = Stdlib_Int32[8], + pred = Stdlib_Int32[7], + succ = Stdlib_Int32[6], + rem = runtime.caml_mod; + function symbol(_G_){return - _G_ | 0;} + var + minus_one = Stdlib_Int32[3], + one = Stdlib_Int32[2], + zero = Stdlib_Int32[1]; + function to_float(_F_){return _F_;} + function of_float_unchecked(_E_){return _E_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _D_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _D_, 0); + } + var + include$0 = + caml_call1(Base_Comparable[13], [0, ascending, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5], + symbol$0 = runtime.caml_greaterequal, + symbol$1 = caml_lessequal, + symbol$2 = caml_equal, + symbol$3 = caml_greaterthan, + symbol$4 = caml_lessthan, + symbol$5 = runtime.caml_notequal; + function descending(x, y){return ascending(y, x);} + function min(x, y){return caml_lessthan(x, y) ? x : y;} + function max(x, y){return caml_greaterthan(x, y) ? x : y;} + var equal = caml_equal; + function between(t, low, high){ + var _C_ = caml_lessequal(low, t); + return _C_ ? caml_lessequal(t, high) : _C_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _z_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _A_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _z_], + _B_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _A_); + return caml_call1(Base_Or_error[35], _B_); + } + function invariant(param){return 0;} + var symbol$6 = runtime.caml_div, symbol$7 = runtime.caml_mul; + function symbol$8(_y_, _x_){return _y_ - _x_ | 0;} + function symbol$9(_w_, _v_){return _w_ + _v_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_int32(t){return t;} + function to_int32(t){return t;} + var + popcount = Base_Popcount[2], + of_int = Base_Int_conversions[1], + of_int_exn = Base_Int_conversions[2], + of_int_trunc = Base_Int_conversions[3], + to_int = Base_Int_conversions[6], + to_int_exn = Base_Int_conversions[7], + to_int_trunc = Base_Int_conversions[8], + of_int64 = Base_Int_conversions[14], + of_int64_exn = Base_Int_conversions[15], + of_int64_trunc = Base_Int_conversions[16], + to_int64 = Base_Int_conversions[9], + of_nativeint = Base_Int_conversions[25], + of_nativeint_exn = Base_Int_conversions[26], + of_nativeint_trunc = Base_Int_conversions[27], + to_nativeint = Base_Int_conversions[10]; + function pow(b, e){ + var _t_ = caml_call1(to_int_exn, e), _u_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _u_, _t_)); + } + function symbol$10(b, e){return pow(b, e);} + function bswap16(x){return caml_int32_bswap(x) >>> 16 | 0;} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int32[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0; + return caml_call1(Stdlib_Int32[6], x$5); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0; + return x$4 - (x$4 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var _r_ = Stdlib_Int32[1], _s_ = x & caml_call1(Stdlib_Int32[7], x); + return caml_call2(Base_Import[102][4], _s_, _r_); + } + function floor_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _o_ = [0, [0, cst, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_floor_log2_got_inval, _o_)); + } + var + _p_ = runtime.Base_int_math_int32_clz(i), + _q_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _q_, _p_); + } + function ceil_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _m_ = [0, [0, cst$0, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_ceil_log2_got_invali, _m_)); + } + if(caml_call2(Stdlib_Int32[17], i, Stdlib_Int32[2])) return 0; + var _n_ = runtime.Base_int_math_int32_clz(caml_call1(Stdlib_Int32[7], i)); + return caml_call2(Base_Import[93], num_bits, _n_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare = Base_Import[230], + hash_fold_t$0 = Base_Import[205], + func$0 = Base_Import[219]; + function hash$0(x){return caml_call1(func$0, x);} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _k_(_l_){return _l_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _k_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$4, + symbol, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + of_int_exn, + rem]), + symbol$11 = include$3[1], + symbol$12 = include$3[2], + symbol$13 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + _f_ = caml_int32_bswap, + _g_ = + [0, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$10, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + symbol$11, + symbol$12, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _h_(_j_){return runtime.Base_int_math_int32_ctz(_j_);} + var + Base_Int32 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + ascending, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + symbol$9, + symbol$8, + symbol$7, + symbol$10, + symbol, + symbol, + symbol$12, + symbol$11, + symbol$6, + rem, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_i_){return runtime.Base_int_math_int32_clz(_i_);}, + _h_, + _g_, + of_int, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + of_int_trunc, + to_int_trunc, + of_nativeint_trunc, + of_int64_trunc, + bits_of_float, + float_of_bits, + bswap16, + _f_]; + runtime.caml_register_global(29, Base_Int32, "Base__Int32"); + return; + } + (globalThis)); + +//# 31536 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_product$1 = "product", + cst_t$3 = "t", + cst_u$3 = "u", + caml_div = runtime.caml_div, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Word_size = global_data.Base__Word_size, + Base_Int = global_data.Base__Int, + Base_Sexp = global_data.Base__Sexp, + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Int64 = global_data.Base__Int64, + Base_Error = global_data.Base__Error, + Base_Int63_emul = global_data.Base__Int63_emul, + Assert_failure = global_data.Assert_failure, + raise_s = Base_Error[30], + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + cst_neg_overflow = "neg overflow", + cst_abs_overflow = "abs overflow", + cst_product$0 = cst_product$1, + cst_u$2 = cst_u$3, + cst_t$2 = cst_t$3, + cst_overflow$2 = "( / ) overflow", + cst_product = cst_product$1, + cst_u$1 = cst_u$3, + cst_t$1 = cst_t$3, + cst_overflow$1 = "( * ) overflow", + cst_diff = "diff", + cst_u$0 = cst_u$3, + cst_t$0 = cst_t$3, + cst_overflow$0 = "( - ) overflow", + cst_sum = "sum", + cst_u = cst_u$3, + cst_t = cst_t$3, + cst_overflow = "( + ) overflow", + _b_ = [0, "src/int63.ml", 155, 9], + repr = Base_Word_size[3] ? 0 : 1, + t_sexp_grammar = Base_Int[1], + of_float = Base_Int[2], + to_float = Base_Int[3], + of_int_exn = Base_Int[4], + to_int_exn = Base_Int[5], + hash_fold_t = Base_Int[6], + hash = Base_Int[7], + t_of_sexp = Base_Int[8], + sexp_of_t = Base_Int[9], + of_string = Base_Int[10], + to_string = Base_Int[11], + equal = Base_Int[12], + compare = Base_Int[13], + min = Base_Int[14], + max = Base_Int[15], + ascending = Base_Int[16], + descending = Base_Int[17], + between = Base_Int[18], + clamp_exn = Base_Int[19], + clamp = Base_Int[20], + comparator = Base_Int[21], + pp = Base_Int[22], + hashable = Base_Int[23], + is_positive = Base_Int[24], + is_non_negative = Base_Int[25], + is_negative = Base_Int[26], + is_non_positive = Base_Int[27], + sign = Base_Int[28], + invariant = Base_Int[29], + Hex = Base_Int[30], + to_string_hum = Base_Int[31], + one = Base_Int[32], + minus_one = Base_Int[33], + rem = Base_Int[34], + round = Base_Int[35], + round_towards_zero = Base_Int[36], + round_down = Base_Int[37], + round_up = Base_Int[38], + round_nearest = Base_Int[39], + succ = Base_Int[40], + pred = Base_Int[41], + pow = Base_Int[42], + bit_and = Base_Int[43], + bit_or = Base_Int[44], + bit_xor = Base_Int[45], + bit_not = Base_Int[46], + popcount = Base_Int[47], + shift_left = Base_Int[48], + shift_right = Base_Int[49], + decr = Base_Int[50], + incr = Base_Int[51], + of_int32_exn = Base_Int[52], + to_int32_exn = Base_Int[53], + of_int64_exn = Base_Int[54], + to_int64 = Base_Int[55], + of_nativeint_exn = Base_Int[56], + to_nativeint_exn = Base_Int[57], + of_float_unchecked = Base_Int[58], + num_bits = Base_Int[59], + max_value = Base_Int[60], + min_value = Base_Int[61], + shift_right_logical = Base_Int[62], + ceil_pow2 = Base_Int[63], + floor_pow2 = Base_Int[64], + ceil_log2 = Base_Int[65], + floor_log2 = Base_Int[66], + is_pow2 = Base_Int[67], + clz = Base_Int[68], + ctz = Base_Int[69], + O = Base_Int[70], + symbol = Base_Int[71], + lnot = Base_Int[72], + abs = Base_Int[73], + zero = Base_Int[74], + symbol$0 = Base_Int[75], + symbol$1 = Base_Int[76], + symbol$2 = Base_Int[77], + of_int = Base_Int[79], + to_int32 = Base_Int[82], + of_int64 = Base_Int[83], + of_nativeint = Base_Int[84], + _a_ = Base_Int[85]; + function to_int(x){return [0, x];} + function to_int_trunc(x){return x;} + function to_nativeint_trunc(x){return caml_call1(_a_, x);} + function to_nativeint(x){return [0, caml_call1(_a_, x)];} + var repr$0 = 0; + function bswap32(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[85], caml_int64_of_int32(t))); + } + function bswap48(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[86], caml_int64_of_int32(t))); + } + if(repr) + var + include = + [0, + Base_Int63_emul[1], + Base_Int63_emul[2], + Base_Int63_emul[3], + Base_Int63_emul[4], + Base_Int63_emul[5], + Base_Int63_emul[6], + Base_Int63_emul[7], + Base_Int63_emul[8], + Base_Int63_emul[9], + Base_Int63_emul[10], + Base_Int63_emul[11], + Base_Int63_emul[12], + Base_Int63_emul[13], + Base_Int63_emul[14], + Base_Int63_emul[15], + Base_Int63_emul[16], + Base_Int63_emul[17], + Base_Int63_emul[18], + Base_Int63_emul[19], + Base_Int63_emul[20], + Base_Int63_emul[21], + Base_Int63_emul[22], + Base_Int63_emul[23], + Base_Int63_emul[24], + Base_Int63_emul[25], + Base_Int63_emul[26], + Base_Int63_emul[27], + Base_Int63_emul[28], + Base_Int63_emul[29], + Base_Int63_emul[30], + Base_Int63_emul[31], + Base_Int63_emul[32], + Base_Int63_emul[33], + Base_Int63_emul[34], + Base_Int63_emul[35], + Base_Int63_emul[36], + Base_Int63_emul[37], + Base_Int63_emul[38], + Base_Int63_emul[39], + Base_Int63_emul[40], + Base_Int63_emul[41], + Base_Int63_emul[42], + Base_Int63_emul[43], + Base_Int63_emul[44], + Base_Int63_emul[45], + Base_Int63_emul[46], + Base_Int63_emul[47], + Base_Int63_emul[48], + Base_Int63_emul[49], + Base_Int63_emul[50], + Base_Int63_emul[51], + Base_Int63_emul[52], + Base_Int63_emul[53], + Base_Int63_emul[54], + Base_Int63_emul[55], + Base_Int63_emul[56], + Base_Int63_emul[57], + Base_Int63_emul[58], + Base_Int63_emul[59], + Base_Int63_emul[60], + Base_Int63_emul[61], + Base_Int63_emul[62], + Base_Int63_emul[63], + Base_Int63_emul[64], + Base_Int63_emul[65], + Base_Int63_emul[66], + Base_Int63_emul[67], + Base_Int63_emul[68], + Base_Int63_emul[69], + Base_Int63_emul[70], + Base_Int63_emul[71], + Base_Int63_emul[72], + Base_Int63_emul[73], + Base_Int63_emul[74], + Base_Int63_emul[75], + Base_Int63_emul[76], + Base_Int63_emul[77], + Base_Int63_emul[78], + Base_Int63_emul[79], + Base_Int63_emul[80], + Base_Int63_emul[81], + Base_Int63_emul[83], + Base_Int63_emul[84], + Base_Int63_emul[85], + Base_Int63_emul[86], + Base_Int63_emul[87], + Base_Int63_emul[88], + Base_Int63_emul[89], + Base_Int63_emul[90], + Base_Int63_emul[91], + Base_Int63_emul[92], + Base_Int63_emul[93], + Base_Int63_emul[94], + Base_Int63_emul[95], + Base_Int63_emul[96], + Base_Int63_emul[97], + Base_Int63_emul[98], + Base_Int63_emul[99], + Base_Int63_emul[100], + Base_Int63_emul[101], + Base_Int63_emul[102], + Base_Int63_emul[103], + Base_Int63_emul[104], + Base_Int63_emul[105], + Base_Int63_emul[106], + Base_Int63_emul[107], + Base_Int63_emul[82], + Base_Int63_emul[113], + Base_Int63_emul[108], + Base_Int63_emul[109], + Base_Int63_emul[110]]; + else + var + _c_ = runtime.caml_bswap16, + _d_ = function(_bo_){return _bo_;}, + _e_ = caml_int64_to_int32, + _f_ = function(_bn_){return _bn_;}, + _g_ = function(_bm_, _bl_){return _bm_ >>> _bl_ | 0;}, + _h_ = function(_bk_, _bj_){return _bk_ >> _bj_;}, + _i_ = function(_bi_, _bh_){return _bi_ << _bh_;}, + _j_ = O[2], + _k_ = function(_bg_, _bf_){return _bg_ ^ _bf_;}, + _l_ = function(_be_, _bd_){return _be_ | _bd_;}, + _m_ = function(_bc_, _bb_){return _bc_ & _bb_;}, + _n_ = O[7], + _o_ = O[6], + _p_ = O[5], + _q_ = O[4], + _r_ = function(_ba_){return - _ba_ | 0;}, + _s_ = O[3], + _t_ = function(_a$_, _a__){return _a$_ !== _a__ ? 1 : 0;}, + _u_ = function(_a9_, _a8_){return _a9_ < _a8_ ? 1 : 0;}, + _v_ = function(_a7_, _a6_){return _a6_ < _a7_ ? 1 : 0;}, + _w_ = function(_a5_, _a4_){return _a5_ === _a4_ ? 1 : 0;}, + _x_ = function(_a3_, _a2_){return _a3_ <= _a2_ ? 1 : 0;}, + _y_ = function(_a1_, _a0_){return _a0_ <= _a1_ ? 1 : 0;}, + _z_ = O[1], + _A_ = function(_aZ_){return - _aZ_ | 0;}, + _B_ = caml_div, + _C_ = caml_mul, + _D_ = function(_aY_, _aX_){return _aY_ - _aX_ | 0;}, + _E_ = + [0, + function(_aW_, _aV_){return _aW_ + _aV_ | 0;}, + _D_, + _C_, + _B_, + _A_, + _z_, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_], + _F_ = function(_aU_, _aT_){return _aU_ >>> _aT_ | 0;}, + _G_ = function(_aS_, _aR_){return _aS_ >> _aR_;}, + _H_ = function(_aQ_, _aP_){return _aQ_ << _aP_;}, + _I_ = function(_aO_, _aN_){return _aO_ ^ _aN_;}, + _J_ = function(_aM_, _aL_){return _aM_ | _aL_;}, + _K_ = function(_aK_, _aJ_){return _aK_ & _aJ_;}, + _L_ = caml_div, + _M_ = function(_aI_){return - _aI_ | 0;}, + _N_ = function(_aH_){return - _aH_ | 0;}, + _O_ = caml_mul, + _P_ = function(_aG_, _aF_){return _aG_ - _aF_ | 0;}, + _Q_ = function(_aE_, _aD_){return _aE_ + _aD_ | 0;}, + _R_ = function(_aC_, _aB_){return _aC_ !== _aB_ ? 1 : 0;}, + _S_ = function(_aA_, _az_){return _aA_ < _az_ ? 1 : 0;}, + _T_ = function(_ay_, _ax_){return _ax_ < _ay_ ? 1 : 0;}, + _U_ = function(_aw_, _av_){return _aw_ === _av_ ? 1 : 0;}, + _V_ = function(_au_, _at_){return _au_ <= _at_ ? 1 : 0;}, + include = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + function(_as_, _ar_){return _ar_ <= _as_ ? 1 : 0;}, + _V_, + _U_, + _T_, + _S_, + _R_, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + _Q_, + _P_, + _O_, + symbol, + _N_, + _M_, + symbol$1, + symbol$0, + _L_, + rem, + symbol$2, + _K_, + _J_, + _I_, + lnot, + _H_, + _G_, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + num_bits, + max_value, + min_value, + _F_, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _E_, + of_int, + to_int, + to_int_trunc, + of_int32_exn, + to_int32, + _f_, + of_int64, + _e_, + of_nativeint, + to_nativeint, + _d_, + to_nativeint_trunc, + of_float_unchecked, + repr$0, + _c_, + bswap32, + bswap48]; + var + t_sexp_grammar$0 = include[1], + of_float$0 = include[2], + to_float$0 = include[3], + of_int_exn$0 = include[4], + to_int_exn$0 = include[5], + hash_fold_t$0 = include[6], + hash$0 = include[7], + t_of_sexp$0 = include[8], + sexp_of_t$0 = include[9], + of_string$0 = include[10], + to_string$0 = include[11], + symbol$3 = include[12], + symbol$4 = include[13], + symbol$5 = include[14], + symbol$6 = include[15], + symbol$7 = include[16], + symbol$8 = include[17], + equal$0 = include[18], + compare$0 = include[19], + min$0 = include[20], + max$0 = include[21], + ascending$0 = include[22], + descending$0 = include[23], + between$0 = include[24], + clamp_exn$0 = include[25], + clamp$0 = include[26], + comparator$0 = include[27], + pp$0 = include[28], + hashable$0 = include[29], + is_positive$0 = include[30], + is_non_negative$0 = include[31], + is_negative$0 = include[32], + is_non_positive$0 = include[33], + sign$0 = include[34], + invariant$0 = include[35], + Hex$0 = include[36], + to_string_hum$0 = include[37], + zero$0 = include[38], + one$0 = include[39], + minus_one$0 = include[40], + symbol$9 = include[41], + symbol$10 = include[42], + symbol$11 = include[43], + symbol$12 = include[44], + neg = include[45], + symbol$13 = include[46], + symbol$14 = include[47], + symbol$15 = include[48], + symbol$16 = include[49], + rem$0 = include[50], + symbol$17 = include[51], + land = include[52], + lor = include[53], + lxor = include[54], + lnot$0 = include[55], + lsl = include[56], + asr = include[57], + round$0 = include[58], + round_towards_zero$0 = include[59], + round_down$0 = include[60], + round_up$0 = include[61], + round_nearest$0 = include[62], + abs$0 = include[63], + succ$0 = include[64], + pred$0 = include[65], + pow$0 = include[66], + bit_and$0 = include[67], + bit_or$0 = include[68], + bit_xor$0 = include[69], + bit_not$0 = include[70], + popcount$0 = include[71], + shift_left$0 = include[72], + shift_right$0 = include[73], + decr$0 = include[74], + incr$0 = include[75], + of_int32_exn$0 = include[76], + to_int32_exn$0 = include[77], + of_int64_exn$0 = include[78], + to_int64$0 = include[79], + of_nativeint_exn$0 = include[80], + to_nativeint_exn$0 = include[81], + num_bits$0 = include[82], + max_value$0 = include[83], + min_value$0 = include[84], + lsr = include[85], + shift_right_logical$0 = include[86], + ceil_pow2$0 = include[87], + floor_pow2$0 = include[88], + ceil_log2$0 = include[89], + is_pow2$0 = include[91], + clz$0 = include[92], + ctz$0 = include[93], + O$0 = include[94], + of_int$0 = include[95], + to_int$0 = include[96], + to_int_trunc$0 = include[97], + of_int32 = include[98], + to_int32$0 = include[99], + to_int32_trunc = include[100], + of_int64$0 = include[101], + of_int64_trunc = include[102], + of_nativeint$0 = include[103], + to_nativeint$0 = include[104], + of_nativeint_trunc = include[105], + to_nativeint_trunc$0 = include[106], + of_float_unchecked$0 = include[107], + repr$1 = include[108], + bswap16 = include[109], + bswap32$0 = include[110], + bswap48$0 = include[111]; + function symbol$18(t, u){ + var + sum = caml_call2(symbol$9, t, u), + _an_ = caml_call2(bit_xor$0, t, caml_call1(bit_not$0, sum)); + if + (caml_call2 + (symbol$7, + caml_call2(bit_or$0, caml_call2(bit_xor$0, t, u), _an_), + zero$0)) + return sum; + var + _ao_ = [0, [0, cst_sum, caml_call1(sexp_of_t$0, sum)], 0], + _ap_ = [0, [0, cst_u, caml_call1(sexp_of_t$0, u)], _ao_], + _aq_ = [0, [0, cst_t, caml_call1(sexp_of_t$0, t)], _ap_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow, _aq_)); + } + function symbol$19(t, u){ + var + diff = caml_call2(symbol$10, t, u), + pos_diff = caml_call2(symbol$6, t, u); + if(caml_call2(symbol$8, t, u)){ + var _aj_ = caml_call1(is_positive$0, diff); + if(caml_call2(Base_Bool[14], pos_diff, _aj_)){ + var + _ak_ = [0, [0, cst_diff, caml_call1(sexp_of_t$0, diff)], 0], + _al_ = [0, [0, cst_u$0, caml_call1(sexp_of_t$0, u)], _ak_], + _am_ = [0, [0, cst_t$0, caml_call1(sexp_of_t$0, t)], _al_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$0, _am_)); + } + } + return diff; + } + var negative_one = caml_call1(of_int$0, -1); + function div_would_overflow(t, u){ + var _ai_ = caml_call2(symbol$5, t, min_value$0); + return _ai_ ? caml_call2(symbol$5, u, negative_one) : _ai_; + } + function symbol$20(t, u){ + var product = caml_call2(symbol$11, t, u); + if(caml_call2(symbol$8, u, zero$0)){ + var switch$0 = 0; + if + (! + div_would_overflow(product, u) + && ! caml_call2(symbol$8, caml_call2(symbol$16, product, u), t)) + switch$0 = 1; + if(! switch$0){ + var + _af_ = [0, [0, cst_product, caml_call1(sexp_of_t$0, product)], 0], + _ag_ = [0, [0, cst_u$1, caml_call1(sexp_of_t$0, u)], _af_], + _ah_ = [0, [0, cst_t$1, caml_call1(sexp_of_t$0, t)], _ag_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$1, _ah_)); + } + } + return product; + } + function symbol$21(t, u){ + if(! div_would_overflow(t, u)) return caml_call2(symbol$16, t, u); + var + _ac_ = + [0, + [0, + cst_product$0, + caml_call1(sexp_of_t$0, caml_call2(symbol$16, t, u))], + 0], + _ad_ = [0, [0, cst_u$2, caml_call1(sexp_of_t$0, u)], _ac_], + _ae_ = [0, [0, cst_t$2, caml_call1(sexp_of_t$0, t)], _ad_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow$2, _ae_)); + } + function abs$1(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_abs_overflow) + : caml_call1(abs$0, t); + } + function neg$0(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_neg_overflow) + : caml_call1(neg, t); + } + if(63 !== num_bits$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + function random_of_int(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _ab_ = caml_call1(to_int_exn$0, bound); + return caml_call1(of_int$0, caml_call2(Base_Random[18][6], state, _ab_)); + } + function random_of_int64(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _aa_ = caml_call1(to_int64$0, bound); + return caml_call1 + (of_int64_exn$0, caml_call2(Base_Random[18][9], state, _aa_)); + } + var random_of_int$0 = Base_Word_size[3] ? random_of_int : random_of_int64; + function random_incl_of_int(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var + ___ = caml_call1(to_int_exn$0, hi), + _$_ = caml_call1(to_int_exn$0, lo); + return caml_call1 + (of_int$0, caml_call3(Base_Random[18][11], state, _$_, ___)); + } + function random_incl_of_int64(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _Y_ = caml_call1(to_int64$0, hi), _Z_ = caml_call1(to_int64$0, lo); + return caml_call1 + (of_int64_exn$0, caml_call3(Base_Random[18][14], state, _Z_, _Y_)); + } + var + random_incl = + Base_Word_size[3] ? random_incl_of_int : random_incl_of_int64; + function floor_log2$0(t){ + if(Base_Word_size[3]){ + var _W_ = caml_call1(to_int_exn$0, t); + return caml_call1(Base_Int[66], _W_); + } + if(caml_call2(symbol$4, t, zero$0)){ + var _X_ = [0, [0, cst, caml_call1(sexp_of_t$0, t)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _X_)); + } + var floor_log2 = [0, num_bits$0 - 2 | 0]; + for(;;){ + if + (! + caml_call2 + (equal$0, + zero$0, + caml_call2 + (bit_and$0, t, caml_call2(shift_left$0, one$0, floor_log2[1])))) + return floor_log2[1]; + floor_log2[1] = floor_log2[1] - 1 | 0; + } + } + var + Base_Int63 = + [0, + t_sexp_grammar$0, + of_float$0, + to_float$0, + of_int_exn$0, + to_int_exn$0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + equal$0, + compare$0, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator$0, + pp$0, + hashable$0, + is_positive$0, + is_non_negative$0, + is_negative$0, + is_non_positive$0, + sign$0, + invariant$0, + Hex$0, + to_string_hum$0, + zero$0, + one$0, + minus_one$0, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + neg, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + rem$0, + symbol$17, + land, + lor, + lxor, + lnot$0, + lsl, + asr, + round$0, + round_towards_zero$0, + round_down$0, + round_up$0, + round_nearest$0, + abs$0, + succ$0, + pred$0, + pow$0, + bit_and$0, + bit_or$0, + bit_xor$0, + bit_not$0, + popcount$0, + shift_left$0, + shift_right$0, + decr$0, + incr$0, + of_int32_exn$0, + to_int32_exn$0, + of_int64_exn$0, + to_int64$0, + of_nativeint_exn$0, + to_nativeint_exn$0, + of_float_unchecked$0, + num_bits$0, + max_value$0, + min_value$0, + lsr, + shift_right_logical$0, + ceil_pow2$0, + floor_pow2$0, + ceil_log2$0, + is_pow2$0, + clz$0, + ctz$0, + O$0, + [0, symbol$18, symbol$19, symbol$20, symbol$21, abs$1, neg$0], + of_int$0, + to_int$0, + of_int32, + to_int32$0, + of_int64$0, + of_nativeint$0, + to_nativeint$0, + to_int_trunc$0, + to_int32_trunc, + of_int64_trunc, + of_nativeint_trunc, + to_nativeint_trunc$0, + bswap16, + bswap32$0, + bswap48$0, + random_of_int$0, + random_incl, + floor_log2$0, + [0, Base_Int63_emul[112], repr$1]]; + runtime.caml_register_global(31, Base_Int63, "Base__Int63"); + return; + } + (globalThis)); + +//# 34671 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_out_of_range_0 = " out of range [0, ", + cst_s_1e = "%s%.1e", + cst_is_too_large = ") is too large", + cst_is_too_small_or_NaN = ") is too small or NaN", + cst$5 = ".", + cst_Float_int63_round_down_exn = "Float.int63_round_down_exn: argument (", + cst_Float_int63_round_nearest_ = + "Float.int63_round_nearest_portable_alloc_exn: argument (", + cst_Float_int63_round_up_exn_a = "Float.int63_round_up_exn: argument (", + cst_Float_iround_down_exn_argu = "Float.iround_down_exn: argument (", + cst_Float_iround_nearest_exn_a = "Float.iround_nearest_exn: argument (", + cst_Float_iround_nearest_exn_a$0 = + "Float.iround_nearest_exn: argument (%f) is too large", + cst_Float_iround_up_exn_argume = "Float.iround_up_exn: argument (", + cst_Infinite = "Infinite", + cst_Nan = "Nan", + cst_Normal = "Normal", + cst_Subnormal = "Subnormal", + cst_Zero = "Zero", + cst_infinite = "infinite", + cst_nan$1 = "nan", + cst_normal = "normal", + cst_src_float_ml = "src/float.ml", + cst_subnormal = "subnormal", + cst_zero = "zero", + caml_bytes_set = runtime.caml_bytes_set, + caml_format_float = runtime.caml_format_float, + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_or = runtime.caml_int64_or, + caml_log10_float = runtime.caml_log10_float, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_compare = runtime.caml_string_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$4, + cst$2 = cst$4, + cst$1 = "-", + cst$0 = cst$5, + cst = cst$5, + all = [0, 0, [0, 1, [0, 2, [0, 3, [0, 4, 0]]]]], + error_source_006 = "float.ml.Class.t", + t_sexp_grammar$0 = + [3, + [0, + 2, + [0, + [1, [0, cst_Infinite, 0]], + [0, + [1, [0, cst_Nan, 0]], + [0, + [1, [0, cst_Normal, 0]], + [0, [1, [0, cst_Subnormal, 0]], [0, [1, [0, cst_Zero, 0]], 0]]]]]]], + module_name = "Base.Float", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Or_error = global_data.Base__Or_error, + Base_Int = global_data.Base__Int, + Base_Int63 = global_data.Base__Int63, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Int64 = global_data.Base__Int64, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Assert_failure = global_data.Assert_failure, + Base_String = global_data.Base__String, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Char = global_data.Base__Char, + Base_Int_conversions = global_data.Base__Int_conversions, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Word_size = global_data.Base__Word_size, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + round_up = Base_Float0[1], + round_down = Base_Float0[2], + mod_float = Base_Float0[3], + modf = Base_Float0[4], + float_of_string = Base_Float0[5], + nan = Base_Float0[6], + max_value = Base_Float0[7], + neg_infinity = Base_Float0[8], + max_finite_value = Base_Float0[9], + epsilon_float = Base_Float0[10], + classify_float = Base_Float0[11], + abs_float = Base_Float0[12], + is_integer = Base_Float0[13], + symbol = Base_Float0[14], + symbol$0 = Base_Float0[15], + frexp = Base_Float0[16], + ldexp = Base_Float0[17], + is_nan = Base_Float0[18], + to_int64_preserve_order = Base_Float0[19], + to_int64_preserve_order_exn = Base_Float0[20], + of_int64_preserve_order = Base_Float0[21], + one_ulp = Base_Float0[22], + upper_bound_for_int = Base_Float0[23], + lower_bound_for_int = Base_Float0[25], + clamp_unchecked = Base_Float0[26], + box = Base_Float0[27], + compare = Base_Float0[36], + raise_s = Base_Error[30], + hash_fold_t = Base_Import[210], + func = Base_Import[224], + _R_ = [0, [8, [0, 0, 4], 0, [0, 8], 0], "%.8G"], + _P_ = + [0, + [11, + "exponent ", + [4, 0, 0, 0, [11, cst_out_of_range_0, [4, 0, 0, 0, [12, 93, 0]]]]], + "exponent %d out of range [0, %d]"], + _Q_ = + [0, + [11, + "mantissa ", + [2, 0, [11, cst_out_of_range_0, [2, 0, [12, 93, 0]]]]], + "mantissa %s out of range [0, %s]"], + cst_Float_sign_exn_of_NAN = "Float.sign_exn of NAN", + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _L_ = [0, cst_src_float_ml, 859, 2], + _K_ = + [0, + [11, + "Float.round_significant: invalid argument significant_digits:", + [4, 0, 0, 0, 0]], + "Float.round_significant: invalid argument significant_digits:%d"], + _J_ = [0, [8, [0, 0, 3], 0, 1, 0], "%.*g"], + _I_ = [0, "p"], + cst_t = "t", + cst_g = "g", + cst_m = "m", + cst_k = "k", + _F_ = [0, cst_src_float_ml, 697, 8], + _E_ = [0, cst_src_float_ml, 700, 8], + _A_ = [0, cst_src_float_ml, 707, 8], + _B_ = [0, cst_src_float_ml, 708, 8], + _C_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [12, 32, 0]]]], "%s%d%s "], + _D_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [4, 0, 0, 0, 0]]]], "%s%d%s%d"], + _z_ = [0, cst_src_float_ml, 684, 8], + cst_0 = ".0", + _G_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + _H_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + cst_inf$1 = "-inf ", + cst_inf$2 = "inf ", + cst_nan$0 = "nan ", + cst_sexp = "sexp", + cst_sexp_of_float_produced_str = "[sexp_of_float] produced strange sexp", + _w_ = + [0, + [11, "to_string_hum: invalid argument ~decimals=", [4, 0, 0, 0, 0]], + "to_string_hum: invalid argument ~decimals=%d"], + _x_ = [0, [8, [0, 1, 0], 0, 1, 0], "%+.*f"], + _y_ = [0, [8, [0, 0, 0], 0, 1, 0], "%.*f"], + cst_inf = "inf", + cst_inf$0 = "-inf", + cst_nan = cst_nan$1, + _r_ = [0, cst_Infinite], + _s_ = [0, cst_Nan], + _t_ = [0, cst_Normal], + _u_ = [0, cst_Subnormal], + _v_ = [0, cst_Zero], + _p_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too large"], + _q_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too small or NaN"], + _n_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_down_exn: argument (%f) is too large"], + _o_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_down_exn: argument (%f) is too small or NaN"], + _l_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_up_exn: argument (%f) is too large"], + _m_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_up_exn: argument (%f) is too small or NaN"], + _j_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _k_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_nearest_exn: argument (%f) is too small or NaN"], + _h_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _i_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, ") is too small", 0]]], + "Float.iround_nearest_exn: argument (%f) is too small"], + _f_ = + [0, + [11, + "Float.iround_towards_zero_exn: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Float.iround_towards_zero_exn: argument (%f) is out of range or NaN"], + _d_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_down_exn: argument (%f) is too large"], + _e_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_down_exn: argument (%f) is too small or NaN"], + _b_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_up_exn: argument (%f) is too large"], + _c_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_up_exn: argument (%f) is too small or NaN"], + _a_ = [0, [11, "Float.of_string ", [2, 0, 0]], "Float.of_string %s"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[167], + sexp_of_t = Base_Import[143], + t_sexp_grammar = Base_Import[187], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[108][9], + include = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function to_float(x){return x;} + function of_float(x){return x;} + function of_string(s){ + try{var _aX_ = caml_call1(float_of_string, s); return _aX_;} + catch(_aY_){return caml_call3(Base_Printf[7], _a_, s, 0);} + } + function to_string(x){ + var + y = caml_format_float("%.15g", x), + _aW_ = caml_call1(float_of_string, y), + y$0 = + caml_call2(Base_Import[108][4], _aW_, x) + ? y + : caml_format_float("%.17g", x), + l = runtime.caml_ml_string_length(y$0), + i = 0; + for(;;){ + if(l <= i) return caml_call2(Base_Import[112], y$0, cst); + var match = runtime.caml_string_get(y$0, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return y$0; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + var + min_positive_subnormal_value = caml_call2(symbol, 2., -1074.), + min_positive_normal_value = caml_call2(symbol, 2., -1022.), + of_int = Base_Int[3], + to_int = Base_Int[2], + zero = 0., + one = 1., + minus_one = -1., + pi = 3.141592653589793, + sqrt_pi = 1.772453850905516, + sqrt_2pi = 2.5066282746310007, + euler = 0.5772156649015329; + function of_int63(i){return caml_call1(Base_Int63[3], i);} + var + of_int64 = runtime.caml_int64_to_float, + to_int64 = runtime.caml_int64_of_float, + iround_lbound = caml_call1(lower_bound_for_int, Base_Int[59]), + iround_ubound = caml_call1(upper_bound_for_int, Base_Int[59]); + function iround_up(t){ + if(! caml_call2(Base_Import[108][5], t, 0.)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_up, t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aU_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _b_, _aU_, 0); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aV_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _c_, _aV_, 0); + } + function iround_down(t){ + if(caml_call2(Base_Import[108][6], t, 0.)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_down, t); + return caml_call2(Base_Import[108][6], t$0, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aS_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _d_, _aS_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, iround_lbound)) + return caml_call1(Base_Int[58], t$0); + var _aT_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _e_, _aT_, 0); + } + function iround_towards_zero(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return [0, caml_call1(Base_Int[58], t)]; + return 0; + } + function iround_towards_zero_exn(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aR_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _f_, _aR_, 0); + } + var + _g_ = caml_call2(symbol, 2., 52.), + round_nearest_lb = caml_call1(Base_Import[114], _g_), + round_nearest_ub = caml_call2(symbol, 2., 52.), + one_ulp_less_than_half = caml_call2(one_ulp, 759637122, 0.5); + function add_half_for_round_nearest(t){ + var + _aQ_ = + caml_call2(Base_Import[108][4], t, one_ulp_less_than_half) + ? one_ulp_less_than_half + : 0.5; + return caml_call2(Base_Import[92], t, _aQ_); + } + function iround_nearest_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call2(Base_Import[108][6], t$1, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$1)] + : 0; + } + function iround_nearest_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(! caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aO_ = add_half_for_round_nearest(t); + return [0, caml_call1(Base_Int[58], _aO_)]; + } + if(! caml_call2(Base_Import[108][5], t, round_nearest_lb)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aP_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return [0, caml_call1(Base_Int[58], _aP_)]; + } + var + iround_nearest_64$0 = + Base_Word_size[3] ? iround_nearest_64 : iround_nearest_32; + function iround_nearest_exn_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aM_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _h_, _aM_, 0); + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + if(caml_call2(Base_Import[108][6], t$1, iround_lbound)) + return caml_call1(Base_Int[58], t$1); + var _aN_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _i_, _aN_, 0); + } + function iround_nearest_exn_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][1], t, round_nearest_ub)){ + var _aI_ = add_half_for_round_nearest(t); + return caml_call1(Base_Int[58], _aI_); + } + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aJ_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _j_, _aJ_, 0); + } + if(caml_call2(Base_Import[108][5], t, round_nearest_lb)){ + var _aK_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call1(Base_Int[58], _aK_); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aL_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _k_, _aL_, 0); + } + var + iround_nearest_exn = + Base_Word_size[3] ? iround_nearest_exn_64 : iround_nearest_exn_32; + function iround_exn(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? iround_towards_zero_exn(t) + : iround_nearest_exn(t) + : 759637122 <= dir ? iround_down_exn(t) : iround_up_exn(t); + } + function iround(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + try{var _aG_ = [0, iround_exn([0, dir], t)]; return _aG_;} + catch(_aH_){return 0;} + } + function is_inf(t){ + var _aF_ = caml_call2(Base_Import[96], 1., t); + return caml_call2(Base_Import[108][4], _aF_, 0.); + } + function is_finite(t){ + var _aE_ = caml_call2(Base_Import[94], t, t); + return caml_call2(Base_Import[108][4], _aE_, 0.); + } + function min_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][1], x, y) ? x : y; + } + function max_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][5], x, y) ? x : y; + } + var + add = Base_Import[92], + sub = Base_Import[94], + neg = Base_Import[114], + scale = Base_Import[90]; + function square(x){return caml_call2(Base_Import[90], x, x);} + function fractional(t){return caml_call1(Base_Import[125], t);} + function integral(t){return caml_call1(Base_Import[127], t);} + function round_towards_zero(t){ + return caml_call2(Base_Import[108][6], t, 0.) + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + function round_nearest_inline(t){ + if + (caml_call2(Base_Import[108][5], t, round_nearest_lb) + && caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call1(round_down, add_half_for_round_nearest(t)); + return caml_call2(Base_Import[92], t, 0.); + } + function round_nearest(t){return round_nearest_inline(t);} + function round_nearest_half_to_even(t){ + if + (! + caml_call2(Base_Import[108][2], t, round_nearest_lb) + && ! caml_call2(Base_Import[108][6], t, round_nearest_ub)){ + var + floor = caml_call1(round_down, t), + ceil_or_succ = caml_call2(Base_Import[92], floor, 1.), + diff_floor = caml_call2(Base_Import[94], t, floor), + diff_ceil = caml_call2(Base_Import[94], ceil_or_succ, t); + if(caml_call2(Base_Import[108][1], diff_floor, diff_ceil)) return floor; + if(caml_call2(Base_Import[108][5], diff_floor, diff_ceil)) + return ceil_or_succ; + var _aD_ = caml_call2(mod_float, floor, 2.); + return caml_call2(Base_Import[108][4], _aD_, 0.) ? floor : ceil_or_succ; + } + return caml_call2(Base_Import[92], t, 0.); + } + var + int63_round_lbound = caml_call1(lower_bound_for_int, Base_Int63[83]), + int63_round_ubound = caml_call1(upper_bound_for_int, Base_Int63[83]); + function int63_round_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, int63_round_ubound)) + return caml_call1(Base_Int63[82], t$0); + var _aB_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _l_, _aB_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _aC_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _m_, _aC_, 0); + } + function int63_round_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _az_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _n_, _az_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, int63_round_lbound)) + return caml_call1(Base_Int63[82], t$0); + var _aA_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _o_, _aA_, 0); + } + function int63_round_nearest_portable_a(t0){ + var t = round_nearest_inline(t0); + if(caml_call2(Base_Import[108][5], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _ax_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _p_, _ax_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _ay_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _q_, _ay_, 0); + } + function int63_round_nearest_arch64_noa(f){ + var _aw_ = iround_nearest_exn(f); + return caml_call1(Base_Int63[96], _aw_); + } + var + int63_round_nearest_exn = + Base_Word_size[3] + ? int63_round_nearest_arch64_noa + : int63_round_nearest_portable_a; + function round(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 <= dir ? round_towards_zero(t) : round_nearest(t) + : 759637122 + <= dir + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + var compare$1 = runtime.caml_int_compare; + function t_of_sexp$0(sexp_007){ + if(0 === sexp_007[0]){ + var + _aq_ = sexp_007[1], + _ar_ = caml_string_compare(_aq_, cst_infinite), + switch$0 = 0; + if(0 <= _ar_) + if(0 < _ar_) + if(caml_string_notequal(_aq_, cst_nan$1)) + if(caml_string_notequal(_aq_, cst_normal)) + if(caml_string_notequal(_aq_, cst_subnormal)){ + if(! caml_string_notequal(_aq_, cst_zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + else if(caml_string_notequal(_aq_, cst_Infinite)) + if(caml_string_notequal(_aq_, cst_Nan)) + if(caml_string_notequal(_aq_, cst_Normal)) + if(caml_string_notequal(_aq_, cst_Subnormal)){ + if(! caml_string_notequal(_aq_, cst_Zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + switch(switch$0){ + case 1: + return 0; + case 2: + return 1; + case 3: + return 2; + case 4: + return 3; + case 5: + return 4; + } + } + else{ + var _as_ = sexp_007[1]; + if(! _as_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_006, sexp_007); + var _at_ = _as_[1]; + if(0 !== _at_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_006, sexp_007); + var + _au_ = _at_[1], + _av_ = caml_string_compare(_au_, cst_infinite), + switch$1 = 0; + if(0 <= _av_){ + if(0 < _av_) + if(caml_string_notequal(_au_, cst_nan$1)) + if(caml_string_notequal(_au_, cst_normal)) + if(caml_string_notequal(_au_, cst_subnormal)) + if(caml_string_notequal(_au_, cst_zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + } + else if(caml_string_notequal(_au_, cst_Infinite)) + if(caml_string_notequal(_au_, cst_Nan)) + if(caml_string_notequal(_au_, cst_Normal)) + if(caml_string_notequal(_au_, cst_Subnormal)) + if(caml_string_notequal(_au_, cst_Zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + switch(switch$1){ + case 0: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 1: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 2: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 3: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 4: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_006, sexp_007); + } + function sexp_of_t$0(param){ + switch(param){ + case 0: + return _r_; + case 1: + return _s_; + case 2: + return _t_; + case 3: + return _u_; + default: return _v_; + } + } + function to_string$0(t){ + var _ap_ = sexp_of_t$0(t); + return caml_call1(Base_Import[163], _ap_); + } + function of_string$0(s){ + return t_of_sexp$0(caml_call1(Base_Import[139], s)); + } + function classify(t){ + switch(caml_call1(classify_float, t)){ + case 0: + return 2; + case 1: + return 3; + case 2: + return 4; + case 3: + return 0; + default: return 1; + } + } + function insert_underscores(opt, _am_, string){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + if(_am_) var sth$0 = _am_[1], strip_zero = sth$0; else var strip_zero = 0; + var match = caml_call2(Base_String[84], string, 46); + if(! match) + return caml_call2(Base_Int_conversions[37], string, delimiter); + var + match$0 = match[1], + right = match$0[2], + left = match$0[1], + left$0 = caml_call2(Base_Int_conversions[37], left, delimiter); + if(strip_zero) + var + _an_ = [0, function(c){return caml_call2(Base_Char[11], c, 48);}], + right$0 = caml_call2(Base_String[92], _an_, right); + else + var right$0 = right; + if(! caml_string_notequal(right$0, cst$4)) return left$0; + var _ao_ = caml_call2(Base_Import[112], cst$0, right$0); + return caml_call2(Base_Import[112], left$0, _ao_); + } + function to_string_hum(delimiter, opt, strip_zero, _al_, f){ + if(opt) var sth = opt[1], decimals = sth; else var decimals = 3; + if(_al_) + var sth$0 = _al_[1], explicit_plus = sth$0; + else + var explicit_plus = 0; + if(decimals < 0) caml_call3(Base_Printf[7], _w_, decimals, 0); + var match = classify(f); + if(1 === match) return cst_nan; + if(! match) + return caml_call2(Base_Import[108][5], f, 0.) ? cst_inf : cst_inf$0; + var + s = + explicit_plus + ? caml_call3(Base_Printf[2], _x_, decimals, f) + : caml_call3(Base_Printf[2], _y_, decimals, f); + return insert_underscores(delimiter, strip_zero, s); + } + function sexp_of_t$1(t){ + var sexp = caml_call1(sexp_of_t, t); + if(1009018843 <= Base_Sexp[18][1]) return sexp; + if(0 === sexp[0]){ + var string = sexp[1]; + return caml_call4(Base_String[56], 0, 0, string, 69) + ? sexp + : [0, insert_underscores(0, 0, string)]; + } + var _ak_ = [0, [0, cst_sexp, caml_call1(Base_Sexp[4], sexp)], 0]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_sexp_of_float_produced_str, _ak_)); + } + function to_padded_compact_string_custo + (t, opt, kilo, mega, giga, tera, peta, param){ + if(opt) var sth = opt[1], prefix = sth; else var prefix = cst$2; + var match = classify(t); + if(1 === match) return cst_nan$0; + if(! match) + return caml_call2(Base_Import[108][1], t, 0.) ? cst_inf$1 : cst_inf$2; + function go(t){ + function conv(mag, numerator, denominator){ + var switch$0 = 0; + if + (caml_call2(Base_Import[108][4], denominator, 100.) + && caml_call2(Base_Import[108][6], numerator, 999.95)) + switch$0 = 1; + if(! switch$0){ + var switch$1 = 0; + if(caml_call2(Base_Import[108][6], denominator, 100000.)){ + var + _aj_ = + round_nearest(caml_call2(Base_Import[90], denominator, 9.9995)); + if(caml_call2(Base_Import[108][6], numerator, _aj_)) switch$1 = 1; + } + if(! switch$1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + } + var + _ai_ = round_nearest(caml_call2(Base_Import[90], denominator, 9999.5)); + if(! caml_call2(Base_Import[108][1], numerator, _ai_)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var + k = + caml_call1 + (round_down, caml_call2(Base_Import[96], numerator, denominator)), + lower = caml_call2(Base_Import[90], denominator, k), + _ah_ = caml_call2(Base_Import[92], k, 1.), + higher = caml_call2(Base_Import[90], denominator, _ah_), + diff_right = caml_call2(Base_Import[94], higher, numerator), + diff_left = caml_call2(Base_Import[94], numerator, lower), + k$0 = iround_nearest_exn(k), + k$1 = + caml_call2(Base_Import[108][1], diff_right, diff_left) + ? caml_call2(Base_Import[91], k$0, 1) + : caml_call2 + (Base_Import[108][5], diff_right, diff_left) + ? k$0 + : 0 + === caml_call2(Base_Import[122], k$0, 2) + ? k$0 + : caml_call2(Base_Import[91], k$0, 1), + d = caml_call2(Base_Import[122], k$1, 10), + i = caml_call2(Base_Import[95], k$1, 10); + if(0 <= i && 1000 > i){ + if(0 <= d && 10 > d) + return 0 === d + ? caml_call4(Base_Printf[2], _C_, prefix, i, mag) + : caml_call5(Base_Printf[2], _D_, prefix, i, mag, d); + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + } + if(! caml_call2(Base_Import[108][1], t, 999.95)){ + if(caml_call2(Base_Import[108][1], t, 999950.)) + return conv(kilo, t, 100.); + if(caml_call2(Base_Import[108][1], t, 999950000.)) + return conv(mega, t, 100000.); + if(caml_call2(Base_Import[108][1], t, 999950000000.)) + return conv(giga, t, 100000000.); + if(caml_call2(Base_Import[108][1], t, 999950000000000.)) + return conv(tera, t, 100000000000.); + if(! peta) return caml_call3(Base_Printf[2], _H_, prefix, t); + var peta$0 = peta[1]; + return caml_call2(Base_Import[108][1], t, 999950000000000000.) + ? conv(peta$0, t, 100000000000000.) + : caml_call3(Base_Printf[2], _G_, prefix, t); + } + if + (caml_call2(Base_Import[108][2], 0., t) + && caml_call2(Base_Import[108][1], t, 999.95)){ + var + x = caml_call2(Base_Import[112], prefix, caml_format_float("%.1f", t)); + if(! caml_call2(Base_String[80], x, cst_0)) return x; + var + x$0 = caml_call1(Base_Bytes0[15], x), + n = runtime.caml_ml_bytes_length(x$0); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 1), 32); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 2), 32); + return caml_call1(Base_Bytes0[16], x$0); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + if(caml_call2(Base_Import[108][6], t, 0.)) return go(t); + var _ag_ = go(caml_call1(Base_Import[114], t)); + return caml_call2(Base_Import[112], cst$1, _ag_); + } + function to_padded_compact_string(t){ + return to_padded_compact_string_custo + (t, 0, cst_k, cst_m, cst_g, cst_t, _I_, 0); + } + function int_pow(x, n){ + if(0 === n) return 1.; + var + x$0 = [0, caml_call2(Base_Import[92], x, -0.)], + n$0 = [0, n], + accum = [0, 1.]; + if(n$0[1] < 0){ + x$0[1] = caml_call2(Base_Import[96], 1., x$0[1]); + n$0[1] = caml_call1(Base_Import[113], n$0[1]); + if(n$0[1] < 0){accum[1] = x$0[1]; caml_call1(Base_Import[129], n$0);} + } + for(;;){ + if(1 >= n$0[1]) return caml_call2(Base_Import[90], x$0[1], accum[1]); + if(0 !== caml_call2(Base_Import[116], n$0[1], 1)) + accum[1] = caml_call2(Base_Import[90], x$0[1], accum[1]); + x$0[1] = caml_call2(Base_Import[90], x$0[1], x$0[1]); + n$0[1] = caml_call2(Base_Import[120], n$0[1], 1); + } + } + function round_gen(x, how){ + if(caml_call2(Base_Import[108][4], x, 0.)) return 0.; + if(! is_finite(x)) return x; + if(555917426 <= how[1]) + var + sd = how[2], + _ac_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + dd = caml_call2(Base_Import[93], sd, _ac_), + dd$0 = dd, + sd$0 = sd; + else + var + dd$1 = how[2], + _af_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + sd$1 = caml_call2(Base_Import[91], dd$1, _af_), + dd$0 = dd$1, + sd$0 = sd$1; + if(0 > sd$0) return 0.; + if(17 <= sd$0) return x; + var abs_dd = caml_call1(Base_Int[73], dd$0); + if(22 >= abs_dd && 16 > sd$0){ + var order = int_pow(10., abs_dd); + if(0 <= dd$0){ + var + _ad_ = + round_nearest_half_to_even(caml_call2(Base_Import[90], x, order)); + return caml_call2(Base_Import[96], _ad_, order); + } + var + _ae_ = round_nearest_half_to_even(caml_call2(Base_Import[96], x, order)); + return caml_call2(Base_Import[90], _ae_, order); + } + return of_string(caml_call3(Base_Printf[2], _J_, sd$0, x)); + } + function round_significant(x, significant_digits){ + return 0 < significant_digits + ? round_gen(x, [0, 555917426, significant_digits]) + : caml_call3(Base_Printf[7], _K_, significant_digits, 0); + } + function round_decimal(x, decimal_digits){ + return round_gen(x, [0, -352548012, decimal_digits]); + } + function between(t, low, high){ + var _ab_ = caml_call2(Base_Import[108][2], low, t); + return _ab_ ? caml_call2(Base_Import[108][2], t, high) : _ab_; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return caml_call3(clamp_unchecked, t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + } + function clamp(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return [0, caml_call3(clamp_unchecked, t, min, max)]; + var + ___ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _$_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], ___], + _aa_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _$_); + return caml_call1(Base_Or_error[35], _aa_); + } + var + symbol$1 = Base_Import[92], + symbol$2 = Base_Import[94], + symbol$3 = Base_Import[90], + symbol$4 = Base_Import[96], + symbol$5 = Base_Import[114]; + function sign_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)) return 2; + if(caml_call2(Base_Import[108][1], t, 0.)) return 0; + if(caml_call2(Base_Import[108][4], t, 0.)) return 1; + var + _Y_ = [0, [0, cst$3, sexp_of_t$1(t)], 0], + _Z_ = caml_call2(Base_Sexp[9], cst_Float_sign_exn_of_NAN, _Y_); + return caml_call1(Base_Error[30], _Z_); + } + function sign_or_nan(t){ + return caml_call2(Base_Import[108][5], t, 0.) + ? 2 + : caml_call2 + (Base_Import[108][1], t, 0.) + ? 0 + : caml_call2(Base_Import[108][4], t, 0.) ? 1 : 3; + } + function ieee_negative(t){ + var bits = caml_int64_bits_of_float(t); + return runtime.caml_lessthan(bits, Stdlib_Int64[1]); + } + var + _M_ = Base_Int64[32], + exponent_mask64 = + runtime.caml_int64_sub + (caml_call2(Base_Int64[48], Base_Int64[32], 11), _M_), + exponent_mask = caml_call1(Base_Int64[5], exponent_mask64), + _N_ = Base_Int63[39], + _O_ = caml_call2(Base_Int63[72], Base_Int63[39], 52), + mantissa_mask = caml_call2(Base_Int63[42], _O_, _N_), + mantissa_mask64 = caml_call1(Base_Int63[79], mantissa_mask), + mantissa_bits = 52; + function ieee_exponent(t){ + var + bits = caml_int64_bits_of_float(t), + _X_ = caml_call2(Base_Int64[62], bits, mantissa_bits); + return runtime.caml_int64_to_int32 + (caml_call2(Base_Int64[43], _X_, exponent_mask64)); + } + function ieee_mantissa(t){ + var bits = caml_int64_bits_of_float(t); + return caml_call1 + (Base_Int63[78], runtime.caml_int64_and(bits, mantissa_mask64)); + } + function create_ieee_exn(negative, exponent, mantissa){ + if(caml_call2(Base_Int[43], exponent, exponent_mask) !== exponent) + return caml_call4(Base_Printf[6], _P_, exponent, exponent_mask, 0); + var _U_ = caml_call2(Base_Int63[67], mantissa, mantissa_mask); + if(caml_call2(Base_Int63[17], _U_, mantissa)){ + var + _V_ = caml_call1(Base_Int63[11], mantissa_mask), + _W_ = caml_call1(Base_Int63[11], mantissa); + return caml_call4(Base_Printf[6], _Q_, _W_, _V_, 0); + } + var + sign_bits = negative ? Stdlib_Int64[10] : Stdlib_Int64[1], + expt_bits = + runtime.caml_int64_shift_left + (runtime.caml_int64_of_int32(exponent), 52), + mant_bits = caml_call1(Base_Int63[79], mantissa), + bits = caml_int64_or(sign_bits, caml_int64_or(expt_bits, mant_bits)); + return runtime.caml_int64_float_of_bits(bits); + } + function create_ieee(negative, exponent, mantissa){ + function _T_(param){return create_ieee_exn(negative, exponent, mantissa);} + return caml_call2(Base_Or_error[28], 0, _T_); + } + function to_string$1(x){return caml_call2(Base_Printf[2], _R_, x);} + function sexp_of_t$2(x){return [0, to_string$1(x)];} + function of_string$1(x){return of_string(x);} + var + include$0 = + caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + sign = include$0[5]; + function is_positive(t){return caml_call2(Base_Import[108][5], t, 0.);} + function is_non_negative(t){return caml_call2(Base_Import[108][6], t, 0.);} + function is_negative(t){return caml_call2(Base_Import[108][1], t, 0.);} + function is_non_positive(t){return caml_call2(Base_Import[108][2], t, 0.);} + var + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$1[1], + _S_ = Base_Import[108], + symbol$6 = _S_[3], + symbol$7 = _S_[1], + symbol$8 = _S_[5], + symbol$9 = _S_[4], + symbol$10 = _S_[2], + symbol$11 = _S_[6]; + function of_float$0(x){return x;} + var + specialized_hash = Base_Import[224], + Private = + [0, + box, + clamp_unchecked, + lower_bound_for_int, + upper_bound_for_int, + specialized_hash, + one_ulp_less_than_half, + int63_round_nearest_portable_a, + int63_round_nearest_arch64_noa, + iround_nearest_exn_64], + include$2 = Base_Import[108], + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + symbol$15 = include$2[4], + symbol$16 = include$2[5], + symbol$17 = include$2[6], + ascending = include$2[7], + descending = include$2[8], + compare$2 = include$2[9], + equal = include$2[10]; + function min(x, y){ + if(! caml_call2(symbol$12, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + function max(x, y){ + if(! caml_call2(symbol$16, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + var + Base_Float = + [0, + t_sexp_grammar, + of_float, + to_float, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + symbol$17, + symbol$13, + symbol$15, + symbol$16, + symbol$12, + symbol$14, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + invariant, + nan, + max_value, + neg_infinity, + max_value, + neg_infinity, + zero, + one, + minus_one, + pi, + sqrt_pi, + sqrt_2pi, + euler, + epsilon_float, + max_finite_value, + min_positive_subnormal_value, + min_positive_normal_value, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + of_int, + to_int, + of_int63, + of_int64, + to_int64, + round, + iround, + iround_exn, + round_towards_zero, + round_down, + round_up, + round_nearest, + round_nearest_half_to_even, + iround_towards_zero, + iround_down, + iround_up, + iround_nearest_64$0, + iround_towards_zero_exn, + iround_down_exn, + iround_up_exn, + iround_nearest_exn, + int63_round_down_exn, + int63_round_up_exn, + int63_round_nearest_exn, + iround_lbound, + iround_ubound, + int63_round_lbound, + int63_round_ubound, + round_significant, + round_decimal, + is_nan, + is_inf, + is_finite, + is_integer, + min_inan, + max_inan, + symbol$1, + symbol$2, + symbol$4, + symbol$0, + symbol$3, + symbol, + symbol$5, + [0, fractional, integral], + modf, + mod_float, + add, + sub, + neg, + scale, + abs_float, + [0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$0, + symbol, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs_float, + neg, + zero, + of_int, + of_float$0], + [0, symbol$1, symbol$2, symbol$3, symbol$4, symbol$0, symbol, symbol$5], + to_string, + to_string_hum, + to_padded_compact_string, + to_padded_compact_string_custo, + int_pow, + square, + ldexp, + frexp, + [0, + compare$1, + all, + t_of_sexp$0, + sexp_of_t$0, + t_sexp_grammar$0, + of_string$0, + to_string$0], + classify, + sign, + sign_exn, + sign_or_nan, + create_ieee, + create_ieee_exn, + ieee_negative, + ieee_exponent, + ieee_mantissa, + [0, t_of_sexp, sexp_of_t$2, t_sexp_grammar, of_string$1, to_string$1], + Private]; + runtime.caml_register_global(191, Base_Float, "Base__Float"); + return; + } + (globalThis)); + +//# 36069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + elided_message = "", + Base_Exn = global_data.Base__Exn, + Base_Sys0 = global_data.Base__Sys0, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int = global_data.Base__Int, + elide = [0, 0], + cst_b = "b", + cst_OCAMLRUNPARAM = "OCAMLRUNPARAM"; + function get(opt, param){ + if(opt) + var sth = opt[1], at_most_num_frames = sth; + else + var at_most_num_frames = Base_Int[60]; + return runtime.caml_get_current_callstack(at_most_num_frames); + } + function to_string(t){ + return elide[1] ? elided_message : caml_call1(Stdlib_Printexc[14], t); + } + function to_string_list(t){ + var _i_ = to_string(t); + return caml_call1(Base_String[88], _i_); + } + function sexp_of_t(t){ + function _g_(x){return [0, x];} + var _h_ = to_string_list(t); + return [1, caml_call2(Base_List[76], _h_, _g_)]; + } + var set_recording = Stdlib_Printexc[7], am_recording = Stdlib_Printexc[8]; + function most_recent(param){return caml_call1(Stdlib_Printexc[12], 0);} + function most_recent_for_exn(exn){ + return caml_call1(Base_Exn[18], exn) ? [0, most_recent(0)] : 0; + } + function with_recording(b, f){ + var saved = caml_call1(am_recording, 0); + caml_call1(set_recording, b); + function _f_(param){return caml_call1(set_recording, saved);} + return caml_call2(Base_Exn[13], f, _f_); + } + function initialize_module(param){ + var match = caml_call1(Base_Sys0[20], cst_OCAMLRUNPARAM); + if(match) + var + x = match[1], + _a_ = Base_String[81], + _b_ = function(_e_){return caml_call2(_a_, _e_, cst_b);}, + _c_ = caml_call2(Base_String[86], x, 44), + ocamlrunparam_mentions_backtra = caml_call2(Base_List[13], _c_, _b_); + else + var ocamlrunparam_mentions_backtra = 0; + var _d_ = 1 - ocamlrunparam_mentions_backtra; + return _d_ ? caml_call1(set_recording, 1) : _d_; + } + var + Base_Backtrace = + [0, + sexp_of_t, + get, + to_string, + to_string_list, + elide, + [0, + am_recording, + set_recording, + with_recording, + most_recent, + most_recent_for_exn], + initialize_module]; + runtime.caml_register_global(9, Base_Backtrace, "Base__Backtrace"); + return; + } + (globalThis)); + +//# 36161 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ref = global_data.Base__Ref, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Array = global_data.Base__Array, + Shadow_stdlib = global_data.Shadow_stdlib, + Base_Sexp_with_comparable = global_data.Base__Sexp_with_comparable, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Char = global_data.Base__Char, + Base_Exn = global_data.Base__Exn, + Base_Float = global_data.Base__Float, + Base_Int = global_data.Base__Int, + Base_Int32 = global_data.Base__Int32, + Base_Int64 = global_data.Base__Int64, + Base_Nativeint = global_data.Base__Nativeint, + Base_String = global_data.Base__String, + Base_Bytes = global_data.Base__Bytes, + Base_Unit = global_data.Base__Unit, + Base_Error = global_data.Base__Error, + Base_Container_intf = global_data.Base__Container_intf, + Base_Backtrace = global_data.Base__Backtrace, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + hash_fold_t = Base_Sexp_with_comparable[1], + hash = Base_Sexp_with_comparable[2], + t_of_sexp = Base_Sexp_with_comparable[3], + sexp_of_t = Base_Sexp_with_comparable[4], + Not_found_s = Base_Sexp_with_comparable[5], + Of_sexp_error = Base_Sexp_with_comparable[6], + message = Base_Sexp_with_comparable[7], + default_indent = Base_Sexp_with_comparable[8], + pp_hum = Base_Sexp_with_comparable[9], + pp_hum_indent = Base_Sexp_with_comparable[10], + pp_mach = Base_Sexp_with_comparable[11], + pp = Base_Sexp_with_comparable[12], + to_string_hum = Base_Sexp_with_comparable[13], + to_string_mach = Base_Sexp_with_comparable[14], + to_string = Base_Sexp_with_comparable[15], + of_float_style = Base_Sexp_with_comparable[16], + of_int_style = Base_Sexp_with_comparable[17], + t_sexp_grammar = Base_Sexp_with_comparable[18], + invariant = Base_Sexp_with_comparable[19], + of_string = Base_Sexp_with_comparable[20], + symbol$0 = Base_Sexp_with_comparable[21], + symbol$1 = Base_Sexp_with_comparable[22], + symbol$2 = Base_Sexp_with_comparable[23], + symbol$3 = Base_Sexp_with_comparable[24], + symbol$4 = Base_Sexp_with_comparable[25], + symbol$5 = Base_Sexp_with_comparable[26], + equal = Base_Sexp_with_comparable[27], + compare = Base_Sexp_with_comparable[28], + min = Base_Sexp_with_comparable[29], + max = Base_Sexp_with_comparable[30], + ascending = Base_Sexp_with_comparable[31], + descending = Base_Sexp_with_comparable[32], + between = Base_Sexp_with_comparable[33], + clamp_exn = Base_Sexp_with_comparable[34], + clamp = Base_Sexp_with_comparable[35], + comparator = Base_Sexp_with_comparable[36], + Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator], + am_testing = Base_Import[132], + Exported_for_specific_uses = [0, am_testing], + compare_array = Base_Array[1], + equal_array = Base_Array[100], + array_of_sexp = Base_Array[2], + sexp_of_array = Base_Array[3]; + function array_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Array[4], a_sexp_grammar); + } + var + compare_bool = Base_Bool[16], + equal_bool = Base_Bool[15], + hash_fold_bool = Base_Bool[3], + func = Base_Bool[4]; + function hash_bool(x){return caml_call1(func, x);} + var + bool_of_sexp = Base_Bool[5], + sexp_of_bool = Base_Bool[6], + bool_sexp_grammar = Base_Bool[2], + compare_char = Base_Char[16], + equal_char = Base_Char[15], + hash_fold_char = Base_Char[3], + func$0 = Base_Char[4]; + function hash_char(x){return caml_call1(func$0, x);} + var + char_of_sexp = Base_Char[5], + sexp_of_char = Base_Char[6], + char_sexp_grammar = Base_Char[2], + sexp_of_exn = Base_Exn[1], + compare_float = Base_Float[16], + equal_float = Base_Float[15], + hash_fold_float = Base_Float[4], + func$1 = Base_Float[5]; + function hash_float(x){return caml_call1(func$1, x);} + var + float_of_sexp = Base_Float[6], + sexp_of_float = Base_Float[7], + float_sexp_grammar = Base_Float[1], + compare_int = Base_Int[13], + equal_int = Base_Int[12], + hash_fold_int = Base_Int[6], + func$2 = Base_Int[7]; + function hash_int(x){return caml_call1(func$2, x);} + var + int_of_sexp = Base_Int[8], + sexp_of_int = Base_Int[9], + int_sexp_grammar = Base_Int[1], + compare_int32 = Base_Int32[19], + equal_int32 = Base_Int32[18], + hash_fold_int32 = Base_Int32[6], + func$3 = Base_Int32[7]; + function hash_int32(x){return caml_call1(func$3, x);} + var + int32_of_sexp = Base_Int32[8], + sexp_of_int32 = Base_Int32[9], + int32_sexp_grammar = Base_Int32[1], + compare_int64 = Base_Int64[13], + equal_int64 = Base_Int64[12], + hash_fold_int64 = Base_Int64[6], + func$4 = Base_Int64[7]; + function hash_int64(x){return caml_call1(func$4, x);} + var + int64_of_sexp = Base_Int64[8], + sexp_of_int64 = Base_Int64[9], + int64_sexp_grammar = Base_Int64[1], + compare_list = Base_List[1], + equal_list = Base_List[147], + hash_fold_list = Base_List[2], + list_of_sexp = Base_List[3], + sexp_of_list = Base_List[4]; + function list_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_List[5], a_sexp_grammar); + } + var + compare_nativeint = Base_Nativeint[19], + equal_nativeint = Base_Nativeint[18], + hash_fold_nativeint = Base_Nativeint[6], + func$5 = Base_Nativeint[7]; + function hash_nativeint(x){return caml_call1(func$5, x);} + var + nativeint_of_sexp = Base_Nativeint[8], + sexp_of_nativeint = Base_Nativeint[9], + nativeint_sexp_grammar = Base_Nativeint[1], + compare_option = Base_Option[1], + equal_option = Base_Option[4], + hash_fold_option = Base_Option[2], + option_of_sexp = Base_Option[6], + sexp_of_option = Base_Option[7]; + function option_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Option[3], a_sexp_grammar); + } + var + compare_ref = Base_Ref[1], + equal_ref = Base_Ref[2], + ref_of_sexp = Base_Ref[3], + sexp_of_ref = Base_Ref[4]; + function ref_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Ref[5], a_sexp_grammar); + } + var + compare_string = Base_String[37], + equal_string = Base_String[121], + hash_fold_string = Base_String[26]; + function hash_string(x){return runtime.Base_hash_string(x);} + var + string_of_sexp = Base_String[27], + sexp_of_string = Base_String[28], + string_sexp_grammar = Base_String[1], + compare_bytes = Base_Bytes[16], + equal_bytes = Base_Bytes[15], + bytes_of_sexp = Base_Bytes[1], + sexp_of_bytes = Base_Bytes[2], + bytes_sexp_grammar = Base_Bytes[3], + compare_unit = Base_Unit[16], + equal_unit = Base_Unit[15], + hash_fold_unit = Base_Unit[3], + func$6 = Base_Unit[4]; + function hash_unit(x){return caml_call1(func$6, x);} + var + unit_of_sexp = Base_Unit[5], + sexp_of_unit = Base_Unit[6], + unit_sexp_grammar = Base_Unit[2], + symbol$6 = Base_List[148][1], + _a_ = Base_Int[70], + symbol$7 = _a_[1], + lnot = _a_[2], + abs = _a_[3], + zero = _a_[4], + symbol$8 = _a_[5], + symbol$9 = _a_[6], + symbol$10 = _a_[7], + _b_ = Base_Import[97], + ascending$0 = _b_[1], + descending$0 = _b_[2], + max$0 = _b_[3], + min$0 = _b_[4], + include = Base_Float[104], + symbol$11 = include[1], + symbol$12 = include[2], + symbol$13 = include[3], + symbol$14 = include[4], + symbol$15 = include[5], + symbol$16 = include[6], + symbol$17 = include[7], + symbol$18 = Base_String[53], + fst = Base_Import[125], + snd = Base_Import[127], + failwith = Base_Import[124], + invalid_arg = Base_Import[126], + raise_s = Base_Error[30], + phys_equal = Base_Import[128], + Export = + [0, + compare_array, + equal_array, + array_of_sexp, + sexp_of_array, + array_sexp_grammar, + compare_bool, + equal_bool, + hash_fold_bool, + hash_bool, + bool_of_sexp, + sexp_of_bool, + bool_sexp_grammar, + compare_char, + equal_char, + hash_fold_char, + hash_char, + char_of_sexp, + sexp_of_char, + char_sexp_grammar, + sexp_of_exn, + compare_float, + equal_float, + hash_fold_float, + hash_float, + float_of_sexp, + sexp_of_float, + float_sexp_grammar, + compare_int, + equal_int, + hash_fold_int, + hash_int, + int_of_sexp, + sexp_of_int, + int_sexp_grammar, + compare_int32, + equal_int32, + hash_fold_int32, + hash_int32, + int32_of_sexp, + sexp_of_int32, + int32_sexp_grammar, + compare_int64, + equal_int64, + hash_fold_int64, + hash_int64, + int64_of_sexp, + sexp_of_int64, + int64_sexp_grammar, + compare_list, + equal_list, + hash_fold_list, + list_of_sexp, + sexp_of_list, + list_sexp_grammar, + compare_nativeint, + equal_nativeint, + hash_fold_nativeint, + hash_nativeint, + nativeint_of_sexp, + sexp_of_nativeint, + nativeint_sexp_grammar, + compare_option, + equal_option, + hash_fold_option, + option_of_sexp, + sexp_of_option, + option_sexp_grammar, + compare_ref, + equal_ref, + ref_of_sexp, + sexp_of_ref, + ref_sexp_grammar, + compare_string, + equal_string, + hash_fold_string, + hash_string, + string_of_sexp, + sexp_of_string, + string_sexp_grammar, + compare_bytes, + equal_bytes, + bytes_of_sexp, + sexp_of_bytes, + bytes_sexp_grammar, + compare_unit, + equal_unit, + hash_fold_unit, + hash_unit, + unit_of_sexp, + sexp_of_unit, + unit_sexp_grammar, + symbol$6, + symbol$7, + lnot, + abs, + zero, + symbol$8, + symbol$9, + symbol$10, + ascending$0, + descending$0, + max$0, + min$0, + symbol$11, + symbol$12, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + fst, + snd, + failwith, + invalid_arg, + raise_s, + phys_equal], + compare_array$0 = Export[1], + equal_array$0 = Export[2], + array_of_sexp$0 = Export[3], + sexp_of_array$0 = Export[4], + array_sexp_grammar$0 = Export[5], + compare_bool$0 = Export[6], + equal_bool$0 = Export[7], + hash_fold_bool$0 = Export[8], + hash_bool$0 = Export[9], + bool_of_sexp$0 = Export[10], + sexp_of_bool$0 = Export[11], + bool_sexp_grammar$0 = Export[12], + compare_char$0 = Export[13], + equal_char$0 = Export[14], + hash_fold_char$0 = Export[15], + hash_char$0 = Export[16], + char_of_sexp$0 = Export[17], + sexp_of_char$0 = Export[18], + char_sexp_grammar$0 = Export[19], + sexp_of_exn$0 = Export[20], + compare_float$0 = Export[21], + equal_float$0 = Export[22], + hash_fold_float$0 = Export[23], + hash_float$0 = Export[24], + float_of_sexp$0 = Export[25], + sexp_of_float$0 = Export[26], + float_sexp_grammar$0 = Export[27], + compare_int$0 = Export[28], + equal_int$0 = Export[29], + hash_fold_int$0 = Export[30], + hash_int$0 = Export[31], + int_of_sexp$0 = Export[32], + sexp_of_int$0 = Export[33], + int_sexp_grammar$0 = Export[34], + compare_int32$0 = Export[35], + equal_int32$0 = Export[36], + hash_fold_int32$0 = Export[37], + hash_int32$0 = Export[38], + int32_of_sexp$0 = Export[39], + sexp_of_int32$0 = Export[40], + int32_sexp_grammar$0 = Export[41], + compare_int64$0 = Export[42], + equal_int64$0 = Export[43], + hash_fold_int64$0 = Export[44], + hash_int64$0 = Export[45], + int64_of_sexp$0 = Export[46], + sexp_of_int64$0 = Export[47], + int64_sexp_grammar$0 = Export[48], + compare_list$0 = Export[49], + equal_list$0 = Export[50], + hash_fold_list$0 = Export[51], + list_of_sexp$0 = Export[52], + sexp_of_list$0 = Export[53], + list_sexp_grammar$0 = Export[54], + compare_nativeint$0 = Export[55], + equal_nativeint$0 = Export[56], + hash_fold_nativeint$0 = Export[57], + hash_nativeint$0 = Export[58], + nativeint_of_sexp$0 = Export[59], + sexp_of_nativeint$0 = Export[60], + nativeint_sexp_grammar$0 = Export[61], + compare_option$0 = Export[62], + equal_option$0 = Export[63], + hash_fold_option$0 = Export[64], + option_of_sexp$0 = Export[65], + sexp_of_option$0 = Export[66], + option_sexp_grammar$0 = Export[67], + compare_ref$0 = Export[68], + equal_ref$0 = Export[69], + ref_of_sexp$0 = Export[70], + sexp_of_ref$0 = Export[71], + ref_sexp_grammar$0 = Export[72], + compare_string$0 = Export[73], + equal_string$0 = Export[74], + hash_fold_string$0 = Export[75], + hash_string$0 = Export[76], + string_of_sexp$0 = Export[77], + sexp_of_string$0 = Export[78], + string_sexp_grammar$0 = Export[79], + compare_bytes$0 = Export[80], + equal_bytes$0 = Export[81], + bytes_of_sexp$0 = Export[82], + sexp_of_bytes$0 = Export[83], + bytes_sexp_grammar$0 = Export[84], + compare_unit$0 = Export[85], + equal_unit$0 = Export[86], + hash_fold_unit$0 = Export[87], + hash_unit$0 = Export[88], + unit_of_sexp$0 = Export[89], + sexp_of_unit$0 = Export[90], + unit_sexp_grammar$0 = Export[91], + symbol$19 = Export[92], + symbol$20 = Export[93], + lnot$0 = Export[94], + abs$0 = Export[95], + zero$0 = Export[96], + symbol$21 = Export[97], + symbol$22 = Export[98], + symbol$23 = Export[99], + ascending$1 = Export[100], + descending$1 = Export[101], + max$1 = Export[102], + min$1 = Export[103], + symbol$24 = Export[104], + symbol$25 = Export[105], + symbol$26 = Export[106], + symbol$27 = Export[107], + symbol$28 = Export[108], + symbol$29 = Export[109], + symbol$30 = Export[110], + symbol$31 = Export[111], + fst$0 = Export[112], + snd$0 = Export[113], + failwith$0 = Export[114], + invalid_arg$0 = Export[115], + raise_s$0 = Export[116], + phys_equal$0 = Export[117], + include$0 = Base_Container_intf[1], + Continue_or_stop = include$0[1], + Not_found_s$0 = Base_Import[252]; + caml_call1(Base_Backtrace[7], 0); + var + Base = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Sexp, + Exported_for_specific_uses, + Export, + compare_array$0, + equal_array$0, + array_of_sexp$0, + sexp_of_array$0, + array_sexp_grammar$0, + compare_bool$0, + equal_bool$0, + hash_fold_bool$0, + hash_bool$0, + bool_of_sexp$0, + sexp_of_bool$0, + bool_sexp_grammar$0, + compare_char$0, + equal_char$0, + hash_fold_char$0, + hash_char$0, + char_of_sexp$0, + sexp_of_char$0, + char_sexp_grammar$0, + sexp_of_exn$0, + compare_float$0, + equal_float$0, + hash_fold_float$0, + hash_float$0, + float_of_sexp$0, + sexp_of_float$0, + float_sexp_grammar$0, + compare_int$0, + equal_int$0, + hash_fold_int$0, + hash_int$0, + int_of_sexp$0, + sexp_of_int$0, + int_sexp_grammar$0, + compare_int32$0, + equal_int32$0, + hash_fold_int32$0, + hash_int32$0, + int32_of_sexp$0, + sexp_of_int32$0, + int32_sexp_grammar$0, + compare_int64$0, + equal_int64$0, + hash_fold_int64$0, + hash_int64$0, + int64_of_sexp$0, + sexp_of_int64$0, + int64_sexp_grammar$0, + compare_list$0, + equal_list$0, + hash_fold_list$0, + list_of_sexp$0, + sexp_of_list$0, + list_sexp_grammar$0, + compare_nativeint$0, + equal_nativeint$0, + hash_fold_nativeint$0, + hash_nativeint$0, + nativeint_of_sexp$0, + sexp_of_nativeint$0, + nativeint_sexp_grammar$0, + compare_option$0, + equal_option$0, + hash_fold_option$0, + option_of_sexp$0, + sexp_of_option$0, + option_sexp_grammar$0, + compare_ref$0, + equal_ref$0, + ref_of_sexp$0, + sexp_of_ref$0, + ref_sexp_grammar$0, + compare_string$0, + equal_string$0, + hash_fold_string$0, + hash_string$0, + string_of_sexp$0, + sexp_of_string$0, + string_sexp_grammar$0, + compare_bytes$0, + equal_bytes$0, + bytes_of_sexp$0, + sexp_of_bytes$0, + bytes_sexp_grammar$0, + compare_unit$0, + equal_unit$0, + hash_fold_unit$0, + hash_unit$0, + unit_of_sexp$0, + sexp_of_unit$0, + unit_sexp_grammar$0, + symbol$19, + symbol$20, + lnot$0, + abs$0, + zero$0, + symbol$21, + symbol$22, + symbol$23, + ascending$1, + descending$1, + max$1, + min$1, + symbol$24, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + symbol$31, + fst$0, + snd$0, + failwith$0, + invalid_arg$0, + raise_s$0, + phys_equal$0, + Continue_or_stop, + Not_found_s$0]; + runtime.caml_register_global(21, Base, "Base"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/jane-street-headers/jane_street_headers.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_sexp_conv.runtime-lib/ppx_sexp_conv_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_compare.runtime-lib/ppx_compare_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_enumerate.runtime-lib/ppx_enumerate_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_hash.runtime-lib/ppx_hash_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/time_now/time_now.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/time_now/time_now.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Int63 = global_data.Base__Int63, + Base = global_data.Base, + cst_gettimeofday_failed = "gettimeofday failed"; + function nanoseconds_since_unix_epoch(param){ + var t = runtime.time_now_nanoseconds_since_unix_epoch_or_zero(0); + return caml_call2(Base_Int63[17], t, Base_Int63[38]) + ? t + : caml_call1(Base[201], cst_gettimeofday_failed); + } + var Time_now = [0, nanoseconds_since_unix_epoch]; + runtime.caml_register_global(3, Time_now, "Time_now"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$13 = "", + cst$14 = "\n", + cst$15 = " ", + cst_line = " , line ", + cst_File = " File ", + cst_threw = " threw", + cst_s$0 = "%s", + cst_s = "%s%!", + cst$12 = ".\n", + cst_Ppx_inline_test_lib_Runtim$0 = "Ppx_inline_test_lib__Runtime", + cst_TES = "TES", + cst_TESTING_FRAMEWORK = "TESTING_FRAMEWORK", + cst_T_MODULE_at$0 = "T_MODULE at ", + cst_T_MODULES = "T_MODULES", + cst_inline_test_runner$0 = "inline-test-runner", + cst_inline_tests_log$0 = "inline_tests.log", + cst_ppx_inline_test_error_the_ = + "ppx_inline_test error: the following -only-test flags matched nothing:", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_equal = runtime.caml_string_equal, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$11 = cst$13, + cst$9 = cst$14, + cst$10 = cst$15, + cst$7 = cst$14, + cst$8 = cst$15, + cst$5 = cst$14, + cst$6 = " ", + cst$3 = cst$14, + cst$4 = cst$13, + cst$2 = ".", + cst$0 = cst$13, + cst$1 = ": ", + enable_everything = [0, 0, 0], + cst = cst$13, + am_running_inline_test_env_var = cst_TESTING_FRAMEWORK, + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Filename = global_data.Stdlib__Filename, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_String = global_data.Stdlib__String, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Result = global_data.Stdlib__Result, + Base = global_data.Base, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Random = global_data.Stdlib__Random, + Base_Random = global_data.Base__Random, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int63 = global_data.Base__Int63, + Time_now = global_data.Time_now, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Array = global_data.Stdlib__Array, + _E_ = [0, [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, 0]]]], " %s:%d"], + _F_ = [0, [12, 32, [2, 0, 0]], " %s"], + _z_ = + [0, + [11, + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n", + [10, 0]], + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n%!"], + _A_ = + [0, + [11, + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n", + [10, 0]], + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n%!"], + _B_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + _C_ = + [0, + [4, + 0, + 0, + 0, + [11, + " tests ran, ", + [4, 0, 0, 0, [11, " test_modules ran\n", [10, 0]]]]], + "%d tests ran, %d test_modules ran\n%!"], + _D_ = + [0, + [11, cst_ppx_inline_test_error_the_, 0], + cst_ppx_inline_test_error_the_], + _G_ = [0, [11, cst$12, [10, 0]], ".\n%!"], + _H_ = + [0, + [11, "ppx_inline_test error: no tests have been run.\n", [10, 0]], + "ppx_inline_test error: no tests have been run.\n%!"], + _J_ = [0, [11, cst_T_MODULES, 0], cst_T_MODULES], + _K_ = [0, [11, ", ", [4, 0, 0, 0, [11, " TES", 0]]], ", %d TES"], + _I_ = + [0, + [11, + "FAILED ", + [4, + 0, + 0, + 0, + [11, " / ", [4, 0, 0, 0, [11, " tests", [2, 0, [12, 10, [10, 0]]]]]]]], + "FAILED %d / %d tests%s\n%!"], + _x_ = + [0, + [11, + cst_T_MODULE_at$0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]]], + "T_MODULE at %s threw%s%s.\n%s%s\n%!"], + _y_ = [0, [11, cst_TES, 0], cst_TES], + cst_ppx_inline_test_cannot_use = + "ppx_inline_test: cannot use -list-partition or -partition without specifying a partition at preprocessing time", + _r_ = [0, [2, 0, [12, 10, [2, 0, 0]]], "%s\n%s"], + _s_ = [0, [2, 0, [10, 0]], cst_s], + _t_ = [0, 1], + _u_ = + [0, + [11, " (", [8, [0, 0, 0], 0, [0, 3], [11, " sec)\n", [10, 0]]]], + " (%.3f sec)\n%!"], + _v_ = + [0, + [2, 0, [11, " is false.\n", [2, 0, [12, 10, [10, 0]]]]], + "%s is false.\n%s\n%!"], + _w_ = + [0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]], + "%s threw%s%s.\n%s%s\n%!"], + _q_ = [0, [2, 0, [10, 0]], cst_s], + _p_ = [0, [2, 0, [10, 0]], cst_s], + _o_ = [0, [12, 10, [2, 0, [12, 10, [10, 0]]]], "\n%s\n%!"], + cst_T_MODULE_at = cst_T_MODULE_at$0, + cst_in_TES = " in TES", + cst_time_without_resetting_ran = "time_without_resetting_random_seeds", + cst_Ppx_inline_test_lib_Runtim = cst_Ppx_inline_test_lib_Runtim$0, + cst_inline_tests_log = cst_inline_tests_log$0, + _S_ = + [0, + [11, + "Argument ", + [2, + 0, + [11, " doesn't fit the format filename[:line_number]\n", [10, 0]]]], + "Argument %s doesn't fit the format filename[:line_number]\n%!"], + _O_ = + [0, + [2, + 0, + [11, ": unexpected anonymous argument ", [2, 0, [12, 10, [10, 0]]]]], + "%s: unexpected anonymous argument %s\n%!"], + _h_ = + [0, + [11, + cst_File, + [3, + 0, + [11, + cst_line, + [4, + 0, + 0, + 0, + [11, + " , characters ", + [4, 0, 0, 0, [11, " - ", [4, 0, 0, 0, [12, 32, [10, 0]]]]]]]]]], + " File %S , line %d , characters %d - %d %!"], + _g_ = + [0, + [11, cst_File, [3, 0, [11, cst_line, [4, 0, 0, 0, [12, 32, [10, 0]]]]]], + " File %S , line %d %!"], + _f_ = [0, [11, cst_File, [3, 0, [12, 32, [10, 0]]]], " File %S %!"], + _e_ = + [0, + [11, + "File ", + [3, + 0, + [11, + ", line ", + [4, + 0, + 0, + 0, + [11, + ", characters ", + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [2, 0, 0]]]]]]]]], + "File %S, line %d, characters %d-%d%s"], + _a_ = [0, [2, 0, 0], cst_s$0], + _b_ = [0, [2, 0, 0], cst_s$0], + cst_success = "success", + cst_failure = "failure", + cst_error = "error", + cst_inline_test_runner = cst_inline_test_runner$0, + _N_ = + [0, + [2, 0, [12, 32, [2, 0, [12, 32, [2, 0, [11, " [args]", 0]]]]]], + "%s %s %s [args]"], + cst_Path_to_the_root_of_the_so = " Path to the root of the source tree", + cst_source_tree_root = "-source-tree-root", + cst_Allow_output_patterns_in_t = + " Allow output patterns in tests expectations", + cst_allow_output_patterns = "-allow-output-patterns", + cst_Diff_command_for_tests_tha = + " Diff command for tests that require diffing (use - to disable diffing)", + cst_diff_cmd = "-diff-cmd", + cst_Update_expect_tests_in_pla = " Update expect tests in place", + cst_in_place = "-in-place", + cst_Summarize_tests_without_us = " Summarize tests without using color", + cst_no_color = "-no-color", + cst_location_Run_only_the_test = + 'location Run only the tests specified by all the -only-test options.\n Locations can be one of these forms:\n - file.ml\n - file.ml:line_number\n - File "file.ml"\n - File "file.ml", line 23\n - File "file.ml", line 23, characters 2-3', + cst_only_test = "-only-test", + cst_substring_Only_run_tests_w = + "substring Only run tests whose names contain the given substring", + cst_matching = "-matching", + cst_tag_Only_run_tests_tagged_ = + "tag Only run tests tagged with [tag] (overrides previous -drop-tag)", + cst_require_tag = "-require-tag", + cst_tag_Only_run_tests_not_tag = + "tag Only run tests not tagged with [tag] (overrides previous -require-tag)", + cst_drop_tag = "-drop-tag", + cst_Log_the_tests_run_in_inlin = " Log the tests run in inline_tests.log", + cst_log = "-log", + cst_Show_the_number_of_tests_r = " Show the number of tests ran", + cst_show_counts = "-show-counts", + cst_End_with_an_error_if_no_te = " End with an error if no tests were run", + cst_strict = "-strict", + cst_Run_tests_only_up_to_the_f = + " Run tests only up to the first error (doesn't work for expect tests)", + cst_stop_on_error = "-stop-on-error", + cst_Show_the_tests_as_they_run = " Show the tests as they run", + cst_verbose = "-verbose", + cst_Only_run_the_tests_in_the_ = + " Only run the tests in the given partition", + cst_partition = "-partition", + cst_Lists_all_the_partitions_t = + " Lists all the partitions that contain at least one test or test_module", + cst_list_partitions = "-list-partitions", + cst_Do_not_run_tests_but_show_ = + " Do not run tests but show what would have been run", + cst_list_test_names = "-list-test-names", + _n_ = [0, 187165616, 545942154], + _L_ = [0, 187165616, -863538453]; + function to_string(param){ + switch(param){ + case 0: + return cst_success; + case 1: + return cst_failure; + default: return cst_error; + } + } + function combine(t1, t2){ + var switch$0 = 0; + switch(t1){ + case 0: + if(! t2) return 0; break; + case 1: break; + default: switch$0 = 1; + } + if(! switch$0 && 2 !== t2) return 1; + return 2; + } + function combine_all(ts){ + return caml_call3(Stdlib_List[25], combine, 0, ts); + } + var + test_modules_ran = [0, 0], + test_modules_failed = [0, 0], + tests_ran = [0, 0], + tests_failed = [0, 0], + dynamic_lib = [0, 0], + action = [0, -950194894]; + try{ + caml_sys_getenv("FORCE_DROP_INLINE_TEST"); + var _aa_ = 1, force_drop = _aa_; + } + catch(_bY_){ + var _c_ = caml_wrap_exception(_bY_); + if(_c_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_c_, 0); + var force_drop = 0; + } + function get(param){return force_drop ? -950194894 : action[1];} + var _d_ = caml_call2(Stdlib_Hashtbl[1], 0, 23), current = [0, cst]; + function found_test(param){ + var + _bW_ = caml_string_notequal(current[1], cst$13), + _bX_ = _bW_ ? 1 - caml_call2(Stdlib_Hashtbl[9], _d_, current[1]) : _bW_; + return _bX_ ? caml_call3(Stdlib_Hashtbl[5], _d_, current[1], 0) : _bX_; + } + function is_current(param){ + if(! param) return 1; + var p = param[1]; + return caml_string_equal(p, current[1]); + } + var current$0 = [0, 0]; + function current_tags(param){ + var t = current$0[1]; + function _bU_(m){return m[2];} + var _bV_ = caml_call2(Stdlib_List[19], _bU_, t); + return caml_call1(Stdlib_List[13], _bV_); + } + var + verbose = [0, 0], + strict = [0, 0], + show_counts = [0, 0], + list_test_names = [0, 0], + delayed_errors = [0, 0], + stop_on_error = [0, 0], + log = [0, 0], + time_sec = [0, 0.], + use_color = [0, 1], + in_place = [0, 0], + diff_command = [0, 0], + source_tree_root = [0, 0], + allow_output_patterns = [0, 0]; + function displayed_descr(param){ + var _bS_ = caml_obj_tag(param); + if(250 === _bS_) + var descr = param[1]; + else{ + var switch$0 = 0; + if(246 !== _bS_ && 244 !== _bS_){var descr = param; switch$0 = 1;} + if(! switch$0) var descr = caml_call1(CamlinternalLazy[2], param); + } + return function(filename, line, start_pos, end_pos){ + var + _bT_ = + caml_string_equal(descr, cst$13) + ? cst$0 + : caml_call2(Stdlib[28], cst$1, descr); + return caml_call6 + (Stdlib_Printf[4], _e_, filename, line, start_pos, end_pos, _bT_);}; + } + var + _i_ = caml_sys_argv(0), + match = caml_call1(Stdlib_Array[9], _i_), + switch$0 = 0; + if(match){ + var _j_ = match[2]; + if(_j_){ + var name = match[1]; + if(! caml_string_notequal(_j_[1], cst_inline_test_runner$0)){ + var match$0 = _j_[2]; + if(match$0){ + var rest = match$0[2], lib = match$0[1]; + if(Base[86][1]){ + var + tests = [0, 0], + list_partitions = [0, 0], + partition = [0, 0], + tag_predicate = [0, enable_everything], + name_filter = [0, 0], + msg$1 = + caml_call4 + (Stdlib_Printf[4], _N_, name, cst_inline_test_runner, lib), + f = + function(anon){ + caml_call3(Stdlib_Printf[3], _O_, name, anon); + return caml_call1(Stdlib[99], 1); + }, + _P_ = 0, + _Q_ = + [0, + [0, + cst_allow_output_patterns, + [2, allow_output_patterns], + cst_Allow_output_patterns_in_t], + [0, + [0, + cst_source_tree_root, + [4, function(s){source_tree_root[1] = [0, s]; return 0;}], + cst_Path_to_the_root_of_the_so], + _P_]], + _R_ = + [0, + [0, cst_no_color, [3, use_color], cst_Summarize_tests_without_us], + [0, + [0, cst_in_place, [2, in_place], cst_Update_expect_tests_in_pla], + [0, + [0, + cst_diff_cmd, + [4, function(s){diff_command[1] = [0, s]; return 0;}], + cst_Diff_command_for_tests_tha], + _Q_]]], + _T_ = + [0, + [0, + cst_only_test, + [4, + function(str){ + try{ + var + _bK_ = + function(file, line, start_pos, end_pos){return [0, file, [0, line]]; + }, + _bL_ = [0, caml_call3(Stdlib_Scanf[5], str, _h_, _bK_)], + match = _bL_; + } + catch(_bP_){ + try{ + var + _bI_ = function(file, line){return [0, file, [0, line]];}, + _bJ_ = [0, caml_call3(Stdlib_Scanf[5], str, _g_, _bI_)], + match = _bJ_; + } + catch(_bQ_){ + try{ + var + _bG_ = function(file){return [0, file, 0];}, + _bH_ = [0, caml_call3(Stdlib_Scanf[5], str, _f_, _bG_)], + match = _bH_; + } + catch(_bR_){var match = 0;} + } + } + if(match) + var + match$0 = match[1], + index = match$0[2], + file = match$0[1], + index$0 = index, + filename = file; + else if(caml_call2(Stdlib_String[14], str, 58)){ + var + i = caml_call2(Stdlib_String[35], str, 58), + filename$0 = caml_call3(Stdlib_String[15], str, 0, i), + index_string = + caml_call3 + (Stdlib_String[15], + str, + i + 1 | 0, + (caml_ml_string_length(str) - i | 0) - 1 | 0); + try{ + var + _bN_ = runtime.caml_int_of_string(index_string), + index$1 = _bN_; + } + catch(_bO_){ + var _bM_ = caml_wrap_exception(_bO_); + if(_bM_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bM_, 0); + caml_call2(Stdlib_Printf[3], _S_, str); + var index$1 = caml_call1(Stdlib[99], 1); + } + var index$0 = [0, index$1], filename = filename$0; + } + else + var index$0 = 0, filename = str; + tests[1] = [0, [0, filename, index$0, [0, 0]], tests[1]]; + return 0; + }], + cst_location_Run_only_the_test], + _R_], + _U_ = + [0, + [0, + cst_matching, + [4, + function(s){name_filter[1] = [0, s, name_filter[1]]; return 0;}], + cst_substring_Only_run_tests_w], + _T_], + _V_ = + [0, + [0, + cst_require_tag, + [4, + function(tag){ + var t = tag_predicate[1], _bC_ = t[2]; + function _bD_(_bF_){return caml_string_notequal(tag, _bF_);} + var _bE_ = caml_call2(Stdlib_List[41], _bD_, _bC_); + tag_predicate[1] = [0, [0, tag, t[1]], _bE_]; + return 0; + }], + cst_tag_Only_run_tests_tagged_], + _U_], + _W_ = + [0, + [0, + cst_drop_tag, + [4, + function(tag){ + var t = tag_predicate[1], _by_ = [0, tag, t[2]], _bz_ = t[1]; + function _bA_(_bB_){return caml_string_notequal(tag, _bB_);} + tag_predicate[1] = + [0, caml_call2(Stdlib_List[41], _bA_, _bz_), _by_]; + return 0; + }], + cst_tag_Only_run_tests_not_tag], + _V_], + _X_ = + [0, + [0, cst_verbose, [2, verbose], cst_Show_the_tests_as_they_run], + [0, + [0, + cst_stop_on_error, + [2, stop_on_error], + cst_Run_tests_only_up_to_the_f], + [0, + [0, cst_strict, [2, strict], cst_End_with_an_error_if_no_te], + [0, + [0, + cst_show_counts, + [2, show_counts], + cst_Show_the_number_of_tests_r], + [0, + [0, + cst_log, + [0, + function(param){ + try{runtime.caml_sys_remove(cst_inline_tests_log$0);} + catch(_bx_){} + log[1] = [0, caml_call1(Stdlib[60], cst_inline_tests_log)]; + return 0; + }], + cst_Log_the_tests_run_in_inlin], + _W_]]]]], + _Y_ = + [0, + [0, + cst_partition, + [4, function(i){partition[1] = [0, i]; return 0;}], + cst_Only_run_the_tests_in_the_], + _X_], + _Z_ = + [0, + [0, + cst_list_partitions, + [0, function(param){list_partitions[1] = 1; return 0;}], + cst_Lists_all_the_partitions_t], + _Y_], + ___ = + [0, + [0, + cst_list_test_names, + [0, + function(param){ + list_test_names[1] = 1; + verbose[1] = 1; + return 0; + }], + cst_Do_not_run_tests_but_show_], + _Z_], + l = caml_call2(Stdlib_Arg[11], 0, ___), + argv = caml_call1(Stdlib_Array[10], [0, name, rest]); + try{caml_call5(Stdlib_Arg[3], 0, argv, l, f, msg$1);} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib_Arg[8]){ + var msg = exn[2]; + caml_call2(Stdlib_Printf[3], _a_, msg); + caml_call1(Stdlib[99], 1); + } + else{ + if(exn[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace(exn, 0); + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[2], _b_, msg$0); + caml_call1(Stdlib[99], 0); + } + } + var + _$_ = list_partitions[1] ? -260537174 : [0, 1025081494, partition[1]], + v = + [0, + -753295984, + [0, [0, lib, tests[1], name_filter[1], tag_predicate[1]], _$_]]; + action[1] = v; + switch$0 = 1; + } + } + } + } + } + var am_test_runner = typeof get(0) === "number" ? 0 : 1, switch$1 = 0; + try{caml_sys_getenv("PPX_INLINE_TEST_LIB_AM_RUNNING_INLINE_TEST");} + catch(_bv_){ + var _k_ = caml_wrap_exception(_bv_); + if(_k_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_k_, 0); + var switch$2 = 0; + try{var val = caml_sys_getenv(cst_TESTING_FRAMEWORK);} + catch(_bw_){ + var _l_ = caml_wrap_exception(_bw_); + if(_l_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_l_, 0); + var _m_ = 0; + switch$2 = 1; + } + if(! switch$2) + var _M_ = caml_string_notequal(val, "inline-test") ? 0 : 1, _m_ = _M_; + var am_running_inline_test = _m_; + switch$1 = 1; + } + if(! switch$1) var am_running_inline_test = 1; + var + testing = am_test_runner ? _n_ : am_running_inline_test ? _L_ : 822171972; + function wall_time_clock_ns(param){return caml_call1(Time_now[1], 0);} + var + where_to_cut_backtrace = + [246, + function(param){ + var + _bt_ = caml_call2(Stdlib[28], cst$2, cst_time_without_resetting_ran), + _bu_ = caml_call2(Stdlib[28], cst_Ppx_inline_test_lib_Runtim, _bt_); + return caml_call2(Base_String[70][2], 0, _bu_); + }]; + function time_without_resetting_random_(f){ + var before_ns = wall_time_clock_ns(0); + try{var _bs_ = [0, caml_call1(f, 0)], res = _bs_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + res = [1, [0, exn, caml_call1(Stdlib_Printexc[6], 0)]]; + } + var + _bq_ = wall_time_clock_ns(0), + _br_ = caml_call2(Base_Int63[42], _bq_, before_ns); + time_sec[1] = caml_call1(Base_Int63[3], _br_) / 1000000000.; + return res; + } + var + saved_caml_random_state = + [246, + function(_bp_){ + return caml_call1(Stdlib_Random[15][1], [0, 100, 200, 300]); + }], + saved_base_random_state = + [246, + function(_bo_){ + return caml_call1(Base_Random[18][2], [0, 111, 222, 333]); + }]; + function string_of_module_descr(param){ + var t = current$0[1]; + function _bh_(m){return m[1];} + var _bi_ = caml_call2(Stdlib_List[19], _bh_, t); + function _bj_(s){ + var + _bl_ = caml_call1(Stdlib_String[28], s), + _bm_ = caml_call2(Stdlib[28], _bl_, cst$3), + _bn_ = caml_call2(Stdlib[28], cst_T_MODULE_at, _bm_); + return caml_call2(Stdlib[28], cst_in_TES, _bn_); + } + var _bk_ = caml_call2(Stdlib_List[19], _bj_, _bi_); + return caml_call2(Stdlib_String[6], cst$4, _bk_); + } + function print_delayed_errors(param){ + var delayed_errors$0 = caml_call1(Stdlib_List[9], delayed_errors[1]); + if(! delayed_errors$0) return 0; + var _bf_ = caml_call2(Stdlib_String[1], 70, 61); + caml_call2(Stdlib_Printf[3], _o_, _bf_); + function _bg_(message){return caml_call2(Stdlib_Printf[3], _p_, message);} + return caml_call2(Stdlib_List[17], _bg_, delayed_errors$0); + } + function eprintf_or_delay(fmt){ + function _bd_(s){ + if(verbose[1]) + delayed_errors[1] = [0, s, delayed_errors[1]]; + else + caml_call2(Stdlib_Printf[3], _q_, s); + var _be_ = stop_on_error[1]; + return _be_ ? (print_delayed_errors(0), caml_call1(Stdlib[99], 2)) : _be_; + } + return caml_call2(Stdlib_Printf[10], _bd_, fmt); + } + function add_hooks(C){ + return function(f, param){caml_call1(C[1], 0); return caml_call1(f, 0);}; + } + function hum_backtrace(backtrace){ + var + _a7_ = caml_call1(Base_String[88], backtrace), + _a8_ = Base_List[133], + _a9_ = + caml_call2 + (_a8_, + _a7_, + function(str){ + var _bb_ = caml_obj_tag(where_to_cut_backtrace); + if(250 === _bb_) + var _bc_ = where_to_cut_backtrace[1]; + else{ + var switch$0 = 0; + if(246 !== _bb_ && 244 !== _bb_){ + var _bc_ = where_to_cut_backtrace; + switch$0 = 1; + } + if(! switch$0) + var + _bc_ = caml_call1(CamlinternalLazy[2], where_to_cut_backtrace); + } + return 1 - caml_call2(Base_String[70][5], _bc_, str); + }), + _a__ = Base_List[76], + _a$_ = + caml_call2 + (_a__, + _a9_, + function(str){ + var _ba_ = caml_call2(Base[198], str, cst$5); + return caml_call2(Base[198], cst$6, _ba_); + }); + return caml_call2(Base_String[54], 0, _a$_); + } + function test_inner + (config, + descr, + tags, + def_filename, + def_line_number, + start_pos, + end_pos, + f, + bool_of_f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _aN_ = match[2], + what_to_do = _aN_[2], + match$0 = _aN_[1], + which_tags = match$0[4], + name_filter = match$0[3], + only_test_location = match$0[2], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + descr$0 = + [246, + function(_a6_){ + return caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos); + }], + _aO_ = current_tags(0), + complete_tags = caml_call2(Stdlib[37], tags, _aO_), + _aP_ = caml_equal([0, libname], dynamic_lib[1]); + if(_aP_){ + if(only_test_location) + var + _aL_ = + function(param){ + var + used = param[3], + line_number_opt = param[2], + filename = param[1], + position_start = + caml_ml_string_length(def_filename) + - caml_ml_string_length(filename) + | 0, + _a1_ = 0 <= position_start ? 1 : 0; + if(_a1_){ + var + end_of_def_filename = + caml_call3 + (Stdlib_String[15], + def_filename, + position_start, + caml_ml_string_length(filename)), + _a2_ = caml_string_equal(end_of_def_filename, filename); + if(_a2_){ + var + _a3_ = 0 === position_start ? 1 : 0, + _a4_ = + _a3_ + || + (47 + === + runtime.caml_string_get + (def_filename, position_start - 1 | 0) + ? 1 + : 0); + if(_a4_) + if(line_number_opt) + var + line_number = line_number_opt[1], + _a5_ = caml_equal(def_line_number, line_number); + else + var _a5_ = 1; + else + var _a5_ = _a4_; + } + else + var _a5_ = _a2_; + var found = _a5_; + } + else + var found = _a1_; + if(found) used[1] = 1; + return found; + }, + _aQ_ = caml_call2(Stdlib_List[33], _aL_, only_test_location); + else + var _aQ_ = 1; + if(_aQ_){ + var + _aC_ = which_tags[1], + _aD_ = + function(req){ + return 1 - caml_call2(Stdlib_List[36], req, complete_tags); + }, + _aE_ = caml_call2(Stdlib_List[33], _aD_, _aC_); + if(_aE_) + var _aR_ = _aE_; + else + var + _aF_ = which_tags[2], + _aG_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, complete_tags); + }, + _aR_ = caml_call2(Stdlib_List[33], _aG_, _aF_); + var _aS_ = 1 - _aR_; + if(_aS_){ + var _aT_ = caml_obj_tag(descr$0); + if(250 === _aT_) + var descr$1 = descr$0[1]; + else{ + var switch$0 = 0; + if(246 !== _aT_ && 244 !== _aT_){var descr$1 = descr$0; switch$0 = 1;} + if(! switch$0) var descr$1 = caml_call1(CamlinternalLazy[2], descr$0); + } + if(name_filter) + var + _aM_ = + function(substring){ + return caml_call2(Base_String[76], descr$1, substring); + }, + _aU_ = caml_call2(Stdlib_List[33], _aM_, name_filter); + else + var _aU_ = 1; + var should_run = _aU_; + } + else + var should_run = _aS_; + } + else + var should_run = _aQ_; + } + else + var should_run = _aP_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _aV_ = is_current(partition); + if(_aV_){ + var _aW_ = caml_obj_tag(descr$0); + if(250 === _aW_) + var descr$2 = descr$0[1]; + else{ + var switch$1 = 0; + if(246 !== _aW_ && 244 !== _aW_){var descr$2 = descr$0; switch$1 = 1;} + if(! switch$1) var descr$2 = caml_call1(CamlinternalLazy[2], descr$0); + } + tests_ran[1]++; + var match$1 = log[1]; + if(match$1){ + var ch = match$1[1], _aX_ = string_of_module_descr(0); + caml_call4(Stdlib_Printf[1], ch, _r_, descr$2, _aX_); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _s_, descr$2); + if(list_test_names[1]) + var result$0 = _t_; + else{ + var + caml_random_state = caml_call1(Stdlib_Random[16], 0), + base_random_state = caml_call1(Base_Random[18][4], Base_Random[18][1]), + _aH_ = caml_obj_tag(saved_caml_random_state); + if(250 === _aH_) + var _aI_ = saved_caml_random_state[1]; + else{ + var switch$2 = 0; + if(246 !== _aH_ && 244 !== _aH_){ + var _aI_ = saved_caml_random_state; + switch$2 = 1; + } + if(! switch$2) + var _aI_ = caml_call1(CamlinternalLazy[2], saved_caml_random_state); + } + caml_call1(Stdlib_Random[17], _aI_); + var _aJ_ = caml_obj_tag(saved_base_random_state); + if(250 === _aJ_) + var _aK_ = saved_base_random_state[1]; + else{ + var switch$3 = 0; + if(246 !== _aJ_ && 244 !== _aJ_){ + var _aK_ = saved_base_random_state; + switch$3 = 1; + } + if(! switch$3) + var _aK_ = caml_call1(CamlinternalLazy[2], saved_base_random_state); + } + caml_call1(Base_Random[19], _aK_); + var result = time_without_resetting_random_(f$0); + caml_call1(Stdlib_Random[17], caml_random_state); + caml_call1(Base_Random[19], base_random_state); + var result$0 = caml_call2(Stdlib_Result[8], bool_of_f, result); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _u_, time_sec[1]); + if(0 !== result$0[0]){ + var match$2 = result$0[1], backtrace = match$2[2], exn = match$2[1]; + tests_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$7 : cst$8, + _aZ_ = string_of_module_descr(0); + return caml_call5 + (eprintf_or_delay(_w_), + descr$2, + sep, + exn_str, + backtrace$0, + _aZ_); + } + if(result$0[1]) return 0; + tests_failed[1]++; + var _aY_ = string_of_module_descr(0); + return caml_call2(eprintf_or_delay(_v_), descr$2, _aY_); + } + var _a0_ = _aV_; + } + else + var _a0_ = should_run; + return _a0_; + } + function set_lib_and_partition(static_lib, partition){ + if(dynamic_lib[1]) return 0; + dynamic_lib[1] = [0, static_lib]; + var match = get(0); + if(typeof match === "number") return 0; + var + match$0 = match[2], + what_to_do = match$0[2], + which_tests = match$0[1], + _aB_ = caml_string_equal(which_tests[1], static_lib); + if(! _aB_) return _aB_; + var switch$0 = 0; + if(typeof what_to_do !== "number" && ! what_to_do[2]){var requires_partition = 0; switch$0 = 1;} + if(! switch$0) var requires_partition = 1; + if(caml_string_equal(partition, cst$13) && requires_partition) + return caml_call1(Stdlib[2], cst_ppx_inline_test_cannot_use); + current[1] = partition; + return 0; + } + function unset_lib(static_lib){ + var match = dynamic_lib[1]; + if(! match) return 0; + var + lib = match[1], + _az_ = caml_string_equal(lib, static_lib), + _aA_ = _az_ ? (dynamic_lib[1] = 0, 0) : _az_; + return _aA_; + } + function test + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(b){return b;}); + } + function test_unit + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(param){return 1;}); + } + function test_module + (config, descr, tags, def_filename, def_line_number, start_pos, end_pos, f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _as_ = match[2], + what_to_do = _as_[2], + match$0 = _as_[1], + which_tags = match$0[4], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + _at_ = current_tags(0), + partial_tags = caml_call2(Stdlib[37], tags, _at_), + _au_ = caml_equal([0, libname], dynamic_lib[1]); + if(_au_) + var + _aq_ = which_tags[2], + _ar_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, partial_tags); + }, + should_run = 1 - caml_call2(Stdlib_List[33], _ar_, _aq_); + else + var should_run = _au_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _av_ = is_current(partition); + if(_av_){ + test_modules_ran[1]++; + var + descr$0 = + caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos), + prev = current$0[1]; + current$0[1] = [0, [0, descr$0, tags], prev]; + try{var x = time_without_resetting_random_(f$0); current$0[1] = prev;} + catch(e$0){ + var e = caml_wrap_exception(e$0); + current$0[1] = prev; + throw caml_maybe_attach_backtrace(e, 0); + } + if(0 === x[0]) return 0; + var match$1 = x[1], backtrace = match$1[2], exn = match$1[1]; + test_modules_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$9 : cst$10, + _aw_ = string_of_module_descr(0), + _ax_ = caml_call1(Stdlib_String[28], descr$0); + return caml_call5 + (eprintf_or_delay(caml_call2(Stdlib[98], _y_, _x_)), + _ax_, + sep, + exn_str, + backtrace$0, + _aw_); + } + var _ay_ = _av_; + } + else + var _ay_ = should_run; + return _ay_; + } + function summarize(param){ + var match = get(0); + if(typeof match === "number"){ + var switch$0 = 0; + if(runtime.caml_notequal(caml_sys_argv(0), [0])){ + var _ai_ = runtime.caml_check_bound(caml_sys_argv(0), 0)[1]; + if + (caml_string_equal + (caml_call1(Stdlib_Filename[13], _ai_), "inline_tests_runner.exe")){caml_call1(Stdlib_Printf[3], _z_); switch$0 = 1;} + } + if(! switch$0) caml_call1(Stdlib_Printf[3], _A_); + return 2; + } + var _aj_ = match[2], which_tests = _aj_[1]; + if(typeof _aj_[2] === "number"){ + var + _ae_ = 0, + _af_ = function(k, param, acc){return [0, k, acc];}, + _ag_ = caml_call3(Stdlib_Hashtbl[14], _af_, _d_, _ae_), + _ah_ = caml_call2(Stdlib_List[56], Stdlib_String[9], _ag_), + _ak_ = caml_call1(Stdlib_Printf[2], _B_); + caml_call2(Stdlib_List[17], _ak_, _ah_); + return 0; + } + var match$0 = log[1]; + if(match$0){var ch = match$0[1]; caml_call1(Stdlib[76], ch);} + print_delayed_errors(0); + var count = tests_failed[1], count_test_modules = test_modules_failed[1]; + if(0 === count && 0 === count_test_modules){ + if(show_counts[1]) + caml_call3(Stdlib_Printf[3], _C_, tests_ran[1], test_modules_ran[1]); + var + _al_ = which_tests[2], + _am_ = function(param){var used = param[3]; return 1 - used[1];}, + unused_tests = caml_call2(Stdlib_List[41], _am_, _al_), + errors = unused_tests ? [0, unused_tests] : 0; + if(errors){ + var tests = errors[1]; + caml_call1(Stdlib_Printf[3], _D_); + var + _an_ = + function(param){ + var line_number_opt = param[2], filename = param[1]; + if(! line_number_opt) + return caml_call2(Stdlib_Printf[3], _F_, filename); + var line_number = line_number_opt[1]; + return caml_call3(Stdlib_Printf[3], _E_, filename, line_number); + }; + caml_call2(Stdlib_List[17], _an_, tests); + caml_call1(Stdlib_Printf[3], _G_); + return 2; + } + if(0 === tests_ran[1] && strict[1]){ + caml_call1(Stdlib_Printf[3], _H_); + return 2; + } + return 0; + } + if(0 === count_test_modules) + var _ao_ = cst$11; + else + var + _ap_ = caml_call2(Stdlib[98], _K_, _J_), + _ao_ = caml_call2(Stdlib_Printf[4], _ap_, count_test_modules); + caml_call4(Stdlib_Printf[3], _I_, count, tests_ran[1], _ao_); + return 1; + } + var + use_color$0 = use_color[1], + in_place$0 = in_place[1], + diff_command$0 = diff_command[1], + source_tree_root$0 = source_tree_root[1], + allow_output_patterns$0 = allow_output_patterns[1], + evaluators = [0, [0, summarize, 0]]; + function add_evaluator(f){evaluators[1] = [0, f, evaluators[1]]; return 0;} + function exit(param){ + var _ab_ = caml_call1(Stdlib_List[9], evaluators[1]); + function _ac_(f){return caml_call1(f, 0);} + switch(combine_all(caml_call2(Stdlib_List[19], _ac_, _ab_))){ + case 0: + var _ad_ = 0; break; + case 1: + var _ad_ = 2; break; + default: var _ad_ = 1; + } + return caml_call1(Stdlib[99], _ad_); + } + var + Ppx_inline_test_lib_Runtime = + [0, + [0, combine, combine_all, to_string], + set_lib_and_partition, + unset_lib, + test, + test_unit, + test_module, + testing, + use_color$0, + in_place$0, + diff_command$0, + source_tree_root$0, + allow_output_patterns$0, + am_running_inline_test, + am_running_inline_test_env_var, + add_evaluator, + exit]; + runtime.caml_register_global + (124, Ppx_inline_test_lib_Runtime, cst_Ppx_inline_test_lib_Runtim$0); + return; + } + (globalThis)); + + +//# 1 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 52 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std, cst); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Interfaces = [0]; + runtime.caml_register_global + (4, Fmlib_std_Interfaces, "Fmlib_std__Interfaces"); + return; + } + (globalThis)); + +//# 81 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_12345678901234567890123456 = "12345678901234567890123456789012", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_string_ml$0 = "src/std/string.ml", + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + str = cst_12345678901234567890123456, + cst = "", + Stdlib_Bytes = global_data.Stdlib__Bytes, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_String = global_data.Stdlib__String, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + make = Stdlib_String[1], + init = Stdlib_String[2], + concat = Stdlib_String[6], + compare = Stdlib_String[9], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + _b_ = [0, cst_src_std_string_ml$0, 107, 8], + _a_ = [0, cst_src_std_string_ml$0, 103, 8], + cst_src_std_string_ml = cst_src_std_string_ml$0, + cst_str_From_make_with_size_2_ = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function one(c){return caml_call2(make, 1, c);} + function is_prefix(a, b){ + var + len_a = caml_ml_string_length(a), + _i_ = len_a <= caml_ml_string_length(b) ? 1 : 0, + _j_ = _i_ ? caml_string_equal(a, caml_call3(sub, b, 0, len_a)) : _i_; + return _j_; + } + function is_suffix(a, b){ + var + len_a = caml_ml_string_length(a), + len_b = caml_ml_string_length(b), + _g_ = len_a <= len_b ? 1 : 0, + _h_ = + _g_ + ? caml_string_equal(a, caml_call3(sub, b, len_b - len_a | 0, len_a)) + : _g_; + return _h_; + } + function find(f, start, s){ + var len = caml_ml_string_length(s), i = start; + for(;;){ + if(i !== len && ! caml_call1(f, caml_string_get(s, i))){var i$0 = i + 1 | 0, i = i$0; continue;} + return i; + } + } + function has(f, start, s){ + return find(f, start, s) < caml_ml_string_length(s) ? 1 : 0; + } + function find_bwd(f, beyond, s){ + var len = caml_ml_string_length(s), switch$0 = 0; + if(0 <= beyond && len >= beyond){var beyond$0 = beyond; switch$0 = 1;} + if(! switch$0) var beyond$0 = len; + var i = beyond$0; + for(;;){ + if(0 !== i && ! caml_call1(f, caml_string_get(s, i - 1 | 0))){var i$0 = i - 1 | 0, i = i$0; continue;} + return i - 1 | 0; + } + } + function list(s){ + var i$0 = caml_ml_string_length(s), cs = 0, i = i$0; + for(;;){ + if(0 === i) return cs; + var + j = i - 1 | 0, + cs$0 = [0, caml_string_get(s, j), cs], + cs = cs$0, + i = j; + } + } + function of_list(cs){ + function str(cs, i){ + if(! cs) return caml_create_bytes(i); + var cs$0 = cs[2], c = cs[1], bs = str(cs$0, i + 1 | 0); + caml_bytes_set(bs, i, c); + return bs; + } + var bs = str(cs, 0); + return caml_call1(Stdlib_Bytes[44], bs); + } + function reverse(s){ + var len = caml_ml_string_length(s); + return caml_call2 + (init, + len, + function(i){return caml_string_get(s, (len - 1 | 0) - i | 0);}); + } + function has_more(param){ + var s = param[2], i = param[1]; + return i < caml_ml_string_length(s) ? 1 : 0; + } + function peek(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return caml_string_get(s, i); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function advance(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return [0, i + 1 | 0, s]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function make$0(s){return [0, 0, s];} + var To_source = [0, has_more, peek, advance, make$0]; + function From_source(R){ + function make_with_size(estimate, r){ + var + estimate$0 = 0 < estimate ? estimate : 80, + buffer = [0, caml_create_bytes(estimate$0)], + len = [0, 0], + capacity = [0, estimate$0], + r$0 = r; + for(;;){ + if(! caml_call1(R[1], r$0)) + return caml_call3(Stdlib_Bytes[8], buffer[1], 0, len[1]); + var c = caml_call1(R[2], r$0); + if(len[1] === capacity[1]){ + var bnew = caml_create_bytes(2 * capacity[1] | 0); + caml_call5(Stdlib_Bytes[11], buffer[1], 0, bnew, 0, len[1]); + buffer[1] = bnew; + capacity[1] = 2 * capacity[1] | 0; + } + caml_bytes_set(buffer[1], len[1], c); + len[1] = len[1] + 1 | 0; + var r$1 = caml_call1(R[3], r$0), r$0 = r$1; + } + } + function make(r){return make_with_size(100, r);} + return [0, make_with_size, make]; + } + function _c_(param){ + var + From = From_source([0, To_source[1], To_source[2], To_source[3]]), + _f_ = caml_call1(To_source[4], str); + return caml_string_equal + (cst_12345678901234567890123456, caml_call2(From[1], 2, _f_)); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_str_From_make_with_size_2_, + 0, + cst_src_std_string_ml, + 162, + 0, + 166, + _c_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_String = + [0, + is_prefix, + is_suffix, + reverse, + compare, + one, + find, + has, + find_bwd, + list, + of_list, + caml_ml_string_length, + caml_string_get, + sub, + concat, + split_on_char, + make, + init, + To_source, + function(_d_){var _e_ = From_source(_d_); return [0, _e_[2], _e_[1]];}]; + runtime.caml_register_global(13, Fmlib_std_String, "Fmlib_std__String"); + return; + } + (globalThis)); + +//# 437 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_Int = global_data.Stdlib__Int; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var compare = Stdlib_Int[9], cst_fmlib_std = cst_fmlib_std$0; + function iterate(n, f, start){ + var n$0 = n, v = start; + for(;;){ + if(0 === n$0) return v; + var v$0 = caml_call1(f, v), n$1 = n$0 - 1 | 0, n$0 = n$1, v = v$0; + } + } + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Int = [0, compare, iterate]; + runtime.caml_register_global(5, Fmlib_std_Int, "Fmlib_std__Int"); + return; + } + (globalThis)); + +//# 474 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var cst_fmlib_std = cst_fmlib_std$0; + function return$0(a){return [0, a];} + var fail = 0; + function let$0(m, f){ + if(! m) return 0; + var a = m[1]; + return caml_call1(f, a); + } + function map(f, m){ + return let$0(m, function(a){return [0, caml_call1(f, a)];}); + } + function to_list(m){if(! m) return 0; var a = m[1]; return [0, a, 0];} + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Option = [0, return$0, fail, let$0, let$0, map, to_list]; + runtime.caml_register_global(4, Fmlib_std_Option, "Fmlib_std__Option"); + return; + } + (globalThis)); + +//# 514 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_insert_downward_0_3_SetInt$3 = + "<<((insert_downward 0 3 SetInt.empty) |> (SetIn[...]>>", + cst_insert_upward_0_3_SetInt_e$2 = + "<<((insert_upward 0 3 SetInt.empty) |> (insert_[...]>>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_array_ml$12 = "src/std/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Int = global_data.Fmlib_std__Int, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Stdlib_Array = global_data.Stdlib__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + init = Stdlib_Array[1], + append = Stdlib_Array[3], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + map = Stdlib_Array[13], + fold_left = Stdlib_Array[15], + fold_right = Stdlib_Array[17], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + _Y_ = [0, 0], + _U_ = [0, 2, 0], + _V_ = [0, 1, 0], + _S_ = + [0, [0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0]], + _O_ = [0, 2, 0], + _P_ = [0, 1, 0], + _Q_ = [0, 0, 0], + _K_ = [0, 2, 0], + _L_ = [0, 1, 0], + _M_ = [0, 0, 0], + _H_ = [0, 2, 0], + _I_ = [0, 0, 0], + _D_ = [0, 2, 0], + _E_ = [0, 1, 0], + _F_ = [0, 0, 0], + _z_ = [0, 2, 0], + _A_ = [0, 1, 0], + _B_ = [0, 0, 0], + _x_ = [0, 1, 0], + _v_ = [0, 0, 1], + _t_ = [0, 0, 0], + _r_ = [0, 0, 0], + _p_ = [0, cst_src_std_array_ml$12, 332, 8], + _o_ = [0, cst_src_std_array_ml$12, 333, 8], + _n_ = [0, cst_src_std_array_ml$12, 235, 8], + _m_ = [0, cst_src_std_array_ml$12, 161, 16], + _l_ = [0, cst_src_std_array_ml$12, 162, 16], + _k_ = [0, cst_src_std_array_ml$12, 101, 4], + _j_ = [0, cst_src_std_array_ml$12, 94, 4], + _i_ = [0, cst_src_std_array_ml$12, 79, 4], + _h_ = [0, cst_src_std_array_ml$12, 80, 4], + _g_ = [0, cst_src_std_array_ml$12, 85, 4], + _f_ = [0, cst_src_std_array_ml$12, 67, 4], + _e_ = [0, cst_src_std_array_ml$12, 68, 4], + _d_ = [0, cst_src_std_array_ml$12, 54, 4], + _c_ = [0, cst_src_std_array_ml$12, 55, 4], + _b_ = [0, cst_src_std_array_ml$12, 25, 4], + _a_ = [0, cst_src_std_array_ml$12, 19, 4], + cst_src_std_array_ml = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_ = + "<<(binsearch Int.compare Fun.id 100 [||]) = (0,[...]>>", + cst_src_std_array_ml$0 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$0 = + "<<(binsearch Int.compare Fun.id 99 [|100|]) = ([...]>>", + cst_src_std_array_ml$1 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$1 = + "<<(binsearch Int.compare Fun.id 100 [|100|]) = [...]>>", + cst_src_std_array_ml$2 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$2 = + "<<(binsearch Int.compare Fun.id 101 [|100|]) = [...]>>", + cst_src_std_array_ml$3 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e = + "<<(insert_upward 0 3 SetInt.empty) = [|(0, ());[...]>>", + cst_src_std_array_ml$4 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt = + "<<(insert_downward 0 3 SetInt.empty) = [|(0, ()[...]>>", + cst_src_std_array_ml$5 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$0 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$6 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$1 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$7 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$0 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$8 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$1 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$9 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$2 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$10 = cst_src_std_array_ml$12, + cst_SetInt_index_of_3_set_None = "<<(SetInt.index_of 3 set) = None>>", + cst_src_std_array_ml$11 = cst_src_std_array_ml$12, + cst_SetInt_index_of_0_set_Some = "<<(SetInt.index_of 0 set) = (Some 0)>>", + cst_fmlib_std = cst_fmlib_std$0; + function is_empty(xs){return 0 === xs.length - 1 ? 1 : 0;} + function valid_index(i, xs){ + var _aX_ = 0 <= i ? 1 : 0, _aY_ = _aX_ ? i < xs.length - 1 ? 1 : 0 : _aX_; + return _aY_; + } + function has_some(xs){return 0 < xs.length - 1 ? 1 : 0;} + function first(xs){ + if(has_some(xs)) return caml_check_bound(xs, 0)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function last(xs){ + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var _aW_ = len - 1 | 0; + return caml_check_bound(xs, _aW_)[1 + _aW_]; + } + function foldi_left(f, start, xs){ + var _aV_ = [0, start, 0]; + return caml_call3 + (fold_left, + function(param, e){ + var idx = param[2], start = param[1]; + return [0, caml_call3(f, start, idx, e), idx + 1 | 0]; + }, + _aV_, + xs) + [1]; + } + function push(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 0, len); + return xs_new; + } + function push_front(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 1, len); + return xs_new; + } + function insert(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i > xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var len = xs.length - 1, arr = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i, arr, i + 1 | 0, len - i | 0); + return arr; + } + function replace(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var arr = caml_call1(copy, xs); + caml_check_bound(arr, i)[1 + i] = x; + return arr; + } + function remove(i, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var arr = caml_make_vect(len - 1 | 0, caml_check_bound(xs, 0)[1]); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i + 1 | 0, arr, i, len - (i + 1 | 0) | 0); + return arr; + } + function remove_first(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 1, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + function remove_last(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 0, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function find(p, arr){ + var len = arr.length - 1, i = 0; + for(;;){ + if(i === len) return 0; + if(caml_call1(p, caml_check_bound(arr, i)[1 + i])) return [0, i]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function binsearch(compare, key_of, key, arr){ + var len = arr.length - 1; + if(0 === len) return [0, len, 0]; + if(1 === len){ + var + cmp = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])); + return 0 < cmp ? [0, len, 0] : [0, 0, 0 === cmp ? 1 : 0]; + } + var + upper$0 = len - 1 | 0, + cmp$1 = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])), + lower$1 = 0; + if(0 >= cmp$1) return [0, lower$1, 0 === cmp$1 ? 1 : 0]; + var + cmp$2 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, upper$0)[1 + upper$0])); + if(0 <= cmp$2) return 0 === cmp$2 ? [0, upper$0, 1] : [0, len, 0]; + var lower = lower$1, upper = upper$0; + for(;;){ + if((lower + 1 | 0) === upper) return [0, upper, 0]; + var lower$0 = lower + ((upper - lower | 0) / 2 | 0) | 0; + if(lower >= lower$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(lower$0 >= upper) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + cmp$0 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, lower$0)[1 + lower$0])); + if(0 === cmp$0) return [0, lower$0, 1]; + if(0 <= cmp$0){var lower = lower$0; continue;} + var upper = lower$0; + } + } + function Map(Key){ + function cardinal(map){return map.length - 1;} + function is_empty(map){return 0 === map.length - 1 ? 1 : 0;} + function bindings(map){return caml_call1(to_list, map);} + function fold_left(f, start, map){ + function _aU_(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + } + return caml_call3(Stdlib_Array[15], _aU_, start, map); + } + function fold_right(f, start, map){ + function _aT_(param, result){ + var value = param[2], key = param[1]; + return caml_call3(f, result, key, value); + } + return caml_call3(Stdlib_Array[17], _aT_, map, start); + } + function index_of(key, map){ + var len = map.length - 1; + function _aR_(_aS_){return _aS_[1];} + var + match = binsearch(Key[1], _aR_, key, map), + exact = match[2], + i = match[1]; + if(i !== len && exact) return [0, i]; + return 0; + } + function pair(i, map){ + if(i < map.length - 1) return caml_check_bound(map, i)[1 + i]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + function find_opt(key, map){ + var _aP_ = index_of(key, map); + function _aQ_(i){return caml_check_bound(map, i)[1 + i][2];} + return caml_call2(Fmlib_std_Option[5], _aQ_, _aP_); + } + function mem(key, map){return 0 !== index_of(key, map) ? 1 : 0;} + var empty = [0]; + function singleton(key, value){return [0, [0, key, value]];} + function add(key, value, map){ + function _aN_(_aO_){return _aO_[1];} + var + match = binsearch(Key[1], _aN_, key, map), + exact = match[2], + i = match[1]; + return exact + ? replace(i, [0, key, value], map) + : insert(i, [0, key, value], map); + } + function update(key, f, map){ + function _aL_(_aM_){return _aM_[1];} + var + match = binsearch(Key[1], _aL_, key, map), + exact = match[2], + i = match[1]; + if(exact){ + var match$0 = caml_call1(f, [0, caml_check_bound(map, i)[1 + i][2]]); + if(! match$0) return remove(i, map); + var value = match$0[1]; + return replace(i, [0, key, value], map); + } + var match$1 = caml_call1(f, 0); + if(! match$1) return map; + var value$0 = match$1[1]; + return insert(i, [0, key, value$0], map); + } + function remove$0(key, map){ + function _aJ_(_aK_){return _aK_[1];} + var + match = binsearch(Key[1], _aJ_, key, map), + exact = match[2], + i = match[1]; + return exact ? remove(i, map) : map; + } + return [0, + cardinal, + is_empty, + bindings, + fold_left, + fold_right, + index_of, + pair, + find_opt, + mem, + empty, + singleton, + add, + update, + remove$0]; + } + function Set(Key){ + var M = Map(Key); + function cardinal(set){return caml_call1(M[1], set);} + var is_empty = M[2]; + function fold_left(f, start, set){ + function _aI_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[4], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[5], _aH_, start, set); + } + function elements(set){ + var _aG_ = 0; + return fold_right(function(lst, key){return [0, key, lst];}, _aG_, set); + } + function element(i, set){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + if(i < cardinal(set)) return caml_call2(M[7], i, set)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + } + var index_of = M[6], empty = M[10]; + function singleton(e){return caml_call2(M[11], e, 0);} + var mem = M[9]; + function add(e, set){return caml_call3(M[12], e, 0, set);} + var remove = M[14]; + return [0, + M, + cardinal, + is_empty, + fold_left, + fold_right, + elements, + element, + index_of, + empty, + singleton, + mem, + add, + remove]; + } + function _q_(param){ + var _aC_ = [0], _aD_ = 100; + function _aE_(_aF_){return _aF_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aE_, _aD_, _aC_), _r_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_, + 0, + cst_src_std_array_ml, + 372, + 0, + 67, + _q_); + function _s_(param){ + var _ay_ = [0, 100], _az_ = 99; + function _aA_(_aB_){return _aB_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aA_, _az_, _ay_), _t_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$0, + 0, + cst_src_std_array_ml$0, + 377, + 0, + 69, + _s_); + function _u_(param){ + var _au_ = [0, 100], _av_ = 100; + function _aw_(_ax_){return _ax_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aw_, _av_, _au_), _v_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$1, + 0, + cst_src_std_array_ml$1, + 382, + 0, + 69, + _u_); + function _w_(param){ + var _aq_ = [0, 100], _ar_ = 101; + function _as_(_at_){return _at_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _as_, _ar_, _aq_), _x_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$2, + 0, + cst_src_std_array_ml$2, + 387, + 0, + 70, + _w_); + var SetInt = Set([0, Fmlib_std_Int[1]]); + function insert_downward(lower, beyond, set){ + var i = beyond, set$0 = set; + for(;;){ + if(i === lower) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(SetInt[12], i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function insert_upward(lower, beyond, set){ + var i = lower, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(SetInt[12], i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function _y_(param){ + return caml_equal(insert_upward(0, 3, SetInt[9]), [0, _B_, _A_, _z_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e, + 0, + cst_src_std_array_ml$3, + 418, + 0, + 70, + _y_); + function _C_(param){ + return caml_equal(insert_downward(0, 3, SetInt[9]), [0, _F_, _E_, _D_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt, + 0, + cst_src_std_array_ml$4, + 422, + 0, + 72, + _C_); + function _G_(param){ + var _ap_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 1), _ap_), [0, _I_, _H_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$0, + 0, + cst_src_std_array_ml$5, + 426, + 0, + 85, + _G_); + function _J_(param){ + var _ao_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 4), _ao_), [0, _M_, _L_, _K_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$1, + 0, + cst_src_std_array_ml$6, + 430, + 0, + 92, + _J_); + function _N_(param){ + return caml_equal + (insert_downward(0, 3, insert_upward(0, 3, SetInt[9])), + [0, _Q_, _P_, _O_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$0, + 0, + cst_src_std_array_ml$7, + 434, + 0, + 103, + _N_); + function _R_(param){ + var _an_ = _S_.slice(); + return caml_equal + (insert_downward(3, 6, insert_upward(0, 3, SetInt[9])), _an_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$1, + 0, + cst_src_std_array_ml$8, + 440, + 0, + 121, + _R_); + function _T_(param){ + var _am_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 0), _am_), [0, _V_, _U_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$2, + 0, + cst_src_std_array_ml$9, + 446, + 0, + 95, + _T_); + function _W_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return 0 === caml_call2(SetInt[8], 3, set) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_3_set_None, + 0, + cst_src_std_array_ml$10, + 452, + 0, + 95, + _W_); + function _X_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return caml_equal(caml_call2(SetInt[8], 0, set), _Y_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_0_set_Some, + 0, + cst_src_std_array_ml$11, + 457, + 0, + 97, + _X_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _Z_(_ak_){ + var _al_ = Map(_ak_); + return [0, + _al_[2], + _al_[1], + _al_[4], + _al_[5], + _al_[3], + _al_[8], + _al_[10], + _al_[12], + _al_[14], + _al_[13], + _al_[7], + _al_[11]]; + } + function ___(_ai_){ + var _aj_ = Set(_ai_); + return [0, + _aj_[3], + _aj_[2], + _aj_[11], + _aj_[4], + _aj_[5], + _aj_[6], + _aj_[9], + _aj_[12], + _aj_[13], + _aj_[7], + _aj_[8], + _aj_[10]]; + } + var _$_ = caml_make_vect; + function _aa_(_ah_, _ag_, _af_){ + caml_check_bound(_ah_, _ag_)[1 + _ag_] = _af_; + return 0; + } + function _ab_(_ae_, _ad_){return caml_check_bound(_ae_, _ad_)[1 + _ad_];} + var + Fmlib_std_Array = + [0, + function(_ac_){return _ac_.length - 1;}, + valid_index, + is_empty, + has_some, + _ab_, + first, + last, + _aa_, + _$_, + init, + append, + insert, + replace, + remove, + remove_first, + remove_last, + map, + fold_left, + foldi_left, + fold_right, + copy, + sub, + blit, + find, + for_all, + exists, + push, + push_front, + to_list, + of_list, + binsearch, + ___, + _Z_]; + runtime.caml_register_global(73, Fmlib_std_Array, "Fmlib_std__Array"); + return; + } + (globalThis)); + +//# 1709 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_list_ml$2 = "src/std/list.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_List = global_data.Stdlib__List, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + length = Stdlib_List[1], + rev = Stdlib_List[9], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + filter = Stdlib_List[41], + split = Stdlib_List[54], + _o_ = + [0, + [0, 1, [0, 4, 0]], + [0, [0, 2, [0, 5, 0]], [0, [0, 3, [0, 6, 0]], 0]]], + _p_ = [0, [0, 1, [0, 2, [0, 3, 0]]], [0, [0, 4, [0, 5, [0, 6, 0]]], 0]], + _l_ = [0, [0, 1, 0], [0, [0, 2, 0], [0, [0, 3, 0], 0]]], + _m_ = [0, [0, 1, [0, 2, [0, 3, 0]]], 0], + _i_ = [0, [0, 1, 0], 0], + _j_ = [0, [0, 1, 0], 0], + _g_ = [0, cst_src_std_list_ml$2, 97, 12], + _f_ = [0, cst_src_std_list_ml$2, 86, 20], + _e_ = [0, 0, 0], + _d_ = [0, cst_src_std_list_ml$2, 79, 4], + _b_ = [0, cst_src_std_list_ml$2, 37, 4], + _c_ = [0, cst_src_std_list_ml$2, 40, 8], + cst_src_std_list_ml = cst_src_std_list_ml$2, + cst_transpose_1_1 = "<<(transpose [[1]]) = [[1]]>>", + cst_src_std_list_ml$0 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_1_2_3 = + "<<(transpose [[1; 2; 3]]) = [[1]; [2]; [3]]>>", + cst_src_std_list_ml$1 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_4_5_6_1_4 = + "<<(transpose [[1; 2; 3]; [4; 5; 6]]) = [[1; 4];[...]>>", + cst_fmlib_std = cst_fmlib_std$0, + _a_ = Stdlib_List[38]; + function return$0(a){return [0, a, 0];} + function symbol_bind(l, f){ + if(! l) return 0; + var + tl = l[2], + hd = l[1], + _x_ = symbol_bind(tl, f), + _y_ = caml_call1(f, hd); + return caml_call2(Stdlib[37], _y_, _x_); + } + function symbol(f, g, a){return symbol_bind(caml_call1(f, a), g);} + function symbol$0(flst, lst){ + return symbol_bind(flst, function(f){return caml_call2(map, f, lst);}); + } + function find(p, l){ + try{var _v_ = [0, caml_call2(_a_, p, l)]; return _v_;} + catch(_w_){ + var _u_ = caml_wrap_exception(_w_); + if(_u_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_u_, 0); + } + } + function split_head_tail(lst){ + if(0 === lst) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(! lst) throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var tl = lst[2], hd = lst[1]; + return [0, hd, tl]; + } + function map_and_filter(f, l){ + function map(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var tl = param$0[2], hd = param$0[1], match = caml_call1(f, hd); + if(match){var b = match[1]; return [0, b, map(tl)];} + var param$0 = tl; + } + } + return map(l); + } + function split_at(p, rest){ + var prefix = 0, rest$0 = rest; + for(;;){ + if(! rest$0) return [0, caml_call1(rev, prefix), rest$0]; + var rest$1 = rest$0[2], hd = rest$0[1]; + if(caml_call1(p, hd)) return [0, caml_call1(rev, prefix), rest$0]; + var prefix$0 = [0, hd, prefix], prefix = prefix$0, rest$0 = rest$1; + } + } + function transpose(row_list){ + if(0 === row_list) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var columns = 0, row_list$0 = row_list; + for(;;){ + if(! row_list$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + if(! row_list$0[1]) return caml_call1(rev, columns); + var + match = + caml_call3 + (fold_right, + function(row, param){ + var row_list = param[2], column = param[1]; + if(! row) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var rest_row = row[2], el = row[1]; + return [0, [0, el, column], [0, rest_row, row_list]]; + }, + row_list$0, + _e_), + row_list$1 = match[2], + column = match[1], + columns$0 = [0, column, columns], + columns = columns$0, + row_list$0 = row_list$1; + } + } + function _h_(param){return caml_equal(transpose(_j_), _i_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_1, + 0, + cst_src_std_list_ml, + 137, + 0, + 44, + _h_); + function _k_(param){return caml_equal(transpose(_m_), _l_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_1_2_3, + 0, + cst_src_std_list_ml$0, + 141, + 0, + 66, + _k_); + function _n_(param){return caml_equal(transpose(_p_), _o_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_4_5_6_1_4, + 0, + cst_src_std_list_ml$1, + 145, + 0, + 81, + _n_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_List = + [0, + return$0, + symbol_bind, + symbol_bind, + symbol, + symbol$0, + concat, + find, + append, + concat, + split, + rev, + rev_append, + length, + filter, + fold_left, + fold_right, + map, + mapi, + rev_map, + for_all, + exists, + split_head_tail, + map_and_filter, + split_at, + transpose, + function(M){ + function foldi_left(f, l, start){ + function foldi(i, l, start){ + if(! l) return caml_call1(M[1], start); + var tl = l[2], hd = l[1], _q_ = i + 1 | 0; + function _r_(_t_){return foldi(_q_, tl, _t_);} + var _s_ = caml_call3(f, i, hd, start); + return caml_call2(M[2], _s_, _r_); + } + return foldi(0, l, start); + } + function fold_left(f, l, start){ + return foldi_left(function(param){return f;}, l, start); + } + function fold_right(f, l, start){ + return fold_left(f, caml_call1(rev, l), start); + } + return [0, fold_left, fold_right, foldi_left]; + }]; + runtime.caml_register_global(26, Fmlib_std_List, "Fmlib_std__List"); + return; + } + (globalThis)); + +//# 2148 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set3_check_range_100_200_s$2 = "<>", + cst_Set4_check_range_100_200_s$2 = "<>", + cst_let_open_Map3_in_let_map_a$3 = + "<>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_btree_ml$15 = "src/std/btree.ml", + caml_equal = runtime.caml_equal, + caml_list_of_js_array = runtime.caml_list_of_js_array, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Option = global_data.Fmlib_std__Option, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Int = global_data.Fmlib_std__Int; + global_data.Stdlib; + var Fmlib_std_List = global_data.Fmlib_std__List; + global_data.Fmlib_std__String; + global_data.Stdlib__Unit; + var + Fmlib_std_Array = global_data.Fmlib_std__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + O32 = [0, 32], + _aa_ = + caml_list_of_js_array + ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]), + _U_ = [0, cst_src_std_btree_ml$15, 1130, 8], + _K_ = [0, cst_src_std_btree_ml$15, 990, 8], + _J_ = [0, cst_src_std_btree_ml$15, 980, 8], + _v_ = [0, cst_src_std_btree_ml$15, 381, 16], + _D_ = [0, cst_src_std_btree_ml$15, 604, 12], + _E_ = [0, cst_src_std_btree_ml$15, 616, 12], + _H_ = [0, cst_src_std_btree_ml$15, 825, 8], + _G_ = [0, cst_src_std_btree_ml$15, 833, 12], + _F_ = [0, cst_src_std_btree_ml$15, 787, 8], + _C_ = [0, cst_src_std_btree_ml$15, 572, 12], + _B_ = [0, cst_src_std_btree_ml$15, 503, 8], + _A_ = [0, cst_src_std_btree_ml$15, 485, 8], + _z_ = [0, cst_src_std_btree_ml$15, 466, 8], + _y_ = [0, cst_src_std_btree_ml$15, 436, 8], + _x_ = [0, cst_src_std_btree_ml$15, 423, 8], + _w_ = [0, cst_src_std_btree_ml$15, 424, 8], + _o_ = [0, cst_src_std_btree_ml$15, 293, 12], + _q_ = [0, cst_src_std_btree_ml$15, 310, 20], + _p_ = [0, cst_src_std_btree_ml$15, 311, 20], + _r_ = [0, cst_src_std_btree_ml$15, 324, 20], + _s_ = [0, cst_src_std_btree_ml$15, 334, 20], + _t_ = [0, cst_src_std_btree_ml$15, 348, 20], + _u_ = [0, cst_src_std_btree_ml$15, 359, 20], + _n_ = [0, cst_src_std_btree_ml$15, 223, 8], + _m_ = [0, cst_src_std_btree_ml$15, 205, 8], + _l_ = [0, cst_src_std_btree_ml$15, 206, 8], + _k_ = [0, cst_src_std_btree_ml$15, 207, 8], + _j_ = [0, cst_src_std_btree_ml$15, 208, 8], + _i_ = [0, cst_src_std_btree_ml$15, 193, 8], + _h_ = [0, cst_src_std_btree_ml$15, 194, 8], + _g_ = [0, cst_src_std_btree_ml$15, 195, 8], + _e_ = [0, cst_src_std_btree_ml$15, 109, 20], + _d_ = [0, cst_src_std_btree_ml$15, 114, 24], + _c_ = [0, cst_src_std_btree_ml$15, 115, 24], + _f_ = [0, cst_src_std_btree_ml$15, 107, 16], + _a_ = [0, cst_src_std_btree_ml$15, 81, 20], + _b_ = [0, cst_src_std_btree_ml$15, 79, 16], + _I_ = [0, cst_src_std_btree_ml$15, 20, 8], + cst_src_std_btree_ml = cst_src_std_btree_ml$15, + cst_let_open_Map_in_cardinal_e = + "<<(let open Map in cardinal empty) = 0>>", + cst_src_std_btree_ml$0 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$1 = cst_src_std_btree_ml$15, + cst_Set4_check_range_0_100_set = "<>", + cst_src_std_btree_ml$2 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$3 = cst_src_std_btree_ml$15, + cst_Set3_check_range_0_100_set = "<>", + cst_src_std_btree_ml$4 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$0 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$5 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$1 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$6 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$0 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$7 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$1 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$8 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a = + "<>", + cst_src_std_btree_ml$9 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$0 = + "<>", + cst_src_std_btree_ml$10 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_u = + "<>", + cst_src_std_btree_ml$11 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$1 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$12 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$2 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$13 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_f_i_i = + "<>", + cst_src_std_btree_ml$14 = cst_src_std_btree_ml$15, + cst_let_open_Set3_in_let_modul = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function Map0(_aJ_, Key){ + var order = _aJ_[1]; + if(3 > order) + throw caml_maybe_attach_backtrace([0, Assert_failure, _I_], 1); + var + odd_order = ((order / 2 | 0) * 2 | 0) < order ? 1 : 0, + max_keys = order - 1 | 0, + min_keys = odd_order ? (order - 1 | 0) / 2 | 0 : (order / 2 | 0) - 1 | 0; + function is_empty(map){ + if(0 !== map[0]) return 0; + var keys = map[1]; + return 0 === caml_call1(Fmlib_std_Array[1], keys) ? 1 : 0; + } + function cardinal(map){ + if(0 === map[0]){ + var keys = map[1]; + return caml_call1(Fmlib_std_Array[1], keys); + } + var + children = map[2], + keys$0 = map[1], + _bi_ = caml_call1(Fmlib_std_Array[1], keys$0); + function _bj_(n, child){return n + cardinal(child) | 0;} + return caml_call3(Fmlib_std_Array[18], _bj_, _bi_, children); + } + var empty = [0, [0]]; + function fold_left(f, start, map){ + function fold(accu, map){ + var accu$0 = accu, map$0 = map; + a: + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + _bf_ = + function(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[18], _bf_, accu$0, pairs); + } + var + children = map$0[2], + pairs$0 = map$0[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var accu$1 = accu$0, i = 0; + for(;;){ + if(i >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(i === n){ + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i), + accu$0 = accu$1, + map$0 = map$1; + continue a; + } + var + i$0 = i + 1 | 0, + _bg_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[2], + _bh_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[1], + accu$2 = + caml_call3 + (f, + fold(accu$1, caml_call2(Fmlib_std_Array[5], children, i)), + _bh_, + _bg_), + accu$1 = accu$2, + i = i$0; + } + } + } + return fold(start, map); + } + function fold_right(f, start, map){ + function fold(accu, map){ + if(0 === map[0]){ + var + pairs = map[1], + _bc_ = + function(param, a){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[20], _bc_, pairs, accu); + } + var + children = map[2], + pairs$0 = map[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + accu$2 = fold(accu, caml_call2(Fmlib_std_Array[5], children, n)), + accu$0 = accu$2, + i = n; + for(;;){ + if(0 > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + if(0 === i) return accu$0; + var i$0 = i - 1 | 0; + if(0 > i$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i$0 >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + _bd_ = caml_call2(Fmlib_std_Array[5], children, i$0), + _be_ = caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2], + accu$1 = + fold + (caml_call3 + (f, + accu$0, + caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[1], + _be_), + _bd_), + accu$0 = accu$1, + i = i$0; + } + } + return fold(start, map); + } + function bindings(map){ + var _bb_ = 0; + return fold_right + (function(lst, key, value){return [0, [0, key, value], lst];}, + _bb_, + map); + } + function keys(map){ + var _ba_ = 0; + return fold_right + (function(lst, key, param){return [0, key, lst];}, _ba_, map); + } + function bsearch(key, arr){ + function _a__(_a$_){return _a$_[1];} + return caml_call4(Fmlib_std_Array[31], Key[1], _a__, key, arr); + } + function find_opt(key, map){ + var map$0 = map; + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + return exact ? [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]] : 0; + } + var + children = map$0[2], + pairs$0 = map$0[1], + match$0 = bsearch(key, pairs$0), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0) return [0, caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2]]; + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i$0), + map$0 = map$1; + } + } + function subarray(arr, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + if(beyond <= caml_call1(Fmlib_std_Array[1], arr)) + return caml_call3(Fmlib_std_Array[22], arr, start, beyond - start | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function insert_subarray(arr, i, x, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(start > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + if(i > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + if(beyond > caml_call1(Fmlib_std_Array[1], arr)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + var + arr2 = caml_call2(Fmlib_std_Array[9], (beyond - start | 0) + 1 | 0, x); + caml_call5(Fmlib_std_Array[23], arr, start, arr2, 0, i - start | 0); + caml_call5 + (Fmlib_std_Array[23], + arr, + i, + arr2, + (i - start | 0) + 1 | 0, + beyond - i | 0); + return arr2; + } + function split_subarray(arr, i, x, y, start, beyond){ + if(i >= beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + var arr$0 = insert_subarray(arr, i, x, start, beyond); + caml_call3(Fmlib_std_Array[8], arr$0, (i - start | 0) + 1 | 0, y); + return arr$0; + } + function add_in_leaf(key, value, pairs){ + var + len = caml_call1(Fmlib_std_Array[1], pairs), + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(exact) + return [0, + [0, caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]; + if(len < max_keys) + return [0, + [0, caml_call3(Fmlib_std_Array[12], i, [0, key, value], pairs)]]; + var _a7_ = [0, key, value]; + function insert_subarray$0(_a8_, _a9_){ + return insert_subarray(pairs, i, _a7_, _a8_, _a9_); + } + var k = order / 2 | 0; + if(odd_order){ + if(i === k){ + var left = subarray(pairs, 0, k), right = subarray(pairs, k, len); + return [1, [0, left], [0, key, value], [0, right]]; + } + if(i < k){ + var + left$0 = insert_subarray$0(0, k - 1 | 0), + right$0 = subarray(pairs, k, len); + return [1, + [0, left$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$0]]; + } + var + left$1 = subarray(pairs, 0, k), + right$1 = insert_subarray$0(k + 1 | 0, len); + return [1, + [0, left$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [0, right$1]]; + } + if(i < k){ + var + left$2 = insert_subarray$0(0, k - 1 | 0), + right$2 = subarray(pairs, k, len); + return [1, + [0, left$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$2]]; + } + var + left$3 = subarray(pairs, 0, k - 1 | 0), + right$3 = insert_subarray$0(k, len); + return [1, + [0, left$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$3]]; + } + function add_in_node(i, left, pair, right, pairs, children){ + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(len < max_keys){ + var + pairs$0 = caml_call3(Fmlib_std_Array[12], i, pair, pairs), + children$0 = caml_call3(Fmlib_std_Array[12], i, left, children); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return [0, [1, pairs$0, children$0]]; + } + var k = order / 2 | 0; + function insert_subarray$0(_a5_, _a6_){ + return insert_subarray(pairs, i, pair, _a5_, _a6_); + } + function split_subarray$0(start, beyond){ + return split_subarray(children, i, left, right, start, beyond); + } + if(odd_order){ + if(i === k){ + var + left_pairs = subarray(pairs, 0, k), + left_children = subarray(children, 0, k + 1 | 0), + right_pairs = subarray(pairs, k, len), + right_children = subarray(children, k, len + 1 | 0); + if(! caml_call2(Fmlib_std_Array[2], k, left_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + if(! caml_call2(Fmlib_std_Array[2], 0, right_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + caml_call3(Fmlib_std_Array[8], left_children, k, left); + caml_call3(Fmlib_std_Array[8], right_children, 0, right); + return [1, + [1, left_pairs, left_children], + pair, + [1, right_pairs, right_children]]; + } + if(i < k){ + var + left_pairs$0 = insert_subarray$0(0, k - 1 | 0), + left_children$0 = split_subarray$0(0, k), + right_pairs$0 = subarray(pairs, k, len), + right_children$0 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$0, left_children$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$0, right_children$0]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var + left_pairs$1 = subarray(pairs, 0, k), + left_children$1 = subarray(children, 0, k + 1 | 0), + right_pairs$1 = insert_subarray$0(k + 1 | 0, len), + right_children$1 = split_subarray$0(k + 1 | 0, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k, pairs)) + return [1, + [1, left_pairs$1, left_children$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [1, right_pairs$1, right_children$1]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + } + if(i < k){ + var + left_pairs$2 = insert_subarray$0(0, k - 1 | 0), + left_children$2 = split_subarray$0(0, k), + right_pairs$2 = subarray(pairs, k, len), + right_children$2 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$2, left_children$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$2, right_children$2]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + } + var + left_pairs$3 = subarray(pairs, 0, k - 1 | 0), + left_children$3 = subarray(children, 0, k), + right_pairs$3 = insert_subarray$0(k, len), + right_children$3 = split_subarray$0(k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$3, left_children$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$3, right_children$3]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + } + function add_aux(key, value, map){ + if(0 === map[0]){ + var pairs = map[1]; + return add_in_leaf(key, value, pairs); + } + var + children = map[2], + pairs$0 = map[1], + match = bsearch(key, pairs$0), + exact = match[2], + i = match[1]; + if(exact){ + var + pairs$1 = caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs$0); + return [0, [1, pairs$1, children]]; + } + if(! caml_call2(Fmlib_std_Array[2], i, children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var + match$0 = + add_aux(key, value, caml_call2(Fmlib_std_Array[5], children, i)); + if(0 === match$0[0]){ + var + child = match$0[1], + children$0 = caml_call3(Fmlib_std_Array[13], i, child, children); + return [0, [1, pairs$0, children$0]]; + } + var v = match$0[3], y = match$0[2], u = match$0[1]; + return add_in_node(i, u, y, v, pairs$0, children); + } + function add(key, value, map){ + var match = add_aux(key, value, map); + if(0 === match[0]){var map$0 = match[1]; return map$0;} + var right = match[3], pair = match[2], left = match[1]; + return [1, [0, pair], [0, left, right]]; + } + function not_minimal(pairs){ + return min_keys < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + function replace2(i, left, right, children){ + var children$0 = caml_call1(Fmlib_std_Array[21], children); + if(! caml_call2(Fmlib_std_Array[2], i, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _x_], 1); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i, left); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return children$0; + } + function rotate_keys(to_left, i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _y_], 1); + if(to_left){ + var + _aX_ = caml_call1(Fmlib_std_Array[15], right), + _aY_ = caml_call1(Fmlib_std_Array[6], right), + _aZ_ = caml_call3(Fmlib_std_Array[13], i, _aY_, parent), + _a0_ = caml_call2(Fmlib_std_Array[5], parent, i); + return [0, caml_call2(Fmlib_std_Array[27], _a0_, left), _aZ_, _aX_]; + } + var + _a1_ = caml_call2(Fmlib_std_Array[5], parent, i), + _a2_ = caml_call2(Fmlib_std_Array[28], _a1_, right), + _a3_ = caml_call1(Fmlib_std_Array[7], left), + _a4_ = caml_call3(Fmlib_std_Array[13], i, _a3_, parent); + return [0, caml_call1(Fmlib_std_Array[16], left), _a4_, _a2_]; + } + function rotate_children(to_left, left, right){ + if(to_left){ + var + _aT_ = caml_call1(Fmlib_std_Array[15], right), + _aU_ = caml_call1(Fmlib_std_Array[6], right); + return [0, caml_call2(Fmlib_std_Array[27], _aU_, left), _aT_]; + } + var + _aV_ = caml_call1(Fmlib_std_Array[7], left), + _aW_ = caml_call2(Fmlib_std_Array[28], _aV_, right); + return [0, caml_call1(Fmlib_std_Array[16], left), _aW_]; + } + function merge_keys(i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + var + len_left = caml_call1(Fmlib_std_Array[1], left), + len_right = caml_call1(Fmlib_std_Array[1], right), + _aS_ = caml_call2(Fmlib_std_Array[5], parent, i), + merged = + caml_call2 + (Fmlib_std_Array[9], (len_left + 1 | 0) + len_right | 0, _aS_), + parent$0 = caml_call2(Fmlib_std_Array[14], i, parent); + caml_call5(Fmlib_std_Array[23], left, 0, merged, 0, len_left); + caml_call5 + (Fmlib_std_Array[23], right, 0, merged, len_left + 1 | 0, len_right); + return [0, merged, parent$0]; + } + function merge_leaves(i, pair, pairs1, pairs2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + merged = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + caml_call3(Fmlib_std_Array[8], children$0, i, [0, merged]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function merge_nodes + (i, pair, pairs1, children1, pairs2, children2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + pairs_new = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0, + children_new = caml_call2(Fmlib_std_Array[11], children1, children2); + caml_call3 + (Fmlib_std_Array[8], children$0, i, [1, pairs_new, children_new]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function handle_underflow + (i, underflow_left, left_child, right_child, pair, pairs, children){ + function not_minimal$0(pairs1, pairs2){ + return underflow_left ? not_minimal(pairs2) : not_minimal(pairs1); + } + if(0 === left_child[0]){ + var pairs1 = left_child[1]; + if(0 === right_child[0]){ + var pairs2 = right_child[1]; + if(! not_minimal$0(pairs1, pairs2)) + return merge_leaves(i, pair, pairs1, pairs2, pairs, children); + var + match = rotate_keys(underflow_left, i, pairs1, pairs, pairs2), + pairs2$0 = match[3], + pairs$0 = match[2], + pairs1$0 = match[1], + children$0 = replace2(i, [0, pairs1$0], [0, pairs2$0], children); + return [0, [1, pairs$0, children$0], pair, 0]; + } + } + else{ + var children1 = left_child[2], pairs1$1 = left_child[1]; + if(0 !== right_child[0]){ + var pairs2$1 = right_child[1], children2 = right_child[2]; + if(not_minimal$0(pairs1$1, pairs2$1)){ + var + match$0 = rotate_keys(underflow_left, i, pairs1$1, pairs, pairs2$1), + pairs2$2 = match$0[3], + pairs$1 = match$0[2], + pairs1$2 = match$0[1], + match$1 = rotate_children(underflow_left, children1, children2), + children2$0 = match$1[2], + children1$0 = match$1[1], + children$1 = + replace2 + (i, + [1, pairs1$2, children1$0], + [1, pairs2$2, children2$0], + children); + return [0, [1, pairs$1, children$1], pair, 0]; + } + var children2$1 = right_child[2]; + return merge_nodes + (i, + pair, + pairs1$1, + children1, + pairs2$1, + children2$1, + pairs, + children); + } + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _C_], 1); + } + function handle_delete(i, pair, d, pairs, children){ + if(! d[3]) + return [0, + [1, pairs, caml_call3(Fmlib_std_Array[13], i, d[1], children)], + pair, + 0]; + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(i < len){ + var _aQ_ = caml_call2(Fmlib_std_Array[5], children, i + 1 | 0); + return handle_underflow(i, 1, d[1], _aQ_, pair, pairs, children); + } + var i$0 = i - 1 | 0, _aR_ = d[1]; + return handle_underflow + (i$0, + 0, + caml_call2(Fmlib_std_Array[5], children, i$0), + _aR_, + pair, + pairs, + children); + } + function remove_last(map){ + if(0 === map[0]){ + var pairs = map[1], len = caml_call1(Fmlib_std_Array[1], pairs); + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + var + pair = caml_call1(Fmlib_std_Array[7], pairs), + pairs$0 = caml_call1(Fmlib_std_Array[16], pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, pairs$0], pair, underflow]; + } + var + children = map[2], + pairs$1 = map[1], + len$0 = caml_call1(Fmlib_std_Array[1], pairs$1); + if((len$0 + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var d = remove_last(caml_call2(Fmlib_std_Array[5], children, len$0)); + return handle_delete(len$0, d[2], d, pairs$1, children); + } + function remove_aux(key, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact) return 0; + var + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$0 = bsearch(key, pairs$1), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0){ + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [0, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + _aO_ = remove_aux(key, caml_call2(Fmlib_std_Array[5], children, i$0)); + function _aP_(d){return handle_delete(i$0, d[2], d, pairs$1, children);} + return caml_call2(Fmlib_std_Option[5], _aP_, _aO_); + } + function remove(key, map){ + var match = remove_aux(key, map); + if(! match) return map; + var d = match[1], match$0 = d[1]; + if(1 === match$0[0]){ + var children = match$0[2], pairs = match$0[1]; + if(caml_call1(Fmlib_std_Array[3], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function update_aux(key, f, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact){ + var match$1 = caml_call1(f, 0); + if(! match$1) return [0, [0, map]]; + var value$0 = match$1[1]; + return [0, add_in_leaf(key, value$0, pairs)]; + } + var + match$0 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]]); + if(match$0){ + var value = match$0[1]; + return [0, + [0, + [0, + caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]]; + } + var + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + underflow = min_keys === caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + return [1, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$2 = bsearch(key, pairs$1), + exact$0 = match$2[2], + i$0 = match$2[1]; + if(exact$0){ + var + match$3 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs$1, i$0)[2]]); + if(match$3){ + var value$1 = match$3[1]; + return [0, + [0, + [1, + caml_call3 + (Fmlib_std_Array[13], i$0, [0, key, value$1], pairs$1), + children]]]; + } + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [1, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + match$4 = + update_aux(key, f, caml_call2(Fmlib_std_Array[5], children, i$0)); + if(0 !== match$4[0]){ + var d$0 = match$4[1]; + return [1, handle_delete(i$0, d$0[2], d$0, pairs$1, children)]; + } + var match$5 = match$4[1]; + if(0 === match$5[0]){ + var child = match$5[1]; + return [0, + [0, + [1, + pairs$1, + caml_call3(Fmlib_std_Array[13], i$0, child, children)]]]; + } + var v = match$5[3], y = match$5[2], u = match$5[1]; + return [0, add_in_node(i$0, u, y, v, pairs$1, children)]; + } + function update(key, f, map){ + var match = update_aux(key, f, map); + if(0 === match[0]){ + var match$0 = match[1]; + if(0 === match$0[0]){var map$0 = match$0[1]; return map$0;} + var v = match$0[3], y = match$0[2], u = match$0[1]; + return [1, [0, y], [0, u, v]]; + } + var d = match[1], match$1 = d[1]; + if(1 === match$1[0]){ + var children = match$1[2], pairs = match$1[1]; + if(0 === caml_call1(Fmlib_std_Array[1], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function has_more(source){ + var _aN_ = source[1], match = _aN_[1]; + if(0 === match[0]){ + var i = _aN_[2], pairs = match[1]; + return i < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + var i$0 = _aN_[2], pairs$0 = match[1]; + return i$0 < caml_call1(Fmlib_std_Array[1], pairs$0) ? 1 : 0; + } + function peek(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var _aM_ = source[1], match = _aM_[1]; + if(0 === match[0]){ + var i = _aM_[2], pairs = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs, i); + } + var i$0 = _aM_[2], pairs$0 = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs$0, i$0); + } + function down(tree, stack){ + var tree$0 = tree, stack$0 = stack; + for(;;){ + if(0 === tree$0[0]){ + var pairs = tree$0[1]; + return [0, [0, [0, pairs], 0], stack$0]; + } + var + children = tree$0[2], + pairs$0 = tree$0[1], + stack$1 = [0, [0, pairs$0, children, 0], stack$0], + tree$1 = caml_call2(Fmlib_std_Array[5], children, 0), + tree$0 = tree$1, + stack$0 = stack$1; + } + } + function up(stack){ + var stack$0 = stack; + for(;;){ + if(! stack$0) return [0, [0, empty, 0], 0]; + var + stack$1 = stack$0[2], + match = stack$0[1], + i = match[3], + children = match[2], + pairs = match[1]; + if(i < caml_call1(Fmlib_std_Array[1], pairs)) + return [0, [0, [1, pairs, children], i], stack$1]; + var stack$0 = stack$1; + } + } + function advance(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + var _aK_ = source[1], match = _aK_[1]; + if(0 === match[0]){ + var i = _aK_[2], pairs = match[1]; + return (i + 1 | 0) < caml_call1(Fmlib_std_Array[1], pairs) + ? [0, [0, [0, pairs], i + 1 | 0], source[2]] + : up(source[2]); + } + var i$0 = _aK_[2], children = match[2], pairs$0 = match[1]; + if(i$0 >= caml_call1(Fmlib_std_Array[1], pairs$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + var _aL_ = [0, [0, pairs$0, children, i$0 + 1 | 0], source[2]]; + return down(caml_call2(Fmlib_std_Array[5], children, i$0 + 1 | 0), _aL_); + } + function make_source(tree){return down(tree, 0);} + function Source(Value){return [0, has_more, peek, advance, make_source];} + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set0(Order, Key){ + var + Map = Map0(Order, Key), + is_empty = Map[5], + cardinal = Map[6], + empty = Map[7]; + function fold_left(f, start, set){ + function _aI_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[8], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[9], _aH_, start, set); + } + function mem(key, set){return caml_call2(Map[13], key, set) ? 1 : 0;} + function add(key, set){return caml_call3(Map[20], key, 0, set);} + function remove(key, set){return caml_call2(Map[32], key, set);} + function elements(set){return caml_call1(Map[11], set);} + var M = caml_call1(Map[41], [0]), has_more = M[1]; + function peek(source){return caml_call1(M[2], source)[1];} + var + advance = M[3], + make = M[4], + Source = [0, M, has_more, peek, advance, make]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + Source]; + } + function Map(Key){ + var + include = Map0(O32, Key), + order = include[1], + odd_order = include[2], + max_keys = include[3], + min_keys = include[4], + is_empty = include[5], + cardinal = include[6], + empty = include[7], + fold_left = include[8], + fold_right = include[9], + bindings = include[10], + keys = include[11], + bsearch = include[12], + find_opt = include[13], + subarray = include[14], + insert_subarray = include[15], + split_subarray = include[16], + add_in_leaf = include[17], + add_in_node = include[18], + add_aux = include[19], + add = include[20], + not_minimal = include[21], + replace2 = include[22], + rotate_keys = include[23], + rotate_children = include[24], + merge_keys = include[25], + merge_leaves = include[26], + merge_nodes = include[27], + handle_underflow = include[28], + handle_delete = include[29], + remove_last = include[30], + remove_aux = include[31], + remove = include[32], + update_aux = include[33], + update = include[34], + has_more = include[35], + peek = include[36], + down = include[37], + up = include[38], + advance = include[39], + make_source = include[40], + Source = include[41]; + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set_order(Order){ + var + include = Set0(Order, [0, Fmlib_std_Int[1]]), + Map = include[1], + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + function do_upward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _J_], 1); + var i = start, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(f, i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function do_downward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _K_], 1); + var i = beyond, set$0 = set; + for(;;){ + if(i === start) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(f, i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function add_upward(start, beyond, set){ + return do_upward(add, start, beyond, set); + } + function add_downward(start, beyond, set){ + return do_downward(add, start, beyond, set); + } + function remove_upward(start, beyond, set){ + return do_upward(remove, start, beyond, set); + } + function remove_downward(start, beyond, set){ + return do_downward(remove, start, beyond, set); + } + function check_range(start, beyond, set){ + var + _aE_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key){ + var + ok = param[2], + i = param[1], + _aG_ = ok ? key === i ? 1 : 0 : ok; + return [0, i + 1 | 0, _aG_]; + }, + _aE_, + set), + ok = match[2], + n = match[1], + _aF_ = n === beyond ? 1 : 0, + ok$0 = _aF_ ? ok : _aF_; + return ok$0; + } + var + M = Source[1], + has_more = Source[2], + peek = Source[3], + advance = Source[4], + make = Source[5]; + function to_list(source){ + var source$0 = source, accu = 0; + for(;;){ + if(! caml_call1(has_more, source$0)) + return caml_call1(Fmlib_std_List[11], accu); + var + accu$0 = [0, caml_call1(peek, source$0), accu], + source$1 = caml_call1(advance, source$0), + source$0 = source$1, + accu = accu$0; + } + } + var Source$0 = [0, M, has_more, peek, advance, make, to_list]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + do_upward, + do_downward, + add_upward, + add_downward, + remove_upward, + remove_downward, + check_range, + Source$0]; + } + var Set3 = Set_order([0, 3]), Set4 = Set_order([0, 4]); + function _L_(param){ + var Map$0 = Map([0, Fmlib_std_Int[1]]); + return 0 === caml_call1(Map$0[6], Map$0[7]) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map_in_cardinal_e, + 0, + cst_src_std_btree_ml, + 1052, + 0, + 75, + _L_); + function _M_(param){ + var set = caml_call3(Set4[13], 100, 200, Set4[4]); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s, + 0, + cst_src_std_btree_ml$0, + 1059, + 0, + 94, + _M_); + function _N_(param){ + var set = caml_call3(Set4[14], 0, 100, Set4[4]); + return caml_call3(Set4[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_0_100_set, + 0, + cst_src_std_btree_ml$1, + 1066, + 0, + 92, + _N_); + function _O_(param){ + var set = caml_call3(Set3[13], 100, 200, Set3[4]); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s, + 0, + cst_src_std_btree_ml$2, + 1073, + 0, + 94, + _O_); + function _P_(param){ + var set = caml_call3(Set3[14], 0, 100, Set3[4]); + return caml_call3(Set3[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_0_100_set, + 0, + cst_src_std_btree_ml$3, + 1080, + 0, + 92, + _P_); + function _Q_(param){ + var + _aD_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[15], 0, 100), _aD_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$4, + 1091, + 0, + 115, + _Q_); + function _R_(param){ + var + _aC_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[16], 0, 100), _aC_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$5, + 1096, + 0, + 117, + _R_); + function _S_(param){ + var + _aB_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[15], 0, 100), _aB_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$6, + 1101, + 0, + 115, + _S_); + function _T_(param){ + var + _aA_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[16], 0, 100), _aA_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$7, + 1106, + 0, + 117, + _T_); + var + Order = [0, 3], + include = Map0(Order, [0, Fmlib_std_Int[1]]), + is_empty = include[5], + empty = include[7], + fold_left = include[8], + add = include[20], + update = include[34]; + function do_upward(f, start, beyond, map){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _U_], 1); + var i = start, map$0 = map; + for(;;){ + if(i === beyond) return map$0; + var + map$1 = caml_call2(f, i, map$0), + i$0 = i + 1 | 0, + i = i$0, + map$0 = map$1; + } + } + function add_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(add, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function update_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(update, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function check_range(start, beyond, f, map){ + var + _ax_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key, value){ + var + ok = param[2], + i = param[1], + _az_ = ok ? caml_equal(caml_call1(f, key), value) : ok; + return [0, i + 1 | 0, _az_]; + }, + _ax_, + map), + ok = match[2], + n = match[1], + _ay_ = n === beyond ? 1 : 0, + ok$0 = _ay_ ? ok : _ay_; + return ok$0; + } + function _V_(param){ + var map = add_upward(0, 100, function(_aw_){return _aw_;}, empty); + return check_range(0, 100, function(_av_){return _av_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a, + 0, + cst_src_std_btree_ml$8, + 1185, + 0, + 113, + _V_); + function _W_(param){ + var i = 100, map = empty; + for(;;){ + if(i === 0) + return check_range(0, 100, function(_au_){return _au_;}, map); + var + i$0 = i - 1 | 0, + map$0 = caml_call3(add, i$0, i$0, map), + i = i$0, + map = map$0; + } + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$0, + 0, + cst_src_std_btree_ml$9, + 1190, + 0, + 115, + _W_); + function _X_(param){ + var + map = update_upward(0, 100, function(i, param){return [0, i];}, empty); + return check_range(0, 100, function(_at_){return _at_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_u, + 0, + cst_src_std_btree_ml$10, + 1199, + 0, + 129, + _X_); + function _Y_(param){ + var + _aq_ = add_upward(0, 100, function(_as_){return _as_;}, empty), + map = + update_upward + (0, + 100, + function(param){ + function _ar_(i){return 2 * i | 0;} + return caml_call1(Fmlib_std_Option[5], _ar_); + }, + _aq_); + return check_range(0, 100, function(i){return 2 * i | 0;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$1, + 0, + cst_src_std_btree_ml$11, + 1205, + 0, + 213, + _Y_); + function _Z_(param){ + var + _an_ = add_upward(0, 100, function(_ap_){return _ap_;}, empty), + map = update_upward(0, 100, function(param, _ao_){return 0;}, _an_); + return caml_call1(is_empty, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$2, + 0, + cst_src_std_btree_ml$12, + 1215, + 0, + 166, + _Z_); + function ___(param){ + function f(i){return ((i / 2 | 0) * 2 | 0) === i ? i : 2 * i | 0;} + var + _af_ = add_upward(0, 100, function(_am_){return _am_;}, empty), + _ai_ = add_upward(200, 300, function(_al_){return _al_;}, _af_), + _ah_ = + update_upward + (0, + 100, + function(param){return caml_call1(Fmlib_std_Option[5], f);}, + _ai_), + _ag_ = + update_upward(100, 200, function(i, param){return [0, f(i)];}, _ah_), + map = + update_upward + (0, + 300, + function(i){ + if(200 <= i) return function(param){return 0;}; + function _aj_(_ak_){return _ak_;} + return caml_call1(Fmlib_std_Option[5], _aj_); + }, + _ag_); + return check_range(0, 200, f, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_f_i_i, + 0, + cst_src_std_btree_ml$13, + 1226, + 0, + 540, + ___); + function _$_(param){ + var + set = caml_call3(Set3[13], 0, 20, Set3[4]), + _ae_ = caml_call1(Set3[18][5], set); + return caml_equal(caml_call1(Set3[18][6], _ae_), _aa_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Set3_in_let_modul, + 0, + cst_src_std_btree_ml$14, + 1260, + 0, + 253, + _$_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _ab_(_ac_){ + var _ad_ = Map(_ac_); + return [0, + _ad_[5], + _ad_[6], + _ad_[8], + _ad_[9], + _ad_[10], + _ad_[13], + _ad_[7], + _ad_[20], + _ad_[32], + _ad_[34], + _ad_[40], + _ad_[35], + _ad_[36], + _ad_[39], + _ad_[41]]; + } + var + Fmlib_std_Btree = + [0, + function(Key){ + var + include = Set0(O32, Key), + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + return [0, + is_empty, + cardinal, + mem, + fold_left, + fold_right, + elements, + empty, + add, + remove, + [0, Source[2], Source[3], Source[4], Source[5]]]; + }, + _ab_]; + runtime.caml_register_global(88, Fmlib_std_Btree, "Fmlib_std__Btree"); + return; + } + (globalThis)); + + +//# 1 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_cannot_decode_message$1 = "cannot decode message", + cst_provided_callback_is_not_a$1 = "provided callback is not a function", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_List = global_data.Fmlib_std__List, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Stdlib_Float = global_data.Stdlib__Float, + null$0 = Js_of_ocaml_Js[1], + undefined$0 = Js_of_ocaml_Js[3], + cst_cannot_decode_message$0 = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a$0 = cst_provided_callback_is_not_a$1, + cst_cannot_decode_state = "cannot decode state", + cst_cannot_decode_a_nullable_e = "cannot decode a nullable element id", + cst_cannot_decode_message = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a = cst_provided_callback_is_not_a$1, + cst_cannot_decode_input_data = "cannot decode input data", + cst_init = "init", + _b_ = [0, "src/js/base.ml", 283, 12]; + function int$0(i){return i;} + function float$0(v){return v;} + var + bool = runtime.caml_js_from_bool, + string = caml_jsstring_of_string, + object = runtime.caml_js_object, + array = runtime.caml_js_from_array; + function function1(f){return f;} + function function2(f){return f;} + function function3(f){return f;} + function stringify(v){ + try{var _G_ = [0, Js_of_ocaml_Js[38].stringify(v)]; return _G_;} + catch(_H_){return 0;} + } + function parse(v){ + try{var _E_ = [0, Js_of_ocaml_Js[38].parse(v)]; return _E_;} + catch(_F_){return 0;} + } + var + Value = + [0, + null$0, + undefined$0, + int$0, + float$0, + bool, + string, + object, + array, + function1, + function2, + function3, + stringify, + parse]; + function is_function(v){return typeof v === "function" ? 1 : 0;} + function return$0(a, param){return [0, a];} + function fail(param){return 0;} + function value(v){return [0, v];} + function let$0(m, f, v){ + function _C_(a){return caml_call2(f, a, v);} + var _D_ = caml_call1(m, v); + return caml_call2(Fmlib_std_Option[3], _D_, _C_); + } + function symbol(p, q, v){ + var r = caml_call1(p, v); + return r ? r : caml_call1(q, v); + } + function map(f, m){ + function _y_(a){ + var _A_ = caml_call1(f, a); + return function(_B_){return [0, _A_];}; + } + return function(_z_){return let$0(m, _y_, _z_);}; + } + function null$1(a, obj){return obj === Value[1] ? [0, a] : 0;} + function undefined$1(a, obj){return obj === Value[2] ? [0, a] : 0;} + function float$1(v){return typeof v === "number" ? [0, v.valueOf(0)] : 0;} + function _a_(v){ + var i = v | 0; + return caml_call2(Stdlib_Float[20], v, i) + ? function(_x_){return [0, i];} + : fail; + } + function int$1(_w_){return let$0(float$1, _a_, _w_);} + function bool$0(v){return typeof v === "boolean" ? [0, v | 0] : 0;} + function string$0(v){ + return typeof v === "string" ? [0, runtime.caml_string_of_jsstring(v)] : 0; + } + function function$0(v){ + return is_function(v) + ? [0, function(args){return runtime.caml_js_fun_call(v, args);}] + : 0; + } + function method(v){ + return is_function(v) + ? [0, + function(obj, args){return runtime.caml_js_call(v, obj, args);}] + : 0; + } + function field(name, decode, obj){ + function _t_(v){return caml_call1(decode, v);} + var + _u_ = obj[caml_jsstring_of_string(name)], + _v_ = caml_call1(Js_of_ocaml_Js[6][10], _u_); + return caml_call2(Fmlib_std_Option[3], _v_, _t_); + } + function array$0(decode, obj){ + var t6 = Js_of_ocaml_Js[52][1]; + if(! t6.Array.isArray(obj)) return 0; + var len = obj.length; + function extract(i, lst){ + if(i === len){ + var _n_ = caml_call1(Fmlib_std_List[11], lst); + return [0, caml_call1(Fmlib_std_Array[30], _n_)]; + } + function _o_(e){ + function _r_(a){return extract(i + 1 | 0, [0, a, lst]);} + var _s_ = caml_call1(decode, e); + return caml_call2(Fmlib_std_Option[3], _s_, _r_); + } + var + _p_ = caml_call2(Js_of_ocaml_Js[20], obj, i), + _q_ = caml_call1(Js_of_ocaml_Js[6][10], _p_); + return caml_call2(Fmlib_std_Option[3], _q_, _o_); + } + return extract(0, 0); + } + function option(decode){ + var _i_ = 0; + function _j_(_m_){return null$1(_i_, _m_);} + var _k_ = map(Fmlib_std_Option[1], decode); + return function(_l_){return symbol(_k_, _j_, _l_);}; + } + function of_exception(exn){return caml_call1(Js_of_ocaml_Js[37][7], exn);} + function raise_js_error(js_error){ + return caml_call1(Js_of_ocaml_Js[37][5], js_error); + } + function raise_js(message){ + var + js_msg = caml_jsstring_of_string(message), + _g_ = new Js_of_ocaml_Js[36](js_msg), + _h_ = caml_call1(Js_of_ocaml_Js[37][9], _g_); + return caml_call1(Js_of_ocaml_Js[37][5], _h_); + } + function log_string(str){ + var t12 = Js_of_ocaml_Js[52][1]; + return t12.console.log(caml_jsstring_of_string(str)); + } + function log_value(value){ + var t15 = Js_of_ocaml_Js[52][1]; + return t15.console.log(value); + } + function export$0(obj){ + var _f_ = caml_call1(Value[7], obj); + return caml_call1(Js_of_ocaml_Js[51], _f_); + } + function make_global(name, v){ + return Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)] = v; + } + function get_global(name){ + var _e_ = Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)]; + return caml_call1(Js_of_ocaml_Js[5][10], _e_); + } + function new_global(cname, args){ + var match = get_global(cname); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var constr = match[1]; + return runtime.caml_js_new(constr, args); + } + function decode_callback(cb, err){ + var match = function$0(cb); + if(! match) return raise_js(err); + var cb$0 = match[1]; + return function(v){caml_call1(cb$0, [0, v]); return 0;}; + } + function decode_data(dec, data, err){ + var match = caml_call1(dec, data); + if(! match) return raise_js(err); + var state = match[1]; + return state; + } + function node_module(decode, msg_decode, node_function){ + function js_function(data, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a), + data$0 = decode_data(decode, data, cst_cannot_decode_input_data), + f = caml_call2(node_function, data$0, callback$0); + function _d_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _d_); + } + return export$0([0, [0, cst_init, caml_call1(Value[10], js_function)]]); + } + function browser_application + (app_name, state_decode, msg_decode, browser_function){ + function js_function(state, element, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a$0), + state$0 = decode_data(state_decode, state, cst_cannot_decode_state), + element$0 = + decode_data(option(string$0), element, cst_cannot_decode_a_nullable_e), + f = caml_call3(browser_function, state$0, element$0, callback$0); + function _c_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message$0); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _c_); + } + return make_global(app_name, caml_call1(Value[11], js_function)); + } + var + Fmlib_js_Base = + [0, + Value, + [0, + return$0, + fail, + value, + let$0, + let$0, + symbol, + map, + null$1, + undefined$1, + float$1, + int$1, + bool$0, + string$0, + function$0, + method, + field, + array$0, + option], + [0, + of_exception, + raise_js_error, + raise_js, + log_string, + log_value, + node_module, + browser_application, + make_global, + get_global, + new_global, + export$0]]; + runtime.caml_register_global(29, Fmlib_js_Base, "Fmlib_js__Base"); + return; + } + (globalThis)); + +//# 300 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function value(e){return e;} + function stop_propagation(e){return e.stopPropagation(0);} + function prevent_default(e){return e.preventDefault(0);} + var Fmlib_js_Event = [0, value, stop_propagation, prevent_default]; + runtime.caml_register_global(2, Fmlib_js_Event, "Fmlib_js__Event"); + return; + } + (globalThis)); + +//# 315 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function add(name, handler, tgt){ + return tgt.addEventListener(caml_jsstring_of_string(name), handler); + } + function remove(name, handler, tgt){ + return tgt.removeEventListener(caml_jsstring_of_string(name), handler); + } + var Fmlib_js_Event_target = [0, add, remove]; + runtime.caml_register_global + (2, Fmlib_js_Event_target, "Fmlib_js__Event_target"); + return; + } + (globalThis)); + +//# 336 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function set(f, ms){return Js_of_ocaml_Js[52][1].setTimeout(f, ms);} + function clear(t){return Js_of_ocaml_Js[52][1].clearTimeout(t);} + function set_interval(f, ms){ + return Js_of_ocaml_Js[52][1].setInterval(f, ms); + } + function clear_interval(t){return Js_of_ocaml_Js[52][1].clearInterval(t);} + var Fmlib_js_Timer = [0, set, clear, set_interval, clear_interval]; + runtime.caml_register_global(5, Fmlib_js_Timer, "Fmlib_js__Timer"); + return; + } + (globalThis)); + +//# 544 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Stdlib_List = global_data.Stdlib__List; + function event_target(req){return req;} + function make(method, url, headers, body){ + var + t0 = Js_of_ocaml_Js[52][1], + request = t0.XMLHttpRequest, + req = new request(); + req.open(caml_jsstring_of_string(method), caml_jsstring_of_string(url)); + function _a_(param){ + var value = param[2], name = param[1]; + return req.setRequestHeader + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + caml_call2(Stdlib_List[17], _a_, headers); + req.send(caml_jsstring_of_string(body)); + return req; + } + function ready_state(req){return req.readyState;} + function status(req){return req.status;} + function response_text_value(req){return req.responseText;} + function response_text_string(req){ + return runtime.caml_string_of_jsstring(req.responseText); + } + var + Fmlib_js_Http_request = + [0, + event_target, + make, + ready_state, + status, + response_text_value, + response_text_string]; + runtime.caml_register_global + (10, Fmlib_js_Http_request, "Fmlib_js__Http_request"); + return; + } + (globalThis)); + +//# 598 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_js_dom_ml = "src/js/dom.ml", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + _b_ = [0, cst_src_js_dom_ml, 257, 8], + _a_ = [0, cst_src_js_dom_ml, 147, 8]; + function set(name, value, s){ + return s.setProperty + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove(name, s){ + return s.removeProperty(caml_jsstring_of_string(name)); + } + var Style = [0, set, remove]; + function event_target(node){return node;} + function parent(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.parentNode); + } + function first(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.firstChild); + } + function next(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.nextSibling); + } + function append(child, node){ + if(node === Fmlib_js_Base[1][1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return node.appendChild(child); + } + function remove$0(child, node){return node.removeChild(child);} + function replace(new_child, old_child, node){ + return node.replaceChild(new_child, old_child); + } + function remove_children(parent){ + for(;;){ + var match = first(parent); + if(! match) return 0; + var child = match[1]; + parent.removeChild(child); + } + } + function node_value(node){return caml_string_of_jsstring(node.nodeValue);} + function set_node_value(value, node){ + var t16 = caml_jsstring_of_string(value); + return node.nodeValue = t16; + } + var + Node = + [0, + event_target, + parent, + first, + next, + append, + remove$0, + replace, + remove_children, + node_value, + set_node_value]; + function node(element){return element;} + function scroll_width(element){return element.scrollWidth;} + function scroll_height(element){return element.scrollHeight;} + function client_width(element){return element.clientWidth;} + function client_height(element){return element.clientHeight;} + function scroll_left(element){return element.scrollLeft;} + function scroll_top(element){return element.scrollTop;} + function set_scroll_left(t24, element){return element.scrollLeft = t24;} + function set_scroll_top(t26, element){return element.scrollTop = t26;} + function style(element){return element.style;} + function set_attribute(name, value, element){ + return element.setAttribute + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove_attribute(name, element){ + return element.removeAttribute(caml_jsstring_of_string(name)); + } + function set_property(name, value, element){ + return element[caml_jsstring_of_string(name)] = value; + } + function delete_property(name, element){ + return delete element[caml_jsstring_of_string(name)]; + } + function focus(element){return element.focus(0);} + function blur(element){return element.blur(0);} + var + Element = + [0, + node, + scroll_width, + scroll_height, + client_width, + client_height, + scroll_left, + scroll_top, + set_scroll_left, + set_scroll_top, + style, + set_attribute, + remove_attribute, + set_property, + delete_property, + focus, + blur]; + function title(doc){return caml_string_of_jsstring(doc.title);} + function set_title(title, doc){ + var t39 = caml_jsstring_of_string(title); + return doc.title = t39; + } + function body(doc){ + if(doc.body !== null) return doc.body; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function find(name, doc){ + var _c_ = doc.getElementById(caml_jsstring_of_string(name)); + return caml_call1(Js_of_ocaml_Js[5][10], _c_); + } + function create_element(tag, doc){ + return doc.createElement(caml_jsstring_of_string(tag)); + } + function create_text_node(text, doc){ + return doc.createTextNode(caml_jsstring_of_string(text)); + } + function create_element_ns(namespace, tag, doc){ + return doc.createElementNS + (caml_jsstring_of_string(namespace), caml_jsstring_of_string(tag)); + } + function create_document_fragment(doc){return doc.createDocumentFragment(0); + } + var + Document = + [0, + title, + set_title, + body, + find, + create_element, + create_text_node, + create_element_ns, + create_document_fragment]; + function go(i, history){return history.go(i);} + function push_state(state, title, url, history){ + return history.pushState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + function replace_state(state, title, url, history){ + return history.replaceState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + var History = [0, go, push_state, replace_state]; + function href(location){return caml_string_of_jsstring(location.href);} + function protocol(location){ + return caml_string_of_jsstring(location.protocol); + } + function host(location){return caml_string_of_jsstring(location.host);} + function port(location){return caml_string_of_jsstring(location.port);} + function pathname(location){ + return caml_string_of_jsstring(location.pathname); + } + function search(location){return caml_string_of_jsstring(location.search);} + function hash(location){return caml_string_of_jsstring(location.hash);} + function assign(url, location){ + return location.assign(caml_jsstring_of_string(url)); + } + function reload(location){return location.reload(0);} + var + Location = + [0, href, protocol, host, port, pathname, search, hash, assign, reload]; + function get(param){return Js_of_ocaml_Js[52][1];} + function event_target$0(w){return w;} + function document(t75){return t75.document;} + function history(t76){return t76.history;} + function location(t77){return t77.location;} + function on_next_animation(callback, w){ + return w.requestAnimationFrame(callback); + } + var + Window = + [0, get, event_target$0, document, history, location, on_next_animation], + Fmlib_js_Dom = + [0, Node, Style, Element, Document, Location, History, Window]; + runtime.caml_register_global(54, Fmlib_js_Dom, "Fmlib_js__Dom"); + return; + } + (globalThis)); + +//# 804 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function now(param){return new Js_of_ocaml_Js[26]();} + function make(year, month, day, hour, minute, second, milli){ + return new + Js_of_ocaml_Js[33] + (year, month, day, hour, minute, second, milli); + } + function of_value(v){return new Js_of_ocaml_Js[27](v);} + function value(d){return d.valueOf();} + function zone_offset(d){return d.getTimezoneOffset();} + function add(ms, d){return of_value(d.valueOf() + ms);} + function day(d){return d.getDay();} + function date(d){return d.getDate();} + function month(d){return d.getMonth();} + function year(d){return d.getFullYear();} + function hours(d){return d.getHours();} + function minutes(d){return d.getMinutes();} + function seconds(d){return d.getSeconds();} + function milliseconds(d){return d.getMilliseconds();} + var + Fmlib_js_Date = + [0, + now, + value, + of_value, + zone_offset, + add, + make, + day, + date, + month, + year, + hours, + minutes, + seconds, + milliseconds]; + runtime.caml_register_global(11, Fmlib_js_Date, "Fmlib_js__Date"); + return; + } + (globalThis)); + + +//# 1 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_dictionary_ml = "src/browser/dictionary.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_std_String = global_data.Fmlib_std__String, + _c_ = [0, cst_src_browser_dictionary_ml, 77, 12], + _b_ = [0, cst_src_browser_dictionary_ml, 51, 17], + _a_ = [0, cst_src_browser_dictionary_ml, 53, 17]; + function Make(Key){ + var Map = caml_call1(Fmlib_std_Btree[2], Key), empty = [0, [0], Map[7]]; + function find_opt(key, d){ + var _n_ = caml_call2(Map[6], key, d[2]); + function _o_(i){ + if(i >= caml_call1(Fmlib_std_Array[1], d[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + match = caml_call2(Fmlib_std_Array[5], d[1], i), + v = match[2], + k = match[1]; + if(caml_equal(k, key)) return v; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + return caml_call2(Fmlib_std_Option[5], _o_, _n_); + } + function add(key, value, d){ + if(caml_call2(Map[6], key, d[2])) return d; + var + n = caml_call1(Fmlib_std_Array[1], d[1]), + _m_ = caml_call3(Map[8], key, n, d[2]); + return [0, caml_call2(Fmlib_std_Array[27], [0, key, value], d[1]), _m_]; + } + function set(key, f, d){ + var match = caml_call2(Map[6], key, d[2]); + if(! match) return add(key, caml_call1(f, 0), d); + var + idx = match[1], + match$0 = caml_call2(Fmlib_std_Array[5], d[1], idx), + v = match$0[2], + k = match$0[1]; + if(! caml_equal(k, key)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _j_ = d[2], _k_ = d[1], _l_ = [0, key, caml_call1(f, [0, v])]; + return [0, caml_call3(Fmlib_std_Array[13], idx, _l_, _k_), _j_]; + } + function of_list(lst){ + var d = empty, param = lst; + for(;;){ + if(! param) return d; + var + tl = param[2], + match = param[1], + value = match[2], + key = match[1], + d$0 = add(key, value, d), + d = d$0, + param = tl; + } + } + function fold(f, accu, d){ + var _h_ = d[1]; + function _i_(accu, param){ + var value = param[2], key = param[1]; + return caml_call3(f, accu, key, value); + } + return caml_call3(Fmlib_std_Array[18], _i_, accu, _h_); + } + function iter(f, dict){ + var _f_ = dict[1]; + function _g_(param){ + var value = param[2], key = param[1]; + return caml_call2(f, key, value); + } + return caml_call2(Stdlib_Array[11], _g_, _f_); + } + function diff(add, set, remove, d1, d2){ + iter + (function(key, param){ + return find_opt(key, d1) ? 0 : caml_call1(remove, key); + }, + d2); + return iter + (function(key, value){ + var match = find_opt(key, d2); + if(! match) return caml_call2(add, key, value); + var value2 = match[1]; + return value === value2 ? 0 : caml_call2(set, key, value); + }, + d1); + } + return [0, Map, empty, find_opt, add, set, of_list, fold, iter, diff]; + } + var + include = Make([0, Fmlib_std_String[4]]), + empty = include[2], + find_opt = include[3], + add = include[4], + set = include[5], + of_list = include[6], + fold = include[7], + iter = include[8], + diff = include[9], + Fmlib_browser_Dictionary = + [0, + function(_d_){ + var _e_ = Make(_d_); + return [0, + _e_[2], + _e_[3], + _e_[4], + _e_[5], + _e_[6], + _e_[7], + _e_[8], + _e_[9]]; + }, + empty, + find_opt, + add, + set, + of_list, + fold, + iter, + diff]; + runtime.caml_register_global + (9, Fmlib_browser_Dictionary, "Fmlib_browser__Dictionary"); + return; + } + (globalThis)); + +//# 172 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + prevent = [0, 1], + no_prevent = [0, 0], + stop = [0, 1], + no_stop = [0, 0], + Fmlib_browser_Event_flag = [0, prevent, no_prevent, stop, no_stop]; + runtime.caml_register_global + (4, Fmlib_browser_Event_flag, "Fmlib_browser__Event_flag"); + return; + } + (globalThis)); + +//# 189 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + utc = 0; + function make(minutes){return minutes;} + function offset(zone){return zone;} + var Zone = [0, utc, make, offset], zero = caml_call1(Fmlib_js_Date[3], 0.); + function adapt(time, zone){ + var _h_ = 60000. * (caml_call1(Fmlib_js_Date[4], time) - zone | 0); + return caml_call2(Fmlib_js_Date[5], _h_, time); + } + function year(time, zone){ + var _g_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[10], _g_); + } + function month(time, zone){ + var _f_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[9], _f_); + } + function day_of_month(time, zone){ + var _e_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[8], _e_); + } + function hour(time, zone){ + var _d_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[11], _d_); + } + function minute(time, zone){ + var _c_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[12], _c_); + } + function second(time, zone){ + var _b_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[13], _b_); + } + function milli_second(time, zone){ + var _a_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[14], _a_); + } + var + Fmlib_browser_Time = + [0, + Zone, + zero, + adapt, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second]; + runtime.caml_register_global(3, Fmlib_browser_Time, "Fmlib_browser__Time"); + return; + } + (globalThis)); + +//# 262 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + _a_ = [0, "src/browser/url.ml", 6, 8]; + function string(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + var Local = [0, string]; + function parse(str){return [0, [0, str]];} + function string$0(param){ + if(0 === param[0]){var str = param[1]; return str;} + var loc = param[1]; + return caml_call1(Local[1], loc); + } + function is_page(param){return 0 === param[0] ? 1 : 1;} + var Fmlib_browser_Url = [0, Local, parse, string$0, is_page]; + runtime.caml_register_global(2, Fmlib_browser_Url, "Fmlib_browser__Url"); + return; + } + (globalThis)); + +//# 296 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_click$1 = "click", + cst_src_browser_handler_ml = "src/browser/handler.ml", + cst_target$1 = "target", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Fmlib_js_Event = global_data.Fmlib_js__Event, + Fmlib_browser_Url = global_data.Fmlib_browser__Url, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_js_Date = global_data.Fmlib_js__Date, + Stdlib_List = global_data.Stdlib__List, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + _h_ = [0, cst_src_browser_handler_ml, 356, 12], + cst_href = "href", + cst_target = cst_target$1, + cst_click$0 = cst_click$1, + cst_click = cst_click$1, + cst_Cannot_decode_event = "Cannot decode event", + _d_ = [0, cst_src_browser_handler_ml, 78, 33], + _c_ = [0, cst_src_browser_handler_ml, 88, 21], + _b_ = [0, cst_src_browser_handler_ml, 101, 33], + _a_ = [0, cst_src_browser_handler_ml, 48, 17], + cst_tagName = "tagName", + cst_target$0 = cst_target$1; + function make(handler){ + var ref = [0, handler]; + return [0, ref, function(e){return caml_call1(ref[1], e);}]; + } + function update(handler, actual){actual[1][1] = handler; return 0;} + function fire(actual){return actual[2];} + var Actual = [0, make, update, fire]; + function Actuals(Key){ + var + Map = caml_call1(Fmlib_std_Btree[2], Key), + Dict = caml_call1(Fmlib_browser_Dictionary[1], Key); + function empty(param){return [0, Map[7]];} + function set(make, add, dict, map){ + function _Y_(key, v){ + if(0 !== caml_call2(Map[6], key, map[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + _Z_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _Z_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + map[1] = caml_call3(Map[8], key, [0, actual, a], map[1]); + return 0; + } + return caml_call2(Dict[7], _Y_, dict); + } + function update(make, add, remove, d1, d2, map){ + function _P_(key){ + var _W_ = map[1]; + function _X_(param){ + if(! param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var match = param[1], a = match[2], actual = match[1]; + caml_call3(remove, key, caml_call1(Actual[3], actual), a); + return 0; + } + map[1] = caml_call3(Map[10], key, _X_, _W_); + return 0; + } + function _Q_(key, v){ + var match = caml_call2(Map[6], key, map[1]); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var actual = match[1][1], _V_ = caml_call1(make, v); + return caml_call2(Actual[2], _V_, actual); + } + function _R_(key, v){ + var _S_ = map[1]; + function _T_(param){ + if(param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var + _U_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _U_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + return [0, [0, actual, a]]; + } + map[1] = caml_call3(Map[10], key, _T_, _S_); + return 0; + } + return caml_call5(Dict[8], _R_, _Q_, _P_, d1, d2); + } + return [0, Map, Dict, empty, set, update]; + } + function make_one(dispatch, param, event){ + var decode = param[3], prevent = param[2][1], stop = param[1][1]; + if(stop) caml_call1(Fmlib_js_Event[2], event); + if(prevent) caml_call1(Fmlib_js_Event[3], event); + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(match){var m = match[1]; return caml_call1(dispatch, m);} + caml_call1(Fmlib_js_Base[3][4], cst_Cannot_decode_event); + var _O_ = caml_call1(Fmlib_js_Event[1], event); + return caml_call1(Fmlib_js_Base[3][5], _O_); + } + function make_list(dispatch, lst, event){ + var _M_ = caml_call1(Stdlib_List[9], lst); + function _N_(v){return make_one(dispatch, v, event);} + return caml_call2(Stdlib_List[17], _N_, _M_); + } + function map(f, param){ + var decode = param[3], prevent = param[2], stop = param[1]; + return [0, stop, prevent, caml_call2(Fmlib_js_Base[2][7], f, decode)]; + } + var + Virtual = [0, make_one, make_list, map], + Actuals$0 = Actuals([0, Stdlib_String[9]]), + Dict = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = Actuals$0[3]; + function add(target, event_type, handler){ + return caml_call3(Fmlib_js_Event_target[1], event_type, handler, target); + } + function set(target, dispatch, dict, map){ + function _I_(_K_, _L_){return add(target, _K_, _L_);} + var _J_ = caml_call1(Virtual[2], dispatch); + return caml_call4(Actuals$0[4], _J_, _I_, dict, map); + } + function update$0(target, dispatch, d1, d2, map){ + function _D_(event_type, handler, param){ + return caml_call3(Fmlib_js_Event_target[2], event_type, handler, target); + } + function _E_(_G_, _H_){return add(target, _G_, _H_);} + var _F_ = caml_call1(Virtual[2], dispatch); + return caml_call6(Actuals$0[5], _F_, _E_, _D_, d1, d2, map); + } + var + EventHs = [0, Actuals$0, Dict, empty, add, set, update$0], + Actuals$1 = Actuals([0, Stdlib_Int[9]]), + Dict$0 = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + empty$0 = Actuals$1[3]; + function of_list(dispatch, lst, time){ + var _B_ = caml_call1(Stdlib_List[9], lst); + function _C_(f){return caml_call1(dispatch, caml_call1(f, time));} + return caml_call2(Stdlib_List[17], _C_, _B_); + } + function make_timer(millis, h){ + function _A_(param){ + return caml_call1(h, caml_call1(Fmlib_js_Date[1], 0)); + } + return caml_call2(Fmlib_js_Timer[3], _A_, millis); + } + function remove_timer(param, _z_, timer){ + return caml_call1(Fmlib_js_Timer[4], timer); + } + function set$0(dispatch, dict, map){ + function _w_(_x_, _y_){return of_list(dispatch, _x_, _y_);} + return caml_call4(Actuals$1[4], _w_, make_timer, dict, map); + } + function update$1(dispatch, d1, d2, map){ + function _t_(_u_, _v_){return of_list(dispatch, _u_, _v_);} + return caml_call6 + (Actuals$1[5], _t_, make_timer, remove_timer, d1, d2, map); + } + var + Timers = + [0, + Actuals$1, + Dict$0, + empty$0, + of_list, + make_timer, + remove_timer, + set$0, + update$1]; + function empty$1(param){return [0, 0];} + function target(param){ + var _s_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][2], _s_); + } + function add$0(h){ + var _r_ = target(0); + return caml_call3(Fmlib_js_Event_target[1], cst_click, h, _r_); + } + function remove(h){ + var _q_ = target(0); + return caml_call3(Fmlib_js_Event_target[2], cst_click$0, h, _q_); + } + function _e_(tag){ + function _n_(href){ + var match = caml_call1(Fmlib_browser_Url[2], href); + if(! match) return Fmlib_js_Base[2][2]; + var url = match[1]; + if + (! + caml_string_notequal(tag, "A") + && + ! + caml_string_notequal(tag, "a") + && caml_call1(Fmlib_browser_Url[4], url)) + return caml_call1(Fmlib_js_Base[2][1], url); + return Fmlib_js_Base[2][2]; + } + var + _o_ = caml_call2(Fmlib_js_Base[2][16], cst_href, Fmlib_js_Base[2][13]), + _p_ = caml_call2(Fmlib_js_Base[2][16], cst_target, _o_); + return caml_call2(Fmlib_js_Base[2][4], _p_, _n_); + } + var + _f_ = caml_call2(Fmlib_js_Base[2][16], cst_tagName, Fmlib_js_Base[2][13]), + _g_ = caml_call2(Fmlib_js_Base[2][16], cst_target$0, _f_), + decode = caml_call2(Fmlib_js_Base[2][4], _g_, _e_); + function make$0(dispatch, f, event){ + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(! match) return 0; + var url = match[1]; + caml_call1(Fmlib_js_Event[3], event); + return caml_call1(dispatch, caml_call1(f, url)); + } + function set$1(dispatch, virt, req){ + if(virt){ + var + f = virt[1], + _l_ = function(_m_){return make$0(dispatch, f, _m_);}, + actual = caml_call1(Actual[1], _l_); + add$0(caml_call1(Actual[3], actual)); + req[1] = [0, actual]; + return 0; + } + req[1] = 0; + return 0; + } + function update$2(dispatch, virt1, virt2, req){ + var match = req[1]; + if(virt1){ + var f1 = virt1[1]; + if(virt2){ + if(match){ + var + actual = match[1], + handler = function(_j_){return make$0(dispatch, f1, _j_);}; + return caml_call2(Actual[2], handler, actual); + } + } + else if(! match){ + var + _i_ = function(_k_){return make$0(dispatch, f1, _k_);}, + actual$0 = caml_call1(Actual[1], _i_); + add$0(caml_call1(Actual[3], actual$0)); + req[1] = [0, actual$0]; + return 0; + } + } + else + if(virt2){ + if(match){ + var actual$1 = match[1]; + return remove(caml_call1(Actual[3], actual$1)); + } + } + else if(! match) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + } + var + Url_request = + [0, empty$1, target, add$0, remove, decode, make$0, set$1, update$2], + Fmlib_browser_Handler = + [0, Actual, Actuals, Virtual, EventHs, Timers, Url_request]; + runtime.caml_register_global + (27, Fmlib_browser_Handler, "Fmlib_browser__Handler"); + return; + } + (globalThis)); + +//# 605 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function style(key, value){return [0, key, value];} + function property(key, value){return [1, key, value];} + function attribute(key, value){return [2, key, value];} + function handler(key, stop, prevent, decode){ + return [3, key, [0, stop, prevent, decode]]; + } + var Fmlib_browser_Attribute = [0, style, property, attribute, handler]; + runtime.caml_register_global + (0, Fmlib_browser_Attribute, "Fmlib_browser__Attribute"); + return; + } + (globalThis)); + +//# 623 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_equal = runtime.caml_string_equal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib_String = global_data.Stdlib__String, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + _a_ = [0, "src/browser/vdom.ml", 205, 16], + _b_ = [0, 0, 0]; + function of_list(lst){ + var _x_ = [0, Dictionary[1], Dictionary[1], Dictionary[1], Dictionary[1]]; + function _y_(attrs, param){ + switch(param[0]){ + case 0: + var + value = param[2], + name = param[1], + _z_ = attrs[4], + _A_ = attrs[3], + _B_ = attrs[2]; + return [0, + caml_call3(Dictionary[3], name, value, attrs[1]), + _B_, + _A_, + _z_]; + case 1: + var + value$0 = param[2], + name$0 = param[1], + _C_ = attrs[4], + _D_ = attrs[3], + _E_ = caml_call3(Dictionary[3], name$0, value$0, attrs[2]); + return [0, attrs[1], _E_, _D_, _C_]; + case 2: + var + value$1 = param[2], + name$1 = param[1], + _F_ = attrs[4], + _G_ = caml_call3(Dictionary[3], name$1, value$1, attrs[3]); + return [0, attrs[1], attrs[2], _G_, _F_]; + default: + var + handler = param[2], + name$2 = param[1], + _H_ = attrs[4], + _I_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }, + _J_ = caml_call3(Dictionary[4], name$2, _I_, _H_); + return [0, attrs[1], attrs[2], attrs[3], _J_]; + } + } + return caml_call3(Stdlib_List[25], _y_, _x_, lst); + } + var Attributes = [0, of_list]; + function text(s){return [0, [0, s], 0];} + function node(tag, attrs, lst){ + return [0, [1, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function node_ns(namespace, tag, attrs, lst){ + return [0, [2, namespace, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function keyed(tag, attrs, lst){ + var _w_ = caml_call1(Dictionary[5], lst); + return [0, [3, tag, caml_call1(Attributes[1], attrs), _w_], 0]; + } + function element(_v_){return _v_[2];} + function add_attributes(ops, attrs, el){ + var _p_ = attrs[1], _q_ = caml_call1(ops[9], el); + caml_call2(Dictionary[7], _q_, _p_); + var _r_ = attrs[3], _s_ = caml_call1(ops[10], el); + caml_call2(Dictionary[7], _s_, _r_); + var _t_ = attrs[2], _u_ = caml_call1(ops[11], el); + caml_call2(Dictionary[7], _u_, _t_); + return caml_call2(ops[15], el, attrs[4]); + } + function make(ops, vdom){ + function make(vdom){ + var match = vdom[1]; + switch(match[0]){ + case 0: + var s = match[1]; return [0, [0, s], caml_call1(ops[1], s)]; + case 1: + var + lst = match[3], + attrs = match[2], + tag = match[1], + match$0 = make_children(lst), + real_children = match$0[2], + combined_children = match$0[1], + parent = caml_call2(ops[2], tag, real_children); + add_attributes(ops, attrs, parent); + return [0, [1, tag, attrs, combined_children], parent]; + case 2: + var + lst$0 = match[4], + attrs$0 = match[3], + tag$0 = match[2], + namespace = match[1], + match$1 = make_children(lst$0), + real_children$0 = match$1[2], + combined_children$0 = match$1[1], + parent$0 = caml_call3(ops[3], namespace, tag$0, real_children$0); + add_attributes(ops, attrs$0, parent$0); + return [0, + [2, namespace, tag$0, attrs$0, combined_children$0], + parent$0]; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + function make_children(lst){ + if(! lst) return _b_; + var + tl = lst[2], + hd = lst[1], + hd$0 = make(hd), + hd2 = hd$0[2], + match = make_children(tl), + tl2 = match[2], + tl1 = match[1]; + return [0, [0, hd$0, tl1], [0, hd2, tl2]]; + } + return make(vdom); + } + function update_attributes(ops, par, attrs1, attrs2){ + var + set = caml_call1(ops[9], par), + _g_ = attrs2[1], + _h_ = attrs1[1], + _i_ = caml_call1(ops[12], par); + caml_call5(Dictionary[8], set, set, _i_, _h_, _g_); + var + set$0 = caml_call1(ops[10], par), + _j_ = attrs2[3], + _k_ = attrs1[3], + _l_ = caml_call1(ops[13], par); + caml_call5(Dictionary[8], set$0, set$0, _l_, _k_, _j_); + var + set$1 = caml_call1(ops[11], par), + _m_ = attrs2[2], + _n_ = attrs1[2], + _o_ = caml_call1(ops[14], par); + caml_call5(Dictionary[8], set$1, set$1, _o_, _n_, _m_); + return caml_call3(ops[16], par, attrs1[4], attrs2[4]); + } + function update(ops, vdom, dom){ + var _d_ = vdom[1]; + switch(_d_[0]){ + case 0: + var match = dom[1]; + if(0 === match[0]){ + var el = dom[2], s2 = match[1], s1 = _d_[1]; + return caml_string_equal(s1, s2) + ? [0, dom, 0] + : (caml_call2(ops[8], el, s1), [0, [0, [0, s1], el], 0]); + } + break; + case 1: + var match$0 = dom[1]; + if(1 === match$0[0]){ + var + par = dom[2], + lst2 = match$0[3], + attrs2 = match$0[2], + tag2 = match$0[1], + lst1 = _d_[3], + attrs1 = _d_[2], + tag1 = _d_[1]; + if(caml_string_equal(tag1, tag2)){ + update_attributes(ops, par, attrs1, attrs2); + var + _e_ = update_children(ops, par, lst1, lst2, 0), + children = caml_call1(Stdlib_List[9], _e_); + return [0, [0, [1, tag2, attrs1, children], par], 0]; + } + } + break; + case 2: + var match$1 = dom[1]; + if(2 === match$1[0]){ + var + par$0 = dom[2], + lst2$0 = match$1[4], + attrs2$0 = match$1[3], + tag2$0 = match$1[2], + ns2 = match$1[1], + lst1$0 = _d_[4], + attrs1$0 = _d_[3], + tag1$0 = _d_[2], + ns1 = _d_[1]; + if(caml_string_equal(tag1$0, tag2$0) && caml_string_equal(ns1, ns2)){ + update_attributes(ops, par$0, attrs1$0, attrs2$0); + var + _f_ = update_children(ops, par$0, lst1$0, lst2$0, 0), + children$0 = caml_call1(Stdlib_List[9], _f_); + return [0, [0, [2, ns2, tag2$0, attrs1$0, children$0], par$0], 0]; + } + } + break; + default: + var match$2 = dom[1]; + if(3 === match$2[0]){ + var + par$1 = dom[2], + d2 = match$2[3], + attrs2$1 = match$2[2], + tag2$1 = match$2[1], + d1 = _d_[3], + attrs1$1 = _d_[2], + tag1$1 = _d_[1]; + if(caml_string_equal(tag1$1, tag2$1)){ + update_attributes(ops, par$1, attrs1$1, attrs2$1); + var children$1 = update_keyed(ops, par$1, d1, d2); + return [0, [0, [3, tag2$1, attrs1$1, children$1], par$1], 0]; + } + } + } + return [0, make(ops, vdom), 1]; + } + function update_keyed(ops, par, d1, d2){ + caml_call1(ops[7], par); + var d = [0, Dictionary[1]]; + function _c_(key, vdom){ + var match = caml_call2(Dictionary[2], key, d2); + if(match){ + var dom = match[1], dom$0 = update(ops, vdom, dom)[1], el = dom$0[2]; + caml_call2(ops[4], el, par); + d[1] = caml_call3(Dictionary[3], key, dom$0, d[1]); + return 0; + } + var dom$1 = make(ops, vdom), el$0 = dom$1[2]; + caml_call2(ops[4], el$0, par); + d[1] = caml_call3(Dictionary[3], key, dom$1, d[1]); + return 0; + } + caml_call2(Dictionary[7], _c_, d1); + return d[1]; + } + function update_children(ops, par, lst1, lst2, nlst2){ + var lst1$0 = lst1, lst2$0 = lst2, nlst2$0 = nlst2; + for(;;){ + if(! lst1$0){ + if(! lst2$0) return nlst2$0; + var lst2$2 = lst2$0[2], hd = lst2$0[1][2]; + caml_call2(ops[5], hd, par); + var lst1$0 = 0, lst2$0 = lst2$2; + continue; + } + var lst1$1 = lst1$0[2], hd1 = lst1$0[1]; + if(! lst2$0){ + var hd1$0 = make(ops, hd1), hd11 = hd1$0[2]; + caml_call2(ops[4], hd11, par); + var + nlst2$2 = [0, hd1$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = 0, + nlst2$0 = nlst2$2; + continue; + } + var + lst2$1 = lst2$0[2], + hd2 = lst2$0[1], + old_el = hd2[2], + match = update(ops, hd1, hd2), + created = match[2], + hd2$0 = match[1], + new_el = hd2$0[2]; + if(created) caml_call3(ops[6], old_el, new_el, par); + var + nlst2$1 = [0, hd2$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = lst2$1, + nlst2$0 = nlst2$1; + } + } + var + Fmlib_browser_Vdom = + [0, + Dictionary, + Attributes, + text, + node, + node_ns, + keyed, + element, + add_attributes, + make, + update_attributes, + update, + update_keyed, + update_children]; + runtime.caml_register_global(6, Fmlib_browser_Vdom, "Fmlib_browser__Vdom"); + return; + } + (globalThis)); + +//# 953 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Fmlib_js_Base = global_data.Fmlib_js__Base, + cst_col = " col: ", + cst_line = " line: ", + cst_assertion_failed_file = "assertion failed file: ", + cst_Uncaught_javascript_except = "Uncaught javascript exception", + cst_Uncaught_ocaml_exception = "Uncaught ocaml exception"; + function attempt(str, f, cleanup){ + try{var _c_ = caml_call1(f, 0); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib[5]){ + var + match = exn[2], + col = match[3], + line = match[2], + file = match[1], + _a_ = [0, cst_col, [0, caml_call1(Stdlib[33], col), 0]], + _b_ = + [0, + cst_assertion_failed_file, + [0, file, [0, cst_line, [0, caml_call1(Stdlib[33], line), _a_]]]], + msg = caml_call2(Stdlib_String[6], cst, _b_); + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + caml_call1(Fmlib_js_Base[3][4], msg); + return caml_call1(Fmlib_js_Base[3][3], str); + } + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + var match$0 = caml_call1(Fmlib_js_Base[3][1], exn); + if(match$0){ + var js_error = match$0[1]; + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_javascript_except); + return caml_call1(Fmlib_js_Base[3][2], js_error); + } + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_ocaml_exception); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + var Fmlib_browser_Assert_failure = [0, attempt]; + runtime.caml_register_global + (9, Fmlib_browser_Assert_failure, "Fmlib_browser__Assert_failure"); + return; + } + (globalThis)); + +//# 1023 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_random_ml = "src/browser/random.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, cst_src_browser_random_ml, 44, 4], + _b_ = [0, cst_src_browser_random_ml, 32, 4], + _a_ = [0, cst_src_browser_random_ml, 26, 4]; + function run(random){ + return caml_call1(random, caml_call1(Stdlib_Random[15][2], 0)); + } + function constant(a, param){return a;} + function symbol_bind(m, f, state){ + return caml_call2(f, caml_call1(m, state), state); + } + function map(f, m){ + function _j_(a){ + var _l_ = caml_call1(f, a); + return function(_m_){return _l_;}; + } + return function(_k_){return symbol_bind(m, _j_, _k_);}; + } + function int$0(bound, state){ + if(0 < bound) return caml_call2(Stdlib_Random[15][5], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function float$0(bound, state){ + if(0. <= bound) return caml_call2(Stdlib_Random[15][10], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + var bool = Stdlib_Random[15][11]; + function choose(lst){ + var arr = caml_call1(Stdlib_Array[10], lst), len = arr.length - 1; + function _d_(i){ + if(i >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _h_ = runtime.caml_check_bound(arr, i)[1 + i]; + return function(_i_){return _h_;}; + } + function _e_(_g_){return int$0(len, _g_);} + return function(_f_){return symbol_bind(_e_, _d_, _f_);}; + } + var + Fmlib_browser_Random = + [0, + run, + constant, + symbol_bind, + symbol_bind, + map, + int$0, + float$0, + bool, + choose]; + runtime.caml_register_global + (7, Fmlib_browser_Random, "Fmlib_browser__Random"); + return; + } + (globalThis)); + +//# 1102 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_loadend$1 = "loadend", + cst_src_browser_task_ml = "src/browser/task.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + Fmlib_js_Http_request = global_data.Fmlib_js__Http_request, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + _l_ = [0, cst_src_browser_task_ml, 183, 8], + _j_ = [1, -819565531], + _k_ = [1, -1056736433], + cst_loadend$0 = cst_loadend$1, + _i_ = [0, cst_src_browser_task_ml, 159, 8], + cst_loadend = cst_loadend$1, + _g_ = [0, 0], + _h_ = [1, -358247754], + _e_ = [0, 0], + _f_ = [1, -358247754], + _d_ = [0, 0], + _c_ = [0, 0], + _b_ = [0, 0], + cst_Exception_in_task_executio = "Exception in task execution", + _a_ = [0, cst_src_browser_task_ml, 11, 4]; + function absurd(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function continue$0(k, a){ + function _E_(param){return 0;} + function _F_(param){return caml_call1(k, a);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_task_executio, + _F_, + _E_); + } + function run(task, post, k){ + return caml_call2 + (task, + post, + function(param){ + if(0 === param[0]){var a = param[1]; return continue$0(k, a);} + var e = param[1]; + return absurd(e); + }); + } + function succeed(a, param, k){return continue$0(k, [0, a]);} + function fail(e, param, k){return continue$0(k, [1, e]);} + function result(r, param, k){return continue$0(k, r);} + function symbol_bind(m, f, post, k){ + return caml_call2 + (m, + post, + function(param){ + if(0 === param[0]){ + var a = param[1]; + return caml_call3(f, a, post, k); + } + var e = param[1]; + return continue$0(k, [1, e]); + }); + } + function map(f, m){ + function _y_(a){ + var _B_ = caml_call1(f, a); + return function(_C_, _D_){return succeed(_B_, _C_, _D_);}; + } + return function(_z_, _A_){return symbol_bind(m, _y_, _z_, _A_);}; + } + function make_succeed(f, m, post, k){ + return caml_call2 + (m, + post, + function(res){return continue$0(k, [0, caml_call1(f, res)]);}); + } + function log_string(s, param, k){ + caml_call1(Fmlib_js_Base[3][4], s); + return continue$0(k, _b_); + } + function log_value(v, param, k){ + caml_call1(Fmlib_js_Base[3][5], v); + return continue$0(k, _c_); + } + function sleep(ms, a, param, k){ + function _x_(param){return continue$0(k, [0, a]);} + caml_call2(Fmlib_js_Timer[1], _x_, ms); + return 0; + } + function next_tick(a){ + var _u_ = 0; + return function(_v_, _w_){return sleep(_u_, a, _v_, _w_);}; + } + function send_to_javascript(v, post, k){ + caml_call1(post, v); + return continue$0(k, _d_); + } + function focus(id, param, k){ + var + _s_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _t_ = caml_call1(Fmlib_js_Dom[7][3], _s_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _t_); + if(! match) return caml_call1(k, _f_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][15], el); + return continue$0(k, _e_); + } + function blur(id, param, k){ + var + _q_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _r_ = caml_call1(Fmlib_js_Dom[7][3], _q_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _r_); + if(! match) return continue$0(k, _h_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][16], el); + return continue$0(k, _g_); + } + function random(rand, param, k){ + return continue$0(k, [0, caml_call1(Fmlib_browser_Random[1], rand)]); + } + function http_text(meth, url, headers, body, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + return 200 === status + ? continue$0(k, [0, caml_call1(Fmlib_js_Http_request[6], req)]) + : continue$0(k, [1, [0, -264964567, status]]); + } + var _p_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend, handler, _p_); + } + function http_json(meth, url, headers, body, decode, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + if(200 !== status) return continue$0(k, [1, [0, -264964567, status]]); + var + _o_ = caml_call1(Fmlib_js_Http_request[5], req), + match = caml_call1(Fmlib_js_Base[1][13], _o_); + if(! match) return continue$0(k, _k_); + var v = match[1], match$0 = caml_call1(decode, v); + if(! match$0) return continue$0(k, _j_); + var a = match$0[1]; + return continue$0(k, [0, a]); + } + var _n_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend$0, handler, _n_); + } + function now(param, k){ + return continue$0(k, [0, caml_call1(Fmlib_js_Date[1], 0)]); + } + function time_zone(param, k){ + var _m_ = caml_call1(Fmlib_js_Date[1], 0); + return continue$0(k, [0, caml_call1(Fmlib_js_Date[4], _m_)]); + } + var + Fmlib_browser_Task = + [0, + absurd, + continue$0, + run, + succeed, + succeed, + fail, + result, + symbol_bind, + symbol_bind, + map, + make_succeed, + log_string, + log_value, + sleep, + next_tick, + send_to_javascript, + focus, + blur, + random, + http_text, + http_json, + now, + time_zone]; + runtime.caml_register_global(24, Fmlib_browser_Task, "Fmlib_browser__Task"); + return; + } + (globalThis)); + +//# 1323 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + cst_visibilityState = "visibilityState", + cst_target = "target", + cst_visibilitychange = "visibilitychange", + cst_innerHeight = "innerHeight", + cst_innerWidth = "innerWidth", + cst_currentTarget = "currentTarget", + cst_resize = "resize", + cst_mouseup = "mouseup", + cst_mousemove = "mousemove", + cst_mousedown = "mousedown", + cst_keyup = "keyup", + cst_keydown = "keydown", + cst_clientY = "clientY", + cst_clientX = "clientX", + cst_key = "key", + none = 0; + function batch(lst){return [4, lst];} + function on_window(event_type, decode){ + return [0, + event_type, + [0, + Fmlib_browser_Event_flag[4], + Fmlib_browser_Event_flag[2], + decode]]; + } + function every(ms, callback){return [1, ms, callback];} + function on_message(decode){return [2, decode];} + function on_url_request(f){return [3, f];} + function map(f, sub){ + function map(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var decode = param[2], event_type = param[1]; + return [0, + event_type, + caml_call2(Fmlib_browser_Handler[3][3], f, decode)]; + case 1: + var g = param[2], millis = param[1]; + return [1, + millis, + function(time){return caml_call1(f, caml_call1(g, time));}]; + case 2: + var decode$0 = param[1]; + return [2, caml_call2(Fmlib_js_Base[2][7], f, decode$0)]; + case 3: + var g$0 = param[1]; + return [3, function(url){return caml_call1(f, caml_call1(g$0, url));}]; + default: + var lst = param[1]; return [4, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(sub); + } + function decode_key_event(f){ + var _r_ = caml_call2(Fmlib_js_Base[2][16], cst_key, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][7], f, _r_); + } + function decode_mouse_event(f){ + function _m_(x){ + function _o_(y){ + var _q_ = caml_call2(f, x, y); + return caml_call1(Fmlib_js_Base[2][1], _q_); + } + var + _p_ = + caml_call2(Fmlib_js_Base[2][16], cst_clientY, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _p_, _o_); + } + var + _n_ = caml_call2(Fmlib_js_Base[2][16], cst_clientX, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _n_, _m_); + } + function on_keydown(f){return on_window(cst_keydown, decode_key_event(f));} + function on_keyup(f){return on_window(cst_keyup, decode_key_event(f));} + function on_mouse_down(f){ + return on_window(cst_mousedown, decode_mouse_event(f)); + } + function on_mouse_move(f){ + return on_window(cst_mousemove, decode_mouse_event(f)); + } + function on_mouse_up(f){ + return on_window(cst_mouseup, decode_mouse_event(f)); + } + function on_resize(f){ + function _e_(param){ + function _g_(width){ + function _j_(height){ + var _l_ = caml_call2(f, width, height); + return caml_call1(Fmlib_js_Base[2][1], _l_); + } + var + _k_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_innerHeight, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _k_, _j_); + } + var + _h_ = + caml_call2(Fmlib_js_Base[2][16], cst_innerWidth, Fmlib_js_Base[2][11]), + _i_ = caml_call2(Fmlib_js_Base[2][4], _h_, _g_); + return caml_call2(Fmlib_js_Base[2][16], cst_currentTarget, _i_); + } + var + _f_ = caml_call1(Fmlib_js_Base[2][1], 0), + decode = caml_call2(Fmlib_js_Base[2][4], _f_, _e_); + return on_window(cst_resize, decode); + } + function on_visibility_change(f){ + function _a_(state){ + var _d_ = caml_call1(f, state); + return caml_call1(Fmlib_js_Base[2][1], _d_); + } + var + _b_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_visibilityState, Fmlib_js_Base[2][13]), + _c_ = caml_call2(Fmlib_js_Base[2][4], _b_, _a_), + decode = caml_call2(Fmlib_js_Base[2][16], cst_target, _c_); + return on_window(cst_visibilitychange, decode); + } + var + Fmlib_browser_Subscription = + [0, + none, + batch, + on_window, + every, + on_message, + on_url_request, + map, + decode_key_event, + decode_mouse_event, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change]; + runtime.caml_register_global + (19, Fmlib_browser_Subscription, "Fmlib_browser__Subscription"); + return; + } + (globalThis)); + +//# 1491 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Stdlib_Int = global_data.Stdlib__Int, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + String_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_String[9]]), + Int_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_Int[9]]), + Intionary = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = [0, Dictionary[1], Intionary[1], 0, 0]; + function make(sub){ + function make(subs, param){ + if(typeof param === "number") return subs; + switch(param[0]){ + case 0: + var + handler = param[2], + event_type = param[1], + _i_ = subs[4], + _j_ = subs[3], + _k_ = subs[2], + _l_ = subs[1], + _m_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }; + return [0, + caml_call3(Dictionary[4], event_type, _m_, _l_), + _k_, + _j_, + _i_]; + case 1: + var + callback = param[2], + millis = param[1], + _n_ = subs[4], + _o_ = subs[3], + _p_ = subs[2], + _q_ = + function(param){ + if(! param) return [0, callback, 0]; + var lst = param[1]; + return [0, callback, lst]; + }, + _r_ = caml_call3(Intionary[4], millis, _q_, _p_); + return [0, subs[1], _r_, _o_, _n_]; + case 2: + var decode = param[1], _s_ = subs[4], _t_ = subs[3] || [0, decode]; + return [0, subs[1], subs[2], _t_, _s_]; + case 3: + var f = param[1], _u_ = subs[4] || [0, f]; + return [0, subs[1], subs[2], subs[3], _u_]; + default: + var lst = param[1]; + return caml_call3(Stdlib_List[25], make, subs, lst); + } + } + return make(empty, sub); + } + var Subs = [0, empty, make]; + function make$0(dispatch, sub){ + var + subs = caml_call1(Subs[2], sub), + window = caml_call1(Fmlib_browser_Handler[4][3], 0), + _f_ = subs[1], + _g_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _h_ = caml_call1(Fmlib_js_Dom[7][2], _g_); + caml_call4(Fmlib_browser_Handler[4][5], _h_, dispatch, _f_, window); + var timers = caml_call1(Fmlib_browser_Handler[5][3], 0); + caml_call3(Fmlib_browser_Handler[5][7], dispatch, subs[2], timers); + var url_request = caml_call1(Fmlib_browser_Handler[6][1], 0); + caml_call3(Fmlib_browser_Handler[6][7], dispatch, subs[4], url_request); + return [0, subs, window, timers, url_request]; + } + function update(dispatch, sub, s){ + var + subs = caml_call1(Subs[2], sub), + _a_ = s[2], + _b_ = s[1][1], + _c_ = subs[1], + _d_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _e_ = caml_call1(Fmlib_js_Dom[7][2], _d_); + caml_call5(Fmlib_browser_Handler[4][6], _e_, dispatch, _c_, _b_, _a_); + caml_call4(Fmlib_browser_Handler[5][8], dispatch, subs[2], s[1][2], s[3]); + caml_call4(Fmlib_browser_Handler[6][8], dispatch, subs[4], s[1][4], s[4]); + return [0, subs, s[2], s[3], s[4]]; + } + var + Fmlib_browser_Subscriptions = + [0, String_map, Int_map, Intionary, Dictionary, Subs, make$0, update]; + runtime.caml_register_global + (7, Fmlib_browser_Subscriptions, "Fmlib_browser__Subscriptions"); + return; + } + (globalThis)); + +//# 1620 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Stdlib_List = global_data.Stdlib__List, + none = 0; + function batch(lst){return [2, lst];} + function perform(task){return [0, task];} + function just_do(task){return [1, task];} + function attempt(f, task){ + return [0, caml_call2(Fmlib_browser_Task[11], f, task)]; + } + function map(f, cmd){ + function map(cmd){ + if(typeof cmd === "number") return 0; + switch(cmd[0]){ + case 0: + var task = cmd[1]; + return [0, caml_call2(Fmlib_browser_Task[10], f, task)]; + case 1: + return cmd; + default: + var lst = cmd[1]; return [2, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(cmd); + } + function execute(post, dispatch, cmd){ + function exe(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var task = param[1]; + return caml_call3(Fmlib_browser_Task[3], task, post, dispatch); + case 1: + var task$0 = param[1], _a_ = function(param){return 0;}; + return caml_call3(Fmlib_browser_Task[3], task$0, post, _a_); + default: + var lst = param[1]; return caml_call2(Stdlib_List[17], exe, lst); + } + } + return exe(cmd); + } + var + Fmlib_browser_Command = + [0, none, batch, perform, just_do, attempt, map, execute]; + runtime.caml_register_global + (2, Fmlib_browser_Command, "Fmlib_browser__Command"); + return; + } + (globalThis)); + +//# 1687 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_application_already_initia$1 = "application already initialized", + cst_cannot_decode_initialisati$1 = "cannot decode initialisation data", + cst_data$1 = "data", + cst_init$1 = "init", + cst_load$4 = "load", + cst_onMessage$1 = "onMessage", + cst_post$1 = "post", + cst_src_browser_browser_ml = "src/browser/browser.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "'", + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Subscriptions = global_data.Fmlib_browser__Subscriptions, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Stdlib = global_data.Stdlib, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + cst_Exception_in_update_subscr = + "Exception in 'update_subscriptions' of Fmlib_browser", + _d_ = [0, cst_src_browser_browser_ml, 353, 4], + cst_load$3 = cst_load$4, + cst_post$0 = cst_post$1, + cst_init$0 = cst_init$1, + cst_application_already_initia$0 = cst_application_already_initia$1, + cst_load$2 = cst_load$4, + cst_cannot_decode_initialisati$0 = cst_cannot_decode_initialisati$1, + cst_data$0 = cst_data$1, + cst_onMessage$0 = cst_onMessage$1, + cst_post = cst_post$1, + cst_init = cst_init$1, + cst_Cannot_find_element = "Cannot find element ", + cst_application_already_initia = cst_application_already_initia$1, + cst_load$1 = cst_load$4, + cst_cannot_decode_initialisati = cst_cannot_decode_initialisati$1, + cst_element_id = "element_id", + cst_data = cst_data$1, + cst_onMessage = cst_onMessage$1, + cst_load$0 = cst_load$4, + cst_load = cst_load$4, + cst_receive_message_cannot_dec = + "receive_message: cannot decode message from javascript", + cst_receive_message_event_not_ = "receive_message: event not subscribed", + cst_receive_message_subscripti = + "receive_message: subscriptions not yet initialized", + cst_receive_message_applicatio = + "receive_message: application not yet initialized", + cst_Exception_in_update = "Exception in 'update'", + cst_subscriptioin = "subscriptioin", + cst_view = "view", + cst_Exception_in = "Exception in '", + cst_Exception_in_update_dom_of = + "Exception in 'update_dom' of Fmlib_browser", + _c_ = [0, cst_src_browser_browser_ml, 341, 4], + _b_ = [0, cst_src_browser_browser_ml, 94, 12], + _a_ = [0, cst_src_browser_browser_ml, 85, 12]; + function document(param){ + var _bE_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][3], _bE_); + } + function dom_operations(dispatch){ + function get_both(param){ + var match = param[2]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var el = match[1]; + return el; + } + function get_element(param){ + var _bD_ = param[2]; + if(! _bD_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var el = _bD_[1][1]; + return el; + } + function _a5_(el, dict1, dict2){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bC_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bC_); + return caml_call5 + (Fmlib_browser_Handler[4][6], + target, + dispatch, + dict1, + dict2, + reals); + } + function _a6_(el, dict){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bB_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bB_); + return caml_call4 + (Fmlib_browser_Handler[4][5], target, dispatch, dict, reals); + } + function _a7_(el, key){ + var _bA_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][14], key, _bA_); + } + function _a8_(el, key){ + var _bz_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][12], key, _bz_); + } + function _a9_(el, key){ + var _bx_ = get_element(el), _by_ = caml_call1(Fmlib_js_Dom[3][10], _bx_); + return caml_call2(Fmlib_js_Dom[2][2], key, _by_); + } + function _a__(el, key, value){ + var _bw_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][13], key, value, _bw_); + } + function _a$_(el, key, value){ + var _bv_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][11], key, value, _bv_); + } + function _ba_(el, key, value){ + var _bt_ = get_element(el), _bu_ = caml_call1(Fmlib_js_Dom[3][10], _bt_); + return caml_call3(Fmlib_js_Dom[2][1], key, value, _bu_); + } + function _bb_(param, text){ + var node = param[1]; + return caml_call2(Fmlib_js_Dom[1][10], text, node); + } + function _bc_(param){ + var par = param[1]; + return caml_call1(Fmlib_js_Dom[1][8], par); + } + function _bd_(param, _bs_, _br_){ + var par = _br_[1], new_child = _bs_[1], old_child = param[1]; + return caml_call3(Fmlib_js_Dom[1][7], new_child, old_child, par); + } + function _be_(param, _bq_){ + var par = _bq_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][6], child, par); + } + function _bf_(param, _bp_){ + var par = _bp_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][5], child, par); + } + function _bg_(namespace, tag, lst){ + var + doc = document(0), + el = caml_call3(Fmlib_js_Dom[4][7], namespace, tag, doc); + function _bm_(param){ + var child = param[1], _bo_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bo_); + } + caml_call2(Stdlib_List[17], _bm_, lst); + var _bn_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bn_]; + } + function _bh_(tag, lst){ + var doc = document(0), el = caml_call2(Fmlib_js_Dom[4][5], tag, doc); + function _bj_(param){ + var child = param[1], _bl_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bl_); + } + caml_call2(Stdlib_List[17], _bj_, lst); + var _bk_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bk_]; + } + return [0, + function(s){ + var _bi_ = document(0); + return [0, caml_call2(Fmlib_js_Dom[4][6], s, _bi_), 0]; + }, + _bh_, + _bg_, + _bf_, + _be_, + _bd_, + _bc_, + _bb_, + _ba_, + _a$_, + _a__, + _a9_, + _a8_, + _a7_, + _a6_, + _a5_]; + } + function dispatch(data, msg){ + function update_data(state){ + var + state_different = 1 - (state === data[1] ? 1 : 0), + _a3_ = data[2], + _a4_ = _a3_ || state_different; + data[2] = _a4_; + return state_different + ? (data[1] = state, update_subscriptions(data)) + : state_different; + } + var match = data[6]; + switch(match[0]){ + case 0: + var update = match[3]; + return update_data(caml_call2(update, data[1], msg)); + case 1: + var + post = match[4], + update$0 = match[3], + match$0 = caml_call2(update$0, data[1], msg), + cmd = match$0[2], + state = match$0[1]; + update_data(state); + var _aZ_ = function(_a1_){return dispatch_next(data, _a1_);}; + return caml_call3(Fmlib_browser_Command[7], post, _aZ_, cmd); + default: + var + post$0 = match[4], + update$1 = match[3], + match$1 = caml_call2(update$1, data[1], msg), + cmd$0 = match$1[2], + state$0 = match$1[1]; + update_data(state$0); + var _a0_ = function(_a2_){return dispatch_next(data, _a2_);}; + return caml_call3(Fmlib_browser_Command[7], post$0, _a0_, cmd$0); + } + } + function dispatch_next(data, msg){ + var _aX_ = 0; + function _aY_(param){return dispatch(data, msg);} + caml_call2(Fmlib_js_Timer[1], _aY_, _aX_); + return 0; + } + function update_subscriptions(data){ + function update(param){ + var match = data[4], sub = data[6][2]; + if(! match){ + var + _aT_ = caml_call1(sub, data[1]), + _aU_ = function(_aW_){return dispatch(data, _aW_);}; + data[4] = [0, caml_call2(Fmlib_browser_Subscriptions[6], _aU_, _aT_)]; + return 0; + } + var subs = match[1]; + if(! data[2]) return 0; + var _aR_ = caml_call1(sub, data[1]); + function _aS_(_aV_){return dispatch(data, _aV_);} + data[4] = + [0, caml_call3(Fmlib_browser_Subscriptions[7], _aS_, _aR_, subs)]; + return 0; + } + function _aQ_(param){return 0;} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_subscr, + update, + _aQ_); + } + function put_below_root(data, dom){ + var root_node = caml_call1(Fmlib_js_Dom[3][1], data[5]); + caml_call1(Fmlib_js_Dom[1][8], root_node); + var _aP_ = caml_call1(Fmlib_browser_Vdom[7], dom)[1]; + return caml_call2(Fmlib_js_Dom[1][5], _aP_, root_node); + } + function update_dom(data){ + function update(param){ + function vdom(data){ + var match = data[6]; + switch(match[0]){ + case 0: + var + view = match[1], + _aM_ = function(param){return 0;}, + match$1 = [0, caml_call1(view, data[1]), _aM_]; + break; + case 1: + var + view$0 = match[1], + _aN_ = function(param){return 0;}, + match$1 = [0, caml_call1(view$0, data[1]), _aN_]; + break; + default: + var + view$1 = match[1], + match$0 = caml_call1(view$1, data[1]), + title = match$0[2], + vdom = match$0[1], + match$1 = + [0, + vdom, + function(param){ + var _aO_ = document(0); + return caml_call2(Fmlib_js_Dom[4][2], title, _aO_); + }]; + } + var set_title = match$1[2], vdom$0 = match$1[1]; + set_title(0); + return vdom$0; + } + var match = data[3]; + if(! match){ + var + _aI_ = vdom(data), + _aJ_ = dom_operations(function(_aL_){return dispatch(data, _aL_);}), + dom$1 = caml_call2(Fmlib_browser_Vdom[9], _aJ_, _aI_); + data[3] = [0, dom$1]; + return put_below_root(data, dom$1); + } + var dom = match[1], _aE_ = data[2]; + if(_aE_){ + var + _aF_ = vdom(data), + _aG_ = dom_operations(function(_aK_){return dispatch(data, _aK_);}), + match$0 = caml_call3(Fmlib_browser_Vdom[11], _aG_, _aF_, dom), + created = match$0[2], + dom$0 = match$0[1]; + if(created) put_below_root(data, dom$0); + data[3] = [0, dom$0]; + var _aH_ = 0; + } + else + var _aH_ = _aE_; + return _aH_; + } + function cleanup(param){data[2] = 0; return 0;} + caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_dom_of, + update, + cleanup); + cleanup(0); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 0; + } + function on_next_animation(f){ + var _aD_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call2(Fmlib_js_Dom[7][6], f, _aD_); + } + function animate(data, param){ + update_dom(data); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + return on_next_animation(function(_aC_){return animate(data, _aC_);}); + } + function wrap_state_fun(str, f, state){ + function _ay_(param){return 0;} + function _az_(param){return caml_call1(f, state);} + var + _aA_ = caml_call2(Stdlib[28], str, cst), + _aB_ = caml_call2(Stdlib[28], cst_Exception_in, _aA_); + return caml_call3(Fmlib_browser_Assert_failure[1], _aB_, _az_, _ay_); + } + function wrap_view(view, state){ + return wrap_state_fun(cst_view, view, state); + } + function wrap_subscription(view, state){ + return wrap_state_fun(cst_subscriptioin, view, state); + } + function wrap_update(update, state, message){ + function _aw_(param){return 0;} + function _ax_(param){return caml_call2(update, state, message);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update, + _ax_, + _aw_); + } + function receive_message(data){ + function post(v){ + var match = data[1]; + if(! match){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_applicatio); + return Fmlib_js_Base[1][1]; + } + var data$0 = match[1], match$0 = data$0[4]; + if(! match$0){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_subscripti); + return Fmlib_js_Base[1][1]; + } + var subs = match$0[1], match$1 = subs[1][3]; + if(! match$1){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_event_not_); + return Fmlib_js_Base[1][1]; + } + var decode = match$1[1], match$2 = caml_call1(decode, v); + if(match$2){ + var m = match$2[1]; + dispatch(data$0, m); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_cannot_dec); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + return caml_call1(Fmlib_js_Base[1][9], post); + } + function start_application(data, command, post){ + update_subscriptions(data); + update_dom(data); + function _at_(_av_){return dispatch_next(data, _av_);} + caml_call3(Fmlib_browser_Command[7], post, _at_, command); + return on_next_animation(function(_au_){return animate(data, _au_);}); + } + function make_sandbox(state, view, sub, update, param){ + function _ak_(_ar_, _as_){return wrap_update(update, _ar_, _as_);} + function _al_(_aq_){return wrap_subscription(sub, _aq_);} + var + _am_ = [0, function(_ap_){return wrap_view(view, _ap_);}, _al_, _ak_], + _an_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _an_), _am_]; + update_subscriptions(data); + update_dom(data); + return on_next_animation(function(_ao_){return animate(data, _ao_);}); + } + function sandbox(state, view, update){ + var + _af_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ag_ = caml_call1(Fmlib_js_Dom[7][2], _af_); + function _ah_(param){return Fmlib_browser_Subscription[1];} + function _ai_(_aj_){return make_sandbox(state, view, _ah_, update, _aj_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load, _ai_, _ag_); + } + function sandbox_plus(state, view, sub, update){ + var + _ab_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ac_ = caml_call1(Fmlib_js_Dom[7][2], _ab_); + function _ad_(_ae_){return make_sandbox(state, view, sub, update, _ae_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load$0, _ad_, _ac_); + } + function element(name, decode$0, view, subs, update){ + var dataref = [0, 0], _K_ = [0, cst_post, receive_message(dataref)]; + function _I_(post){ + function _Y_(param){ + var cmd = param[2], state = param[1]; + function ___(element_id){ + var + _aa_ = + [0, + element_id, + state, + cmd, + function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _aa_); + } + var + _$_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_element_id, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][4], _$_, ___); + } + var _Z_ = caml_call2(Fmlib_js_Base[2][16], cst_data, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _Z_, _Y_); + } + var + _J_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _J_, _I_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[4], + command = match$0[3], + state = match$0[2], + element_id = match$0[1], + _N_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _O_ = caml_call1(Fmlib_js_Dom[7][2], _N_), + _P_ = + function(param){ + var + _Q_ = document(0), + match = caml_call2(Fmlib_js_Dom[4][4], element_id, _Q_); + if(match){ + var + root = match[1], + _R_ = function(_W_, _X_){return wrap_update(update, _W_, _X_);}, + _S_ = function(_V_){return wrap_subscription(subs, _V_);}, + data = + [0, + state, + 0, + 0, + 0, + root, + [1, + function(_U_){return wrap_view(view, _U_);}, + _S_, + _R_, + post]]; + dataref[1] = [0, data]; + return start_application(data, command, post); + } + var + _T_ = caml_call2(Stdlib[28], cst_Cannot_find_element, element_id); + return caml_call1(Fmlib_js_Base[3][4], _T_); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$1, _P_, _O_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _L_ = [0, [0, cst_init, caml_call1(Fmlib_js_Base[1][9], init)], _K_], + _M_ = caml_call1(Fmlib_js_Base[1][7], _L_); + return caml_call2(Fmlib_js_Base[3][8], name, _M_); + } + function application(name, decode$0, view, subs, update){ + var dataref = [0, 0], _r_ = [0, cst_post$0, receive_message(dataref)]; + function _p_(post){ + function _F_(param){ + var + cmd = param[2], + state = param[1], + _H_ = [0, state, cmd, function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _H_); + } + var _G_ = caml_call2(Fmlib_js_Base[2][16], cst_data$0, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _G_, _F_); + } + var + _q_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage$0, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _q_, _p_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia$0); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[3], + command = match$0[2], + state = match$0[1], + _u_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _v_ = caml_call1(Fmlib_js_Dom[7][2], _u_), + _w_ = + function(param){ + function _x_(_D_, _E_){return wrap_update(update, _D_, _E_);} + function _y_(_C_){return wrap_subscription(subs, _C_);} + var + _z_ = + [2, function(_B_){return wrap_view(view, _B_);}, _y_, _x_, post], + _A_ = document(0), + data = + [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _A_), _z_]; + dataref[1] = [0, data]; + return start_application(data, command, post); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$2, _w_, _v_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati$0); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _s_ = [0, [0, cst_init$0, caml_call1(Fmlib_js_Base[1][9], init)], _r_], + _t_ = caml_call1(Fmlib_js_Base[1][7], _s_); + return caml_call2(Fmlib_js_Base[3][8], name, _t_); + } + function basic_application(state, command, view, sub, update){ + function post(param){return 0;} + var + _e_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _f_ = caml_call1(Fmlib_js_Dom[7][2], _e_); + function _g_(param){ + function _h_(_n_, _o_){return wrap_update(update, _n_, _o_);} + function _i_(_m_){return wrap_subscription(sub, _m_);} + var + _j_ = [2, function(_l_){return wrap_view(view, _l_);}, _i_, _h_, post], + _k_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _k_), _j_]; + return start_application(data, command, post); + } + return caml_call3(Fmlib_js_Event_target[1], cst_load$3, _g_, _f_); + } + var + Fmlib_browser_Browser = + [0, sandbox, sandbox_plus, element, basic_application, application]; + runtime.caml_register_global + (47, Fmlib_browser_Browser, "Fmlib_browser__Browser"); + return; + } + (globalThis)); + +//# 2319 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_input$1 = "input", + cst_value$1 = "value"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_browser_Time = global_data.Fmlib_browser__Time, + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Attribute = global_data.Fmlib_browser__Attribute, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Fmlib_browser_Browser = global_data.Fmlib_browser__Browser, + constant = Fmlib_browser_Random[2], + symbol_bind = Fmlib_browser_Random[3], + let$0 = Fmlib_browser_Random[4], + map = Fmlib_browser_Random[5], + int$0 = Fmlib_browser_Random[6], + float$0 = Fmlib_browser_Random[7], + bool = Fmlib_browser_Random[8], + choose = Fmlib_browser_Random[9], + Zone = Fmlib_browser_Time[1], + zero = Fmlib_browser_Time[2], + year = Fmlib_browser_Time[4], + month = Fmlib_browser_Time[5], + day_of_month = Fmlib_browser_Time[6], + hour = Fmlib_browser_Time[7], + minute = Fmlib_browser_Time[8], + second = Fmlib_browser_Time[9], + milli_second = Fmlib_browser_Time[10], + succeed = Fmlib_browser_Task[4], + return$0 = Fmlib_browser_Task[5], + fail = Fmlib_browser_Task[6], + result = Fmlib_browser_Task[7], + symbol_bind$0 = Fmlib_browser_Task[8], + let$1 = Fmlib_browser_Task[9], + map$0 = Fmlib_browser_Task[10], + log_string = Fmlib_browser_Task[12], + log_value = Fmlib_browser_Task[13], + sleep = Fmlib_browser_Task[14], + next_tick = Fmlib_browser_Task[15], + send_to_javascript = Fmlib_browser_Task[16], + focus = Fmlib_browser_Task[17], + blur = Fmlib_browser_Task[18], + random = Fmlib_browser_Task[19], + http_text = Fmlib_browser_Task[20], + http_json = Fmlib_browser_Task[21], + now = Fmlib_browser_Task[22], + time_zone = Fmlib_browser_Task[23], + include = Fmlib_js_Base[1], + null$0 = include[1], + int$1 = include[3], + float$1 = include[4], + bool$0 = include[5], + string = include[6], + object = include[7], + array = include[8], + prevent = Fmlib_browser_Event_flag[1], + no_prevent = Fmlib_browser_Event_flag[2], + stop = Fmlib_browser_Event_flag[3], + no_stop = Fmlib_browser_Event_flag[4], + Event_flag = [0, prevent, no_prevent, stop, no_stop], + include$0 = Fmlib_js_Base[2], + return$1 = include$0[1], + fail$0 = include$0[2], + let$2 = include$0[4], + symbol_bind$1 = include$0[5], + symbol = include$0[6], + map$1 = include$0[7], + null$1 = include$0[8], + undefined$0 = include$0[9], + float$2 = include$0[10], + int$2 = include$0[11], + bool$1 = include$0[12], + string$0 = include$0[13], + field = include$0[16], + array$0 = include$0[17], + option = include$0[18], + cst_http_www_w3_org_2000_svg = "http://www.w3.org/2000/svg", + cst_li = "li", + cst_ul = "ul", + cst_ol = "ol", + cst_select = "select", + cst_textarea = "textarea", + cst_label = "label", + cst_input$0 = cst_input$1, + cst_button = "button", + cst_p = "p", + cst_pre = "pre", + cst_span = "span", + cst_div = "div", + cst_h6 = "h6", + cst_h5 = "h5", + cst_h4 = "h4", + cst_h3 = "h3", + cst_h2 = "h2", + cst_h1 = "h1", + cst_value$0 = cst_value$1, + cst_target = "target", + cst_input = cst_input$1, + cst_placeholder = "placeholder", + cst_value = cst_value$1, + cst_title = "title", + cst_src = "src", + cst_href = "href", + cst_class = "class", + cst_id = "id", + cst_border_color = "border-color", + cst_border_width = "border-width", + cst_border_style = "border-style", + cst_padding = "padding", + cst_margin = "margin", + cst_width = "width", + cst_height = "height", + cst_background_color = "background-color", + cst_color = "color", + cst_font_size = "font-size", + cst_click = "click"; + function run(decode, v){return caml_call1(decode, v);} + var + none = Fmlib_browser_Command[1], + batch = Fmlib_browser_Command[2], + perform = Fmlib_browser_Command[3], + just_do = Fmlib_browser_Command[4], + attempt = Fmlib_browser_Command[5], + map$2 = Fmlib_browser_Command[6], + none$0 = Fmlib_browser_Subscription[1], + batch$0 = Fmlib_browser_Subscription[2], + on_window = Fmlib_browser_Subscription[3], + every = Fmlib_browser_Subscription[4], + on_message = Fmlib_browser_Subscription[5], + map$3 = Fmlib_browser_Subscription[7], + on_keydown = Fmlib_browser_Subscription[10], + on_keyup = Fmlib_browser_Subscription[11], + on_mouse_down = Fmlib_browser_Subscription[12], + on_mouse_move = Fmlib_browser_Subscription[13], + on_mouse_up = Fmlib_browser_Subscription[14], + on_resize = Fmlib_browser_Subscription[15], + on_visibility_change = Fmlib_browser_Subscription[16]; + function debug(str){return caml_call1(Fmlib_js_Base[3][4], str);} + function debug_value(v){return caml_call1(Fmlib_js_Base[3][5], v);} + var + style = Fmlib_browser_Attribute[1], + property = Fmlib_browser_Attribute[2], + attribute = Fmlib_browser_Attribute[3], + handler = Fmlib_browser_Attribute[4]; + function on(key, decode){ + return caml_call4(handler, key, Event_flag[4], Event_flag[2], decode); + } + function on_click(msg){return on(cst_click, caml_call1(return$1, msg));} + function font_size(size){return caml_call2(style, cst_font_size, size);} + function color(color){return caml_call2(style, cst_color, color);} + function background_color(color){ + return caml_call2(style, cst_background_color, color); + } + function height(value){return caml_call2(style, cst_height, value);} + function width(value){return caml_call2(style, cst_width, value);} + function margin(value){return caml_call2(style, cst_margin, value);} + function padding(value){return caml_call2(style, cst_padding, value);} + function border_style(value){ + return caml_call2(style, cst_border_style, value); + } + function border_width(value){ + return caml_call2(style, cst_border_width, value); + } + function border_color(value){ + return caml_call2(style, cst_border_color, value); + } + function id(value){return caml_call2(attribute, cst_id, value);} + function class$0(value){return caml_call2(attribute, cst_class, value);} + function href(value){return caml_call2(attribute, cst_href, value);} + function src(value){return caml_call2(attribute, cst_src, value);} + function title(value){return caml_call2(attribute, cst_title, value);} + function value(value){ + return caml_call2(property, cst_value, caml_call1(string, value)); + } + function placeholder(value){ + return caml_call2(attribute, cst_placeholder, value); + } + function on_input(f){ + var + decode = + caml_call2 + (field, + cst_target, + caml_call2(field, cst_value$0, caml_call2(map$1, f, string$0))); + return caml_call4 + (handler, cst_input, Event_flag[3], Event_flag[2], decode); + } + var + Attribute = + [0, + style, + property, + attribute, + handler, + on, + on_click, + font_size, + color, + background_color, + height, + width, + margin, + padding, + border_style, + border_width, + border_color, + id, + class$0, + href, + src, + title, + value, + placeholder, + on_input], + text = Fmlib_browser_Vdom[3], + node = Fmlib_browser_Vdom[4], + node_ns = Fmlib_browser_Vdom[5], + keyed = Fmlib_browser_Vdom[6]; + function h1(attrs, nodes){return caml_call3(node, cst_h1, attrs, nodes);} + function h2(attrs, nodes){return caml_call3(node, cst_h2, attrs, nodes);} + function h3(attrs, nodes){return caml_call3(node, cst_h3, attrs, nodes);} + function h4(attrs, nodes){return caml_call3(node, cst_h4, attrs, nodes);} + function h5(attrs, nodes){return caml_call3(node, cst_h5, attrs, nodes);} + function h6(attrs, nodes){return caml_call3(node, cst_h6, attrs, nodes);} + function div(attrs, nodes){return caml_call3(node, cst_div, attrs, nodes);} + function span(attrs, nodes){ + return caml_call3(node, cst_span, attrs, nodes); + } + function pre(attrs, nodes){return caml_call3(node, cst_pre, attrs, nodes);} + function p(attrs, nodes){return caml_call3(node, cst_p, attrs, nodes);} + function button(attrs, nodes){ + return caml_call3(node, cst_button, attrs, nodes); + } + function input(attrs, nodes){ + return caml_call3(node, cst_input$0, attrs, nodes); + } + function label(attrs, nodes){ + return caml_call3(node, cst_label, attrs, nodes); + } + function textarea(attrs, nodes){ + return caml_call3(node, cst_textarea, attrs, nodes); + } + function select(attrs, nodes){ + return caml_call3(node, cst_select, attrs, nodes); + } + function ol(attrs, nodes){return caml_call3(node, cst_ol, attrs, nodes);} + function ul(attrs, nodes){return caml_call3(node, cst_ul, attrs, nodes);} + function li(attrs, nodes){return caml_call3(node, cst_li, attrs, nodes);} + function svg_node(tag, attrs, nodes){ + return caml_call4 + (node_ns, cst_http_www_w3_org_2000_svg, tag, attrs, nodes); + } + var + sandbox = Fmlib_browser_Browser[1], + sandbox_plus = Fmlib_browser_Browser[2], + element = Fmlib_browser_Browser[3], + basic_application = Fmlib_browser_Browser[4], + application = Fmlib_browser_Browser[5], + Fmlib_browser = + [0, + [0, constant, symbol_bind, let$0, map, int$0, float$0, bool, choose], + [0, + Zone, + zero, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second], + Event_flag, + [0, null$0, string, int$1, bool$0, float$1, object, array], + [0, + run, + return$1, + fail$0, + symbol_bind$1, + let$2, + map$1, + symbol, + null$1, + undefined$0, + int$2, + bool$1, + float$2, + string$0, + field, + array$0, + option], + Attribute, + [0, + text, + node, + node_ns, + svg_node, + keyed, + h1, + h2, + h3, + h4, + h5, + h6, + div, + span, + pre, + p, + button, + input, + label, + textarea, + select, + ol, + ul, + li], + [0, + succeed, + return$0, + fail, + result, + symbol_bind$0, + let$1, + map$0, + log_string, + log_value, + send_to_javascript, + focus, + blur, + sleep, + next_tick, + now, + time_zone, + random, + http_text, + http_json], + [0, none, batch, perform, just_do, attempt, map$2], + [0, + none$0, + batch$0, + map$3, + on_window, + on_message, + every, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change], + debug, + debug_value, + sandbox, + sandbox_plus, + application, + basic_application, + element]; + runtime.caml_register_global(50, Fmlib_browser, "Fmlib_browser"); + return; + } + (globalThis)); + + +//# 1 ".circles.eobjs/jsoo/circles.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 ".circles.eobjs/jsoo/circles.cmo.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_block$1 = "block", + cst_click$1 = "click", + cst_display$1 = "display", + cst_src_examples_browser_circl = "src/examples/browser/circles.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_browser = global_data.Fmlib_browser, + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Fmlib_std_List = global_data.Fmlib_std__List, + cst_button = "button", + cst_offsetY = "offsetY", + cst_disabled = "disabled", + cst_offsetX = "offsetX", + cst_click$0 = cst_click$1, + cst_solid = "solid", + cst_block$0 = cst_block$1, + cst_display$0 = cst_display$1, + cst_400 = "400", + cst_height = "height", + cst_600 = "600", + cst_width = "width", + cst_svg = "svg", + cst_Redo = "Redo", + cst_Undo = "Undo", + cst_Draw_Circles = "Draw Circles", + _k_ = [0, cst_src_examples_browser_circl, 224, 27], + cst_Ok = "Ok", + cst_block = cst_block$1, + cst_display = cst_display$1, + cst_1 = "1", + cst_step = "step", + cst_100 = "100", + cst_max = "max", + cst_10 = "10", + cst_min = "min", + cst_range = "range", + cst_type = "type", + cst_blue = "blue", + cst_gray = "gray", + cst_fill = "fill", + cst_2 = "2", + cst_stroke_width = "stroke-width", + cst_black = "black", + cst_stroke = "stroke", + cst_click = cst_click$1, + cst_mouseleave = "mouseleave", + cst_mouseenter = "mouseenter", + cst_r = "r", + cst_cy = "cy", + cst_cx = "cx", + cst_circle = "circle", + _a_ = [0, cst_src_examples_browser_circl, 100, 12], + _c_ = [0, cst_src_examples_browser_circl, 121, 16], + _b_ = [0, cst_src_examples_browser_circl, 122, 16], + _e_ = [0, cst_src_examples_browser_circl, 130, 16], + _d_ = [0, cst_src_examples_browser_circl, 131, 16], + _f_ = [0, cst_src_examples_browser_circl, 139, 16], + _h_ = [0, cst_src_examples_browser_circl, 154, 16], + _g_ = [0, cst_src_examples_browser_circl, 155, 16], + _i_ = [0, cst_src_examples_browser_circl, 164, 16], + _j_ = [0, cst_src_examples_browser_circl, 89, 12]; + function default_circle(center_x, center_y){return [0, center_x, center_y, 20, 0]; + } + var init = [0, 0, 0, 0, [0]]; + function update(state, param){ + if(typeof param !== "number") + switch(param[0]){ + case 0: + var + id$1 = param[1], + circle$2 = caml_call2(Fmlib_std_Array[5], state[4], id$1), + _aG_ = + caml_call3 + (Fmlib_std_Array[13], + id$1, + [0, circle$2[1], circle$2[2], circle$2[3], 1], + state[4]); + return [0, state[1], state[2], state[3], _aG_]; + case 1: + var + id$2 = param[1], + circle$3 = caml_call2(Fmlib_std_Array[5], state[4], id$2), + _aH_ = + caml_call3 + (Fmlib_std_Array[13], + id$2, + [0, circle$3[1], circle$3[2], circle$3[3], 0], + state[4]); + return [0, state[1], state[2], state[3], _aH_]; + case 2: + var + center_y$0 = param[2], + center_x$0 = param[1], + _aI_ = state[4], + _aJ_ = default_circle(center_x$0, center_y$0), + _aK_ = caml_call2(Fmlib_std_Array[27], _aJ_, _aI_); + return [0, state[1], [0, 759781412, state[2]], 0, _aK_]; + case 3: + var radius$1 = param[1], _aL_ = state[1]; + if(! _aL_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + var + id$3 = _aL_[1][1], + circle$4 = caml_call2(Fmlib_std_Array[5], state[4], id$3), + _aM_ = + caml_call3 + (Fmlib_std_Array[13], + id$3, + [0, circle$4[1], circle$4[2], radius$1, circle$4[4]], + state[4]); + return [0, state[1], state[2], state[3], _aM_]; + default: + var old_radius$0 = param[2], id$4 = param[1]; + return state[1] + ? state + : [0, + [0, [0, id$4, old_radius$0]], + state[2], + state[3], + state[4]]; + } + switch(param){ + case 0: + return state; + case 1: + var _av_ = state[1]; + if(! _av_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var match = _av_[1], old_radius = match[2], i = match[1]; + return [0, + 0, + [0, [0, 1024445972, [0, i, old_radius]], state[2]], + 0, + state[4]]; + case 2: + var _aw_ = state[2]; + if(! _aw_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var _ax_ = _aw_[1]; + if(typeof _ax_ === "number"){ + var undo = _aw_[2]; + if(0 !== state[1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + if(0 >= caml_call1(Fmlib_std_Array[1], state[4])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + circle = caml_call1(Fmlib_std_Array[7], state[4]), + _ay_ = caml_call1(Fmlib_std_Array[16], state[4]); + return [0, + state[1], + undo, + [0, [0, 858544471, [0, circle[1], circle[2]]], state[3]], + _ay_]; + } + var + undo$0 = _aw_[2], + match$0 = _ax_[2], + radius = match$0[2], + id = match$0[1]; + if(0 !== state[1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + if(id >= caml_call1(Fmlib_std_Array[1], state[4])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var + circle$0 = caml_call2(Fmlib_std_Array[5], state[4], id), + _az_ = + caml_call3 + (Fmlib_std_Array[13], + id, + [0, circle$0[1], circle$0[2], radius, circle$0[4]], + state[4]); + return [0, + state[1], + undo$0, + [0, [0, 1024445972, [0, id, circle$0[3]]], state[3]], + _az_]; + default: + var _aA_ = state[3]; + if(! _aA_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var _aB_ = _aA_[1]; + if(1024445972 > _aB_[1]){ + var + redo$0 = _aA_[2], + match$2 = _aB_[2], + center_y = match$2[2], + center_x = match$2[1], + _aD_ = state[4], + _aE_ = default_circle(center_x, center_y), + _aF_ = caml_call2(Fmlib_std_Array[27], _aE_, _aD_); + return [0, state[1], [0, 759781412, state[2]], redo$0, _aF_]; + } + var + redo = _aA_[2], + match$1 = _aB_[2], + radius$0 = match$1[2], + id$0 = match$1[1]; + if(0 !== state[1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + if(id$0 >= caml_call1(Fmlib_std_Array[1], state[4])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var + circle$1 = caml_call2(Fmlib_std_Array[5], state[4], id$0), + _aC_ = + caml_call3 + (Fmlib_std_Array[13], + id$0, + [0, circle$1[1], circle$1[2], radius$0, circle$1[4]], + state[4]); + return [0, + state[1], + [0, [0, 1024445972, [0, id$0, circle$1[3]]], state[2]], + redo, + _aC_]; + } + } + function view_circle(i, circle){ + function int_attr(key, i){ + var _au_ = caml_call1(Stdlib[33], i); + return caml_call2(Fmlib_browser[6][3], key, _au_); + } + var + _af_ = 0, + _ag_ = 0, + _ah_ = circle[4] ? cst_blue : cst_gray, + _ai_ = [0, caml_call2(Fmlib_browser[6][1], cst_fill, _ah_), _ag_], + _aj_ = + [0, caml_call2(Fmlib_browser[6][1], cst_stroke_width, cst_2), _ai_], + _ak_ = [0, caml_call2(Fmlib_browser[6][1], cst_stroke, cst_black), _aj_], + _al_ = caml_call1(Fmlib_browser[5][2], [4, i, circle[3]]), + _am_ = + [0, + caml_call4 + (Fmlib_browser[6][4], + cst_click, + Fmlib_browser[3][3], + Fmlib_browser[3][2], + _al_), + _ak_], + _an_ = caml_call1(Fmlib_browser[5][2], [1, i]), + _ao_ = [0, caml_call2(Fmlib_browser[6][5], cst_mouseleave, _an_), _am_], + _ap_ = caml_call1(Fmlib_browser[5][2], [0, i]), + _aq_ = [0, caml_call2(Fmlib_browser[6][5], cst_mouseenter, _ap_), _ao_], + _ar_ = [0, int_attr(cst_r, circle[3]), _aq_], + _as_ = [0, int_attr(cst_cy, circle[2]), _ar_], + _at_ = [0, int_attr(cst_cx, circle[1]), _as_]; + return caml_call3(Fmlib_browser[7][4], cst_circle, _at_, _af_); + } + function view_circles(state){ + var _ab_ = state[4], _ac_ = 0; + function _ad_(lst, i, circle){return [0, view_circle(i, circle), lst];} + var _ae_ = caml_call3(Fmlib_std_Array[19], _ad_, _ac_, _ab_); + return caml_call1(Fmlib_std_List[11], _ae_); + } + function view_resize(state){ + var _P_ = state[1]; + if(! _P_) return 0; + var + i = _P_[1][1], + circle = caml_call2(Fmlib_std_Array[5], state[4], i), + _Q_ = [0, caml_call1(Fmlib_browser[7][1], cst_Ok), 0], + _R_ = [0, caml_call1(Fmlib_browser[6][6], 1), 0], + _S_ = [0, caml_call2(Fmlib_browser[7][16], _R_, _Q_), 0], + _U_ = caml_call1(Stdlib[33], circle[3]), + _T_ = 0, + _V_ = [0, caml_call1(Fmlib_browser[6][22], _U_), 0]; + function _W_(value){ + var match = caml_call1(Stdlib[34], value); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + var radius = match[1]; + return [3, radius]; + } + var + _X_ = [0, caml_call1(Fmlib_browser[6][24], _W_), _V_], + _Y_ = [0, caml_call2(Fmlib_browser[6][3], cst_display, cst_block), _X_], + _Z_ = [0, caml_call2(Fmlib_browser[6][3], cst_step, cst_1), _Y_], + ___ = [0, caml_call2(Fmlib_browser[6][3], cst_max, cst_100), _Z_], + _$_ = [0, caml_call2(Fmlib_browser[6][3], cst_min, cst_10), ___], + _aa_ = [0, caml_call2(Fmlib_browser[6][3], cst_type, cst_range), _$_]; + return [0, caml_call2(Fmlib_browser[7][17], _aa_, _T_), _S_]; + } + function view(state){ + function disabled(b){ + var _O_ = caml_call1(Fmlib_browser[4][4], b); + return caml_call2(Fmlib_browser[6][2], cst_disabled, _O_); + } + var + _l_ = 0 !== state[1] ? 1 : 0, + _m_ = _l_ || (0 === state[2] ? 1 : 0), + disabled_undo = disabled(_m_), + _n_ = 0 !== state[1] ? 1 : 0, + _o_ = _n_ || (0 === state[3] ? 1 : 0), + disabled_redo = disabled(_o_), + _p_ = view_resize(state), + _q_ = view_circles(state), + _r_ = 0; + function _s_(x){ + function _K_(y){ + function _M_(i){ + if(2 !== i && 0 === state[1]) + return caml_call1(Fmlib_browser[5][2], [2, x, y]); + return caml_call1(Fmlib_browser[5][2], 0); + } + var + _N_ = + caml_call2(Fmlib_browser[5][14], cst_button, Fmlib_browser[5][10]); + return caml_call2(Fmlib_browser[5][5], _N_, _M_); + } + var + _L_ = + caml_call2(Fmlib_browser[5][14], cst_offsetY, Fmlib_browser[5][10]); + return caml_call2(Fmlib_browser[5][5], _L_, _K_); + } + var + _t_ = caml_call2(Fmlib_browser[5][14], cst_offsetX, Fmlib_browser[5][10]), + _u_ = caml_call2(Fmlib_browser[5][5], _t_, _s_), + _v_ = [0, caml_call2(Fmlib_browser[6][5], cst_click$0, _u_), _r_], + _w_ = [0, caml_call1(Fmlib_browser[6][14], cst_solid), _v_], + _x_ = + [0, caml_call2(Fmlib_browser[6][3], cst_display$0, cst_block$0), _w_], + _y_ = [0, caml_call2(Fmlib_browser[6][3], cst_height, cst_400), _x_], + _z_ = [0, caml_call2(Fmlib_browser[6][3], cst_width, cst_600), _y_], + _A_ = [0, caml_call3(Fmlib_browser[7][4], cst_svg, _z_, _q_), _p_], + _B_ = [0, caml_call1(Fmlib_browser[7][1], cst_Redo), 0], + _C_ = [0, caml_call1(Fmlib_browser[6][6], 3), [0, disabled_redo, 0]], + _D_ = [0, caml_call2(Fmlib_browser[7][16], _C_, _B_), 0], + _E_ = [0, caml_call1(Fmlib_browser[7][1], cst_Undo), 0], + _F_ = [0, caml_call1(Fmlib_browser[6][6], 2), [0, disabled_undo, 0]], + _G_ = [0, caml_call2(Fmlib_browser[7][16], _F_, _E_), _D_], + _H_ = [0, caml_call2(Fmlib_browser[7][12], 0, _G_), _A_], + _I_ = [0, caml_call1(Fmlib_browser[7][1], cst_Draw_Circles), 0], + _J_ = [0, caml_call2(Fmlib_browser[7][6], 0, _I_), _H_]; + return caml_call2(Fmlib_browser[7][12], 0, _J_); + } + caml_call3(Fmlib_browser[13], init, view, update); + var + Circles = + [0, + default_circle, + init, + update, + view_circle, + view_circles, + view_resize, + view]; + runtime.caml_register_global(57, Circles, "Circles"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/stdlib/std_exit.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/stdlib/std_exit.cmo.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib; + caml_call1(Stdlib[103], 0); + var Std_exit = [0]; + runtime.caml_register_global(1, Std_exit, "Std_exit"); + return; + } + (globalThis)); + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiJjaXJjbGVzLmJjLmpzIiwic291cmNlUm9vdCI6IiIsIm5hbWVzIjpbImNhbWxfaW50NjRfaXNfemVybyIsIngiLCJjYW1sX3N0cl9yZXBlYXQiLCJuIiwicyIsInIiLCJsIiwiY2FtbF9pbnQ2NF9vZmZzZXQiLCJNYXRoIiwiY2FtbF9yYWlzZV9jb25zdGFudCIsInRhZyIsImNhbWxfZ2xvYmFsX2RhdGEiLCJjYW1sX3JhaXNlX3plcm9fZGl2aWRlIiwiTWxJbnQ2NCIsImxvIiwibWkiLCJoaSIsInRoaXMiLCJ4aGkiLCJoIiwic2lnbiIsIm9mZnNldCIsIm1vZHVsdXMiLCJkaXZpc29yIiwicXVvdGllbnQiLCJ5IiwicSIsImNhbWxfaW50NjRfb2ZfaW50MzIiLCJjYW1sX2ludDY0X3RvX2ludDMyIiwiY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSIsImNhbWxfaW50NjRfbmVnIiwiY2FtbF9qc2J5dGVzX29mX3N0cmluZyIsImpzb29fc3lzX2dldGVudiIsInByb2Nlc3MiLCJnbG9iYWxUaGlzIiwidW5kZWZpbmVkIiwiY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWciLCJpIiwiY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UiLCJleG4iLCJmb3JjZSIsImNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZSIsImNhbWxfcmFpc2Vfd2l0aF9hcmciLCJhcmciLCJjYW1sX3N0cmluZ19vZl9qc2J5dGVzIiwiY2FtbF9yYWlzZV93aXRoX3N0cmluZyIsIm1zZyIsImNhbWxfaW52YWxpZF9hcmd1bWVudCIsImNhbWxfcGFyc2VfZm9ybWF0IiwiZm10IiwibGVuIiwiZiIsImMiLCJjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nIiwicmF3YnVmZmVyIiwiYnVmZmVyIiwiY2FtbF9pbnQ2NF9mb3JtYXQiLCJ3YmFzZSIsImN2dGJsIiwicCIsImNhbWxfZXhwbTFfZmxvYXQiLCJjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3QiLCJ0IiwianNvb19pc19hc2NpaSIsImNhbWxfdXRmMTZfb2ZfdXRmOCIsImIiLCJjMSIsImMyIiwidiIsImoiLCJTdHJpbmciLCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZyIsImZzX25vZGVfc3VwcG9ydGVkIiwibWFrZV9wYXRoX2lzX2Fic29sdXRlIiwicG9zaXgiLCJwYXRoIiwid2luMzIiLCJzcGxpdERldmljZVJlIiwicmVzdWx0IiwiZGV2aWNlIiwiaXNVbmMiLCJCb29sZWFuIiwicm9vdCIsInNlcCIsInBhdGhfaXNfYWJzb2x1dGUiLCJjYW1sX3RyYWlsaW5nX3NsYXNoIiwibmFtZSIsImNhbWxfY3VycmVudF9kaXIiLCJjYW1sX21ha2VfcGF0aCIsImNvbXAwIiwiY29tcCIsIm5jb21wIiwiY2FtbF91dGY4X29mX3V0ZjE2IiwiZCIsImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIiwidW5peF9lcnJvciIsIm1ha2VfdW5peF9lcnJfYXJncyIsImNvZGUiLCJzeXNjYWxsIiwiZXJybm8iLCJ2YXJpYW50IiwibnVsbCIsImFyZ3MiLCJjYW1sX25hbWVkX3ZhbHVlcyIsImNhbWxfbmFtZWRfdmFsdWUiLCJubSIsImNhbWxfcmFpc2Vfd2l0aF9hcmdzIiwiY2FtbF9zdWJhcnJheV90b19qc2J5dGVzIiwiYSIsImNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMiLCJNbEJ5dGVzIiwiY29udGVudHMiLCJsZW5ndGgiLCJjb250ZW50IiwiY2FtbF9pc19tbF9ieXRlcyIsImNhbWxfaXNfbWxfc3RyaW5nIiwiY2FtbF9ieXRlc19vZl9hcnJheSIsIlVpbnQ4QXJyYXkiLCJjYW1sX2J5dGVzX29mX2pzYnl0ZXMiLCJjYW1sX2J5dGVzX29mX3N0cmluZyIsImNhbWxfcmFpc2Vfc3lzX2Vycm9yIiwiY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUiLCJjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkiLCJjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzIiwiY2FtbF9jcmVhdGVfYnl0ZXMiLCJjYW1sX21sX2J5dGVzX2xlbmd0aCIsImNhbWxfYmxpdF9ieXRlcyIsInMxIiwiaTEiLCJzMiIsImkyIiwiTWxGaWxlIiwiTWxGYWtlRmlsZSIsIm9sZCIsImJ1ZiIsInBvcyIsImNsZW4iLCJuZXdfc3RyIiwib2xkX2RhdGEiLCJkYXRhIiwiTWxGYWtlRmQiLCJmaWxlIiwiZmxhZ3MiLCJNbEZha2VEZXZpY2UiLCJyZXMiLCJTeW1ib2wiLCJuYW1lX3NsYXNoIiwibW9kZSIsInJhaXNlX3VuaXgiLCJwYXJlbnQiLCJSZWdFeHAiLCJzZWVuIiwibSIsImVudHJ5Iiwib2siLCJBcnJheSIsImJ5dGVzIiwiY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIiwiY2FtbF9zdHJpbmdfdW5zYWZlX2dldCIsImNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIiwiY2FtbF9ieXRlc19ib3VuZF9lcnJvciIsImNhbWxfYnl0ZXNfdW5zYWZlX3NldCIsImNhbWxfYnl0ZXNfc2V0IiwiTWxOb2RlRmQiLCJmZCIsInJlcXVpcmUiLCJlcnIiLCJidWZfb2Zmc2V0IiwicmVhZCIsIk1sTm9kZURldmljZSIsImNvbnN0cyIsImtleSIsImlzQ2hhcmFjdGVyRGV2aWNlIiwibyIsImpzX3N0YXRzIiwidG9fZGlyIiwidGFyZ2V0IiwibGluayIsImZpbGVfa2luZCIsImNhbWxfZ2V0X3Jvb3QiLCJjYW1sX2ZhaWx3aXRoIiwiY2FtbF9yb290IiwianNvb19tb3VudF9wb2ludCIsInJlc29sdmVfZnNfZGV2aWNlIiwiY2FtbF9zeXNfaXNfZGlyZWN0b3J5IiwiY2FtbF9yYWlzZV9ub3RfZm91bmQiLCJjYW1sX3N5c19nZXRlbnYiLCJzaGlmdF9yaWdodF9uYXQiLCJuYXQxIiwib2ZzMSIsImxlbjEiLCJuYXQyIiwib2ZzMiIsIm5iaXRzIiwid3JhcCIsImNhbWxfZ3Jfc3RhdGUiLCJjYW1sX2dyX3N0YXRlX2dldCIsImNhbWxfZ3JfcG9pbnRfY29sb3IiLCJpbSIsImNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlIiwiTWxPYmplY3RUYWJsZSIsIk5haXZlTG9va3VwIiwib2JqcyIsImNhbWxfc3lzX3JlbmFtZSIsIm9fcm9vdCIsIm5fcm9vdCIsImNhbWxfbG9nMTBfZmxvYXQiLCJjYW1sX3J1bnRpbWVfd2FybmluZ3MiLCJjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzIiwiYm9vbCIsImNhbWxfY2xhc3NpZnlfZmxvYXQiLCJpc0Zpbml0ZSIsImlzTmFOIiwiY2FtbF9tbF9jaGFubmVscyIsImNhbWxfcmVmaWxsIiwiY2hhbiIsInN0ciIsInN0cl9hIiwibnJlYWQiLCJjYW1sX2FycmF5X2JvdW5kX2Vycm9yIiwiY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUiLCJjaGFuaWQiLCJwcmV2X21heCIsImNhbWxfZ2NfbWlub3IiLCJ1bml0IiwiY2FtbF9tbF9jb25kaXRpb25fbmV3IiwiY2FtbF9pbnQ2NF9vZl9ieXRlcyIsImNhbWxfYmFfdWludDhfZ2V0NjQiLCJiYSIsImkwIiwib2ZzIiwiYjEiLCJiMiIsImIzIiwiYjQiLCJiNSIsImI2IiwiYjciLCJiOCIsImNhbWxfaW50NjRfdG9fYnl0ZXMiLCJjYW1sX2ludDY0X21hcnNoYWwiLCJ3cml0ZXIiLCJzaXplcyIsImNhbWxfYmFfbnVtX2RpbXMiLCJjYW1sX3dyYXBfZXhjZXB0aW9uIiwiZSIsImNhbWxfY3JlYXRlX2ZpbGUiLCJqc29vX2NyZWF0ZV9maWxlIiwiY2FtbF9mc19pbml0IiwidG1wIiwiY2FtbF9tdWwiLCJjYW1sX2hhc2hfbWl4X2ludCIsImNhbWxfaGFzaF9taXhfanNieXRlcyIsInciLCJjYW1sX2hhc2hfbWl4X3N0cmluZyIsIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfc3RyaW5nIiwiY2FtbF9nZXRfY29udGludWF0aW9uX2NhbGxzdGFjayIsImNhbWxfcGFyc2VyX3RyYWNlIiwiY2FtbF9zZXRfcGFyc2VyX3RyYWNlIiwib2xkZmxhZyIsImNhbWxfbGlzdF9vZl9qc19hcnJheSIsIm51bV9kaWdpdHNfbmF0IiwibmF0IiwiY2FtbF9oYXNoX25hdCIsImNhbWxfY2FsbF9nZW4iLCJhcmdzTGVuIiwiZyIsIm5hcmdzIiwiZXh0cmFfYXJncyIsImFyZ3VtZW50cyIsImNhbWxfY2FsbGJhY2siLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzIiwiY2FtbF9zeXNfY2hkaXIiLCJkaXIiLCJjYW1sX29ial90YWciLCJGdW5jdGlvbiIsImNhbWxfb2JqX3VwZGF0ZV90YWciLCJjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fIiwiY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuIiwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3JjaW5nIiwiZmllbGQwIiwiY2FtbF9nY19jb3VudGVycyIsImNhbWxfZ3Jfc3luY2hyb25pemUiLCJjYW1sX3VuaXhfY2xvc2VkaXIiLCJkaXJfaGFuZGxlIiwiY2FtbF91bml4X29wZW5kaXIiLCJjYW1sX3VuaXhfcmV3aW5kZGlyIiwibmV3X2Rpcl9oYW5kbGUiLCJjYW1sX3JhaXNlX2VuZF9vZl9maWxlIiwiY2FtbF91bml4X3JlYWRkaXIiLCJjYW1sX3VuaXhfZmluZGZpcnN0IiwicGF0aF9qcyIsImZpcnN0X2VudHJ5IiwiY2FtbF9pc19jb250aW51YXRpb25fdGFnIiwibG9nMl9vayIsImpzb29fZmxvb3JfbG9nMiIsIkluZmluaXR5IiwiY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0IiwiZmxvYXQzMmEiLCJGbG9hdDMyQXJyYXkiLCJpbnQzMmEiLCJJbnQzMkFycmF5IiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkiLCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQiLCJleHAiLCJrIiwicjMiLCJyMiIsInIxIiwiY2FtbF9iYV9zZXJpYWxpemUiLCJzeiIsImNvbXBsZXgiLCJjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50Iiwia2luZCIsImNhbWxfYmFfY3JlYXRlX2J1ZmZlciIsInNpemUiLCJ2aWV3IiwiRmxvYXQ2NEFycmF5IiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIlVpbnQxNkFycmF5IiwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIiwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzIiwiTmFOIiwiY2FtbF9iYV9nZXRfc2l6ZSIsImRpbXMiLCJuX2RpbXMiLCJjYW1sX2ludDY0X2NyZWF0ZV9sb19oaSIsImNhbWxfaW50NjRfaGkzMiIsImNhbWxfaW50NjRfbG8zMiIsImNhbWxfYmFfY3VzdG9tX25hbWUiLCJNbF9CaWdhcnJheSIsImxheW91dCIsInJlIiwidG90YWwiLCJrMSIsImsyIiwiTWxfQmlnYXJyYXlfY18xXzEiLCJjYW1sX2JhX2NyZWF0ZV91bnNhZmUiLCJzaXplX3Blcl9lbGVtZW50IiwiY2FtbF9iYV9kZXNlcmlhbGl6ZSIsInJlYWRlciIsIm51bV9kaW1zIiwic2l6ZV9kaW0iLCJzaXplX2RpbV9oaSIsInNpemVfZGltX2xvIiwic2l4dHkiLCJpbnQ2NCIsImNhbWxfYmFfY29tcGFyZSIsImNhbWxfaGFzaF9taXhfaW50NjQiLCJjYW1sX2hhc2hfbWl4X2Zsb2F0IiwidjAiLCJjYW1sX2JhX2hhc2giLCJudW1fZWx0cyIsImNhbWxfaW50MzJfdW5tYXJzaGFsIiwiY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsIiwiY2FtbF9pbnQ2NF91bm1hcnNoYWwiLCJjYW1sX2ludDY0X2NvbXBhcmUiLCJjYW1sX2ludDY0X2hhc2giLCJjYW1sX2N1c3RvbV9vcHMiLCJjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20iLCJjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20iLCJudW0iLCJjdXN0b20iLCJzd2FwIiwiY2FtbF9jb21wYXJlX3ZhbF90YWciLCJOdW1iZXIiLCJjYW1sX2ludF9jb21wYXJlIiwiY2FtbF9zdHJpbmdfY29tcGFyZSIsImNhbWxfYnl0ZXNfY29tcGFyZSIsImNhbWxfY29tcGFyZV92YWwiLCJzdGFjayIsInRhZ19hIiwidGFnX2IiLCJjYW1sX2dyZWF0ZXJ0aGFuIiwiZGl2X2hlbHBlciIsInoiLCJkaXZfZGlnaXRfbmF0IiwibmF0cSIsIm9mc3EiLCJuYXRyIiwib2ZzciIsInJlbSIsIm51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdCIsInNoaWZ0X2xlZnRfbmF0IiwiTWxOYXQiLCJjcmVhdGVfbmF0IiwiYXJyIiwic2V0X3RvX3plcm9fbmF0IiwiaW5jcl9uYXQiLCJjYXJyeV9pbiIsImNhcnJ5IiwiYWRkX25hdCIsImxlbjIiLCJuYXRfb2ZfYXJyYXkiLCJtdWx0X2RpZ2l0X25hdCIsIm5hdDMiLCJvZnMzIiwieDEiLCJ4MiIsIngzIiwiZGVjcl9uYXQiLCJib3Jyb3ciLCJzdWJfbmF0IiwiY29tcGFyZV9uYXQiLCJkaXZfbmF0IiwicXVvIiwiY2FtbF9iYV9ibGl0Iiwic3JjIiwiZHN0IiwiaXNfZGlnaXRfaW50IiwiY2FtbF9pbnQ2NF9kaXYiLCJjYW1sX2pzX2h0bWxfZW50aXRpZXMiLCJlbnRpdHkiLCJ0ZW1wIiwiZG9jdW1lbnQiLCJjYW1sX3N0cmluZ191bnNhZmVfc2V0IiwiY2FtbF9pbnQ2NF9vZl9mbG9hdCIsImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0IiwiY2FtbF9iYV9zZXRfMiIsImNhbWxfYXJndiIsIm1haW4iLCJhcmd2IiwiYXJnczIiLCJjYW1sX2V4ZWN1dGFibGVfbmFtZSIsImNhbWxfanNfZXZhbF9zdHJpbmciLCJldmFsIiwic2VyaWFsaXplX25hdCIsImNhbWxfbWVtcHJvZl9zZXQiLCJfY29udHJvbCIsImNhbWxfc3lzX2V4aXQiLCJjYW1sX2NoYW5uZWxfZGVzY3JpcHRvciIsImNhbWxfanNfZnJvbV9hcnJheSIsImNhbWxfYmFfcmVzaGFwZSIsInZpbmQiLCJuZXdfZGltIiwiY2FtbF9vb19sYXN0X2lkIiwiY2FtbF9zZXRfb29faWQiLCJjYW1sX2dyX2ZpbGxfcmVjdCIsImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhIiwic3RyMSIsInBvczEiLCJiYTIiLCJwb3MyIiwic2xpY2UiLCJjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUiLCJqc25hbWUiLCJjYW1sX2dldF9nbG9iYWxfZGF0YSIsImNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQiLCJjYW1sX2JhX3VpbnQ4X2dldDE2IiwiY2FtbF9jb21wYXJlIiwiY2FtbF9NRDVUcmFuc2Zvcm0iLCJhZGQiLCJ4eCIsImZmIiwiZ2ciLCJoaCIsImlpIiwiY2FtbF9NRDVVcGRhdGUiLCJjdHgiLCJpbnB1dCIsImlucHV0X2xlbiIsImluX2J1ZiIsImlucHV0X3BvcyIsIm1pc3NpbmciLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3JlYWRfcG9sbCIsImN1cnNvciIsImNhbGxiYWNrcyIsImNhbWxfZnJlc2hfb29faWQiLCJjYW1sX2ludDY0X3RvX2Zsb2F0IiwiY2FtbF9iYV9nZXRfMSIsImNhbWxfYmlnc3RyaW5nX21lbWNtcCIsImNhbWxfbmV3X3N0cmluZyIsImNhbWxfZXJmX2Zsb2F0IiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImNhbWxfYmFfdWludDhfZ2V0MzIiLCJjYW1sX3Jhd19iYWNrdHJhY2VfbGVuZ3RoIiwiY2FtbF9zdHJfaW5pdGlhbGl6ZSIsImNhbWxfb2JqX2Jsb2NrIiwiY2FtbF9ncl9jbGVhcl9ncmFwaCIsImJpZ3N0cmluZ190b19hcnJheV9idWZmZXIiLCJicyIsImNhbWxfc3lzX2NvbnN0X25ha2VkX3BvaW50ZXJzX2NoZWNrZWQiLCJfdW5pdCIsImx4b3JfZGlnaXRfbmF0IiwiY2FtbF9vYmpfYWRkX29mZnNldCIsImNhbWxfZmluYWxfcmVsZWFzZSIsImNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSIsImNhbWxfanNfdG9fYXJyYXkiLCJjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGUiLCJjYW1sX2dyX3Bsb3QiLCJjb2xvciIsImNhbWxfYnl0ZXNfc2V0NjQiLCJpNjQiLCJjYW1sX3N0cmluZ19zZXQxNiIsImkxNiIsImNhbWxfaW50NjRfYnN3YXAiLCJjYW1sX2djX21ham9yIiwiY2FtbF9sZXhfYXJyYXkiLCJjYW1sX2xleF9lbmdpbmUiLCJ0YmwiLCJzdGFydF9zdGF0ZSIsImxleGJ1ZiIsImxleF9idWZmZXIiLCJsZXhfYnVmZmVyX2xlbiIsImxleF9zdGFydF9wb3MiLCJsZXhfY3Vycl9wb3MiLCJsZXhfbGFzdF9wb3MiLCJsZXhfbGFzdF9hY3Rpb24iLCJsZXhfZW9mX3JlYWNoZWQiLCJsZXhfYmFzZSIsImxleF9iYWNrdHJrIiwibGV4X2RlZmF1bHQiLCJsZXhfdHJhbnMiLCJsZXhfY2hlY2siLCJzdGF0ZSIsImJhc2UiLCJiYWNrdHJrIiwiY2FtbF9zeXNfZmlsZV9leGlzdHMiLCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90IiwiY2FtbF9hcnJheV9zdWIiLCJjYW1sX2J5dGVzX2VxdWFsIiwiY2FtbF9ncl9zaXplX3giLCJCYXNlX2ludF9tYXRoX2ludDMyX2NseiIsImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMiLCJjYW1sX2F0b21pY19mZXRjaF9hZGQiLCJyZWYiLCJvc190eXBlIiwiY2FtbF9zeXNfY29uc3Rfb3N0eXBlX2N5Z3dpbiIsImNhbWxfY29zaF9mbG9hdCIsIk1sTXV0ZXgiLCJjYW1sX21sX211dGV4X25ldyIsImNhbWxfZXBoZV9rZXlfb2Zmc2V0IiwiY2FtbF9lcGhlX2NoZWNrX2tleSIsIndlYWsiLCJjYW1sX2hhc2hfbWl4X2ZpbmFsIiwiY2FtbF9ncl90ZXh0X3NpemUiLCJ0eHQiLCJjYW1sX2xleF9ydW5fbWVtIiwibWVtIiwiY3Vycl9wb3MiLCJjYW1sX2xleF9ydW5fdGFnIiwiY2FtbF9uZXdfbGV4X2VuZ2luZSIsImxleF9tZW0iLCJsZXhfYmFzZV9jb2RlIiwibGV4X2JhY2t0cmtfY29kZSIsImxleF9kZWZhdWx0X2NvZGUiLCJsZXhfdHJhbnNfY29kZSIsImxleF9jaGVja19jb2RlIiwibGV4X2NvZGUiLCJwY19vZmYiLCJwc3RhdGUiLCJiYXNlX2NvZGUiLCJjYW1sX2JhX3VpbnQ4X3NldDY0IiwiY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lIiwiY2FtbF9sZXNzZXF1YWwiLCJjYW1sX2Fjb3NoX2Zsb2F0IiwiY2FtbF9NRDVJbml0IiwiQXJyYXlCdWZmZXIiLCJiMzIiLCJVaW50MzJBcnJheSIsImNhbWxfbWxfZmx1c2giLCJjYW1sX3NlZWtfb3V0IiwiY2FtbF9tbF9zZWVrX291dF82NCIsImNvbXBhcmVfbmF0X3JlYWwiLCJjYW1sX2djX3NldCIsImNhbWxfanNfZ2V0IiwiY2FtbF91bml4X2lzYXR0eSIsImZpbGVEZXNjcmlwdG9yIiwidHR5IiwiY2FtbF9tbF9zZXRfYnVmZmVyZWQiLCJjYW1sX2hhc2hfbWl4X2J5dGVzX2FyciIsImNhbWxfbWxfYnl0ZXNfY29udGVudCIsImNhbWxfaGFzaF9taXhfYnl0ZXMiLCJjYW1sX2hhc2giLCJjb3VudCIsImxpbWl0Iiwic2VlZCIsIm9iaiIsInF1ZXVlIiwicmQiLCJ3ciIsIkJhc2VfaGFzaF9zdHJpbmciLCJjYW1sX2djX2NvbXBhY3Rpb24iLCJjYW1sX2VwaGVfZ2V0X2tleSIsImNhbWxfdW5peF9sb2NhbHRpbWUiLCJEYXRlIiwiZF9udW0iLCJqYW51YXJ5Zmlyc3QiLCJkb3kiLCJqYW4iLCJqdWwiLCJzdGRUaW1lem9uZU9mZnNldCIsImNhbWxfdW5peF9ta3RpbWUiLCJ0bSIsInRtMiIsImNhbWxfYmlnc3RyaW5nX2JsaXRfYnl0ZXNfdG9fYmEiLCJjYW1sX3N5c19mZHMiLCJjYW1sX3N5c19jbG9zZSIsImNhbWxfbWxfY2xvc2VfY2hhbm5lbCIsIkJhc2VfaW50X21hdGhfaW50X3Bvd19zdHViIiwiZXhwb25lbnQiLCJvbmUiLCJtdWwiLCJjYW1sX2F0b21pY19leGNoYW5nZSIsImNhbWxfc3lzX2lzYXR0eSIsIl9jaGFuIiwiaXNfZGlnaXRfemVybyIsImNhbWxfdW5peF9sc3RhdCIsImNhbWxfdW5peF9sc3RhdF82NCIsImNhbWxfanNfc2V0IiwiY2FtbF9hcnJheV9nZXQiLCJhcnJheSIsImluZGV4IiwiY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjIiwiY29udCIsImNhbWxfdW5peF9ybWRpciIsImNhbWxfbG9nMl9mbG9hdCIsImNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudCIsImNhbWxfcnVudGltZV9ldmVudHNfcmVzdW1lIiwiY2FtbF9zcGFjZXRpbWVfb25seV93b3Jrc19mb3JfbmF0aXZlX2NvZGUiLCJjYW1sX2ludDY0X3N1YiIsImNhbWxfc2Vla19pbiIsImNhbWxfbWxfc2Vla19pbl82NCIsImNhbWxfZG9tYWluX2lkIiwiY2FtbF9tbF9tdXRleF91bmxvY2siLCJjYW1sX2RvbWFpbl9sYXRlc3RfaWR4IiwiY2FtbF9kb21haW5fc3Bhd24iLCJtdXRleCIsImlkIiwiY2FtbF91bml4X21rZGlyIiwicGVybSIsImNhbWxfaW50NjRfc2hpZnRfbGVmdCIsImNhbWxfbm90ZXF1YWwiLCJjYW1sX3N5c19jb25zdF9pbnRfc2l6ZSIsImNhbWxfanNfd3JhcF9jYWxsYmFjayIsImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrIiwiY2FtbF9pc19qcyIsIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfZmxvYXQiLCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcndhcmQiLCJjYW1sX2JhX2RpbSIsImNhbWxfYmFfZGltXzEiLCJjYW1sX2pzX21ldGhfY2FsbCIsImNhbWxfZXBoZV9kYXRhX29mZnNldCIsImNhbWxfd2Vha19jcmVhdGUiLCJjYW1sX2VwaGVfY3JlYXRlIiwiY2FtbF9qc190b19ieXRlX3N0cmluZyIsImNhbWxfdHJhbXBvbGluZSIsImNhbWxfbWF5YmVfcHJpbnRfc3RhdHMiLCJjYW1sX2J5dGVzX3Vuc2FmZV9nZXQiLCJjYW1sX2J5dGVzX2dldDY0IiwiY2FtbF9jdXN0b21fZXZlbnRfaW5kZXgiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVnaXN0ZXIiLCJldmVudF9uYW1lIiwiZXZlbnRfdGFnIiwiZXZlbnRfdHlwZSIsImNhbWxfdW5peF9oYXNfc3ltbGluayIsImNhbWxfZXBoZV9zZXRfa2V5IiwiT2JqZWN0IiwiY2FtbF9lcGhlX3Vuc2V0X2tleSIsImNhbWxfd2Vha19zZXQiLCJjYW1sX3N5c19yZW1vdmUiLCJjYW1sX3N0cmluZ19ib3VuZF9lcnJvciIsImNhbWxfc3RyaW5nX2dldDMyIiwiY2FtbF9ieXRlc19nZXQiLCJjYW1sX2h5cG90X2Zsb2F0IiwiY2FtbF9qc19jYWxsIiwiY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSIsImNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nIiwiQmFzZV9hbV90ZXN0aW5nIiwiY2FtbF9ieXRlc19sZXNzdGhhbiIsImNhbWxfZXJmY19mbG9hdCIsImNhbWxfZ3JfZmlsbF9wb2x5IiwiYXIiLCJjYW1sX2djX3F1aWNrX3N0YXQiLCJjYW1sX21sX2lucHV0X2NoYXIiLCJjYW1sX21sX2lucHV0X2ludCIsImNhbWxfZ3JfZGlzcGxheV9tb2RlIiwiY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzIiwibnRoX2RpZ2l0X25hdCIsImNhbWxfYXJyYXlfYmxpdCIsImNhbWxfZmxvYXRfb2Zfc3RyaW5nIiwibTMiLCJtYW50aXNzYSIsInBhcnNlSW50IiwiY2FtbF9zeXNfZ2V0Y3dkIiwiY2FtbF9pbnQ2NF9hZGQiLCJjYW1sX2ludDY0X211bCIsImNhbWxfaW50NjRfdWx0IiwiY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIiwiY2FtbF9wYXJzZV9kaWdpdCIsImNhbWxfaW50NjRfb2Zfc3RyaW5nIiwiYmFzZTY0IiwidGhyZXNob2xkIiwiY2FtbF9iYV9zZXRfMSIsImNhbWxfaW50NjRfeG9yIiwiY2FtbF9pbnQ2NF9vciIsImNhbWxfbHhtX25leHQiLCJzaGlmdF9sIiwic2hpZnRfciIsIm9yIiwieG9yIiwicm90bCIsImdldCIsInNldCIsIk0iLCJkYWJhIiwicTAiLCJxMSIsInN0IiwieDAiLCJjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIiwiY2FtbF9saXN0X3RvX2pzX2FycmF5IiwiY2FtbF9vdXRwdXRfdmFsIiwiV3JpdGVyIiwidmFsdWUiLCJub19zaGFyaW5nIiwiY2xvc3VyZXMiLCJjb25zb2xlIiwiaW50ZXJuX29ial90YWJsZSIsIm1lbW8iLCJleGlzdGluZ19vZmZzZXQiLCJleHRlcm5fcmVjIiwib3BzIiwic3pfMzJfNjQiLCJoZWFkZXJfcG9zIiwib2xkX3BvcyIsInR5cGVfb2ZfdiIsImNhbWxfc3RyaW5nX29mX2FycmF5IiwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIiwiY2FtbF9yYWlzZV9ub3RfYV9kaXIiLCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZCIsImNtZCIsImNoaWxkX3Byb2Nlc3MiLCJjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvbiIsImNhbWxfdW5peF9nZXR1aWQiLCJkZXNlcmlhbGl6ZV9uYXQiLCJpbml0aWFsaXplX25hdCIsImNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmciLCJjYW1sX2dyX29wZW5fc3Vid2luZG93IiwiVUludDhBcnJheVJlYWRlciIsImNhbWxfbWFyc2hhbF9kYXRhX3NpemUiLCJyZWFkdmxxIiwib3ZlcmZsb3ciLCJuNyIsImhlYWRlcl9sZW4iLCJkYXRhX2xlbiIsIk1sU3RyaW5nUmVhZGVyIiwienN0ZF9kZWNvbXByZXNzIiwiYWIiLCJ1OCIsInUxNiIsInUzMiIsImkzMiIsInNsYyIsImZpbGwiLCJjcHciLCJlYyIsImluZCIsIm50IiwiRXJyb3IiLCJyYiIsInJ6ZmgiLCJkYXQiLCJuMyIsImZsZyIsInNzIiwiY2MiLCJkZiIsImZjZiIsImJ0IiwiZGIiLCJkaSIsImZzYiIsImZzcyIsIndzIiwid2IiLCJtc2IiLCJ2YWwiLCJiaXRzIiwicmZzZSIsIm1hbCIsInRwb3MiLCJhbCIsInByb2JzIiwic3ltIiwiaHQiLCJmcmVxIiwiZHN0YXRlIiwibnN0YXRlIiwiYmIxIiwic3ltcyIsImNidCIsIm1zayIsIm1zazFmYiIsIm1zdiIsInN2YWwiLCJyYnQiLCJzeW1wb3MiLCJzc3RlcCIsInNtYXNrIiwic2YiLCJucyIsIm5iIiwicmh1Iiwid2MiLCJoYiIsImh3IiwicmMiLCJyaSIsIl9hIiwiZWJ0IiwiZmR0IiwiZXBvcyIsImxiIiwic3QxIiwic3QyIiwiYnRyMSIsImJ0cjIiLCJmcG9zIiwiYnl0ZSIsIndlcyIsInd0IiwibWIiLCJ0cyIsImhidWYiLCJwdiIsImRsbHQiLCJkbWx0IiwiZG9jdCIsImIyYmwiLCJibCIsImxsYiIsImxsYmwiLCJtbGIiLCJtbGJsIiwiZGh1Iiwib3V0IiwiaHUiLCJlYiIsImJ0ciIsImRodTQiLCJzejEiLCJzejIiLCJzejMiLCJyemIiLCJiMCIsImJ0eXBlIiwibGJ0IiwibHNzIiwibGNzIiwiczQiLCJzcGwiLCJodWQiLCJzY20iLCJkdHMiLCJtZCIsInJidWYiLCJfYiIsIm1sdCIsIm9jdCIsImxsdCIsInNwb3MiLCJvdWJ0IiwibHN0Iiwib3N0IiwibXN0IiwibGxjIiwibGJ0ciIsIm1sYyIsIm1idHIiLCJvZmMiLCJvYnRyIiwib2ZwIiwib2ZmIiwibWwiLCJsbCIsImlkeCIsInN0aW4iLCJjY3QiLCJidWZzIiwib2wiLCJjaGsiLCJibGsiLCJjYW1sX2Zsb2F0X29mX2J5dGVzIiwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlciIsIm1hZ2ljIiwiY29tcHJlc3NlZCIsInVuY29tcHJlc3NlZF9kYXRhX2xlbiIsIm51bV9vYmplY3RzIiwiX3NpemVfMzIiLCJfc2l6ZV82NCIsIm9ial9jb3VudGVyIiwiaW50ZXJuX3JlYyIsImhlYWRlciIsImV4cGVjdGVkX3NpemUiLCJjYW1sX3N0cmluZ19vZl9ieXRlcyIsImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyIsImNhbWxfaW5wdXRfdmFsdWUiLCJibG9jayIsImNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwIiwiY2FtbF9hdG9taWNfY2FzIiwiY2FtbF9jb3B5c2lnbl9mbG9hdCIsImNhbWxfZ3Jfc2V0X3RleHRfc2l6ZSIsImNhbWxfYXRvbWljX2xvYWQiLCJjYW1sX01ENUZpbmFsIiwiY2FtbF9tZDVfYnl0ZXMiLCJjYW1sX2JhX3NldF9nZW5lcmljIiwiY2FtbF9tbF9jb25kaXRpb25fd2FpdCIsIm11dGV4dCIsImNhbWxfc3RyaW5nX2xlc3NlcXVhbCIsImNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbCIsImNhbWxfbmV4dGFmdGVyX2Zsb2F0IiwiY2FtbF9ncl9zaXplX3kiLCJjYW1sX3Bvc19pbiIsImNhbWxfbWxfcG9zX2luIiwiY2FtbF9pbnQ2NF9hbmQiLCJCYXNlX2ludF9tYXRoX2ludDY0X3Bvd19zdHViIiwiY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIiwiY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZSIsImNhbWxfdW5peF91bmxpbmsiLCJjYW1sX3N5c19vcGVuX2Zvcl9ub2RlIiwiZnMiLCJmZDIiLCJNbEZha2VGZF9vdXQiLCJjYW1sX3N5c19vcGVuX2ludGVybmFsIiwiY2FtbF9zeXNfb3BlbiIsIl9wZXJtcyIsImNhbWxfc3RyaW5nX2dldCIsInJlX21hdGNoIiwicmVfd29yZF9sZXR0ZXJzIiwib3Bjb2RlcyIsImlzX3dvcmRfbGV0dGVyIiwiaW5fYml0c2V0IiwicmVfbWF0Y2hfaW1wbCIsInBhcnRpYWwiLCJwcm9nIiwiY3Bvb2wiLCJub3JtdGFibGUiLCJudW1ncm91cHMiLCJudW1yZWdpc3RlcnMiLCJzdGFydGNoYXJzIiwicGMiLCJxdWl0IiwiZ3JvdXBzIiwicmVfcmVnaXN0ZXIiLCJiYWNrdHJhY2siLCJpdGVtIiwicHVzaCIsImFjY2VwdCIsInByZWZpeF9tYXRjaCIsIm9wIiwic2FyZyIsInVhcmciLCJncm91cCIsInJlX3NlYXJjaF9iYWNrd2FyZCIsImNhbWxfanNfZnJvbV9zdHJpbmciLCJjYW1sX2JhX3N1YiIsImNoYW5nZWRfZGltIiwibmV3X2RpbXMiLCJuZXdfZGF0YSIsImNhbWxfZ2NfZnVsbF9tYWpvciIsImNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2siLCJjYW1sX2J5dGVzX3NldDMyIiwiY2FtbF9ncl9zaWdpb19zaWduYWwiLCJjYW1sX2JhX3VpbnQ4X3NldDMyIiwiY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXgiLCJjYW1sX3VuaXhfZ210aW1lIiwiY2FtbF9zaWduYml0X2Zsb2F0IiwiY2FtbF9ncl9jdXJyZW50X3giLCJjYW1sX2dyX3NldF9saW5lX3dpZHRoIiwiY2FtbF9ncl9zZXRfZm9udCIsImNhbWxfZ3Jfc2V0X2NvbG9yIiwiY29udmVydCIsIm51bWJlciIsImNfc3RyIiwiY2FtbF9ncl9tb3ZldG8iLCJjYW1sX2dyX3Jlc2l6ZV93aW5kb3ciLCJjYW1sX2dyX3N0YXRlX2luaXQiLCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkiLCJ0YSIsImNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSIsImNhbWxfbWxfc2Vla19vdXQiLCJjYW1sX2pzX3R5cGVvZiIsImNhbWxfc3RyaW5nX2hhc2giLCJjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZSIsIkJhc2VfaW50X21hdGhfaW50MzJfY3R6IiwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY3R6IiwiY2FtbF9ncl9saW5ldG8iLCJjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5IiwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlIiwiY2FtbF9iYV9kaW1fMyIsImNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24iLCJjYW1sX2Zvcm1hdF9leGNlcHRpb24iLCJidWNrZXQiLCJzdGFydCIsImNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uIiwiaGFuZGxlciIsImF0X2V4aXQiLCJjYW1sX2VwaGVfY2hlY2tfZGF0YSIsImNhbWxfYnl0ZXNfZ2V0MTYiLCJjYW1sX29ial9tYWtlX2ZvcndhcmQiLCJjYW1sX2pzX2Zyb21fYm9vbCIsImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZSIsImNhbWxfZXhwMl9mbG9hdCIsImNhbWxfZ3JfY2xvc2VfZ3JhcGgiLCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludCIsImNhbWxfbWxfZG9tYWluX2NwdV9yZWxheCIsImNhbWxfY3JlYXRlX3N0cmluZyIsIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2NseiIsImNhbWxfbWxfaW5wdXRfYmxvY2siLCJhdmFpbCIsImNhbWxfbWQ1X2NoYW4iLCJ0b3JlYWQiLCJjYW1sX2F0YW5oX2Zsb2F0IiwiY2FtbF9tbF9jb25kaXRpb25fc2lnbmFsIiwiY2FtbF91bml4X2ZpbmRuZXh0IiwiY2FtbF9tbF9vdXRwdXRfYnl0ZXMiLCJjYW1sX21sX291dHB1dCIsImNhbWxfbWxfZG9tYWluX2lkIiwiY2FtbF9lcGhlX2dldF9kYXRhIiwiY2FtbF94bWxodHRwcmVxdWVzdF9jcmVhdGUiLCJjYW1sX3RyYW1wb2xpbmVfcmV0dXJuIiwiY2FtbF9tbF9pc19idWZmZXJlZCIsIkJhc2VfaW50X21hdGhfaW50NjRfY2x6IiwiY2FtbF9hcnJheV9hcHBlbmQiLCJsMSIsImwyIiwiY2FtbF91bml4X2dldHRpbWVvZmRheSIsImNhbWxfdW5peF90aW1lIiwiY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGwiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3IiLCJjYW1sX2ZpbGxfYnl0ZXMiLCJjYW1sX2pzX2V4cHIiLCJjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZCIsImNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIiwiY2FtbF9ldmVudGxvZ19yZXN1bWUiLCJjYW1sX21kNV9zdHJpbmciLCJjYW1sX2FycmF5X29mX3N0cmluZyIsImNhbWxfc3RyaW5nX2VxdWFsIiwiY2FtbF9qc29vX2ZsYWdzX3VzZV9qc19zdHJpbmciLCJjYW1sX291dHB1dF92YWx1ZV90b19idWZmZXIiLCJyZV9yZXBsYWNlbWVudF90ZXh0IiwicmVwbCIsIm9yaWciLCJjdXIiLCJlbmQiLCJjYW1sX3B1cmVfanNfZXhwciIsImNhbWxfYmxpdF9zdHJpbmciLCJibGl0X25hdCIsImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXMiLCJiYTEiLCJieXRlczIiLCJjYW1sX3VuaXhfc3RhdCIsImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUiLCJqc29vX2NyZWF0ZV9maWxlX2V4dGVybiIsImNhbWxfdW5peF9zdGF0XzY0IiwiY2FtbF90b19qc19zdHJpbmciLCJjYW1sX21sX211dGV4X2xvY2siLCJyZV9zZWFyY2hfZm9yd2FyZCIsImNhbWxfbWFrZV92ZWN0IiwiaW5pdCIsImNhbWxfbWxfc2Vla19pbiIsImNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5IiwiY2FtbF9tbF9vdXRwdXRfY2hhciIsImNhbWxfc3lzX2NvbnN0X29zdHlwZV93aW4zMiIsImNhbWxfb2JqX2lzX2Jsb2NrIiwiY2FtbF9vYmpfc2V0X3Jhd19maWVsZCIsImNhbWxfanNfdmFyIiwiY2FtbF90cnVuY19mbG9hdCIsImNhbWxfZXBoZV91bnNldF9kYXRhIiwiY2FtbF9lcGhlX3NldF9kYXRhIiwiY2FtbF9lcGhlX2JsaXRfZGF0YSIsIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50NjQiLCJjYW1sX2lzX3ByaW50YWJsZSIsImNhbWxfYnl0ZXNfbGVzc2VxdWFsIiwiY2FtbF9hcnJheV9vZl9ieXRlcyIsImNhbWxfZXF1YWwiLCJyZV9wYXJ0aWFsX21hdGNoIiwiY2FtbF9zeXNfcmFuZG9tX3NlZWQiLCJidWZmIiwibm93IiwiYWxsX2ZpbmFsaXplcnMiLCJjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlIiwiY2IiLCJjYW1sX2JhX2dldF8yIiwiY2FtbF9iYV91aW50OF9zZXQxNiIsImNhbWxfbGF6eV9yZXNldF90b19sYXp5IiwiY2FtbF9qc19kZWxldGUiLCJjYW1sX2ludF9vZl9zdHJpbmciLCJjYW1sX2xpc3RfbW91bnRfcG9pbnQiLCJwcmV2IiwiY2FtbF9tYXJzaGFsX2NvbnN0YW50cyIsImNhbWxfb2JqX3Jhd19maWVsZCIsImNhbWxfanNfZXF1YWxzIiwiY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcCIsImJpZ3N0cmluZ190b190eXBlZF9hcnJheSIsImNhbWxfZ3JfYXJjX2F1eCIsImN4IiwiY3kiLCJyeSIsInJ4Iiwicm90IiwieFBvcyIsInlQb3MiLCJ4UG9zX3ByZXYiLCJ5UG9zX3ByZXYiLCJzcGFjZSIsImRlbHRhIiwiY2FtbF9ncl9maWxsX2FyYyIsImNhbWxfYmFfc2xpY2UiLCJudW1faW5kcyIsInN1Yl9kaW1zIiwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZSIsImNhbWxfYmFfa2luZCIsImNhbWxfYWxsb2NfZHVtbXlfaW5maXgiLCJjYW1sX2pzX2Z1bl9jYWxsIiwiY2FtbF9nY19tYWpvcl9zbGljZSIsIndvcmsiLCJjYW1sX2pzX3B1cmVfZXhwciIsImNvbXBhcmVfZGlnaXRzX25hdCIsImNhbWxfbWxfaW5wdXQiLCJjYW1sX2dyX3dhaXRfZXZlbnQiLCJfZXZsIiwiY2FtbF9ncl9zaWdpb19oYW5kbGVyIiwiY2FtbF9oYXNoX21peF9iaWdzdHJpbmciLCJjYW1sX3JlY29yZF9iYWNrdHJhY2UiLCJjYW1sX3VuaXhfY2xlYW51cCIsImNhbWxfc3lzX2dldF9jb25maWciLCJjYW1sX3N5c19jb25zdF9iYWNrZW5kX3R5cGUiLCJjYW1sX29ial9pc19zaGFyZWQiLCJjYW1sX21sX291dF9jaGFubmVsc19saXN0IiwiY2FtbF9hc2luaF9mbG9hdCIsImNhbWxfcG9zX291dCIsImJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXIiLCJjYW1sX21vZCIsImNhbWxfYmFfaW5pdCIsImNhbWxfdW5peF9maWxlZGVzY3Jfb2ZfZmQiLCJyZV9zdHJpbmdfbWF0Y2giLCJCaWdTdHJpbmdSZWFkZXIiLCJjYW1sX2dyX2R1bXBfaW1hZ2UiLCJjYW1sX2JhX2dldF9nZW5lcmljIiwiY2FtbF91bml4X3N0YXJ0dXAiLCJjYW1sX2dldF9leGNlcHRpb25fYmFja3RyYWNlIiwiY2FtbF9mb3JtYXRfZmxvYXQiLCJ0b0ZpeGVkIiwiZHAiLCJwcmVjIiwiY2FtbF9tb3VudF9hdXRvbG9hZCIsIkJhc2VfaW50X21hdGhfaW50X2NseiIsImNhbWxfc3RyaW5nX2xlc3N0aGFuIiwiY2FtbF9zdHJpbmdfZ3JlYXRlcnRoYW4iLCJjYW1sX2RpdiIsImNhbWxfb2JqX2R1cCIsImNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5IiwiY2FtbF9tZW1wcm9mX3N0YXJ0IiwicmF0ZSIsInN0YWNrX3NpemUiLCJ0cmFja2VyIiwiY2FtbF9zeXNfZ2V0X2FyZ3YiLCJjYW1sX21sX2RvbWFpbl9zZXRfbmFtZSIsIl9uYW1lIiwiY2FtbF9qc190b19ib29sIiwiY2FtbF9ncl9jcmVhdGVfaW1hZ2UiLCJjYW1sX2VwaGVfZ2V0X2tleV9jb3B5IiwiY2FtbF9sZXNzdGhhbiIsImNhbWxfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QiLCJjYW1sX2J1aWxkX3N5bWJvbHMiLCJ0b2MiLCJzeW1iIiwiY2FtbF9yZWdpc3Rlcl9nbG9iYWwiLCJuYW1lX29wdCIsIm5pZCIsIm11bHRfbmF0IiwibGVuMyIsInNxdWFyZV9uYXQiLCJjYW1sX2pzX2Zyb21fZmxvYXQiLCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIiwiY2FtbF9nY19zdGF0IiwiY2FtbF9nZXRfbWFqb3JfY3JlZGl0IiwiY2FtbF9zeXNfbW9kaWZ5X2FyZ3YiLCJjYW1sX21ldGhvZF9jYWNoZSIsImNhbWxfZ2V0X3B1YmxpY19tZXRob2QiLCJjYWNoZWlkIiwibWV0aHMiLCJsaSIsImNhbWxfanNfZ2V0X2NvbnNvbGUiLCJjYW1sX3N5c191bnNhZmVfZ2V0ZW52IiwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW4iLCJyZWZpbGwiLCJjaGFubmVsIiwiYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5IiwiY2FtbF9yb3VuZF9mbG9hdCIsImNhbWxfb2pzX25ld19hcnIiLCJGIiwiY29tcGxlbWVudF9uYXQiLCJjYW1sX2RvbWFpbl9kbHMiLCJjYW1sX2RvbWFpbl9kbHNfc2V0IiwiY2FtbF9sYXp5X3JlYWRfcmVzdWx0IiwiY2FtbF9qc19yZWdleHBzIiwiY2FtbF9qc19odG1sX2VzY2FwZSIsImNhbWxfYmFfZGltXzIiLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMiLCJjYW1sX3NpbmhfZmxvYXQiLCJjYW1sX2xkZXhwX2Zsb2F0IiwiY2FtbF9ncl9zdGF0ZV9zZXQiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0IiwiYXJpdHkiLCJjYW1sX2djX21pbm9yX3dvcmRzIiwiY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2siLCJsYW5kX2RpZ2l0X25hdCIsImNhbWxfaW50NjRfbW9kIiwiY2FtbF9vYmpfc2V0X3RhZyIsImNhbWxfaW50MzJfYnN3YXAiLCJjYW1sX2JhX3NldF8zIiwiY2FtbF9qc19pbnN0YW5jZW9mIiwiY2FtbF9nZXRfbWFqb3JfYnVja2V0IiwibnRoX2RpZ2l0X25hdF9uYXRpdmUiLCJzZXRfZGlnaXRfbmF0X25hdGl2ZSIsImRpZ2l0IiwiY2FtbF9zdHJpbmdfc2V0NjQiLCJjYW1sX2dyX3N0YXRlX2NyZWF0ZSIsImNhbnZhcyIsImNvbnRleHQiLCJjYW1sX2dyX2RyYXdfYXJjIiwiY2FtbF9iYV9tYXBfZmlsZSIsInZmZCIsInNoYXJlZCIsImNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUiLCJhcmduIiwiY2FtbF9iYV9jcmVhdGVfZnJvbSIsImRhdGExIiwiZGF0YTIiLCJqc3R5cCIsImNhbWxfdGFuaF9mbG9hdCIsIkJhc2VfaW50X21hdGhfaW50X2N0eiIsImNhbWxfcnVudGltZV9ldmVudHNfc3RhcnQiLCJjYW1sX2dyX2RyYXdfc3RyIiwiZHgiLCJjYW1sX2dyX2RyYXdfc3RyaW5nIiwiY2FtbF9ncl9kcmF3X2NoYXIiLCJjYW1sX3VubW91bnQiLCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhIiwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3N0cmluZyIsImNhbWxfbWxfcG9zX2luXzY0IiwiY2FtbF9ncl9kcmF3X2ltYWdlIiwiaW1hZ2UiLCJjYW1sX3JlZ2lzdGVyX2NoYW5uZWxfZm9yX3NwYWNldGltZSIsIl9jaGFubmVsIiwiY2FtbF9zdHJpbmdfc2V0IiwiY2FtbF9zeXNfcm1kaXIiLCJjYW1sX3VuaXhfc3ltbGluayIsInNyY19yb290IiwiZHN0X3Jvb3QiLCJCYXNlX2ludF9tYXRoX2ludDY0X2N0eiIsImlzX3plcm8iLCJsYW5kIiwic21hbGxfaW50NjQiLCJjYW1sX21sX3Bvc19vdXQiLCJCYXNlX2NhbWxfZXhuX2lzX21vc3RfcmVjZW50X2V4biIsImNhbWxfc3BhY2V0aW1lX2VuYWJsZWQiLCJjYW1sX2J5dGVzX25vdGVxdWFsIiwiY2FtbF9ydW50aW1lX3BhcmFtZXRlcnMiLCJjYW1sX2pzX29iamVjdCIsImNhbWxfYmFfY3JlYXRlIiwiZGltc19tbCIsImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSIsIkJhc2VfaW50ZXJuYWxoYXNoX2dldF9oYXNoX3ZhbHVlIiwiY2FtbF9mbWFfZmxvYXQiLCJTUExJVCIsIk1JTl9WQUxVRSIsIkVQU0lMT04iLCJDIiwiQSIsIkIiLCJtdWx0aXBseSIsImF0IiwiYWhpIiwiYWxvIiwiYmhpIiwiYmxvIiwiYWRqdXN0Iiwic2NhbGUiLCJ4cyIsInlzIiwienMiLCJ4eSIsInUiLCJjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudCIsImNhbWxfYnN3YXAxNiIsImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlIiwiY2FtbF9maW5hbF9yZWdpc3RlciIsImNhbWxfZ3JfZHJhd19yZWN0IiwiY2FtbF9zdHJpbmdfZ2V0MTYiLCJjYW1sX291dHB1dF92YWx1ZSIsImNhbWxfYmFfZ2V0XzMiLCJjYW1sX2VwaGVfYmxpdF9rZXkiLCJjYW1sX2luaXRpYWxfdGltZSIsImNhbWxfc3lzX3RpbWUiLCJjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4iLCJCYXNlX2NsZWFyX2NhbWxfYmFja3RyYWNlX3BvcyIsImNhbWxfY2hlY2tfYm91bmQiLCJjYW1sX3VuaXhfZ2V0cHd1aWQiLCJjYW1sX2JhX3RvX3R5cGVkX2FycmF5IiwiY2FtbF9kb21haW5fZGxzX2dldCIsImNhbWxfYnl0ZXNfZ2V0MzIiLCJjYW1sX2ZyZXhwX2Zsb2F0IiwibmVnIiwiY2FtbF9zdHJpbmdfZ2V0NjQiLCJjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb24iLCJjYW1sX21sX3Bvc19vdXRfNjQiLCJjYW1sX3VuaXhfZmluZGNsb3NlIiwiY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3ciLCJjYW1sX2Zsb2F0YXJyYXlfYmxpdCIsImNhbWxfZ2V0X21pbm9yX2ZyZWUiLCJjYW1sX3NldF9zdGF0aWNfZW52IiwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0IiwiQmFzZV9oYXNoX2RvdWJsZSIsImNhbWxfanNfbmV3IiwiY2FtbF9ncl9jdXJyZW50X3kiLCJjYW1sX2Zvcm1hdF9pbnQiLCJqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkIiwiY2FtbF9jb250aW51YXRpb25fdXNlX2FuZF91cGRhdGVfaGFuZGxlcl9ub2V4YyIsImh2YWwiLCJoZXhuIiwiaGVmZiIsImNhbWxfb2JqX3RydW5jYXRlIiwiY2FtbF9qc190b19zdHJpbmciLCJpc19kaWdpdF9vZGQiLCJjYW1sX3J1bnRpbWVfdmFyaWFudCIsImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCIsImJ1ZmZlcmVkIiwiY2FtbF9hcnJheV9jb25jYXQiLCJjYW1sX2dyX29wZW5fZ3JhcGgiLCJpbmZvIiwic3BlY3MiLCJzdGF0dXMiLCJ3aW4iLCJkb2MiLCJ0aXRsZSIsImJvZHkiLCJjYW1sX21ha2VfZmxvYXRfdmVjdCIsImNhbWxfY2JydF9mbG9hdCIsImNhbWxfZXZlbnRsb2dfcGF1c2UiLCJjYW1sX21lbXByb2Zfc3RvcCIsImNhbWxfZ3JlYXRlcmVxdWFsIiwiY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UiLCJjYW1sX2xvZzFwX2Zsb2F0IiwibXNfdG9fbmFubyIsInRpbWVfbm93X25hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVybyIsIm1zIiwibXNfaTYzIiwiY2FtbF9ydW50aW1lX2V2ZW50c19mcmVlX2N1cnNvciIsImNhbWxfbGF6eV9tYWtlX2ZvcndhcmQiLCJsb3JfZGlnaXRfbmF0IiwiY2FtbF9ncl9ibGl0X2ltYWdlIiwiaW0yIiwiY2FtbF9ncl93aW5kb3dfaWQiLCJjYW1sX2pzX29uX2llIiwidWEiLCJjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0IiwiY2FtbF9iYV9sYXlvdXQiLCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZSIsImNhbWxfYXJyYXlfc2V0IiwibmV3dmFsIiwiY2FtbF9hbGxvY19zdGFjayIsImh2IiwiaHgiLCJoZiIsImNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsIiwic2V0X2RpZ2l0X25hdCIsImNhbWxfYnl0ZXNfc2V0MTYiLCJjYW1sX2dyX2RvY19vZl9zdGF0ZSIsImNhbWxfbWxfb3V0cHV0X2ludCIsImNhbWxfb2JqX3dpdGhfdGFnIiwiY2FtbF9tbF9jaGFubmVsX3NpemUiLCJjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdCIsImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0Iiwic3R5bGUiLCJleHBfc2lnbiIsInNpZ25fc3RyIiwiY3N0IiwieF9zdHIiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfd3JpdGUiLCJldmVudCIsImV2ZW50X2NvbnRlbnQiLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3QiLCJjYW1sX3VuaXhfcmVhZGxpbmsiLCJjYW1sX2JhY2t0cmFjZV9zdGF0dXMiLCJjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIiLCJjYW1sX3N5c19hcmd2IiwiY2FtbF9iYV9maWxsIiwiY2FtbF9tb2RmX2Zsb2F0IiwiY2FtbF9nY19nZXQiLCJjYW1sX2Zsb2F0X2NvbXBhcmUiLCJjYW1sX3N0cmluZ19zZXQzMiIsImNhbWxfcGFyc2VfZW5naW5lIiwidGFibGVzIiwiZW52IiwiRVJSQ09ERSIsImxvb3AiLCJ0ZXN0c2hpZnQiLCJzaGlmdCIsInNoaWZ0X3JlY292ZXIiLCJyZWR1Y2UiLCJSRUFEX1RPS0VOIiwiUkFJU0VfUEFSU0VfRVJST1IiLCJHUk9XX1NUQUNLU18xIiwiR1JPV19TVEFDS1NfMiIsIkNPTVBVVEVfU0VNQU5USUNfQUNUSU9OIiwiQ0FMTF9FUlJPUl9GVU5DVElPTiIsImVudl9zX3N0YWNrIiwiZW52X3Zfc3RhY2siLCJlbnZfc3ltYl9zdGFydF9zdGFjayIsImVudl9zeW1iX2VuZF9zdGFjayIsImVudl9zdGFja3NpemUiLCJlbnZfc3RhY2tiYXNlIiwiZW52X2N1cnJfY2hhciIsImVudl9sdmFsIiwiZW52X3N5bWJfc3RhcnQiLCJlbnZfc3ltYl9lbmQiLCJlbnZfYXNwIiwiZW52X3J1bGVfbGVuIiwiZW52X3J1bGVfbnVtYmVyIiwiZW52X3NwIiwiZW52X3N0YXRlIiwiZW52X2VycmZsYWciLCJ0YmxfdHJhbnNsX2NvbnN0IiwidGJsX3RyYW5zbF9ibG9jayIsInRibF9saHMiLCJ0YmxfbGVuIiwidGJsX2RlZnJlZCIsInRibF9kZ290byIsInRibF9zaW5kZXgiLCJ0YmxfcmluZGV4IiwidGJsX2dpbmRleCIsInRibF90YWJsZXNpemUiLCJ0YmxfdGFibGUiLCJ0YmxfY2hlY2siLCJ0YmxfbmFtZXNfY29uc3QiLCJ0YmxfbmFtZXNfYmxvY2siLCJsb2ciLCJ0b2tlbl9uYW1lIiwibmFtZXMiLCJwcmludF90b2tlbiIsInRvayIsInRva2VuIiwibjEiLCJuMiIsInN0YXRlMSIsInNwIiwiZXJyZmxhZyIsImFzcCIsImNhbWxfanNvb19mbGFnc19lZmZlY3RzIiwiY2FtbF91cGRhdGVfZHVtbXkiLCJjYW1sX2FycmF5X2ZpbGwiLCJjYW1sX3N5c19ta2RpciIsImNhbWxfc3RyaW5nX25vdGVxdWFsIiwiY2FtbF9ieXRlc19ncmVhdGVydGhhbiIsImNhbWxfZ3JfbWFrZV9pbWFnZSIsIkJhc2VfaW50X21hdGhfaW50X3BvcGNvdW50IiwiY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXQiLCJjYW1sX3JlYWRfZmlsZV9jb250ZW50IiwiY2FtbF9qc190b19mbG9hdCIsImNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIiLCJvcmlnaW4iLCJlcmFzZV9yZWwiLCJyZXN0IiwicmVzdCQwIiwicmVzdCQxIiwicmVzdCQyIiwicmVzdCQzIiwicmVzdCQ0IiwicmVzdCQ1IiwicmVzdCQ2IiwicmVzdCQ3IiwidHkiLCJyZXN0JDgiLCJ0eTEiLCJyZXN0JDkiLCJyZXN0JDEwIiwicmVzdCQxMSIsInJlc3QkMTIiLCJyZXN0JDEzIiwiY29uY2F0X2ZtdHR5IiwiZm10dHkxIiwiZm10dHkyIiwidHkyIiwiY29uY2F0X2ZtdCIsImZtdDEiLCJmbXQyIiwicGFkIiwicGFkJDAiLCJwcmVjIiwicGFkJDEiLCJpY29udiIsInByZWMkMCIsInBhZCQyIiwiaWNvbnYkMCIsInByZWMkMSIsInBhZCQzIiwiaWNvbnYkMSIsInByZWMkMiIsInBhZCQ0IiwiaWNvbnYkMiIsInByZWMkMyIsInBhZCQ1IiwiZmNvbnYiLCJwYWQkNiIsInN0ciIsImNociIsImZtdHR5IiwicGFkJDciLCJmbXR0eSQwIiwicGFkJDgiLCJyZXN0JDE0IiwicmVzdCQxNSIsInJlc3QkMTYiLCJmbXRpbmdfbGl0IiwicmVzdCQxNyIsImZtdGluZ19nZW4iLCJyZXN0JDE4IiwicmVzdCQxOSIsImNoYXJfc2V0Iiwid2lkdGhfb3B0IiwicmVzdCQyMCIsImNvdW50ZXIiLCJyZXN0JDIxIiwicmVzdCQyMiIsImlnbiIsInJlc3QkMjMiLCJmIiwiYXJpdHkiLCJmYWlsd2l0aCIsInMiLCJpbnZhbGlkX2FyZyIsIm1pbiIsIngiLCJ5IiwibWF4IiwiYWJzIiwibG5vdCIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbl9mbG9hdCIsIm1heF9pbnQiLCJtaW5faW50Iiwic3ltYm9sIiwiczEiLCJzMiIsImwxIiwibDIiLCJjaGFyX29mX2ludCIsIm4iLCJzdHJpbmdfb2ZfYm9vbCIsImIiLCJib29sX29mX3N0cmluZyIsImJvb2xfb2Zfc3RyaW5nX29wdCIsInN0cmluZ19vZl9pbnQiLCJpbnRfb2Zfc3RyaW5nX29wdCIsInZhbGlkX2Zsb2F0X2xleGVtIiwibCIsImkiLCJpJDAiLCJzdHJpbmdfb2ZfZmxvYXQiLCJmbG9hdF9vZl9zdHJpbmdfb3B0Iiwic3ltYm9sJDAiLCJ0bCIsImhkIiwic3RkaW4iLCJzdGRvdXQiLCJzdGRlcnIiLCJvcGVuX291dF9nZW4iLCJtb2RlIiwicGVybSIsIm5hbWUiLCJjIiwib3Blbl9vdXQiLCJvcGVuX291dF9iaW4iLCJmbHVzaF9hbGwiLCJhIiwib3V0cHV0X2J5dGVzIiwib2MiLCJvdXRwdXRfc3RyaW5nIiwib3V0cHV0Iiwib2ZzIiwibGVuIiwib3V0cHV0X3N1YnN0cmluZyIsIm91dHB1dF92YWx1ZSIsImNoYW4iLCJ2IiwiY2xvc2Vfb3V0IiwiY2xvc2Vfb3V0X25vZXJyIiwib3Blbl9pbl9nZW4iLCJvcGVuX2luIiwib3Blbl9pbl9iaW4iLCJpbnB1dCIsImljIiwidW5zYWZlX3JlYWxseV9pbnB1dCIsIm9mcyQwIiwibGVuJDAiLCJyIiwibGVuJDEiLCJvZnMkMSIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9saW5lIiwiYnVpbGRfcmVzdWx0IiwiYnVmIiwicG9zJDAiLCJhY2N1IiwiYmVnIiwiYWNjdSQwIiwicmVzIiwiY2xvc2VfaW5fbm9lcnIiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50IiwicmVhZF9pbnRfb3B0IiwicmVhZF9mbG9hdCIsInJlYWRfZmxvYXRfb3B0Iiwic3RyaW5nX29mX2Zvcm1hdCIsInN5bWJvbCQxIiwic3RyMiIsInN0cjEiLCJleGl0X2Z1bmN0aW9uIiwiYXRfZXhpdCIsImZfeWV0X3RvX3J1biIsIm9sZF9leGl0IiwibmV3X2V4aXQkMCIsIm5ld19leGl0Iiwic3VjY2VzcyIsImRvX2RvbWFpbl9sb2NhbF9hdF9leGl0IiwiZG9fYXRfZXhpdCIsImV4aXQiLCJyZXRjb2RlIiwibGVmdCIsInJpZ2h0IiwiaXNfbGVmdCIsImlzX3JpZ2h0IiwiZmluZF9sZWZ0IiwiZmluZF9yaWdodCIsIm1hcF9sZWZ0IiwiZSIsIm1hcF9yaWdodCIsIm1hcCIsInYkMCIsImZvbGQiLCJlcXVhbCIsImUxIiwiZTIiLCJ2MSIsInYyIiwidjEkMCIsInYyJDAiLCJjb21wYXJlIiwib2NhbWxfdmVyc2lvbiIsIm9jYW1sX3JlbGVhc2UiLCJleGVjdXRhYmxlX25hbWUiLCJvc190eXBlIiwiYmFja2VuZF90eXBlIiwidW5peCIsIndpbjMyIiwiY3lnd2luIiwibWF4X2FycmF5X2xlbmd0aCIsIm1heF9mbG9hdGFycmF5X2xlbmd0aCIsIm1heF9zdHJpbmdfbGVuZ3RoIiwiYmlnX2VuZGlhbiIsIndvcmRfc2l6ZSIsImludF9zaXplIiwiZ2V0ZW52X29wdCIsImludGVyYWN0aXZlIiwic2V0X3NpZ25hbCIsInNpZ19udW0iLCJzaWdfYmVoIiwic2lnYWJydCIsInNpZ2Fscm0iLCJzaWdmcGUiLCJzaWdodXAiLCJzaWdpbGwiLCJzaWdpbnQiLCJzaWdraWxsIiwic2lncGlwZSIsInNpZ3F1aXQiLCJzaWdzZWd2Iiwic2lndGVybSIsInNpZ3VzcjEiLCJzaWd1c3IyIiwic2lnY2hsZCIsInNpZ2NvbnQiLCJzaWdzdG9wIiwic2lndHN0cCIsInNpZ3R0aW4iLCJzaWd0dG91Iiwic2lndnRhbHJtIiwic2lncHJvZiIsInNpZ2J1cyIsInNpZ3BvbGwiLCJzaWdzeXMiLCJzaWd0cmFwIiwic2lndXJnIiwic2lneGNwdSIsInNpZ3hmc3oiLCJjYXRjaF9icmVhayIsIm9uIiwiZGV2ZWxvcG1lbnRfdmVyc2lvbiIsImlzX2Jsb2NrIiwiZG91YmxlX2ZpZWxkIiwic2V0X2RvdWJsZV9maWVsZCIsImZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3RvciIsImxhc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yXyIsImZvcmNpbmdfdGFnIiwiY29udF90YWciLCJsYXp5X3RhZyIsImNsb3N1cmVfdGFnIiwib2JqZWN0X3RhZyIsImluZml4X3RhZyIsImZvcndhcmRfdGFnIiwibm9fc2Nhbl90YWciLCJhYnN0cmFjdF90YWciLCJzdHJpbmdfdGFnIiwiZG91YmxlX3RhZyIsImRvdWJsZV9hcnJheV90YWciLCJjdXN0b21fdGFnIiwiaW50X3RhZyIsIm91dF9vZl9oZWFwX3RhZyIsInVuYWxpZ25lZF90YWciLCJpbmZvIiwib2JqIiwic3RhcnRfZW52Iiwib2ZfdmFsIiwic2xvdCIsImlkIiwibWF4X2VwaGVfbGVuZ3RoIiwiY3JlYXRlIiwibGVuZ3RoIiwicmFpc2VfaWZfaW52YWxpZF9vZmZzZXQiLCJvIiwibXNnIiwiZ2V0X2tleSIsImdldF9rZXlfY29weSIsInNldF9rZXkiLCJ1bnNldF9rZXkiLCJjaGVja19rZXkiLCJibGl0X2tleSIsIm8xIiwibzIiLCJzZXQiLCJpbmNyIiwiZGVjciIsImZvcmNlX2dlbl9sYXp5X2Jsb2NrIiwib25seV92YWwiLCJibGsiLCJjbG9zdXJlJDAiLCJyZXN1bHQkMCIsImNsb3N1cmUiLCJyZXN1bHQiLCJlJDAiLCJmb3JjZV9sYXp5X2Jsb2NrIiwiZm9yY2VfZ2VuIiwibHp2IiwidCIsImZvcmNlX3ZhbCIsImZyb21fZnVuIiwiZnJvbV92YWwiLCJpc192YWwiLCJtYXBfdmFsIiwiZW1wdHkiLCJyZXR1cm4kMCIsImNvbnMiLCJuZXh0IiwiYXBwZW5kIiwic2VxMSIsInNlcTIiLCJzZXEiLCJmaWx0ZXJfbWFwIiwic2VxJDAiLCJmaWx0ZXIiLCJjb25jYXQiLCJmbGF0X21hcCIsImZvbGRfbGVmdCIsImFjYyIsImFjYyQwIiwiYWNjJDEiLCJpdGVyIiwidW5mb2xkIiwidSIsInUkMCIsImlzX2VtcHR5IiwieHMiLCJ1bmNvbnMiLCJ4cyQwIiwieHMkMSIsIml0ZXJpIiwiZm9sZF9sZWZ0aSIsImFjY3UkMSIsImZvcl9hbGwiLCJwIiwiZXhpc3RzIiwiZmluZCIsImZpbmRfbWFwIiwiaXRlcjIiLCJ5cyIsInlzJDAiLCJ5cyQxIiwiZm9sZF9sZWZ0MiIsImZvcl9hbGwyIiwiZXhpc3RzMiIsImVxIiwiY21wIiwiaW5pdF9hdXgiLCJqIiwiaW5pdCIsInJlcGVhdCIsImZvcmV2ZXIiLCJjeWNsZV9ub25lbXB0eSIsImN5Y2xlIiwiaXRlcmF0ZTEiLCJpdGVyYXRlIiwibWFwaV9hdXgiLCJtYXBpIiwidGFpbF9zY2FuIiwicyQwIiwic2NhbiIsInRha2VfYXV4IiwidGFrZSIsImRyb3AiLCJuJDAiLCJuJDEiLCJ0YWtlX3doaWxlIiwiZHJvcF93aGlsZSIsIm5vZGUiLCJncm91cCIsInRvX2xhenkiLCJmYWlsdXJlIiwibWVtb2l6ZSIsIm9uY2UiLCJhY3Rpb24iLCJ6aXAiLCJtYXAyIiwiaW50ZXJsZWF2ZSIsInNvcnRlZF9tZXJnZTEiLCJzb3J0ZWRfbWVyZ2UiLCJtYXBfZnN0IiwieHlzIiwieHlzJDAiLCJtYXBfc25kIiwidW56aXAiLCJmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAiLCJmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIiwieiIsInBhcnRpdGlvbl9tYXAiLCJwYXJ0aXRpb24iLCJwZWVsIiwieHNzIiwidHJhbnNwb3NlIiwidGFpbHMiLCJoZWFkcyIsInJlbWFpbmRlcnMiLCJ4c3MkMCIsInRhaWxzJDAiLCJoZWFkcyQwIiwibWFwX3Byb2R1Y3QiLCJwcm9kdWN0Iiwib2ZfZGlzcGVuc2VyIiwiaXQiLCJ0b19kaXNwZW5zZXIiLCJpbnRzIiwibm9uZSIsInNvbWUiLCJ2YWx1ZSIsImRlZmF1bHQkMCIsImdldCIsImJpbmQiLCJqb2luIiwiaXNfbm9uZSIsImlzX3NvbWUiLCJvMCIsInYwIiwidG9fcmVzdWx0IiwidG9fbGlzdCIsInRvX3NlcSIsIm9rIiwiZXJyb3IiLCJnZXRfb2siLCJnZXRfZXJyb3IiLCJtYXBfZXJyb3IiLCJpdGVyX2Vycm9yIiwiaXNfb2siLCJpc19lcnJvciIsInIwIiwicjEiLCJlMCIsInRvX29wdGlvbiIsInRvX2Zsb2F0IiwidG9fc3RyaW5nIiwiZXNjYXBlZCIsImxvd2VyY2FzZV9hc2NpaSIsInVwcGVyY2FzZV9hc2NpaSIsImMxIiwiYzIiLCJlcnJfbm9fcHJlZCIsImVycl9ub19zdWNjIiwibG9fYm91bmQiLCJoaV9ib3VuZCIsImJvbSIsInJlcCIsInN1Y2MiLCJwcmVkIiwiaXNfdmFsaWQiLCJvZl9pbnQiLCJpc19jaGFyIiwib2ZfY2hhciIsInRvX2NoYXIiLCJ1bnNhZmVfdG9fY2hhciIsImhhc2giLCJ1dGZfZGVjb2RlX2lzX3ZhbGlkIiwiZCIsInV0Zl9kZWNvZGVfbGVuZ3RoIiwidXRmX2RlY29kZV91Y2hhciIsInV0Zl9kZWNvZGUiLCJ1dGZfZGVjb2RlX2ludmFsaWQiLCJ1dGZfOF9ieXRlX2xlbmd0aCIsInV0Zl8xNl9ieXRlX2xlbmd0aCIsImwkMCIsIm50aCIsImwkMSIsIm50aF9vcHQiLCJyZXZfYXBwZW5kIiwibDEkMCIsImwyJDAiLCJsMSQxIiwibDIkMSIsInJldiIsInJldl9pbml0X3RocmVzaG9sZCIsImZsYXR0ZW4iLCJyZXZfbWFwIiwiZm9sZF9yaWdodCIsImEyIiwiYTEiLCJyZXZfbWFwMiIsImZvbGRfcmlnaHQyIiwibWVtIiwibWVtcSIsImFzc29jIiwiYXNzb2Nfb3B0IiwiYXNzcSIsImFzc3Ffb3B0IiwibWVtX2Fzc29jIiwibWVtX2Fzc3EiLCJyZW1vdmVfYXNzb2MiLCJwYWlyIiwicmVtb3ZlX2Fzc3EiLCJmaW5kX29wdCIsImZpbmRfYWxsIiwiZmlsdGVyaSIsImNvbmNhdF9tYXAiLCJmb2xkX2xlZnRfbWFwIiwibF9hY2N1IiwieCQwIiwieWVzIiwibm8iLCJzcGxpdCIsInJ5IiwicngiLCJjb21iaW5lIiwibWVyZ2UiLCJ0MiIsImgyIiwidDEiLCJoMSIsInN0YWJsZV9zb3J0Iiwic29ydCIsIngyIiwieDEiLCJ0bCQxIiwieDMiLCJ4MiQwIiwieDEkMCIsIm4xIiwibjIiLCJyZXZfc29ydCIsInRsJDAiLCJzb3J0X3VuaXEiLCJjJDAiLCJjJDEiLCJjJDIiLCJjJDMiLCJjJDQiLCJjJDUiLCJjJDYiLCJhY2N1JDIiLCJjb21wYXJlX2xlbmd0aHMiLCJjb21wYXJlX2xlbmd0aF93aXRoIiwiYXV4IiwidGFpbCIsIm9mX3NlcSIsImRpcmVjdCIsImRlcHRoIiwiemVybyIsIm9uZSIsIm1pbnVzX29uZSIsImxvZ25vdCIsIm1ha2UiLCJjb3B5Iiwib2Zfc3RyaW5nIiwic3ViIiwic3ViX3N0cmluZyIsImV4dGVuZCIsImRzdG9mZiIsInNyY29mZiIsImNweWxlbiIsImZpbGwiLCJibGl0Iiwib2ZzMSIsIm9mczIiLCJibGl0X3N0cmluZyIsInNlcCIsInNlcGxlbiIsImRzdCIsInBvcyIsImhkJDAiLCJjYXQiLCJpc19zcGFjZSIsInRyaW0iLCJ1bnNhZmVfZXNjYXBlIiwiYiQwIiwiYXBwbHkxIiwiY2FwaXRhbGl6ZV9hc2NpaSIsInVuY2FwaXRhbGl6ZV9hc2NpaSIsInN0YXJ0c193aXRoIiwicHJlZml4IiwibGVuX3MiLCJsZW5fcHJlIiwiZW5kc193aXRoIiwic3VmZml4IiwibGVuX3N1ZiIsImRpZmYiLCJpbmRleF9yZWMiLCJsaW0iLCJpJDEiLCJpbmRleCIsImluZGV4X3JlY19vcHQiLCJpbmRleF9vcHQiLCJpbmRleF9mcm9tIiwiaW5kZXhfZnJvbV9vcHQiLCJyaW5kZXhfcmVjIiwicmluZGV4IiwicmluZGV4X2Zyb20iLCJyaW5kZXhfcmVjX29wdCIsInJpbmRleF9vcHQiLCJyaW5kZXhfZnJvbV9vcHQiLCJjb250YWluc19mcm9tIiwiY29udGFpbnMiLCJyY29udGFpbnNfZnJvbSIsInNwbGl0X29uX2NoYXIiLCJ0b19zZXFpIiwibmV3X2xlbiIsIm5ld19idWYiLCJ1bnNhZmVfZ2V0X3VpbnQxNl9sZSIsInVuc2FmZV9nZXRfdWludDE2X2JlIiwiZ2V0X2ludDgiLCJnZXRfdWludDE2X2xlIiwiZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQxNl9uZSIsImdldF9pbnQxNl9sZSIsImdldF9pbnQxNl9iZSIsImdldF9pbnQzMl9sZSIsImdldF9pbnQzMl9iZSIsImdldF9pbnQ2NF9sZSIsImdldF9pbnQ2NF9iZSIsInVuc2FmZV9zZXRfdWludDE2X2xlIiwidW5zYWZlX3NldF91aW50MTZfYmUiLCJzZXRfaW50MTZfbGUiLCJzZXRfaW50MTZfYmUiLCJzZXRfaW50MzJfbGUiLCJzZXRfaW50MzJfYmUiLCJzZXRfaW50NjRfbGUiLCJzZXRfaW50NjRfYmUiLCJzZXRfdWludDgiLCJzZXRfdWludDE2X25lIiwiZGVjX2ludmFsaWQiLCJkZWNfcmV0Iiwibm90X2luX3g4MF90b194QkYiLCJub3RfaW5feEEwX3RvX3hCRiIsIm5vdF9pbl94ODBfdG9feDlGIiwibm90X2luX3g5MF90b194QkYiLCJub3RfaW5feDgwX3RvX3g4RiIsInV0Zl84X3VjaGFyXzMiLCJiMCIsImIxIiwiYjIiLCJ1dGZfOF91Y2hhcl80IiwiYjMiLCJnZXRfdXRmXzhfdWNoYXIiLCJpJDQiLCJiMSQxIiwiaSQ1IiwiYjIkMSIsImkkNiIsImkkMTAiLCJiMSQzIiwiaSQxMSIsImIyJDMiLCJpJDEyIiwiYjMkMSIsImkkNyIsImIxJDIiLCJpJDgiLCJiMiQyIiwiaSQ5IiwiYjMkMCIsImkkMTMiLCJiMSQ0IiwiaSQxNCIsImIyJDQiLCJpJDIiLCJiMSQwIiwiaSQzIiwiYjIkMCIsImkkMTUiLCJiMSQ1Iiwic2V0X3V0Zl84X3VjaGFyIiwibGFzdCQxIiwibGFzdCQwIiwibGFzdCIsImlzX3ZhbGlkX3V0Zl84IiwibGFzdCQzIiwibGFzdCQyIiwibGFzdCQ0IiwibGFzdCQ1IiwiZ2V0X3V0Zl8xNmJlX3VjaGFyIiwiaGkiLCJsbyIsInNldF91dGZfMTZiZV91Y2hhciIsInUkMSIsImlzX3ZhbGlkX3V0Zl8xNmJlIiwiZ2V0X3V0Zl8xNmxlX3VjaGFyIiwic2V0X3V0Zl8xNmxlX3VjaGFyIiwiaXNfdmFsaWRfdXRmXzE2bGUiLCJidHMiLCJib3MiLCJvZl9ieXRlcyIsInRvX2J5dGVzIiwiZyIsInRvX2J1ZmZlciIsImJ1ZmYiLCJmbGFncyIsImhlYWRlcl9zaXplIiwiZGF0YV9zaXplIiwidG90YWxfc2l6ZSIsImZyb21fYnl0ZXMiLCJmcm9tX3N0cmluZyIsIm1ha2VfbWF0cml4Iiwic3giLCJzeSIsImxhIiwibGIiLCJyZXMkMCIsImxpc3RfbGVuZ3RoIiwib2ZfbGlzdCIsImlucHV0X2FycmF5IiwiZWx0Iiwib3V0cHV0X2FycmF5IiwiZWx0JDAiLCJhY2MkMiIsImEwIiwiYmkiLCJhaSIsIm5hIiwibmIiLCJtYXhzb24iLCJpMzEiLCJlJDEiLCJqJDAiLCJmYXRoZXIiLCJzcmMxb2ZzIiwic3JjMWxlbiIsInNyYzIiLCJzcmMyb2ZzIiwic3JjMmxlbiIsImRzdG9mcyIsInNyYzFyIiwic3JjMnIiLCJzMiQxIiwiczEkMSIsImkxIiwiaTIiLCJpMiQwIiwiZCQwIiwiczIkMCIsImkxJDAiLCJkJDEiLCJzMSQwIiwiaXNvcnR0byIsInNyY29mcyIsInNvcnR0byIsImlzX2Zpbml0ZSIsImlzX2luZmluaXRlIiwiaXNfbmFuIiwiZXBzaWxvbiIsIm9mX3N0cmluZ19vcHQiLCJwaSIsImlzX2ludGVnZXIiLCJtaW5fbWF4IiwibWluX251bSIsIm1heF9udW0iLCJtaW5fbWF4X251bSIsInVuc2FmZV9maWxsIiwiY2hlY2siLCJobGVuIiwic3JjIiwic29mcyIsImRvZnMiLCJoIiwibWVtX2llZWUiLCJtYXBfdG9fYXJyYXkiLCJtYXBfZnJvbV9hcnJheSIsIm1heF9pbnQkMCIsInVuc2lnbmVkX3RvX2ludCIsInVuc2lnbmVkX2NvbXBhcmUiLCJtIiwidW5zaWduZWRfZGl2IiwicSIsInVuc2lnbmVkX3JlbSIsInNpemUiLCJkdW1teV9wb3MiLCJ6ZXJvX3BvcyIsImVuZ2luZSIsInRibCIsInN0YXRlIiwibmV3X2VuZ2luZSIsImZyb21fZnVuY3Rpb24iLCJvcHQiLCJyZWFkX2Z1biIsInN0aCIsIndpdGhfcG9zaXRpb25zIiwiYXV4X2J1ZmZlciIsImxleGJ1ZiIsInJlYWQiLCJuZXdsZW4iLCJuZXdidWYiLCJmcm9tX2NoYW5uZWwiLCJzZXRfcG9zaXRpb24iLCJwb3NpdGlvbiIsInNldF9maWxlbmFtZSIsImZuYW1lIiwibGV4ZW1lIiwic3ViX2xleGVtZSIsInN1Yl9sZXhlbWVfb3B0Iiwic3ViX2xleGVtZV9jaGFyIiwic3ViX2xleGVtZV9jaGFyX29wdCIsImxleGVtZV9jaGFyIiwibGV4ZW1lX3N0YXJ0IiwibGV4ZW1lX2VuZCIsImxleGVtZV9zdGFydF9wIiwibGV4ZW1lX2VuZF9wIiwibmV3X2xpbmUiLCJsY3AiLCJmbHVzaF9pbnB1dCIsImVudiIsImdyb3dfc3RhY2tzIiwib2xkc2l6ZSIsIm5ld3NpemUiLCJuZXdfcyIsIm5ld192IiwibmV3X3N0YXJ0IiwibmV3X2VuZCIsImNsZWFyX3BhcnNlciIsImN1cnJlbnRfbG9va2FoZWFkX2Z1biIsInl5cGFyc2UiLCJ0YWJsZXMiLCJzdGFydCIsImxleGVyIiwiaW5pdF9hc3AiLCJpbml0X3NwIiwiaW5pdF9zdGFja2Jhc2UiLCJpbml0X3N0YXRlIiwiaW5pdF9jdXJyX2NoYXIiLCJpbml0X2x2YWwiLCJpbml0X2VycmZsYWciLCJjbWQiLCJhcmciLCJhcmckMCIsImV4biQwIiwiZXhuIiwiY3Vycl9jaGFyIiwidG9rIiwicGVla192YWwiLCJzeW1ib2xfc3RhcnRfcG9zIiwic3QiLCJlbiIsInN5bWJvbF9lbmRfcG9zIiwicmhzX3N0YXJ0X3BvcyIsInJoc19lbmRfcG9zIiwic3ltYm9sX3N0YXJ0Iiwic3ltYm9sX2VuZCIsInJoc19zdGFydCIsInJoc19lbmQiLCJpc19jdXJyZW50X2xvb2thaGVhZCIsInBhcnNlX2Vycm9yIiwiaGVpZ2h0IiwiaGwiLCJoJDAiLCJociIsImJhbCIsImxyIiwibHYiLCJsbCIsImxyciIsImxydiIsImxybCIsInJyIiwicnYiLCJybCIsInJsciIsInJsdiIsInJsbCIsImFkZCIsInNpbmdsZXRvbiIsImFkZF9taW5fZWxlbWVudCIsImFkZF9tYXhfZWxlbWVudCIsInJoIiwibGgiLCJtaW5fZWx0IiwibWluX2VsdF9vcHQiLCJtYXhfZWx0IiwibWF4X2VsdF9vcHQiLCJyZW1vdmVfbWluX2VsdCIsInIkMCIsInByZXMiLCJwcmVzJDAiLCJyZW1vdmUiLCJ1bmlvbiIsInIyIiwicjIkMCIsInIxJDAiLCJpbnRlciIsInNwbGl0X2JpcyIsImRpc2pvaW50IiwiY29uc19lbnVtIiwiZTIkMiIsImUxJDIiLCJlMiQwIiwiZTEkMCIsImUyJDEiLCJlMSQxIiwic3Vic2V0IiwicHYiLCJsZiIsImx0IiwicmYiLCJydCIsImNhcmRpbmFsIiwiZWxlbWVudHNfYXV4IiwiZWxlbWVudHMiLCJmaW5kX2ZpcnN0IiwidjAkMSIsInYwJDAiLCJmaW5kX2ZpcnN0X29wdCIsImZpbmRfbGFzdCIsImZpbmRfbGFzdF9vcHQiLCJ0cnlfam9pbiIsInYkMSIsIngwIiwibCQzIiwibCQ0IiwieDAkMCIsImwkNSIsIngwJDEiLCJubCIsIm1pZCIsImwkMiIsIng0IiwiYWRkX3NlcSIsInNlcV9vZl9lbnVtIiwic25vY19lbnVtIiwicmV2X3NlcV9vZl9lbnVtIiwidG9fcmV2X3NlcSIsInRvX3NlcV9mcm9tIiwibG93IiwibGQiLCJscmQiLCJyZCIsInJsZCIsImRhdGEiLCJkMCQxIiwiZDAiLCJkMCQwIiwibWluX2JpbmRpbmciLCJtaW5fYmluZGluZ19vcHQiLCJtYXhfYmluZGluZyIsIm1heF9iaW5kaW5nX29wdCIsInJlbW92ZV9taW5fYmluZGluZyIsInVwZGF0ZSIsImRhdGEkMCIsIm0kMCIsImFkZF9taW5fYmluZGluZyIsImsiLCJhZGRfbWF4X2JpbmRpbmciLCJjb25jYXRfb3Jfam9pbiIsImQxIiwiZDIiLCJkMiQwIiwiZDEkMCIsImQyJDEiLCJkMSQxIiwicHZkIiwiZnZkIiwibTEiLCJtMiIsImJpbmRpbmdzX2F1eCIsImJpbmRpbmdzIiwiY2xlYXIiLCJwdXNoIiwicG9wIiwicG9wX29wdCIsInRvcCIsInRvcF9vcHQiLCJjZWxsIiwibWF0Y2giLCJwZWVrIiwiY29udGVudCIsInBlZWtfb3B0IiwidGFrZV9vcHQiLCJjZWxsJDAiLCJxX3JlcyIsInByZXYiLCJwcmV2JDAiLCJ0cmFuc2ZlciIsInExIiwicTIiLCJjb250ZW50cyIsImJ1ZmZlciIsInJlc2V0IiwiaW5uZXIiLCJyZXNpemUiLCJtb3JlIiwib2xkX3BvcyIsIm9sZF9sZW4iLCJuZXdfYnVmZmVyIiwiYWRkX2NoYXIiLCJ1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXgiLCJ1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4IiwiYWRkX3V0Zl84X3VjaGFyIiwiYWRkX3V0Zl8xNmJlX3VjaGFyIiwiYWRkX3V0Zl8xNmxlX3VjaGFyIiwiYWRkX3N1YnN0cmluZyIsIm9mZnNldCIsIm5ld19wb3NpdGlvbiIsImFkZF9zdWJieXRlcyIsImFkZF9zdHJpbmciLCJhZGRfYnl0ZXMiLCJhZGRfYnVmZmVyIiwiYnMiLCJhZGRfY2hhbm5lbCIsInRvX3JlYWQkMSIsImFscmVhZHlfcmVhZCIsInRvX3JlYWQiLCJhbHJlYWR5X3JlYWQkMCIsInRvX3JlYWQkMCIsIm91dHB1dF9idWZmZXIiLCJhZGRfc3Vic3RpdHV0ZSIsImxpbSQxIiwicHJldmlvdXMiLCJwcmV2aW91cyQwIiwic3RhcnQkMCIsIm9wZW5pbmciLCJsaW0kMCIsInN0b3AkMCIsImskMiIsImNsb3NpbmciLCJzdG9wIiwiayQwIiwiayQxIiwibmV4dF9pIiwiaWRlbnQiLCJ0cnVuY2F0ZSIsImFkZF9pbnQ4IiwiYWRkX2ludDE2X25lIiwiYWRkX2ludDMyX25lIiwiYWRkX2ludDY0X25lIiwiYWRkX2ludDE2X2xlIiwiYWRkX2ludDE2X2JlIiwiYWRkX2ludDMyX2xlIiwiYWRkX2ludDMyX2JlIiwiYWRkX2ludDY0X2xlIiwiYWRkX2ludDY0X2JlIiwicmVsZWFzZSIsImFjcXVpcmUiLCJ0cnlfYWNxdWlyZSIsInJldCIsImdldF92YWx1ZSIsIm1ha2UkMCIsInJlbGVhc2UkMCIsImFjcXVpcmUkMCIsInRyeV9hY3F1aXJlJDAiLCJjcHVfcmVsYXgiLCJ1bmlxdWVfdmFsdWUiLCJjcmVhdGVfZGxzIiwia2V5X2NvdW50ZXIiLCJwYXJlbnRfa2V5cyIsIm5ld19rZXkiLCJzcGxpdF9mcm9tX3BhcmVudCIsImluaXRfb3JwaGFuIiwiaWR4Iiwia2kiLCJtYXliZV9ncm93Iiwic3oiLCJuZXdfc3oiLCJuZXdfc3QiLCJnZXRfaWQiLCJkb21haW4iLCJzZWxmIiwiaXNfbWFpbl9kb21haW4iLCJmaXJzdF9kb21haW5fc3Bhd25lZCIsImZpcnN0X3NwYXduX2Z1bmN0aW9uIiwiYmVmb3JlX2ZpcnN0X3NwYXduIiwib2xkX2YiLCJuZXdfZiIsImF0X2V4aXRfa2V5Iiwic3Bhd24iLCJwayIsInRlcm1fbXV0ZXgiLCJ0ZXJtX2NvbmRpdGlvbiIsInRlcm1fc3RhdGUiLCJib2R5IiwiZXgkMCIsImV4IiwicmVjb21tZW5kZWRfZG9tYWluX2NvdW50Iiwic3ViX2Zvcm1hdCIsImZvcm1hdHRpbmdfbGl0IiwiY3JlYXRlX2NoYXJfc2V0IiwiYWRkX2luX2NoYXJfc2V0Iiwic3RyX2luZCIsIm1hc2siLCJmcmVlemVfY2hhcl9zZXQiLCJyZXZfY2hhcl9zZXQiLCJjaGFyX3NldCQwIiwiaXNfaW5fY2hhcl9zZXQiLCJwYWRfb2ZfcGFkX29wdCIsInBhZF9vcHQiLCJ3aWR0aCIsInBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCIsImZtdCIsInBhZF9vcHQkMCIsInBhZF9vcHQkMSIsInBhZF9vcHQkMiIsInBhZF9vcHQkMyIsInBhZF9vcHQkNCIsInByZWNfb3B0IiwicGFkX29wdCQ1IiwibmRlYyIsInBhZF9vcHQkNiIsInBhZF9vcHQkNyIsInBhZF9vcHQkOCIsImRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIiwiYnVmZmVyX2NyZWF0ZSIsImluaXRfc2l6ZSIsImJ1ZmZlcl9jaGVja19zaXplIiwib3ZlcmhlYWQiLCJtaW5fbGVuIiwibmV3X3N0ciIsImJ1ZmZlcl9hZGRfY2hhciIsImJ1ZmZlcl9hZGRfc3RyaW5nIiwic3RyX2xlbiIsImJ1ZmZlcl9jb250ZW50cyIsImNoYXJfb2ZfaWNvbnYiLCJjaGFyX29mX2Zjb252IiwiY0YiLCJicHJpbnRfcGFkdHkiLCJwYWR0eSIsImJwcmludF9pZ25vcmVkX2ZsYWciLCJpZ25fZmxhZyIsImJwcmludF9wYWRfb3B0IiwiYnByaW50X3BhZGRpbmciLCJwYWR0eSQwIiwiYnByaW50X3ByZWNpc2lvbiIsImJwcmludF9pY29udl9mbGFnIiwiYnByaW50X2FsdGludF9mbXQiLCJicHJpbnRfZmNvbnZfZmxhZyIsInN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCIsInN0ciQwIiwiYnByaW50X2NoYXJfbGl0ZXJhbCIsImJwcmludF9zdHJpbmdfbGl0ZXJhbCIsImJwcmludF9mbXR0eSIsImZtdHR5JDEiLCJmbXR0eSQyIiwiZm10dHkkMyIsImZtdHR5JDQiLCJmbXR0eSQ1IiwiZm10dHkkNiIsImZtdHR5JDciLCJmbXR0eSQ4IiwiZm10dHkkOSIsInN1Yl9mbXR0eSIsImZtdHR5JDEwIiwic3ViX2ZtdHR5JDAiLCJmbXR0eSQxMSIsImZtdHR5JDEyIiwiZm10dHkkMTMiLCJmbXR0eSQxNCIsImZtdHR5JDE1IiwiaW50X29mX2N1c3RvbV9hcml0eSIsInN0cmluZ19vZl9mbXQiLCJmbXRpdGVyIiwiZm10JDAiLCJpZ25fZmxhZyQwIiwic3RyJDEiLCJpc19hbG9uZSQwIiwiaXNfYWxvbmUiLCJhZnRlciIsImJlZm9yZSIsImokMSIsImZtdCQxIiwic3ltbSIsImZtdHR5X3JlbF9kZXQiLCJkZSIsImVkIiwiYWYiLCJmYSIsImRlJDAiLCJlZCQwIiwiYWYkMCIsImZhJDAiLCJkZSQxIiwiZWQkMSIsImFmJDEiLCJmYSQxIiwiZGUkMiIsImVkJDIiLCJhZiQyIiwiZmEkMiIsImRlJDMiLCJlZCQzIiwiYWYkMyIsImZhJDMiLCJkZSQ0IiwiZWQkNCIsImFmJDQiLCJmYSQ0IiwiZGUkNSIsImVkJDUiLCJhZiQ1IiwiZmEkNSIsImRlJDYiLCJlZCQ2IiwiYWYkNiIsImZhJDYiLCJkZSQ3IiwiZWQkNyIsImFmJDciLCJmYSQ3IiwiZGUkOCIsImVkJDgiLCJhZiQ4IiwiZmEkOCIsInRyYW5zIiwiamQiLCJkaiIsImdhIiwiYWciLCJkZSQ5IiwiZWQkOSIsImFmJDkiLCJmYSQ5IiwiZGUkMTAiLCJlZCQxMCIsImFmJDEwIiwiZmEkMTAiLCJkZSQxMSIsImVkJDExIiwiYWYkMTEiLCJmYSQxMSIsImRlJDEyIiwiZWQkMTIiLCJhZiQxMiIsImZhJDEyIiwiZGUkMTMiLCJlZCQxMyIsImFmJDEzIiwiZmEkMTMiLCJyZXN0MSIsInJlc3QyIiwicmVzdDEkMCIsInJlc3QyJDAiLCJyZXN0MSQxIiwicmVzdDIkMSIsInJlc3QxJDIiLCJyZXN0MiQyIiwicmVzdDEkMyIsInJlc3QyJDMiLCJyZXN0MSQ0IiwicmVzdDIkNCIsInJlc3QxJDUiLCJyZXN0MiQ1IiwicmVzdDEkNiIsInJlc3QyJDYiLCJyZXN0MSQ3IiwidHkxJDAiLCJyZXN0MiQ3IiwidHkyJDAiLCJyZXN0MSQ4IiwidHkxMiIsInR5MTEiLCJyZXN0MiQ4IiwidHkyMiIsInR5MjEiLCJmNCIsImYyIiwicmVzdDEkOSIsInJlc3QyJDkiLCJyZXN0MSQxMCIsInJlc3QyJDEwIiwicmVzdDEkMTEiLCJyZXN0MiQxMSIsInJlc3QxJDEyIiwicmVzdDIkMTIiLCJyZXN0MSQxMyIsInJlc3QyJDEzIiwiZm10dHlfb2ZfcGFkZGluZ19mbXR0eSIsImZtdHR5X29mX2N1c3RvbSIsImFyaXR5JDAiLCJmbXR0eV9vZl9mbXQiLCJ0eV9yZXN0IiwicHJlY190eSIsImZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSIsInR5X3Jlc3QkMCIsInByZWNfdHkkMCIsInR5X3Jlc3QkMSIsInByZWNfdHkkMSIsInR5X3Jlc3QkMiIsInByZWNfdHkkMiIsInR5X3Jlc3QkMyIsInByZWNfdHkkMyIsInR5JDAiLCJmb3JtYXR0aW5nX2dlbiIsInR5cGVfcGFkZGluZyIsInciLCJ0eXBlX3BhZHByZWMiLCJ0eXBlX2Zvcm1hdCIsInR5cGVfZm9ybWF0X2dlbiIsInR5cGVfaWdub3JlZF9wYXJhbV9vbmUiLCJmbXR0eTAiLCJmbXR0eV9yZXN0IiwiZm10X3Jlc3QiLCJmbXR0eV9yZXN0JDAiLCJmbXRfcmVzdCQwIiwiZm10X3Jlc3QkMSIsImZtdHR5X3Jlc3QkMSIsImZtdCQyIiwiZm10X3Jlc3QkMiIsImZtdHR5X3Jlc3QkMiIsImZtdCQzIiwiZm10X3Jlc3QkMyIsImZtdHR5X3Jlc3QkMyIsImZtdCQ0IiwiZm10X3Jlc3QkNCIsImZtdHR5X3Jlc3QkNCIsImZtdCQ1IiwiZm10X3Jlc3QkNSIsImZtdHR5X3Jlc3QkNSIsInByZWMkNCIsImZtdCQ2IiwiZm10X3Jlc3QkNiIsInByZWMkNSIsInBhZCQ5IiwicGFkJDEwIiwiZm10dHlfcmVzdCQ2IiwicHJlYyQ2IiwiZm10JDciLCJmbXRfcmVzdCQ3IiwicHJlYyQ3IiwicGFkJDExIiwicGFkJDEyIiwiZm10dHlfcmVzdCQ3IiwicHJlYyQ4IiwiZm10JDgiLCJmbXRfcmVzdCQ4IiwicGFkJDEzIiwicGFkJDE0IiwiZm10dHlfcmVzdCQ4IiwiZm10JDkiLCJmbXRfcmVzdCQ5IiwiZm10JDEwIiwiZm10X3Jlc3QkMTAiLCJmbXQkMTEiLCJmbXRfcmVzdCQxMSIsImZtdCQxMiIsImZtdHR5X3Jlc3QkOSIsImZtdF9yZXN0JDEyIiwiZm10JDEzIiwiZm10dHlfcmVzdCQxMCIsInN1Yl9mbXR0eTEiLCJmbXRfcmVzdCQxMyIsInN1Yl9mbXR0eSQxIiwiZm10JDE0IiwiZm10dHlfcmVzdCQxMSIsImZtdF9yZXN0JDE0IiwiZm10JDE1IiwiZm10dHlfcmVzdCQxMiIsImZtdF9yZXN0JDE1IiwiZm10JDE2IiwiZm10X3Jlc3QkMTYiLCJmbXR0eSQxNiIsImZtdCQxNyIsImZtdF9yZXN0JDE3IiwiZm10dHkzIiwiZm10MyIsImZtdDEkMCIsImZtdHR5MiQwIiwiZm10MiQwIiwiZm10dHkzJDAiLCJmbXQzJDAiLCJmbXR0eV9yZXN0JDEzIiwiZm10X3Jlc3QkMTgiLCJmbXR0eSQxNyIsImZtdCQxOCIsImZtdHR5X3Jlc3QkMTQiLCJmbXRfcmVzdCQxOSIsImZtdHR5JDE4IiwiZm10JDE5IiwiZm10dHlfcmVzdCQxNSIsImZtdF9yZXN0JDIwIiwiZm10dHkkMTkiLCJmbXQkMjAiLCJzdWJfZm10dHkkMiIsInN1Yl9mbXR0eSQzIiwidHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpIiwiZm10dHkkMjEiLCJmbXQkMjIiLCJzdWJfZm10dHkkNCIsImZtdHR5X3Jlc3QkMTYiLCJmbXR0eSQyMCIsImZtdCQyMSIsInN1Yl9mbXR0eV9yZXN0Iiwic3ViX2ZtdHR5X3Jlc3QkMCIsInN1Yl9mbXR0eV9yZXN0JDEiLCJzdWJfZm10dHlfcmVzdCQyIiwic3ViX2ZtdHR5X3Jlc3QkMyIsInN1Yl9mbXR0eV9yZXN0JDQiLCJzdWJfZm10dHlfcmVzdCQ1Iiwic3ViX2ZtdHR5X3Jlc3QkNiIsInN1Yl9mbXR0eV9yZXN0JDciLCJzdWJfZm10dHlfcmVzdCQ4Iiwic3ViX2ZtdHR5X3Jlc3QkOSIsInN1Yl9mbXR0eV9yZXN0JDEwIiwic3ViX2ZtdHR5X3Jlc3QkMTEiLCJzdWJfZm10dHlfcmVzdCQxMiIsInN1Yl9mbXR0eV9yZXN0JDEzIiwic3ViX2ZtdHR5X3Jlc3QkMTQiLCJzdWIyX2ZtdHR5Iiwic3ViX2ZtdHR5X3Jlc3QkMTUiLCJzdWIyX2ZtdHR5JDAiLCJzdWJfZm10dHlfcmVzdCQxNiIsInN1YjJfZm10dHkkMSIsInN1YjFfZm10dHkiLCJzdWJfZm10dHlfcmVzdCQxNyIsInN1YjJfZm10dHkkMiIsInN1YjFfZm10dHkkMCIsInN1Yl9mbXR0eV9yZXN0JDE4Iiwic3ViX2ZtdHR5X3Jlc3QkMTkiLCJzdWJfZm10dHlfcmVzdCQyMCIsInN1Yl9mbXR0eV9yZXN0JDIxIiwic3ViX2ZtdHR5X3Jlc3QkMjIiLCJzdWJfZm10dHlfcmVzdCQyMyIsInN1Yl9mbXR0eV9yZXN0JDI0Iiwic3ViX2ZtdHR5X3Jlc3QkMjUiLCJzdWJfZm10dHlfcmVzdCQyNiIsInJlY2FzdCIsImZpeF9wYWRkaW5nIiwid2lkdGgkMCIsImZpeF9pbnRfcHJlY2lzaW9uIiwicmVzJDEiLCJzdHJpbmdfdG9fY2FtbF9zdHJpbmciLCJmb3JtYXRfb2ZfZmNvbnYiLCJzeW1iIiwidHJhbnNmb3JtX2ludF9hbHQiLCJkaWdpdHMiLCJwdXQiLCJjb252ZXJ0X2ludCIsImNvbnZlcnRfaW50MzIiLCJjb252ZXJ0X25hdGl2ZWludCIsImNvbnZlcnRfaW50NjQiLCJjb252ZXJ0X2Zsb2F0IiwiaGV4Iiwic2lnbiIsImNhbWxfc3BlY2lhbF92YWwiLCJzdHJpbmdfb2ZfZm10dHkiLCJtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiIsIm1ha2VfcHJpbnRmIiwicCQwIiwicCQxIiwibWFrZV9wYWRkaW5nIiwibmV3X2FjYyIsIm1ha2VfcHJpbnRmJDAiLCJhY2MkMyIsImFjYyQ0IiwiayQzIiwia2FjYyIsImskNCIsIm1ha2VfaWdub3JlZF9wYXJhbSQwIiwibWFrZV9jdXN0b20kMCIsIm1ha2VfaW52YWxpZF9hcmciLCJtYWtlX2Zyb21fZm10dHkkMCIsIm1ha2VfZnJvbV9mbXR0eSIsIm1ha2VfY3VzdG9tIiwibWFrZV9pZ25vcmVkX3BhcmFtIiwiZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24iLCJtYWtlX2lwcmludGYiLCJtYWtlX2lwcmludGYkMCIsImtvYyIsInJlc3QkMjQiLCJyZXN0JDI1IiwicmVzdCQyNiIsInJlc3QkMjciLCJyZXN0JDI4IiwicmVzdCQyOSIsImZuX29mX2N1c3RvbV9hcml0eSQwIiwiZm5fb2ZfY3VzdG9tX2FyaXR5Iiwib3V0cHV0X2FjYyIsInAkMyIsInAkNCIsInAkNSIsInAkMiIsImJ1ZnB1dF9hY2MiLCJzdHJwdXRfYWNjIiwiZmFpbHdpdGhfbWVzc2FnZSIsIm9wZW5fYm94X29mX3N0cmluZyIsImludmFsaWRfYm94IiwicGFyc2Vfc3BhY2VzIiwid3N0YXJ0Iiwid2VuZCIsImJveF9uYW1lIiwibnN0YXJ0IiwibmVuZCIsImluZGVudCIsImV4cF9lbmQiLCJib3hfdHlwZSIsIm1ha2VfcGFkZGluZ19mbXRfZWJiIiwibWFrZV9wYWRwcmVjX2ZtdF9lYmIiLCJmbXRfZWJiX29mX3N0cmluZyIsImxlZ2FjeV9iZWhhdmlvciIsImZsYWciLCJsZWdhY3lfYmVoYXZpb3IkMCIsImludmFsaWRfZm9ybWF0X21lc3NhZ2UiLCJ1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQiLCJlbmRfaW5kIiwiaW52YWxpZF9mb3JtYXRfd2l0aG91dCIsImV4cGVjdGVkX2NoYXJhY3RlciIsImV4cGVjdGVkIiwiYWRkX2xpdGVyYWwiLCJsaXRfc3RhcnQiLCJwYXJzZSIsInN0cl9pbmQkMiIsInBhcnNlX2ZsYWdzIiwic3RyX2luZCQxIiwic3RyX2luZCQwIiwicGFyc2VfdGFnIiwic3RyX2luZCQzIiwic3RyX2luZF8xIiwicGFyc2VfaW50ZWdlciIsInN0cl9pbmRfMiIsInN0cl9pbmRfMyIsImZvcm1hdHRpbmdfbGl0JDAiLCJuZXh0X2luZCIsInN0cl9pbmRfNCIsInN0cl9pbmRfNSIsInN0cl9pbmQkNCIsInN0cl9pbmRfMSQwIiwic3RyX2luZF8yJDAiLCJzdHJfaW5kXzMkMCIsInMkMSIsImZvcm1hdHRpbmdfbGl0JDEiLCJuZXh0X2luZCQwIiwicGFyc2VfY29udmVyc2lvbiIsInBjdF9pbmQiLCJwbHVzIiwic3BhY2UiLCJwYWRwcmVjIiwicGx1c191c2VkIiwiaGFzaF91c2VkIiwic3BhY2VfdXNlZCIsImlnbl91c2VkIiwicGFkX3VzZWQiLCJwcmVjX3VzZWQiLCJnZXRfcGx1cyIsImdldF9oYXNoIiwiZ2V0X3NwYWNlIiwiZ2V0X2lnbiIsImdldF9wYWQiLCJnZXRfcHJlYyIsImdldF9wYWRwcmVjIiwiZ2V0X2ludF9wYWQiLCJpbmNvbXBhdGlibGVfZmxhZyIsImNoZWNrX25vXzAiLCJvcHRfb2ZfcGFkIiwid2lkdGgkMSIsImdldF9wYWRfb3B0IiwiZ2V0X3BhZHByZWNfb3B0IiwiZm10X3Jlc3VsdCIsInN1Yl9lbmQiLCJzZWFyY2hfc3ViZm9ybWF0X2VuZCIsInN1Yl9mbXQiLCJpZ25vcmVkJDIiLCJjb3VudGVyJDAiLCJpZ25vcmVkJDYiLCJpZ25vcmVkJDciLCJhZGRfcmFuZ2UiLCJmYWlsX3NpbmdsZV9wZXJjZW50IiwicGFyc2VfY2hhcl9zZXRfY29udGVudCIsInBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIkMCIsInBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIiLCJyZXZlcnNlIiwiY2hhcl9zZXQkMSIsImlnbm9yZWQkOSIsImNoYXJfZm9ybWF0IiwiZm10X3Jlc3QkMjEiLCJmbXRfcmVzdCQyMiIsImZtdF9yZXN0JDIzIiwiaWdub3JlZCQxMCIsImZtdF9yZXN0JDI0IiwiZm10X3Jlc3QkMjUiLCJzdWJfZW5kJDAiLCJzdWJfZm10JDAiLCJmbXRfcmVzdCQyNiIsImlnbm9yZWQkMTEiLCJpZ25vcmVkJDMiLCJzeW1iJDAiLCJpZ25vcmVkJDUiLCJjb21wdXRlX2ludF9jb252IiwiaWdub3JlZCQ4Iiwic3BhY2UkMSIsImhhc2gkMSIsInBsdXMkMiIsImtpbmQiLCJpZ25vcmVkJDQiLCJpZ25vcmVkIiwiaWdub3JlZCQwIiwiaWdub3JlZCQxIiwicGx1cyQwIiwiaGFzaCQwIiwic3BhY2UkMCIsInBsdXMkMSIsImlnbiQwIiwicGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIiwibWludXMiLCJwYXJzZV9jb252IiwicGFyc2VfYWZ0ZXJfcGFkZGluZyIsInBhcnNlX2xpdGVyYWwiLCJwYXJzZV9wb3NpdGl2ZSIsIm5ld19pbmQiLCJtaW51cyQwIiwic2V0X2ZsYWciLCJzdHJfaW5kJDUiLCJ6ZXJvJDAiLCJpc19vcGVuX3RhZyIsImluZCIsInN1Yl9zdHIiLCJzdWJfZm9ybWF0JDAiLCJmb3JtYXR0aW5nJDAiLCJmb3JtYXR0aW5nIiwic3RyX2luZCQ3Iiwic3ViX2VuZCQxIiwic3ViX2VuZCQyIiwic3RyX2luZCQ2Iiwib3B0aW9uIiwic3ViZm10IiwiZm9ybWF0X29mX3N0cmluZ19mbXR0eSIsImZvcm1hdF9vZl9zdHJpbmdfZm9ybWF0Iiwia2ZwcmludGYiLCJrYnByaW50ZiIsImlrZnByaW50ZiIsImZwcmludGYiLCJicHJpbnRmIiwiaWZwcmludGYiLCJpYnByaW50ZiIsInByaW50ZiIsImVwcmludGYiLCJrc3ByaW50ZiIsInNwcmludGYiLCJhc3NvYzMiLCJ5MiIsInkxIiwibWFrZV9zeW1saXN0IiwiaGVscF9hY3Rpb24iLCJhZGRfaGVscCIsInNwZWNsaXN0IiwiYWRkMSIsImFkZDIiLCJ1c2FnZV9iIiwiZXJybXNnIiwiZG9jIiwic3BlYyIsImtleSIsInVzYWdlX3N0cmluZyIsInVzYWdlIiwiY3VycmVudCIsInBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljXyIsImFsbG93X2V4cGFuZCIsImFyZ3YiLCJhbm9uZnVuIiwiaW5pdHBvcyIsImNvbnZlcnRfZXJyb3IiLCJwcm9nbmFtZSIsImZvbGxvdyQwIiwia2V5d29yZCIsIm5vX2FyZyQwIiwiZm9sbG93Iiwibm9fYXJnIiwiZ2V0X2FyZyQwIiwiZ2V0X2FyZyIsImNvbnN1bWVfYXJnJDAiLCJjb25zdW1lX2FyZyIsInRyZWF0X2FjdGlvbiQwIiwidHJlYXRfYWN0aW9uIiwiZiQwIiwiZiQxIiwiciQxIiwiZiQyIiwiYXJnJDEiLCJyJDIiLCJhcmckMiIsImYkMyIsImFyZyQzIiwieCQxIiwiciQzIiwiYXJnJDQiLCJ4JDIiLCJzcGVjcyIsImYkNCIsImFyZyQ1IiwiZiQ1IiwiZiQ2IiwiZiQ3IiwiYXJnJDYiLCJuZXdhcmciLCJwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pYyIsInBhcnNlX2FyZ3ZfZHluYW1pYyIsImN1cnJlbnQkMCIsInBhcnNlX2FyZ3YiLCJtc2ckMCIsIm1zZyQxIiwicGFyc2VfZHluYW1pYyIsInBhcnNlX2V4cGFuZCIsInNlY29uZF93b3JkIiwibG9vcCIsIm1heF9hcmdfbGVuIiwiY3VyIiwia3dkIiwicmVwbGFjZV9sZWFkaW5nX3RhYiIsInNlZW4iLCJhbGlnbiIsImxpbWl0IiwiY29tcGxldGVkIiwia3NkIiwiY3V0Y29sJDAiLCJzcGFjZXMkMCIsInNwZWMkMCIsImN1dGNvbCIsImt3ZF9sZW4iLCJzcGFjZXMiLCJyZWFkX2F1eCIsImZpbGUiLCJ3b3JkcyIsInN0YXNoIiwid29yZCIsIndvcmQkMCIsInJlYWRfYXJnIiwicmVhZF9hcmcwIiwid3JpdGVfYXV4IiwiYXJncyIsIndyaXRlX2FyZyIsIndyaXRlX2FyZzAiLCJsb2NmbXQiLCJwcmludGVycyIsImZpZWxkIiwib3RoZXJfZmllbGRzIiwidXNlX3ByaW50ZXJzIiwic3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvIiwiY29uc3RydWN0b3IiLCJmaWVsZHNfb3B0IiwiY29uc3RydWN0b3IkMCIsInRvX3N0cmluZ19kZWZhdWx0IiwiY2hhciQwIiwibGluZSIsImNoYXIkMSIsImxpbmUkMCIsImZpbGUkMCIsImNoYXIkMiIsImxpbmUkMSIsImZpbGUkMSIsInByaW50IiwiZmN0IiwiY2F0Y2gkMCIsInJhd19iYWNrdHJhY2VfZW50cmllcyIsImJ0IiwiY29udmVydF9yYXdfYmFja3RyYWNlIiwiZm9ybWF0X2JhY2t0cmFjZV9zbG90IiwiaXNfcmFpc2UiLCJwcmludF9yYXdfYmFja3RyYWNlIiwib3V0Y2hhbiIsInJhd19iYWNrdHJhY2UiLCJiYWNrdHJhY2UiLCJwcmludF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlX3RvX3N0cmluZyIsImJhY2t0cmFjZV9zbG90X2lzX3JhaXNlIiwicGFyYW0iLCJiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmUiLCJiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiIsImJhY2t0cmFjZV9zbG90X2RlZm5hbWUiLCJiYWNrdHJhY2Vfc2xvdHMiLCJiYWNrdHJhY2Vfc2xvdHNfb2ZfcmF3X2VudHJ5IiwiZW50cnkiLCJyYXdfYmFja3RyYWNlX2xlbmd0aCIsImdldF9iYWNrdHJhY2UiLCJyZWdpc3Rlcl9wcmludGVyIiwiZm4iLCJvbGRfcHJpbnRlcnMiLCJuZXdfcHJpbnRlcnMiLCJleG5fc2xvdCIsImV4bl9zbG90X2lkIiwiZXhuX3Nsb3RfbmFtZSIsImVycm9ycyIsImRlZmF1bHRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbiIsInN0YXR1cyIsInVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIiwic2V0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIiwiZW1wdHlfYmFja3RyYWNlIiwiaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbiIsImRlYnVnZ2VyX2luX3VzZSIsImV4biQxIiwicmF3X2JhY2t0cmFjZSQwIiwiY29uc3QkMCIsImZsaXAiLCJuZWdhdGUiLCJwcm90ZWN0IiwiZmluYWxseSQwIiwid29yayIsImZpbmFsbHlfbm9fZXhuIiwid29ya19leG4kMCIsIndvcmtfZXhuIiwid29ya19idCIsImV2ZW50bG9nX3BhdXNlIiwiZXZlbnRsb2dfcmVzdW1lIiwicHJpbnRfc3RhdCIsImFsbG9jYXRlZF9ieXRlcyIsIm1hIiwicHJvIiwibWkiLCJjcmVhdGVfYWxhcm0iLCJkZWxldGVfYWxhcm0iLCJudWxsX3RyYWNrZXIiLCJzYW1wbGluZ19yYXRlIiwidHJhY2tlciIsImNhbGxzdGFja19zaXplIiwic3RyaW5nIiwiYnl0ZXMiLCJzdWJzdHJpbmciLCJzdWJieXRlcyIsImZpbGVuYW1lIiwiZGlnZXN0IiwiY2hhcl9oZXgiLCJ0b19oZXgiLCJmcm9tX2hleCIsImRpZ2l0IiwiZmxvYXQzMiIsImZsb2F0NjQiLCJpbnQ4X3NpZ25lZCIsImludDhfdW5zaWduZWQiLCJpbnQxNl9zaWduZWQiLCJpbnQxNl91bnNpZ25lZCIsImludDMyIiwiaW50NjQiLCJpbnQkMCIsIm5hdGl2ZWludCIsImNvbXBsZXgzMiIsImNvbXBsZXg2NCIsImtpbmRfc2l6ZV9pbl9ieXRlcyIsImNfbGF5b3V0IiwiZm9ydHJhbl9sYXlvdXQiLCJjbG9vcCIsImFyciIsImNvbCIsImZsb29wIiwibGF5b3V0IiwiZGltcyIsImRsZW4iLCJzaXplX2luX2J5dGVzIiwic2l6ZV9pbl9ieXRlcyQwIiwib2ZfdmFsdWUiLCJjcmVhdGUkMCIsImRpbSIsInNpemVfaW5fYnl0ZXMkMSIsInNsaWNlIiwiaW5pdCQwIiwib2ZfYXJyYXkiLCJiYSIsImNyZWF0ZSQxIiwiZGltMSIsImRpbTIiLCJzaXplX2luX2J5dGVzJDIiLCJzbGljZV9sZWZ0Iiwic2xpY2VfcmlnaHQiLCJpbml0JDEiLCJvZl9hcnJheSQwIiwicm93IiwiY3JlYXRlJDIiLCJkaW0zIiwic2l6ZV9pbl9ieXRlcyQzIiwic2xpY2VfbGVmdF8xIiwic2xpY2VfcmlnaHRfMSIsInNsaWNlX2xlZnRfMiIsInNsaWNlX3JpZ2h0XzIiLCJpbml0JDIiLCJvZl9hcnJheSQxIiwiYXJyYXkwX29mX2dlbmFycmF5IiwiYXJyYXkxX29mX2dlbmFycmF5IiwiYXJyYXkyX29mX2dlbmFycmF5IiwiYXJyYXkzX29mX2dlbmFycmF5IiwicmVzaGFwZV8wIiwicmVzaGFwZV8xIiwicmVzaGFwZV8yIiwicmVzaGFwZV8zIiwiaTMiLCJpNCIsImkzJDAiLCJpNCQwIiwibWsiLCJyZWluaXQiLCJzZWVkIiwibWFrZV9zZWxmX2luaXQiLCJiaXRzIiwiaW50YXV4IiwiYm91bmQiLCJmdWxsX2ludCIsImJpdHMzMiIsImJpdHM2NCIsIm5hdGl2ZWJpdHMiLCJmbG9hdCQwIiwiYm9vbCIsIm1rX2RlZmF1bHQiLCJyYW5kb21fa2V5IiwiYml0cyQwIiwiaW50JDEiLCJmdWxsX2ludCQwIiwiaW50MzIkMCIsIm5hdGl2ZWludCQwIiwiaW50NjQkMCIsImZsb2F0JDEiLCJzY2FsZSIsImJvb2wkMCIsImJpdHMzMiQwIiwiYml0czY0JDAiLCJuYXRpdmViaXRzJDAiLCJmdWxsX2luaXQiLCJzZWxmX2luaXQiLCJzcGxpdCQwIiwiZ2V0X3N0YXRlIiwic2V0X3N0YXRlIiwib25nb2luZ190cmF2ZXJzYWwiLCJmbGlwX29uZ29pbmdfdHJhdmVyc2FsIiwicGFyYW1zIiwicmFuZG9taXplZF9kZWZhdWx0IiwicmFuZG9taXplZCIsInJhbmRvbWl6ZSIsImlzX3JhbmRvbWl6ZWQiLCJwcm5nX2tleSIsInBvd2VyXzJfYWJvdmUiLCJpbml0aWFsX3NpemUiLCJyYW5kb20iLCJjb3B5X2J1Y2tldGxpc3QiLCJrZXkkMCIsIm5leHQkMCIsImluc2VydF9hbGxfYnVja2V0cyIsImluZGV4ZnVuIiwiaW5wbGFjZSIsIm9kYXRhIiwibmRhdGEiLCJuc2l6ZSIsIm5kYXRhX3RhaWwiLCJuaWR4IiwibWF0Y2gkMCIsIm9zaXplIiwib2xkX3RyYXYiLCJmaWx0ZXJfbWFwX2lucGxhY2UiLCJidWNrZXRfbGVuZ3RoIiwic3RhdHMiLCJtYmwiLCJoaXN0byIsInRibF9kYXRhIiwiYnVjayIsImJ1Y2skMCIsImJ1Y2skMSIsInRvX3NlcV9rZXlzIiwidG9fc2VxX3ZhbHVlcyIsImtleV9pbmRleCIsImJ1Y2tldCIsImsxIiwibmV4dDEiLCJrMiIsIm5leHQyIiwiazMiLCJkMyIsIm5leHQzIiwiZmluZF9pbl9idWNrZXQiLCJyZXBsYWNlIiwicmVwbGFjZV9zZXEiLCJzZWVkZWRfaGFzaCIsImhhc2hfcGFyYW0iLCJyZWJ1aWxkIiwiZ2V0X2NvcHkiLCJhciIsImVtcHR5YnVja2V0IiwiZ2V0X2luZGV4Iiwic3okMCIsInN6JDEiLCJjb3VudF9idWNrZXQiLCJjb3VudCIsImFkZF9hdXgiLCJzZXR0ZXIiLCJidWNrZXQkMCIsImhhc2hlcyIsIm5ld3N6IiwibmV3YnVja2V0JDAiLCJuZXdoYXNoZXMiLCJoYnVja2V0IiwicHJldl9sZW4iLCJsaXZlIiwiaiQyIiwibmV3YnVja2V0Iiwib2xkbGVuIiwibmV3dCIsIm9iIiwib2kiLCJvaCIsInNldHRlciQwIiwibmkiLCJmaW5kX29yIiwiaWZub3Rmb3VuZCIsImZpbmRfc2hhZG93IiwiaWZmb3VuZCIsImxlbnMiLCJ0b3RsZW4iLCJ1bmtub3duIiwicHBfZW5xdWV1ZSIsInRva2VuIiwicHBfaW5maW5pdHkiLCJwcF9vdXRwdXRfc3RyaW5nIiwicHBfb3V0cHV0X25ld2xpbmUiLCJmb3JtYXRfcHBfdGV4dCIsInRleHQiLCJmb3JtYXRfc3RyaW5nIiwiYnJlYWtfbmV3X2xpbmUiLCJyZWFsX2luZGVudCIsImJyZWFrX2xpbmUiLCJicmVha19zYW1lX2xpbmUiLCJmb3JtYXRfcHBfdG9rZW4iLCJzaXplJDAiLCJ0YWJzIiwiYWRkX3RhYiIsImxzIiwidGFnX25hbWUiLCJtYXJrZXIiLCJicmVha3MiLCJmaXRzIiwib2ZmIiwiYm94X3R5cGUkMCIsIm9mZiQwIiwiaW5zZXJ0aW9uX3BvaW50IiwidGFicyQwIiwiZmlyc3QiLCJoZWFkIiwidGFiIiwib2ZmJDEiLCJpbnNlcnRpb25fcG9pbnQkMCIsIndpZHRoJDIiLCJib3hfdHlwZSQxIiwidGJveCIsInRhZ19uYW1lJDAiLCJtYXJrZXIkMCIsImFkdmFuY2VfbGVmdCIsInBlbmRpbmdfY291bnQiLCJlbnF1ZXVlX2FkdmFuY2UiLCJlbnF1ZXVlX3N0cmluZ19hcyIsImluaXRpYWxpemVfc2Nhbl9zdGFjayIsInN0YWNrIiwicXVldWVfZWxlbSIsInNldF9zaXplIiwibGVmdF90b3RhbCIsInNjYW5fcHVzaCIsImVsZW0iLCJwcF9vcGVuX2JveF9nZW4iLCJicl90eSIsInBwX2Nsb3NlX2JveCIsInBwX29wZW5fc3RhZyIsInBwX2Nsb3NlX3N0YWciLCJwcF9zZXRfcHJpbnRfdGFncyIsInBwX3NldF9tYXJrX3RhZ3MiLCJwcF9nZXRfcHJpbnRfdGFncyIsInBwX2dldF9tYXJrX3RhZ3MiLCJwcF9zZXRfdGFncyIsInBwX2dldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbiIsInBwX3NldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbiIsInBjdCIsInBvdCIsIm1jdCIsIm1vdCIsInBwX3Jpbml0IiwicHBfZmx1c2hfcXVldWUiLCJwcF9wcmludF9hc19zaXplIiwicHBfcHJpbnRfYXMiLCJpc2l6ZSIsInBwX3ByaW50X3N0cmluZyIsInBwX3ByaW50X2J5dGVzIiwicHBfcHJpbnRfaW50IiwicHBfcHJpbnRfZmxvYXQiLCJwcF9wcmludF9ib29sIiwicHBfcHJpbnRfY2hhciIsInBwX29wZW5faGJveCIsInBwX29wZW5fdmJveCIsInBwX29wZW5faHZib3giLCJwcF9vcGVuX2hvdmJveCIsInBwX29wZW5fYm94IiwicHBfcHJpbnRfbmV3bGluZSIsInBwX3ByaW50X2ZsdXNoIiwicHBfZm9yY2VfbmV3bGluZSIsInBwX3ByaW50X2lmX25ld2xpbmUiLCJwcF9wcmludF9jdXN0b21fYnJlYWsiLCJwcF9wcmludF9icmVhayIsInBwX3ByaW50X3NwYWNlIiwicHBfcHJpbnRfY3V0IiwicHBfb3Blbl90Ym94IiwicHBfY2xvc2VfdGJveCIsInBwX3ByaW50X3RicmVhayIsInBwX3ByaW50X3RhYiIsInBwX3NldF90YWIiLCJwcF9zZXRfbWF4X2JveGVzIiwicHBfZ2V0X21heF9ib3hlcyIsInBwX292ZXJfbWF4X2JveGVzIiwicHBfc2V0X2VsbGlwc2lzX3RleHQiLCJwcF9nZXRfZWxsaXBzaXNfdGV4dCIsInBwX2xpbWl0IiwicHBfc2V0X21heF9pbmRlbnQiLCJwcF9nZXRfbWF4X2luZGVudCIsInBwX3NldF9tYXJnaW4iLCJuZXdfbWF4X2luZGVudCIsInZhbGlkYXRlX2dlb21ldHJ5IiwibWFyZ2luIiwibWF4X2luZGVudCIsImNoZWNrX2dlb21ldHJ5IiwiZ2VvbWV0cnkiLCJwcF9nZXRfbWFyZ2luIiwicHBfc2V0X2Z1bGxfZ2VvbWV0cnkiLCJwcF9zZXRfZ2VvbWV0cnkiLCJwcF9zYWZlX3NldF9nZW9tZXRyeSIsInBwX2dldF9nZW9tZXRyeSIsInBwX3VwZGF0ZV9nZW9tZXRyeSIsInBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyIsInBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyIsInBwX3NldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aSIsInBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aSIsImRpc3BsYXlfbmV3bGluZSIsImJsYW5rX2xpbmUiLCJkaXNwbGF5X2JsYW5rcyIsInBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWwiLCJkZWZhdWx0X3BwX21hcmtfb3Blbl90YWciLCJkZWZhdWx0X3BwX21hcmtfY2xvc2VfdGFnIiwiZGVmYXVsdF9wcF9wcmludF9vcGVuX3RhZyIsImRlZmF1bHRfcHBfcHJpbnRfY2xvc2VfdGFnIiwicHBfbWFrZV9mb3JtYXR0ZXIiLCJwcF9xdWV1ZSIsInN5c190b2siLCJzY2FuX3N0YWNrIiwiZm9ybWF0dGVyX29mX291dF9mdW5jdGlvbnMiLCJvdXRfZnVucyIsIm1ha2VfZm9ybWF0dGVyIiwiZmx1c2giLCJwcGYiLCJmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwiLCJmb3JtYXR0ZXJfb2ZfYnVmZmVyIiwicHBfYnVmZmVyX3NpemUiLCJwcF9tYWtlX2J1ZmZlciIsInN0ZGJ1ZiIsInN0ZF9mb3JtYXR0ZXIiLCJlcnJfZm9ybWF0dGVyIiwic3RyX2Zvcm1hdHRlciIsInN0ZGJ1Zl9rZXkiLCJzdHJfZm9ybWF0dGVyX2tleSIsImJ1ZmZlcmVkX291dF9zdHJpbmciLCJidWZmZXJlZF9vdXRfZmx1c2giLCJzdGRfYnVmX2tleSIsImVycl9idWZfa2V5Iiwic3RkX2Zvcm1hdHRlcl9rZXkiLCJlcnJfZm9ybWF0dGVyX2tleSIsImdldF9zdGRfZm9ybWF0dGVyIiwiZ2V0X2Vycl9mb3JtYXR0ZXIiLCJnZXRfc3RyX2Zvcm1hdHRlciIsImdldF9zdGRidWYiLCJmbHVzaF9idWZmZXJfZm9ybWF0dGVyIiwiZmx1c2hfc3RyX2Zvcm1hdHRlciIsIm1ha2Vfc3luY2hyb25pemVkX2Zvcm1hdHRlciIsIm91dHB1dCQwIiwiZmx1c2gkMCIsInN5bmNocm9uaXplZF9mb3JtYXR0ZXJfb2Zfb3V0XyIsIm1ha2Vfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsImNsZWFyX3N5bWJvbGljX291dHB1dF9idWZmZXIiLCJzb2IiLCJnZXRfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsImZsdXNoX3N5bWJvbGljX291dHB1dF9idWZmZXIiLCJpdGVtcyIsImFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSIsIml0ZW0iLCJmb3JtYXR0ZXJfb2Zfc3ltYm9saWNfb3V0cHV0X2IiLCJvcGVuX2hib3giLCJvcGVuX3Zib3giLCJvcGVuX2h2Ym94Iiwib3Blbl9ob3Zib3giLCJvcGVuX2JveCIsImNsb3NlX2JveCIsIm9wZW5fc3RhZyIsImNsb3NlX3N0YWciLCJwcmludF9hcyIsInByaW50X2Jvb2wiLCJwcmludF9icmVhayIsInByaW50X2N1dCIsInByaW50X3NwYWNlIiwiZm9yY2VfbmV3bGluZSIsInByaW50X2ZsdXNoIiwicHJpbnRfaWZfbmV3bGluZSIsIm9wZW5fdGJveCIsImNsb3NlX3Rib3giLCJwcmludF90YnJlYWsiLCJzZXRfdGFiIiwicHJpbnRfdGFiIiwic2V0X21hcmdpbiIsImdldF9tYXJnaW4iLCJzZXRfbWF4X2luZGVudCIsImdldF9tYXhfaW5kZW50Iiwic2V0X2dlb21ldHJ5Iiwic2FmZV9zZXRfZ2VvbWV0cnkiLCJnZXRfZ2VvbWV0cnkiLCJ1cGRhdGVfZ2VvbWV0cnkiLCJzZXRfbWF4X2JveGVzIiwiZ2V0X21heF9ib3hlcyIsIm92ZXJfbWF4X2JveGVzIiwic2V0X2VsbGlwc2lzX3RleHQiLCJnZXRfZWxsaXBzaXNfdGV4dCIsInNldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWwiLCJzZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMiLCJnZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMiLCJzZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMiLCJnZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMiLCJzZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyIsInNldF9wcmludF90YWdzIiwiZ2V0X3ByaW50X3RhZ3MiLCJzZXRfbWFya190YWdzIiwiZ2V0X21hcmtfdGFncyIsInNldF90YWdzIiwicHBfcHJpbnRfbGlzdCIsInBwX3YiLCJvcHQkMCIsInBwX3NlcCIsIm9wdCQxIiwicHBfcHJpbnRfc2VxIiwic2VxJDEiLCJzZXEkMiIsInBwX3ByaW50X3RleHQiLCJwcF9wcmludF9vcHRpb24iLCJwcF9wcmludF9yZXN1bHQiLCJwcF9wcmludF9laXRoZXIiLCJjb21wdXRlX3RhZyIsInRhZ19hY2MiLCJvdXRwdXRfZm9ybWF0dGluZ19saXQiLCJidHkiLCJwJDYiLCJwJDciLCJzaXplJDEiLCJwJDgiLCJrZHByaW50ZiIsImRwcmludGYiLCJrYXNwcmludGYiLCJhc3ByaW50ZiIsImZsdXNoX3N0YW5kYXJkX2Zvcm1hdHRlcnMiLCJmcyIsImZzJDAiLCJudWxsX2NoYXIiLCJuZXh0X2NoYXIiLCJpYiIsInBlZWtfY2hhciIsImNoZWNrZWRfcGVla19jaGFyIiwiZW5kX29mX2lucHV0IiwiYmVnaW5uaW5nX29mX2lucHV0IiwibmFtZV9vZl9pbnB1dCIsImNoYXJfY291bnQiLCJpbnZhbGlkYXRlX2N1cnJlbnRfY2hhciIsInRva2VuX3N0cmluZyIsInRva2VuX2J1ZmZlciIsInNraXBfY2hhciIsImlnbm9yZV9jaGFyIiwic3RvcmVfY2hhciIsImRlZmF1bHRfdG9rZW5fYnVmZmVyX3NpemUiLCJpbmFtZSIsInNjYW5fY2xvc2VfYXRfZW5kIiwic2Nhbl9yYWlzZV9hdF9lbmQiLCJmcm9tX2ljIiwic2Nhbl9jbG9zZV9pYyIsImVvZiIsIm9wZW5faW5fZmlsZSIsImNsb3NlX2luIiwiaWMkMCIsImJhZF9pbnB1dCIsImJhZF9pbnB1dF9lc2NhcGUiLCJiYWRfdG9rZW5fbGVuZ3RoIiwibWVzc2FnZSIsImJhZF9mbG9hdCIsImJhZF9oZXhfZmxvYXQiLCJjaGFyYWN0ZXJfbWlzbWF0Y2giLCJjaSIsImNoZWNrX3RoaXNfY2hhciIsImNoZWNrX2NoYXIiLCJ0b2tlbl9jaGFyIiwidG9rZW5fYm9vbCIsImludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIiwidG9rZW5faW50X2xpdGVyYWwiLCJjb252IiwidG9rZW5fZmxvYXQiLCJzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciIsInNjYW5fZGVjaW1hbF9kaWdpdF9wbHVzIiwic2Nhbl9kaWdpdF9wbHVzIiwiYmFzaXMiLCJkaWdpdHAiLCJ3aWR0aCQzIiwiaXNfYmluYXJ5X2RpZ2l0Iiwic2Nhbl9iaW5hcnlfaW50IiwiaXNfb2N0YWxfZGlnaXQiLCJzY2FuX29jdGFsX2ludCIsImlzX2hleGFfZGlnaXQiLCJzY2FuX2hleGFkZWNpbWFsX2ludCIsInNjYW5fc2lnbiIsInNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbCIsInNjYW5faW50X2NvbnZlcnNpb24iLCJzY2FuX2ZyYWN0aW9uYWxfcGFydCIsInNjYW5fZXhwb25lbnRfcGFydCIsInNjYW5fZmxvYXQiLCJwcmVjaXNpb24iLCJwcmVjaXNpb24kMCIsImNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIiwibG93ZXJjYXNlIiwic2Nhbl9oZXhfZmxvYXQiLCJ3aWR0aCQ0Iiwid2lkdGgkNSIsIndpZHRoJDYiLCJ3aWR0aCQxMCIsIndpZHRoJDciLCJ3aWR0aCQ4Iiwid2lkdGgkOSIsInNjYW5fY2FtbF9mbG9hdF9yZXN0Iiwid2lkdGhfcHJlY2lzaW9uIiwiZnJhY193aWR0aCIsInNjYW5fY2FtbF9mbG9hdCIsInNjYW5fc3RyaW5nIiwic3RwIiwiaGV4YWRlY2ltYWxfdmFsdWVfb2ZfY2hhciIsImNoZWNrX25leHRfY2hhciIsImNoZWNrX25leHRfY2hhcl9mb3JfY2hhciIsImNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIiwic2Nhbl9iYWNrc2xhc2hfY2hhciIsImMwIiwiZ2V0X2RpZ2l0IiwiZ2V0X2RpZ2l0JDAiLCJjMSQwIiwiYzIkMCIsInNjYW5fY2FtbF9zdHJpbmciLCJmaW5kX3N0b3AkMCIsInNraXBfc3BhY2VzIiwiZmluZF9zdG9wIiwic2Nhbl9jaGFyc19pbl9jaGFyX3NldCIsInNjYW5faW5kaWMiLCJzY2FuX2NoYXJzIiwic2NhbmZfYmFkX2lucHV0Iiwid2lkdGhfb2ZfcGFkX29wdCIsInN0b3BwZXJfb2ZfZm9ybWF0dGluZ19saXQiLCJmbXRpbmciLCJ0YWtlX2Zvcm1hdF9yZWFkZXJzJDAiLCJ0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzJDAiLCJyZWFkZXIiLCJuZXdfayIsInJlYWRlcnNfcmVzdCIsInRha2VfZm9ybWF0X3JlYWRlcnMiLCJ0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIiwicGFkX3ByZWNfc2NhbmYiLCJyZWFkZXJzIiwibWFrZV9zY2FuZiIsInNjYW4kMCIsInN0cl9yZXN0Iiwic2NhbiQxIiwic2NhbiQyIiwic2NhbiQzIiwic2NhbiQ0IiwiY29udiQwIiwic2NhbiQ1IiwiY29udiQxIiwic2NhbiQ2IiwiY29udiQyIiwic2NhbiQ3Iiwic2NhbiQ4IiwiZm10aW5nX2xpdCQwIiwic3RwJDAiLCJzJDIiLCJzdHJfcmVzdCQwIiwiYXJnX3Jlc3QiLCJrc2NhbmZfZ2VuIiwiZWYiLCJhcmdzJDEiLCJleGMkMCIsImV4YyIsImFyZ3MkMCIsImtzY2FuZiIsImtzY2FuZl9vcHQiLCJic2NhbmYiLCJic2NhbmZfb3B0Iiwia3NzY2FuZiIsInNzY2FuZiIsInNzY2FuZl9vcHQiLCJzY2FuZiIsInNjYW5mX29wdCIsImJzY2FuZl9mb3JtYXQiLCJmb3JtYXQiLCJzc2NhbmZfZm9ybWF0IiwiZm9ybWF0X2Zyb21fc3RyaW5nIiwidW5lc2NhcGVkIiwicmVnaXN0ZXIiLCJyZWdpc3Rlcl9leGNlcHRpb24iLCJvJDAiLCJpbml0aWFsX29iamVjdF9zaXplIiwiZHVtbXlfaXRlbSIsInB1YmxpY19tZXRob2RfbGFiZWwiLCJ0YWciLCJjb21wYXJlJDAiLCJjb21wYXJlJDEiLCJkdW1teV90YWJsZSIsInRhYmxlX2NvdW50IiwiZHVtbXlfbWV0IiwiZml0X3NpemUiLCJuZXdfdGFibGUiLCJwdWJfbGFiZWxzIiwibWV0aG9kcyIsImFycmF5IiwibmV3X3NpemUiLCJvbGRfc2l6ZSIsIm5ld19idWNrIiwibWV0aG9kX2NvdW50IiwiaW5zdF92YXJfY291bnQiLCJuZXdfbWV0aG9kIiwidGFibGUiLCJnZXRfbWV0aG9kX2xhYmVsIiwibGFiZWwiLCJnZXRfbWV0aG9kX2xhYmVscyIsIm5hbWVzIiwic2V0X21ldGhvZCIsImVsZW1lbnQiLCJnZXRfbWV0aG9kIiwibmFycm93IiwidmFycyIsInZpcnRfbWV0aHMiLCJjb25jcl9tZXRocyIsInZhcnMkMCIsInZpcnRfbWV0aHMkMCIsImNvbmNyX21ldGhzJDAiLCJ2aXJ0X21ldGhfbGFicyIsImNvbmNyX21ldGhfbGFicyIsImxhYiIsInR2YXJzIiwiYnlfbmFtZSIsImJ5X2xhYmVsIiwibWV0IiwiaG0iLCJ3aWRlbiIsInNhdmVkX3ZhcnMiLCJzYXZlZF9oaWRkZW5fbWV0aHMiLCJuZXdfdmFyaWFibGUiLCJ0b19hcnJheSIsIm5ld19tZXRob2RzX3ZhcmlhYmxlcyIsIm1ldGhzIiwidmFscyIsIm1ldGhzJDAiLCJubWV0aHMiLCJudmFscyIsImdldF92YXJpYWJsZSIsImdldF92YXJpYWJsZXMiLCJhZGRfaW5pdGlhbGl6ZXIiLCJjcmVhdGVfdGFibGUiLCJwdWJsaWNfbWV0aG9kcyIsInRhZ3MiLCJpbml0X2NsYXNzIiwiaW5oZXJpdHMiLCJjbGEiLCJzdXBlciQwIiwibm0iLCJtYWtlX2NsYXNzIiwicHViX21ldGhzIiwiY2xhc3NfaW5pdCIsImVudl9pbml0IiwibWFrZV9jbGFzc19zdG9yZSIsImluaXRfdGFibGUiLCJkdW1teV9jbGFzcyIsImxvYyIsInVuZGVmIiwiY3JlYXRlX29iamVjdCIsImNyZWF0ZV9vYmplY3Rfb3B0Iiwib2JqXzAiLCJpdGVyX2YiLCJydW5faW5pdGlhbGl6ZXJzIiwiaW5pdHMiLCJydW5faW5pdGlhbGl6ZXJzX29wdCIsImNyZWF0ZV9vYmplY3RfYW5kX3J1bl9pbml0aWFsaSIsImdldF9kYXRhIiwiYnVpbGRfcGF0aCIsImtleXMiLCJsb29rdXBfdGFibGVzIiwicm9vdCIsInJvb3RfZGF0YSIsInRhYmxlcyQwIiwidGFibGVzJDEiLCJ0YWJsZXNfZGF0YSIsIm5ld19jYWNoZSIsInNldF9tZXRob2RzIiwiY2xvIiwiY2xvJDAiLCJuJDIiLCJuJDMiLCJuJDQiLCJuJDUiLCJuJDYiLCJ4JDMiLCJuJDciLCJ4JDQiLCJuJDgiLCJuJDkiLCJ4JDUiLCJmJDgiLCJlJDIiLCJuJDEwIiwieCQ2IiwiZiQ5IiwibiQxMSIsIngkNyIsIm4kMTIiLCJ4JDgiLCJuJDEzIiwibiQxNCIsImUkMyIsIm4kMTUiLCJtJDEiLCJtJDIiLCJ4JDkiLCJtJDMiLCJuJDE2IiwibSQ0IiwiZSQ0IiwibiQxNyIsIm0kNSIsIm4kMTgiLCJpbml0X21vZF9ibG9jayIsImNvbXBzJDAiLCJtb2R1Iiwic2hhcGUiLCJmbiQwIiwiY29tcHMiLCJpbml0X21vZCIsInVwZGF0ZV9tb2RfYmxvY2siLCJjbCIsInVwZGF0ZV9tb2QiLCJwcm5nIiwiaGtleSIsImNsZWFuIiwiZG9fYnVja2V0IiwiaW5zZXJ0X2J1Y2tldCIsImNvbnRhaW5lciIsInJlbW92ZV9idWNrZXQiLCJoayIsImJ1Y2tldF9sZW5ndGhfYWxpdmUiLCJzdGF0c19hbGl2ZSIsInNldF9kYXRhIiwiZXBoIiwicXVlcnkiLCJzZXRfa2V5X2RhdGEiLCJ0ZXN0X2tleSIsInQkMCIsImdldF9rZXkxIiwic2V0X2tleTEiLCJnZXRfa2V5MiIsInNldF9rZXkyIiwiZ2V0X2RhdGEkMCIsInNldF9kYXRhJDAiLCJtYWtlJDEiLCJrZXkxIiwia2V5MiIsInF1ZXJ5JDAiLCJrMiQwIiwiazEkMCIsImVxdWFsJDAiLCJzZWVkZWRfaGFzaCQwIiwibWFrZSQyIiwiYWRkJDAiLCJ0ZXN0X2tleXMiLCJyZW1vdmUkMCIsImZpbmQkMCIsImxlbmd0aCQwIiwiY2xlYXIkMCIsImxlbmd0aCQxIiwiZ2V0X2tleSQwIiwic2V0X2tleSQwIiwiZ2V0X2RhdGEkMSIsInNldF9kYXRhJDEiLCJtYWtlJDMiLCJxdWVyeSQxIiwibWFrZSQ0IiwiYWRkJDEiLCJ0ZXN0X2tleXMkMCIsInJlbW92ZSQxIiwiZmluZCQxIiwibGVuZ3RoJDIiLCJjbGVhciQxIiwibnVsbCQwIiwiY3VycmVudF9kaXJfbmFtZSIsInBhcmVudF9kaXJfbmFtZSIsImRpcl9zZXAiLCJxdW90ZXF1b3RlIiwibnVsbCQxIiwiY3VycmVudF9kaXJfbmFtZSQwIiwicGFyZW50X2Rpcl9uYW1lJDAiLCJkaXJfc2VwJDAiLCJudWxsJDIiLCJjdXJyZW50X2Rpcl9uYW1lJDEiLCJwYXJlbnRfZGlyX25hbWUkMSIsImRpcl9zZXAkMSIsImdlbmVyaWNfYmFzZW5hbWUiLCJpc19kaXJfc2VwIiwiZ2VuZXJpY19kaXJuYW1lIiwiaXNfcmVsYXRpdmUiLCJpc19pbXBsaWNpdCIsImNoZWNrX3N1ZmZpeCIsInN1ZmYiLCJjaG9wX3N1ZmZpeF9vcHQiLCJsZW5fZiIsInRlbXBfZGlyX25hbWUiLCJxdW90ZSIsInF1b3RlX2NvbW1hbmQiLCJiYXNlbmFtZSIsImRpcm5hbWUiLCJpc19kaXJfc2VwJDAiLCJpc19yZWxhdGl2ZSQwIiwiaXNfaW1wbGljaXQkMCIsImNoZWNrX3N1ZmZpeCQwIiwiY2hvcF9zdWZmaXhfb3B0JDAiLCJ0ZW1wX2Rpcl9uYW1lJDAiLCJxdW90ZSQwIiwiYWRkX2JzIiwibG9vcCQwIiwibG9vcF9icyIsInF1b3RlX2NtZF9maWxlbmFtZSIsInF1b3RlX2NvbW1hbmQkMCIsImRyaXZlX2FuZF9wYXRoIiwiZGlybmFtZSQwIiwicGF0aCIsImRyaXZlIiwiZGlyIiwiYmFzZW5hbWUkMCIsImJhc2VuYW1lJDEiLCJkaXJuYW1lJDEiLCJudWxsJDMiLCJjdXJyZW50X2Rpcl9uYW1lJDIiLCJwYXJlbnRfZGlyX25hbWUkMiIsImRpcl9zZXAkMiIsImlzX2Rpcl9zZXAkMSIsImlzX3JlbGF0aXZlJDEiLCJpc19pbXBsaWNpdCQxIiwiY2hlY2tfc3VmZml4JDEiLCJjaG9wX3N1ZmZpeF9vcHQkMSIsInRlbXBfZGlyX25hbWUkMSIsInF1b3RlJDEiLCJxdW90ZV9jb21tYW5kJDEiLCJiYXNlbmFtZSQyIiwiZGlybmFtZSQyIiwiY2hvcF9zdWZmaXgiLCJleHRlbnNpb25fbGVuIiwiaTAiLCJleHRlbnNpb24iLCJjaG9wX2V4dGVuc2lvbiIsInJlbW92ZV9leHRlbnNpb24iLCJ0ZW1wX2ZpbGVfbmFtZSIsInRlbXBfZGlyIiwicmFuZG9tX3N0YXRlIiwicm5kIiwiY3VycmVudF90ZW1wX2Rpcl9uYW1lIiwic2V0X3RlbXBfZGlyX25hbWUiLCJnZXRfdGVtcF9kaXJfbmFtZSIsInRlbXBfZmlsZSIsIm9wZW5fdGVtcF9maWxlIiwic3RoJDAiLCJwZXJtcyIsInN0aCQxIiwibmVnIiwiY29uaiIsIm11bCIsImRpdiIsImludiIsIm5vcm0yIiwibm9ybSIsInBvbGFyIiwic3FydCIsInEkMCIsInckMCIsImV4cCIsImxvZyIsInBvdyIsIm9wZW5fYmluIiwib3Blbl90ZXh0Iiwib3Blbl9nZW4iLCJ3aXRoX29wZW4iLCJvcGVuZnVuIiwid2l0aF9vcGVuX2JpbiIsIndpdGhfb3Blbl90ZXh0Iiwid2l0aF9vcGVuX2dlbiIsInNlZWsiLCJjbG9zZSIsImNsb3NlX25vZXJyIiwiaW5wdXRfY2hhciIsImlucHV0X2J5dGUiLCJyZWFkX3VwdG8iLCJlbnN1cmUiLCJuZXdfbGVuJDAiLCJuZXdfbGVuJDEiLCJpbnB1dF9hbGwiLCJjaHVua19zaXplIiwiaW5pdGlhbF9zaXplJDAiLCJpbml0aWFsX3NpemUkMSIsIm5yZWFkIiwiYnVmJDIiLCJidWYkMCIsImJ1ZiQxIiwicmVtIiwic2V0X2JpbmFyeV9tb2RlIiwib3V0cHV0X2NoYXIiLCJvdXRwdXRfYnl0ZSIsInByaW50ZXIiLCJjb250aW51ZSQwIiwiZGlzY29udGludWUiLCJkaXNjb250aW51ZV93aXRoX2JhY2t0cmFjZSIsIm1hdGNoX3dpdGgiLCJjb21wIiwiaGFuZGxlciIsImVmZmMiLCJlZmYiLCJsYXN0X2ZpYmVyIiwidHJ5X3dpdGgiLCJmaWJlciIsImNvbnRpbnVlX2dlbiIsInJlc3VtZV9mdW4iLCJjb250aW51ZV93aXRoIiwiZGlzY29udGludWVfd2l0aCIsImRpc2NvbnRpbnVlX3dpdGhfYmFja3RyYWNlJDAiLCJ2ZXJzaW9uIiwiZ2l0X3ZlcnNpb24iLCJyYWlzZSIsIm1heCIsIngiLCJ5IiwibWluIiwiZXF1YWwiLCJlcXVhbCQwIiwibWF4JDAiLCJtaW4kMCIsImdsb2JhbCIsIm51bGwkMCIsInVuZGVmaW5lZCQwIiwicmV0dXJuJDAiLCJtYXAiLCJmIiwiYmluZCIsInRlc3QiLCJpdGVyIiwiY2FzZSQwIiwiZyIsImdldCIsIm9wdGlvbiIsIngkMCIsInRvX29wdGlvbiIsInJldHVybiQxIiwibWFwJDAiLCJiaW5kJDAiLCJ0ZXN0JDAiLCJpdGVyJDAiLCJjYXNlJDEiLCJnZXQkMCIsIm9wdGlvbiQwIiwidG9fb3B0aW9uJDAiLCJjb2VyY2UiLCJjb2VyY2Vfb3B0IiwidHJ1ZSQwIiwiZmFsc2UkMCIsIm5mYyIsIm5mZCIsIm5ma2MiLCJuZmtkIiwic3RyaW5nX2NvbnN0ciIsInJlZ0V4cCIsIm9iamVjdF9jb25zdHJ1Y3RvciIsIm9iamVjdF9rZXlzIiwibyIsImFycmF5X2NvbnN0cnVjdG9yIiwiYXJyYXlfZ2V0IiwiYXJyYXlfc2V0IiwiYXJyYXlfbWFwIiwiYSIsImlkeCIsImFycmF5X21hcGkiLCJzdHJfYXJyYXkiLCJtYXRjaF9yZXN1bHQiLCJkYXRlX2NvbnN0ciIsIm1hdGgiLCJlcnJvcl9jb25zdHIiLCJleG5fd2l0aF9qc19iYWNrdHJhY2UiLCJuYW1lIiwibWVzc2FnZSIsInN0YWNrIiwidG9fc3RyaW5nIiwiZSIsInJhaXNlX2pzX2Vycm9yIiwic3RyaW5nX29mX2Vycm9yIiwiSlNPTiIsImRlY29kZVVSSSIsInMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJlbmNvZGVVUkkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJlc2NhcGUiLCJ1bmVzY2FwZSIsImlzTmFOIiwiaSIsInBhcnNlSW50IiwicyQwIiwicGFyc2VGbG9hdCIsImV4cG9ydF9qcyIsImZpZWxkIiwiZXhwb3J0JDAiLCJleHBvcnRfYWxsIiwib2JqIiwia2V5cyIsImtleSIsImxpc3Rfb2Zfbm9kZUxpc3QiLCJsZW5ndGgiLCJhY2MiLCJpJDAiLCJhY2MkMCIsImkkMSIsImRpc2Nvbm5lY3RlZCIsInByZWNlZGluZyIsImZvbGxvd2luZyIsImNvbnRhaW5zIiwiY29udGFpbmVkX2J5IiwiaW1wbGVtZW50YXRpb25fc3BlY2lmaWMiLCJoYXMiLCJ0IiwibWFzayIsImFkZCIsImFwcGVuZENoaWxkIiwicCIsIm4iLCJyZW1vdmVDaGlsZCIsInJlcGxhY2VDaGlsZCIsImluc2VydEJlZm9yZSIsIm5vZGVUeXBlIiwidDEzIiwiY2FzdCIsInQxNCIsImVsZW1lbnQiLCJ0ZXh0IiwiYXR0ciIsIm5vX2hhbmRsZXIiLCJoYW5kbGVyIiwicmVzIiwiZnVsbF9oYW5kbGVyIiwidGhpcyQwIiwiaW52b2tlX2hhbmRsZXIiLCJldmVudCIsImV2ZW50VGFyZ2V0IiwibWFrZSIsImFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyIsInQyOCIsInR5cCIsImNhcHR1cmUiLCJvbmNlIiwicGFzc2l2ZSIsImgiLCJldiIsImNhbGxiYWNrIiwiYiIsImFkZEV2ZW50TGlzdGVuZXIiLCJjYXB0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImlkIiwicHJldmVudERlZmF1bHQiLCJjcmVhdGVDdXN0b21FdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGV0YWlsIiwib3B0X2l0ZXIiLCJjb25zdHIiLCJhcnJheUJ1ZmZlciIsImludDhBcnJheSIsInVpbnQ4QXJyYXkiLCJpbnQxNkFycmF5IiwidWludDE2QXJyYXkiLCJpbnQzMkFycmF5IiwidWludDMyQXJyYXkiLCJmbG9hdDMyQXJyYXkiLCJmbG9hdDY0QXJyYXkiLCJzZXQiLCJ2IiwidW5zYWZlX2dldCIsImRhdGFWaWV3Iiwib2ZfYXJyYXlCdWZmZXIiLCJhYiIsInVpbnQ4IiwiYmxvYl9jb25zdHIiLCJmaWx0ZXJfbWFwIiwicSIsInYkMCIsImJsb2JfcmF3IiwiY29udGVudFR5cGUiLCJlbmRpbmdzIiwib3B0aW9ucyIsIm9wdGlvbnMkMCIsImJsb2JfZnJvbV9zdHJpbmciLCJibG9iX2Zyb21fYW55IiwibCIsImEkMCIsImwkMCIsImZpbGVuYW1lIiwibmFtZSQwIiwiZG9jX2NvbnN0ciIsImRvY3VtZW50IiwiYmxvYiIsInN0cmluZyIsImxvYWRzdGFydCIsInByb2dyZXNzIiwiYWJvcnQiLCJlcnJvciIsImxvYWQiLCJsb2FkZW5kIiwiZmlsZVJlYWRlciIsIm9uSUUiLCJjbGljayIsImNvcHkiLCJjdXQiLCJwYXN0ZSIsImRibGNsaWNrIiwibW91c2Vkb3duIiwibW91c2V1cCIsIm1vdXNlb3ZlciIsIm1vdXNlbW92ZSIsIm1vdXNlb3V0Iiwia2V5cHJlc3MiLCJrZXlkb3duIiwia2V5dXAiLCJtb3VzZXdoZWVsIiwid2hlZWwiLCJET01Nb3VzZVNjcm9sbCIsInRvdWNoc3RhcnQiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIsInRvdWNoY2FuY2VsIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIsImRyYWdlbnRlciIsImRyYWdvdmVyIiwiZHJhZ2xlYXZlIiwiZHJhZyIsImRyb3AiLCJoYXNoY2hhbmdlIiwiY2hhbmdlIiwiaW5wdXQiLCJ0aW1ldXBkYXRlIiwic3VibWl0Iiwic2Nyb2xsIiwiZm9jdXMiLCJibHVyIiwidW5sb2FkIiwiYmVmb3JldW5sb2FkIiwicmVzaXplIiwib3JpZW50YXRpb25jaGFuZ2UiLCJwb3BzdGF0ZSIsInNlbGVjdCIsIm9ubGluZSIsIm9mZmxpbmUiLCJjaGVja2luZyIsIm5vdXBkYXRlIiwiZG93bmxvYWRpbmciLCJ1cGRhdGVyZWFkeSIsImNhY2hlZCIsIm9ic29sZXRlIiwiZG9tQ29udGVudExvYWRlZCIsImFuaW1hdGlvbnN0YXJ0IiwiYW5pbWF0aW9uZW5kIiwiYW5pbWF0aW9uaXRlcmF0aW9uIiwiYW5pbWF0aW9uY2FuY2VsIiwidHJhbnNpdGlvbnJ1biIsInRyYW5zaXRpb25zdGFydCIsInRyYW5zaXRpb25lbmQiLCJ0cmFuc2l0aW9uY2FuY2VsIiwiY2FucGxheSIsImNhbnBsYXl0aHJvdWdoIiwiZHVyYXRpb25jaGFuZ2UiLCJlbXB0aWVkIiwiZW5kZWQiLCJnb3Rwb2ludGVyY2FwdHVyZSIsImxvYWRlZGRhdGEiLCJsb2FkZWRtZXRhZGF0YSIsImxvc3Rwb2ludGVyY2FwdHVyZSIsInBhdXNlIiwicGxheSIsInBsYXlpbmciLCJwb2ludGVyZW50ZXIiLCJwb2ludGVyY2FuY2VsIiwicG9pbnRlcmRvd24iLCJwb2ludGVybGVhdmUiLCJwb2ludGVybW92ZSIsInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciIsInBvaW50ZXJ1cCIsInJhdGVjaGFuZ2UiLCJzZWVrZWQiLCJzZWVraW5nIiwic3RhbGxlZCIsInN1c3BlbmQiLCJ2b2x1bWVjaGFuZ2UiLCJ3YWl0aW5nIiwiZCIsImxvY2F0aW9uX29yaWdpbiIsIm9yaWdpbiIsIndpbmRvdyIsImdldEVsZW1lbnRCeUlkIiwicG5vZGUiLCJnZXRFbGVtZW50QnlJZF9leG4iLCJnZXRFbGVtZW50QnlJZF9vcHQiLCJnZXRFbGVtZW50QnlJZF9jb2VyY2UiLCJjcmVhdGVFbGVtZW50IiwiZG9jIiwidW5zYWZlQ3JlYXRlRWxlbWVudCIsImNyZWF0ZUVsZW1lbnRTeW50YXgiLCJ1bnNhZmVDcmVhdGVFbGVtZW50RXgiLCJ0eXBlIiwiZWx0IiwiY3JlYXRlSHRtbCIsImNyZWF0ZUhlYWQiLCJjcmVhdGVMaW5rIiwiY3JlYXRlVGl0bGUiLCJjcmVhdGVNZXRhIiwiY3JlYXRlQmFzZSIsImNyZWF0ZVN0eWxlIiwiY3JlYXRlQm9keSIsImNyZWF0ZUZvcm0iLCJjcmVhdGVPcHRncm91cCIsImNyZWF0ZU9wdGlvbiIsImNyZWF0ZVNlbGVjdCIsImNyZWF0ZUlucHV0IiwiY3JlYXRlVGV4dGFyZWEiLCJjcmVhdGVCdXR0b24iLCJjcmVhdGVMYWJlbCIsImNyZWF0ZUZpZWxkc2V0IiwiY3JlYXRlTGVnZW5kIiwiY3JlYXRlVWwiLCJjcmVhdGVPbCIsImNyZWF0ZURsIiwiY3JlYXRlTGkiLCJjcmVhdGVEaXYiLCJjcmVhdGVFbWJlZCIsImNyZWF0ZVAiLCJjcmVhdGVIMSIsImNyZWF0ZUgyIiwiY3JlYXRlSDMiLCJjcmVhdGVINCIsImNyZWF0ZUg1IiwiY3JlYXRlSDYiLCJjcmVhdGVRIiwiY3JlYXRlQmxvY2txdW90ZSIsImNyZWF0ZVByZSIsImNyZWF0ZUJyIiwiY3JlYXRlSHIiLCJjcmVhdGVJbnMiLCJjcmVhdGVEZWwiLCJjcmVhdGVBIiwiY3JlYXRlSW1nIiwiY3JlYXRlT2JqZWN0IiwiY3JlYXRlUGFyYW0iLCJjcmVhdGVNYXAiLCJjcmVhdGVBcmVhIiwiY3JlYXRlU2NyaXB0IiwiY3JlYXRlVGFibGUiLCJjcmVhdGVDYXB0aW9uIiwiY3JlYXRlQ29sIiwiY3JlYXRlQ29sZ3JvdXAiLCJjcmVhdGVUaGVhZCIsImNyZWF0ZVRmb290IiwiY3JlYXRlVGJvZHkiLCJjcmVhdGVUciIsImNyZWF0ZVRoIiwiY3JlYXRlVGQiLCJjcmVhdGVTdWIiLCJjcmVhdGVTdXAiLCJjcmVhdGVTcGFuIiwiY3JlYXRlVHQiLCJjcmVhdGVJIiwiY3JlYXRlQiIsImNyZWF0ZUJpZyIsImNyZWF0ZVNtYWxsIiwiY3JlYXRlRW0iLCJjcmVhdGVTdHJvbmciLCJjcmVhdGVDaXRlIiwiY3JlYXRlRGZuIiwiY3JlYXRlQ29kZSIsImNyZWF0ZVNhbXAiLCJjcmVhdGVLYmQiLCJjcmVhdGVWYXIiLCJjcmVhdGVBYmJyIiwiY3JlYXRlRGQiLCJjcmVhdGVEdCIsImNyZWF0ZU5vc2NyaXB0IiwiY3JlYXRlQWRkcmVzcyIsImNyZWF0ZUZyYW1lc2V0IiwiY3JlYXRlRnJhbWUiLCJjcmVhdGVJZnJhbWUiLCJjcmVhdGVBdWRpbyIsImNyZWF0ZVZpZGVvIiwiY3JlYXRlQ2FudmFzIiwiaHRtbF9lbGVtZW50IiwidDU0IiwidW5zYWZlQ29lcmNlIiwidGFnIiwidDU1IiwiYXJlYSIsImJhc2UiLCJibG9ja3F1b3RlIiwiYm9keSIsImJyIiwiYnV0dG9uIiwiY2FudmFzIiwiY2FwdGlvbiIsImNvbCIsImNvbGdyb3VwIiwiZGVsIiwiZGl2IiwiZGwiLCJmaWVsZHNldCIsImVtYmVkIiwiZm9ybSIsImZyYW1lc2V0IiwiZnJhbWUiLCJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJoZWFkIiwiaHIiLCJodG1sIiwiaWZyYW1lIiwiaW1nIiwiaW5wdXQkMCIsImlucyIsImxhYmVsIiwibGVnZW5kIiwibGkiLCJsaW5rIiwibWV0YSIsIm9iamVjdCIsIm9sIiwib3B0Z3JvdXAiLCJwYXJhbSIsInByZSIsInNjcmlwdCIsInNlbGVjdCQwIiwic3R5bGUiLCJ0YWJsZSIsInRib2R5IiwidGQiLCJ0ZXh0YXJlYSIsInRmb290IiwidGgiLCJ0aGVhZCIsInRpdGxlIiwidHIiLCJ1bCIsImF1ZGlvIiwidmlkZW8iLCJ1bnNhZmVDb2VyY2VFdmVudCIsIm1vdXNlRXZlbnQiLCJrZXlib2FyZEV2ZW50Iiwid2hlZWxFdmVudCIsIm1vdXNlU2Nyb2xsRXZlbnQiLCJwb3BTdGF0ZUV2ZW50IiwibWVzc2FnZUV2ZW50IiwiZXZlbnRSZWxhdGVkVGFyZ2V0IiwiZXZlbnRBYnNvbHV0ZVBvc2l0aW9uIiwiZXZlbnRBYnNvbHV0ZVBvc2l0aW9uJDAiLCJlbGVtZW50Q2xpZW50UG9zaXRpb24iLCJnZXREb2N1bWVudFNjcm9sbCIsImJ1dHRvblByZXNzZWQiLCJhZGRNb3VzZXdoZWVsRXZlbnRMaXN0ZW5lcldpdGgiLCJkeCIsImR5IiwiYWRkTW91c2V3aGVlbEV2ZW50TGlzdGVuZXIiLCJ0cnlfY29kZSIsInRyeV9rZXlfY29kZV9sZWZ0IiwidHJ5X2tleV9jb2RlX3JpZ2h0IiwidHJ5X2tleV9jb2RlX251bXBhZCIsInRyeV9rZXlfY29kZV9ub3JtYWwiLCJtYWtlX3VuaWRlbnRpZmllZCIsInJ1bl9uZXh0IiwidmFsdWUiLCJzeW1ib2wiLCJvZl9ldmVudCIsImNoYXJfb2ZfaW50IiwiZW1wdHlfc3RyaW5nIiwibm9uZSIsIm9mX2V2ZW50JDAiLCJlbGVtZW50JDAiLCJ0YWdnZWQiLCJ0MTA1Iiwib3B0X3RhZ2dlZCIsInRhZ2dlZEV2ZW50Iiwib3B0X3RhZ2dlZEV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYyIsInJlcSIsIm5vdyIsImxhc3QiLCJkdCIsImR0JDAiLCJoYXNQdXNoU3RhdGUiLCJoYXNQbGFjZWhvbGRlciIsImhhc1JlcXVpcmVkIiwib3ZlcmZsb3dfbGltaXQiLCJzZXRUaW1lb3V0IiwibG9vcCIsInJlbWFpbiIsInN0ZXAiLCJjYiIsImNsZWFyVGltZW91dCIsImpzX2FycmF5X29mX2NvbGxlY3Rpb24iLCJmb3JtRGF0YSIsImZvcm1EYXRhX2Zvcm0iLCJoYXZlX2NvbnRlbnQiLCJmb3JtX2VsZW1lbnRzIiwiaSQyIiwic3RoIiwibmFtZSQxIiwibGlzdCIsImZpbGUiLCJhcHBlbmQiLCJmb3JtX2NvbnRlbnRzIiwiZm9ybV9lbHQiLCJlbXB0eV9mb3JtX2NvbnRlbnRzIiwicG9zdF9mb3JtX2NvbnRlbnRzIiwiY29udGVudHMiLCJnZXRfZm9ybV9jb250ZW50cyIsInJlYWR5c3RhdGVjaGFuZ2UiLCJ0aW1lb3V0Iiwid29ya2VyIiwiY3JlYXRlIiwiaW1wb3J0X3NjcmlwdHMiLCJzY3JpcHRzIiwic2V0X29ubWVzc2FnZSIsImpzX2hhbmRsZXIiLCJwb3N0X21lc3NhZ2UiLCJtc2ciLCJ3ZWJTb2NrZXQiLCJpc19zdXBwb3J0ZWQiLCJkZWZhdWx0Q29udGV4dEF0dHJpYnV0ZXMiLCJ3ZWJnbGNvbnRleHRsb3N0Iiwid2ViZ2xjb250ZXh0cmVzdG9yZWQiLCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIiwiZ2V0Q29udGV4dCIsImN0eCIsImdldENvbnRleHRXaXRoQXR0cmlidXRlcyIsImF0dHJpYnMiLCJyZWdleHAiLCJyZWdleHBfY2FzZV9mb2xkIiwicmVnZXhwX3dpdGhfZmxhZyIsImJsdW50X3N0cl9hcnJheV9nZXQiLCJzdHJpbmdfbWF0Y2giLCJzZWFyY2giLCJyZXNfcHJlIiwibWF0Y2hlZF9zdHJpbmciLCJyIiwibWF0Y2hlZF9ncm91cCIsInF1b3RlX3JlcGxfcmUiLCJxdW90ZV9yZXBsIiwiZ2xvYmFsX3JlcGxhY2UiLCJzX2J5IiwicmVwbGFjZV9maXJzdCIsInQyOSIsImZsYWdzIiwibGlzdF9vZl9qc19hcnJheSIsImlkeCQxIiwiYWNjdSIsImlkeCQwIiwiYWNjdSQwIiwic3BsaXQiLCJib3VuZGVkX3NwbGl0IiwicXVvdGVfcmUiLCJxdW90ZSIsInJlZ2V4cF9zdHJpbmciLCJyZWdleHBfc3RyaW5nX2Nhc2VfZm9sZCIsImludGVycnVwdCIsInBsdXNfcmUiLCJ1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyIsInVybGRlY29kZSIsInVybGVuY29kZSIsIm9wdCIsIndpdGhfcGx1cyIsImRlZmF1bHRfaHR0cF9wb3J0IiwiZGVmYXVsdF9odHRwc19wb3J0IiwicGF0aF9vZl9wYXRoX3N0cmluZyIsImF1eCIsImoiLCJ3b3JkIiwiZW5jb2RlX2FyZ3VtZW50cyIsImRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nIiwibGVuIiwiaW5kZXgiLCJkZWNvZGVfYXJndW1lbnRzIiwidXJsX3JlIiwiZmlsZV9yZSIsInVybF9vZl9qc19zdHJpbmciLCJoYW5kbGUiLCJwcm90X3N0cmluZyIsInNzbCIsInBhdGhfc3RyIiwidXJsIiwidXJsX29mX3N0cmluZyIsInN0cmluZ19vZl91cmwiLCJmcmFnIiwiYXJncyIsInBhdGgiLCJwb3J0IiwiaG9zdCIsImZyYWckMCIsImFyZ3MkMCIsInBhdGgkMCIsInBvcnQkMCIsImhvc3QkMCIsImZyYWckMSIsImFyZ3MkMSIsInBhdGgkMSIsInByb3RvY29sIiwicGF0aF9zdHJpbmciLCJhcmd1bWVudHMkMCIsImdldF9mcmFnbWVudCIsInJlcyQwIiwic2V0X2ZyYWdtZW50IiwidSIsImFzX3N0cmluZyIsInVwZGF0ZV9maWxlIiwiY29udGVudCIsIm9jIiwic2V0X2NoYW5uZWxfZmx1c2hlciIsIm91dF9jaGFubmVsIiwiZiQwIiwic2V0X2NoYW5uZWxfZmlsbGVyIiwiaW5fY2hhbm5lbCIsIm1vdW50IiwicHJlZml4IiwidW5tb3VudCIsImpzX29mX29jYW1sX3ZlcnNpb24iLCJlbXB0eV9yZXNpemVfb2JzZXJ2ZXJfb3B0aW9ucyIsInJlc2l6ZU9ic2VydmVyIiwib2JzZXJ2ZSIsIm5vZGUiLCJib3giLCJvYnMiLCJwZXJmb3JtYW5jZU9ic2VydmVyIiwiZW50cnlfdHlwZXMiLCJlbXB0eV9tdXRhdGlvbl9vYnNlcnZlcl9pbml0IiwibXV0YXRpb25PYnNlcnZlciIsImNoaWxkX2xpc3QiLCJhdHRyaWJ1dGVzIiwiY2hhcmFjdGVyX2RhdGEiLCJzdWJ0cmVlIiwiYXR0cmlidXRlX29sZF92YWx1ZSIsImNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSIsImF0dHJpYnV0ZV9maWx0ZXIiLCJrIiwicmVtb3ZlIiwiZmluZCIsImpzb24iLCJyZXZpdmVyIiwiaW5wdXRfcmV2aXZlciIsInVuc2FmZV9pbnB1dCIsIm1sSW50NjRfY29uc3RyIiwib3V0cHV0X3Jldml2ZXIiLCJvdXRwdXQiLCJzdHJpbmdfb2ZfbmFtZSIsIm5hbWVfb2Zfc3RyaW5nIiwicmdiX29mX25hbWUiLCJyZ2IiLCJoc2wiLCJzdHJpbmdfb2ZfdCIsImIkMCIsImckMCIsInIkMCIsImIkMSIsImckMSIsInIkMSIsImIkMiIsImckMiIsInIkMiIsImEkMSIsImgkMCIsImhleF9vZl9yZ2IiLCJibHVlIiwiZ3JlZW4iLCJyZWQiLCJpbl9yYW5nZSIsImpzX3Rfb2ZfanNfc3RyaW5nIiwicmdiX3JlIiwicmdiX3BjdF9yZSIsInJnYmFfcmUiLCJyZ2JhX3BjdF9yZSIsImhzbF9yZSIsImhzbGFfcmUiLCJqcyIsImNuIiwibWwiLCJmYWlsIiwicmVfcmdiIiwicmVfcmdiX3BjdCIsInJlX2hzbCIsImlfb2Zfc19vIiwiZl9vZl9zIiwiYWxwaGEiLCJyZWQkMCIsImdyZWVuJDAiLCJibHVlJDAiLCJhbHBoYSQwIiwicmVkJDEiLCJncmVlbiQxIiwiYmx1ZSQxIiwiYWxwaGEkMSIsInN0cmluZ19vZl90JDAiLCJmJDEiLCJmJDIiLCJmJDMiLCJmJDQiLCJmJDUiLCJmJDYiLCJmJDciLCJmJDgiLCJmJDkiLCJmJDEwIiwiZiQxMSIsImYkMTIiLCJqcyQwIiwibWwkMCIsInJlIiwic3RyaW5nX29mX3QkMSIsImpzJDEiLCJtbCQxIiwibGlzdGVuIiwidGFyZ2V0Iiwic3RvcF9saXN0ZW4iLCJ4bWxucyIsImNyZWF0ZUFsdEdseXBoIiwiY3JlYXRlQWx0R2x5cGhEZWYiLCJjcmVhdGVBbHRHbHlwaEl0ZW0iLCJjcmVhdGVBbmltYXRlIiwiY3JlYXRlQW5pbWF0ZUNvbG9yIiwiY3JlYXRlQW5pbWF0ZU1vdGlvbiIsImNyZWF0ZUFuaW1hdGVUcmFuc2Zvcm0iLCJjcmVhdGVDaXJjbGUiLCJjcmVhdGVDbGlwUGF0aCIsImNyZWF0ZUN1cnNvciIsImNyZWF0ZURlZnMiLCJjcmVhdGVEZXNjIiwiY3JlYXRlRWxsaXBzZSIsImNyZWF0ZUZpbHRlciIsImNyZWF0ZUZvbnQiLCJjcmVhdGVGb250RmFjZSIsImNyZWF0ZUZvbnRGYWNlRm9ybWF0IiwiY3JlYXRlRm9udEZhY2VOYW1lIiwiY3JlYXRlRm9udEZhY2VTcmMiLCJjcmVhdGVGb250RmFjZVVyaSIsImNyZWF0ZUZvcmVpZ25PYmplY3QiLCJjcmVhdGVHIiwiY3JlYXRlR2x5cGgiLCJjcmVhdGVHbHlwaFJlZiIsImNyZWF0ZWhrZXJuIiwiY3JlYXRlSW1hZ2UiLCJjcmVhdGVMaW5lRWxlbWVudCIsImNyZWF0ZUxpbmVhckVsZW1lbnQiLCJjcmVhdGVNYXNrIiwiY3JlYXRlTWV0YURhdGEiLCJjcmVhdGVNaXNzaW5nR2x5cGgiLCJjcmVhdGVNUGF0aCIsImNyZWF0ZVBhdGgiLCJjcmVhdGVQYXR0ZXJuIiwiY3JlYXRlUG9seWdvbiIsImNyZWF0ZVBvbHlsaW5lIiwiY3JlYXRlUmFkaWFsZ3JhZGllbnQiLCJjcmVhdGVSZWN0IiwiY3JlYXRlU2V0IiwiY3JlYXRlU3RvcCIsImNyZWF0ZVN2ZyIsImNyZWF0ZVN3aXRjaCIsImNyZWF0ZVN5bWJvbCIsImNyZWF0ZVRleHRFbGVtZW50IiwiY3JlYXRlVGV4dHBhdGgiLCJjcmVhdGVUcmVmIiwiY3JlYXRlVHNwYW4iLCJjcmVhdGVVc2UiLCJjcmVhdGVWaWV3IiwiY3JlYXRldmtlcm4iLCJzdmdfZWxlbWVudCIsInQ4IiwiYWx0R2x5cGgiLCJhbHRHbHlwaERlZiIsImFsdEdseXBoSXRlbSIsImFuaW1hdGUiLCJhbmltYXRlQ29sb3IiLCJhbmltYXRlTW90aW9uIiwiYW5pbWF0ZVRyYW5zZm9ybSIsImNpcmNsZSIsImNsaXBQYXRoIiwiY3Vyc29yIiwiZGVmcyIsImRlc2MiLCJlbGxpcHNlIiwiZmlsdGVyIiwiZm9udCIsImZvbnRGYWNlIiwiZm9udEZhY2VGb3JtYXQiLCJmb250RmFjZU5hbWUiLCJmb250RmFjZVNyYyIsImZvbnRGYWNlVXJpIiwiZm9yZWlnbk9iamVjdCIsImdseXBoIiwiZ2x5cGhSZWYiLCJoa2VybiIsImltYWdlIiwibGluZUVsZW1lbnQiLCJsaW5lYXJFbGVtZW50IiwibWV0YURhdGEiLCJtaXNzaW5nR2x5cGgiLCJtUGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxncmFkaWVudCIsInJlY3QiLCJzdG9wIiwic3ZnIiwic3dpdGNoJDAiLCJ0ZXh0RWxlbWVudCIsInRleHRwYXRoIiwidHJlZiIsInRzcGFuIiwidXNlIiwidmlldyIsInZrZXJuIiwid2l0aENyZWRlbnRpYWxzIiwiZXZlbnRTb3VyY2UiLCJldmVudFNvdXJjZV9vcHRpb25zIiwiY29uc29sZSIsImVtcHR5X3Bvc2l0aW9uX29wdGlvbnMiLCJnZW9sb2NhdGlvbiIsImVtcHR5X2ludGVyc2VjdGlvbl9vYnNlcnZlcl9vcCIsImludGVyc2VjdGlvbk9ic2VydmVyX3Vuc2FmZSIsIm9iamVjdF9vcHRpb25zIiwib3B0aW9ucyQxIiwib3B0aW9ucyQyIiwiaW50bCIsImNvbGxhdG9yX2NvbnN0ciIsImRhdGVUaW1lRm9ybWF0X2NvbnN0ciIsIm51bWJlckZvcm1hdF9jb25zdHIiLCJwbHVyYWxSdWxlc19jb25zdHIiLCJwcmVfdGVzdF9ob29rIiwic2V4cF9vZl90IiwidCIsInRfb2Zfc2V4cCIsImNvbXBhcmUiLCJhJDAiLCJiJDAiLCJhJDEiLCJiJDEiLCJhJDIiLCJiJDIiLCJhIiwiYiIsInlzIiwieSIsInhzIiwieCIsInJlcyIsImVxdWFsIiwiZGVmYXVsdF9pbmRlbnQiLCJtdXN0X2VzY2FwZSIsInN0ciIsImxlbiIsIml4JDEiLCJpeCIsIm5leHQiLCJuZXh0JDAiLCJpeCQwIiwiZXNjYXBlZCIsInMiLCJuIiwiaSQwIiwicyQwIiwiaSIsImMiLCJlc2Nfc3RyIiwiZXN0ciIsImVsZW4iLCJpbmRleF9vZl9uZXdsaW5lIiwic3RhcnQiLCJtYWNoX21heWJlX2VzY19zdHIiLCJwcF9odW1faW5kZW50IiwiaW5kZW50IiwicHBmIiwiaW5kZXgiLCJpbmRleCQwIiwibmV4dF9uZXdsaW5lIiwiZW5kX3BvcyIsImVuZF9wb3MkMCIsIm5leHRfbGluZSIsIm5ld2xpbmVfaW5kZXgiLCJpbmRleCQxIiwiaCIsInQkMCIsImgkMCIsInBwX21hY2hfaW50ZXJuYWwiLCJtYXlfbmVlZF9zcGFjZSIsInN0ciQwIiwibmV3X21heV9uZWVkX3NwYWNlIiwibmV3X21heV9uZWVkX3NwYWNlJDAiLCJtYXlfbmVlZF9zcGFjZSQwIiwibWF5X25lZWRfc3BhY2UkMSIsIm1heV9uZWVkX3NwYWNlJDIiLCJwcF9odW0iLCJzZXhwIiwicHBfbWFjaCIsInNpemVfbG9vcCIsImFjYyIsInYiLCJsc3QiLCJzaXplIiwidG9fYnVmZmVyX2h1bSIsImJ1ZiIsIm9wdCIsInN0aCIsInRvX2J1ZmZlcl9tYWNoIiwibG9vcCIsInRvX2J1ZmZlcl9nZW4iLCJhZGRfY2hhciIsImFkZF9zdHJpbmciLCJidWZmZXIiLCJ0b19zdHJpbmdfaHVtIiwidG9fc3RyaW5nX21hY2giLCJvZl9mbG9hdF9zdHlsZSIsIm9mX2ludF9zdHlsZSIsIm1lc3NhZ2UiLCJuYW1lIiwiZmllbGRzIiwiY29udl9maWVsZHMiLCJyZXN0IiwiZnNleHAiLCJmbmFtZSIsImRvY19jb21tZW50X3RhZyIsImNvZXJjZSIsInVuaXRfc2V4cF9ncmFtbWFyIiwic2V4cF90X3NleHBfZ3JhbW1hciIsImVtcHR5X3NleHBfZ3JhbW1hciIsImJvb2xfc2V4cF9ncmFtbWFyIiwic3RyaW5nX3NleHBfZ3JhbW1hciIsImJ5dGVzX3NleHBfZ3JhbW1hciIsImNoYXJfc2V4cF9ncmFtbWFyIiwiaW50X3NleHBfZ3JhbW1hciIsImZsb2F0X3NleHBfZ3JhbW1hciIsImludDMyX3NleHBfZ3JhbW1hciIsImludDY0X3NleHBfZ3JhbW1hciIsIm5hdGl2ZWludF9zZXhwX2dyYW1tYXIiLCJyZWZfc2V4cF9ncmFtbWFyIiwiZ3JhbW1hciIsImxhenlfdF9zZXhwX2dyYW1tYXIiLCJvcHRpb25fc2V4cF9ncmFtbWFyIiwicGFyYW0iLCJsaXN0X3NleHBfZ3JhbW1hciIsImFycmF5X3NleHBfZ3JhbW1hciIsImRlZmF1bHRfc3RyaW5nX29mX2Zsb2F0IiwicmVhZF9vbGRfb3B0aW9uX2Zvcm1hdCIsIndyaXRlX29sZF9vcHRpb25fZm9ybWF0IiwibGlzdF9tYXAiLCJmIiwibCIsInNleHBfb2ZfdW5pdCIsInNleHBfb2ZfYm9vbCIsInNleHBfb2Zfc3RyaW5nIiwic2V4cF9vZl9ieXRlcyIsImJ5dGVzIiwic2V4cF9vZl9jaGFyIiwic2V4cF9vZl9pbnQiLCJzZXhwX29mX2Zsb2F0Iiwic2V4cF9vZl9pbnQzMiIsInNleHBfb2ZfaW50NjQiLCJzZXhwX29mX25hdGl2ZWludCIsInNleHBfb2ZfcmVmIiwic2V4cF9vZl9hIiwicmYiLCJzZXhwX29mX2xhenlfdCIsImx2Iiwic2V4cF9vZl9vcHRpb24iLCJzZXhwX29mX3BhaXIiLCJzZXhwX29mX2IiLCJzZXhwX29mX3RyaXBsZSIsInNleHBfb2ZfYyIsInNleHBfb2ZfbGlzdCIsInNleHBfb2ZfYXJyYXkiLCJhciIsImxzdF9yZWYiLCJzZXhwX29mX2hhc2h0YmwiLCJzZXhwX29mX2tleSIsInNleHBfb2ZfdmFsIiwiaHRibCIsImNvbGwiLCJrIiwic2V4cF9vZl9vcGFxdWUiLCJzZXhwX29mX2Z1biIsImhhc2giLCJ0aGVfZXhuX3RhYmxlIiwiYWRkIiwiZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIiwic2V4cF9vZl9leG4iLCJwcmludGV4YyIsImZpbmRfYXV0byIsImZvcl9wcmludGV4YyIsImV4biIsInNleHBfb2ZfZXhuX29wdCIsImV4bl90b19zdHJpbmciLCJlIiwicHJpbnRleGNfcHJlZmVyX3NleHAiLCJyZWNvcmRfY2hlY2tfZXh0cmFfZmllbGRzIiwib2Zfc2V4cF9lcnJvcl9leG4iLCJleGMiLCJvZl9zZXhwX2Vycm9yIiwid2hhdCIsInVuaXRfb2Zfc2V4cCIsImJvb2xfb2Zfc2V4cCIsInN0cmluZ19vZl9zZXhwIiwiYnl0ZXNfb2Zfc2V4cCIsImNoYXJfb2Zfc2V4cCIsImludF9vZl9zZXhwIiwiZXhjJDAiLCJmbG9hdF9vZl9zZXhwIiwiaW50MzJfb2Zfc2V4cCIsImludDY0X29mX3NleHAiLCJuYXRpdmVpbnRfb2Zfc2V4cCIsInJlZl9vZl9zZXhwIiwiYV9vZl9zZXhwIiwibGF6eV90X29mX3NleHAiLCJvcHRpb25fb2Zfc2V4cCIsImVsJDAiLCJlbCIsInBhaXJfb2Zfc2V4cCIsImJfb2Zfc2V4cCIsImJfc2V4cCIsImFfc2V4cCIsInRyaXBsZV9vZl9zZXhwIiwiY19vZl9zZXhwIiwiY19zZXhwIiwibGlzdF9vZl9zZXhwIiwicmV2X2xzdCIsImFycmF5X29mX3NleHAiLCJoYXNodGJsX29mX3NleHAiLCJrZXlfb2Zfc2V4cCIsInZhbF9vZl9zZXhwIiwiYWN0Iiwidl9zZXhwIiwia19zZXhwIiwib3BhcXVlX29mX3NleHAiLCJmdW5fb2Zfc2V4cCIsImdldF9mbGNfZXJyb3IiLCJjaHIiLCJsaW5lIiwiZmlsZSIsImFyZyIsImhhbmRsZXIiLCJ0dXBsZV9vZl9zaXplX25fZXhwZWN0ZWQiLCJsb2MiLCJzdGFnX25vX2FyZ3MiLCJzdGFnX2luY29ycmVjdF9uX2FyZ3MiLCJ0YWciLCJtc2ciLCJzdGFnX3Rha2VzX2FyZ3MiLCJuZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSIsImVtcHR5X2xpc3RfaW52YWxpZF9zdW0iLCJ1bmV4cGVjdGVkX3N0YWciLCJyZWNvcmRfc2V4cF9ib29sX3dpdGhfcGF5bG9hZCIsInJlY29yZF9vbmx5X3BhaXJzX2V4cGVjdGVkIiwicmVjb3JkX3N1cGVyZmx1b3VzX2ZpZWxkcyIsInJldl9mbGRfbmFtZXMiLCJmbGRfbmFtZXNfc3RyIiwicmVjb3JkX2R1cGxpY2F0ZV9maWVsZHMiLCJyZWNvcmRfZXh0cmFfZmllbGRzIiwicmVjb3JkX2dldF91bmRlZmluZWRfbG9vcCIsImZpZWxkcyQwIiwiZmllbGQiLCJyZXN0JDAiLCJyZWNvcmRfdW5kZWZpbmVkX2VsZW1lbnRzIiwidW5kZWZpbmVkJDAiLCJyZWNvcmRfbGlzdF9pbnN0ZWFkX2F0b20iLCJyZWNvcmRfcG9seV9maWVsZF92YWx1ZSIsIm5vX3ZhcmlhbnRfbWF0Y2giLCJub19tYXRjaGluZ192YXJpYW50X2ZvdW5kIiwicHRhZ19ub19hcmdzIiwicHRhZ19pbmNvcnJlY3Rfbl9hcmdzIiwiY25zdHIiLCJwdGFnX3Rha2VzX2FyZ3MiLCJuZXN0ZWRfbGlzdF9pbnZhbGlkX3BvbHlfdmFyIiwiZW1wdHlfbGlzdF9pbnZhbGlkX3BvbHlfdmFyIiwiZW1wdHlfdHlwZSIsImRlc2NlbmRpbmciLCJ4IiwieSIsIm1heCIsIm1pbiIsIm1heF9pbnQiLCJtaW5faW50IiwiaW5maW5pdHkiLCJuZWdfaW5maW5pdHkiLCJuYW4iLCJtYXhfZmxvYXQiLCJtaW5fZmxvYXQiLCJlcHNpbG9uX2Zsb2F0IiwiY2hhcl9vZl9pbnQiLCJzdHJpbmdfb2ZfYm9vbCIsImJvb2xfb2Zfc3RyaW5nX29wdCIsImJvb2xfb2Zfc3RyaW5nIiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2Zsb2F0IiwiZmxvYXRfb2Zfc3RyaW5nX29wdCIsInN0ZGluIiwic3Rkb3V0Iiwic3RkZXJyIiwicHJpbnRfY2hhciIsInByaW50X3N0cmluZyIsInByaW50X2J5dGVzIiwicHJpbnRfaW50IiwicHJpbnRfZmxvYXQiLCJwcmludF9lbmRsaW5lIiwicHJpbnRfbmV3bGluZSIsInByZXJyX2NoYXIiLCJwcmVycl9zdHJpbmciLCJwcmVycl9ieXRlcyIsInByZXJyX2ludCIsInByZXJyX2Zsb2F0IiwicHJlcnJfZW5kbGluZSIsInByZXJyX25ld2xpbmUiLCJyZWFkX2xpbmUiLCJyZWFkX2ludF9vcHQiLCJyZWFkX2ludCIsInJlYWRfZmxvYXRfb3B0IiwicmVhZF9mbG9hdCIsIm9wZW5fb3V0Iiwib3Blbl9vdXRfYmluIiwib3Blbl9vdXRfZ2VuIiwiZmx1c2giLCJmbHVzaF9hbGwiLCJvdXRwdXRfY2hhciIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXRfYnl0ZXMiLCJvdXRwdXQiLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X2J5dGUiLCJvdXRwdXRfYmluYXJ5X2ludCIsIm91dHB1dF92YWx1ZSIsInNlZWtfb3V0IiwicG9zX291dCIsIm91dF9jaGFubmVsX2xlbmd0aCIsImNsb3NlX291dCIsImNsb3NlX291dF9ub2VyciIsInNldF9iaW5hcnlfbW9kZV9vdXQiLCJvcGVuX2luIiwib3Blbl9pbl9iaW4iLCJvcGVuX2luX2dlbiIsImlucHV0X2NoYXIiLCJpbnB1dF9saW5lIiwiaW5wdXQiLCJyZWFsbHlfaW5wdXQiLCJyZWFsbHlfaW5wdXRfc3RyaW5nIiwiaW5wdXRfYnl0ZSIsImlucHV0X2JpbmFyeV9pbnQiLCJpbnB1dF92YWx1ZSIsInNlZWtfaW4iLCJwb3NfaW4iLCJpbl9jaGFubmVsX2xlbmd0aCIsImNsb3NlX2luIiwiY2xvc2VfaW5fbm9lcnIiLCJzZXRfYmluYXJ5X21vZGVfaW4iLCJzdHJpbmdfb2ZfZm9ybWF0Iiwic3ltYm9sIiwiZXhpdCIsImF0X2V4aXQiLCJ2YWxpZF9mbG9hdF9sZXhlbSIsInVuc2FmZV9yZWFsbHlfaW5wdXQiLCJkb19hdF9leGl0IiwiZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQiLCJib29sX3RvX2ludCIsInN5bWJvbCQzIiwic3ltYm9sJDQiLCJzeW1ib2wkNSIsInN5bWJvbCQ2Iiwic3ltYm9sJDciLCJzeW1ib2wkOCIsInN5bWJvbCQ5Iiwic3ltYm9sJDEwIiwic3ltYm9sJDExIiwic3ltYm9sJDEyIiwiYXNjZW5kaW5nIiwibWF4JDAiLCJtaW4kMCIsImFzY2VuZGluZyQwIiwiZGVzY2VuZGluZyQwIiwibWF4JDEiLCJtaW4kMSIsInN5bWJvbCQxMyIsInN5bWJvbCQxNCIsInN5bWJvbCQxNSIsInN5bWJvbCQxNiIsInN5bWJvbCQxNyIsInN5bWJvbCQxOCIsImFzY2VuZGluZyQxIiwiZGVzY2VuZGluZyQxIiwiY29tcGFyZSIsImVxdWFsIiwibWF4JDIiLCJtaW4kMiIsImFzY2VuZGluZyQyIiwiZGVzY2VuZGluZyQyIiwibWF4JDMiLCJtaW4kMyIsInN5bWJvbCQxOSIsInN5bWJvbCQyMCIsInN5bWJvbCQyMSIsInN5bWJvbCQyMiIsInN5bWJvbCQyMyIsInN5bWJvbCQyNCIsImFzY2VuZGluZyQzIiwiZGVzY2VuZGluZyQzIiwiY29tcGFyZSQwIiwiZXF1YWwkMCIsIm1heCQ0IiwibWluJDQiLCJzeW1ib2wkMjUiLCJzeW1ib2wkMjYiLCJzeW1ib2wkMjciLCJzeW1ib2wkMjgiLCJzeW1ib2wkMjkiLCJzeW1ib2wkMzAiLCJhc2NlbmRpbmckNCIsImRlc2NlbmRpbmckNCIsImNvbXBhcmUkMSIsImVxdWFsJDEiLCJtYXgkNSIsIm1pbiQ1Iiwic3ltYm9sJDMxIiwic3ltYm9sJDMyIiwic3ltYm9sJDMzIiwic3ltYm9sJDM0Iiwic3ltYm9sJDM1Iiwic3ltYm9sJDM2IiwiYXNjZW5kaW5nJDUiLCJkZXNjZW5kaW5nJDUiLCJjb21wYXJlJDIiLCJlcXVhbCQyIiwibWF4JDYiLCJtaW4kNiIsImkiLCJzeW1ib2wkMzciLCJzeW1ib2wkMzgiLCJzeW1ib2wkMzkiLCJzeW1ib2wkNDAiLCJzeW1ib2wkNDEiLCJzeW1ib2wkNDIiLCJhc2NlbmRpbmckNiIsImRlc2NlbmRpbmckNiIsImNvbXBhcmUkMyIsImVxdWFsJDMiLCJtYXgkNyIsIm1pbiQ3Iiwic3ltYm9sJDQzIiwic3ltYm9sJDQ0Iiwic3ltYm9sJDQ1Iiwic3ltYm9sJDQ2Iiwic3ltYm9sJDQ3Iiwic3ltYm9sJDQ4IiwiYXNjZW5kaW5nJDciLCJkZXNjZW5kaW5nJDciLCJjb21wYXJlJDQiLCJlcXVhbCQ0IiwibWF4JDgiLCJtaW4kOCIsInN5bWJvbCQ0OSIsInN5bWJvbCQ1MCIsInN5bWJvbCQ1MSIsInN5bWJvbCQ1MiIsInN5bWJvbCQ1MyIsInN5bWJvbCQ1NCIsImFzY2VuZGluZyQ4IiwiZGVzY2VuZGluZyQ4IiwiY29tcGFyZSQ1IiwiZXF1YWwkNSIsIm1heCQ5IiwibWluJDkiLCJzeW1ib2wkNTUiLCJzeW1ib2wkNTYiLCJzeW1ib2wkNTciLCJzeW1ib2wkNTgiLCJzeW1ib2wkNTkiLCJzeW1ib2wkNjAiLCJhc2NlbmRpbmckOSIsImRlc2NlbmRpbmckOSIsImNvbXBhcmUkNiIsImVxdWFsJDYiLCJtYXgkMTAiLCJtaW4kMTAiLCJzeW1ib2wkNjEiLCJzeW1ib2wkNjIiLCJzeW1ib2wkNjMiLCJzeW1ib2wkNjQiLCJhc3IiLCJsYW5kIiwibG5vdCQwIiwibG9yIiwibHNsIiwibHNyIiwibHhvciIsIm1vZCIsImFicyQwIiwiZmFpbHdpdGgkMCIsImZzdCIsImludmFsaWRfYXJnJDAiLCJzbmQiLCJwaHlzX2VxdWFsIiwiZGVjciIsImluY3IiLCJmbG9hdF9vZl9zdHJpbmciLCJhbV90ZXN0aW5nIiwiZmFpbHdpdGhmIiwiZm10IiwicyIsImludmFsaWRfYXJnZiIsImJhY2tlbmRfdHlwZSIsImludGVyYWN0aXZlIiwib3NfdHlwZSIsInVuaXgiLCJ3aW4zMiIsImN5Z3dpbiIsIndvcmRfc2l6ZV9pbl9iaXRzIiwiaW50X3NpemVfaW5fYml0cyIsImJpZ19lbmRpYW4iLCJtYXhfc3RyaW5nX2xlbmd0aCIsIm1heF9hcnJheV9sZW5ndGgiLCJydW50aW1lX3ZhcmlhbnQiLCJydW50aW1lX3BhcmFtZXRlcnMiLCJhcmd2IiwiZ2V0X2FyZ3YiLCJvY2FtbF92ZXJzaW9uIiwiZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MiLCJydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQiLCJnZXRlbnZfZXhuIiwidmFyJDAiLCJnZXRlbnYiLCJtYXhfbGVuZ3RoIiwiY3JlYXRlIiwibGVuIiwiY3JlYXRlX2Zsb2F0X3VuaW5pdGlhbGl6ZWQiLCJhcHBlbmQiLCJibGl0IiwiY29uY2F0IiwiY29weSIsImZpbGwiLCJpbml0IiwibWFrZV9tYXRyaXgiLCJvZl9saXN0Iiwic3ViIiwidG9fbGlzdCIsImZvbGQiLCJ0IiwiZiIsImZvbGRfcmlnaHQiLCJpdGVyIiwiaXRlcmkiLCJtYXAiLCJtYXBpIiwic3RhYmxlX3NvcnQiLCJzd2FwIiwiaiIsImVsdF9pIiwiZWx0X2oiLCJlc2NhcGVkIiwibG93ZXJjYXNlIiwidG9faW50IiwidW5zYWZlX29mX2ludCIsInVwcGVyY2FzZSIsImludF9pc19vayIsIm1pbl92YWx1ZSIsIm1heF92YWx1ZSIsIm9mX2ludCIsIm9mX2ludF9leG4iLCJ0MSIsInQyIiwidG9fc3RyaW5nIiwib2Zfc3RyaW5nIiwidG9fZmxvYXQiLCJvZl9mbG9hdCIsInN1Y2MiLCJoZF9leG4iLCJsZW5ndGgiLCJyZXZfYXBwZW5kIiwidGxfZXhuIiwidW56aXAiLCJleGlzdHMiLCJleGlzdHMyX29rIiwibDEiLCJsMiIsImZvbGQyX29rIiwiZm9yX2FsbCIsImZvcl9hbGwyX29rIiwiaXRlcjJfb2siLCJub250YWlsX21hcCIsIm5vbnRhaWxfbWFwaSIsInBhcnRpdGlvbiIsInJldl9tYXAiLCJyZXZfbWFwMl9vayIsInNvcnQiLCJsIiwicmV2IiwicmVzIiwicmVzdCIsImEiLCJiIiwiaGFzaF9mb2xkX3VuaXQiLCJoYXNoX2ZvbGRfaW50IiwiaGFzaF9mb2xkX2ludDY0IiwiaGFzaF9mb2xkX2Zsb2F0IiwiaGFzaF9mb2xkX3N0cmluZyIsImFzX2ludCIsImhhc2hfZm9sZF9pbnQzMiIsImhhc2hfZm9sZF9jaGFyIiwiaGFzaF9mb2xkX2Jvb2wiLCJoYXNoX2ZvbGRfbmF0aXZlaW50IiwiaGFzaF9mb2xkX29wdGlvbiIsImhhc2hfZm9sZF9lbGVtIiwiaGFzaF9mb2xkX2xpc3QiLCJzJDEiLCJsaXN0JDEiLCJzJDIiLCJsaXN0IiwibGlzdCQwIiwicyQwIiwiaGFzaF9mb2xkX2xhenlfdCIsImhhc2hfZm9sZF9yZWZfZnJvemVuIiwiaGFzaF9mb2xkX2FycmF5X2Zyb3plbiIsImFycmF5IiwiZSIsImkkMCIsImhhc2hfbmF0aXZlaW50IiwiaGFzaF9pbnQ2NCIsImhhc2hfaW50MzIiLCJoYXNoX2NoYXIiLCJoYXNoX2ludCIsImhhc2hfYm9vbCIsImhhc2hfc3RyaW5nIiwiaGFzaF9mbG9hdCIsImhhc2hfdW5pdCIsInNlZWQiLCJvZl9mb2xkIiwiaGFzaF9mb2xkX3QiLCJydW4iLCJmb2xkZXIiLCJvcHQiLCJzdGgiLCJjb21wYXJlX3N0YXRlIiwic3RhdGVfdG9fc3RyaW5nIiwic3RhdGUiLCJ0JDAiLCJ0JDEiLCJ0JDIiLCJ0JDMiLCJ0JDQiLCJ0JDUiLCJjb21wYXJlX2Fic3RyYWN0IiwidHlwZV9uYW1lIiwiZXF1YWxfYWJzdHJhY3QiLCJjb21wYXJlX2Jvb2wiLCJjb21wYXJlX2NoYXIiLCJjb21wYXJlX2Zsb2F0IiwiY29tcGFyZV9pbnQiLCJjb21wYXJlX2ludDMyIiwiY29tcGFyZV9pbnQ2NCIsImNvbXBhcmVfbmF0aXZlaW50IiwiY29tcGFyZV9zdHJpbmciLCJjb21wYXJlX3VuaXQiLCJjb21wYXJlX2FycmF5IiwiY29tcGFyZV9lbHQiLCJsZW5fYSIsImxlbl9iIiwicmV0IiwiciIsImNvbXBhcmVfbGlzdCIsImEkMCIsImIkMCIsInlzIiwieHMiLCJjb21wYXJlX29wdGlvbiIsImNvbXBhcmVfcmVmIiwiZXF1YWxfYm9vbCIsImVxdWFsX2NoYXIiLCJlcXVhbF9pbnQiLCJlcXVhbF9pbnQzMiIsImVxdWFsX2ludDY0IiwiZXF1YWxfbmF0aXZlaW50IiwiZXF1YWxfc3RyaW5nIiwiZXF1YWxfdW5pdCIsImVxdWFsX2Zsb2F0IiwiZXF1YWxfYXJyYXkiLCJlcXVhbF9lbHQiLCJlcXVhbF9saXN0IiwiZXF1YWxfb3B0aW9uIiwiZXF1YWxfcmVmIiwiYV8wMDEiLCJiXzAwMiIsImFfMDAzIiwiYl8wMDQiLCJhXzAwNSIsImJfMDA2IiwiaGFzaCIsImhzdiIsImFyZyIsImEwIiwiaHN2JDAiLCJhMCQwIiwiaHN2JDEiLCJ0X3NleHBfZ3JhbW1hciIsImludmFyaWFudCIsInNleHBfb2ZfdCIsIm51bV9iaXRzIiwid29yZF9zaXplIiwiYWxsIiwicmVnaXN0ZXIiLCJwIiwicHAiLCJtb2R1bGVfbmFtZSIsImZvcm1hdHRlciIsImFyZzFfMDAyIiwiYXJnMF8wMDEiLCJyZXMwXzAwMyIsInJlczFfMDA0IiwiYXJnMV8wMDYiLCJhcmcwXzAwNSIsInJlczBfMDA3IiwicmVzMV8wMDgiLCJjcmVhdGVfcyIsInNleHAiLCJyYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsInJlcmFpc2UiLCJleG4iLCJzdHIiLCJleG4kMCIsImJ0IiwicmVyYWlzZWYiLCJleGMiLCJmb3JtYXQiLCJ0b19zdHJpbmdfbWFjaCIsInNleHBfb2ZfdCQwIiwicHJvdGVjdHgiLCJmaW5hbGx5JDAiLCJmaW5hbF9leG4kMCIsImZpbmFsX2V4biIsInByb3RlY3QiLCJkb2VzX3JhaXNlIiwicHBmIiwicHJpbnRfd2l0aF9iYWNrdHJhY2UiLCJyYXdfYmFja3RyYWNlIiwiaGFuZGxlX3VuY2F1Z2h0X2F1eCIsImV4YyQwIiwiaGFuZGxlX3VuY2F1Z2h0X2FuZF9leGl0IiwiaGFuZGxlX3VuY2F1Z2h0IiwibXVzdF9leGl0IiwiZXhpdCQwIiwicmVyYWlzZV91bmNhdWdodCIsImZ1bmMiLCJyYWlzZV93aXRob3V0X2JhY2t0cmFjZSIsImluaXRpYWxpemVfbW9kdWxlIiwiY2xlYXJfYmFja3RyYWNlIiwid2l0aF9yZXR1cm4iLCJpc19hbGl2ZSIsInJldHVybiQwIiwid2l0aF9yZXR1cm5fb3B0aW9uIiwicHJlcGVuZCIsInBhcmFtIiwic3ltYm9sX2JpbmQiLCJzeW1ib2xfbWFwIiwiYmluZCIsImpvaW4iLCJpZ25vcmVfbSIsImFsbF91bml0IiwibWFwX3ZpYV9iaW5kIiwibWEiLCJzeW1ib2xfYmluZCQwIiwic3ltYm9sX21hcCQwIiwic3ltYm9sX2JpbmQkMSIsInN5bWJvbF9tYXAkMSIsImJvdGgiLCJsb29wIiwidnMiLCJ0cyIsInYiLCJiaW5kJDAiLCJyZXR1cm4kMSIsIm1hcCQwIiwidG9fbW9uYWQiLCJvZl9tb25hZCIsImRlcml2ZWRfbWFwIiwibWFwMiIsInRhIiwidGIiLCJtYXAzIiwidGMiLCJzeW1ib2wkMCIsInUiLCJzeW1ib2wkMSIsInRmIiwiZmFiIiwiYyIsImFwcGx5IiwibWYiLCJteCIsInR4IiwiY3VzdG9tX21hcCIsImFwcGx5JDAiLCJibGl0X3N0cmluZyIsIm1ha2UiLCJ1bnNhZmVfYmxpdCIsInVuc2FmZV90b19zdHJpbmciLCJ1bnNhZmVfb2Zfc3RyaW5nX3Byb21pc2Vfbm9fbXUiLCJjb21wYXJhdG9yIiwiZXJyb3Jfc291cmNlXzAxMSIsImNtcF9mIiwiY21wX3MiLCJoYXNoX2ZvbGRfZiIsImhhc2hfZm9sZF9zIiwidF9vZl9zZXhwIiwib2ZfZl8wMDciLCJvZl9zXzAwOCIsInNleHBfMDEzIiwidGFnXzAxNCIsInNleHBfYXJnc18wMjAiLCJhcmcwXzAyMSIsInJlczBfMDIyIiwic2V4cF9hcmdzXzAxNSIsImFyZzBfMDE2IiwicmVzMF8wMTciLCJvZl9mXzAyNSIsIm9mX3NfMDI2IiwiYXJnMF8wMjciLCJyZXMwXzAyOCIsImFyZzBfMDI5IiwicmVzMF8wMzAiLCJmX3NleHBfZ3JhbW1hciIsInNfc2V4cF9ncmFtbWFyIiwib3BhcXVlX2lkZW50aXR5IiwibmFtZSIsImdldCIsImZzZXQiLCJzZXR0ZXIiLCJ1cGRhdGVyIiwiZmllbGQiLCJjYXBpdGFsaXplIiwidW5jYXBpdGFsaXplIiwic2VwIiwibiIsIm4kMCIsIm4kMSIsImhzdiQyIiwicG9zX2NudW1fMDEwIiwicG9zX2JvbF8wMDgiLCJwb3NfbG51bV8wMDYiLCJwb3NfZm5hbWVfMDA0IiwiYXJnXzAxMSIsImJuZHNfMDAzIiwiYXJnXzAwOSIsImJuZHNfMDAzJDAiLCJhcmdfMDA3IiwiYm5kc18wMDMkMSIsImFyZ18wMDUiLCJibmRzXzAwMyQyIiwiaGFzaF9mb2xkX3QkMCIsImhhc2gkMCIsIm1ha2VfbG9jYXRpb25fc3RyaW5nIiwicG9zX2ZuYW1lIiwicG9zX2xudW0iLCJwb3NfY251bSIsInBvc19ib2wiLCJpc19lbXB0eSIsInBhcnRpdGlvbl9tYXAiLCJmc3QkMCIsInkkMCIsInNuZCQwIiwiZXJyb3Jfc291cmNlXzAwNSIsIm9mX2FfMDAxIiwib2ZfYl8wMDIiLCJzZXhwXzAwNyIsInRhZ18wMDgiLCJzZXhwX2FyZ3NfMDA5IiwiYXJnMF8wMTAiLCJyZXMwXzAxMSIsInNleHBfYXJnc18wMTQiLCJhcmcwXzAxNSIsInJlczBfMDE2Iiwib2ZfYV8wMTkiLCJvZl9iXzAyMCIsImFyZzBfMDIzIiwicmVzMF8wMjQiLCJhX3NleHBfZ3JhbW1hciIsImJfc2V4cF9ncmFtbWFyIiwiY21wX2EiLCJjbXBfYiIsImFfMDI3IiwiYl8wMjgiLCJhXzAyOSIsImJfMDMwIiwiYV8wMzEiLCJiXzAzMiIsImFfMDMzIiwiYl8wMzQiLCJhXzAzNSIsImJfMDM2IiwiYV8wMzciLCJiXzAzOCIsImhhc2hfZm9sZF9hIiwiaGFzaF9mb2xkX2IiLCJ4JDAiLCJjaGVja19vayIsImNoZWNrX2Vycm9yIiwib2siLCJlcnJvciIsImZhaWwiLCJmYWlsZiIsIm1hcF9lcnJvciIsImJpbmQkMSIsIm1hcCQxIiwicmV0dXJuJDIiLCJpc19vayIsImlzX2Vycm9yIiwib2Zfb3B0aW9uIiwiaXRlcl9lcnJvciIsInRvX2VpdGhlciIsIm9mX2VpdGhlciIsIm9rX2lmX3RydWUiLCJib29sIiwidHJ5X3dpdGgiLCJva19leG4iLCJva19vcl9mYWlsd2l0aCIsImNvbWJpbmUiLCJlcnIiLCJvazEiLCJvazIiLCJlcnIxIiwiZXJyMiIsImNvbWJpbmVfZXJyb3JzIiwiZXJycyIsImNvbWJpbmVfZXJyb3JzX3VuaXQiLCJjb3VudCIsInN1bSIsIk0iLCJmb2xkX3Jlc3VsdCIsImFjYyIsIml0ZW0iLCJmb2xkX3VudGlsIiwiZmluaXNoIiwibWluX2VsdCIsImVsdCIsIm1heF9lbHQiLCJmaW5kX21hcCIsImZpbmQiLCJ0b19hcnJheSIsIml0ZXIkMCIsIml0ZXIkMSIsImxlbmd0aCQwIiwibGVuZ3RoJDEiLCJpc19lbXB0eSQwIiwic3VtJDAiLCJtIiwiY291bnQkMCIsImV4aXN0cyQwIiwiZm9yX2FsbCQwIiwiZmluZF9tYXAkMCIsImZpbmQkMCIsInRvX2xpc3QkMCIsInRvX2FycmF5JDAiLCJtaW5fZWx0JDAiLCJtYXhfZWx0JDAiLCJmb2xkX3Jlc3VsdCQwIiwiZm9sZF91bnRpbCQwIiwiZm9sZCQwIiwibWVtIiwiY29tcGFyZV9hIiwiZXF1YWxfYSIsInNleHBfb2ZfYSIsInNsb3dfY2hlY2tfcG9zX2xlbl9leG4iLCJwb3MiLCJ0b3RhbF9sZW5ndGgiLCJjaGVja19wb3NfbGVuX2V4biIsInN0b3AiLCJnZXRfcG9zX2xlbl9leG4iLCJsZW4kMCIsIm9mX3N0YXRlIiwiYXNzaWduIiwiZHN0Iiwic3JjIiwiZHN0JDAiLCJzcmMkMCIsIm1ha2VfZGVmYXVsdCIsImRlZmF1bHQkMCIsInNwbGl0X2Zyb21fcGFyZW50IiwiZ2V0X3N0YXRlIiwicmFuZG9tX2tleSIsImZvcmJpZF9ub25kZXRlcm1pbmlzbV9pbl90ZXN0cyIsImFsbG93X2luX3Rlc3RzIiwiYml0cyIsImludCQwIiwiaW50MzIiLCJpbnQ2NCIsIm5hdGl2ZWludCIsImNoYXIkMCIsImFzY2lpIiwibWFrZV9zZWxmX2luaXQiLCJpbnRfb25fNjRiaXRzIiwiYm91bmQiLCJpbnRfb25fMzJiaXRzIiwiaW50JDEiLCJiaXRzJDAiLCJmdWxsX3JhbmdlX2ludDY0IiwiYml0cyQxIiwiZnVsbF9yYW5nZV9pbnQzMiIsImZ1bGxfcmFuZ2VfaW50X29uXzY0Yml0cyIsImZ1bGxfcmFuZ2VfaW50X29uXzMyYml0cyIsImZ1bGxfcmFuZ2VfaW50X29uXzY0Yml0cyQwIiwiZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fNjRiaXRzIiwiZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fMzJiaXRzIiwiZnVsbF9yYW5nZV9uYXRpdmVpbnQiLCJyYWlzZV9jcm9zc2VkX2JvdW5kcyIsImxvd2VyX2JvdW5kIiwidXBwZXJfYm91bmQiLCJzdHJpbmdfb2ZfYm91bmQiLCJpbnRfaW5jbCIsImxvIiwiaGkiLCJkaWZmIiwiaW50MzJfaW5jbCIsIm5hdGl2ZWludF9pbmNsIiwiaW50NjRfaW5jbCIsImZsb2F0JDAiLCJyMSIsInIyIiwicmVzdWx0IiwiZmxvYXRfcmFuZ2UiLCJkZWZhdWx0JDEiLCJiaXRzJDIiLCJpbnQkMiIsImludDMyJDAiLCJuYXRpdmVpbnQkMCIsImludDY0JDAiLCJmbG9hdCQxIiwiaW50X2luY2wkMCIsImludDMyX2luY2wkMCIsIm5hdGl2ZWludF9pbmNsJDAiLCJpbnQ2NF9pbmNsJDAiLCJmbG9hdF9yYW5nZSQwIiwiYm9vbCQwIiwiY2hhciQxIiwiYXNjaWkkMCIsImZ1bGxfaW5pdCIsInNlbGZfaW5pdCIsInNldF9zdGF0ZSIsInBlcm11dGUiLCJyYW5kb21fc3RhdGUiLCJzdGgkMCIsIm51bV9zd2FwcyIsInRoaXNfaSIsInJhbmRvbV9pIiwiY29uc3QkMCIsIm5vbiIsImZvcmV2ZXIiLCJlJDAiLCJjb21wb3NlIiwiZyIsImZsaXAiLCJhcHBseV9uX3RpbWVzIiwieCQxIiwic2V4cF8wMDYiLCJlcnJvcl9zb3VyY2VfMDIyIiwiZm9sZF9sZWZ0IiwiYV8wMDYiLCJiXzAwNyIsImFfMDA4IiwiYl8wMDkiLCJvZl9hXzAxMCIsImFyZzBfMDExIiwicmVzMF8wMTIiLCJyYW5nZSIsInN0cmlkZSIsInN0YXJ0X2kiLCJzdG9wX2kiLCJzdGFydCIsIm5leHRfaSIsIm9yZGVyIiwicmFpc2Vfc3RyaWRlX2Nhbm5vdF9yZXR1cm5fc2FtIiwiaW5pdGlhbF9zdHJpZGVfb3JkZXIiLCJzdGFydF9pJDAiLCJhY2N1bSIsImlfdG9fc3RvcF9vcmRlciIsIm5leHRfaSQwIiwiYWNjdW0kMCIsInJhbmdlJDAiLCJzdGgkMSIsImhkIiwidGwiLCJudGgiLCJudGhfZXhuIiwidW5vcmRlcmVkX2FwcGVuZCIsIm9mX2xpc3RzIiwic2hhcmVkX2xlbmd0aCIsInNoYXJlZF9sZW5ndGgkMCIsImNoZWNrX2xlbmd0aDJfZXhuIiwidGFpbF9vZl9iIiwidGFpbF9vZl9hIiwiY2hlY2tfbGVuZ3RoMiIsIm9mX2xpc3RzJDAiLCJsMyIsImMkMCIsImNoZWNrX2xlbmd0aDNfZXhuIiwidGFpbF9vZl9jIiwibjEiLCJuMiIsIm4zIiwiY2hlY2tfbGVuZ3RoMyIsIml0ZXIyIiwiaXRlcjJfZXhuIiwicmV2X21hcDIiLCJyZXZfbWFwMl9leG4iLCJmb2xkMiIsImZvbGQyX2V4biIsImZvcl9hbGwyIiwiZm9yX2FsbDJfZXhuIiwiZXhpc3RzMiIsImV4aXN0czJfZXhuIiwiYnMiLCJyZXZfZmlsdGVyIiwiYWNjdSIsImZpbHRlciIsIm5vdF9mb3VuZCIsImZpbmRfbWFwX2V4biIsIm5vdF9mb3VuZCQwIiwiZmluZF9leG4iLCJmaW5kaSIsIm5vdF9mb3VuZCQxIiwiZmluZGlfZXhuIiwiZmluZF9tYXBpIiwibm90X2ZvdW5kJDIiLCJmaW5kX21hcGlfZXhuIiwiZm9yX2FsbGkiLCJleGlzdHNpIiwibWF4X25vbl90YWlsY2FsbCIsImNvdW50X2FwcGVuZCIsIngxIiwieDIiLCJ4MyIsIng0IiwieDUiLCJjb3VudF9tYXAiLCJjdHIiLCJ4MSQwIiwiZjEkMyIsIngyJDAiLCJmMSQyIiwiZjIkMiIsIngzJDAiLCJmMSQxIiwiZjIkMSIsImYzJDEiLCJ4NCQwIiwiZjEkMCIsImYyJDAiLCJmMyQwIiwiZjQkMCIsIng1JDAiLCJmMSIsImYyIiwiZjMiLCJmNCIsImY1IiwiYnMkMCIsInhzJDAiLCJ4OCIsIng3IiwieDYiLCJ4MCIsInkwJDAiLCJ5MSQwIiwieTIkMCIsInkzJDAiLCJ5NCQwIiwieTUkMCIsInk2JDAiLCJ5NyQwIiwieTgkMCIsInk4IiwieTciLCJ5NiIsInk1IiwieTQiLCJ5MyIsInkyIiwieTEiLCJ5MCIsImZvbGRpbmdfbWFwIiwibmV3X2FjYyIsImZvbGRfbWFwIiwibWFwMl9vayIsIm1hcDJfZXhuIiwicmV2X21hcDNfb2siLCJsMSQwIiwibDIkMCIsImwzJDAiLCJhYyIsImwzJDEiLCJsMiQxIiwibDEkMSIsImFjJDAiLCJyZXZfbWFwMyIsInJldl9tYXAzX2V4biIsIm1hcDNfb2siLCJtYXAzX2V4biIsInJldl9tYXBfYXBwZW5kIiwiaCIsImxpc3QkMiIsInVuemlwMyIsInoiLCJ6aXBfZXhuIiwiemlwIiwicmV2X21hcGkiLCJmb2xkaW5nX21hcGkiLCJmb2xkX21hcGkiLCJmb2xkaSIsImZpbHRlcmkiLCJyZWR1Y2UiLCJyZWR1Y2VfZXhuIiwicmVkdWNlX2JhbGFuY2VkIiwic3RlcF9hY2N1bSIsIm51bSIsIm51bSQwIiwiYWNjJDAiLCJhY2MkMSIsIm51bSQxIiwicmVkdWNlX2JhbGFuY2VkX2V4biIsImdyb3VwaSIsImJyZWFrJDAiLCJncm91cHMiLCJjdXJyZW50X2dyb3VwIiwiZ3JvdXAiLCJzb3J0X2FuZF9ncm91cCIsImNvbmNhdF9tYXAiLCJjb25jYXRfbWFwaSIsImNvbnQiLCJtZXJnZSIsImgyIiwiaDEiLCJtYXAyJDAiLCJtYXAzJDAiLCJzeW1ib2wkMiIsImxhc3RfZXhuIiwibGFzdCIsImlzX3ByZWZpeCIsInByZWZpeCIsInByZWZpeCQwIiwicHJlZml4JDEiLCJoZCQwIiwiZmluZF9jb25zZWN1dGl2ZV9kdXBsaWNhdGUiLCJhMSIsImExJDAiLCJhMiIsInJlbW92ZV9jb25zZWN1dGl2ZV9kdXBsaWNhdGVzIiwid2hpY2hfdG9fa2VlcCIsInRsJDAiLCJ0b19rZWVwJDIiLCJ0b19rZWVwIiwidG9fa2VlcCQwIiwidG9fa2VlcCQxIiwiZGVkdXBfYW5kX3NvcnQiLCJzb3J0ZWQiLCJmaW5kX2FfZHVwIiwibCQwIiwiaGQyIiwiaGQxIiwiY29udGFpbnNfZHVwIiwibHN0IiwiZmluZF9hbGxfZHVwcyIsInNvcnRlZCQyIiwicHJldiQxIiwic29ydGVkJDAiLCJwcmV2IiwiYWxyZWFkeV9yZWNvcmRlZCIsInNvcnRlZCQxIiwicHJldiQwIiwiYWxsX2VxdWFsIiwiY291bnRpIiwiaWR4IiwicmV2X2ZpbHRlcl9tYXAiLCJmaWx0ZXJfbWFwIiwicmV2X2ZpbHRlcl9tYXBpIiwiaSQxIiwiZmlsdGVyX21hcGkiLCJmaWx0ZXJfb3B0IiwicGFydGl0aW9uM19tYXAiLCJ0cmQiLCJ0cmQkMCIsInkkMSIsInBhcnRpdGlvbl90ZiIsImYkMCIsInBhcnRpdGlvbl9yZXN1bHQiLCJ0X29mX3NleHAkMCIsIm9mX2FfMDE0Iiwib2ZfYl8wMTUiLCJ4XzAyMyIsInNleHBfMDIxIiwiYXJnMV8wMTgiLCJhcmcwXzAxNyIsInJlczBfMDE5IiwicmVzMV8wMjAiLCJzZXhwX29mX3QkMSIsIm9mX2FfMDI0Iiwib2ZfYl8wMjUiLCJ4XzAzMCIsImFyZzFfMDI3IiwiYXJnMF8wMjYiLCJyZXMxXzAyOSIsInRfc2V4cF9ncmFtbWFyJDAiLCJwYWlyX29mX2dyb3VwIiwiayIsImdyb3VwJDAiLCJhbGlzdCIsInNvcnRfYW5kX2dyb3VwJDAiLCJrZXkiLCJrZXkkMCIsIm5vdF9mb3VuZCQzIiwiZmluZF9leG4kMCIsInZhbHVlIiwibWVtJDAiLCJyZW1vdmUiLCJhZGQiLCJpbnZlcnNlIiwibWFwJDIiLCJlbCIsInNwbGl0X24iLCJ0X29yaWciLCJ0YWtlIiwiZHJvcCIsImNodW5rc19vZiIsImwkMSIsInN1Ymxpc3QiLCJzcGxpdF93aGlsZSIsInRha2Vfd2hpbGUiLCJkcm9wX3doaWxlIiwiZHJvcF9sYXN0IiwiZHJvcF9sYXN0X2V4biIsImNhcnRlc2lhbl9wcm9kdWN0IiwibGlzdDEiLCJsaXN0MiIsImNvbmNhdF9ub19vcmRlciIsImNvbnMiLCJpc19zb3J0ZWQiLCJpc19zb3J0ZWRfc3RyaWN0bHkiLCJhcnIiLCJyYW5kb21fZWxlbWVudF9leG4iLCJyYW5kb21fZWxlbWVudCIsImNtcCIsInQxJDAiLCJ0MiQwIiwidDIkMSIsInQxJDEiLCJ0cmFuc3Bvc2UiLCJyb3dzJDAiLCJyb3dzIiwiY29sdW1ucyIsImRvX3JldiIsImNvbHVtbl9hY2MiLCJ0cmltbWVkX3Jvd3MiLCJmb3VuZF9lbXB0eSIsImNvbHVtbiIsImRvX3JldiQwIiwiY29sdW1ucyQwIiwidHJpbW1lZCIsImNvbHVtbl9hY2MkMCIsImFyZzBfMDMxIiwicmVzMF8wMzIiLCJ0cmFuc3Bvc2VfZXhuIiwiaW50ZXJzcGVyc2UiLCJpc19zdWZmaXgiLCJzdWZmaXgiLCJsaXN0X2xlbiIsInN1ZmZpeF9sZW4iLCJyZXMwXzAwMiIsImFyZzBfMDAzIiwicmVzMF8wMDQiLCJyZXMwXzAwNiIsImFyZzBfMDA3IiwicmVzMF8wMDgiLCJhcmcyXzAxMSIsImFyZzFfMDEwIiwiYXJnMF8wMDkiLCJyZXMxXzAxMyIsInJlczJfMDE0IiwiYXJnMV8wMTYiLCJyZXMxXzAxOCIsImFyZzJfMDIxIiwiYXJnMV8wMjAiLCJhcmcwXzAxOSIsInJlczFfMDIzIiwicmVzMl8wMjQiLCJhcmcxXzAyNiIsImFyZzBfMDI1IiwicmVzMF8wMjciLCJyZXMxXzAyOCIsImFyZzFfMDMwIiwicmVzMF8wMzEiLCJyZXMxXzAzMiIsInRvX3N0cmluZ3NfaHVtIiwic3RyaW5nIiwic2V4cCQwIiwic2V4cCQxIiwidGFnIiwidGFnJDAiLCJzZXhwJDIiLCJ0YWckMSIsImJvZHkiLCJ0cnVuY19hZnRlciIsInRzJDAiLCJ0cyQxIiwiYWMkMSIsInRvX3NleHBzX2h1bSIsImhlcmUiLCJoZXJlJDAiLCJ0b19zZXhwX2h1bSIsInNleHBzIiwidG9fbWVzc2FnZSIsImluZm8iLCJvZl9tZXNzYWdlIiwidG9fc3RyaW5nX2h1bSIsIm1lc3NhZ2UiLCJ0b19zdHJpbmdfaHVtX2RlcHJlY2F0ZWQiLCJvZl9sYXp5Iiwib2ZfbGF6eV9zZXhwIiwib2ZfbGF6eV90IiwibGF6eV90IiwiY3JlYXRlZiIsIm9mX3RodW5rIiwic3RyaWN0Iiwic2V4cF9vZl94IiwidGFnX3NfbGF6eSIsInRhZ19zIiwidGFnX2FyZyIsInRvX2V4biIsIm9mX2V4biIsImJhY2t0cmFjZSQwIiwiYmFja3RyYWNlJDEiLCJiYWNrdHJhY2UkMiIsInJhaXNlIiwicmFpc2VfcyIsInRvX2luZm8iLCJvZl9pbmZvIiwiY2hlY2tfZmllbGQiLCJhXzAwNyIsImJfMDA4Iiwib2ZfYV8wMTMiLCJ4XzAxNSIsIm9mX2FfMDE2IiwieF8wMTciLCJpbnZhcmlhbnRfYSIsImUxIiwiZTIiLCJ0cnlfd2l0aF9qb2luIiwib2ZfZXhuX3Jlc3VsdCIsImVycm9yX3MiLCJlcnJvcl9zdHJpbmciLCJlcnJvcmYiLCJ1bmltcGxlbWVudGVkIiwiZmlsdGVyX29rX2F0X2xlYXN0X29uZSIsImZpbmRfb2siLCJmaW5kX21hcF9vayIsImVycm9yX3NvdXJjZV8wMDMiLCJzZXhwXzAwNCIsImdlcSIsImxlcSIsImJldHdlZW4iLCJsb3ciLCJoaWdoIiwiY2xhbXBfdW5jaGVja2VkIiwiY2xhbXBfZXhuIiwiY2xhbXAiLCJsZXhpY29ncmFwaGljIiwiY21wcyIsImNtcHMkMCIsImxpZnQiLCJyZXZlcnNlIiwiaXNfcG9zaXRpdmUiLCJpc19ub25fbmVnYXRpdmUiLCJpc19uZWdhdGl2ZSIsImlzX25vbl9wb3NpdGl2ZSIsInNpZ24iLCJoYXNoX3BhcmFtIiwicG9seSIsIm9mX2tleSIsIktleSIsInRvX2tleSIsImhhc2hfcGFyYW0kMCIsInBvbHkkMCIsIm9mX2tleSQwIiwidG9fa2V5JDAiLCJoYXNoYWJsZSIsImdldF9wb3NfbGVuIiwiZmluZF9maXJzdF9zYXRpc2Z5aW5nIiwicHJlZCIsInBvcyQwIiwiaGkkMCIsImxvJDEiLCJtaWQiLCJsbyQyIiwibG8kMCIsImZpbmRfbGFzdF9zYXRpc2Z5aW5nIiwiYmluYXJ5X3NlYXJjaCIsImhvdyIsImJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIiwic2VnbWVudF9vZiIsImlzX2xlZnQiLCJpc19yaWdodCIsImFsbCQwIiwic3JjX3BvcyIsImRzdF9wb3MiLCJibGl0byIsInNyY19sZW4iLCJzdWJvIiwiY3JlYXRlX2xpa2UiLCJ1bnNhZmVfYmxpdCQwIiwiaXNfbm9uZSIsImlzX3NvbWUiLCJ2YWx1ZV9tYXAiLCJvIiwiY2FsbCIsInZhbHVlX2V4biIsImVycm9yJDAiLCJtJDAiLCJtJDEiLCJ2YWx1ZV9vcl90aHVuayIsInNvbWUiLCJmaXJzdF9zb21lIiwic29tZV9pZiIsImNvbmQiLCJhX29mX3NleHAiLCJiX29mX3NleHAiLCJzZXhwX29mX2IiLCJjX29mX3NleHAiLCJzZXhwX29mX2MiLCJpc19maXJzdCIsImlzX3NlY29uZCIsImZpcnN0Iiwic2Vjb25kIiwiZXExIiwiZXEyIiwib3RoZXIiLCJlaXRoZXIiLCJvdGhlcl9sb29wIiwicmV0dXJuX2xvb3AiLCJjb21iaW5lX2FsbCIsIm90aGVyX2xvb3AkMCIsInJldHVybl9sb29wJDAiLCJjb21iaW5lX2FsbF91bml0IiwidG9fb3B0aW9uIiwiZWl0aGVyJDAiLCJjb21iaW5lJDAiLCJpdGVyaSQwIiwiaXRlcmkkMSIsImZvbGRpJDAiLCJmb2xkaSQxIiwiY291bnRpJDAiLCJleGlzdHNpJDAiLCJmb3JfYWxsaSQwIiwiZmluZF9tYXBpJDAiLCJmaW5kaSQwIiwiZXJyb3Jfc291cmNlXzAyNSIsIm9mX3NfMDAyIiwibmV4dF9zdGVwIiwiZGVsYXllZF9mb2xkX3N0ZXAiLCJuZXh0IiwidW5mb2xkX3N0ZXAiLCJ1bmZvbGQiLCJ1bmZvbGRfd2l0aCIsInNlZWQkMCIsInNlZWQkMSIsInVuZm9sZF93aXRoX2FuZF9maW5pc2giLCJydW5uaW5nX3N0ZXAiLCJpbm5lcl9maW5pc2hlZCIsImZpbmlzaGluZ19zdGVwIiwic3RhdGUkMCIsInN0YXRlJDEiLCJzdGF0ZSQyIiwiaW5uZXJfc3RhdGUiLCJzdGF0ZSQzIiwiaW5uZXJfc3RhdGUkMCIsImlubmVyX3N0YXRlJDEiLCJzdGF0ZSQ0Iiwic3RhdGUkNSIsInNlZWQkMiIsInYkMCIsInRvX2xpc3RfcmV2Iiwic3RhcnRfdiIsInN0b3BfdiIsInN0ZXAiLCJ0X2xhenkiLCJsJDIiLCJzb21lX2IiLCJlbXB0eSIsIm5leHQkMCIsInMkMyIsImFfMDExIiwiYl8wMTIiLCJhXzAxMyIsImJfMDE0IiwiYV8wMTUiLCJiXzAxNiIsImFfMDE5IiwiYV8wMTciLCJiXzAyMCIsImJfMDE4IiwiYTAkMSIsImhzdiQzIiwib2ZfYV8wMjEiLCJvZl9iXzAyMiIsInNleHBfMDI3IiwidGFnXzAyOCIsInNleHBfYXJnc18wMzQiLCJhcmcwXzAzNSIsInJlczBfMDM2Iiwic2V4cF9hcmdzXzAyOSIsImFyZzBfMDMwIiwic2V4cF9hcmdzXzAzOSIsImFyZzFfMDQxIiwiYXJnMF8wNDAiLCJyZXMwXzA0MiIsInJlczFfMDQzIiwib2ZfYV8wNDYiLCJvZl9iXzA0NyIsImFyZzBfMDQ4IiwicmVzMF8wNDkiLCJhcmcwXzA1MCIsInJlczBfMDUxIiwiYXJnMV8wNTMiLCJhcmcwXzA1MiIsInJlczBfMDU0IiwicmVzMV8wNTUiLCJtZXJnZV93aXRoX2R1cGxpY2F0ZXMiLCJuZXh0MiIsInMyIiwibmV4dDEiLCJzMSIsInMyJDAiLCJzMiQxIiwiczEkMCIsInMyJDIiLCJzMSQxIiwiczIkMyIsImNvbXBhcmlzb24iLCJtZXJnZV9kZWR1cGVkX2FuZF9zb3J0ZWQiLCJtZXJnZV9zb3J0ZWQiLCJ0bF9lYWdlcmx5X2V4biIsImxpZnRfaWRlbnRpdHkiLCJjaHVua3NfZXhuIiwiemlwX2Z1bGwiLCJib3VuZGVkX2xlbmd0aCIsImF0X21vc3QiLCJsZW5ndGhfaXNfYm91bmRlZF9ieSIsImN1ciIsImN1ciQwIiwibGFzdF9lbHQiLCJsYXN0X2VsdCQwIiwic2hpZnRfcmlnaHQiLCJzaGlmdF9yaWdodF93aXRoX2xpc3QiLCJzJDUiLCJhJDEiLCJzJDQiLCJyZXBlYXQiLCJjeWNsZV9saXN0X2V4biIsInNhIiwic2IiLCJzaW5nbGV0b24iLCJkZWxheWVkX2ZvbGQiLCJvcHRpb24iLCJmb2xkX20iLCJpdGVyX20iLCJmb3JjZV9lYWdlcmx5IiwibWVtb2l6ZSIsImRyb3BfZWFnZXJseSIsImRyb3Bfd2hpbGVfb3B0aW9uIiwidjIiLCJ2MSIsInJvdW5kX3JvYmluIiwiZG9uZV9zdGFjayIsInRvZG9fc3RhY2siLCJ0b2RvX3N0YWNrJDAiLCJpbnRlcmxlYXZlIiwiaW50ZXJsZWF2ZWRfY2FydGVzaWFuX3Byb2R1Y3QiLCJvZl9zZXEiLCJzZXEiLCJ0b19zZXEiLCJ5aWVsZCQwIiwib2Zfc2VxdWVuY2UiLCJzZXF1ZW5jZSIsInRodW5rIiwic2V0Iiwic3dhcCQwIiwidG1wIiwibGVmdCIsInJpZ2h0IiwiZmluYWxfcG9zIiwiaV9uZXh0IiwiaGVhcGlmeSIsInJvb3QiLCJyb290JDAiLCJyZWxhdGl2ZV9yb290IiwibGVmdF9jaGlsZCIsInJpZ2h0X2NoaWxkIiwibGFyZ2VzdCIsImxhcmdlc3QkMCIsInNvcnQkMCIsImZpdmVfZWxlbWVudF9zb3J0IiwibTEiLCJtMiIsIm0zIiwibTQiLCJtNSIsImNvbXBhcmVfYW5kX3N3YXAiLCJpbnRyb19zb3J0IiwibWF4X2RlcHRoIiwibWF4X2RlcHRoJDAiLCJsZWZ0JDAiLCJtYXhfZGVwdGgkMSIsInNpeHRoIiwibTJfdmFsIiwibTNfdmFsIiwibTRfdmFsIiwibWlkZGxlX3NvcnRlZCIsInBpdm90MiIsInBpdm90MSIsInAkMSIsInIkMiIsImxlZnQkMSIsInB2IiwicCQwIiwiciQwIiwiciQxIiwic29ydCQxIiwic29ydCQyIiwiZWx0X2lfbWludXNfMSIsIm1lcmdlZCIsImExX2luZGV4IiwiYTJfaW5kZXgiLCJ1c2VfYTEiLCJjb3B5X21hdHJpeCIsInJldl9pbnBsYWNlIiwib2ZfbGlzdF9yZXYiLCJvZl9saXN0X21hcCIsIm9mX2xpc3RfbWFwaSIsIm9mX2xpc3RfcmV2X21hcCIsIm9mX2xpc3RfcmV2X21hcGkiLCJtYXBfaW5wbGFjZSIsImZpbmRpX2ludGVybmFsIiwiaWZfZm91bmQiLCJpZl9ub3RfZm91bmQiLCJmb3VuZCIsInZhbHVlX2ZvdW5kIiwicmVzMSIsInJlczIiLCJzb3J0ZWRfY29weSIsInBhcnRpdGlvbmlfdGYiLCJ0cnVlcyIsImZhbHNlcyIsInRvX3NlcXVlbmNlX211dGFibGUiLCJ0b19zZXF1ZW5jZSIsImkxIiwiaTIiLCJ0dCIsIndpZHRoIiwiZGVwdGgiLCJkIiwidyIsInR0JDAiLCJnZXQkMCIsInplcm9fb2JqIiwiY3JlYXRlX3plcm8iLCJ1bnNhZmVfZ2V0IiwidW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5Iiwib2JqIiwic2V0X3dpdGhfY2FtbF9tb2RpZnkiLCJ1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW4iLCJvbGRfb2JqIiwidW5zYWZlX3NldCIsInVuc2FmZV9zZXRfb21pdF9waHlzX2VxdWFsX2NoZSIsInVuc2FmZV9zZXRfYXNzdW1pbmdfY3VycmVudGx5XyIsInVuc2FmZV9zZXRfaW50IiwidW5zYWZlX2NsZWFyX2lmX3BvaW50ZXIiLCJ1bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQiLCJjcmVhdGVfb2JqX2FycmF5Iiwib2ZfYXJyYXkiLCJncmFtbWFyIiwiY2VpbCIsImZsb29yIiwibW9kX2Zsb2F0IiwibW9kZiIsIm1heF9maW5pdGVfdmFsdWUiLCJjbGFzc2lmeV9mbG9hdCIsImFic19mbG9hdCIsImlzX2ludGVnZXIiLCJmcmV4cCIsImxkZXhwIiwiaXNfbmFuIiwidG9faW50NjRfcHJlc2VydmVfb3JkZXIiLCJ0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlcl9leG4iLCJvZl9pbnQ2NF9wcmVzZXJ2ZV9vcmRlciIsIm9uZV91bHAiLCJkaXIiLCJ1cHBlcl9ib3VuZF9mb3JfaW50IiwiZXhwIiwiaXNfeF9taW51c19vbmVfZXhhY3QiLCJsb3dlcl9ib3VuZF9mb3JfaW50IiwibWluX2ludF9hc19mbG9hdCIsImJveCIsImlzX2xvd2VyY2FzZSIsImlzX3VwcGVyY2FzZSIsImlzX3ByaW50IiwiaXNfd2hpdGVzcGFjZSIsImlzX2RpZ2l0IiwiaXNfYWxwaGEiLCJpc19hbHBoYW51bSIsImdldF9kaWdpdF91bnNhZmUiLCJnZXRfZGlnaXRfZXhuIiwiZ2V0X2RpZ2l0IiwiaXNfaGV4X2RpZ2l0IiwiaXNfaGV4X2RpZ2l0X2xvd2VyIiwiaXNfaGV4X2RpZ2l0X3VwcGVyIiwiZ2V0X2hleF9kaWdpdF9leG4iLCJnZXRfaGV4X2RpZ2l0IiwidF9vZl9zZXhwJDEiLCJjMSIsImMyIiwiaGFzaF9mb2xkX3QkMSIsImhhc2gkMSIsInRyX2NyZWF0ZV9tYXAiLCJ0YXJnZXQiLCJyZXBsYWNlbWVudCIsInRyX21hcCIsImkkMyIsImkkMiIsImluZGV4JDAiLCJsYXN0X3JlcGxhY2VtZW50IiwiaW5kZXgiLCJmaXJzdF90YXJnZXQiLCJzdGFnZSIsInVuc3RhZ2UiLCJjb250YWlucyIsInBvcyQxIiwiZW5kIiwiaW5kZXhfZnJvbV9leG5faW50ZXJuYWwiLCJpbmRleF9leG5faW50ZXJuYWwiLCJpbmRleF9leG4iLCJpbmRleF9mcm9tX2V4biIsInJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCIsInJpbmRleF9leG5faW50ZXJuYWwiLCJyaW5kZXhfZXhuIiwicmluZGV4X2Zyb21fZXhuIiwicmluZGV4IiwiaW5kZXhfZnJvbSIsInJpbmRleF9mcm9tIiwiY2FzZV9zZW5zaXRpdmUiLCJwYXR0ZXJuIiwia21wX2ludGVybmFsX2xvb3AiLCJtYXRjaGVkX2NoYXJzIiwibmV4dF90ZXh0X2NoYXIiLCJrbXBfYXJyYXkiLCJjaGFyX2VxdWFsIiwibWF0Y2hlZF9jaGFycyQwIiwiZ2V0X2NoYXJfZXF1YWwiLCJpbmRleF9pbnRlcm5hbCIsInRleHQiLCJtYXRjaGVzIiwiaW4kMCIsImluZGV4X2V4biQwIiwiaW5kZXhfYWxsIiwibWF5X292ZXJsYXAiLCJyZXBsYWNlX2ZpcnN0Iiwid2l0aCQwIiwibGVuX3MiLCJsZW5fdCIsImxlbl93aXRoIiwicmVwbGFjZV9hbGwiLCJudW1fbWF0Y2hlcyIsIm5leHRfZHN0X3BvcyIsIm5leHRfc3JjX3BvcyIsInNwbGl0X29uIiwicGF0dGVybl9sZW4iLCJhXzAwMiIsImJfMDAzIiwia21wX2FycmF5XzAxMSIsImNhc2Vfc2Vuc2l0aXZlXzAwOSIsInBhdHRlcm5fMDA3IiwiYXJnXzAxMiIsImJuZHNfMDA2IiwiYXJnXzAxMCIsImJuZHNfMDA2JDAiLCJhcmdfMDA4IiwiYm5kc18wMDYkMSIsInJlcHJlc2VudGF0aW9uIiwic3Vic3RyX2luZGV4X2dlbiIsInN1YnN0cl9pbmRleF9leG5fZ2VuIiwic3Vic3RyX2luZGV4X2FsbF9nZW4iLCJzdWJzdHJfcmVwbGFjZV9maXJzdF9nZW4iLCJzdWJzdHJfcmVwbGFjZV9hbGxfZ2VuIiwiaXNfc3Vic3RyaW5nX2dlbiIsInN1YnN0cmluZyIsInN1YnN0cl9pbmRleCIsInN1YnN0cl9pbmRleF9leG4iLCJzdWJzdHJfaW5kZXhfYWxsIiwic3Vic3RyX3JlcGxhY2VfZmlyc3QiLCJzdWJzdHJfcmVwbGFjZV9hbGwiLCJpc19zdWJzdHJpbmciLCJpc19zdWJzdHJpbmdfYXRfZ2VuIiwic3RyX3BvcyQxIiwic3RyX2xlbiIsInN1Yl9sZW4iLCJzdHJfcG9zIiwic3ViX3BvcyIsInN1Yl9wb3MkMCIsInN0cl9wb3MkMCIsImlzX3N1ZmZpeF9nZW4iLCJzdHJpbmdfbGVuIiwiaXNfcHJlZml4X2dlbiIsInByZWZpeF9sZW4iLCJzZXhwX29mX3QkMiIsInN0cmluZzEiLCJzdHJpbmcyIiwibGVuMiIsImxlbjEiLCJzdWJzdHJfaW5kZXgkMCIsInN1YnN0cl9pbmRleF9leG4kMCIsInN1YnN0cl9pbmRleF9hbGwkMCIsInN1YnN0cl9yZXBsYWNlX2ZpcnN0JDAiLCJzdWJzdHJfcmVwbGFjZV9hbGwkMCIsImlzX3N1YnN0cmluZyQwIiwiaXNfc3Vic3RyaW5nX2F0IiwibHNwbGl0Ml9leG4iLCJsaW5lIiwiZGVsaW0iLCJub3RfZm91bmQkNCIsInJzcGxpdDJfZXhuIiwibHNwbGl0MiIsIm9uIiwicnNwbGl0MiIsImNoYXJfbGlzdF9tZW0iLCJzcGxpdF9nZW4iLCJpc19kZWxpbSIsImxhc3RfcG9zIiwibGFzdF9wb3MkMSIsImxhc3RfcG9zJDAiLCJwb3MxIiwic3ViX3N0ciIsInNwbGl0Iiwic3BsaXRfb25fY2hhcnMiLCJjaGFycyIsImJhY2tfdXBfYXRfbmV3bGluZSIsImVvbCIsInNwbGl0X2xpbmVzIiwiaXNfc3VmZml4JDAiLCJpc19wcmVmaXgkMCIsImlzX3N1YnN0cmluZ19hdCQwIiwid3JhcF9zdWJfbiIsIm9uX2Vycm9yIiwiZHJvcF9wcmVmaXgiLCJkcm9wX3N1ZmZpeCIsImxmaW5kaSIsInJmaW5kaSIsImxhc3Rfbm9uX2Ryb3AiLCJyc3RyaXAiLCJmaXJzdF9ub25fZHJvcCIsImxzdHJpcCIsInN0cmlwIiwidHIiLCJ0cl9tdWx0aSIsImNvbmNhdF9hcnJheSIsImFyIiwib3V0Iiwib3V0X3BvcyIsIm91dCQwIiwiY2hvcF9wcmVmaXgiLCJjaG9wX3ByZWZpeF9pZl9leGlzdHMiLCJjaG9wX3ByZWZpeF9leG4iLCJjaG9wX3N1ZmZpeCIsImNob3Bfc3VmZml4X2lmX2V4aXN0cyIsImNob3Bfc3VmZml4X2V4biIsInNob3J0ZXIiLCJzaG9ydGVzdCIsInBvc19mcm9tX2xlZnQiLCJwb3NfZnJvbV9yaWdodCIsImNvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcCIsImdldF9wb3MiLCJtYXhfbGVuIiwibGVuX3NvX2ZhciIsImxlbl9zb19mYXIkMCIsImxlbl9zb19mYXIkMSIsImNvbW1vbl9nZW5lcmljMl9sZW5ndGgiLCJjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcCIsImZpcnN0JDAiLCJtYXhfbGVuJDAiLCJtYXhfbGVuJDEiLCJjb21tb25fZ2VuZXJpY19sZW5ndGgiLCJjb21tb25fZ2VuZXJpYzIiLCJjb21tb25fZ2VuZXJpYyIsImNvbW1vbl9wcmVmaXgiLCJjb21tb25fc3VmZml4IiwiY29tbW9uX3ByZWZpeDIiLCJjb21tb25fc3VmZml4MiIsImNvbW1vbl9wcmVmaXhfbGVuZ3RoIiwiY29tbW9uX3N1ZmZpeF9sZW5ndGgiLCJjb21tb25fcHJlZml4Ml9sZW5ndGgiLCJjb21tb25fc3VmZml4Ml9sZW5ndGgiLCJvZl9jaGFyIiwib2ZfY2hhcl9saXN0IiwiYnVpbGRfYW5kX3ZhbGlkYXRlX2VzY2FwZXdvcnRoIiwiZXNjYXBld29ydGh5X21hcCIsImVzY2FwZV9jaGFyIiwiZXNjYXBld29ydGh5X21hcCQwIiwidmFscyIsImNfdG8iLCJjX2Zyb20iLCJrJDAiLCJlc2NhcGVfZ2VuIiwiZXNjYXBld29ydGh5IiwidG9fZXNjYXBlX2xlbiIsInRvX2VzY2FwZSIsImxhc3RfaWR4IiwibGFzdF9kc3RfcG9zIiwibGFzdF9pZHgkMCIsImxhc3RfZHN0X3BvcyQwIiwidG9fZXNjYXBlJDAiLCJlc2NhcGVkX2NoYXIiLCJsYXN0X2lkeCQxIiwibGFzdF9kc3RfcG9zJDEiLCJlc2NhcGVfZ2VuX2V4biIsImVzY2FwZSIsInVuZXNjYXBlX2dlbiIsInN0YXR1cyIsInRvX3VuZXNjYXBlIiwidG9fdW5lc2NhcGUkMCIsInN0YXR1cyQwIiwidW5lc2NhcGVfZ2VuX2V4biIsInVuZXNjYXBlIiwicHJlY2VkaW5nX2VzY2FwZV9jaGFycyIsImNudCIsImNudCQwIiwidXBkYXRlX2VzY2FwZV9zdGF0dXMiLCJlc2NhcGVfc3RhdHVzIiwib2RkIiwiY2hlY2tfYm91bmQiLCJmdW5jdGlvbl9uYW1lIiwiaXNfY2hhcl9lc2NhcGluZyIsImlzX2NoYXJfZXNjYXBlZCIsImlzX2NoYXJfbGl0ZXJhbCIsImluZGV4X2Zyb20kMCIsInN0YXR1cyQxIiwiaW5kZXhfZnJvbV9leG4kMCIsImluZGV4JDEiLCJpbmRleF9leG4kMSIsInJpbmRleF9mcm9tJDAiLCJlc2NhcGVfY2hhcnMiLCJyaW5kZXhfZnJvbV9leG4kMCIsInJpbmRleCQwIiwicmluZGV4X2V4biQwIiwic3BsaXRfZ2VuJDAiLCJzcGxpdCQwIiwic3BsaXRfb25fY2hhcnMkMCIsInNwbGl0X2F0IiwibHNwbGl0MiQwIiwicnNwbGl0MiQwIiwibHNwbGl0Ml9leG4kMCIsInJzcGxpdDJfZXhuJDAiLCJsYXN0X25vbl9kcm9wX2xpdGVyYWwiLCJmaXJzdF9ub25fZHJvcF9saXRlcmFsIiwicnN0cmlwX2xpdGVyYWwiLCJsc3RyaXBfbGl0ZXJhbCIsInN0cmlwX2xpdGVyYWwiLCJiZXR3ZWVuJDAiLCJjbGFtcF9leG4kMCIsImNsYW1wJDAiLCJjcmVhdGUkMCIsImNyZWF0ZSQxIiwidW5zYWZlX2JsaXQkMSIsIm1hcGkkMCIsIm9jYW1sX2xleF90YWJsZXMiLCJwYXJzZV9oZXgiLCJsZXhidWYiLCJvY2FtbF9sZXhfc3RhdGUiLCJvY2FtbF9sZXhfc3RhdGUkMCIsImNvbnZlcnRfZmFpbHVyZSIsIm51bV9iaXRzX2ludCIsIm51bV9iaXRzX25hdGl2ZWludCIsIm51bV9iaXRzX2ludDMyIiwibnVtX2JpdHNfaW50NjQiLCJtaW5faW50MzIiLCJtYXhfaW50MzIiLCJtaW5faW50NjQiLCJtYXhfaW50NjQiLCJtaW5fbmF0aXZlaW50IiwibWF4X25hdGl2ZWludCIsImludDY0X3RvX3N0cmluZyIsIm5hdGl2ZWludF90b19zdHJpbmciLCJpbnQzMl90b19pbnRfdHJ1bmMiLCJpbnRfdG9faW50MzJfdHJ1bmMiLCJpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiIsImludF90b19pbnQzMiIsImludDMyX3RvX2ludCIsImludF90b19pbnQzMl9leG4iLCJpbnQzMl90b19pbnRfZXhuIiwiaW50X3RvX2ludDY0IiwiaW50NjRfdG9faW50X3RydW5jIiwiaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQiLCJpbnQ2NF90b19pbnQiLCJpbnQ2NF90b19pbnRfZXhuIiwiaW50X3RvX25hdGl2ZWludCIsIm5hdGl2ZWludF90b19pbnRfdHJ1bmMiLCJuYXRpdmVpbnRfdG9faW50IiwibmF0aXZlaW50X3RvX2ludF9leG4iLCJpbnQzMl90b19pbnQ2NCIsImludDY0X3RvX2ludDMyX3RydW5jIiwiaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzIiwiaW50NjRfdG9faW50MzIiLCJpbnQ2NF90b19pbnQzMl9leG4iLCJpbnQzMl90b19uYXRpdmVpbnQiLCJuYXRpdmVpbnRfdG9faW50MzJfdHJ1bmMiLCJuYXRpdmVpbnRfdG9faW50MzIiLCJuYXRpdmVpbnRfdG9faW50MzJfZXhuIiwiaW50NjRfdG9fbmF0aXZlaW50X3RydW5jIiwibmF0aXZlaW50X3RvX2ludDY0IiwiaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19uYXRpIiwiaW50NjRfdG9fbmF0aXZlaW50IiwiaW50NjRfdG9fbmF0aXZlaW50X2V4biIsImludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50NiIsImludDY0X2ZpdF9vbl9pbnQ2M19leG4iLCJpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5IiwiZGVsaW1pdGVyIiwiY2hhcnNfcGVyX2RlbGltaXRlciIsImlucHV0X2xlbmd0aCIsImhhc19zaWduIiwibnVtX2RpZ2l0cyIsIm51bV9kZWxpbWl0ZXJzIiwib3V0cHV0X2xlbmd0aCIsImlucHV0X3BvcyIsIm91dHB1dF9wb3MiLCJudW1fY2hhcnNfdW50aWxfZGVsaW1pdGVyIiwiZmlyc3RfZGlnaXRfcG9zIiwiaW5zZXJ0X2RlbGltaXRlciIsImluc2VydF91bmRlcnNjb3JlcyIsInNleHBfb2ZfaW50X3N0eWxlIiwiZGVsaW1pdGVyJDAiLCJtYWtlX3N1ZmZpeCIsInRvX3N0cmluZyQwIiwiaW52YWxpZCIsIm9mX3N0cmluZ193aXRoX2RlbGltaXRlciIsImxleCIsImJvZHkkMCIsIm92ZXJmbG93X2JvdW5kX21heF9pbnQ2M19vbl9pbiIsIm92ZXJmbG93X2JvdW5kX21heF9pbnQ2NF92YWx1ZSIsImludDMyX3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyIsIm92ZXJmbG93X2JvdW5kX21heF9pbnRfdmFsdWUiLCJvdmVyZmxvd19ib3VuZF9tYXhfaW50MzJfdmFsdWUiLCJpbnRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIiwiaW50NjNfb25faW50NjRfcG9zaXRpdmVfb3ZlcmZsIiwiaW50NjRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIiwiaW50NjRfbmVnYXRpdmVfb3ZlcmZsb3dfYm91bmRzIiwibmVnYXRpdmVfZXhwb25lbnQiLCJvdmVyZmxvdyIsImludF9wb3ciLCJiYXNlIiwiZXhwb25lbnQiLCJpbnQ2NF9wb3ciLCJpbnQ2M19wb3dfb25faW50NjQiLCJydmFsIiwib25lIiwicm91bmRfZG93biIsIm1vZHVsdXMiLCJyb3VuZF91cCIsInJlbWFpbmRlciIsInJvdW5kX3Rvd2FyZHNfemVybyIsInRvX211bHRpcGxlX29mIiwicm91bmRfbmVhcmVzdCIsIm1vZHVsdXNfbWludXNfcmVtYWluZGVyIiwicm91bmQiLCJoMDEiLCJtYXNrIiwiaW50NjRfcG9wY291bnQiLCJ4JDIiLCJpbnQzMl9wb3Bjb3VudCIsIm5hdGl2ZWludF9wb3Bjb3VudCIsIm1vZHVsZV9uYW1lJDAiLCJvZl9zdHJpbmckMCIsImZsb2F0X2xvd2VyX2JvdW5kIiwiZmxvYXRfdXBwZXJfYm91bmQiLCJvZl9mbG9hdF91bmNoZWNrZWQiLCJmdW5jJDAiLCJ6ZXJvIiwibWludXNfb25lIiwibmVnIiwib2Zfc3RyaW5nJDEiLCJvZl9pbnQzMiIsIm9mX2ludDMyX2V4biIsInRvX2ludDMyIiwidG9faW50MzJfZXhuIiwib2ZfaW50NjQiLCJvZl9pbnQ2NF9leG4iLCJ0b19pbnQ2NCIsIm9mX25hdGl2ZWludCIsIm9mX25hdGl2ZWludF9leG4iLCJ0b19uYXRpdmVpbnQiLCJtYXhfdmFsdWVfMzBfYml0cyIsImFicyIsInJlbSIsInNoaWZ0X3JpZ2h0X2xvZ2ljYWwiLCJzaGlmdF9sZWZ0IiwiYml0X25vdCIsImJpdF9vciIsImJpdF9hbmQiLCJiaXRfeG9yIiwicG93Iiwibm9uX3Bvc2l0aXZlX2FyZ3VtZW50IiwiY2VpbF9wb3cyIiwieCQzIiwieCQ0IiwieCQ1IiwieCQ2IiwiZmxvb3JfcG93MiIsImlzX3BvdzIiLCJmbG9vcl9sb2cyIiwiY2VpbF9sb2cyIiwicG9wY291bnQiLCJsbm90Iiwic3VjY19leG4iLCJtc2ciLCJwcmVkX2V4biIsIm9mX3NjYWxhciIsIm9mX3NjYWxhcl9leG4iLCJ0b19zY2FsYXIiLCJ0b19jaGFyIiwidG9fY2hhcl9leG4iLCJ1dGY4X2J5dGVfbGVuZ3RoIiwidWNoYXIiLCJjb2RlcG9pbnQiLCJzb21lX3QiLCJyZWZsIiwic3ltIiwidHJhbnMiLCJjb252IiwiZGV0dXBsZTIiLCJ0dXBsZTIiLCJ3aXRuZXNzIiwidl8wMDUiLCJ0b19zZXhwIiwidWlkIiwic2FtZV93aXRuZXNzIiwic2FtZSIsInNhbWVfd2l0bmVzc19leG4iLCJub25lX3N1YnN0aXR1dGUiLCJub25lIiwidmFsdWVfdW5zYWZlIiwib2Zfc2V4cGFibGUiLCJ0b19zZXhwYWJsZSIsInhfMDAzIiwib2ZfYV8wMDQiLCJ4XzAwNSIsImluaXRfc29tZSIsImdldF9zb21lX2V4biIsImlzX25vbmUkMCIsImlzX3NvbWUkMCIsInNldF9zb21lIiwic2V0X25vbmUiLCJ1bnNhZmVfZ2V0X3NvbWVfZXhuIiwidW5zYWZlX2dldF9zb21lX2Fzc3VtaW5nX3NvbWUiLCJ1bnNhZmVfaXNfc29tZSIsInVuc2FmZV9zZXRfc29tZSIsInVuc2FmZV9zZXRfbm9uZSIsImNsZWFyIiwiZWxlbSIsIm1hcF9zb21lIiwib2ZfYXJyYXlfc29tZSIsImNhcGFjaXR5IiwiZWx0cyIsImxlbmd0aF8wMDMiLCJlbHRzXzAwNSIsImFyZ18wMDYiLCJibmRzXzAwMiIsImFyZ18wMDQiLCJibmRzXzAwMiQwIiwicmVzaXplIiwic2l6ZSIsInNldF9jYXBhY2l0eSIsIm5ld19jYXBhY2l0eSIsIm5ld19jYXBhY2l0eSQwIiwicHVzaCIsInBvcF9ub25lbXB0eSIsInBvcF9lcnJvciIsInBvcCIsInBvcF9leG4iLCJ0b3Bfbm9uZW1wdHkiLCJ0b3BfZXJyb3IiLCJ0b3AiLCJ0b3BfZXhuIiwidW50aWxfZW1wdHkiLCJoYXNoX292ZXJyaWRlIiwib2ZfcG9zIiwib2Zfc2lnbiIsInRvX3NpZ25fZXhuIiwidG9faW50X2V4biIsImVycm9yX3NvdXJjZV8wMDYiLCJlcnJvcl9zb3VyY2VfMDI3IiwiaW50ZXJ2YWxfY29tcGFyaXNvbl9zZXhwX2dyYW1tIiwiYWxsX29mX2EiLCJlbnVtZXJhdGVfMDAyIiwiZW51bWVyYXRlXzAwMSIsImFjYyQyIiwib2ZfYV8wMDMiLCJzZXhwXzAwOCIsInRhZ18wMDkiLCJzZXhwX2FyZ3NfMDEwIiwiYXJnMF8wMjAiLCJyZXMwXzAyMSIsImFyZzBfMDIyIiwicmVzMF8wMjMiLCJpbnRlcnZhbF9jb21wYXJpc29uX29mX3NleHAiLCJzZXhwXzAyOCIsInNleHBfb2ZfaW50ZXJ2YWxfY29tcGFyaXNvbiIsImNvbXBhcmVfaW50ZXJ2YWxfY29tcGFyaXNvbiIsImhhc2hfZm9sZF9pbnRlcnZhbF9jb21wYXJpc29uIiwiaGFzaF9pbnRlcnZhbF9jb21wYXJpc29uIiwiaW5jbCIsImV4Y2wiLCJpc19sb3dlcl9ib3VuZCIsImlzX3VwcGVyX2JvdW5kIiwiYm91bmRzX2Nyb3NzZWQiLCJsb3dlciIsInVwcGVyIiwibG93ZXIkMCIsInVwcGVyJDAiLCJjb21wYXJlX3RvX2ludGVydmFsX2V4biIsImludGVydmFsX2NvbnRhaW5zX2V4biIsImVycm9yX3NvdXJjZV8wNTciLCJyaWdodF8wMDQiLCJsZWZ0XzAwMyIsInJpZ2h0XzAwOCIsImxlZnRfMDA3Iiwib2ZfYV8wMDkiLCJ2XzAxMCIsImNtcF9rIiwiY21wX3YiLCJ0XzAxNCIsInRfMDEzIiwidF8wMTYiLCJ0XzAxNSIsInJpZ2h0XzAxOCIsImxlZnRfMDE3IiwicmlnaHRfMDIyIiwibGVmdF8wMjEiLCJ0XzAyNCIsInRfMDIzIiwidF8wMjYiLCJ0XzAyNSIsInJpZ2h0XzAyMCIsImxlZnRfMDE5IiwidF8wMzAiLCJ0XzAyOSIsInRfMDMyIiwidF8wMzEiLCJyaWdodF8wMzQiLCJsZWZ0XzAzMyIsInJpZ2h0XzAzOCIsImxlZnRfMDM3IiwidF8wNDAiLCJ0XzAzOSIsInRfMDQyIiwidF8wNDEiLCJyaWdodF8wMzYiLCJsZWZ0XzAzNSIsIm9mX2tfMDQzIiwib2Zfdl8wNDQiLCJzZXhwXzA3MSIsImFyZzFfMDY4IiwiYXJnMF8wNjciLCJyZXMwXzA2OSIsImF0b21fMDQ3Iiwic2V4cF9hcmdzXzA1MCIsImF0b21fMDQ3JDAiLCJhcmcwXzA1OCIsInJlczBfMDU5IiwiYXJnMF8wNjEiLCJyZXMwXzA2MiIsImFyZzBfMDY0IiwicmVzMF8wNjUiLCJyZXMxXzA3MCIsIm9mX2tfMDcyIiwib2Zfdl8wNzMiLCJhcmcxXzA4MiIsImFyZzBfMDgxIiwicmVzMF8wODMiLCJ2XzA3NCIsInJlczFfMDg0Iiwidl8wNzYiLCJhcmcxXzA3OCIsImFyZzBfMDc3IiwicmVzMF8wNzkiLCJyZXMxXzA4MCIsInZfMDc1Iiwia19zZXhwX2dyYW1tYXIiLCJ2X3NleHBfZ3JhbW1hciIsImNtcF9sZWZ0IiwiY21wX3JpZ2h0IiwiYV8wODUiLCJiXzA4NiIsInJpZ2h0XzA5MiIsImxlZnRfMDkxIiwidF8wOTQiLCJ0XzA5MyIsInRfMDk2IiwidF8wOTUiLCJyaWdodF8wODgiLCJsZWZ0XzA4NyIsInJpZ2h0XzA5MCIsImxlZnRfMDg5IiwiYV8wOTciLCJiXzA5OCIsInJpZ2h0XzEwNCIsImxlZnRfMTAzIiwidF8xMDYiLCJ0XzEwNSIsInRfMTA4IiwidF8xMDciLCJyaWdodF8xMDAiLCJsZWZ0XzA5OSIsInJpZ2h0XzEwMiIsImxlZnRfMTAxIiwib2ZfbGVmdF8xMDkiLCJvZl9yaWdodF8xMTAiLCJ2XzExMyIsImFyZzFfMTE1IiwiYXJnMF8xMTQiLCJyZXMwXzExNiIsInJlczFfMTE3Iiwidl8xMTEiLCJ2XzExMiIsInNleHBfb2ZfdCQzIiwiaGVpZ2h0IiwiaW5fcmFuZ2UiLCJobCIsImhyIiwibG93ZXIkMSIsImludmFyaWFudHMiLCJoJDEiLCJoJDAiLCJzbCIsInNyIiwib2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrIiwia2wiLCJrJDEiLCJrbCQwIiwiayQyIiwia3IiLCJsZWZ0X2xlbmd0aCIsInJpZ2h0X2xlbmd0aCIsIm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQiLCJhcnJheV9sZW5ndGgiLCJvZl9zb3J0ZWRfYXJyYXkiLCJpbmNyZWFzaW5nIiwiYmFsIiwibHIiLCJsdiIsImxsIiwibHJyIiwibHJ2JDAiLCJscmwiLCJscnYiLCJyciIsInJ2IiwicmwiLCJybHIiLCJybHYkMCIsInJsbCIsInJsdiIsImF1eCIsImxoIiwibHYkMCIsInJoIiwicnYkMCIsIm1pbl9lbHRfZXhuIiwiZm9sZF91bnRpbF9oZWxwZXIiLCJ2YWx1ZSQwIiwibWF4X2VsdF9leG4iLCJyZW1vdmVfbWluX2VsdCIsIm1heWJlX2VsdCIsIm1heWJlX2VsdCQwIiwiZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvIiwicmVtb3ZlX2luZGV4IiwibF9zaXplIiwidW5pb24iLCJ2MSQwIiwidjIkMCIsInIyJDAiLCJyMSQwIiwidW5pb25fbGlzdCIsInRvX3RyZWUiLCJpbnRlciIsIm90aGVyX3NldCIsImUkMSIsImNvbnNfcmlnaHQiLCJvZl9zZXQiLCJlbnVtJDAiLCJ0cmVlIiwic3ltbWV0cmljX2RpZmYiLCJlbHQkMCIsImVudW0xIiwidHJlZTEiLCJlbnVtMiIsInRyZWUyIiwiY29tcGFyZV9yZXN1bHQiLCJuZXh0X3N0YXRlIiwiZ3JlYXRlcl9vcl9lcXVhbF90byIsImxlc3Nfb3JfZXF1YWxfdG8iLCJpbmNsdXNpdmVfYm91bmQiLCJzaWRlIiwibWF5YmUiLCJ2JDEiLCJ2JDIiLCJ2JDMiLCJ2JDQiLCJlJDIiLCJpbml0JDAiLCJtZXJnZV90b19zZXF1ZW5jZSIsImUyJDIiLCJlMSQyIiwiZTIkMCIsImUxJDAiLCJlMiQxIiwiZTEkMSIsInQyJDIiLCJ0MSQyIiwiaXNfc3Vic2V0IiwiYXJlX2Rpc2pvaW50IiwiYWNjdSQwIiwiYWNjdSQxIiwiZmlsdCIsInBhcnQiLCJlbGVtZW50c19hdXgiLCJlbGVtZW50cyIsImNob29zZSIsImNob29zZV9leG4iLCJwb3NfcmVmIiwiZ3JvdXBfYnkiLCJlcXVpdiIsInNldCQwIiwiZXF1aXZfY2xhc3NlcyIsIm5vdF9lcXVpdl94IiwiZXF1aXZfeCIsImVxdWl2X2NsYXNzZXMkMCIsInN0YWJsZV9kZWR1cF9saXN0IiwibGVmdG92ZXJzIiwiYWxyZWFkeV9zZWVuIiwiYWxyZWFkeV9zZWVuJDAiLCJsZWZ0b3ZlcnMkMCIsInRfb2Zfc2V4cF9kaXJlY3QiLCJlbHRfbHN0IiwiZWxfc2V4cCIsImlzX3N1YnNldCQwIiwic3Vic2V0Iiwic3VwZXJzZXQiLCJzZXhwX29mX2VsdCIsImludmFsaWRfZWxlbWVudHMiLCJpbnZhbGlkX2VsZW1lbnRzX3NleHAiLCJsaWtlIiwiaW52YXJpYW50cyQwIiwiZWxlbWVudHMkMCIsIm1pbl9lbHRfZXhuJDAiLCJtYXhfZWx0X2V4biQwIiwiY2hvb3NlJDAiLCJjaG9vc2VfZXhuJDAiLCJmb2xkX3JpZ2h0JDAiLCJpdGVyMiQwIiwiZmlsdGVyJDAiLCJhZGQkMCIsInJlbW92ZSQwIiwidW5pb24kMCIsImludGVyJDAiLCJkaWZmJDAiLCJzeW1tZXRyaWNfZGlmZiQwIiwiY29tcGFyZV9kaXJlY3QiLCJpc19zdWJzZXQkMSIsIm9mIiwiYXJlX2Rpc2pvaW50JDAiLCJ0b19uYW1lZF90cmVlIiwiaXNfc3Vic2V0JDIiLCJwYXJ0aXRpb25fdGYkMCIsInRyZWVfZiIsInRyZWVfdCIsImdyb3VwX2J5JDAiLCJudGgkMCIsInJlbW92ZV9pbmRleCQwIiwidG9fc2VxdWVuY2UkMCIsImJpbmFyeV9zZWFyY2gkMCIsImJpbmFyeV9zZWFyY2hfc2VnbWVudGVkJDAiLCJtZXJnZV90b19zZXF1ZW5jZSQwIiwiaGFzaF9mb2xkX2RpcmVjdCIsInRfb2Zfc2V4cF9kaXJlY3QkMCIsImludmFyaWFudHMkMSIsImlzX2VtcHR5JDEiLCJlbGVtZW50cyQxIiwibWluX2VsdCQxIiwibWluX2VsdF9leG4kMSIsIm1heF9lbHQkMSIsIm1heF9lbHRfZXhuJDEiLCJjaG9vc2UkMSIsImNob29zZV9leG4kMSIsInRvX2xpc3QkMSIsInRvX2FycmF5JDEiLCJpdGVyJDIiLCJleGlzdHMkMSIsImZvcl9hbGwkMSIsImNvdW50JDEiLCJzdW0kMSIsImZpbmQkMSIsImZpbmRfZXhuJDEiLCJmaW5kX21hcCQxIiwiZm9sZCQxIiwiZm9sZF91bnRpbCQxIiwiZm9sZF9yaWdodCQxIiwiZmlsdGVyJDEiLCJmaWx0ZXJfbWFwJDAiLCJwYXJ0aXRpb25fdGYkMSIsIml0ZXIyJDEiLCJtZW0kMSIsImFkZCQxIiwicmVtb3ZlJDEiLCJ1bmlvbiQxIiwiaW50ZXIkMSIsImRpZmYkMSIsInN5bW1ldHJpY19kaWZmJDEiLCJjb21wYXJlX2RpcmVjdCQwIiwiaXNfc3Vic2V0JDMiLCJhcmVfZGlzam9pbnQkMSIsIm9mX2xpc3QkMCIsIm9mX3NlcXVlbmNlJDAiLCJvZl9hcnJheSQwIiwib2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCQwIiwib2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrJDAiLCJvZl9zb3J0ZWRfYXJyYXkkMCIsInVuaW9uX2xpc3QkMCIsInN0YWJsZV9kZWR1cF9saXN0JDAiLCJncm91cF9ieSQxIiwic3BsaXQkMSIsIm50aCQxIiwicmVtb3ZlX2luZGV4JDEiLCJvZl90cmVlIiwidG9fc2VxdWVuY2UkMSIsImJpbmFyeV9zZWFyY2gkMSIsImJpbmFyeV9zZWFyY2hfc2VnbWVudGVkJDEiLCJtZXJnZV90b19zZXF1ZW5jZSQxIiwiaXNfc3Vic2V0JDQiLCJ0b190cmVlJDAiLCJvZl90cmVlJDAiLCJ0X29mX3NleHBfZGlyZWN0JDEiLCJlbXB0eSQwIiwic2luZ2xldG9uJDAiLCJ1bmlvbl9saXN0JDEiLCJvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkJDEiLCJvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2skMSIsIm9mX3NvcnRlZF9hcnJheSQxIiwib2ZfbGlzdCQxIiwib2Zfc2VxdWVuY2UkMSIsIm9mX2FycmF5JDEiLCJzdGFibGVfZGVkdXBfbGlzdCQxIiwiZmlsdGVyX21hcCQxIiwiY29tcGFyYXRvcl9zIiwiZW1wdHkkMSIsInNpbmdsZXRvbiQxIiwidW5pb25fbGlzdCQyIiwib2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCQyIiwib2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrJDIiLCJvZl9zb3J0ZWRfYXJyYXkkMiIsIm9mX2xpc3QkMiIsIm9mX3NlcXVlbmNlJDIiLCJvZl9hcnJheSQyIiwic3RhYmxlX2RlZHVwX2xpc3QkMiIsImZpbHRlcl9tYXAkMiIsInNleHBfb2ZfbV90IiwiRWx0IiwibV90X29mX3NleHAiLCJtX3Rfc2V4cF9ncmFtbWFyIiwiY29tcGFyZV9tX3QiLCJlcXVhbF9tX3QiLCJoYXNoX2ZvbGRfbV90IiwiaGFzaF9tX3QiLCJjb21wYXJhdG9yJDAiLCJlbXB0eSQyIiwic2luZ2xldG9uJDIiLCJ1bmlvbl9saXN0JDMiLCJvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkJDMiLCJvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2skMyIsIm9mX3NvcnRlZF9hcnJheSQzIiwib2ZfbGlzdCQzIiwib2Zfc2VxdWVuY2UkMyIsIm9mX2FycmF5JDMiLCJzdGFibGVfZGVkdXBfbGlzdCQzIiwibWFwJDMiLCJmaWx0ZXJfbWFwJDMiLCJvZl90cmVlJDEiLCJ0b190cmVlJDEiLCJyZXBsYWNlIiwic2V0X3RlbXBvcmFyaWx5IiwicmVzdG9yZV90byIsInNldHMiLCJzbmFwc2hvdCIsInNldHNfdGVtcG9yYXJpbHkiLCJhbmRfdmFsdWVzIiwiaW5jX251bV9tdXRhdGlvbnMiLCJlbHRzX2luZGV4IiwiY2hlY2tfaW5kZXhfZXhuIiwiZW5zdXJlX25vX211dGF0aW9uIiwibnVtX211dGF0aW9ucyIsIm51bV9tdXRhdGlvbnNfMDAzIiwiZnJvbnRfMDA1IiwibWFza18wMDciLCJsZW5ndGhfMDA5IiwiZWx0c18wMTEiLCJibmRzXzAwMiQxIiwiYm5kc18wMDIkMiIsImJuZHNfMDAyJDMiLCJtdXQyIiwibXV0MSIsImZyb250IiwiY2FwYWNpdHkkMCIsImNhcGFjaXR5JDEiLCJibGl0X3RvX2FycmF5IiwiZnJvbnRfbGVuIiwicmVzdF9sZW4iLCJkZXNpcmVkX2NhcGFjaXR5IiwiZW5xdWV1ZSIsImRlcXVldWVfbm9uZW1wdHkiLCJkZXF1ZXVlX2V4biIsImRlcXVldWUiLCJmcm9udF9ub25lbXB0eSIsImxhc3Rfbm9uZW1wdHkiLCJwZWVrIiwicGVla19leG4iLCJibGl0X3RyYW5zZmVyIiwibGVuJDEiLCJkc3Rfc3RhcnQiLCJzcmNfaSIsImRzdF9pIiwiZW5xdWV1ZV9hbGwiLCJ0X3Jlc3VsdCIsImZpbHRlcl9pbnBsYWNlIiwiZmlsdGVyaV9pbnBsYWNlIiwidW5yZWFjaGFibGVfY29kZSIsInplcm8kMCIsInplcm8kMSIsInRvX2ludF90cnVuYyIsInRvX2ludDMyX3RydW5jIiwib2ZfaW50NjRfdHJ1bmMiLCJuYW1lJDAiLCJvZl9jb250aW51ZV9vcl9zdG9wIiwidG9fY29udGludWVfb3Jfc3RvcCIsImxlZnRfdmFsdWUiLCJyaWdodF92YWx1ZSIsInZhbHVlcyIsImxlZnRfZGVmYXVsdCIsInJpZ2h0X2RlZmF1bHQiLCJyaWdodCQwIiwiY29tcGFyZV9rZXkiLCJ2bCIsInZsJDAiLCJ2ciIsImswIiwiazEiLCJsZCIsImxyZCIsImxyZCQwIiwicmQiLCJybGQiLCJybGQkMCIsInJhaXNlX2tleV9hbHJlYWR5X3ByZXNlbnQiLCJzZXhwX29mX2tleSIsImZpbmRfYW5kX2FkZF9vcl9zZXQiLCJkYXRhIiwiYWRkX29yX3NldCIsImQkMCIsImFkZF9leG4iLCJhZGRfZXhuX2ludGVybmFsIiwic2luZ2xldG9uX3RvX3RyZWVfZXhuIiwiY29sbGFwc2UiLCJnbyIsImFkZF91bmNoZWNrZWQiLCJnbyQwIiwidG9fdHJlZV91bmNoZWNrZWQiLCJtYXhfa2V5Iiwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSIsImJ1aWxkZXIiLCJwcmV2X2tleSIsImpvaW4kMCIsImxkJDAiLCJsayQwIiwicmsiLCJyZCQwIiwicmskMCIsImxrIiwiY21wJDAiLCJtYXliZSQwIiwic3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IiwiaW50byIsImJvdW5kYXJ5X29wdCIsImluc2VydF9pbnRvIiwic3BsaXRfcmFuZ2UiLCJtaWRfYW5kX3JpZ2h0IiwibGIkMSIsImxiJDIiLCJtaWRfYW5kX3JpZ2h0JDAiLCJsYiIsImxiJDAiLCJtaWQkMCIsImFkZF9tdWx0aSIsImRhdGEkMCIsImZpbmRfbXVsdGkiLCJsb3dlcl9wYXJ0IiwidXBwZXJfcGFydCIsIm1pbl91cHBlciIsIm1heF9sb3dlciIsInVwcGVyX3BhcnRfd2l0aG91dF9taW4iLCJnbyQxIiwiY19taW4iLCJpbml0JDEiLCJjX21heCIsImluaXQkMiIsImZvbGRfcmFuZ2VfaW5jbHVzaXZlIiwicmFuZ2VfdG9fYWxpc3QiLCJjb25jYXRfdW5jaGVja2VkIiwicmVtb3ZlX2xvb3AiLCJjaGFuZ2UiLCJjaGFuZ2VfY29yZSIsImQkMSIsImxlbmd0aCQyIiwibGVuZ3RoJDMiLCJ1cGRhdGUiLCJ1cGRhdGVfY29yZSIsInJlbW92ZV9tdWx0aSIsIm5vbl9lbXB0eV90YWlsIiwiaXRlcl9rZXlzIiwiaXRlcmlfdW50aWxfbG9vcCIsIml0ZXJpX3VudGlsIiwiZm9sZF91bnRpbF9sb29wIiwiZmluYWwkMSIsImZpbmFsJDAiLCJmaWx0ZXJfa2V5cyIsInBhcnRpdGlvbl9tYXBpIiwicGFpcjIiLCJwYWlyMSIsImN1cnIiLCJrMiIsIm5leHQkMSIsImRhdGFfZXF1YWwiLCJrZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8iLCJrZXlzX2xlc3Nfb3JfZXF1YWxfdG8iLCJkJDIiLCJjb21wYXJlX2RhdGEiLCJkMiIsImQxIiwiZm9sZDIkMCIsImZvbGRfc3ltbWV0cmljX2RpZmYiLCJkZWx0YSIsImFjYyQzIiwiYWNjJDQiLCJhY2MkNSIsImFjYyQ2IiwiYWNjJDciLCJyaWdodCQyIiwibGVmdCQyIiwicmlnaHQkMSIsImtleXMiLCJvZl9mb2xkYWJsZV9mb2xkIiwiZm9sZGFibGUiLCJwcmV2X2RhdGEiLCJvZl9mb2xkYWJsZV9yZWR1Y2UiLCJuZXdfZGF0YSIsIm9mX2ZvbGRhYmxlIiwib2ZfZm9sZGFibGVfb3JfZXJyb3IiLCJvZl9mb2xkYWJsZV9leG4iLCJvZl9hbGlzdF9mb2xkIiwib2ZfYWxpc3RfcmVkdWNlIiwib2ZfYWxpc3QiLCJvZl9hbGlzdF9vcl9lcnJvciIsIm9mX2FsaXN0X2V4biIsIm9mX2ZvbGRhYmxlX211bHRpIiwib2ZfYWxpc3RfbXVsdGkiLCJmb2xkJDIiLCJvZl9zZXF1ZW5jZV9mb2xkIiwib2Zfc2VxdWVuY2VfcmVkdWNlIiwib2Zfc2VxdWVuY2Vfb3JfZXJyb3IiLCJvZl9zZXF1ZW5jZV9leG4iLCJvZl9zZXF1ZW5jZV9tdWx0aSIsInRvX2FsaXN0Iiwia2V5X29yZGVyIiwibWVyZ2VfbGFyZ2VfZmlyc3QiLCJsZW5ndGhfbGFyZ2UiLCJ0X2xhcmdlIiwidF9zbWFsbCIsIm1lcmdlX3NrZXdlZCIsImxlbmd0aDEiLCJsZW5ndGgyIiwicmVwYWNrYWdlIiwibWFya2VyIiwiY2xvc2VzdF9rZXkiLCJmb3VuZF9tYXJrZXIiLCJmb3VuZF9rZXkiLCJmb3VuZF92YWx1ZSIsImZvdW5kX3ZhbHVlJDAiLCJmb3VuZF9rZXkkMCIsInJhbmsiLCJudW1fdG9fc2VhcmNoIiwicGFpciIsInBhaXIkMCIsImJpbmFyeV9zZWFyY2hfb25lX3NpZGVkX2JvdW5kIiwibWF5YmVfYm91bmQiLCJpZl9leGNsdXNpdmUiLCJpZl9pbmNsdXNpdmUiLCJmaW5kX2JvdW5kIiwiYm91bmQkMCIsImJpbmFyeV9zZWFyY2hfdHdvX3NpZGVkX2JvdW5kcyIsImxvd2VyX2JvdW5kJDAiLCJ1cHBlcl9ib3VuZCQwIiwib2ZfaXRlcmkiLCJvZl9pdGVyaV9leG4iLCJrZXlfb2Zfc2V4cCIsInZhbHVlX29mX3NleHAiLCJhbGlzdF9zZXhwcyIsImZvdW5kX2ZpcnN0X2siLCJrMl9zZXhwIiwic2V4cF9vZl92YWx1ZSIsImVycm9yX3RyZWUiLCJva3MiLCJtYXBfa2V5cyIsIm1hcF9rZXlzX2V4biIsImxpa2UyIiwibGlrZV9tYXliZV9ub19vcCIsIm9sZF90Iiwib2xkX3RyZWUiLCJ3aXRoX3NhbWVfbGVuZ3RoIiwic2V0JDEiLCJhZGRfZXhuJDAiLCJhZGRfbXVsdGkkMCIsInJlbW92ZV9tdWx0aSQwIiwiZmluZF9tdWx0aSQwIiwiY2hhbmdlJDAiLCJ1cGRhdGUkMCIsIml0ZXJfa2V5cyQwIiwiaXRlcmlfdW50aWwkMCIsImZvbGQkMyIsImZvbGQyJDEiLCJmaWx0ZXJfa2V5cyQwIiwiZmlsdGVyaSQwIiwiZmlsdGVyX21hcGkkMCIsInBhcnRpdGlvbl9tYXBpJDAiLCJwYXJ0aXRpb25fbWFwJDAiLCJwYXJ0aXRpb25pX3RmJDAiLCJjb21iaW5lX2Vycm9ycyQwIiwia2V5cyQwIiwidG9fYWxpc3QkMCIsImZvbGRfc3ltbWV0cmljX2RpZmYkMCIsIm1lcmdlJDAiLCJtZXJnZV9za2V3ZWQkMCIsImJvdGhfbGVuIiwic3VicmFuZ2UiLCJoX2wiLCJoX3IiLCJvdXRlcl9qb2luZWRfaGVpZ2h0IiwibWlkX2xlbmd0aCIsImFwcGVuZCQwIiwiZm9sZF9yYW5nZV9pbmNsdXNpdmUkMCIsInJhbmdlX3RvX2FsaXN0JDAiLCJjbG9zZXN0X2tleSQwIiwicmFuayQwIiwic2V4cF9vZl9rIiwic2V4cF9vZl92IiwiaGFzaF9mb2xkX2tleSIsImhhc2hfZm9sZF9kYXRhIiwiYmluYXJ5X3NlYXJjaF9zdWJyYW5nZSIsIm9mX2FsaXN0JDAiLCJvZl9hbGlzdF9vcl9lcnJvciQwIiwib2ZfYWxpc3RfZXhuJDAiLCJvZl9hbGlzdF9tdWx0aSQwIiwib2ZfYWxpc3RfZm9sZCQwIiwib2ZfYWxpc3RfcmVkdWNlJDAiLCJvZl9pdGVyaSQwIiwib2ZfaXRlcmlfZXhuJDAiLCJyZXF1aXJlZF9ieV9pbnRmIiwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSQwIiwib2Zfc2VxdWVuY2Vfb3JfZXJyb3IkMCIsIm9mX3NlcXVlbmNlX2V4biQwIiwib2Zfc2VxdWVuY2VfbXVsdGkkMCIsIm9mX3NlcXVlbmNlX2ZvbGQkMCIsIm9mX3NlcXVlbmNlX3JlZHVjZSQwIiwic2V0JDIiLCJhZGRfZXhuJDEiLCJhZGRfbXVsdGkkMSIsInJlbW92ZV9tdWx0aSQxIiwiZmluZF9tdWx0aSQxIiwiY2hhbmdlJDEiLCJ1cGRhdGUkMSIsIml0ZXJfa2V5cyQxIiwiaXRlcmlfdW50aWwkMSIsIm1hcGkkMSIsImZvbGQkNCIsImZvbGQyJDIiLCJmaWx0ZXJfa2V5cyQxIiwiZmlsdGVyaSQxIiwiZmlsdGVyX21hcGkkMSIsInBhcnRpdGlvbl9tYXBpJDEiLCJwYXJ0aXRpb25fbWFwJDEiLCJwYXJ0aXRpb25pX3RmJDEiLCJjb21iaW5lX2Vycm9ycyQxIiwia2V5cyQxIiwiZGF0YSQxIiwidG9fYWxpc3QkMSIsImZvbGRfc3ltbWV0cmljX2RpZmYkMSIsIm1lcmdlJDEiLCJtZXJnZV9za2V3ZWQkMSIsImZvcl9hbGxpJDEiLCJleGlzdHNpJDEiLCJjb3VudGkkMSIsImFwcGVuZCQxIiwic3VicmFuZ2UkMCIsImZvbGRfcmFuZ2VfaW5jbHVzaXZlJDEiLCJyYW5nZV90b19hbGlzdCQxIiwiY2xvc2VzdF9rZXkkMSIsIm50aCQyIiwibnRoX2V4biQwIiwicmFuayQxIiwia19vZl9zZXhwIiwidl9vZl9zZXhwIiwiYmluYXJ5X3NlYXJjaF9zdWJyYW5nZSQwIiwibWFwX2tleXMkMCIsImR1cCIsIm1hcF9rZXlzX2V4biQwIiwiYWRkX2V4biQyIiwib2ZfdHJlZTAiLCJvZl90cmVlJDIiLCJvZl9hbGlzdCQxIiwib2ZfYWxpc3Rfb3JfZXJyb3IkMSIsIm9mX2FsaXN0X2V4biQxIiwib2ZfYWxpc3RfbXVsdGkkMSIsIm9mX2FsaXN0X2ZvbGQkMSIsIm9mX2FsaXN0X3JlZHVjZSQxIiwib2ZfaXRlcmkkMSIsInRyZWVfbGVuZ3RoIiwib2ZfaXRlcmlfZXhuJDEiLCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlJDEiLCJvZl9zZXF1ZW5jZV9vcl9lcnJvciQxIiwib2Zfc2VxdWVuY2VfZXhuJDEiLCJvZl9zZXF1ZW5jZV9tdWx0aSQxIiwib2Zfc2VxdWVuY2VfZm9sZCQxIiwib2Zfc2VxdWVuY2VfcmVkdWNlJDEiLCJtYXBfa2V5cyQxIiwibWFwX2tleXNfZXhuJDEiLCJvZl90cmVlJDMiLCJvZl9hbGlzdCQyIiwib2ZfYWxpc3Rfb3JfZXJyb3IkMiIsIm9mX2FsaXN0X2V4biQyIiwib2ZfYWxpc3RfbXVsdGkkMiIsIm9mX2FsaXN0X2ZvbGQkMiIsIm9mX2FsaXN0X3JlZHVjZSQyIiwib2ZfaXRlcmkkMiIsIm9mX2l0ZXJpX2V4biQyIiwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSQyIiwib2Zfc2VxdWVuY2Vfb3JfZXJyb3IkMiIsIm9mX3NlcXVlbmNlX2V4biQyIiwib2Zfc2VxdWVuY2VfbXVsdGkkMiIsIm9mX3NlcXVlbmNlX2ZvbGQkMiIsIm9mX3NlcXVlbmNlX3JlZHVjZSQyIiwibWFwX2tleXMkMiIsIm1hcF9rZXlzX2V4biQyIiwiSyIsInZfZ3JhbW1hciIsImNvbXBhcmVfdiIsImVxdWFsX3YiLCJoYXNoX2ZvbGRfdiIsIm9mX3RyZWUkNCIsImVtcHR5JDMiLCJvZl9hbGlzdCQzIiwib2ZfYWxpc3Rfb3JfZXJyb3IkMyIsIm9mX2FsaXN0X2V4biQzIiwib2ZfYWxpc3RfbXVsdGkkMyIsIm9mX2FsaXN0X2ZvbGQkMyIsIm9mX2FsaXN0X3JlZHVjZSQzIiwib2ZfaXRlcmkkMyIsIm9mX2l0ZXJpX2V4biQzIiwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSQzIiwib2Zfc2VxdWVuY2Vfb3JfZXJyb3IkMyIsIm9mX3NlcXVlbmNlX2V4biQzIiwib2Zfc2VxdWVuY2VfbXVsdGkkMyIsIm9mX3NlcXVlbmNlX2ZvbGQkMyIsIm9mX3NlcXVlbmNlX3JlZHVjZSQzIiwibWFwX2tleXMkMyIsIm1hcF9rZXlzX2V4biQzIiwidHJhbnNmZXIiLCJxIiwicSQwIiwiZmxvYXRfb2ZfYml0cyIsImJpdHNfb2ZfZmxvYXQiLCJic3dhcDE2IiwiYnN3YXAzMiIsImJzd2FwNDgiLCJ0b19uYXRpdmVpbnRfZXhuIiwid3JhcF9leG4iLCJ3cmFwX21vZHVsbyIsInVud3JhcCIsImNseiIsImN0eiIsImludmFsaWRfc3RyIiwic2lnbmVkbmVzcyIsInBvc19zdHIiLCJpbnQ2MyIsImludDYzJDAiLCJvbmUkMCIsIm9mX25hdGl2ZWludF90cnVuYyIsInRvX25hdGl2ZWludF90cnVuYyIsInRvX3N0cmluZyQxIiwicmVwciIsIm9mX2ludF90cnVuYyIsInJlcHIkMCIsImluY2x1ZGUiLCJvZl9mbG9hdCQwIiwidG9fZmxvYXQkMCIsIm9mX2ludF9leG4kMCIsInRvX2ludF9leG4kMCIsInBwJDAiLCJoYXNoYWJsZSQwIiwiaXNfcG9zaXRpdmUkMCIsImlzX25vbl9uZWdhdGl2ZSQwIiwiaXNfbmVnYXRpdmUkMCIsImlzX25vbl9wb3NpdGl2ZSQwIiwic2lnbiQwIiwiaW52YXJpYW50JDAiLCJ0b19zdHJpbmdfaHVtJDAiLCJtaW51c19vbmUkMCIsInJlbSQwIiwicm91bmQkMCIsInJvdW5kX3Rvd2FyZHNfemVybyQwIiwicm91bmRfZG93biQwIiwicm91bmRfdXAkMCIsInJvdW5kX25lYXJlc3QkMCIsInN1Y2MkMCIsInByZWQkMCIsInBvdyQwIiwiYml0X2FuZCQwIiwiYml0X29yJDAiLCJiaXRfeG9yJDAiLCJiaXRfbm90JDAiLCJwb3Bjb3VudCQwIiwic2hpZnRfbGVmdCQwIiwic2hpZnRfcmlnaHQkMCIsImRlY3IkMCIsImluY3IkMCIsIm9mX2ludDMyX2V4biQwIiwidG9faW50MzJfZXhuJDAiLCJvZl9pbnQ2NF9leG4kMCIsInRvX2ludDY0JDAiLCJvZl9uYXRpdmVpbnRfZXhuJDAiLCJ0b19uYXRpdmVpbnRfZXhuJDAiLCJudW1fYml0cyQwIiwibWF4X3ZhbHVlJDAiLCJtaW5fdmFsdWUkMCIsInNoaWZ0X3JpZ2h0X2xvZ2ljYWwkMCIsImNlaWxfcG93MiQwIiwiZmxvb3JfcG93MiQwIiwiY2VpbF9sb2cyJDAiLCJpc19wb3cyJDAiLCJjbHokMCIsImN0eiQwIiwib2ZfaW50JDAiLCJ0b19pbnQkMCIsInRvX2ludF90cnVuYyQwIiwidG9faW50MzIkMCIsIm9mX2ludDY0JDAiLCJvZl9uYXRpdmVpbnQkMCIsInRvX25hdGl2ZWludCQwIiwidG9fbmF0aXZlaW50X3RydW5jJDAiLCJvZl9mbG9hdF91bmNoZWNrZWQkMCIsInJlcHIkMSIsImJzd2FwMzIkMCIsImJzd2FwNDgkMCIsInBvc19kaWZmIiwibmVnYXRpdmVfb25lIiwiZGl2X3dvdWxkX292ZXJmbG93IiwicHJvZHVjdCIsImFicyQxIiwibmVnJDAiLCJyYW5kb21fb2ZfaW50IiwicmFuZG9tX29mX2ludDY0IiwicmFuZG9tX29mX2ludCQwIiwicmFuZG9tX2luY2xfb2ZfaW50IiwicmFuZG9tX2luY2xfb2ZfaW50NjQiLCJyYW5kb21faW5jbCIsImZsb29yX2xvZzIkMCIsImludiIsImxlZnRfa2V5IiwicmlnaHRfa2V5IiwidXBkYXRlX2hlaWdodCIsIm9sZF9oZWlnaHQiLCJuZXdfaGVpZ2h0IiwiYmFsYW5jZSIsInJvb3Rfbm9kZSIsImxlZnRfbm9kZSIsInJpZ2h0X25vZGUiLCJsZWZ0X25vZGVfbGVmdCIsImxlZnRfbm9kZV9yaWdodCIsImxyX2xlZnQiLCJscl9yaWdodCIsInJpZ2h0X25vZGVfbGVmdCIsInJpZ2h0X25vZGVfcmlnaHQiLCJybF9sZWZ0IiwicmxfcmlnaHQiLCJzZXRfbGVmdCIsIm5vZGUiLCJ0cmVlJDAiLCJzZXRfcmlnaHQiLCJhZGRlZCIsImZpbmRpX2FuZF9jYWxsX2ltcGwiLCJhcmcxIiwiYXJnMiIsImNhbGxfaWZfZm91bmQiLCJjYWxsX2lmX25vdF9mb3VuZCIsImZpbmRfYW5kX2NhbGwiLCJjYWxsX2lmX2ZvdW5kJDAiLCJjYWxsX2lmX25vdF9mb3VuZCQwIiwiZmluZGlfYW5kX2NhbGwiLCJjYWxsX2lmX2ZvdW5kJDEiLCJjYWxsX2lmX25vdF9mb3VuZCQxIiwiZmluZF9hbmRfY2FsbDEiLCJjYWxsX2lmX2ZvdW5kJDIiLCJjYWxsX2lmX25vdF9mb3VuZCQyIiwiZmluZGlfYW5kX2NhbGwxIiwiY2FsbF9pZl9mb3VuZCQzIiwiY2FsbF9pZl9ub3RfZm91bmQkMyIsImZpbmRfYW5kX2NhbGwyIiwiY2FsbF9pZl9mb3VuZCQ0IiwiY2FsbF9pZl9ub3RfZm91bmQkNCIsImZpbmRpX2FuZF9jYWxsMiIsImlmX2ZvdW5kJDAiLCJpZl9ub3RfZm91bmQkMCIsInJlbW92ZWQiLCJrZXkkNCIsImRhdGEkNCIsInJrZXkiLCJyZGF0YSIsImtleSQxIiwicmtleSQwIiwicmRhdGEkMCIsImxrZXkkMCIsImxkYXRhJDAiLCJrZXkkMyIsImRhdGEkMyIsInJrZXkkMSIsInJkYXRhJDEiLCJsa2V5IiwibGRhdGEiLCJrZXkkMiIsImRhdGEkMiIsIm1hcGlfaW5wbGFjZSIsImVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIiwid2l0aG91dF9tdXRhdGluZyIsIm1heF90YWJsZV9sZW5ndGgiLCJncm93dGhfYWxsb3dlZCIsInNpemUkMCIsInNpemUkMSIsInNsb3QiLCJhZGRfd29ya2VyIiwibmV3X3Jvb3QiLCJtYXliZV9yZXNpemVfdGFibGUiLCJzaG91bGRfZ3JvdyIsIm5ld19hcnJheV9sZW5ndGgiLCJuZXdfdGFibGUiLCJvbGRfdGFibGUiLCJzZXhwX29mX2tleSQwIiwiYWRkZWRfb3JfcmVtb3ZlZCIsImJ1Y2tldCIsImNob29zZV9ub25lbXB0eSIsInRhYmxlIiwiYXZsdHJlZSIsImludmFyaWFudF9rZXkiLCJpbnZhcmlhbnRfZGF0YSIsInJlYWxfbGVuIiwibmV3X3QiLCJ0MCIsIm5ld19kYXRhJDAiLCJmaW5kX29yX2FkZCIsImlkIiwiZmluZGlfb3JfYWRkIiwiZmluZF9hbmRfcmVtb3ZlIiwidXBkYXRlX2FuZF9yZXR1cm4iLCJpbmNyX2J5IiwicmVtb3ZlX2lmX3plcm8iLCJieSIsImNyZWF0ZV9tYXBwZWQiLCJnZXRfa2V5IiwiZ2V0X2RhdGEiLCJkdXBlcyIsIm9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyIsInNleHBfb2ZfZGF0YSIsImRfb2Zfc2V4cCIsImtfZ3JhbW1hciIsInJvdyIsIm9sZCIsImNyZWF0ZV93aXRoX2tleSIsImNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciIsImNyZWF0ZV93aXRoX2tleV9leG4iLCJtYXliZV9zZXQiLCJ0X2xlZnQiLCJ0X3JpZ2h0IiwibWVyZ2VfaW50byIsImRzdF9kYXRhIiwiYWN0aW9uIiwiZHN0X2RhdGEkMCIsInRvX3JlbW92ZSIsImZpbHRlcl9rZXlzX2lucGxhY2UiLCJmaWx0ZXJfbWFwaV9pbnBsYWNlIiwibWFwX3Jlc3VsdHMiLCJmaWx0ZXJfbWFwX2lucGxhY2UiLCJzaW1pbGFyIiwib2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzJDAiLCJjcmVhdGVfbWFwcGVkJDAiLCJjcmVhdGVfd2l0aF9rZXkkMCIsImNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciQwIiwiY3JlYXRlX3dpdGhfa2V5X2V4biQwIiwib2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzJDEiLCJjcmVhdGVfbWFwcGVkJDEiLCJjcmVhdGVfd2l0aF9rZXkkMSIsImNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciQxIiwiY3JlYXRlX3dpdGhfa2V5X2V4biQxIiwiZ3JvdXAkMSIsImhhc2hhYmxlX3MiLCJwb2x5X2hhc2hhYmxlIiwic3RyaWN0X2FkZCIsInN0cmljdF9hZGRfZXhuIiwic3RyaWN0X3JlbW92ZSIsInN0cmljdF9yZW1vdmVfZXhuIiwic2V4cF9vZl9lIiwibGFyZ2VyIiwic21hbGxlciIsIm9mX2hhc2h0Ymxfa2V5cyIsImhhc2h0YmwiLCJ0b19oYXNodGJsIiwiZV9vZl9zZXhwIiwibWluX3Bvc2l0aXZlX3N1Ym5vcm1hbF92YWx1ZSIsIm1pbl9wb3NpdGl2ZV9ub3JtYWxfdmFsdWUiLCJwaSIsInNxcnRfcGkiLCJzcXJ0XzJwaSIsImV1bGVyIiwib2ZfaW50NjMiLCJpcm91bmRfbGJvdW5kIiwiaXJvdW5kX3Vib3VuZCIsImlyb3VuZF91cCIsImlyb3VuZF91cF9leG4iLCJpcm91bmRfZG93biIsImlyb3VuZF9kb3duX2V4biIsImlyb3VuZF90b3dhcmRzX3plcm8iLCJpcm91bmRfdG93YXJkc196ZXJvX2V4biIsInJvdW5kX25lYXJlc3RfbGIiLCJyb3VuZF9uZWFyZXN0X3ViIiwib25lX3VscF9sZXNzX3RoYW5faGFsZiIsImFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IiwiaXJvdW5kX25lYXJlc3RfMzIiLCJpcm91bmRfbmVhcmVzdF82NCIsImlyb3VuZF9uZWFyZXN0XzY0JDAiLCJpcm91bmRfbmVhcmVzdF9leG5fMzIiLCJpcm91bmRfbmVhcmVzdF9leG5fNjQiLCJpcm91bmRfbmVhcmVzdF9leG4iLCJpcm91bmRfZXhuIiwiaXJvdW5kIiwiaXNfaW5mIiwiaXNfZmluaXRlIiwibWluX2luYW4iLCJtYXhfaW5hbiIsInNjYWxlIiwic3F1YXJlIiwiZnJhY3Rpb25hbCIsImludGVncmFsIiwicm91bmRfbmVhcmVzdF9pbmxpbmUiLCJyb3VuZF9uZWFyZXN0X2hhbGZfdG9fZXZlbiIsImNlaWxfb3Jfc3VjYyIsImRpZmZfZmxvb3IiLCJkaWZmX2NlaWwiLCJpbnQ2M19yb3VuZF9sYm91bmQiLCJpbnQ2M19yb3VuZF91Ym91bmQiLCJpbnQ2M19yb3VuZF91cF9leG4iLCJpbnQ2M19yb3VuZF9kb3duX2V4biIsImludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYSIsImludDYzX3JvdW5kX25lYXJlc3RfYXJjaDY0X25vYSIsImludDYzX3JvdW5kX25lYXJlc3RfZXhuIiwiY2xhc3NpZnkiLCJzdHJpcF96ZXJvIiwiZGVjaW1hbHMiLCJleHBsaWNpdF9wbHVzIiwidG9fcGFkZGVkX2NvbXBhY3Rfc3RyaW5nX2N1c3RvIiwia2lsbyIsIm1lZ2EiLCJnaWdhIiwidGVyYSIsInBldGEiLCJtYWciLCJudW1lcmF0b3IiLCJkZW5vbWluYXRvciIsImhpZ2hlciIsImRpZmZfcmlnaHQiLCJkaWZmX2xlZnQiLCJwZXRhJDAiLCJ0b19wYWRkZWRfY29tcGFjdF9zdHJpbmciLCJyb3VuZF9nZW4iLCJzZCIsImRkIiwiZGQkMCIsInNkJDAiLCJkZCQxIiwic2QkMSIsImFic19kZCIsInJvdW5kX3NpZ25pZmljYW50Iiwic2lnbmlmaWNhbnRfZGlnaXRzIiwicm91bmRfZGVjaW1hbCIsImRlY2ltYWxfZGlnaXRzIiwic2lnbl9leG4iLCJzaWduX29yX25hbiIsImllZWVfbmVnYXRpdmUiLCJleHBvbmVudF9tYXNrNjQiLCJleHBvbmVudF9tYXNrIiwibWFudGlzc2FfbWFzayIsIm1hbnRpc3NhX21hc2s2NCIsIm1hbnRpc3NhX2JpdHMiLCJpZWVlX2V4cG9uZW50IiwiaWVlZV9tYW50aXNzYSIsImNyZWF0ZV9pZWVlX2V4biIsIm5lZ2F0aXZlIiwibWFudGlzc2EiLCJzaWduX2JpdHMiLCJleHB0X2JpdHMiLCJtYW50X2JpdHMiLCJjcmVhdGVfaWVlZSIsInNwZWNpYWxpemVkX2hhc2giLCJhZGRfc3Vic3RyaW5nIiwiYWRkX3N1YmJ5dGVzIiwiZWxpZGVkX21lc3NhZ2UiLCJlbGlkZSIsImF0X21vc3RfbnVtX2ZyYW1lcyIsInRvX3N0cmluZ19saXN0Iiwic2V0X3JlY29yZGluZyIsImFtX3JlY29yZGluZyIsIm1vc3RfcmVjZW50IiwibW9zdF9yZWNlbnRfZm9yX2V4biIsIndpdGhfcmVjb3JkaW5nIiwic2F2ZWQiLCJvY2FtbHJ1bnBhcmFtX21lbnRpb25zX2JhY2t0cmEiLCJhcnJheV9vZl9zZXhwIiwic2V4cF9vZl9hcnJheSIsImFycmF5X3NleHBfZ3JhbW1hciIsImJvb2xfb2Zfc2V4cCIsInNleHBfb2ZfYm9vbCIsImJvb2xfc2V4cF9ncmFtbWFyIiwiY2hhcl9vZl9zZXhwIiwic2V4cF9vZl9jaGFyIiwiY2hhcl9zZXhwX2dyYW1tYXIiLCJzZXhwX29mX2V4biIsImZ1bmMkMSIsImZsb2F0X29mX3NleHAiLCJzZXhwX29mX2Zsb2F0IiwiZmxvYXRfc2V4cF9ncmFtbWFyIiwiZnVuYyQyIiwiaW50X29mX3NleHAiLCJzZXhwX29mX2ludCIsImludF9zZXhwX2dyYW1tYXIiLCJmdW5jJDMiLCJpbnQzMl9vZl9zZXhwIiwic2V4cF9vZl9pbnQzMiIsImludDMyX3NleHBfZ3JhbW1hciIsImZ1bmMkNCIsImludDY0X29mX3NleHAiLCJzZXhwX29mX2ludDY0IiwiaW50NjRfc2V4cF9ncmFtbWFyIiwibGlzdF9vZl9zZXhwIiwic2V4cF9vZl9saXN0IiwibGlzdF9zZXhwX2dyYW1tYXIiLCJmdW5jJDUiLCJuYXRpdmVpbnRfb2Zfc2V4cCIsInNleHBfb2ZfbmF0aXZlaW50IiwibmF0aXZlaW50X3NleHBfZ3JhbW1hciIsIm9wdGlvbl9vZl9zZXhwIiwic2V4cF9vZl9vcHRpb24iLCJvcHRpb25fc2V4cF9ncmFtbWFyIiwicmVmX29mX3NleHAiLCJzZXhwX29mX3JlZiIsInJlZl9zZXhwX2dyYW1tYXIiLCJzdHJpbmdfb2Zfc2V4cCIsInNleHBfb2Zfc3RyaW5nIiwic3RyaW5nX3NleHBfZ3JhbW1hciIsImNvbXBhcmVfYnl0ZXMiLCJlcXVhbF9ieXRlcyIsImJ5dGVzX29mX3NleHAiLCJzZXhwX29mX2J5dGVzIiwiYnl0ZXNfc2V4cF9ncmFtbWFyIiwiZnVuYyQ2IiwidW5pdF9vZl9zZXhwIiwic2V4cF9vZl91bml0IiwidW5pdF9zZXhwX2dyYW1tYXIiLCJmYWlsd2l0aCIsImludmFsaWRfYXJnIiwiY29tcGFyZV9hcnJheSQwIiwiZXF1YWxfYXJyYXkkMCIsImFycmF5X29mX3NleHAkMCIsInNleHBfb2ZfYXJyYXkkMCIsImFycmF5X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9ib29sJDAiLCJlcXVhbF9ib29sJDAiLCJoYXNoX2ZvbGRfYm9vbCQwIiwiaGFzaF9ib29sJDAiLCJib29sX29mX3NleHAkMCIsInNleHBfb2ZfYm9vbCQwIiwiYm9vbF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfY2hhciQwIiwiZXF1YWxfY2hhciQwIiwiaGFzaF9mb2xkX2NoYXIkMCIsImhhc2hfY2hhciQwIiwiY2hhcl9vZl9zZXhwJDAiLCJzZXhwX29mX2NoYXIkMCIsImNoYXJfc2V4cF9ncmFtbWFyJDAiLCJzZXhwX29mX2V4biQwIiwiY29tcGFyZV9mbG9hdCQwIiwiZXF1YWxfZmxvYXQkMCIsImhhc2hfZm9sZF9mbG9hdCQwIiwiaGFzaF9mbG9hdCQwIiwiZmxvYXRfb2Zfc2V4cCQwIiwic2V4cF9vZl9mbG9hdCQwIiwiZmxvYXRfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2ludCQwIiwiZXF1YWxfaW50JDAiLCJoYXNoX2ZvbGRfaW50JDAiLCJoYXNoX2ludCQwIiwiaW50X29mX3NleHAkMCIsInNleHBfb2ZfaW50JDAiLCJpbnRfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2ludDMyJDAiLCJlcXVhbF9pbnQzMiQwIiwiaGFzaF9mb2xkX2ludDMyJDAiLCJoYXNoX2ludDMyJDAiLCJpbnQzMl9vZl9zZXhwJDAiLCJzZXhwX29mX2ludDMyJDAiLCJpbnQzMl9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfaW50NjQkMCIsImVxdWFsX2ludDY0JDAiLCJoYXNoX2ZvbGRfaW50NjQkMCIsImhhc2hfaW50NjQkMCIsImludDY0X29mX3NleHAkMCIsInNleHBfb2ZfaW50NjQkMCIsImludDY0X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9saXN0JDAiLCJlcXVhbF9saXN0JDAiLCJoYXNoX2ZvbGRfbGlzdCQwIiwibGlzdF9vZl9zZXhwJDAiLCJzZXhwX29mX2xpc3QkMCIsImxpc3Rfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX25hdGl2ZWludCQwIiwiZXF1YWxfbmF0aXZlaW50JDAiLCJoYXNoX2ZvbGRfbmF0aXZlaW50JDAiLCJoYXNoX25hdGl2ZWludCQwIiwibmF0aXZlaW50X29mX3NleHAkMCIsInNleHBfb2ZfbmF0aXZlaW50JDAiLCJuYXRpdmVpbnRfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX29wdGlvbiQwIiwiZXF1YWxfb3B0aW9uJDAiLCJoYXNoX2ZvbGRfb3B0aW9uJDAiLCJvcHRpb25fb2Zfc2V4cCQwIiwic2V4cF9vZl9vcHRpb24kMCIsIm9wdGlvbl9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfcmVmJDAiLCJlcXVhbF9yZWYkMCIsInJlZl9vZl9zZXhwJDAiLCJzZXhwX29mX3JlZiQwIiwicmVmX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9zdHJpbmckMCIsImVxdWFsX3N0cmluZyQwIiwiaGFzaF9mb2xkX3N0cmluZyQwIiwiaGFzaF9zdHJpbmckMCIsInN0cmluZ19vZl9zZXhwJDAiLCJzZXhwX29mX3N0cmluZyQwIiwic3RyaW5nX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9ieXRlcyQwIiwiZXF1YWxfYnl0ZXMkMCIsImJ5dGVzX29mX3NleHAkMCIsInNleHBfb2ZfYnl0ZXMkMCIsImJ5dGVzX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV91bml0JDAiLCJlcXVhbF91bml0JDAiLCJoYXNoX2ZvbGRfdW5pdCQwIiwiaGFzaF91bml0JDAiLCJ1bml0X29mX3NleHAkMCIsInNleHBfb2ZfdW5pdCQwIiwidW5pdF9zZXhwX2dyYW1tYXIkMCIsInJhaXNlX3MkMCIsInBoeXNfZXF1YWwkMCIsInRfc2V4cF9ncmFtbWFyIiwibmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaCIsInQiLCJlbmFibGVfZXZlcnl0aGluZyIsImFtX3J1bm5pbmdfaW5saW5lX3Rlc3RfZW52X3ZhciIsInRvX3N0cmluZyIsImNvbWJpbmUiLCJ0MSIsInQyIiwiY29tYmluZV9hbGwiLCJ0cyIsInRlc3RfbW9kdWxlc19yYW4iLCJ0ZXN0X21vZHVsZXNfZmFpbGVkIiwidGVzdHNfcmFuIiwidGVzdHNfZmFpbGVkIiwiZHluYW1pY19saWIiLCJhY3Rpb24iLCJmb3JjZV9kcm9wIiwiZ2V0IiwiY3VycmVudCIsImZvdW5kX3Rlc3QiLCJpc19jdXJyZW50IiwicCIsImN1cnJlbnQkMCIsImN1cnJlbnRfdGFncyIsInQiLCJtIiwidmVyYm9zZSIsInN0cmljdCIsInNob3dfY291bnRzIiwibGlzdF90ZXN0X25hbWVzIiwiZGVsYXllZF9lcnJvcnMiLCJzdG9wX29uX2Vycm9yIiwibG9nIiwidGltZV9zZWMiLCJ1c2VfY29sb3IiLCJpbl9wbGFjZSIsImRpZmZfY29tbWFuZCIsInNvdXJjZV90cmVlX3Jvb3QiLCJhbGxvd19vdXRwdXRfcGF0dGVybnMiLCJkaXNwbGF5ZWRfZGVzY3IiLCJkZXNjciIsImZpbGVuYW1lIiwibGluZSIsInN0YXJ0X3BvcyIsImVuZF9wb3MiLCJuYW1lIiwicmVzdCIsImxpYiIsInRlc3RzIiwibGlzdF9wYXJ0aXRpb25zIiwicGFydGl0aW9uIiwidGFnX3ByZWRpY2F0ZSIsIm5hbWVfZmlsdGVyIiwibXNnJDEiLCJmIiwiYW5vbiIsInMiLCJzdHIiLCJmaWxlIiwiaW5kZXgiLCJpbmRleCQwIiwiaSIsImZpbGVuYW1lJDAiLCJpbmRleF9zdHJpbmciLCJpbmRleCQxIiwidGFnIiwibCIsImFyZ3YiLCJtc2ciLCJtc2ckMCIsInYiLCJhbV90ZXN0X3J1bm5lciIsImFtX3J1bm5pbmdfaW5saW5lX3Rlc3QiLCJ0ZXN0aW5nIiwid2FsbF90aW1lX2Nsb2NrX25zIiwid2hlcmVfdG9fY3V0X2JhY2t0cmFjZSIsInRpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tXyIsImJlZm9yZV9ucyIsInJlcyIsImV4biQwIiwiZXhuIiwic2F2ZWRfY2FtbF9yYW5kb21fc3RhdGUiLCJzYXZlZF9iYXNlX3JhbmRvbV9zdGF0ZSIsInN0cmluZ19vZl9tb2R1bGVfZGVzY3IiLCJwcmludF9kZWxheWVkX2Vycm9ycyIsImRlbGF5ZWRfZXJyb3JzJDAiLCJtZXNzYWdlIiwiZXByaW50Zl9vcl9kZWxheSIsImZtdCIsImFkZF9ob29rcyIsIkMiLCJodW1fYmFja3RyYWNlIiwiYmFja3RyYWNlIiwidGVzdF9pbm5lciIsImNvbmZpZyIsInRhZ3MiLCJkZWZfZmlsZW5hbWUiLCJkZWZfbGluZV9udW1iZXIiLCJib29sX29mX2YiLCJ3aGF0X3RvX2RvIiwid2hpY2hfdGFncyIsIm9ubHlfdGVzdF9sb2NhdGlvbiIsImxpYm5hbWUiLCJmJDAiLCJkZXNjciQwIiwiY29tcGxldGVfdGFncyIsInVzZWQiLCJsaW5lX251bWJlcl9vcHQiLCJwb3NpdGlvbl9zdGFydCIsImVuZF9vZl9kZWZfZmlsZW5hbWUiLCJsaW5lX251bWJlciIsImZvdW5kIiwicmVxIiwiZHJvcHBlZCIsImRlc2NyJDEiLCJzdWJzdHJpbmciLCJzaG91bGRfcnVuIiwiZGVzY3IkMiIsImNoIiwicmVzdWx0JDAiLCJjYW1sX3JhbmRvbV9zdGF0ZSIsImJhc2VfcmFuZG9tX3N0YXRlIiwicmVzdWx0IiwiYmFja3RyYWNlJDAiLCJleG5fc3RyIiwic2VwIiwic2V0X2xpYl9hbmRfcGFydGl0aW9uIiwic3RhdGljX2xpYiIsIndoaWNoX3Rlc3RzIiwicmVxdWlyZXNfcGFydGl0aW9uIiwidW5zZXRfbGliIiwidGVzdCIsImIiLCJ0ZXN0X3VuaXQiLCJ0ZXN0X21vZHVsZSIsInBhcnRpYWxfdGFncyIsInByZXYiLCJ4IiwiZSQwIiwiZSIsInN1bW1hcml6ZSIsImsiLCJhY2MiLCJjb3VudCIsImNvdW50X3Rlc3RfbW9kdWxlcyIsInVudXNlZF90ZXN0cyIsImVycm9ycyIsInVzZV9jb2xvciQwIiwiaW5fcGxhY2UkMCIsImRpZmZfY29tbWFuZCQwIiwic291cmNlX3RyZWVfcm9vdCQwIiwiYWxsb3dfb3V0cHV0X3BhdHRlcm5zJDAiLCJldmFsdWF0b3JzIiwiYWRkX2V2YWx1YXRvciIsImV4aXQiLCJhYnN1cmQiLCJzdHIiLCJtYWtlIiwiaW5pdCIsImNvbmNhdCIsImNvbXBhcmUiLCJzdWIiLCJzcGxpdF9vbl9jaGFyIiwib25lIiwiYyIsImlzX3ByZWZpeCIsImEiLCJiIiwibGVuX2EiLCJpc19zdWZmaXgiLCJsZW5fYiIsImZpbmQiLCJmIiwic3RhcnQiLCJzIiwibGVuIiwiaSIsImkkMCIsImhhcyIsImZpbmRfYndkIiwiYmV5b25kIiwiYmV5b25kJDAiLCJsaXN0IiwiY3MiLCJqIiwiY3MkMCIsIm9mX2xpc3QiLCJicyIsInJldmVyc2UiLCJoYXNfbW9yZSIsInBlZWsiLCJhZHZhbmNlIiwibWFrZSQwIiwibWFrZV93aXRoX3NpemUiLCJlc3RpbWF0ZSIsInIiLCJlc3RpbWF0ZSQwIiwiYnVmZmVyIiwiY2FwYWNpdHkiLCJyJDAiLCJibmV3IiwiciQxIiwicmV0dXJuJDAiLCJmYWlsIiwiZSIsInRvX29wdGlvbiIsInN5bWJvbF9iaW5kIiwibSIsIm1hcCIsIm1hcF9lcnJvciIsImdldCIsImFkZCIsIngiLCJ5IiwiZGl2aWRlIiwiaXRlcmF0ZSIsIm4iLCJuJDAiLCJ2IiwidiQwIiwibiQxIiwibGV0JDAiLCJ0b19saXN0IiwiYXBwZW5kIiwiY29weSIsImJsaXQiLCJmb2xkX2xlZnQiLCJmb2xkX3JpZ2h0IiwiZm9yX2FsbCIsImV4aXN0cyIsImlzX2VtcHR5IiwieHMiLCJ2YWxpZF9pbmRleCIsImhhc19zb21lIiwiZmlyc3QiLCJsYXN0IiwiZm9sZGlfbGVmdCIsImlkeCIsInB1c2giLCJ4c19uZXciLCJwdXNoX2Zyb250IiwiaW5zZXJ0IiwiYXJyIiwicmVwbGFjZSIsInJlbW92ZSIsInJlbW92ZV9maXJzdCIsInJlbW92ZV9sYXN0IiwicCIsImJpbnNlYXJjaCIsImtleV9vZiIsImtleSIsImNtcCIsInVwcGVyJDAiLCJjbXAkMSIsImxvd2VyJDEiLCJjbXAkMiIsImxvd2VyIiwidXBwZXIiLCJsb3dlciQwIiwiY21wJDAiLCJjYXJkaW5hbCIsImJpbmRpbmdzIiwidmFsdWUiLCJyZXN1bHQiLCJpbmRleF9vZiIsImV4YWN0IiwicGFpciIsImZpbmRfb3B0IiwibWVtIiwiZW1wdHkiLCJzaW5nbGV0b24iLCJ1cGRhdGUiLCJ2YWx1ZSQwIiwicmVtb3ZlJDAiLCJzZXQiLCJyZXMiLCJlbGVtZW50cyIsImxzdCIsImVsZW1lbnQiLCJpbnNlcnRfZG93bndhcmQiLCJzZXQkMCIsInNldCQxIiwiaW5zZXJ0X3Vwd2FyZCIsImJpdHNpemUiLCJicmFuY2hpbmciLCJzbG90IiwibCIsIm9mZnNldCIsImZ1bGxfc2l6ZSIsImxldmVsIiwicGFyYW0iLCJpc19mdWxsIiwibGVuZ3RoIiwidCIsImNoZWNrX2ludmFyaWFudCIsImNoZWNrIiwiaXNfcm9vdCIsIm5vZGUiLCJpc19yb290JDAiLCJuY2hpbGRyZW4iLCJjaGlsZCIsInNpemUiLCJmb2xkIiwidCQwIiwibyIsInQkMSIsInNpbmdsZXRvbl90cmVlIiwibGV2IiwicHVzaF9ub3RfZnVsbCIsIm5vZGVzIiwicG9wX2F1eCIsIm5vZGVzJDAiLCJjaGlsZCQwIiwiZSQwIiwibm9kZXMkMSIsInBvcCIsInBvcF9vcHQiLCJmaWxsIiwic3RhcnQkMCIsInN0YXJ0JDEiLCJvayIsInRsIiwiaGQiLCJzeW1ib2wiLCJnIiwic3ltYm9sJDAiLCJmbHN0Iiwic3BsaXRfaGVhZF90YWlsIiwibWFwX2FuZF9maWx0ZXIiLCJzcGxpdF9hdCIsInJlc3QiLCJwcmVmaXgiLCJyZXN0JDAiLCJyZXN0JDEiLCJwcmVmaXgkMCIsInRyYW5zcG9zZSIsInJvd19saXN0IiwiY29sdW1ucyIsInJvd19saXN0JDAiLCJyb3ciLCJjb2x1bW4iLCJyZXN0X3JvdyIsImVsIiwicm93X2xpc3QkMSIsImNvbHVtbnMkMCIsImZvbGRpIiwiZmlmbyIsInBvcF9mcm9udCIsImZyb250IiwiZnJvbnQkMCIsImhkJDAiLCJlbXB0eSQwIiwicHVzaF9mcm9udCQwIiwibGYiLCJwdXNoX3JlYXIiLCJwb3BfZnJvbnQkMCIsImxmJDAiLCJ1cGRhdGVfZmlyc3QiLCJ1cGRhdGVfbGFzdCIsImZpZm8kMCIsIm9yZGVyIiwib2RkX29yZGVyIiwibWF4X2tleXMiLCJtaW5fa2V5cyIsImtleXMiLCJjaGlsZHJlbiIsImtleXMkMCIsImFjY3UiLCJhY2N1JDAiLCJtYXAkMCIsInBhaXJzIiwicGFpcnMkMCIsImFjY3UkMSIsIm1hcCQxIiwiYWNjdSQyIiwiYnNlYXJjaCIsImV4YWN0JDAiLCJzdWJhcnJheSIsImluc2VydF9zdWJhcnJheSIsImFycjIiLCJzcGxpdF9zdWJhcnJheSIsImFyciQwIiwiYWRkX2luX2xlYWYiLCJpbnNlcnRfc3ViYXJyYXkkMCIsImsiLCJsZWZ0IiwicmlnaHQiLCJsZWZ0JDAiLCJyaWdodCQwIiwibGVmdCQxIiwicmlnaHQkMSIsImxlZnQkMiIsInJpZ2h0JDIiLCJsZWZ0JDMiLCJyaWdodCQzIiwiYWRkX2luX25vZGUiLCJjaGlsZHJlbiQwIiwic3BsaXRfc3ViYXJyYXkkMCIsImxlZnRfcGFpcnMiLCJsZWZ0X2NoaWxkcmVuIiwicmlnaHRfcGFpcnMiLCJyaWdodF9jaGlsZHJlbiIsImxlZnRfcGFpcnMkMCIsImxlZnRfY2hpbGRyZW4kMCIsInJpZ2h0X3BhaXJzJDAiLCJyaWdodF9jaGlsZHJlbiQwIiwibGVmdF9wYWlycyQxIiwibGVmdF9jaGlsZHJlbiQxIiwicmlnaHRfcGFpcnMkMSIsInJpZ2h0X2NoaWxkcmVuJDEiLCJsZWZ0X3BhaXJzJDIiLCJsZWZ0X2NoaWxkcmVuJDIiLCJyaWdodF9wYWlycyQyIiwicmlnaHRfY2hpbGRyZW4kMiIsImxlZnRfcGFpcnMkMyIsImxlZnRfY2hpbGRyZW4kMyIsInJpZ2h0X3BhaXJzJDMiLCJyaWdodF9jaGlsZHJlbiQzIiwiYWRkX2F1eCIsInBhaXJzJDEiLCJ1Iiwibm90X21pbmltYWwiLCJyZXBsYWNlMiIsInJvdGF0ZV9rZXlzIiwidG9fbGVmdCIsInBhcmVudCIsInJvdGF0ZV9jaGlsZHJlbiIsIm1lcmdlX2tleXMiLCJsZW5fbGVmdCIsImxlbl9yaWdodCIsIm1lcmdlZCIsInBhcmVudCQwIiwibWVyZ2VfbGVhdmVzIiwicGFpcnMxIiwicGFpcnMyIiwidW5kZXJmbG93IiwibWVyZ2Vfbm9kZXMiLCJjaGlsZHJlbjEiLCJjaGlsZHJlbjIiLCJwYWlyc19uZXciLCJjaGlsZHJlbl9uZXciLCJoYW5kbGVfdW5kZXJmbG93IiwidW5kZXJmbG93X2xlZnQiLCJsZWZ0X2NoaWxkIiwicmlnaHRfY2hpbGQiLCJub3RfbWluaW1hbCQwIiwicGFpcnMyJDAiLCJwYWlyczEkMCIsInBhaXJzMSQxIiwicGFpcnMyJDEiLCJwYWlyczIkMiIsInBhaXJzMSQyIiwiY2hpbGRyZW4yJDAiLCJjaGlsZHJlbjEkMCIsImNoaWxkcmVuJDEiLCJjaGlsZHJlbjIkMSIsImhhbmRsZV9kZWxldGUiLCJkIiwibGVuJDAiLCJyZW1vdmVfYXV4IiwicGFpciQwIiwicGFpcnMkMiIsInVwZGF0ZV9hdXgiLCJ2YWx1ZSQxIiwiZCQwIiwic291cmNlIiwiZG93biIsInRyZWUiLCJzdGFjayIsInRyZWUkMCIsInN0YWNrJDAiLCJzdGFjayQxIiwidHJlZSQxIiwidXAiLCJtYWtlX3NvdXJjZSIsImRvX3Vwd2FyZCIsImRvX2Rvd253YXJkIiwiYWRkX3Vwd2FyZCIsImFkZF9kb3dud2FyZCIsInJlbW92ZV91cHdhcmQiLCJyZW1vdmVfZG93bndhcmQiLCJjaGVja19yYW5nZSIsIm9rJDAiLCJzb3VyY2UkMCIsInNvdXJjZSQxIiwidXBkYXRlX3Vwd2FyZCIsIm51bGwkMCIsInVuZGVmaW5lZCQwIiwiaW50JDAiLCJpIiwiZmxvYXQkMCIsInYiLCJib29sIiwic3RyaW5nIiwib2JqZWN0IiwiYXJyYXkiLCJmdW5jdGlvbjEiLCJmIiwiZnVuY3Rpb24yIiwiZnVuY3Rpb24zIiwic3RyaW5naWZ5IiwicGFyc2UiLCJpc19mdW5jdGlvbiIsInJldHVybiQwIiwiYSIsImZhaWwiLCJ2YWx1ZSIsImxldCQwIiwibSIsInN5bWJvbCIsInAiLCJxIiwiciIsIm1hcCIsIm51bGwkMSIsIm9iaiIsInVuZGVmaW5lZCQxIiwiZmxvYXQkMSIsImludCQxIiwiYm9vbCQwIiwic3RyaW5nJDAiLCJmdW5jdGlvbiQwIiwiYXJncyIsIm1ldGhvZCIsImZpZWxkIiwibmFtZSIsImRlY29kZSIsImFycmF5JDAiLCJsZW4iLCJleHRyYWN0IiwibHN0IiwiZSIsIm9wdGlvbiIsIm9mX2V4Y2VwdGlvbiIsImV4biIsInJhaXNlX2pzX2Vycm9yIiwianNfZXJyb3IiLCJyYWlzZV9qcyIsIm1lc3NhZ2UiLCJqc19tc2ciLCJsb2dfc3RyaW5nIiwic3RyIiwibG9nX3ZhbHVlIiwiZXhwb3J0JDAiLCJtYWtlX2dsb2JhbCIsImdldF9nbG9iYWwiLCJuZXdfZ2xvYmFsIiwiY25hbWUiLCJjb25zdHIiLCJkZWNvZGVfY2FsbGJhY2siLCJjYiIsImVyciIsImNiJDAiLCJkZWNvZGVfZGF0YSIsImRlYyIsImRhdGEiLCJzdGF0ZSIsIm5vZGVfbW9kdWxlIiwibXNnX2RlY29kZSIsIm5vZGVfZnVuY3Rpb24iLCJqc19mdW5jdGlvbiIsImNhbGxiYWNrIiwiY2FsbGJhY2skMCIsImRhdGEkMCIsIm1zZyIsIm1zZyQwIiwiYnJvd3Nlcl9hcHBsaWNhdGlvbiIsImFwcF9uYW1lIiwic3RhdGVfZGVjb2RlIiwiYnJvd3Nlcl9mdW5jdGlvbiIsImVsZW1lbnQiLCJzdGF0ZSQwIiwiZWxlbWVudCQwIiwic3RvcF9wcm9wYWdhdGlvbiIsInByZXZlbnRfZGVmYXVsdCIsImFkZCIsImhhbmRsZXIiLCJ0Z3QiLCJyZW1vdmUiLCJzZXQiLCJtcyIsImNsZWFyIiwidCIsInNldF9pbnRlcnZhbCIsImNsZWFyX2ludGVydmFsIiwic2VuZF9tZXNzYWdlIiwiZG9fYXN5bmMiLCJzdGFydCIsInVybCIsInciLCJldmVudCIsInBvc3RfbWVzc2FnZSIsInRlcm1pbmF0ZSIsIm1ha2UiLCJwb3N0IiwicG9zdCQwIiwicG9zdCQxIiwiZiQwIiwic3RhcnQkMCIsIndvcmtlcl9kZWNvZGUiLCJ3b3JrZXIiLCJwb3N0X3RvX2NyZWF0b3IiLCJwb3N0X3RvX3dvcmtlciIsInBvc3RfbWVzc2FnZSQwIiwidGVybWluYXRlJDAiLCJzaW11bGF0ZV9qcyIsIndmdW4iLCJldmVudF90YXJnZXQiLCJyZXEiLCJoZWFkZXJzIiwiYm9keSIsInJlcXVlc3QiLCJyZWFkeV9zdGF0ZSIsInN0YXR1cyIsInJlc3BvbnNlX3RleHRfdmFsdWUiLCJyZXNwb25zZV90ZXh0X3N0cmluZyIsInMiLCJub2RlIiwicGFyZW50IiwiZmlyc3QiLCJuZXh0IiwiYXBwZW5kIiwiY2hpbGQiLCJyZW1vdmUkMCIsInJlcGxhY2UiLCJuZXdfY2hpbGQiLCJvbGRfY2hpbGQiLCJyZW1vdmVfY2hpbGRyZW4iLCJub2RlX3ZhbHVlIiwic2V0X25vZGVfdmFsdWUiLCJzY3JvbGxfd2lkdGgiLCJzY3JvbGxfaGVpZ2h0IiwiY2xpZW50X3dpZHRoIiwiY2xpZW50X2hlaWdodCIsInNjcm9sbF9sZWZ0Iiwic2Nyb2xsX3RvcCIsInNldF9zY3JvbGxfbGVmdCIsInNldF9zY3JvbGxfdG9wIiwic3R5bGUiLCJzZXRfYXR0cmlidXRlIiwicmVtb3ZlX2F0dHJpYnV0ZSIsInNldF9wcm9wZXJ0eSIsImRlbGV0ZV9wcm9wZXJ0eSIsImZvY3VzIiwiYmx1ciIsInRpdGxlIiwic2V0X3RpdGxlIiwiZmluZCIsImRvYyIsImNyZWF0ZV9lbGVtZW50IiwidGFnIiwiY3JlYXRlX3RleHRfbm9kZSIsInRleHQiLCJjcmVhdGVfZWxlbWVudF9ucyIsIm5hbWVzcGFjZSIsImNyZWF0ZV9kb2N1bWVudF9mcmFnbWVudCIsImdvIiwiaGlzdG9yeSIsInB1c2hfc3RhdGUiLCJyZXBsYWNlX3N0YXRlIiwiaHJlZiIsInByb3RvY29sIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJhc3NpZ24iLCJsb2NhdGlvbiIsInJlbG9hZCIsImdldCIsImV2ZW50X3RhcmdldCQwIiwiZG9jdW1lbnQiLCJvbl9uZXh0X2FuaW1hdGlvbiIsIm5vdyIsInllYXIiLCJtb250aCIsImRheSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaSIsIm9mX3ZhbHVlIiwiZCIsInpvbmVfb2Zmc2V0IiwiZGF0ZSIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiLCJlbXB0eSIsImZpbmRfb3B0Iiwia2V5IiwiZCIsImkiLCJ2IiwiayIsImFkZCIsInZhbHVlIiwibiIsInNldCIsImYiLCJpZHgiLCJvZl9saXN0IiwibHN0IiwidGwiLCJmb2xkIiwiYWNjdSIsIml0ZXIiLCJkaWN0IiwiZGlmZiIsInJlbW92ZSIsImQxIiwiZDIiLCJ2YWx1ZTIiLCJ1dGMiLCJtYWtlIiwibWludXRlcyIsIm9mZnNldCIsInpvbmUiLCJ6ZXJvIiwiYWRhcHQiLCJ0aW1lIiwieWVhciIsIm1vbnRoIiwiZGF5X29mX21vbnRoIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpX3NlY29uZCIsInN0cmluZyIsInBhcnNlIiwic3RyIiwic3RyaW5nJDAiLCJsb2MiLCJpc19wYWdlIiwiaGFuZGxlciIsInJlZiIsImUiLCJ1cGRhdGUiLCJhY3R1YWwiLCJmaXJlIiwibWFwIiwiYSIsIm1ha2Vfb25lIiwiZGlzcGF0Y2giLCJldmVudCIsImRlY29kZSIsInByZXZlbnQiLCJzdG9wIiwibSIsIm1ha2VfbGlzdCIsInRhcmdldCIsImV2ZW50X3R5cGUiLCJ1cGRhdGUkMCIsImVtcHR5JDAiLCJtYWtlX3RpbWVyIiwibWlsbGlzIiwiaCIsInJlbW92ZV90aW1lciIsInRpbWVyIiwic2V0JDAiLCJ1cGRhdGUkMSIsImVtcHR5JDEiLCJhZGQkMCIsInRhZyIsImhyZWYiLCJ1cmwiLCJtYWtlJDAiLCJzZXQkMSIsInZpcnQiLCJyZXEiLCJ1cGRhdGUkMiIsInZpcnQxIiwidmlydDIiLCJmMSIsImFjdHVhbCQwIiwiYWN0dWFsJDEiLCJzdHlsZSIsInByb3BlcnR5IiwiYXR0cmlidXRlIiwiYXR0cnMiLCJuYW1lIiwidmFsdWUkMCIsIm5hbWUkMCIsInZhbHVlJDEiLCJuYW1lJDEiLCJuYW1lJDIiLCJ0ZXh0IiwicyIsIm5vZGUiLCJub2RlX25zIiwibmFtZXNwYWNlIiwia2V5ZWQiLCJlbGVtZW50IiwiYWRkX2F0dHJpYnV0ZXMiLCJvcHMiLCJlbCIsInZkb20iLCJtYWtlX2NoaWxkcmVuIiwicmVhbF9jaGlsZHJlbiIsImNvbWJpbmVkX2NoaWxkcmVuIiwicGFyZW50IiwibHN0JDAiLCJhdHRycyQwIiwidGFnJDAiLCJyZWFsX2NoaWxkcmVuJDAiLCJjb21iaW5lZF9jaGlsZHJlbiQwIiwicGFyZW50JDAiLCJoZCIsImhkJDAiLCJoZDIiLCJ0bDIiLCJ0bDEiLCJ1cGRhdGVfYXR0cmlidXRlcyIsInBhciIsImF0dHJzMSIsImF0dHJzMiIsImRvbSIsInMyIiwiczEiLCJsc3QyIiwidGFnMiIsImxzdDEiLCJ0YWcxIiwidXBkYXRlX2NoaWxkcmVuIiwiY2hpbGRyZW4iLCJwYXIkMCIsImxzdDIkMCIsImF0dHJzMiQwIiwidGFnMiQwIiwibnMyIiwibHN0MSQwIiwiYXR0cnMxJDAiLCJ0YWcxJDAiLCJuczEiLCJjaGlsZHJlbiQwIiwicGFyJDEiLCJhdHRyczIkMSIsInRhZzIkMSIsImF0dHJzMSQxIiwidGFnMSQxIiwiY2hpbGRyZW4kMSIsInVwZGF0ZV9rZXllZCIsImRvbSQwIiwiZG9tJDEiLCJlbCQwIiwibmxzdDIiLCJubHN0MiQwIiwibHN0MiQyIiwibHN0MSQxIiwiaGQxIiwiaGQxJDAiLCJoZDExIiwibmxzdDIkMiIsImxzdDIkMSIsIm9sZF9lbCIsImNyZWF0ZWQiLCJoZDIkMCIsIm5ld19lbCIsIm5sc3QyJDEiLCJhdHRlbXB0IiwiY2xlYW51cCIsImV4biQwIiwiZXhuIiwiY29sIiwibGluZSIsImZpbGUiLCJtc2ciLCJqc19lcnJvciIsInJ1biIsInJhbmRvbSIsImNvbnN0YW50Iiwic3ltYm9sX2JpbmQiLCJzdGF0ZSIsImludCQwIiwiYm91bmQiLCJmbG9hdCQwIiwiYm9vbCIsImNob29zZSIsImFyciIsImxlbiIsImFic3VyZCIsImNvbnRpbnVlJDAiLCJ0YXNrIiwicG9zdCIsInN1Y2NlZWQiLCJmYWlsIiwicmVzdWx0IiwiciIsIm1ha2Vfc3VjY2VlZCIsInJlcyIsImxvZ19zdHJpbmciLCJsb2dfdmFsdWUiLCJzbGVlcCIsIm1zIiwibmV4dF90aWNrIiwic2VuZF90b19qYXZhc2NyaXB0IiwiZm9jdXMiLCJpZCIsImJsdXIiLCJyYW5kIiwiaHR0cF90ZXh0IiwibWV0aCIsImhlYWRlcnMiLCJib2R5Iiwic3RhdHVzIiwiaHR0cF9qc29uIiwibm93IiwidGltZV96b25lIiwibm9uZSIsImJhdGNoIiwib25fd2luZG93IiwiZXZlcnkiLCJjYWxsYmFjayIsIm9uX21lc3NhZ2UiLCJvbl91cmxfcmVxdWVzdCIsInN1YiIsImciLCJkZWNvZGUkMCIsImckMCIsImRlY29kZV9rZXlfZXZlbnQiLCJkZWNvZGVfbW91c2VfZXZlbnQiLCJ4IiwieSIsIm9uX2tleWRvd24iLCJvbl9rZXl1cCIsIm9uX21vdXNlX2Rvd24iLCJvbl9tb3VzZV9tb3ZlIiwib25fbW91c2VfdXAiLCJvbl9yZXNpemUiLCJ3aWR0aCIsImhlaWdodCIsIm9uX3Zpc2liaWxpdHlfY2hhbmdlIiwic3VicyIsIndpbmRvdyIsInRpbWVycyIsInVybF9yZXF1ZXN0IiwicGVyZm9ybSIsImp1c3RfZG8iLCJjbWQiLCJleGVjdXRlIiwiZXhlIiwidGFzayQwIiwiZG9jdW1lbnQiLCJkb21fb3BlcmF0aW9ucyIsImdldF9ib3RoIiwiZ2V0X2VsZW1lbnQiLCJkaWN0MSIsImRpY3QyIiwicmVhbHMiLCJuZXdfY2hpbGQiLCJvbGRfY2hpbGQiLCJjaGlsZCIsImRvYyIsImRhdGEiLCJ1cGRhdGVfZGF0YSIsInN0YXRlX2RpZmZlcmVudCIsInVwZGF0ZV9zdWJzY3JpcHRpb25zIiwiZGlzcGF0Y2hfbmV4dCIsInBvc3QkMCIsImNtZCQwIiwic3RhdGUkMCIsInB1dF9iZWxvd19yb290Iiwicm9vdF9ub2RlIiwidXBkYXRlX2RvbSIsInZpZXciLCJ2aWV3JDAiLCJ2aWV3JDEiLCJ0aXRsZSIsInNldF90aXRsZSIsInZkb20kMCIsIm9uX25leHRfYW5pbWF0aW9uIiwiYW5pbWF0ZSIsIndyYXBfc3RhdGVfZnVuIiwid3JhcF92aWV3Iiwid3JhcF9zdWJzY3JpcHRpb24iLCJ3cmFwX3VwZGF0ZSIsIm1lc3NhZ2UiLCJyZWNlaXZlX21lc3NhZ2UiLCJkYXRhJDAiLCJzdGFydF9hcHBsaWNhdGlvbiIsImNvbW1hbmQiLCJtYWtlX3NhbmRib3giLCJzYW5kYm94Iiwic2FuZGJveF9wbHVzIiwiZGF0YXJlZiIsImVsZW1lbnRfaWQiLCJpbml0Iiwicm9vdCIsImFwcGxpY2F0aW9uIiwiYmFzaWNfYXBwbGljYXRpb24iLCJkZWJ1ZyIsImRlYnVnX3ZhbHVlIiwib24iLCJvbl9jbGljayIsImZvbnRfc2l6ZSIsInNpemUiLCJjb2xvciIsImJhY2tncm91bmRfY29sb3IiLCJtYXJnaW4iLCJwYWRkaW5nIiwiYm9yZGVyX3N0eWxlIiwiYm9yZGVyX3dpZHRoIiwiYm9yZGVyX2NvbG9yIiwiY2xhc3MkMCIsInNyYyIsInBsYWNlaG9sZGVyIiwib25faW5wdXQiLCJoMSIsIm5vZGVzIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImRpdiIsInNwYW4iLCJwcmUiLCJwIiwiYnV0dG9uIiwiaW5wdXQiLCJsYWJlbCIsInRleHRhcmVhIiwic2VsZWN0Iiwib2wiLCJ1bCIsImxpIiwic3ZnX25vZGUiLCJkZWZhdWx0X2NpcmNsZSIsImNlbnRlcl94IiwiY2VudGVyX3kiLCJpbml0IiwidXBkYXRlIiwic3RhdGUiLCJpZCQxIiwiY2lyY2xlJDIiLCJpZCQyIiwiY2lyY2xlJDMiLCJjZW50ZXJfeSQwIiwiY2VudGVyX3gkMCIsInJhZGl1cyQxIiwiaWQkMyIsImNpcmNsZSQ0Iiwib2xkX3JhZGl1cyQwIiwiaWQkNCIsIm9sZF9yYWRpdXMiLCJpIiwidW5kbyIsImNpcmNsZSIsInVuZG8kMCIsInJhZGl1cyIsImlkIiwiY2lyY2xlJDAiLCJyZWRvJDAiLCJyZWRvIiwicmFkaXVzJDAiLCJpZCQwIiwiY2lyY2xlJDEiLCJ2aWV3X2NpcmNsZSIsImludF9hdHRyIiwia2V5Iiwidmlld19jaXJjbGVzIiwibHN0Iiwidmlld19yZXNpemUiLCJ2YWx1ZSIsInZpZXciLCJkaXNhYmxlZCIsImIiLCJkaXNhYmxlZF91bmRvIiwiZGlzYWJsZWRfcmVkbyIsIngiLCJ5Il0sInNvdXJjZXMiOlsiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK21sQnl0ZXMuanMiLCIvYnVpbHRpbi8rZmFpbC5qcyIsIi9idWlsdGluLytzdGRsaWIuanMiLCIvYnVpbHRpbi8rc3lzLmpzIiwiL2J1aWx0aW4vK2JhY2t0cmFjZS5qcyIsIi9idWlsdGluLytqc2xpYi5qcyIsIi9idWlsdGluLytmb3JtYXQuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rZWZmZWN0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rZnMuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK25hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytydW50aW1lX2V2ZW50cy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2JpZ2FycmF5LmpzIiwiL2J1aWx0aW4vK2ludHMuanMiLCIvYnVpbHRpbi8raGFzaC5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlX2ludGVybmFsaGFzaF90eXBlcy9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3BhcnNpbmcuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2RvbWFpbi5qcyIsIi9idWlsdGluLytjb21wYXJlLmpzIiwiL2J1aWx0aW4vK2pzbGliX2pzX29mX29jYW1sLmpzIiwiL2J1aWx0aW4vK2JpZ3N0cmluZy5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8rc3RyLmpzIiwiL2J1aWx0aW4vK2xleGluZy5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rd2Vhay5qcyIsIi9idWlsdGluLytwcm5nLmpzIiwiL2J1aWx0aW4vK3pzdGQuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3RpbWVfbm93L3J1bnRpbWUuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc3RkbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N5cy5tbC5pbiIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb2JqLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9hdG9taWMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbExhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3NlcS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb3B0aW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9yZXN1bHQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Jvb2wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VjaGFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2J5dGVzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zdHJpbmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VuaXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL21hcnNoYWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9mbG9hdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaW50MzIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2ludDY0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9uYXRpdmVpbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xleGluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcGFyc2luZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N0YWNrLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zZW1hcGhvcmUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RvbWFpbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9wcmludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FyZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcHJpbnRleGMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Z1bi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZ2MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RpZ2VzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYmlnYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3JhbmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaGFzaHRibC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvd2Vhay5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zY2FuZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FsbGJhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbE9PLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9jYW1saW50ZXJuYWxNb2QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2VwaGVtZXJvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZmlsZW5hbWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NvbXBsZXgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2luX2NoYW5uZWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL291dF9jaGFubmVsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9lZmZlY3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lX18ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc19vZl9vY2FtbF9fLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9pbXBvcnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2pzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3R5cGVkX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maWxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb21faHRtbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvZm9ybS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwveG1sSHR0cFJlcXVlc3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3dvcmtlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViU29ja2V0cy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViR0wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3JlZ2V4cC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvdXJsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9zeXNfanMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3Jlc2l6ZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9wZXJmb3JtYW5jZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9tdXRhdGlvbk9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc3RhYmxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc29uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9jU1MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9ldmVudHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9zdmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2V2ZW50U291cmNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maXJlYnVnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9nZW9sb2NhdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvaW50ZXJzZWN0aW9uT2JzZXJ2ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2ludGwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3BweF9pbmxpbmVfdGVzdC9jb25maWcvaW5saW5lX3Rlc3RfY29uZmlnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2dyYW1tYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9ncmFtbWFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2NvbnYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9lcnJvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wb2x5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbXBvcnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3ByaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zeXMwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2FycmF5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jaGFyMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2NvbXBhcmVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3BweF9oYXNoX2xpYi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3dvcmRfc2l6ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wcmV0dHlfcHJpbnRlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9leG4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvd2l0aF9yZXR1cm4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbW9uYWRfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tb25hZC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hcHBsaWNhdGl2ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlczAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvY29tcGFyYXRvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ZpZWxkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZzAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QxLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXJfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGF6eS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb21fcmVwci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXlfcGVybXV0ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9mbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2luZm8ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZXJyb3IubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW52YXJpYW50Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29yX2Vycm9yLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3NpZ24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NvbXBhcmFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pZGVudGlmaWFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdW5pdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JpbmFyeV9zZWFyY2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYmluYXJ5X3NlYXJjaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iaW5hcnlfc2VhcmNoYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ibGl0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW5kZXhlZF9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2VxdWVuY2UubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvb2JqX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3VuaWZvcm1fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2VudW1lcmF0ZV9saWIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnl0ZXNfdHIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhZ2VkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9oZXhfbGV4ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X2NvbnZlcnNpb25zLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Bvd19vdmVyZmxvd19ib3VuZHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X21hdGgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcG9wY291bnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdWNoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdHlwZV9lcXVhbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcHRpb25fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbl9vcl9uYW4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWF5YmVfYm91bmQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWFwX2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0X2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3JlZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ub3RoaW5nLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL25hdGl2ZWludC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGlua2VkX3F1ZXVlMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saW5rZWRfcXVldWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjNfZW11bC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ib29sLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDMyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDYzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmxfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hdmx0cmVlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaF9zZXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JhY2t0cmFjZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfc2V4cF9jb252L3J1bnRpbWUtbGliL3BweF9zZXhwX2NvbnZfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfZW51bWVyYXRlL3J1bnRpbWUtbGliL3BweF9lbnVtZXJhdGVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi90aW1lX25vdy90aW1lX25vdy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvcHB4X2lubGluZV90ZXN0L3J1bnRpbWUtbGliL3J1bnRpbWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC92b2lkLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2ludC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvcmJfYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvZGVxdWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9idHJlZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvYmFzZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZXZlbnQubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2V2ZW50X3RhcmdldC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvdGltZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL3dlYl93b3JrZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2h0dHBfcmVxdWVzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZG9tLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9qcy9kYXRlLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2RpY3Rpb25hcnkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGltZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci91cmwubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvaGFuZGxlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hdHRyaWJ1dGUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hc3NlcnRfZmFpbHVyZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGFzay5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9zdWJzY3JpcHRpb24ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvc3Vic2NyaXB0aW9ucy5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9jb21tYW5kLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2Jyb3dzZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvZm1saWJfYnJvd3Nlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvZXhhbXBsZXMvYnJvd3Nlci9jaXJjbGVzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zdGRfZXhpdC5tbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBME9BLFNBQVNBLG1CQUFtQkMsR0FBSyxTQUFRQSxXQUFZO0dDekxyRCxTQUFTQyxnQkFBZ0JDLEdBQUdDO0lBQzFCLEdBQUdELFFBQVE7SUFDWCxHQUFJQyxVQUFVLE9BQVFBLFNBQVNEO0lBQy9CLElBQUlFLFFBQVFDO0lBQ1osT0FBUTtLQUNOLEdBQUlILE9BQU9FLEtBQUtEO0tBQ2hCRDtLQUNBLEdBQUlBLFFBQVEsT0FBT0U7S0FDbkJELEtBQUtBO0tBQ0xFO0tBQ0EsR0FBSUEsUUFDRkY7O0dBS047R0Q3Q3NCLElBQWxCRyxvQkFBb0JDO0dFQXhCLFNBQVNDLG9CQUFxQkMsS0FBTyxNQUFNQSxJQUFLO0dDNEgzQixJQUFqQkM7R0RyRkosU0FBU0M7SUFDUEgsb0JBQW9CRTtHQUN0QjtHRnJDQSxTQUFTRSxRQUFTQyxJQUFHQyxJQUFHQztJQUN0QkMsVUFBVUg7SUFDVkcsVUFBVUY7SUFDVkUsVUFBVUQ7R0FDWjtHQUNBSDtHQUNBQTtlQUNFLFdBQVdBLFFBQVFJLFNBQVFBLFNBQVFBLFNBRFo7R0FJekJKO2FBQXVDWjtLQUNyQyxHQUFJZ0IsVUFBVWhCLE1BQU07S0FDcEIsR0FBSWdCLFVBQVVoQixNQUFNO0tBQ3BCLEdBQUlnQixVQUFVaEIsTUFBTTtLQUNwQixHQUFJZ0IsVUFBVWhCLE1BQU07S0FDcEIsR0FBSWdCLFVBQVVoQixNQUFNO0tBQ3BCLEdBQUlnQixVQUFVaEIsTUFBTTtLQUNwQjtJQVAyQjtHQVM3Qlk7YUFBc0NaO0tBQ3BDLElBQUllLEtBQUtDLGVBQ0xDLE1BQU1qQjtLQUNWLEdBQUllLEtBQUtFLEtBQUs7S0FDZCxHQUFJRixLQUFLRSxLQUFLO0tBQ2QsR0FBSUQsVUFBVWhCLE1BQU07S0FDcEIsR0FBSWdCLFVBQVVoQixNQUFNO0tBQ3BCLEdBQUlnQixVQUFVaEIsTUFBTTtLQUNwQixHQUFJZ0IsVUFBVWhCLE1BQU07S0FDcEI7SUFUMEI7R0FXNUJZOztLQUNFO01BQUlDLE9BQU9HO01BQ1BGLE9BQU9FLFdBQVdIO01BQ2xCRSxPQUFPQyxXQUFXRjtLQUN0QixXQUFXRixRQUFRQyxJQUFJQyxJQUFJQztJQUpMO0dBTXhCSDthQUFrQ1o7S0FDaEM7TUFBSWEsS0FBS0csVUFBVWhCO01BQ2ZjLEtBQUtFLFVBQVVoQixRQUFRYTtNQUN2QkUsS0FBS0MsVUFBVWhCLFFBQVFjO0tBQzNCLFdBQVdGLFFBQVFDLElBQUlDLElBQUlDO0lBSkw7R0FNeEJIO2FBQWtDWjtLQUNoQztNQUFJYSxLQUFLRyxVQUFVaEI7TUFDZmMsS0FBS0UsVUFBVWhCLFFBQVFhO01BQ3ZCRSxLQUFLQyxVQUFVaEIsUUFBUWM7S0FDM0IsV0FBV0YsUUFBUUMsSUFBSUMsSUFBSUM7SUFKTDtHQU14Qkg7YUFBa0NaO0tBQ2hDO01BQUlhLEtBQUtHLFVBQVVoQjtNQUNmYyxNQUFPRCxLQUFLUCx5QkFBMEJVLFVBQVVoQixPQUFPZ0IsVUFBVWhCO01BQ2pFZTtTQUFPRCxLQUFLUix5QkFBMEJVLFVBQVVoQixPQUFPZ0IsVUFBVWhCO1VBQU9nQixVQUFVaEI7S0FDdEYsV0FBV1ksUUFBUUMsSUFBSUMsSUFBSUM7SUFKTDtHQU14Qkg7ZUFDRSxRQUFRSSxVQUFRQSxVQUFRQSxjQURDO0dBRzNCSixxQ0FDRSxPQUFRSSxrQkFEZ0I7R0FHMUJKO2FBQWtDWjtLQUNoQyxXQUFXWSxRQUFRSSxVQUFVaEIsTUFBTWdCLFVBQVVoQixNQUFNZ0IsVUFBVWhCO0lBRHZDO0dBR3hCWTthQUFpQ1o7S0FDL0IsV0FBV1ksUUFBUUksVUFBUWhCLE1BQU1nQixVQUFRaEIsTUFBTWdCLFVBQVFoQjtJQURsQztHQUd2Qlk7YUFBa0NaO0tBQ2hDLFdBQVdZLFFBQVFJLFVBQVFoQixNQUFNZ0IsVUFBUWhCLE1BQU1nQixVQUFRaEI7SUFEakM7R0FHeEJZO2FBQXlDVDtLQUN2Q0EsSUFBSUE7S0FDSixHQUFJQSxRQUFRLE9BQU9hO0tBQ25CLEdBQUliO01BQVE7Y0FDQ1M7ZUFBU0ksV0FBV2I7ZUFDVmEsV0FBV2IsSUFBTWEsZ0JBQWlCYjtlQUNsQ2EsV0FBV2IsSUFBTWEsZ0JBQWlCYjtLQUV6RCxHQUFJQTtNQUNGO2NBQVdTO2tCQUNTSSxXQUFZYixRQUNYYSxXQUFZYixTQUFZYSxnQkFBaUJiO0tBQ2hFLFdBQVdTLGNBQWNJLFdBQVliO0lBWlI7R0FjL0JTO2FBQW1EVDtLQUNqREEsSUFBSUE7S0FDSixHQUFJQSxRQUFRLE9BQU9hO0tBQ25CLEdBQUliO01BQ0Y7Y0FBV1M7ZUFDUkksV0FBV2IsSUFBTWEsZ0JBQWlCYjtlQUNsQ2EsV0FBV2IsSUFBTWEsZ0JBQWlCYjtlQUNsQ2EsV0FBV2I7S0FDaEIsR0FBSUE7TUFDRjtjQUFXUztlQUNSSSxXQUFZYixTQUFZYSxnQkFBaUJiLEdBQ3pDYSxXQUFZYjtLQUVqQixXQUFXUyxRQUFTSSxXQUFZYjtJQWJPO0dBZXpDUzthQUEwQ1Q7S0FDeENBLElBQUlBO0tBQ0osR0FBSUEsUUFBUSxPQUFPYTtLQUNiLElBQUZFLElBQUtGO0tBQ1QsR0FBSWI7TUFDRjtjQUFXUztlQUNSSSxXQUFXYixJQUFNYSxnQkFBaUJiO2VBQ2xDYSxXQUFXYixJQUFNZSxVQUFXZjtlQUMzQmEsaUJBQWtCYjtLQUNmLElBQUxnQixPQUFRSDtLQUNaLEdBQUliO01BQ0Y7Y0FBV1M7ZUFDUkksV0FBWWIsU0FBWWEsZ0JBQWlCYjtlQUN6Q2EsaUJBQW1CYjtlQUNwQmdCO0tBQ0osV0FBV1AsUUFBVUksaUJBQW1CYixRQUFTZ0IsTUFBTUE7SUFmekI7R0FpQmhDUDs7S0FDRUksVUFBV0EsZUFBaUJBO0tBQzVCQSxXQUFZQSxlQUFpQkE7S0FDN0JBLFVBQVdBO0lBSFk7R0FLekJKOztLQUNFSSxXQUFZQSxnQkFBa0JBO0tBQzlCQSxXQUFZQSxnQkFBa0JBO0tBQzlCQSxVQUFVQTtJQUhhO0dBS3pCSjthQUFzQ1o7S0FDcEM7TUFBSW9CO01BQ0FDLFVBQVVMO01BQ1ZNLFVBQVV0QjtNQUNWdUIsZUFBZVg7S0FDbkIsTUFBT1MsaUJBQWlCQyxhQUFjLENBQ3BDRixVQUNBRTtLQUVGLE1BQU9GLFlBQWE7TUFDbEJBO01BQ0FHO01BQ0EsR0FBSUYsaUJBQWlCQyxjQUFlO09BQ2xDQztPQUNBRixVQUFVQSxZQUFZQzs7TUFFeEJBOztLQUVGLGtCQUFvQkMsbUJBQW9CRjtJQWxCZDtHQW9CNUJUO2FBQWtDWTtLQUUxQixJQUFGeEIsSUFBSWdCO0tBQ1IsR0FBSVEsWUFBWWI7S0FDUCxJQUFMUSxPQUFPbkIsT0FBT3dCO0tBQ2xCLEdBQUl4QixlQUFlQSxJQUFJQTtLQUN2QixHQUFJd0IsZUFBZUEsSUFBSUE7S0FDakIsSUFBRkMsSUFBSXpCLFVBQVV3QjtLQUNsQixHQUFJTCxlQUFlTSxJQUFJQTtLQUN2QixPQUFPQTtJQVRlO0dBV3hCYjthQUFrQ1k7S0FFMUIsSUFBRnhCLElBQUlnQjtLQUNSLEdBQUlRLFlBQVliO0tBQ1AsSUFBTFEsT0FBT25CO0tBQ1gsR0FBSUEsZUFBZUEsSUFBSUE7S0FDdkIsR0FBSXdCLGVBQWVBLElBQUlBO0tBQ2pCLElBQUZwQixJQUFJSixVQUFVd0I7S0FDbEIsR0FBSUwsZUFBZWYsSUFBSUE7S0FDdkIsT0FBT0E7SUFUZTtHQVd4QlEscUNBQ0UsT0FBT0ksVUFBV0EsY0FETTtHQUcxQko7O0tBQ0UsUUFBU0ksaUJBQWlCVCxrQkFBa0JTLFVBQVVUO2NBQW1CUztJQUQvQztHQUc1Qko7O0tBQ0UsUUFBUUk7YUFDQUE7YUFDQUE7YUFDQ0E7YUFDREE7YUFDQUE7YUFDQ0E7YUFDREE7SUFSa0I7R0FVNUJKO2VBQ0UsT0FBT0ksV0FBWUEsc0JBREk7R0FHekJKO2VBQ0UsT0FBU0kseUJBQTRCQSxjQURkO0dBdUR6QixTQUFTVSxvQkFBcUIxQjtJQUM1QixXQUFXWSxRQUFRWixjQUFlQSxvQkFBc0JBO0dBQzFEO0dBR0EsU0FBUzJCLG9CQUFxQjNCLEdBQUssT0FBT0EsVUFBVTtHQWpDcEQsU0FBUzRCLHVCQUF1QjVCLEdBQUssU0FBUUEsVUFBVztHQWhCeEQsU0FBUzZCLGVBQWdCN0IsR0FBSyxPQUFPQSxRQUFRO0dDMmU3QyxTQUFTOEIsdUJBQXVCOUIsR0FBSyxPQUFPQSxFQUFFO0dHMWxCOUMsU0FBUytCLGdCQUFnQjdCO0lBQ1gsSUFBUjhCLFVBQVVDO0lBRWQsR0FBR0QsV0FDR0EsZUFDQUEsWUFBWTlCLE1BQU1nQztLQUN0QixPQUFPRixZQUFZOUI7SUFDckIsR0FBRytCLDhCQUNHQSwyQkFBMkIvQjtLQUMvQixPQUFPK0IsMkJBQTJCL0I7R0FDdEM7R0NwRytCLElBQTNCaUM7R0FFSjtNQUNRLElBQUYvQixJQUFJMkI7TUFDUixHQUFHM0IsTUFBTThCLFVBQVU7T0FDWCxJQUFGN0IsSUFBSUQ7T0FDUixJQUFVLElBQUZnQyxPQUFPQSxJQUFJL0IsVUFBVStCO1FBQUksR0FDNUIvQixFQUFFK0IsVUFBVztTQUFFRDtTQUFnQzs7Z0JBQ3pDOUIsRUFBRStCO1NBQ1RELCtCQUErQjlCLEVBQUUrQjs7U0FDOUI7O0tBUlY7O0dDdUpELFNBQVNDLDJCQUEyQkMsS0FBS0M7SUFFdkMsS0FBSUQsZ0JBQWdCQyxTQUFTRDtLQUFlQSxtQkFBbUJMO0lBQy9ELE9BQU9LO0dBQ1Q7R0FiQSxTQUFTRSw0QkFBNEJGLEtBQUtDO0lBQ3hDLE9BQUdKO2NBQ01FLDJCQUEyQkMsS0FBS0M7Y0FDN0JEO0dBQ2Q7R0poSkEsU0FBU0csb0JBQXFCaEMsS0FBS2lDO0lBQU8sTUFBTUYsZ0NBQWdDL0IsS0FBS2lDO0dBQU87R0Q0cUI1RixTQUFTQyx1QkFBdUIzQyxHQUFLLE9BQU9BLEVBQUU7R0NwcUI5QyxTQUFTNEMsdUJBQXdCbkMsS0FBS29DO0lBQ3BDSixvQkFBcUJoQyxLQUFLa0MsdUJBQXVCRTtHQUNuRDtHQWFBLFNBQVNDLHNCQUF1QkQ7SUFDOUJELHVCQUF1QmxDLG1DQUFtQ21DO0dBQzVEO0dLNUJBLFNBQVNFLGtCQUFtQkM7SUFDMUJBLE1BQU1sQix1QkFBdUJrQjtJQUNyQixJQUFKQyxNQUFNRDtJQUNWLEdBQUlDLFVBQVVIO0lBQ1I7S0FBRkk7Ozs7Ozs7Ozs7OztJQUlKLElBQVcsSUFBRmQsT0FBT0EsSUFBSWEsS0FBS2IsSUFBSztLQUN0QixJQUFGZSxJQUFJSCxXQUFXWjtLQUNuQixPQUFRZTs7UUFFTkQsaUJBQWlCOzs7UUFFakJBLGNBQWNDLEdBQUc7O1FBRWpCRCxnQkFBZ0I7O1FBRWhCQSxvQkFBb0I7Ozs7Ozs7Ozs7UUFHcEJBO1FBQ0EsTUFBT0MsSUFBRUgsZUFBZVosU0FBU2UsVUFBVUEsT0FBUSxDQUNqREQsVUFBVUEsZUFBZUMsR0FBR2Y7UUFFOUJBO1FBQ0E7O1FBRUFjO1FBQ0FkO1FBQ0EsTUFBT2UsSUFBRUgsZUFBZVosU0FBU2UsVUFBVUEsT0FBUSxDQUNqREQsU0FBU0EsY0FBY0MsR0FBR2Y7UUFFNUJBOzs7UUFFQWM7O1FBRUFBLGFBQWE7O1FBRWJBLGFBQWE7O1FBRWJBLGFBQWFBLG9CQUFvQjs7UUFFakNBLFlBQVk7Ozs7UUFFWkEscUJBQXFCQSxTQUFTQyxHQUFHOzs7O1FBRWpDRDtRQUFxQkE7UUFDckJBLFNBQVNDO1FBQWtCOzs7SUFHL0IsT0FBT0Q7R0FDVDtHQUlBLFNBQVNFLHVCQUF1QkYsR0FBR0c7SUFDakMsR0FBSUgsYUFBYUcsWUFBWUE7SUFDckIsSUFBSkosTUFBTUk7SUFFVixHQUFJSCxpQkFBaUJBLGNBQWNBLHFCQUFxQkQ7SUFDeEQsR0FBSUMsWUFBYSxDQUNmLEdBQUlBLGFBQWFELFVBQ2pCLEdBQUlDLGNBQWNEO0lBR1QsSUFBUEs7SUFDSixHQUFJSixvQkFBb0JBO0tBQ3RCLElBQVcsSUFBRmQsSUFBSWEsS0FBS2IsSUFBSWMsU0FBU2QsS0FBS2tCO0lBQ3RDLEdBQUlKO0tBQWMsR0FDWkE7TUFBWUk7YUFDUEosb0JBQW9CSSxVQUFVSjtJQUV6QyxHQUFJQSxlQUFlQSxhQUFhSTtJQUNoQyxHQUFJSixlQUFlQSxjQUFjSSxVQUFVSjtJQUMzQyxHQUFJQSxvQkFBb0JBO0tBQ3RCLElBQVcsSUFBRmQsSUFBSWEsS0FBS2IsSUFBSWMsU0FBU2QsS0FBS2tCO0lBQ3RDQSxVQUFVRDtJQUNWLEdBQUlILGtCQUNGLElBQVcsSUFBRmQsSUFBSWEsS0FBS2IsSUFBSWMsU0FBU2QsS0FBS2tCO0lBQ3RDLE9BQU9YLHVCQUF1Qlc7R0FDaEM7R1A0TEEsU0FBU0Msa0JBQW1CUCxLQUFLaEQ7SUFDekIsSUFBRmtELElBQUlILGtCQUFrQkM7SUFDMUIsR0FBSUUsZ0JBQWdCdEIsdUJBQXVCNUIsR0FBSSxDQUM3Q2tELGNBQWFsRCxJQUFJNkIsZUFBZTdCO0lBRWxDO0tBQUlzRDtLQUNBRSxRQUFROUIsb0JBQW9Cd0I7S0FDNUJPO0lBQ0osRUFBRztLQUNLLElBQUZDLElBQUkxRCxVQUFVd0Q7S0FDbEJ4RCxJQUFJMEQ7S0FDSkosU0FBU0csYUFBYTlCLG9CQUFvQitCLGNBQWNKOzs7UUFDL0N2RCxtQkFBbUJDO0lBQzlCLEdBQUlrRCxZQUFhO0tBQ2ZBO0tBQ00sSUFBRmhELElBQUlnRCxTQUFTSTtLQUNqQixHQUFJcEQsT0FBT29ELFNBQVNyRCxnQkFBaUJDLFVBQVVvRDs7SUFFakQsT0FBT0YsdUJBQXVCRixHQUFHSTtHQUNuQztHUTNDQSxTQUFTSyxpQkFBa0IzRCxHQUFLLE9BQU9PLFdBQVdQLEdBQUk7R0N6RnRELFNBQVM0RCw0QkFBNEJDLEdBQ2pDLFNBQ0o7R1JmQSxTQUFTQyxjQUFlM0Q7SUFFdEIsR0FBSUEsY0FBZTtLQUVqQixJQUFXLElBQUZpQyxPQUFPQSxJQUFJakMsVUFBVWlDLEtBQUssR0FBSWpDLGFBQWFpQyxVQUFVO0tBQzlEOzs7S0FFQSxTQUFRLG9CQUFvQmpDO0dBQ2hDO0dBdkRBLFNBQVM0RCxtQkFBbUI1RDtJQUMxQixRQUFTNkQsUUFBUUgsUUFBUVYsR0FBR2MsSUFBSUMsSUFBSUMsR0FBRy9CLE9BQU8vQixJQUFJRixVQUFVaUMsSUFBSS9CLEdBQUcrQixJQUFLO0tBQ3RFNkIsS0FBSzlELGFBQWFpQztLQUNsQixHQUFJNkIsVUFBVztNQUNiLElBQVcsSUFBRkcsSUFBSWhDLE9BQVFnQyxJQUFJL0QsTUFBTzRELEtBQUs5RCxhQUFhaUUsWUFBWUEsS0FBSTtNQUNsRSxHQUFJQSxJQUFJaEMsUUFBUztPQUFFeUI7T0FBZ0JHLEtBQUtIO09BQUdBO09BQVFHLEtBQUs3RCxRQUFRaUMsR0FBR2dDOzs7T0FDOURQLEtBQUsxRCxRQUFRaUMsR0FBR2dDO01BQ3JCLEdBQUlBLEtBQUsvRCxHQUFHO01BQ1orQixJQUFJZ0M7O0tBRU5EO0tBQ0EsS0FBTy9CLElBQUkvQixPQUFTNkQsS0FBSy9ELGFBQWFpQyxtQkFBb0I7TUFDeERlLElBQUllLE1BQU1EO01BQ1YsR0FBSUEsVUFBVztPQUNiRSxJQUFJaEI7T0FDSixHQUFJZ0IsVUFBVUE7O1VBQ1Q7T0FDTEE7T0FDQSxLQUFPL0IsSUFBSS9CLE9BQVM2RCxLQUFLL0QsYUFBYWlDLG1CQUFvQjtRQUN4RGUsSUFBSWUsTUFBTWY7UUFDVixHQUFJYyxVQUFXO1NBQ2JFLElBQUloQjtTQUNKLEdBQUtnQixhQUFnQkEsZUFBaUJBLFlBQWNBOztZQUMvQztTQUNMQTtTQUNBLEtBQU8vQixJQUFJL0IsT0FBUzZELEtBQUsvRCxhQUFhaUMsc0JBQ2pDNkIsVUFBWTtVQUNmRSxJQUFJRCxrQkFBa0JmO1VBQ3RCLEdBQUlnQixlQUFlQSxjQUFjQTs7Ozs7O0tBTTNDLEdBQUlBLE1BQU87TUFDVC9CLEtBQUsrQjtNQUNMTjs7YUFDU007TUFDVE4sS0FBS1EsOEJBQThCRixvQkFBb0JBOztNQUV2RE4sS0FBS1Esb0JBQW9CRjtLQUMzQixHQUFJTixnQkFBaUIsQ0FBQ0EsZ0JBQWdCRyxLQUFLSCxHQUFHQTs7SUFFaEQsT0FBT0csSUFBRUg7R0FDWDtHQTRpQkEsU0FBU1Msd0JBQXdCbkU7SUFDL0IsR0FBRzJELGNBQWMzRCxJQUNmLE9BQU9BO0lBQ1QsT0FBTzRELG1CQUFtQjVEO0dBQUk7R1M1ckJoQyxTQUFTb0U7SUFDUCxjQUNTdEM7cUJBQ0tBO3FCQUNBQTtHQUNoQjtHQzBCQSxTQUFTdUM7SUFDUCxTQUFTQyxNQUFNQztLQUNiLEdBQUlBLHdCQUF3QixZQUFZQTtLQUN4QztJQUNGO0lBRUEsU0FBU0MsTUFBTUQ7S0FFYjtNQUFJRTs7TUFDQUMsU0FBU0QsbUJBQW1CRjtNQUM1QkksU0FBU0Q7TUFDVEUsUUFBUUMsUUFBUUYsVUFBVUE7S0FHOUIsR0FBSUUsUUFBUUgsYUFBYUUsT0FBUTtNQUMvQixJQUFJRSxPQUFRSixpQkFDUkssTUFBT0w7TUFDWCxRQUFRSSxNQUFNUCxlQUFlTyxjQUFjQzs7S0FFN0M7SUFDRjtJQUNBLE9BQUdYLHVCQUF3QnRDO2VBQXNCQTtjQUN4Q0EsMENBQTBDMEMsUUFBUUY7Y0FFL0NBO0dBQ2Q7R0FDcUIsSUFBakJVLG1CQUFtQlg7R0F2RHZCLFNBQVNZLG9CQUFvQkM7SUFDM0IsT0FBUUEsMEJBQTJCQSxhQUFjQTtHQUNuRDtHQUlBLEdBQUdkLHVCQUF3QnRDLHNCQUFzQkE7SUFDMUIsSUFBakJxRCxtQkFBbUJyRDs7SUFFRixJQUFqQnFEO0dBQ05BLG1CQUFtQkYsb0JBQW9CRTtHQWtEdkMsU0FBU0MsZUFBZ0JGO0lBQ3ZCQSxPQUFLZix3QkFBd0JlO0lBQzdCLEtBQUtGLGlCQUFpQkUsT0FDcEJBLE9BQU9DLG1CQUFtQkQ7SUFDNUI7S0FBSUcsUUFBUUwsaUJBQWlCRTtLQUN6QkksT0FBT0Q7S0FDUEU7SUFDSixJQUFVLElBQUZ0RCxPQUFPQSxJQUFFcUQsYUFBYXJEO0tBQUksT0FDekJxRCxLQUFLckQ7O1FBQ0QsR0FBR3NELGtCQUFnQkEsYUFBYTtpQkFDakM7Z0JBQ0Q7Z0JBQ0FBLFdBQVdELEtBQUtyRCxLQUFJOztJQUcvQnNELGNBQWNGO0lBQ2RFLGFBQWFMO0lBQ2IsT0FBT0s7R0FDVDtHVmxCQSxTQUFTQyxtQkFBbUJ4RjtJQUMxQixRQUFTNkQsUUFBUUgsSUFBSUcsR0FBR2IsR0FBR3lDLEdBQUd4RCxPQUFPL0IsSUFBSUYsVUFBVWlDLElBQUkvQixHQUFHK0IsSUFBSztLQUM3RGUsSUFBSWhELGFBQWFpQztLQUNqQixHQUFJZSxTQUFVO01BQ1osSUFBVyxJQUFGaUIsSUFBSWhDLE9BQVFnQyxJQUFJL0QsTUFBTzhDLElBQUloRCxhQUFhaUUsWUFBWUEsS0FBSTtNQUNqRSxHQUFJQSxJQUFJaEMsUUFBUztPQUFFeUI7T0FBZ0JHLEtBQUtIO09BQUdBO09BQVFHLEtBQUs3RCxRQUFRaUMsR0FBR2dDOzs7T0FDOURQLEtBQUsxRCxRQUFRaUMsR0FBR2dDO01BQ3JCLEdBQUlBLEtBQUsvRCxHQUFHO01BQ1orQixJQUFJZ0M7O0tBRU4sR0FBSWpCLFVBQVc7TUFDYlUsS0FBS1EsMkJBQTRCbEI7TUFDakNVLEtBQUtRLDJCQUE0QmxCOzthQUN4QkEsY0FBY0E7TUFDdkJVO09BQUtRO2dCQUE0QmxCLGdCQUNDQSxzQkFDREE7O09BQ3hCQSxlQUFlZixTQUFTL0IsTUFDdkJ1RixJQUFJekYsYUFBYWlDO1VBQW9Cd0Q7TUFFL0MvQjtTQUNLO01BQ0x6QjtNQUNBZSxLQUFLQSxXQUFXeUM7TUFDaEIvQjtPQUFLUTtnQkFBNEJsQjtnQkFDQ0E7Z0JBQ0FBO2dCQUNEQTs7S0FFbkMsR0FBSVUsZ0JBQWlCLENBQUNBLGdCQUFnQkcsS0FBS0gsR0FBR0E7O0lBRWhELE9BQU9HLElBQUVIO0dBQ1g7R0FtbUJBLFNBQVNnQyx3QkFBeUIxRjtJQUNoQyxPQUFJMkQsY0FBYzNEO2NBQ1R3Qyx1QkFBdUJ4QztjQUNwQndDLHVCQUF1QmdELG1CQUFtQnhGO0dBQ3hEO0dXcG9CZTtJQUFYMkY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlCSixTQUFTQyxtQkFBbUJDLE1BQU1DLFNBQVN2QixNQUFNd0I7SUFDbkMsSUFBUkMsVUFBVUwsbUJBQW1CRTtJQUNqQyxHQUFJRyxZQUFhLENBRWYsR0FBSUQsU0FBU0UsTUFDWEYsZ0JBR0ZDLGNBQW1CRDtJQUVaO0tBQUxHO1FBQ0ZGO1FBQ0FOLHdCQUF3Qkk7UUFDeEJKLHdCQUF3Qm5CO0lBRTFCLE9BQU8yQjtHQUNUO0dUVXNCLElBQWxCQztHQVdKLFNBQVNDLGlCQUFpQkMsSUFDeEIsT0FBT0Ysa0JBQWtCRSxJQUMzQjtHRGpIQSxTQUFTQyxxQkFBc0JoRyxLQUFLNEY7SUFBUSxNQUFNN0QsNEJBQTRCLElBQUkvQixZQUFZNEY7R0FBUTtHRDRDdEcsU0FBU0sseUJBQTBCQyxHQUFHdkUsR0FBR2E7SUFDakMsSUFBRkMsSUFBSW1CO0lBQ1IsR0FBSWpDLFVBQVVhLGVBQWVBLE9BQU8wRCxVQUFVLE9BQU96RCxRQUFTa0QsTUFBTU87SUFDOUQsSUFBRnhHO0lBQ0osVUFBVzhDLEtBQUtiLFdBQVVhO0tBQ3hCOUMsS0FBSytDLFFBQVNrRCxNQUFNTyxRQUFRdkUsR0FBRUEsSUFBSTdCLFNBQVMwQztJQUM3QyxPQUFPOUM7R0FDVDtHQTJXQSxTQUFTeUcsNkJBQThCekc7SUFFckMsR0FBSUE7S0FDRkEsT0FBT0YsZ0JBQWdCRSxNQUFNQTs7S0FFN0JBLE1BQU11Ryx5QkFBMEJ2RyxRQUFRQTtJQUMxQ0E7R0FDRjtHQXRDQSxTQUFTMEcsUUFBU3BHLEtBQUtxRyxVQUFVQztJQUMvQi9GLFNBQU9QO0lBQUtPLFNBQU84RjtJQUFVOUYsU0FBTytGO0dBQ3RDO0dBQ0FGOztLQUNFLE9BQVE3Rjs7UUFFTixPQUFPQTtnQkFFUDRGLDZCQUE2QjVGOztRQUU3QixHQUFJOEMsY0FBYzlDLFFBQVMsQ0FDekJBLFlBQ0EsT0FBT0EsU0FFVEE7O1FBRUEsT0FBT0E7O0lBYmtCO0dBZ0I3QjZGOztLQUNRLElBQUZ6RyxJQUFJWTtLQUNSLEdBQUdBLGFBQWEsT0FBT1o7S0FDdkIsT0FBTzJELG1CQUFtQjNEO0lBSEE7R0FLNUJ5Rzs7S0FDYyxJQUFSRyxVQUFVaEcsY0FBY0EsaUJBQWlCQTtLQUM3QyxXQUFXNkYsUUFBUTdGLFFBQU9nRyxTQUFRaEc7SUFGVjtHQW1ZMUIsU0FBU2lHLGlCQUFpQjlHLEdBQ3hCLE9BQVFBLGFBQWEwRyxRQUN2QjtHQWtCQSxTQUFTSyxrQkFBa0IvRztJQUN6QixjQUFlQSxvQkFBbUIsb0JBQW9CQTtHQUN4RDtHQTdVQSxTQUFTZ0gsb0JBQXFCUjtJQUM1QixNQUFNQSxhQUFhUyxhQUNqQlQsUUFBUVMsV0FBV1Q7SUFFckIsV0FBV0UsV0FBVUYsR0FBRUE7R0FDekI7R0F5TkEsU0FBU1Usc0JBQXNCbEgsR0FBSyxXQUFXMEcsV0FBVTFHLEdBQUVBLFVBQVc7R0EvQnRFLFNBQVNtSCxxQkFBcUJuSDtJQUM1QixPQUFPa0gsc0JBQXNCdkYsdUJBQXVCM0I7R0FDdEQ7R0czcUJBLFNBQVNvSCxxQkFBc0IxRTtJQUM3QkQsdUJBQXVCbEMsNEJBQTRCbUM7R0FDckQ7R093S0EsU0FBUzJFLHdCQUF3Qm5DO0lBQy9Ca0MscUJBQXNCbEM7R0FDeEI7R1ZtUUEsU0FBU29DLDRCQUE2QnRIO0lBRXBDLElBQUl3RyxRQUFRUyxXQUFXakgsTUFDbkI2RCxJQUFJN0QsS0FBS0UsSUFBSTJELFVBQVU1QjtJQUMzQixNQUFPQSxJQUFJL0IsR0FBRytCLEtBQUt1RSxFQUFFdkUsS0FBSzRCLGFBQWE1QjtJQUN2QyxJQUFLL0IsSUFBSUYsS0FBS2lDLElBQUkvQixHQUFHK0IsS0FBS3VFLEVBQUV2RTtJQUM1QmpDLE1BQU13RztJQUNOeEc7SUFDQSxPQUFPd0c7R0FDVDtHQUlBLFNBQVNlLDBCQUEyQnZIO0lBQ2xDLEdBQUlBLFVBQXNCc0gsNEJBQTRCdEg7SUFDdEQsT0FBT0E7R0FDVDtHQThCQSxTQUFTd0gsa0JBQWtCMUU7SUFDekIsR0FBSUEsU0FBU0g7SUFDYixXQUFXK0QsUUFBUTVELGlCQUFXQTtHQUNoQztHQWdKQSxTQUFTMkUscUJBQXFCekgsR0FBSyxPQUFPQSxJQUFJO0dBdkM5QyxTQUFTMEgsZ0JBQWdCQyxJQUFJQyxJQUFJQyxJQUFJQyxJQUFJaEY7SUFDdkMsR0FBSUEsVUFBVTtJQUNkLEdBQUtnRixZQUNBaEYsT0FBTytFLFFBQVNBLGFBQTJCL0UsT0FBTytFLGFBQWU7S0FDcEVBO01BQVFGO1NBQ05wQix5QkFBeUJvQixNQUFNQyxJQUFJOUU7U0FDbEM4RSxXQUFXRCxlQUFlN0UsTUFBSzZFLE9BQUtBLFlBQVlDLElBQUk5RTtLQUN2RCtFLE9BQVFBLGVBQWVBOztZQUNkQSxhQUEyQkMsTUFBTUQsWUFBYTtLQUN2REE7TUFBU0Y7U0FDUHBCLHlCQUF5Qm9CLE1BQU1DLElBQUk5RTtTQUNsQzhFLFdBQVdELGVBQWU3RSxNQUFLNkUsT0FBS0EsWUFBWUMsSUFBSTlFO0tBQ3ZEK0UsT0FBUUEsZUFBZUE7O1FBQ2xCO0tBQ0wsR0FBSUEsV0FBdUJQLDRCQUE0Qk87S0FDdkQsSUFBSS9ELEtBQUs2RCxNQUFNNUQsS0FBSzhEO0tBQ3BCLEdBQUlGO01BQXVCLEdBQ3JCRyxNQUFNRjtPQUFJLElBQ0QsSUFBRjNGLE9BQU9BLElBQUlhLEtBQUtiLEtBQUs4QixHQUFJK0QsS0FBSzdGLEtBQUs2QixHQUFJOEQsS0FBSzNGOztPQUNoRCxJQUNNLElBQUZBLElBQUlhLFNBQVNiLFFBQVFBLEtBQUs4QixHQUFJK0QsS0FBSzdGLEtBQUs2QixHQUFJOEQsS0FBSzNGO1NBRXZEO01BQ0MsSUFBRi9CLElBQUlFLFNBQVUwQyxLQUFLZ0IsWUFBWThEO01BQ25DLElBQVcsSUFBRjNGLE9BQU9BLElBQUkvQixHQUFHK0IsS0FBSzhCLEdBQUkrRCxLQUFLN0YsS0FBSzZCLGNBQWM4RCxLQUFLM0Y7TUFDN0QsTUFBT0EsSUFBSWEsS0FBS2IsS0FBSzhCLEdBQUkrRCxLQUFLN0Y7OztJQUdsQztHQUNGO0dVNWtCQSxTQUFTOEYsU0FBVztHRTZOcEIsU0FBU0MsV0FBV25CLFNBQ2xCaEcsWUFBWWdHLFFBQ2Q7R0FDQW1CLDJCQUEyQkQ7R0FDM0JDLG1DQUFtQ0E7R0FDbkNBO2FBQXlDbEY7S0FDL0IsSUFBSm1GLE1BQU1wSDtLQUNWQSxZQUFZMkcsa0JBQWtCMUU7S0FDOUI0RSxnQkFBZ0JPLFFBQVFwSCxjQUFjaUM7SUFIUjtHQUtoQ2tGO2VBQ0UsT0FBT1AscUJBQXFCNUcsV0FEQTtHQUc5Qm1IO2FBQXNDL0csUUFBT2lILEtBQUlDLEtBQUlyRjtLQUMxQyxJQUFMc0YsT0FBT3ZIO0tBQ1gsR0FBR0ksU0FBUzZCLE9BQU9zRixLQUFNO01BQ3ZCLElBQUlDLFVBQVViLGtCQUFrQnZHLFNBQVM2QixNQUNyQ3dGLFdBQVd6SDtNQUNmQSxZQUFZd0g7TUFDWlgsZ0JBQWdCWSxhQUFhekgsY0FBY3VIOztLQUU3Q1YsZ0JBQWdCVixvQkFBb0JrQixNQUFNQyxLQUFLdEgsV0FBV0ksUUFBUTZCO0tBQ2xFO0lBVDJCO0dBVzdCa0Y7YUFBcUMvRyxRQUFPaUgsS0FBSUMsS0FBSXJGO0tBQ3pDLElBQUxzRixPQUFPdkg7S0FDWCxHQUFHSSxTQUFTNkIsT0FBT3NGLE1BQ2pCdEYsTUFBTXNGLE9BQU9uSDtLQUVmLEdBQUc2QixJQUFLO01BQ0csSUFBTHlGLE9BQU9mLGtCQUFrQjFFO01BQzdCNEUsZ0JBQWdCN0csV0FBV0ksUUFBUXNILFNBQVN6RjtNQUM1Q29GLFFBQVFYLDBCQUEwQmdCLE9BQU9KOztLQUUzQyxPQUFPckY7SUFWbUI7R0F3RDVCLFNBQVMwRixTQUFTdEQsTUFBTXVELE1BQUtDO0lBQzNCN0gsWUFBWTRIO0lBQ1o1SCxZQUFZcUU7SUFDWnJFLGFBQWE2SDtHQUNmO0dBRUFGOztLQUNFcEIscUJBQXFCdkc7SUFEUztHQUdoQzJIO2VBQ0UsR0FBRzNILFdBQVcsT0FBT0Esb0JBQ3JCQSxrQkFGMEI7R0FJNUIySDthQUFxQ3ZILFFBQU9pSCxLQUFJQyxLQUFJckY7S0FDbEQsR0FBR2pDLFdBQVcsT0FBT0EsZ0JBQWdCSSxRQUFPaUgsS0FBSUMsS0FBSXJGO0tBQ3BEakM7SUFGeUI7R0FJM0IySDthQUFvQ3ZILFFBQVFpSCxLQUFLQyxLQUFLckY7S0FDcEQsR0FBR2pDLFdBQVcsT0FBT0EsZUFBZUksUUFBUWlILEtBQUtDLEtBQUtyRjtLQUN0RGpDO0lBRndCO0dBSTFCMkgsc0NBQ0UzSCxZQUFZa0IsVUFEYTtHQXRWM0IsU0FBUzRHLGFBQWM3RCxNQUFNL0I7SUFDM0JsQztJQUNBQSxZQUFZaUU7SUFDWmpFLGlCQUFpQmtDO0dBQ25CO0dBQ0E0RixxQ0FBcUN6RCxNQUNuQyxPQUFRckUsWUFBWXFFLEtBRE07R0FHNUJ5RDthQUF1RHpEO0tBQ3JELElBQUlJLE9BQU9KLGlCQUNQMEQ7S0FDSixJQUFVLElBQUYzRyxPQUFPQSxJQUFJcUQsaUJBQWlCckQsSUFBSTtNQUN0QzJHLE9BQU90RCxLQUFLckQ7TUFDWixHQUFHcEIsYUFBYStILE1BQU07TUFDdEIvSCxhQUFhK0gsT0FBT0M7O0lBTnNCO0dBUzlDRjthQUF3Q3pELE1BQ3RDLE9BQU8sV0FBV0EsUUFBTUEsT0FBTUEsV0FERDtHQUcvQnlEO2FBQXlDekQ7S0FDdkMsS0FBSXJFLGFBQWFxRSxTQUFTckUsZUFBZ0I7TUFDaEM7T0FBSitIO1NBQU0vSDtXQUFlMkIsdUJBQXVCM0IsWUFBWTJCLHVCQUF1QjBDO01BQ25GLEdBQUcwRCxVQUFXO09BQ1ovSCwwQkFBMEJxRTtPQUMxQnJFLGFBQWFxRSxZQUFVOEMsV0FBV2IscUJBQXFCeUI7OztJQUw3QjtHQVNoQ0Q7YUFBeUN6RDtLQUV2QyxHQUFHQSxZQUFZO0tBRUEsSUFBWDRELGFBQWFqSSxXQUFXcUU7S0FDNUIsR0FBR3JFLGFBQWFpSSxhQUFhO0tBRTdCakksWUFBWXFFO0tBQ1osT0FBT3JFLGFBQWFxRTtJQVJVO0dBVWhDeUQ7YUFBeUN6RCxNQUN2QyxPQUFHckUsWUFBWXFFLFdBQVVyRSxZQUFZcUUsY0FEUDtHQVFoQ3lEO2FBQXdDekQsTUFBSzZELE1BQU1DO0tBQ2xDLElBQVhyRCxhQUFhcUQsY0FBYzVDO0tBQy9CLEdBQUd2RixZQUFZcUU7TUFBTyxHQUNoQlM7T0FDRlc7U0FBcUJYLFlBQVlDLHNDQUFzQy9FLFFBQVFxRTs7T0FHL0VrQyxxQkFBcUJsQztLQUdkLElBQVArRCxTQUFTLG9CQUFvQi9EO0tBQ2pDK0QsU0FBVUEsVUFBVUE7S0FDcEIsS0FBSXBJLFlBQVlvSTtNQUFRLEdBQ2xCdEQ7T0FDRlc7U0FBcUJYLFlBQVlDLHNDQUFzQy9FLFFBQVFvSTs7T0FHL0U3QixxQkFBcUI2QjtLQUd6QixLQUFJcEksWUFBWW9JO01BQVEsR0FDbEJ0RDtPQUNGVztTQUFxQlgsWUFBWUMsdUNBQXVDL0UsUUFBUW9JOztPQUdoRjdCLHFCQUFxQjZCO0tBR3pCcEksMEJBQTBCQSxXQUFXcUU7SUE1QlI7R0E4Qi9CeUQ7YUFBd0N6RCxNQUFNOEQ7S0FDNUM7TUFBSXJELGFBQWFxRCxjQUFjNUM7TUFDM0IwQyxhQUFjNUQsa0JBQWdCckUsV0FBV3FFO01BQ3pDakYsUUFBUWlKLGFBQWFKO0tBQ3pCLEtBQUlqSSxZQUFZcUU7TUFBTyxHQUNqQlM7T0FDRlc7U0FBcUJYLFlBQVlDLHNDQUFzQy9FLFFBQVFxRTs7T0FHL0VrQyxxQkFBcUJsQztLQUd6QixLQUFJckUsWUFBWXFFO01BQU8sR0FDakJTO09BQ0ZXO1NBQXFCWCxZQUFZQyx1Q0FBdUMvRSxRQUFRcUU7O09BR2hGa0MscUJBQXFCbEM7S0FHekIsUUFBUW5GLEtBQUtjO01BQWMsR0FDdEJkLFFBQVFFO09BQUksR0FDVDBGO1FBQ0ZXO1VBQXFCWCxZQUFZQyx5Q0FBeUMvRSxRQUFRcUU7O1FBRWxGa0MscUJBQXFCdkcsUUFBUXFFO0tBSW5DLE9BQU9yRSxhQUFhaUk7SUE3QlM7R0ErQi9CSDthQUEwQ3pEO0tBQ3pCLElBQVg0RCxhQUFjNUQsa0JBQWdCckUsV0FBV3FFO0tBQzdDLEtBQUlyRSxZQUFZcUU7TUFDZGtDLHFCQUFxQmxDO0tBRXZCLEtBQUlyRSxZQUFZcUUsT0FDZGtDLHFCQUFxQmxDO0tBRXZCLElBQUlqRixRQUFRaUosYUFBYUoseUJBQ3JCSyxXQUNBM0M7S0FDSixRQUFRekcsS0FBS2MsYUFBYztNQUNuQixJQUFGdUksSUFBSXJKLFFBQVFFO01BQ2hCLEdBQUdtSixPQUFNRCxLQUFLQyxNQUFPLENBQUNELEtBQUtDLGNBQWM1QyxPQUFPNEM7O0tBRWxELE9BQU81QztJQWZ3QjtHQWlCakNtQzthQUEwQ3pELE1BQU04RDtLQUM5QztNQUFJckQsYUFBYXFELGNBQWM1QztNQUUzQkksSUFBSTNGLGFBQWFxRTtNQUNqQmxDO01BQ0FmO0tBQ0o7O2NBQ0UsR0FBSWU7ZUFBRyxHQUNEMkM7Z0JBQ0ZXO2tCQUFxQlg7a0JBQVlDLHdDQUF3Qy9FLFFBQVFxRTs7Z0JBR2pGa0MscUJBQXFCbEM7Y0FHekIsR0FBR2pELEtBQUt1RSxVQUFVLE9BQU9QO2NBQ2YsSUFBTm9ELFFBQVE3QyxFQUFFdkU7Y0FDZEE7Y0FDQSxjQUFlb0g7YUFaSTs7O2NBZWpCLEdBQUlyRztlQUFHLEdBQ0QyQztnQkFDRlc7a0JBQXFCWDtrQkFBWUMsd0NBQXdDL0UsUUFBUXFFOztnQkFHakZrQyxxQkFBcUJsQztjQUd6QmxDO2NBQ0F3RDthQVZZO0lBcEJlO0dBa0NqQ21DO2FBQXlDekQ7S0FDdkMsR0FBR0EsWUFBYTtLQUNELElBQVg0RCxhQUFhakksV0FBV3FFO0tBQzVCLE9BQU9yRSxhQUFhaUk7SUFIVTtHQUtoQ0g7YUFBeUN6RDtLQUNoQyxJQUFIb0UsS0FBS3pJLGFBQWFxRTtLQUN0QixPQUFPckUsYUFBYXFFO0tBQ3BCLE9BQU9vRTtJQUh1QjtHQUtoQ1g7YUFBdUN6RCxNQUFNbkM7S0FDM0MsSUFBSTBGO0tBQ0osR0FBRzFGLFlBQVlBO01BQ2JxRTtRQUFxQnZHLFFBQVFxRTs7S0FDL0IsR0FBR25DLFVBQVVBO01BQ1hxRTtRQUFxQnZHLFFBQVFxRTs7S0FDL0JyRSxZQUFZcUU7S0FDWixHQUFJckUsYUFBYXFFLE1BQU87TUFDdEIsR0FBSXJFLFlBQVlxRTtPQUFPa0MscUJBQXFCdkcsUUFBUXFFO01BQ3BELEdBQUluQyxZQUFZQTtPQUFRcUUscUJBQXFCdkcsUUFBUXFFO01BQ3JEdUQsT0FBTzVILGFBQWFxRTtNQUNwQixHQUFHbkMsWUFBWTBGOzthQUNOMUYsU0FBVTtNQUNuQmxDLDBCQUEwQnFFO01BQzFCckUsYUFBYXFFLFlBQVk4QyxXQUFXUjtNQUNwQ2lCLE9BQU81SCxhQUFhcUU7OztNQUVwQm1DLHdCQUF5QnhHLFFBQVFxRTtLQUVuQyxXQUFXc0QsU0FBUzNILFFBQVFxRSxPQUFPdUQsTUFBTTFGO0lBbkJiO0dBc0I5QjRGO2FBQXVDekQsTUFBTW5DO0tBQzNDLElBQUkwRjtLQUNKLEdBQUcxRixZQUFZQTtNQUNicUU7UUFBcUJ2RyxRQUFRcUU7O0tBQy9CLEdBQUduQyxVQUFVQTtNQUNYcUU7UUFBcUJ2RyxRQUFRcUU7O0tBQy9CckUsWUFBWXFFO0tBQ1osR0FBSXJFLGFBQWFxRSxNQUFPO01BQ3RCLEdBQUlyRSxZQUFZcUU7T0FBT2tDLHFCQUFxQnZHLFFBQVFxRTtNQUNwRCxHQUFJbkMsWUFBWUE7T0FBUXFFLHFCQUFxQnZHLFFBQVFxRTtNQUNyRHVELE9BQU81SCxhQUFhcUU7TUFDcEIsR0FBR25DLFlBQVkwRjs7YUFDTjFGLFNBQVU7TUFDbkJsQywwQkFBMEJxRTtNQUMxQnJFLGFBQWFxRSxZQUFZOEMsV0FBV1I7TUFDcENpQixPQUFPNUgsYUFBYXFFOzs7TUFFcEJtQyx3QkFBeUJ4RyxRQUFRcUU7S0FFbkMsV0FBV3NELFNBQVMzSCxRQUFRcUUsT0FBT3VELE1BQU0xRjtJQW5CYjtHQXNCOUI0RjthQUEyQ3pELE1BQUsyQjtLQUM5QyxJQUFJNEI7S0FDSixHQUFHNUgsYUFBYXFFO01BQU9rQyxxQkFBcUJ2RyxRQUFRcUU7S0FDcEQsR0FBRzRCLGlCQUFpQkQsVUFDbEI0QixXQUFXVCxXQUFXbkI7S0FDeEIsR0FBR0Usa0JBQWtCRjtNQUNuQjRCLFdBQVdULFdBQVdiLHFCQUFxQk47YUFDckNBLG1CQUFtQjBDO01BQ3pCZCxXQUFXVCxXQUFXaEIsb0JBQW9CSDtvQkFDN0JBO01BQ2I0QixXQUFXVCxXQUFXZCxzQkFBc0JMO2FBQ3RDQSxpQkFBa0I7TUFDZDtPQUFOMkM7U0FBUXJDLHFCQUFxQnpCLHdCQUF3Qm1CO01BQ3pENEIsV0FBV1QsV0FBV3dCOztLQUV4QixHQUFHZixLQUFLO01BQ041SCwwQkFBMEJxRTtNQUMxQnJFLGFBQWFxRSxRQUFRdUQ7OztNQUVsQnJCO1FBQXFCdkcsUUFBUXFFO0lBbkJIO0dBc0JqQ3lELHFDQUFxQ0E7R1pnWnJDLFNBQVNjLHNCQUFzQnpKLEdBQzdCLE9BQU9BLFNBQ1Q7R0FmQSxTQUFTMEosdUJBQXdCMUosR0FBR2lDLEdBQ2xDLE9BQU9qQyxhQUFhaUMsR0FDdEI7R0FsTEEsU0FBUzBILDJCQUE0QjNKO0lBQ25DLElBQUlFLElBQUl1SixzQkFBc0J6SixJQUMxQndHLFFBQVErQyxNQUFNckosSUFDZCtCO0lBQ0osTUFBT0EsSUFBSS9CLEdBQUcrQixLQUFLdUUsRUFBRXZFLEtBQUt5SCx1QkFBdUIxSixHQUFFaUM7SUFDbkQsT0FBT3VFO0dBQ1Q7R0E1UUEsU0FBU29EO0lBQ1BqSDtHQUNGO0dBekJBLFNBQVNrSCxzQkFBdUI3SixHQUFHaUMsR0FBR2U7SUFFcENBO0lBQ0EsR0FBSWhELFNBQXNCO0tBQ3hCLEdBQUlpQyxLQUFLakMsV0FBWTtNQUNuQkEsT0FBT2tFLG9CQUFxQmxCO01BQzVCLEdBQUlmLFNBQVNqQyxLQUFLQTtNQUNsQjs7S0FFRnNILDRCQUE2QnRIOztJQUUvQkEsSUFBSWlDLEtBQUtlO0lBQ1Q7R0FDRjtHQWlNQSxTQUFTOEcsZUFBZ0I5SixHQUFHaUMsR0FBR2U7SUFDN0IsR0FBSWYsV0FBV2pDLEtBQUs0SjtJQUNwQixPQUFPQyxzQkFBdUI3SixHQUFHaUMsR0FBR2U7R0FDdEM7R1NySkEsU0FBUytHLFNBQVNDLElBQUl0QjtJQUNwQjdILFVBQVVvSjtJQUNWcEosVUFBVW1KO0lBQ1ZuSixhQUFhNkg7R0FDZjtHQUNBcUIseUJBQXlCaEM7R0FDekJnQyxpQ0FBaUNBO0dBRWpDQTthQUF1Q2pIO0tBQ3JDLElBQ0VqQyxzQkFBc0JBLFNBQVFpQztXQUN2Qm9ILEtBQ1A5QyxxQkFBcUI4QztJQUpLO0dBTzlCSDs7S0FDRSxJQUNFLE9BQU9sSixrQkFBa0JBO1dBQ2xCcUosS0FDUDlDLHFCQUFxQjhDO0lBSkc7R0FPNUJIO2FBQW9DOUksUUFBT2lILEtBQUlpQyxZQUFXckg7S0FDeEQ7TUFDRSxHQUFHakM7T0FDREEsa0JBQWtCQSxTQUFTcUgsS0FBS2lDLFlBQVlySDs7T0FFNUNqQyxrQkFBa0JBLFNBQVNxSCxLQUFLaUMsWUFBWXJILEtBQUs3Qjs7V0FDNUNpSixLQUNQOUMscUJBQXFCOEM7S0FFdkI7SUFUeUI7R0FXM0JIO2FBQW1DOUksUUFBT3VGLEdBQUUyRCxZQUFXckg7S0FDckQ7TUFDRSxHQUFHakM7T0FDUSxJQUFMdUosT0FBT3ZKLGlCQUFpQkEsU0FBUzJGLEdBQUcyRCxZQUFZckg7O09BRTNDLElBQUxzSCxPQUFPdkosaUJBQWlCQSxTQUFTMkYsR0FBRzJELFlBQVlySCxLQUFLN0I7TUFDM0QsT0FBT21KOztXQUNBRixLQUNQOUMscUJBQXFCOEM7SUFSQztHQVcxQkg7O0tBQ0UsSUFDRWxKLGtCQUFrQkEsVUFDbEI7V0FDT3FKLEtBQ1A5QyxxQkFBcUI4QztJQUxFO0dBaFEzQixTQUFTRyxhQUFhdkYsTUFDcEJqRSxVQUFVb0osZUFDVnBKLFlBQVlpRSxLQUNkO0dBQ0F1RixxQ0FBcUNuRixNQUNuQyxPQUFRckUsWUFBWXFFLEtBRE07R0FHNUJtRjthQUF5Q25GO0tBQ3ZDLElBQ0UsT0FBT3JFLG1CQUFtQkEsUUFBUXFFO1dBQzNCZ0YsS0FDUDtJQUo0QjtHQU9oQ0c7YUFBeUNuRjtLQUN2QyxJQUNFLE9BQU9yRSxpQkFBaUJBLFFBQVFxRTtXQUN6QmdGLEtBQ1A5QyxxQkFBcUI4QztJQUpPO0dBT2hDRzthQUF3Q25GLE1BQU02RCxNQUFNQztLQUNsRCxJQUNFbkksa0JBQWtCQSxRQUFRcUUsY0FBWTZELFFBQ3RDO1dBQ09tQixLQUNQckosd0JBQXdCcUosS0FBS2xCO0lBTEY7R0FRL0JxQjthQUF3Q25GLE1BQU04RDtLQUM1QyxJQUNFbkksa0JBQWtCQSxRQUFRcUUsUUFDMUI7V0FDT2dGLEtBQ1BySix3QkFBd0JxSixLQUFLbEI7SUFMRjtHQVEvQnFCO2FBQTBDbkYsTUFBTThEO0tBQzlDLElBQ0UsT0FBT25JLG9CQUFvQkEsUUFBUXFFO1dBQzVCZ0YsS0FDUHJKLHdCQUF3QnFKLEtBQUtsQjtJQUpBO0dBT2pDcUI7YUFBeUNuRjtLQUN2QyxJQUNFLE9BQU9yRSxpQkFBaUJBLFFBQVFxRTtXQUN6QmdGLEtBQ1A5QyxxQkFBcUI4QztJQUpPO0dBT2hDRzthQUF5Q25GLE1BQU04RDtLQUM3QztNQUNRLElBQUZuRixJQUFJaEQsbUJBQW1CQSxRQUFRcUU7TUFDbkNyRSxtQkFBbUJBLFFBQVFxRTtNQUMzQixPQUFPckI7O1dBQ0FxRyxLQUNQckosd0JBQXdCcUosS0FBS2xCO0lBTkQ7R0FTaENxQjthQUF1Q25GLE1BQU1uQyxHQUFHaUc7S0FDOUMsSUFBSXNCLFNBQVNMLHNCQUNUckI7S0FDSixRQUFRMkIsT0FBT3hIO01BQUUsT0FDUndIOztTQUNVM0IsT0FBTzBCLGlCQUFpQjs7U0FDeEIxQixPQUFPMEIsaUJBQWlCOztTQUV2QzFCLE9BQU8wQixrQkFBa0JBLGlCQUN6Qjs7U0FDZ0IxQixPQUFPMEIsZ0JBQW1COztTQUMxQjFCLE9BQU8wQixnQkFBbUI7O1NBQzFCMUIsT0FBTzBCLGVBQW1COztTQUMxQjFCLE9BQU8wQixpQkFBbUI7O1NBQzFCMUIsT0FBTzBCLGVBQW1COztTQUMxQjFCLE9BQU8wQixtQkFBbUI7O0tBRzlDO01BQ0U7T0FBSU4sS0FBS25KLGlCQUFpQkEsUUFBUXFFLE9BQU8wRDtPQUNyQzRCO1NBQW9CM0osa0JBQWtCQSxRQUFRcUU7TUFDbERuQyxzQkFBc0J5SDtNQUN0QixXQUFXVCxTQUFTQyxJQUFJakg7O1dBQ2pCbUgsS0FDUHJKLHdCQUF3QnFKLEtBQUtsQjtJQXhCSDtHQTRCOUJxQjthQUF5Q0ksR0FBRzFLLEdBQUdpSjtLQUM3QyxJQUNFbkksbUJBQW1CQSxRQUFRNEosSUFBSTVKLFFBQVFkO1dBQ2hDbUssS0FDUHJKLHdCQUF3QnFKLEtBQUtsQjtJQUpEO0dBT2hDcUI7YUFBdUNuRixNQUFNOEQ7S0FDM0M7TUFDZSxJQUFUMEIsV0FBVzdKLGlCQUFpQkEsUUFBUXFFO01BQ3hDLE9BQU9yRSxtQkFBbUI2Sjs7V0FDbkJSLEtBQ1BySix3QkFBd0JxSixLQUFLbEI7SUFMSDtHQVE5QnFCO2FBQXdDbkYsTUFBTThEO0tBQzVDO01BQ2UsSUFBVDBCLFdBQVc3SixrQkFBa0JBLFFBQVFxRTtNQUN6QyxPQUFPckUsbUJBQW1CNko7O1dBQ25CUixLQUNQckosd0JBQXdCcUosS0FBS2xCO0lBTEY7R0FRL0JxQjthQUEwQ00sUUFBUUMsUUFBUXJHLE1BQU15RTtLQUM5RDtNQUNFbkk7UUFBb0JBLFFBQVErSixTQUFTL0osUUFBUTBELE9BQU9vRztNQUNwRDs7V0FDT1QsS0FDUHJKLHdCQUF3QnFKLEtBQUtsQjtJQUxBO0dBUWpDcUI7YUFBMkNuRixNQUFNOEQ7S0FDL0M7TUFDVyxJQUFMNkIsT0FBT2hLLHFCQUFxQkEsUUFBUXFFO01BQ3hDLE9BQU9RLHdCQUF3Qm1GOztXQUN4QlgsS0FDUHJKLHdCQUF3QnFKLEtBQUtsQjtJQUxDO0dBUWxDcUI7YUFBMENuRixNQUFNOEQ7S0FDOUMsSUFDRSxPQUFPbkksb0JBQW9CQSxRQUFRcUU7V0FDNUJnRixLQUNQckosd0JBQXdCcUosS0FBS2xCO0lBSkE7R0FPakNxQjthQUFxREgsS0FBS2xCO0tBQ3pDLElBQVhyRCxhQUFhUztLQUNqQixHQUFJNEMsY0FBY3JELFdBQVk7TUFDbkI7T0FBTE8sT0FBT04sbUJBQW1Cc0UsVUFBVUEsYUFBYUEsVUFBVUE7TUFDL0Q1RCxxQkFBcUJYLFlBQVlPOzs7TUFFakNrQixxQkFBcUI4QztJQU5tQjtHQVM1Q0c7YUFBZ0RLO0tBVzlDLElBQUlJO0tBQ0osR0FBSUo7TUFDRkk7YUFDU0o7TUFDVEk7YUFDU0o7TUFDVEk7YUFDU0o7TUFDVEk7YUFDU0o7TUFDVEk7YUFDU0o7TUFDVEk7YUFDU0oscUJBQ1RJO0tBa0JGO2FBRUVKO2FBQ0FBO2FBQ0FJO2FBQ0FKO2FBQ0FBO2FBQ0FBO2FBQ0FBO2FBQ0FBO2FBQ0FBO2FBQ0FBO2FBQ0FBO2FBQ0FBO0lBeERtQztHQTREdkNMLHFDQUFxQ0E7R0MzTXJDLFNBQVNVLGNBQWN4RztJQUNmLElBQUYxRSxJQUFJbUYsaUJBQWlCVDtJQUN6QixLQUFLMUUsR0FBRztJQUNSLE9BQU9BO0dBQVU7R1REbkIsU0FBU21MLGNBQWV0STtJQUN0QixLQUFJbkM7S0FDRkEsaUNBQThCaUM7SUFDaENDLHVCQUF1QmxDLDBCQUEwQm1DO0dBQ25EO0dTQ0E7SUFBSXVJO01BQVlGLGNBQWM1RjtTQUFxQjZGO0lBNkQvQ0U7R0FDSixHQUFJOUc7SUFDRjhHO2FBQTRCRCx1QkFBcUJaLGFBQWFZOztJQUU5REM7YUFBNEJELHVCQUFxQnRDLGFBQWFzQztHQUVoRUM7b0NBQW1EdkM7R0FlbkQsU0FBU3dDLGtCQUFrQmpHO0lBQ3pCO0tBQUlYLE9BQU9hLGVBQWVGO0tBQ3RCQSxPQUFPWDtLQUNQdUUsYUFBYTdELG9CQUFvQkM7S0FDakMwRDtJQUNKLElBQVUsSUFBRjNHLE9BQU9BLElBQUlpSix5QkFBeUJqSixJQUFLO0tBQ3pDLElBQUZtSCxJQUFJOEIsaUJBQWlCako7S0FDekI7T0FBRzZHLGtCQUFrQk07YUFDYlIsT0FBT0Esa0JBQWtCUTtNQUMvQlI7Y0FBWVE7Z0JBQWNBO2NBQWNsRSxlQUFla0UsZUFBY2xFOztJQUV6RSxLQUFLMEQsT0FBT3hFLG9CQUFxQjtLQUN0QixJQUFMVSxPQUFPaUcsY0FBYzdGO0tBQ3pCLEdBQUlKLFFBQVFBLDRCQUE0QjtNQUNoQyxJQUFGc0UsV0FBVXRFLGtCQUFnQnVGLGFBQWF2RjtNQUMzQ29HLHNCQUFzQjlCO01BQ3RCUjtjQUFZUTtnQkFBY0E7Y0FBY2xFLGVBQWVrRSxlQUFjbEU7OztJQUd6RSxHQUFJMEQsS0FBTSxPQUFPQTtJQUNqQnhCLDhDQUE4QzBCO0dBQ2hEO0dBc0ZBLFNBQVNzQyxzQkFBc0JsRztJQUM3QixJQUFJSixPQUFPcUcsa0JBQWtCakcsT0FDekJzQixJQUFJMUIsbUJBQW1CQTtJQUMzQixPQUFPMEI7R0FDVDtHVDNLQSxTQUFTNkU7SUFDUGhMLG9CQUFvQkU7R0FBNkI7R0U2RG5ELFNBQVMrSyxnQkFBaUJwRztJQUNsQixJQUFGakYsSUFBSTJCLGdCQUFnQnVDLHdCQUF3QmU7SUFDaEQsR0FBR2pGLE1BQU04QixXQUNQc0o7SUFDRixPQUFPM0Ysd0JBQXdCekY7R0FDakM7R1V1TUEsU0FBU3NMLGdCQUFnQkMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUM7SUFDckQsR0FBR0EsV0FBWSxDQUNiRixVQUFVQyxXQUNWO0lBRU8sSUFBTEU7SUFDSixJQUFVLElBQUY3SixJQUFJeUosVUFBUXpKLFFBQVFBLElBQUs7S0FDekIsSUFBRnVFLElBQUlnRixVQUFVQyxPQUFLeEo7S0FDdkJ1SixVQUFVQyxPQUFLeEosS0FBTXVFLE1BQU1xRixRQUFTQztLQUNwQ0EsT0FBT3RGLFVBQVdxRjs7SUFFcEJGLFVBQVVDLFFBQVFFO0lBQ2xCO0dBQ0Y7R0NyVUEsSUFBSUM7R0FNSixTQUFTQztJQUNQLEdBQUdELGVBQWUsT0FDVEE7SUFFVCxNQUFNMUo7O2FBQStCK0Q7YUFBOEM1RDtHQUNyRjtHQTJMQSxTQUFTeUosb0JBQW9CcE0sR0FBRXdCO0lBQzdCO0tBQUlyQixJQUFJZ007S0FDSkUsS0FBR2xNLHVCQUF1QkgsR0FBRUcsV0FBV3FCO0tBQ3ZDb0UsSUFBSXlHO0lBQ1IsUUFBUXpHLGVBQWVBLGFBQWFBO0dBQ3RDO0dDN01BLFNBQVMwRyxtQ0FDUCxTQUNGO0dDc2hCQSxJQUFJQztHQUNKLFVBQVd0SztJQUNUc0s7S0FBZ0I7T0FFZCxTQUFTQyxZQUFZQyxNQUFRekwsWUFBWXlMLEtBQU07T0FDL0NEO2lCQUFxQ3JJO1NBQ25DLElBQVcsSUFBRi9CLE9BQU9BLElBQUlwQixrQkFBa0JvQjtVQUFLLEdBQ3JDcEIsVUFBVW9CLE9BQU8rQixHQUFHLE9BQU8vQjtRQUZQO09BSzVCb0ssdUNBQTRCO09BSTVCO1FBQ0V4TDtRQUFnQkEsa0JBQWtCd0wsWUFBWXhMLFdBRHpDO01BWk87OztJQWtCaEJ1TDtnQkFDRXZMLGdCQUFnQkEsa0JBQWtCaUIscUJBRHBCO0dBS2xCc0s7YUFBeUNwSSxHQUN2Q25ELGdCQUFnQm1ELEdBQUduRCxtQkFDbkJBLGVBQWVtRCxHQUZlO0dBS2hDb0k7YUFBMENwSTtLQUNsQyxJQUFGL0IsSUFBSXBCLGdCQUFnQm1EO0tBQ3hCLE9BQVEvQixNQUFNRixZQUNWQSxZQUFZbEIsbUJBQW1Cb0I7SUFISjtHTnZWakMsU0FBU3NLLGdCQUFnQjlCLEdBQUUxSztJQUN6QixJQUFJeU0sU0FBU3JCLGtCQUFrQlYsSUFDM0JnQyxTQUFTdEIsa0JBQWtCcEw7SUFDL0IsR0FBR3lNLGlCQUFpQkM7S0FDbEJ6QjtJQUNGLEtBQUl3QjtLQUNGeEI7SUFDRndCLHFCQUFxQkEsYUFBYUM7R0FDcEM7R0g0QkEsU0FBU0MsaUJBQWtCN00sR0FBSyxPQUFPTyxXQUFXUCxHQUFJO0dKb0M1QixJQUF0QjhNO0dBSUosU0FBU0MsZ0NBQWlDQyxNQUN4Q0Ysd0JBQXdCRSxNQUN4QjtHQUNGO0dJeElBLFNBQVNDLG9CQUFxQmpOO0lBQzVCLEdBQUlrTixTQUFVbE4sR0FBSTtLQUNoQixHQUFJTyxTQUFTUCwrQkFBK0I7S0FDNUMsR0FBSUEsUUFBUTtLQUNaOztJQUVGLE9BQU9tTixNQUFNbk47R0FDZjtHVTVGcUIsSUFBakJvTix1QkFBdUIxRDtHQXdIM0IsU0FBUzJELFlBQWFDO0lBQ3BCLEdBQUdBLGVBQWVsSCxLQUFLO0tBQ3JCLElBQUltSCxNQUFNRCxlQUNORSxRQUFRMUQsMkJBQTJCeUQ7S0FDdkMsR0FBSUM7TUFDRkYsY0FBY2xIO1NBRVg7TUFDSCxHQUFHa0gscUJBQXFCQSxrQkFBa0JFLGFBQWE7T0FDL0MsSUFBRnhKLFFBQVFvRCxXQUFXa0csa0JBQWtCRTtPQUN6Q3hKLE1BQU1zSjtPQUNOQSxjQUFjdEo7O01BRWhCc0osZ0JBQWdCRSxPQUFNRjtNQUN0QkEsZUFBZUU7TUFDZkYsbUJBQW1CRTs7O1FBRWhCO0tBQ0s7TUFBTkM7UUFBUUg7VUFBZUE7VUFBYUE7VUFBYUE7VUFBaUJBLHFCQUFxQkE7S0FDM0ZBLGVBQWVHO0tBQ2ZILG1CQUFtQkc7O0dBRXZCO0doQnpLQSxTQUFTQztJQUNQNUs7R0FDRjtHZ0IwVUEsU0FBUzZLLHdCQUF3QkM7SUFDL0IsSUFBSU4sT0FBT0YsaUJBQWlCUSxTQUN4QmxLLElBQUk0SjtJQUNSO0tBQUcsR0FDRTVKLEtBQUs0SixnQkFBaUI7TUFDdkIsR0FBR0EscUJBQXNCO09BQ3ZCQSxnQkFBZ0JBLHFCQUFxQkE7T0FDckM1SixLQUFLNEo7T0FDTEEsbUJBQW1CQTtPQUNuQkE7O01BRUYsR0FBR0EsbUJBQW1CQSxvQkFBb0IsU0FDL0JBO01BRUUsSUFBVE8sV0FBV1A7TUFDZkQsWUFBYUM7TUFDYixHQUFHTyxZQUFZUCxpQkFBaUIsU0FDckJBOzs7TUFHTkEsWUFBWTVKO0lBQ3JCLE9BQVFBLElBQUk0SjtHQUNkO0dDdGFBLFNBQVNRLGNBQWNDO0lBRXJCLFVBQVU5TCw2QkFBNkJBO0lBQ3ZDO0dBQ0Y7R1ZnS0EsU0FBUytMLHNCQUFzQkQsTUFDM0Isc0JBQ0o7R1RzTUEsU0FBU0Usb0JBQW9CdEg7SUFDM0I7WUFBVy9GO2FBQVErRixZQUFhQSxZQUFjQTthQUMzQkEsWUFBYUEsWUFBY0E7YUFDM0JBLFlBQWFBO0dBQ2xDO0dvQnVDQSxTQUFTdUgsb0JBQW9CQyxJQUFJQztJQUN2QixJQUFKQyxNQUFNRixVQUFVQztJQUNwQixHQUFHQyxXQUFXRixnQkFBZ0JUO0lBQzlCO0tBQUlZLEtBQUtILE9BQU9FO0tBQ1pFLEtBQUtKLE9BQU9FO0tBQ1pHLEtBQUtMLE9BQU9FO0tBQ1pJLEtBQUtOLE9BQU9FO0tBQ1pLLEtBQUtQLE9BQU9FO0tBQ1pNLEtBQUtSLE9BQU9FO0tBQ1pPLEtBQUtULE9BQU9FO0tBQ1pRLEtBQUtWLE9BQU9FO0lBQ2hCLE9BQU9KLHFCQUFxQlksSUFBR0QsSUFBR0QsSUFBR0QsSUFBR0QsSUFBR0QsSUFBR0QsSUFBR0Q7R0FDbkQ7R3BCakRBLFNBQVNRLG9CQUFvQjlPLEdBQUssT0FBT0EsWUFBWTtHaUJoS3JELFNBQVMrTyxtQkFBbUJDLFFBQVE3SyxHQUFHOEs7SUFDL0IsSUFBRmpMLElBQUk4SyxvQkFBcUIzSztJQUM3QixJQUFXLElBQUYvQixPQUFPQSxPQUFPQSxLQUFLNE0sZ0JBQWlCaEwsRUFBRTVCO0lBQy9DNk07SUFBY0E7R0FDaEI7R0dpSUEsU0FBU0MsaUJBQWlCZixJQUN4QixPQUFPQSxlQUNUO0dkek5BLFNBQVNnQixvQkFBb0JDO0lBQ047S0FDbkIsR0FBR0EsYUFBYTFGLE9BQU8sT0FBTzBGO0tBQzlCLElBQUk5TTtLQUVKO09BQUdMLHlCQUNHbU4sYUFBYW5OO1VBQ2JtTjtVQUNBQTtNQUNKOU0sTUFBTTVCOztPQUVBdUIsNEJBQ0ZtTixhQUFhbk47VUFDYm1OO1VBQ0FBO01BQ0o5TSxNQUFNNUI7YUFFQTBPLGFBQWFuTixvQkFBb0JzRTtNQUN2Q2pFLFVBQVNpRSw2QkFBNEI2STs7TUFHckM5TSxVQUFTNUIsMEJBQXlCbUYsd0JBQXlCeEIsT0FBTytLO0tBRXBFLEdBQUlBLGFBQWFuTixrQkFDZkssZUFBZThNO0tBQ2pCLE9BQU85TTs7R0FHWDtHS21KQSxTQUFTK00saUJBQWlCaEssTUFBSzJCO0lBQ3BCLElBQUwvQixPQUFPcUcsa0JBQWtCakc7SUFDN0IsS0FBS0osc0JBQXNCa0c7SUFDM0JsRyxxQkFBcUJBLFdBQVUrQjtJQUMvQjtHQUNGO0dBS0EsU0FBU3NJLGlCQUFpQmpLLE1BQUsyQjtJQUM3QjtLQUFJM0IsT0FBTzFDLHVCQUF1QjBDO0tBQzlCMkIsVUFBVXJFLHVCQUF1QnFFO0lBQ3JDLE9BQU9xSSxpQkFBaUJoSyxNQUFNMkI7R0FDaEM7R0E1QkEsU0FBU3VJO0lBQ0EsSUFBSEMsTUFBSXZOO0lBQ1IsR0FBR3VOO0tBQUksSUFDSyxJQUFGcE4sT0FBT0EsSUFBSW9OLFlBQVlwTjtNQUM3QmtOLGlCQUFpQkUsSUFBSXBOLFNBQVFvTixJQUFJcE47SUFHckNILDhCQUE4QnFOO0lBQzlCck47SUFDQTtHQUNGO0dVak5BLFNBQVN3TixTQUFTOUksR0FBRTNDLEdBQ2xCLE9BQU96RCxVQUFVb0csR0FBRTNDLEdBQ3JCO0dDVEEsU0FBUzBMLGtCQUFrQnhPLEdBQUUwRTtJQUMzQkEsSUFBSTZKLFNBQVM3SjtJQUNiQSxJQUFNQSxVQUFZQTtJQUNsQkEsSUFBSTZKLFNBQVM3SjtJQUNiMUUsS0FBSzBFO0lBQ0wxRSxJQUFNQSxVQUFZQTtJQUNsQixRQUFVQSxLQUFLQTtHQUNqQjtHQTZCQSxTQUFTeU8sc0JBQXNCek8sR0FBR2Y7SUFDaEMsSUFBSThDLE1BQU05QyxVQUFVaUMsR0FBR3dOO0lBQ3ZCLElBQUt4TixPQUFPQSxTQUFTYSxLQUFLYixPQUFRO0tBQ2hDd047TUFBSXpQLGFBQWFpQyxLQUNaakMsYUFBYWlDLGNBQ2JqQyxhQUFhaUM7UUFDYmpDLGFBQWFpQztLQUNsQmxCLElBQUl3TyxrQkFBa0J4TyxHQUFHME87O0lBRTNCQTtJQUNBLE9BQVEzTTs7T0FDQTJNLElBQUt6UCxhQUFhaUM7O09BQ2xCd04sS0FBS3pQLGFBQWFpQzs7T0FFeEJ3TixLQUFLelAsYUFBYWlDLElBQ2xCbEIsSUFBSXdPLGtCQUFrQnhPLEdBQUcwTzs7SUFHM0IxTyxLQUFLK0I7SUFDTCxPQUFPL0I7R0FDVDtHQXVDQSxTQUFTMk8scUJBQXFCM08sR0FBR2lEO0lBQy9CLE9BQU93TCxzQkFBc0J6TyxHQUFHWSx1QkFBdUJxQztHQUN6RDtHQzVLa0MsSUFBOUIyTCxnQ0FBZ0NEO0dkeUpwQyxTQUFTRSxrQ0FBcUMsV0FBWTtHZWhKcEMsSUFBbEJDO0dBNlFKLFNBQVNDLHNCQUFzQmpEO0lBQ2pCLElBQVJrRCxVQUFVRjtJQUNkQSxvQkFBb0JoRDtJQUNwQixPQUFPa0Q7R0FDVDtHbEJsRkEsU0FBU0Msc0JBQXNCeEo7SUFDdkIsSUFBRnRHO0lBQ0osSUFBUyxJQUFEK0IsSUFBRXVFLGNBQWN2RSxRQUFNQSxJQUFJLENBQzFCLElBQUZnTixJQUFJekksRUFBRXZFLElBQ1YvQixRQUFPK08sR0FBRS9PO0lBRVgsT0FBT0E7R0FDVDtHUWxJQSxTQUFTK1AsZUFBZUMsS0FBS2hDLEtBQUtwTDtJQUNoQyxJQUFVLElBQUZiLElBQUlhLFNBQVNiLFFBQVFBLEtBQUssR0FDN0JpTyxTQUFTaEMsTUFBSWpNLFNBQVMsT0FBT0E7SUFFbEM7R0FDRjtHQXRFQSxTQUFTa08sY0FBY3RRO0lBQ3JCLElBQUlpRCxNQUFNbU4sZUFBZXBRLE1BQU1BLGdCQUMzQmtCO0lBQ0osSUFBVyxJQUFGa0IsT0FBT0EsSUFBSWEsS0FBS2IsS0FDdkJsQixJQUFJd08sa0JBQWtCeE8sR0FBR2xCLE9BQU9vQztJQUVsQyxPQUFPbEI7R0FDVDtHWFJBLFNBQVNxUCxjQUFjck4sR0FBR21EO0lBQ3hCO0tBQUluRyxJQUFLZ0QsV0FBVUEsTUFBS0EsTUFBTUE7S0FDMUJzTixVQUFVbks7S0FDVlQsSUFBSTFGLElBQUlzUTtJQUNaLEdBQUk1SztLQUNGLE9BQU8xQyxRQUFRa0QsTUFBTUM7WUFDZFQsTUFBTztLQUNSLElBQUY2SyxJQUFJdk4sUUFBUWtELE1BQUtDLGNBQWFuRztLQUNsQyxVQUFVdVEsa0JBQWtCLE9BQU9BO0tBQ25DLE9BQU9GLGNBQWNFLEdBQUVwSyxXQUFXbkc7O1FBRS9CO0tBQ0gsT0FBUTBGOztRQUNBO1NBQ0E7VUFBRjZLO3FCQUFjelE7YUFDTixJQUFOMFEsWUFBWWhILE1BQU04RzthQUN0QixJQUFVLElBQUZwTyxPQUFPQSxJQUFJb08sU0FBU3BPLEtBQU1zTyxNQUFNdE8sS0FBS2lFLEtBQUtqRTthQUNsRHNPLE1BQU1GLFdBQVd4UTthQUNqQixPQUFPa0QsUUFBUWtELE1BQU1zSztZQUpmO1NBTVI7OztRQUVNO1NBQ0E7VUFBRkQ7cUJBQWN6USxHQUFHd0I7YUFDVCxJQUFOa1AsWUFBWWhILE1BQU04RzthQUN0QixJQUFVLElBQUZwTyxPQUFPQSxJQUFJb08sU0FBU3BPLEtBQU1zTyxNQUFNdE8sS0FBS2lFLEtBQUtqRTthQUNsRHNPLE1BQU1GLFdBQVd4UTthQUNqQjBRLE1BQU1GLGVBQWVoUDthQUNyQixPQUFPMEIsUUFBUWtELE1BQU1zSztZQUxmO1NBT1I7OztRQUdNO1NBQUZEOztZQUNGO2FBQUlFLGFBQWNDLDRCQUF5QkE7YUFDdkNGLFlBQVloSCxNQUFNckQsY0FBWXNLO1lBQ2xDLElBQVUsSUFBRnZPLE9BQU9BLElBQUlpRSxhQUFhakUsS0FBTXNPLE1BQU10TyxLQUFLaUUsS0FBS2pFO1lBQ3RELElBQVUsSUFBRkEsT0FBT0EsSUFBSXdPLGtCQUFrQnhPO2FBQU1zTyxNQUFNckssY0FBWWpFLEtBQUt3TyxVQUFVeE87WUFDNUUsT0FBT21PLGNBQWNyTixHQUFHd047V0FMbEI7O0tBUVZELE1BQU03SztLQUNOLE9BQU82Szs7R0FFWDtHR0NrQixJQUFkSSxnQkFBZ0JOO0dBeVBwQixTQUFTTyxnQ0FBZ0M1TjtJQUN2QztLQUNFLElBQUlELE1BQU0yTixrQkFDTnZLLFdBQVdxRCxNQUFNekc7S0FDckIsSUFBVyxJQUFGYixPQUFPQSxJQUFJYSxLQUFLYixLQUFLaUUsS0FBS2pFLEtBQUt3TyxVQUFVeE87S0FDbEQsT0FBT3lPLGNBQWMzTixJQUFJbUQsT0FKcEI7R0FNVDtHS2xKQSxTQUFTMEssZUFBZUM7SUFDYixJQUFML0wsT0FBT3FHLGtCQUFrQjBGO0lBQzdCLEdBQUcvTCxtQkFBbUJBLFdBQVk7S0FDaEMsR0FBR0E7TUFBV0ssbUJBQW1CRixvQkFBb0JILFlBQVlBOztNQUM1REssbUJBQW1CTDtLQUN4Qjs7O0tBR0F1Qyx3QkFBd0IxRix1QkFBdUJrUDtHQUVuRDtHY3ZKQSxTQUFTQyxhQUFjalI7SUFDckIsR0FBS0EsYUFBYTBKLFNBQVUxSixRQUFTQTtLQUNuQyxPQUFPQTtZQUNBaUgsaUJBQWlCakg7S0FDeEI7WUFDT2tILGtCQUFrQmxIO0tBQ3pCO1lBQ1FBLGFBQWFrUixtQkFBb0JsUjtLQUN6QztZQUNPQSxLQUFLQSxlQUNaLGlCQUVBO0dBQ0o7R0FzSEEsU0FBU21SLG9CQUFvQm5OLEdBQUU0RyxHQUFFMUs7SUFDN0IsR0FBRzhELFFBQU00RyxFQUFHLENBQUU1RyxPQUFPOUQsR0FBRztJQUN4QjtHQUNKO0dDN0hpQyxJQUE3QmtSO0dBQ0osU0FBU0MsNEJBQTRCdEQsTUFDbkMsT0FBT3FEO0dBQ1Q7R0Q4SEEsU0FBU0UsNEJBQTRCMUc7SUFDN0IsSUFBRi9HLElBQUlvTixhQUFhckc7SUFDckIsR0FBRy9HLFlBQVlBLFlBQVlBLFVBQ3pCO0lBQ0YsR0FBR3NOLG9CQUFvQnZHO0tBQWM7UUFFOUI7S0FDTSxJQUFQMkcsU0FBUzNHO0tBQ2IvRyxJQUFJK0c7S0FDSixHQUFHL0c7TUFBVSxPQUNSME4sVUFBVUY7YUFJSnhOLFVBQVUsZUFFZDs7R0FLWDtHTjVLQSxTQUFTMk4sbUJBQXFCLHNCQUFtQjtHSm1kakQsU0FBU0M7SUFDUHRHO0dBQ0Y7R0h6TkEsU0FBU3VHLG1CQUFtQkM7SUFDMUIsSUFDSUE7VUFDS3ZDO0tBQ1UsSUFBWHRKLGFBQWFTO0tBQ2pCRTtPQUFxQlgsWUFBWUMsd0NBQXdDNEw7O0dBRS9FO0dBdkNBLFNBQVNDLGtCQUFrQmxOO0lBQ2hCLElBQUxPLE9BQU9xRyxrQkFBa0I1RztJQUM3QixLQUFLTztLQUNIa0c7SUFFYSxJQUFYd0csYUFBYTFNLG9CQUFvQkE7SUFDckMsaUJBQW1CME0sa0JBQWtCak47R0FDdkM7R0FxQ0EsU0FBU21OLG9CQUFvQkY7SUFDM0JELG1CQUFtQkM7SUFDQSxJQUFmRyxpQkFBaUJGLGtCQUFrQkQ7SUFDdkNBLHFCQUFxQkc7SUFDckI7R0FDRjtHVi9PQSxTQUFTQztJQUNQdlIsb0JBQW9CRTtHQUN0QjtHVTBNQSxTQUFTc1Isa0JBQWtCTDtJQUN6QixJQUFJbkk7SUFDSixJQUNJQSxRQUFRbUk7VUFDSHZDO0tBQ1UsSUFBWHRKLGFBQWFTO0tBQ2pCRTtPQUFxQlgsWUFBWUMsdUNBQXVDNEw7O0lBRTVFLEdBQUluSSxVQUFVcEQ7S0FDVjJMOztLQUNHLE9BQ0lsTSx3QkFBd0IyRDtHQUVyQztHQTRCQSxTQUFTeUksb0JBQW9Cdk47SUFFZixJQUFSd04sVUFBVTVOLHdCQUF3Qkk7SUFDdEN3TixVQUFVQTtJQUNWeE4sT0FBT21CLHdCQUF3QnFNO0lBRS9CO0tBQUlQLGFBQWFDLGtCQUFrQmxOO0tBQy9CeU4sY0FBY0gsa0JBQWtCTDtJQUVwQyxXQUFXUSxhQUFhUjtHQUMxQjtHYWpGQSxTQUFTUyx5QkFBeUJ2TyxHQUNoQyxPQUFRQSxpQkFDVjtHakJqTlksSUFBUndPLFVBQVU5UixhQUFhQTtHQUMzQixTQUFTK1IsZ0JBQWdCdFM7SUFDdkIsR0FBR3FTLFNBQVMsT0FBTzlSLFdBQVdBLFVBQVVQO0lBQ2xDLElBQUZvQztJQUNKLEdBQUlwQyxRQUFRLFNBQVF1UztJQUNwQixHQUFHdlMsUUFBTSxNQUFRQSxPQUFNLENBQUNBLFFBQU1vQyxXQUN6QixNQUFRcEMsTUFBTyxDQUFDQSxRQUFNb0M7SUFDM0IsT0FBT0E7R0FDVDtHQXdDQSxTQUFTb1EseUJBQTBCeFM7SUFDcEIsSUFBVHlTLGVBQWVDO0lBQ25CRCxjQUFjelM7SUFDSCxJQUFQMlMsYUFBYUMsV0FBV0g7SUFDNUIsT0FBT0U7R0FDVDtHUm1SQSxTQUFTRSwyQkFBMkJoUyxJQUFJQyxJQUFJQyxJQUMxQyxXQUFXSCxRQUFRQyxJQUFJQyxJQUFJQztHQUM3QjtHUTlUQSxTQUFTK1IseUJBQTBCOVM7SUFDakMsS0FBS2tOLFNBQVNsTixHQUFJO0tBQ2hCLEdBQUltTixNQUFNbk4sSUFDUixPQUFPNlM7S0FDVCxPQUFJN1M7ZUFDSzZTO2VBRUFBOztJQUVGLElBQUwxUixPQUFRbkIsY0FBVUEsT0FBTXVTLG9CQUFrQnZTO0lBQzlDLEdBQUltQixNQUFNbkIsTUFBS0E7SUFHUCxJQUFKK1MsTUFBTVQsZ0JBQWdCdFM7SUFDMUIsR0FBSStTLFNBQVU7S0FDWkE7S0FDQS9TLEtBQUtPOztRQUNBO0tBQ0xQLEtBQUtPLFlBQVd3UztLQUNoQixHQUFJL1MsT0FBUSxDQUNWQSxRQUFRK1M7S0FDVixHQUFJQSxVQUNGL1M7O0lBRUosSUFBSWdULElBQUl6UyxpQkFDSjBTLEtBQUtqVDtJQUNUQSxLQUFLQSxJQUFJaVQsTUFBTUQ7SUFDUixJQUFIRSxLQUFLbFQ7SUFDVEEsS0FBS0EsSUFBSWtULE1BQU1GO0lBQ1IsSUFBSEcsS0FBS25UO0lBQ1RpVCxLQUFNQSxXQUFXOVIsT0FBTzRSO0lBQ3hCLE9BQU9GLDJCQUEyQk0sSUFBSUQsSUFBSUQ7R0FDNUM7R1k0aEJBLFNBQVNHLGtCQUFrQnBFLFFBQVFiLElBQUlrRjtJQUNyQ3JFLGlCQUFpQmI7SUFDakJhLGlCQUFrQmIsVUFBV0E7SUFDN0IsR0FBR0E7S0FDRCxJQUFVLElBQUYvTCxPQUFPQSxJQUFJK0wsZ0JBQWdCL0w7TUFBSyxHQUNuQytMLFFBQVEvTDtPQUNUNE0saUJBQWlCYixRQUFRL0w7VUFDdEI7T0FDSDRNO09BQ0FBO09BQ0FBLGlCQUFpQmIsUUFBUS9MOzs7S0FJN0IsSUFBVSxJQUFGQSxPQUFPQSxJQUFJK0wsZ0JBQWdCL0wsS0FBSzRNLGlCQUFnQmIsUUFBUS9MO0lBQ2xFLE9BQU8rTDs7OztPQUlMLElBQVUsSUFBRi9MLE9BQU9BLElBQUkrTCxnQkFBZ0IvTCxLQUNqQzRNLGdCQUFnQmIsUUFBUS9MO09BRTFCOzs7T0FHQSxJQUFVLElBQUZBLE9BQU9BLElBQUkrTCxnQkFBZ0IvTCxLQUNqQzRNLGlCQUFpQmIsUUFBUS9MO09BRTNCOztPQUVBLElBQVUsSUFBRkEsT0FBT0EsSUFBSStMLGdCQUFnQi9MLEtBQ2pDNE0saUJBQWlCYixRQUFRL0w7T0FFM0I7OztPQUdBNE07T0FDQSxJQUFVLElBQUY1TSxPQUFPQSxJQUFJK0wsZ0JBQWdCL0wsS0FDakM0TSxpQkFBaUJiLFFBQVEvTDtPQUUzQjs7T0FFQSxJQUFVLElBQUZBLE9BQU9BLElBQUkrTCxvQkFBb0IvTCxJQUFJO1FBQ25DLElBQUY0QixJQUFJOEssb0JBQW9CWCxPQUFPL0w7UUFDbkMsSUFBVyxJQUFGZ0MsT0FBT0EsT0FBT0EsS0FBSzRLLGdCQUFpQmhMLEVBQUVJOztPQUVqRDs7T0FFQSxJQUFVLElBQUZoQyxPQUFPQSxJQUFJK0wsZ0JBQWdCL0wsSUFBSTtRQUMvQixJQUFGNEIsSUFBSThLLG9CQUFvQmdFLHlCQUF5QjNFLE9BQU8vTDtRQUM1RCxJQUFXLElBQUZnQyxPQUFPQSxPQUFPQSxLQUFLNEssZ0JBQWlCaEwsRUFBRUk7O09BRWpEOztPQUVBLElBQVUsSUFBRmhDLE9BQU9BLElBQUkrTCxnQkFBZ0IvTCxJQUFJO1FBQy9CLElBQUY0QixJQUFJd08seUJBQXlCckUsT0FBTy9MO1FBQ3hDNE0saUJBQWlCaEw7O09BRW5COztPQUVBLElBQVUsSUFBRjVCLE9BQU9BLElBQUkrTCxvQkFBb0IvTCxJQUFJO1FBQ25DLElBQUZnQyxJQUFJK0osT0FBTy9MO1FBQ2Y0TSxpQkFBaUJ3RCx5QkFBeUJwTztRQUMxQzRLLGlCQUFpQndELHlCQUF5QnBPOztPQUU1Qzs7T0FFQSxJQUFVLElBQUZoQyxPQUFPQSxJQUFJK0wsb0JBQW9CL0wsSUFBSTtRQUN6QztTQUFJa1IsVUFBVW5GLE9BQU8vTDtTQUNqQjRCLElBQUk4SyxvQkFBb0JnRSx5QkFBeUJRO1FBQ3JELElBQVcsSUFBRmxQLE9BQU9BLE9BQU9BLEtBQUs0SyxnQkFBaUJoTCxFQUFFSTtRQUN6QyxJQUFGSixJQUFJOEssb0JBQW9CZ0UseUJBQXlCUTtRQUNyRCxJQUFXLElBQUZsUCxPQUFPQSxPQUFPQSxLQUFLNEssZ0JBQWlCaEwsRUFBRUk7O09BRWpEOztJQUVGaVAsYUFBYWxGO0lBQ2JrRixhQUFhbEY7R0FDZjtHQTduQkEsU0FBU29GLDZCQUE2QkM7SUFDcEMsT0FBT0EsOEJBQ21CLGtCQUNqQjs7R0FFWDtHQUtBLFNBQVNDLHNCQUFzQkQsTUFBTUU7SUFDbkMsSUFBSUM7SUFDSixPQUFPSDs7T0FDRUcsT0FBT2pCLGNBQWM7O09BQ3JCaUIsT0FBT0MsY0FBYzs7T0FDckJELE9BQU9FLFdBQVc7O09BQ2xCRixPQUFPdk0sWUFBWTs7T0FDbkJ1TSxPQUFPRyxZQUFZOztPQUNuQkgsT0FBT0ksYUFBYTs7T0FDcEJKLE9BQU9mLFlBQVk7O09BQ25CZSxPQUFPZixZQUFZOztPQUNuQmUsT0FBT2YsWUFBWTs7T0FDbkJlLE9BQU9mLFlBQVk7O09BQ25CZSxPQUFPakIsY0FBYzs7T0FDckJpQixPQUFPQyxjQUFjOztPQUNyQkQsT0FBT3ZNLFlBQVk7O0lBRTVCLEtBQUt1TSxNQUFNN1E7SUFDRixJQUFMNEYsV0FBV2lMLEtBQUtELE9BQU9ILDZCQUE2QkM7SUFDeEQsT0FBTzlLO0dBQ1Q7R1pvR0EsU0FBU3NMLHlCQUEwQmhVO0lBQ3RCLElBQVAyUyxhQUFhQztJQUNqQkQsWUFBWTNTO0lBQ0MsSUFBVHlTLGVBQWVDLGFBQWFDO0lBQ2hDLE9BQU9GO0dBQ1Q7R0FyREEsU0FBU3dCLHlCQUEwQmpVO0lBQ2pDLElBQUlhLEtBQUtiLE1BQ0xjLEtBQUtkLE1BQ0xlLEtBQUtmLE1BQ0wrUyxPQUFPaFM7SUFDWCxHQUFJZ1M7S0FBYSxRQUNWbFMsS0FBR0MsS0FBSUM7ZUFDRkEsZ0JBQWV3UixXQUFVQTtlQUUxQjJCO0lBRVgsSUFBSWxCLElBQUl6UyxtQkFDSndJLE9BQU9sSSxLQUFHbVMsSUFBRWxTLE1BQUlrUyxLQUFHalM7SUFDdkIsR0FBSWdTLFFBQVM7S0FDWGhLO0tBQ0FBLE9BQU94SSxZQUFXd1M7OztLQUVsQmhLLE9BQU94STtJQUNULEdBQUlRLGFBQWFnSSxRQUFRQTtJQUN6QixPQUFPQTtHQUNUO0dZbEhBLFNBQVNvTCxpQkFBaUJDO0lBQ3hCLElBQUlDLFNBQVNELGFBQ1RWO0lBQ0osSUFBVyxJQUFGdFIsT0FBT0EsSUFBSWlTLFFBQVFqUyxJQUFLO0tBQy9CLEdBQUlnUyxLQUFLaFM7TUFDUFU7S0FDRjRRLE9BQU9BLE9BQU9VLEtBQUtoUzs7SUFFckIsT0FBT3NSO0dBQ1Q7R3BCdVRBLFNBQVNZLHdCQUF3QnpULElBQUlFO0lBQ25DO1lBQVdIO2FBQ1RDO2FBQ0VBLG9CQUF1QkU7YUFDeEJBO0dBQ0w7R0FLQSxTQUFTd1QsZ0JBQWdCcFEsR0FBSSxPQUFPQSxTQUFTO0dBSDdDLFNBQVNxUSxnQkFBZ0JyUSxHQUFJLE9BQU9BLFNBQVM7R29CclJyQixJQUFwQnNRO0dBS0osU0FBU0MsWUFBYWxCLE1BQU1tQixRQUFRUCxNQUFNOVE7SUFFeEN0QyxZQUFjd1M7SUFDZHhTLGNBQWMyVDtJQUNkM1QsWUFBY29UO0lBQ2RwVCxZQUFZc0M7R0FDZDtHQUVBb1Isb0NBQW9DRDtHQUVwQ0M7YUFBeUNoUztLQUMvQixJQUFKMkw7S0FDSixVQUFVM0wsa0JBQWtCQSxPQUFPQTtLQUNuQyxNQUFPQSxlQUFlZ0g7TUFBUTVHO0tBQzlCLEdBQUk5QixvQkFBb0IwQjtNQUN0Qkk7S0FDRixHQUFHOUI7TUFBaUMsSUFDdkIsSUFBRm9CLE9BQU9BLElBQUlwQixrQkFBa0JvQixJQUFLO09BQ3pDLEdBQUlNLElBQUlOLFVBQVVNLElBQUlOLE1BQU1wQixVQUFVb0IsSUFDcENzTDtPQUNGVyxNQUFPQSxNQUFNck4sVUFBVW9CLEtBQU1NLElBQUlOOzs7TUFFOUIsSUFDTSxJQUFGQSxJQUFJcEIsc0JBQXNCb0IsUUFBUUEsSUFBSztPQUM5QyxHQUFJTSxJQUFJTixVQUFVTSxJQUFJTixLQUFLcEIsVUFBVW9CLElBQ25Dc0w7T0FFRlcsTUFBT0EsTUFBTXJOLFVBQVVvQixNQUFPTSxJQUFJTjs7S0FHdEMsT0FBT2lNO0lBcEJzQjtHQXVCL0JxRzthQUFzQ3JHO0tBQ3BDLE9BQU9yTjs7UUFHTCxJQUFJWCxJQUFJVyxVQUFVcU4sY0FDZG5OLElBQUlGLFVBQVVxTjtRQUNsQixPQUFPaUcsd0JBQXdCalUsR0FBRWE7OztRQUdqQyxJQUFJZCxJQUFJWSxVQUFVcU4sY0FDZGpNLElBQUlwQixVQUFVcU47UUFDbEIsYUFBYWpPLEdBQUdnQztnQkFFaEIsT0FBT3BCLFVBQVVxTjs7SUFiTztHQWlCNUJxRzthQUFzQ3JHLEtBQUlsSztLQUN4QyxPQUFPbkQ7O1FBR0xBLFVBQVVxTixlQUFlbUcsZ0JBQWdCclE7UUFDekNuRCxVQUFVcU4sZUFBZWtHLGdCQUFnQnBRO1FBQ3pDOzs7UUFHQW5ELFVBQVVxTixlQUFlbEssTUFDekJuRCxVQUFVcU4sZUFBZWxLLE1BQ3pCO2dCQUVBbkQsVUFBVXFOLE9BQU9sSyxHQUNqQjs7S0FFRjtJQWhCMEI7R0FvQjVCdVE7YUFBdUN2UTtLQUNyQyxPQUFPbkQ7O1FBR0wsSUFBSTJGLElBQUk2TixnQkFBZ0JyUSxJQUNwQkgsSUFBSXVRLGdCQUFnQnBRO1FBQ3hCLEdBQUd3QyxLQUFLM0M7U0FDTmhELGVBQWUyRjs7U0FFWixJQUNPLElBQUZ2RSxPQUFPQSxJQUFFcEIsa0JBQWtCb0I7VUFDakNwQixVQUFVb0IsS0FBTUEsYUFBWXVFLElBQUkzQztRQUdwQzs7O1FBR0EsSUFBSXFJLEtBQUtsSSxNQUNMeVEsS0FBS3pRO1FBQ1QsR0FBR2tJLE1BQU11STtTQUNQNVQsZUFBZXFMOztTQUVaLElBQ08sSUFBRmpLLE9BQU9BLElBQUVwQixrQkFBa0JvQjtVQUNqQ3BCLFVBQVVvQixLQUFNQSxhQUFZaUssS0FBS3VJO1FBR3JDO2dCQUVBNVQsZUFBZW1ELElBQ2Y7O0lBOUJ5QjtHQW1DN0J1UTthQUEwQzFRLEdBQUc2UTtLQUMzQyxHQUFJN1QsZUFBZWdELFlBQVloRCxhQUFhZ0QsT0FBUTtNQUNsRCxJQUFJOFEsS0FBSzlULFlBQWFBLGtCQUNsQitULEtBQVEvUSxTQUFVQTtNQUN0QixPQUFPK1EsS0FBS0Q7O0tBRWQsR0FBSTlULG9CQUFvQmdEO01BQWUsT0FDOUJBLGdCQUFnQmhEO0tBRXpCLElBQVcsSUFBRm9CLE9BQU9BLElBQUlwQixrQkFBa0JvQjtNQUNwQyxHQUFJcEIsVUFBVW9CLE1BQU00QixPQUFPNUIsSUFDekIsT0FBUXBCLFVBQVVvQixLQUFLNEIsT0FBTzVCO0tBQ2xDLE9BQVFwQjs7Ozs7UUFNTixJQUFJaEIsR0FBR3dCO1FBQ1AsSUFBVyxJQUFGWSxPQUFPQSxJQUFJcEIsa0JBQWtCb0IsSUFBSztTQUN6Q3BDLElBQUlnQixVQUFVb0I7U0FDZFosSUFBSXdDLE9BQU81QjtTQUNYLEdBQUlwQyxJQUFJd0IsR0FDTjtTQUNGLEdBQUl4QixJQUFJd0IsR0FDTjtTQUNGLEdBQUl4QixLQUFLd0IsRUFBRztVQUNWLEtBQUtxVCxPQUFPLE9BQU9YO1VBQ25CLEdBQUlsVSxLQUFLQSxHQUFHO1VBQ1osR0FBSXdCLEtBQUtBLEdBQUc7OztRQUdoQjs7UUFHQSxJQUFXLElBQUZZLE9BQU9BLElBQUlwQixrQkFBa0JvQixPQUFNO1NBRTFDLEdBQUlwQixVQUFVb0IsU0FBTzRCLE9BQU81QixRQUMxQjtTQUNGLEdBQUlwQixVQUFVb0IsU0FBTzRCLE9BQU81QixRQUMxQjtTQUNGLEdBQUtwQixVQUFVb0IsV0FBYTRCLE9BQU81QixVQUNqQztTQUNGLEdBQUtwQixVQUFVb0IsV0FBYTRCLE9BQU81QixVQUNqQzs7UUFFSjs7Ozs7Ozs7O1FBU0EsSUFBVyxJQUFGQSxPQUFPQSxJQUFJcEIsa0JBQWtCb0IsSUFBSztTQUN6QyxHQUFJcEIsVUFBVW9CLEtBQUs0QixPQUFPNUIsSUFDeEI7U0FDRixHQUFJcEIsVUFBVW9CLEtBQUs0QixPQUFPNUIsSUFDeEI7O1FBRUo7O0tBRUY7SUEvRDhCO0dBb0VoQyxTQUFTNFMsa0JBQWtCeEIsTUFBTW1CLFFBQVFQLE1BQU05UTtJQUM3Q3RDLFlBQWN3UztJQUNkeFMsY0FBYzJUO0lBQ2QzVCxZQUFjb1Q7SUFDZHBULFlBQWNzQztHQUNoQjtHQUVBMFIsa0NBQWtDTjtHQUNsQ007YUFBK0N0UztLQUM3QyxVQUFVQTtNQUFpQixHQUNyQkEsZUFBZWdILFNBQVVoSDtPQUMzQkEsTUFBTUE7O09BQ0hJO0tBRVAsR0FBSUosV0FBV0EsT0FBTzFCLGNBQ3BCME07S0FDRixPQUFPaEw7SUFSNEI7R0FXckNzUywyQ0FBNEMzRyxLQUMxQyxPQUFPck4sVUFBVXFOLEtBRGU7R0FJbEMyRzthQUE0QzNHLEtBQUlsSyxHQUM5Q25ELFVBQVVxTixPQUFPbEssR0FDakIsU0FGZ0M7R0FLbEM2UTthQUE2QzdRLEdBQzNDbkQsZUFBZW1ELElBQ2YsU0FGaUM7R0FhbkMsU0FBUzhRLHNCQUFzQnpCLE1BQU1tQixRQUFRUCxNQUFNMUw7SUFDNUIsSUFBakJ3TSxtQkFBbUIzQiw2QkFBNkJDO0lBQ3BELEdBQUdXLGlCQUFpQkMsUUFBUWMsb0JBQW9CeE07S0FDOUM1RjtJQUVGLEdBQUc2UixlQUNBUCxvQkFDQWM7S0FDRCxXQUFXRixrQkFBa0J4QixNQUFNbUIsUUFBUVAsTUFBTTFMO0lBQ25ELFdBQVdnTSxZQUFZbEIsTUFBTW1CLFFBQVFQLE1BQU0xTDtHQUU3QztHQXlYQSxTQUFTeU0sb0JBQW9CQyxRQUFRL0IsSUFBSWhPO0lBQzFCLElBQVRnUSxXQUFXRDtJQUNmLEdBQUlDLGdCQUFnQkE7S0FDbEJsSztJQUNGO0tBQUkxSyxNQUFNMlU7S0FDTjVCLE9BQU8vUztLQUNQa1UsU0FBVWxVO0tBQ1YyVDtJQUNKLEdBQUcvTztLQUNELElBQVcsSUFBRmpELE9BQU9BLElBQUlpVCxVQUFValQsSUFBSztNQUNwQixJQUFUa1QsV0FBV0Y7TUFDZixHQUFHRSxtQkFBbUI7T0FDcEIsSUFBSUMsY0FBY0gsa0JBQ2RJLGNBQWNKO09BQ2xCLEdBQUdHO1FBQ0RwSztPQUNGbUssV0FBV0U7O01BRWJwQixVQUFVa0I7OztLQUdaLElBQVcsSUFBRmxULE9BQU9BLElBQUlpVCxVQUFValQsS0FBS2dTLFVBQVVnQjtJQUMvQztLQUFJMUIsT0FBT1MsaUJBQWlCQztLQUN4QjFMLE9BQU8rSyxzQkFBc0JELE1BQU1FO0tBQ25DdkYsS0FBSzhHLHNCQUFzQnpCLE1BQU1tQixRQUFRUCxNQUFNMUw7SUFDbkQsT0FBTzhLOztPQUVMLElBQVUsSUFBRnBSLE9BQU9BLElBQUlzUixNQUFNdFIsS0FDdkJzRyxLQUFLdEcsS0FBS2dULGlCQUVaOzs7T0FHQSxJQUFVLElBQUZoVCxPQUFPQSxJQUFJc1IsTUFBTXRSLEtBQ3ZCc0csS0FBS3RHLEtBQUtnVCxpQkFFWjs7T0FFQSxJQUFVLElBQUZoVCxPQUFPQSxJQUFJc1IsTUFBTXRSLEtBQ3ZCc0csS0FBS3RHLEtBQUtnVCxrQkFFWjs7T0FFQSxJQUFVLElBQUZoVCxPQUFPQSxJQUFJc1IsTUFBTXRSLEtBQ3ZCc0csS0FBS3RHLEtBQUtnVCxrQkFFWjs7T0FFQSxJQUFVLElBQUZoVCxPQUFPQSxJQUFJc1IsTUFBTXRSLEtBQ3ZCc0csS0FBS3RHLEtBQUtnVCxrQkFFWjs7O09BR1UsSUFBTkssUUFBUUw7T0FDWixHQUFHSztRQUFPdEs7O09BQ1YsSUFBVSxJQUFGL0ksT0FBT0EsSUFBSXNSLE1BQU10UixLQUN2QnNHLEtBQUt0RyxLQUFLZ1Q7T0FFWjs7T0FFTSxJQUFGdlIsUUFBUTZGO09BQ1osSUFBVSxJQUFGdEgsT0FBT0EsSUFBSXNSLE1BQU10UixJQUFJO1FBQzNCLElBQVcsSUFBRmdDLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtRQUN2QixJQUFOTSxRQUFRekgsb0JBQW9CcEs7UUFDaENzSyxPQUFPL0wsR0FBRXNUOztPQUVYOztPQUVNLElBQUY3UixRQUFRNkY7T0FDWixJQUFVLElBQUZ0SCxPQUFPQSxJQUFJc1IsTUFBTXRSLElBQUk7UUFDM0IsSUFBVyxJQUFGZ0MsT0FBTUEsT0FBTUEsS0FBS1AsRUFBRU8sS0FBS2dSO1FBQzNCLElBQUZsUyxJQUFJK1EseUJBQXlCaEcsb0JBQW9CcEs7UUFDckRzSyxPQUFPL0wsR0FBRWM7O09BRVg7O09BRUEsSUFBVSxJQUFGZCxPQUFPQSxJQUFJc1IsTUFBTXRSLElBQUk7UUFDckIsSUFBRmMsSUFBSThRLHlCQUF5Qm9CO1FBQ2pDakgsT0FBTy9MLEdBQUVjOztPQUVYOztPQUVBLElBQVUsSUFBRmQsT0FBT0EsSUFBSXNSLE1BQU10UixJQUFJO1FBQzNCO1NBQUl3UyxLQUFLWix5QkFBeUJvQjtTQUM5Qi9JLEtBQUsySCx5QkFBeUJvQjtRQUNsQ2pILE9BQU8vTCxTQUFPd1MsSUFBR3ZJOztPQUVuQjs7T0FFTSxJQUFGeEksUUFBUTZGO09BQ1osSUFBVSxJQUFGdEgsT0FBT0EsSUFBSXNSLE1BQU10UixJQUFJO1FBQzNCLElBQVcsSUFBRmdDLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtRQUMxQixJQUFIUixLQUFLWCx5QkFBeUJoRyxvQkFBb0JwSztRQUN0RCxJQUFXLElBQUZPLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtRQUMxQixJQUFIL0ksS0FBSzRILHlCQUF5QmhHLG9CQUFvQnBLO1FBQ3REc0ssT0FBTy9MLFNBQU93UyxJQUFHdkk7O09BRW5COztJQUVGZ0gsYUFBYWdDO0lBQ2IsT0FBT0osc0JBQXNCekIsTUFBTW1CLFFBQVFQLE1BQU0xTDtHQUNuRDtHQWpmQSxTQUFTaU4sZ0JBQWdCaFAsR0FBRTNDLEdBQUU2USxPQUMzQixPQUFPbE8sVUFBVTNDLEdBQUU2USxPQUNyQjtHRXZMQSxTQUFTZSxvQkFBcUIxVSxHQUFHaUQ7SUFDL0JqRCxJQUFJd08sa0JBQWtCeE8sR0FBR3NULGdCQUFnQnJRO0lBQ3pDakQsSUFBSXdPLGtCQUFrQnhPLEdBQUdxVCxnQkFBZ0JwUTtJQUN6QyxPQUFPakQ7R0FDVDtHQVZBLFNBQVMyVSxvQkFBcUIzVSxHQUFHNFU7SUFDL0IsT0FBT0Ysb0JBQW9CMVUsR0FBRzRSLHlCQUEwQmdEO0dBQzFEO0dGd3JCQSxTQUFTQyxhQUFhNUg7SUFDcEIsSUFBSTZILFdBQVc3QixpQkFBaUJoRyxVQUM1QmpOO0lBQ0osT0FBT2lOOzs7O09BSUwsR0FBRzZILGdCQUFnQkE7T0FDbkIsSUFBSXBHLE9BQU94TjtPQUNYLElBQUlBLE9BQU9BLFNBQVMrTCxnQkFBZ0IvTCxPQUFLO1FBQ3ZDd047U0FBSXpCLFFBQVEvTCxTQUFRK0wsUUFBUS9MLGNBQWMrTCxRQUFRL0w7V0FBZStMLFFBQVEvTDtRQUN6RWxCLElBQUl3TyxrQkFBa0J4TyxHQUFFME87O09BRTFCQTtPQUNBLE9BQVFvRzs7VUFDQXBHLElBQUt6QixRQUFRL0w7O1VBQ2J3TixLQUFLekIsUUFBUS9MOztVQUNid04sS0FBS3pCLFFBQVEvTCxRQUNuQmxCLElBQUl3TyxrQkFBa0J4TyxHQUFHME87O09BRTNCOzs7T0FHQSxHQUFHb0csZ0JBQWdCQTtPQUNuQixJQUFJcEcsT0FBT3hOO09BQ1gsSUFBSUEsT0FBT0EsU0FBUytMLGdCQUFnQi9MLE9BQUs7UUFDdkN3TixJQUFJekIsUUFBUS9MLFNBQVErTCxRQUFRL0w7UUFDNUJsQixJQUFJd08sa0JBQWtCeE8sR0FBRTBPOztPQUUxQixJQUFLb0csb0JBQ0g5VSxJQUFJd08sa0JBQWtCeE8sR0FBR2lOLFFBQVEvTDtPQUNuQzs7T0FFQSxHQUFJNFQsZUFBZUE7T0FDbkIsSUFBVyxJQUFGNVQsT0FBT0EsSUFBSTRULFVBQVU1VCxLQUFLbEIsSUFBSXdPLGtCQUFrQnhPLEdBQUdpTixRQUFRL0w7T0FDcEU7OztPQUdBLEdBQUk0VCxlQUFlQTtPQUNuQixJQUFXLElBQUY1VCxPQUFPQSxJQUFJNFQsVUFBVTVULEtBQUtsQixJQUFJd08sa0JBQWtCeE8sR0FBR2lOLFFBQVEvTDtPQUNwRTs7T0FFQSxHQUFJNFQsZUFBZUE7T0FDbkJBO09BQ0EsSUFBVyxJQUFGNVQsT0FBT0EsSUFBSTRULFVBQVU1VCxLQUM1QmxCLElBQUl3TyxrQkFBa0J4TyxHQUFHaU4sUUFBUS9MO09BRW5DOztPQUVBNFQ7O09BRUEsR0FBSUEsZUFBZUE7T0FDbkIsSUFBVyxJQUFGNVQsT0FBT0EsSUFBSTRULFVBQVU1VDtRQUFLbEIsSUFBSTJVLG9CQUFvQjNVLEdBQUdpTixRQUFRL0w7T0FDdEU7O09BRUE0VDs7T0FFQSxHQUFJQSxlQUFlQTtPQUNuQixJQUFXLElBQUY1VCxPQUFPQSxJQUFJNFQsVUFBVTVUO1FBQUtsQixJQUFJMlUsb0JBQW9CM1UsR0FBR2lOLFFBQVEvTDtPQUN0RTs7SUFFRixPQUFPbEI7R0FDVDtHSHhvQkEsU0FBUytVLHFCQUFxQmIsUUFBUTFCLE1BQ3BDQSxhQUNBLE9BQU8wQjtHQUNUO0dBSUEsU0FBU2MseUJBQXlCZCxRQUFRMUI7SUFDeEMsT0FBUTBCOztPQUVOMUIsYUFDQSxPQUFPMEI7O09BRVBqSztlQUNPQTs7R0FFWDtHQWhDQSxTQUFTZ0wscUJBQXFCZixRQUFRMUI7SUFDOUIsSUFBRjdQLFFBQVE2RjtJQUNaLElBQVcsSUFBRnRGLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtJQUNqQzFCO0lBQ0EsT0FBT3pGLG9CQUFxQnBLO0dBQzlCO0dqQlNBLFNBQVN1UyxtQkFBbUJwVyxHQUFFd0IsR0FBR3FULE9BQVMsT0FBTzdVLFVBQVV3QixHQUFHO0dBOEo5RCxTQUFTNlUsZ0JBQWdCbFMsR0FDdkIsT0FBUUEsV0FBYUEsU0FDdkI7R2lCeElvQjtJQUFoQm1TOztxQkFFZ0JIO21CQUNEcEg7O2lCQUVIcUg7Y0FDSEM7MkJBR1FKOzJCQUlBQzs7O2lCQUlXZCxRQUFRL0I7U0FBSyxPQUFPOEIsb0JBQXFCQyxRQUFPL0I7UUFBMUQ7bUJBQ0hEO2lCQUNGdUM7Y0FDSkk7OztpQkFHbUJYLFFBQVEvQjtTQUFLLE9BQU84QixvQkFBcUJDLFFBQU8vQjtRQUExRDttQkFDSEQ7aUJBQ0Z1QztjQUNKSTtHVWxPYixTQUFTUSw0QkFBNEI1UDtJQUNuQyxPQUFPMlAsZ0JBQWdCM1A7Y0FBa0IyUCxnQkFBZ0IzUDtHQUMzRDtHQUlBLFNBQVM2UCwrQkFBK0JDLEtBQUtDLFFBQVFDLE1BQU05QjtJQUNoRCxJQUFMcFAsT0FBTzhRLDRCQUE0Qkc7SUFDdkMsR0FBR2pSLEtBQU07S0FDRCxJQUFGekYsSUFBSzJXLFdBQVVsUixLQUFLaVIsUUFBT0QsS0FBSTVCLFNBQU9wUCxLQUFLZ1IsS0FBSUMsUUFBTzdCO0tBQzFELEdBQUdBLFNBQVM3VSxLQUFLQSxHQUFHLE9BQU8yVztLQUMzQixLQUFJM1csT0FBTUEsR0FBRyxTQUFRQTtLQUNyQixJQUFJQSxhQUFhLE9BQVFBOztJQUUzQixPQUFPMlc7R0FDVDtHQXRDQSxTQUFTQyxxQkFBcUJqUTtJQUM1QixVQUFXQTtLQUFnQjtZQUNsQk0saUJBQWlCTjtLQUFJO1lBQ3JCTyxrQkFBa0JQO0tBQUk7WUFDdEJBLGFBQWErQyxTQUFTL0MsU0FBVUEsY0FBYUEsWUFBYSxDQUV6RCxJQUFKbEcsTUFBTWtHLFVBR1YsT0FBUWxHLGlCQUFjQTtZQUVma0csYUFBYXRDO0tBQVE7bUJBQ2RzQztLQUFlO1lBQ3RCQSxhQUFha1E7S0FBUTtZQUNyQmxRLEtBQUtBO0tBQWU7WUFDcEJBLEtBQUtBO0tBQVc7bUJBQ1RBO0tBQWlCO21CQUNqQkEsZUFBZTtJQUMvQjtHQUNGO0dBME1BLFNBQVNtUSxpQkFBa0JuUSxHQUFHM0M7SUFDNUIsR0FBSTJDLElBQUkzQyxHQUFHO0lBQWEsR0FBSTJDLEtBQUszQyxHQUFHO0lBQVU7R0FDaEQ7RzFCMGFBLFNBQVMrUyxvQkFBb0JqUCxJQUFJRTtJQUMvQixPQUFRRixLQUFLRSxXQUFRRixLQUFLRTtHQUM1QjtHQXRKQSxTQUFTZ1AsbUJBQW1CbFAsSUFBSUU7SUFDN0JGLFlBQWFsQiw2QkFBNkJrQjtJQUMxQ0UsWUFBYXBCLDZCQUE2Qm9CO0lBQzNDLE9BQVFGLE9BQU9FLGFBQVVGLE9BQU9FO0dBQ2xDO0cwQjNjQSxTQUFTaVAsaUJBQWtCdFEsR0FBRzNDLEdBQUc2UTtJQUNyQixJQUFOcUM7SUFDSixPQUFRO0tBQ04sTUFBTXJDLFNBQVNsTyxNQUFNM0MsR0FBSTtNQUNiLElBQU5tVCxRQUFRUCxxQkFBcUJqUTtNQUVqQyxHQUFHd1EsYUFBYyxDQUFFeFEsSUFBSUEsTUFBTTtNQUVuQixJQUFOeVEsUUFBUVIscUJBQXFCNVM7TUFFakMsR0FBR29ULGFBQWMsQ0FBRXBULElBQUlBLE1BQU07TUFHN0IsR0FBR21ULFVBQVVDLE1BQU87T0FDbEIsR0FBR0QsY0FBZTtRQUNoQixHQUFHQztTQUFlLE9BQ1RaLCtCQUErQjdQLEdBQUczQyxRQUFPNlE7UUFFbEQ7O09BRUYsR0FBR3VDLGNBQWU7UUFDaEIsR0FBR0Q7U0FBZSxPQUNUWCwrQkFBK0J4UyxHQUFHMkMsTUFBTWtPO1FBRWpEOztPQUVGLE9BQVFzQyxRQUFRQzs7TUFFbEIsT0FBT0Q7O1NBSUxyVSxvREFDQTs7U0FFTSxJQUFGOUMsSUFBSThXLGlCQUFpQm5RLE1BQU0zQyxPQUMvQixHQUFJaEUsUUFBUSxPQUFRQSxPQUNwQjs7U0FHQThDLG9EQUNBOztTQUdBQTtTQUNBOztTQUVBQSxnREFDQTs7U0FFQSxHQUFJNkQsTUFBTTNDLEVBQUc7VUFDTCxJQUFGaEUsSUFBSWdYLG1CQUFtQnJRLEdBQUczQztVQUM5QixHQUFJaEUsUUFBUSxPQUFRQTs7U0FFdEI7O1NBR0E4QztTQUNBOztTQUdBQTs7U0FDQTs7U0FFQUE7U0FDQTs7U0FFQUEsb0RBQ0E7O1NBRVMsSUFBTDJDLE9BQU84USw0QkFBNEI1UDtTQUN2QyxHQUFHbEIsUUFBUThRLDRCQUE0QnZTO1VBQUcsT0FDaEMyQyxnQkFBYzNDO1NBRXhCLEtBQUl5QixNQUNGM0M7U0FDSSxJQUFGOUMsSUFBSXlGLEtBQUtrQixHQUFFM0MsR0FBRTZRO1NBQ2pCLEdBQUc3VSxLQUFLQSxHQUFFLE9BQ0Q2VSxjQUFTN1U7U0FFbEIsR0FBR0EsT0FBT0EsUUFBSztTQUdmLEdBQUlBLFFBQVEsT0FBUUE7U0FDcEI7O1NBRU0sSUFBRkEsSUFBSTJHLFVBQVUzQyxHQUFFNlE7U0FDcEIsR0FBRzdVLEtBQUtBLEdBQUcsT0FDRjZVLGNBQVM3VTtTQUVsQixHQUFHQSxPQUFPQSxRQUFLO1NBR2YsR0FBSUEsUUFBUSxPQUFRQTtTQUNwQjs7U0FFQTJHLE1BQUtBO1NBQ0wzQyxNQUFLQTtTQUNMLEdBQUkyQyxJQUFJM0MsR0FBRztTQUNYLEdBQUkyQyxJQUFJM0MsR0FBRztTQUNYLEdBQUkyQyxLQUFLM0MsRUFBRztVQUNWLEtBQUs2USxPQUFPLE9BQU9YO1VBQ25CLEdBQUl2TixLQUFLQSxHQUFHO1VBQ1osR0FBSTNDLEtBQUtBLEdBQUc7O1NBRWQ7O1NBZUEsR0FBSTJDLElBQUkzQyxHQUFHO1NBQ1gsR0FBSTJDLElBQUkzQyxHQUFHO1NBQ1gsR0FBSTJDLEtBQUszQyxFQUFHO1VBQ1YsS0FBSzZRLE9BQU8sT0FBT1g7VUFDbkIsR0FBSXZOLEtBQUtBLEdBQUc7VUFDWixHQUFJM0MsS0FBS0EsR0FBRzs7U0FFZDs7U0FFQSxHQUFHMkMsTUFBTTNDLEVBQUcsQ0FDVixLQUFLNlEsT0FBTyxPQUFPWCxLQUNuQixXQUVGOztTQUVBLElBQUl2TixJQUFJN0UsdUJBQXVCNkUsSUFDM0IzQyxJQUFJbEMsdUJBQXVCa0M7U0FDL0IsR0FBRzJDLE1BQU0zQyxFQUFHLENBQ1YsR0FBRzJDLElBQUkzQyxHQUFHLFlBQ1YsR0FBRzJDLElBQUkzQyxHQUFHO1NBRVo7O1NBRUEsSUFBSTJDLElBQUlBLGNBQ0ozQyxJQUFJQTtTQUNSLEdBQUcyQyxNQUFNM0MsRUFBRyxDQUNWLEdBQUcyQyxJQUFJM0MsR0FBRyxZQUNWLEdBQUcyQyxJQUFJM0MsR0FBRztTQUVaOzs7O1NBSUEsR0FBR29PLHlCQUF5QitFLE9BQVE7VUFDbENyVTtVQUNBOztTQUVGLEdBQUk2RCxZQUFZM0MsVUFBVSxPQUFRMkMsV0FBVzNDO1NBQzdDLEdBQUkyQyxjQUFjdVEsV0FBV3ZRLEdBQUczQztTQUNoQzs7O0tBR0osR0FBSWtULG1CQUFtQjtLQUNqQixJQUFGOVUsSUFBSThVO0tBQ1JsVCxJQUFJa1Q7S0FDSnZRLElBQUl1UTtLQUNKLEdBQUk5VSxRQUFRdUUsVUFBVXVRLFdBQVd2USxHQUFHM0MsR0FBRzVCO0tBQ3ZDdUUsSUFBSUEsRUFBRXZFO0tBQ040QixJQUFJQSxFQUFFNUI7O0dBRVY7R0FtQkEsU0FBU2lWLGlCQUFrQnJYLEdBQUd3QjtJQUFLLFVBQVN5VixpQkFBaUJqWCxHQUFFd0I7R0FBZTtHYmE5RSxTQUFTOFYsV0FBVzNRLEdBQUczQyxHQUFHYjtJQUN4QjtLQUFJbkQsSUFBSTJHLGFBQWEzQztLQUNqQnhDLElBQUlqQixXQUFXUCxJQUFFbUQ7S0FDakJvVSxJQUFLdlgsSUFBSW1EO0tBQ1R5TSxJQUFJMkgsS0FBS3ZUO0lBQ2IsUUFBUXhDLElBQUlqQixXQUFXcVAsSUFBRXpNLElBQUl5TSxJQUFJek07R0FDbkM7R0FLQSxTQUFTcVUsY0FBY0MsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTWpNLE1BQU1DLE1BQU0zSSxLQUFLNkksTUFBTUM7SUFDNUQsSUFBSjhMLE1BQU9sTSxVQUFVQyxPQUFLM0k7SUFHMUIsSUFBVSxJQUFGYixJQUFJYSxTQUFPYixRQUFRQSxJQUFLO0tBQ3hCO01BQUZwQyxJQUFJc1gsV0FBV08sS0FBTWxNLFVBQVVDLE9BQUt4SixVQUFZMEosVUFBVUM7S0FDOUQwTCxVQUFVQyxPQUFLdFYsS0FBS3BDO0tBQ3BCNlgsTUFBTTdYOztJQUVSMlgsVUFBVUMsUUFBUUM7SUFDbEI7R0FDRjtHQWpNQSxTQUFTQywrQkFBK0J6SCxLQUFLaEM7SUFDM0MsSUFBSTFILElBQUkwSixTQUFTaEMsTUFDYnJLO0lBQ0osR0FBRzJDLGVBQWdCLENBQUUzQyxTQUFRMkM7SUFDN0IsR0FBR0EsV0FBZ0IsQ0FBRTNDLFFBQVEyQztJQUM3QixHQUFHQSxTQUFnQixDQUFFM0MsUUFBUTJDO0lBQzdCLEdBQUdBLE9BQWdCLENBQUUzQyxRQUFRMkM7SUFDN0IsR0FBR0EsTUFBZ0IsQ0FBRTNDLFFBQVEyQztJQUM3QixHQUFHQSxPQUFrQjNDO0lBQ3JCLFlBQVlBO0dBQ2Q7R0FnSkEsU0FBUytULGVBQWVwTSxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQztJQUNwRCxHQUFHQSxXQUFZLENBQ2JGLFVBQVVDLFdBQ1Y7SUFFTyxJQUFMRTtJQUNKLElBQVUsSUFBRjdKLE9BQU9BLElBQUl5SixNQUFNekosSUFBSztLQUN0QixJQUFGdUUsSUFBS2dGLFVBQVVDLE9BQUt4SjtLQUN4QnVKLFVBQVVDLE9BQUt4SixLQUFNdUUsS0FBS3FGLFFBQVNDO0tBQ25DQSxPQUFPdEYsV0FBWXFGOztJQUVyQkYsVUFBVUMsUUFBUUU7SUFDbEI7R0FDRjtHQTNQQSxTQUFTK0wsTUFBTWhZO0lBQ2JnQixnQkFBZ0I0UixXQUFXNVM7SUFHM0JnQixjQUFjQTtHQUNoQjtHQUVBZ1g7R0FzQkEsU0FBU0MsV0FBV3ZFO0lBQ1YsSUFBSndFLFVBQVVGLE1BQU10RTtJQUNwQixJQUFVLElBQUZ0UixPQUFPQSxJQUFJc1IsTUFBTXRSLEtBQ3ZCOFYsU0FBUzlWO0lBRVgsT0FBTzhWO0dBQ1Q7R0FHQSxTQUFTQyxnQkFBZ0I5SCxLQUFLaEMsS0FBS3BMO0lBQ2pDLElBQVUsSUFBRmIsT0FBT0EsSUFBSWEsS0FBS2IsS0FDdEJpTyxTQUFTaEMsTUFBSWpNO0lBRWY7R0FDRjtHQXdFQSxTQUFTZ1csU0FBUy9ILEtBQUtoQyxLQUFLcEwsS0FBS29WO0lBQ3JCLElBQU5DLFFBQVFEO0lBQ1osSUFBVSxJQUFGalcsT0FBT0EsSUFBSWEsS0FBS2IsSUFBSztLQUNyQixJQUFGcEMsS0FBS3FRLFNBQVNoQyxNQUFJak0sWUFBWWtXO0tBQ2xDakksU0FBU2hDLE1BQUlqTSxLQUFNcEM7S0FDbkIsR0FBR0EsS0FBTUEsUUFBVSxDQUNqQnNZLFdBQ0EsYUFFQUE7O0lBR0osT0FBT0E7R0FDVDtHQUtBLFNBQVNDLFFBQVE1TSxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNeU0sTUFBTUg7SUFDekMsSUFBTkMsUUFBUUQ7SUFDWixJQUFVLElBQUZqVyxPQUFPQSxJQUFJb1csTUFBTXBXLElBQUs7S0FDdEI7TUFBRnBDLEtBQUsyTCxVQUFVQyxPQUFLeEosYUFBYTBKLFVBQVVDLE9BQUszSixZQUFZa1c7S0FDaEUzTSxVQUFVQyxPQUFLeEosS0FBS3BDO0tBQ3BCLEdBQUdBLEtBQU1BLFNBQ1BzWSxnQkFFQUE7O0lBR0osT0FBT0YsU0FBU3pNLE1BQU1DLE9BQUs0TSxNQUFNM00sT0FBSzJNLE1BQU1GO0dBQzlDO0dBMUhBLFNBQVNHLGFBQWFwWSxHQUNwQixXQUFXMlgsTUFBTTNYLEdBQ25CO0dBd0tBLFNBQVNxWSxlQUFlL00sTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTXlNLE1BQU1HLE1BQU1DO0lBQ2hFLElBQUlOLFdBQ0EzUixJQUFLZ1MsVUFBVUM7SUFDbkIsSUFBVSxJQUFGeFcsT0FBT0EsSUFBSW9XLE1BQU1wVyxJQUFLO0tBQzVCO01BQUl5VztTQUFNbE4sVUFBVUMsT0FBS3hKO1dBQWEwSixVQUFVQyxPQUFLM0osYUFBYXVFO1VBQWtCMlI7TUFDaEZRLE1BQU1oTixVQUFVQyxPQUFLM0osYUFBYXVFO0tBQ3RDMlIsUUFBUS9YLFdBQVd1WTtLQUNaLElBQUhDLEtBQUtGLEtBQU1DO0tBQ2ZuTixVQUFVQyxPQUFLeEosS0FBSzJXO0tBQ3BCVCxTQUFTL1gsV0FBV3dZOztJQUd0QixPQUFHUCxPQUFPM00sUUFBUXlNO2NBQ1RDO2VBQVE1TSxNQUFNQyxPQUFLNE0sTUFBTTNNLE9BQUsyTSxNQUFNQyxjQUFjSDtjQUVsREE7R0FFWDtHQXREQSxTQUFTVSxTQUFTM0ksS0FBS2hDLEtBQUtwTCxLQUFLb1Y7SUFDcEIsSUFBUFksU0FBVVo7SUFDZCxJQUFVLElBQUZqVyxPQUFPQSxJQUFJYSxLQUFLYixJQUFLO0tBQ3JCLElBQUZwQyxLQUFLcVEsU0FBU2hDLE1BQUlqTSxZQUFXNlc7S0FDakM1SSxTQUFTaEMsTUFBSWpNLEtBQUtwQztLQUNsQixHQUFJQSxPQUFRLENBQ1ZpWixZQUNBLGFBRUFBOztJQUdKLE9BQVFBO0dBQ1Y7R0FNQSxTQUFTQyxRQUFRdk4sTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTXlNLE1BQU1IO0lBQ3hDLElBQVBZLFNBQVVaO0lBQ2QsSUFBVSxJQUFGalcsT0FBT0EsSUFBSW9XLE1BQU1wVyxJQUFLO0tBQ3RCO01BQUZwQyxLQUFLMkwsVUFBVUMsT0FBS3hKLGFBQWEwSixVQUFVQyxPQUFLM0osWUFBWTZXO0tBQ2hFdE4sVUFBVUMsT0FBS3hKLEtBQUtwQztLQUNwQixHQUFJQSxRQUNGaVosaUJBRUFBOztJQUdKLE9BQU9ELFNBQVNyTixNQUFNQyxPQUFLNE0sTUFBTTNNLE9BQUsyTSxNQUFPUztHQUMvQztHQTRKQSxTQUFTRSxZQUFZeE4sTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTXlNO0lBQ2pEO0tBQUk3UixJQUFJeUosZUFBZXpFLE1BQU1DLE1BQU1DO0tBQy9CN0gsSUFBSW9NLGVBQWV0RSxNQUFNQyxNQUFNeU07SUFDbkMsR0FBRzdSLElBQUkzQyxHQUFHO0lBQ1YsR0FBRzJDLElBQUkzQyxHQUFHO0lBQ1YsSUFBVSxJQUFGNUIsSUFBSXlKLFVBQVV6SixRQUFRQSxJQUFLO0tBQ2pDLEdBQUt1SixVQUFVQyxPQUFLeEosV0FBYTBKLFVBQVVDLE9BQUszSixVQUFXO0tBQzNELEdBQUt1SixVQUFVQyxPQUFLeEosV0FBYTBKLFVBQVVDLE9BQUszSixVQUFXOztJQUU3RDtHQUNGO0dBckVBLFNBQVNnWCxRQUFRek4sTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTXlNO0lBQzdDLEdBQUdBLFVBQVc7S0FDWmhCLGNBQWM3TCxNQUFNQyxVQUFRRCxNQUFNQyxNQUFNRCxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQztLQUNoRTs7SUFHSSxJQUFGNUwsSUFBSTJYLCtCQUErQmhNLE1BQU1DLE9BQUt5TTtJQUNsRFQsZUFBZWpNLE1BQU1DLE1BQU15TSxNQUFNQyxzQkFBc0J0WTtJQUN2RDRYLGVBQWVwTSxNQUFNQyxNQUFNQyxNQUFNNE0sc0JBQXNCdFk7SUFFdkQsSUFBSXlGLEtBQUtrRyxVQUFVQyxPQUFLeU0sc0JBQ3BCN1IsSUFBSXNSLFdBQVdPO0lBQ25CLElBQVcsSUFBRnBXLElBQUl5SixVQUFVekosS0FBS29XLE1BQU1wVyxJQUFLO0tBRTdCO01BQUppWDtRQUFNelQ7V0FBbUIrRixVQUFVQyxPQUFLeEo7V0FBWWtWO2FBQVkzTCxVQUFVQyxPQUFLeEosVUFBWXVKLFVBQVVDLE9BQUt4SixjQUFZd0Q7O0tBQzFIdVMsZ0JBQWdCeFIsTUFBTTZSO0tBQ3RCRSxlQUFlL1IsTUFBTTZSLFVBQVExTSxNQUFNQyxNQUFNeU0sTUFBTUMsY0FBY1k7S0FDN0RILFFBQVF2TixNQUFNQyxPQUFLeEosSUFBRW9XLE1BQU1BLFVBQVE3UixNQUFNNlI7S0FFekM7TUFBTzdNLFVBQVVDLE9BQUt4SjtTQUFXK1csWUFBWXhOLE1BQU1DLE9BQUt4SixJQUFFb1csTUFBTUEsTUFBTTFNLE1BQU1DLE1BQU15TSxXQUFZO01BQzVGYSxNQUFNQTtNQUNOSCxRQUFRdk4sTUFBTUMsT0FBS3hKLElBQUVvVyxNQUFNQSxVQUFRMU0sTUFBTUMsTUFBTXlNOztLQUdqRDdNLFVBQVVDLE9BQUt4SixLQUFLaVg7O0lBR3RCM04sZ0JBQWdCQyxNQUFNQyxNQUFNNE0sTUFBTUMsc0JBQXNCdFk7SUFDeER1TCxnQkFBZ0JJLE1BQU1DLE1BQU15TSxNQUFNQyxzQkFBc0J0WTtJQUN4RDtHQUNGO0dNa0xBLFNBQVNtWixhQUFhQyxLQUFLQztJQUN6QixHQUFJQSxtQkFBbUJEO0tBQ3JCelc7SUFDRixJQUFXLElBQUZWLE9BQU9BLElBQUlvWCxpQkFBaUJwWDtLQUNuQyxHQUFJb1gsU0FBU3BYLE1BQU1tWCxTQUFTblg7TUFDMUJVO0lBQ0owVyxhQUFhRDtJQUNiO0dBQ0Y7R05uWkEsU0FBU0UsYUFBYXBKLEtBQUtoQyxLQUN6QixHQUFJZ0MsU0FBU2hDLFdBQVcsVUFDeEIsU0FDRjtHZGtKQSxTQUFTcUwsZUFBZ0IxWixHQUFHd0IsR0FBSyxPQUFPeEIsTUFBTXdCLEdBQUc7RzRCM05qRCxTQUFTbVksc0JBQXNCeFo7SUFDbEIsSUFBUHlaO0lBQ0osR0FBR3paLFFBQVF5WixRQUNYO0tBQ0UsSUFBSXJNLEtBQUtzTSxPQUFPQztLQUNoQkQsaUJBQWdCMVo7S0FDaEJvTixNQUFLc00sb0JBQW9CQTtLQUN6QkEsT0FBS3pUO0tBQ0wsT0FBT21IOzs7S0FHUHBDLGtDQUFrQ2hMO0dBRXRDO0czQjRsQkEsU0FBUzRaLHVCQUF3QjVaLEdBQUdpQyxHQUFHZTtJQUNyQ2dJO0dBQ0Y7R0Q3WEEsU0FBUzZPLG9CQUFxQmhhO0lBQzVCLEdBQUlBLE9BQU9BLElBQUlPLFVBQVVQO0lBQ3pCO1lBQVdZO2FBQ1RaO2FBQ0FPLFdBQVdQLElBQUlNO2FBQ2ZDLFdBQVdQLElBQUlNLG9CQUFvQkE7R0FDdkM7R2tCdkZBLFNBQVMyWix3QkFBd0JyTTtJQUN0QixJQUFMTixPQUFPRixpQkFBaUJRO0lBQzVCLE9BQU9vTSxvQkFBb0IxTTtHQUM3QjtHRThSQSxTQUFTNE0sY0FBYy9MLElBQUlDLElBQUlyRyxJQUFJNUQ7SUFDakNnSyxPQUFPQSxXQUFXQyxJQUFHckcsTUFBTTVEO0lBQzNCO0dBQ0Y7R2hCMVZBO0lBQUlnVztNQUFhO1FBQ2YsSUFBSW5ZLFVBQVVDLG9CQUNWbVksZ0JBQ0EvVDtRQUVKLEdBQUdyRSxXQUNHQSxnQkFDQUEsd0JBQXlCO1NBQ3BCLElBQUxxWSxPQUFPclk7U0FFWG9ZLE9BQU9DO1NBQ1BoVSxPQUFPZ1U7O1FBR1QsSUFBSTNXLElBQUltQyx3QkFBd0J1VSxPQUM1QkUsWUFBWTVXO1FBQ2hCLElBQVUsSUFBRnRCLE9BQU9BLElBQUlpRSxhQUFhakU7U0FDOUJrWSxXQUFXelUsd0JBQXdCUSxLQUFLakU7UUFDMUMsT0FBT2tZO09BbEJTOztJQXVCZEMsdUJBQXVCSjtHRWtQM0IsU0FBU0ssb0JBQXFCcmEsR0FBSSxPQUFPc2EsS0FBS25XLHdCQUF3Qm5FLElBQUk7R1FkMUUsU0FBU3VhLGNBQWMxTCxRQUFRcUIsS0FBS2dEO0lBQzFCLElBQUpwUSxNQUFNb047SUFDVnJCLGlCQUFpQi9MO0lBQ2pCLElBQVUsSUFBRmIsT0FBT0EsSUFBSWEsS0FBS2IsS0FDdEI0TSxpQkFBaUJxQixTQUFTak87SUFFNUJpUixRQUFRcFE7SUFDUm9RLFFBQVFwUTtHQUNWO0dLcldBLFNBQVMwWCxpQkFBaUJDLFVBQ3hCLFNBQ0Y7R2ZuQkEsU0FBU0MsY0FBZTdVO0lBQ3RCLEdBQUcvRCxpQkFBaUJBLGdCQUFnQitEO0lBRXBDLEdBQUcvRCxzQkFBc0JBO0tBQ3ZCQSx3QkFBd0IrRDtJQUMxQmxEO0dBQ0Y7R2NnSUEsU0FBU2dZLHdCQUF3QmxOO0lBQ3RCLElBQUxOLE9BQU9GLGlCQUFpQlE7SUFDNUIsT0FBT047R0FDVDtHWmtDQSxTQUFTeU4sbUJBQW1CcFUsR0FDMUIsT0FBT0EsV0FDVDtHYzBYQSxTQUFTcVUsZ0JBQWdCN00sSUFBSThNO0lBQzNCQSxPQUFPRixtQkFBbUJFO0lBQzFCLElBQUlDLGNBQ0E3RixXQUFXNEY7SUFFZixHQUFJNUYsZ0JBQWdCQTtLQUNsQnZTO0lBRVcsSUFBVGtUO0lBQ0osSUFBVyxJQUFGNVQsT0FBT0EsSUFBSWlULFVBQVVqVCxJQUFLO0tBQ2pDOFksUUFBUTlZLEtBQUs2WSxLQUFLN1k7S0FDbEIsR0FBSThZLFFBQVE5WTtNQUNWVTtLQUNGa1QsV0FBV0EsV0FBV2tGLFFBQVE5WTs7SUFHdkIsSUFBTHNSLE9BQU9TLGlCQUFpQmhHO0lBRTVCLEdBQUk2SCxZQUFZdEM7S0FDZDVRO0lBQ0YsT0FBT21TLHNCQUFzQjlHLFNBQVNBLFdBQVcrTSxTQUFTL007R0FDNUQ7R0svY29CLElBQWhCZ047R0FJSixTQUFTQyxlQUFnQnBYLEdBQ3ZCQSxPQUFLbVgsbUJBQ0wsT0FBT25YLEVBQ1Q7R1YwS0EsU0FBU3FYLGtCQUFrQnJiLEdBQUV3QixHQUFFb08sR0FBRTFPO0lBQ3pCLElBQUZmLElBQUlnTTtJQUNSaE0sbUJBQW1CSCxHQUFFRyxXQUFXcUIsR0FBRW9PLEtBQUcxTztJQUNyQztHQUNGO0djelBBLFNBQVNvYSxpQ0FBaUNDLE1BQU1DLE1BQU1DLEtBQUtDLE1BQU16WTtJQUMvRCxTQUFTd1k7S0FDUDNZO0lBQ0YsR0FBR0csVUFBVTtJQUNKLElBQUw4SSxPQUFPMFAsV0FBV0M7SUFDdEIsR0FBR0YsT0FBT3ZZLE1BQU0yRyxzQkFBc0IyUixPQUNwQzdOO0lBRUYsR0FBRzNCLE9BQU85SSxNQUFNd1ksaUJBQ2QvTjtJQUVRLElBQU5pTyxRQUFRN1IsMkJBQTJCeVIsWUFBWUMsTUFBS0EsT0FBT3ZZO0lBQy9Ed1ksYUFBYUUsT0FBTTVQO0lBQ25CO0dBQ0Y7R2RzREEsU0FBUzZQLHlCQUF5QnZXO0lBQzFCLElBQUZsRixJQUFJZ007SUFDUmhNLFVBQVVrRjtJQUNDLElBQVB3VyxTQUFTdlgsd0JBQXdCZTtJQUNyQyxHQUFHbEYsYUFBYUEsWUFBWTBiO0lBQzVCO0dBQ0Y7R1ptREEsU0FBU0MsdUJBQTBCLE9BQU9wYixpQkFBa0I7R0gyRDVELFNBQVNxYixnQ0FBaUMvYixHQUFHRyxHQUFLLE9BQU9ILHVCQUF1Qkc7R0FBRztHb0JxSW5GLFNBQVM2YixvQkFBb0I3TixJQUFJQztJQUN2QixJQUFKQyxNQUFNRixVQUFVQztJQUNwQixHQUFHQyxXQUFXRixnQkFBZ0JUO0lBQzlCLElBQUlZLEtBQUtILE9BQU9FLE1BQ1pFLEtBQUtKLE9BQU9FO0lBQ2hCLE9BQVFDLEtBQU1DO0dBQ2hCO0dPekpBLFNBQVMwTixhQUFjdFYsR0FBRzNDLEdBQUssT0FBT2lULGlCQUFrQnRRLEdBQUczQyxTQUFVO0dHNUwvQztJQUFsQmtZO01BQW9CO1FBQ3RCLFNBQVNDLElBQUtuYyxHQUFHd0IsR0FBSyxPQUFReEIsSUFBSXdCLE1BQVE7UUFDMUMsU0FBUzRhLEdBQUczYSxHQUFFa0YsR0FBRTNDLEdBQUVoRSxHQUFFRyxHQUFFMEQ7U0FDcEI4QyxJQUFJd1YsSUFBSUEsSUFBSXhWLEdBQUdsRixJQUFJMGEsSUFBSW5jLEdBQUc2RDtTQUMxQixPQUFPc1ksSUFBS3hWLEtBQUt4RyxJQUFNd0csV0FBWXhHLEdBQUs2RDtRQUMxQztRQUNBLFNBQVNxWSxHQUFHMVYsR0FBRTNDLEdBQUViLEdBQUV5QyxHQUFFNUYsR0FBRUcsR0FBRTBEO1NBQ3RCLE9BQU91WSxHQUFJcFksSUFBSWIsTUFBUWEsSUFBSzRCLEdBQUllLEdBQUczQyxHQUFHaEUsR0FBR0csR0FBRzBEO1FBQzlDO1FBQ0EsU0FBU3lZLEdBQUczVixHQUFFM0MsR0FBRWIsR0FBRXlDLEdBQUU1RixHQUFFRyxHQUFFMEQ7U0FDdEIsT0FBT3VZLEdBQUlwWSxJQUFJNEIsSUFBTXpDLE1BQU15QyxHQUFLZSxHQUFHM0MsR0FBR2hFLEdBQUdHLEdBQUcwRDtRQUM5QztRQUNBLFNBQVMwWSxHQUFHNVYsR0FBRTNDLEdBQUViLEdBQUV5QyxHQUFFNUYsR0FBRUcsR0FBRTBELEdBQUssT0FBT3VZLEdBQUdwWSxJQUFJYixJQUFJeUMsR0FBR2UsR0FBRzNDLEdBQUdoRSxHQUFHRyxHQUFHMEQsR0FBSTtRQUNsRSxTQUFTMlksR0FBRzdWLEdBQUUzQyxHQUFFYixHQUFFeUMsR0FBRTVGLEdBQUVHLEdBQUUwRDtTQUFLLE9BQU91WSxHQUFHalosS0FBS2EsTUFBTTRCLElBQUtlLEdBQUczQyxHQUFHaEUsR0FBR0csR0FBRzBEO1FBQUk7UUFFdkUsZ0JBQWlCK0wsR0FBR3RNO1NBQ2xCLElBQUlxRCxJQUFJaUosTUFBTTVMLElBQUk0TCxNQUFNek0sSUFBSXlNLE1BQU1oSyxJQUFJZ0s7U0FFdENqSixJQUFJMFYsR0FBRzFWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSXlXLEdBQUd6VyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUlrWixHQUFHbFosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXFZLEdBQUdyWSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBQ25CcUQsSUFBSTBWLEdBQUcxVixHQUFHM0MsR0FBR2IsR0FBR3lDLEdBQUd0QztTQUNuQnNDLElBQUl5VyxHQUFHelcsR0FBR2UsR0FBRzNDLEdBQUdiLEdBQUdHO1NBQ25CSCxJQUFJa1osR0FBR2xaLEdBQUd5QyxHQUFHZSxHQUFHM0MsR0FBR1Y7U0FDbkJVLElBQUlxWSxHQUFHclksR0FBR2IsR0FBR3lDLEdBQUdlLEdBQUdyRDtTQUNuQnFELElBQUkwVixHQUFHMVYsR0FBRzNDLEdBQUdiLEdBQUd5QyxHQUFHdEM7U0FDbkJzQyxJQUFJeVcsR0FBR3pXLEdBQUdlLEdBQUczQyxHQUFHYixHQUFHRztTQUNuQkgsSUFBSWtaLEdBQUdsWixHQUFHeUMsR0FBR2UsR0FBRzNDLEdBQUdWO1NBQ25CVSxJQUFJcVksR0FBR3JZLEdBQUdiLEdBQUd5QyxHQUFHZSxHQUFHckQ7U0FDbkJxRCxJQUFJMFYsR0FBRzFWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSXlXLEdBQUd6VyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUlrWixHQUFHbFosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXFZLEdBQUdyWSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBRW5CcUQsSUFBSTJWLEdBQUczVixHQUFHM0MsR0FBR2IsR0FBR3lDLEdBQUd0QztTQUNuQnNDLElBQUkwVyxHQUFHMVcsR0FBR2UsR0FBRzNDLEdBQUdiLEdBQUdHO1NBQ25CSCxJQUFJbVosR0FBR25aLEdBQUd5QyxHQUFHZSxHQUFHM0MsR0FBR1Y7U0FDbkJVLElBQUlzWSxHQUFHdFksR0FBR2IsR0FBR3lDLEdBQUdlLEdBQUdyRDtTQUNuQnFELElBQUkyVixHQUFHM1YsR0FBRzNDLEdBQUdiLEdBQUd5QyxHQUFHdEM7U0FDbkJzQyxJQUFJMFcsR0FBRzFXLEdBQUdlLEdBQUczQyxHQUFHYixHQUFHRztTQUNuQkgsSUFBSW1aLEdBQUduWixHQUFHeUMsR0FBR2UsR0FBRzNDLEdBQUdWO1NBQ25CVSxJQUFJc1ksR0FBR3RZLEdBQUdiLEdBQUd5QyxHQUFHZSxHQUFHckQ7U0FDbkJxRCxJQUFJMlYsR0FBRzNWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSTBXLEdBQUcxVyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUltWixHQUFHblosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXNZLEdBQUd0WSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBQ25CcUQsSUFBSTJWLEdBQUczVixHQUFHM0MsR0FBR2IsR0FBR3lDLEdBQUd0QztTQUNuQnNDLElBQUkwVyxHQUFHMVcsR0FBR2UsR0FBRzNDLEdBQUdiLEdBQUdHO1NBQ25CSCxJQUFJbVosR0FBR25aLEdBQUd5QyxHQUFHZSxHQUFHM0MsR0FBR1Y7U0FDbkJVLElBQUlzWSxHQUFHdFksR0FBR2IsR0FBR3lDLEdBQUdlLEdBQUdyRDtTQUVuQnFELElBQUk0VixHQUFHNVYsR0FBRzNDLEdBQUdiLEdBQUd5QyxHQUFHdEM7U0FDbkJzQyxJQUFJMlcsR0FBRzNXLEdBQUdlLEdBQUczQyxHQUFHYixHQUFHRztTQUNuQkgsSUFBSW9aLEdBQUdwWixHQUFHeUMsR0FBR2UsR0FBRzNDLEdBQUdWO1NBQ25CVSxJQUFJdVksR0FBR3ZZLEdBQUdiLEdBQUd5QyxHQUFHZSxHQUFHckQ7U0FDbkJxRCxJQUFJNFYsR0FBRzVWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSTJXLEdBQUczVyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUlvWixHQUFHcFosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXVZLEdBQUd2WSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBQ25CcUQsSUFBSTRWLEdBQUc1VixHQUFHM0MsR0FBR2IsR0FBR3lDLEdBQUd0QztTQUNuQnNDLElBQUkyVyxHQUFHM1csR0FBR2UsR0FBRzNDLEdBQUdiLEdBQUdHO1NBQ25CSCxJQUFJb1osR0FBR3BaLEdBQUd5QyxHQUFHZSxHQUFHM0MsR0FBR1Y7U0FDbkJVLElBQUl1WSxHQUFHdlksR0FBR2IsR0FBR3lDLEdBQUdlLEdBQUdyRDtTQUNuQnFELElBQUk0VixHQUFHNVYsR0FBRzNDLEdBQUdiLEdBQUd5QyxHQUFHdEM7U0FDbkJzQyxJQUFJMlcsR0FBRzNXLEdBQUdlLEdBQUczQyxHQUFHYixHQUFHRztTQUNuQkgsSUFBSW9aLEdBQUdwWixHQUFHeUMsR0FBR2UsR0FBRzNDLEdBQUdWO1NBQ25CVSxJQUFJdVksR0FBR3ZZLEdBQUdiLEdBQUd5QyxHQUFHZSxHQUFHckQ7U0FFbkJxRCxJQUFJNlYsR0FBRzdWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSTRXLEdBQUc1VyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUlxWixHQUFHclosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXdZLEdBQUd4WSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBQ25CcUQsSUFBSTZWLEdBQUc3VixHQUFHM0MsR0FBR2IsR0FBR3lDLEdBQUd0QztTQUNuQnNDLElBQUk0VyxHQUFHNVcsR0FBR2UsR0FBRzNDLEdBQUdiLEdBQUdHO1NBQ25CSCxJQUFJcVosR0FBR3JaLEdBQUd5QyxHQUFHZSxHQUFHM0MsR0FBR1Y7U0FDbkJVLElBQUl3WSxHQUFHeFksR0FBR2IsR0FBR3lDLEdBQUdlLEdBQUdyRDtTQUNuQnFELElBQUk2VixHQUFHN1YsR0FBRzNDLEdBQUdiLEdBQUd5QyxHQUFHdEM7U0FDbkJzQyxJQUFJNFcsR0FBRzVXLEdBQUdlLEdBQUczQyxHQUFHYixHQUFHRztTQUNuQkgsSUFBSXFaLEdBQUdyWixHQUFHeUMsR0FBR2UsR0FBRzNDLEdBQUdWO1NBQ25CVSxJQUFJd1ksR0FBR3hZLEdBQUdiLEdBQUd5QyxHQUFHZSxHQUFHckQ7U0FDbkJxRCxJQUFJNlYsR0FBRzdWLEdBQUczQyxHQUFHYixHQUFHeUMsR0FBR3RDO1NBQ25Cc0MsSUFBSTRXLEdBQUc1VyxHQUFHZSxHQUFHM0MsR0FBR2IsR0FBR0c7U0FDbkJILElBQUlxWixHQUFHclosR0FBR3lDLEdBQUdlLEdBQUczQyxHQUFHVjtTQUNuQlUsSUFBSXdZLEdBQUd4WSxHQUFHYixHQUFHeUMsR0FBR2UsR0FBR3JEO1NBRW5Cc00sT0FBT3VNLElBQUl4VixHQUFHaUo7U0FDZEEsT0FBT3VNLElBQUluWSxHQUFHNEw7U0FDZEEsT0FBT3VNLElBQUloWixHQUFHeU07U0FDZEEsT0FBT3VNLElBQUl2VyxHQUFHZ0ssTUExRVQ7T0FmZ0I7O0dBeUd6QixTQUFTNk0sZUFBZUMsS0FBS0MsT0FBT0M7SUFDbEMsSUFBSUMsU0FBU0gsZ0JBQ1RJO0lBQ0pKLFdBQVdFO0lBQ1gsR0FBR0MsT0FBTztLQUNJLElBQVJFLGVBQWVGO0tBQ25CLEdBQUdELFlBQVlHLFFBQVM7TUFDdEJMLFdBQVdDLGtCQUFpQkMsWUFBV0M7TUFDdkM7O0tBRUZILFdBQVdDLGtCQUFpQkksVUFBU0Y7S0FDckNYLGtCQUFrQlEsT0FBT0E7S0FDekJFLGFBQWFHO0tBQ2JELGFBQWFDOztJQUVmLE1BQU1ILGdCQUFnQjtLQUNwQkYsV0FBV0MsZUFBZUcsV0FBVUE7S0FDcENaLGtCQUFrQlEsT0FBT0E7S0FDekJFO0tBQ0FFOztJQUVGLEdBQUdGO0tBQ0RGLFdBQVdDLGVBQWVHLFdBQVVBLFlBQVlGO0dBQ3BEO0dkbklBLFNBQVNJLDhCQUE4QkMsUUFBUUMsV0FBV3pHLEtBQ3hELFNBQ0Y7R1NrR0EsU0FBUzBHLG1CQUNQLE9BQU9oQyxrQkFDVDtHekI0SEEsU0FBU2lDLG9CQUFxQnBkLEdBQUssT0FBT0EsWUFBYTtHb0J3SnZELFNBQVNxZCxjQUFjbFAsSUFBSUMsSUFDekIsT0FBT0QsT0FBT0EsVUFBVUMsS0FDMUI7R1N6WUEsU0FBU2tQLHNCQUFzQnhWLElBQUkwVCxNQUFNeFQsSUFBSTBULE1BQU16WTtJQUNqRCxJQUFXLElBQUZiLE9BQU9BLElBQUlhLEtBQUtiLElBQUs7S0FDNUIsSUFBSXVFLElBQUkwVyxjQUFjdlYsSUFBRzBULE9BQU9wWixJQUM1QjRCLElBQUlxWixjQUFjclYsSUFBRzBULE9BQU90WjtLQUNoQyxHQUFJdUUsSUFBSTNDLEdBQUc7S0FDWCxHQUFJMkMsSUFBSTNDLEdBQUc7O0lBRWI7R0FDRjtHNUJtekJBLFNBQVN1WixnQkFBaUJwZCxHQUFLLE9BQU93Qyx1QkFBdUJ4QyxHQUFHO0dPdGpCaEUsU0FBU3FkLGVBQWV4ZDtJQUN0QjtLQUFJeWQ7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQW5hO0tBRUF2QztJQUNKLEdBQUluQixPQUNGbUI7SUFFRm5CLElBQUlPLFNBQVNQO0lBQ2I7S0FBSTZELGlCQUFpQkgsSUFBSTFEO0tBQ3JCd0I7OztZQUFjcWMsS0FBS2hhLElBQUkrWixNQUFNL1osSUFBSThaLE1BQU05WixJQUFJNlosTUFBTTdaLElBQUk0WixNQUFNNVo7VUFBSXRELFlBQVVQLElBQUlBO0lBRWpGLE9BQU9tQixPQUFPSztHQUNoQjtHWW1GQSxTQUFTc2Msb0JBQW9CM1AsSUFBSUM7SUFDdkIsSUFBSkMsTUFBTUYsVUFBVUM7SUFDcEIsR0FBR0MsV0FBV0YsZ0JBQWdCVDtJQUM5QjtLQUFJWSxLQUFLSCxPQUFPRTtLQUNaRSxLQUFLSixPQUFPRTtLQUNaRyxLQUFLTCxPQUFPRTtLQUNaSSxLQUFLTixPQUFPRTtJQUNoQixPQUFVQyxVQUNBQyxVQUNBQyxXQUNBQztHQUNaO0dmbldBLFNBQVNzUCw0QkFBOEIsU0FBVTtHMEIrUmpELFNBQVNDLG9CQUFvQmpRLE1BQzNCLFNBQ0Y7R045UkEsU0FBU2tRLGVBQWdCeGQsS0FBS2lUO0lBQ3RCLElBQUY5SSxRQUFRbEIsTUFBTWdLO0lBQ2xCOUksT0FBS25LO0lBQ0wsSUFBVyxJQUFGMkIsT0FBT0EsS0FBS3NSLE1BQU10UixLQUFLd0ksRUFBRXhJO0lBQ2xDLE9BQU93STtHQUNUO0dWa0dBLFNBQVNzVDtJQUNELElBQUYvZCxJQUFJZ007SUFDUmhNLGlCQUFpQkE7SUFDakJBLGtCQUFrQkE7SUFFbEI7R0FDRjtHYzFKQSxTQUFTZ2UsMEJBQTBCQyxJQUNqQyxPQUFPQSxlQUNUO0d6Qm1VQSxTQUFTQyxzQ0FBc0NDLE9BQzdDLFNBQ0Y7R1VrREEsU0FBU0MsZUFBZTVTLE1BQU1DLE1BQU1FLE1BQU1DLE1BQ3hDSixVQUFVQyxTQUFTRSxVQUFVQyxPQUM3QjtHQUNGO0dXbk9BLFNBQVN5UyxvQkFBb0JyYSxHQUFFL0M7SUFDN0IrSjtHQUNGO0dOckdBLFNBQVNzVCxxQkFBd0IsU0FBVTtHRnliZCxJQUF6QkM7R1g5U0osU0FBU0MsaUJBQWlCaFk7SUFDeEIsSUFBSTFELE1BQU0wRCxVQUNOM0MsUUFBUTBGLE1BQU16RztJQUNsQmU7SUFDQSxJQUFTLElBQUQ1QixPQUFJQSxJQUFFYSxLQUFJYixLQUFLNEIsRUFBRTVCLFNBQU91RSxFQUFFdkU7SUFDbEMsT0FBTzRCO0dBQ1Q7R0ZnSkEsU0FBUzRhLHlCQUF5QnZaO0lBQ3ZCLElBQUxKLE9BQU9xRyxrQkFBa0JqRztJQUM3QixPQUFPSixtQkFBbUJBO0dBQzVCO0dXM0pBLFNBQVM0WixhQUFhN2UsR0FBRXdCO0lBQ3RCO0tBQUlyQixJQUFJZ007S0FDSkUsS0FBR2xNO0tBQ0h5RixJQUFJeUc7S0FDSnlTLFFBQVEzZTtJQUNaeUYsT0FBUWtaO0lBQ1JsWixPQUFRa1osbUJBQ1JsWixPQUFRa1o7SUFDUmxaO0lBQ0F6RixNQUFJSDtJQUNKRyxNQUFJcUI7SUFDSnJCLHVCQUF1QmtNLElBQUdyTSxHQUFFRyxXQUFXcUI7SUFDdkM7R0FDRjtHZDRKQSxTQUFTdWQsaUJBQWlCNWUsR0FBRWlDLEdBQUU0YztJQUM1QixHQUFJNWMsV0FBV2pDLFNBQVM0SjtJQUNsQixJQUFGcEQsSUFBSW1JLG9CQUFvQmtRO0lBQzVCLElBQVUsSUFBRjVhLE9BQU9BLE9BQU9BLEtBQ3BCNEYsc0JBQXVCN0osR0FBR2lDLFFBQVFnQyxHQUFHdUMsRUFBRXZDO0lBRXpDO0dBQ0Y7R0FsREEsU0FBUzZhLGtCQUFrQjllLEdBQUVpQyxHQUFFOGMsS0FDN0IvVCxtQ0FDRjtHb0IzTUEsU0FBU2dVLGlCQUFpQm5mO0lBQ2xCLElBQUZ3QixJQUFJc04sb0JBQW9COU87SUFDNUIsT0FBT2lPO2NBQXFCek0sTUFBTUEsTUFBTUEsTUFBTUEsTUFBTUEsTUFBTUEsTUFBTUEsTUFBTUE7R0FDeEU7R0Z2SEEsU0FBUzRkLGNBQWNyUjtJQUVyQixVQUFVOUwsNkJBQTZCQTtJQUN2QztHQUNGO0dhTUEsU0FBU29kLGVBQWVsZjtJQUN0QkEsSUFBSTJCLHVCQUF1QjNCO0lBQzNCLElBQUlFLElBQUlGLGNBQ0p3RyxRQUFRK0MsTUFBTXJKO0lBQ2xCLElBQVcsSUFBRitCLE9BQU9BLElBQUkvQixHQUFHK0I7S0FDckJ1RSxFQUFFdkUsTUFBTWpDLGlCQUFpQmlDLEtBQU1qQyxpQkFBaUJpQztJQUNsRCxPQUFPdUU7R0FDVDtHQUlBLFNBQVMyWSxnQkFBZ0JDLEtBQUtDLGFBQWFDO0lBQ3pDO0tBQUlDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0lBRUosS0FBS2QsZ0JBQWlCO0tBQ3BCQSxlQUFrQkYsZUFBZ0JFLElBQUlVO0tBQ3RDVixrQkFBa0JGLGVBQWdCRSxJQUFJVztLQUN0Q1gsZ0JBQWtCRixlQUFnQkUsSUFBSWM7S0FDdENkLGdCQUFrQkYsZUFBZ0JFLElBQUlhO0tBQ3RDYixrQkFBa0JGLGVBQWdCRSxJQUFJWTs7SUFHeEM7S0FBSWhkO0tBQUdtZCxRQUFRZDtLQUVYbGMsU0FBU29FLDBCQUEwQitYLE9BQU9DO0lBRTlDLEdBQUlZLFdBQVk7S0FFZGIsT0FBT0ssZ0JBQWdCTCxPQUFPRyxpQkFBaUJILE9BQU9JO0tBQ3RESixPQUFPTTs7O0tBR1BPLFVBQVNBO0lBRVgsT0FBUTtLQUVHLElBQUxDLE9BQU9oQixhQUFhZTtLQUN4QixHQUFJQyxVQUFVLFNBQVFBO0tBRVYsSUFBUkMsVUFBVWpCLGdCQUFnQmU7S0FDOUIsR0FBSUUsYUFBYztNQUNoQmYsT0FBT0ssZ0JBQWdCTCxPQUFPSTtNQUM5QkosT0FBT00sbUJBQW1CUzs7S0FHNUIsR0FBSWYsT0FBT0ksaUJBQWlCSixPQUFPRTtNQUFnQixHQUM3Q0YsT0FBT08sdUJBQ1QsU0FBUU0sZ0JBRVJuZDtTQUNDLENBRUhBLElBQUlHLE9BQU9tYyxPQUFPSSxnQkFDbEJKLE9BQU9JO0tBR1QsR0FBSU4sY0FBY2dCLE9BQU9wZCxNQUFNbWQ7TUFDN0JBLFFBQVFmLGNBQWNnQixPQUFPcGQ7O01BRTdCbWQsUUFBUWYsZ0JBQWdCZTtLQUUxQixHQUFJQSxVQUFXO01BQ2JiLE9BQU9JLGdCQUFnQkosT0FBT0s7TUFDOUIsR0FBSUwsT0FBT007T0FDVDVVOztPQUVBLE9BQU9zVSxPQUFPTTs7YUFLWjVjLFVBQVVzYyxPQUFPTzs7R0FHM0I7R3JCbUdBLFNBQVNTLHFCQUFzQnBiO0lBQ3BCLElBQUxKLE9BQU9xRyxrQkFBa0JqRztJQUM3QixPQUFPSixtQkFBbUJBO0dBQzVCO0dONUlBLFNBQVN5YjtJQUNQdlY7R0FDRjtHNEJoREEsU0FBU3dWLGVBQWdCaGEsR0FBR3ZFLEdBQUdhO0lBQ3RCLElBQUh5YSxTQUFTaFUsTUFBTXpHO0lBQ25CeWE7SUFDQSxRQUFRelYsUUFBUUYsS0FBSTNGLE9BQUs2RixNQUFNaEYsS0FBS2dGLE1BQUtGLE1BQ3ZDMlYsR0FBR3pWLE1BQUl0QixFQUFFb0I7SUFFWCxPQUFPMlY7R0FDVDtHaENzZkEsU0FBU2tELGlCQUFpQjlZLElBQUlFO0lBQzVCLEdBQUdGLE9BQU9FLElBQUk7SUFDYkYsWUFBYWxCLDZCQUE2QmtCO0lBQzFDRSxZQUFhcEIsNkJBQTZCb0I7SUFDM0MsT0FBUUYsUUFBUUU7R0FDbEI7R2MvV0EsU0FBUzZZLGlCQUNELElBQUYxZ0IsSUFBSWdNLHFCQUNSLE9BQU9oTSxRQUNUO0dtQnhKQSxTQUFTMmdCLHdCQUF3QjlnQjtJQUMvQixJQUFJRSxRQUNBc0I7SUFDSkEsSUFBSXhCO0lBQVEsR0FBSXdCLE9BQVEsQ0FBRXRCLElBQUlBLFFBQU9GLElBQUl3QjtJQUN6Q0EsSUFBSXhCO0lBQVEsR0FBSXdCLE9BQVEsQ0FBRXRCLElBQUlBLE9BQU9GLElBQUl3QjtJQUN6Q0EsSUFBSXhCO0lBQVEsR0FBSXdCLE9BQVEsQ0FBRXRCLElBQUlBLE9BQU9GLElBQUl3QjtJQUN6Q0EsSUFBSXhCO0lBQVEsR0FBSXdCLE9BQVEsQ0FBRXRCLElBQUlBLE9BQU9GLElBQUl3QjtJQUN6Q0EsSUFBSXhCO0lBQVEsR0FBSXdCLFFBQVEsT0FBT3RCO0lBQy9CLE9BQU9BLElBQUlGO0dBQ2I7RzdCVUEsU0FBUytnQiw0QkFBK0IsU0FBVTtHcUJObEQsU0FBU0Msc0JBQXNCQyxLQUFLN2U7SUFDMUIsSUFBSmdHLE1BQU02WTtJQUNWQSxVQUFVN2U7SUFDVixPQUFPZ0c7R0FDVDtHdEJzUFk7SUFBUjhZO01BQVdqZixzQkFDQUE7VUFDQUE7OztHQVhmLFNBQVNrZiwrQkFBa0MsT0FBT0Q7R0FBNkI7R0lNL0UsU0FBU0UsZ0JBQWlCcGhCLEdBQUssT0FBT08sVUFBVVAsR0FBSTtHMkJwUnBELFNBQVNxaEIsVUFDUHJnQixvQkFDRjtHQUlBLFNBQVNzZ0Isa0JBQWtCdlQsTUFDekIsV0FBV3NULFVBQ2I7R0NZeUIsSUFBckJFO0dBNkZKLFNBQVNDLG9CQUFvQnhoQixHQUFHb0M7SUFDckIsSUFBTHFmLE9BQU96aEIsRUFBRXVoQix1QkFBdUJuZjtJQUNwQyxHQUFHSCxzQkFBc0J3ZixnQkFBZ0J4ZjtLQUFvQndmLE9BQU9BO0lBQ3BFLE9BQUdBLFNBQU92ZjtHQUlaO0dkekJBLFNBQVN3ZixvQkFBb0J4Z0I7SUFDM0JBLEtBQUtBO0lBQ0xBLElBQUl1TyxTQUFVdk87SUFDZEEsS0FBS0E7SUFDTEEsSUFBSXVPLFNBQVV2TztJQUNkQSxLQUFLQTtJQUNMLE9BQU9BO0dBQ1Q7R1A4UkEsU0FBU3lnQixrQkFBa0JDO0lBQ3pCO0tBQUl6aEIsSUFBSWdNO0tBQ0p5RCxJQUFJelAsc0JBQXNCbUUsd0JBQXdCc2Q7SUFDdEQsV0FBVWhTLEdBQUV6UDtHQUNkO0dpQnpSQSxTQUFTMGhCLGlCQUFpQjFoQixHQUFHaUMsR0FBRzBmLEtBQUtDO0lBQ25DLE9BQVM7S0FDQyxJQUFKdkksTUFBTXJaLGFBQWFpQztLQUFJQTtLQUMzQixHQUFJb1gsYUFBYTtLQUNULElBQUpELE1BQU1wWixhQUFhaUM7S0FBSUE7S0FDM0IsR0FBSW1YO01BQ0Z1SSxJQUFLdEksV0FBV3VJOztNQUVoQkQsSUFBS3RJLFdBQVdzSSxJQUFLdkk7O0dBRTNCO0dBRUEsU0FBU3lJLGlCQUFpQjdoQixHQUFHaUMsR0FBRzBmO0lBQzlCLE9BQVM7S0FDQyxJQUFKdEksTUFBTXJaLGFBQWFpQztLQUFJQTtLQUMzQixHQUFJb1gsYUFBYTtLQUNULElBQUpELE1BQU1wWixhQUFhaUM7S0FBSUE7S0FDM0IsR0FBSW1YLGFBQ0Z1SSxJQUFLdEkscUJBRUxzSSxJQUFLdEksV0FBV3NJLElBQUt2STs7R0FFM0I7R0FFQSxTQUFTMEksb0JBQW9CMUMsS0FBS0MsYUFBYUM7SUFDN0M7S0FBSUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQWtDO0tBQ0FqQztLQUNBQztLQUNBQztLQUNBQztLQUNBQztLQUNBOEI7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7S0FDQUM7SUFFSixLQUFLakQsZ0JBQWlCO0tBQ3BCQSxlQUFrQkYsZUFBZ0JFLElBQUlVO0tBQ3RDVixrQkFBa0JGLGVBQWdCRSxJQUFJVztLQUN0Q1gsZ0JBQWtCRixlQUFnQkUsSUFBSWM7S0FDdENkLGdCQUFrQkYsZUFBZ0JFLElBQUlhO0tBQ3RDYixrQkFBa0JGLGVBQWdCRSxJQUFJWTs7SUFFeEMsS0FBS1oscUJBQXNCO0tBQ3pCQSxvQkFBdUJGLGVBQWdCRSxJQUFJNEM7S0FDM0M1Qyx1QkFBdUJGLGVBQWdCRSxJQUFJNkM7S0FDM0M3QyxxQkFBdUJGLGVBQWdCRSxJQUFJZ0Q7S0FDM0NoRCxxQkFBdUJGLGVBQWdCRSxJQUFJK0M7S0FDM0MvQyx1QkFBdUJGLGVBQWdCRSxJQUFJOEM7O0lBRTdDLEdBQUk5QyxnQkFBZ0JuWjtLQUFNbVosZUFBZXpkLHVCQUF1QnlkLElBQUlpRDtJQUVwRTtLQUFJcmY7S0FBR21kLFFBQVFkO0tBRVhsYyxTQUFTb0UsMEJBQTBCK1gsT0FBT0M7SUFFOUMsR0FBSVksV0FBWTtLQUVkYixPQUFPSyxnQkFBZ0JMLE9BQU9HLGlCQUFpQkgsT0FBT0k7S0FDdERKLE9BQU9NOzs7S0FHUE8sVUFBU0E7SUFFWCxPQUFRO0tBRUcsSUFBTEMsT0FBT2hCLGFBQWFlO0tBQ3hCLEdBQUlDLFNBQVU7TUFDRCxJQUFQa0MsU0FBU2xELGtCQUFrQmU7TUFDL0IwQixpQkFBaUJ6QyxjQUFja0QsUUFBUWhELE9BQU95QztNQUM5QyxTQUFRM0I7O0tBR0UsSUFBUkMsVUFBVWpCLGdCQUFnQmU7S0FDOUIsR0FBSUUsYUFBYztNQUNMLElBQVBpQyxTQUFTbEQscUJBQXFCZTtNQUNsQzBCLGlCQUFpQnpDLGNBQWNrRCxRQUFRaEQsT0FBT3lDO01BQzlDekMsT0FBT0ssZ0JBQWdCTCxPQUFPSTtNQUM5QkosT0FBT00sbUJBQW1CUzs7S0FHNUIsR0FBSWYsT0FBT0ksaUJBQWlCSixPQUFPRTtNQUFnQixHQUM3Q0YsT0FBT08sdUJBQ1QsU0FBUU0sZ0JBRVJuZDtTQUNDLENBRUhBLElBQUlHLE9BQU9tYyxPQUFPSSxnQkFDbEJKLE9BQU9JO0tBR0UsSUFBUDZDLFNBQVNwQztLQUNiLEdBQUlmLGNBQWNnQixPQUFPcGQsTUFBTW1kO01BQzdCQSxRQUFRZixjQUFjZ0IsT0FBT3BkOztNQUU3Qm1kLFFBQVFmLGdCQUFnQmU7S0FFMUIsR0FBSUEsVUFBVztNQUNiYixPQUFPSSxnQkFBZ0JKLE9BQU9LO01BQzlCLEdBQUlMLE9BQU9NO09BQ1Q1VTs7T0FFQSxPQUFPc1UsT0FBT007O1NBQ2I7TUFFSCxJQUFJNEMsWUFBWXBELGtCQUFrQm1ELFNBQVNEO01BQzNDLEdBQUlsRCxtQkFBbUJvRCxZQUFZeGYsTUFBTXVmO09BQ3ZDRCxTQUFTbEQsbUJBQW1Cb0QsWUFBWXhmOztPQUV4Q3NmLFNBQVNsRCxxQkFBcUJtRDtNQUNoQyxHQUFJRDtPQUNGWjtTQUNEdEMsY0FBY2tELFFBQVFoRCxPQUFPeUMsVUFBVXpDLE9BQU9JO01BSS9DLEdBQUkxYyxVQUFVc2MsT0FBT087OztHQUczQjtHWm9PQSxTQUFTNEMsb0JBQW9CelUsSUFBSUMsSUFBSWpLO0lBQzNCLElBQUprSyxNQUFNRixVQUFVQztJQUNwQixHQUFHQyxXQUFXRixnQkFBZ0JUO0lBQ3hCLElBQUZ2SixJQUFJMkssb0JBQW9CM0s7SUFDNUIsSUFBVSxJQUFGL0IsT0FBT0EsT0FBT0EsS0FBSytMLE9BQU9FLE1BQUlqTSxHQUFHK0IsTUFBSS9CO0lBQzdDO0dBQ0Y7R2hCaFNBLFNBQVN5Z0IseUJBQXlCbGMsR0FDaEMsT0FBTzRULHFCQUNUO0d1Qm1FQSxTQUFTdUksZUFBZ0I5aUIsR0FBR3dCO0lBQUssVUFBU3lWLGlCQUFpQmpYLEdBQUV3QjtHQUFnQjtHbkJ1QjdFLFNBQVN1aEIsaUJBQWtCL2lCLEdBQUssT0FBT08sV0FBV1AsR0FBSTtHc0J6SXRELFNBQVNnakI7SUFDUDtLQUFJMWYsYUFBYTJmO0tBQ2JDLFVBQVVDLFlBQVk3ZjtLQUN0QnVMLFNBQVN6SCxXQUFXOUQ7SUFDeEI7O2dCQUNjNmY7aUJBQ0ZEO2dCQUNEclU7R0FDYjtHWnVSQSxTQUFTdVUsY0FBZXhWO0lBQ2IsSUFBTE4sT0FBT0YsaUJBQWlCUTtJQUM1QixLQUFLTixhQUFhL0Y7SUFDbEIsS0FBSStGLGVBQWVBLHVCQUF1QjtJQUMxQyxHQUFHQTtLQUNEQSxZQUFZNUcseUJBQXlCNEcsZ0JBQWdCQTs7S0FFckRBLGdCQUFnQkEsYUFBYUEsZ0JBQWdCQTtJQUUvQ0EsZUFBZUE7SUFDZkE7SUFDQTtHQUNGO0dBNEVBLFNBQVMrVixjQUFjelYsUUFBUXRGO0lBQzdCOGEsY0FBY3hWO0lBQ0wsSUFBTE4sT0FBT0YsaUJBQWlCUTtJQUM1Qk4sY0FBY2hGO0lBQ2Q7R0FDRjtHQVNBLFNBQVNnYixvQkFBb0IxVixRQUFPdEY7SUFDMUIsSUFBSkEsTUFBTThVLG9CQUFvQjlVO0lBQzlCLE9BQU8rYSxjQUFjelYsUUFBUXRGO0dBQy9CO0dKdEtBLFNBQVNpYixpQkFBaUI1WCxNQUFLRztJQUM3QixPQUFPcU4sWUFBWXhOLFNBQU9BLGtCQUFpQkcsU0FBT0E7R0FDcEQ7R0tqVkEsU0FBUzBYLFlBQVk1SSxVQUNuQixTQUNGO0diUkEsU0FBUzZJLFlBQVk3WSxHQUFFMUgsR0FBSyxPQUFPMEgsRUFBRTFILEdBQUk7R01zQ3pDLFNBQVN3Z0IsaUJBQWlCQztJQUN4QixHQUFHcGYsb0JBQXFCO0tBQ2QsSUFBSnFmLE1BQU14WjtLQUNWLE9BQU93WixXQUFXRDs7O0tBQ2I7R0FHVDtHTXFmQSxTQUFTRSxxQkFBcUJqVyxRQUFPeko7SUFDbkNpSixpQkFBaUJRLG1CQUFtQnpKO0lBQ3BDLEtBQUlBLEdBQUdpZixjQUFjeFY7SUFDckI7R0FDRjtHSWhiQSxTQUFTa1csd0JBQXdCNWlCLEdBQUdmO0lBQ2xDLElBQUk4QyxNQUFNOUMsVUFBVWlDLEdBQUd3TjtJQUN2QixJQUFLeE4sT0FBT0EsU0FBU2EsS0FBS2IsT0FBUTtLQUNoQ3dOLElBQUl6UCxFQUFFaUMsS0FDRGpDLEVBQUVpQyxjQUNGakMsRUFBRWlDLGVBQ0ZqQyxFQUFFaUM7S0FDUGxCLElBQUl3TyxrQkFBa0J4TyxHQUFHME87O0lBRTNCQTtJQUNBLE9BQVEzTTs7T0FDQTJNLElBQUt6UCxFQUFFaUM7O09BQ1B3TixLQUFLelAsRUFBRWlDOztPQUNQd04sS0FBS3pQLEVBQUVpQyxJQUNibEIsSUFBSXdPLGtCQUFrQnhPLEdBQUcwTzs7SUFHM0IxTyxLQUFLK0I7SUFDTCxPQUFPL0I7R0FDVDtHckJ1cEJBLFNBQVM2aUIsc0JBQXNCNWpCO0lBQzdCLE9BQVFBO2VBRU55Ryw2QkFBNkJ6Rzs7T0FFN0IsT0FBT0E7O09BRVAsT0FBT0E7O0dBRVg7R3FCMXBCQSxTQUFTNmpCLG9CQUFvQjlpQixHQUFHaUQ7SUFDbEIsSUFBUjZDLFVBQVUrYyxzQkFBc0I1ZjtJQUNwQyxjQUFVNkM7Y0FDRDJJLHNCQUFzQnpPLEdBQUc4RjtjQUV6QjhjLHdCQUF3QjVpQixHQUFHOEY7R0FDdEM7R0FlQSxTQUFTaWQsVUFBV0MsT0FBT0MsT0FBT0MsTUFBTUM7SUFDdEMsSUFBSUMsT0FBT0MsSUFBSUMsSUFBSW5SLElBQUlvRCxLQUFLdlYsR0FBR2lELEdBQUcvQixHQUFHYTtJQUNyQ29RLEtBQUs4UTtJQUNMLEdBQUk5USxVQUFVQSxVQUFVQTtJQUN4Qm9ELE1BQU15TjtJQUNOaGpCLElBQUlrakI7SUFDSkUsU0FBU0Q7SUFBTUU7SUFBUUM7SUFDdkIsTUFBT0QsS0FBS0MsTUFBTS9OLFFBQVM7S0FDekJ0UyxJQUFJbWdCLE1BQU1DO0tBQ1YsR0FBSXBnQixLQUFLQTtNQUFjO1FBQ2xCbVMsZ0JBQWdCblMsa0JBQWtCbVMsZ0JBQWdCblMsb0JBQXFCO09BQ2pFLElBQUhvWSxLQUFLakcsZ0JBQWdCblMsb0JBQW9CQTtPQUM3Q2pELElBQUl3TyxrQkFBbUJ4TyxHQUFHcWI7T0FDMUI5Rjs7O2FBR0t0UyxhQUFhdUYsU0FBU3ZGLFVBQVVBO01BQVMsT0FDeENBOztTQUdOakQsSUFBSXdPLGtCQUFrQnhPLEdBQUdpRCxPQUN6QnNTLE9BQ0E7O1NBR0E2TixRQUFRQyxNQUFNcGdCLE1BQ2Q7O1NBRUEsR0FBR2lPLHlCQUF5QmpPLE9BQU87U0FLM0IsSUFBSjFELE1BQVEwRCxxQkFBdUJBO1NBQ25DakQsSUFBSXdPLGtCQUFrQnhPLEdBQUdUO1NBQ3pCLElBQUsyQixPQUFPYSxNQUFNa0IsVUFBVS9CLElBQUlhLEtBQUtiLElBQUssQ0FDeEMsR0FBSW9pQixNQUFNblIsSUFBSSxPQUNkaVIsTUFBTUUsUUFBUXJnQixFQUFFL0I7O1NBRWxCOzthQUVPNkUsaUJBQWlCOUMsR0FBSTtNQUM5QmpELElBQUk4aUIsb0JBQW9COWlCLEdBQUVpRDtNQUMxQnNTOzthQUNTdlAsa0JBQWtCL0MsR0FBSTtNQUMvQmpELElBQUkyTyxxQkFBcUIzTyxHQUFFaUQ7TUFDM0JzUzs7b0JBQ2dCdFMsZUFBZ0I7TUFDaENqRCxJQUFJeU8sc0JBQXNCek8sR0FBRWlEO01BQzVCc1M7O2FBQ1N0UyxPQUFPQSxPQUFNO01BRXRCakQsSUFBSXdPLGtCQUFrQnhPLEdBQUdpRCxJQUFFQTtNQUMzQnNTOzthQUNTdFMsUUFBT0EsRUFBRyxDQUVuQmpELElBQUkyVSxvQkFBb0IzVSxHQUFFaUQsSUFDMUJzUzs7SUFHSnZWLElBQUl3Z0Isb0JBQW9CeGdCO0lBQ3hCLE9BQU9BO0dBQ1Q7R1lySEEsU0FBU3VqQixpQkFBaUJ0a0IsR0FDeEIsT0FBTzhqQixtQkFBZ0I5akIsR0FDekI7R2Z0SEEsU0FBU3VrQixxQkFBc0IsU0FBUTtHaUJzRXZDLFNBQVNDLGtCQUFrQjNrQixHQUFHb0M7SUFDNUIsR0FBR0EsU0FBU21mLHVCQUF1Qm5mLEtBQUtwQztLQUN0QzhDO0lBQ08sSUFBTDJlLE9BQU96aEIsRUFBRXVoQix1QkFBdUJuZjtJQUNwQyxHQUFHSCxzQkFBc0J3ZixnQkFBZ0J4ZjtLQUFvQndmLE9BQU9BO0lBQ3BFLE9BQVFBLFNBQU92ZixvQkFBaUJ1ZjtHQUNsQztHeEJyRUEsU0FBU21ELG9CQUFxQi9nQjtJQUM1QjtLQUFJK0IsUUFBUWlmLEtBQU1oaEI7S0FDZGloQixRQUFRbGY7S0FDUm1mLGVBQWUsSUFBS0YsS0FBS2pmO0tBQ3pCb2YsTUFBTXprQixZQUFZdWtCLFFBQVFDO0tBQzFCRSxVQUFVSixLQUFLamY7S0FDZnNmLFVBQVVMLEtBQUtqZjtLQUNmdWY7T0FBb0I1a0IsU0FBUzBrQix5QkFBeUJDO0lBQzFEO1lBQWdCdGY7WUFBZ0JBO1lBQWdCQTtZQUNuQ0E7WUFBYUE7WUFBY0E7WUFDM0JBO1lBQVlvZjtZQUNYcGYsd0JBQXdCdWY7R0FDeEM7R0FLQSxTQUFTQyxpQkFBaUJDO0lBQ3hCO0tBQUl6ZixJQUFJLElBQUtpZixLQUFLUSxjQUFXQSxPQUFNQSxPQUFNQSxPQUFNQSxPQUFNQTtLQUNqRHhoQixJQUFJdEQsV0FBV3FGO0tBQ2YwZixNQUFNVixvQkFBb0IvZ0I7SUFDOUIsV0FBZUEsR0FBRXloQjtHQUNuQjtHaUJxQ0EsU0FBU0MsZ0NBQWdDaEssTUFBTUMsTUFBTUMsS0FBS0MsTUFBTXpZO0lBQzlELFNBQVN3WTtLQUNQM1k7SUFDRixHQUFHRyxVQUFVO0lBQ0osSUFBTDhJLE9BQU8wUCxXQUFXQztJQUN0QixHQUFHRixPQUFPdlksTUFBTTJFLHFCQUFxQjJULE9BQ25DN047SUFFRixHQUFHM0IsT0FBTzlJLE1BQU13WSxpQkFDZC9OO0lBRVEsSUFBTmlPLFFBQVFqVSwwQkFBMEI2VCxZQUFZQyxNQUFLQSxPQUFPdlk7SUFDOUR3WSxhQUFhRSxPQUFNNVA7SUFDbkI7R0FDRjtHWC9FaUIsSUFBYnlaLG1CQUFtQjliO0dBSXZCLFNBQVMrYixlQUFldGI7SUFDYixJQUFMdkIsT0FBTzRjLGFBQWFyYjtJQUN4QixHQUFHdkIsTUFBTUE7SUFDVCxPQUFPNGMsYUFBYXJiO0lBQ3BCO0dBQ0Y7R0FxSkEsU0FBU3ViLHNCQUF1QjlYO0lBQ3JCLElBQUxOLE9BQU9GLGlCQUFpQlE7SUFDNUJOO0lBQ0FtWSxlQUFlblk7SUFDZjtHQUNGO0dnQmpGQSxTQUFTcVksMkJBQTJCcEYsTUFBTXFGO0lBQ3hDLElBQUlDLFNBQ0FDLE9BQU9ELEtBQUt0RixNQUFNc0YsS0FBS0EsTUFDdkI5YyxNQUFNOGM7SUFDVixRQUFRRCxjQUFhO0tBQ25CRSxTQUFVQSxTQUFTQTtLQUNuQkEsU0FBVUEsU0FBU0E7S0FDbkJBLFNBQVVBLFNBQVNBO0tBQ25CL2MsTUFBT0EsTUFBTStjLElBQUlGO0tBQ2pCQSxXQUFXQTs7SUFFYixPQUFPN2M7R0FDVDtHUjlFQSxTQUFTZ2QscUJBQXFCOUUsS0FBSzljO0lBQzNCLElBQUYvRCxJQUFJNmdCO0lBQ1JBLFNBQVM5YztJQUNULE9BQU8vRDtHQUNUO0d0QjJQQSxTQUFTNGxCLGdCQUFnQkMsT0FDdkIsU0FDRjtHVXBMQSxTQUFTQyxjQUFjN1YsS0FBS2hDO0lBQzFCLEdBQUdnQyxTQUFTaEMsV0FBVztJQUN2QjtHQUNGO0dGd0JBLFNBQVM4WCxnQkFBZ0I5Z0I7SUFDZCxJQUFMSixPQUFPcUcsa0JBQWtCakc7SUFDN0IsS0FBS0osbUJBQ0hrRztJQUVGLE9BQU9sRyxrQkFBa0JBO0dBQzNCO0dBS0EsU0FBU21oQixtQkFBbUIvZ0I7SUFDcEIsSUFBRmpGLElBQUkrbEIsZ0JBQWdCOWdCO0lBQ3hCakYsT0FBT3NCLG9CQUFvQnRCO0dBQzdCO0dObElBLFNBQVNpbUIsWUFBWXpiLEdBQUUxSCxHQUFFaUIsR0FBS3lHLEVBQUUxSCxLQUFHaUIsR0FBRSxTQUFRO0cyQndEN0MsU0FBU21pQixlQUFnQkMsT0FBT0M7SUFDOUIsR0FBS0EsYUFBZUEsU0FBU0Qsa0JBQW1CN1k7SUFDaEQsT0FBTzZZLE1BQU1DO0dBQ2Y7R3hCZ0VBLFNBQVNDLDRCQUE0QkM7SUFDMUIsSUFBTHhQLFFBQU13UDtJQUNWQTtJQUNBLE9BQU94UDtHQUNUO0dHbUJBLFNBQVN5UCxnQkFBZ0J0aEI7SUFDZCxJQUFMSixPQUFPcUcsa0JBQWtCakc7SUFDN0IsS0FBS0osbUJBQ0hrRztJQUVGLE9BQU9sRyxrQkFBa0JBO0dBQzNCO0dKOEZBLFNBQVMyaEIsZ0JBQWdCNW1CLEdBQUssT0FBT08sVUFBVVAsR0FBSTtHVzlMbkQsU0FBUzZtQiw0QkFBNEI5WSxNQUFRLFNBQVU7R0hsRHZELFNBQVMrWSw2QkFDUCxTQUNGO0dadVRBLFNBQVNDO0lBQ1A1YjtHQUNGO0dKeEhBLFNBQVM2YixlQUFnQmhuQixHQUFHd0IsR0FBSyxPQUFPeEIsTUFBTXdCLEdBQUc7R2tCOEhqRCxTQUFTeWxCLGFBQWFyWixRQUFRdEY7SUFDbkIsSUFBTGdGLE9BQU9GLGlCQUFpQlE7SUFDNUIsR0FBSU4sZUFBZWxILE1BQU1tQjtJQUN6QjtNQUFHZSxPQUFPZ0YsY0FBY0EsbUJBQ2xCaEYsT0FBT2dGO1NBQ1BBO0tBQ0pBLG1CQUFtQkEsbUJBQW1CQSxjQUFjaEY7UUFDL0MsQ0FDTGdGLGNBQWNoRixLQUNkZ0Ysc0JBQ0FBO0lBRUY7R0FDRjtHQVVBLFNBQVM0WixtQkFBbUJ0WixRQUFPdEY7SUFDekIsSUFBSkEsTUFBTThVLG9CQUFvQjlVO0lBQzlCLE9BQU8yZSxhQUFhclosUUFBUXRGO0dBQzlCO0dROVRtQixJQUFmNmU7R1M5QkosU0FBU0MscUJBQXFCdmpCLEdBQzVCQSxrQkFDQSxTQUNGO0dUaUMyQixJQUF2QndqQjtHQUNKLFNBQVNDLGtCQUFrQnBrQixHQUFFcWtCO0lBQ3pCLElBQUlDLEtBQUtILDBCQUNMamYsTUFBTStlO0lBQ1ZBLGlCQUFpQks7SUFDakIzVyxjQUFjM047SUFDZGlrQixpQkFBaUIvZTtJQUNqQmdmLHFCQUFxQkc7SUFDckIsT0FBT0M7R0FDWDtHZHFGQSxTQUFTQyxnQkFBZ0JwaUIsTUFBTXFpQjtJQUNwQixJQUFMemlCLE9BQU9xRyxrQkFBa0JqRztJQUM3QixLQUFLSixtQkFDSGtHO0lBRUYsT0FBT2xHLGtCQUFrQkEsV0FBV3lpQjtHQUN0QztHWmtGQSxTQUFTQyxzQkFBdUIzbkIsR0FBR0csR0FBSyxPQUFPSCxhQUFhRyxHQUFHO0cyQkQvRCxTQUFTeW5CLGNBQWU1bkIsR0FBR3dCO0lBQUssVUFBU3lWLGlCQUFpQmpYLEdBQUV3QjtHQUFnQjtHdkJTNUUsU0FBU3FtQiwwQkFBNkIsVUFBVztHRTJDakQsU0FBU0Msc0JBQXNCNWtCO0lBQzdCO0tBQ1UsSUFBSkQsTUFBTTJOO0tBQ1YsR0FBRzNOLFFBQVE7TUFDQSxJQUFMb0QsV0FBV3FELE1BQU16RztNQUNyQixJQUFXLElBQUZiLE9BQU9BLElBQUlhLEtBQUtiLEtBQUtpRSxLQUFLakUsS0FBS3dPLFVBQVV4Tzs7O01BRWxEaUUsUUFBUW5FO0tBRUYsSUFBSjZHLE1BQU04SCxjQUFjM04sR0FBR21EO0tBQzNCLE9BQVEwQyxlQUFlbUksV0FBVTRXLHNCQUFzQi9lLE9BQUtBLElBVHZEO0dBV1Q7R0FrQ0EsU0FBU2dmLDJCQUEyQjdrQjtJQUNsQztLQUNFLElBQUlELE1BQU0yTixrQkFDTnZLLFdBQVdxRCxNQUFNekc7S0FDckJvRCxVQUFVckY7S0FDVixJQUFXLElBQUZvQixPQUFPQSxJQUFJYSxLQUFLYixLQUFLaUUsS0FBS2pFLFNBQU93TyxVQUFVeE87S0FDNUMsSUFBSjJHLE1BQU04SCxjQUFjM04sR0FBRW1EO0tBQzFCLE9BQVEwQyxlQUFlbUksV0FBVTRXLHNCQUFzQi9lLE9BQUtBLElBTnZEO0dBUVQ7R0FoUEEsU0FBU2lmLGFBQ1AsU0FDRjtHaUI3R2lDLElBQTdCQywrQkFBK0JwUztHRStMakMsU0FBU3FTLDRCQUE0QnRkO0lBQ3JDdUcsb0JBQW9Cdkc7SUFDcEI7R0FDRjtHTHNKQSxTQUFTdWQsWUFBWWhhLElBQUkvTDtJQUN2QixHQUFJQSxTQUFTQSxLQUFLK0wsZ0JBQ2hCckw7SUFDRixPQUFPcUwsUUFBUS9MO0dBQ2pCO0dBSUEsU0FBU2dtQixjQUFjamEsSUFDckIsT0FBT2dhLFlBQVloYSxPQUNyQjtHZHJHQSxTQUFTa2Esa0JBQWtCemQsR0FBRzFILEdBQUdtRDtJQUMvQixPQUFPdUUsRUFBRXRHLHdCQUF3QnBCLFVBQVUwSCxHQUFHbVEsbUJBQW1CMVU7R0FDbkU7RzhCOU8wQixJQUF0QmlpQjtHQWdESixTQUFTQyxpQkFBa0Jyb0I7SUFDekIsR0FBSUEsT0FBTzRDO0lBQ0wsSUFBRjlDO0lBQ0pBLFdBQVd1aEIsdUJBQXVCcmhCO0lBQ2xDLE9BQU9GO0dBQ1Q7R0FaQSxTQUFTd29CLGlCQUFrQnRvQixHQUNuQixJQUFGRixJQUFJdW9CLGlCQUFpQnJvQixJQUN6QixPQUFPRixFQUNUO0duQ294QkEsU0FBU3lvQix1QkFBdUJ0b0IsR0FBSyxPQUFPd0MsdUJBQXVCeEMsR0FBRztHS2x6QnRFLFNBQVN1b0IsZ0JBQWdCM2Y7SUFDakIsSUFBRjVGO0lBQ0osTUFBTTRGLE9BQU9BLGNBQWM7S0FDekJBLE1BQU1BLG9CQUFvQjNDLE1BQU0yQztLQUNoQzVGOztJQUVGLE9BQU80RjtHQUNUO0dIeUpBLFNBQVM0Zix1QkFBdUI1YSxNQUFRLFNBQVM7R0Z4QmpELFNBQVM2YSxzQkFBdUJ6b0IsR0FBR2lDO0lBQ2pDLE9BQVFqQztlQUVOLEdBQUlpQyxLQUFLakMsWUFBWTs7T0FFckIsT0FBT0EsZUFBZWlDOztPQUV0QixPQUFPakMsSUFBSWlDOztHQUVmO0dBaUdBLFNBQVN5bUIsaUJBQWlCMW9CLEdBQUVpQztJQUMxQixHQUFJQSxXQUFXakMsU0FBUzRKO0lBQ2xCLElBQUZwRCxRQUFRK0M7SUFDWixJQUFVLElBQUZ0RixPQUFPQSxPQUFPQSxLQUNwQnVDLE1BQU12QyxLQUFLd2tCLHNCQUF1QnpvQixHQUFHaUMsSUFBSWdDO0lBRTNDLE9BQU82SixvQkFBb0J0SDtHQUM3QjtHZTlSNEIsSUFBeEJtaUI7R0FJSixTQUFTQztJQUFrQ0MsWUFBWUMsV0FBV0M7SUFDaEVKO0lBQ0EsV0FBV0EseUJBQXlCRSxZQUFZRSxZQUFZRDtHQUM5RDtHSm1PQSxTQUFTRSxzQkFBc0JwYixNQUM3QixPQUFPeEosNEJBQ1Q7R3dCak5BLFNBQVM2a0Isa0JBQWtCcHBCLEdBQUdvQyxHQUFHK0I7SUFDL0IsR0FBRy9CLFNBQVNtZix1QkFBdUJuZixLQUFLcEM7S0FDdEM4QztJQUNGLEdBQUlxQixhQUFha2xCLFVBQVVwbkIsbUJBQW9CO0tBQzdDLEdBQUdqQyxlQUFlQSxjQUFjbUUsR0FBR2pDLFdBQVdpQztLQUM5Q25FLEVBQUV1aEIsdUJBQXVCbmYsU0FBU0gsbUJBQW1Ca0M7OztLQUVsRG5FLEVBQUV1aEIsdUJBQXVCbmYsS0FBSytCO0lBQ25DO0dBQ0Y7R0FJQSxTQUFTbWxCLG9CQUFvQnRwQixHQUFHb0M7SUFDOUIsR0FBR0EsU0FBU21mLHVCQUF1Qm5mLEtBQUtwQztLQUN0QzhDO0lBQ0Y7TUFBR2I7U0FBc0JqQyxFQUFFdWhCLHVCQUF1Qm5mLGNBQWNIO1NBQXNCakMsZ0JBQWlCO0tBQzdGLElBQUpvSSxNQUFNcEksRUFBRXVoQix1QkFBdUJuZjtLQUNuQyxHQUFHZ0csUUFBUWxHLFVBQVc7TUFDVixJQUFOZ2lCO01BQ0osSUFBVSxJQUFGOWYsSUFBSW1kLHNCQUFzQm5kLElBQUlwRSxVQUFVb0UsSUFBSTtPQUMxQyxJQUFKc0csTUFBTTFLLEVBQUVvRTtPQUNaLEdBQUdzRyxlQUFlekksbUJBQW1CO1FBQ25DeUksTUFBTUE7UUFDTixHQUFHQSxRQUFRdEMsS0FBSzhiOzs7TUFHcEIsR0FBR0EsWUFBWWxrQixnQkFBZ0JvSTs7O0lBR25DcEksRUFBRXVoQix1QkFBdUJuZixLQUFLRjtJQUM5QjtHQUNGO0dBc0JBLFNBQVNxbkIsY0FBY3ZwQixHQUFHb0MsR0FBRytCO0lBQzNCLEdBQUdBLFFBQVFtbEIsb0JBQW9CdHBCLEdBQUVvQyxTQUM1QmduQixrQkFBa0JwcEIsR0FBRW9DLEdBQUUrQjtJQUMzQjtHQUNGO0d6QndJQSxTQUFTcWxCLGdCQUFnQm5rQjtJQUN2QixJQUFJSixPQUFPcUcsa0JBQWtCakcsT0FDekJvRSxLQUFLeEUsbUJBQW1CQTtJQUM1QixHQUFHd0UsU0FBU2pDLHdCQUF3QjFGLHVCQUF1QnVEO0lBQzNEO0dBQ0Y7R1Z2QkEsU0FBU29rQjtJQUNQM21CO0dBQ0Y7R0FzQ0EsU0FBUzRtQixrQkFBa0J2cEIsR0FBRWlDO0lBQzNCLEdBQUlBLFdBQVd3SCxzQkFBc0J6SixRQUFRc3BCO0lBQzdDO0tBQUluYixLQUFLekUsdUJBQXdCMUosR0FBR2lDO0tBQ2hDbU0sS0FBSzFFLHVCQUF3QjFKLEdBQUdpQztLQUNoQ29NLEtBQUszRSx1QkFBd0IxSixHQUFHaUM7S0FDaENxTSxLQUFLNUUsdUJBQXdCMUosR0FBR2lDO0lBQ3BDLE9BQVFxTSxXQUFXRCxXQUFXRCxVQUFVRDtHQUMxQztHQXdDQSxTQUFTcWIsZUFBZ0J4cEIsR0FBR2lDO0lBQzFCLEdBQUlBLFdBQVdqQyxLQUFLNEo7SUFDcEIsT0FBTzZlLHNCQUF1QnpvQixHQUFHaUM7R0FDbkM7R09yQkEsU0FBU3duQixpQkFBa0I1cEIsR0FBR3dCLEdBQUssT0FBT2pCLFdBQVdQLEdBQUd3QixHQUFJO0dGaEM1RCxTQUFTcW9CLGFBQWEzbUIsR0FBRzBILEdBQUd2RTtJQUFRLE9BQU9uRCxRQUFRMEgsR0FBR21RLG1CQUFtQjFVO0dBQVE7R0ZvQmpGLFNBQVN5akIsNEJBQStCLDBCQUEwQjtHUWlFbEUsU0FBU0MsZ0NBQWtDLFNBQVM7R3NCbkxwRCxTQUFTQyxnQkFBZ0JocUIsR0FDdkIsU0FDRjtHakNvWkEsU0FBU2lxQixvQkFBb0JuaUIsSUFBSUU7SUFDOUJGLFlBQWFsQiw2QkFBNkJrQjtJQUMxQ0UsWUFBYXBCLDZCQUE2Qm9CO0lBQzNDLE9BQVFGLE9BQU9FO0dBQ2pCO0dPbFBBLFNBQVNraUIsZ0JBQWdCbHFCLEdBQ3ZCLFdBQVd3ZCxlQUFleGQsR0FDNUI7R09FQSxTQUFTbXFCLGtCQUFrQkM7SUFDbkIsSUFBRmpxQixJQUFJZ007SUFDUmhNO0lBQ0FBLGlCQUFpQmlxQixVQUFTanFCLFdBQVdpcUI7SUFDckMsSUFBVSxJQUFGaG9CLE9BQU9BLElBQUlnb0IsV0FBV2hvQjtLQUM1QmpDLGlCQUFpQmlxQixHQUFHaG9CLE9BQU1qQyxXQUFXaXFCLEdBQUdob0I7SUFDMUNqQyxpQkFBaUJpcUIsVUFBU2pxQixXQUFXaXFCO0lBQ3JDanFCO0lBQ0E7R0FDRjtHSWhUQSxTQUFTa3FCO0lBQ1A7R0FDRjtHRDBTQSxTQUFTQyxtQkFBb0IxYztJQUNsQixJQUFMTixPQUFPRixpQkFBaUJRO0lBQzVCLEdBQUdOLG9CQUFvQkEsZ0JBQWdCO0tBQ3JDQTtLQUNBQTtLQUNBRCxZQUFZQzs7SUFFZCxHQUFJQSxvQkFBb0JBLGlCQUN0QnlFO0lBQ00sSUFBSmhKLE1BQU11RSxZQUFZQTtJQUN0QkE7SUFDQSxPQUFPdkU7R0FDVDtHQUtBLFNBQVN3aEIsa0JBQW1CM2M7SUFDMUIsSUFBSU4sT0FBT0YsaUJBQWlCUSxTQUN4QjdFO0lBQ0osSUFBVSxJQUFGM0csT0FBT0EsT0FBT0E7S0FDcEIyRyxPQUFPQSxZQUFZdWhCLG1CQUFtQjFjO0lBRXhDLE9BQU83RTtHQUNUO0dIdUpBLFNBQVN5aEI7SUFDUHJmO0dBQ0Y7R1V4VkEsU0FBU3NmLHlCQUF5QjdmLEdBQUssU0FBVTtHWHRGakQsU0FBUzhmLGNBQWNyYSxLQUFLaEMsS0FDMUIsT0FBT2dDLFNBQVNoQyxLQUNsQjtHbUJyQkEsU0FBU3NjLGdCQUFnQmxOLElBQUkxVixJQUFJMlYsSUFBSXpWLElBQUloRjtJQUN2QyxHQUFJZ0YsTUFBTUY7S0FBSSxJQUNELElBQUYzRCxPQUFPQSxLQUFLbkIsS0FBS21CLEtBQUtzWixHQUFHelYsS0FBSzdELEtBQUtxWixHQUFHMVYsS0FBSzNEOztLQUMvQyxJQUNNLElBQUZBLElBQUluQixLQUFLbUIsUUFBUUEsS0FBS3NaLEdBQUd6VixLQUFLN0QsS0FBS3FaLEdBQUcxVixLQUFLM0Q7SUFFdEQ7R0FDRjtHekJnYkEsU0FBU3dtQixxQkFBcUJ6cUI7SUFDNUIsSUFBSTRJO0lBQ0o1SSxJQUFJMkIsdUJBQXVCM0I7SUFDM0I0SSxRQUFPNUk7SUFDUCxHQUFLQSxnQkFBa0I0SSxRQUFRQSxLQUFNLE9BQU9BO0lBQzVDNUksSUFBSUE7SUFDSjRJLFFBQU81STtJQUNQLEdBQU1BLGdCQUFrQjRJLFFBQVFBLE9BQVMsbUJBQW1CNUksSUFBSSxPQUFPNEk7SUFDakUsSUFBRlEsSUFBSSwrREFBK0RwSjtJQUV2RSxHQUFHb0osRUFBRTtLQUNIO01BQUlzaEIsS0FBS3RoQjtNQUNMdWhCLFdBQVdDLFNBQVN4aEIsT0FBT0EsT0FBT3NoQjtNQUNsQ2pGLFlBQVlyYyxnQkFBWXNoQjtLQUM1QjloQixNQUFNK2hCLFdBQVd2cUIsWUFBWXFsQjtLQUM3QixPQUFPN2M7O0lBRVQsR0FBRyx5QkFBeUI1SSxJQUFJLE9BQU9vUztJQUN2QyxHQUFHLHVCQUF1QnBTLElBQUksU0FBUW9TO0lBQ3RDcEg7R0FDRjtHR3JWQSxTQUFTNmY7SUFDUCxPQUFPcm9CLHVCQUF1QjJDO0dBQ2hDO0dYbURBLFNBQVMybEIsZUFBZ0JqckIsR0FBR3dCLEdBQUssT0FBT3hCLE1BQU13QixHQUFHO0dBT2pELFNBQVMwcEIsZUFBZWxyQixHQUFFd0IsR0FBSyxPQUFPeEIsTUFBTXdCLEdBQUc7R0FoQi9DLFNBQVMycEIsZUFBZW5yQixHQUFFd0IsR0FBSyxPQUFPeEIsV0FBV3dCLE9BQVE7R3FCcEx6RCxTQUFTNHBCLHlCQUEwQmpyQjtJQUNqQyxJQUFJaUMsT0FBT2EsTUFBTTJHLHNCQUFzQnpKLElBQUlvZ0IsV0FBV3BmO0lBQ3RELEdBQUk4QjtLQUFTLE9BQ0g0Ryx1QkFBdUIxSixHQUFFaUM7O1FBQ3hCQSxLQUFLakIsWUFBVzs7UUFDaEJpQixLQUFLakIsVUFBVTs7SUFHMUIsR0FBSWlCLFFBQVFhLE9BQU80Ryx1QkFBdUIxSixHQUFHaUM7S0FDM0MsT0FBUXlILHVCQUF1QjFKLEdBQUdpQzs7O1FBQ2ZtZSxXQUFXbmUsUUFBUTs7O1FBQ25CbWUsVUFBV25lLFFBQVE7OztRQUNuQm1lLFVBQVduZSxRQUFROzs7UUFDbkJBLFFBQVE7O0lBRTdCLFFBQVFBLEdBQUdqQixNQUFNb2Y7R0FDbkI7R0FHQSxTQUFTOEssaUJBQWlCbG9CO0lBQ3hCLEdBQUlBLFdBQVdBLFNBQVUsT0FBT0E7SUFDaEMsR0FBSUEsV0FBV0EsU0FBVSxPQUFPQTtJQUNoQyxHQUFJQSxXQUFXQSxVQUFVLE9BQU9BO0lBQ2hDO0dBQ0Y7R3JCaVFBLFNBQVNtb0IscUJBQXFCbnJCO0lBQzVCO0tBQUlDLElBQUlnckIseUJBQTBCanJCO0tBQzlCaUMsSUFBSWhDO0tBQU1lLE9BQU9mO0tBQU1tZ0IsT0FBT25nQjtLQUM5Qm1yQixTQUFTN3BCLG9CQUFvQjZlO0tBQzdCaUw7T0FDQSxJQUFJNXFCLDZDQUE2QzJxQjtLQUNqRHBvQixJQUFJMEcsdUJBQXVCMUosR0FBR2lDO0tBQzlCd0QsSUFBSXlsQixpQkFBaUJsb0I7SUFDekIsR0FBSXlDLFNBQVNBLEtBQUsyYSxNQUFNcFY7SUFDaEIsSUFBSnBDLE1BQU1ySCxvQkFBb0JrRTtJQUM5QixPQUFTO0tBQ1B4RDtLQUNBZSxJQUFJMEcsdUJBQXVCMUosR0FBR2lDO0tBQzlCLEdBQUllLFNBQVM7S0FDYnlDLElBQUl5bEIsaUJBQWlCbG9CO0tBQ3JCLEdBQUl5QyxTQUFTQSxLQUFLMmEsTUFBTTtLQUV4QixHQUFJNEssZUFBZUssV0FBV3ppQixNQUFNb0M7S0FDcEN2RixJQUFJbEUsb0JBQW9Ca0U7S0FDeEJtRCxNQUFNa2lCLGVBQWVDLGVBQWVLLFFBQVF4aUIsTUFBTW5EO0tBRWxELEdBQUl1bEIsZUFBZXBpQixLQUFLbkQsSUFBSXVGOztJQUU5QixHQUFJL0ksS0FBS3dILHNCQUFzQnpKLElBQUlnTDtJQUNuQyxHQUFJb1YsY0FBYzRLLG1CQUFtQnZxQix1QkFBdUJtSTtLQUMxRG9DO0lBQ0YsR0FBSWhLLFVBQVU0SCxNQUFNbEgsZUFBZWtIO0lBQ25DLE9BQU9BO0dBQ1Q7R29CdUlBLFNBQVMwaUIsY0FBY3RkLElBQUlDLElBQUlqSyxHQUM3QmdLLE9BQU9BLFVBQVVDLEtBQUtqSyxJQUN0QixTQUNGO0dwQjVPQSxTQUFTdW5CLGVBQWdCMXJCLEdBQUd3QixHQUFLLE9BQU94QixNQUFNd0IsR0FBRztHQUhqRCxTQUFTbXFCLGNBQWUzckIsR0FBR3dCLEdBQUssT0FBT3hCLEtBQUt3QixHQUFJO0dxQ3ZPaEQsU0FBU29xQixjQUFjem5CO0lBQ3JCLFNBQVMwbkIsUUFBUTdyQixHQUFHZ1QsR0FDbEIsT0FBTzJVLHNCQUFzQjNuQixHQUFFZ1QsR0FDakM7SUFDQSxTQUFTOFksUUFBUTlyQixHQUFHZ1QsR0FDbEIsT0FBTytJLGdDQUFnQy9iLEdBQUVnVCxHQUMzQztJQUNBLFNBQVMrWSxHQUFHcGxCLEdBQUczQyxHQUNiLE9BQU8ybkIsY0FBY2hsQixHQUFFM0MsR0FDekI7SUFDQSxTQUFTZ29CLElBQUlybEIsR0FBRzNDLEdBQ2QsT0FBTzBuQixlQUFlL2tCLEdBQUUzQyxHQUMxQjtJQUNBLFNBQVNtWSxJQUFJeFYsR0FBRzNDLEdBQ2QsT0FBT2luQixlQUFldGtCLEdBQUUzQyxHQUMxQjtJQUNBLFNBQVM4aEIsSUFBSW5mLEdBQUczQyxHQUNkLE9BQU9rbkIsZUFBZXZrQixHQUFFM0MsR0FDMUI7SUFDQSxTQUFTaW9CLEtBQUtqc0IsR0FBR2dULEdBQ2YsT0FBTytZLEdBQUdGLFFBQVE3ckIsR0FBRWdULElBQUc4WSxRQUFTOXJCLFFBQVFnVCxJQUMxQztJQUNBLFNBQVNrWixJQUFJdmxCLEdBQUd2RSxHQUNkLE9BQU9pYixjQUFjMVcsR0FBR3ZFLEdBQzFCO0lBQ0EsU0FBUytwQixJQUFJeGxCLEdBQUd2RSxHQUFHcEMsR0FDakIsT0FBT3lyQixjQUFjOWtCLEdBQUd2RSxHQUFHcEMsR0FDN0I7SUFDQTtLQUFJb3NCLElBQUlkLHFCQUFxQi9OO0tBQ3pCOE8sT0FBT2YscUJBQXFCL047S0FDNUJoRztLQUFHK1U7S0FBSUM7S0FDUEMsS0FBS3JvQjtLQUNMd0MsSUFBSXVsQixJQUFJTTtLQUNScnNCLElBQUkrckIsSUFBSU07S0FDUkMsS0FBS1AsSUFBSU07S0FDVDNULEtBQUtxVCxJQUFJTTtJQUVialYsSUFBSTRFLElBQUloYyxHQUFHc3NCO0lBRVhsVixJQUFJdU8sSUFBSWtHLElBQUl6VSxHQUFFdVUsUUFBUXZVLFNBQVE4VTtJQUM5QjlVLElBQUl1TyxJQUFJa0csSUFBSXpVLEdBQUV1VSxRQUFRdlUsU0FBUThVO0lBQzlCOVUsSUFBSXlVLElBQUl6VSxHQUFFdVUsUUFBUXZVO0lBRWxCNFUsSUFBSUssT0FBT3JRLElBQUsySixJQUFJM2xCLEdBQUVpc0IsSUFBSXpsQjtJQUUxQixJQUFJMmxCLEtBQUtHLElBQ0xGLEtBQUsxVDtJQUNUMFQsS0FBS1AsSUFBSU8sSUFBR0Q7SUFDWkEsS0FBS0wsS0FBS0s7SUFDVkEsS0FBS04sSUFBSUEsSUFBSU0sSUFBSUMsS0FBTVYsUUFBUVU7SUFDL0JBLEtBQUtOLEtBQUtNO0lBQ1ZKLElBQUlLLE9BQU9GO0lBQ1hILElBQUlLLE9BQU9EO0lBRVgsT0FBT2hWO0dBQ1Q7R2pDd0xBLFNBQVNtViw0QkFBK0IsU0FBVTtHRTlCbEQsU0FBU0Msc0JBQXNCdHNCO0lBQ3ZCLElBQUZzRztJQUNKLE1BQU10RyxTQUFTQSxJQUFJQSxNQUNqQnNHLE9BQU90RztJQUVULE9BQU9zRztHQUNUO0dXaVhvQjtJQUFoQmltQjtNQUFrQjtRQUNwQixTQUFTQyxTQUFZN3JCLGdCQUFpQjtRQUN0QzZyQjs7Ozs7OzttQkFFa0JuWixNQUFNb1o7V0FDcEIsSUFBVyxJQUFGMXFCLElBQUlzUixVQUFTdFIsUUFBT0E7WUFDM0JwQixXQUFXQSxvQkFBcUI4ckIsU0FBUzFxQjtVQUZ2Qzs7bUJBSWFrRyxLQUFLb0wsTUFBTW9aO1dBQ3BCLElBQUp4a0IsTUFBTUE7V0FDVixJQUFXLElBQUZsRyxJQUFJc1IsVUFBU3RSLFFBQU9BO1lBQzNCcEIsV0FBV3NILFNBQVV3a0IsU0FBUzFxQjtVQUh6Qjs7bUJBS1lzUixNQUFNMU4sTUFBTThtQjtXQUMvQjlyQixXQUFXQSxvQkFBb0JnRjtXQUMvQixJQUFXLElBQUY1RCxJQUFJc1IsVUFBU3RSLFFBQU9BO1lBQzNCcEIsV0FBV0Esb0JBQXFCOHJCLFNBQVMxcUI7VUFIbEM7O21CQUtZaEI7V0FDckIsR0FBSUE7WUFBbUJKLHlCQUE4Q0k7bUJBQzVEQTtZQUFvQkosMEJBQWdESTs7WUFDeEVKLDBCQUFnREk7VUFIMUM7MEJBS0ssT0FBT0osZUFBckI7OztXQUVGQSxpQkFBaUJBO1dBQ2pCQTtXQUNBQTtXQUNBQSxlQUFnQkE7V0FDaEJBLGVBQWdCQTtXQUNoQkEsZUFBZ0JBO1dBQ2hCQSxlQUFnQkE7V0FDaEIsT0FBT0E7VUFSQTtRQVdYLGdCQUFpQm1ELEdBQUcwRTtTQUNsQkEsUUFBUThqQixzQkFBc0I5akI7U0FFOUI7VUFBSWtrQixhQUFjbGtCO1VBQ2Rta0IsV0FBYW5rQjtTQUdqQixHQUFJbWtCO1VBQ0ZDOztTQUVGO1VBQUlqZSxhQUFhNmQ7VUFDYjNWO1VBQ0FnVyxtQkFBbUJILGFBQWEzbUIsV0FBV21HO1NBRS9DLFNBQVM0Z0IsS0FBS2hwQjtVQUNaLEdBQUk0b0IsWUFBWTtVQUNJLElBQWhCSyxrQkFBa0JGLHdCQUF3Qi9vQjtVQUM5QyxHQUFJaXBCLGdCQUFpQjtXQUFFcGUsb0JBQW9Cb2U7V0FBa0I7O2NBQ3hELENBQUVGLHVCQUF1Qi9vQixJQUFJO1NBQ3BDO1NBRUEsU0FBU2twQixXQUFZbHBCO1VBQ25CLEdBQUlBLGNBQWU7V0FDakIsR0FBSWdwQixLQUFLaHBCLElBQUk7V0FDYjtZQUFJa0IsT0FBT2xCO1lBQ1BtcEIsTUFBTWhYLGdCQUFnQmpSO1lBQ3RCa29CO1dBQ0osS0FBSUQ7WUFDRnhxQjtXQUNGLEdBQUd3cUIsb0JBQW9CcHJCLFVBQVU7WUFDL0I4TTtZQUNBLElBQVcsSUFBRjVNLE9BQU9BLElBQUlpRCxhQUFhakQ7YUFDL0I0TSxnQkFBaUIzSixnQkFBZ0JqRDtZQUNuQzRNO1lBQ2UsSUFBWHdlLGFBQWF4ZTtZQUNqQixJQUFVLElBQUY1TSxPQUFPQSxRQUFRQSxLQUNyQjRNO1lBRUZzZSxjQUFjdGUsUUFBUTdLLEdBQUdvcEI7WUFDekJ2ZSxnQkFBZ0J3ZSxnQkFBZ0JEO1lBQ2hDdmUsZ0JBQWdCd2U7WUFDaEJ4ZSxnQkFBZ0J3ZSxvQkFBb0JEOztlQUMvQjtZQUNMdmU7WUFDQSxJQUFXLElBQUY1TSxPQUFPQSxJQUFJaUQsYUFBYWpEO2FBQy9CNE0sZ0JBQWlCM0osZ0JBQWdCakQ7WUFDbkM0TTtZQUNZLElBQVJ5ZSxVQUFVemU7WUFDZHNlLGNBQWN0ZSxRQUFRN0ssR0FBR29wQjtZQUN6QixHQUFJRCxvQkFBb0J0ZSxlQUFleWU7YUFDckN0aUI7cUVBQW9FOUY7O1dBRXhFMkosdUJBQXdCdWU7V0FDeEJ2ZSx1QkFBd0J1ZTs7a0JBRWpCcHBCLGFBQWF1RixTQUFTdkYsVUFBVUEsVUFBUztXQUNoRCxHQUFJQTtZQUNGZ0g7V0FFRixHQUFJaUgseUJBQXlCak87WUFDM0JyQjtXQUNGLEdBQUlxQixnQkFBZ0JncEIsS0FBS2hwQixJQUFJO1dBQzdCLEdBQUlBLGFBQWFBO1lBQ2Y2Syx1QkFBbUQ3SyxRQUFTQTs7WUFFNUQ2Syw0QkFBbUQ3SyxxQkFBcUJBO1dBQzFFNkssa0JBQWtCN0s7V0FDbEI2SyxrQkFBa0I3SztXQUNsQixHQUFJQSxjQUFjK1MsV0FBWS9TOztrQkFDckI4QyxpQkFBaUI5QyxHQUFJO1dBQzlCLEtBQUs4QyxpQkFBaUJ0RTtZQUNwQndJOztXQUVGLEdBQUlnaUIsS0FBS2hwQixJQUFJO1dBQ0wsSUFBSmxCLE1BQU0yRSxxQkFBcUJ6RDtXQUMvQixHQUFJbEI7WUFDRitMLHVCQUFvRC9MO21CQUM3Q0E7WUFDUCtMLDJCQUFnRC9MOztZQUVoRCtMLDRCQUFtRC9MO1dBQ3JELElBQVcsSUFBRmIsT0FBTUEsSUFBSWEsS0FBSWI7WUFDckI0TSxnQkFBaUI0WixzQkFBc0J6a0IsR0FBRS9CO1dBQzNDNE0sd0JBQXlCL0w7V0FDekIrTCx3QkFBeUIvTDs7a0JBQ2hCaUUsa0JBQWtCL0MsR0FBSTtXQUN2QixJQUFKbEIsTUFBTTJHLHNCQUFzQnpGO1dBQ2hDLEdBQUlsQjtZQUNGK0wsdUJBQW9EL0w7bUJBQzdDQTtZQUNQK0wsMkJBQWdEL0w7O1lBRWhEK0wsNEJBQW1EL0w7V0FDckQsSUFBVyxJQUFGYixPQUFNQSxJQUFJYSxLQUFJYjtZQUNyQjRNLGdCQUFpQm5GLHVCQUF1QjFGLEdBQUUvQjtXQUM1QzRNLHdCQUF5Qi9MO1dBQ3pCK0wsd0JBQXlCL0w7O2tCQUVyQmtCLE1BQU1BLE9BQUs7V0FDQyxJQUFWdXBCLG1CQUFtQnZwQjtXQVN2QmdILGlEQUErQ3VpQjs7a0JBS3hDdnBCLFVBQVVBO1dBQ2pCNkssdUJBQWlEN0s7a0JBRTdDQSxtQkFBa0JBO1dBQ3BCNkssMkJBQTZDN0s7a0JBQ3RDQSxvQkFBbUJBO1dBQzFCNkssNEJBQStDN0s7O1dBRS9DNkssNEJBQStDN0s7U0FHdkQ7U0FDQWtwQixXQUFZbHBCO1NBQ1osTUFBTytTLGlCQUFrQjtVQUN2QixJQUFJOVUsSUFBSThVLGFBQ0ovUyxJQUFJK1M7VUFDUixHQUFJOVUsUUFBUStCLFVBQVUrUyxXQUFZL1MsR0FBRy9CO1VBQ3JDaXJCLFdBQVlscEIsRUFBRS9COztTQUVoQixHQUFJOHFCO1VBQWtCbGUscUJBQXFCa2U7U0FDM0NsZTtTQUNBLE9BQU9BLGFBdElGO09BbkNhOztHaEIzRnRCLFNBQVMyZSxxQkFBc0JobkI7SUFDN0IsT0FBT2hFLHVCQUF1QitELHlCQUF5QkMsTUFBSUE7R0FDN0Q7R2dCd1FBLFNBQVNpbkIsNEJBQTZCenBCLEdBQUcwRTtJQUN2QyxPQUFPOGtCLHFCQUFzQmYsZ0JBQWlCem9CLEdBQUcwRTtHQUNuRDtHTmhrQkEsU0FBU2dsQixxQkFBcUJ4b0I7SUFDNUJrQyxxQkFBc0JsQztHQUN4QjtHUExBLFNBQVN5b0Isd0JBQXdCQztJQUN2QixJQUFKQSxNQUFNenBCLHdCQUF3QnlwQjtJQUNsQyxVQUFXM2pCLHVCQUF1QjtLQUNkLElBQWQ0akIsZ0JBQWdCNWpCO0tBQ3BCLEdBQUc0akIsaUJBQWlCQTtNQUNsQixJQUNFQSx1QkFBdUJELDBCQUN2QjtZQUNPM2UsR0FDUDs7O0tBR0Q7R0FDUDtHd0IvSEEsU0FBUzZlLDJCQUEyQjNyQjtJQUNsQyxHQUFHQSxjQUFjLE9BQVNBO0lBQzFCLE9BQU84RDtHQUNUO0doQndJQSxTQUFTOG5CLGlCQUFpQm5nQjtJQUN4QixHQUFHOUwsc0JBQXNCQTtLQUEwQixPQUMxQ0E7SUFFVHVKO0dBQ0Y7R0VxTEEsU0FBUzJpQixnQkFBZ0IvWSxRQUFRL0I7SUFDL0IsSUFBSXBRLE1BQU1tUyxrQkFDTi9FLFVBQVUySCxNQUFNL1U7SUFDcEIsSUFBVSxJQUFGYixPQUFPQSxJQUFJYSxLQUFLYixLQUN0QmlPLFNBQVNqTyxLQUFLZ1Q7SUFFaEIvQixRQUFRcFE7SUFDUixPQUFPb047R0FDVDtHQTFaQSxTQUFTK2Q7SUFDUDlYO21CQUNrQjZYO2lCQUNGelQ7WUFDTHBLO0dBRWI7R2J3WUEsU0FBUytkLDZCQUE4Qmx1QjtJQUM3QixJQUFKTTtJQUNKLEtBQUtxRCxjQUFjM0QsSUFDakJNLFNBQWlDTixJQUFJd0YsbUJBQW1CeEY7SUFDMUQsV0FBVzBHLFFBQVFwRyxLQUFLTixHQUFHQTtHQUM3QjtHYzBHQSxTQUFTbXVCLHVCQUF1QjNuQixHQUFFM0MsR0FBRWIsR0FBRXlDO0lBQ3BDdUY7R0FDRjtHRS9jQSxTQUFTb2pCLGlCQUFrQnB1QixHQUFHaUMsR0FBS3BCLFNBQVNiLEdBQUdhLFNBQVNvQixFQUFHO0dBQzNEbXNCO3dCQUN1QixPQUFPdnRCLE9BQU9BLFVBQTVCO3dCQUNjLE9BQU9BLE9BQU9BLHNCQUE1Qjs7O01BRUwsSUFBSWIsSUFBSWEsUUFBUW9CLElBQUlwQjtNQUNwQkEsU0FBU29CO01BQ1QsT0FBUWpDLEVBQUVpQyxVQUFXakMsRUFBRWlDO0tBSGpCOzs7TUFNTixJQUFJakMsSUFBSWEsUUFBUW9CLElBQUlwQjtNQUNwQkEsU0FBU29CO01BQ1QsT0FBUWpDLEVBQUVpQyxpQkFBa0JqQyxFQUFFaUM7S0FIeEI7OztNQU1OLElBQUlqQyxJQUFJYSxRQUFRb0IsSUFBSXBCO01BQ3BCQSxTQUFTb0I7TUFDVCxRQUFTakMsRUFBRWlDLFdBQWFqQyxFQUFFaUMsZUFDakJqQyxFQUFFaUMsY0FBYWpDLEVBQUVpQztLQUpwQjs7O01BT04sSUFBSWpDLElBQUlhLFFBQVFvQixJQUFJcEI7TUFDcEJBLFNBQVNvQjtNQUNULE9BQVFqQyxFQUFFaUMsV0FBYWpDLEVBQUVpQyxlQUN0QmpDLEVBQUVpQyxjQUFhakMsRUFBRWlDO0tBSmQ7O2NBTVVhO01BQ1YsSUFBRmIsSUFBSXBCO01BQ1JBLFNBQVNvQixJQUFJYTtNQUNiLE9BQU8wcUIscUJBQXFCM3NCLGdCQUFnQm9CLEdBQUdBLElBQUlhO0tBSDdDOztjQUtpQkE7TUFDakIsSUFBRmIsSUFBSXBCO01BQ1JBLFNBQVNvQixJQUFJYTtNQUNiLE9BQU9qQyxnQkFBZ0JvQixHQUFHQSxJQUFJYTtLQUhqQjtHQW1iakIsU0FBU3VyQix1QkFBd0JydUIsR0FBR2tPO0lBQzVCLElBQUZqTyxRQUFRbXVCLGlCQUFpQjdtQiwwQkFBMEJ2SCxJQUFJa087SUFDM0QsU0FBU29nQixRQUFRQztLQUNmLElBQUl2ckIsSUFBSS9DLFlBQ0pGLElBQUlpRDtLQUNSLE9BQVFBLGVBQWdCO01BQ3RCQSxJQUFJL0M7TUFDRyxJQUFIdXVCLEtBQUt6dUI7TUFDVCxHQUFJQSxLQUFLeXVCLFNBQVNEO01BQ2xCeHVCLElBQUl5dUIsS0FBTXhyQjs7S0FFWixPQUFPakQ7SUFDVDtJQUVBLE9BQU9FOztPQUVMLElBQUl3dUIsaUJBQ0FDLFdBQVd6dUIsYUFDZjs7T0FFQTtRQUFJd3VCLGFBQWF4dUI7UUFDYnN1QjtRQUNBRyxXQUFXSixRQUFRQztPQUN2QixHQUFHQTtRQUNEdmpCOztPQUVGOztlQUdBQSxnREFDQTs7SUFFRixPQUFPeWpCLGFBQWFsUSwyQkFBMkJtUTtHQUNqRDtHQTFjQSxTQUFTQyxlQUFnQjN1QixHQUFHaUM7SUFBS3BCLFNBQVNjLHVCQUF1QjNCO0lBQUlhLFNBQVNvQjtHQUFHO0dBQ2pGMHNCO3dCQUN1QixPQUFPOXRCLGtCQUFrQkEsVUFBdkM7d0JBQ2MsT0FBT0Esa0JBQWtCQSxzQkFBdkM7OztNQUVMLElBQUliLElBQUlhLFFBQVFvQixJQUFJcEI7TUFDcEJBLFNBQVNvQjtNQUNULE9BQVFqQyxhQUFhaUMsVUFBV2pDLGFBQWFpQztLQUh2Qzs7O01BTU4sSUFBSWpDLElBQUlhLFFBQVFvQixJQUFJcEI7TUFDcEJBLFNBQVNvQjtNQUNULE9BQVFqQyxhQUFhaUMsaUJBQWtCakMsYUFBYWlDO0tBSDlDOzs7TUFNTixJQUFJakMsSUFBSWEsUUFBUW9CLElBQUlwQjtNQUNwQkEsU0FBU29CO01BQ1QsUUFBU2pDLGFBQWFpQyxXQUFhakMsYUFBYWlDO2VBQ3ZDakMsYUFBYWlDO2VBQWFqQyxhQUFhaUM7O0tBSjFDOzs7TUFPTixJQUFJakMsSUFBSWEsUUFBUW9CLElBQUlwQjtNQUNwQkEsU0FBU29CO01BQ1QsT0FBUWpDLGFBQWFpQyxXQUFhakMsYUFBYWlDO2VBQzVDakMsYUFBYWlDO2VBQWFqQyxhQUFhaUM7S0FKcEM7O2NBTVVhO01BQ1YsSUFBRmIsSUFBSXBCO01BQ1JBLFNBQVNvQixJQUFJYTtNQUNiLE9BQU9OLHVCQUF1QjNCLGlCQUFpQm9CLEdBQUdBLElBQUlhO0tBSGhEOztjQUtpQkE7TUFDdkIsSUFBSWUsUUFBUW9ELFdBQVduRSxNQUNuQjlDLElBQUlhLFFBQ0pvQixJQUFJcEI7TUFDUixJQUFVLElBQUZvRCxPQUFPQSxJQUFJbkIsS0FBS21CLEtBQ3RCSixFQUFFSSxLQUFLakUsYUFBYWlDLElBQUlnQztNQUUxQnBELFNBQVNvQixJQUFJYTtNQUNiLE9BQU9lO0tBUk07R3FCekhHO0lBQWhCK3FCO01BQWtCO1FBQ3RCO1FBRUE7U0FBSUMsS0FBSy9MO1NBQWFnTSxLQUFLN25CO1NBQVk4bkIsTUFBTW5iO1NBQWFtTCxNQUFNcEw7U0FBWXFiLE1BQU1oTTtTQUFhaU0sTUFBTXhjO1FBQzdGLFNBQUp5YyxJQUFnQmxyQixHQUFHaEUsR0FBR2lQO1NBQ3RCLEdBQUk2ZixvQkFDQSxPQUFPQSx3QkFBd0I5cUIsR0FBR2hFLEdBQUdpUDtTQUN6QyxHQUFJalAsS0FBS2lHLFFBQVFqRyxPQUNiQTtTQUNKLEdBQUlpUCxLQUFLaEosUUFBUWdKLElBQUlqTCxVQUNqQmlMLElBQUlqTDtTQUNGLElBQUZqRSxRQUFRK3VCLEdBQUc3ZixJQUFJalA7U0FDbkJELE1BQU1pRSxXQUFXaEUsR0FBR2lQO1NBQ3BCLE9BQU9sUDtRQVREO1FBV0QsU0FBTG92QixLQUFpQm5yQixHQUFHakUsR0FBR0MsR0FBR2lQO1NBQzFCLEdBQUk2ZixtQkFDQSxPQUFPQSx1QkFBdUI5cUIsR0FBR2pFLEdBQUdDLEdBQUdpUDtTQUMzQyxHQUFJalAsS0FBS2lHLFFBQVFqRyxPQUNiQTtTQUNKLEdBQUlpUCxLQUFLaEosUUFBUWdKLElBQUlqTCxVQUNqQmlMLElBQUlqTDtTQUNSLE1BQU9oRSxJQUFJaVAsS0FBS2pQLEdBQ1pnRSxFQUFFaEUsS0FBS0Q7U0FDWCxPQUFPaUU7UUFUQTtRQVdILFNBQUpvckIsSUFBZ0JwckIsR0FBR04sR0FBRzFELEdBQUdpUDtTQUN6QixHQUFJNmY7VUFDQSxPQUFPQSw2QkFBNkI5cUIsR0FBR04sR0FBRzFELEdBQUdpUDtTQUNqRCxHQUFJalAsS0FBS2lHLFFBQVFqRyxPQUNiQTtTQUNKLEdBQUlpUCxLQUFLaEosUUFBUWdKLElBQUlqTCxVQUNqQmlMLElBQUlqTDtTQUNSLE1BQU9oRSxJQUFJaVAsR0FDUGpMLEVBQUVOLE9BQU9NLEVBQUVoRTtRQVJUO1FBZUg7U0FBSHF2Qjs7Ozs7OztRQVNJLFNBQUpubEIsSUFBZ0JvbEIsS0FBSzVzQixLQUFLNnNCO1NBQ3BCLElBQUZ0Z0IsUUFBUXVnQixNQUFNOXNCLE9BQU8yc0IsR0FBR0M7U0FDNUJyZ0IsU0FBU3FnQjtTQUNULEtBQUtDLElBQ0QsTUFBTXRnQjtTQUNWLE9BQU9BO1FBTEQ7UUFPSCxTQUFId2dCLEdBQWVocUIsR0FBRzVCLEdBQUc5RDtTQUNyQixJQUFJa0MsT0FBT3dJO1NBQ1gsTUFBT3hJLElBQUlsQyxLQUFLa0MsR0FDWndJLEtBQUtoRixFQUFFNUIsU0FBUzVCO1NBQ3BCLE9BQU93STtRQUpGO1FBTUYsU0FBSDZELEdBQWU3SSxHQUFHNUI7U0FBSyxRQUFRNEIsRUFBRTVCLEtBQU00QixFQUFFNUIsY0FBZ0I0QixFQUFFNUIsZUFBaUI0QixFQUFFNUI7UUFBekU7UUFFQSxTQUFMNnJCLEtBQWlCQyxLQUFLbGdCO1NBQ2YsSUFBSG1nQixLQUFLRCxTQUFVQSxjQUFnQkE7U0FDbkMsR0FBSUMsa0JBQWtCRCxjQUFlO1VBRWpDO1dBQUlFLE1BQU1GO1dBRU5HLEtBQU1EO1dBQWVFLEtBQU1GO1dBQWVHLEtBQUtIO1dBQVNJLE1BQU1KO1VBQ2xFLEdBQUlBLFNBQ0EzbEI7VUFFSixJQUFJZ21CLFNBQVNKLElBRVRLLEtBQUtILGNBQWNBLElBRW5CSSxLQUFLWCxHQUFHRSxLQUFLTyxJQUFJQztVQUNyQkQsTUFBTUM7VUFFTjtXQUFJRSxNQUFNSixXQUFZQSxNQUFPSDtXQUV6QlEsTUFBTWIsR0FBR0UsS0FBS08sSUFBSUcsUUFBU0o7V0FFM0JNLEtBQUtEO1VBQ1QsS0FBS1IsR0FBSTtXQUVFLElBQUhVLGdCQUFpQmI7V0FDckJZLEtBQUtDLE1BQU1BLFlBQVliOztVQUUzQixHQUFJWSxpQkFDQXJtQjtVQUNJLElBQUpoQyxVQUFVNG1CLElBQUlyZixTQUFVNmdCLE9BQU9DLEtBQU05Z0IsUUFBUThnQjtVQUNqRHJvQixZQUFZQSxZQUFZQTtVQUN4QixXQUNPZ29CLEtBQUtHOzs7cUJBR0xEO3FCQUNDM2dCLEtBQUtBLFNBQVVBLElBQUl2SDtxQkFDcEJxb0I7eUJBQ0l0QixJQUFJL21CO3FCQUNSb29CO3FCQUNBUDtxQkFDQTN2QixpQkFBaUJtd0I7O2tCQUdqQlgsVUFBWUQsNEJBQTZCLE9BRXpDcmhCLEdBQUdxaEI7U0FFZHpsQjtRQWhETztRQW1ESCxTQUFKdW1CLElBQWdCQztTQUNQLElBQUxDO1NBQ0osV0FBYUEsUUFBU0QsT0FBT0MsTUFDekI7U0FDSixPQUFPQTtRQUpEO1FBT0QsU0FBTEMsS0FBaUJqQixLQUFLTyxJQUFJVztTQUUxQixJQUFJQyxRQUFRWixjQUVSYSxNQUFNcEIsSUFBSU87U0FDZCxHQUFJYSxLQUFLRixLQUNMM21CO1NBRUo7VUFBSWdKLFVBQVU2ZDtVQUVWQyxRQUFROWQ7VUFBSStkO1VBQVV4YztVQUFTeFM7VUFBUWl2QixLQUFLaGU7VUFFNUNoTCxVQUFVMm1CLFVBQVUzYjtVQUNwQmllLFdBQVdwUyxJQUFJN1c7VUFFZmtwQixhQUFhckMsSUFBSTdtQjtVQUNqQm1wQixhQUFhdEMsSUFBSTdtQixVQUFVZ0w7VUFDM0JvZSxhQUFhcGU7VUFDYnFlLFdBQVd6QyxHQUFHNW1CLEtBQUtvcEIsS0FBS3BlO1VBQ3hCckgsWUFBWWlqQixHQUFHNW1CLEtBQUtvcEIsTUFBTXBlO1NBQzlCLE1BQU8rZCxhQUFhRCxVQUFXO1VBQzNCO1dBQUlMLE9BQU9GLElBQUlPO1dBQ1hRLE1BQU1WO1dBRU5XLFlBQWFkO1dBQ2JEO2NBQVFmLElBQUk2QixPQUFRN0IsSUFBSTZCLGdCQUFrQjdCLElBQUk2QixvQkFBcUJWO2VBQWFXO1dBRWhGQyxlQUFlZjtXQUVmZ0IsTUFBTUYsTUFBTVQ7V0FFWlksT0FBT2xCLE1BQU1nQjtVQUNqQixHQUFJRSxPQUFPRDtXQUNQYixRQUFRSCxNQUFNRCxNQUFNa0I7Y0FDbkIsQ0FDRGQsUUFBUUgsVUFDUixHQUFJRCxNQUFNZ0IsUUFDTmhCLE9BQU9pQjtVQUVmUixPQUFPRixTQUFTUDtVQUNoQixHQUFJQSxXQUFXLENBQ1hNLFNBQVNOLEtBQ1RhLE9BQU9MLE1BQU1ELFdBR2JELFNBQVNOO1VBQ2IsS0FBS0E7V0FBSyxFQUNIO1lBRVMsSUFBSm1CLE1BQU1mO1lBQ1ZyYyxNQUFPa2IsSUFBSWtDLE9BQVFsQyxJQUFJa0MsbUJBQW9CZjtZQUMzQ0E7WUFDQUcsT0FBT3hjOzs7YUFDRkE7O1NBR2pCLEdBQUl3YyxhQUFhRCxPQUNiOW1CO1NBQ0osSUFBSTRuQixZQUVBQyxTQUFTN2UsWUFBWUEsY0FFckI4ZSxRQUFROWU7U0FDWixJQUFXLElBQUZsVCxPQUFPQSxLQUFLaXhCLE9BQU9qeEIsRUFBRztVQUNwQixJQUFIaXlCLEtBQUtkLEtBQUtueEI7VUFDZCxHQUFJaXlCLE9BQVEsQ0FDUmIsT0FBT3B4QixPQUFNaXlCLElBQ2I7VUFHSixJQUFLaHdCLE9BQU9BLElBQUlnd0IsTUFBTWh3QixFQUFHO1dBQ3JCc3ZCLEtBQUtPLFVBQVU5eEI7V0FDZixHQUNJOHhCLFNBQVVBLFNBQVNDLFFBQVNDLFlBQ3ZCRixVQUFVWjs7O1NBSTNCLEdBQUlZLFFBQ0E1bkI7U0FDSixJQUFLakksT0FBT0EsSUFBSWlSLE1BQU1qUixFQUFHO1VBRXJCLElBQUlpd0IsS0FBS2QsT0FBT0csS0FBS3R2QixPQUVqQmt3QixLQUFLdG1CLE1BQU01SixLQUFLOHVCLEtBQUtOLElBQUl5QjtVQUM3QmIsT0FBT3B2QixNQUFNaXdCLE1BQU1DLE1BQU1qZjs7U0FFN0IsUUFBUzRkLG1CQUNFQyxPQUNBUSxTQUNBMWxCLFVBQ0F3bEI7UUEzRko7UUErRkgsU0FBSmUsSUFBZ0J6QyxLQUFLTztTQUVyQjtVQUFJanVCO1VBQU9vd0I7VUFFUG5xQixVQUFVNG1CO1VBQVN3RCxLQUFLM0MsSUFBSU87VUFFNUJxQyxLQUFLcnFCO1VBRUxzcUIsS0FBS3RxQjtVQUVMdXFCLFNBQVMxRCxJQUFJN21CO1NBRWpCLEdBQUlvcUIsU0FBVTtVQUVWLElBQUlJLEtBQUs5QixLQUFLakIsS0FBS08sWUFBWXlDLE1BQU1ELE9BQU9FLE1BQU1GO1VBQ2xEeEMsTUFBTW9DO1VBQ04sSUFBSU8sT0FBT0YsVUFFUEcsS0FBS25ELElBQUlPO1VBQ2IsS0FBSzRDLElBQ0Q1b0I7VUFFSjtXQUFJNm9CO1dBQVNDO1dBQVNDLE9BQU9MO1dBQU9NLE9BQU9EO1dBR3ZDRSxVQUFVakQsZUFBZU8sSUFBSXFDO1VBQ2pDLE9BQVM7V0FDTEssUUFBUUY7V0FDUixHQUFJRSxPQUFPTixNQUNQO1dBQ0ksSUFBSnJCLE1BQU0yQjtXQUNWSjthQUFTcEQsSUFBSTZCLE9BQVE3QixJQUFJNkIsbUJBQW9CMkIsa0JBQW9CRjtXQUNqRVYsS0FBS0YsTUFBTU8sTUFBTUc7V0FDakJJLFFBQVFEO1dBQ1IsR0FBSUMsT0FBT04sTUFDUDtXQUNKckIsTUFBTTJCO1dBQ05IO2FBQVNyRCxJQUFJNkIsT0FBUTdCLElBQUk2QixtQkFBb0IyQixrQkFBb0JEO1dBQ2pFWCxLQUFLRixNQUFNTyxNQUFNSTtXQUNqQkMsT0FBT0wsTUFBTUc7V0FDYkEsTUFBTUgsTUFBTUc7V0FDWkcsT0FBT04sTUFBTUk7V0FDYkEsTUFBTUosTUFBTUk7O1VBRWhCLEtBQU1YLFVBQ0Zub0I7O2FBRUg7VUFDRG1vQixLQUFLQztVQUNMLE1BQU9yd0IsSUFBSW93QixJQUFJcHdCLE9BQVE7V0FDVixJQUFMbXhCLE9BQU96RCxNQUFNTztXQUNqQnFDLEdBQUd0d0IsS0FBS214QjtXQUNSYixHQUFHdHdCLFNBQVNteEI7O1VBRWhCLEVBQUVsRDs7U0FHRSxJQUFKbUQ7U0FDSixJQUFLcHhCLE9BQU9BLElBQUlvd0IsTUFBTXB3QixFQUFHO1VBQ2QsSUFBSHF4QixLQUFLZixHQUFHdHdCO1VBRVosR0FBSXF4QixTQUNBcHBCO1VBQ0ptcEIsT0FBT0MsV0FBYUE7O1NBR3hCLElBQUlDLEtBQUs5QyxJQUFJNEMsVUFFVEcsVUFBVUQsSUFFVjdiLE1BQU04YixLQUFLSDtTQUVmLEdBQUkzYixNQUFPQSxTQUNQeE47U0FDSnFvQixHQUFHRixRQUFRNUIsSUFBSS9ZO1NBQ2YsSUFBS3pWLE9BQU9BLElBQUlvd0IsTUFBTXB3QixFQUFHO1VBQ2QsSUFBSHF4QixLQUFLZixHQUFHdHdCO1VBQ1osRUFBRXV3QixHQUFHRCxHQUFHdHdCLEtBQUtxeEIsTUFBT0MsU0FBU0Q7O1NBR2pDO1VBQUlHLFdBQVczRSxHQUFHMEU7VUFFZGpDLE9BQU9rQyxpQkFBaUJEO1VBQUtyQixLQUFLc0IsY0FBY0Q7U0FDcERmLEdBQUdjO1NBQ0gsSUFBS3R4QixJQUFJc3hCLElBQUl0eEIsU0FBU0EsRUFBRztVQUNkLElBQUh5eEIsS0FBS2pCLEdBQUd4d0I7VUFDWmt0QixLQUFLZ0QsSUFBSWx3QixHQUFHeXhCLElBQUlqQixHQUFHeHdCLFNBQVN5eEIsS0FBS2xCLEdBQUd2d0IsV0FBWXN4QixLQUFLdHhCOztTQUV6RCxHQUFJd3dCLFNBQVNlLElBQ1R0cEI7U0FDSixJQUFLakksT0FBT0EsSUFBSW93QixNQUFNcHdCLEVBQUc7VUFDWixJQUFMMHVCLE9BQU80QixHQUFHdHdCO1VBQ2QsR0FBSTB1QixLQUFNO1dBQ0csSUFBTDlxQixPQUFPNHNCLEdBQUc5QjtXQUNkeEIsS0FBS29DLE1BQU10dkIsR0FBRzRELE1BQU00c0IsR0FBRzlCLFFBQVE5cUIsYUFBYzB0QixLQUFLNUM7OztTQUcxRCxRQUFRVCxRQUNHaUMsT0FDQW9CLE9BQ0FoQztRQXBHTDtRQTBHVjtTQUFJb0M7V0FBcUIvQzs7ZUFBdUI5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FJNUM4RTtXQUFxQmhEOztlQUF1QjlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBSTVDK0U7V0FBc0JqRDtrQkFBdUI5Qjs7OztRQUl4QyxTQUFMZ0YsS0FBaUJqd0IsR0FBRzdEO1NBQ3BCLElBQUk4QyxNQUFNZSxVQUFVa3dCLFNBQVM5RSxJQUFJbnNCO1NBQ2pDLElBQVcsSUFBRmIsT0FBT0EsSUFBSWEsT0FBT2IsRUFBRyxDQUMxQjh4QixHQUFHOXhCLEtBQUtqQyxHQUNSQSxVQUFVNkQsRUFBRTVCO1NBRWhCLE9BQU84eEI7UUFOQTtRQVNYO1NBQUlDOztZQUF5QmxGOztjQUF1Qkc7Ozs7Ozs7Ozs7OztTQUloRGdGLE9BQXNCSCxLQUFLRTtTQUUzQkU7O1lBQXlCcEY7O2NBQXVCRzs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FJaERrRixPQUFzQkwsS0FBS0k7UUFFdkIsU0FBSkUsSUFBZ0J6RSxLQUFLMEUsS0FBS0M7U0FDMUI7VUFBSXh4QixNQUFNNnNCO1VBQVlHLEtBQUt1RTtVQUFZdkIsS0FBS25ELElBQUk3c0I7VUFBVTJ1QixZQUFZNkM7VUFBV0MsT0FBTUQ7U0FDdkYsS0FBS3hCLElBQ0Q1b0I7U0FDSjtVQUFJbWlCO1VBQVFtSSxNQUFNRjtVQUFNbnNCLE9BQU9yRixnQkFBZ0IydEIsSUFBSXFDLE1BQU0wQjtVQUFLdnlCO1NBQzlELE1BQU9rRyxNQUFNb3NCLE1BQU10eUIsSUFBSTZ0QixJQUFLO1VBQ3hCO1dBQUkwQixNQUFNcnBCO1dBQ051b0I7Y0FBT2YsSUFBSTZCLE9BQVE3QixJQUFJNkIsZ0JBQWtCN0IsSUFBSTZCLG9CQUFxQnJwQjtVQUN0RWtrQixNQUFPQSxNQUFNbUksTUFBTzlELE9BQU9lO1VBQzNCNEMsTUFBTXB5QixLQUFLcXlCLEtBQUtqSTtVQUNoQmxrQixPQUFRcXNCLE1BQU1GLEtBQUtqSTs7U0FFdkIsR0FBSWxrQixPQUFPb3NCLE1BQU10eUIsU0FBUzZ0QixJQUN0QjVsQjtRQWJFO1FBaUJELFNBQUx1cUIsS0FBaUI5RSxLQUFLMEUsS0FBS0M7U0FDM0I7VUFBSXBFO1VBQ0FKLEtBQUt1RTtVQUFZSyxNQUFPNUU7VUFBYzZFLE1BQU1EO1VBQVVFLE1BQU1GLE1BQU1DO1NBQ3RFUDtXQUFJekUsYUFBYU8sSUFBSUEsTUFBTVAsU0FBVUE7V0FBZTBFLGdCQUFnQks7V0FBTUo7U0FDMUVGO1dBQUl6RSxhQUFhTyxJQUFJQSxNQUFNUCxTQUFVQTtXQUFlMEUsYUFBYUssS0FBS0M7V0FBTUw7U0FDNUVGO1dBQUl6RSxhQUFhTyxJQUFJQSxNQUFNUCxTQUFVQTtXQUFlMEUsYUFBYU0sS0FBS0M7V0FBTU47U0FDNUVGLElBQUl6RSxhQUFhTyxLQUFLbUUsYUFBYU8sTUFBTU47UUFObEM7UUFTSCxTQUFKTyxJQUFnQmxGLEtBQUt0RCxJQUFJZ0k7U0FDekIsSUFBSTNCLElBQ0F4QyxLQUFLN0QsTUFFTHlJLEtBQUtuRixJQUFJTyxLQUFLNkUsUUFBU0Q7U0FDM0J6SSxPQUFPeUk7U0FDUDtVQUFJNWhCLEtBQU00aEIsVUFBWW5GLElBQUlPLGVBQWlCUCxJQUFJTztVQUUzQ3lDLE9BQU96QyxXQUFXaGQ7U0FDdEIsR0FBSTZoQixXQUFZO1VBQ1osR0FBSTdFLE1BQU1QLFlBQ047VUFDSnRELE9BQU82RDtVQUNQLEdBQUltRSxJQUFLLENBQ0xsRixLQUFLa0YsS0FBSzFFLElBQUlPLEtBQUs3RCxNQUFNQSxRQUFRblosS0FDakMsT0FBT21oQjtVQUVYLE9BQU9sRixTQUFTTCxHQUFHNWIsS0FBS3ljLElBQUlPOztTQUVoQyxHQUFJeUMsTUFBTWhELFlBQ047U0FDSixHQUFJb0YsV0FBWTtVQUNaMUksT0FBT3NHO1VBQ1AsR0FBSTBCLElBQUs7V0FDTEEsUUFBUTFFLGFBQWFPLElBQUl5QyxNQUFNdEc7V0FDL0JBLFFBQVFuWjtXQUNSLE9BQU9taEI7O1VBRVgsT0FBT25GLElBQUlTLEtBQUtPLElBQUl5Qzs7U0FFeEIsR0FBSW9DLFdBQVk7VUFFWjtXQUFJMW1CLEtBQUtzaEIsSUFBSU87V0FBSzhFLE1BQU0zbUI7V0FBUTRqQixLQUFNNWpCO1dBRWxDNG1CLE1BQU01bUI7V0FBUzZtQjtXQUFTQztVQUM1QixHQUFJSDtXQUFTLEdBQ0wvQztZQUNBZ0QsT0FBUXRGLE1BQU1PLFlBQWMrQixVQUFZdEMsTUFBTU87O1lBRTlDK0UsTUFBTTVtQjtjQUVUO1dBQ0Q4bUIsS0FBS2xEO1dBQ0wsR0FBSUE7WUFDQWdELFFBQVN0RixNQUFNTyxnQkFBaUJnRixNQUFPdkYsSUFBSU8sV0FBYVAsTUFBTU87bUJBQ3pEK0I7WUFDTGdELE9BQVF0RixNQUFNTyxZQUFjUCxNQUFNTztZQUFpQmdGLE1BQU92RixJQUFJTyxXQUFhUCxNQUFNTzs7WUFFakYrRSxPQUFRdEYsTUFBTU8sWUFBY1AsTUFBTU87WUFBa0JnRixNQUFPdkYsSUFBSU8sV0FBYVAsTUFBTU8sV0FBYVAsTUFBTU87O1VBRTdHLEVBQUVBO1VBRUY7V0FBSWhvQixNQUFNbXNCLE1BQU1BLGFBQWFoSSxNQUFNQSxPQUFPQSxZQUFZeUMsR0FBR3pDO1dBRXJEK0ksTUFBTWx0QixhQUFhK3NCO1VBQ3ZCLEdBQUlEO1dBQ0E5c0IsUUFBUXluQixhQUFhTyxJQUFJQSxNQUFNK0UsTUFBTUc7a0JBQ2hDSjtXQUNMN0YsS0FBS2puQixLQUFLeW5CLElBQUlPLE9BQU9rRjtjQUNwQjtXQUVNLElBQUhkLEtBQUtqSTtXQUNULEdBQUkySSxTQUFVO1lBQ0YsSUFBSkssTUFBTWpELElBQUl6QyxLQUFLTztZQUVuQmdGLE9BQU9oRixNQUFNQSxLQUFLbUY7WUFDbEJoSixPQUFPaUksS0FBS2U7O3FCQUVOZixJQUNOcHFCO1dBQ0osQ0FBQ2lyQixLQUFLVixPQUFPTDthQUFLekUsYUFBYU8sSUFBSUEsTUFBTWdGLE1BQU1odEIsYUFBYWt0QixNQUFNZDs7VUFHL0QsSUFBSHBDLEtBQUt2QyxJQUFJTztVQUNiLEdBQUlnQyxHQUFJO1dBQ0osR0FBSUE7WUFDQUEsTUFBTXZDLElBQUlPLFFBQVNQLElBQUlPO21CQUNsQmdDLFVBQ0xBLEtBQU9BLGdCQUFrQnZDLElBQUlPO1dBRXpCLElBQUpvRixNQUFNM0YsSUFBSU87V0FDZCxHQUFJb0YsU0FDQXByQjtXQUNJLElBQUpxckIsT0FBTzNCLE1BQU1DLE1BQU1GO1dBQ3ZCLElBQVcsSUFBRjF4QixPQUFPQSxXQUFVQSxFQUFHO1lBQ2xCLElBQUh1ekIsS0FBTUYsUUFBU3J6QjtZQUNuQixHQUFJdXpCLFFBQVM7YUFFQSxJQUFMQyxXQUFXM0csVUFBVWEsSUFBSU87YUFDN0JxRixJQUFJdHpCO2tCQUNHd3pCO2tCQUNBQTtzQkFDSTFHLElBQUkwRzs7O29CQUlWRDthQUVMOUMsS0FBSzlCLEtBQUtqQixLQUFLTyxTQUFTanVCLFNBQVNpdUIsS0FBS3dDLE9BQU82QyxJQUFJdHpCLEtBQUt5d0I7b0JBRWpEOEMsUUFBUyxDQUNkLEtBQUtuSixNQUNEbmlCLFFBQ0pxckIsSUFBSXR6QixLQUFLb3FCLEtBQUtwcUI7O1dBR3RCO1lBQUl5ekIsS0FBS3JKLE9BQU9rSjtZQUFLSSxNQUFNRDtZQUFPRSxNQUFNRjtZQUFPRyxNQUFNSDtZQUNqRDVDLEtBQUtuRCxJQUFJZ0Q7V0FDYixLQUFLRyxJQUNENW9CO1dBQ0o7WUFBSTRyQixRQUFRbkQsZ0JBQWdCbEMsSUFBSXFDLE1BQU0rQztZQUFPckUsTUFBTXNFO1lBQVdDO1lBQzFEQztlQUFRckcsSUFBSTZCLE9BQVE3QixJQUFJNkIsbUJBQW9Cc0Usa0JBQW9CRDtXQUNwRXJFLE9BQU9zRSxRQUFRRjtXQUNQO1lBQUpLO2VBQVF0RyxJQUFJNkIsT0FBUTdCLElBQUk2QixtQkFBb0JzRSxrQkFBb0JGO1dBQ3BFcEUsT0FBT3NFLFFBQVFIO1dBQ1A7WUFBSk87ZUFBUXZHLElBQUk2QixPQUFRN0IsSUFBSTZCLG1CQUFvQnNFLGtCQUFvQkg7V0FDcEUsTUFBT3pELE1BQU1BLElBQUs7WUFDZDthQUFJaUUsTUFBTU4sTUFBTUc7YUFDWkksT0FBT1AsTUFBTUc7YUFDYkssTUFBTVYsTUFBTU87YUFDWkksT0FBT1gsTUFBTU87YUFDYkssTUFBTVgsTUFBTUs7YUFDWk8sT0FBT1osTUFBTUs7WUFDakJ6RSxPQUFPc0UsUUFBUVM7WUFDZjthQUFJRSxXQUFXRjthQUNYRztlQUFNRDs7a0JBQVM5RyxJQUFJNkIsT0FBUTdCLElBQUk2QixnQkFBa0I3QixJQUFJNkI7a0JBQW1CN0IsSUFBSTZCO3FCQUFzQnNFO2tCQUFjVztZQUNwSGpGLE9BQU9zRSxRQUFRNUIsSUFBSW1DO1lBQ1o7YUFBSE07ZUFBS3hDLEtBQUtrQzs7a0JBQVUxRyxJQUFJNkIsT0FBUTdCLElBQUk2QixnQkFBa0I3QixJQUFJNkI7b0JBQXFCc0U7d0JBQW9CNUIsSUFBSW1DO1lBQzNHN0UsT0FBT3NFLFFBQVE5QixJQUFJbUM7WUFDWjthQUFIUztlQUFLM0MsS0FBS2tDOztrQkFBVXhHLElBQUk2QixPQUFRN0IsSUFBSTZCLGdCQUFrQjdCLElBQUk2QjtvQkFBcUJzRTt3QkFBb0I5QixJQUFJbUM7WUFDM0czRSxPQUFPc0UsUUFBUU07WUFDZko7YUFBTUgsTUFBTUc7O2dCQUFVckcsSUFBSTZCLE9BQVE3QixJQUFJNkIsbUJBQW9Cc0Usa0JBQW9CTTtZQUM5RTVFLE9BQU9zRSxRQUFRUTtZQUNmSjthQUFNUCxNQUFNTzs7Z0JBQVV2RyxJQUFJNkIsT0FBUTdCLElBQUk2QixtQkFBb0JzRSxrQkFBb0JRO1lBQzlFOUUsT0FBT3NFLFFBQVFVO1lBQ2ZQO2FBQU1MLE1BQU1LOztnQkFBVXRHLElBQUk2QixPQUFRN0IsSUFBSTZCLG1CQUFvQnNFLGtCQUFvQlU7WUFDOUUsR0FBSUUsUUFBUzthQUNUckssVUFBVUE7YUFDVkEsVUFBVUE7YUFDVkEsVUFBVXFLOztnQkFFVDthQUNPLElBQUpHLE1BQU1ILE9BQU9FO2FBQ2pCLEdBQUlDLElBQUs7Y0FDTEgsTUFBTUcsV0FBV3hLLGNBQWNBLEtBQUt3SztjQUNwQyxHQUFJQSxTQUNBeEssVUFBVUE7Y0FDZEEsVUFBVUE7Y0FDVkEsVUFBVXFLOzs7Y0FHVkEsTUFBTXJLOztZQUVkLElBQVcsSUFBRnBxQixPQUFPQSxJQUFJMjBCLE1BQU0zMEIsR0FDdEJpRyxJQUFJNnRCLE9BQU85ekIsS0FBS2lHLElBQUlrdEIsTUFBTW56QjtZQUU5Qjh6QixRQUFRYSxJQUFJeEIsT0FBT3dCO1lBQ1YsSUFBTEUsT0FBT2YsT0FBT1c7WUFDbEIsR0FBSUksU0FBVTthQUNWLElBQUloMEIsUUFBT2cwQixNQUNQN1ksS0FBS29PLE9BQU95SzthQUNoQixHQUFJaDBCLE1BQU02ekIsSUFDTjd6QixNQUFNNnpCO2FBQ1YsSUFBVyxJQUFGMTBCLE9BQU9BLElBQUlhLE9BQU9iLEdBQ3ZCaUcsSUFBSTZ0QixPQUFPOXpCLEtBQUtvcUIsS0FBS3BPLEtBQUtoYzthQUU5Qjh6QixRQUFRanpCLEtBQUs2ekIsTUFBTTd6QixLQUFLZzBCOztZQUU1QixJQUFXLElBQUY3MEIsT0FBT0EsSUFBSTAwQixNQUFNMTBCLEdBQ3RCaUcsSUFBSTZ0QixPQUFPOXpCLEtBQUtpRyxJQUFJNHVCLE9BQU83MEI7WUFFL0I4ekIsUUFBUVk7O1dBRVosR0FBSVosUUFBUVg7WUFBSyxNQUNOQSxNQUFNbHRCLFlBQ1RBLElBQUk2dEIsVUFBVTd0QixJQUFJa3RCOztZQUl0QlcsT0FBTzd0QjtXQUNYLEdBQUltc0IsS0FDQWhJLFFBQVEwSixXQUVSN3RCLE1BQU1nbkIsSUFBSWhuQixRQUFRNnRCOztrQkFHbEIxQixJQUFLO1dBQ0xoSSxRQUFRNEk7V0FDUixHQUFJRyxLQUFLLElBQ00sSUFBRm56QixPQUFPQSxJQUFJZ3pCLE9BQU9oekIsR0FDdkJpRyxJQUFJakcsS0FBS2lHLElBQUlrdEIsTUFBTW56Qjs7a0JBSXRCbXpCLEtBQ0xsdEIsTUFBTWduQixJQUFJaG5CLEtBQUtrdEI7VUFFdkIvSSxPQUFPc0c7VUFDUCxPQUFPenFCOztTQUVYZ0M7UUF4TU07UUEyTUYsU0FBSjZzQixJQUFnQkMsTUFBTUM7U0FDdEIsR0FBSUQsa0JBQ0EsT0FBT0E7U0FDSCxJQUFKOXVCLFVBQVU0bUIsR0FBR21JO1NBQ2pCLFFBQVNoMUIsT0FBTzRCLE9BQU81QixJQUFJKzBCLGVBQWUvMEIsRUFBRztVQUNqQyxJQUFKaTFCLE1BQU1GLEtBQUsvMEI7VUFDZmlHLFFBQVFndkIsS0FBS3J6QjtVQUNiQSxLQUFLcXpCOztTQUVULE9BQU9odkI7UUFURDtRQW9CVixnQkFBMkJ5bkIsS0FBS3puQjtTQUM1QixJQUFJZ29CLFFBQVE4RyxXQUFXN0UsU0FBT2pxQixLQUFLK3VCO1NBQ25DLE1BQU90SCxZQUFhO1VBQ1QsSUFBSHRELEtBQUtxRCxLQUFLQyxLQUFLd0MsTUFBTWpxQjtVQUN6QixVQUFXbWtCLGVBQWdCO1dBQ3ZCLEdBQUk4RixHQUFJO1lBQ0pqcUIsTUFBTWpDO1lBQ04sR0FBSW9tQixlQUFlQSxLQUFNLENBQ3JCMkssVUFBVTl1QixNQUFNbWtCLE9BQ2hCNEssTUFBTTVLOztlQUdULENBQ0QySyxVQUFVOXVCLE1BQ1Zta0I7V0FFSixRQUFRQSxNQUFPO1lBQ0gsSUFBSjhLLE1BQU10QyxJQUFJbEYsS0FBS3RELElBQUlua0I7WUFDdkIsS0FBS2l2QixLQUNEanRCO1lBQ0osR0FBSWhDO2FBQ0Fta0IsT0FBT0E7Z0JBQ047YUFDRDJLLFVBQVVHO2FBQ1ZGLE1BQU1FO2FBQ04vSCxJQUFJL0MsU0FBUzhLO2FBQ2I5SyxTQUFTOEssS0FBSzlLLGNBQWM4Szs7O1dBR3BDakgsS0FBSzdELE9BQVFBOzs7V0FHYjZELEtBQUs3RDtVQUNUc0QsTUFBTUEsYUFBYU87O1NBRXZCLE9BQU82RyxJQUFJQyxNQUFNQyxJQW5DZDtPQTlsQmdCOztHckJzTHZCLFNBQVNHLG9CQUFxQjV3QjtJQUM1QixPQUFPc04seUJBQTBCaEcsb0JBQXFCdEg7R0FDeEQ7R0EyRkEsU0FBUzZ3Qiw2QkFBNkJwaUIsUUFBUS9HO0lBQzVDLFNBQVNvZ0IsUUFBUUM7S0FDZixJQUFJdnJCLElBQUlpUyxpQkFDSmxWLElBQUlpRDtLQUNSLE9BQVFBLGVBQWdCO01BQ3RCQSxJQUFJaVM7TUFDRyxJQUFIdVosS0FBS3p1QjtNQUNULEdBQUlBLEtBQUt5dUIsU0FBU0Q7TUFDbEJ4dUIsSUFBSXl1QixLQUFNeHJCOztLQUVaLE9BQU9qRDtJQUNUO0lBQ1UsSUFBTnUzQixRQUFRcmlCO0lBQ1osT0FBT3FpQjs7T0FFTDtRQUFJN0k7UUFDQThJO1FBQ0E3SSxXQUFXelo7UUFDWHVpQix3QkFBd0I5STtRQUN4QitJLGNBQWN4aUI7UUFDZHlpQixXQUFXemlCO1FBQ1gwaUIsV0FBVzFpQjtPQUNmOztPQUVBO1FBQUl3WixhQUFheFo7UUFDYnNpQjtRQUNBaEo7UUFDQUcsV0FBV0osUUFBUUM7UUFDbkJpSix3QkFBd0JsSixRQUFRQztRQUNoQ2tKLGNBQWNuSixRQUFRQztRQUN0Qm1KLFdBQVdwSixRQUFTQztRQUNwQm9KLFdBQVdySixRQUFTQztPQUN4QixHQUFHQTtRQUNDdmpCOztPQUVKOztPQUVBQTs7T0FDQTs7T0FFQUEsMkRBQ0E7O0lBRUY7S0FBSStMO0tBQ0FnVyxtQkFBb0IwSyx1QkFBb0J4eEI7S0FDeEMyeEI7SUFDSixTQUFTQyxXQUFZNWlCO0tBQ1YsSUFBTHBQLE9BQU9vUDtLQUNYLEdBQUlwUDtNQUF1QyxHQUNyQ0EsYUFBeUM7T0FDM0MsSUFBSXZGLE1BQU11RixZQUNOME4sT0FBUTFOLGlCQUNSN0IsS0FBSzFEO09BQ1QsR0FBSWlULFdBQVcsT0FBT3ZQO09BQ3RCLEdBQUkrb0Isa0JBQWtCQSxpQkFBaUI2SyxpQkFBaUI1ekI7T0FDeEQrUyxXQUFXL1MsR0FBR3VQO09BQ2QsT0FBT3ZQOzs7T0FFUCxPQUFRNkI7YUFFTkEsYUFBMEM7TUFDNUMsSUFBSS9DLE1BQU0rQyxhQUNON0IsSUFBSWlSLGVBQWdCblM7TUFDeEIsR0FBSWlxQixrQkFBa0JBLGlCQUFpQjZLLGlCQUFpQjV6QjtNQUN4RCxPQUFPQTs7O01BQ0YsT0FDRTZCOztTQUVMLE9BQU9vUDs7U0FFUCxPQUFPQTs7U0FFUCxPQUFPQTs7U0FFUGpLLGlEQUNBOztTQUVXLElBQVAvSixTQUFTZ1U7U0FDYixHQUFHc2lCLGlCQUFpQnQyQixTQUFTMjJCLGNBQWMzMkI7U0FDM0MsT0FBTzhyQixpQkFBaUI5ckI7O1NBRWIsSUFBUEEsU0FBU2dVO1NBQ2IsR0FBR3NpQixpQkFBaUJ0MkIsU0FBUzIyQixjQUFjMzJCO1NBQzNDLE9BQU84ckIsaUJBQWlCOXJCOztTQUViLElBQVBBLFNBQVNnVTtTQUNiLEdBQUdzaUIsaUJBQWlCdDJCLFNBQVMyMkIsY0FBYzMyQjtTQUMzQyxPQUFPOHJCLGlCQUFpQjlyQjs7U0FFeEI7VUFBSTYyQixTQUFTN2lCO1VBQ1QzVSxNQUFNdzNCO1VBQ052a0IsT0FBT3VrQjtVQUNQOXpCLEtBQUsxRDtTQUNULEdBQUlpVCxXQUFXLE9BQU92UDtTQUN0QixHQUFJK29CLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hEK1MsV0FBVy9TLEdBQUd1UDtTQUNkLE9BQU92UDs7U0FFUGdILG9EQUNBOztTQUVBLElBQUlsSSxNQUFNbVMsaUJBQ05qUixJQUFJaVIsZUFBZ0JuUztTQUN4QixHQUFJaXFCLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hELE9BQU9BOztTQUVQLElBQUlsQixNQUFNbVMsa0JBQ05qUixJQUFJaVIsZUFBZ0JuUztTQUN4QixHQUFJaXFCLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hELE9BQU9BOztTQUVELElBQUZOLFFBQVE2RjtTQUNaLElBQVcsSUFBRnRILE9BQU1BLE9BQU1BLEtBQUt5QixNQUFNekIsS0FBS2dUO1NBQy9CLElBQUZqUixJQUFJb3pCLG9CQUFxQjF6QjtTQUM3QixHQUFJcXBCLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hELE9BQU9BOztTQUVELElBQUZOLFFBQVE2RjtTQUNaLElBQVcsSUFBRnRILE9BQU1BLE9BQU1BLEtBQUt5QixFQUFFekIsS0FBS2dUO1NBQzNCLElBQUZqUixJQUFJb3pCLG9CQUFxQjF6QjtTQUM3QixHQUFJcXBCLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hELE9BQU9BOztTQUVQLElBQUlsQixNQUFNbVMsaUJBQ05qUixRQUFRdUYsTUFBTXpHO1NBQ2xCa0I7U0FDTSxJQUFGTixRQUFRNkY7U0FDWixHQUFJd2pCLGtCQUFrQkEsaUJBQWlCNkssaUJBQWlCNXpCO1NBQ3hELElBQVcsSUFBRi9CLE9BQU1BLEtBQUthLEtBQUliLElBQUs7VUFDM0IsSUFBVyxJQUFGZ0MsT0FBTUEsT0FBTUEsS0FBS1AsTUFBTU8sS0FBS2dSO1VBQ3JDalIsRUFBRS9CLEtBQUttMUIsb0JBQXFCMXpCOztTQUU5QixPQUFPTTs7U0FFUCxJQUFJbEIsTUFBTW1TLGlCQUNOalIsUUFBUXVGLE1BQU16RztTQUNsQmtCO1NBQ00sSUFBRk4sUUFBUTZGO1NBQ1osR0FBSXdqQixrQkFBa0JBLGlCQUFpQjZLLGlCQUFpQjV6QjtTQUN4RCxJQUFXLElBQUYvQixPQUFNQSxLQUFLYSxLQUFJYixJQUFLO1VBQzNCLElBQVcsSUFBRmdDLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtVQUNqQ2pSLEVBQUcvQixLQUFLbTFCLG9CQUFxQjF6Qjs7U0FFL0IsT0FBT007O1NBRVAsSUFBSWxCLE1BQU1tUyxrQkFDTmpSLFFBQVF1RixNQUFNekc7U0FDbEJrQjtTQUNBLEdBQUkrb0Isa0JBQWtCQSxpQkFBaUI2SyxpQkFBaUI1ekI7U0FDbEQsSUFBRk4sUUFBUTZGO1NBQ1osSUFBVyxJQUFGdEgsT0FBTUEsS0FBS2EsS0FBSWIsSUFBSztVQUMzQixJQUFXLElBQUZnQyxPQUFNQSxPQUFNQSxLQUFLUCxNQUFNTyxLQUFLZ1I7VUFDckNqUixFQUFFL0IsS0FBS20xQixvQkFBcUIxekI7O1NBRTlCLE9BQU9NOztTQUVQLElBQUlsQixNQUFNbVMsa0JBQ05qUixRQUFRdUYsTUFBTXpHO1NBQ2xCa0I7U0FDTSxJQUFGTixRQUFRNkY7U0FDWixJQUFXLElBQUZ0SCxPQUFNQSxLQUFLYSxLQUFJYixJQUFLO1VBQzNCLElBQVcsSUFBRmdDLE9BQU1BLE9BQU1BLEtBQUtQLEVBQUVPLEtBQUtnUjtVQUNqQ2pSLEVBQUcvQixLQUFLbTFCLG9CQUFxQjF6Qjs7U0FFL0IsT0FBT007OztTQUdQZ0gsNENBQ0E7Ozs7U0FJQSxJQUFJaEksR0FBR2hEO1NBQ1AsT0FBUWdELElBQUlpUyx1QkFBd0JqVixLQUFLa0Usb0JBQXFCbEI7U0FDOUQsSUFBSW1xQixNQUFNaFgsZ0JBQWdCblcsSUFDdEIrM0I7U0FDSixLQUFJNUs7VUFDRm5pQjtTQUNGLE9BQU9uRjtzQkFFTDs7WUFFQSxLQUFJc25CO2FBQ0ZuaUI7WUFDRitzQixnQkFBZ0I1SztZQUNoQjs7WUFFQTRLLGdCQUFnQjlpQjtZQUVoQkE7WUFBa0JBO1lBQ2xCOztTQUVGO1VBQUlxWSxVQUFVclk7VUFDVjFCO1VBQ0F2UCxJQUFJbXBCLGdCQUFnQmxZLFFBQVExQjtTQUNoQyxHQUFHd2tCLGlCQUFpQmgyQjtVQUFVLEdBQ3pCZzJCLGlCQUFpQnhrQjtXQUNsQnZJOztTQUVKLEdBQUkraEIsa0JBQWtCQSxpQkFBaUI2SyxpQkFBaUI1ekI7U0FDeEQsT0FBT0E7aUJBRVBnSDs7SUFJUjtJQUNBLEdBQUd1c0I7S0FDRDtNQUFJaHZCLE9BQU8wTSxzQkFBc0J5WjtNQUM3QjlsQixVQUFVM0IsV0FBV3V3QjtNQUNyQjV1QixNQUFNZ21CLGdCQUFnQnJtQixNQUFNSztNQUM1QnFNLGFBQWFtWixpQkFBaUJ4bEI7SUFFNUIsSUFBSkEsTUFBTWl2QixXQUFZNWlCO0lBQ3RCLE1BQU84QixpQkFBa0I7S0FDdkIsSUFBSXhELE9BQU93RCxhQUNQL1MsSUFBSStTLGFBQ0p0UixJQUFJekI7S0FDUixHQUFJeUIsSUFBSThOLE1BQU13RCxXQUFXL1MsR0FBR3VQO0tBQzVCdlAsRUFBRXlCLEtBQUtveUIsV0FBWTVpQjs7SUFFckIsVUFBVy9HLGlCQUFlQSxTQUFTK0c7SUFDbkMsT0FBT3JNO0dBQ1Q7R2hCa01BLFNBQVNvdkIscUJBQXFCaDRCO0lBQzNCQSxXQUFZeUcsNkJBQTZCekc7SUFDMUMsT0FBT3dDLHVCQUF1QnhDO0dBQ2hDO0dnQnBmQSxTQUFTaTRCLDRCQUE0Qmo0QixHQUFFa087SUFDMUI7S0FBUCtHOztRQUFhMFo7U0FBZ0JxSixxQkFBcUJoNEIsV0FBV2tPLGtCQUFjQSxNQUFJQTtJQUNuRixPQUFPbXBCLDZCQUE2QnBpQixRQUFRL0c7R0FDOUM7R0NnRkEsU0FBU2dxQixpQkFBa0J6cUI7SUFDekI7S0FBSU4sT0FBT0YsaUJBQWlCUTtLQUN4QnFxQixhQUFhN3dCLFdBQVdzWDtJQUM1QixTQUFTNFosTUFBTWgxQixRQUFRbEMsUUFBUWxCO0tBQ3ZCLElBQUZFO0tBQ0osTUFBTUEsSUFBSUYsRUFBRTtNQUNWLEdBQUdvTixvQkFBb0JBLGdCQUFnQjtPQUNyQ0E7T0FDQUE7T0FDQUQsWUFBWUM7O01BRWQsR0FBSUEsb0JBQW9CQSxpQkFDdEI7TUFDRmhLLE9BQU9sQyxTQUFPaEIsS0FBS2tOLFlBQVlBO01BQy9CQTtNQUNBbE47O0tBRUYsT0FBT0E7SUFDVDtJQUNNLElBQUZBLElBQUlrNEIsTUFBTUwsV0FBV3ZaO0lBQ3pCLEdBQUd0ZTtLQUNEMlI7WUFDTzNSLElBQUlzZTtLQUNYdlQ7SUFDRjtLQUFJbEksTUFBTXVyQix1QkFBd0JybkIsb0JBQW9COHdCO0tBQ2xENXZCLFVBQVVqQixXQUFXbkUsTUFBTXliO0lBQy9CclcsUUFBUTR2QjtJQUNGLElBQUY3M0IsSUFBSWs0QixNQUFNandCLEtBQUtxVywwQkFBMEJ6YjtJQUM3QyxHQUFHN0MsSUFBSTZDO0tBQ0xrSSxpREFBaUQvSyxXQUFXNkM7SUFDOUQ7S0FBSTdCO0tBQ0EySCxNQUFNcXZCLDRCQUE0Qmp4QixvQkFBb0JrQixNQUFNakg7SUFDaEVrTSxjQUFjQSxjQUFjbE07SUFDNUIsT0FBTzJIO0dBQ1Q7R0FJQSxTQUFTd3ZCLGlDQUFpQ3AxQixHQUN4QyxPQUFPazFCLGlCQUFpQmwxQixHQUMxQjtHUTFTQSxTQUFTcTFCLGdCQUFnQnZYLEtBQUlyVyxHQUFFMUs7SUFDN0IsR0FBRytnQixXQUFXclcsRUFBRSxDQUNkcVcsU0FBUy9nQixHQUNUO0lBRUY7R0FDRjtHbEJpT0EsU0FBU3U0QixvQkFBcUJ6NEIsR0FBR3dCO0lBQy9CLEdBQUlBLFFBQVFBLFFBQVFBO0lBQ3BCeEIsSUFBSU8sU0FBU1A7SUFDYixPQUFRd0IsVUFBU3hCLElBQUdBO0dBQ3RCO0dPMkhBLFNBQVMwNEIsc0JBQXNCaGxCO0lBQ3ZCLElBQUZ2VCxJQUFJZ007SUFDUmhNLGNBQWN1VDtJQUNkdlQsaUJBQWlCQSxzQkFBc0JtRSx3QkFBd0JuRTtJQUMvRDtHQUNGO0dXaFhBLFNBQVN3NEIsaUJBQWlCMVgsS0FDeEIsT0FBT0EsT0FDVDtHSW1LQSxTQUFTMlgsY0FBY2xjO0lBQ1YsSUFBUEcsU0FBU0g7SUFDYkEsT0FBT0c7SUFDUEE7SUFDQSxHQUFHQSxZQUFhO0tBQ2QsSUFBVSxJQUFGelksSUFBSXlZLFFBQVF6WSxRQUFRQSxLQUMxQnNZLE9BQU90WTtLQUVUOFgsa0JBQWtCUSxPQUFPQTtLQUN6QixJQUFVLElBQUZ0WSxPQUFPQSxRQUFRQSxLQUNyQnNZLE9BQU90WTs7O0tBRUosSUFDSyxJQUFGQSxJQUFJeVksUUFBUXpZLFFBQVFBLEtBQzFCc1ksT0FBT3RZO0lBR1hzWSxjQUFjQTtJQUNkQSxjQUFlQTtJQUNmUixrQkFBa0JRLE9BQU9BO0lBQ25CLElBQUY3WSxRQUFRdUQ7SUFDWixJQUFXLElBQUZoRixPQUFPQSxPQUFPQTtLQUNyQixJQUFXLElBQUZnQyxPQUFPQSxPQUFPQSxLQUNyQlAsRUFBRXpCLFFBQVFnQyxLQUFNc1ksTUFBTXRhLFVBQVdnQztJQUNyQyxPQUFPUDtHQUNUO0dBTUEsU0FBU2cxQixlQUFlMTRCLEdBQUdrTyxLQUFLcEw7SUFDOUIsSUFBSXlaLE1BQU1zRyxnQkFDTnJjLElBQUllLDBCQUEwQnZIO0lBQ2xDc2MsZUFBZUMsS0FBSS9WLFdBQVcwSCxLQUFLQSxNQUFNcEwsTUFBTUE7SUFDL0MsT0FBTzBxQixxQkFBcUJpTCxjQUFjbGM7R0FDNUM7R1YrTkEsU0FBU29jLG9CQUFvQjNxQixJQUFJL0wsR0FBRytCO0lBQ2xDZ0ssT0FBT0EsVUFBVTRNLG1CQUFtQjNZLEtBQUsrQjtJQUN6QztHQUNGO0dYaFJBLFNBQVM0MEIsdUJBQXVCbDFCLEdBQUVtMUIsUUFDOUIsU0FDSjtHUjJmQSxTQUFTQyxzQkFBc0JueEIsSUFBSUUsSUFDakMsT0FBUUYsTUFBTUUsV0FDaEI7R0F6SEEsU0FBU2t4Qix5QkFBeUJweEIsSUFBSUUsSUFDcEMsT0FBT2l4QixzQkFBc0JqeEIsSUFBR0Y7R0FDbEM7R083WkEsU0FBU3F4QixxQkFBc0JuNUIsR0FBRXdCO0lBQy9CLEdBQUcyTCxNQUFNbk4sTUFBTW1OLE1BQU0zTCxJQUFJLE9BQU8wUztJQUNoQyxHQUFHbFUsS0FBR3dCLEdBQUcsT0FBT0E7SUFDaEIsR0FBR3hCLFFBQUssT0FDSHdCLFVBQ09qQixzQkFFREE7SUFFWCxJQUFJdXdCLE9BQU9oZSx5QkFBeUI5UyxJQUNoQzZsQixNQUFNbmtCO0lBQ1YsR0FBSzFCLElBQUV3QixLQUFPeEI7S0FDWjh3QixPQUFPN0YsZUFBZTZGLE1BQU1qTDs7S0FFNUJpTCxPQUFPOUosZUFBZThKLE1BQU1qTDtJQUM5QixPQUFPNVIseUJBQXlCNmM7R0FDbEM7R09NQSxTQUFTc0ksaUJBQ0QsSUFBRmo1QixJQUFJZ00scUJBQ1IsT0FBT2hNLFNBQ1Q7R0crTUEsU0FBU2s1QixZQUFZenJCO0lBQ1YsSUFBTE4sT0FBT0YsaUJBQWlCUTtJQUM1QixPQUFPTixlQUFlQSxrQkFBa0JBO0dBQzFDO0dBSUEsU0FBU2dzQixlQUFlMXJCLFFBQ3RCLE9BQU95ckIsWUFBWXpyQixRQUNyQjtHbEJ4SkEsU0FBUzJyQixlQUFnQnY1QixHQUFHd0IsR0FBSyxPQUFPeEIsTUFBTXdCLEdBQUk7R2tDdkhsRCxTQUFTZzRCLDZCQUE2QmpaLE1BQU1xRjtJQUMxQztLQUFJQyxNQUFNdlI7S0FDTndSLE9BQU9ELEtBQUt0RixNQUFNc0YsS0FBS0E7S0FDdkI5YyxNQUFNOGM7SUFDVixRQUFROWxCLG1CQUFtQjZsQixVQUFXO0tBQ3BDRSxTQUFTb0YsZUFBZXBGLFFBQVFBO0tBQ2hDQSxTQUFTb0YsZUFBZXBGLFFBQVFBO0tBQ2hDQSxTQUFTb0YsZUFBZXBGLFFBQVFBO0tBQ2hDL2MsTUFBTW1pQixlQUFlbmlCLEtBQUsrYyxJQUFJdFIsZ0JBQWdCb1I7S0FDOUNBLFdBQVc3SixnQ0FBZ0M2Sjs7SUFFN0MsT0FBTzdjO0dBQ1Q7RzlCeUhBLFNBQVMwd0IsMkJBQThCLFVBQVc7R1luT2xELFNBQVNDLDRCQUNQLFNBQ0Y7R0ptTEEsU0FBU0MsaUJBQWlCdDBCO0lBQ2YsSUFBTEosT0FBT3FHLGtCQUFrQmpHO0lBQzdCLEtBQUtKO0tBQ0hrRztJQUVGLE9BQU9sRyxtQkFBbUJBO0dBQzVCO0dGZ0dBLFNBQVMyMEIsdUJBQXVCenZCLElBQUl0QjtJQUNsQyxHQUFHQTtLQUFZO01BRVgsSUFBSWd4QixLQUFLenZCLGVBQ0wwdkIsTUFBTUQsWUFBWWh4QjtNQUN0QixXQUFXcUIsU0FBUzR2QixLQUFLanhCOztXQUNuQnVHO0lBRVYsV0FBV2xGLFNBQVNDLElBQUl0QjtHQUMxQjtHR1ZBLFNBQVNreEIsYUFBYTV2QixJQUFHdEI7SUFDdkJWLGdCQUFnQm5ILE1BQU0yRztJQUN0QjNHLG9CQUFzQmIsR0FBSyxTQUFmO0lBQ1osR0FBR2dLLGtCQUFrQjhpQjtLQUNuQmpzQixXQUFXaXNCO1lBQ0w5aUIsa0JBQWtCOGlCO0tBQ3hCanNCLFdBQVdpc0I7bUJBQ0VBLDJCQUNianNCLFdBQVdpc0I7SUFDYmpzQixhQUFhNkg7R0FDZjtHQUNBa3hCLDJDQUE2QyxTQUFiO0dBQ2hDQTthQUF5QzM0QixRQUFPaUgsS0FBSUMsS0FBSXJGO0tBQ3RELEdBQUdqQyxTQUFVO01BQ1g7UUFBR2lDLFdBQ0dxRixZQUNBQSxNQUFJckYsT0FBT29GO1dBQ1hBLElBQUlDLE1BQUlyRjtPQUNaQTtNQUdNLElBQUpzVyxNQUFNNVIsa0JBQWtCMUU7TUFDNUI0RSxnQkFBZ0JWLG9CQUFvQmtCLE1BQU1DLEtBQUtpUixRQUFRdFc7TUFDdkRqQyxTQUFTdVk7TUFDVDs7S0FFRmhTLHFCQUFxQnZHO0lBZFE7R0FnQi9CKzRCO2FBQXdDMzRCLFFBQVFpSCxLQUFLQyxLQUFLckY7S0FDeERzRSxxQkFBcUJ2RztJQURPO0dBRzlCKzRCLDBDQUNFLzRCLFdBQVdrQixVQURrQjtHSzFTL0IsU0FBUzgzQix1QkFBdUJweEIsTUFBS291QjtJQUNuQyxHQUFHQSxPQUFPOTBCLFdBQ1I4MEIsTUFBTXhSO0lBRVJBLGFBQWF3UixPQUFPcHVCO0lBQ3BCLE9BQU9vdUI7R0FDVDtHQUNBLFNBQVNpRCxjQUFlNTBCLE1BQU13RCxPQUFPcXhCO0lBQzdCLElBQUZoM0I7SUFDSixNQUFNMkYsTUFBTTtLQUNWLE9BQU9BOztRQUNDM0YsY0FBYTs7UUFDYkEsY0FBYTs7UUFDYkEsY0FBYTs7UUFDYkEsY0FBYTs7UUFDYkEsZ0JBQWU7O1FBQ2ZBLFlBQVk7O1FBQ1pBLGNBQWE7O1FBQ2JBLFlBQVc7O1FBQ1hBLGdCQUFlOztLQUV2QjJGLFFBQU1BOztJQUVSLEdBQUczRixZQUFZQTtLQUNicUU7T0FBcUJ6Rix1QkFBdUJ1RDs7SUFDOUMsR0FBR25DLFVBQVVBO0tBQ1hxRTtPQUFxQnpGLHVCQUF1QnVEOztJQUM5QyxJQUFJSixPQUFPcUcsa0JBQWtCakcsT0FDekJ1RCxPQUFPM0QsaUJBQWlCQSxXQUFVL0I7SUFDdEMsT0FBTzgyQix1QkFBd0JweEIsTUFBTTFHO0dBQ3ZDO0dBQ0E7TUFDRSxTQUFTMEcsS0FBS3VCLElBQUl0QjtPQUNoQixPQUFHdEU7aUJBQ01xMUIsdUJBQXVCenZCLElBQUl0QjtxQkFHdkJreEIsYUFBYTV2QixJQUFJdEI7TUFDaEM7TUFDQW14QjtRQUF1QnB4Qjs7TUFDdkJveEI7UUFBdUJweEI7TUFDdkJveEI7UUFBdUJweEI7S0FWeEI7O0dqQmlKRCxTQUFTdXhCLGdCQUFpQmg2QixHQUFHaUM7SUFDM0IsR0FBSUEsV0FBV3dILHNCQUFzQnpKLElBQUlzcEI7SUFDekMsT0FBTzVmLHVCQUF3QjFKLEdBQUdpQztHQUNwQztHOEJuTWE7SUFBVGc0QjtNQUFXO1FBQ2I7U0FBSUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQVdBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFVSixTQUFTQyxlQUFlcDNCO1NBQ3RCLE9BQVFrM0IsZ0JBQW1CbDNCLFlBQWFBO1FBQzFDO1FBRUEsU0FBU3EzQixVQUFVcjZCLEdBQUVpQztTQUNuQixPQUFRKzNCLGdCQUFnQmg2QixHQUFHaUMsWUFBYUE7UUFDMUM7UUFFQSxTQUFTcTRCLGNBQWM3bEIsSUFBSXpVLEdBQUdtSSxLQUFLb3lCO1NBRWpDO1VBQUlDLE9BQWdCNWYsbUJBQW1Cbkc7VUFDbkNnbUIsUUFBZ0I3ZixtQkFBbUJuRztVQUNuQ2ltQixZQUFnQi80Qix1QkFBdUI4UztVQUN2Q2ttQixZQUFnQmxtQjtVQUNoQm1tQixlQUFnQm5tQjtVQUNoQm9tQixhQUFnQnBtQjtVQUVoQnpVLElBQUkySiwyQkFBMkIzSjtVQUUvQjg2QjtVQUNBQztVQUNBaGtCO1VBQ0Fpa0IsYUFBYXp4QixNQUFNb3hCO1VBQ25CTSxrQkFBa0IxeEIsTUFBTXF4QjtTQUU1QixJQUFVLElBQUYzNEIsT0FBT0EsSUFBSSs0QixlQUFlLzRCO1VBQ2hDKzRCLE9BQU8vNEI7U0FFVCs0QixrQkFBa0I3eUI7U0FFSixTQUFWK3lCO1VBQ0YsTUFBT25rQixhQUFjO1dBQ1YsSUFBTG9rQixPQUFPcGtCO1dBQ1gsR0FBSW9rQjtZQUNGQSxjQUFjQSxrQkFBa0JBO21CQUUxQkEsU0FBVSxDQUNoQkwsS0FBS0ssYUFDTGh6QixNQUFNZ3pCLGNBQ047O1VBR0pKO1NBWmM7U0FlUCxTQUFMSyxLQUFnQkQsTUFBUXBrQixXQUFXb2tCLE1BQTVCO1NBRUEsU0FBUEU7VUFDRkwsZ0JBQWdCN3lCO1VBQ0wsSUFBUHpELGFBQWE2RSxVQUFVeXhCO1VBQzNCdDJCO1VBQ0EsSUFBVSxJQUFGekMsT0FBT0EsSUFBSSs0QixlQUFlLzRCLElBQUk7V0FDOUIsSUFBRnFPLElBQUkwcUIsT0FBTy80QjtXQUNmLEdBQUdxTyxlQUFlQSxXQUNoQkEsVUFBVUE7V0FFWjVMLFdBQVN6QyxTQUFVcU87V0FDbkI1TCxXQUFTekMsYUFBY3FPOztVQUV6QixPQUFPNUw7U0FaSTtTQWVJLFNBQWI0MkI7VUFDRixHQUFHZixTQUFTLE9BQU9jLGVBQ2RIO1NBRlk7U0FNbkIsUUFBUUgsS0FBTTtVQUNaO1dBQUlRLEtBQUtmLEtBQUtNO1dBQ1ZVLE9BQU9oQixLQUFLTTtXQUNaVyxPQUFPRDtXQUNQeDRCLElBQUloRCxFQUFFbUk7V0FDTnV6QjtVQUVKWjtVQUVBLE9BQVFTO2lCQUNIcEI7YUFDSCxHQUFHaHlCLFFBQVFuSSxTQUFVLENBQUNzN0IsZ0JBQWlCO2FBQ3ZDLEdBQUl0NEIsTUFBTXk0QixNQUFNdHpCLFlBQ1greUI7YUFDTDtpQkFDR2Y7YUFDSCxHQUFHaHlCLFFBQVFuSSxTQUFVLENBQUNzN0IsZ0JBQWlCO2FBQ3ZDLEdBQUlaLHFCQUFxQjEzQixPQUFPeTRCLE1BQU10ekIsWUFDakMreUI7YUFDTDtpQkFDR2Y7YUFDSDtrQkFBUzUzQixNQUFNWix1QkFBdUI4NEIsTUFBTWdCLFFBQVF4NUI7Y0FBT0EsSUFBSU07Y0FBWU4sSUFBSztjQUM5RSxHQUFHa0csUUFBUW5JLFNBQVUsQ0FBQ3M3QixnQkFBaUI7Y0FDdkMsR0FBSXQ0QixNQUFNVCxlQUFlTjtlQUN2QmUsSUFBSWhELElBQUltSTtrQkFDTCxDQUFFK3lCLGFBQWE7O2FBRXRCO2lCQUNHZjthQUNIO2tCQUFTNTNCLE1BQU1aLHVCQUF1Qjg0QixNQUFNZ0IsUUFBUXg1QjtjQUFPQSxJQUFJTTtjQUFZTixJQUFLO2NBQzlFLEdBQUdrRyxRQUFRbkksU0FBVSxDQUFDczdCLGdCQUFpQjtjQUN2QyxHQUFJWixxQkFBcUIxM0IsT0FBT1QsZUFBZU47ZUFDN0NlLElBQUloRCxJQUFJbUk7a0JBQ0wsQ0FBRSt5QixhQUFhOzthQUV0QjtpQkFDR2Y7YUFDSCxHQUFHaHlCLFFBQVFuSSxTQUFVLENBQUNzN0IsZ0JBQWlCO2FBQ3ZDLEdBQUlqQixVQUFVSSxNQUFNZ0IsT0FBT3o0QixJQUFJbUYsWUFDMUIreUI7YUFDTDtpQkFDR2Y7YUFDSCxHQUFHaHlCLFdBQVduSSxFQUFFbUksZ0JBQTBCK3lCLGFBQzFDO2lCQUNHZjthQUNILEdBQUdoeUIsTUFBTW5JLFlBQVlBLEVBQUVtSSxZQUFzQit5QixhQUM3QztpQkFDR2Y7YUFDSCxHQUFHaHlCLFNBQVU7Y0FDWCxHQUFHQSxRQUFRbkksU0FBVSxDQUFDczdCLGdCQUFpQjtjQUN2QyxHQUFHbEIsZUFBZXA2QixPQUFPO2NBQ3pCazdCOztxQkFFTy95QixRQUFRbkksU0FBVTtjQUN6QixHQUFHbzZCLGVBQWVwNkIsRUFBRW1JLFdBQVc7Y0FDL0IreUI7O2lCQUVHO2NBQ0gsR0FBR2QsZUFBZXA2QixFQUFFbUksYUFBYWl5QixlQUFlcDZCLEVBQUVtSSxPQUFPO2NBQ3pEK3lCOzthQUVGO2lCQUNHZjthQUNIdUIsUUFBUVYsT0FBT1M7YUFDZkwsa0JBQWlCTSw2QkFFR0E7YUFDcEJBLGNBQWN2ekI7YUFDZDtpQkFDR2d5QjthQUNIdUIsUUFBUVYsT0FBT1M7YUFDZkwsa0JBQWtCTSwyQkFFRUE7YUFDcEJBLFlBQVl2ekI7YUFDWjtpQkFDR2d5QjthQUNIdUIsUUFBUVYsT0FBT1M7YUFDZixHQUFHQyxtQkFBbUJBLGNBQWUsQ0FBQ1IsYUFBYzthQUNwRCxJQUFXLElBQUZqNUIsSUFBSXk1QixhQUFhejVCLElBQUl5NUIsV0FBV3o1QixJQUFJO2NBQzNDLEdBQUdrRyxRQUFRbkksU0FBVSxDQUFDczdCLGdCQUFpQjtjQUN2QyxHQUFHdDdCLEVBQUVpQyxNQUFNakMsRUFBRW1JLEtBQU0sQ0FBQyt5QixhQUFjO2NBQ2xDL3lCOzthQUVGO2lCQUNHZ3lCO2FBQ0gsR0FBSUUsVUFBVUksTUFBTWdCLE9BQU96NEIsSUFBSW1GLE9BQy9CO2lCQUNHZ3lCO2FBQ0gsTUFBT0UsVUFBVUksTUFBTWdCLE9BQU96NEIsSUFDNUJBLElBQUloRCxJQUFJbUksTUFDVjtpQkFDR2d5QjthQUNILEdBQUdoeUIsUUFBUW5JLFNBQVUsQ0FBQ3M3QixnQkFBaUI7YUFDdkMsR0FBSWpCLFVBQVVJLE1BQU1nQixPQUFPejRCO2NBQUksR0FFM0JBLElBQUloRCxJQUFJbUksV0FDRGt5QixVQUFVSSxNQUFNZ0IsT0FBT3o0Qjs7Y0FFN0JrNEI7YUFDTDtpQkFDR2YsZ0JBQ0gsT0FBT2tCO2lCQUNKbEI7YUFDSFcsS0FBS0EsS0FBS1UsTUFDVjtpQkFDR3JCO2FBQ0hpQixnQkFBZ0JOLEtBQUtVLFdBQVdyekIsUUFDaEM7aUJBQ0dneUI7YUFDSGlCOzRCQUFpQkgsbUJBQ0VRLGFBQ0NSLFlBQVlRO2FBQ2hDUixZQUFZUSxRQUFRdHpCO2FBQ3BCO2lCQUNHZ3lCO2FBQ0gsR0FBSWMsWUFBWVEsVUFBVXR6QixLQUFLK3lCLGFBQy9CO3FCQUNPLFVBQVUxTDs7O1NBR3JCO1FBQ0Y7UUFFQSxPQUFPOEs7T0F0Tk07O0dBME9mLFNBQVNxQixtQkFBbUJsbkIsSUFBSXpVLEdBQUdtSTtJQUNqQyxHQUFHQSxXQUFXQSxNQUFNc0Isc0JBQXNCeko7S0FDeEMyQztJQUNGLE1BQU93RixTQUFVO0tBQ1AsSUFBSlMsTUFBTXF4QixTQUFTeGxCLElBQUl6VSxHQUFHbUk7S0FDMUIsR0FBSVMsS0FBSyxPQUFPQTtLQUNoQlQ7O0lBR0Y7R0FDRjtHOUJtbEJBLFNBQVN5ekIsb0JBQW9CNTdCLEdBQzNCLE9BQU9tRSx3QkFBd0JuRSxHQUNqQztHbUI5VkEsU0FBUzY3QixZQUFZN3RCLElBQUlFLEtBQUtwTDtJQUM1QixJQUFJZzVCLGFBQ0FuVztJQUNKLEdBQUkzWCxlQUFnQjtLQUNsQixJQUFXLElBQUYvTCxPQUFPQSxJQUFJK0wsZ0JBQWdCL0wsS0FDbEMwakIsTUFBTUEsTUFBTTNYLFFBQVEvTDtLQUN0QjY1Qjs7UUFDSztLQUNMLElBQVcsSUFBRjc1QixPQUFPQSxJQUFLK0wsb0JBQXFCL0wsS0FDeEMwakIsTUFBTUEsTUFBTTNYLFFBQVEvTDtLQUN0QjY1QixjQUFjOXRCO0tBQ2RFLE1BQU1BOztJQUVSLEdBQUlBLFdBQVdwTCxXQUFZb0wsTUFBTXBMLE1BQU9rTCxRQUFROHRCO0tBQzlDbjVCO0lBRVcsSUFBVG81QjtJQUNKLElBQVcsSUFBRjk1QixPQUFPQSxJQUFJK0wsZ0JBQWdCL0wsS0FDbEM4NUIsU0FBUzk1QixLQUFLK0wsUUFBUS9MO0lBQ3hCODVCLFNBQVNELGVBQWVoNUI7SUFDeEI2aUIsT0FBT3ZTLDZCQUE2QnBGO0lBQ3ZCLElBQVRndUIsV0FBV2h1QixpQkFBaUJFLE1BQU15WCxNQUFNelgsTUFBTXBMLE9BQU82aUI7SUFDekQsT0FBTzdRLHNCQUFzQjlHLFNBQVNBLFdBQVcrdEIsVUFBVUM7R0FDN0Q7R0Q3Z0JBLFNBQVNDLG1CQUFtQnJ1QjtJQUUxQixVQUFVOUwsNkJBQTZCQTtJQUN2QztHQUNGO0dnQkdBLFNBQVNvNkIsdUJBQXVCeDRCO0lBQzlCLEtBQUlBLFNBQVUsQ0FDWkEsaUJBQ0E7SUFFRjtHQUNGO0dsQ3VUQSxTQUFTeTRCLGlCQUFpQm44QixHQUFFaUMsR0FBRWd0QjtJQUM1QixHQUFJaHRCLFdBQVdqQyxTQUFTNEo7SUFDeEI7S0FBSTBFLFlBQVkyZ0I7S0FDWjVnQixZQUFZNGdCO0tBQ1o3Z0IsWUFBWTZnQjtLQUNaOWdCLFlBQVk4Z0I7SUFDaEJwbEIsc0JBQXVCN0osR0FBR2lDLE9BQU9rTTtJQUNqQ3RFLHNCQUF1QjdKLEdBQUdpQyxPQUFPbU07SUFDakN2RSxzQkFBdUI3SixHQUFHaUMsT0FBT29NO0lBQ2pDeEUsc0JBQXVCN0osR0FBR2lDLE9BQU9xTTtJQUNqQztHQUNGO0djbUlBLFNBQVM4dEIsdUJBQXVCLFNBQVE7R0t2QnhDLFNBQVNDLG9CQUFvQnJ1QixJQUFJQyxJQUFJaks7SUFDM0IsSUFBSmtLLE1BQU1GLFVBQVVDO0lBQ3BCLEdBQUdDLFdBQVdGLGdCQUFnQlQ7SUFDOUJTLE9BQU9FLFNBQVFsSztJQUNmZ0ssT0FBT0UsU0FBUWxLO0lBQ2ZnSyxPQUFPRSxTQUFRbEs7SUFDZmdLLE9BQU9FLFNBQVFsSztJQUNmO0dBQ0Y7R2hCeE1BLFNBQVNzNEIsNkJBQWdDLE9BQU92YiwwQkFBMkI7R1EzUDNFLFNBQVN3YixpQkFBa0I3NEI7SUFDekI7S0FBSStCLFFBQVFpZixLQUFNaGhCO0tBQ2RpaEIsUUFBUWxmO0tBQ1JtZixlQUFlLElBQUtGLEtBQUtBLFNBQVNqZjtLQUNsQ29mLE1BQU16a0IsWUFBWXVrQixRQUFRQztJQUM5QjtZQUFnQm5mO1lBQW1CQTtZQUFtQkE7WUFDekNBO1lBQWdCQTtZQUFpQkE7WUFDakNBO1lBQWVvZjs7R0FFOUI7R0o0T0EsU0FBUzJYLG1CQUFtQjM4QixHQUMxQixHQUFJQSxRQUFRQSxRQUFRQSxHQUNwQixPQUFRQSxjQUNWO0dPN0JBLFNBQVM0OEIsb0JBQ0QsSUFBRno4QixJQUFJZ00scUJBQ1IsT0FBT2hNLElBQ1Q7R0FtRUEsU0FBUzA4Qix1QkFBdUJqdEI7SUFDeEIsSUFBRnpQLElBQUlnTTtJQUNSaE0sZUFBZXlQO0lBQ2Z6UCxzQkFBc0J5UDtJQUN0QjtHQUNGO0dBNkRBLFNBQVNrdEIsaUJBQWlCNTVCO0lBQ2xCLElBQUYvQyxJQUFJZ007SUFDUmhNLFNBQVMrQztJQUNUL0MsaUJBQWlCQSxzQkFBc0JtRSx3QkFBd0JuRTtJQUMvRDtHQUNGO0dBbE1BLFNBQVM0OEIsa0JBQWtCamU7SUFDbkIsSUFBRjNlLElBQUlnTTtJQUNSLFNBQVM2d0IsUUFBUUM7S0FDUCxJQUFKMXZCLFdBQVcwdkI7S0FDZixNQUFPMXZCLGdCQUFnQkEsWUFBWUE7S0FDbkMsT0FBT0E7SUFDVDtJQUNBLElBQ0FuTixJQUFLMGUsb0JBQ0xyTyxJQUFLcU8sbUJBQ0w5YSxJQUFLOGE7SUFDTDNlLFVBQVEyZTtJQUNFLElBQU5vZSxjQUFjRixRQUFRNThCLEtBQUs0OEIsUUFBUXZzQixLQUFLdXNCLFFBQVFoNUI7SUFDcEQ3RCxzQkFBd0IrOEI7SUFDeEIvOEIsd0JBQXdCKzhCO0lBQ3hCO0dBQ0Y7R0E0QkEsU0FBU0MsZUFBZW45QixHQUFFd0I7SUFDbEIsSUFBRnJCLElBQUlnTTtJQUNSaE0sTUFBSUg7SUFDSkcsTUFBSXFCO0lBQ0o7R0FDRjtHQXBGQSxTQUFTNDdCLHNCQUFzQnh0QixHQUFFMU87SUFDekIsSUFBRmYsSUFBSWdNO0lBQ1JoTSxVQUFVeVA7SUFDVnpQLFdBQVdlO0lBQ1hmLGlCQUFpQnlQO0lBQ2pCelAsa0JBQWtCZTtJQUNsQjtHQUNGO0dBbEVBLFNBQVNtOEI7SUFDUEYsZUFBZWp4QixpQkFBZ0JBO0lBQy9Ca3hCLHNCQUFzQmx4QixxQkFBb0JBO0lBQzFDMndCLHVCQUF1QjN3QjtJQUN2QndzQixzQkFBc0J4c0I7SUFDdEI0d0IsaUJBQWlCNXdCO0lBQ2pCNndCLGtCQUFrQjd3QjtJQUNsQjBQLHlCQUF5QjFQO0lBRXpCQTtHQUNGO0dLNHdCQSxTQUFTb3hCLDRCQUE0QkM7SUFDbkMsSUFBSS9wQjtJQUNKLEdBQVMrcEIsY0FBYzdxQjtLQUFjYztZQUM1QitwQixjQUFjM3BCO0tBQWNKO1lBQzVCK3BCLGNBQWMxcEI7S0FBV0w7WUFDekIrcEIsY0FBY24yQjtLQUFZb007WUFDMUIrcEIsY0FBY3pwQjtLQUFZTjtZQUMxQitwQixjQUFjeHBCO0tBQWFQO1lBQzNCK3BCLGNBQWMzcUI7S0FBWVk7WUFDMUIrcEIsY0FBY3BhO0tBQWEzUDs7S0FDL0IxUTtJQUNMLE9BQU8wUTtHQUNUO0dBS0EsU0FBU2dxQix5QkFBeUJEO0lBQ3ZCLElBQUwvcEIsT0FBTzhwQiw0QkFBNEJDO0lBQ3ZDLE9BQU90b0Isc0JBQXNCekIsVUFBVStwQixZQUFZQTtHQUNyRDtHRmxYQSxTQUFTRSxpQkFBaUI3dkIsUUFBT3RGLEtBQy9CLE9BQU8rYSxjQUFjelYsUUFBUXRGLEtBQy9CO0daN2VBLFNBQVNvMUIsZUFBZTl5QixHQUFLLGNBQWNBLEVBQUc7R2dCOE45QyxTQUFTK3lCLGlCQUFpQno4QixHQUFHaUQ7SUFDM0IsSUFBSWpELElBQUkyTyxxQkFBcUIzTyxHQUFFaUQsSUFDM0JqRCxJQUFJd2dCLG9CQUFvQnhnQjtJQUM1QixPQUFPQTtHQUNUO0dqQjFNQSxTQUFTMDhCLDJCQUEyQnQ3QixLQUFLK3RCLElBQU0sU0FBUztHNkJGeEQsU0FBU3dOLHdCQUF3Qjc5QjtJQUMvQixHQUFJQSxTQUFTO0lBQ1AsSUFBRkU7SUFDSixJQUFNRixzQkFBdUIsQ0FBRUUsSUFBSUEsUUFBUUYsSUFBSUE7SUFDL0MsSUFBTUEsc0JBQXVCLENBQUVFLElBQUlBLE9BQVFGLElBQUlBO0lBQy9DLElBQU1BLHNCQUF1QixDQUFFRSxJQUFJQSxPQUFRRixJQUFJQTtJQUMvQyxJQUFNQSxzQkFBdUIsQ0FBRUUsSUFBSUEsT0FBUUYsSUFBSUE7SUFDL0MsT0FBT0UsS0FBS0Y7R0FDZDtHQVFBLFNBQVM4OUIsNEJBQTRCOTlCLEdBQUssT0FBTzY5Qix3QkFBd0I3OUIsR0FBSTtHbkI0SzdFLFNBQVMrOUIsZUFBZS85QixHQUFFd0I7SUFDbEIsSUFBRnJCLElBQUlnTTtJQUNSaE07SUFDQUEsaUJBQWlCQSxLQUFJQSxXQUFXQTtJQUNoQ0EsaUJBQWlCSCxHQUFFRyxXQUFXcUI7SUFDOUJyQjtJQUNBQSxNQUFJSDtJQUNKRyxNQUFJcUI7SUFDSjtHQUNGO0dUdUlBLFNBQVN3OEIsdUJBQXVCOTZCLEdBQzlCLE9BQVFBLFdBQVVBLE1BQUtBLE1BQU1BLFNBQy9CO0dBYkEsU0FBUys2QixrQ0FBa0MvNkI7SUFDekM7S0FDRSxJQUFJRCxNQUFNKzZCLHVCQUF1Qjk2QixRQUM3Qm1ELFdBQVdxRCxNQUFNekc7S0FDckJvRCxVQUFVckY7S0FDVixJQUFXLElBQUZvQixPQUFPQSxJQUFJYSxLQUFLYixLQUFLaUUsS0FBS2pFLFNBQU93TyxVQUFVeE87S0FDcEQsT0FBT3lPLGNBQWMzTixHQUFHbUQsTUFMbkI7R0FNVDtHY2RBLFNBQVM2M0IsY0FBYy92QixJQUNyQixPQUFPZ2EsWUFBWWhhLE9BQ3JCO0doQmxWQSxTQUFTZ3dCLDBCQUEwQjc3QjtJQUNqQyxPQUFPQSxzQ0FJTCxrQkFFQTs7R0FFSjtHQUlBLFNBQVM4N0Isc0JBQXNCOTdCO0lBQ3ZCLElBQUZsQztJQUNKLEdBQUdrQyxZQUFhO0tBQ2RsQyxLQUFLa0M7S0FDTDtPQUFHQSxtQkFBbUJBLGtCQUFrQjY3QiwwQkFBMEI3N0I7TUFFaEUsSUFBSSs3QixTQUFTLzdCLFFBQ1RnOEI7O01BRUosSUFBSUEsV0FDQUQsU0FBUy83QjtLQUVmbEM7S0FDQSxJQUFVLElBQUZnQyxJQUFJazhCLE9BQU9sOEIsSUFBSWk4QixlQUFlajhCLElBQUs7TUFDekMsR0FBR0EsSUFBSWs4QixPQUFPbCtCO01BQ1IsSUFBRitELElBQUlrNkIsT0FBT2o4QjtNQUNmLFVBQVUrQjtPQUNSL0QsS0FBSStEO2NBQ0VBLGFBQWEwQztPQUNuQnpHLFdBQVUrRDtxQkFFR0E7T0FDYi9ELFdBQVUrRDs7T0FFUC9EOztLQUVQQTs7WUFDU2tDLGVBQ1RsQyxLQUFLa0M7SUFFUCxPQUFPbEM7R0FDVDtHQUlBLFNBQVNtK0IsOEJBQThCbDBCO0lBQ3JDLEdBQUdBLGVBQWVYLFVBQVVXLGVBQWVBLGVBQWdCO0tBQzdDLElBQVJtMEIsVUFBVWo0QjtLQUNkLEdBQUdpNEI7TUFBUzN0QixjQUFjMnRCLFVBQVVuMEI7U0FDL0I7TUFDSDtPQUFJeEgsTUFBTXU3QixzQkFBc0IvekI7T0FDNUJvMEIsVUFBVWw0QjtNQUNkLEdBQUdrNEIsU0FBUzV0QixjQUFjNHRCO01BQzFCeFIsMENBQTBDcHFCO01BQzFDLEdBQUd3SCxjQUFjLE1BQU1BOzs7O0tBR3RCLE1BQ0dBO0dBRVY7R2dDMEdBLFNBQVNxMEIscUJBQXFCMStCO0lBQzVCLE9BQUdBLEVBQUVzb0IsMkJBQTJCcG1CO0dBSWxDO0duQ3lCQSxTQUFTeThCLGlCQUFpQngrQixHQUFFaUM7SUFDMUIsR0FBSUEsV0FBV2pDLFNBQVM0SjtJQUN4QjtLQUFJdUUsS0FBS3NhLHNCQUF1QnpvQixHQUFHaUM7S0FDL0JtTSxLQUFLcWEsc0JBQXVCem9CLEdBQUdpQztJQUNuQyxPQUFRbU0sVUFBVUQ7R0FDcEI7R3dCeEpBLFNBQVNzd0Isc0JBQXVCNTZCLEdBQUVHLEdBQ2hDSCxZQUNBQSxPQUFLRyxHQUNMLFNBQ0Y7R25CaUdBLFNBQVMwNkIsa0JBQWtCNytCLEdBQUssV0FBU0EsRUFBRztHWWxHNUMsU0FBUzgrQix5QkFBeUJseEIsUUFBUXZJO0lBQy9CLElBQUxpSSxPQUFPRixpQkFBaUJRO0lBQzVCTixZQUFZakk7SUFDWjtHQUNGO0dWNktBLFNBQVMwNUIsZ0JBQWdCLytCLEdBQUssT0FBT08sWUFBWVAsR0FBSTtHTzlJckQsU0FBU2cvQjtJQUNELElBQUY3K0IsSUFBSWdNO0lBQ1JoTTtJQUNBQTtJQUNBO0dBQ0Y7R1E5SCtCLElBQTNCOCtCLDZCQUE2QnZ2QjtHR2tGakMsU0FBU3d2Qix5QkFBeUJueEIsTUFDOUIsU0FDSjtHekJtWkEsU0FBU294QixtQkFBbUJsOEIsS0FDMUJILHVDQUNGO0dpQzNjQSxTQUFTczhCLDRCQUE0QnAvQixHQUFLLE9BQU84Z0Isd0JBQXdCOWdCLEdBQUk7R2hCeU43RSxTQUFTcS9CLG9CQUFxQnp4QixRQUFRTyxJQUFJL0wsR0FBRy9CO0lBQzNDO0tBQUlpTixPQUFPRixpQkFBaUJRO0tBQ3hCMU4sSUFBSUc7S0FDSmkvQixRQUFRaHlCLGtCQUFrQkE7SUFDOUIsR0FBR2pOLEtBQUtpL0IsTUFBTztLQUNibnhCLE9BQU9iLHFCQUFxQkEsa0JBQWlCQSxtQkFBbUJqTixJQUFJK0I7S0FDcEVrTCxvQkFBb0JqTjs7WUFFZGkvQixVQUFXO0tBQ2pCbnhCO09BQU9iLHFCQUFxQkEsa0JBQWlCQSxtQkFBbUJneUIsUUFBUWw5QjtLQUN4RWtMLG9CQUFvQmd5QjtLQUNwQnAvQixJQUFJby9COztRQUNDO0tBQ0xoeUI7S0FDQUE7S0FDQUQsWUFBWUM7S0FDRixJQUFOZ3lCLFFBQVFoeUIsa0JBQWtCQTtLQUM5QixHQUFHcE4sSUFBSW8vQixPQUFPcC9CLElBQUlvL0I7S0FDbEJueEIsT0FBT2IscUJBQXFCQSxrQkFBaUJBLG1CQUFtQnBOLElBQUlrQztLQUNwRWtMLG9CQUFvQnBOOztJQUV0QixPQUFPQTtHQUNUO0dZM1BBLFNBQVNxL0IsY0FBYzN4QixRQUFPNHhCO0lBQzVCLElBQUk5aUIsTUFBTXNHLGdCQUNOMWYsYUFBYThEO0lBQ2pCLEdBQUdvNEI7S0FBVyxXQUNEO01BQ0EsSUFBTGoxQixPQUFPODBCLG9CQUFvQnp4QixRQUFPdEssV0FBU0E7TUFDL0MsR0FBR2lILFdBQVc7TUFDZGtTLGVBQWVDLEtBQUlwWixtQkFBbUJpSCxPQUFPQTs7O0tBRTFDLE1BQ0NpMUIsV0FBWTtNQUNQO09BQUxqMUI7U0FBTzgwQjtXQUFvQnp4QixRQUFPdEssV0FBV2s4QixTQUFTbDhCLGdCQUFnQkEsZ0JBQWdCazhCO01BQzFGLEdBQUdqMUIsV0FBV3dIO01BQ2QwSyxlQUFlQyxLQUFJcFosbUJBQW1CaUgsT0FBT0E7TUFDN0NpMUIsVUFBVWoxQjs7SUFHZCxPQUFPb2pCLHFCQUFxQmlMLGNBQWNsYztHQUM1QztHdEJ1UEEsU0FBUytpQixpQkFBa0J6L0IsR0FBSyxPQUFPTyxXQUFXUCxHQUFJO0dDMUd0RCxTQUFTMC9CLHlCQUF5Qjc3QixHQUM5QixTQUNKO0dHaUlBLFNBQVM4N0IsbUJBQW1CaHVCLFlBQzFCLE9BQU9LLGtCQUFrQkw7R0FDM0I7R011SUEsU0FBU2l1QixxQkFBcUJoeUIsUUFBT3RLLFFBQU9sQyxRQUFPNkI7SUFDeEMsSUFBTHFLLE9BQU9GLGlCQUFpQlE7SUFDNUIsS0FBS047S0FBYS9GO0lBQ1AsSUFBUGpFLFNBQVNvRSwwQkFBMEJwRTtJQUN2Q0EsU0FBU0EsZ0JBQWdCbEMsUUFBUUEsU0FBUzZCO0lBQzFDLEdBQUdxSyxtQkFBbUJoSyxnQkFBZ0JnSyxtQkFBb0I7S0FDbEQsSUFBRnRKLFFBQVFvRCxXQUFXa0csbUJBQW1CaEs7S0FDMUNVLE1BQU1zSjtLQUNOQSxjQUFjdEo7O0lBRWhCLE9BQU9zSjs7T0FFTEEsZ0JBQWdCaEssUUFBUWdLO09BQ3hCQSxvQkFBb0JoSztPQUNwQjhmLGNBQWV4VjtPQUNmOztPQUVBTixnQkFBZ0JoSyxRQUFRZ0s7T0FDeEJBLG9CQUFvQmhLO09BQ3BCLEdBQUdnSyxvQkFBb0JBLG9CQUNyQjhWLGNBQWV4VjtPQUNqQjs7T0FFTyxJQUFINFosS0FBS2xrQjtPQUNULEdBQUdra0IsT0FBUTtRQUNUbGEsZ0JBQWdCaEssUUFBUWdLO1FBQ3hCQSxvQkFBb0JoSztRQUNwQixHQUFHZ0ssb0JBQW9CQSxvQkFDckI4VixjQUFleFY7O1dBRWQ7UUFDSE4sZ0JBQWdCaEssbUJBQW1Ca2tCLFNBQVNsYTtRQUM1Q0Esb0JBQW9Ca2E7UUFDcEJwRSxjQUFleFY7UUFDZk4sZ0JBQWdCaEssZ0JBQWdCa2tCLFNBQVNsYTtRQUN6Q0Esb0JBQW9CaEssZ0JBQWdCa2tCOztPQUV0Qzs7SUFFRjtHQUNGO0dBSUEsU0FBU3FZLGVBQWVqeUIsUUFBT3RLLFFBQU9sQyxRQUFPNkI7SUFDM0MsT0FBTzI4QjthQUFxQmh5QixRQUFPdEcscUJBQXFCaEUsU0FBUWxDLFFBQU82QjtHQUN6RTtHUS9aQSxTQUFTNjhCLGtCQUFrQi94QixNQUN2QixPQUFPb1osZUFDWDtHVWdFQSxTQUFTNFksbUJBQW1CLy9CO0lBQzFCLE9BQUdBLEVBQUVzb0IsMkJBQTJCcG1COztrQkFHbkJsQyxFQUFFc29CO0dBQ2pCO0dSckZBLFNBQVMwWCwyQkFBMkJqeUI7SUFDbEMsVUFBVTlMO0tBQ1IsSUFBTSxXQUFXQSxtQ0FBbUNtTjtJQUV0RCxVQUFVbk4seUNBQTBDO0tBQ2xELElBQU0sV0FBV0Esa0RBQW1EbU47S0FDcEUsSUFBTSxXQUFXbk4sa0RBQW1EbU47S0FDcEUsSUFBTSxXQUFXbk4scURBQXNEbU47O0lBRXpFakU7R0FDRjtHdEI1QkEsU0FBUzgwQix1QkFBdUIvOEIsR0FBRW1ELE1BQ2hDLG1CQUFrQm5ELGFBQVdtRDtHQUMvQjtHWXFnQkEsU0FBUzY1QixvQkFBb0J0eUI7SUFDM0IsT0FBT1IsaUJBQWlCUTtHQUMxQjtHZ0JuaEJBLFNBQVN1eUIsd0JBQXdCbmdDO0lBQy9CLElBQUlFLFFBQ0FzQjtJQUNKQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsR0FBSSxDQUFFdEIsSUFBSUEsUUFBT0YsSUFBSXdCO0lBQzdDQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsR0FBSSxDQUFFdEIsSUFBSUEsUUFBT0YsSUFBSXdCO0lBQzdDQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsR0FBSSxDQUFFdEIsSUFBSUEsT0FBT0YsSUFBSXdCO0lBQzdDQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsR0FBSSxDQUFFdEIsSUFBSUEsT0FBT0YsSUFBSXdCO0lBQzdDQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsR0FBSSxDQUFFdEIsSUFBSUEsT0FBT0YsSUFBSXdCO0lBQzdDQSxJQUFJdWEsZ0NBQWdDL2I7SUFDcEMsS0FBS0QsbUJBQW1CeUIsSUFBSSxPQUFPdEI7SUFDbkMsT0FBT0EsSUFBSXlCLG9CQUFvQjNCO0dBQ2pDO0dEekJBLFNBQVNvZ0Msa0JBQWtCM2lCLElBQUlDO0lBQzdCLElBQUkyaUIsS0FBSzVpQixXQUFXNmlCLEtBQUs1aUIsV0FDckJyZCxJQUFJZ2dDLEtBQUdDLFFBQ1AzNUIsUUFBUStDLE1BQU1ySjtJQUNsQnNHO0lBQ0EsSUFBSXZFLE9BQU1nQztJQUNWLE1BQUtoQyxJQUFFaStCLElBQUdqK0IsS0FBS3VFLEVBQUV2RSxLQUFHcWIsR0FBR3JiO0lBQ3ZCLE1BQUtBLElBQUUvQixHQUFFK0IsS0FBSWdDLEtBQUt1QyxFQUFFdkUsS0FBR3NiLEdBQUd0WjtJQUMxQixPQUFPdUM7R0FDVDtHckJyQ0EsU0FBUzQ1Qix5QkFDUCxPQUFPLElBQUsxYix3QkFDZDtHQUtBLFNBQVMyYixpQkFDUCxPQUFPamdDLFdBQVdnZ0MsMEJBQ3BCO0dNd01BLFNBQVNFLDJCQUEyQjd5QixRQUFPMUs7SUFDekNrSyxpQkFBaUJRLGlCQUFpQjFLO0lBQ2xDO0dBQ0Y7R0ZqTEEsU0FBU3c5QixrQ0FBa0MzMUIsUUFDekMsVUFDRjtHZm1pQkEsU0FBUzQxQixnQkFBZ0J4Z0MsR0FBR2lDLEdBQUcvQixHQUFHOEM7SUFDaEMsR0FBSTlDO0tBQU8sR0FDTCtCLFdBQVcvQixLQUFLRixPQUFRQSxZQUEwQkUsS0FBS0Y7TUFBYyxHQUNuRWdELE9BQVE7T0FDVmhEO09BQ0FBOztVQUNLO09BQ0xBLE1BQU1GLGdCQUFpQkksR0FBR2dFLG9CQUFvQmxCO09BQzlDaEQsTUFBT0UsS0FBS0Y7O1NBRVQ7TUFDTCxHQUFJQSxVQUFzQnNILDRCQUE0QnRIO01BQ3RELElBQUtFLEtBQUsrQixHQUFHQSxJQUFJL0IsR0FBRytCLEtBQUtqQyxJQUFJaUMsS0FBS2U7O0lBR3RDO0dBQ0Y7R0svTEEsU0FBU3k5QixhQUFhemdDO0lBQ3BCOHNCO0lBQ0EsT0FBT3hTLEtBQUtuVyx3QkFBd0JuRTtHQUFJO0dGMUYxQyxTQUFTMGdDLGlDQUFrQ3ZpQixPQUN6QyxPQUFPeFI7R0FDVDtHYW9jQSxTQUFTZzBCLDJCQUE0QjM4QixHQUFHMEU7SUFDdEMsT0FBTzFCLG9CQUFxQnlsQixnQkFBaUJ6b0IsR0FBRzBFO0dBQ2xEO0dFL3JCQSxTQUFTazRCLHFCQUFxQmh6QixNQUFRLFNBQVU7R1cvQmhELFNBQVNpekIsZ0JBQWdCN2dDLEdBQUdrTyxLQUFLcEw7SUFDL0IsT0FBTzQxQixlQUFldnhCLHFCQUFxQm5ILElBQUdrTyxLQUFJcEw7R0FDcEQ7RzdCcTBCQSxTQUFTZytCLHFCQUFxQmpoQyxHQUFLLE9BQU84SiwyQkFBMkI5SixHQUFHO0dBbE54RSxTQUFTa2hDLGtCQUFrQnA1QixJQUFJRSxJQUM3QixHQUFHRixPQUFPRSxJQUFJLFVBQ2QsU0FDRjtHSzdpQkEsU0FBU201Qiw4QkFBOEJwekIsTUFDckMsU0FDRjtHV3FwQkEsU0FBU3F6Qiw0QkFBNkJqaEMsR0FBR2tPLEtBQUtwTCxLQUFLa0IsR0FBRzBFO0lBQzlDLElBQUZoRixJQUFJK29CLGdCQUFpQnpvQixHQUFHMEU7SUFDNUIsR0FBSWhGLFdBQVdaLEtBQUtrSTtJQUNwQnRELGdCQUFnQmhFLE1BQU0xRCxHQUFHa08sS0FBS3hLO0lBQzlCO0dBQ0Y7R2MxZUEsU0FBU3c5QixvQkFBb0JDLE1BQUtuRyxRQUFPb0c7SUFDdkM7S0FBSUQsT0FBT3gvQix1QkFBdUJ3L0I7S0FDOUJyK0IsTUFBTXErQjtLQUNOQyxPQUFPei9CLHVCQUF1QnkvQjtLQUM5Qng0QjtLQUNBN0k7S0FDQXNoQztLQUNBbEQ7S0FBT21EO0tBQUt0K0I7SUFDaEIsTUFBTWpELElBQUkrQyxJQUFJO0tBQ1p1K0IsTUFBTUYsWUFBWXBoQztLQUNsQixHQUFHc2hDO01BQ0R6NEIsT0FBT3k0QjtTQUVKO01BQ0gsR0FBR3RoQyxLQUFLK0MsS0FBS2tJO01BQ2JxMkIsTUFBTUYsWUFBWXBoQztNQUNsQixPQUFPc2hDOztTQUVMejRCLE9BQU95NEIsS0FDUDs7Ozs7Ozs7Ozs7U0FHQXIrQixNQUFLcStCO1NBQ0wsR0FBSXIrQixTQUFPZzRCO1VBQ1Rod0I7U0FDRm16QixRQUFRaFksZUFBZTZVLFFBQU9oNEI7U0FDOUJzK0IsTUFBTW5iLGVBQWU2VSxRQUFRaDRCO1NBQzdCLEdBQUltN0I7VUFDRm56QjtTQUNGcEMsT0FBS3c0QixXQUFXakQsT0FBTW1EO1NBQ3RCO2lCQUVBMTRCLGNBQWdCeTRCOzs7O0lBSXRCLE9BQU83K0IsdUJBQXVCb0c7R0FBTTtHekJtRnRDLFNBQVMyNEIsa0JBQW1CdmhDO0lBQzFCOHNCO0lBQ0EsT0FBT3hTLEtBQUtuVyx3QkFBd0JuRTtHQUFJO0dMNE4xQyxTQUFTd2hDLGlCQUFpQmg3QixHQUFFM0MsR0FBRWIsR0FBRXlDLEdBQUV3SjtJQUNoQ3ZILGdCQUFnQlAscUJBQXFCWCxJQUFHM0MsR0FBRWIsR0FBRXlDLEdBQUV3SjtJQUM5QztHQUNGO0dheGtCQSxTQUFTd3lCLFNBQVNqMkIsTUFBTUMsTUFBTUUsTUFBTUMsTUFBTTlJO0lBQ3hDLElBQVUsSUFBRmIsT0FBT0EsSUFBSWEsS0FBS2IsS0FDdEJ1SixVQUFVQyxPQUFLeEosS0FBSzBKLFVBQVVDLE9BQUszSjtJQUVyQztHQUNGO0dlNENBLFNBQVN5L0IsZ0NBQWdDQyxLQUFLdG1CLE1BQU11bUIsUUFBUXJtQixNQUFNelk7SUFDaEUsU0FBUzYrQjtLQUNQaC9CO0lBQ0YsR0FBR0csVUFBVTtJQUNKLElBQUwySSxPQUFPazJCLFdBQVd0bUI7SUFDdEIsR0FBRzVQLE9BQU8zSSxNQUFNNitCLGlCQUNkcDBCO0lBRUYsR0FBR2dPLE9BQU96WSxNQUFNMkUscUJBQXFCbTZCLFNBQ25DcjBCO0lBRVEsSUFBTmlPLFFBQVFtbUIsZUFBZWwyQixNQUFNQSxPQUFLM0k7SUFDdEM0RSxnQkFBZ0JWLG9CQUFvQndVLFdBQVdvbUIsUUFBUXJtQixNQUFNelk7SUFDN0Q7R0FDRjtHakJFQSxTQUFTKytCLGVBQWUzOEI7SUFDYixJQUFMSixPQUFPcUcsa0JBQWtCakc7SUFDN0IsS0FBS0osa0JBQ0hrRztJQUVGLE9BQU9sRyxpQkFBaUJBO0dBQzFCO0dUR0EsU0FBU2c5QiwwQkFBMEJ6N0IsSUFBR3JDO0lBQ3BDbUMsa0JBQWtCeEUsdUJBQXVCMEUsT0FBT3JDO0lBQ2hEO0dBQ0Y7R1FpSkEsU0FBUys5Qix3QkFBd0I3OEIsTUFBSzJCO0lBQ3BDLEdBQUcvRTtLQUNEQSw0QkFBNEJvRCxNQUFLMkI7UUFDOUI7S0FDSCxLQUFJL0Usd0JBQXdCQTtLQUM1QkEsbUNBQWtDb0QsZUFBYTJCOztJQUVqRDtHQUNGO0dDMUpBLFNBQVNtN0Isa0JBQWtCOThCO0lBQ25CLElBQUZqRixJQUFJNGhDLGVBQWUzOEI7SUFDdkJqRixPQUFPc0Isb0JBQW9CdEI7R0FDN0I7R1g4dEJBLFNBQVNnaUMsa0JBQWtCamlDLEdBQ3pCLE9BQU9tRSx3QkFBd0JuRSxHQUNqQztHa0MzMUJBLFNBQVNraUMsbUJBQW1CeCtCO0lBQzFCLEdBQUdBO0tBQ0RzSDs7S0FDR3RIO0lBQ0w7R0FDRjtHSm1PQSxTQUFTeStCLGtCQUFrQjF0QixJQUFJelUsR0FBR21JO0lBQ2hDLEdBQUdBLFdBQVdBLE1BQU1zQixzQkFBc0J6SjtLQUN4QzJDO0lBQ0YsTUFBT3dGLE9BQU9zQixzQkFBc0J6SixHQUFJO0tBQzlCLElBQUo0SSxNQUFNcXhCLFNBQVN4bEIsSUFBSXpVLEdBQUdtSTtLQUMxQixHQUFJUyxLQUFLLE9BQU9BO0tBQ2hCVDs7SUFHRjtHQUNGO0dFeEpBLFNBQVNpNkIsZUFBZ0J0L0IsS0FBS3UvQjtJQUM1QixHQUFJdi9CLFNBQVN5SztJQUNiLElBQUl6SyxNQUFNQSxhQUNOZSxRQUFRMEYsTUFBTXpHO0lBQ2xCZTtJQUNBLElBQVcsSUFBRjVCLE9BQU9BLElBQUlhLEtBQUtiLEtBQUs0QixFQUFFNUIsS0FBS29nQztJQUNyQyxPQUFPeCtCO0dBQ1Q7R2ZtUUEsU0FBU3krQixnQkFBZ0I3MEIsUUFBT3RGLEtBQzlCLE9BQU8yZSxhQUFhclosUUFBT3RGLEtBQzdCO0dQaktBLFNBQVNvNkIsd0JBQXdCcjlCO0lBQy9CO0tBQUlKLE9BQU9xRyxrQkFBa0JqRztLQUN6QnNCLElBQUkxQixvQkFBb0JBO0tBQ3hCNUUsUUFBUXFKLE1BQU0vQztJQUNsQnRHO0lBQ0EsSUFBUyxJQUFEK0IsT0FBSUEsSUFBRXVFLFVBQVN2RSxLQUNyQi9CLEVBQUUrQixTQUFPTyx1QkFBdUJnRSxFQUFFdkU7SUFDcEMsT0FBTy9CO0dBQ1Q7R08wUkEsU0FBU3NpQyxvQkFBcUIvMEIsUUFBT3pLO0lBQzdCLElBQUZoRCxJQUFJd0MsdUJBQXVCMEIsb0JBQW9CbEI7SUFDbkQwOEIsZUFBZWp5QixRQUFPek47SUFDdEI7R0FDRjtHZDVPQSxTQUFTeWlDLDhCQUFpQyxPQUFPMWhCLDJCQUE0QjtHcUI5TzdFLFNBQVMyaEIsa0JBQW1CN2lDLEdBQUssVUFBU0EsYUFBYTBKLE9BQVE7R0E0SC9ELFNBQVNvNUIsdUJBQXVCbDRCLEdBQUV4SSxHQUFFK0IsR0FBSyxPQUFPeUcsRUFBRXhJLFNBQU8rQixFQUFFO0duQjRFM0QsU0FBUzQrQixZQUFZL2lDO0lBQ2IsSUFBRkEsSUFBSXNFLHdCQUF3QnRFO0lBRWhDLEtBQUlBO0tBQ0ZpdEI7MEJBQWtDanRCOztJQUdwQyxPQUFPeWEsS0FBS3phO0dBQ2Q7R0VyRUEsU0FBU2dqQyxpQkFBaUJoakMsR0FDeEIsT0FBT08sV0FBV1AsR0FDcEI7RzRCY0EsU0FBU2lqQyxxQkFBcUJqakM7SUFDNUIsR0FBR2lDLG1DQUFtQ0E7S0FBb0IsR0FDckRqQyxnQkFBZ0JpQztNQUFnQyxJQUV2QyxJQUFGbUMsSUFBSW1kLHNCQUFzQm5kLElBQUlwRSxVQUFVb0UsSUFBSTtPQUMxQyxJQUFKc0csTUFBTTFLLEVBQUVvRTtPQUNaLEdBQUdzRyxlQUFlekksbUJBQW9CO1FBQ3BDeUksTUFBTUE7UUFDTixHQUFHQSxLQUFLMUssZ0JBQWdCMEs7OztJQUtoQzFLLEVBQUVzb0IseUJBQXlCcG1CO0lBQzNCO0dBQ0Y7R0FuQ0EsU0FBU2doQyxtQkFBbUJsakMsR0FBRzBJO0lBQzdCLEdBQUd6RyxtQ0FBbUNBO0tBQW9CLE1BQ2xEakMsZ0JBQWdCaUMsaUNBQWtDO01BQ3REakM7O1FBQVdpQztvQkFBOENnaEMscUJBQXFCampDLEdBQW5DO01BRTNDLElBQVUsSUFBRm9FLElBQUltZCxzQkFBc0JuZCxJQUFJcEUsVUFBVW9FLElBQUk7T0FDMUMsSUFBSnNHLE1BQU0xSyxFQUFFb0U7T0FDWixHQUFHc0csZUFBZXpJLG1CQUFvQjtRQUNwQ3lJLE1BQU1BO1FBQ04sR0FBR0EsS0FBSzFLLGNBQWMwSyxLQUFLeEksV0FBV3dJOzs7O0lBSzlDMUssRUFBRXNvQix5QkFBeUI1ZjtJQUMzQjtHQUNGO0dBNUNBLFNBQVN5NkIsb0JBQW9CNXBCLEtBQUtDO0lBQzFCLElBQUZ0WixJQUFJcVosSUFBSStPO0lBQ1osR0FBR3BvQixNQUFNZ0M7S0FBVytnQyxxQkFBcUJ6cEI7O0tBQ3BDMHBCLG1CQUFtQjFwQixLQUFLdFo7SUFDN0I7R0FDRjtHYjdJaUMsSUFBN0JrakMsK0JBQStCeHRCO0dwQmtNbkMsU0FBU3l0QixrQkFBa0JsZ0MsR0FBSyxVQUFTQSxVQUFVQSxTQUFVO0dGOFY3RCxTQUFTbWdDLHFCQUFxQng3QixJQUFJRTtJQUMvQkYsWUFBYWxCLDZCQUE2QmtCO0lBQzFDRSxZQUFhcEIsNkJBQTZCb0I7SUFDM0MsT0FBUUYsUUFBUUU7R0FDbEI7R0FrVkEsU0FBU3U3QixvQkFBb0J2akMsR0FBSyxPQUFPMEgsMEJBQTBCMUgsR0FBRztHMEJub0J0RSxTQUFTd2pDLFdBQVl4akMsR0FBR3dCLEdBQUssVUFBU3lWLGlCQUFpQmpYLEdBQUV3QixnQkFBZ0I7R0l3Q3pFLFNBQVNpaUMsaUJBQWlCN3VCLElBQUd6VSxHQUFFbUk7SUFDN0IsR0FBR0EsV0FBV0EsTUFBTXNCLHNCQUFzQnpKO0tBQ3hDMkM7SUFDTSxJQUFKaUcsTUFBTXF4QixTQUFTeGxCLElBQUl6VSxHQUFHbUk7SUFDMUIsT0FBSVMsTUFBWUE7R0FFbEI7RzNCNURBLFNBQVMyNkI7SUFDUCxHQUFHemhDO0tBQW1CLFVBQ1ZBLGlEQUFpRDtNQUVuRCxJQUFGMEUsUUFBUXdjO01BQ1psaEIsa0NBQWtDMEU7TUFDbEMsV0FBVUE7O2FBQ0YxRSw2Q0FBNkM7TUFFckQsSUFBSTBoQyxPQUFPMWhDLGtDQUNQMEUsUUFBUXdjLFlBQVl3Z0I7TUFDeEIsV0FBVWg5Qjs7SUFHZCxJQUFJaTlCLE1BQU0sSUFBSy9lLGtCQUNYN2tCLElBQUk0akMsbUJBQWVyakM7SUFDdkIsV0FBVVA7R0FDWjtHZXBNbUIsSUFBZjZqQyxxQkFBcUI1aEM7R0FDekIsU0FBUzZoQyx5Q0FBMENDLElBQUlwOUI7SUFDckQsR0FBRzFFLG1DQUFtQzBFLGFBQWEwaUIsT0FBUTtLQUNuRDtNQUFGcnBCOztTQUFRaUM7bUJBQTBDakMsR0FBRzZqQyxzQkFBc0I3akMsSUFBSStqQyxPQUFPLE9BQTlDO0tBQzVDL2pDLFdBQVcyRyxHQUFFM0c7S0FDYjZqQyxtQkFBbUI3akM7O0lBRXJCO0dBQ0Y7R0NrWEEsU0FBU2drQyxjQUFjNzFCLElBQUlDLElBQUlyRyxJQUM3QixPQUFPb0csT0FBT0EsV0FBV0MsSUFBR3JHLE1BQzlCO0dBZ0JBLFNBQVNrOEIsb0JBQW9COTFCLElBQUlDLElBQUlqSztJQUMzQixJQUFKa0ssTUFBTUYsVUFBVUM7SUFDcEIsR0FBR0MsV0FBV0YsZ0JBQWdCVDtJQUM5QlMsT0FBT0UsU0FBUWxLO0lBQ2ZnSyxPQUFPRSxTQUFRbEs7SUFDZjtHQUNGO0dLdlBBLFNBQVMrL0Isd0JBQXdCdDVCO0lBQy9CdUcsb0JBQW9Cdkc7SUFDcEI7R0FDRjtHbkJwTEEsU0FBU3U1QixlQUFldjVCLEdBQUUxSCxHQUFLLE9BQU8wSCxFQUFFMUgsSUFBSSxTQUFRO0dla0NwRCxTQUFTa2hDLG1CQUFvQmprQztJQUMzQjtLQUFJQyxJQUFJZ3JCLHlCQUEwQmpyQjtLQUM5QmlDLElBQUloQztLQUFNZSxPQUFPZjtLQUFNbWdCLE9BQU9uZ0I7S0FDOUI2QyxNQUFNMkcsc0JBQXNCeko7S0FDNUJxckI7S0FDQXJvQixJQUFLZixJQUFJYSxNQUFLNEcsdUJBQXVCMUosR0FBR2lDO0tBQ3hDd0QsSUFBSXlsQixpQkFBaUJsb0I7SUFDekIsR0FBSXlDLFNBQVNBLEtBQUsyYSxNQUFNcFY7SUFDaEIsSUFBSnBDLE1BQU1uRDtJQUNWLElBQUt4RCxLQUFJQSxJQUFFYSxLQUFJYixJQUFLO0tBQ2xCZSxJQUFJMEcsdUJBQXVCMUosR0FBR2lDO0tBQzlCLEdBQUllLFNBQVM7S0FDYnlDLElBQUl5bEIsaUJBQWlCbG9CO0tBQ3JCLEdBQUl5QyxTQUFTQSxLQUFLMmEsTUFBTTtLQUN4QnhYLE1BQU13WCxPQUFPeFgsTUFBTW5EO0tBQ25CLEdBQUltRCxNQUFNeWlCLFdBQVdyZ0I7O0lBRXZCLEdBQUkvSSxLQUFLYSxLQUFLa0k7SUFJZHBDLE1BQU01SCxPQUFPNEg7SUFDYixHQUFLd1gsZUFBaUJ4WCxZQUFZQSxLQUVoQ29DO0lBQ0YsT0FBT3BDO0dBQ1Q7R1Z3QkEsU0FBU3M3QjtJQUNFLElBQUxDO0lBQ0osSUFBVSxJQUFGbGlDLE9BQU9BLElBQUlpSix5QkFBeUJqSixJQUFJO0tBQ3RDLElBQUpnRyxNQUFNazhCO0tBQ1ZBLFdBQVczaEMsdUJBQXVCMEksaUJBQWlCakosVUFBVWdHOztJQUUvRCxPQUFPazhCO0dBQ1Q7R01yRzJCO0lBQXZCQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R1FvSUosU0FBU0MsbUJBQW1CNTVCLEdBQUV4SSxHQUFLLE9BQU93SSxFQUFFeEksT0FBSztHbkIyUGpELFNBQVNxaUMsZUFBZ0J6a0MsR0FBR3dCLEdBQUssVUFBU3hCLEtBQUt3QixHQUFJO0dtQnBUbkQsU0FBU2tqQywwQkFBMEIxa0MsR0FBRW9DLEdBQUVnRyxLQUFJbEk7SUFDekMsR0FBR0YsRUFBRW9DLFVBQVFnRyxJQUFLLENBQ2hCcEksRUFBRW9DLFNBQU9sQyxHQUNUO0lBRUY7R0FDRjtHSXZGQSxTQUFTeWtDLHlCQUF5QnZtQixJQUNoQyxPQUFPQSxRQUNUO0dkeVBBLFNBQVN3bUIsZ0JBQWdCbG9CLEtBQUltb0IsSUFBR0MsSUFBR0MsSUFBR0MsSUFBR3ZuQixJQUFHQztJQUMxQyxNQUFNRCxLQUFHQyxJQUFJQTtJQUNiRDtJQUNBQztJQUNBO0tBQUl1bkI7S0FBUUM7S0FBS0M7S0FBS0M7S0FBVUM7S0FDNUJDO0tBQ0E3dUIsT0FBU2lILEtBQUtELE1BQU1sZCxZQUFZeWtDLEtBQUdELFdBQVVPO0tBQzdDQyxTQUFTN25CLEtBQUtELE1BQU1sZCxVQUFVa1c7S0FDOUJyVSxJQUFJcWIsS0FBS2xkO0lBQ2IsSUFBVSxJQUFENkQsT0FBSUEsS0FBR3FTLEtBQUlyUyxJQUFJO0tBQ3RCOGdDO01BQU9MLEtBQU1HLEtBQUt6a0MsU0FBUzZCLEtBQU03QixTQUFTMGtDLE1BQU0xa0M7UUFBWXdrQyxLQUFLeGtDLFNBQVM2QixLQUFNN0IsU0FBUzBrQyxNQUFNMWtDO0tBQy9GMmtDLE9BQU9BO0tBQ1BDO01BQU9MLEtBQU1DLEtBQUt4a0MsU0FBUzZCLEtBQU03QixTQUFTMGtDLE1BQU0xa0M7UUFBWXlrQyxLQUFLemtDLFNBQVM2QixLQUFNN0IsU0FBUzBrQyxNQUFNMWtDO0tBQy9GNGtDLE9BQU9BO0tBQ1AsR0FBSS9nQztNQUNGc1ksV0FBV3dvQixNQUFNQzthQUNSQyxhQUFXRixRQUFRRyxhQUFXRixNQUN2Q3pvQixXQUFXd29CLE1BQU1DO0tBRW5CQyxZQUFVRjtLQUNWRyxZQUFVRjtLQUNWL2lDLEtBQUltakM7O0lBRU47R0FDRjtHQTRDQSxTQUFTQyxpQkFBaUJ4bEMsR0FBRXdCLEdBQUV3akMsSUFBR0QsSUFBR3RuQixJQUFHQztJQUMvQixJQUFGdmQsSUFBSWdNO0lBQ1JoTTtJQUNBeWtDLGdCQUFnQnprQyxXQUFVSCxHQUFFRyxXQUFXcUIsR0FBRXdqQyxJQUFHRCxJQUFHdG5CLElBQUdDO0lBQ2xEdmQ7SUFDQTtHQUNGO0dLOE1BLFNBQVNzbEMsY0FBY3QzQixJQUFJOE07SUFDekJBLE9BQU9GLG1CQUFtQkU7SUFDMUIsSUFBSXlxQixXQUFXenFCLGFBQ1h1TCxZQUNBbWYsZUFDQXQzQjtJQUVKLEdBQUlxM0IsV0FBV3YzQjtLQUNickw7SUFHRixHQUFJcUwsZUFBZ0I7S0FDbEIsSUFBVyxJQUFGL0wsT0FBT0EsSUFBSXNqQyxVQUFVdGpDLEtBQzVCb2tCLE1BQU1wa0IsS0FBSzZZLEtBQUs3WTtLQUNsQixNQUFPQSxJQUFJK0wsZ0JBQWdCL0wsS0FDekJva0IsTUFBTXBrQjtLQUNSdWpDLFdBQVd4M0IsY0FBY3UzQjs7UUFDcEI7S0FDTCxJQUFXLElBQUZ0akMsT0FBT0EsSUFBSXNqQyxVQUFVdGpDO01BQzVCb2tCLE1BQU1yWSxpQkFBaUJ1M0IsV0FBV3RqQyxLQUFLNlksS0FBSzdZO0tBQzlDLElBQVcsSUFBRkEsT0FBT0EsSUFBSStMLGlCQUFpQnUzQixVQUFVdGpDLEtBQzdDb2tCLE1BQU1wa0I7S0FDUnVqQyxXQUFXeDNCLGlCQUFpQkEsaUJBQWlCdTNCOztJQUUvQ3IzQixNQUFNRixVQUFVcVk7SUFDaEI7S0FBSTlTLE9BQU9TLGlCQUFpQnd4QjtLQUN4Qnp3QixtQkFBbUIzQiw2QkFBNkJwRjtLQUNoRGd1QjtPQUFXaHVCO1NBQWlCRSxNQUFNNkcsbUJBQW1CN0csTUFBTXFGLFFBQVF3QjtJQUN2RSxPQUFPRCxzQkFBc0I5RyxTQUFTQSxXQUFXdzNCLFVBQVV4SjtHQUM3RDtHZDdPQSxTQUFTeUosNkJBQTZCMWlDO0lBQ3BDO0tBQ0UsSUFBSUQsTUFBTSs2Qix1QkFBdUI5NkIsSUFDN0JtRCxXQUFXcUQsTUFBTXpHO0tBQ3JCLElBQVcsSUFBRmIsT0FBT0EsSUFBSWEsS0FBS2IsS0FBS2lFLEtBQUtqRSxLQUFLd08sVUFBVXhPO0tBQ2xELE9BQU95TyxjQUFjM04sR0FBR21ELE1BSm5CO0dBS1Q7R2NQQSxTQUFTdy9CLGFBQWExM0IsSUFDcEIsT0FBT0EsUUFDVDtHS3hUQSxTQUFTMjNCO0lBQ1AsZ0JBQWdCNWlDLEVBQUdsRCxHQUFLLE9BQU91USxjQUFjck4sUUFBUWxELElBQTlDO0dBQ1Q7R25CeU5BLFNBQVMrbEMsaUJBQWlCN2lDLEdBQUd5RDtJQUMzQixPQUFRQTs7T0FDQSxPQUFPekQ7O09BQ1AsT0FBT0EsRUFBR3lEOztPQUNWLE9BQU96RCxFQUFHeUQsTUFBS0E7O09BQ2YsT0FBT3pELEVBQUd5RCxNQUFLQSxNQUFLQTs7T0FDcEIsT0FBT3pELEVBQUd5RCxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDekIsT0FBT3pELEVBQUd5RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDOUIsT0FBT3pELEVBQUd5RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDbkMsT0FBT3pELEVBQUd5RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7SUFFaEQsT0FBT3pELFFBQVFrRCxNQUFNMlUsbUJBQW1CcFU7R0FDMUM7R2E1S0EsU0FBU3EvQixvQkFBb0JDLE1BQVEsU0FBVTtHYjlEL0MsU0FBU0Msa0JBQW1CaGpDLEdBQUssT0FBTzJOLGNBQWMzTixRQUFTO0dRb1UvRCxTQUFTaWpDLG1CQUFtQng2QixNQUFNQyxNQUFNRSxNQUFNQztJQUM1QyxHQUFHSixVQUFVQyxRQUFRRSxVQUFVQyxPQUFPO0lBQ3RDLEdBQUdKLFVBQVVDLFFBQVFFLFVBQVVDLE9BQU87SUFDdEM7R0FDRjtHSTFHQSxTQUFTcTZCLGNBQWV4NEIsUUFBUTVKLEdBQUc1QixHQUFHL0I7SUFDN0IsSUFBSDhOLEtBQUt6RywwQkFBMEIxRDtJQUNuQyxPQUFPcTdCLG9CQUFvQnp4QixRQUFRTyxJQUFJL0wsR0FBRy9CO0dBQzVDO0dINE9BLFNBQVNnbUMsbUJBQW1CQztJQUMxQm43Qjs7R0FDRjtHQVBBLFNBQVNvN0Isd0JBQXdCLFNBQVE7R2MzZHpDLFNBQVNDLHdCQUF3QnRsQyxHQUFHa2Q7SUFDbEMsT0FBTzBGLHdCQUF3QjVpQixHQUFFa2Q7R0FDbkM7R3hCeUNBLFNBQVNxb0Isc0JBQXVCemlDO0lBQUs3Qiw2QkFBNkI2QjtJQUFHO0dBQVU7R09VL0UsU0FBUzBpQyxvQkFBcUI7R1J1TzlCLFNBQVNDO0lBQ1AsV0FBV2hrQyx1QkFBdUJ1ZTtHQUNwQztHQWRBLFNBQVMwbEI7SUFDUCxXQUFXamtDO0dBQ2I7R3FCOUtBLFNBQVNra0MsbUJBQW1CN21DLEdBQzFCLFNBQ0Y7R1BKQSxTQUFTOG1DO0lBQ0QsSUFBRnptQztJQUNKLElBQVUsSUFBRjhDLE9BQU9BLElBQUlpSyx5QkFBeUJqSztLQUFJO09BQzNDaUssaUJBQWlCakssTUFBTWlLLGlCQUFpQmpLO1VBQWFpSyxpQkFBaUJqSztNQUN2RTlDLFFBQUsrTSxpQkFBaUJqSyxPQUFNOUM7SUFFaEMsT0FBT0E7R0FDVDtHVitLQSxTQUFTMG1DLGlCQUFrQi9tQyxHQUFLLE9BQU9PLFdBQVdQLEdBQUk7R1UrUHRELFNBQVNnbkMsYUFBYXA1QjtJQUNYLElBQUxOLE9BQU9GLGlCQUFpQlE7SUFDNUIsT0FBT04sY0FBY0E7R0FDdkI7R1cxZ0JBLFNBQVMyNUIsMEJBQTBCalk7SUFDMUIsSUFBSHVPLFNBQVNuMkIsV0FBVzRuQjtJQUN4QixPQUFPL1osOEJBQThCc29CLFlBQVlBO0dBQ25EO0dSbUZBLFNBQVMySixTQUFTbG5DLEdBQUV3QixHQUNsQixHQUFJQSxRQUFRYiwwQkFDWixPQUFPWCxJQUFFd0IsRUFDWDtHRGxGQSxTQUFTMmxDLGVBQ1AsU0FDRjtHUmdDQSxTQUFTQywwQkFBMEJwbkMsR0FBSSxPQUFPQSxFQUFFO0dtQnNOaEQsU0FBU3FuQyxnQkFBZ0J6eUIsSUFBR3pVLEdBQUVtSTtJQUM1QixHQUFHQSxXQUFXQSxNQUFNc0Isc0JBQXNCeko7S0FDeEMyQztJQUNNLElBQUppRyxNQUFNcXhCLFNBQVN4bEIsSUFBSXpVLEdBQUdtSTtJQUMxQixPQUFJUyxNQUFZQTtHQUVsQjtHZGhKQSxTQUFTdStCLGdCQUFpQmxwQixJQUFJaGMsR0FBS3BCLFNBQVNvZCxJQUFJcGQsU0FBU29CLEVBQUc7R0FDNURrbEM7d0JBQ3VCLE9BQU9qcUIsY0FBY3JjLFFBQU9BLFVBQTFDO3dCQUNjLE9BQU9xYyxjQUFjcmMsUUFBT0Esc0JBQTFDOzs7TUFFTCxJQUFJYixJQUFJYSxRQUFRb0IsSUFBSXBCO01BQ3BCQSxTQUFTb0I7TUFDVCxPQUFRaWIsY0FBY2xkLEdBQUVpQyxVQUFXaWIsY0FBY2xkLEdBQUVpQztLQUg3Qzs7O01BTU4sSUFBSWpDLElBQUlhLFFBQVFvQixJQUFJcEI7TUFDcEJBLFNBQVNvQjtNQUNULE9BQVFpYixjQUFjbGQsR0FBRWlDLGlCQUFrQmliLGNBQWNsZCxHQUFFaUM7S0FIcEQ7OztNQU1OLElBQUlqQyxJQUFJYSxRQUFRb0IsSUFBSXBCO01BQ3BCQSxTQUFTb0I7TUFDVCxRQUFTaWIsY0FBY2xkLEdBQUVpQyxXQUFlaWIsY0FBY2xkLEdBQUVpQztlQUMvQ2liLGNBQWNsZCxHQUFFaUM7ZUFBY2liLGNBQWNsZCxHQUFFaUM7O0tBSmpEOzs7TUFPTixJQUFJakMsSUFBSWEsUUFBUW9CLElBQUlwQjtNQUNwQkEsU0FBU29CO01BQ1QsT0FBUWliLGNBQWNsZCxHQUFFaUMsV0FBZWliLGNBQWNsZCxHQUFFaUM7ZUFDcERpYixjQUFjbGQsR0FBRWlDO2VBQWNpYixjQUFjbGQsR0FBRWlDO0tBSjNDOztjQU1VYTtNQUNoQixJQUFJYixJQUFJcEIsUUFDSmtYLFVBQVV4TyxNQUFNekc7TUFDcEIsSUFBVSxJQUFGbUIsT0FBT0EsSUFBSW5CLEtBQUttQixLQUN0QjhULElBQUk5VCxLQUFLaVosY0FBY3JjLFFBQVFvQixJQUFFZ0M7TUFFbkNwRCxTQUFTb0IsSUFBSWE7TUFDYixPQUFPMHFCLHFCQUFxQnpWO0tBUHRCOztjQVNpQmpWO01BQ3ZCLElBQUliLElBQUlwQixRQUNKSSxTQUFTSixZQUFZb0I7TUFDekJwQixTQUFTb0IsSUFBSWE7TUFDYixPQUFPakMscUJBQXFCSSxRQUFRQSxTQUFTNkI7S0FKaEM7R0Y2UGpCLFNBQVNza0MsbUJBQW1CbDdCO0lBQ2pCLElBQUwzRDtJQUNKLElBQVMsSUFBRHRHLE9BQUtBLElBQUVpSyxXQUFVakssSUFBSTtLQUMzQnNHLEtBQUt0RztLQUNMLElBQVMsSUFBRGdDLE9BQUtBLElBQUVpSSxVQUFTakksSUFBSTtNQUMxQjtPQUFJd0csSUFBSXhJLEtBQUdpSyxnQkFBZWpJO09BQ3RCaEUsSUFBSWlNLFFBQVF6QjtPQUNaNkYsSUFBSXBFLFFBQVF6QjtPQUNaNUcsSUFBSXFJLFFBQVF6QjtNQUNoQmxDLEtBQUt0RyxPQUFLZ0MsVUFBUWhFLFlBQVlxUSxVQUFVek07OztJQUc1QyxPQUFPMEU7R0FDVDtHSzVEQSxTQUFTOCtCLG9CQUFvQnI1QixJQUFJL0w7SUFDdkIsSUFBSmlNLE1BQU1GLFVBQVU0TSxtQkFBbUIzWTtJQUN2QyxPQUFPK0wsT0FBT0U7R0FDaEI7R1J4VUEsU0FBU281QixvQkFBcUI7R1BYOUIsU0FBU0MsK0JBQWtDLFNBQVU7R0dnWXJELFNBQVNDLGtCQUFtQjNrQyxLQUFLaEQ7SUFDL0IsU0FBUzRuQyxRQUFRNW5DLEdBQUU2bkM7S0FDakIsR0FBSXRuQyxTQUFTUDtNQUFVLE9BQ2RBLFVBQVU2bkM7U0FDWjtNQUNDLElBQUZ6NEIsSUFBSTJiLFNBQVMvcUI7TUFDakIsR0FBSW9QLE9BQVE7T0FDVkE7T0FDQXBQLEtBQUtPLGFBQVk2TztPQUNqQnBQLEtBQUssSUFBSzBKLE1BQU0wRjtPQUNoQixHQUFHeTRCLFFBQ0Q3bkMsSUFBSUEsVUFBVSxJQUFLMEosTUFBTW0rQjtPQUUzQixPQUFPN25DOzs7T0FFSixPQUFPQSxVQUFVNm5DOztJQUUxQjtJQUNBLElBQUkxbkMsR0FBRytDLElBQUlILGtCQUFrQkMsTUFDekI4a0MsT0FBUTVrQyxpQkFBY0E7SUFDMUIsR0FBSWxELFNBQVVBLGNBQVlBLE9BQU11UyxTQUFXLENBQUVyUCxjQUFhbEQsTUFBS0E7SUFDL0QsR0FBSW1OLE1BQU1uTixHQUFJO0tBQUVHO0tBQVcrQzs7Y0FDakJnSyxTQUFTbE4sR0FBSTtLQUFFRztLQUFXK0M7OztLQUVsQyxPQUFRQTs7UUFFTixJQUFJL0MsSUFBSUgsZ0JBQWdCOG5DLE9BRXBCMWxDLElBQUlqQztRQUNSLEdBQUlBLFNBQVNpQztTQUNYakMsSUFBSUEsV0FBWWlDLGVBQWVqQyxRQUFTaUM7UUFDMUM7O1FBRUFqQyxJQUFJeW5DLFFBQVE1bkMsR0FBRzhuQyxPQUFPOztRQUV0QkEsT0FBT0EsT0FBS0E7UUFDWjNuQyxJQUFJSCxnQkFBZ0I4bkM7UUFDcEIsSUFBSTFqQyxJQUFJakUsZ0JBQ0o0UyxRQUFPNVMsUUFBUWlFO1FBQ25CLEdBQUkyTyxhQUFZL1MsYUFBYUEsc0JBQXNCOG5DLEtBQU07U0FFakQsSUFBRjFsQyxJQUFJZ0M7U0FBTyxNQUFPakUsU0FBU2lDLFdBQVdBO1NBQzFDLEdBQUlqQyxTQUFTaUMsV0FBV0E7U0FDeEJqQyxJQUFJQSxXQUFXaUMsU0FBU2pDLFFBQVFpRTtTQUNoQ2hDLElBQUlqQztTQUNKLEdBQUlBLFNBQVNpQztVQUNYakMsSUFBSUEsV0FBWWlDLGVBQWVqQyxRQUFTaUM7U0FDMUM7O1lBQ0s7U0FDQyxJQUFGc0IsSUFBSW9rQztTQUNSLEdBQUkvMEIsUUFBUztVQUFFclAsS0FBS3FQO1VBQVM1UyxJQUFJSCxVQUFVMEQ7OztVQUN0QyxNQUFPdkQsSUFBSUgsVUFBVTBELElBQUl2RCxXQUFXMm5DLFVBQVVwa0M7U0FDbkQsR0FBSUEsRUFBRztVQUVDLElBQUZ0QixJQUFJakM7VUFBYyxNQUFPQSxTQUFTaUMsV0FBV0E7VUFDakQsR0FBSWpDLFNBQVNpQyxXQUFXQTtVQUN4QmpDLElBQUlBLFdBQVdpQzs7O1FBR25COztJQUVKLE9BQU9nQix1QkFBdUJGLEdBQUcvQztHQUNuQztHR2xWQSxTQUFTNG5DLG9CQUFvQjFpQyxNQUFLbkM7SUFDaEM7S0FBSXdCLE9BQU9hLGVBQWVGO0tBQ3RCQSxPQUFPRCxvQkFBb0JWO0lBQy9CMkcsNkJBQTRCaEcsa0JBQWdCeUQsYUFBYXpELE1BQUtuQztJQUM5RDtHQUNGO0d1QjVIQSxTQUFTOGtDLHNCQUFzQmhvQyxHQUFLLE9BQU84Z0Isd0JBQXdCOWdCLEdBQUk7R2pDZ3BCdkUsU0FBU2lvQyxxQkFBcUJuZ0MsSUFBSUUsSUFDaEMsT0FBUUYsS0FBS0UsV0FDZjtHQXBIQSxTQUFTa2dDLHdCQUF3QnBnQyxJQUFJRSxJQUNuQyxPQUFPaWdDLHFCQUFxQmpnQyxJQUFJRjtHQUNsQztHb0I1ZEEsU0FBU3FnQyxTQUFTbm9DLEdBQUV3QjtJQUNsQixHQUFJQSxRQUFRYjtJQUNaLE9BQVFYLElBQUV3QjtHQUNaO0dJL0JBLFNBQVM0bUMsYUFBY3BvQztJQUNyQixJQUFJSyxJQUFJTCxVQUNKMkcsUUFBUStDLE1BQU1ySjtJQUNsQixJQUFVLElBQUYrQixPQUFPQSxJQUFJL0IsR0FBRytCLEtBQU11RSxFQUFFdkUsS0FBS3BDLEVBQUVvQztJQUNyQyxPQUFPdUU7R0FDVDtHV2lGQSxTQUFTMGhDLHdCQUF3QnJvQztJQUMvQixPQUFHQSxFQUFFc29CLDJCQUEyQnBtQjs7a0JBR25Ca21DLGFBQWFwb0MsRUFBRXNvQjtHQUM5QjtHakJoR0EsU0FBU2dnQixtQkFBbUJDLE1BQUtDLFlBQVdDLFNBQzFDLFNBQ0Y7R2ZxR0EsU0FBU0Msa0JBQW1CL2hDLEdBQzFCLFdBQVd3VCxjQUFjQSxXQUMzQjtHc0J2SEEsU0FBU3d1Qix3QkFBd0JDLE9BQy9CLFNBQ0Y7R3BCeUlBLFNBQVNDLGdCQUFnQjdvQyxHQUFLLFNBQVFBLEVBQUc7R1M4UXpDLFNBQVM4b0MscUJBQXFCOW9DLEdBQUV3QjtJQUN4QixJQUFGckIsSUFBSWdNO0lBQ1IsT0FBT2hNLDBCQUEwQkgsR0FBRXdCO0dBQ3JDO0dxQjFXQSxTQUFTdW5DLHVCQUF1Qi9vQyxHQUFHb0M7SUFDakMsR0FBR0EsU0FBU21mLHVCQUF1Qm5mLEtBQUtwQztLQUN0QzhDO0lBQ0ksSUFBRnRCLElBQUltakIsa0JBQWtCM2tCLEdBQUdvQztJQUM3QixHQUFJWixTQUFTLE9BQU9BO0lBQ2QsSUFBRitWLElBQUkvVjtJQUNSLEdBQUkrVixhQUFhN04sT0FBTyxXQUFXMCtCLGFBQWE3d0I7SUFDaEQsT0FBTy9WO0dBQ1Q7R1RzSkEsU0FBU3duQyxjQUFlaHBDLEdBQUd3QixHQUFLLFVBQVN5VixpQkFBaUJqWCxHQUFFd0IsZUFBZTtHdEIvTTNFLFNBQVN5bkMsK0JBQWlDLFNBQVM7R0YrRm5ELFNBQVNDLG1CQUFtQkM7SUFDMUIsSUFBSUM7SUFDSixNQUFNRDtLQUFLLEdBQ043a0Msd0JBQXdCNmtDLHFCQUFzQixDQUMvQ0MsT0FBT0QsV0FDUDs7TUFFR0EsTUFBTUE7SUFFUCxJQUFGL29DO0lBQ0osR0FBR2dwQztLQUFNLElBQ0csSUFBRmhuQyxPQUFPQSxJQUFJZ25DLGFBQWFobkM7TUFDOUJoQyxFQUFFa0Usd0JBQXdCOGtDLEtBQUtobkMsVUFBVWduQyxLQUFLaG5DO0lBR2xELE9BQU9oQztHQUNUO0dBS0EsU0FBU2lwQyxxQkFBc0JucEMsR0FBR2lFLEdBQUdtbEM7SUFDbkMsR0FBSUEsU0FBVTtLQUNILElBQUxqa0MsT0FBT2lrQztLQUNYLEdBQUdybkM7TUFDRC9CLElBQUkyUSxjQUFjNU8sMkJBQTJCb0Q7YUFFdEMzRSxxQkFBc0I7TUFDN0IsS0FBSUE7T0FDRkEsMkJBQTJCd29DLG1CQUFtQnhvQztNQUV4QyxJQUFKNm9DLE1BQU03b0MseUJBQXlCMkU7TUFDbkMsR0FBR2trQztPQUNEcnBDLElBQUlxcEM7O09BRUpwK0IsdURBQXVEOUY7OztJQUk3RDNFLGlCQUFpQlIsU0FBU2lFO0lBQzFCLEdBQUdtbEMsVUFBVTVvQyxpQkFBaUI0b0MsWUFBWW5sQztHQUM1QztHV3VDQSxTQUFTcWxDLFNBQVM3OUIsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTUMsTUFBTXlNLE1BQU1HLE1BQU1DLE1BQU02d0I7SUFDdEQsSUFBTm54QjtJQUNKLElBQVUsSUFBRmxXLE9BQU9BLElBQUlxbkMsTUFBTXJuQztLQUN2QmtXO01BQVNJO1FBQWUvTSxNQUFNQyxPQUFLeEosR0FBR3lKLE9BQUt6SixHQUFHMEosTUFBTUMsTUFBTXlNLE1BQU1HLE1BQU1DLE9BQUt4VztJQUU3RSxPQUFPa1c7R0FDVDtHQU1BLFNBQVNveEIsV0FBVy85QixNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQyxNQUFNeU07SUFDdEMsSUFBTkY7SUFDSkEsU0FBU0MsUUFBUTVNLE1BQU1DLE1BQU1DLE1BQU1GLE1BQU1DLE1BQU1DO0lBQy9DeU0sU0FBU2t4QixTQUFTNzlCLE1BQU1DLE1BQU1DLE1BQU1DLE1BQU1DLE1BQU15TSxNQUFNMU0sTUFBTUMsTUFBTXlNO0lBQ2xFLE9BQU9GO0dBQ1Q7R1JwREEsU0FBU3F4QixtQkFBbUIzcEMsR0FBSyxPQUFPQSxFQUFHO0cyQnBFM0MsU0FBUzRwQyx1QkFBdUIzbUM7SUFDOUIsR0FBSUEsU0FBU3lLO0lBQ2IsSUFBSXpLLE1BQU1BLGFBQ05lLFFBQVEwRixNQUFNekc7SUFDbEJlO0lBQ0EsSUFBVyxJQUFGNUIsT0FBT0EsSUFBSWEsS0FBS2IsS0FBSzRCLEVBQUU1QjtJQUNoQyxPQUFPNEI7R0FDVDtHZHZHQSxTQUFTNmxDO0lBQ1A7R0FDRjtHQWtFQSxTQUFTQyxzQkFBc0I1cEMsR0FBSyxTQUFVO0dmb0Y5QyxTQUFTNnBDLHFCQUFxQnJuQyxLQUM1QnlYLFlBQVl6WCxLQUNaLFNBQ0Y7R3FCdkVzQixJQUFsQnNuQztHQUNKLFNBQVNDLHVCQUF3QjVsQixLQUFLNWpCLEtBQUt5cEM7SUFDekMsSUFBSUMsUUFBUTlsQixRQUNSaFcsTUFBTTI3QixrQkFBa0JFO0lBQzVCLEdBQUk3N0IsUUFBUW5NO0tBQVcsSUFFVixJQUFGRSxJQUFJNG5DLDBCQUEwQjVuQyxJQUFJOG5DLFNBQVM5bkM7TUFDbEQ0bkMsa0JBQWtCNW5DO1lBQ1grbkMsTUFBTTk3QixTQUFTNU4sS0FBSyxPQUN0QjBwQyxNQUFNOTdCO0lBRWYsSUFBSSs3QixRQUFRcnBDLEtBQUtvcEMsa0JBQWtCcnBDO0lBQ25DLE1BQU9zcEMsS0FBS3JwQyxHQUFJO0tBQ2RELEtBQU9zcEMsS0FBR3JwQztLQUNWLEdBQUlOLE1BQU0wcEMsTUFBTXJwQyxTQUFPQyxLQUFLRCxhQUN2QnNwQyxLQUFLdHBDOztJQUVaa3BDLGtCQUFrQkUsV0FBV0U7SUFFN0IsT0FBUTNwQyxPQUFPMHBDLE1BQU1DLFVBQVFELE1BQU1DO0dBQ3JDO0dHOUVBLFNBQVNDO0lBQ1A7S0FBSWxuQyxJQUFJOHBCO0tBQ0oxakI7Ozs7Ozs7Ozs7Ozs7OztJQUVKLFNBQVNyRyxJQUFNO0lBQ2YsSUFBVyxJQUFGZCxPQUFPQSxJQUFJbUgsVUFBVW5ILEtBQUssS0FBS2UsRUFBRW9HLEVBQUVuSCxLQUFLZSxFQUFFb0csRUFBRW5ILE1BQUljO0lBQ3pELE9BQU9DO0dBQ1Q7R3hCMEVBLFNBQVNtbkMsdUJBQXVCamxDLE1BQzlCLE9BQU9vRyxnQkFBaUJwRyxNQUMxQjtHY0FBLFNBQVNrbEMsMkJBQTRCcGdDO0lBQzFCLElBQUx2QixPQUFPNGMsYUFBYXJiO0lBQ3hCLEdBQUd2QixtQkFBbUJyQiw2QkFBNEI0QztJQUNsRDtLQUFJcWdDLFNBQVNwa0M7S0FDVHFrQztjQUNHN2hDO2dCQUNFQSxvQkFBa0JBO1lBQ3RCdUI7Ozs7O29CQUtRL0M7Z0JBQ0pvakM7SUFFVHA5QixpQkFBaUJxOUIsY0FBWUE7SUFDN0IsT0FBT0E7R0FDVDtHV2hJQSxTQUFTQyx5QkFBeUJ2OEI7SUFDekI7S0FBSG92Qjs7UUFBU24yQjtTQUFXK0csV0FBV0EsZUFBZUEsWUFBWUE7SUFDOUQsT0FBTzhHLDhCQUE4QnNvQixZQUFZQTtHQUNuRDtHckJvUUEsU0FBU29OLGlCQUFrQjNxQyxHQUFLLE9BQU9PLFdBQVdQLEdBQUk7R0ZQdEQsU0FBUzRxQyxpQkFBaUJ6bkMsR0FBR3dEO0lBQzNCLE9BQVFBOztPQUNBLFdBQVd4RDs7T0FDWCxXQUFXQSxFQUFHd0Q7O09BQ2QsV0FBV3hELEVBQUd3RCxNQUFLQTs7T0FDbkIsV0FBV3hELEVBQUd3RCxNQUFLQSxNQUFLQTs7T0FDeEIsV0FBV3hELEVBQUd3RCxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDN0IsV0FBV3hELEVBQUd3RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDbEMsV0FBV3hELEVBQUd3RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7T0FDdkMsV0FBV3hELEVBQUd3RCxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQSxNQUFLQTs7SUFFcEQsU0FBU2trQyxJQUFNLE9BQU8xbkMsUUFBUW5DLE1BQU0yRixHQUFJO0lBQ3hDa2tDLGNBQWMxbkM7SUFDZCxXQUFXMG5DO0dBQ2I7R1F6SUEsU0FBU0MsZUFBZXo2QixLQUFLaEMsS0FBS3BMO0lBQ2hDLElBQVUsSUFBRmIsT0FBT0EsSUFBSWEsS0FBS2I7S0FDdEJpTyxTQUFTaEMsTUFBSWpNLG9CQUFtQmlPLFNBQVNoQyxNQUFJak07R0FFakQ7R1luS29CLElBQWhCMm9DO0dBSUosU0FBU0Msb0JBQW9CcmtDLEdBQzNCb2tDLGtCQUFrQnBrQyxFQUNwQjtHRCtNQSxTQUFTc2tDLHNCQUFzQnJnQztJQUM3QixPQUFRcUcsYUFBYXJHLFlBQVdBLE9BQUtBO0dBQ3ZDO0dHM0xvQixJQUFoQnNnQztHQUNKLFNBQVNDLG9CQUFxQmhyQztJQUM1QixLQUFLK3FDLHlCQUF5Qi9xQyxJQUFJLE9BQU9BO0lBQ3pDLE9BQU9BLFVBQVUrcUM7Y0FDTkE7YUFDQUE7R0FDYjtHUjJVQSxTQUFTRSxjQUFjajlCLElBQ3JCLE9BQU9nYSxZQUFZaGEsT0FDckI7R2RWQSxTQUFTazlCLHFDQUFxQ25vQztJQUM1QztLQUNFLElBQUlELE1BQU0yTixrQkFDTnZLLFdBQVdxRCxNQUFNekc7S0FDckIsSUFBVyxJQUFGYixPQUFPQSxJQUFJYSxLQUFLYixLQUFLaUUsS0FBS2pFLEtBQUt3TyxVQUFVeE87S0FDbEQsT0FBT3lPLGNBQWMzTixJQUFHbEMsTUFBS3FGLE9BSnhCO0dBTVQ7R0VuRkEsU0FBU2lsQyxnQkFBaUJ0ckMsR0FBSyxPQUFPTyxVQUFVUCxHQUFJO0dBN0VwRCxTQUFTdXJDLGlCQUFrQnZyQyxHQUFFK1M7SUFDM0JBO0lBQ0EsR0FBSUEsV0FBWTtLQUNkQTtLQUNBL1MsS0FBS087S0FDTCxHQUFJd1MsV0FBWSxDQUNkQSxhQUNBL1MsS0FBS087O0lBR1QsR0FBSXdTLGFBQWEsQ0FDZkEsYUFDQS9TLEtBQUtPO0lBRVBQLEtBQUtPLFlBQVl3UztJQUNqQixPQUFPL1M7R0FDVDtHTzVMQSxTQUFTd3JDLGtCQUFrQjl1QjtJQUN6QnhRLGdCQUFjd1E7SUFDZDJnQjtJQUNBO0dBQ0Y7R1RpU0EsU0FBU29PLDZCQUE2QkMsT0FBT3hvQztJQUMzQztLQUNFO01BQUloRCxJQUFJMFE7TUFDSnZLLFdBQVdxRCxNQUFNZ2lDO01BQ2pCem9DLE1BQU0xQyxTQUFTcVEsa0JBQWtCODZCO0tBQ3JDLElBQVcsSUFBRnRwQyxPQUFPQSxJQUFJYSxLQUFLYixLQUFLaUUsS0FBS2pFLEtBQUt3TyxVQUFVeE87S0FDbEQsT0FBT3lPLGNBQWMzTixHQUFHbUQsTUFMbkI7R0FPVDtHYXRQQSxTQUFTc2xDLG9CQUFvQjU5QixNQUFRLFNBQVU7R2QxQi9DLFNBQVM2OUIsNkJBQWdDLFdBQVk7R1N3VHJELFNBQVNDLGVBQWVsZ0MsTUFBTUMsTUFBTUUsTUFBTUMsTUFDeENKLFVBQVVDLFNBQVNFLFVBQVVDLE9BQzdCO0dBQ0Y7R2RwSEEsU0FBUysvQixlQUFnQjlyQyxHQUFHd0IsR0FBSyxPQUFPeEIsTUFBTXdCLEdBQUc7R3lCak5qRCxTQUFTdXFDLGlCQUFrQi9yQyxHQUFHUyxLQUFPVCxPQUFPUyxLQUFLLFNBQVU7R0ppRTNELFNBQVN1ckMsaUJBQWlCaHNDO0lBQ3hCLFFBQVVBLHlCQUNBQTtjQUNBQTtjQUNBQTtHQUNaO0dEaVhBLFNBQVNpc0MsY0FBYzk5QixJQUFJQyxJQUFJckcsSUFBSUUsSUFBSTlEO0lBQ3JDZ0ssT0FBT0EsV0FBV0MsSUFBR3JHLElBQUdFLE1BQU05RDtJQUM5QjtHQUNGO0dkN2NBLFNBQVMrbkMsbUJBQW1CdGhDLEdBQUV6SCxHQUFLLE9BQVF5SCxhQUFhekgsVUFBWTtHYTZEcEUsU0FBU2dwQyxzQkFBc0Jqc0MsR0FBSyxTQUFVO0dMWDlDLFNBQVNrc0MscUJBQXFCLzdCLEtBQUtoQyxLQUNqQyxPQUFPZ0MsU0FBU2hDLEtBQ2xCO0dBUkEsU0FBU2crQixxQkFBcUJoOEIsS0FBS2hDLEtBQUtpK0IsT0FDdENqOEIsU0FBU2hDLE9BQU9pK0IsT0FDaEI7R0FDRjtHYjZTQSxTQUFTQyxrQkFBa0Jwc0MsR0FBRWlDLEdBQUU0YyxLQUM3QjdULG1DQUNGO0djMVJBLFNBQVNxaEMscUJBQXFCQyxRQUFPNzhCLEdBQUUxTztJQUN6QixJQUFSd3JDLFVBQVVEO0lBQ2QsaUJBQ1dDO29CQUNBRDs7O21CQUdENzhCO29CQUNDMU87O2tCQUVGeUI7OzttQkFHQ0E7R0FFWjtHQWtMQSxTQUFTZ3FDLGlCQUFpQjNzQyxHQUFFd0IsR0FBRXdqQyxJQUFHRCxJQUFHdG5CLElBQUdDO0lBQy9CLElBQUZ2ZCxJQUFJZ007SUFDUmhNO0lBQ0F5a0MsZ0JBQWdCemtDLFdBQVVILEdBQUVHLFdBQVdxQixHQUFFd2pDLElBQUdELElBQUd0bkIsSUFBR0M7SUFDbER2ZDtJQUNBO0dBQ0Y7R0poQ0EsU0FBU3lzQyxpQkFBaUJDLEtBQUtyNUIsTUFBTW1CLFFBQVFtNEIsUUFBUTE0QixNQUFNOUwsS0FFekQ2QztHQUNGO0dBSUEsU0FBUzRoQywwQkFBMEIxeUIsTUFBSzJ5QjtJQUN0QyxPQUFPSjthQUFpQnZ5QixTQUFRQSxTQUFRQSxTQUFRQSxTQUFRQSxTQUFRQTtHQUNsRTtHU3dnQkEsU0FBUzR5QixvQkFBb0JDLE9BQU9DLE9BQU9DLE9BQU81NUIsTUFBTW1CLFFBQVFQO0lBQzlELEdBQUcrNEIsU0FBUzU1Qiw2QkFBNkJDO0tBQ3ZDMVE7O0lBRUYsT0FBT21TLHNCQUFzQnpCLE1BQU1tQixRQUFRUCxNQUFNODRCO0dBQ25EO0dacGdCQSxTQUFTRyxnQkFBaUJydEMsR0FBSyxPQUFPTyxVQUFVUCxHQUFJO0cwQnhOcEQsU0FBU3N0QyxzQkFBc0J0dEMsR0FBSyxPQUFPNjlCLHdCQUF3Qjc5QixHQUFJO0dsQmhEdkUsU0FBU3V0Qyw0QkFDUCxTQUNGO0dEK1RBLFNBQVNDLGlCQUFpQmpnQztJQUN4QixJQUFJcE4sSUFBSWdNLHFCQUNKNUMsSUFBSXBKLHNCQUFzQm9OLE1BQzFCa2dDLEtBQUtsa0M7SUFDVHBKLG1CQUFtQm9OLEtBQUlwTixLQUFJQSxXQUFXQTtJQUN0Q0EsT0FBT3N0QztJQUNQO0dBQ0Y7R0FZQSxTQUFTQyxvQkFBb0JuZ0M7SUFDM0JpZ0MsaUJBQWlCbHBDLHdCQUF3QmlKO0lBQ3pDO0dBQ0Y7R0FYQSxTQUFTb2dDLGtCQUFrQnhxQztJQUN6QnFxQyxpQkFBaUJucEMsb0JBQW9CbEI7SUFDckM7R0FDRjtHSnRNQSxTQUFTeXFDLGFBQWF2b0M7SUFDcEI7S0FBSVgsT0FBT2EsZUFBZUY7S0FDdEJBLE9BQU9ELG9CQUFvQlY7S0FDM0JzeUI7SUFDSixJQUFVLElBQUY1MEIsT0FBT0EsSUFBSWlKLHlCQUF5QmpKO0tBQzFDLEdBQUdpSixpQkFBaUJqSixXQUFXaUQsTUFBTTJ4QixNQUFNNTBCO0lBQzdDLEdBQUc0MEIsV0FBVTNyQix3QkFBd0IyckI7SUFDckM7R0FDRjtHa0J6SEEsU0FBUzZXLDZCQUE2Qi9MLEtBQUt0bUIsTUFBTUMsS0FBS0MsTUFBTXpZO0lBQzFELFNBQVM2K0I7S0FDUGgvQjtJQUNGLFNBQVMyWTtLQUNQM1k7SUFDRixHQUFHRyxVQUFVO0lBQ2IsSUFBSTJJLE9BQU9rMkIsV0FBV3RtQixPQUNsQnpQLE9BQU8wUCxXQUFXQztJQUN0QixHQUFHOVAsT0FBTzNJLE1BQU02K0IsaUJBQ2RwMEI7SUFFRixHQUFHM0IsT0FBTzlJLE1BQU13WSxpQkFDZC9OO0lBRVEsSUFBTmlPLFFBQVFtbUIsa0JBQWtCbDJCLE1BQUtBLE9BQUszSTtJQUN4Q3dZLGFBQWFFLE9BQU1EO0lBQ25CO0dBQ0Y7R1orSEEsU0FBU295Qiw2QkFBNkIzdEMsR0FBRWtPO0lBQzNCLElBQVArRyxhQUFhMFosZUFBZ0IzdUIsVUFBVWtPLGtCQUFjQSxNQUFJQTtJQUM3RCxPQUFPbXBCLDZCQUE2QnBpQixRQUFRL0c7R0FDOUM7R0MyTUEsU0FBUzAvQixrQkFBa0JuZ0M7SUFDekIsT0FBT29NLG9CQUFvQnFmLFlBQVl6ckI7R0FDekM7R0gyQ0EsU0FBU29nQyxtQkFBbUIzaEMsSUFBR3JNLEdBQUV3QjtJQUN6QixJQUFGckIsSUFBSWdNO0lBQ1IsS0FBSUUsU0FBVTtLQUNELElBQVBvZ0MsU0FBUzN5QjtLQUNiMnlCLGVBQWV0c0M7S0FDZnNzQyxnQkFBZ0J0c0M7S0FDaEJzc0MscUNBQXFDcGdDO0tBQzNCLElBQU40aEMsWUFBWWhzQztLQUNoQmdzQzs7T0FDRTl0QyxvQkFBb0I4dEMsT0FBTWp1QyxHQUFFRyxXQUFXa00sWUFBWTdLO09BQ25ENkssV0FBVzRoQztNQUZFO0tBSWZBLFlBQVl4Qjs7O0tBRVp0c0Msb0JBQW9Ca00sVUFBU3JNLEdBQUVHLFdBQVdrTSxZQUFZN0s7SUFFeEQ7R0FDRjtHWHZIQSxTQUFTMHNDLG9DQUFvQ0MsVUFDM0MsU0FDRjtHSHpDQSxTQUFTQyxnQkFBaUJqdUMsR0FBR2lDLEdBQUdlLEdBQzlCZ0ksaUNBQ0Y7R1UxQ0EsU0FBU2tqQyxlQUFlaHBDO0lBQ2IsSUFBTEosT0FBT3FHLGtCQUFrQmpHO0lBQzdCSixrQkFBa0JBO0lBQ2xCO0dBQ0Y7R0NqRkEsU0FBU3FwQyxrQkFBa0J4akMsUUFBUXlPLEtBQUtDO0lBQ3RDLElBQUkrMEIsV0FBV2pqQyxrQkFBa0JpTyxNQUM3QmkxQixXQUFXbGpDLGtCQUFrQmtPO0lBQ2pDLEdBQUcrMEIsbUJBQW1CQztLQUNwQnJqQzs7SUFDRixLQUFLb2pDO0tBQ0hwakM7SUFFRixPQUFPb2pDLHdCQUF3QnpqQyxRQUFReWpDLGVBQWVDO0dBQ3hEO0dzQmpIQSxTQUFTQyx3QkFBd0J6dUM7SUFDL0IsR0FBSUQsbUJBQW1CQyxJQUFJO0lBQ3JCLElBQUZFO0lBQ0osU0FBU3d1QyxRQUFTMXVDLEdBQVEsT0FBT0QsbUJBQW1CQyxHQUFJO0lBQ3hELFNBQVMydUMsS0FBTTN1QyxHQUFFd0IsR0FBUyxPQUFPKzNCLGVBQWV2NUIsR0FBR3dCLEdBQUk7SUFDdkQsU0FBU290QyxZQUFZNXVDLEdBQUssT0FBTzZTLDJCQUEyQjdTLFNBQVE7SUFDcEU7TUFBSTB1QyxRQUFRQyxLQUFLM3VDLEdBQUc2Uyx5REFBMEQsQ0FDNUUzUyxJQUFJQSxRQUFRRixJQUFJK2IsZ0NBQWdDL2I7SUFFbEQsR0FBSTB1QyxRQUFRQyxLQUFLM3VDLEdBQUc0dUMsd0JBQXlCO0tBQzNDMXVDLElBQUlBO0tBQVFGLElBQUkrYixnQ0FBZ0MvYjs7SUFFbEQsR0FBSTB1QyxRQUFRQyxLQUFLM3VDLEdBQUc0dUMsd0JBQXlCO0tBQzNDMXVDLElBQUlBO0tBQVFGLElBQUkrYixnQ0FBZ0MvYjs7SUFFbEQsR0FBSTB1QyxRQUFRQyxLQUFLM3VDLEdBQUc0dUMsd0JBQXlCO0tBQzNDMXVDLElBQUlBO0tBQVFGLElBQUkrYixnQ0FBZ0MvYjs7SUFFbEQsR0FBSTB1QyxRQUFRQyxLQUFLM3VDLEdBQUc0dUMsd0JBQXlCO0tBQzNDMXVDLElBQUlBO0tBQVFGLElBQUkrYixnQ0FBZ0MvYjs7SUFFbEQsT0FBT0UsSUFBS3lCLG9CQUFvQjQzQixlQUFldjVCLEdBQUc0dUM7R0FDcEQ7R2hCNmJBLFNBQVNDLGdCQUFnQmpoQyxRQUN2QixPQUFPbzVCLGFBQWFwNUIsUUFDdEI7R2dCdmhCQSxTQUFTa2hDLGlDQUFpQzl1QyxHQUN4QyxTQUNGO0c5QjBUQSxTQUFTK3VDLHVCQUF1Qnp3QixPQUM5QixTQUNGO0dIbU5BLFNBQVMwd0Isb0JBQW9CbG5DLElBQUlFLElBQU0sV0FBUzRZLGlCQUFpQjlZLElBQUlFLElBQUs7R0c5TzFFLFNBQVNpbkMsd0JBQXdCM3dCLE9BQy9CLE9BQU8zYiwyQkFDVDtHRXFIQSxTQUFTdXNDLGVBQWdCdm9DO0lBQ2pCLElBQUZpRTtJQUNKLElBQVcsSUFBRnhJLE9BQU9BLElBQUl1RSxVQUFVdkUsSUFBSztLQUMzQixJQUFGc0IsSUFBSWlELEVBQUV2RTtLQUNWd0ksRUFBRXRHLHdCQUF3QlosU0FBU0E7O0lBRXJDLE9BQU9rSDtHQUNUO0djOUdBLFNBQVN1a0MsZUFBZTM3QixNQUFNbUIsUUFBUXk2QjtJQUNwQztLQUFJaDdCLE9BQU8yRyxtQkFBbUJxMEI7S0FDMUIxbUMsT0FBTytLLHNCQUFzQkQsTUFBTVcsaUJBQWlCQztJQUN4RCxPQUFPYSxzQkFBc0J6QixNQUFNbUIsUUFBUVAsTUFBTTFMO0dBQ25EO0dMMktBLFNBQVMybUM7SUFDUGxrQztHQUNGO0dRbmVBLFNBQVNta0MsaUNBQWlDbHJCO0lBQ2xDLElBQUZsakIsSUFBSXdnQixvQkFBb0IwQztJQUM1QixPQUFPbGpCO0dBQ1Q7R2ZpVEEsU0FBU3F1QyxlQUFldnZDLEdBQUd3QixHQUFHK1Y7SUFDNUI7S0FBSWk0QixRQUFRanZDO0tBQ1JrdkMsWUFBWWx2QztLQUNabXZDLFVBQVVudkM7S0FDVm92QztLQUNBQyxJQUFJcnZDLGNBQWFvdkM7S0FDakJFLElBQUl0dkMsY0FBYW92QztJQUVyQixTQUFTRyxTQUFVbnBDLEdBQUczQztLQUNwQjtNQUFJK3JDLEtBQUtQLFFBQVE3b0M7TUFDYnFwQyxNQUFNRCxNQUFNQSxLQUFLcHBDO01BQ2pCc3BDLE1BQU10cEMsSUFBSXFwQztNQUNWM2YsS0FBS21mLFFBQVF4ckM7TUFDYmtzQyxNQUFNN2YsTUFBTUEsS0FBS3JzQjtNQUNqQm1zQyxNQUFNbnNDLElBQUlrc0M7TUFDVnhzQyxJQUFJaUQsSUFBSTNDO01BQ1JvTCxJQUFNNGdDLE1BQU1FLE1BQU14c0MsSUFBS3NzQyxNQUFNRyxNQUFNRixNQUFNQyxNQUFPRCxNQUFNRTtLQUMxRCxXQUNLenNDLE1BQ0EwTDtJQUVQO0lBRUEsU0FBUytNLElBQUt4VixHQUFHM0M7S0FDZixJQUFJN0QsSUFBSXdHLElBQUkzQyxHQUNSRyxJQUFJaEUsSUFBSXdHLEdBQ1J5SSxJQUFLekksS0FBS3hHLElBQUlnRSxNQUFPSCxJQUFJRztLQUM3QixXQUNLaEUsTUFDQWlQO0lBRVA7SUFFQSxTQUFTZ2hDLE9BQVFwd0MsR0FBR3dCO0tBQ2xCLE9BQU94QixXQUFXd0IsV0FBV2d1QyxRQUFReHZDLEtBQUt3dkMsUUFBUXh2QyxJQUFJQSxPQUFPQTtlQUFJQSxVQUFVQSxzQkFBb0J3QixxQkFBbUJrdUM7ZUFBVzF2QztJQUMvSDtJQUVBO01BQUlBLFdBQVdBLE1BQU1BLEtBQUtBLG1CQUFnQkEsbUJBQ3RDd0I7U0FBV0EsTUFBTUE7U0FBS0E7U0FBZ0JBO0tBQWMsT0FDL0N4QixJQUFJd0IsSUFBSStWO0lBRWpCLEdBQUlBLFNBQVMsT0FDSnZYLElBQUl3QjtJQUViLEdBQUkrVixNQUFNQSxLQUFLQSxtQkFBZ0JBLGlCQUFjLE9BQ3BDQTtJQUdDLElBQU44NEI7SUFDSixNQUFPOXZDLFNBQVNQLEtBQUs0dkMsRUFBRyxDQUN0QlMsU0FBU1QsR0FDVDV2QyxLQUFLNnZDO0lBRVAsTUFBT3R2QyxTQUFTaUIsS0FBS291QyxFQUFHLENBQ3RCUyxTQUFTVCxHQUNUcHVDLEtBQUtxdUM7SUFFUCxHQUFJUSxpQkFBaUIsT0FDWnJ3QyxJQUFJd0IsSUFBSTZ1QztJQUVqQixNQUFPOXZDLFNBQVNQLEtBQUs2dkMsRUFBRyxDQUN0QlEsU0FBU1IsR0FDVDd2QyxLQUFLNHZDO0lBRVAsTUFBT3J2QyxTQUFTaUIsS0FBS3F1QyxFQUFHLENBQ3RCUSxTQUFTUixHQUNUcnVDLEtBQUtvdUM7SUFFUCxHQUFJUyxhQUFhLE9BQ1I5NEI7SUFHVCxJQUFJKzRCLEtBQUt0d0MsR0FDTHV3QyxLQUFLL3VDLEdBQ0xndkMsS0FBS2o1QixJQUFJODRCO0lBRWIsR0FBSTl2QyxTQUFTaXdDLE1BQU1qd0MsU0FBUyt2QyxLQUFLQyxVQUFVYixTQUFTLE9BQzNDbjRCO0lBRVQsR0FBSWhYLFNBQVNpd0MsTUFBTWp3QyxTQUFTK3ZDLEtBQUtDLE1BQU1iLGNBQWNBO0tBQ25EYyxNQUFNajVCLHFCQUFtQms0QjtJQUczQjtLQUFJZ0IsS0FBS1gsU0FBU1EsSUFBSUM7S0FDbEJwd0MsSUFBSWdjLElBQUlzMEIsTUFBTUQ7S0FDZEUsSUFBSXYwQixJQUFJczBCLE1BQU10d0M7S0FDZGlDLElBQUkrWixJQUFJaGMsS0FBS3V3QztLQUVieHRDLElBQUlkLE1BQU1ndUMsT0FBT2h1QyxLQUFLc3VDO0lBQzFCLEdBQUl4dEMsU0FBUyxPQUNKQTtJQUdGLElBQUgyMkIsS0FBSzMyQixJQUFJbXRDO0lBQ2IsR0FBSTl2QyxTQUFTczVCLE1BQU00VixXQUFXLE9BQ3JCNVY7SUFJVCxPQUFPQSxLQUFLdVcsT0FBT2x0QyxJQUFJMjJCLEtBQUt3VyxPQUFPanVDLE9BQU9pdUM7R0FDNUM7R2tCN1dBLFNBQVNNLDhCQUE4QjVpQyxNQUFRLFNBQVM7R0x1RHhELFNBQVM2aUMsYUFBYTV3QyxHQUNwQixRQUFXQSxvQkFDQUEsaUJBQ2I7R0hxREEsU0FBUzZ3Qyx3QkFBd0JqakMsUUFBTzFFO0lBQzdCLElBQUxvRSxPQUFPRixpQkFBaUJRO0lBQzVCTix5QkFBd0JwRTtJQUN4Qm9FLHlCQUF5QnBFO0lBQ3pCO0dBQ0Y7R0M1SEEsU0FBUzRuQyxzQkFBeUIsU0FBVTtHSmlONUMsU0FBU0Msa0JBQWtCL3dDLEdBQUV3QixHQUFFb08sR0FBRTFPO0lBQ3pCLElBQUZmLElBQUlnTTtJQUNSaE0scUJBQXFCSCxHQUFFRyxXQUFXcUIsR0FBRW9PLEtBQUcxTztJQUN2QztHQUNGO0dkcENBLFNBQVM4dkMsa0JBQWtCN3dDLEdBQUVpQztJQUMzQixHQUFJQSxXQUFXd0gsc0JBQXNCekosUUFBUXNwQjtJQUM3QztLQUFJbmIsS0FBS3pFLHVCQUF3QjFKLEdBQUdpQztLQUNoQ21NLEtBQUsxRSx1QkFBd0IxSixHQUFHaUM7SUFDcEMsT0FBUW1NLFVBQVVEO0dBQ3BCO0dpQnNSQSxTQUFTMmlDLGtCQUFtQnJqQyxRQUFPekosR0FBRTBFO0lBQzdCLElBQUYxSSxJQUFJeXRCLDRCQUE0QnpwQixHQUFHMEU7SUFDdkNnM0IsZUFBZWp5QixRQUFPek4sTUFBSXlKLHNCQUFzQnpKO0lBQ2hEO0dBQ0Y7R0U5RUEsU0FBUyt3QyxjQUFjL2lDLElBQUlDLElBQUlyRyxJQUFJRTtJQUNqQyxPQUFPa0csT0FBT0EsV0FBV0MsSUFBR3JHLElBQUdFO0dBQ2pDO0dnQnJUQSxTQUFTa3BDLG1CQUFtQjF6QixJQUFJMVYsSUFBSTJWLElBQUl6VixJQUFJaEY7SUFFMUMwbkI7TUFBZ0JsTjtNQUFJOEQsdUJBQXVCeFo7TUFDM0IyVjtNQUFJNkQsdUJBQXVCdFo7TUFDM0JoRjtJQUNoQjtHQUNGO0doQ21Gc0IsSUFBbEJtdUMsb0JBQW9CLElBQUt2c0I7R0FDN0IsU0FBU3dzQjtJQUNDLElBQUp6TixNQUFNLElBQUsvZTtJQUNmLE9BQU8rZSxjQUFjd047R0FDdkI7R0FJQSxTQUFTRSwrQkFBK0J0dEMsR0FDdEMsT0FBT3F0QyxnQkFDVDtHOEIzTkEsU0FBU0UsOEJBQThCdnhDLEdBQ3JDLFNBQ0Y7R0R1RkEsU0FBU3d4QyxpQkFBa0JqckIsT0FBT0M7SUFDaEMsR0FBSUEsZUFBZUQsa0JBQWtCN1k7SUFDckMsT0FBTzZZO0dBQ1Q7R3JCaUlBLFNBQVNrckIsbUJBQW1CMWpDLE1BQzFCdkMsdUJBQ0Y7R1Fnb0JBLFNBQVNrbUMsdUJBQXVCdmpDLElBQzlCLE9BQU9BLFFBQ1Q7R005MUJBLFNBQVN3akMsb0JBQW9CNWpDLE1BQzNCLE9BQU9nOUIsZ0JBQ1Q7R3pCbVBBLFNBQVM2RyxpQkFBaUJ6eEMsR0FBRWlDO0lBQzFCLEdBQUlBLFdBQVdqQyxTQUFTNEo7SUFDeEI7S0FBSXVFLEtBQUtzYSxzQkFBdUJ6b0IsR0FBR2lDO0tBQy9CbU0sS0FBS3FhLHNCQUF1QnpvQixHQUFHaUM7S0FDL0JvTSxLQUFLb2Esc0JBQXVCem9CLEdBQUdpQztLQUMvQnFNLEtBQUttYSxzQkFBdUJ6b0IsR0FBR2lDO0lBQ25DLE9BQVFxTSxXQUFXRCxXQUFXRCxVQUFVRDtHQUMxQztHT3ZDQSxTQUFTdWpDLGlCQUFrQjd4QztJQUN6QixHQUFLQSxZQUFZa04sU0FBU2xOLElBQUksV0FBV0E7SUFDakMsSUFBSjh4QyxNQUFNOXhDO0lBQ1YsR0FBSTh4QyxLQUFLOXhDLE1BQU1BO0lBQ1AsSUFBSitTLE1BQU14UyxpQkFBZ0IrUixnQkFBZ0J0UztJQUMxQ0EsS0FBS08sY0FBWXdTO0lBQ2pCLE1BQU8vUyxRQUFTLENBQ2RBLFFBQ0ErUztJQUVGLE1BQU8vUyxPQUFRLENBQ2JBLFVBQ0ErUztJQUVGLEdBQUkrK0IsS0FBSzl4QyxNQUFNQTtJQUNmLFdBQVdBLEdBQUcrUztHQUNoQjtHUDZCQSxTQUFTZy9CLGtCQUFrQjV4QyxHQUFFaUM7SUFDM0IsR0FBSUEsV0FBV3dILHNCQUFzQnpKLFFBQVFzcEI7SUFDdkMsSUFBRjlpQixRQUFRK0M7SUFDWixJQUFVLElBQUZ0RixPQUFPQSxPQUFPQSxLQUNwQnVDLE1BQU12QyxLQUFLeUYsdUJBQXdCMUosR0FBR2lDLElBQUlnQztJQUU1QyxPQUFPNkosb0JBQW9CdEg7R0FDN0I7R0svRkEsU0FBU3FyQyxrQ0FBa0MxdkM7SUFDekMsR0FBR0EsY0FBYyxXQUFhQTtJQUM5QjtHQUNGO0dZZ1hBLFNBQVMydkMsbUJBQW1CcmtDO0lBQzFCLE9BQU9vTSxvQkFBcUJndEIsYUFBYXA1QjtHQUMzQztHTjFPQSxTQUFTc2tDLG9CQUFvQnZnQyxZQUMzQixPQUFPRCxtQkFBbUJDO0dBQzVCO0dHb01BLFNBQVN3Z0Msd0JBQXdCeHJDO0lBQy9Cd0U7R0FDRjtHa0J6Y0EsU0FBU2luQyxxQkFBcUIzMEIsSUFBSTFWLElBQUkyVixJQUFJelYsSUFBSWhGO0lBQzVDLEdBQUlnRixNQUFNRjtLQUFJLElBQ0QsSUFBRjNELE9BQU9BLEtBQUtuQixLQUFLbUIsS0FBS3NaLEdBQUd6VixLQUFLN0QsS0FBS3FaLEdBQUcxVixLQUFLM0Q7O0tBQy9DLElBQ00sSUFBRkEsSUFBSW5CLEtBQUttQixRQUFRQSxLQUFLc1osR0FBR3pWLEtBQUs3RCxLQUFLcVosR0FBRzFWLEtBQUszRDtJQUV0RDtHQUNGO0dkcUJBLFNBQVNpdUMsb0JBQW9CdGtDLE1BQVEsU0FBVTtHZlcvQyxTQUFTdWtDLG9CQUFvQnQvQixHQUFFN087SUFDN0IsS0FBSWxDLDRCQUNGQTtJQUNGQSwyQkFBMkIrUSxLQUFLN087SUFDaEM7R0FDRjtHZ0I2TkEsU0FBU291QyxzQkFBc0Jwa0MsSUFBSXdHO0lBQ2pDLEdBQUd4RyxhQUFhd0csUUFBUSxPQUFPeEc7SUFDbEIsSUFBVCt0QjtJQUNKLElBQVUsSUFBRjk1QixPQUFPQSxJQUFJK0wsZ0JBQWdCL0w7S0FBSzg1QixTQUFTOTVCLEtBQUsrTCxRQUFRQSxpQkFBaUIvTDtJQUMvRSxPQUFPNlMsc0JBQXNCOUcsU0FBU3dHLFFBQVF1bkIsVUFBVS90QjtHQUMxRDtHYy9MQSxTQUFTcWtDLGlCQUFpQjVzQyxHQUN4QixPQUFPcWUsbUJBQWdCcmUsR0FDekI7RzVCMEhBLFNBQVM2c0MsWUFBWXR2QyxHQUFHd0Q7SUFDdEIsT0FBUUE7O09BQ0EsV0FBV3hEOztPQUNYLFdBQVdBLEVBQUd3RDs7T0FDZCxXQUFXeEQsRUFBR3dELE1BQUtBOztPQUNuQixXQUFXeEQsRUFBR3dELE1BQUtBLE1BQUtBOztPQUN4QixXQUFXeEQsRUFBR3dELE1BQUtBLE1BQUtBLE1BQUtBOztPQUM3QixXQUFXeEQsRUFBR3dELE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBOztPQUNsQyxXQUFXeEQsRUFBR3dELE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBOztPQUN2QyxXQUFXeEQsRUFBR3dELE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBLE1BQUtBOztJQUVwRCxTQUFTa2tDLElBQU0sT0FBTzFuQyxRQUFRbkMsTUFBTStaLG1CQUFtQnBVLElBQUs7SUFDNURra0MsY0FBYzFuQztJQUNkLFdBQVcwbkM7R0FDYjtHU3hDQSxTQUFTNkgsb0JBQ0QsSUFBRnZ5QyxJQUFJZ00scUJBQ1IsT0FBT2hNLElBQ1Q7R00vTkEsU0FBU3d5QyxnQkFBZ0IzdkMsS0FBS1o7SUFDNUIsR0FBSU4sdUJBQXVCa0I7S0FBYyxPQUFPTCw0QkFBMEJQO0lBQ3BFLElBQUZjLElBQUlILGtCQUFrQkM7SUFDMUIsR0FBSVosT0FBTyxHQUFNYyxhQUFjLENBQUVBLGNBQWFkLE1BQUtBLFNBQVVBO0lBQ3ZELElBQUZqQyxJQUFJaUMsV0FBV2M7SUFDbkIsR0FBSUEsWUFBYTtLQUNmQTtLQUNNLElBQUZoRCxJQUFJZ0QsU0FBUy9DO0tBQ2pCLEdBQUlELE9BQU9DLElBQUlGLGdCQUFpQkMsVUFBVUM7O0lBRTVDLE9BQU9pRCx1QkFBdUJGLEdBQUcvQztHQUNuQztHWjhKQSxTQUFTeXlDO0lBQ1B6bkM7R0FDRjtHQWxDQSxTQUFTMG5DO0lBQStDbnNCLE1BQU1vc0IsTUFBTUMsTUFBTUM7SUFDOUQsSUFBTjk3QixRQUFRdVAsNEJBQTRCQztJQUN4Q3hQLGVBQWU0N0IsTUFBTUMsTUFBTUM7SUFDM0IsT0FBTzk3QjtHQUNUO0dnQmpGQSxTQUFTKzdCLGtCQUFtQmp6QyxHQUFHRztJQUM3QixHQUFJQSxVQUFRQSxRQUFRSCxVQUNsQjhDO0lBQ0YsR0FBSTlDLFlBQVlHLE9BQU9ILFdBQVdHO0lBQ2xDO0dBQ0Y7R3hCd3hCQSxTQUFTK3lDLGtCQUFtQi95QyxHQUMxQixPQUFPMEYsd0JBQXdCMUYsR0FDakM7R2F0dkJBLFNBQVNnekMsYUFBYTlpQyxLQUFLaEMsS0FDekIsR0FBR2dDLFNBQVNoQyxVQUFVLFVBQ3RCLFNBQ0Y7R1YrS0EsU0FBUytrQyxxQkFBcUI5MEIsT0FDNUIsT0FBTzNiLDJCQUNUO0djekxBLFNBQVMwd0MsNEJBQTZCbHBDO0lBQzNCLElBQUx2QixPQUFPNGMsYUFBYXJiO0lBQ3hCLEdBQUd2QixtQkFBbUJyQiw2QkFBNEI0QztJQUNsRDtLQUFJbXBDLFdBQVkxcUMsd0JBQXdCMUcsWUFBYTBHO0tBQ2pENmhDO2NBQ0c3aEM7Z0JBQ0VBLG9CQUFrQkE7WUFDdEJ1Qjs7OztvQkFJUS9DO2tCQUNGa3NDO0lBRVhsbUMsaUJBQWlCcTlCLGNBQVlBO0lBQzdCLE9BQU9BO0dBQ1Q7R2UxRkEsU0FBUzhJLGtCQUFrQmx6QztJQUNuQixJQUFGc0c7SUFDSixNQUFPdEcsUUFBUztLQUNSLElBQUYyRCxJQUFJM0Q7S0FDUixJQUFXLElBQUYrQixPQUFPQSxJQUFJNEIsVUFBVTVCLEtBQUt1RSxPQUFPM0MsRUFBRTVCO0tBQzVDL0IsSUFBSUE7O0lBRU4sT0FBT3NHO0dBQ1Q7R2xCTkEsU0FBUzZzQyxtQkFBbUJDO0lBQ2pCLElBQUxBLE9BQU9udkMsd0JBQXdCbXZDO0lBQ25DLFNBQVN2bkIsSUFBSTdtQjtLQUNILElBQUowRCxNQUFNMHFDLHVCQUFxQnB1QztLQUMvQixHQUFHMEQsS0FBSyxPQUFPQTtJQUNqQjtJQUNVLElBQU4ycUM7SUFDSixNQUFLRCxhQUFXQyxXQUFXRDtJQUNoQixJQUFQMW9DLFNBQVNtaEI7SUFDYixLQUFJbmhCLFFBQVFBO0lBQ0QsSUFBUDRvQyxTQUFTem5CO0lBQ2IsS0FBSXluQixRQUFRRDtJQUVOLElBQUY5akMsSUFBSXNjO0lBQ1J0YyxJQUFJQSxJQUFFbWIsU0FBU25iO0lBQ2Y4akMsc0JBQW9COWpDO0lBRWQsSUFBRjFPLElBQUlnckI7SUFDUmhyQixJQUFJQSxJQUFFNnBCLFNBQVM3cEI7SUFDZnd5Qyx1QkFBcUJ4eUM7SUFFYixJQUFKMHlDLE1BQU0zeEMsK0JBQThCOEksUUFBTzJvQztJQUMvQyxLQUFJRSxLQUFNem9DO0lBQ1YsSUFBSTBvQyxNQUFNRCxjQUNObkgsU0FBU29IO0lBQ2JwSCxlQUFlNzhCO0lBQ2Y2OEIsZ0JBQWdCdnJDO0lBQ1IsSUFBSndiLE1BQU04dkIscUJBQXFCQyxRQUFPNzhCLEdBQUUxTztJQUN4Q3diLHlCQUEwQm8zQixPQUN4QkQsWUFBWUMsTUFERTtJQUdoQnRJLGtCQUFrQjl1QjtJQUNULElBQUxxM0IsT0FBT0Y7SUFDWEU7SUFDQUEsaUJBQWlCdEg7SUFDakI7R0FDRjtHa0JtQ0EsU0FBU3VILHFCQUFxQi93QztJQUM1QixHQUFJQSxTQUFTeUs7SUFDYixJQUFJekssTUFBTUEsYUFDTmUsUUFBUTBGLE1BQU16RztJQUNsQmU7SUFDQSxJQUFXLElBQUY1QixPQUFPQSxJQUFJYSxLQUFLYixLQUFLNEIsRUFBRTVCO0lBQ2hDLE9BQU80QjtHQUNUO0d6QjBLQSxTQUFTaXdDLGdCQUFpQmowQyxHQUFLLE9BQU9PLFVBQVVQLEdBQUk7R1dyTnBELFNBQVNrMEMsb0JBQW9Cbm1DLE1BQVEsU0FBVTtHQVIvQyxTQUFTb21DLGtCQUFrQnBtQyxNQUN6QixTQUNGO0dRa0xBLFNBQVNxbUMsa0JBQW1CcDBDLEdBQUd3QjtJQUFLLFVBQVN5VixpQkFBaUJqWCxHQUFFd0I7R0FBZ0I7R3RCL01oRixTQUFTNnlDLG1DQUFzQyxXQUFZO0dHa08zRCxTQUFTQyxpQkFBaUJ0MEMsR0FBSyxPQUFPTyxXQUFXUCxHQUFJO0crQjFRdEMsSUFBWHUwQyxhQUFhN3lDO0dBQ2pCLFNBQVM4eUM7SUFDTCxJQUFJQyxLQUFLNXZCLFlBRUw2dkIsU0FBUzE2QixvQkFBb0J5NkI7SUFDakMsT0FBT3ZwQixlQUFld3BCLFFBQU9IO0dBQ2pDO0d2QmdDQSxTQUFTSSxnQ0FBZ0MxM0IsUUFDdkMsU0FDRjtHU2lFQSxTQUFTMjNCLHVCQUF3Qnp3QyxHQUFLLGFBQWFBLEdBQUk7R1grUXZELFNBQVMwd0MsY0FBY2xwQyxNQUFNQyxNQUFNRSxNQUFNQyxNQUN2Q0osVUFBVUMsU0FBU0UsVUFBVUMsT0FDN0I7R0FDRjtHQ29GQSxTQUFTK29DLG1CQUFtQnpvQyxJQUFHck0sR0FBRXdCO0lBQy9CO0tBQUlyQixJQUFJZ007S0FDSjRvQztPQUFNNTBDO1NBQXVCSCxHQUFFRyxXQUFXa00sWUFBWTdLLEdBQUU2SyxVQUFTQTtJQUNyRSxJQUFXLElBQUZqSyxPQUFPQSxJQUFJMnlDLGlCQUFpQjN5QyxPQUFLO0tBQ3hDaUssUUFBUWpLLEtBQUsyeUMsU0FBUzN5QztLQUN0QmlLLFFBQVFqSyxTQUFPMnlDLFNBQVMzeUM7S0FDeEJpSyxRQUFRakssU0FBTzJ5QyxTQUFTM3lDO0tBQ3hCaUssUUFBUWpLLFNBQU8yeUMsU0FBUzN5Qzs7SUFFMUI7R0FDRjtHQTZCQSxTQUFTNHlDLGtCQUFrQnJ1QztJQUN6QndFO0dBQ0Y7R2F0ZUEsU0FBUzhwQztJQUNBLElBQUhDLEtBQ0FqekMsdUJBQXFCQTtJQUN6QixPQUFPaXpDLDZCQUE0QkE7R0FDckM7RzVCcU9BLFNBQVNDLHVCQUF3Qm4xQyxHQUFHRyxHQUFLLE9BQU9ILGNBQWNHLEdBQUc7R29Cc0ZqRSxTQUFTaTFDLGVBQWVqbkMsSUFDdEIsT0FBT0EsVUFDVDtHZnRTQSxTQUFTa25DLDZCQUFnQyxXQUFZO0c0QjBCckQsU0FBU0MsZUFBZ0IvdUIsT0FBT0MsT0FBTyt1QjtJQUNyQyxHQUFLL3VCLGFBQWVBLFNBQVNELGtCQUFtQjdZO0lBQ2hENlksTUFBTUMsYUFBUyt1QjtJQUFRO0dBQ3pCO0d4QmtFQSxTQUFTQyxpQkFBaUJDLElBQUlDLElBQUlDLElBQ2hDLFNBQ0Y7R1JxYUEsU0FBU0Msd0JBQXdCOXRDLElBQUlFLElBQ25DLE9BQU9zN0IscUJBQXFCdDdCLElBQUdGO0dBQ2pDO0dhdmZBLFNBQVMrdEMsY0FBY3hsQyxLQUFLaEMsS0FBS2krQixPQUMvQmo4QixTQUFTaEMsT0FBT2krQixPQUNoQixTQUNGO0dicVBBLFNBQVN3SixpQkFBaUIzMUMsR0FBRWlDLEdBQUU4YztJQUM1QixHQUFJOWMsV0FBV2pDLFNBQVM0SjtJQUN4QixJQUFJd0UsWUFBWTJRLFVBQ1o1USxZQUFZNFE7SUFDaEJsVixzQkFBdUI3SixHQUFHaUMsT0FBT2tNO0lBQ2pDdEUsc0JBQXVCN0osR0FBR2lDLE9BQU9tTTtJQUNqQztHQUNGO0djMU1BLFNBQVN3bkMscUJBQXFCejFCO0lBQzVCLEdBQUdBLDRCQUNELE9BQU9BO0dBQ1g7R0dxYkEsU0FBUzAxQixtQkFBb0Jwb0MsUUFBT3hMO0lBQ2xDO0tBQUk4VixPQUFROVYsZ0JBQWVBLGdCQUFlQSxlQUFhQTtLQUNuRGpDLElBQUl3dEIscUJBQXFCelY7SUFDN0IybkIsZUFBZWp5QixRQUFPek47SUFDdEI7R0FDRjtHT3RmQSxTQUFTODFDLGtCQUFrQngxQyxLQUFJVDtJQUM3QixJQUFJSyxJQUFJTCxVQUNKMkcsUUFBUStDLE1BQU1ySjtJQUNsQnNHLE9BQU9sRztJQUNQLElBQVUsSUFBRjJCLE9BQU9BLElBQUkvQixHQUFHK0IsS0FBTXVFLEVBQUV2RSxLQUFLcEMsRUFBRW9DO0lBQ3JDLE9BQU91RTtHQUNUO0dQeUhBLFNBQVN1dkMscUJBQXFCdG9DO0lBQ25CLElBQUxOLE9BQU9GLGlCQUFpQlE7SUFDNUIsT0FBT047R0FDVDtHYnhJQSxTQUFTNm9DO0lBQ1ByekM7O0dBQ0Y7R0dzQkEsU0FBU3N6Qyx3QkFBeUJwMkMsR0FBRzhuQyxNQUFNdU87SUFDekMsS0FBS25wQyxTQUFTbE4sR0FBSTtLQUNoQixHQUFJbU4sTUFBTW5OLElBQUksT0FBTzZGO0tBQ3JCLE9BQU9BLHdCQUEwQjdGOztJQUUxQixJQUFMbUIsT0FBUW5CLGNBQVVBLE9BQU11UyxlQUFhdlM7SUFDekMsR0FBR21CLE1BQU1uQixNQUFLQTtJQUNOLElBQUorUztJQUNKLEdBQUkvUztLQUFRO1lBQ0hBO0tBQU8sTUFDUEEsU0FBUytTLGFBQWMsQ0FBRS9TLFFBQVErUzs7S0FDbkMsTUFDRS9TLE9BQVEsQ0FBRUEsUUFBUStTO0lBRTNCLElBQUl1akMsV0FBV3ZqQyxvQkFDWHdqQztJQUNKLEdBQUlwMUM7S0FBTW8xQzs7S0FDTCxPQUNJRjs7UUFDWUUsZ0JBQWdCOztRQUNoQkEsZ0JBQWdCO2dCQUMxQjs7SUFHWCxHQUFJek8sYUFBYUEsVUFBVztLQUVsQixJQUFKME8sTUFBTWoyQyxZQUFXdW5DO0tBQ3JCOW5DLElBQUlPLFdBQVdQLElBQUl3MkMsT0FBT0E7O0lBRWxCLElBQU5DLFFBQVF6MkM7SUFDWixHQUFHOG5DLFVBQVU7S0FDSCxJQUFKOVEsTUFBTXlmO0tBQ1YsR0FBR3pmO01BQ0R5ZixlQUFleDJDLGdCQUFnQjZuQztTQUU1QjtNQUNNLElBQUxwMEIsT0FBT3NqQixVQUFNOFE7TUFDakIsR0FBRzJPLGVBQWUvaUM7T0FDaEIraUMsU0FBU3gyQyxnQkFBZ0J5VCxPQUFPK2lDOztPQUVoQ0EsUUFBUUEsZ0JBQWUvaUM7OztJQUc3QixPQUFPN047YUFBeUIwd0Msa0JBQWtCRSxjQUFjSCxXQUFXdmpDO0dBQzdFO0dRaEhBLFNBQVMyakMsK0JBQStCQyxPQUFPQyxlQUM3QyxTQUNGO0dWa1dBLFNBQVNDLGtDQUFrQ25MLE9BQU94b0M7SUFDaEQ7S0FDRSxJQUFJbUQsV0FBV3FELE1BQU1naUMsWUFDakJ6b0MsTUFBTTFDLFNBQVNxUSxrQkFBa0I4NkI7S0FDckNybEMsVUFBVXJGO0tBQ1YsSUFBVyxJQUFGb0IsT0FBT0EsSUFBSWEsS0FBS2IsS0FBS2lFLEtBQUtqRSxTQUFPd08sVUFBVXhPO0tBQ3BELE9BQU95TyxjQUFjM04sR0FBR21ELE1BTG5CO0dBT1Q7R01uTEEsU0FBU3l3QyxtQkFBbUJ6eEM7SUFDakIsSUFBTEosT0FBT3FHLGtCQUFrQmpHO0lBQzdCLEtBQUtKO0tBQ0hrRztJQUVGLE9BQU9sRyxxQkFBcUJBO0dBQzlCO0dQbktBLFNBQVM4eEMsc0JBQXVCejRCO0lBQVMsT0FBT25jO0dBQW9DO0dENlFwRixTQUFTNjBDLDhCQUE4QixTQUFRO0dBdEkvQyxTQUFTQyxjQUFldHdDLEdBQ3RCLE9BQU93VCxVQUNUO0dnQmdVQSxTQUFTKzhCLGFBQWEvb0MsSUFBSWhLLEdBQ3hCZ0ssUUFBUWhLLElBQ1IsU0FDRjtHWnBUQSxTQUFTZ3pDLGdCQUFpQm4zQztJQUN4QixHQUFJa04sU0FBVWxOLEdBQUk7S0FDUixJQUFKOHhDLFVBQVM5eEM7S0FDYkEsSUFBSU8sU0FBU1A7S0FDYixJQUFJb0MsSUFBSTdCLFdBQVlQLElBQ2hCa0QsSUFBSWxELElBQUlvQztLQUNaLEdBQUkwdkMsSUFBSyxDQUFFMXZDLE1BQUtBLEdBQUdjLE1BQUtBO0tBQ3hCLFdBQVdBLEdBQUdkOztJQUVoQixHQUFJK0ssTUFBT25OLElBQUksV0FBV2tVLEtBQUtBO0lBQy9CLGVBQWFsVSxHQUFHQTtHQUNsQjtHV3BLQSxTQUFTbzNDLGNBQ1AsbUNBQ0Y7R1gwTUEsU0FBU0MsbUJBQW9CcjNDLEdBQUd3QjtJQUM5QixHQUFJeEIsTUFBTXdCLEdBQUc7SUFDYixHQUFJeEIsSUFBSXdCLEdBQUc7SUFDWCxHQUFJeEIsSUFBSXdCLEdBQUc7SUFDWCxHQUFJeEIsTUFBTUEsR0FBRztJQUNiLEdBQUl3QixNQUFNQSxHQUFHO0lBQ2I7R0FDRjtHUHlHQSxTQUFTODFDLGtCQUFrQm4zQyxHQUFFaUMsR0FBRWd0QixLQUM3QmprQixtQ0FDRjtHdUIzVUEsU0FBU29zQyxrQkFBa0JDLFFBQVFDLEtBQUsxcEIsS0FBS3JyQjtJQUUzQztLQUFJZzFDO0tBUUFDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBRUFDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBRUFDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBR0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBQ0FDO0tBRUFDO0tBQ0FDO0lBR0osU0FBU0MsSUFBSXA2QztLQUNMLElBQUZHLElBQUl3Qyx1QkFBdUIzQztLQUMvQjYvQixrQkFBa0IxL0IsTUFBTXlKLHNCQUFzQnpKO0lBQ2hEO0lBRUEsU0FBU2s2QyxXQUFXQyxPQUFPcmQ7S0FFakIsSUFBSjF2QixNQUFNakosd0JBQXdCZzJDO0tBQ2xDLEdBQUkvc0Msa0JBQ0Y7S0FDRixPQUFPQSxrQkFBa0IwdkI7SUFDM0I7SUFFQSxTQUFTc2QsWUFBWWo2QixPQUFPazZCO0tBRTFCLElBQUlDLE9BQU9qbkM7S0FDWCxHQUFJZ25DLGVBQWU5d0MsTUFBTztNQUN4Qit3QyxRQUFRSixXQUFXN0MsT0FBTzJDLGtCQUFrQks7TUFDNUMsVUFBV0E7T0FDVGhuQyxZQUFZZ25DO3FCQUNFQTtPQUNkaG5DLE9BQU9nbkM7Y0FDQUEsa0JBQWtCM3pDO09BQ3pCMk0sT0FBTzFSLHVCQUF1QjA0Qzs7T0FFOUJobkM7TUFDRjRtQyxlQUFlOTVCLDBCQUEwQm02QixjQUFjam5DOztTQUNsRDtNQUNMaW5DLFFBQVFKLFdBQVc3QyxPQUFPMEMsa0JBQWtCTTtNQUM1Q0osZUFBZTk1QiwwQkFBMEJtNkI7O0lBRTdDO0lBRUEsS0FBS2pELGFBQWM7S0FDakJBLGdCQUFnQm40QixlQUFnQm00QixPQUFPa0M7S0FDdkNsQyxnQkFBZ0JuNEIsZUFBZ0JtNEIsT0FBT29DO0tBQ3ZDcEMsZUFBZ0JuNEIsZUFBZ0JtNEIsT0FBT3lDO0tBQ3ZDekMsZ0JBQWdCbjRCLGVBQWdCbTRCLE9BQU9xQztLQUN2Q3JDLGVBQWdCbjRCLGVBQWdCbTRCLE9BQU93QztLQUN2Q3hDLGFBQWdCbjRCLGVBQWdCbTRCLE9BQU9pQztLQUN2Q2pDLGFBQWdCbjRCLGVBQWdCbTRCLE9BQU9nQztLQUN2Q2hDLGdCQUFnQm40QixlQUFnQm00QixPQUFPc0M7S0FDdkN0QyxlQUFnQm40QixlQUFnQm00QixPQUFPbUM7O0lBR3pDO0tBQUk1d0M7S0FBUzdJO0tBQUd3NkM7S0FBSUM7S0FBSUM7S0FHcEJDLEtBQUtwRCxJQUFJMEI7S0FDVDc0QixRQUFRbTNCLElBQUkyQjtLQUNaMEIsVUFBVXJELElBQUk0QjtJQUVsQjtJQUFLO0tBQVM7S0FDUCxPQUFPdHJCOztRQUVWek4sV0FDQXc2Qjs7UUFJQTU2QyxJQUFJczNDLGNBQWNsM0I7UUFDbEIsR0FBSXBnQixPQUFRLENBQUU2dEIsTUFBTWdxQixRQUFRO1FBQzVCLEdBQUlOLElBQUltQixvQkFBcUIsQ0FBRTdxQixNQUFNNnBCLFdBQVc7UUFDaEQ3dUMsTUFBTWl2QztRQUNOOztRQUlBLEdBQUl0MUMsZUFBZWdILE1BQU87U0FDeEIrdEMsSUFBSW1CLGlCQUFpQnBCLE9BQU8rQixrQkFBa0I3MkM7U0FDOUMrMEMsSUFBSW9CLFlBQVluMkM7O1lBQ1g7U0FDTCswQyxJQUFJbUIsaUJBQWlCcEIsT0FBTzhCLGtCQUFrQjUyQztTQUM5QyswQyxJQUFJb0I7O1FBRU4sR0FBSTdvQyxtQkFBbUJ1cUMsWUFBYWo2QixPQUFPNWQ7O1FBSTNDZzRDLEtBQUtsRCxjQUFjbDNCO1FBQ25CcTZCLEtBQUtELEtBQUtqRCxJQUFJbUI7UUFDZDtVQUFJOEIsV0FBV0MsV0FBV0EsTUFBTW5ELE9BQU91QzthQUNuQ3ZDLGFBQWFtRCxPQUFPbEQsSUFBSW1CLGVBQWdCLENBQzFDN3FCLE1BQU04cEIsT0FBTztRQUVmNkMsS0FBS2xELGNBQWNsM0I7UUFDbkJxNkIsS0FBS0QsS0FBS2pELElBQUltQjtRQUNkO1VBQUk4QixXQUFXQyxXQUFXQSxNQUFNbkQsT0FBT3VDO2FBQ25DdkMsYUFBYW1ELE9BQU9sRCxJQUFJbUIsZUFBZ0I7U0FDMUMxNEMsSUFBSXMzQyxhQUFhbUQ7U0FDakI1c0IsTUFBTWdxQjtTQUFROztRQUVoQixHQUFJK0MsYUFBYyxDQUNoQi94QyxNQUFNc3ZDLHFCQUNOOztRQUtGLEdBQUl5QyxZQUFhO1NBQ2ZBO1NBQ0EsT0FBUztVQUNQRixTQUFTbkQsSUFBSWEsYUFBYXVDO1VBQzFCSCxLQUFLbEQsY0FBY29EO1VBQ25CRCxLQUFLRCxLQUFLaEQ7VUFDVjtZQUFJZ0QsV0FBV0MsV0FBV0EsTUFBTW5ELE9BQU91QztlQUNuQ3ZDLGFBQWFtRCxPQUFPakQsUUFBUztXQUMvQixHQUFJMW5DLG1CQUNGb3FDLDZCQUE2QlE7V0FDL0I3c0IsTUFBTStwQjtXQUFlOztjQUNoQjtXQUNMLEdBQUk5bkMsbUJBQ0ZvcUMsMEJBQTBCUTtXQUM1QixHQUFJQyxNQUFNcEQsSUFBSWtCLGVBQWdCO1lBQzVCLEdBQUkzb0MsbUJBQ0ZvcUM7WUFDRixPQUFPbkM7O1dBR1Q0Qzs7OztZQUdDO1NBQ0wsR0FBSXBELElBQUltQixxQkFDTixPQUFPWDtTQUNULEdBQUlqb0MsbUJBQ0ZvcUM7U0FDRjNDLElBQUltQjtTQUNKN3FCLE1BQU00cEI7U0FBTTs7O1FBSWRGLElBQUltQixzQkFDSixHQUFJa0MsYUFBYUE7O1FBR2pCLEdBQUk5cUM7U0FDRm9xQyxlQUFlOTVCLDhCQUE4QmszQixhQUFhbUQ7UUFDNURyNkIsUUFBUWszQixhQUFhbUQ7UUFDckJFO1FBQ0EsR0FBSUEsTUFBTXBELElBQUlpQixlQUFnQixDQUM1QjN2QyxNQUFNbXZDLGVBQ047O1FBS0ZULElBQUlhLGFBQWF1QyxVQUFVdjZCO1FBQzNCbTNCLElBQUljLGFBQWFzQyxVQUFVcEQsSUFBSW9CO1FBQy9CcEIsSUFBSWUsc0JBQXNCcUMsVUFBVXBELElBQUlxQjtRQUN4Q3JCLElBQUlnQixvQkFBb0JvQyxVQUFVcEQsSUFBSXNCO1FBQ3RDaHJCLE1BQU00cEI7UUFDTjs7UUFHQSxHQUFJM25DLG1CQUNGb3FDLGVBQWU5NUIsOEJBQThCcGdCO1FBQ3pDLElBQUZxSixJQUFJaXVDLFdBQVd0M0M7UUFDbkJ1M0MsSUFBSXVCLFdBQVc2QjtRQUNmcEQsSUFBSXlCLG1CQUFtQmg1QztRQUN2QnUzQyxJQUFJd0IsZ0JBQWdCMXZDO1FBQ3BCc3hDLEtBQUtBLEtBQUt0eEM7UUFDVkEsSUFBSWl1QyxXQUFXdDNDO1FBQ2YwNkMsU0FBU25ELElBQUlhLGFBQWF1QztRQUMxQkgsS0FBS2xELGNBQWNqdUM7UUFDbkJveEMsS0FBS0QsS0FBS0U7UUFDVjtVQUFJRixXQUFXQyxXQUFXQSxNQUFNbkQsT0FBT3VDO2FBQ25DdkMsYUFBYW1ELE9BQU9DO1NBQ3RCdDZCLFFBQVFrM0IsYUFBYW1EOztTQUVyQnI2QixRQUFRazNCLGFBQWFqdUM7UUFDdkIsR0FBSXN4QyxNQUFNcEQsSUFBSWlCLGVBQWdCLENBQzVCM3ZDLE1BQU1vdkMsZUFDTjs7UUFLRnB2QyxNQUFNcXZDLHlCQUNOOztRQUdBWCxJQUFJYSxhQUFhdUMsVUFBVXY2QjtRQUMzQm0zQixJQUFJYyxhQUFhc0MsVUFBVW40QztRQUNuQixJQUFKcTRDLE1BQU10RCxJQUFJdUI7UUFDZHZCLElBQUlnQixvQkFBb0JvQyxVQUFVcEQsSUFBSWdCLG9CQUFvQnNDO1FBQzFELEdBQUlGLEtBQUtFO1NBRVB0RCxJQUFJZSxzQkFBc0JxQyxVQUFVcEQsSUFBSWdCLG9CQUFvQnNDO1FBRTlEaHRCLE1BQU00cEI7UUFBTTtnQkFHWixPQUFPTTs7SUFJWFIsSUFBSTBCLFVBQVUwQjtJQUNkcEQsSUFBSTJCLGFBQWE5NEI7SUFDakJtM0IsSUFBSTRCLGVBQWV5QjtJQUNuQixPQUFPL3hDO0dBQ1Q7R2xCaEtBLFNBQVNpeUMsd0JBQXdCanRDLE1BQy9CLFNBQ0Y7R21CN0dBLFNBQVNrdEMsa0JBQW1CajdDLEdBQUd3QjtJQUM3QixVQUFXQSxpQkFBaUIsQ0FBRXhCLFFBQVF3QixHQUFHO0lBQ3pDLEdBQUlBLE1BQVEsQ0FBRXhCLFFBQVF3QixPQUFPO0lBQ3ZCLElBQUZZLElBQUlaO0lBQVUsTUFBT1ksS0FBS3BDLEVBQUVvQyxLQUFLWixFQUFFWTtJQUFJO0dBQzdDO0dRa0VBLFNBQVM4NEMsZ0JBQWdCMzBCLE9BQU9sWSxLQUFLcEwsS0FBS2tCO0lBQ3hDLElBQVUsSUFBRi9CLE9BQU9BLElBQUlhLEtBQUtiLEtBQ3RCbWtCLE1BQU1sWSxNQUFJak0sU0FBTytCO0lBRW5CO0dBQ0Y7R3RCK0pBLFNBQVNnM0MsZUFBZTkxQyxNQUFNcWlCO0lBQ25CLElBQUx6aUIsT0FBT3FHLGtCQUFrQmpHO0lBQzdCSixrQkFBa0JBLFdBQVV5aUI7SUFDNUI7R0FDRjtHVjBSQSxTQUFTMHpCLHFCQUFxQnR6QyxJQUFJRTtJQUFNLFdBQVNrNUIsa0JBQWtCcDVCLElBQUlFO0dBQUs7R0F5QzVFLFNBQVNxekMsdUJBQXVCdnpDLElBQUlFLElBQ2xDLE9BQU9paUIsb0JBQW9CamlCLElBQUlGO0dBQ2pDO0djdExBLFNBQVN3ekMsbUJBQW1CcGpDO0lBQzFCO0tBQUkvWCxJQUFJZ007S0FDSmpMLElBQUlnWDtLQUNKdEksSUFBSXNJO0tBQ0o3TCxLQUFLbE0sMEJBQTBCeVAsR0FBRTFPO0lBQ3JDLElBQVMsSUFBRGtCLE9BQUlBLElBQUVsQixHQUFFa0I7S0FBSSxJQUNULElBQURnQyxPQUFJQSxJQUFFd0wsR0FBRXhMLElBQUk7TUFDbEIsSUFBSWpCLElBQUkrVSxJQUFJOVYsT0FBS2dDLFFBQ2J3RyxJQUFJeEksS0FBR3dOLFNBQVF4TDtNQUNuQixHQUFHakIsU0FBUztPQUNWa0osUUFBUXpCO09BQ1J5QixRQUFRekI7T0FDUnlCLFFBQVF6QjtPQUNSeUIsUUFBUXpCOztVQUNIO09BQ0x5QixRQUFRekIsU0FBU3pIO09BQ2pCa0osUUFBUXpCLFNBQVN6SDtPQUNqQmtKLFFBQVF6QixTQUFTekg7T0FDakJrSixRQUFRekI7OztJQUlkLE9BQU95QjtHQUNUO0dtQnJhQSxTQUFTa3ZDLDJCQUEyQnAzQztJQUNsQ0EsSUFBSUEsS0FBTUE7SUFDVkEsS0FBS0EsbUJBQW9CQTtJQUN6QixRQUFTQSxLQUFLQTtHQUNoQjtHaEJzTUEsU0FBU3EzQywyQkFBMkI1dEMsUUFBTzFLO0lBQ2hDLElBQUxvSyxPQUFPRixpQkFBaUJRO0lBQzVCTix1QkFBeUJuTixHQUFJK0MsRUFBRS9DLEdBQWhCO0lBQ2Y7R0FDRjtHUHVIQSxTQUFTczdDLHVCQUF3QnAyQztJQUMvQjtLQUFJQSxjQUFlQSxtQkFBa0IxQyx1QkFBdUIwQyxRQUFNQTtLQUM5REosT0FBT3FHLGtCQUFrQmpHO0lBQzdCLEdBQUdKLG1CQUFtQkEsV0FBWTtLQUNoQztNQUFJMkQsT0FBTzNELGlCQUFpQkE7TUFDeEJoQyxNQUFPMkY7TUFDUFAsVUFBVWpCLFdBQVduRTtLQUN6QjJGLGFBQVlQLFFBQU1wRjtLQUNsQixPQUFPMHFCLHFCQUFxQnRsQjs7SUFFOUJiLHdCQUF3QjFGLHVCQUF1QnVEO0dBQ2pEO0dMOUlBLFNBQVNxMkMsaUJBQWlCMTdDLEdBQUssT0FBT0EsRUFBRztHRm1LekMsU0FBUzI3QztJQUNLLElBQVIzNUMsVUFBVUM7SUFDZCxHQUFHRCxXQUFXQTtLQUNaQTs7Z0JBQTBDcUksS0FBS3V4QztRQUM3Q3JkLDhCQUE4QmwwQjtRQUM5QnJJO09BRjhCO1lBSzFCQztLQUNOQTs7Z0JBQThDMDBDO1FBQzVDLEdBQUdBLGFBQ0RwWSw4QkFBOEJvWTtPQUZHO0dBTXpDO0dBQ0FnRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RTs7Ozs7Ozs7Ozs7Ozs7Ozs7WW9DeUpRRTtrQ0FrQ1k7OztXQTlCUkMsaUJBQ1IsV0FMSUQsVUFJSUM7O1dBRUVDLG1CQUNWLFdBUElGLFVBTU1FOztXQUVIQyxtQkFDUCxXQVRJSCxVQVFHRzs7V0FFRUMsbUJBQ1QsV0FYSUosVUFVS0k7O1dBSUlDLG1CQUNiLFdBZklMLFVBY1NLOztXQUZKQyxtQkFDVCxXQWJJTixVQVlLTTs7V0FJQUMsbUJBQ1QsV0FqQklQLFVBZ0JLTzs7V0FFREMsbUJBQ1IsV0FuQklSLFVBa0JJUTs7V0FFV0MsbUJBQUpDO09BQ2YsV0FEZUEsSUFwQlhWLFVBb0JlUzs7V0FFU0UsbUJBQVhDO09BQ2pCLFdBRGlCQSxVQXRCYlosVUFzQndCVzs7V0FFbkJFLG1CQUNULFlBekJJYixVQXdCS2E7O1dBRUFDLG9CQUNULFlBM0JJZCxVQTBCS2M7O1dBRUZDLG9CQUNQLFlBN0JJZixVQTRCR2U7O1dBRUdDLG9CQUNWLFlBL0JJaEIsVUE4Qk1nQjttQkFFUUMsb0JBQ2xCLFlBakNJakIsVUFnQ2NpQjs7R0FFVTtZQWlCeEJDLGFBV0pDLFFBQU9DO0lBQVUsVUFBakJELHFCQStCZ0IsT0EvQlRDO1dBQVBEOztXQUNRbEIsT0FEUmtCLFdBRUEsV0FiSUQsYUFZSWpCLE1BRERtQjs7V0FHR2xCLFNBSFZpQixXQUlBLFdBZklELGFBY01oQixRQUhIa0I7O1dBS0FqQixTQUxQZ0IsV0FNQSxXQWpCSUQsYUFnQkdmLFFBTEFpQjs7V0FPRWhCLFNBUFRlLFdBUUEsV0FuQklELGFBa0JLZCxRQVBGZ0I7O1dBU01mLFNBVGJjLFdBVUEsV0FyQklELGFBb0JTYixRQVROZTs7V0FXRWQsU0FYVGEsV0FZQSxXQXZCSUQsYUFzQktaLFFBWEZjOztXQWFFYixTQWJUWSxXQWNBLFdBekJJRCxhQXdCS1gsUUFiRmE7O1dBZUNaLFNBZlJXLFdBZ0JBLFdBM0JJRCxhQTBCSVYsUUFmRFk7O1dBMkJZWCxTQTNCbkJVLFdBMkJlVCxLQTNCZlM7T0E0QkEsV0FEZVQsSUF0Q1hRLGFBc0NlVCxRQTNCWlc7O1dBNkJvQlQsU0E3QjNCUSxXQTZCc0JFLE1BN0J0QkYsV0E2QmlCUCxNQTdCakJPO09BOEJBLFdBRGlCUCxLQUFLUyxLQXhDbEJILGFBd0N1QlAsUUE3QnBCUzs7V0FpQkVQLFNBakJUTSxXQWtCQSxZQTdCSUQsYUE0QktMLFFBakJGTzs7V0FtQkVOLFVBbkJUSyxXQW9CQSxZQS9CSUQsYUE4QktKLFNBbkJGTTs7V0FxQkFMLFVBckJQSSxXQXNCQSxZQWpDSUQsYUFnQ0dILFNBckJBSzs7V0F1QkdKLFVBdkJWRyxXQXdCQSxZQW5DSUQsYUFrQ01GLFNBdkJISTs7V0F5QldILFVBekJsQkUsV0EwQkEsWUFyQ0lELGFBb0NjRCxTQXpCWEc7O0dBK0JlO1lBTWxCRSxXQUlKQyxNQUFLQztJQUFRLFVBQWJELG1CQTJEQSxPQTNES0M7V0FBTEQ7O1dBaUJLdEIsT0FqQkxzQixTQWtCQSxXQXRCSUQsV0FxQkNyQixNQWpCQXVCOztXQW1CS3RCLFNBbkJWcUIsU0FvQkEsV0F4QklELFdBdUJNcEIsUUFuQkxzQjs7V0FDUXJCLFNBRGJvQixTQUNRRSxNQURSRjtPQUVBLFdBRFFFLEtBTEpILFdBS1NuQixRQURScUI7O1dBR2FwQixTQUhsQm1CLFNBR2FHLFFBSGJIO09BSUEsV0FEYUcsT0FQVEosV0FPY2xCLFFBSGJvQjs7V0FNa0JuQixTQU52QmtCLFNBTWlCSSxPQU5qQkosU0FNWUssUUFOWkwsU0FNS00sUUFOTE47T0FPQSxXQURLTSxPQUFPRCxPQUFLRCxNQVZiTCxXQVVtQmpCLFFBTmxCbUI7OztRQVFvQmxCLFNBUnpCaUI7UUFRbUJPLFNBUm5CUDtRQVFjUSxRQVJkUjtRQVFPUyxVQVJQVDtPQVNBLFdBRE9TLFNBQU9ELE9BQUtELFFBWmZSLFdBWXFCaEIsUUFScEJrQjs7O1FBVXdCakIsU0FWN0JnQjtRQVV1QlUsU0FWdkJWO1FBVWtCVyxRQVZsQlg7UUFVV1ksVUFWWFo7T0FXQSxXQURXWSxTQUFPRCxPQUFLRCxRQWRuQlgsV0FjeUJmLFFBVnhCaUI7OztRQVlvQmhCLFNBWnpCZTtRQVltQmEsU0FabkJiO1FBWWNjLFFBWmRkO1FBWU9lLFVBWlBmO09BYUEsV0FET2UsU0FBT0QsT0FBS0QsUUFoQmZkLFdBZ0JxQmQsUUFacEJnQjs7O1FBY29CZixTQWR6QmM7UUFjbUJnQixTQWRuQmhCO1FBY2NpQixRQWRkakI7UUFjT2tCLFFBZFBsQjtPQWVBLFdBRE9rQixPQUFPRCxPQUFLRCxRQWxCZmpCLFdBa0JxQmIsUUFkcEJlOztXQXFCTWIsU0FyQlhZLFNBcUJNbUIsUUFyQk5uQjtPQXNCQSxXQURNbUIsT0F6QkZwQixXQXlCT1gsUUFyQk5hOztXQStCQ1gsU0EvQk5VLFNBZ0NBLFlBcENJRCxXQW1DRVQsUUEvQkRXOztXQWtDZ0JWLFVBbENyQlMsU0FrQ2dCb0IsTUFsQ2hCcEI7T0FtQ0EsWUFEZ0JvQixLQXRDWnJCLFdBc0NpQlIsU0FsQ2hCVTs7V0FvQ2NULFVBcENuQlEsU0FvQ2NxQixNQXBDZHJCO09BcUNBLFlBRGNxQixLQXhDVnRCLFdBd0NlUCxTQXBDZFM7O1dBdUNtQlIsVUF2Q3hCTyxTQXVDaUJzQixRQXZDakJ0QixTQXVDWXVCLFFBdkNadkI7T0F3Q0EsWUFEWXVCLE9BQUtELE9BM0NidkIsV0EyQ29CTixTQXZDbkJROztXQXlDcUJQLFVBekMxQk0sU0F5Q21Cd0IsVUF6Q25CeEIsU0F5Q2N5QixRQXpDZHpCO09BMENBLFlBRGN5QixPQUFLRCxTQTdDZnpCLFdBNkNzQkwsU0F6Q3JCTzs7V0F1QkN5QixVQXZCTjFCLFNBd0JBLFlBNUJJRCxXQTJCRTJCLFNBdkJEekI7O1dBeUJDMEIsVUF6Qk4zQixTQTBCQSxZQTlCSUQsV0E2QkU0QixTQXpCRDFCOztXQXFEdUIyQixVQXJENUI1QixTQXFEZ0I2QixhQXJEaEI3QjtPQXNEQSxZQURnQjZCLFlBekRaOUIsV0F5RHdCNkIsU0FyRHZCM0I7O1dBdUR1QjZCLFVBdkQ1QjlCLFNBdURnQitCLGFBdkRoQi9CO09Bd0RBLFlBRGdCK0IsWUEzRFpoQyxXQTJEd0IrQixTQXZEdkI3Qjs7V0E2QkUrQixVQTdCUGhDLFNBOEJBLFlBbENJRCxXQWlDR2lDLFNBN0JGL0I7O1dBNEMrQmdDLFVBNUNwQ2pDLFNBNEMwQmtDLFdBNUMxQmxDLFNBNENlbUMsWUE1Q2ZuQztPQTZDQSxZQURlbUMsV0FBV0QsVUFoRHRCbkMsV0FnRGdDa0MsU0E1Qy9CaEM7O1dBOENzQm1DLFVBOUMzQnBDLFNBOENrQnFDLFVBOUNsQnJDO09BK0NBLFlBRGtCcUMsU0FsRGR0QyxXQWtEdUJxQyxTQTlDdEJuQzs7V0FnRFVxQyxVQWhEZnRDLFNBaURBLFlBckRJRCxXQW9EV3VDLFNBaERWckM7O1dBa0Rlc0MsVUFsRHBCdkMsU0FrRGV3QyxNQWxEZnhDO09BbURBLFlBRGV3QyxLQXREWHpDLFdBc0RnQndDLFNBbERmdEM7O1dBMkJhd0MsVUEzQmxCekMsU0EyQmUwQyxJQTNCZjFDLFNBMkJRMkMsUUEzQlIzQztPQTRCQSxZQURRMkMsT0FBT0QsR0EvQlgzQyxXQStCYzBDLFNBM0JieEM7O0dBMkREO3NDQS9HQU4sY0FuREFsQixXQW1HQXNCOzs7O0VEbm5CVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUU2Qks2QyxTQUFTQztJQUFJLCtDQUFKQTtHQUFvQjtZQUM3QkMsWUFBWUQ7SUFBSSx3REFBSkE7R0FBNkI7R0FFN0M7WUEwQ0lFLElBQUlDLEdBQUVDLEdBQUksT0FBRyx1QkFBVEQsR0FBRUMsS0FBRkQsSUFBRUMsRUFBMkI7WUFDakNDLElBQUlGLEdBQUVDLEdBQUksT0FBRywwQkFBVEQsR0FBRUMsS0FBRkQsSUFBRUMsRUFBMkI7WUF1QmpDRSxJQUFJSCxHQUFJLFlBQUpBLGdCQUE0QjtZQU1oQ0ksS0FBS0osR0FBSSxPQUFKQSxPQUFlO0dBNEV0QjtJQURFSyxXQUNGO0lBQ0VDLGVBQ0Y7SUFDRUMsTUFDRjtJQUNFQyxZQUNGO0lBQ0VDLFlBQ0Y7SUFDRUMsZ0JBQ0Y7SUFoRkVDO0lBQ0FDO1lBcUdBQyxPQUFNQyxJQUFHQztJQUNYO0tBQUlDLDJCQURJRjtLQUNzQkcsMkJBRG5CRjtLQUVQbEIsSUFBSSxrQkFESm1CLEtBQTBCQztJQUU5QixpQkFIUUgsT0FFSmpCLE1BREFtQjtJQUdKLGlCQUpXRCxPQUVQbEIsR0FEQW1CLElBQTBCQztnQ0FDMUJwQjtHQUdvQjtZQU10QnFCLFlBQVlDO0lBQ2QsUUFEY0EsZUFDMEMsT0FEMUNBO0lBQ1csT0FsTXZCckI7R0FrTTBFO1lBNkIxRXNCLGVBQWVDLEdBQ2pCLE9BRGlCQSx5QkFDWTtZQUMzQkM7SUFBaUI7OztnQkFqT2pCeEI7OztHQW9PaUM7WUFFakN5QjtJQUFxQjs7O0dBR1o7WUFFVEMsY0FBY0wsR0FDaEIsWUFEZ0JBLEVBQ0M7WUFJZk0sa0JBQWtCNUI7SUFFcEIsSUFBSSxjQUFLLG1CQUZXQSxLQUVoQjs7OzRCQUNjOzs7R0FBSTtZQUlwQjZCLGtCQUFrQjdCO0lBQ3BCLElBQUk4QiwwQkFEZ0I5QixJQUVQK0I7SUFDWDtRQUZFRCxLQUNTQyxHQUNJLE9BcEVmZixPQWlFa0JoQjtLQUlaLG9DQUpZQSxHQUVQK0I7Ozs7O29CQUFiLE9BRm9CL0I7S0FLSSxJQUhYZ0M7O0dBTVA7WUFFSkMsZ0JBQWdCcEM7SUFBSSxPQVZwQmdDLGtCQVVzQyxtQ0FBdEJoQztHQUE4QztZQUk5RHFDLG9CQUFvQmxDO0lBRXRCLElBQUksY0FBSyxxQkFGYUEsS0FFbEI7Ozs0QkFDYzs7O0dBQUk7WUFJaEJtQyxTQUFNaEIsSUFBR0M7SUFDZixLQURZRCxJQUVKLE9BRk9DO1FBR1BnQixLQUhJakIsT0FHVmtCLEtBSFVsQjtJQUdFLFdBQVprQixJQUhJRixTQUdFQyxJQUhPaEI7R0FHYztHQVduQjtJQUFSa0IsUUFBUTtJQUNSQyxTQUFTO0lBQ1RDLFNBQVM7WUFjVEMsYUFBYUMsTUFBS0MsTUFBS0M7SUFDakIsSUFBSkMsSUFBSSw0QkFBbUIsY0FERkQsTUFBVkYsTUFBS0M7SUFFcEIseUJBRElFLEdBRHFCRDtJQUV6QixPQURJQztHQUVIO1lBRUNDLFNBQVNGLE1BQ1gsT0FORUgsdUJBS1NHLE1BQzZEO1lBRXRFRyxhQUFhSCxNQUNmLE9BVEVILHVCQVFhRyxNQUMyRDtZQU94RUk7SUFDRixjQVNRO0lBVE87bUJBQ0w7U0FDSGxCLGdCQUFIbUI7S0FDRSxJQUNJLGNBRk5BOzs7OzttQkFBR25COztHQU91QjtZQVM1Qm9CLGFBQWFDLElBQUduRDtJQUNsQiw0QkFEZW1ELElBQUduRDtHQUNtQjtZQUVuQ29ELGNBQWNELElBQUduRDtJQUNuQixzQkFEZ0JtRCxJQUFHbkQ7R0FDMEI7WUFFM0NxRCxPQUFPRixJQUFHbkQsR0FBRXNELEtBQUlDO0lBQ2xCLFFBRGNELFlBQUlDLDZCQUFOdkQsS0FBTXVELFlBQUpEO0tBR1QsNEJBSElILElBQUduRCxHQUFFc0QsS0FBSUM7SUFFYixPQXJWSHREO0dBc1Y2QjtZQUU3QnVELGlCQUFpQkwsSUFBR25ELEdBQUVzRCxLQUFJQztJQUM1QixRQUR3QkQsWUFBSUMsOEJBQU52RCxLQUFNdUQsWUFBSkQ7S0FHbkIsc0JBSGNILElBQUduRCxHQUFFc0QsS0FBSUM7SUFFdkIsT0ExVkh0RDtHQTJWb0M7WUFPcEN3RCxhQUFhQyxNQUFLQztJQUFJLGlDQUFURCxNQUFLQztHQUFnQztZQU1sREMsVUFBVVQ7SUFBSyxjQUFMQTtJQUFlLDZCQUFmQTtHQUFtQztZQUM3Q1UsZ0JBQWdCVjtJQUNsQixJQUFLLGNBRGFBO0lBRWxCLElBQUssZ0NBRmFBLEtBRWIsdUJBQStCO0dBQUc7WUFTckNXLFlBQVlwQixNQUFLQyxNQUFLQztJQUNoQixJQUFKQyxJQUFJLDJCQUFrQixjQURGRCxNQUFWRixNQUFLQztJQUVuQix5QkFESUUsR0FEb0JEO0lBRXhCLE9BRElDO0dBRUg7WUFFQ2tCLFFBQVFuQixNQUNWLE9BTkVrQixvQkFLUWxCLE1BQ2lDO1lBRXpDb0IsWUFBWXBCLE1BQ2QsT0FURWtCLG9CQVFZbEIsTUFDK0I7WUFPM0NxQixNQUFNQyxJQUFHbEUsR0FBRXNELEtBQUlDO0lBQ2pCLFFBRGFELFlBQUlDLDZCQUFOdkQsS0FBTXVELFlBQUpEO0tBR1IscUJBSEdZLElBQUdsRSxHQUFFc0QsS0FBSUM7SUFFWixPQXRZSHREO0dBdVk0QjtZQUV4QmtFLG9CQUFvQkQsSUFBR2xFLEdBQUVzRCxLQUFJQztJQUNuQyxJQUQrQmEsYUFBSUM7SUFDbkM7YUFEbUNBLE9BQ2xCO0tBQ1AsSUFBSkMsSUFBSSxjQUZnQkosSUFBR2xFLEdBQUVvRSxPQUFJQztLQUdqQyxTQURJQyxHQUVDOztNQUo0QkMsZ0JBRTdCRDtNQUZ5QkUsZ0JBRXpCRjtNQUZ5QkY7TUFBSUM7O0dBTWhDO1lBRURJLGFBQWFQLElBQUdsRSxHQUFFc0QsS0FBSUM7SUFDeEIsUUFEb0JELFlBQUlDLDZCQUFOdkQsS0FBTXVELFlBQUpEO0tBR2YsT0FYQ2Esb0JBUVNELElBQUdsRSxHQUFFc0QsS0FBSUM7SUFFbkIsT0FuWkh0RDtHQW9abUM7WUFFbkN5RSxvQkFBb0JSLElBQUdYO0lBQ2pCLElBQUp2RCxJQUFJLGtCQURpQnVEO0lBTHZCa0IsYUFLb0JQLElBQ2xCbEUsTUFEcUJ1RDtnQ0FDckJ2RDtHQUVvQjtZQUl0QjJFLFdBQVdqQjtJQUNiLFNBQVFrQixhQUFhQztTQUFJQzs7b0JBQ2pCLE9BRGFEO01BR2pCLElBREl6QyxpQkFBTkMsaUJBQ01rQixNQUFKLHFCQURGbEI7TUFFRSx3QkFGRkEsT0FGbUJ3QyxLQUFJQyxRQUdqQnZCO2tCQUhpQnVCLFFBR2pCdkIsU0FIaUJ1Qix5QkFFakIxQzs7O1FBSUsyQyxVQUFLeEI7SUFDaEI7S0FBUSxJQUFKakMsSUFBSSxnQ0FSR29DO0tBU1gsU0FESXBDO1dBRE95RCxNQUlEO2dCQVZKSCxhQVdpQixrQkFMUHJCLFdBQUx3Qjs7O2NBQ1B6RDtPQWNRLElBQU4wRCxNQUFNLG9CQWRSMUQ7T0FlSSxjQXZCR29DLE1Bc0JMc0IsVUFkRjFEO09BZ0JHO1FBakJTaUQsY0FDWmpEO1FBRE8yRCxhQWVMRCxLQWZLRDs7UUFBS3hCOzs7TUFPSixJQUFOMkIsTUFBTSxrQkFOUjVEO01BT0ssY0FmRW9DLE1BY0x3QixRQU5GNUQ7TUFRSyxtQkFoQkVvQztTQU9BcUI7O1FBWUdWLFNBWkVkLE1BQ1pqQztjQVBFc0QsYUFtQmlCLGtCQURUUCxtQkFMUmEsS0FQS0g7O2lCQU9MRzs7S0FZa0I7O0dBQVc7WUFTbkNDLGVBQWVqQjtJQUFLLElBQUssZ0NBQVZBLEtBQVUsdUJBQXNCO0dBQUc7WUFNbERrQixXQUFXdkMsR0FBSSwyQkEzS2ZOLFFBMktXTSxHQUF3QjtZQUNuQ3dDLGFBQWFyRixHQUFJLE9BdkhqQm9ELGNBckRBYixRQTRLYXZDLEdBQTBCO1lBQ3ZDc0YsWUFBWXRGLEdBQUksT0EzSGhCa0QsYUFsREFYLFFBNktZdkMsR0FBeUI7WUFDckN1RixVQUFVeEQsR0FBSSxPQXpIZHFCLGNBckRBYixhQThLVVIsR0FBMEM7WUFDcER5RCxZQUFZM0YsR0FBSSxPQTFIaEJ1RCxjQXJEQWIsUUExQkFOLGdCQXlNWXBDLElBQTRDO1lBQ3hENEYsY0FBY3pGO0lBM0hkb0QsY0FyREFiLFFBZ0xjdkM7SUFDUSxvQkFqTHRCdUM7SUFpTCtDLHFCQWpML0NBO0dBaUwyRDtZQUMzRG1EO0lBQW1CLG9CQWxMbkJuRDtJQWtMNEMscUJBbEw1Q0E7R0FrTHdEO1lBSXhEb0QsV0FBVzlDLEdBQUksMkJBckxmTCxRQXFMV0ssR0FBd0I7WUFDbkMrQyxhQUFhNUYsR0FBSSxPQWxJakJvRCxjQXBEQVosUUFzTGF4QyxHQUEwQjtZQUN2QzZGLFlBQVk3RixHQUFJLE9BdEloQmtELGFBakRBVixRQXVMWXhDLEdBQXlCO1lBQ3JDOEYsVUFBVS9ELEdBQUksT0FwSWRxQixjQXBEQVosYUF3TFVULEdBQTBDO1lBQ3BEZ0UsWUFBWWxHLEdBQUksT0FySWhCdUQsY0FwREFaLFFBM0JBUCxnQkFvTllwQyxJQUE0QztZQUN4RG1HLGNBQWNoRztJQXRJZG9ELGNBcERBWixRQTBMY3hDO0lBQ1Esb0JBM0x0QndDO0lBMkwrQyxxQkEzTC9DQTtHQTJMMkQ7WUFDM0R5RDtJQUFtQixvQkE1TG5CekQ7SUE0TDRDLHFCQTVMNUNBO0dBNEx3RDtZQUl4RDBELGlCQUFlLGNBak1mM0QsU0FEUSxPQW1JUm9DLFdBbklBckMsT0FrTTZDO1lBQzdDNkQsZ0JBQWMsMEJBRGRELGNBQ3dDO1lBQ3hDRSxvQkFBa0IsT0E5T2xCeEUsa0JBNE9Bc0UsY0FFZ0Q7WUFDaERHLGtCQUFnQiw0QkFIaEJILGNBRzRDO1lBQzVDSSxzQkFBb0IsT0EzTnBCcEUsb0JBdU5BZ0UsY0FJb0Q7WUEwQnBESyw0QkFBZ0NoSSxnQkFBUSxPQUFSQTtZQU1oQ2lJO0lBRU07S0FGc0NDO0tBQU5ySjtLQUFoQnNKO0tBQU52SjtLQUVWLE1BNVVONkQsT0EwVXNCMEYsTUExVXRCMUYsY0EwVTRDeUY7SUFDOUMsV0FBUSx3Q0FEVXRKLE1BQXNCQzs7R0FldEIsSUFBaEJ1SixvQkFyTkEzRDtZQXVOSTRELFFBQVEvRztJQUVkO0tBQW1CO01BQWZnSDtNQUNBQyxXQUFKLGlCQUxFSDtNQU1FSTtpQkFGQUYsY0FDQUM7a0JBQ0FFO1VBQ0YsbUJBSEVILHFCQUdxRCxXQUwzQ2hIO1VBSzJDLGtCQUZyRGlIO1NBR1M7Z0JBRlRFOzs0QkFGQUgsY0FDQUM7TUFLQUcsMEJBVkZOLGVBS0VHLFVBQ0FFO01BS0osVUFESUM7O0tBQ0o7O0dBQTZCO0dBRUQsSUFBMUJDLDhDQUF5QyxTQUFFO1lBRTNDQztJQUNGLFdBSEVEO0lBR0YsbUNBaEJFUDtHQWlCMkI7WUFFM0JTLEtBQUtDO0lBSkxGO0lBTUYsNkJBRk9FO0dBRVM7R0FFViwyREFSSkY7Ozs7T0E5aEJBbEg7T0FEQUY7Ozs7Ozs7Ozs7Ozs7O09BNkNBRztPQUNBRztPQXVCQUM7T0FZQVE7T0FDQUM7T0FQQVI7T0EyRUFDO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BdUJBRztPQVdBSztPQThCQUU7T0FPQUc7T0FMQUQ7T0FVQUU7T0FLQUM7T0FpQkFLO09BSUFDO09BT0lDO09BY0pHO09BQ0FDO09BQ0FDO09BMEtBNEM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FFQUM7T0FJQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FFQUM7T0FJQUM7T0FFQUU7T0FEQUQ7T0FHQUc7T0FEQUQ7T0FoTEF2RDtPQUdBQztPQVJBTjs7T0FnQkFPOztPQXNCQUk7T0FIQUY7T0FNQUc7T0FLQUc7OztPQVVBQzs7OztPQU1BRztPQUNBQzs7T0FnQkFFO09BR0FDO09BUkFGOztPQXlDQWE7T0F6QkFWO09BYUFRO09BS0FDOzs7Ozs7OztPQTBDQVM7Ozs7Ozs7OztPQTBEQW9CO09BTUFDO09Ba0NBWTtPQWpCSVI7T0ExUkovRTtPQWtKSXNDO09BcUpKZ0Q7T0FGQUQ7OztFRjFqQkw7Ozs7Ozs7R0lvQ3VCOzs7OztJQTRGbEJ3QjtJQWVBQzs7SUEzR0FDLGtCQUFrQjtJQUNqQkMsVUFBaUI7SUFDbEJDO0lBSUFDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDLHdCQURBRDtJQUVBRSx5QkFGQUY7O0lBTkFHO0lBQ0FDO0lBQ0FDO1lBZ0JBQyxXQUFXeEo7SUFFYixJQUFJLGNBQUssd0JBRklBLEtBRVQ7OzsyQkFDYzs7O0dBQUk7R0FXTixJQUFkeUo7WUFVQUMsV0FBV0MsU0FBUUMsU0FBVSxTQUE4QjtHQStCL0Q7O0lBN0JJQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztZQUlBQyxZQUFZQyxJQUNkLE9BRGNBLFdBSW9CO09BWWhDQzsyQkFnQ2tFO0dBUmpEOzs7O09BdEhqQi9DO09BcUJBWTtPQWNBQztPQWxDQ1o7T0FDREM7T0FJQUM7T0FDQUM7T0FDQUM7T0FKQUs7T0FDQUM7T0FGQUY7T0FRQUQ7T0FGQUY7T0FDQUM7T0FtQ0FPO09BRUFHO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDOztPQUlBQztPQWNBL0M7T0FFQWlEO09BYUFoRDs7Ozs7O0VKL0lMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZSzBCc0JpRCxTQUFTM0ksR0FBSSxtQkFBSkEsd0JBQWtCOztJQVkzQjRJO0lBQ0FDO0lBV2pCQztJQUNBQztJQUVBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUVBQztJQUVBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUdBQztJQUNBQztJQUNBQztZQXdCRUMsS0FBTUM7SUFDUixHQUFRLGFBREFBO0tBQ1I7SUFDWTtLQWxCR0QsT0FrQkgsMkJBRkpDO0tBZEpwTiwrQkFGV21OO0tBU1hFLFlBVFdGO0lBYWYsV0FYSW5OLE9BT0FxTjtHQVN5QjtZQU0zQkMsT0FDRWpOO0lBQUo7T0EvRWlCeUwsU0ErRWJ6TCxNQUVpQixhQUZqQkEscUNBQ0FrTixPQURBbE47dUJBQ0FrTixPQURBbE47O09BL0VheUwsU0FnRmJ5QixTQUtvQixhQUxwQkEsbUJBSUF6SyxPQUpBeUs7O1NBSUF6SyxPQUVHO1dBRUYsYUFKREE7Y0FKQXlLO2NBU0c7R0FBdUM7WUFFM0J6SyxLQUFNeUssTUFDeEIsT0FEd0JBLFFBQ0M7WUFFUEMsR0FBSUQsTUFDdEIsT0FEc0JBLFFBQ0c7R0FuQjlCO2dDQUVNRCxRQWFpQnhLLE1BR0EwSztJQVdqQkM7WUFHQUMsT0FBTzFMO0lBQ1QsZUFEU0EsNEJBSFB5TDtnQkFLQTtJQUNGLGdDQUhTekw7R0FHRDtZQUVOMkwsT0FBT3ROLEdBQUksT0FBSkEscUJBQW9DO1lBRTNDdU4sd0JBQXdCN0YsR0FBRThGLEdBQUVDO0lBQzlCO2dCQUQ0QkQ7cUJBRjFCRixPQUV3QjVGOztpQkFFeEIsc0JBRjRCK0Y7R0FFYjtZQUdmQyxRQUFRaEcsR0FBRThGO0lBTFZELHdCQUtRN0YsR0FBRThGO0lBRVosaUNBRlU5RixHQUFFOEY7R0FFRDtZQUdURyxhQUFhakcsR0FBRThGO0lBVmZELHdCQVVhN0YsR0FBRThGO0lBRWpCLHNDQUZlOUYsR0FBRThGO0dBRUQ7WUFHZEksUUFBUWxHLEdBQUU4RixHQUFFeE47SUFmWnVOLHdCQWVRN0YsR0FBRThGO0lBRVosaUNBRlU5RixHQUFFOEYsR0FBRXhOO0dBRUQ7WUFHWDZOLFVBQVVuRyxHQUFFOEY7SUFwQlpELHdCQW9CVTdGLEdBQUU4RjtJQUVkLG1DQUZZOUYsR0FBRThGO0dBRUQ7WUFHWE0sVUFBVXBHLEdBQUU4RjtJQXpCWkQsd0JBeUJVN0YsR0FBRThGO0lBRWQsbUNBRlk5RixHQUFFOEY7R0FFRDtZQUtYTyxTQUFTL0YsSUFBR2dHLElBQUcvRixJQUFHZ0csSUFBR3RNO0lBQ3ZCO1dBRHVCQTs7WUFBVHFNO1dBbENaVixPQWtDU3RGLE1BQVlyRyxVQUFUcU0sV0FBTUMsT0FsQ2xCWCxPQWtDZXJGLE1BQU10RyxVQUFIc007O2tCQUFHdE07a0JBSUgsMkJBSlRxRyxJQUFHZ0csSUFBRy9GLElBQUdnRyxJQUFHdE07S0FJSDs7SUFEZjtHQUNxQzs7OztPQXZKekI4SjtPQVlBQztPQUNBQztPQVdqQkM7T0FDQUM7T0FFQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FFQUM7T0FFQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FHQUM7T0FDQUM7T0FDQUM7V0F3QkVDOzs7UUFzQ0FPO1FBS0FDO1FBT0FJO1FBS0FDO1FBS0FDO1FBS0FDO1FBS0FDO1FBT0FDOzs7Ozs7O1FBMUNBWDs7O0VMbklQOzs7Ozs7Ozs7O1lNd0JLYyxJQUFJL0osR0FBRW5FLEdBQUkscUJBQU5tRSxHQUFFbkUsYUFBeUI7WUFDL0JtTyxLQUFLaEssR0FBSSxzQkFBSkEsZ0JBQThCO1lBQ25DaUssS0FBS2pLLEdBQUksc0JBQUpBLGlCQUFpQzs7Ozs7Ozs7cUJBVDFDOztPQU9JK0o7Ozs7T0FDQUM7T0FDQUM7OztFTjFCTDs7Ozs7Ozs7Ozs7Ozs7Ozs7R09vQkM7Ozs7O1lBaURJQyxxQkFBc0JDLFVBQVVDO0lBR2xDLFNBQU0sb0NBSDRCQTtLQU0zQjtPQU5pQkQ7S0FSRCxJQUFuQkUsWUFROEJEOztLQU5yQixJQUFURSxXQUFTLFdBRlREO0tBUThCRCxTQU45QkU7S0FFSiw0QkFJa0NGO0tBSmxDLE9BRklFOztJQWpCbUIsSUFBbkJDLFVBdUI4Qkg7O0lBdEJsQztLQUVlLElBQVRJLFNBQVMsV0FIWEQ7S0F1QjhCSCxTQXBCNUJJO0tBRUosNEJBa0JnQ0o7S0FsQmhDLE9BRklJOztVQUlEQzs7S0FnQjZCTCx5QkFmTyxrQ0FEcEM3RyxNQUMyQztLQUM5QyxnQ0FjZ0M2RztLQWJoQyxrQ0FIRzdHOztHQXNCaUI7WUFHcEJtSCxpQkFBaUJOLEtBQU0sT0FUdkJGLHdCQVNpQkUsS0FBOEM7WUFLL0RPLFVBQVdSLFVBVVRTO0lBTUksSUFBSkMsSUFBSSxxQkFOSkQ7T0FNQUMsc0JBRU8sT0FSUEQ7T0FNQUMscUJBSTZCO1dBSjdCQSxzQkFOQUQsTUF4QkZWLHFCQWNXQyxVQVVUUztHQVltQzt5Q0EzQnJDRixrQkFLQUM7OztFUG5GTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WVF3REtHLFVBQVV0TixHQUFJLDBDQUFKQSxHQUErQztZQUV6RHVOLFNBQVV4UDtJQUNKLElBQUpNLElBQUk7SUFBSkEsT0FEUU47SUFFWixPQURJTTtHQUVnQjtZQUVsQm1QLFNBQVUzTDtJQUNKLElBQUp3TCxJQUFJLGFBREl4TDs7TUFDUndMOztLQUtELE9BTlN4TDtJQUdzQyxzQ0FIdENBO0dBT1Q7WUFFRDRMLE9BQVF6TjtJQUFjO3dCQUFkQTtHQUFrRDtZQUUxRGlHLElBQUlsSSxHQUFFTTtJQUNSOztvQ0FEUUE7Ozs7Ozs7O2FBQ0Esa0JBREZOOztHQUNZO1lBRWhCMlAsUUFBUTNQLEdBQUVNO0lBQ1osS0FORW9QLE9BS1VwUDtLQUdGOztxQ0FIRUE7Ozs7Ozs7O2NBR0Msa0JBSEhOOzsyQkFBRU07Ozs7Ozs7O0lBRUUsT0FoQlptUCxTQWdCWSxXQUZKelA7R0FHYTs7O3FCQU5yQmtJLEtBRkF3SCxRQVRBRCxVQWNBRSxTQW5CQUgsVUFGQUQ7OztFUnhETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZU3dCS0ssYUFBVyxTQUFHO1lBRWRDLFNBQU92UCxVQUFPLFdBQVBBLEdBRlBzUCxPQUU2QjtZQUU3QkUsS0FBS3hQLEdBQUV5UCxhQUFVLFdBQVp6UCxHQUFFeVAsTUFBd0I7WUFFM0JDLE9BQU9DLE1BQUtDO0lBQ1osdUJBRE9EO2dCQUVKLGtCQUZTQztRQUdQSCxpQkFBSHpQO0lBQVksV0FBWkEsa0JUakNYLE9TOEJTMFAsT0FHS0QsTUFIT0c7R0FHNEI7WUFFeENoSSxJQUFJbEksR0FBRW1RO0lBQWUsdUJBQWZBO2dCQUNIO1FBQ0VKLGlCQUFIelA7SUFBdUIsb0JUckNsQyxPU21DUzRILElBQUlsSSxHQUVDK1A7SUFBUyxXQUFNLFdBRmhCL1AsR0FFRk07R0FBa0M7WUFFcEM4UCxXQUFXcFEsR0FBRW1RO0lBQVMsSUFBVEU7SUFBUztLQUFNLHVCQUFmQTtpQkFDVjtLQUVDLElBSFNOLGlCQUVYelAsY0FDRSxxQkFIT04sR0FFVE07O1VBR0tDO01BQUssV0FBTEEsa0JUNUNoQixPU3VDUzZQLFdBQVdwUSxHQUFFK1A7Ozs7R0FLMEI7WUFFdkNPLE9BQU90USxHQUFFbVE7SUFBUyxJQUFURTtJQUFTO0tBQU0sdUJBQWZBO2lCQUNOO1NBRE1OLGlCQUVQelA7S0FDRCxjQUhNTixHQUVMTTtNQUVDLFdBRkRBLGtCVGhEWCxPUzhDU2dRLE9BQU90USxHQUFFK1A7OztHQUtVO1lBRW5CUSxPQUFPSjtJQUFlLHVCQUFmQTtnQkFDSjtRQUNFSixpQkFBSHpQO0lBQ0wsT0ExQkcwUCxPQXlCRTFQLGtCVHZEWCxPU3FEU2lRLE9BRUtSO0dBQ2lCO1lBRXRCUyxTQUFTeFEsR0FBRW1RO0lBQWUsdUJBQWZBO2dCQUNSO1FBQ0VKLGlCQUFIelA7SUFDTyxvQlQ3RGxCLE9TMERTa1EsU0FBU3hRLEdBRUorUDtJQUNULE9BL0JJQyxPQStCRyxXQUhNaFEsR0FFUE07R0FDMkI7WUFJN0JtUSxVQUFVelEsR0FBRTBRLEtBQUlQO0lBQ3RCLElBRGtCUSxhQUFJTjtJQUN0QjtLQUFNLHVCQURnQkE7aUJBRVgsT0FGT007S0FJRjtNQUpNWjtNQUdaelA7TUFIUXNRLFFBSUYsV0FKQTVRLEdBQUUyUSxPQUdSclE7TUFIUXFRO01BQUlOOztHQUtJO1lBRXBCUSxLQUFLN1EsR0FBRW1RO0lBQ2IsSUFEYUU7SUFDYjtLQUFNLHVCQURPQTtpQkFFRjtTQUZFTixpQkFHSHpQO0tBQ0osV0FKS04sR0FHRE07U0FIRytQOztHQUtJO1lBRVhTLE9BQU85USxHQUFFK1E7SUFDVCx1QkFETy9RLEdBQUUrUTtnQkFFTDs0QkFDQ0Msa0JBQUgxUTtJQUFVLFdBQVZBLGtCVGxGWCxPUytFU3dRLE9BQU85USxHQUdGZ1I7R0FBNEI7WUFFckNDLFNBQVNDLElBQ1gsT0FBTSxXQURLQSxlQUtGO1lBRVBDLE9BQU9EO0lBQ0gsdUJBREdBO2dCQUtMO1FBSE9FLGlCQUFIOVE7SUFDSixlQURJQSxHQUFHOFE7R0FHSDtZQVdHeEQsT0FBT3lEO0lBQ2xCLElBUmlCbk0sVUFBS2dNLEtBT0pHO0lBTmxCO0tBQU0sdUJBRGdCSDtpQkFHbEIsT0FIYWhNO0tBS2IsSUFMa0JrTSxpQkFBTGhNLHNDQUFLOEw7O0dBUVA7WUFVSkksTUFBTXRSLEdBQUVxUjtJQUNuQixJQVRrQm5QLE9BQUVnUCxLQVFERztJQVBuQjtLQUFNLHVCQURjSDtpQkFHaEI7U0FIZ0JFLGlCQUlaOVE7S0FDSixXQUdhTixHQVJDa0MsR0FJVjVCO1NBSlU2QiwwQkFBRStPOztHQVNKO1lBVUxLLFdBQVd2UixHQUFFd1IsUUFBS0g7SUFDN0IsSUFUdUJuTSxPQVFDc00sUUFSSXRQLE9BQUVnUCxLQVFERztJQVA3QjtLQUFNLHVCQUR3Qkg7aUJBRzFCLE9BSG1CaE07S0FLUjtNQUxla007TUFJdEI5UTtNQUplOEUsU0FLUixXQUdPcEYsR0FSQ2tGLE1BQUtoRCxHQUlwQjVCO01BSm9CNkI7TUFBTCtDO01BQUtoRDtNQUFFZ1A7O0dBU0o7WUFFcEJPLFFBQVFDLEdBQUVSO0lBQ2hCLElBRGdCRTtJQUNoQjtLQUFNLHVCQURVQTtpQkFHWjtLQUVBLElBTFlDLGlCQUlSL1EsY0FDSixrQkFMVW9SLEdBSU5wUjtLQUNKO1NBTFk4UTs7R0FLTztZQUVqQk8sT0FBT0QsR0FBRVI7SUFDZixJQURlRTtJQUNmO0tBQU0sdUJBRFNBO2lCQUdYO0tBRUEsSUFMV0MsaUJBSVAvUSxjQUNKLGtCQUxTb1IsR0FJTHBSO0tBQ0o7U0FMVzhROztHQUtPO1lBRWhCUSxLQUFLRixHQUFFUjtJQUNiLElBRGFFO0lBQ2I7S0FBTSx1QkFET0E7aUJBR1Q7U0FIU0MsaUJBSUwvUTtLQUNELGNBTElvUixHQUlIcFIsSUFDUSxXQURSQTtTQUpLOFE7O0dBS3dCO1lBRS9CUyxTQUFTN1IsR0FBRWtSO0lBQ2pCLElBRGlCRTtJQUNqQjtLQUFNLHVCQURXQTtpQkFHYjtLQUVNLElBTE9DLGlCQUlUL1EsY0FJRjJPLFNBSEksV0FMS2pQLEdBSVBNO1FBSUYyTyxRQUNFLE9BREZBO1NBUldtQzs7R0FTSDtZQVNSVSxNQUFNOVIsR0FBRWtSLElBQUdhO0lBQ2pCLElBRGNYLFdBQUdZO0lBQ2pCO0tBQU0sdUJBRFFaO2lCQUdWO0tBRU0sSUFMSUMsaUJBSU4vUSxjQUNFLHFCQUxPMFI7bUJBT1Q7U0FQU0MsbUJBUUwxUjtLQUNKLFdBVElQLEdBSUpNLEdBSUlDO1NBUkU2USxhQUFHWTs7R0FVSTtZQUVmRSxXQUFXbFMsR0FBRWtGLE1BQUtnTSxJQUFHYTtJQUMzQixJQURtQjNNLGVBQUtnTSxXQUFHWTtJQUMzQjtLQUFNLHVCQURrQlo7aUJBR3BCLE9BSGVoTTtLQUtULElBTGNpTSxpQkFJaEIvUSxjQUNFLHFCQUxpQjBSO21CQU9uQixPQVBXNU07S0FTQTtNQVRRNk07TUFRZjFSO01BUk9pUixTQVNBLFdBVEZ4UixHQUFFb0YsUUFJWDlFLEdBSUlDO01BUk82RTtNQUFLZ007TUFBR1k7O0dBVUk7WUFFekJHLFNBQVNuUyxHQUFFa1IsSUFBR2E7SUFDcEIsSUFEaUJYLFdBQUdZO0lBQ3BCO0tBQU0sdUJBRFdaO2lCQUdiO0tBRU0sSUFMT0MsaUJBSVQvUSxjQUNFLHFCQUxVMFI7bUJBT1o7S0FFQSxJQVRZQyxtQkFRUjFSLGdCQUNKLGtCQVRPUCxHQUlQTSxHQUlJQztLQUNKO1NBVFM2USxhQUFHWTs7R0FTYTtZQUUzQkksUUFBUXBTLEdBQUVrUixJQUFHYTtJQUNuQixJQURnQlgsV0FBR1k7SUFDbkI7S0FBTSx1QkFEVVo7aUJBR1o7S0FFTSxJQUxNQyxpQkFJUi9RLGNBQ0UscUJBTFMwUjttQkFPWDtLQUVBLElBVFdDLG1CQVFQMVIsZ0JBQ0osa0JBVE1QLEdBSU5NLEdBSUlDO0tBQ0o7U0FUUTZRLGFBQUdZOztHQVNhO1lBRTFCM0osTUFBTWdLLElBQUduQixJQUFHYTtJQUNsQixJQURlWCxXQUFHWTtJQUNsQjtLQUFNLHVCQURTWixVQUNILHFCQURNWTs7O09BS2Q7UUFMY0M7UUFJSTFSO1FBSlA4UTtRQUlQL1E7UUFDSixrQkFMUStSLElBSUovUixHQUFjQztPQUNsQjtXQUxXNlEsYUFBR1k7Ozs7d0JBR2Q7S0FLQTs7R0FBSztZQUVIcEosUUFBUTBKLEtBQUlwQixJQUFHYTtJQUNyQixJQURrQlgsV0FBR1k7SUFDckI7S0FBTSx1QkFEWVosVUFDTixxQkFEU1k7O1NBQUhYLGlCQUlWL1E7bUJBTUo7S0FMUSxJQUxTMlIsbUJBSUMxUixnQkFDZHlDLElBQUksV0FMRXNQLEtBSU5oUyxHQUFjQztLQUVsQixTQURJeUMsR0FDVyxPQURYQTtTQUxVb08sYUFBR1k7O0dBVWY7WUFNQU8sU0FBU3ZTLEdBQUVrQyxHQUFFc1E7SUFDbkIsR0FEaUJ0USxLQUFFc1EsR0FLakI7ZUFMZXRRO0lBRUosb0JUclBoQixPU21QU3FRLFNBQVN2UyxTQUFJd1M7SUFDTCxXQUNOLFdBRk94UyxHQUFFa0M7R0FLWjtZQUVIdVEsS0FBS2hSLEdBQUV6QjtJQUNULE9BRE95QixHQUVMOztJQUVBLHNCVDlQTCxPU21QUzhRLFNBT0d2UyxTQUFGeUI7R0FJUztZQUVWaVIsT0FBT3BTO0lBQ2IsV0FEYUEsa0JUaFFoQixPU2dRU29TLE9BQU9wUztHQUNLO1lBRVpxUyxRQUFRM1M7SUFDSCxvQlRwUWQsT1NtUVMyUyxRQUFRM1M7SUFDZCxXQUFNLFdBRFFBO0dBQ087WUFNZjRTLGVBQWUxQjtJQUNyQjtXQTdPTWxCLE9BNE9la0IsbUJUMVF4QixPUzBRUzBCLGVBQWUxQjtHQUNXO1lBTzlCMkIsTUFBTTNCO0lBQ0YsdUJBREVBO2dCQUdKO1FBQ09FLGlCQUFIOVE7SUFDZ0Isb0JUdlIzQixPUzBRU3NTLGVBUUUxQjtJQUtKLFdBREk1USxrQlR0UlgsT1M4QlMwUCxPQXdQS29CO0dBQ2lDO1lBTXRDMEIsU0FBUzlTLEdBQUVNO0lBQ1QsSUFBSkMsSUFBSSxXQURPUCxHQUFFTTtJQUVqQixXQURJQyxrQlQ5UlAsT1M2UlN1UyxTQUFTOVMsR0FDWE87R0FDa0I7WUFXcEJ3UyxRQUFRL1MsR0FBRU07SUFDTCxvQlQzU1YsT1M2UlN3UyxTQWFJOVMsR0FBRU07SUFDTCxzQlQzU1YsV1MwU2VBO0dBQ1M7WUFJZjBTLFNBQVNoVCxHQUFFa0MsR0FBRWdQO0lBQ2IsdUJBRGFBO2dCQUdmO0lBRUEsSUFET0UsaUJBQUg5USxjQUNKLE9BTGE0QjtJQUtBLG9CVHBUcEIsT1MrU1M4USxTQUFTaFQsU0FJSm9SO0lBQ1AsV0FBTSxXQUxLcFIsR0FBRWtDLEdBSVQ1QjtHQUM2QjtZQUUxQjJTLEtBQUtqVCxHQUFFa1I7SUFDbEI7MEJUdlRILE9TK1NTOEIsU0FPVWhULFNBQUVrUjtHQUNIO1lBUVRnQyxVQUFVbFQsR0FBRUcsR0FBRStRO0lBQ2QsdUJBRGNBO2dCQUdoQjtJQUVRLElBRERFLGlCQUFIOVEsY0FDQTZTLE1BQUksV0FMSW5ULEdBQUVHLEdBSVZHO0lBRUosV0FESTZTLG9CVHBVWCxPUytUU0QsVUFBVWxULEdBS1JtVCxLQURHL0I7R0FFbUI7WUFFNUJnQyxLQUFLcFQsR0FBRUcsR0FBRStRO0lBQ0osa0JUeFVWLE9TK1RTZ0MsVUFRQ2xULEdBQUVHLEdBQUUrUTtJQUNKLHFCVHhVVixXU3VVWS9RO0dBQ2dCO1lBS25Ca1QsU0FBUzVSLEdBQUV5UDtJQUNqQixhQURlelA7Y0FyVGJtTzs7O2NBMFRRLHVCQUxPc0I7MEJBT1Q7a0JBQ09FLGlCQUFIOVE7Y0FDSixXQURJQSxHQVJOK1MsU0FBUzVSLFdBUUEyUDthQUNvQjs7WUFFakNrQyxLQUFLN1IsR0FBRXlQO0lBQ1QsR0FET3pQLE9BQ087V0FaUjRSLFNBV0M1UixHQUFFeVA7R0FFSTtZQW9CWHFDLEtBQUs5UixHQUFFeVA7SUFDVCxZQURPelA7OztnQkFBRXlQOzs7Z0JBTUwsSUFwQmFzQyxNQWNWL1IsR0FkWTJQLE9BY1ZGO2dCQWJUO2lCQUFNLHVCQURhRTs2QkFHZjtpQkFFQSxJQUxlQyxpQkFLWG9DLE1BTFNEO2lCQU1iLFNBRElDLEtBRUYsa0JBUGFwQztxQkFBRm1DLE1BS1RDLEtBTFdyQzs7ZUFvQkE7Y0FMTDtHQUtLO1lBRWJzQyxXQUFXaEMsR0FBRVI7SUFDYix1QkFEYUE7Z0JBR2Y7UUFDT0UsaUJBQUg5UTtJQUNELGtCQUxVb1IsR0FJVHBSO21DVDFYWCxPU3NYU29ULFdBQVdoQyxHQUlOTjs7R0FDdUM7WUFFNUN1QyxXQUFXakMsR0FBRVI7SUFDbkIsSUFEbUJFO0lBQ25CO0tBQU0sSUFHSndDLE9BSEksV0FEYXhDO1VBSWpCd0MsTUFERTtTQUhldkMsT0FJakJ1QyxTQUFNdFQsSUFBTnNUO0tBQ0ssZ0JBTFVsQyxHQUlUcFIsSUFDZ0MsT0FEdENzVDtTQUppQnhDOztHQUt5QjtZQUV0Q3lDLE1BQU14QixJQUFHbkI7SUFDVCx1QkFEU0E7Z0JBR1g7SUFFMEQsSUFEbkRFLGlCQUFIOVEsY0FDc0QsaUJBTGxEK1IsSUFJSi9SO0lBQzBDLGtCVHpZckQsT1M2WFNxVCxnQkFXS3ZDO0lBQzhCLGtCVHpZNUMsT1NvWVN5QyxNQUFNeEI7SUFLaUIscUJBTGpCQSxJQUlKL1I7SUFDUyxrQlR6WXBCLE9Tc1hTb1QsZ0JBa0JLdEM7SUFDUCx5QlR6WVAsV1N3WVc5UTtHQUNpRTtHQUUzRTs7O0lBU013VDtZQWNBQztJQUdBO0dBQWtCO1lBaUJoQkMsUUFBUTlDO2FBekJEaUM7S0EyQkwsdUJBRk1qQztpQkFJUjtTQUNPRSxpQkFBSDlRO0tBQ0osV0FESUEsR0FMSjBULFFBS081QztJQUNhO0lBOUJkLElBTkdqUixJQU1ILFdBVlIyVCxTQVNTWDtJQUNEO29DQU5HaFQ7O29DQUNILE9BREdBO0tBQ0gsdUNBREdBO0dBcUNkO1lBRUs4VCxLQUFLL0M7YUFwQkRsUjtLQXNCRix1QkFGR2tSO2lCQUlMO1NBQ09FLGlCQUFIOVE7S0FDSixXQURJQSxHQUxKMlQsS0FLTzdDO0lBQ1U7SUF6QlIsSUFBVDhDLFNBQVMsNkJBRExsVTtJQUVSO0tBSVUsSUFBSkEsSUFBSSw2QkFMTmtVLFFBVkZIO0tBZ0JBLGtCQURJL1QsTUFDRDtHQW9CTjtZQUdLbVUsSUFBSWpELElBQUdhO0lBQ1AsdUJBREliO2dCQUdOO0lBRU0sSUFEQ0UsaUJBQUg5USxjQUNFLHFCQUxHeVI7a0JBT0w7UUFDT0MsbUJBQUh6UjtJQUNKLGVBTEFELEdBSUlDLGtCVGpkZixPU3ljUzRULElBSUsvQyxNQUlJWTtHQUNpQjtZQUUxQm9DLEtBQUtwVSxHQUFFa1IsSUFBR2E7SUFDVix1QkFET2I7Z0JBR1Q7SUFFTSxJQURDRSxpQkFBSDlRLGNBQ0UscUJBTE15UjtrQkFPUjtRQUNPQyxtQkFBSHpSO0lBQ1Msa0JUN2R4QixPU29kUzZULEtBQUtwVSxHQUlBb1IsTUFJSVk7SUFDUCxXQUFNLFdBVEhoUyxHQUlITSxHQUlJQztHQUNzQjtZQUU1QjhULFdBQVduRCxJQUFHYTtJQUNkLHVCQURXYjtnQkFHYixrQkFIZ0JhO1FBSVRYLGlCQUFIOVE7SUFDSixXQURJQSxpQlRuZVgsT1MrZFMrVCxXQUFjdEMsSUFJVFg7R0FDbUI7WUE0QjVCa0QsY0FBY2hDLEtBQUloUyxHQUFFNFEsSUFBRzNRLEdBQUV3UjtJQUMzQixXQUFHLFdBRGFPLEtBQUloUyxHQUFLQzs7OztlQWJuQix1QkFhcUJ3UjsyQkFYdkIsV0FXZ0J6UixHQUFFNFE7bUJBVlhjLGlCQUFIelI7ZUFDSixPQVNGK1QsY0FBY2hDLEtBQUloUyxHQUFFNFEsSUFWZDNRLEdBQUd5Ujs7O2NBVVMxUjs7ZUFOZCx1QkFNZ0I0UTsyQkFKbEIsV0FJcUIzUSxHQUFFd1I7bUJBSGhCWCxpQkFBSDlRO2VBQ0osT0FFRmdVLGNBQWNoQyxLQUhSaFMsR0FBRzhRLE1BR2M3USxHQUFFd1I7O0dBSVc7WUFFcEN3QyxhQUFhakMsS0FBSXBCLElBQUdhO0lBQ3RCLElBQU0sbUJBRGFiLFFBQ1AscUJBRFVhOzs7VUFPS0MsbUJBQUh6UixnQkFBWDZRLGlCQUFIOVE7TUFDSixPQWRKZ1UsY0FNYWhDLEtBT0xoUyxHQUFHOFEsTUFBVzdRLEdBQUd5Ujs7U0FIbEJoUDs7dUJBREgsY0FDR0E7SUFFSCxPQUZHQTtHQUl3QjtZQUczQndSLFFBQVFDO0lBQ1IsdUJBRFFBO2dCQUdWO1FBQ1lDLGtCQUFQcFU7SUFDTCxXQURLQSxpQlRyaEJaLE9TaWhCU2tVLFFBSVVFO0dBQ1M7WUFFbkJDLFFBQVFGO0lBQ1IsdUJBRFFBO2dCQUdWO1FBQ1lDLGtCQUFKblU7SUFDUixXQURRQSxpQlQ1aEJmLE9Td2hCU29VLFFBSVVEO0dBQ1M7WUFFdkJFLE1BQU1IO0lBQ0ssa0JUaGlCaEIsT1N3aEJTRSxRQU9FRjtJQUNSLHlCVGhpQkgsT1NpaEJTRCxRQWNFQztHQUNnQjtZQVFsQkkseUJBQXlCN1UsR0FBRWtSO0lBQ2pDLElBRGlDRTtJQUNqQztLQUFNLHVCQUQyQkE7aUJBRzdCO0tBRU0sSUFMdUJDLGlCQUl6Qi9RLGNBQ0UscUJBTHFCTixHQUl2Qk07O1VBRVVDO01BQ1Y7Y0FEVUE7NEJUOWlCckIsT1N3aUJTc1UseUJBQXlCN1UsR0FBRXFSOzs7O0dBU087WUFFbEN5RCwwQkFBMEI5VSxHQUFFa1I7SUFDbEMsSUFEa0NFO0lBQ2xDO0tBQU0sdUJBRDRCQTtpQkFHOUI7S0FFTSxJQURDQyxpQkFBSC9RLGNBQ0UscUJBTHNCTixHQUl4Qk07OEJBSjBCOFEsT0FJdkJDO1NBSVEwRDtLQUNYO2FBRFdBOzJCVDNqQnRCLE9TbWpCU0QsMEJBQTBCOVUsR0FJckJxUjs7R0FLcUM7WUFFOUMyRCxjQUFjaFYsR0FBRWtSO0lBRWxCLGtCVGhrQkgsT1NtakJTNEQsMEJBV1U5VSxHQUFFa1I7SUFDbEI7MEJUL2pCSCxPU3dpQlMyRCx5QkFzQlU3VSxHQUFFa1I7O0dBRVk7WUFFNUIrRCxVQUFVdkQsR0FBRVI7aUJBQ1c1USxHQUFLLFdBQUksV0FEdEJvUixHQUNhcFIsR0FBYztJQUExQixrQlRua0JoQixPUzhDU2dRLFlBb2hCUVk7SUFDZCx5QlRua0JILE9TOENTWixPQW9oQk1vQixHQUFFUjtHQUM2QjtZQVd6Q2dFLEtBQUtDO0lBQ1AsT0FoREVQLG9CVC9oQkwsT1N1Q1N4RSxXQW9ESmUsUUFtZktnRTtHQUNzQjtZQUV2QkMsVUFBVUQ7SUFDaEIsSUFBbUIsUUFKakJELEtBR2NDLE1BQ0xFLGtCQUFQQztJQUNELEtBL2ZEckUsU0E4ZkVxRTtLQU1GLFdBTkVBLHFCVGxsQlAsT1NpbEJTRixVQUNLQztJQUVGLEdBaGdCUHBFLFNBOGZTb0UsUUFHVDtJQURBO0dBSTZCO2dCQU1mRSxZQUFXSjtJQUNyQix1QkFEcUJBO2dCQXVCdkIsT0FwQ0VDLFVBYVVHO0lBR0EsSUFESkMsa0JBQUp0RSxlQUNRLHFCQURSQTs7S0FTbUI7TUFQWkU7TUFBSDlRO01BT2UsVUEzQnpCNFUsS0FnQmNLO01BV0dGO01BQVBDO01BQzBCLG9CVDFtQnpDLFdTa21Ca0JsRSxNQU9JaUU7TUFDUyxvQlQxbUIvQixnQlNnbUJlRztLQVVKLHlCVDFtQlgsV1NrbUJlbFYsR0FPQWdWOztJQU1lO2VBakN6QkosS0FnQmNLO0tBaUJHRTtLQUFQQztJQUNKLFdBRElBLHVCVC9tQmYsV1MrbUJzQkQsU0FmUEQ7R0FxQmU7WUFrQnpCRyxZQUFZM1YsR0FBRWtSLElBQUdhO2lCQUVSelI7a0JBQ0VDLEdBQ1Asa0JBSlFQLEdBRUhNLEdBQ0VDLEdBQ0Y7S0FESCxxQlQxb0JYLE9TbUNTMkgsU0FvbUJhNko7SUFLWDtJQUpVLFNBSk5vRCxTVHBvQmYsT1NtQ1NqTixTQW9tQlVnSjtJQUZoQixrQlRyb0JILFdTd0JLdEIsT0E0bUJVdUY7SUFJTCxxQlR4b0JWLE9TcURTNUU7R0F5bEJKO1lBRUFxRixRQUFRMUUsSUFBR2E7SUFDYixPQVZFNEQscUJBVWVyVixHQUFFQyxHQUFLLFdBQVBELEdBQUVDLEdBQVcsR0FEcEIyUSxJQUFHYTtHQUN3QjtZQUVuQzhELGFBQWFDO2FBQ1A5UztLQUNBLHVCQUZPOFM7aUJBSVQ7U0FDR3hWO0tBQ0gsV0FER0EsR0FKRDBDO0lBS1M7SUFFakIsT0FQUUE7R0FPUDtZQUVDK1MsYUFBYTdFO0lBQ1AsSUFBSi9RLFFBRFcrUTtJQUVmO0tBQ1EsdUJBRkovUTtpQkFJRTtTQUNPK1EsZUFBSDVRO0tBTE5ILE9BS1MrUTtLQUVQLFdBRkk1USxHQUVFOztZQUlOMFYsS0FBSzlUO0lBQ1gsVUFEV0E7SUFDWCxXQURXQSxpQlR6cUJkLE9TeXFCUzhUO0dBQ2dCOzs7O09BdGxCcEIvRTtPQU9BRTtPQWdCU3ZEO09BbkNMaUQ7T0FQQUo7T0FxREthO09BV0FDO09BR0xFO09BT0FFO09BT0FDO09BT0FDO09Ba0JBQztPQVlBSTtPQVlBQztPQVdBQztPQVdBL0o7T0FVQU87T0EzTUpnSDtPQUVBQztPQUVBQztPQThOQTJDO09BM0tJM0I7T0FpTEE0QjtPQUdBQztPQWVKRTtPQXdCQUU7T0F2UUk3SztPQW1SSytLO09BeFFMM0M7T0FQQUY7T0FnU0pnRDtPQWlCQUU7T0FzQkFDO09BUUlHO09BT0FDO09BT0FFO09Ba0RBRzs7T0FTQUM7T0FrSkFtQjtPQW5qQkFwRjtPQXVCQU87T0FLQUM7O09BK1lBMkQ7T0FXQUM7T0FXQUM7T0F1Q0pFO09BMElBcUI7T0FUQUQ7T0F4R0FmOztPQStCQUk7T0FJQUM7T0FpRkFZO09BVUFFO09BWUlDOzs7RVR6cUJUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WVdrQktlLEdBQUdqVCxHQUFJLFdBQUpBLEdBQVE7WUFDWGtULE1BQU1oUCxHQUFJLFdBQUpBLEdBQVc7WUFDakJtTyxNQUFNMVIsR0FBRzJSO0lBQVUsU0FBYjNSLE1BQWlELE9BQTlDMlI7UUFBMEJ0UyxJQUE3Qlc7SUFBa0MsT0FBTFg7R0FBMkI7WUFDOURtVDtJQUFTLG1CQUFnQztRQUFwQm5UO0lBQUssT0FBTEE7R0FBbUQ7WUFDeEVvVDtJQUFZLG1CQUFnQztRQUFqQmxQO0lBQUssT0FBTEE7R0FBNkM7WUFDeEVzTyxLQUFLN1IsR0FBRXpFO0lBQUksU0FBTnlFLE1BQWlELE9BQWpEQTtRQUFzQlgsSUFBdEJXO0lBQTJCLGtCQUF6QnpFLEdBQW9COEQ7R0FBNEI7WUFDdkR5UyxLQUE0QnZPLEdBQXJCLFNBQXFCQSxNQUFnQixPQUFoQkEsT0FBVHZELElBQVN1RCxNQUFKLE9BQUx2RCxFQUEwQjtZQUM3Q3lELElBQUlsSSxHQUFnQ2dJO0lYekJ6QyxTV3lCeUNBLE1BQWdCLE9BQWhCQTtRQUFoQmxFLElBQWdCa0U7SUFBWCxXQUFHLFdBQXhCaEksR0FBZ0I4RDs7WUFDcEJxVCxVQUFVblgsR0FBc0M4RDtJWDFCckQsU1cwQnFEQSxNQUFhLE9BQWJBO1FBQW5Ca0UsSUFBbUJsRTtJQUFkLFdBQU0sV0FBOUI5RCxHQUFtQmdJOztZQUM3QkksS0FBTTJPLElBQUlDO0lYM0JmLHVCVzJCbUNsVCxjQUFLLGtCQUE3QmlULElBQXdCalQ7UUFBa0JrRTtJQUFLLGtCQUEzQ2dQLE9BQXNDaFA7O1lBQ2hENkksS0FBSzdRO0lYNUJWLG1CVzRCZ0Q7UUFBdEI4RDtJQUFLLGtCQUFyQjlELEdBQWdCOEQ7O1lBQ3JCc1QsV0FBV3BYO0lYN0JoQixtQlc2QnNEO1FBQW5CZ0k7SUFBSyxrQkFBeEJoSSxHQUFtQmdJOztZQUM5QnFQLGFBQVEsOEJBQXdDO1lBQ2hEQyxnQkFBVyw4QkFBd0M7WUFFbkRqUCxNQUFPME8sSUFBSUMsT0FBTU8sSUFBR0M7SUFBSyxTQUFSRDtTQUNoQlosS0FEZ0JZO2NBQUdDLFdBQ1poUCxLQURZZ1AsT0FDTixrQkFEUFQsSUFDTkosSUFBT25POzs7U0FDSmlQLEtBRmFGO2NBQUdDLFdBRU5sUCxLQUZNa1AsT0FFQSxrQkFGVFIsT0FFUFMsSUFBVW5QOztJQUNSO0dBQUs7WUFFWE0sUUFBU21PLElBQUlDLE9BQU1PLElBQUdDO0lBQUssU0FBUkQ7U0FDbEJaLEtBRGtCWTtjQUFHQyxPQUdQO1NBRlBoUCxLQURjZ1A7S0FDUixrQkFETFQsSUFDUkosSUFBT25POztRQUNKaVAsS0FGZUY7YUFBR0MsT0FJUDtRQUZEbFAsS0FGUWtQO0lBRUYsa0JBRlBSLE9BRVRTLElBQVVuUDtHQUVFO1lBRWhCb1A7SUFBWSxtQkFBcUM7UUFBekI1VDtJQUFLLFdBQUxBO0dBQTZCO1lBQ3JEK1M7SUFBVSxtQkFBa0M7UUFBdEIvUztJQUFLLFdBQUxBO0dBQXdCO1lBQzlDZ1Q7SUFBUyxtQkFBMkM7UUFBL0JoVDtJQUFLLGtDQUFMQTtHQUF3Qzs7OztPQTVCN0RpVDtPQUNBQztPQUNBYjtPQUNBYztPQUNBQztPQUNBWjtPQUNBQztPQUNBck87T0FDQWlQO09BQ0EvTztPQUNBeUk7T0FDQXVHO09BQ0FDO09BQ0FDO09BRUFqUDtPQUtBTztPQU1BOE87T0FDQWI7T0FDQUM7OztFWDlDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lhcUJLblksSUFBSThDO0lBQ04sUUFETUEsZUFDK0MsT0FEL0NBO0lBQ21CO0dBQXdDO1lBTy9Eb1csUUFPQTdVO0lBUFU7YUFPVkE7a0JBTFE7Y0FLUkE7OztpQkFOUTs7O2lCQU1SQTs7O1FBRFE7O1FBRkE7O1FBREE7O1FBRUE7OztLQUdFLElBQUptUSxNQUFJOzJCQUFKQSxRQUROblE7aUNBQ01tUTs7SUFLSSxJQUFKaFQsSUFBSTswQkFBSkE7c0NBTk42QzswQkFNTTdDLGFBTk42QzswQkFNTTdDLFlBTk42QztnQ0FNTTdDO0dBS2M7WUFFcEIyWCxnQkFDQTlVLEdBRGtCLFlBQ2xCQSw4QkFDTTtZQUVOK1UsZ0JBQ0EvVSxHQURrQixZQUNsQkEsOEJBQ007WUFJTjRGLFFBQVFvUCxJQUFHQyxJQUFLLE9BQVJELEtBQUdDLE9BQXNCO1lBQ2pDNVAsTUFBTzJQLElBQVFDLElBQVMsY0FBakJELEtBQVFDLGdCQUEwQjs7O1VBdkN6Q3RaLEtBUUFrWixTQW9CQUMsaUJBSUFDLGlCQU1BblAsU0FDQVA7OztFYjVETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lja0JLNlA7SUFDQUM7Ozs7Ozs7Ozs7SUFNQTlYO0lBQ0FHO0lBQ0E0WDtJQUNBQztJQUVBQztJQUNBQztZQUVBQyxLQUFLekg7SUFDUCxPQURPQTtjQUxMc0g7Y0FLS3RILHNDQWRMb0gsZUFjS3BIO0dBR0Y7WUFFSDBILEtBQUsxSDtJQUNQLE9BRE9BO2NBWExxSDtjQVdLckgsZ0NBcEJMbUgsZUFvQktuSDtHQUdGO1lBRUgySCxTQUFTeFc7SUFBSSxlQUFKQTs7Ozs7O0dBQThEO1lBQ3ZFeVcsT0FBT3pXO0lBQUksR0FEWHdXLFNBQ094VyxJQUF1QixPQUF2QkE7SUF4QlE7OzsyQ0F3QlJBO0lBQTBDO0dBQWM7WUFJL0QwVyxRQUFRN0gsR0FBSSxPQUFKQSxnQkFBVztZQUNuQjhILFFBQVE3VixHQUFJLE9BQUpBLEVBQWU7WUFDdkI4VixRQUFRL0g7SUFDVixVQURVQSxHQUVWLE9BRlVBO0lBN0JrQjs7OztpQ0E2QmxCQTs7S0E3QmtCO0lBOEJBO0dBQ1g7WUFFZmdJLG9CZHRETDtZY3dESzFRLGdCZHhETDtPY3lES087WUFDQW9RLFVkMURMO1ljeUVjQyxvQkFBb0JDLEdBQUksY0FBSkEsc0JBQXlCO1lBQzdDQyxrQkFBa0JELEdBQUksUUFBSkEsa0JBQWtDO1lBQ3BERSxpQkFBaUJGLEdBQUksT0FBSkEsYUFBbUM7WUFDcERHLFdBQVc1WCxHQUFFc1AsR0FBSSxZQUFOdFAsV0FBRXNQLEVBQThDO1lBQzNEdUksbUJBQW1CN1gsR0FBSSxPQUFKQSxnQkFBK0I7WUFFM0Q4WCxrQkFLRnhJO0lBTHdCLE9BS3hCQSxHQUpnQjtJQUNULFVBR1BBLEdBSHNCO0lBQ2YsV0FFUEEsR0FGc0I7SUFDZixZQUNQQSxHQURzQjtJQUNmLGFBQVBBO0tBQ0s7SUFEbUI7R0FDUDtZQUVmeUksbUJBR0Z6STtJQUh5QixPQUd6QkEsR0FGZ0I7SUFDVCxZQUNQQSxHQURzQjtJQUNmLGFBQVBBO0tBQ0s7SUFEbUI7R0FDUDtxQmQzRnBCOzs7O09jeUJLMVE7T0FDQUc7T0FJQThYO09BQ0FDO09BRUFDO09BS0FDO09BS0FDO09BQ0FDO3FCZDVDTDs7T2NnREtDO09BQ0FDO09BQ0FDO09BSUFDO09BRUExUTtPQUNBTztPQUNBb1E7T0FlU0M7T0FFQUc7T0FEQUQ7T0FFQUU7T0FDQUM7T0FFVEM7T0FRQUM7OztFZHZGTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WWV5Qks1TCxPQUFPNkw7SUFBSSxJQUpJL1YsaUJBSVIrVjs7aUJBSEQsT0FEUy9WO0tBRVAsSUFBTHpCLGNBQUssUUFGT3lCLGtDQUVaekI7O0dBRXNCO1lBRXpCNk4sS0FBSzFNLEdBQUVuQixHQUFJLFdBQU5tQixHQUFFbkIsR0FBUTtZQUVmTztJQUFLLFlBQ0M7UUFDTlk7SUFBUSxPQUFSQTtHQUFTO1lBRVRiO0lBQUssWUFDQztRQUNITjtJQUFLLE9BQUxBO0dBQU07WUFFVHlYLElBRWN6WCxHQUFFUjtJQURsQixPQUNrQkEsR0FESjtRQUNFZ1ksU0FBRWpHO0lBQ2hCO1VBRGNpRyxLQUVOO1NBRk1FLGNBR1p2VyxJQUhZcVc7S0FHSixTQUhNakcsS0FHUSxPQUF0QnBRO0tBQTZCLElBSGZxUSxtQkFBRmdHLFdBQUVqRzs7R0FJSjtZQUVab0csUUFFYzNYLEdBQUVSO0lBRGxCLE9BQ2tCQSxHQURKO1FBQ0VnWSxTQUFFakc7SUFDaEI7VUFEY2lHLEtBRU47U0FGTUUsY0FHWnZXLElBSFlxVztLQUdKLFNBSE1qRyxLQUdRLFdBQXRCcFE7S0FBa0MsSUFIcEJxUSxtQkFBRmdHLFdBQUVqRzs7R0FJSjtPQUVaeEQ7WUFFSTZKLFdBQVd2WSxJQUFHQztJQUNwQixJQURpQnVZLFdBQUdDO0lBQ3BCO1VBRGlCRCxNQUVULE9BRllDO0tBR0s7TUFIUkM7TUFHZjVXLElBSGUwVztNQUFHRyxXQUdsQjdXLEdBSGtCMlc7TUFBSEQ7TUFBR0M7O0dBR2M7WUFFaENHLElBQUlqWSxHQUFJLE9BTEo0WCxXQUtBNVgsTUFBbUI7WUFNbkJzUSxTQUFTclEsR0FBRVQsR0FBRXpCO0lBQ25CLEdBRGlCeUIsS0FBRlMsR0FDQTtJQUVMLElBQUp1QyxJQUFJLFdBSFN6RSxHQUFKa0M7SUFJYixXQURJdUMsR0FIQThOLFNBQVNyUSxXQUFFVCxHQUFFekI7R0FJTTtPQUV2Qm1hO1lBT0ExSCxLQUFLL08sS0FBSTFEO0lBQ1gsT0FETzBELEtBQ1M7T0FSZHlXLHNCQU9LelcsS0FHRixPQWhCQzZPLFlBYUM3TyxLQUFJMUQ7UUFqQlkwUSxTQUFJeE87SUFDM0I7UUFnQk93QixPQWpCb0J4QixHQW1CVSxPQXJCbkNnWSxJQUVxQnhKO0tBRUQ7TUFGS3ZPO01BQUp3TyxZQUVBLFdBZVozUSxHQWpCZ0JrQyxJQUFKd087O01BQUl4Tzs7R0FvQk47WUFFZmtZO0lBQVUsWUFDUjtJQUNNLElBQVQzVixjQUFIeEMsY0FBWSxNQUZSbVksUUFFRDNWO0lBQVMsOEJBQVp4QztHQUFxQjtZQUlqQmlHLElBQUlsSTtJZjFGYixZZTJGVztJQUNVLElBQWJpQyxjQUFIbUIsY0FBWXFCLElBQUksV0FGUnpFLEdBRVJvRDtJQUF1QixXQUFYcUIsR0FGUnlELElBQUlsSSxHQUVMaUM7O2dCQUVNQyxHQUFFbEM7SWY5RmhCLFllK0ZXO0lBQ1UsSUFBYmlDLGNBQUhtQixjQUFZcUIsSUFBSSxXQUZMekUsR0FBRmtDLEdBRVRrQjtJQUF5QixXQUFicUIsT0FGSHZDLFdBQUVsQyxHQUVSaUM7O1lBRUhnUixLQUFLalQsR0FBRWlDLEdBQUksY0FBTmpDLEdBQUVpQyxHQUFjO1lBRXJCb1ksUUFBUXJhLEdBQUVpQztJQUNaLElBQWVpRCxrQkFESGpEOztpQkFFRixPQURLaUQ7S0FFSTtNQUFadVU7TUFBSHJXO01BQWUsYUFBQyxXQUhWcEQsR0FHTm9ELElBRlc4Qjs7Y0FFUnVVOztHQUVJO1lBR0w1SSxLQUFLN1E7OzttQkFDSDtTQUNIaUMsZ0JBQUhtQjtLQUFRLFdBRkNwRCxHQUVUb0Q7bUJBQUduQjs7O1lBTUhxUCxNQUFNdFIsR0FBRXlaO0lBQUksSUFKRnZYLGVBSUZ1WDs7aUJBSEY7U0FDSHhYLGNBQUhtQjtLQUFRLFdBRUZwRCxHQUpJa0MsR0FFVmtCO2VBRlVsQiw0QkFFUEQ7O0dBRW9CO1lBRW5Cd08sVUFBVXpRLEdBQUVrRixNQUFLakQ7SUFDdkIsSUFEa0JtRCxlQUFLcVU7SUFDdkI7VUFEdUJBLEtBRWYsT0FGVXJVO0tBR0k7TUFIQ3VVO01BR3JCdlcsSUFIcUJxVztNQUFMakksU0FHSSxXQUhOeFIsR0FBRW9GLFFBR2hCaEM7TUFIZ0JnQztNQUFLcVU7O0dBR1c7WUFFNUJhLFdBQVd0YSxHQUFFaUMsR0FBRWlEO0lBQ3JCLEtBRG1CakQsR0FFWCxPQUZhaUQ7UUFHaEJ1VSxNQUhjeFgsTUFHakJtQixJQUhpQm5CO0lBR0wsa0JBSEdqQyxHQUdmb0QsR0FISWtYLFdBQVd0YSxHQUdaeVosS0FIZ0J2VTtHQUdjO1lBRTdCa1AsS0FBS3BVLEdBQUVzQixJQUFHQztJQUNoQixHQURhRDtRQUFHQztNQUdjO09BQWZ3WSxPQUhDeFk7T0FHTGdaLEtBSEtoWjtPQUdUdVksT0FITXhZO09BR1ZrWixLQUhVbFo7T0FHYW1ELElBQUksV0FIbkJ6RSxHQUdSd2EsSUFBUUQ7TUFBOEIsV0FBZjlWLEdBSHBCMlAsS0FBS3BVLEdBR0o4WixNQUFRQzs7O2NBSEN4WSxJQUVGO0lBRUY7R0FBdUI7WUFFakNrWixTQUFTemEsR0FDVXNCLElBQUdDO0lBQXhCLElBQWdCMkQsVUFBSzRVLFdBQUdDO0lBQ3RCO1FBRG1CRDtTQUFHQztPQUdRO1FBSFJFO1FBR1hNLEtBSFdSO1FBQUhDO1FBR2hCUSxLQUhnQlY7UUFBTDFVLGFBR2lCLFdBSnRCcEYsR0FJTndhLElBQVFELEtBSEdyVjs7UUFBSzRVO1FBQUdDOzs7O3FCQUVSLE9BRkE3VTtLQUlGOztHQUVFO1lBR1Y0TSxNQUFNOVIsR0FBRXNCLElBQUdDO0lBQ2pCLElBRGN1WSxXQUFHQztJQUNqQjtRQURjRDtTQUFHQzsyQkFHTlEsS0FITVIsU0FBSEMsZ0JBR1hRLEtBSFdWO09BR1EsV0FIVjlaLEdBR1R3YSxJQUFRRDtXQUhHVCxhQUFHQzs7OztxQkFFSDtLQUVGOztHQUF3QjtZQUU5QjdILFdBQVdsUyxHQUFFa0YsTUFBSzVELElBQUdDO0lBQzNCLElBRG1CNkQsZUFBSzBVLFdBQUdDO0lBQzNCO1FBRHdCRDtTQUFHQztPQUdRO1FBSFJFO1FBR2hCTSxLQUhnQlI7UUFBSEM7UUFHckJRLEtBSHFCVjtRQUFMdEksU0FHZ0IsV0FIbEJ4UixHQUFFb0YsUUFHaEJvVixJQUFRRDtRQUhRblY7UUFBSzBVO1FBQUdDOzs7O3FCQUViLE9BRkszVTtLQUlQOztHQUE2QjtZQUVuQ3NWLFlBQVkxYSxHQUFFc0IsSUFBR0MsSUFBRzJEO0lBQzFCLEdBRG9CNUQ7UUFBR0M7VUFHUndZLE9BSFF4WSxPQUdaZ1osS0FIWWhaLE9BR2hCdVksT0FIYXhZLE9BR2pCa1osS0FIaUJsWjtNQUdVLGtCQUhadEIsR0FHZndhLElBQVFELElBSExHLFlBQVkxYSxHQUdYOFosTUFBUUMsTUFIVzdVOzs7Y0FBSDNELElBRVQsT0FGWTJEO0lBSWQ7R0FBOEI7WUFFcEN1TSxRQUFRQzs7O21CQUNOO0tBQ0UsSUFBTHpQLGdCQUFIbUIsZ0JBQVEsaUJBRklzTyxHQUVadE87S0FBUTttQkFBTG5COzs7WUFFQzBQLE9BQU9EOzs7bUJBQ0w7S0FDRSxJQUFMelAsZ0JBQUhtQixnQkFBUSxpQkFGR3NPLEdBRVh0TztLQUFRO21CQUFMbkI7OztZQUVDa1EsU0FBU1QsR0FBRXBRLElBQUdDO0lBQ3BCLElBRGlCdVksV0FBR0M7SUFDcEI7UUFEaUJEO1NBQUdDO09BR0U7UUFIRkU7UUFHVE0sS0FIU1I7UUFBSEM7UUFHZFEsS0FIY1Y7UUFHSyxpQkFIUHBJLEdBR1o4SSxJQUFRRDtPQUFXO1dBSExULGFBQUdDOzs7O3FCQUVOO0tBRUY7O0dBQTJCO1lBRWpDM0gsUUFBUVYsR0FBRXBRLElBQUdDO0lBQ25CLElBRGdCdVksV0FBR0M7SUFDbkI7UUFEZ0JEO1NBQUdDO09BR0c7UUFISEU7UUFHUk0sS0FIUVI7UUFBSEM7UUFHYlEsS0FIYVY7UUFHTSxpQkFIUnBJLEdBR1g4SSxJQUFRRDtPQUFXO1dBSE5ULGFBQUdDOzs7O3FCQUVMO0tBRUY7O0dBQTBCO1lBRWhDWSxJQUFJcmE7OzttQkFDRjs7TUFDSDJCO01BQUhtQjtrQkFBUSxhQUFSQSxHQUZROUM7O21CQUVMMkI7OztZQUVDMlksS0FBS3RhOzs7bUJBQ0g7U0FDSDJCLGdCQUFIbUIsNEJBRlM5Qzs7bUJBRU4yQjs7O1lBRUM0WSxNQUFNdmE7OzttQkFDSjtTQUNDMkIsb0NBQUpOLGNBQUZ5QjtLQUFjLHNCQUFkQSxHQUZTOUMsSUFFMEIsT0FBakNxQjttQkFBSU07OztZQUVINlksVUFBVXhhOzs7bUJBQ1I7U0FDQzJCLG9DQUFKTixjQUFGeUI7S0FBYyxzQkFBZEEsR0FGYTlDLElBRXNCLFdBQWpDcUI7bUJBQUlNOzs7WUFFSDhZLEtBQUt6YTs7O21CQUNIO1NBQ0MyQixvQ0FBSk4sY0FBRnlCO2NBRlE5QyxHQUVrQixPQUF4QnFCO21CQUFJTTs7O1lBRUgrWSxTQUFTMWE7OzttQkFDUDtTQUNDMkIsb0NBQUpOLGNBQUZ5QjtjQUZZOUMsR0FFYyxXQUF4QnFCO21CQUFJTTs7O1lBRUhnWixVQUFVM2E7OzttQkFDUjs7TUFDSTJCO01BQVRtQjtrQkFBYyxhQUFkQSxHQUZhOUM7O21CQUVKMkI7OztZQUVOaVosU0FBUzVhOzs7bUJBQ1A7U0FDSTJCLGdCQUFUbUIsK0JBRlk5Qzs7bUJBRUgyQjs7O1lBRU5rWixhQUFhN2E7SWZ0TnRCLFlldU5XO1FBQ1kyQixjQUFsQm1aLGlCQUFDaFksSUFBRGdZO0lBQ0ssMEJBREpoWSxHQUZnQjlDLEtBRUMyQixRQUFsQm1aLE1BRklELGFBQWE3YSxHQUVDMkI7O1lBR2RvWixZQUFZL2E7SWYzTnJCLFllNE5XO1FBQ1kyQixjQUFsQm1aLGlCQUFDaFksSUFBRGdZO1dBQUNoWSxNQUZlOUMsSUFFRTJCLFFBQWxCbVosTUFGSUMsWUFBWS9hLEdBRUUyQjs7WUFFZDJQLEtBQUtGOzs7bUJBQ0g7U0FDRHpQLGdCQUFMM0I7S0FBYSxjQUZKb1IsR0FFVHBSLElBQXNCLE9BQXRCQTttQkFBSzJCOzs7WUFFRHFaLFNBQVM1Sjs7O21CQUNQO1NBQ0R6UCxnQkFBTDNCO0tBQWEsY0FGQW9SLEdBRWJwUixJQUFzQixXQUF0QkE7bUJBQUsyQjs7O1lBRUQ0UCxTQUFTN1I7OzttQkFDUDtLQUVPLElBRFJpQyxnQkFBTDNCLGdCQUVLMk8sU0FEUSxXQUhBalAsR0FFYk07UUFFSzJPLFFBQW9CLE9BQXBCQTttQkFGQWhOOzs7WUFNTHNaLFNBQVM3SjtJQUlYOztTQUhhdE07O2tCQUNMLE9BckxOOFUsSUFvTFc5VTtVQUVObkQsY0FBTDNCO01BQWEsY0FISm9SLEdBR1RwUjtPQUEyQixpQkFBM0JBLEdBRlc4RSxrQ0FFTm5EOzs7OztHQUNBO1lBSUx1WixRQUFROUosR0FBRXpQO0lBQ1osSUFBWUMsT0FBRXdPLGlCQURGek87O2lCQUVKLE9BN0xOaVksSUE0TFl4SjtLQUVZO01BQXJCK0k7TUFBSG5aO01BQXdCLG1CQUhoQm9SLEdBQ0V4UCxHQUVWNUIsWUFGWW9RO1lBQUZ4Tzs7TUFBRXdPO2NBRVQrSTs7R0FFSztZQUVSckosV0FBV3BRO0lBUWI7O1NBUFlvRjs7a0JBQ0YsT0FwTVI4VSxJQW1NVTlVO01BR0EsSUFESG5ELGNBQUwzQixjQUNRLG1CQUpDTixHQUdUTTs7T0FHa0IsSUFBVHdELGNBQVMsYUFBVEEsR0FMRHNCLGtDQUVIbkQ7Ozs7O0dBS0g7WUFFSndaLFdBQ1V6YixHQURHaUM7SUFDZixJQUFjeU8saUJBREN6Tzs7aUJBRUwsT0E5TVJpWSxJQTZNWXhKO0tBR0E7TUFETCtJO01BQUxuWjtNQUNLNFEsS0FBSyxXQUhGbFIsR0FFUk07TUFFTyxRQXROTHVaLFdBcU5HM0ksSUFIS1I7O2NBRUwrSTs7R0FHSTtZQUVYaUMsY0FBYzFiLEdBQUVrRixNQUFLakQ7SUFDdkIsSUFBWW1ELFNBRE1GLE1BQ0R5VyxvQkFETTFaOztpQkFFYixXQURFbUQsUUFyTlY4VSxJQXFOZXlCO0tBR0c7TUFEWGxDO01BQUxuWjtNQUNnQixtQkFKSk4sR0FDSm9GLFFBRVI5RTtNQUNZc2I7TUFBTnBLO01BQ0ssZUFEQ29LLEtBSENEO01BQUx2VyxTQUdGb007TUFIT21LO2NBRVJsQzs7R0FHSTtZQUVYeEUsVUFBVXZELEdBQUV6UDtJQUNkLElBQWE0WixTQUFJQyxnQkFESDdaOztpQkFFSSxVQTlOaEJpWSxJQTZOZTRCLEtBQ1QsV0E5Tk41QixJQTZOVzJCO1NBRU5wQyxnQkFBTG5aO0tBQWEsY0FISG9SLEdBR1ZwUjtNQUEyQixnQkFBM0JBLEdBRld1YiwyQkFFTnBDOzs7S0FBb0QsZUFBekRuWixHQUZld2Isd0JBRVZyQzs7R0FDSztZQUVWekUsY0FBY3RELEdBQUV6UDtJQUNsQixJQUFhd0YsVUFBS0MsbUJBREF6Rjs7aUJBRUMsVUFwT2pCaVksSUFtT2dCeFMsUUFDVixXQXBPTndTLElBbU9XelM7S0FHRSxJQURSZ1MsZ0JBQUxuWixjQUNhLG1CQUpDb1IsR0FHZHBSOztNQUUyQixJQUFWd0QsY0FBVSxhQUFWQSxHQUpOMkQsOEJBRU5nUzs7O0tBRzRCO01BQWZ0UjtNQUFlLGNBQWZBLEtBTEZUOztjQUVYK1I7O0dBTUs7WUFFTnNDO0lBQVEsWUFDTjtJQUVXO0tBRFY5Wjs7S0FBSjFCO0tBQUZEO0tBQ2dCLFVBSGJ5YixNQUVHOVo7S0FDSStaO0tBQUpDO0lBQXFCLGVBRDNCM2IsR0FDTTJiLFNBREoxYixHQUNReWI7R0FBK0I7WUFFdENFLFFBQVE1YSxJQUFHQztJQUNqQixHQURjRDtRQUFHQztVQUdGd1ksT0FIRXhZLE9BR05nWixLQUhNaFosT0FHVnVZLE9BSE94WSxPQUdYa1osS0FIV2xaO01BR1EsZUFBbkJrWixJQUFRRCxLQUhMMkIsUUFHQ3BDLE1BQVFDOzs7Y0FIRXhZLElBRUg7SUFFRjtHQUEwQjtZQUloQzRhLE1BQU03SixLQUdWaFIsSUFESUM7SUFETixLQUVFRCxJQURVLE9BQU5DO2FBQ00sT0FBVkQ7UUFDZ0I4YSxLQUZaN2EsT0FFTThhLEtBRk45YSxPQUVFK2EsS0FETmhiLE9BQ0FpYixLQURBamI7SUFFSyxzQkFMS2dSLEtBSVZpSyxJQUFVRjtzQkFKTkYsTUFBTTdKLEtBR1ZoUixJQUNnQjhhO2tCQUFoQkcsSUFKSUosTUFBTTdKLEtBSUpnSyxJQUZGL2E7R0FLd0I7WUFHNUJpYixZQUFZbEssS0FBSXJRO2FBbUJWd2EsS0FBS2hiLEdBQUVRO0tBQ2IsU0FEV1I7U0FBRVE7OztRQUdFO1NBREVNO1NBQU5tYTtTQUFOQyxLQUZRMWE7U0FHTDlCO2VBQU8sV0F0QkhtUyxLQXFCUHFLLElBQU1EOzBCQUFOQzswQkFBTUQ7UUFFUCxXQURJdmMsR0FEU29DOzs7O21CQUZOZCxLQUFFUTs7Ozs7UUFPSjtTQUZjMmE7U0FBTkM7U0FBTkM7U0FBTkMsT0FMUTlhO1NBTUxrUjtlQUNDLFdBMUJHYixLQXdCUHlLLE1BQU1EOztnQkFNRyxXQTlCRnhLLEtBd0JQeUssTUFBWUY7O2tCQU9ILFdBL0JGdkssS0F3QkR3SyxNQUFNRDs4QkFBTkMsVUFBTkM7c0JBQU1ELFVBQU1ELFFBQVpFO29CQUFNRCxVQUFOQyxVQUFZRjs7Z0JBR04sV0EzQkN2SyxLQXdCRHdLLE1BQU1EOztrQkFJRCxXQTVCSnZLLEtBd0JQeUssTUFBWUY7OEJBQVpFLFVBQU1EO3NCQUFOQyxVQUFZRixRQUFOQztvQkFBTkMsVUFBTUQsVUFBTUQ7UUFVYixXQVRJMUosS0FEZXlKOzs7O0tBY047TUFGVEksS0FqQkd2YjtNQWtCSHdiLEtBbEJHeGIsSUFpQkh1YjtNQUVTLFVBR2ZFLFNBTE1GLElBakJLL2E7TUFtQkQ4WDtNQTVCUTNZO01BNkJILFVBRWY4YixTQUpNRCxJQUNJbEQ7TUFDQW9EO01BN0JXOWI7TUFHckJDLEtBSGtCRjtNQUVkRyxLQUZpQkY7TUFBRzZEO0tBQzFCO1NBRUU1RDtVQURJQztZQUZpQjZhLEtBRWpCN2EsT0FFSThhLEtBRko5YSxPQUZjK2EsS0FHbEJoYixPQUNBaWIsS0FEQWpiO1FBRUssa0JBZktnUixLQWNWaUssSUFBUUY7U0FFbUIsSUFOSGpYLGFBSXhCbVgsSUFKd0JyWCxPQUd4QjVELEtBSGtCZ2IsSUFBTXBYOzs7UUFPRyxJQVBIc00sYUFJaEI2SyxJQUpnQm5YLE9BRXBCM0QsS0FGaUI2YSxJQUFHbFg7OztpQkFuUnRCMlUsV0FzUkZ2WSxJQUh3QjREOzs7aUJBblJ0QjJVLFdBcVJFdFksSUFGb0IyRDtNQThCdEIsZ0JBRFFpWTs7SUFDb0I7YUFDOUJELFNBQVN6YixHQUFFUTtLQUNiLFNBRFdSO1NBQUVROzs7UUFHRTtTQURFTTtTQUFObWE7U0FBTkMsS0FGUTFhO1NBR0w5QjtlQUFPLFdBNUNIbVMsS0EyQ1BxSyxJQUFNRDtrQkFBTkMsUUFBTUQ7MEJBQU5DO1FBRUQsV0FESXhjLEdBRFNvQzs7OzttQkFGTmQsS0FBRVE7Ozs7O1FBT0o7U0FGYzJhO1NBQU5DO1NBQU5DO1NBQU5DLE9BTFE5YTtTQU1Ma1I7ZUFDQyxXQWhER2IsS0E4Q1B5SyxNQUFNRDs7Z0JBR0EsV0FqREN4SyxLQThDRHdLLE1BQU1EO29CQUFaRSxVQUFNRCxVQUFNRDs7a0JBSUQsV0FsREp2SyxLQThDUHlLLE1BQVlGO3NCQUFaRSxVQUFZRixRQUFOQztzQkFBTUQsUUFBWkUsVUFBTUQ7O2dCQU1HLFdBcERGeEssS0E4Q1B5SyxNQUFZRjtvQkFBTkMsVUFBTkMsVUFBWUY7O2tCQU9ILFdBckRGdkssS0E4Q0R3SyxNQUFNRDtzQkFBTkMsVUFBTUQsUUFBWkU7c0JBQVlGLFFBQU5DLFVBQU5DO1FBVUQsV0FUSTVKLEtBRGV5Sjs7OztLQWNOO01BRlRJLEtBakJHdmI7TUFrQkh3YixLQWxCR3hiLElBaUJIdWI7TUFFUyxVQXpDWFAsS0F1Q0VPLElBakJLL2E7TUFtQkQ4WDtNQTNESTNZO01BNERDLFVBMUNYcWIsS0F3Q0VRLElBQ0lsRDtNQUNBb0Q7TUE1RE85YjtNQUdqQkMsS0FIY0Y7TUFFVkcsS0FGYUY7TUFBRzZEO0tBQ3RCO1NBRUU1RDtVQURJQztZQUZhNmEsS0FFYjdhLE9BRUk4YSxLQUZKOWEsT0FGVSthLEtBR2RoYixPQUNBaWIsS0FEQWpiO1FBRUssa0JBTktnUixLQUtWaUssSUFBUUY7U0FHZSxJQVBIalgsYUFJWmlYLElBSlluWCxPQUVoQjNELEtBRmE2YSxJQUFHbFg7OztRQU1HLElBTkhzTSxhQUlwQitLLElBSm9CclgsT0FHcEI1RCxLQUhjZ2IsSUFBTXBYOzs7aUJBMVFsQjJVLFdBNlFGdlksSUFIb0I0RDs7O2lCQTFRbEIyVSxXQTRRRXRZLElBRmdCMkQ7TUE2RGxCLGdCQURRaVk7O0lBQ2dCO0lBRXBCLElBQU56WixNQXZXRmtLLE9BdVNnQjNMO0lBaUVsQixZQURJeUIsTUE3Q0krWSxLQTZDSi9ZLEtBaEVjekI7R0FpRXFCO1lBeUNyQ21iLFVBQVU5SyxLQUFJclE7YUF1QlJ3YSxLQUFLaGIsR0FBRVE7S0FDYixTQURXUjtTQUFFUTs7O1FBSUM7U0FGR007U0FBTm1hO1NBQU5DLEtBRlExYTtTQUlIb2IsTUFBSSxXQTNCSi9LLEtBeUJMcUssSUFBTUQ7U0FDSHZjO2lCQUNFa2Q7a0JBRkxWO21CQUVLVSxVQUZDWCxRQUFOQyxzQkFBTUQ7UUFLUCxXQUpJdmMsR0FEU29DOzs7O21CQUZOZCxLQUFFUTs7Ozs7UUFVQztTQUZTMmE7U0FBTkM7U0FBTkM7U0FBTkMsT0FSUTlhO1NBVUhxYixNQUFJLFdBakNKaEwsS0ErQkx5SyxNQUFNRDtRQUdMLFNBRElRO1NBRU07VUFBSkMsTUFBSSxXQW5DTmpMLEtBK0JDd0ssTUFBTUQ7VUFLVDtrQkFESVU7bUJBSkRUO29CQUlDUyxVQUpLVixRQUFOQywwQkFBTUQ7VUFDVDFKO3FCQUNFbUs7U0FjTSxJQUFKRSxNQUFJLFdBL0NObEwsS0ErQkx5SyxNQUFZRjtTQWlCVCxTQURJVzt3QkFoQkRWLFVBQU5DO3NCQWdCT1M7VUFJTTtXQUFKQyxNQUFJLFdBbkRSbkwsS0ErQkN3SyxNQUFNRDtXQXFCUDttQkFESVk7b0JBcEJIWCxVQUFOQzs7bUJBb0JTVTtzQkFwQkdaLFFBQU5DLFVBQU5DO3NCQUFNRCxVQUFNRCxRQUFaRTs7O3dCQUFNRCxVQUFOQyxVQUFZRjthQUNUMUo7OztTQU1RLElBQUp1SyxNQUFJLFdBdENOcEwsS0ErQkN3SyxNQUFNRDtTQVFULFNBRElhO3dCQVBQWCxVQUFNRDtzQkFPQ1k7VUFJTTtXQUFKQyxNQUFJLFdBMUNSckwsS0ErQkx5SyxNQUFZRjtXQVlQO21CQURJYztvQkFYVFosVUFBTUQ7O21CQVdHYTtzQkFYR2QsUUFBWkUsVUFBTUQ7c0JBQU5DLFVBQVlGLFFBQU5DOzs7d0JBQU5DLFVBQU1ELFVBQU1EO2FBQ1QxSjs7UUF3QkosV0F4QklBLEtBRGV5Sjs7OztLQTZCTjtNQUZUSSxLQW5DR3ZiO01Bb0NId2IsS0FwQ0d4YixJQW1DSHViO01BRVMsVUFHZkUsU0FMTUYsSUFuQ0svYTtNQXFDRDhYO01BaERRM1k7TUFpREgsVUFFZjhiLFNBSk1ELElBQ0lsRDtNQUNBb0Q7TUFqRFc5YjtNQUdyQkMsS0FIa0JGO01BRWRHLEtBRmlCRjtNQUFHNkQ7S0FDMUI7U0FFRTVEO1VBRElDO1FBR007U0FMVzZhLEtBRWpCN2E7U0FFSThhLEtBRko5YTtTQUZjK2EsS0FHbEJoYjtTQUNBaWIsS0FEQWpiO1NBRU0wQixJQUFJLFdBakJGc1AsS0FnQlJpSyxJQUFRRjtRQUVOLFNBRElyWjtTQUM4QixJQU5ab0MsYUFJeEJtWCxJQUp3QnJYLE9BR3hCNUQsS0FIa0JnYixJQUVkL2EsS0FGaUI2YSxJQUFHbFg7OztlQUtsQmxDO1NBR3FCLElBUkh3TyxhQUl4QitLLElBSndCclgsT0FHeEI1RCxLQUhrQmdiLElBQU1wWDs7O1FBU0csSUFUSDBZLGFBSWhCdkIsSUFKZ0JuWCxPQUVwQjNELEtBRmlCNmEsSUFBR2xYOzs7aUJBL1h0QjJVLFdBa1lGdlksSUFId0I0RDs7O2lCQS9YdEIyVSxXQWlZRXRZLElBRm9CMkQ7TUFrRHRCLGdCQURRaVk7O0lBQ29CO2FBQzlCRCxTQUFTemIsR0FBRVE7S0FDYixTQURXUjtTQUFFUTs7O1FBSUM7U0FGR007U0FBTm1hO1NBQU5DLEtBRlExYTtTQUlIb2IsTUFBSSxXQW5FSi9LLEtBaUVMcUssSUFBTUQ7U0FDSHZjO2lCQUNFa2Q7a0JBRkxWO2tCQUVLVSxVQUZMVixRQUFNRCxzQkFBTkM7UUFLRCxXQUpJeGMsR0FEU29DOzs7O21CQUZOZCxLQUFFUTs7Ozs7UUFVQztTQUZTMmE7U0FBTkM7U0FBTkM7U0FBTkMsT0FSUTlhO1NBVUhxYixNQUFJLFdBekVKaEwsS0F1RUx5SyxNQUFNRDtRQUdMLFNBRElRO1NBRU07VUFBSkMsTUFBSSxXQTNFTmpMLEtBdUVDd0ssTUFBTUQ7VUFLVDtrQkFESVU7bUJBSkRUO21CQUlDUyxVQUpEVCxVQUFNRCxzQkFBTkM7VUFDSDNKO29CQUNFbUs7U0FLTSxJQUFKRSxNQUFJLFdBOUVObEwsS0F1RUN3SyxNQUFNRDtTQVFULFNBRElXO3dCQVBQVCxVQUFNRDtxQkFPQ1U7d0JBUFBULFVBQU1ELFVBQU1EOztVQVdDO1dBQUpZLE1BQUksV0FsRlJuTCxLQXVFTHlLLE1BQVlGO1dBWVA7bUJBRElZO29CQVhUVixVQUFNRDs7a0JBV0dXO3NCQVhUVixVQUFZRixRQUFOQztzQkFBTUQsUUFBWkUsVUFBTUQ7O2FBQ0gzSjs7O1NBZVEsSUFBSnVLLE1BQUksV0F2Rk5wTCxLQXVFTHlLLE1BQVlGO1NBaUJULFNBRElhO3dCQWhCRFosVUFBTkM7cUJBZ0JPVzt3QkFoQkRaLFVBQU5DLFVBQVlGOztVQW9CQztXQUFKYyxNQUFJLFdBM0ZSckwsS0F1RUN3SyxNQUFNRDtXQXFCUDttQkFESWM7b0JBcEJIYixVQUFOQzs7a0JBb0JTWTtzQkFwQkhiLFVBQU1ELFFBQVpFO3NCQUFZRixRQUFOQyxVQUFOQzs7YUFDRzVKOztRQXdCSixXQXhCSUEsS0FEZXlKOzs7O0tBNkJOO01BRlRJLEtBbkNHdmI7TUFvQ0h3YixLQXBDR3hiLElBbUNIdWI7TUFFUyxVQTdFWFAsS0EyRUVPLElBbkNLL2E7TUFxQ0Q4WDtNQW5HSTNZO01Bb0dDLFVBOUVYcWIsS0E0RUVRLElBQ0lsRDtNQUNBb0Q7TUFwR085YjtNQUdqQkMsS0FIY0Y7TUFFVkcsS0FGYUY7TUFBRzZEO0tBQ3RCO1NBRUU1RDtVQURJQztRQUdNO1NBTE82YSxLQUViN2E7U0FFSThhLEtBRko5YTtTQUZVK2EsS0FHZGhiO1NBQ0FpYixLQURBamI7U0FFTTBCLElBQUksV0FORnNQLEtBS1JpSyxJQUFRRjtRQUVOLFNBRElyWjtTQUMwQixJQU5ab0MsYUFJcEJtWCxJQUpvQnJYLE9BR3BCNUQsS0FIY2diLElBRVYvYSxLQUZhNmEsSUFBR2xYOzs7Z0JBS2RsQztTQUlpQixJQVRId08sYUFJWjZLLElBSlluWCxPQUVoQjNELEtBRmE2YSxJQUFHbFg7OztRQVFHLElBUkgwWSxhQUlwQnJCLElBSm9CclgsT0FHcEI1RCxLQUhjZ2IsSUFBTXBYOzs7aUJBcFhsQjJVLFdBdVhGdlksSUFIb0I0RDs7O2lCQXBYbEIyVSxXQXNYRXRZLElBRmdCMkQ7TUFxR2xCLGdCQURRaVk7O0lBQ2dCO0lBRXBCLElBQU56WixNQXpmRmtLLE9BaVpjM0w7SUF5R2hCLFlBREl5QixNQWpGSStZLEtBaUZKL1ksS0F4R1l6QjtHQXlHdUI7WUFHakM0YixnQkFBZ0J2YyxJQUFHQztJQUN6QixJQURzQnVZLFdBQUdDO0lBQ3pCO1VBRHNCRCxhQUFHQztnQkFJZDtTQUpjRSxnQkFBSEQsNkJBQUdEOztHQUtrQjtZQUVyQytELG9CQUFvQjdiLEdBQUVSO0lBQzVCLElBRDBCZ1ksU0FBRWpHO0lBQzVCO1VBRDBCaUcsa0JBQUVqRztTQUFGbUc7S0FNeEIsUUFOMEJuRyxLQU1YO0tBQ2IsSUFQd0JDLG1CQUFGZ0csV0FBRWpHOztHQU9HO1lBU3pCbkwsTUFBTWdLLElBQUcvUSxJQUFHQztJQUNsQixJQURldVksV0FBR0M7SUFDbEI7UUFEZUQ7U0FBR0M7T0FJRTtRQUpGRTtRQUlSTSxLQUpRUjtRQUFIQztRQUliUSxLQUphVjtRQUlLLGlCQUpSekgsSUFJVm1JLElBQVFEO09BQVU7V0FKTFQsYUFBR0M7Ozs7cUJBRU47S0FDYTs7R0FDcUI7WUFFeENuUixRQUFRMEosS0FBSWhSLElBQUdDO0lBQ3JCLElBRGtCdVksV0FBR0M7SUFDckI7VUFEa0JELGFBQUdDO1NBQUhDLGdCQUtoQlEsS0FMZ0JWO1VBQUdDLE1BSVA7S0FFSixJQU5XRSxnQkFLWE0sS0FMV1IsU0FNZi9XLElBQUksV0FOSXNQLEtBS1prSSxJQUFRRDtLQUVSLFNBREl2WCxHQUNXLE9BRFhBO1NBTlk4VyxhQUFHQzs7R0FRRztZQUl0QmpELE9BQU83VTtJQUNULFNBQVE4YixJQUFJOWI7S0FBTyxLQUFQQSxHQUNGO1NBQ0QrYixPQUZHL2IsTUFFUjNCLElBRlEyQjtLQUVLLFdBQWIzQixpQmZsa0JQLE9lZ2tCV3lkLElBRUNDO0lBQThCO0lBRXZDLHFCZnBrQkgsT2Vna0JXRCxJQURDOWI7R0FLSjtZQUVIZ2MsT0FBTzlOO2FBQ0QrTixPQUFPQyxPQUFNaE87S0FDbkIsU0FEYWdPO2tDQUdRek4sS0FBSXBRLEdBQUssV0FBTEEsR0FBSm9RLEtBQWU7TUFBbEMsT0E5Z0JGd0osSUE4Z0JFLG9DQUhpQi9KOztLQUtSLHVCQUxRQTtpQkFNSjtTQUNFSixpQkFBSHpQO0tBQVksV0FBWkEsR0FQUjRkLE9BQU9DLGVBT0lwTztJQUFtQztJQUV0RCxPQVRRbU8sWUFEQy9OO0dBVUs7Ozs7T0F2akJadkM7T0E2ZklpUTtPQU9BQztPQWxnQkpoTztPQUVBdE47T0FJQUQ7T0FJQW1YO09BUUFFO09BZUFNO09BbUJBekg7T0ExQkF6QztPQUVJNko7T0E2QkFPOztPQXlkQS9SO09BTUFPO09BdmNBaUk7T0FRSlM7T0ExQklwSjtPQVFKK0s7T0FFQW9IO09BMEpBaks7T0FVQXFMO09BUUFDO09BMUpJakw7T0FLQTZKO09BcUJBeEk7T0FoQkFzQztPQU1KcUc7T0FnQkl2STtPQU1Bd0k7T0FNQWpKO09BSUFFO09BSUFRO09BTUFDO09BTUF1STtPQUlBQztPQXFDQWhKO09BSUEwSjtPQUlBeko7T0FRSjBKOztPQVFBQztPQWlDQXZHO09BTUFEO09BaEdJNkY7T0FJQUM7T0FJQUM7T0FJQUM7T0FJQUM7T0FJQUM7T0FJQUM7T0FLQUU7T0E4RUFVO09BS0FHO09Ba0JKTTs7O09BMEdBWTtPQXBISWpCO09BeVFKckY7T0FPQW1IOzs7RWZ0a0JMOzs7Ozs7MENnQmtCS0csVUFDQUMsU0FDQUM7WUFTQTdkLElBQUlILEdBQUksWUFBSkEsZ0JBQTRCO09BQ2hDVyxzQkFDQUM7WUFJQXFkLE9BQU9qZSxHQUFJLE9BQUpBLE9BQWlCO1lBSXhCK0gsZ0JoQnZDTDtPZ0J3Q0tPO1lBQ0F2SSxJQUFJQyxHQUFFQyxHQUFRLE9BQVZELEtBQUVDLElBQUZELElBQUVDLEVBQStCO1lBQ3JDQyxJQUFJRixHQUFFQyxHQUFRLE9BQVJBLEtBQUZELFFBQUVDLEVBQStCO1lBVXJDcVgsVUFBVXRYLEdBQUksWUFBSkEsRUFBcUI7Ozs7T0FsQy9COGQ7T0FDQUM7T0FDQUM7T0FTQTdkO09BQ0FRO09BQ0FDO09BSUFxZDtPQUlBbFc7T0FDQU87T0FDQXZJO09BQ0FHO09BVUFvWDs7O0VoQnBETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lpQnlDSzRHLEtBQUsvYyxHQUFFdUI7SUFDRCxJQUFKN0MsSUFBSSxrQkFERHNCO0lBRVAsZ0JBREl0QixNQURHc0IsR0FBRXVCO0lBRVQsT0FESTdDO0dBRUg7WUFFQ3NTLEtBQUtoUixHQUFFekI7SUFDVCxJQUFJRyxJQUFJLGtCQUREc0IsSUFFUCxPQUZPQSxXQUNDOztTQUNSUzs7NEJBREkvQixHQUNKK0IsR0FDaUIsV0FIUmxDLEdBRVRrQzs7Ozs7O0lBR0EsT0FKSS9CO0dBSUg7R0FFUyxJQUFSeVAsUUFBUTtZQUVSNk8sS0FBS3RlO0lBQ1AsSUFBSXVELDJCQURHdkQsSUFFSHNFLElBQUksa0JBREpmO0lBRUosZ0JBSE92RCxNQUVIc0UsTUFEQWY7SUFFSixPQURJZTtHQUVIO1lBRUNtVCxVQUFValcsR0FBSSxPQUFpQixxQkFOL0I4YyxLQU1VOWMsSUFBNkI7WUFDdkMrYyxVQUFVdmUsR0FBSSxPQVBkc2UsMEJBT1V0ZSxJQUE2QjtZQUV2Q3dlLElBQUl4ZSxHQUFFc0QsS0FBSUM7SUFDWixRQURRRCxZQUFJQyw2QkFBTnZELEtBQU11RCxZQUFKRDtLQUlFLElBQUpnQixJQUFJLGtCQUpFZjtLQUtWLGdCQUxJdkQsR0FBRXNELEtBSUZnQixNQUpNZjtLQUtWLE9BREllOztJQUZEO0dBS0Y7WUFFRG1hLFdBQVdqZCxHQUFFOEIsS0FBSUM7SUFBTSxPQUFpQixxQkFUeENpYixJQVNXaGQsR0FBRThCLEtBQUlDO0dBQXNDO1lBR3ZEdkMsT0FBS2lDLEdBQUV6QjtJQUNUO0tBQUlxQixJQURHSSxJQUFFekI7O2FBQ0xxQjs7T0FER0k7Ozs7c0JBSWtCLDBDQUhyQko7R0FJSTtZQUVONmIsT0FBTzFlLEdBQUVzSCxNQUFLQztJQUNoQjtLQUFJaEUsTUFSRnZDLG1DQU9PaEIsSUFBRXNILE9BQUtDO0tBRVpqRCxJQUFJLGtCQURKZjtZQURPK0Q7U0FHRXFYLFNBSEZyWCxNQUdOc1g7O1NBQVFELFlBQVJDLFdBSE10WDtJQUlFO0tBQVR1WDtPQUFTOzs4QkFKSjdlLEtBR0o0ZTtTQUZEcmIsTUFFU29iO1dBQ1RFLFFBQ2UsZ0JBTFY3ZSxHQUdKNGUsUUFERHRhLEdBQ1NxYSxRQUNURTtJQUNlLE9BSGZ2YTtHQUlIO1lBRUN3YSxLQUFLOWUsR0FBRXNELEtBQUlDLEtBQUlWO0lBQ2pCLFFBRFNTLFlBQUlDLDZCQUFOdkQsS0FBTXVELFlBQUpEO0tBR0osdUJBSEV0RCxHQUFFc0QsS0FBSUMsS0FBSVY7SUFFWjtHQUN1QjtZQUUxQmtjLEtBQUs5ZCxJQUFHK2QsTUFBSzlkLElBQUcrZCxNQUFLMWI7SUFDdkI7V0FEdUJBOztZQUFieWI7OzhCQUFIL2QsTUFBZ0JzQyxZQUFieWI7Z0JBQVFDLDhCQUFIL2QsTUFBUXFDLFlBQUwwYjtLQUliLHVCQUpFaGUsSUFBRytkLE1BQUs5ZCxJQUFHK2QsTUFBSzFiO0lBR2xCO0dBQytCO1lBRWxDMmIsWUFBWWplLElBQUcrZCxNQUFLOWQsSUFBRytkLE1BQUsxYjtJQUM5QjtXQUQ4QkE7O1lBQWJ5Yjs7dUNBQUgvZCxNQUFnQnNDLFlBQWJ5YjtnQkFBUUMsOEJBQUgvZCxNQUFRcUMsWUFBTDBiO0tBSXBCLGdDQUpTaGUsSUFBRytkLE1BQUs5ZCxJQUFHK2QsTUFBSzFiO0lBR3pCO0dBQ3NDO1lBR3pDbU4sS0FBSzdRLEdBQUVvRDtJQUNULGdDQURTQSxZQUNUOzs7O01BQTZCLFdBRHRCcEQseUJBQUVvRCxHQUNUbEI7TUFBNkIsV0FBN0JBOzs7Ozs7R0FBbUQ7WUFHakRvUCxNQUFNdFIsR0FBRW9EO0lBQ1YsZ0NBRFVBLFlBQ1Y7Ozs7TUFBNkIsV0FEckJwRCxHQUNSa0MseUJBRFVrQixHQUNWbEI7TUFBNkIsV0FBN0JBOzs7Ozs7R0FBc0Q7WUFrQnBEcU8sT0FBTytPLEtBRVByZDtJakJ0SUwsS2lCc0lLQSxHQWpGUSxPQUFSMk47UUFzRTZCMlAsOEJBU3RCRCxNQWRTNU8saUJBZ0JoQnpPOzs7VUFkQU87OztRQUNNRDtRQUxLakMsMEJBSVhrQyxNQUc2QitjLGNBTGI3Tzt1QkFGTHBRLFFBQWlDO1FBRTVCb1E7Z0JBR1ZuTzs7O3NDQUROQyxNQUZnQmtPOzs7O0tBa0JSLElBYlM4TyxNQWFULHlCQWJhQyx1QkFXckJ4ZDs7b0JBVk0sT0FEV3VkO1VBRWpCRTs7V0FFTXZDO09BQ04sZ0JBSEF1QyxTQUZpQkYsS0FBSUMsS0FLckIscUJBSEFDO09BSUE7U0FHT0osUUFUVUUsS0FBSUMsMkJBRXJCQyxXQUY2Qkg7O2lCQUFSRSwyQkFFckJDLGFBRjZCSDtRQUFSRTtrQkFJZnRDOzs7TUFETixnQkFEQXVDLFNBRmlCRixLQUFJQywwQkFFckJDO01BQ0EsT0FIaUJGOzs7O1lBZ0JqQkcsSUFBSXZlLElBQUdDO0lBQ1Q7S0FBSUMsMEJBREVGO0tBRUZHLEtBQUoscUJBRlNGO0tBR0xvRCxJQUFJLGtCQUZKbkQsS0FDQUM7SUFFSixnQkFKTUgsT0FHRnFELE1BRkFuRDtJQUlKLGdCQUxTRCxPQUdMb0QsR0FGQW5ELElBQ0FDO0lBR0osT0FGSWtEO0dBR0g7WUFNQ21iO0lBQVc7Ozs7OztHQUVEO1lBRVZDLEtBQUsxZjtJQUNQLElBQUl1RCwyQkFER3ZELElBRUgrQjs7S0FDYyxHQURkQSxPQURBd0IsT0FMRmtjLCtCQUlLemYsR0FFSCtCO0tBSUksSUFBSnNRLFFBTEE5Tzs7TUFNYyxHQUxkeEIsUUFJQXNRLFFBVkZvTiwrQkFJS3pmLEdBTUhxUzthQUpBdFEsUUFJQXNRLE9BakdGbU0sSUEyRkt4ZSxHQUVIK0IsT0FJQXNRLE9BSkF0USxxQkF4R0YwTjs7O0dBbUhLO1lBRUxrUSxjQUFjM2Y7SUFjaEIsSUFBSXNCLHVDQWRZdEIsWUFjUjs7U0FDUmdDOzt3Q0FmZ0JoQyxHQWVoQmdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQURJVjtNQUNKOzs7OztPQURJQSw4QkFkWXRCLElBc0JNLE9BdEJOQTtJQXdCTCxJQUFMZ1QsTUFBSyxrQkFWUDFSOztJQVlGLGdDQTFCY3RCLFlBMEJkOzs7O1VBWUk2QywwQkF0Q1U3QyxHQTBCZCtCO2VBWUljOzs7Ozs7Ozs7OztnQ0FkQW1RLEtBVkYxUjs7Z0NBVUUwUixLQVZGMVI7OztnQ0FVRTBSLEtBVkYxUjs7Z0NBVUUwUixLQVZGMVI7OztnQ0FVRTBSLEtBVkYxUjs7Z0NBVUUwUixLQVZGMVI7OztnQ0FVRTBSLEtBVkYxUjs7Z0NBVUUwUixLQVZGMVI7Ozs7OzsrQkFVRTBSLEtBVkYxUjs7K0JBVUUwUixLQVZGMVIsWUF3QkV1QjtTQXhCRnZCOytCQVVFMFIsS0FWRjFSLGFBd0JFdUI7U0F4QkZ2QjsrQkFVRTBSLEtBVkYxUixZQXdCRXVCOzs7K0JBZEFtUSxLQVZGMVI7OytCQVVFMFIsS0FWRjFSLE1Bd0JFdUI7OzsrQkFkQW1RLEtBVkYxUixNQXdCRXVCOztNQXhCRnZCO01BWUY7Ozs7O0lBeUJBLE9BM0JJMFI7R0E0Qkg7WUFFRDBFLFFBQVFsVyxHQUNGLElBQUpvZSxNQTFLRnRCLEtBeUtROWMsSUFJVixPQTFERW1lLGNBdURFQyxLQUdXO1lBRWI3WCxJQUFJbEksR0FBRUc7SUFDUixJQUFJOEIseUJBREk5QjtJQUVSLFNBREk4QixHQUNVLE9BRk45QjtJQUdFLElBQUpzRSxJQUFJLGtCQUZOeEMsSUFHRixNQUhFQSxXQUVNOztTQUNSQzs7NEJBREl1QyxHQUNKdkMsR0FBcUMsV0FKakNsQyx5QkFBRUcsR0FJTitCOzs7Ozs7SUFDQSxPQUZJdUM7R0FHSDtZQUVEd08sS0FBS2pULEdBQUVHO0lBQ1QsSUFBSThCLHlCQURLOUI7SUFFVCxTQURJOEIsR0FDVSxPQUZMOUI7SUFHQyxJQUFKc0UsSUFBSSxrQkFGTnhDLElBR0YsTUFIRUEsV0FFTTs7U0FDUkM7OztRQURJdUMsR0FDSnZDLEdBQXFDLFdBSmhDbEMsR0FJTGtDLHlCQUpPL0IsR0FJUCtCOzs7Ozs7SUFDQSxPQUZJdUM7R0FHSDtZQUVEZ00sVUFBVXpRLEdBQUVNLEdBQUU4QztJQUNoQixJQUFJcUIsUUFEVW5FLCtCQUFFOEMsWUFDUjs7U0FDUmxCOztNQURJdUMsT0FFRyxXQUhLekUsR0FDUnlFLDRCQURZckIsR0FFaEJsQjs7Ozs7O1dBREl1QztHQUlGO1lBRUE2VixXQUFXdGEsR0FBRW9ELEdBQUU5QztJQUNqQixJQUFJbUUsUUFEYW5FLElBRWpCLDJCQUZlOEM7O1NBRWZsQjs7TUFESXVDLE9BRUcsV0FITXpFLHlCQUFFb0QsR0FFZmxCLElBREl1QztNQUNKOzs7OztXQURJQTtHQUlGO1lBRUFrTixPQUFPRCxHQUFFdlI7SUFDWCxJQUFJc0IseUJBRE90QixJQUVFK0I7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBQ04sY0FKRGlRLHlCQUFFdlIsR0FFRStCLEtBRXFCO0tBQzNCLElBSE1DOztHQUlQO1lBRUpzUCxRQUFRQyxHQUFFdlI7SUFDWixJQUFJc0IseUJBRFF0QixJQUVDK0I7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBQ04sZ0JBSkFpUSx5QkFBRXZSLEdBRUMrQixLQUdOO0tBRDJCLElBRnJCQzs7R0FJUDtZQUVKNFYsZ0JBQWdCNVgsR0FBSSxPQTlDcEIrSCxvQkE4Q2dCL0gsR0FBOEI7WUFDOUMyWCxnQkFBZ0IzWCxHQUFJLE9BL0NwQitILG9CQStDZ0IvSCxHQUE4QjtZQUU5QzZmLE9BQU9oZ0IsR0FBRUc7SUFDWCw4QkFEV0EsSUFDVSxPQURWQTtJQUVELElBQUpzRSxJQWxPSmdhLEtBZ09TdGU7MEJBRUxzRSxNQUNXLFdBSFJ6RSx5QkFBRUc7SUFJVCxPQUZJc0U7R0FHSDtZQUVEd2IsaUJBQWlCOWYsR0FBSSxPQVByQjZmLHVCQU9pQjdmLEdBQWlDO1lBQ2xEK2YsbUJBQW1CL2YsR0FBSSxPQVJ2QjZmLHVCQVFtQjdmLEdBQWlDO1lBR3BEZ2dCLFlBQWFDLFFBQU9qZ0I7SUFDdEI7S0FBSWtnQiw2QkFEa0JsZ0I7S0FFbEJtZ0IsK0JBRldGO1dBRVhFLFdBREFEOztRQUVRbmU7SUFDVjtRQURVQSxNQURSb2UsU0FFa0I7OEJBSkFuZ0IsR0FHVitCLDZCQUhHa2UsUUFHSGxlO01BRXlDO0tBQzlDLElBSEtDOztHQUlnQjtZQUcxQm9lLFVBQVdDLFFBQU9yZ0I7SUFDcEI7S0FBSWtnQiw2QkFEZ0JsZ0I7S0FFaEJzZ0IsK0JBRlNEO0tBR1RFLE9BRkFMLFFBQ0FJO2dCQUNBQzs7UUFDUXhlO0lBQ1Y7UUFEVUEsTUFGUnVlLFNBR2tCOzs2QkFMRnRnQixHQUdoQnVnQixPQUNReGU7aUNBSkNzZSxRQUlEdGU7TUFFa0Q7S0FDdkQsSUFIS0M7O0dBSVM7WUFHZndlLFVBQVV4Z0IsR0FBRXlnQixLQUFJMWUsR0FBRWM7SUFDeEIsSUFEc0JiO0lBQ3RCO1FBRGtCeWUsT0FBSXplLEtBQ0w7OEJBRERoQyxHQUFNZ0MsU0FBRWEsR0FFRyxPQUZMYjs7O0dBRXFDO1lBR3pEMmUsTUFBTTNnQixHQUFFNkMsR0FBSSxPQUxSMmQsVUFLRXhnQiwrQkFBRTZDLEdBQThCO1lBR2xDK2QsY0FBYzVnQixHQUFFeWdCLEtBQUkxZSxHQUFFYztJQUM1QixJQUQwQmI7SUFDMUI7UUFEc0J5ZSxPQUFJemUsS0FDVDs4QkFER2hDLEdBQU1nQyxTQUFFYSxHQUVELFdBRkRiOzs7R0FFMEM7WUFHbEU2ZSxVQUFVN2dCLEdBQUU2QztJQUFJLE9BTForZCxjQUtNNWdCLCtCQUFFNkM7R0FBa0M7WUFHOUNpZSxXQUFXOWdCLEdBQUUrQixHQUFFYztJQUNqQixJQUFJZix5QkFEUzlCO1lBQUUrQixLQUNYRCxLQURXQyxHQUdmLE9BbkJNeWUsVUFnQk94Z0IsR0FDVDhCLEdBRFdDLEdBQUVjO0lBRU07R0FDTjtZQUdma2UsZUFBZS9nQixHQUFFK0IsR0FBRWM7SUFDckIsSUFBSWYseUJBRGE5QjtZQUFFK0IsS0FDZkQsS0FEZUMsR0FLakIsT0FuQkk2ZSxjQWNXNWdCLEdBQ2I4QixHQURlQyxHQUFFYztJQUduQjtHQUVxQjtZQUdqQm1lLFdBQVdoaEIsR0FBRStCLEdBQUVjO0lBQ3JCLElBRG1CYjtJQUNuQjtZQURtQkEsS0FDTDs4QkFER2hDLEdBQUVnQyxTQUFFYSxHQUVNLE9BRlJiOzs7R0FFcUM7WUFHdERpZixPQUFPamhCLEdBQUU2QztJQUFJLE9BTFRtZSxXQUtHaGhCLG9DQUFFNkM7R0FBaUM7WUFHMUNxZSxZQUFZbGhCLEdBQUUrQixHQUFFYztJQUNsQixTQURnQmQsMEJBQUYvQixLQUFFK0IsR0FJZCxPQVpJaWYsV0FRUWhoQixHQUFFK0IsR0FBRWM7SUFFaEI7R0FFZ0I7WUFHWnNlLGVBQWVuaEIsR0FBRStCLEdBQUVjO0lBQ3pCLElBRHVCYjtJQUN2QjtZQUR1QkEsS0FDVDs4QkFET2hDLEdBQUVnQyxTQUFFYSxHQUVFLFdBRkpiOzs7R0FFMEM7WUFHL0RvZixXQUFXcGhCLEdBQUU2QztJQUFJLE9BTGJzZSxlQUtPbmhCLG9DQUFFNkM7R0FBcUM7WUFHbER3ZSxnQkFBZ0JyaEIsR0FBRStCLEdBQUVjO0lBQ3RCLFNBRG9CZCwwQkFBRi9CLEtBQUUrQixHQUlsQixPQVpJb2YsZUFRWW5oQixHQUFFK0IsR0FBRWM7SUFFcEI7R0FFb0I7WUFJcEJ5ZSxjQUFjdGhCLEdBQUUrQixHQUFFYztJQUNwQixJQUFJZix5QkFEWTlCO1lBQUUrQixLQUNkRCxLQURjQztLQUtoQixJQWxFSXllLFVBNkRVeGdCLEdBQ1o4QixHQURjQyxHQUFFYyxJQUtjOzs7NEJBQXVCOzs7SUFGdkQ7R0FFNEQ7WUFJNUQwZSxTQUFTdmhCLEdBQUU2QyxHQUFJLE9BVGZ5ZSxjQVNTdGhCLE1BQUU2QyxHQUF1QjtZQUdsQzJlLGVBQWV4aEIsR0FBRStCLEdBQUVjO0lBQ3JCLFFBRG1CZCwwQkFBRi9CLEtBQUUrQjtLQUlqQixJQS9DSWlmLFdBMkNXaGhCLEdBQUUrQixHQUFFYyxJQUlZOzs7NEJBQXVCOzs7SUFGdEQ7R0FFMkQ7T0FLM0Q0RjtZQUlBZ1osY0FBY3RDLEtBQUluZjtJQUNwQjtLQUFJc0U7S0FDQStOLFFBQUoscUJBRm9CclM7S0FHcEIsMkJBSG9CQTs7U0FHcEIrQjs7K0JBSG9CL0IsR0FHcEIrQixPQUhnQm9kO2lCQUNaN2E7a0JBOVVGa2EsSUE2VWtCeGUsR0FHcEIrQixZQURJc1EsT0FDSnRRO09BRElzUSxPQUNKdFE7Ozs7Ozs7Y0FGSXVDO0lBUUosV0F0VkVrYSxJQTZVa0J4ZSxNQUVoQnFTO0dBT1k7WUFJZHNFLE9BQU8zVzthQUNENGQsSUFBSTdiO0tBQ1YsR0FEVUEsMkJBREgvQixJQUVjO0tBRVgsSUFBSkcsSUFBSSxlQUpISCxHQUNHK0IsSUFHQSxNQUhBQTtLQUlSLFdBREk1QixpQmpCOVpYLE9pQjJaV3lkO0lBSW1CO0lBRTNCO3lCakJqYUgsT2lCMlpXQTtHQU1IO1lBRUg4RCxRQUFRMWhCO2FBQ0Y0ZCxJQUFJN2I7S0FDVixHQURVQSwyQkFERi9CLElBRWE7S0FFWCxJQUFKRyxJQUFJLGVBSkZILEdBQ0UrQixJQUdBLE1BSEFBO0tBSVIsZUFKUUEsR0FHSjVCLGtCakJ2YVgsT2lCb2FXeWQ7SUFJdUI7SUFFL0I7eUJqQjFhSCxPaUJvYVdBO0dBTUg7WUFFSEUsT0FBTy9iO0lBQ1QsSUFBSVQsWUFDQXVELFVBcllGd1o7aUJBK1lLeGI7S0FDRixHQVpEdkIsOEJBQ0F1RDtNQUdZO09BQVY4YztTQUFVOztvQ0FIWjljOzswQ0FHRThjO09BQzBCO01BQ2hCLElBQVZDLFVBMVlKdkQsS0F3WUlzRDtNQWpWSjVDLEtBOFVFbGEsV0FLRStjLFlBTkZ0Z0I7TUFDQXVELFNBS0UrYzs7S0FPRCxlQVpEL2MsUUFEQXZELE1BV0d1QjtLQVhIdkI7O0lBY087SUFKWCwrQkFYU1M7V0E1V1B5YyxJQThXRTNaLFdBREF2RDtHQWdCUztZQXNZUHVnQixxQkE5V2lCcmdCLEdBQUVPO0lBQ3pCO2NBQ1ksOEJBRldQLEdBQUVPO2NBR3BCLGlCQUhrQlAsR0FBRU87R0FHSTtZQXFUdkIrZixxQkFuVGlCdGdCLEdBQUVPO0lBQ3pCO2NBQ0ssaUJBRmtCUCxHQUFFTztjQUdiLDhCQUhXUCxHQUFFTztHQUdhO1lBRXBDZ2dCLFNBQVN2Z0IsR0FBRU87SUFDYjtXQUFDLGVBRFVQLEdBQUVPO0dBQ2tEO1lBRTdEaWdCLGNBQWN4Z0IsR0FBRU87SUFDbEI7Y0FBOEIsOEJBRGRQLEdBQUVPO2NBRWIsaUJBRldQLEdBQUVPO0dBRUk7WUFFcEJrZ0IsY0FBY3pnQixHQUFFTztJQUNsQjtjQUNLLGlCQUZXUCxHQUFFTztjQUNnQiw4QkFEbEJQLEdBQUVPO0dBRUk7WUFFcEJtZ0IsYUFBYTFnQixHQUFFTztJQUNqQjtXQUFDLGlCQURjUCxHQUFFTztHQUNvRDtZQUVuRW9nQixhQUFhM2dCLEdBQUVPO0lBQ2pCO1dBWkVpZ0IsY0FXYXhnQixHQUFFTztHQUNvRDtZQUVuRXFnQixhQUFhNWdCLEdBQUVPO0lBQ2pCO1dBWEVrZ0IsY0FVYXpnQixHQUFFTztHQUNvRDtZQUVuRXNnQixhQUFhN2dCLEdBQUVPO0lBQ2pCO2NBQXVCLGlCQUFPLGlCQURmUCxHQUFFTztjQUVaLGlCQUZVUCxHQUFFTztHQUVJO1lBRW5CdWdCLGFBQWE5Z0IsR0FBRU87SUFDakI7Y0FDSyxpQkFGVVAsR0FBRU87Y0FDVSxpQkFBTyxpQkFEbkJQLEdBQUVPO0dBRUk7WUFFbkJ3Z0IsYUFBYS9nQixHQUFFTztJQUNqQjtjQUF1QixpQkFBTyxpQkFEZlAsR0FBRU87Y0FFWixpQkFGVVAsR0FBRU87R0FFSTtZQUVuQnlnQixhQUFhaGhCLEdBQUVPO0lBQ2pCO2NBQ0ssaUJBRlVQLEdBQUVPO2NBQ1UsaUJBQU8saUJBRG5CUCxHQUFFTztHQUVJO1lBK1NqQjBnQixxQkE3U21CamhCLEdBQUVPLEdBQUU1QjtJQUMzQjtjQUNLLGlCQUZrQnFCLEdBQUVPLGdCQUFFNUI7Y0FHdEIsaUJBSGtCcUIsR0FBRU8sR0FBRTVCO0dBR0k7WUFvUDNCdWlCLHFCQWxQbUJsaEIsR0FBRU8sR0FBRTVCO0lBQzNCO2NBQ0ssaUJBRmtCcUIsR0FBRU8sR0FBRTVCO2NBRzNCLGlCQUh1QnFCLEdBQUVPLGdCQUFFNUI7R0FHUTtZQUVqQ3dpQixhQUFhbmhCLEdBQUVPLEdBQUU1QjtJQUNuQjtjQUF1QixpQkFEUnFCLEdBQUVPLGdCQUFFNUI7Y0FFZCxpQkFGVXFCLEdBQUVPLEdBQUU1QjtHQUVJO1lBRXJCeWlCLGFBQWFwaEIsR0FBRU8sR0FBRTVCO0lBQ25CO2NBQ0ssaUJBRlVxQixHQUFFTyxHQUFFNUI7Y0FDUSxpQkFEWnFCLEdBQUVPLGdCQUFFNUI7R0FFSTtZQUVyQjBpQixhQUFhcmhCLEdBQUVPLEdBQUU1QjtJQUNuQjtjQUF1QixpQkFEUnFCLEdBQUVPLEdBQ3VCLGlCQURyQjVCO2NBRWQsaUJBRlVxQixHQUFFTyxHQUFFNUI7R0FFSTtZQUVyQjJpQixhQUFhdGhCLEdBQUVPLEdBQUU1QjtJQUNuQjtjQUNLLGlCQUZVcUIsR0FBRU8sR0FBRTVCO2NBQ1EsaUJBRFpxQixHQUFFTyxHQUMyQixpQkFEekI1QjtHQUVJO1lBRXJCNGlCLGFBQWF2aEIsR0FBRU8sR0FBRTVCO0lBQ25CO2NBQXVCLGlCQURScUIsR0FBRU8sR0FDdUIsaUJBRHJCNUI7Y0FFZCxpQkFGVXFCLEdBQUVPLEdBQUU1QjtHQUVJO1lBRXJCNmlCLGFBQWF4aEIsR0FBRU8sR0FBRTVCO0lBQ25CO2NBQ0ssaUJBRlVxQixHQUFFTyxHQUFFNUI7Y0FDUSxpQkFEWnFCLEdBQUVPLEdBQzJCLGlCQUR6QjVCO0dBRUk7O0lBRXJCOGlCO0lBQ0FDO0lBTUFDO1lBQ1NDLFFBQVE5aEIsR0FBRXNQO0lBQXVCLHNDQUF2QkE7SUFBdUIsb0NBQXpCdFA7R0FBZ0Q7WUFrQnhEK2hCLGtCQUFrQjdoQixHQUFJLGNBQUpBLHFCQUFtQjtZQUNyQzhoQixrQkFBa0I5aEIsR0FBSSxjQUFKQSxxQkFBb0I7WUFDdEMraEIsa0JBQWtCL2hCLEdBQUksY0FBSkEscUJBQW9CO1lBQ3RDZ2lCLGtCQUFrQmhpQjtJQUFJLFVBQUpBOztHQUF3QjtZQUMxQ2lpQixrQkFBa0JqaUIsR0FBSSxjQUFKQSxxQkFBa0I7WUFNcENraUIsY0FBY0MsSUFBR0MsSUFBR0M7SUFDL0IsUUFEeUJGLGtCQUFHQyxnQkFBR0M7R0FHZjtZQUVMQyxjQUFjSCxJQUFHQyxJQUFHQyxJQUFHRTtJQUNsQyxRQUR5QkosaUJBQUdDLGtCQUFHQyxnQkFBR0U7R0FJbEI7WUFFZEMsZ0JBQWdCeGlCLEdBQUVPO0lBQ3BCLElBaEJ5QjRoQixLQWdCaEIsZUFEU25pQixHQUFFTyxJQUdoQjFCLE1BQUoscUJBSGtCbUI7SUFJbEIsVUFuQnlCbWlCOzs7Ozs7VUFzQ3JCLElBQUkzaEIsTUF2QllEO2FBR2hCMUIsTUFvQkkyQixLQUE2QixrQkEvRG5DbWhCO1VBZ0VXLElBQUxTLEtBQUssc0JBeEJLcGlCLEdBdUJWUTtVQUNtQixHQTNDaEJ1aEIsa0JBMkNISyxLQUE2QyxrQkFoRW5EVDtVQWlFRSxJQUFJekMsTUFGQTFlO2FBcEJKM0IsTUFzQklxZ0IsS0FBNkIsa0JBakVuQ3lDO1VBa0VXLElBQUxVLEtBQUssc0JBMUJLcmlCLEdBeUJWa2Y7VUFDbUIsT0EvQ2hCMkMsa0JBK0NIUTtvQkFBNkMsV0FsRW5EVjtvQkFDU0MsV0E0QkFNLGNBSmNDLElBdUNqQkMsSUFFQUM7O1VBR0osSUFBSUksTUE3QllsaUI7YUFHaEIxQixNQTBCSTRqQixLQUE2QixrQkFyRW5DZDtVQXNFVyxJQUFMZSxPQUFLLHNCQTlCSzFpQixHQTZCVnlpQjtVQUNtQixHQWhEaEJULGtCQWdESFUsT0FBNkMsa0JBdEVuRGY7VUF1RUUsSUFBSWdCLE1BRkFGO2FBMUJKNWpCLE1BNEJJOGpCLEtBQTZCLGtCQXZFbkNoQjtVQXdFVyxJQUFMaUIsT0FBSyxzQkFoQ0s1aUIsR0ErQlYyaUI7VUFDbUIsR0FyRGhCZCxrQkFxREhlLE9BQTZDLGtCQXhFbkRqQjtVQXlFRSxJQUFJa0IsTUFGQUY7YUE1Qko5akIsTUE4Qklna0IsS0FBNkIsa0JBekVuQ2xCO1VBMEVXLElBQUxZLEtBQUssc0JBbENLdmlCLEdBaUNWNmlCO1VBQ21CLE9BdkRoQmhCLGtCQXVESFU7b0JBQTZDLFdBMUVuRFo7b0JBQ1NDLFdBaUNBVSxjQVRjSCxJQTZDakJPLE1BRUFFLE1BRUFMOztVQVdKLElBQUlPLE9BN0NZdmlCO2FBR2hCMUIsTUEwQ0lpa0IsTUFBNkIsa0JBckZuQ25CO1VBc0ZXLElBQUxvQixPQUFLLHNCQTlDSy9pQixHQTZDVjhpQjtVQUNtQixHQS9EaEJiLGtCQStESGMsT0FBNkMsa0JBdEZuRHBCO1VBdUZFLElBQUlxQixPQUZBRjthQTFDSmprQixNQTRDSW1rQixNQUE2QixrQkF2Rm5DckI7VUF3RlcsSUFBTHNCLE9BQUssc0JBaERLampCLEdBK0NWZ2pCO1VBQ21CLEdBckVoQm5CLGtCQXFFSG9CLE9BQTZDLGtCQXhGbkR0QjtVQXlGRSxJQUFJdUIsT0FGQUY7YUE1Q0pua0IsTUE4Q0lxa0IsTUFBNkIsa0JBekZuQ3ZCO1VBMEZXLElBQUx3QixPQUFLLHNCQWxES25qQixHQWlEVmtqQjtVQUNtQixPQXZFaEJyQixrQkF1RUhzQjtvQkFBNkMsV0ExRm5EeEI7b0JBQ1NDLFdBaUNBVSxjQVRjSCxJQTZEakJZLE1BRUFFLE1BRUFFOzs7OztVQWJKLElBQUlDLE1BckNZN2lCO2FBR2hCMUIsTUFrQ0l1a0IsS0FBNkIsa0JBN0VuQ3pCO1VBOEVXLElBQUwwQixPQUFLLHNCQXRDS3JqQixHQXFDVm9qQjtVQUNtQixHQTNEaEJ2QixrQkEyREh3QixPQUE2QyxrQkE5RW5EMUI7VUErRUUsSUFBSTJCLE1BRkFGO2FBbENKdmtCLE1Bb0NJeWtCLEtBQTZCLGtCQS9FbkMzQjtVQWdGVyxJQUFMNEIsT0FBSyxzQkF4Q0t2akIsR0F1Q1ZzakI7VUFDbUIsR0E3RGhCekIsa0JBNkRIMEIsT0FBNkMsa0JBaEZuRDVCO1VBaUZFLElBQUk2QixNQUZBRjthQXBDSnprQixNQXNDSTJrQixLQUE2QixrQkFqRm5DN0I7VUFrRlcsSUFBTDhCLE9BQUssc0JBMUNLempCLEdBeUNWd2pCO1VBQ21CLE9BL0RoQjNCLGtCQStESDRCO29CQUE2QyxXQWxGbkQ5QjtvQkFDU0MsV0FpQ0FVLGNBVGNILElBcURqQmtCLE1BRUFFLE1BRUFFOzs7O2VBekRpQnRCO09BMEJyQixJQUFJdUIsT0FYWW5qQjtVQUdoQjFCLE1BUUk2a0IsTUFBNkIsa0JBbkRuQy9CO09Bb0RXLElBQUxnQyxPQUFLLHNCQVpLM2pCLEdBV1YwakI7T0FDbUIsR0FoQ2hCNUIsa0JBZ0NINkIsT0FBNkMsa0JBcERuRGhDO09BcURFLElBQUlpQyxPQUZBRjtVQVJKN2tCLE1BVUkra0IsTUFBNkIsa0JBckRuQ2pDO09Bc0RXLElBQUxrQyxPQUFLLHNCQWRLN2pCLEdBYVY0akI7T0FDbUIsT0FuQ2hCL0Isa0JBbUNIZ0M7aUJBQTZDLFdBdERuRGxDO2lCQUNTQyxXQTRCQU0sY0FKY0MsSUEyQmpCd0IsTUFFQUU7Ozs7O01BR0osSUFBSUMsTUFqQll2akI7U0FHaEIxQixNQWNJaWxCLEtBQTZCLGtCQXpEbkNuQztNQTBEVyxJQUFMb0MsT0FBSyxzQkFsQksvakIsR0FpQlY4akI7TUFDbUIsR0F2Q2hCakMsa0JBdUNIa0MsT0FBNkMsa0JBMURuRHBDO01BMkRFLElBQUlxQyxNQUZBRjtTQWRKamxCLE1BZ0JJbWxCLEtBQTZCLGtCQTNEbkNyQztNQTREVyxJQUFMc0MsT0FBSyxzQkFwQktqa0IsR0FtQlZna0I7TUFDbUIsT0F6Q2hCbkMsa0JBeUNIb0M7Z0JBQTZDLFdBNURuRHRDO2dCQUNTQyxXQTRCQU0sY0FKY0MsSUFpQ2pCNEIsTUFFQUU7Ozs7Y0FuQ2lCOUIsSUFvQkgsT0E1Q1hQLFdBd0JjTzs7TUFzQnJCLElBQUkrQixPQVBZM2pCO1NBR2hCMUIsTUFJSXFsQixNQUE2QixrQkEvQ25DdkM7TUFnRFcsSUF2QmV3QyxPQXVCZixzQkFSS25rQixHQU9Wa2tCO01BQ21CLE9BN0JoQnJDLGtCQU1pQnNDO2dCQXVCeUIsV0FoRG5EeEM7Z0JBQ1NDLFlBd0JjTyxnQkFBR2dDOzs7SUFtRXJCLGtCQTVGTHhDO0dBNEZrQjtZQUVsQnlDLGdCQUFnQnBrQixHQUFFTyxHQUFFNk87SUFDdEIsU0FBSXZDO0tqQjNvQlA7OztJaUI0b0JHO0tBQUloTyxNQUFKLHFCQUZrQm1CO0tBSWhCcVAsTUFESSw2QkFIZ0JEO0lBSWIsT0FBUEM7S0FBZ0I7SUFDVCxVQURQQSxLQUVFLGVBTmNyUCxHQUFFTyxHQUlsQjhPLE1BRUU7SUFFSyxXQUpQQTtLQUtFLElBQUlnVixTQVRZOWpCO1lBRWhCMUIsTUFPSXdsQjs7Z0JBRUg7aUJBWGFya0IsR0FBRU8sU0FJbEI4TztlQUhFeEMsSUFEYzdNLEdBU1Zxa0IsY0FMTmhWOzs7SUFVTyxZQVZQQTtLQVdFLElBQUlpVixTQWZZL2pCO1lBRWhCMUIsTUFhSXlsQjs7Z0JBRUg7aUJBakJhdGtCLEdBQUVPLFNBSWxCOE87ZUFIRXhDLElBRGM3TSxHQUFFTyxrQkFJbEI4TztlQUhFeEMsSUFEYzdNLEdBZVZza0IsY0FYTmpWOzs7SUFpQk8sYUFqQlBBO0tBeUJLO0lBUEgsSUFBSWtWLE9BdEJZaGtCO1dBRWhCMUIsTUFvQkkwbEI7O2VBRUg7Z0JBeEJhdmtCLEdBQUVPLFNBSWxCOE87Y0FIRXhDLElBRGM3TSxHQUFFTyxrQkFJbEI4TztjQUhFeEMsSUFEYzdNLEdBQUVPLGtCQUlsQjhPO2NBSEV4QyxJQURjN00sR0FzQlZ1a0IsWUFsQk5sVjs7R0F5QmlCO1lBRWpCbVYsZUFDZXhrQjtJQUFqQixJQUFhbkIsMkJBQUltQixZQUFFTztJQUNqQjtRQURXMUIsTUFBTTBCLEdBQ0Q7S0FFTSxrQ0FIUFAsR0FBRU87Ozs7Ozs7V0EwQmIsSUFBSWdrQixPQTFCU2hrQjtXQTZCVjthQTdCSTFCLE9BMEJIMGxCOzs7Y0FuSUN4QyxrQkFxSWdCLHNCQTVCVi9oQixHQUFFTzttQkEzR1JzaEIsa0JBd0lnQixzQkE3QlY3aEIsR0EwQlB1a0IsUUFLQyxJQS9CUS9qQixNQTBCVCtqQixjQTFCU2hrQjtXQThCUjs7V0FHTCxJQUFJOGpCLFNBakNTOWpCO1dBcUNWO2FBckNJMUIsT0FpQ0h3bEI7OztjQXpJQ3JDLGtCQTJJZ0Isc0JBbkNWaGlCLEdBQUVPOzs7ZUEzR1JzaEIsa0JBK0lnQixzQkFwQ1Y3aEIsR0FBRU87b0JBM0dSc2hCLGtCQWdKZ0Isc0JBckNWN2hCLEdBaUNQcWtCLFVBTUMsSUF2Q1FQLE1BaUNUTyxnQkFqQ1M5akI7V0FzQ1I7O1dBV0wsSUFBSWtrQixTQWpEU2xrQjtXQXFEVjthQXJESTFCLE9BaURINGxCOzs7Y0F4SkN4QyxrQkEwSmdCLHNCQW5EVmppQixHQUFFTzs7O2VBM0dSc2hCLGtCQStKZ0Isc0JBcERWN2hCLEdBQUVPO29CQTNHUnNoQixrQkFnS2dCLHNCQXJEVjdoQixHQWlEUHlrQixVQU1DLElBdkRRaEMsTUFpRFRnQyxnQkFqRFNsa0I7V0FzRFI7Ozs7O1dBYkwsSUFBSW1rQixTQXpDU25rQjtXQTZDVjthQTdDSTFCLE9BeUNINmxCOzs7Y0FwSkM3QyxrQkFzSmdCLHNCQTNDVjdoQixHQUFFTzs7O2VBM0dSc2hCLGtCQXVKZ0Isc0JBNUNWN2hCLEdBQUVPO29CQTNHUnNoQixrQkF3SmdCLHNCQTdDVjdoQixHQXlDUDBrQixVQU1DLElBL0NRVixNQXlDVFUsZ0JBekNTbmtCO1dBOENSOzs7OztRQWxDTCxJQUFJb2tCLFNBWlNwa0I7UUFlVjtVQWZJMUIsT0FZSDhsQjs7O1dBdEhDN0Msa0JBd0hnQixzQkFkVjloQixHQUFFTztnQkEzR1JzaEIsa0JBMEhnQixzQkFmVjdoQixHQVlQMmtCLFVBS0MsSUFqQlFoQyxNQVlUZ0MsZ0JBWlNwa0I7UUFnQlI7Ozs7O09BR0wsSUFBSStqQixTQW5CUy9qQjtPQXNCVjtTQXRCSTFCLE9BbUJIeWxCOzs7VUE5SEN6QyxrQkFnSWdCLHNCQXJCVjdoQixHQUFFTztlQTNHUnNoQixrQkFpSWdCLHNCQXRCVjdoQixHQW1CUHNrQixVQUtDLElBeEJRcEYsTUFtQlRvRixnQkFuQlMvakI7T0F1QlI7Ozs7c0JBbkJhLElBSkw2aUI7O09BTWIsSUFBSXdCLFNBTlNya0I7T0FRVjtTQVJJMUIsT0FNSCtsQjtjQWpIQy9DLGtCQW1IZ0Isc0JBUlY3aEIsR0FNUDRrQixVQUlDLElBVlEvQixNQU1UK0IsZ0JBTlNya0I7T0FTUjs7O0tBK0NGOztHQUVjO1lBSXJCc2tCLG1CQUFtQjdrQixHQUFFTztJQUV2QixJQUFJMUIsTUFBSixxQkFGcUJtQjtZQUFFTyxLQUVuQjFCLE9BRm1CMEI7Y0FFbkIxQixLQUVZLGtCQWhNZDhpQjtLQWlNSSxJQUdKbUQsS0E2Qkl4RSxxQkFyQ2V0Z0IsR0FBRU87aUJBUXJCdWtCO01BRE8sV0FDUEEsSUFEcUIsa0JBbk1yQm5EO01BcU1FLElBQUk0QyxPQVRlaGtCO1NBRW5CMUIsTUFPSTBsQix3QkFyTU41QyxjQThMRTlpQixNQUZtQjBCO01BV2IsSUFDSndrQixLQXlCQXpFLHFCQXJDZXRnQixHQUFFTztrQkFZakJ3a0I7V0FFTTNWLE1BTlYwVixtQkFJSUM7T0FHRSxPQTFNR25ELFdBeU1DeFM7O01BRjZCLGtCQXhNdkN1Uzs7S0FrTW1DLE9Bak0xQkMsV0FtTVRrRDs7SUFMdUI7R0FZTjtZQUVqQkUsbUJBQW1CaGxCLEdBQUVPLEdBQUU2TztJQUV6QixJQUFJdlEsTUFBSixxQkFGcUJtQjtZQUFFTyxLQUVuQjFCLE9BRm1CMEI7S0FJakIsSUFDSjhPLE1BREksNkJBSm1CRDtLQUtoQixPQUFQQztNQUFnQjtLQUNULFlBRFBBO01BRUUsSUFBSWlWLFNBUGUvakI7YUFFbkIxQixNQUtJeWxCLGNBTkpwRCxxQkFEaUJsaEIsR0FBRU8sR0FLckI4Tzs7S0FJTyxhQUpQQTtNQVdLO0tBTkgsSUFBSWtWLE9BVmVoa0I7UUFFbkIxQixNQVFJMGxCLE1BQ2U7S0FDbkI7TUFBSVUsTUFQTjVWO01BUU15VixhQURBRztNQUVBRixhQUZBRTtLQVhKL0QscUJBRGlCbGhCLEdBQUVPLEdBYWZ1a0I7S0FaSjVELHFCQURpQmxoQixHQUFFTyxXQWNmd2tCO0tBQ1E7O0lBWlM7R0FhTjtZQUVqQkcsa0JBQ2VsbEI7SUFBakIsSUFBYW5CLDJCQUFJbUIsWUFBRU87SUFDakI7UUFEVzFCLE1BQU0wQixHQUVEO1FBRkNBLE1BQU4xQixLQUdLO0tBQ1YsSUFFSnVRLElBTEVrUixxQkFEV3RnQixHQUFFTztpQkFNZjZPO01BQU8sV0FBUEEsR0FBcUI7TUFFbkIsSUFBSW1WLE9BUlNoa0I7U0FBTjFCLE1BUUgwbEIsTUFDZTtNQUNiLElBQ0psVixNQVZGaVIscUJBRFd0Z0IsR0FBRU87a0JBV1g4TztPQUNPLElBWkk2UDs7O01BV3dCOztLQU5KLElBTHBCMWU7O0dBY0k7WUFJckIya0IsbUJBQW1CbmxCLEdBQUVPO0lBRXZCLElBQUkxQixNQUFKLHFCQUZxQm1CO1lBQUVPLEtBRW5CMUIsT0FGbUIwQjtjQUVuQjFCLEtBRVksa0JBdFBkOGlCO0tBdVBJLElBR0ptRCxLQTZCSXpFLHFCQXJDZXJnQixHQUFFTztpQkFRckJ1a0I7TUFETyxXQUNQQSxJQURxQixrQkF6UHJCbkQ7TUEyUEUsSUFBSTRDLE9BVGVoa0I7U0FFbkIxQixNQU9JMGxCLHdCQTNQTjVDLGNBb1BFOWlCLE1BRm1CMEI7TUFXYixJQUNKd2tCLEtBeUJBMUUscUJBckNlcmdCLEdBQUVPO2tCQVlqQndrQjtXQUVNM1YsTUFOVjBWLG1CQUlJQztPQUdFLE9BaFFHbkQsV0ErUEN4Uzs7TUFGNkIsa0JBOVB2Q3VTOztLQXdQbUMsT0F2UDFCQyxXQXlQVGtEOztJQUx1QjtHQVlOO1lBRWpCTSxtQkFBbUJwbEIsR0FBRU8sR0FBRTZPO0lBRXpCLElBQUl2USxNQUFKLHFCQUZxQm1CO1lBQUVPLEtBRW5CMUIsT0FGbUIwQjtLQUlqQixJQUNKOE8sTUFESSw2QkFKbUJEO0tBS2hCLE9BQVBDO01BQWdCO0tBQ1QsWUFEUEE7TUFFRSxJQUFJaVYsU0FQZS9qQjthQUVuQjFCLE1BS0l5bEIsY0FOSnJELHFCQURpQmpoQixHQUFFTyxHQUtyQjhPOztLQUlPLGFBSlBBO01BV0s7S0FOSCxJQUFJa1YsT0FWZWhrQjtRQUVuQjFCLE1BUUkwbEIsTUFDZTtLQUNuQjtNQUFJVSxNQVBONVY7TUFRTXlWLGFBREFHO01BRUFGLGFBRkFFO0tBWEpoRSxxQkFEaUJqaEIsR0FBRU8sR0FhZnVrQjtLQVpKN0QscUJBRGlCamhCLEdBQUVPLFdBY2Z3a0I7S0FDUTs7SUFaUztHQWFOO1lBRWpCTSxrQkFDZXJsQjtJQUFqQixJQUFhbkIsMkJBQUltQixZQUFFTztJQUNqQjtRQURXMUIsTUFBTTBCLEdBRUQ7UUFGQ0EsTUFBTjFCLEtBR0s7S0FDVixJQUVKdVEsSUFMRWlSLHFCQURXcmdCLEdBQUVPO2lCQU1mNk87TUFBTyxXQUFQQSxHQUFxQjtNQUVuQixJQUFJbVYsT0FSU2hrQjtTQUFOMUIsTUFRSDBsQixNQUNlO01BQ2IsSUFDSmxWLE1BVkZnUixxQkFEV3JnQixHQUFFTztrQkFXWDhPO09BQ08sSUFaSTZQOzs7TUFXd0I7O0tBTkosSUFMcEIxZTs7R0FjSTs7OztPQXZ5QnJCcWM7T0FLQS9MO09BT0E3QztPQUVBNk87T0FPQUM7T0FEQTlHO09BR0ErRztPQVNBQztPQVVBQztPQVFBSTtPQUtBQztPQU1BRztPQThCQTlPO09BT0FvUDtPQTlCQTlPO09BSUFTO09BcUhBcEo7T0FRQStLO09BUUF4QztPQU9BNko7T0FlQTdJO09BUkFFO09BekdBa087T0FxRUFoSTtPQTRGQWlKO09BUUFFO09Bc0JBSTtPQWVBRztPQWxDQU47T0FNQUM7T0FnQkFHO09BZUFHO09BaUJBRTtPQVRBRDtPQVlBRTtPQTVHQTVKO09BQ0FEO09BU0FtSTtPQUNBQztPQTBHQXRYOztPQXZHQXVYO09BVUFJOzs7T0FpR0FxQjtPQWFBOUs7T0FTQStLO09BU0E1RDtPQXdLQWtHO09Bc0RBNEI7T0ErQkFJO09BK0RBSztPQWlCQUc7T0FrQkFFO09BbUJBQztPQWlCQUM7T0FrQkFDOztPQWxXQTlFOztPQU9BRTtPQUpBRDtPQVFBRTtPQU1BRTtPQUhBRDs7T0FVQUc7T0FKQUQ7O09BWUFHO09BSkFEO09BMENBVTs7T0FDQUM7T0FyQkFOO09BSkFEOztPQUlBQztPQUpBRDs7T0FZQUc7T0FKQUQ7O09BWUFHO09BSkFEO09BblhBcEQ7OztFakIxS0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lrQnVDS2xROzs7SUFQQXFYO0lBQ0FDOzs7Ozs7Ozs7Ozs7WUFFQTFJLEtBQUsvYyxHQUFFdUI7SUFDVCxrQkFKRWlrQixLQUlGLDRCQURPeGxCLEdBQUV1QjtHQUNRO1lBQ2Z5UCxLQUFLaFIsR0FBRXpCO0lBQ1Qsa0JBTkVpbkIsS0FNRiw0QkFET3hsQixHQUFFekI7R0FDUTtPQUVmbW5CLDRCQUNBQztZQUNBekksSUFBSXhlLEdBQUVzRCxLQUFJQztJQUNOLHFCQVZKd2pCLEtBU0kvbUI7SUFDTixrQkFYRThtQixLQVdGLGlDQURReGpCLEtBQUlDO0dBQ2dCO09BQzFCd2I7WUFtQkEzTyxPQUFPK08sS0FFUHJkO0lsQmpFTCxLa0JpRUtBLEdBRE07UUFWdUJzZCwrQkFTdEJELE1BZFM1TyxpQkFnQmhCek87OztVQWRBTzs7O1FBQ01EO1FBTEtqQywyQkFJWGtDLE1BRzZCK2MsY0FMYjdPO3VCQUZMcFEsUUFBaUM7UUFFNUJvUTtnQkFHVm5POzs7c0NBRE5DLE1BRmdCa087Ozs7S0FrQlIsSUFiUzhPLE1BYVQsZ0NBYmFDLHVCQVdyQnhkOzs7V0FUQXlkOztZQUVNdkM7UUFDTixpQkFIQXVDLFNBRmlCRixLQUFJQyxLQUtyQixzQkFIQUM7UUFJQTtVQUdPSixRQVRVRSxLQUFJQyw0QkFFckJDLFdBRjZCSDs7a0JBQVJFLDRCQUVyQkMsYUFGNkJIO1NBQVJFO21CQUlmdEM7OztPQUROLGlCQURBdUMsU0FGaUJGLEtBQUlDLDJCQUVyQkM7O01BVU0sa0JBbENOdUgsS0FzQmlCekg7Ozs7T0FnQmpCRztZQUdBOU8sS0FBSzdRLEdBQUVHO0lBQ1QsZ0NBRFNBLFlBQ1Q7Ozs7TUFBNkIsV0FEdEJILDBCQUFFRyxHQUNUK0I7TUFBNkIsVUFBN0JBOzs7Ozs7R0FBb0Q7WUFHbERvUCxNQUFNdFIsR0FBRUc7SUFDVixnQ0FEVUEsWUFDVjs7OztNQUE2QixXQURyQkgsR0FDUmtDLDBCQURVL0IsR0FDVitCO01BQTZCLFVBQTdCQTs7Ozs7O0dBQXNEO1lBRXBEZ0csSUFBSWxJLEdBQUVHO0lBQ0EscUJBaEROK21CLEtBK0NNL21CO0lBQ1Isa0JBakRFOG1CLEtBaURGLDZCQURNam5CO0dBQ2dCO1lBQ3BCaVQsS0FBS2pULEdBQUVHO0lBQ0EscUJBbERQK21CLEtBaURPL21CO0lBQ1Qsa0JBbkRFOG1CLEtBbURGLDZCQURPam5CO0dBQ2dCO1lBQ3JCc2EsV0FBV3RhLEdBQUVNLEdBQUU4QztJQUNGLHFCQXBEYjhqQixLQW1EYTVtQjtJQUNmLG9DQURhTixRQUFJb0Q7R0FDTztZQUN0QnFOLFVBQVV6USxHQUFFb0QsR0FBRTlDO0lBQ0EscUJBdERkNG1CLEtBcURjNW1CO0lBQ0Esb0NBREpOLEdBQUVvRDtHQUNTO1lBQ3JCdU8sT0FBTzNSLEdBQUVHO0lBQ0EscUJBeERUK21CLEtBdURTL21CO0lBQ0Esb0NBREZIO0dBQ1M7WUFDaEJ5UixRQUFRelIsR0FBRUc7SUFDQSxxQkExRFYrbUIsS0F5RFUvbUI7SUFDQSxvQ0FERkg7R0FDUztZQU1qQjRmO0lBQVc7Ozs7OztHQUVEO1lBRVZDLEtBQUsxZjtJQUNQLEdBQUcsa0JBRElBLFdBQ1EsT0FEUkE7SUFFOEI7O01BTm5DeWYsZ0NBSUt6Zjs7O09BSkx5ZixnQ0FJS3pmO0tBSUYsT0FKRUE7SUFHWSxxQkF2RWpCK21CLEtBb0VLL21CO0lBR0ksa0JBeEVUOG1CLEtBd0VTO0dBQ0w7WUFFSnBQLFFBQVExWDtJQUNGLElBQUp3QixJQUFJLFdBM0VOdWxCLEtBMEVRL21CO0lBSU4sa0JBL0VGOG1CLEtBK0VFLDZCQUhBdGxCO0dBR21CO1lBR2pCZ2YsVUFBVXhnQixHQUFFeWdCLEtBQUkxZSxHQUFFYztJQUN4QixJQURzQmI7SUFDdEI7UUFEa0J5ZSxPQUFJemUsS0FDTDsrQkFERGhDLEdBQU1nQyxTQUFFYSxHQUVHLE9BRkxiOzs7R0FFcUM7WUFHekQyZSxNQUFNM2dCLEdBQUU2QyxHQUFJLE9BTFIyZCxVQUtFeGdCLGdDQUFFNkMsR0FBOEI7WUFHbEMrZCxjQUFjNWdCLEdBQUV5Z0IsS0FBSTFlLEdBQUVjO0lBQzVCLElBRDBCYjtJQUMxQjtRQURzQnllLE9BQUl6ZSxLQUNUOytCQURHaEMsR0FBTWdDLFNBQUVhLEdBRUQsV0FGRGI7OztHQUUwQztZQUdsRTZlLFVBQVU3Z0IsR0FBRTZDO0lBQUksT0FMWitkLGNBS001Z0IsZ0NBQUU2QztHQUFrQztZQUc5Q2llLFdBQVc5Z0IsR0FBRStCLEdBQUVjO0lBQ2pCLElBQUlmLDBCQURTOUI7WUFBRStCLEtBQ1hELEtBRFdDLEdBR2IsT0FuQkl5ZSxVQWdCT3hnQixHQUNUOEIsR0FEV0MsR0FBRWM7SUFFTTtHQUNKO1lBR2pCa2UsZUFBZS9nQixHQUFFK0IsR0FBRWM7SUFDckIsSUFBSWYsMEJBRGE5QjtZQUFFK0IsS0FDZkQsS0FEZUMsR0FLakIsT0FuQkk2ZSxjQWNXNWdCLEdBQ2I4QixHQURlQyxHQUFFYztJQUduQjtHQUVxQjtZQUdqQm1lLFdBQVdoaEIsR0FBRStCLEdBQUVjO0lBQ3JCLElBRG1CYjtJQUNuQjtZQURtQkEsS0FDTDsrQkFER2hDLEdBQUVnQyxTQUFFYSxHQUVNLE9BRlJiOzs7R0FFcUM7WUFHdERpZixPQUFPamhCLEdBQUU2QztJQUFJLE9BTFRtZSxXQUtHaGhCLHFDQUFFNkM7R0FBaUM7WUFHMUNxZSxZQUFZbGhCLEdBQUUrQixHQUFFYztJQUNsQixTQURnQmQsMkJBQUYvQixLQUFFK0IsR0FJZCxPQVpJaWYsV0FRUWhoQixHQUFFK0IsR0FBRWM7SUFFaEI7R0FFZ0I7WUFHWnNlLGVBQWVuaEIsR0FBRStCLEdBQUVjO0lBQ3pCLElBRHVCYjtJQUN2QjtZQUR1QkEsS0FDVDsrQkFET2hDLEdBQUVnQyxTQUFFYSxHQUVFLFdBRkpiOzs7R0FFMEM7WUFHL0RvZixXQUFXcGhCLEdBQUU2QztJQUFJLE9BTGJzZSxlQUtPbmhCLHFDQUFFNkM7R0FBcUM7WUFHbER3ZSxnQkFBZ0JyaEIsR0FBRStCLEdBQUVjO0lBQ3RCLFNBRG9CZCwyQkFBRi9CLEtBQUUrQjtLQUlsQixPQVpJb2YsZUFRWW5oQixHQUFFK0IsR0FBRWM7SUFFcEI7R0FFb0I7WUFHcEJ5ZSxjQUFjdGhCLEdBQUUrQixHQUFFYztJQUNwQixJQUFJZiwwQkFEWTlCO1lBQUUrQixLQUNkRCxLQURjQztLQUtoQixJQWpFSXllLFVBNERVeGdCLEdBQ1o4QixHQURjQyxHQUFFYyxJQUtjOzs7NEJBQXVCOzs7SUFGdkQ7R0FFNEQ7WUFHNUQwZSxTQUFTdmhCLEdBQUU2QyxHQUFJLE9BUmZ5ZSxjQVFTdGhCLE1BQUU2QyxHQUF1QjtZQUdsQzJlLGVBQWV4aEIsR0FBRStCLEdBQUVjO0lBQ3JCLFFBRG1CZCwyQkFBRi9CLEtBQUUrQjtLQUlqQixJQTdDSWlmLFdBeUNXaGhCLEdBQUUrQixHQUFFYyxJQUlZOzs7NEJBQXVCOzs7SUFGdEQ7R0FFMkQ7WUFFM0QrVSxnQkFBZ0I1WDtJQUNBLHFCQS9KaEIrbUIsS0E4SmdCL21CO0lBQ2xCLGtCQWhLRThtQixLQWdLRjtHQUFnQztZQUM5Qm5QLGdCQUFnQjNYO0lBQ0EscUJBaktoQittQixLQWdLZ0IvbUI7SUFDbEIsa0JBbEtFOG1CLEtBa0tGO0dBQWdDO1lBQzlCaEgsaUJBQWlCOWY7SUFDQSxxQkFuS2pCK21CLEtBa0tpQi9tQjtJQUNuQixrQkFwS0U4bUIsS0FvS0Y7R0FBaUM7WUFDL0IvRyxtQkFBbUIvZjtJQUNBLHFCQXJLbkIrbUIsS0FvS21CL21CO0lBQ3JCLGtCQXRLRThtQixLQXNLRjtHQUFtQztZQUdqQzlHLFlBQWFDLFFBQU9qZ0I7SUFDdEI7S0FBSWtnQiw4QkFEa0JsZ0I7S0FFbEJtZ0IsZ0NBRldGO1dBRVhFLFdBREFEOztRQUVRbmU7SUFDVjtRQURVQSxNQURSb2UsU0FFa0I7K0JBSkFuZ0IsR0FHVitCLDhCQUhHa2UsUUFHSGxlO01BRXlDO0tBQzlDLElBSEtDOztHQUlnQjtZQUcxQm9lLFVBQVdDLFFBQU9yZ0I7SUFDcEI7S0FBSWtnQiw4QkFEZ0JsZ0I7S0FFaEJzZ0IsZ0NBRlNEO0tBR1RFLE9BRkFMLFFBQ0FJO2dCQUNBQzs7UUFDUXhlO0lBQ1Y7UUFEVUEsTUFGUnVlLFNBR2tCOzs4QkFMRnRnQixHQUdoQnVnQixPQUNReGU7a0NBSkNzZSxRQUlEdGU7TUFFa0Q7S0FDdkQsSUFIS0M7O0dBSVM7WUFHbkI2VyxLQUFLMVksR0FBSSwyQkFBSkEsR0FBbUI7WUFHeEJzaEIsY0FBY3RDLEtBQUluZjtJQUNwQjtLQUFJc0U7S0FDQStOLFFBQUosc0JBRm9CclM7S0FHcEIsNEJBSG9CQTs7U0FHcEIrQjs7Z0NBSG9CL0IsR0FHcEIrQixPQUhnQm9kO2lCQUNaN2E7a0JBeExGa2EsSUF1TGtCeGUsR0FHcEIrQixZQURJc1EsT0FDSnRRO09BRElzUSxPQUNKdFE7Ozs7Ozs7Y0FGSXVDO0lBUUosV0FoTUVrYSxJQXVMa0J4ZSxNQUVoQnFTO0dBT1k7T0FJZDVKO1lBS0FrTyxPQUFPM1c7SUFBSSxxQkFsTlgrbUIsS0FrTk8vbUI7SUFBSTtHQUFpQjtZQUU1QjBoQixRQUFRMWhCO0lBQUkscUJBcE5aK21CLEtBb05RL21CO0lBQUk7R0FBa0I7WUFFOUI4ZCxPQUFPb0o7SUFBSSxrQkF2TlhKLEtBdU5XLDZCQUFKSTtHQUFxQjtZQUk1QmxELGdCQUFnQmhrQixHQUFFK0I7SUFBc0IscUJBMU54Q2dsQixLQTBOZ0IvbUI7SUFBTSx5Q0FBSitCO0dBQStCO1lBQ2pEaWtCLGVBQWVobUI7SUFBcUIscUJBM05wQyttQixLQTJOZS9tQjtJQUFxQjtHQUFPO1lBRTNDcW1CLG1CQUFtQnJtQixHQUFFK0I7SUFBeUIscUJBN045Q2dsQixLQTZObUIvbUI7SUFBTSx5Q0FBSitCO0dBQWtDO1lBQ3ZEMmtCLGtCQUFrQjFtQjtJQUF3QixxQkE5TjFDK21CLEtBOE5rQi9tQjtJQUF3QjtHQUFPO1lBRWpEMm1CLG1CQUFtQjNtQixHQUFFK0I7SUFBeUIscUJBaE85Q2dsQixLQWdPbUIvbUI7SUFBTSx5Q0FBSitCO0dBQWtDO1lBQ3ZEOGtCLGtCQUFrQjdtQjtJQUF3QixxQkFqTzFDK21CLEtBaU9rQi9tQjtJQUF3QjtHQUFPO1lBU2pEK2hCLFNBQVMvaEIsR0FBRStCO0lBQWUscUJBMU8xQmdsQixLQTBPUy9tQjtJQUFNLHlDQUFKK0I7R0FBd0I7WUFDbkNpZ0IsY0FBY2hpQixHQUFFK0I7SUFBb0IscUJBM09wQ2dsQixLQTJPYy9tQjtJQUFNLHlDQUFKK0I7R0FBNkI7WUFDN0NrZ0IsY0FBY2ppQixHQUFFK0I7SUFBb0IscUJBNU9wQ2dsQixLQTRPYy9tQjtJQUFNLHlDQUFKK0I7R0FBNkI7WUFDN0NtZ0IsYUFBYWxpQixHQUFFK0I7SUFBbUIscUJBN09sQ2dsQixLQTZPYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0NvZ0IsYUFBYW5pQixHQUFFK0I7SUFBbUIscUJBOU9sQ2dsQixLQThPYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0NxZ0IsYUFBYXBpQixHQUFFK0I7SUFBbUIscUJBL09sQ2dsQixLQStPYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0NzZ0IsYUFBYXJpQixHQUFFK0I7SUFBbUIscUJBaFBsQ2dsQixLQWdQYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0N1Z0IsYUFBYXRpQixHQUFFK0I7SUFBbUIscUJBalBsQ2dsQixLQWlQYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0N3Z0IsYUFBYXZpQixHQUFFK0I7SUFBbUIscUJBbFBsQ2dsQixLQWtQYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7WUFDM0N5Z0IsYUFBYXhpQixHQUFFK0I7SUFBbUIscUJBblBsQ2dsQixLQW1QYS9tQjtJQUFNLHlDQUFKK0I7R0FBNEI7Ozs7T0FqUDNDc2M7T0FFQS9MO09BRUE3QztPQUNBdVg7T0FDQUM7T0FzQkE3VztPQU9Bb1A7O09Bd0tBL1c7T0FyQ0F1WDtPQVVBSTtPQXJDQWtCO09BV0FFO09BSEFEO09BNUlBL0M7T0F1TEFpRDtPQWpKQTFaO09BRUErSztPQUlBeEM7T0FGQTZKO09BTUE3STtPQUZBRTtPQWFBa087T0FNQWhJO09Bb0ZBRTtPQUVBRDtPQUVBbUk7T0FFQUM7T0E1SEFyUDtPQUlBUztPQXFEQTJQO09BTUFDO09BZ0JBRztPQWVBRztPQWhEQVY7T0FRQUU7T0FzQkFJO09BZUFHO09BK0VBeks7T0FFQStLO09BRUE1RDtPQUlBa0c7T0FDQWdDO09BRUFLO09BQ0FLO09BRUFDO09BQ0FFO09BdE5BOUg7O09BK05BZ0Q7O09BRUFFO09BREFEO09BRUFFO09BRUFFO09BREFEOztPQWpEQXRKOztPQW9EQXlKO09BREFEOztPQUdBRztPQURBRDs7O0VsQm5STDs7Ozs7OztZbUJrQktyYSxrQkFBYyxTQUFJO1lBQ2xCTyxvQkFBZ0IsU0FBQztZQUNqQmdQLGlCQUFlLFdBQUk7eUJBRm5CdlAsT0FDQU8sU0FDQWdQOzs7RW5CcEJMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHcUJxQ3FCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBVWhCbkYsS0FBS3hRLEdBQUVqQztJQUNULFNBRE9pQyxHQUNPO1dBRFBBLEdBRU87SUFJSCxJQUFOb0QsTUFBTSxlQU5KcEQsR0FNYSxXQU5YakMsUUFPUixPQVBNaUMsV0FNSTs7U0FDVkM7O01BREltRCxRQUNKbkQsS0FDbUIsV0FSWGxDLEdBT1JrQztNQUNFLFdBREZBOzs7OztJQUdBLE9BSkltRDtHQUlEO1lBRUZ5aUIsWUFBWUMsSUFBR0MsSUFBR3ZWO0lBQ3BCLElBQUlwTixNQUFNLGVBREkwaUIsVUFFZCxPQUZjQSxZQUNKOztTQUNWem5COztNQURJK0UsUUFDSi9FLEtBQ21CLGVBSEYwbkIsSUFBR3ZWO01BRXBCOzs7OztJQUdBLE9BSklwTjtHQUlEO1lBRURvWixLQUFLcmI7SUFDUCxJQUFJbkIsSUFER21CO0lBQ2EsYUFBaEJuQixVQUF3QyxlQURyQ21CLE1BQ0huQjtHQUF3RDtZQUUxRCtOLE9BQU93SyxJQUFHRDtJQUNaLElBQUlqWixLQURLa1o7SUFFVCxhQURJbFo7Y0FKRm1kLEtBR1VsRTs7O2dCQUdlLGVBSGxCQyxPQUNMbFo7Z0JBR0MsMEJBSklrWixJQUFHRDtHQUlVO1lBRXBCb0UsSUFBSXZiLEdBQUVLLEtBQUlDO0lBQ1osUUFEUUQsWUFBSUMsUUFBTk4sZUFBTU0sWUFBSkQ7S0FHSCxzQkFIQ0wsR0FBRUssS0FBSUM7SUFFUDtHQUNvQjtZQUV2QnViLEtBQUs3YixHQUFFSyxLQUFJQyxLQUFJSTtJQUNqQixRQURTTCxZQUFJQyxRQUFOTixlQUFNTSxZQUFKRDtLQUdKLCtCQUhFTCxHQUFFSyxLQUFJQyxLQUFJSTtJQUVaO0dBQ3VCO1lBRTFCb2IsS0FBSzFFLElBQUcyRSxNQUFLNUUsSUFBRzZFLE1BQUsxYjtJQUN2QjtXQUR1QkE7O1lBQWJ5Yjs7U0FBSDNFLGdCQUFnQjlXLFlBQWJ5YjtnQkFBUUMsU0FBSDdFLGdCQUFRN1csWUFBTDBiO0tBSWIsK0JBSkU1RSxJQUFHMkUsTUFBSzVFLElBQUc2RSxNQUFLMWI7SUFHbEI7R0FDK0I7WUFFbENtTixLQUFLN1EsR0FBRW9EO0lBQ1QsV0FEU0Esc0JBQ1Q7Ozs7TUFBNkIsV0FEdEJwRCxHQUFFb0QsTUFDVGxCO01BQTZCLFdBQTdCQTs7Ozs7O0dBQW1EO1lBRWpENFAsTUFBTTlSLEdBQUVvRCxHQUFFekI7SUFDWixHQURVeUIsaUJBQUV6QjtLQUVWO0lBRUEsV0FKUXlCLHNCQUlSOzs7O01BQTZCLFdBSnZCcEQsR0FBRW9ELE1BSVJsQixJQUpVUCxNQUlWTztNQUE2QixXQUE3QkE7Ozs7OztHQUFxRTtZQUVyRWdHLElBQUlsSSxHQUFFb0Q7SUFDUixJQUFJbkIsSUFESW1CO0lBRVIsU0FESW5CLEdBQ1U7SUFDSjtLQUFKd0MsSUFBSSxlQUZOeEMsR0FFZSxXQUhiakMsR0FBRW9EO0tBSU4sT0FIRW5CO0tBRU07O1NBQ1JDOztNQURJdUMsTUFDSnZDLEtBQ2lCLFdBTGJsQyxHQUFFb0QsTUFJTmxCO01BQ0UsV0FERkE7Ozs7O0lBR0EsT0FKSXVDO0dBS0g7WUFFRDJQLEtBQUtwVSxHQUFFb0QsR0FBRXpCO0lBQ1gsSUFBSXNtQixLQURLN2tCLGNBRUw4a0IsS0FGT3ZtQjtPQUNQc21CLE9BQ0FDO0tBRUY7YUFIRUQsSUFLYTtJQUNMO0tBQUp4akIsSUFBSSxlQU5Sd2pCLElBTWtCLFdBUGZqb0IsR0FBRW9ELE1BQUV6QjtLQVFQLE9BUEFzbUI7S0FNUTs7U0FDUi9sQjs7TUFESXVDLE1BQ0p2QyxLQUNpQixXQVRkbEMsR0FBRW9ELE1BUUxsQixJQVJPUCxNQVFQTztNQUNFLFdBREZBOzs7OztJQUdBLE9BSkl1QztHQU1MO1lBRUQ2TSxNQUFNdFIsR0FBRW9EO0lBQ1YsV0FEVUEsc0JBQ1Y7Ozs7TUFBNkIsV0FEckJwRCxHQUNSa0MsR0FEVWtCLE1BQ1ZsQjtNQUE2QixXQUE3QkE7Ozs7OztHQUFzRDtZQUVwRCtRLEtBQUtqVCxHQUFFb0Q7SUFDVCxJQUFJbkIsSUFES21CO0lBRVQsU0FESW5CLEdBQ1U7SUFDSjtLQUFKd0MsSUFBSSxlQUZOeEMsR0FFZSxXQUhaakMsTUFBRW9EO0tBSVAsTUFIRW5CO0tBRU07O1NBQ1JDOztNQURJdUMsTUFDSnZDLEtBQ2lCLFdBTFpsQyxHQUlMa0MsR0FKT2tCLE1BSVBsQjtNQUNFLFVBREZBOzs7OztJQUdBLE9BSkl1QztHQUtIO1lBRURvUyxRQUFRelQ7SUFDVixJQUFleWQsTUFETHpkLHNCQUNLbEIsU0FBRW1EO0lBQ2Y7WUFEYW5ELEdBQ0MsT0FEQ21EO0tBQ3VCLElBRHZCOGlCLFlBRFAva0IsTUFDS2xCLElBQUVtRCxNQUFGbEQsMEJBQUVrRDs7R0FFTztZQUdsQitpQjtRQUFZaGpCOzttQkFDVixPQURVQTtLQUVSO01BQUxrSztNQUFLLFNBRlFsSzs7Z0JBRWJrSzs7O1lBRUgrWSxRQUVBcG1CO0lBRlUsS0FFVkEsR0FETTtJQUVJO0tBRE5NLEtBQUpOOztLQUNNbUIsSUFBSSxlQVBOZ2xCLGVBTUpubUI7S0FFZUM7YUFGWEs7O2lCQUVGLE9BRElhO1NBR0krWixpQkFBSnVDO0tBSEF0YyxNQUNTbEIsS0FFVHdkO0tBRkosVUFBYXhkLDRCQUVMaWI7O0dBQ0M7WUFFWDFNLFVBQVV6USxHQUFFTSxHQUFFOEM7SUFDaEIsSUFBSXFCLFFBRFVuRSxVQUFFOEMsc0JBQ1I7O1NBQ1JsQjs7TUFESXVDLE9BRUcsV0FIS3pFLEdBQ1J5RSxNQURZckIsTUFFaEJsQjs7Ozs7O1dBREl1QztHQUlGO1lBRUFpWCxjQUFjMWIsR0FBRTBRLEtBQUk0WDtJQUN0QixJQUFJNWtCLE1BRGtCNGtCO0lBRXRCLFNBREk1a0IsS0FDWSxXQUZFZ047SUFHRDt3QkFIRDFRLEdBQUUwUSxLQUFJNFg7S0FHWEM7S0FBTDVYO0tBQ0E2WCxlQUFlLGVBSGpCOWtCLEtBRU82a0I7S0FFTDNYLFlBRkFEO0tBR0osTUFMRWpOO0tBSVE7O1NBQ1Z4Qjs7TUFDa0I7NEJBUEpsQyxHQUtWNFEsVUFMZ0IwWCxnQkFNcEJwbUI7T0FDWXVtQjtPQUFOQztNQUZGOVgsV0FFRThYO01BSEZGLGlCQUVKdG1CLEtBQ1l1bUI7TUFEWjs7Ozs7SUFLQSxXQU5JN1gsVUFEQTRYO0dBUUg7WUFFRGxPLFdBQVd0YSxHQUFFb0QsR0FBRTlDO0lBQ2pCLElBQUltRSxRQURhbkUsSUFFakIsTUFGZThDOztTQUVmbEI7O01BREl1QyxPQUVHLFdBSE16RSxHQUFFb0QsTUFFZmxCLElBREl1QztNQUNKOzs7OztXQURJQTtHQUlGO1lBRUFrTixPQUFPRCxHQUFFdE87SUFDWCxJQUFJM0IsSUFETzJCLGNBRUVsQjtJQUNYO1FBRFdBLE1BRFRULEdBRVk7S0FDTixjQUpEaVEsR0FBRXRPLE1BRUVsQixLQUVxQjtLQUMzQixJQUhNQzs7R0FJUDtZQUVKc1AsUUFBUUMsR0FBRXRPO0lBQ1osSUFBSTNCLElBRFEyQixjQUVDbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBQ04sZ0JBSkFpUSxHQUFFdE8sTUFFQ2xCLEtBR047S0FEMkIsSUFGckJDOztHQUlQO1lBRUpnUSxTQUFTVCxHQUFFcFEsSUFBR0M7SUFDaEIsSUFBSXliLEtBRFMxYixlQUVUMmIsS0FGWTFiO09BQ1p5YixPQUNBQyxJQUNhO1FBQ0MvYTtJQUNoQjtRQURnQkEsTUFIZDhhLElBSWE7S0FDUCxnQkFOQ3RMLEdBQUVwUSxPQUlLWSxJQUpGWCxPQUlFVyxLQUdYO0tBRDhDLElBRm5DQzs7R0FJWjtZQUVKaVEsUUFBUVYsR0FBRXBRLElBQUdDO0lBQ2YsSUFBSXliLEtBRFExYixlQUVSMmIsS0FGVzFiO09BQ1h5YixPQUNBQyxJQUNhO1FBQ0MvYTtJQUNoQjtRQURnQkEsTUFIZDhhLElBSWE7S0FDUCxjQU5BdEwsR0FBRXBRLE9BSU1ZLElBSkhYLE9BSUdXLEtBRW1DO0tBQzlDLElBSFdDOztHQUlaO1lBRUp3WSxJQUFJcmEsR0FBRThDO0lBQ1IsSUFBSTNCLElBREkyQixjQUVLbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBQ04sOEJBSkYyQixNQUVLbEIsSUFGUDVCLElBSXdDO0tBQ3ZDLElBSE02Qjs7R0FJUDtZQUVKeVksS0FBS3RhLEdBQUU4QztJQUNULElBQUkzQixJQURLMkIsY0FFSWxCO0lBQ1g7UUFEV0EsTUFEVFQsR0FFWTtRQUhUbkIsTUFBRThDLE1BRUlsQixJQUV3QjtLQUM5QixJQUhNQzs7R0FJUDtZQUVKbVosU0FBUzVKLEdBQUV0TztJQUNiLElBQUkzQixJQURTMkIsY0FFQWxCO0lBQ1g7UUFEV0EsTUFEVFQsR0FFWTtLQUVKLElBQUpuQixJQUxLOEMsTUFFQWxCO0tBSU4sY0FOSXdQLEdBS0hwUixJQUNRLFdBRFJBO0tBRUMsSUFMSTZCOztHQU9QO1lBRUowUCxTQUFTN1IsR0FBRW9EO0lBQ2IsSUFBSTNCLElBRFMyQixjQUVBbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBRU4sSUFFSmdELElBRkksV0FMQ3pFLEdBQUVvRCxNQUVBbEI7UUFLUHVDLEdBQWUsT0FBZkE7S0FEUSxJQUpEdEM7O0dBT1A7WUFFSjRaLE1BQU16YjtJQUNSLEdBQUcsbUJBREtBLFNBQ1M7SUFHZjthQUpNQTtLQUdFd2pCO0tBQUo2RTtLQUNBbG5CLElBSkVuQjtLQUtGOEMsSUFBSSxlQURKM0IsR0FEQWtuQjtLQUdBaG5CLElBQUksZUFGSkYsR0FESXFpQjtLQUlSLE1BSElyaUI7S0FFSTs7U0FDUlM7O29CQVBNNUIsTUFPTjRCLElBQ1UwbUIsaUJBQUpDO01BSEZ6bEIsTUFFSmxCLEtBQ00ybUI7TUFGRmxuQixNQUNKTyxLQUNVMG1CO01BRFY7Ozs7O0lBS0EsV0FQSXhsQixHQUNBekI7R0FPSDtZQUVEdWEsUUFBUTlZLEdBQUV6QjtJQUNaLElBQUltbkIsS0FETTFsQixjQUVOMmxCLEtBRlFwbkI7T0FDUm1uQixPQUNBQyxJQUNhO2FBRmJELElBR1c7SUFFTCxJQUFKeG9CLElBQUksZUFMTndvQixRQURNMWxCLE1BQUV6QixRQU9WLE1BTkVtbkIsWUFLTTs7U0FDUjVtQjs7TUFESTVCLE1BQ0o0QixTQVBRa0IsTUFPUmxCLElBUFVQLE1BT1ZPOzs7Ozs7SUFHQSxPQUpJNUI7R0FLSDtHQUVMO1lBQ0ltYyxLQUFLbkssS0FBSWxQO2FBQ1A0bEIsT0FBTy9tQixHQUFFQztLQUNYLElBQUkrbUIsUUFETy9tQiw2QkFFUDVCLFFBREEyb0I7d0JBREtobkI7TUFHUyxVQUZkZ25CLGFBR2lCLHVCQUxaN2xCO1NBS0osV0FMQWtQLHNCQUFJbFAsR0FFTDZsQjtPQUNBM29CLE9BREEyb0I7TUFJRjthQUpFQTtPQUlnQix1QkFOWDdsQjthQUdMOUM7U0FHQyxXQU5BZ1Msc0JBQUlsUDtPQUdMOUMsT0FEQTJvQjthQUNBM29COztTQURBMm9CLGVBREtobkI7TUFReUIsVUFQOUJnbkIsYUFPOEIsdUJBVHpCN2xCO01BU1Msa0JBVGJrUCxzQkFBSWxQLEdBRUw2bEI7T0FRRyxPQVJIQTs7Y0FES2huQixHQVVjLE9BVG5CZ25CO0tBUzRCLDhDQVZyQi9tQjtJQVVxQztRQVd0Q0QsSUF0QkRtQixzQkFzQkNuQjs7U0FBRXVpQjs7TUFrQmtDLElBbEJoQzBFLHVCQXRCTDlsQixHQXNCR29oQjtNQUFNO1dBVEV0aUIsSUFTUnNpQjtPQVJaO1FBQVEsSUFBSmhTLElBYkZ3VyxPQXFCUS9tQixHQVRVQztRQUVqQixrQkFmRW9RLHNCQUFJbFAsR0FjTG9QLFdBUVUwVztTQU5KLDJCQWhCRDlsQixHQWNMb1A7U0FFRixpQkFoQk9wUCxHQWFXbEI7aUJBQ2hCc1E7OztRQUlLLGlCQWxCQXBQLEdBYVdsQixZQVNOZ25COzs7Ozs7O1dBQXNDL21CO09BQUssaUJBdEJoRGlCLEdBc0IyQ2pCLGdCQUF0QyttQjs7TUFrQm9CLFVBbEJ0QjFFOzs7OztJQW1CZCxVQW5CWXZpQjs7U0FNRG1pQjs7O01BY0QsSUFiVWxWLHVCQTdCVDlMLEdBNEJBZ2hCO01BNUJBaGhCLE1BNEJBZ2hCLHdCQTVCQWhoQjtVQTRCRWtoQjtNQUFJO1dBTEl6RCxNQUtSeUQ7T0FKWDtRQUFRLElBRFc2RSxNQXRCakJILE9BMkJPNUUsS0FMVXZELE1BRVgsdUJBekJDemQsR0F1QlUrbEI7UUFFbkIsaUJBekJTL2xCLEdBdUJVeWQ7Ozs7Ozs7V0FNSDRFO09BQ2hCO1lBQUkyRCxVQURZekQ7bUJBQ1p5RDtTQUNKO1FBQ0csbUJBaENFOVcsc0JBQUlsUCxHQThCTGdtQixxQkFEY2xhO1NBTVQsaUJBbkNBOUwsR0E2Qk91aUIsZ0JBQUV6Vzs7U0FJUiwyQkFqQ0Q5TCxHQThCTGdtQjtTQUdGLGlCQWpDT2htQixHQTZCT3VpQjtnQkFDWnlELFlBRFl6RCxNQUNaeUQ7U0FJeUMsaUJBbENwQ2htQixXQTZCUzhMOztRQVlwQixVQWJXa1Y7Ozs7Ozs7O2tCQU5DbmlCOztLQXdCVyxJQUFKK0YscUJBOUNSNUU7O1lBOENRNEU7Ozs7O0lBQW9DO0dBQVU7WUFJL0R3VSxZQUFZbEssS0FBSWxQO2FBQ2QrWSxNQUVXa04sU0FGR0MsU0FBUUMsTUFFTEMsU0FGa0JDLFNBQVFqSyxLQUVwQmtLO0tBRHpCO01BQUlDLFFBQ1NOLFVBRkdDO01BQ2tCTSxRQUNmSixVQUZrQkM7TUFFZkksd0JBRkVOLE1BRUxDO01BQUhNLHdCQUhBMW1CLEdBR0hpbUI7O01BQUdqb0I7TUFBRzRvQjtNQUFHM29CO01BQUc2WDtLQUN2QjtNQUFHLGtCQUpPNUcsS0FHSWxSLElBQU1DO09BU2xCLGlCQVh5Q21lLEtBRXBCdEcsWUFBSDdYO09BU2xCLElBQ0k0b0IsT0FWV0Q7VUFVWEMsUUFYMEJMLGNBL1BsQzFLLEtBNlBnQjliLEdBR0gybUIsSUFGZ0N2SyxLQUVwQnRHLFdBRHJCeVEsUUFDU0k7T0FZUDtRQVptQkc7UUFBSEMsd0JBRkVaLE1BWWhCVTtRQVZXRCxLQVVYQztRQVZjNW9CO1FBQUc2WDs7O01BRXJCLGlCQUp5Q3NHLEtBRXBCdEcsWUFBVDlYO01BRVosSUFDSWdwQixPQUhLTDtTQUdMSyxRQUpKVCxjQS9QSnpLLEtBOFB3QnFLLE1BRUxTLElBRjBCeEssS0FFcEJ0RyxXQURTMFEsUUFDZkk7TUFLYjtPQUxtQks7T0FBVEMsd0JBSEFsbkIsR0FNUmduQjtPQUhLTCxLQUdMSztPQUhRaHBCO09BQVM4WDs7SUFnQnlDO2FBRWhFcVIsUUFBUUMsUUFBT2hMLEtBQUlrSyxRQUFPaG1CO0tBQzVCLFVBRDRCQSxhQUM1Qjs7Ozs7T0FDVTtjQUZBOG1CLFNBQ1Z0b0I7UUFDTThGLHFCQXZCVTVFO1FBd0JWb1AsU0FIZWtYLFNBQ3JCeG5COztXQURxQnduQixVQUdmbFg7O1NBQ21CLGtCQXpCYkYsc0JBcUJLa04sb0JBRVh4WDtVQUdlO2lCQUZmd0s7V0FFZSx1QkFMSmdOO2lCQUdYaE47VUFFRixpQkFMYWdOO1VBR1hoTjs7Ozs7UUFLSixpQkFSZWdOLHFCQUVYeFg7UUFETjs7Ozs7Ozs7SUFRSTthQUVFeWlCLE9BQU9ELFFBQU9oTCxLQUFJa0ssUUFBT2htQjtLQUMvQixHQUQrQkEsVUFDVCxPQVpwQjZtQixRQVdXQyxRQUFPaEwsS0FBSWtLLFFBQU9obUI7U0FFekJwQyxLQUZ5Qm9DLGFBR3pCbkMsS0FIeUJtQyxNQUV6QnBDO0tBRkFtcEIsT0FBT0QsU0FFUGxwQixRQUZja2UsS0FBSWtLLFNBRWxCcG9CLFFBQ0FDO0tBSEFrcEIsT0FBT0QsUUFoQ0dwbkIsR0FnQ0hvbkIsU0FHUGpwQixRQURBRDtLQUdKLE9BcENBNmEsTUErQldxTyxTQUdQanBCLFFBREFELElBRmNrZSxLQUFJa0ssU0FFbEJwb0IsUUFDQUMsSUFIY2llLEtBQUlrSztJQU9yQjtRQUVEem5CLElBekNjbUI7T0F5Q2RuQixRQUNnQixPQXJCaEJzb0IsV0FyQmNubkIsTUF5Q2RuQjtJQUlNO0tBRkpYLEtBRkZXO0tBR0VWLEtBSEZVLElBRUVYO0tBRUFnTyxJQUFJLGVBREovTixxQkE1Q1k2QjtJQWdDVnFuQixPQVdGbnBCLElBRUFnTyxNQURBL047SUFaRWtwQixVQWhDVXJuQixHQTRDWjdCLElBREFEO0lBSUosT0E5Q0U2YSxNQTJDRTVhLElBREFELElBRUFnTyxNQURBL04sSUE1Q1k2QjtHQWlEZjtZQU9EMFQsT0FBTzFUO2FBQ0QyYSxJQUFJN2I7S0FDVixHQURVQSxLQURIa0IsY0FNRjtLQUZLLElBQUo5QyxJQUpDOEMsTUFDR2xCLElBR0EsTUFIQUE7S0FJUixXQURJNUIsaUJyQjlZWCxPcUIyWVd5ZDtJQUtNO0lBRWQ7eUJyQmxaSCxPcUIyWVdBO0dBT0g7WUFFSDhELFFBQVF6ZTthQUNGMmEsSUFBSTdiO0tBQ1YsR0FEVUEsS0FERmtCLGNBTUg7S0FGSyxJQUFKOUMsSUFKRThDLE1BQ0VsQixJQUdBLE1BSEFBO0tBSVIsZUFKUUEsR0FHSjVCLGtCckJ4WlgsT3FCcVpXeWQ7SUFLTTtJQUVkO3lCckI1WkgsT3FCcVpXQTtHQU9IO1lBYUhFLE9BQU93SDtJQUNUO2lCQUEyQi9VLEtBQUlwUSxHQUFLLFdBQUxBLEdBQUpvUSxLQUFlO0lBQWxDLElBVk56TyxJQVVNLG9DQURDd2pCO1NBVFB4akIsR0FETTtJQUVNO0tBRFJNLEtBQUpOOztLQUNNeUIsTUFqUkYwa0IsZUFnUkpubUI7S0FFTW1CLElBQUksZUFESk0sS0FETmxCO0tBQ1ksTUFBTmtCO0tBRVN4QjthQUhYSzs7aUJBR0YsT0FESWE7U0FHSStaLGlCQUFKdUM7S0FIQXRjLE1BQ1NsQixLQUVUd2Q7S0FGSixVQUFheGQsNEJBRUxpYjs7R0FNQzs7OztPQTVYWDFLO09BWUFxVjtPQVVBOVg7O09BTUEyTztPQVRBRjtPQWNBUTtPQUtBQztPQXFEQXJJO09BVUF3UjtPQXpEQXhYO09Ba0NBUztPQXpCQXBKO09BNEJBK0s7T0E2QkF4QztPQU9BaUw7T0FjQXBCO09BcEZBeEk7T0FnQkFzQztPQW1GQTNDO09BUkFFO09BZ0JBUTtPQVVBQztPQVVBdUk7T0FRQUM7T0FRQVU7T0FXQXpKO09BV0FrSztPQWVBRztPQWNBTztPQWtEQUQ7O09Bd0RBMUY7T0FVQStLO09BcUJBNUQ7Ozs7RXJCemFMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJc0IrQkt0ZDtJQUNBQztJQUNBQzs7Ozs7Ozs7Ozs7Ozs7SUFMQXVkO0lBQ0FDO0lBQ0FDO1lBSUFvTSxVQUFXcHFCLEdBQVksT0FBWkEsb0JBQXVCO1lBQ2xDcXFCLFlBQWFycUIsR0FBWSxZQUFaQSxnQkFBd0I7WUFDckNzcUIsT0FBUXRxQixHQUFZLE9BQVpBLGVBQWtCOztJQUcxQlE7SUFDQUM7SUFDQThwQjtJQUlBQztJQUNBbFQ7SUFSQW1UO1lBeUVBQyxXQUFXMXFCO0lBQUksV0FBSkEsS0FBUSx5QkFBUkE7a0JBN0VYb3FCLFVBNkVXcHFCO0dBQThCO1lBS3pDa1ksS0FBS2xZLEdBQUksNEJBQUpBLEdBckZMSyxVQXFGOEI7WUFDOUI4WCxLQUFLblksR0FBSSw0QkFBSkEsR0FyRkxNLGNBcUZrQztZQWNsQ3lILE1BQU0vSCxHQUFFQyxHQUFJLGdDQUFORCxHQUFFQyxXQUFtQjtZQUVsQkYsSUFBS0MsR0FBV0M7SUFDM0IsTUFEZ0JELElBQVdDOztLQUNLLEtBQWhCLG1CQURXQSxNQUNLLG1CQURoQkQ7b0JBR1IsT0FIUUEsYUFBV0M7O0lBRXRCLE9BRnNCQSxhQUFYRDtHQUdjO1lBRW5CRSxJQUFLRixHQUFXQztJQUMzQixNQURnQkQsSUFBV0M7O0tBQ0ssS0FBaEIsbUJBRFdBLE1BQ0ssbUJBRGhCRDtvQkFHUixPQUhtQkMsYUFBWEQ7O0lBRVgsT0FGV0EsYUFBV0M7R0FHRztZQUVuQjBxQixRQUFTM3FCLEdBQVdDO0lBQy9CLEdBRG9CRCxVQUFXQztXQUFYRCxJQUFXQzs7TUFFTSxLQUFoQixtQkFGVUEsTUFFTSxtQkFGakJEO3FCQUU4QyxXQUZuQ0MsR0FBWEQ7O0tBRWtDLFdBRmxDQSxHQUFXQzs7SUFDRixXQS9HM0JNO0dBZ0hzRTtZQUU3RHFxQixRQUFTNXFCLEdBQVdDO0lBQy9CLE1BRG9CRCxJQUFXQzs7S0FDQyxLQUFoQixtQkFEZUEsTUFDQyxtQkFEWkQ7b0JBR1osT0FIdUJDLFNBQVhELElBQVdDOztJQUUxQixPQUZlRCxTQUFXQyxJQUFYRDtHQUdVO1lBRW5CNnFCLFFBQVM3cUIsR0FBV0M7SUFDL0IsTUFEb0JELElBQVdDOztLQUNDLEtBQWhCLG1CQURlQSxNQUNDLG1CQURaRDtvQkFHWixPQUhZQSxTQUFXQyxJQUFYRDs7SUFFZixPQUYwQkMsU0FBWEQsSUFBV0M7R0FHRDtZQUVuQjZxQixZQUFhOXFCLEdBQVdDO0lBQ25DLEdBRHdCRCxRQUNQLFdBRGtCQztJQUUzQixHQUYyQkEsUUFFYixXQUZFRDtjQUFXQzs7S0FHRSxLQUFoQixtQkFIY0EsTUFHRSxtQkFIYkQ7b0JBR3lDLFdBSDlCQyxHQUFYRDs7SUFHOEIsV0FIOUJBLEdBQVdDO0dBR21DO1lBSXBFeVksS0FBSzFZLEdBQUkscUNBQUpBLEdBQWdDO1lBYW5DK3FCLFlBQVlqb0IsR0FBRUssS0FBSUMsS0FBSUk7SUFDeEIsWUFEZ0JMLE1BQUlDO2VBQUpEO1NBQ2hCdkIsSUFEZ0J1Qjs7TUFBRkwsTUFDZGxCLEtBRHdCNEI7TUFDUSxXQUFoQzVCOzs7Ozs7R0FBcUQ7WUFLbkRvcEIsTUFBTWxvQixHQUFFSyxLQUFJQyxLQUFJcUs7SUFDbEIsV0FEVXRLOzs7O2dCQUFJQzs7Ozs7ZUFBSkQsTUFBSUM7dUJBQU5OLGdCQUFFSyxNQUFJQzs7a0JBRVosc0JBRmdCcUs7R0FFRDtZQUVmeVEsS0FBSy9jLEdBQUVxQztJQUNJLElBQVRtTCxTQUFTLHVCQUROeE47SUFWTDRwQixZQVdFcGMsV0FER3hOLEdBQUVxQztJQUVULE9BREltTDtHQUVFO1lBRUp3RCxLQUFLeFEsR0FBRWpDO0lBQ1QsT0FET2lDLEdBQ087SUFFRixJQUFOb0QsTUFBTSx1QkFITHBELElBSUwsT0FKS0EsV0FHSzs7U0FDVkM7O01BREltRCxRQUNKbkQsS0FDbUIsV0FMWmxDLEdBSVBrQztNQUNFLFdBREZBOzs7OztJQUdBLE9BSkltRDtHQUlEO1lBRUgySyxPQUFPd0ssSUFBR0Q7SUFDWjtLQUFJalosS0FES2taO0tBRUxqWixLQUZRZ1o7S0FHUnRMLFNBQVMsdUJBRlQzTixLQUNBQztJQUVKLHFCQUpTaVosT0FHTHZMLFdBRkEzTjtJQUlKLHFCQUxZaVosT0FHUnRMLFFBRkEzTixJQUNBQztJQUdKLE9BRkkwTjtHQUdFO1lBVUpzQixPQUdXdE87SUFGYixJQUFJeU8saUJBRVN6Tzs7OztPQUxMTTtPQUFOQztPQUxXbEMsSUFLWGtDLGdCQUdFa087c0JBUlNwUSxRQUNTO09BT2xCb1E7ZUFISW5POzs7S0FJSyxJQUFUME0sU0FBUyx1QkFEVHlCLE1BRVMrSSxTQUFFdlg7S0FDYjtTQURXdVg7T0FJVCxJQUpTMEQsZUFHVHVDLE9BSFNqRyxRQUlMOFIsT0FESjdMO09BRUEscUJBRkFBLFNBSkF6USxRQUNXL00sR0FJUHFwQjtXQUpPcHBCLFVBSVBvcEIsVUFKSzlSLFlBQUV2WDs7O2VBRlh3TyxLQVVKLE9BVEl6QjtNQUdNOzs7R0FPSjtZQUVKMFAsSUFBSXZiLEdBQUVLLEtBQUlDO0lBaERWNG5CLE1BZ0RJbG9CLEdBQUVLLEtBQUlDO0lBRUMsSUFBVHVMLFNBQVMsdUJBRkR2TDtJQUdaLHFCQUhNTixHQUFFSyxLQUVKd0wsV0FGUXZMO0lBR1osT0FESXVMO0dBRUU7WUFFSndQLEtBQUtyYjtJQUNQLElBQUluQixJQURHbUIsY0FFSDZMLFNBQVMsdUJBRFRoTjtJQUVKLHFCQUhPbUIsTUFFSDZMLFdBREFoTjtJQUVKLE9BRElnTjtHQUVFO1lBRUpnUSxLQUFLN2IsR0FBRUssS0FBSUMsS0FBSUk7SUE1RGZ3bkIsTUE0REtsb0IsR0FBRUssS0FBSUM7SUFDYixPQW5FRTJuQixZQWtFS2pvQixHQUFFSyxLQUFJQyxLQUFJSTtHQUVNO1lBRXJCb2IsS0FBS3NNLEtBQUlDLE1BQUtqTSxLQUFJa00sTUFBS2hvQjtJQWhFdkI0bkIsTUFnRUtFLEtBQUlDLE1BQWMvbkI7SUFoRXZCNG5CLE1BZ0VjOUwsS0FBSWtNLE1BQUtob0I7SUFHekIsNEJBSE84bkIsS0FBSUMsTUFBS2pNLEtBQUlrTSxNQUFLaG9CO0dBR1E7WUFFL0JtVCxRQUFRelQ7SUFDVyxvQnRCN1AxQixPc0I0UGVBO0lBQ1csbUNBRFhBO0dBQ3lCO1lBRWpDaWxCLFFBRWFwbUI7SUFEZjtLQUFJZ04sU0FBUyx1QkFBTywyQkFDTGhOO0tBQUZDO0tBQUV1WDtJQUNiO1VBRGFBLEtBQWYsT0FESXhLO1NBQ1dLLFlBR1hxYyxJQUhXbFM7S0FEWHhLLFdBQ1MvTSxLQUdUeXBCO0tBSEosSUFBYXhwQiwwQkFBRXNYOztHQUtQO1lBR041SSxLQUFLN1EsR0FBRW9EO0lBQ1QsV0FEU0Esc0JBQ1Q7Ozs7TUFBNkIsV0FEdEJwRCxHQUFFb0QsTUFDVGxCO01BQTZCLFdBQTdCQTs7Ozs7O0dBQW9EO1lBR2xENFAsTUFBTTlSLEdBQUVvRCxHQUFFekI7SUFDWixHQURVeUIsaUJBQUV6QjtLQUVWO0lBRUEsV0FKUXlCLHNCQUlSOzs7O01BQTZCLFdBSnZCcEQsR0FBRW9ELE1BSVJsQixJQUpVUCxNQUlWTztNQUE2QixXQUE3QkE7Ozs7OztHQUFxRTtZQUVyRWdHLElBQUlsSSxHQUFFb0Q7SUFDUjtLQUFJbkIsSUFESW1CO0tBRUpxQixJQUFJLHVCQURKeEM7S0FFSixNQUZJQTtLQUNJOztTQUNSQzs7TUFESXVDLE1BQ0p2QyxLQUNpQixXQUpYbEMsR0FBRW9ELE1BR1JsQjtNQUNFLFVBREZBOzs7OztJQUdBLE9BSkl1QztHQUlIO1lBRUMyUCxLQUFLcFUsR0FBRW9ELEdBQUV6QjtJQUNYLElBQUlzbUIsS0FESzdrQixjQUVMOGtCLEtBRk92bUI7T0FDUHNtQixPQUNBQztLQUVGO0lBRVEsSUFBSnpqQixJQUFJLHVCQUxOd2pCLEtBTUYsTUFORUEsWUFLTTs7U0FDUi9sQjs7TUFESXVDLE1BQ0p2QyxLQUNpQixXQVJabEMsR0FBRW9ELE1BT1BsQixJQVBTUCxNQU9UTztNQUNFLFVBREZBOzs7OztJQUdBLE9BSkl1QztHQUtIO1lBR0Q2TSxNQUFNdFIsR0FBRW9EO0lBQ1YsVUFEVUEsc0JBQ1Y7Ozs7TUFBNkIsV0FEckJwRCxHQUNSa0MsR0FEVWtCLE1BQ1ZsQjtNQUE2QixVQUE3QkE7Ozs7OztHQUFzRDtZQUVwRCtRLEtBQUtqVCxHQUFFb0Q7SUFDVDtLQUFJbkIsSUFES21CO0tBRUxxQixJQUFJLHVCQURKeEM7S0FFSixNQUZJQTtLQUNJOztTQUNSQzs7TUFESXVDLE1BQ0p2QyxLQUNpQixXQUpWbEMsR0FHUGtDLEdBSFNrQixNQUdUbEI7TUFDRSxVQURGQTs7Ozs7SUFHQSxPQUpJdUM7R0FJSDtZQUdDZ00sVUFBVXpRLEdBQUVNLEdBQUU4QztJQUNoQixJQUFJcUIsUUFEVW5FLFVBQUU4QyxzQkFDUjs7U0FDUmxCOztNQURJdUMsT0FFRyxXQUhLekUsR0FDUnlFLE1BRFlyQixNQUVoQmxCOzs7Ozs7V0FESXVDO0dBSUY7WUFHQTZWLFdBQVd0YSxHQUFFb0QsR0FBRTlDO0lBQ2pCLElBQUltRSxRQURhbkUsSUFFakIsTUFGZThDOztTQUVmbEI7O01BREl1QyxPQUVHLFdBSE16RSxHQUFFb0QsTUFFZmxCLElBREl1QztNQUNKOzs7OztXQURJQTtHQUlGO1lBR0FrTixPQUFPRCxHQUFFdE87SUFDWCxJQUFJM0IsSUFETzJCLGNBRUVsQjtJQUNYO1FBRFdBLE1BRFRULEdBRVk7S0FDTixjQUpEaVEsR0FBRXRPLE1BRUVsQixLQUVxQjtLQUMzQixJQUhNQzs7R0FJUDtZQUdKc1AsUUFBUUMsR0FBRXRPO0lBQ1osSUFBSTNCLElBRFEyQixjQUVDbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO0tBQ04sZ0JBSkFpUSxHQUFFdE8sTUFFQ2xCLEtBR047S0FEMkIsSUFGckJDOztHQUlQO1lBR0p3WSxJQUFJcmEsR0FBRThDO0lBQ1IsSUFBSTNCLElBREkyQixjQUVLbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO2NBQ0UsbUJBSlYyQixNQUVLbEIsSUFGUDVCLElBSXdDO0tBQ3ZDLElBSE02Qjs7R0FLUDtZQUdKeXBCLFNBQVN0ckIsR0FBRThDO0lBQ2IsSUFBSTNCLElBRFMyQixjQUVBbEI7SUFDWDtRQURXQSxNQURUVCxHQUVZO1FBSExuQixLQUFFOEMsTUFFQWxCLElBRXVCO0tBQzdCLElBSE1DOztHQUtQO0dBR1I7O1lBQ0lzYSxLQUFLbkssS0FBSWxQO2FBQ1A0bEIsT0FBTy9tQixHQUFFQztLQUNYLElBQUkrbUIsUUFETy9tQiw2QkFFUDVCLFFBREEyb0I7d0JBREtobkI7O1FBSUo7VUFMQXFRLEtBS0ksZUFMQWxQLEdBRUw2bEIsTUFHaUIsZUFMWjdsQixHQUVMNmxCOztPQUNBM29CLE9BREEyb0I7O1FBSUM7VUFOQTNXLEtBTUksZUFOQWxQLEdBR0w5QyxPQUdnQixlQU5YOEMsR0FFTDZsQjs7T0FDQTNvQixPQURBMm9CO2FBQ0Ezb0I7O0tBTWM7UUFQZDJvQixlQURLaG5COzs7O1NBUVM7V0FUYnFRLEtBU2lCLGVBVGJsUCxHQUVMNmxCLE1BTzhCLGVBVHpCN2xCLEdBRUw2bEI7TUFRRyxPQVJIQTtjQURLaG5CLEdBVWMsT0FUbkJnbkI7S0FTNEIsOENBVnJCL21CO0lBVXFDO1FBV3RDRCxJQXRCRG1CLHNCQXNCQ25COztTQUFFdWlCOztNQWtCa0MsSUFsQmhDMEUsTUFrQmdDLGVBeENyQzlsQixHQXNCR29oQjtNQUFNO1dBVEV0aUIsSUFTUnNpQjtPQVJaO1FBQVEsSUFBSmhTLElBYkZ3VyxPQXFCUS9tQixHQVRVQztRQUVqQixrQkFmRW9RLEtBZUUsZUFmRWxQLEdBY0xvUCxJQVFVMFc7U0FOWixlQWhCTzlsQixHQWFXbEIsR0FHVixlQWhCRGtCLEdBY0xvUDthQURnQnRRLElBQ2hCc1E7OztRQUlLLGVBbEJBcFAsR0FhV2xCLEdBU05nbkI7Ozs7Ozs7V0FBc0MvbUI7T0FBSyxlQXRCaERpQixHQXNCMkNqQixLQUF0QyttQjs7TUFrQm9CLFVBbEJ0QjFFOzs7OztJQW1CZCxVQW5CWXZpQjs7U0FNRG1pQjs7O01BY0QsSUFiVWxWLE1BYVYsZUExQ0M5TCxHQTRCQWdoQjtNQWVULGVBM0NTaGhCLEdBNEJBZ2hCLEtBZUQsZUEzQ0NoaEI7VUE0QkVraEI7TUFBSTtXQUxJekQsTUFLUnlEO09BSlg7UUFBUSxJQURXNkUsTUF0QmpCSCxPQTJCTzVFLEtBTFV2RDtRQUVuQixlQXpCU3pkLEdBdUJVeWQsS0FFWCxlQXpCQ3pkLEdBdUJVK2xCOzs7Ozs7O1dBTUgxRDtPQUNoQjtZQUFJMkQsVUFEWXpEO21CQUNaeUQ7U0FDSjtRQUNHLG1CQWhDRTlXLEtBZ0NFLGVBaENFbFAsR0E4QkxnbUIsU0FEY2xhO1NBTVQsZUFuQ0E5TCxHQTZCT3VpQixLQUFFelc7O1NBSWhCLGVBakNPOUwsR0E2Qk91aUIsS0FJTixlQWpDRHZpQixHQThCTGdtQjs0QkFEWXpELE1BQ1p5RDtTQUl5QyxlQWxDcENobUIsTUE2QlM4TDs7UUFZcEIsVUFiV2tWOzs7Ozs7OztrQkFOQ25pQjs7S0F3QlcsSUFBSitGLElBQUksZUE5Q1o1RTtLQThDeUIsZUE5Q3pCQSxNQThDaUMsZUE5Q2pDQTtlQThDNEMsZUE5QzVDQSxNQThDUTRFOzs7O0lBQW9DO0dBQVU7WUFJL0R3VSxZQUFZbEssS0FBSWxQO2FBQ2QrWSxNQUVXa04sU0FGR0MsU0FBUUMsTUFFTEMsU0FGa0JDLFNBQVFqSyxLQUVwQmtLO0tBRHpCO01BQUlDLFFBQ1NOLFVBRkdDO01BQ2tCTSxRQUNmSixVQUZrQkM7TUFFZkksT0FnQmtCLGVBbEJoQk4sTUFFTEM7TUFBSE0sT0FnQkEsZUFuQkExbUIsR0FHSGltQjs7TUFBR2pvQjtNQUFHNG9CO01BQUczb0I7TUFBRzZYO0tBQ3ZCO01BQUcsa0JBSk81RyxLQUdJbFIsSUFBTUM7T0FTbEIsZUFYeUNtZSxLQUVwQnRHLEdBQUg3WDtPQVNsQixJQUNJNG9CLE9BVldEO1VBVVhDLFFBWDBCTCxjQXpLbEMxSyxLQXVLZ0I5YixHQUdIMm1CLElBRmdDdkssS0FFcEJ0RyxXQURyQnlRLFFBQ1NJO09BWVA7UUFabUJHO1FBQUhDLE9BWUYsZUFkSVosTUFZaEJVO1FBVldELEtBVVhDO1FBVmM1b0I7UUFBRzZYOzs7TUFFckIsZUFKeUNzRyxLQUVwQnRHLEdBQVQ5WDtNQUVaLElBQ0lncEIsT0FIS0w7U0FHTEssUUFKSlQsY0F6S0p6SyxLQXdLd0JxSyxNQUVMUyxJQUYwQnhLLEtBRXBCdEcsV0FEUzBRLFFBQ2ZJO01BS2I7T0FMbUJLO09BQVRDLE9BS0YsZUFSRWxuQixHQU1SZ25CO09BSEtMLEtBR0xLO09BSFFocEI7T0FBUzhYOztJQWdCeUM7YUFFaEVxUixRQUFRQyxRQUFPaEwsS0FBSWtLLFFBQU9obUI7S0FDNUIsVUFENEJBLGFBQzVCOzs7OztPQUNVO1FBQUpzRSxJQUFJLGVBdkJNNUUsR0FxQk5vbkIsU0FDVnRvQjtRQUVNc1EsU0FIZWtYLFNBQ3JCeG5COztRQUd5QjtVQUpKd25CLFVBR2ZsWCxZQUNtQixXQXpCYkYsS0F5QmlCLGVBSlprTixLQUdYaE4sT0FEQXhLO1NBR0YsZUFMYXdYLEtBR1hoTixjQUVlLGVBTEpnTixLQUdYaE47Ozs7UUFLSixlQVJlZ04sS0FHWGhOLGNBREF4SztRQUROOzs7Ozs7OztJQVFJO2FBRUV5aUIsT0FBT0QsUUFBT2hMLEtBQUlrSyxRQUFPaG1CO0tBQy9CLEdBRCtCQSxVQUNULE9BWnBCNm1CLFFBV1dDLFFBQU9oTCxLQUFJa0ssUUFBT2htQjtTQUV6QnBDLEtBRnlCb0MsYUFHekJuQyxLQUh5Qm1DLE1BRXpCcEM7S0FGQW1wQixPQUFPRCxTQUVQbHBCLFFBRmNrZSxLQUFJa0ssU0FFbEJwb0IsUUFDQUM7S0FIQWtwQixPQUFPRCxRQWhDR3BuQixHQWdDSG9uQixTQUdQanBCLFFBREFEO0tBR0osT0FwQ0E2YSxNQStCV3FPLFNBR1BqcEIsUUFEQUQsSUFGY2tlLEtBQUlrSyxTQUVsQnBvQixRQUNBQyxJQUhjaWUsS0FBSWtLO0lBT3JCO1FBRUR6bkIsSUF6Q2NtQjtPQXlDZG5CLFFBQ2dCLE9BckJoQnNvQixXQXJCY25uQixNQXlDZG5CO0lBSU0sSUFGSlgsS0FGRlcsV0FHRVYsS0FIRlUsSUFFRVgsUUFFQWdPLElBQUksdUJBREovTjtJQVpFa3BCLE9BV0ZucEIsSUFFQWdPLE1BREEvTjtJQVpFa3BCLFVBaENVcm5CLEdBNENaN0IsSUFEQUQ7SUFJSixPQTlDRTZhLE1BMkNFNWEsSUFEQUQsSUFFQWdPLE1BREEvTixJQTVDWTZCO0dBaURmO1lBS0QwVCxPQUFPMVQ7YUFDRDJhLElBQUk3YjtLQUNWLEdBRFVBLEtBREhrQixjQU1GO0tBRkssSUFBSjlDLElBSkM4QyxNQUNHbEIsSUFHQSxNQUhBQTtLQUlSLFdBREk1QixpQnRCeGRiLE9zQnFkYXlkO0lBS007SUFFZDt5QnRCNWRMLE9zQnFkYUE7R0FPSDtZQUdIOEQsUUFBUXplO2FBQ0YyYSxJQUFJN2I7S0FDVixHQURVQSxLQURGa0IsY0FNSDtLQUZLLElBQUo5QyxJQUpFOEMsTUFDRWxCLElBR0EsTUFIQUE7S0FJUixlQUpRQSxHQUdKNUIsa0J0Qm5lYixPc0JnZWF5ZDtJQUtNO0lBRWQ7eUJ0QnZlTCxPc0JnZWFBO0dBT0g7WUFhSEUsT0FBT3dIO0lBQ1Q7aUJBQTJCL1UsS0FBSXBRLEdBQUssV0FBTEEsR0FBSm9RLEtBQWU7SUFBbEM7S0FYTXpPLElBV04sb0NBREN3akI7S0FUTC9oQixNQUFNLDJCQURJekI7S0FFVm1CLElBQUksdUJBREpNO0tBQU0sTUFBTkE7S0FFU3hCO2FBSENEOztpQkFHZCxPQURJbUI7U0FHSWIsZUFBSkM7S0FIQVksTUFDU2xCLEtBRVRNO0tBRkosVUFBYU4sNEJBRUxLOztHQU9LO1lBR1hzcEIsYUFBYTdyQixHQUFFb0Q7SUFDakIsSUFBSW5CLElBRGFtQjtJQUVqQixTQURJbkIsR0FDVTtJQUNKO0tBQUp3QyxJQUFJLHVCQUZOeEMsR0FFbUIsV0FIUmpDLEdBQUVvRDtLQUlmLE1BSEVuQjtLQUVNOztTQUNSQzs7TUFESXVDLE1BQ0p2QyxLQUN1QixXQUxWbEMsR0FBRW9ELE1BSWZsQjtNQUNFLFVBREZBOzs7OztJQUdBLE9BSkl1QztHQUtIO1lBRURxbkIsZUFBZTlyQixHQUFFb0Q7SUFDbkI7S0FBSW5CLElBRGVtQjtLQUVmcUIsSUFBSSx1QkFESnhDO0tBRUosTUFGSUE7S0FDSTs7U0FDUkM7O01BREl1QyxNQUNKdkMsS0FDaUIsV0FKQWxDLEdBQUVvRCxNQUduQmxCO01BQ0UsVUFERkE7Ozs7O0lBR0EsT0FKSXVDO0dBSUg7Ozs7Ozs7cUJ0QnpnQk47OztPc0IyTE8rWjs7T0FLQS9MO09BU0F6QztPQWdCQU87T0FjQW9PO09BTUFGO09BTUFRO09BSUFDO09BS0FySTtPQUdBd1I7T0FVQXhYO09BZ0NBUztPQXRCQXBKO09BeUJBK0s7T0FTQXhDO09BUUE2SjtPQWhEQXhJO09BY0FzQztPQW1EQTNDO09BVEFFO09Ba0JBZ0o7T0FVQWlSO09BV0FuUDtPQWtEQUQ7O09Bc0RBMUY7T0FXQStLO09BcUJBNUQ7T0FLQTROO09BVUFDOzs7Ozs7T0F2ZUYxTjtPQUNBQztPQUNBQztPQXNGQTlGO09BQ0FDO09BdEZBOVg7T0FDQUM7T0FDQUM7T0FLQWtxQjtPQUNBanFCO09BQ0FDO09BQ0E4cEI7T0FQQUg7T0FDQUM7T0FDQUM7T0EyRUFJO09BbEVBRjtPQUNBbFQ7O09BcUZBdlA7T0FFU2hJO09BS0FHO09BS0F5cUI7T0FJQUM7T0FLQUM7T0FLQUM7T0FPVHBTOztzQnRCcEtMOzs7UXNCMkxPd0Y7O1FBS0EvTDtRQVNBekM7UUFnQkFPO1FBY0FvTztRQU1BRjtRQU1BUTtRQUlBQztRQUtBckk7UUFHQXdSO1FBVUF4WDtRQWdDQVM7UUF0QkFwSjtRQXlCQStLO1FBU0F4QztRQVFBNko7UUFoREF4STtRQWNBc0M7UUFtREEzQztRQVRBRTtRQWtCQWdKO1FBVUFpUjtRQVdBblA7UUFrREFEOztRQXNEQTFGO1FBV0ErSztRQXFCQTVEO1FBS0E0TjtRQVVBQzs7OztFdEJuZ0JQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0l1QjZDSzFOO0lBQ0FDO0lBQ0FDO1lBQ0E5RixLQUFLL1csR0FBSSxPQUFKQSxVQUFZO1lBQ2pCZ1gsS0FBS2hYLEdBQUksT0FBSkEsVUFBWTtZQUNqQmhCLElBQUlnQixHQUFJLE9BQUcsa0JBQVBBLG9CQUFnQztPQUNwQ1AsdUJBQ0FEO1lBQ0FzZCxPQUFPOWMsR0FBSSxPQUFKQSxPQUFrQjs7O0lBS3ZCO0tBQUlzcUI7S0FITkM7Z0JBSU12cUI7UUFDRixRQUFHLG9CQUREQSxXQUN3QixpQkFEeEJBLEdBREFzcUI7U0FHQSxXQUZBdHFCO1FBSUE7T0FBSTs7O0tBTVI7UUFkRnVxQiwyQkFZTXZxQixHQUFLLFdBQUxBLFFBQThCOztZQUtwQ21XLFVBQVVuVyxHQUFJLHFDQUFKQSxHQUFpQjtZQUkzQnFwQixjQUFjM3FCO0lBRWhCLElBQUksY0FBSywyQkFGT0EsS0FFWjs7OzhCQUNjOzs7R0FBSTtPQUlwQnlJO1lBQ0FQLE1BQU8vSCxHQUFPQyxHQUFRLDhCQUFmRCxHQUFPQyxXQUF1QjtZQUVyQzByQixpQkFBaUJ4cUIsR0FBRXlxQjtJQUNyQixPQUF3QixpQkFETHpxQixvQkFBRXlxQjtHQUNrQjtZQUVyQzdyQixJQUFJQyxHQUFFQyxHQUFRLE9BQUcsdUJBQWJELEdBQUVDLEtBQUZELElBQUVDLEVBQStCO1lBQ3JDQyxJQUFJRixHQUFFQyxHQUFRLE9BQUcsa0JBQWJELEdBQUVDLEtBQUZELElBQUVDLEVBQStCO1lBS3JDNHJCLGFBQWExcUIsR0FBRXlYO0lBQ2pCLEdBQUcsc0JBRGNBO0tBRVosWUFYSCtTLGlCQVNheHFCLEdBQUV5WCxLQWpEZm1GLE1BREFEO0lBc0RRLElBQUpnTyxJQUFlLGlCQUpOM3FCLGFBQUV5WCxTQUtYelUsSUFMU2hELElBS0MsU0FEVjJxQixHQUpXbFQ7SUFNWixZQWZIK1MsaUJBY0l4bkIsR0FMV3lVLEtBSVhrVDtHQUUyQztZQUUvQ0MsYUFBYTVxQixHQUFFeVg7SUFDakIsT0FEZXpYLElBQ1QsU0FUSjBxQixhQVFhMXFCLEdBQUV5WDtHQUNlOzs7O09BM0Q5QmtGO09BQ0FDO09BQ0FDO09BZ0RBNk47T0FRQUU7T0F2REE3VDtPQUNBQztPQUNBaFk7T0FFQVE7T0FEQUM7T0FFQXFkO09BRUF5TjtPQXFCQWxCO09BSkFsVDtPQVdBaFA7T0FHQXFqQjtPQUZBNWpCO09BS0FoSTtPQUNBRzs7O0V2QjFGTDs7Ozs7Ozs7Ozs7Ozs7OztJd0IyQ0s0ZDtJQUNBQztJQUNBQztJQUlBcGQ7SUFDQUQ7Ozs7OztZQUpBdVgsS0FBSy9XLEdBQUksOEJBQUpBLFFBQVk7WUFDakJnWCxLQUFLaFgsR0FBSSxzQkFBSkEsUUFBWTtZQUNqQmhCLElBQUlnQjtJQUFJLE9BQUcsa0JBQVBBLGNBQTJCLHVCQUEzQkE7R0FBZ0M7WUFHcEM4YyxPQUFPOWMsR0FBSSw4QkFBSkEsUUFBa0I7R0FHYixJQUFWc3FCLFlBQVU7WUFEWkMsZ0JBRUV2cUI7SUFDRjtXQUFHLG1CQWJIMmMsTUFZRTNjO2NBQ3dCLG1CQUR4QkEsR0FEQXNxQjtLQUdBLHVDQUZBdHFCO0lBSUE7R0FBSTtZQUdObVcsVUFBVW5XLEdBQUksdUNBQUpBLEdBQWlCO1lBSTNCcXBCLGNBQWMzcUI7SUFFaEIsSUFBSSxjQUFLLDZCQUZPQSxLQUVaOzs7OEJBQ2M7OztHQUFJO1lBYXBCeUksUUFBU3RJLEdBQU9DLEdBQVEsMEJBQWZELEdBQU9DLEdBQTBCO1lBQzFDOEgsTUFBTy9ILEdBQU9DLEdBQVEsZ0NBQWZELEdBQU9DLFdBQXVCO1lBRXJDMHJCLGlCQUFpQnhxQixHQUFFeXFCO0lBQ3JCLE9BQXdCO2FBQWhCLGVBRFd6cUIsR0FwQ2pCUCxVQXFDc0IsZUFESGdyQixHQXBDbkJockI7R0FxQ3FDO1lBRXJDYixJQUFJQyxHQUFFQyxHQUFRLE9BQUcsdUJBQWJELEdBQUVDLEtBQUZELElBQUVDLEVBQStCO1lBQ3JDQyxJQUFJRixHQUFFQyxHQUFRLE9BQUcsa0JBQWJELEdBQUVDLEtBQUZELElBQUVDLEVBQStCO1lBS3JDNHJCLGFBQWExcUIsR0FBRXlYO0lBQ2pCLEdBQUcsc0JBRGNBLEdBbkRma0Y7S0FxREcsWUFYSDZOLGlCQVNheHFCLEdBQUV5WCxLQWxEZm1GLE1BREFEO0lBdURRO0tBQUpnTztPQUFJO1NBQVc7V0FBSyx3Q0FKWDNxQixPQUFFeVg7O0tBS1h6VSxJQUFJLGVBTEtoRCxHQUtDLGVBRFYycUIsR0FKV2xUO0lBTVosWUFmSCtTLGlCQWNJeG5CLEdBTFd5VSxLQWhEZlYsS0FvREk0VDtHQUUyQztZQUUvQ0MsYUFBYTVxQixHQUFFeVg7SUFDakIsc0JBRGV6WCxHQUNULGVBVEowcUIsYUFRYTFxQixHQUFFeVg7R0FDZTs7OztPQTVEOUJrRjtPQUNBQztPQUNBQztPQWlEQTZOO09BUUFFO09BeERBN1Q7T0FDQUM7T0FDQWhZO09BRUFRO09BREFDO09BRUFxZDtPQUVBeU47T0FhQWxCO09BSkFsVDtPQW9CQWhQO09BR0FxakI7T0FGQTVqQjtPQUtBaEk7T0FDQUc7OztFeEJ6Rkw7Ozs7Ozs7Ozs7Ozs7Ozs7O0l5QnlDSzRkO0lBQ0FDO0lBQ0FDO1lBQ0E5RixLQUFLL1csR0FBSSxPQUFKQSxVQUFZO1lBQ2pCZ1gsS0FBS2hYLEdBQUksT0FBSkEsVUFBWTtZQUNqQmhCLElBQUlnQixHQUFJLE9BQUcsa0JBQVBBLG9CQUFnQztHQUUxQjtJQURWNnFCO0lBQ0FwckIsZ0JBREFvckI7SUFFQXJyQixVQURBQztZQUVBcWQsT0FBTzljLEdBQUksT0FBSkEsT0FBa0I7T0FHdkJzcUI7WUFERkMsZ0JBRUV2cUI7SUFDRixRQUFHLG9CQUREQSxXQUN3QixpQkFEeEJBLEdBREFzcUI7S0FHQSxXQUZBdHFCO0lBSUE7R0FBSTtZQUdObVcsVUFBVW5XLEdBQUkscUNBQUpBLEdBQWlCO1lBSTNCcXBCLGNBQWMzcUI7SUFFaEIsSUFBSSxjQUFLLDJCQUZPQSxLQUVaOzs7OEJBQ2M7OztHQUFJO09BSXBCeUk7WUFDQVAsTUFBTy9ILEdBQU9DLEdBQVEsOEJBQWZELEdBQU9DLFdBQXVCO1lBRXJDMHJCLGlCQUFpQnhxQixHQUFFeXFCO0lBQ3JCLE9BQXdCLGlCQURMenFCLElBM0JqQlAsYUEyQm1CZ3JCLElBM0JuQmhyQjtHQTRCcUM7WUFFckNiLElBQUlDLEdBQUVDLEdBQVEsT0FBRyx1QkFBYkQsR0FBRUMsS0FBRkQsSUFBRUMsRUFBK0I7WUFDckNDLElBQUlGLEdBQUVDLEdBQVEsT0FBRyxrQkFBYkQsR0FBRUMsS0FBRkQsSUFBRUMsRUFBK0I7WUFLckM0ckIsYUFBYTFxQixHQUFFeVg7SUFDakIsR0FBRyxzQkFEY0E7S0FFWixZQVhIK1MsaUJBU2F4cUIsR0FBRXlYLEtBMUNmbUYsTUFEQUQ7SUErQ1EsSUFBSmdPLElBQWUsaUJBSk4zcUIsYUFBRXlYLFNBS1h6VSxJQUxTaEQsSUFLQyxTQURWMnFCLEdBSldsVDtJQU1aLFlBZkgrUyxpQkFjSXhuQixHQUxXeVUsS0FJWGtUO0dBRTJDO1lBRS9DQyxhQUFhNXFCLEdBQUV5WDtJQUNqQixPQURlelgsSUFDVCxTQVRKMHFCLGFBUWExcUIsR0FBRXlYO0dBQ2U7Ozs7T0FwRDlCa0Y7T0FDQUM7T0FDQUM7T0F5Q0E2TjtPQVFBRTtPQWhEQTdUO09BQ0FDO09BQ0FoWTtPQUNBNnJCO09BRUFyckI7T0FEQUM7T0FFQXFkO09BRUF5TjtPQWFBbEI7T0FKQWxUO09BV0FoUDtPQUdBcWpCO09BRkE1akI7T0FLQWhJO09BQ0FHOzs7RXpCL0VMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJMEJ5QksrckI7SUFtSEFDOzs7Ozs7WUE1RUFDLE9BQU9DLEtBQUlDLE9BQU0zbkI7SUFDbkI7S0FBSWlLLFNBQVMsd0JBREp5ZCxLQUFJQyxPQUFNM25CO2dCQUNmaUs7aUJBRGVqSyxZQXZDakJ1bkI7O0tBdUNpQnZuQjs7OztJQU9uQixPQU5JaUs7R0FNRTtZQUdKMmQsV0FBV0YsS0FBSUMsT0FBTTNuQjtJQUN2QjtLQUFJaUssU0FBUyw0QkFEQXlkLEtBQUlDLE9BQU0zbkI7Z0JBQ25CaUs7aUJBRG1CakssWUFqRHJCdW5COztLQWlEcUJ2bkI7Ozs7SUFPdkIsT0FOSWlLO0dBTUU7WUFrRUo0ZCxjQUFnQkMsS0FBdUJDO0lBQ3pDLEdBRGtCRDtTQUFpQkUsTUFBakJGLHlCQUFpQkU7O1NBQWpCQztJQUNsQjtXQURrQkEsaUJBUGhCVCxXQW5IQUQ7V0EwSGdCVSxpQkFQaEJULFdBbkhBRDtLQTBEb0JXLGFBaUVPOztLQVFqQjs7Ozs7OztLQVBHO0lBRGY7cUJBakVpQ0M7YUFFL0I7Y0FERUM7Z0JBQ0Y7a0JBOER1Q0wsVUFoRW5CRztjQUdsQnpyQixRQUZBMnJCLGVBRDZCRDsrREFHN0IxckI7O2tCQUg2QjByQiw2QkFHN0IxckI7d0NBSDZCMHJCO2VBaUIxQjs7aUJBakIwQkE7Ozs7OztlQTRCM0I7Z0JBREVFO2tCQUNGOzs2Q0E1QjJCRjs7a0JBMkJ6QkUsV0EzQnlCRiw2QkFHN0IxckI7Z0JBMkJLO2VBQ1EsSUFBVDZyQixTQUFTLGtCQUpURDtlQU1KOztpQkFqQzZCRjs7aUJBK0J6Qkc7O2lCQS9CeUJIOzJCQStCekJHOztrQkFTRm50QixJQXhDMkJndEI7c0NBd0MzQmh0QjtjQXhDMkJndEIsd0JBd0MzQmh0QjtjQXhDMkJndEI7c0NBd0MzQmh0QjtjQXhDMkJndEIsd0JBd0MzQmh0QjtrQkFNQW1QLElBOUMyQjZkLGtCQThDM0I3ZDs7bUJBQ0pwTjs7Z0JBQ1UsSUFBSjRCLHFCQUZGd0wsR0FDSnBOO3dCQUNNNEIsR0FFRixpQkFKQXdMLEdBQ0pwTixZQUNNNEIsSUFSRjNEO2dCQU9KOzs7Ozs7YUFPRjtpQ0F0RHNCK3NCLGVBQVdDLHNCQUc3QjFyQjthQUg2QjByQix3QkFHN0IxckI7Ozs7Ozs7Ozs7Ozs7O0dBMEVIO1lBRUM4ckIsYUFBY04sZ0JBQWU1b0I7SUFDL0IsT0FoQkV3b0I7YUFlY0k7c0JBQ21Cam9CLEtBQUl2RCxHQUFLLDhCQURiNEMsSUFDSVcsUUFBSXZELEdBQXFCO0dBQUM7WUFFM0RvbUIsWUFBY2lGLEtBQXVCM3NCO0lBQ3ZDLEdBRGdCMnNCO1NBQWlCRSxNQUFqQkYseUJBQWlCRTs7U0FBakJDO0lBQ2hCO1dBRGdCQSxpQkF6QmRULFdBbkhBRDtXQTRJY1UsaUJBekJkVCxXQW5IQUQ7O0tBc0pVOzs7Ozs7eUNBVjJCcHNCO0tBRXhCLGtDQUZ3QkE7SUFDdkM7cUJBQXFCZ3RCLGdDQUF3Qzs7Ozs7Ozs7Ozs7O0dBYTVEO1lBRUNLLGFBQWFMLFFBQU9NO0lBQVBOLGdDQUFPTTtJQUFQTixZQUFPTTs7R0FFaUI7WUFFckNDLGFBQWFQLFFBQU9RO0lBQ3RCLFVBRGVSO3FCQUFPUTs7R0FDeUM7WUFFN0RWLGVBQWVFLFFBQVMsT0FBVEEsZUFuS2ZaLGtCQW1Lc0Q7WUFFdERxQixPQUFPVDtJQUNULElBQUl6cEIsTUFES3lwQjtJQUVULG1DQUZTQSxzQkFDTHpwQjtHQUN1RDtZQUV6RG1xQixXQUFXVixRQUFPcEQsSUFBR0M7SUFDdkIsSUFBSXRtQixNQURtQnNtQixLQUFIRDtJQUVwQixtQ0FGYW9ELFdBQU9wRCxJQUNoQnJtQjtHQUNxQztZQUV2Q29xQixlQUFlWCxRQUFPcEQsSUFBR0M7SUFDM0IsT0FEd0JELElBSWY7UUFGSHJtQixNQUZxQnNtQixLQUFIRDtJQUd0QixXQUFLLDRCQUhVb0QsV0FBT3BELElBRWxCcm1CO0dBSUg7WUFFRHFxQixnQkFBZ0JaLFFBQU9qckIsR0FBSSxzQkFBWGlyQixXQUFPanJCLEdBQWlDO1lBRXhEOHJCLG9CQUFvQmIsUUFBT2pyQjtJQUM3QixZQUQ2QkEsUUFFdEIsZUFGZWlyQixXQUFPanJCO0dBSXZCO1lBR0orckIsWUFBWWQsUUFBT2pyQjtJQUNyQixzQkFEY2lyQix1QkFBT2pyQjtHQUNpQztZQUVwRGdzQixhQUFhZixRQUFTLE9BQVRBLGNBQW9DO1lBQ2pEZ0IsV0FBV2hCLFFBQVMsT0FBVEEsY0FBbUM7WUFFOUNpQixlQUFlakIsUUFBUyxPQUFUQSxXQUEyQjtZQUMxQ2tCLGFBQWFsQixRQUFTLE9BQVRBLFdBQTBCO1lBRXZDbUIsU0FBU25CO0lBQ1g7S0FBSW9CLE1BRE9wQjtXQUNQb0IsUUF4TUZoQzs7O1dBdU1TWSxpQkFDUG9COzs7R0FNQztZQU1IQyxZQUFZdEc7OztRQUdWcUcsTUFIVXJHO09BR1ZxRyxRQXZORmhDO0tBb05ZckUsYUFHVnFHLFFBcEdGL0I7SUFpR1l0RTs7R0FNUzs7OztPQTFOckJxRTtPQXlJQWdCO09BR0ExRjtPQWxCQWdGO09Ba0NBVztPQUlBRTtPQUdBVDtPQUVBVztPQXlCQUs7T0FHQUM7T0FDQUM7T0FFQUM7T0FDQUM7T0FFQUM7T0FhQUU7T0EzQ0FYO09BSUFDO09BUUFDO09BRUFDO09BaEpBdkI7T0FVQUc7OztFMUIxRUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0cyQjJEQzs7Ozs7O0lBQ0E7SUE2Qkk2Qjs7T0FDVTtPQUNBO09BQ1M7T0FDRjs7Ozs7Ozs7Ozs7Ozs7WUFjakJDO0lBQ0Y7S0FBSUMsVUFuQkZGO0tBb0JFRyxVQURBRDtLQUVBRSxRQUFRLGVBRFJEO0tBRUFFLFFBQVEsZUFGUkY7S0FHQUcsWUFBWSxlQUhaSDtLQUlBSSxVQUFVLGVBSlZKO0lBS0YsNEJBekJBSCxXQXFCRUksVUFGQUY7SUFuQkZGLFNBcUJFSTtJQU1GLDRCQTNCQUosV0FzQkVLLFVBSEFIO0lBbkJGRixTQXNCRUs7SUFPRiw0QkE3QkFMLFdBdUJFTSxjQUpBSjtJQW5CRkYsU0F1QkVNO0lBUUYsNEJBL0JBTixXQXdCRU8sWUFMQUw7SUFuQkZGLFNBd0JFTztJQXhCRlAsU0FvQkVHOztHQWFzQjtZQUV4Qks7SUFDRiw0QkFwQ0VSOzs7R0FxQ3FCO0dBRUcsSUFBeEJTLDRDQUFnRCxTQUFLO1lBRXJEQyxRQUFRQyxRQUFPQyxPQUFNQyxPQUFNbkM7SUFDN0I7S0F1QklvQyxXQWpFRmQ7S0FrRUVlLFVBbEVGZjtLQW1FRWdCLGlCQW5FRmhCO0tBb0VFaUIsYUFwRUZqQjtLQXFFRWtCLGlCQXJFRmxCO0tBc0VFbUIsWUF0RUZuQjtLQXVFRW9CLGVBdkVGcEI7O2FBeUNlWTtJQXpDZlosVUF5QzJCdEI7SUFrQzdCO1NBakNhMkMsU0FBSUM7S0FDZjthQUFNLDBCQUZFWCxRQXpDUlgsS0EwQ1dxQixLQUFJQzs7U0FHSyxJQUhMQyxRQUdLLFdBSkNWLE9BQU1uQztTQXpDM0JzQixTQXlDMkJ0QjtTQXpDM0JzQixVQXlDMkJ0QjthQUNoQjJDLFNBQUlDOzs7U0FRWDs7U0FoQ0pyQixvQkF3QldvQixTQUFJQzs7U0F4QmZyQixvQkF3QldvQixTQUFJQzs7O1VBWW9CO2lCQXREbkN0QjtXQXNEbUMsa0NBYjNCVywwQkF6Q1JYO1dBc0RtQztXQVpwQnRZO1dBQUpqQzs7Ozs7Y0FBSWlDLFdBQUpqQzs7MkJBQUk2Yjs7O1NBcUJYLFdBdEJJWDthQUNHVSxTQUFJQzs7OztVQW1DWkU7S0FDSCxJQURHQyxrQ0FDQ0MsWUE5RUoxQjtlQWlFRWM7S0FqRUZkLFVBa0VFZTtLQWxFRmYsU0FtRUVnQjtLQW5FRmhCLFVBb0VFaUI7S0FwRUZqQixTQXFFRWtCO0tBckVGbEIsU0FzRUVtQjtLQXRFRm5CLFVBdUVFb0I7UUFNQ0ssdUJBVU1wc0IsSUFWTm9zQixRQVdDLE9BREtwc0I7S0FoRFRvckI7ZUFvRFdrQjtPQUNILEtBQUcsMEJBREFBO1FBR0Usd0JBckRMaEIsV0FrREdnQixrQkFiUEQ7T0FlOEIsK0JBRnZCQztPQUVFLHdCQXBETGhCLDZCQXFDSmU7TUFnQndEO0tBQ3hELGtDQWxCREQ7O0dBa0JVO1lBRWJHLFNBQVM1QixLQUFJaHRCO0lBQ2YsVUFEV2d0QixVQUFJaHRCO0lBQ0wsd0JBRENndEI7R0FDd0I7WUFFakM2QjtJQUNGLElBQWF6UCxNQXJHWDROLFNBcUdXdnNCO0lBQ1g7YUFEV0E7Z0JBckdYdXNCO01Bc0dlLHdCQXRHZkE7O0tBd0dXO2FBeEdYQSxVQXFHV3ZzQjtNQUdMcXVCLHNCQXhHTjlCO3VCQXFHV3ZzQjtNQUlMc3VCLHNCQXpHTi9CO0tBMEdLLHlCQUZDOEIsSUFDQUMsS0FDYSxPQUZiRDtLQUVxQixJQUxoQnB1Qjs7R0FRSTtZQUVmc3VCO0lBQW9CLFVBL0dwQmhDO0lBK0dvQix3QkEvR3BCQTtHQStHZ0Q7WUFDaERpQyxjQUFjanZCO0lBQUksVUFoSGxCZ3RCLHFCQWdIY2h0QjtJQUFJLHdCQWhIbEJndEI7R0FnSHFFO1lBQ3JFa0MsWUFBWWx2QjtJQUFJLFVBakhoQmd0QixxQkFpSFlodEI7SUFBSSx3QkFqSGhCZ3RCO0dBaUhpRTtZQUVqRW1DLG9CQUFrQixPQWZsQk4sdUJBZWdEO1lBQ2hETyxrQkFBZ0IsT0FMaEJKLHFCQUs0QztZQUM1Q0ssVUFBVXJ2QixHQUFJLE9BTGRpdkIsY0FLVWp2QixNQUE4QjtZQUN4Q3N2QixRQUFRdHZCLEdBQUksT0FMWmt2QixZQUtRbHZCLE1BQTRCO1lBRXBDdXZCLHFCQUFxQlo7SUFDdkIsa0JBbEZFbEIsMEJBaUZxQmtCO0dBQ2U7WUFFcENhLG1CQUEyQixTQUFFOzs7O09BUjdCTDtPQUNBQztPQUNBQztPQUNBQztPQWxCQVQ7T0FXQUc7T0FDQUM7T0FDQUM7T0E5RUExQjs7OztPQU1BRTtPQXdEQWtCO09BdUJBVztPQUdBQzs7O0UzQnBOTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztpQjRCZ0ZTQztTQUFTLFlBQ0E7YUFDSHZGO1NBQU0sT0FBTkE7UUFBTztpQkFPYmhlLE9BQU8xTCxHQUFFNkIsR0FBRVc7U0FDYixHQURTeEMsT0FDZ0MwcEIsSUFEaEMxcEIsTUFDTGt2QixLQUFxQ3hGLFlBQXJDd0Y7U0FDSixHQUZhMXNCLE9BRTRCMnNCLE1BRjVCM3NCLE1BRVQ0c0IsS0FBcUNELGNBQXJDQzt5QkFEQUYsa0JBQ0FFO1NBQ0EsV0FIS3B2QixHQUFFNkIsR0FBRVc7UUFHeUM7aUJBT3BENnNCLElBQUlydkIsR0FBRTZCLEdBQUVXO1NBQ1YsR0FETXhDLE9BQ21DMHBCLElBRG5DMXBCLE1BQ0ZrdkIsS0FBcUN4RixZQUFyQ3dGO1NBQ0osR0FGVTFzQixPQUUrQjJzQixNQUYvQjNzQixNQUVONHNCLEtBQXFDRCxjQUFyQ0M7MkJBREFGO2VBREVsdkIsR0FLTztVQUVTLElBRENzdkIsS0FOakJ0dkIsTUFNV3V2QixLQU5YdnZCLE1BTUt3dkIsS0FOTHh2QixNQU9nQixNQTFCcEJpdkIsT0F5QnFCSztvQkF6QnJCTCxPQXlCU08sS0FFVSxPQWxCbkI5akIsT0FnQlM4akIsSUFBTUQsSUFoQmY3akIsT0FnQnFCNGpCLElBTmZ6dEIsR0FBRVc7ZUFNYThzQixJQUtKO1VBRXVCLElBRFhHLE1BTlJILE9BTUNJLE1BTkRKLE9BTU5LLE1BTk1MLE9BT21CLE1BdkJ4QzVqQixPQXNCNkIrakIsS0FadkI1dEIsR0FBRVc7VUFhZ0MsT0F2QnhDa0osY0FnQlM4akIsSUFBTUQsSUFNQUksTUFBT0Q7O2FBWHBCUixlQUNBRTswQkFEQUYsa0JBQ0FFO1VBMEJFLFdBNUJBcHZCLEdBQUU2QixHQUFFVzs7aUJBaUJHO1NBRVMsSUFEQ290QixLQWxCYnB0QixNQWtCT3F0QixLQWxCUHJ0QixNQWtCQ3N0QixLQWxCRHR0QixNQW1CWSxNQXRDcEJ5c0IsT0FxQ1NhO21CQXJDVGIsT0FxQ3FCVyxLQUVmLE9BOUJObGtCLGNBVUkxTCxHQUFFNkIsR0FrQkdpdUIsS0FBTUQsSUFBTUQ7Y0FBWkUsSUFLUTtTQUVxQixJQURUQyxNQU5wQkQsT0FNYUUsTUFOYkYsT0FNTUcsTUFOTkgsT0FPNkIsTUFuQ3RDcGtCLE9Ba0M2QnFrQixLQU5kRixJQUFNRDtTQU9pQixPQW5DdENsa0IsY0FVSTFMLEdBQUU2QixHQXdCU291QixNQUFPRDtRQUlnQztpQkFJbERFLElBQUk3eEIsR0FFUmdQO1M1QnJJVCxLNEJxSVNBLEdBRGEsY0FETGhQO1NBR0UsSUFEQ21FLElBQVg2SyxNQUFReEwsSUFBUndMLE1BQUtyTixJQUFMcU4sTUFDTXRNLElBQUksbUJBSEYxQyxHQUVBd0Q7U0FFTixTQURJZCxHQUNVLE9BRmhCc007aUJBQ010TSxHQU1PLElBQUw2dUIsS0FUSk0sSUFBSTd4QixHQUVHbUUsaUJBT0hvdEIsS0FQUnZpQixJQWxDQWdpQixJQWtDS3J2QixHQUFHNkIsR0FPQSt0QjtTQUhLLElBQUxKLEtBTkpVLElBQUk3eEIsR0FFSDJCO3NCQUlHd3ZCLEtBSlJuaUIsSUFsQ0FnaUIsSUFzQ1FHLElBSkEzdEIsR0FBR1c7O2lCQVVYMnRCLFVBQVU5eEIsR0FBSSxjQUFKQSxTQUFvQztpQkFTMUMreEIsZ0JBQWdCL3hCO1M1QnhKN0IsWTRCeUprQixPQVZUOHhCLFVBU29COXhCO2FBRVJtRSxjQUFIWCxjQUFIN0I7U0FDTixPQXhEQXF2QixJQXFESWUsZ0JBQWdCL3hCLEdBRWQyQixJQUFHNkIsR0FBR1c7O2lCQUdSNnRCLGdCQUFnQmh5QjtTNUI3SjdCLFk0QjhKa0IsT0FmVDh4QixVQWNvQjl4QjthQUVSbUUsY0FBSFgsY0FBSDdCO1NBQ0UsT0E3RFJxdkIsSUE0RE1ydkIsR0FBRzZCLEdBRkx3dUIsZ0JBQWdCaHlCLEdBRVJtRTs7aUJBTVI4UixLQUFLdFUsR0FBRTZCLEdBQUVXO1NBQ2YsS0FEV3hDLEdBRUssT0FmVm93QixnQkFhT3Z1QixHQUFFVztpQkFHQyxPQVhWNnRCLGdCQVFPeHVCLEdBQUY3Qjs7VUFJK0Nzd0IsS0FKM0M5dEI7VUFJcUNvdEIsS0FKckNwdEI7VUFJK0JxdEIsS0FKL0JydEI7VUFJeUJzdEIsS0FKekJ0dEI7VUFJYSt0QixLQUpqQnZ3QjtVQUlXc3ZCLEtBSlh0dkI7VUFJS3V2QixLQUpMdnZCO1VBSUR3dkIsS0FKQ3h2QjtpQkFJK0Nzd0IsY0FBOUJDO21CQXRFMUJsQixJQXNFUUcsSUFBTUQsSUFKVmpiLEtBSWdCZ2IsSUFKVHp0QixHQUFFVztvQkFJYSt0Qjs7O3FCQUE4QkQ7cUJBdEV4RGpCLElBa0VJL2EsS0FBS3RVLEdBQUU2QixHQUkyQml1QixLQUFNRCxJQUFNRDtxQkFoRmxEbGtCLE9BNEVTMUwsR0FBRTZCLEdBQUVXO1FBT0M7aUJBSVZndUI7U0FBVTs7d0JBQ0w7Y0FFSnh3Qjs7Y0FEUzZCO1VBQU0sT0FBTkE7O1FBQ007aUJBRWhCNHVCO1NBQWM7O3dCQUNUO2NBRUp6d0I7O2NBRFM2QjtVQUFNLFdBQU5BOztRQUNVO2lCQUVwQjZ1QjtTQUFVOzt3QkFDTDs2QkFFSmx1QjtjQURBWDtVQUFlLE9BQWZBOztRQUNlO2lCQUVoQjh1QjtTQUFjOzt3QkFDVDs2QkFFSm51QjtjQURBWDtVQUFlLFdBQWZBOztRQUNtQjtpQkFJcEIrdUI7U0FBaUIsWUFDWjthQUVKNXdCOztjQUFNd0MsY0FBSFg7VUFBUyxPQXRHakJ3dEIsSUFtR0l1QixlQUdDNXdCLElBQUc2QixHQUFHVzs7YUFER3F1QjtTQUFNLE9BQU5BO1FBQzZCO2lCQWdCM0N2aUIsT0FBTytMLElBQUdGO1NBQ1osS0FEU0UsSUFFTyxPQUZKRjtrQkFHSSxPQUhQRTtTQUl3QixVQXZCM0J1VyxlQW1CTXpXO1NBSXFCLE9BeEQzQjdGLEtBb0RHK0YsSUF6Q0htVyxRQXlDTXJXO1FBSXdDO2lCQVE5Q0wsTUFBTXpiO1M1QnJPbkIsWTRCdU9XO1NBRVE7VUFEQ21FO1VBQUhYO1VBQUg3QjtVQUNDZSxJQUFJLG1CQUpBMUMsR0FHRndEO1NBRU4sU0FESWQsR0FDVSxXQUZYZixNQUFNd0M7aUJBQ0x6QjtVQUttQjttQkFUckIrWSxNQUFNemIsR0FHQ21FO1dBTVFvdEI7V0FBTmtCO1dBQUp4QjtVQUE2QixXQXpFbENoYixLQW1FQ3RVLEdBQUc2QixHQU1DeXRCLEtBQUl3QixNQUFNbEI7O1NBRk07b0JBUHJCOVYsTUFBTXpiLEdBR0wyQjtVQUljOHZCO1VBQU5pQjtVQUFKdkI7U0FBNkIsV0FBN0JBLElBQUl1QixRQXZFVHpjLEtBdUVld2IsSUFKWGp1QixHQUFHVzs7WUFVWG1MO2lCQUVBcUIsZ0JBQVcscUJBQW1DO2lCQUUxQzBKLElBQUlyYTs7O3dCQUNDO1VBRUM7V0FEQ21FO1dBQUhYO1dBQUg3QjtXQUNDZSxJQUFJLG1CQUhGMUMsR0FFQXdEO3VCQUNGZDs7Y0FESzh2QixXQUNMOXZCLElBREt5QixJQUFOeEMsYUFBTTZ3Qjs7O2lCQUlQRyxPQUFPM3lCLEdBRVhnUDtTNUI5UFQsSzRCOFBTQSxHQURTO1NBRUMsSUFoREQ4TSxLQStDVDlNLE1BQVN4TCxJQUFUd0wsTUEvQ01nTixLQStDTmhOLE1BQ010TSxJQUFJLG1CQUhDMUMsR0FFRndEO1NBRVAsU0FESWQ7ZUFoREFzWixJQUVRLE9BRkxGO21CQUdLLE9BSFJFO1VBSXdCLFVBYjFCdVcsZUFTS3pXO1VBSXFCLE9BaEg5QmtWLElBNEdNaFYsSUEvQkZtVyxRQStCS3JXOztpQkFnREhwWjtVQVFTLElBQUw2dUIsS0FYTm9CLE9BQU8zeUIsR0E3Q0Y4Yjt3QkF3REN5VixLQVRWdmlCLElBM0pBZ2lCLElBNEdNaFYsSUErQ0d4WSxHQVNDK3RCOztTQUpLLElBQUxKLEtBUE53QixPQUFPM3lCLEdBN0NMZ2M7dUJBb0RJbVYsS0FMVm5pQixJQTNKQWdpQixJQWdLVUcsSUFMRDN0QixHQS9DQXNZOztpQkE0REw4VyxNQUFNOXhCLElBQUdDO1NBQ2YsS0FEWUQsSUFFSyxPQUZGQztrQkFHRSxPQUhMRDs7VUFJOENpYixLQUozQ2hiO1VBSXFDOHhCLEtBSnJDOXhCO1VBSStCb0gsS0FKL0JwSDtVQUl5QkUsS0FKekJGO1VBSWFrYixLQUpoQm5iO1VBSVVvVyxLQUpWcFc7VUFJSW9ILEtBSkpwSDtVQUlGRSxLQUpFRjtZQUk4Q2liLE1BQTlCRTttQkFBOEJGLElBRXJDLE9BOUlmOFYsSUE0SXdDMXBCLElBSmxDckg7VUFPYzttQkE3Q3BCMmEsTUEwQ1V2VCxJQUpEbkg7V0FPSyt4QjtXQUFQclo7V0FDaUIsTUFSeEJtWixNQUlnQjFiLElBR0Y0YjtVQUNVLE9BOUd4QjdjLEtBc0dBMmMsTUFJSTV4QixJQUdHeVksT0FIR3ZSOztrQkFBWStULElBT1AsT0FuSmY0VixJQTRJVTNwQixJQUpEbkg7U0FZVztvQkFsRHBCMGEsTUEwQ3dDdFQsSUFKbENySDtVQVlRaXlCO1VBQVB2WjtVQUNpQixNQWJ4Qm9aLE1BWWNHLE1BUmdDRjtTQVN0QixPQW5IeEI1YyxLQXNHQTJjLE1BWU9wWixNQVIyQnZZLEtBQU1rSDtRQVVyQztpQkFFSDZxQixNQUFNbHlCLElBQUdDO1NBQ2YsS0FEWUQsSUFFSTtjQUZEQyxJQUdDO1NBRU47VUFEWW1XLEtBSlZwVztVQUlJb0gsS0FKSnBIO1VBSUZFLEtBSkVGO1VBS0YsTUEzREoyYSxNQTBEVXZULElBSkRuSDtVQU1SRTs7VUFHdUIsSUFEYjR4QixhQUNhLE1BVHhCRyxNQUlnQjliLElBSUwyYjtVQUNhLE9BL0h4QjVjLEtBc0hBK2MsTUFJSWh5QixJQUVIQyxLQUZTaUg7O1NBR2EsSUFEWDRxQixlQUNXLE1BUHZCRSxNQUlnQjliLElBRUo0YjtTQUNXLE9BekUzQjdpQixPQWtFSStpQixNQUlJaHlCLElBRUhDO1FBR29DO2lCQVVyQ2d5QixVQUFVanpCO1M1QjlTdkIsWTRCZ1RXLDhCQUE0QixTQUFLO1NBRXpCO1VBRENtRTtVQUFIWDtVQUFIN0I7VUFDQ2UsSUFBSSxtQkFKSTFDLEdBR053RDtTQUVOLFNBRElkLEdBQ1U7aUJBRFZBO1VBT0ksWUFYTnV3QixVQUFVanpCLEdBR0htRTtzQkFTSTtjQUNLb3RCLGVBQUpOO1VBQVcsV0F0SnZCaGIsS0E0SUN0VSxHQUFHNkIsR0FVUXl0QixLQUFJTTs7U0FOVixjQVBOMEIsVUFBVWp6QixHQUdUMkI7dUJBS1U7YUFDSzh2QixpQkFBSk47U0FBVztpQkFBWEE7aUNBQW9DLE9BbEpoRGxiLEtBa0pxRCxXQUFyQ3diLFFBTlpqdUIsR0FBR1csR0FNeUQ7O2lCQU1oRSt1QixTQUFTcHlCLElBQUdDO1NBQ2xCLElBRGVpcEIsV0FHWUgsT0FIVDlvQjtTQUNsQjthQURlaXBCLFFBR1lIO2VBSFozUyxjQUdDaFAsS0FIRDhoQixTQUdMaHBCLEtBSEtncEI7dUJBR1lILE1BQ047V0FDTixZQXBCVG9KLFVBa0JVL3FCLElBQVcyaEI7dUJBSVY7V0FEVyxJQUFQZ0osZUFBSjV4QixlQUFXLE1BTnRCaXlCLFNBR0lseUIsSUFHT0M7V0FBVztXQUE4QixJQU54Q3NvQixPQU13QyxXQUFyQ3NKLFFBTk43SSxXQUdZSCxPQUhUTjs7O1VBRVc7O1FBS1A7aUJBRWhCbkosS0FBS3RmLElBQUdDO1NBQ2QsS0FEV0QsSUFFSztjQUZGQyxJQUdHLE9BSE5EO1NBS0Q7VUFEWW9XLEtBSlhwVztVQUlLb0gsS0FKTHBIO1VBSURFLEtBSkNGO1VBS0QsTUF0R0oyYSxNQXFHVXZULElBSkZuSDtVQU1QRTs7VUFHcUIsSUFEWDR4QixhQUNXLE1BVHRCelMsS0FJZ0JsSixJQUlMMmI7VUFDVyxPQXRIMUI1aUIsT0E2R0ltUSxLQUlJcGYsSUFFSEM7O1NBQ3NCLElBRFg2eEIsZUFDVyxNQVB2QjFTLEtBSWdCbEosSUFFSjRiO1NBQ1csT0F4S3ZCN2MsS0FpS0FtSyxLQUlJcGYsSUFFSEMsS0FGU2lIO1FBS3dCO2lCQUlsQ2lyQixVQUFVdHpCLEdBQUU2SDtTQUNsQixJQURnQm1MLFNBQUVqRTtTQUNsQjtlQURnQmlFLEtBRUwsT0FGT2pFO1VBR2E7V0FBbEJ6SyxJQUhHME87V0FHTnJQLElBSE1xUDs7V0FBRStWLFVBR1JwbEIsR0FBR1csR0FIS3lLO1dBQUZpRTtXQUFFakU7O1FBRzRCO2lCQWE1Q3RHLFFBQVF4SCxJQUFHQztTQUNiO1VBWnFCcXlCLE9BTGZELFVBZ0JPcHlCO1VBWEtzeUIsT0FMWkYsVUFnQklyeUI7VUFYUWtIO1VBQUdDO1NBQ25CO2VBRGdCRCxXQUFHQzttQkFJUDtVQUVGO1dBRHNCcXJCLE9BTGJyckI7V0FLUzRxQixLQUxUNXFCO1dBS0tFLEtBTExGO1dBS0xzckIsT0FMRXZyQjtXQUtOa1AsS0FMTWxQO1dBS1ZFLEtBTFVGO1dBTVZ0RixJQUFJLG1CQURKd0YsSUFBa0JDO1VBRXRCLFNBREl6RixHQUVDLE9BRkRBO1VBRytCO1dBVGxCOHdCLE9BTGZMLFVBVXdCTixJQUFJUztXQUxoQkcsT0FMWk4sVUFVTWpjLElBQUlxYztXQUxFdnJCO1dBQUdDOztRQVk0QjtpQkFFL0NGLE1BQU1qSCxJQUFHQyxJQUNYLGFBSkV1SCxRQUdNeEgsSUFBR0MsWUFDTTtpQkFFWDJ5QixPQUFPNXlCLElBQUdDO1NBQ2hCLElBRGFpcEIsV0FBR0g7U0FDaEI7ZUFEYUcsTUFHVDtlQUhZSCxNQUtaO1VBRVE7V0FEb0NnSixLQU5oQ2hKO1dBTTBCMWhCLEtBTjFCMGhCO1dBTW9CNW9CLEtBTnBCNG9CO1dBQUgzUztXQU1HaFAsS0FOSDhoQjtXQU1IaHBCLEtBTkdncEI7V0FPTHRuQixJQUFJLG1CQURJd0YsSUFBMEJDO1VBRXRDLFNBREl6RjtXQUVGLFVBVEFneEIsT0FNSTF5QixJQUEwQkM7V0FHOUI7ZUFUTytvQixXQUFHSCxPQU1nQ2dKOzs7a0JBQ3hDbndCO1dBTUYsVUFiQWd4QixjQU1VeHJCLElBTkhnUCxRQU1tQzJiO1dBTzFDO2VBYk83SSxPQU1IaHBCOzs7VUFLSixVQVhBMHlCLFdBTUkxeUIsSUFBTWtILFdBQW9Cakg7VUFLOUI7Y0FYTytvQjs7UUFhb0Q7aUJBRTNEelosS0FBSzdROzs7d0JBQ0E7Y0FDRXlFLGdCQUFIWCxnQkFBSDdCO1VBRkQ0TyxLQUFLN1EsR0FFSmlDO1VBQXNCLFdBRmxCakMsR0FFRDhEO3dCQUFHVzs7O2lCQUVQMkQsS0FBS3BJLEdBQUVHLEdBQUUrRTtTQUNmLElBRGFpTyxTQUFFL047U0FDZjtlQURhK04sS0FFRixPQUZJL047VUFHYTtXQUhmWDtXQUdIWCxJQUhHcVA7V0FHTmxSLElBSE1rUjtXQUFFM0IsU0FHYSxXQUhqQnhSLEdBR0Q4RCxHQUhKc0UsS0FBS3BJLEdBR0ppQyxHQUhRbUQ7V0FBRitOO1dBQUUvTjs7UUFHa0M7aUJBRTNDcU0sUUFBUUM7Ozt3QkFDSDtVQUNRO1dBQU5qTjtXQUFIWDtXQUFIN0I7V0FBWSxpQkFGTHlQLEdBRUo1TjtVQUFTO1dBQU8sVUFGcEIyTixRQUFRQyxHQUVQelA7V0FBbUIsc0JBQWJ3Qzs7Ozs7VUFBYTs7O2lCQUVwQmtOLE9BQU9EOzs7d0JBQ0Y7VUFDUTtXQUFOak47V0FBSFg7V0FBSDdCO1dBQVksaUJBRk55UCxHQUVINU47VUFBUzs7O1dBQU8sVUFGcEI2TixPQUFPRCxHQUVOelA7V0FBbUIsd0JBQWJ3Qzs7O1VBQU07OztpQkFFYjZMLE9BQU9vQixHQUVYcEM7UzVCM1lULEs0QjJZU0EsR0FEUztTQUdFO1VBRkM3SyxJQUFaNks7VUFBU3hMLElBQVR3TDtVQUFNck4sSUFBTnFOO1VBRU1tSyxNQUpGbkosT0FBT29CLEdBRUx6UDtVQUdBZ3lCLEtBQUssV0FMQXZpQixHQUVGNU47VUFJSGd2QixNQU5GeGlCLE9BQU9vQixHQUVDak47U0FLVixLQUZJd3ZCLElBSUMsT0F6TFAxakIsT0FvTE1rSixLQUVBcVo7WUFKQTd3QixNQUVBd1gsT0FGTWhWLE1BSU5xdUIsS0FFcUIsT0FOM0J4akI7U0FNa0MsT0E1TzlCaUgsS0F3T0VrRCxLQUZHM1YsR0FJSGd2Qjs7aUJBS0Y3ZCxVQUFVdkQ7UzVCcFp2QixZNEJxWmtCO1NBR1E7VUFGTmpOO1VBQUhYO1VBQUg3QjtVQUVZLFFBSmJnVCxVQUFVdkQsR0FFVHpQO1VBRU1peUI7VUFBSkM7VUFDREYsS0FBSyxXQUxHdmlCLEdBRU41TjtVQUlTLFVBTmJtUixVQUFVdkQsR0FFSGpOO1VBSUEydkI7VUFBSkM7U0FDTCxHQUZJSixJQUdnQixVQW5NdEIxakIsT0ErTFcyakIsSUFFQUUsS0FFSixXQXZQSDdkLEtBbVBHNGQsSUFGQ3J3QixHQUlEdXdCO1NBR2UsVUF4UGxCOWQsS0FtUE8yZCxJQUZIcHdCLEdBSUdzd0I7U0FHSixXQXBNUDdqQixPQStMTzRqQixJQUVBRTs7aUJBS0hDO1NBQVcsWUFDTjtTQUNzQixJQUF2Qjd2QixjQUFIeEMsY0FBMEIsTUFGM0JxeUIsU0FFSTd2QjtpQkFGSjZ2QixTQUVDcnlCO1FBQW9DO2lCQUVyQ3N5QjthQUFhbnZCOzt3QkFDUixPQURRQTtVQUVhO1dBQW5CWDtXQUFIWDtXQUFIN0I7V0FBeUIsYUFBdEI2QixHQUZKeXdCLGFBQWFudkIsUUFFTlg7V0FGTVc7cUJBRVpuRDs7O2lCQUVMdXlCLFNBQVNyMEIsR0FDWCxPQUxNbzBCLGdCQUlLcDBCLEdBQ007aUJBTVh5UixLQUFLdFI7Ozt3QkFDQTtVQUVDO1dBRENtRTtXQUFIWDtXQUFIN0I7V0FDQ2UsSUFBSSxtQkFIRDFDLEdBRUR3RDtVQUVOLFNBRElkLEdBQ1UsT0FGUmM7Y0FBR2d2QixXQUNMOXZCLElBREt5QixJQUFOeEMsYUFBTTZ3Qjs7O2lCQWNQMkIsV0FUa0J6MEI7Ozt3QkFXcEI7Y0FDUzh5QixrQkFBSDRCLG1CQUFIamI7VUFDQSxnQkFiaUJ6WixHQVlkMDBCLHFCQUFHNUI7Y0FaUW5jLEtBWVgrZCxjQUFIamI7O3VCQVZILE9BRmlCOUM7ZUFHUmxTLGNBQUhrd0IsaUJBQUgxeUI7V0FDQSxjQUppQmpDLEdBR2QyMEIsV0FIV2hlLEtBR1hnZSxjQUFIMXlCO3VCQUFNd0M7Ozs7aUJBd0JQbXdCLGVBVHNCNTBCOzs7d0JBV3hCO2NBQ1M4eUIsa0JBQUg0QixtQkFBSGpiO1VBQ0EsZ0JBYnFCelosR0FZbEIwMEIscUJBQUc1QjtjQVpZbmMsS0FZZitkLGNBQUhqYjs7dUJBVkgsV0FGcUI5QztlQUdabFMsY0FBSGt3QixpQkFBSDF5QjtXQUNBLGNBSnFCakMsR0FHbEIyMEIsV0FIZWhlLEtBR2ZnZSxjQUFIMXlCO3VCQUFNd0M7Ozs7aUJBd0JQb3dCLFVBVGlCNzBCOzs7d0JBV25CO2NBQ1M4eUIsa0JBQUg0QixtQkFBSGpiO1VBQ0EsZ0JBYmdCelosR0FZYjAwQixxQkFBSGpiO2NBWmE5QyxLQVlWK2QsY0FBRzVCOzt1QkFWVCxPQUZnQm5jO2VBR1BsUyxjQUFIa3dCLGlCQUFIMXlCO1dBQ0EsY0FKZ0JqQyxHQUdiMjBCLFdBSFVoZSxLQUdWZ2UsY0FBR2x3Qjt1QkFBTnhDOzs7O2lCQXdCRDZ5QixjQVRxQjkwQjs7O3dCQVd2QjtjQUNTOHlCLGtCQUFINEIsbUJBQUhqYjtVQUNBLGdCQWJvQnpaLEdBWWpCMDBCLHFCQUFIamI7Y0FaaUI5QyxLQVlkK2QsY0FBRzVCOzt1QkFWVCxXQUZvQm5jO2VBR1hsUyxjQUFIa3dCLGlCQUFIMXlCO1dBQ0EsY0FKb0JqQyxHQUdqQjIwQixXQUhjaGUsS0FHZGdlLGNBQUdsd0I7dUJBQU54Qzs7OztpQkFlRHFaLFNBQVNoYjs7O3dCQUNKO1VBRUM7V0FEQ21FO1dBQUhYO1dBQUg3QjtXQUNDZSxJQUFJLG1CQUhHMUMsR0FFTHdEO1VBRU4sU0FESWQsR0FDVSxXQUZSYztjQUFHZ3ZCLFdBQ0w5dkIsSUFES3lCLElBQU54QyxhQUFNNndCOzs7aUJBS1hpQyxTQUFTOXlCLEdBQUU2QixHQUFFVztTQUlmO2tCQUpXeEM7VUFJa0IsVUE5VXZCMHdCLFFBMFVLMXdCO1VBSU0sZ0NBSko2Qjs7OzttQkFBRVc7V0FLZ0IsVUF6VnpCZ3VCLFFBb1ZTaHVCO1dBS0UsMkJBTEpYOzt5QkFNUixPQXJXQ3lTLEtBK1ZLdFUsR0FBRTZCLEdBQUVXOztTQU9GLE9BaFFQeXVCLE1BeVBLanhCLEdBallMa3dCLElBaVlPcnVCLEdBQUVXO1FBT087aUJBRWhCeUQsSUFBSWxJLEdBRVJzUDtTNUIvZ0JULEs0QitnQlNBLEdBRFM7U0FHQztVQUZDN0ssSUFBWDZLO1VBQVF4TCxJQUFSd0w7VUFBS3JOLElBQUxxTjtVQUVLbUssTUFKRHZSLElBQUlsSSxHQUVIaUM7VUFHQWtHLE1BQUssV0FMRm5JLEdBRUE4RDtVQUlIZ3ZCLE1BTkQ1cUIsSUFBSWxJLEdBRUd5RTtZQUFOeEMsTUFFQXdYLE9BRkczVixNQUdIcUUsT0FITTFELE1BSU5xdUIsS0FDa0MsT0FMdkN4akI7U0FNTSxPQWpCTnlsQixTQWFLdGIsS0FDQXRSLEtBQ0EycUI7O2lCQVVEMWlCLFdBQVdwUSxHQUVmc1A7UzVCL2hCVCxLNEIraEJTQSxHQURTO1NBR0M7VUFGQzdLLElBQVg2SztVQUFReEwsSUFBUndMO1VBQUtyTixJQUFMcU47VUFSV2dOLEtBTVBsTSxXQUFXcFEsR0FFVmlDO1VBR0FrRyxNQUFLLFdBTEtuSSxHQUVQOEQ7VUFSTXNZLEtBTVZoTSxXQUFXcFEsR0FFSnlFO1NBS1YsR0FGSTBEO2NBR0s2c0IsTUFITDdzQjthQUhBbEcsTUFSTXFhLE1BUUh4WSxNQU1Fa3hCLE9BTkN2d0IsTUFSRzJYLElBZThCLE9BUDVDOU07VUFRVyxPQW5DWHlsQixTQW1CV3pZLElBY0QwWSxLQWRJNVk7O2NBQUhFLElBRUcsT0FGQUY7a0JBR0EsT0FISEU7U0FJd0IsVUFyVi9CdVcsZUFpVlV6VztTQUlxQixPQXZCbkMyWSxTQW1CV3pZLElBdldQbVcsUUF1V1VyVzs7aUJBMENkaU0sUUFBUXBtQjtTQUNWLEtBRFVBLFVBL1VSMk47bUJBK1VRM04sTUFHUGd6QixLQUhPaHpCO21CQUdBLE9BcmJSbXdCLFVBcWJDNkM7MkJBQ0l0WTttQkFBYyxPQWxjZndWLElBa2NDeFYsSUF0Ykx5VixVQXFiQzZDOzJCQUVRdlk7bUJBQWMsT0FuY25CeVYsSUFtY0t6VixJQW5jTHlWLElBa2NDeFYsSUF0Ykx5VixVQXFiQzZDOzJCQUdZcFk7bUJBQWMsT0FwY3ZCc1YsSUFvY1N0VixJQXBjVHNWLElBbWNLelYsSUFuY0x5VixJQWtjQ3hWLElBdGJMeVYsVUFxYkM2Qzs7VUFLbUI7V0E3Qkx4YixNQTZCSyxvQ0FSWnhYO1dBcEJGMGM7c0JBQUlsZCxHQUFFUTtjQUNaLFFBRFVSOzs7a0JBRUEsY0FGRVE7Ozt1QkFHRGl6QixNQUhDanpCLE1BR1BnekIsS0FIT2h6QjttQkFHSSxrQkFBWGd6QixXQUFNQzs7OztxQkFIQ2p6Qjs7O3dCQUlLa3pCLGtCQUFOeFksaUJBQU55WSxPQUpPbnpCO29CQUtSLHNCQURDbXpCLGFBQU16WSxXQUFNd1k7Ozs7O3FCQUpMbHpCOzs7Ozs7c0JBTVdvekI7c0JBQU4zWTtzQkFBTks7c0JBQU51WSxPQU5PcnpCO3FCQU9SO3dDQURDcXpCLGFBQU12WSxhQUFNTDs2QkFBTTJZOzs7OztjQUtQO2VBRFZFLEtBVkk5ekI7ZUFXTSxRQVhWa2QsSUFVQTRXLElBVk10ekI7ZUFXQXdYO2VBQU5oUztjQUNKLEtBRFVnUztlQUVGO2NBRVM7ZUFEUkUsTUFIQ0Y7ZUFHUitiLE1BSFEvYjtlQUlPLFVBZmJrRixLQUFJbGQsSUFVSjh6QixpQkFJSzViO2VBQ0k4YjtlQUFQL3RCO2NBQ0osV0FwZUppRyxPQStkTWxHLE1BR0YrdEIsS0FDSTl0QixRQUFPK3RCO2FBQ2E7VUFFMUIsT0FsQkk5VyxJQWtCQywyQkFuQlFsRjs7YUE0QkVpYztTQUFjLE9BcmMzQnZELElBcWNhdUQsSUFyY2J2RCxJQW9jU3RWLElBcGNUc1YsSUFtY0t6VixJQW5jTHlWLElBa2NDeFYsSUF0Ykx5VixVQXFiQzZDO1FBS2lEO2lCQUVsRFUsUUFBUXp6QixHQUFFZ3FCO3NCQUNPL3JCLEdBQUVHLEdBQUssT0F6Y3BCNnhCLElBeWNlN3hCLEdBQUZILEdBQWM7U0FBakMsc0NBRFkrckIsR0FBRmhxQjtRQUM0QjtpQkFFcEMrYixPQUFPL2IsR0FBSSxPQUhYeXpCLFFBR096ekIsR0E1VlAwTixPQTRWMEI7aUJBRXRCZ21CLFlBQWE1eUI7U0FBTyxLQUFQQSxHQUNWO1NBQ3dDLElBQW5DaEgsT0FGS2dILE1BRVJzTSxJQUZRdE0sTUFFWDFDLElBRlcwQyxNQUU4QixNQS9QM0N5d0IsVUErUEtua0IsR0FBR3RUO1NBQVMsV0FBZnNFLGlCNUJsbEJmLE80QmdsQmFzMUI7UUFFOEQ7aUJBRWxFOWUsT0FBTzlUO1NBQWlCLFVBalFwQnl3QixVQWlRR3p3QjtTQUFpQixxQjVCcGxCakMsTzRCZ2xCYTR5QjtRQUlxQztpQkFFckNDLFVBQVUxMUIsR0FBRTZIO1NBQ2xCLElBRGdCbUwsU0FBRWpFO1NBQ2xCO2VBRGdCaUUsS0FFTCxPQUZPakU7VUFHYTtXQUhmeks7V0FHTlgsSUFITXFQO1dBR1RsUixJQUhTa1I7V0FBRStWLFVBR1JwbEIsR0FBSDdCLEdBSFdpTjtXQUFGaUU7V0FBRWpFOztRQUc0QjtpQkFFeEM0bUIsZ0JBQWlCOXlCO1NBQU8sS0FBUEEsR0FDZDtTQUM0QyxJQUF2Q2hILE9BRlNnSCxNQUVac00sSUFGWXRNLE1BRWYxQyxJQUZlMEMsTUFFOEIsTUFQL0M2eUIsVUFPS3ZtQixHQUFHdFQ7U0FBUyxXQUFmc0UsaUI1QjdsQmYsTzRCMmxCYXcxQjtRQUVrRTtpQkFFdEVDLFdBQVcveUI7U0FBcUIsVUFUNUI2eUIsVUFTTzd5QjtTQUFxQixxQjVCL2xCekMsTzRCMmxCYTh5QjtRQUk2QztpQkFFakRFLFlBQ1VDLEtBQUk5MUI7U0FBaEIsSUFBZ0JnVCxTQUFFblE7U0FBSTthQUFObVE7V0FHRTtZQUhGMU87WUFFQVgsSUFGQXFQOztZQUtOMVIsSUFGUSxtQkFERnFDLEdBRkpteUI7b0JBS0Z4MEI7dUJBQ2UsSUFOUDRiLFVBRUZ2WixHQUZBVyxHQUFFekIsSUFBRm1RLFNBQUVuUTtnQkFBRm1ROzs7eUJBRUFyUCxHQUZBVyxHQUFFekI7Ozs7VUFTTCxxQjVCM21CcEIsTzRCZ2xCYTR5Qjs7UUEyQnNCOztnQkF6WDFCaG1CO2dCQUVBcUI7Z0JBRUkwSjtnQkFuSEF3WDtnQkFZSkM7Z0JBNkdJYTtnQkFlQUM7Z0JBZ0JBSTtnQkFrQ0FFO2dCQVNBOVM7Z0JBNkJKOVg7Z0JBR0FQO2dCQUdJMnJCO2dCQWVBbmpCO2dCQXFKQTNJO2dCQWpKQUU7Z0JBS0FxSjtnQkFJQUU7Z0JBSUFyQjtnQkFvSkFGO2dCQXpJQTZFO2dCQVdBcWY7Z0JBUUpFO2dCQXZQSS9CO2dCQUtBQztnQkFLQUM7Z0JBS0FDO2dCQWZBSDtnQkFLQUM7Z0JBZ0RBM1c7Z0JBeU1Bbks7Z0JBK0VBMEo7Z0JBL0RBbVo7Z0JBa0JBRztnQkFrQkFDO2dCQWtCQUM7Z0JBNkVKek07Z0JBZ0NBMk47Z0JBYkFsZjtnQkFXQWlmO2dCQXBCQUo7Z0JBR0ExWDs7OztFNUI5a0JUOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUI2QjZFU2lUO1NBQVMsWUFDQTthQUNIdkY7U0FBTSxPQUFOQTtRQUFPO2lCQUViaGUsT0FBTzFMLEdBQUUzQixHQUFFNFksR0FBRXpVO1NBQ2Y7VUFBSTBzQixLQUxGRCxPQUlPanZCO1VBQ2FvdkIsS0FMcEJILE9BSWF6c0I7Z0JBQ080c0IsTUFBbEJGLGtCQUFrQkU7U0FDbEIsV0FGS3B2QixHQUFFM0IsR0FBRTRZLEdBQUV6VTtRQUU0QztpQkFFekQydEIsVUFBVTl4QixHQUFFNFksR0FBSSxjQUFONVksR0FBRTRZLFNBQXVDO2lCQUVuRG9ZLElBQUlydkIsR0FBRTNCLEdBQUU0WSxHQUFFelU7U0FDWixHQURNeEMsT0FDbUMwcEIsSUFEbkMxcEIsTUFDRmt2QixLQUFxQ3hGLFlBQXJDd0Y7U0FDSixHQUZZMXNCLE9BRTZCMnNCLE1BRjdCM3NCLE1BRVI0c0IsS0FBcUNELGNBQXJDQzsyQkFEQUY7ZUFERWx2QixHQUtPO1VBRVMsSUFET3N2QixLQU52QnR2QixNQU1pQmkwQixLQU5qQmowQixNQU1XdXZCLEtBTlh2dkIsTUFNS3d2QixLQU5MeHZCLE1BT2dCLE1BakJwQml2QixPQWdCMkJLO29CQWhCM0JMLE9BZ0JTTztXQUVhLE9BZHRCOWpCLE9BWVM4akIsSUFBTUQsSUFBTTBFLElBWnJCdm9CLE9BWTJCNGpCLElBTnJCanhCLEdBQUU0WSxHQUFFelU7ZUFNaUI4c0IsSUFLVjtVQUU4QjtXQURYRyxNQU5USDtXQU1FNEUsTUFORjVFO1dBTUxJLE1BTktKO1dBTVpLLE1BTllMO1dBT29CLE1BbkIvQzVqQixPQWtCb0MrakIsS0FaOUJweEIsR0FBRTRZLEdBQUV6VTtVQWFxQyxPQW5CL0NrSixjQVlTOGpCLElBQU1ELElBQU0wRSxJQU1OdEUsTUFBT0QsS0FBT3dFOzthQVgzQmhGLGVBQ0FFOzBCQURBRixrQkFDQUU7VUEwQkUsV0E1QkFwdkIsR0FBRTNCLEdBQUU0WSxHQUFFelU7O2lCQWlCQztTQUVTLElBRE9vdEIsS0FsQmpCcHRCLE1Ba0JXMnhCLEtBbEJYM3hCLE1Ba0JLcXRCLEtBbEJMcnRCLE1Ba0JEc3RCLEtBbEJDdHRCLE1BbUJVLE1BN0JwQnlzQixPQTRCU2E7bUJBNUJUYixPQTRCMkJXLEtBRXJCLE9BMUJObGtCLGNBTUkxTCxHQUFFM0IsR0FBRTRZLEdBa0JDNlksS0FBTUQsSUFBTXNFLElBQU12RTtjQUFsQkUsSUFLUTtTQUUyQjtVQURSQyxNQU4zQkQ7VUFNb0JzRSxNQU5wQnRFO1VBTWFFLE1BTmJGO1VBTU1HLE1BTk5IO1VBT21DLE1BL0I1Q3BrQixPQThCb0Nxa0IsS0FOckJGLElBQU1zRSxJQUFNdkU7U0FPaUIsT0EvQjVDbGtCLGNBTUkxTCxHQUFFM0IsR0FBRTRZLEdBd0JPZ1osTUFBT0QsS0FBT29FO1FBSThCO1lBRTNEem1CO2lCQUVBcUIsZ0JBQVcscUJBQW1DO2lCQUUxQ2toQixJQUFJN3hCLEdBQUVnMkIsTUFHVnBLO1M3QjVIVCxLNkI0SFNBLEdBRE0sY0FGRTVyQixHQUFFZzJCO1NBSUE7VUFEUTNLLElBQWxCTztVQUFlem5CLElBQWZ5bkI7VUFBWWhULElBQVpnVDtVQUFTcG9CLElBQVRvb0I7VUFBTWpxQixJQUFOaXFCO1VBQ01scEIsSUFBSSxtQkFKRjFDLEdBR0N3RDtTQUVQLFNBRElkLFVBRE1rVyxNQUhGb2QsT0FHVnBLLFFBQU1qcUIsR0FIRTNCLEdBQUVnMkIsTUFHSzd4QixHQUFHa25CO2lCQUNaM29CO1VBT08sSUFBTDZ1QixLQVhKTSxJQUFJN3hCLEdBQUVnMkIsTUFHSzd4Qjt1QkFRUG90QixLQVJSM0YsSUFyQ0FvRixJQXFDTXJ2QixHQUFHNkIsR0FBR29WLEdBUUoyWTs7U0FISyxJQUFMSixLQVJKVSxJQUFJN3hCLEdBQUVnMkIsTUFHSnIwQjtzQkFLRXd2QixLQUxSdkYsSUFyQ0FvRixJQTBDUUcsSUFMQzN0QixHQUFHb1YsR0FBR3pVOztpQkFXWG1OLEtBQUt0Ujs7O3dCQUVQO1VBRVE7V0FES21FO1dBQUh5VTtXQUFIcFY7V0FBSDdCO1dBQ0FlLElBQUksbUJBSkQxQyxHQUdBd0Q7VUFFUCxTQURJZCxHQUNVLE9BRkprVztjQUFHNFosV0FDVDl2QixJQURTeUIsSUFBVHhDLGFBQVM2d0I7OztpQkFjWDJCLFdBVHFCejBCOzs7d0JBV3ZCOztXQUNhOHlCO1dBQUh5RDtXQUFIN0I7V0FBSGpiO1VBQ0QsZ0JBYm9CelosR0FZaEIwMEIscUJBQU01QjtjQVpJbmMsS0FZVitkLE1BWmE4QixLQVlWRCxjQUFOOWM7O3VCQVZKLFdBRmlCOUMsSUFBRzZmO2VBR1AveEIsY0FBSGd5QixpQkFBSDlCLGlCQUFIMXlCO1dBQ0QsY0FKb0JqQyxHQUdoQjIwQjtnQkFIVWhlLEtBR1ZnZSxNQUhhNkIsS0FHVkMsY0FBTngwQjs7O3VCQUFTd0M7Ozs7aUJBd0JYbXdCLGVBVHlCNTBCOzs7d0JBVzNCOztXQUNhOHlCO1dBQUh5RDtXQUFIN0I7V0FBSGpiO1VBQ0QsZ0JBYndCelosR0FZcEIwMEIscUJBQU01QjtjQVpRbmMsS0FZZCtkLE1BWmlCOEIsS0FZZEQsY0FBTjljOzt1QkFWSixlQUZxQjlDLElBQUc2ZjtlQUdYL3hCLGNBQUhneUIsaUJBQUg5QixpQkFBSDF5QjtXQUNELGNBSndCakMsR0FHcEIyMEI7Z0JBSGNoZSxLQUdkZ2UsTUFIaUI2QixLQUdkQyxjQUFOeDBCOzs7dUJBQVN3Qzs7OztpQkF3Qlhvd0IsVUFUb0I3MEI7Ozt3QkFXdEI7O1dBQ2E4eUI7V0FBSHlEO1dBQUg3QjtXQUFIamI7VUFDRCxnQkFibUJ6WixHQVlmMDBCLHFCQUFIamI7Y0FaWTlDLEtBWVQrZCxNQVpZOEIsS0FZVEQsY0FBR3pEOzt1QkFWYixXQUZnQm5jLElBQUc2ZjtlQUdOL3hCLGNBQUhneUIsaUJBQUg5QixpQkFBSDF5QjtXQUNELGNBSm1CakMsR0FHZjIwQjtnQkFIU2hlLEtBR1RnZSxNQUhZNkIsS0FHVEMsY0FBR2h5Qjs7O3VCQUFUeEM7Ozs7aUJBd0JGNnlCLGNBVHdCOTBCOzs7d0JBVzFCOztXQUNhOHlCO1dBQUh5RDtXQUFIN0I7V0FBSGpiO1VBQ0QsZ0JBYnVCelosR0FZbkIwMEIscUJBQUhqYjtjQVpnQjlDLEtBWWIrZCxNQVpnQjhCLEtBWWJELGNBQUd6RDs7dUJBVmIsZUFGb0JuYyxJQUFHNmY7ZUFHVi94QixjQUFIZ3lCLGlCQUFIOUIsaUJBQUgxeUI7V0FDRCxjQUp1QmpDLEdBR25CMjBCO2dCQUhhaGUsS0FHYmdlLE1BSGdCNkIsS0FHYkMsY0FBR2h5Qjs7O3VCQUFUeEM7Ozs7aUJBZUZxWixTQUFTaGI7Ozt3QkFFWDtVQUVRO1dBREttRTtXQUFIeVU7V0FBSHBWO1dBQUg3QjtXQUNBZSxJQUFJLG1CQUpHMUMsR0FHSndEO1VBRVAsU0FESWQsR0FDVSxXQUZKa1c7Y0FBRzRaLFdBQ1Q5dkIsSUFEU3lCLElBQVR4QyxhQUFTNndCOzs7aUJBS1huWSxJQUFJcmE7Ozt3QkFFTjtVQUVRO1dBREVtRTtXQUFIWDtXQUFIN0I7V0FDQWUsSUFBSSxtQkFKRjFDLEdBR0N3RDt1QkFDSGQ7O2NBRE04dkIsV0FDTjl2QixJQURNeUIsSUFBTnhDLGFBQU02d0I7OztpQkFJUjREO1NBQWM7O3dCQUNUO2NBRUh6MEI7O2NBRFlpWCxnQkFBSHBWO1VBQVMsV0FBVEEsR0FBR29WOztRQUNPO2lCQUVyQnlkO1NBQWtCOzt3QkFDYjtjQUVIMTBCOztjQURZaVgsZ0JBQUhwVjtVQUFTLGVBQVRBLEdBQUdvVjs7UUFDVTtpQkFFeEIwZDtTQUFjOzt3QkFDVDs2QkFFSG55QjtjQURHeVUsZ0JBQUhwVjtVQUFrQixXQUFsQkEsR0FBR29WOztRQUNnQjtpQkFFckIyZDtTQUFrQjs7d0JBQ2I7NkJBRUhweUI7Y0FER3lVLGdCQUFIcFY7VUFBa0IsZUFBbEJBLEdBQUdvVjs7UUFDb0I7aUJBRXpCNGQ7U0FBcUIsWUFDaEI7YUFFSDcwQjs7Y0FBU3dDLGNBQUh5VSxjQUFIcFY7VUFBWSxPQXRLckJ3dEIsSUFtS0l3RixtQkFHRTcwQixJQUFHNkIsR0FBR29WLEdBQUd6VTs7YUFEQXF1QjtTQUFNLE9BQU5BO1FBQ3NDO3FCQUUvQ3hXLElBQUdGO1NBQ1gsS0FEUUUsSUFFUSxPQUZMRjtrQkFHSyxPQUhSRTtTQUtTLFlBOUJYb2EsWUF5Qkt0YSxLQUtDbEQsY0FBSDVZO1NBQ00sT0E5S2JneEIsSUF3S01oVixJQUtDaGMsR0FBRzRZLEdBVk40ZCxtQkFLSzFhO1FBTTJCO2lCQUVoQzZXLE9BQU8zeUIsR0FHWDRyQjtTN0IxUVQsSzZCMFFTQSxHQURFO1NBRVE7VUFETXpuQixJQUFoQnluQjtVQUFhaFQsSUFBYmdUO1VBQVVwb0IsSUFBVm9vQjtVQUFPanFCLElBQVBpcUI7VUFDTWxwQixJQUFJLG1CQUpDMUMsR0FHRHdEO1NBRVIsU0FESWQsR0FDVSxXQUZUZixHQUFTd0M7aUJBQ1Z6QjtVQUtPLElBQUw2dUIsS0FUSm9CLE9BQU8zeUIsR0FHS21FO3VCQU1Sb3RCLEtBTlIzRixJQW5MQW9GLElBbUxPcnZCLEdBQUc2QixHQUFHb1YsR0FNTDJZOztTQUZLLElBQUxKLEtBUEp3QixPQUFPM3lCLEdBR0oyQjtzQkFJQ3d2QixLQUpSdkYsSUFuTEFvRixJQXVMUUcsSUFKRTN0QixHQUFHb1YsR0FBR3pVOztpQkFRWnN5QixPQUFPejJCLEdBQUVOLEdBTWJrc0I7UzdCeFJULEs2QndSU0E7VUFKYyx5QkFGRGxzQjt3QkFHRDtjQUNIZzNCO1VBQVksY0FKVjEyQixHQUlGMDJCOztTQUdDO1VBRFFyTCxJQUFsQk87VUFBZXpuQixJQUFmeW5CO1VBQVloVCxJQUFaZ1Q7VUFBU3BvQixJQUFUb29CO1VBQU1qcUIsSUFBTmlxQjtVQUNNbHBCLElBQUksbUJBUEMxQyxHQU1Gd0Q7U0FFUCxTQURJZDtVQUVJLHVCQVRHaEQsT0FNRGtaO3NCQUlFLFdBSlJqWCxHQUFTd0M7Y0FLSjZ4QjtpQkFMQ3BkLE1BS0RvZCxPQUxYcEssUUFBTWpxQixHQU5LM0IsR0FXQWcyQixNQUxJN3hCLEdBQUdrbkI7O2lCQUNaM29CO1VBVU8sSUFBTDZ1QixLQWpCSmtGLE9BQU96MkIsR0FBRU4sR0FNRXlFO3VCQVdQb3RCLEtBWFIzRixJQWpNQW9GLElBaU1NcnZCLEdBQUc2QixHQUFHb1YsR0FXSjJZOztTQUhLLElBQUxKLEtBZEpzRixPQUFPejJCLEdBQUVOLEdBTVBpQztzQkFRRXd2QixLQVJSdkYsSUFqTUFvRixJQXlNUUcsSUFSQzN0QixHQUFHb1YsR0FBR3pVOztpQkFjWG9NLEtBQUs3UTs7O3dCQUNBO2NBQ015RSxnQkFBSHlVLGdCQUFIcFYsZ0JBQUg3QjtVQUZGNE8sS0FBSzdRLEdBRUhpQztVQUNNLFdBSEhqQyxHQUVBOEQsR0FBR29WO3dCQUFHelU7OztpQkFHWHlELElBQUlsSTtTN0IzU2pCLFk2QjZTVztTQUVTO1VBRE8yckI7VUFBSGxuQjtVQUFIeVU7VUFBSHBWO1VBQUg3QjtVQUNBd1gsTUFKRnZSLElBQUlsSSxHQUdGaUM7VUFFQWlvQixNQUFLLFdBTEhscUIsR0FHSWtaO1VBR040WixNQU5GNXFCLElBQUlsSSxHQUdPeUU7U0FJVCxXQUhBZ1YsS0FERzNWLEdBRUhvbUIsS0FDQTRJLEtBSFluSDs7aUJBTWQxWSxLQUFLalQ7UzdCcFRsQixZNkJzVFc7U0FFUztVQURPMnJCO1VBQUhsbkI7VUFBSHlVO1VBQUhwVjtVQUFIN0I7VUFDQXdYLE1BSkZ4RyxLQUFLalQsR0FHSGlDO1VBRUFpb0IsTUFBSyxXQUxGbHFCLEdBR0E4RCxHQUFHb1Y7VUFHTjRaLE1BTkY3ZixLQUFLalQsR0FHTXlFO1NBSVQsV0FIQWdWLEtBREczVixHQUVIb21CLEtBQ0E0SSxLQUhZbkg7O2lCQU1kdmpCLEtBQUtwSSxHQUFFa3NCLEdBQUVobkI7U0FDZixJQURhK3hCLFNBQUU3eEI7U0FDZjtlQURhNnhCLEtBRUYsT0FGSTd4QjtVQUlGO1dBSkFYO1dBR0N5VSxJQUhEK2Q7V0FHRm56QixJQUhFbXpCO1dBR0xoMUIsSUFIS2cxQjtXQUFFemxCLFNBSUYsV0FKRnhSLEdBR0E4RCxHQUFHb1YsR0FIUjlRLEtBQUtwSSxHQUdIaUMsR0FIT21EO1dBQUY2eEI7V0FBRTd4Qjs7UUFJcUI7aUJBRTlCcU0sUUFBUUM7Ozt3QkFDSDtVQUNZO1dBQU5qTjtXQUFIeVU7V0FBSHBWO1dBQUg3QjtXQUFlLGlCQUZUeVAsR0FFSDVOLEdBQUdvVjtVQUFTO1dBQVMsVUFGMUJ6SCxRQUFRQyxHQUVOelA7V0FBd0Isc0JBQWZ3Qzs7Ozs7VUFBZTs7O2lCQUUxQmtOLE9BQU9EOzs7d0JBQ0Y7VUFDWTtXQUFOak47V0FBSHlVO1dBQUhwVjtXQUFIN0I7V0FBZSxpQkFGVnlQLEdBRUY1TixHQUFHb1Y7VUFBUzs7O1dBQVMsVUFGMUJ2SCxPQUFPRCxHQUVMelA7V0FBd0Isd0JBQWZ3Qzs7O1VBQU07OztpQkFVakJ5eUIsZ0JBQWdCQyxHQUFFNzJCO1M3Qm5WL0IsWTZCb1ZrQixPQS9QVDh4QixVQThQb0IrRSxHQUFFNzJCO2FBRVBtRSxjQUFIeVUsY0FBSHBWLGNBQUg3QjtTQUNOLE9BL1BBcXZCLElBNFBJNEYsZ0JBQWdCQyxHQUFFNzJCLEdBRWhCMkIsSUFBRzZCLEdBQUdvVixHQUFHelU7O2lCQUdYMnlCLGdCQUFnQkQsR0FBRTcyQjtTN0J4Vi9CLFk2QnlWa0IsT0FwUVQ4eEIsVUFtUW9CK0UsR0FBRTcyQjthQUVQbUUsY0FBSHlVLGNBQUhwVixjQUFIN0I7U0FDSSxPQXBRVnF2QixJQW1RTXJ2QixHQUFHNkIsR0FBR29WLEdBRlJrZSxnQkFBZ0JELEdBQUU3MkIsR0FFUG1FOztpQkFNWDhSLEtBQUt0VSxHQUFFNkIsR0FBRW9WLEdBQUV6VTtTQUNqQixLQURXeEMsR0FFSyxPQWZWaTFCLGdCQWFPcHpCLEdBQUVvVixHQUFFelU7aUJBR0QsT0FYVjJ5QixnQkFRT3R6QixHQUFFb1YsR0FBSmpYOztVQUt1QnN3QixLQUxqQjl0QjtVQUtXb3RCLEtBTFhwdEI7VUFLSzJ4QixLQUxMM3hCO1VBS0RxdEIsS0FMQ3J0QjtVQUtQc3RCLEtBTE90dEI7VUFJaUIrdEIsS0FKdkJ2d0I7VUFJaUJzdkIsS0FKakJ0dkI7VUFJV2kwQixLQUpYajBCO1VBSUt1dkIsS0FKTHZ2QjtVQUlEd3ZCLEtBSkN4dkI7aUJBS3VCc3dCLGNBREFDO21CQTdRaENsQixJQTZRUUcsSUFBTUQsSUFBTTBFLElBSmhCM2YsS0FJc0JnYixJQUpmenRCLEdBQUVvVixHQUFFelU7b0JBSWlCK3RCOzs7cUJBQ0FEO3FCQTlRaENqQixJQXlRSS9hLEtBQUt0VSxHQUFFNkIsR0FBRW9WLEdBS0w2WSxLQUFNRCxJQUFNc0UsSUFBTXZFO3FCQXBSMUJsa0IsT0ErUVMxTCxHQUFFNkIsR0FBRW9WLEdBQUV6VTtRQVFDO2lCQU1oQjhMLE9BQU8rTCxJQUFHRjtTQUNaLEtBRFNFLElBRU8sT0FGSkY7a0JBR0ksT0FIUEU7U0FLUSxZQTdJWG9hLFlBd0lNdGEsS0FLQWxELGNBQUg1WTtTQUNPLE9BcEJWaVcsS0FjRytGLElBS0FoYyxHQUFHNFksR0F6SE40ZCxtQkFvSE0xYTtRQU0yQjtpQkFFckNpYixlQUFlL2EsSUFBR3hZLEdBQUVvVixHQUFFa0Q7U0FDeEIsS0FEc0JsRCxHQUdaLE9BWFIzSSxPQVFlK0wsSUFBT0Y7YUFFakI4TixNQUZlaFI7U0FFVixPQXhCTjNDLEtBc0JXK0YsSUFBR3hZLEdBRWJvbUIsS0FGaUI5TjtRQUdGO2lCQUVoQkwsTUFBTXpiO1M3QjNYbkIsWTZCNlhXO1NBRVE7VUFES21FO1VBQUh5VTtVQUFIcFY7VUFBSDdCO1VBQ0FlLElBQUksbUJBSkExQyxHQUdEd0Q7U0FFUCxTQURJZCxHQUNVLFdBRlZmLE9BQU1pWCxJQUFHelU7aUJBQ1R6QjtVQUttQjttQkFUckIrWSxNQUFNemIsR0FHS21FO1dBTUlvdEI7V0FBTmtCO1dBQUp4QjtVQUE2QixXQXBDbENoYixLQThCRXRVLEdBQUc2QixHQUFHb1YsR0FNSHFZLEtBQUl3QixNQUFNbEI7O1NBRk07b0JBUHJCOVYsTUFBTXpiLEdBR0oyQjtVQUlhOHZCO1VBQU5pQjtVQUFKdkI7U0FBNkIsV0FBN0JBLElBQUl1QixRQWxDVHpjLEtBa0Nld2IsSUFKVmp1QixHQUFHb1YsR0FBR3pVOztpQkFRWDBYLE1BQU1uYyxHQUFFb0IsSUFBR0M7U0FDakIsR0FEY0Q7Y0FHcUJtYixLQUhyQm5iLE9BR2VvVyxLQUhmcFcsT0FHU2syQixLQUhUbDJCLE9BR0dvSCxLQUhIcEgsT0FHSEUsS0FIR0Y7YUF6VFo4dkIsT0F5VGU3dkIsT0FHa0JrYjtXQUNaO29CQWZqQlIsTUFjV3ZULElBSEFuSDtZQUlBOHhCO1lBQUpvRTtZQUFKaDJCO1lBQ2lELE1BTHBENGEsTUFBTW5jLEdBR2lCd1gsSUFDWjJiO1lBQ3FCLGlCQUwxQm56QixHQUdLd0ksUUFBTTh1QixLQUNWQztXQUM2QyxPQXJCeERGLGVBZ0JJbGIsTUFBTW5jLEdBR0RzQixJQUNGQyxLQURRaUg7OzttQkFIQW5ILElBRUc7Y0FGSEE7VUFVYjtTQUhtQjtVQURTK3hCLE9BTmYveEI7VUFNU20yQixPQU5UbjJCO1VBTUdvSCxLQU5IcEg7VUFNSDBZLE9BTkcxWTtVQU9NLFVBbEJqQjBhLE1BaUJjdFQsSUFOTnJIO1VBT0dpeUI7VUFBSm9FO1VBQUozZDtVQUNpRCxNQVJwRHFDLE1BQU1uYyxHQU9LcXpCLE1BRGVEO1VBRU0saUJBUjFCcHpCLEdBTVF5SSxJQUNQZ3ZCLFVBRGFEO1NBRWdDLE9BeEJ4REgsZUFnQklsYixNQUFNbmMsR0FPSDhaLE1BREtDLE9BQU10UjtRQUlKO2lCQUVWeXFCLE1BQU1sekIsR0FBRW9CLElBQUdDO1NBQ2pCLEdBRGNEO2FBQUdDOztZQUlrQmdiLEtBSmxCaGI7WUFJWTh4QixLQUpaOXhCO1lBSU1rMkIsS0FKTmwyQjtZQUlBb0gsS0FKQXBIO1lBSU5FLEtBSk1GO1lBR2tCa2IsS0FIckJuYjtZQUdlb1csS0FIZnBXO1lBR1NrMkIsS0FIVGwyQjtZQUdHb0gsS0FISHBIO1lBR0hFLEtBSEdGO2NBSXFCaWIsTUFEQUU7WUFHVjtxQkE3Qm5CUixNQTBCV3ZULElBSEFuSDthQU1FK3hCO2FBQUpvRTthQUFKemQ7YUFDRDlYLElBUEppeEIsTUFBTWx6QixHQUdEc0IsSUFHQXlZO2FBQ3FCdFYsSUFQMUJ5dUIsTUFBTWx6QixHQUdpQndYLElBR1Y0YjtZQUViLEtBRlNvRSxNQUdDLE9BM0RWamhCLEtBeURJdFUsR0FKT3VHLElBQU04dUIsSUFJUzd5QjtnQkFHbkJpekIsT0FKRUY7WUFJSSxPQXRDakJILGVBbUNRcDFCLEdBSk91RyxJQU9zQixXQVYzQnhJLEdBR0t3SSxJQUFNOHVCLElBT1ZJLE9BSG1CanpCOztXQUtQO3NCQW5DbkJzWCxNQTJCV3RULElBSkhySDtZQVlLaXlCO1lBQUpvRTtZQUFKM2Q7WUFDREwsTUFiSnlaLE1BQU1sekIsR0FZRDhaLE1BUkF2WTtZQVNxQnV4QixNQWIxQkksTUFBTWx6QixHQVlPcXpCLE1BUlVGO1dBVXZCLEtBRlNzRSxNQUdDLE9BakVWbGhCLEtBK0RJa0QsS0FUT2hSLElBQU04dUIsSUFTU3pFO2VBR25CNkUsT0FKRUY7V0FJSSxPQTVDakJKLGVBeUNRNWQsS0FUT2hSLElBWXNCLFdBaEIzQnpJLEdBSUt5SSxJQVlKa3ZCLE1BWlVKLEtBU1N6RTs7Y0FYdEIzeUIsSUFGSWlCOzs7Y0FFSmpCLElBRk9rQjtTQUVZLE9BQW5CbEI7UUFjMkM7aUJBRS9DbVEsT0FBT29CLEdBRVh3YTtTN0J0YVQsSzZCc2FTQSxHQURTO1NBR0U7VUFGSXpuQixJQUFmeW5CO1VBQVloVCxJQUFaZ1Q7VUFBU3BvQixJQUFUb29CO1VBQU1qcUIsSUFBTmlxQjtVQUVNelMsTUFKRm5KLE9BQU9vQixHQUVMelA7VUFHQTIxQixNQUFNLFdBTERsbUIsR0FFRjVOLEdBQUdvVjtVQUlONFosTUFORnhpQixPQUFPb0IsR0FFSWpOO1NBS2IsS0FGSW16QixLQUdDLE9BOURQcm5CLE9BMERNa0osS0FFQXFaO1lBSkE3d0IsTUFFQXdYLE9BRlNoVixNQUlUcXVCLEtBQytCLE9BTHJDNUc7U0FLNEMsT0EzRXhDM1YsS0F3RUVrRCxLQUZHM1YsR0FBR29WLEdBSU40Wjs7aUJBSUYxaUIsV0FBV3BRO1M3QjlheEIsWTZCK2FrQjtTQUdFO1VBRkl5RTtVQUFIeVU7VUFBSHBWO1VBQUg3QjtVQUVBd1gsTUFKRnJKLFdBQVdwUSxHQUVUaUM7VUFHQTQxQixNQUFNLFdBTEc3M0IsR0FFTjhELEdBQUdvVjtVQUlONFosTUFORjFpQixXQUFXcFEsR0FFQXlFO1NBS2IsS0FGSW96QixLQUlRLE9BekVkdG5CLE9Bb0VNa0osS0FFQXFaO2FBRUs1SSxNQUhMMk47U0FHVyxPQXRGYnRoQixLQWtGRWtELEtBRkczVixHQU1Fb21CLEtBRkw0STs7aUJBTUY3ZCxVQUFVdkQ7UzdCMWJ2QixZNkIyYmtCO1NBR1E7VUFGRmpOO1VBQUh5VTtVQUFIcFY7VUFBSDdCO1VBRVcsUUFKYmdULFVBQVV2RCxHQUVSelA7VUFFS2l5QjtVQUFKQztVQUNEeUQsTUFBTSxXQUxFbG1CLEdBRUw1TixHQUFHb1Y7VUFJSyxVQU5iakUsVUFBVXZELEdBRUNqTjtVQUlKMnZCO1VBQUpDO1NBQ0wsR0FGSXVEO1VBR2tCLFVBcEZ4QnJuQixPQWdGVzJqQixJQUVBRTtVQUVKLFdBbEdIN2QsS0E4Rkc0ZCxJQUZFcndCLEdBQUdvVixHQUlMbWI7O1NBR2UsVUFuR2xCOWQsS0E4Rk8yZCxJQUZGcHdCLEdBQUdvVixHQUlEa2I7U0FHSixXQXJGUDdqQixPQWdGTzRqQixJQUVBRTs7aUJBT0haLFVBQVV2SCxHQUFFbGtCO1NBQ2xCLElBRGdCaXZCLFNBQUUvbkI7U0FDbEI7ZUFEZ0IrbkIsS0FFTCxPQUZPL25CO1VBR2lCO1dBQWxCekssSUFIRHd5QjtXQUdGL2QsSUFIRStkO1dBR0xuekIsSUFIS216Qjs7V0FBRS9OLFVBR1BwbEIsR0FBR29WLEdBQUd6VSxHQUhDeUs7V0FBRituQjtXQUFFL25COztRQUdtQztpQkFFbkR0RyxRQUFRMEosS0FBSXdsQixJQUFHQztTQUNqQjtVQUF1QnJFLE9BTmpCRCxVQUtXc0U7VUFDR3BFLE9BTmRGLFVBS1FxRTtVQUNNeHZCO1VBQUdDO1NBQ25CO2VBRGdCRCxXQUFHQzttQkFJUDtVQUVGO1dBRDhCcXJCLE9BTHJCcnJCO1dBS2lCNHFCLEtBTGpCNXFCO1dBS2FndkIsS0FMYmh2QjtXQUtTRSxLQUxURjtXQUtEc3JCLE9BTEZ2ckI7V0FLRmtQLEtBTEVsUDtXQUtOZ3ZCLEtBTE1odkI7V0FLVkUsS0FMVUY7V0FNVnRGLElBQUksbUJBREp3RixJQUFzQkM7VUFFMUIsU0FESXpGLEdBQ1csT0FEWEE7VUFFSSxJQUFKcWEsTUFBSSxXQVRKL0ssS0FNSWdsQixJQUFzQkM7VUFJOUIsU0FESWxhLEtBQ1csT0FEWEE7VUFFMEI7V0FWYnlXLE9BTmpCTCxVQVdrQ04sSUFBSVM7V0FMeEJHLE9BTmROLFVBV1lqYyxJQUFJcWM7V0FMRnZyQjtXQUFHQzs7UUFXNkI7aUJBRWxERixNQUFNaUssS0FBSXdsQixJQUFHQztTQUNmO1VBQXFCckUsT0FwQmZELFVBbUJTc0U7VUFDR3BFLE9BcEJaRixVQW1CTXFFO1VBQ014dkI7VUFBR0M7U0FDakI7ZUFEY0QsV0FBR0M7bUJBSUw7O1dBQzRCcXJCLE9BTHZCcnJCO1dBS21CNHFCLEtBTG5CNXFCO1dBS2VndkIsS0FMZmh2QjtXQUtXRSxLQUxYRjtXQUtDc3JCLE9BTEp2ckI7V0FLQWtQLEtBTEFsUDtXQUtKZ3ZCLEtBTElodkI7V0FLUkUsS0FMUUY7dUJBTVosbUJBRElFLElBQXNCQzs7V0FDRCxxQkFQdkI2SixLQU1NZ2xCLElBQXNCQztXQUNMO1lBQ0c7YUFQYnpELE9BcEJmTCxVQXlCa0NOLElBQUlTO2FBTDFCRyxPQXBCWk4sVUF5QllqYyxJQUFJcWM7YUFMSnZyQjthQUFHQzs7Ozs7OztVQU1VOztRQUVtQjtpQkFFNUMrckI7U0FBVyxZQUNOO1NBQ3VCLElBQXZCN3ZCLGNBQUh4QyxjQUEwQixNQUY1QnF5QixTQUVLN3ZCO2lCQUZMNnZCLFNBRUVyeUI7UUFBb0M7aUJBRXRDKzFCO2FBQWE1eUI7O3dCQUNSLE9BRFFBO1VBRWlCO1dBQW5CWDtXQUFIeVU7V0FBSHBWO1dBQUg3QjtXQUE0QixpQkFBekI2QixHQUFHb1YsSUFGUjhlLGFBQWE1eUIsUUFFRlg7V0FGRVc7cUJBRVhuRDs7O2lCQUVOZzJCLFNBQVM5M0IsR0FDWCxPQUxNNjNCLGdCQUlLNzNCLEdBQ007aUJBTWZ3MUIsUUFBUXp6QixHQUFFZ3FCO3NCQUNPQTtVQUFMLElBQVVwb0IsY0FBRnF6QjtVQUFRLE9BNVh4QmhGLElBNFhnQmdGLEdBQUVyekIsR0FBTG9vQjtTQUFxQjtTQUF4QyxzQ0FEWUEsR0FBRmhxQjtRQUNrQztpQkFFMUMrYixPQUFPL2IsR0FBSSxPQUhYeXpCLFFBR096ekIsR0FsWVAwTixPQWtZMEI7aUJBRXRCZ21CLFlBQWE1eUI7U0FBTyxLQUFQQSxHQUNWO1NBQzRDO1VBQXZDaEgsT0FGS2dIO1VBRVBzTSxJQUZPdE07VUFFVGMsSUFGU2Q7VUFFWG0wQixJQUZXbjBCO1VBRWtDLE1BcEQvQ3l3QixVQW9ETW5rQixHQUFFdFQ7U0FBUyxlQUFmbTdCLEdBQUVyekIsa0I3QjNmakIsTzZCeWZhOHhCO1FBRWtFO2lCQUV0RTllLE9BQU9vVjtTQUNJLFVBdkRQdUgsVUFzREd2SDtTQUNJLHFCN0I5ZnBCLE82QnlmYTBKO1FBS3dCO2lCQUV4QkMsVUFBVTExQixHQUFFNkg7U0FDbEIsSUFEZ0JtTCxTQUFFakU7U0FDbEI7ZUFEZ0JpRSxLQUVMLE9BRk9qRTtVQUdnQjtXQUhsQnpLO1dBR0h5VSxJQUhHL0Y7V0FHTnJQLElBSE1xUDtXQUdUbFIsSUFIU2tSO1dBQUUrVixVQUdScGxCLEdBQUdvVixHQUFOalgsR0FIV2lOO1dBQUZpRTtXQUFFakU7O1FBR2tDO2lCQUU5QzRtQixnQkFBaUI5eUI7U0FBTyxLQUFQQSxHQUNkO1NBRTZCO1VBRHhCaEgsT0FGU2dIO1VBRVhzTSxJQUZXdE07VUFFYmMsSUFGYWQ7VUFFZm0wQixJQUZlbjBCO1VBR2UsTUFSaEM2eUIsVUFPTXZtQixHQUFFdFQ7U0FDVjtxQkFESW03QixHQUFFcnpCOytCN0J2Z0JqQixPNkJxZ0JhZ3lCO1FBR21EO2lCQUV2REMsV0FBVy95QjtTQUNJLFVBWFg2eUIsVUFVTzd5QjtTQUNJLHFCN0IzZ0J4QixPNkJxZ0JhOHlCO1FBTTRCO2lCQUVoQ0UsWUFDVUMsS0FBSS9KO1NBQWhCLElBQWdCK0ssU0FBRWowQjtTQUFJO2FBQU5pMEI7V0FHRTtZQUhGeHlCO1lBRUF5VSxJQUZBK2Q7WUFFSG56QixJQUZHbXpCOztZQUtOeDFCLElBRlEsbUJBRExxQyxHQUZEbXlCO29CQUtGeDBCO3VCQUNlLElBTlA0YixVQUVMdlosR0FBR29WLEdBRkF6VSxHQUFFekIsSUFBRmkwQixTQUFFajBCO2dCQUFGaTBCOzs7eUJBRUhuekIsR0FBR29WLEdBRkF6VSxHQUFFekI7Ozs7VUFTTCxxQjdCdmhCcEIsTzZCeWZhNHlCOztRQThCc0I7O2dCQWxhMUJobUI7Z0JBRUFxQjtnQkF3R0kwSjtnQkF0R0F3WDtnQkF5SkE0RTtnQkE3TEozRTtnQkFrTElhO2dCQStIQTlXO2dCQVlBK1c7Z0JBMERKdHFCO2dCQWNBUDtnQkFwTEl3STtnQkF1QkF6STtnQkFNQXFKO2dCQUlBRTtnQkE2RkFyQjtnQkFVQUY7Z0JBWUE2RTtnQkEyQ0FxZjtnQkFRSjJEO2dCQXZRSXZCO2dCQUtBQztnQkFLQUM7Z0JBS0FDO2dCQWZBSDtnQkFLQUM7Z0JBZ0pBNWE7Z0JBcFBBbks7Z0JBZ0ZBMEo7Z0JBL0RBbVo7Z0JBa0JBRztnQkFrQkFDO2dCQWtCQUM7Z0JBNkZBNXNCO2dCQVNBK0s7Z0JBeU1KNkQ7Z0JBYUFpZjtnQkFHQUM7Z0JBekJBTDtnQkFHQTFYOzs7O0U3QnZmVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHOEJrQkM7Ozs7O1lBRUl0USxjQUFZLGlCQUFvQjtZQUVoQ3VxQixNQUFNLzNCLGdDQUF5QjtZQUUvQnNlLEtBQUt0ZSxHQUFJLFdBQUpBLFlBQTZCO1lBRWxDZzRCLEtBQUs3M0IsR0FBRUgsY0FBRkcsR0FBRUgscUNBQXVDO1lBRTlDaTRCLElBQUlqNEI7SUFDTixZQURNQTtnQkFHTTtRQUROb0MsZUFBSkM7SUFGSXJDLE9BRUFvQztJQUZBcEM7SUFFcUMsT0FBekNxQztHQUNxQjtZQUVyQjYxQixRQUFRbDRCO0lBQ1YsWUFEVUE7Z0JBR0U7UUFETm9DLGVBQUpDO0lBRlFyQyxPQUVKb0M7SUFGSXBDO0lBRWlDLFdBQXpDcUM7R0FDYztZQUVkODFCLElBQUluNEI7SUFDTixZQURNQTtnQkFHSztRQURUcUM7SUFBUyxPQUFUQTtHQUNvQjtZQUVwQisxQixRQUFRcDRCO0lBQ1YsWUFEVUE7Z0JBR0M7UUFEVHFDO0lBQVMsV0FBVEE7R0FDYTtZQUVieU8sU0FBUzlRLEdBQUksYUFBSkEsYUFBYztZQUV2QnlOLE9BQU96TixHQUFJLE9BQUpBLEtBQVM7WUFFaEIwUSxLQUFLN1EsR0FBRUcsR0FBSSxtQ0FBTkgsR0FBRUcsTUFBbUI7WUFFMUJpSSxLQUFLcEksR0FBRTBRLEtBQUl2USxHQUFJLG1DQUFWSCxHQUFFMFEsS0FBSXZRLE1BQTRCO1lBSXZDMlcsT0FBTzNXLEdBQUksbUNBQUpBLE1BQW1CO1lBRTFCdzFCLFFBQVF2SixHQUFFbHFCO2lCQUFrQjVCLEdBQUssT0FsQ2pDNjNCLEtBa0M0QjczQixHQUFwQjhyQixHQUFpQztJQUEzQixzQ0FBSmxxQjtHQUFrQztZQUU1QytiLE9BQU9vSixHQUNELElBQUpsbkIsSUEzQ0Z3TixXQXdDQWdvQixRQUdFeDFCLEdBREtrbkIsSUFFVCxPQURJbG5CLEVBRUg7Ozs7O09BN0NDd047T0FNQXdxQjtPQUVBQztPQUtBQztPQUtBQztPQUtBQztPQXJCQUw7T0FFQXpaO09Bd0JBeE47T0FFQXJEO09BRUFpRDtPQUVBekk7T0FJQTBPO09BRUE2ZTtPQUVBMVg7OztFOUI5REw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0crQmlCQzs7OztZQVlJdFEsY0FBWSxvQkFJZjtZQUVHdXFCLE1BQU05TCwwQ0FHSztZQUVYK0YsSUFBSTd4QixHQUFFOHJCO0lBQ1IsSUFBSW9NLFdBREVsNEIsT0FVQ200QixRQVZDck07V0FVRHFNO2VBVkNyTSxxQkFVRHFNLFdBVEhELE1BRElwTSxPQUNKb007ZUFESXBNLGlCQUNKb00sTUFESXBNLE9BQ0pvTTtHQVlZO1lBS2RFLEtBQUt0TTtJQUNQLFlBRE9BO2dCQUVFO1FBQ0F1TTtJQUFhLE9BQWJBO0dBQW9CO1lBRTNCQyxTQUFTeE07SUFDWCxZQURXQTtnQkFFRjtRQUNBdU07SUFBYSxXQUFiQTtHQUF5QjtZQUtoQ3JsQixLQUFLOFk7SUFDUCxVQURPQTtjQUVFO1FBQ0F1TTs7U0FHUzVvQjtLQU5YcWM7WUFNV3JjO0tBR2hCLE9BTk80b0I7O0lBdkNQVCxNQW9DSzlMO0lBSUwsT0FET3VNO0dBTUE7WUFFUEUsU0FBU3pNO0lBQ1gsVUFEV0E7Y0FFRjtRQUNBdU07O1NBR1M1b0I7S0FOUHFjO1lBTU9yYztLQUdoQixXQU5PNG9COztJQWxEUFQsTUErQ1M5TDtJQUtULFdBRk91TTtHQU1LO1lBS1psYSxLQVlFMk47SUFBSyxJQVhlME0sU0FXcEIxTSxNQVhTMk0sWUFXVDNNLGFBWGU0TSxVQUFLUjtJQUN0QjtVQURzQkEsTUFBWE8sV0FBTUMsTUFFWSxPQUZsQkQ7S0FJTSxJQURSSixVQUhhSCxTQUdKem9CLE9BSEl5b0IsU0FJaEJTLGFBREdOO0tBRVAsR0FMZUssZ0JBSVhDLGFBSktGLFdBSUxFO1NBSldELE9BSVhDLFFBSmdCVCxPQUdKem9COztHQVFvRDtZQUV0RWtCLFNBQVNtYixHQUNYLGFBRFdBLGFBQ0M7WUFFVnhlLE9BQU93ZSxHQUNULE9BRFNBLEtBQ0Q7WUFFTnZiLEtBUUU3USxHQUFFb3NCO0lBQUssSUFQSTBNLFNBT1QxTSxNQVBTb007SUFDYjtVQURhQSxNQUVKO1NBQ0FHLFVBSElIO0tBSVgsV0FHQXg0QixHQUpPMjRCO1NBSElIOztHQU9VO1lBRXZCcHdCLEtBUUVwSSxHQUFFd1IsUUFBSzRhO0lBQUssSUFQSTBNLFNBT1QxTSxNQVBJbG5CLE9BT1RzTSxRQVBjZ25CO0lBQ2xCO1VBRGtCQSxNQUVULE9BRkl0ekI7S0FJQTtNQURKeXpCLFVBSFNIOztNQUFMcHpCLFNBSUEsV0FHWHBGLEdBUFdrRixNQUdKeXpCO01BSEl6ekI7TUFBS3N6Qjs7R0FPZTtZQUVqQ1UsU0FBU0MsSUFBR0M7SUFDZCxjQURXRDs7UUFRRlYsUUFSS1c7V0FRTFg7ZUFSS1c7O3dCQUFIRDtjQVFGVixXQVJFVTtjQUFHQyxRQUFIRDtjQXJHVGpCLE1BcUdTaUI7ZUFBR0MsUUFBSEQsT0FBR0MsUUFBSEQsT0FBR0MsUUFBSEQsT0FyR1RqQixNQXFHU2lCO0dBWUM7WUFJVnJpQixPQUFPc1Y7SUFDVCxTQUFRck8sSUFBSS9hO0tBQU8sS0FBUEEsR0FDRDtTQUNRMUMsSUFGUDBDLE1BRVUrTSxPQUZWL007S0FFcUIsV0FBZDFDLGlCL0IzSnRCLE8rQnlKV3lkLElBRWNoTztJQUFpQztjQUg5Q3FjO0lBQ1QscUIvQnpKSCxPK0J5SldyTztHQUlHO1lBRVQ0WCxRQUFRdkosR0FBRWxxQjtpQkFBa0I1QixHQUFLLE9BdkhqQzZ4QixJQXVINEI3eEIsR0FBcEI4ckIsR0FBaUM7SUFBM0Isc0NBQUpscUI7R0FBa0M7WUFFNUMrYixPQUFPb0osR0FDRCxJQUFKK0UsSUFySUZ6ZSxXQWtJQWdvQixRQUdFdkosR0FESy9FLElBRVQsT0FESStFLEVBRUg7Ozs7O09BdklDemU7T0FXQXdrQjs7T0ErQkE3ZTtPQVdBdWxCO09BWEF2bEI7T0FiQW9sQjtPQUtBRTtPQUxBRjtPQXZCQVI7T0E2REF6WjtPQWNBeE47T0FHQXJEO09BR0FpRDtPQVVBekk7T0FVQTh3QjtPQWdCQXBpQjtPQU9BNmU7T0FFQTFYOzs7RS9CaktMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZZ0N3Q0t0USxPQUFPbE07SUFDVjtLQUFJK1IsV0FETS9SO0tBRU5nUyx1QkFEQUQ7S0FFQXJULElBQUksa0JBREpzVDtJQUVKLGVBREl0VCxHQURBc1QsU0FDQXRUO0dBQ2tFO1lBRW5FazVCLFNBQVMxM0IsR0FBSSxtQ0FBSkEsa0JBQWdEO1lBQ3pEeWxCLFNBQVN6bEIsR0FBSSxtQ0FBSkEsa0JBQXlDO1lBRWxEZ2QsSUFBSWhkLEdBQUU4QixLQUFJQztJQUNaLFFBRFFELFlBQUlDLFFBQU4vQixPQUFNK0IsWUFBSkQ7S0FHSCxtQ0FIQzlCLFNBQUU4QixLQUFJQztJQUVQO0dBQ3VDO1lBRzFDd2IsS0FBS3NNLEtBQUl6TSxRQUFPUyxLQUFJVixRQUFPcGI7SUFDN0I7V0FENkJBOztZQUFsQnFiOztTQUFKeU0sU0FBc0I5bkIsWUFBbEJxYjtnQkFBV0QsZ0NBQUpVLE9BQVc5YixZQUFQb2I7S0FLcEIsb0NBTEswTSxXQUFJek0sUUFBT1MsS0FBSVYsUUFBT3BiO0lBR3hCO0dBRThDO1lBR2pEZ1csSUFBSS9YLEdBQUU4QjtJQUNSLElBQUlncUIsV0FERTlyQixNQUVOLFFBRk1BLE1BRU1pTSxtQkFBUDByQjtZQUZHNzFCLE9BQ0pncUIsV0FESWhxQixPQUVJbUssVUFEUjZmOzBDQUNDNkwsUUFGRzcxQjtJQUlQO0dBQytCO1lBRzlCbUssT0FBT2pNLEdBQUksT0FBSkEsS0FBYztZQUVyQnUyQixNQUFNdjJCLHNCQUFtQjtZQUV6QjQzQixNQUFNNTNCOztJQUdOLElBREU2M0IsWUFGSTczQjtXQUVKNjNCOztHQUdZO1lBTWRDLE9BQU85M0IsR0FBRSszQjtJQUNYLElBQUlDLFVBREtoNEIsTUFFTGk0QixVQUZLajRCLFNBR0xtZ0IsY0FEQThYOztRQUNBOVgsY0FGQTZYLFVBRE9EO01BR1A1WDs7OztVQUZBNlgsVUFET0Q7T0FHUDVYOztPQUtHO0tBRVUsSUFBYitYLGFBQWEsa0JBUGIvWDtLQVVKLDZCQWJTbmdCLFlBVUxrNEIsZUFWS2w0QjtnQkFVTGs0QixZQVBBL1g7OztHQVdpRDtZQVluRGdZLFNBQVNuNEIsR0FBRXFCO0lBQ2IsSUFBSXljLE1BRE85ZCxNQUVYLFFBRldBLE1BRUNpTSxtQkFBUDByQjtPQUFPMXJCLFVBRFI2UjtLQTNCRmdhLE9BMEJTOTNCO0tBS1QsZUFMU0EsZUFBRXFCOzs7MkJBRVJzMkIsUUFERDdaLEtBRFN6YztJQUFGckIsT0FDUDhkOztHQU9pQjtPQUVuQnNhLGlDQUNBQztZQUVJQyxnQkFBZ0J0NEIsR0FBRW9QO0lBQ3hCO1NBQUkwTyxNQURrQjlkO21CQUNsQjhkLEtBeENGZ2EsT0F1Q29COTNCLEdBSHBCbzRCO0tBTU0sSUFBSnQ0QixJQUFJLDZCQUhjRSxTQUNsQjhkLEtBRG9CMU87S0FJeEIsU0FESXRQLEdBMUNGZzRCLE9BdUNvQjkzQixHQUhwQm80QjtLQUdvQnA0QixPQUNsQjhkLE1BRUFoZTs7O0dBR3dCO1lBRXRCeTRCLG1CQUFtQnY0QixHQUFFb1A7SUFDM0I7U0FBSTBPLE1BRHFCOWQ7bUJBQ3JCOGQsS0FoREZnYSxPQStDdUI5M0IsR0FWdkJxNEI7S0FhTSxJQUFKdjRCLElBQUksNkJBSGlCRSxTQUNyQjhkLEtBRHVCMU87S0FJM0IsU0FESXRQLEdBbERGZzRCLE9BK0N1QjkzQixHQVZ2QnE0QjtLQVV1QnI0QixPQUNyQjhkLE1BRUFoZTs7O0dBR3dCO1lBRXRCMDRCLG1CQUFtQng0QixHQUFFb1A7SUFDM0I7U0FBSTBPLE1BRHFCOWQ7bUJBQ3JCOGQsS0F4REZnYSxPQXVEdUI5M0IsR0FsQnZCcTRCO0tBcUJNLElBQUp2NEIsSUFBSSw2QkFIaUJFLFNBQ3JCOGQsS0FEdUIxTztLQUkzQixTQURJdFAsR0ExREZnNEIsT0F1RHVCOTNCLEdBbEJ2QnE0QjtLQWtCdUJyNEIsT0FDckI4ZCxNQUVBaGU7OztHQUd3QjtZQUUxQjI0QixjQUFjejRCLEdBQUV4QixHQUFFazZCLFFBQU8zMkI7SUFDM0IsVUFEb0IyMkI7Ozs7O1lBQU8zMkI7MkNBQVR2RCxLQUFTdUQsV0FBUDIyQjtZQUVmO0lBRUw7S0FESTVNLFdBSFk5ckI7S0FJaEIsUUFKZ0JBO0tBSUppTTtLQUFQMHJCO0tBQ0RnQixlQUZBN00sV0FIdUIvcEI7T0FJZmtLLFNBQ1Iwc0I7S0FwRUZiLE9BK0RjOTNCLEdBQVcrQjtLQVF6Qiw2QkFSZ0J2RCxHQUFFazZCLFFBQUoxNEIsZUFBVytCOzs7S0FVekIsaUJBVmdCdkQsR0FBRWs2QixRQUlmZixRQUREN0wsVUFIdUIvcEI7SUFBWC9CLE9BS1oyNEI7O0dBTXNCO1lBRXhCQyxhQUFhNTRCLEdBQUV4QixHQUFFazZCLFFBQU8zMkI7SUFDMUIsT0FkRTAyQixjQWFhejRCLEdBQ0MsNkJBREN4QixJQUFFazZCLFFBQU8zMkI7R0FDMkI7WUFFbkQ4MkIsV0FBVzc0QixHQUFFeEI7SUFDZjtLQUFJdUQsNEJBRFd2RDtLQUVYc3RCLFdBRlM5ckI7S0FHYixRQUhhQTtLQUdBaU07S0FBUjByQjtLQUNEZ0IsZUFKUzM0QixPQUNUK0I7T0FFU2tLLFNBQ1Qwc0I7S0FuRkZiLE9BK0VXOTNCLEdBQ1QrQjtLQU1GLDZCQVBhdkQsTUFBRndCLGVBQ1QrQjs7O0tBUUYsaUJBVGF2RCxNQUdWbTVCLFFBREQ3TCxVQURBL3BCO0lBRFMvQixPQUlUMjRCOztHQU1zQjtZQUV4QkcsVUFBVTk0QixHQUFFeEI7SUFBSSxPQVpoQnE2QixXQVlVNzRCLEdBQW1CLDZCQUFqQnhCO0dBQTJDO1lBRXZEdTZCLFdBQVcvNEIsR0FBRWc1QixJQUNmLE9BbEJFSixhQWlCVzU0QixHQUFFZzVCLG9CQUM2QjtZQXlCMUNDLFlBQVlqNUIsR0FBRTBDLElBQUd3MkI7SUFDbkI7V0FEbUJBOztZQUVqQjtPQUZZbDVCLGtCQUFLazVCLGdCQXZIakJwQixPQXVIWTkzQixHQUFLazVCOztLQXJCZ0JsMkIsUUFxQnJCaEQ7S0FyQkVxRCxNQXFCRnJEO0tBR1ZtNUI7S0F4QitCcjNCO0tBQUtzM0IsVUFxQnJCRjtJQXBCakI7Y0FEc0NFO01BRzVCLElBQUp0MkIsSUFBSSx1QkFrQklKLElBckJBVyxLQUFtQnZCLEtBQUtzM0I7TUFJcEMsU0FESXQyQjs7UUFIYXUyQixpQkF3QmpCRixlQXJCSXIyQjtRQUgyQkYsY0FHM0JFO1FBSGdDdzJCLHNCQUdoQ3gyQjtRQXFCSnEyQixlQXhCaUJFO1FBQWN2M0I7UUFBS3MzQjs7OztLQXFCMUJwNUIsY0FHVm01Qjt1QkFIZUQ7TUFNSDtLQUNoQjs7R0FBRTtZQUVBSyxjQUFjNTNCLElBQUczQjtJQUNuQiw4QkFEZ0IyQixJQUFHM0I7R0FDa0I7WUE0Q25DdzVCLGVBQWV4NUIsR0FBRTNCLEdBQUVHO0lBQ3JCLElBaEJxQmk3Qiw4QkFlQWo3QixJQUVQazdCLGVBQVNqWDtJQUNyQjtRQURxQkEsT0FqQkZnWDt1QkFpQlBDO21CQXJKWnZCLFNBbUplbjRCLEdBRUgwNUI7O0tBRUosSUFTSkMsYUFUSSxnQkFKV243QixHQUVFaWtCO2VBV2pCa1g7TUFBYSxVQVhMRDtPQXJKWnZCLFNBbUplbjRCO09BbkpmbTRCLFNBbUplbjRCLEdBYVgyNUI7T0FFQyxJQWJnQjlXLG1CQUFUNlcsZUFBU2pYOzs7Z0JBV2pCa1g7T0FLQyxJQWhCZ0J2VyxtQkFBVHNXLFdBV1JDLFlBWGlCbFg7OztNQXJKckIwVixTQW1KZW40QixHQWFYMjVCO01BT0MsSUFsQmdCclcsbUJBQVRvVyxXQVdSQyxZQVhpQmxYOzs7ZUFBVGlYO01BckpadkIsU0FtSmVuNEIsR0FhWDI1QjtNQVBDLElBSmdCaFgsbUJBQVQrVyxlQUFTalg7OztLQU9oQixJQXhCUW1YLFVBaUJRblg7UUFqQkZnWCxTQUFORyxTQUNNO0tBQ2YsSUFwQmVDLFVBb0JmLGdCQWFlcjdCLEdBZk5vN0I7ZUFsQk1DO01BNEJsQjtPQWxCYW5NLFFBUURrTTtPQVJHRSw4QkF1Qkd0N0I7T0F2QkxzbEI7TUFDZDtVQURnQmdXLFNBQUZoVztZQWtCVGlXLFNBbEJXRDs7UUFFViw0QkFxQmF0N0IsR0F2QkxzbEI7Ozs7Ozs7Ozs7Ozs7WUFrQlRpVyxTQWxCU2pXOzs7OztXQW1CYiw4QkFJa0J0bEIsR0FmTm83QixTQVVSRyxTQVZRSDtXQVVSRzs7Ozs7O01BTEosSUF0QmUzTSxZQWlCSHdNLGlCQWpCQ0k7Z0JBREtIO1dBQVFJOztrQkFBUko7UUFOZDtXQU1zQkk7O1VBQ1RoYiw0QkFnQ0N6Z0IsSUFoQ0xnM0IsU0F1QlQwRSxPQXZCVzlNO01BQ2hCO1VBRGtCbk8sT0F1QmJpYixNQXRCWTtVQUNkLGdCQThCZ0IxN0IsR0FUZDA3QixVQXhCY0w7WUFDSHQ1QixJQXVCWDI1QixjQXZCU0MsMEJBdUJURCxPQXZCVzM1Qjs7O1VBR2IsZ0JBNkJnQi9CLEdBVGQwN0IsVUF4QnNCRDtZQUNYL2EsTUF1QlhnYixxQkF2QldoYjs7O2dCQUFGc1c7WUFBRWgxQixNQXVCWDA1QixjQXZCU0UsMEJBdUJURixPQXZCVzE1Qjs7Ozs7O1dBd0JmO2dDQVFrQmhDLEdBaENINHVCLFlBdUJYOE0sT0FOUU47V0FNUk07Ozs7U0FXZ0JHLHFCQVFaQztLQXhHVHpCLFdBOEZlNzRCLEdBV0csV0FYRDNCLEdBVVJpOEI7U0FSR1osZUFBU2pYOztHQXNCWjtZQUVUOFgsU0FBU3Y2QixHQUFFK0I7SUFDWCxRQURXQSxPQUFGL0IsUUFBRStCLEtBQUYvQixPQUFFK0I7SUFFVDtHQUVpQjtZQUluQm9ULE9BQU9uVjthQUNEb2MsSUFBSTdiO0tBRVYsR0FIT1AsUUFDR08sR0FFYztLQUVkLElBQUo1QixJQUFJLGVBTEhxQixTQUNHTyxJQUlBLE1BSkFBO0tBS1IsV0FESTVCLGlCaEMxU1gsT2dDc1NXeWQ7SUFLbUI7SUFFM0I7eUJoQzdTSCxPZ0NzU1dBO0dBT0g7WUFFSDhELFFBQVFsZ0I7YUFDRm9jLElBQUk3YjtLQUVWLEdBSFFQLFFBQ0VPLEdBRWM7S0FFZCxJQUFKNUIsSUFBSSxlQUxGcUIsU0FDRU8sSUFJQSxNQUpBQTtLQUtSLGVBTFFBLEdBSUo1QixrQmhDcFRYLE9nQ2dUV3lkO0lBS3VCO0lBRS9CO3lCaEN2VEgsT2dDZ1RXQTtHQU9IO1lBRUg0WCxRQUFRaDBCLEdBQUV3TztJQUFlLGtCaEN6VDlCLE9nQ2dISzJwQixTQXlNUW40QjtJQUFRLHNDQUFOd087R0FBK0I7WUFFekM4TixPQUFPL2IsR0FDRCxJQUFKUCxJQXBSRmdNLFlBaVJBZ29CLFFBR0VoMEIsR0FES08sSUFFVCxPQURJUCxFQUVIO1lBa0JDdzZCLFNBQVN4NkIsR0FBRXJCO0lBQ2I7S0FBSW10QixXQURPOXJCO0tBRVgsUUFGV0E7S0FFTmlNO0tBQVEwckI7S0FDVGdCLGVBRkE3TTtPQUNDN2YsU0FDRDBzQjtLQTdQRmIsT0EwUFM5M0I7S0FNVCxlQU5TQSxlQUFFckI7OzsyQkFFQWc1QixRQURUN0wsVUFEU250QjtJQUFGcUIsT0FHUDI0Qjs7R0FNc0I7WUFFeEI4QixhQUFhejZCLEdBQUVyQjtJQUNqQjtLQUFJbXRCLFdBRFc5ckI7S0FFZixRQUZlQTtLQUVWaU07S0FBUTByQjtLQUNUZ0IsZUFGQTdNO09BQ0M3ZixTQUNEMHNCO0tBeFFGYixPQXFRYTkzQjtLQU1iLGlCQU5hQSxlQUFFckI7OztLQVFmLGlCQU5XZzVCLFFBRFQ3TCxVQURhbnRCO0lBQUZxQixPQUdYMjRCOztHQU1zQjtZQUV4QitCLGFBQWExNkIsR0FBRXJCO0lBQ2pCO0tBQUltdEIsV0FEVzlyQjtLQUVmLFFBRmVBO0tBRVZpTTtLQUFRMHJCO0tBQ1RnQixlQUZBN007T0FDQzdmLFNBQ0Qwc0I7S0FuUkZiLE9BZ1JhOTNCO0tBTWIsaUJBTmFBLGVBQUVyQjs7O0tBUWYsaUJBTldnNUIsUUFEVDdMLFVBRGFudEI7SUFBRnFCLE9BR1gyNEI7O0dBTXNCO1lBRXhCZ0MsYUFBYTM2QixHQUFFckI7SUFDakI7S0FBSW10QixXQURXOXJCO0tBRWYsUUFGZUE7S0FFVmlNO0tBQVEwckI7S0FDVGdCLGVBRkE3TTtPQUNDN2YsU0FDRDBzQjtLQTlSRmIsT0EyUmE5M0I7S0FNYixpQkFOYUEsZUFBRXJCOzs7S0FRZixpQkFOV2c1QixRQURUN0wsVUFEYW50QjtJQUFGcUIsT0FHWDI0Qjs7R0FNc0I7WUFFeEJpQyxhQUFhNTZCLEdBQUVyQjtJQUNqQix3Q0FEaUJBO1dBakNmODdCLGFBaUNhejZCO0dBQ3dDO1lBRXJENjZCLGFBQWE3NkIsR0FBRXJCO0lBQ2pCLElBRGlCc2I7SUFDc0IsT0FyQ3JDd2dCLGFBb0NhejZCLEdBQUVpYTtHQUNzQztZQUVyRDZnQixhQUFhOTZCLEdBQUVyQjtJQUNqQiwyQkFBdUMsaUJBRHRCQTtJQUNzQixPQTdCckMrN0IsYUE0QmExNkI7R0FDd0M7WUFFckQrNkIsYUFBYS82QixHQUFFckI7SUFDakIsSUFEaUJzYiwyQkFDNkIsaUJBRDdCdGI7SUFDNkIsT0FoQzVDKzdCLGFBK0JhMTZCLEdBQUVpYTtHQUNzQztZQUVyRCtnQixhQUFhaDdCLEdBQUVyQjtJQUNqQiwyQkFBdUMsaUJBRHRCQTtJQUNzQixPQXhCckNnOEIsYUF1QmEzNkI7R0FDd0M7WUFFckRpN0IsYUFBYWo3QixHQUFFckI7SUFDakIsSUFEaUJzYiwyQkFDNkIsaUJBRDdCdGI7SUFDNkIsT0EzQjVDZzhCLGFBMEJhMzZCLEdBQUVpYTtHQUNzQzs7OztPQXBXckRqTztPQU1BMHJCO09BQ0FqUztPQUVBekk7T0FNQU87T0FRQXhGO09BUUE5TDtPQUVBc3FCO09BRUFxQjtPQTJJQTJCO09BdUVBZ0I7T0E3S0FwQztPQWFJRztPQWdCQUU7T0FSQUQ7T0FnQ0pNO09BWUFDO09BNUJBTDtPQWFBRztPQWlHQVk7T0FoRkFUO09BMEJBRTtPQXdGQTlqQjtPQVVBK0s7T0FVQThUO09BRUExWDtPQXFCQWtlOztPQVdBQztPQW9DQUk7T0FIQUQ7T0FqQ0FIO09Bb0NBSTtPQUhBRDtPQXRCQUY7T0ErQkFLO09BSEFEO09BakJBSDtPQTBCQU07T0FIQUQ7OztFaEN4WUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lrQ2dDS1csaUJBQWUsMkNBQWdCO0dBbUJMLElBQXhCQztZQU9BQztJQUNPLElBQUxqTixLQUFLLGtCQVJQZ047SUFTRiwyQkFESWhOO0dBQ1k7R0FGZGlOO0dBUWM7SUFBZEMsY0FBYztJQUtkQyxjQUFjO1lBT2RDLFFBQVNDLG1CQUFrQkM7SUFDN0I7S0FBSUMsTUFBTSw2QkFiUkw7S0FjRXRHLFFBREEyRyxLQUR5QkQ7SUFHN0IsR0FIV0Q7S0FLb0IsSUFBeEI3aEIsUUFMSTZoQixzQkFMVUcsU0FPakI1RyxHQUdHcGI7S0FUUDtNQUFRLElBQUo5WixJQUFJLDZCQUhOeTdCO2FBSUssNkJBSkxBLGFBR0V6N0IsT0FEaUI4N0IsSUFDakI5N0I7Ozs7O0lBV0osT0FMSWsxQjtHQUtIO1lBSUM2RyxXQUFXRjtJQUNiLElBQUl2TixxQ0FJdUIwTixLQUp2QjFOO09BRFN1TixNQUtjRyxJQUZWLE9BRmIxTjtRQU9FMk4sU0FIcUJEO0lBQ3ZCO1FBTlNILE1BUVBJO01BQ1MsSUFBVEMsU0FBUyxlQURURCxRQTlDSlg7TUFnREEsNEJBVEVoTixPQVFFNE4sV0FKcUJGO01BTXpCLG9CQUZJRTtNQUVKLE9BRklBOztTQUpxQmgrQixRQUdyQis5QixxQkFIcUIvOUI7O0dBUXhCO1lBRURxTyxXQUFpQmxPO0lBQ1YsSUFERnc5QixnQkFDSHZOLEtBaEJGeU4sV0FlS0Y7SUFLUCxpQkFKSXZOLElBREd1TixnQkFBWXg5QjtJQUtuQjs7WUFFRStWO0lBQ087S0FERzVEO0tBQUxxckI7S0FDSHZOLEtBdkJGeU4sV0FzQktGO0tBRUhoNkIscUJBREF5c0IsSUFER3VOO09BRUhoNkIsTUE5REZ5NUIsY0FtRUcsT0FMRHo1QjtJQUVnQixJQUFkcUUsTUFBYyxXQUpSc0s7SUFLVixpQkFKRThkLElBREd1TixnQkFJRDMxQjtJQUNKLE9BRElBOztZQXFCTmkyQixrQkFBU0MsbUJBQWMsT0FBZEE7WUFFVEMsWUFBVSw0QkFBVztZQUVyQkMsc0JBQW9CLGFBQUMsNkJBQW1CO0dBS2pCO0lBQXZCQyx1QkFBdUI7SUFFdkJDLDJDQUFzQyxTQUFFO1lBRXhDQyxtQkFBbUIxK0I7SUFDckIsR0FBRyw2QkFMRHcrQjtLQU1BOztRQUVJRyxRQU5KRjthQU9JRyxhQUFXLFdBRFhELFdBQ1csa0JBTEkzK0IsTUFLVTtJQVA3QnkrQiwwQkFPSUc7O0dBRUg7R0FVYSxJQUFkQyxjQXhGRWxCLGdDQXdGOEMsU0FBRTtZQUVsRDUyQixRQUFRL0c7SUFDb0IsSUFBMUJpSCxXQTFEQW9QLElBdURGd29CO2FBSUUxM0I7S0FLRixXQVBRbkg7S0FPUixrQkFORWlIO0lBTWU7SUFFbkIsT0F6RUl1SCxJQThERnF3QixhQUlFMTNCO0dBT3dCO1lBRTFCRztJQUNxQixJQUFuQnRILElBckVBcVcsSUF1REZ3b0I7SUFlRixrQkFESTcrQjtHQUNBO29CQUZGc0g7WUFRQXczQixNQUFNOStCO0lBQ1IsT0E3Qk8sNkJBZEx3K0I7S0FlQSw2QkFmQUE7S0FnQkEsV0FkQUM7K0NBZ0JtQyxTQUFFOztJQXZDbkMsdUNBckRBZjs7S0FtREEsSUFBeUIzaEIsa0JBQWZvYixjQUFDMkcsTUFBRDNHO0tBQ0wsV0FETTJHLEtBQ1MsV0FESy9oQixPQVh6QjFGLElBV1U4Z0I7SUFDMkI7SUFDckM7S0FpRUE0SCxLQWpFQTtLQXFFQUMsYUFBYTtLQUNiQyxpQkFBaUI7S0FDakJDO2FBRUFDO0tBQ0Y7O01BNUlFM0I7Ozs7VUFzRUEsSUFBVzE1QixjQUFMZzZCLGdCQUNBdk4sS0F4Q055TixXQXVDTUY7VUFDdUIsaUJBQXZCdk4sSUFEQXVOLGdCQUFLaDZCO1VBQ2tCO1NBQWM7TUFGN0MsaUNBOERFaTdCO01BYVksSUFHVjE1QixNQUhVLFdBZlJyRjs7V0FtQlFvL0I7MENBUlZud0IsYUFRVW93Qjs7O3dCQVJWcHdCLGFBT0E1SjtLQUlKLElBOUJBaUMsbUJBOEJJeUgsV0FYQUU7V0FnQlVvd0I7TUFDUjtPQURRRDtPQUNSLFlBakJGbndCLGdCQWdCVW13QixRQWhCVm53QjtPQVdBRjs7S0FxQkosNEJBckNFaXdCO1lBRUFFO2VBeUNFO2dCQXpDRkE7O3FCQWNFbndCO2VBWk4sZ0NBSElrd0I7SUEwQ21EO0lBSXZEO1lBQVcsMEJBM0NQRSxNQUpBSDs7WUFDQUM7WUFDQUM7R0FnRFU7WUFFWjNvQjs7S0FBbUMyb0I7S0FBaEJEO0tBQVpEO0lBQ1QsNEJBRFNBO0lBR1A7aUJBSG1DRTs7TUFLL0IsZ0NBTGVELGdCQUFaRDs7O1NBT0kzNUI7S0FDUCw0QkFSRzI1QjtjQU9JMzVCLFlBS1IvRSxJQUxRK0UsUUFLSCxPQUFML0U7U0FDRysrQixLQU5LaDZCO0tBTUMsa0NBQU5nNkI7Ozs7SUFFTkM7OztPQXpFQVI7T0EwREF2b0I7T0E3R0E2bkI7T0FFQUU7T0FXQUk7T0FtQkEzM0I7T0F4SUF1MkI7T0E0R0FpQjtPQXdIQWU7V0F0TEUzQixTQWlDQXRuQixLQVBBN0g7OztFbEN4R1A7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0ltQ2dtRlcrd0I7SUFRUUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQWhsRmRDLHVCQUFxQiwwQ0FBb0I7WUFHekNDLGdCQUFnQmxnQyxVQUFTd0Q7SUFDM0I7S0FDSTI4QixVQUZ1QjM4QjtLQUVDNDhCLGFBRkQ1OEI7S0FJQyw4QkFKVnhELFVBRWRtZ0MsV0FBd0JDO0lBQzVCLHNCQUhrQnBnQyxVQUVkbWdDLFNBRUY7R0FBaUU7WUFFakVFLGdCQUFnQnJnQztJQUNsQixtQ0FEa0JBO0dBQ007WUFHdEJzZ0MsYUFBYXRnQztJQUNmLElBQUl1Z0MsYUFkRk4sb0JBZUZ2OUI7O0tBRThCLDJCQUpmMUMsVUFFZjBDO0tBQ0UsZUFGRTY5QixZQUNKNzlCLEdBRUk7S0FERixXQURGQTtrQkFJQSxvQ0FMSTY5QjtTQUNKNzlCOztHQUlnQztZQUc5Qjg5QixlQUFleGdDLFVBQVN3RDtJQUMxQixJQUNJMjhCLFVBRnNCMzhCLGFBRUU0OEIsYUFGRjU4QjtrQkFHYixnQkFISXhELFVBRWJtZ0MsV0FBd0JDO0dBQzhCO1lBYXhESyxlQUFlQztJQUFVLEtBQVZBLFNBQ1A7UUFDSEMsUUFGVUQ7SUFFRCxjQUFUQztHQUFtQztZQVN4Q0MsK0JBR0F0Z0MsS0FBSXVnQztJQUFPLFVBQVh2Z0M7OztRQUVBLGVBRkl1Z0M7O1FBSUosZUFKSUE7O1FBZ0NKLGdCQWhDSUE7Z0JBc0NKLGdCQXRDSUE7O1dBQUp2Z0M7O1dBS2VvZ0MsVUFMZnBnQyxRQU1BLGVBcEJBbWdDLGVBbUJlQyxVQUxYRzs7V0FPZ0JDLFlBUHBCeGdDO09BUUEsZUF0QkFtZ0MsZUFxQm9CSyxZQVBoQkQ7O1dBU2dCRSxZQVRwQnpnQyxRQVNhbEMsUUFUYmtDO09BVUEsZUFEYWxDLE9BdkJicWlDLGVBdUJvQk0sZUFUaEJGOztXQVdrQkcsWUFYdEIxZ0MsUUFXZS9CLFVBWGYrQjtPQVlBLGVBRGUvQixTQXpCZmtpQyxlQXlCc0JPLGVBWGxCSDs7V0Fjc0JJLFlBZDFCM2dDLFFBY21CNUIsVUFkbkI0QjtPQWVBLGVBRG1CNUIsU0E1Qm5CK2hDLGVBNEIwQlEsZUFkdEJKOztXQWlCa0JLLFlBakJ0QjVnQyxRQWlCZXpCLFVBakJmeUI7T0FrQkEsZUFEZXpCLFNBL0JmNGhDLGVBK0JzQlMsZUFqQmxCTDs7V0FUYU0sV0FTakI3Z0MsUUFvQmU4Z0MsWUFwQmY5Z0M7VUFUaUI2Z0M7WUFFWkUsT0FGWUYsd0JBRVpFOzs7T0E0Qkwsb0JBbkNBWixlQWtDZVcsa0JBcEJYUDs7V0F3QlNTLFlBeEJiaGhDO09BeUJBLGVBdkNBbWdDLGVBc0NhYSxZQXhCVFQ7O1dBMEJ5QnpoQyxRQTFCN0JrQixRQTBCb0JpaEMsWUExQnBCamhDO09BMkJBLGdCQURvQmloQyxXQUFTbmlDLE9BMUJ6QnloQzs7V0E0QjJCdmhDLFVBNUIvQmdCLFFBNEJzQmtoQyxZQTVCdEJsaEM7T0E2QkEsZ0JBRHNCa2hDLFdBQVNsaUMsU0E1QjNCdWhDOztXQWlDOEI3Z0MsV0FqQ2xDTSxRQWlDdUJMLFlBakN2Qks7T0FrQ0EsZ0JBRHVCTCxXQUFXRCxVQWpDOUI2Z0M7bUJBbUNxQjFnQyxVQW5DekJHLFFBb0NBLGdCQUR5QkgsU0FuQ3JCMGdDOztHQXNDaUM7WUEwR3JDWSx3QkFBd0J6aUMsT0FDMUIsYUFEMEJBLG1CQU9YO1lBNkJiMGlDLGNBQWNDO0lBQVksY0FBbUIsa0JBQS9CQTtHQUF1RDtZQUdyRUMsa0JBQWtCcDhCLEtBQUlxOEI7SUFDeEI7S0FBSTM5QixtQ0FEZ0JzQjtLQUVoQnM4QixVQUZnQnQ4QixTQUFJcThCO1lBQ3BCMzlCLE1BQ0E0OUI7O0tBRVk7TUFBVnhmLFVBQVUsMkJBSFpwZSxhQUNBNDlCO01BR0VDLFVBQVUsa0JBRFZ6ZjtLQUVKLDZCQU5rQjljLFdBS2R1OEIsWUFKRjc5QjtLQURnQnNCLFNBS2R1OEI7Ozs7OztHQUdMO1lBR0NDLGdCQUFnQng4QixLQUFJaEM7SUFYcEJvK0Isa0JBV2dCcDhCO0lBRWxCLGVBRmtCQSxnQkFBSWhDO0lBQUpnQzs7R0FHSTtZQUdwQnk4QixrQkFBa0J6OEIsS0FBSTdFO0lBQ3hCLElBQUl1aEMsZ0NBRG9CdmhDO0lBakJ0QmloQyxrQkFpQmtCcDhCLEtBQ2hCMDhCO0lBRUosOEJBSHdCdmhDLE1BQUo2RSxnQkFDaEIwOEI7SUFEZ0IxOEIsa0JBQ2hCMDhCOztHQUd3QjtZQUcxQkMsZ0JBQWdCMzhCO0lBQ2xCLG1DQURrQkE7R0FDa0I7WUFLbEM0OEIsY0FBY2hrQztJQUFRLE9BQVJBOzs7T0FFb0I7OztPQUF3Qjs7O09BQ2hEOzs7T0FBd0I7Ozs7O09BRkU7ZUFDMUI7O0dBQzJCO1lBSXJDaWtDLGNBQWdCL1UsS0FBUXR1QjtJQUFRLEdBQWhCc3VCLFNBQUdFLE1BQUhGLGFBQUdFLGNBQUg4VTtXQUFRdGpDOztPQUNiOztPQUFpQjs7T0FDakI7O09BQWlCOztPQUNqQjs7T0FBaUIsT0FIWnNqQzs7T0FJTDs7T0FBaUI7ZUFDaEI7O0dBQUc7WUF5RWZDLGFBQWEvOEIsS0FBSWc5QjtJQUFRLE9BQVJBOztPQUNSLE9BekdUUixnQkF3R2F4OEI7O09BRUo7ZUFDQSxPQTNHVHc4QixnQkF3R2F4OEI7O0dBR21CO1lBR2hDaTlCLG9CQUFvQmo5QixLQUFJazlCO0lBQzFCLE9BRDBCQSxXQTlHeEJWLGdCQThHb0J4OEIsV0FBSWs5QjtHQUNjO1lBSXRDQyxlQUFlbjlCLEtBQUlrN0I7SUFBVSxLQUFWQSxTQUNYO1FBQ0hDLFFBRmNEO0lBRWlCLE9BL0dwQ3VCLGtCQTZHZXo4QixLQUVxQiwyQkFBL0JtN0I7R0FBb0Q7WUFLekRpQyxlQUNBcDlCLEtBQUl4SDtJQUFPLFVBQVBBLGtCQUNVO2FBRFZBO1NBRWdCaUUsSUFGaEJqRSxRQUVTd2tDLFFBRlR4a0M7S0FuQkp1a0MsYUFtQkEvOEIsS0FFYWc5QjtLQUVTLE9Bekh0QlAsa0JBcUhBejhCLEtBSXNCLDJCQUZGdkQ7O1FBR1I0Z0MsVUFMUjdrQztJQW5CSnVrQyxhQW1CQS84QixLQUtZcTlCO0lBQ1osT0FqSUFiLGdCQTJIQXg4QjtHQU91QjtZQUd2QnM5QixpQkFDRXQ5QixLQUFJdEg7SUFBUSxVQUFSQTttQkFoSU4rakMsa0JBZ0lFejhCO1FBRVl2RCxJQUZSL0Q7SUF0SU44akMsZ0JBc0lFeDhCO0lBSW9CLE9BcEl0Qnk4QixrQkFnSUV6OEIsS0FJb0IsMkJBRlJ2RDtHQUlZO1lBSzFCOGdDLGtCQUFrQnY5QixLQUFJcEg7SUFBUSxPQUFSQTs7O09BQ0gsT0FsSm5CNGpDLGdCQWlKa0J4OEI7OztPQUVDLE9BbkpuQnc4QixnQkFpSmtCeDhCOzs7Ozs7O09BSWhCLE9BckpGdzhCLGdCQWlKa0J4OEI7ZUFLK0I7O0dBQUU7WUFZbkR3OUIsa0JBQWtCeDlCLEtBQUlrOUIsVUFBU3RrQyxPQUFNSixLQUFJRSxNQUFLc0Y7SUFsSzlDdytCLGdCQWtLa0J4OEI7SUFwRGxCaTlCLG9CQW9Ea0JqOUIsS0FBSWs5QjtJQWpCdEJLLGtCQWlCa0J2OUIsS0FBYXBIO0lBeEMvQndrQyxlQXdDa0JwOUIsS0FBbUJ4SDtJQTdCckM4a0MsaUJBNkJrQnQ5QixLQUF1QnRIO0lBbEt6QzhqQyxnQkFrS2tCeDhCLEtBQTRCaEM7SUFPNUIsT0F6S2xCdytCLGdCQWtLa0J4OEIsS0EvSWxCNDhCLGNBK0krQmhrQztHQU9RO1lBS3ZDNmtDLGtCQUFrQno5QixLQUFJeEc7SUFDeEIsT0FEd0JBOzs7T0E5S3RCZ2pDLGdCQThLa0J4OEI7ZUE5S2xCdzhCLGdCQThLa0J4OEI7O2dCQUFJeEcsV0E5S3RCZ2pDLGdCQThLa0J4OEI7R0FRZTtZQWFqQzA5Qix5QkFBeUJsRDtJQUFpQixVQUFqQkE7OztRQUNEOztRQUNBOztRQUVBOztRQUNBOztRQUNBOztRQUVBO2dCQUNBOztXQVRDQTs7V0FHbEI5Z0MsTUFIa0I4Z0MsbUJBR0QsT0FBakI5Z0M7O1dBSUtpa0MsUUFQYW5ELG1CQU9ELE9BQVptRDs7T0FHVSxJQUFYMy9CLElBVmN3OEIsbUJBVUgsdUNBQVh4OEI7T0FBVzs7R0FBaUI7WUFLdkM0L0Isb0JBQW9CNTlCLEtBQUlyRztJQUFNLGNBQU5BO2NBNU14QjhpQyxrQkE0TW9CejhCO2NBbE5wQnc4QixnQkFrTm9CeDhCLEtBQUlyRztHQUVJO1lBRzVCa2tDLHNCQUFzQjc5QixLQUFJdEc7SUFDNUIsaUNBRDRCQSxjQUM1Qjs7OztNQU5Fa2tDLG9CQUtzQjU5QixLQUVFLGdCQUZFdEcsS0FDNUJ3RDtNQUNFLFdBREZBOzs7Ozs7R0FFSTtZQU1FNGdDLGFBRUo5OUIsS0FBSXBHO0lBQVMsSUFBVEU7SUFBUztlQUFUQSxzQkF5Qlk7WUF6QlpBOzs7UUE1TkoyaUMsa0JBNE5BejhCO1lBQUlsRzs7OztRQTVOSjJpQyxrQkE0TkF6OEI7WUFBSWxHOzs7O1FBNU5KMmlDLGtCQTROQXo4QjtZQUFJbEc7Ozs7UUE1TkoyaUMsa0JBNE5BejhCO1lBQUlsRzs7OztRQTVOSjJpQyxrQkE0TkF6OEI7WUFBSWxHOzs7O1FBNU5KMmlDLGtCQTROQXo4QjtZQUFJbEc7Ozs7UUE1TkoyaUMsa0JBNE5BejhCO1lBQUlsRzs7OztRQTVOSjJpQyxrQkE0TkF6OEI7WUFBSWxHOzs7a0NBa0JXMGtDLFlBbEJYMWtDO1FBNU5KMmlDLGtCQTROQXo4QjtRQUZJODlCLGFBRUo5OUIsS0FrQmV3K0I7UUE5T2YvQixrQkE0TkF6OEI7WUFBSWxHOzs7bUNBcUJhNGtDLGNBckJiNWtDO1FBNU5KMmlDLGtCQTROQXo4QjtRQUZJODlCLGFBRUo5OUIsS0FxQmlCMCtCO1FBalBqQmpDLGtCQTROQXo4QjtZQUFJbEc7Ozs7UUE1TkoyaUMsa0JBNE5BejhCO1lBQUlsRzs7OztRQTVOSjJpQyxrQkE0TkF6OEI7WUFBSWxHOzs7O1FBNU5KMmlDLGtCQTROQXo4QjtZQUFJbEc7Ozs7UUE1TkoyaUMsa0JBNE5BejhCO1lBQUlsRzs7OztRQTVOSjJpQyxrQkE0TkF6OEI7WUFBSWxHOzs7O0dBeUJjO1lBSWRrbEM7Z0JBR1c7UUFDSDFqQztlQUpSMGpDLG9CQUlRMWpDO0dBQThCO1lBa0gxQzJqQyxjQUFjNUQ7SUFDTixJQWhIR3I3QixNQXBSWGs4QjthQXFSTWdELFFBRUo3RCxLQUFJNkI7S0FBWSxJQUFoQmlDLGFBQUlDOztLQUFZO2dCQUFoQkQsb0JBcUdpQjthQXJHakJBOzs7U0F6UUYzQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0F6UU41QyxnQkFzUVd4OEI7YUFHVG0vQixjQUFJQzs7O2FBQUpub0M7U0F6UUZ1bEMsZ0JBc1FXeDhCO1NBeEpYaTlCLG9CQXdKV2o5QixLQUdMby9CO1NBelFONUMsZ0JBc1FXeDhCO2FBR1RtL0IsZ0JBQUlDOzs7YUFBSmxvQyxtQkFDUXNCLE1BRFIybUM7U0F6UUYzQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0EvSU5oQyxlQTRJV3A5QixLQUlEeEg7U0ExUVZna0MsZ0JBc1FXeDhCO2FBR1RtL0IsZ0JBQUlDOzs7YUFBSmpvQyxtQkFLYXNCLFFBTGIwbUM7U0F6UUYzQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0EvSU5oQyxlQTRJV3A5QixLQVFJdkg7U0E5UWYrakMsZ0JBc1FXeDhCO2FBR1RtL0IsZ0JBQUlDOzs7O1VBQUpob0M7VUFoSG9Dc0IsT0FnSHBDeW1DO1VBaEhnQ3htQyxRQWdIaEN3bUM7VUFoSDBCdm1DLFFBZ0gxQnVtQztTQXpRRjNDLGdCQXNRV3g4QjtTQXhKWGk5QixvQkF3SldqOUIsS0FHTG8vQjtTQXhITjdCLGtCQXFIV3Y5QixLQTdHaUJwSDtTQS9CNUJ3a0MsZUE0SVdwOUIsS0E3R3VCckg7U0FwQmxDMmtDLGlCQWlJV3Q5QixLQTdHMkJ0SDtTQXpKdEM4akMsZ0JBc1FXeDhCLEtBblBYNDhCLGNBc0k0QmhrQzthQWdIMUJ1bUMsZ0JBQUlDOzs7O1VBQUovbkM7VUFhbUJ3QixTQWJuQnNtQztVQWFjcm1DLFFBYmRxbUM7VUFhT3BtQyxVQWJQb21DO1NBdkdGM0Isa0JBb0dXeDlCLEtBR0xvL0IsWUFhR3JtQyxTQUFPRCxPQUFLRDthQWJuQnNtQyxnQkFBSUM7Ozs7VUFBSjluQztVQWdCdUIwQixTQWhCdkJtbUM7VUFnQmtCbG1DLFFBaEJsQmttQztVQWdCV2ptQyxVQWhCWGltQztTQXZHRjNCLGtCQW9HV3g5QixLQUdMby9CLFlBZ0JPbG1DLFNBQU9ELE9BQUtEO2FBaEJ2Qm1tQyxnQkFBSUM7Ozs7VUFBSjduQztVQW1CbUI0QixTQW5CbkJnbUM7VUFtQmMvbEMsUUFuQmQrbEM7VUFtQk85bEMsVUFuQlA4bEM7U0F2R0YzQixrQkFvR1d4OUIsS0FHTG8vQixZQW1CRy9sQyxTQUFPRCxPQUFLRDthQW5CbkJnbUMsZ0JBQUlDOzs7O1VBQUo1bkM7VUFoRnNDOEIsU0FnRnRDNmxDO1VBaEZrQzVsQyxRQWdGbEM0bEM7VUFoRjRCM2xDLFFBZ0Y1QjJsQztTQXpRRjNDLGdCQXNRV3g4QjtTQXhKWGk5QixvQkF3SldqOUIsS0FHTG8vQjtTQTNGTjNCLGtCQXdGV3o5QixLQTdFbUJ4RztTQS9EOUI0akMsZUE0SVdwOUIsS0E3RXlCekc7U0FwRHBDK2pDLGlCQWlJV3Q5QixLQTdFNkIxRztTQXpMeENrakMsZ0JBc1FXeDhCLEtBNU9YNjhCLGlCQStKOEJyakM7YUFnRjVCMmxDLGdCQUFJQzs7O2FBQUoxbkMsbUJBZ0NNK0IsUUFoQ04wbEM7U0F6UUYzQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0EvSU5oQyxlQTRJV3A5QixLQW1DSHZHO1NBelNSK2lDLGdCQXNRV3g4QjthQUdUbS9CLGdCQUFJQzs7O2FBQUp4bkM7U0FuUUY2a0Msa0JBZ1FXejhCO2FBR1RtL0I7OztpQ0F1RGdCemxDLE1BdkRoQnlsQztTQWxERnRCLHNCQStDVzc5QixLQTBET3RHO2FBdkRoQnlsQzs7O2lDQTBEY3hsQyxNQTFEZHdsQztTQXZERnZCLG9CQW9EVzU5QixLQTZES3JHO2FBMURkd2xDOzs7aUNBOERxQnZsQyxRQTlEckJ1bEMsVUE4RFlqRSxVQTlEWmlFO1NBelFGM0MsZ0JBc1FXeDhCO1NBeEpYaTlCLG9CQXdKV2o5QixLQUdMby9CO1NBdEpOakMsZUFtSlduOUIsS0FpRUdrN0I7U0F2VWRzQixnQkFzUVd4OEI7U0F0Q1A4OUIsYUFzQ085OUIsS0FpRVlwRztTQXZVdkI0aUMsZ0JBc1FXeDhCO1NBdFFYdzhCLGdCQXNRV3g4QjthQUdUbS9CLGlCQUFJQzs7O2FBQUpwbkMsb0JBbUV1QjhCLFVBbkV2QnFsQyxVQW1FYzdELFlBbkVkNkQ7U0F6UUYzQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0F0Sk5qQyxlQW1KV245QixLQXNFS3M3QjtTQTVVaEJrQixnQkFzUVd4OEI7U0F0Q1A4OUIsYUFzQ085OUIsS0FzRWNsRztTQTVVekIwaUMsZ0JBc1FXeDhCO1NBdFFYdzhCLGdCQXNRV3g4QjthQUdUbS9CLGlCQUFJQzs7O2FBQUpwbEM7U0F6UUZ3aUMsZ0JBc1FXeDhCO1NBeEpYaTlCLG9CQXdKV2o5QixLQUdMby9CO1NBelFONUMsZ0JBc1FXeDhCO2FBR1RtL0IsaUJBQUlDOzs7YUFBSm5sQztTQXpRRnVpQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0F6UU41QyxnQkFzUVd4OEI7YUFHVG0vQixpQkFBSUM7OzthQUFKbGxDLG9CQXlGZ0JDLGFBekZoQmdsQztTQWxERnRCLHNCQStDVzc5QixLQW5FWDA5Qix5QkErSmtCdmpDO2FBekZoQmdsQzs7O2FBNEY0Qi9rQyxVQTVGNUIra0MsVUE0RmdCOWtDLGFBNUZoQjhrQztTQTZGQSxTQURnQjlrQztjQUVPc2pDLFFBRlB0akM7VUEvVmxCb2lDLGtCQWdRV3o4QjtVQWhRWHk4QixrQkFnUVd6OEIsS0FpR2MyOUI7OztjQUVBMEIsUUFKUGhsQztVQS9WbEJvaUMsa0JBZ1FXejhCO1VBaFFYeThCLGtCQWdRV3o4QixLQW1HY3EvQjs7YUFoR3ZCRixRQTRGNEIva0M7OzthQTVGNUJFO1NBelFGa2lDLGdCQXNRV3g4QjtTQXhKWGk5QixvQkF3SldqOUIsS0FHTG8vQjtTQXpRTjVDLGdCQXNRV3g4QjthQUdUbS9CLGlCQUFJQzs7O2FBQUo3a0Msb0JBOU5rQkMsV0E4TmxCMmtDLFVBeUVlMWtDLFlBekVmMGtDO1NBelFGM0MsZ0JBc1FXeDhCO1NBeEpYaTlCLG9CQXdKV2o5QixLQUdMby9CO1NBdEpOakMsZUFtSlduOUIsS0E0RU12Rjs7VUExUGY4RjtxQkFBV1AsS0FBSTlDO2FBQVUsSUFHekJjLElBSHlCLHVCQUFWZDsyQkFHZmM7d0JBM0ZGdytCLGdCQXdGYXg4QixVQXhGYnc4QixnQkF3RmF4OEI7OzJCQUdYaEM7MEJBM0ZGdytCLGdCQXdGYXg4QixVQXhGYnc4QixnQkF3RmF4OEI7eUJBeEZidzhCLGdCQXdGYXg4QixLQUdYaEM7WUFBNkI7U0EzRi9CdytCLGdCQXNRV3g4QjtTQXZLUjtVQWZRd0o7WUFoVFh3eEIsZUEyUW9CeGdDO2dCQTNDcEJnaUMsZ0JBc1FXeDhCLFVBL2VYODZCLGFBb1JvQnRnQzs7VUFFaEI4a0M7cUJBbUNPOTFCO3NCQW5DUCsxQixTQUFTdmhDO2NBQ1g7ZUFBWXdoQyxRQUFnQywyQkFEakN4aEM7ZUFDUHloQyxTQUFzQiwyQkFEZnpoQztlQUVYLE9BL1FGZzlCLGVBZ1RXeHhCLEtBbkNFeEw7Y0FFWDtlQUNRO3VCQWhSVmc5QixlQWdUV3h4QixLQWxDTGkyQjtnQkFFSSxjQWhSVnpFLGVBZ1RXeHhCLEtBbENHZzJCOzs7O2NBRXlCO2FBQXlCO29CQUg1REQ7O2dDQW1DTy8xQjtTQS9CUixHQUpDKzFCLGNBN0NKL0MsZ0JBc1FXeDhCO2FBOU1POUM7O1NBSGxCO2FBR2tCQTtXQUZiLEtBdFJMODlCLGVBZ1RXeHhCLEtBMUJhLHVCQUVOdE0sS0FEWCxJQUhTQyxNQUlFRCxlQUpGQztXQUtWLHNDQURZRDs7Z0NBZ0NoQnFELFdBOEtTUDs7O2FBM01JLElBUEN5Z0IsTUFJRXZqQixlQUpGdWpCOzs7Ozs7WUFRVCxJQUNZNUUsTUFMRDNlO1lBTWYsS0E5Ukg4OUIsZUFnVFd4eEIsS0FsQlcsdUJBREhxUzthQTJCakJ0YixXQThLU1AsS0F6TVE2YjthQWdCakIsSUF6QmMyRCxNQVNHM0QsYUFMRDNlLElBSkZzaUI7OztZQVdSO2lEQUZXM0Q7Ozs7Y0EyQmpCdGIsV0E4S1NQO2NBOUtUTyxXQThLU1A7Ozs7OzttQkF0ZVhnN0IsZUFnVFd4eEIsS0FiZ0MsdUJBTnhCcVM7YUEyQmpCdGIsV0E4S1NQLEtBek1RNmI7YUFPZixJQWhCWXlELE1BU0d6RCxhQUxEM2UsSUFKRm9pQjs7OzthQWtCRCxLQXRTZjBiLGVBZ1RXeHhCLEtBVndCLHVCQVRoQnFTO2NBMkJqQnRiLFdBOEtTUCxLQXpNUTZiO2NBMkJqQnRiLFdBOEtTUCxLQXpNUTZiO2NBV2YsSUFwQll1RCxNQVNHdkQsYUFMRDNlLElBSkZraUI7OzthQXVCWixJQUthNVIsSUFuQkVxTyxhQW1CSjhFLE1BbkJJOUUsYUFtQkZzSTthQUNqQjtjQUFrQjt3QkFEREE7bUJBaFRqQjZXLGVBZ1RXeHhCLEtBQzJCLHVCQURyQjJhLE9BT2YsSUFQZXViO2NBUWZuL0IsV0E4S1NQLEtBdExJMmdCO2NBUWJwZ0IsV0E4S1NQO2NBOUtUTyxXQThLU1AsS0F0TE1ta0I7NEJBS0MsSUFqQ0ZwRSxNQTRCQ29FLGFBeEJDam5CLElBSkY2aUI7Ozs7OztVQURiLEdBTkN3ZixjQTdDSi9DLGdCQXNRV3g4QjtVQXRRWHc4QixnQkFzUVd4OEI7Y0FHVG0vQixpQkFBSUM7Ozs7YUFBSjFrQyxvQkF0T2NDLFVBc09kd2tDO1NBelFGM0MsZ0JBc1FXeDhCO1NBeEpYaTlCLG9CQXdKV2o5QixLQUdMby9CO2dCQXRPVXprQzs7Ozs7OztTQW5DaEI2aEMsZ0JBc1FXeDhCO2FBR1RtL0IsaUJBQUlDOzs7YUFBSnhrQztTQXpRRjRoQyxnQkFzUVd4OEI7U0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7U0FsRE52QixzQkErQ1c3OUI7YUFHVG0vQixpQkFBSUM7Ozs7VUFxRmdCdmtDLFVBckZwQnNrQztVQXFGZXJrQyxNQXJGZnFrQztrQkE5Y0YvRCwrQkFtaUJpQnRnQyxLQUFLRDtVQXJGcEJza0M7VUFBSUM7OztTQTJDVTtVQURJcmtDLFVBMUNsQm9rQztVQTBDUWxrQyxRQTFDUmtrQztVQTJDYyxPQXJEWkgsb0JBb0RNL2pDOzs7Y0FDUmdsQjs7V0FwVEZ1YyxnQkFzUVd4OEI7V0F4SlhpOUIsb0JBd0pXajlCLEtBR0xvL0I7V0F6UU41QyxnQkFzUVd4OEI7V0FnRFAsV0FGRmlnQjs7Ozs7YUEzQ0FrZixRQTBDa0Jwa0MsU0ExQ2Rxa0M7Ozs7SUFxR2U7SUF2R2ZGLFFBOEdRN0Q7SUFFaEIsT0ExV0VzQixnQkF5UFczOEI7R0FrSE07WUFXYjQvQjtrQ0F1Qlk7OztXQWpCUjVvQyxpQkFBUSxXQU5aNG9DLEtBTUk1b0M7O1dBT0VDLG1CQUFRLFdBYmQyb0MsS0FhTTNvQzs7V0FOSEMsbUJBQVEsV0FQWDBvQyxLQU9HMW9DOztXQUNFQyxtQkFBUSxXQVJieW9DLEtBUUt6b0M7O1dBRUlDLG1CQUFRLFdBVmpCd29DLEtBVVN4b0M7O1dBREpDLG1CQUFRLFdBVGJ1b0MsS0FTS3ZvQzs7V0FFQUMsbUJBQVEsV0FYYnNvQyxLQVdLdG9DOztXQUNEQyxtQkFBUSxXQVpacW9DLEtBWUlyb0M7O1dBT1dDLG1CQUFKQyxlQUNmLFdBRGVBLElBbkJYbW9DLEtBbUJlcG9DOztXQUVRRSxtQkFBTFUsZ0JBQUxUO09BQ2pCLFdBRHNCUyxLQUFMVCxLQXJCYmlvQyxLQXFCdUJsb0M7O1dBTmxCRSxtQkFBUSxZQWZiZ29DLEtBZUtob0M7O1dBREFDLG9CQUFRLFlBZGIrbkMsS0FjSy9uQzs7V0FFRkMsb0JBQVEsWUFoQlg4bkMsS0FnQkc5bkM7O1dBQ0dDLG9CQUFRLFlBakJkNm5DLEtBaUJNN25DO21CQUNRQyxvQkFBUSxZQWxCdEI0bkMsS0FrQmM1bkM7O0dBS1U7WUFFeEI2bkM7Ozs7UUFjaUI7U0FEYjdvQztTQUNhLFFBZGpCNm9DLGNBYUk3b0M7U0FDUThvQztTQUFKQztTQUFKQztTQUFKQztnQ0FFb0IsV0FGaEJELFFBRTJCLFNBQUk7UUFEdkM7Z0NBQXdCLFdBRHBCQyxRQUMrQixTQUFJOztnQkFEM0JGO2dCQUFJRDs7UUFLSztTQURYN29DO1NBQ1csVUFuQmpCNG9DLGNBa0JNNW9DO1NBQ01pcEM7U0FBSkM7U0FBSkM7U0FBSkM7Z0NBRW9CLFdBRmhCRCxVQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsVUFDK0IsU0FBSTs7Z0JBRDNCRjtnQkFBSUQ7O1FBS0s7U0FEZGhwQztTQUNjLFVBeEJqQjJvQyxjQXVCRzNvQztTQUNTb3BDO1NBQUpDO1NBQUpDO1NBQUpDO2dDQUVvQixXQUZoQkQsVUFFMkIsU0FBSTtRQUR2QztnQ0FBd0IsV0FEcEJDLFVBQytCLFNBQUk7O2dCQUQzQkY7Z0JBQUlEOztRQUtLO1NBRFpucEM7U0FDWSxVQTdCakIwb0MsY0E0Qksxb0M7U0FDT3VwQztTQUFKQztTQUFKQztTQUFKQztnQ0FFb0IsV0FGaEJELFVBRTJCLFNBQUk7UUFEdkM7Z0NBQXdCLFdBRHBCQyxVQUMrQixTQUFJOztnQkFEM0JGO2dCQUFJRDs7UUFVSztTQURSdHBDO1NBQ1EsVUF2Q2pCeW9DLGNBc0NTem9DO1NBQ0cwcEM7U0FBSkM7U0FBSkM7U0FBSkM7Z0NBRW9CLFdBRmhCRCxVQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsVUFDK0IsU0FBSTs7Z0JBRDNCRjtnQkFBSUQ7O1FBTEs7U0FEWnpwQztTQUNZLFVBbENqQndvQyxjQWlDS3hvQztTQUNPNnBDO1NBQUpDO1NBQUpDO1NBQUpDO2dDQUVvQixXQUZoQkQsVUFFMkIsU0FBSTtRQUR2QztnQ0FBd0IsV0FEcEJDLFVBQytCLFNBQUk7O2dCQUQzQkY7Z0JBQUlEOztRQVVLO1NBRFo1cEM7U0FDWSxVQTVDakJ1b0MsY0EyQ0t2b0M7U0FDT2dxQztTQUFKQztTQUFKQztTQUFKQztnQ0FFb0IsV0FGaEJELFVBRTJCLFNBQUk7UUFEdkM7Z0NBQXdCLFdBRHBCQyxVQUMrQixTQUFJOztnQkFEM0JGO2dCQUFJRDs7UUFLSztTQURiL3BDO1NBQ2EsVUFqRGpCc29DLGNBZ0RJdG9DO1NBQ1FtcUM7U0FBSkM7U0FBSkM7U0FBSkM7Z0NBRW9CLFdBRmhCRCxVQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsVUFDK0IsU0FBSTs7Z0JBRDNCRjtnQkFBSUQ7O1FBaUNLO1NBRERscUM7U0FDQyxVQWxGakJxb0MsY0FpRmdCcm9DO1NBQ0pzcUM7U0FBSkM7U0FBSkM7U0FBSkM7Z0NBRW9CLFdBRmhCRCxVQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsVUFDK0IsU0FBSTs7Z0JBRDNCRjtnQkFBSUQ7O1FBS0s7U0FETXBxQztTQUFMVTtTQUFMVDtTQUNJLFVBdkZqQmtvQyxjQXNGdUJub0M7U0FDWHdxQztTQUFKQztTQUFKQztTQUFKQztTQUNBNXFDLEtBc0JKNnFDLE1BdklJMUMsS0ErR2Fqb0MsTUFBS1M7U0FHRCxVQXpGakJ5bkMsY0F3RkFwb0M7U0FDWThxQztTQUFKQztTQUFKQztTQUFKQzs7MkJBSW9CLFdBSlJILFFBSThCLFdBTjlCTCxVQU15QyxTQUFJOzsyQkFEckMsV0FMWkMsVUFLa0MsV0FIbENLLFFBRzZDLFNBQUk7OzJCQURyQyxXQUZoQkMsUUFFc0MsV0FKdENMLFVBSWlELFNBQUk7UUFEN0Q7O2lCQUF3QixXQUhwQkM7aUJBRzBDLFdBRDFDSztpQkFDcUQ7Z0JBQUk7Ozs7O1FBOUJ4QztTQURaOXFDO1NBQ1ksV0E1RGpCaW9DLGNBMkRLam9DO1NBQ08rcUM7U0FBSkM7U0FBSkM7U0FBSkM7Z0NBRW9CLFdBRmhCRCxVQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsVUFDK0IsU0FBSTs7Z0JBRDNCRjtnQkFBSUQ7O1FBTEs7U0FEWjlxQztTQUNZLFdBdkRqQmdvQyxjQXNES2hvQztTQUNPa3JDO1NBQUpDO1NBQUpDO1NBQUpDO2dDQUVvQixXQUZoQkQsV0FFMkIsU0FBSTtRQUR2QztnQ0FBd0IsV0FEcEJDLFdBQytCLFNBQUk7O2dCQUQzQkY7Z0JBQUlEOztRQVVLO1NBRGRqckM7U0FDYyxXQWpFakIrbkMsY0FnRUcvbkM7U0FDU3FyQztTQUFKQztTQUFKQztTQUFKQztnQ0FFb0IsV0FGaEJELFdBRTJCLFNBQUk7UUFEdkM7Z0NBQXdCLFdBRHBCQyxXQUMrQixTQUFJOztnQkFEM0JGO2dCQUFJRDs7UUFLSztTQURYcHJDO1NBQ1csV0F0RWpCOG5DLGNBcUVNOW5DO1NBQ013ckM7U0FBSkM7U0FBSkM7U0FBSkM7U0FDSix1QkFHd0IsV0FKUkgsV0FJbUIsU0FBSTtnQ0FEZixXQUhaQyxXQUd1QixTQUFJO2dDQURmLFdBRmhCQyxXQUUyQixTQUFJO1FBRHZDO2dDQUF3QixXQURwQkMsV0FDK0IsU0FBSTs7Ozs7UUFLbEI7U0FESDFyQztTQUNHLFdBNUVqQjZuQyxjQTJFYzduQztTQUNGMnJDO1NBQUpDO1NBQUpDO1NBQUpDO1NBQ0osdUJBR3dCLFdBSlJILFdBSW1CLFNBQUk7Z0NBRGYsV0FIWkMsV0FHdUIsU0FBSTtnQ0FEZixXQUZoQkMsV0FFMkIsU0FBSTtRQUR2QztnQ0FBd0IsV0FEcEJDLFdBQytCLFNBQUk7Ozs7O0lBcEV2QyxxQkFHYSxTQUFJO3lCQURKLFNBQUk7eUJBREosU0FBSTtJQURqQiwyQkFBYSxTQUFJO0dBb0Y2QztZQWlCOUR4QixNQVdFM3FDLEtBQUlTO0lBQU87Y0FBWFQ7ZUFBSVMsa0JBOEN3QjtZQTlDeEJBOzs7Ozs7Ozs7Ozs7Ozs7UUErQ2E7Ozs7WUEvQ2pCVDs7WUFDTW9zQyxRQUROcHNDO2tCQUFJUzs7Ozs7Z0JBQ2lCNHJDLFFBRGpCNXJDLFFBQzBCLFdBWmhDa3FDLE1BWVF5QixPQUFlQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUNiQyxVQUZSdHNDO2tCQUFJUzs7Ozs7Z0JBRXFCOHJDLFVBRnJCOXJDLFFBRThCLFdBYnBDa3FDLE1BYVUyQixTQUFpQkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFFcEJDLFVBSkx4c0M7a0JBQUlTOzs7OztnQkFJZWdzQyxVQUpmaHNDLFFBSXdCLFdBZjlCa3FDLE1BZU82QixTQUFjQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUNaQyxVQUxQMXNDO2tCQUFJUzs7Ozs7Z0JBS21Ca3NDLFVBTG5CbHNDLFFBSzRCLFdBaEJsQ2txQyxNQWdCUytCLFNBQWdCQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUVaQyxVQVBYNXNDO2tCQUFJUzs7Ozs7Z0JBTzJCb3NDLFVBUDNCcHNDLFFBT29DLFdBbEIxQ2txQyxNQWtCYWlDLFNBQW9CQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUR4QkMsVUFOUDlzQztrQkFBSVM7Ozs7O2dCQU1tQnNzQyxVQU5uQnRzQyxRQU00QixXQWpCbENrcUMsTUFpQlNtQyxTQUFnQkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFFaEJDLFVBUlBodEM7a0JBQUlTOzs7OztnQkFRbUJ3c0MsVUFSbkJ4c0MsUUFRNEIsV0FuQmxDa3FDLE1BbUJTcUMsU0FBZ0JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBTGpCQyxVQUhObHRDO2tCQUFJUzs7Ozs7Z0JBR2lCMHNDLFVBSGpCMXNDLFFBRzBCLFdBZGhDa3FDLE1BY1F1QyxTQUFlQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQTRCSEMsVUEvQmxCcHRDLFFBK0JhcXRDLFFBL0JicnRDO2tCQUFJUzs7Ozs7WUFnQ3dCO2FBRGtCNnNDLFVBL0IxQzdzQzthQStCcUM4c0MsUUEvQnJDOXNDO2FBZ0N3QixPQTNDOUJrcUMsTUEwQ29CeUMsU0FBNEJFO1lBQ2hELFdBM0NBM0MsTUEwQ2UwQyxPQUE0QkU7Ozs7Ozs7Ozs7Ozs7U0FFckI7OztZQUdPQyxVQXBDM0J4dEMsUUFvQ3FCeXRDLE9BcENyQnp0QyxRQW9DZTB0QyxPQXBDZjF0QztrQkFBSVM7Ozs7Ozs7WUFzQ0c7YUFEb0JrdEMsVUFyQ3ZCbHRDO2FBcUNpQm10QyxPQXJDakJudEM7YUFxQ1dvdEMsT0FyQ1hwdEM7YUFzQ0ZYLEtBakRKNnFDLE1BdklJMUMsS0FzTG1Cd0YsT0FDTkk7YUFFRSxRQWhLZjNGLGNBK0pBcG9DO2FBQ1VndUM7YUFBUEM7WUFDSSxXQURKQTtZQUVJLFdBRkdEO1lBR2QsV0FOaUJKLE1BQ01FLE1BaER2QmpELE1BK0M2QjZDLFNBQ0FHOzs7Ozs7Ozs7Ozs7O1NBTUw7OztZQWpDZkssVUFWUGh1QztrQkFBSVM7YUFVbUJ3dEMsVUFWbkJ4dEM7U0FVNEIsWUFyQmxDa3FDLE1BcUJTcUQsU0FBZ0JDOztRQUNSOztZQUdSQyxXQWRQbHVDO2tCQUFJUzs7Ozs7O2dCQWNtQjB0QyxXQWRuQjF0QyxRQWM0QixZQXpCbENrcUMsTUF5QlN1RCxVQUFnQkM7Ozs7U0FDUjs7O1lBR1ZDLFdBbEJMcHVDO2tCQUFJUzs7Ozs7Ozs7Z0JBa0JlNHRDLFdBbEJmNXRDLFFBa0J3QixZQTdCOUJrcUMsTUE2Qk95RCxVQUFjQzs7OztTQUNOOzs7WUFHTEMsV0F0QlJ0dUM7a0JBQUlTOzs7Ozs7Ozs7O2dCQXNCcUI4dEMsV0F0QnJCOXRDLFFBc0I4QixZQWpDcENrcUMsTUFpQ1UyRCxVQUFpQkM7Ozs7U0FDVDs7O1lBR0FDLFdBMUJoQnh1QztrQkFBSVM7Ozs7Ozs7Ozs7OztnQkEwQnFDZ3VDLFdBMUJyQ2h1QyxRQTJCTixZQXRDQWtxQyxNQXFDa0I2RCxVQUF5QkM7Ozs7U0FFakI7Ozs7T0FoQlQ7O09BSUE7O09BSUY7O09BSUc7O09BS1E7O09BS0o7O09BVUU7ZUFJTDs7R0FBWTtZQW1HL0JDLHVCQUVFN3RDLEtBQUlvQjtJQUFTLGNBQWJwQixtQkFBSW9CLGNBQUpwQixTQUFJb0I7R0FHeUI7WUFyQy9CMHNDLGdCQUdBcnJDLE9BQU1yQjtJQUFTLEtBQWZxQixPQUNlLE9BRFRyQjtRQUVNMnNDLFVBRlp0ckM7SUFFcUIsWUFMckJxckMsZ0JBS1lDLFNBRk4zc0M7R0FFbUQ7WUE5RHpENHNDLGFBRUE1c0M7SUFBUyxJQUFURTtJQUFTO2VBQVRBLHNCQXFEOEI7WUFyRDlCQTs7WUEyQks5QyxPQTNCTDhDLFlBMkI4QixXQTdCOUIwc0MsYUE2Qkt4dkM7O1lBQ0tDLFNBNUJWNkMsWUE0QjhCLFdBOUI5QjBzQyxhQThCVXZ2Qzs7WUEzQkdDLFNBRGI0QyxZQUNRdEIsTUFEUnNCO1FBRTJCLE9BcUYzQnVzQyx1QkF0RlE3dEMsU0FIUmd1QyxhQUdhdHZDOztZQUVLQyxTQUhsQjJDLFlBR2FyQixRQUhicUI7UUFJMkIsT0FtRjNCdXNDLHVCQXBGYTV0QyxXQUxiK3RDLGFBS2tCcnZDOztRQUlKO1NBREtDLFNBTm5CMEM7U0FNYXBCLE9BTmJvQjtTQU1RbkIsUUFOUm1CO1NBT0kyc0MsVUFUSkQsYUFRbUJwdkM7U0FFZnN2QyxVQXVGSkMseUJBekZhanVDLFVBQ1QrdEM7UUFFSixPQThFQUosdUJBakZRMXRDLE9BRUordEM7O1FBR1U7U0FET3J2QyxTQVZyQnlDO1NBVWVqQixTQVZmaUI7U0FVVWhCLFFBVlZnQjtTQVdJOHNDLFlBYkpKLGFBWXFCbnZDO1NBRWpCd3ZDLFlBbUZKRix5QkFyRmU5dEMsWUFDWCt0QztRQUVKLE9BMEVBUCx1QkE3RVV2dEMsT0FFTit0Qzs7UUFHVTtTQURXdnZDLFNBZHpCd0M7U0FjbUJkLFNBZG5CYztTQWNjYixRQWRkYTtTQWVJZ3RDLFlBakJKTixhQWdCeUJsdkM7U0FFckJ5dkMsWUErRUpKLHlCQWpGbUIzdEMsWUFDZjh0QztRQUVKLE9Bc0VBVCx1QkF6RWNwdEMsT0FFVjh0Qzs7UUFHVTtTQURPeHZDLFNBbEJyQnVDO1NBa0JlWCxTQWxCZlc7U0FrQlVWLFFBbEJWVTtTQW1CSWt0QyxZQXJCSlIsYUFvQnFCanZDO1NBRWpCMHZDLFlBMkVKTix5QkE3RWV4dEMsWUFDWDZ0QztRQUVKLE9Ba0VBWCx1QkFyRVVqdEMsT0FFTjZ0Qzs7UUFHVTtTQURPenZDLFNBdEJyQnNDO1NBc0JlUixTQXRCZlE7U0FzQlVQLFFBdEJWTztTQXVCSW90QyxZQXpCSlYsYUF3QnFCaHZDO1NBRWpCMnZDLFlBdUVKUix5QkF6RWVydEMsWUFDWDR0QztRQUVKLE9BOERBYix1QkFqRVU5c0MsT0FFTjR0Qzs7WUFLT3p2QyxTQTdCWG9DLFlBNkJNTCxRQTdCTks7UUE4QjZCLE9BeUQ3QnVzQyx1QkExRE01c0MsV0EvQk4rc0MsYUErQlc5dUM7O1lBN0JYcW1DOzs7Ozs7WUFvQ21Cbm1DLFNBcENuQmtDLFlBb0NlckMsS0FwQ2ZxQztRQXFDQSxXQURlckMsSUF0Q2YrdUMsYUFzQ21CNXVDOztZQUVFQyxVQXRDckJpQyxZQXNDaUJzdEMsT0F0Q2pCdHRDO1FBdUNBLFdBRGlCc3RDLFlBeENqQlosYUF3Q3FCM3VDOztZQVBmQyxVQS9CTmdDLFlBK0I4QixZQWpDOUIwc0MsYUFpQ00xdUM7O1lBQ0FDLFVBaENOK0IsWUFnQzhCLFlBbEM5QjBzQyxhQWtDTXp1Qzs7WUFoQ05tbUM7O1FBbURrRDtTQUR0QmxtQyxVQWxENUI4QjtTQVBBdXRDLGlCQU9BdnRDO1NBbURrRCxPQXJEbEQwc0MsYUFvRDRCeHVDO2lCQXpENUJxdkM7YUFDa0JoTSxNQURsQmdNLDZCQUtBYixhQUprQm5MOzthQUNBOEQsUUFGbEJrSSw2QkFLQWIsYUFIa0JySDtRQXdEZ0M7O1lBakIzQ25sQyxVQWxDUEYsWUFrQzhCLFlBcEM5QjBzQyxhQW9DT3hzQzs7WUFXY0MsVUE3Q3JCSCxZQTZDOEIsV0EvQzlCMHNDLGFBK0NxQnZzQzs7WUFDQUMsVUE5Q3JCSixZQThDOEIsV0FoRDlCMHNDLGFBZ0RxQnRzQzs7WUFDTkUsVUEvQ2ZOLFlBK0M4QixXQWpEOUIwc0MsYUFpRGVwc0M7O1lBL0NmK2pDLHNCQW9FQXJqQyxNQXBFQWhCO2tCQW9FQWdCOzs7Z0JBcEVBaEI7Ozs7WUFpRm1DLFlBbkZuQzBzQyxhQUVBckk7OztlQW9FQXJqQzs7ZUFwRUFoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBZ0ZzRCxJQUE3QnNrQyxVQVp6QnRqQyxRQVlzRCxPQWxGdEQwckMsYUFFQXJJO1dBZ0ZzRCwrQ0FBN0JDOztlQWhGekJ0a0M7Ozs7WUFpQ2tCUSxVQWpDbEJSLFlBaUNRbUIsUUFqQ1JuQjtRQWlDb0QsT0FzQnBEd3NDLGdCQXRCUXJyQyxPQW5DUnVyQyxhQW1Da0Jsc0M7OztHQW9Cd0I7WUEwQzFDcXNDLHlCQUVFanVDLE1BQUtrQjtJQUFTLGNBQWRsQiwrQkFBS2tCO0dBRzBCO0dBTXJDOzs7WUFLSTB0QyxhQUdBOXVDLEtBQUlvQjtJQUFTLFVBQWJwQixrQkFDaUIsY0FEYm9CO2FBQUpwQjtTQUVvQit1QyxJQUZwQi91QyxRQUVhd2tDLFFBRmJ4a0M7S0FFNkIsZUFBaEJ3a0MsT0FBT3VLLElBRmhCM3RDOzs7U0FHc0I1QyxPQUh0QjRDLFVBR1F5akMsVUFIWjdrQztLQUdrQyxlQUF0QjZrQyxVQUFjcm1DOztJQUNyQjtHQUFtQjtZQUt4Qnd3QyxhQUdBaHZDLEtBQUlFLE1BQUtrQjtJQUFxQixZQWY5QjB0QyxhQWVBOXVDLEtBQVNvQjtjQUFMbEI7U0FHcUN4QixtQkFBTDRCLGtCQUF0QjRULElBSFZoVTtLQUlKLFdBRG9DSSxXQUF0QjRULElBQTJCeFY7O1NBSHJDd0I7U0FDa0N6QixtQkFBTDBCO0tBQ2pDLFdBRGlDQSxVQUFLMUI7Ozs7U0FJUUQsbUJBQVp5QjtLQUNsQyxXQURrQ0EsVUFBWXpCOztJQUVmO0dBQW1CO1lBTTlDeXdDLFlBTUZwTSxLQUFJemhDO0lBQWUsV0FJckI4dEMsZ0JBSkVyTSxLQUFJemhDOztLQUVEO1FBRFV1bEM7SUFBdUIsT0FBdkJBO0dBQ1M7WUFrTHhCd0ksdUJBS0U3c0MsS0FBSXVnQyxLQUFJemhDO0lBQ1o7S0FBbUMsUUF0TGpDOHRDLGdCQXFMTXJNLEtBQUl6aEM7S0FDYUU7S0FBTnFsQztJQUNuQixnQkFGSXJrQyxLQUNlcWtDLFFBQU1ybEM7R0FDd0I7WUF2TC9DNHRDLGdCQU1Fck0sS0E0SU11TTtJQTVJTyxVQUFidk0sa0JBbUgyQixjQXlCckJ1TTtXQTVJTnZNOztpQkE0SU11TTtRQTFJMkI7U0FEWkMsYUEySWZEO1NBM0lIRSxXQURIek07U0FFaUMsUUFSbkNxTSxnQkFPS0ksVUFBa0JEO1NBQ0VqdUM7U0FBTnVsQztRQUNuQixlQURtQkEsUUFBTXZsQzs7OztpQkEwSWpCZ3VDO1FBdkkyQjtTQURQRyxlQXdJcEJIO1NBeElFSSxhQUpSM007U0FLaUMsVUFYbkNxTSxnQkFVVU0sWUFBa0JEO1NBQ0hqdUM7U0FBTjZsQztRQUNuQixlQURtQkEsUUFBTTdsQzs7OztPQUduQjtRQURPbXVDLGFBUFg1TTtRQU9NN2lDLE1BUE42aUM7UUFRSSxVQXBETmlNLGFBbURROXVDLEtBcUlBb3ZDO1FBbklhbnZDOzs7UUFDZ0I7U0FERHl2QztTQUNDLFVBaEJyQ1IsZ0JBYWFPLFlBRXVCQztTQUNUbks7U0FBTm9LO1FBQ25CLGVBRm1CMXZDLE9BQ0EwdkMsUUFBTXBLOztPQUVHOztPQUd4QjtRQURZcUssYUFkaEIvTTtRQWNXMWlDLFFBZFgwaUM7UUFlSSxVQTNETmlNLGFBMERhM3VDLE9BOEhMaXZDO1FBNUhhOXVDOzs7UUFDZ0I7U0FERHV2QztTQUNDLFVBdkJyQ1gsZ0JBb0JrQlUsWUFFa0JDO1NBQ1RySztTQUFOc0s7UUFDbkIsZUFGbUJ4dkMsT0FDQXd2QyxRQUFNdEs7O09BRUc7O09BR3hCO1FBRGlCdUssYUFyQnJCbE47UUFxQmUzaUMsT0FyQmYyaUM7UUFxQlVwaUMsUUFyQlZvaUM7UUFxQkd6aUMsUUFyQkh5aUM7UUFzQkksVUF0RE5tTSxhQXFEWXZ1QyxPQUFLUCxNQXVIVGt2QztRQXJIYXh1Qzs7O1FBQ2dCO1NBREVvdkM7U0FBYjN2QztTQUNXLFVBOUJyQzZ1QyxnQkEyQnVCYSxZQUVnQkM7U0FDWnZLO1NBQU53SztRQUNuQixlQUpHN3ZDLE9BRWdCUSxPQUFLUCxRQUNMNHZDLFFBQU14Szs7T0FFTTs7T0FHM0I7UUFEbUJ5SyxhQTVCdkJyTjtRQTRCaUJyaUMsU0E1QmpCcWlDO1FBNEJZOWhDLFFBNUJaOGhDO1FBNEJLdGlDLFVBNUJMc2lDO1FBNkJJLFdBN0RObU0sYUE0RGNqdUMsT0FBS1AsUUFnSFg0dUM7UUE5R2FudUM7OztRQUNnQjtTQURJa3ZDO1NBQWZ4dkM7U0FDVyxXQXJDckN1dUMsZ0JBa0N5QmdCLFlBRWdCQztTQUNkeks7U0FBTjBLO1FBQ25CLGVBSks3dkMsU0FFY1UsT0FBS04sUUFDTHl2QyxRQUFNMUs7O09BRU07O09BRzNCO1FBRHVCMkssYUFuQzNCeE47UUFtQ3FCL2hDLFNBbkNyQitoQztRQW1DZ0J4aEMsUUFuQ2hCd2hDO1FBbUNTbmlDLFVBbkNUbWlDO1FBb0NJLFdBcEVObU0sYUFtRWtCM3RDLE9BQUtQLFFBeUdmc3VDO1FBdkdhN3RDOzs7UUFDZ0I7U0FEUSt1QztTQUFuQkM7U0FDVyxXQTVDckNyQixnQkF5QzZCbUIsWUFFZ0JDO1NBQ2xCM0s7U0FBTjZLO1FBQ25CLGVBSlM5dkMsU0FFVWEsT0FBS2d2QyxRQUNMQyxRQUFNN0s7O09BRU07O09BRzNCO1FBRG1COEssYUExQ3ZCNU47UUEwQ2lCNk4sU0ExQ2pCN047UUEwQ1k4TixRQTFDWjlOO1FBMENLaGlDLFVBMUNMZ2lDO1FBMkNJLFdBM0VObU0sYUEwRWMyQixPQUFLRCxRQWtHWHRCO1FBaEdhd0I7OztRQUNnQjtTQURJQztTQUFmQztTQUNXLFdBbkRyQzVCLGdCQWdEeUJ1QixZQUVnQkk7U0FDZGpMO1NBQU5tTDtRQUNuQixlQUpLbHdDLFNBRWMrdkMsUUFBS0UsUUFDTEMsUUFBTW5MOztPQUVNOztPQUczQjtRQURtQm9MLGFBakR2Qm5PO1FBaURpQm9PLFNBakRqQnBPO1FBaURZcU8sU0FqRFpyTztRQWlESzdoQyxRQWpETDZoQztRQWtESSxXQWxGTm1NLGFBaUZja0MsUUFBS0QsUUEyRlg3QjtRQXpGYStCOzs7UUFDZ0I7U0FESUM7U0FBZkM7U0FDVyxXQTFEckNuQyxnQkF1RHlCOEIsWUFFZ0JJO1NBQ2R2TDtTQUFOeUw7UUFDbkIsZUFKS3R3QyxPQUVjbXdDLFFBQUtFLFFBQ0xDLFFBQU16TDs7T0FFTTs7T0FHM0I7UUFESzBMLGFBeERUMU87UUF3REkyTyxTQXhESjNPO1FBeURJLFdBckdOaU0sYUFvR00wQyxRQW9GRXBDO1FBbEZhcUM7OztRQUNnQjtTQURIQztTQUNHLFdBakVyQ3hDLGdCQThEV3FDLFlBRXVCRztTQUNQNUw7U0FBTjZMO1FBQ25CLGVBRm1CRixRQUNBRSxRQUFNN0w7O09BRUc7O09BR0s7UUFEN0I4TCxhQS9ESi9PO1FBZ0VpQyxXQXRFbkNxTSxnQkFxRU0wQyxZQTZFRXhDO1FBNUVpQnJKO1FBQU44TDtPQUNuQixnQkFEbUJBLFNBQU05TDs7T0FJVTtRQURkK0wsY0FuRW5CalA7UUFtRWMzaEMsTUFuRWQyaEM7UUFvRWlDLFdBMUVuQ3FNLGdCQXlFcUI0QyxhQXlFYjFDO1FBeEVpQm5KO1FBQU44TDtPQUNuQixnQkFGZ0I3d0MsS0FDRzZ3QyxTQUFNOUw7O09BR1U7UUFEaEIrTCxjQXRFakJuUDtRQXNFWTFoQyxNQXRFWjBoQztRQXVFaUMsV0E3RW5DcU0sZ0JBNEVtQjhDLGFBc0VYNUM7UUFyRWlCako7UUFBTjhMO09BQ25CLGdCQUZjOXdDLEtBQ0s4d0MsU0FBTTlMOztpQkFxRWpCaUo7O1NBakVtQjhDLGVBaUVuQjlDO1NBakVPcEosWUFpRVBvSjtTQWxFd0IrQyxjQTFFOUJ0UDtTQTBFbUJxRCxjQTFFbkJyRDtTQTBFVUgsVUExRVZHO1FBNEVDLHFCQUZrQnFELGtCQUNORjtTQUNxQztRQUNqQjtvQkFuRm5Da0osZ0JBZ0ZnQ2lELGFBQ0xEO1NBRUY5TDtTQUFOZ007UUFDbkIsZ0JBSlkxUCxTQUNHc0QsV0FFSW9NLFNBQU1oTTs7OztpQkErRGpCZ0o7UUEzRDhCO1NBRElpRCxnQkE0RGxDakQ7U0E1RFNrRCxhQTREVGxEO1NBN0QwQm1ELGNBL0VoQzFQO1NBK0VxQjJQLGNBL0VyQjNQO1NBK0VZQyxZQS9FWkQ7U0FpRm9DLFdBQVUsd0NBRC9CeVA7UUFDZDs7Z0JBQVUsd0NBRlVFO1NBR3JCO1FBRUE7O1dBMUZGdEQ7YUFxRmtDcUQ7YUFLUCx3Q0FKZUY7U0FHakJoTTtTQUFOb007UUFHbkIsZ0JBUGMzUCxXQUNHd1AsWUFHRUcsU0FBTXBNOzs7O2lCQXlEakIrSTtRQW5EMkI7U0FEVnNELGdCQW9EakJ0RDtTQXBERnVELGNBeEZKOVA7U0F5RmlDLFdBL0ZuQ3FNLGdCQThGTXlELGFBQW1CRDtTQUNBcE07U0FBTnNNO1FBQ25CLGdCQURtQkEsU0FBTXRNOzs7O2lCQW1EakI4STtRQWhEMkI7U0FEVnlELGdCQWlEakJ6RDtTQWpERjBELGNBM0ZKalE7U0E0RmlDLFdBbEduQ3FNLGdCQWlHTTRELGFBQW1CRDtTQUNBdE07U0FBTndNO1FBQ25CLGdCQURtQkEsU0FBTXhNOzs7O09BS1U7UUFESHlNLGNBaEc5Qm5RO1FBZ0djYixpQkFoR2RhO1FBaUdpQyxXQXZHbkNxTSxnQkFzR2dDOEQsYUE0Q3hCNUQ7UUEzQ2lCNkQ7UUFBTkM7T0FDbkIsZ0JBRmdCbFIsZ0JBQ0drUixTQUFNRDs7V0EyQlZFLGNBNUhidFEsUUE0SEZnTSxpQkE1SEVoTTtnQkE0SEZnTTtRQUVtQztvQkFGbkNBO1NBQ3dCMUo7U0FBTnJsQztTQUNpQixXQXBJbkNvdkMsZ0JBbUlrQnB2QyxNQWVWc3ZDO1NBZGlCenZDO1NBQU5JO1NBQ2dCLFdBckluQ212QyxnQkFrSWVpRSxhQUVVeHpDO1NBQ0F5ekM7U0FBTkM7UUFDbkIsd0JBRm1CdHpDLE1BREtvbEMsU0FFTGtPLE9BQU1EOztPQUdVO21CQU5uQ3ZFO1FBS3dCaEk7UUFBTnlNO1FBQ2lCLFdBeEluQ3BFLGdCQXVJa0JvRSxRQVdWbEU7UUFWaUJtRTtRQUFOQztRQUNnQixXQXpJbkN0RSxnQkFrSWVpRSxhQU1VSTtRQUNBRTtRQUFOQztPQUNuQix3QkFGbUJGLFFBREszTSxTQUVMNk0sU0FBTUQ7O2lCQVNqQnJFO1FBcEMyQjtTQURSdUUsZ0JBcUNuQnZFO1NBckNEd0UsY0F2R0wvUTtTQXdHaUMsV0E5R25DcU0sZ0JBNkdPMEUsYUFBb0JEO1NBQ0ZFO1NBQU5DO1FBQ25CLGdCQURtQkEsU0FBTUQ7Ozs7aUJBb0NqQnpFO1FBakMyQjtTQURzQjJFLGdCQWtDakQzRTtTQWxDNEI0RSxjQTFHbENuUjtTQTBHd0I3Z0MsV0ExR3hCNmdDO1NBMEdhNWdDLFlBMUdiNGdDO1NBMkdpQyxXQWpIbkNxTSxnQkFnSG9DOEUsYUFBcUJEO1NBQ2hDRTtTQUFOQztRQUNuQixnQkFGZWp5QyxXQUFXRCxVQUNQa3lDLFNBQU1EOzs7O2lCQWlDakI3RTtRQTlCMkI7U0FEVStFLGdCQStCckMvRTtTQS9CbUJnRixjQTdHekJ2UjtTQTZHZ0IxZ0MsVUE3R2hCMGdDO1NBOEdpQyxXQXBIbkNxTSxnQkFtSDJCa0YsYUFBa0JEO1NBQ3BCRTtTQUFOQztRQUNuQixnQkFGa0JueUMsU0FDQ215QyxTQUFNRDs7OztXQThCckI3MUMsT0E1SUZxa0MsUUE0SUZ2Z0MsTUE1SUV1Z0M7aUJBNElGdmdDOzs7V0FHc0MsT0EyQnRDNnNDLHVCQTlCQTdzQyxLQUFJOUQsTUFBSTR3Qzs7V0FJOEIsT0EwQnRDRCx1QkE5QkE3c0MsS0FBSTlELE1BQUk0d0M7O1dBSzhCLE9BeUJ0Q0QsdUJBOUJBN3NDLEtBQUk5RCxNQUFJNHdDOztXQU04QixPQXdCdENELHVCQTlCQTdzQyxLQUFJOUQsTUFBSTR3Qzs7V0FPOEIsT0F1QnRDRCx1QkE5QkE3c0MsS0FBSTlELE1BQUk0d0M7O1dBUThCLE9Bc0J0Q0QsdUJBOUJBN3NDLEtBQUk5RCxNQUFJNHdDOztXQVM4QixPQXFCdENELHVCQTlCQTdzQyxLQUFJOUQsTUFBSTR3Qzs7V0FVOEIsT0FvQnRDRCx1QkE5QkE3c0MsS0FBSTlELE1BQUk0d0M7O2VBY3FCbUYsY0FkN0JqeUMsUUFjb0J5Z0MsWUFkcEJ6Z0M7V0FlQSxPQWVBNnNDO3dCQWhCb0JwTSxXQUFTd1IsY0FkekIvMUMsTUFBSTR3Qzs7V0FrQk47WUFGNkJvRixjQWhCL0JseUM7WUFnQnNCMGdDLFlBaEJ0QjFnQztZQWtCRSxPQXNCRm15QywrQkF4QitCRCxhQWhCM0JoMkMsTUFBSTR3Qzs7WUFpQjRDc0Y7WUFBTkM7WUFBM0JDO1dBRW5CLG9CQUhzQjVSLFdBQ0g0UixjQUEyQkQsU0FBTUQ7O1dBTmQsT0FtQnRDdkYsdUJBOUJBN3NDLEtBQUk5RCxNQUFJNHdDO21CQVk4QixPQWtCdENELHVCQTlCQTdzQyxLQUFJOUQsTUFBSTR3Qzs7Y0FBUjlzQzs7VUFDc0MsT0E2QnRDNnNDLHVCQTlCQTdzQyxLQUFJOUQsTUFBSTR3Qzs7VUFFOEIsT0E0QnRDRCx1QkE5QkE3c0MsS0FBSTlELE1BQUk0d0M7OztXQXlCNkI7WUFEakJ5RixnQkF4Qlp6RjtZQXlCNkIsV0EzS3JDRixnQkFrSkkxd0MsTUF3QmdCcTJDO1lBQ09DO1lBQU5DO1dBQ25CLG1CQURtQkEsU0FBTUQ7O1VBRXBCO2tCQWQrQixPQWlCdEMzRix1QkE5QkE3c0MsS0FBSTlELE1BQUk0d0M7OztJQXZCSDtHQUFtQjtZQStEeEJxRiwrQkFJQXpPLFdBQVVuRCxLQUFJemhDO0lBQVMsVUFBdkI0a0M7S0EwRUEsY0F4UUFrSixnQkE4TFVyTSxLQUFJemhDO1dBQWQ0a0M7O2lCQUFjNWtDO1FBR1o7U0FGOEJpdUMsYUFEbEJqdUM7U0FDTjR6QyxpQkFEUmhQO1NBR0U7V0FQRnlPLCtCQUtRTyxnQkFERW5TLEtBQ3NCd007U0FDSTFJO1NBQWpCc087UUFFbkIsZUFGbUJBLG1CQUFpQnRPOzs7O2lCQUZ0QnZsQztRQU9aO1NBRmtDbXVDLGVBTHRCbnVDO1NBS0o4ekMsbUJBTFZsUDtTQU9FO1dBWEZ5TywrQkFTVVMsa0JBTEFyUyxLQUswQjBNO1NBQ0FwSTtTQUFqQmdPO1FBRW5CLGVBRm1CQSxtQkFBaUJoTzs7OztpQkFOdEIvbEM7UUFXWjtTQUY0QnN1QyxlQVRoQnR1QztTQVNQZzBDLG1CQVRQcFA7U0FXRTtXQWZGeU8sK0JBYU9XLGtCQVRHdlMsS0FTb0I2TTtTQUNNQztTQUFqQjBGO1FBRW5CLGVBRm1CQSxtQkFBaUIxRjs7OztpQkFWdEJ2dUM7UUFlWjtTQUZnQ3l1QyxlQWJwQnp1QztTQWFMazBDLG1CQWJUdFA7U0FlRTtXQW5CRnlPLCtCQWlCU2Esa0JBYkN6UyxLQWF3QmdOO1NBQ0VDO1NBQWpCeUY7UUFFbkIsZUFGbUJBLG1CQUFpQnpGOzs7O2lCQWR0QjF1QztRQW1CWjtTQUZ3QzR1QyxlQWpCNUI1dUM7U0FpQkRvMEMsbUJBakJieFA7U0FtQkU7V0F2QkZ5TywrQkFxQmFlLGtCQWpCSDNTLEtBaUJnQ21OO1NBQ05DO1NBQWpCd0Y7UUFFbkIsZUFGbUJBLG1CQUFpQnhGOzs7O2lCQWxCdEI3dUM7UUF1Qlo7U0FGZ0MrdUMsZUFyQnBCL3VDO1NBcUJMczBDLG1CQXJCVDFQO1NBdUJFO1dBM0JGeU8sK0JBeUJTaUIsa0JBckJDN1MsS0FxQndCc047U0FDRUM7U0FBakJ1RjtRQUVuQixlQUZtQkEsb0JBQWlCdkY7Ozs7aUJBdEJ0Qmh2QztRQTJCWjtTQUZnQ2t2QyxlQXpCcEJsdkM7U0F5Qkx3MEMsb0JBekJUNVA7U0EyQkU7V0EvQkZ5TzthQTZCU21CLG1CQXpCQy9TLEtBeUJ3QnlOO1NBQ0VFO1NBQWpCcUY7UUFFbkIsZUFGbUJBLG9CQUFpQnJGOzs7O2lCQTFCdEJwdkM7UUErQlo7U0FGOEJ5dkMsZUE3QmxCenZDO1NBNkJOMDBDLG9CQTdCUjlQO1NBK0JFO1dBbkNGeU87YUFpQ1FxQixtQkE3QkVqVCxLQTZCc0JnTztTQUNJRTtTQUFqQmdGO1FBRW5CLGVBRm1CQSxvQkFBaUJoRjs7OztpQkE5QnRCM3ZDOztTQW1EY2d3QyxlQW5EZGh3QztTQW1EQzQwQyxhQW5ERDUwQztTQWtEYTYwQyxvQkFsRDNCalE7U0FrRGVrUSxlQWxEZmxRO1FBb0RHLHFCQUZZa1EsbUJBQ0FGO1NBQ3VDO1FBRXBEOztXQTFERnZCO2FBc0QyQndCLG1CQWxEakJwVCxLQW1Ea0J1TztTQUVRRTtTQUFqQjZFO1FBRW5CLGVBSmVILFlBRUlHLG9CQUFpQjdFOzs7O2lCQXJEdEJsd0M7UUEyRHlCO1NBRklzd0MsZUF6RDdCdHdDO1NBeURnQmcxQyxlQXpEaEJoMUM7U0F5REdpMUMsYUF6REhqMUM7U0F3RDZCazFDLG9CQXhEM0N0UTtTQXdEOEJ1USxlQXhEOUJ2UTtTQXdEaUJ3USxlQXhEakJ4UTtTQTJEdUMsV0FBVSx3Q0FGaENxUTtRQUVkOztnQkFBVSx3Q0FISUc7U0FJWjtRQUNrQyxlQUFVLHdDQUpuQko7UUFJM0I7O2dCQUFVLHdDQUxpQkc7U0FNekI7UUFDWTtTQUFiclEsY0F6ZEo0RCxNQXZJSTFDLEtBMGxCYWlQLGFBQWFEO1NBT1gsVUF4a0JmL08sY0F1a0JBbkI7U0FDVStHO1NBQVBDO1FBQ0ksV0FESkE7UUFFSSxXQUZHRDtRQUlaOztXQXhFRndIO2FBd0VtQyx3Q0FaUTZCO2FBeERqQ3pUO2FBeURpQzZPO1NBVVBDO1NBQWpCOEU7UUFHbkI7b0JBYmlCSixZQUFhRCxjQTFsQjFCaFAsS0FvbUJlcVA7Z0JBQWlCOUU7Ozs7aUJBbkV0QnZ3QztRQW1DWjtTQUZnQzh3QyxlQWpDcEI5d0M7U0FpQ0xzMUMsb0JBakNUMVE7U0FtQ0U7V0F2Q0Z5TzthQXFDU2lDLG1CQWpDQzdULEtBaUN3QnFQO1NBQ0VMO1NBQWpCOEU7UUFFbkIsZ0JBRm1CQSxvQkFBaUI5RTs7OztpQkFsQ3RCendDO1FBdUNaO1NBRmdDaXhDLGdCQXJDcEJqeEM7U0FxQ0x3MUMsb0JBckNUNVE7U0F1Q0U7V0EzQ0Z5TzthQXlDU21DLG1CQXJDQy9ULEtBcUN3QndQO1NBQ0VOO1NBQWpCOEU7UUFFbkIsZ0JBRm1CQSxvQkFBaUI5RTs7OztpQkF0Q3RCM3dDO1FBMkNaO1NBRmtDc3hDLGdCQXpDdEJ0eEM7U0F5Q0owMUMsb0JBekNWOVE7U0EyQ0U7V0EvQ0Z5TzthQTZDVXFDLG1CQXpDQWpVLEtBeUMwQjZQO1NBQ0FUO1NBQWpCOEU7UUFFbkIsZ0JBRm1CQSxvQkFBaUI5RTs7OztpQkExQ3RCN3dDO1FBK0NaO1NBRmtEeXhDLGdCQTdDdEN6eEM7U0E2Q0k0MUMsb0JBN0NsQmhSO1NBK0NFO1dBbkRGeU87YUFpRGtCdUMsbUJBN0NSblUsS0E2QzBDZ1E7U0FDaEJUO1NBQWpCNkU7UUFFbkIsZ0JBRm1CQSxvQkFBaUI3RTs7OztJQTZCL0I7R0FBbUI7WUEwQnhCOEUsT0FRRXJVLEtBQUl6aEM7SUFDbUIsV0Evb0JyQmdtQyxLQThvQkVobUM7SUFDUSxPQXRUVjZ0QyxZQXFURnBNLEtBQ1k7R0FBd0I7WUFNdENzVSxZQUFZM1MsT0FBTTdCLE9BQU16aEM7SUFDMUI7S0FBSWdGLDRCQURzQmhGO0tBRWYyakMsZUFGU2xDLFFBQU42QjtLQUVWNFMsVUFDRix1QkFIa0J6VTtPQUVoQnlVLFdBREFseEMsS0FhaUIsT0FkS2hGO0lBZWQ7a0JBYkQyakM7S0FhTGg5QixNQUFNLDRCQWJSdXZDO0lBY0YsT0FkU3ZTOztPQWVFLDhCQWpCYTNqQyxRQWVwQjJHLFFBZEYzQjs7T0FpQlMsOEJBbEJhaEYsUUFlcEIyRyxLQWJGdXZDLFVBREFseEM7Ozs7OztRQWtCeUQ7aUJBQWxDLGdCQW5CRGhGO29CQW1Ca0IsZ0JBbkJsQkEsa0JBbUJtQyxnQkFuQm5DQTs7U0FvQnRCLGVBTEUyRyxRQUtjLGdCQXBCTTNHO1NBcUJ0Qjs7V0FyQnNCQTs7V0FlcEIyRztZQWJGdXZDLFVBREFseEM7Ozs7Ozs7O1FBcUJzQixPQXJCdEJBLGNBcUJzQixnQkF0QkFoRjs7U0FzQm1DLFdBQWpCLGdCQXRCbEJBLGtCQXNCbUMsZ0JBdEJuQ0E7OztVQXVCdEIsZUFSRTJHLFFBUWMsZ0JBdkJNM0c7VUF3QnRCOztZQXhCc0JBOztZQWVwQjJHO2FBYkZ1dkMsVUFEQWx4Qzs7Ozs7O1NBeUJBLDhCQTFCc0JoRixRQWVwQjJHLEtBYkZ1dkMsVUFEQWx4Qzs7O0lBMkJGLG9DQWJJMkI7R0Fhc0I7WUFHMUJ3dkMsa0JBQWtCbjNDLE1BQUtnQjtJQUN6QjtLQUFJYixTQUFPLHVCQURTSDtLQUVoQmdHLE1BQUosc0JBRnlCaEY7S0FJdkJzRSxJQURJLGdCQUhtQnRFOzthQUl2QnNFOzs7Ozs7Ozs7Ozs7O1lBRkVVLE9BREE3Rix1QkFDQTZGOztVQU9zRDtvQkFBakIsZ0JBVGhCaEYsa0JBU2lDLGdCQVRqQ0E7OztXQVViLElBQU5vMkMsUUFBTSw0QkFUUmozQztXQVVGLGVBRElpM0MsVUFDWSxnQkFYT3AyQztXQVl2Qjs7YUFadUJBOzthQVVuQm8yQztjQVRGajNDLFNBQ0E2Rjs7V0FVRixvQ0FGSW94Qzs7Ozs7Ozs7Ozs7OztvQkFSRnB4QyxPQURBN0Y7TUFJUSxJQUFOc3FCLFFBQU0sNEJBSlJ0cUI7TUFLRixlQURJc3FCLFVBREpubEI7TUFHQTs7UUFQdUJ0RTs7UUFLbkJ5cEI7U0FKRnRxQixTQUNBNkY7O01BS0Ysb0NBRkl5a0I7OzttQkFIRnprQixNQURBN0Y7S0FjUSxJQUFOd0gsTUFBTSw0QkFkUnhIO0tBZUYsOEJBaEJ1QmEsUUFlbkIyRyxLQWRGeEgsU0FDQTZGO0tBY0Ysb0NBREkyQjs7SUFJSixPQW5CdUIzRztHQW1CcEI7WUFHSHEyQyxzQkFBc0JyMkM7SUFDeEI7S0FBSWlrQyxRQUFNLDhCQURjamtDO0tBRXBCdUQsSUFBSixzQkFESTBnQztLQUVBdDlCLE1BQU0sNEJBRE5wRDtJQUVKLGlCQUhJMGdDLFVBRUF0OUIsUUFEQXBEO0lBRUosb0NBRElvRDtHQUVzQjtZQXFDeEIydkMsZ0JBQWdCeDJDLE9BQU1kO0lBQ3RCO0tBQUlHLFNBQU8sdUJBRFdIO0tBRWxCdTNDLE9BL2xDSnBULG1CQTZsQ2dCcmpDO0tBR1p3RyxNQXhvQ0prOEI7SUFjQU0sZ0JBMG5DSXg4QjtJQTU4Qkp5OUIsa0JBNDhCSXo5QixLQUhZeEc7SUF2bkNoQmdqQyxnQkEwbkNJeDhCO0lBcG5DSnk4QixrQkFvbkNJejhCLEtBSWtCLDJCQU5sQm5IO0lBeG5DSjJqQyxnQkEwbkNJeDhCLEtBREFpd0M7SUFNSixPQWxuQ0F0VCxnQkE2bUNJMzhCO0dBTWU7WUFFbkJrd0Msa0JBQWtCdDNDLE9BQU11QztJQUMxQixRQURvQnZDLE9BdUJiLE9BdkJtQnVDO0lBSWQsSUFBSnNCLHlDQUprQnRCLFlBSWQ7O1NBQ1JnQzs7cUNBTHNCaEMsR0FLdEJnQyxpQkFESVY7TUFDSjs7Ozs7SUFPUTtLQVROMHpDLFNBQ0UxekM7S0FRRnVEO09BQU07K0JBWmM3RSxPQUdwQmcxQztLQVVBMTFCO2FBQ0EyMUIsSUFBSXB5QyxHQUFJLGVBRlJnQyxLQUNBeWEsUUFDSXpjLElBREp5YyxtQkFDc0M7SUFDL0I7S0FBUGhZLGFBWkEwdEM7a0NBSG9CaDFDO0tBZWI7O1NBQ1grQjs7VUFFSWMsMkJBbEJvQjdDLEdBZ0J4QitCO2FBRUljO09BSkFveUMsSUFJQXB5QztvQkFIQXlFLFNBREEydEMsU0FDQTN0Qyw2QkFEQTJ0QyxJQUlBcHlDO01BRko7Ozs7O0lBTUEsb0NBVklnQztHQVdFO1lBR05xd0MsWUFBWXozQyxPQUFNNkQ7SUFDcEIsT0FEYzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNVLE9BM0J0QnMzQyxrQkEwQll0M0MsT0FDVSxzQkFESjZEO0dBQzBDO1lBQzVENnpDLGNBQWMxM0MsT0FBTTZEO0lBQ3RCLE9BRGdCN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQ1EsT0E3QnRCczNDLGtCQTRCY3QzQyxPQUNRLHNCQURGNkQ7R0FDMkM7WUFDL0Q4ekMsa0JBQWtCMzNDLE9BQU02RDtJQUMxQixPQURvQjdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNJLE9BL0J0QnMzQyxrQkE4QmtCdDNDLE9BQ0ksc0JBREU2RDtHQUMyQztZQUNuRSt6QyxjQUFjNTNDLE9BQU02RDtJQUN0QixPQURnQjdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNRLE9BakN0QnMzQyxrQkFnQ2N0M0MsT0FDUSxnQ0FERjZEO0dBQzJDO1lBSS9EZzBDLGNBQWNqM0MsT0FBTWQsTUFBSzRDO2FBQ3ZCbzFDO0tBQ0YsT0FGY2wzQzs7WUFFVm0zQzs7Ozs7S0FLSix1Q0FQeUJyMUMsR0FBTDVDLE1BRWhCaTRDO0lBSzBCO0lBU2hDLFNBQUlDLGlCQUFpQmwzQztLQUFZLHdDQWhCTjRCOzs7c0NBZ0JONUI7SUFHRjtXQW5CSEY7O09BeUJKO1FBakJVRSxNQWlCVixrQkF6RVZzMkMsZ0JBZ0RjeDJDLE9BQU1kLE9BQUs0QztRQVNyQm9ELDRCQURnQmhGO1FBRUh3RDtPQUNmO1dBRGVBLE1BRGJ3Qjs7O1NBR00sMkJBSlVoRixLQUVId0Q7Ozs7O3dCQUlOLElBSk1DOzs7UUFLZCxrQkFQaUJ6RCxNQU9RLHVCQVBSQTtRQWtCSCxPQVZmazNDOzs7T0FLUyxPQXBCVEY7O09BcUJnQyxXQXJCaENBLFFBcUJnQzs7T0FDTCxPQVAzQkUsaUJBZkFGO2VBMkJGLHlCQTVFQVYsZ0JBZ0RjeDJDLE9BQU1kLE9BQUs0Qzs7R0E0QmtCO1lBVzNDdTFDLGdCQUFnQmozQztJQUNSLElBQU5vRyxNQTd0Q0ZrOEI7SUE4T0k0QixhQSsrQkY5OUIsS0FEY3BHO0lBRWxCLE9BbnNDRStpQyxnQkFrc0NFMzhCO0dBRWU7WUF1TGpCOHdDLDJCQUtFM2UsR0FBRXptQixLQUFJMnZCLEtBQUk3aUMsS0FBSUUsTUFBSzRwQyxPQUFNMXBDO0lBQVMsVUFBeEJKO2VBQUlFOzs7Z0JBVVpnVSxHQUFFcFI7Z0JBQ00sSUFBTjVCLE1BaldObTJDLGtCQWdXSW5qQyxHQUM0QixXQVhYNDFCLE9BQU0xcEMsT0FVckIwQztnQkFFSixPQTVMRXkxQyxZQWdMRjVlLE9BQUV6bUIsS0FXRWhTLE1BWEUyaEM7ZUFZd0M7O2dCQVY1Qy8vQjtnQkFDUSxJQUFONUIsTUFBTSxXQUhTNG9DLE9BQU0xcEMsT0FFdkIwQztnQkFFRixPQXBMRXkxQyxZQWdMRjVlLE9BQUV6bUIsS0FHRWhTLE1BSEUyaEM7ZUFJd0M7U0FDdEIzdUIsSUFMVmhVO0tBTWhCLGdCQUFJNEM7TUFDUSxJQUFONUIsTUE3Vk5tMkMsa0JBMlYwQm5qQyxHQUVNLFdBUFg0MUIsT0FBTTFwQyxPQU12QjBDO01BRUYsT0F4TEV5MUMsWUFnTEY1ZSxPQUFFem1CLEtBT0VoUyxNQVBFMmhDLEtBUXdDOzthQVJwQzdpQztTQWlCUSt1QyxJQWpCUi91QyxRQWlCQ3drQyxRQWpCRHhrQztlQUFJRTs7O2dCQXNCWmdVLEdBQUVwUjtnQkFDTTtpQkFBTjVCO21CQTVZTmkyQztxQkFzWWEzUztxQkFBT3VLO3FCQXZXcEJzSSxrQkE0V0luakMsR0FDaUQsV0F2QmhDNDFCLE9BQU0xcEMsT0FzQnJCMEM7Z0JBRUosT0F4TUV5MUMsWUFnTEY1ZSxPQUFFem1CLEtBdUJFaFMsTUF2QkUyaEM7ZUF3QndDOztnQkFWNUMvL0I7Z0JBQ1EsSUFBTjVCLE1BcFlOaTJDLFlBc1lhM1MsT0FBT3VLLEdBRlksV0FmWGpGLE9BQU0xcEMsT0FjdkIwQztnQkFFRixPQWhNRXkxQyxZQWdMRjVlLE9BQUV6bUIsS0FlRWhTLE1BZkUyaEM7ZUFnQndDO1NBQ1YyVixNQWpCdEJ0NEM7S0FrQmhCLGdCQUFJNEM7TUFDUTtPQUFONUI7U0F4WU5pMkM7V0FzWWEzUyxPQUFPdUssR0F2V3BCc0ksa0JBdVdzQ21CLEtBRWUsV0FuQmhDMU8sT0FBTTFwQyxPQWtCdkIwQztNQUVGLE9BcE1FeTFDLFlBZ0xGNWUsT0FBRXptQixLQW1CRWhTLE1BbkJFMmhDLEtBb0J3Qzs7UUFTcENnQyxVQTdCQTdrQztjQUFJRTs7O2VBa0NaNnVDLEdBQUU3NkIsR0FBRXBSO2VBQ0k7Z0JBQU41QjtrQkF4Wk5pMkM7b0JBa1pZdFM7b0JBS1JrSztvQkF4WEpzSSxrQkF3WE1uakMsR0FDK0MsV0FuQ2hDNDFCLE9BQU0xcEMsT0FrQ25CMEM7ZUFFTixPQXBORXkxQyxZQWdMRjVlLE9BQUV6bUIsS0FtQ0VoUyxNQW5DRTJoQztjQW9Dd0M7O2VBVjVDa00sR0FBRWpzQztlQUNNLElBQU41QixNQWhaTmkyQyxZQWtaWXRTLFNBSFJrSyxHQUM0QixXQTNCWGpGLE9BQU0xcEMsT0EwQnJCMEM7ZUFFSixPQTVNRXkxQyxZQWdMRjVlLE9BQUV6bUIsS0EyQkVoUyxNQTNCRTJoQztjQTRCd0M7UUFDZjRWLE1BN0JqQnY0QztJQThCaEIsZ0JBQUk2dUMsR0FBRWpzQztLQUNNO01BQU41QjtRQXBaTmkyQztVQWtaWXRTLFNBQ1JrSyxHQXBYSnNJLGtCQW1YaUNvQixLQUVvQixXQS9CaEMzTyxPQUFNMXBDLE9BOEJyQjBDO0tBRUosT0FoTkV5MUMsWUFnTEY1ZSxPQUFFem1CLEtBK0JFaFMsTUEvQkUyaEMsS0FnQ3dDO0dBSUE7WUE3RGhENlYsYUFJRS9lLEdBQUV6bUIsS0FBSTJ2QixLQUFJN2lDLEtBQUk4cEM7SUFBUyxVQUFiOXBDO0tBRVosZ0JBQUk4QztNQUNZLElBQVY2MUMsY0FIRnpsQyxLQUdrQyxXQUh0QjQyQixPQUVaaG5DO01BRUYsT0EvSkV5MUMsWUEySkY1ZSxHQUdJZ2YsU0FIRTlWLEtBSW1CO2FBSmY3aUM7U0FLUTJpQyxRQUxSM2lDLFFBS0N3a0MsUUFMRHhrQztLQU1aLGdCQUFJOEM7TUFDWSxJQUFWNjFDLGNBUEZ6bEMsS0FoV0ppa0MsWUFxV2EzUyxPQUFPN0IsT0FFMEMsV0FQOUNtSCxPQU1aaG5DO01BRUYsT0FuS0V5MUMsWUEySkY1ZSxHQU9JZ2YsU0FQRTlWLEtBUW1COztRQUNmZ0MsVUFUQTdrQztJQVVaLGdCQUFJK3VDLEdBQUVqc0M7S0FDVSxJQUFWNjFDLGNBWEZ6bEMsS0FoV0ppa0MsWUF5V1l0UyxTQUNSa0ssR0FDc0QsV0FYMUNqRixPQVVWaG5DO0tBRUosT0F2S0V5MUMsWUEySkY1ZSxHQVdJZ2YsU0FYRTlWLEtBWW1COztZQXZLdkIrVix1QkFHSmpmLEdBQUV6bUIsS0FBSTJ2QjtJQUFPLElBeU5YdkUsTUF6TkYzRSxHQXlOSXhtQixRQXpORkQsS0FBSXl6QjtJQUFPO2VBQVBBLG9CQXVGTixrQkFrSUVySSxLQUFFbnJCO1lBek5Fd3pCOztZQUNEbm9DLE9BRENtb0M7UUFFTixnQkFBSW5oQztTQUNZLElBQVZtekMsY0FzTkZ4bEMsT0F2TkEzTjtTQUVGLE9BUEUreUMsWUE0TkZqYSxLQXROSXFhLFNBRkRuNkMsTUFHdUI7O1lBQ2xCQyxTQUxKa29DO1FBTU4sZ0JBQUluaEM7U0FDRjtVQWhDQXRFLE1BQU0sMkJBK0JKc0U7VUE5QkZmLElBQUosc0JBREl2RDtVQUVBMkcsTUFBTSw0QkFETnBEO1NBRUosaUJBSEl2RCxRQUVBMkcsUUFEQXBEO1NBK0JjLElBQVZrMEMsY0FrTkZ4bEMsT0EvT04sNkJBREl0TDtTQStCQSxPQVhFMHdDLFlBNE5GamEsS0FsTklxYSxTQUZJbDZDLFFBR2tCOztZQUNmQyxTQVRQaW9DLFVBU0UzbUMsTUFURjJtQztRQVVzQixPQTBJNUIrUjtpQkFxRUVwYSxLQUFFbnJCLE9BaE5TelUsUUFBTHNCLGNBQ3lCa0IsS0FBTyxPQUFQQSxJQUFVOztZQUN6QnZDLFNBWFpnb0MsVUFXTzFtQyxRQVhQMG1DO1FBWU4sT0F3SUErUixhQXFFRXBhLEtBQUVuckIsT0E5TWN4VSxRQUFMc0IsT0E5SmJzM0M7OztTQWdLdUIzNEMsU0FiakIrbkM7U0FhV3ptQyxPQWJYeW1DO1NBYU14bUMsUUFiTndtQztTQWFEdm1DLFFBYkN1bUM7UUFjTixPQTBKQTJSO2lCQWlERWhhLEtBQUVuckIsT0E1TW1CdlUsUUFBWHVCLE9BQUtELE1BakZqQjIzQyxhQWlGS3ozQzs7O1NBRW9CdkIsU0FmbkI4bkM7U0FlYXRtQyxTQWZic21DO1NBZVFybUMsUUFmUnFtQztTQWVDcG1DLFVBZkRvbUM7UUFnQk4sT0F3SkEyUjtpQkFpREVoYSxLQUFFbnJCLE9BMU1xQnRVLFFBQVh5QixPQUFLRCxRQWpGbkJ5M0MsZUFpRk92M0M7OztTQUVzQnpCLFNBakJ2QjZuQztTQWlCaUJubUMsU0FqQmpCbW1DO1NBaUJZbG1DLFFBakJaa21DO1NBaUJLam1DLFVBakJMaW1DO1FBa0JOLE9Bc0pBMlI7aUJBaURFaGE7aUJBQUVuckI7aUJBeE15QnJVO2lCQUFYMkI7aUJBQUtEO2lCQWpGdkJ1M0M7aUJBaUZXcjNDOzs7U0FFYzNCLFNBbkJuQjRuQztTQW1CYWhtQyxTQW5CYmdtQztTQW1CUS9sQyxRQW5CUitsQztTQW1CQzlsQyxVQW5CRDhsQztRQW9CTixPQW9KQTJSO2lCQWlERWhhLEtBQUVuckIsT0F0TXFCcFUsUUFBWDZCLE9BQUtELFFBakZuQnEzQyxlQWlGT24zQzs7O1NBc01DN0IsU0F6TkYybkM7U0F5TlU3bEMsU0F6TlY2bEM7U0F5Tk01bEMsUUF6Tk40bEM7U0F5TmUzbEMsUUF6TmYybEM7a0JBeU5NNWxDO21CQUFJRDs7O29CQVVab1QsR0FBRXBSO29CQUNNLElBQU41QixNQTdSTisyQyxjQWtScUJqM0MsT0FVakJrVCxHQUFFcFI7b0JBRUosT0F4T0V5MUMsWUE0TkZqYSxTQUFFbnJCLE9BV0VqUyxNQVhFbEM7bUJBWXdDOztvQkFWNUM4RDtvQkFDUTtxQkFBTjVCO3VCQXJSTisyQyxjQWtScUJqM0MsT0EzK0NyQnlpQyx3QkEyK0NxQnppQyxRQUVqQjhCO29CQUVGLE9BaE9FeTFDLFlBNE5GamEsU0FBRW5yQixPQUdFalMsTUFIRWxDO21CQUl3QzthQUN0QmtWLElBTFZwVDtTQU1oQixnQkFBSWdDO1VBQ1EsSUFBTjVCLE1BelJOKzJDLGNBa1JxQmozQyxPQUtLa1QsR0FDdEJwUjtVQUVGLE9BcE9FeTFDLFlBNE5GamEsU0FBRW5yQixPQU9FalMsTUFQRWxDLFFBUXdDOztpQkFScEMrQjthQWtCUWd1QyxJQWxCUmh1QyxVQWtCQ3lqQyxRQWxCRHpqQzttQkFBSUQ7OztvQkF1QlpvVCxHQUFFcFI7b0JBQ00sSUFBTjVCLE1BemJOaTJDLFlBbWJhM1MsT0FBT3VLLEdBcFNwQmtKLGNBa1JxQmozQyxPQXVCakJrVCxHQUFFcFI7b0JBRUosT0FyUEV5MUMsWUE0TkZqYSxTQUFFbnJCLE9Bd0JFalMsTUF4QkVsQzttQkF5QndDOztvQkFYNUM4RDtvQkFDRjtxQkFBSTVCO3VCQWpTTisyQyxjQWtScUJqM0MsT0EzK0NyQnlpQyx3QkEyK0NxQnppQyxRQWNqQjhCO3FCQUVFcWlDLFFBamJOZ1MsWUFtYmEzUyxPQUFPdUssR0FIZDd0QztvQkFFSixPQTdPRXEzQyxZQTRORmphLFNBQUVuckIsT0FnQkVneUIsUUFoQkVubUM7bUJBaUJ5QzthQUNYdzVDLE1BbEJ0QjEzQztTQW1CaEIsZ0JBQUlnQztVQUNRLElBQU41QixNQXJiTmkyQyxZQW1iYTNTLE9BQU91SyxHQXBTcEJrSixjQWtScUJqM0MsT0FrQmlCdzNDLEtBQ2xDMTFDO1VBRUYsT0FqUEV5MUMsWUE0TkZqYSxTQUFFbnJCLE9Bb0JFalMsTUFwQkVsQyxRQXFCd0M7O1lBVXBDNmxDLFVBL0JBOWpDO2tCQUFJRDs7O21CQW9DWml1QyxHQUFFNzZCLEdBQUVwUjttQkFDSTtvQkFBTjVCLE1BdGNOaTJDLFlBZ2NZdFMsU0FLUmtLLEdBdFRKa0osY0FrUnFCajNDLE9Bb0Nma1QsR0FBRXBSO21CQUVOLE9BbFFFeTFDLFlBNE5GamEsU0FBRW5yQixPQXFDRWpTLE1BckNFbEM7a0JBc0N3Qzs7bUJBWDVDK3ZDLEdBQUVqc0M7bUJBQ0o7b0JBQUk1QjtzQkE5U04rMkMsY0FrUnFCajNDLE9BMytDckJ5aUMsd0JBMitDcUJ6aUMsUUEyQmY4QjtvQkFFQXFpQyxRQTliTmdTLFlBZ2NZdFMsU0FKUmtLLEdBQ0U3dEM7bUJBRUosT0ExUEVxM0MsWUE0TkZqYSxTQUFFbnJCLE9BNkJFZ3lCLFFBN0JFbm1DO2tCQThCeUM7WUFDaEJ5NUMsTUEvQmpCMzNDO1FBZ0NoQixnQkFBSWl1QyxHQUFFanNDO1NBQ00sSUFBTjVCLE1BbGNOaTJDLFlBZ2NZdFMsU0FDUmtLLEdBbFRKa0osY0FrUnFCajNDLE9BK0JZeTNDLEtBQzNCMzFDO1NBRUosT0E5UEV5MUMsWUE0TkZqYSxTQUFFbnJCLE9BaUNFalMsTUFqQ0VsQyxRQWtDd0M7O1lBcE9yQ0UsU0F2Qkx5bkMsVUF1QkExbEMsUUF2QkEwbEM7UUF3Qk4sT0E0SEErUixhQXFFRXBhLEtBQUVuckIsT0FsTU9qVSxRQUFMK0I7O1FBbUJRO1NBMUNSN0I7U0FBSmdVLFlBeU5FRDtpQkF6TkZDO1NBQUl1ekI7OztRQTZDUTtTQTdDUnRuQztTQTRDVTZCLE1BNUNWeWxDO1NBQUp6YixZQXlORS9YLE9BN0tZalM7U0E2S1ppUyxRQXpORitYO1NBQUl5Yjs7O1FBK0NRO1NBL0NScm5DO1NBOENRNkIsTUE5Q1J3bEM7U0FBSmtTLFlBeU5FMWxDLE9BM0tVaFM7U0EyS1ZnUyxRQXpORjBsQztTQUFJbFM7OztRQWtERztTQURpQnBuQyxVQWpEcEJvbkM7U0FpRFNYLFlBakRUVztTQWtERjFuQyxLQXBFSm81QyxnQkFtRWVyUztRQUVmLGdCQUFLOWtDO1NBQ0gsT0F2REVxM0MsWUE0TkZqYSxTQUFFbnJCLE9BdktBbFUsS0FEc0JNLFNBSXNCOztZQUN4QkMsVUF0RGxCbW5DLFVBc0RXdmxDLFFBdERYdWxDO1FBdUROO2FBQWE5RCxnQkFDQyxPQS9RZHFVLE9BOFFhclUsS0FESXpoQztTQUVmLE9BM0RFbTNDO2tCQTRORmphO2tCQUFFbnJCO2tCQWpLRiw4Q0FGc0IzVCxVQUVjOztZQS9CaENnQyxVQXpCQW1sQztRQTBCTixnQkFBSW5rQyxHQUFFTTtTQUFLLE9BN0JQeTFDO2tCQTRORmphO3NCQUFFbnJCLGdCQS9MMEM3QyxHQUFLLGtCQUEvQzlOLEdBQTBDOE4sR0FBeEN4TixHQUFrRDtrQkFEbER0QixTQUN5RDs7WUFDekRDLFVBM0JBa2xDO1FBNEJOLGdCQUFJbmtDLEdBQUssT0EvQkwrMUMsWUE0TkZqYSxTQUFFbnJCLE9BN0xBM1EsSUFERWYsU0FDMEM7O1FBZ0RsQztTQTVFUkM7U0EyRVVDLGFBM0VWZ2xDO1NBQUptUyxZQXlORTNsQyxPQTlJWXhSO1NBOElad1IsUUF6TkYybEM7U0FBSW5TOzs7Ozs7VUE2RXVDL2tDLFVBN0V2QytrQzs7VUFBTm9TO3FCQXlOSTdsQyxLQUFGeW1CLEdBNUkyQ243QjtzQkE3RTdDOC9CLElBOEVPMGE7Y0FDTCxPQWxGRVQsWUE0TkY1ZSxPQUFFem1CLFNBM0lHOGxDLFFBRHNDeDZDO2FBRXFCO29CQS9FbEU4L0I7O29CQXlOSW5yQixPQUFGbXJCLEtBNUkyQzE4QjtVQTRJM0MwOEIsTUF6TkZDO1VBeU5JcHJCO1VBek5Fd3pCOzs7O1NBaUZ1QzdrQyxVQWpGdkM2a0M7O1NBQU5zUztvQkF5TkkvbEMsS0FBRnltQixHQXhJMkNuN0I7cUJBakY3QzgvQixJQWtGTzBhO2FBQ0wsT0F0RkVULFlBNE5GNWUsT0FBRXptQixTQXZJRzhsQyxRQURzQ3g2QztZQUVxQjttQkFuRmxFOC9COzttQkF5TkluckIsT0FBRm1yQixLQXhJMkN4OEI7U0F3STNDdzhCLE1Bek5GSDtTQXlOSWhyQjtTQXpORXd6Qjs7O1FBd0NOOztRQW1CYztTQURPNWtDLFVBMURmNGtDO1NBMkRGZ1MsY0E4SkF4bEM7UUE3SkosdUJBQVMsT0EvRExvbEMsWUE0TkZqYSxLQTlKRXFhLFNBRGlCNTJDLFNBRWM7O1lBQ2RHLFVBN0RmeWtDO1FBaUVOLGdCQUFJMWlDO1NBQ1ksSUFBVjAwQyxjQXVKRnhsQyxPQXZKa0MseUJBRGxDbFA7U0FFRixPQXRFRXMwQyxZQTRORmphLEtBdkpJcWEsU0FMZXoyQyxTQU1POztZQUNiRSxVQXBFVHVrQztRQXFFTixnQkFBSW5oQztTQUNZLElBQVZtekMsY0FtSkZ4bEMsT0FwSkEzTjtTQUVGLE9BMUVFK3lDLFlBNE5GamEsS0FuSklxYSxTQUZTdjJDLFNBR2E7O1lBQ1JDLFVBeEVkc2tDLFVBd0VTcmtDLE1BeEVUcWtDO1FBeUVOOztrQkFrQkF1UywwQkE4SEU1YSxLQUFFbnJCLE9BakpXN1EsS0FBS0Q7O1FBQ3BCLE9Ba0JBNjJDLGdDQThIRTVhLEtBQUVuckIsT0FqSlc3USxLQUFLRDs7UUExQ1M7U0FEWEUsVUE3Qlpva0M7U0E2QlNua0MsSUE3QlRta0M7U0E2QkVsa0MsUUE3QkZra0M7U0E4QnVCLGtCQURkbmtDO1FBQ2M7O2tCQWtPN0IyMkMsbUJBdkNFN2EsS0FBRW5yQixPQTVMYzVRLFNBQVZFOztRQUNxQixPQWtPN0IwMkMseUJBdkNFN2EsS0FBRW5yQixPQTVMYzVRLFNBQVZFOzs7R0EwREg7WUFJTHkyQyw4QkFJQXZmLEdBQUV6bUIsS0FBSTVRLEtBQUl1Z0M7SUFBTyxVQUFYdmdDOzs7UUFDNkI7dUNBNkNuQzgyQyxzQkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O1FBQ3lCLE9BNkNuQ3VXLDRCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7UUFFeUI7dUNBNENuQ3VXLHNCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7UUFFeUIsT0E0Q25DdVcsNEJBOUNBemYsR0FBRXptQixLQUFRMnZCOztRQWF5Qjs7UUFHQTt1Q0E4Qm5DdVcsc0JBOUNBemYsR0FBRXptQixLQUFRMnZCOztRQWdCeUIsT0E4Qm5DdVcsNEJBOUNBemYsR0FBRXptQixLQUFRMnZCOztXQUFKdmdDOztPQUc2QjtzQ0EyQ25DODJDLHNCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FHeUIsT0EyQ25DdVcsNEJBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQUl5QjtzQ0EwQ25DdVcsc0JBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQUl5QixPQTBDbkN1Vyw0QkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BS3lCO3NDQXlDbkN1VyxzQkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BS3lCLE9BeUNuQ3VXLDRCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FNeUI7c0NBd0NuQ3VXLHNCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FNeUIsT0F3Q25DdVcsNEJBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQU95QjtzQ0F1Q25DdVcsc0JBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQU95QixPQXVDbkN1Vyw0QkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BUXlCO3NDQXNDbkN1VyxzQkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BUXlCLE9Bc0NuQ3VXLDRCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FTeUI7c0NBcUNuQ3VXLHNCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FTeUIsT0FxQ25DdVcsNEJBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQVV5QjtzQ0FvQ25DdVcsc0JBOUNBemYsR0FBRXptQixLQUFRMnZCOztPQVV5QixPQW9DbkN1Vyw2QkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BV3lCO3NDQW1DbkN1VyxzQkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BV3lCLE9BbUNuQ3VXLDZCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7V0FZZXpoQyxRQVpuQmtCO09BWTZCOztpQkFRbkMrMkMsdUJBcEJBMWYsR0FBRXptQixLQVl1QjlSLE9BWmZ5aEM7O09BWXlCLE9BUW5Dd1csOEJBcEJBMWYsR0FBRXptQixLQVl1QjlSLE9BWmZ5aEM7O09BY3lCO3NDQWdDbkN1VyxzQkE5Q0F6ZixHQUFFem1CLEtBQVEydkI7O09BY3lCLE9BZ0NuQ3VXLDZCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FleUI7c0NBK0JuQ3VXLHNCQTlDQXpmLEdBQUV6bUIsS0FBUTJ2Qjs7T0FleUIsT0ErQm5DdVcsNkJBOUNBemYsR0FBRXptQixLQUFRMnZCOztHQWdCbUQ7WUFJN0R3VywyQkFJQTFmLEdBQUV6bUIsS0FBSTlSLE9BQU15aEM7SUFBTyxVQUFiemhDOzs7WUFDRTVDLE9BREY0QztRQUNxQix1QkFBUyxPQUxwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FDTTFVLE1BRElxa0MsS0FDc0Q7O1lBQ3hEcGtDLFNBRkoyQztRQUVxQix1QkFBUyxPQU5wQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FFUXpVLFFBRkVva0MsS0FFc0Q7O1lBQzNEbmtDLFNBSEQwQztRQUdxQix1QkFBUyxPQVBwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FHS3hVLFFBSEtta0MsS0FHc0Q7O1lBQ3pEbGtDLFNBSkh5QztRQUlxQix1QkFBUyxPQVJwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FJT3ZVLFFBSkdra0MsS0FJc0Q7O1lBQ3JEamtDLFNBTFB3QztRQUtxQix1QkFBUyxPQVRwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FLV3RVLFFBTERpa0MsS0FLc0Q7O1lBQ3pEaGtDLFNBTkh1QztRQU1xQix1QkFBUyxPQVZwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FNT3JVLFFBTkdna0MsS0FNc0Q7O1lBQ3pEL2pDLFNBUEhzQztRQU9xQix1QkFBUyxPQVhwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FPT3BVLFFBUEcrakMsS0FPc0Q7O1lBQzFEOWpDLFNBUkZxQztRQVFxQix1QkFBUyxPQVpwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FRTW5VLFFBUkk4akMsS0FRc0Q7O1lBTWhEN2pDLFNBZFpvQztRQWNxQix1QkFBUyxPQWxCcENrNEMsZ0JBSUEzZixHQUFFem1CLEtBY2dCbFUsUUFkTjZqQyxLQWNzRDs7UUFHekQ7U0FEa0IzakMsU0FoQnJCa0M7U0FnQmdCeEIsTUFoQmhCd0I7U0FnQldqQyxNQWhCWGlDO1NBaUJGbkMsS0E5MUJKNnFDLE1BdklJMUMsS0FvK0Jham9DLE1BQUtTO1FBRXRCO1NBQVMsT0F0QlQwNUM7a0JBSUEzZjtrQkFBRXptQjtrQkFrQjZCLHdDQUQzQmpVLElBRHVCQztrQkFoQmYyakMsS0FrQjZDOztZQVRoRHpqQyxTQVRIZ0M7UUFTcUI7U0FBVyxPQWJ0Q2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FTTzlULFFBVEd5akMsS0FTd0Q7O1lBQzNEeGpDLFVBVkgrQjtRQVVxQix1QkFBUyxPQWRwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FVTzdULFNBVkd3akMsS0FVc0Q7O1lBQzNEdmpDLFVBWEQ4QjtRQVdxQix1QkFBUyxPQWZwQ2s0QyxnQkFJQTNmLEdBQUV6bUIsS0FXSzVULFNBWEt1akMsS0FXc0Q7O1FBQ3ZDOztRQUNBOztJQUVBO21DQU8zQnVXLHNCQXRCQXpmLEdBQUV6bUIsS0FBVTJ2Qjs7SUFlZSxPQU8zQnVXLDRCQXRCQXpmLEdBQUV6bUIsS0FBVTJ2QjtHQWtCNkM7WUFJekR1VywwQkFHQXpmLEdBQUV6bUIsS0FBSTJ2QjtJQUNNLGVBRFYzdkI7SUFDSjttQ0FwSk0wbEMsbUJBbUpKamYsU0FBTWtKOztJQUNSLE9BcEpNK1YseUJBbUpKamYsU0FBTWtKO0dBQzhEO1lBK0dwRXNXLHVCQUlFeGYsR0FBRXptQixLQUFJMVUsTUFBS2lFLE9BQU1EO0lBQUssR0FBWEM7U0FFRHNyQyxVQUZDdHJDO0tBR2IsZ0JBQUlLO01BQ0YsT0FSRnkyQyxZQUlFNWYsR0FBRXptQixLQUFJMVUsTUFFSXV2QyxTQUVtQixXQUpadnJDLEdBR2ZNLElBQ2dDOztJQUhQLGVBRHpCb1EsS0FBZTFRO0lBQ0o7bUNBeFFYbzJDLG1CQXVRRmpmLFNBQU1uN0I7O0lBQ08sT0F4UVhvNkMseUJBdVFGamYsU0FBTW43QjtHQUk0QjtZQTNRaEMrNUMsWUFHSjVlLEdBQUV6bUIsS0FBSTJ2QjtJbkM5K0NYLHVCbUMyK0NTK1YsaUJBR0pqZixHQUFFem1CLEtBQUkydkI7O1lBMkZOMlcsbUJBSUE3ZixHQUFFem1CLEtBQUk1USxLQUFJdWdDO0luQzdrRGYsdUJtQ3lrREtxVyx3QkFJQXZmLEdBQUV6bUIsS0FBSTVRLEtBQUl1Z0M7O1lBb0JWeVcsZ0JBSUEzZixHQUFFem1CLEtBQUk5UixPQUFNeWhDO0luQ3JtRGpCLHVCbUNpbURLd1cscUJBSUExZixHQUFFem1CLEtBQUk5UixPQUFNeWhDOztZQXlJWjBXLFlBSUU1ZixHQUFFem1CLEtBQUkxVSxNQUFLaUUsT0FBTUQ7SW5DbHZEeEIsdUJtQzh1REsyMkMsaUJBSUV4ZixHQUFFem1CLEtBQUkxVSxNQUFLaUUsT0FBTUQ7O1lBaUZuQmkzQyx3QkFJRTlmLEdBQUVycEIsR0FBRXV5QixLQUFJN2lDLEtBQUlFO0lBQVEsVUFBWkY7ZUFBSUU7TUFJSixXQWpGTnc1QyxhQTZFRi9mLEdBQUVycEIsR0FBRXV5QjtNQUlJLHNCbkMzMERmOztRbUN1MERtQjNpQztNQU1HLFdBbkZidzVDLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCLE1BTUksc0JuQzcwRGY7TW1DNjBEZSxzQm5DNzBEZjs7S21DeTBEZSxXQS9FTjZXLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCO0tBRUksc0JuQ3owRGY7O2FtQ3UwRGU3aUM7ZUFBSUU7TUFVSixXQXZGTnc1QyxhQTZFRi9mLEdBQUVycEIsR0FBRXV5QjtNQVVJLHNCbkNqMURmOztRbUN1MERtQjNpQztNQVlHLFdBekZidzVDLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCLE1BWUksc0JuQ24xRGY7TW1DbTFEZSxzQm5DbjFEZjs7S21DKzBEZSxXQXJGTjZXLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCO0tBUUksc0JuQy8wRGY7O2NtQ3UwRG1CM2lDO0tBZ0JHLFdBN0ZidzVDLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCLE1BZ0JJLHNCbkN2MURmO0ttQ3UxRGUsc0JuQ3YxRGY7O09tQ3UwRG1CM2lDO0tBa0JVO2FBL0ZwQnc1QyxhQTZFRi9mLEdBQUVycEIsR0FBRXV5QjtNQWtCVyxzQm5DejFEdEI7TW1DeTFEZSxzQm5DejFEZjtLbUN5MURlLHNCbkN6MURmOztJbUNxMURzQixXQTNGYjZXLGFBNkVGL2YsR0FBRXJwQixHQUFFdXlCO0lBY0ksb0JuQ3IxRGY7SW1DcTFEZSxzQm5DcjFEZjtHbUN5MURxRDtZQS9GNUM4Vyx3QkFFRmhnQixHQUFFcnBCLEdBQUV1eUI7SUFBTyxJQUFYdkUsU0FBSXFJO0lBQU87ZUFBUEEsb0JBc0VGLGtCQXRFRnJJLEtBQUVodUI7WUFBRXEyQjs7UUFFSSxJQURIbm9DLE9BRERtb0MsVUFFSSxPQUpOK1MsYUFFRnBiLEtBQUVodUIsR0FDRzlSO1FBQ0csc0JuQzl2RGY7O1FtQ2d3RGUsSUFERUMsU0FITmtvQyxVQUlJLE9BTk4rUyxhQUVGcGIsS0FBRWh1QixHQUdRN1I7UUFDRixzQm5DaHdEZjs7bUJtQzR2RFdrb0M7O1NBTUksSUFEWWpvQyxTQUxoQmlvQyxVQU1JLE9BUk4rUyxhQUVGcGIsS0FBRWh1QixHQUtrQjVSO1NBQ1osc0JuQ2x3RGY7OztTbUNvd0RlLElBRGVDLFNBUG5CZ29DLFVBUUksT0FWTitTLGFBRUZwYixLQUFFaHVCLEdBT3FCM1I7U0FDZixzQm5DcHdEZjs7UW1Dc3dEc0I7U0FEUUMsU0FUbkIrbkM7U0FVVyxPQVpiK1MsYUFFRnBiLEtBQUVodUIsR0FTcUIxUjtTQUNmLHNCbkN0d0RmO1FtQ3N3RGUsc0JuQ3R3RGY7O21CbUM0dkRXK25DOztTQVlJLElBRGlCOW5DLFNBWHJCOG5DLFVBWUksT0FkTitTLGFBRUZwYixLQUFFaHVCLEdBV3VCelI7U0FDakIsc0JuQ3h3RGY7OztTbUMwd0RlLElBRG9CQyxTQWJ4QjZuQyxVQWNJLE9BaEJOK1MsYUFFRnBiLEtBQUVodUIsR0FhMEJ4UjtTQUNwQixzQm5DMXdEZjs7UW1DNHdEc0I7U0FEYUMsU0FmeEI0bkM7U0FnQlcsT0FsQmIrUyxhQUVGcGIsS0FBRWh1QixHQWUwQnZSO1NBQ3BCLHNCbkM1d0RmO1FtQzR3RGUsc0JuQzV3RGY7O1ltQzZ3RDBCQyxTQWpCZjJuQyxVQWlCU3ptQyxPQWpCVHltQyxVQWlCSTNtQyxNQWpCSjJtQztRQWtCRixPQXFESjhTLHdCQXZFRW5iLEtBQUVodUIsR0FpQmlCdFIsUUFBWGdCLEtBQUtFOztZQUVRaEIsU0FuQmpCeW5DLFVBbUJXdG1DLFNBbkJYc21DLFVBbUJNMW1DLFFBbkJOMG1DO1FBb0JGLE9BbURKOFMsd0JBdkVFbmIsS0FBRWh1QixHQW1CbUJwUixRQUFYZSxPQUFLSTs7WUFFVWpCLFNBckJyQnVuQyxVQXFCZW5tQyxTQXJCZm1tQyxVQXFCVXhtQyxRQXJCVndtQztRQXNCRixPQWlESjhTLHdCQXZFRW5iLEtBQUVodUIsR0FxQnVCbFIsUUFBWGUsT0FBS0s7O1lBRUVuQixVQXZCakJzbkMsVUF1QldobUMsU0F2QlhnbUMsVUF1Qk1ybUMsUUF2Qk5xbUM7UUF3QkYsT0ErQ0o4Uyx3QkF2RUVuYixLQUFFaHVCLEdBdUJtQmpSLFNBQVhpQixPQUFLSzs7WUFFTXJCLFVBekJqQnFuQyxVQXlCVzdsQyxTQXpCWDZsQyxVQXlCTWxtQyxRQXpCTmttQztRQTBCRixPQTZDSjhTLHdCQXZFRW5iLEtBQUVodUIsR0F5Qm1CaFIsU0FBWG1CLE9BQUtLOzttQkF6Qlg2bEM7O1NBNEJJLElBRFVwbkMsVUEzQmRvbkMsVUE0QkksT0E5Qk4rUyxhQUVGcGIsS0FBRWh1QixHQTJCZ0IvUTtTQUNWLHNCbkN4eERmOzs7U21DMHhEZSxJQURhQyxVQTdCakJtbkMsVUE4QkksT0FoQ04rUyxhQUVGcGIsS0FBRWh1QixHQTZCbUI5UTtTQUNiLHNCbkMxeERmOztRbUM0eERzQjtTQURNZ0MsVUEvQmpCbWxDO1NBZ0NXLE9BbENiK1MsYUFFRnBiLEtBQUVodUIsR0ErQm1COU87U0FDYixzQm5DNXhEZjtRbUM0eERlLHNCbkM1eERmOztZbUM0dkRXQzs7Ozs7O1FBa0RJLElBRFVLLFVBakRkNmtDLFVBa0RJLE9BcEROK1MsYUFFRnBiLEtBQUVodUIsR0FpRGdCeE87UUFDVixzQm5DOXlEZjs7WW1DK3lEK0JDLFVBbkRwQjRrQyxVQW1EYXZsQyxRQW5EYnVsQztRQW9ERjthQUFhOUQsZ0JBRUcsT0EzaEJwQnFVLE9BeWhCaUJyVSxLQURFemhDO1NBR1gsT0F4REpzNEM7a0JBRUZwYjtrQkFBRWh1QjtrQkFzREksOENBSGtCdk8sVUFHa0I7O1FBcEIzQjtTQURURyxVQWpDRnlrQztTQWtDVyxPQXBDYitTLGFBRUZwYixLQUFFaHVCLEdBaUNJcE87U0FDRSxzQm5DOXhEZjtRbUM4eERlLHNCbkM5eERmOztRbUNneURlLElBREZFLFVBbkNGdWtDLFVBb0NJLE9BdENOK1MsYUFFRnBiLEtBQUVodUIsR0FtQ0lsTztRQUNFLHNCbkNoeURmOztZbUM0dkRXQzs7Ozs7VUFpRXlDRSxVQWpFekNva0M7O1VBQUpvUzt3QkFpRTZDdjZDO3NCQWpFN0M4L0IsSUFrRW9Cc2IsS0FBTyxPQXBFekJGLGFBRUYvZixHQWtFb0JpZ0IsS0FEeUJwN0MsTUFDSztvQkFsRWxEOC9COzt5QkFpRTZDLzdCO1VBakU3Qys3QjtVQUFJcUk7Ozs7U0FtRXlDa1QsVUFuRXpDbFQ7O1NBQUpzUzt1QkFtRTZDejZDO3FCQW5FN0M4L0IsSUFvRW9Cc2IsS0FBTyxPQXRFekJGLGFBRUYvZixHQW9Fb0JpZ0IsS0FEeUJwN0MsTUFDSzttQkFwRWxEOC9COzt3QkFtRTZDdWI7U0FuRTdDdmI7U0FBSXFJOzs7UUEwQ0Y7O1FBY00sSUFEYW1ULFVBdkRqQm5ULFVBd0RJLE9BMUROK1MsYUFFRnBiLEtBQUVodUIsR0F1RG1Cd3BDO1FBQ2Isc0JuQ3B6RGY7O1FtQ3N6RGUsSUFEYUMsVUF6RGpCcFQsVUEwREksT0E1RE4rUyxhQUVGcGIsS0FBRWh1QixHQXlEbUJ5cEM7UUFDYixzQm5DdHpEZjs7UW1Dd3pEZSxJQURPQyxVQTNEWHJULFVBNERJLE9BOUROK1MsYUFFRnBiLEtBQUVodUIsR0EyRGEwcEM7UUFDUCxzQm5DeHpEZjs7WW1DeXpEMkJDLFVBN0RoQnRULFVBNkRXcmtDLE1BN0RYcWtDO1FBOERGLE9BalBKNlM7aUNBaVBpQyxrQkE5RC9CbGIsS0FBRWh1QixHQThEZ0M7O2lCQURuQmhPO2lCQUFLMjNDOztZQXhCRkMsVUFyQ2R2VCxVQXFDSWxrQyxRQXJDSmtrQztRQXNDRjs7a0JBd0RKd1QsMEJBOUZFN2IsS0FBRWh1QixHQXFDZ0I0cEMsU0FBVnozQzs7UUFDTixPQXdESjAzQyxnQ0E5RkU3YixLQUFFaHVCLEdBcUNnQjRwQyxTQUFWejNDOzs7R0FpQ0g7WUF3QlAwM0MsOEJBR0V4Z0IsR0FBRXJwQixHQUFFdXlCO0lBSE47S0FPVSxJQURJcGdDLGtCQUNKLE9BUFYyM0MsbUJBR0V6Z0IsR0FBRXJwQixHQUFFdXlCLEtBR1FwZ0M7S0FDSixzQm5DajJEZjs7SW1DKzFEUzttQ0FyR0FrM0Msb0JBbUdGaGdCLEdBQUVycEIsR0FBRXV5Qjs7SUFFRixPQXJHQThXLDBCQW1HRmhnQixHQUFFcnBCLEdBQUV1eUI7R0FJc0M7WUF2R3hDNlcsYUFFRi9mLEdBQUVycEIsR0FBRXV5QjtJbkM1dkRYLHVCbUMwdkRTOFcsa0JBRUZoZ0IsR0FBRXJwQixHQUFFdXlCOztZQThGTnVYLG1CQUdFemdCLEdBQUVycEIsR0FBRXV5QjtJbkM3MURYLHVCbUMwMURLc1gsd0JBR0V4Z0IsR0FBRXJwQixHQUFFdXlCOztZQVlGd1gsV0FBVy9wQyxHQUFFNEM7SUFBTSxJQUFOQztJQUFNO2VBQU5BLG9CQWVXO1lBZlhBOztRQUVUO1NBRGV4UixhQUROd1I7U0FDR2UsSUFESGY7U0FFYnhRLElBMTVDSnVpQyx5QkF5NUN1QnZqQztRQURuQjA0QyxXQUFXL3BDLEdBQ0s0RDtRQUVwQiw4QkFIZTVELEdBRVgzTjs7b0JBRmF3USxVQU1HcWxDLE1BTkhybEM7OztTQUFia25DLFdBQVcvcEMsR0FNS2tvQztTQURKLHVCQUxEbG9DO2FBQUU2Qzs7OztRQUFia25DLFdBQVcvcEMsR0FNS2tvQztRQUNKLHVCQVBEbG9DO1lBQUU2Qzs7O1lBWUgzUSxJQVpHMlEsVUFZTm1uQyxNQVpNbm5DO1FBQWJrbkMsV0FBVy9wQyxHQVlKZ3FDO1FBQWlCLGtCQUFkOTNDLEdBWkM4Tjs7WUFhTGlxQyxNQWJPcG5DO1FBQWJrbkMsV0FBVy9wQyxHQWFMaXFDO1FBQWtCLDhCQWJianFDOztZQWNLQyxNQWRINEMsVUFjQXFuQyxNQWRBcm5DO1FBQWJrbkMsV0FBVy9wQyxHQWNFa3FDO1FBQVcsNkJBQVJqcUM7OztZQU5Hb0YsTUFSTnhDLFVBUUdzbEMsTUFSSHRsQztRQUFia25DLFdBQVcvcEMsR0FRS21vQztRQUNRLDhCQVRibm9DLEdBUVFxRjs7WUFFRm5RLElBVkoyTixVQVVDc25DLE1BVkR0bkM7UUFBYmtuQyxXQUFXL3BDLEdBVUdtcUM7UUFDVSw4QkFYYm5xQyxHQVVNOUs7OztHQUtTO1lBSzFCazFDLFdBQVd2MkMsR0FBRStPO0lBQU0sSUFBTkM7SUFBTTtlQUFOQSxvQkFlVztZQWZYQTs7UUFFVDtTQURleFIsYUFETndSO1NBQ0dlLElBREhmO1NBRWJ4USxJQTk2Q0p1aUMseUJBNjZDdUJ2akM7UUFEbkIrNEMsV0FBV3YyQyxHQUNLK1A7UUFFcEIscUNBSGUvUCxHQUVYeEI7O29CQUZhd1EsVUFNR3FsQyxNQU5IcmxDOzs7U0FBYnVuQyxXQUFXdjJDLEdBTUtxMEM7U0FESiw4QkFMRHIwQzthQUFFZ1A7Ozs7UUFBYnVuQyxXQUFXdjJDLEdBTUtxMEM7UUFDSiw4QkFQRHIwQztZQUFFZ1A7OztZQVlIM1EsSUFaRzJRLFVBWU5tbkMsTUFaTW5uQztRQUFidW5DLFdBQVd2MkMsR0FZSm0yQztRQUFpQixrQkFBZDkzQyxHQVpDMkI7O1lBQUUwMEM7O1lBY0d0b0MsTUFkSDRDLFVBY0FvbkMsTUFkQXBuQztRQUFidW5DLFdBQVd2MkMsR0FjRW8yQztRQUFXLDZCQUFSaHFDOzs7WUFOR29GLE1BUk54QyxVQVFHc2xDLE1BUkh0bEM7UUFBYnVuQyxXQUFXdjJDLEdBUUtzMEM7UUFDUSxxQ0FUYnQwQyxHQVFRd1I7O1lBRUZuUSxJQVZKMk4sVUFVQ3NuQyxNQVZEdG5DO1FBQWJ1bkMsV0FBV3YyQyxHQVVHczJDO1FBQ1UscUNBWGJ0MkMsR0FVTXFCOzs7R0FLUztZQU0xQm0xQyxXQUFXeDJDLEdBQUUrTztJQUFNLElBQU5DO0lBQU07ZUFBTkEsb0JBZVc7WUFmWEE7O1FBRVQ7U0FEZXhSLGFBRE53UjtTQUNHZSxJQURIZjtTQUVieFEsSUFuOENKdWlDLHlCQWs4Q3VCdmpDO1FBRG5CZzVDLFdBQVd4MkMsR0FDSytQO1FBRXBCLHFDQUhlL1AsR0FFWHhCOztvQkFGYXdRLFVBTUdxbEMsTUFOSHJsQzs7O1NBQWJ3bkMsV0FBV3gyQyxHQU1LcTBDO1NBREosOEJBTERyMEM7YUFBRWdQOzs7O1FBQWJ3bkMsV0FBV3gyQyxHQU1LcTBDO1FBQ0osOEJBUERyMEM7WUFBRWdQOzs7WUFZSDNRLElBWkcyUSxVQVlObW5DLE1BWk1ubkM7UUFBYnduQyxXQUFXeDJDLEdBWUptMkM7UUFBcUQsc0JBQWxEOTNDO1FBQWtELHFDQVpqRDJCOztZQUFFMDBDOztZQWNHdG9DLE1BZEg0QyxVQWNBb25DLE1BZEFwbkM7UUFBYnduQyxXQUFXeDJDLEdBY0VvMkM7UUFBVyw2QkFBUmhxQzs7O1lBTkdvRixNQVJOeEMsVUFRR3NsQyxNQVJIdGxDO1FBQWJ3bkMsV0FBV3gyQyxHQVFLczBDO1FBQ1EscUNBVGJ0MEMsR0FRUXdSOztZQUVGblEsSUFWSjJOLFVBVUNzbkMsTUFWRHRuQztRQUFid25DLFdBQVd4MkMsR0FVR3MyQztRQUNVLHFDQVhidDJDLEdBVU1xQjs7O0dBS1M7WUFNOUJvMUM7SUFDUSxJQURrQi9YLGdCQUN4QnI3QixNQUFNO2FBQ05teUIsRUFBRXptQjtLQXZCQXluQyxXQXNCRm56QyxLQUNFMEw7S0FBbUMsd0NBRHJDMUw7S0FDcUM7SUFBcUI7SUFDOUQsT0EvYk0rd0MsWUE4YkY1ZSxNQUZ3QmtKOztZQVMxQmdZLG1CQUFtQjM1QztJQUNyQixHQUFHLDBCQURrQkEsY0FDSjtRQUNYZ0YsNEJBRmVoRjthQUdmNDVDO0tBQWlCLE9BQXJCLFdBWkFGLHVCQVNtQjE1QztJQUdtRDthQUM5RDY1QyxhQUFhcjJDO0tBQ25CLElBRG1CQztLQUNuQjtTQURtQkEsUUFGakJ1QixLQUdjLE9BREd2QjtNQUVYLDRCQU5TekQsS0FJRXlEO3NDQUlWLE9BSlVBO01BR0QsSUFIQzBlOztJQUlUO0lBV0MsSUFWSzIzQixTQUxWRCxpQkFnQkpFLE9BWGNEO0lBQ2hCO1FBVUVDLFNBbEJBLzBDLGFBU00sZ0JBWFNoRixLQW9CZis1QyxrQkFSZ0IsSUFIRmptQyxJQVdkaW1DLHFCQVhjam1DO0tBWUg7TUFBWGttQyxXQUFXLDhCQXJCSWg2QyxLQVNEODVDLFFBV2RDLE9BWGNEO01BS0ZHLFNBVlJKLGFBZ0JKRTtNQUdBRyxPQVRZRDtLQUNkO1NBUUVDLFNBckJBbDFDO09BY00sNEJBaEJTaEYsS0F1QmZrNkM7Ozs7O29CQU5zQixJQUhWenZCLE1BU1p5dkIscUJBVFl6dkI7O29CQVNaeXZCO1dBQ0FDOztPQUVBO1FBQUk7OzthQUFjLDhCQTFCSG42QyxLQWNIaTZDLFFBU1pDLE9BVFlEO1NBVVpFOzs7OztxQkFyQkFQOztNQXlCVSxJQUFWUSxVQXhCSVAsYUFtQkpLO1NBS0FFLFlBMUJBcDFDLEtBQ0E0MEM7Ozs2QkFrQkFJOzs7UUFTQUs7K0JBVEFMOzs7Ozt1REFsQkFKOzs7Ozs7dUJBMkJBUztNQU9KLFdBYklGLFFBTUFFOzs7R0FPYztZQU9sQkMscUJBR0F4N0MsS0FBSTZpQztJQUFPLFVBQVg3aUMsa0JBQ3NCLGNBRGxCNmlDO2FBQUo3aUMsWUFFZ0IrdUMsSUFGaEIvdUMsUUFFYTJDLElBRmIzQyxRQUVzQixlQUFUMkMsR0FBR29zQyxJQUZabE07UUFHUWx0QixNQUhaM1Y7SUFHc0IsZUFBVjJWLE1BSFJrdEI7R0FHc0Q7WUFlMUQ0WSxxQkFJQXo3QyxLQUFJRSxNQUN1QjJpQztJQUE3QixVQURNM2lDOytCQUN1QjJpQzs7U0FYYjN1QixJQVVWaFUseUJBVlVnVSxJQVdhMnVCO1FBQU54aUM7SUFDdkIsVUFGRUwsa0JBR3NCLGNBRkRLLFFBQU13aUM7SUFDN0IsU0FGRTdpQztTQUlnQit1QyxJQUpoQi91QyxRQUlhMkMsSUFKYjNDO0tBSXNCLGVBQVQyQyxHQUFHb3NDLElBSEsxdUMsUUFBTXdpQzs7UUFJZmx0QixNQUxaM1Y7SUFLc0IsZUFBVjJWLE1BSlN0VixRQUFNd2lDO0dBSXNDO1lBT2pFNlksa0JBQW1CQyxpQkFBZ0J6NkM7SW5DamdFeEMsR21DaWdFd0J5NkM7U0FrQlpDLE9BbEJZRCxvQkFpQmpCRSxvQkFDS0Q7O1NBRExDO2FBaUJBQyx1QkFBdUIzWixTQUFRNXhCO0tBQ2pDLGtCQTdIQXFxQyx1QkEwRm1DMTVDLEtBa0NWaWhDLFNBQVE1eEI7SUFHaEI7SUFLbkIsU0FBSXdyQyx5QkFBeUJDO0tBQzNCLE9BVEVGLHVCQVF5QkU7SUFFQzthQVUxQkMsdUJBQXVCOVosU0FBUTM4QixHQUFFN0M7S0FDbkMsa0JBakpBaTRDLHVCQTBGbUMxNUMsS0FzRFZpaEMsU0FBUTM4QixHQUFFN0M7SUFHbEI7YUFLZnU1QyxtQkFBbUIvWixTQUFRZ2EsVUFBU3ZzQjtLQUN0QyxrQkF6SkFnckIsdUJBMEZtQzE1QyxLQThEZGloQyxTQUFRZ2EsVUFBU3ZzQjtJQUdYO2FBc3RCekJ3c0IsWUFHQUMsV0FBVWxhLFNBQVFVO0tBQU8sSUFHekIvVCxPQUhVcVQsVUFBVmthO2tCQUdBdnRCO21CQUhrQitUOzttQkFHbEIvVDswQkFEK0IsZ0JBNXhCRTV0QixLQTB4QmpDbTdDLFlBQWtCeFo7OztrQkFHZSw4QkE3eEJBM2hDLEtBMHhCakNtN0MsV0FHQXZ0QjtrQkFIa0IrVDtJQUdtRDthQXh0QmpFeVosTUFLSkQsV0EwakJRTDtLQTlqQlcsSUFxQm5CN1osVUFqQkFrYTtLQUNGO1NBZ0JFbGEsWUF5aUJRNlosU0F6akJnQixPQTRzQnhCSSxZQTdzQkFDLFdBaUJBbGE7TUFmTSw0QkE1RTJCamhDLEtBMkZqQ2loQzs7V0FBUW9hLFlBQVJwYTtVQUFRb2EsY0F5aUJBUCxTQTFsQlJELHlCQTBsQlFDOzs7aUJBdmlCSixnQkE3RjZCOTZDLEtBMkZ6QnE3QzthQU1SQyxZQU5BcmEsU0FBUW9hLG1CQXlpQkFQO2FBbmlCUlEsWUFOQXJhLFNBQVFvYSxXQXlpQkFQO1FBdGpCTTFNO09BQ1osT0F3c0JGOE0sWUE3c0JBQyxXQWlCQWxhLFNBYmNtTjs7O1dBSkptTixZQWlCVnRhLDJCQWpCVXNhOzs7VUFtZFZDLFlBbGNBdmE7U0FrY0F1YSxjQXVHUVY7OztPQXBHRixJQXVDSngyQyxJQXZDSSxnQkFoaUIyQnRFLEtBNmhCakN3N0M7Z0JBMENFbDNDOztTQXZDSSxlQXVDSkE7Ozs7OzsyQkFLRm0zQyxhQS9DQUQsbUJBdUdRVjs7Ozs7Y0EzRk1wTSxhQXBlVjBNLE1Bd2RKSSxtQkF1R1FWO29DQTNGTXBNOzs7c0JBOEJacHFDOzs7MEJBS0ZtM0MsYUEvQ0FELG1CQXVHUVY7Ozs7O2FBaEdNak0sYUEvZFZ1TSxNQXdkSkksbUJBdUdRVjttQ0FoR01qTTs7OztzQkFtQ1p2cUM7O1NBaEJZMHFDLGFBbGZWb00sTUF3ZEpJLG1CQXVHUVY7K0JBN0VNOUw7cUJBZ0JaMXFDOzs7O1lBeEJZNnFDLGFBMWVWaU0sTUF3ZEpJLG1CQXVHUVY7b0NBckZNM0w7Ozs7V0FrQnNCO2NBcENwQ3FNLHFCQXVHUVY7dUJBbkU0QixnQkFqa0JIOTZDLEtBNmhCakN3N0M7O2FBcUNjak0sYUE3ZlY2TCxNQXdkSkksbUJBdUdRVjttQ0FsRU12TDs7Ozs7YUFHQU8sYUFoZ0JWc0wsTUF3ZEpJLFdBdUdRVjtvQ0EvRE1oTDs7OztZQXpCQU8sYUF2ZVYrSyxNQXdkSkksbUJBdUdRVjtvQ0F4Rk16Szs7OztZQWNBSyxhQXJmVjBLLE1Bd2RKSSxtQkF1R1FWO2tDQTFFTXBLOzs7ZUE0Q2RnTCxZQXpFQUY7OztvQkF5RUFFLGNBOEJRWjtvQ0EzQmtCLGdCQXptQk85NkMsS0FzbUJqQzA3QztxQkFHb0Q7WUFDbEM7YUFBWkMsWUF3SU45QixhQTVJQTZCLG1CQThCUVo7YUF6QkEsMEJBM21CeUI5NkMsS0EwbUIzQjI3Qzs7Ozs7OzJCQWlCRztZQWRrQjt1QkEwSjNCQyxjQTdKTUQsV0EwQkViO2FBdkJXclo7YUFBWG9hO2FBQ0VDLFlBb0lWakMsYUFySVFnQyxXQXVCQWY7YUFyQkksNkJBL21CcUI5NkMsS0E4bUJ2Qjg3Qzs7OztjQUdRO2VBQUpyNkM7aUJBQUk7O21CQWpuQmV6QjttQkFzbUJqQzA3QztvQkFRVUksWUFSVko7ZUFZeUIsV0FEWGo2QyxHQUpLZ2dDO2VBS00sT0FKZnFhO2VBUEVDO2VBQVZDOzs7O2FBYWdDO3dCQW1KbENKLGNBekpVRSxXQXNCRmhCO2NBaEJpQm5mO2NBQVhzZ0I7Y0FDQUMsWUE2SGRyQyxhQTlIY29DLFdBZ0JObkI7dUJBZEssZ0JBdG5Cb0I5NkMsS0FxbkJuQms4QztjQUMyQjthQUN2QjtjQUFKem5DO2dCQUFJOztrQkF2bkJlelU7a0JBc21CakMwN0M7bUJBZWNRLFlBZmRSO2NBa0J5QixXQURYam5DLEtBVktndEIsT0FPTTlGO2NBSUEsT0FIWHVnQjtjQWRGSDtjQUFWQzs7Ozt5QkFrQmE7Ozs7OztnQkFsQkhELG1DQUFWQyxXQURGTjs7O1lBeUJVekssY0ExakJObUssTUFraUJGWSxVQTZCTWxCOytCQTdCSWlCLGtCQXdCRjlLOzs7ZUFLVmtMLFlBdkdBWDtXQXdHRjtZQUVvQjthQUFaWSxjQTJHTnZDLGFBOUdBc0MsV0FBUXJCO2FBSUEsMEJBeG9CeUI5NkMsS0F1b0IzQm84Qzs7Ozs7OzthQUdvQjt3QkE2SDFCUixjQWhJTVEsYUFIRXRCO2NBTVdsdEI7Y0FBWHl1QjtjQUNBQyxjQXVHUnpDLGFBeEdRd0MsYUFOQXZCO3VCQVFELGdCQTVvQjBCOTZDLEtBMm9CekJzOEM7Y0FDMkI7YUFDdkI7Y0FBSkM7Z0JBQUk7O2tCQTdvQnFCdjhDO2tCQW9vQmpDbThDO21CQU9RRyxjQVBSSDs2QkFPUUcseUJBRUFDLEtBSFczdUI7Ozs7Ozs7Ozs7Ozs7OzthQVNINHVCO2FBQVZDO2FBQ01wTCxjQS9rQlIrSixNQThrQkVxQixZQWZFM0I7NkJBZVEwQixrQkFDSm5MOzs7YUFHQUksY0FsbEJSMkosTUErakJKZSxXQUFRckI7a0NBbUJJcko7Ozs7O1lBbkdFYixjQS9lVndLLE1Bd2RKSSxtQkF1R1FWO2tDQWhGTWxLOzs7O1lBV0FFLGNBMWZWc0ssTUF3ZEpJLG1CQXVHUVY7a0NBckVNaEs7Ozs7Ozs7O1NBU0F2QyxhQW5nQlY2TSxNQXdkSkksbUJBdUdRVjtnQ0E3RE54MkMsSUFDWWlxQzs7VUF2ZkFEO01BQ1osT0Fxc0JGNE0sWUE3c0JBQyxXQWlCQWxhLFNBVmNxTjs7SUFYMEM7YUEyS3hEb087S0F3b0JtQkM7S0FBUTFiO0tBOU5KNlo7S0F2YUM4QjtLQUFLdGlDO0tBQUt1aUM7S0FBTXo3QztLQUFJdEM7S0FBSUU7S0FBSzg5QztLQXFvQkZ2RztLQW5vQnBDO01BQWJ3RztNQUEyQkM7TUFDM0JDO01BQTJCQztNQUMzQkM7TUFBMkJDO2NBRzNCQyxnQkFMQU4sa0JBS0osT0FQMEJILEtBT21CO2NBQ3pDVSxnQkFOMkJOLHlCQUZBMWlDLEtBUVk7Y0FDdkNpakMsaUJBTkFOLDBCQUhnQ0osTUFTVTtjQUMxQ1csZUFQMkJOLHdCQUhXOTdDLElBVUU7Y0FDeENxOEMsZUFQQU4sd0JBSjBDcitDLElBV0Y7Y0FDeEM0K0MsZ0JBUjJCTix5QkFKbUJwK0MsS0FZTDtjQUN6QzIrQyxtQkFUQVIsd0JBSm1ETCxRQWFQO2NBRTVDYztNQVlELElBQ0k5K0MsTUFqQkgyK0MsWUFnQmlCLFFBZmpCQztNQWVpQix5Q0FDTyxPQUFyQjUrQztrQ0FDcUI7ZUFEckJBOztpQkEvUEw2N0M7O21CQSszQkFrRCxrQkF2Qm1CbEIsU0FBUTFiO2lCQXptQnRCbmlDO3FCQVEyQixPQVIzQkE7VUFFb0JpRSxJQUZwQmpFO01BR0EsT0FsUUw2N0M7dUJBaVF5QjUzQztnQkE4bkJ6Qjg2QyxrQkF2Qm1CbEIsU0FBUTFiO0tBaG1CUTtjQUdqQzZjLFdBQVd2SCxNQUFpQnozQztNQUM5QixVQUQ4QkEsa0JBRWQsT0FGY0E7OztpQkEzUTlCNjdDOzttQkErM0JBa0Qsa0JBdkJtQmxCLFNBQVExYixTQTdsQmRzVjtpQkFBaUJ6M0M7cUJBR08sT0FIUEE7VUFLUjJpQyxRQUxRM2lDO01BTTVCLE9BalJGNjdDO3VCQWdSc0JsWjtnQkErbUJ0Qm9jLGtCQXZCbUJsQixTQUFRMWIsU0E3bEJkc1Y7S0FVb0M7Y0FNL0N3SCxXQUFXejVDLEdBQXFCeEY7TUFBd0IsVUFBeEJBLGtCQUNsQjtlQURrQkE7OztjQU1iMmlDLFFBTmEzaUM7VUFPaEMsT0FsU0Y2N0M7d0JBaVNxQmxaO29CQThsQnJCb2Msa0JBdkJtQmxCLFNBQVExYixTQTdrQmQzOEI7O2NBRVM0eEMsVUFGWXAzQyxRQUVGLFdBQVZvM0M7O2NBQ0E4SCxVQUhZbC9DO1VBSWhDLE9BL1JGNjdDO3dCQThSc0JxRDtvQkFpbUJ0Qkgsa0JBdkJtQmxCLFNBQVExYixTQTdrQmQzOEI7O01BU00sT0EybEJuQnU1QyxrQkF2Qm1CbEIsU0FBUTFiLFNBN2tCZDM4QjtLQVMrQztjQUUxRDI1QyxZQUFZMzVDLEdBQUksT0FYaEJ5NUMsV0FXWXo1QyxHQXhEWm01QyxZQXdEeUM7Y0FDekNTLGdCQUFnQjU1QyxHQUFJLE9BWnBCeTVDLFdBWWdCejVDLEdBdkRoQnE1QyxnQkF1RGlEOztLQVdyRCxVQXNqQnFEcEg7Ozs7OztVQXZhdkNwSCxhQTdZUmlNLE1Bb3pCdUJuYSxTQTlOSjZaO1VBeFZyQnFELHNCQStJVWhQOzs7U0FnQkU7VUFBVmlQLFVBK1RKQyxxQkF3RjJCcGQsU0E5Tko2WjtVQXhMWGhMLGFBOVpSc0wsTUE2WkFnRCxpQkF5TG1CdEQ7VUF2TFh3RCxVQS9aUmxELE1Bb3pCdUJuYSxTQXZadkJtZDtVQUdBdFosWUF6b0ROZ0ksYUF3b0Rjd1I7U0FFVCxHQXhPRGQ7VUF5T2M7V0FBVmUsZ0JBaExKTixpQkE4S0VuWjsyQkFFRXlaLFdBSk16Tzs7OEJBNUtWbU8saUJBOEtFblosV0FGUWdMO2FBaEtWcU87OzswQkE5UEUvQyxNQW96QnVCbmEsU0E5Tko2Wjs7U0EvVHBCO1VBRFNsSyxjQXRSUndLLE1Bb3pCdUJuYSxTQTlOSjZaO1VBL1RwQjtZQTlGRDBDLHlCQTZGVTVNO1VBeEJWdU47OzthQTJEVTFNLGNBelRSMkosTUFvekJ1Qm5hLFNBOU5KNlosYUE1Um5CMEQ7U0FDRCxHQWxJRGhCO1VBbUljO1dBQVZpQixpQkFGRkQ7MkJBRUVDLFdBSE1oTjs7OEJBQ1IrTSxXQURRL007YUEzRFYwTTs7O1NBc0NRO1VBQU5wK0MsUUE3RUYrOUMsV0E2bEJpRHZILE1BeG5CakRvSDtVQXlHVS9MLGNBclNSd0osTUFvekJ1Qm5hLFNBOU5KNlo7U0FoVHBCLEdBN0dEMEM7VUE4R2M7V0FBVmtCLGdCQXBESlI7MkJBb0RJUSxXQUZNOU07O1VBTVI7cUJBclpOMEkscUJBOFlNdjZDLE9BQ1E2eEM7V0FLaUJFO1dBQU4zeEM7aUNBQU0yeEM7YUE1QzNCcU07OztZQXNqQnlCbGQsWUE5Tko2WixTQWpuQnZCRCx5QkFpbkJ1QkM7U0FHVjtVQUFYaDZDLFdBdm9GSmlnQztVQXdvRkkzRixvQkFBUzkyQixHQUNYLE9BdG9GRjA4QixnQkFvb0ZJbGdDLFVBQ1N3RCxHQUNlO1VBRXhCcTZDO3FCQUFVaGdDLEtBQUVyYTthQUNkLEdBRGNBLEtBQUZxYTtrQkFDWm5iLElBRFltYjs7ZUF4b0ZkcWlCLGdCQW9vRklsZ0MsVUFNeUIsdUJBRDNCMEM7ZUFDRSxXQURGQTtrQkFEY2MsTUFDZGQ7Ozs7O1lBRUk7VUFHRm83QztxQkFBb0IzZDthQUN0QixrQkFud0JGeVksdUJBMEZtQzE1QyxLQXdxQlhpaEM7WUFHMEI7VUFVOUM0ZDs4QkFBdUI1ZCxTQUFRNlo7YUFDakMsSUFEeUJVO2FBQ3pCO2lCQUR5QkEsY0FBUVYsU0Ezb0JqQ0QseUJBMm9CaUNDO2NBRTNCLElBTUp4MkMsSUFOSSxnQkF2ckIyQnRFLEtBcXJCUnc3Qzt3QkFRdkJsM0M7ZUE5QkE4MkI7bUJBc0J1Qm1nQjs7O3dCQVF2QmozQyxHQUpBLE9BSnVCazNDOztjQVN2Qjs7d0JBR0FzRCx1Q0FaK0JoRSxTQVEvQngyQzs7Y0FDQSxPQUdBdzZDLDZDQVorQmhFLFNBUS9CeDJDOztZQUNpRDtVQUdqRHc2Qzs4QkFBMEI3ZCxTQW9CUzZaLFNBcEJPeDJDO2FBQzVDLElBRDRCazNDLHFCQW9CaUI3OEIsTUFwQkRyYTthQUM1QztpQkFENEJrM0MsY0FvQlNWLFNBM3FCckNELHlCQTJxQnFDQztjQWxCL0IsSUFGc0NsOEIsTUFFdEMsZ0JBbnNCMkI1ZSxLQWlzQkx3N0M7dUJBQWdCNThCOzs7bUNBbEMxQ3djLFNBc0QyQ3pjLE1BaEIzQyxPQUowQjY4Qjs7NkJBQWdCNThCOzs7bUJBb0JmeThCLFlBcEJERztrQkFvQkNILGNBQVFQLFNBM3FCckNELHlCQTJxQnFDQztlQUUvQixJQWFKajhCLE1BYkksZ0JBdnRCMkI3ZSxLQXF0QkpxN0M7eUJBZTNCeDhCO29CQWYyQnc4Qix1QkFBUVA7aUJBM3FCckNELHlCQTJxQnFDQztnQkFTdkIsSUFDUmg4QixNQURRLGdCQTl0Qm1COWUsS0FxdEJKcTdDOzBCQVV2QnY4QjtpQkFHSyxPQTFEVDgvQixvQkE2QzJCdkQ7Z0JBbkQzQnNELFVBbUQyQ2hnQyxLQVV2Q0c7MkJBVnVCdThCO2dCQVd2Qjs7MEJBM0NKd0Qsa0NBZ0NtQy9EOztnQkFXL0IsT0EzQ0orRCx3Q0FnQ21DL0Q7O3lCQWVuQ2o4QjtnQkFyRUF1YyxTQXNEMkN6YztnQkF0RDNDeWM7Z0JBMkRBLE9BTDJCaWdCOztlQW5EM0JzRCxVQW1EMkNoZ0MsS0FlM0NFOzBCQWYyQnc4QjtlQWdCM0I7O3lCQWhEQXdELGtDQWdDbUMvRDs7ZUFnQm5DLE9BaERBK0Qsd0NBZ0NtQy9EOztvQ0FBUW44QjtlQXREM0N5YyxTQWtDMEN4YzswQkFBaEI0OEI7ZUFTMUI7O3lCQXJCQXFELGtDQWdDbUMvRDs7ZUFYbkMsT0FyQkErRCx3Q0FnQ21DL0Q7O3dCQUFRbjhCLEtBN0MzQ2lnQyxvQkF5QjBCcEQ7Y0FsQzFCcGdCLFNBc0QyQ3pjOztlQXBCakI0OEI7O2VBb0JpQjU4QixNQXBCREM7O1lBaUJRO1VBakJsRG1nQztxQkFBMEI5ZCxTQW9CUzZaLFNBcEJPeDJDO2FuQ2xzRm5EO3NCbUNrc0ZTdzZDLCtCQUEwQjdkLFNBb0JTNlosU0FwQk94MkM7O1lBd0xqQjI4QixZQTlOSjZaLFNBam5CdkJELHlCQWluQnVCQzttQkErRWpCLGdCQTF1QjJCOTZDLEtBeTNCTmloQztjQWpKekJ1YSxZQWlKeUJ2YSxpQkFqSmhCK2QsYUF6RGdCekQsWUF5RHpCQzs7Y0FBU3dELGFBekRnQnpELFlBME1BdGE7WUExTUFzYSxjQXBCSlQsU0FqbkJ2QkQseUJBaW5CdUJDO1NBc0JmO1VBQUp4MkMsSUFBSSxnQkFqckJ5QnRFLEtBK3FCTnU3QztVQThEekJTLFdBNUNBK0MsMEJBbEJ5QnhELG1CQXBCSlQsU0FzQm5CeDJDO1VBNkRGKzhCLGFBOXNGSkYsZ0JBOG5GSXJnQztVQWxMWW0rQyxhQTRQSEQsVUFwc0ZiNWQsYUEwc0ZJQztVQWpRVXlSLGNBeGFSc0ksTUF3cUJGWSxVQWxGcUJsQjtTQTdLcEIsR0FoUEQwQztVQWlQYztXQUFWMEIsaUJBeExKakIsaUJBcUxZZ0I7MkJBR1JDLFdBRk1wTTs7OEJBdExWbUwsaUJBcUxZZ0IsWUFDRm5NO2FBMUtWcUw7Ozs7VUFxSVVqTCxjQW5ZUmtJLE1Bb3pCdUJuYSxTQTlOSjZaO1VBeFZyQnFELHNCQXFJVWpMOzs7U0F0SEE7VUFYUmlNO3FCQUFZL1E7YUFDZCxPQTFFQW9QLHlCQXlFY3BQO1lBR2M7VUFPbEJnUixjQTVRUmhFLE1Bb3pCdUJuYSxTQTlOSjZaO1VBelVYLFVBM0JWbUQ7OztXQXNCRzs7Y0EvRUhULHlCQW1GVTRCOzs7OztjQWhVWnpFO2lCQXNUSXdFLFlBVVFDO2lCQS9TWnhFO2tCQXUxQjJCM1o7Ozs7cUJBbGpCdkJrZSxZQVVRQzthQWRWakI7OztTQTRJQztVQURTa0IsY0F6WVJqRSxNQW96QnVCbmEsU0E5Tko2WjtVQTVNcEI7WUFqTkQwQyx5QkFnTlU2QjtVQTNJVmxCOzs7U0E0QlE7VUFBTjFPLFFBbkVGcU8sV0E2bEJpRHZILE1BeG5CakRvSDtVQStGVTJCLGNBM1JSbEUsTUFvekJ1Qm5hLFNBOU5KNlo7U0ExVHBCLEdBbkdEMEM7VUFvR2M7V0FBVitCLGlCQTFDSnJCOzJCQTBDSXFCLFlBRk1EOztVQU1SO3FCQTNZTmhGLHFCQW9ZTTdLLE9BQ1E2UDtXQUtpQkU7V0FBTjlQO2tDQUFNOFA7YUFsQzNCckI7Ozs7VUF3SVVzQixjQXRZUnJFLE1Bb3pCdUJuYSxTQTlOSjZaO1VBeFZyQnFELHNCQXdJVXNCOzs7U0FhRTtVQUFWQyxZQXlVSnJCLHFCQXdGMkJwZCxTQTlOSjZaO1VBbE1YNkUsWUFwWlJ2RSxNQW96QnVCbmEsU0FqYXZCeWU7VUFFUUUsY0FyWlJ4RSxNQW1aQXNFLG1CQW1NbUI1RTtVQWhNbkI5VixjQS9uRE44SCxhQTZuRGM2UztTQUdULEdBOU5EbkM7VUErTmM7V0FBVnFDLGlCQXRLSjVCLGlCQW9LRWpaOzJCQUVFNmEsWUFITUQ7OzhCQW5LVjNCLGtCQW9LRWpaLGFBRFE0YTthQXZKVnpCOzs7O1NBMkhRO1VBQU41K0MsUUFsS0Z1K0MsV0E2bEJpRHZILE1BeG5CakRvSDtVQThMVXROLGFBMVhSK0ssTUFvekJ1Qm5hLFNBOU5KNlo7U0EzTnBCLEdBbE1EMEM7VUFtTWM7V0FBVnNDLGdCQXpJSjVCOzJCQXlJSTRCLFdBRk16UDs7VUFNUjtxQkExZU5pSyxxQkFtZU0vNkMsT0FDUTh3QztXQUtpQks7V0FBTmh4QztpQ0FBTWd4QzthQWpJM0J5Tjs7Ozs7VUFrSlU1TyxhQWhaUjZMLE1Bb3pCdUJuYSxTQTlOSjZaO1VBeFZyQnFELHNCQXNqQmlENUgsTUFwYXZDaEg7Ozs7OztZQW9hZXRPLFlBOU5KNlo7OztVQXRSa0M7V0FzYzdDaUYsU0F0YzZDLGdCQXJZeEIvL0MsS0F5M0JOaWhDO1dBOUNSLE9BQVA4ZTs7Ozs7Ozs7Ozs7OztVQXRjZ0M7OztjQUNoQzFPLGNBalVSK0osTUFvekJ1Qm5hLFNBOU5KNlo7b0JBOE40QnZFOzs7O21CQWxmL0N0MUM7Ozs7O3lCQWtmK0NzMUMsVUFsZi9DdDFDOztXQTJjd0I7VUExY3pCLEdBMUlEdThDO1dBMkljO1lBQVZ3QyxpQkFGRi8rQzs0QkFFRSsrQyxXQUhNM087OytCQUNScHdDLFNBRFFvd0M7Y0FuRVY4TTs7Ozs7Ozs7O3VCQWlMRixXQTlrQkZ6RSx1QkEwRm1DMTVDLEtBeTNCZDI4QyxTQUFnQ3BHOzs7Ozs7OztTQXJnQmpEO2lCQXZIQWdIO1VBc0h5RCxPQXZIekREO1VBdUhFMzlDO1lBa2VKc2dELGlCQW9DbUJ0RCxTQUFRMWIsU0E5bkJ6Qm9jLHlCQThuQmlEOUc7VUFwZ0J2Q3RFLGNBaFRSbUosTUFvekJ1Qm5hLFNBOU5KNlo7U0FyU3BCLEdBeEhEMEM7VUF5SGM7V0FBVjBDLGdCQUpGdmdELFNBNURGcytDOzJCQWdFSWlDLFdBRk1qTzs7VUFNOEI7a0JBM0h4Q3lMO1dBMkhFLFVBM1lObkQscUJBbVJJcUQsc0JBa0hVM0w7V0FLd0JTO1dBQVByRDtXQUFOaHZDOzBCQVBuQlYsU0FPbUJVLE9BQU1ndkMsUUFBT3FEO2FBdkRsQ3lMOzs7Ozs7Ozs7O1NBaUg4QjtVQXFjYWdDLFVBNW5CM0M1QztVQTRuQnNDNkMsU0E3bkJ0QzlDO1VBNm5CaUMrQyxTQTluQmpDaEQ7VUErbkJBM0M7WUFEaUMyRjtlQUFVRjtpQkF4MkI3Q3hGOzttQkErM0JBa0Qsa0JBdkJtQmxCLFNBQVExYjs7ZUFBa0JrZjs7U0FTL0MsU0FUcUQ1Sjs7Ozs7Ozs7Ozs7Ozs7ZUFTakQrSjs7O3VCQVRpRC9KOzs7Ozs7Ozs7Ozs2QkFTakQrSjs7Ozs7O2FBVHNDRjtxQkFBVzdKLFVBU2pEK0o7O3lCQVRpRC9KLFVBU2pEK0o7O1dBVUc7O1NBQ1A7VUEzZE14Z0QsWUF3Y0Y0NkMsTUFRQTRGO1VBN2NVeFAsY0FoWFJzSyxNQW96QnVCbmEsU0E5Tko2WjtTQXJPcEIsR0F4TEQwQztVQStEd0IsWUE3RHhCRTs7OzJCQWdwQkZHLGtCQXZCbUJsQixTQUFRMWI7O2VBMWpCWGtCO1VBd0hBO1dBQVZvZSxnQkFoSUp0QzsyQkFnSUlzQyxXQUZNelA7OztVQU0wQjtrQkEzTHBDNE07V0EyTEUsVUEzY05uRCxxQkErUUlrRCxrQkFzTFUzTTtXQUt3Qkc7V0FBUHJ4QztXQUFOQzswQkFSbkJDLE9BUW1CRCxPQUFNRCxRQUFPcXhDO2FBdkhsQ2tOOzs7Ozs7Z0JBc2pCaUQ1SDs7Ozs7V0F6ZWhDO21DQWhaY3YyQyxLQXkzQk5paEM7WUF6ZXZCLE9BbkpGc2M7WUFrSnFELE9BbkpyREQ7WUFrSkVwK0M7Y0F1Y0orZ0Q7Z0JBb0NtQnRELFNBQVExYixpQkE5bkJ6Qm9jO1lBc0pValAsV0E1VVJnTixNQW96QnVCbmEsaUJBOU5KNlo7V0F6UXBCLEdBcEpEMEM7WUFxSmM7YUFBVmdELGNBTEZ0aEQsT0F2RkYrK0M7NkJBNEZJdUMsU0FGTXBTOztZQU04QjtvQkF2SnhDc1A7YUF1SkUsVUF2YU5uRCxxQkFtUklxRCxzQkE4SVV4UDthQUt3QkU7YUFBUG52QzthQUFOSjs0QkFSbkJHLE9BUW1CSCxPQUFNSSxRQUFPbXZDOzs7Ozs7V0FNSDttQ0E1WkF0dUMsS0F5M0JOaWhDO1lBN2RULE9BL0poQnNjO1lBK0pFLE9BaEtGRDtZQThKRWorQztjQTJiSjRnRDtnQkFvQ21CdEQsU0FBUTFiLGlCQTluQnpCb2M7WUFrS1U5TyxhQXhWUjZNLE1Bb3pCdUJuYSxpQkE5Tko2WjtXQTdQcEIsR0FoS0QwQztZQWlLYzthQUFWaUQsZ0JBTEZwaEQsU0FuR0Y0K0M7NkJBd0dJd0MsV0FGTWxTOztZQU04QjtvQkFuS3hDbVA7YUFtS0UsVUFuYk5uRCxxQkFtUklxRCxzQkEwSlVyUDthQUt3Qkc7YUFBUHB2QzthQUFOTDs0QkFSbkJJLFNBUW1CSixPQUFNSyxRQUFPb3ZDOzs7O3lCQS9GbEN5UDs7O3FCQXNqQmlENUg7T0FqZGhDOytCQXhhY3YyQyxLQXkzQk5paEM7UUFqZHZCLE9BM0tGc2M7UUEwS3FELE9BM0tyREQ7UUEwS0U5OUM7VUErYUp5Z0Q7WUFvQ21CdEQsU0FBUTFiLGlCQTluQnpCb2M7UUE4S1V4TyxhQXBXUnVNLE1Bb3pCdUJuYSxpQkE5Tko2WjtPQWpQcEIsR0E1S0QwQztRQTZLYztTQUFWa0QsZ0JBTEZsaEQsU0EvR0Z5K0M7eUJBb0hJeUMsV0FGTTdSOztRQU04QjtnQkEvS3hDNk87U0ErS0UsVUEvYk5uRCxxQkFtUklxRCxzQkFzS1UvTztTQUt3Qkc7U0FBUHZ2QztTQUFOTDt3QkFSbkJJLFNBUW1CSixPQUFNSyxRQUFPdXZDO1dBM0dsQ21QOzs7Ozs7VUFzTEYsV0FubEJGekUsdUJBMEZtQzE1QyxLQXkzQk5paEMsaUJBQXdCc1Y7O1lBeDJCbkRvRTtxQkFxT0VvQyxjQUZzQjREO2lCQTRwQnhCOUMsa0JBdkJtQmxCLFNBQVExYixTQUF3QnNWO3FCQW5vQnRCeUcsY0FGQTREO2lCQTRwQjdCL0Msa0JBdkJtQmxCLFNBQVExYixTQUF3QnNWO3FCQWxvQmpEMEcsZUFIZ0M0RDtrQkE0cEJsQ2hELGtCQXZCbUJsQixTQUFRMWIsU0FBd0JzVjs7a0JBam9CakQ0RztxQkFnUmlCLGtCQXBSeUJyK0M7TUFvUnpCLFNBd1luQisrQyxrQkF2Qm1CbEIsU0FBUTFiLFNBQXdCc1Y7O2tCQWpvQnRCNkc7cUJBa1JWLGtCQXRSNkJwK0M7TUFzUjdCO2tCQXRScUJvQyxXQXFvQldtMUM7T0F1Qm5Ec0gsa0JBdkJtQmxCLFNBQVExYjs7VUFyb0JINmYsU0FBZ0IxL0MsTUFBaEJ3N0MsT0FBZ0J4N0M7U0FBaEIwL0MsUUE0cEJ4QmpELGtCQXZCbUJsQixTQUFRMWI7O29CQWxvQkVpYyxhQUhXNkQ7OztlQXFvQld4Szs7Ozs7dUJBeDJCbkRvRTtvQkErM0JBa0Qsa0JBdkJtQmxCLFNBQVExYixTQUF3QnNWOztLQWxXL0MsT0FwTkY0SDs7YUE1R0Y2QztLQUdBckUsU0FBUTFiLFNBQVE2WixTQUFRbUcsT0FBTXJFLE1BQUt0aUMsTUFBS3VpQyxPQUFNejdDLEtBb0I5Q3RDLEtBcEJzREU7S0FDeEQsR0FEVWlpQyxZQUFRNlosU0FoTGhCRCx5QkFnTGdCQztjQUVkb0csV0FBOEJwRTtNQUNoQyxPQW9CQUo7ZUF2QkFDO2VBQVExYjtlQUFRNlo7ZUFBYzhCO2VBQUt0aUM7ZUFBS3VpQztlQUFNejdDO2VBb0I5Q3RDO2VBcEJzREU7ZUFFdEI4OUM7ZUFFakIsZ0JBOU5rQjk4QyxLQTBOekJpaEM7S0FJb0I7ZUFnQjVCbmlDLGtCQUFPLE9BbEJMb2lELFdBa0JGcGlEO2VBcEJzREUsNkJBYy9CLE9BWnJCa2lEO1FBRnNCRDtnQkFBOEJqaUQsbUJBa0IzQixPQWhCekJraUQ7VUFjc0JuK0MsSUFoQjhCL0Q7TUFnQmQsT0FkdENraUQsa0JBY3NCbitDOztlQWhCOEIvRCxtQkFpQjFCLE9BZjFCa2lEO1NBYXVCcHNDLE1BZjZCOVY7S0FlYixPQWJ2Q2tpRCxrQkFhdUJwc0M7SUFLSjthQXhFckJxc0M7S0FpQkF4RSxTQWRRMWIsU0FjUTZaLFNBQVFtRyxPQUFNckUsTUFBS3RpQyxNQUFLdWlDLE9BQU16N0MsS0FBSXRDO0tBYnBELEdBRFVtaUMsWUFjUTZaLFNBN0loQkQseUJBNklnQkM7S0FaWixJQUlKdkUsT0FKSSxnQkEzSzZCdjJDLEtBeUt6QmloQztlQU1Sc1Y7TUFDQSxPQWlFQW1HO2VBMURBQztlQWRRMWI7ZUFjUTZaO2VBQWM4QjtlQUFLdGlDO2VBQUt1aUM7ZUFBTXo3QztlQUFJdEM7OztlQVJsRHkzQztTQVFRaUYsWUFkQXZhO1FBY0F1YSxjQUFRVixTQTdJaEJELHlCQTZJZ0JDO2NBRWRzRyxjQUFjSCxPQUFNaGdCO01BQ3RCO09BQW9CLFFBOGpCcEJvZ0IsZUEvakJzQnBnQixTQUZONlo7T0FHSDk3QztPQUFUc2lEO01BRUUsT0EyQk5OO2VBaENBckU7ZUFHSTJFO2VBSFl4RztlQUVBbUc7ZUFGY3JFO2VBQUt0aUM7ZUFBS3VpQztlQUFNejdDO2VBQUl0QzttQkFHckNFO0tBRWE7S0FDdEIsSUFFSitnRCxTQUZJLGdCQTdMNkIvL0MsS0F1THpCdzdDO2NBUVJ1RTtzQkFEYyxPQUxacUIsY0FGc0JILE9BQWhCekY7O21CQVFSdUU7OztTQVdBLE9BYUFpQjtrQkFoQ0FyRTtrQkFBUW5CO2tCQUFRVjtrQkFBUW1HO2tCQUFNckU7a0JBQUt0aUM7a0JBQUt1aUM7a0JBQU16N0M7a0JBQUl0Qzs7OztZQXRLbEQ2N0M7VUF1TEE7a0JBakJRYTtXQUFnQitGLDJCQVF4QnhCO1VBU0EsT0FmRXFCLGNBRnNCRzs7OztZQXRLeEI1RztlQXNNQXFHO2dCQWhDQXJFO2dCQUFRbkI7Z0JBQVFWO2dCQUFRbUc7Z0JBQU1yRTtnQkFBS3RpQztnQkFBS3VpQztnQkFBTXo3QztnQkFBSXRDOztlQWpJbERpOEMsdUJBaUlRUztJQU5lO2FBaEZ2QkYsWUFpQ0FxQixTQW5CaUIxYixTQW1CRDZaLFNBQW1DMTVDO0tBOUJyRDtNQUFJc2U7TUFBcUJ1aEM7TUFDckJyRTtNQUFxQkM7TUFDckJ2aUM7Y0FDQWtuQyxTQUFTdmdCLFNBQVF5WjtNQUVuQixXQUZtQkEsMkJBdEZuQkM7O09BMkZnQiwyQkE1R2lCMzZDLEtBdUd0QmloQztPQUdULFdBcE1KeVksdUJBMEZtQzE1QyxLQXVHdEJpaEM7O01BQVF5Wjs7S0FNTjtTQXFCTGMsWUFuQlN2YTtLQUNqQjtTQWtCUXVhLGNBQVFWLFNBeEZoQkQseUJBd0ZnQkM7TUFqQkosK0JBakhxQjk2QyxLQWtJekJ3N0M7Ozs7VUEzQk5nRyxTQTJCTWhHLFdBN0JlcUI7VUFpQmQsSUFQUXRCLFlBbUJUQywrQkFuQlNEOzs7VUFSZmlHLFNBMkJNaEcsV0E1Qk5saEM7VUFlTyxJQU5RK2dDLFlBbUJURywrQkFuQlNIOzs7VUFSZm1HLFNBMkJNaEcsV0E3Qk5vQjtVQWVPLElBTFFsQixZQW1CVEYsK0JBbkJTRTs7O1VBUmY4RixTQTJCTWhHLFdBOUJleUY7VUFlZCxJQUpROUUsWUFtQlRYLCtCQW5CU1c7OztVQVJmcUYsU0EyQk1oRyxXQTlCTjk3QjtVQWNPLElBSFEraEMsWUFtQlRqRywrQkFuQlNpRzs7OztPQW1CNEJaLFVBN0J0QmhFO09BNkJpQitELFNBNUJ0Q3RtQztPQTRCaUNxbUMsU0E3QmpDL0Q7T0E2QjJCMkUsVUE5Qk5OO09BOEJDUyxTQTlCdEJoaUM7U0E4Qk04N0IsY0FBUVYsU0F4RmhCRCx5QkF3RmdCQztNQVNaO09BUEZ4WDtTQUZzQm9lO1lBQUtIO2NBakg3QjVHOztnQkErM0JBa0Qsa0JBOXdCQWxCLFNBQVFuQjs7WUFBcUIrRjtPQVN6Qix3QkEzSTZCdmhELEtBa0l6Qnc3Qzs7O1FBV2E7bUJBMm1CckI2RixlQXRuQlE3RixXQUFRVjtTQVdIclo7U0FBVDZmO1FBRUYsT0F1QkZIO2lCQXBDQXhFO2lCQVdJMkU7aUJBWFl4RztpQkFBYXlHO2lCQUFNWjtpQkFBS0M7aUJBQUtDO2lCQUFNei9DO3FCQUVqRGtpQyxPQVNXN0I7Ozs7T0FLUCxPQW9CTjBmO2dCQXBDQXhFO2dCQUFRbkI7Z0JBQVFWO2dCQUFheUc7Z0JBQU1aO2dCQUFLQztnQkFBS0M7Z0JBQU16L0M7b0JBRWpEa2lDOzs7Z0JBbkhGcVg7VUFxQ0FJLHVCQTRFUVM7U0FxQkosT0FlSjJGO2tCQXBDQXhFO2tCQUFRbkI7a0JBQVFWO2tCQUFheUc7a0JBQU1aO2tCQUFLQztrQkFBS0M7a0JBQU16L0M7OztTQStCakQsT0FLRisvQztrQkFwQ0F4RTtrQkFBUW5CO2tCQUFRVjtrQkFBYXlHO2tCQUFNWjtrQkFBS0M7a0JBQUtDO2tCQUFNei9DOzs7U0E0QmpELE9BUUYrL0M7a0JBcENBeEU7a0JBQVFuQjtrQkFBUVY7a0JBQWF5RztrQkFBTVo7a0JBQUtDO2tCQUFLQztrQkFBTXovQzs7OztJQU5uQzthQWdkaEJxNkMsVUFDQWtHLGFBQVkxZ0IsU0FBUTZaO0tBQ3RCO1NBRGM3WixZQUFRNlosU0FFTTtnQkFDcEIsZ0JBaGxCMkI5NkMsS0E2a0JyQmloQztPQWVWO01BVlUsSUFBTjJnQixNQUFNLDhCQWxsQnFCNWhELEtBNmtCckJpaEM7U0FBUTZaLFdBS2Q4RyxLQUNtQjtNQUNUO09BQVZDO1NBQVU7OEJBcGxCaUI3aEQsS0E2a0JyQmloQyxVQUtOMmdCLE1BTE0zZ0I7T0FRRXFOLGFBaGhCVjhNLE1BNmdCRXdHLGFBTGM5RztPQVNOd0QsVUFqaEJWbEQsTUF3Z0JRbmEsU0FLTjJnQjtPQUtBRSxtQkFEUXhELFNBRlJ1RDtPQUlBRSxlQVhOSixrQkFVTUc7T0FHSixnQkFGSUMsY0FIUXpUO01BS1o7Ozs7O01BTUY7T0FGWUYsV0F6aEJSZ04sTUF3Z0JRbmEsU0FBUTZaO09BbUJoQmtILGFBbkJKTCxrQkFrQkk5Z0I7TUFHSixnQkFGSW1oQixZQUZRNVQ7O0lBSW1DO2FBZ0ovQ3lMLGFBQWE1WSxTQUFRNlo7S0FDdkIsSUFEZVU7S0FDZjtTQURlQSxjQUFRVixTQXhzQnJCRCx5QkF3c0JxQkM7TUFFcEIsMEJBcHZCZ0M5NkMsS0FrdkJwQnc3QyxZQUVxRCxPQUZyREE7OztJQUU0RDthQUl6RTZGLGVBQWVwZ0IsU0FBUTZaLFNBQVE5b0M7S0FDakMsSUFEaUJ3cEMscUJBQWdCdnBDO0tBQ2pDO1NBRGlCdXBDLGNBQVFWLFNBOXNCdkJELHlCQThzQnVCQztNQUVuQixJQUNKeDJDLElBREksZ0JBMXZCNkJ0RSxLQXd2QmxCdzdDO2FBR2ZsM0MsY0FRSyxXQVhVazNDLFdBQWdCdnBDO3dDQUcvQjNOOzBCQUgrQm16QztPQU03Qjt5QkF4MUJKaUMsdUJBMEZtQzE1QyxLQXd2QkZ5M0M7OztPQUFoQjhEOztPQUFnQnRwQzs7SUFXZDthQUlqQjJwQyxjQUFjM2EsU0FBUTZaO0tBQ3hCLEdBRGdCN1osWUFBUTZaLFNBN3RCdEJELHlCQTZ0QnNCQztLQUVsQiw0QkF6d0I2Qjk2QyxLQXV3Qm5CaWhDOztxQkFHQSxPQWxCZG9nQixlQWVjcGdCLFNBQVE2Wjs7O1VBQVI3WixxQkFBUTZaLFNBN3RCdEJELHlCQTZ0QnNCQztNQU1oQixJQUlKeDJDLElBSkksZ0JBN3dCMkJ0RSxLQXV3Qm5CaWhDO2FBVVozOEI7T0FDQSxPQXB0QkYwMkMsbUJBeXNCYy9aLDRCQVVaMzhCO01BRmtCO2lCQXZCcEIrOEMsZUFlY3BnQixpQkFBUTZaO09BUU4vM0M7T0FBVmk1QztNQUNKLFdBRElBLFlBQVVqNUM7O0tBS1g7SUFBWTthQWFqQnM3QyxxQkFBcUJwZCxTQUFRNlosU0FBUXgyQztLQUN2QyxJQUR1QmszQztLQUN2QjtTQUR1QkEsY0FBUVY7T0FFN0IsV0E3M0JGcEIsdUJBMEZtQzE1QyxLQWl5QklzRSxHQUFSdzJDO2dCQUt6QixnQkF0eUI2Qjk2QyxLQWl5Qlp3N0M7Ozs7aUNBQVFWLFNBdnZCN0JELHlCQXV2QjZCQztTQVExQixnQkF6eUI4Qjk2QyxLQWl5Qlp3N0MsdUJBQWdCbDNDLEdBUW1CLE9BUm5DazNDO01BU1AsNEJBMXlCbUJ4N0MsS0FpeUJadzdDOzs7Ozs7WUF3Qkg7YUFBVjRDLFVBeEJSQyxxQkFBcUI3QyxtQkFBUVY7YUFBUk8sWUF3QmIrQzthQXhCYTVDOzs7O1lBZ0NqQixPQW53QkpSLG1CQW11QnFCUTs7OzttQ0FBUVYsU0F2dkI3QkQseUJBdXZCNkJDO1FBYWIsOEJBOXlCaUI5NkMsS0FpeUJadzdDOztTQWtCRDtVQUFWa0UsWUFsQlZyQixxQkFBcUI3QyxtQkFBUVY7VUFBUlksWUFrQlhnRTtVQWxCV2xFOzs7O1NBZUQ7VUFBVjBHLFlBZlY3RCxxQkFBcUI3QyxtQkFBUVY7VUFBUnFCLFlBZVgrRjtVQWZXMUc7Ozs7Ozs7OztRQTRCSDtTQUFWMkcsWUE1QlI5RCxxQkFBcUI3QyxtQkFBUVY7U0FBUnNILFlBNEJiRDtTQTVCYTNHOzs7O1FBbUNqQixPQXR3QkpSLG1CQW11QnFCUTs7OztJQXVDNEI7YUF3RWpEcUMsa0JBQ0VsQixTQUFRMWIsU0FBUXNWLE1BQUs4TDtLQUNWO01BQVRDO1FBQVMsOEJBbDVCb0J0aUQsS0FpNUIvQjI4QyxTQUFRMWIsVUFBUjBiO0tBRUY7Y0E3K0JGakQsdUJBMEZtQzE1QyxLQWk1Qi9CMjhDLFNBQXFCMEYsUUFBTDlMLE1BQ2QrTDtJQUk0QjthQWpFaENyQyxpQkFBaUJ0RCxTQUFRMWIsU0FBUTJiLE1BQUt0aUMsTUFBS3VpQyxPQUFNdEc7S0FDbkQsSUFEbUNvSyxlQUFLQyxlQUFLQztLQUM3Qzs7U0FEbUNGO1VBQUtDOztpQkFBS0M7bUJBQU10SyxNQUlyQjttQkFKcUJBLE1BSWdCOzs7Y0FKM0JxSztVQUFLQzs7O3lCQUFNdEs7Ozs7OztZQU1nQjs7WUFJckM7O1lBQ0E7O1lBSEE7O1lBSUE7O1lBTkE7Ozs7Y0FOZXNLO2tCQUFNdEssTUFHckI7a0JBSHFCQSxNQUdnQjs7O3dCQUhoQkE7Ozs7V0FLZ0I7O1dBSHJDOztXQUFxQzs7V0FLckM7O1dBRUE7O1dBSkE7Ozs7c0JBTHFCQTs7OztjQXAwQmpEb0UsbUJBazFCd0M7O2NBbDFCeENBLG1CQW0xQndDOztjQW4xQnhDQSxtQkFpMUJ3Qzs7OztnQkFqMUJ4Q0E7WUF1MUJLLE9Bd0NMa0Qsa0JBM0RpQmxCLFNBQVExYixTQUF3QnNWO2VBQVhxSzs7OztXQUFMRDtZQUFVRTtRQWlDckI7WUFyMkJ0QmxHO1FBZzJCSyxPQStCTGtELGtCQTNEaUJsQixTQUFRMWIsU0FBd0JzVjtXQUFOc0s7Ozs7WUFwMEIzQ2xHO1FBNDFCSyxPQW1DTGtELGtCQTNEaUJsQixTQUFRMWI7V0FBa0I0Zjs7O1dBcDBCM0NsRztPQW8yQkssT0EyQkxrRCxrQkEzRGlCbEIsU0FBUTFiLFNBQXdCc1Y7VUFBaEJvSzs7SUFpQ0M7V0FqekI5QnZGLCtCQXJFNkJwN0M7O1lBKzVCbkN1aUQsdUJBQXVCdmlELEtBQUlFO0lBQzdCLElBQVl5aEMsTUFoNkJWNlkscUJBKzVCdUJ4NkM7SUFFekIsSUFBSSxlQXg3REUrdEMsWUF1N0RNcE0sS0FEaUJ6aEMsUUFBSkYsTUFFckI7Ozs7S0FJSSxXQTE4Q05tM0MsZ0JBbzhDMkJqM0M7S0FNckIsa0JBLy9CTnc1Qyx1QkF5L0J1QjE1Qzs7R0FNTTtZQUk3QndpRCx3QkFBd0J4aUQ7O0tBQW1CaWtDO0tBQU50QztLQUMzQjhELFFBMTZCVitVLHFCQXk2QndCeDZDO0lBRTFCO0tBQUksZUFsOERFK3RDLFlBaThETXRJLE9BOWtFVnFILGFBNmtFcUNuTCxPQUFiM2hDO0tBRXRCOzs7OztNQUVGLGtCQXZnQ0EwNUMsdUJBbWdDd0IxNUMsS0FBbUJpa0M7Ozs7Ozs7T0E1M0YzQzNDO09BVEFGO09BYkFMO09BR0FDO09BTUFHO09Bd0NBTztPQWs2Q0kyVjtPQStRQW1CO09BK0dBVztPQW9CQUs7T0FxQkFDO09BeDZCQTFMO09BdWhDSnlNO09BKzVCQStIO09BVUFDO09Bem9GQXRmO09BZ0xBYztPQTJnQ0FtVDtPQXoxQkE1UjtPQTZ5Q0FvVTtPQS94Q0l6VDtPQXVJSjBDO09BK2ZBb047OztFbkN2eENMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lvQ21CS3lNLFNBQVNocUIsR0FBRXJwQjtJQUNiLElBRHdCdXlCLGdCQUN4QjtpQkFBaUIzdkI7S0FBTyxrQ0FEWDVDLEdBQ0k0Qzt1QkFETnltQixHQUFFcnBCO0lBQ2dDO0lBQTdDLG1EQUR3QnV5Qjs7WUFFdEIrZ0IsU0FBU2pxQixHQUFFeDFCO0lBQ2IsSUFEd0IwK0IsZ0JBQ3hCO2lCQUFpQjN2QjtLQUFPLG1DQURYL08sR0FDSStPO3VCQUROeW1CLEdBQUV4MUI7SUFDZ0M7SUFBN0MsbURBRHdCMCtCOztZQUV0QmdoQixVQUFVbHFCLEdBQUU3ekI7UUFBWSs4QjtJQUMxQix5Q0FEWWxKLEdBQUU3ekIsSUFBWSs4Qjs7WUFJeEJpaEIsUUFBUWgrQyxJQUFHKzhCO0lBQU0sT0FSakI4Z0IsdUJwQ25CTCxZb0MyQmE3OUMsSUFBRys4QjtHQUE0QjtZQUN2Q2toQixRQUFRNS9DLEdBQUUwK0I7SUFBTSxPQVBoQitnQix1QnBDckJMLFlvQzRCYXovQyxHQUFFMCtCO0dBQTJCO1lBQ3JDbWhCLFNBQVNsK0MsSUFBRys4QjtJQUFNLE9BTmxCZ2hCLHdCcEN2QkwsWW9DNkJjLzlDLElBQUcrOEI7R0FBNkI7WUFDekNvaEIsU0FBUzkvQyxHQUFFMCtCO0lBQU0sT0FQakJnaEIsd0JwQ3ZCTCxZb0M4QmMxL0MsR0FBRTArQjtHQUE0QjtZQUN2Q3FoQixPQUFPcmhCLEtBQU0sT0FKYmloQixvQkFJT2poQixLQUF3QjtZQUMvQnNoQixRQUFRdGhCLEtBQU0sT0FMZGloQixvQkFLUWpoQixLQUF3QjtZQUVoQ3VoQixTQUFTenFCO1FBQVdrSjtJQUN0QixTQUFJdkUsSUFBR3ByQjtLQUNLLElBQU4xTCxNQUFNO0tBQ1YsbUNBRElBLEtBREMwTDtLQUdILGtCQUpPeW1CLEdBSVAsNkJBRkVueUI7SUFFbUI7SUFDekIseUNBSkk4MkIsUUFEa0J1RTs7WUFPcEJ3aEIsUUFBUXhoQixLQUFNLE9BUGR1aEIsa0JBTzRCemhELEdBQUssT0FBTEEsRUFBTSxHQUExQmtnQyxLQUErQjs7OztPQWR2Q2loQjtPQUlBSTtPQUNBQztPQVNBRTtPQWJBTjtPQUNBQztPQUNBQztPQVhBTjtPQUlBRTtPQVdBTztPQWJBUjtPQUVBQztPQVdBTzs7O0VwQ2xDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dxQ2tEQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBQ0E7SUFRQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQUlRRSxPQUFPeGhELEdBQUUyQjtJQUNmLElBRGV3WDtJQUNmO1VBRGVBLEtBRVA7aUJBRk9BLFFBR1Jzb0MsZUFBSkM7S0FBcUIsY0FBckJBLElBSFUxaEQsSUFHcUIsT0FBM0J5aEQ7U0FIUXp5Qzs7R0FJTztZQVNwQjJ5QyxhQUFhN2hDLFFBQU9kLEtBQUlrQixRQUFPdmU7SUFDakMsS0FEaUNBLEdBRXpCO0lBQzJDLElBQTlDcU4sSUFINEJyTixNQUcvQjBwQixJQUgrQjFwQixNQUdrQiw4QkFIcENtZSxRQUdidUw7a0JBQTZCcnJCLEdBQUVDO0tBQVMsa0NBSHBCK2UsS0FHVy9lO0tBQVMsOEJBQVhEO0lBQWtCO0lBQXZDLG1EQUFMZ1A7SUFBSyxvQ0FIZ0JrUjtHQUdpRDtZQVl6RTBoQztJQUFpQjtHQUE4QjtZQUUvQ0MsU0FBU0M7SUFDWCxJQS9CTU4sbUJBOEJLTSxXQUU2QixjQURwQ0M7Ozs7Ozs7MkJBSEZIOzs7UUE1QklKLG1CQThCS00sV0FNOEIsY0FEckNFOzs7Ozs7OzZCQVBGSjs7O0lBWVMsa0NBVFBHLE1BSUFDO0lBS08sOEJBVkFGO0dBVWE7WUFHdEJHLFFBQVF2OUMsS0FBSW85QyxVQUFTSTtJQUN2Qiw2QkFEVXg5QyxVQUFhdzlDO0lBRUksV0FmekJMLFNBYVlDO0lBRUo7O01BMUJtQks7TUFBTkM7TUFBTEM7aUJBQ2xCLHNCQUQ2QkY7O2VBQU5DO01BTWpCLG9DQWtCSTE5QyxVQXhCUTI5QyxLQUFXRjtLQUlPLElBRHhCeGdELElBSFd5Z0QsU0FJYSxPQVZsQ1QsZ0NBU1VoZ0Q7S0FDTixvQ0FvQkkrQyxVQXhCUTI5QyxXQUFXRjs7SUEwQkY7R0FBbUI7WUFHNUNHLGFBQWFSLFVBQVNJO0lBQ2hCLElBQUo3Z0QsSUFBSTtJQU5ONGdELFFBTUU1Z0QsR0FEV3lnRCxVQUFTSTtJQUV4QixvQ0FESTdnRDtHQUVhO1lBR2ZraEQsTUFBTVQsVUFBU0k7SUFDSixXQVBYSSxhQU1NUixVQUFTSTtJQUNKO0dBQThCO0dBRy9CLElBQVZNO1lBTUEvZ0Qsa0JBQWtCekI7SUFDcEIsSUFBSSxlQUFLLDJCQURXQSxLQUNoQjs7OytCQUNjOzs7R0FBSTtZQUVwQitCLG9CQUFvQi9CO0lBQ3RCLElBQUksZUFBSyw2QkFEYUEsS0FDbEI7OzsrQkFDYzs7O0dBQUk7WUFFcEJ5aUQ7SUFBa0NDLGNBQWFGLFNBQVFHLE1BQUtiLFVBQVNjLFNBQ25DVjtRQUNoQ1csVUFGNkNMO2FBRzdDTSxjQUFjcHNDO0tBS2hCO01BQUlyVixJQUFJO01BQ0owaEQ7UUFQRkYsVUFGcURGO3FDQUVyREU7O0tBU0YsT0FSZ0Juc0M7O1lBV0o3VyxJQVhJNlc7OytCQVdKN1c7O1NBQ04sNkJBUEZ3QixRQUNBMGhELFVBS1FsakQ7OztZQUlTdzVDLFdBZkwzaUMsVUFlQStZLE1BZkEvWSxVQWVMOFYsTUFmSzlWO1FBZ0JWLDZCQVhGclYsUUFDQTBoRCxVQVNZdHpCLEtBQUxqRCxLQUFVNnNCOzs7WUFGVHhtQyxNQWJJNkQ7UUFjViw2QkFURnJWLFFBQ0EwaEQsVUFPUWx3Qzs7O1lBS0E4bkMsTUFsQklqa0M7UUFtQlYsNkJBZEZyVixRQUNBMGhELFVBWVFwSTs7S0FsRFpzSCxRQXFDSTVnRCxHQVJ3RHlnRCxhQUMxQkk7S0F3QkosS0FBM0IsV0F0QmF4ckMsaUJBc0JjLFdBdEJkQTtNQXdCWCxnQkFBSSw2QkFuQkxyVjtLQWtCQyxpQkFBSyw2QkFsQk5BO0lBbUJ3QjtJQTNCbUJtaEQ7O3NCQUFRRztLQStCdkQ7TUFDVTthQWhDcUNIO09BakV6QzNpRCxxQkFpRWlEOGlEOztNQWlDMUIsUUFBM0Isc0JBbEdJOWlELGFBa0d1QixnQkFsR3ZCQTs7UUFvR0k7O2dCQTNHTjJoRCxPQU9FM2hELEdBaUVzRGlpRDtTQWtDNUNrQjtTQUFScHZDOzs7OztRQUdGO1NBckdBO1VBQUpoUyxJQUFJLDhCQURBL0I7VUFFSnVELE1BQUosc0JBRlF2RDtVQXVHZTR2QjtZQXBHTCw4QkFIVjV2QixHQUNKK0IsV0FDQXdCLE9BREF4QjtVQXNHVXFoRCxVQXBHZCw4QkFIUXBqRCxNQUNKK0I7VUF1R2dDLGFBRGI2dEI7VUFDYixNQS9HSit4QixPQThHUXlCLFNBdENnRG5CO1VBa0M1Q2tCO1VBQVJwdkM7Ozs7O1VBTWdCLGdEQXpHbEIvVDs7Ozs7UUEyR0VxakQ7bUJBM0dGcmpELEdBbUdVc2pEO29CQVFSQztZQUNGLEtBVFVELFFBVUE7Z0JBQ0gxekIsTUFYRzB6QjtZQVdJO2tDQTlHZHRqRCxHQThHTzR2QjtXQUFtRDtrQkFIeEQyekI7OzBCQTNHRnZqRCxHQW1HVW1qRDtRQVlSSzttQkEvR0Z4akQsR0FtR1VzakQ7b0JBWVJHO1lBQ0YsR0FiVUgsWUFpQkgxekIsTUFqQkcwekIsV0FpQkksT0FBUDF6QjtnQkFuRGtDK3lCLHVCQUFRRzthQWtEeEMsZ0RBbkhUOWlEO3VCQWlFeUMyaUQ7WUFpRE8sd0JBakRDRztXQW1EaEM7a0JBTGZXOzs0QkEvR0Z6akQsR0FtR1VtakQ7UUFtQlJPO21CQW5CUUo7b0JBbUJSSyxtQkFDRixPQXBCVUwsY0FsQytCWCxpQkF3RDNCO2tCQUhaZ0I7O29DQW5CUVI7UUF3QkpTO21CQTNITjVqRCxHQTJHRXVqRCxRQUlBRSxTQU9BRTtvQkFLSUU7WUFBZTs7bUJBQ2hCaGtELGNBakJIMGpELFdBaUJRLGtCQUFMMWpEOztlQUVPLElBRFBpa0QsZ0JBeEVRbDBCLE1BMERYNnpCO2VBekRWLElBQUksZUFBSyx1QkFEWTd6Qjs7Ozs7Ozs7Z0JBMkVEO3NDQWhJWjV2QixHQXFEYTR2QjttQkE0RUo1YztlQUFLLFdBSlQ4d0MsS0FJSTl3QztlQUVQLE9BYkEyd0M7O21CQWNFci9DLGNBekJGaS9DLFdBeUJFai9DOzttQkFDRXF1QixnQkExQko0d0IsV0EwQkk1d0I7O2VBRU0sSUFETG94QixnQkFDRGwwQixRQXhCSjR6QjtlQXlCQSxXQUZLTSxLQUNEbDBCO2VBQ0osT0FsQkE4ekI7O21CQTZCU0sseUJBcENUUCxZQXNDQSxPQS9CQUU7O2VBaUNVO2dCQURSTTtnQkFDRUMsUUF4Q0pUO2dCQXlDWSxVQS9GcEI3aEQsa0JBOEZZc2lEOztnQkFFTTtzQ0F6Slpsa0QsR0F1Sk1ra0Q7bUJBR0cvakQ7ZUFBSyxXQUpWOGpELEtBSUs5akQ7ZUFFUCxPQXRDQXdqRDs7ZUF3Q1U7Z0JBREpRO2dCQUNGQyxRQS9DSlg7Z0JBZ0RZLFVBdEdwQjdoRCxrQkFxR1l3aUQ7O2dCQUVNO3NDQWhLWnBrRCxHQThKTW9rRDttQkFHRzNvQztlQUpEMG9DLFNBSUMxb0M7ZUFFUCxPQTdDQWtvQzs7ZUErQ1U7Z0JBRE5VO2dCQUNBQyxRQXRESmI7Z0JBdURZLFVBekdwQnZoRCxvQkF3R1lvaUQ7O2dCQUVNO3NDQXZLWnRrRCxHQXFLTXNrRDttQkFHR0M7ZUFBSyxXQUpSRixLQUlHRTtlQUVQLE9BcERBWjs7ZUFzRFU7Z0JBREZhO2dCQUNKQyxRQTdESmhCO2dCQThEWSxVQWhIcEJ2aEQsb0JBK0dZdWlEOztnQkFFTTtzQ0E5S1p6a0QsR0E0S015a0Q7bUJBR0dDO2VBSkNGLFNBSURFO2VBRVAsT0EzREFmOzttQkE0RElnQjtlQXZFSnBCO2VBd0VBLG1DQXhESU0sY0F1REFjOztlQXZDTSxJQURFQyxnQkFBTjlQLGlCQUNGK1AsUUE1QkpwQjtlQTZCRywrQkFEQ29CLE9BREUvUDtnQkFHSixXQUhVOFAsS0FDUkM7Z0JBRUYsT0F2QkZsQjs7ZUEyQmdDLFdBM0l4QzdCLGtDQW9JY2hOO2VBS0c7Ozs0QkEvSVg5MEMsR0EySU02a0QsT0FLMEI7OzttQkFxQzNCQztlQTFFSHZCO2VBOEVFO21CQXhIcUNaLGVBQVFHOzJCQUFSSDtnQkF1SHJDLFdBSENtQyxzQkFwSDRDaEM7Z0JBcUQvQ2E7OzttQkFxRU9vQjtlQWhGUHhCO2VBa0ZVLElBQU5oekM7ZUFHRjttQkEvSHFDb3lDLGVBQVFHO2lCQWlJN0Msa0JBUEtpQyxLQU9MLDJCQUxFeDBDOzJCQTVIbUNveUMsMkJBNEhuQ3B5Qzs4Q0E1SDJDdXlDO2dCQXFEL0NhOzs7bUJBNkVLcUI7c0JBbElxQm5DO2dCQW9JeEI7O2VBRVEsSUFBTm9DLFFBeEZKeEIsWUF5Rkl5QixTQUFTLFdBTFJGLEtBSURDO2VBakZKdEI7ZUFvRmE7Z0JBQVRyZjtrQkFBUyw0QkF6SWtDd2UsWUFBUkg7Z0JBMEluQ3RlO2tCQUNGOztvQkEzSTZDeWU7b0JBQVJIO3FCQUFRRyxxQkFBUkg7ZUFBUUc7Z0JBNkl4Qzt1Q0FKSHhlLFlBRkE0Z0IsWUFHQTdnQjs7O1dBR3NDO2tCQW5GdEN3Zjs7c0NBM0hON2pELEdBMkdFdWpELFFBSUFFLFNBT0FFO09BS0lFLGFBeEJKOXZDOzs7cUJBOEdELFdBaEo4RGd2QyxTQWpFL0QvaUQ7Ozs7O1dBa05LK3JCO09BQVcsa0NBOUlwQmszQixrQkE4SVNsM0I7OztVQUNDbGtCO01BQVcsa0NBL0lyQm83QyxjQStJVXA3Qzs7S0FsSm1DODZDOzs7WUF1Si9Dd0M7SUFBOEJ4QyxTQUFRRyxNQUFLYixVQUFTYyxTQUFRVjtJQUM5RCxPQXhKRU87Z0JBdUo4QkQsU0FBUUcsTUFBS2IsVUFBU2MsU0FBUVY7R0FDYTtZQUV6RStDLG1CQUFxQno0QixLQUFpQm0yQixNQUFLYixVQUFTYyxTQUFRVjtJQUM5RCxHQUR1QjExQixTQUFRRSxNQUFSRixvQkFBUUUsY0FBUnc0QixZQXhLckIxQztJQXlLRixPQTNKRUM7Z0JBMEpxQnlDLGVBQWlCdkMsT0FBS2IsVUFBU2MsU0FBUVY7R0FFdEQ7WUFHTmlELFdBQWEzNEIsS0FBaUJtMkIsTUFBS2IsVUFBU2MsU0FBUVY7SUFDdEQsR0FEZTExQixTQUFRRSxNQUFSRixvQkFBUUUsY0FBUnc0QixZQTdLYjFDO0lBOEtGLE9BTkV5QztpQkFLYUMsWUFBaUJ2QyxVQUFLYixXQUFTYyxTQUFRVjtHQUNnQjtZQUdwRTFJLE1BQU03M0MsR0FBRWpDLEdBQUUrTjtJQUNaLElBQ0UsVUFOQTAzQyxnQ0FJTXhqRCxHQUFFakMsR0FBRStOLE1BRVY7Ozs7VUFFSTIzQztNQUFPLGtDQUFQQTtNQUFPOzs7U0FDTkM7S0FBTyxrQ0FBUEE7S0FBTzs7R0FBdUI7WUFHbkNDLGNBQWMzakQsR0FBRWpDLEdBQUUrTjtJQUNwQjtLQUNFLFVBbkJBdzNDLHdDQWlCY3RqRCxHQUFFakMsR0FBRStOO0tBRWxCOzs7OztVQUVJMjNDO01BQU8sa0NBQVBBO01BQU87OztTQUNOQztLQUFPLGtDQUFQQTtLQUFPOztHQUF1QjtZQUVuQ0UsYUFBYTVqRCxHQUFFakMsR0FBRStOO0lBQ25CO0tBQ2E7TUFBUGsxQztNQUNBUCxXQUhTemdEO01BSVR1akQsZ0JBcE1KMUM7TUFxTUEsTUFoQ0F3Qyw4QkErQklFLFdBRkF2QyxNQUNBUCxNQUhXMWlELEdBQUUrTjtLQUtqQjs7Ozs7VUFFSTIzQztNQUFPLGtDQUFQQTtNQUFPOzs7U0FDTkM7S0FBTyxrQ0FBUEE7S0FBTzs7R0FBdUI7WUFHbkNHLFlBQVkzbEQ7SUFDZCxJQUFJdUQsNEJBRFV2RDthQUVONGxELEtBQUt0a0Q7S0FDWCxJQURXK1I7S0FDWDtTQUZFOVAsT0FDUzhQLEtBQWIsT0FESTlQO01BR00sMEJBSkl2RCxHQUVEcVQsTUFHTixPQUhNQTtNQUVjLElBRmRDOztJQUdMO0lBRVIsSUFBTSxJQUNKRCxNQURJLDhCQVBRclQ7Ozs7S0FVVixJQUFZLElBQ1ZzQixJQURVLDhCQVZGdEI7Ozs0QkFZZSxPQVh6QnVEOzs7S0FTWSxPQVJScWlELEtBU0Z0a0Q7O0lBSkEsT0FMRXNrRCxLQU1OdnlDO0dBS0s7WUFHTHd5QyxZQUFZQztRQUFnQnhELGdCQUFOQyxpQkFBTHdEO0lBQ25CLFVBRHdCeEQ7dUNBQVZ1RCwyQkFBS0M7MkNBaEJqQkosWUFnQjRCckQ7c0NBQWhCd0Q7O1lBTVpFLG9CQUFvQmhtRDtJQUNYLElBQVBpbUQ7aUJBQzREcGpEO0tBQXJELFNBQXFEQSxPQUQ1RG9qRCxzQkFDc0Q7S0FBVyxPQUFMcGpEO0lBQU87SUFBdkUsMENBRnNCN0M7R0FFbUQ7WUF5QnZFa21ELE1BQVF2NUIsS0FBZXMxQjtJQUN6QixHQURVdDFCLFNBQU1FLE1BQU5GLGdCQUFNRSxjQUFOczVCO0lBQ007S0FBWkMsWUF6UkZwRSxTQXdSdUJDO0tBRXJCMStDLE1BQU0sNEJBbkNSc2lELGdCQWtDRU87S0F4QlUvaEQsUUEwQkosMkJBRE5kLEtBRk00aUQ7SUFJRCxhQTNCU0U7U0FNZk4sTUFOZU0sUUFNVjlELE9BTlU4RDsrQ0FLZCxPQUxjQTtlQU1WOUQ7TUFDUztPQURXZ0QsUUFOVmM7T0FPVkMsV0FqQ05YLFlBZ0MwQko7T0FFRSxvQ0FSaEJsaEQsUUFPTmlpRDtPQUNBQyxXQUFTO09BQ2UsTUFiOUJQLG9CQVUwQlQ7T0FHTCw2QkFEZmdCO01BQ0osV0FIRFIsS0FBS3hELE1BR1E7O0tBRUM7TUFESDMwQyxNQVZJeTRDO01BVVZHLFNBVlVIO01BV1ZJLFNBckNOZCxZQW9DWS8zQztNQUVOODRDLFVBQUosc0JBTkRYO01BT0t4bEMsUUFiTWxjLFFBWU5xaUQsZUFEQUQ7S0FHSixRQURJbG1DLE1BRUYsV0FUSHdsQyxLQUlLUyxRQWROUixvQkFjWXA0QztLQU9LO01BQVQrNEMsU0FBUyw2QkFKWHBtQztNQUtzQixNQXRCNUJ5bEMsb0JBY1lwNEM7TUFRSnFTLFNBQVMsc0NBUFh3bUM7TUFRRXBtQztRQUFTOztVQVRMelM7VUFDTjY0QztnQ0FETTc0QyxPQUNONjRDO01BU21CLDZCQUhqQkUsUUFFQXRtQztLQUNKLFdBZEgwbEMsS0FJS1MsUUFVVSx1QkFGUnZtQzs7SUFTVix3Q0FISW1tQztHQUdnQztZQVNsQ1EsU0FBU2xuQyxNQUFLUCxLQUFJMG5DO0lBQ3BCO0tBQUkzaUQsS0FBSyx1QkFEVzJpRDtLQUVoQmhpRCxNQUFNO0tBQ05paUQ7YUFDQUM7S0FDUyxJQVpIQyxPQVlHLDZCQUhUbmlEO0tBSUYsR0FOUzZhO1VBTlBuYyw0QkFETXlqRDtNQUVJLE9BRFZ6akQsY0FDVSxnQkFGSnlqRCxNQUNOempEO2lCQUVGLDhCQUhReWpELFNBQ056akQ7OzsrQkFETXlqRDtVQWFKQzs7O21CQWJJRDtLQVVORixlQUdFRyxRQUhGSDtLQUNKLG9DQUZJamlEO0lBTWM7SUFFbEI7O01BRWMsSUFBSmhDLElBQUksdUJBWFZxQjtTQVdNckIsTUFaTXNjLEtBSVo0bkMsZUFTZ0MsOEJBWGhDbGlELEtBVU1oQzs7Ozs7O1lBS1AsNkJBZkNnQyxNQUVBa2lEO0tBY0osdUJBakJJN2lEO0tBa0JVLHFDQWhCVjRpRDtLQWdCVTs7R0FBaUI7O0dBRWxCLFNBQVhJLGNyQ3ZaTCxPcUNrWUtOO0dBcUJXO0dBRUMsU0FBWk8sZXJDelpMLE9xQ2tZS1A7WUF5QkFRLFVBQVVqb0MsS0FBSTBuQyxNQUFLUTtJQUNaLElBQUxsa0QsS0FBSyx1QkFETzBqRDtpQkFFQTdtRCxHQUFLLG9DQURqQm1ELFNBQ1luRCxHQUZKbWYsS0FFZ0M7SUFBNUMsa0NBRnFCa29DO0lBRXJCLDhCQURJbGtEO0dBRVE7O0dBRUUsU0FBWm1rRCxvQnJDaGFMLE9xQzJaS0Y7R0FLWTtHQUVDLFNBQWJHLHFCckNsYUwsT3FDMlpLSDs7OztPQWpIQXpOO09BUUE4TDtPQVpBSDtPQUxBRjtPQUhBRDtPQTJCQU87OztPQXBNQWhEO09BTkFEO09Bc1FBeUQ7T0E1UEF2RDtPQThSQXVFO09BRUFDO09BT0FHO09BRUFDOzs7RXJDbGFMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R3NDb0JnQjs7Ozs7Ozs7SUFFWEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUZBQyxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBSVhDLE1BQU12bkQsR0FBRTRCO0lBQ0YsSUFBSmxDLElBRElNLE1BQUU0QjtJQUVILCtCQURIbEM7S0FFRix5Q0FGRUE7SUFHQztPQUFHLGFBSEpBLGFBSUYseUNBSkVBO0lBS0M7V0FBRyxhQUxKQSxjQU1GLHVCQU5FQTtHQVFDO1lBRUM4bkQsYUFBYXhuRCxHQUFFNEI7SUFDckIsR0FEbUI1QixnQkFBRTRCLEdBQ0c7SUFDVSxXQUY1QjRsRCxhQUFheG5ELEdBQUU0QixZQUVDLE9BYnBCMmxELE1BV2lCdm5ELEdBQUU0QjtJQUVhO0dBQXNCO1lBU3RENmxELGFBQWF6bkQ7SUFDZixZQU1LLDZCQWpDSHNuRDtJQTJCYTtpQkFLTDtTQUpBcmxELGVBQU5DO0tBQ0UsSUFBTyxxQkFEVEEsSUFGV2xDOytCQUtESCxZQUFLLFdBQUxBO2lCQUhKb0M7O0dBS2dCO1lBVXhCeWxELCtCQUFnQzE0QztJQUNsQyxTQVJHLGFBTytCQTtLQUhuQixJQURUMjRDLGNBSTRCMzRDOztNQW5CRTtjQVQ5Qnc0QyxhQTRCNEJ4NEM7T0FuQlYsT0FwQnRCdTRDLE1BdUNnQ3Y0QztjQW5CRTs7Ozs7Ozs7U0FEZDtpQkFuQnBCdTRDLE1BdUNnQ3Y0QztpQkFwQlo7O3VCQWdCaEIyNEM7Ozt1QkFJNEIzNEM7UUFDakI0NEMseUJBQWJDO0lBQ0osS0FEaUJELFlBRVAsT0FGTkM7UUFHR25vRCxJQUhVa29EO0lBR0wsOEJBSFJDLGVBR0dub0Q7R0FBb0I7WUFFekJvb0Qsa0JBU0E5bkQ7SUFUb0IsR0FTcEJBLGlCQVJpQjtPQVFqQkEsa0JBUGtCO09BT2xCQTt1QkFOMEIrbkQsbUJBQU5DLGlCQUFOdEI7S0FDWjs7Y0FuREZXO2NBa0RjWDtjQUFNc0I7Y0FBTUQ7Ozs7T0FNMUIvbkQ7OztNQUoyQmlvRDtNQUFOQztNQUFOQztLQUNiOztjQXJERmQ7Y0FvRGVjO2NBQU1EO2NBQU1EOzs7O09BSTNCam9ELHFCQUNFLE9BaEJGMG5ELCtCQWVBMW5EOzs7S0FGdUNvb0Q7S0FBTkM7S0FBTkM7SUFDekI7O2FBdkRGakI7YUFzRDJCaUI7YUFBTUQ7YUFBTUQ7OztHQUdPO1lBRTlDOXdDLFVBQVU1UDtJQUNOLFlBcENKKy9DLGFBbUNVLy9DO2dCQUdGLE9BZlJvZ0Qsa0JBWVVwZ0Q7UUFFTDdIO0lBQUssT0FBTEE7R0FDc0I7WUFFM0Iwb0QsTUFBTUMsS0FBSS80QjtJQUNaLElBQ0Usc0JBRk0rNEIsS0FBSS80QixNQUVWO1VBQ0duVTtLQUNnQyxJQURoQ3RiLDhCQUNnQyxPQVRuQ3NYLFVBUUd0WDtLQUNIO0tBQ0E7S0FDQSxrQ0FIR0E7O0dBR0k7WUFFUHlvRCxRQUFNRCxLQUFJLzRCO0lBQ1osSUFDRSxzQkFGTSs0QixLQUFJLzRCLE1BRVY7VUFDR25VOztLQUNIO0tBQ21DLFdBbEJuQ2hFLFVBZ0JHdFg7S0FFSDs7O0dBQ007WUFNTjBvRCxzQkFBc0JDLElBQUssT0FBTEEsR0FBTztZQWtDN0JDLHNCQUFzQkQ7SUFDeEIsV0FBUyxtQ0FEZUE7R0FFRjtZQUVwQkUsc0JBQXNCMXBDLEtBQUlqUzthQUN4QkosS0FBS2c4QztLQUNQLE9BRE9BO3FCQURlM3BDOztJQUtpRDtJQUV6RSxTQVA0QmpTO0tBZWhCO1lBZmdCQTs7Ozs7O01BZWhCLE1BZFJKLEtBRHdCSTtLQWN4QjthQUFLOzs7T0FkbUJBLFNBVW9CO0lBRU4sVUFYdENKO0lBV0UsV0FBSztHQUt1QztZQWNoRGk4QyxvQkFBb0JDLFNBQVFDO0lBQ0ksSUFiRUMsWUF2QmxDTixzQkFtQzRCSztTQVpNQyxXQUdoQyxvQ0FTa0JGO1FBUGZsbUQsSUFMNkJvbUQsb0JBSzdCcG1EOztTQUNIbEI7O01BQ1EsWUExQlZpbkQsc0JBeUJFam5ELG9CQURHa0IsR0FDSGxCOztXQUdXeEQ7T0FBTyw2QkFHQTRxRCxjQUhQNXFEOztNQUhYOzs7Ozs7R0FPbUU7WUFHckUrcUQsZ0JBQWdCSDtJQUNsQixPQUxFRCxvQkFJZ0JDLFNBQ1U7R0FBc0I7WUFlaERJLHdCQUF3Qkg7SUFDTixJQWRFQyxZQTFDcEJOLHNCQXVEd0JLO1NBYkpDLFdBR25CO0lBRVM7S0FETHBtRCxJQUplb21EO0tBS2Q3bkQsSUFBSTtXQURMeUI7S0FDSzs7U0FDUmxCOztNQUNRLFlBN0NWaW5ELHNCQTRDRWpuRCxvQkFGR2tCLEdBRUhsQjs7V0FHV3hEO09BQU8sNkJBSmRpRCxRQUlPakQ7O01BSFg7Ozs7O0lBS0Esb0NBTklpRDtHQVNpRDtZQUV2RGdvRCx3QkFFaUJDO0lBRlMsYUFFVEE7R0FBZTtZQUVoQ0MseUJBQ2VELE9BRFksYUFDWkE7R0FDWTtZQVMzQkUsd0JBRWVGO0lBRlcsYUFFWEE7OztHQU1kO1lBRURHLHVCQUdlSDtJQUhVLFNBR1ZBO0tBQUssV0FBTEE7SUFEb0I7R0FDRDtZQUVsQ0ksZ0JBQWdCVDtJQU9aLFlBL0ZKTCxzQkF3RmdCSztnQkFRTjtRQUNIQywwREFNRHRuRDtJQUZvQjtlQUVwQkE7Ozt1Q0FOQ3NuRCxXQU1EdG5EO01BQUssb0JBQUxBOzs7S0FDRCxpQkFQRXNuRDs7R0FTSTtZQUVYUyw2QkFBNkJDLE9BQy9CLE9BckJFRixvQkFvQjZCRTtHQUNKO1lBV3pCQyxxQkFBcUJsQixJQUFLLE9BQUxBLGNBQW9CO1lBV3pDbUI7SUFBbUIsT0E1RW5CVix3QkE0RTJDO0dBQXNCO1lBSzdEVyxpQkFBaUJDO0lBQ3ZCO0tBQW1CO01BQWZDLGVBQWUsNkJBalFqQjNDO01Ba1FFNEMsbUJBRm1CRixJQUNuQkM7TUFFQW5qRDtRQUFVLDZCQW5RWndnRCxVQWlRRTJDLGNBQ0FDO01BRUosVUFESXBqRDs7S0FDSjs7R0FBdUM7WUFJckNxakQsU0FDRW5xRCxHQUFKLGFBQ0csYUFEQ0EsY0FDc0M7WUFFeENvcUQsWUFBWXBxRCxHQUNILElBQVBrTixPQUxGaTlDLFNBSVlucUQsSUFFTCxPQURMa04sUUFDOEI7WUFFaENtOUMsY0FBY3JxRCxHQUNMLElBQVBrTixPQVRGaTlDLFNBUWNucUQsSUFFUCxPQURMa04sUUFDaUM7T0FLbkNvOUM7WUFnQkFDLCtCQUFtQzM2QixLQUFJcTVCO0lBQ0gsVUEzT3BDM3hDLFVBME9tQ3NZO0lBQ3JDO0lBN0lFbTVCLGdDQTRJdUNFO0lBRzVCLElBQVR1QixTQUFTO09BQVRBO0tBRW9CO21DQUZwQkE7TUFFWSx1QkFyQmRGO0tBcUJBOzs7R0FDVTtHQUVtQixJQUE3QkcsaUNBUkFGO1lBVUFHLCtCQUErQlY7SUFGL0JTLGdDQUUrQlQ7O0dBQXFDO09BRXBFVztZQW9DQUMsMEJBQTBCajdCLE9BQUlrN0I7SUFDaEM7S0E1QkE7O09BR001QjtTQXdCMEI0QixrQkFwQzlCRixrQkFnQkk7TUFFSixJQUFLO01BQ0w7T0FDRTt5QkF4QkZGLCtCQXdDMEI5NkIsT0F4QnRCczVCOzs7WUFTQzZCO09BQ2tCO1FBRGxCbDdCO1FBQ0NtN0Isa0JBQWlCO1FBQ2lCLE1BN1F4Q3p6QyxVQTBSMEJxWTtPQWJ4QjtPQS9LRm81QixnQ0FvS0lFO09BY0EsVUFoUkozeEMsVUEyUUtzWTtPQUlIO09BakxGbTVCLGdDQThLTWdDO2lCQU1KOzs7Ozs7O2dCQUdFOztLQU9KOztlQUdBO0dBQUU7R0FNSjsyQ0FYRUg7cUJ0QzNXTDs7Ozs7O09zQ3NNS3ZCO09BSUFFO09BV0FDO09BVUFDO09BL0VBWjs7O09BL0RBdnhDO09BWkF3d0M7T0FpQkFTO09BUUFFO09BcUZBVTtPQTRGQVc7OztPQUtJQztPQXRPSnRDO09BNERBaUI7cUJ0QzFHTDtPc0MrS0tLO09Bb0JBSztPQXdIQW1CO09BVUFHO09BakdBaEI7T0FvQkFDOztPQVlBRTs7OztPQTRCQU87T0FJQUM7T0FyT0EzQzs7O0V0Qy9ETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0l5Q29CS3AvQztJQUNBUDs7Ozs7WUFLQXdrRCxPQUFPbnVEO0lBQ1QsdUJBRFNBO0dBQzhCO1lBRXJDb3VELE1BQU1uckQsR0FBSSxPQUhWa3JELE9BR2lCLDZCQUFYbHJELElBQXFDO1lBRTNDb3JELFVBQVVydUQsS0FBSStFLEtBQUlDO0lBQ3BCLFFBRGdCRCxZQUFJQyw4QkFBUmhGLE9BQVFnRixZQUFKRDtLQUdYLHVCQUhPL0UsS0FBSStFLEtBQUlDO0lBRWY7R0FDeUI7WUFFNUJzcEQsU0FBU3JyRCxHQUFFOEIsS0FBSUM7SUFBTSxPQUxyQnFwRCxVQUsrQiw2QkFBdEJwckQsSUFBRThCLEtBQUlDO0dBQWtEO1lBRWpFc2pELEtBQUtpRztJQUNFLElBQUw1b0QsS0FBSyx1QkFERjRvRDtJQUVQLElBQU0sSUFDRi96QyxJQURFLHNCQURGN1U7VUFHVTZLOztLQUFLLHVCQUhmN0s7S0FHNEIsa0NBQWxCMkQ7O0lBREwsdUJBRkwzRDtJQUVLLE9BQUw2VTtHQUNtQztZQUVyQzFWLE9BQU9LLE1BQUtxcEQsUUFDZCw4QkFEU3JwRCxNQUFLcXBELFFBQ1c7WUFFdkI5b0QsTUFBTVAsTUFBTyw4QkFBUEEsVUFBa0M7WUFFeENzcEQsU0FBUzFyRCxHQUNYLGdCQURXQSxnQ0FDaUU7WUFFMUUyckQsT0FBT2wwQztJQUNULGdDQURTQTtLQUNxQjtJQUNqQixJQUFUakssU0FBUyx1QkFDYi9NOztLQUNvQixJQUFkNUIsSUFBYyxnQkFKWDRZLEdBR1RoWDsyQkFESStNLFFBQ0ovTSxXQU5FaXJELFNBT0k3c0Q7MkJBRkYyTyxTQUNKL00sb0JBTkVpckQsU0FPSTdzRDtLQUROO2tCQUtBLG9DQU5JMk87U0FDSi9NOztHQUs2QjtZQUUzQm1yRCxTQUFTbHREO0lBQ1gsZ0NBRFdBO0tBQ21CO2FBQzFCbXRELE1BQU10cUQ7S0FDUixTQURRQTs7Ozs7OztLQUtEOztJQUEwQztJQUd0QyxJQUFUaU0sU0FBUyx1QkFDYi9NOztLQUZpQztNQUF4QkMsVUFFVEQ7TUFGaUMsTUFQN0JvckQsTUFPbUMsZ0JBVDVCbnRELEdBU0ZnQzthQVBMbXJELE1BT2UsZ0JBVFJudEQsR0FTRmdDO0tBR1AsdUJBRkU4TSxRQUNKL00sR0FDcUI7S0FBbkIsVUFERkE7a0JBR0Esb0NBSkkrTTtTQUNKL007O0dBRzZCOzs7O09BeEQzQjBHO09BQ0FQO09BS0F3a0Q7T0FHQUM7T0FFQUM7T0FLQUM7T0FFQWhHO09BTUF4akQ7T0FHQVk7T0FLQWdwRDtPQVVBQzs7O0V6QzlETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0kwQzJES0U7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQTdGO1lBRUE4Rjs7O09BQ1c7O09BQ0E7O09BQ0k7O09BQ0U7O09BQ0Q7O09BQ0U7O09BQ1Q7O09BQ0E7Ozs7OztPQUdJOztPQUNBO2VBQ0w7O0dBQUM7R0FiVCxJQWtCQUMsY0FDQUM7WUFXTUMsTUFBTUMsS0FBSXp3QixLQUFJOTlCLEdBQUV3dUQsS0FBSWh1RDtJQUMxQixHQURzQmd1RCxRQUFOMXdCO0tBQ2UsMkJBRG5CeXdCLEtBQUl6d0IsS0FDMkIsV0FEdkI5OUIsR0FBSjg5QjtJQUVPLDRCQUZHdDlCLEtBQUpndUQsdUJBRWpCOzs7O01BQ0UsaUJBSFMxd0IsS0FBTTB3QixnQkFFakJoOEM7TUFGQzg3QyxNQUFNQyxLQUFJendCLEtBQUk5OUIsR0FBRXd1RCxhQUFJaHVEO01BSW5CLFdBRkZnUzs7Ozs7O0dBR0k7WUFDSGk4QyxNQUFNRixLQUFJendCLEtBQUk5OUIsR0FBRXd1RCxLQUFJaHVEO0lBQzFCLE9BRHNCZ3VELEtBQ04sMkJBREpELEtBQUl6d0IsS0FDWSxXQURSOTlCLEdBQUo4OUI7SUFFRSw0QkFGUXQ5QixLQUFKZ3VELGVBRWpCOzs7O01BQ0UsaUJBSFMxd0IsS0FBTTB3QixnQkFFakJoOEM7TUFGQ2k4QyxNQUFNRixLQUFJendCLEtBQUk5OUIsR0FBRXd1RCxhQUFJaHVEO01BSW5CLFdBRkZnUzs7Ozs7O0dBR0k7WUFDUEMsS0FBY3VzQyxNQUFNMFAsUUFBbUJDLE1BQUszdUQ7SUFDOUMsSUFBSXV1RCxNQUFNLGVBRE12UCxNQUFNMFAsUUFBbUJDLE9BRXJDQyxPQUZxQ0Q7SUFHekMsT0FIc0JEO2VBTmhCRDtnQkFPRkYsS0FJMEIsZUFIMUJLLFVBRjBDNXVELEdBRTFDNHVELGNBRnFDRDtjQUNyQ0o7ZUFiRUQsTUFhRkMsS0FHb0IsZUFGcEJLLFVBRjBDNXVELE1BQUwydUQsT0FDckNKO0dBSXFFO1lBSXZFSSxLQUFLdnJEO0lBQ1A7S0FBSTNCLElBQUksaUJBREQyQjtLQUVIOFYsSUFBSSxlQURKelg7S0FFSixPQUZJQTtLQUNJOztTQUNSUzs7TUFBNkIsK0JBSHRCa0IsR0FHUGxCO01BQW9CLGlCQURoQmdYLEdBQ0poWDtNQUFvQixXQUFwQkE7Ozs7O0lBQ0EsT0FGSWdYO0dBRUg7WUFPQzIxQyxjQUFjTjtJQUNoQjtLQUEyRCxPQVp6REksS0FXY0o7S0FDa0I7SUFBbEMsZ0JBL0RBSixtQkErRG9CLGFBREpJO0dBQ3NEO1lBb0JwRTVnRCxPQUFPcXhDLE1BQUswUCxRQUNkLHNCQURTMVAsTUFBSzBQLGFBQ2tCO1lBQzlCcjRDLElBQUlrNEMsS0FBTSxtQ0FBTkEsVUFBMkI7WUFDL0IvL0MsSUFBSSsvQztJQUFNO0lBQWlCLHNCMUMvSmxDLDJCMEMrSldBO0dBQTJCO1lBTy9CTyxnQkFBY1A7SUFBTSxPQTdGdEJKLG1CQTZGeUMsYUFBekJJO0dBQW1DO1lBS2pEUSxTQUFTL1AsTUFBSzBQLFFBQU81cUQ7SUFDZixJQUFKVixJQWhCRnVLLE9BZVNxeEMsTUFBSzBQO0lBRWhCLFdBZEVsZ0QsSUFhRXBMLElBRG1CVTtJQUV2QixPQURJVjtHQUVIO1lBTUM0ckQsU0FBT2hRLE1BQUswUCxRQUFPTztJQUNyQixzQkFEU2pRLE1BQUswUCxZQUFPTztHQUNjO1lBYWpDQyxnQkFBY1g7SUFDa0Isd0JBRGxCQTtJQUNoQixnQkExSEFKLG1CQTBIb0IsYUFESkk7R0FDMkI7WUFHekNZLE1BQWdCL3JELEdBQTBCM0I7SUFDNUMsT0FBTSx1QkFEWTJCO2NBR0csY0FISEEsT0FBMEIzQjtjQUU3QixjQUZHMkIsT0FBMEIzQjtHQUc0QjtZQU90RTJ0RCxPQUFjcFEsTUFBTTBQLFFBQW1CTyxLQUFJanZEO0lBQ25DLElBSEt1dUQsTUExQmJTLFNBNEJjaFEsTUFBTTBQLFFBQW1CTztJQUV6QyxHQUZzQlA7S0FEdEI7UUFDeUNPO1VBRHpDOXNEOztPQUFvQixjQURMb3NELEtBQ2Zwc0QsS0FBcUMsV0FDUW5DLEdBRDdDbUM7T0FBb0IsVUFBcEJBO1VBQ3lDOHNELFFBRHpDOXNEOzs7O0tBS29CLE9BTkxvc0Q7O0lBRGYsVUFHeUNVLGFBSHpDOzs7O01BQXlCLGNBQ1ZWLEtBRGZyc0QsR0FBMEMsV0FHR2xDLEdBSDdDa0M7TUFBeUIsVUFBekJBOzs7OztJQU1jLE9BTENxc0Q7R0FNZ0M7WUFDN0NjLFNBQWtCclEsTUFBTTBQLFFBQWtCcDRCO0lBQzVDO0tBQUlnNUIsS0FsQ0ZOLFNBaUNrQmhRLE1BQU0wUCxRQUFrQnA0QjtLQUV4Qzd5QixNQUZzQmlyRDtXQUFrQnA0Qjs7O1NBTzVDcDBCOztNQUFzQyxjQU5sQ290RCxJQU1KcHRELElBTEl1QiwwQkFGd0M2eUIsTUFPNUNwMEI7TUFBc0MsVUFBdENBOzs7OztJQUNBLE9BUElvdEQ7R0FPRjtZQUtBQyxTQUFPdlEsTUFBSzBQLFFBQU9jLE1BQUtDO0lBQzFCLHNCQURTelEsTUFBSzBQLFlBQU9jLE1BQUtDO0dBQ2dCO1lBZXhDQyxnQkFBY25CO0lBQ2hCLElBQStDLG9CQUQvQkEsTUFDa0Isb0JBRGxCQTtvQkFDaEIsU0ExS0FKLG1CQTBLb0IsYUFESkk7R0FDeUM7WUFPdkRvQixXQUFXdnNELEdBQUUzQixHQUFJLHFCQUFOMkIsT0FBRTNCLElBQStCO1lBQzVDbXVELFlBQVl4c0QsR0FBRTNCLEdBQUkscUJBQU4yQixPQUFFM0IsSUFBZ0M7WUFlOUNvdUQsT0FBYzdRLE1BQU0wUCxRQUFtQmMsTUFBS0MsTUFBS3p2RDtJQUN6QyxJQVBLdXVELE1BbENiZ0IsU0F3Q2N2USxNQUFNMFAsUUFBbUJjLE1BQUtDO0lBRTlDLEdBRnNCZjtLQUx0QjtRQUs4Q2U7VUFMOUN0bUM7O09BQ0U7VUFJdUNxbUM7WUFKdkNydEQ7O1NBQ0UsY0FIV29zRCxLQUVicHNELEtBREZnbkIsS0FFdUIsV0FHNEJucEIsR0FKakRtQyxLQURGZ25CO1NBRUksVUFERmhuQjtZQUl1Q3F0RCxTQUp2Q3J0RDs7OztPQURGO1VBSzhDc3RELFNBTDlDdG1DOzs7O0tBU29CLE9BVkxvbEM7O0lBTGYsVUFXeUNpQixjQVh6Qzs7OztNQUNFLFVBVTRDQyxjQVY1Qzs7OztRQUNFLGNBR1dsQixLQUxmcnNELEdBQ0VzUSxHQUNxQixXQVM0QnhTLEdBWG5Ea0MsR0FDRXNRO1FBQ0UsVUFERkE7Ozs7O01BREY7Ozs7O0lBY2MsT0FUQys3QztHQVVzQztZQUNuRHVCLFdBQWtCOVEsTUFBTTBQLFFBQWtCcDRCO0lBQzVDO0tBQUlrNUIsT0FEd0NsNUI7S0FFeENtNUIsYUFEQUQsNEJBRHdDbDVCO0tBR3hDZzVCLEtBaERGQyxTQTZDa0J2USxNQUFNMFAsUUFDdEJjLE1BQ0FDO0tBRUFoc0QsTUFKc0JpckQ7S0FTMUIsTUFSSWM7OztTQVFKdHREOztNQUNZLElBQU42dEQsdUJBVnNDejVCLE1BUzVDcDBCO1NBQ002dEQsbUJBUkZOO09BVUE7TUFWd0IsVUFBeEJBLGNBVUE7O1dBQ0ZqOUM7O1FBQ0U7VUFYQTg4QyxJQU1KcHRELElBTEl1QixTQVNGK08sSUFURS9PLDBCQU1Fc3NELEtBR0p2OUM7UUFDRSxVQURGQTs7Ozs7TUFKRjs7Ozs7SUFRQSxPQWRJODhDO0dBY0Y7WUFLQVUsU0FBT2hSLE1BQUswUCxRQUFPYyxNQUFLQyxNQUFLUTtJQUMvQixzQkFEU2pSLE1BQUswUCxZQUFPYyxNQUFLQyxNQUFLUTtHQUNpQjtZQWlCOUNDLGdCQUFjM0I7SUFDaEI7S0FBNEQsNEJBRDVDQTtLQUMrQixvQkFEL0JBO0tBQ2tCLG9CQURsQkE7OztlQUNoQixTQS9PQUosbUJBK09vQixhQURKSTs7R0FDc0Q7WUFPcEU0QixhQUFhL3NELEdBQUUzQixHQUFFeXFCLEdBQUkscUJBQVI5b0IsT0FBRTNCLEdBQUV5cUIsSUFBa0M7WUFDbkRra0MsY0FBY2h0RCxHQUFFM0IsR0FBRXlxQixHQUFJLHFCQUFSOW9CLE9BQUUzQixHQUFFeXFCLElBQW1DO1lBQ3JEbWtDLGFBQWFqdEQsR0FBRTNCLEdBQUkscUJBQU4yQixPQUFFM0IsSUFBK0I7WUFDOUM2dUQsY0FBY2x0RCxHQUFFM0IsR0FBSSxxQkFBTjJCLE9BQUUzQixJQUFnQztZQW1CaEQ4dUQsT0FBY3ZSLE1BQU0wUCxRQUFtQmMsTUFBS0MsTUFBS1EsTUFBS2p3RDtJQUM5QyxJQVRLdXVELE1BeENieUIsU0FnRGNoUixNQUFNMFAsUUFBbUJjLE1BQUtDLE1BQUtRO0lBRW5ELEdBRnNCdkI7S0FQdEI7UUFPbUR1QjtVQVBuRG4wQjs7T0FDRTtVQU00QzJ6QjtZQU41Q3RtQzs7U0FDRTtZQUtxQ3FtQztjQUxyQ3J0RDs7V0FDRSxjQUpTb3NELEtBR1hwc0QsS0FERmduQixLQURGMlMsS0FHMkIsV0FJNkI5N0IsR0FMcERtQyxLQURGZ25CLEtBREYyUztXQUdNLFVBREYzNUI7Y0FLcUNxdEQsU0FMckNydEQ7Ozs7U0FERjtZQU00Q3N0RCxTQU41Q3RtQzs7OztPQURGO1VBT21EOG1DLFNBUG5EbjBCOzs7O0tBV29CLE9BWkx5eUI7O0lBUGYsVUFleUNpQixjQWZ6Qzs7OztNQUNFLFVBYzRDQyxjQWQ1Qzs7OztRQUNFLFVBYStDUSxjQWIvQzs7OztVQUNFLGNBSVMxQixLQVBmcnNELEdBQ0VzUSxHQUNFMmtCLEdBQ3VCLFdBWTZCbjNCLEdBZnhEa0MsR0FDRXNRLEdBQ0Uya0I7VUFDRSxVQURGQTs7Ozs7UUFERjs7Ozs7TUFERjs7Ozs7SUFrQmMsT0FYQ28zQjtHQVkyQztZQUN4RGlDLFdBQWtCeFIsTUFBTTBQLFFBQWtCcDRCO0lBQzVDO0tBQUlrNUIsT0FEd0NsNUI7S0FFeENtNUIsYUFEQUQsNEJBRHdDbDVCO0tBR3hDMjVCO2FBREFSOzs0Q0FGd0NuNUI7S0FJeENnNUIsS0F6REZVLFNBcURrQmhSLE1BQU0wUCxRQUN0QmMsTUFDQUMsTUFDQVE7S0FFQXhzRCxNQUxzQmlyRDtLQVUxQixNQVRJYzs7O1NBU0p0dEQ7O01BQ1ksSUFBTjZ0RCx1QkFYc0N6NUIsTUFVNUNwMEI7U0FDTTZ0RCxtQkFURk47T0FXQTtNQVh3QixVQUF4QkEsY0FXQTs7V0FDRmo5Qzs7UUFDWSxJQUFOZzhDLHVCQUpGdUIsS0FHSnY5QztXQUNNZzhDLG1CQVpKeUI7U0FjRTtRQWRzQixVQUF4QkEsY0FjRTs7YUFDRjk0Qjs7VUFDRTtZQWZGbTRCO1lBTUpwdEQsSUFMSXVCO1lBU0YrTyxJQVRFL087WUFhQTB6QixJQWJBMXpCOzZCQVVJK3FELEtBR0pyM0I7VUFDRSxVQURGQTs7Ozs7UUFMQSxVQUNGM2tCOzs7OztNQUpGOzs7OztJQWFBLE9BbkJJODhDO0dBbUJGO1lBV0ZtQixtQkFBbUJydEQ7SUFDckIsYUFBRyxpQkFEa0JBOztjQUVoQjtHQUF5QztZQUM1Q3N0RCxtQkFBbUJ0dEQ7SUFDckIsYUFBRyxpQkFEa0JBOztjQUVoQjtHQUF5QztZQUM1Q3V0RCxtQkFBbUJ2dEQ7SUFDckIsYUFBRyxpQkFEa0JBOztjQUVoQjtHQUF5QztZQUM1Q3d0RCxtQkFBbUJ4dEQ7SUFDckIsYUFBRyxpQkFEa0JBOztjQUVoQjtHQUF5QztZQUs1Q3l0RCxVQUFVenRELEdBQUksdUJBQUpBLFFBQWtCO1lBQzVCMHRELFVBQVUxdEQsR0FBRW9zRCxNQUFPLHVCQUFUcHNELE9BQUVvc0QsT0FBeUI7WUFDckN1QixVQUFVM3RELEdBQUVvc0QsTUFBS0M7SUFBTyx1QkFBZHJzRCxPQUFFb3NELE1BQUtDO0dBQThCO1lBQy9DdUIsVUFBVTV0RCxHQUFFb3NELE1BQUtDLE1BQUtRO0lBQU8sdUJBQW5CN3NELE9BQUVvc0QsTUFBS0MsTUFBS1E7R0FBbUM7Ozs7T0FwVnpEMUM7T0FDQUM7T0FTQVM7T0FDQUM7T0FUQVQ7T0FDQUM7T0FDQUM7T0FDQUM7T0FHQUc7T0FGQUY7T0FDQUM7T0FFQUU7T0FHQTNGO09BRUE4RjtPQWtCQUM7T0FDQUM7V0F1QkU1N0MsTUFTQWs4QyxNQVdBRTs7UUFxQkFsaEQ7UUFlQW9oRDs7UUFMQUQ7UUFSQXo0QztRQUNBN0g7UUFZQXVnRDs7UUFTQUM7UUE0QkFJOztRQWRBRjtRQUlBQztRQWVBRTs7UUFhQUU7UUF3Q0FNOztRQXhCQUg7UUFRQUM7UUFDQUM7UUFvQkFFOztRQXNCQUU7UUFnREFPOztRQTlCQUw7UUFRQUM7UUFDQUM7UUFDQUM7UUFDQUM7UUF3QkFFO09Ba0NGQztPQUdBQztPQUdBQztPQUdBQzs7T0FPQUM7T0FDQUM7T0FDQUM7T0FDQUM7OztFMUMvWUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1kyQzhCT3JqRCxjQUNGLG1EQUE4QjtZQUU1QmEsSUFBSXJPLEdBQUU0cEIsSUFBR0MsSUFBR2luQyxJQUFHQztJQUNqQixjQURNL3dELE1BQ2dCLHNCQURkNHBCO0lBRVIsY0FGTTVwQixNQUFLNnBCO0lBR2UsSUFIWm1uQyxPQUdZLGNBSFpGO0lBR2QsY0FITTl3RCxNQUFRZ3hEO0lBSVksSUFKVEMsT0FJUyxjQUpURjtJQUlqQixxQkFKTS93RCxNQUFXaXhEO0dBSWtDO1lBRWpEQyxHQUFHdG5DLElBQUdDLElBQUdpbkMsSUFBR0M7SUFDTixJQUFKL3dELElBVkZ3TjtJQUdBYSxJQU9Fck8sR0FEQzRwQixJQUFHQyxJQUFHaW5DLElBQUdDO0lBRWQsT0FESS93RDtHQUNnQjtZQUtsQnNlLEtBQUt0ZSxHQUNFLElBQUxnVCxNQWpCRnhGLFdBaUJtQixhQURkeE4sR0FDSGdULE1BQWlCLE9BQWpCQSxJQUFnQztZQU9sQ20rQyxPQUFPbnhELEdBQUVveEQ7SUFDWDtLQUFJOXZELElBRE84dkQ7S0FFUDV2RCxJQUFJLDJCQURKRjtLQUVKLE1BRklBO0tBQ0k7O1NBQ1JTOztNQUMrQix1REFKcEJxdkQsTUFHWHJ2RDtNQUNFLDZCQUZFUCxHQUNKTztNQUNFLFVBREZBOzs7OztJQUdBLGVBSklQLEdBREFGO0lBTUssSUFBTDYxQixLQUFLLDZCQUxMMzFCO0lBTUosZUFOSUEsR0FEQUY7SUFRSztLQUFMODFCLEtBQUssNkJBUEw1MUI7S0FXRSxvQ0FKRjQxQjtLQUdFLG9DQUhGQTtLQUVFLG9DQUpGRDtJQU1FLE9BbENKOW9CLElBcUJPck8sR0FVSCw4QkFIRm0zQjtHQU00QjtZQUU5QjlZLEtBQUsreUMsTUFDQyxJQUFKcHhELElBeENGd04sV0F3QkEyakQsT0FnQkVueEQsR0FER294RCxPQUNhLE9BQWhCcHhELEVBQWdDO1lBRWxDcXhELHNCQUNGLE9BSkVoekMsS0FJRyx5QkFBZ0I7WUFHbkJpekMsS0FBS3R4RDtJQUNQLE9BQWEsa0NBRE5BO0dBQytCO1lBR2hDdXhELE9BQU92eEQsR0FBRXNCO0lBQ2Y7S0FBUSxJQUFKZ0QsSUFMRmd0RCxLQUlXdHhELElBRVQyRCxhQURBVyxHQURXaEQ7MENBQ1hnRCxJQUNBWDtLQUMrQyxPQUQvQ0E7O0dBQ2dEO1lBRWxEaXFELE1BQUk1dEQsR0FBRXd4RDtJQUNSLGlCQURRQSxvQkFHSCxPQVJDRCxPQUtBdnhELEdBQUV3eEQ7SUFFSDtHQUNjO1lBU2pCQyxTQUFTenhELEdBQUV3eEQ7SUFDYixRQURhQSxPQUVYO3FCQUZXQSxPQU1YLE9BdkJJRCxPQWlCS3Z4RCxHQUFFd3hEO0lBSmI7OztNQUFJbHRELElBQWlCLGtDQUlWdEU7TUFIUDJELGFBREFXLEdBSVNrdEQ7OENBSlRsdEQsSUFDQVg7S0FDOEMsT0FEOUNBOztHQVNZO1lBR2QrdEQsT0FBTzF4RCxHQUNULDJCQUFlLGNBRE5BLElBQ2M7WUFVckIwdEQsTUFBTTF0RCxHQUFFd3hEO0lBQ1YsR0FBRyxlQURPQTtLQUVMO0lBUkw7S0FBUSxJQUFKbHRELElBTEZvdEQsT0FXTTF4RCxjQUxKMkQsSUFBSSxTQURKVyxHQU1Na3REO0tBSkEsb0JBRk5sdEQsSUFDQVgsMEJBS002dEQ7O0tBRkwsT0FIRDd0RDs7R0FRaUI7T0FHbkJndUQ7WUFXQWhFLE1BQU0zdEQsR0FBRXd4RDtJQUNWLEdBQUcsZUFET0E7S0FFTDtJQVJMO0tBQVE7TUFBSmx0RCxJQUFJLCtCQUEwQixjQU0xQnRFO01BTEoyRCxJQUFJLHVCQURKVyxHQU1Na3REO0tBSkE7O3dCQUZObHRELEdBQ0FYO1NBQ2dCLHVCQUFJLGdDQUlkNnREOztLQUZMLE9BSEQ3dEQ7O0dBUWlCOztJQUduQml1RDs7a0JBRU81eEQsR0FBSyxPQXBDWjB4RCxPQW9DTzF4RCxHQUFrQztrQkFDbENBLEdBQUssMkJBQW1CLGNBQXhCQSxJQUFrQztJQUd6QzZ0RDs7a0JBRU83dEQsR0FBRXd4RCxPQUFTLE9BL0JsQjlELE1BK0JPMXRELEdBQUV3eEQsT0FBZ0U7O1NBQ2xFeHhELEdBQUV3eEQ7U0FBUywyQkFmbEI3RCxNQWVPM3RELEdBQXVDLG9CQUFyQ3d4RDtRQUFnRTtZQVV6RUssUUFBTTd4RCxHQUFFd3hEO0lBQVE7S0FMVixJQUFKaHdELElBQUksY0FLQXhCLElBSkpzQixJQUFJLCtCQURKRTtLQUVELGlCQURDRjtNQUljLE9BSEYsNEJBRFpBLDhCQUlNa3dEOztHQUEyQjtZQUduQ00sS0FBSzl4RCxHQUFJLDJDQUFKQSxTQUFlO1lBR3BCNGIsTUFBTTViO0lBQ1I7S0FBSTRwQixLQUFLLGNBREQ1cEI7S0FDaUI2cEIsS0FBSyxjQUR0QjdwQjtLQUVKOHdELEtBQUssY0FGRDl3RDtLQUVpQit3RCxLQUFLLGNBRnRCL3dEO0lBR1IsT0FqSUVreEQsR0ErSEV0bkMsSUFBcUJDLElBQ3JCaW5DLElBQXFCQztHQUNYO1lBR2RnQixrQkFFRixPQXRJSWIsdUJBeUl5QjtHQUc3QixJQURFYyxhQUNGLHFDQWRJcDJDLFFBTUZtMkM7WUFVQUU7SUFBVSxPQXpHUlgsS0F5R21CLGlDQUhyQlU7R0FHZ0Q7WUFDaERFLE1BQUlWO0lBQVEsT0FqR1Y1RCxNQWlHb0IsaUNBSnRCb0UsYUFJSVI7R0FBbUQ7WUFDdkRXLFdBQVNYO0lBQVEsT0F0RmZDLFNBc0Y4QixpQ0FMaENPLGFBS1NSO0dBQXdEO1lBQ2pFWSxRQUFNWjtJQUFRLE9BbkVaOUQsTUFtRXdCLGlDQU4xQnNFLGFBTU1SO0dBQXFEO1lBQzNEYSxZQUFVYjtJQUFRLE9BdkNoQjNELFVBdUNnQyxpQ0FQbENtRSxhQU9VUjtHQUF5RDtZQUNuRWMsUUFBTWQ7SUFBUSxPQXBEWjdELE1Bb0R3QixpQ0FSMUJxRSxhQVFNUjtHQUFxRDtZQUMzRGUsUUFBTUM7SUFBUSxPQTVCWlgsUUE0QndCLGlDQVQxQkcsYUFTTVE7R0FBcUQ7WUFDM0RDO0lBQVUsT0ExQlJYLEtBMEJtQixpQ0FWckJFO0dBVWdEO1lBQ2hEVTtJQUFZLE9BbkZWaEIsT0FtRnVCLGlDQVh6Qk07R0FXb0Q7WUFDcERXO0lBQVksT0FBYSwrQ0FaekJYO0dBWW9EO1lBQ3BEWTtJQUFnQixPQW5EZGhCLFdBbUQrQixpQ0FiakNJO0dBYTREO1lBRTVEYSxVQUFVekI7SUFBTyxPQTNJZkQsT0EySTRCLGlDQWY5QmEsYUFlVVo7R0FBb0Q7WUFDOUQ5K0MsS0FBSzgrQyxNQUFPLE9BRFp5QixjQUNLekIsT0FBMkI7WUFDaEMwQixpQkFBZSxPQUZmRCxVQUV5Qix5QkFBZTtZQUl4Q0U7SUFBVyxPQWxDVG4zQyxNQWtDcUIsaUNBckJ2Qm8yQztHQXFCa0Q7WUFJbERnQjtJQUFlLE9BN0piMTBDLEtBNkp3QixpQ0F6QjFCMHpDO0dBeUJxRDtZQUNyRGlCLFVBQVVqekQ7SUFBSSxvQkFBSkEsR0FBaUIsaUNBMUIzQmd5RDtHQTBCd0Q7Ozs7T0FWeEQxL0M7T0FEQXVnRDtPQUVBQztPQWRBYjtPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBRTtPQUNBQztPQUNBQztPQUNBQzs7UUExSEV2MEM7UUFHQWd6QztRQTFCQS95QztRQThCQWd6QztRQVNBMUQ7UUFZQTZEO1FBb0JBL0Q7UUE2QkFHO1FBWkFGO1FBeUJBa0U7UUFHQUM7UUF4REFKO1FBaUJBQztRQWlCQUM7UUF5QkFoMkM7T0FzQ0ZvM0M7T0FDQUM7T0FMQUY7OztFM0N2TUw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WTRDd0NLRyxrQkFBa0IxbkM7SUFDcEIsV0FEb0JBOztHQUVDO1lBRW5CMm5DLHVCQUF1QjNuQywrQkFDUztPQU01Qiw0Q0FERjRuQzs7OztJQUVGLElBQUk7Ozs7OztRQUZGQTs7R0FHSjtJQUpFQyxxQkFJRiw4QkFISUQ7SUFLRkUsYUFBYSw2QkFOYkQ7WUFRQUU7SUFBZSxvQ0FGZkQ7R0FFeUM7WUFDekNFO0lBQW1CLG9DQUhuQkY7R0FHd0M7R0FFN0IsSUFBWEcsV0FBVztZQVFQQyxjQUFjdnpELEdBQUVtQjtJQUN0QixJQURvQm1hO0lBQ3BCO1FBRHNCbmEsS0FBRm1hLEtBQ0wsT0FES0E7d0NBRXNCLE9BRnRCQTs7O0dBR1E7WUFFMUJqTyxPQUFTbWYsS0FBZ0NnbkM7SUFDM0MsR0FEV2huQztTQUFTRSxNQUFURixpQkFBU0U7O1NBQVQrbUMsU0FBUyw2QkFsQmxCTjtJQW1CTSxJQUFKdHpELElBTkUwekQsa0JBS3FDQztJQUUzQyxHQUZXQztLQUd3Qjs4Q0FoQmpDSDtNQWVFckMsT0FDYTs7U0FEYkE7SUFHSixjQUFrRCxlQUo5Q3B4RCxPQUNBb3hELE1BREFweEQ7R0FJa0U7WUFFcEUrM0IsTUFBTXZNO0lBQ1IsZUFEUUE7Ozs7O2NBR04sNEJBSE1BOztHQUlMO1lBRUQ0TixNQUFNNU47SUFDUixJQUFJam9CLE1BRElpb0I7NEJBQ0pqb0IsUUFFTyx1QkFISGlvQjs7WUFPSSxlQUFXLHVCQVBmQTs7O0lBSU4sT0FWQXVNLE1BTU12TTtHQVFMO1lBRURxb0M7SUFBa0IsWUFDVDtJQVlNO0tBWFRyUjtLQUFLcnNCO0tBQU12bUI7S0FXWC9SLGFBWEEya0QsS0FBS3JzQixNQUFNdm1CO0tBT0ZyUyxPQUlUTTtlQVhXK1I7O21CQVlmLE9BREkvUjtLQVBlO01BRFRpMkQ7TUFBS2o5QjtNQUFNazlCO01BQ1hyMkQsYUFEQW8yRCxPQUFLajlCLFFBQU1rOUI7S0FJUngyRCxVQUhIRztTQUdHSCxPQUhIRyxrQkFEV3EyRDs7R0FVcEI7WUFFSHoxQyxLQUFLa047SUFBSTtZQUFKQTs7S0FBb0Isb0NBakJ6QnFvQyxpQkFpQktyb0M7SUFBSSxXQUFKQTtHQUFzRDtZQUUzRC9kLE9BQU8rZCxHQUFJLE9BQUpBLEtBQVU7WUFFakJ3b0MsbUJBQW1CQyxVQUFTQyxTQUFRQyxPQUFNQztJQUM1QztLQUFJQyxRQUR3Q0Q7S0FFeENFLGFBQWEsZUFEYkQ7WUFEa0NGO0tBa0J0Qzs7Ozs7TUFDZ0IsOEJBbkJzQkEsT0FrQnRDbnlELGVBYklxMkI7TUFGb0I7VUFFcEJBO1FBQ0U7U0FESW1xQixNQUFObnFCO1NBQVdsQyxPQUFYa0M7U0FBaUJ6b0IsT0FBakJ5b0I7U0FDTU0sU0FOb0J1N0IsVUFLMUI3N0IsV0FBTW1xQixLQUFLcnNCO1NBS0xvK0IsT0FBTyxXQVZJTixVQUtYelI7U0FRR2xxQix5QkFYVGc4QixZQVFNQztXQUdHajhCO29CQVBISzs7U0FNTyxpQkFaMkJ5N0IsT0FVbENHLGtCQUpBNTdCO1FBU0osaUJBYkYyN0IsWUFRTUMsa0JBSkE1N0I7WUFETk4sT0FBaUJ6b0I7OztPQWNuQixXQURGNU47Ozs7Ozs7T0FsQjhCa3lEO0tBc0I1QixXQXJCRUcsZUFxQkY7Ozs7T0FDUSxJQUVDRywyQkF2QlBGLFlBb0JGdnlEO1VBR1N5eUQ7T0FIVDs7Ozs7Ozs7Z0JBdEI0Qk47O0dBMEJ4QjtZQUVKNTZCLE9BQU8yNkIsVUFBU3pvQztJQUNsQjtLQUFJMm9DLFFBRGMzb0M7S0FFZGlwQyxRQURBTjtLQUVBRSxRQURBSTtZQUNBSjs7SUFFVSxJQUFSRCxRQUFRLGVBRlZDLFdBR0VILGNBL0dKaEIsa0JBeUdnQjFuQztXQUtaNG9DO0lBR0osT0FwQ0FKLG1CQW9DbUIsV0FSWkMsVUFBU3pvQyxJQU1aMG9DLFNBTEZDLE9BSUVDO0dBSUg7WUFFRDFqRCxLQUFLN1EsR0FBRTJyQjtJQU1NLElBQVhrcEMsV0ExSEZ4QixrQkFvSE8xbkM7V0FNTGtwQyxVQXRIRnZCLHVCQWdITzNuQztJQU9ZO1NBRWZ6UyxJQVRHeVMsYUFTSHpTOztVQUNKaFg7OztvQ0FESWdYLEdBQ0poWDtPQVRrQjs7YUFHWHlnRCxnQkFBS3JzQixpQkFBTXZtQjtTQUNkLFdBTEMvUCxHQUlFMmlELEtBQUtyc0I7cUJBQU12bUI7OztRQU9oQixXQURGN047Ozs7Ozs7b0JBSkUyeUQsd0JBdEhGdkIsdUJBZ0hPM25DO0tBYWM7O1VBQ2xCc0U7O0tBQVMsR0FSVjRrQyw0Q0FRQzNrQztLQTlISG9qQyx1QkFnSE8zbkM7S0FnQlAsa0NBRkd1RTs7R0FFTTtZQXNCVDRrQyxtQkFBbUI5MEQsR0FBRTJyQjtJQUN2QixJQUFJelMsSUFEbUJ5UyxNQUVuQmtwQyxXQTVKRnhCLGtCQTBKcUIxbkM7V0FFbkJrcEMsVUF4SkZ2Qix1QkFzSnFCM25DO0lBR0Y7Z0JBRmpCelM7O1VBckJnQ2hYOzs7T0EwQk0sOEJBTm5CeXBCLE1BcEJhenBCLFdBQUV4RSxVQU05QjhQOzs7U0FDUTtVQURObTFDLE1BQUZuMUM7VUFBTzhvQixPQUFQOW9CO1VBQWF1QyxPQUFidkM7VUFDUSxtQkFhS3hOLEdBZFgyaUQsS0FBS3JzQjtxQkFjUTNLLHlCQWRmbmUsT0FBYXVDO2FBS1ZpbkI7U0FDSCxHQVo4QnQ1QjtvQkFNOUI4UDs7VUFPVyxpQkFPSW1lLE1BcEJhenBCLFlBTTVCc0w7bUJBS0d3cEI7YUFYMkJ0NUIsT0FNOUI4UCxhQUFhdUM7OztXQU5pQnJTLHdCQUd2QixpQkFpQlFpdUIsTUFwQmF6cEI7UUEwQmhDLFdBMUJnQ0E7Ozs7Ozs7b0JBc0JoQzJ5RCx3QkF4SkZ2Qix1QkFzSnFCM25DO0tBUUE7O1VBQ2xCc0U7O0tBQVMsR0FQVjRrQyw0Q0FPQzNrQztLQS9KSG9qQyx1QkFzSnFCM25DO0tBV3JCLGtDQUZHdUU7O0dBRU07WUFFVDluQixLQUFLcEksR0FBRTJyQixHQUFFbFo7SUFPSSxJQUFYb2lELFdBOUtGeEIsa0JBdUtPMW5DO1dBT0xrcEMsVUExS0Z2Qix1QkFtS08zbkM7SUFRWTtLQUdSLElBRFB6UyxJQVZHeVMsTUFXSG5hLGFBWEtpQixhQVVMeUcsc0JBQ087O1VBQ1hoWDs7O09BQ29CO1FBWkYwYixTQVVkcE07UUFWWXVPLHVCQVNaN0csR0FFSmhYO1FBWGdCUDtRQUFFdUQ7T0FDbEI7V0FEZ0J2RDtTQUtHO1VBRFpnaEQsTUFKU2hoRDtVQUlKMjBCLE9BSkkzMEI7O1VBQUV5RCxTQUtDLFdBTmRwRixHQUtFMmlELEtBQUtyc0IsTUFKTXB4QjtVQUFGdkQ7VUFBRXVEOzs7UUFVZHNNLFlBVmN0TTtRQVdsQjs7Ozs7OztZQUxFMnZELFVBMUtGdkIsdUJBbUtPM25DO2dCQVdIbmE7OztVQU1EeWU7O0tBQVMsR0FWVjRrQyw0Q0FVQzNrQztLQXBMSG9qQyx1QkFtS08zbkM7S0FtQlAsa0NBRkd1RTs7R0FFTTtZQVNMNmtDO1FBQWMzdkQ7O21CQUNULE9BRFNBO0tBRUo7TUFBVDJLO01BQVMsU0FGSTNLOztnQkFFYjJLOzs7WUFFTGlsRCxNQUFNcnBDO0lBQ1IsVUFEUUE7aUJBRWVPLEdBQUV2cUI7S0FBZSxVQU5sQ296RCxpQkFNbUJwekQ7S0FBZSxrQ0FBakJ1cUI7SUFBb0M7SUFBekQ7S0FERStvQyxNQUNGO0tBQ0VDLFFBQVEsZUFGUkQ7S0FHSixNQUpRdHBDO2lCQUtEaHFCO0tBQ0ssSUFBSk0sSUFWRjh5RCxpQkFTQ3B6RDtLQUZIdXpELFVBR0lqekQsc0JBSEppekQsT0FHSWp6RDtLQUNKO0lBQTBCO0lBSDlCO0lBS0EsV0FUUTBwQix1QkFDSnNwQyxLQUVBQztHQVN3QjtZQUkxQnArQyxPQUFPNFY7SUFHVCxJQUFJeW9DLFdBSEt6b0M7SUFLVCxTQUFRM08sSUFBSTdiLEdBQUVrekQ7S0FBVSxJQUFaanpELFNBQUVrekQ7S0FBVTtTQUFWQTtXQUtKMVMsTUFMSTBTLFdBS0MvK0IsT0FMRCsrQixXQUtPdGxELE9BTFBzbEQ7T0FNUixlQURJMVMsS0FBS3JzQixxQjVDelFsQixPNENvUVd2WSxJQUFJNWIsS0FLUzROOztTQUxUNU4sUUFGUmd6RCxxQkFLTztNQUNTO09BSk5HLDBCQUZWSCxVQUVRaHpEOzs7T0FBRWt6RDs7SUFNMEI7SUFFeEM7eUI1QzVRSCxPNENvUVd0M0M7R0FRRztZQUVUdzNDLFlBQVlycEM7SUFBZ0IsVUFmNUJwVixPQWVZb1Y7c0I1QzlRakI7STRDOFFpQztHQUFVO1lBRXRDc3BDLGNBQWN0cEM7SUFBZ0IsVUFqQjlCcFYsT0FpQmNvVjtzQjVDaFJuQjtJNENnUm1DO0dBQVU7O2FBb0ZwQ3VwQyxVQUFVOXBDLEdBQUVnM0I7S0FDZCxVQURZaDNCO0tBQ1osd0JBRFlBLE1BQUVnM0I7SUFDMkM7YUFFdkR4d0IsSUFBSXhHLEdBQUVnM0IsS0FBSXJzQjtLQUNaO01BQUlwMEIsSUFKRnV6RCxVQUdJOXBDLEdBQUVnM0I7TUFFSitTLGFBRkkvUyxLQUFJcnNCLHVCQUFOM0ssTUFDRnpwQjtLQUVKLGlCQUhNeXBCLE1BQ0Z6cEIsWUFDQXd6RDtLQUZFL3BDOztrQkF0TlI4TixPQW1OSWc4QixXQUdJOXBDO0lBS3VEO2FBZTNEc0gsT0FBT3RILEdBQUVnM0I7S0FDWDtNQWRzQnpnRCxJQVZwQnV6RCxVQXVCTzlwQyxHQUFFZzNCO01BRWlCLHFCQUZuQmgzQixNQWJhenBCO01BQU1yRTtNQUcxQkg7O2lCQURFO1VBQ1N5NUIsSUFBWHo1QixTQUFjcVMsT0FBZHJTO01BQ0ssb0JBRE15NUIsR0FVRndyQjtPQUFGaDNCO2NBYm1COXRCOzhCQUdaa1M7bUNBVVA0YixNQWJhenBCLFlBR042Tjs7VUFIWWxTLFNBRzFCSCxhQUFjcVM7O0lBWXNCO2FBUXBDNkIsS0FBSytaLEdBQUVnM0I7S0FDVDtNQUFjLE1BbENaOFMsVUFpQ0s5cEMsR0FBRWczQjtNQUNILHlCQURDaDNCO2lCQUVJO1NBQ0FncUMsZUFBU3IrQixlQUFTcytCO0tBQ3RCLG9CQUpFalQsS0FHRWdULEtBQ2dCLE9BRFByK0I7VUFBU3MrQixPQUdkO1NBQ0FDLEtBSmNELFVBSUxyK0IsS0FKS3ErQixVQUlJRSxRQUpKRjtLQUtsQixvQkFSRmpULEtBT01rVCxLQUNnQixPQURQdCtCO1VBQVN1K0IsT0FHZDtTQUNBQyxLQUpjRCxVQUlMRSxLQUpLRixVQUlJRyxRQUpKSDtLQUtsQixvQkFaTm5ULEtBV1VvVCxLQUNnQixPQURQQztpQkFBU0M7O2tCQWZqQztVQUNPOStCLGNBQUdiLGlCQUFNdm1CO01BQ2Isb0JBRUU0eUMsS0FIRXhyQixJQUNlLE9BRFpiO2tCQUFNdm1COztJQWV5QzthQVEzRHVMLFNBQVNxUSxHQUFFZzNCO0tBQ2I7TUFBYyxNQXREWjhTLFVBcURTOXBDLEdBQUVnM0I7TUFDUCx5QkFES2gzQjtpQkFFQTtTQUNBZ3FDLGVBQVNyK0IsZUFBU3MrQjtLQUN0QixvQkFKTWpULEtBR0ZnVCxLQUNnQixXQURQcitCO1VBQVNzK0IsT0FHZDtTQUNBQyxLQUpjRCxVQUlMcitCLEtBSktxK0IsVUFJSUUsUUFKSkY7S0FLbEIsb0JBUkVqVCxLQU9Fa1QsS0FDZ0IsV0FEUHQrQjtVQUFTdStCLE9BR2Q7U0FDQUMsS0FKY0QsVUFJTEUsS0FKS0YsVUFJSUcsUUFKSkg7S0FLbEIsb0JBWkZuVCxLQVdNb1QsS0FDZ0IsV0FEUEM7aUJBQVNDOztrQkFmakM7VUFDTzkrQixjQUFHYixpQkFBTXZtQjtNQUNiLG9CQUVNNHlDLEtBSEZ4ckIsSUFDZSxXQURaYjtrQkFBTXZtQjs7SUFla0Q7YUFFcEV3TCxTQUFTb1EsR0FBRWczQjtjQUNMdVQ7TUFBaUI7O3FCQUVyQjtXQUNPLytCLGdCQUFRamUsZ0JBQUduSjtPQUNmLG9CQURJb25CLEdBSkV3ckIsTUFNSixXQUZVenBDLEdBSFhnOUMsZUFHY25tRDs7O0tBR007S0FDTCxVQTNFckIwbEQsVUFtRVM5cEMsR0FBRWczQjtLQVFFLE9BUFB1VCxnQ0FER3ZxQztJQVE0QjthQVVyQ3dxQyxRQUFReHFDLEdBQUVnM0IsS0FBSXJzQjtLQUNoQjtNQUFJcDBCLElBdEZGdXpELFVBcUZROXBDLEdBQUVnM0I7TUFFUjFnRCxxQkFGTTBwQixNQUNOenBCO01BTkdzTCxPQU9Idkw7O1NBUEd1TDtXQUFNMnBCLElBQU4zcEIsU0FBU3VDLE9BQVR2QztPQUNBLHNCQURNMnBCLEdBS0R3ckIsVUFMTG4xQyxPQUFTdUM7T0FBVHZDLFVBS0ttMUM7T0FMTG4xQyxVQUtTOG9COzs7OztNQUdiO09BQ0QsaUJBSlEzSyxNQUNOenBCLGdCQURReWdELEtBQUlyc0IsTUFFWnIwQjtPQUZNMHBCOztlQU1tQyxPQTlTL0M4TixPQW1OSWc4QixXQXFGUTlwQzs7Ozs7OztJQU9QO2FBRURoUixJQUFJZ1IsR0FBRWczQjtLQUNSO01BS3NCLE1BcEdwQjhTLFVBOEZJOXBDLEdBQUVnM0I7K0JBQUZoM0I7S0FDa0I7a0JBRXBCO01BRUEsSUFET3dMLGNBQUdwbkIsaUJBQ1YsdUJBRE9vbkIsR0FKSHdyQjtNQUtKO2tCQURVNXlDOztJQUV3QjthQUVwQzRsQixRQUFRakosS0FBSXhxQjs7TUFDTCxJQUFRNEIsY0FBRnF6QjtNQUFRLE9BcEdyQmhGLElBbUdRekYsS0FDS3lLLEdBQUVyekI7S0FBa0I7S0FBbkMsc0NBRGM1QjtJQUN1QjthQUVuQ2swRCxZQUFZMXBDLEtBQUl4cUI7O01BQ1QsSUFBUTRCLGNBQUZxekI7TUFBUSxPQXJCckJnL0IsUUFvQll6cEMsS0FDQ3lLLEdBQUVyekI7S0FBc0I7S0FBdkMsc0NBRGtCNUI7SUFDdUI7YUFFdkMrYixPQUFPL2I7S0FDQyxJQUFOd3FCLE1BeFlOL2U7S0FvWUl5b0QsWUFJRTFwQyxLQURLeHFCO0tBRVQsT0FESXdxQjtJQUVEO0lBeEhQO1lBbFJFL2U7WUFPQXVxQjtZQU1BcUI7WUEyQkE5YTtZQXNQSTBUO1lBb0JBYztZQVVBcmhCO1lBb0JBMEo7WUFjQUM7WUFrQkE0NkM7WUFTQXg3QztZQXRTSjlKO1lBc0NBaWtEO1lBYUExc0Q7WUE1RkF3RjtZQTRIQW9uRDtZQWdCQWwrQztZQWVBeStDO1lBRUFDO1lBMExJNy9CO1lBR0F5Z0M7WUFHQW40Qzs7O1FBbUJJNVY7YUFDQWd1RCxZQUFhOUUsTUFBWWp4RCxHQUFJLHdCQUFKQSxHQUFZOzs4QkFEckMrSCxPQUNBZ3VEO0tBaktSbitCO0tBQ0FxQjtLQUNBOWE7S0FDQTBUO0tBQ0FjO0tBQ0FyaEI7S0FDQTBKO0tBQ0FDO0tBQ0E0NkM7S0FDQXg3QztLQUNBOUo7S0FDQWlrRDtLQUNBMXNEO0tBQ0F3RjtLQUNBb25EO0tBQ0FsK0M7S0FDQXkrQztLQUNBQztLQUNBNy9CO0tBQ0F5Z0M7O2FBZ0pJem9ELE9BQU9zd0IsSUFBSyw0QkFBTEEsSUFBNEI7YUFDbkNoZ0IsT0FBTy9iO0tBQ0MsSUFBTndxQixNQUZGL2U7S0FHRixXQW5KRnlvRCxhQWtKTTFwQyxLQURLeHFCO0tBRVQsT0FESXdxQjtJQUVEO0lBVlA7WUFNTS9lO1lBbktKdXFCO1lBQ0FxQjtZQUNBOWE7WUFDQTBUO1lBQ0FjO1lBQ0FyaEI7WUFDQTBKO1lBQ0FDO1lBQ0E0NkM7WUFDQXg3QztZQUNBOUo7WUFDQWlrRDtZQUNBMXNEO1lBQ0F3RjtZQUNBb25EO1lBQ0FsK0M7WUFDQXkrQztZQUNBQztZQUNBNy9CO1lBQ0F5Z0M7WUFpSkluNEM7O1lBYUpqRixLQUFLMVksR0FBSSw2QkFBSkEsR0FBZ0M7WUFDckNnMkQsV0FBV3Q1QyxJQUFHQyxJQUFHM2MsR0FBSSxpQkFBVjBjLElBQUdDLE9BQUczYyxHQUErQjtZQUNoRCsxRCxZQUFZOUUsTUFBS2p4RCxHQUFJLDBCQUFUaXhELE1BQUtqeEQsR0FBbUM7WUFFcERtMUQsVUFBVTlwQyxHQUFFZzNCO0lBQ2QsWUFEWWgzQjtjQUVQLG1CQUZPQSxNQUFFZzNCLFFBQUZoM0I7Y0FHUDtHQUFvRDtZQUV2RHdHLElBQUl4RyxHQUFFZzNCLEtBQUlyc0I7SUFDWjtLQUFJcDBCLElBTkZ1ekQsVUFLSTlwQyxHQUFFZzNCO0tBRUorUyxhQUZJL1MsS0FBSXJzQix1QkFBTjNLLE1BQ0Z6cEI7SUFFSixpQkFITXlwQixNQUNGenBCLFlBQ0F3ekQ7SUFGRS9wQzs7aUJBNVdKOE4sT0F1V0FnOEIsV0FLSTlwQztHQUt1RDtZQWUzRHNILE9BQU90SCxHQUFFZzNCO0lBQ1g7S0Fkc0J6Z0QsSUFacEJ1ekQsVUF5Qk85cEMsR0FBRWczQjtLQUVpQixxQkFGbkJoM0IsTUFiYXpwQjtLQUFNckU7S0FHMUJIOztnQkFERTtTQUNTeTVCLElBQVh6NUIsU0FBY3FTLE9BQWRyUztLQUNLLHNCQURNeTVCLEdBVUZ3ckI7TUFBRmgzQjthQWJtQjl0Qjs2QkFHWmtTO2tDQVVQNGIsTUFiYXpwQixZQUdONk47O1NBSFlsUyxTQUcxQkgsYUFBY3FTOztHQVlzQjtZQVFwQzZCLEtBQUsrWixHQUFFZzNCO0lBQ1QsSUFBYyxNQXBDWjhTLFVBbUNLOXBDLEdBQUVnM0IsTUFDSCx5QkFEQ2gzQjtnQkFFSTtRQUNBZ3FDLGVBQVNyK0IsZUFBU3MrQjtJQUN0QixzQkFKRWpULEtBR0VnVCxLQUNvQixPQURYcitCO1NBQVNzK0IsT0FHZDtRQUNBQyxLQUpjRCxVQUlMcitCLEtBSktxK0IsVUFJSUUsUUFKSkY7SUFLbEIsc0JBUkZqVCxLQU9Na1QsS0FDb0IsT0FEWHQrQjtTQUFTdStCLE9BR2Q7UUFDQUMsS0FKY0QsVUFJTEUsS0FKS0YsVUFJSUcsUUFKSkg7SUFLbEIsc0JBWk5uVCxLQVdVb1QsS0FDb0IsT0FEWEM7Z0JBQVNDOztpQkFmakM7U0FDTzkrQixjQUFHYixpQkFBTXZtQjtLQUNiLHNCQUVFNHlDLEtBSEV4ckIsSUFDbUIsT0FEaEJiO2lCQUFNdm1COztHQWU2QztZQVEvRHVMLFNBQVNxUSxHQUFFZzNCO0lBQ2IsSUFBYyxNQXhEWjhTLFVBdURTOXBDLEdBQUVnM0IsTUFDUCx5QkFES2gzQjtnQkFFQTtRQUNBZ3FDLGVBQVNyK0IsZUFBU3MrQjtJQUN0QixzQkFKTWpULEtBR0ZnVCxLQUNvQixXQURYcitCO1NBQVNzK0IsT0FHZDtRQUNBQyxLQUpjRCxVQUlMcitCLEtBSktxK0IsVUFJSUUsUUFKSkY7SUFLbEIsc0JBUkVqVCxLQU9Fa1QsS0FDb0IsV0FEWHQrQjtTQUFTdStCLE9BR2Q7UUFDQUMsS0FKY0QsVUFJTEUsS0FKS0YsVUFJSUcsUUFKSkg7SUFLbEIsc0JBWkZuVCxLQVdNb1QsS0FDb0IsV0FEWEM7Z0JBQVNDOztpQkFmakM7U0FDTzkrQixjQUFHYixpQkFBTXZtQjtLQUNiLHNCQUVNNHlDLEtBSEZ4ckIsSUFDbUIsV0FEaEJiO2lCQUFNdm1COztHQWVzRDtZQUV4RXdMLFNBQVNvUSxHQUFFZzNCO2FBQ0x1VDtLQUFpQjs7b0JBRXJCO1VBQ08vK0IsZ0JBQUdiLG1CQUFNdm1CO01BQ2Isc0JBRElvbkIsR0FKRXdyQixNQU1KLFdBRktyc0IsTUFITjQvQixlQUdZbm1EOzs7SUFHUTtJQUNMLFVBN0VyQjBsRCxVQXFFUzlwQyxHQUFFZzNCO0lBUUUsT0FQUHVULGdDQURHdnFDO0dBUTRCO1lBVXJDd3FDLFFBQVF4cUMsR0FBRWczQixLQUFJcnNCO0lBQ2hCLElBQUlwMEIsSUF4RkZ1ekQsVUF1RlE5cEMsR0FBRWczQixNQUVSMWdELHFCQUZNMHBCLE1BQ056cEIsV0FOR3NMLE9BT0h2TDs7UUFQR3VMO1VBQU0ycEIsSUFBTjNwQixTQUFTdUMsT0FBVHZDO01BQ0Esc0JBRE0ycEIsR0FLRHdyQixVQUxMbjFDLE9BQVN1QztNQUFUdkMsVUFLS20xQztNQUxMbjFDLFVBS1M4b0I7Ozs7O0tBR2I7TUFDRCxpQkFKUTNLLE1BQ056cEIsZ0JBRFF5Z0QsS0FBSXJzQixNQUVacjBCO01BRk0wcEI7O2NBTW1DLE9BcGMzQzhOLE9BdVdBZzhCLFdBdUZROXBDOzs7Ozs7O0dBT1A7WUFFRGhSLElBQUlnUixHQUFFZzNCO0lBQ1IsSUFLc0IsTUF0R3BCOFMsVUFnR0k5cEMsR0FBRWczQiwrQkFBRmgzQjtJQUNrQjtpQkFFcEI7O01BQ093TDtNQUFHcG5CO2tCQUNWLGFBRE9vbkIsR0FKSHdyQjs7aUJBSU01eUM7O0dBRXdCO1lBRXBDNGxCLFFBQVFqSixLQUFJeHFCOztLQUNMLElBQVE0QixjQUFGcXpCO0tBQVEsT0FwR3JCaEYsSUFtR1F6RixLQUNLeUssR0FBRXJ6QjtJQUFrQjtJQUFuQyxzQ0FEYzVCO0dBQ3VCO1lBRW5DazBELFlBQVkxcEMsS0FBSXhxQjs7S0FDVCxJQUFRNEIsY0FBRnF6QjtLQUFRLE9BckJyQmcvQixRQW9CWXpwQyxLQUNDeUssR0FBRXJ6QjtJQUFzQjtJQUF2QyxzQ0FEa0I1QjtHQUN1QjtZQUV2QytiLE9BQU8vYjtJQUNDLElBQU53cUIsTUE5aEJGL2U7SUEwaEJBeW9ELFlBSUUxcEMsS0FES3hxQjtJQUVULE9BREl3cUI7R0FFRDtZQUVENnBDLFFBQVV6cEMsS0FBZ0NuQjtJQUM1QyxHQURZbUI7U0FBU0UsTUFBVEYsaUJBQVNFOztTQUFUK21DLFNBQVMsNkJBcGpCbkJOO0lBcWpCTSxJQUFKdHpELElBeGlCRTB6RCxrQkF1aUJzQ2xvQztJQUU1QyxHQUZZb29DO0tBR3VCOzZDQWxqQmpDSDtNQWlqQkVyQyxPQUNhOztTQURiQSxZQUZ3QzVsQztJQU1uQztnQkFObUNBLHNCQUN4Q3hyQjtLQUtBaXhCLFVBTndDekYsTUFRbkMsZUFQTHhyQixPQUNBb3hEO1dBSUFuZ0M7V0FOd0N6Rjs7SUF0ZjFDd29DO29CNUNySEwsTzRDd2ZLc0IsVUF5SEVya0M7SUFNSixPQU5JQTtHQU9GOzs7O09BL2lCQXpqQjtPQU9BdXFCO09BTUFxQjtPQTJCQTlhO09BNFlBMFQ7T0E4QkF2Z0I7T0FvQkEwSjtPQWNBQztPQTJCQVo7T0F2RUFzWTtPQThEQWtqQztPQW5iQXRsRDtPQXNDQWlrRDtPQWFBMXNEO09BNUZBd0Y7T0ExREE4bEQ7T0FDQUM7T0FpakJBNEM7T0E1WEF2QjtPQWdCQWwrQztPQWVBeStDO09BRUFDO09BZ1ZBNy9CO09BR0F5Z0M7T0FHQW40Qzs7O09BbEhBakY7T0FFQXE5QztPQURBQzs7OztFNUNyZkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZOEN1Qks3b0QsR0FBR25OLEdBQUksT0FBSkEsRUFBSztHQW9FQzs7O0lBdW5CTDhkO0lBenFCRnE2QztZQWlMRkMsV0FBVy9yQyxPQUFNZ3NDO0lBQU5oc0Msd0JBQU1nc0M7OENBQU5oc0M7R0FFaUI7T0E0QjVCaXNDO1lBR0FDLGlCQUFpQmxzQyxPQUFNeHNCO0lBQUksa0JBQVZ3c0IsV0FBTXhzQjtHQUE2QztZQUNwRTI0RCxrQkFBa0Juc0MsT0FBUSxrQkFBUkEsY0FBK0I7WUFLakRvc0MsZUFBZXBzQyxPQUFNTCxNQUFLMHNDO0lBQVhyc0Msc0JBQU1MO0lBTnJCdXNDLGlCQU1lbHNDLE9BQVdxc0M7SUFBWHJzQzs7R0FHWTtZQUczQnNzQyxjQUFjdHNDLE9BQU14c0I7SUFDbkIsd0NBRG1CQTtJQUNuQixjQVBENDRELGVBTWNwc0MsNkJBQU14c0I7R0FDa0M7WUFHdEQrNEQsZUFBZXZzQyxjQUE4QndUO1FBQVBxRSxrQkFBUm5LLG1CQUFSb0s7SUFKdEJ3MEIsY0FJZXRzQyxPQUFPOFg7SUFmdEJxMEIsa0JBZWVuc0M7O0lBTUM7S0FGZGtzQixVQUphbHNCLFdBQThCd1QsYUFBZjlGO0tBTTVCOCtCLGNBQWMsMkJBTkR4c0MsVUFJYmtzQjtJQUphbHNCLFlBTWJ3c0M7SUFOYXhzQztRQWJRbHJCLElBYVJrckI7SUFiWSxXQWFaQSxXQWJRbHJCO0lBc0J6QixPQWJFdzNELGNBSWV0c0MsT0FBdUI2WDs7WUFjdEM0MEIsV0FBV3pzQyxPQUFNd1Q7SUFBUSxPQWR6Qis0QixlQWNXdnNDLFlBQU13VDtHQUE4QztZQUcvRGs1QixnQkFBZ0Ixc0M7UUFBc0I2WCxrQkEvQmZyRSxrQkErQkFzRTtJQXJCdkJ3MEIsY0FxQmdCdHNDLE9BQU84WDtJQUFQOVgsc0JBL0JPd1Q7SUFBSSxXQStCWHhULFdBL0JPd1Q7SUFrQ3pCLE9BeEJFODRCLGNBcUJnQnRzQyxPQUFzQjZYOztZQW9DdEM4MEIsZ0JBQWdCM3NDLE9BQU00c0M7STlDaFUzQjs7O1E4QzRWaUIsMENBNUJJNXNDO3NCQTZCTjtRQUVSO1NBRGM2c0M7U0FDTkM7b0JBQVFoNEQsR0FFWmk0RDtZOUNqV1gsSzhDaVdXQSxJQURNLFdBRE1qNEQ7Z0JBRVBRLElBQUx5M0Q7WUFBbUIsNkJBRlBqNEQsR0FFWm5COzBCQUZZbUIsR0FFWmk0RDs2QkFGSUQsUUFBUWg0RCxHQUVQUTs7UUFIS3UzRCxVQUNOQyxRQS9CTTlzQyx5QkE4QkE2c0M7OztRQVhoQiw0QkFuQmdCN3NDLFdBbUJoQjs7UUFNQSw0QkF6QmdCQSxXQXlCaEI7O1FBaUNZLDBDQTFESUE7c0JBMkROLE9BL0hWbXNDLGtCQW9FZ0Juc0M7WUE0RFBpb0I7UUFBYSxPQW5HdEJ3a0IsV0F1Q2dCenNDLE9BNERQaW9COzttQkE1RE9qb0I7O1FBZFosMENBY1lBO3NCQWJSO2tDQUNETCxtQkFBTTFlO1FBWUcrZSx3QkFaSC9lO1FBWUcrZSxzQkFaVEw7OztRQStHTSwwQ0FuR0dLO3NCQW9HTDtRQUVLLElBRFJndEMsdUJBQ0RDLFNBQVMsV0F0R0FqdEMsV0FxR1JndEM7UUFFTCxPQTVLSGQsaUJBcUVnQmxzQyxPQXNHVGl0Qzs7OztXQXBHQ3o1RCxjQUNSLE9BbEVBNDRELGVBK0RnQnBzQyxPQUFNNHNDLFFBRWRwNUQ7O09Ba0VSO1FBRGlCMDVEO1FBQU5DO1FBQ0NDLE1BREtGO1FBQ2JwMUIsU0FEYW8xQjtRQUVMLHNDQXJFSWx0QztxQkFzRU47OztRQUNTK3ZCO1FBQVZzZDtPQUNQLE9BRE9BOztVQWtCTSxPQTdIZlgsZ0JBb0NnQjFzQyxPQW1FTG10Qzs7VUFxQkksT0E3SWZaLGVBcURnQnZzQyxPQW1FQ2t0QyxRQUlFbmQ7O1VBZUgsT0EzSWhCd2MsZUFxRGdCdnNDLE9BbUVDa3RDLFFBSUVuZDs7aUJBdkVIL3ZCLFlBQU00c0MsK0JBb0VsQjkwQjtvQkF6SEp5MEIsZUFxRGdCdnNDLE9BbUVDa3RDLFFBSUVuZDtvQkEzR25CMmMsZ0JBb0NnQjFzQyxPQW1FTG10Qzs7aUJBbkVLbnRDO29CQXBDaEIwc0MsZ0JBb0NnQjFzQyxPQW1FTG10QztvQkFuRUtudEM7O3VCQUFNNHNDLCtCQW9FbEI5MEI7c0JBekhKeTBCLGVBcURnQnZzQyxPQW1FQ2t0QyxRQUlFbmQ7d0JBdkVIL3ZCOzt3QkF1RUcrdkI7O3dCQUhQcWQ7O3dCQXBFSXB0Qzt3QkFyRGhCdXNDLGVBcURnQnZzQyxPQW1FQ2t0QyxRQUlFbmQ7d0JBM0duQjJjLGdCQW9DZ0Ixc0MsT0FtRUxtdEM7a0JBb0JJLE9BM0hmVCxnQkFvQ2dCMXNDLE9BbUVMbXRDOzs7T0E1QkM7UUFGRUc7UUFBSHg0RDtRQUNQeTRELGtCQXRDWXZ0QztRQXVDSixzQ0F2Q0lBO3FCQXdDTjtPQUVSLElBRGN3dEMsd0JBQ2QsVUFEY0E7O1lBSVZDLDhCQUpVRDtRQUtLOztjQUNIbjhDLG1CQUFScThDO2FBVE5ILGtCQVNNRyxvQkFBUXI4QztxQkFBUnE4Qzs7O3FCQUZKRDthQUhBRTs7Ozs7a0JBSkZKO1dBYUU3L0IsU0FUQWlnQyxNQUpGSjtPQWNGLFlBREk3L0I7aUJBdkZOZy9CLGdCQW9DZ0Ixc0Msa0JBbURWME4sU0FkSzU0QjtpQkExRlh5M0Q7a0JBcURnQnZzQyxrQkEwQ1YydEMsTUFMUUwsbUJBckNFdHRDOzs7UUFLRGx3QjtRQUFMODlEO1FBQ05DLG9CQU5ZN3RDO3FCQU1aNnRDO1FBL0JBLHdDQXlCWTd0Qzs7aUNBdkJDd1Qsb0JBQVY0WTtZQXVCU3BzQixXQXZCQ3dULGNBQVY0WTtVQWhCUHFnQixXQXVDZ0J6c0MsT0F2QkN3VDs7O1NBN0NqQjI0QixrQkFvRWdCbnNDOztPQVdoQjtRQURJOHRDLFVBVlk5dEMsV0FLTjR0QztRQU1ORyxtQkFOV2orRCxTQUxDa3dCLFdBQU00c0MsU0FLUDk4RDtPQVdmLHVDQUxJaStELFlBREFELFVBVlk5dEM7O1dBcUJOZ3VDO09BQ1YsbUNBRFVBLE1BckJNaHVDOztPQThGRjtRQUREaXVDO1FBQ1JDLFdBQVMsV0E5RkVsdUMsV0E2RkhpdUM7T0FsS2IvQixpQkFxRWdCbHNDLE9BOEZYa3VDOzBDQURRRCxZQTdGR2p1Qzs7O1lBOEdabXVDLGFBQWFudUM7SUFDbkI7S0FBTSx3Q0FEYUE7aUJBRVQ7S0FHTDs7TUFGSUw7TUFBYTFlO01BQVArcUQ7TUFDVG9DLGdCQUphcHVDO01BS2QsWUFGSUw7TUFFSixnQkFMY0ssWUFJYm91QztnQkFDRDtLQUNELDRCQU5lcHVDO0tBT0QsSUFBVjRzQyxjQUpDanRDLGNBekxQc3NDO0tBd0VBVSxnQkE4R2lCM3NDLE9BT1g0c0MsUUFKT1o7S0FISWhzQyxZQUdHL2UsU0FISCtlOztHQVdkO1lBSUhxdUMsZ0JBQWdCcnVDLE9BQU15RDtJQW5PdEJzb0MsV0FtT2dCL3JDLE9BQU15RDtJQUFNLE9BZnhCMHFDLGFBZVludUM7R0FBb0Q7WUFJcEVzdUMsa0JBQWtCdHVDLE9BQU1MLE1BQUtuc0I7SUFDL0IsT0FMRTY2RCxnQkFJa0JydUMsV0FBTUwsVUFBS25zQixJQUFMbXNCO0dBQ2tEO1lBVzFFNHVDLHNCQUFzQkM7SUFDeEIsNEJBRHdCQTtJQUVQLElBQWJDLGlCQXRhQTNDO0lBdWFKLDJDQURJMkMsYUFGb0JEO0dBR3dCO1lBVzlDRSxTQUFTMXVDLE9BQU1sd0I7SUFDWCx3Q0FES2t3QjtnQkFFRDtJQUVSOztLQURtQnl1QztLQUFaRTtLQUNIaHZDLE9BRGU4dUM7T0FBWkUsYUFIRTN1QyxrQkFkVHV1QyxzQkFjU3Z1QztlQUdVeXVDOzs7OztvQkFISjMrRDs7O2VBR0kyK0Q7O2dCQUhWenVDLFlBSUxMO2NBY0UsNEJBbEJHSzs7O1FBa0JIOzs7OztXQWxCU2x3QjtlQUdJMitEOztnQkFIVnp1QyxZQUlMTDtjQVNFLDRCQWJHSzs7Y0FBTWx3QjtRQWFUOztJQVNGO0dBQUU7WUFLTjgrRCxVQUFVNXVDLE9BQU1ockIsR0FBRWczRDtJQTVSbEJELFdBNFJVL3JDLE9BQVFnc0M7T0FBRmgzRCxHQTNCaEIwNUQsU0EyQlUxdUM7SUFHRCxJQUFQNnVDLFdBSFE3dUMsV0FBUWdzQztJQUlwQixtQ0FESTZDLE1BSFE3dUM7R0FJdUI7WUFNakM4dUMsZ0JBQWdCOXVDLE9BQU1rc0IsUUFBTzZpQjtJQUFiL3VDOztLQUlMLElBRFBMLFNBSFlLLGVBSVo2dUMsV0FEQWx2QyxVQUhrQnVzQixRQUFPNmlCO0tBSzdCLE9BZkFILFVBVWdCNXVDLFVBSVo2dUM7O2VBSlk3dUM7O1FBM0RLeHNCLElBMkRMd3NCO0lBMURsQixPQUxFc3VDLGtCQStEZ0J0dUMsNkJBM0RLeHNCO0dBa0VvQjtZQU96Q3c3RCxhQUFhaHZDO0lBQ2YsZUFEZUE7OztNQXBUYityQyxXQW9UYS9yQyxXQW9NVHZPO01BdlBKaTlDLFNBbURhMXVDO01BbkRiMHVDLFNBbURhMXVDOzs7Ozs7OztHQVNaO1lBSURpdkMsYUFBYWp2QyxPQUFNZ3RDO0lBQ3JCLEdBRGVodEM7S0FHYiw0QkFIbUJndEMsVUFBTmh0QztLQUliLFdBSmFBLFdBQU1ndEM7O2VBQU5odEM7O0lBT0QsSUFBUmdzQyxZQVBlZ0I7SUFRRixPQXpVakJqQixXQWlVYS9yQyxXQXVMVHZPLE1BaExBdTZDO0dBQ29EO1lBSXhEa0QsY0FBY2x2QztJQUNoQixHQURnQkEsV0E3VWQrckMsV0E2VWMvckMsV0EyS1Z2TztlQTNLVXVPOztLQUlSLHdDQUpRQTs7VUFNUGd0QztNQUNMLGtCQVBZaHRDLFdBTVBndEM7Ozs7OztJQURHO0dBRXlCO1lBRW5DbUMsa0JBQWtCbnZDLE9BQU1ockIsR0FBTmdyQixZQUFNaHJCLFlBQTRCO1lBQ3BEbzZELGlCQUFpQnB2QyxPQUFNaHJCLEdBQU5nckIsWUFBTWhyQixZQUEyQjtZQUNsRHE2RCxrQkFBa0JydkMsY0FBVyxPQUFYQSxVQUE4QjtZQUNoRHN2QyxpQkFBaUJ0dkMsY0FBVyxPQUFYQSxVQUE2QjtZQUM5Q3V2QyxZQUFZdnZDLE9BQU1ockI7SUFKbEJtNkQsa0JBSVludkMsT0FBTWhyQjtJQUNwQixPQUpFbzZELGlCQUdZcHZDLE9BQU1ockI7R0FDK0I7WUFJakR3NkQsK0JBQWdDeHZDO0lBQVcsV0FBWEE7R0FLbkM7WUFHR3l2QywrQkFBZ0N6dkM7UUFJWjB2QyxnQkFEREMsZ0JBREFDLGdCQUREQztJQURjN3ZDLFlBQ2Q2dkM7SUFEYzd2QyxZQUViNHZDO0lBRmE1dkMsWUFHYjJ2QztJQUhhM3ZDLFlBSVowdkM7OztZQVNwQkksU0FBUzl2Qzs7OztJQWpJVHV1QyxzQkFpSVN2dUM7SUFHWCw0QkFIV0E7SUFJWCw0QkFKV0E7SUFLWCw0QkFMV0E7SUFNWCw0QkFOV0E7Ozs7SUFuRWUsT0FYeEI4dUMsZ0JBOEVTOXVDO0dBVVU7WUFPbkIrdkMsZUFBZS92QyxPQUFNaHJCO0lBQ3ZCLFdBRGlCZ3JCO3lCQUpJLE9BcERuQmt2QyxjQXdEZWx2QyxVQUowQjtJQUFoQztJQU9UO1lBSGVBLFdBakZmZ3ZDLGFBaUZlaHZDO2lCQXZXZmlzQztLQXNMSWtDLGFBaUxXbnVDO1FBQU1ockIsR0FuV3JCbTNELGtCQW1XZW5zQztLQU9QLE9BeEJSOHZDLFNBaUJlOXZDOztHQVFIO1lBU1pnd0MsaUJBQWlCaHdDLE9BQU1MLE1BQUtuc0I7SUFDOUIsV0FEbUJ3c0I7a0JBL0tqQnN1QyxrQkErS2lCdHVDLE9BQU1MLE1BQUtuc0I7R0FFSztZQUdqQ3k4RCxZQUFZandDLE9BQU1rd0MsT0FBTTE4RDtJQUMxQixPQU5FdzhELGlCQUtZaHdDLE9BQU1rd0MsT0FBTTE4RDtHQUNrQjtZQUcxQzI4RCxnQkFBZ0Jud0MsT0FBTXhzQjtJQUN4QixPQUxFeThELFlBSWdCandDLDZCQUFNeHNCO0dBQ2E7WUFFbkM0OEQsZUFBZXB3QyxPQUFNeHNCO0lBQ3ZCLE9BUkV5OEQ7YUFPZWp3QzswQ0FBTXhzQjthQUNZLDRCQURaQTtHQUMrQjtZQUdwRDY4RCxhQUFhcndDLE9BQU16cUI7SUFBSSxPQVB2QjQ2RCxnQkFPYW53QyxPQUFnQywyQkFBMUJ6cUI7R0FBMkM7WUFHOUQrNkQsZUFBZXR3QyxPQUFNM3NCO0lBQUksT0FWekI4OEQsZ0JBVWVud0MsT0FBZ0MsdUJBQTFCM3NCO0dBQTZDO1lBR2xFazlELGNBQWN2d0MsT0FBTWhyQjtJQUFJLE9BYnhCbTdELGdCQWFjbndDLE9BQWdDLHVCQUExQmhyQjtHQUE0QztZQUdoRXc3RCxjQUFjeHdDLE9BQU0zcEI7SUFDdEIsT0FyQkU0NUQsWUFvQmNqd0MsVUFDSSxnQ0FERTNwQjtHQUNlO1lBSW5DbzZELGFBQWF6d0MsY0FBVyxPQTlJeEI4dUMsZ0JBOElhOXVDLGFBQTBDO1lBQ3ZEMHdDLGFBQWExd0MsT0FBTWtzQjtJQUFTLE9BL0k1QjRpQixnQkErSWE5dUMsT0FBTWtzQjtHQUE2QztZQUVoRXlrQixjQUFjM3dDLE9BQU1rc0I7SUFBUyxPQWpKN0I0aUIsZ0JBaUpjOXVDLE9BQU1rc0I7R0FBOEM7WUFDbEUwa0IsZUFBZTV3QyxPQUFNa3NCO0lBQVMsT0FsSjlCNGlCLGdCQWtKZTl1QyxPQUFNa3NCO0dBQStDO1lBQ3BFMmtCLFlBQVk3d0MsT0FBTWtzQjtJQUFTLE9BbkozQjRpQixnQkFtSlk5dUMsT0FBTWtzQjtHQUE0QztZQVc5RDRrQixpQkFBaUI5d0M7SUEvRGpCK3ZDLGVBK0RpQi92QztJQUNuQixrQkFEbUJBO0dBQzZCO1lBQzlDK3dDLGVBQWUvd0M7SUFqRWYrdkMsZUFpRWUvdkM7SUFDakIsa0JBRGlCQTtHQUNnQztZQUkvQ2d4QyxpQkFBaUJoeEM7SUFDbkIsV0FEbUJBO2tCQXhPakJxdUMsZ0JBd09pQnJ1QyxXQTZDYnZPO0dBM0NzRTtZQUkxRXcvQyxvQkFBb0JqeEM7SUFDdEIsV0FEc0JBO2tCQTlPcEJxdUMsZ0JBOE9vQnJ1QyxXQXVDaEJ2TztHQXBDcUQ7WUFLekR5L0Msc0JBQXNCbHhDLE9BQU9tdEMsTUFBTUQ7SUFDckM7S0FBbUJyMUIsUUFEWXMxQjtLQUNuQjM1QixRQURtQjI1QjtLQUMzQnIxQixTQUQyQnExQjtZQUFQbnRDOztJQUlEO0tBRGpCTCxTQUhrQks7S0FJbEJnc0MsWUFKeUJtQixNQUFNRDtLQUsvQmpzRDs4QkFKRjYyQixVQUFRdEU7U0FJVixzQkFKaUJxRTs7S0FLYmczQixXQUhBbHZDLE1BQ0Fxc0MsT0FDQS9xRDtJQUVKLE9BcE1BMnRELFVBNkxzQjV1QyxVQU1sQjZ1QztHQUNxQjtZQU16QnNDLGVBQWVueEMsT0FBTXdULE9BQU05RjtJQUM3QixPQWRFd2pDO2FBYWVseEMsa0JBQU13VCwwQkFBTTlGO0dBRW1CO1lBUTlDMGpDLGVBQWVweEMsY0FBVyxPQVYxQm14QyxlQVVlbnhDLGFBQW1DO1lBQ2xEcXhDLGFBQWFyeEMsY0FBVyxPQVh4Qm14QyxlQVdhbnhDLGFBQW1DO1lBSWhEc3hDLGFBQWF0eEM7Ozs7SUFJRixJQUFQNnVDLFdBREFwOUM7SUFFSixPQXZSQTQ4QyxnQkFrUmFydUMsT0FJVDZ1QztHQUNzQjtZQUkxQjBDLGNBQWN2eEM7SUFDaEIsZUFEZ0JBOzs7O01BSUYsSUFBUDZ1QyxXQVZEcDlDO01BclJKNDhDLGdCQTJSY3J1QyxPQUlUNnVDO01BSlM3dUM7Ozs7Ozs7OztHQU9iO1lBSUR3eEMsZ0JBQWdCeHhDLE9BQU13VCxPQUFNOUY7SUFDOUIsV0FEa0IxTjs7SUFHTCxJQURQTCxTQUZZSyxlQUdaNnVDLFdBREFsdkMsVUFGa0I2VCxPQUFNOUYsU0FBTjhGO0lBSXRCLE9BalBBbzdCLFVBNk9nQjV1QyxVQUdaNnVDO0dBQ3FCO1lBR3pCNEMsYUFBYXp4QyxjQUFXLE9BUHhCd3hDLGdCQU9heHhDLGFBQW9DO1lBRWpEMHhDLFdBQVcxeEM7SUFDYixXQURhQTs7SUFFQSxJQUFQNnVDLFdBNUJBcDlDO0lBNkJKLE9BbFRBNDhDLGdCQStTV3J1QyxPQUVQNnVDO0dBQ3NCO1lBVTFCOEMsaUJBQWlCM3hDLE9BQU1sckI7SUFBSSxlQUFKQSwwQkFBTmtyQixZQUFNbHJCOztHQUF5QztZQUdoRTg4RCxpQkFBaUI1eEMsY0FBVyxPQUFYQSxVQUE2QjtZQUU5QzZ4QyxrQkFBa0I3eEMsY0FBVyxPQUFYQTtHQUFtRDtZQUdyRTh4QyxxQkFBcUI5eEMsT0FBTXhzQixHQUFOd3NCLFlBQU14c0IsWUFBMEI7WUFDckR1K0QscUJBQXFCL3hDLGNBQVcsT0FBWEEsVUFBNEI7WUFJakRneUMsU0FBU2w5RCxHQUNYLE9BRFdBLGdDQUNvQztZQWU3Q205RCxrQkFBa0JqeUMsT0FBTW5aO0lBQzFCLGVBRDBCQTs7UUFYSUMsTUFXVmtaLFdBQU1uWixxQkFYSUM7O0lBRXBCLElBQUpoUyxJQVBKazlELFNBSzRCbHJEO0lBV1ZrWixXQVRkbHJCO0lBU2NrckI7SUFObEIsT0FsTUE4dkMsU0F3TWtCOXZDO0dBRStCO1lBR2pEa3lDLGtCQUFrQmx5QyxjQUFXLE9BQVhBLFNBQThCO1lBRWhEbXlDLGNBQWNueUMsT0FBTWxyQjtJQUN0QixnQkFEc0JBOztJQUVaLElBQUorUixNQXpCSm1yRCxTQXVCb0JsOUQ7SUFBTmtyQixXQUVWblo7T0FGVW1aO1NBSVZveUMsaUJBSlVweUM7O0tBV0g7O21DQVhHQTtNQUlWb3lDLGlCQU9EO0lBR0gsT0FyQkFILGtCQU9janlDLE9BSVZveUM7R0FVa0M7WUFNdENDO1FBQW1CQyxtQkFBUUM7SUFDN0IsWUFENkJBLGFBQVJELFVBQVFDOztZQU8zQkMsZUFBZUM7SUFDakIsYUFSRUosa0JBT2VJO0dBR0M7WUFFaEJDLGNBQWMxeUMsY0FBVyxPQUFYQSxTQUEwQjtZQUV4QzJ5QyxxQkFBcUIzeUM7UUFBT3N5QyxtQkFBUUM7SUFsQ3BDSixjQWtDcUJueUMsT0FBT3N5QztJQXpDNUJMLGtCQXlDcUJqeUMsT0FBZXV5QztJQUV0Qzs7WUFHRUssZ0JBQWdCNXlDLE9BQU91eUMsWUFBWUQ7SUFDckM7S0FBSUcsZUFEcUJGLFlBQVlEO0tBRS9CLFFBckJKRCxrQkFvQkVJO3VCQUtGLE9BWEFFLHFCQUtnQjN5QyxPQUNkeXlDO0lBR3NCO0tBRGxCcnhEO0tBQ2tCLDBEQURsQkE7SUFDTjtHQUVtQztZQUVuQ3l4RCxxQkFBcUI3eUMsT0FBT3V5QyxZQUFZRDtJQUMzQixJQUFYRyxlQUQwQkYsWUFBWUQ7aUJBM0J4Q0Qsa0JBNEJFSTtjQWRGRSxxQkFhcUIzeUMsT0FDbkJ5eUM7O0dBS2lDO1lBRW5DSyxnQkFBZ0I5eUMsY0FDbEIsV0FEa0JBLG9CQUMwRDtZQUUxRSt5QyxtQkFBbUIveUMsT0FBTW9LO0lBQ1osSUFBWHFvQyxXQUpGSyxnQkFHbUI5eUM7SUFFTSxPQTFCekIyeUMscUJBd0JtQjN5QyxPQUVNLFdBRkFvSyxRQUN2QnFvQztHQUN3QztZQUcxQ08sK0JBQStCaHpDO1FBS2hCbmEsY0FEQXRRLGNBREN5cEIsY0FERnRFLGNBRENybkI7SUFEZ0Iyc0IsWUFDaEIzc0I7SUFEZ0Iyc0IsWUFFakJ0RjtJQUZpQnNGLFlBR2ZoQjtJQUhlZ0IsWUFJaEJ6cUI7SUFKZ0J5cUIsWUFLaEJuYTs7O1lBUWZvdEQsK0JBQStCanpDO0lBQVcsV0FBWEE7R0FNbEM7WUFJR2t6QywrQkFBa0NsekMsT0FBTTNzQixHQUFFcW5CLEdBQVJzRixZQUFNM3NCLEdBQU4yc0IsWUFBUXRGO0dBQ0s7WUFFL0N5NEMsK0JBQWtDbnpDLGNBQ3BDLFdBRG9DQTtHQUNLO1lBSXZDb3pDLGdCQUFnQnB6QztJQUFXLGtCQUFYQTtHQUF3QztHQUczQyxJQUFicXpDLGFBQWE7WUFDVEMsZUFBZXR6QyxPQUFNbHJCO0lBQzNCLElBRDJCK1I7SUFDM0I7b0JBRDJCQTs7bUJBRVgsa0JBRkttWixXQURuQnF6QyxlQUN5QnhzRDtLQUl6QixXQUptQm1aLFdBRG5CcXpDO0tBS0EsSUFKeUJ2c0Q7O0dBTXhCO1lBUUR5c0QsNkJBQTZCdnpDLE9BQU1ycEI7SUFBTnFwQixZQUNSLHVCQURjcnBCO0lBQU5xcEIsNEJBRUUsT0FBakMsdUJBRnFDcnBCLElBRUk7SUFGVnFwQiwyQjlDNzRCbEMsTzhDMjNCS296QyxnQkFrQjZCcHpDOytCOUM3NEJsQyxPOEMrM0JTc3pDLGVBY3lCdHpDOytCOUM3NEJsQyxPOEMrM0JTc3pDLGVBY3lCdHpDOztHQUtZO1lBUXpDd3pDO0lBQTJCLDRCQUV0QjtJQURpQixJQUFYaGdFLGNBQVcsOEJBQVhBO0lBQVc7R0FDZjtZQUNQaWdFO0lBQTRCLDRCQUV2QjtJQURrQixJQUFaamdFLGNBQVksOEJBQVpBO0lBQVk7R0FDaEI7WUFFUGtnRSxnQzlDajZCTDtZOENrNkJLQyxpQzlDbDZCTDtZOENzNkJLQyxrQkFBa0J2Z0UsR0FBRXFuQixHQUFFc0UsR0FBRXpwQixHQUFFc1E7SUFFYjtLQUFYZ3VELFdBQVc7S0FDWEMsY0FoNEJBaEk7SUFrNEJKLDRCQUZJZ0ksU0FEQUQ7SUFJYSxJQUFiRSxhQUFhO0lBL2RmeEYsc0JBK2RFd0Y7SUFFSixtQ0FMSUQsVUFHQUM7SUFVYzs7O0tBREQ7S0FEQztJQUhsQjtZQUxJQTtZQU9nQjs7Ozs7Ozs7Ozs7Ozs7O1lBYkExZ0U7WUFBRXFuQjtZQUFFc0U7WUFBRXpwQjtZQUFFc1E7OztZQVoxQjJ0RDtZQUdBQztZQUlBQztZQUNBQztZQU1FRTs7WUEwQ0ZHLDJCQUEyQkM7SUFDN0IsT0E3Q0VMO2FBNEMyQks7R0FNUjtZQUtuQkMsZUFBZXI5RCxRQUFPczlEO3dCOUM3OUIzQjs7SThDODlCYTtLQUFOQztPQXhERlIsa0JBdURlLzhELFFBQU9zOUQsc0I5Qzc5QjNCO0k4Qzg5Qk9DLHlCOUM5OUJQLE84QzIzQktoQixnQkFtR0VnQjs2QjlDOTlCUCxPOEMrM0JTZCxlQStGRmM7NkI5Qzk5QlAsTzhDKzNCU2QsZUErRkZjO0lBSUosT0FKSUE7R0FJRDtZQUlEQyx5QkFBeUIxOUQ7eUJBQ3FCLE9BQWhELHVCQUQyQkEsSUFDNkI7SUFBbkIsT0FWbkN1OUQsZUFVYSx1QkFEWXY5RDtHQUM4QjtZQUl2RDI5RCxvQkFBb0J0L0Q7SUFDdEIsb0I5QzUrQkg7SThDNCtCMkMsT0FmdENrL0QsZUFlYSw4QkFET2wvRDtHQUN3QjtPQU01Q3UvRDtZQUNBQztJQUFvQixvQ0FEcEJEO0dBQ2dEO0dBR3ZDO0lBQVRFLFNBSEFEO0lBT0FFLGdCQXBCQUw7SUFxQkFNLGdCQXJCQU47SUFzQkFPLGdCQWpCQU4sb0JBV0FHO0lBV0FJLGFBQWEsb0NBZGJMO0dBZUksaUNBREpLLFlBWEFKOztJQWVGLE9BMUJFSCxvQkEwQmtCLGlDQUpsQk87R0FJc0M7R0FEbEIsSUFBcEJDLG9CQUFvQjtHQUVoQixpQ0FGSkEsbUJBUkFGO0dBVUksU0FFSkcsb0JBQW9CL2UsS0FBSWprRCxLQUFJK0UsS0FBSUM7SUFDYiw0Q0FEQ2kvQztJQUN0QiwyQ0FEMEJqa0QsS0FBSStFLEtBQUlDO0dBQ21CO1lBRW5EaStELG1CQUFtQnIrRCxJQUFHcS9DO0lBQ3hCO0tBQUkzOUMsTUFBTSxpQ0FEYzI5QztLQUVwQmovQyxNQUFNLDZCQUROc0I7S0FFQXRHLE1BQU0sNkJBRk5zRztJQUdKLHVCQUpxQjFCLElBR2pCNUUsUUFEQWdGO0lBR0osdUJBTHFCSjtJQUtyQixvQ0FKSTBCO0dBS1k7dUJBRThCLG9DQWpDNUNrOEQsZ0JBaUN3RTtHQUExRCxJQUFkVSxjQUFjO3VCQUM4QixPQUQ5Qiw2QkFqQ2RWLGdCQWtDd0U7R0FBMUQsSUFBZFcsY0FBYzs7d0I5Q3BoQ25COzs7O0k4Q3loQ08sb0I5Q3poQ1AsTzhDMmdDS0YseUJBUUFDO0lBS0E7S0FERWI7T0FqSEZSOztVOUN0NkJMLE84Q3dnQ0ttQixvQkFXQUU7Ozs7OztJQUlFYix5QjlDdmhDUCxPOEMyM0JLaEIsZ0JBNEpFZ0I7NkI5Q3ZoQ1AsTzhDKzNCU2QsZUF3SkZjOzZCOUN2aENQLE84QyszQlNkLGVBd0pGYztJQU9XLG9COUM5aENsQixPOENncUJLckQsZUF1WEVxRDtJQU9KO1dBUElBO0dBUUQ7R0FUbUIsSUFBcEJlLG9CQUFvQjtHQVVoQixpQ0FWSkEsbUJBNUJBVDs7d0I5QzEvQkw7Ozs7SThDcWlDTyxvQjlDcmlDUCxPOEMyZ0NLTSx5QkFTQUU7SUFnQkE7S0FERWQ7T0E3SEZSOztVOUN0NkJMLE84Q3dnQ0ttQixvQkFZQUc7Ozs7OztJQWVFZCx5QjlDbmlDUCxPOEMyM0JLaEIsZ0JBd0tFZ0I7NkI5Q25pQ1AsTzhDKzNCU2QsZUFvS0ZjOzZCOUNuaUNQLE84QyszQlNkLGVBb0tGYztJQU9XLG9COUMxaUNsQixPOENncUJLckQsZUFtWUVxRDtJQU9KO1dBUElBO0dBUUQ7R0FUbUIsSUFBcEJnQixvQkFBb0I7R0FVaEIsaUNBVkpBLG1CQXZDQVQ7WUFtREFVO0lBQXVCLE9BRm5CLGlDQXRCSkY7R0F3QmdEO1lBQ2hERztJQUF1Qix3Q0FidkJGO0dBYWdEO1lBQ2hERztJQUF1Qix3Q0E1Q3ZCVDtHQTRDZ0Q7WUFDaERVO0lBQWdCLHdDQWhEaEJYO0dBZ0RrQztZQU1sQ1ksdUJBQXVCcDlELEtBQUkrN0Q7SUF4ZDNCckUsZUF3ZDJCcUU7SUFFckIsSUFBSjVnRSxJQUFJLDZCQUZpQjZFO0lBR3pCLDZCQUh5QkE7SUFHekIsT0FESTdFO0dBRUg7WUFHQ2tpRTtJQUNGO0tBQUlqQixTQUFTLGlDQTlEWEk7S0ErREVELGdCQUFnQixpQ0E1RGxCRTtJQTZERixPQVZFVyx1QkFRRWhCLFFBQ0FHO0dBQ3VDO1lBRXpDZSw0QkFBNEI5K0QsUUFBT3M5RDs7S0FFbkM7TUFBSTk3RCxNQUFNLDZCQW5GVms4RDtNQW9GSXFCLFdBQVUsOEJBRFZ2OUQ7Y0FFQXc5RDtNQUM2Qix3Q0FIN0J4OUQ7TUFHRixXQUwwQnhCLFFBS25CLDZCQUhMd0I7TUFJRiw2QkFKRUE7TUFJRixrQkFOaUM4N0Q7S0FPekI7S0FFVixPQS9HQUQsZUF5R0kwQixVQUNBQztJQUt5QjtJQVJuQjtHQVFvQjtZQUU5QkMsK0JBQXNDbi9EO3lCQUNxQixPQUE3RCx1QkFEd0NBLElBQzZCO0lBQW5CLE9BWmhEZy9ELDRCQVkwQix1QkFEWWgvRDtHQUM4QjtZQTBCcEVvL0QsbUNBQ0YsY0FBaUM7WUFFL0JDLDZCQUE2QkMsMEJBQ0c7WUFFaENDLDJCQUEyQkQ7SUFDN0Isa0NBRDZCQTtHQUNRO1lBRW5DRSw2QkFBNkJGO0lBQ25CLElBQVJHLFFBSkZGLDJCQUc2QkQ7SUFON0JELDZCQU02QkM7SUFFL0IsT0FESUc7R0FFQztZQUVIQyx5QkFBeUJKLEtBQUlLLE1BQUpMLGFBQUlLLE1BQUpMO0dBQ3lDO1lBRWxFTSwrQkFTa0JOO0lBR1osU0FBSjVpRSxFQVBvQkcsR0FBRStCLEdBQUVUO0tBQ0csT0FUN0J1aEU7Y0FZa0JKLFNBSDBCLDhCQUR0QnppRSxHQUFFK0IsR0FBRVQ7O0lBUXBCLFNBQUo0bEIsUUFYRixPQUxBMjdDLHlCQVlrQko7SUFLWixTQUFKajNDLFFBVkYsT0FQQXEzQyx5QkFZa0JKO0lBTVosU0FBSjFnRSxFQVJvQlQsR0FDTyxPQVg3QnVoRSx5QkFZa0JKLFNBRkluaEU7SUFTaEIsU0FBSitRLEVBUG9CL1EsR0FDTyxPQWI3QnVoRSx5QkFZa0JKLFNBQUluaEU7SUFReEIsT0FyT0U4K0Qsa0JBZ09FdmdFLEdBQ0FxbkIsR0FDQXNFLEdBQ0F6cEIsR0FDQXNRO0dBQ3VCO1lBU3pCMndELFVBQVVyL0Q7SUFBSSxPQXRnQmRzNUQ7YUFzZ0IyQixpQ0E5SDNCMEUsb0JBOEhVaCtEO0dBQThDO1lBQ3hEcy9ELFVBQVV0L0Q7SUFBSSxPQXRnQmR1NUQ7YUFzZ0IyQixpQ0EvSDNCeUUsb0JBK0hVaCtEO0dBQThDO1lBQ3hEdS9ELFdBQVd2L0Q7SUFBSSxPQXJnQmZ3NUQ7YUFxZ0I2QixpQ0FoSTdCd0Usb0JBZ0lXaCtEO0dBQStDO1lBQzFEdy9ELFlBQVl4L0Q7SUFBSSxPQXJnQmhCeTVEO2FBcWdCK0IsaUNBakkvQnVFLG9CQWlJWWgrRDtHQUFnRDtZQUM1RHkvRCxTQUFTei9EO0lBQUksT0FyZ0JiMDVELFlBcWdCeUIsaUNBbEl6QnNFLG9CQWtJU2grRDtHQUE2QztZQUN0RDAvRCxVQUFVMS9EO0lBQUksT0Ezb0JkNjNEO2FBMm9CMkIsaUNBbkkzQm1HLG9CQW1JVWgrRDtHQUE4QztZQUN4RDIvRCxVQUFVMy9EO0lBQUksT0EvbkJkODNEO2FBK25CMkIsaUNBcEkzQmtHLG9CQW9JVWgrRDtHQUE4QztZQUN4RDQvRCxXQUFXNS9EO0lBQUksT0FwbkJmKzNEO2FBb25CNkIsaUNBckk3QmlHLG9CQXFJV2grRDtHQUErQztZQUMxRDYvRCxTQUFTNy9ELEdBQUV5b0M7SUFBSSxPQXZpQmZxd0I7YUF1aUIyQixpQ0F0STNCa0Ysb0JBc0lTaCtELEdBQUV5b0M7R0FBK0M7WUFDMUQvbUMsYUFBYTFCO0lBQUksT0FwaUJqQmc1RDthQW9pQmlDLGlDQXZJakNnRixvQkF1SWFoK0Q7R0FBaUQ7WUFDOUQyQixZQUFZM0I7SUFBSSxPQWxpQmhCaTVEO2FBa2lCK0IsaUNBeEkvQitFLG9CQXdJWWgrRDtHQUFnRDtZQUM1RDRCLFVBQVU1QjtJQUFJLE9BL2hCZGs1RDthQStoQjJCLGlDQXpJM0I4RSxvQkF5SVVoK0Q7R0FBOEM7WUFDeEQ2QixZQUFZN0I7SUFBSSxPQTdoQmhCbTVEO2FBNmhCK0IsaUNBMUkvQjZFLG9CQTBJWWgrRDtHQUFnRDtZQUM1RHlCLFdBQVd6QjtJQUFJLE9BeGhCZnE1RDthQXdoQjZCLGlDQTNJN0IyRSxvQkEySVdoK0Q7R0FBK0M7WUFDMUQ4L0QsV0FBVzkvRDtJQUFJLE9BNWhCZm81RDthQTRoQjZCLGlDQTVJN0I0RSxvQkE0SVdoK0Q7R0FBK0M7WUFDMUQrL0QsWUFBWS8vRCxHQUFFeW9DO0lBQUksT0FuZWxCdXhCO2FBbWVpQyxpQ0E3SWpDZ0Usb0JBNklZaCtELEdBQUV5b0M7R0FBa0Q7WUFDaEV1M0IsVUFBVWhnRTtJQUFJLE9BemRkazZEO2FBeWQyQixpQ0E5STNCOEQsb0JBOElVaCtEO0dBQThDO1lBQ3hEaWdFLFlBQVlqZ0U7SUFBSSxPQTNkaEJpNkQ7YUEyZCtCLGlDQS9JL0IrRCxvQkErSVloK0Q7R0FBZ0Q7WUFDNURrZ0UsY0FBY2xnRTtJQUFJLE9BamdCbEI2NUQ7YUFpZ0JtQyxpQ0FoSm5DbUUsb0JBZ0pjaCtEO0dBQWtEO1lBQ2hFbWdFLFlBQVluZ0U7SUFBSSxPQXZnQmhCNDVEO2FBdWdCK0IsaUNBakovQm9FLG9CQWlKWWgrRDtHQUFnRDtZQUM1RCtCLGNBQWMvQjtJQUFJLE9BMWdCbEIyNUQ7YUEwZ0JtQyxpQ0FsSm5DcUUsb0JBa0pjaCtEO0dBQWtEO1lBQ2hFb2dFLGlCQUFpQnBnRTtJQUFJLE9BOWZyQjg1RDthQThmeUMsaUNBbkp6Q2tFLG9CQW1KaUJoK0Q7R0FBcUQ7WUFFdEVxZ0UsVUFBVXJnRTtJQUFJLE9BNWRkbTZEO2FBNGQyQixpQ0FySjNCNkQsb0JBcUpVaCtEO0dBQThDO1lBQ3hEc2dFLFdBQVd0Z0U7SUFBSSxPQXBkZm82RDthQW9kNkIsaUNBdEo3QjRELG9CQXNKV2grRDtHQUErQztZQUMxRHVnRSxhQUFhdmdFLEdBQUV5b0M7SUFBSSxPQTFjbkI0eEI7YUEwY21DLGlDQXZKbkMyRCxvQkF1SmFoK0QsR0FBRXlvQztHQUFtRDtZQUVsRSszQixRQUFReGdFO0lBQUksT0FuY1p1NkQsV0FtY3VCLGlDQXpKdkJ5RCxvQkF5SlFoK0Q7R0FBNEM7WUFDcER5Z0UsVUFBVXpnRTtJQUFJLE9BdGNkczZEO2FBc2MyQixpQ0ExSjNCMEQsb0JBMEpVaCtEO0dBQThDO1lBRXhEMGdFLFdBQVcxZ0U7SUFBSSxPQXJaZmc3RDthQXFaNkIsaUNBNUo3QmdELG9CQTRKV2grRDtHQUErQztZQUMxRDJnRSxXQUFXM2dFO0lBQUksT0FBYyxpQ0E3SjdCZytEO0dBNkowRDtZQUUxRDRDLGVBQWU1Z0U7SUFBSSxPQS9abkI4NkQ7YUErWnFDLGlDQS9KckNrRCxvQkErSmVoK0Q7R0FBbUQ7WUFDbEU2Z0UsZUFBZTdnRTtJQUFJLE9BQWtCLGlDQWhLckNnK0Q7R0FnS2tFO1lBRWxFOEMsYUFBYzFGLFlBQVlEO0lBQzVCLE9BclhFTTthQXFYYyxpQ0FuS2R1QzthQWtLYzVDO2FBQVlEO0dBQ21DO1lBQzdENEYsa0JBQW1CM0YsWUFBWUQ7SUFDakMsT0EvV0VPO2FBK1dtQixpQ0FyS25Cc0M7YUFvS21CNUM7YUFBWUQ7R0FDbUM7WUFDbEU2RixhQUFhaGhFO0lBQUksT0F4V2pCMjdEO2FBd1dpQyxpQ0F0S2pDcUMsb0JBc0thaCtEO0dBQWlEO1lBQzlEaWhFLGdCQUFnQmpoRTtJQUFJLE9BdFdwQjQ3RDthQXNXdUMsaUNBdkt2Q29DLG9CQXVLZ0JoK0Q7R0FBb0Q7WUFFcEVraEUsY0FBY2xoRTtJQUFJLE9BdGNsQnc2RDthQXNjbUMsaUNBektuQ3dELG9CQXlLY2grRDtHQUFrRDtZQUNoRW1oRSxjQUFjbmhFO0lBQUksT0FBaUIsaUNBMUtuQ2crRDtHQTBLZ0U7WUFDaEVvRCxlQUFlcGhFO0lBQUksT0FuY25CMDZEO2FBbWNxQyxpQ0EzS3JDc0Qsb0JBMktlaCtEO0dBQW1EO1lBRWxFcWhFLGtCQUFrQnJoRTtJQUFJLE9BbGN0QjI2RDthQWtjMkMsaUNBN0szQ3FELG9CQTZLa0JoK0Q7R0FBc0Q7WUFDeEVzaEUsa0JBQWtCdGhFO0lBQUksT0FBcUIsaUNBOUszQ2crRDtHQThLd0U7WUFFeEV1RCwwQkFBMEJ2aEU7SUFDNUIsT0ExVEVvOEQ7YUEwVDJCLGlDQWpMM0I0QixvQkFnTDBCaCtEO0dBQzhCO1lBRXhEd2hFLDRCQUE0QnhoRTtJQUM5QixPQTlXRTY3RDthQThXNkIsaUNBcEw3Qm1DLG9CQW1MNEJoK0Q7R0FDOEI7WUFDMUR5aEUsNEJBQTRCemhFO0lBQzlCLE9BbldFODdEO2FBbVc2QixpQ0F0TDdCa0Msb0JBcUw0QmgrRDtHQUM4QjtZQUUxRDBoRSwrQkFBK0IxaEUsR0FBRXlvQztJQUNuQyxPQTVWRXN6QjthQTRWZ0MsaUNBekxoQ2lDLG9CQXdMK0JoK0QsR0FBRXlvQztHQUM4QjtZQUMvRGs1QiwrQkFBK0IzaEU7SUFDakMsT0EzVkVnOEQ7YUEyVmdDLGlDQTNMaENnQyxvQkEwTCtCaCtEO0dBQzhCO1lBRTdENGhFLDZCQUE2QjVoRTtJQUMvQixPQW5wQkVzNEQ7YUFtcEI4QixpQ0E5TDlCMEYsb0JBNkw2QmgrRDtHQUM4QjtZQUMzRDZoRSw2QkFBNkI3aEU7SUFDL0IsT0E3cEJFcTREO2FBNnBCOEIsaUNBaE05QjJGLG9CQStMNkJoK0Q7R0FDOEI7WUFDM0Q4aEUsZUFBZTloRTtJQUNqQixPQXhxQkVnNEQ7YUF3cUJnQixpQ0FsTWhCZ0csb0JBaU1laCtEO0dBQzhCO1lBQzdDK2hFLGVBQWUvaEU7SUFDakIsT0FBa0IsaUNBcE1oQmcrRDtHQW9NNkM7WUFDN0NnRSxjQUFjaGlFO0lBQ2hCLE9BM3FCRWk0RDthQTJxQmUsaUNBdE1mK0Ysb0JBcU1jaCtEO0dBQzhCO1lBQzVDaWlFLGNBQWNqaUU7SUFDaEIsT0FBaUIsaUNBeE1mZytEO0dBd000QztZQUM1Q2tFLFNBQVNsaUU7SUFDWCxPQTVxQkVvNEQsWUE0cUJVLGlDQTFNVjRGLG9CQXlNU2grRDtHQUM4QjtZQU1uQ21pRSxjQUFnQm41QyxLQUF1Qm81QyxNQUFLbkY7UUFBNUJvRjs7S0FBa0MsR0FBbENBO1VBQVNuNUMsTUFBVG01QyxtQkFBU241Qzs7VUFBVG81QyxTQTNoQnBCcEk7S0EyaEJzRCxjQUNoRDtTQUNMbDZEO3NCQUFNLGtCQUZvQ29pRSxNQUFLbkYsS0FFL0NqOUQ7O0tBRUQsV0FKMkNvaUUsTUFBS25GLEtBRS9DajlEO0tBR0QsV0FMb0JzaUUsUUFBNEJyRjtLQU1qQyxJQU5Lc0Y7OztZQWlCcEJDLGFBQWV4NUMsS0FBdUJvNUMsTUFBS25GLEtBQUl3RjtJQUNqRCxHQURpQno1QyxTQUFTRSxNQUFURixpQkFBU0UsY0FBVG81QyxTQTVpQmZwSTtJQTZpQkkseUJBRDJDdUk7a0JBRXBDO1FBVjBCQyxvQkFXM0JyK0Q7SUFDVixXQUpzQys5RCxNQUFLbkYsS0FHakM1NEQ7UUFYMkJnSTtJQUN2QztLQUFNLHVCQURpQ0E7aUJBRTFCO1NBRjBCRSxrQkFHM0J2TTtLQUNWLFdBSWVzaUUsUUFBNEJyRjtLQUgzQyxXQUdzQ21GLE1BQUtuRixLQUxqQ2o5RDtTQUgyQnFNOztHQWFEO1lBR3BDczJELGNBQWMxRixLQUFJNWdFO0lBQ3BCLElBQUl1RCw0QkFEZ0J2RCxJQUVoQnNILGVBQ0FDO2FBQ0FvNUQ7S0Exb0JGaEU7T0Fzb0JjaUUsS0FLTSw4QkFMRjVnRSxHQUVoQnNILFNBQ0FDLFdBREFEO0tBQ0FDO0tBREFELFVBQ0FDOztJQUd5Qjs7UUFIekJBLGFBRkFoRTtpQkFDQStELFlBREEvRDtvQkFHQW85RDs7S0FLSSxvQ0FUWTNnRSxHQUdoQnVIOztNQUNBbzVEO01BOWxCRm5ELGlCQTBsQmNvRDs7MkJBSVpELFVBempCRi9DLGVBcWpCY2dELGVBR1pyNUQ7O0dBZ0J5QjtZQUUzQmcvRCxnQkFBa0I1NUMsS0FBdUJvNUMsTUFBS25GO0lBQU0sR0FBbENqMEM7U0FBT0UsTUFBUEYsZUFBT0U7O1NBQVAvVyw2QkFBbUIsU0FBRTtJQUFhLFlBQzlDLGtCQURZQSxNQUE0QjhxRDtRQUUzQ2o5RDtJQUFLLGtCQUZpQ29pRSxNQUFLbkYsS0FFM0NqOUQ7O1lBRUg2aUUsZ0JBQWlCNXZELElBQUlDLE9BQU0rcEQ7STlDeHhDaEMsdUI4Q3l4Q01qOUQsY0FBSyxrQkFEV2lULElBQVVncUQsS0FDMUJqOUQ7UUFDR2tFO0lBQUssa0JBRllnUCxPQUFNK3BELEtBRXZCLzREOztZQUVKNCtELGdCQUFpQm4vRCxNQUFNQyxPQUFNcTVEO0k5QzV4Q2xDLHVCOEM2eENlOStELGNBQUssa0JBREV3RixNQUFZczVELEtBQ25COStEO1FBQ0N3QztJQUFLLGtCQUZPaUQsT0FBTXE1RCxLQUVsQnQ4RDs7WUFJWG9pRSxZQUFZcmpFLFFBQU9zakU7SUFDckI7S0FBSTloRSxNQUFNO0tBQ04rN0QsTUF6VEZFLG9CQXdURWo4RDtJQUVKLFdBSGN4QixRQUVWdTlELEtBRmlCK0Y7SUFsb0JuQnBKLGVBb29CRXFEO0lBR00sSUFBTnI5RCxNQUFNLDZCQUpOc0I7SUFLSixZQURJdEI7Y0FFQyw2QkFORHNCLFFBSUF0QjtjQUNZLDZCQUxac0I7R0FNMkI7WUFhN0IraEUsc0JBQXNCaEcsS0FBSTVoRTtJQUFhLFVBQWJBOzs7UUFDRyxPQXp5QjdCdzhELGFBd3lCc0JvRjs7UUFFTyxPQWp4QjdCbEYsY0Erd0JzQmtGOztRQUlPLE9BMXBCN0JyRCxlQXNwQnNCcUQ7O1FBS08sT0F0cEI3QnBELGlCQWlwQnNCb0Q7O1FBTU8sT0E5cEI3QnRELGlCQXdwQnNCc0Q7O1FBUU8sT0FyckI3QjVELGNBNnFCc0I0RDtnQkFTTyxPQXRyQjdCNUQsY0E2cUJzQjREOztXQUFJNWhFOztXQUdUazdCLFNBSFNsN0IsZUFHaEJnaEMsUUFIZ0JoaEM7T0FHRyxPQXpuQjdCMitELGVBc25Cc0JpRCxLQUdaNWdDLE9BQU85Rjs7T0FJWTs7V0FHbEJyM0IsSUFWZTdEO09BN3FCMUJnK0QsY0E2cUJzQjREO09BVU8sT0F2ckI3QjVELGNBNnFCc0I0RCxLQVVYLzlEOztHQUE0RDtZQU1uRTYwQyxXQUFXa3BCLEtBQUlyd0Q7SUFBTTtjQUFOQSxrQkEwQlM7V0ExQlRBOztXQVNJMVEsSUFUSjBRLFFBU0NnQixJQVREaEI7T0FBZm1uQyxXQUFXa3BCLEtBU0tydkQ7T0FDcEIsT0ExQkFxMUQsc0JBZ0JlaEcsS0FTUS9nRTs7bUJBVEowUSxRQWVDc2xDLE1BZkR0bEM7O1lBWWlCQztRQVpoQ2tuQyxXQUFXa3BCLEtBZUsvcUI7UUFESCxPQXp6QmpCNGxCO2lCQTJ5QmVtRixxQkFwQ2Y4RixZQW9DSWh2QixZQVlnQ2xuQzs7V0FHQUM7T0FmaENpbkMsV0FBV2twQixLQWVLL3FCO09BRW1CO2NBckR2QzZ3QixZQW9DSWh2QixZQWVnQ2puQztRQUVoQjtRQUFQbzJEO1FBQVJudUI7T0FDTCxPQXgxQkE0aUIsZ0JBczBCZXNGLEtBaUJWbG9CLFFBQVFtdUI7O2tCQWpCTXQyRDs7Ozs7Ozs7YUFDK0N5QyxNQUQvQ3pDLFFBQ3VDNGIsZ0JBQWxCMnJCOzs7d0JBa0JqQjkzQyxJQW5CSnVRLFFBbUJDdWxDOzs7a0JBbkJEdmxDOzs7Ozs7O2lCQUs2QzJNLE1BTDdDM00sUUFLcUM2b0Qsa0JBQWxCeGhCOzs7d0JBZ0JqQi8wQyxJQXJCRjBOLFFBcUJEb25DOzs7a0JBckJDcG5DOzs7Ozs7OzthQUMrQ3lDLE1BRC9DekMsUUFDdUM0YixnQkFBbEIyckI7Ozt3QkFrQmpCOTNDLElBbkJKdVEsUUFtQkN1bEM7OztrQkFuQkR2bEM7Ozs7Ozs7aUJBSzZDMk0sTUFMN0MzTSxRQUtxQzZvRCxrQkFBbEJ4aEI7Ozt3QkFnQmpCLzBDLElBckJGME4sUUFxQkRvbkM7OztXQUVKbU0sTUF2Qkt2ekMsUUF1QlJzbkMsTUF2QlF0bkM7T0FBZm1uQyxXQUFXa3BCLEtBdUJKL29CO09BQWlCLGtCQUFkaU0sS0F2QkM4Yzs7V0F3QkxrRyxNQXhCU3YyRCxRQUFmbW5DLFdBQVdrcEIsS0F3QkxrRyxNQUFrQixPQTlyQjVCdkosZUFzcUJlcUQ7O1dBeUJLaHpELE1BekJEMkMsUUF5QkZ3MkQsTUF6QkV4MkQ7T0FBZm1uQyxXQUFXa3BCLEtBeUJFbUc7T0FBVyw2QkFBUm41RDs7OztPQXpCaEI4cEMsV0FBV2twQixLQUN5QjlvQixNQUV4QyxPQXp0QkEwa0IsaUJBc3RCZW9FLEtBQzJDejBDLE1BQVFuWjs7T0FEOUQwa0MsV0FBV2twQixLQUt1QmhwQjtPQUdFLE9BOXRCeEM0a0I7Z0JBc3RCZW9FLEtBS3lDeEgsUUFHaEIsZ0NBSHdCbDhDOztPQUw1RHc2QixXQUFXa3BCLEtBbUJLOXFCLE1BQ1EsT0FqdUI1QjZtQixnQkE2c0JlaUUsS0FtQlE1Z0U7ZUFuQm5CMDNDLFdBQVdrcEIsS0FxQkdqcEIsTUFDVSxPQW50QjVCcWxCLGNBNnJCZTRELEtBcUJNLzlEOztHQUtTO1lBTTFCbTFDLFdBQVc0b0IsS0FBSXJ3RDtJQUFNO2NBQU5BLGtCQTZCUztXQTdCVEE7O1dBWUkxUSxJQVpKMFEsUUFZQ2dCLElBWkRoQjtPQUFmeW5DLFdBQVc0b0IsS0FZS3J2RDtPQUNwQixPQTdEQXExRCxzQkFnRGVoRyxLQVlRL2dFOzttQkFaSjBRLFFBa0JDc2xDLE1BbEJEdGxDOztZQWVpQkM7UUFmaEN3bkMsV0FBVzRvQixLQWtCSy9xQjtRQURILE9BNTFCakI0bEI7aUJBMjBCZW1GLHFCQXBFZjhGLFlBb0VJMXVCLFlBZWdDeG5DOztXQUdBQztPQWxCaEN1bkMsV0FBVzRvQixLQWtCSy9xQjtPQUVtQjtjQXhGdkM2d0IsWUFvRUkxdUIsWUFrQmdDdm5DO1FBRWhCO1FBQVBvMkQ7UUFBUm51QjtPQUNMLE9BMzNCQTRpQixnQkFzMkJlc0YsS0FvQlZsb0IsUUFBUW11Qjs7aUJBcEJNdDJEOzs7Ozs7OzthQUMrQ3lDLE1BRC9DekMsUUFDdUM0YixlQUFsQjJyQjs7O3dCQXFCakI5M0MsSUF0Qkp1USxRQXNCQ3VsQzs7O2lCQXRCRHZsQzs7Ozs7OztpQkFLNkMyTSxNQUw3QzNNLFFBS3FDNm9ELGlCQUFsQnhoQjs7O3dCQW1CakIvMEMsSUF4QkYwTixRQXdCRG9uQzs7O2lCQXhCQ3BuQzs7Ozs7Ozs7YUFDK0N5QyxNQUQvQ3pDLFFBQ3VDNGIsZUFBbEIyckI7Ozt3QkFxQmpCOTNDLElBdEJKdVEsUUFzQkN1bEM7OztpQkF0QkR2bEM7Ozs7Ozs7aUJBSzZDMk0sTUFMN0MzTSxRQUtxQzZvRCxpQkFBbEJ4aEI7Ozt3QkFtQmpCLzBDLElBeEJGME4sUUF3QkRvbkM7OztXQUVQRSxNQTFCUXRuQztpQkEwQlJzbkM7OzthQWpCOENrTSxNQVR0Q3h6QyxRQVM4QnkyRCxxQkFBbEJGLE1BaUJwQmp2QjtTQTFCUEcsV0FBVzRvQixLQVNnQmtHO1NBRVMsT0Fqd0J4Q3RLLGlCQXN2QmVvRSxLQVNrQ29HLFFBRVQsV0FGaUJqakI7OztXQWlCM0NELE1BMUJLdnpDO09BQWZ5bkMsV0FBVzRvQixLQTBCSi9vQjtPQUF1RCxPQXZ3QmxFOGtCLGdCQTZ1QmVpRSxLQTBCbUQsV0FBcEQ5Yzs7V0FDSmlqQixNQTNCU3gyRCxRQUFmeW5DLFdBQVc0b0IsS0EyQkxtRyxNQUFrQixPQWp1QjVCeEosZUFzc0JlcUQ7O1dBNEJLaHpELE1BNUJEMkMsUUE0QkYwMkQsTUE1QkUxMkQ7T0FBZnluQyxXQUFXNG9CLEtBNEJFcUc7T0FBVyw2QkFBUnI1RDs7OztPQTVCaEJvcUMsV0FBVzRvQixLQUN5QjlvQixNQUV4QyxPQXp2QkEwa0IsaUJBc3ZCZW9FLEtBQzJDejBDLE1BQVFuWjs7T0FEOURnbEMsV0FBVzRvQixLQUt1QmhwQjtPQUdFLE9BOXZCeEM0a0I7Z0JBc3ZCZW9FLEtBS3lDeEgsUUFHaEIsZ0NBSHdCbDhDOztPQUw1RDg2QixXQUFXNG9CLEtBc0JLOXFCLE1BQ1EsT0Fwd0I1QjZtQixnQkE2dUJlaUUsS0FzQlE1Z0U7ZUF0Qm5CZzRDLFdBQVc0b0IsS0F3QkdqcEIsTUFDVSxPQXR2QjVCcWxCLGNBNnRCZTRELEtBd0JNLzlEOztHQUtTO1lBUTlCbStDLFNBQVNocUIsR0FBRTRwQztJQUNiLElBRDBCMWdDLGdCQUMxQjtpQkFDTzN2QixLQXZFRG1uQyxXQXFFT2twQixLQUVOcndELHdCQUZJeW1CLEdBQUU0cEMsS0FFMEI7SUFEdkMsbURBRDBCMWdDOztZQUt4QmdoQixVQUFVbHFCLEdBQUU0cEM7UUFBYTFnQztJQUMzQix5Q0FEWWxKLEdBQUU0cEMsS0FBYTFnQzs7WUFHekJtaEIsU0FBU3VmO0lBQ1gsSUFEeUIxZ0MsZ0JBQ3pCO3NCOUNwNUNIO0k4Q281Q0csbURBRHlCQTs7WUFHdkJpaEIsUUFBUXlmO3NCOUN0NUNiO0k4Q3M1Q21CLHFCOUN0NUNuQixPOEMyNENLNWYsY0FXUTRmO0dBQXlCO1lBRWpDcmY7SUFDRixJQURrQnJoQixnQkFDbEI7aUJBQ08zdkI7S0FBTyxPQXBGUm1uQztjQW9GbUIsaUNBcFl2QmlxQixvQkFvWUtweEQ7SUFBaUQ7SUFEeEQsbURBRGtCMnZCOztZQUtoQnNoQjtJQUNGLElBRG1CdGhCLGdCQUNuQjtpQkFDTzN2QjtLQUFPLE9BekZSbW5DO2NBeUZtQixpQ0E3WHZCa3FCLG9CQTZYS3J4RDtJQUFpRDtJQUR4RCxtREFEbUIydkI7O1lBS2pCZ25DLFNBQVNsd0M7SUFDWCxJQURzQmtKLGdCQUN0QjtpQkFDTzN2QjtLQUFPLE9BQUUsV0FGTHltQixZQUVVNHBDLEtBQU8sT0E5RnRCbHBCLFdBOEZla3BCLEtBQWRyd0QsS0FBdUM7SUFBQztJQUQvQyxtREFEc0IydkI7O1lBS3BCaW5DLFFBQVFqbkMsS0FBTSxPQUxkZ25DLGtCQUs0Qm5sRSxHQUFLLE9BQUxBLEVBQU0sR0FBMUJtK0IsS0FBK0I7WUFFdkN1aEIsU0FBU3pxQjtJQUNILElBRGNrSixnQkFDbEIxK0IsSUF2YkZ3L0QsbUJBd2JFSixNQWhjRkUsb0JBK2JFdC9EO2FBRUFtNkIsSUFBRXByQjtLQXRFQXluQyxXQXFFRjRvQixLQUNFcndEO0tBRUYsa0JBTE95bUIsR0FsWFRpckMsdUJBbVhFemdFLEdBQ0FvL0Q7SUFHOEI7SUFDbEMseUNBSElqbEMsUUFIa0J1RTs7WUFTcEJ3aEIsUUFBUXhoQixLQUFNLE9BVGR1aEIsU0FsNUNBbjBDLElBMjVDUTR5QixLQUFxQjtZQUU3QmtuQyxVQUFVcHdDO0lBQ0osSUFEZWtKLGdCQUNuQjErQixJQWxjRncvRCxtQkFtY0VKLE1BM2NGRSxvQkEwY0V0L0Q7YUFFQW02QixJQUFFcHJCO0tBakhBbW5DLFdBZ0hGa3BCLEtBQ0Vyd0Q7S0FFRixrQkFMUXltQixHQTdYVmlyQyx1QkE4WEV6Z0UsR0FDQW8vRDtJQUc4QjtJQUNsQyx5Q0FISWpsQyxRQUhtQnVFOztZQVNyQm1uQyxTQUFTbm5DLEtBQU0sT0FUZmtuQyxVQTc1Q0E5NUQsSUFzNkNTNHlCLEtBQXNCO1lBSS9Cb25DO0lBanlCQS9KLGVBa3lCYSxpQ0E1YWJvRTtJQTRhRixPQWx5QkVwRTthQW15QmEsaUNBamFicUU7R0FpYTJDO0dBRXRDLHdCQUpMMEY7OztJQVFPO0tBQUxDLEtBaG1CRjlILCtCQWlKQXlCO1dBK2NFcUc7Ozs7SUFHbUIsa0I5QzU4QzFCLE84QzJnQ0svRix3QkFRQUM7SUF2TEFqQztNQThKQTBCOzs7UTlDMS9CTCxPOEN3Z0NLSyxvQkFXQUU7Ozs7OztJQTJiTztLQUFMK0YsT0FybUJGL0gsK0JBa0pBMEI7V0FtZEVxRzs7OztJQUdtQixrQjlDajlDMUIsTzhDMmdDS2hHLHdCQVNBRTtJQTRiQSxPQXBuQkFsQzthQStKQTJCOzs7ZTlDMy9CTCxPOEN3Z0NLSSxvQkFZQUc7Ozs7OztHQTZibUU7R0FWOUQ7Ozs7T0FwekJMckU7T0FxZ0JBK0Y7T0Exb0JBNUg7T0Eyb0JBNkg7T0EzZ0JBcEc7T0FzZ0JBK0Y7T0FyZ0JBOUY7T0FzZ0JBK0Y7T0FwZ0JBOUY7T0FxZ0JBK0Y7T0FwZ0JBOUY7T0FxZ0JBK0Y7T0E5aEJBeEc7T0FvaUJBdDNEO09BamlCQXUzRDtPQWtpQkF0M0Q7T0F6aUJBbTNEO09BdWlCQStHO09BNWhCQTNHO09BK2hCQXQzRDtPQTVoQkF1M0Q7T0E2aEJBdDNEO09BdmhCQXczRDtPQXdoQkE1M0Q7T0EzaEJBMjNEO09BNGhCQTBHO09BeGRBN0Y7T0EyZEFnRztPQTFkQS9GO09BeWRBOEY7T0FwZUFoRztPQW1lQStGO09BaGZBaEc7T0FkQUY7T0FpZ0JBcUc7T0EzZkFwRztPQThmQXNHO09BemdCQXhHO09BdWdCQXVHO09BemdCQXhHO09BMGdCQTUzRDtPQTNZQWk1RDtPQXFaQTBGO09BclhBbkY7T0FzWEFvRjtPQTdaQTdGO09BK1pBOEY7T0ExWkE3RjtPQTJaQThGO09BOVhBeEY7T0FZQUk7T0FvWEFxRjtPQTVXQXBGO09BOFdBcUY7T0FuV0FuRjtPQXNXQXFGO09BeldBdEY7T0F3V0FxRjtPQW5jQXhHO09Bc2NBMEc7T0FuY0F6RztPQW9jQTBHO09BbGNBekc7T0FtY0EwRztPQWxmQWpIO09BNGRBa0c7T0FuZEFqRztPQW9kQWtHO09BaGNBL0Y7T0FtY0FpRztPQXJjQWxHO09Bc2NBbUc7T0E3Y0FwRztPQTBjQWtHO09BNWFBNUY7T0FrY0EwRztPQWpjQXpHO09Ba2NBMEc7O09BenFCQXhKO09BK25CQTZIO09Bbm5CQTVIO09Bb25CQTZIO09Bdm1CQXhIO09BMnFCQThKO09BL3FCQWxLO09BdXFCQThKO09BdHFCQTdKO09BMHFCQStKO09BenFCQTlKO09BdXFCQTZKO09BdHFCQTVKO09BMHFCQThKO09BaFZBN0Y7T0F5VEFtRjtPQW5WQXhGO09BMlZBMkY7T0F4VkExRjtPQTBWQTJGO09BcFhBOUY7T0E2V0EyRjtPQWhXQTFGO09Ba1dBMkY7T0Exb0JBbko7T0FrcEJBc0o7T0ExcEJBdko7T0E0cEJBd0o7T0EvT0EzRTtPQXdHQXlCO09BcEZBcEI7T0FvREFXO09BbkRBVjtPQW9EQVc7T0FwRUFoQjtPQVdBRztPQTJEQWU7T0FyREFaO09Bb0RBVztPQWNBRztPQWpHQXhCO09Bc0dBeUI7T0FqSEEzQjtPQXVKQStCO09BR0FDO09BR0FFO09BR0FDO09BS0FFO09BR0FFO09BNEdJK0M7T0FpQkpLO09BUUFHO09BcUJBQztPQUlBQztPQUlBQztPQTBIQXRsQjtPQUVBSTtPQUtBQztPQXFCQUU7T0FXQTJsQjtPQXRCQUY7T0FwQkE5bEI7T0FSQUw7T0F1QkFrbUI7T0FsQkFobUI7T0F5QkFPO09BV0EybEI7OztFOUNwN0NMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0krQytKT0s7WUFLQUMsVUFBVUM7SUFDWjtLQUNVLElBQUo5a0UsSUFBSSxXQUZFOGtFO2FBRU45a0U7S0FGTThrRTs7ZUFFTjlrRSxHQUZNOGtFO0tBT1YsT0FMSTlrRTs7Ozs7S0FGTThrRSxRQUxWRjtLQUtVRTs7S0FhVixPQWxCQUY7O0dBa0JDO1lBR0RHLFVBQVVELElBQ1osT0FEWUEsZ0JBaEJWRCxVQWdCVUMsSUFHSztZQVFmRSxrQkFBa0JGO0lBQ1osSUFBSjlrRSxJQVpGK2tFLFVBV2tCRDtjQUVGO0lBQ2xCLE9BRkk5a0U7R0FFSDtZQUdDaWxFLGFBQWFILElBakJiQyxVQWlCYUQsa0JBRU47WUFLUEksbUJBQW1CSixJQUFLLGFBQUxBLGNBQXlCO1lBRTVDSyxjQUFjTDtJQUNoQixZQURnQkE7Ozt1QkFFTTtRQUNUbjZDO0lBQWUsT0FBZkE7R0FFOEI7WUFHekN5NkMsV0FBV04sSUFDYixPQURhQSw4QkFHUTtZQU9uQk8sd0JBQXdCUCx3QkFBeUM7WUEwUW5FUSxhQXhRUVI7SUFDUjtLQUFJUyxlQURJVDtLQUVKMTNDLE1BQU0sNkJBRE5tNEM7SUFFSiw2QkFGSUE7SUFESVQ7SUFLUixPQUhJMTNDO0dBR0Q7WUFLRG80QyxVQUFVcm9DLE9BQU0ybkMsSUFaaEJPLHdCQVlnQlAsS0FDbEIsT0FEWTNuQyxNQUVQO1lBR0hzb0MsWUFBWXRvQyxPQUFNMm5DLElBQUssT0FMdkJVLFVBS1lyb0MsZUFBTTJuQyxJQUE2QjtZQUUvQ1ksV0FBV3ZvQyxPQUFNMm5DLElBQUc5a0U7SUFDdEIsOEJBRG1COGtFLE9BQUc5a0U7SUFDdEIsT0FIRXlsRSxZQUVXdG9DLE9BQU0ybkM7R0FFQztPQUdsQmE7WUFFQWg3RCxPQUFPaTdELE9BQU03NEQ7SUFBTzs7WUEzRnBCNjNEOzs7OztZQTJGYTczRDtZQVFHLDZCQVZoQjQ0RDtZQUVPQztHQVVWO1lBR0cvZ0QsWUFBWTFuQjtJQUNkLElBQUkrQixZQUNBd0IsTUFBSixzQkFGY3ZEO2FBR1Y0UDtLQUNGLEdBRkVyTSxPQURBeEIsTUFHZ0I7S0FDVixJQUFKYyxJQUFJLGdCQUxJN0MsR0FDVitCOztLQU1GLE9BRkljO0lBRUg7SUFDSCxPQXJCRTJLLFVBZ0JFb0M7R0FLbUI7O0dBR0wsU0FBaEI4YyxvQi9DbFJQLE8rQzBQT2xmO0dBd0JnQixJQXFEZGpLO1lBUEZtbEUsa0JBQWtCeGtFO0lBQUssdUJBQUxBO0lBQXlCO0dBQWlCO1lBSTVEeWtFLGtCQUFrQnprRTtJQUFNO0dBQWlCO1lBRXpDMGtFLFFBQVFDLGVBQWNKLE9BQU12a0U7SUFDOUI7S0FDSVcsTUFBTTtLQUNOOUM7S0FDQTBlO0tBQ0Fxb0Q7YUFDQWw1RDtLQUNGLEdBSkU3TixPQUNBMGUsUUFHOEIsSUFBSjVkLElBQUksZUFMOUJnQyxLQUNBOUMsZUFJMEQsT0FBaENjO1FBRjFCaW1FLFFBR1c7S0FKWHJvRCxTQUtPLHVCQVRtQnZjLElBRTFCVyxRQURBdEI7a0JBR0FrZDtnQkFDQXFvRCx1QkFMTUQsZUFBb0Iza0U7Z0JBRzFCbkMsVUFTRSxlQVZGOEM7SUFZQztJQUNMLE9BM0ZFMkksT0E0RXNCaTdELE9BTXBCNzREO0dBU2E7R0FzQmpCLElBREV0TixRQXBDQXNtRSxRQUZBRDtZQTBDQUksYUFBYWhsRSxTQUdieXBCO0lBRkYsMEJBRUVBLGVBTkYsT0FERWxyQjtJQVFTLElBQUw0QixLQUFLLFdBSklILFNBR2J5cEI7V0EzQ0FvN0MsUUFOQUYsdUJBaURBbDdDLE9BQ0l0cEI7R0FDMkM7O0dBR3JDLFNBQVZILGMvQ3RYUCxPK0M4V09nbEU7R0FRVTtHQUNJLFNBQWQva0Usa0IvQ3ZYUCxPK0M4V08ra0U7WUFjQTM3QyxhQUFhbHBCLElBQ2YsT0F2REUwa0UsUUFGQUQsdUJBd0RhemtFLFNBQzBCO1lBR3ZDOGtFLFNBQVNyQjtJQUNYLFlBRFdBO2tDQUtzQjsyQkFIbEJ6akUsZUFDYiw4QkFEYUE7UUFFTStrRTtJQUFPLDhCQUFQQTtHQUNjO0dBY3ZDOzs7WUFFSUMsVUFBVWxwRTtJQUFJLG9EQUFKQTtHQUEwQjtZQUVwQ21wRSxpQkFBaUJ0bUU7SUFDbkIsT0FIRXFtRSxVQUdRLGtDQURTcm1FO0dBQ3VDO1lBR3hEdW1FLGlCQUFpQkM7SUFDbkIsT0FQRUgsVUFRQSxrQ0FGaUJHO0dBS047WUFXWEM7SUFDRixPQXZCRUo7R0F1QnNEO1lBR3RESztJQUNGLE9BM0JFTDtHQTJCbUQ7WUFPbkRNLG1CQUFtQjNtRSxHQUFFNG1FO0lBQ3ZCLE9BbkNFUCxVQStCRixrQ0FHcUJybUUsR0FBRTRtRTtHQUNnQjtZQWlDckNDLGdCQUFnQi9CLElBQUc5a0U7SUFDWixJQUFMNG1FLEtBM1JBNUIsa0JBMFJjRjtXQUNkOEIsT0FEaUI1bUUsSUF6UGpCcWxFLHdCQXlQY1AsTUFsQ2hCNkIsbUJBa0NtQjNtRSxHQUNqQjRtRTtHQUVtQjtZQVRqQkUsV0FXVWhDLElBUGR6cUQ7SUFIRixVQUdFQTtLQVFPLElBQUx1c0QsS0FoU0E1QixrQkErUllGO0tBRWhCLGNBREk4QjtlQS9QQXZCLHdCQThQWVA7O21CQUNaOEI7a0JBL1BBdkIsd0JBOFBZUCxLQUxkK0IsZ0JBS2MvQjtpQkF2Q2Q2Qix1QkF3Q0VDOztjQVJGdnNELEtBQUssT0FFTHdzRCxnQkFLYy9CLElBUGR6cUQ7SUEzQkY7S0FBUSxJQUFKcmEsSUF4UUEra0UsVUEwU1lELEtBakNULFdBaUNTQTtnQkFqQ1Q7S0FBdUIsV0FEMUI5a0U7Ozs7O29CQUtLO0tBak9McWxFLHdCQThQWVA7O0dBUFc7WUFpQnpCaUMsV0FBV2pDLElBQUssdUJBRWhCUSxhQUZXUixRQUE0QjtZQUl2Q2tDLFdBQVdsQztJQUNQLElBR0ozbkUsSUFOQW1vRSxhQUVXUjtnQ0FJWDNuRTs7O2dCQTNGQWtwRSxVQTJGZSxrQ0FBZmxwRTs7O0dBQXdEO1lBYXhEOHBFO0lBQTZCOzs7O1FBQ3RCOztRQUNBOztRQUNBOztRQUNBOztRQUNBOzs7UUFDTTs7SUFDUjtHQUFZO1lBTWpCQyxrQkFBa0JDLE1BQUtyQztJQUN6QixPQURvQnFDOztPQU9PO2VBdkN6QjdCLGFBZ0N1QlI7UUFDckIxM0MsTUFNZ0I7OztPQUZPO2VBckN6Qms0QyxhQWdDdUJSO1FBQ3JCMTNDLE1BSWdCOzs7T0FETztlQXBDekJrNEMsYUFnQ3VCUjtRQUNyQjEzQyxNQUdnQjs7O09BRU87ZUF0Q3pCazRDLGFBZ0N1QlI7UUFDckIxM0MsTUFLZ0I7O21CQUxoQkEsTUFqQ0ZrNEMsYUFnQ3VCUjs7SUFRekIsSUFBSTdsRSxJQUFKLHNCQVBJbXVCO0lBUVEsU0FEUm51QixZQUNRLGdCQVJSbXVCO0tBUXFDLHFDQVJyQ0EsUUFPQW51QjtJQUM0QixPQVI1Qm11QjtHQVE2RDtZQVEvRGc2QyxZQUFZdEM7SUFBSyxvQ0FqRGpCUSxhQWlEWVI7R0FBd0M7WUFtQ2hEdUMsd0JBQXdCbHFDLE9BQU0ybkM7SUFDcEMsSUFEOEJsekI7SUFDOUI7Y0FEOEJBLFNBQ1osT0FEWUE7S0FFdEIsSUFBSjV4QyxJQTVZQStrRSxVQTBZZ0NEO0tBR2pDLEdBSGlDQSxPQUdaLE9BSE1sekI7Y0FFMUI1eEM7O09BT1UsSUFUZ0IwNUMsVUE3VTFCK3JCLFlBNlUwQjd6QixTQUFNa3pCLEtBQU5sekI7Ozs7bUJBRTFCNXhDO01BSVUsSUFOZ0J5M0QsVUEzVTFCaU8sV0EyVTBCOXpCLFNBQU1rekIsSUFFaEM5a0UsSUFGMEI0eEM7OztLQVd2QixPQVh1QkE7O0dBV2xCO1lBR1YwMUIsd0JBQXdCbnFDLE9BQU0ybkM7SUFDaEMsU0FEMEIzbkMsT0FDUixPQWxMaEJvcEM7SUFtTE0sSUFBSnZtRSxJQS9ZQWdsRSxrQkE2WTRCRjtXQUU1QjlrRTtLQU1RLE9BL0xWcW1FLFVBK0xVLGtDQU5Scm1FO0lBR1UsSUFBUjR4QyxVQTlWRjh6QixXQXlWc0J2b0MsT0FBTTJuQyxJQUU1QjlrRTtJQUlGLE9BcEJJcW5FLHdCQW1CQXoxQixTQUwwQmt6QjtHQVFvQztZQXFCbEV5QyxnQkFBZ0JDLE9BQU1DLFFBQU9oUSxTQUFNcU47SUFHckMsU0FIK0JyTixTQUdiLE9Bak5oQjhPO0lBa05NLElBQUpsc0QsTUE5YUEycUQsa0JBMGFpQ0Y7SUFLbEMsZ0JBTHFCMkMsUUFJcEJwdEQ7S0FLUSxPQTdOVmdzRCxVQTZOVSxrQ0FMUmhzRCxLQUpjbXREO0lBTUosSUFyQk1FLFVBdldoQmhDLFdBc1gyQmpPLFNBQU1xTixJQUlqQ3pxRCxNQW5CZ0I4aUI7SUFDbEI7Y0FEa0JBLE9BQ0EsT0FEQUE7S0FFVixJQUdObjlCLElBM2FBK2tFLFVBcWJpQ0Q7S0FaaEMsR0FZZ0NBLE9BWlgsT0FITjNuQztLQUtULGNBVWFzcUMsUUFWcEJ6bkU7TUFDWSxJQU5JNHhDLFVBdldoQjh6QixXQXVXZ0J2b0MsT0FlaUIybkMsSUFWakM5a0UsSUFMZ0JtOUI7OztlQUtoQm45QixHQU1LLE9BWFdtOUI7S0FTSixJQVRJdWMsVUF6V2hCK3JCLFlBeVdnQnRvQyxPQWVpQjJuQyxLQWZqQjNuQzs7R0F3QnVEO1lBR3pFd3FDLHVCQUFrQixvQ0FFUjtHQUdRLFNBQWxCQztJL0MxbkJMLE8rQ3ltQktMLDRCQVlBSTs7WUFPQUUsc0JBQWlCLG9DQUVQO0dBR08sU0FBakJDO0kvQ2pvQkwsTytDeW1CS1AsMkJBbUJBTTs7WUFPQUU7SUFBZ0I7Ozs7OztHQUVOO0dBR2EsU0FBdkJDO0kvQ3hvQkwsTytDeW1CS1QsaUNBMEJBUTs7WUFVQUUsVUFBVTlxQyxPQUFNMm5DO0lBQ2xCLElBQUk5a0UsSUEvY0FnbEUsa0JBOGNjRixLQUNWLFdBQUo5a0U7Ozs7UUFFSyxPQTdaTDBsRSxXQTBaUXZvQyxPQUFNMm5DLElBQ2Q5a0U7O2dCQUdLLE9BOVpMMGxFLFdBMFpRdm9DLE9BQU0ybkMsSUFDZDlrRTs7SUFJRyxPQUxLbTlCO0dBS0E7WUFHVitxQywrQkFBbUMvcUMsT0FBTTJuQztJQUMvQixJQUFSbHpCLFVBVEZxMkIsVUFRbUM5cUMsT0FBTTJuQztJQUUzQyxPQTNFRXdDLHdCQTBFRTExQixTQUR1Q2t6QjtHQUVUO1lBMkJoQ3FELG9CQUFvQmhCLE1BQUt6dEIsU0FBTW9yQjtJQUNqQyxPQURzQnFDOztPQUVKLE9BMURoQlMsZ0JBd0R5Qmx1QixTQUFNb3JCOztPQUdmLE9BaENoQm9ELCtCQTZCeUJ4dUIsU0FBTW9yQjs7T0FKckIsSUFoQlFsekIsVUFqQmxCcTJCLFVBcUN5QnZ1QixTQUFNb3JCLEtBbEIvQjlrRSxJQWplRWdsRSxrQkFtZjZCRjtpQkFsQi9COWtFLEdBVUssT0E5RkxzbkUsd0JBa0ZrQjExQixTQW9CYWt6QjtPQWpCbkIsSUFBUjNuQyxRQTlhRnVvQyxXQTJhZ0I5ekIsU0FvQmFrekIsSUFsQi9COWtFO09BRUEsU0FESW05QixPQUNjLE9BRGRBO09BRUksSUFBSjlpQixNQS9lRjBxRCxVQThmNkJEO09BZDVCLEdBYzRCQSxPQWRQLE9BSHBCM25DOztnQkFFQTlpQjt3QkFJSyxPQXRDVHl0RCxlQTlZRXBDLFdBOGFFdm9DLE9BaUIyQjJuQyxJQWYzQnpxRCxNQWUyQnlxRDttQkFmM0J6cUQ7Ozs7O1FBS0ssT0E5Q1R1dEQsZ0JBdllFbEMsV0E4YUV2b0MsT0FpQjJCMm5DLElBZjNCenFELE1BZTJCeXFEOztpQkExQy9Ca0QscUJBclpFdEMsV0E4YUV2b0MsT0FpQjJCMm5DLElBZjNCenFELE1BZTJCeXFEO2lCQXBIM0J1Qyx3QkFtR0FscUMsT0FpQjJCMm5DOztPQUtmLE9BdERoQmdELGVBaUR5QnB1QixTQUFNb3JCOztPQU1mLE9BNUdoQndDLHdCQXNHeUI1dEIsU0FBTW9yQjtlQU9mLE9BakRoQmtELHFCQTBDeUJ0dUIsU0FBTW9yQjs7R0FPYztZQU03Q3NELHFCQUFxQmpyQyxPQUFNMm5DO0lBQzdCLFNBRHVCM25DLE9BQ0wsT0FES0E7SUFFZixJQUdObjlCLElBaGhCRStrRSxVQTJnQnlCRDtJQUcxQixPQUgwQkE7Y0FBTjNuQzs7Z0JBS3JCbjlCO2dCQUxxQm05QjtnQkFqSWpCa3FDLHdCQTNVRjNCLFdBNGNtQnZvQyxPQUFNMm5DLElBSzNCOWtFLElBTDJCOGtFO0dBT2pCO1lBSVZ1RCxtQkFBbUJsckMsT0FBTTJuQztJQUMzQixTQURxQjNuQyxPQUNILE9BREdBO0lBRWIsSUFBSm45QixJQXhoQkEra0UsVUFzaEJ1QkQ7SUFHeEIsR0FId0JBLE9BR0gsT0FISDNuQztjQUVqQm45QixnQkFLRyxPQVBjbTlCO0lBTW5CLE9BM0RBK3FDLCtCQWxhRXhDLFdBdWRpQnZvQyxPQUFNMm5DLElBRXZCOWtFLElBRnVCOGtFO0dBT2Y7WUEyQ1Z3RCxXQUFXNXVCLFNBQU02dUIsV0FBVXpEO0lBQzdCO0tBcENJM25DLFFBNUVGOHFDLFVBK0dXdnVCLFNBQWdCb3JCO0tBQ3pCbHpCLFVBL0xFeTFCLHdCQTJKRmxxQyxPQW1DeUIybkM7SUFFN0IsU0FESWx6QixTQUNjLFdBRGRBLFNBRGUyMkI7SUFHWCxJQUFKdm9FLElBM2tCQStrRSxVQXdrQnlCRDtJQUkxQixHQUowQkEsT0FJTCxXQUhwQmx6QixTQURlMjJCO2NBR2Z2b0UsR0FTRixXQTlEQXFvRSxtQkFtREV6MkIsU0FEeUJrekIsS0FBVnlEO0lBT0w7S0FBUjlRLFVBaGhCRmlPLFdBMGdCQTl6QixTQUR5Qmt6QixJQUd6QjlrRTtLQUtFd29FLGNBQVksMkJBRFovUSxTQVBhOFE7S0FTYmI7T0FGQWpRLFdBQ0ErUSxjQXJFSkoscUJBcUVJSSxhQVJ1QjFEO0lBVTNCLFdBNURBdUQsbUJBMkRJWCxTQVR1QjVDLEtBUXZCMEQ7R0FJa0M7WUFHdENDLDhCQUE4QnRyQyxPQUFNMm5DLElBQUc5d0QsT0FBTXRZO0lBQy9DLFNBQUlndEUsVUFBVTFvRTtLQUNaLFlBRFlBOzs7SUFJSjtJQUNWO0tBQUlVLE1BQUosc0JBTitDaEY7S0FPM0NrMkMsY0FQNEJ6VTtLQVFoQyxPQUZJejhCO0tBQ1E7O1NBQ1p4Qjs7TUFDVSxJQUFKYyxJQWhtQkYra0UsVUF1bEJrQ0QsS0FVbEIsT0FUaEI0RCxVQVMwQixnQkFWaUJodEUsS0FRL0N3RDtTQVBJd3BFLFVBUUUxb0UsYUFDcUMsV0FWRmdVO2VBT3JDNDlCLFlBSWlCLFdBWG9CNTlCO01BT3JDNDlCLGFBL2hCQTh6QixXQStoQkE5ekIsWUFQa0NrekIsSUFTaEM5a0U7TUFETjs7Ozs7V0FESTR4QztHQU9FO1lBR0orMkIsZUFBZXhyQyxPQUFNb3JDLFdBQVV6RDtJQUNqQyxpQkFEaUIzbkMsOEJBdmxCYjhuQyxhQXVsQjZCSDtJQUNqQixTQTlXZDRCO0lBK1dVO0tBQVI5MEIsVUFqSkZxMkIsVUErSWU5cUMsT0FBZ0IybkM7a0JBRTdCbHpCO29CQXpsQkFxekIsYUF1bEI2Qkg7SUFHakIsU0FoWGQ0QjtJQWlYSSxJQUNKMW1FLElBN21CRStrRSxVQXdtQjZCRDthQUsvQjlrRTtLQURJLGVBQ0pBOzs7T0E2Qlk7UUFBUjA1QyxVQTNrQkZnc0IsV0EyaUJBOXpCLFNBRjZCa3pCLElBSy9COWtFO3FCQTZCSTA1Qzt1QkF6bkJGdXJCLGFBdWxCNkJIO09BbUNmLFNBaFpoQjRCO09BZ1o4QyxPQXBEOUMrQjtnQkFtREkvdUIsU0FsQzJCb3JCLElBN1cvQjRCOzs7Ozs7ZUFrWEExbUU7TUFDWTtPQUFSMG5FLFVBL2lCRmhDLFdBMmlCQTl6QixTQUY2Qmt6QixJQUsvQjlrRTtvQkFDSTBuRTtzQkE3bEJGekMsYUF1bEI2Qkg7TUFPZixTQXBYaEI0QjtNQXFYWTtPQUFSa0M7U0F6QkpILDhCQXVCSWYsU0FOMkI1QyxJQTdXL0I0QjtNQXNYZ0IsU0FEWmtDLGFBL2xCRjNELGFBdWxCNkJIO09BVVgsV0FsbkJsQkMsVUF3bUI2QkQ7Ozs7O1dBVXpCK0QscUJBRkZELFVBNUpKWixxQkE0SklZLFNBUjJCOUQ7T0FhYixTQUhaK0QsYUFqbUJKNUQsYUF1bEI2Qkg7UUFjVCxJQUNkenFELE1Bdm5CTjBxRCxVQXdtQjZCRDtrQkFldkJ6cUQ7U0FDWSxJQUFSeXVELFVBempCVnBELFdBbWpCSW1ELFNBVnlCL0QsSUFldkJ6cUQ7U0FFZ0IsU0FEWnl1RCxhQXZtQlY3RCxhQXVsQjZCSDtVQWtCZixZQTFuQmRDLFVBd21CNkJEOztXQXFCSDtZQUFaMEQsY0FBWSwyQkFMaEJNLFNBaEJTUDtZQWdCVFE7O2lCQUtJUCxjQXpLaEJSLHFCQXlLZ0JRLGFBckJlMUQ7Ozs7NkJBZ0JuQmlFOzs7OzthQUZKRSxVQUVJRDs7O2FBRkpDLFVBSkZKO1FBZWMsU0FYWkksYUFybUJOaEUsYUF1bEI2Qkg7U0EwQm5CLElBQ0p4cUQsTUFub0JOeXFELFVBd21CNkJEO21CQTJCdkJ4cUQsb0JBSUssT0FqQkwydUQ7U0FjWTtVQUFSQyxVQXJrQlZ4RCxXQXVqQk11RCxTQWR1Qm5FLElBMkJ2QnhxRDt1QkFDSTR1RDt5QkFubkJWakUsYUF1bEI2Qkg7U0E2QlAsU0ExWXhCNEI7U0EwWXNELE9BcEt0RHdCLCtCQW1LWWdCLFNBNUJtQnBFOztRQXlCbUIsT0FYMUNtRTs7T0FEd0MsT0FIMUNKOztNQUR3QyxPQUQxQ0Q7O2VBSEo1b0U7O21CQW9DSyxPQXRaTDBtRTtJQW1aWTtLQUFSalAsVUEva0JGaU8sV0EyaUJBOXpCLFNBRjZCa3pCLElBSy9COWtFO2tCQWlDSXkzRDtvQkE3bkJGd04sYUF1bEI2Qkg7SUF1Q2YsU0FwWmhCNEI7SUFvWjhDLE9BeEQ5QytCO2FBdURJaFIsU0F0QzJCcU4sSUE3Vy9CNEI7R0FzWnFCO1lBR3JCeUMscUJBQXFCaHNDLE9BQU1vckMsV0FBVXpEO0lBQ3ZDLGlCQUR1QjNuQyw4QkFub0JuQjhuQyxhQW1vQm1DSDtJQUN2QixTQTlaZDJCO0lBK1pVO0tBQVI3MEIsVUE1UUV5MUIsd0JBMFFpQmxxQyxPQUFnQjJuQztrQkFFbkNsekI7b0JBcm9CQXF6QixhQW1vQm1DSDtJQUd2QixTQWhhZDJCO0lBaWFNLElBQUp6bUUsSUF4cEJBK2tFLFVBb3BCbUNELEtBSS9CLFdBQUo5a0U7OztNQUdVO09BQVIwNUMsVUE1bEJGZ3NCLFdBdWxCQTl6QixTQUZtQ2t6QixJQUluQzlrRTtPQU1Fd29FLGNBQVksMkJBSFo5dUIsU0FQdUI2dUI7T0FhdkJhLGtCQXRKSmhCLHFCQW1KSUksYUFWaUMxRDtPQWdCakN1RSxhQU5BYixjQUdBWTtPQUtBM1IsVUFYQS9kLFVBU0EydkI7TUFHSixPQWpKQWhCLG1CQWdKSTVRLFNBbEJpQ3FOOzs7cUNBcUJyQyxPQW5KQXVELG1CQWdJRXoyQixTQUZtQ2t6QjtJQXNCaEMsT0FuYkwyQjtHQW1iaUI7WUFHakI2QyxnQkFBZ0Juc0MsT0FBTW9yQyxXQUFVekQ7SUFDbEMsaUJBRGtCM25DLDhCQTVwQmQ4bkMsYUE0cEI4Qkg7SUFDbEIsU0F2YmQyQjtJQXdiVTtLQUFSNzBCLFVBdE5GcTJCLFVBb05nQjlxQyxPQUFnQjJuQztrQkFFOUJsekI7b0JBOXBCQXF6QixhQTRwQjhCSDtJQUdsQixTQXpiZDJCO0lBMGJJLElBQ0p6bUUsSUFsckJFK2tFLFVBNnFCOEJEO2FBS2hDOWtFOztNQWlDWTtPQUFSMDVDLFVBcHBCRmdzQixXQWduQkE5ekIsU0FGOEJrekIsSUFLaEM5a0U7b0JBaUNJMDVDO3NCQWxzQkZ1ckIsYUE0cEI4Qkg7TUF1Q2hCLFNBN2RoQjJCO01BNmQ4QyxPQWhFOUMwQyxxQkErREl6dkIsU0F0Q2tCNnVCLFdBQVV6RDs7O2tCQUtoQzlrRTtLQUNZO01BQVJ5M0QsVUFwbkJGaU8sV0FnbkJBOXpCLFNBRjhCa3pCLElBS2hDOWtFO21CQUNJeTNEO3FCQWxxQkZ3TixhQTRwQjhCSDtLQU9oQixTQTdiaEIyQjtLQThiTSxJQUNKcHNELE1BdHJCQTBxRCxVQTZxQjhCRDtlQVM5QnpxRDtNQTBCQSxPQTVERjh1RCxxQkErQkkxUixTQU5rQjhRLFdBQVV6RDtLQVVsQjtNQUFSNEMsVUF4bkJKaEMsV0FvbkJFak8sU0FONEJxTixJQVM5QnpxRDttQkFDSXF0RDtxQkF0cUJKekMsYUE0cEI4Qkg7S0FXZCxTQWpjbEIyQjtLQWtjYztNQUFSbUMsVUFyT05aLHFCQW1PTU4sU0FWMEI1QzttQkFZMUI4RDtxQkF4cUJKM0QsYUE0cEI4Qkg7S0FhZCxTQW5jbEIyQjtLQW9jb0IsSUFDZG5zRCxNQTVyQkp5cUQsVUE2cUI4QkQsS0FjWixXQUNkeHFEOzs7T0FDWSxJQUFSdXVELFVBOW5CUm5ELFdBMG5CSWtELFNBWjBCOUQsSUFlMUJ4cUQ7T0FFZ0IsU0FEWnV1RCxhQTVxQlI1RCxhQTRwQjhCSDtRQWtCbEIsWUEvckJaQyxVQTZxQjhCRDs7U0FxQk47VUFBWjBELGNBQVksMkJBTGhCSyxTQWhCWU47VUFnQlpROztlQUtJUCxjQTlPZFIscUJBOE9jUSxhQXJCa0IxRDs7OzsyQkFnQnRCaUU7Ozs7Ozs7Ozs7b0JBSkpIOzs7U0FFQUsscUJBcGNOeEMsZUFzY1V1QztLQVVRLFNBWlpDLGFBMXFCSmhFLGFBNHBCOEJIO01BMkJ0QixJQUNKdnFELE1BenNCSndxRCxVQTZxQjhCRDtnQkE0QjFCdnFELG9CQUlLLE9BbEJMMHVEO01BZVk7T0FBUkMsVUEzb0JSeEQsV0E0bkJJdUQsU0FkMEJuRSxJQTRCMUJ2cUQ7b0JBQ0kydUQ7c0JBenJCUmpFLGFBNHBCOEJIO01BOEJWLFNBaGR0QjRCO01BZ2RvRCxPQTFPcER3QiwrQkF5T1VnQixTQTdCc0JwRTs7S0EwQmdCLE9BWjFDbUU7O0lBK0JELE9BbmVMeEM7R0FtZWlCO1lBU2pCOEMsWUFBWUMsS0FDRHJzQyxPQURXMm5DO0lBQ3hCLElBQWFsekI7SUFDWDtjQURXQSxTQUNPLE9BRFBBO0tBRUgsSUFBSjV4QyxJQXR1QkYra0UsVUFtdUJvQkQ7S0FJbkIsR0FKbUJBLE9BSUUsT0FIYmx6QjtRQURDNDNCO1VBTUhudkQsTUFOR212RDtTQUdSeHBFLE1BR0txYSxLQUxYLE9BNXFCSW1yRCxVQTRxQlM1ekIsU0FEV2t6QjtNQU9ILElBTlJwckIsVUFycUJUZ3NCLFdBcXFCUzl6QixTQURXa3pCLElBR2xCOWtFLElBRk80eEM7OztLQVFQLFdBTkE1eEM7Ozs7O2tCQU84QixPQVR2QjR4QztLQVVLLElBVkw2bEIsVUFycUJUaU8sV0FxcUJTOXpCLFNBRFdrekIsSUFHbEI5a0UsSUFGTzR4Qzs7R0FXSDtZQXFDUjYzQiwwQkFDRXpwRTtJQUFKLGFBQUlBO0dBVWlCO1lBZW5CMHBFLGdCQUFnQmxELFNBQVFycEMsT0FBTTJuQztJQUNoQyxTQUQwQjNuQyxPQUNSLE9BeGtCaEJvcEMsaUJBdWtCZ0JDO0lBRVYsSUFBSnhtRSxJQWh6QkEra0UsVUE4eUI0QkQ7SUFHN0IsT0FINkJBLFFBN2tCOUJ1QixVQWdCQSxrQ0E2akJnQkcsWUFFZHhtRTtHQUVIO0dBRzRCLFNBQTNCMnBFO0kvQ3orQkwsTytDaytCS0Q7O0dBUTZCLFNBQTdCRTtJL0MxK0JMLE8rQ2srQktGOztZQVVBRyxvQkFBb0Ixc0MsT0FBTTJuQztJQUM1QixJQW5Ed0JnRixLQStDdEJILHlCQUdvQnhzQyxPQUFNMm5DO2FBbERKZ0Y7O01BbURsQixlQW5Ea0JBOzs7O1VBc0ViO1dBTExDOztjQUNGLElBQUkvcEUsSUF4MUJKNmtFLFVBdzBCd0JDLEtBZ0JoQixPQUFKOWtFOzs7OztvQ0FybUJOc21FLGlCQXFtQk10bUU7YUFHcUI7V0F6Q0RnVixLQXFDdEIrMEQ7V0FyQ3lCOTBELEtBcUN6QjgwRDtXQWxDQyxPQWpCTE4sMEJBYzZCeDBEO1dBQzNCb0YsWUFmRm92RCwwQkFjMEJ6MEQ7O2tCQUN4QnFGO3NCQU1KLHVCQU5JQTs7OztzQkFsa0JGZ3NELFVBdWtCRSxrQ0FOd0JyeEQsSUFBR0M7VUE0Q00sT0Evd0JqQ3l3RCxXQXl2QmtCdm9DLGVBQU0ybkM7Ozs7Ozs7OzttQkFsREpnRjtNQTZEYjtPQU5MRTs7VUFDTSxJQUVOaHFFLElBaDFCRjZrRSxVQXcwQndCQztxQkFRdEI5a0UsZUE3bEJKc21FLGlCQTZsQkl0bUU7U0FDdUI7T0EzREZpcUUsT0F1RHJCRDtPQXZEd0JFLE9BdUR4QkY7T0F0REZocUU7a0JBRG9COHBFLDJCQUFHRztZQUFHQzs7O2NBQzFCbHFFO2tCQVFKLHVCQVJJQTs7Ozs7ZUF0aUJGcW1FLFVBNGlCRSxrQ0FQb0J5RCxJQUFHRyxNQUFHQztNQStETyxPQXR3QmpDeEUsV0F5dkJrQnZvQyxlQUFNMm5DOzs7bUJBbERKZ0Y7bUJBMEV0QixPQTdtQkF4RCxpQkFtaUJzQndEOzs7Ozs7Ozs7Ozs7Ozs7OztJQXFETyxPQTV2QjNCcEUsV0F5dkJrQnZvQyxPQUFNMm5DO0dBd0JSO1lBMkJsQnFGLGlCQUVpQmh0QyxPQUZNMm5DO2FBT3JCc0YscUJBQVVqdEM7S0FDWixJQURZeVU7S0FDWjtNQUFNLElBR0o1eEMsSUFoRUY0cEUsMkJBNERZaDRCLFNBUFdrekI7Z0JBV3JCOWtFLEdBVEosT0FoekJJeWxFLFlBcXpCVTd6QixTQVBXa3pCO2dCQVdyQjlrRTtPQUFlLElBSkx5M0QsVUFuekJWaU8sV0FtekJVOXpCLFNBUFdrekIsSUFXckI5a0UsSUFKVTR4Qzs7O01BR2E7T0FHUjhILFVBM3pCZityQixZQXF6QlU3ekIsU0FQV2t6QjtPQWNqQixRQW5FTjhFLDJCQWtFaUJsd0IsU0FiTW9yQjs7T0FnQkQsV0E5ekJwQlcsWUEyekJlL3JCLFNBYk1vckI7T0FnQkQ7c0NBUXBCdUY7O09BUm9CLE9BUXBCQTs7O09BUGUsSUFWTHpCLFVBMURaaUIsb0JBZ0VpQm53QixTQWJNb3JCLEtBT1hsekI7OztNQVFXLElBSVI4MUIsVUFqMEJiakMsWUEyekJlL3JCLFNBYk1vckI7Z0JBckR2QjhFLDJCQXdFZWxDLFNBbkJRNUM7T0FzQk4sSUFmTCtELFVBbnpCVm5ELFdBK3pCYWdDLFNBbkJRNUMsU0FPWGx6Qjs7O01BY1UsV0FuMEJwQjZ6QixZQWkwQmFpQyxTQW5CUTVDO01BcUJELGdEQUdwQnVGOztNQUhvQixPQUdwQkE7O0lBYitDO2FBYS9DQSxxQkFBWWx0QztLQUNkLElBRGN5VTtLQUNkO2dCQTlFQWc0QiwyQkE2RWNoNEIsU0F4QlNrekI7T0EwQkYsSUFGUHByQixVQXQwQlorckIsWUFzMEJZN3pCLFNBeEJTa3pCLEtBd0JUbHpCOzs7TUFHUDtxQ0FwQkx3NEIsaUJBaUJZeDRCOztNQUdQLE9BcEJMdzRCLHVCQWlCWXg0Qjs7SUFHUTthQXBCcEIwNEIsVUFBVW50QyxPL0N0aUNqQix1QitDc2lDT2l0QyxlQUFVanRDO0lBSk4sSUFFSm45QixJQXIyQkFnbEUsa0JBZzJCcUJGO2tCQUtyQjlrRTtjQUVBc3FFLFVBcnpCQTdFLFlBZ3pCZXRvQyxPQUZNMm5DO2NBeG1CdkI2Qix1QkE2bUJFM21FO0dBd0JZO1lBa0JkdXFFLHVCQUF1Qi90RSxVQUFTZ3VFLFlBQVdydEMsT0FBTTJuQzthQUMzQzJGLFdBQVd2ckUsR0FBRXNxRTtLQUNuQixJQURpQnJxRTtLQUNqQjtNQUFRLElBQUphLElBNTVCRitrRSxVQTA1QitDRCxlQUNoQzNsRTs7T0FFRCxjQUhpQzJsRTs7UUFJOUM7aURBSm9CdG9FLFVBRW5Cd0Q7U0FFRCxhQUZDQSxNQURld3BFOzs7Ozs7O01BNTFCakI5RCx1QkEyMUIrQ1osSUFFN0M5a0U7VUFEYTZkOztJQU1PO1NBUFEyc0QsWUFTeEIsT0FSRkMsV0FEcUN0dEM7UUFVdENuOUIsSUFWMkJ3cUU7SUFDMUJDLFdBRHFDdHRDLE9BVXRDbjlCO0lBRUUsY0FaMEM4a0U7Y0FZMUM7SUFDSSxJQUFMOEIsS0F2NkJKN0IsVUEwNUIrQ0Q7V0FVNUM5a0UsTUFHQzRtRSxLQTMzQkp2Qix3QkE4MkIrQ1AsTUF2cEJqRDZCLG1CQWlxQkszbUUsR0FHQzRtRTtHQUd3QjtZQUk5QjhELGdCQUFnQjVGLElBSWhCeG5FO0kvQ3RtQ0wsRytDc21DS0E7U0FIYUgsSUFHYkc7OzRCQUFLLGtDQUFMQTtTQUhhSCxJQUdiRzs7SUFGUSxJQUFKNEIsSUE5NEJGa21FLFdBNDRCY047SUFHTixPQWh0QlZ1QixVQWd0QlUsa0NBRE5ubkUsR0FEUy9COztZQWVid3RFLGlCQUFpQnp0QztJQUFVLEtBQVZBLFNBQ1Q7UUFDSEMsUUFGWUQ7SUFFSCxPQUFUQztHQUFjO1lBR25CeXRDLDBCQUEwQkM7SUFDNUIsU0FENEJBLFFBQ0s7SUFDckI7S0FBTm52RSxNQUFNLG1DQUZnQm12RTtLQUd0QnJCLE1BQU0sZ0JBRE45dEU7S0FFQTZoRDtPQUFVOzRCQUZWN2hELFFBRUosc0JBRklBO0lBR0osV0FGSTh0RSxLQUNBanNCO0dBQ1E7WUFVUnV0QiwrQkFHSjMyQyxHQUFFa0o7SUFBTyxJQUFQOEQ7SUFBTztlQUFQQSxvQkFxQ2tDLGtCQXJDcENoTjtZQUFFZ047Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWtDc0M7U0FEaEJubkMsVUFqQ3RCbW5DO1NBaUNldmxDLFFBakNmdWxDO1NBa0NzQyx5Q0FEdkJ2bEM7U0FDWTtRQUE1Qjs7a0JBTURtdkUsaUNBeENBNTJDLFFBaUN3Qm42Qjs7UUFDdkIsT0FNRCt3RSx1Q0F4Q0E1MkMsUUFpQ3dCbjZCOztZQWpDdEJnQzs7Ozs7Ozs7U0E0QnNCO1VBRG9CSSxVQTNCMUMra0M7VUEyQmdDUTtVQTNCaEN3SSxRQTRCc0Isd0NBRFV4SSxPQUFVdmxDO1VBM0IxQytrQzs7O1FBOEJzQjtTQURvQjdrQyxVQTdCMUM2a0M7U0E2QmdDbUo7U0E3QmhDRyxRQThCc0Isd0NBRFVILE9BQVVodUM7U0E3QjFDNmtDOzs7WUFDSzJJLFdBREwzSTtRQUVGLGdCQUFJNnBDO2tCQUNFQyxNQUFNQztVQUFlLE9BQUUsV0FIN0IvMkMsT0FFSTYyQyxRQUNRRTtTQUE4QztTQUN4RCxPQVBFQyxvQkFNRUYsT0FGQ25oQyxVQUc2Qjs7WUFKbEN2dEM7Ozs7OztnQ0F5RUFPLE1BekVBcWtDO2tCQXlFQXJrQzs7O2dCQXpFQXFrQzs7OztZQTJFRixnQkFBSTZwQztzQkFDRUMsTUFBTUM7Y0FBZSxPQUFFLFdBNUU3Qi8yQyxPQTJFSTYyQyxRQUNRRTthQUE4QzthQUN4RCxPQWhGRUMsb0JBK0VFRixPQTVFSnB1RSxTQTZFNkI7d0JBN0U3QnNrQzs7ZUF5RUFya0M7O2VBekVBcWtDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7ZUF5RnVCcmxDLFVBaEJ2QmdCO1dBZ0JpQzs7cUJBakRuQ2l1RSxpQ0F4Q0E1MkMsR0F5RnlCcjRCLFNBekZ2QmU7O1dBeUZpQyxPQWpEbkNrdUUsdUNBeENBNTJDLEdBeUZ5QnI0QixTQXpGdkJlOzs7Ozs7OztHQXFDdUM7WUFHekNrdUUscUNBR0E1MkMsR0FBRXY0QixPQUFNeWhDO0lBQU8sSUFBYnZoQztJQUFhO2VBQWJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0F1QmE7VUFEWTlDLE9BdEJ6QjhDO1VBc0JvQjFCLE1BdEJwQjBCO1VBc0JlbkMsTUF0QmZtQztVQXVCYSx5Q0FERW5DO1VBQ2JGLEtBQUssd0NBRGFXO1VBdEJwQnFtQyxXQXdCMEIsd0NBRHhCaG5DLElBRHVCVDtVQXRCekI4Qzs7Ozs7Ozs7O2FBQ1FndUMsV0FEUmh1QztTQUVGLGdCQUFJa3ZFO21CQUNFQyxNQUFNQztXQUFlLE9BQUUsV0FIN0IvMkMsT0FFSTYyQyxRQUNRRTtVQUE4QztVQUN4RCxPQVBGRSwwQkFNTUgsT0FGSW5oQyxVQURGek0sS0FJc0M7O2FBQzVCMk0sYUFMaEJsdUM7U0FNRixnQkFBSWt2RTttQkFDRUMsTUFBTUM7V0FBZSxPQUFFLFdBUDdCLzJDLE9BTUk2MkMsUUFDUUU7VUFBOEM7VUFDeEQsT0FYRkUsMEJBVU1ILE9BRllqaEMsWUFMVjNNLEtBUXNDOztLQWFmO29DQW5FM0J5dEMsMkJBOENKMzJDLEdBQVFrSjs7S0FxQnVCLE9BbkUzQnl0QyxpQ0E4Q0ozMkMsR0FBUWtKOztHQXdCOEM7WUF0RWxEOHRDLG9CQUdKaDNDLEdBQUVrSjtJL0N6b0NQLHVCK0Nzb0NTeXRDLHlCQUdKMzJDLEdBQUVrSjs7WUF3Q0YrdEMsMEJBR0FqM0MsR0FBRXY0QixPQUFNeWhDO0kvQ3ByQ2IsdUIrQ2lyQ0swdEMsK0JBR0E1MkMsR0FBRXY0QixPQUFNeWhDOztZQTJOUmd1QyxlQU1BdkcsSUFBR3puQyxLQUFJaXVDLFNBQVE5d0UsS0FBSUUsTUFBSzBWLE1BQUt1bEQ7SUFBUyxVQUF2Qm43RDtlQUFJRTtVQUtPZ1UsSUFMUGhVO01BTVgsV0FOZ0IwVixrQkFLRTFCLEdBTDFCbzJEO01BT1EsSUFBSmxzRCxNQUFJLFdBUHFCKzhDLE9BQTdCbVA7TUFRQSxXQURJbHNELEtBN0tBMnlELFdBc0tKekcsSUFBR3puQyxLQUFJaXVDOztRQUFZNXdFLE1Bd0JuQjtLQXRCUSxXQUZnQjBWLDhCQUF4QjAwRDtLQUdRLElBQUp4bkUsSUFBSSxXQUhxQnE0RCxPQUE3Qm1QO0tBSUEsV0FESXhuRSxHQXpLQWl1RSxXQXNLSnpHLElBQUd6bkMsS0FBSWl1Qzs7YUFBUTl3RSxRQXNCZjtTQXRCZUEsUUFrQmY7UUFMOEIrdUMsSUFiZi91QztjQUFJRTtTQWE2QnM0QyxNQWI3QnQ0QztLQWNYLFdBZGdCMFYsTUFhTW01QixHQUFrQnlKLEtBYmhEOHhCO0tBZVEsSUFBSmpqQixNQUFJLFdBZnFCOFQsT0FBN0JtUDtLQWdCQSxXQURJampCLEtBckxBMHBCLFdBc0tKekcsSUFBR3puQyxLQUFJaXVDOztPQUFZNXdFLE1Bb0JuQjtJQVZRLFdBVmdCMFYsTUFhTW01QixlQWI5QnU3QjtJQVdRLElBQUpwakIsTUFBSSxXQVhxQmlVLE9BQTdCbVA7SUFZQSxXQURJcGpCLEtBakxBNnBCLFdBc0tKekcsSUFBR3puQyxLQUFJaXVDO0dBd0JtQztZQTlMdENDLFdBR0p6RyxJQUFHem5DLEtBQUlpdUM7SUFBVyxJQUFmbnFDO0lBQWU7ZUFBZkEsb0JBd0pIO1lBeEpHQTs7WUFDRW5vQyxPQURGbW9DO1FBLy9CRHVrQyxjQSsvQkZaLElBbmpDRUUsa0JBbWpDRkY7UUFHUSxJQUFKeHFELE1BN3dCSnlzRCxXQTB3QkFqQztRQUlBLFdBREl4cUQsS0FOQWl4RCxXQUdKekcsSUFDSzlyRSxNQURFc3lFOztRQU1QO1NBRFVyeUUsU0FMUGtvQztTQXhPY3lRO1NBWWYwNEI7b0JBQVVudEM7WUFDTixJQUVKbjlCLElBaERGMnBFLHlCQTZDWXhzQyxPQTROWjJuQzswQkF6TkU5a0U7c0JBeHlCQXlsRSxZQXF5QlV0b0MsT0E0TloybkM7c0JBM3pCQTZCLHVCQWttQkUzbUU7V0FBOEI7U0FaOUJBLElBOTBCQWdsRSxrQkFtakNGRjtrQkFyT0U5a0U7U0FEa0I7VUFHUm05QixRQTl4QlZzb0MsWUF5eEJlN3pCLFNBd09qQmt6QjtVQS9ORXpxRCxNQTFDRnN2RCx5QkFzQ1l4c0MsT0FtT1oybkM7bUJBL05FenFEO1VBR0Fpd0QsVUExQ0ZULG9CQTN2QkVwRSxZQTh4QlV0b0MsT0FtT1oybkM7O1VBNU5Fd0YsVUFueUJBNUUsV0E0eEJVdm9DLE9BbU9aMm5DLElBL05FenFEOzs7U0E1bEJGc3NELHVCQXNsQkUzbUU7UUE0T00sSUFBSnVhLE1BanhCSndzRCxXQTB3QkFqQztRQVFBLFdBREl2cUQsS0FWQWd4RCxXQUdKekcsSUFLVTdyRSxRQUxIcXlFOztZQW1CQzl3RSxNQW5CTDJtQzs7OztZQVdZO2FBRDBCaG9DO2FBQVpnRDthQUNkLFVBdElmeXVFLDBCQXFJNkJ6dUU7YUFDcEJUO2FBQUw4dEU7YUFDQWdDO3dCQUFLcnVDLGNBQVEybkM7Z0JBQUssT0F2V3RCeUUsZ0JBc1dJQyxNQUNLcnNDLE9BQVEybkM7ZUFBb0M7YUFDakQyRyxnQkFGSy92RSxLQURnQ3ZDO1lBSXpDLE9BK0lBa3lFO3FCQTdKQXZHLElBYUkyRyxVQWJHSCxTQW1CQzl3RSxRQVBKZ3hFLFFBcHhCSmxHOzs7O2FBd3hCQTtjQUQwRGxzRTtjQUFYdW9DO2NBQzNDK3BDO3lCQUFLdnVDLGNBQVEybkM7aUJBQUssT0EzV3RCeUUsaUJBMldTcHNDLE9BQVEybkM7Z0JBQW9DO2FBQ3JELE9BNElBdUc7c0JBN0pBdkc7c0JBaUJrQix3Q0FGNkJuakMsT0FBV3ZvQztzQkFmbkRreUU7c0JBbUJDOXdFOztzQkFISmt4RTtzQkF4eEJKcEc7O1lBNHhCQTthQUQwRGpzRTthQUFYOHdDO2FBQzNDd2hDO3dCQUFLeHVDLGNBQVEybkMsSUFBSyxPQS9XdEJ5RSxpQkErV1Nwc0MsT0FBUTJuQyxJQUFvQztZQUNyRCxPQXdJQXVHO3FCQTdKQXZHO3FCQXFCa0Isd0NBRjZCMzZCLE9BQVc5d0M7cUJBbkJuRGl5RTtxQkFtQkM5d0U7O3FCQUNKbXhFO3FCQTV4QkpyRzs7UUFneUJBO1NBRGFwc0UsU0F2QlZpb0M7U0F3QkMvd0IsZ0JBQUsrc0IsY0FBUTJuQyxJQUFLLE9Bblh0QnlFLGVBbVhTcHNDLE9BQVEybkMsSUFBOEI7UUFDL0MsT0FvSUF1RyxlQTdKQXZHLElBdUJhNXJFLFFBdkJOb3lFLFNBbUJDOXdFLFFBS0o0VixNQWh5QkprMUQ7O1FBb3lCQTtTQURrQmhzRSxTQTNCZjZuQztTQTJCVTFtQyxRQTNCVjBtQztTQTRCQ3lxQztvQkFBS3p1QyxjQUFRMm5DLElBQUssT0EvT3RCcUYsaUJBK09TaHRDLE9BQVEybkMsSUFBOEI7UUFDL0MsT0FnSUF1RztpQkE3SkF2RyxJQTJCa0J4ckUsUUEzQlhneUUsU0EyQk03d0UsVUFDVG14RSxRQXB5Qkp0Rzs7UUF1eUJRO1NBRGUvckUsU0E5QnBCNG5DO1NBOEJjem1DLE9BOUJkeW1DO1NBOEJTeG1DLFFBOUJUd21DO1NBOEJFdm1DLFFBOUJGdW1DO1NBenRCT2dtQztXQTVCVkY7YUFveEJtQyxtQ0FEOUJyc0U7U0FFRGl4RTtvQkFBSzF1QyxjQUFRMm5DO1lBQUssT0FobUJ0QnFELG9CQXpKVWhCLE1BeXZCRGhxQyxPQUFRMm5DO1dBQW1DO1FBQ1AsT0E0SDdDdUc7aUJBN0pBdkc7aUJBOEJ1QnZyRTtpQkE5QmhCK3hFO2lCQThCSzN3RTtpQkFBS0Q7aUJBRWJteEU7MEJBenZCVy9HO2tCQUFLLDBCQWZwQm9DLGtCQWVVQyxNQUFLckM7OztRQTR2QlA7U0FEaUJ0ckUsU0FsQ3RCMm5DO1NBa0NnQnRtQyxTQWxDaEJzbUM7U0FrQ1dybUMsUUFsQ1hxbUM7U0FrQ0lwbUMsVUFsQ0pvbUM7U0Fwc0JTMnFDO1dBakRaN0U7YUF3eEJtQyxtQ0FENUJsc0U7U0FFSGd4RTtvQkFBSzV1QyxjQUFRMm5DO1lBQUssT0FwbUJ0QnFELG9CQXBJWTJELFFBd3VCSDN1QyxPQUFRMm5DO1dBQW1DO1FBQ1AsT0F3SDdDdUc7aUJBN0pBdkc7aUJBa0N5QnRyRTtpQkFsQ2xCOHhFO2lCQWtDT3h3RTtpQkFBS0Q7aUJBRWZreEU7MEJBeHVCYWpIO2tCQUFLLDBCQXBDdEJvQyxrQkFvQ1k0RSxRQUFLaEg7OztRQTJ1QlQ7U0FEcUJwckUsU0F0QzFCeW5DO1NBc0NvQm5tQyxTQXRDcEJtbUM7U0FzQ2VsbUMsUUF0Q2ZrbUM7U0FzQ1FqbUMsVUF0Q1JpbUM7U0Fyc0JhNnFDO1dBaERoQi9FO2FBNHhCbUMsbUNBRHhCL3JFO1NBRVArd0U7b0JBQUs5dUMsY0FBUTJuQztZQUFLLE9BeG1CdEJxRCxvQkFySWdCNkQsUUE2dUJQN3VDLE9BQVEybkM7V0FBbUM7UUFDUCxPQW9IN0N1RztpQkE3SkF2RztpQkFzQzZCcHJFO2lCQXRDdEI0eEU7aUJBc0NXcndFO2lCQUFLRDtpQkFFbkJpeEU7MEJBN3VCaUJuSDtrQkFBSywwQkFuQzFCb0Msa0JBbUNnQjhFLFFBQUtsSDs7O1FBZ3ZCYjtTQURpQmxyRSxTQTFDdEJ1bkM7U0EwQ2dCaG1DLFNBMUNoQmdtQztTQTBDVy9sQyxRQTFDWCtsQztTQTBDSTlsQyxVQTFDSjhsQztTQW5zQlMrcUM7V0FsRFpqRjthQWd5Qm1DLG1DQUQ1QjVyRTtTQUVIOHdFO29CQUFLaHZDLGNBQVEybkM7WUFBSyxPQTVtQnRCcUQsb0JBbklZK0QsUUErdUJIL3VDLE9BQVEybkM7V0FBbUM7UUFDUCxPQWdIN0N1RztpQkE3SkF2RztpQkEwQ3lCbHJFO2lCQTFDbEIweEU7aUJBMENPbHdFO2lCQUFLRDtpQkFFZmd4RTswQkEvdUJhckg7a0JBQUs7MkJBckN0Qm9DLGtCQXFDWWdGLFFBQUtwSDs7O2VBbXNCZDNqQzs7O2VBOEMwQ3JuQyxVQTlDMUNxbkMsVUE4Q29DNEosU0E5Q3BDNUosVUE4QytCMWxDLFFBOUMvQjBsQztXQStDSCxPQThHQWtxQztvQkE3SkF2RztvQkE4QzZDaHJFO29CQTlDdEN3eEU7b0JBOEMyQjd2RTtvQkFBS3N2QztvQkEvYnZDdStCO29CQXRVQWxDOzs7ZUEwd0I0Q3J0RSxVQW5EekNvbkMsVUFtRG1DK0osU0FuRG5DL0osVUFtRDhCdGxDLFFBbkQ5QnNsQztXQW9ESCxPQXlHQWtxQztvQkE3SkF2RztvQkFtRDRDL3FFO29CQW5EckN1eEU7b0JBbUQwQnp2RTtvQkFBS3F2QztvQkF6Z0J0Q3k5QjtvQkFqUUF2Qjs7ZUF3d0JrQnZ0RSxVQWpEZnNuQyxVQWlEUzdsQyxTQWpEVDZsQyxVQWlESTVsQyxRQWpESjRsQztXQWtESCxPQTJHQWtxQztvQkE3SkF2RztvQkFpRGtCanJFO29CQWpEWHl4RTtvQkFpREEvdkU7b0JBQUtEO29CQXZpQlpndEU7b0JBak9BbEI7OztRQTZ3QkE7U0FEV3B0RSxVQXJEUm1uQztTQXFER3BsQyxRQXJESG9sQztTQXNEQ2lyQztnQ0FBU3RIO1lBQUs7YUF2T2hCOWtFLElBbDRCQWdsRSxrQkF5bUNXRjthQXRPWDU3Qzt1QkFEQWxwQjs7Ozs7b0JBNXFCRnFtRSxVQW1yQkksa0NBUEZybUU7WUFRSixPQWxMRXVwRSxlQTJLRXJnRCxHQXNPVzQ3QztXQUFpQjtRQUM5QixPQXNHQXVHO2lCQTdKQXZHLElBcURXOXFFLFNBckRKc3hFLFNBcUREdnZFLFVBQ0Zxd0UsUUE1ekJKcEY7O1lBc3dCR2hyRTtRQXVFQSxLQXBuQ0RpcEUsYUE2aUNGSCxLQXdFSyxPQXI2Qkx1QjtZQTYxQkdsbEM7OztRQTJFUztTQTNFVGxsQztTQTBFYTBqQyxRQTFFYndCO1NBMkVTLG9CL0M3ekNqQixPK0NtZFMybEMsV0EreEJKaEM7UUEyRUEsbUNBRGdCbmxDO1lBMUVid0I7OztnQ0E2RVd4bEMsTUE3RVh3bEM7UUEveEJDMmxDLFdBK3hCSmhDLElBNkVjbnBFO1lBN0VYd2xDOzs7WUFpRnlCL2tDLFVBakZ6QitrQyxVQWlGa0J2bEMsUUFqRmxCdWxDLFVBaUZTakUsVUFqRlRpRTtRQW5OSGdwQyxpQkFtRkFRLGlCQWlOWXp0QyxVQWpGWjRuQztRQW1GUSxJQUFKM25FLElBMzFCSm1vRSxhQXd3QkFSO1FBb0ZBO1NBQ00sNkNBRkYzbkUsR0FGaUJ2QixRQUdqQjB1Qzs7Ozs7YUFFV3YvQixjQUZYdS9CLFFBajdCSis3QixVQW03QmV0N0Q7O1FBRWYsV0FKSXUvQixPQXZGQWloQyxXQUdKekcsSUFpRjRCMW9FLFNBakZyQmt2RTs7WUF5RnVCaHZFLFVBekYzQjZrQyxVQXlGb0JybEMsVUF6RnBCcWxDLFVBeUZXN0QsWUF6Rlg2RDtRQW5OSGdwQyxpQkFtRkFRLGlCQXlOY3J0QyxZQXpGZHduQztRQTJGUSxJQUFKMzBELE1BbjJCSm0xRCxhQXd3QkFSOztTQTZHZ0M7VUFmaEI5NUIsUUFBTSxzQ0FIbEI3NkI7VUFJWW83QixRQUFPLHNDQUpuQnA3QjtVQWtCNEIseUNBcEJUclU7VUFvQkY7VUFBakIsMkNBZFl5dkM7VUFhSSw4Q0FuQkd6dkM7VUFtQm5CLHlDQWRZa3ZDO1VBRlBKO1VBQUxIOzs7Ozs7O1VBa0JXaVk7Z0JBMzhCZjJqQixVQTI4QmUzakI7VUFsQk45WDtVQUFMSDs7UUFvQko7b0JBcEJJQSxPQURBdDZCO2dCQTlGQW83RDtrQkFHSnpHO2tCQWlIb0Isd0NBckJYbDZCLE9BSHFCdHVDO2tCQXpGdkJndkU7O1FBeURQOztRQUVBOztRQTRFNEI7U0F2SXpCL3VFO1NBc0lhaWdDLGlCQXRJYjJFO1NBdUl5Qix5Q0FEWjNFO1NBQ0osb0IvQ3ozQ2pCLE8rQ21kU3NxQyxXQSt4QkpoQztRQXVJQTtZQXZJRzNqQzs7Ozs7YUF5STBDemtDLFVBekkxQ3lrQyxVQXlJK0JnTDtTQXg2QjlCMjZCLFdBK3hCSmhDO1NBL3hCSWdDLFdBK3hCSmhDO1NBMkljO1VBM0lYejRCLFNBMklXLHdDQUZvQkYsT0FBV3p2QztVQXpJMUN5a0M7OztZQTRJMEN2a0MsVUE1STFDdWtDLFVBNEkrQm9MO1FBMzZCOUJ1NkIsV0EreEJKaEM7UUEveEJJZ0MsV0EreEJKaEM7UUE4SWM7U0E5SVhyNEIsU0E4SVcsd0NBRm9CRixRQUFXM3ZDO1NBNUkxQ3VrQzs7O1lBOERJMkksV0E5REozSTtRQStESCxLQS9ET21xQyxTQW9FSDtRQUhRO1NBRElKLGVBaEVUSTtTQWdFQ04sU0FoRURNO1NBaUVDaHVFLElBQUksV0FESjB0RSxRQWhFUmxHO1FBa0VJLFdBREl4bkUsR0FwRUppdUUsV0FHSnpHLElBOERPaDdCLFVBRVNvaEM7O1lBbUREenVFLFlBbkhaMGtDOztTQW9IWTtVQURpRHBrQztVQUFac3ZFO1VBQTFCdHZDLGFBbkh2Qm9FO1VBb0hZLFVBL09meXBDLDBCQThPb0R5QjtVQUMzQ2hyQztVQUFMaXJDO1VBQ0E3VSxVQXJQSmtULGlCQW1QZWx1RTtTQXZSZjh0RSx1QkF1UjBCeHRDLGdCQUN0QnV2QyxRQUNBN1UsU0FySEpxTjtTQXVIUSxJQUFKeUgsTUEvM0JKakgsYUF3d0JBUixLQXdISTBILGtCQUpLbnJDLE9BRHVEdGtDO1NBTWhFLFdBRkl3dkUsS0ExSEFoQixXQUdKekcsSUF3SEkwSCxZQXhIR2xCOztRQTJISztTQUR3Qnp1RSxVQTFIakNza0M7U0EwSHVCM2tDLFdBMUh2QjJrQztTQTJIQ3VZLFVBM1BKaXhCLGlCQW1QZWx1RTtRQXZSZjh0RSx1QkE4UjBCL3RFLGFBQ3RCazlDLFNBM0hKb3JCO1FBNkhRLElBQUo3c0IsTUFyNEJKcXRCLGFBd3dCQVI7UUE4SEEsV0FESTdzQixLQWhJQXN6QixXQUdKekcsSUEwSG9Dam9FLFNBMUg3Qnl1RTs7WUErSG9CajNCLFVBL0h4QmxULFVBeElZeGtDLFVBd0lad2tDO2VBeElZeGtDOztlQXdRWG8zRCxRQWhJSitROztlQWdJSS9RLFFBNXBDRnFSLFdBNGhDRk47dUJBZ0lJL1EsUUFoSUorUTs7UUFpSUEsV0FESS9RLE9BbklBd1gsV0FHSnpHLElBK0gyQnp3QixTQS9IcEJpM0I7O1FBbUlDLElBRE9oM0IsVUFsSVpuVCxVQW1JQzNtQixNQXRyQ0Z3cUQsa0JBbWpDRkY7UUFvSUEsV0FESXRxRCxLQXRJQSt3RCxXQUdKekcsSUFrSWV4d0IsU0FsSVJnM0I7O1FBa0pLO1NBRlEvMkIsVUFoSmpCcFQ7U0FnSllya0MsTUFoSlpxa0M7U0FpSmtCeUwsU0FBTyxrQ0FEYjl2QyxLQUFLeTNDO1NBRVIsVUFySlJnM0IsV0FHSnpHLElBaUpxQmw0QixRQWpKZDArQjs7U0FvSkU7WUFERW1CO1FBQWEsT0FBYkE7Z0JBdEZYOzs7R0EyRkc7WUF3Q0hDLFdBQVc1SCxJQUFHNkgsSUFBRzNxQztRQUFpQnRtQyxnQkFBTDJoQzthQU0zQmxKLEVBQUVtM0MsU0FBUXBxQjtLQUNaLDZCQVBXNGpCO0tBT1gsSUFDTSxJQU5BOEgsU0FyTUZyQixXQW1NT3pHLElBQWtCem5DLEtBTXpCaXVDO1dBR1F1Qjs7Ozs7T0FHNkI7UUFEWjloRSxNQUZqQitoRTtRQUc2QixvQ0FaUHB4RTtRQVlPO1FBQWxCO1FBQVAsNkJBRGFxUDtPQUNiOztNQUZaLGtCQVZVNGhFLElBQUg3SCxJQVNDZ0k7O1NBUFI5dkUsSUFJUWtrRCxLQUpOc0Q7S0FBUTtXQUFSQSxNQVlDLGtCQWRVeGlCLElBRWJobEM7TUFDbUI7T0FEakIrdkU7T0FDRXp2RSxJQURGa25EO09BQUZ2RCxNQUNtQixXQURuQmprRCxHQUNJTTtPQURKTjtPQUFFd25EOztJQVllO0lBRXZCLE9BNVRNMm1CLG9CQWtURmgzQyxHQU4yQmtKOztZQWtCN0IydkMsT0FBT2xJLElBQUc2SCxJQUFHdHZDO0lBQ2YsT0FuQkVxdkMsV0FrQk81SCxJQUFHNkgsYUFDVXJ2RSxHQUFLLE9BQUxBLEVBQU0sR0FEYisvQjtHQUNrQjtZQUUvQjR2QyxXQUFXbkksSUFBR3puQztpQkFDcUIvL0IsR0FBSyxXQUFMQSxHQUFXO0lBQWhELE9BdEJFb3ZFLFdBcUJXNUgseUJBQ2EsU0FBSSxRQURkem5DO0dBQ3FDO1lBS25ENnZDLE9BQU9wSSxJQUFHem5DLEtBQU0sT0FUaEIydkMsT0FTT2xJLElBM1dQNEYsaUJBMldVcnRDLEtBQW9DO1lBQzlDOHZDLFdBQVdySSxJQUFHem5DLEtBQU0sT0FQcEI0dkMsV0FPV25JLElBQUd6bkMsS0FBdUI7WUFFckMrdkMsUUFBUWp3RSxHQUFFd3ZFLElBQUd0dkMsS0FBTSxPQVpuQjJ2QyxPQTdyQ0Vub0QsWUF5c0NNMW5CLElBQUV3dkUsSUFBR3R2QyxLQUE2QztZQUMxRGd3QyxPQUFPbHdFLEdBQUVrZ0M7SUFBTSxPQWJmMnZDLE9BN3JDRW5vRCxZQTBzQ0sxbkIsSUEvV1B1dEUsaUJBK1dTcnRDO0dBQTBEO1lBQ25FaXdDLFdBQVdud0UsR0FBRWtnQyxLQUFNLE9BWG5CNHZDLFdBaHNDRXBvRCxZQTJzQ1MxbkIsSUFBRWtnQyxLQUE2QztZQUUxRGt3QyxNQUFNbHdDLEtBQU0sT0FoQloydkMsT0ExbENFdnRFLE9Bd3ZCRmlyRSxpQkFrWE1ydEMsS0FBK0M7WUFDckRtd0MsVUFBVW53QyxLQUFNLE9BZGhCNHZDLFdBN2xDRXh0RSxPQTJtQ1E0OUIsS0FBbUM7WUFLN0Nvd0MsY0FHRTNJLElBQUc0SSxRQUFPMXdFO0lBOWJabXRFLDZCQThiRXJGO0lBRVEsSUFBTnBwRSxNQXIvQko0cEUsYUFtL0JFUjtJQUdGLElBQ00sNkNBRkZwcEUsS0FGQ2d5RSxTQUdEcndDOzs7O1NBRVd0eUIsY0FGWHN5QixNQTNrQ0pncEMsVUE2a0NldDdEOztJQUNmLGtCQU5ZL04sR0FHUnFnQztHQUdFO1lBR05zd0MsY0FHRXh3RSxHQUFFdXdFLFFBQU8xd0U7SUFBSyxPQWZoQnl3RSxjQW50Q0U1b0QsWUFrdUNBMW5CLElBQUV1d0UsUUFBTzF3RTtHQUFvRDtZQUcvRDR3RSxtQkFBbUJ6d0UsR0FBRWtnQztJQUN2QixhQUF3RC8vQixHQUFLLE9BQUxBLEVBQU07SUFBeEM7eUNBRERIO0tBQ0M7SUFBNkIsT0FQakR3d0UsY0FPWSxvQ0FEU3R3QztHQUN3QztZQUc3RHd3QyxVQUFVMXdFO0lBQ1osYUFBcUNHLEdBQUssT0FBTEEsRUFBTTtJQUE1QixpQ0FESEg7SUFDb0Isa0JBaEM5Qmt3RSxPQWdDSztHQUFxQzs7Ozs7UUF2b0N4QzV0RTtRQVlBeUI7UUFDQUM7UUFTQWdsRTtRQVZBamxFO1FBQ0FDO1FBaEhBMGpCO1FBV0FnRjtRQTBHQVU7UUF2TEEwNkM7UUFPQUM7UUFFQUM7O09BK3ZDRitIO09BQ0FDO09BR0FFO09BQ0FDO09BRUFDO09BQ0FDO09BakJBUjtPQVlBSTtPQVVBSztPQVlBRTtPQU1BQztPQUlBQzs7O0UvQ2gvQ0w7Ozs7Ozs7Ozs7OztJZ0RxQktDO1lBR0FDLG1CQUFtQmh1RSxNQUNqQm10QjtJQUFKOztLQUNJMWlCLE9BQVUscUJBRFYwaUI7SUFFSixpQ0FIcUJudEIsTUFFakJ5SztHQUMwQjs2QkFONUJzakUsVUFHQUM7OztFaER4Qkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0ltRHlHcUI7S0FBWjZJLDRCbkR6R1Q7YW1EMkdTanNFLE9BQVNtZixLQUFxQ2duQztLQUNoRCxHQURXaG5DO1VBQVNFLE1BQVRGLGlCQUFTRTs7VUFBVCttQyxTQUFTO1NBQ2hCenpEO0tBUEo7U0FNZ0R3ekQsZUFDNUN4ekQsd0NBUmdCc2IsTUFRaEJ0YixlQVJnQnNiO01BU3BCLEdBRldtNEM7dUNBRlQ2bEI7Ozs7Ozs7O1dBSUVyb0IsT0FBc0I7OztXQUF0QkE7TUFDSixjQUFrRCxlQUY5Q2p4RCxPQUNBaXhELE1BREFqeEQ7O0lBRWtFO2FBRXBFNDNCLE1BQU12TTs7S0FHUixJQURJam9CLE1BRklpb0IsaUJBR1IsT0FESWpvQjs7VUFDSnhCOztPQUNFLGlCQUpNeXBCLE1BR1J6cEI7T0FDRSxXQURGQTs7Ozs7O0lBRUk7YUFFRnEzQixNQUFNNU47S0FDUixJQUFJam9CLE1BRElpb0I7WUFDSmpvQixRQURJaW9CO2VBUE51TSxNQU9Ndk07aUNBTUksZUFOSkE7SUFPTDthQUVEbE4sS0FBS2tOO0tBQUksV0FBSkEsbUJBQW9CLG1DQUFwQkE7S0FBSSxXQUFKQTtJQUF1QzthQUU1QzhwQyxVQUFVOXBDLEdBQUVrdUQsTUFDZCxPQURjQSxRQUFGbHVELHlCQUN1QjthQUVqQ211RCxNQUFNbnVEO2NBQ0FvdUQ7TUFBWTs7cUJBRWQ7V0FJR0YsbUJBSE03OUUsbUJBQUhnSDtPQUFrQixvQkFBbEJBO1lBR00vRyxxQkFBSG9oQjtRQUNULFdBREd3OEQsTUFBTXg4RCxLQU5QMDhELFVBTVU5OUU7O09BUFYwdkI7cUJBSU8zdkI7O0tBSW9CO1NBRS9Ca2QsSUFWSXlTLGFBVUp6Uzs7VUFDSmhYOztPQURJZ1gsTUFDSmhYLEtBVlE2M0UsMkJBU0o3Z0UsR0FDSmhYO09BQ0UsV0FERkE7Ozs7OztJQUVJO2FBc0JGdTNCLE9BQU85TjtLQUNULElBQUkyb0MsUUFESzNvQyxNQUVMaXBDLFFBREFOLGtCQUVBRSxRQURBSTtLQXJDRmtsQixNQW1DT251RDs7YUFHTDZvQztxQkFEQUksb0JBRktqcEM7O01BTUssSUFBUjRvQyxRQUFRLGVBSFZDO01BSEs3b0MsT0FNSDRvQztNQUpOO09BTVV5bEI7O1VBQWdCLFlBQ1g7Y0FDUWgrRSxpQkFBTnM2QixpQkFBTnVqRDtVQUZERyxjQUVhaCtFO1VBRUosSUFBUDA0RCxPQWxEVmUsVUFzQ085cEMsR0FVRWt1RDtVQUpMdGxCLFVBTU1HO2VBRkRtbEIsTUFBTXZqRCx1QkFKWGkrQixPQU1NRztVQUNKO1NBQThDO09BWHRELE9BQUlFO09BWUY7Ozs7UUFOUW9sQiwrQkFQTjFsQixPQWFGcHlEO1FBQ0UsV0FERkE7Ozs7Ozs7Ozs7SUFHQzthQUVEaXdCLElBQUl4RyxHQUFFZzNCLEtBQUl2MUM7S0FDWjtNQUFJeXNFLE9BQU8saUJBRExsdUQsTUFBRWczQjtNQUVKemdELElBM0RGdXpELFVBeURJOXBDLEdBQ0ZrdUQ7TUFFQUksWUFBWSxpQkFIUnQzQixLQUFJdjFDO01BSVJzb0QsYUFIQW1rQixNQUVBSSw0QkFIRXR1RCxNQUVGenBCO0tBR0osaUJBTE15cEIsTUFFRnpwQixZQUVBd3pEO0tBSkUvcEM7O21CQW5CSjhOLE9BbUJJOU47SUFPNkM7YUFFakRzSCxPQUFPdEgsR0FBRWczQjtLQUNBLElBQVBrM0IsT0FBTyxpQkFERmx1RCxNQUFFZzNCO2NBRUh1M0I7TUFBZ0I7O3FCQUNYO1dBV0pDLGlCQVZPcHFFLG1CQUFIL007VUFIVDYyRSxTQWFLTTtlQVRTLGlCQURMbjNFLEdBSkYyL0M7O1dBQUZoM0IscUJBTThCLE9BRnZCNWI7O1dBR0UsV0FPVG9xRSxJQVZJbjNFLEdBRkxrM0UsY0FFUW5xRTttQkFKUDRiLG1DQUlPNWI7O1dBVUZta0QscUJBQUY3MkM7T0FBVyxXQUFkODhELElBQUc5OEQsS0FaSjY4RCxjQVlNaG1COztLQUF3QztLQUM5QztNQUFKaHlELElBakZGdXpELFVBa0VPOXBDLEdBQ0xrdUQ7TUFlVSxPQWROSywrQkFGQ3Z1RCxNQWVMenBCO0tBQ0osaUJBaEJTeXBCLE1BZUx6cEI7S0FDSjtJQUFzQzthQTBCcEMwUCxLQUFLK1osR0FBRWczQjtLQUNUO01BckJtQmszQixPQXFCUixpQkFESmx1RCxNQUFFZzNCO01BR2tCLE9BL0d6QjhTLFVBNEdLOXBDLEdBcEJZa3VEOytCQW9CWmx1RDs7a0JBbEJIO1VBQ0d3dUQsZUFBT24rRSxpQkFBSGdIO1NBSFE2MkUsU0FHWk0sUUFjTWwrRTthQWJHLGlCQURMK0csR0FpQkYyL0M7O1NBZFcsNkJBSFQzL0M7dUJBUUlrVyxjQUFLLE9BQUxBO3FCQVJEbGQ7Ozs7Ozs7SUFvQitCO2FBc0IzQ3NmLFNBQVNxUSxHQUFFZzNCO0tBQ2I7TUFyQnVCazNCLE9BcUJaLGlCQURBbHVELE1BQUVnM0I7TUFHa0IsT0F4STdCOFMsVUFxSVM5cEMsR0FwQllrdUQ7K0JBb0JabHVEOztrQkFsQlA7VUFDR3d1RCxlQUFPbitFLGlCQUFIZ0g7U0FIWTYyRSxTQUdoQk07Y0FDUyxpQkFETG4zRSxHQWlCRTIvQzs7VUFkTyxJQUtWenBDLElBTFUsaUJBSFRsVzthQVFEa1csR0FBZSxPQUFmQTtzQkFSSWxkOzs7Ozs7VUFjREM7O0lBTW9DO2FBRS9Dc2YsU0FBU29RLEdBQUVnM0I7S0FDRixJQUFQazNCLE9BQU8saUJBREFsdUQsTUFBRWczQjtjQUVMdVQ7TUFBaUI7O3FCQUNkO1dBQ0ppa0IsaUJBQU9uK0UsbUJBQUhnSDtVQUhQNjJFLFNBR0dNLFFBV01sK0U7Y0FWRyxpQkFETCtHLEdBSkUyL0M7O1VBTWMsNkJBRmhCMy9DO3dCQUtJa1csY0FBSyxXQUFMQSxHQVBQZzlDLGVBRU1sNkQ7Ozs7Ozs7O0tBWVM7S0FDQSxXQTNKckJ5NUQsVUEwSVM5cEMsR0FDUGt1RDtLQWdCVyxPQWZQM2pCLGdDQUZHdnFDO0lBaUI2QjthQUd0Q3dxQyxRQUFReHFDLEdBQUVnM0IsS0FBSXYxQztLQUNoQjtNQUFJeXNFLE9BQU8saUJBRERsdUQsTUFBRWczQjtNQVdSemdELElBektGdXpELFVBOEpROXBDLEdBQ05rdUQ7TUFXQTUzRSxxQkFaTTBwQixNQVdOenBCO0tBRUo7a0JBRElEO01BVnFCO21CQUNaO1dBQ0prNEUsZUFBT3BxRSxpQkFBSC9NO1VBSFQ2MkUsU0FHS00sUUFLSWptQjtVQUpLLGlCQURMbHhELEdBSkQyL0Msa0JBSUk1eUM7T0FGaEIsNEJBRWEvTSxHQUpEMi9DLEtBQUl2MUM7T0FjZDs7Ozs7O01BRWdCLElBQVo2c0UsWUFBWSxpQkFoQk50M0IsS0FBSXYxQztNQWlCZCxpQkFqQlF1ZSxNQVdOenBCLGdCQVZBMjNFLE1BZUVJLFdBSkZoNEU7TUFaTTBwQjs7b0JBeEhSOE4sT0F3SFE5Tjs7SUFtQjJDO2FBRW5EaFIsSUFBSWdSLEdBQUVnM0I7S0FDUjtNQUFJazNCLE9BQU8saUJBRExsdUQsTUFBRWczQjtNQVdjLE9BOUxwQjhTLFVBbUxJOXBDLEdBQ0ZrdUQ7K0JBREVsdUQ7S0FFa0I7a0JBRXBCO1VBQ0d3dUQsZUFBT24rRSxpQkFBSGdIO1NBQUptM0UsT0FKSE4sVUFTWTU5RTtXQUpBLGlCQURMK0csR0FMSDIvQyxNQU9PO2tCQUZEM21EOztJQU15QjthQUVyQzRSLE9BQU8rZCxHQUFJLE9BQUpBLEtBQVU7YUFFYm9wQztTQUFjM3ZEOztvQkFDVCxPQURTQTtNQUVFO09BQVRwSjtPQUFTLFNBRkZvSjs7aUJBRVBwSjs7O2FBRVhnNUQsTUFBTXJwQztLQUNSLFdBRFFBO21CQUVlTyxHQUFFdnFCO01BQWUsV0FObENvekQsaUJBTW1CcHpEO01BQWUsa0NBQWpCdXFCO0tBQW9DO0tBQXpEO01BREUrb0MsTUFDRjtNQUNFQyxRQUFRLGVBRlJEO01BR0osT0FKUXRwQzttQkFLRGhxQjtNQUNNLElBQUpNLElBVkg4eUQsaUJBU0NwekQ7TUFGSHV6RCxVQUdLanpELHNCQUhMaXpELE9BR0tqekQ7TUFDSjtLQUEwQjtLQUgvQjtLQUtBLFdBVFEwcEIsdUJBQ0pzcEMsS0FFQUM7SUFTd0I7YUFFdEJrbEI7U0FBb0JoMUU7O29CQUNmLE9BRGVBO1VBRWJwSixtQkFBSGdIO01BQWMsb0JBQWRBO29CQUZnQm9DLDJDQUVicEo7OztVQUVBQzs7O2FBRVhvK0UsWUFBWTF1RDtLQUNkLElBQUlXLGVBQ0osTUFGY1g7bUJBSUxPLEdBQUV2cUI7TUFBZSxXQVZwQnk0RSx1QkFVS3o0RTtNQUFlLGtDQUFqQnVxQjtLQUEwQztLQURqRDtNQURFK29DLE1BQ0Y7TUFHRUMsUUFBUSxlQUpSRDtNQUtKLE9BUGN0cEM7bUJBUVBocUI7TUFDTSxJQUFKTSxJQWZIbTRFLHVCQWNDejRFO01BUEgycUIsb0JBUUtycUI7TUFITGl6RCxVQUdLanpELHNCQUhMaXpELE9BR0tqekQ7TUFFSjtLQUEwQjtLQUovQjtLQU1BLFdBWklxcUIsU0FEVVgsaUJBRVZzcEMsS0FJQUM7SUFVd0I7YUFFMUJ2L0IsUUFBUWpKLEtBQUl4cUI7O01BQ0wsSUFBUTRCLGNBQUZxekI7TUFBUSxPQXBMckJoRixJQW1MUXpGLEtBQ0t5SyxHQUFFcnpCO0tBQWtCO0tBQW5DLHNDQURjNUI7SUFDdUI7YUFFbkNrMEQsWUFBWTFwQyxLQUFJeHFCOztNQUNULElBQVE0QixjQUFGcXpCO01BQVEsT0FsRnJCZy9CLFFBaUZZenBDLEtBQ0N5SyxHQUFFcnpCO0tBQXNCO0tBQXZDLHNDQURrQjVCO0lBQ3VCO2FBRXZDK2IsT0FBTy9iO0tBQ0MsSUFBTndxQixNQTFRRi9lO0tBc1FBeW9ELFlBSUUxcEMsS0FES3hxQjtLQUVULE9BREl3cUI7SUFFRDtJQXJTTDtZQXlCSS9lO1lBS0F1cUI7WUFPQXFCO1lBU0E5YTtZQTJEQTBUO1lBU0FjO1lBMENBcmhCO1lBeUJBMEo7WUFLQUM7WUFvQkE0NkM7WUFxQkF4N0M7WUFhQS9NO1lBTUFvbkQ7WUFzQ0FyL0I7WUFHQXlnQztZQUdBbjRDO1lBL09BNjdEO1lBdU5BTzs7WUE4Q0Yxc0UsY0FBd0Isd0NBQWU7WUFFdkNLLFFBQVNzQixHQUEyQixPQUFRLDhCQUFuQ0EsTUFBdUQ7WUFDaEVwQixRQUFTb0IsR0FBYzZuQixHQUFlLHFDQUE3QjduQixNQUFjNm5CLEdBQThDO1lBQ3JFL29CLFVBQVdrQixHQUFzQixxQ0FBdEJBLE1BQTBDO1lBRXJENm1FLFNBQVU3bUUsR0FBMkIsT0FBUSw4QkFBbkNBLEdBQXNEO1lBQ2hFZ3JFLFNBQVVockUsR0FBYzRKLEdBQWUsc0NBQTdCNUosR0FBYzRKLEdBQTZDO1lBR3JFc0YsS0FBS21rQyxLQUFJcnNCO0lBQ0QsSUFBTmlrRCxNQVhGNXNFO0lBT0Eyc0UsU0FJRUMsS0FET2prRDtJQVBUcG9CLFFBUUVxc0UsS0FERzUzQjtJQUdQLE9BRkk0M0I7R0FHRDtZQUVEQyxNQUFNRCxLQUFJNTNCO0lBQ04sWUFmSjMwQyxRQWNNdXNFO2dCQUVFO1FBQ0hwakQ7aUJBSEt3ckIsTUFWVnd6QixTQVVNb0U7R0FJUTs7YUFNVnZyQixTQUFPNzNCLEdBQUVqZTtLQUNILElBQUpsVyxJQTNCTjJLO0tBT0Eyc0UsU0FvQk10M0UsR0FET2tXO0tBdkJiaEwsUUF3Qk1sTCxHQURLbTBCO0tBR1QsT0FGSW4wQjtJQUdIO1FBQ0NxekQ7YUFDQWh1RCxNQUFNckYsR0FBRW0wQjtLQUdKLFlBakNSbnBCLFFBOEJVaEw7aUJBSUU7U0FDSDg0QjtLQUNBLHdCQU5HM0UsR0FLSDJFO0lBQzZEO2FBRWxFMitDLGFBQWF6M0UsR0FBRW0wQixHQUFFamU7S0FoQ2EsK0JBZ0NqQmxXO0tBckNqQmtMLFFBcUNpQmxMLEdBQUVtMEI7S0FFakIsT0FuQ0ZtakQsU0FpQ2lCdDNFLEdBQUlrVztJQUdQO0lBcEJROztjQUdsQjgxQztjQUtBcUg7Y0FDQWh1RDtjQTFCSjh0RTtjQWtDSXNFO2NBcENKcnNFOzs7UUErQ00vRjthQUNBZ3VELFlBQWE5RSxNQUFZanhELEdBQUksd0JBQUpBLEdBQVk7O2dDQURyQytILE9BQ0FndUQ7S0F6YVZuK0I7S0FDQXFCO0tBQ0E5YTtLQUNBMFQ7S0FDQWM7S0FDQXJoQjtLQUNBMEo7S0FDQUM7S0FDQTQ2QztLQUNBeDdDO0tBQ0EvTTtLQUNBb25EO0tBQ0FyL0I7S0FDQXlnQztLQUVBMGpCO0tBQ0FPOzthQTJaTTFzRSxPQUFPc3dCLElBQUssNEJBQUxBLElBQTRCO2FBQ25DaGdCLE9BQU8vYjtLQUNDLElBQU53cUIsTUFGRi9lO0tBR0YsV0FqYUp5b0QsYUFnYVExcEMsS0FES3hxQjtLQUVULE9BREl3cUI7SUFFRDtJQVZQO1lBTU0vZTtZQTNhTnVxQjtZQUNBcUI7WUFDQTlhO1lBQ0EwVDtZQUNBYztZQUNBcmhCO1lBQ0EwSjtZQUNBQztZQUNBNDZDO1lBQ0F4N0M7WUFDQS9NO1lBQ0FvbkQ7WUFDQXIvQjtZQUNBeWdDO1lBK1pNbjRDO1lBN1pONjdEO1lBQ0FPOztZQXNhTW45QyxjQUFVLGNBQU07WUFDaEIvSyxJQUFJeHdCLEdBQUV3MUIsR0FBRWplO0lBQUksVUFBUnZYO2VBeERONmMsS0F3RFEyWSxHQUFFamU7O0dBQTBCO1lBRWxDd2hFLFNBQVN2akQsR0FBRW52QjtJQUNQLFlBbkVOZ0csUUFrRWFoRztrQkFFTjFILHVCQUZJNjJCLEdBRWE7SUFDakI7R0FBSztZQUVWbEUsT0FBT3R4QixHQUFFdzFCO0lBQ1gsSUFBYTFkLE1BREo5WCxNQUNJTSxTQUFFeU87SUFDYjtVQURXek8sR0FFSDtTQUVOMHBCLElBSlMxcEIsTUFHSnFOLElBSElyTjtLQUdHLEdBVGR5NEUsU0FLU3ZqRCxHQUtQeEwsSUFMS2hxQixPQUk0Qiw0QkFIdEIrTyxLQUdOcEI7S0FDWSxJQUpScXJFLFlBQUVocUUsWUFJWGdiLEdBSldqYixNQUFGek8sU0FBRXlPOztHQU1MO1lBRVJrQixLQUFLalEsR0FBRXcxQjtJQUNULFVBRE94MUI7SUFDYSxrQm5EN2QzQixPbUQ4Y1MrNEUsU0FjT3ZqRDtJQUNIO2dCQUVJO1FBREhudkI7SUFBSyxPQTlFWm11RSxTQThFT251RTtHQUNPO1lBRVo0RixPQUFPak0sR0FBSSxrQ0FBSkEsTUFBa0I7WUFDekJ1MkIsTUFBTXYyQixzQkFBVztZQVNuQnF0RCxnQkFBNkIsd0NBQWU7WUFFNUM0ckIsU0FBVXRyRSxHQUFpQyxPQUFRLDhCQUF6Q0EsTUFBNkQ7WUFDdkV1ckUsU0FBVXZyRSxHQUFtQjZuQixHQUMvQixxQ0FEWTduQixNQUFtQjZuQixHQUNBO1lBRzdCMmpELFNBQVV4ckUsR0FBaUMsT0FBUSw4QkFBekNBLE1BQTZEO1lBQ3ZFeXJFLFNBQVV6ckUsR0FBbUI2bkIsR0FDL0IscUNBRFk3bkIsTUFBbUI2bkIsR0FDQTtZQUc3QjZqRCxXQUFVMXJFLEdBQWdDLE9BQVEsOEJBQXhDQSxHQUEyRDtZQUNyRTJyRSxXQUFVM3JFLEdBQW1CNEosR0FDL0Isc0NBRFk1SixHQUFtQjRKLEdBQ0Q7WUFHNUJnaUUsT0FBS0MsTUFBS0MsTUFBSzlrRDtJQUNQLElBQU5pa0QsTUFsQkZ2ckI7SUFhQWlzQixXQUtFVixLQURhamtEO0lBZGZ1a0QsU0FlRU4sS0FER1k7SUFUTEosU0FVRVIsS0FEUWE7SUFNWixPQUxJYjtHQUtEO1lBRURjLFFBQU1kLEtBQUlZLE1BQUtDO0lBQ1gsWUF4QkpSLFNBdUJNTDtnQkFFRTtRQUNIcGpEO2FBSEtna0QsTUFTQTtJQUxJLGNBdEJkTCxTQWtCTVA7a0JBS007UUFDSHorQzttQkFOTXMvQyxPQWJmSixXQWFNVDtHQVNROzthQVFWNXNFLGNBQWV1TDtLQUNULElBREsyOEMsZUFBSEYsZUFDTjN5RCxJQTNDTmdzRDtLQWFBaXNCLFdBOEJNajRFLEdBRGFrVztLQXZDbkIyaEUsU0F3Q003M0UsR0FETTJ5RDtLQWxDWm9sQixTQW1DTS8zRSxHQURTNnlEO0tBR0UsT0FGWDd5RDs7YUFJRnF6RCxZQUFZOUU7S0FDVztNQURGc0U7TUFBSEY7TUFDSyx3QkFEWHBFLE1BQVNzRTtLQUN2Qix5QkFEY3RFLE1BQU1vRTs7YUFFbEJ0dEQsTUFBTXJGO0tBQ0Y7TUFEUTZ5RDtNQUFIRjtNQUNMLFFBaERSaWxCLFNBK0NVNTNFO01BQ1UsVUEzQ3BCODNFLFNBMENVOTNFOztVQUdTczRFLG1CQUFWQztNQUNtQixHQUFuQixrQkFKSTVsQixJQUdKNGxCLFNBQ21CLGtCQUpaMWxCLElBR0d5bEIsT0FFUjtNQUF3Qjs7S0FIVDs7YUFLdEJiLGFBQWF6M0UsVUFBVWtXO1NBQUoyOEMsZUFBSEY7S0F6Q21CLCtCQXlDdEIzeUQ7S0FyRGpCNjNFLFNBcURpQjczRSxHQUFHMnlEO0tBaERwQm9sQixTQWdEaUIvM0UsR0FBTTZ5RDtLQUVOLE9BN0NqQm9sQixXQTJDaUJqNEUsR0FBVWtXOzthQUl2QjlLLFVBQVVwTDtLQXZEeUIsd0NBdUR6QkE7S0FBSSxhQWxEcUIsOEJBa0R6QkE7SUFBZ0M7SUFyQnhCOztjQUdsQjJLO2NBS0Ewb0Q7Y0FFQWh1RDtjQXJDSjJ5RTtjQTRDSVA7Y0FJQXJzRTs7O1FBY0kvRjthQUNBZ3VELFlBQWE5RSxNQUFZanhELEdBQUkseUJBQUpBLEdBQWE7SUFIM0MsSUFIS2s3RSxpQkFHTCxVQUVLbnpFLE9BQ0FndUQ7YUFMQW9sQixjQUFhbHFCLE1BQVlqeEQsR0FBSSx5QkFBSkEsR0FBYTs7Z0NBRHRDazdFLFNBQ0FDO0tBNWhCWnZqRDtLQUNBcUI7S0FDQTlhO0tBQ0EwVDtLQUNBYztLQUNBcmhCO0tBQ0EwSjtLQUNBQztLQUNBNDZDO0tBQ0F4N0M7S0FDQS9NO0tBQ0FvbkQ7S0FDQXIvQjtLQUNBeWdDO0tBRUEwakI7S0FDQU87O2FBbWhCTTFzRSxPQUFPc3dCLElBQUssNEJBQUxBLElBQTRCO2FBQ25DaGdCLE9BQU8vYjtLQUNDLElBQU53cUIsTUFGRi9lO0tBR0YsV0F6aEJKeW9ELGFBd2hCUTFwQyxLQURLeHFCO0tBRVQsT0FESXdxQjtJQUVEO0lBaEJQO1lBWU0vZTtZQW5pQk51cUI7WUFDQXFCO1lBQ0E5YTtZQUNBMFQ7WUFDQWM7WUFDQXJoQjtZQUNBMEo7WUFDQUM7WUFDQTQ2QztZQUNBeDdDO1lBQ0EvTTtZQUNBb25EO1lBQ0FyL0I7WUFDQXlnQztZQXVoQk1uNEM7WUFyaEJONjdEO1lBQ0FPOztZQThoQk1xQixjQUFVLGNBQU07WUFDaEJDLE1BQUloNkUsR0FBRWcwRCxJQUFHRSxJQUFHMzhDO0lBQUksVUFBWnZYO2VBeEVOdTVFLE9Bd0VRdmxCLElBQUdFLElBQUczOEM7O0dBQThCO1lBRTFDMGlFLFVBQVVqbUIsSUFBR0UsSUFBRzd0RDtJQUNsQixJQUFNLFFBMUZONHlFLFNBeUZrQjV5RSxJQUNBLFVBckZsQjh5RSxTQW9Ga0I5eUU7O1NBRUYwVSxpQkFBVEM7ZUFGS2c1QyxNQUVJajVDLE9BRkRtNUMsSUFFaUM7O0lBQ3pDO0dBQUs7WUFFVmdtQixTQUFPbDZFLEdBQUVnMEQsSUFBR0U7SUFDZCxJQUFhcDhDLE1BREo5WCxNQUNJTSxTQUFFeU87SUFDYjtVQURXek8sR0FFSDtTQUVOMHBCLElBSlMxcEIsTUFHSnFOLElBSElyTjtLQUdHLEdBVGQyNUUsVUFLU2ptQixJQUFHRSxJQUtWbHFDO01BTEtocUIsT0FJaUMsNEJBSDNCK08sS0FHTnBCOzs7S0FDWSxJQUpScXJFLFlBQUVocUUsWUFJWGdiLEdBSldqYixNQUFGek8sU0FBRXlPOztHQU1MO1lBRVJvckUsT0FBS242RSxHQUFFZzBELElBQUdFO0lBQ1osVUFET2wwRDtJQUNhLGtCbkRybEIzQixPbURza0JTaTZFLFVBY09qbUIsSUFBR0U7SUFDTjtnQkFFSTtRQURIN3REO0lBQUssT0EvRlpnekUsV0ErRk9oekU7R0FDTztZQUVaK3pFLFNBQU9wNkUsR0FBSSxrQ0FBSkEsTUFBa0I7WUFDekJxNkUsUUFBTXI2RSxzQkFBVztZQVNuQjR0RCxTQUFPOXRELEdBQWdCLHFDQUFoQkEsR0FBK0I7WUFDdEN3NkUsU0FBUTlrRCxHQUFxQixxQ0FBckJBLEdBQW9DO1lBRTVDK2tELFVBQVM1c0UsR0FBYzdOLEdBQXFCLE9BQVEsOEJBQTNDNk4sR0FBYzdOLEdBQWlEO1lBQ3hFMDZFLFVBQVM3c0UsR0FBYzdOLEdBQVEwMUIsR0FDakMscUNBRFc3bkIsR0FBYzdOLEdBQVEwMUIsR0FDRjtZQUc3QmlsRCxXQUFVOXNFLEdBQTJCLE9BQVEsOEJBQW5DQSxHQUFzRDtZQUNoRStzRSxXQUFVL3NFLEdBQWM0SixHQUFlLHNDQUE3QjVKLEdBQWM0SixHQUE2QztZQUdyRW9qRSxPQUFLakcsTUFBSy8vQztJQUNaLElBQUlyMEIsSUFER28wRSxpQkFFSGtFLE1BZEZockIsU0FhRXR0RDtJQUpGbzZFLFdBS0U5QixLQUZRamtEO0lBR1osVUFGSXIwQixXQUVKOztTQUNBQzs7TUFaRWk2RSxVQVVFNUIsS0FFSnI0RSxvQkFKT20wRSxNQUlQbjBFO01BQXNCLFVBQXRCQTs7Ozs7SUFDQSxPQUhJcTRFO0dBR0Q7WUFFRGdDLFFBQU1oQyxLQUFJbEU7SUFDSixJQUFKcDBFLElBbkJGZzZFLFNBa0JNMUI7SUFFUjtRQURJdDRFLE1BRFFvMEU7TUFHcUI7S0FGekIsVUFBSnAwRSxXQUdGOzs7O09BQ1EsWUFyQlJpNkUsVUFnQk0zQixLQUlOcjRFO21CQUVZO1dBQ0hpMUI7aUNBUENrL0MsTUFJVm4wRTtRQUljO09BSmQ7Ozs7O0tBTUEsVUFyQkFrNkUsV0FXTTdCO0tBVU47Ozs7MkJBQ1c7OztHQUFJOzthQU1YNXNFLE9BQU93cEIsR0FBRWplO0tBQ0gsSUFBSmxXLElBckNOdXNELFNBb0NXcDRCO0tBM0JYa2xELFdBNEJNcjVFLEdBRE9rVztLQUVYLFVBRlNpZSxzQkFFVDs7VUFDQWoxQjs7T0FuQ0ZpNkUsVUFpQ01uNUUsR0FFSmQsb0JBSFNpMUIsR0FHVGoxQjtPQUNFLFVBREZBOzs7OztLQUdBLE9BTEljO0lBS0g7YUFDQ3F6RCxZQUFZOUUsTUFBS3A2QjtLQUNuQixJQUFJeEwsa0JBRGV3TCxzQkFDWDs7VUFDUmoxQjs7T0FDMEIsVUFGdEJ5cEIsTUFFc0IsdUJBSFB3TCxHQUVuQmoxQjtPQURJeXBCLFFBRUcsaUJBSE80bEM7T0FFZDs7Ozs7WUFESTVsQztJQUlGO2FBQ0F0akIsTUFLc0JyRixHQUFGbTBCO0tBSnRCLElBQUl6ekIsTUFJa0J5ekIsY0FIbEIzeUIsUUFsRE55M0UsU0FxRDBCajVFO1FBSnBCVSxRQUNBYyxPQUNnQjtLQVlsQixJQVZ3QnFjLE1BSnRCbmQsYUFJc0J4QjtLQUN0QjthQURzQkEsR0FDUjtNQUVOLFlBdERkZzZFLFVBbUQwQmw1RSxHQUFFZDtrQkFJVjtNQUVLLElBRFI2N0IsZUFDUSx1QkFOQzVHLEdBQUlqMUI7TUFNYiwyQkFEQTY3QixLQUdFO01BREEsSUFQVzU3Qjs7SUFVRDthQUV2QnM0RSxhQUFhejNFLEdBQUVtMEIsR0FBRWplO0tBeERhLCtCQXdEakJsVztLQUNmLFVBRGlCbTBCLHNCQUNqQjs7VUFDQWoxQjs7T0FoRUZpNkUsVUE4RGlCbjVFLEdBRWZkLG9CQUZpQmkxQixHQUVqQmoxQjtPQUNFLFVBREZBOzs7OztLQUdBLE9BOURGbTZFLFdBeURpQnI1RSxHQUFJa1c7SUFLUDthQUNWOUssVUFDWXBMO0tBQWQsSUFBZ0I2ZCxNQXhFbEJvN0QsU0F3RWdCajVFLFlBQUVkO0tBQ2Q7Z0JBRGNBOzs7O09BbkV1Qix3Q0FtRXpCYyxHQUFFZDtPQUNKLFlBRElDOzs7OztJQUVNO0lBMUNGOztjQUdsQndMO2NBT0Ewb0Q7Y0FNQWh1RDtjQXpDSit6RTtjQTBESTNCO2NBTUFyc0U7OztRQVVFL0Y7YUFDQWd1RCxZQUFhOUUsTUFBWWp4RCxHQUFJLHdCQUFKQSxHQUFZOztnQ0FEckMrSCxPQUNBZ3VEO0tBanFCVm4rQjtLQUNBcUI7S0FDQTlhO0tBQ0EwVDtLQUNBYztLQUNBcmhCO0tBQ0EwSjtLQUNBQztLQUNBNDZDO0tBQ0F4N0M7S0FDQS9NO0tBQ0FvbkQ7S0FDQXIvQjtLQUNBeWdDO0tBRUEwakI7S0FDQU87O2FBbXBCTTFzRSxPQUFPc3dCLElBQUssNEJBQUxBLElBQTRCO2FBQ25DaGdCLE9BQU8vYjtLQUNDLElBQU53cUIsTUFGRi9lO0tBR0YsV0F6cEJKeW9ELGFBd3BCUTFwQyxLQURLeHFCO0tBRVQsT0FESXdxQjtJQUVEO0lBVlA7WUFNTS9lO1lBbnFCTnVxQjtZQUNBcUI7WUFDQTlhO1lBQ0EwVDtZQUNBYztZQUNBcmhCO1lBQ0EwSjtZQUNBQztZQUNBNDZDO1lBQ0F4N0M7WUFDQS9NO1lBQ0FvbkQ7WUFDQXIvQjtZQUNBeWdDO1lBdXBCTW40QztZQXJwQk42N0Q7WUFDQU87O1lBOHBCTW1DLGNBQVUsY0FBTTtZQUNoQkMsTUFBSTk2RSxHQUFFdzFCLEdBQUVqZTtJQUFJLFVBQVJ2WDtlQXJGTjI2RSxPQXFGUW5sRCxHQUFFamU7O0dBQTBCO1lBRWxDd2pFLFlBQVV2bEQsR0FBRW52QjtJQUNkO1FBbkdBaTBFLFNBa0djajBFLE9BQUZtdkI7TUFFeUI7S0FDbkMsVUFIVUEsc0JBR1Y7Ozs7T0FDUSxZQXBHVitrRCxVQWdHY2wwRSxHQUdaOUY7O1lBRVM1QjtrQ0FMQzYyQixHQUdWajFCOzs7Ozs7c0JBR1M7Ozs7S0FFVDs7Ozs7MkJBQ1c7OztHQUFLO1lBRWhCeTZFLFNBQU9oN0UsR0FBRXcxQjtJQUNYLElBQWExZCxNQURKOVgsTUFDSU0sU0FBRXlPO0lBQ2I7VUFEV3pPLEdBRUg7U0FFTjBwQixJQUpTMXBCLE1BR0pxTixJQUhJck47S0FHRyxHQWZkeTZFLFlBV1N2bEQsR0FLUHhMO01BTEtocUIsT0FJNkIsNEJBSHZCK08sS0FHTnBCOzs7S0FDWSxJQUpScXJFLFlBQUVocUUsWUFJWGdiLEdBSldqYixNQUFGek8sU0FBRXlPOztHQU1MO1lBRVJrc0UsT0FBS2o3RSxHQUFFdzFCO0lBQ1QsVUFET3gxQjtJQUNhLGtCbkQzdEIzQixPbURzc0JTKzZFLFlBb0JPdmxEO0lBQ0g7Z0JBRUk7UUFESG52QjtJQUFLLE9BakhabzBFLFdBaUhPcDBFO0dBQ087WUFFWjYwRSxTQUFPbDdFLEdBQUksa0NBQUpBLE1BQWtCO1lBQ3pCbTdFLFFBQU1uN0Usc0JBQVc7Ozs7O1FBNVVuQjZjO1FBTUFnOEQ7OztZQWlERXQ5QyxRQUNBL0ssS0FPQWMsUUFTQXJoQixNQUtBaEUsUUFDQXNxQjs7UUEwQkZnakQ7UUFRQUc7OztZQStERUssUUFDQUMsT0FPQUUsVUFTQUMsUUFLQUMsVUFDQUM7O1FBcUJGTTtRQU9BQzs7O1lBNkVFQyxRQUNBQyxPQWFBRSxVQVNBQyxRQUtBQyxVQUNBQzs7O0VuRGh1QlQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SW9ENEZPQztJQUNBQztJQUNBQztJQUNBQztJQS9FWUM7SUFtSFpDO0lBQ0FDO0lBQ0FDO0lBQ0FDOztJQW1JQUM7SUFDQUM7SUFDQUM7SUFDQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQXhPRkMsaUJBQWlCQyxZQUFXYixrQkFBaUJqNkU7SUFDL0MsR0FTRyxrQkFWNENBLGVBVzFDLE9BWHlCaTZFO1FBQ2IvRiw0QkFEOEJsMEUsZUFLbEN0QixJQUpJdzFFO0lBQ2Y7WUFHV3gxRSxHQUhHLHFDQUYrQnNCO0tBR3JDLGNBSFM4NkUsWUFBNEI5NkUsTUFLbEN0QjtNQUZvQixJQUZoQitSLE1BSUovUixlQUpJK1I7OztLQUdWLElBQ1E5QixJQUFGalE7S0FDWDthQURXZ1MsS0FDRyxxQ0FOK0IxUSxTQUtoQzJPO01BRUwsY0FQU21zRSxZQUE0Qjk2RSxNQUtsQzBRO09BSmI7bUNBRCtDMVEsTUFLbEMwUSxjQUFFL0IsSUFBRitCOzs7O0dBT3lCO1lBTXBDcXFFLGdCQUFnQkQsWUFBV2Isa0JBQWlCajZFO0lBQzlDLEdBYUcsa0JBZDJDQSxlQWV6QyxPQWZ3Qmk2RTtRQUNSN0YsNEJBRHlCcDBFLGVBS3JDdEIsSUFKWTAxRTtJQUNuQjtZQUdPMTFFLEdBSE8scUNBRjhCc0I7S0FHcEMsY0FIUTg2RSxZQUE0Qjk2RSxNQUtyQ3RCO01BRndCLElBRlorUixNQUlaL1IsZUFKWStSOzs7U0FRQUMsTUFKWmhTO0tBQ1A7YUFHbUJnUyxZQVRRdXBFO01BT25CLGdCQVBRYSxZQUE0Qjk2RSxNQVN6QjBRO09BRGQsSUFIRXVqRSxNQUlZdmpFLG1CQUpadWpFOzs7VUFJWUM7TUFDbkI7Y0FEbUJBLEtBQ0wscUNBVjhCbDBFO09BV3BDLGdCQVhRODZFLFlBQTRCOTZFLE1BU3pCazBFO1FBR2QscUNBWnVDbDBFLFNBU3pCazBFO09BRVksSUFGWkM7Ozs7R0FPcUI7WUEwQnRDMkcsV0FBVzE5RSxHQUFFK0IsR0FBSSw4QkFBTi9CLEdBQUUrQixXQUFlO1lBQzVCNjdFLFlBQVl0OEU7SUFBSTtrQ0FBSkE7NEJBQTJCLGdCQUEzQkE7O0dBQXVDO1lBQ25EdThFLFlBQVl2OEU7SUFDZCxXQUZFczhFLFlBQ1l0OEU7SUFDZDs7bUNBRGNBOzs7O1NBRWEsbURBRmJBO0tBRWE7O29DQUZiQTs7OztVQUdhLG1EQUhiQTs7Ozs7O0lBR2E7R0FBMEI7WUFDbkR3OEUsYUFBYWw3RSxNQUFLbTdFO0lBQ3BCLHFDQURvQkEsTUFBTG43RTtHQUNtQjtZQUVoQ283RSxnQkFBaUIzOUQsUUFBT3lzQztJQUMxQjtLQUFJNXNDLDhCQURlRztLQUNrQjQ5RCw4QkFEWG54QjtPQUN0QjVzQyxRQUFpQys5RCxPQVFuQztJQU5RLElBQUozNUUsSUFBSSw4QkFIZ0J3b0QsVUFDV214QixRQUFqQy85RDtJQUdDLHlCQURDNWIsR0FIYStiOztjQUtWLDhCQUxpQnlzQyxhQUNXbXhCLFFBQWpDLzlEOztHQVFFO09BR0YscUNBNkpGZytEOzs7Ozs7R0E1SlEsU0E2SlJDLE1BblF1Qm4rRTtJQUVuQjtLQURKOEIsMEJBRHVCOUI7S0FFdkJ3QixJQUFJLDZCQURKTTtJQUVKLDhCQURJTjtJQUNKLFdBRklNLFdBRUo7O1NBQ0FDOztNQUNLLDBCQUxzQi9CLEdBSTNCK0I7T0FFTyw4QkFKSFAsR0FGWXc3RTs7T0FPVSwyQkFQQ2g5RSxHQUkzQitCO09BR08sOEJBTEhQOztNQUtHLFdBSFBPOzs7OztJQUtBLDhCQVBJUDtJQU9KLG9DQVBJQTs7WUFrUUE0OEUsY0E3SmN6dUQsS0FBS3J0QixPQUFPQyxRQUFRQyxRQUFPNmtEO0lBQzNDLEdBRG9DN2tEO1NBSUczQyxJQUpIMkM7S0FJVyxjQUpYQSxRQUFSRDs7O01BTTZCLFdBc0p2RDQ3RSxNQXhKcUN0K0UsV0FFVTs7Ozs7T0FOckIwQztLQUd1QjtNQUFadWhELE1BSFh2aEQ7TUFHdUIsT0F5SmpENDdFLE1BekpxQ3I2QjthQUFLOzs7SUFBMUM7T0FIbUJ4aEQ7S0FFOEI7TUFBWnloRCxNQUZsQnpoRDtNQUU4QixPQTBKakQ2N0UsTUExSnFDcDZCO2FBQUs7OztJQUExQzs7S0FEZ0IsbUNBMkpoQm82QixXQTVKY3h1RCxLQUEyQjAzQjtLQUMzQztJQUNFO0dBSStEO0dBQ3BELFNBQVhnM0I7SXBEOUhQLE9vRG9DS1osaUJBNERFQyxZQUhBYjs7R0FrQ1UsU0FBVnlCO0lwRC9IUCxPb0RzREtYLGdCQTBDRUQsWUFIQWI7O0dBRmtCOzs7T0FDbEJEO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FXO09BQ0FFO09BQ0FDO09BSUFDO09BR0FFO09BeUtBRTtPQUNBQztPQUNBQztPQXRKQUM7T0FDQUM7WUFRQUMsYUFBV3YrRSxHQUFFK0I7SUFBSSxJQUFJYyxJQUFJLGdCQUFkN0MsR0FBRStCLGtCQUFRYzs7Ozs7O0dBQTJDO1lBQ2hFMjdFLGNBQVlsOUU7SUFDZDtrQ0FEY0E7NEJBQ1UsZ0JBRFZBOzs7OzZCQUVhLGdCQUZiQTs7Ozs4QkFHYSxnQkFIYkE7Ozs7Ozs7R0FHMEI7WUFDdENtOUUsY0FBWW45RTtJQUNkLFVBTEVrOUUsY0FJWWw5RTtJQUNkOztrQ0FEY0E7Ozs7U0FFYSxtREFGYkE7S0FFYTs7bUNBRmJBOzs7O1VBR2EsbURBSGJBO01BR2E7O3FDQUhiQTs7OztXQUlhOzJDQUpiQTtPQUlhOztzQ0FKYkE7Ozs7WUFLYTs0Q0FMYkE7Ozs7Ozs7Ozs7OztJQUthO0dBQTJCO1lBQ3BEbzlFLGVBQWE5N0UsTUFBS203RTtJQUNyQjtpQ0FEcUJBLCtCQUFMbjdFOztLQUVQO01BQUo1QztRQUFJOztVQUZPNEM7OERBQUttN0U7O01BSU8sb0NBSlBBO1lBSXBCLGdEQUZJLzlFOzs7SUFFSjtHQUF1RDtZQUVyRDIrRSxrQkFBaUJ0K0QsUUFBT3lzQztJQUMxQjtLQUFJNXNDLDhCQURlRztLQUNrQjQ5RCw4QkFEWG54QjtPQUN0QjVzQyxRQUFpQys5RCxPQVFuQztJQU5RO0tBQUozNUUsSUFBSSw4QkFIZ0J3b0QsVUFDV214QixRQUFqQy85RDtLQUc0QixvQ0FKYkc7SUFJZCx1REFEQy9iOztjQUVHLDhCQUxpQndvRCxhQUNXbXhCLFFBQWpDLzlEOztHQVFFO09BSUYsbUNBREYwK0Q7Ozs7OztZQUVBQyxRQUFNNytFO0lBQ1I7S0FBSThCLDBCQURJOUI7S0FFSndCLElBQUksNkJBREpNO0lBRUosOEJBRElOO2FBa0JBczlFLE9BQU94OUU7S0FBSTtRQUFKQTtVQUFJK1E7O09BQW1CLDhCQWxCOUI3UTtPQWtCOEIsVUFBbkI2UTtVQUFKL1EsTUFBSStROzs7OztJQUErQzthQWhCdEQwc0UsZ0JBQUtoOUU7S0FDWCxJQURXQztLQUNYO1NBRFdBLFFBSFRGLEdBSVkscUNBSFpOO01BSUksSUFHSnFCLElBSEksZ0JBTkE3QyxHQUlLZ0M7Z0JBS1RhOztPQUZRO3NDQUdSbThFLGtCQU5TaDlFOztPQUdELE9BR1JnOUUsd0JBTlNoOUU7O2dCQUtUYTtPQUFRLDhCQVBSckIsR0FPQXFCO09BQVEsSUFMQzZkOzs7O01BSUQsZ0RBRVJzK0Qsa0JBTlNoOUU7O01BSUQsT0FFUmc5RSx3QkFOU2g5RTs7SUFLK0I7YUFDeENnOUUsaUJBQVExOUUsR0FBRVM7S0FDWixJQURVc1IsU0FBRXJSO0tBQ1o7U0FEWUEsUUFUVkYsR0FXQSw4QkFWQU4sUUFVQSxPQVFBczlFLE9BVlF6ckU7TUFLRiw0QkFmRnJULEdBVU1nQzs7T0FVVjg4RSxZQVZRenJFO09BTWtCLDhCQWQxQjdSO09BYzBCLFVBTmhCUTtPQU1nQixnREFadEIrOEU7O09BWXNCLE9BWnRCQTs7O09BYU0sSUFQQXIrRCxtQkFBRnBOLDhCQUFFdFI7OztNQVVWODhFLE9BVlF6ckU7TUFRRSxnREFkTjByRSxZQU1NLzhFOztNQVFBLE9BZE4rOEUsa0JBTU0vOEU7O0lBU1Q7YUFmRzRqRCxLQUFLN2pELEdwRDFLbEIsdUJvRDBLYWc5RSxVQUFLaDlFO0lBQUw2akQ7SUFrQlIsb0NBcEJJcGtEO0dBcUJhO1lBZ0NmeTlFLG1CQUFtQnAvRTtJQUNyQjs7TUFBRyw4QkFEa0JBO1dBQ1EsOEJBRFJBO0tBR2IsbUNBSGFBLFFBTW5CLE9BTm1CQTtLQUlaLGlDQUpZQTtLQUlaOztJQUZFLGlFQUZVQTtJQUVWO0dBSVI7WUFJRHEvRSxnQkFBY3Z2RCxLQUFLcnRCLE9BQU9DLFFBQVFDLFFBQU82a0Q7SUFDM0MsR0FEb0M3a0Q7U0FRRzNDLElBUkgyQztLQVNHLGNBVEhBLFFBQVJEOzs7TUFXcUI7YUFyQi9DMDhFLG1CQWtCcUNwL0U7YUFHRTs7Ozs7O09BWGIwQztLQU91QjtNQUFadWhELE1BUFh2aEQ7TUFPdUIsTUFqQmpEMDhFLG1CQWlCcUNuN0I7WUFBSzs7OztPQVB2QnhoRDtLQU04QjtNQUFaeWhELE1BTmxCemhEO01BTThCLE1BaEJqRDI4RSxtQkFnQnFDbDdCO1lBQUs7OztJQURiO3VDQXRFN0I4NkIsU0FpRXlDeDNCO0tBckIvQnJuRCxJQTBCQTtLQXpCUndCLElBQUksbURBREl4Qjs7aUJBR0w2QztLQUNIO2NBREdBOzs7Ozs7Ozs7Ozs7OztnQkFHQztvQ0FMSnJCO2VBS0ksOEJBTEpBLEdBRUdxQjtlQUtDLDhCQVBKckIsR0FFR3FCO0lBS29CO0lBTjNCLG1DQUZZN0M7SUFzQks7MkJBcEJqQiw2QkFESXdCO0tBcUJhLHNCQVhmeTlFLG1CQVVjdHZEO0lBQ0M7R0FZaEI7WUFPQ3d2RCxlQUFlbi9FO0lBQ2pCLGVBRkEsc0JBQ2lCQTs7S0FEaUIsNEJBQ2pCQTs7Ozs7S0FETzs7eUJBQW1CLGdCQUMxQkE7Ozs7SUFDZCxVQUVFLG1CQUhZQTtJQUVPOztxQ0FGUEE7SUFFWixXQUFDLDhCQUZXQTtHQUdMO1lBQ1ZvL0UsVUFBUXAvRTtJQUNWO0tBQW9CLFFBTGxCbS9FLGVBSVFuL0U7S0FDRXEvRTtLQUFQQztLQUNEQyxNQTNNSjVCLGdCQWlGRVksY0FIQXJCLG9CQTRIVW1DO0lBRVosOEJBRktDLE9BQ0RDO0dBQ087WUFDVEMsV0FBU3gvRTtJQUNYLElBQWFxL0UsT0FUWEYsZUFRU24vRTtJQUVYLE9Bak9BeTlFLGlCQW1HRWMsY0FIQXJCLG9CQWdJV21DO0dBQ29DO0dBbkk1Qjs7O09BQ25CcEM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQW1CO09BQ0FDO09BSUFDO09BTUFDO09BTUFDO09BWUFDO09BRUFDO09BaUVBSztPQTRCQU07T0FKQUo7R0FzQlcsU0FBWEs7SXBEclJQLE9vRG9DS2hDLGlCQW1HRWMsY0FtSUFqQjs7R0FZVSxTQUFWb0M7SXBEdFJQLE9vRHNESy9CLGdCQWlGRVksY0FtSUFqQjs7R0FGb0I7OztPQUNwQkQ7T0FDQUM7T0FDQUM7T0FDQUM7T0FySUFlO09BQ0FDO09BSUFDO09BTUFDO09BTUFDO09BMEhBVDtPQUNBQztPQUNBQztPQUNBcUI7T0FDQUM7Ozs7OztJQTdNSkM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFHQUM7SUFDQUM7WUF5TUVwd0UsT0FBT2t1RSxTQUFReHhCO0lBQ2pCLElBQUlockQsMEJBREt3OEU7SUFFRyxTQURSeDhFLE9Bck5KaStFLGFBb05TekIsU0FDTHg4RTtLQUdXLGlDQXpOZmcrRSxXQXFOaUJoekI7S0FJRiw4QkFKTnd4Qjs7SUFHSiw4QkFISUEsU0FBUXh4QjtHQUlnQjtZQUUvQjJ6QixZQUFZNzlFLE1BQUttN0U7SUFDbkIsT0F4TkFtQyxlQXVOY3Q5RSxNQUFLbTdFOzs7ZUFBTG43RTs7bUVBQUttN0U7Y0FHZDtHQUFrQztZQUVyQzJDLGNBQWM5OUU7SUFDaEIsSUFLbUI0aUIsNEJBTkg1aUIsZUFNRys5RTtJQUNqQjtLQUFZLFFBREtBLFFBck9uQlosYUErTmdCbjlFLE1BTUcrOUU7TUFFVCwwQkFSTS85RSxNQU1HKzlFO09BR1osSUFIWXI3RDs7O01BRVcsSUFQYjVFLE1BS0VpZ0UsWUFMRjUrRTtNQUNmO09BQVksUUFER0EsT0FoT2pCZytFLGFBK05nQm45RSxNQUNDYjtRQUVQLDBCQUhNYSxNQUNDYjtzQ0FERGEsUUFNRys5RTtRQUhXLElBRmIzK0U7OztPQUNvQjs7O0tBS0E7O0dBSUY7WUFFakM0K0UsVUFBVWgrRTtJQUNKLElBQUpkLElBZEY0K0UsY0FhVTk5RTtJQUVaLGFBRElkOztjQUNrQjs7ZUFGVmM7NkNBQ1JkOztHQUM0RDtZQUU5RCsrRSxlQUFlaitFO0lBQ1QsSUFBSmQsSUFsQkY0K0UsY0FpQmU5OUU7SUFFakIsYUFESWQ7Y0FDVTs7O2VBRkdjOzs2Q0FDYmQ7R0FFMkM7WUFFN0NnL0UsaUJBQWlCbCtFO0lBQ1gsSUFBSmQsSUF2QkY0K0UsY0FzQmlCOTlFO0lBRW5CLGFBRElkO2NBRGVjOzs7Ozs2Q0FDZmQ7R0FDOEQ7R0FNbEUsSUFERTJ4RCxXQUNGO1lBRUVzdEIsZUFBZUMsVUFBUy9nRSxRQUFPSTtJQUNqQztLQUFJNGdFLGVBQWUsaUNBSmpCeHRCO0tBS0V5dEIsTUFBTSxpQ0FETkQ7SUFFWSxPQTlDZDd3RTthQTJDZTR3RSxVQUdELGtDQUhVL2dFLFFBRXRCaWhFLEtBRjZCN2dFO0dBRzRCO3VCQUdMLE9BaFF4RCsvRCxnQkFnUXFFO0dBQS9COzRCcERsVnpDO0lvRGlWS2Usd0JBQ0Y7WUFFRUMsa0JBQWtCcGhGO0lBQUksd0NBSHRCbWhGLHVCQUdrQm5oRjtHQUEwQztZQUM1RHFoRjtJQUF1Qix3Q0FKdkJGO0dBSTJEO1lBRTNERyxVQUFZMzBELEtBQWlEMU0sUUFBT0k7SUFDdEUsR0FEY3NNO1NBQVdFLE1BQVhGLG1CQUFXRTs7U0FBWG0wRCxXQUFXLGlDQU52Qkc7UUFPZTNoRjtJQUNmO0tBQVcsSUFBUG9ELE9BYkptK0UsZUFXWUMsVUFBaUQvZ0UsUUFBT0k7S0FHcEU7TUFDRSx1QkFBVSxzQkFGUnpkO01BRUYsT0FGRUE7O1dBSUNtTTs7O2lCQUxVdlAsU0FNVyxrQ0FEckJxSTtNQUNrQyxJQU54QmsxQzs7OztHQU9KO1lBRVh3a0MsZUFBaUI1MEQsZUFFakIxTSxRQUFPSTtJQUNULEdBSG1Cc00sU0FBT0UsTUFBUEYsZUFBT0UsY0FBUG5xQjtJQUduQixZQUhpRDgrRSxnQkFBUkMsUUFBUUQsZ0JBQVJDO0lBR3pDO1NBRmVDLGdCQUFYVixXQUFXVTs7U0FBWFYsV0FBVyxpQ0FqQmJHO1FBbUJlM2hGO0lBQ2Y7S0FBVyxJQUFQb0QsT0F6QkptK0UsZUFzQkVDLFVBQ0YvZ0UsUUFBT0k7S0FHUDtNQUNFOzs7VUFGRXpkO1VBR0QsNENBUGNGLFNBQXNCKytFLE9BSW5DNytFO01BRUY7O1dBRUdtTTs7O2lCQUxVdlAsU0FNVyxrQ0FEckJxSTtNQUNrQyxJQU54QmsxQzs7OztHQU9KOzs7O09BalNiNmlDO09BQ0FDO09BQ0FDO09BcU5FMXZFO09Bbk5GNHZFO09BQ0FDO09BQ0FDO09BdU5FTztPQXRORk47T0F3T0VTO09BU0FFO09BTEFEO09BdE9GTjtPQUNBQztPQWZBYjtPQThRRTJCO09BVUFDO09BWkFGO09BREFEO09BalFGZjtPQUNBQzs7O0VwRHBGSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHMERDYTs7Ozs7SUE0R007SUFNWmlGO0lBRUFDO0lBNUJPLGtCQTBCUEQsU0FFQUM7SUE0Qko7R0FFUTtHQUVlLFNBQW5CQyxXRnJKUDtHRThJTzs7O09BT0FBOzs7O0lBUzBCO0lBb0NYO0lBbEJBO0lBaUNOOzs7OztFRmpOaEI7Ozs7Ozs7Ozs7OztHSW1CZTs7Ozs7O1lBbUNSQyxJQUFLQyxHQUFTQyxHQUFJLE9BQUpBLEtBQVRELFFBQVNDLEVBQTJCO1lBRXpDQyxJQUFLRixHQUFTQyxHQUFJLE9BQWJELEtBQVNDLElBQVRELElBQVNDLEVBQTJCO0dBbkJOO3lDQWlCbkNGLEtBRUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBTUFDO0lBSFU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BR1ZBOzs7Ozs7WUFNQUMsUUFBT0osR0FBV0MsR0FBWSxPQUF2QkQsTUFBV0MsVUFBMEI7R0FIcEM7Ozs7Ozs7O09BR1JHO0lBZEFDO0lBRUFDOzs4REFGQUQsT0FFQUM7OztFRnhEUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0dtRWtCOzs7Ozs7SUFBVEM7SUF2Q1UsYUF1Q1ZBO0lBa0NGQztJQUlBQzs7OztZQWlDRUMsY0gxSVQ7WUc0SVNDLElBQUlYLEdBQUVZLEdBQUksT0FBTlosS0F2Q05RLGtCQXVDMEQsV0FBbERJLEdBQUZaLEdBQXlEO1lBRTdEYSxLQUFLYixHQUFFWSxHQUFJLE9BQU5aLEtBekNQUSxrQkF5Q29ELFdBQTNDSSxHQUFGWixHQUFnRDtZQUVyRGMsS0FBS2QsR0FBSSxZQUFKQSxLQTNDUFEsZ0JBMkNxQztZQUVuQ08sS0FBS2YsR0FBRVk7SUFBVyxlQUFiWixLQTdDUFE7aUJBNkNnRCxXQUF2Q0ksR0FBRlo7R0FBNEM7WUFFakRnQixPQUFLaEIsR0FBRVksR0FBRUs7SUFBSSxPQUFSakIsS0EvQ1BRLFNBK0M0QyxXQUFuQ0ksUUFBNkMsV0FBM0NLLEdBQUpqQjtHQUFrRDtZQUV2RGtCLElBQUlsQixHQUFFWSxHQUFJLE9BQU5aLEtBakROUSxTQWlEeUMsV0FBakNJLFFBQUZaLEVBQThDO1lBRWxEbUIsT0FBT25CLEdBQ1QsS0FEU0EsR0EvQ2UsT0FKeEJRLFlBc0RPWSxNQUhFcEIsTUFHRyxPQUFMb0IsSUFBYTtZQUVsQkMsVUFBVXJCO0lBQUksYUFBNkJBLEdBQUssV0FBTEEsR0FBVztJQUFoQixPQVR0Q2dCLE9BU1VoQixtQkFBc0IsU0FBSTtHQUFtQjtHQXhCbEI7OztPQWhDdkNRO09BcUNFRTtPQUVBQztPQUVBRTtPQUVBQztPQUVBQztPQUVBQztPQUVBRTtPQUVBQztPQUtBRTtZQVFBQyxjSHJLVDtZR3VLU0MsTUFBSXZCLEdBQUVZO0lBQUksT0FBTlosTUE5RE5TLDRCQThEeUQsV0FBakRHLEdBQUZaO0dBQXdEO1lBRTVEd0IsT0FBS3hCLEdBQUVZO0lBQUksT0FBTlosTUFoRVBTLDRCQWdFbUQsV0FBMUNHLEdBQUZaO0dBQStDO1lBRXBEeUIsT0FBS3pCLEdBQUksT0FBSkEsTUFsRVBTLG9CQWtFeUI7WUFFdkJpQixPQUFLMUIsR0FBRVk7SUFBSSxVQUFOWixNQXBFUFM7aUJBb0VvQyxXQUEzQkcsR0FBRlo7R0FBZ0M7WUFFckMyQixPQUFLM0IsR0FBRVksR0FBRUs7SUFBSSxPQUFSakIsTUF0RVBTLGNBc0VzQyxXQUE3QkcsUUFBdUMsV0FBckNLLEdBQUpqQjtHQUE0QztZQUVqRDRCLE1BQUk1QixHQUFFWSxHQUFJLE9BQU5aLE1BeEVOUyxjQXdFbUMsV0FBM0JHLFFBQUZaLEVBQXdDO1lBRTVDNkIsU0FBTzdCO0lBQ1QsS0FEU0EsR0ExRWUsT0FBeEJTO1FBNkVPVyxNQUhFcEI7SUFHRyxPQUFMb0I7R0FBYTtZQUVsQlUsWUFBVTlCO0lBQUksYUFBNkJBLEdBQUssV0FBTEEsR0FBVztJQUFoQixPQVR0QzJCLE9BU1UzQixtQkFBc0IsU0FBSTtHQUFtQjtHQXhCWjs7O09BdkQ3Q1M7T0E0REVhO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BRUFDO09BS0FDO1lBS0ZDLE9BQU8vQixHQUFFWSxHQUFFSzt3QkFBNkIsT0FBekIsV0FBSkEsR0FBSmpCLEdBQW9DO0lBQXBCLHFCQUFkWSxHQUFGWjtJQUFzQjtHQUFlO1lBRTVDZ0MsV0FBV2hDLEdBQUVZLEdBQUVLO3dCQUFzQyxPQUFsQyxXQUFKQSxHQUFKakIsR0FBNkM7SUFBN0IsNkJBQWhCQSxHQUFFWTtJQUE2QjtHQUFlO0dBOEJqRDtJQUFScUI7SUFFQUM7SUF3R0FDO0lBRUFDO0lBRUFDO0lBRUFDOztJQVVGQzs7SUFFQUM7O0lBK0VBQztZQUVBQyxZQUFZQyxHQUE2QixPQUZ6Q0Ysd0JBRVlFLEdBQXVEOzs7SUFFbkVDO0lBTUFDO0lBRUFDO1lBTUFDLFVBQVVuQyxHQUFFb0M7SUFBSSxPQUFKQTthQUFxQjt3QkFBb0JoRCxHQUFFaUQsWUFBVSxrQkFBdkRyQyxHQUEyQ1osR0FBZTtHQUFFO1lBRXRFa0QsV0FBV3RDLEdBQUVvQztJQUFJLE9BQUpBO2FBQXFCO3dCQUFvQmhELEdBQUVpRCxZQUFTLGtCQUF0RHJDLEdBQTZDcUMsS0FBRmpELEdBQWtCO0dBQUU7WUFXMUVtRCxlSHZjTDtZR3ljS0Msa0JIemNMO0dHaXJCb0I7O0lBakdmQzs7SUFvRkFDOztJQWFBQztJQUFlOztJQThDZkM7OztZQW5DRUMsVUFBUyx5Q0FBNkI7WUFFdENDLGFBQVksNENBQWdDO1lBRTVDQztJQUNZOztHQUF3QztZQUVwREMsVUFBVUMsR0FBSSwrQkFBSkEsY0FBb0M7WUF3QmhEQyxlQUFlRCxHQUFJLHlCQUFKQSxHQUF5QztZQUV4REUsZ0JBQWdCRixHQUFJLE9BMUJsQkQsVUEwQmNDLEdBQTRDO3dCQWE1REc7WUFFQUMsVUFBV0MsR0FDYiwwQ0FEYUEsR0FDa0Q7WUFFN0RDLG1CQUFvQkQ7SUFDdEI7a0NBRHNCQTtHQUNrRDtZQUV0RUUsVUFBV0YsR0FDYiwwQ0FEYUEsR0FDa0Q7WUFFN0RHLG1CQUFvQkg7SUFDdEI7a0NBRHNCQTtHQUNrRDtZQUV0RUksT0FBUUosR0FDVix1Q0FEVUEsR0FDa0Q7WUFFMURLLFNBQVVMLEdBQ1oseUNBRFlBLEdBQ2tEO1lBa0I1RE0sTUFBT0MsR0FDVCw0QkFBUSxVQURDQSxPQUM0RDtZQUVuRUMsU0FBVVI7SUFDWixxQkFBSVMsTUFBSSxhQURJVDtJQUVULE9BTERNLE1BSUVHLE9BQ1ksc0NBRFpBO0dBQ3NDO1lBRXhDQyxXQUFZVjtJQUNkLHFCQUFJUyxNQUFJLGVBRE1UO0lBRVgsT0FURE0sTUFRRUcsT0FDWSx3Q0FEWkE7R0FDd0M7O0lBR2xCLHVCQUVmO1FBRFFkO0lBQUssV0F4RnBCRCxVQXdGZUM7R0FDSDtHQUZoQjtnQkFNUUE7SUFBSixPQUFJQSxhQXBYTmpCOztrQkFxWHdELHdCQURsRGlCO0dBQ3lFO0dBRmpGO1lBSUVnQixVQUFXQyxPQUFxQjlFO0lBQ2xDLElBR21CLHFDQUplQTtJQU16QjtNQUZILGdFQUo0QkEsb0JBT2pCLHNCQVBpQkE7O0lBQ2xDLG9CQURhOEU7R0FRSjtZQUVQQyxTQUFPRCxPQUFNOUU7SUFBSSxPQVZqQjZFLFVBVTJCLGdDQUFwQkMsUUFBTTlFO0dBQThCO1lBRTNDZ0YsV0FBV0M7SUFDRixJQUFQQyxPQXRZRnhDLFlBcVlXdUM7V0FDVEM7YUFFRjt3QkFBcUJDLGlCQUEwQixPQWYvQ04sVUFlcUJNLEtBSFZGLElBR1VFLE1BQTREO0dBQUU7O3FCSGx6QnhGOzs7O09HbXNCT3ZCO09BUEFIO09BRUFDO09BRUFDOztPQStCRkg7OztxQkgvdEJMOzs7Ozs7T0dxR09oRDtxQkhyR1A7T0d5R09DOzs7O09Bb0hBd0I7T0FFQUM7T0EwR0FFO09BRkFEO09BTUFHO09BRkFEO09BWUZFO09BRUFDOzs7T0FpRkFFO09BRUFFOztPQU1BQztPQUVBQztPQU1BQztPQUVBRztPQVdBQztPQUVBQztPQXVJQUM7Ozs7Ozs7OztPQW9GQUM7T0FhQUM7O09BeURBUztPQUVBQztPQUdBRTtPQUdBQztPQUdBQztPQUdBQztPQUdBQztPQW1CQUM7T0FHQUU7T0FJQUU7T0F4bEJFN0M7T0FFQUM7T0E4bUJGK0M7T0FFQUM7O09BbEZBakI7T0FGQUQ7T0FJQU47Ozs7O0VIL3RCTDs7Ozs7Ozs7Ozs7OztZNkJLSzh2QixtQkRMTDtnQ0NLS0E7OztFRExMOzs7Ozs7Ozs7Ozs7Ozs7O0VDQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lDZ0JLQyxVQUFVQyxHQUFJLE9BQUpBLEVBQUs7WUFDZkMsVUFBVUQsR0FBSSxPQUFKQSxFQUFLO1lBV2ZFLFFBQVFDLEtBQUVDO0lBQ1osR0FEVUQsUUFBRUMsS0FFUDthQUZLRDtTQUtERSxNQUxDRjtjQUFFQyxRQU1LO1NBREFFLE1BTExGO0tBS1UsMENBQWJDLEtBQVFDOztRQUdSQyxNQVJDSjthQUFFQyxRQU9LO1FBaEJJSSxNQVNUSixRQVRPSyxJQWlCVkYsS0FqQllHO0lBQ3JCO1VBRG1CRCxVQUFFQzthQUlWO0tBRUMsSUFOU0MsV0FLVkMsSUFMVUYsTUFBRkcsV0FLakJDLElBTGlCTCxNQU1iTSxNQUdKYixRQUpBWSxHQUFTRjtLQUVULFNBRElHLEtBQ2EsT0FEYkE7U0FOYU4sUUFBRUM7O0dBaUJrQjtZQUdyQ00sTUFBTVAsR0FBRUMsR0FBSSxhQVhaUixRQVdNTyxHQUFFQyxXQUFtQjtHQUUvQjs7SUFDQTtJQUtNTztZQUlBQyxZQUlXQztJQUhiLElBQUlDLDRCQUdTRCxrQkFIVEM7O0lBbUJKLElBaEJpQkMsT0FIYkQsYUFHYUU7SUFDZjtLQUFNLDRCQURLSCxLQUFJRzs7TUFDVDs7OztxQkFEU0E7O1FBT0Y7U0FQRUM7U0FPRixzQkFQRkosS0FBSUk7U0FPYjtzQkFQYUQ7Ozs7O09BT2I7Ozs7Ozs7Ozs7d0JBUGFBOztXQVlGO1lBWkVFO1lBWUYsc0JBWkZMLEtBQUlLO1lBWWI7eUJBWmFGOzs7OztVQVliOzs7Ozs7Ozs7O3NCQVphQTs7Ozs7UUFFbUI7Z0JBV087OztHQUd6QjtZQUdoQkksUUFBUUM7SUFDVixJQUFJQyx3Q0FETUQsWUFDRjs7U0FDUkU7O3lDQUZVRixHQUVWRTs7Ozs7Ozs7Ozs7Ozs7OztNQURJRDtNQUNKOzs7OztPQURJQSwrQkFETUQsSUFZTCxPQVpLQTtJQWNDLElBQUxHLE1BQUssa0JBYlBGOztJQWVGLGdDQWhCUUQsWUFnQlI7Ozs7VUFzQktLLDJCQXRDR0wsR0FnQlJJO2VBc0JLQzs7Ozs7Ozs7Ozs7Z0NBeEJERixLQWJGRjs7Z0NBYUVFLEtBYkZGOzs7Z0NBYUVFLEtBYkZGOztnQ0FhRUUsS0FiRkY7OztnQ0FhRUUsS0FiRkY7O2dDQWFFRSxLQWJGRjs7O2dDQWFFRSxLQWJGRjs7Z0NBYUVFLEtBYkZGOzs7Ozs7K0JBYUVFLEtBYkZGOztTQTBDMEIsMkNBTHZCSTsrQkF4QkRGLEtBYkZGOztTQTRDMEI7a0RBUHZCSTsrQkF4QkRGLEtBYkZGOztTQThDMEIsMkNBVHZCSTsrQkF4QkRGLEtBYkZGOzs7K0JBYUVFLEtBYkZGOzsrQkFhRUUsS0FiRkYsTUFxQ0dJOzs7K0JBeEJERixLQWJGRixNQXFDR0k7O01BckNISjtNQWVGOzs7OztJQWtDQSwwQ0FwQ0lFO0dBb0NzQjtZQUcxQkcsUUFBUWQ7SUFDVjtLQTVIbUJlLE9Bc0VqQlIsUUFxRFFQO0tBM0hxQ2dCLE9BNkgvQyxzQkE3SG1CRDtLQUFjbkIsTUE4SHZCLGtCQTlIcUNvQjtJQUNqRCw2QkFEcUJELFNBQWNuQixRQUFjb0I7MEJBQWRwQjsrQkFBY29CO0lBa0kvQywwQ0FsSWlDcEI7R0FrSVA7WUFHeEJxQixpQkFBaUJqQixLQUFJa0I7SUFDdkI7S0FBSSxjQUFLLG9DQURVbEIsS0FBSWtCO0tBQ25COzs7OzJCQUNXOzs7R0FBSTtZQTRDakJDLG1CQUFtQm5CO0lBQU0sT0FwSXpCRCxZQW9JbUJDLE9BeERuQmMsUUF3RG1CZDtHQUFrRDtZQUlqRW9CLGNBU1FDLFFBQU9DO0lEcE0xQjtTQzZKZ0N0QjtLQUNwQixLQTNHTEQsWUEwR3lCQyxNQUV0QixxQ0FxQ2dCc0IsS0F2Q010QjtLQUxyQixZQWZKaUIsaUJBb0J5QmpCOzs7T0FIcEJ1QjtpQ0FBUyxzQkFHV3ZCOzs7S0FHbkI7TUFDaUIsVUFsQ3ZCYyxRQThCeUJkO01BSUYscUNBbUNKc0I7O0tBckJuQiw2QkFxQm1CQTtLQW5CbkIsOEJBbUJtQkE7U0F0RERFO0tBc0JoQjtNQUFtQixJQXRCR0MsZUFMeEJSLGlCQW9CeUJqQixLQWZQd0I7U0FBTUM7V0FJakJDLFVBSmlCRCxpQkFDdEJFLFlBR0tEOztXQUhMQyxrQ0FjdUIzQjtNQVNIO09BRGhCNEI7O29DQVJtQjVCLEtBZlB3QixTQUNoQkcsWUFEZ0JIO09Bd0JJLE1BNUZ0QmpCLFFBMkZNcUI7TUFDSiw4QkE4QmlCTjtTQXRES0c7V0EyQmZJLGdCQTNCZUo7T0E0QnBCLDhCQTBCZUg7T0F6QmYsOEJBeUJlQTtPQXhCZiw4QkF3QmVBO09BeEJmLElBVFNRLFVBTUpELHVCQTNCU0wsVUFxQkxNOzs7TUFnQmIsOEJBaUJtQlI7TUFqQm5CLG9DQWlCbUJBOzs7O2tCQUZSLHFDQUVRQTtRQVBSekMsZ0JBQUxrRDtJQUNOLDZCQU1tQlQsS0FBUEQ7SUFMWiw4QkFLbUJDO0lBVGZGLGNBU1FDLFFBQU9DLEtBUGJTO2tCQUFLbEQ7OztVQVFObUQsa0JBQUxDO01BQ0EsOEJBRm1CWDtNQVRmRixjQVNRQyxRQUFPQyxLQUNuQlc7b0JBQUtEOzs7S0FLTCw4QkFObUJWO0tBTW5CLG9DQU5tQkE7OztZQVVmWSxpQkFBaUJDLGdCQWdCT2I7SUQ5Tm5DO0tDZ05rQjtNQUROdEI7TUFDRG9DLFFBekJKakIsbUJBd0JLbkI7TUFFRHFDLHFCQURBRCxVQURDcEM7TUFFRHNDO1FBSGlCSCxpQkFHakJFLHFCQUhpQkY7UUFHakJHLHNCQUN5Qyw4QkFZakJoQjtLQVg1Qiw4QkFXNEJBLEtBZHhCYztLQUdKLE9BRklDOzs7Z0JBVUosOEJBRzRCZixhQUg1QjtRQU5XekMsY0FBTGtEO0lBQ04sOEJBUTRCVDtJQVBQO0tBQWpCaUIsbUJBVEFMLG9CQWdCd0JaLEtBVHRCUztLQVNPUyxtQkFQVEQ7ZUFGTzFEOzs7TUFXVTtPQURoQm1EO09BQUxDO09BQ0lRLG1CQWxCQVAsaUJBZ0JTTSxrQkFBZWxCLEtBQzVCVztPQURhTyxtQkFFVEM7aUJBRENUOzs7S0FHQyw4QkFKc0JWO0tBTjVCOzs7WUFhQW9CLE9BQU9wQixLQUFJcUI7SUFBTyxPQTFDZHZCLGNBNUlKdEIsbUJBc0xPd0IsS0FBSXFCO0dBQTZDO1lBRXhEQyxRQURRdEIsS0FBSXFCLE1BeEJSVCxvQkF3QklaLEtBQUlxQixPQUFjLFNBQWlDO1lBS3ZERSxVQUFVQztRQUFLakMsSUFBTGlDLFFBQUVDLElBQUZEOztTQUNUOUM7S0FBTyxXQURJK0MsV0FBR2xDLElBQ1Asc0JBQVBiOztRQUNBZ0Q7SUFBTyx5Q0FGUkgsV0FBVUMsS0FFVEU7O1lBR0xDLEtBQUtOLE1BQU8sT0FMUkUsZUFLQ0YsTUFBNEI7WUFJakNPLGNBQWVDLEtBQU1DLEtBQTBCVDtJQUNqRCxHQUR1QlM7U0FBU0MsTUFBVEQsaUJBQVNDOztTQUFUaEMsU0FyTXJCdkI7SUFzTVEsSUFBTndCLE1BQU0sK0JBRE82QjtJQUVTLHVCRHRQL0IsT0MyTFcvQixjQXlEaUJDO0lBRXZCLHNDQURJQyxlQUQ2Q3FCO0dBRUk7WUE0Qm5EVyxlQXpCZ0JILEtBQUlSO2FBQ2RZLEtBQUtwQjtLRDFQbEI7TUM0UG9CO09BRE5uQztPQUNEb0MsUUFyRU5qQixtQkFvRU9uQjtPQUVEcUMscUJBREFELFVBRENwQztPQUVEc0M7U0FIS0gsaUJBR0xFLHFCQUhLRjtTQUdMRyxzQkFDeUMsOEJBTC9CYTtNQU1kLDhCQU5jQSxLQUdWZjtNQUdKLE9BRklDOzs7aUJBVUosOEJBZGNjLGFBY2Q7U0FOV3RFLGNBQUxrRDtLQUNOLDhCQVRjb0I7S0FVTztNQUFqQlosbUJBVEFnQixRQU9FeEI7TUFRSVMsbUJBTk5EO2dCQUZPMUQ7OztPQVVVO1FBRGhCbUQ7UUFBTEM7UUFDSVEsbUJBakJBYyxLQWVNZixrQkFDVlA7UUFEVU8sbUJBRU5DO2tCQURDVDs7O01BR0MsOEJBcEJRbUI7TUFXZDs7O0lBVklJLFFBRGNaO0lBc0JmO0dBQWlCO1lBS3RCYSxjQUFlTCxLQUFLTSxVQUFVQyxZQUFXZjthQUNuQ1ksS0FBS3BCO0tEclJsQjtNQ3VSb0I7T0FETm5DO09BQ0RvQyxRQWhHTmpCLG1CQStGT25CO09BRURxQyxxQkFEQUQsVUFEQ3BDO09BRURzQztTQUhLSCxpQkFHTEUscUJBSEtGO1NBR0xHLHNCQUN5QyxXQUwzQm1CLFVBQUxOO01BTWIsV0FONEJPLFlBQWZQLEtBR1RmO01BR0osT0FGSUM7OztpQkFVSixXQWQ0QnFCLFlBQWZQLGNBY2I7U0FOV3RFLGNBQUxrRDtLQUNOLFdBVGtCMEIsVUFBTE47S0FVUTtNQUFqQlosbUJBVEFnQixRQU9FeEI7TUFRSVMsbUJBTk5EO2dCQUZPMUQ7OztPQVVVO1FBRGhCbUQ7UUFBTEM7UUFDSVEsbUJBakJBYyxLQWVNZixrQkFDVlA7UUFEVU8sbUJBRU5DO2tCQURDVDs7O01BR0MsV0FwQll5QixVQUFMTjtNQVdiOzs7SUFWSUksUUFEbUNaO0lBc0JwQztHQUFpQjtZQWV0QmdCLGNBQVksMENBQWtCO1lBSTlCQyxjQUFldkMsUUFLZnNCO0lEbFVQLFNDa1VPQTtTQUpLM0MsTUFJTDJDLGVBekxBMUIsaUJBcUxLakI7YUFHa0IsT0ExSXZCbUIsbUJBdUlLbkI7O0lBS0ssSUFBTm1ELE1BVkpRO0lBckVBVCxjQStFSUMsS0FOVzlCLFFBS2ZzQjtJQUVBLG9DQURJUTs7WUFhSlUsZUFOQWxCO0lBRmlCLFNBRWpCQSxhQURLM0MsTUFDTDJDLFNBRFksT0FsSlp4QixtQkFrSktuQjtJQUVLLElBQU5tRCxNQWxCSlE7SUF2Q0FMLGVBeURJSCxLQURKUjtJQUVBLG9DQURJUTtHQUVlO0dBUXFDLElBQTFEVyxrQ0FDQUM7WUFNQUMsUUFBUUMsTUFBS0M7SUFDZixTQUFRQztLQUFjLFlBQ1o7O01BQ1lDOztNQUFWQztNQUFQQzs7MkNBQU9ELGFBRkpGLFlBRWNDO21CQUFWQyxPQUZKRixZQUVjQztJQUdxQztJQUUzRCxtQkFSVUgsT0FDRkUsWUFET0Q7R0FRdUI7Ozs7T0FuVnBDcEY7T0FEQUY7T0F1QkFpQjtPQVhBZDs7O09BZ1VBaUY7T0E3U0VsRTtPQXNMQTRDO09BMUNJdEI7T0E0Q0p3Qjs7T0FzRkFnQjtPQW1CQUM7O09BS0ZDO09BQ0FDOztRQXRHRWQ7UUF5RUFVO1FBdkNBTDtRQTlCQUo7UUE4QkFJO1FBRUFFO1FBN0ZBckM7UUFwSUFwQjtRQTRFQWU7OztFRC9IUDs7Ozs7Ozs7SUUrTEt5RDtZQUhBQyxPQUFtQjNGLEdBQW9DLE9BQXBDQSxFQUFxQzttQ0FBeEQyRixRQUdBRDs7OztFRi9MTDs7Ozs7Ozs7Ozs7Ozs7O0lHQ0tFO0lBVUFDO0lBZ0JBQzs7SUF6QkFDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBRUFDLGlCQUFpQkM7SUFBVSw0Q0FBVkE7R0FBcUM7WUFDdERDLG9CQUFvQkQ7SUFBVSw0Q0FBVkE7R0FBcUM7WUFFekRFLG9CQUF1QkMsT0FDYixXQURhQTtZQUl2QkMsa0JBQXFCRCxPQUNYLGVBRFdBO1lBSXJCRSxtQkFBc0JGLE9BQ1osZUFEWUE7Ozs7T0F0QnRCaEI7T0FDQUc7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQVY7T0FDQVc7T0FDQUU7T0FFQUM7T0FJQUU7T0FJQUM7T0FJQWhCOzs7OztFSDNCTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHSW9CRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFERWlCOztnQkFDT2pHO1FBQ0MsSUFBSkYsSUFBSSwyQkFEREU7ZUFFSixxQkFEQ0YsTUFER0U7a0JBQ0hGO2tCQUNpQywyQkFGOUJFO09BRW9EO0lBRzNEa0c7SUFDQUM7WUFDQUMsU0FBU0MsR0FBRUM7SUFBYSw2Q0FBZkQsR0FBRUM7SUFBYTtHQUFtQjtZQUMzQ0Msb0JBQWtCLFdBQU87WUFDekJDLGFBQWE1RyxHQUFJLFdBQUssdUJBQVRBLElBQTJCO1lBQ3hDNkcsZUFBZXBHLEtBQU0sV0FBTkEsS0FBYztZQUM3QnFHLGNBQWNDO0lBQVEsV0FBSyxrQ0FBYkE7R0FBb0M7WUFDbERDLGFBQWExRjtJQUFJLFdBQUssc0NBQVRBO0dBQTBCO1lBQ3ZDMkYsWUFBWS9GLEdBQUksV0FBSyx1QkFBVEEsSUFBMEI7WUFDdENnRyxjQUFjaEc7SUFBSSxXQUFLLFdBZnZCbUYsNEJBZWNuRjtHQUFxQztZQUNuRGlHLGNBQWNqRyxHQUFJLFdBQUssNkJBQVRBLElBQTRCO1lBQzFDa0csY0FBY2xHLEdBQUksV0FBSyw2QkFBVEEsSUFBNEI7WUFDMUNtRyxrQkFBa0JuRztJQUFJLFdBQUssaUNBQVRBO0dBQWdDO1lBQ2xEb0csWUFBWUMsV0FBV0MsSUFBSyxrQkFBaEJELFdBQVdDLE9BQW1CO1lBQzFDQyxlQUFlRixXQUFXRztJQUFLLGdDQUFMQTs7Ozs7Ozs7SUFBZ0Isa0JBQTNCSDtHQUEwQztZQUV6REksZUFBZUo7SUp6Q3BCLG1CSTBCS2hCO1FBaUJLbkc7V0FqQkxtRztzQkFnQitDLFdBRGhDZ0IsV0FFVm5IOytCQUF5QixXQUZmbUgsV0FFVm5IOztZQUtMd0gsYUFBYUwsV0FBV007UUFBZTdILGNBQUhELHlCQUE2QixXQUF6QzhILFdBQWU3SDtJQUFLLGVBQU8sV0FBdEN1SCxXQUF1QnhIOztZQUVwQytILGVBQWVQLFdBQVdNLFdBQVdFOztLQUFrQnpHO0tBQUh0QjtLQUFIRDtnQkFDaEIsV0FESWdJLFdBQWtCekc7Z0JBQ3BDLFdBRE91RyxXQUEwQjdIO0lBQ3RELGVBQU8sV0FEVXVILFdBQWtDeEg7O1lBTWpEaUksYUFBYVQsV0FBVzlEO0lBQXFCLDZDQUFoQzhELFdBQVc5RDtJQUFNLFdBQUs7R0FBMkM7WUFFOUV3RSxjQUFjVixXQUFXVztJQUMzQixJQUFJQyxrQkFDSixPQUYyQkQ7O1NBRTNCN0c7O2lCQURJOEc7O1dBRVMsV0FIR1osNEJBQVdXLElBRTNCN0c7Ozs7OztJQUdBLFdBSkk4RztHQUlTO1lBR1hDLGdCQUFnQkMsYUFBWUMsYUFBWUM7YUFDdENDLEtBQVVDLEdBQVFqRixHQUFFRDtLQUFNLGVBQXNCLFdBRHRCK0UsYUFDUjlFO0tBQVEsbUJBQU8sV0FEbkI2RSxhQUNKSSxZQUFVbEY7SUFBa0Q7SUFDMUUsV0FBSyxxQ0FERGlGLE1BRHNDRDtHQUVEO1lBR3ZDRyxzQkFBbUIsV0FBZTtZQUNsQ0MsbUJBQWdCLFdBQVk7WUF1QnRCckksa0JKL0ZYO0dJbUdvRDtJQUh6Q3NJO3VEQURBdEksT0FDQXNJO0lBR0pDLGdCQUE2QztZQUk3Q0MsSUFBTWpGLFlBQTZCa0YsdUJBQXNCQztJQUMzRCxHQURRbkYsU0FBV0MsTUFBWEQsbUJBQVdDLGNBQVhtRjtJQUMwQzs7YUFMaERKO2FBSW1DRTtpQkFBc0JDLGFBQW5EQztHQUNtRTtZQUd6RUMsVUFBV0MsY0FBYUM7SUFDMUI7S0FBSUwsd0JBQXdCLDhCQURGSztLQUVwQixpQ0FWSlAsZUFTRUU7Z0JBRU07NEJBQ1lFLHVCQUFiRDtPQUpJRyxrQkFJU0YsVUFHRjtJQURPLFdBQUssV0FGdkJELGFBSmlCSTtHQU9EO1lBSXJCMUYsWUFBVSxpQ0FuQlptRixrQkFtQjhEO0dBRHJDLDhCQUN2Qm5GO1lBS0oyRixnQkFBZ0JELEtBQU0sT0FoQnBCRixhQWdCY0UsS0FBcUQ7WUFFckVKLFlBQVlJO0lBQ1IsWUFISkMsZ0JBRVlEO2dCQUVKLG1CQUFZLCtCQUZSQTtRQUdQaEc7SUFBUSxPQUFSQTtHQUFZO1lBR2pCa0csY0FBY0M7SUFBdUIsV0FOckNQLFlBTWNPO0lBQXVCO0dBQWU7Z0JBT3ZCSDtJQWhCTSxZQWZqQ0YsYUErQjJCRTtnQkFFbkI7UUFDSGhHO0lBQVEsV0FBSyxtQ0FBYkE7R0FBZ0Q7R0FIekQ7WUFNRW9HLHFCQUFxQko7SUFDakIsWUF0QkpDLGdCQXFCcUJEO2dCQUViLHNDQUZhQTtRQUdoQmhHO0lBQVEsMENBQVJBO0dBQXlDO0dBT2xCLHNDQUE1QnFHO1lBQ0FDLGtCQUFrQkMsS0FBSXZHO0lBQU8scURBQVh1RyxLQUFJdkc7R0FBd0M7WUFDOUR3RyxjQUFjQyxNQUFLekc7SUFBTzs4Q0FBWnlHLE9BQUt6RztHQUFpRDtZQUVwRTBHLGFBQWExRztJQUNmLFNBRGVBLHNCQUVGO0lBQ1EsT0FMbkJ3Ryw4Q0FFYXhHO0dBRzBEO1lBR3ZFMkcsYUFBYTNHO0lBQ2YsU0FEZUE7S0FLSCxPQWJWd0csNENBUWF4Rzs7Ozs7OztRQUlILE9BWlZ3Ryw4Q0FRYXhHOzs7O29CQUVhOztJQUNFO0dBRTRCO1lBR3hENEcsZUFBZTVHO0lBQ2pCLFNBRGlCQTtLQUdMLE9BbkJWd0csOENBZ0JleEc7UUFFVjNDLE1BRlUyQztJQUVILE9BQVAzQztHQUNxRDtZQUcxRHdKLGNBQWM3RztJQUNoQixTQURnQkE7S0FHSixPQXpCVndHLDZDQXNCY3hHO1FBRVQzQyxNQUZTMkM7SUFFRix5Q0FBUDNDO0dBQ29EO1lBR3pEeUosYUFBYTlHO0lBQ2YsU0FEZUE7S0FNSCxPQWxDVndHLDRDQTRCYXhHO1FBRVIzQyxNQUZRMkM7YUFHYiw4QkFESzNDO0tBOUJMbUosOENBNEJheEc7SUFLYiwrQkFISzNDO0dBSW1EO1lBR3hEMEosWUFBWS9HO0lBQ2QsU0FEY0EsU0FLRixPQTFDVndHLDJDQXFDWXhHO1FBRVAzQyxNQUZPMkM7SUFHWixJQUFLLDhCQURBM0MsTUFDQTtVQUNGMko7S0FBd0MsSUFBeENULGtDQUF3QyxPQWxFM0NMLGNBa0VHSztLQUFPLE9BekNWQyxjQXlDd0IsK0NBSlp4Rzs7R0FLMkM7WUFHdkRpSCxjQUFjakg7SUFDaEIsU0FEZ0JBO0tBS0osT0FsRFZ3Ryw2Q0E2Q2N4RztRQUVUM0MsTUFGUzJDO0lBR2QsSUFBSyxnQ0FEQTNDLE1BQ0E7VUFDRjJKO0tBQTBDLElBQTFDVCxrQ0FBMEMsT0ExRTdDTCxjQTBFR0s7S0FBTyxPQWpEVkM7Y0FpRHdCLGlEQUpWeEc7O0dBSzJDO1lBR3pEa0gsY0FBY2xIO0lBQ2hCLFNBRGdCQTtLQUtKLE9BMURWd0csNkNBcURjeEc7UUFFVDNDLE1BRlMyQztJQUdkLElBQUssOEJBREEzQyxNQUNBO1VBQ0YySjtLQUEwQyxJQUExQ1Qsa0NBQTBDLE9BbEY3Q0wsY0FrRkdLO0tBQU8sT0F6RFZDO2NBeUR3QixpREFKVnhHOztHQUsyQztZQUd6RG1ILGNBQWNuSDtJQUNoQixTQURnQkE7S0FLSixPQWxFVndHLDZDQTZEY3hHO1FBRVQzQyxNQUZTMkM7SUFHZCxJQUFLLHdDQURBM0MsTUFDQTtVQUNGMko7S0FBMEMsSUFBMUNULGtDQUEwQyxPQTFGN0NMLGNBMEZHSztLQUFPLE9BakVWQztjQWlFd0IsaURBSlZ4Rzs7R0FLMkM7WUFHekRvSCxrQkFBa0JwSDtJQUNwQixTQURvQkE7S0FLUixPQTFFVndHLDhDQXFFa0J4RztRQUViM0MsTUFGYTJDO0lBR2xCLElBQUssOEJBREEzQyxNQUNBO1VBQ0YySjtLQUE4QyxJQUE5Q1Qsa0NBQThDLE9BbEdqREwsY0FrR0dLO0tBQU8sT0F6RVZDO2NBeUV3QixxREFKTnhHOztHQUsyQztZQUc3RHFILFlBQVlDLFdBQVd0SDtJQUFPLFdBQUksV0FBdEJzSCxXQUFXdEg7R0FBNEI7WUFDbkR1SCxlQUFlRCxXQUFXdEg7SUFBcUIsc0JBQWhDc0gsV0FBV3RIO0lBQXFCO0dBQWlCO1lBRWhFd0gsZUFBZUYsV0FBV3RIO0lBQzVCLEtBcE5Fa0Q7Y0FtTjBCbEQ7Ozs7O09BWWQsT0E1Rlp3RyxnREFnRjBCeEc7TUFVRTs7Z0JBVkZBOzs7Ozs7Ozs7Ozs7O2FBV095SDtTQUFRLFdBQUssV0FYL0JILFdBV2tCRzs7Ozs7S0FFckIsT0E3RlpqQiw4Q0FnRjBCeEc7Ozs7Ozs7TUFPZCxPQXZGWndHLDhDQWdGMEJ4Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBS2pCMEg7Ozs7UUFDRyxPQXRGWmxCLDhDQWdGMEJ4Rzs7O1dBS2pCMEg7TUFBOEMsV0FBSyxXQUw3Q0osV0FLTkk7OztJQUQ2QjtHQVNrQztZQUd4RUMsYUFBYUwsV0FBV00sV0FBVzVIO0lBQ3JDLFNBRHFDQTtLQVF6QixPQXhHVndHLDRDQWdHbUN4Rzs7Ozs7TUFHM0I7T0FETzZIO09BQVJDO09BQ0huTCxJQUFJLFdBSEsySyxXQUVOUTtPQUVIbEwsSUFBSSxXQUpnQmdMLFdBRVRDO01BR2YsV0FGSWxMLEdBQ0FDOzs7SUFHSixPQXZHQTRKLDhDQWdHbUN4RztHQVFxQjtZQUd4RCtILGVBQWVULFdBQVdNLFdBQVdJLFdBQVdoSTtJQUNsRCxTQURrREE7S0FTdEMsT0FwSFZ3Ryw4Q0EyR2dEeEc7Ozs7Ozs7T0FHeEM7UUFEZWlJO1FBQVJKO1FBQVJDO1FBQ0huTCxJQUFJLFdBSE8ySyxXQUVSUTtRQUVIbEwsSUFBSSxXQUprQmdMLFdBRVhDO1FBR1gzSixJQUFJLFdBTDZCOEosV0FFZEM7T0FJdkIsV0FISXRMLEdBQ0FDLEdBQ0FzQjs7OztJQUdKLE9BbkhBc0ksOENBMkdnRHhHO0dBU1U7WUFHMURrSSxhQUFhWixXQUFXdEg7SUFDMUIsU0FEMEJBO0tBS2QsT0E1SFZ3Ryw0Q0F1SHdCeEc7SUFHVjtLQURUSyxNQUZtQkw7S0FHcEJtSSxVQUFVLGtDQUhEYixXQUVSakg7SUFFTCx3Q0FESThIO0dBRW9EO1lBR3hEQyxjQUFjZCxXQUFXdEg7SUFDM0IsU0FEMkJBO0tBYWYsT0E1SVZ3Ryw2Q0ErSHlCeEc7O2dCQUVkO0lBRUQ7S0FEQzlEO0tBQUxrRDtLQUNGOUIsTUFBTSxpQ0FEQ3BCO0tBRVBlLE1BQU0sdUJBRE5LLEtBQ3FCLFdBTFhnSyxXQUdSbEk7S0FHT25CO2FBSEYvQjs7aUJBR1gsT0FESWU7S0FJVyxJQUROb0MsZ0JBQUxDLGdCQUNXLGtCQVREZ0ksV0FRVmhJO0tBQ0EsaUJBSkFyQyxLQUNTZ0I7MkNBRUpvQjs7R0FLZ0Q7WUFHekRnSixnQkFBZ0JDLGFBQVlDLGFBQVl2STtJQUMxQyxTQUQwQ0E7S0FXOUIsT0ExSlZ3Ryw4Q0ErSXdDeEc7SUFHN0IsSUFETkssTUFGbUNMLFNBR3BDbUYsT0FBTzthQUNQcUQ7S0FBTTs7Ozs7UUFFMkM7U0FEbENDO1NBQVJDO1NBQzBDLGtCQU56QkgsYUFLVEU7U0FDTyxrQkFOVkgsYUFLTEk7UUFDMEMsMkNBSGpEdkQ7Ozs7S0FDSixPQW5KQXFCLDhDQStJd0N4RztJQU9zQztJQUU5RSxrQ0FMSXdJLEtBRkNuSTtJQU9MLE9BTkk4RTtHQVF1RDtZQUczRHdELGVBQWUzSTtJQUNqQixPQTlKRXdHLDhDQTZKZXhHO0dBQ2dEO1lBRy9ENEksWUFBWTVJO0lBQU8sT0FqS25Cd0csOENBaUtZeEc7R0FBdUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBUW5GNkksY0FBY3ZIO1FBQWtCd0gsZ0JBQU5DLGlCQUFOQztJQUFtQixXQUFLLGtDQUE5QjFILE1BQU0wSCxNQUFNRCxNQUFNRDs7OztJQXVFNUIsNkJBQ2U7SUFDUjtHQUFZOzs7SUFObkIsOEJBQ2lCO0lBQ1Y7R0FBWTs7O0lBTm5CO0tBRU87UUFEY0c7SUFBTyw0QkFBUEE7R0FDRjs7O0lBTm5CLDhCQUNpQjtJQUNWO0dBQVk7OztJQU5uQixpQ0FDeUI7SUFDbEI7R0FBWTs7O0lBTm5CLDZCQUNvQjtJQUNiO0dBQVk7OztJQU5uQjtLQUVPO1FBREdBO0lBQU8sNEJBQVBBO0dBQ1M7OztJQU5uQjtLQUVPO1FBRElBO0lBQU8sNEJBQVBBO0dBQ1E7OztJQU5uQjtLQUVPO1FBREtBO0lBQU8sNEJBQVBBO0dBQ087OztJQU5uQjtLQUVPO1FBRE9BO0lBQU8sd0JBQVBBO0dBQ0s7OztJQU5uQjtLQUVPO1FBRFNBO0lBQU8sT0FoQzNCSixpQ0FnQ29CSTtHQUNHOzs7SUFObkI7S0FFTztRQURZQTtJQUFPLDZCQUFQQTtHQUNBOzs7SUFObkIsd0JBQ2U7SUFDUjtHQUFZOzs7SUFObkI7S0FFTztRQURHQTtJQUFPLDZCQUFQQTtHQUNTOzs7SUFObkIseUJBQ2lCO0lBQ1Y7R0FBWTs7O0lBTm5CLHdCQUNVO0lBQ0g7R0FBWTs7O0lBTm5CO0tBRU87UUFEVUE7SUFBTyxPQVI1Qkosa0NBUXFCSTtHQUNFO0dBSHZCOztJQUZHLElBQTZCQyxvQkFBdkJ2RDtJQUNQLE9Bbk9BRCxnQkFrT09DLHVCQUF1QnVEO0dBQ2tEO0dBRnBGOzs7SUE4RUU7Ozs7O1NBQ0k7VUFHTzthQUZlbEosaUJBQUx1RztTQUNmLHlCQTVSTlgsWUEyUnFCVyxVQUFLdkc7UUFFSDs7O0lBTnBCLElBQTZCa0osb0JBQXZCdkQ7SUFDUCxPQTlTQUQsZ0JBNlNPQyx1QkFBdUJ1RDtHQUNpRDtHQUZuRjs7OztPQWhZRWpHO09BT0FFO09BREFEO09BRUFFO09BQ0FHO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FFO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FHO09BRUFFO09BT0FDO09BRUFFO09BTUFFO09BRUFDO09BUUFHO09BS0FNO09BQ0FDOztPQWtGQWM7T0FFQUc7T0FEQUY7T0FHQUk7T0FNQUM7T0FRQUM7T0FNQUM7T0FNQUM7T0FTQUM7T0FRQUU7T0FRQUM7T0FRQUM7T0FRQUM7T0FRQUM7T0FDQUU7T0FFQUM7T0FnQkFHO09BV0FJO09BWUFHO09BUUFFO09BZ0JBQztPQWNBTTtPQUlBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWhNQWhEO09BbUJBUTtPQXJCQUg7V0FwQkVQOzs7O0VKdkdQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lLWUt5RCx5QkFBeUJDLEtBQUl0TCxHQUFFa0M7SUFDbkIsNENBRGFvSixLQUFJdEw7SUFDL0IsK0NBRGlDa0M7R0FDeUM7WUFLeEVxSixhQUFhRCxLQUFJcEo7SUFDTCxpQ0FEQ29KO0lBQ2YsK0NBRG1CcEo7R0FDNEQ7WUFHN0VzSixzQkFBc0JGLEtBQUlHLEtBQUl2SjtJQUN0QixJQUFOd0osTUFBTSxrQ0FEY0osS0FBSUc7SUFFNUIsMENBRElDLEtBRDRCeEo7R0FFVjtZQUdwQnlKLGdCQUFnQkwsS0FBSXBKO0lBQ1IsaUNBRElvSjtJQUNsQiwrQ0FEc0JwSjtHQUNvRDtZQUd4RTBKLHdCQUF3Qk4sS0FBSXBKO0lBQ2hCLGlDQURZb0o7SUFDMUIsK0NBRDhCcEo7R0FDbUQ7WUFHL0UySix1QkFBdUJQLEtBQUlwSjtJQUNmLGlDQURXb0o7SUFDekIsK0NBRDZCcEo7R0FDb0Q7WUFHL0U0SixnQkFBZ0JSLEtBQUlwSjtJQUNSLGlDQURJb0o7SUFDbEIsK0NBRHNCcEo7R0FDK0M7WUFLbkU2Siw4QkFBOEJULEtBQUlwSjtJQUVsQyxJQURFd0osTUFDRix1QkFGOEJKO0lBSWhDLDBDQUhJSSxLQURnQ3hKO0dBSWQ7WUFHcEI4SiwyQkFBMkJWLEtBQUlwSjtJQUUvQixJQURFd0osTUFDRix1QkFGMkJKO0lBTTdCLDBDQUxJSSxLQUQ2QnhKO0dBTVg7WUFHcEIrSiwwQkFBMkJ0RCxNQUFNMkMsS0FBSVksZUFBY2hLO0lBQ3JEO0tBQWtDLHVDQURLZ0s7S0FDbkNDLGdCQUFnQjtLQUNoQlQsTUFBTSxrQ0FGeUJKLEtBQU4zQyxNQUN6QndEO0lBRUosMENBRElULEtBRmlEeEo7R0FHL0I7WUFHcEJrSyx3QkFBd0JkLEtBQUlZLGVBQWNoSztJQUM1QyxPQVBFK0o7bUNBTXdCWCxLQUFJWSxlQUFjaEs7R0FDOEI7WUFHeEVtSyxvQkFBb0JmLEtBQUlZLGVBQWNoSztJQUN4QyxPQVhFK0o7K0JBVW9CWCxLQUFJWSxlQUFjaEs7R0FDOEI7WUFHaEVvSztRQUEwQkM7OztNQUNWLDJDQURVQTtNQUNWOzs7O01BQytCO09BQWxDNUk7T0FBVjZJO09BQTRDLGVBQTVDQSxPQUZ1QkQ7O2lCQUViNUk7OztTQUNaOEk7OztZQUdMQywwQkFBMEJwQixLQUFJcEosTUFBS0s7SUFDckM7S0FBSW9LLGNBUEVMLDZCQU0rQi9KO0tBRWpDbUosTUFDRixrQ0FIMEJKLEtBQ3hCcUI7SUFJSiwwQ0FISWpCLEtBRjRCeEo7R0FLVjtZQUdwQjBLLHlCQUF5QnRCLEtBQUlwSjtJQUNyQixJQUFOd0osTUFBTSx1QkFEaUJKO0lBRTNCLDBDQURJSSxLQUQyQnhKO0dBRVQ7WUFHcEIySyx3QkFBd0J2QixLQUFJcEo7SUFFNUIsSUFERXdKLE1BQ0YsdUJBRndCSjtJQUsxQiwwQ0FKSUksS0FEMEJ4SjtHQUtSO0dBS3hCOzs7WUFFSTRLO0lBQXNCO0dBQXNCO1lBRTVDQywwQkFBMEJ6QixLQUFJcEo7SUFDbEIsaUNBRGNvSjtJQUM1QiwrQ0FEZ0NwSjtHQUNnQztZQUc5RDhLLGFBQWExQixLQUFJcEo7SUFDTCxpQ0FEQ29KO0lBQ2YsK0NBRG1CcEo7R0FDK0Q7WUFHaEYrSyxzQkFBc0IzQixLQUFJNEIsT0FBTWhMO0lBRWhDLElBREV3SixNQUNGLGtDQUZzQkosS0FBSTRCO0lBTzVCLDBDQU5JeEIsS0FEOEJ4SjtHQU9aO1lBR3BCaUwsZ0JBQWdCN0IsS0FBSXBKO0lBQ1IsaUNBRElvSjtJQUNsQiwrQ0FEc0JwSjtHQUMwRDtZQUc5RWtMLDZCQUE2QjlCLEtBQUlwSjtJQUNyQixpQ0FEaUJvSjtJQUMvQiwrQ0FEbUNwSjtHQUNtRDtZQUdwRm1MLDRCQUE0Qi9CLEtBQUlwSjtJQUNwQixpQ0FEZ0JvSjtJQUM5QiwrQ0FEa0NwSjtHQUNxRDtZQUdyRm9MLFdBQVdoQyxLQUFJcEo7SUFDSCxpQ0FERG9KO0lBQ2IsK0NBRGlCcEo7R0FDcUQ7Ozs7O09BL0hwRW1KO09BTUFFO09BSUFDO09BS0FHO09BSUFDO09BSUFDO09BSUFDO09BTUFDO09BT0FDO09BU0FDO09BTUFHO09BSUFDO09BSUlDO09BTUpJO09BUUFFO09BS0FDOztPQVlBQztPQUVBQztPQUlBQztPQUlBQztPQVVBRTtPQUlBQztPQUlBQztPQUlBQzs7OztFTDFJTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VLQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O1lDaUJLQyxXQUFXQyxHQUFFQyxHQUFJLG9CQUFKQSxHQUFGRCxHQUFpQjs7SUFDNUJFO0lBQ0FDO21DQUZBSixZQUVBSSxLQURBRDs7O0VEbEJMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHRThDZTs7Ozs7Ozs7SUF2Q1ZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1Q1U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUF3RlZrRixZQUFhdEYsR0FBa0IsT0FBbEJBLEVBQWtDO1lBSy9DdUYsbUJGM0lMO09FNElLQztZQUNBQyxtQkY3SUw7WUU4SUtDLG1CRjlJTDtZRStJS0MsbUJGL0lMO1lFZ0pLQyxtQkZoSkw7WUVpSktDLG1CRmpKTDtZRWtKS0Msb0JGbEpMO09FbUpLQztZQUNBQyxvQkZwSkw7T0VvS09DO1lBQ0FsRyxXQUFZQyxHQUFTQyxHQUFJLHdCQUFKQSxHQUFURCxHQUF3QjtZQUNwQ2tHLE1BQUtsRyxHQUFTQyxHQUFJLE9BQUpBLEtBQVRELFFBQVNDLEVBQTJCO1lBQ3pDa0csTUFBS25HLEdBQVNDLEdBQUksT0FBYkQsS0FBU0MsSUFBVEQsSUFBU0MsRUFBMkI7R0FmTjt5Q0FZbkNnRyxXQUNBbEcsWUFDQW1HLE9BQ0FDO0lBSEFDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBTUFDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBQ0FDLFlBQVc5RyxHQUFrQkMsR0FBSSxpQ0FBdEJELEdBQWtCQyxHQUFzQjtZQUNuRDhHLGFBQVkvRyxHQUFrQkMsR0FBSSxpQ0FBdEJELEdBQWtCQyxHQUF1QjtPQUNyRCtHLDRCQUNBQztZQUNBQyxNQUFLbEgsR0FBa0JDLEdBQUksT0FBRyxrQkFBekJELEdBQWtCQyxLQUFsQkQsSUFBa0JDLEVBQTJCO1lBQ2xEa0gsTUFBS25ILEdBQWtCQyxHQUFJLE9BQUcsZUFBekJELEdBQWtCQyxLQUFsQkQsSUFBa0JDLEVBQTJCO0dBWmI7OztPQUNyQ3VHO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO1lBZUFDLFlBQVdwSCxHQUFrQkMsR0FBSSxpQ0FBdEJELEdBQWtCQyxHQUFzQjtZQUNuRG9ILGFBQVlySCxHQUFrQkMsR0FBSSxpQ0FBdEJELEdBQWtCQyxHQUF1QjtZQUNyRHFILE1BQUt0SCxHQUFrQkMsR0FBSSxPQUFHLGtCQUF6QkQsR0FBa0JDLEtBQWxCRCxJQUFrQkMsRUFBMkI7WUFDbERzSCxNQUFLdkgsR0FBa0JDLEdBQUksT0FBRyxlQUF6QkQsR0FBa0JDLEtBQWxCRCxJQUFrQkMsRUFBMkI7R0FmYjs7VUFZckNtSCxhQUNBQyxjQUNBQyxPQUNBQztJQUlBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztZQUNBQyxZQUFXOUgsR0FBc0JDLEdBQUksaUNBQTFCRCxHQUFzQkMsR0FBc0I7WUFDdkQ4SCxhQUFZL0gsR0FBc0JDLEdBQUksaUNBQTFCRCxHQUFzQkMsR0FBdUI7T0FDekQrSCw4QkFDQUM7WUFDQUMsTUFBS2xJLEdBQXNCQyxHQUFJLE9BQUcsa0JBQTdCRCxHQUFzQkMsS0FBdEJELElBQXNCQyxFQUEyQjtZQUN0RGtJLE1BQUtuSSxHQUFzQkMsR0FBSSxPQUFHLGVBQTdCRCxHQUFzQkMsS0FBdEJELElBQXNCQyxFQUEyQjtHQVpiOzs7T0FDekN1SDtPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztZQUlBQyxVQUFPcEksR0FBVUMsR0FBSSxPQUFkRCxJQUFVQyxVQUFrQjtZQUNuQ29JLFVBQVFySSxHQUFVQyxHQUFJLE9BQWRELEtBQVVDLFVBQW1CO1lBQ3JDcUksVUFBUXRJLEdBQVVDLEdBQUksT0FBZEQsTUFBVUMsVUFBbUI7WUFDckNzSSxVQUFPdkksR0FBVUMsR0FBSSxPQUFkRCxNQUFVQyxVQUFrQjtZQUNuQ3VJLFVBQU94SSxHQUFVQyxHQUFJLE9BQUpBLElBQVZELFVBQTRCO1lBQ25DeUksVUFBUXpJLEdBQVVDLEdBQUksT0FBSkEsS0FBVkQsVUFBNkI7WUFDckMwSSxZQUFXMUksR0FBVUMsR0FBSSxpQ0FBZEQsR0FBVUMsR0FBc0I7WUFDM0MwSSxhQUFZM0ksR0FBVUMsR0FBSSxpQ0FBZEQsR0FBVUMsR0FBdUI7T0FDN0MySTtZQUNBQyxRQUFPN0ksR0FBVUMsR0FBSSxPQUFkRCxNQUFVQyxVQUFrQjtZQUNuQzZJLE1BQUs5SSxHQUFVQyxHQUFJLE9BQUpBLEtBQVZELFFBQVVDLEVBQTJCO1lBQzFDOEksTUFBSy9JLEdBQVVDLEdBQUksT0FBZEQsS0FBVUMsSUFBVkQsSUFBVUMsRUFBMkI7R0FaTjs7O09BQ3BDbUk7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7WUFJQUMsVUFBT2hKLEdBQVVDLEdBQUksT0FBZEQsSUFBVUMsVUFBa0I7WUFDbkNnSixVQUFRakosR0FBVUMsR0FBSSxPQUFkRCxLQUFVQyxVQUFtQjtZQUNyQ2lKLFVBQVFsSixHQUFVQyxHQUFJLE9BQWRELE1BQVVDLFVBQW1CO1lBQ3JDa0osVUFBT25KLEdBQVVDLEdBQUksT0FBZEQsTUFBVUMsVUFBa0I7WUFDbkNtSixVQUFPcEosR0FBVUMsR0FBSSxPQUFKQSxJQUFWRCxVQUE0QjtZQUNuQ3FKLFVBQVFySixHQUFVQyxHQUFJLE9BQUpBLEtBQVZELFVBQTZCO1lBQ3JDc0osWUFBV3RKLEdBQVVDLEdBQUksaUNBQWRELEdBQVVDLEdBQXNCO1lBQzNDc0osYUFBWXZKLEdBQVVDLEdBQUksaUNBQWRELEdBQVVDLEdBQXVCO09BQzdDdUo7WUFDQUMsUUFBT3pKLEdBQVVDLEdBQUksT0FBZEQsTUFBVUMsVUFBa0I7WUFDbkN5SixNQUFLMUosR0FBVUMsR0FBSSxPQUFKQSxLQUFWRCxRQUFVQyxFQUEyQjtZQUMxQzBKLE1BQUszSixHQUFVQyxHQUFJLE9BQWRELEtBQVVDLElBQVZELElBQVVDLEVBQTJCO0dBWk47OztPQUNwQytJO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO1lBSUFDLEVBQUU1SixHQUFJLG9DQUFKQSxHQUF1QjtZQUN6QjZKLFVBQU83SixHQUFrQkMsR0FBZ0QsVUFEekUySixFQUN5QjNKLElBQTBDLE9BRG5FMkosRUFDTzVKLGlCQUF1RTtZQUM5RThKLFVBQVE5SixHQUFrQkMsR0FBaUQsVUFGM0UySixFQUUwQjNKLElBQTJDLE9BRnJFMkosRUFFUTVKLGtCQUF3RTtZQUNoRitKLFVBQVEvSixHQUFrQkMsR0FBaUQsVUFIM0UySixFQUcwQjNKLElBQTJDLE9BSHJFMkosRUFHUTVKLG1CQUF3RTtZQUNoRmdLLFVBQU9oSyxHQUFrQkMsR0FBZ0QsVUFKekUySixFQUl5QjNKLElBQTBDLE9BSm5FMkosRUFJTzVKLG1CQUF1RTtZQUM5RWlLLFVBQU9qSyxHQUFrQkMsR0FBZ0QsVUFMekUySixFQUt5QjNKLElBQTBDLGFBTG5FMkosRUFLTzVKLFdBQXVFO1lBQzlFa0ssVUFBUWxLLEdBQWtCQyxHQUFpRCxVQU4zRTJKLEVBTTBCM0osSUFBMkMsY0FOckUySixFQU1RNUosV0FBd0U7WUFFaEZtSyxZQUFXbkssR0FBa0JDO0lBQy9CLElBQWdELE1BVDlDMkosRUFRNkIzSixJQUNXLE1BVHhDMkosRUFRVzVKO0lBQ21DO0dBQUs7WUFHbkRvSyxhQUFZcEssR0FBa0JDO0lBQ2hDLElBQWlELE1BYi9DMkosRUFZOEIzSixJQUNXLE1BYnpDMkosRUFZWTVKO0lBQ21DO0dBQUs7WUFHcERxSyxVQUFTckssR0FBa0JDO0lBQWtELFVBaEI3RTJKLEVBZ0IyQjNKO0lBQTRDLHdCQWhCdkUySixFQWdCUzVKO0dBQXlFO1lBQ2xGc0ssUUFBT3RLLEdBQWtCQyxHQUFnRCxVQWpCekUySixFQWlCeUIzSixJQUEwQyxPQWpCbkUySixFQWlCTzVKLG1CQUF1RTtZQUM5RXVLLE1BQUt2SyxHQUFrQkMsR0FBSSxPQVozQmlLLFVBWUtsSyxHQUFrQkMsS0FBbEJELElBQWtCQyxFQUEyQjtZQUNsRHVLLE1BQUt4SyxHQUFrQkMsR0FBSSxPQWpCM0I2SixVQWlCSzlKLEdBQWtCQyxLQUFsQkQsSUFBa0JDLEVBQTJCO0dBcEJiOzs7T0FDckMySjtPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUVBQztPQUlBQztPQUlBQztPQUNBQztPQUNBQztPQUNBQztZQUlBQyxVQUFPekssR0FBV0MsR0FBSSxPQUFmRCxJQUFXQyxVQUFrQjtZQUNwQ3lLLFVBQVExSyxHQUFXQyxHQUFJLE9BQWZELEtBQVdDLFVBQW1CO1lBQ3RDMEssVUFBUTNLLEdBQVdDLEdBQUksT0FBZkQsS0FBV0MsVUFBbUI7WUFDdEMySyxVQUFPNUssR0FBV0MsR0FBSSxPQUFmRCxLQUFXQyxVQUFrQjtZQUNwQzRLLFVBQU83SyxHQUFXQyxHQUFJLE9BQUpBLElBQVhELFVBQTZCO1lBQ3BDOEssVUFBUTlLLEdBQVdDLEdBQUksT0FBSkEsS0FBWEQsVUFBOEI7WUFDdEMrSyxZQUFXL0ssR0FBV0MsR0FBSSxpQ0FBZkQsR0FBV0MsR0FBc0I7WUFDNUMrSyxhQUFZaEwsR0FBV0MsR0FBSSxpQ0FBZkQsR0FBV0MsR0FBdUI7T0FDOUNnTDtZQUNBQyxRQUFPbEwsR0FBV0MsR0FBSSxPQUFmRCxLQUFXQyxVQUFrQjtZQUNwQ2tMLE1BQUtuTCxHQUFXQyxHQUFJLE9BQUpBLEtBQVhELFFBQVdDLEVBQTJCO1lBQzNDbUwsTUFBS3BMLEdBQVdDLEdBQUksT0FBZkQsS0FBV0MsSUFBWEQsSUFBV0MsRUFBMkI7R0FaTjs7O09BQ3JDd0s7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7SUFJQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7WUFDQUMsWUFBVzNMLEdBQVlDLEdBQUksaUNBQWhCRCxHQUFZQyxHQUFzQjtZQUM3QzJMLGFBQVk1TCxHQUFZQyxHQUFJLGlDQUFoQkQsR0FBWUMsR0FBdUI7T0FDL0M0TCx5Q0FDQUM7WUFDQUMsTUFBSy9MLEdBQVlDLEdBQUksT0FBRyx5QkFBbkJELEdBQVlDLEtBQVpELElBQVlDLEVBQTJCO1lBQzVDK0wsTUFBS2hNLEdBQVlDLEdBQUksT0FBRyxzQkFBbkJELEdBQVlDLEtBQVpELElBQVlDLEVBQTJCO0dBWk47OztPQUN0Q29MO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO0lBSUFDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBQ0FDLFlBQVd2TSxHQUFXQyxHQUFJLGlDQUFmRCxHQUFXQyxHQUFzQjtZQUM1Q3VNLGFBQVl4TSxHQUFXQyxHQUFJLGlDQUFmRCxHQUFXQyxHQUF1QjtPQUM5Q3dNLHdDQUNBQztZQUNBQyxPQUFLM00sR0FBV0MsR0FBSSxPQUFHLHdCQUFsQkQsR0FBV0MsS0FBWEQsSUFBV0MsRUFBMkI7WUFDM0MyTSxPQUFLNU0sR0FBV0MsR0FBSSxPQUFHLHFCQUFsQkQsR0FBV0MsS0FBWEQsSUFBV0MsRUFBMkI7R0FaTjs7O09BQ3JDZ007T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7SUFZRkM7SUFDQUM7WUFDQUMsZUZ6VUw7WUUwVUtDLGVGMVVMO1lFMlVLQyxjRjNVTDtZRTRVS0MsZUY1VUw7T0U2VUtDO1lBQ0FDLGNGOVVMO1lFK1VLQyxjRi9VTDtZRWdWS0MsY0ZoVkw7WUVpVktDLGVGalZMO09Fa1ZLQyx3QkFDQUMsb0JBQ0FDO1lBQ0FDLFNGclZMO09Fc1ZLQztZQUNBQyxTRnZWTDtZRTZWS0MscUJGN1ZMO1lFOFZLQyxVRjlWTDtZRStWS0MsVUYvVkw7R0UwV2tCO0lBUmJDO0lBUUFDLGFBQWE7Ozs7O09BbldiOU47Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BK0hBa0Y7T0FLQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7O09BZ0JFSTtPQUNBQztPQUNBQztPQUNBQzs7Ozs7Ozs7OztPQWdLRnNHO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BTUFDO09BQ0FDO09BQ0FDO09BR0FDO09BUUFDOzs7RUYxV0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZR01LQyxVQUFVQztJQUFNOztzQkFBY0MsVUFBUSxxQ0FBUkEsR0FBa0I7YUFBdENEO0dBQTJDO1lBQ3JERSxhQUFhRjtJQUFNOztzQkFBY0MsVUFBUSxxQ0FBUkEsR0FBcUI7YUFBekNEO0dBQThDOzs7Ozs7Ozs7T0FEM0REO09BQ0FHOzs7RUhQTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUlpQktDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDOzs7Ozs7O1lBQ0FDLGdCQUFjLHdCQUFhOztJQUMzQkM7SUFDQUM7SUFDQUM7WUFFQUMsV0FBV0M7SUFDYixJQUFJLDBCQURTQSxRQUNUOzs7O01BRUYsdUNBSFdBOzs7R0FHaUU7WUFHNUVDLE9BQU9EO0lBQ1QsSUFBTSxJQUNKMVAsSUFESSxnQkFERzBQOzs7dUNBR3FCOzs7SUFEdkIsV0FBTDFQO0dBQ2dDOzs7OztPQTVCaEN1TztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUVBQztPQU1BRTs7OztFSjFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dLZ0JnQjs7O0lBRlhyQjtJQUVXO0lBcUJYc0I7WUFFQUMsT0FBUUMsS0FBSTlQLEdBQ2QsT0FBSSx1QkFETThQLEtBQUk5UCxHQUVvRTtZQUdoRitQLDJCQUE0QkQ7SUFDOUIsT0FBSSw2QkFEMEJBO0dBR2tEOztJQUc5RUU7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQUM7WUFJQUMsS0FBS0MsR0FBR04sTUFBTU87SUFBSSwwQ0FBSkEsR0FBTlAsTUFBSE07R0FBNEM7WUFDakRFLFdBQVdGLEdBQUdDLEdBQUdQO0lBQU8sMENBQVZPLEdBQUhELEdBQU1OO0dBQXVDO1lBQ3hEUyxLQUFLSCxHQUFHQyxHQUFJLDBDQUFKQSxHQUFIRCxHQUEyQjtZQUNoQ0ksTUFBTUosR0FBR0MsR0FBSSwwQ0FBSkEsR0FBSEQsR0FBNEI7WUFDbENLLElBQUlMLEdBQUdDLEdBQUksMENBQUpBLEdBQUhELEdBQTBCO1lBQzlCTSxLQUFLTixHQUFHQyxHQUFJLDBDQUFKQSxHQUFIRCxHQUEyQjtZQUNoQ08sWUFBWVAsR0FBRzNKO0lBQVUsMENBQVZBLFNBQUgySjtHQUFrRDtZQUU5RFEsS0FBS1IsR0FBRS9HLEdBQUV3SDtJQUNYO0tBQUlDLHlCQURHVixHQUFFL0c7S0FFTDBILHlCQUZHWCxHQUFJUztJQUFKVCxNQUFFL0csS0FFTDBIO0lBRkdYLE1BQUlTLEtBQ1BDO0lBR0o7R0FBb0I7Ozs7T0E3RGxCL0M7O09BdUJBc0I7T0FFQUM7T0FLQUU7T0FNQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FJQUM7T0FDQUc7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQUM7T0FFQUM7OztFTHZFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7SU1XS2hEO0lBQ0FvRDtJQUNBQzs7Ozs7WUFDQUMsWU5kTDtZTWVLQyxtQk5mTDtHTWVxQixJQUNoQkM7WUFLQUMsVUFBVWhJO0lBQUksZUFBSkE7O0dBQXNCO0dBQ3BCLElBQVppSSxlQUNBQztZQUNBQyxPQUFPbkksR0FBSSxPQUhYZ0ksVUFHT2hJLGdCQUF3RDtZQUUvRG9JLFdBQVdwSTtJQUNiLE9BTkVnSSxVQUtXaEksU0FHUixXQWxCSHVFLGdCQWVXdkU7R0FHcUQ7WUFHaEUzQyxNQUFPZ0wsSUFBV0MsSUFBSyxPQUFoQkQsT0FBV0MsV0FBcUI7Ozs7T0FyQnZDL0Q7T0FDQW9EO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BS0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BRUFDO09BTUEvSzs7O0VOaENMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJT2lCS2tMO0lBQ0FDO1lBQ0FDLGNQbkJMO1lPb0JLQyxjUHBCTDtHT29CZ0IsSUFDWFIsc0JBQ0FEO1lBQ0FVLFVQdkJMOzs7O09PaUJLSjtPQUNBQztPQUNBQztPQUNBQztPQUNBUjtPQUNBRDtPQUNBVTs7O0VQdkJMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJUVdLQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztZQUlBQyxPQUFPbEMsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBNEI7WUFDbkNtQyxXQUFXQyxJQUFHQyxJQUFJcEM7SUFBSSx5Q0FBSkEsR0FBUG1DLElBQUdDO0dBQWtDO1lBQ2hEdEMsS0FBS0MsR0FBR04sTUFBTU87SUFBSSx5Q0FBSkEsR0FBTlAsTUFBSE07R0FBMkM7WUFDaERzQyxTQUFTRixJQUFHQyxJQUFJM0MsTUFBTU87SUFBSSx5Q0FBSkEsR0FBTlAsTUFBUDBDLElBQUdDO0dBQWlEO1lBQzdERSxRQUFRdkMsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBNkI7WUFDckN3QyxZQUFZSixJQUFHQyxJQUFJcEM7SUFBSSx5Q0FBSkEsR0FBUG1DLElBQUdDO0dBQW1DO1lBQ2xEbEMsS0FBS0gsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBMEI7WUFDL0J5QyxTQUFTTCxJQUFHQyxJQUFJcEM7SUFBSSx5Q0FBSkEsR0FBUG1DLElBQUdDO0dBQWdDO1lBQzVDSyxZQUFZMUMsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBeUI7WUFDckMyQyxhQUFhM0MsR0FBR0M7SUFBSSx5Q0FBSkEsR0FBSEQ7R0FBMEI7WUFDdkM0QyxVQUFVNUMsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBK0I7WUFDekM2QyxRQUFRN0MsR0FBR0MsR0FBSSx5Q0FBSkEsR0FBSEQsR0FBNkI7WUFDckM4QyxZQUFZVixJQUFHQyxJQUFJcEM7SUFBSSx5Q0FBSkEsR0FBUG1DLElBQUdDO0dBQW1DO1lBQ2xEVSxLQUFLQyxHQUFHM007SUFBVSx5Q0FBVkEsU0FBSDJNO0dBQTBDO1lBQy9DekMsWUFBWXlDLEdBQUczTTtJQUFVLHlDQUFWQSxTQUFIMk07R0FBaUQ7WUFFN0RDLElBQ0FDO0lBRE0sR0FDTkE7OztVQUNVQyxpQkFBTDdULGNBQUxELElBREE2VDtNQUNrQyxrQkF4QmxDbkIsWUF3QlVvQixVQUFMN1QsT0FBTEQ7OztJQUR1QixPQUF2QjZUO0dBQzBDO1lBRzFDaEQsV0FBVzhDLEdBQUcvQyxHQUFHUDtJQUNuQixLQURhc0QsR0FFTCxPQUZXdEQ7aUJBR0MwRCxHQUFFQyxHQUFLLGtCQUhYcEQsR0FHTW9ELEdBQUZELEdBQVk7SUFBakIsT0F0QmJyRCxLQWNBa0QsSUFLV0QsSUFBTXREO0dBRzRCOzs7O09BaEM3Q21DO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0FDO09BSUFDO09BQ0FDO09BQ0FwQztPQUNBdUM7T0FDQUM7T0FDQUM7T0FDQXJDO09BQ0FzQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBeEM7T0FFQTBDO09BS0EvQzs7O0VSeENMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YVNxQ09vRCxlQUFlNUYsVUFBTyxPQUFQQSxFQUFROztLQUN2QjZGO0tBQ0FDO0tBQ0FDO0tBQ0FDO2FBQ0FDLE9BQU8xRCxHQUFFdkMsR0FBRXJPO0tBQUksT0FBZ0IsV0FKL0JrVSxlQUlTN0YsR0FBc0IsV0FBeEJ1QyxHQUFJNVE7SUFBeUI7dUJUMUMzQztJUzhDeUIsU0FBbEJ1VSw0QlQ5Q1AsT1MwQ09EO0lBSWtCO0lBQ0QsU0FBakJFLDJCVC9DUCxPUzBDT0Y7d0JBUUsscUJBRVE7SUFGZixTQURFRywyQlRqRFAsT1MwQ09IO2FBYUFJLG9CQUFvQnJHLEdBQUVyTztLQUFJLE9BQWtCLFdBaEI1Q21VLGlCQWdCb0I5RixHQUF3Qiw0QkFBdEJyTztJQUFpRDthQUV2RTJVLGlCQUFpQkMsZ0JBQWV2RztLVHpEdkMsWVMwRGUsa0JBcEJSNkYsZUFtQmdDN0Y7U0FFM0JyTztLQUFLLGtCQUZPNFUsZ0JBRVEsV0FyQnpCVixlQW1CZ0M3RixPQUUzQnJPOzthQVNMNlUsZUFBZUQsZ0JBQWVFLEtBQUVDO0tBS2xDO01BWHlDQyxNQVdqQyxXQW5DTmQsZUE4QjhCWSxLQUtSLDBCQUxVQztNQU5PMUc7TUFBRTRHLE9BTVRGO0tBTGxDO1dBRDJDRSxNQUVuQyxPQUZpQzVHO01BR087T0FITDZHO09BR3pDbFYsSUFIeUNpVjtPQUFGRSxNQUdPLFdBRy9CUCxnQkFOd0J2RyxHQUd2Q3JPO09BSHVDcU87T0FBRTRHOztJQWExQzthQUdDRyxpQkFBaUJSLGdCQUFldkcsR0FBRXJPO0tBQUksZ0NBQUpBOzs7Ozs7OztLQUFxQixrQkFBdEM0VSxnQkFBZXZHO0lBQTBDO2FBQzFFZ0gscUJBQXFCVCxnQkFBZXZHLEdBQUVyTyxHQUFJLGtCQUFyQjRVLGdCQUFldkcsR0FBRXJPO0lBQXVCO2FBVTdEc1YsdUJBQXVCVixnQkFBZUUsS0FBRVM7S0FDMUM7TUFUOENQLE1BWTVDLFdBdkRBZCxlQW1Ec0NZLEtBQUVTO01BUklsSDtNQUFRekU7S0FDdEQ7U0FEc0RBLE1BUVoyTCxrQkFOckMsT0FGeUNsSDtNQUlwQztPQUFKbUgsSUFJb0NELFVBUlkzTDthQUtlLDZCQUxmQTtPQUFSdUwsTUFLSixXQUdqQlAsZ0JBUnFCdkcsR0FJeENtSDtPQUp3Q25IO09BQVF6RTs7SUFjbkQ7YUFLRDhMLGVBQWUxVjtLQUNqQjtNQUFxRDtNQUFqQyxPQTlDbEIwVSxvQkE4Q3VDLDhCQUR4QjFVO0tBQ0c7SUFBb0Q7YUFHdEUyVixXQUFXM1Y7S0FBSTtNQUFpRDtNQUE3QixrQkFqRW5DbVUsaUJBaUVvRCw4QkFBekNuVTtLQUF3QjtJQUFnRDthQUNuRjRWLFdBQVc1VjtLQUFJO01BQWlEO01BQTdCLE9BM0RuQ3VVLGdCQTJEb0QsOEJBQXpDdlU7S0FBd0I7SUFBZ0Q7YUFDbkY2VixVQUFVN1Y7S0FBSTtNQUFnRDtNQUE1QixPQTNEbEN3VSxlQTJEa0QsOEJBQXhDeFU7S0FBd0I7SUFBK0M7YUFDakY4VixTQUFTOVY7S0FBSTtNQUErQztNQUEzQixrQkFyRWpDa1UsZUFxRWdELDZCQUF2Q2xVO0tBQXdCO0lBQThDO2FBQy9FK1YsVUFBVS9WO0tBQUk7TUFBZ0Q7TUFBNUIsTUEzRGxDeVUsZUEyRGtELDZCQUF4Q3pVO0tBQXdCO0lBQStDO2FBRWpGZ1csWUFBWWhXO0tBQ2Q7TUFBa0Q7TUFBOUIsaUJBdEVsQnFVLGtCQXNFb0MsNkJBRHhCclU7S0FDTTtJQUFpRDthQUduRWlXLFdBQVdqVztLQUFJO01BQWlEO01BQTdCLGlCQTFFbkNvVSxpQkEwRW9ELDZCQUF6Q3BVO0tBQXdCO0lBQWdEO2FBQ25Ga1csVUFBVWxXO0tBQUksSUFBZ0QsOEJBQVo7S0FBaEI7SUFBK0M7SUFuRjVDO1lBdUJyQzBVO1lBaEJBUDtZQU9BSTtZQUNBQztZQVRBTjtZQVdBTztZQVJBSjtZQURBRDtZQUhBSDtZQW9CQVU7WUFXQUU7WUFVQU87WUFDQUM7WUFVQUM7WUFXQUk7WUFJQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7WUFFQUM7WUFJQUM7WUFDQUM7Ozs7Ozs7Ozs7Ozs7YUFZQXJHLE9BQVFzRztLQUFVLE9BQVksa0JBQXRCQSxNQUFzQjtJQUFVO2FBQ3hDQyxRQUFRQyxhQUFZMUY7S0FBSSxPQUFlO3lDQUEvQjBGLGFBRFJ4RyxjQUNvQmM7SUFBOEM7O2FBSWxFMkYsSUFBS0gsTUFBS0ksUUFBT3ZXO0tBQ25CO01BQThDO01BQTFCLGlCQURSdVcsUUFDZ0Isb0JBRHJCSixZQUFZblc7S0FDQztJQUE2QztJQVh0Qzs7Ozs7Ozs7OztZQUt6QjZQO1lBQ0F1Rzs7WUFJQUU7O3lCQWlDVyxTQUFlO2tCQUNsQkUsS0FBVTdGO0lBQUssR0FBZjZGLFNBQU9DLE1BQVBELGVBQU9DLGNBQVBOO0lBQWUsT0FBZkE7R0FBaUM7T0FHdkNPO1lBQ0FDLGdCQUFpQkMsT0FBaUIsZ0NBQWpCQSxPQUE2QztHQUZqRCxvQkFDYkYsZUFDQUM7WUFTRjlHLE9BQVFzRyxhQUFVLGFBQVZBLFNBQWdDO1lBQ3hDRyxJQUFLSCxNQUFLSSxRQUFPdlc7SUFBSTthQUFlLFdBQTFCdVcsY0FBTEosVUFBWW5XO0dBQXNEO1lBQ3ZFb1csUUFBUUMsYUFBWTFGO0lBQUk7YUFBZSxXQUEvQjBGLGFBRlJ4RyxjQUVvQmM7R0FBOEM7cUJUckx6RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJU2dNU2tGO1lBYWdCQyxTQUFVbkY7SUFDNUI7S0FBaUIsb0NBRFdBO0tBQ3BCLG9DQURvQkE7S0FDeEJrRyxNQUFJO0tBQ08sb0NBRFhBO0tBQ0FDLE1BQUksOEJBREpEO0tBRW9CLG9DQURwQkM7S0FDUSxvQ0FEUkE7S0FDSSxtQ0FESkE7S0FDQUMsTUFBSTtLQUNPLG9DQURYQTtLQUNBQyxNQUFJLDhCQURKRDtLQUVvQixvQ0FEcEJDO0tBQ1Esb0NBRFJBO0tBQ0ksbUNBREpBO0tBQ0FDLE1BQUk7S0FDTyxvQ0FEWEE7S0FDQUMsTUFBSSw4QkFESkQ7S0FFQSxvQ0FEQUM7SUFDQSxvQ0FEQUE7R0FDVTtZQUdabkIsVUFBVS9WLEdBQUksT0FBSkEsVUFBc0I7WUFJaENrVyxpQkFBZSxTQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EzQmhCTDtPQWFnQkM7T0FVaEJDOztxQlR2TlQ7T1MyTlNHO3FCVDNOVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPU21MT3JHO09BRUF1Rzs7T0FEQUU7OztFVHBMUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJVUdLeEk7Ozs7Ozs7Ozs7Ozs7WUFNQXFKLGlCQUFrQkM7SUFDcEIsMERBRG9CQTtHQUlUO1lBR1RDLGVBQWdCRDtJQUNsQiwwREFEa0JBO0dBSVA7R0FNTzs7SUEwQkw7SUEyQlRFO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBQ0FDO0lWcEZQOzs7SVVxRk9DO0lBQ0FDO0lBQ0FDO1lBRUFDLGNBQWNDLGFBQVlqRSxHQUFFQztJQUM5QixHQUFHLFdBdkZIbEcsWUFzRjRCaUcsR0FBRUMsSUFFekI7SUFHSDtLQURJaUUsUUFKc0JsRTtLQUt0Qm1FLFFBTHdCbEU7S0FNeEJtRSx1QkFGQUYsT0FDQUM7SUFFSixTQURJQyxLQUVDLE9BRkRBO1FBSVd2TztJQUNYO1FBRFdBLE1BTlhxTyxPQVFLO0tBRUssSUFBSnRFLElBZGdCSSxNQVVYbkssSUFLTHdPLElBZmtCcEUsTUFVYnBLLElBTUxpSyxNQUFNLFdBaEJGbUUsYUFjSnJFLEdBQ0F5RTtLQUVKLFNBREl2RSxLQUNhLE9BRGJBO0tBQzJCLElBUHRCNEIsTUFPc0IsNkJBUHRCN0w7O0dBU0w7WUFHTnlPLGFBQWFMLGFBQVlqRSxHQUFFQztJQUNqQyxJQUQrQnNFLFNBQUVDO0lBQ2pDO1VBRCtCRCxZQUFFQztlQUl0QjtLQUVDO01BTnFCQztNQUt0QnZZLElBTHNCc1k7TUFBRkU7TUFLN0J6WSxJQUw2QnNZO01BTXpCekUsTUFBTSxXQU5PbUUsYUFLakJoWSxHQUFTQztLQUVULFNBREk0VCxLQUNhLE9BRGJBO1NBTnlCeUUsVUFBRUM7O0dBT3lCO1lBR3hERyxlQUFlVixhQUFZakUsR0FBRUM7SUFDL0IsS0FENkJELFVBQUVDO1FBS3hCc0UsTUFMc0J2RTtTQUFFQyxHQUliO1FBQ0h1RSxNQUxnQnZFO0lBS1gsa0JBTEhnRSxhQUtWTSxLQUFRQztHQUFvQjtZQUdqQ0ksWUFBWVgsYUFBWWpFLEdBQUVDO0lBQUksa0JBQWxCZ0UsYUFBWWpFLE1BQUVDO0dBQXFCO1lBQy9DNEUscUJWbElQO1lVbUlPQyxxQlZuSVA7WVVvSU9DLG9CVnBJUDs7SVVxSU9DO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBQ0FDLHFCVnpJUDtZVTRJT0MsWUFBWXBaLEdBQUVDLEdBQUksT0FBVSxtQkFBaEJELEdBQUVDLGlCQUFtQztZQUVqRG9aLFlBQVlDLFdBQVV2RixHQUFFQztJQUMxQixxQkE1SUFsRyxZQTJJd0JpRyxHQUFFQztJQUMxQjs7O0tBR0E7TUFESWlFLFFBSG9CbEU7TUFJcEJtRSxRQUpzQmxFO1lBR3RCaUUsVUFDQUM7O1VBR1N0TztNQUNYO2lCQURXQSxNQUpUcU87Ozs7UUFPTSxJQUFKdEUsSUFWa0JJLE1BT1huSyxJQUlQd08sSUFYb0JwRSxNQU9icEssSUFLWCxpQkFaWTBQLFdBVVIzRixHQUNBeUU7UUFDSjtTQUFzQixJQUxYM0MsTUFLVyw2QkFMWDdMOzs7Ozs7Ozs7O0lBTmI7R0FhTTtZQUdBMlAsV0FBV0QsV0FBVXZGLEdBQUVDO0lBQzdCLElBRDJCc0UsU0FBRUM7SUFDN0I7UUFEMkJEO1NBQUVDO09BSVA7UUFKT0M7UUFJbEJ2WSxJQUprQnNZO1FBQUZFO1FBSXpCelksSUFKeUJzWTtRQUlMLGlCQUpMZ0IsV0FJZnRaLEdBQVNDO09BQVc7V0FKS3FZLFVBQUVDOzs7O29CQUVqQjtLQUNPOztHQUM4QztZQUcvRGlCLGFBQWFGLFdBQVV2RixHQUFFQztJQUMzQixHQUR5QkQ7UUFBRUM7VUFJWnVFLE1BSll2RSxNQUlwQnNFLE1BSmtCdkU7TUFJTCxrQkFKTHVGLFdBSVJoQixLQUFRQzs7O2NBSll2RSxHQUVYO0lBQ2lCO0dBQ0E7WUFHL0J5RixVQUFVSCxXQUFVdkYsR0FBRUM7SUFBSSxrQkFBaEJzRixXQUFVdkYsTUFBRUM7R0FBbUI7Ozs7T0ExSzNDbEc7T0FNQXFKO09BT0FFOzs7O1FBK0RFQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUNBQztRQUVBQztRQXNCSU07UUFVSks7UUFRQUM7UUFDQUM7UUFDQUM7UUFTQU87UUFSQU47UUFDQUM7UUFDQUM7UUFDQUM7UUFDQUM7UUFDQUM7UUFLQUU7UUFpQklFO1FBT0pDO1FBT0FDOzs7O0VWN0tQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WVlXU3pTLFFBQ0QwUyxPQUFRQztJQUNWLEdBQUcsb0NBRERELE9BQVFDLFFBRUw7YUFGSEQ7U0FLT0UsUUFMUEY7Y0FBUUMsVUFNTztTQURPRSxRQUxkRjtLQUswQiw4Q0FBM0JDLE9BQWVDOztRQUdmQyxRQVJQSjthQUFRQyxVQU9PO1FBQ09JLFFBUmRKO0lBUTBCLCtDQVRqQzNTLFNBU004UyxPQUFlQztHQUFtRDs7SUFJdkUxRDtJQWFKMkQ7O0tBYkkzRDtjQUNGNEQsS0FBSUM7TUFDTixTQURNQTtPQUdNLElBRExDLEtBRkRELFFBSUFFLFFBRE0seUJBSFZIO09BS0Esb0NBRElHLE9BRkNEOztNQUtLLElBRExFLE9BTkRILFFBUUFJLFFBRE0seUJBUFZMO01BU0EscUNBVkU1RCxhQVNFaUUsT0FGQ0Q7S0FHNkI7O0tBR3BDTDtjQU1DRTtNQUFLO09BSEFELE1BQU07T0FDVixpQkFqQkU1RCxhQWdCRTRELEtBR0xDO01BRkM7S0FFVTtPQUtiSyx5Q0FDQW5JO1lBQ0FvSSxpQkFBb0IsU0FBRTs7OztPQTFCakJuRTtPQWFKMkQ7Ozs7T0ExQkdoVDs7Ozs7Ozs7Ozs7Ozs7O09BcUNKdVQ7T0FFQUM7T0FEQXBJOzs7RVpqREw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lhU0txSSxpQkFDRCx5QkFFa0M7WUFNakNDLGdCQUFXLHVCQUVGO0dBRkU7O0lBS1hDOzs7MEJBSUs7eUJBbEJMRixXQVNBQyxVQUtBQzs7O0VidkJMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R2NHUzs7OztJQUFKdkM7O1lBQ0F3QyxXQUFTLE9BRFR4QyxLQUNXO1lBQ1h5QyxTQUFTQyxHQUZUMUMsV0FFUzBDLEdBRlQxQyxnQkFFeUI7O1FBSzNCMkMsV0FNRUM7SUFYQUgsU0FnQmdCO0lBSHBCLFdBUkVFLElBTUVDOztxQmRoQkw7Ozs7T2NJS0o7O1lBdUJBSTtpQkFNSUQsR0FBR0UsV0FBVXRLO1NBQTBDLDJCQUExQ0E7U0FBMEMscUNBQXBEc0s7UUFBbUU7bUNBQXRFRixJQU5KQzs7O09BdEJBSDs7OztFZExMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dlV0M7O0lBcUdRRzs7Ozs7Ozs7OztJQTNHSlA7SUFJQXpWO0lBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBR3dFO0tBSzdEO0lBSFk7S0FESWtXO0tBQVpDO0tBQ0xDLFdBQWEsV0FYbkJYLFdBVVdVO0tBRUxFLFdBQWEsV0FabkJaLFdBVXVCUztJQUdyQix3QkFGSUUsY0FDQUM7R0FFYztHQUx0QjtHQVVGOztJQUd5RTtLQU05RDtJQUpZO0tBREtDO0tBQVpDO0tBQ05DLFdBQWEsNkJBRFBEO0tBRU5FLFdBQWEsV0F6Qm5CaEIsV0F1QndCYTtJQUd0Qix3QkFGSUUsY0FDQUM7R0FHYztHQU50QjtHQVdGOztJQVlxRTtLQUkvRDtRQUhLOUs7SUFBSyxPQUFMQTtHQUdRO0dBSmpCO1lBT0UrSyxTQUFTQyxNQUFPLGlCQUFQQSxNQUFnQjtZQUV6QkMsOEJBQThCakwsR0FBRWtMO0lBQ2xDLG1DQURnQ2xMLEdBQUVrTDtJQUNsQyxrQ0FEZ0NsTDtHQUNjO1lBSzVDbUwsUUFBUUMsS0FBSUM7SUFDSCxJQUFQQyxzQkFEVUQsS0FBSkQ7SUFFUCw4Q0FGT0E7S0FNTCxrQ0FMREU7SUFHTyxJQUFMQyxLQUFLO0lBQ1QsT0FYQU4sOEJBT0VLLE9BR0VDO0dBRVM7WUFHYkMsU0FBU0MsS0FBSUM7aUJBQThCTCxZQUFVLE9BVHJERixRQVNTTSxLQUFrQ0osS0FBeUI7SUFBOUMsdUNBQVRLO0dBQStEO1lBQzVFbEssVUFBVWlLO0lBQW1DLHVDQUFuQ0E7SUFBbUM7R0FBaUI7WUFDOURFLGVBQWVGO0lBQTBCLHVDQUExQkE7SUFBMEI7R0FBaUI7T0FDMURHO1lBRUFDLFNBQVU1TCxHQUFFNVEsR0FBSXljO0lBQ2xCLElBQU0sSUFDSjVJLE1BREksV0FETWpELEdBQUU1UTtVQUtGaWM7S0FDRDtNQURDRjtNQUNORyxLQUFLO0tBQ1QsSUFBTyxXQVBTTyxXQUFKemM7V0FTQzBjOztNQUVWLE9BL0JIZCwyQ0F5QlVHLEtBSUdZLFlBSFRUOztLQUVLLE9BNUJUTiw4QkF5QlVHLEtBQ05HOztJQUhKLFdBSGdCTyxXQUFKemM7SUFHWixPQURBNlQ7R0FTK0Q7WUFHL0QrSSxRQUFTaE0sR0FBRzZMLFdBQVUsT0FkdEJELFNBY1M1TCxNQUFHNkwsV0FBaUM7WUFFN0NJLFdBQXFCak07SUFDdkIsSUFDVSxXQUZhQSxPQUdyQixvQ0FFSztHQUFJO1lBTUxtSyxHQUFHK0IsS0FBSW5NO0lBQ0gseUNBREdBOztTQUVGZ0w7S0FBUSxpQ0FGVm1CLEtBRUVuQjs7SUFDbUMseUNBSGpDaEw7SUFHaUMscUNBSHJDbU07R0FHZ0U7O3FEQUhuRS9CLElBTUFDOztZQUdKK0IscUJBQXFCWCxLQUFJWTtJQUMzQiwwQ0FEdUJaO0lBRXBCO0tBQ0UscURBSHNCWTs7R0FJTDtZQU9wQkMsb0JBQXFCN1gsWUFBWUosTUFBSzRMO0lBQ3hDLElBQUkscUJBRG9DQSxPQUNwQztVQUNGc007S0FDb0I7TUFEcEJkO01BQ0lZLGdCQUFnQjtLQUtwQixHQVJxQjVYLFlBU2hCLElBQ0M7S0FFTixJQXZCQTJYLHFCQWFBWCxLQUNJWTtnQkFXRCxJQUNHO0tBR04sa0JBbEJpQ2hZOztHQWtCM0I7WUFHTm1ZLHlCQUF5QnZNO0lBQUksT0FyQjdCcU0sdUJBckhBalksTUEwSXlCNEw7R0FBZ0Q7WUFFekV3TSxnQkFBc0JDLFdBQVV6TTtJQUNsQyxJQTdJRTBNLFNBNElzQkQsWUE1SXRCclkscUJmVEw7SWVzSkcsT0F4QkVpWSxvQkF1QnNCSSxXQTVJdEJDLFFBNElnQzFNO0dBQ29EO1lBR3BGMk0saUJBQWlCdkIsS0FBSXdCO0lBQ3ZCLElBQUkscUJBRG1CQSxVQUNuQjtVQUNGdkI7S0FDUztNQURURjtNQUNJRyxLQUFLO0tBQ1QsT0FsR0FOLDRDQThGaUJJLEtBRWpCRCxNQUNJRzs7R0FDa0Q7WUFLdER1Qix3QkFBd0JqSTtJQUcxQjtJQUNBLE1BSjBCQTtHQUlOO1lBR2xCa0k7SUFBdUIsdUNBdER2Qlg7R0FzRHdEO1lBR3REWTtJZjVLUDs7R2UyS2tCO2tCQUNYQTs7O09BL0ZGcEI7Ozs7T0FwQkFiO09BeUdBK0I7T0F2R0E3QjtPQU1BRTtPQVNBSztPQUNBaEs7T0FDQW1LO09BR0FFO09BY0FJO09Bd0RBUTtPQUZBRDtPQU1BSTtPQTFEQVY7cUJmL0ZMO09leUtLYTs7OztFZnpLTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WWdCT0tFLFlBQXFCaE47SUFDdkI7S0FHRTtLQUdFaU47YUFDQUMsU0FBTy9KO0tBQ1QsT0FGRThKO01BR0c7S0FDdUIsMkNBSG5COUo7SUFHK0I7SUFFMUMsSUFDVSxJQUFKdUUsTUFBSSxXQWRhMUgsR0FRbkJrTixXQURBRCxpQkFTRixPQUZJdkY7VUFJSjJEOztLQVhFNEI7UUFXRjlCLG1CQUlRLGtDQUpSQTtTQUdZaEksSUFIWmdJO0tBR2lCLE9BQUxoSTs7R0FDTTtZQUdsQmdLLG1CQUFtQm5OO0lBQ3JCLE9BMUJFZ047c0JBMEJlRTtjQUNmLFdBRm1CbE4sWUFFRG1ELEdBQUssT0FBYyxXQUR0QitKLGNBQ0cvSixJQUEyQjtjQUE3QzthQUNJO0dBQUM7WUFHTGlLLFFBQVVDLE9BQVVyTjtJQUFlLGdCQUFLNVEsR0FBSyxPQUFPLFdBQTFDaWUsT0FBMEMsV0FBaENyTixHQUFvQjVRLElBQWlCOzs4QkEvQnpENGQsYUF5QkFHLG9CQU1BQzs7O0VoQnRDTDs7Ozs7Ozs7O0tpQmlHV0U7Ozs7Ozs7Ozs7O0lBK01rRDtZQS9NbERBOzs7Ozs7Ozs7Ozs7OztLQW1EQUE7Ozs7S0FJUkU7S0FDQU47S0FDQTlNO0tBQ0FxTjtLQUNBQztLQUNBMUQ7S0FDQTJEO0lBd0pzRTtZQWxLOURMOzs7O1lBSVJFO1lBQ0FOO1lBQ0E5TTtZQUNBcU47WUFDQUM7WUFDQTFEO1lBQ0EyRDs7OztLQTdEUUw7Ozs7Ozs7Ozs7O0lBMk5vRTtZQTNOcEVBOzs7Ozs7Ozs7Ozs7OztLQW1EQUE7Ozs7S0FJUkU7S0FDQU47S0FDQTlNO0tBQ0FxTjtLQUNBQztLQUNBMUQ7S0FDQTJEO0lBb0s0RDtZQTlLcERMOzs7WUFJUkU7WUFDQU47WUFDQTlNO1lBQ0FxTjtZQUNBQztZQUNBMUQ7WUFDQTJEOzs7OztLQW9EUUw7Ozs7S0FJUkU7S0FDQU47S0FDQTlNO0tBQ0FxTjtLQUNBQztLQUNBMUQ7S0FDQTJEO0lBNEd3RTtZQXRIaEVMOzs7O1lBSVJFO1lBQ0FOO1lBQ0E5TTtZQUNBcU47WUFDQUM7WUFDQTFEO1lBQ0EyRDs7OztLQXVFUUw7Ozs7S0FJUkU7S0FDQU47S0FDQTlNO0tBQ0FxTjtLQUNBQztLQUNBMUQ7S0FDQTJEO0lBa0NGO1lBNUNVTDs7OztZQUlSRTtZQUNBTjtZQUNBOU07WUFDQXFOO1lBQ0FDO1lBQ0ExRDtZQUNBMkQ7Ozs7Ozs7Ozs7Ozs7RWpCN1NIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FrQnNCT0gsZUFDQU47YUFDQVUsYUFBYUMsSUFBSTdOO2tCQUFzQm1EO01BQWMscUJBQXBDbkQsR0FBc0JtRDtNQUFjO0tBQUs7S0FBeEIsMEJBQXJCMEs7SUFBOEM7OztTQUUzRHpOLE1BRkF3Tjs7U0FLUXhlLGNBSFJnUixNQUdRaFI7YUFJTmtlLFlBQVF2TixHQUFFQyxHQUFJLGtCQVhoQndOLE1BV1V6TixHQUFFQyxHQUFhO2FBQ3ZCdU4sV0FBUXhOLEdBQUVDLEdBQUksa0JBUmhCSSxLQVFVTCxHQUFFQyxHQUFZO0lBRlA7dUJBQ2ZzTixhQUNBQztLQURBTztLQUNBQztLQURBQztLQUNBQzthQWNFQyxLQUFLL0ssR0FBRUM7S0FBSSxPQUFNO2NBZm5CNEs7Y0FlTzdLO3VCQUFnQkE7ZUFBSyxPQUFNO3dCQWRsQzhLLGNBY1M3SyxZQUE2QkEsR0FBSyxXQUFwQkQsR0FBZUMsR0FBUzs7O0lBRTVCOztLQU5ILGlCQXJCbEI4SixVQURBTSxNQUlBcE4sS0FzQkk4TjtLQVRZLG1CQWhCaEJoQixVQVVFYyxlQUNBQzthQW9CRlIsS0FBSzFOO0tBQUksT0FBTSxXQXJCYitOLGVBcUJHL04sWUFBY0EsR0FBTSxPQUFOQSxFQUFROzthQUMzQjJOLFNBQVMzTjtLQUFJLE9BQVMsV0E3QnRCSyxLQTZCU0wsbUJBQXVCLFNBQUU7SUFBQzthQUc3Qm9PLEtBQUtDO0tsQjFEbEIsWWtCMkRzQixrQkFwQ2ZsQixVQW9DZSwyQkFESmtCO1NBRUpDLGVBQUx0TztLQUFpQjtjQTNCakIrTixlQTJCQS9OLFlBQXFCdU8sR0FBSyxPQUZ0QkgsU0FFaUJHLEdBRlpGLEtBRUpDLElBQXNDOzthQUg3Q3JFLElBS0VxRSxJQUFNLE9BSkZGLFFBSUpFLElBQWdCO2FBR2RWO0tBQVcsWUFDVCxrQkEzQ05UO1NBNENLbUIsZUFBTHRPO0tBQWlCO2NBbENmK04sZUFrQ0YvTixtQkFBMkIsT0FGdkI0TixTQUVDVSxJQUFpQzs7SUE5Q0Y7WUFDcENiO1lBQ0FOO1lBQ0FVO1lBRUF4Tjs7WUFPRTBOO1lBQ0FDOztZQW9CRk47WUFDQUM7WUFFQTFEO1lBUUkyRDs7Ozs7Ozs7SUFPaUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFPekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFNb0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFNZjs7Ozs7Ozs7Ozs7Ozs7YUF5Qi9DVCxTQUFPL0o7S0FBZSwrQkFBZkE7S0FBZTtJQUFnQjthQUN0Q3FLLEtBQUt6TixHQUFHQztrQkFBa0RtRDtNQUFnQixxQkFBbEVuRCxHQUFrRG1EO01BQWdCO0tBQUs7S0FBNUMsMkJBQTlCcEQsSUFBa0I7O0lBQTBEO0lBQzNFO0tBQU5LOzs7aUJBQW1CTCxHQUFHQztTQUFLLElBQXNCLHVCQUE5QkQsSUFBbUIsZ0NBQWhCQztTQUFnQjtRQUE2QjtJQUwzRCx3QkFJUndOLE1BQ0FwTixLQUZBOE07O1lBdUZFTSxLQUFLckssR0FBR25ELEdBQUksa0JBQUpBLEdBQUhtRCxHQUFVO1lBQ2YrSixTQUFPL0osR0FBSSxPQUFKQSxFQUFLO0dBQ047SUFBTi9DLCtCQUFtQitDLEdBQUduRCxHQUFLLGtCQUFMQSxHQUFIbUQsR0FBVzt1QkFGOUJxSyxNQUNBTixVQUNBOU07SUFsSGdCa047Ozs7Ozs7Ozs7O0lBMEdYOztPQTFHV0E7Ozs7Ozs7Ozs7Ozs7S0FrQ0NvQjtLQUNBQzs7OzswREFEQUQsVUFDQUM7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQlBEO0tBQ0FDOzs7OzBEQURBRCxVQUNBQzs7Ozs7Ozs7Ozs7Ozs7OztLQWtCQUQ7S0FDQUM7Ozs7MERBREFELFVBQ0FDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQWtCREQ7U0FDQUM7Ozs7OzBEQURBRCxVQUNBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RWxCdkxwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJbUJPNkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQU1FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFNVTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBTUU7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBU3BFeGE7YUFDQXlhLFlBQVk3TyxHQUFHQztLQUFJLGtCQURuQjdMLFFBQ21CLHFCQUFKNkwsSUFBSEQ7SUFBcUI7OztTQUVqQ0ssTUFGQXdPOztTQUtReGYsY0FIUmdSLE1BR1FoUjthQUdSbWUsV0FBUXhOLEdBQUVDLEdBQUksa0JBTmRJLEtBTVFMLEdBQUVDLEdBQVk7YUFDdEI2TyxLQUFLQyxJQUFHQyxJQUFJL087S0FBSSxrQkFWaEI3TCxRQVVnQixXQVBoQmlNLEtBT0swTyxJQUFPOU8sSUFBSitPO0lBQXdCO2FBQ2hDQyxLQUFLRixJQUFHQyxJQUFHRSxJQUFJalA7S0FBSTtjQVhuQjdMLFFBV21CLFdBWG5CQSxRQVdtQixXQVJuQmlNLEtBUUswTyxJQUFVOU8sSUFBUCtPLEtBQUdFO0lBQStCO2FBQzFDakYsSUFBSXFFO0tBQThCO2tCQUE2QmpmLEdBQUV5WSxJQUFNLFdBQVJ6WSxHQUFFeVksSUFBYTt1QkFBN0IscUJuQjlDeEQsT21CNENPZ0g7S0FFa0Msa0NBQTlCUjtJQUE0RTthQUNoRkgsS0FBS1ksSUFBR0M7S0FBSyxPQUhiRixLQUdLQyxJQUFHQyxhQUF3QjVMLEdBQUVDLEdBQUssV0FBUEQsR0FBRUMsR0FBUztJQUFDO2FBQzVDOEwsU0FBT0MsR0FBRWI7S0FBSTtjQWRibmE7Y0FjYTtnQkFkYkE7Z0JBY2EscUNBQWU5RSxHQUFLLE9BQUxBLEVBQU07Z0JBQTNCOGY7Y0FBRWI7SUFBc0M7YUFDL0NjLFNBQU9ELEdBQUViO0tBQUk7Y0FmYm5hO2NBZWE7Z0JBZmJBO2dCQWVhLDhCQUFZL0UsVUFBUSxPQUFSQSxFQUFTO2dCQUEzQitmO2NBQUViO0lBQXNDO2FBQy9DWCxTQUFTVTtLQUF3QjtzQ0FBeEJBLFNBRlRhO0lBRXNEO0lBbkJrQjs7WUFNeEU5TztZQVVBOE47WUFiQS9aO1lBZUFpYjtZQURBRjtZQUxBM0I7WUFUQXBaO1lBVUEwYTtZQUNBRztZQUNBaEY7WUFJQTJEO2dCQWhCQXhaLFFBZUFpYixVQURBRixVQUxBM0I7Ozs7SUFpQnVFOzs7O0lBTWY7OztJQWV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQUhGOzs7Ozs7Ozs7O0lBRHRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFrRE1wWixPQURNa2IsSUFBR1A7S0FBSyxPQUFjLGlCQUF0Qk8sSUFBR1AsYUFBd0I5TyxHQUFFbUQsR0FBSyxrQkFBUG5ELEdBQUVtRCxHQUFRO0lBQUM7YUFFNUN5TCxZQUFZN08sR0FBR0MsR0FBSSxPQURuQjdMLE9BQ21CLHFCQUFKNkwsSUFBSEQsR0FBcUI7OztTQUVqQ0ssTUFGQXdPOztTQUtReGYsY0FIUmdSLE1BR1FoUjthQUdSbWUsV0FBUXhOLEdBQUVDLEdBQUksa0JBTmRJLEtBTVFMLEdBQUVDLEdBQVk7YUFDdEJrTyxLQUFLWSxJQUFHQztLQUFLLE9BQWMsaUJBQXRCRCxJQUFHQyxhQUF3QjVMLEdBQUVDLEdBQUssV0FBUEQsR0FBRUMsR0FBUztJQUFDO2FBQzVDNEwsS0FBS0YsSUFBR0MsSUFBR0UsSUFBSWpQO0tBQUksYUFBZ0NzUCxLQUFJQyxHQUFLLGtCQUFURCxLQUFJQyxHQUFVO0tBQW5CLHdCQUF0QixpQkFBbkJULElBQUdDLElBQU8vTyxJQUFKaVA7SUFBdUQ7YUFDbEVqRixJQUFJcUU7S0FBOEI7a0JBQTZCamYsR0FBRXlZLElBQU0sV0FBUnpZLEdBQUV5WSxJQUFhOzs7TUFBN0IscUJBQVM7O0tBQXhCLGtDQUE5QndHO0lBQTRFO2FBQ2hGYSxTQUFPQyxHQUFFYjtLQUFJLE9BQVksaUJBQWxCYSxHQUFFYixtQkFBd0JqZixHQUFLLE9BQUxBLEVBQU07SUFBQzthQUN4QytmLFNBQU9ELEdBQUViO0tBQUksT0FBWSxpQkFBbEJhLEdBQUViLFlBQXFCbGYsVUFBUSxPQUFSQSxFQUFTO0lBQUM7YUFDeEN1ZSxTQUFTVTtLQUF3QjtzQ0FBeEJBLFNBRlRhO0lBRXNEO0lBbkJSOztZQU85QzlPO1lBT0E4TjtZQVZBL1o7WUFjQWliO1lBREFGO1lBSkEzQjtZQVRBcFo7O1lBV0E2YTtZQUNBaEY7WUFHQTJEO2dCQWZBeFosUUFjQWliLFVBREFGLFVBSkEzQjs7OztJQWlCd0Q7Ozs7SUFPMUM7OztRQVNaTDthQUNBc0MsTUFBTUMsSUFBR0M7a0JBQXVCMVAsR0FBSyx3QkFBNUIwUCxJQUF1QjFQLEdBQWdCO0tBQXJCLHdCQUFyQnlQO0lBQTJDO0lBQzNDLElBQU5yUDtJQUwyRSxpQkFHM0U4TSxVQUNBc0MsT0FDQXBQOzs7Ozs7Ozs7Ozs7Ozs7SUFHZ0U7Ozs7Ozs7Ozs7Ozs7OzthQVk5RDhNLFNBQU8vSjtLQUFhLDJCQUFiQTtLQUFhO0lBQVk7YUFDaENxTSxNQUFNSCxJQUFHTTtLQUFhLDJCQUFoQk47S0FBUSw2QkFBTE07SUFBcUM7YUFDOUNDLFdBQVc3UCxHQUFHQztLQUFJO3VCbkI1TDdCLDRCbUI0THlCQTtLQUFhLHdCQUFoQkQ7SUFBNEI7SUFDakM7S0FBTkssc0JBREF3UDt3QkFGQTFDLFVBQ0FzQyxPQUVBcFA7S0EzSGdCb087Ozs7Ozs7Ozs7Ozs7SUFrSHVDO1lBbEh2Q0E7Ozs7Ozs7Ozs7Ozs7OzthQXFJaEJ0QixTQUFPL0o7S0FBZ0IsMkJBQWhCQTtLQUFJLDRCQUFKQTtJQUEwQjthQUNqQ3FNLE1BQU1ILElBQUdNO0tBQUs7TUFBNEMsbUNBQWpEQTtNQUF3QyxtQ0FBM0NOO01BQW1DO01BQVYsbUNBQXRCTTtNQUFhLG1DQUFoQk47S0FBUTtJQUFvRDthQUNsRU8sV0FBVzdQLEdBQUdDO0tBQUk7TUFBMkIsbUNBQWxDRDtNQUF5Qiw0QkFBdEJDO01BQWEsbUNBQWhCRDtLQUFPLGlDQUFKQztJQUFzQztJQUM5QztLQUFOSSxzQkFEQXdQO3dCQUZBMUMsVUFDQXNDLE9BRUFwUDtLQXhJZ0JvTzs7Ozs7Ozs7Ozs7OztJQStIeUM7WUEvSHpDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFbkJsRTNCOzs7Ozs7Ozs7Ozs7O0dvQm9CcUI7Ozs7O0lBd0JoQnhQO0lBQ0FLO0lBQ0F5UTtJQUNBMVo7SUFDQW1KO0lBQ0FOO0lBQ0FPO0lBQ0F1UTtJQUNBM1A7SUFDQUM7SUFDQVQ7SUFDQW9RO0lBQ0F6TztJQUNBQztZQUNBeU8saUJBQXFEeFMsR0FBSSwwQ0FBSkEsR0FBaUM7O0lBQ3RGeVM7Ozs7T0FmQWxSO09BQ0FLO09BQ0F5UTtPQUNBMVo7T0FDQW1KO09BQ0FOO09BQ0FPO09BQ0F1UTtPQUNBM1A7T0FDQUM7T0FDQVQ7T0FDQW9RO09BQ0F6TztPQUNBQztPQUNBeU87T0FDQUM7OztFcEIzREw7Ozs7Ozs7Ozs7Ozs7Ozs7O0dxQjhCaUI7WUFJWkgsS0FBZTNaLFNBQVN5VDtJQUtQLElBQWJzRyxpQkFMVy9aLFNBQVN5VDtJQUNsQixXQUlGc0c7OzJCQVdGQSxtQkFObUIsV0FNbkJBOztJQTZCZSxJQUFmQTtJQUhOLFdBR01BOztPQVNJL1o7WUFDQXlULGlCQUFjLFdBQWE7R0FQdkI7d0JBTUp6VCxTQUNBeVQ7SUFWSnNHO0lBR1EsV0FIUkE7O2FBaUNBQSxXQUFXaE47S0FDZ0MsMkJBRGhDQTtLQUNiLFdBQVksaUJBRENBO0lBQ3lEO0lBSjFFLFdBR01nTjs7O2FBK0JBQSxXQUFXaE4sR0FBRUM7S0FFRCwyQkFGREQsTUFBRUM7S0FDZixXQUFZLGlCQURDRCxNQUFFQztJQUdkO0lBTkwsV0FHTStNOzs7YUF5QkFBLFdBQVdoTjtLQUNnQywyQkFEaENBO0tBQ2IsV0FBWSxpQkFEQ0E7SUFDeUQ7SUFKMUUsV0FHTWdOOzs7OztPQXRJRko7Ozs7bUJBaUNpQixJQUFmSTs7Ozs7OztFckJuRVA7Ozs7Ozs7Ozs7Ozs7Ozs7OztHd0JzQmlCOzs7Ozs7Ozs7SUFVWm5SO0lBQ0E3SztJQUNBZ2U7SUFDQS9iO1lBRUFtSixLQUFLblE7SUFHSCxzQ0FIR0E7SUFHSDtHQUFtQjtHQVFQO0lBTGR1UjtJQUNBQztJQUNBbVA7SUFDQW5RO0lBQ0F3UztJQUNBcEM7SUFDQWpQO1lBRUF6QixPQUFTc0csS0FBVTdDO0lBQ3JCLEdBRFc2QyxTQUFNQyxNQUFORCxjQUFNQyxjQUFOd007SUFDWCxLQURxQnRQLEdBRWI7T0FGYUEsTUFLZCwwQ0FMSXNQLEtBQVV0UDtRQUlqQjNULElBSmlCMlQ7SUFJVixPQUFQM1Q7R0FDNEI7WUFLOUI4USxLQUFLSCxHQUFHQyxHQUFJLDJDQUFKQSxHQUFIRCxHQUE0Qjs7Ozs7T0E3QmpDZjtPQUNBN0s7T0FDQWdlO09BQ0EvYjtPQUVBbUo7T0FNQW9CO09BQ0FDO09BQ0FtUDtPQUNBblE7T0FDQXdTO09BQ0FwQztPQUNBalA7T0FFQXpCO09BVUFZOzs7RXhCN0RMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZeUJjTzlKLFFBQ0cwUyxPQUFRQztJQUNWLEdBQUcsb0NBRERELE9BQVFDLFFBRUw7SUFFRyxJQVFKdUosSUFSSSw2QkFKTnhKLFVBQVFDO2FBWU51SixHQUFLLE9BQUxBO0lBTk8sSUFLSkMsTUFMSSw2QkFOVHpKLFVBQVFDO2FBV0h3SixLQUFLLE9BQUxBO0lBSE8sSUFFSkMsTUFGSSw2QkFSWjFKLFVBQVFDO2lCQVVBeUosbUNBVlIxSixVQUFRQyxZQVVBeUo7R0FFQztZQUlYL00sWUFLUzRELEtBSkpDO0lBQ047S0FFUUUsUUFFRiw2QkFESUgsS0FKSkM7S0FFQUksUUFLRiw2QkFKSUYsT0FIRkY7S0FDRm1KLFFBUUYsNkJBUEkvSSxPQUZBSjtJQVdOLG9DQVZJbUosT0FERW5KO0dBV3dCO0dBU2hDLFNBTkdGLEtBTUNFO0lBQUssSUFIQUQsTUFBTSxpQ0FDVixNQW5CRjVELFlBa0JNNEQsS0FHTEM7SUFGQztHQUVVO1lBR2JPO0lBQ0Q7S0FHaUI2STtLQUREQztLQURDQztLQURDQztLQU9YQyxVQUFZLDZCQUpGSjtLQUdaSyxnQ0FDRUQ7S0FJQUUsVUFBWSw2QkFUSEw7S0FRWE0sa0NBQ0VELGVBTEZEO0tBU0VHLFVBQVksNkJBZEZOO0tBYVpPLGtDQUNFRCxlQUxGRDtLQVNFRyxVQUFZLDZCQW5CRFA7S0FrQmJRLGtDQUNFRCxlQUxGRDtJQVFKLFdBSklFO0dBSXlCO0dBekV4QjtZQVNMamQsU0FpQkNxUCxhQWVBMkQsTUFTRFM7SUF6Q0F6UztJQWlCQ2tjO0lBZUFDOzs7WUEyQ0hDLHFCQUFzQkMsV0FBV0MsVUFBVUMsVUFBVUM7SUFDdkQ7S0FDK0Qsa0NBRmxCRCxVQUFVQzt3QkFFTjtLQUEvQzs7UUFGc0JIO3VCQUVKLHlCQUZlQztJQUVqQztHQUFtRjtZQUduRm5TOztLQUE2Q29TO0tBQVVDO0tBQXBCRjtLQUF2QkQ7SUFDZCxPQU5FRCxxQkFLWUMsV0FBdUJDLFVBQVVDLFVBQVVDOztZQUl2RGpJLFlBQVU1TCxHQUFJLFdBSmR3QixVQUlVeEIsSUFBMkI7Ozs7O09BcEZuQzNJO09BaUJDa2M7T0FlQUM7O09BMkNIQztPQUtBalM7T0FJQW9LOzs7O0V6QmxHTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WTBCSUtrSSxnQkFBVyxxQkFFRDtZQUdWQyxjQUNXL1QsR0FETUM7SUFDbkIsSUFBYWlHLFNBQUVsSixTQUFJRTtJQUNqQjtVQURXZ0o7TUFFTSwwQkFGQWhKO01BRVQsMkJBRktGOztLQUlILElBSkNtSixjQUdUOVcsSUFIUzZXLFFBSUQsbUJBTE9qRyxHQUlmNVE7O01BRXFCLElBQVpDLGNBTEUwa0IsWUFLRjFrQixHQUxFME4sTUFBRmtKLFdBQUVsSjs7O0tBTWUsSUFBaEJpWCxnQkFOS0MsWUFNTEQsS0FOSy9XLE1BQU5nSixXQUFNaEo7O0dBUVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BZFY0VztPQUtBQzs7O0UxQlRMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7STJCZ0JTSTs7Ozs7Ozs7Ozs7OztHQUNKLFNBUkF6RCxVQVFJMEQsVUFBWUMsVUErQlpDO0lBL0JKLFNBK0JJQTs7Ozs7Ozs7Ozs7T0FMQTs2Q0EzQkFILGtCQWdDQUc7OztNQUhBOzRDQTdCQUgsa0JBZ0NBRzs7Ozs7TUFDQTs0Q0FqQ0FILGtCQWdDQUc7OztNQURBOzRDQS9CQUgsa0JBZ0NBRztTQWpCc0JDOzs7Ozs7Ozs7Ozs7O1dBWmlDQzs7UUFJbkM7U0FEZkMsV0FIa0REO1NBSWhERSxXQUFhLFdBTnBCTixVQUtLSztRQUVGLFdBRElDOztPQUdKOztnQkFWSFA7Z0JBZXNCSTtnQkFpQnRCRDs7OztVQWpCNkRLOztPQUl6QztRQURmQyxXQUh3REQ7UUFJdERFLFdBQWEsV0FsQlJSLFVBaUJQTztPQUVGLFdBRElDOztNQUdKOztlQXRCSFY7ZUFlc0JJO2VBaUJ0QkQ7OztJQUdBLCtDQW5DQUgsa0JBZ0NBRztHQUdzRTtZQUcxRXhLLFVBT0lnTCxVQUFZQztJQUhsQjtLQUt1QixJQURkL0QscUJBQ0NDLFdBQWEsV0FGakI2RCxVQUNHOUQ7S0FFSCx3QkFESUM7O0lBR2EsSUFEWCtELHFCQUNGQyxXQUFhLFdBTExGLFVBSU5DO0lBRU4sd0JBRElDO0dBQ3lEO1lBR2hFckwsZUFLQ3NMLGdCQUFpQkM7SUFDckI7Ozs7c0NBRElEOzZDQUFpQkM7R0FpQnBCO1lBR0M5ZSxRQUdFK2UsT0FBUUMsT0FBUUMsT0FBUUM7SUFDNUIsR0FBRyxvQ0FEaUJELE9BQVFDLFFBRXZCO2FBRmVEO1NBS2JFLFFBTGFGO2NBQVFDLFVBTWI7U0FES0UsUUFMUUY7S0FLSSxrQkFMNUJILE9BS0dJLE9BQWFDOztRQUdWQyxRQVJVSjthQUFRQyxVQU9iO1FBQ1dJLFFBUkVKO0lBUVUsa0JBUjFCRixPQVFGSyxPQUFnQkM7R0FBc0M7WUFHOURyZixNQUdFOGUsT0FBUUMsT0FBUU8sT0FBUUM7SUFDNUIsR0FBRyxvQ0FEaUJELE9BQVFDLFFBRXZCO2FBRmVEO1NBS2JFLFFBTGFGO2NBQVFDLFVBTWI7U0FES0UsUUFMUUY7S0FLSSxrQkFMNUJULE9BS0dVLE9BQWFDOztRQUdWQyxRQVJVSjthQUFRQyxVQU9iO1FBQ1dJLFFBUkVKO0lBUVUsa0JBUjFCUixPQVFGVyxPQUFnQkM7R0FBc0M7WUFHOUR2USxZQVFFd1EsYUFBYUMsYUFBYTdNLEtBQUlDO0lBQ2xDLFNBRGtDQTtLQUd0QixJQURQQyxLQUY2QkQsUUFJNUJFLFFBRE0seUJBSGtCSDtLQUs1QixrQkFMRTRNLGFBSUV6TSxPQUZERDs7SUFLTyxJQURKRSxPQU4wQkgsUUFRNUJJLFFBRE0seUJBUGtCTDtJQVM1QixrQkFUZTZNLGFBUVh4TSxPQUZFRDtHQUdjO1lBUWhCK0QsS0FFQXBlLEdBRlE0UTtJQUNWLFNBQ0U1USxNQUFnQixPQUFoQkE7UUFDRyttQixNQURIL21CO0lBQ1Esa0JBSEE0USxHQUdMbVc7R0FBUTtHQVNMO0lBQU4vVjs7O2dCQUpBaFIsR0FGTzRRO1FBQ1QsU0FDRTVRLE1BQWdCLE9BQWhCQTtZQUNHK21CLE1BREgvbUI7UUFDUSxXQUFHLFdBSEo0USxHQUdKbVc7T0FBYTtZQUloQmpKLFNBQU85ZCxHQUFJLFdBQUpBLEdBQVE7OzRDQWJmb2UsTUFZQXBOLEtBQ0E4TTs7Ozs7Ozs7Ozs7O1lBR0p0RCxVQUFVd00sVUFBU0MsYUFBWXRXO0lBQ2pDLFNBRGlDQSxVQUU1QnVXLEtBRjRCdlcsTUFFdEIsa0JBRkNxVyxVQUVQRTtRQUNHQyxRQUh5QnhXO0lBR2hCLGtCQUhJc1csYUFHYkU7R0FBMEI7WUFHaENDLEtBQUtwbkIsR0FBSSxXQUFKQSxHQUFXO1lBQ2hCcW5CLE1BQU1oTCxRQUFTLGtDQURmK0ssTUFDTS9LLFFBQW9DO1lBRTFDaUwsVUFBVTNXLEdBQUdDO0lBQ2YsU0FEWUQsTUFFRyxPQUZIQTtRQUdKM1EsSUFISTJRO0lBR0MsV0FBTSxXQUhKQyxHQUdQNVE7R0FBZ0I7WUFNbEJ1bkIsT0FBS3ZuQixHQUFHNFE7SUFDVixTQURPNVEsTUFFUyxPQUZUQTtRQUdDd1YsSUFIRHhWO0lBR00sa0JBSEg0USxHQUdGNEU7R0FBUTtHQUdSLElBQU5nUyx3QkFmSkY7WUFnQklHLFNBQU9qUyxHQUFJLFdBQUpBLEdBQVc7NkNBUGxCK1IsUUFNQUMsT0FDQUM7WUFHSkMsYUFBUSw4QkFFUTtZQUdoQkMsZ0JBQVcsOEJBRUk7WUFHZlQ7SUFBSyxtQkFFTTtRQURSbG5CO0lBQUssV0FBTEE7R0FDWTtZQUdmbW5CO0lBQVEsbUJBQ0E7UUFDRm5uQjtJQUFLLFdBQUxBO0dBQVc7WUFHakI0bkIsVUFBVXBSLEtBQUsyUTtJQUNqQixLQURZM1EsS0FHRixXQUhPMlE7UUFFVm5uQixJQUZLd1c7SUFFQSxXQUFMeFc7R0FDYztZQUduQjhRLEtBQUtvTyxHQUFHdE87SUFDVixTQURPc08sTUFHTTtRQURSbGYsSUFGRWtmO0lBRUcsa0JBRkF0TyxHQUVMNVE7R0FDVTtZQUdiNm5CLFdBQVczSSxHQUFHdE87SUFDaEIsU0FEYXNPLE1BRUg7UUFDRmxmLElBSEtrZjtJQUdBLGtCQUhHdE8sR0FHUjVRO0dBQVE7WUFHZDhuQjtJQUFnQyx1QkFDN0I5bkIsY0FBSyxXQUFMQTtRQUNHK21CO0lBQUssV0FBTEE7R0FBYTtZQUduQmdCO0lBQWdDLHVCQUMxQi9uQixjQUFLLFdBQUxBO1FBQ0MrbUI7SUFBSyxXQUFMQTtHQUFZO1lBR25CaUIsV0FBV0MsTUFBTWQsT0FBUSxPQUFkYyxpQkFBTWQsT0FBMkM7WUFFNURlLFNBQVN0WDtJQUNYLElBQUksY0FBRyxXQURJQSxRQUNQO1VBQ0ZxTCw2Q0FBTyxXQUFQRjtHQUFnQjtZQUdoQm9NO0lBQVMsdUJBQ05ub0IsY0FBSyxPQUFMQTtRQUNHK2I7SUFBTyxrQ0FBUEE7R0FBZ0I7WUFHdEJxTTtJQUFpQix1QkFDZHBvQixjQUFLLE9BQUxBO1FBQ0dnYztJQUFPLG9DQUFQQTtHQUFtQjtZQVl6QnFNLFFBQVFwVyxJQUFHQyxJQUFJZ1YsSUFBSW9CO0lBQ3JCLFNBRFVyVztTQUdMc1csTUFIS3RXO2NBQUdDLFdBR0FzVyxNQUhBdFcsT0FHTyxXQUFHLFdBSE5nVixJQUdacUIsS0FBUUM7U0FEQ2hULElBRkR0RDs7O1NBSUx1VyxPQUpFeFc7Y0FBR0M7VUFJT3dXLE9BSlB4VztNQUllLFdBQU0sV0FKYm9XLEtBSWJHLE1BQVlDOztTQUZObFQsSUFFTmlUOztJQUYyQixXQUFyQmpUO0dBRW1DO1lBRy9DbVQsZUFBZWhWO0lBQ2pCO0tBQWUsbUNBREVBLEdBM0NmbVU7S0E0Q01jO0tBQUoxQjtJQUNKLE9BRFEwQix1QkFBSjFCO0dBR2tCO1lBR3BCMkIsb0JBQW9CbFY7SUFBSSxvQkFBa0QsU0FBRTtJQUExQix5QkFQbERnVixlQU9vQmhWO0dBQXlEOzs7O09BL1E3RTBOO09BNkNBNUc7T0FnQkNGO09BeUJEdlQ7T0FjQUM7T0FjQW9QOzs7Ozs7Ozs7Ozs7T0F5Q0FtRTtPQU1BNE07T0FDQUM7T0FxQkFLO09BS0FDO09BS0FUO09BNkNBaUI7T0FLQUM7T0E3Q0FqQjtPQUtBUztPQU1BOVc7T0FNQStXOztPQW5EQVA7T0E2RkFlO09BT0FNO09BT0FFO09BbERBZjtPQUtBQztPQUxBRDtPQVVBRTtPQUVBRTtXQWxEQVIsT0FLQUM7OztFM0JyTUw7Ozs7OztHNEJnQjZCOzs7SUFOWjs7Ozs7O0U1QlZqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7STZCTUsvSjtZQU1BOU0sS0FBTUosTUFBS0MsR0FBR0M7SUFBSSxPQUFtQjthQUEvQkYsTUFBS0Msc0JBQWtDb0QsR0FBSyxrQkFBcENuRCxHQUErQm1ELEdBQVE7R0FBQztZQUN0RCtVLE1BQU9wWSxNQUFLQyxHQUFHQztJQUFJLE9BQWtCO2FBQTlCRjthQUFLQzs7c0JBQThCdVMsR0FBRW5QO2NBQUssT0FBRyxXQUFyQ25ELEdBQTZCbUQsS0FBaUIsNEJBQW5CbVA7YUFBK0I7R0FBQztZQUUxRTZGLElBQWNyWSxNQUFhc1k7STdCZmhDLGdCNkJlOERyWSxHQUFHQztrQkFDbENzUyxHQUFFblA7TUFBZSxxQkFEaUJuRCxHQUNoQ21EO01BQWUsa0JBRGhCaVYsTUFDRDlGO0tBQXNCO0tBQTNCLGtCQURQeFMsTUFBMkNDLEdBQTlCcVksV0FDc0I7O1lBR2pEQyxZQUFhdlksTUFBTUwsTUFBTU8sR0FBRUQ7SUFDN0IsT0FBWTthQWRWaU47c0JBY2lCSztjQUFQO3NCQUVSO3dCQUhXdk47d0JBQWNDO3dCQUFSTjtpQ0FHSzZZLEtBQUlDO3lCQUNqQixJQUVKM1QsSUFGSSxXQUpjNUUsR0FHRHNZLEtBQUlDO2tDQUdyQjNULE1BQWdCLGtCQUxOeUksT0FLVnpJOzZCQURVeFYsSUFDVndWO3lCQURlLE9BQUx4Vjt3QkFDYzthQUFHOztZQUdsQ29wQixXQUFZMVksTUFBTUwsTUFBTU8sR0FBR3lZLFFBQU8xWTtJQUNwQyxPQUFZO2FBdkJWaU47c0JBdUJpQks7Y0FBUCxPQUVSO3VCQUh5Qm9MO3VCQUd6Qjt5QkFIVTNZO3lCQUFzQkM7eUJBQWhCTjtrQ0FHTTZZLEtBQUlDOzBCQUNqQix1QkFKYXZZLEdBR0FzWSxLQUFJQztpREFFS25wQixjQUFLLE9BQUxBOzhCQUNyQittQjswQkFBSyxrQkFMQTlJLE9BS0w4STt5QkFBYTthQUFHOztZQUc1QnVDLFFBQVM1WSxNQUFLQyxHQUFHM0o7SUFDbkIsT0FBcUI7YUFEVjBKO2FBQUtDOztzQkFDVXVZLEtBQUlLO2NBQzVCLEtBRHdCTCxLQUVkLFdBRmtCSztrQkFHckJwcEIsTUFIaUIrb0I7Y0FHUCxzQkFKQWxpQixTQUlWN0csS0FIcUJvcEIsa0JBQUpMO2FBR21DO0dBQUM7WUFHNURNLFFBQVM5WSxNQUFLQyxHQUFHM0o7SUFDbkIsT0FBcUI7YUFEVjBKO2FBQUtDOztzQkFDVXVZLEtBQUlLO2NBQzVCLEtBRHdCTCxLQUVkLFdBRmtCSztrQkFHckJycEIsTUFIaUJncEI7Y0FHUCx1QkFKQWxpQixTQUlWOUcsS0FIcUJxcEIsT0FBSkwsVUFBSUs7YUFHK0I7R0FBQztZQUc1RDlXLE9BQVEvQixNQUFLeVA7SUFBSSxPQUFrQjthQUEzQnpQO2FBQUt5UDs7c0JBQTJCK0ksWUFBUyxtQ0FBVEEsUUFBZ0I7R0FBQztZQUV6RHpFLFNBQVUzVCxNQUFLcVA7SUFDakIsT0FBWTthQWhEVnZDO3NCQWdEZXhGO2NBQ2YsV0FGVXRILE1BQUtxUCxtQkFFSyxrQkFETC9ILE1BQ21CO2NBQWxDO2FBQ0k7R0FBQztZQUdMdkYsT0FBUS9CLE1BQUtxUCxHQUFHdlA7SUFDbEIsT0FBWTthQXREVmdOO3NCQXNEZXhGO2NBQ2Y7Z0JBRlF0SDtnQkFBS3FQO3lCQUVFbmdCO2lCQUFRLHFCQUZQNFEsR0FFRDVRO2lCQUFRLGFBQVMsV0FEakJvWTtnQkFDOEI7Y0FBN0M7YUFDSztHQUFDO1lBR05sRixRQUFTcEMsTUFBS3FQLEdBQUd2UDtJQUNuQixPQUFZO2FBNURWZ047c0JBNERleEY7Y0FDZjtnQkFGU3RIO2dCQUFLcVA7eUJBRUNuZ0I7aUJBQVkseUJBRlY0USxHQUVGNVE7OEJBQXVCLFdBRHZCb1k7Z0JBQ3FDO2NBQXBEO2FBQ0k7R0FBQztZQUdMcVIsU0FBVTNZLE1BQUtILEdBQUdDO0lBQ3BCLE9BQVk7YUFsRVZnTjtzQkFrRWV4RjtjQUNmO2dCQUZVdEg7Z0JBQUtIO3lCQUVBM1E7aUJBQ1AsSUFFSjZULE1BRkksV0FIVWpELEdBRUg1UTt3QkFHWDZULE1BQWlCLFdBSk51RSxHQUlYdkU7Z0JBQTZCO2NBSGpDO2FBSUk7R0FBQztZQUdMNlYsS0FBTTVZLE1BQUtxUCxHQUFHdlA7SUFDaEIsT0FBWTthQTNFVmdOO3NCQTJFZXhGO2NBQ2Y7Z0JBRk10SDtnQkFBS3FQO3lCQUVJbmdCO2lCQUFRLHFCQUZUNFEsR0FFQzVRO2lCQUFRLGFBQWtCLFdBRDFCb1ksT0FDQXBZO2dCQUFrQztjQUFqRDthQUNJO0dBQUM7WUFHTHlRLFFBQVNDLE1BQUt5UDtJQUFhLHFCQUFsQnpQLE1BQUt5UCxlQUFzQytJLEtBQUlscEIsR0FBSyxXQUFMQSxHQUFKa3BCLEtBQWlCO0lBQTFDO0dBQTRDO1lBRXZFUyxTQUFVbFgsUUFBUTNCLE1BQUtxUDtJQUN6QixJQUFJNUssa0JBQ0EzTDtJQUNKO01BSG9Ca0g7TUFBS3FQO2VBR1ZuZ0I7T0FDYixTQUZFNEo7UUFFd0MscUJBSmhDNkksUUFBYTBOO1FBQ3JCNUssV0FHc0IsZ0NBRFh2Vjs7aUJBRFg0SjtPQUdGLHlCQUpFMkwsMEJBRVd2VjtPQUFmLG9DQURJNEo7TUFJSTtXQUxKMkw7R0FNRTs7UUFNRjdFOztTQUVBa1osa0JBRzBCalosR0FBR0MsR0FBSyxPQTlGcENFLEtBeUZFSixNQUswQkMsR0FBR0MsR0FBb0I7O1NBRHpDaVosbUJBRlJELFNBRVFDOzs7U0FJUkMsb0JBRzBCblosR0FBSyxPQTdEakM4QixPQWtERS9CLE1BVzBCQyxHQUFtQjs7U0FEckNvWix1QkFGUkQsV0FFUUM7YUFJUkMsV0FBU3JaLEdBQUksT0E5RGY4VCxTQWtERW1GLFFBWVNqWixHQUFvQjthQUM3QnNaLE1BQUlDLEdBQUV2WixHQUFJLGtCQXJHWm9ZLElBc0ZFclksTUFlSXdaLElBQUV2WixHQUFpQjthQUN2QndaLFFBQU14WixHQUFHQyxHQUFJLE9BeEdma1ksTUF3RkVwWSxNQWdCTUMsR0FBR0MsR0FBb0I7YUFDN0J3WixTQUFPelosR0FBR0MsR0FBSSxPQTNEaEJpQyxPQTRDRStXLFFBZU9qWixHQUFHQyxHQUFxQjthQUMvQnlaLFVBQVExWixHQUFHQyxHQUFJLE9BdERqQnNDLFFBc0NFMFcsUUFnQlFqWixHQUFHQyxHQUFzQjthQUNqQzBaLFdBQVMzWixHQUFHQyxHQUFJLE9BakRsQjZZLFNBZ0NFRyxRQWlCU2paLEdBQUdDLEdBQXVCO2FBQ25DMlosT0FBSzVaLEdBQUdDLEdBQUksT0F6Q2Q4WSxLQXVCRUUsUUFrQktqWixHQUFHQyxHQUFtQjthQUMzQjRaLFVBQVE3WixHQUFJLE9BcENkRixRQWVFQyxNQXFCUUMsR0FBbUI7YUFDM0I4WixXQUFTOVosR0FBSSxPQW5DZmdaLFNBcUJFRyxVQU5BRixRQW9CU2paLEdBQTRCO2FBQ3JDK1osVUFBUS9aLEdBQUczSixTQUFVLE9BdkZ2QnNpQixRQWdFRTVZLE1BdUJRQyxHQUFHM0osU0FBa0M7YUFDN0MyakIsVUFBUWhhLEdBQUczSixTQUFVLE9BakZ2QndpQixRQXlERTlZLE1Bd0JRQyxHQUFHM0osU0FBa0M7YUFDN0M0akIsY0FBWWphLEdBQUdOLE1BQU1PLEdBQUksT0EzRzNCcVksWUFrRkV2WSxNQXlCZUwsTUFBTU8sR0FBVEQsR0FBeUM7YUFDckRrYSxhQUFXbGEsR0FBR04sTUFBTU8sR0FBR3lZO0tBQVMsT0FuR2xDRCxXQXlFRTFZLE1BMEJjTCxNQUFNTyxHQUFHeVksUUFBWjFZO0lBQXdEO0lBM0JuRTtZQVNBbVo7WUFNQUU7WUFaQUo7WUFGQWxaO1lBeUJBa2E7WUFDQUM7WUFUQVQ7WUFDQUM7WUFGQUY7WUFEQUY7WUFLQU07WUFEQUQ7WUFFQUU7WUFDQUM7WUFDQUM7WUFDQUM7Ozs7Ozs7O0tBMUJJYjs7Ozs7Ozs7Ozs7Ozs7OzthQWlESmlCLElBQUlwYSxHQUFFNFk7S0FBTSxPQUFZLFdBakRwQjFXLFFBaURBbEMsR0FBb0Isb0JBQWxCNFk7SUFBbUM7O1lBQXpDd0I7WUFqRElqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F2Rk5oWjtPQUNBZ1k7T0F3QkFRO09BT0FFO09BT0EvVztPQW1DQWhDO09BdkVBc1k7T0FJQUU7T0FTQUc7T0F5QkEzRTtPQU1BNVI7T0FNQUs7T0FlQXdXO09BVEFEO09BaUJBRTs7Ozs7OztTQVdNRzs7Ozs7Ozs7Ozs7Ozs7OztpQkFzQ0ppQixJQUFJcGEsR0FBRW9ELEdBQUc5TTtTQUFRLE9BQVksV0F0Q3pCNEwsUUFzQ0FsQyxHQUF5QixXQUFwQjFKLE9BQUg4TTtRQUFnQzs7Z0JBQXRDZ1g7Z0JBdENJakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFN0JuR1g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJOEJNS3pJO0lBQ0E1Rzs7WUFFQ0YsZUFDQ3NMO0lBQW9CLG9DQUFwQkE7R0FBd0Q7Z0JBS3REbFYsR0FBR0M7SUFBSTs7b0NBQVBEOzs7Ozs7OzthQUFlLGtCQUFaQzs7R0FBc0I7WUFFN0I1SixRQUFRZ2tCLFdBQVUvWSxJQUFHQztJQUN2QixHQUFHLDZCQURpQkQsSUFBR0MsS0FDRTsyQkFERkE7Ozs7Ozs7OzJCQUFIRDs7Ozs7Ozs7SUFDaUMsa0JBRDNDK1k7R0FDcUQ7WUFHN0QvakIsTUFBTWdrQixTQUFRaFosSUFBR0M7SUFBSyxHQUFHLDZCQUFYRCxJQUFHQyxLQUE4QjsyQkFBOUJBOzs7Ozs7OzsyQkFBSEQ7Ozs7Ozs7O0lBQThELGtCQUF0RWdaO0dBQWdGO09BQ3RGNVU7WUFLSXlILFNBQU85ZCxHQUFJLDRCQUFKQSxHQUFjO1lBQ3JCb2UsS0FBS3pOLEdBQUdDO0lBQUk7O29DQUFQRDs7Ozs7Ozs7YUFBbUIscUJBQWhCQzs7NENBQWdCOzs7R0FBYztHQUVoQztJQUFOSTs0Q0FGQW9OLE1BREFOLFVBR0E5TTs7Ozs7Ozs7Ozs7O1lBTUZ1TCxZQUFVMk8sV0FBVXZhO0lBQ3RCLEtBQUcsbUJBRG1CQTtLQUNvQjsyQkFEcEJBOzs7Ozs7OztJQUNLLGtCQURmdWE7R0FDOEQ7R0FKekQ7c0JBR2YzTzs7O09BbkJGdlY7T0FJQUM7T0FDQW9QO09BaEJBZ0w7T0FDQTVHO09BRUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFOUJUTjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0krQktLak07Ozs7Ozs7Ozs7Ozs7WUFFQTZjLHVCQUF3QkMsS0FBS3RiLEtBQUt1YjtJQUNwQyxHQUQwQkQsU0FDVixXQUhkOWMsbUJBRXdCOGM7T0FBS3RiLFNBRWYsV0FKZHhCLG1CQUU2QndCO2NBS3RCLDRCQUwyQnViLGNBQUx2YixPQUFMc2I7O2NBTXJCLFdBUkg5YyxtQkFFd0I4YyxLQUFLdGIsS0FBS3ViOztHQU13QztZQUkxRUMsa0JBQW1CRixLQUFLdGIsS0FBS3ViO0lBWS9CO0tBQUlFLE9BQU8sNEJBWlVILEtBQUt0YjtLQWFFLGtDQWJHdWIsY0FZM0JFO0tBQ0QsbUNBYmtCSCxLQUFLdGI7S0FhdkIsd0NBREN5YjtXQUNEO2lCQXZCREosdUJBVW1CQyxLQUFLdGIsS0FBS3ViO0dBY29CO1lBR2pERyxnQkFBa0JoVixLQUFVMUcsWUFBUXViO0lBQ3RDLEdBRG9CN1UsU0FBTUMsTUFBTkQsY0FBTUMsY0FBTjJVO0lBQ3BCLEdBRDhCdGI7U0FHckJsRyxJQUhxQmtHLFFBQzFCMmIsUUFFSzdoQjs7U0FGTDZoQixRQUdRLDRCQUowQkosY0FBbEJEO0lBakJsQkUsa0JBaUJrQkYsS0FDaEJLLE9BRGtDSjtJQU90QyxXQVBvQkQsS0FDaEJLO0dBTUk7R0FHTztrQkFyQ2JOOztVQTJCQUssaUJBakJBRjs7OztFL0JqQkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZZ0NPT0ksY2hDUFA7R2dDRWUsZUFLUkE7WUFHRkMsT0FBT0MsS0FBSUM7SUFDYix1QkFEU0Q7Ozs7Ozs7O0lBQ0MsSUFBTkUsUUFBTSw2Q0FER0Q7Ozs7Ozs7O0lBRUgsSUFBTkUsUUFBTTtJQUNWLDRCQURJQSxPQURBRDtHQUU2QjtZQUUvQkUsYUFBYUM7SUFDZixTQUFJQyxrQkFBa0JoTjtLQUNwQix5REFEb0JBO0lBQ3VCO0lBRTdDLG9CQUFzRCxPQUp2QytNLFVBSThDO0lBQWxCLDRDQUh2Q0M7R0FHMEQ7WUFFNURDLFVBQVVDO0lBQWEsd0NBQWJBO0dBQTJDO29DQVhyRFQsUUFLQUssY0FNQUc7OztFaENyQkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WWlDbUJLRSwrQkFBZ0NDO0lBQ2xDOztPQURrQ0EscUNBSWpCO0lBRWI7R0FDa0Y7WUFlbEZDLEtBQUs1YjtJQUFJLHVCQUFKQTs7Ozs7Ozs7SUFBMkI7R0FBYztZQUM5Q3NYLEtBQUt0WDtJQUFJLHVCQUFKQTs7Ozs7Ozs7SUFBMkI7R0FBYztZQUM5QzZiLE1BQUk3YixHQUFFM1E7SUFBSSx1QkFBTjJROzs7Ozs7OztJQUFNLDZDQUFKM1E7R0FBMEM7WUFDaER5c0IsTUFBTTliLEdBQUUzUTtJQUFJLHVCQUFOMlE7Ozs7Ozs7O0lBQU0sNkNBQUozUTtHQUE0QztZQUNwRDBzQixNQUFNL2IsR0FBRTNRO0lBQUksdUJBQU4yUTs7Ozs7Ozs7SUFBTSw2Q0FBSjNRO0dBQTRDO1lBQ3BEMnNCLFVBQVVoYyxHQUFFM1E7SUFBSSx1QkFBTjJROzs7Ozs7OztJQUFNLDZDQUFKM1E7R0FBZ0Q7WUFDNUQyZ0IsS0FBS3hLO0lBQXFCLDJDQUFyQkE7SUFBcUI7R0FBNkI7WUFDdkRoRyxLQUFLUTtJQUFJLHVCQUFKQTs7Ozs7Ozs7SUFBa0I7O0dBQXVDO1lBQzlEaWMsT0FBS2pjO0lBQUksVUFOVDZiLE1BTUs3YjtJQUFJO0dBQStCO1lBQ3hDa2MsTUFBTWxjO0lBQUksVUFQVjZiLE1BT003YjtJQUFJO0dBQStCO1lBRXpDbWMsZUFBZ0JSO0lBakNsQkQsK0JBaUNrQkM7SUFFSjs7R0FBcUM7T0FHakRYOztJQWNRLElBQUpoYixJQUFJO0lBQ1I7UUFYQXNiLFlBWUEsMEJBRkl0Yjs7OztLQVZKc2I7OztTQWtCYyxVQTNCZGE7O3dDQTJCYzs7O1lBR2RDLGNBQWNwYyxHQUFFcWM7SUFDbEIsb0JBRGtCQTtjQUdLLG9CQXhDckJOLE1BcUNjL2IsR0FHZ0Isb0JBSGRxYztjQXZDaEJSLE1BdUNjN2IsR0FBRXFjO0dBR3dDO1lBR3hEQyxjQUFjdGMsR0FBRXFjO0lBRWxCLG9CQUZrQkEsUUE1Q2hCUCxNQTRDYzliLEdBQUVxYyxTQTdDaEJSLE1BNkNjN2IsR0FBRXFjO0dBSXdDO09BR3hERSw0QkFiQUgsZ0JBTUFFO1lBZUVFLE9BQUt2VyxPQUFRLDJCQTlEZjJWLEtBOERPM1YsUUFBMkI7R0FDcEMsU0FIRXdXLGlCQUdFeFc7SUFDRjtLQUV1Qyw0QkFKckN1VyxPQUNBdlc7S0FHQSxxQkFBUSxzQkFKUnVXLE9BQ0F2VztJQUNGLHNCQUZFdVcsT0FDQXZXO0dBR2tFO1lBS2xFeVcsT0FBS3pXLE9BQVEsT0F2RWYyVixLQXVFTzNWLE9BQTJCO0dBQ3BDLFNBSEUwVyxpQkFHRTFXO0lBQTZCLFVBRDdCeVcsT0FDQXpXO0lBQVMsT0FEVHlXLE9BQ0F6VztHQUF5RDtZQUczRDJXLHlCQUF5QjNXO0lBQVEsT0FBa0Isb0JBZm5Ed1csaUJBZXlCeFc7R0FBa0Q7WUFDM0U0Vyx5QkFBeUI1VyxPQUFRLE9BUGpDMFcsaUJBT3lCMVcsT0FBa0Q7O0lBRTNFNlc7MEJBSEFGLDJCQUNBQztZQVFBRSwrQkFBK0I5VztJQUNqQywyQkF6QkV3VyxpQkF3QitCeFc7R0FDZTtZQUc5QytXLCtCQUErQi9XLE9BQ2pDLE9BcEJFMFcsaUJBbUIrQjFXO0dBQ2U7O0lBRzlDZ1g7O1NBUkFGO1NBSUFDO1lBVUFFO0lBQXFCcEwsTUFBS3FMLGFBQVlDLGFBQVlDO0lBQ3BEO0tBSUUsaUJBTGtEQSxpQkFBWkQ7S0FJdEMsaUJBSmtEQyxpQkFBeEJGO0lBQzVCLHVDQUR1QnJMO0dBTW5CO1lBSUZ3TCxTQUtFclgsT0FBTXNYLElBQUdDO0lBQ1gsR0FEV0EsS0FBSEQsSUFmUkwsOEJBZVFLLElBQUdDO0lBRUEsSUFBUEMsT0FBTyw0QkFGQUQsSUFBSEQ7T0FFSkU7S0FFQzs7TUFBTSxNQXZDWFgsMkJBbUNFN1c7TUFJUTt3Q0FKRnNYOztZQUVKRTtLQUlNLFVBakVWbEIsTUEyREV0VyxPQU1rQix5QkFKaEJ3WDtLQUlNLG1DQU5GRjs7SUFIUjtLQUFVLElBQU4xQixRQWhDSmlCLDJCQW1DRTdXO1FBQU1zWCxNQUhKMUIsa0JBR08yQixJQUZvQixPQUQzQjNCOztHQVVxQjtZQUd6QjZCLFdBT0V6WCxPQUFNc1gsSUFBR0M7SUFDWCxHQUFHLGdDQURLRCxJQUFHQztLQWhDWE4sZ0NBZ0NRSyxJQUFHQztJQUVBLElBQVBDLE9BRk9ELEtBQUhEO0lBR0wsbUNBRENFO0tBRUM7WUFKR0YsTUE3RFJaLGlCQTZERTFXOztJQUtNLG1DQUhKd1g7S0FJQyxPQU5HRixLQS9IUnpCLE1BK0hFN1YsT0FNdUIsNEJBSnJCd1g7SUFOSjtLQUFVLElBQU41QixRQXpESmMsaUJBNkRFMVc7S0FIYztPQUFiLGdDQURDNFYsT0FJSTBCO1VBSFEsZ0NBRFoxQixPQUlPMkI7TUFIb0IsT0FEM0IzQjs7R0FXcUI7WUFHekI4QixlQU9FMVgsT0FBTXNYLElBQUdDO0lBQ1gsR0FBRyxnQ0FES0QsSUFBR0M7S0FqRFhOLG9DQWlEUUssSUFBR0M7SUFFQSxJQUFQQyxPQUZPRCxLQUFIRDtJQUdMLG1DQURDRTtLQUVDO1lBSkdGLE1BdkRSTixxQkF1REVoWDs7SUFLTSxtQ0FISndYO0tBSUMsT0FOR0YsS0E5SVJ2QixVQThJRS9WLE9BTTJCLGdDQUp6QndYO0lBTko7S0FBVSxJQUFONUIsUUFuREpvQixxQkF1REVoWDtLQUhjO09BQWIsZ0NBREM0VixPQUlJMEI7VUFIUSxnQ0FEWjFCLE9BSU8yQjtNQUhvQixPQUQzQjNCOztHQVdxQjtZQUd6QitCLFdBT0UzWCxPQUFNc1gsSUFBR0M7SUFDWCxHQUFHLHlCQURLRCxJQUFHQztLQWxFWE4sZ0NBa0VRSyxJQUFHQztJQUVBLElBQVBDLE9BQU8sdUJBRkFELElBQUhEO0lBR0wsc0JBRENFO0tBRUM7O2NBSkdGLElBSUksdUJBNUdaZCxpQkF3R0V4Vzs7SUFLTSxxQkFISndYO0tBSUM7Y0FOR0YsSUFoS1J4QixNQWdLRTlWLE9BTXVCLDRCQUpyQndYO0lBTko7S0FBVSxJQUFONUIsUUFwR0pZLGlCQXdHRXhXO0tBSGMsR0FBYixrQkFEQzRWLE9BSUkwQixPQUhRLHVCQURaMUIsT0FJTzJCO01BSG9CLE9BRDNCM0I7O0dBV3FCO1lBZ0J6QmdDLFFBQU01WCxPQUFNdVg7SUFBSztLQVJRO01BQXZCTSxLQW5MRmxDLEtBMkxNM1Y7TUFQSjhYLEtBcExGbkMsS0EyTE0zVjtNQU5NLGtDQUZWNlg7TUFFUyx1Q0FEVEM7TUFDQUMsU0FBUztLQUdWLG1DQUhDQTtNQU1lLG1DQU5mQSxRQU1VUjs7R0FBeUI7WUFFckNTLFlBQVloWSxPQUFNc1gsSUFBR0M7SUFDdkIsR0FDRyxnQ0FGaUJELElBQUdDO0tBM0ZyQk4sZ0NBMkZrQkssSUFBR0M7SUFHakIsVUFMSkssUUFFWTVYLE9BR0ksNEJBSEt1WCxJQUFIRDtJQUdkLG1DQUhjQTtHQUdRO0dBSWxCLElBQVZXLFlBQVUsZ0NBaExSNUM7WUFrTEY2QztJQUFVLE9BdE1SdkMsS0FzTW1CLGdDQUZyQnNDO0dBRW9EO1lBQ3BERSxNQUFJL3VCO0lBQUksT0FqSk5rdEIsTUFpSmdCLGdDQUhsQjJCLFlBR0k3dUI7R0FBK0M7WUFDbkRndkIsUUFBTWh2QjtJQUFJLE9Bck1SeXNCLE1BcU1vQixnQ0FKdEJvQyxZQUlNN3VCO0dBQWlEO1lBQ3ZEaXZCLFlBQVVqdkI7SUFBSSxPQXBNWjJzQixVQW9NNEIsZ0NBTDlCa0MsWUFLVTd1QjtHQUFxRDtZQUMvRGt2QixRQUFNbHZCO0lBQUksT0F0TVIwc0IsTUFzTW9CLGdDQU50Qm1DLFlBTU03dUI7R0FBaUQ7WUFDdkRtdkIsUUFBTW52QjtJQUFJLE9BaEJSd3VCLFFBZ0JvQixnQ0FQdEJLLFlBT003dUI7R0FBaUQ7WUFDdkRvdkIsV0FBU3B2QixHQUFFQztJQUFJLE9BaEdiZ3VCLFNBZ0c0QixnQ0FSOUJZLFlBUVM3dUIsR0FBRUM7R0FBc0Q7WUFDakVvdkIsYUFBV3J2QixHQUFFQztJQUFJLE9BbEZmb3VCLFdBa0ZnQyxnQ0FUbENRLFlBU1c3dUIsR0FBRUM7R0FBd0Q7WUFDckVxdkIsaUJBQWV0dkIsR0FBRUM7SUFBSSxPQWxFbkJxdUIsZUFrRXdDLGdDQVYxQ08sWUFVZTd1QixHQUFFQztHQUE0RDtZQUM3RXN2QixhQUFXdnZCLEdBQUVDO0lBQUksT0FsRGZzdUIsV0FrRGdDLGdDQVhsQ00sWUFXVzd1QixHQUFFQztHQUF3RDtZQUNyRXV2QixjQUFZeHZCLEdBQUVDO0lBQUksT0FuQmhCMnVCLFlBbUJrQyxnQ0FacENDLFlBWVk3dUIsR0FBRUM7R0FBeUQ7WUFDdkV3dkI7SUFBVSxPQWhOUnhILEtBZ05tQixnQ0FickI0RztHQWFvRDtZQUNwRGE7SUFBVSxPQTFNUjlDLE9BME1tQixnQ0FkckJpQztHQWNvRDtZQUNwRGM7SUFBVyxPQTFNVDlDLE1BME1xQixnQ0FmdkJnQztHQWVzRDtZQUN0RGUsVUFBVXpaO0lBQXVCLElBbE1yQnhGLElBa01xQixnQ0FoQmpDa2U7SUFsTDhCLGtCQUY1QmxELFFBRVVoYixHQVpWZ1EsS0E4TVF4SztHQUEyRDtZQUNyRTlGLEtBQUs4RixNQUFPLE9BRFp5WixjQUNLelosT0FBMkI7WUFDaEMwWixVQUFXdkQ7SUE1T1hELCtCQTRPV0M7SUFBOEIsT0FGekNzRCxVQTVORjtHQThOMkU7WUFDekVFLFVBQVV6aEI7SUFBSSxrQkF2TVpzZCxRQXVNeUIsZ0NBbkIzQmtELFlBbUJVeGdCO0dBQWtEOzs7O09BRjVEZ0M7T0FEQXVmO09BRUFDO09BaEJBZjtPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQzs7UUEvTEUxRDtRQWRBdEw7UUFLQW1NO1FBSkEzYztRQVBBb2M7UUFzREFXO1FBbkRBVDtRQUVBRTtRQURBRDtRQXVMQThCO1FBL0VBUDtRQWVBSTtRQWlCQUM7UUFpQkFDO1FBZ0NBSztRQTVMQTNHO1FBT0EyRTtRQUNBQztPQThNRmlEOzs7RWpDaFFMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WWtDT0tDLFFBQVV2WixVQUFpRDFHLEtBQUlhO0lBR2pFLEdBSFk2RjtTQUFlQyxNQUFmRCx1QkFBZUM7O1NBQWZ1WjtJQUdaLFlBSHlEQyxnQkFBTjdFLE1BQU02RSxnQkFBTjdFO0lBR25ELElBQUlDLGVBSDZEMWE7SUFJakUsR0FKNkRiO1NBTXBENkQsSUFOb0Q3RCxRQUl6RDJiLFFBRUs5WDs7U0FGTDhYLFFBR1EsNEJBSlJKLGNBSCtDRDtJQVNuRCw4Q0FUbURBLEtBSS9DSyxPQURBSjtJQU9ZLElBQVo2RSxZQUFZLDRCQU5aekU7T0FNQXlFO1NBQ0p0bUIsSUFESXNtQjs7TUFFVztPQUFUQyxTQUFTLDRCQVpvQy9FLEtBV25EeGhCO09BR3FELGtDQUhyREE7T0FHdUIscUNBZFhvbUI7T0FjTkksV0FBVyw0QkFka0NoRjtNQWVqRCxpQkFmK0R6YSxHQVkzRHdmLFFBRUFDO01BSE47Ozs7OztHQUtJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FoQkZMOzs7RWxDUEw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1ltQ0dLTSxRQUFNbFEsVUFBTSxPQUFOQSxFQUFPO1lBTWJtUSxJQUFJMWYsR0FBRTVRLEdBQUksV0FBSSxXQUFWNFEsR0FBRTVRLEdBQWE7WUFFbkJ1d0IsUUFBUTNmO0lBQ1YsSUFDRSxtQkFGUUE7VUFNUjRmLHVDQUFLLE9BQUxoYjtHQUFNO1lBUU5pYixRQUFRN2YsR0FBRThmLEdBQUUxd0IsR0FBSSxPQUFFLFdBQVY0USxHQUFVLFdBQVI4ZixHQUFFMXdCLElBQVc7WUFDdkIyd0IsS0FBSy9mLEdBQUU1USxHQUFFQyxHQUFJLGtCQUFSMlEsR0FBSTNRLEdBQUZELEdBQVc7WUFDZDR3QixjQUFlMU4sR0FBRXRTLEdBQUU1UTtJQUFJLElBQVJtakIsU0FBSTREO0lBQUk7YUFBUjVELEtBQXVCLE9BQW5CNEQ7S0FBcUQ7TUFBckQ4SixNQUFxRCxXQUF2RGpnQixHQUFFbVc7TUFBSjNELE1BQStDLDRCQUEvQ0Q7O01BQUk0RDs7R0FBMEQ7cUJBeEJqRnNKLFNBTUFDLEtBRUFDLFNBZ0JJSyxlQUZKSCxTQUNBRTs7O0VuQzFCTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SW9DNkJLL1Y7SUFHR2tLO0lBMkJGdks7Ozs7Ozs7OztJQWxERHZUOzs7O1lBRUNxUCxZQUNFNEQsS0FBSUM7SUFDTixPQURNQTs7T0FFSSxnQ0FGUkQ7O09BR1MsZ0NBSFRBO2VBSVcsZ0NBSlhBOztHQUkrQztHQVVwRCxTQU5HRCxLQU1DRTtJQUFLLElBSEFELE1BQU0saUNBQ1YsTUFiRjVELFlBWU00RCxLQUdMQztJQUZDO0dBRVU7R0FPZCxTQUZDbUgsVUFjQ3lQO0lBWkYsU0FZRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFYd0M7Ozs7bUJBRU07O29CQURKOzs7ZUFVMUNBOztNQUNBOzRDQWRFaE0sa0JBYUZnTTs7O01BREE7NENBWkVoTSxrQkFhRmdNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBUEE7OENBTkVoTSxrQkFhRmdNOzs7OztPQUhBOzZDQVZFaE0sa0JBYUZnTTs7O01BTEE7NENBUkVoTSxrQkFhRmdNOztJQUVjLCtDQWZaaE0sa0JBYUZnTTtHQUVvRjtZQUlyRnJXO0lBQ0Qsc0JBQ1csbUJBQ0Msb0JBQ0U7O0dBQTRCO1lBbUJ6Q3hULE1BQU04TSxHQUFFQyxHQUFJLDhCQUFORCxHQUFFQyxXQUFtQjtHQUVmO1lBT1pqQyxPQUFPbVIsR0FBSSxZQUFKQSx3QkFBNEQ7WUFFbkV6UjtJQUFTLHNCQUNELGtCQUNDLGtCQUNFOztHQUFDOzs7O09BL0Vaeks7T0FFQ3FQO09BU0EyRDtPQVdEcUg7T0FvQkE1RztPQVFDRjtPQTlCREs7T0E2Q0EzVDtPQVNBOEs7T0FFQU47Ozs7RXBDckZMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJcUNzK0JTc2Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBOW1CSkM7Ozs7Ozs7Ozs7Ozs7OztJQTlXQTFpQjtJQUtFK1M7SUFDQTVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFFQ0YsZUFDQ3NMO0lBQW9CLG9DQUFwQkE7R0FBc0Q7WUFZeEQ3ZSxRQUNFK2UsT0FBUWtMLE9BQVFDO0lBQ3BCLEdBQUcsb0NBRFNELE9BQVFDLFFBRWY7U0FGT0QsY0FBUUM7UUFLYkMsUUFMS0Y7U0FBUUMsT0FNTDtRQURLRSxRQUxBRjtJQUtZLGtCQUw1Qm5MLE9BS0dvTCxPQUFhQztHQUdzQjtZQUd4QzdVLFlBRUU4VTtJQURKLFlBS3VCO0lBRkYsSUFEZEMscUJBQ0NDLFdBQWEsV0FGakJGLFVBQ0dDO0lBRUgsd0JBRElDO0dBRW1EO0dBeEJuQyw2QkFNdEJ2cUIsU0FZQXVWO1lBY0YvQixVQUFVNUosR0FBRUQsR0FBSSx3QkFBSkEsR0FBRkMsR0FBZTtZQUN6QkwsUUFBUUksR0FBSSxPQUFKQSxFQUFLO1lBRWI2Z0IsTUFBUXhxQixTQUFTeXFCLFFBQVNqYixXQUF5Q2tiLFNBQVFDO0lBQzdFLEdBRDRCbmIsU0FBUUMsTUFBUkQsZ0JBQVFDLGNBQVJtYjtJQUM1QixhQUR5RDNCLGlCQUFQMUUsT0FBTzBFLGdCQUFQMUU7SUFDckMsSUFBVHNHLFNBQVMsV0FETUosUUFBa0RDO0lBRXJFLFNBQUlJLE1BQU05eEIsR0FBRUM7S0FBb0Isc0JBRnRCK0csU0FFQWhILEdBQUVDO0tBQW9CO0lBQWE7SUFDN0MsU0FBSTh4QjtLQUNGO0lBQXVFO1dBRnJFRCxNQUZpRUosU0FDakVHOztXQUtBRzs7a0NBSEFEO21CQUdBQzs7O0tBTVNDLHlCQVplTCxRQUF5Q0YsVUFDakVHO0tBV1Nqb0I7S0FBRXNvQjtJQUNiO0tBQXNCLElBQWxCQyxrQkFYRkwsTUFVU2xvQixHQVpnRStuQjtLQWMzRSxPQURJUTs7Z0NBUEZIOztnQ0FOOEN6RyxXQVlyQzNoQixHQUFFc29CO3dDQU5YRjs7OztRQVdhLElBQVRJLFdBQVMsV0FqQkVYLFFBWU43bkI7ZUFWVGtvQixNQVVTbG9CLEdBS0x3b0I7O21DQVhKSjs7c0JBSEFEOzJDQUdBQzs7Ozs7O2NBZUc7OztXQUMrQyxJQVZ2Q0ssY0FBRnpvQixHQUFFc29CLFFBQUZ0b0IsSUFLTHdvQixVQUxPRjs7Ozs7OztLQXlCWDs7R0FBaUI7WUFHbkJJLFFBQVE5YixpQkFBdURrYixTQUFRQztJQUN6RSxHQURVbmIsU0FBU0MsTUFBVEQsaUJBQVNDLGNBQVRnYjtJQUNWLGFBRGdDeEIsaUJBQVIyQixRQUFRM0IsZ0JBQVIyQjtJQUN4QixhQURxRFcsaUJBQVBoSCxPQUFPZ0gsZ0JBQVBoSDthQUFwQ2tHO0tBQ1M7SUFDbUMsZUFGUmxHLE9BRUMsV0FGdkJxRztJQUNMLE9BekNqQko7O3NCQTBDMkJ4eEIsR0FBSyxPQUFhLDRCQUFsQkEsR0FGbkJ5eEIsUUFFa0M7OzthQUZxQkM7YUFBUUM7R0FFQTtZQUd2RWEsR0FBRzdoQixHQUNMLEtBREtBLEdBRUcsY0FDTjNRLElBSEcyUSxNQUdPLFdBQVYzUSxHQUFnQjtZQUdoQnl5QixHQUFHOWhCLEdBQ0wsS0FES0EsR0FFRyxjQUNEa0csTUFIRmxHLE1BR1EsV0FBTmtHLEtBQWE7WUFHbEI2YixJQUlnQi9oQixHQUFFdVM7SUFIcEIsT0FHb0JBLEdBRmY7UUFFYXJNLFNBQUVzTTtJQUNoQjtVQURjdE0sS0FFTjtTQUZNQyxjQUdaL0MsSUFIWThDO0tBR0YsU0FISXNNLEtBR1UsV0FBeEJwUDtLQUE4QyxJQUhoQ3FQLE1BR2dDLDRCQUhoQ0QsU0FBRnRNLFdBQUVzTTs7R0FLTjtZQUdad1AsUUFBUWhpQixHQUFFdVM7SUFDTixZQWJKd1AsSUFZUS9oQixHQUFFdVM7O0tBRUYsa0JBekhSNVUsbUJBdUhVNFUsR0FFMkQsbUJBRjdEdlM7UUFHSG9EO0lBQUssT0FBTEE7R0FBTTtZQUdYNmUsaUJBQWlCN2YsSUFBR0M7SUFDdEIsR0FEbUJEO1FBQUdDLElBR2YsOEJBSFlELElBQUdDO1NBRWhCVyxJQUZhWjs7O1NBRWJZLElBRmdCWDtJQUVILE9BQWJXO0dBQ2lCO1lBYW5Ca2YsU0FDVzlmLElBQUVDO0lBQWYsSUFBYWUsUUFBRUMsUUFBRThlO0lBQ2Y7UUFEVy9lO1NBQUVDO09BR2dCO1FBSGhCdUU7UUFBRkQ7UUFBSXlhLGtCQUdjLDRCQUhkRDtRQUFKL2U7UUFBRUM7UUFBRThlOzs7O2VBQUY5ZSxHQUVELFdBRkc4ZTtLQUlvQixXQUpwQkEsZUFBSi9lLEdBQUVDOztHQU1IO1lBSVpnZixrQkFBa0J2USxNQUFLMVAsSUFBR0M7SUFDdEIsWUFaRjZmLFNBV3FCOWYsSUFBR0M7dUJBRVQ7SUFNRTtLQUx5QmlnQjtLQUFYQztLQUFmSjtLQUtDLDBCQUx5Qkc7S0FLMUMsbUNBTGdCSDtLQUlDLDBCQUpjSTtJQUNqQzthQTVKQTVrQjs7YUF3SmtCbVU7YUFPaEIsNEJBSmdCcVE7OztHQU1kO1lBR0pLLGNBQWNwZ0IsSUFBR0MsSUFBSXBDO0lBQ3ZCLGFBeEJJaWlCLFNBdUJZOWYsSUFBR0MsYUFFc0IsV0FGbEJwQyxHQUFQbUMsSUFBR0M7R0FHbUI7WUFjbENvZ0IsV0FDV3JnQixJQUFFQyxJQUFFcWdCO0lBQWpCLElBQWF0ZixRQUFFQyxRQUFFbU0sUUFBRTJTO0lBQ2pCO1FBRFcvZTtTQUFFQyxLQUFFbU07T0FHd0I7UUFIeEJtVDtRQUFGL2E7UUFBRkQ7UUFBTXlhLGtCQUdzQiw0QkFIdEJEO1FBQU4vZTtRQUFFQztRQUFFbU07UUFBRTJTOzs7O2VBQUo5ZSxPQUFFbU0sR0FFQyxXQUZDMlM7S0FLQyxXQUxEQSxlQUFOL2UsR0FBRUMsR0FBRW1NOztHQU9GO1lBSWZvVCxrQkFBa0I5USxNQUFLMVAsSUFBR0MsSUFBR3FnQjtJQUN6QixZQWJGRCxXQVlxQnJnQixJQUFHQyxJQUFHcWdCO3VCQUVaO0lBRVE7S0FEOEJHO0tBQVhQO0tBQVhDO0tBQWZKO0tBQ08sMEJBRFFJO0tBQzdCTyxLQUFLLDRCQURTWDtLQUVPLDBCQUZtQkc7S0FFeENTLEtBQUssNEJBRlNaO0tBR08sMEJBSDhCVTtLQUduREcsS0FBSyw0QkFIU2I7SUFJbEIsa0JBeE1BeGtCLG1CQWlNa0JtVSxNQUlkZ1IsSUFDQUMsUUFDQUM7R0FDMEU7WUFHOUVDLGNBQWM3Z0IsSUFBR0MsSUFBR3FnQixJQUFJemlCO0lBQzFCLGFBdkJJd2lCLFdBc0JZcmdCLElBQUdDLElBQUdxZ0I7a0JBRW1CLFdBRmZ6aUIsR0FBVm1DLElBQUdDLElBQUdxZ0I7O0dBR2dCO1lBR3BDUSxNQUFNOWdCLElBQUdDLElBQUlwQztJQUFJLE9BN0NqQnVpQjthQTZDTXBnQjthQUFHQzs7O2NBQStCLHNCQUF2Qiw4QkFBSnBDOztHQUF3QztZQUVyRGtqQixVQUFVL2dCLElBQUdDLElBQUlwQztJQTNEakJvaUIsaUNBMkRVamdCLElBQUdDO0lBQ2YsNEJBRFlELElBQUdDLElBQUlwQztHQUVGO1lBR2ZtakIsU0FBU2hoQixJQUFHQyxJQUFJcEM7SUFBSSxPQXBEcEJ1aUI7YUFvRFNwZ0I7YUFBR0M7OztjQUErQixzQkFBdkIsOEJBQUpwQzs7R0FBMkM7WUFFM0RvakIsYUFBYWpoQixJQUFHQyxJQUFJcEM7SUFsRXBCb2lCLG9DQWtFYWpnQixJQUFHQztJQUNsQiwrQkFEZUQsSUFBR0MsSUFBSXBDO0dBRUY7WUFHbEJxakIsTUFBTWxoQixJQUFHQyxJQUFJM0MsTUFBTU87SUFBSSxPQTNEdkJ1aUI7YUEyRE1wZ0I7YUFBR0M7OztjQUFxQyxzQkFBdkIsOEJBQVYzQyxNQUFNTzs7R0FBOEM7WUFFakVzakIsVUFBVW5oQixJQUFHQyxJQUFJM0MsTUFBTU87SUF6RXZCb2lCLGlDQXlFVWpnQixJQUFHQztJQUNmLDRCQURZRCxJQUFHQyxJQUFJM0MsTUFBTU87R0FFRjtZQUdyQnVqQixTQUFTcGhCLElBQUdDLElBQUlwQztJQUFJLE9BbEVwQnVpQjthQWtFU3BnQjthQUFHQzs7O2NBQStCLHNCQUF2Qiw4QkFBSnBDOztHQUEyQztZQUUzRHdqQixhQUFhcmhCLElBQUdDLElBQUlwQztJQWhGcEJvaUIsb0NBZ0ZhamdCLElBQUdDO0lBQ2xCLCtCQURlRCxJQUFHQyxJQUFJcEM7R0FFRjtZQUdsQnlqQixRQUFRdGhCLElBQUdDLElBQUlwQztJQUFJLE9BekVuQnVpQjthQXlFUXBnQjthQUFHQzs7O2NBQStCLHNCQUF2Qiw4QkFBSnBDOztHQUEwQztZQUV6RDBqQixZQUFZdmhCLElBQUdDLElBQUlwQztJQXZGbkJvaUIsbUNBdUZZamdCLElBQUdDO0lBQ2pCLDhCQURjRCxJQUFHQyxJQUFJcEM7R0FFRjtZQUdqQm1hLElBQUlwYSxHQUNhb0QsR0FBTjlNO0lBQWIsWUFETTBKOztpQkFFSTtLQUNLLElBQU40akIsZUFBTHZnQixjQUFXLGtCQUZGL00sT0FBTThNLEdBRWZDO0tBQVc7aUJBQU51Z0I7O0dBRUs7WUFLWkMsV0FBVzdqQixHQUNDQztJQUFkLElBQWdCNmpCLGtCQURIOWpCOztpQkFFSCxPQURNOGpCO1NBRVA5Z0IsY0FBTDNUO0tBQWEsY0FGSDRRLEdBRVY1UTtNQUE4QixpQkFBOUJBLEdBRll5MEIsOEJBRVA5Z0I7Ozs7O0dBRUc7WUFHVitnQixPQUFPL2pCLEdBQUdDLEdBQUksT0FBSSxnQkFSbEI0akIsV0FRTzdqQixHQUFHQyxJQUF5QjtZQUVuQzZZLFNBQVM5WSxHQUFHQztJQUNkLFlBRFdEO0lBQ0k7aUJBQ0w7S0FFQyxJQURGZ0QsY0FBTDNULGNBR0dvWSxJQUZJLFdBSkd4SCxHQUdWNVE7UUFHR29ZLEdBQWUsT0FBZkE7aUJBSEV6RTs7R0FLSDtHQUlVLElBQVpnaEI7WUFERkMsYUFFZWprQixHQUFHQztJQUNaLFlBZE42WSxTQWFlOVksR0FBR0M7Z0JBRVIsa0NBSFIrakI7UUFJSzMwQjtJQUFLLE9BQUxBO0dBQU07WUFNYjBwQixLQUFLL1ksR0FBR0M7SUFDVixZQURPRDtJQUNRO2lCQUNMO1NBQ0RnRCxjQUFMM1Q7S0FBYSxjQUhQNFEsR0FHTjVRLElBQXNCLFdBQXRCQTtpQkFBSzJUOztHQUVIO0dBSVUsSUFBWmtoQjtHQUNKLFNBRkVDLFNBRWVua0IsR0FBR0M7SUFDbEIsSUFEZWlHO0lBQ2Y7VUFEZUEsS0FFUCxrQ0FITmdlO1NBQ2EvZCxjQUdiOVcsSUFIYTZXO0tBR0EsY0FIR2pHLEdBR2hCNVEsSUFBc0IsT0FBdEJBO1NBSGE2Vzs7R0FHNkI7WUFNNUNrZSxNQUNhcGtCLEdBREpDO0lBQ1gsSUFBYWhILE9BQUVpTjtJQUNiO1VBRGFBLEtBRUw7U0FGS2xELFlBR1gzVCxJQUhXNlc7S0FHRSxjQUpOakcsR0FDRWhILEdBR1Q1SixJQUF3QixlQUhmNEosR0FHVDVKO0tBQThDLElBSHJDeVYsTUFHcUMsNEJBSHJDN0wsZ0JBQUVpTjs7R0FLUDtHQUlRLElBQVptZTtZQURGQyxVQUVZdGtCLEdBQUdDO0lBQ1QsWUFaTm1rQixNQVdZcGtCLEdBQUdDO2dCQUVMLGtDQUhSb2tCO1FBSUtoMUI7SUFBSyxPQUFMQTtHQUFNO1lBS2JrMUIsVUFDYXZrQixHQURBQztJQUNmLElBQWFoSCxPQUFFaU47SUFDYjtVQURhQSxLQUVMO0tBRUMsSUFKSWxELFlBR1gzVCxJQUhXNlcsUUFLUjhYLFNBREksV0FMSS9kLEdBQ0ZoSCxHQUdUNUo7UUFFRzJ1QixRQUFvQixPQUFwQkE7S0FDYSxJQU5QbFosTUFNTyw0QkFOUDdMLGdCQUFFaU47O0dBUVA7R0FJUSxJQUFac2U7WUFERkMsY0FFZ0J6a0IsR0FBR0M7SUFDYixZQWZOc2tCLFVBY2dCdmtCLEdBQUdDO2dCQUVULGtDQUhSdWtCO1FBSUtuMUI7SUFBSyxPQUFMQTtHQUFNO1lBTWJxMUIsU0FDYTFrQixHQUREQztJQUNkLElBQWFoSCxPQUFFaU47SUFDYjtVQURhQSxLQUVMO0tBQ00sSUFIRDRiLGFBR1hELEtBSFczYixRQUdDLGtCQUpGakcsR0FDRGhILEdBR1Q0b0I7S0FBWTtLQUFlLElBSGxCL2MsTUFHa0IsNEJBSGxCN0wsZ0JBQUVpTjs7R0FLUDtZQUdOeWUsUUFDYTNrQixHQURGQztJQUNiLElBQWFoSCxPQUFFaU47SUFDYjtVQURhQSxLQUVMO0tBQ00sSUFIRDRiLGFBR1hELEtBSFczYixRQUdDLGtCQUpIakcsR0FDQWhILEdBR1Q0b0I7S0FBWTtLQUFlLElBSGxCL2MsTUFHa0IsNEJBSGxCN0wsZ0JBQUVpTjs7R0FLUDtPQU1OOFM7WUFDQWxaLFFBQVFFLEdBQUksT0FBSkEsRUFBSztPQUViNGtCO1lBeUJJQyxhQUFhemlCLElBQUdDLElBQUc4VjtJQUN6QixLQURzQjlWLElBRWQsT0FGV0Q7YUFLUixPQUxXQztlQUFIRCxPQU1aMGlCLEtBTlkxaUI7ZUFNSixXQUFSMGlCLElBTmV6aUI7d0JBT1gwaUI7ZUFBUSxXQURaRCxRQUNJQyxJQVBXMWlCO3dCQVFQMmlCO2VBQVEsV0FGaEJGLFFBQ0lDLFFBQ0lDLElBUk8zaUI7eUJBU0g0aUI7Z0JBQVEsV0FIcEJILFFBQ0lDLFFBQ0lDLFFBQ0lDLElBVEc1aUI7O0tBVWF5ZjtLQUFOb0Q7O09BbkMzQk4sbUJBeUJ1QnpNO1VBZEgsdUJBQVcsZ0JBd0JFMkosS0FWYnpmO1VBQWhCd2lCLGFBVTZCL0MsSUFWYnpmLElBbUJRLDRCQW5CTDhWO0lBV3BCLFdBTEUyTSxRQUNJQyxRQUNJQyxRQUNJQyxRQUNVQztHQVNjO1lBR3pDN2xCLE9BQU8rQyxJQUFHQyxJQUFLLE9BdEJYd2lCLGFBc0JHemlCLElBQUdDLE9BQXlCO1lBOEIvQjhpQixVQUFXbGxCLEdBQUUrQyxHQUFFb2lCO0lBQ3JCLEtBRG1CcGlCLEdBRVg7ZUFGV0EsTUFHZnFpQixPQUhlcmlCO2VBSVIsSUFBTHNpQixPQUFLLFdBSk1ybEIsR0FHYm9sQixPQUVGLFdBRElDO3dCQUVFQzs7S0FDRyxJQUFMQyxPQUFLLFdBUE12bEIsR0FHYm9sQixPQUtFSSxPQUFLLFdBUk14bEIsR0FNVHNsQjtLQUdOLFdBRklDLFVBQ0FDOzt3QkFFTUM7O0tBQ0Q7TUFBTEMsT0FBSyxXQVhNMWxCLEdBR2JvbEI7TUFTRU8sT0FBSyxXQVpNM2xCLEdBTVRzbEI7TUFPRk0sT0FBSyxXQWJNNWxCLEdBVUx5bEI7S0FJVixXQUhJQyxVQUNBQyxVQUNBQzs7MkJBRVVDOztLQUNMO01BQUxDLE9BQUssV0FoQk05bEIsR0FHYm9sQjtNQWNFVyxPQUFLLFdBakJNL2xCLEdBTVRzbEI7TUFZRlUsT0FBSyxXQWxCTWhtQixHQVVMeWxCO01BU05RLE9BQUssV0FuQk1qbUIsR0FlRDZsQjtLQUtkLFdBSklDLFVBQ0FDLFVBQ0FDLFVBQ0FDOztJQUdLO0tBRHFCcEU7S0FBTnFFO0tBQ3BCQyxLQUFLLFdBdEJNbm1CLEdBR2JvbEI7S0FvQkVnQixLQUFLLFdBdkJNcG1CLEdBTVRzbEI7S0FrQkZlLEtBQUssV0F4Qk1ybUIsR0FVTHlsQjtLQWVOYSxLQUFLLFdBekJNdG1CLEdBZUQ2bEI7S0FXVlUsS0FBSyxXQTFCTXZtQixHQXFCU2ttQjtPQWxHeEJ2QixtQkE2RW1CUTtTQWpCUnFCLFVBWVQzZSxLQTBCNEJnYTs7U0ExQjVCaGE7Ozs7Ozs7Ozs7Ozs7Ozs7O2VBVlM7Z0JBRDZDNGU7Z0JBQU5DO2dCQUFOQztnQkFBTkM7Z0JBQU4zQjtnQkFBTkQ7Z0JBQU5EO2dCQUFORDtnQkFBTkQ7Z0JBQU5nQyxLQVdBaGY7Z0JBVklpZixPQUFLLFdBZUk5bUIsR0FoQmI2bUI7Z0JBRUlFLE9BQUssV0FjSS9tQixHQWhCUDZrQjtnQkFHRm1DLE9BQUssV0FhSWhuQixHQWhCRDhrQjtnQkFJUm1DLE9BQUssV0FZSWpuQixHQWhCSytrQjtnQkFLZG1DLE9BQUssV0FXSWxuQixHQWhCV2dsQjtnQkFNcEJtQyxPQUFLLFdBVUlubkIsR0FoQmlCaWxCO2dCQU8xQm1DLE9BQUssV0FTSXBuQixHQWhCdUI0bUI7Z0JBUWhDUyxPQUFLLFdBUUlybkIsR0FoQjZCMm1CO2dCQVN0Q1csT0FBSyxXQU9JdG5CLEdBaEJtQzBtQjtnQkFVM0M7O3VCQVRESSxNQUNBQyxNQUNBQyxNQUNBQyxNQUNBQyxNQUNBQyxNQUNBQyxNQUNBQyxNQUNBQzttQkFWS2Q7O2dCQVlUM2UsS0FYc0Q0ZTs7Ozs7Ozs7Ozs7TUFXM0MsbUNBQVg1ZSxJQUthN0gsSUF0Qko0SCxtQkFLQTRlOzs7UUFGSjtTQURtQzdDOztTQUFQNEQ7U0FBSkM7U0FBSkM7U0FBSkM7U0FBSkM7U0FBSkM7U0FBSkM7U0FBSkM7U0FBSkM7U0FDSTs7WUFESkE7O2FBQUlEO2lCQUFJRCxRQUFJRCxRQUFJRCxRQUFJRCxRQUFJRCxRQUFJRCxRQUFJRCxJQUZ4QjNmOztpQkFFK0IrYjs7O2tCQUYvQi9iOzs7Ozs7O2dCQXNCUHNkLFVBQVdsbEIsR0FxQmU2aEIsSUFXeUMsNEJBaENwRHNEO0lBMkJuQixXQUxJZ0IsUUFDQUMsUUFDQUMsUUFDQUMsUUFDQUM7R0FNNkU7WUF3VHhEbm1CLElBclRyQjJDLEdBQUcvQyxHQUFJLE9BbkNQa2xCLFVBbUNHbGxCLEdBQUgrQyxNQUF1QjtZQUUzQmlsQixZQUFZam9CLEdBQUdOLE1BQU1PO0lBQ2IsSUFBTnNZLFVBRGE3WTtJQUVSLE9BaVRrQlc7YUFuVGJMO3NCQUVBM1E7Y0FDWjtlQUFpQixtQkFISTRRLEdBQ25Cc1ksUUFDVWxwQjtlQUNDQztlQUFUNDRCO2NBRkYzUCxTQUVFMlA7Y0FFSixPQUZhNTRCO2FBRVo7R0FBQztZQUdGNjRCLFNBQVNub0IsR0FBR04sTUFBTU87SUFDcEI7S0FBSXNZLFVBRFU3WTtLQUVWc2U7T0F5U3VCM2Q7U0EzU2hCTDtrQkFHSzNRO1VBQ1o7V0FBaUIsbUJBSkQ0USxHQUNoQnNZLFFBRVlscEI7V0FDQ0M7V0FBVDQ0QjtVQUhKM1AsU0FHSTJQO1VBRUosT0FGYTU0QjtTQUVaO0lBRUwsV0FQSWlwQixRQUNBeUY7R0FNUTtZQW1TZXhRLFdBaFNqQnhLLEdBQUUvQyxHQUFJLE9BZ1NXSSxJQWhTakIyQyxHQUFFL0MsR0FBWTtZQUN0Qm1vQixRQUFRaG1CLElBQUdDLElBQUlwQztJQUFJLE9BQUksd0NBQWZtQyxJQUFHQyxJQUFJcEM7R0FBOEI7WUFDN0M2TyxLQUFLMU0sSUFBR0MsSUFBSXBDO0lBQUksT0F0VmhCdWlCO2FBc1ZLcGdCO2FBQUdDOztjQUErQixzQnJDcGdCNUMsT3FDbWdCSytsQixvQkFDWW5vQjs7R0FBdUM7WUFFbkRvb0IsU0FBU2ptQixJQUFHQyxJQUFJcEM7SUFwV2hCb2lCLGdDQW9XU2pnQixJQUFHQztJQUNkLE9BSkUrbEIsUUFHU2htQixJQUFHQyxJQUFJcEM7R0FFRjtZQUdkcW9CLFlBQ1dsbUIsSUFBR0MsSUFBR3FnQixJQURLemlCO0lBQ3hCLElBQWFzb0IsV0FBR0MsV0FBR0MsV0FBR0M7SUFDcEI7UUFEV0g7U0FBR0MsUUFBR0M7T0FHK0I7UUFIL0JFO1FBR0szRCxLQUhMeUQ7UUFBSEc7UUFHRjdELEtBSEV5RDtRQUFISztRQUdUL0QsS0FIU3lEO1FBQVNPLFdBRzZCLFdBSjNCN29CLEdBSXBCNmtCLElBQVVDLElBQVVDLEtBSEYwRDtRQUFUSDtRQUFHQztRQUFHQztRQUFHQzs7OztlQUFORixVQUFHQyxNQUVELE9BRklDO0tBSWI7O0dBRU87WUFHZEssU0FBUzNtQixJQUFHQyxJQUFHcWdCLElBQUl6aUI7SUFBSSxPQWhVdkJnakI7YUFnVVM3Z0I7YUFBR0M7YUFBR3FnQjs7Y0FBa0M7O2dCckNyaEJ0RCxPcUMyZ0JLNEYsOEJBVW1Ccm9COztHQUE4QztZQUVqRStvQixhQUFhNW1CLElBQUdDLElBQUdxZ0IsSUFBSXppQjtJQTVVdkIyaUIsb0NBNFVheGdCLElBQUdDLElBQUdxZ0I7SUFDckIsT0FiRTRGLFlBWWFsbUIsSUFBR0MsSUFBR3FnQixJQUFJemlCO0dBRUY7WUFHckJncEIsUUFBUTdtQixJQUFHQyxJQUFHcWdCLElBQUl6aUI7SUFBSSxPQUFJLGdCQWpCMUJxb0IsWUFpQlFsbUIsSUFBR0MsSUFBR3FnQixJQUFJemlCO0dBQWlDO1lBQ25EZ1AsS0FBSzdNLElBQUdDLElBQUdxZ0IsSUFBSXppQjtJQUFJLE9BeFVuQmdqQjthQXdVSzdnQjthQUFHQzthQUFHcWdCOztjQUFrQztxQ3JDN2hCbEQsT3FDNGhCS3VHLDBCQUNlaHBCOztHQUEwQztZQUV6RGlwQixTQUFTOW1CLElBQUdDLElBQUdxZ0IsSUFBSXppQjtJQXBWbkIyaUIsZ0NBb1ZTeGdCLElBQUdDLElBQUdxZ0I7SUFDakIsT0FKRXVHLFFBR1M3bUIsSUFBR0MsSUFBR3FnQixJQUFJemlCO0dBRUY7WUFHYmtwQixlQUFlL21CLElBQUdDLElBQUlwQztJQUM1QixJQURxQnNvQixXQUFHQztJQUN4QjtVQURxQkQsTUFFYixPQUZnQkM7S0FHUTtNQUhYSztNQUduQk8sSUFIbUJiO01BQUdLLFdBR1MsV0FITDNvQixHQUcxQm1wQixJQUhzQlo7TUFBSEQ7TUFBR0M7O0dBR21CO1lBR3pDdm1CLE1BQU1xQztJQUNSLElBQWEra0IsU0FLUixnQkFORy9rQixPQUNLQyxpQkFBS25DLFFBQUdDO0lBQ25CO1VBRFdrQyxRQUVILFdBRlFuQyxJQUFHQztLQUdpQjtNQUh6QitCOztNQUdMOVU7TUFBSEQ7TUFIZ0JtNUIsV0FHYmw1QixHQUhhK1M7TUFBSGttQixXQUdibDVCLEdBSGErUztNQUFMbUM7TUFBS25DO01BQUdDOztHQUtBO1lBR25CaW5CLE9BQU9obEI7SUFDVDtLQUFhK2tCLFNBS1IsZ0JBTkkva0I7S0FDSUM7S0FBS25DO0tBQUdDO0tBQUdxZ0I7SUFDdEI7VUFEV25lLFFBRUgsV0FGUW5DLElBQUdDLElBQUdxZ0I7S0FHMkI7TUFIdEN0ZTs7TUFHRm1sQjtNQUFIajZCO01BQUhEO01BSG1CbzVCLFdBR2JjLEdBSGE3RztNQUFIOEYsV0FHYmw1QixHQUhhK1M7TUFBSGttQixXQUdibDVCLEdBSGErUztNQUFMbUM7TUFBS25DO01BQUdDO01BQUdxZ0I7O0dBS0E7WUFHdEI4RyxRQUFRcG5CLElBQUdDO0lBQ2I7S0FBSSxVQTFERitsQixRQXlEUWhtQixJQUFHQyxhQUNPZSxHQUFFQyxHQUFLLFdBQVBELEdBQUVDLEdBQVM7S0FBM0I7OztLQUNtRSw2QkFGMURoQjtLQUVOLGtCQXBqQkwxRSxtQkFvakJ5RCxtQkFGakR5RTs7R0FFMkU7WUFHbkZxbkIsSUFBSXJuQixJQUFHQztJQUFLLE9BN0RaeU0sS0E2REkxTSxJQUFHQyxhQUFrQmUsR0FBRUMsR0FBSyxXQUFQRCxHQUFFQyxHQUFTO0dBQU87WUFJM0NxbUIsU0FBUzFtQixHQUFHL0M7SUFDZCxJQUFhaEgsT0FBRXNmLGlCQURKdlY7O2lCQUVELE9BREt1VjtLQUVZO01BQWxCdlk7TUFBTG9wQjtNQUF1QixZQUFDLFdBSGRucEIsR0FDRGhILEdBRVRtd0IsSUFGVzdRO01BRUksa0NBRk50Zjs7TUFBRXNmO2NBRU52WTs7R0FFRTtZQUdUTSxLQUFLMEMsR0FBRy9DLEdBQUksT0FBSSxnQkFSaEJ5cEIsU0FRSzFtQixHQUFHL0MsSUFBdUI7WUFFL0IwcEIsYUFBYTNwQixHQUFHTixNQUFNTztJQUNkLElBQU5zWSxVQURjN1k7SUFFUixPQUpSWTthQUVhTjtzQkFFQS9HLEdBQUU1SjtjQUNmO2VBQWlCLG1CQUhLNFEsR0FFVGhILEdBRFhzZixRQUNhbHBCO2VBQ0ZDO2VBQVQ0NEI7Y0FGRjNQLFNBRUUyUDtjQUVKLE9BRmE1NEI7YUFFWjtHQUFDO1lBR0ZzNkIsVUFBVTVwQixHQUFHTixNQUFNTztJQUNyQjtLQUFJc1ksVUFEVzdZO0tBRVhzZTtPQVpGMWQ7U0FVVU47a0JBR0svRyxHQUFFNUo7VUFDZjtXQUFpQixtQkFKQTRRLEdBR0poSCxHQUZic2YsUUFFZWxwQjtXQUNGQztXQUFUNDRCO1VBSEozUCxTQUdJMlA7VUFFSixPQUZhNTRCO1NBRVo7SUFFTCxXQVBJaXBCLFFBQ0F5RjtHQU1RO1lBR1Y1ZCxNQUFNNEMsR0FBRy9DO0lBRVI7TUE1T0RvZ0I7TUEwT01yZDs7ZUFFa0IvSixHQUFFNUo7T0FDdkIsV0FITTRRLEdBRWVoSCxHQUFFNUo7T0FDdkIsbUNBRHFCNEo7TUFFaEI7SUFGUDtHQUdNO1lBR1A0d0IsTUFBTTdwQixHQUFHTixNQUFNTztJQUNiOzs7U0FuUEZvZ0I7U0FrUE1yZ0I7Z0JBQUdOO3lCQUNrQzZPO1VBQWQsSUFBU2dLLGdCQUFIdGYsY0FBb0IsaUJBRHhDZ0gsR0FDb0JoSCxHQUFHc2YsS0FBS2hLO1VBQUssdUNBQWJ0VjtTQUE4QjtJQUEvRDtHQUFnRTtZQUdsRTZ3QixRQUFROW1CLEdBQUcvQztJQUNiLE9BQUk7O2FBTEY0cEI7ZUFJUTdtQjs7d0JBQ1d5WCxLQUFJbEMsS0FBSWxwQjtnQkFBSyxPQUFHLFdBRHhCNFEsR0FDUXdhLEtBQVFwckIsWUFBSmtwQjtlQUEwQztHQUFXO1lBRzVFd1IsT0FBTy9tQixHQUFHL0M7SUFDWixLQURTK0MsR0FFRDtRQUNBOGUsS0FIQzllLE1BR1A2ZSxLQUhPN2U7SUFHSyxXQUFLLFdBN1BqQnFkLFdBNlBNeUIsSUFBTkQsSUFIVTVoQjtHQUc0QjtZQUd0QytwQixXQUFXaG5CLEdBQUcvQztJQUNWLFlBUEo4cEIsT0FNVy9tQixHQUFHL0M7Z0JBRU47UUFDSHNPO0lBQUssT0FBTEE7R0FBTTtZQUdYMGIsZ0JBQWdCam5CLEdBQUcvQzthQWtCYmlxQixXQUFXQyxLQUFJNVIsS0FBSWxwQjtLQUN6QixJQURpQis2QixhQUFJQyxhQUFJalU7S0FDekI7TUFBRyxzQ0FEY2dVLFdBRVosV0FGb0JoVSxLQUFKaVU7O09BS1g7TUFJK0I7T0FUcEJDO09BU2pCaDdCLElBVGlCKzZCO09BQUluSyxNQVNnQixXQTNCdEJqZ0IsR0EyQmYzUSxHQVRxQjhtQjtPQUFSbVUsUUFTUyw2QkFUVEg7O09BQUlDO09BQUlqVTs7SUFTd0I7SUFRN0MsWUF2REp5VCxNQW9CZ0I3bUIsTUFrQlZrbkI7Z0JBa0JBO1FBQ0RwaUIsZUFBTHpZO0lBQVc7WUFBSztjQTNTaEJneEIsV0EyU0t2WSxJQUFMelksWUFBeUNBLEdBQUVDLEdBQUssa0JBckM3QjJRLEdBcUN3QjNRLEdBQUZELEdBQVk7R0FBRTtZQUd2RG03QixvQkFBb0J4bkIsR0FBRy9DO0lBQ25CLFlBekNKZ3FCLGdCQXdDb0JqbkIsR0FBRy9DOztLQUVmO1FBQ0hzTztJQUFLLE9BQUxBO0dBQU07WUFHWGtjLE9BQU96bkIsR0FBRzBuQjtJQUVWO0tBREVDO09BbkVGZDtTQWtFTzdtQjs7a0JBRWtCL0osR0FBRXNmLEtBQUlscEI7VUFDN0IsS0FEeUJrcEIsS0FFakIsZUFGcUJscEI7Y0FHVnl5QixLQUhNdkosUUFHdkJxUyxnQkFIdUJyUztVQUlwQixrQkFOR21TLFNBRWV6eEIsR0FJVixtQkFEWDJ4QixnQkFIMkJ2N0I7dUNBRzNCdTdCLGVBQWlCOUk7NEJBSFV6eUIsR0FHM0J1N0IsZ0JBQWlCOUk7U0FHYztJQUdyQyxPQVZJNkksU0FZRyxvQkFaSEE7R0FZbUI7WUFHckJFLE1BQU03bkIsR0FBRzBuQjtJQUFRLE9BaEJqQkQsT0FnQk16bkIsbUJBQWtDM1QsR0FBRUMsR0FBSyxrQkFBdENvN0IsU0FBK0JyN0IsR0FBRUMsR0FBYztHQUFDO1lBRXpEdzdCLGVBQWU5bkIsR0FBRzNNO0lBQ3BCLGtDQURpQjJNLEdBQUczTTtJQUNzQixPQUh4Q3cwQjs7c0JBRzZDeDdCLEdBQUVDLEdBQUssd0JBRGxDK0csU0FDMkJoSCxHQUFFQyxXQUFxQjtHQUFDO1lBbUc1Q3k3QixXQWhHZC9uQixHQUFHL0M7SUFDaEIsSUFBWXNZLGlCQURDdlY7O2lCQUVILHVCQURFdVY7S0FFUTtNQUFWdUo7TUFBTkQ7TUFBZ0IsK0JBQVksV0FIaEI1aEIsR0FHWjRoQixLQUZRdEo7O2NBRUZ1Sjs7R0FFRjtZQUdOa0osWUFBWWhvQixHQUFHL0M7SUFDakIsSUFBWWdyQixVQUFLMVMsaUJBREh2Vjs7aUJBRUosdUJBRE91VjtLQUVjO01BQXJCdUo7TUFBTkQ7TUFBMkIsK0JBQVksV0FIMUI1aEIsR0FDTGdyQixNQUVScEosS0FGYXRKO01BRUcscUNBRlIwUzs7TUFBSzFTO2NBRVB1Sjs7R0FFQTtZQUdSb0osTUFDZTlvQixJQUFHQyxJQURMaE07SUFDZixJQUFha2lCLFNBR1RnUSxPQUhhbm1CLElBRVRvbUIsT0FGWW5tQjtJQUNsQjtVQUVFa21CLE1BRFUsOEJBRkRoUSxLQUVMaVE7Z0JBQ00sOEJBSERqUSxLQUdUZ1E7U0FIZ0JobkIsS0FFWmluQixTQUVNMkMsS0FGTjNDLFNBRlNsbkIsS0FHYmluQixTQUNBNkMsS0FEQTdDO0tBRUcsa0JBTlFseUIsU0FLWCswQixJQUFVRDtNQUNrRCxJQUxuRGQsWUFJQ2MsSUFKRDVTLG1CQUVMaVEsT0FGWWpuQjs7O0tBS2dCLElBTHZCK29CLFlBSVRjLElBSlM3UyxtQkFHVGdRLE9BSGFqbkI7O0dBT0o7WUFTVCtwQixPQUFLam9CLEdBQUVDLEdBQUdwRDtJQUFJLE9BK0RTOHFCO2FBL0RsQjNuQjtzQkFBOEIvVDtjQUFLLE9BK0RqQmdSLElBL0RoQmdELFlBQStDL1QsR0FBSyxrQkFBakQyUSxHQUF5QjVRLEdBQW1CQyxHQUFVO2FBQUM7R0FBQztZQStEM0M2ZCxTQTlEaEI5ZCxHQUFJLFdBQUpBLE1BQVM7WUE4RE9rZSxZQTVEZnZOLEdBQUVDLEdBQUksT0E0RFM4cUIsV0E1RGYvcUIsR0FBRUMsR0FBYTtHQU9YO0lBQU55Tyx3QkFxRGlCck87O3FEQS9EdkJnckIsUUFVTTNjO0lBUUFtSSx3QkE2Q2lCeFc7Z0VBN0NqQndXO0lBNkNpQjVNOzs7O0lBOUJ2QndGO0lBQ0F0QjtJQUNBbWQ7SUFDQWwzQjtJQUNBK2E7SUFDQUU7SUFJRWtjO0lBQ0EzMkI7SUFDQUM7SUFjbUI7SUFOSCxpQkFXS3NZLDJCQTdCdkJnQjtJQTZCRyxtQkFBb0JoQjtJQUFwQixrQkFBb0JJO1lBR3JCaWUsU0FBU2xuQjtJQUNmLElBRGVDO0lBQ2Y7VUFEZUEsUUFJUDtTQUZKbFYsSUFGV2tWO3FCQUVKLE9BQVBsVjtTQUZXK1U7O0dBSWdCO1lBSXpCcW5CLEtBQUtubkI7SUFDWCxJQURXQztJQUNYO1VBRFdBLFFBSUg7U0FGSmxWLElBRk9rVjtxQkFFQSxXQUFQbFY7U0FGTytVOztHQUlDO1lBR05zbkIsVUFBVXBuQixNQUFNcW5CLFFBQVFyMUI7SUFDOUIsSUFEZ0JpTyxlQUFNcW5CO0lBQ3RCO1VBRHNCQSxVQUVkO1NBRmNDLHdCQUdwQmhLLEtBSG9CK0o7S0FJcEIsS0FKY3JuQixRQUtMO0tBQ1E7TUFOSEg7TUFNWDBuQixPQU5Xdm5CO01BTUcsaUJBTldqTyxPQUc1QnVyQixJQUdHaUs7S0FBYztTQU5Idm5CLGlCQUFNcW5COztHQU02QztZQUdqRUcsMkJBQTJCL3JCLEdBQUcxSjtJQUNoQyxLQUQ2QjBKLEdBRXJCO1FBRVVrRyxNQUpXbEcsTUFJZGdzQixLQUpjaHNCLE1BSWRpc0IsV0FBRzlsQjtJQUNkO1VBRGNBLEtBRU47U0FGTUMsY0FBSDhsQixLQUFHL2xCO0tBR0UsY0FQWTdQLE9BSWpCMjFCLFdBR3NCLGVBSHRCQTtvQkFBRzlsQjs7R0FLUDtZQUlUZ21CLDhCQUFnQ3RtQixLQUF1QnZCLE1BQU1oTztJQUMvRCxHQURrQ3VQO1NBQWdCQyxNQUFoQkQsd0JBQWdCQzs7U0FBaEJzbUI7U0FBdUI5bkIsTUFlakQ7O0tBQ0ErbkIsT0FoQmlEL25CO0tBZ0J2RGdvQixZQWhCdURob0I7S0FDNUNpb0IsVUFlWEQ7S0FmbUIvSzthQWViOEs7O2lCQUFVLDJCQWZMRSxTQUFRaEw7U0FFWE8sZUFBTjBLO0tBQ0csY0FKd0RsMkIsT0FHM0RrMkIsV0FGU0Q7O09BS0hFLHlCQU53QkwsZ0JBRzlCSSxZQUZTRDtpQkFLSEU7ZUFIQTNLOzs7S0FTTztvQkFYSnlLLFNBQVFoTDtNQUFSZ0wsVUFFVEM7TUFGaUJqTDtjQUVYTzs7R0FhdUI7WUFJL0I0SyxlQUFlcG9CLE1BQU1qTztJQUN2QixHQURpQmlPO0tBS0Y7TUFEVGhPO2lCQUFNOGYsS0FBRS9tQixHQUFLLHdCQUpJZ0gsU0FJWCtmLEtBQUUvbUIsV0FBcUI7TUFDN0JzOUIsU0FBUyxpQkFMRXJvQixNQUFNak87S0FNckIsT0ExQkE4MUIsaUNBeUJJUSxRQURBcjJCOztJQUZVLE9BRkNnTztHQU00QjtZQUczQ3NvQixXQUFXNXBCLEdBQUczTTtJQUNoQixJQUNhczJCLFNBREEsaUJBREEzcEIsR0FBRzNNLFVBRUh3MkI7SUFDWDtRQURXQTs7O1dBR0RDLE1BSENoTCxPQUdUaUwsTUFIU0Y7T0FHcUIsb0JBTGxCeDJCLFNBS1owMkIsS0FBUUQsTUFBK0MsV0FBdkRDO1dBSFNGOzs7O0tBRUs7O0dBR1A7WUFHVEcsYUFBYUMsS0FBSzUyQjtJQUNwQixPQVhFdTJCLFdBVWFLLEtBQUs1MkI7R0FHTDtZQUdiNjJCLGNBQWNscUIsR0FBRzNNO2FBSWZnQixVQUFRK0wsR0FBRUM7S0FBUyxxQkFKSmhOLFNBSVArTSxHQUFFQztLQUFTO0lBQVc7SUFDckIsSUFBVHNwQixTQUFTLGlCQUxHM3BCLEdBSVozTDtTQUNBczFCLFFBYUk7O0tBWEtRLFdBRlRSO0tBRWdCUyxTQUZoQlQ7S0FFU1U7S0FBT0M7S0FBTUM7S0FBaUJoVjtJQUN6QztVQURXOFUsVUFFSCxPQUZpQzlVO1NBQTlCaVYsd0JBQU9DLFNBQVBKO0tBSU4sU0FQSGgyQixVQUdnQmkyQjtVQUFQRCxxQkFBT0MsZUFBTUM7Ozs7VUFBYkYscUJBQU9DLGVBQU1DOzs7S0FRaUI7TUFSQWxELFlBQXZCb0QsUUFBdUJsVjtNQUE5QjhVO01BQU9DO01BQU1DO01BQWlCaFY7O0dBWVE7WUFTakRtVixVQUFVeG5CLEtBQUc1UDtJQUNmLEtBRFk0UCxLQUVKO1FBUld3Z0IsT0FNUHhnQixRQUdWa1EsTUFIVWxRLFFBTk9sRztJQUNuQjtRQURtQkE7TUFHTixJQUhNOEgsV0FHakJ6WSxJQUhpQjJRLE1BR04saUJBR0UxSixPQUhiakgsR0FNQSttQjtNQU5XLFlBSE1wVzs7Ozs7S0FTSCxpQkFBZG9XOztHQUE0RDtZQUc1RCtCLE1BQU1uWSxHQUFHQztJQUFJLHFDQWppQmJvZ0IsV0FpaUJNcmdCLEdBQUdDO0dBQThCO1lBQ3ZDbVksSUFBSW1CLEdBQUV2WixHQUFHQztJQUFJLHFDQWxpQmJvZ0IsV0FraUJJOUcsR0FBRXZaLEdBQUdDO0dBQThCO1lBQ3ZDMFksUUFBUTNZLEdBQUczSjtJQUFVLHFDQW5pQnJCZ3FCLFdBbWlCUXJnQixHQUFHM0o7R0FBNEM7WUFDdkR3aUIsUUFBUTdZLEdBQUczSjtJQUFVLHFDQXBpQnJCZ3FCLFdBb2lCUXJnQixHQUFHM0o7R0FBNEM7WUFFdkRzM0IsT0FBTzN0QixHQUFHQztJQUNaLE9BclRFNHBCO2FBb1RPN3BCOztzQkFDZTR0QixLQUFJelYsT0FBTS9VO2NBQUssT0FBRyxXQUQ5Qm5ELEdBQ1kydEIsS0FBVXhxQjt3QkFBcUIsNEJBQTNCK1U7O2FBQStDO0dBQUM7WUFHMUV6WSxLQUVXNlMsR0FGSHRTO0lBQ1YsR0FDYXNTLE9BREMsV0F6NUJaNVUsbUJBMDVCVzRVO2VBQUVnUDtJQUNiO1lBRFd0b0IsR0FDWDtjQURXQSxHQUVHLE9BRkRzb0I7S0FFeUI7TUFGekJHLGNBRTBCLFdBSi9CemhCLEdBSWlDLDRCQUY5QmhILFFBQUVzb0I7TUFBRnpjLE1BRW1CLDRCQUZuQjdMOztNQUFFc29COztHQUlOO1lBR1BzTSxlQUNXN3FCLEdBRE8vQztJQUNwQixJQUFhNHNCLFNBQUV0TDtJQUNiO1VBRFdzTCxLQUVILE9BRkt0TDtLQUlKLElBSkVPLGFBR1RELEtBSFNnTCxRQUlGLG1CQUxTNXNCLEdBSWhCNGhCOztNQUVxQixJQUFieHlCLGNBTEdxeUIsY0FLSHJ5QixHQUxHa3lCLFFBQUZzTCxVQUFFdEw7OztTQUFGc0w7O0dBUUo7WUFHUGlCLFdBQVc5cUIsR0FBRy9DLEdBQUksT0FBSSxnQkFadEI0dEIsZUFZVzdxQixHQUFHL0MsSUFBNkI7WUFFM0M4dEIsZ0JBQ2EvcUIsR0FETS9DO0lBQ3JCLElBQWFoSCxPQUFFNHpCLFNBQUV0TDtJQUNmO1VBRGFzTCxLQUVMLE9BRk90TDtLQUlOLElBSklPLGFBR1hELEtBSFdnTCxRQUlKLG1CQUxVNXNCLEdBQ1JoSCxHQUdUNG9COztNQUU2QjtPQUFyQnh5QjtPQUxLcXlCLGNBS0xyeUIsR0FMS2t5QjtPQUFKemMsTUFLUyw0QkFMVDdMOztPQUFFNHpCO09BQUV0TDs7O0tBTUcsSUFOUHlNLE1BTU8sNEJBTlAvMEIsZ0JBQUU0ekI7O0dBUUo7WUFHVG9CLFlBQVlqckIsR0FBRy9DLEdBQUksT0FBSSxnQkFadkI4dEIsZ0JBWVkvcUIsR0FBRy9DLElBQThCO1lBQzdDaXVCLFdBQVdsckIsR0FBSSxPQWZmOHFCLFdBZVc5cUIsaUJBQUksY0FBcUI7WUFFcENtckIsZUFDV251QixHQURPQztJQUNwQixJQUFhaUcsU0FBRWxKLFNBQUlFLFNBQUlreEI7SUFDckI7VUFEV2xvQjtNQUVlLDBCQUZMa29CLE1BRUosc0JBRkFseEI7TUFFVCwyQkFGS0Y7O0tBSUosSUFKRW1KLGNBR1Q5VyxJQUhTNlcsUUFJRixtQkFMU2pHLEdBSWhCNVE7O01BR3dCLElBQWhCQyxjQU5PNGtCLFlBTVA1a0IsR0FOTzROLE1BQU5nSixXQUFNaEo7Ozs7TUFPYSxJQUFwQitXLGdCQVBXb2EsWUFPWHBhLEtBUFdtYSxNQUFWbG9CLFdBQVVrb0I7OztLQUtDLElBQVpFLGdCQUxHdGEsWUFLSHNhLEtBTEd0eEIsTUFBRmtKLFdBQUVsSjs7R0FTQTtZQUdidXhCLGFBQWF2dUIsR0FBR0M7YUFDZHV1QixJQUFFbi9CLEdBQWlCLE9BQUcsV0FEUjRRLEdBQ1o1USxxQkFBa0Q7SUFDeEQsaUNBRmUyUSxHQUNYd3VCO0dBQ2M7WUFHaEJDLGlCQUFpQnp1QjtJQUFJLGlDQUFKQTtHQUF1QztHQWF4RCxTQVJFMHVCLFlBUUVDLFVBQVlDLFVBQVlDO2lCQU9wQkM7S0FMSixTQUtJQTs7Ozs7UUFIaUI7U0FEZ0JDO1NBQVpDO1NBQ2pCQyxXQUFhLFdBSnJCTixVQUd5Qks7U0FFakJFLFdBQWEsV0FMVE4sVUFHeUJHO1FBR2pDLFdBRklFLFVBQ0FDOzs7O0tBR0o7MkNBVEo5TyxxQkFRSTBPO0lBSWE7SUFWbkIseUNBRDBCRDtHQVlqQjtZQUdUTSxZQU9FQyxVQUFZQyxVQUFZQzs7S0FFeEI7TUFBa0JDO01BQVpDO01BQ0NoZSxXQUFhLFdBSHBCNGQsVUFFTUk7TUFFQ0MsV0FBYSxXQUpSSixVQUVNRTtLQUdmLGVBRkkvZCxjQUNBaWU7SUFDMEM7SUFKbkQseUNBRDBCSDtHQU1qQjtZQUdSSSxpQkFLQ3hhLGdCQUFpQkM7SUFDbkIsT0FFTTs7cUJBSEpELG9CQUFpQkM7R0FJaEI7WUFLSHdhLGNBRUFyckI7SUFGZ0IsS0FFaEJBLE1BRE07UUFDTHNyQixJQUFEdHJCO0lBQXVCLFdBQXRCc3JCLEdBcFBzQnZ2QixJQW9QdkJpRTtHQUF5QztZQUd6Q3VyQixRQUFNQyxPQUFPeDVCO0lBQ2YsT0F4UHlCK0o7YUF0R3pCd3FCO2VBNlZRaUY7O2dCQUNXLElBQWF4Z0MsWUFBUEQ7Z0JBQW9CLHNCQUQ5QmlILE9BQ1VqSCxHQUFPQztlQUF5QjthQU52RHFnQztHQU0rRTtZQUcvRUksaUJBQWVELE9BQU96NUI7SUFDeEIsT0E1UHlCZ0s7YUFwR3pCeXFCO2VBK1ZpQmdGOztnQkFDYSxJQUFheGdDLFlBQVBEO2dCQUFnQixrQkFENUJnSCxTQUNZaEgsR0FBT0M7ZUFBcUI7YUFWOURxZ0M7R0FXcUI7WUFHckIvVixPQUFLNVosR0FBRzFKLE9BQU0wNUI7SUFDVjs7T0EzdkJOalg7U0EwdkJPL1k7O1VBQ1MsSUFBTWl3QjtVQUFZLGtCQUR4QjM1QixPQUFNMDVCLEtBQ01DO1NBQTJCO2dCQUN2QztRQUNINWdDO0lBQUssV0FBSyw2QkFBVkE7R0FBaUI7R0FJUixJQUFaNmdDO1lBREZDLFdBRVdud0IsR0FBRzFKLE9BQU0wNUI7SUFDZCxZQVROcFcsT0FRVzVaLEdBQUcxSixPQUFNMDVCO2dCQUVWLGtDQUhSRTtRQUlLRTtJQUFTLE9BQVRBO0dBQWM7WUFNckJDLE1BQUlyd0IsR0FBRzFKLE9BQU0wNUIsS0FDZixPQWxCRXBXLE9BaUJJNVosR0FBRzFKLE9BQU0wNUIsYUFHQztZQUdkTSxPQUFPdHdCLEdBQUcxSixPQUFNMDVCO0lBQU0sT0F6eUJ4QmpNO2FBeXlCUy9qQjs7Y0FBMkIsSUFBTWl3QjtjQUFnQixzQkFBOUMzNUIsT0FBTTA1QixLQUF3QkM7YUFBaUM7O1lBRXpFTSxJQUFJdndCLEdBQUcxSixPQUFNMDVCLEtBQUlJO0lBRW5CLGVBRmVKLEtBQUlJLFFBRmpCRSxPQUVJdHdCLEdBQUcxSixPQUFNMDVCO0dBRW9CO1lBR2pDUSxRQUFReHdCO0lBQUksT0E5UldLO2FBOFJmTDs7Y0FBYSxJQUFTMVEsY0FBSEQ7Y0FBUyxXQUFOQyxHQUFIRDthQUFjOztZQUN6Q29oQyxNQUFJendCLEdBQUdDO0lBQUksT0EvUllJO2FBK1JuQkw7O2NBQWdCLElBQVdvd0Isa0JBQUxKO2NBQWUsV0FBZkEsS0FBb0IsV0FBdkMvdkIsR0FBd0Jtd0I7YUFBdUI7O1lBR3hEdndCLElBQUltRCxHQUFHeVgsS0FBS3RiO0lBR2QsVUFIU3NiOzs7O2VBQUt0Yjs7OztNQUdpQjtnQ0FIekI2RDthQUd5QixpQ0FIakI3RCxPQUFMc2I7O1lBRzBDO0lBRWpEOzthQS9kQW9QO2VBMGRJN21COzt3QkFLc0IvSixHQUFFc2YsS0FBSW1ZO2dCQUM3QixHQU5JalcsT0FLbUJ4aEIsU0FDSiw0QkFOZndoQixLQUFLdGI7aUJBTXlCLFdBREx1eEIsSUFBSm5ZO2dCQUN3QixPQUR4QkE7ZUFDMkI7R0FBRTtZQUd6RG9ZLFFBQVFDLFFBSUtyZTtJQUhmLFFBR2VBLEdBRlYsY0FGS3FlO1FBSUtwZSxTQUFFeFMsSUFKUDR3QixRQUlTclA7SUFDZjtjQURXL08sS0FFTiwyQkFGVStPLFFBQUZ2aEI7YUFLSCxXQVRKNHdCO0tBVTBCO01BTm5COU87TUFNVEQsS0FOUzdoQjtNQUFFMGhCLGNBTVhHLElBTldOO01BQUo5TyxNQU1VLDRCQU5WRDs7TUFBRXhTO01BQUV1aEI7O0dBUUE7WUFJakJzUCxLQUllRCxRQUFGcmU7SUFIZixRQUdlQSxHQUZWO1FBRVVDLFNBQUV4UyxZQUFFdWhCO0lBQ2Y7Y0FEVy9PLEtBRU4sdUJBRlUrTztVQUFGdmhCLEdBRFosT0FDWTR3QjtLQU1tQjtNQU5uQjlPO01BTVRELEtBTlM3aEI7TUFBRTBoQixjQU1YRyxJQU5XTjtNQUFKOU8sTUFNVSw0QkFOVkQ7O01BQUV4UztNQUFFdWhCOztHQVFBO1lBR2J1UCxLQUFLOXdCLEdBQUV1UztJQUNiLElBRUVyTSxNQUhTbEcsR0FBRXdTO0lBQ2I7UUFFRXRNO1VBSFM0YixLQUdUNWI7TUFEYSxPQUZGc007T0FFbUIsSUFGbkJDLE1BRW1CLDRCQUZuQkQsU0FHWHRNLE1BSFM0YixJQUFFdFA7Ozs7S0FHTixPQUFMdE07O0dBQU07WUFHTjZxQixVQUV3Qi90QixHQUZYbEI7SUFDZixHQURlQSxhQUNLLFdBem1DbEJuRSxtQkF3bUNhbUU7UUFFT3lXLFNBQUlzVTtJQUN4QjtVQUR3QkEsS0FFaEIsdUJBRll0VTtLQUlEO2NBM0NuQm9ZLFFBdUN3QjlELEtBRlgvcUI7TUFFV2t2QjtNQUlsQkM7TUFKYzVHLFlBSWQ0RyxTQUpjMVk7O01BQUlzVTs7R0FPWDtZQUdicUUsWUFBWXBwQixJQUFJN0g7SUFDbEIsSUFBYXNZLFNBRVR2WSxJQUhVOEg7O1FBR1Y5SDtVQURNOGhCLEtBQ045aEIsTUFEQTZoQixLQUNBN2hCO01BRGMsY0FGQUMsR0FFZDRoQjtPQUEyQixnQkFBM0JBLElBRFN0SixtQkFFVHZZLElBRE04aEI7Ozs7S0FDRCwyQkFGSXZKLE1BRVR2WTs7R0FFTTtZQUlSbXhCLFdBQVdycEIsSUFBSTdIO0lBQ2pCLElBQWFzWSxpQkFEQXpROzs7VUFFSGdhLGVBQU5EO01BQWMsY0FGRDVoQixHQUViNGhCO09BQTJCLGdCQUEzQkEsSUFEU3RKLDJCQUNIdUo7Ozs7S0FDRCx1QkFGSXZKOztHQUlIO1lBR0o2WSxXQUFXcHhCLEdBQUdDO0lBQ3BCLElBRUVpRyxNQUhlbEc7SUFDakI7UUFFRWtHO1VBSGU0YixLQUdmNWIsUUFEQTJiLEtBQ0EzYjtNQURjLGNBRklqRyxHQUVsQjRoQixTQUNBM2IsTUFIZTRiOztLQUdWLE9BQUw1Yjs7R0FBTTtZQUdObXJCLFVBQVVyeEI7SUFDTiw0QkFETUE7Z0JBRUo7UUFDRGl0QjtJQUFPLFdBQUssZ0JBQVpBO0dBQXFCO1lBRzFCcUUsY0FBY3R4QjtJQUNWLFlBUEpxeEIsVUFNY3J4Qjs7S0FFTjtRQUNIaXRCO0lBQU8sT0FBUEE7R0FBVTtZQUdmc0Usa0JBSWFDLE9BQUdDO0lBSGxCLEdBQUcscUJBR2VBLFFBRmI7UUFFVXJ2QixZQUFNbWY7SUFDakI7VUFEV25mLElBS1QsdUJBTGVtZjtLQUdRO01BSGRPO01BR1RELEtBSFN6ZjtNQUFNc2Y7UUFHUTs7VUF0WUZyaEI7WUFtWVRveEIsZ0JBR1o1UCxJckN4cUNULGdCcUN3cUN5RHh5QixHQUFLLFdBQXJEd3lCLElBQWdEeHlCLEdBQVUsSUFBMUR3eUI7VUFIZU47TUFBTm5mO01BQU1tZjs7R0FLTztZQUcxQmhpQixPQUFPeUQsR0FBSSw4QkFBSkEsR0Fqd0JQM0QsV0Fpd0IwQztZQUMxQ3F5QixnQkFBZ0IxdUI7SUFBSSxPQUFtQjthQXR6QnZDcWQ7YUFzekJnQnJkOztzQkFBNEJ1VixLQUFJdlYsR0FBSyw4QkFBTEEsR0FBSnVWLEtBQXlCO0dBQUM7WUFDdEVvWixLQUFLdGlDLEdBQUUyVCxHQUFJLFdBQU4zVCxHQUFFMlQsR0FBVTtZQUVqQjR1QixVQUNXNXVCLEdBREUzTTtJQUNmLElBQWF3MkI7SUFDWDtRQURXQTs7OztRQUdGOUgsS0FIRTVoQjtRQUdUMmhCLEtBSFMrSDtjQUdrQixXQUpoQngyQixTQUlYeXVCLElBQU9DOztXQUhFOEg7Ozs7S0FFSzs7R0FHWjtZQUdKZ0YsbUJBQ1c3dUIsR0FEVzNNO0lBQ3hCLElBQWF3MkI7SUFDWDtRQURXQTs7OztRQUdGOUgsS0FIRTVoQjtRQUdUMmhCLEtBSFMrSDtjQUdrQixXQUpQeDJCLFNBSXBCeXVCLElBQU9DOztXQUhFOEg7Ozs7S0FFSzs7R0FHWjtHQUdPLGdCQXZ4Qlh4dEI7WUEyeEJBK2YsUUFBVXZaLEtBQXFDdkI7SUFDakQsR0FEWXVCO1NBQWVDLE1BQWZELHVCQUFlQzs7U0FBZnVaO0lBQ1osR0FEaUQvYTs7OztPQU1yQyxJQUFOd3RCLE1BQU0sNEJBTnFDeHRCO09BTy9DLHVDQVBVK2EscUJBTU55UztPQUNKLG1DQURJQTs7VUFGQ3hpQyxZQUFIRCxJQUo2Q2lWO01BSWhDLHVDQUpMK2E7b0JBSUwvdkIsT0FBSEQ7Z0JBSjZDaVY7OztJQUdqQyxPQUhpQ0E7R0FROUI7WUFHakJ5dEIsbUJBQXFCbHNCLEtBQXFDdkI7SUFDNUQsR0FEdUJ1QjtTQUFlQyxNQUFmRCx1QkFBZUM7O1NBQWZ1WjtJQUNwQix3QkFEeUQvYTtLQUV2RDtJQUM0Qyw2QkFIV0E7SUFHMUMsT0FwbENoQjBkLFFBaWxDMEQxZCxNQUcxQywrQkFISythO0dBR3dDO1lBRzdEMlMsZUFBaUJuc0IsS0FBcUN2QjtJQUN4RCxHQURtQnVCO1NBQWVDLE1BQWZELHVCQUFlQzs7U0FBZnVaO0lBQ25CO0tBQUksY0FQRjBTLHVCQU1pQjFTLGVBQXFDL2E7S0FDcEQ7O2VBQ0c7R0FBSTtZQUdMak4sVUFBUTQ2QixLQUFJN3VCLEdBQUVDO0lBQ3BCLElBRGtCc0UsU0FBRUM7SUFDcEI7VUFEa0JELFlBQUVDO2VBSVQ7S0FFRDtNQU5VQztNQUtUdlksSUFMU3NZO01BQUZFO01BS2hCelksSUFMZ0JzWTtNQU1aNEssSUFBSSxXQU5JMGYsS0FLWjVpQyxHQUFTQztLQUVULFNBRElpakIsR0FDaUMsT0FEakNBO1NBTlk1SyxVQUFFQzs7R0FPb0I7T0FHdENsQztZQUVBcFAsTUFDWUEsT0FBTWdMLElBQUdDO0lBQXZCLElBQW9CMndCLFdBQUdDO0lBQ3JCO1FBRGtCRDtTQUFHQztPQUdHO1FBSEhDO1FBR1RyTixLQUhTb047UUFBSEU7UUFHaEJ2TixLQUhnQm9OO1FBR00saUJBSFo1N0IsT0FHVnd1QixJQUFVQztPQUFZO1dBSE5tTixhQUFHQzs7OztxQkFFVDtLQUVMOztHQUVRO1lBR2ZHLFVBbUJFQztJQUFLLElBWGtCQyxPQVd2QkQsUUFWY0UsYUFBUUM7O0lBQ3hCO1NBVDZCMXlCLElBT0p3eUIsTUFJdkJHLGdCQUFRQyxrQkFBY0M7S0FWeEI7V0FENkI3eUI7WUFXM0IyeUIsZ0JBQVFDO1FBREssV0FBSyxnQkFGSkg7T0FJZCxHQURzQkksYUFFakI7T0FHSDtRQURJQyxTQVBnQkosU0FPUSxnQkFKOUJDO1FBSHNCSTtRQUFSQyxnQkFPUkYsUUFQUUw7UUFEU0QsT0FJZkk7UUFITUg7UUFBUUM7OztrQkFSSzF5Qjs7T0FLaUI7UUFMakI4aEI7UUFJckJoYTtRQUFMelk7UUFKdUM0akMsY0FJbENuckIsSUFPRThxQjtRQVhxQk0sbUJBSTVCN2pDLEdBT0RzakM7UUFYMkIzeUI7UUFXM0IyeUIsYUFYNkJPO1FBV3JCTixlQVhnQ0s7OztVQUFiNUcsdUJBV0x3Rzs7O0dBT0g7R0FHekI7Ozs7SUFLSTtLQU9TO0lBTFk7S0FEd0JNO0tBQ3JDQyxXQUFhLCtDQUR3QkQ7SUFFekMsd0JBRElDO0dBS2M7R0FUeEI7O1lBY0VDLGNBQWNyd0I7SUFDVixZQXhDSnN2QixVQXVDY3R2Qjs7S0FHTjtpREEzZmlCM0MsSUF3ZlgyQztRQUVUNnBCO0lBQUssT0FBTEE7R0FDcUU7WUFHMUV5RyxZQUFZdHpCLEdBQUdzUztJQUNqQixLQURjdFMsR0FFTjtRQUNEOEgsS0FITzlILE1BR1ozUSxJQUhZMlE7SUFHRDtZQUFYM1E7WUFBZ0I7O2NBQVh5WTt1QkFBMEN4WSxHQUFFaXBCLEtBQU8sV0FIekNqRyxTQUdnQ2hqQixHQUFFaXBCLE1BQXNCOztHQUFDO1lBR3hFRCxZQUFZdFksR0FBR04sTUFBTU87SUFBSSxxQ0E5NkJ6Qm9nQixXQTg2QmUzZ0IsTUFBTU8sR0FBVEQ7R0FBbUQ7WUFDL0R5WSxXQUFXelksR0FBR04sTUFBTU87SUFBSSx3Q0EvNkJ4Qm9nQixXQSs2QmMzZ0IsTUFBTU87SUFBSSxxQnJDdnlDN0IsNEJxQ3V5Q2dCRDtHQUFrRDtZQUU3RHV6QixVQUFVanZCLE1BQU1rdkIsUUFBYzdxQjtJQUNoQztLQUFJOHFCLFdBQVcsbUJBREhudkI7S0FFUm92QixhQUFhLG1CQUZDRjtXQUVkRSxjQURBRDs7Y0FqRUZuOUI7ZUFnRThCcVM7ZUE3TDFCbW9CLEtBNkxNeHNCLE1BR3lDLDRCQUZqRG12QixVQUNBQztlQUZjRjs7R0FHa0U7Ozs7T0EvRTlFbjhCO09BVUpxTztPQXh0Q0VnTDtPQUNBNUc7T0FFQ0Y7T0E0T0h3UTs7OztPQTBIQWlHO09BODZCQS9IO09BQ0FHOzs7T0E3WUFMO09BbG5CQVc7T0F0QkFEO09BeUdBaFo7T0FEQWtaO09BaWlCQUw7T0FDQUU7T0FuMkJBaFA7O1FBNHNCRXNFO1FBRUEvWjtRQUVBaWI7UUFEQUY7UUFKQU07UUFqQ0E0YjtRQW1DQUM7WUFPRUMsVUFFQTEyQixVQURBRCxVQW9CcUI0WTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F4dUJ6QjVOO09BMkRBbWlCO09BWUFDOzs7T0FNQUM7O09Bc0ZBa0I7T0FGQUQ7T0FTQUc7T0FGQUQ7T0FTQUc7T0FGQUQ7T0E0SEFvQjtPQW5IQWpCO09BRkFEO09BOEhBbUI7T0FySEFoQjtPQUZBRDtPQXlCQUs7T0FSQUY7T0FzV0FpRzs7T0EwVkFxRTtPQWFBSTtPQUtBRTtPQW1IQWtDOzs7T0EzWEF6RjtPQXptQkFySjtPQU1BQzs7O09BNE1Bc0M7T0FTQUU7T0FwQkFIO09BbkJBRjtPQWlEQU07T0FZQUU7T0FrRkFwbEI7T0FzWHlCZ0I7T0FuVHpCNG5CO09BZ0dBMEI7T0F4RkF4QjtPQWdHQXlCO09BMk15Qm1CO09BeEZ6QkM7T0FwTUEzQztPQUZBdlo7T0FtQkFrYTtPQUZBRDtPQVVBRztPQUZBamE7T0FPSWthOztPQTVLSjlJO09Ba0xBcGU7T0FTQXFuQjtPQWNBRztPQUxBRDtPQWlCQWxwQjtPQVJBb3BCO09BNkJBdHBCO09BUUF5cEI7T0FjQUc7T0FOQUQ7T0FZQUU7T0F3Q0FPO09Bc0JBSztPQWhCQUo7T0FrQkFLO09Bb2JBaUc7T0FyVUl0RjtPQVJBRDtPQWVBRTtPQXFmSjZIO09BNWVBeEg7T0FhQUk7T0FvQkFPO09BU0FFO09BVUFJO09BTUFFO09BNEJBUTtPQU1BdlY7T0FLQXdWO09BMXpCQWhNO09BeENBZDtPQXMyQkFuaEI7T0FTQW11QjtPQWNBRTtPQUZBRDtPQWNBRztPQUNBQzs7UUF5QkVRO1FBdUJBUztRQWdCQ087UUFxRERhO1FBekJBM1c7UUFNQXVXO1FBV0FFO1FBTUFDO1FBUUFHO1FBREFEO1FBdkNBWDtRQUlBRTtPQXVDRmx3QjtPQXlCQWd4QjtPQWVJQztPQTJCSks7T0FRSUM7T0FqQkpGO09BdUJBRztPQU1BQztPQWtCQS94QjtPQUNBbXlCO09BQ0FDO09BZEFKO09Bc0NBblM7T0FpQkE0UztPQU5BRDtPQWpDQUg7T0FTQUM7T0ErQ0F2N0I7O09BVUFnOEI7T0F1Q0FlO09BTUFDOzs7RXJDaHlDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lzQ3dKTTFwQjtJQWlGR1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQW5ORVA7SUFDTDs7T0FFb0IsSUFER1UscUJBQ2hCbXBCLFdBQWEseUJBREducEI7T0FFcEIsd0JBREltcEI7O09BR2E7UUFEVkM7UUFDSEMsV0FBYSw2QkFEVkQ7T0FFUCx3QkFESUM7O09BR2E7UUFEYmpwQjtRQUNBa3BCLFdBQWEsNkJBRGJscEI7T0FFSix3QkFESWtwQjs7T0FHYSxJQURaQyxxQkFDREMsV0FBYSx5QkFEWkQ7T0FFTCx3QkFESUM7O09BR2E7UUFEaUJDO1FBQVpDO1FBQVpDO1FBQ052VCxXQUFhLDZCQURQdVQ7UUFFTkMsV0FBYSx5QkFGS0Y7UUFHbEJHO1VBQWE7NkRBSGlCSjtPQUlsQyx3QkFISXJULGNBQ0F3VCxjQUNBQzs7T0FJYTtRQURFQztRQUFaMWY7UUFDSHhELFdBQWEsNkJBRFZ3RDtRQUVIMmYsV0F0QkZ6cUIsVUFvQmlCd3FCO09BR25CLHdCQUZJbGpCLGNBQ0FtakI7O09BR2E7UUFEZ0JDO1FBQVpDO1FBQVpDO1FBQ0x6akIsV0FBYSw2QkFEUnlqQjtRQUVMQyxXQUFhLHlCQUZJRjtRQUdqQkcsV0EzQkY5cUIsVUF3QitCMHFCO09BSWpDLHdCQUhJdmpCLGNBQ0EwakIsY0FDQUM7O09BSWE7UUFESUM7UUFBWkM7UUFDTEMsV0FBYSwrQ0FEUkQ7UUFFTEUsV0FBYSw2QkFoQ2ZsckIsV0E4Qm1CK3FCO09BR3JCLHdCQUZJRSxjQUNBQzs7T0FHYTtRQURXQztRQUFaeGpCO1FBQ1p5akIsV0FuQ0ZwckIsVUFrQ2MySDtRQUVaMGpCLFdBQWEsNkJBRldGO09BRzVCLHdCQUZJQyxjQUNBQzs7R0FDOEU7WUFNaEZDLGVBQWVwMUIsR0FBRTBvQjtJQUt2QixJQUxxQnhpQixTQUFFNGlCO0lBS3ZCO1lBTHFCNWlCOztZQU1DOEUsT0FORDlFO1FBT25COztvQkFBZ0MsMEJBRFo4RSxPQU5DOGQ7O1lBUWR1TSxTQVJZbnZCLFFBUUYsV0FBVm12QixRQVJjdk07O1FBU1UsSUFBM0IxZCxNQVRlbEYsUUFTWSw4QkFBM0JrRjtRQUFPLDJDQVRVMGQ7O1lBVWhCd00sU0FWY3B2QjtRQVVOLHFDQUFSb3ZCLFNBVmdCeE07O1lBV055TSxTQVhJcnZCLFFBV1RzdkIsTUFYU3R2QjtRQVdRO2dCQUFqQnN2Qjs2QkFBZ0MsMEJBQTNCRCxTQVhNek07O1lBWVQzaUIsTUFaT0QsUUFZWnV2QixRQVpZdnZCO1FBWUQsV0FBWHV2QixrQkFaSEwsZUFZUWp2QixLQVpTMmlCOztRQWNrQjtTQURuQjFpQixNQWJERjtTQWFMd3ZCLFNBYkt4dkI7U0FhVnl2QixRQWJVenZCO1NBY29CLGlCQWRuQ2t2QixlQWFnQmh2QixLQWJDMGlCO1NBY2pCOE0sV0FBTywwQkFER0Y7cUJBRWQsc0JBRlNDO2tCQUNMQztzQkFES0Qsa0JBQ0xDOztZQUlrQnRuQixLQWxCSHBJLFFBa0JWMnZCLGNBbEJVM3ZCO1FBbUJuQixHQURTMnZCO1NBS0csSUFESHRtQyxNQUpBc21DLGdCQUtEdGpCLElBQUkseUJBTFVqRTtZQUtkaUUsS0FEQ2hqQjtjQUphdW1DOztVQVFrRDs2Q0FIaEV2akIsR0FEQ2hqQjtXQUltQixjQUFTO1dBQTVCLGlDQVJhK2UsSUFJYi9lO1dBSmF1bUMsT0FRYjthQVBMQyxPQURrQkQ7OzthQUNsQkMsT0FEa0J6bkI7UUFVdEI7O29CQUF5Q29hLElBQUcxb0I7WUFDckIsSUFEa0I4b0IsT0FDbEIseUJBRGtCSjtZQUNZLE9BN0JqRDBNLGVBNEJ3Q3AxQixHQUFIOG9CO1dBQ3VCO1NBRHRELGdDQVROaU47UUFTZ0Msc0NBNUJmak47O1FBaUJKO1NBREU1ZCxZQWhCQWhGOztTQUFFOHZCLDhCQWdCRjlxQixXQWhCRTRkO1NBQUY1aUI7U0FBRTRpQjs7O0dBNkI0QztZQUs3RG1OLGFBQWFqMkIsR0FBRTBvQjtJQUNyQixPQURtQjFvQjs7T0FFYSxXQS9FMUI4SixVQTZFYTlKLElBQUUwb0I7O1dBR1oyTSxTQUhVcjFCLE1BR0EsZUFBVnExQixTQUhZM007O1dBSWZ0ZCxNQUphcEwsTUFJTixtQ0FBUG9MLE1BSmVzZDs7V0FLZDFkLE9BTFloTCxNQUtKLFdBQVJnTCxNQUxjMGQ7O1dBTUV3TixPQU5KbDJCLE1BTUZzMUIsU0FORXQxQixNQU1QdzFCLE1BTk94MUI7VUFNSWsyQjs7U0FPVkMsU0FQVUQ7bUJBT0EsMENBQVZDOzs7T0FOWCx1QkFEVVgsVUFBS0YsZ0JBTkk1TTs7V0FlUHhpQixNQWZLbEcsTUFlVnkxQixRQWZVejFCO09BZUMsdUJBQVh5MUIsUUFmSFEsYUFlUS92QixXQWZPd2lCOztPQWlCUjtRQURTdmlCLE1BaEJIbkc7UUFnQkh1MUIsU0FoQkd2MUI7UUFnQlIyMUIsUUFoQlEzMUI7UUFpQmI0MUIsV0FEVUwsUUFoQlZVLGFBZ0JnQjl2QjtvQkFFcEIsc0JBRlN3dkI7eUJBQ0xDLE9BakJlbE47aUNBZ0JWaU4sUUFDTEMsUUFqQmVsTjs7T0FzQm5CO1FBRFlwYSxLQXJCS3RPO1FBc0JqQixlQUF5QzBvQixJQUFHMW9CLEdBQUssT0F0QjdDaTJCLGFBc0J3Q2oyQixHQUFIMG9CLElBQXlCO1FBQXhELGdDQURFcGE7T0FDd0Isc0NBdEJqQm9hOztXQW1CQXhkLFlBbkJGbEwsTUFtQkRvRyxNQW5CQ3BHO09Bb0JqQixtQkFJQW8yQixZQUxnQmh3QixjQUFHOEUsa0JBbkJBd2Q7O0dBc0JnRDtZQUVuRTBOLFlBQVlwMkI7SUFDUixJQUVKcTJCLFFBM0JJSixhQXdCUWoyQjtPQUdacTJCLHlCQURFcnJCLE9BQ0ZxckIsVUFEWSxPQUFWcnJCO0lBQ08sV0FBVHFyQjtHQUF3QjtZQUt4QnBxQixRQUFRaE07SUFDVixJQUFJLHFCQURNQSxPQUNOO1VBQ0ZxTDs7S0FBTyxXQUFvQix3QkFBM0JGOztHQUE4QztZQVloRGtyQixXQVRVQztJQUFPLE9BTGZ0cUI7O2NBS2tDLHVCQUExQnNxQjs7NkNBQU8sT0FBUEE7Y0FBTyx1Q0FBUEE7YUFBeUM7R0FBQztZQVVwREMsV0FUVXgyQixHQUFJLGFBQUpBLEdBQVU7WUFPcEI2SixpQkFBYyxTQUFFO1lBTWhCK0IsWUFBVTVMLEdBQUksT0EzQlpvMkIsWUFzQkZFLFdBS1V0MkIsSUFBc0M7WUFDaEQwUSxVQUFVMUYsTUFBTywyQkFBSyxXQUFaQSxTQUErQjtZQUV6QzNVLFFBQVFpTCxJQUFHQztJQUFLLElBQTRCLE1BSDVDcUssWUFHV3JLLEtBQWtCLE1BSDdCcUssWUFHUXRLO0lBQW9DO0dBQWM7WUFDMURoTCxNQUFNZ0wsSUFBR0M7SUFBSyxJQUEwQixNQUp4Q3FLLFlBSVNySyxLQUFnQixNQUp6QnFLLFlBSU10SztJQUFrQztHQUFjO1lBQ3REb0UsWUFBWU8sT0FBTWpHO0lBQTJCLFVBTDdDNEwsWUFLa0I1TDtJQUEyQixnQ0FBakNpRztHQUE4QztZQUMxRG9ELEtBQUtySixHQUFJLG9DQURUMEYsYUFDSzFGLEdBQTBCO1lBRS9CeTJCLGNBQWN6MkI7SUFDVixJQUVKMDJCLFVBaEJBSixXQWFjdDJCO2FBR2QwMkIsZ0JBRE9oNUIsSUFDUGc1QixZQURZLE9BQUxoNUI7SUFDdUIsVUF0QzVCMDRCLFlBc0NGTTtJQUE4QjtHQUE2QjtZQUczREMseUJBQXlCMzJCO0lBQUksSUFuRUZrRyxNQWdEM0Jvd0IsV0FtQnlCdDJCLElBbkVvQixNQWhDdkNvMUIsZUFnQ3FCbHZCO0lBQWtCO0dBbUUrQjtZQUM1RXlGLGVBQWUzTDtJQUF3QixVQWZ2QzRMLFlBZWU1TDtJQUF3QjtHQUFhO1lBQ3BENDJCLFFBQVE1ekI7SUFBSTs7YUFBYyxPQW5DeEJpSjs7dUJBbUNtQyx1QkFBN0JqSjs7Ozs7Ozs7dUJBQTZCO3NCQUFxQjs7R0FBRTtZQUM1RDZ6QixhQUFhN3pCO0lBQUk7O2FBQWMsT0FwQzdCaUo7O3VCQW9Dd0MsdUJBQTdCako7Ozs7Ozs7O3VCQUE2QjtzQkFBbUI7O0dBQUU7WUFDL0Q4ekIsVUFBVUMsUUFBUyxpQ0FBVEEsUUFBeUI7WUFDbkN0MUIsVUFBVWkxQjtJQUFVLE9BQWMsOEJBQXhCQTtHQUF3QztZQUNsRE0sUUFBUXRyQjtJQUFTLGtDQURqQmpLLFdBQ1FpSztHQUF5QztZQUNqRHVyQixTQUFTaDNCO0lBQUk7O2FBQWMsT0F4Q3pCZ00sd0JBd0NvQyxXQUFPLFdBQXBDaE0sT0FBMEM7O0dBQUU7WUFFckRmLE9BQVFnM0IsTUFBTWdCLFFBQU8xQixLQUFJbm1DLEdBQUU4bkM7SUFDN0IsT0FEZ0JEO3dCQUFPMUIsS0FHaUIsV0FIWDJCLFdBQUY5bkMsSUFBakI2bUM7OztlQUVjLE9BNUNwQmpxQjs7eUJBNEMrQixXQUZadXBCLEtBRTJCLFdBRnJCMkIsV0FBRjluQyxJQUFqQjZtQzt3QkFFMEQ7O0dBQ1Q7WUFHekRuckIsU0FBU0MsTUFBTyxPQUFjLDhCQUFyQkEsT0FBZ0M7WUFDekN3cUIsSUFBSXgxQixHQUFHdzFCO0lBQU0sNkJBQUssV0FBWEEsS0FuQ1BjLFdBbUNJdDJCO0dBQXlDO1lBRTdDbzNCLFdBQVdwM0IsR0FBR3cxQjtJQUNoQjs7YUFBYyxPQXBEVnZwQjs7dUJBb0RxQixJQUE2QixNQXRDcERxcUIsV0FxQ1d0MkIsdUJBQUd3MUI7Ozs7Ozs7Ozt1QkFDUztzQkFBMEM7O0dBQUU7WUFHbkU2QixNQUFNcjNCLEdBQUd3MUI7SUFBTSxPQUpmNEIsV0FJTXAzQixHQUEyQiwwQkFBeEJ3MUI7R0FBMkM7WUFFcEQ4QixRQUFRdDNCLEdBQUV3MUIsS0FBSW5tQyxHQUFFOG5DO0lBQ2xCOzthQUFjLE9BMURWbHJCOzt1QkEwRGdELFVBNUNsRHFxQixXQTJDUXQyQjt1QkFDZSxXQURidzFCLEtBQzJCLFdBRHJCMkIsV0FBRjluQztzQkFDaUQ7O0dBQUU7WUFHakV1USxRQUFTaTJCLGFBQVl2bkI7SUFBSzs7YUFBSztxQkFBdEJ1bkI7cUJBQTZDLDBCQUFqQ3ZuQixJQS9DckJnb0I7O0dBK0NpRjtHQUVyRjs7SUFNb0U7S0FJOUQ7UUFISXQyQjtJQUFLLE9BbkRYNEwsWUFtRE01TDtHQUdTO0dBSmpCO1lBT0V1M0IsT0FBT3YzQjtJQUNULEtBQU8sMEJBREVBLElBRUosZ0JBRklBOzs7Ozs7Ozs7dUJBTUEsZ0JBTkFBO1FBS09vTDtJQUFPLE9BQVBBO0dBQ0Q7WUFHYm9zQixPQUFRdHNCLFdBQVVFO0lBQ3BCLEdBRFVGOzs7b0JBSVk7O1VBQ054TjtTQUpaKzVCOzs7O09BRGdCcnNCO1NBUWRwTCxJQVJjb0w7VUFDaEJxc0IsYUFPYSxPQUFYejNCO1NBQ1EwM0IsY0FSVkQ7S0FRNEIsd0NBaEY5Qm5CLFdBK0VJdDJCLElBQ1EwM0I7O1NBUlZELGFBU3VCLHFDQVZQcnNCO1FBV1Z1c0IsY0FWTkY7SUFVd0I7OzRCQUFzQix3QkFYOUJyc0IsT0FXVnVzQjs7R0FBd0U7WUFPNUV2dEIsR0FBRytCLEtBQUluTTtJQUFvQyxVQTVFL0N5MkIsY0E0RVd6MkI7SUFBb0MscUNBQXhDbU07R0FBeUQ7O3FEQUE1RC9CLElBREFDOzs7O09BaEZKaFU7T0FDQUM7T0FDQW9QO09BQ0EyRDtPQUxBcUg7T0FEQTlFO09BRUNoQztPQVJEQztPQWNBNHNCO09BT0E5cUI7T0FEQWdyQjtPQUtBbDFCO09BSEFtMUI7T0FDQUM7T0FJQUk7T0FIQUg7T0FLQTUzQjtPQU1BNkw7T0FUQWlzQjtPQVVBeEI7T0FNQTZCO09BSkFEO09BTUFFO09BSUExM0I7T0F3QkE0M0I7T0FUQUQ7O1dBekxNenRCLFdBMkhOd3NCLFlBQ0FFOzs7RXRDbEpMOzs7Ozs7Ozs7Ozs7Ozs7OztJdUNRSzVzQjtJQVNJUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUNBRDs7WUFUSnd0QixNQUFNNTNCO0lBQUksTUFBTSwrQ0FBVkE7R0FBb0I7WUFDMUI2M0IsUUFBUTdzQixNQUFPLE9BRGY0c0IsTUFDcUIscUJBQWI1c0IsT0FBNEI7WUFDcEM4c0IsUUFBUTkzQixHQUFJLE9BQUpBLEVBQUs7WUFDYiszQixRQUFRLzNCLEdBQUksT0FBSkEsRUFBSzs7cURBTVRvSyxJQURBQzs7Ozs7Ozs7OztPQVRKVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQUNBZ3VCO09BQ0FDO09BQ0FDO09BQ0FDOzs7RXZDWkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SXlDS0twcUI7O0lBaURJUjtJQWpESk07Ozs7OztZQVFBcFgsUUFDRStlLE9BQVFyTSxPQUFRQztJQUFXLGtDQUEzQm9NLHNCQUFRck0sT0FBUUM7R0FBK0Q7WUFHakYxUyxNQUNFOGUsT0FBUTZpQixPQUFRQztJQUFXLGtDQUEzQjlpQixzQkFBUTZpQixPQUFRQztHQUEyRDtZQUc3RXh5QixZQU9Fd1EsYUFBYTVNLEtBQUlDO0lBQU8sa0NBQXhCMk0sNEJBQWE1TSxLQUFJQztHQUFnRTtZQUduRm1ILFVBQ0V5bkIsVUFBWUM7SUFBVyxrQ0FBdkJELHlCQUFZQztHQUErRDtZQUc3RXR1QixVQUNFdXVCLFVBQVlDO0lBQVcsa0NBQXZCRCx5QkFBWUM7R0FBK0Q7WUFHNUUxdUIsZUFDQ3NMO0lBQW9CLGtDQUFwQkE7R0FBK0U7WUFLakZyTCxVQUFVMHVCLGFBQVl2NEI7SUFDeEIsU0FEd0JBLFVBRW5Cb0QsSUFGbUJwRCxNQUVkLGtCQUZFdTRCLGFBRVBuMUI7UUFDR29ULFFBSGdCeFc7SUFHUCxpQ0FBVHdXO0dBQThCO1lBUWhDL0csTUFBTXhQLEdBQUU1UTtJQUNWLGFBQWtEbXBDLElBQUdDO0tBQU0sT0FBYyxrQ0FBdkJELFFBQUdDO0lBQThCO2lCQUF2RHg0QixHQUFFNVEsR0FBSyxrQkFBUDRRLEdBQUU1USxHQUFRO0lBQU8sbUNBRHJDNFEsR0FBRTVRO0dBQzBFO0dBRzVFO0lBQU5nUjtrREFOQThNLFVBRUFzQyxPQUlBcFA7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZWlCO0lBSXJCa1c7SUFDQVE7SUFDQUM7WUFFQU8sU0FBVzFSLEtBQW1CNUY7SUFDaEMsR0FEYTRGLFNBQVlDLE1BQVpELG9CQUFZQyxjQUFab0Y7SUFDYixJQUFJLGNBQUcsV0FEeUJqTCxRQUM1QjtVQUNGcUw7aURBRldKO0tBRUosV0FBTSxnQ0FBYkU7O0dBQWtGO1lBR2xGc3RCLGNBQWV4dEIsV0FBVWpMO0lBQUksT0FBSyxXQW5GbEN5TixNQThFQTZKLFNBS2VyTSxXQUFVakw7R0FBZ0M7WUFFekR1WDtJQUFTLHVCQUNObm9CLGNBQUssT0FBTEE7UUFDR3NvQjtJQUFPLGtDQUFQQTtHQUFzQjtZQUc1QjZmLE9BQVF0c0IsV0FBVUU7SUFBTSxXQUFNLDJCQUF0QkYsV0FBVUU7R0FBeUM7WUFFM0R1dEIsY0FBZXp0QixXQUNmcWU7SXpDbEdMLFN5Q2tHS0EsTUFBYSxPQUFiQTtRQUNNbmUsTUFETm1lO0lBQ2EsT0FKYmlPLE9BRWV0c0IsV0FFVEU7O1lBR05vTCxNQUFPMGYsTUFBTWdCLFFBQU9SLFNBQVF0ekIsR0FBRW1YO0lBQ2hDO1lBQU0sMkJBREcyYixNQUFNZ0IsUUFBT1IsU0FBUXR6QixHQUFFbVg7R0FDc0I7WUFHcERxZSxRQUFRNXRCLE1BQU8sV0FBTSwyQkFBYkEsT0FBa0M7WUFDMUM2dEIsYUFBYW5DO0lBQVUsV0FBTSwyQkFBaEJBO0dBQXlDO1lBQ3REb0MsT0FBT3B0QjtJQUFTLGtDQURoQm10QixjQUNPbnRCO0dBQTRDO1lBQ25EOHBCLElBQUl4MUIsR0FBR3cxQjtJQUFNO2tEQUFOQTtJQUE0QixtQ0FBL0J4MUI7R0FBK0M7WUFDbkRxM0IsTUFBTXIzQixHQUFHdzFCO0lBQU07a0RBQU5BO0lBQTRCLG1DQUEvQngxQjtHQUFpRDtZQUN2RG8zQixXQUFXcDNCLEdBQUd3MUI7SUFBTTtrREFBTkE7SUFBNEIsbUNBQS9CeDFCO0dBQXNEO1lBRWpFczNCLFFBQVF0M0IsR0FBRTAyQixTQUFRdHpCLEdBQUVtWDtpQkFDSzFWO0tBQUssT0FBaEMsMkJBQTJCQSxHQURmNnhCLFNBQVF0ekIsR0FBRW1YO0lBQzZDO0lBQTdDLG1DQURadmE7R0FDMEQ7WUFHbEUrNEIsY0FBY3I3QjtJQUFJLE9BZmxCOFksK0JBZWM5WTtHQUEwQztZQUN4RHNhLGVBQWVoVjtJQUFJO3NCekN0SHhCO0l5Q3NIeUMsc0NBQXJCQTs7R0FBK0Q7WUFDOUVrVixvQkFBb0JsVjtJQUFJLG9CQUF5RCxTQUFFO0lBQWhELFVBRG5DZ1YsZUFDb0JoVjtJQUFxQztHQUEyQjtZQUVwRmcyQix1QkFBdUJoMkI7SUFDekI7S0FBZSxrQ0FEVUE7S0FDakJpVjtLQUFKMUI7SUFDSixPQURJQSxtQkFFVSw4QkFGTjBCO0dBR0k7WUFHVmdoQixRQUFRajJCO0lBQ0osc0NBRElBO2tCQUVIM1QsY0FBSyxXQUFMQTtJQUVMO0tBRW9CO01BQ0Y7U0FDRnNvQjtLQUFPLE9BQVBBO0lBQVc7SUFGdEIsb0NBTkczVTtJQUlSLFdBQ0U7R0FHMkI7WUFHN0JrMkIsWUFBWWwyQixHQUFHL0M7aUJBQ2NxTjtrQkFHSnNMO01BQ1gsSUFDSnZwQixJQURJLFdBTEM0USxHQUlVMlk7ZUFFZnZwQixNQUFhLGtCQUxNaWUsT0FLbkJqZTtVQUNNc29CLE1BRE50b0I7TUFDYSxPQUFQc29CO0tBQVU7S0FIckIsb0NBSk8zVTtLQUVaLFdBQ0U7SUFJNEI7SUFOUjtHQU1ROztJQUc5QjZUO0lBQ0ExVztJQUNBK1c7OztPQTFJQTdnQjtPQUlBQztPQUlBb1A7T0FVQWdMO09BSUE1RztPQUlDRjs7Ozs7Ozs7O09BTURDO09BeENBMEQ7Ozs7Ozs7Ozs7Ozs7O09BMkVBd0o7T0FDQUM7T0FFQU87T0FLQW1oQjtPQVRBbmlCO09BV0FpQjtPQUtBZ2dCO09BRUFtQjtPQUtBbmlCO09BSUFvaUI7T0FDQUM7T0FDQUM7T0FDQXREO09BQ0E2QjtPQUNBRDtPQUVBRTtPQUlBeUI7T0FnQ0FsaUI7T0FDQTFXO09BQ0ErVztPQWpDQWM7T0FDQUU7T0FFQThnQjtPQU9BQztPQVdBQzs7O0V6QzNJTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7STBDWVFDO0lBMkJGdnZCOzs7Ozs7O0lBaUNESztJQWdDQUk7Ozs7Ozs7O0dBM0ZELFNBRkNxRyxVQWNDMG9CO0lBWkYsU0FZRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkFWd0M7Ozs7bUJBQ0Y7O29CQUZBOzs7ZUFXdENBOztNQUNBOzRDQWRFRCxrQkFhRkM7OztNQURBOzRDQVpFRCxrQkFhRkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFMQTs4Q0FSRUQsa0JBYUZDOzs7OztPQUhBOzZDQVZFRCxrQkFhRkM7OztNQVBBOzRDQU5FRCxrQkFhRkM7O0lBRWMsK0NBZlpELGtCQWFGQztHQUVvRjtZQUlyRnR2QjtJQUNELHNCQUNVLG1CQUNDLG9CQUNEOztHQUF3QjtPQWlCakN6VDtZQUVDcVAsWUFDRTRELEtBQUlDO0lBQ04sT0FETUE7O09BRUcsZ0NBRlBEOztPQUdRLGdDQUhSQTtlQUlPLGdDQUpQQTs7R0FJMkM7WUFrQjVDbFYsT0FBTy9FLEdBQU9DLEdBQUksT0FBWEQsSUFBT0MsVUFBa0I7WUFDaEM2ZixTQUFROWYsR0FBT0MsR0FBSSxPQUFYRCxLQUFPQyxVQUFtQjtZQUNsQytmLFNBQVFoZ0IsR0FBT0MsR0FBSSxPQUFYRCxNQUFPQyxVQUFtQjtZQUNsQ2k4QixTQUFPbDhCLEdBQU9DLEdBQUksT0FBWEQsTUFBT0MsVUFBa0I7WUFDaENzRixTQUFPdkYsR0FBT0MsR0FBSSxPQUFKQSxJQUFQRCxVQUF5QjtZQUNoQ3dGLFNBQVF4RixHQUFPQyxHQUFJLE9BQUpBLEtBQVBELFVBQTBCO1lBQ2xDaUcsVUFBV2pHLEdBQU9DLEdBQUksaUNBQVhELEdBQU9DLEdBQXNCO1lBQ3hDRixXQUFZQyxHQUFPQyxHQUFJLGlDQUFYRCxHQUFPQyxHQUF1QjtPQUMxQytIO1lBQ0FmLE1BQU9qSCxHQUFPQyxHQUFJLE9BQVhELE1BQU9DLFVBQWtCO1lBQ2hDQyxJQUFLRixHQUFPQyxHQUFJLE9BQUpBLEtBQVBELFFBQU9DLEVBQTJCO1lBQ3ZDRSxJQUFLSCxHQUFPQyxHQUFJLE9BQVhELEtBQU9DLElBQVBELElBQU9DLEVBQTJCO0dBWlI7OztPQUMvQjhFO09BQ0ErYTtPQUNBRTtPQUNBa2M7T0FDQTMyQjtPQUNBQztPQUNBUztPQUNBbEc7T0FDQWlJO09BQ0FmO09BQ0EvRztPQUNBQztZQUdGaVMsVUFBVS9ELEdBQUksT0FoRmRnVCxVQWdGd0IsNkJBQWRoVCxJQUFnQztZQUMxQzhELFVBQVV4QjtJQUFtQixVQTdEN0I4SixVQTZEVTlKO0lBQW1CO0dBQWE7WUFFMUNjO0lBQVMsc0JBQ0Ysa0JBQ0Msa0JBQ0Q7O0dBQUM7WUFRUk0sT0FBT21SLEdBQUksWUFBSkEsd0JBQXNEOzs7O09BOUY3RDdCO09Bb0JBNUc7T0FRQ0Y7T0FhRHZUO09BRUNxUDtPQWtCRHVFOztPQW1CQXhJO09BQ0FEO09BRUFWOztPQVVBdUo7T0FDQWpKOzs7RTFDekdMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1kyQ3VFS2k0QixJQUFJcEgsS0FBSTd1QixHQUFFQyxHQUFJLHVCQUFWNHVCLEtBQUk3dUIsR0FBRUMsV0FBZ0I7WUFDMUJpMkIsSUFBSXJILEtBQUk3dUIsR0FBRUMsR0FBSSxrQkFBVjR1QixLQUFJN3VCLEdBQUVDLGdCQUFnQjtZQUMxQi9NLE1BQU0yN0IsS0FBSTd1QixHQUFFQyxHQUFJLHdCQUFWNHVCLEtBQUk3dUIsR0FBRUMsV0FBZTtZQUUzQjdULElBQUl5aUMsS0FBSS9yQixLQUFFbEcsR0FBSyxPQUhmczVCLElBR0lySCxLQUFJL3JCLEtBQUVsRyxLQUFGa0csTUFBRWxHLEVBQW1DO1lBQzdDelEsSUFBSTBpQyxLQUFJL3JCLEtBQUVsRyxHQUFLLE9BTGZxNUIsSUFLSXBILEtBQUkvckIsS0FBRWxHLEtBQUZrRyxNQUFFbEcsRUFBbUM7O2FBUzNDNUwsT0FBTWdQLEdBQUVDO0tBQUksSUFoQlg0dUI7Z0JBQVUsV0FBVkEsS0FnQks3dUIsR0FBRUM7SUFBb0I7YUFDNUI4TCxTQUFNL0wsR0FBRUM7S0FBSSxJQWhCWDR1QjtZQUFVLFdBQVZBLEtBZ0JLN3VCLEdBQUVDO0lBQW9CO2FBQzVCZ00sU0FBT2pNLEdBQUVDLEdBQUksT0FoQmZnMkIsVUFnQlNqMkIsR0FBRUMsR0FBcUI7YUFDOUJrb0IsU0FBT25vQixHQUFFQyxHQUFJLE9BaEJmaTJCLFVBZ0JTbDJCLEdBQUVDLEdBQXFCO2FBQzlCek8sU0FBTXdPLEdBQUVDLEdBQUksT0FoQmQvTSxZQWdCUThNLEdBQUVDLEdBQXVCO2FBQy9CeE8sU0FBT3VPLEdBQUVDO0tBQUksSUFoQkw0dUI7a0JBQVUsV0FBVkEsS0FnQkQ3dUIsR0FBRUM7SUFBMkI7SUFOTixXQUc5QmdNLFVBQ0FrYyxVQUNBMzJCLFVBSkFSLFFBQ0ErYSxVQUlBdGE7Ozs7O0tBTkdUOzs7Ozs7S0FrQkhpQzthQUVBYixNQUFJMFEsS0FBRWxHLEdBQUssT0E3QmJ4USxJQTJCRTZHLFNBRUk2UCxLQUFFbEcsR0FBcUI7YUFDM0J6SyxNQUFJMlEsS0FBRWxHLEdBQUssT0E3QmJ6USxJQTBCRThHLFNBR0k2UCxLQUFFbEcsR0FBcUI7SUFOaUI7WUFmekM1TDs7Ozs7OztZQWtCSGlDO1lBRUFiO1lBQ0FEOzs7O0tBTUZ1VTtLQUlRc0c7S0FLSi9aLFVBTEkrWjsyREFLSi9aO0tBckJDakM7Ozs7Ozs7Ozs7YUE2QkhoRixXQUFXOFcsS0FBRWxHLEdBQUssa0JBN0JmM0ksV0E2QlUySSxHQUFGa0csS0FBbUI7YUFDOUJxekIsUUFBUXY1QixHQUFHdzVCLEtBQUtDO0tBQU8scUJBOUJwQnRxQixVQThCUXFxQixLQUFIeDVCO0tBQWUsd0JBOUJwQm1QLFVBOEJLblAsR0FBUXk1QjtJQUE0QjthQUM1Q0MsZ0JBQWdCMTVCLEdBQUd4USxLQUFLRDtLQUFNLE9BQUcsV0EvQjlCcUYsVUErQmFvTCxHQUFHeFE7O2VBQXVDLFdBL0J2RDJmLFVBK0JhblAsR0FBUXpRLE9BQVJ5USxJQUFRelE7SUFBMEQ7YUFFbEZvcUMsVUFBVTM1QixHQUFHeFEsS0FBS0Q7S0FDcEIsR0FBTyxXQWxDRjRmLFVBaUNVM2YsS0FBS0QsTUFFcEIsT0FKRW1xQyxnQkFFVTE1QixHQUFHeFEsS0FBS0Q7S0FDcEI7SUFDMkI7YUFHekJxcUMsTUFBTTU1QixHQUFHeFEsS0FBS0Q7S0FDaEIsS0FBRyxXQXZDRWc4QixVQXNDTS83QixLQUFLRDtNQU9YLFdBZEhtcUMsZ0JBT00xNUIsR0FBR3hRLEtBQUtEO0tBTVQ7K0JBQWlDLFdBaEN4Q3VhLFdBMEJnQnZhO01BTVQseUJBQVMsV0FoQ2hCdWEsV0EwQld0YTtNQUlQOztJQUdpQztJQTVCMEM7WUFqQjFFNEU7Ozs7Ozs7Ozs7O1lBNkJIaEY7WUFDQW1xQztZQUdBSTtZQUtBQztZQXRCTXhwQjs7OztLQXNDUnRHOzs7SUFJcUIsaUNBSnJCQTs7O1FBMkJJQTthQUlBelQsUUFBUTZQLEtBQUVsRztLQUFLLElBQTBCLHVCQUEvQkEsSUFBZSx1QkFBakJrRztLQUFpQztJQUFnQjtJQVB6RCxnQkFPQTdQLFNBSkF5VDs7WUFRSit2QixjQUFjQyxNQUFLenFDLEdBQUVDO0lBQ3ZCLFlBRGdCd3FDO0lBQ0Q7aUJBSUw7S0FGSSxJQURIQyxtQkFBUDlILGdCQUNJL3VCLE1BQU0sV0FEVit1QixLQUZpQjVpQyxHQUFFQztLQUluQixTQURJNFQsS0FDMkIsT0FEM0JBO2lCQURHNjJCOztHQUtGO1lBR1BDLEtBQUsvSCxLQUFLaHlCLEdBQUU1USxHQUFFQztJQUFjLHFCQUFsQjJRLEdBQUkzUTtJQUFjLGtCQUF2QjJpQyxLQUFpQixXQUFaaHlCLEdBQUU1UTtHQUFxQjtZQUNqQzRxQyxRQUFRaEksS0FBSTVpQyxHQUFFQyxHQUFJLGtCQUFWMmlDLEtBQU0zaUMsR0FBRkQsR0FBYTs7O2FBdkx2QjZxQyxZQUFZbDZCLEdBQUksMkJBQUpBLGdCQUFzQjthQUNsQ202QixnQkFBZ0JuNkIsR0FBSSw0QkFBSkEsZ0JBQXVCO2FBQ3ZDbzZCLFlBQVlwNkIsR0FBSSx1QkFBSkEsb0JBQXNCO2FBQ2xDcTZCLGdCQUFnQnI2QixHQUFJLHVCQUFKQSxxQkFBdUI7YUFDdkNzNkIsS0FBS3Q2QjtLQUFpQiwwQkFBakJBO0tBQWlCO0lBQWdCO0lBUDVDO1lBR01rNkI7WUFDQUM7WUFDQUM7WUFDQUM7WUFDQUM7Ozs7O09Bd0tGVDtPQVVBRztPQUNBQztPQTlIQTNqQztPQUdBL0c7T0FEQUM7Ozs7Ozs7O1NBekNJc2E7Ozs7O2lCQVNGeXZCLFFBQVF2NUIsR0FBR3c1QixLQUFLQztTQUFPOytCQUFaRCxLQUFIeDVCO1VBQWUsWUFBWSxlQUEzQkEsR0FBUXk1QjtTQUFtQjtRQUFTO2lCQUM1Q0MsZ0JBQWdCMTVCLEdBQUd4USxLQUFLRDtTQUFNLE9BQUcsY0FBakJ5USxHQUFHeFEsYUFBdUMsZUFBMUN3USxHQUFRelEsT0FBUnlRLElBQVF6UTtRQUEwRDtpQkFFbEZvcUMsVUFBVTM1QixHQUFHeFEsS0FBS0Q7U0FDcEIsR0FBTyxlQURRQyxLQUFLRCxNQUVwQixPQUpFbXFDLGdCQUVVMTVCLEdBQUd4USxLQUFLRDtTQUNwQjtRQUMyQjtpQkFHekJxcUMsTUFBTTU1QixHQUFHeFEsS0FBS0Q7U0FDaEIsS0FBRyxpQkFEUUMsS0FBS0Q7VUFPWCxXQWRIbXFDLGdCQU9NMTVCLEdBQUd4USxLQUFLRDtTQU1UO2lDQUFpQyxpQkFOeEJBO1VBTVQsdUJBQVMsaUJBTkxDO1VBSVA7O1FBR2lDOzs7NERBeEJqQ3NhOzs7Ozs7Ozs7Ozs7Ozs7Z0JBU0Z5dkI7Z0JBR0FJO2dCQUtBQzs7Ozs7O0UzQ25EUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJNkNpQmlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQUExQm9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBUjBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQUExQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFN0NUUDs7Ozs7Ozs7Ozs7Ozs7OztJOENNTy93QjtJQXdCQUk7OztJQXRCQzNFO0lBSUNtSDs7R0FDSixTQUZHeEQsS0FFQ2hhLEdBQUssa0JBREx3ZCxNQUNBeGQsR0FBVzs7SUFHYnFoQjtJQUNBNUc7SUFDQ0Y7WUFJRHZULG9CQUFjLFNBQUM7WUFFZm9MO0lBQVk7Y0FFUDs7R0FBMkM7WUFHaERELGlCQUFlLFdBQUk7Ozs7OztTQVBuQm5MO1NBZENxUDtTQUdBMkQ7U0FLRHFIO1NBQ0E1RztTQU9Bckk7U0FLQUQ7U0FDQTZJOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBTUZSLGlCQUFlLFNBQUU7Ozs7T0E5QmZJO09BWUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JIQzs7O0U5Q3BDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1krQ0lLb3hCLFlBQWF4Z0IsS0FBS3RiLFlBQVF1YjtJQUM1QjtLQUFJLGNBQVUsNEJBRENELEtBQUt0YixRQUFRdWI7S0FDeEI7Ozs7O1NBQ2VoZDtLQUFLLHFDQUFMQTs7R0FBNEI7Ozt1REFGN0N1OUI7Ozs7RS9DSkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lnRDBDS0Msc0JBQXVCemdCLEtBQUt0YixLQUFJYSxHQUFHK1IsS0FBS2pRLFFBQVFxNUI7SUFDbEQ7S0FDdUUsaUJBRjdCcjVCLFFBQVI5QjtLQUVoQyxzREFGdUJ5YSxLQUFLdGI7S0FDckIyYjtLQWpCc0NzZ0I7S0FxQnRDLGtDQXJCc0NBLE9BaUJ0Q3RnQjtLQWpCMEN1Z0IsT0FxQjFDO0tBckNvQ0MsT0FnQkVGO0tBaEJFNWQsS0FnQkU2ZDtJQUduRDtLQUFHLG1DQW5COEM3ZCxJQUFKOGQ7TUFzQjNCO3lDQXRCK0I5ZCxJQUFKOGQ7T0FzQjVCO09BQVhDLE1BQU0sNEJBdEJpQ0Q7TUF1QnhDLGNBUzZDSCxNQVR4QyxXQVMyQnBwQixLQUFIL1IsR0FWNUJ1N0IsV0F0QjJDL2QsS0FzQjNDK2Q7TUFPNkMsSUFiSkMsT0FhSSw0QkFQN0NELFNBdEJ1Q0QsT0FnQkVFOzs7U0FoQkZqZTtLQUM3QztTQURpREMsS0FBSkQsSUFFeEM7TUFDRyxjQTZCMEM0ZCxNQTdCckMsV0E2QndCcHBCLEtBQUgvUixHQWhDV3VkLE1BSXhDLFdBSndDQTtNQUtFLElBTEZrZSxPQUtFLDRCQUxGbGU7OztHQXVDTTtZQU1qRG1lLHFCQUFzQmpoQixLQUFLdGIsS0FBSWEsR0FBR203QixNQUFNcHBCLEtBQUtqUTtJQUMvQztLQUN1RSxpQkFGeEJBLFFBQWQ5QjtLQUUvQixzREFGc0J5YSxLQUFLdGI7S0FDcEIyYjtLQUFMc2dCO0lBR0osU0FIU3RnQixPQUlKO0lBR0c7O09BckJOb2dCO2FBY0VFLFlBQUt0Z0IsUUFEd0I5YSxHQUFTK1IsS0FBS2pRLFFBUWMsdUJBUnpCcTVCOztTQWEzQmxpQztrQkFaTG1pQyxnQkFZZSw0QkFBVm5pQzs7SUFKUyxzQ0FSZG1pQyxPQUFLdGdCO0lBUUcsV0FBSztHQUlVO1lBR3pCNmdCLGNBQWVsaEIsS0FBS3RiLEtBQUlhLEdBQUc4QixRQUFRaVEsS0FBSzFiLFNBQVF1bEMsS0FBSXJ0QjtJQUN0RCxpQkFEa0RxdEI7Ozs7aUJBN0JoRFY7a0JBNkJlemdCO2tCQUFLdGI7a0JBQUlhO2tCQUFXK1I7a0JBQVJqUTsyQkFtQitCelMsR0FBSyx1QkFuQnZCZ0gsU0FtQmtCaEgsR0FuQk5rZixXQW1CMkI7aUJBbkMvRW10QjtrQkFnQmVqaEI7a0JBQUt0YjtrQkFBSWE7MkJBR2lDM1EsR0FBSyxrQkFIdEJnSCxTQUdpQmhILEdBSExrZixlQUd5QjtrQkFIMUN3RDtrQkFBUmpROztrQkFBcUI4NUI7aUJBaEJoREY7a0JBZ0JlamhCO2tCQUFLdGI7a0JBQUlhOzJCQUtpQzNRLEdBQUssa0JBTHRCZ0gsU0FLaUJoSCxHQUxMa2YsZ0JBSzBCO2tCQUwzQ3dEO2tCQUFSalE7aUJBN0IzQm81QjtrQkE2QmV6Z0I7a0JBQUt0YjtrQkFBSWE7a0JBQVcrUjtrQkFBUmpROzJCQXFCK0J6UyxHQUFLLHNCQXJCdkJnSCxTQXFCa0JoSCxHQXJCTmtmLFdBcUIwQjtzQkFyQjlCcXRCO0tBYzdDOztRQTlCSEY7VUFnQmVqaEI7VUFBS3RiO1VBQUlhO21CQWNvQzNRLEdBQUssa0JBZHpCZ0gsU0Fjb0JoSCxHQWRSa2YsZ0JBYzZCO1VBZDlDd0Q7VUFBUmpROztVQWdCbkJ6UztNQUFPLG9CQWhCeUJnSCxTQWdCakIsV0FoQlkwYixLQUFYL1IsR0FnQmhCM1EsSUFoQjRDa2YsSUFnQlYsV0FBbENsZjs7S0FDWTs7SUFUakI7O09BckNINnJDO1NBNkJlemdCO1NBQUt0YjtTQUFJYTtTQUFXK1I7U0FBUmpRO2tCQVFrQ3pTLEdBQUssdUJBUjFCZ0gsU0FRcUJoSCxHQVJUa2YsV0FROEI7O1NBRTFFNkg7S0FBTyxvQkFWeUIvZixTQVVqQixXQVZZMGIsS0FBWC9SLEdBVWhCb1csTUFWNEM3SDtNQVVWLFdBQWxDNkg7O0lBQ1k7R0FVMkQ7WUFHL0V5bEIsd0JBQXlCcGhCLEtBQUt0YixLQUFJYSxHQUFHOEIsUUFBUWlRLEtBQUsrcEIsWUFBV0Y7YUFDM0RHLFFBQVExc0M7S0FDVixvQkFBTSxXQUY0Q3lzQyxZQUN4Q3pzQztJQUdPO0lBRW5CLFNBQUkyc0MsU0FBUzNzQyxHQUFJLFdBTGIwc0MsUUFLUzFzQyxHQUFtQjtJQUNoQyxvQkFQK0R1c0M7Y0F4QzdERixxQkF3Q3lCamhCLEtBQUt0YixLQUFJYSxHQUNoQys3QixTQUQyQ2hxQixLQUFSalE7Y0FyRHJDbzVCLHNCQXFEeUJ6Z0IsS0FBS3RiLEtBQUlhLEdBQVcrUixLQUFSalEsUUFNbkNrNkI7R0FHOEU7Z0NBakNoRkwsZUF3QkFFOzs7RWhEL0ZMOzs7Ozs7R2lEd0I4Qjs7SUFXdkI1eEI7Ozs7OztJQXFCQWd5QjtJQWhDdUIsMEJBV3ZCaHlCO0lBYzJCLDhCQU8zQmd5Qjs7Ozs7O0VqRHhEUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRa0RhT2xxQixZQUNBalE7YUFFQTY1QixjQUFlbGhCLEtBQUt0YixLQUFJYSxHQUFHM0osU0FBUXVsQyxLQUFJcnRCO0tBQ3pDOztjQURpQmtNO2NBQUt0YjtjQUFJYTtjQUZ4QjhCO2NBREFpUTtjQUcyQjFiO2NBQVF1bEM7Y0FBSXJ0QjtJQUMwQjthQUdqRXN0Qix3QkFBeUJwaEIsS0FBS3RiLEtBQUlhLEdBQUc4N0IsWUFBV0Y7S0FDbEQ7O2NBRDJCbmhCO2NBQUt0YjtjQUFJYTtjQU5sQzhCO2NBREFpUTtjQU9xQytwQjtjQUFXRjtJQUM0QjtJQVR0RCxXQUN0QjdwQixLQUNBalEsUUFFQTY1QixlQUlBRTs7O0lBWW9DLElBSWxDOXBCLFlBQ0FqUSxlQUxrQyxtQkFJbENpUSxLQUNBalE7Ozs7Ozs7UUFaZ0M7Ozs7Ozs7RWxEekJ6Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7UW1Ea0JPbU87YUFFQTNRLEtBQU00YixLQUFLZ2hCLFNBQVNqaEIsS0FBS2toQixTQUFTaDlCO0tBSXBCLDZCQUpSK2I7S0FDUiw4Q0FEYWdoQixTQUF1Qi84QjtLQVFwQiw2QkFSTThiO0tBS3RCLDhDQUwyQmtoQixTQUFTaDlCOzs7ZUFTcEIsV0FYZDhRLGFBRU1pTCxLQUFLZ2hCLFNBQVNqaEIsS0FBS2toQixTQUFTaDlCOztJQVN3QjthQUcxRGk5QixNQUNHbGhCLEtBQ0NyVixVQUVEb1Y7S0FJTCxHQU5NcFYsU0FBVUMsTUFBVkQsa0JBQVVDLGNBQVZvMkI7S0FNTjtVQUxnQjVjLGdCQUFWK2MsVUFBVS9jOzs7Z0NBRlhwRTtPQUVDbWhCLFVBQVUsaUNBRFZIO0tBTU4sWUFIZ0J0YSxnQkFBVnVhLFVBQVV2YSxnQkFBVnVhO0tBR04sT0FwQkU3OEIsS0FhRzRiLEtBQ0NnaEIsU0FFRGpoQixLQUNDa2hCLFNBRkFFO0lBS3VDO2FBTTNDeDhCLElBQUlxYixLQUFLVCxLQUFLdGI7S0FDb0QsNkJBRDlEK2I7S0FDTiw4Q0FEV1QsS0FBS3RiO0tBRU4sSUFBTjhiLE1BQU0sbUJBRk05YixLQUFWK2I7WUFBVS9iLEtBR0EsV0EvQmQ4USxhQTRCSWlMLEtBQUtULEtBRVBRLFFBRlk5YjtLQUdBLE9BRFo4YjtJQUVEO2FBR0RxaEIsS0FBT3oyQixLQUFVMUcsS0FBSStiO0tBQ3ZCLEdBRFNyVixTQUFNQyxNQUFORCxjQUFNQyxjQUFOMlU7S0FDVCxHQURtQnRiO1VBTVBsRyxJQU5Pa0csUUFNUDJGOztNQUNHO2dDQVBRb1c7T0FNWHBXLE1BQ0csaUNBUE4yVjtLQU9NLE9BZGI1YSxJQU9xQnFiLEtBQWRULEtBTUczVjtJQUN3QjtJQTNDeEMsV0FDTW1MLGFBRUEzUSxNQVlBODhCLE9BY0F2OEIsS0FPQXk4Qjs7O2FBeUVBejhCLElBQUlxYixLQUFLVCxLQUFLdGI7S0FDNEMsa0NBRHREK2IsS0FBS1QsS0FBS3RiO0tBQzRDO0lBQW1CO2FBRzdFbTlCLEtBQU03aEIsS0FBS3RiLEtBQUkrYjtLQUMyQyxrQ0FEcERULEtBQUt0YixLQUFJK2I7S0FDMkM7SUFBb0I7SUFScEYsV0FHTXJiLEtBSUF5OEI7Ozs7Ozs7Ozs7O1FBaEJJeDZCO2FBQ0F5NkIsWUFBYXA5QixZQUFRLDBCQUFSQSxLQUFtQjs7S0FDaEM4UTtLQVRBa0o7dUNBT0FyWCxRQUNBeTZCLGFBQ0F0c0I7Ozs7Ozs7aUJBOUJGc3NCLFlBQWFwOUIsWUFBUSwrQkFBUkEsS0FBbUI7O1NBQ2hDMkM7U0FDQW1POzt3QkFEQW5PLHFCQURBeTZCLGFBRUF0c0I7U0F0RUZ1c0I7U0FFQWw5QjtTQVlBODhCO1NBY0F2OEI7U0FPQXk4QjttQkFqQ0FoOUIsTUFZQTg4QixPQWRBSSxlQTRCQTM4QixLQU9BeThCOzs7Ozs7OztFbkRyRFA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJb0RvQ1dqbUM7SUFDQXFQO0lBQ0FnTDs7OztZQUVSOUcsZUFaTXNMO0lBQW9CLG9DQUFwQkE7R0FBd0Q7WUFxQjVEdW5CLGVBQVUscUJBRUE7WUFHVkMsZUFBVSxxQkFFQTtZQUdWQyxVQUFVQyxHQUFHdGhCLFdBQVNyYjtJQUN4QixLQURZMjhCLEdBR0YsT0FIS3RoQjtRQUVSanNCLElBRkt1dEM7SUFFQSxrQkFGWTM4QixHQUVqQjVRO0dBQ1U7WUFHZjhRLEtBQUt5OEIsR0FBRzM4QjtJQUNWLEtBRE8yOEIsR0FFRztRQUNIeDVCLElBSEF3NUI7SUFHSyxrQkFIRjM4QixHQUdIbUQ7R0FBUTtZQUdieUcsVUFBVTVKLEdBQUVELEdBQUksT0FOaEJHLEtBTVlILEdBQUZDLEdBQWU7WUFFekI0OEIsS0FBS3h0QyxHQUFHNFE7SUFDVixLQURVQSxHQUVBO1FBQ0h1dUIsTUFIR3Z1QjtJQUdFLGtCQUFMdXVCLEtBSEFuL0I7R0FHUTtZQUdiK2dDLE1BQU1wd0IsR0FBR3NiO0lBQ1gsS0FEUXRiLEdBRUUsT0FGQ3NiO1FBR0pqc0IsSUFIQzJRO0lBR0ksT0FBTDNRO0dBQU07WUFHWHl0QyxVQUFXNUcsTUFBTTFmLE9BQU9rZ0IsU0FBUTEyQjtJQUNsQyxHQURrQ0EsT0FFM0IzUSxJQUYyQjJRLE1BRXRCLE9BQUwzUTtPQUZNNm1DO1NBVUYvckIsSUFWRStyQjtRQUFNMWY7TUFpQlg7T0FKVzNSLElBYkEyUjtPQWlCWDs7O09BRkEsTUFyQk40WixNQU13QnNHO2FBY3BCLDBDQURhN3hCLEdBSFJzRjthQVZldXNCOztPQVlEbmQsSUFaQ21kOztTQVlJLGlDQUFMbmQsR0FGZHBQOzs7O1NBQ0w7Ozs7O1dBREtBOztTQU5MNHlCOztZQUphdm1CO1NBUUZxSixNQVJFcko7UUFBT2tnQjtVQVNEc0csTUFUQ3RHLGtCQVNJLDJCQURiN1csS0FDUW1kOztnQkFEUm5kO1NBSlhrZDs7WUFKb0JyRztTQU9IdUcsTUFQR3ZHLFlBSXBCcUcsVUFHc0IsMkJBQUxFOztTQUhqQkYsVUFFb0I7SUFheEIsa0NBZklBO0dBZWE7WUFHakJHLGVBQWVOLEdBQUd0aEI7SUFDcEIsS0FEaUJzaEIsR0FHUCxrQkFIVXRoQjtRQUVianNCLElBRlV1dEM7SUFFTCxPQUFMdnRDO0dBQ2E7WUFHbEIycEIsU0FBU2haLEdBQ1gsS0FEV0EsR0FFRCxnQkFDSDNRLElBSEkyUSxNQUdDLFdBQUwzUSxHQUFZO1lBR2pCeVEsUUFBUUUsR0FDVixLQURVQSxHQUVBLGNBQ0gzUSxJQUhHMlEsTUFHRSxXQUFMM1EsTUFBVTtZQUdmc3BCLFFBQVEzWSxVQUFlLE9BQWZBLEVBQWdCO1lBQ3hCNlksUUFBUTdZLFVBQWUsT0FBZkEsRUFBZ0I7WUFFeEJvWSxJQUFxQkMsR3BEaEkxQixnQm9EZ0lrRXJZLEdBQUdDLEdBQ2xFLE9BdEVFMDhCLFVBcUU2RDM4QixHQUF4Q3FZLE1BQTJDcFksR0FDcEM7WUFHNUJzQyxRQUFRdkMsR0FBR0M7SUFDYixLQURVRCxHQUVBO1FBQ0gzUSxJQUhHMlE7SUFHRSxrQkFIQ0MsR0FHTjVRO0dBQVE7WUFHYjZTLE9BQU9sQyxHQUFHQztJQUNaLEtBRFNELEdBRUM7UUFDSDNRLElBSEUyUTtJQUdHLGtCQUhBQyxHQUdMNVE7R0FBUTtZQUdiK3FCLElBQUlwYSxHQUFFb0QsR0FBRzlNO0lBQ1gsS0FETTBKLEdBRUk7UUFDSDJILE1BSEQzSDtJQUdPLGtCQUhGMUosT0FBSDhNLEdBR0R1RTtHQUFnQjtZQUdyQjdGLE9BQU85QixHQUNULE9BRFNBLFVBR0k7WUFLWEQsS0FBS0MsR0FBR04sTUFBTU87SUFDaEIsS0FET0QsR0FFRyxPQUZBTjtRQUdIclEsSUFIQTJRO0lBR0ssa0JBSElDLEdBQU5QLE1BR0hyUTtHQUFhO1lBR2xCOG9CLE1BQU1uWSxHQUFHQztJQUNYLEtBRFFELEdBRUU7UUFDSG9ELElBSENwRDtJQUdPLGtCQUhKQyxHQUdKbUQ7R0FBeUI7WUFHOUIyVixLQUFLL1ksR0FBR0M7SUFDVixLQURPRCxHQUVHO1FBQ0gzUSxJQUhBMlE7SUFHUSxrQkFITEMsR0FHSDVRLEtBSEEyUTtHQUc0QjtZQUdqQzhZLFNBQVM5WSxHQUFHQztJQUNkLEtBRFdELEdBRUQ7UUFDSG9ELElBSElwRDtJQUdDLGtCQUhFQyxHQUdQbUQ7R0FBUTtZQUdiOU0sTUFBTTJKLEdBQUVpRyxLQUFFbEc7SUFDWixHQURVa0c7UUFBRWxHLE9BR0czUSxJQUhIMlEsTUFHTG9XLE1BSEdsUSxRQUdXLGtCQUhiakcsR0FHRG1XLEtBQVEvbUI7O2NBSEgyUSxHQUVJO0lBRVQ7R0FBSztZQUdWbTlCLEtBQUs5dEMsR0FBSSxXQUFKQSxHQUFVO1lBRWYrdEMsV0FBVy90QyxHQUFFQyxHQUNmLE9BRGFELFFBQUVDLEVBR0o7WUFHVCt0QyxRQUFRQyxNQUFLanVDLEdBQUksT0FBVGl1QyxXQUFLanVDLE9BQWlDO1lBRTlDNjdCLE1BQU05bkIsR0FBRUMsR0FBR3BEO0lBQ2IsR0FEUW1EO1FBQUVDLE9BR0t1RSxNQUhMdkUsTUFHSHNFLE1BSEN2RSxNQUdZLFdBQUssV0FIWm5ELEdBR04wSCxLQUFRQztTQURQdlksSUFGQStUOzs7U0FFQS9ULElBRkVnVTtJQUVhLE9BQWZoVTtHQUN3QjtZQUc5QjAwQixPQUVBL2pCLEdBRlVDO0lBQ1osR0FDRUQsT0FBS3VPLElBQUx2TyxNQUFpQixjQUZQQyxHQUVMc08sSUFBbUIsT0FBeEJ2TztJQUNLO0dBQUk7WUFHVHVYLFNBQVN0WDtJQUNYLElBQU0sSUFDSjVRLElBREksV0FESzRRLGtCQUdNO0lBRFYsV0FBTDVRO0dBQ21CO1lBR25CcXBDLGNBQWN6NEI7SUFDaEIsSUFBTSxJQUNKNVEsSUFESSxXQURVNFEsT0FFVCxPQUFMNVEsY0FDZTtHQUFJO2dCQUdmMlEsR0FBR0M7SUFDVCxLQURNRCxHQUVJO1FBQ0hvRCxJQUhEcEQ7SUFHTSxXQUFLLFdBSFJDLEdBR0ZtRDtHQUFlO1lBYWxCcU0sTUFWSXhQLEdBQUU1USxHQUNWLEtBRFE0USxHQUVFLGNBQ0h1dUIsTUFIQ3Z1QixNQUdJLFdBSEY1USxHQUdIbS9CLEtBQWE7WUFNaEJyaEIsU0FBTzlkLEdBQUksV0FBSkEsR0FBVTtHQUVYLElBQU5nUjtZQUVBb04sS0FBS212QixHQUFHMzhCO0lBQ1YsS0FETzI4QixHQUVHO1FBQ0h2dEMsSUFIQXV0QztJQUdLLGtCQUhGMzhCLEdBR0g1UTtHQUFROzt3Q0FIYm9lLE1BSkFOLFVBRUE5TTs7Ozs7OztrREFGQThNLFVBQ0FzQyxPQUNBcFA7Ozs7Ozs7Ozs7Ozs7O1lBWUZpWSxZQUFZdFksR0FBR04sTUFBTU87SUFBSSxxQ0E5RnpCRixNQThGZUwsTUFBTU8sR0FBVEQ7R0FBbUQ7WUFDL0R5WSxXQUFXelksR0FBR04sTUFBTU87SUFBSSx3Q0EvRnhCRixNQStGY0wsTUFBTU87SUFBSSxxQnBEN1A3Qiw0Qm9ENlBnQkQ7R0FBa0Q7Ozs7T0F6TnZEM0o7T0FDQXFQO09BR1JrRTtPQThJRXRUO09BL0dBdVQ7T0FqQ002Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNOMGY7T0FNQTBNO09BMUJBSDtPQWdEQU87T0FtREFuOUI7T0FkQXFhO09BTUF0WTtPQXJGQTNCO09BeUVBK0I7T0FOQUs7T0FzQ0F3VztPQU1BRDtPQXpEQWhaO09BTkFrWjtPQXhDQTZqQjtPQThIQTNSO09BTUFuSDtPQU1BeE07T0FNQW1oQjtPQTVCQXlFO09BRUFDO09BTUFDO09BcEpBWjtPQUtBQztPQUxBRDtPQTJNQW5rQjtPQUNBRztPQWhJQUU7T0FDQUU7T0FzQ0FWO09BcENBQzs7O0VwRGhJTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2FxRFdPMUgsVUFBVTFGO0tBQ0osSUFBSnROLElBQUksd0JBRElzTjtLQUVaLElBQUksMkJBREF0TixJQUNBO1dBQ0Y0Tjs7TUFBTyxvQ0FBUEYsS0FIVUo7O0lBR3VCO2FBR2pDbEIsVUFBVTlKO0tBQXVCLDJCQUF2QkE7S0FBdUI7SUFBaUI7SUFQTixXQUM1QzBRLFdBTUE1Rzs7O2FBVUE0RyxVQUFVNnNCLFdBQVV2eUI7S0FDZCxJQUFKdE4sSUFBSSx3QkFESTYvQixXQUFVdnlCO0tBRXRCLElBQUksMkJBREF0TixJQUNBO1dBQ0Y0Tjs7TUFBTyxvQ0FBUEYsS0FIb0JKOztJQUdhO2FBR2pDbEIsVUFBVXlRLFdBQVV2YTtLQUFpQywyQkFBakNBO0tBQWlDLCtCQUEzQ3VhO0lBQTREO0lBUGxCLFdBQ3BEN0osV0FNQTVHOzs7YUFVQTRHLFVBQVU2c0IsV0FBVUMsV0FBVXh5QjtLQUN4QixJQUFKdE4sSUFBSSx3QkFESTYvQixXQUFVQyxXQUFVeHlCO0tBRWhDLElBQUksMkJBREF0TixJQUNBO1dBQ0Y0Tjs7TUFBTyxvQ0FBUEYsS0FIOEJKOztJQUdHO2FBR2pDbEIsVUFBVXlRLFdBQVVrakIsV0FBVXo5QjtLQUNPLDJCQURQQTtLQUNPLCtCQUQzQnVhLFdBQVVrakI7SUFDa0M7SUFSVSxXQUNoRS9zQixXQU1BNUc7OzthQVlBNEcsVUFBVTZzQixXQUFVQyxXQUFVRSxXQUFVMXlCO0tBQ2xDLElBQUp0TixJQUFJLHdCQURJNi9CLFdBQVVDLFdBQVVFLFdBQVUxeUI7S0FFMUMsSUFBSSwyQkFEQXROLElBQ0E7V0FDRjROOztNQUFPLG9DQUFQRixLQUh3Q0o7O0lBR1A7YUFHakNsQixVQUFVeVEsV0FBVWtqQixXQUFVRSxXQUFVMzlCO0tBQ08sMkJBRFBBO0tBQ08sK0JBRHJDdWEsV0FBVWtqQixXQUFVRTtJQUNrQztJQVJRLFdBQ3hFanRCLFdBTUE1Rzs7O2FBTUE0RyxVQUFVMUY7S0FDWixTQURZQTtNQU1WO2lFQU5VQTtTQUVBdE4sSUFGQXNOO0tBR1YsSUFBSywyQkFES3ROLElBQ0w7V0FDRjROOztNQUFPLG9DQUFQRixLQUpPSjs7SUFRSjthQUdObEIsVUFBVTlKLEdBQUksV0FBVSxpQkFBZEEsSUFBNkI7SUFab0IsV0FDM0QwUSxXQVdBNUc7Ozs7Ozs7Ozs7OztFckRwRlA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SXVER0ttRDtZQUVBN00sTUFBT0wsTUFBS0MsR0FBR0M7SUFFZDtNQUZNRixNQUFLQyxlQUVZL0csR0FBRTVKLEdBQ3ZCLFdBSFk0USxHQUVTaEgsR0FBRTVKLElBQ3ZCLE9BRHFCNEosVUFFaEI7SUFGUDtHQUdNO1lBR1A0d0IsTUFBTzlwQixNQUFLQyxHQUFHTixNQUFNTztJQUNmLElBQUpoSDtJQUNZO2FBRlA4RzthQUFLQzthQUFHTjtzQkFFSTZZLEtBQUloSztjQUNiLElBQU44YixRQUFNLFdBSFdwcUIsR0FDbkJoSCxNQUNpQnNmLEtBQUloSztjQURyQnRWO2NBSUYsT0FGSW94QjthQUVEO0dBQUM7WUFHSnNELE9BQVE5RCxPQUFNN3BCLEdBQUdDO0lBQUksT0FBbUI7YUFBaEM0cEI7YUFBTTdwQjs7c0JBQStCL0csR0FBRXNaLEdBQUVuUCxHQUFLLE9BQUcsV0FBeENuRCxHQUE0QmhILEdBQUltSyxLQUFGbVAsY0FBaUM7R0FBQztZQUVqRm9TLFFBQVN2a0IsT0FBTW9QLEdBQUd2UDtJQUNwQixPQUFZO2FBckJWZ047c0JBcUJleEY7Y0FDZjtnQkFGU3JIO2dCQUFNb1A7eUJBRUN2VyxHQUFFNUo7aUJBQVEscUJBRlI0USxHQUVGaEgsR0FBRTVKO2lCQUFRLGFBQVcsV0FEdEJvWTtnQkFDbUM7Y0FBbEQ7YUFDSztHQUFDO1lBR05pZCxTQUFVdGtCLE9BQU1vUCxHQUFHdlA7SUFDckIsT0FBWTthQTNCVmdOO3NCQTJCZXhGO2NBQ2Y7Z0JBRlVySDtnQkFBTW9QO3lCQUVBdlcsR0FBRTVKO2lCQUFZLHlCQUZYNFEsR0FFSGhILEdBQUU1Sjs4QkFBeUIsV0FENUJvWTtnQkFDMEM7Y0FBekQ7YUFDSTtHQUFDO1lBR0w4YyxVQUFXbmtCLE9BQU1KLEdBQUdDO0lBQ3RCLE9BQVk7YUFqQ1ZnTjtzQkFpQ2V4RjtjQUNmO2dCQUZXckg7Z0JBQU1KO3lCQUVEL0csR0FBRTVKO2lCQUNWLElBRUo2VCxNQUZJLFdBSFlqRCxHQUVKaEgsR0FBRTVKO3dCQUdkNlQsTUFBaUIsV0FKTnVFLEdBSVh2RTtnQkFBNkI7Y0FIakM7YUFJSTtHQUFDO1lBR0xraEIsTUFBT2hrQixPQUFNb1AsR0FBR3ZQO0lBQ2xCLE9BQVk7YUExQ1ZnTjtzQkEwQ2V4RjtjQUNmO2dCQUZPckg7Z0JBQU1vUDt5QkFFR3ZXLEdBQUU1SjtpQkFBUSxxQkFGVjRRLEdBRUFoSCxHQUFFNUo7aUJBQVEsYUFBb0IsV0FEL0JvWSxXQUNDeE8sR0FBRTVKO2dCQUF5QztjQUEzRDthQUNJO0dBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FXSHd2QyxtQkFHMEI3K0IsR0FBR0MsR0FBSyxPQXhEcENHLFlBd0Q0QkosR0FBR0MsR0FBcUI7O1NBRDFDNitCLG9CQUZSRCxVQUVRQzs7O1NBSVJDLG1CQUcwQi8rQixHQUFHTixNQUFNTyxHQUFLLE9BdEQxQzRwQixZQXNENEI3cEIsR0FBR04sTUFBTU8sR0FBMkI7O1NBRHREKytCLHNCQUZSRCxVQUVRQzthQUlSQyxTQUFPai9CLEdBQUdDLEdBQUksT0FqRGhCMHRCLE9BMkNFb1IsU0FNTy8rQixHQUFHQyxHQUFzQjthQUNoQ2kvQixVQUFRbC9CLEdBQUdDLEdBQUksT0FoRGpCMGtCLFFBbUNFa2EsU0FhUTcrQixHQUFHQyxHQUF1QjthQUNsQ2svQixXQUFTbi9CLEdBQUdDLEdBQUksT0EzQ2xCeWtCLFNBNkJFbWEsU0FjUzcrQixHQUFHQyxHQUF3QjthQUNwQ20vQixZQUFVcC9CLEdBQUdDLEdBQUksT0F0Q25Cc2tCLFVBdUJFc2EsU0FlVTcrQixHQUFHQyxHQUF5QjthQUN0Q28vQixRQUFNci9CLEdBQUdDLEdBQUksT0E5QmZta0IsTUFjRXlhLFNBZ0JNNytCLEdBQUdDLEdBQXFCO0lBbkJxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFTbkU4K0I7WUFOQUY7WUFhQUs7WUFDQUM7WUFGQUY7WUFJQUk7WUFEQUQ7Ozs7O0tBc0JBaGxCOzs7Ozs7O0tBeENHakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQXdDSGlCO1lBeENHakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTFDTDBRO09BUkF6cEI7T0FnQkF1dEI7T0FFQWhKO09BTUFEO09BZUFOO09BVEFHOzs7O1NBOENFbks7Ozs7Ozs7U0ExQkdqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dCQTBCSGlCO2dCQTFCR2pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFdkR2RFY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0l3RDZmV21tQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBOWVKeDFCLFVBVUlzSyxVQUFZbXJCO0lBSGxCLDhCQUljOztLQUVTLElBRFozTCxxQkFDREMsV0FBYSxXQUhMMEwsVUFFUDNMO0tBRUwsd0JBRElDOztJQUdhO0tBREVscEI7S0FBWkM7S0FDSEMsV0FBYSxXQU5qQnVKLFVBS094SjtLQUVIRSxXQUFhLFdBUEx5MEIsVUFLTzUwQjtJQUduQix3QkFGSUUsY0FDQUM7R0FDcUU7R0EzQnJFLGVBU1JoQjtZQWdDQTAxQjtJQUNJLElBRG9Cdi9CLGNBQUh2QyxjQUNqQixtQkFEb0J1QyxHQUFIdkM7a0NBRWI7MkJBQ0g4RyxnQkFBSyxlQUFMQSxLQUhtQnZFO1FBSWRrRSxnQkFBSGY7SUFBUyxXQUFUQSxPQUFHZSxLQUpjbEU7O1lBT3hCdy9CLGtCQUFrQi9oQyxHQUFHZ0MsTUFBTU8sR0FBR3lZO0lBQ2hDLFNBQVF0SyxLQUFLMVEsR0FBRWdpQyxNQUFLaG5CLFFBQU96WSxHQUFFc1k7S0FDckIsdUJBRE9tbkIsTUFBRmhpQzttQ0FFRCxrQkFGUWdiLFFBQVNIOztVQUdwQi9UO01BQW1CO2VBSER2RTtlQUFFc1k7OzZCeER2RGxDLE93RHVEYW5LLEtBR0M1SixLQUhNazdCLE1BQUtobkIsUUFBT3pZOztTQUlia0UsZ0JBQUhmO0tBQTJCO2NBSlhuRDtjQUFFc1k7a0JBSWxCblY7NEJ4RDNEaEIsT3dEdURhZ0wsS0FJTWpLLEtBSkN1N0IsTUFBS2huQixRQUFPelk7SUFJaUM7UUFHN0N5L0IsT0FSS2hpQyxNQVFSOEcsTUFSUTlHO0lBUUksT0FQaEIwUSxLQU9JNUosS0FBR2s3QixNQVJpQmhuQixRQUFIelksR0FBTlA7R0FRMEI7R0FoQnJDLGlCQUNWOC9CLFdBT0FDO1lBWUZFLFlBQWFqZ0MsTUFBTU8sR0FBSSxXQUFWUCxNQUFNTyxHQUFzQjtZQUV6QzIvQixPQUFRbGdDLE1BQU1PO0lBQ2hCO1lBRFVQO3FCQUNnQmhDO2FBQ2xCLHVCQUZRdUMsR0FDVXZDO3lCQUVkO3FDQUNDOEcsa0JBQUhwQjthQUFTLFdBQVRBLEdBQUdvQjtZQUF1QjtHQUFDO1lBR25DcTdCLFlBQVluaUMsR0FBR2dDLE1BQU1PO0lBQ3ZCLElBQ2V5L0IsT0FGRGhpQyxNQUVGOEcsTUFGRTlHO0lBR1o7Z0JBSGVnQyxNQUVMOEU7O2FBR04sSUFBVzlHLGNBQU44SCxpQkFDQyxtQkFKR2s2QixNQUdFaGlDOzJDQUVEOztrQkFDSDhHO2NBQUssZUFIUGdCLE1BR0VoQjs7YUFFRTtjQURHTDtjQUFIZjtjQUNBLHFCQVZRbkQsR0FLWnVGLE1BSUlwQzs2Q0FFSTs7a0JBQ0gwOEI7Y0FBUSxlQUFSQSxRQUhFMzdCOztpQkFJRzQ3QixxQkFBSHA0QjthQUFZLFdBQVpBLFNBQUdvNEIsUUFKSDU3QjtZQUlpQztHQUFFO1lBR25ENjdCO0lBQXVCdGlDLEdBQUdnQyxNQUFNdWdDLGNBQWNDLGdCQUFnQkM7SUFDaEUsSUFDZVQsT0FGVWhpQyxNQUViOEcsTUFGYTlHO0lBR3ZCO2dDQUgwQmdDLE1BRWhCOEU7cUJBR0Z5QjthQUNKLGdCQURJQTtjQVlLO2VBRFNtNkIsVUFYZG42QjtlQVlLLG1CQWpCaURrNkIsZ0JBZ0J4Q0M7NENBRUw7O21CQUNIQztlQUFTLDBCQUFUQTs7a0JBQ0tDLG9CQUFIaHhDO2NBQWEsV0FBYkEsa0JBQUdneEM7O2FBWk47d0JBSExyNkI7Y0FFcUJzNkI7Y0FBUEM7Y0FDVCxxQkFOQWQsTUFLZ0JhOztjQUVaLDBCQUFzQixXQVRPTCxnQkFPeEJNOztrQkFHUkM7Y0FBZSwrQkFIUEQsU0FHUkM7O2FBRUU7Y0FER0M7Y0FBSHJ4QztjQUNBLHFCQVpnQjR3QyxjQU9WTyxTQUlObnhDOzZDQUVJOztrQkFDSHN4QztjQUFTLCtCQUFUQSxTQUhFRDs7aUJBSUdFLHNCQUFIM3NCO2FBQWEsV0FBYkEseUJBQUcyc0IsU0FKSEY7WUFTMkM7R0FBRTtZQUdoRTlnQyxRQUFRb0Q7SUFDVjtZQURVQTs7YUFDYSxZQUNiO2lCQUNEQSxjQUFMM1Q7YUFBVSxXQUFWQSxHQUFLMlQ7WUFBa0I7O1lBSXpCakQsS0FBS0MsR0FDV04sTUFBT087SUFBekIsSUFBb0J5L0IsT0FEYjEvQixNQUNNNmdDLFNBRE43Z0MsTUFDTXdGLGVBQUsrSTtJQUNoQjtLQUFNLHVCQURZbXhCLE1BQVBsNkI7bUNBRUQsT0FGTStJOzRCQUFMdXhCO0tBSWM7TUFKZEM7TUFJRjM4QjtNQUpPMDlCLE1BSVMsV0FKRjdnQyxHQUFQc08sR0FJUG5MO01BSkVvQztNQUFLK0k7O0dBTzhCO1lBRzlDd3lCLFlBQVkvZ0M7SUFBSSxPQVhoQkQsS0FXWUMsZUFBNEJnRCxHQUFFM1QsR0FBSyxXQUFMQSxHQUFGMlQsR0FBYTtHQUFDO1lBR3REbEQ7UUFBc0I0L0IsaUJBQUhoaUM7SUFFckIsU0FBUW9DLFFBQVFwQyxHQUFFZ2lDLE1BQUt6bUM7S0FDckIsSUFEY3VMO0tBQ2Q7ZUFEcUJ2TDtPQUVILElBSEgrRyxRQUNEd0UsS0FBRWs3QixPQURZLE1BSjVCcUIsWUFJZS9nQztPQUFhOztNQUtwQix1QkFKUTAvQixNQUFGbDdCO29DQUtGOzZCQUxFTDtVQU9BRSxnQkFBSGpCO01BQVMsV0FBVEEsR0FQTHRELFFBT1F1RSxLQVBFcTdCLE1BT3dCLDRCQVBuQnptQzs7SUFPMkI7SUFFbEQsT0FUUTZHLFFBRmFwQyxHQUFHZ2lDOztZQWN0Qjl6QixZQUFVMk8sV0FBVXZhO0lBQTJCLFVBZC9DRixRQWNvQkU7SUFBMkIsb0NBQXJDdWE7R0FBZ0Q7WUFFMURzRyxNQUFRaGIsZUFBdURtN0IsU0FBUUM7SUFDekUsR0FEVXA3QixTQUFTQyxNQUFURCxpQkFBU0MsY0FBVGdiO0lBQ1YsWUFEZ0N4QixnQkFBUjJCLFFBQVEzQixnQkFBUjJCO0lBQ3hCLFlBRHFEVyxnQkFBUGhILE9BQU9nSCxnQkFBUGhIO0lBQzlDO0tBQUlzbUI7b0JBRDBDdG1COzthQUFwQ2tHOztZQUlGN25CO1lBQUssT0FKNERnb0MsU0FJakVob0M7OzZCQUE0Qyw0QkFBNUNBLEdBSkU2bkI7V0FJcUQ7O1lBQ3pDN25CO1lBQUssT0FBTEEsSUFMbURnb0M7OzBCQUtuRGhvQyxHQUE0Qyw0QkFBNUNBLEdBTFo2bkI7V0FLbUU7O2FBTG5FQTs7WUFPRjduQjtZQUFLLE9BUDREZ29DLFVBT2pFaG9DOzs2QkFBNkMsNEJBQTdDQSxHQVBFNm5CO1dBT3NEOztZQUMxQzduQjtZQUFLLE9BQUxBLEtBUm1EZ29DOzswQkFRbkRob0MsR0FBNkMsNEJBQTdDQSxHQVJaNm5CO1dBUW9FO0tBRTFFcGhCO29CQVZvQnVoQjtVQUF5QytmO1VBYS9DLDRCQWIrQ0EsU0FBdkRsZ0I7SUFlVixXQUxJcGhCLE1BVEF3aEM7R0FjcUI7WUFHdkJ0SyxRQUFRdUs7SUFDVjtZQURVQTtxQkFDdUJBO2FBQy9CLHVCQUQrQkE7Ozs7Ozs7Ozs7OzthQUV6QixJQURZekIsaUJBQUhoaUMsY0FDVCxxQkFEWWdpQyxNQUFIaGlDOzZDQUVMOztjQUdHLElBRk44RyxrQkFFRStKLFFBRkYvSixLQUhXazdCO2NBSWhCLFdBQ09ueEI7O2FBS0ssSUFIRnBLLGtCQUFIOVUsZ0JBR0N5eEMsVUFIRTM4QixLQVBNdTdCO2FBUWhCLFdBRE9yd0MsR0FHQ3l4QztZQUNJO0dBQUM7Z0JBR1g5Z0MsR0FBR0M7SUFDVCxJQUNrQnkvQixPQUZaMS9CLE1BRU13RixPQUZOeEY7SUFHSjtZQURVd0Y7cUJBR0ZBO2FBQ0UsdUJBSk1rNkIsTUFHUmw2QjsyQ0FFTTtvQ0FDSDlILGNBQUssV0FBTEE7aUJBQ0s4RyxnQkFBSHBCO2FBQVMsV0FBTyxXQVR0Qm5ELEdBU01tRCxJQUFHb0I7WUFBb0I7R0FBRTtZQUd0Q2xFLEtBQUtOLEdBQUdDO0lBQ1YsSUFDZXkvQixPQUZSMS9CLE1BRUt0QyxJQUZMc0M7SUFHTDttQkFEVXRDOzthQUdOLElBQVFBLGNBQUh6RSxjQUNDLG1CQUpHeW1DLE1BR0RoaUM7MkNBRUU7b0NBQ0g4RyxnQkFBSyxlQUhQdkwsR0FHRXVMO2FBQ3lCO2NBQXBCTDtjQUFIZjtjQUF1QixVQUFDLDRCQUo1Qm5LLE9BSU9rTDthQUFNLFdBQU8sV0FUckJsRSxHQUtDaEgsR0FJSW1LO1lBQWtDO0dBQUU7WUFHakQ2a0IsWUFBWWpvQixHQUFHTixNQUFNTztJQUN2QixPQXZJRTQvQjthQXNJWTcvQjthQUFHTjtzQkFDVzZZLEtBQUlscEI7Y0FDOUI7ZUFBYSxtQkFGUTRRLEdBQ0tzWSxLQUFJbHBCO2VBQ3JCK21CO2VBQUxpVTtjQUNKLFdBRFNqVSxLQUFMaVU7YUFDVTtHQUFDO1lBR2ZWLGFBQWEzcEIsR0FBR04sTUFBTU87SUFDeEIsT0E3SUU0L0I7YUE0SWE3L0I7b0JBQUdOOzZCQUM2QnJRO2NBQWQ7ZUFBU2twQjtlQUFIdGY7ZUFDeEIsbUJBRlNnSCxHQUNlaEgsR0FBR3NmLEtBQUtscEI7ZUFDcEMrbUI7ZUFBTGlVO2NBQ0osV0FEU2pVLFNBQ0UsNEJBRjBCbmQsT0FDakNveEI7YUFDb0I7O1lBR3hCdEcsT0FBTy9qQixHQUFHQztJQUNaLElBQ2tCeS9CLE9BRlQxL0IsTUFFR3dGLE9BRkh4RjtJQUdQO1lBRFV3RjtxQkFHRkE7YUFDRSx1QkFKTWs2QixNQUdSbDZCOzJDQUVNO29DQUNIOUgsY0FBSyxXQUFMQTtpQkFDRTBGLGNBQUdvQjthQUFRLGNBVGR2RSxHQVNHbUQsSUFBa0IsV0FBbEJBLEdBQUdvQjtpQkFDQUw7YUFBTSxXQUFOQTtZQUFZO0dBQUU7WUFHOUIybEIsUUFBUTlwQixHQUFHQztJQUNiOztLQUFvRCxJQUFTdkMsY0FBSHpFO0tBQVMsa0JBRHREZ0gsR0FDNkNoSCxHQUFHeUU7SUFBWTtJQUF6RSxXQWRFcW1CLE9BeEJBempCLEtBcUNRTixZQUN5Qi9HLEdBQUV5RSxHQUFLLFdBQVB6RSxHQUFFeUUsR0FBUztHQUE0QjtZQUd4RW9FLE9BQU85QjtJQUNULElBQWlCMC9CLE9BRFIxL0IsTUFDTXdGLE9BRE54RixNQUNJL0csT0FBRXlFO0lBQ2I7S0FBTSx1QkFEU2dpQyxNQUFGaGlDO21DQUVILE9BRkN6RTs0QkFBRXVMO0tBSVU7TUFKVkw7TUFBRlcsTUFJWSw0QkFKWjdMOztNQUFFeUU7O0dBTzRCO1lBS3pDc2IsU0FBU2haO0lBQ1g7S0FIc0Q7T0FoSXBERDtTQWtJU0M7O3lCQUZ1RDNRO1VBQVosSUFBUzRKLGNBQUgrSjtVQUFXLGVBQUwzVCxHQUFOMlQsSUFBbUIsNEJBQWhCL0o7U0FBc0I7S0FHOUVrRztLQUFINkQ7SUFDSixLQURJQSxHQUVJO0lBRUU7S0FDTzZwQixNQUxiN3BCO0tBR0YzVCxJQUhFMlQ7S0FJRUksSUFBSSwyQkFKSGpFLEtBR0w5UDtLQUVhMitCLE1BT1IsNEJBWkE3dUI7S0FLUWxHO0tBQUUrM0I7SUFDYjtRQURhQTt3QkFHWDVhLE1BSFc0YTtNQUlYLHlCQUxBNXRCLEdBQ1NuSyxZQUdUbWQ7TUFFSyxJQUxJdFIsTUFLSiw0QkFMSTdMLGdCQUFFKzNCOzs7ZUFBRi8zQixHQU9iLE9BUkltSztLQUdNOztHQU1UO1lBR0QyVixLQUFLL1ksR0FDYUM7SUFBcEIsSUFBZXkvQixPQURSMS9CLE1BQ013RixPQUROeEYsTUFDTXRDO0lBQ1g7S0FBTSx1QkFET2dpQyxNQUFGaGlDO21DQUVEOztVQUZDOEc7O1VBR0ZwQjtNQUFXLGNBSEZuRCxHQUdUbUQsSUFBa0IsV0FBbEJBO1VBSEVvQjs7OztHQU84QjtZQUd6Q3NVLFNBQVM5WSxHQUNTQztJQUFwQixJQUFleS9CLE9BREoxL0IsTUFDRXdGLE9BREZ4RixNQUNFdEM7SUFDWDtLQUFNLHVCQURPZ2lDLE1BQUZoaUM7bUNBRUQ7NEJBRkM4RztLQUlGLElBSkVMLGdCQUdGZixjQUdKaStCLFNBRkksV0FKU3BoQyxHQUdUbUQ7UUFHSmkrQixRQUFVLE9BQVZBO1NBTk0zakM7O0dBVThCO1lBSXpDNm1CLFVBQVV2a0IsR0FDUUM7SUFBcEIsSUFBZXkvQixPQURIMS9CLE1BQ0N3RixPQUREeEYsTUFDQ3RDLFVBQVN6RTtJQUNwQjtLQUFNLHVCQURPeW1DLE1BQUZoaUM7bUNBRUQ7NEJBRkM4RztLQUlGLElBSkVMLGdCQUdGZixjQUdKaStCLFNBRkksV0FKU3BoQyxHQUFFaEgsR0FHWG1LO1FBR0ppK0IsUUFBVSxPQUFWQTtLQURzQixJQUxQdjhCLE1BS08sNEJBTFA3TCxPQUFUeUUsU0FBU3pFOztHQVV1QjtZQUczQ3NKLFFBQVF2QyxHQUNVQztJQUFwQixJQUFleS9CLE9BREwxL0IsTUFDR3dGLE9BREh4RixNQUNHdEM7SUFDWDtLQUFNLHVCQURPZ2lDLE1BQUZoaUM7bUNBRUQ7O1VBRkM4Rzs7VUFHRnBCO01BQWUsZ0JBSE5uRCxHQUdUbUQsSUFBd0I7VUFIdEJvQjs7OztHQU84QjtZQUd6Q2tnQixTQUFTMWtCLEdBQ1NDO0lBQXBCLElBQWV5L0IsT0FESjEvQixNQUNFd0YsT0FERnhGLE1BQ0V0QyxVQUFTekU7SUFDcEI7S0FBTSx1QkFET3ltQyxNQUFGaGlDO21DQUVEOzRCQUZDOEc7U0FHRnBCO0tBQWUsZ0JBSE5uRCxHQUFFaEgsR0FHWG1LLElBQTBCO0tBQ0g7TUFKckJlO01BQVNXLE1BSVksNEJBSlo3TDtNQUFUeUU7TUFBU3pFOztHQVF1QjtZQUczQ2lKLE9BQU9sQyxHQUNXQztJQUFwQixJQUFleS9CLE9BRE4xL0IsTUFDSXdGLE9BREp4RixNQUNJdEM7SUFDWDtLQUFNLHVCQURPZ2lDLE1BQUZoaUM7bUNBRUQ7O1VBRkM4RztjQUdGcEIsY0FBVyxjQUhGbkQsR0FHVG1ELElBQWtCLGNBSGhCb0I7Ozs7R0FPOEI7WUFHekNtZ0IsUUFBUTNrQixHQUNVQztJQUFwQixJQUFleS9CLE9BREwxL0IsTUFDR3dGLE9BREh4RixNQUNHdEMsVUFBU3pFO0lBQ3BCO0tBQU0sdUJBRE95bUMsTUFBRmhpQzttQ0FFRDs0QkFGQzhHO1NBR0ZwQjtLQUFXLGNBSEZuRCxHQUFFaEgsR0FHWG1LLElBQW9CO0tBQ0c7TUFKckJlO01BQVNXLE1BSVksNEJBSlo3TDtNQUFUeUU7TUFBU3pFOztHQVF1QjtZQUczQ2tILEtBQUtILEdBQ2dCQztJQUF2QixJQUFrQnkvQixPQURYMS9CLE1BQ002Z0MsU0FETjdnQyxNQUNNd0Y7SUFDWDtLQUFNLHVCQURVazZCLE1BQUxsNkI7bUNBRUQ7NEJBRkNzNkI7NEJBSUYxOEI7S0FDUCxXQUxtQm5ELEdBSVptRDtTQUpFb0M7O0dBUzhCO1lBR3pDc08sU0FBUzlUO0lBQ1gsSUFBZTAvQixPQURKMS9CLE1BQ0V3RixPQURGeEYsTUFDRXRDO0lBQ1g7S0FBTSx1QkFET2dpQyxNQUFGaGlDO21DQUVEO3dCQUVHO1NBSkY4Rzs7R0FPNEI7WUFHdkM0VixJQUFJcGEsR0FDY29ELEdBRFQ5TTtJQUNYLElBQWVvcEMsT0FEVDEvQixNQUNPd0YsT0FEUHhGLE1BQ090QztJQUNYO0tBQU0sdUJBRE9naUMsTUFBRmhpQzttQ0FFRDs7VUFGQzhHOztVQUdGbkI7TUFBVyxjQUpYL00sT0FDUzhNLEdBR1RDLElBQXdCO1VBSHRCbUI7Ozs7R0FPOEI7R0FHakMsSUFBUjg4QiwrQkFBZ0MsU0FBSTtZQTZCaEM3ekIsS0EzQkN6TixHQUFHQztJQUNWO2dCQUhFcWhDLE9BRUt0aEM7O2FBRUY7Y0FDd0JtRDs7Y0FBUHU4QjtjQUFObDZCO2NBQ0gscUJBRFNrNkIsTUFBTmw2Qjs7Y0FLRztlQURTKzdCLFNBSkNwK0I7ZUFJUDI4QixTQUpPMzhCO2VBS1YscUJBRFNvK0IsUUFBTnpCOzhDQUVDOzttQkFDSHBpQztlQUFLLGVBWnZCNGpDLFdBWWtCNWpDLEdBSFE2akM7O2tCQUlILzhCLGtCQUFIcEI7Y0FBUyxlQUFNLFdBWDNCbkQsR0FXWW1ELFFBQUdvQixLQUpHKzhCOzs7a0JBS2RwOUI7Y0FBSyxtQkFBTEEsS0FUUXU3QixPQUFPdjhCOztpQkFVVmtCLGtCQUFIc0Q7YUFBUyxXQUFUQSxhQUFHdEQsS0FWR3E3QixPQUFPdjhCO1lBVW1DO0dBQzlDO1lBY1pnSyxTQVhHOWQ7SUFDVDtnQkFEU0E7O2FBQ3FCLFlBQ2xCO2lCQUNIQTthQUFLLFdBQUxBO1lBQXFCOztHQU1sQjtJQUFOZ1I7NENBQ0FvTixNQUNBTixVQUZBOU07Ozs7Ozs7Ozs7OztZQUtKMGhCLElBQUlya0IsR0FJUzZVO0lBSGYsT0FHZUEsR0FGVjtRQUVjbXRCLE9BSmJoaUMsTUFJVzhqQyxNQUpYOWpDLE1BSVN6RSxPQUFFdUw7SUFDYjtLQUFNLHVCQURTazdCLE1BQUZsN0I7bUNBRUg7NEJBRkdMO3lCQUlKZjtLQUFZLGdDQUpWbkssT0FJOEIsV0FBaENtSztLQUFpRCxJQUovQzBCLE1BSStDLDRCQUovQzdMLGdCQUFFdUw7O0dBT3VCO1lBR3RDd2QsUUFBUXRrQixHQUFFNlU7SUFDWixPQURZQSxHQUVQO0lBRUcsWUFsQk53UCxJQWNRcmtCLEdBQUU2VTtnQkFLQTtRQUNIbGpCO0lBQUssT0FBTEE7R0FBTztZQVVaZ0gsUUFHRStlLE9BQVFDLE9BQVFvc0IsT0FBUUM7SUFDNUIsR0FBRyxvQ0FEaUJELE9BQVFDLFFBRXZCO1dBRmVEOztXQUtYRSxRQUxXRjtnQkFBUUMsVUFNWDtXQURPRSxRQUxJRjtPQUtRLGtCQUxoQ3RzQixPQUtLdXNCLE9BQWVDOztXQUdkQyxRQVJVSjtjQUFRQzs7O2NBUUZJLFFBUkVKLFVBUVUsa0JBUjFCcnNCLE9BUUZ3c0IsT0FBZ0JDO2tCQUNSOzs7O1dBRUVDLFFBWEFOLFVBV1ZPLFFBWFVQO2NBQVFDOzs7VUFVVjs7VUFFUDtXQURvQ08sUUFYbkJQO1dBV1NRLFFBWFRSO1dBY3JCbnZCLElBRkksV0FaUDZDLE9BV000c0IsT0FBMkJFO3VCQUc5QjN2QixJQURLLFdBYkE4QyxPQVdRMHNCLE9BQTJCRSxTQUd4QzF2Qjs7O0lBUFU7R0FPRjtZQUdiN00sWUFRRXdRLGFBQWFDLGFBQWE3TSxLQUFJQztJQUNoQyxPQURnQ0E7O09BR3BCLElBRExDLEtBRnlCRCxRQUkxQkUsUUFETSx5QkFIZ0JIO09BSzFCLGtCQUxBNE0sYUFJSXpNLE9BRkNEOztPQUtLLElBREpFLE9BTndCSCxRQVExQkksUUFETSx5QkFQZ0JMO09BUzFCLGtCQVRhNk0sYUFRVHhNLE9BRkVEOztPQUtJO1FBRENzaUIsS0FWbUJ6aUI7UUFVeEI0NEIsT0FWd0I1NEI7UUFheEJtSixRQUZJLHlCQVhnQnBKO1FBWXRCODRCLFFBRUYsV0FkRmxzQixhQWFNeEQsT0FIQXl2QjtPQU1OLGtCQWhCYWhzQixhQVlUaXNCLE9BRk9wVzs7R0FNUztHQWN0QixTQVhBdGIsVUFXSTJ4QixVQUFZQyxVQThDWkM7SUE5Q0osU0E4Q0lBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBTEE7OENBMUNBakQsa0JBK0NBaUQ7Ozs7O09BUEE7NkNBeENBakQsa0JBK0NBaUQ7OztNQUhBOzRDQTVDQWpELGtCQStDQWlEOzs7OztNQUNBOzRDQWhEQWpELGtCQStDQWlEOzs7TUFEQTs0Q0E5Q0FqRCxrQkErQ0FpRDtTQXBCc0JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7WUFadUNDOztTQUl6QztVQURmQyxXQUh3REQ7VUFJdERFLFdBQWEsV0FsQlJMLFVBaUJQSTtTQUVGLFdBRElDOztRQUdKOztpQkF0QkhyRDtpQkEyQnNCa0Q7aUJBb0J0QkQ7Ozs7OztXQTVDMkRLOztRQUl2QztTQURmQyxXQUhzREQ7U0FJcEQxTixXQUFhLFdBTnBCbU4sVUFLS1E7UUFFRixXQURJM047O09BR0o7O2dCQVZIb0s7Z0JBMkJzQmtEO2dCQW9CdEJEOzs7O1VBcEIyRE87TUFFM0QsR0FGMkRBOzs7UUFJdkM7U0FESEM7U0FBWkMsV0FIc0RGO1NBSXBERyxXQUFhLFdBOUJwQlosVUE2QktXO1NBRUVFLFdBQWEsV0EvQlJaLFVBNkJLUztRQUdkLFdBRklFLFVBQ0FDOzs7TUFHSjs7ZUFuQ0g1RDtlQTJCc0JrRDtlQW9CdEJEOzs7SUFHQSwrQ0FsREFqRCxrQkErQ0FpRDtHQUdzRTtZQUcxRXBULFlBVUlnVSxVQUFZQztJQUhsQjs7T0FLdUIsSUFEWkMscUJBQ0RDLFdBQWEsV0FGakJILFVBQ0tFO09BRUwsd0JBRElDOztPQUdhLElBRFhDLHFCQUNGQyxXQUFhLFdBTExKLFVBSU5HO09BRU4sd0JBRElDOztPQUdhO1FBRENDO1FBQVpDO1FBQ0ZDLFdBQWEsV0FSakJSLFVBT01PO1FBRUZFLFdBQWEsV0FUTFIsVUFPTUs7T0FHbEIsd0JBRklFLGNBQ0FDOztHQUNvRTtZQUczRWg2QixlQUtDc0wsZ0JBQWlCQztJQUNuQjs7Ozt3Q0FERUQ7OzBDQUFpQkM7Ozs7OzBCQUFqQkQsb0JBQWlCQzs7R0EyQmxCO0dBNUtnQzs7VUFPakM5ZSxTQW9CQXFQLGFBMkJBZ0wsV0ErREF5ZSxhQXVCQ3ZsQjtZQXNDSGk2QixrQ0FBcUV4dEM7UUFBVHl0QyxnQkFBSkMsYUFBbkJDLGtCQUFKQzthQUcvQnZFO0tBQU8sSUFHUHVFOzs7b0NBT2M7O1dBRUVDLGlCQUFIN2dDO09BQVUsZUFBVkEsZUFBRzZnQzs7OztlQVRoQkQ7V0FGU0UsaUJBQUpDLE9BRUxIO09BRmUsZUFBTSxXQUpjRCxPQUk5QkksT0FBSUQ7O1VBRWVFLGlCQUFiQyxPQUFYTCxPQUFRN2dDLElBQVI2Z0M7Z0JBQXdCSSxtQkFRRCxlQVJmamhDLFlBQUdraEM7ZUFBYUQ7T0FDUDtRQURrQkUsT0FBWEY7UUFBUXo4QixNQUFSeThCO1FBQ3BCRyxhQUFhLFdBUGtEbnVDLFNBTTNEK00sR0FBd0J3RTtPQUVoQyxZQURJNDhCOzs7MkJBRElwaEMsR0FBd0J3RSxjQUFyQjA4QixXQUF3QkM7MkJBQUgzOEIsVUFBaENxOEIsUUFBbUNNO3lCQUEzQm5oQyxZQUFHa2hDLE9BQWFEOzs7U0FEZk47S0FBTSxlQUNmRSxJQUR5QixXQUxpQ0gsT0FLakRDO0lBVThDO0lBRTNELG1CQWpCbUNFLFNBQXVCRixNQUd0RHJFOztZQWlCRitFLHlCQUF5QlIsSUFBR0YsSUFBSTF0QztJQUNsQyxvQkFBOEMsSUFDckNoSCxjQUE2QixPQUE3QkEsRUFBK0I7SUFETSx5QkFyQjVDdzBDLHNCQW9CeUJJLElBQUdGLElBQUkxdEM7R0FFTTtZQVd0Q3F1Qyx5QkFBNERydUM7UUFBVHl0QyxnQkFBSkMsYUFBbkJDLGtCQUFKQzthQUN0QnZFO0tBQU8sSUFHUHVFOzs7b0NBR2M7O1dBRUVDLGlCQUFIN2dDO09BQVUsV0FBVkEsY0FBRzZnQzs7OztlQUxoQkQ7V0FGU0UsaUJBQUpDLE9BRUxIO09BRmUsZUFBTSxXQUZLRCxPQUVyQkksT0FBSUQ7O1VBRWVFLGlCQUFiQyxPQUFYTCxPQUFRN2dDLElBQVI2Z0M7Z0JBQXdCSSxtQkFJRCxXQUpmamhDLFdBQUdraEM7ZUFBYUQ7T0FDUDtRQURrQkUsT0FBWEY7UUFBUXo4QixNQUFSeThCO1FBQ3BCRyxhQUFhLFdBTHlDbnVDLFNBSWxEK00sR0FBd0J3RTtPQUVoQyxXQURJNDhCO3FCQUQ0QjU4QixTQUFoQ3E4QixRQUFtQ007cUJBQTNCbmhDLFdBQUdraEMsT0FBYUQ7OztTQURmTjtLQUFNLGVBQ2ZFLElBRHlCLFdBSHdCSCxPQUd4Q0M7SUFNd0M7SUFFckQsbUJBWDBCRSxTQUF1QkYsTUFDN0NyRTs7WUFhRjdkLEdBQUdua0I7SUFDTCxJQUFlZ2lDLE9BRFZoaUMsTUFDUTJHLE1BRFIzRyxNQUNROEc7SUFDWDtLQUFNLHVCQURPazdCLE1BQUZsN0I7bUNBRUQ7NEJBRkNMO1NBSUZmO0tBQVMsV0FBVEE7O0dBR3dCO1lBR2pDdkIsT0FBT25FO0lBQ0gsWUFaSm1rQixHQVdPbmtCO2dCQUVDO1FBQ0gwRjtJQUFLLE9BQUxBO0dBQU07WUFHWDBlLEdBQUdwa0I7SUFDTCxJQU9lZ2lDLE9BUlZoaUMsTUFDUTJHLE1BRFIzRyxNQUNROEc7SUFDWDtLQUFNLHVCQU1PazdCLE1BUEZsN0I7Ozs7O1VBSUNwQjs7bUJBS0Q7U0FDSG8rQjtLQUFLLGVBQUxBLEtBSEs5Qjs7R0FHMEI7WUFHdkNpRixlQUFlam5DO0lBQ1gsWUFmSm9rQixHQWNlcGtCO2dCQUVQO1FBQ0g4RztJQUFLLE9BQUxBO0dBQU07WUFHWG9nQyxjQUFjbEYsTUFBS2hpQztJQUNmLHVCQURVZ2lDLE1BQUtoaUM7a0NBRVg7MkJBQ0g4RyxnQkFBSywwQkFBTEE7UUFDS0wsZ0JBQUhmO0lBQVMsV0FBVEEsa0JBQUdlO0dBQTRCO1lBR3RDdTdCLEtBQUtoaUM7SUFDUCxJQUFlZ2lDLE9BRFJoaUMsTUFDTThqQyxNQUROOWpDLE1BQ004RztJQUNYO0tBQU0sdUJBRE9rN0IsTUFBRmw3QjttQ0FFRDs0QkFGQ0w7U0FJQ0UsZ0JBQUhqQjtLQUFTLGVBQVRBLE9BQUdpQixLQUpDcTdCOztHQU9vQjtZQUdqQ3hSLFdBQVd4d0I7SUFDYixJQUNlZ2lDLE9BRkZoaUMsTUFFRDhHLE1BRkM5RztJQUdYO1lBRFU4RztxQkFHRjlHO2FBQ0UsdUJBSkdnaUMsTUFHTGhpQzsyQ0FFTTtvQ0FDSDhHLGdCQUFLLFdBQUxBOzs7a0JBRVVMLGdCQUFIZjtjQUFTLFdBQVRBLEdBQUdlOztpQkFERkU7YUFBTSxXQUFOQTtZQUNvQjtHQUFFO1lBR3pDeXBCLFdBQVdwd0IsR0FBR3VDLEdBQUksT0FibEJpdUIsV0FhNkIsa0JBQWxCeHdCLEdBQUd1QyxJQUF5QjtZQUN2Q2d1QixZQUFZdndCLEdBQUd1Qzs7S0FBZ0QsSUFBU3ZDLGNBQUh6RTtLQUFTLGtCQUEvRGdILEdBQXNEaEgsR0FBR3lFO0lBQVk7SUFBckIsT0FEL0Rvd0IsV0E3aEJBeHRCLEtBOGhCWTVDLFlBQWtDekUsR0FBRXlFLEdBQUssV0FBUHpFLEdBQUV5RSxHQUFTO0dBQTJCO1lBRXBGaXpCLFFBQVFqekIsR0FDSzZVO0lBQWYsSUFBdUJtdEIsT0FEYmhpQyxNQUNHOGpDLE1BREg5akMsTUFDRzhHLFdBQUV2TCxPQUFFc29CO0lBQ2Y7YUFEYXRvQixHQUVSLHNDQUZVc29CLFlBQUovYyxLQUFVazdCO0tBSWIsdUJBSmFBLE1BQVZsN0I7O01BS0Msc0NBTEcrYyxRQWpXZitmOzRCQWlXV245QjtLQU93QjtNQVB4QkU7TUFPQWpCO01BUElzZSxjQU9KdGUsR0FQSW1lO01BQUZ6YyxNQU9jLDRCQVBkN0w7TUFBRnVMO01BQUV2TDtNQUFFc29COztHQVV1QjtZQUd0Q3NqQixXQUFXN2tDLEdBQUV1UztJQUNmLFdBRGVBOztjQUFGdlM7dUJBSWlCQTtlQUMxQixJQUFNLFFBbkJSMndCLFFBa0I0QjN3QixHQUpmdVMsSUFPVHpLO3dCQURjO21CQUNFNUI7ZUFBSyxXQUFyQjRCLElBQWdCNUI7Y0FBa0I7Y0FMbkM7R0FLb0M7WUFHdkNrZSxNQUFNMW1CLEdBQUd1Qzs7S0FBMEMsSUFBU3ZDLGNBQUh6RTtLQUFTLGtCQUF6RGdILEdBQWdEaEgsR0FBR3lFO0lBQVk7SUFBckIsT0FqZm5EcWIsS0F2RUF6WSxLQXdqQk01QyxZQUE0QnpFLEdBQUV5RSxHQUFLLFdBQVB6RSxHQUFFeUUsR0FBUztHQUEyQjtZQUV4RXltQixTQUFTem1CLEdBQUd1QztJQUNSLFlBcGZKOFksS0FtZlNyYixHQUFHdUM7Z0JBRUo7UUFDSDVRO0lBQUssT0FBTEE7R0FBTTtZQUdYZ1EsT0FBTzRrQyxJQUFHRjtJQUNaLElBQ3NDRCxRQUYxQkMsT0FFc0JHLE9BRnRCSCxPQUVJQyxRQUZQQyxPQUVHRyxPQUZISDtJQUdQOzJCQURVRzs7YUFHTjtjQUVTLElBREtILGVBQ0wsbUJBTENELE9BSUlDOzRDQUVELDJCQU5lQzs7bUJBT2xCRTtlQUFNLDBCQUFOQTs7a0JBQ0tFLGlCQUFIbGhDO2NBQVUsV0FBVkEsa0JBQUdraEM7O2FBRU4sSUFETVAsZUFDTixxQkFWdUJELE9BU2pCQzs2Q0FFRjs7a0JBQ0hJO2NBQU0sMkJBQU5BOztpQkFDS0UsbUJBQUgxOEI7YUFBVSxXQUFWQSxxQkFBRzA4QjtZQUFrQztHQUFFO1lBR3ZEdFosV0FBV3J0QixHQUFHdUMsR0FBSSwwQkFBUHZDLEdBQUd1QyxHQUFhO1lBQzNCVixPQUFPN0IsR0FBSSxPQURYcXRCLFdBQ09ydEIsaUJBQUksY0FBcUI7WUFDaENzdEIsWUFBWXR0QixHQUFHdUM7O0tBQWdELElBQVN2QyxjQUFIekU7S0FBUyxrQkFBL0RnSCxHQUFzRGhILEdBQUd5RTtJQUFZO0lBQXJCLE9BRi9EcXRCLFdBbGxCQXpxQixLQW9sQlk1QyxZQUFrQ3pFLEdBQUV5RSxHQUFLLFdBQVB6RSxHQUFFeUUsR0FBUztHQUEyQjtZQUVwRityQjtRQUEwQ3FhLGdCQUFKQyxhQUFuQkMsa0JBQUpDO2FBQ2J2RTtLQUFPOzs7OzRCQUNHMEUsZUFBSGhoQzs7O1lBR0U4Z0M7UUFBTSxvQkFBVSxXQUxlSixPQUsvQkk7O1dBSGdCQyxpQkFBSDlnQztPQUFVLGVBQXpCRCxHQUFlQyxZQUFaK2dDLFdBQWVEOzs7O1VBRWhCSixlQUFKRTtNQUFVLGVBQU0sV0FKSkQsT0FJWkMsS0FBSUY7O0tBRFk7SUFFYTtJQUV0QyxtQkFQaUJFLFNBQXVCRixNQUNwQ3JFOztZQVNGb0Y7UUFBK0NoQixnQkFBSkMsYUFBbkJDLGtCQUFKQzthQUNsQnZFO0tBQU8sSUFJUHVFOzs7b0NBRmM7O1dBR0VDLGlCQUFIN2dDO09BQVUsMEJBQVZBLFdBQWtDLFdBTkZ5Z0MsT0FNN0JJOzs7O2VBRGhCRDtXQURTRSxpQkFBSkMsT0FDTEg7T0FEZSxlQUFNLFdBSkNELE9BSWpCSSxPQUFJRDs7OEJBRkNHLE9BR1ZMLE9BSE83Z0MsSUFHUDZnQzs7T0FFdUIsMEJBTGhCN2dDLFFBS2lDLFdBUGxCNGdDLE9BRVpNOztXQUFlRCxtQkFBSHo4QjtPQUFVLDhCQUF6QnhFLEdBQWV3RSxlQUFaMDhCLFdBQWVEOzs7U0FHaEJOO0tBQU0sZUFBZkUsSUFBeUIsV0FMb0JILE9BS3BDQztJQUUrQztJQUU1RCxtQkFUc0JFLFNBQXVCRixNQUN6Q3JFOztZQVdGcUYsc0JBQXdDQztRQUN0QnRGLGlCQUFMbDZCLGlCQUFGdk0sT0FBRTZtQztJQUNiO1FBRndDa0YsVUFDN0IvckMsR0FFTjtLQUVHLHVCQUpVeW1DLE1BQUxJO21DQUtELGtCQUxEN21DOzRCQUFFOG1DO0tBT2U7TUFQZmM7TUFBRi83QixNQU9pQiw0QkFQakI3TDs7TUFBRTZtQzs7O1lBWWJtRixxQkFBdUJwL0IsS0FBV3RXLEtBQUl5UTtJQUN4QyxHQUR5QjZGLFNBQU1DLE1BQU5ELGNBQU1DLGNBQU50VztJQWF6QixHQWJvQ0Q7S0FnQjNCLElBREZnRyxRQWY2QmhHLFFBZ0IzQixVQTdCUHcxQyxlQWFzQy9rQyxHQWVqQ3pLO2lFQUVFNEoscUJBakJnQjNQLE9BaUJoQjJQLEtBQXVCO0tBQ3RCOztRQWpCMkJ1Z0MsT0FERzEvQixNQUV6QnRDLElBRnlCc0MsTUFFekJ3RSxTQUFFK1Q7SUFDYjtRQUhxQi9vQixPQUVSK29CLEtBRVI7S0FFRyx1QkFMeUJtbkIsTUFDdEJsN0I7bUNBS0M7NEJBTERMO0tBT2dCO01BUGhCRTtNQUFFZ21CLFFBT2MsNEJBUGQ5UjtNQUFGL1Q7TUFBRStUOztHQWdCRDtZQUdkblksTUFBTTFDLEdBQUd1Qzs7S0FBMEMsSUFBU3ZDLGNBQUh6RTtLQUFTLGtCQUF6RGdILEdBQWdEaEgsR0FBR3lFO0lBQVk7SUFBckIsT0FqZm5EeUMsS0E3SkFHLEtBOG9CTTVDLFlBQTRCekUsR0FBRXlFLEdBQUssV0FBUHpFLEdBQUV5RSxHQUFTO0dBQTJCO1lBRXhFbXNCLE1BQU1uc0IsR0FBR2dDLE1BQU1PO2lCQUNnQ3NZO0tBQUwsSUFBYTdhLGNBQUh6RTtLQUFTLGtCQUQ5Q2dILEdBQ3FDaEgsR0FBTHNmLEtBQVE3YTtJQUFnQjtJQUE3QixPQTd0QjFDcUMsS0E0RUFPLEtBZ3BCTTVDLFlBQ21CekUsR0FBRXlFLEdBQUssV0FBUHpFLEdBQUV5RSxHQUFTLElBRDNCZ0M7R0FDOEQ7WUFHdkVxcUIsT0FBT3JzQixHQUFHdUM7SUFDTixZQWhKSnkvQixLQStJT2hpQztnQkFFQzs0QkFDQzhHLGtCQUFIcEI7SUFBUyxXQW51QmZyRCxLQW11QlN5RSxLQUFIcEIsR0FISW5EO0dBRzZCO1lBR3ZDK3BCLFdBQVd0c0IsR0FBR3VDO0lBQ1YsWUFQSjhwQixPQU1XcnNCLEdBQUd1QztnQkFFTjtRQUNIaUQ7SUFBTyxPQUFQQTtHQUFVO1lBR2YybkIsYUFBNEJIO1FBQVJnVixpQkFBSGhpQztJQUdkO3VCQUhjQTs7YUFHZCxZQUNTO2FBRUk7O2NBRERBO2NBQUw2YTtjQUNNLHFCQU5JbW5CLE1BS0xoaUM7O2tCQUVBMkc7Y0FBSyxtQkFGVmtVLEtBRUtsVTs7Z0JBRkxrVTs7ZUFJVSxXQUFPLDJCQUpqQkE7a0JBTTZCL1Qsa0JBQUwwZ0Msa0JBQTFCNVgsT0FORS9VO2NBT0Esa0JBWmtCbVMsU0FXcEI0QyxNQUEwQjRYOzt3QkFFZiwyQkFSVDNzQjtvQ0FNd0Iyc0IsU0FBSzFnQzt3Q0FBTDBnQyxLQU54QjNzQixNQU02Qi9UOzs2Q0FIcEI7aUJBRUlMLGtCQUFMZ2hDO2FBQVcsdUJBQVhBLFdBQUtoaEM7WUFJa0I7O1lBR3pDNG5CLGtDQUFpRHoxQjtRQUFSb3BDLGlCQUNyQmhpQyxjQUFUMG5DLGNBQVM1Z0M7SUFDcEI7S0FBTSx1QkFGbUNrN0IsTUFDckJsN0I7bUNBRVY7NEJBRlVMO3lCQUlYZjtLQUNQLEdBTFNnaUM7VUFNRC9oQyxJQU5DK2hDO01BTU0sY0FQZ0M5dUMsT0FLeEM4TSxHQUVDQyxJQUFvQixlQUFwQkEsR0FGREQ7O0tBR2tCLElBUGhCaWlDLGlCQUlGamlDLElBSkVnaUMsdUJBQVM1Z0M7OztZQVlwQjJuQiw4QkFBOEJ6dUIsR0FBR3BIO0lBQ25DLE9BenpCRXVwQzthQXd6QjhCbmlDOztzQkFDQzR2QixNQUFLbHFCO2NBQ3BDLEdBRCtCa3FCO21CQUV4QmpxQixJQUZ3QmlxQjtlQUVqQixjQUhtQmgzQixPQUNHOE0sR0FFN0JDLElBQW9CLGVBRlNEOztjQUdqQixXQUhpQkE7YUFHQTtHQUFDO1lBR3JDK1UsTUFBTXphLEdBQUd1QyxHQUFJLE9BNXBCYjZCLE9BakJBaWlCLE9BNnFCTXJtQixHQUFHdUMsSUFBd0I7WUFDakMwdEIsT0FBTzN0QixHQUFHQyxHQUFJLE9BN3BCZDZCLE9BSkFnb0IsUUFpcUJPOXBCLEdBQUdDLElBQXlCO1lBQ25DbVksSUFBSW1CLEdBQUV2WixHQUFHQyxHQUFJLHFDQW54QmJGLE1BbXhCSXdaLEdBQUV2WixHQUFHQyxHQUE4QjtZQUN2QzBZLFFBQVEzWSxHQUFHM0o7SUFBVSxxQ0FweEJyQjBKLE1Bb3hCUUMsR0FBRzNKO0dBQTRDO1lBQ3ZEd2lCLFFBQVE3WSxHQUFHM0o7SUFBVSxxQ0FyeEJyQjBKLE1BcXhCUUMsR0FBRzNKO0dBQTRDO1lBRXZEcUosS0FBSzZTLEdBQUd0UztJQUNWOztxQkFBNEJoSDthQUFLLEdBRDFCc1osS0FDcUJ0WixHQUFvQjthQUFzQixzQ0FBMUNBO2FBQThCLFdBQU8sV0FEdkRnSCxHQUNrQmhIO1lBQWdEO0dBQUM7WUFHM0U0RyxJQUFJbkMsR0FBRytjLEtBQUt0YjtJQUNkLFVBRFNzYiwrQkFBS3RiO1lBQ2E7UUFFWnVnQyxPQUhUaGlDLE1BR004RyxNQUhOOUc7SUFJSjttQkFEVThHOzthQUdOLElBQVE5RyxjQUFIekU7Z0JBTkdrRyxPQU9MLDRCQURFbEcsR0FORndoQixNQVFFO2FBRUcsdUJBUENpbEIsTUFHRGhpQzsyQ0FLSTtvQ0FDSDhHLGdCQUFLLGVBTlR2TCxHQU1JdUw7aUJBQ0VwQixjQUFHZTtnQkFiWHNXLE9BTUV4aEI7Y0FPNkIsV0FBdkJtSyxPQUFrQyw0QkFQeENuSyxPQU9Ta0w7aUJBQ0FFO2FBQU0sZUFBTSw0QkFSckJwTCxPQVFTb0w7WUFBc0I7R0FBRTtZQUcxQ3dzQixLQUFLbnpCLEdBQUV5QjtJQUNULEdBRFNBLFNBQ087UUFFRHVnQyxPQUhSaGlDLE1BR0s4RyxNQUhMOUc7SUFJTDttQkFEVThHOzthQUdOLElBQVE5RyxjQUFIekU7Z0JBTkZrRyxPQU1FbEcsR0FFQTthQUVHLHVCQVBDeW1DLE1BR0RoaUM7MkNBS0k7b0NBQ0g4RyxnQkFBSyxlQU5UdkwsR0FNSXVMO2lCQUNLTCxnQkFBSGY7YUFBUyxXQUFUQSxPQUFvQiw0QkFQMUJuSyxPQU9Ta0w7WUFBNEI7R0FBRTtZQUdoRDJzQixLQUFLcHpCLEdBQUV5QjtJQUNULEdBRFNBLFNBQ087UUFFRHVnQyxPQUhSaGlDLE1BR0s4RyxNQUhMOUc7SUFJTDttQkFEVThHOzthQUdOLElBQVE5RyxjQUFIekUsY0FDQyxtQkFKR3ltQyxNQUdEaGlDOzJDQUVFO29DQUNIOEcsZ0JBQUssZUFIUHZMLEdBR0V1TDtpQkFDRXBCLGNBQUdlO2dCQVZUaEYsT0FNRWxHO2NBSTJCLFdBQXZCbUssT0FBa0MsNEJBSnRDbkssT0FJT2tMO2lCQUNBRTthQUFNLGVBQU0sNEJBTG5CcEwsT0FLT29MO1lBQXFCO0dBQUU7WUFHdkM4c0IsV0FBV3p6QixHQUFHdUM7SUFDaEIsSUFDZXkvQixPQUZGaGlDLE1BRUQ4RyxNQUZDOUc7SUFHWDtZQURVOEc7cUJBR0Y5RzthQUNFLHVCQUpHZ2lDLE1BR0xoaUM7MkNBRU07b0NBQ0g4RyxnQkFBSyxXQUFMQTtpQkFDRXBCLGNBQUdlO2FBQVEsa0JBVFZsRSxHQVNEbUQsWUFBR2U7WUFDVTtHQUFFO1lBRzVCaXRCLFdBQVcxekIsR0FBR3VDO0lBQ2hCLElBQ2V5L0IsT0FGRmhpQyxNQUVEOEcsTUFGQzlHO0lBR1g7NEJBRFU4Rzs7YUFHTjtrQkFPWTlHO2NBQUssT0F6UnJCa25DLGNBK1FhbEYsTUFVR2hpQzs7YUFMSCxJQURHOEcsZ0JBQ0gsbUJBTEFrN0IsTUFJR2w3QjsyQ0FFQzs7a0JBQ0hMO2NBQUssMkJBQUxBOztpQkFFRWYsY0FER2lCO2FBQVEsY0FWYnBFLEdBV0VtRCxJQURrQiwyQkFBZmlCO2lCQUNBbTlCO2FBQU0sV0FBVHArQixrQkFBR28rQjtZQUNzQjtHQUFFO1lBRzNDOEQsWUFBWTVuQyxHQUFFck87SUFDaEIsSUFDa0Jxd0MsT0FGSmhpQyxNQUVGOEgsT0FGRTlIO0lBR1o7Z0NBRFU4SCxNQUZJblc7O2FBS1Y7a0JBRVlxTztjQUFLLE9BblNyQmtuQyxjQThSZ0JsRixNQUtBaGlDOzttQ0FETXJPLGNBQU5tVzthQUFZLFdBQU5uVyxrQkFBTm1XO1lBQ3lCO0dBQUU7WUFHM0MrL0Isc0JBQXNCN25DLEdBQUVzRixHQUFJLE9BcE81QjNELE9BbnBCQU8sUUF1M0J3Qm9ELElBQUZ0RixHQUEwQjtHQUdyQyxnQkF2T1gyQjtZQTJPQWkwQixZQUFZNTFCLEdBQUc0VTtJQUNqQixJQUNlb3RCLE9BRkRoaUMsTUFFRjhHLE1BRkU5RztJQUdaOzJCQURVOEc7O2FBR047O2NBRVMsSUFERDlHLGNBQ0MsbUJBTEFnaUMsTUFJRGhpQzs0Q0FFSzs7bUJBQ0g4RztlQUFLLDBCQUFMQTs7a0JBQ0tMLGdCQUFIZjtjQUFTLFdBQVRBLGtCQUFHZTs7O3NDQU1BcWhDLGtCQUFIQztjQUFTLFdBQVRBLG9CQUFHRDs7YUFKTixJQURFbmhDLGdCQUNGLHFCQVZBcTdCLE1BU0VyN0I7NkNBRUU7O2tCQUNIbTlCO2NBQUssMEJBQUxBOztpQkFDS2tFLGtCQUFILzlCO2FBQVMsV0FmVjJLLHlCQWVDM0ssS0FBRys5QjtZQUMyQjtHQUFFO1lBR2hEQyxPQUFPdDJDLEdBQUksV0FBSkEsWUFBZ0NBLEdBQUssV0FBTEEsTUFBaUIsR0FBQztZQUV6RHUyQyxlQUFlOTlCO0lBQ2pCLEdBQUcsMkJBRGNBO0tBQ1E7SUFDakIsSUFBSnBLLElBcjVCRmtDLFFBbTVCZWtJO0lBR2pCLG9CQUF5QixPQURyQnBLLEVBQ3NCO0lBQVosT0FqUFpxdEIsV0E0T0E0YTtHQUtxQztZQUdyQ3BVLGtCQUFrQnNVLElBQUdDO0lBQUssT0FwUDFCL2EsV0FvUGtCOGEsYUFBOEJ6aUMsR0FBSyxPQWhQckRxbUIsSUF3T0FrYyxPQVFnRHZpQyxJQUEzQjBpQyxJQUFpRDtHQUFDO1lBQ3ZFQyxVQUFVMTJDLEdBQUksNEJBQUpBLEdBQVk7WUFFdEIyMkMsYUFBYXRvQyxHQUFHZ0MsTUFBTU8sR0FBR3lZO2lCQUNzQkgsS0FBSTB0QixRQUFRclc7S0FDM0QsS0FEbURxVyxRQUV6QyxrQkFGaURyVyxHQUFaclg7U0FHeENuVixJQUg0QzZpQztLQUd2QyxrQkFKVWhtQyxHQUN5QnNZLEtBR3hDblYsR0FIb0R3c0I7SUFHckM7SUFIeEIsNkJBRGVseUIsR0FBR2dDLFdBQVNnWjtHQUlGO1lBR3ZCd3RCLE9BQVF6NEIsTUFBTU4sVUFBT25OLEdBQUdOLE1BQU1PO2lCQUl0QnNZLEtBQUkwdEIsUUFBUXJXO0tBQ2xCLEtBRFVxVyxRQUVBLGtCQU5KeDRCLE1BTVMsV0FOSE4sVUFJTm9MLE1BQVlxWDtTQUdYeHNCLElBSEc2aUM7S0FHRSxrQkFQTng0QixNQU9XLFdBUFd4TixHQUl0QnNZLEtBR0NuVixJQUhXd3NCO0lBR2E7SUFObkMsNkJBRHVCNXZCLEdBQUdOLFdBQVZ5TjtHQVFBO1lBR2RnNUIsT0FBUTE0QixNQUFNTixVQUFPbk4sR0FBR0M7d0JBSWJnbUMsUUFBUXJXO0tBQ2pCLEtBRFNxVyxRQUVDLGtCQU5KeDRCLE1BTVMsV0FOSE4sY0FJS3lpQjtTQUdWeHNCLElBSEU2aUM7S0FHRyxrQkFQTng0QixNQU9XLFdBUEt4TixHQU9mbUQsSUFIVXdzQjtJQUdVO0lBTi9CLDZCQUR1QjV2QixXQUFQbU47R0FRQTtZQUdkc0wsV0FBVy9hLEdBQ1NnQyxNQUFGTyxHQURLeVk7SUFDekIsSUFBZWduQixPQURGaGlDLE1BQ0E4akMsTUFEQTlqQyxNQUNBOEcsV0FBUytUO0lBQ3BCO0tBQU0sdUJBRE9tbkIsTUFBRmw3QjttQ0FFRCxrQkFIYWtVLFFBQ0hIOzRCQUFUcFU7S0FLRCxJQUxDRSxnQkFJRmpCLGNBQ0MscUJBTFFuRCxHQUFFc1ksS0FJWG5WOztVQUpXaW5CLG9CQUFUN2xCLFdBQVMrVDs7O1NBTVZscEI7S0FBSyxPQUFMQTs7R0FJOEI7WUFHeENpcEIsWUFBWTVhLEdBQ1FnQyxNQUFGTztJQUFwQixJQUFleS9CLE9BRERoaUMsTUFDRDhqQyxNQURDOWpDLE1BQ0Q4RyxXQUFTK1Q7SUFDcEI7S0FBTSx1QkFET21uQixNQUFGbDdCO21DQUVELG1DQUZVK1Q7NEJBQVRwVTtLQUtELElBTENFLGdCQUlGakIsY0FFSnlCLElBREssV0FMUTVFLEdBQUVzWSxLQUlYblY7Y0FFSnlCLE1BQWdCLE9BQWhCQTtTQU5ld2xCLFFBTWZ4bEIsTUFOTUwsV0FBUytUOztHQVVvQjtZQUd4QzZ0QixjQUFjcG1DLEdBQUksT0FyOUJsQkosUUFxQkFFLFFBZzhCY0UsSUFBdUI7WUFFckNxbUM7SUFBUSxJQUF1QjNHLGlCQUFIaGlDO2FBS3RCMm9DLFFBQ00zb0M7S0FETTs7O21CQUNOOEc7ZUFDWjtnQkFBTSx1QkFQeUJrN0IsTUFNbkJsN0I7OENBRUY7dUNBRkVMO29CQUlBRSxnQkFBSGpCO2dCQUFTLFdBQVRBLEdBTEhpakMsUUFLTWhpQzs7O0lBTDhCO0lBTzVDO0tBQXFCLElBQVNyQjs7b0NBQU0sT0FBTkE7S0FBTSx1Q0FBTkE7SUFBa0I7SUFBaEQsV0FQUXFqQyxRQUxzQjNvQztHQVltQjtZQUcvQzRvQyxhQUFhNW9DLEdBQ0N5QjtJQUFoQixJQUFzQnVnQyxPQURQaGlDLE1BQ0s4akMsTUFETDlqQyxNQUNGekUsT0FBT3VMO0lBQ2xCO1FBRGNyRixPQUFIbEcsR0FFTixXQUZhdUwsS0FBRWs3QjtLQUlaLHVCQUpZQSxNQUFGbDdCO21DQWhCVixPQXBzQlI4OEI7NEJBb3RCa0JuOUI7S0FPTztNQVBQRTtNQUFQUyxNQU9jLDRCQVBkN0w7O01BQU91TDs7R0FVc0I7WUFHeEMraEMseUJBQXdDdG1DO1FBQVJ5L0IsaUJBQ3JCaGlDO0lBQ1g7S0FBTSx1QkFGMEJnaUMsTUFDckJsN0I7bUNBRUQ7NEJBRkNMO1NBSUNFLGdCQUFIaFY7S0FBWSxnQkFMbUI0USxHQUsvQjVRLElBQWlDLGVBQWpDQSxPQUFHZ1YsS0FMb0JxN0I7U0FDckJsN0IsTUFJQ0g7OztZQUtaaE4sVUFBUWdqQixXQUFVL1ksSUFBR0M7aUJBQ01rRzs7TUFDRjs7aUNBQ1YsV0FGWUEsUUFHWCxXQUhXQTtNQUtmOztPQURHKytCO09BQUpDO09BQ0hqM0IsSUFBSSxXQU5KNkssV0FLR29zQixJQUFJRDttQkFDUGgzQjttQkFDVyxXQU5RL0gsR0FLbkIrSDtLQUNzQjtLQXJ4QjlCclAsS0FtY0Eya0MsU0EyVWtCeGpDLElBQUdDO0tBRXJCO0lBTUM7SUFQcUI7R0FPcEI7WUFHRmpMLE1BQU1na0IsU0FBUWhaLElBQUdDOztLQUNTLDJCQUVGOzJCQURYMnFCLGVBQUpGO0tBQVcsa0JBRmQxUixTQUVHMFIsSUFBSUU7SUFDaUI7SUFGSixPQXgwQjFCM3BCLFFBaWZBdWlDLFNBc1ZjeGpDLElBQUdDO0dBR2E7WUFHOUJtbEMsWUFBWXBpQztJQUNkLFNBQUlvN0I7U0FBa0JpSCx1QkFBWkM7S0FDUixLQURRQTtNQU9HLGtDQVBTRDs7d0JBT3FDLDJCQVByQ0E7S0FHWDtNQURZRSxlQUZiRDs7TUFFTzNtQztNQUFIdkM7TUFDSCxxQkFETXVDLEdBQUh2Qzs7TUFJQyxlQUpRbXBDLGNBRkRGOztVQUtWbmlDO01BQUssdUJBQUxBLEtBSEt2RSxJQUFNNG1DLGVBRkRGOztTQUlMeGlDLGtCQUFIOVU7S0FBUyxXQUFUQSxPQUZTdzNDLHNCQUVOMWlDLEtBRkFsRSxJQUZLMG1DOztJQVNWLElBQVIxZ0MsWUFWVTNCO0lBV2QsV0FESTJCLE9BVEF5NUI7R0FVa0I7WUFHcEJvSDtRQUEwQjFnQixlQUFKNmQ7SUFDeEIsU0FBSXZFO1NBQThCdUUsZUFBWjBDLHVCQUFaQztLQUNSLEdBRFFBO01BR0M7T0FEY0MsZUFGZkQ7O09BRVF2Z0I7T0FBSjBkO09BQ0gscUJBRE8xZCxJQUFKMGQ7O09BSUMsZUFKVThDLGNBRkhGLFlBQVkxQzs7V0FLdEJDO09BQU0sZUFITzJDLHNCQUdiM0MsTUFITTdkLEtBRklzZ0IsYUFBWTFDOztVQUlqQkUsbUJBQUg5MEM7TUFBVSxXQUFWQSxPQUZXdzNDLHNCQUVSMUMsTUFGQzlkLEtBRklzZ0IsYUFBWTFDOztLQVF2Qix5QkFUaUI3ZCxJQUNNNmQ7O2FBQVowQzt3QkFXTywyQkFYUEEsZ0JBQVkxQzs7O1VBVXRCRztNQUFTLGVBQU0sMkJBVkx1QyxnQkFVVnZDOztTQURLRSxtQkFBSHRrQztLQUFhLGVBQU0sK0JBQW5CQSxHQVRRMm1DLGlCQVNMckM7O0lBS0wsSUFBUnIrQixrQkFmb0JnK0I7SUFnQnhCLFdBREloK0IsT0FkQXk1Qjs7WUFrQkZxSCw4QkFBOEI5QyxJQUFHRjtJQUNuQyxPQXBCRStDO2FBb0JGOztlQURnQzdDO3dCQUNqQm5mO2dCQUFNLE9BQVU7Z0NBRElpZixhQUNDaGYsSUFBTSxXQUEzQkQsSUFBcUJDLElBQVk7ZUFBQztHQUFlO1lBRzlEaWlCLE9BQVFDO0lBQ1Y7WUFEVUE7cUJBQ29CQTthQUN0Qix1QkFEc0JBO3lCQUVuQjtpQkFDR25sQixlQUFKRDthQUFXLFdBQVhBLElBQUlDO1lBQXFCO0dBQUM7WUFHbENvbEI7UUFBeUJ4SCxpQkFBUHo1QjtJQUNwQixTQUFRbUksS0FBS25JO0tBQ1gsSUFEV202QjtLQUNYO01BQU0sdUJBRm1CVixNQUNkVTtvQ0FFRDs2QkFGQ0M7VUFJRUMsb0JBQUp6ZTtNQUFjLFdBQWRBLG9CQUEyQyxPQUo5Q3pULEtBSU9reUIsU0FBaUQ7O0lBQUM7SUFFakUsdUJBQVUsT0FORmx5QixLQURZbkksT0FPQTs7WUFXZDZRLFNBQU96bkIsR0FBRXVnQyxHQUFJLGtCQUFKQSxHQUFGdmdDLEdBQVM7WUFFaEJ1bkIsT0FBSzJDLEdBQUd0WixHQUFFMnZCO0lBQ1osT0FBRTthQURLclc7c0JBQ0FuVyxHQUNJLElBQUxtVyxJQUFLLFdBRkR0WixHQUNIbUQsSUFFTCxrQkFESW1XLEdBRk1xVyxHQUdOO0dBQUM7R0FJQztJQUFOL1k7OztnQkFESTBDLEdBQUd0WixHQUFFMnZCO1FBQUksT0FBRTtpQkFBWHJXLFlBQWdCblcsR0FBSyxPQUFFLFdBQWxCd3NCLEdBQWtCLFdBQXBCM3ZCLEdBQWFtRCxJQUFZO09BQUM7OENBTmpDd1QsUUFPQUMsT0FUQUM7Ozs7Ozs7Ozs7OztZQWVGcXdCLFFBQU10aUMsR0FBRStxQixHQUFJLGVBQU4vcUIsR0FBRStxQixJQUF1QjtZQUcvQndYLFlBQVlDO0lBQ2QsT0FwTUFyQjthQW1NY3FCOzs2QkFJRGg0QyxHQUFHdWdDLEdBQUUzdkI7Y0FBSyxlQUFWNVEsbUJBQW9DLE9BQTFCLFdBQVB1Z0MsTUFBRTN2QixHQUFxQzthQUFFOztHQUN6QztZQUdkMEYsSUFBSTNGO2FBQ0ZOLFlBQVUsT0FYRyxXQVVYTSxtQkFWc0IsV0FBUyxHQVdiO0lBQ3hCLFNBQUlDLEVBQUVxbkMsT0FBUSxPQUFPLFdBQWZBLGFBQXlCO0lBQy9CLFdBRkk1bkMsTUFDQU87R0FDZ0I7Ozs7T0F2a0NwQjJMO09BcytCQXRWO09BWEFlO09BdHZCQStpQjtPQTVJQXRZO09BaUlBZ1M7T0FiQTNUO09Bek9BSjtPQWc4QkF1WTtPQWRBRztPQWh1QkF2VztPQXZCQUs7T0FzbEJBNFY7T0FFQUM7T0Fob0JBVztPQVdBRDtPQWhKQWhaO09Bb0hBa1o7T0FrcEJBTDtPQUNBRTtPQXpEQWdSO09BRkF6cEI7T0E3ZkF1a0I7T0FxakJBZ0o7T0E5SUF2SjtPQXZkQUc7Ozs7Ozs7Ozs7OztPQStGQStjO09BcVVBNUI7O09BeG9CQUM7T0FFQUM7T0FPQUM7T0FnQkFHO09BMlVBamU7T0FjQUM7T0FuT0FpRztPQU1BMEI7T0FsQkFycEI7T0FxQ0F3cEI7T0FiQS9GO09Bc2FBMGdCOztPQWFBQzs7T0FqQ0FiO09BK0NBaGlCO09BV0FoZ0I7T0FNQWlnQjtPQWNBNmlCO09Ba0VBeGdCO09BaGNBTztPQXNjQXJsQjtPQW1CQUU7T0FEQXdyQjtPQUVBQztPQXNYQThiO09BZEFKO09BdFdBamQ7T0FVQXFiO09BMERBOWE7T0FOQUQ7T0FZQWM7T0FpQkFrQjtPQWFBSTtPQTV1QkF0TDtPQXl2QkFuaEI7T0E5S0FvdUI7T0FDQUc7T0FkQUM7T0ErTEFydUI7T0FpQkFneEI7T0FnQkFDO09BbUtBd1Y7T0FySkFuVjtPQWFBQztPQXNKQW1WO09BallBNVY7T0FjQWtVO09BNE9BUztPQVVBQztPQXBEQXpVOztPQXNGQVM7T0F1SkF3VjtPQWxMQXpUO09BcUJBc1M7T0FGQUQ7T0FTQUk7T0FFQUM7T0FPQUU7T0FXQUM7T0E1NUJBcEY7T0FsQkFuaEM7T0F1REFnM0I7T0FnNkJBeVA7T0FGQUQ7T0F0UkFyQjtPQWFBRTtPQXdXQStCO09BT0FFOzs7Ozs7Ozs7Ozs7O1FBaUNFQztRQUdBQztRQVFBemhDOzs7O0V4RHp0Q1A7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SXlETUt0UDtJQUNBcWE7SUFDQTVHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBRUNGLGVBQ0NzTDtJQUFvQixvQ0FBcEJBO0dBQXVEO1lBb0N2RG5ELGdCekQvQ1A7WXlEZ0RPdzFCO0l6RGhEUDs7O1l5RGtET0MsT0FBSzFWLEtBQUk3NEIsR0FBRXdIO0lBQ0gsSUFBTmduQyxNQUpGMTFCLElBR0srZixLQUFJNzRCO0lBRlRzdUMsSUFFS3pWLEtBQUk3NEIsR0FIVDhZLElBR0srZixLQUFNcnhCO0lBRWIsT0FKRThtQyxJQUVLelYsS0FBTXJ4QixHQUNUZ25DO0dBRVM7WUFjVDFrQyxLQVdhK3VCLEtBQVd6N0IsU0FBTnF4QyxNQVhPQztJQUdqQix1Q0FRVUQ7T0FYT0M7U0FXT2x0Qjs7O01BUXhCLElBUjBCbE0sSUEvQnBDd0QsSUErQmUrZixLQUFtQnJYLE1BUzVCbXRCLFlBVDRCbnRCO01BQzlCO09BQWEsSUFBVG90QixTQUFTLDRCQVFYRDtPQVBtQixHQUZMRixRQUNaRyxjQUNpQixXQUZDeHhDLFNBL0IxQjBiLElBK0JlK2YsS0FDUCtWLFNBRDRCdDVCO1FBOUJwQ2c1QixJQThCZXpWLEtBU1Q4VixXQXhDTjcxQixJQStCZStmLEtBQ1ArVjtZQVFGRCxZQVJFQzs7O09BL0JSTixJQThCZXpWLEtBU1Q4VixXQVQ4QnI1QjtPQVIxQixXQVF3QmtNO1VBWFBrdEIsVUFXT2x0Qjs7Ozs7OztHQVc5QjtHQXZCdUIseUJBQ3pCMVg7WUE4Qkkra0MsUUFBUWhXLEtBQUt6N0IsU0FBUTB4QyxNQUFNTCxNQUFNQztJQUN2QyxJQUQyQks7SUFDM0I7S0FBb0I7TUFBaEJDLGdCQUFnQiw0QkFET0QsUUFBTU47TUFFaEIsc0NBRGJPO01BQ2EseUNBRmdCUDtNQUU3QlEsYUFBYTtNQUNDLHNDQUZkRDtNQUVjLHlDQUhlUDtNQUc3QlMsY0FBYzs7UUFEZEQsY0FGbUNQO01BS2tCLFdBdkR6RDUxQixJQWtEYytmLEtBQWFrVztNQUtDLGtCQUxUM3hDLFNBbERuQjBiLElBa0RjK2YsS0FFVm9XLHdCQUVBRSxVQUZBRjs7d0JBRUFFLFVBSnVCSjs7UUFHdkJHLGVBSG1DUjtNQVVvQixXQTVEM0Q1MUIsSUFrRGMrZixLQUlWc1c7TUFNeUIsa0JBVlYveEMsU0FsRG5CMGIsSUFrRGMrZixLQUdWcVcseUJBSHVCRSxZQUd2QkY7O3dCQUh1QkUsWUFJdkJEO2dCQUp1QkM7O0tBL0MzQmIsT0ErQ2MxVixLQUFha1c7OztHQWlCaUI7WUFZMUNNLE9BQUt4VyxLQUFLejdCLFNBQVNxeEMsTUFBTUM7SUFDM0I7S0FOUSxtQ0FLYUQsTUFBTUM7S0FMbkI7ZUFLYUQ7U0FMckJ6dUM7O01BeEJNNnVDLFFBNkJDaFcsS0FBS3o3QixTQUxaNEMsR0FLcUJ5dUMsTUFBTUM7TUFKekIsV0FERjF1QztTQUtxQnl1QyxTQUxyQnp1Qzs7OztJQVdxQix1Q0FOQXl1QztPQUFNQztTQU0zQjdpQyxNQU4yQjZpQzs7TUE1RTNCSCxPQTRFTzFWLEtBQWM0VixNQU1yQjVpQztNQW5DTWdqQyxRQTZCQ2hXLEtBQUt6N0IsU0FBU3F4QyxZQVFvQiw0QkFGekM1aUM7TUFFRSxXQUZGQTs7Ozs7O0dBR0k7R0F6Q2tCLG9CQWdDcEJ3akM7WUEyQkFDLGtCQUFrQnpXLEtBQUt6N0IsU0FBUW15QyxJQUFHQyxJQUFHQyxJQUFHQyxJQUFHQzthQUN6Q0MsaUJBQWlCNXZDLEdBQUV3SDtLQUNyQjtNQUF1QixPQTVHekJzUixJQTBHb0IrZixLQUNHcnhCO2lCQUNsQixXQUZvQnBLLFNBMUd6QjBiLElBMEdvQitmLEtBQ0M3NEI7bUJBeEdyQnV1QyxPQXVHb0IxVixLQUNDNzRCLEdBQUV3SDtJQUNtQztJQUR0RG9vQyxpQkFENkJMLElBQUdDO0lBQ2hDSSxpQkFEc0NGLElBQUdDO0lBQ3pDQyxpQkFENkJMLElBQU1FO0lBQ25DRyxpQkFEZ0NKLElBQUdDO0lBQ25DRyxpQkFENkJMLElBQVNHO0lBQ3RDRSxpQkFEbUNILElBQUdDO0lBQ3RDRSxpQkFEZ0NKLElBQVNHO0lBQ3pDQyxpQkFEZ0NKLElBQUdDO0lBd0J2QyxPQXZCSUcsaUJBRHNDRixJQUFHQztHQXlCdkI7WUEyRGhCRSxXQUFXaFgsS0FBS2lYLFdBQVcxeUMsU0FBU3F4QyxNQUw3QkM7SUFNYixJQURzQnFCLHlCQUxiQyxTQUtpQ3ZCOztJQUMxQztLQUFVO3lDQU5HQyxPQUFKc0I7TUFNTDlwQyxNQUFNO0tBSVYsU0FKSUE7TUFLQyxxQ0FOWTJ5QixLQUFnQno3QixTQUx4QjR5QyxRQUFJdEI7WUFLU3FCO01BUWpCLGdDQVJZbFgsS0FBZ0J6N0IsU0FMeEI0eUMsUUFBSXRCO0tBZUs7TUFWSXVCLGNBVUosNEJBVklGO01BL0NWLG1DQTBDQ3JCLE9BQUpzQjtNQTFDTEUsUUFBUTtNQUNSWCxLQUFLLDRCQXlDQVMsUUExQ0xFO01BRUFWLEtBQUssNEJBRExELElBREFXO01BR0FULEtBQUssNEJBRExELElBRkFVO01BSUFSLEtBQUssNEJBRExELElBSEFTO01BS0FQLEtBQUssNEJBRExELElBSkFRO0tBckNGWixrQkFvRmV6VyxLQUFnQno3QixTQTlDN0JteUMsSUFDQUMsSUFDQUMsSUFDQUMsSUFDQUM7S0FFUztNQUFUUSxTQXRKSnIzQixJQThMaUIrZixLQTdDYjJXO01BTUFZLFNBdkpKdDNCLElBOExpQitmLEtBNUNiNFc7TUFNQVksU0F4Skp2M0IsSUE4TGlCK2YsS0EzQ2I2VztNQU1EO3lCQXFDOEJ0eUMsU0F4QzdCK3lDLFFBQ0FDO2VBREFELFFBQ0FDOztlQUlJLFdBbUN5Qmh6QyxTQXZDN0JnekMsUUFDQUM7aUJBREFELFFBQ0FDO2lCQUZBRixRQUVBRTtNQWlEUUM7TUF4Q0FDO01BQVJDO01Bd0NFNWMsTUFoQkdvYztNQUFFUyxNQUFGVDtNQWdCQVUsTUFoQkloQzs7S0FBSTtTQWdCUmdDLE1BaEJFRDtPQUtMWjtTQUFXaFg7U0FBS29YO1NBQVc3eUM7U0FMeEI0eUM7U0FpQnlDLDRCQUQ1Q3BjO2NBQU0wYyxlQVhOVCxXQUFXaFgsS0FBS29YLGFBQVc3eUMsU0FXM0J3MkIsS0FBRzhjO09BR2tDO1FBZERDLFNBY0MsNEJBSGxDRDtRQVhhWDtRQUxiQyxTQUtpQ1c7OztNQXBCL0IsSUFBTEMsS0ExS045M0IsSUE4TGlCK2YsS0FMTjRYO01BZE4sa0JBbUI0QnJ6QyxTQXBCM0J3ekMsSUFURko7T0E5SkpqQyxPQTJMaUIxVixLQUxONFgsS0FnQkw3YztPQTNCVztRQVdOaWQsTUFYTSw0QkFXTko7UUFBRjFtQyxJQVhBLDRCQTJCSDZwQjtjQWhCRzdwQjtRQUFFMG1DOzs7TUFWRCxtQkFldUJyekMsU0FwQjNCd3pDLElBVE1MO09BdUJFLElBQ0hyL0IsSUFERyw0QkFDSHUvQjs7O1VBSkhqaUMsSUFvQkNraUM7TUF0Qkg7T0FBWSxHQU1QRCxNQUpIamlDLFNBRlUsV0FXZXBSLFNBOUxqQzBiLElBOExpQitmLEtBVFRycUIsSUFwQkkraEM7UUFrQnlELElBRDFDTyxNQUMwQyw0QkFFN0R0aUMsV0FIbUJzaUM7OztPQS9LM0J2QyxPQTJMaUIxVixLQVRUcnFCLEdBSUdpaUM7T0FGRSxJQUVBTSxNQUZBLDRCQUZMdmlDLE9Bb0JDa2lDLE1BaEJJSzs7Ozs7R0FtQjZDO1lBR3hEQyxPQUFLblksS0FBS3o3QixTQUFTcXhDLE1BQU1DO0lBQzNCLE9BbEJNbUIsV0FpQkNoWCxTQUFLejdCLFNBQVNxeEMsTUFBTUM7R0FtQjJDO0dBekhwRSxxQkFzR0FzQyxRQXJHQTFCO1lBNkhKMkIsT0FBTXp2QixLQUFLdGIsS0FBSTJ5QixLQUFLejdCO0lBQ3RCO0tBQ0U7OzRDQUZNb2tCLEtBQUt0YixRQUFJMnlCO0tBQ1JoWDtLQUFMc2dCO0tBR2dELG1DQUhoREEsT0FBS3RnQjtLQUcwQztxQ0FKbENnWCxLQUFLejdCLFNBQ2xCK2tDO0dBRzhEO1lBR2hFcGlCLFNBQVNoWixHQUFJLE9BQUpBLEVBQUs7WUFDZDhULFNBQVM5VCxHQUFJLGFBQUpBLHFCQUFnQjtZQUV6QjR4QixVQUFVNXhCLEdBQUczSjtJQUNmO0tBQUk0QyxRQUFRLDRCQURBK0c7S0FFUmdlOztZQURBL2tCLFFBQ0Era0I7TUFFVTtPQUFSdGQsUUFKTVYsTUFDUi9HO09BSUVreEMsZ0JBTE1ucUMsTUFLdUIsNEJBSi9CL0c7YUFLQyxXQU5VNUMsU0FLVDh6QyxlQURBenBDLFFBRkZzZDtNQUtGLDZCQU5FL2tCOzs7WUFDQStrQjs7R0FPRztZQUdMNlQsbUJBQW1CN3hCLEdBQUczSjtJQUN4QjtLQUFJNEMsUUFBUSw0QkFEUytHO0tBRWpCZ2U7O1lBREEva0IsUUFDQStrQjtNQUVVO09BQVJ0ZCxRQUplVixNQUNqQi9HO09BSUVreEMsZ0JBTGVucUMsTUFLYyw0QkFKL0IvRztjQUtDLFdBTm1CNUMsU0FLbEI4ekMsZUFEQXpwQyxRQUZGc2Q7TUFLRiw2QkFORS9rQjs7O1lBQ0Era0I7O0dBT0c7WUFHTGtOLE1BQU1jLElBQUdFLElBQUk3MUI7SUFDZixJQUFJK0wsS0FESTRwQixlQUVKM3BCLEtBRk82cEI7SUFHWCxTQUZJOXBCLElBR0Msd0JBSk04cEI7YUFFUDdwQixJQUlDLHdCQU5HMnBCO0lBTzBCLFdBUDFCQSxPQU95Qyw0QkFON0M1cEI7SUFNSSxtQkFQTy9MLFNBQUo2MUI7S0FRTiwwQkFSR0YsSUFBR0U7SUFTdUIsV0FUdkJBLE9BU3NDLDRCQVA3QzdwQjtJQU9JLGtCQVRPaE0sU0FBUDIxQjtLQVVILDBCQVZNRSxJQUFIRjtJQVlJO0tBQU43c0IsTUFBTSw0QkFYUmlELElBQ0FDO0tBV0UrbkMsU0FBUyxtQkFEVGpyQyxLQVpFNnNCO0tBY0ZxZTtLQUNBQztLQUNTLG1DQUpUbnJDO0tBR1c7O1NBQ2ZsRzs7O09BQ01zeEM7U0FoQkpub0MsT0FhRWlvQzs7WUFaRmhvQztnQkFhRWlvQzs7Y0FPSztnQkF0QklqMEMsU0FBUDIxQixPQWNGcWUsY0FkS25lLE9BZUxvZTs7OztNQVNGLEdBUElDO09BSkZILFdBR0pueEMsS0FoQk0reUIsT0FjRnFlO3FCQWFZLDRCQWJaQTs7O09BREFELFdBR0pueEMsS0FoQlNpekIsT0FlTG9lO3FCQWVZLDRCQWZaQTs7TUFDSjs7Ozs7SUFnQkEsT0FuQklGO0dBbUJHO1lBR1BJLGtCekQzVkw7WXlENlZLdmlCLFlBQVlqb0IsR0FBR04sTUFBTU87SUFDYixJQUFOc1ksVUFEYTdZO0lBRVI7O2FBRktNO3NCQUVBM1E7Y0FDWjtlQUFpQixtQkFISTRRLEdBQ25Cc1ksUUFDVWxwQjtlQUNDQztlQUFUNDRCO2NBRkYzUCxTQUVFMlA7Y0FFSixPQUZhNTRCO2FBRVo7R0FBQztZQUdGNjRCLFNBQVNub0IsR0FBR04sTUFBTU87SUFDcEI7S0FBSXNZLFVBRFU3WTtLQUVWc2U7T0FDRjs7U0FIU2hlO2tCQUdLM1E7VUFDWjtXQUFpQixtQkFKRDRRLEdBQ2hCc1ksUUFFWWxwQjtXQUNDQztXQUFUNDRCO1VBSEozUCxTQUdJMlA7VUFFSixPQUZhNTRCO1NBRVo7SUFFTCxXQVBJaXBCLFFBQ0F5RjtHQU1RO1lBR1YxRixZQUFZdFksR0FBR04sTUFBTU87SUFBSSwyQ0FBVlAsTUFBTU8sR0FBVEQ7R0FBbUQ7WUFDL0R5WSxXQUFXelksR0FBR04sTUFBTU87SUFBSSwrQ0FBVlAsTUFBTU87SUFBSSxzQnpEalg3Qiw4QnlEaVhnQkQ7R0FBa0Q7WUFDN0RtWSxNQUFNblksR0FBR0MsR0FBSSwyQ0FBUEQsR0FBR0MsR0FBOEI7WUFDdkNtWSxJQUFJbUIsR0FBRXZaLEdBQUdDLEdBQUksMkNBQVRzWixHQUFFdlosR0FBR0MsR0FBOEI7WUFDdkMwWSxRQUFRM1ksR0FBRzNKO0lBQVUsMkNBQWIySixHQUFHM0o7R0FBNEM7WUFDdkR3aUIsUUFBUTdZLEdBQUczSjtJQUFVLDJDQUFiMkosR0FBRzNKO0dBQTRDO1lBRXZEd3pCLE1BQU03cEIsR0FBR04sTUFBTU87SUFDakI7S0FBSXNZLFVBRE83WTtLQUVFLG1DQUZMTTtLQUNFOztTQUNWL0c7O01BRElzZixTQUVLLFdBSFF0WSxHQUVqQmhILEdBRElzZixRQURJdlksTUFFUi9HOzs7Ozs7V0FESXNmO0dBSUE7WUFHRm9SLGFBQWEzcEIsR0FBR04sTUFBTU87SUFDZCxJQUFOc1ksVUFEYzdZO0lBRVI7O2FBRktNO3NCQUVBL0csR0FBRTVKO2NBQ2Y7ZUFBaUIsbUJBSEs0USxHQUVUaEgsR0FEWHNmLFFBQ2FscEI7ZUFDRkM7ZUFBVDQ0QjtjQUZGM1AsU0FFRTJQO2NBRUosT0FGYTU0QjthQUVaO0dBQUM7WUFHRnM2QixVQUFVNXBCLEdBQUdOLE1BQU1PO0lBQ3JCO0tBQUlzWSxVQURXN1k7S0FFWHNlO09BQ0Y7O1NBSFVoZTtrQkFHSy9HLEdBQUU1SjtVQUNmO1dBQWlCLG1CQUpBNFEsR0FHSmhILEdBRmJzZixRQUVlbHBCO1dBQ0ZDO1dBQVQ0NEI7VUFISjNQLFNBR0kyUDtVQUVKLE9BRmE1NEI7U0FFWjtJQUVMLFdBUElpcEIsUUFDQXlGO0dBTVE7WUFHVjJQLE9BQU8zdEIsR0FBR0M7SUFDWixPQTVCRTRwQjthQTJCTzdwQjs7c0JBQ2U0dEIsS0FBSXpWLE9BQU0vVTtjQUFLLE9BQUcsV0FEOUJuRCxHQUNZMnRCLEtBQVV4cUI7d0JBQXFCLDRCQUEzQitVOzthQUErQztHQUFDO1lBRzFFNFMsV0FBVy9xQixHQUFHQztJQUFJLE9BQU8sdUNBQVMsZ0JBQXZCRCxHQUFHQztHQUErQjtZQUM3QytxQixZQUFZaHJCLEdBQUdDO0lBQUksT0FBTyx1Q0FBUyxpQkFBdkJELEdBQUdDO0dBQWdDO1lBRS9Dd3FDLFlBQVl6cUM7SUFDZCxJQUFJL0csWUFDQXdILFFBQVEsNEJBRkVUO0lBTVo7UUFMRS9HLFFBQ0F3SDtLQUVGLGlCQUpZVCxHQUNWL0csTUFDQXdIO0tBR0YsNkJBSkV4SDtLQUtGLDZCQUpFd0g7O0dBS0E7WUFHRndDLElBQUlqRDtJQUNFLElBQUprRyxNQUFJLGlCQURGbEc7SUFWSnlxQyxZQVdFdmtDO0lBQ0osT0FESUE7R0FFSDtZQUdDd2tDLFlBQVkxbkM7SUFDZCxLQURjQSxHQUVOO0lBRVE7S0FEVDZwQixNQUhPN3BCO0tBR1pJLElBSFlKO0tBSUUsK0JBRFQ2cEI7S0FDRDF0QixNQUFNO0tBQ05hLElBQUksbUJBREpiLEtBREppRTtLQUdJcUUsUUFIQ29sQjtLQUtHLG1DQUpKMXRCOztTQUlKbEc7O2tCQUZJd087O09BSU07VUFDRHVwQixnQkFBTHJwQjtNQUNBLGlCQVBBM0gsR0FHSi9HLFlBR0kwTztNQUxBRixPQUtLdXBCO01BSEQsV0FBUi8zQjs7Ozs7SUFPQSxPQVZJK0c7R0FVSDtZQU1EMnFDLFlBQVk3aUMsSUFBSTdIO0lBQ2xCLEtBRGM2SCxJQUVOO0lBRW1DO0tBRG5DZ2EsS0FITWhhO0tBR1orWixLQUhZL1o7S0FJNkIsaUJBSnpCN0gsR0FHaEI0aEI7S0FDeUIsK0JBRG5CQztLQUNGMWUsSUFBSSxtQkFBWTtLQUNQbks7YUFGUDZvQjs7aUJBRU4sT0FESTFlO1NBR01pcEIsaUJBQU5QO0tBSEExb0IsTUFDU25LLEtBR00sV0FSSGdILEdBT1o2ckI7S0FFSyxzQ0FKSTd5Qix3QkFFSG96Qjs7R0FJRDtZQUdUdWUsYUFBYTlpQyxJQUFJN0g7SUFDbkIsS0FEZTZILElBRVA7SUFFbUM7S0FEbkNnYSxLQUhPaGE7S0FHYitaLEtBSGEvWjtLQUk0QixpQkFKeEI3SCxNQUdqQjRoQjtLQUN5QiwrQkFEbkJDO0tBRU8xZSxJQURMLG1CQUFZO0tBQ0xuSzthQUZUNm9COztpQkFHSSxPQURHMWU7U0FFSGlwQixpQkFBTlA7S0FGUzFvQixNQUFFbkssS0FHSSxXQVJGZ0gsR0FLRmhILEdBRVg2eUI7S0FFTyxzQ0FKSTd5Qix3QkFFTG96Qjs7R0FJQztZQUdYd2UsZ0JBQWdCL2lDLElBQUk3SDtJQUNkLElBQUpELElBN0JGMnFDLFlBNEJnQjdpQyxJQUFJN0g7SUFqRXBCd3FDLFlBa0VFenFDO0lBQ0osT0FESUE7R0FFSDtZQUdDOHFDLGlCQUFpQmhqQyxJQUFJN0g7SUFDZixJQUFKRCxJQXJCRjRxQyxhQW9CaUI5aUMsSUFBSTdIO0lBdkVyQndxQyxZQXdFRXpxQztJQUNKLE9BRElBO0dBRUg7WUFHQ2l1QixZQUFZanVCLEdBQUdDO0lBQ2pCO0tBQUl3SDtLQUNBbW9CO0tBQ1Msa0NBSEM1dkI7S0FFTjs7U0FDUi9HOztNQUNRLHVCQUpTZ0gsR0FHakJoSCxHQUhjK0csTUFHZC9HOztXQUdTbUs7Z0JBSkx3c0IsTUFEQW5vQixPQU1vQixtQkFQVnpILGNBTUxvRDtPQUxMcUUsU0FDQW1vQixRQUlLeHNCO09BR0wsNkJBUEF3c0I7O01BQ0o7Ozs7O1dBRElBLFNBRlU1dkI7Y0FDVnlIO2tCQUNBbW9CLHVCQURBbm9CLFNBQ0Ftb0I7R0FTd0U7WUFHMUU5QixXQUFXOXRCLEdBQUdDO0lBQUksT0FkbEJndUIsWUFjV2p1QixZQUE2Qi9HLEdBQUdtSyxHQUFLLGtCQUFsQ25ELEdBQTZCbUQsR0FBUTtHQUFDO1lBQ3BEOHFCLFdBQVdsdUIsR0FBSSxPQURmOHRCLFdBQ1c5dEIsaUJBQUksY0FBcUI7WUFPcENxaUIsa0JBQWtCdlEsTUFBS3hRLElBQUdDO0lBQzVCLElBTjZCdWhCLEtBS0p4aEIsZUFMT3loQixLQUtKeGhCLHFCQUxDdWhCLE9BQUdDO2lCQUNoQyw4QkFJb0JqUixNQUxTZ1IsSUFBR0M7R0FRaUI7WUFHL0NJLFVBQVU3aEIsSUFBR0MsSUFBSXRCO0lBTmpCb2lCLHVDQU1VL2dCLElBQUdDO0lBRUg7b0JBRkFELGFBRUtySSxHQUFFNnJCLElBQU0sT0FBSyxXQUZYN2tCLEdBRUE2a0IsSUFGSnZqQixPQUVFdEksSUFBOEI7R0FBQztZQUc5Q292QixTQUFTL21CLElBQUdDLElBQUl0QjtJQVhoQm9pQixzQ0FXUy9nQixJQUFHQztJQUVNOzthQUZURDtzQkFFY3JJLEdBQUssT0FBb0IsV0FGaENnSCxHQUFQcUIsT0FFY3JJLElBRlhzSSxPQUVXdEksSUFBMEM7R0FBQztZQUdsRXNxQixVQUFVamlCLElBQUdDLElBQUk3QixNQUFNTztJQWhCdkJvaUIsdUNBZ0JVL2dCLElBQUdDO0lBRUcsT0F2SmhCc29CO2FBcUpVdm9CO2FBQU81QjtzQkFFSXpHLEdBQUV5dkIsSUFBR3I1QixHQUFLLE9BQU8sV0FGZjRRLEdBRUF5b0IsSUFBR3I1QixHQUZia1MsT0FFUXRJLElBQWtDO0dBQUM7WUFHeEQ4cUIsT0FBTy9qQixHQUFHQztJQUFJLE9BN0JkNnRCLFdBNkJPOXRCLFlBQTRCM1EsR0FBSyxPQUFHLFdBQWpDNFEsR0FBeUI1USxnQkFBaUM7R0FBQztZQUNyRXk2QixRQUFROXBCLEdBQUdDO0lBQUksT0E1Q2ZndUI7YUE0Q1FqdUIsWUFBNkIvRyxHQUFFNUosR0FBSyxPQUFHLFdBQXBDNFEsR0FBMEJoSCxHQUFFNUosZ0JBQW1DO0dBQUM7WUFHM0U2UyxPQUFPbEMsR0FBR0M7SUFDWjtLQUFJaEgsUUFBUSw0QkFESCtHO0tBRUxnZTtJQUU4QzthQUg5Qy9rQixVQUNBK2tCO01BRUMsY0FKTy9kLEdBQUhELE1BQ0wvRyxRQUNBK2tCO01BRThDLDZCQUg5Qy9rQjs7O1lBQ0Era0I7O0dBSUc7WUFHTDJHLFFBQVEza0IsR0FBR0M7SUFDYjtLQUFJaEgsUUFBUSw0QkFERitHO0tBRU5nZTtJQUVpRDthQUhqRC9rQixVQUNBK2tCO01BRUMsY0FKUS9kLEdBQ1RoSCxNQURNK0csTUFDTi9HLFFBQ0Era0I7TUFFaUQsNkJBSGpEL2tCOzs7WUFDQStrQjs7R0FJRztZQUdMNUQsSUFBSXBhLEdBQUVvRCxHQUFHOU0sT0FBUSxPQWxCakI0TCxPQWtCSWxDLEdBQXlCLFdBQXBCMUosT0FBSDhNLElBQWdDO1lBRXRDYixRQUFRdkMsR0FBR0M7SUFDYjtLQUFJaEgsUUFBUSw0QkFERitHO0tBRU5nZTtJQUVxRDthQUhyRC9rQixRQUNBK2tCO01BRUssY0FKSS9kLEdBQUhELE1BQ04vRztPQUdxRCw2QkFIckRBOzs7TUFDQStrQjs7Ozs7R0FJRztZQUdMMEcsU0FBUzFrQixHQUFHQztJQUNkO0tBQUk2QixTQURPOUI7S0FFUC9HLFFBQVEsNEJBRFI2STtLQUVBa2M7SUFFd0Q7YUFIeEQva0IsUUFDQStrQjtNQUVLLGNBTEsvZCxHQUVWaEgsTUFGTytHLE1BRVAvRztPQUd3RCw2QkFIeERBOzs7TUFDQStrQjs7Ozs7R0FJRztZQUdMMkYsWUFBWXJpQixJQUFHQyxJQUFJdEI7SUFoRW5Cb2lCLHlDQWdFWS9nQixJQUFHQztJQUVUO0tBQUp0SSxRQUFRLDRCQUZFcUk7S0FHVjBjO0lBRWtFO2FBSGxFL2tCLFVBQ0Era0I7TUFFQyxjQUxnQi9kLEdBQVBxQixPQUVWckksT0FGYXNJLE9BRWJ0SSxRQUNBK2tCO01BRWtFLDZCQUhsRS9rQjs7O1lBQ0Era0I7O0dBSUc7WUFHTHlGLGFBQWFuaUIsSUFBR0MsSUFBSXRCO0lBMUVwQm9pQiwwQ0EwRWEvZ0IsSUFBR0M7SUFFVjtLQUFKdEksUUFBUSw0QkFGR3FJO0tBR1gwYztJQUV5RTthQUh6RS9rQixRQUNBK2tCO01BRUssY0FMYS9kLEdBQVBxQixPQUVYckksT0FGY3NJLE9BRWR0SSxRQUd5RSw2QkFIekVBO01BQ0Era0I7Ozs7O0dBSUc7WUFHTDFuQixNQUFNQSxPQUFNZ0wsSUFBR0M7SUFBSyxVQUFSRCxrQkFBR0M7aUJBVmZraUIsYUFVWW5pQixJQUFHQyxJQUFUakw7R0FBa0U7WUFHeEV5MEMsWUFBWS9xQyxHQUFHQztJQUNqQixJQUFhLGtDQURDRCxrQkFDZDs7OztNQURjQSxNQUNkL0csS0FDaUIsV0FGQWdILEdBQUhELE1BQ2QvRztNQUNFLFVBREZBOzs7Ozs7R0FFSTtZQUdjK3hDLGVBQWVockMsR0FBR0MsR0FBR2dyQyxVQUFVQztJQUNqRCxJQUFJcHBDLFNBRDZCOUI7SUFFakMsU0FESThCLFFBRUMsa0JBSDRDb3BDO0lBS3ZDLElBQUpqeUMsWUFDQWt5QyxnQkFDQUMsa0JBUDJCcHJDOztVQU0zQm1yQyxZQURBbHlDLE9BSkY2STtNQVFZLElBQVJzdUIsUUFUeUJwd0IsTUFLM0IvRztNQUtDLGNBVjZCZ0gsR0FLOUJoSCxNQUlFbTNCO09BRkZnYixpQkFFRWhiO09BSEYrYTs7O09BUUcsNkJBVEhseUM7OztZQUNBa3lDOzBCQU5pQ0YsVUFLakNoeUMsTUFFQW15QztlQVNtRCxXQWhCUkY7O0dBZ0J3QjtZQUd2RTltQixNQUFNcGtCLEdBQUdDO0lBQ1gsb0JBSTJCLFNBQUk7SUFBZixPQXhCRStxQzthQW1CVmhyQyxHQUFHQyxZQUlPaEgsR0FBR20zQixPQUFTLGVBQVpuM0IsR0FBR20zQixRQUF3QjtHQUNiO1lBRzlCOUwsVUFBVXRrQixHQUFHQztJQUNmO0tBSTJCO0lBQXVEO0lBQWxFLE9BaENFK3FDO2FBMkJOaHJDLEdBQUdDLFlBSUdoSCxHQUFHbTNCLE9BQVMsV0FBWm4zQixHQUFHbTNCLE9BQWlCO0dBQzZDO1lBR2pGak0sU0FBU25rQixHQUFHQztJQUNkO0tBSTJCO0lBQXNEO3dCQUQxRG13QixPQUFTLE9BQVRBLE1BQWM7SUFDckIsT0F4Q0U0YTthQW1DUGhyQyxZQUdEL0csR0FBRzVKLEdBQUssa0JBSEo0USxHQUdENVEsR0FBUTtHQUU2RDtZQUdoRjBwQixLQUFLL1ksR0FBR0M7SUFBSSxvQkFBNkMsSUFBVTVRLGNBQU0sT0FBTkEsRUFBUTtJQUFwRCxVQXhCdkIrMEIsTUF3Qktwa0IsWUFBbUMvRyxHQUFHNUosR0FBSyxrQkFBeEM0USxHQUFtQzVRLEdBQVE7SUFBTTtHQUFrQjtZQUUzRXlwQixTQUFTOVksR0FBR0M7SUFDZCxJQUFJNkIsU0FETzlCO0lBRVgsU0FESThCLFFBRUM7SUFFSyxJQUFKN0ksWUFDQW15Qzs7UUFDRSw0QkFERkEsbUJBREFueUMsT0FKRjZJO01BT1ksSUFBUnN1QixRQVJHcHdCLE1BS0wvRztNQUNBbXlDLGlCQUdhLFdBVExuckMsR0FRTm13QjtNQUVKLDZCQUxFbjNCOzs7WUFDQW15Qzs7R0FNUztHQUlDLElBQVpwbkI7WUFERkMsYUFFZWprQixHQUFHQztJQUNaLFlBbEJONlksU0FpQmU5WSxHQUFHQztnQkFFUixrQ0FIUitqQjtRQUlLMzBCO0lBQUssT0FBTEE7R0FBTTtZQU1iazFCLFVBQVV2a0IsR0FBR0M7SUFDZixJQUFJNkIsU0FEUTlCO0lBRVosU0FESThCLFFBRUM7SUFFSyxJQUFKN0ksWUFDQW15Qzs7UUFDRSw0QkFERkEsbUJBREFueUMsT0FKRjZJO01BT1ksSUFBUnN1QixRQVJJcHdCLE1BS04vRztNQUNBbXlDLGlCQUdhLFdBVEpuckMsR0FLVGhILE1BR0VtM0I7TUFFSiw2QkFMRW4zQjs7O1lBQ0FteUM7O0dBTVM7R0FJQyxJQUFabG5CO1lBREZPLGNBRWdCemtCLEdBQUdDO0lBQ2IsWUFsQk5za0IsVUFpQmdCdmtCLEdBQUdDO2dCQUVULGtDQUhSaWtCO1FBSUs3MEI7SUFBSyxPQUFMQTtHQUFNO1lBTWIwOEIsMkJBQTJCL3JCLEdBQUcxSjtJQUNoQyxJQUFJaWMsSUFEeUJ2UztJQUU3QixRQURJdVMsR0FFQztJQUVVLElBQVR5TCxpQkFDQS9rQixZQUNBcTBCLFdBUHVCdHRCOztRQU12Qi9HLFFBTEZzWixVQUlFeUw7S0FJUSxJQUFOa25CLE1BVHFCbGxDLE1BTXZCL0c7S0FJQyxjQVZ5QjNDLE9BU3hCNHVDLEtBRkY1WDtNQUZBdFAsb0JBRUFzUCxTQUVFNFg7TUFIRmpzQyxPQUxGc1o7O1VBTUUrYSxVQUVFNFgsS0FPRiw2QkFWQWpzQzs7R0FZSTtZQUdSOHdCLE9BQU8vcEIsR0FBR0M7SUFDWixTQURTRCxjQUVKO0lBRUs7S0FBSnlILFFBSkd6SDtLQUtNLGtDQUxOQTtLQUlDOztTQUNSL0c7O01BREl3TyxPQUVHLFdBTkd4SCxHQUlOd0gsTUFKR3pILE1BS1AvRzs7Ozs7O0lBR0EsV0FKSXdPO0dBSUk7WUFHUnVpQixXQUFXaHFCLEdBQUdDO0lBQ1YsWUFaSjhwQixPQVdXL3BCLEdBQUdDO2dCQUVOO1FBQ0hzTztJQUFLLE9BQUxBO0dBQU07T0FHWDZRO1lBRUEyUyxtQkFBcUJsc0IsS0FBcUM3RjtJQUM1RCxHQUR1QjZGO1NBQWVDLE1BQWZELHVCQUFlQzs7U0FBZnVaO0lBQ3BCLEdBcmNEdkwsU0FvYzBEOVQ7S0FFdkQ7SUFDRyx5Q0FIZXFmLGNBQXFDcmY7SUFHdkQsd0JBSHVEQTtHQUdYO1lBRy9DZ3lCLGVBQWlCbnNCLEtBQXFDN0Y7SUFDeEQsR0FEbUI2RjtTQUFlQyxNQUFmRCx1QkFBZUM7O1NBQWZ1WjtJQUNuQixJQUFJLGNBUEYwUyx1QkFNaUIxUyxlQUFxQ3JmLEtBQ3BEO2VBQ0c7R0FBSTtZQUdUeXBCLElBQUlub0IsSUFBR0M7SUFDVCxPQURNRCxrQkFBR0M7O2tCQXRPUDhtQixTQXNPSS9tQixJQUFHQyxhQUM2RHVqQixJQUFHQyxJQUFNLFdBQVRELElBQUdDLElBQVk7R0FBRTtZQUdyRnlFLFFBQVFsb0IsSUFBR0M7SUFDYixPQURVRCxrQkFBR0M7Y0FFUjtjQTVPSDhtQixTQTBPUS9tQixJQUFHQyxhQUdldWpCLElBQUdDLElBQU0sV0FBVEQsSUFBR0MsSUFBWTtHQUFDO1lBRzFDOWlCLE1BQU1qQztJQUNSLElBQUl1UyxJQURJdlM7SUFFUixTQURJdVMsR0FFQztJQUVROzhCQUxMdlM7S0FLQzFRO0tBQUhEO0tBQ0FnOEMsT0FBTyxtQkFMVDk0QixHQUlFbGpCO0tBRUFpOEMsT0FBTyxtQkFOVC80QixHQUlLampCO0tBR00sa0NBUFhpakI7S0FNUzs7U0FDWHRaOztNQUNhO2tDQVRQK0csR0FRTi9HO09BQ1NnYjtPQUFIbUM7TUFDSixpQkFKRWkxQixNQUVKcHlDLFlBQ01tZDtNQUVKLGlCQUpFazFCLE1BQ0pyeUMsWUFDU2diO01BRFQ7Ozs7O0lBS0EsV0FQSW8zQixNQUNBQztHQU1PO1lBR1hDLFlBQVl2ckMsR0FBRzNKO0lBQ1IsSUFBTGlMLEtBQUssaUJBREt0QjtJQWpmWmtxQyxhQWtmRTVvQyxJQURhakw7SUFFakIsT0FESWlMO0dBRUY7WUFHQWtxQyxjQUFjeHJDLEdBQUdDO0lBQ25CO0tBQUlrTztPQUFPOztTQURLbk87a0JBQ1UvRyxHQUFFNUosR0FBSyxPQUFHLFdBRGpCNFEsR0FDT2hILEdBQUU1SixxQkFBc0Q7S0FDOUVvOEM7T0EzUkYzZDtTQTBSRTNmOztVQUVpQixtQkFFSDtjQUROOWU7VUFBSyxXQUFMQTtTQUNXO0tBRW5CcThDO09BaFNGNWQ7U0EwUkUzZjs7VUFPaUIsbUJBQ0o7Y0FDSjllO1VBQUssV0FBTEE7U0FBWTtJQUV6QixXQVZJbzhDLE9BS0FDO0dBS1M7WUFHWG5kLGFBQWF2dUIsR0FBR0M7SUFBSSxPQWZwQnVyQyxjQWVheHJDLFlBQStCL0csR0FBRzVKLEdBQUssa0JBQXBDNFEsR0FBK0I1USxHQUFRO0dBQUM7WUFDeERvOEIsS0FBS3pyQjtJQUFPLHNDQUFQQTtJQUFJLHdCQUFKQTtHQUFvQjtZQUl6QjJyQyxvQkFBb0IzckM7aUJBQ2UvRztLQUNuQyxHQUZvQitHLGdCQUNlL0csR0FDYjtLQUFvRCxzQ0FEdkNBO0tBQ1csNEJBRjFCK0csR0FDZS9HO0lBQzZDO0lBRGxEO0dBQ21EO1lBR2pGMnlDLFlBQVk1ckMsR0FBSSxPQUxoQjJyQyxvQkFLb0MsaUJBQXhCM3JDLElBQWdDO1lBRTVDdXhCLGtCQUFrQmp3QixJQUFHQztJQUN2QixLQTNnQkV1UyxTQTBnQmtCeFMsU0ExZ0JsQndTLFNBMGdCcUJ2UztLQUtyQjtNQURJdWhCLEtBSmN4aEI7TUFLZHloQixLQUxpQnhoQjtNQU1rQix1QkFObEJBO01BTVMsMkJBTlpEO01BTWR0QixJQUFJLG1CQUFZLDRCQUZoQjhpQixJQUNBQztNQUVBdGI7TUFDVSxrQ0FKVnFiO01BR0k7O1VBQ1Irb0I7O09BQ2dCLHNDQUpaOW9CLFFBSUY7Ozs7U0FDcUI7aUNBVkZ4aEIsSUFTbkJ1cUM7VUFDWSwyQkFWSXhxQyxJQVFsQnVxQztnQkFESXBrQztTQUdBLGlCQUpBekg7U0FLQSw2QkFKQXlIO1NBSUEsVUFGRnFrQzs7Ozs7T0FERjs7Ozs7S0FNQSxPQVJJOXJDOztJQUpEO0dBWUQ7WUFHRnN5QixVQUFVeVo7SUFDWixTQURZQSxlQUVQO0lBR2dCLElBRGZDLFFBSk1ELGVBS05FLHlCQUxNRjtJQU1QLE9BMVNIN3BDLE9Bb1NVNnBDLGFBTVcvckMsR0FBSyxPQUFMQSxpQkFEakJpc0MsY0FDdUM7OztjQUVqQzs7Z0JBSE5BO3lCQUcwQkM7aUJBQUssT0FBYzs7MEJBSjdDRjttQ0FJa0RHOzJCQUFLLHlDQVJqREosSUFRNENJLFdBQXhCRDs7MEJBQXVDO2dCQUFDO0dBQUc7WUFHekU3WSxjQUFjMFk7SUFDVixZQVpKelosVUFXY3laO2dCQUVOO1FBQ0hLO0lBQU8sT0FBUEE7R0FBVTtZQU1YQyxnQnpENzBCVDtZeUQ4MEJTdnFDLFl6RDkwQlQ7O3dEeUQ2MEJTdXFDLE9BQ0F2cUM7OztZQU1BcVgsY3pEcDFCVDtZeURzMUJTb2pCLFlBQWFwOUIsS0FBSWE7SUFDbkIsU0FEZWIsS0FFVjtJQUVLLE9BSlNhO0tBS0wsMEJBTENiLHNCQUFJYTtJQUlqQjtHQUNrQjs7SUFHbEJpUTs7bUNBUkFzc0IsYUFGQXBqQixVQVVBbEo7Ozs7OztZQUdKcEcsVUFBVTB1QixhQUFZdjRCO0lBQUksd0JBQUpBLEdBQVp1NEI7R0FBcUM7Ozs7T0EzMUIvQ2xpQztPQUNBcWE7T0FDQTVHO09BRUNGOzs7T0E2aEJEd1E7T0F6UUF0Rzs7O09Ba0ZBd0U7T0FDQUc7T0FvS0F2VztPQW9CQUs7T0F2TEE0VjtPQUNBQztPQWlSQVc7T0FFQUQ7O09BeldBRTtPQXVGQUw7T0FDQUU7T0E0ZUFoUDs7Ozs7O09BdGdCQTJnQzs7Ozs7Ozs7Ozs7O09BRUF2aUI7T0FrQ0EwQjtPQTFCQXhCO09Ba0NBeUI7OztPQWhCQUM7O09BakdBcWdCOztPQVVBdFk7T0FZQUM7T0FZQTNHO09BOEZBSDtPQUNBQztPQXFZQXVEO09BZkFpZDtPQTJCQWphO09BaUJBZTtPQVdBZTtPQS9VQW5GO09BREFKO09BZEFHO09BNEVBdko7T0FwQkFDO09BNUlBZ0o7T0FnSEF4SztPQUtBa0Y7T0FLQTlFO09BMERBRTtPQVZBRTtPQTNDQUk7T0FDQStGOztPQXpIQTJnQjtPQVVBeG5DO09BTUF5bkM7T0FxQkFDO09BY0FDO09BY0FDO09BTUFDO09BbUhBQztPQXlDQTVtQjtPQXlCQUY7T0F6Q0FHO09BUUFFO09BNENBQztPQWVBRTtPQVdBc0g7T0FxQkFoQztPQVdBQztPQU1BNUs7T0FRQTRTO09BTkFEO09BV0F0STtPQUlBRDtPQU1Bdm5CO09BZ0JBc3BDO09Bc0JBOWY7T0E3TUFuMUI7T0FzTkFzMUM7T0FMQUQ7Ozs7RXpEanlCTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1k0RFFLNEIsVTVEUkw7WTREU0tDLFc1RFRMO1k0RFVLQyxvQjVEVkw7O0k0RFdLQztJQUNBcHdDO0lBQ0F6TjtJQUNBRjtJQUNBQztJQUNBKzlDO0lBQ0EzOUM7SUFDQTQ5QztZQUNBQyxlNURuQkw7RzREbUJpQixJQUNaQztZQUNBMTVDLGlCNURyQkw7WTREdUJLK2EsU0FBTy9MLEdBQUVDO0lBRVgsR0FBRyxnQ0FGUUE7S0FHTixnQ0FISUQsR0FBRUM7SUFJSCxJQUFKa1csSUFKS25XLElBQUVDO0lBTVIsdUNBRkNrVztjQUVXLDRCQUZYQSxHQUpPbFc7Y0FJUGtXO0dBRXdCO09Ba0QxQncwQixrQ0FDQUM7WUFDQUMsT0FBTzUrQyxHQUFJLHVDQUFKQSxNQUFvQjtZQWEzQjYrQyx3QkFBd0JsdUM7SUFDMUIsT0FkRWl1QyxPQWF3Qmp1Qzs7Y0FHbEI7cUNBSGtCQTs7Z0JBTWxCO3VDQU5rQkE7c0JBT2hCLHlCQVBnQkE7O2tCQVFoQjtvQkFBZ0IseUJBQTBCLDZCQVIxQkE7R0FRaUM7WUFHekRtdUMsNEJBQTRCOStDO0lBQXFCLFVBWGpENitDLHdCQVc0QjcrQztJQUFxQjtHQUEyQjtZQUU1RSsrQyx3QkFBd0IvK0M7SUFDMUIsT0FBRywwQkFEdUJBO2NBRXJCLHlCQUZxQkE7Y0FHbEI7MERBQTBCLGVBSFJBO0dBRzJCO1lBR25EZy9DLFFBQVFDLEtBQUl0dUM7SUFDUixZQXBCSmt1Qyx3QkFtQllsdUM7O0lBSVosSUFESzNRLGNBQ0wsbUJBSlFpL0M7SUFLTixPQVhGRix3QkFXRSx1QkFGRy8rQztHQU1pQjtZQXdCdEJrL0Msb0JBQW9CeGtDO0lBQ00sSUFBeEJ5a0MsTUFBd0IsNEJBRE56a0M7SUFFUixPQW5DWnNrQyxtQkFtQ1ksYUFEVkc7R0FDcUI7WUFHdkJDLHFCQUFxQnAvQztJQU92Qjs7WUFDSTtjQUFDLHlCQVJrQkE7Y0FRVyx5QkFBeUIsNEJBUnBDQTtHQVE4QztZQUduRXEvQyxvQkFBb0Iza0M7SUFDdEI7S0FBSXlrQyxNQUF3Qiw0QkFETnprQztLQUVsQjRrQyxtQkFBbUIsNkJBQUcsYUFEdEJIO0lBR0QscUNBSm1CemtDO0tBWVIsR0F2Qlowa0MscUJBYUVFO01BVUY7S0FDQSxPQVhFQTs7SUFNSyxHQW5CUEYscUJBYUVFO0tBT1UsT0ExRFpOLGVBMERZLDRCQVBWTTtJQU1GO0dBS2lCO1lBT2pCalYsZ0JBQWlCMTVCLEdBQVl4USxLQUFLRDtJQUNwQyxPQUFHLGdDQURnQnlRLEdBQVl4UTs7Y0FDSCxnQ0FEUUQsS0FBakJ5USxLQUFpQnpRLE1BQWpCeVE7R0FDZ0M7T0FLL0MzUTtHQUNKLFNBSEV1L0MsSUFHRTN1QyxHQUFLLE9BQVQsNEJBQUlBLEdBREE1USxHQUNXOzs7Ozs7Ozs7Ozs7Ozs7OztPQXJMYmsrQztPQUNBQztPQUNBQztPQUNBQztPQUNBcHdDO09BQ0F6TjtPQUNBRjtPQUNBQztPQUNBKzlDO09BQ0EzOUM7T0FDQTQ5QztPQUNBQztPQUNBQztPQUNBMTVDO09BRUErYTtPQXdEQTQrQjtPQUNBQztPQUNBQztPQWFBQztPQVdBQztPQUVBQztPQU1BQztPQWlDQUU7T0FLQUU7T0FXQUM7T0FvQkFoVjtPQUlBa1Y7Ozs7Ozs7Ozs7Ozs7OztFNUQxTEw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7STZEdUNTdmtDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUE5QkZoVTtJQUVDcVA7SUFJQ21IOzs7Ozs7Ozs7O0dBQ0osU0FGR3hELEtBRUNoYSxHQUFLLGtCQURMd2QsTUFDQXhkLEdBQVc7O0lBR2JxaEI7SUFDQTVHO0lBQ0NGO1lBSURwSSxVQUFVeEIsR0FBSSxzQ0FBSkEsR0FBbUI7WUFFN0J5QixVQUFVL0Q7SUFDWiwyQ0FEWUE7Y0FFTCx3QkFGS0E7Y0FHTCwyQkFIS0E7R0FHOEI7Ozs7OztTQXJCeENySDtTQUVDcVA7U0FHQTJEO1NBS0RxSDtTQUNBNUc7U0FPQXJJO1NBRkFEO1NBY0U2STs7Ozs7Ozs7Ozs7O1lBR0pELEdBQUczTSxLQUFJK1IsR0FBSSxzQ0FBUi9SLFVBQUkrUixHQUFrQztZQU96QzNGLGlCQUFvQixTQUFFO0dBQ2hCOztJQUFOSSxNQUFNO1lBRU40a0Msb0JBQWUscUNBRUw7WUFHVkMsb0JBQWUscUNBRUw7WUFHVkMsZ0JBQVcscUNBRUQ7WUFHVkM7SUFBZ0I7Ozs7OztHQUVOO1lBR1ZDLGdCQUFXLG9DQUVEO1lBR1ZDO0lBQVc7Ozs7OztHQUVEO1lBS1ZDO0lBQWM7Ozs7OztHQUVKO1lBR1ZDLGlCQUFpQnB2QztJQUFJLElBQVcsOEJBQVgseUJBQUpBO0lBQWU7R0FBVTtZQUUxQ3F2QyxjQUFjcnZDO0lBQ2hCLE9BcEJFaXZDLFNBbUJjanZDO2NBRmRvdkMsaUJBRWNwdkM7Y0FHWCwyQkFIV0E7R0FHd0M7WUFHdERzdkMsVUFBVXR2QyxHQUFJLE9BekJkaXZDLFNBeUJVanZDLFNBUlZvdkMsaUJBUVVwdkMsUUFBMEQ7WUFFcEV1dkM7SUFBZTs7Ozs7O0dBRUw7WUFHVkM7SUFBcUI7Ozs7OztHQUVYO1lBR1ZDO0lBQXFCOzs7Ozs7R0FFWDtZQUdWQyxrQkFDQTF2QztJQURvQixTQUNwQkE7OztPQUM4Qjs7UUFBWCx5QkFEbkJBO1FBQ21COzs7O2tCQURuQkE7TUFFOEI7O09BQVgseUJBRm5CQTtPQUVtQjs7OztpQkFGbkJBO0tBQThCLGtDQUFYLHlCQUFuQkE7S0FBOEI7O0lBT3pCOzZCQUFVLHdCQVBmQTtLQUtFOztHQUUyQjtZQUc3QjJ2QyxjQUFjM3ZDO0lBQUksT0ExQmxCdXZDLGFBMEJjdnZDLFNBWGQwdkMsa0JBV2MxdkM7R0FBK0Q7R0FFdEU7SUFDTDVMO0lBQ0ErYTtJQUNBRTtJQUNBa2M7SUFDQTMyQjtJQUNBQztJQU5LLFFBQ0xULFFBQ0ErYSxVQUNBRSxVQUNBa2MsVUFDQTMyQixVQUNBQztJQU9FKzZDO0lBQ0F6Z0I7SUFDQ087WUFJRHI0QixVQUFRdzRDLElBQUdDO0lBQUssSUFBdUIsNEJBQTVCQSxLQUFhLDRCQUFoQkQ7SUFBK0I7R0FBYztZQUNyREUsY0FBWTlwQyxPQUFNakc7SUFBeUIsZ0NBQXpCQTtJQUF5QixvQ0FBL0JpRztHQUE0QztZQUN4RCtwQyxPQUFLaHdDLEdBQUksb0NBRFQrdkMsZUFDSy92QyxHQUEwQjs7b0RBRi9CM0ksV0FMQTgzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EzRkpsbEI7T0E3QkdMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXFCSFE7O09BT0FQOzs7Ozs7Ozs7T0F1QkFvbEM7T0FwQkFKO09BS0FDO09Bb0JBSTtPQU9BQztPQXRCQUo7T0FLQUM7T0E4QkFNO09BTkFEO09BUUFFO09BS0FDO09BS0FDO09BZ0JBRTtPQVhBRDs7OztRQWlDSUs7UUFDQUM7UUFSQUo7UUFDQXpnQjtRQUNDTzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFN0Q5SVY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WStEWUt1Z0IsY0FBZUMsUUFBUUM7SUFDekIsSUFlMkJDLFNBZmQsaUNBQ2JDOzsyQkFjMkJELFFBZDNCQyxLQUM0QiwwQkFENUJBOzs7S0FHYTs7OztnQ0FMSUg7Z0NBQVFDOzs7TUFLekI7Ozs7T0FDYztRQUFSSTtVQUFRLGlEQU5HTCxRQUtqQkk7O1NBVzJCRixRQVZyQkcsZ0NBTm1CSixhQUt6Qkc7Ozs7OztLQU1NO01BRkZFOztVQVRxQkw7TUFXbkI7OztnQ0FYV0Q7VUFVakIsc0JBVnlCQztrQ0FBUkQ7O1VBVWpCbGlCOztPQUdjO1FBQVJ5aUIsUUFBUSxpREFiR1AsUUFVakJsaUI7NkJBTTJCb2lCLFFBSHJCSyxPQUpGRDtPQUVFLFVBRE54aUI7Ozs7O0tBY21CO01BQWYwaUIsZUFBZSx3QkF4QkZSOzs4QkFnQlVFLFFBU2MsMEJBRHJDTTtLQUNELG9DQURDQTtVQVI4QnozQztNQUNoQztrQkFEZ0NBOzs7UUFHaUIsb0NBSGpCQTtRQUd4QixxREFIaUJtM0MsUUFBT24zQyxVQUszQixJQUwyQjZMOzs7T0FVL0IsVUFFRTs7OztLQURBLFdBQUssNEJBWGlCc3JDOztHQVlsQjsyQkE1QlBIOzs7RS9EWkw7Ozs7Ozs7WWdFS0tVLFdoRUxMO1lnRU1LQyxhaEVOTDt5QmdFS0tELE9BQ0FDOzs7RWhFTkw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SWlFUUtqekM7SUFDQWs2QjtJQUNBOFk7SUFLR2pyQztJQUlDbUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FDSixTQUZHeEQsS0FFQ2hhLEdBQUssa0JBREx3ZCxNQUNBeGQsR0FBVztHQVNhO0lBTjFCcWhCO0lBQ0E1RztJQUNDRjtJQUlEb3hCLGVBWEMzeEIsZUFNRFM7OztZQWNGRCxpQkFBb0IsU0FBRTtZQU10QmhLLElBQUlxYixLQUFLVCxLQUFLdGI7SUFDaEIsU0FEV3NiLE9BQUt0Yiw4QkFBVitiLE1BRUQsT0FGQ0E7SUFJSjt5Q0FKU1QsS0FBS3RiLDJCQUFWK2I7YUFBVS9iLEtBTVQ7SUFFTyxJQUFOOGIsTUFBTSwyQkFSRTliO0lBU1oseUJBVEUrYixLQUFLVCxLQVFIUSxRQVJROWI7SUFTWixtQ0FESThiO0dBRTREO1lBR2xFcWhCLEtBQU96MkIsS0FBVTFHLEtBQUkrYjtJQUN2QixHQURTclYsU0FBTUMsTUFBTkQsY0FBTUMsY0FBTjJVO0lBQ1QsR0FEbUJ0YjtTQU1QbEcsSUFOT2tHLFFBTVAyRjs7ZUFDRyxrREFQUW9XLE1BQWRUO0lBT00sT0FwQmI1YSxJQWFxQnFiLEtBQWRULEtBTUczVjtHQUNvQjtZQVE5QityQyxTQUFXaHJDLEtBQVUxRyxLQUFJYSxHQUFFaWM7SUFDN0IsR0FEYXBXLFNBQU1DLE1BQU5ELFFBTFlpckMsUUFLTmhyQyxjQUxNZ3JDO0lBTXpCO0tBQUlwMkIsZUFBSixzQkFEMkIxYTtLQUVTLG1DQURoQzBhLGNBTnFCbzJCO0tBT3JCaDJCLFFBQU0sNEJBRmEzYjtJQUd2Qiw4Q0FSeUIyeEMsT0FPckJoMkIsT0FEQUo7SUFHeUIsSUFUQ3EyQixNQVNELDRCQVRKRCxPQU9yQmgyQixRQVBxQkw7SUFDekI7Z0JBRHlCQSxNQUFLczJCOztNQUUxQjs7MERBR3VCL3dDLEdBTEZ5YSxNQUtJd0I7TUFIekI7T0FBNkQsSUFGeENtZixRQUV3Qyw0QkFGeEMzZ0I7Ozs7Ozs7S0FFckI7O0dBT3lDO1lBRzNDM0csU0FBUzlULEdBQUksbUNBQUpBLFdBQWdCO1lBRXJCZ3hDLHdCQUF3QjNiLFFBQVE1YSxLQUFLdGIsS0FBSzZrQixXQUFVL0g7SUFDMUQsSUFEc0NtZjtJQUN0QztRQUQyQ2o4QixPQUFMaThCLE9BRWpDLGtDQUYyQ3BYO0tBR3hDOzsrQ0FIc0JxUixRQUFRK0YsUUFBb0JuZjtNQUlyRCxPQUppQ21mO0tBS0csSUFMSDBWLFFBS0csNEJBTEgxVjs7R0FLaUM7WUFHckU2VixtQkFBbUJqeEMsR0FBR2drQixXQUFVL0g7SUFDbEMsT0FUTSswQjthQVFlaHhDLGdDQUFHZ2tCLFdBQVUvSDtHQUM4QjtHQUloRCxJQUFaK0g7WUFERmt0QixVQUVZbHhDLEdBQUVpYztJQUFPLE9BTnJCZzFCLG1CQU1ZanhDLEdBRFZna0IsV0FDWS9IO0dBQTJDO0dBTTNDLElBQVppSTtZQURGaXRCLGVBRWlCbnhDLEdBQUV5YSxLQUFJd0I7SUFDdkIsSUFBSTljLDRCQURhYTtZQUFFeWEsT0FDZnRiLE9BRGVzYjtLQUlkLE9BekJEdTJCLHdCQXFCYWh4QyxHQUFFeWEsS0FDZnRiLEtBRkYra0IsYUFDcUJqSTtJQUdsQjtHQUNtRDtZQU1wRG0xQix5QkFBeUIvYixRQUFRNWEsS0FBS3RiLEtBQUs2a0IsV0FBVS9IO0lBQzNELElBRHVDbWY7SUFDdkM7WUFEdUNBLE9BRWxDLGtDQUY0Q3BYO0tBR3pDOzsrQ0FIdUJxUixRQUFRK0YsUUFBb0JuZjtNQUl0RCxPQUprQ21mO0tBS0csSUFMSDBWLFFBS0csNEJBTEgxVjs7R0FLaUM7WUFHdEVpVyxvQkFBb0JyeEMsR0FBR2drQixXQUFVL0g7SUFDbkMsSUFBSTljLDRCQURrQmE7SUFFdEIsT0FWTW94QzthQVFnQnB4QyxHQUVVLDRCQUQ1QmIsY0FEcUI2a0IsV0FBVS9IO0dBRTJCO0dBSTlDLElBQVpvSTtZQURGaXRCLFdBRWF0eEMsR0FBRWljO0lBQU8sT0FQdEJvMUIsb0JBT2FyeEMsR0FEWHFrQixhQUNhcEk7R0FBNEM7R0FNN0MsSUFBWnVJO1lBREYrc0IsZ0JBRWtCdnhDLEdBQUV5YSxLQUFJd0I7SUFDeEIsSUFBSTljLDRCQURjYTthQUFFeWEsT0FDaEJ0YixNQURnQnNiO0tBSWYsT0ExQkQyMkIseUJBc0JjcHhDLEdBQUV5YSxLQUNoQnRiLEtBRkZxbEIsYUFDc0J2STtJQUduQjtHQUNvRDtZQU16RHcwQixNQUFNendDLEdBQUVpYztJQUNWLElBQUksZUFwREZpMUIsVUFtRE1seEMsR0FBRWljLFVBQ047Ozs7O0tBQ2dDOztHQUFJO1lBR3RDdTFCLE9BQU94eEMsR0FBRWljO0lBQ1gsSUFBSSxlQXpCRnExQixXQXdCT3R4QyxHQUFFaWMsVUFDUDs7Ozs7S0FDZ0M7O0dBQUk7WUFHdEN3MUIsV0FBV3p4QyxHQUFFeWEsS0FBSXdCO0lBQ25CLElBQUksZUF2REZrMUIsZUFzRFdueEMsR0FBRXlhLEtBQUl3QixVQUNmOzs7OztLQUNnQzs7R0FBSTtZQUd0Q3kxQixZQUFZMXhDLEdBQUV5YSxLQUFJd0I7SUFDcEIsSUFBSSxlQTVCRnMxQixnQkEyQll2eEMsR0FBRXlhLEtBQUl3QixVQUNoQjs7Ozs7S0FDZ0M7O0dBQUk7WUFVcENyUTs7S0FBcUIrbEM7S0FBVEM7Ozt5QkFHb0IsNkJBSFhEOztJQUN2Qjs7OEJBQzJCLDZCQUZiQzs7O1lBT1pBLFFBQVE1eEMsR0FBSSxPQUFKQSxLQUFhO1lBQ3JCMnhDLGVBQWUzeEMsR0FBSSxPQUFKQSxLQUFvQjtZQUtuQzZ4QztJQUFtQkMsZUFBZUMsZ0JBQWdCSCxTQUFTSSxXQUFXQztJQUNwRCxJQUFoQkMsc0JBRGlCSjs7S0FJWjtXQUhMSTs7O1FBR0s7VUFKK0REO1VBQXBDRjtpQ0FBZ0JILFNBQ2hETTs7T0FEeURGLGNBTWYsNEJBTDFDRTs7O0tBT0Q7O1NBUnFFRDtTQUFwQ0Y7Z0NBQWdCSCxTQUNoRE07MkJBUWtCLDRCQVJsQkE7OztHQVNVO1lBR1pDLGVBQWdCUjtJQUNsQixPQURrQkE7R0FHWTtZQU01Qnp5QyxPQUFPMHlDLFNBQVNEO0lBQ2xCO0tBQUlwL0IsMEJBREtxL0I7S0FFTEksWUFBWSwyQkFEWnovQjs7S0FJZSxJQUFiMC9CLGFBZEpFLGVBU2dCUjtLQUVkSztLQUtrQjtNQUFoQkY7TUFDUyxtQ0FQWHYvQjtNQU1rQjs7VUFDcEJ0Wjs7T0FESTY0QztRQTdCSkQ7VUE2QklDO2lDQVBHRixTQVFQMzRDO1VBUk8yNEM7VUFFTEk7VUFHRUM7T0FIRkQsY0FNRi80QyxLQURJNjRDO09BQ0o7Ozs7OztJQVVGLFdBbEJTRixTQUFTRCxnQkFFZEs7R0FnQmtDO1lBS3BDSSxlQUFpQnZzQztJakVyT3hCLEdpRXFPd0JBLFNBQU1DLE1BQU5ELGNBQU1DLGNBQU4yVTtRQUFvQ3UzQixzQkFBaEJMLDJCQUFUQztvQkFBMENTO0tBQ3hFO1lBRG1CNTNCOztRQUNDOztnQ0FEb0Q0M0I7Z0NBQTFDVDtXQUFYbjNCO01BSUE7T0FBYnczQixhQXBDSkUsZUFnQ3FDUjtPQUtqQ2x4QyxRQUxhZ2E7T0FNYnEzQjtPQUNBbGlCLElBQUosc0JBUDRCZ2lCO09BUXhCci9CLElBQUosc0JBUnNFOC9COztVQUtsRTV4QyxPQUdBOFIsS0FGQXUvQixtQkFDQWxpQjtZQUdFbWlCLHdDQVZnRU0sTUFLbEU1eEM7UUFDQXF4QztTQW5ESkQ7V0FtRElDLGtCQUlFQyxnQkFWc0JILFNBQXlCSSxXQUlqREM7UUFDQXh4QyxPQWFHLDRCQWJIQTs7O2NBQ0FxeEMscUJBQ0FsaUI7aUJBYXVCLDRCQWZ2Qm52QixNQUVBbXZCOzs7O0tBTEQsVUFrQnVDOztZQUcxQzBpQixRQUFRdHlDLEdBQUVxTDtJQUFNLHVCQXZCaEIrbUMsa0JBdUJRcHlDLElBQUVxTDtHQUFvQztZQUU5Q2tsQyxRQUFPOTFCLEtBQUl6YSxHQUFHdXlDO0lBQ1IsSUFBSnBvQyxJQUFJLFdBMUJOaW9DLGVBeUJPMzNCLEtBQUl6YSxJQUFHdXlDO0lBRWhCLFlBRElwb0M7R0FDMEI7WUFHNUJxb0MsWUFBVy8zQixLQUFJemEsR0FBR3V5QztJQUNaLElBQUpwb0MsSUFBSSxXQS9CTmlvQyxlQThCVzMzQixLQUFJemEsSUFBR3V5QztJQUVwQixRQURJcG9DLEdBRUMsT0FGREE7SUFLb0Msa0NBQWUsNkJBTnRDbks7SUFNYjthQWhRSjYzQixTQWdRSTtHQUE4RTtZQUdoRjRhLGlCQUFrREMsYUFBaUJMO1FBQTlCTCxzQkFBaEJMLDJCQUFUQzthQUNkLHNCQURjQTtLQUVUOztNQUFVLDREQUZzRFM7S0FFakM7O0lBRWpCO0tBQWJKLGFBM0VKRSxlQXVFcUJSO0tBS2pCRztLQUNBbGlCLElBQUosc0JBTllnaUI7S0FPUnIvQixJQUFKLHNCQVBtRTgvQjtLQVEvRGxIO0tBQVE7T0FEUjU0QjtTQUVKOVI7O1NBSklxeEMscUJBQ0FsaUI7a0JBRUF1YjtzQkFJUyw0QkFIYjFxQyxHQUhJbXZCO09BREFraUI7UUFMOENZLGNBQWJWLGNBZXFCLDRCQVR0RHBpQjs7U0FHSm52QixJQUZJOFI7V0FZSXcvQix3Q0FuQjJETSxNQVNuRTV4QztPQUpJcXhDO1FBekZKRDtVQXlGSUMsa0JBY0lDLGdCQW5CSUgsU0FBeUJJLFdBSWpDQzs7TUFLSjtTQUZJMS9CLE1BRUo5Ujs7OztxQ0FESTBxQzs7WUF1Qkp3SCxjQUFlbDRCLEtBQUl6YSxHQUFPdEMsR0FBR2sxQztJQUN6QixZQTlDSnJDLFFBNkNlOTFCLEtBQUl6YSxHQUFPdEM7Z0JBRWxCLE9BRmtCQTtJQUkxQjtLQURLekU7S0FDRDQ1QyxRQUFKLHNCQUowQm4xQztLQUt0Qm8xQyw4QkFMZTl5QztLQU1mK3lDLFdBQUosc0JBTjZCSDtLQU9MLG1DQUhwQkMsT0FFQUU7S0FDbUIseUNBRm5CRDtLQUVBNzNCLE1BQU07SUFDViwyQkFSMEJ2ZCxNQU90QnVkLFFBSkNoaUI7SUFNTCwyQkFUNkIyNUMsV0FPekIzM0IsS0FKQ2hpQixHQUdEODVDO0lBU0k7d0NBWEpGLE9BREM1NUM7S0FZRSx5Q0FWSDY1QztLQVNPLG1DQVhONzVDLEdBR0Q4NUM7S0FNTyxtQ0FUTjk1QyxHQUVENjVDO0lBS0osMkJBVjBCcDFDLFNBT3RCdWQ7SUFHSixtQ0FISUE7R0FTMEQ7WUFJOUQrM0IsWUFBWWh6QyxHQUFPdEMsR0FBR2sxQztJQUNWLElBQVZOLFVBcERGRyxVQW1EWXp5QyxNQUFPdEM7SUFFckIsS0FESTQwQyxTQUVJLE9BSGE1MEM7SUFPbkI7S0FGSW0xQyw4QkFMZW4xQztLQU1mbzFDLDhCQU5ROXlDO0tBT1IreUMsV0FBSixzQkFQc0JIO0tBUWxCSyxjQUFjLHlCQVBoQlg7S0FRK0IsbUNBRjdCUyxVQURBRDtLQUc0Qix5Q0FENUJHO0tBQ21CLG1DQUpuQko7S0FJQTUzQixNQUFNO0tBQ05pNEI7S0FDQUM7a0JBQ3NCbDZDO0tBQ2QsSUFBTmtHLE1BQU0sNEJBRGNsRyxHQUR0Qms2QztLQUdGLDJCQWRpQnoxQyxHQVdmeTFDLGlCQUZBbDRCLEtBQ0FpNEIsaUJBR0UvekM7S0FNTyx1Q0FUVCt6QyxpQkFHRS96QztLQUVKLDJCQWZvQnl6QyxXQVNsQjMzQixXQUZBODNCO0tBY2MsdUNBWGRHLGlCQUdFL3pDO0tBSEYrekMsa0JBV2Msa0NBZGRIO0tBZWMsdUNBWGRJLGlCQUVFaDBDO0tBRkZnMEMsa0JBV2Msa0NBaEJkTDs7SUFnQnlDO0lBVjdDLHlCQVhFUjtJQTJCSyx1Q0F2QkhPLE9BTUFNO0lBWUosMkJBdkJtQnoxQyxHQVdmeTFDLGlCQUZBbDRCLEtBQ0FpNEI7SUFhSixtQ0FkSWo0QjtHQW9CMEQ7WUFHOURtNEIsU0FBU3B6QyxHQUFFdEM7SUFDYjtLQUFJMjFDLG9DQURPcnpDO0tBRVBzeUMsVUFyRkZHLFVBbUZTenlDLE1BQUV0QztrQkFNSHpFLEdBQUV3SDtLQUFLO01BQW1DLG1DQUF4Q0EsR0FBRnhIO01BQXlDLHlDQUwvQ282QztLQUsrQyxPQXpUbkR4ekMsSUFtVGFuQyxHQU1lLDRCQUFsQnpFLEdBTE5vNkM7SUFLb0U7SUFEdEU7O29DQUhFZixtQ0FGUzUwQztLQUlYLFdBQUMsNkJBSEMyMUMsY0FDQWY7SUFJQztHQUFvRTtZQWFyRWg4QyxNQUNHZzlDLE9BQVFDO0lBQ1YsR0FBRyxvQ0FEREQsT0FBUUMsUUFFTDtJQUdELHdDQUxGRCxVQUFRQztJQUtOO0tBRUcsd0NBUExELFVBQVFDO0tBT0g7O21EQVBMRCxVQUFRQzs7Ozs7SUFPSDtHQUM0RDtZQUlwRXBrQjtJQUNEO0tBRWtCcWtCO0tBREtDO0tBRFBDO0tBTVRDLFVBQVksK0NBSkRIO0tBR2JJLGdDQUNFRDtLQUlBRSxVQUFZLDZCQVRJSjtLQVFsQkssa0NBQ0VELGVBTEZEO0tBVUVHLFVBQVksNkJBZkhMO0tBY1hNLGtDQUNFRCxlQU5GRDtJQVNKLFdBSklFO0dBSXlCO1lBTTdCQyxxQmpFeFpUO0dpRXdXb0Isa0JBVVgzOUMsT0FhQTY0QixhQXlCQThrQjtZQVVKQyxpQkFBa0J2QyxnQkFBZ0JsM0IsS0FBSXphLEdBQUc0eEMsU0FDM0MsT0FyS0lyQixRQW9LZ0M5MUIsS0FwTmhDdmIsT0FvTnVDMHlDLFNBQXZCRCxpQkFBb0IzeEM7R0FDd0M7WUFHOUVtMEMscUJBQXNCeEMsZ0JBQWdCbDNCLEtBQUl6YSxHQUFHNHhDLFNBQy9DLE9BcEtJWSxZQW1Lb0MvM0IsS0F4TnBDdmIsT0F3TjJDMHlDLFNBQXZCRCxpQkFBb0IzeEM7R0FDd0M7WUFHbEZvMEMscUJBQXNCekMsZ0JBQWUzeEMsR0FBRzB5QyxhQUFhZCxTQUN2RCxPQS9KSWEsVUE5REF2ekMsT0E0Tm1EMHlDLFNBQS9CRCxpQkFBa0JlLGFBQUgxeUM7R0FJL0I7WUFHTnEwQyx5QkFBMEIxQyxnQkFBZ0JsM0IsS0FBSXphLEdBQUc0eEM7SUFDakIsV0FwTzlCMXlDLE9BbU8rQzB5QyxTQUF2QkQ7SUFDNUIsc0JqRWxiSCxPaUUyU09nQixjQXNJd0NsNEIsV0FBSXphO0dBQ3dDO1lBR3RGczBDLHVCQUF3QjNDLGdCQUFlM3hDLEdBQUc0eEM7SUFDakIsV0F4T3ZCMXlDLE9BdU93QzB5QyxTQUFsQkQ7SUFDMUIsc0JqRXRiSCxPaUUrVE9xQixrQkFzSHFDaHpDO0dBQ3dDO1lBRy9FdTBDLGlCQUFrQjVDLGdCQUFlM3hDLEdBQUd3MEM7SUFDdkIsV0F4QmJOLGlCQXVCa0J2QyxtQkFBZTN4QyxHQUFHdzBDO0lBQ3ZCO0dBQXVEOztHQUdyRCxTQUFmQztJakU3YkwsT2lFa2FLUDs7R0EyQmU7R0FDSSxTQUFuQlE7SWpFOWJMLE9pRXNhS1A7O0dBd0JtQjtHQUNBLFNBQW5CUTtJakUvYkwsT2lFMGFLUDs7R0FxQm1CO0dBQ0ksU0FBdkJRO0lqRWhjTCxPaUVpYktQOztHQWV1QjtHQUNGLFNBQXJCUTtJakVqY0wsT2lFcWJLUDs7R0FZcUI7R0FDTixTQUFmUTtJakVsY0wsT2lFeWJLUDs7WUFXQVEsb0JBUUUxcEMsS0FBUzJwQyxXQUFtQm4xQyxLQUFLb3lDO0lBQ25DO0tBQUlnRCxnQ0FERjVwQztLQVBzQzZwQyxVQVN4QyxzQkFGOEJyMUM7WUFBbkJtMUM7cUJBQ1BDLFVBRE9EO2FBS1QsV0F6Y0ZyM0MsbUJBb2NXcTNDLFdBQ1BDO0lBU0o7d0NBVldELFdBUDZCRSxZQVFwQ0Q7ZUFTSjtRQWpCaUJFLFVBT05ILFdBUG9CSTtJQUMvQjtRQUQrQkEsWUFBU0YsU0FFbkM7S0FDRzs7O1NBSTJCakQ7Z0NBQWpDNW1DLEtBUGU4cEM7Z0NBT2F0MUMsS0FQQ3UxQztNQUsxQjtLQUQrQztNQUpyQkMsWUFJcUIsNEJBSnJCRDtNQUFkRSxZQUlPLDRCQUpQSDs7TUFBY0M7O0dBa0IyQjtZQUcxREcsY0FBY2xnQixRQUFRN0IsUUFBUXllO0lBQ2hDO0tBQUl1RCxtQ0FEWW5nQjtLQUVaM0IsYUFBSixzQkFGd0JGO1lBRXBCRSxjQURBOGhCOztjQXZCRlQ7ZUFzQmMxZjtlQU1OLDRCQUxObWdCLFlBQ0E5aEI7ZUFGb0JGO2VBQVF5ZTs7R0FRaEI7WUFHZHdELGNBQWNwZ0IsUUFBUTFKLFFBQVFzbUI7SUFDaEM7S0FBSXVELG1DQURZbmdCO0tBRVpxZ0IsYUFBSixzQkFGd0IvcEI7WUFFcEIrcEIsY0FEQUY7a0JBbENGVCxvQkFpQ2MxZixXQUFRMUosUUFBUXNtQjtHQUlrQzs7SUFPNUR2akI7SUFDQWluQjtJQUNDam1CO1lBa0JEcjRCLFVBWnVCdStDLFNBQWVDO0lBYXhDLEdBQUcsNkJBYnNCRCxTQUFlQyxVQWNuQzs7S0FkNENDLDZCQUFURDtLQUFORSw2QkFBVEg7S0FBTG43QjtJQUNwQjtRQURvQkEsUUFBY3M3QixhQUFkdDdCLFFBQTZCcTdCO1FBQTdCcjdCLFFBQTZCcTdCLE1BSTVDO0tBTjREO01BQXRDaEcsNEJBRWErRixTQUFwQnA3QjtNQUZJbzFCLDRCQUVDK0YsU0FBTG43QjtNQUY2QyxpQ0FBdENxMUI7TUFBa0IsaUNBQXJCRDtNQVFsQnJnQyxJQVIyRDtLQVMvRCxTQURJQSxHQUdHLE9BSEhBO0tBRXFCLElBUlA0ckIsUUFRTyw0QkFSUDNnQjs7R0FxQmE7WUFHL0JsSCxjQUFZdE4sT0FBTWpHO0lBQ3BCO0tBQUliLDRCQURnQmE7S0FFaEJvZ0MsY0FBWSw2QkFGRm42QixPQUNWOUc7S0FFVyxtQ0FGWEE7S0FDUTs7U0FDWnNiOztNQUNpQyw0REFKYnphLEdBR3BCeWE7TUFESTJsQixhQUVPLDZCQUZQQTtNQUNKOzs7OztXQURJQTtHQUlFO1lBR0o1c0IsT0FBS3hULEdBQUksb0NBVFR1VCxlQVNLdlQsR0FBMEI7WUFDL0J1ekIsVUFBVTcxQixHQUFHODFCO0lBQVMsT0FoRTFCK2hCLGNBZ0VjNzNDLEdBQUc4MUI7R0FBZ0U7WUFDN0U5SCxVQUFVaHVCLEdBQUdpdUI7SUFBUyxPQXREMUI4cEIsY0FzRGMvM0MsR0FBR2l1QjtHQUFnRTs7R0FDOUQsU0FBZnFxQjtJakU1aEJULE9pRWthSzlCOztHQTBIbUI7R0FDSSxTQUFuQitCO0lqRTdoQlQsT2lFc2FLOUI7O0dBdUh1QjtHQUNBLFNBQW5CK0I7SWpFOWhCVCxPaUUwYUs5Qjs7R0FvSHVCO0dBQ0ksU0FBdkIrQjtJakUvaEJULE9pRWliSzlCOztHQThHMkI7R0FDRixTQUFyQitCO0lqRWhpQlQsT2lFcWJLOUI7O0dBMkd5QjtHQUNOLFNBQWYrQjtJakVqaUJULE9pRXliSzlCOzs7WUF5R0krQjtJQUFrQjs7TWpFbGlCM0IsT2lFb2NLdkI7OztvREFnRUkxOUMsV0FuQkFzK0M7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBd0RKbDBDLGdCakV6aUJMO1lpRTBpQktELGdCakUxaUJMO1lpRTRpQks5QixLQUFLNlMsR0FBR3RTO0lBQ1YsR0FET3NTLE9BQ08sV0FyaUJaNVUsbUJBb2lCSzRVO0lBRUM7S0FBSnZTLElBQUksMkJBRkR1UztLQUdNLG1DQUhOQTtLQUVDOztTQUNSdFo7O01BQ0UsZUFGRStHLEdBQ0ovRyxHQUNnQixXQUpOZ0gsR0FHVmhIO01BQ0UsV0FERkE7Ozs7O0lBR0EsbUNBSkkrRztHQUl3RDtZQUcxREYsUUFBUXBDO0lBQ1Y7S0FBaUJzd0IsTUFDVCxrREFGRXR3QjtLQUNHNmE7S0FBSXRmO0lBQUk7WUFBSkEsR0FBa0IsT0FBdEJzZjtLQUFtRDtNQUEvQ3pULE1BQStDLDRCQUEvQzdMO01BQUpveEIsWUFBcUMsZ0JBRHhDM3NCLEdBQ096RSxJQUFKc2Y7O01BQUl0Zjs7R0FDSztZQUdwQjhuQyxZQUFZcmpDO0lBQ2QsSUFBSXlCLDRCQURVekIsSUFFRDZhLFNBQUl0ZjtJQUFJO1FBQUpBLE1BRGJrRyxLQUNpQyxPQUF4Qm9aO0tBQXFEO01BQWpEelQsTUFBaUQsNEJBQWpEN0w7TUFBSm94QixZQUF1QyxnQkFGdEMzc0IsR0FFR3pFLElBQUpzZjs7TUFBSXRmOztHQUNSO1lBR1BnSyxJQUFJakQ7SUFDTjtLQUFJYiw0QkFERWE7S0FFRmtELE1BQU0sMkJBRE4vRDtLQUVTLG1DQUZUQTtLQUNNOztTQUNWbEc7O01BQ2tDLHVDQUg5QmtHOztRQUNBK0Q7UUFDSmpLOytCQUhNK0csR0FJMkIsa0NBRGpDL0c7Ozs7OztJQUdBLG1DQUpJaUs7R0FJMEQ7R0FNOUMsSUFBWmd0QjtZQURGcW1CLFlBRWNDLE1BQVNDO0lBQ3ZCO0tBQUloOEIsTUFyZkp3MkIsbUJBb2ZjdUYsTUFEWnRtQixhQUNxQnVtQjtLQUVpQyx5REFGMUNELE9BQ1YvN0I7S0FDbUQ7S0FBN0IsT0FuaUIxQjVhLElBaWlCYzIyQyxNQUUwQiw0QkFEcEMvN0I7SUFDSixXQW5pQkE1YSxJQWlpQmMyMkMsU0FDVi83QjtHQUMwRTtHQU9oRSxJQUFaaThCO1lBREZDLFlBRWNILE1BQVNDO0lBQ3ZCO0tBQUloOEIsTUFoZUo0MkIsb0JBK2RjbUYsTUFEWkUsYUFDcUJEO0tBRWlDLHlEQUYxQ0QsT0FDVi83QjtLQUNtRDtLQUE3QixPQTdpQjFCNWEsSUEyaUJjMjJDLE1BRTBCLDRCQURwQy83QjtJQUNKLFdBN2lCQTVhLElBMmlCYzIyQyxTQUNWLzdCO0dBQzBFO1lBTTlFbThCLFFBQVFKLE1BQU1LO0lBQ2hCLElBQUksZUFyQkZOLFlBb0JRQyxNQUFNSyxNQUNaOzs7OztLQUNnQzs7R0FBSTtZQUd0Q0MsUUFBUU4sTUFBTUs7SUFDaEIsSUFBSSxlQWhCRkYsWUFlUUgsTUFBTUssTUFDWjs7Ozs7S0FDZ0M7O0dBQUk7WUFHbENFLGNBQWMvekMsR0FBR3dNO0lBQ3ZCLElBRG9CcWQ7SUFDcEI7VUFEb0JBLEtBRVo7S0FDTSxJQUhNL0ssYUFHbEJELEtBSGtCZ0wsUUFHTixpQ0FBWmhMLElBSHFCclM7S0FHVDtTQUhNcWQ7O0dBRytCO1lBR2pEbXFCLFVBQVUzckMsS0FBS3dyQztJQUNqQixnQkFEaUJBO1NBSUY3ekMsSUFKRTZ6QyxPQUNiSSxvQkFHb0J6bkMsR0FBSyxPQVZ2QnVuQyxjQVVTL3pDLEdBQVN3TSxHQUFzQjs7O01BRHBDQSxJQUhPcW5DO01BQ2JJLG9CQUVnQnQwQixLQUFLLE9BQVQsMEJBQUlBLEtBQVZuVCxHQUE4QjtJQUd4QztLQUNpQjBuQyxXQURqQixzQkFOWTdyQztLQU9jeWxDLFFBVWQsNEJBVktvRztLQUFKMytCO0tBQUk0K0I7S0FBU0M7SUFDeEI7ZUFEd0JBLFlBRW5CLFdBNWtCTHYzQyxJQW1rQlV3TCxRQU9LOHJDLGFBQUo1K0I7S0FHSCxHQVROMCtCLFNBU2UsZ0JBVlA1ckMsS0FPYytyQztNQUtYO09BQVBDLE9BQU8sNEJBTFdEO09BTWxCRSxVQWhsQk56M0MsSUFta0JVd0wsS0FZSmdzQyxNQUNpQyw0QkFOeEJGLFlBS1RFO09BTGtCNThCLE1BT0ksNEJBUEoyOEI7T0FBYi9zQixZQU1MaXRCLFNBTksvK0I7O09BQUk0K0IsYUFBU0M7Ozs7S0FRRDtNQVJDaGMsUUFRRCw0QkFSQ2djOzs7R0FVTDtZQUduQkcsTUFBTWxzQyxLQUFLd3JDLElBQUssT0FwQmhCRyxVQW9CTTNyQyxzQkFBS3dyQyxLQUFpQztZQUM1Q1csZUFBZW5zQyxLQUFRb3NDO0lBQVEsT0FyQi9CVCxVQXFCZTNyQyxvQkFBUW9zQztHQUE0QztZQUdqRUMsbUJBQW9CMTNDLEdBQUd5YSxLQUFLazlCO0lBQzlCO1dBRHlCbDlCO0tBQ2UsMkJBRGxCemEsR0FDcUIsNEJBRGxCeWE7S0FDSTs7O0lBREpBLFNBQ2xCLDRCQURrQkE7SUFBS2s5QixTQUV2Qiw0QkFGa0JsOUI7O0dBRVY7WUFIZm05QixZQUtFNTNDO0lBQ0YsSUFBSXVTLDBCQURGdlM7SUFFRixTQURJdVMsR0FFQztJQUdPO0tBQU5rSSxVQUFVLDRCQUxabEk7S0FNRW9sQyxVQU5GcGxDO0tBT0VtVztLQUdVLHVCQVhkMW9CLEdBTUl5YTtJQUtELHdDQWZIaTlCLG1CQUlBMTNDLEdBTUl5YSxLQUNBazlCOztZQURBbDlCLG1CQUVBaU8sT0FhSixXQXBuQkY3b0IsSUErbEJFRyxNQU9JMjNDO0tBTWEsMkJBYmpCMzNDLEdBTUl5YTtLQU9DO01BQ0UsNkJBUkhBOzs7S0FXWSxJQUFSd0csUUFBUSw0QkFYWnhHLFlBWUEsT0FWQWlPOztVQXZtQk43b0IsSUErbEJFRyxHQWlCUWloQixPQUN3Qiw0QkFYNUIwMkIsUUFVSTEyQjtLQXJCUnkyQixtQkFJQTEzQyxHQU1JeWEsS0FDQWs5Qjs7R0FjMEI7WUFHaENFLFlBQVVuNkMsR0FBRzgxQjtJQUFTLE9Bek10QitoQixjQXlNVTczQyxHQUFHODFCO0dBQXVEO1lBQ3BFc2tCLFlBQVVwNkMsR0FBR2l1QjtJQUFTLE9BL0x0QjhwQixjQStMVS8zQyxHQUFHaXVCO0dBQXVEO1lBRXBFb3NCLGtCQUFnQnI2QyxHQUFHK2MsS0FBSys1QjtJQUMxQixPQW5PRU8sb0JBa09nQnIzQyxHQUFHK2MsS0FBSys1QjtHQUNrQztZQUcxRHdELFdBQVdoNEMsR0FBRXVTLEdBQUdULE1BQU0ySSxLQUFLdGIsS0FBSzg0QztJQUNsQyxRQURlMWxDO0tBR1YsSUFDQyxXQWxvQkoxUyxJQThuQldHLEdBQVd5YSxLQUFLdGIsTUFJdkI7aUJBQ0csT0FMeUI4NEM7SUFFakIsOEJBRkNubUM7SUFFRDtHQUdDO1lBR2hCb21DLFlBQVlsNEMsR0FBRXVTO0lBQ2hCLE9BVEV5bEM7YUFRWWg0QzthQUFFdVM7OzthQUMrQixrREFEakN2UyxJQUFFdVM7O0dBQzBEO1lBR3hFNGxDLFlBQVluNEMsR0FBRXVTO0lBQ2hCLE9BYkV5bEM7YUFZWWg0QzthQUFFdVM7OzthQUMrQixrREFEakN2UyxJQUFFdVM7O0dBQzBEO1lBR3hFb1osT0FBTzNyQixHQUFFdVMsR0FBSSxPQWhCYnlsQyxXQWdCT2g0QyxHQUFFdVMscUJBQUZ2UyxHQUE2RDtZQUNwRXd6QixPQUFPeHpCLEdBQUV1UztJQUFJLE9BakJieWxDO2FBaUJPaDRDO2FBQUV1Uzs7YUFBdUMsa0RBQXpDdlMsSUFBRXVTOzthQUFGdlM7R0FBMEU7WUFFakZvNEMsT0FBU3Z5QyxLQUFTN0YsR0FBR0M7SUFDdkIsR0FEVzRGLFNBQU1DLE1BQU5ELFFBRUU0VSxNQUZJM1UsY0FFSjJVO0lBRGIsSUFBSWxJLElBQUosc0JBRG9CdlMsSUFFUC9HO0lBQUk7UUFBSkEsTUFEVHNaLEdBQzJCO0tBQWEsY0FGckJ0UyxHQUVWaEgsR0FBbUMsZ0JBRjVCK0csR0FFUC9HLEtBQThDLFdBQTlDQTtLQUErRCxJQUEvRDZMLE1BQStELDRCQUEvRDdMOztHQUNMO1lBR044ZixLQUFLL1ksR0FBR0M7SUFDSixZQVBKbTRDLFVBTUtwNEMsbUJBQ2tCd1AsR0FBSyxrQkFEcEJ2UCxHQUNldVAsR0FBUTtnQkFDdkI7UUFDSHZXO0lBQUssV0FBSyxnQkFIVitHLEdBR0EvRztHQUFlO1lBR3BCNmYsU0FBUzlZLEdBQUdDO0lBQ2QsSUFBSXNTLDBCQURPdlMsSUFFRS9HO0lBQ1g7UUFEV0EsTUFEVHNaLEdBR0c7S0FFRyxJQUVKclAsTUFGSSxXQU5JakQsR0FNRixnQkFOREQsR0FFRS9HO1FBTVBpSyxLQUFpQixPQUFqQkE7S0FEYSxJQUxONEIsTUFLTSw0QkFMTjdMOztHQVFQO1lBR0pvL0MsT0FBUTU5QixLQUFJemEsR0FBR0M7SUFDakIsR0FEVXdhO1NBSUQyZ0IsUUFKQzNnQixRQUNHcTJCLFFBR0oxVjs7U0FISTBWLFFBSUQsa0RBTEU5d0M7UUFDRC9HO0lBQUk7WUFBSkEsR0FBa0I7S0FBYSxjQUQzQmdILEdBQ0poSCxHQUFtQyxnQkFEbEMrRyxHQUNEL0csS0FBOEMsV0FBOUNBO0tBQStELElBQS9ENkwsTUFBK0QsNEJBQS9EN0w7O0dBTUw7WUFHTnEvQyxjQUFleG5CLE1BQUs5d0I7SUFBSSxPQVZ4QnE0QyxVQVVvQnI0QyxtQkFBdUJ3UCxHQUFLLFdBQUksV0FBckNzaEIsTUFBNEJ0aEIsR0FBaUI7R0FBQztZQUU3RCtvQyxPQUFTMXlDLEtBQTJCN0Y7SUFDdEMsR0FEVzZGLFNBQU9DLE1BQVBELGVBQU9DLGNBQVBnckI7SUFDTCxZQUhKd25CLGNBRVN4bkIsTUFBMkI5d0I7Z0JBRTVCO1FBQ0gvRztpQkFBWSxrREFIbUIrRzs7Y0F4Q3BDMnJCLE9Bd0NvQzNyQixHQUdlLDRCQUE5Qy9HO0dBQXFEO1lBRzFEdS9DLGVBQWdCMW5CLE1BQUs5d0I7SUFBSSxPQTNDekJvNEMsVUEyQ3FCcDRDLG1CQUF1QndQLEdBQUssV0FBSSxXQUFyQ3NoQixNQUE0QnRoQixHQUFpQjtHQUFDO1lBRTlEaXBDLE9BQVM1eUMsS0FBMkI3RjtJQUN0QyxHQURXNkYsU0FBT0MsTUFBUEQsZUFBT0MsY0FBUGdyQjtJQUNMLFlBSEowbkIsZUFFUzFuQixNQUEyQjl3QjtnQkFFNUI7UUFFSHVTO3FCQUorQnZTLElBeERwQ2s0QyxZQXdEb0NsNEMsR0FJL0J1UztHQUFvQjtZQU16Qm1tQyxNQUFRN3lDLEtBQTJCN0Y7SUFDckMsR0FEVTZGLFNBQU9DLE1BQVBELGVBQU9DLGNBQVBnckI7SUFDVixJQUFJaHZCLFNBQUosc0JBRHFDOUI7SUFFckMsU0FESThCOztLQUNnQzs7T0FBZCxXQUZaZ3ZCLE1BRWlCLGdCQUZVOXdCOzs7UUFFRDtVQUYxQjh3QixNQUUrQixnQkFGSjl3QixHQUVPLDRCQUR4QzhCOzs7TUFJSSxZQWpCTjAyQyxlQVlRMW5CLE1BQTJCOXdCO2tCQU16QjtNQUVELElBREY4OUIsa0JBQ0UsVUE1QlR3YSxjQW9CUXhuQixNQUEyQjl3Qjs7T0FTdEI7TUFDNEIsSUFBL0J5ckIsbUJBQStCLG1DQUEvQkEsTUFISHFTO01BR2lDLE9BbHRCeENqK0IsSUF3c0JtQ0csR0FPNUI4OUIsT0FHaUM7OztJQVByQyxPQUhnQzk5QjtHQVV5QjtZQUc1RE0sS0FBS04sR0FBR0M7SUFDVjtLQUFJK0MsMEJBREdoRDtLQUVIa0csTUFBSywyQkFETGxEO0tBRVMsbUNBRlRBO0tBQ0s7O1NBQ1QvSjs7NEJBRElpTixLQUNKak4sR0FDd0IsV0FKZGdILEdBR1ZoSCxHQUM2QixnQkFKdEIrRyxHQUdQL0c7Ozs7OztJQUdBLG1DQUpJaU47R0FJeUQ7WUFJM0Q3RixJQUFJTCxHQUFHQztJQUNUO0tBQUkrQywwQkFERWhEO0tBRUZrRyxNQUFLLDJCQURMbEQ7S0FFUyxtQ0FGVEE7S0FDSzs7U0FDVC9KOzs0QkFESWlOLEtBQ0pqTixHQUN3QixXQUpmZ0gsR0FJa0IsZ0JBSnJCRCxHQUdOL0c7Ozs7OztJQUdBLG1DQUpJaU47R0FJeUQ7WUFHM0Q4UyxTQUFTdGI7a0JBQWtDekUsR0FBSyx1QkFBdkN5RSxHQUFrQ3pFLEdBQVU7SUFBZix5REFBN0J5RTtHQUE2QztZQUV0RHdFLE9BRUV4RSxHQUFHdUM7SUFBSyxJQURNZCw0QkFDZHpCLElBRFd6RTtJQUFZO2dCQUFaQSxJQUFHa0c7O01BQXFCLHNCQUNoQ2MsR0FEa0MsZ0JBQ3JDdkMsR0FEV3pFO01BQXdCO09BQWtCLElBQTFDNkwsTUFBMEMsNEJBQTFDN0w7Ozs7Ozs7S0FBd0I7O0dBQ0E7WUFHckNzSixRQUVFN0UsR0FBR3VDO0lBQUssSUFETWQsNEJBQ2R6QixJQURXekU7SUFBWTtnQkFBWkEsTUFBR2tHOzs7O01BQXFCLHNCQUNoQ2MsR0FEa0MsZ0JBQ3JDdkMsR0FEV3pFO01BQXdCO09BQWtCLElBQTFDNkwsTUFBMEMsNEJBQTFDN0w7Ozs7Ozs7R0FDd0I7WUFHckM4RyxLQUlFQyxHQUFHTixNQUFNTztJQUFLLElBSE1kLDRCQUdwQmEsSUFIVy9HLE9BQUV5dkIsS0FHVmhwQjtJQUZMO1FBRGF6RyxNQUFTa0csS0FDTixPQUREdXBCO0tBQ3dCO01BRHhCSSxPQUN3QixXQUU1QjdvQixHQUhJeW9CLElBQzhCLGdCQUUzQzFvQixHQUhXL0c7WUFDa0IsNEJBRGxCQTs7TUFBRXl2Qjs7R0FHaUM7WUFHaERtQixNQUlFN3BCLEdBQUdOLE1BQU1PO0lBQUssSUFITWQsNEJBR3BCYSxJQUhXL0csT0FBRXl2QixLQUdWaHBCO0lBRkw7UUFEYXpHLE1BQVNrRyxLQUNOLE9BRER1cEI7S0FDd0I7TUFEeEJJLE9BQ3dCLFdBRTVCN29CLEdBSEVoSCxHQUFFeXZCLElBQ2dDLGdCQUU3QzFvQixHQUhXL0c7WUFDa0IsNEJBRGxCQTs7TUFBRXl2Qjs7R0FHaUM7WUFHaER0b0IsTUFBTUosR0FBR0M7SUFDWDtLQUFhLHlEQURMRDtLQUNSOzs7O01BQ0UsV0FGU0MsR0FDWGhILDBCQURRK0csR0FDUi9HO01BQ0UsV0FERkE7Ozs7OztHQUVJO1lBR0ZrZixNQUFNblksR0FBR0MsR0FBSSxxQ0FwQmJGLE1Bb0JNQyxHQUFHQyxHQUE4QjtZQUN2Q21ZLElBQUltQixHQUFFdlosR0FBR0MsR0FBSSxxQ0FyQmJGLE1BcUJJd1osR0FBRXZaLEdBQUdDLEdBQThCO1lBQ3ZDMFksUUFBUTNZLEdBQUkscUNBdEJaRCxNQXNCUUMsR0FBNkI7WUFDckM2WSxRQUFRN1ksR0FBSSxxQ0F2QlpELE1BdUJRQyxHQUE2QjtZQUNyQ3NZLFlBQVl0WSxHQUFHTixNQUFNTztJQUFJLHFDQXhCekJGLE1Bd0JlTCxNQUFNTyxHQUFURDtHQUFtRDtZQUMvRHlZLFdBQVd6WSxHQUFHTixNQUFNTztJQUFJLHlDQXpCeEJGLE1BeUJjTCxNQUFNTztJQUFJLHNCakV6ekI3Qiw4QmlFeXpCZ0JEO0dBQWtEO1lBQzdEdWtCLFVBQVV2a0IsR0FBR0M7SUFBSSw2Q0FaakJHLE9BWVVKLEdBQUdDO0dBQTJDO1lBQ3hEbWtCLE1BQU1wa0IsR0FBR0M7SUFBSSw2Q0FiYkcsT0FhTUosR0FBR0M7R0FBdUM7WUFDaEQwdEIsT0FBTzN0QixHQUFHQztJQUFJLDZDQXJCZDRwQixPQXFCTzdwQixHQUFHQztHQUF3QztZQUNsRHlrQixTQUFTMWtCLEdBQUdDO0lBQUksNkNBZmhCRyxPQWVTSixHQUFHQztHQUEwQztZQUN0RDBrQixRQUFRM2tCLEdBQUdDO0lBQUksNkNBaEJmRyxPQWdCUUosR0FBR0M7R0FBeUM7WUFFcERtYSxJQUlFcGEsR0FBRXdQO0lBQUssSUFIY3JRLDRCQUdyQmEsSUFIa0IvRztJQUNwQjtnQkFEb0JBLElBQUdrRzs7TUFDWCxxQ0FFUnFRLDBCQUFGeFAsR0FIa0IvRztNQUNSO09BQStDLElBRHZDNkwsTUFDdUMsNEJBRHZDN0w7Ozs7Ozs7S0FDUjs7R0FFNEI7WUFHeEMwL0MsR0FBSXpJLFFBQVFDLGFBQVl6eUM7SUFDMUIsT0FBRywwQkFER3d5QyxRQUFRQztjQUFZenlDO2NBUHhCMGM7Z0JBT3dCMWMsR0FBcEJ3eUM7Z0JBNURKN3ZDO2lCQTREd0IzQzswQkFJUDhSO2tCQUFLLE9BQUcsMEJBQVJBLEdBSmIwZ0M7NEJBQVFDOzRCQUlLM2dDO2lCQUFtRDtnQkFKNUM5UjtHQUtwQjtZQUdKazdDLFNBQVUxSSxRQUFRQztJQUNwQixHQWp3QkVyOEIsU0Fnd0JVbzhCO0tBRUQsa0JBdjBCVFMsc0JBdTBCRztJQUNHLEdBbndCTjc4QixTQWd3QmtCcThCO0tBSWY7SUFFRyx5Q0FOSUQsUUFBUUM7Z0JBT0Ysa0JBNTBCaEJRLHNCQTQwQlU7UUFDSFA7SUFDQzthQTkwQlJPO3NCQTgwQmFqekM7Y0FDVCxPQW5FSndFO3dCQWtFYXhFO2lDQUNXOFI7eUJBQUs7O21EQUZ0QjRnQyxRQUV1RCwwQkFBdEM1Z0M7O3dCQUFzRDt3QkE5RTlFblA7eUJBNkVhM0M7a0NBRVU4UjswQkFBSzttQ0FIckI0Z0MsUUFHdUMsMEJBQXZCNWdDO3lCQUFzQzt3QkFGaEQ5UjthQUdIO0dBQUU7WUErQlptN0MsYUFBY3ZtQyxLQUFJd21DO0lBQUssT0FBWSxtQkFBckJ4bUMsS0FBcUIsNEJBQWpCd21DO0dBQW1DO1lBQ3JEL3RCLFdBQVl6WSxLQUFJNVUsR0FBR3VDO0lBQWlDLFdBdkdwRCtZLFNBdUdnQnRiO0lBQXlCLE9BRHpDbTdDLGFBQ1l2bUMsS0FBNkIsa0NBQXRCclM7R0FBaUQ7WUF3QnBFOGpCLE9BQU8vakIsR0FBR0M7SUFDWixJQUFJc1MsMEJBREt2UyxJQUVML0c7SUFFRjtLQURjLEdBRFpBLE9BREFzWixLQUVZLFdBSEp0UyxHQUdNLGdCQUhURCxHQUVML0csUUFFRiw2QkFGRUE7aUJBREFzWixHQU1DLE9BUEl2UztLQVNnQjt5Q0FSckJ1UztNQVFFd21DLE1BQU07S0FDViwyQkFWTy80QyxNQVNIKzRDLFFBUEY5L0M7S0FTWSxJQUFWKy9DLGNBVEYvL0M7S0FVRiw2QkFWRUE7O2lCQURBc1o7T0FvQlE7UUFBTjBtQyxRQUFNLDRCQVpORjtRQWFVLG1DQXJCWnhtQztjQVVFeW1DLHNCQVVBQyxRQTUzQkpwNUMsSUE0M0JJbzVDLFVBVkFEOztNQUdNLElBQUp4cEMsSUFBSSxnQkFkSHhQLEdBRUwvRztNQWFHLGNBZktnSCxHQWNKdVA7T0FHRixlQVJBdXBDLEtBRUFDLFlBR0V4cEM7T0FJRiw2QkFQQXdwQzs7TUFRRiw2QkFqQkEvL0M7OztHQW9CNkQ7WUFJL0Q2d0IsUUFBUTlwQixHQUFHQztJQUNiLElBQUlzUywwQkFETXZTLElBRU4vRztJQUVGO1FBRkVBLE9BREFzWjtNQUVpQiwyQkFIWHZTLEdBRU4vRztNQUNZLGNBSEhnSCxHQUVUaEg7T0FFRiw2QkFGRUE7Ozs7aUJBREFzWixHQU1DLE9BUEt2UztLQVNlO3lDQVJyQnVTO01BUUV3bUMsTUFBTTtLQUNWLDJCQVZRLzRDLE1BU0orNEMsUUFQRjkvQztLQVNZLElBQVYrL0MsY0FURi8vQztLQVVGLDZCQVZFQTs7aUJBREFzWjtPQW9CUTtRQUFOMG1DLFFBQU0sNEJBWk5GO1FBYVUsbUNBckJaeG1DO2NBVUV5bUMsc0JBVUFDLFFBdDVCSnA1QyxJQXM1QklvNUMsVUFWQUQ7O01BR00sSUFBSnhwQyxJQUFJLGdCQWRGeFAsR0FFTi9HO01BYUcsY0FmTWdILEdBRVRoSCxNQVlJdVc7T0FHRixlQVJBdXBDLEtBRUFDLFlBR0V4cEM7T0FJRiw2QkFQQXdwQzs7TUFRRiw2QkFqQkEvL0M7OztHQW9CNkQ7WUFHL0RpZ0QsWUFBWXg3QyxHQUFHaXVCO0lBQ2pCLE9BblNFbXNCLFlBa1NZcDZDLEdBQUdpdUI7a0JBcFJmdXNCLFlBb1JZeDZDLHlCQUFHaXVCOztHQUN5RDtZQUd4RXd0QixzQkFBc0J6N0MsR0FBR2l1QjtJQUMzQixPQXZTRW1zQixZQXNTc0JwNkMsR0FBR2l1QjtjQXhSekJ1c0IsWUF3UnNCeDZDLHlCQUFHaXVCO2NBQUhqdUI7R0FDd0M7WUFHOUQwN0MsZ0JBQWdCMTdDLEdBQUdpdUI7SUFDZixZQVRKdXRCLFlBUWdCeDdDLEdBQUdpdUI7Z0JBR1gsa0JBejhCUmh1QixtQkFzOEJnQkQsR0FBR2l1QjtRQUVkdGdCO0lBQU8sT0FBUEE7R0FDMEQ7WUFHL0RndUMsWUFBWTM3QyxHQUFHODFCO0lBQ2pCLE9BbFRFcWtCLFlBaVRZbjZDLEdBQUc4MUI7a0JBOVJmMmtCLFlBOFJZejZDLHlCQUFHODFCOztHQUN5RDtZQUd4RThsQixzQkFBc0I1N0MsR0FBRzgxQjtJQUMzQixPQXRURXFrQixZQXFUc0JuNkMsR0FBRzgxQjtjQWxTekIya0IsWUFrU3NCejZDLHlCQUFHODFCO2NBQUg5MUI7R0FDd0M7WUFHOUQ2N0MsZ0JBQWdCNzdDLEdBQUc4MUI7SUFDZixZQVRKNmxCLFlBUWdCMzdDLEdBQUc4MUI7Z0JBR1gsa0JBdjlCUjcxQixtQkFvOUJnQkQsR0FBRzgxQjtRQUVkbm9CO0lBQU8sT0FBUEE7R0FDMEQ7WUFPN0RtdUMsUUFBUXAyQyxHQUFFQztJQUFJLDZCQUFORCw0QkFBRUMsS0FBRkQsSUFBRUM7R0FBeUM7WUFFbkRvMkMsU0FBU24xQztJQUNYLEtBRFdBLE1BRUg7UUFDR25CLE9BSEFtQixTQUdUdzVCLFFBSFN4NUI7SUFHUSxpQ0FBUm5CLE1BQVQyNkIsT0FMQTBiO0dBS3NEO1lBTXRERSxxQkFBdUJ6Z0QsR0FBVyxPQUFYQSxFQUFZO1lBQ25DMGdELGVBQWUzNUMsR0FBRS9HO0lBQUksNkRBQU4rRyxJQUFFL0c7SUFBSTtHQUFnQjtZQUVqQzJnRCw0QkFBNEJ4MkMsR0FBRUMsR0FBR3cyQyxTQUFTQyxTQUFTQztJQUN6RCxJQUR5REM7SUFDekQ7UUFEZ0RGLFdBQVNFLGNBRXBELE9BRjJDRjs7b0NBQVp6MkMsR0FLWixXQUxldzJDLFNBQUh4MkMsR0FBcUIyMkM7b0NBQXZCNTJDLEdBSVYsV0FKZXkyQyxTQUFMejJDLEdBQXVCNDJDO0tBR2pELDRDQUlILE9BUG9EQTtLQU1VO01BTlZDLGVBTVUsNEJBTlZEOzs7R0FPMUM7WUFHYkUsdUJBQXVCOTJDLEdBQUVDLEdBQUd3MkM7SUFDaEI7S0FBVkM7T0FBVTtpREFEVzEyQywwQkFBRUM7SUFFM0IsT0FaTXUyQyw0QkFVbUJ4MkMsR0FBRUMsR0FBR3cyQyxTQUMxQkM7R0FDMkQ7WUFHekRLLDJCQUEyQnJjLE9BQU14NUIsTUFBTXUxQyxTQUFTQztJQUN0RCxJQURpQ00saUJBQU03MUMsZUFBZTgxQztJQUN0RDtVQUR1QzkxQyxRQUUvQixPQUY4QzgxQztLQU9sRDtNQVBtQ2wzQztNQUFONDZCLFNBQU14NUI7TUFBZSsxQztRQWZoRFYsNEJBZTJCUSxpQkFBWVAsU0FBU1E7TUFBckJEO01BQU03MUM7TUFBZTgxQzs7R0FTSTtZQUd4REUsc0JBQXNCajJDLE1BQU11MUM7SUFDOUIsS0FEd0J2MUMsTUFFaEI7SUFjZTtLQWJabkIsT0FIYW1CO0tBR3RCdzVCLFFBSHNCeDVCO0tBZ0JsQncxQyxVQUFpQixzQkF2RHJCTCxTQXVDc0JuMUM7SUFpQnRCLE9BN0JJNjFDLDJCQWVKcmMsT0FBUzM2QixNQUhtQjAyQyxTQWdCeEJDO0dBQ21EO1lBTXZEVSxnQkFBZ0JwM0MsR0FBRUMsR0FBR3cyQyxTQUFTaHBCO0lBQ3RCLElBQU4xeEIsTUF6Q0YrNkMsdUJBd0NnQjkyQyxHQUFFQyxHQUFHdzJDO0lBSXZCLGtCQUpnQ2hwQixNQWhFOUIyb0IsUUFnRWdCcDJDLEdBQUVDLElBQ2hCbEU7R0FHa0I7WUFHcEJzN0MsZUFBZW4yQyxNQUFNdTFDLFNBQVNocEI7SUFDaEMsS0FEaUJ2c0IsTUFFVDtJQUlFO0tBSENuQixPQUhNbUI7S0FHZnc1QixRQUhleDVCO0tBTVg1RyxJQTNFSis3QyxTQXFFZW4xQztLQU9YdzFDLFVBQUosc0JBRElwOEM7SUFFSixTQURJbzhDLFNBRUM7SUFLRCxJQUhFMzZDLE1BckRGZzdDLDJCQTZDSnJjLE9BQVMzNkIsTUFIWTAyQyxTQU9qQkM7SUFTRixrQkFoQjRCanBCLE1BTTFCbnpCLEdBS0V5QjtHQUtPO1lBT2J1N0MsY0FBY3AyQztJQUFPLE9BdkJyQm0yQyxlQXVCY24yQyxNQW5GZG8xQyxlQXZURi90QjtHQTBZOEU7WUFDNUVndkIsY0FBY3IyQztJQUFPLE9BeEJyQm0yQyxlQXdCY24yQyxNQW5GZHExQyxnQkF2VEZubUI7R0EwWStFO1lBQzdFb25CLGVBQWV4M0MsR0FBRUM7SUFBSSxPQWhDckJtM0MsZ0JBZ0NlcDNDLEdBQUVDLEdBckZqQnEyQyxlQXZURi90QjtHQTRZOEU7WUFDNUVrdkIsZUFBZXozQyxHQUFFQztJQUFJLE9BakNyQm0zQyxnQkFpQ2VwM0MsR0FBRUMsR0FyRmpCczJDLGdCQXZURm5tQjtHQTRZK0U7WUFDN0VzbkIscUJBQXFCeDJDO0lBQU8sT0F6RDVCaTJDLHNCQXlEcUJqMkMsTUF2RnJCbzFDO0dBdUY2RTtZQUM3RXFCLHFCQUFxQnoyQztJQUFPLE9BMUQ1QmkyQyxzQkEwRHFCajJDLE1BdkZyQnExQztHQXVGOEU7WUFDOUVxQixzQkFBc0I1M0MsR0FBRUM7SUFBSSxPQTVFNUI2MkMsdUJBNEVzQjkyQyxHQUFFQyxHQXpGeEJxMkM7R0F5RjZFO1lBQzdFdUIsc0JBQXNCNzNDLEdBQUVDO0lBQUksT0E3RTVCNjJDLHVCQTZFc0I5MkMsR0FBRUMsR0F6RnhCczJDO0dBeUY4RTtZQXdCaEZ2dkMsR0FBRytCLEtBQUlrcEI7SUFBUyxzQ0FBYmxwQixVQUFJa3BCO0dBQTRDO1lBQ25ENmxCLFFBQVExckMsR0FBSSwyQkFBSkEsR0FBWTtZQUVwQjJyQyxhQUFhbjRDO0lBQ2Y7S0FBcUIsZ0NBRE5BO0tBQ1hoRCxJQUFJO0lBQ1IsY0FBcUIvRyxHQUFFdVcsR0FBSyxzQkFEeEJ4UCxHQUNpQi9HLEdBQUV1VyxHQUFvQjtJQUEzQywwQkFGZXhNO0lBRWYsbUNBREloRDtHQUV3RDtZQU14RG83QztJQUFvQ0Msa0JBQWlCQyxhQUFZenVDO0lBQ25FO0tBQUkwdUM7T0FDQzs2QkFGaUNGLGlDQUFpQkM7VUFBakJEO2tCQUFpQkMsMkJBQWpCRDtLQU1sQ3ZwQixNQUFNO0tBQ04wcEIsT0FBTzthQU5QRDtJQU9XO2lCQUNMLFdBSE56cEI7U0FJa0I5dUIsZ0NBQVR5NEMsaUJBQVJDO3FCQVY4RDd1QztVQVd4RDBCLElBRE5tdEMsUUFDRzlyQixJQUdhLDBCQUpSNnJCOztNQUdNLElBRlhFLE1BRVcsMEJBSGRELFNBQ01udEMsSUFERWt0QyxNQUNMN3JCO0tBS0QsMkJBVkhrQyxLQUtJbEM7TUFLc0IscUNBTG5CcmhCO01BS2Esc0JBVHBCaXRDO09BcUJhLHFDQWpCTmp0QztPQWlCTCxpQkF0QkZ1akIsS0FLSWxDO09Ba0JJLHFDQWxCRHJoQjtPQWtCTCxpQkF0QkZpdEM7bUJBR2tCeDRDOzs7O0tBY007Ozs7OztVQUFiLG1DQXZCWHU0Qzs7K0JBcUJpQiw2QkFaUkU7TUFXRiwyQkFBWSw2QkFYbEJDO01BU0c7OztHQWFhO1lBR25CRSxXQUFZUCxrQkFBa0JDO0lBQzFCO0tBQ0pqc0Q7T0FyQ0ErckQ7U0FtQ1lDLGtCQUFrQkM7YUFFOUJqc0QsTUFBZ0IsT0FBaEJBO1FBQ0d3c0QsZUFESHhzRDtJQUVBO3FCQUNPNnJCO2FBR0Y7Y0FBSTRnQztjQUNBQztnQkFwWFhseUI7a0JBZ1hTM087OzJCQUsyQmppQixHQUFFc2YsS0FBSS9JO21CQUMvQjtvQkFBb0IsaUNBRFdBO29CQUc3QitDLHFCQVZSc3BDO2lDQVVRdHBDOzZCQUh5QmdHOzhCQUt6QjtpREFQRnVqQztxQ0FFeUI3aUQsR0FNbkIsMEJBSEpzWixLQUh5QmdHO2tCQU1PO2FBRXRDLEtBVEl3akMsV0FVSSxPQWRON2dDO2FBdUNjO2NBRFY4Z0MsaUNBdENKOWdDO2NBdUNJK2dDO2dCQUFVLDRCQURWRCxVQW5DRkY7Y0FxQ0U3Z0MsTUFBTSwyQkFETmdoQztjQUVTQyxhQUhURjtjQUdrQkcsaUJBRmxCRjtzQkFuQ0ZGOzs7ZUE2Q1k7Z0JBSmFLOztnQkFBakJDO2dCQUFMQztnQkFJUyxtQ0FSREosWUFJUkk7Z0JBSUduOUMsTUFBTTtnQkFFTmc5QixVQUFVLDRCQVZJZ2dCLGdCQVFkaDlDO2dCQUk0QixtQ0FSL0JtOUM7ZUFRRCwyQkFyREpwaEMsV0F3Q0lELEtBV0lraEIsU0FGQWg5QjtlQU1VLElBQVZvOUMsaUJBQVUsNEJBSlZwZ0I7ZUFLSixlQWhCQWxoQixLQWVJc2hDLGdCQTVEZWpCO2VBOERuQjtpQkFqQkFyZ0M7aUJBaUJjLDRCQUZWc2hDO2lCQVZFRjs7Z0JBSkdILGFBSVJJO2dCQUppQkgsaUJBY2RJO3dCQVZtQkg7OztjQUR2QiwyQkE1Q0psaEMsUUF3Q0lELFFBQ1NpaEM7Y0FvQmIsbUNBckJJamhDOztZQXNCMEQ7R0FBQztZQUd0RXVoQyxlQUFnQm5CLGtCQUFrQkM7SUFDcEIsV0F2RWRNLFdBc0VnQlAsa0JBQWtCQztJQUNwQyxrQkEvc0NBM0ssT0Erc0NBO0dBQW9FO1lBR2xFOEwsT0FBUVosY0FBY1A7SUFLeEI7dUNBTFVPO0tBTVI7S0FERVIsbUJBR2EsZ0NBQUs3ckMsR0FBSyxXQUFMQSxNQUFTO0lBRS9CLE9BZEVndEMsZUFTRW5CLGtCQUxvQkM7R0FVcUI7WUFvQjNDb0IsYUFBY3JCLGtCQUFrQkM7SUFDNUI7S0FDSmpzRDtPQTdJQStyRDtTQTJJY0Msa0JBQWtCQzthQUVoQ2pzRCxNQUFnQixPQUFoQkE7UUFDR3dzRCxlQURIeHNEO0lBRUE7cUJBQ082ckI7YUFlRixJQUNlamlCLE9BQUUwakQscUJBRGJDO2FBRUE7dUNBakJGMWhDLFFBZ0JhamlCO2VBY2YsS0FmSTJqRCxhQWdCSSxPQS9CTjFoQztlQWlDcUM7Z0JBRDlCMmhDLGdCQWpCTEQ7Z0JBaUJGaHZCLE1BakJFZ3ZCO2dCQWtCbUMsZ0NBbEJuQ0E7Z0JBa0JxQjs7MkRBakN2QjFoQztnQkFpQ0lELE1BQU07Z0JBQ0Y3TTs7O29CQUFLOHRDO29CQUFTQzs7OztxQkFHbEI7OENBckNKamhDLFFBaUNJRCxRQUNTaWhDO29CQVFDO3FCQUpIVTtxQkFBUE47cUJBSVUsbUNBUkRKLFlBSVRJO3FCQUlJbjlDLE1BQU07cUJBRU5nOUIsVUFBVSw0QkFWSWdnQixnQkFRZGg5QztxQkFJNEIsbUNBUmhDbTlDO29CQVFBLDJCQTlDSnBoQyxXQWlDSUQsS0FXSWtoQixTQUZBaDlCO29CQU1VO3FCQUFWbzlDLGlCQUFVLDRCQUpWcGdCO3FCQVErQjs7eUJBcER2Q2poQixLQW9ENEMsNEJBZHhDb2hDO3FCQWN1QjtxQkFFbEIvcEMscUJBeERic3BDOzs4QkF3RGF0cEM7MEJBRE07MkJBckRmMkksS0FxRG9CLDRCQWZoQm9oQzswQkFnQlUsMEJBQUwvcEM7b0JBTEwsZUFoQkEwSSxLQWVJc2hDOztxQkFkS0wsYUFJVEk7cUJBSmtCSCxpQkFjZEk7K0JBVkdLOzs7O2lCQU5YaHZCO21CQTBCUyxrREExRFQxUztnQkFrQ1E5TTt3Q0FsQ1I4TTt1Q0FpQ0lEO2tCQWxCRjJoQzs7Z0JBbUJNeHVDO2tCQStCRCxrREFqRVA4TTt1Q0FpQ0lEO2tCQURHNGhDO2VBaUNMLG1DQWhDRTVoQzs7K0JBakJXMGhDO2VBeEJSO3VDQVFQemhDLEtBZ0JhamlCO2dCQUlMNmpEO2tCQTVCWixnQ0FHNkJ4Qjs7OzttQkF5QmpCd0I7Y0FDSjtlQUxrQnZrQzsrQkFJZHVrQyxXQUxORixrQkFDVzNqRCxHQURYMmpEO2VBQ1c5M0MsTUFNUCw0QkFOTzdMOztlQUFFMGpELFNBSVBHO2VBTE5GLGNBQ29CcmtDOztZQWtEd0M7R0FBQztZQUd0RXdrQyxpQkFBa0IxQixrQkFBa0JDO0lBQ3RCLFdBM0Vkb0IsYUEwRWtCckIsa0JBQWtCQztJQUN0QyxrQkEzekNBM0ssT0EyekNBO0dBQXNFO1lBR3BFcU0sU0FBVTFCLGFBQWMsT0FKeEJ5QixvQkFJVXpCLGFBQWdFO1lBRTFFMkIsdUJBQXVCNXhDLEtBQUtpd0MsYUFBWTdnQztJQUMxQyxJQUFhaXZCLE1BR1IsNEJBSnFDanZCLFNBQzdCdFEsU0FBRSt5QztJQUNiO2FBRFcveUM7TUFDYSwyQkFGRGtCLEtBQ1psQjtNQUNDLHFDQUZnQm14QztPQUUyQztRQUQxRDZCLFFBQzBELDRCQUQxREQ7UUFBRnBULE1BQ29ELDRCQURwRDMvQjs7UUFBRSt5Qzs7OztLQUNvQyxPQURwQ0E7O0dBR0M7WUFjZEUscUJBQXFCL3hDLEtBQUtpd0MsYUFBWXJpRDtJakU1MUM3Qyx1QmlFNjFDb0I7SUFFQywyQkFIT29TLEtBQWlCcFM7SUFHbkMsdUNBSHVCcWlEOzs7O1lBTTFCK0IsY0FBY2h5QyxLQUFLaXdDLGFBQVk3Z0M7SUFDakM7S0FBVSxPQXpCUndpQyx1QkF3QmM1eEMsS0FBS2l3QyxhQUFZN2dDO0tBQzdCNmlDLFlBQU07S0FDWSx1QkFGTmp5QyxLQUFpQm9QO0tBRXRCLHdDQUZVNmdDO1dBQ2pCZ0M7R0FJc0I7WUFHeEJDLFlBQVlseUMsS0FBSW9QLEtBQUkraUM7SUFDdEI7a0NBRGNueUMsUUFBSW9QOztrQkFDbUIsV0FuMkNyQzljLG1CQWsyQ3NCNi9DO0dBQ2dFO1lBR3BGQyxpQkFBaUJweUMsS0FBS2l3QyxhQUFZN2dDO0lBSmxDOGlDLFlBSWlCbHlDLEtBQWlCb1A7eUJBWmxDNGlDLGNBWWlCaHlDLEtBQUtpd0MsYUFBWTdnQztHQUlOO1lBRzVCaWpDLGdCQUFnQnJ5QyxLQUFLaXdDLGFBQVk3Z0M7SUFYakM4aUMsWUFXZ0JseUMsS0FBaUJvUDt5QkFuQmpDNGlDLGNBbUJnQmh5QyxLQUFLaXdDLGFBQVk3Z0M7R0FJSjtZQUc3QmtqQyxnQkFBZ0J0eUMsS0FBS2l3QyxhQUFZN2dDO0lBbEJqQzhpQyxZQWtCZ0JseUMsS0FBaUJvUDswQkExQmpDNGlDLGNBMEJnQmh5QyxLQUFLaXdDLGFBQVk3Z0M7R0FJSjtZQUc3Qm1qQyxhQUFXdnlDLEtBQUtpd0MsYUFFTDdnQyxLQUZxQndCO0lBekJoQ3NoQyxZQXlCV2x5QyxLQUVBb1A7SUFhSjtLQWJNb2pDLFdBbkNiUixjQWlDV2h5QyxLQUFLaXdDLGFBRUw3Z0M7O0tBQUVraUM7SUFDYjtRQURXbGlDO2dDQUFFa2lDOztPQUtDLDJCQVBIdHhDLEtBRUFwUztPQUtSLG1DQVA2QmdqQixTQVEzQixXQU5NaGpCOzs7S0FRRCxJQVJDNkwsTUFRRCw0QkFSQzdMO1FBU1Qsc0JBWFNvUyxRQUVBdkcsS0FVSjtLQUNPO01BWERnNEMsV0F6Q2JNLHFCQXVDVy94QyxLQUFLaXdDLGFBRUx4MkMsS0FBRTYzQztNQUFGMWpEO01BQUUwakQ7O0dBYThCO1lBRzNDbUIsaUJBQWV6eUMsS0FBS2l3QyxhQUFZN2dDLEtBQUl3QjtJQUNoQyxZQW5CSjJoQyxhQWtCZXZ5QyxLQUFLaXdDLGFBQVk3Z0MsS0FBSXdCO2tCQVcvQm1mLGtCQUFPLE9BQVBBO0lBTEE7OEJBR1UsNkJBVHFCbmY7NkJBUXRCLDZCQVJrQnhCOzs7NkJBT1YsNkJBUEY2Z0M7O0tBTWYsd0JBQVMsV0FuNENkeHhDLFdBNjNDZXVCO0lBSWI7YUFoNUNKd3NCO2FBZzVDSTtHQU9hO1lBR2ZrbUIsUUFBTTF5QyxLQUFLaXdDLGFBQVlyL0I7SUFBTyxPQWhDOUIyaEMsYUFnQ012eUMsS0FBS2l3QyxnQkFBWXIvQjtHQUF5QztZQUNoRStoQyxZQUFVM3lDLEtBQUtpd0MsYUFBWXIvQjtJQUFPLE9BZmxDNmhDLGlCQWVVenlDLEtBQUtpd0MsZ0JBQVlyL0I7R0FBNkM7WUFFeEVnaUMsY0FBWTV5QyxLQUFLaXdDLGFBT0o3Z0MsS0FQb0J3QjtJQTVEakNzaEMsWUE0RFlseUMsS0FPQ29QO0lBSFosNkJBSmdDd0IsUUFBaEJxL0IsY0FLZDtRQUVVbGdCO0lBQ1g7WUFEV0EsT0FFTjtLQUVnQixJQUFmOGlCLGVBdkdSakIsdUJBNEZZNXhDLEtBQUtpd0MsYUFPSmxnQjtLQUtOLHNDQURDOGlCO01BQ29DLDJCQVpoQzd5QyxLQU9DK3ZCO01BS29CLG1DQVpBbmYsU0FheEIsV0FOSW1mOztLQU9FO3lDQVBGQSxPQUlMOGlCO01BSktwTixRQU9DO01BUEQxVjs7R0FTSjtZQUdUK2lCLGtCQUFnQjl5QyxLQUFLaXdDLGFBQVk3Z0MsS0FBSXdCO0lBQ2pDLFlBcEJKZ2lDLGNBbUJnQjV5QyxLQUFLaXdDLGFBQVk3Z0MsS0FBSXdCO2tCQVdoQ21mLGtCQUFPLE9BQVBBO0lBTEE7Z0NBR1UsNkJBVHNCbmY7K0JBUXZCLDZCQVJtQnhCOzs7K0JBT1gsNkJBUEQ2Z0M7O0tBTWhCLDBCQUFTLFdBdjZDZHh4QyxXQWk2Q2dCdUI7SUFJZDthQXA3Q0p3c0I7YUFvN0NJO0dBT2E7WUFHZnVtQixTQUFPL3lDLEtBQUtpd0MsYUFBWXIvQjtJQUMxQixPQXozQ0FuSSxTQXczQ1N6STs7Y0FqQ1A0eUM7ZUFpQ081eUM7ZUFBS2l3QztlQUM4QyxrREFEbkRqd0M7ZUFBaUI0UTtHQUN1RDtZQUcvRW9pQyxhQUFXaHpDLEtBQUtpd0MsYUFBWXIvQjtJQUM5QixPQW5CRWtpQzthQWtCVzl5QzthQUFLaXdDO2FBQ2Usa0RBRHBCandDO2FBQWlCNFE7R0FDd0I7WUFLcERxaUMsWUFBVWp6QyxLQUFLaXdDLGFBQWF6RTtJQUM5QixnQkFEOEJBO1NBSWY3ekMsSUFKZTZ6QyxPQUMxQkksb0JBR29Cem5DLEdBQUssT0E1MkJ6QnVuQyxjQTQyQlcvekMsR0FBU3dNLEdBQXNCOzs7TUFEcENBLElBSG9CcW5DO01BQzFCSSxvQkFFZ0J0MEIsS0FBSyxPQUFULDBCQUFJQSxLQUFWblQsR0FBOEI7SUFHeEM7S0FBSXJRLE1BQUosc0JBTllrTTtLQU9Da047S0FBSW9rQztLQUFPekY7S0FBU3o4QjtJQUMvQjtRQUQrQkEsUUFEN0J0YjtNQUdZOzs7VUE5NkNoQlUsSUFxNkNZd0wsS0FPWTZyQyxVQUVvQiw0QkFIeEMvM0MsS0FDb0IrM0M7VUFBWDMrQjtNQUVHOztLQUVDO01BQVR1a0MsV0FoSU5NLHFCQXFIVS94QyxLQUFLaXdDLGFBT2dCN2dDLEtBQWhCa2lDO01BS2Isc0JBRElHO0tBSUQsV0FkSDdGLFNBY1ksZ0JBZko1ckMsS0FPcUJvUDtNQVViO09BQVY2OEI7U0F0N0NWejNDLElBcTZDWXdMLEtBT1k2ckMsVUFVdUIsNEJBVmR6OEIsS0FBVHk4QjtPQUFTOWIsUUFXWSw0QkFYWjNnQjtPQUFUMjhCLGFBV1csNEJBWEYzOEI7T0FBcEI0UCxZQVVIaXRCLFNBVkcvK0I7O09BQUlva0MsU0FJVEc7T0FKZ0I1RjtPQUFTejhCOzs7S0FZQztNQVpEcTJCLFFBWUMsNEJBWkRyMkI7TUFBaEJraUMsU0FJVEc7TUFKeUJyaUM7O0dBY2I7WUFHbEI4akMsUUFBTWx6QyxLQUFLd3JDO0lBQXVCLDJCQUF2QkE7SUFBSyxzQmpFeitDdkIsT2lFaTlDT3lILFlBd0JNanpDO0dBQXNDO1lBQzVDbXpDLGlCQUFlbnpDLEtBQVFvc0M7SUFBMEIseUJBQTFCQTtJQUFRLHFCakUxK0N0QyxPaUVpOUNPNkcsWUF5QmVqekM7R0FBb0Q7WUFFbkVvekMsU0FBU3B6QyxLQUFJb1A7SUFDZjtLQUFzRCx3REFEM0NwUCxNQUFJb1A7S0FDc0M7S0FBNUIsTUFqOEN6QjVhLElBZzhDV3dMLEtBQzJCLDRCQUR2Qm9QO0lBQ2YsV0FqOENBNWEsSUFnOENXd0wsUUFBSW9QO0dBQzREO1lBR3pFaWtDLFVBQVFyekMsS0FBS3dyQyxJQUFJeUU7aUJBQzRCanNELEdBQUssT0FMbERvdkQsU0FJUXB6QyxLQUNxQ2hjLEdBQW1CO0lBQXZELFVBOUVUMHVELFFBNkVRMXlDLEtBQVNpd0MsYUFBSnpFO0lBQzJCO0dBQXlCO1lBR2pFOEgsVUFBUXR6QyxLQUFLd3JDLElBQUl5RTtpQkFDNkJqc0QsR0FBSyxPQVRuRG92RCxTQVFRcHpDLEtBQ3NDaGMsR0FBbUI7SUFBeEQsVUE5Q1QrdUQsU0E2Q1EveUMsS0FBU2l3QyxhQUFKekU7SUFDNEI7R0FBeUI7WUFHbEUrSCxjQUFZdnpDLEtBQUt3ckMsSUFBSXlFO0lBQWMsT0FabkNtRCxTQVlZcHpDLEtBcEZaMnlDLFlBb0ZZM3lDLEtBQVNpd0MsYUFBSnpFO0dBQThEO1lBQy9FZ0ksY0FBWXh6QyxLQUFLd3JDLElBQUl5RTtJQUFjLE9BYm5DbUQsU0FhWXB6QyxLQTlDWmd6QyxhQThDWWh6QyxLQUFTaXdDLGFBQUp6RTtHQUErRDtZQUloRmlJLHNCQUF1Qmh1QixNQUFNd3FCLGFBQVl0N0M7SUFDM0MsT0F4eUJBcTRDOzthQXV5QjJDcjRDO3NCQUMxQi9HLEdBQUV1VztjQUNaLHlCQUZrQnNoQixNQUNOdGhCO2NBQ1o7OztlQUNGLFVBbEpIaXVDLGlCQStJeUN6OUMsR0FBWnM3QyxhQUNkcmlEO2VBRVosVUFGTCxPQXpJRXlrRCxnQkF3SXlDMTlDLEdBQVpzN0MsYUFDZHJpRDs7O2NBQ1Y7YUFFOEI7R0FBQztZQUdwQzhsRCx1QkFBd0JqdUIsTUFBTXdxQixhQUFZdDdDO0lBQzVDLE9BeDBCQW80Qzs7YUF1MEI0Q3A0QztzQkFDM0IvRyxHQUFFdVc7Y0FDWix5QkFGbUJzaEIsTUFDUHRoQjtjQUNaOzs7ZUFDRixVQXpKSGl1QyxpQkFzSjBDejlDLEdBQVpzN0MsYUFDZnJpRDtlQUVaLFVBRkwsT0FoSkV5a0QsZ0JBK0kwQzE5QyxHQUFaczdDLGFBQ2ZyaUQ7OztjQUNWO2FBRThCO0dBQUM7WUFHcEMrbEQsZUFBaUJuNUMsS0FBMkI3RixHQUFHczdDO0lBQ2pELEdBRG1CejFDLFNBQU9DLE1BQVBELGVBQU9DLGNBQVBnckI7SUFDYixZQWZKZ3VCLHNCQWNpQmh1QixNQUE4QndxQixhQUFIdDdDO2dCQUVwQztRQUNIL0c7aUJBQVksa0RBSDJCK0c7O2NBajFCOUMyckIsT0FpMUI4QzNyQixHQUdPLDRCQUE5Qy9HO0dBQXFEO1lBRzFEZ21ELGVBQWlCcDVDLEtBQTJCN0YsR0FBR3M3QztJQUNqRCxHQURtQnoxQyxTQUFPQyxNQUFQRCxlQUFPQyxjQUFQZ3JCO0lBQ2IsWUFkSml1Qix1QkFhaUJqdUIsTUFBOEJ3cUIsYUFBSHQ3QztnQkFFcEM7UUFFSHVTO3FCQUp1Q3ZTLElBLzFCOUNrNEMsWUErMUI4Q2w0QyxHQUl2Q3VTO0dBQW9CO1lBTXpCMnNDLGNBQWdCcjVDLEtBQTJCN0YsR0FBR3M3QztJQUNoRCxHQURrQnoxQyxTQUFPQyxNQUFQRCxlQUFPQyxjQUFQZ3JCO0lBQ2xCLElBQUlodkIsU0FBSixzQkFENkM5QjtJQUc3QyxTQUZJOEI7O0tBRWdDOztPQUFkLFdBSEpndkIsTUFHUyxnQkFIa0I5d0I7OztRQUdUO1VBSGxCOHdCLE1BR3VCLGdCQUhJOXdCLEdBR0QsNEJBRnhDOEI7OztNQUtJLFlBN0JOaTlDLHVCQXVCZ0JqdUIsTUFBOEJ3cUIsYUFBSHQ3QztrQkFPakM7TUFFRDtPQURGODlCO09BQ0UsVUF2Q1RnaEIsc0JBOEJnQmh1QixNQUE4QndxQixhQUFIdDdDOztPQVU5QjtNQUM0QixJQUEvQnlyQixtQkFBK0Isa0NBQS9CQSxNQUhIcVM7TUFHaUMsT0ExL0MxQ2orQixJQSsrQzZDRyxHQVFwQzg5QixPQUdpQzs7O0lBUHJDLE9BSndDOTlCO0dBV2lCO1lBUzlEbS9DLFVBQVFuL0MsR0FBR3c1QixLQUFLQztJQUFPLDBDQUFaRCxLQUFIeDVCO0lBQWUsNkNBQWZBLEdBQVF5NUI7R0FBNEI7WUFDNUNDLGdCQUFnQjE1QixHQUFHeFEsS0FBS0Q7SUFBTSxPQUFHLGdDQUFqQnlRLEdBQUd4UTs7Y0FBdUMsZ0NBQTFDd1EsR0FBUXpRLE9BQVJ5USxJQUFRelE7R0FBMEQ7WUFFbEY2dkQsWUFBVXAvQyxHQUFHeFEsS0FBS0Q7SUFDcEIsR0FBTyxnQ0FEUUMsS0FBS0Q7S0FFcEIsT0FKRW1xQyxnQkFFVTE1QixHQUFHeFEsS0FBS0Q7SUFDcEI7R0FDMkI7WUFHekI4dkQsUUFBTXIvQyxHQUFHeFEsS0FBS0Q7SUFDaEIsS0FBRyxnQ0FEUUMsS0FBS0Q7S0FPWCxXQWRIbXFDLGdCQU9NMTVCLEdBQUd4USxLQUFLRDtJQU1UOzRCQUFpQyxXQXJpRHBDdWEsV0EraERZdmE7S0FNVCx1QkFBUyxXQXJpRFp1YSxXQStoRE90YTtLQUlQOztHQUdpQztZQVFqQzh2RCxTQUFTejVDLEtBQXVCK3JDO0lBQVUsR0FBakMvckM7U0FBaUJDLE1BQWpCRCx5QkFBaUJDOztTQUFqQjZyQztJQUFpQyxPQXgzQzFDenlDLE9BdzNDZ0MweUMsU0FBdkJEO0dBQStEOzs7Ozs7Ozs7Ozs7Ozs7OztPQTdpRHZFL25DO09BbUJIL0o7T0FhQXk4QjtPQXV3QkFsaUI7T0FqdkJBdEc7O09BaXRCQS9UO09Bd0JBdVk7T0FDQUc7T0FuQ0F2VztPQUtBSztPQXlCQTRWO09BQ0FDO09BbEhBVztPQU1BRDtPQXBKQWhaO09BK05Ba1o7T0FrQ0FMO09BQ0FFO09BVEF6WTtPQWdCQXVrQjtPQURBRDtPQURBaUo7T0FEQXZKO09BREFHO09BM3lCRzdlO09BUURnTDtPQUNBNUc7T0FpaEJGckk7T0FDQUQ7Ozs7Ozs7Ozs7OztPQXFnQ0EyOUM7T0FHQUM7T0FLQUM7O09BcGRBajFDO09BdGtDRTR3QjtPQVNGbnhCOzs7O09Bc2dCQW5LOzs7O09BcGVBbXhDOzs7Ozs7UUF3Y0l0OUI7UUFTQUM7UUF6Q0FrYjtRQUNBaW5CO1FBQ0NqbUI7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBd0NENkQ7UUFDQTdIO1FBTUEycUI7UUFDQUM7UUFOQU47UUFDQUM7UUFDQUM7UUFDQUM7UUFDQUM7T0FoWkozRjtPQW5EQVM7T0E2REFPO09BdERBTjtPQWlEQUs7T0F4QkFGO09Ba0NBSTtPQTNCQUg7O1FBdUNFM2xDO1FBMjVDQTB6QztRQXA1Q0ExTjtRQUNBRDtRQXlFQVc7UUFFQS9CO1FBS0FpQztRQVNBQztRQStCQUU7UUFvQkFLO1FBZ0NBSTs7T0E4RkZxQjtPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQUNBQztPQW9PQWlEO09BNUdBaFg7T0FNQTk5QjtPQW1HQTQwQztPQUNBQztPQXpGQXZCO09BVUFJO09BVUFDO09BS0FFO09BK0JBUztPQUNBQztPQUVBSTtPQXVEQVE7T0F5QkFDO09Bb0JBSTtPQVJBRjtPQWtCQUc7T0F1QkFyNEM7T0FWQUM7T0FzQ0F1cEI7T0FvRkFrQjtPQXdCQWhIO09BMEJBK0Y7T0F0R0E2dUI7T0FRQUM7T0E2SUFXO09BZEFIO09BTUFDO09BZEFIO09Ba0JBSTtPQWRBSDtPQS9RQTNsQjtPQURBN0g7T0FKQXdzQjtPQUpBRDtPQW1aRXlDO09BREFEO09BS0FLO09BREFEO09BREFEO09BREFEO09BS0FLO09BREFEO09BaE5GbkM7O09BME9BcUM7T0FFQUM7O1FBa0hFcUI7UUF0RUFaO1FBMEVBYTtRQXdHQU07UUExRUFMO1FBOEVBTTtRQXNDQVM7UUFPQUM7UUFPQUM7UUF1Q0FJO1FBQ0FDO1FBbUNBSTtRQUlBQztRQXhFQVQ7UUFrQkFFO1FBaUJBRztRQW1CQUU7UUFnREFJO1FBQ0FDO1FBTUFFO1FBUUFFO1FBSkFEO1FBS0FFO1FBd0JBSTtRQU5BRDtRQWdCQUU7OztFakUzaERQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJa0VpQk83MEM7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWJGc21DO0lBS0VqZ0M7SUFDQTVHO0lBQ0NGO0k5Q2lDSDNLO0lBR0E1STtJQUNBbUo7SUFDQU47SUFDQU87SUFDQXVRO0lBQ0EzUDtJQUNBQztJQUVBMlA7SUFDQXpPO0lBQ0FDO0lBQ0F5TztJQUNBQzs7Ozs7Ozs7O1k4Q3pDRS9GLEdBQUczTSxLQUFJdUM7SUFBaUMscUI5Q3NDMUN3QixXOEN0Q1N4QjtJQUFpQyxzQ0FBckN2QztHQUFrRDtZQVFuRDZoRCxTQUFRbmdELEtBQU0sa0I5Q3VCbEJELFE4Q3ZCWUMsS0FBZ0I7Ozs7Z0RBQXhCbWdELFU5QzZCSnJ2Qzs7Ozs7O29EQVJBNVosUzhDckNFeVQ7cURBUUFNLElBREFDOzs7WUFnQ0lrMUMsU0FBUXBnRCxLQUFNLGtCOUNBcEJELFE4Q0FjQyxLQUFnQjs7SUFDeEIyQztJQUNBMDlDO0lBUEFybUM7Ozs7WUFNQXJYLFFBREF5OUMsVUFFQUM7WUFHTjMxQyxpQkFBb0IsU0FBRTtZQUV0Qm5LLEtBQUs2UyxHQUFHdFM7SUFDVixHQURPc1MsT0FFRixnQ0FGRUE7SUFHQztLQUFKdlMsSUFBSSxXOUNWTmQsUThDT0txVDtLQUlNLGtDQUpOQTtLQUdDOztTQUNSdFo7OzRCQURJK0csR0FDSi9HLEdBQ2lCLFdBTFBnSCxHQUlWaEg7Ozs7OztJQUdBLE9BSkkrRztHQUlIO1lBR0NtN0MsYUFBYW40QztJQUNQLElBQUpoRCxJQUFJLFc5Q2xCTmQsUThDa0JhLHlCQURBOEQ7SUFFZixhQUFxQi9KLEdBQUV1VyxHQUFLLHNCQUR4QnhQLEdBQ2lCL0csR0FBRXVXLEdBQWM7SUFBckMsMEJBRmV4TTtJQUVmLE9BREloRDtHQUVIO1lBR0NGLFFBQ1dFO0lBQWI7S0FBZWd1QixNQUtSLGlEQUxNaHVCO0tBQUUvRztLQUFFc2Y7SUFDZjtZQURhdGYsR0FFUixPQUZVc2Y7S0FHSztNQUhMOFIsa0NBQUpycUIsR0FBRS9HLElBQUVzZjtNQUFGelQsTUFHRCw0QkFIQzdMOztNQUFFc2Y7O0dBS087WUFHdEJTLFNBQVNoWjtpQkFBa0MvRyxHQUFLLDZCQUF2QytHLEdBQWtDL0csR0FBbUI7SUFBeEIsd0RBQTdCK0c7R0FBc0Q7WUFDL0QwTyxNQUFJMU8sR0FBR0MsR0FBSSxrQjlDOUJYSSxLOEM4Qk9KLEdBQUhELEdBQWU7WUFDbkJ5L0MsT0FBS3ovQyxHQUFHQyxHQUFJLGtCOUM5QlpLLE04QzhCUUwsR0FBSEQsR0FBZ0I7WUFFckJELEtBTUVDLEdBQUdOLE1BQU1PO0lBQUssSUFMQ2QsMkJBS2ZhLElBTG9CeWEsU0FBSWxDLE1BS3JCN1k7SUFKTDtRQURzQithLFFBQUx0YixLQUVaLE9BRnFCb1o7S0FHUztNQUhUOFIsUUFHUyxXQUV4QnBxQixHQUxlc1ksMkJBS3hCdlksR0FMb0J5YTtjQUdHLDRCQUhIQTs7TUFBSWxDOztHQUsyQjtZQUdyRHNSLE1BTUU3cEIsR0FBR04sTUFBTU87SUFBSyxJQUxDZCwyQkFLZmEsSUFMb0J5YSxTQUFJbEMsTUFLckI3WTtJQUpMO1FBRHNCK2EsUUFBTHRiLEtBRVosT0FGcUJvWjtLQUdTO01BSFQ4UixRQUdTLFdBRXhCcHFCLEdBTFd3YSxLQUFJbEMsMkJBS3hCdlksR0FMb0J5YTtjQUdHLDRCQUhIQTs7TUFBSWxDOztHQUsyQjtZQUdyRG9nQyxHQUFJekksUUFBUUMsYUFBWXp5QztJQUMxQjtLQUFhLHVEQURhQTtLQUMxQjs7OztNQUNLLG1EQUZxQkEsR0FDMUJ6RSxJQURNaTNDOzZCQUFvQnh5QyxHQUMxQnpFLEdBRGNrM0M7TUFDZDs7Ozs7O0dBRUk7WUFHRnlJLFNBQVUxSSxRQUFRQztJQUNwQiwrQkFEWUQ7S0FFRCxrQkEzR1RTLHFCbEVKTDttQ2tFNkd1QlI7S0FJZjtJQUVHLHlDQU5JRCxRQUFRQztnQkFPRixrQkFoSGhCUSxxQmxFSkw7UWtFcUhZUDtJQUNDO2FBbEhSTztzQkFrSGFqekM7Y0FDVDtlQUFhLHVEQURKQTtlQUNUOzs7OztrQkFEU0E7a0JBQ1R6RTs7b0JBRkdtM0M7b0JBR3dDLGdEQUZsQzF5QyxHQUNUekU7Ozs7Ozs7YUFFSTtHQUFFO1lBR1ZzZ0MsUUFBUXY1QixHQUFHdzVCLEtBQUtDO0lBQU8sMENBQVpELEtBQUh4NUI7SUFBZSw2Q0FBZkEsR0FBUXk1QjtHQUE0QjtZQUM1Q0MsZ0JBQWdCMTVCLEdBQUd4USxLQUFLRDtJQUFNLE9BQUcsZ0NBQWpCeVEsR0FBR3hROztjQUF1QyxnQ0FBMUN3USxHQUFRelEsT0FBUnlRLElBQVF6UTtHQUEwRDtZQUVsRm9xQyxVQUFVMzVCLEdBQUd4USxLQUFLRDtJQUNwQixHQUFPLGdDQURRQyxLQUFLRDtLQUVwQixPQUpFbXFDLGdCQUVVMTVCLEdBQUd4USxLQUFLRDtJQUNwQjtHQUMyQjtZQUd6QnFxQyxNQUFNNTVCLEdBQUd4USxLQUFLRDtJQUNoQixLQUFHLGdDQURRQyxLQUFLRDtLQU9YLFdBZEhtcUMsZ0JBT00xNUIsR0FBR3hRLEtBQUtEO0lBTVQ7NEJBQWlDLFdBaElwQ3VhLFdBMEhZdmE7S0FNVCx1QkFBUyxXQWhJWnVhLFdBMEhPdGE7S0FJUDs7R0FHaUM7WUFHbkNxaEQsU0FBVXAyQixLQUFLdGIsS0FBSWEsR0FBRWljO0lBQ3ZCO0tBQ0U7OztTQUZVeEI7U0FBS3RiOzs4QkFBSWE7S0FDWjhhO0tBSUlzZ0I7S0FEVDNQLE9BQU8sNEJBQ0UyUCxPQUpKdGdCO0tBSUk3aEI7SUFDWDtlQURXQSxJQURUd3lCOztNQUdhOzRCQVBJenJCLEdBS1IvRztPQUVQLHFDQVBpQmdqQjtNQU9qQjtPQUFrQyxJQUYzQm5YLE1BRTJCLDRCQUYzQjdMOzs7Ozs7O0tBRVA7O0dBRUU7Ozs7Ozs7Ozs7Ozs7Ozs7O09BOUlKeVg7T0FDQTVHO09BQ0NGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FpSEgydkI7T0FHQUk7T0FLQUM7O085QzNFQW40QjtPQURBRDs7TzhDRkFxSTs7O085Q0xBM0s7T0FFQThRO084QytCQXRCO09BQ0Erd0M7TzlDbkNBamdEO084Q1FBRTtPQVVBeTdDOzs7TzlDaEJBMTdDO084Q3FEQWs1QztPQU1BQztPQXJDQTk0QztPQVNBa1o7T0FJQWpaO09BU0E4cEI7T0FnREFnbkI7TzlDbEdBNXhDO09BY0FpUjtPQUNBQzs7O0VwQjNETDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SW1FUUt1dkM7Ozs7Ozs7Ozs7Ozs7O1lBc0hJQyxVQUVzQkM7SUFEM0IsSUFDa0NDO0lBQ25DO0tBQU07TUFENkJDO1FBQzdCOzZCQXpISkosa0JBd0hpQ0csaUJBQVBEO2NBQU9FO01BT25DOzt1Q0FQNEJGO01uRWhJL0I7O2NtRWdJc0NFO01BaUJuQzs7dUNBakI0QkY7TW5FaEkvQjs7S21Fc0owQixXQXRCS0E7U0FBT0M7O0dBREE7NEJBRDdCRjs7O0VuRTlIVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WW9FS0tJLGdCQUFnQjF3RCxHQUFFK1QsR0FBRUMsR0FBRTdCO0lBS3RCLHFCQUxzQkEsV0FBTm5TO0lBQ2xCLHVDQURvQitULEdBQUVDO0dBTWxCO0dBT21CO0lBSHJCMjhDO0lBR0FDLHFCQUFxQjtJQUZyQkM7SUFDQUM7YUFGQUg7SUFJSzs7SUF1QkRJO0lBQ0FDO0lBckJKQztJQUNBQztJQUNBQztJQUNBQztJQUdBQztJQUNBQzs7O1lBTUFDLHdCcEVuQ0w7WW9Fb0NLQyx3QnBFcENMOztJb0VzQ0tDO01BdkJBZDt5QkF5QlksU0FBSTs7U0FJWjN3RDtTQUFLOzZDQUZMK3dELFdBRUEvd0Q7OztlQUErQiw2QkFBL0JBLEdBREFneEQ7OztRQUNxRDtZQTdCekRMOzhCQWtDWSxTQUFJOztJQUNiO0tBQ0N4b0Q7S0FDQUQ7O2dCQUNBbEk7UUFBSzs0Q0FGTG1JLE9BRUFuSTtxQkFBaUMsNkJBQWpDQSxHQURBa0k7O09BQ3lEO1lBRzdEd3BELGFBQWExeEQ7SUFDZixPQW5CRXl4RCw4QkFrQmF6eEQ7R0FDOEQ7WUFHM0UyeEQsYUFBYTN4RCxHQUNmLFdBRGVBLGdCQUM4RDtZQUczRTR4RCxpQkFBaUI1eEQ7SUFDbkIsT0EzQkV5eEQsOEJBMEJpQnp4RDs7Y0EzRGpCMHdELGdCQTJEaUIxd0Q7R0FDcUU7WUFHdEY2eEQsaUJBQWlCN3hEO0lBQ25CLFdBRG1CQSxTQS9EakIwd0QsZ0JBK0RpQjF3RDtHQUNxRTtNQXREdEYyd0Q7SUE0REs7R0FLRztJQUpSbUI7SUFDQUM7SUFHRTV4RCxNQUFNO0lBQ05ELE1BQU07WUFGUjh4RCw4QkFHRWh5RDtJQUFLO3dDQUZMRyxLQUVBSDtpQkFBaUMsNkJBQWpDQSxHQURBRTs7R0FDeUQ7WUFHM0QreEQsYUFBYWp5RDtJQUNmLE9BUEVneUQsOEJBTWFoeUQsU0FDOEIsb0JBRDlCQTtHQUM4RDtZQUczRWt5RCxpQkFBaUJseUQ7SUFDbkIsT0FYRWd5RCw4QkFVaUJoeUQ7Y0FDcUIsb0JBRHJCQTtjQXBGakIwd0QsZ0JBb0ZpQjF3RCx5QkE3RGpCcXhEO0dBOERzRjtNQTNFdEZWLGVBR0FDO0lBOEVLO1lBQ0x1QixzQnBFakdMO1lvRWtHS0MsNEJwRWxHTDtNb0VrQkt4QixzQkFIQUQ7OEJBdUZZLFNBQUk7O0lBQ2I7S0FDQ3BwRDtLQUNBRDs7Z0JBQ0F0SDtRQUFLOzRDQUZMdUgsT0FFQXZIO3FCQUFxQyw2QkFBckNBLEdBREFzSDs7T0FDaUU7WUFHckUrcUQsaUJBQWlCcnlELEdBQ25CLFdBRG1CQSxnQkFDa0U7WUFHbkZzeUQscUJBQXFCdHlEO0lBQ3ZCLFdBRHVCQTs7Y0E1R3JCMHdEO2VBNEdxQjF3RCw2QkFwRnJCc3hEO0dBdUY2QjtHQVdyQjtJQUpSaUI7SUFDQUM7SUFHRXJzRCxRQUFNLG9CQXJGSjRxRDtJQXNGRjdxRCxRQUFNLG9CQXJGSjhxRDtZQW1GSnlCLCtCQUdFenlEO0lBQUs7d0NBRkxtRyxPQUVBbkc7aUJBQWlDLDZCQUFqQ0EsR0FEQWtHOztHQUN5RDtZQUczRHdzRCxlQUFlMXlEO0lBQ2pCLE9BUEV5eUQsK0JBTWV6eUQsU0FDOEIsb0JBRDlCQTtHQUNnRTtZQUcvRTJ5RCxtQkFBbUIzeUQ7SUFDckIsT0FYRXl5RCwrQkFVbUJ6eUQ7Y0FFaEIsb0JBRmdCQTtjQW5JbkIwd0QsZ0JBbUltQjF3RCw2QkE1R25CcXhEO0dBK0cyQjtXQXpIM0JUO0lBa0lLO1lBQ0xnQyx3QnBFckpMO1lvRXNKS0MsOEJwRXRKTDs7O01vRWtCS2pDO3lCQXdJWSxTQUFJOztTQUlaNXdEO1NBQUs7NkNBcEhMK3dELFdBb0hBL3dEOzs7ZUFBcUMsNkJBQXJDQSxHQW5IQWd4RDs7O1FBbUhpRTtZQUdyRThCLG1CQUFtQjl5RCxHQUNyQixXQURxQkEsZ0JBR1o7WUFHUCt5RCx1QkFBdUIveUQ7SUFDekIsV0FEeUJBOztjQWxLdkIwd0Q7ZUFrS3VCMXdELGlDQTFJdkJzeEQ7R0E2SStCO01BeEovQlY7SUE4Sks7O0lBQ0xvQztJQUNBQztZQWhLQXJDO1FBa0tBc0MsaURBRVksU0FBSTs7SUFFTjtLQUFOL3JELFFBQU0sb0JBaEtWZ3FEO0tBaUtJanFELFFBQU0sb0JBaEtWa3FEO0tBMkpBOEI7Z0JBTUlsekQ7UUFBSzs0Q0FGTG1ILE9BRUFuSDtxQkFBaUMsNkJBQWpDQSxHQURBa0g7O09BQ3lEO1lBRzdEaXNELG1CQUFtQm56RDtJQUNyQixPQVZFa3pELCtCQVNtQmx6RCxTQUVYLG9CQUZXQTtHQUdaO1lBR1BvekQsdUJBQXVCcHpEO0lBQ3pCLE9BaEJFa3pELCtCQWV1Qmx6RDtjQUVwQixvQkFGb0JBO2NBOUx2QjB3RDtlQThMdUIxd0QsaUNBdkt2QnF4RDtHQTBLK0I7R0FRdkI7SUFBTjlxRCxRQUFNLHVCQXhMUjBxRDtJQXlMRTNxRCxRQUFNLHVCQXhMUjRxRDtZQXNMQW1DLCtCQUdFcnpEO0lBQUs7d0NBRkx1RyxPQUVBdkc7aUJBQWlDLDZCQUFqQ0EsR0FEQXNHOztHQUN5RDtZQUczRGd0RCx1QkFBdUJ0ekQ7SUFDekIsT0FQRXF6RCwrQkFNdUJyekQ7O2NBOU12QjB3RCxnQkE4TXVCMXdELDJCQXZMdkJxeEQ7R0F3THdFO1lBS3hFa0MsdUJBQXVCcnZELE9BQU9zdkQsV0FBV0M7SUFDM0MsSUFBSUMsNkNBRHFCeHZEO09BQ3JCd3ZELGdCQUR1Q0QscUJBR3RDLE9BSG9CdnZEO0lBTWYsNEJBTmVBO3lDQUtuQnl2RDs7SUFLSjtLQUFJQztPQUxBRCxXQUs4Qiw0QkFUaENEO0tBVW1CLGtDQURqQkU7S0FDQUMsaUJBQWlCLGlDQVhvQko7S0FZckNLLGdCQUFnQiw0QkFYbEJKLGNBVUVHO0tBRUEzd0QsU0FBUywyQkFEVDR3RDtLQUVBQyxnQkFBZ0IsNEJBYmxCTDtLQWNFTSxpQkFBaUIsNEJBSGpCRjtLQUlBRyxnQ0FoQnFDUjtLQWlCckNTLGtCQVpBUDtJQXNCRjtRQVZFTyxtQkFIQUg7ZUFFQUU7T0FLQSwyQkFSQS93RCxRQUVBOHdELGVBZjBCUjtPQXNCMUIsNkJBUEFRO09BQ0FDLCtCQWhCcUNSOztNQXdCViwwQkF4QlJ2dkQsT0FjbkI2dkQ7TUFVRiwyQkFYRTd3RCxRQUVBOHdEO01BVUYsNkJBWEVEO01BWUYsNkJBWEVDO01BWUYsNkJBWEVDOzs7UUFYQU47TUF3QmdDLDBCQTdCYnp2RDtNQTZCTiwyQkFoQmJoQjs7S0FnQmEsa0NBaEJiQTs7R0FpQjhEO1lBR2xFaXhELGlCQUFpQmp3RCxPQUFPc3ZEO0lBQzFCLE9BbENFRCx1QkFpQ2lCcnZELE9BQU9zdkQ7R0FDb0M7WUFHNURZLG1CQUFtQmx3RCxPQUFRLE9BSjNCaXdELGlCQUltQmp3RCxXQUE2QztPQUNoRW13RDs7UUE0Q0lydEQsZ0JBRUNxUCxvQkFJQ21IO0lBQ0osU0FGR3hELEtBRUNoYSxHQUFLLGtCQURMd2QsTUFDQXhkLEdBQVc7UUFLYnl6RDthQUVBdGhELFVBQVlxaEQsV0FBVTdpRDtLQUN4QixHQURjNmlEOztPQUlMYyxjQUpLZDtPQUNWZTtrQkFJSTVqRDtVQUFLLE9BckdmNGlEO21CQXFHc0MsaUJBQTVCNWlELElBREMyakQsYUFOUGI7U0FPaUY7O1VBSi9FYztLQU1ELG9CQVBxQjVqRDtNQU9TLHFCQU43QjRqRCxhQU15QyxpQkFQckI1akQ7TUFPUzs7S0FBa0MscUJBTi9ENGpELGFBRG9CNWpEO0tBTzJDO0lBQWE7YUFHOUU2akQsWUFBVTdqRCxHQUFJLE9BVmR3QixhQVVVeEIsR0FBZ0M7YUFDMUN5MkIsY0FBZ0I1d0IsS0FBaUI3RjtLQUFJLEdBQXJCNkYsU0FBWUMsTUFBWkQsb0JBQVlDLGNBQVorOEM7S0FBcUIsT0FYckNyaEQsY0FXZ0JxaEQsWUFBaUI3aUQ7SUFBMkI7YUFFNUQ4akQsUUFBUXo0QztLQUNWLDZDQURVQTtJQUM0RDthQUdwRTA0Qyx5QkFBeUIxNEM7S0FDM0IsYUFBdUNtRSxHQUFLLGlDQUFMQSxPQUFzQjtLQUFqRCxzQ0FEZW5FO0tBQ2Y7SUFBbUQ7YUFHN0Q1SixVQUFVNEo7S0FFRixJQUFOMjRDLE1BQU0sZ0NBRkUzNEM7S0FHWixvQkFBd0MsT0FBeEMsOEJBREkyNEMsS0FDbUQ7S0FBMUMsSUFBVGhtQyxTQUFTO1FBRFRnbUMsbUJBUUMsT0FsQkhGLFFBUVV6NEM7VUFHUjJTLFFBSVEsT0FmVjhsQyxRQVFVejRDO2lCQUdSMlM7O01BS3lCLElBQWY0WCxpQkFBZSxNQVozQm11Qix5QkFZWW51QjtNQUFlOztTQUNmcXVCO0tBQVMsT0FickJGLHlCQWFZRTtJQUNFO0lBSWhCO0tBREdyNkMsaUJBQ0g7Z0RBZEVuSSxXQVhBb2lEOzs7Ozs7O2FBd0JDajZDO2FBaEREdlQ7YUFFQ3FQO2FBR0EyRDthQThCRDVIO2FBWEFvaUQ7YUFDQXB0Qjs7Ozs7T0E1UUpzcUI7T0FRQUU7T0E1QkFKO09Bd0NBTTtPQXFCQUs7T0FyQ0FSO09BUUFFO09BakNBTjtPQXdGQWdCO09BMEJBSztPQWhFQVg7T0FJQUM7T0FaQUg7T0F1REFXO09BSUFDO09BWkFIO09BaUVBVztPQU1BQztPQWxCQUo7T0FrQ0FNO09BTkFEO09BaEdBaEI7T0FJQUM7T0FmQUY7T0ErREFVO09BTUFDO09BakJBRjtPQTRCQUk7T0FuS0F0QztPQUNBRTtPQUNBQztPQUNBRjs7WUF1UEU2QztpQkFFQXJzQixjQUFnQjV3QixLQUFpQjdGO1NBQ25DLEdBRGtCNkYsU0FBWUMsTUFBWkQsb0JBQVlDLGNBQVorOEM7U0FDbEIsT0FuREFEO2tCQW1EdUIsaUJBRFk1aUQsSUFBakI2aUQsV0FGaEJDO1FBR2tFO2lCQUdsRWg1QyxVQUFVOUo7U0FDWjtVQUFJdEMsSUFBSSxpQkFESXNDO1VBQ1J3RTswQkFqQkprL0M7ZUFpQklobUQ7ZUF2REprbEQsdUJBdURJbGxELE9BUEZvbEQ7U0FRRixXQURJdCtDO1FBSXNCO21CQVR4Qml5QixlQUlBM3NCOzs7T0FoQkY0NUM7T0F0Q0FkO09BaUNBWTtPQUlBQzs7OztFcEU5UEw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R3FFaUZHOztJQTJJRVM7O0lBc0VBQzs7Ozs7O0lBclJBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1FQUMsK0JBQ0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXZFRUM7OztLQWdOSzs7S0F2SUxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUVNOztLQUZOQTtPQUVNLDRCQXhFTkg7O1FBc0VBRzs7SUE0SUFDO0lBc0VBQztJQW1FQUM7OztPQTlWQUo7T0FHQUY7T0FtRUFDO09BR0FFO09BeUlBTDtPQUdBTTtPQW1FQUw7T0FHQU07T0FtRUFDOzs7O0VyRXhXTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lzRUdLL21EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBQ0FnbkQ7SUFBdUI7R0FBcUQ7WUFDNUVDLGdCQUFjLDBDQUFnRDtZQU05REMsUUFBUUMsTUFBS0M7SUFDZixHQURlQSxjQVBiSjtrQkFTQyw2QkFGT0c7O29CQUFLQzs7OztNQUlHOzt1REFKSEE7bUJBSVIsNkJBSkdEOzs7O1lBTlJGO0lBWUYsMENBTlVFLE1BQUtDO0dBTWU7O1lBWTVCQyxVQUFVRixNQUFLQztJQUNqQixHQUNHLGNBRmNBLGdCQXpCZko7SUE0QkU7NEJBSFFHO0tBR1IsYUFBYSxjQUhMQTtJQUdLO0tBQ2IsMkJBSmFDO0tBSWI7OztNQUNJLG9DQUxJRDtNQUtKOztrQ0FMU0M7O1VBTU47WUFOQ0Q7OztNQU1EOzs7T0FFSCx3QkFSSUE7T0FRSjs7bUNBUlNDOztXQVNOO2FBVENEOzs7Ozs7Ozs7SUFTRCxRQWpDVEY7SUFvQ0YsNENBWllFLE1BQUtDO0dBWWU7WUFHOUJFLG1CQUFtQkgsTUFBS0M7SUFDMUIsR0FDRyxjQUZ1QkEsZ0JBeEN4Qko7SUEyQ0MsMkNBSGtCRztJQUdsQjtLQUNDLDJCQUpzQkM7S0FJdEI7OztNQUVLO2lDQU5pQkE7T0FNakI7YUFERixpQ0FMY0Q7Ozs7SUFLZCxRQTVDTEY7SUFnREYsNENBVHFCRSxNQUFLQztHQVNNO0dBdUZqQjtrQkFqSWJGLFNBa0JBRyxXQWVBQzs7OztpQkFvQ0U3d0QsT0FBTS9FLEdBQUVDO1NBQ1YsR0FBRyxrQkFET0E7VUFNTiwyQkFOTUE7VUFHUixXQWhGRnFPLG1CQWtGSSxpQkFMSXRPOztTQVFHLElBQVA2MUQsT0FBTyxrQkFSSDcxRCxHQUFFQztTQVNQLHlCQURDNDFEO21CQUNnQixpQkFEaEJBLE1BUk01MUQ7bUJBUU40MUQ7UUFDa0M7UUFHOUIsSUFBTkMsTUFBTTtpQkFFTmgyQyxTQUFPOWYsR0FBRUM7U0FDWCxHQUFHLGtCQURRQTtVQU1QLDJCQU5PQTtVQUdULFdBOUZGcU8sbUJBZ0dJLGlCQUxLdE87O1NBUU4sdUJBUk1BLFdBUW1DLHdCQVJuQ0EsR0FBRUM7U0FRTywyQkFSVEQsR0FGUDgxRCxNQVVlLDRCQVJONzFEO1NBRkgsNkJBQU42MUQ7UUFVK0M7aUJBSS9DOTFDLFNBQU9oZ0IsR0FBRUM7U0FBSSxJQUFjLHVCQUFsQkEsSUFBSSx1QkFBTkQ7U0FBb0I7UUFBVTtpQkFFckMrMUQsV0FBV25zRCxHQUFrQm9zRDtTQUFjLFVBNUIzQ2p4RCxPQTRCVzZFLEdBQWtCb3NEO1NBQWMsd0JBQWhDcHNEO1FBQTZDO2lCQUV4RHFzRCxTQUFTcnNELEdBQWtCb3NEO1NBQ2IsSUFBWkUsWUEvQkZueEQsT0E4QlM2RSxHQUFrQm9zRDtTQUUxQixxQkFEQ0UsbUJBQ3FCLE9BRmR0c0Q7U0FFcUIsMkJBRnJCQSxHQUFrQm9zRDtTQUVHLDZCQUQ1QkU7UUFDbUQ7aUJBR3JEQyxtQkFBbUJ2c0QsR0FBR3dzRDtTQUN4QixPQUFHLGtCQURrQnhzRDs7bUJBR2I7NEJBSGFBO3FCQVBuQm1zRCxXQU9tQm5zRCxHQUFHd3NEO3FCQUx0QkgsU0FLbUJyc0QsR0FBR3dzRDtRQUtPO2lCQUc3QkMsY0FBY3pzRCxHQUFrQm9zRDtTQUNsQztVQUFJRSxZQTVDRm54RCxPQTJDYzZFLEdBQWtCb3NEO1VBRTlCTSwwQkFBMEIsaUJBRklOLFNBQzlCRTtTQUVELHlCQURDSSx5QkFEQUo7bUJBR0MsaUJBSld0c0QsR0FFWjBzRDttQkFHQyxpQkFMVzFzRCxHQUNac3NEO1FBSWM7aUJBR2hCSyxNQUFRLy9DLEtBQWdCNU0sR0FBR3dzRDtTQUM3QixHQURVNS9DLFNBQU1DLE1BQU5ELGNBQU1DLGNBQU53b0M7U0FDVixvQkFEVUE7OztxQkFoQlJrWCxtQkFnQndCdnNELEdBQUd3c0Q7cUJBUjNCQyxjQVF3QnpzRCxHQUFHd3NEOztzQkFBbkJuWDtxQkF2QlI4VyxXQXVCd0Juc0QsR0FBR3dzRDtxQkFyQjNCSCxTQXFCd0Jyc0QsR0FBR3dzRDtRQUtrQjs7Z0JBeEQ3Q3J4RDtnQkFjQSthO2dCQVlBRTtnQkF5QkF1MkM7Z0JBaEJBSjtnQkFQQUo7Z0JBRUFFO2dCQWFBSTs7Ozs7RXRFM0hQOzs7Ozs7Ozs7Ozs7Ozs7SXVFZ0JPbGQ7SUFFQUM7SUFFQUU7SUFFQWtkO0lBZUFDOzs7O1lBNUJGQyxlQWVZMTJEO0lBRVo7S0FBSSttQjtPQUFJO1NBRkkvbUIsR0FFQSxlQUFDLCtCQUZEQSxPQVJWbTVDO0tBWUV0b0I7T0FBSTt3QkFGSjlKLEtBUkZxeUI7U0FVb0IsZUFBQywrQkFGbkJyeUIsU0FSRnF5QjtLQVlFdWQ7T0FBSTt3QkFGSjlsQyxLQUVTLCtCQUZUQSxVQVJGeW9CO0lBWUs7O2VBQUMsdUJBRkpxZCxLQVJGSDtHQVV1QjtZQUd6QkksZUFHWTUyRDtJQUFLLE9BN0JqQjAyRCxlQTZCZ0MsZUFBbUIsb0JBQXZDMTJELElBRFZ5MkQ7R0FDOEU7OztRQUdoRkksOEJBRW9CNzJELEdBQUssT0FSekI0MkQsZUFRb0I1MkQsR0FBK0M7OztLQUU5RDs7S0FKTDYyRDtnQkFHb0I3MkQsR0FBSyxPQW5DekIwMkQsZUFtQ3dDLG9CQUFwQjEyRCxJQUErQzs7Ozs7cUJ2RTVDeEU7T3VFbUNLNDJEO09BMUJBRjtPQWdDQUc7OztFdkV6Q0w7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WXdFVUt4a0Q7SUFBVyxzQkFDSixtQkFDQyxtQkFDRDs7R0FBRTtZQUdUc2U7SUFBTyxzQkFDQSxpQkFDQyxrQkFDRDs7R0FBRztZQUdWNXJCLE9BQU04UixLQUFFbEc7SUFBSyxJQUFtQix5QkFBeEJBLElBQWEseUJBQWZrRztJQUFjO0dBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQVoxQ3hFO09BTUFzZTtPQU1BNXJCOzs7RXhFdEJMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SXlFd0ZTaVc7SUFPQTg3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpTEUza0Q7O0lBeFFIa0U7SUFJQ21IOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQUNKLFNBRkd4RCxLQUVDaGEsR0FBSyxrQkFETHdkLE1BQ0F4ZCxHQUFXO0dBU2E7SUFOMUJxaEI7SUFDQTVHO0lBQ0NGO0lBSURveEIsZUFYQzN4Qix3QkFNRFM7SUFNQXpUO1lBd1BJK3ZELFlBdFBNMW9EO0lBQ1osSUFBSSxpQ0FEUUEsSUFDUjtnQkFDRyx1Q0FGS0E7R0FFb0M7R0FPNUI7SUFEcEJxTTtJQUNBczhDLG9CQUFvQiw0QkFEcEJ0OEM7SUFFQXU4QyxvQkFBb0IsNEJBRnBCdjhDO1lBR0FySSxlekVwQ0w7WXlFcUNLNmtELHlCekVyQ0w7WXlFdUNLNWtELFNBQVMxQjtJQUNYO01BQUcsZ0NBRFFBLEdBTFRvbUQ7U0FPQyxnQ0FGUXBtRCxHQUpUcW1EO1lBSVNybUQ7SUFPUCx1Q0FQT0E7SUFLVDtHQUdJOztvREF4QkY1SixTQU5BeVQ7OENBTUF6VCxTQU5BeVQ7Ozs7O3VEQStQSXRJOzs7SUF6TUZuSztJQUVDa2M7SUFJQ2l6QztJQW1MSkM7SUE3TUZ0QjtJQUNBdUI7R0EwQkUsU0FGR2x6QyxPQUVDbmtCLEdBQUssa0JBRExtM0QsUUFDQW4zRCxHQUFXO09BTWJzM0Q7WUFDQXZ5RCxtQnpFckZUO1l5RXNGU3l2RCxZQUFVNXFELEdBQUksdUNBQUpBLEdBQXlCO1lBQ25DMnRELFlBQVVscEQ7SUFBSTtJQUF5QixtQ0FBN0JBO0dBQWtDOzs7Ozs7U0FoQjVDckc7U0FFQ2tjO1NBR0FDO1NBVURxd0M7U0FDQStDO1NBeUtGSDtTQTNLRXJ5RDtTQURBdXlEO1NBSUF0OEM7Ozs2Q0FPQTg3QyxlQWlMRTNrRDs7WUF6S05xSSxpQkFBb0IsU0FBRTtZQUN0QjB2QixRQUFRdjVCLEdBQUd3NUIsS0FBS0M7SUFBTyxXQUFaRCxPQUFIeDVCLDhCQUFReTVCOztHQUE0QjtZQUM1Q0MsZ0JBQWdCMTVCLEdBQUd4USxLQUFLRDtJQUFNLE9BQWR5USxJQUFHeFEsWUFBSHdRLEtBQVF6USxNQUFSeVEsSUFBUXpRO0dBQTBEO1lBRWxGb3FDLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBQ3BCLEdBRGVDLE9BQUtELEtBRXBCLE9BSkVtcUMsZ0JBRVUxNUIsR0FBR3hRLEtBQUtEO0lBQ3BCO0dBQzJCO1lBR3pCcXFDLE1BQU01NUIsR0FBR3hRLEtBQUtEO0lBQ2hCLEdBRGdCQSxPQUFMQyxLQU9OLFdBZEhrcUMsZ0JBT00xNUIsR0FBR3hRLEtBQUtEO0lBTVQ7NkJBQWlDLFdBckdwQ3VhLFdBK0ZZdmE7S0FNVCx3QkFBUyxXQXJHWnVhLFdBK0ZPdGE7S0FJUDs7R0FHaUM7WUFRbkMyckMsS0FBS2xpQyxHQUFJLG1DQUFKQSxNQUFTO1lBQ2QySSxLQUFLM0ksR0FBSSxtQ0FBSkEsTUFBUztZQUNkNkgsT0FBTzdILEdBQUksT0FBSkEsRUFBSztZQWdJVm9JLFdBOUhLcEksR0FBSSxPQUFKQSxFQUFLOztJQUVaa0k7SUFDQUQ7SUFFQTJsRDtJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQUNBQztJQVZBQztZQXFIRUMsSUF6R0VuNEQsR0FBSSxvQ0FBSkEsR0FBUztZQUdibzRELElBQUlya0QsR0FBRUMsR0FBSSxvQ0FBTkQsR0FBRUMsR0FBVztZQUNqQmhHLFd6RXZKTDtZeUV3SktELFd6RXhKTDtZeUV5Sktrb0MsWUFBWWxpQyxHQUFFQyxHQUFJLG9DQUFORCxHQUFFQyxHQUFXO1lBQ3pCcWtELG9CQUFvQnRrRCxHQUFFQztJQUFJLG9DQUFORCxHQUFFQztHQUFXO1lBQ2pDc2tELFdBQVd2a0QsR0FBRUMsR0FBSSxvQ0FBTkQsR0FBRUMsR0FBVztZQUN4QnVrRCxRQUFReGtELEdBQUksb0NBQUpBLEdBQVU7WUFDbEJ5a0QsT0FBT3prRCxHQUFFQyxHQUFJLG9DQUFORCxHQUFFQyxHQUFXO1lBQ3BCeWtELFFBQVExa0QsR0FBRUMsR0FBSSxvQ0FBTkQsR0FBRUMsR0FBWTtZQUN0QjBrRCxRQUFRM2tELEdBQUVDLEdBQUksb0NBQU5ELEdBQUVDLEdBQVk7T0FDdEIya0Q7WUF3RkU3NEMsU0F2Rks5TCxHQUFFd0IsR0FBSSxrQkFEYm1qRCxLQUNPM2tELEdBQUV3QixHQUFXO09BS2xCZ3pCO1lBRUFvd0I7SUFDRjtHQUEyRDtZQUt6REMsVUFBVTc0RDtJQUNaLEdBRFlBLFFBTlY0NEQ7SUFRTTtLQUFKN3hDLE1BQUksNEJBRkkvbUI7S0FHRSxvQ0FEVittQjtLQUNBOEosTUFBSSw2QkFESjlKO0tBRVUsb0NBRFY4SjtLQUNBOGxDLE1BQUksNkJBREo5bEM7S0FFVSxvQ0FEVjhsQztLQUNBbUMsTUFBSSw2QkFESm5DO0tBRVUsb0NBRFZtQztLQUNBQyxNQUFJLDZCQURKRDtLQUVVLG9DQURWQztLQUNBQyxNQUFJLDZCQURKRDtLQUlVLG9DQUhWQztLQUdBQyxNQUFJLDZCQUhKRDtJQUlKLG1DQURJQztHQUNDO1lBSUhDLFdBQVdsNUQ7SUFDYixHQURhQSxRQXJCWDQ0RDtJQXVCWTt5Q0FGRDU0RDtLQUVUK21CLE1BQUksNkJBRksvbUI7S0FHQyxvQ0FEVittQjtLQUNBOEosTUFBSSw2QkFESjlKO0tBRVUsb0NBRFY4SjtLQUNBOGxDLE1BQUksNkJBREo5bEM7S0FFVSxvQ0FEVjhsQztLQUNBbUMsTUFBSSw2QkFESm5DO0tBRVUsb0NBRFZtQztLQUNBQyxNQUFJLDZCQURKRDtLQUlVLG9DQUhWQztLQUdBQyxNQUFJLDZCQUhKRDtLQUlBLG9DQURBQztJQUNBLG1DQURBQTtHQUNTO1lBR1hHLFFBQVFuNUQ7SUFDVixHQURVQSxRQWxDUjQ0RDtJQW9DSyx1Q0FGRzU0RDtpQkFFViw2QkFGVUE7R0FFUTtZQW1CaEJvNUQsV0FBV3h2RDtJQUNiLEdBRGFBO0tBRW1ELHdCQUFNLDZCQUZ6REE7S0FFUjtPQTNESDQrQjtPQTJEVzs7SUFDRTswQ0FIRjUrQjtLQUdiLG1DQWpNQThRO0lBaU1lO0dBQUs7WUFHbEIyK0MsVUFBVXp2RDtJQUNaLEdBRFlBO0tBRW1ELHlCQUFNLDZCQUZ6REE7S0FFUDtPQWpFSDQrQixTQWlFVzs7YUFGRDUrQixHQUdFO0lBQWtCO3lDQUFJLDRCQUh4QkE7SUFHb0IsbUNBdk1oQzhRO0dBdU0yQztPQU0zQ3V3QixzQkFDQXF1QjtxQnpFL09MOzs7Ozs7Ozs7O0d5RXVRNkI7OztPQWhPeEJobkQ7T0FIQUQ7T0EyT00wa0Q7T0FDQTVrRDswQnpFaFJYOzs7Ozs7Ozs7OztPeUU0UE9nbUQ7O09BSUFmO09BQ0FwbEQ7T0EzR0ZvbUQ7Ozs7Ozs7WUEySUVwNEMsU0FBTWhnQixHQUFFQztJQUNWLEdBRFVBO0tBTU4scUJBdkJFa1MsV0FpQklsUyxJQUtOLGlCQXRCRWtTLFdBaUJFblM7S0FHTjs7SUFLUyxJQUFQNjFELE9BbkpKdUMsSUEySVFwNEQsR0FBRUM7V0FRTjQxRCxrQkFSTTUxRCxRQVFONDFEO0dBQ2tDO1lBR3BDMzVCLFNBQU9sOEIsR0FBRUM7SUFDWCxHQURXQTtLQU1QLHFCQW5DRWtTLFdBNkJLbFMsSUFLUCxpQkFsQ0VrUyxXQTZCR25TO0tBR1A7O1dBSE9BLDRCQUFFQyxzQkFBRkQsR0FBRUM7R0FRc0M7WUFHL0NzRixTQUFPdkYsR0FBRUMsR0FBSSxPQUFjLDRCQUFwQkQsR0FBRUMsR0FBNEI7O0lBTXJDczVEOztJdkUxSkF0ekQ7SUFDQWxHO0lBQ0FHO0lBQ0FDOztjdUVpRkEyZixVQXNFQXk1QyxNQWxFQXBCLEtBSUFmLE1BaUNBcDNDLFVBWUFrYyxVQVdBMzJCO3FCekV4VFA7Ozs7OztPeUVrQlFnVjtPQXFCSGpJO09BSEFEO09BNk5FTDtPQWhJRlA7T0F6SEc0RTtPQUdBMkQ7T0FLRHFIOztPQStQSTAxQztPQUNBNWtEOzBCekVoUlg7O09FdUtPaFM7T0FEQUQ7T0FGQStGO09BQ0FsRztPdUU3REZtcUM7T0FHQUk7T0FLQUM7OztPQTFGRW9COzs7OztPQXdORlY7T0F2SUF6d0I7OztPQXBEQXM3QztPQUNBdUI7T0FrR0FlOzs7Ozs7T0F0QkE3bEQ7T0FEQXU1QjtPQWlDQTZzQjtPQUZBRjtPQURBRDtPQUVBRTtPQUhBSDtPQW1GQWU7T0FwRkFoQjtPQUZBcmlCO09BREFsb0M7T0FEQUM7T0FkQXlwRDtPQUVBRTtPQUVBRTtPQUNBQztPQUVBRTtPQUNBQztPQTVHQWY7T0FKQXg4QztPQW9HQTVJO09BQ0FEO09Bb0JBd21EO09Bb0JFUTtPQWVBSztPQXdDQUc7T0FOQUQ7T0FyQkFEOzs7O09BOENBcjVDO09Bc0VBeTVDO09BbEVBcEI7T0FJQWY7T0FpQ0FwM0M7T0FZQWtjO09BV0EzMkI7T0FqTEYyeUQ7T0EwSEVsbUQ7T0FoSUZQO09BT0ErbEQ7T0FFQUU7T0FFQUU7T0FHQUc7T0FFQUU7Ozs7RXpFakpMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lvRnFCV2p4RDtJQUNBQztJQUNBb2E7O1lBRVI5RyxlQVpNc0w7SUFBb0Isb0NBQXBCQTtHQUFxRDtZQTJCekQxVSxLQUFLYyxJQUFHQztJQUNWLElBQUlrbUMsTUFER25tQztZQUFHQztZQUNOa21DOztHQUVLO1lBR1ArK0IsUUFBUXhtRSxHQUFFQyxHQUFGRCxPQUFXLFdBQVRDLEdBQUZELGdCQUFlO1lBRXZCeW1FLGdCQUFnQnptRSxHQUFFb0QsR0FBR25EO0lBQ3ZCLElBQUl5bUUsYUFEYzFtRTtXQUFFb0Q7d0JBQUZwRCxPQUNkMG1FLHFCQUU4QztJQUExQixnQ0FIRHptRTtHQUc0QjtZQU0vQ3NuQyxlQUFXbmtDLGNBQUhxRSxxQkFBR3JFO1lBQ1h1akUsS0FBS3I0RCxJQUFLLGdDQUFMQSxJQURMaTVCLEtBQzZCO1lBQzdCcS9CLG9CQUFhbi9ELGNBQVMsV0FBVEE7WUFJZm8vRCxpQkFBaUJDLFlBQVk3bUU7SUFDL0IsSUFBSXltRSx1Q0FEZUksWUFKZkY7SUFEQUQsS0FLZUc7d0JBR2dCLE9BUi9CSCxLQU1BRCxZQUV3RDtJQUFwQyxnQ0FIT3ptRTtHQUc4Qjs7OztPQTdDckQ1SjtPQUNBQztPQUNBb2E7O09BRVI5RztPQWVFcEo7T0FNQWdtRTtPQUVBQztXQVNFbC9CLEtBQ0FvL0IsTUFDQUM7T0FJRkM7OztFcEYvREw7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJdUY4RFN4OEQ7SUFPQTg3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTdERHpnRDtJQUlDbUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBQ0osU0FGR3hELEtBRUNoYSxHQUFLLGtCQURMd2QsTUFDQXhkLEdBQVc7R0FTYTtJQU4xQnFoQjtJQUNBNUc7SUFDQ0Y7SUFJRG94QixlQVhDM3hCLGVBTURTO0lBTUF6UztJQTBQSW1LO0lBREFDO29EQXpQSnBLLFdBTkF5UztJQWlCRTI4Qzs4Q0FYRnB2RCxXQU5BeVMsV0FpQkUyOEM7Ozs7Ozt5REErT0VqbEQ7OztJQXBPRnZKO0lBRUNzYjtJQUlDaXpDO0dBQ0osU0FGR2h6QyxPQUVDbmtCLEdBQUssa0JBRExtM0QsUUFDQW4zRCxHQUFXO09BS2JrNkU7WUFDQTVpQixTdkYxRFQ7T3VGMkRTdnlEO1lBQ0F5dkQsWUFBVTVxRCxHQUFJLHVDQUFKQSxHQUEwQjtZQUNwQ210RCxZQUFVMW9EO0lBQUk7SUFBMEIsbUNBQTlCQTtHQUFtQzs7Ozs7O1NBaEI3Q3pGO1NBRUNzYjtTQUdBQztTQVVEcXdDO1NBQ0F1QztTQUpBbWpCO1NBRUFuMUU7U0FEQXV5RDtTQUlBdDhDOzs7NkNBT0E4N0MsZUE0TUUza0Q7O1lBcE1OcUksaUJBQW9CLFNBQUU7R0FDWDtJQUFYRSxXQUFXO0lBQ1hzOEMsb0JBQW9CLDRCQURwQnQ4QztJQUVBdThDLG9CQUFvQiw0QkFGcEJ2OEM7WUE0TUUyOUMsOEJ2RjFSUDtZdUZ5Uk9waUIsc0J2RnpSUDtZdUZ3Uk9xaUIscUJ2RnhSUDtHdUZtRmtCLElBb01YQztZQURBRyxrQnZGdFJQO1l1RnFST0YsaUJ2RnJSUDtZdUZvUk9DLGtCdkZwUlA7R3VGdUZlO0lBQ1Y1bUQ7SUFDQUM7SUFzS0VxbUQ7SUFwS0Zyc0I7SUFDQXY1QjtJQUNBNmxEO1lBbUtFdDRDLGN2RmhRUDtHdUY4Rlc7SUFDTnUzQztJQUNBdkI7SUFpS0Vxa0I7WUEvSkY5bkUsY3ZGbEdMO1l1Rm1HSzZrRCx3QnZGbkdMO1l1RnFHSzVrRCxTQUFTMUI7SUFDWDtNQUFHLGdDQURRQSxHQXRCVG9tRDtTQXdCQyxnQ0FGUXBtRCxHQXJCVHFtRDtLQXdCRyxPQUhNcm1EO0lBT1Asc0NBUE9BO0lBS1Q7R0FHSTtPQU9GNDNCO1lBRUFvd0I7SUFDRjtHQUEyRDtZQVF6REMsVUFBVzc0RDtJQUNiLEdBQUcsZ0NBRFVBLE9BVFg0NEQ7SUFXTTtLQUFKN3hDLE1BQUksZ0NBRksvbUI7S0FHVDZ3QixNQURBOUo7S0FFQTR2QyxNQURBOWxDO0tBRUFpb0MsTUFEQW5DO0tBRUFvQyxNQURBRDtLQUVBRSxNQURBRDtLQUlBRSxNQUhBRDtJQUlKLHVDQURJQztHQUNpQjtZQUluQkMsV0FBV2w1RDtJQUNiLEdBQUcsZ0NBRFVBLE9BeEJYNDREO0lBMEJNO0tBQUo3eEMsTUFGUy9tQjtLQUdUNndCLE1BREE5SjtLQUVBNHZDLE1BREE5bEM7S0FFQWlvQyxNQURBbkM7S0FFQW9DLE1BREFEO0tBRUFFLE1BREFEO0lBRUosT0FESUM7R0FDMEI7WUFHNUJHLFFBQVFuNUQ7SUFDVixHQUFHLGdDQURPQSxPQW5DUjQ0RDtJQXFDRixVQUZVNTRELElBRUgsZ0NBRkdBO0lBQ007R0FDaUI7WUFpQi9CbzVELFdBQVd4dkQ7SUFDYixHQUFHLGVBRFVBO0tBTU4sdUJBQU0sNkJBTkFBO0tBR1g7T0EzREE0K0IsU0E0REU7O0lBR1c7K0NBUEY1K0I7S0FPYixrQ0FyR0E4UTtJQXFHZTtHQUFLO1lBSWxCMitDLFVBQVV6dkQ7SUFDWixHQUFHLGVBRFNBO0tBTUwseUJBQU0sNkJBTkRBO0tBR1Y7T0F0RUE0K0IsU0F1RUU7O0lBR0Qsb0NBUFM1K0IseUJBUVA7SUFDVzs7MkNBQUksZ0NBVFJBO0lBU0ksbUNBbEhoQjhRO0dBa0gyQztZQU0zQ3d2QixRQUFRdjVCLEdBQUd3NUIsS0FBS0M7SUFBTywwQ0FBWkQsS0FBSHg1QjtJQUFlLDZDQUFmQSxHQUFReTVCO0dBQTRCO1lBQzVDQyxnQkFBZ0IxNUIsR0FBR3hRLEtBQUtEO0lBQU0sT0FBRyxnQ0FBakJ5USxHQUFHeFE7O2NBQXVDLGdDQUExQ3dRLEdBQVF6USxPQUFSeVEsSUFBUXpRO0dBQTBEO1lBRWxGb3FDLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBQ3BCLEdBQU8sZ0NBRFFDLEtBQUtEO0tBRXBCLE9BSkVtcUMsZ0JBRVUxNUIsR0FBR3hRLEtBQUtEO0lBQ3BCO0dBQzJCO1lBR3pCcXFDLE1BQU01NUIsR0FBR3hRLEtBQUtEO0lBQ2hCLEtBQUcsZ0NBRFFDLEtBQUtEO0tBT1gsV0FkSG1xQyxnQkFPTTE1QixHQUFHeFEsS0FBS0Q7SUFNVDs0QkFBaUMsV0FuTXBDdWEsV0E2TFl2YTtLQU1ULHVCQUFTLFdBbk1adWEsV0E2TE90YTtLQUlQOztHQUdpQztPQW9DakM2Ziw2QkFEQWtjO1lBREEzMkIsbUJ2RnZQUDtZdUZzUE9DLG1CdkZ0UFA7WXVGNk5Ld0ksS0FBS29LLGlCQTdITDA5QyxrQkE2SHNCO1lBQ3RCL25ELEtBQUtxSyxpQkE5SEwwOUMsa0JBOEhzQjtZQUN0QmlDLGFBQWFwbkQsR0FBSSxPQUFKQSxFQUFLO1lBRWxCc25ELGFBQWF0bkQsR0FBSSxPQUFKQSxFQUFLOztJQUVsQjJvRDtJQStCRXRuRDtJQTVCRlA7SUFDQTBzRDtJQUNBaWM7SUFDQTVpQjtJQUVBRTtJQUNBQztJQUNBMGlCO0lBQ0F6aUI7SUFDQUM7SUFDQXlpQjtJQUNBeGlCO1lBQ0FhLElBQUkza0QsR0FBRXdCO0lBQUksSUFBb0QsaUJBWDlEMm9ELFlBV00zb0QsSUFBeUMsaUJBWC9DMm9ELFlBV0lucUQ7SUFBaUIsa0JBZ0JuQmhDLFlBaEJtQjtHQUF3RDtZQVMzRXZNLFNBUkt1TyxHQUFFd0IsR0FBSSxPQURibWpELElBQ08za0QsR0FBRXdCLEdBQVc7OztJQVUyQjlQOzs7Ozs7Ozs7O1NBeEovQzRNO1NBSEFEO1NBOEtNRDtTQUNBRDtTQTNCSjNNO1NBQ0FEO1NBQ0EyMkI7U0FDQWxjO1NBT0FGO1NBSDZDL1o7Ozs7OztTQUU3Q295RDtTQUNBcjRDO1NBQ0FxNkQ7U0FDQW5vRTtTQXJLRm9tRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlKRTV5RDtPQUNBRDtPQUNBMjJCO09BQ0FsYztPQU9BRjtPQUxBcmE7T0FFNkNNOzs7Ozs7T0FFN0NveUQ7T0FDQXI0QztPQUNBcTZEOzs7O09BbUJBMWhCO09BQ0FEO09BQ0FFO09BQ0FIO09BQ0FEO09BQ0FyaUI7T0FDQW9pQjtxQnZGMVJQOzs7O091RmtCUTk5QztPQW1GSGpJO09BSEFEO09BZ0tFTDtPQTNCRm1zRDtPQS9ORzluRDtPQUdBMkQ7T0FLRHFIOztPQWdRSWpQO09BQ0FEOzs7Ozs7Ozs7Ozs7O09BM0VOKzNCO09BR0FJO09BS0FDOzs7T0F4TEVvQjs7Ozs7O09BdURGbnhCOzs7T0FvTEUyL0Q7T0FqS0Zya0I7T0FEQXVCO09BdUpFN3hEO09BQ0FEO09BQ0EyMkI7T0FHQXoyQjtPQUtBcWE7Ozs7T0FQQUU7T0E1SkZvNEM7O09BdUxFSztPQUNBRDtPQUNBRTtPQUNBSDtPQUNBRDtPQUNBcmlCOzs7Ozs7T0ExQkFraUI7T0FuS0Y1bEQ7T0FEQXU1QjtPQXVKQTZzQjtPQWtDRUY7T0FDQUQ7T0FDQUU7T0FDQUg7T0FwREZlO09BcURFaEI7T0FDQXJpQjtPQTNERmxvQztPQURBQztPQVlBd3BEO09BR0FHO09BR0FFO09BRUFDO09BbEJBQztPQUVBRTtPQTlIQWY7T0FyQkF4OEM7T0FXQTVJO09BREFEO09Ba01Fd21EOztPQTNKQVE7T0FlQUs7T0F5Q0FHO09BWEFEO09BbkJBRDtxQnZGekpQOzs7T3VGa1FPbm5EO09BNUJGUDtPQUdBK2xEO09BRUFFO09BWkFLO09BRUFFO09BYUFMO09BTkF3aUI7T0FLQUM7T0FHQUM7Ozs7RXZGaFBMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0kyRmdQU3QvRDtJQU9BODdDOzs7Ozs7Ozs7Ozs7Ozs7O0lBaFBEemdEO0lBSUNtSDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQUNKLFNBRkd4RCxLQUVDaGEsR0FBSyxrQkFETHdkLE1BQ0F4ZCxHQUFXO0dBU2E7SUFOMUJxaEI7SUFDQTVHO0lBQ0NGO0lBSURveEIsZUFYQzN4Qix3QkFNRFM7WUFPQXpULGtCM0Z2QlA7RzJGdUJpQjtJQWtRTm1MO0lBREFDO2lEQWpRSnBMLFNBUEF5VDs7SUFnQkZ1OEMsb0JBQW9CO0lBQ3BCQyxvQkFBb0I7SUFDcEIrNEI7SUFDQUM7SUFDQTUzQjtJQUNBcGlCO0lBQ0FxaUI7SUEwUEVDO0lBeFBGRztJQUNBRjtJQUNBQztJQUNBNW1EO0lBQ0FDO0lBeU5FcW1EO0lBdk5GcnNCO0lBQ0F2NUI7SUFDQW9tRDtJQUNBUDtJQUNBZDtJQUNBRDtJQUNBdkI7SUFxTkVzQjtJQW5ORi9rRDtJQUNBNmtEO0lBeEJBeDhDO1lBMEJBcEksU0FBUzFCO0lBQ1g7TUFBRyxnQ0FEUUEsR0F6QlRvbUQ7U0EyQkMsZ0NBRlFwbUQsR0F4QlRxbUQ7S0EyQkcsMkJBSE1ybUQ7SUFPUCxzQ0FQT0E7SUFLVDtHQUdJO1lBZ01GN0wsT0E3TEtpUCxHQUFFd0IsR0FBSSxrQkFwQmJtakQsS0FvQk8za0QsR0FBRXdCLEdBQVc7WUFJSjA2RSxRQUFRbHdGO0lBQUksc0NBQStCLGlCQUFuQ0E7R0FBaUQ7WUFFekRtd0YsUUFBUW53RjtJQUsxQixzQ0FBK0IsaUJBTExBO0dBS21CO1lBRzNCb3dGLFFBQVFwd0Y7SUFBSSxzQ0FBK0IsaUJBQW5DQTtHQUFpRDs7b0RBM0R2RWdILFNBUEF5VCxXQXlQQTI4Qzs7Ozs7O1lBMUtGNThDLGlCQUFvQixTQUFFO1lBQ3RCMHZCLFFBQVF2NUIsR0FBR3c1QixLQUFLQztJQUFPOzBCQUFaRCxLQUFIeDVCO0tBQWUsWUFBWSxlQUEzQkEsR0FBUXk1QjtJQUFtQjtHQUFTO1lBQzVDQyxnQkFBZ0IxNUIsR0FBR3hRLEtBQUtEO0lBQU0sT0FBRyxjQUFqQnlRLEdBQUd4USxhQUF1QyxlQUExQ3dRLEdBQVF6USxPQUFSeVEsSUFBUXpRO0dBQTBEO1lBRWxGb3FDLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBQ3BCLEdBQU8sZUFEUUMsS0FBS0QsTUFFcEIsT0FKRW1xQyxnQkFFVTE1QixHQUFHeFEsS0FBS0Q7SUFDcEI7R0FDMkI7WUFHekJxcUMsTUFBTTU1QixHQUFHeFEsS0FBS0Q7SUFDaEIsS0FBRyxpQkFEUUMsS0FBS0QsTUFPWCxXQWRIbXFDLGdCQU9NMTVCLEdBQUd4USxLQUFLRDtJQU1UOzRCQUFpQyxXQTlGcEN1YSxXQXdGWXZhO0tBTVQsdUJBQVMsV0E5Rlp1YSxXQXdGT3RhO0tBSVA7O0dBR2lDO1lBR25DNk4sS0FBS29LLFVBQVMsZUFBVEEsTUE5REwwOUMsZUE4RHdCO1lBQ3hCL25ELEtBQUtxSyxVQUFTLGVBQVRBLE1BL0RMMDlDLGVBK0R3QjtZQUl4QitCLGtCM0Z2SEw7WTJGd0hLQyxTQUFTbm5ELEdBQUksT0FBSkEsRUFBSztHQVdEO0lBVmIyb0Q7SUFpSkV0bkQ7SUF0SUZQO0lBQ0Ewc0Q7SUFDQTFHO0lBQ0FDO0lBQ0FDO0lBQ0FJO0lBRUFFO0lBQ0FvNEI7SUFNRTduRDtZQUVBb3dCO0lBQ0Y7R0FBMkQ7WUFRekRDLFVBQVU3NEQ7SUFDWixHQUFHLGVBRFNBLHFCQVRWNDREO0lBV007S0FBSjd4QyxNQUFJLDRCQUZJL21CO0tBR1I2d0IsTUFBSSxjQURKOUosS0FDVSwrQkFEVkE7S0FFQTR2QyxNQUFJLGNBREo5bEMsS0FDVSwrQkFEVkE7S0FFQWlvQyxNQUFJLGNBREpuQyxLQUNVLCtCQURWQTtLQUVBb0MsTUFBSSxjQURKRCxLQUNVLCtCQURWQTtLQUVBRSxNQUFJLGNBREpELEtBQ1UsK0JBRFZBO0tBRUFFLE1BQUksY0FESkQsS0FDVSwrQkFEVkE7SUFFSixtQ0FESUM7R0FDYTtZQUlmQyxXQUFXbDVEO0lBQ2IsR0FBRyxlQURVQSxxQkF0Qlg0NEQ7SUF3Qk07S0FBSjd4QyxNQUFJLGNBRksvbUIsR0FFQywrQkFGREE7S0FHVDZ3QixNQUFJLGNBREo5SixLQUNVLCtCQURWQTtLQUVBNHZDLE1BQUksY0FESjlsQyxLQUNVLCtCQURWQTtLQUVBaW9DLE1BQUksY0FESm5DLEtBQ1UsK0JBRFZBO0tBRUFvQyxNQUFJLGNBREpELEtBQ1UsK0JBRFZBO0tBRUFFLE1BQUksY0FESkQsS0FDVSwrQkFEVkE7SUFFSixzQkFESUMsS0FDYSwrQkFEYkE7R0FDc0I7WUFHeEJHLFFBQVFuNUQ7SUFDVixHQUFHLGVBRE9BLHFCQWpDUjQ0RDtJQWtDMkI7SUFDN0IsaUNBRlU1NEQsR0FFSCw0QkFGR0E7R0FFZ0M7WUFpQnhDbzVELFdBQVd4dkQ7SUFDYixHQUFHLGVBRFVBO0tBSTRDLHVCQUFNLDZCQUpsREE7S0FHWDtPQXpEQTQrQixTQTBERTs7SUFDVzsyQ0FMRjUrQjtLQUtiLGtDQTlLQThRO0lBOEtlO0dBQUs7WUFJbEIyK0MsVUFBVXp2RDtJQUNaLEdBQUcsZUFEU0E7S0FHa0QseUJBQU0sNkJBSHhEQTtLQUdWO09BbEVBNCtCLFNBa0VROztJQUNQLGdDQUpTNStCLHFCQUk4QjtJQUFrQiwwQ0FBSSw0QkFKcERBO0lBSWdELG1DQXRMNUQ4UTtHQXNMbUY7O3lEQW9FN0V2STs7O0lBMURGbks7SUFFQ2tjO0lBSUNpekM7R0FDSixTQUZHaHpDLE9BRUNua0IsR0FBSyxrQkFETG0zRCxRQUNBbjNELEdBQVc7T0FPYjhmO1lBQ0EwMEMsWUFBVTVxRCxHQUFJLHVDQUFKQSxHQUEwQjtZQUNwQ210RCxZQUFVMW9EO0lBQUk7SUFBMEIsbUNBQTlCQTtHQUFtQzs7Ozs7O1NBaEI3Q3JHO1NBRUNrYztTQUdBQztTQVVEcXdDO1NBQ0F1QztTQTBCRks7U0E1QkV0M0M7U0EzTEp3M0M7U0E4TEl0OEM7O2dEQU9BODdDLGVBa0NFM2tEOzs7OztTQWhPTkc7U0FIQUQ7U0FrT01EO1NBQ0FEOzs7Ozs7Ozs7Ozs7U0FwQkpnbUQ7O1NBSUFmO1NBQ0FwbEQ7U0F6TkZvbUQ7Ozs7Ozs7Ozs7SXpGc0pFbnlEO0lBQ0FsRztJQUNBRztJQUNBQztjeUZ1REE0RSxRQStCQXd6RCxTQTNCQUosS0FJQWY7cUIzRnpRUDs7Ozs7TzJGaUJRNzhDO09Bd0NIakk7T0FIQUQ7T0FvTkVMO09BcklGbXNEO09BOUhHOW5EO09BR0EyRDtPQUtEcUg7O09BeVFJalA7T0FDQUQ7OzBCM0Z6Ulg7T0UwTU9oUztPQURBRDtPQUZBK0Y7T0FDQWxHO095RnhHRm1xQztPQUdBSTtPQUtBQzs7O09BbkZFb0I7Ozs7OztPQTBFRm54Qjs7O09BM0NBczdDO09BREF1QjtPQUZBZTs7Ozs7O09BRkE3bEQ7T0FEQXU1QjtPQUVBNnNCO09BTkFGO09BREFEO09BREFFO09Bd1BFSDtPQXZLRmU7T0FuRkFoQjtPQURBcmlCO09BOEVBbG9DO09BREFDO09Bb0JBeXBEO09BRUFFO09BakJBRTtPQUNBQztPQWlCQUM7T0FHQXM0QjtPQXJGQW41QjtPQXhCQXg4QztPQWFBNUk7T0FEQUQ7T0FQQXdtRDtPQXlIRVE7T0FhQUs7T0F1Q0FHO09BVEFEO09BbkJBRDs7OztPQTRFQXAwRDtPQStCQXd6RDtPQTNCQUo7T0FJQWY7Ozs7T0FySUYzbEQ7T0FHQWltRDtPQUVBSztPQUVBRTtPQXhHQWc0QjtPQURBRDtPQXNDZ0JFO09BRUFDO09BUUFDOzs7RTNGbEZyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0k0RmdITzM1QjtJQWlSRXo3QztJQU9BODdDOzs7Ozs7Ozs7Ozs7Ozs7OztJQTFYQTl2RDtJQStWQ3FQO0lBcFZEb0U7SUFvSkRGO2lEQS9KQ3ZULFNBV0F5VDtJQTBKRnNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7WUF2RkF1dkUsU0FBU3R3RjtJQUVYLHFDQUZXQTtJQUdYLHNCQUhXQTtHQUdRO1lBT2pCdXdGLFlBQVl2d0YsR0FBSSxzQkFBSkEsUUFBdUI7WUFDbkN3d0YsT0FBT3h3RixHQUFJLDhCQUFKQSxNQUE4QjtZQVVyQ2txQixFQUFFbHFCLEdBQUksc0JBQUpBLEdBREZ5MkQsTUFDOEI7WUFvRTlCajhDLFVBbkVVN0o7SUFBSSxHQUFPLFdBRHJCdVosRUFDVXZaO0lBQUk7R0FBZ0I7O0lBMFI5QjVMO0lBQ0ErYTtJQVNBRTtZQURBbTRDLElBL1JJbjRELEdBQUksbUNBQUpBLEdBQW9CO0dBQ2xCLElBQU44MUQsTUEzQkF3NkI7WUFvTEYvOUUsS0F4Sk93QixHQUFJLE9BREgsZUFDREEsR0FETCtoRCxLQUNrQjtZQXVKcEJocUIsS0F0Sk8vM0IsR0FBSSxzQkFBSkEsR0FGTCtoRCxLQUVrQjtHQUNOLElBMkpkamtELFlBcEtFcVkscUJBbUtGcFksWUFuS0VvWTtZQTRUQXF1QyxRQWpUUXY0RCxHQUFJLE9BWFprcUIsRUFXYyw2QkFBTmxxQixJQUEyQjs7SUE4U25DeTREO0lBRUFDO0lBREFGO0lBR0FGO1lBQ0FyaUIsWUE5U1lqMkMsR0FBRTRKLEdBQUksT0FoQmxCc2dCLEVBZ0JvQix1QkFBUmxxQixHQUFFNEosSUFBa0M7WUErU2hEeXVELG9CQTlTb0JyNEQsR0FBRTRKO0lBQUksT0FqQjFCc2dCLEVBaUI0QiwrQkFBUmxxQixHQUFFNEo7R0FBMEM7T0F0QjdEZ0g7R0F1QkcsU0E4SVIrbkQsSUFyS081a0QsR0FBRUM7SUFDVDthQUFlO2VBRFZwRCxHQUNhLHVCQURYbUQsT0FDd0MsdUJBRHRDQzs7O1lBa1NQa29CLFNBMVFJbm9CLEdBQUVDO0lBQUksc0JBQU5ELEdBQXVCLHVCQUFyQkM7R0FBaUQ7WUEyUXZEek8sU0ExUUl3TyxHQUFFQyxHQUFJLE9BL0JWdThFLFlBK0JzQix1QkFBbEJ4OEUsR0FBRUMsSUFBb0M7T0E2STVDb2tEO1lBTEFrQixTQXRJV3Q1RCxHQUFJLG9DQUFKQSxHQUE2QjtZQTBLeEM4M0QsU0F6S1dubkQsR0FBSSw4QkFBSkEsTUFBWTtZQXNLdkJpbkQsU0FyS1dqbkQ7SUFBSSxPQXRDWixxQ0FzQ1FBO2tCQXRDeUMsZUFzQ3pDQTs7R0FBVTtZQXNLckJrbkQsYUFyS2VsbkQsR0FBSSxPQTlDakIyL0UsU0E4Q2EzL0UsR0FBYztZQXNLN0IycEUsZUFyS2lCM3BFLEdBQUksT0FyQ25CNC9FLFlBcUNlNS9FLEdBQWlCO1lBZ0NoQzBRLFVBL0JVcmhCLEdBQUksT0FoRGRzd0YsU0FnRHVCLDZCQUFidHdGLElBQThCO1lBZ0N4Q3VjLFlBL0JVdmM7SUFBSSxPQUFjLG9EQUFsQkE7R0FBNEI7WUE4TnBDZ0ksVUE3Tk9oSSxHQUFPQyxHQUFJLGtCQWhJbEIrRyxTQWdJT2hILEdBQU9DLEdBQWU7WUEySWpDazVELFFBMUlVbjVEO0lBQUksT0FBYyxrREFBbEJBO0dBQTRCO1lBK0l0Q3l3RixJQTdJTXp3RixHQUdOLGtDQUhNQSxHQUdLO1lBMklYMHdGLElBeElNMXdGO0lBQUksT0FBVSxrREFBZEE7R0FBd0I7WUFtSTlCazVELFdBbElhbDVEO0lBQUksT0E1RGZzd0YsU0E0RGUsMkJBQWlCLHVCQUFyQnR3RjtHQUEyQztZQW1JeEQ2NEQsVUFsSVk3NEQ7SUFBSSxPQTdEZHN3RixTQTZEYywyQkFBaUIsdUJBQXJCdHdGO0dBQTJDO1lBbUl2RG81RCxXQWxJYXA1RDtJQUFJLE9BQWlCLGtEQUFyQkE7R0FBK0I7WUFtSTVDcTVELFVBbElZcjVEO0lBQUksT0FBZ0Isa0RBQXBCQTtHQUE4QjtZQXNOcENnYSxLQXhMRWhhLEdBQVMsNENBQVRBLEdBQTRCO0dBQ1IsSUFBMUIyckMsZUF1TEkzeEIsTUFORmhTLFdBL0xGdVU7WUFlQW8wRSxZQUFZM3dGLEdBQUksdUNBQUpBLE1BQTZEO1lBNE9yRW1TLFVBbk1NblM7SUFBSSxPQUFxQixvREFBekJBO0dBQW1DO1lBa016Q29TLFVBaE1NNEo7SUFDWjtTQXpCSWxNLDRCQXdCUWtNO1lBeEJSbE07TUFLTSwrQkFtQkVrTTs7Ozs7O2NBRU5pdkIsZ0JBeEJGN2Y7OztzQkF3QkU2ZixnQkF4QkY3Zjs7dUJBd0JFNmYsZ0JBeEJGN2Y7OztVQXdCRTZmLGdCQXhCRjdmO1FBU0QsNEJBVENBLFVBRkF0YjtNQWFPO09BQUwwd0MsS0FBSyxnQkFXQ3hrQyxLQXRCUm9QO09BWUVxMUIsS0FBSyxnQkFVQ3prQyxLQVZFLDRCQVpWb1A7T0FhRjtnQkFGSW8xQjtnQkFDQUMsb0JBWUF4Vjs7OztTQUFNMmxEO0tBQ1YsR0FEVUE7Z0JBdUVaLzRCLGFBckVvQixxQkFKUjc3Qzs7b0JBRU5pdkI7V0FJRTRsRCxVQU5JNzBFOztPQVErQjtnRUFSL0JBO1FBTUo2MEUsVUFFUSwyQkFSSjcwRTtNQVdJLElBQVIwUSxRQUFRLHFCQUxSbWtFO01BT0QsaUJBRkNua0UsYUF0RE5pa0UsWUEyQ1UzMEU7TUFjSTtPQUFSODBFLFFBOUlOUCxZQTJJTTdqRTtPQUdBcWtFLHFCQVpGOWxELE9BWUU2bEQsUUFFTSxlQUZOQTs7O0tBVkQ7O2VBZUEsT0E5RExILFlBMkNVMzBFO0dBbUJVO1lBR3BCazBFLFFBQVF2L0U7SUFBSSxPQXRKWjQvRTthQXNKd0IsMkJBQWUsdUJBQS9CNS9FO0dBQTBDO1lBQ2xEdy9FLFFBQVF4L0U7SUFBSSxPQXZKWjQvRTthQXVKd0IsMkJBQWUsdUJBQS9CNS9FO0dBQTBDO1lBQ2xEeS9FLFFBQVF6L0U7SUFBSSxPQXhKWjQvRTthQXdKd0IsMkJBQWUsdUJBQS9CNS9FO0dBQTBDO0dBTWhDO0lBQXBCcW1ELG9CQUFvQjtJQUNwQkMsb0JBQW9CO0lBaUJwQkksWUExTEVpNUI7SUEyTEZVLFFBM0xFVjtJQTJUQWw1QixPQTNUQWs1QjtJQXVLRjUxRTtZQTZCQXJJLFNBQVNyUztJQUFJLG1DQUFvQix1QkFBeEJBO0dBQWtDO1lBQzNDazNELG1CQUFtQmwzRCxHQUFJLE9BM0xyQnV3RixZQTJMaUMsb0JBQWhCdndGLElBQXVDO1lBRTFEc1MsU0FBUzNCO0lBQ1g7TUFDRyxnQ0FGUUEsR0EvQlRxbUQ7U0FpQzJCLGdDQUZsQnJtRCxHQTlCVHNtRDtLQWlDZSxPQWhNYnM1QixZQWdNYSxvQkFITjUvRTtJQU9QLHNDQVBPQTtJQUtUO0dBR0k7OzhDQWdFQTNJLFdBL0xGdVUsYUEyT0E2NkM7Ozs7OztZQTlGRmx0QixRQUFRdjVCLEdBQUd3NUIsS0FBS0M7SUFBTzswQkFBWkQsS0FBSHg1QjtLQUFlLFlBQVksZUFBM0JBLEdBQVF5NUI7SUFBbUI7R0FBUztZQUM1Q0MsZ0JBQWdCMTVCLEdBQUd4USxLQUFLRDtJQUFNLE9BQUcsY0FBakJ5USxHQUFHeFEsYUFBdUMsZUFBMUN3USxHQUFRelEsT0FBUnlRLElBQVF6UTtHQUEwRDtZQUVsRm9xQyxVQUFVMzVCLEdBQUd4USxLQUFLRDtJQUNwQixHQUFPLGVBRFFDLEtBQUtELE1BRXBCLE9BSkVtcUMsZ0JBRVUxNUIsR0FBR3hRLEtBQUtEO0lBQ3BCO0dBQzJCO1lBR3pCcXFDLE1BQU01NUIsR0FBR3hRLEtBQUtEO0lBQ2hCLEtBQUcsaUJBRFFDLEtBQUtELE1BT1gsV0FkSG1xQyxnQkFPTTE1QixHQUFHeFEsS0FBS0Q7SUFNVDs0QkEzSkhxYyxZQXFKWXJjO0tBTVQsdUJBM0pIcWMsWUFxSk9wYztLQUlQOztHQUdpQztZQXlFakNxRixTQWpFS3dPLEdBQUV3QixHQUFJLE9BL0RibWpELElBK0RPM2tELEdBQUV3QixHQUFXO1lBQ3BCeEgsS0FBS29LLFVBQVMsZUFBVEEsTUExREw0NEUsaUJBMERzQjtZQUN0QmpqRixLQUFLcUssVUFBUyxlQUFUQSxNQTNETDQ0RSxpQkEyRHNCO1lBR3RCai9FLE9BQU8vUjtJQUFJLE9BelBUc3dGLFNBeVBrQixvQ0FBYnR3RjtHQUFrQztZQW1FdkNnUyxXQWxFU2hTLEdBQUksT0FEZitSLE9BQ1cvUixHQUFZO1lBQ3ZCeVIsT0FBT3pSO0lBQUksT0FBa0IsNERBQXRCQTtHQUFnQztZQUN2Q20rRCxXQUFXbitEO0lBQUksT0FBc0IsNERBQTFCQTtHQUFvQztZQUMvQ282RSxhQUFhcDZFO0lBQUksT0FBd0IsNERBQTVCQTtHQUFzQztZQUNuRHczRCxTQUFTeDNEO0lBQUksT0E5UFhzd0YsU0E4UG9CLG9DQUFidHdGO0dBQW9DO1lBQzdDeTNELGFBQWF6M0QsR0FBSSxPQURqQnczRCxTQUNheDNELEdBQWM7WUFDM0IwM0QsU0FBUzEzRDtJQUFJLE9BQW9CLDREQUF4QkE7R0FBa0M7WUFDM0MyM0QsYUFBYTMzRDtJQUFJLE9BQXdCLDREQUE1QkE7R0FBc0M7WUFDbkRxNkUsZUFBZXI2RTtJQUFJLE9BQTBCLDREQUE5QkE7R0FBd0M7WUFDdkQrM0QsYUFBYS8zRDtJQUFJLE9BakRqQjQzRCxTQWlEMEIscUNBQWI1M0Q7R0FBd0M7WUFDckRnNEQsaUJBQWlCaDREO0lBQUksT0FwUW5Cc3dGLFNBb1E0QixxQ0FBYnR3RjtHQUF3QztZQUN6RGl4RixtQkFBbUJqeEY7SUFBSSxPQWpEdkJzNkUsZUFpRHNDLHFDQUFuQnQ2RTtHQUE4QztZQUNqRWk0RCxhQUFhajREO0lBQUksT0FBd0IsNERBQTVCQTtHQUFzQztZQUNuRHF3RixpQkFBaUJyd0Y7SUFBSSxPQUE0Qiw0REFBaENBO0dBQTBDO1lBQzNEa3hGLG1CQUFtQmx4RjtJQUFJLE9BQThCLDREQUFsQ0E7R0FBNEM7O3lEQW1FekRtUzs7O0dBckRKLFNBRkdnUyxPQUVDbmtCLEdBQUssT0FETGdhLEtBQ0FoYSxHQUFXO09BT2J5RjtZQUVBK3VELFlBQVU1cUQ7SUFFWixPQUFxQjtpRUFGVEE7R0FFNEI7WUFHdENtdEQsWUFBVTFvRDtJQUFJLE9Bc0NaK0QsVUF0Q3NCLHFDQUFkL0Q7R0FBd0I7Ozs7OztTQXJCbENyRztTQUVDcU87U0FHQThOO1NBV0Rxd0M7U0FLQXVDO1NBdUJGSztTQTlCRTN4RDtTQTZCRnVhO1NBckJFaEY7O1lBTUFtMkUsWUFBVW54RixHQUFJLE9BZ0NabVMsVUFoQ1FuUyxHQUFlO0dBZ0RuQjs7NkNBL0NOODJELGVBREFxNkI7SUFZdUN6ckY7Ozs7Ozs7Ozs7U0FoSDNDNE07U0FIQUQ7U0FzSU1EO1NBQ0FEO1NBM0JKcE47U0FDQSthO1NBQ0FvYztTQUNBMzJCO1NBT0F5YTtTQUh5Q2phOzs7Ozs7U0FFekNveUQ7U0FDQW40QztTQUNBbzNDO1NBQ0FwbEQ7U0F0SUZvbUQ7Ozs7Ozs7OztJQXFLVTs7STFGaFBSbnlEO0lBQ0FsRztJQUNBRztJQUNBQztJMEZxUEZpeEY7Y0FuV0VkLFVBV0FFOzs7T0FxU0F6ckY7T0FDQSthO09BQ0FvYztPQUNBMzJCO09BT0F5YTtPQUxBeGE7T0FFeUNPOzs7Ozs7T0FFekNveUQ7T0FDQW40QztPQUNBbzNDOzs7O09BbUJBcUI7T0FDQUQ7T0FDQUU7T0FDQUg7T0FDQUQ7T0FDQXJpQjtPQUNBb2lCOzs7T0FuUUM5OUM7T0FzSEhqSTtPQUhBRDtPQXdIRUw7T0FoRUZtc0Q7T0FxQks5bkQ7T0FJQzJEO09BdE1KcUg7O09BMlBJalA7T0FDQUQ7Ozs7Ozs7OzBCNUZ2YVg7T0UwTU9oUztPQURBRDtPQUZBK0Y7T0FDQWxHO08wRmlIRm1xQztPQUdBSTtPQUtBQztPQTlJRXhwQjs7T0FPQTRxQjs7Ozs7O09BTEFueEI7OztPQWtPQTQ4QztPQWhJRjQ1QjtPQURBMzVCO09Bc0hFdHlEO09BQ0ErYTtPQUNBb2M7T0FHQTEyQjtPQUtBd2E7Ozs7T0FQQXphO09BN0hGNnlEOztPQXdKRUs7T0FDQUQ7T0FDQUU7T0FDQUg7T0FDQUQ7T0FDQXJpQjs7Ozs7O09BMUJBa2lCO09BcklGNWxEO09BREF1NUI7T0FFQTZzQjtPQXlKRUY7T0FDQUQ7T0FDQUU7T0FDQUg7T0FoS0ZlO09BaUtFaEI7T0FDQXJpQjtPQTdGRmxvQztPQURBQztPQVVBeXBEO09BRUFFO09BOUNBRTtPQUVBQztPQStDQUU7T0FHQXE0QjtPQWxFQW41QjtPQTlCQXg4QztPQWlCQTVJO09BQ0FEO09BMkpFd21EOztPQXJKRlE7T0FEQUs7T0FHQUc7T0FEQUQ7T0FIQUQ7T0FLQXMzQjtPQUNBQzs7T0FzREEzK0U7T0FFQU47T0FFQTJvRTtPQUNBNWlCO09BRUFFO09BRUEyaUI7T0FoREF6aUI7T0FFQTBpQjtPQStDQXZpQjtPQUdBRTtPQURBZzVCO09BR0FDO09BeEdFaEI7T0FDQUM7T0FDQUM7OztPQWlNRmdCOzs7RTVGL2JMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJNkZTT3gyRTtJQWtDRUk7Ozs7Ozs7O0lBeENKMU07SUFLRXRIO0lBR0NxUDtJQUlDbUg7Ozs7Ozs7Ozs7R0FDSixTQUZHeEQsS0FFQ2hhLEdBQUssa0JBREx3ZCxNQUNBeGQsR0FBVztHQVNhO0lBTjFCcWhCO0lBQ0E1RztJQUNDRjtJQUlEb3hCLGVBWEMzeEIsTUFORGhULFNBWUF5VDtZQU9BckksVUFHQS9EO0lBSFksNEJBR1pBOzs7Z0JBQUssV0EzQlBDLG1CQTJCRUQ7OztHQUEwRTs7SUFHMUU4RDtpREF6QkFuTCxTQVlBeVQ7Ozs2Q0F1QkVPLGFBVkY3STs7WUFrQkZxSSxpQkFBb0IsU0FBRTtZQUN0QjB2QixRQUFRdjVCLEdBQUd3NUIsS0FBS0M7SUFBTywwQ0FBWkQsS0FBSHg1QjtJQUFlLDZDQUFmQSxHQUFReTVCO0dBQTRCO1lBQzVDQyxnQkFBZ0IxNUIsR0FBR3hRLEtBQUtEO0lBQU0sT0FBRyxnQ0FBakJ5USxHQUFHeFE7O2NBQXVDLGdDQUExQ3dRLEdBQVF6USxPQUFSeVEsSUFBUXpRO0dBQTBEO1lBRWxGb3FDLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBQ3BCLEdBQU8sZ0NBRFFDLEtBQUtEO0tBRXBCLE9BSkVtcUMsZ0JBRVUxNUIsR0FBR3hRLEtBQUtEO0lBQ3BCO0dBQzJCO1lBR3pCcXFDLE1BQU01NUIsR0FBR3hRLEtBQUtEO0lBQ2hCLEtBQUcsZ0NBRFFDLEtBQUtEO0tBT1gsV0FkSG1xQyxnQkFPTTE1QixHQUFHeFEsS0FBS0Q7SUFNVDs0QkFBaUMsV0E5Q3BDdWEsV0F3Q1l2YTtLQU1ULHVCQUFTLFdBOUNadWEsV0F3Q090YTtLQUlQOztHQUdpQztZQUduQ3NSLE9BQU96UixHQUFJLG1DQUFKQSxHQUFpQjtZQU10QitFLE9BQU9nUCxHQUFFQztJQUFJLElBQTRCLE1BTjNDdkMsT0FNV3VDLElBQW1CLE1BTjlCdkMsT0FNU3NDO0lBQW9CO0dBQXVCO1lBQ2xEK0wsU0FBTy9MLEdBQUVDO0lBQUksSUFBNkIsTUFQNUN2QyxPQU9XdUMsSUFBbUIsTUFQOUJ2QyxPQU9Tc0M7SUFBb0I7R0FBd0I7R0FNQyxTQWJ0RHRDOzs7Ozs7Ozs7Ozs7Ozs7OztRQTdERW1KO1FBWUNMO1FBVkFsRTtRQUdBMkQ7UUFLRHFIO1FBQ0E1RztRQU9Bckk7UUFNQUQ7Ozs7Ozs7Ozs7Ozs7UUFtQkYrM0I7UUFHQUk7UUFLQUM7OztRQW5DRW9CO1FBMEJGbnhCO1FBbUJBL0k7WUFPRXFPLFVBREEvYTs7OztHQU9HO0U3Rm5GVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJOEZ5UFNpVztJQU9BODdDOzs7Ozs7Ozs7Ozs7Ozs7O0lBelBEemdEO0lBSUNtSDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQUNKLFNBRkd4RCxLQUVDaGEsR0FBSyxrQkFETHdkLE1BQ0F4ZCxHQUFXO0dBU2E7SUFOMUJxaEI7SUFDQTVHO0lBQ0NGO0lBSURveEIsZUFYQzN4Qix3QkFNRFM7WUF3RUF4VSxVQWxFU2pHLEdBQU9DLEdBQUksb0NBQVhELEdBQU9DLEdBQWU7R0FTYjtJQWdRZGtTO0lBREFDO2lEQXRNSm5NLFdBeEVBd1U7O0lBZUZ1OEMsb0JBQW9CO0lBQ3BCQyxvQkFBb0I7SUFDcEIrNEI7SUFDQUM7SUFKQXYxRTtZQTBRRTI5Qyw4QjlGeFNQO1k4RnVTT3BpQixzQjlGdlNQO1k4RnNTT3FpQixxQjlGdFNQO0c4RnFDa0IsSUFnUVhDO1lBREFHLGtCOUZwU1A7WThGbVNPRixpQjlGblNQO1k4RmtTT0Msa0I5RmxTUDtHOEZ5Q2U7SUFDVjVtRDtJQUNBQztJQWtPRXFtRDtJQWhPRnJzQjtJQUNBdjVCO0lBQ0E2bEQ7WUErTkVyekQsWTlGOVFQO0c4RmdEVztJQUNOc3lEO0lBQ0F2QjtJQTZORXNCO1lBMU5GL2tELGM5RnJETDtZOEZzREs2a0Qsd0I5RnRETDtZOEZ3REs1a0QsU0FBUzFCO0lBQ1g7TUFBRyxnQ0FEUUEsR0F6QlRvbUQ7U0EyQkMsZ0NBRlFwbUQsR0F4QlRxbUQ7S0EyQkcsT0FITXJtRDtJQU9QLHNDQVBPQTtJQUtUO0dBR0k7OzswQ0F3QkYzSyxXQXhFQXdVLFdBK1BBMjhDOzs7Ozs7SUFKZXQzQzs7Ozs7O1lBbExmL2YsV0FBV0MsR0FBRUMsR0FBSSxPQURqQmdHLFVBQ2FoRyxHQUFGRCxHQUFpQjtZQUM1QkcsSUFBS0gsR0FBT0MsR0FBSSxPQUFHLGNBQWRELEdBQU9DLEtBQVBELElBQU9DLEVBQTBCO1lBQ3RDQyxJQUFLRixHQUFPQyxHQUFJLE9BQUcsaUJBQWRELEdBQU9DLEtBQVBELElBQU9DLEVBQTBCO09BQ3RDZ0g7WUFDQWlqQyxRQUFRdjVCLEdBQUd3NUIsS0FBS0M7SUFBTyx5QkFBWkQsS0FBSHg1QjtJQUFlLDRCQUFmQSxHQUFReTVCO0dBQTRCO1lBQzVDQyxnQkFBZ0IxNUIsR0FBR3hRLEtBQUtEO0lBQU0sT0FBRyxjQUFqQnlRLEdBQUd4USxhQUF1QyxlQUExQ3dRLEdBQVF6USxPQUFSeVEsSUFBUXpRO0dBQTBEO1lBRWxGb3FDLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBQ3BCLEdBQU8sZUFEUUMsS0FBS0QsTUFFcEIsT0FKRW1xQyxnQkFFVTE1QixHQUFHeFEsS0FBS0Q7SUFDcEI7R0FDMkI7WUFHekJxcUMsTUFBTTU1QixHQUFHeFEsS0FBS0Q7SUFDaEIsS0FBRyxpQkFEUUMsS0FBS0QsTUFPWCxXQWRIbXFDLGdCQU9NMTVCLEdBQUd4USxLQUFLRDtJQU1UOzRCQUFpQyxXQTNGdEN1YSxXQXFGY3ZhO0tBTVQsdUJBQVMsV0EzRmR1YSxXQXFGU3RhO0tBSVA7O0dBR2lDO1lBTXJDcWEsaUJBQW9CLFNBQUU7T0FxSnBCOVUsNkJBREFDO1lBREFDLG1COUZyUVA7WThGb1FPQyxtQjlGcFFQO1k4RndIS21JLEtBQUtvSyxpQkF0RUwwOUMsa0JBc0VzQjtZQUN0Qi9uRCxLQUFLcUssaUJBdkVMMDlDLGtCQXVFc0I7WUFDdEIwQixTQUFTN21ELEdBQUksT0FBSkEsRUFBSztZQUVkK21ELFNBQVMvbUQsR0FBSSxPQUFKQSxFQUFLOztJQUVkMm9EO0lBSUF2bkQ7SUE4SUVDO0lBNUlGcS9FO0lBQ0E1L0U7SUFDQTBzRDtJQUNBaWM7SUFDQXhpQjtJQUNBQztJQUNBeWlCO0lBQ0F4aUI7SUFDQUM7SUFDQUM7SUFDQWk1QjtJQUNBaDVCO1lBRUFVLElBQUkza0QsR0FBRXdCO0lBQUksSUFBb0QsaUJBWDlEMm9ELFlBV00zb0QsSUFBeUMsaUJBWC9DMm9ELFlBV0lucUQ7SUFBaUIsa0JBK0huQmhDLFlBL0htQjtHQUF3RDtZQXdIM0VsTSxVQXZIS2tPLEdBQUV3QixHQUFJLE9BRGJtakQsSUFDTzNrRCxHQUFFd0IsR0FBVztZQUlwQjA2RSxRQUFRbHdGLEdBQUksT0FBK0IsaUJBQW5DQSxjQUFpRDtPQU12RHdvQztZQUVBb3dCO0lBQ0Y7R0FBMkQ7WUFRekRDLFVBQVU3NEQ7SUFDWixHQUFHLGdDQURTQTtLQVRWNDREO0lBV007S0FBSjd4QyxNQUFJLDRCQUZJL21CO0tBR1I2d0IsTUFEQTlKO0tBRUE0dkMsTUFEQTlsQztLQUVBaW9DLE1BREFuQztLQUVBb0MsTUFEQUQ7S0FFQUUsTUFEQUQ7SUFFSixtQ0FESUM7R0FDYTtZQUlmRSxXQUFXbDVEO0lBQ2IsR0FBRyxnQ0FEVUE7S0FyQlg0NEQ7SUF1Qk07S0FBSjd4QyxNQUZTL21CO0tBR1Q2d0IsTUFEQTlKO0tBRUE0dkMsTUFEQTlsQztLQUVBaW9DLE1BREFuQztLQUVBb0MsTUFEQUQ7SUFFSixPQURJQztHQUNzQjtZQUd4QkksUUFBUW41RDtJQUNWLEdBQUcsZ0NBRE9BO0tBL0JSNDREO0lBZ0MyQiwyQkFDN0IsTUFGVTU0RCxJQUVILDRCQUZHQTtJQUNtQjtHQUNhO1lBaUJ4Q281RCxXQUFXeHZEO0lBQ2IsR0FBRyxnQ0FEVUE7S0FJNEMsdUJBQU0sNkJBSmxEQTtLQUdYO09BdkRBNCtCLFNBd0RFOztJQUNXOzJDQUxGNStCO0tBS2Isa0NBdkxBOFE7SUF1TGU7R0FBSztZQUlsQjIrQyxVQUFVenZEO0lBQ1osR0FBRyxnQ0FEU0E7S0FHa0QseUJBQU0sNkJBSHhEQTtLQUdWO09BaEVBNCtCLFNBZ0VROztJQUVQLGdDQUxTNStCLHFCQUs4QjtJQUFrQiwwQ0FBSSw0QkFMcERBO0lBS2dELG1DQWhNNUQ4UTtHQWdNbUY7O3lEQWlFN0V2STs7O0lBdkRGbkw7SUFFQ2tkO0lBSUNpekM7R0FDSixTQUZHaHpDLE9BRUNua0IsR0FBSyxrQkFETG0zRCxRQUNBbjNELEdBQVc7WUFRYncwRCxZQUFVNXFELEdBQUksdUNBQUpBLEdBQTBCO1lBQ3BDbXRELFlBQVUxb0Q7SUFBSTtJQUEwQixtQ0FBOUJBO0dBQW1DOzs7Ozs7U0FoQjdDckg7U0FFQ2tkO1NBR0FDO1NBVURxd0M7U0FDQXVDO1NBdUJGSztTQUplNXhEO1NBR2ZUO1NBckJFaVc7O2dEQU9BODdDLGVBK0JFM2tEOzs7OztTQXZPTkc7U0FIQUQ7U0F5T01EO1NBQ0FEO1NBM0JKdE07U0FDQUQ7U0FDQUQ7U0FDQUQ7U0FPQVg7U0FIZSthOzs7Ozs7U0FFZnE0QztTQUNBcHpEO1NBQ0FxeUQ7U0FDQXBsRDtTQWpPRm9tRDs7Ozs7Ozs7Ozs7O09BcU5FdnlEO09BQ0FEO09BQ0FEO09BQ0FEO09BT0FYO09BTEFlO09BRWVnYTs7Ozs7O09BRWZxNEM7T0FDQXB6RDtPQUNBcXlEOzs7O09BbUJBcUI7T0FDQUQ7T0FDQUU7T0FDQUg7T0FDQUQ7T0FDQXJpQjtPQUNBb2lCO3FCOUZ4U1A7Ozs7TzhGaUJROTlDO09BdUNIakk7T0FIQUQ7T0EyTkVMO09BMUlGbXNEO09BL0hHOW5EO09BR0EyRDtPQUtEcUg7O09BK1FJalA7T0FDQUQ7T0FwQlcyTjs7Ozs7O09BL0tmN1k7T0FKQWhCO09BRUE5RjtPQUNBRDtPQUhBK0Y7T0FDQWxHO09BSUFtcUM7T0FHQUk7T0FLQUM7OztPQWhGQW9COzs7Ozs7T0E2RkZueEI7OztPQTZKRTQ4QztPQTdORnRCO09BREF1QjtPQW1ORXh4RDtPQUNBRDtPQUNBRDtPQUdBRztPQUtBZjs7OztPQVBBVztPQXhORjB5RDs7T0FtUEVLO09BQ0FEO09BQ0FFO09BQ0FIO09BQ0FEO09BQ0FyaUI7Ozs7OztPQTFCQWtpQjtPQS9ORjVsRDtPQURBdTVCO09Bb0dBNnNCO09BaUpFRjtPQUNBRDtPQUNBRTtPQUNBSDtPQXZLRmU7T0F3S0VoQjtPQUNBcmlCO09BOUtGbG9DO09BREFDO09BRUF3cEQ7T0FFQUU7T0FhQUc7T0FFQUM7T0FFQUU7T0FFQUM7T0F6RkFmO09BeEJBeDhDO09BYUE1STtPQURBRDtPQThQRXdtRDs7T0FqSUFRO09BWUFLO09Bc0NBRztPQVRBRDtPQW5CQUQ7cUI5RjdMUDs7O084RmtJS3BuRDtPQUdBTjtPQVhBK2xEO09BRUFFO09BZ0JBSztPQUdBRTtPQVBBTDtPQUpBeTVCO09BR0FqWDtPQU9BNlc7T0FKQTNXO09BeEdBMlY7T0FEQUQ7T0FxSEFFOzs7O0U5RnRKTDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0krRkdLMW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF3Q0k0b0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBdUNBMy9FLE9BQU96UixHQUFJLFdBQUpBLEdBQVU7WUFDakJvNkUsYUFBYXA2RSxHQUFJLE9BQUpBLEVBQUs7WUFJbEJreEYsbUJBQW1CbHhGLEdBQUksdUJBQUpBLEdBQWtCO1lBQ3JDaTRELGFBQWFqNEQsR0FBSSxXQUFLLGdCQUFUQSxJQUF5QjtPQUN0Q3N4RjtZQUNBbkIsUUFBUXgvRTtJQUFJLE9BQW1CO3dDQUFlLG9CQUF0Q0E7R0FBdUQ7WUFDL0R5L0UsUUFBUXovRTtJQUFJLE9BQW1CO3dDQUFlLG9CQUF0Q0E7R0FBdUQ7TUFoRC9EeWdGOztLQW1ERkc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQjs7MEIvRmhHNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLK0ZnRzRCOzs2Qi9GaEc1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0srRjhGT0E7Ozs7Ozs7Ozs7Ozs7NkIvRjlGUDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1ErRmtGUzkvRTtRQUNBMm9FOzs7Ozs7O1FBS0FuaUI7O1FBREFpNUI7O1FBRUFJOztRQUNBbkI7UUFDQUM7O0lBckNVL3ZELG1CQXdDWmt4RDtJQXhDWUMsYUF3Q1pEO0lBeENZRSxhQXdDWkY7SUF4Q1lHLGVBd0NaSDtJQXhDWUksZUF3Q1pKO0lBeENZcnRFLGdCQXdDWnF0RTtJQXhDWXB0RSxTQXdDWm90RTtJQXhDWWx5RCxjQXdDWmt5RDtJQXhDWWgxRSxjQXdDWmcxRTtJQXhDWXg2QixjQXdDWnc2QjtJQXhDWS84QixjQXdDWis4QjtJQXhDWWhzRixXQXdDWmdzRjtJQXhDWS9yRixXQXdDWityRjtJQXhDWTlyRixXQXdDWjhyRjtJQXhDWTdyRixXQXdDWjZyRjtJQXhDWTVyRixXQXdDWjRyRjtJQXhDWTNyRixXQXdDWjJyRjtJQXhDWXRwRixVQXdDWnNwRjtJQXhDWXZwRixZQXdDWnVwRjtJQXhDWXByRixRQXdDWm9yRjtJQXhDWXJyRixRQXdDWnFyRjtJQXhDWW5yRixjQXdDWm1yRjtJQXhDWWxyRixlQXdDWmtyRjtJQXhDWXpoQyxZQXdDWnloQztJQXhDWXhoQyxjQXdDWndoQztJQXhDWXZoQyxVQXdDWnVoQztJQXhDWW5iLGVBd0NabWI7SUF4Q1lLLE9Bd0NaTDtJQXhDWU0sYUF3Q1pOO0lBeENZTyxnQkF3Q1pQO0lBeENZUSxvQkF3Q1pSO0lBeENZUyxnQkF3Q1pUO0lBeENZVSxvQkF3Q1pWO0lBeENZVyxTQXdDWlg7SUF4Q1lZLGNBd0NaWjs7SUF4Q1lhLGtCQXdDWmI7SUF4Q1lyWCxTQXdDWnFYO0lBeENZUCxRQXdDWk87SUF4Q1ljLGNBd0NaZDtJQXhDWTFyRixXQXdDWjByRjtJQXhDWXpyRixZQXdDWnlyRjtJQXhDWXhyRixZQXdDWndyRjtJQXhDWXZyRixZQXdDWnVyRjtJQXhDWWo2QixNQXdDWmk2QjtJQXhDWS9xRixZQXdDWitxRjtJQXhDWTlxRixZQXdDWjhxRjtJQXhDWTdxRixZQXdDWjZxRjtJQXhDWTVxRixZQXdDWjRxRjtJQXhDWWUsUUF3Q1pmO0lBeENZM3FGLFlBd0NaMnFGO0lBeENZcmtGLE9Bd0NacWtGO0lBeENZbmtGLE1Bd0NabWtGO0lBeENZaGtGLE9Bd0NaZ2tGO0lBeENZcGtGLFNBd0Nab2tGO0lBeENZbGtGLE1Bd0Naa2tGO0lBeENZdGtGLE1Bd0Nac2tGO0lBeENZZ0IsVUF3Q1poQjtJQXhDWWlCLHVCQXdDWmpCO0lBeENZa0IsZUF3Q1psQjtJQXhDWW1CLGFBd0NabkI7SUF4Q1lvQixrQkF3Q1pwQjtJQXhDWTlqRixRQXdDWjhqRjtJQXhDWXFCLFNBd0NackI7SUF4Q1lzQixTQXdDWnRCO0lBeENZdUIsUUF3Q1p2QjtJQXhDWXdCLFlBd0NaeEI7SUF4Q1l5QixXQXdDWnpCO0lBeENZMEIsWUF3Q1oxQjtJQXhDWTJCLFlBd0NaM0I7SUF4Q1k0QixhQXdDWjVCO0lBeENZNkIsZUF3Q1o3QjtJQXhDWThCLGdCQXdDWjlCO0lBeENZK0IsU0F3Q1ovQjtJQXhDWWdDLFNBd0NaaEM7SUF4Q1lpQyxpQkF3Q1pqQztJQXhDWWtDLGlCQXdDWmxDO0lBeENZbUMsaUJBd0NabkM7SUF4Q1lvQyxhQXdDWnBDO0lBeENZcUMscUJBd0NackM7SUF4Q1lzQyxxQkF3Q1p0QztJQXhDWXVDLGFBd0NadkM7SUF4Q1l3QyxjQXdDWnhDO0lBeENZeUMsY0F3Q1p6QztJQXhDWWprRixNQXdDWmlrRjtJQXhDWTBDLHdCQXdDWjFDO0lBeENZMkMsY0F3Q1ozQztJQXhDWTRDLGVBd0NaNUM7SUF4Q1k2QyxjQXdDWjdDO0lBeENZOEMsWUF3Q1o5QztJQXhDWStDLFFBd0NaL0M7SUF4Q1lnRCxRQXdDWmhEOztJQXhDWWlELFdBd0NaakQ7SUF4Q1lrRCxXQXdDWmxEO0lBeENZbUQsaUJBd0NabkQ7SUF4Q1kvNUIsV0F3Q1orNUI7SUF4Q1lvRCxhQXdDWnBEO0lBeENZbFgsaUJBd0Naa1g7SUF4Q1lxRCxhQXdDWnJEO0lBeENZalgsaUJBd0NaaVg7SUF4Q1lzRCxpQkF3Q1p0RDtJQXhDWXVELGlCQXdDWnZEO0lBeENZTixxQkF3Q1pNO0lBeENZd0QsdUJBd0NaeEQ7SUF4Q1l5RCx1QkF3Q1p6RDtJQXhDWTBELFNBd0NaMUQ7SUF4Q1lyQixVQXdDWnFCO0lBeENZMkQsWUF3Q1ozRDtJQXhDWTRELFlBd0NaNUQ7WUFVQTFxRixVQUFNOEosR0FBRW9QO0lBQ1Y7S0FBSWdKLE1BQU0sV0FuRElsakIsVUFrRE44SyxHQUFFb1A7S0FFYyxrQkFwRFZrekUsV0FrRE50aUYsR0FFMkIsV0FwRHJCdWlGLFdBbURWbnFFO0lBQ0Q7O1FBcERXcGpCO1FBb0RYLFdBcERXcXRGLFVBb0RKLFdBcERJQyxXQWtETnRpRixHQUFFb1A7UUFsREltNkQ7S0FxRFQsT0FGRG54RDtJQU9HOzZCQUE2QyxXQTFEdEN4TSxhQW1EVndNOzJCQU80QixXQTFEbEJ4TSxhQWtESndEO0tBUUgsc0JBQU8sV0ExREF4RCxhQWtETjVMO0lBTUosa0JBM0dKNjNCLFNBMkdJO0dBRWdFO1lBR2xFaGhDLFVBQU1tSixHQUFFb1A7SUFDVjtLQUFJcU8sT0FBTyxXQTlER3RvQixXQTZETjZLLEdBQUVvUDtLQUVOcTFFLFdBQVcsV0EvREQxdkYsVUE2RE5pTCxHQUFFb1A7SUFHUCxjQWhFV25hLFVBNkROK0ssR0FBRW9QO0tBR3dCLHNCQWhFcEIreEUsZUE4RFYxakU7S0FFUyw2QkFEVGduRTtNQU1HO2dDQUE4QyxXQXJFdkM3NEUsYUE4RFY2UjsrQkFPNEIsV0FyRWxCN1IsYUE2REp3RDtPQVFILHdCQUFPLFdBckVBeEQsYUE2RE41TDtNQU1KO2VBdEhKNjNCLFNBc0hJOzs7SUFHQyxPQVJEcGE7R0FRSztHQUdRLElBQWZpbkUsZUFBZSxXQXpFSGI7WUEwRVpjLG1CQUFtQjNrRixHQUFFb1A7SUFBSSxzQkExRWJ0YSxVQTBFT2tMLEdBMUVQcWpGO0lBMEVhLGNBRFYsV0F6RUh2dUYsVUEwRVNzYSxHQURyQnMxRTtHQUMwRDtZQUUxRDV0RixVQUFNa0osR0FBRW9QO0lBQ0ksSUFBVncxRSxVQUFVLFdBN0VBeHZGLFdBNEVONEssR0FBRW9QO0lBRVAsY0E5RVduYSxVQTRFSm1hLEdBNUVJbTZEOztLQThFbUM7O09BSi9Db2IsbUJBR0VDLFNBRE14MUU7WUFFdUMsV0E5RW5DbmEsVUE4RW1DLFdBOUVuQ2UsV0E2RVY0dUYsU0FETXgxRSxJQUFGcFA7OztNQU9EO21DQUFpRCxXQW5GMUM0TCxhQTZFVmc1RTsrQkFNNEIsV0FuRmxCaDVFLGFBNEVKd0Q7T0FPSCx3QkFBTyxXQW5GQXhELGFBNEVONUw7TUFLSjtlQXBJSjYzQixTQW9JSTs7O0lBR0MsT0FQRCtzRDtHQU9RO1lBR1Y3dEYsVUFBTWlKLEdBQUVvUDtJQUNWLEtBZEV1MUUsbUJBYU0za0YsR0FBRW9QLElBT0wsa0JBOUZTcFosV0F1Rk5nSyxHQUFFb1A7SUFNSDs7Ozs7U0FBaUQsV0E3RjFDeEQsYUE2Rm9ELFdBN0ZwRDVWLFdBdUZOZ0ssR0FBRW9QOzs2QkFNc0IsV0E3RmxCeEQsYUF1Rkp3RDtLQU1ILHdCQUFPLFdBN0ZBeEQsYUF1Rk41TDtJQUlKLGtCQTlJSjYzQixTQThJSTtHQUdNO1lBR1JndEQsTUFBSTdrRjtJQUFJLE9BQUcsV0FqR0NsTCxVQWlHUmtMLEdBakdRcWpGO2NBaUdrQjtjQUE2QixXQWpHL0N2bUYsT0FpR1JrRDtHQUE0RDtZQUNoRThrRixNQUFJOWtGO0lBQUksT0FBRyxXQWxHQ2xMLFVBa0dSa0wsR0FsR1FxakY7Y0FrR2tCO2NBQTZCLFdBbEcvQzE4QixLQWtHUjNtRDtHQUE0RDthQWxHcERtakY7SUFxR1Q7WUFFTDRCLGNBQWdCbC9FLEtBQThCd1c7SUFDaEQsR0FEa0J4VztTQUFRQyxNQUFSRCxnQkFBUUM7O1NBQVJHO0lBQ2Esc0JBeEdmKzZFLGNBdUdnQzNrRTtJQUN6QyxrQkF4R1N3bkUsVUF3R1QsK0JBRFc1OUU7R0FDZ0M7WUFHaEQrK0UsZ0JBQWtCbi9FLEtBQThCd1c7SUFDbEQsR0FEb0J4VztTQUFRQyxNQUFSRCxnQkFBUUM7O1NBQVJHO0lBQ21CLHNCQTVHdkIrOEUsWUEyR2tDM21FO0lBQ3JDO2FBNUdHMG1FLGdCQTRHSCwrQkFETzk4RTtHQUNvQztPQUd0RGcvRSxzQ0FSQUYsZ0JBSUFDO1lBVUFFLG1CQUFxQnIvRSxLQUE4QjBYLElBQUdDO0lBQ3hELEdBRHVCM1g7U0FBUUMsTUFBUkQsZ0JBQVFDOztTQUFSRztJQUM2QjtzQkF0SHBDKzZFLGNBcUh3Q3hqRTtLQUNwQixpQkF0SHBCd2pFLGNBcUhxQ3pqRTtJQUM5QzthQXRIU3NtRSxVQXNIVCxnQ0FEZ0I1OUU7R0FDNkM7WUFHbEVrL0UscUJBQXVCdC9FLEtBQThCMFgsSUFBR0M7SUFDMUQsR0FEeUIzWDtTQUFRQyxNQUFSRCxnQkFBUUM7O1NBQVJHO0lBQ2lDLHFCQTFIMUMrOEUsWUF5SDBDeGxFLEtBQ2QsaUJBMUg1QndsRSxZQXlIdUN6bEU7SUFDMUM7YUExSEd3bEUsZ0JBMEhILGdDQURZOThFO0dBQytDOztJQUd0RW0vRTswQkFSQUYscUJBSUFDO1lBVUFFLGFBQVdybEY7SUFDYjtLQUNTLHFCQXJJT2doRixjQW1JSGhoRjtLQUVKOztJQUVKLGNBdklXbkwsVUFtSUhtTCxHQW5JR3VwRTtLQXdJa0QsdUJBQU0sV0F4SXhEMzlELGFBbUlINUw7S0FLTjtPQTNMTDYzQixTQTJMYTs7SUFDSSxJQUFiNHdCLGlCQXpJVTA2Qjs7S0EwSVI7OztTQTFJUTdyRjs7U0EwSUc7V0ExSUg4cUYsV0FtSUhwaUYsR0FPaUIsV0ExSWR5aUYscUJBeUlWaDZCOzs7O0dBSU87Ozs7T0E3SUcvNEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FrRFp4NUIsV0FXQVcsV0FlQUMsV0FXQUMsV0FVQTh0RixPQUNBQztPQWxHWWpCOzs7Ozs7Ozs7Ozs7Ozs7T0ErR2RvQjtPQWNBRztPQU1BQztpQ0FuSWNmOzs7RS9GdERuQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lvR3loQk9yNkU7SUFHR3dqRDtJQW9DRi85Qjs7Ozs7Ozs7Ozs7SUEwWUNybEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTF4QkpsSjtJQUNBdlI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBM0tBaW9DO0lBS0dueUI7SUFJQ21IOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBQ0osU0FGR3hELEtBRUNoYSxHQUFLLGtCQURMd2QsTUFDQXhkLEdBQVc7R0FTYTtJQU4xQnFoQjtJQUNBNUc7SUFDQ0Y7SUFJRG94QixlQVhDM3hCLGVBTURTO0lBTUF6Uzs0REFOQXlTOztZQWlCRkQsaUJBQW9CLFNBQUU7WUFDdEJuSSxTQUFTclMsR0FBSSxPQUFKQSxFQUFLO1lBQ2RzUyxTQUFTdFMsR0FBSSxPQUFKQSxFQUFLO1lBRWRvUyxVQUFVL0Q7SUFDWixJQUFJLHVDQURRQSxJQUNSO2dCQUNHLHVDQUZLQTtHQUVpQztZQStIM0M4RCxVQUFVblM7SUFDWjtLQUNPQyxJQUFJLDJCQUZDRDtLQUdOLG1DQURDQztLQXhIYTJrQjtPQXlIZCxzQ0FITTVrQjtVQUVMQztVQUNpQywyQkFINUJEO0tBckhSMlQsa0NBRGdCaVI7S0FFUGhiO0lBQ1g7UUFGRStKLEtBQ1MvSixHQUVOLG9DQUphZ2I7S0FNVixvQ0FOVUEsS0FFUGhiOzs7OztvQkFBYixPQUZvQmdiO0tBT1csSUFMbEJuUCxNQUtrQiw0QkFMbEI3TDs7R0F1SGtEO0dBSzlCO0lBQS9CMDFGLCtCQUErQjtJQUMvQkMsNEJBQTRCO0lBUTVCeHRGO0lBQ0FOO0lBUkEybEQ7SUFDQXRCO0lBQ0F1QjtJQUNBbW9DO0lBQ0FDO0lBQ0FDO0lBQ0FDO1lBR0FDLFNBQVNoMkYsR0FBSSxpQ0FBSkEsR0FBb0I7R0FHYjtJQUZoQmd1RDtJQUNBRTtJQUNBK25DLGdCQUFnQjtJQUNoQkMsZ0JBQWdCO1lBZWhCQyxVQUFVcHZGO0lBQ1osS0FBRyxnQ0FEU0E7S0FLSix1Q0FMSUEsR0FoQlZrdkY7bUJBc0JRLHlCQU5FbHZGOztJQUdELElBQUxrRyxNQUFLLHFCQUhDbEc7SUFJUCx1Q0FEQ2tHLEtBbEJKaXBGO2tCQW1CaUMseUJBRDdCanBGOztHQUlHO1lBR2VtcEYsY0FBY3J2RjtJQUN0QyxHQUFHLGdDQURtQ0E7S0FHM0IsSUFBTGtHLE1BQUsscUJBSDJCbEc7S0FJakMsbUNBRENrRyxLQTVCSmlwRjtNQThCSyxnQ0FGRGpwRjtLQUdnRSwyQkFOaENsRztLQU0vQjs7SUFDQyxtQ0FQOEJBLEdBMUJwQ2t2RjtLQWtDRyxnQ0FSaUNsdkY7SUFTcUMsMkJBVHJDQTtJQVNqQztHQUFnRjtZQUduRnN2RixZQUFZdHZGO0lBQ2QsR0FBRyxnQ0FEV0E7S0FFTix1Q0FGTUEsR0FyQ1ptdkY7bUJBdUNtQyx5QkFGdkJudkY7O0lBSUgsSUFBTGtHLE1BQUssdUJBSkdsRztJQUtULHVDQURDa0csS0ExQ0pncEY7a0JBMkNpQyx5QkFEN0JocEY7O0dBQ21FO1lBR2pEcXBGLGdCQUFnQnZ2RjtJQUN4QyxHQUFHLGdDQURxQ0E7S0FHbkMsbUNBSG1DQSxHQTdDdENtdkY7TUFpREssZ0NBSmlDbnZGO0tBS2dDLDJCQUxoQ0E7S0FLakM7O0lBRUksSUFBTGtHLE1BQUssdUJBUDZCbEc7SUFRbkMsbUNBRENrRyxLQXJESmdwRjtLQXVESyxnQ0FGRGhwRjtJQUlzRSwyQkFYcENsRztJQVdwQztHQUFtRjtZQUdyRnd2RixvQkFBb0J4dkY7SUFDdEI7TUFBRyxnQ0FEbUJBLEdBNURwQmt2RjtTQTZEdUIsZ0NBREhsdkYsR0EzRHBCbXZGO0tBNkRHLFdBQUsseUJBRlludkY7SUFHakI7R0FBSTtZQUdleXZGLHdCQUF3Qnp2RjtJQUNoRDtNQUFHLGdDQUQ2Q0EsR0FsRTlDa3ZGO1NBbUV1QixnQ0FEdUJsdkYsR0FqRTlDbXZGO0tBbUVHLGdDQUYyQ252RjtJQU01QywyQkFONENBO0lBSTlDO0dBR0k7R0FrQmlCOztJQUFyQjB2RixtQkFBbUI7SUFDbkJDLG1CQUFtQjtJQUtuQkMseUJBQXlCO1lBRUhDLDJCQUEyQjd2RjtJQUdoRDs7dUNBSGdEQSxHQUZqRDR2Rjs7O0lBQXlCLG1DQUV3QjV2RjtHQUszQztZQUdOOHZGLGtCQUFrQjl2RjtJQUNwQixHQUFHLGdDQURpQkE7S0FHVCxJQUFMa0csTUFYa0IycEYsMkJBUUo3dkY7S0FJZix1Q0FEQ2tHLEtBN0dKaXBGO21CQThHaUMseUJBRDdCanBGOzs7SUFHSyxJQUFMQyxNQUFLLHVCQUFNLDRCQU5Hbkc7SUFPZix1Q0FEQ21HLEtBakhKK29GO2tCQWtIaUMseUJBRDdCL29GOztHQUNtRTtZQUd2RTRwRixrQkFBa0IvdkY7SUFDcEIsR0FBRyxnQ0FEaUJBO0tBR2YscUNBSGVBLEdBekJsQjJ2RjtNQThCUSx1Q0FMVTN2RixHQXBIbEJtdkY7b0JBMEhVLHlCQU5RbnZGOztLQUlnQixXQXRCWjZ2RiwyQkFrQko3dkY7S0FJYixXQUFLOztJQUlKLHFDQVJZQSxHQTFCbEIwdkY7S0FvQ00sdUNBVlkxdkYsR0FySGxCa3ZGO21CQWdJUSx5QkFYVWx2Rjs7SUFTYyxrQ0FBTyw0QkFUckJBO0lBU2YsV0FBSztHQUdEOztJQUdQZ3dGOzBCQWZBRCxvQkFWQUQ7WUErQkFHLHNCQUFzQmp3RjtJQUN4QixHQUFHLGdDQURxQkE7S0FHYixJQUFMa0csTUExQ2tCMnBGLDJCQXVDQTd2RjtLQUluQixtQ0FEQ2tHLEtBNUlKaXBGO01BOElLLGdDQUZEanBGO0tBR3FFLDJCQU5uRGxHO0tBTWpCOztJQUVJLElBQUxtRyxNQUFLLHVCQUFNLDRCQVJPbkc7SUFTbkIsbUNBRENtRyxLQWxKSitvRjtLQW9KSyxnQ0FGRC9vRjtJQUdxRSwyQkFYbkRuRztJQVdqQjtHQUErRTtZQUc5RGt3RixzQkFBc0Jsd0Y7SUFDOUMsR0FBRyxnQ0FEMkNBO0tBR3pDLG1DQUh5Q0EsR0E1RDVDMnZGO01BZ0U0QixXQXpETkUsMkJBcURzQjd2RjtNQUloQjs7S0FDcEIsbUNBTG9DQSxHQXZKNUNtdkY7TUE2SkssZ0NBTnVDbnZGO0tBTzZCLDJCQVA3QkE7S0FPdkM7O0lBQ0MsbUNBUnNDQSxHQTdENUMwdkY7S0FzRTBCLGtDQUFPLDRCQVRXMXZGO0tBU2xCOztJQUNwQixtQ0FWc0NBLEdBeEo1Q2t2RjtLQW1LRyxnQ0FYeUNsdkY7SUFhK0IsMkJBYi9CQTtJQWE1QztHQUFxRjs7SUFHckZtd0Y7MEJBaEJzQkQsd0JBZHRCRDtZQXVDU0csV0FBYXZxRixLQUFnQjdGO0lBQ3hDLEdBRHdCNkYsU0FBTUMsTUFBTkQsY0FBTUMsY0FBTndvQztJQUN4QixvQkFEd0JBOzs7Z0JBL0dBbWhELHdCQStHZ0J6dkY7Z0JBVHRDbXdGLG1CQVNzQ253RjsyQkFBaEJzdUMsTUFuSUFpaEQsZ0JBbUlnQnZ2RixLQXZKaEJxdkYsY0F1SmdCcnZGO0dBS1o7WUFHMUJxd0YsT0FBU3hxRixLQUFnQjdGO0lBQzNCLEdBRFc2RixTQUFNQyxNQUFORCxjQUFNQyxjQUFOd29DO0lBQ1gsSUFBSSxlQVRPOGhELGVBUUE5aEQsTUFBZ0J0dUMsS0FDdkI7Z0JBQ0c7R0FBSTtZQUdUc3dGLE9BQU90d0Y7SUFBSSwyQ0FBSkE7SUFBSTtHQUFZO1lBQ3ZCdXdGLFVBQVV2d0Y7SUFBSSx1Q0FBSkE7SUFBSTtHQUFXO1lBRXpCd3dGLFNBQVVuaEcsR0FBT0M7SUFDbkIsT0FBRyxtQkFEZ0JBO2NBQVBEO2NBQ2U7d0JBRGZBO2dCQUFPQztnQkFDZ0MsZ0NBRHZDRCxHQUFPQyxLQUFQRCxJQUFPQztHQUNtRDtZQUdwRW1oRyxTQUFVcGhHLEdBQU9DO0lBQ25CLE9BQUcsbUJBRGdCQTtjQUFQRDtjQUNlO3dCQURmQTtnQkFBT0M7Z0JBQ2dDLGdDQUR2Q0QsR0FBT0MsS0FBUEQsSUFBT0M7R0FDbUQ7O0lBR3BFaWhDO0lBQ0Exd0I7SUFDQThtRDtJQUVBK3BDO1lBQ0FDLE9BQU90aEcsR0FBSSxtQ0FBSkEsTUFBVTtZQVdmdWhHLFdBQVc1d0YsR0FBSSxvQ0FBSkEsR0FBUztZQUNwQjZ3RixTQUFTN3dGLEdBQUksb0NBQUpBLEdBQVM7WUFPcEJ3bEQsbUJBQW1CeGxEO0lBQUksT0FBRyxnQ0FBUEE7Y0FBb0IsdUJBQXBCQTtjQUFzQyxxQkFBdENBO0dBQWdEO1lBR3BEOHdGLHFCQUFxQjl3RjtJQUN0QztNQUFHLGdDQURtQ0EsR0F6SXBDMHZGO1NBMEl5QixnQ0FEVzF2RixHQXhJcEMydkY7S0EwSVMsOEJBbklhRSwyQkFpSWM3dkY7SUFHakMsbUNBSGlDQTtHQUcxQjtZQUdWMGxELGNBQWMxbEQsR0FBSSxPQU5IOHdGLHFCQU1EOXdGLEdBQW9EO1lBRWxFK3dGLDJCQUEyQi93RjtJQUM3Qjs7TUFBRyxnQ0FEMEJBLEdBakozQjB2RjtXQWtKMEIsZ0NBREMxdkYsR0FoSjNCMnZGO0tBb0pZO01BQVJuaUQsUUFBUSx1QkFKZXh0QztNQU12Qmd4RixlQUFlLDRCQUZmeGpEO01BR0F5akQsYUFBYSw0QkFQVWp4RixHQUl2Qnd0QztNQUlBMGpELFlBQVksNEJBRlpGLGNBTnVCaHhGO0tBU3hCLG1DQUZDaXhGLFlBQ0FDLFlBRUMsT0FORDFqRDtLQU9JLG1DQUpKeWpELFlBQ0FDO01BSUMsT0FOREY7S0FRRixpQ0FWRXhqRDtLQVVGLG1EQVZFQSxRQUVBd2pEOztJQUpELG1DQUZ3Qmh4RjtHQWdCVDtHQUdHO0lBQXJCbXhGLHFCQUFxQjtJQUNyQkMscUJBQXFCO1lBRXJCQyxtQkFBbUJyeEY7SUFDckIsR0FBRyxnQ0FEa0JBO0tBR1YsSUFBTGtHLE1BQUsscUJBSFVsRztLQUloQixtQ0FEQ2tHLEtBTEprckY7TUFPSyxrQ0FGRGxyRjtLQU1BLHVDQVRlbEc7S0FPakI7O0lBSUksbUNBWGFBLEdBSG5CbXhGO0tBZUcsa0NBWmdCbnhGO0lBZ0JqQix1Q0FoQmlCQTtJQWNuQjtHQUdJO1lBR0pzeEYscUJBQXFCdHhGO0lBQ3ZCLEdBQUcsZ0NBRG9CQTtLQUdsQixtQ0FIa0JBLEdBdEJyQm94RjtNQTBCSyxrQ0FKZ0JweEY7S0FRakIsdUNBUmlCQTtLQU1uQjs7SUFLTyxJQUFMa0csTUFBSyx1QkFYWWxHO0lBWWxCLG1DQURDa0csS0FsQ0ppckY7S0FvQ0ssa0NBRkRqckY7SUFNQSx1Q0FqQmlCbEc7SUFlbkI7R0FHSztZQUdQdXhGLCtCQUF1Q3hHO0lBQ2pDLElBQUovcUYsSUF4RWE4d0YscUJBdUV3Qi9GO0lBRXRDLG1DQURDL3FGO0tBR0MsbUNBSERBLEdBNUNGb3hGO01BZ0RLLGtDQUpIcHhGO0tBUUUsMkJBVG1DK3FGO0tBT3JDOztJQUlJLG1DQVZKL3FGLEdBN0NGbXhGO0tBd0RHLGtDQVhEbnhGO0lBZUEsMkJBaEJxQytxRjtJQWN2QztHQUdJO1lBR0p5RywrQkFBdUN2eEY7SUFBaUIsV0F2SnhEa3dGLG1CQXVKdUNsd0Y7SUFBaUI7R0FBc0I7O0lBRTlFd3hGOztTQUZBRDtTQXBCQUQ7WUE0QkEzckMsTUFBUS8vQyxLQUFnQjdGO0lBQzFCLEdBRFU2RixTQUFNQyxNQUFORCxjQUFNQyxjQUFOd29DO0lBQ1Ysb0JBRFVBO2tDQXRHUmtYLG1CQXNHd0J4bEQsS0E3RnhCMGxELGNBNkZ3QjFsRDs7aUJBQWhCc3VDO2dCQUdDLHVCQUhldHVDO2dCQUlqQixxQkFKaUJBO0dBS0s7T0FZM0IvSDtHQUtELFNBRkN5MkIsWUFvQkNwYTtJQWxCRixTQWtCRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztRQWpCZ0Q7O1FBQ1Y7O1FBQ007O1FBQ007O1FBQ1Y7Ozs7Z0JBYXhDQTs7TUFDQTs0Q0FwQkVtNUMsa0JBbUJGbjVDOzs7TUFEQTs0Q0FsQkVtNUMsa0JBbUJGbjVDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1FBWGM7OENBUlptNUMsa0JBbUJGbjVDOztRQVRBOzhDQVZFbTVDLGtCQW1CRm41Qzs7UUFQQTs4Q0FaRW01QyxrQkFtQkZuNUM7O1FBTGM7OENBZFptNUMsa0JBbUJGbjVDOztRQUhBOzhDQWhCRW01QyxrQkFtQkZuNUM7OztJQUdBLCtDQXRCRW01QyxrQkFtQkZuNUM7R0FHc0U7WUFJdkUxSTtJQUNEOztPQUNlOztPQUNMOztPQUNHOztPQUNHO2VBQ0w7O0dBQXlCO1lBcUJuQ2k0QyxZQUFVN2pEO0lBQW1CLFdBM0I3QjRMLFlBMkJVNUw7SUFBbUI7R0FBYTtZQUMxQ29tRCxZQUFVMW9EO0lBQUksT0F2RGRneEIsWUF1RHdCLDZCQUFkaHhCO0dBQWdDO1lBRzVDZzBGLFNBQVMxeEY7SUFDWCxPQUNNLDJCQUZLQTs7T0FHSTs7T0FDRzs7T0FDTDs7T0FDSTtlQUNMOztHQUFLO1lBR2Z5akQsbUJBQXFCNTlDLFdBQXVDd3ZCO0lBQzlELEdBRHVCeHZCLFNBQVlDLE1BQVpELG9CQUFZQyxjQUFaKzhDO0lBQ3ZCLGFBRHVEdmpDLGlCQUFicXlFLGFBQWFyeUUsZ0JBQWJxeUU7SUFDcEMsd0NBRHdEdDhEOztLQUVwRCw0Q0FGb0RBLFFBQXZDd3RCO0lBSVY7O0tBRENsYjtLQUFORDtLQUNGdUIsU0FBTyxxQ0FETHZCLE1BSGVtYjtJQUtyQixHQUx3Qzh1QztLQU1POzBCQUFLbmlGLEdBQUssaUNBQUxBLE9BQXFCO01BRHJFNDZELFVBQ2lCLGtDQUhUemlDOztTQUVSeWlDLFVBRlF6aUM7OEJBRVJ5aUMsaUJBSUssT0FMTG5oQztJQU1XLCtDQUxYbWhDO0lBS1csb0NBTlhuaEM7R0FNdUI7WUFHM0J4UyxjQUFlb3NCLFdBQVloOUMsS0FBZThyRixrQkFBb0MxeEY7SUFDaEYsR0FENkI0RixTQUFXQyxNQUFYRCxtQkFBV0MsY0FBWDhyRjtJQUM3QjtTQUR5RXR5RSxpQkFBaEJ1eUUsZ0JBQWdCdnlFOztTQUFoQnV5RTtPQUE1QkQsY0FFeEIsZ0NBRndCQTtJQUd2QixZQTFCSkYsU0F1QjhFenhGO29CQUtqRTs7S0FEUSx1Q0FKeURBOztLQU8xRXZDO09BUG1EbTBGO1VBUS9CLGdDQVJHRCxVQUFtRDN4RjtVQVF0QixnQ0FSN0IyeEYsVUFBbUQzeEY7SUFVOUUsT0F2QkF3akQsbUJBYWVaLFdBQTJCOHVDLFlBT3RDajBGO0dBR3VDO1lBRzNDeXhCLFlBQVVudkI7SUFDRCxJQUFQZ0wsT0FBTyxXQXRtQlBsQixXQXFtQlE5Sjt1Q0FHUyxPQUZqQmdMOztTQVVNcXFCLFNBVk5ycUI7S0FXSSx5Q0FERXFxQjtlQVZOcnFCO21CQTNCRnk0Qyx5QkFxQ1FwdUI7O0lBREEsNkJBQVUseUJBVGhCcnFCO0lBT0c7YUEzbkJMNnNCO2FBMm5CSztHQUk0RTtZQUdqRmk2RDtJQUFnQzl4RixHQUFJNkYsS0FBY2tzRixNQUFNQyxNQUFNQyxNQUFNQyxNQUFNQztJQUs1RSxHQUxzQ3RzRixTQUFTQyxNQUFURCxpQkFBU0MsY0FBVDZsQjtJQThCaEMsWUFqRkorbEUsU0FtRGdDMXhGO29CQWdDbkI7O0tBRFEsdUNBL0JXQTthQWtDNUIyckUsR0FBRzNyRTtjQWNENHBELEtBQUt3b0MsS0FBSUMsV0FBRUM7TUFDYjtNQUN5QjtRQUF0QixnQ0FGVUE7V0FFWSxnQ0FGZEQ7Ozs7T0FHTCxtQ0FIT0M7UUFHeUI7O1dBalIxQzVzQyxjQWlSd0QsNEJBSHZDNHNDO1FBR29CLG1DQUh0QkQ7OztRQUNYOztNQUdZO2NBbFJoQjNzQyxjQWtSOEIsNEJBSmI0c0M7TUFJTixxQ0FKSUQ7T0FJWDtNQTlDSTtPQUFKemlFO1NBQUk7dUJBQU0sNEJBMENDeWlFLFdBQUVDO09BbkNibmpDLFFBQVEsNEJBbUNLbWpDLGFBMUNiMWlFO09BUXdCLG1DQVJ4QkE7T0FRQTJpRSxTQUFTLDRCQWtDSUQ7T0E5QmJFLGFBQWEsNEJBSmJELFFBa0NXRjtPQTdCWEksWUFBWSw0QkE2QkRKLFdBbkNYbGpDO09BT0F4VCxNQXBUSncwQyxtQkFzU0l2Z0U7T0FnRE1pbkM7U0FqQ1AsZ0NBSEMyN0IsWUFDQUM7WUFHQyw0QkFGRDkyQztZQUdJO21DQUxKNjJDLFlBQ0FDO2NBQ0E5MkM7O2tCQU1vQyw2QkFOcENBOztnQkFRQyw0QkFSREE7T0FpQ096UCxJQUdHLDZCQUZKMnFCO09BREY1OUQsSUFHRiw0QkFGSTQ5RDtjQURGNTlEO2VBQUdpekM7O2tCQVNGLGdDQTlEMkJ2Z0IsUUFxRDVCMXlCLEdBTEdtNUY7a0JBZUYsZ0NBL0QyQnptRSxRQXFENUIxeUIsR0FMR201RixLQUtBbG1EO09BT1A7O01BREE7S0FJc0M7S0FhckMscUNBMUNFbHNDO01BNENHLG1DQTVDSEE7T0E2Q0EsT0EvQkQ0cEQsS0FoRDRDbW9DLE1Ba0MzQy94RjtNQThDRyxtQ0E5Q0hBO09BK0NBLE9BakNENHBELEtBaERrRG9vQyxNQWtDakRoeUY7TUFnREcsbUNBaERIQTtPQWlEQSxPQW5DRDRwRCxLQWhEd0Rxb0MsTUFrQ3ZEanlGO01Ba0RHLG1DQWxESEE7T0FtREEsT0FyQ0Q0cEQsS0FoRDhEc29DLE1Ba0M3RGx5RjtXQWxDbUVteUYsTUF3RjVELHVDQXhGc0J4bUUsUUFrQzdCM3JCO1VBdURJMHlGLFNBekYrRFA7TUEwRmpFLHVDQXhERm55RjtnQkFjRDRwRCxLQXlDSzhvQyxRQXZESjF5RjtnQkEwREksZ0NBNUZ5QjJyQixRQWtDN0IzckI7O0tBRWdCO09BQVgsb0NBRkxBO1VBRWdCLGdDQUZoQkE7TUFHSztPQUFKM1EsSUFBSSw2QkFyQ3dCczhCLFFBcUNmLDBCQUhkM3JCO01BS0EsaUNBRkMzUSxXQVNDLE9BVERBO01BSU07T0FBSittQixNQUFJLDRCQUpOL21CO09BS0VrakIsSUFBSiw2QkFESTZEO01BRUosZUFGSUEsS0FFUSw0QkFEUjdEO01BRUosZUFISTZELEtBR1EsNEJBRlI3RDtNQUVKLG1DQUhJNkQ7O0tBTE47SUF3RGlDO0lBRWxDLG1DQTlGNkJwVyxRQThGaEIsT0E1RFoyckUsR0FsQzRCM3JFO0lBOEZBLFdBNUQ1QjJyRSxHQTREK0IsNkJBOUZIM3JFO0lBOEZBO0dBQU87WUFHdkMyeUYseUJBQXlCM3lGO0lBQzNCLE9BbEdFOHhGO2FBaUd5Qjl4RjtHQUMyRDtZQVVwRjZrRCxRQUFReDFELEdBQUVrakI7SUFDWixTQURZQSxHQUdQO0lBUUs7S0FBSjZELFVBQVEsNEJBWEovbUI7S0FZSm1qQixVQVpNRDtLQWFOZ1A7T0FEQS9PO0tBREE0RCxTQU1HLGdDQU5IQTtLQUNBNUQsU0FNRyw2QkFOSEE7b0JBQ0ErTyxXQUZBbkwsUUFlQSw2QkFkQTVEOzs7d0RBREE0RCxRQUVBbUw7Y0FpQkMsNkJBbEJEL087TUFDQStPLFdBaUI4Qiw0QkFuQjlCbkwsUUFFQW1MO0tBRkFuTCxTQW9CRyw0QkFwQkhBO0tBQ0E1RCxTQW9CRyw2QkFwQkhBOztHQXdCUztZQUdib2dGLFVBQVV2akcsR0FBR3VzQztJQUNmLEdBQUcsZ0NBRFN2c0MsUUFFUDtJQUNPLEtBL1pWa2hHLFVBNFpVbGhHLElBSVAsT0FKT0E7b0JBQUd1c0M7S0FVSztNQURNaTNELEtBVFhqM0Q7TUFVSzs7VUF6bUJsQjk2QjtVQXltQnlCLHFCQUFVLGlCQUFPLHNCQVZoQ3pSO01BVUZ5akcsS0FBSyw0QkFEV0Q7TUFGaEJFLE9BR0FEO01BSEpFLE9BRW9CSDs7S0FJTjtNQU5WSSxPQVBLcjNEO01BYUs7O1VBNW1CbEI5NkI7VUE0bUJ5QixxQkFBVSxpQkFBTyxzQkFiaEN6UjtNQU9ONmpHLE9BTVMsNEJBTkxEOztNQUFKRDtpQkFXQzthQVhEQSxNQWFDLE9BcEJLM2pHO0lBd0JLLElBQVQ4akcsU0FBUyx5QkFqQlBKO2FBaUJGSSxlQWpCRkg7S0FvQ1ksSUFBUjd4RSxRQWxGUjBqQyxhQStETXN1QztLQW9CRixRQXJDSUo7TUFzQ0M7O1NBNVpUaEMsMkJBNFpvQyw0QkE3QzFCMWhHLEdBMkNGOHhCO01BRUMseUNBRkRBOztLQUdDO2FBN1pUNHZFLDJCQTZab0MsNEJBOUMxQjFoRyxHQTJDRjh4QjtLQUdDLHlDQUhEQTs7SUFGUyxPQTN4QmpCMWYsVUEyeEJpQixnQ0FsQ2J1eEYsTUFQTTNqRztHQThDa0Q7WUFHNUQrakcsa0JBQWtCL2pHLEdBQUdna0c7SUFDdkIsV0FEdUJBO2NBakRyQlQsVUFpRGtCdmpHLGtCQUFHZ2tHO2NBR3JCLGdDQUhxQkE7R0FPdUM7WUFHNURDLGNBQWNqa0csR0FBR2trRztJQUFpQixPQTNEbENYLFVBMkRjdmpHLG1CQUFHa2tHO0dBQWtFO1lBQ25GaDZELFFBQVF2NUIsR0FBR3c1QixLQUFLQztJQUFPLDJDQUFaRCxLQUFIeDVCO0lBQWUsOENBQWZBLEdBQVF5NUI7R0FBNEI7WUFFNUNFLFVBQVUzNUIsR0FBR3hRLEtBQUtEO0lBRXBCLEdBQU8sZ0NBRlFDLEtBQUtEO0tBSXBCLG1DQUpZeVEsR0FBR3hRLEtBQUtEO0lBRXBCO0dBRTJCO1lBR3pCcXFDLE1BQU01NUIsR0FBR3hRLEtBQUtEO0lBRWhCLEdBQUcsZ0NBRlFDLEtBQUtEO0tBR1gsV0FBRyw0QkFIQXlRLEdBQUd4USxLQUFLRDtJQVFUOzRCQUFpQyxXQXAxQnBDdWEsV0E0MEJZdmE7S0FRVCx1QkFBUyxXQXAxQlp1YSxXQTQwQk90YTtLQU1QOztHQUVzRDs7SUFHeEQ2ZjtJQUNBa2M7SUFDQTMyQjtJQUVBQztJQUVBQztZQUVBMCtGLFNBQVN4ekY7SUFDWCxHQUFHLGdDQURRQSxRQUVOO0lBQ0csbUNBSEdBLFFBSU47SUFDRyxtQ0FMR0EsUUFNTjtJQUNvRDswQkFqUXZEbXZCLFlBMFBTbnZCO0tBT1E7O0dBQTBEO1lBRzNFeXpGLFlBQVl6ekY7SUFDZCxPQUFHLGdDQURXQTs7Y0FDYTtxQ0FEYkE7O2dCQUNxQyxnQ0FEckNBO0dBQzhEO1lBRzFFMHpGLGNBQWMxekY7SUFDTCxJQUFQNGIsT0FBTyx5QkFESzViO0lBRVYsNkJBREY0YjtHQUN5QjtHQUtGOztJQUF6QiszRTtNQUF5Qjs7SUFDekJDLGdCQUFnQiwwQkFEaEJEO0lBQ2dCO0lBQ087SUFBdkJFLGdCQUF1QjtJQUN2QkMsa0JBQWtCLDJCQURsQkQ7SUFIQUU7WUFNQUMsY0FBY2gwRjtJQUNoQjtLQUFJNGIsT0FBTyx5QkFESzViO0tBRUQsaUNBRFg0YixNQVBGbTRFO0lBUUs7NkNBUExKO0dBUWtCO1lBR2xCTSxjQUFjajBGO0lBQ0wsSUFBUDRiLE9BQU8seUJBREs1YjtJQUVlO29EQUQzQjRiLE1BVEZrNEU7R0FVeUQ7WUFHekRJLGdCQUFpQkMsVUFBVXB2QyxVQUFVcXZDO0lBQ3ZDLEdBQVEseUJBRHFCcnZDLFVBZjNCNnVDLG1CQWUyQjd1QztLQUV4Qix1Q0FGd0JBLFVBZjNCNnVDO0lBa0JhLHFDQUh3QlEsVUFkckNQO0lBaUJhLG1DQUh3Qk87S0FRbkM7dUNBdEJGUDtNQXFCRSxpQ0FQbUNPO0tBS3JDOztJQU9nQjtLQURaQyxZQVhhRjtLQVliRztPQUFZO1NBQXNCLDRCQVpYdnZDO0tBYXZCd3ZDLFlBQVksMkJBYnFCSDtLQWNqQ3g0RSxPQUFtQixjQUhuQnk0RSxXQUdtQyxjQUZuQ0MsV0FDQUM7SUFFSix3Q0FESTM0RTtHQUMwQjtZQUc5QjQ0RSxZQUFhTCxVQUFVcHZDLFVBQVVxdkM7d0JBQ04sT0FuQjNCRixnQkFrQmFDLFVBQVVwdkMsVUFBVXF2QyxVQUN1QztJQUF4RDtHQUF5RDtZQU92RTVULFlBQVVueEYsR0FBSSx1Q0FBSkEsR0FBMkI7WUFDckNzbUQsWUFBVXRtRCxHQUFJLFdBRGRteEYsWUFDVW54RixJQUEyQjtZQUNyQ3UzRCxZQUFVdjNELEdBQUksT0EzNEJoQm9TLFVBMjRCWXBTLEdBQWU7OzswQ0ExNUJ6QmdJLFdBTkF5UyxXQWdLRjI4Qzs7WUE4d0JBdnNCLFlBQVlsNkIsR0FBSSx1Q0FBSkEsT0FBVTtZQUN0Qm02QixnQkFBZ0JuNkIsR0FBSSx1Q0FBSkEsT0FBVztZQUMzQm82QixZQUFZcDZCLEdBQUksdUNBQUpBLE9BQVU7WUFDdEJxNkIsZ0JBQWdCcjZCLEdBQUksdUNBQUpBLE9BQVc7Ozs2Q0FLdkJxSyxhQWh5Qko3STs7O0lBNnlCMkN6TTs7Ozs7O1lBTXpDOHJGLFdBQVN4eEYsR0FBSSxPQUFKQSxFQUFLO0dBYUg7SUFLWG9sRztJQUxXOzs7Ozs7T0FLWEE7T0E5c0JGN0U7T0EwTUEyQjtPQW9CQUM7T0F2S3NCdEI7Ozs7Ozs7Ozs7OztZQWlzQnRCMWdHLElBQUtILEdBQU9DO0lBQUksS0FBRyxzQkFBZEQsR0FBT0MsUUFBZ0IsbUJBQXZCRCxJQUE0QyxPQUFyQ0M7SUFBOEIsT0FBckNEO0dBQTZDO1lBQ2xERSxJQUFLRixHQUFPQztJQUFJLEtBQUcsc0JBQWRELEdBQU9DLFFBQWdCLG1CQUF2QkQsSUFBNEMsT0FBckNDO0lBQThCLE9BQXJDRDtHQUE2Qzs7OztPQXJnQy9DdWE7T0FrQkhqSTtPQURBRDtPQTNCR2dFO09BR0EyRDtPQUtEcUg7T0FzbUJGeWU7T0FobEJBMXRCOzs7Ozs7Ozs7T0FnL0JBalM7T0FDQUQ7OztPQW5NQWdxQztPQUVBSTtPQU9BQzs7O09BdjBCRW9CO09BeTZCRmQ7T0FDQUM7T0FDQUM7T0FDQUM7T0FoNkJBeHdCOztPQTJJQTFJO09BQ0F2UjtPQURBdVI7T0FDQXZSO09BR0E2MkQ7T0FDQXRCO09BQ0F1QjtPQUNBbW9DO09BQ0FDO09BQ0FDO09BQ0FDOzs7T0FSQUw7T0FDQUM7Ozs7O09BUUF4dEY7T0FDQU47T0FDQW11RjtPQUNBaG9DO09BQ0FFO09Bd1VBdkI7T0E5SUF5cUM7T0FSU0Q7T0FnRFQ1cUM7OztPQVNBRTtPQUVBcXJDO09BaExBdkI7T0F0QkFGO09BdEJBRjtPQW9IQVk7T0FsRXNCUDtPQXBCQUY7T0FwQkFGO09BOEl0QmM7T0E4R0FtQjtPQXBCQUQ7T0ErREFJO09BalVBdkM7T0FDQUM7T0E4UEFnQztPQUNBQztPQTRZQWdDO09BVUFFOztPQXhkQWhEO09BQ0FDOztPQUVBQztPQUlBQztPQXNlQXBoRjtPQUNBa2M7T0FHQTEyQjs7T0FGQUQ7O09BSUFFO1dBeGRFODdGLFlBQ0FDOzs7T0FqQkZ0Z0U7T0FDQTF3QjtPQUNBOG1EO09BRUErcEM7OztRQThkQXJoRjtRQUNBa2M7UUFDQTMyQjtRQUVBQzs7O1FBRUFDO1FBc0cyQ007Ozs7Ozs7UUE1a0IzQ3V4RDtRQXZOQUY7UUFPQXJsRDtRQWt5QkV5L0U7V0FsSEZ4eEUsVUFDQWtjLFVBQ0EzMkIsVUFFQUMsNEJBRUFDO09BdnNCQTBNO09Ba2NBaTFCO09BNkhBazhEO09BakdBYjtPQTRHQWp0QztPQXRXQThyQzs7OztRQTBJRTE0RjtRQUNBZ1M7UUFFQXlrQjtRQTJCQTlpQjtRQVVDOGpCO1FBa0JEMDJCO1FBREF2QztPQUlGNnRDOztPQThSQThCO09BVUFDO09BNkNBZTtPQWxCQU47T0F2QkFSO09BWUFNO09BTUFDO1dBaDRCRXZqRixXQWc2QkFpbEMsYUE5NUJDL3JDLGdCQSs1QkRnOUMsYUFGQTQ1Qjs7OztFcEdsN0JQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R3NHTWE7O0lBQ1JvVTs7Ozs7OztJQURBQzs7O1lBR0E5aUYsSUFBTWxNO0lBQ1IsR0FEUUE7U0FBcUJDLE1BQXJCRCw2QkFBcUJDOztTQUFyQmd2RjtJQUNSLDBDQURRQTtHQUNzQztZQUc1Q3R6RixVQUFVeEI7SUFDWixPQVJFNjBGLFdBQ0FELGlCQU9pQyxnQ0FEdkI1MEY7R0FDOEQ7WUFHeEUrMEYsZUFBZS8wRjtJQUF1QixVQUp0Q3dCLFVBSWV4QjtJQUF1QjtHQUFhO1lBQ25EOEosVUFBVTlKO0lBQUksYUFBK0MzUSxHQUFLLFdBQUxBLEdBQWdCO0lBQTNDLFVBRGxDMGxHLGVBQ1UvMEY7SUFBSSxXQUFVO0dBQXVEO09BRzdFZzFGLG9DQUNBQztZQUNBQyxtQkFBaUIsMENBQWtDO1lBRW5EQyxvQkFBb0IvcEY7SUFDdEIsT0FBRyx5QkFEbUJBLFdBRnBCOHBGO0dBR3VFO1lBZXZFRSxlQUFlL3hGLEdBQUdwRDtJQUNSLElBQVJvMUYsUUFBUSxXQXBCVko7SUFxQkYsV0F0QkVELGVBb0JlM3hGO3dCQUdrQixPQURuQyxXQXRCRTJ4RixlQXFCRUssT0FFa0Q7SUFBOUIsZ0NBSEpwMUY7R0FHbUM7WUFJdkQ4TTtJQWhCUTs7S0FFa0I7TUFBakIxZDs7MEJBQUs7TUFBWSxrQ0FBakJBO01BSExpbUcsaUNBR1U7O1NBSFZBO0lBS0osY0FMSUE7aUJBSzBDLFdBZjVDTjtHQTJCK0M7Ozs7T0E5QmpEbHJGO09BVEFpSTtPQUlBdlE7T0FJQXV6RjtPQVhBRjs7UUFnQkVJO1FBREFEO1FBb0JBSTtRQWxCQUY7UUFFQUM7T0F1QkZwb0Y7OztFdEdoREw7Ozs7Ozs7Ozs7Ozs7R3VHcUtlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBcElWdGQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvSVU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBYVI4TjtJQVA4QixpQ0FPOUJBO0lBU0E2SjtJQUNBc0I7SUFFQTZzRjtJQUlBQztZQUlDQyxtQkFHQ3ZnRjtJQUFvQixpQ0FBcEJBO0dBQXlEO0dBQTdEO0lBT0V2TztJQUNBc0I7SUFFQ25FO0lBTUMrSTtHQUNKLFNBRkd6SCxVQUVDL1YsR0FBSyxrQkFETHdkLE1BQ0F4ZCxHQUFXOztJQUdicW1HO0lBQ0FDO0lBQ0NDO0lBTURodkY7SUFDQXNCO0lBRUNyRTtJQU1DMmlEO0dBQ0osU0FGR3RoRCxVQUVDN1YsR0FBSyxrQkFETG0zRCxRQUNBbjNELEdBQVc7O0lBR2J3bUc7SUFDQUM7SUFDQ0M7SUFNREM7SUFNQW52RjtJQUNBNEI7SUFFQ2hGO0lBTUN3eUY7R0FDSixTQUZHM3dGLFdBRUNqVyxHQUFLLGtCQURMNG1HLFFBQ0E1bUcsR0FBVzs7SUFHYjZtRztJQUNBQztJQUNDQztJQU1EdHZGO0lBQ0FxQjtJQUVDNUU7SUFJQzh5RjtHQUNKLFNBRkdseEYsU0FFQzlWLEdBQUssa0JBRExnbkcsUUFDQWhuRyxHQUFXOztJQUdiaW5HO0lBQ0FDO0lBQ0NDO0lBTUR6dkY7SUFDQXFCO0lBRUN4RTtJQU1DNnlGO0dBQ0osU0FGR3h4RixXQUVDNVYsR0FBSyxrQkFETG9uRyxRQUNBcG5HLEdBQVc7O0lBR2Jxbkc7SUFDQUM7SUFDQ0M7SUFNRDV2RjtJQUNBcUI7SUFFQzdFO0lBTUNxekY7R0FDSixTQUZHN3hGLFdBRUMzVixHQUFLLGtCQURMd25HLFFBQ0F4bkcsR0FBVzs7SUFHYnluRztJQUNBQztJQUNDQztJQU1EdHZGO0lBQ0FrQjtJQUVBMUU7SUFVQSt5RjtJQUlBQztZQUlDQyxrQkFDQ2ppRjtJQUFvQixnQ0FBcEJBO0dBQXdEO0dBQTVEO0lBUUVqTztJQUNBcUI7SUFFQ3ZFO0lBTUNxekY7R0FDSixTQUZHcnlGLGVBRUMxVixHQUFLLGtCQURMK25HLFFBQ0EvbkcsR0FBVzs7SUFHYmdvRztJQUNBQztJQUVDQztJQVNEeHZGO0lBSUFjO0lBSUE3RTtJQVVBd3pGO0lBSUFDO1lBSUNDLG9CQUdDeGlGO0lBQW9CLGtDQUFwQkE7R0FBMEQ7R0FBOUQ7SUFPRWxOO0lBQ0FjO0lBRUE2dUY7SUFJQUM7WUFJQ0MsaUJBQ0MzaUY7SUFBb0IsK0JBQXBCQTtHQUF1RDtHQUEzRDtJQU9FaE87SUFDQXFCO0lBRUM3RTtHQU9ILFNBRkcyQixZQUVDaFcsR0FBSyxnQ0FBTEEsR0FBVzs7SUFHYnlvRztJQUNBQztJQUNDQztJQU1EQztJQUNBQztJQUNBQztJQUNBQztJQUNDQztJQU1EbHhGO0lBQ0FxQjtJQUVDbEY7SUFNQ2cxRjtHQUNKLFNBRkcveUYsVUFFQ2xXLEdBQUssa0JBRExpcEcsUUFDQWpwRyxHQUFXO0dBbFRIO0lBcVRWa3BHO0lBQ0FDO0lBQ0NDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBDRHZpRztJQVlBOEc7SUFDQUU7SUFPQXc3RjtJQUNBQztJQUNBOWdFO0lBSUExNkI7SUEzWFU7O09BSVZpSztPQUNBc0I7T0FFQTZzRjtPQUlBQztPQUlDQztPQVVEOXVGO09BQ0FzQjtPQUVDbkU7T0FLQXNCO09BS0Rzd0Y7T0FDQUM7T0FDQ0M7T0FNRGh2RjtPQUNBc0I7T0FFQ3JFO09BS0FxQjtPQUtEMndGO09BQ0FDO09BQ0NDO09BTURDO09BTUFudkY7T0FDQTRCO09BRUNoRjtPQUtBNkI7T0FLRDR3RjtPQUNBQztPQUNDQztPQU1EdHZGO09BQ0FxQjtPQUVDNUU7T0FHQTRCO09BS0RteEY7T0FDQUM7T0FDQ0M7T0FNRHp2RjtPQUNBcUI7T0FFQ3hFO09BS0FxQjtPQUtEeXhGO09BQ0FDO09BQ0NDO09BTUQ1dkY7T0FDQXFCO09BRUM3RTtPQUtBd0I7T0FLRDh4RjtPQUNBQztPQUNDQztPQU1EdHZGO09BQ0FrQjtPQUVBMUU7T0FVQSt5RjtPQUlBQztPQUlDQztPQVNEbHdGO09BQ0FxQjtPQUVDdkU7T0FLQWdCO09BS0RzeUY7T0FDQUM7T0FFQ0M7T0FTRHh2RjtPQUlBYztPQUlBN0U7T0FVQXd6RjtPQUlBQztPQUlDQztPQVVEMXZGO09BQ0FjO09BRUE2dUY7T0FJQUM7T0FJQ0M7T0FRRDN3RjtPQUNBcUI7T0FFQzdFO09BS0EyQjtPQUtEeXlGO09BQ0FDO09BQ0NDO09BTURDO09BQ0FDO09BQ0FDO09BQ0FDO09BQ0NDO09BTURseEY7T0FDQXFCO09BRUNsRjtPQUtBaUM7T0FLRGd6RjtPQUNBQztPQUNDQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EwQ0R2aUc7T0FZQThHO09BQ0FFO09BT0F3N0Y7T0FDQUM7T0FDQTlnRTtPQUlBMTZCO0lBdlhBeTdGO0lBQ0FDO0lBRUFDO0lBSUFDO0lBSUNDO0lBVURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBTUFDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUNDO0lBR0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUFDO0lBVUFDO0lBSUFDO0lBSUNDO0lBU0RDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBRUNDO0lBU0RDO0lBSUFDO0lBSUFDO0lBVUFDO0lBSUFDO0lBSUNDO0lBVURDO0lBQ0FDO0lBRUFDO0lBSUFDO0lBSUNDO0lBUURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBQ0FDO0lBQ0FDO0lBQ0NDO0lBTURDO0lBQ0FDO0lBRUNDO0lBS0FDO0lBS0RDO0lBQ0FDO0lBQ0NDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTBDRGptRztJQVlBMmI7SUFDQUU7SUFPQW5YO0lBQ0FFO0lBQ0FzaEc7SUFJQUM7Ozs7R0FnQkc7Ozs7OztPQWppQkwvdUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EwSkVtcEc7T0FDQUM7T0FFQUM7T0FJQUM7T0FJQ0M7T0FVREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FNQUM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQ0M7T0FHQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQUM7T0FVQUM7T0FJQUM7T0FJQ0M7T0FTREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FFQ0M7T0FTREM7T0FJQUM7T0FJQUM7T0FVQUM7T0FJQUM7T0FJQ0M7T0FVREM7T0FDQUM7T0FFQUM7T0FJQUM7T0FJQ0M7T0FRREM7T0FDQUM7T0FFQ0M7T0FLQUM7T0FLREM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FDQUM7T0FDQUM7T0FDQ0M7T0FNREM7T0FDQUM7T0FFQ0M7T0FLQUM7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QyxTQUFTQztLQUNrQiwwQ0FEbEJBO0tBQ2tCO0lBQU87SUFHbEM7aUJBUEVsQzs7S0FNRm1DLGdCQUhBRjtpQkFIRWpDOztLQVFGb0MsZ0JBTEFIO0tBaUNHLE1BL0RQSCxZQTJCTTlCO0tBbUNFLE1BeEVSNEIsYUFxQ001QjtLQW1DRTtpQkFUV3FDO2tCQUNBQzttQkFDQXpCO09BQ0wsU0FES0EsV0E1QmJiO1FBOEJtQiwyQ0FKTnFDLEdBQ0FDO09BS0Q7TUFBYTtNQUpSOzs7TUFDVDtLQUdpQjtLQUxSOzs7S0FDVDtJQUlpQjtJQU5SOztLQUFUO2VBRko7ZUFEQTs7V0FEQTtlQURBO0tBREYsVUFBRTtLQUZIO0tBSHVDLFVBQUM7S0FBaEMsVUFBQyx3Q0FQWkY7ZUFPSTtLQURzQyxVQUFDO0tBQWhDLFVBQUMsd0NBUlpEO0tBT1UsVUFDTjtLQUREO0tBREcsVUFBQztLQURKLFVBQ0g7SUFERztHQTBCTjtHQUlELDhCQXBPQXJDLE1BMkxBa0MsTUFuTEFqQzs7OztPQVpBSjtPQUlBRztPQVFBQztPQW1IQTBCO09BMkJBRztPQVVBRTtPQTJCQUU7OztFRHpPTDs7Ozs7Ozs7Ozs7OztHQ0FBOzs7Ozs7OztHQ2tCUzs7OztFRGxCVCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mZnNldFxudmFyIGNhbWxfaW50NjRfb2Zmc2V0ID0gTWF0aC5wb3coMiwgLTI0KTtcblxuLy9Qcm92aWRlczogTWxJbnQ2NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXQsIGNhbWxfcmFpc2VfemVyb19kaXZpZGVcbmZ1bmN0aW9uIE1sSW50NjQgKGxvLG1pLGhpKSB7XG4gIHRoaXMubG8gPSBsbyAmIDB4ZmZmZmZmO1xuICB0aGlzLm1pID0gbWkgJiAweGZmZmZmZjtcbiAgdGhpcy5oaSA9IGhpICYgMHhmZmZmO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuY2FtbF9jdXN0b20gPSBcIl9qXCJcbk1sSW50NjQucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh0aGlzLmxvLHRoaXMubWksdGhpcy5oaSk7XG59XG5cbk1sSW50NjQucHJvdG90eXBlLnVjb21wYXJlID0gZnVuY3Rpb24gKHgpIHtcbiAgaWYgKHRoaXMuaGkgPiB4LmhpKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMuaGkgPCB4LmhpKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLm1pID4geC5taSkgcmV0dXJuIDE7XG4gIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICBpZiAodGhpcy5sbyA8IHgubG8pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5NbEludDY0LnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIGhpID0gdGhpcy5oaSA8PCAxNjtcbiAgdmFyIHhoaSA9IHguaGkgPDwgMTY7XG4gIGlmIChoaSA+IHhoaSkgcmV0dXJuIDE7XG4gIGlmIChoaSA8IHhoaSkgcmV0dXJuIC0xO1xuICBpZiAodGhpcy5taSA+IHgubWkpIHJldHVybiAxO1xuICBpZiAodGhpcy5taSA8IHgubWkpIHJldHVybiAtMTtcbiAgaWYgKHRoaXMubG8gPiB4LmxvKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMubG8gPCB4LmxvKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gKCkge1xuICB2YXIgbG8gPSAtIHRoaXMubG87XG4gIHZhciBtaSA9IC0gdGhpcy5taSArIChsbyA+PiAyNCk7XG4gIHZhciBoaSA9IC0gdGhpcy5oaSArIChtaSA+PiAyNCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBsbyA9IHRoaXMubG8gKyB4LmxvO1xuICB2YXIgbWkgPSB0aGlzLm1pICsgeC5taSArIChsbyA+PiAyNCk7XG4gIHZhciBoaSA9IHRoaXMuaGkgKyB4LmhpICsgKG1pID4+IDI0KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIGxvID0gdGhpcy5sbyAtIHgubG87XG4gIHZhciBtaSA9IHRoaXMubWkgLSB4Lm1pICsgKGxvID4+IDI0KTtcbiAgdmFyIGhpID0gdGhpcy5oaSAtIHguaGkgKyAobWkgPj4gMjQpO1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbG8gPSB0aGlzLmxvICogeC5sbztcbiAgdmFyIG1pID0gKChsbyAqIGNhbWxfaW50NjRfb2Zmc2V0KSB8IDApICsgdGhpcy5taSAqIHgubG8gKyB0aGlzLmxvICogeC5taTtcbiAgdmFyIGhpID0gKChtaSAqIGNhbWxfaW50NjRfb2Zmc2V0KSB8IDApICsgdGhpcy5oaSAqIHgubG8gKyB0aGlzLm1pICogeC5taSArIHRoaXMubG8gKiB4LmhpO1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5sb3x0aGlzLm1pfHRoaXMuaGkpID09IDA7XG59XG5NbEludDY0LnByb3RvdHlwZS5pc05lZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLmhpIDw8IDE2KSA8IDA7XG59XG5NbEludDY0LnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyAmIHgubG8sIHRoaXMubWkgJiB4Lm1pLCB0aGlzLmhpICYgeC5oaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh0aGlzLmxvfHgubG8sIHRoaXMubWl8eC5taSwgdGhpcy5oaXx4LmhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh0aGlzLmxvXngubG8sIHRoaXMubWleeC5taSwgdGhpcy5oaV54LmhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnNoaWZ0X2xlZnQgPSBmdW5jdGlvbiAocykge1xuICBzID0gcyAmIDYzO1xuICBpZiAocyA9PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKHMgPCAyNCkge1xuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAodGhpcy5sbyA8PCBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubWkgPDwgcykgfCAodGhpcy5sbyA+PiAoMjQgLSBzKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5oaSA8PCBzKSB8ICh0aGlzLm1pID4+ICgyNCAtIHMpKSk7XG4gIH1cbiAgaWYgKHMgPCA0OClcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvIDw8IChzIC0gMjQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubWkgPDwgKHMgLSAyNCkpIHwgKHRoaXMubG8gPj4gKDQ4IC0gcykpKTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KDAsIDAsIHRoaXMubG8gPDwgKHMgLSA0OCkpXG59XG5NbEludDY0LnByb3RvdHlwZS5zaGlmdF9yaWdodF91bnNpZ25lZCA9IGZ1bmN0aW9uIChzKSB7XG4gIHMgPSBzICYgNjM7XG4gIGlmIChzID09IDApIHJldHVybiB0aGlzO1xuICBpZiAocyA8IDI0KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgICAodGhpcy5sbyA+PiBzKSB8ICh0aGlzLm1pIDw8ICgyNCAtIHMpKSxcbiAgICAgICh0aGlzLm1pID4+IHMpIHwgKHRoaXMuaGkgPDwgKDI0IC0gcykpLFxuICAgICAgKHRoaXMuaGkgPj4gcykpO1xuICBpZiAocyA8IDQ4KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgICAodGhpcy5taSA+PiAocyAtIDI0KSkgfCAodGhpcy5oaSA8PCAoNDggLSBzKSksXG4gICAgICAodGhpcy5oaSA+PiAocyAtIDI0KSksXG4gICAgICAwKTtcbiAgcmV0dXJuIG5ldyBNbEludDY0ICh0aGlzLmhpID4+IChzIC0gNDgpLCAwLCAwKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnNoaWZ0X3JpZ2h0ID0gZnVuY3Rpb24gKHMpIHtcbiAgcyA9IHMgJiA2MztcbiAgaWYgKHMgPT0gMCkgcmV0dXJuIHRoaXM7XG4gIHZhciBoID0gKHRoaXMuaGkgPDwgMTYpID4+IDE2O1xuICBpZiAocyA8IDI0KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgICAodGhpcy5sbyA+PiBzKSB8ICh0aGlzLm1pIDw8ICgyNCAtIHMpKSxcbiAgICAgICh0aGlzLm1pID4+IHMpIHwgKGggPDwgKDI0IC0gcykpLFxuICAgICAgKCh0aGlzLmhpIDw8IDE2KSA+PiBzKSA+Pj4gMTYpO1xuICB2YXIgc2lnbiA9ICh0aGlzLmhpIDw8IDE2KSA+PiAzMTtcbiAgaWYgKHMgPCA0OClcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKFxuICAgICAgKHRoaXMubWkgPj4gKHMgLSAyNCkpIHwgKHRoaXMuaGkgPDwgKDQ4IC0gcykpLFxuICAgICAgKHRoaXMuaGkgPDwgMTYpID4+IChzIC0gMjQpID4+IDE2LFxuICAgICAgc2lnbiAmIDB4ZmZmZik7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCAoKHRoaXMuaGkgPDwgMTYpID4+IChzIC0gMzIpLCBzaWduLCBzaWduKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmxzbDEgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuaGkgPSAodGhpcy5oaSA8PCAxKSB8ICh0aGlzLm1pID4+IDIzKTtcbiAgdGhpcy5taSA9ICgodGhpcy5taSA8PCAxKSB8ICh0aGlzLmxvID4+IDIzKSkgJiAweGZmZmZmZjtcbiAgdGhpcy5sbyA9ICh0aGlzLmxvIDw8IDEpICYgMHhmZmZmZmY7XG59XG5NbEludDY0LnByb3RvdHlwZS5sc3IxID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmxvID0gKCh0aGlzLmxvID4+PiAxKSB8ICh0aGlzLm1pIDw8IDIzKSkgJiAweGZmZmZmZjtcbiAgdGhpcy5taSA9ICgodGhpcy5taSA+Pj4gMSkgfCAodGhpcy5oaSA8PCAyMykpICYgMHhmZmZmZmY7XG4gIHRoaXMuaGkgPSB0aGlzLmhpID4+PiAxO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUudWRpdm1vZCA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBvZmZzZXQgPSAwO1xuICB2YXIgbW9kdWx1cyA9IHRoaXMuY29weSgpO1xuICB2YXIgZGl2aXNvciA9IHguY29weSgpO1xuICB2YXIgcXVvdGllbnQgPSBuZXcgTWxJbnQ2NCgwLDAsMCk7XG4gIHdoaWxlIChtb2R1bHVzLnVjb21wYXJlKGRpdmlzb3IpID4gMCkge1xuICAgIG9mZnNldCsrO1xuICAgIGRpdmlzb3IubHNsMSgpO1xuICB9XG4gIHdoaWxlIChvZmZzZXQgPj0gMCkge1xuICAgIG9mZnNldCAtLTtcbiAgICBxdW90aWVudC5sc2wxKCk7XG4gICAgaWYgKG1vZHVsdXMudWNvbXBhcmUoZGl2aXNvcikgPj0gMCkge1xuICAgICAgcXVvdGllbnQubG8gKys7XG4gICAgICBtb2R1bHVzID0gbW9kdWx1cy5zdWIoZGl2aXNvcik7XG4gICAgfVxuICAgIGRpdmlzb3IubHNyMSgpO1xuICB9XG4gIHJldHVybiB7IHF1b3RpZW50IDogcXVvdGllbnQsIG1vZHVsdXMgOiBtb2R1bHVzIH07XG59XG5NbEludDY0LnByb3RvdHlwZS5kaXYgPSBmdW5jdGlvbiAoeSlcbntcbiAgdmFyIHggPSB0aGlzO1xuICBpZiAoeS5pc1plcm8oKSkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgdmFyIHNpZ24gPSB4LmhpIF4geS5oaTtcbiAgaWYgKHguaGkgJiAweDgwMDApIHggPSB4Lm5lZygpO1xuICBpZiAoeS5oaSAmIDB4ODAwMCkgeSA9IHkubmVnKCk7XG4gIHZhciBxID0geC51ZGl2bW9kKHkpLnF1b3RpZW50O1xuICBpZiAoc2lnbiAmIDB4ODAwMCkgcSA9IHEubmVnKCk7XG4gIHJldHVybiBxO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gKHkpXG57XG4gIHZhciB4ID0gdGhpcztcbiAgaWYgKHkuaXNaZXJvKCkpIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCk7XG4gIHZhciBzaWduID0geC5oaTtcbiAgaWYgKHguaGkgJiAweDgwMDApIHggPSB4Lm5lZygpO1xuICBpZiAoeS5oaSAmIDB4ODAwMCkgeSA9IHkubmVnKCk7XG4gIHZhciByID0geC51ZGl2bW9kKHkpLm1vZHVsdXM7XG4gIGlmIChzaWduICYgMHg4MDAwKSByID0gci5uZWcoKTtcbiAgcmV0dXJuIHI7XG59XG5NbEludDY0LnByb3RvdHlwZS50b0ludCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubG8gfCAodGhpcy5taSA8PCAyNCk7XG59XG5NbEludDY0LnByb3RvdHlwZS50b0Zsb2F0ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKCh0aGlzLmhpIDw8IDE2KSAqIE1hdGgucG93KDIsIDMyKSArIHRoaXMubWkgKiBNYXRoLnBvdygyLCAyNCkpICsgdGhpcy5sbztcbn1cbk1sSW50NjQucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBbdGhpcy5oaSA+PiA4LFxuICAgICAgICAgIHRoaXMuaGkgJiAweGZmLFxuICAgICAgICAgIHRoaXMubWkgPj4gMTYsXG4gICAgICAgICAgKHRoaXMubWkgPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHRoaXMubWkgJiAweGZmLFxuICAgICAgICAgIHRoaXMubG8gPj4gMTYsXG4gICAgICAgICAgKHRoaXMubG8gPj4gOCkgJiAweGZmLFxuICAgICAgICAgIHRoaXMubG8gJiAweGZmXTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmxvMzIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxvIHwgKCh0aGlzLm1pICYgMHhmZikgPDwgMjQpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuaGkzMiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICgodGhpcy5taSA+Pj4gOCkgJiAweGZmZmYpIHwgKHRoaXMuaGkgPDwgMTYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VsdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bHQoeCx5KSB7IHJldHVybiB4LnVjb21wYXJlKHkpIDwgMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NvbXBhcmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY29tcGFyZSh4LHksIHRvdGFsKSB7IHJldHVybiB4LmNvbXBhcmUoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X25lZyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9uZWcgKHgpIHsgcmV0dXJuIHgubmVnKCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2FkZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9hZGQgKHgsIHkpIHsgcmV0dXJuIHguYWRkKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zdWIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc3ViICh4LCB5KSB7IHJldHVybiB4LnN1Yih5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbXVsIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9tdWwoeCx5KSB7IHJldHVybiB4Lm11bCh5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaXNfemVybyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc196ZXJvKHgpIHsgcmV0dXJuICt4LmlzWmVybygpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaXNfbmVnYXRpdmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaXNfbmVnYXRpdmUoeCkgeyByZXR1cm4gK3guaXNOZWcoKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2FuZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9hbmQgKHgsIHkpIHsgcmV0dXJuIHguYW5kKHkpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb3IgKHgsIHkpIHsgcmV0dXJuIHgub3IoeSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF94b3IgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfeG9yICh4LCB5KSB7IHJldHVybiB4Lnhvcih5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfbGVmdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0ICh4LCBzKSB7IHJldHVybiB4LnNoaWZ0X2xlZnQocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkICh4LCBzKSB7IHJldHVybiB4LnNoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCAoeCwgcykgeyByZXR1cm4geC5zaGlmdF9yaWdodChzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfZGl2IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2RpdiAoeCwgeSkgeyByZXR1cm4geC5kaXYoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X21vZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9tb2QgKHgsIHkpIHsgcmV0dXJuIHgubW9kKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9pbnQzMiAoeCkge1xuICByZXR1cm4gbmV3IE1sSW50NjQoeCAmIDB4ZmZmZmZmLCAoeCA+PiAyNCkgJiAweGZmZmZmZiwgKHggPj4gMzEpICYgMHhmZmZmKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3RvX2ludDMyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3RvX2ludDMyICh4KSB7IHJldHVybiB4LnRvSW50KCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3RvX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3RvX2Zsb2F0ICh4KSB7IHJldHVybiB4LnRvRmxvYXQgKCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9mbG9hdCAoeCkge1xuICBpZiAoeCA8IDApIHggPSBNYXRoLmNlaWwoeCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChcbiAgICB4ICYgMHhmZmZmZmYsXG4gICAgTWF0aC5mbG9vcih4ICogY2FtbF9pbnQ2NF9vZmZzZXQpICYgMHhmZmZmZmYsXG4gICAgTWF0aC5mbG9vcih4ICogY2FtbF9pbnQ2NF9vZmZzZXQgKiBjYW1sX2ludDY0X29mZnNldCkgJiAweGZmZmYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zvcm1hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfbmVnYXRpdmUsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X3RvX2ludDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9mb3JtYXQgKGZtdCwgeCkge1xuICB2YXIgZiA9IGNhbWxfcGFyc2VfZm9ybWF0KGZtdCk7XG4gIGlmIChmLnNpZ25lZGNvbnYgJiYgY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSkge1xuICAgIGYuc2lnbiA9IC0xOyB4ID0gY2FtbF9pbnQ2NF9uZWcoeCk7XG4gIH1cbiAgdmFyIGJ1ZmZlciA9IFwiXCI7XG4gIHZhciB3YmFzZSA9IGNhbWxfaW50NjRfb2ZfaW50MzIoZi5iYXNlKTtcbiAgdmFyIGN2dGJsID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG4gIGRvIHtcbiAgICB2YXIgcCA9IHgudWRpdm1vZCh3YmFzZSk7XG4gICAgeCA9IHAucXVvdGllbnQ7XG4gICAgYnVmZmVyID0gY3Z0YmwuY2hhckF0KGNhbWxfaW50NjRfdG9faW50MzIocC5tb2R1bHVzKSkgKyBidWZmZXI7XG4gIH0gd2hpbGUgKCEgY2FtbF9pbnQ2NF9pc196ZXJvKHgpKTtcbiAgaWYgKGYucHJlYyA+PSAwKSB7XG4gICAgZi5maWxsZXIgPSAnICc7XG4gICAgdmFyIG4gPSBmLnByZWMgLSBidWZmZXIubGVuZ3RoO1xuICAgIGlmIChuID4gMCkgYnVmZmVyID0gY2FtbF9zdHJfcmVwZWF0IChuLCAnMCcpICsgYnVmZmVyO1xuICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIGJ1ZmZlcik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcGFyc2VfZGlnaXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdWx0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FkZCwgY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfbmVnXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9zdHJpbmcocykge1xuICB2YXIgciA9IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSAocyk7XG4gIHZhciBpID0gclswXSwgc2lnbiA9IHJbMV0sIGJhc2UgPSByWzJdO1xuICB2YXIgYmFzZTY0ID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihiYXNlKTtcbiAgdmFyIHRocmVzaG9sZCA9XG4gICAgICBuZXcgTWxJbnQ2NCgweGZmZmZmZiwgMHhmZmZmZmZmLCAweGZmZmYpLnVkaXZtb2QoYmFzZTY0KS5xdW90aWVudDtcbiAgdmFyIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB2YXIgcmVzID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihkKTtcbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICBjID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKTtcbiAgICBpZiAoYyA9PSA5NSkgY29udGludWU7XG4gICAgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgYnJlYWs7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIG11bHRpcGxpY2F0aW9uIGJhc2UgKiByZXMgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQodGhyZXNob2xkLCByZXMpKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgICBkID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihkKTtcbiAgICByZXMgPSBjYW1sX2ludDY0X2FkZChjYW1sX2ludDY0X211bChiYXNlNjQsIHJlcyksIGQpO1xuICAgIC8qIERldGVjdCBvdmVyZmxvdyBpbiBhZGRpdGlvbiAoYmFzZSAqIHJlcykgKyBkICovXG4gICAgaWYgKGNhbWxfaW50NjRfdWx0KHJlcywgZCkpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB9XG4gIGlmIChpICE9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIGlmIChiYXNlID09IDEwICYmIGNhbWxfaW50NjRfdWx0KG5ldyBNbEludDY0KDAsIDAsIDB4ODAwMCksIHJlcykpXG4gICAgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIGlmIChzaWduIDwgMCkgcmVzID0gY2FtbF9pbnQ2NF9uZWcocmVzKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkgY29uc3Rcbi8vUmVxdWlyZXM6IE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKGxvLCBtaSwgaGkpe1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSlcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsbywgaGkpe1xuICByZXR1cm4gbmV3IE1sSW50NjQgKFxuICAgIGxvICYgMHhmZmZmZmYsXG4gICAgKChsbyA+Pj4gMjQpICYgMHhmZikgfCAoKGhpICYgMHhmZmZmKSA8PCA4KSxcbiAgICAoaGkgPj4+IDE2KSAmIDB4ZmZmZik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2xvMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbG8zMih2KXsgcmV0dXJuIHYubG8zMigpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9oaTMyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2hpMzIodil7IHJldHVybiB2LmhpMzIoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSkge1xuICByZXR1cm4gbmV3IE1sSW50NjQoYVs3XSA8PCAwIHwgKGFbNl0gPDwgOCkgfCAoYVs1XSA8PCAxNiksXG4gICAgICAgICAgICAgICAgICAgICBhWzRdIDw8IDAgfCAoYVszXSA8PCA4KSB8IChhWzJdIDw8IDE2KSxcbiAgICAgICAgICAgICAgICAgICAgIGFbMV0gPDwgMCB8IChhWzBdIDw8IDgpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fYnl0ZXMoeCkgeyByZXR1cm4geC50b0FycmF5KCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hhc2ggY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGFzaCh2KXtcbiAgcmV0dXJuICh2LmxvMzIoKSkgXiAodi5oaTMyKCkpXG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxNCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBBbiBPQ2FtbCBzdHJpbmcgaXMgYW4gb2JqZWN0IHdpdGggdGhyZWUgZmllbGRzOlxuLy8gLSB0YWcgJ3QnXG4vLyAtIGxlbmd0aCAnbCdcbi8vIC0gY29udGVudHMgJ2MnXG4vL1xuLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgY2FuIGJlIGVpdGhlciBhIEphdmFTY3JpcHQgYXJyYXkgb3Jcbi8vIGEgSmF2YVNjcmlwdCBzdHJpbmcuIFRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcgY2FuIGJlIGxlc3MgdGhhbiB0aGVcbi8vIGxlbmd0aCBvZiB0aGUgT0NhbWwgc3RyaW5nLiBJbiB0aGlzIGNhc2UsIHJlbWFpbmluZyBieXRlcyBhcmVcbi8vIGFzc3VtZWQgdG8gYmUgemVyb2VzLiBBcnJheXMgYXJlIG11dGFibGUgYnV0IGNvbnN1bWVzIG1vcmUgbWVtb3J5XG4vLyB0aGFuIHN0cmluZ3MuIEEgY29tbW9uIHBhdHRlcm4gaXMgdG8gc3RhcnQgZnJvbSBhbiBlbXB0eSBzdHJpbmcgYW5kXG4vLyBwcm9ncmVzc2l2ZWx5IGZpbGwgaXQgZnJvbSB0aGUgc3RhcnQuIFBhcnRpYWwgc3RyaW5ncyBtYWtlcyBpdFxuLy8gcG9zc2libGUgdG8gaW1wbGVtZW50IHRoaXMgZWZmaWNpZW50bHkuXG4vL1xuLy8gV2hlbiBjb252ZXJ0aW5nIHRvIGFuZCBmcm9tIFVURi0xNiwgd2Uga2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZVxuLy8gc3RyaW5nIGlzIGNvbXBvc2VkIG9ubHkgb2YgQVNDSUkgY2hhcmFjdGVycyAoaW4gd2hpY2ggY2FzZSwgbm9cbi8vIGNvbnZlcnNpb24gbmVlZHMgdG8gYmUgcGVyZm9ybWVkKSBvciBub3QuXG4vL1xuLy8gVGhlIHN0cmluZyB0YWcgY2FuIHRodXMgdGFrZSB0aGUgZm9sbG93aW5nIHZhbHVlczpcbi8vICAgZnVsbCBzdHJpbmcgICAgIEJZVEUgfCBVTktOT1dOOiAgICAgIDBcbi8vICAgICAgICAgICAgICAgICAgIEJZVEUgfCBBU0NJSTogICAgICAgIDlcbi8vICAgICAgICAgICAgICAgICAgIEJZVEUgfCBOT1RfQVNDSUk6ICAgIDhcbi8vICAgc3RyaW5nIHByZWZpeCAgIFBBUlRJQUw6ICAgICAgICAgICAgIDJcbi8vICAgYXJyYXkgICAgICAgICAgIEFSUkFZOiAgICAgICAgICAgICAgIDRcbi8vXG4vLyBPbmUgY2FuIHVzZSBiaXQgbWFza2luZyB0byBkaXNjcmltaW5hdGUgdGhlc2UgZGlmZmVyZW50IGNhc2VzOlxuLy8gICBrbm93bl9lbmNvZGluZyh4KSA9IHgmOFxuLy8gICBpc19hc2NpaSh4KSA9ICAgICAgIHgmMVxuLy8gICBraW5kKHgpID0gICAgICAgICAgIHgmNlxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cl9yZXBlYXRcbmZ1bmN0aW9uIGNhbWxfc3RyX3JlcGVhdChuLCBzKSB7XG4gIGlmKG4gPT0gMCkgcmV0dXJuIFwiXCI7XG4gIGlmIChzLnJlcGVhdCkge3JldHVybiBzLnJlcGVhdChuKTt9IC8vIEVDTUFzY3JpcHQgNiBhbmQgRmlyZWZveCAyNCtcbiAgdmFyIHIgPSBcIlwiLCBsID0gMDtcbiAgZm9yKDs7KSB7XG4gICAgaWYgKG4gJiAxKSByICs9IHM7XG4gICAgbiA+Pj0gMTtcbiAgICBpZiAobiA9PSAwKSByZXR1cm4gcjtcbiAgICBzICs9IHM7XG4gICAgbCsrO1xuICAgIGlmIChsID09IDkpIHtcbiAgICAgIHMuc2xpY2UoMCwxKTsgLy8gZmxhdHRlbiB0aGUgc3RyaW5nXG4gICAgICAvLyB0aGVuLCB0aGUgZmxhdHRlbmluZyBvZiB0aGUgd2hvbGUgc3RyaW5nIHdpbGwgYmUgZmFzdGVyLFxuICAgICAgLy8gYXMgaXQgd2lsbCBiZSBjb21wb3NlZCBvZiBsYXJnZXIgcGllY2VzXG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3ViYXJyYXlfdG9fanNieXRlc1xuLy9XZWFrZGVmXG4vLyBQcmUgRUNNQVNjcmlwdCA1LCBbYXBwbHldIHdvdWxkIG5vdCBzdXBwb3J0IGFycmF5LWxpa2Ugb2JqZWN0LlxuLy8gSW4gc3VjaCBzZXR1cCwgVHlwZWRfYXJyYXkgd291bGQgYmUgaW1wbGVtZW50ZWQgYXMgcG9seWZpbGwsIGFuZCBbZi5hcHBseV0gd291bGRcbi8vIGZhaWwgaGVyZS4gTWFyayB0aGUgcHJpbWl0aXZlIGFzIFdlYWtkZWYsIHNvIHRoYXQgcGVvcGxlIGNhbiBvdmVycmlkZSBpdCBlYXNpbHkuXG5mdW5jdGlvbiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMgKGEsIGksIGxlbikge1xuICB2YXIgZiA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG4gIGlmIChpID09IDAgJiYgbGVuIDw9IDQwOTYgJiYgbGVuID09IGEubGVuZ3RoKSByZXR1cm4gZi5hcHBseSAobnVsbCwgYSk7XG4gIHZhciBzID0gXCJcIjtcbiAgZm9yICg7IDAgPCBsZW47IGkgKz0gMTAyNCxsZW4tPTEwMjQpXG4gICAgcyArPSBmLmFwcGx5IChudWxsLCBhLnNsaWNlKGksaSArIE1hdGgubWluKGxlbiwgMTAyNCkpKTtcbiAgcmV0dXJuIHM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdXRmOF9vZl91dGYxNlxuZnVuY3Rpb24gY2FtbF91dGY4X29mX3V0ZjE2KHMpIHtcbiAgZm9yICh2YXIgYiA9IFwiXCIsIHQgPSBiLCBjLCBkLCBpID0gMCwgbCA9IHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYyA9IHMuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgIGZvciAodmFyIGogPSBpICsgMTsgKGogPCBsKSAmJiAoYyA9IHMuY2hhckNvZGVBdChqKSkgPCAweDgwOyBqKyspO1xuICAgICAgaWYgKGogLSBpID4gNTEyKSB7IHQuc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiOyBiICs9IHMuc2xpY2UoaSwgaikgfVxuICAgICAgZWxzZSB0ICs9IHMuc2xpY2UoaSwgaik7XG4gICAgICBpZiAoaiA9PSBsKSBicmVhaztcbiAgICAgIGkgPSBqO1xuICAgIH1cbiAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhjMCB8IChjID4+IDYpKTtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfSBlbHNlIGlmIChjIDwgMHhkODAwIHx8IGMgPj0gMHhkZmZmKSB7XG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhlMCB8IChjID4+IDEyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKChjID4+IDYpICYgMHgzZiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8IChjICYgMHgzZikpO1xuICAgIH0gZWxzZSBpZiAoYyA+PSAweGRiZmYgfHwgaSArIDEgPT0gbCB8fFxuICAgICAgICAgICAgICAgKGQgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBkID4gMHhkZmZmKSB7XG4gICAgICAvLyBVbm1hdGNoZWQgc3Vycm9nYXRlIHBhaXIsIHJlcGxhY2VkIGJ5IFxcdWZmZmQgKHJlcGxhY2VtZW50IGNoYXJhY3RlcilcbiAgICAgIHQgKz0gXCJcXHhlZlxceGJmXFx4YmRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgaSsrO1xuICAgICAgYyA9IChjIDw8IDEwKSArIGQgLSAweDM1ZmRjMDA7XG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhmMCB8IChjID4+IDE4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKChjID4+IDEyKSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfVxuICAgIGlmICh0Lmxlbmd0aCA+IDEwMjQpIHt0LnN1YnN0cigwLCAxKTsgYiArPSB0OyB0ID0gXCJcIjt9XG4gIH1cbiAgcmV0dXJuIGIrdDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91dGYxNl9vZl91dGY4XG5mdW5jdGlvbiBjYW1sX3V0ZjE2X29mX3V0Zjgocykge1xuICBmb3IgKHZhciBiID0gXCJcIiwgdCA9IFwiXCIsIGMsIGMxLCBjMiwgdiwgaSA9IDAsIGwgPSBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGMxID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjMSA8IDB4ODApIHtcbiAgICAgIGZvciAodmFyIGogPSBpICsgMTsgKGogPCBsKSAmJiAoYzEgPSBzLmNoYXJDb2RlQXQoaikpIDwgMHg4MDsgaisrKTtcbiAgICAgIGlmIChqIC0gaSA+IDUxMikgeyB0LnN1YnN0cigwLCAxKTsgYiArPSB0OyB0ID0gXCJcIjsgYiArPSBzLnNsaWNlKGksIGopIH1cbiAgICAgIGVsc2UgdCArPSBzLnNsaWNlKGksIGopO1xuICAgICAgaWYgKGogPT0gbCkgYnJlYWs7XG4gICAgICBpID0gajtcbiAgICB9XG4gICAgdiA9IDE7XG4gICAgaWYgKCgrK2kgPCBsKSAmJiAoKChjMiA9IHMuY2hhckNvZGVBdChpKSkgJiAtNjQpID09IDEyOCkpIHtcbiAgICAgIGMgPSBjMiArIChjMSA8PCA2KTtcbiAgICAgIGlmIChjMSA8IDB4ZTApIHtcbiAgICAgICAgdiA9IGMgLSAweDMwODA7XG4gICAgICAgIGlmICh2IDwgMHg4MCkgdiA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ID0gMjtcbiAgICAgICAgaWYgKCgrK2kgPCBsKSAmJiAoKChjMiA9IHMuY2hhckNvZGVBdChpKSkgJiAtNjQpID09IDEyOCkpIHtcbiAgICAgICAgICBjID0gYzIgKyAoYyA8PCA2KTtcbiAgICAgICAgICBpZiAoYzEgPCAweGYwKSB7XG4gICAgICAgICAgICB2ID0gYyAtIDB4ZTIwODA7XG4gICAgICAgICAgICBpZiAoKHYgPCAweDgwMCkgfHwgKCh2ID49IDB4ZDdmZikgJiYgKHYgPCAweGUwMDApKSkgdiA9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHYgPSAzO1xuICAgICAgICAgICAgaWYgKCgrK2kgPCBsKSAmJiAoKChjMiA9IHMuY2hhckNvZGVBdChpKSkgJiAtNjQpID09IDEyOCkgJiZcbiAgICAgICAgICAgICAgICAoYzEgPCAweGY1KSkge1xuICAgICAgICAgICAgICB2ID0gYzIgLSAweDNjODIwODAgKyAoYyA8PCA2KTtcbiAgICAgICAgICAgICAgaWYgKHYgPCAweDEwMDAwIHx8IHYgPiAweDEwZmZmZikgdiA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2IDwgNCkgeyAvLyBJbnZhbGlkIHNlcXVlbmNlXG4gICAgICBpIC09IHY7XG4gICAgICB0ICs9IFwiXFx1ZmZmZFwiO1xuICAgIH0gZWxzZSBpZiAodiA+IDB4ZmZmZilcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ3YzAgKyAodiA+PiAxMCksIDB4ZGMwMCArICh2ICYgMHgzRkYpKVxuICAgIGVsc2VcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTtcbiAgICBpZiAodC5sZW5ndGggPiAxMDI0KSB7dC5zdWJzdHIoMCwgMSk7IGIgKz0gdDsgdCA9IFwiXCI7fVxuICB9XG4gIHJldHVybiBiK3Q7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29faXNfYXNjaWlcbmZ1bmN0aW9uIGpzb29faXNfYXNjaWkgKHMpIHtcbiAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnZXRzIGJldHRlciBhdCBhcm91bmQgdGhpcyBwb2ludCBmb3IgYWxsIGJyb3dzZXJzXG4gIGlmIChzLmxlbmd0aCA8IDI0KSB7XG4gICAgLy8gU3BpZGVybW9ua2V5IGdldHMgbXVjaCBzbG93ZXIgd2hlbiBzLmxlbmd0aCA+PSAyNCAob24gNjQgYml0IGFyY2hzKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgaWYgKHMuY2hhckNvZGVBdChpKSA+IDEyNykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2VcbiAgICByZXR1cm4gIS9bXlxceDAwLVxceDdmXS8udGVzdChzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSkge1xuICBzd2l0Y2ggKHMudCAmIDYpIHtcbiAgZGVmYXVsdDogLyogUEFSVElBTCAqL1xuICAgIGlmIChpID49IHMuYy5sZW5ndGgpIHJldHVybiAwO1xuICBjYXNlIDA6IC8qIEJZVEVTICovXG4gICAgcmV0dXJuIHMuYy5jaGFyQ29kZUF0KGkpO1xuICBjYXNlIDQ6IC8qIEFSUkFZICovXG4gICAgcmV0dXJuIHMuY1tpXVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGksIGMpIHtcbiAgLy8gVGhlIE9DYW1sIGNvbXBpbGVyIHVzZXMgQ2hhci51bnNhZmVfY2hyIG9uIGludGVnZXJzIGxhcmdlciB0aGFuIDI1NSFcbiAgYyAmPSAweGZmO1xuICBpZiAocy50ICE9IDQgLyogQVJSQVkgKi8pIHtcbiAgICBpZiAoaSA9PSBzLmMubGVuZ3RoKSB7XG4gICAgICBzLmMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSAoYyk7XG4gICAgICBpZiAoaSArIDEgPT0gcy5sKSBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LT1dOKi9cbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkgKHMpO1xuICB9XG4gIHMuY1tpXSA9IGM7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvciAoKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IgKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19ib3VuZF9lcnJvciwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQgKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQxNihzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gMSkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSksXG4gICAgICBiMiA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MTYocyxpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDEpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgMSk7XG4gIHJldHVybiAoYjIgPDwgOCB8IGIxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDMyKHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykgLSAzKSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDEpLFxuICAgICAgYjMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgMiksXG4gICAgICBiNCA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCB8IGIzIDw8IDE2IHwgYjIgPDwgOCB8IGIxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDMyKHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAzKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSksXG4gICAgICBiMiA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIDEpLFxuICAgICAgYjMgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAyKSxcbiAgICAgIGI0ID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgMyk7XG4gIHJldHVybiAoYjQgPDwgMjQgfCBiMyA8PCAxNiB8IGIyIDw8IDggfCBiMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQ2NChzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gNykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkoOCk7XG4gIGZvcih2YXIgaiA9IDA7IGogPCA4OyBqKyspe1xuICAgIGFbNyAtIGpdID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIGopO1xuICB9XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0NjQocyxpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDcpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkoOCk7XG4gIGZvcih2YXIgaiA9IDA7IGogPCA4OyBqKyspe1xuICAgIGFbNyAtIGpdID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0IChzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldCAocywgaSwgYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQgKHMsIGksIGMpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfdW5zYWZlX3NldCAocywgaSwgYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQxNihzLGksaTE2KXtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMSkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjIgPSAweEZGICYgaTE2ID4+IDgsXG4gICAgICBiMSA9IDB4RkYgJiBpMTY7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMSwgYjIpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQxNihzLGksaTE2KXtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3RyaW5nX3NldDE2XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19zZXQxNlxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0MTYocyxpLGkxNil7XG4gIHJldHVybiBjYW1sX2J5dGVzX3NldDE2KHMsaSxpMTYpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MzIocyxpLGkzMil7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGI0ID0gMHhGRiAmIGkzMiA+PiAyNCxcbiAgICAgIGIzID0gMHhGRiAmIGkzMiA+PiAxNixcbiAgICAgIGIyID0gMHhGRiAmIGkzMiA+PiA4LFxuICAgICAgYjEgPSAweEZGICYgaTMyO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAwLCBiMSk7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDEsIGIyKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMiwgYjMpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAzLCBiNCk7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDMyKHMsaSxpMzIpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0MzJcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3NldDMyXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQzMihzLGksaTMyKXtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfc2V0MzIocyxpLGkzMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQ2NChzLGksaTY0KXtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoaTY0KTtcbiAgZm9yKHZhciBqID0gMDsgaiA8IDg7IGorKykge1xuICAgIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDcgLSBqLCBhW2pdKTtcbiAgfVxuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQ2NChzLGksaTY0KXtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3RyaW5nX3NldDY0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19zZXQ2NFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0NjQocyxpLGk2NCl7XG4gIHJldHVybiBjYW1sX2J5dGVzX3NldDY0KHMsaSxpNjQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldCAocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSwgYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWksIGNhbWxfdXRmOF9vZl91dGYxNiwgTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyAocykge1xuICB2YXIgdGFnID0gOSAvKiBCWVRFUyB8IEFTQ0lJICovO1xuICBpZiAoIWpzb29faXNfYXNjaWkocykpXG4gICAgdGFnID0gOCAvKiBCWVRFUyB8IE5PVF9BU0NJSSAqLywgcyA9IGNhbWxfdXRmOF9vZl91dGYxNihzKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKHRhZywgcywgcy5sZW5ndGgpO1xufVxuXG5cbi8vUHJvdmlkZXM6IE1sQnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIGpzb29faXNfYXNjaWksIGNhbWxfdXRmMTZfb2ZfdXRmOFxuZnVuY3Rpb24gTWxCeXRlcyAodGFnLCBjb250ZW50cywgbGVuZ3RoKSB7XG4gIHRoaXMudD10YWc7IHRoaXMuYz1jb250ZW50czsgdGhpcy5sPWxlbmd0aDtcbn1cbk1sQnl0ZXMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKXtcbiAgc3dpdGNoICh0aGlzLnQpIHtcbiAgY2FzZSA5OiAvKkJZVEVTIHwgQVNDSUkqL1xuICAgIHJldHVybiB0aGlzLmM7XG4gIGRlZmF1bHQ6XG4gICAgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyh0aGlzKTtcbiAgY2FzZSAwOiAvKkJZVEVTIHwgVU5LT1dOKi9cbiAgICBpZiAoanNvb19pc19hc2NpaSh0aGlzLmMpKSB7XG4gICAgICB0aGlzLnQgPSA5OyAvKkJZVEVTIHwgQVNDSUkqL1xuICAgICAgcmV0dXJuIHRoaXMuYztcbiAgICB9XG4gICAgdGhpcy50ID0gODsgLypCWVRFUyB8IE5PVF9BU0NJSSovXG4gIGNhc2UgODogLypCWVRFUyB8IE5PVF9BU0NJSSovXG4gICAgcmV0dXJuIHRoaXMuYztcbiAgfVxufTtcbk1sQnl0ZXMucHJvdG90eXBlLnRvVXRmMTYgPSBmdW5jdGlvbiAoKXtcbiAgdmFyIHIgPSB0aGlzLnRvU3RyaW5nKCk7XG4gIGlmKHRoaXMudCA9PSA5KSByZXR1cm4gclxuICByZXR1cm4gY2FtbF91dGYxNl9vZl91dGY4KHIpO1xufVxuTWxCeXRlcy5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiAoKXtcbiAgdmFyIGNvbnRlbnQgPSB0aGlzLnQgPT0gNCA/IHRoaXMuYy5zbGljZSgpIDogdGhpcy5jO1xuICByZXR1cm4gbmV3IE1sQnl0ZXModGhpcy50LGNvbnRlbnQsdGhpcy5sKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9zdHJfcmVwZWF0LCBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMgKHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQllURVMgKi9cbiAgaWYgKHMudCA9PSAyIC8qIFBBUlRJQUwgKi8pXG4gICAgcy5jICs9IGNhbWxfc3RyX3JlcGVhdChzLmwgLSBzLmMubGVuZ3RoLCAnXFwwJylcbiAgZWxzZVxuICAgIHMuYyA9IGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyAocy5jLCAwLCBzLmMubGVuZ3RoKTtcbiAgcy50ID0gMDsgLypCWVRFUyB8IFVOS09XTiovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5IChzKSB7XG4gIC8qIEFzc3VtZXMgbm90IEFSUkFZICovXG4gIHZhciBhID0gbmV3IFVpbnQ4QXJyYXkocy5sKTtcbiAgdmFyIGIgPSBzLmMsIGwgPSBiLmxlbmd0aCwgaSA9IDA7XG4gIGZvciAoOyBpIDwgbDsgaSsrKSBhW2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICBmb3IgKGwgPSBzLmw7IGkgPCBsOyBpKyspIGFbaV0gPSAwO1xuICBzLmMgPSBhO1xuICBzLnQgPSA0OyAvKiBBUlJBWSAqL1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMgKHMpIHtcbiAgaWYgKHMudCAhPSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gIHJldHVybiBzLmM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG5mdW5jdGlvbiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyAocykge1xuICB2YXIgbCA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKTtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIHZhciBpID0gMDtcbiAgZm9yICg7IGkgPCBsOyBpKyspIGFbaV0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsaSk7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBpZihsZW4gPCAwKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuPzI6OSxcIlwiLGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3JlYXRlX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX3N0cmluZyhsZW4pIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyaW5nLmNyZWF0ZVwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pIHtcbiAgaWYgKGxlbiA8IDApIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJ5dGVzLmNyZWF0ZVwiKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKGxlbj8yOjksXCJcIixsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9zdWJhcnJheV90b19qc2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9hcnJheSAoYSkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMoYSwwLGEubGVuZ3RoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfYXJyYXkgKGEpIHtcbiAgaWYoISAoYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgYSA9IG5ldyBVaW50OEFycmF5KGEpO1xuICB9XG4gIHJldHVybiBuZXcgTWxCeXRlcyg0LGEsYS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2NvbXBhcmUgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19jb21wYXJlKHMxLCBzMikge1xuICAoczEudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICAoczIudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gKHMxLmMgPCBzMi5jKT8tMTooczEuYyA+IHMyLmMpPzE6MDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2VxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZXF1YWwoczEsIHMyKSB7XG4gIGlmKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIChzMS50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIChzMi50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiAoczEuYyA9PSBzMi5jKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX25vdGVxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2VxdWFsXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ub3RlcXVhbChzMSwgczIpIHsgcmV0dXJuIDEtY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX25vdGVxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfZXF1YWxcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbm90ZXF1YWwoczEsIHMyKSB7IHJldHVybiAxLWNhbWxfYnl0ZXNfZXF1YWwoczEsIHMyKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbCBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jIDw9IHMyLmMpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzdGhhbiBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2xlc3N0aGFuKHMxLCBzMikge1xuICAoczEudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICAoczIudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gKHMxLmMgPCBzMi5jKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczIsczEpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ncmVhdGVyZXF1YWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfbGVzc2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dyZWF0ZXJlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMyLHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ3JlYXRlcnRoYW5cbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19ncmVhdGVydGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX2xlc3N0aGFuKHMyLCBzMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcnRoYW5cbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfbGVzc3RoYW5cbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ3JlYXRlcnRoYW4oczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3N0aGFuKHMyLCBzMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmlsbF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9zdHJfcmVwZWF0LCBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbi8vQWxpYXM6IGNhbWxfZmlsbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZmlsbF9ieXRlcyhzLCBpLCBsLCBjKSB7XG4gIGlmIChsID4gMCkge1xuICAgIGlmIChpID09IDAgJiYgKGwgPj0gcy5sIHx8IChzLnQgPT0gMiAvKiBQQVJUSUFMICovICYmIGwgPj0gcy5jLmxlbmd0aCkpKSB7XG4gICAgICBpZiAoYyA9PSAwKSB7XG4gICAgICAgIHMuYyA9IFwiXCI7XG4gICAgICAgIHMudCA9IDI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMuYyA9IGNhbWxfc3RyX3JlcGVhdCAobCwgU3RyaW5nLmZyb21DaGFyQ29kZShjKSk7XG4gICAgICAgIHMudCA9IChsID09IHMubCk/MCAvKiBCWVRFUyB8IFVOS09XTiAqLyA6MjsgLyogUEFSVElBTCAqL1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocy50ICE9IDQgLyogQVJSQVkgKi8pIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheShzKTtcbiAgICAgIGZvciAobCArPSBpOyBpIDwgbDsgaSsrKSBzLmNbaV0gPSBjO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ibGl0X2J5dGVzKHMxLCBpMSwgczIsIGkyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgaWYgKChpMiA9PSAwKSAmJlxuICAgICAgKGxlbiA+PSBzMi5sIHx8IChzMi50ID09IDIgLyogUEFSVElBTCAqLyAmJiBsZW4gPj0gczIuYy5sZW5ndGgpKSkge1xuICAgIHMyLmMgPSAoczEudCA9PSA0IC8qIEFSUkFZICovKT9cbiAgICAgIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhzMS5jLCBpMSwgbGVuKTpcbiAgICAgIChpMSA9PSAwICYmIHMxLmMubGVuZ3RoID09IGxlbik/czEuYzpzMS5jLnN1YnN0cihpMSwgbGVuKTtcbiAgICBzMi50ID0gKHMyLmMubGVuZ3RoID09IHMyLmwpPzAgLyogQllURVMgfCBVTktPV04gKi8gOjI7IC8qIFBBUlRJQUwgKi9cbiAgfSBlbHNlIGlmIChzMi50ID09IDIgLyogUEFSVElBTCAqLyAmJiBpMiA9PSBzMi5jLmxlbmd0aCkge1xuICAgIHMyLmMgKz0gKHMxLnQgPT0gNCAvKiBBUlJBWSAqLyk/XG4gICAgICBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbik6XG4gICAgICAoaTEgPT0gMCAmJiBzMS5jLmxlbmd0aCA9PSBsZW4pP3MxLmM6czEuYy5zdWJzdHIoaTEsIGxlbik7XG4gICAgczIudCA9IChzMi5jLmxlbmd0aCA9PSBzMi5sKT8wIC8qIEJZVEVTIHwgVU5LT1dOICovIDoyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSB7XG4gICAgaWYgKHMyLnQgIT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMyKTtcbiAgICB2YXIgYzEgPSBzMS5jLCBjMiA9IHMyLmM7XG4gICAgaWYgKHMxLnQgPT0gNCAvKiBBUlJBWSAqLykge1xuICAgICAgaWYgKGkyIDw9IGkxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGMyIFtpMiArIGldID0gYzEgW2kxICsgaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIGMyIFtpMiArIGldID0gYzEgW2kxICsgaV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsID0gTWF0aC5taW4gKGxlbiwgYzEubGVuZ3RoIC0gaTEpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIGMyIFtpMiArIGldID0gYzEuY2hhckNvZGVBdChpMSArIGkpO1xuICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykgYzIgW2kyICsgaV0gPSAwO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ibGl0X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ibGl0X3N0cmluZyhhLGIsYyxkLGUpIHtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGEpLGIsYyxkLGUpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19sZW5ndGgocykgeyByZXR1cm4gcy5sIH1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSB7XG4gIHJldHVybiBzLmNoYXJDb2RlQXQoaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfdW5zYWZlX3NldCAocywgaSwgYykge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfdW5zYWZlX3NldFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBzLmxlbmd0aFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb21wYXJlIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbXBhcmUoczEsIHMyKSB7XG4gIHJldHVybiAoczEgPCBzMik/LTE6KHMxID4gczIpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIGlmKHMxID09PSBzMikgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWwgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gKHMxIDw9IHMyKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3N0aGFuKHMxLCBzMikge1xuICByZXR1cm4gKHMxIDwgczIpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocykge1xuICAocy50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocy5jKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4KSB7IHJldHVybiB4IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHgpIHsgcmV0dXJuIHggfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGYxNl9vZl91dGY4XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpIHtcbiAgaWYoanNvb19pc19hc2NpaShzKSlcbiAgICByZXR1cm4gcztcbiAgcmV0dXJuIGNhbWxfdXRmMTZfb2ZfdXRmOChzKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGY4X29mX3V0ZjE2LCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChzKSB7XG4gIGlmIChqc29vX2lzX2FzY2lpKHMpKVxuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpXG4gIGVsc2UgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF91dGY4X29mX3V0ZjE2KHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMocykgeyByZXR1cm4gbmV3IE1sQnl0ZXMoMCxzLHMubGVuZ3RoKTsgfVxuXG5cbi8vIFRoZSBzZWN0aW9uIGJlbG93IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNlLWpzLXN0cmluZz1mYWxzZVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX2dldChzLGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQgKHMsIGksIGMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX3NldChzLGksYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSB7XG4gIHJldHVybiBjYW1sX21sX2J5dGVzX2xlbmd0aChzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19jb21wYXJlXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2NvbXBhcmUoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2NvbXBhcmUoczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2VxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfZXF1YWwoczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzdGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3N0aGFuKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9ieXRlc1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocykgeyByZXR1cm4gcyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3N0cmluZyhzKSB7IHJldHVybiBzIH1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpIHsgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgKHMudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gIHJldHVybiBzLmMgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpe1xuICByZXR1cm4gcy50b1V0ZjE2KClcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmdcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nKHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2lzX21sX2J5dGVzKHMpIHtcbiAgcmV0dXJuIChzIGluc3RhbmNlb2YgTWxCeXRlcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfYnl0ZXNfY29udGVudFxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9ieXRlc19jb250ZW50KHMpIHtcbiAgc3dpdGNoIChzLnQgJiA2KSB7XG4gIGRlZmF1bHQ6IC8qIFBBUlRJQUwgKi9cbiAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICBjYXNlIDA6IC8qIEJZVEVTICovXG4gICAgcmV0dXJuIHMuYztcbiAgY2FzZSA0OlxuICAgIHJldHVybiBzLmNcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX21sX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19pc19hc2NpaVxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiAodHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgIS9bXlxceDAwLVxceGZmXS8udGVzdChzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2lzX21sX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2lzX21sX2J5dGVzKHMpO1xufVxuXG4vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBkZXByZWNhdGVkXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcocykgeyByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmV3X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9uZXdfc3RyaW5nIChzKSB7IHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdG9fanNfc3RyaW5nIG11dGFibGUgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdG9fanNfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc190b19zdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHMpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9hcnJheV9vZl9zdHJpbmcoeCkgeyByZXR1cm4gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoeCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2FycmF5X29mX2J5dGVzKHgpIHsgcmV0dXJuIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoeCkgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9SYWlzZSBleGNlcHRpb25cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9jb25zdGFudCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2NvbnN0YW50ICh0YWcpIHsgdGhyb3cgdGFnOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJnICh0YWcsIGFyZykgeyB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoWzAsIHRhZywgYXJnXSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZ3MgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfYXJncyAodGFnLCBhcmdzKSB7IHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCwgdGFnXS5jb25jYXQoYXJncykpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcgKHRhZywgbXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9hcmcgKHRhZywgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhtc2cpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYWlsd2l0aCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ZhaWx3aXRoIChtc2cpIHtcbiAgaWYoIWNhbWxfZ2xvYmFsX2RhdGEuRmFpbHVyZSlcbiAgICBjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmU9WzI0OCxjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiRmFpbHVyZVwiKSwtM107XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLCBtc2cpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2ludmFsaWRfYXJndW1lbnQgKG1zZykge1xuICBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nKGNhbWxfZ2xvYmFsX2RhdGEuSW52YWxpZF9hcmd1bWVudCwgbXNnKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9jb25zdGFudCwgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSAoKSB7XG4gIGNhbWxfcmFpc2VfY29uc3RhbnQoY2FtbF9nbG9iYWxfZGF0YS5FbmRfb2ZfZmlsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfemVyb19kaXZpZGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfY29uc3RhbnQsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRGl2aXNpb25fYnlfemVybyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9mb3VuZCAoKSB7XG4gIGNhbWxfcmFpc2VfY29uc3RhbnQoY2FtbF9nbG9iYWxfZGF0YS5Ob3RfZm91bmQpOyB9XG5cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuIChjb25zdCwgc2hhbGxvdylcbi8vSWY6ICFlZmZlY3RzXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfY2FsbF9nZW4oZiwgYXJncykge1xuICB2YXIgbiA9IChmLmwgPj0gMCk/Zi5sOihmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09IDApXG4gICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gIGVsc2UgaWYgKGQgPCAwKSB7XG4gICAgdmFyIGcgPSBmLmFwcGx5KG51bGwsYXJncy5zbGljZSgwLG4pKTtcbiAgICBpZih0eXBlb2YgZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZztcbiAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihnLGFyZ3Muc2xpY2UobikpO1xuICB9XG4gIGVsc2Uge1xuICAgIHN3aXRjaCAoZCkge1xuICAgIGNhc2UgMToge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCl7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMSk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgbmFyZ3MpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMjoge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSl7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMik7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgbmFyZ3MpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKCl7XG4gICAgICAgIHZhciBleHRyYV9hcmdzID0gKGFyZ3VtZW50cy5sZW5ndGggPT0gMCk/MTphcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJncy5sZW5ndGgrZXh0cmFfYXJncyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkgbmFyZ3NbYXJncy5sZW5ndGgraV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYsIG5hcmdzKVxuICAgICAgfTtcbiAgICB9fVxuICAgIGcubCA9IGQ7XG4gICAgcmV0dXJuIGc7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsX2dlbiAoY29uc3QsIHNoYWxsb3cpXG4vL0lmOiBlZmZlY3RzXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfY2FsbF9nZW4oZiwgYXJncykge1xuICB2YXIgbiA9IChmLmwgPj0gMCk/Zi5sOihmLmwgPSBmLmxlbmd0aCk7XG4gIHZhciBhcmdzTGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBkID0gbiAtIGFyZ3NMZW47XG4gIGlmIChkID09IDApIHtcbiAgICByZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKTtcbiAgfSBlbHNlIGlmIChkIDwgMCkge1xuICAgIHZhciByZXN0ID0gYXJncy5zbGljZShuIC0gMSk7XG4gICAgdmFyIGsgPSBhcmdzIFthcmdzTGVuIC0gMV07XG4gICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgbik7XG4gICAgYXJnc1tuIC0gMV0gPSBmdW5jdGlvbiAoZykge1xuICAgICAgaWYgKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBrKGcpO1xuICAgICAgdmFyIGFyZ3MgPSByZXN0LnNsaWNlKCk7XG4gICAgICBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0gPSBrO1xuICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZywgYXJncyk7IH07XG4gICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgYXJnc0xlbi0tO1xuICAgIHZhciBrID0gYXJncyBbYXJnc0xlbl07XG4gICAgc3dpdGNoIChkKSB7XG4gICAgY2FzZSAxOiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5KXtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAyKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICByZXR1cm4gZi5hcHBseShudWxsLCBuYXJncylcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAyOiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5LCB6KXtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAzKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICBuYXJnc1thcmdzTGVuICsgMl0gPSB6O1xuICAgICAgICByZXR1cm4gZi5hcHBseShudWxsLCBuYXJncylcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoKXtcbiAgICAgICAgdmFyIGV4dHJhX2FyZ3MgPSAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKT8xOmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgZXh0cmFfYXJncyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKVxuICAgICAgICAgIG5hcmdzW2FyZ3NMZW4gKyBpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgbmFyZ3MpXG4gICAgICB9O1xuICAgIH19XG4gICAgZy5sID0gZCArIDE7XG4gICAgcmV0dXJuIGsoZyk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9uYW1lZF92YWx1ZXNcbnZhciBjYW1sX25hbWVkX3ZhbHVlcyA9IHt9O1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlIChjb25zdCxtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUobm0sdikge1xuICBjYW1sX25hbWVkX3ZhbHVlc1tjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5tKV0gPSB2O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uYW1lZF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZXNcbmZ1bmN0aW9uIGNhbWxfbmFtZWRfdmFsdWUobm0pIHtcbiAgcmV0dXJuIGNhbWxfbmFtZWRfdmFsdWVzW25tXVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dsb2JhbF9kYXRhXG52YXIgY2FtbF9nbG9iYWxfZGF0YSA9IFswXTtcblxuLy9Qcm92aWRlczogY2FtbF9idWlsZF9zeW1ib2xzXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9idWlsZF9zeW1ib2xzKHRvYykge1xuICB2YXIgc3ltYjtcbiAgd2hpbGUodG9jKSB7XG4gICAgaWYoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcodG9jWzFdWzFdKSA9PSBcIlNZSlNcIikge1xuICAgICAgc3ltYiA9IHRvY1sxXVsyXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBlbHNlIHRvYyA9IHRvY1syXVxuICB9XG4gIHZhciByID0ge307XG4gIGlmKHN5bWIpIHtcbiAgICBmb3IodmFyIGkgPSAxOyBpIDwgc3ltYi5sZW5ndGg7IGkrKyl7XG4gICAgICByW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN5bWJbaV1bMV0pXSA9IHN5bWJbaV1bMl1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVnaXN0ZXJfZ2xvYmFsIChjb25zdCwgc2hhbGxvdywgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhLCBjYW1sX2NhbGxiYWNrLCBjYW1sX2J1aWxkX3N5bWJvbHNcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfcmVnaXN0ZXJfZ2xvYmFsIChuLCB2LCBuYW1lX29wdCkge1xuICBpZiAobmFtZV9vcHQpIHtcbiAgICB2YXIgbmFtZSA9IG5hbWVfb3B0O1xuICAgIGlmKGdsb2JhbFRoaXMudG9wbGV2ZWxSZWxvYykge1xuICAgICAgbiA9IGNhbWxfY2FsbGJhY2soZ2xvYmFsVGhpcy50b3BsZXZlbFJlbG9jLCBbbmFtZV0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChjYW1sX2dsb2JhbF9kYXRhLnRvYykge1xuICAgICAgaWYoIWNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9scykge1xuICAgICAgICBjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHMgPSBjYW1sX2J1aWxkX3N5bWJvbHMoY2FtbF9nbG9iYWxfZGF0YS50b2MpXG4gICAgICB9XG4gICAgICB2YXIgbmlkID0gY2FtbF9nbG9iYWxfZGF0YS5zeW1ib2xzW25hbWVdXG4gICAgICBpZihuaWQgPj0gMClcbiAgICAgICAgbiA9IG5pZFxuICAgICAgZWxzZSB7XG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3JlZ2lzdGVyX2dsb2JhbDogY2Fubm90IGxvY2F0ZSBcIiArIG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjYW1sX2dsb2JhbF9kYXRhW24gKyAxXSA9IHY7XG4gIGlmKG5hbWVfb3B0KSBjYW1sX2dsb2JhbF9kYXRhW25hbWVfb3B0XSA9IHY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2dsb2JhbF9kYXRhIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfZ2V0X2dsb2JhbF9kYXRhICgpIHsgcmV0dXJuIGNhbWxfZ2xvYmFsX2RhdGE7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pc19wcmludGFibGUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9pc19wcmludGFibGUoYykgeyByZXR1cm4gKyhjID4gMzEgJiYgYyA8IDEyNyk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9tYXliZV9wcmludF9zdGF0c1xuZnVuY3Rpb24gY2FtbF9tYXliZV9wcmludF9zdGF0cyh1bml0KSB7IHJldHVybiAwIH1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gU3lzXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLlN5c19lcnJvciwgbXNnKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZXhpdFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3N5c19leGl0IChjb2RlKSB7XG4gIGlmKGdsb2JhbFRoaXMucXVpdCkgZ2xvYmFsVGhpcy5xdWl0KGNvZGUpO1xuICAvL25vZGVqc1xuICBpZihnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQpXG4gICAgZ2xvYmFsVGhpcy5wcm9jZXNzLmV4aXQoY29kZSk7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkZ1bmN0aW9uICdleGl0JyBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuKXtcbiAgc3dpdGNoKGV4blsyXSkge1xuICBjYXNlIC04OiAvLyBNYXRjaF9mYWlsdXJlXG4gIGNhc2UgLTExOiAvLyBBc3NlcnRfZmFpbHVyZVxuICBjYXNlIC0xMjogLy8gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGVcbiAgICByZXR1cm4gMTtcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zvcm1hdF9leGNlcHRpb25cbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfZm9ybWF0X2V4Y2VwdGlvbihleG4pe1xuICB2YXIgciA9IFwiXCI7XG4gIGlmKGV4blswXSA9PSAwKSB7XG4gICAgciArPSBleG5bMV1bMV07XG4gICAgaWYoZXhuLmxlbmd0aCA9PSAzICYmIGV4blsyXVswXSA9PSAwICYmIGNhbWxfaXNfc3BlY2lhbF9leGNlcHRpb24oZXhuWzFdKSkge1xuXG4gICAgICB2YXIgYnVja2V0ID0gZXhuWzJdO1xuICAgICAgdmFyIHN0YXJ0ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0YXJ0ID0gMlxuICAgICAgdmFyIGJ1Y2tldCA9IGV4bjtcbiAgICB9XG4gICAgciArPSBcIihcIjtcbiAgICBmb3IodmFyIGkgPSBzdGFydDsgaSA8IGJ1Y2tldC5sZW5ndGg7IGkgKyspe1xuICAgICAgaWYoaSA+IHN0YXJ0KSByKz1cIiwgXCI7XG4gICAgICB2YXIgdiA9IGJ1Y2tldFtpXVxuICAgICAgaWYodHlwZW9mIHYgPT0gXCJudW1iZXJcIilcbiAgICAgICAgcis9IHYudG9TdHJpbmcoKTtcbiAgICAgIGVsc2UgaWYodiBpbnN0YW5jZW9mIE1sQnl0ZXMpe1xuICAgICAgICByKz0gJ1wiJyArIHYudG9TdHJpbmcoKSArICdcIic7XG4gICAgICB9XG4gICAgICBlbHNlIGlmKHR5cGVvZiB2ID09IFwic3RyaW5nXCIpe1xuICAgICAgICByKz0gJ1wiJyArIHYudG9TdHJpbmcoKSArICdcIic7XG4gICAgICB9XG4gICAgICBlbHNlIHIgKz0gXCJfXCI7XG4gICAgfVxuICAgIHIgKz0gXCIpXCJcbiAgfSBlbHNlIGlmIChleG5bMF0gPT0gMjQ4KXtcbiAgICByICs9IGV4blsxXVxuICB9XG4gIHJldHVybiByXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX2Zvcm1hdF9leGNlcHRpb24sIGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uKGVycil7XG4gIGlmKGVyciBpbnN0YW5jZW9mIEFycmF5ICYmIChlcnJbMF0gPT0gMCB8fCBlcnJbMF0gPT0gMjQ4KSkge1xuICAgIHZhciBoYW5kbGVyID0gY2FtbF9uYW1lZF92YWx1ZShcIlByaW50ZXhjLmhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cIik7XG4gICAgaWYoaGFuZGxlcikgY2FtbF9jYWxsYmFjayhoYW5kbGVyLCBbZXJyLGZhbHNlXSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgbXNnID0gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGVycik7XG4gICAgICB2YXIgYXRfZXhpdCA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIik7XG4gICAgICBpZihhdF9leGl0KSBjYW1sX2NhbGxiYWNrKGF0X2V4aXQsIFswXSk7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRmF0YWwgZXJyb3I6IGV4Y2VwdGlvbiBcIiArIG1zZyArIFwiXFxuXCIpO1xuICAgICAgaWYoZXJyLmpzX2Vycm9yKSB0aHJvdyBlcnIuanNfZXJyb3I7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IGVyclxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3N0YXRpY19lbnZcbmZ1bmN0aW9uIGNhbWxfc2V0X3N0YXRpY19lbnYoayx2KXtcbiAgaWYoIWdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52KVxuICAgIGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52ID0ge31cbiAgZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnZba10gPSB2O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczoganNvb19zeXNfZ2V0ZW52IChjb25zdClcbmZ1bmN0aW9uIGpzb29fc3lzX2dldGVudihuKSB7XG4gIHZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xuICAvL25vZGVqcyBlbnZcbiAgaWYocHJvY2Vzc1xuICAgICAmJiBwcm9jZXNzLmVudlxuICAgICAmJiBwcm9jZXNzLmVudltuXSAhPSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52W25dO1xuICBpZihnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudlxuICAgICAmJiBnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudltuXSlcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnZbbl1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0ZW52IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGpzb29fc3lzX2dldGVudlxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0ZW52IChuYW1lKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgaWYociA9PT0gdW5kZWZpbmVkKVxuICAgIGNhbWxfcmFpc2Vfbm90X2ZvdW5kICgpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdW5zYWZlX2dldGVudlxuLy9SZXF1aXJlczogY2FtbF9zeXNfZ2V0ZW52XG5mdW5jdGlvbiBjYW1sX3N5c191bnNhZmVfZ2V0ZW52KG5hbWUpe1xuICByZXR1cm4gY2FtbF9zeXNfZ2V0ZW52IChuYW1lKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xudmFyIGNhbWxfYXJndiA9ICgoZnVuY3Rpb24gKCkge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgdmFyIG1haW4gPSBcImEub3V0XCI7XG4gIHZhciBhcmdzID0gW11cblxuICBpZihwcm9jZXNzXG4gICAgICYmIHByb2Nlc3MuYXJndlxuICAgICAmJiBwcm9jZXNzLmFyZ3YubGVuZ3RoID4gMSkge1xuICAgIHZhciBhcmd2ID0gcHJvY2Vzcy5hcmd2XG4gICAgLy9ub2RlanNcbiAgICBtYWluID0gYXJndlsxXTtcbiAgICBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgfVxuXG4gIHZhciBwID0gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobWFpbik7XG4gIHZhciBhcmdzMiA9IFswLCBwXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspXG4gICAgYXJnczIucHVzaChjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhhcmdzW2ldKSk7XG4gIHJldHVybiBhcmdzMjtcbn0pKCkpXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXhlY3V0YWJsZV9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbnZhciBjYW1sX2V4ZWN1dGFibGVfbmFtZSA9IGNhbWxfYXJndlsxXVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRfYXJndlxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG5mdW5jdGlvbiBjYW1sX3N5c19nZXRfYXJndiAoYSkge1xuICByZXR1cm4gWzAsIGNhbWxfYXJndlsxXSwgY2FtbF9hcmd2XTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfYXJndlxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG5mdW5jdGlvbiBjYW1sX3N5c19hcmd2IChhKSB7XG4gIHJldHVybiBjYW1sX2FyZ3Y7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX21vZGlmeV9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX21vZGlmeV9hcmd2KGFyZyl7XG4gIGNhbWxfYXJndiA9IGFyZztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9leGVjdXRhYmxlX25hbWVcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZShhKXtcbiAgcmV0dXJuIGNhbWxfZXhlY3V0YWJsZV9uYW1lXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQoY21kKXtcbiAgdmFyIGNtZCA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGNtZCk7XG4gIGlmICh0eXBlb2YgcmVxdWlyZSAhPSBcInVuZGVmaW5lZFwiKXtcbiAgICB2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbiAgICBpZihjaGlsZF9wcm9jZXNzICYmIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMpXG4gICAgICB0cnkge1xuICAgICAgICBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKGNtZCx7c3RkaW86ICdpbmhlcml0J30pO1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfVxuICB9XG4gIGVsc2UgcmV0dXJuIDEyNztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZChjbWQpe1xuICByZXR1cm4gMTI3O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c190aW1lIG11dGFibGVcbnZhciBjYW1sX2luaXRpYWxfdGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgKiAwLjAwMTtcbmZ1bmN0aW9uIGNhbWxfc3lzX3RpbWUgKCkge1xuICB2YXIgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgcmV0dXJuIG5vdyAqIDAuMDAxIC0gY2FtbF9pbml0aWFsX3RpbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RpbWVfaW5jbHVkZV9jaGlsZHJlblxuLy9SZXF1aXJlczogY2FtbF9zeXNfdGltZVxuZnVuY3Rpb24gY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuKGIpIHtcbiAgcmV0dXJuIGNhbWxfc3lzX3RpbWUoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmFuZG9tX3NlZWQgbXV0YWJsZVxuLy9UaGUgZnVuY3Rpb24gbmVlZHMgdG8gcmV0dXJuIGFuIGFycmF5IHNpbmNlIE9DYW1sIDQuMC4uLlxuZnVuY3Rpb24gY2FtbF9zeXNfcmFuZG9tX3NlZWQgKCkge1xuICBpZihnbG9iYWxUaGlzLmNyeXB0bykge1xuICAgIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT09ICdmdW5jdGlvbicpe1xuICAgICAgLy8gV2ViYnJvd3NlcnNcbiAgICAgIHZhciBhID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuICAgICAgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGEpO1xuICAgICAgcmV0dXJuIFswLGFbMF1dO1xuICAgIH0gZWxzZSBpZihnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcyA9PT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAvLyBOb2RlanNcbiAgICAgIHZhciBidWZmID0gZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tQnl0ZXMoNCk7XG4gICAgICB2YXIgYSA9IG5ldyBVaW50MzJBcnJheShidWZmKTtcbiAgICAgIHJldHVybiBbMCxhWzBdXTtcbiAgICB9XG4gIH1cbiAgdmFyIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gIHZhciB4ID0gbm93XjB4ZmZmZmZmZmYqTWF0aC5yYW5kb20oKTtcbiAgcmV0dXJuIFswLHhdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iaWdfZW5kaWFuICgpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUgKCkgeyByZXR1cm4gMzI7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfaW50X3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2ludF9zaXplICgpIHsgcmV0dXJuIDMyOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgY29uc3Rcbi8vIG1heF9pbnQgLyA0IHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkb2VzIG5vdCBvdmVyZmxvd1xuLy9sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDE7O1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSAoKSB7IHJldHVybiAoMHg3RkZGRkZGRi80KSB8IDA7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXggKCkgeyByZXR1cm4gb3NfdHlwZSA9PSBcIlVuaXhcIiA/IDEgOiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIgY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV93aW4zMiAoKSB7IHJldHVybiBvc190eXBlID09IFwiV2luMzJcIiA/IDEgOiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9vc3R5cGVfY3lnd2luIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfY3lnd2luICgpIHsgcmV0dXJuIG9zX3R5cGUgPT0gXCJDeWd3aW5cIiA/IDEgOiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlICgpIHtcbiAgcmV0dXJuIFswLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwianNfb2Zfb2NhbWxcIildO1xufVxuXG4vL1Byb3ZpZGVzOiBvc190eXBlXG52YXIgb3NfdHlwZSA9IChnbG9iYWxUaGlzLnByb2Nlc3MgJiZcbiAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSAmJlxuICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLnBsYXRmb3JtID09IFwid2luMzJcIikgPyBcIkN5Z3dpblwiIDogXCJVbml4XCI7XG5cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0X2NvbmZpZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0X2NvbmZpZyAoKSB7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhvc190eXBlKSwgMzIsIDBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfc3lzX2lzYXR0eShfY2hhbikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3ZhcmlhbnRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV92YXJpYW50KF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3BhcmFtZXRlcnNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW5zdGFsbF9zaWduYWxfaGFuZGxlcigpe3JldHVybiAwfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbnZhciBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzXG4vL1JlcXVpcmVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbmZ1bmN0aW9uIGNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MgKGJvb2wpIHtcbiAgY2FtbF9ydW50aW1lX3dhcm5pbmdzID0gYm9vbDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcnVudGltZV93YXJuaW5nc19lbmFibGVkXG4vL1JlcXVpcmVzOiBjYW1sX3J1bnRpbWVfd2FybmluZ3NcbmZ1bmN0aW9uIGNhbWxfbWxfcnVudGltZV93YXJuaW5nc19lbmFibGVkIChfdW5pdCkge1xuICByZXR1cm4gY2FtbF9ydW50aW1lX3dhcm5pbmdzO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3BhY2V0aW1lX2VuYWJsZWQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9zcGFjZXRpbWVfZW5hYmxlZChfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlZ2lzdGVyX2NoYW5uZWxfZm9yX3NwYWNldGltZSBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX2NoYW5uZWxfZm9yX3NwYWNldGltZShfY2hhbm5lbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zcGFjZXRpbWVfb25seV93b3Jrc19mb3JfbmF0aXZlX2NvZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfc3BhY2V0aW1lX29ubHlfd29ya3NfZm9yX25hdGl2ZV9jb2RlKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiU3BhY2V0aW1lIHByb2ZpbGluZyBvbmx5IHdvcmtzIGZvciBuYXRpdmUgY29kZVwiKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGVcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19pc19yZWd1bGFyX2ZpbGUobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByZXR1cm4gcm9vdC5kZXZpY2UuaXNGaWxlKHJvb3QucmVzdCk7XG59XG4vL0Fsd2F5c1xuLy9SZXF1aXJlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKSB7XG4gIHZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xuICBpZihwcm9jZXNzICYmIHByb2Nlc3Mub24pIHtcbiAgICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIGZ1bmN0aW9uIChlcnIsIG9yaWdpbikge1xuICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHByb2Nlc3MuZXhpdCAoMik7XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmKGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcil7XG4gICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIGlmKGV2ZW50LmVycm9yKXtcbiAgICAgICAgY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXZlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5jYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyKCk7XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnXG4vL1JlcXVpcmVzOiBqc29vX3N5c19nZXRlbnZcbnZhciBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyA9IEZMQUcoXCJ3aXRoLWpzLWVycm9yXCIpO1xuXG4oZnVuY3Rpb24gKCkge1xuICB2YXIgciA9IGpzb29fc3lzX2dldGVudihcIk9DQU1MUlVOUEFSQU1cIilcbiAgaWYociAhPT0gdW5kZWZpbmVkKXtcbiAgICB2YXIgbCA9IHIuc3BsaXQoXCIsXCIpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKGxbaV0gPT0gXCJiXCIpIHsgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcgPSAxOyBicmVhayB9XG4gICAgICBlbHNlIGlmIChsW2ldLnN0YXJ0c1dpdGgoXCJiPVwiKSkge1xuICAgICAgICBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyA9ICsobFtpXS5zbGljZSgyKSl9XG4gICAgICBlbHNlIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufSkgKClcblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RlYnVnX2luZm9fc3RhdHVzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX21sX2RlYnVnX2luZm9fc3RhdHVzICgpIHsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfYmFja3RyYWNlX3N0YXR1c1xuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfYmFja3RyYWNlX3N0YXR1cyAoX3VuaXQpIHsgcmV0dXJuIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnID8gMSA6IDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2V4Y2VwdGlvbl9iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2V4Y2VwdGlvbl9iYWNrdHJhY2UgKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYWNlICgpIHsgcmV0dXJuIFswXTsgfVxuLy9Qcm92aWRlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlXG4vL1JlcXVpcmVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZ1xuZnVuY3Rpb24gY2FtbF9yZWNvcmRfYmFja3RyYWNlIChiKSB7IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnID0gYjsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZSAoKSB7IHJldHVybiBbMF07IH1cbi8vUHJvdmlkZXM6IGNhbWxfcmF3X2JhY2t0cmFjZV9sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfcmF3X2JhY2t0cmFjZV9sZW5ndGgoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90KCkgeyByZXR1cm4gMCB9XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdCAoKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlX3Nsb3Q6IGluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2UoZXhuLCBidCkgeyByZXR1cm4gMCB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFjayBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgKCkgeyByZXR1cm4gWzBdOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3QoKXtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3RcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWJcblxuLy9Qcm92aWRlczogY2FtbF9qc19wdXJlX2V4cHIgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfcHVyZV9leHByIChmKSB7IHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIFswXSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9qc19zZXQobyxmLHYpIHsgb1tmXT12O3JldHVybiAwfVxuLy9Qcm92aWRlczogY2FtbF9qc19nZXQgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19nZXQobyxmKSB7IHJldHVybiBvW2ZdOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2RlbGV0ZSAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2RlbGV0ZShvLGYpIHsgZGVsZXRlIG9bZl07IHJldHVybiAwfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2luc3RhbmNlb2YgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfaW5zdGFuY2VvZihvLGMpIHsgcmV0dXJuIChvIGluc3RhbmNlb2YgYykgPyAxIDogMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3R5cGVvZiAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX3R5cGVvZihvKSB7IHJldHVybiB0eXBlb2YgbzsgfVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZVxuZnVuY3Rpb24gY2FtbF90cmFtcG9saW5lKHJlcykge1xuICB2YXIgYyA9IDE7XG4gIHdoaWxlKHJlcyAmJiByZXMuam9vX3RyYW1wKXtcbiAgICByZXMgPSByZXMuam9vX3RyYW1wLmFwcGx5KG51bGwsIHJlcy5qb29fYXJncyk7XG4gICAgYysrO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6Y2FtbF90cmFtcG9saW5lX3JldHVyblxuZnVuY3Rpb24gY2FtbF90cmFtcG9saW5lX3JldHVybihmLGFyZ3MpIHtcbiAgcmV0dXJuIHtqb29fdHJhbXA6Zixqb29fYXJnczphcmdzfTtcbn1cblxuLy9Qcm92aWRlczpjYW1sX3N0YWNrX2RlcHRoXG4vL0lmOiBlZmZlY3RzXG52YXIgY2FtbF9zdGFja19kZXB0aCA9IDA7XG5cbi8vUHJvdmlkZXM6Y2FtbF9zdGFja19jaGVja19kZXB0aFxuLy9JZjogZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoXG5mdW5jdGlvbiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCkge1xuICAgIHJldHVybiAtLWNhbWxfc3RhY2tfZGVwdGggPiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiAhZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX2NhbGxfZ2VuXG52YXIgY2FtbF9jYWxsYmFjayA9IGNhbWxfY2FsbF9nZW47XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbGJhY2tcbi8vSWY6IGVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9zdGFja19kZXB0aCwgY2FtbF9jYWxsX2dlbiwgY2FtbF9leG5fc3RhY2ssIGNhbWxfZmliZXJfc3RhY2ssIGNhbWxfd3JhcF9leGNlcHRpb24sIGNhbWxfcmVzdW1lX3N0YWNrLCBjYW1sX2ZyZXNoX29vX2lkLCBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3JhaXNlX3dpdGhfYXJnLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50XG5mdW5jdGlvbiBjYW1sX2NhbGxiYWNrKGYsYXJncykge1xuICBmdW5jdGlvbiB1bmNhdWdodF9lZmZlY3RfaGFuZGxlcihlZmYsayxtcykge1xuICAgIC8vIFJlc3VtZXMgdGhlIGNvbnRpbnVhdGlvbiBrIGJ5IHJhaXNpbmcgZXhjZXB0aW9uIFVuaGFuZGxlZC5cbiAgICBjYW1sX3Jlc3VtZV9zdGFjayhrWzFdLG1zKTtcbiAgICB2YXIgZXhuID0gY2FtbF9uYW1lZF92YWx1ZShcIkVmZmVjdC5VbmhhbmRsZWRcIik7XG4gICAgaWYoZXhuKSBjYW1sX3JhaXNlX3dpdGhfYXJnKGV4biwgZWZmKTtcbiAgICBlbHNlIHtcbiAgICAgIGV4biA9IFsyNDgsY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkVmZmVjdC5VbmhhbmRsZWRcIiksIGNhbWxfZnJlc2hfb29faWQoMCldO1xuICAgICAgY2FtbF9yYWlzZV9jb25zdGFudChleG4pO1xuICAgIH1cbiAgfVxuICB2YXIgc2F2ZWRfc3RhY2tfZGVwdGggPSBjYW1sX3N0YWNrX2RlcHRoO1xuICB2YXIgc2F2ZWRfZXhuX3N0YWNrID0gY2FtbF9leG5fc3RhY2s7XG4gIHZhciBzYXZlZF9maWJlcl9zdGFjayA9IGNhbWxfZmliZXJfc3RhY2s7XG4gIHRyeSB7XG4gICAgY2FtbF9leG5fc3RhY2sgPSAwO1xuICAgIGNhbWxfZmliZXJfc3RhY2sgPVxuICAgICAge2g6WzAsIDAsIDAsIHVuY2F1Z2h0X2VmZmVjdF9oYW5kbGVyXSwgcjp7azowLCB4OjAsIGU6MH19O1xuICAgIHZhciByZXMgPSB7am9vX3RyYW1wOiBmLFxuICAgICAgICAgICAgICAgam9vX2FyZ3M6IGFyZ3MuY29uY2F0KGZ1bmN0aW9uICh4KXtyZXR1cm4geDt9KX07XG4gICAgZG8ge1xuICAgICAgY2FtbF9zdGFja19kZXB0aCA9IDQwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzID0gY2FtbF9jYWxsX2dlbihyZXMuam9vX3RyYW1wLCByZXMuam9vX2FyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvKiBIYW5kbGUgZXhjZXB0aW9uIGNvbWluZyBmcm9tIEphdmFTY3JpcHQgb3IgZnJvbSB0aGUgcnVudGltZS4gKi9cbiAgICAgICAgaWYgKCFjYW1sX2V4bl9zdGFjaykgdGhyb3cgZTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSBjYW1sX2V4bl9zdGFja1sxXTtcbiAgICAgICAgY2FtbF9leG5fc3RhY2sgPSBjYW1sX2V4bl9zdGFja1syXTtcbiAgICAgICAgcmVzID0ge2pvb190cmFtcDogaGFuZGxlcixcbiAgICAgICAgICAgICAgIGpvb19hcmdzOiBbY2FtbF93cmFwX2V4Y2VwdGlvbihlKV19O1xuICAgICAgfVxuICAgIH0gd2hpbGUocmVzICYmIHJlcy5qb29fYXJncylcbiAgfSBmaW5hbGx5IHtcbiAgICBjYW1sX3N0YWNrX2RlcHRoID0gc2F2ZWRfc3RhY2tfZGVwdGg7XG4gICAgY2FtbF9leG5fc3RhY2sgPSBzYXZlZF9leG5fc3RhY2s7XG4gICAgY2FtbF9maWJlcl9zdGFjayA9IHNhdmVkX2ZpYmVyX3N0YWNrO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfanNcbmZ1bmN0aW9uIGNhbWxfaXNfanMoKSB7XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc29vX2ZsYWdzX3VzZV9qc19zdHJpbmcodW5pdCl7XG4gIHJldHVybiBGTEFHKFwidXNlLWpzLXN0cmluZ1wiKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzb29fZmxhZ3NfZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHModW5pdCl7XG4gIHJldHVybiBGTEFHKFwiZWZmZWN0c1wiKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dyYXBfZXhjZXB0aW9uIGNvbnN0IChtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyxjYW1sX25hbWVkX3ZhbHVlXG5mdW5jdGlvbiBjYW1sX3dyYXBfZXhjZXB0aW9uKGUpIHtcbiAgaWYgKEZMQUcoXCJleGN3cmFwXCIpKSB7XG4gICAgaWYoZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gZTtcbiAgICB2YXIgZXhuO1xuICAgIC8vU3RhY2tfb3ZlcmZsb3c6IGNocm9tZSwgc2FmYXJpXG4gICAgaWYoZ2xvYmFsVGhpcy5SYW5nZUVycm9yXG4gICAgICAgJiYgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuUmFuZ2VFcnJvclxuICAgICAgICYmIGUubWVzc2FnZVxuICAgICAgICYmIGUubWVzc2FnZS5tYXRjaCgvbWF4aW11bSBjYWxsIHN0YWNrL2kpKVxuICAgICAgZXhuID0gY2FtbF9nbG9iYWxfZGF0YS5TdGFja19vdmVyZmxvdztcbiAgICAvL1N0YWNrX292ZXJmbG93OiBmaXJlZm94XG4gICAgZWxzZSBpZihnbG9iYWxUaGlzLkludGVybmFsRXJyb3JcbiAgICAgICAmJiBlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5JbnRlcm5hbEVycm9yXG4gICAgICAgJiYgZS5tZXNzYWdlXG4gICAgICAgJiYgZS5tZXNzYWdlLm1hdGNoKC90b28gbXVjaCByZWN1cnNpb24vaSkpXG4gICAgICBleG4gPSBjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93O1xuICAgIC8vV3JhcCBFcnJvciBpbiBKcy5FcnJvciBleGNlcHRpb25cbiAgICBlbHNlIGlmKGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkVycm9yICYmIGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpKVxuICAgICAgZXhuID0gWzAsY2FtbF9uYW1lZF92YWx1ZShcImpzRXJyb3JcIiksZV07XG4gICAgZWxzZVxuICAgICAgLy9mYWxsYmFjazogd3JhcHBlZCBpbiBGYWlsdXJlXG4gICAgICBleG4gPSBbMCxjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUsY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKFN0cmluZyhlKSldO1xuICAgIC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBlcnJvciBhdCBoYW5kLCBsZXQncyB1c2UgaXQuXG4gICAgaWYgKGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkVycm9yKVxuICAgICAgZXhuLmpzX2Vycm9yID0gZTtcbiAgICByZXR1cm4gZXhuO1xuICB9IGVsc2VcbiAgICByZXR1cm4gZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG4vL1JlcXVpcmVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShleG4sIGZvcmNlKSB7XG4gIGlmKGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnKVxuICAgIHJldHVybiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZShleG4sIGZvcmNlKTtcbiAgZWxzZSByZXR1cm4gZXhuXG59XG5cbi8vIEV4cGVyaW1lbnRhbFxuLy9Qcm92aWRlczogY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlKGV4biwgZm9yY2UpIHtcbiAgLy9uZXZlciByZXJhaXNlIGZvciBjb25zdGFudCBleG5cbiAgaWYoIWV4bi5qc19lcnJvciB8fCBmb3JjZSB8fCBleG5bMF0gPT0gMjQ4KSBleG4uanNfZXJyb3IgPSBuZXcgZ2xvYmFsVGhpcy5FcnJvcihcIkpzIGV4Y2VwdGlvbiBjb250YWluaW5nIGJhY2t0cmFjZVwiKTtcbiAgcmV0dXJuIGV4bjtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfanNfZXJyb3Jfb3B0aW9uX29mX2V4Y2VwdGlvbihleG4pIHtcbiAgaWYoZXhuLmpzX2Vycm9yKSB7IHJldHVybiBbMCwgZXhuLmpzX2Vycm9yXTsgfVxuICByZXR1cm4gMDtcbn1cblxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9ib29sIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZnJvbV9ib29sKHgpIHsgcmV0dXJuICEheDsgfVxuLy9Qcm92aWRlczogY2FtbF9qc190b19ib29sIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdG9fYm9vbCh4KSB7IHJldHVybiAreDsgfVxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Zsb2F0IGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZnJvbV9mbG9hdCh4KSB7IHJldHVybiB4OyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Zsb2F0IGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdG9fZmxvYXQoeCkgeyByZXR1cm4geDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fYXJyYXkgbXV0YWJsZSAoc2hhbGxvdylcbmZ1bmN0aW9uIGNhbWxfanNfZnJvbV9hcnJheShhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc190b19hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc190b19hcnJheShhKSB7XG4gIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKzEpO1xuICBiWzBdID0gMDtcbiAgZm9yKHZhciBpPTA7aTxsZW47aSsrKSBiW2krMV0gPSBhW2ldO1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9saXN0X29mX2pzX2FycmF5IGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9saXN0X29mX2pzX2FycmF5KGEpe1xuICB2YXIgbCA9IDA7XG4gIGZvcih2YXIgaT1hLmxlbmd0aCAtIDE7IGk+PTA7IGktLSl7XG4gICAgdmFyIGUgPSBhW2ldO1xuICAgIGwgPSBbMCxlLGxdO1xuICB9XG4gIHJldHVybiBsXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF90b19qc19hcnJheSBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGlzdF90b19qc19hcnJheShsKXtcbiAgdmFyIGEgPSBbXTtcbiAgZm9yKDsgbCAhPT0gMDsgbCA9IGxbMl0pIHtcbiAgICBhLnB1c2gobFsxXSk7XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdmFyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX3Zhcih4KSB7XG4gIHZhciB4ID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoeCk7XG4gIC8vQ2hlY2tzIHRoYXQgeCBoYXMgdGhlIGZvcm0gaWRlbnRbLmlkZW50XSpcbiAgaWYoIXgubWF0Y2goL15bYS16QS1aXyRdW2EtekEtWl8kMC05XSooXFwuW2EtekEtWl8kXVthLXpBLVpfJDAtOV0qKSokLykpe1xuICAgIGNvbnNvbGUuZXJyb3IoXCJjYW1sX2pzX3ZhcjogXFxcIlwiICsgeCArIFwiXFxcIiBpcyBub3QgYSB2YWxpZCBKYXZhU2NyaXB0IHZhcmlhYmxlLiBjb250aW51aW5nIC4uXCIpO1xuICAgIC8vY29uc29sZS5lcnJvcihcIkpzLlVuc2FmZS5ldmFsX3N0cmluZ1wiKVxuICB9XG4gIHJldHVybiBldmFsKHgpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19jYWxsIChjb25zdCwgbXV0YWJsZSwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19jYWxsKGYsIG8sIGFyZ3MpIHsgcmV0dXJuIGYuYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTsgfVxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5fY2FsbCAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfZnVuX2NhbGwoZiwgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gIGNhc2UgMTogcmV0dXJuIGYoKTtcbiAgY2FzZSAyOiByZXR1cm4gZiAoYVsxXSk7XG4gIGNhc2UgMzogcmV0dXJuIGYgKGFbMV0sYVsyXSk7XG4gIGNhc2UgNDogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdKTtcbiAgY2FzZSA1OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSk7XG4gIGNhc2UgNjogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSk7XG4gIGNhc2UgNzogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdKTtcbiAgY2FzZSA4OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sYVs3XSk7XG4gIH1cbiAgcmV0dXJuIGYuYXBwbHkobnVsbCwgY2FtbF9qc19mcm9tX2FycmF5KGEpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbWV0aF9jYWxsIChtdXRhYmxlLCBjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfbWV0aF9jYWxsKG8sIGYsIGFyZ3MpIHtcbiAgcmV0dXJuIG9bY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoZildLmFwcGx5KG8sIGNhbWxfanNfZnJvbV9hcnJheShhcmdzKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX25ldyAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfbmV3KGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICBjYXNlIDE6IHJldHVybiBuZXcgYztcbiAgY2FzZSAyOiByZXR1cm4gbmV3IGMgKGFbMV0pO1xuICBjYXNlIDM6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdKTtcbiAgY2FzZSA0OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdKTtcbiAgY2FzZSA1OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0pO1xuICBjYXNlIDY6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKTtcbiAgY2FzZSA3OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdKTtcbiAgY2FzZSA4OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdLGFbN10pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7IHJldHVybiBjLmFwcGx5KHRoaXMsIGNhbWxfanNfZnJvbV9hcnJheShhKSk7IH1cbiAgRi5wcm90b3R5cGUgPSBjLnByb3RvdHlwZTtcbiAgcmV0dXJuIG5ldyBGO1xufVxuLy9Qcm92aWRlczogY2FtbF9vanNfbmV3X2FyciAoY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb2pzX25ld19hcnIoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gIGNhc2UgMDogcmV0dXJuIG5ldyBjO1xuICBjYXNlIDE6IHJldHVybiBuZXcgYyAoYVswXSk7XG4gIGNhc2UgMjogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0pO1xuICBjYXNlIDM6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0pO1xuICBjYXNlIDQ6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSk7XG4gIGNhc2UgNTogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0pO1xuICBjYXNlIDY6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pO1xuICBjYXNlIDc6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSk7XG4gIH1cbiAgZnVuY3Rpb24gRigpIHsgcmV0dXJuIGMuYXBwbHkodGhpcywgYSk7IH1cbiAgRi5wcm90b3R5cGUgPSBjLnByb3RvdHlwZTtcbiAgcmV0dXJuIG5ldyBGO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYobGVuID4gMCl7XG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJncyA9IFt1bmRlZmluZWRdO1xuICAgIH1cbiAgICB2YXIgcmVzID0gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgICByZXR1cm4gKHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKT9jYW1sX2pzX3dyYXBfY2FsbGJhY2socmVzKTpyZXM7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1xuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50cyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgW2FyZ3NdKTtcbiAgfVxufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdChhcml0eSwgZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcml0eSk7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGgsIGFyaXR5KVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTsgfVxufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2sgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFjaywgY2FtbF9qc193cmFwX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgYXJnc1swXSA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpKzFdID0gYXJndW1lbnRzW2ldO1xuICAgIHZhciByZXMgPSBjYW1sX2NhbGxiYWNrKGYsYXJncyk7XG4gICAgcmV0dXJuIChyZXMgaW5zdGFuY2VvZiBGdW5jdGlvbik/Y2FtbF9qc193cmFwX2NhbGxiYWNrKHJlcyk6cmVzO1xuICB9XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZixbdGhpcyxhcmdzXSk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJpdHkgKyAxKTtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCwgYXJpdHkpXG4gICAgYXJnc1swXSA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpKzFdID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICB9O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikgLSAxO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICAgIGFyZ3NbMF0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaSsxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTsgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiAhZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKSB7XG4gIHJldHVybiAoZi5sID49IDApP2YubDooZi5sID0gZi5sZW5ndGgpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICAvLyBGdW5jdGlvbnMgaGF2ZSBhbiBhZGRpdGlvbmFsIGNvbnRpbnVhdGlvbiBwYXJhbWV0ZXIuIFRoaXMgc2hvdWxkXG4gIC8vIG5vdCBiZSB2aXNpYmxlIHdoZW4gY2FsbGluZyB0aGVtIGZyb20gSmF2YVNjcmlwdFxuICByZXR1cm4gKChmLmwgPj0gMCk/Zi5sOihmLmwgPSBmLmxlbmd0aCkpIC0gMVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2VxdWFscyBtdXRhYmxlIChjb25zdCwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2VxdWFscyAoeCwgeSkgeyByZXR1cm4gKyh4ID09IHkpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXZhbF9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXZhbF9zdHJpbmcgKHMpIHtyZXR1cm4gZXZhbChjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKSk7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2V4cHIgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZXhwcihzKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJjYW1sX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgcmV0dXJuIGV2YWwoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO31cblxuLy9Qcm92aWRlczogY2FtbF9wdXJlX2pzX2V4cHIgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfcHVyZV9qc19leHByIChzKXtcbiAgY29uc29sZS5lcnJvcihcImNhbWxfcHVyZV9qc19leHByOiBmYWxsYmFjayB0byBydW50aW1lIGV2YWx1YXRpb25cXG5cIik7XG4gIHJldHVybiBldmFsKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpKTt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfb2JqZWN0IChvYmplY3RfbGl0ZXJhbClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX29iamVjdCAoYSkge1xuICB2YXIgbyA9IHt9O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcCA9IGFbaV07XG4gICAgb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwWzFdKV0gPSBwWzJdO1xuICB9XG4gIHJldHVybiBvO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBGb3JtYXRcblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9mb3JtYXRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9wYXJzZV9mb3JtYXQgKGZtdCkge1xuICBmbXQgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGZtdCk7XG4gIHZhciBsZW4gPSBmbXQubGVuZ3RoO1xuICBpZiAobGVuID4gMzEpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImZvcm1hdF9pbnQ6IGZvcm1hdCB0b28gbG9uZ1wiKTtcbiAgdmFyIGYgPVxuICAgICAgeyBqdXN0aWZ5OicrJywgc2lnbnN0eWxlOictJywgZmlsbGVyOicgJywgYWx0ZXJuYXRlOmZhbHNlLFxuICAgICAgICBiYXNlOjAsIHNpZ25lZGNvbnY6ZmFsc2UsIHdpZHRoOjAsIHVwcGVyY2FzZTpmYWxzZSxcbiAgICAgICAgc2lnbjoxLCBwcmVjOi0xLCBjb252OidmJyB9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGMgPSBmbXQuY2hhckF0KGkpO1xuICAgIHN3aXRjaCAoYykge1xuICAgIGNhc2UgJy0nOlxuICAgICAgZi5qdXN0aWZ5ID0gJy0nOyBicmVhaztcbiAgICBjYXNlICcrJzogY2FzZSAnICc6XG4gICAgICBmLnNpZ25zdHlsZSA9IGM7IGJyZWFrO1xuICAgIGNhc2UgJzAnOlxuICAgICAgZi5maWxsZXIgPSAnMCc7IGJyZWFrO1xuICAgIGNhc2UgJyMnOlxuICAgICAgZi5hbHRlcm5hdGUgPSB0cnVlOyBicmVhaztcbiAgICBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzogY2FzZSAnNSc6XG4gICAgY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6XG4gICAgICBmLndpZHRoID0gMDtcbiAgICAgIHdoaWxlIChjPWZtdC5jaGFyQ29kZUF0KGkpIC0gNDgsIGMgPj0gMCAmJiBjIDw9IDkpIHtcbiAgICAgICAgZi53aWR0aCA9IGYud2lkdGggKiAxMCArIGM7IGkrK1xuICAgICAgfVxuICAgICAgaS0tO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnLic6XG4gICAgICBmLnByZWMgPSAwO1xuICAgICAgaSsrO1xuICAgICAgd2hpbGUgKGM9Zm10LmNoYXJDb2RlQXQoaSkgLSA0OCwgYyA+PSAwICYmIGMgPD0gOSkge1xuICAgICAgICBmLnByZWMgPSBmLnByZWMgKiAxMCArIGM7IGkrK1xuICAgICAgfVxuICAgICAgaS0tO1xuICAgIGNhc2UgJ2QnOiBjYXNlICdpJzpcbiAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7IC8qIGZhbGx0aHJvdWdoICovXG4gICAgY2FzZSAndSc6XG4gICAgICBmLmJhc2UgPSAxMDsgYnJlYWs7XG4gICAgY2FzZSAneCc6XG4gICAgICBmLmJhc2UgPSAxNjsgYnJlYWs7XG4gICAgY2FzZSAnWCc6XG4gICAgICBmLmJhc2UgPSAxNjsgZi51cHBlcmNhc2UgPSB0cnVlOyBicmVhaztcbiAgICBjYXNlICdvJzpcbiAgICAgIGYuYmFzZSA9IDg7IGJyZWFrO1xuICAgIGNhc2UgJ2UnOiBjYXNlICdmJzogY2FzZSAnZyc6XG4gICAgICBmLnNpZ25lZGNvbnYgPSB0cnVlOyBmLmNvbnYgPSBjOyBicmVhaztcbiAgICBjYXNlICdFJzogY2FzZSAnRic6IGNhc2UgJ0cnOlxuICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTsgZi51cHBlcmNhc2UgPSB0cnVlO1xuICAgICAgZi5jb252ID0gYy50b0xvd2VyQ2FzZSAoKTsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBmO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHJhd2J1ZmZlcikge1xuICBpZiAoZi51cHBlcmNhc2UpIHJhd2J1ZmZlciA9IHJhd2J1ZmZlci50b1VwcGVyQ2FzZSgpO1xuICB2YXIgbGVuID0gcmF3YnVmZmVyLmxlbmd0aDtcbiAgLyogQWRqdXN0IGxlbiB0byByZWZsZWN0IGFkZGl0aW9uYWwgY2hhcnMgKHNpZ24sIGV0YykgKi9cbiAgaWYgKGYuc2lnbmVkY29udiAmJiAoZi5zaWduIDwgMCB8fCBmLnNpZ25zdHlsZSAhPSAnLScpKSBsZW4rKztcbiAgaWYgKGYuYWx0ZXJuYXRlKSB7XG4gICAgaWYgKGYuYmFzZSA9PSA4KSBsZW4gKz0gMTtcbiAgICBpZiAoZi5iYXNlID09IDE2KSBsZW4gKz0gMjtcbiAgfVxuICAvKiBEbyB0aGUgZm9ybWF0dGluZyAqL1xuICB2YXIgYnVmZmVyID0gXCJcIjtcbiAgaWYgKGYuanVzdGlmeSA9PSAnKycgJiYgZi5maWxsZXIgPT0gJyAnKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSAnICc7XG4gIGlmIChmLnNpZ25lZGNvbnYpIHtcbiAgICBpZiAoZi5zaWduIDwgMCkgYnVmZmVyICs9ICctJztcbiAgICBlbHNlIGlmIChmLnNpZ25zdHlsZSAhPSAnLScpIGJ1ZmZlciArPSBmLnNpZ25zdHlsZTtcbiAgfVxuICBpZiAoZi5hbHRlcm5hdGUgJiYgZi5iYXNlID09IDgpIGJ1ZmZlciArPSAnMCc7XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT0gMTYpIGJ1ZmZlciArPSBmLnVwcGVyY2FzZT9cIjBYXCI6XCIweFwiO1xuICBpZiAoZi5qdXN0aWZ5ID09ICcrJyAmJiBmLmZpbGxlciA9PSAnMCcpXG4gICAgZm9yICh2YXIgaSA9IGxlbjsgaSA8IGYud2lkdGg7IGkrKykgYnVmZmVyICs9ICcwJztcbiAgYnVmZmVyICs9IHJhd2J1ZmZlcjtcbiAgaWYgKGYuanVzdGlmeSA9PSAnLScpXG4gICAgZm9yICh2YXIgaSA9IGxlbjsgaSA8IGYud2lkdGg7IGkrKykgYnVmZmVyICs9ICcgJztcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoYnVmZmVyKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBqc29vX2Zsb29yX2xvZzJcbnZhciBsb2cyX29rID0gTWF0aC5sb2cyICYmIE1hdGgubG9nMigxLjEyMzU1ODIwOTI4ODk0NzRFKzMwNykgPT0gMTAyMFxuZnVuY3Rpb24ganNvb19mbG9vcl9sb2cyKHgpIHtcbiAgaWYobG9nMl9vaykgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5sb2cyKHgpKVxuICB2YXIgaSA9IDA7XG4gIGlmICh4ID09IDApIHJldHVybiAtSW5maW5pdHk7XG4gIGlmKHg+PTEpIHt3aGlsZSAoeD49Mikge3gvPTI7IGkrK30gfVxuICBlbHNlIHt3aGlsZSAoeCA8IDEpIHt4Kj0yOyBpLS19IH07XG4gIHJldHVybiBpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZmxvb3JfbG9nMiwgY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGlcbmZ1bmN0aW9uIGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCAoeCkge1xuICBpZiAoIWlzRmluaXRlKHgpKSB7XG4gICAgaWYgKGlzTmFOKHgpKVxuICAgICAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKDEsIDAsIDB4N2ZmMCk7XG4gICAgaWYgKHggPiAwKVxuICAgICAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKDAsIDAsIDB4N2ZmMClcbiAgICBlbHNlXG4gICAgICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkoMCwgMCwgMHhmZmYwKVxuICB9XG4gIHZhciBzaWduID0gKHg9PTAgJiYgMS94ID09IC1JbmZpbml0eSk/MHg4MDAwOih4Pj0wKT8wOjB4ODAwMDtcbiAgaWYgKHNpZ24pIHggPSAteDtcbiAgLy8gSW50NjQuYml0c19vZl9mbG9hdCAxLjEyMzU1ODIwOTI4ODk0NzRFKzMwNyA9IDB4N2ZiMDAwMDAwMDAwMDAwMExcbiAgLy8gdXNpbmcgTWF0aC5MT0cyRSpNYXRoLmxvZyh4KSBpbiBwbGFjZSBvZiBNYXRoLmxvZzIgcmVzdWx0IGluIHByZWNpc2lvbiBsb3N0XG4gIHZhciBleHAgPSBqc29vX2Zsb29yX2xvZzIoeCkgKyAxMDIzO1xuICBpZiAoZXhwIDw9IDApIHtcbiAgICBleHAgPSAwO1xuICAgIHggLz0gTWF0aC5wb3coMiwtMTAyNik7XG4gIH0gZWxzZSB7XG4gICAgeCAvPSBNYXRoLnBvdygyLGV4cC0xMDI3KTtcbiAgICBpZiAoeCA8IDE2KSB7XG4gICAgICB4ICo9IDI7IGV4cCAtPTE7IH1cbiAgICBpZiAoZXhwID09IDApIHtcbiAgICAgIHggLz0gMjsgfVxuICB9XG4gIHZhciBrID0gTWF0aC5wb3coMiwyNCk7XG4gIHZhciByMyA9IHh8MDtcbiAgeCA9ICh4IC0gcjMpICogaztcbiAgdmFyIHIyID0geHwwO1xuICB4ID0gKHggLSByMikgKiBrO1xuICB2YXIgcjEgPSB4fDA7XG4gIHIzID0gKHIzICYweGYpIHwgc2lnbiB8IGV4cCA8PCA0O1xuICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkocjEsIHIyLCByMyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczoganNvb19mbG9vcl9sb2cyXG5mdW5jdGlvbiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgKHgpIHtcbiAgdmFyIGZsb2F0MzJhID0gbmV3IEZsb2F0MzJBcnJheSgxKTtcbiAgZmxvYXQzMmFbMF0gPSB4O1xuICB2YXIgaW50MzJhID0gbmV3IEludDMyQXJyYXkoZmxvYXQzMmEuYnVmZmVyKTtcbiAgcmV0dXJuIGludDMyYVswXSB8IDA7XG59XG5cbi8vRlAgbGl0ZXJhbHMgY2FuIGJlIHdyaXR0ZW4gdXNpbmcgdGhlIGhleGFkZWNpbWFsXG4vL25vdGF0aW9uIDB4PG1hbnRpc3NhIGluIGhleD5wPGV4cG9uZW50PiBmcm9tIElTTyBDOTkuXG4vL2h0dHBzOi8vZ2l0aHViLmNvbS9kYW5rb2dhaS9qcy1oZXhmbG9hdC9ibG9iL21hc3Rlci9oZXhmbG9hdC5qc1xuLy9Qcm92aWRlczogY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nLCBjYW1sX3N0cl9yZXBlYXRcbmZ1bmN0aW9uIGNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0ICh4LCBwcmVjLCBzdHlsZSkge1xuICBpZiAoIWlzRmluaXRlKHgpKSB7XG4gICAgaWYgKGlzTmFOKHgpKSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoXCJuYW5cIik7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nICgoeCA+IDApP1wiaW5maW5pdHlcIjpcIi1pbmZpbml0eVwiKTtcbiAgfVxuICB2YXIgc2lnbiA9ICh4PT0wICYmIDEveCA9PSAtSW5maW5pdHkpPzE6KHg+PTApPzA6MTtcbiAgaWYoc2lnbikgeCA9IC14O1xuICB2YXIgZXhwID0gMDtcbiAgaWYgKHggPT0gMCkgeyB9XG4gIGVsc2UgaWYgKHggPCAxKSB7XG4gICAgd2hpbGUgKHggPCAxICYmIGV4cCA+IC0xMDIyKSAgeyB4ICo9IDI7IGV4cC0tIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSAoeCA+PSAyKSB7IHggLz0gMjsgZXhwKysgfVxuICB9XG4gIHZhciBleHBfc2lnbiA9IGV4cCA8IDAgPyAnJyA6ICcrJztcbiAgdmFyIHNpZ25fc3RyID0gJyc7XG4gIGlmIChzaWduKSBzaWduX3N0ciA9ICctJ1xuICBlbHNlIHtcbiAgICBzd2l0Y2goc3R5bGUpe1xuICAgIGNhc2UgNDMgLyogJysnICovOiBzaWduX3N0ciA9ICcrJzsgYnJlYWs7XG4gICAgY2FzZSAzMiAvKiAnICcgKi86IHNpZ25fc3RyID0gJyAnOyBicmVhaztcbiAgICBkZWZhdWx0OiBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKHByZWMgPj0gMCAmJiBwcmVjIDwgMTMpIHtcbiAgICAvKiBJZiBhIHByZWNpc2lvbiBpcyBnaXZlbiwgYW5kIGlzIHNtYWxsLCByb3VuZCBtYW50aXNzYSBhY2NvcmRpbmdseSAqL1xuICAgIHZhciBjc3QgPSBNYXRoLnBvdygyLHByZWMgKiA0KTtcbiAgICB4ID0gTWF0aC5yb3VuZCh4ICogY3N0KSAvIGNzdDtcbiAgfVxuICB2YXIgeF9zdHIgPSB4LnRvU3RyaW5nKDE2KTtcbiAgaWYocHJlYyA+PSAwKXtcbiAgICB2YXIgaWR4ID0geF9zdHIuaW5kZXhPZignLicpO1xuICAgIGlmKGlkeDwwKSB7XG4gICAgICB4X3N0ciArPSAnLicgKyBjYW1sX3N0cl9yZXBlYXQocHJlYywgJzAnKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgc2l6ZSA9IGlkeCsxK3ByZWM7XG4gICAgICBpZih4X3N0ci5sZW5ndGggPCBzaXplKVxuICAgICAgICB4X3N0ciArPSBjYW1sX3N0cl9yZXBlYXQoc2l6ZSAtIHhfc3RyLmxlbmd0aCwgJzAnKTtcbiAgICAgIGVsc2VcbiAgICAgICAgeF9zdHIgPSB4X3N0ci5zdWJzdHIoMCxzaXplKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChzaWduX3N0ciArICcweCcgKyB4X3N0ciArICdwJyArIGV4cF9zaWduICsgZXhwLnRvU3RyaW5nKDEwKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzICh4KSB7XG4gIHZhciBsbyA9IHgubG87XG4gIHZhciBtaSA9IHgubWk7XG4gIHZhciBoaSA9IHguaGk7XG4gIHZhciBleHAgPSAoaGkgJiAweDdmZmYpID4+IDQ7XG4gIGlmIChleHAgPT0gMjA0Nykge1xuICAgIGlmICgobG98bWl8KGhpJjB4ZikpID09IDApXG4gICAgICByZXR1cm4gKGhpICYgMHg4MDAwKT8oLUluZmluaXR5KTpJbmZpbml0eTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gTmFOO1xuICB9XG4gIHZhciBrID0gTWF0aC5wb3coMiwtMjQpO1xuICB2YXIgcmVzID0gKGxvKmsrbWkpKmsrKGhpJjB4Zik7XG4gIGlmIChleHAgPiAwKSB7XG4gICAgcmVzICs9IDE2O1xuICAgIHJlcyAqPSBNYXRoLnBvdygyLGV4cC0xMDI3KTtcbiAgfSBlbHNlXG4gICAgcmVzICo9IE1hdGgucG93KDIsLTEwMjYpO1xuICBpZiAoaGkgJiAweDgwMDApIHJlcyA9IC0gcmVzO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25leHRhZnRlcl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X3N1YixjYW1sX2ludDY0X29mX2ludDMyXG5mdW5jdGlvbiBjYW1sX25leHRhZnRlcl9mbG9hdCAoeCx5KSB7XG4gIGlmKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm4gTmFOO1xuICBpZih4PT15KSByZXR1cm4geTtcbiAgaWYoeD09MCl7XG4gICAgaWYoeSA8IDApXG4gICAgICByZXR1cm4gLU1hdGgucG93KDIsIC0xMDc0KVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCAtMTA3NClcbiAgfVxuICB2YXIgYml0cyA9IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh4KTtcbiAgdmFyIG9uZSA9IGNhbWxfaW50NjRfb2ZfaW50MzIoMSk7XG4gIGlmICgoeDx5KSA9PSAoeD4wKSlcbiAgICBiaXRzID0gY2FtbF9pbnQ2NF9hZGQoYml0cywgb25lKVxuICBlbHNlXG4gICAgYml0cyA9IGNhbWxfaW50NjRfc3ViKGJpdHMsIG9uZSlcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhiaXRzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF90cnVuY19mbG9hdFxuZnVuY3Rpb24gY2FtbF90cnVuY19mbG9hdCh4KXtcbiAgcmV0dXJuIE1hdGgudHJ1bmMoeCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzICh4KSB7XG4gIHZhciBpbnQzMmEgPSBuZXcgSW50MzJBcnJheSgxKTtcbiAgaW50MzJhWzBdID0geDtcbiAgdmFyIGZsb2F0MzJhID0gbmV3IEZsb2F0MzJBcnJheShpbnQzMmEuYnVmZmVyKTtcbiAgcmV0dXJuIGZsb2F0MzJhWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NsYXNzaWZ5X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NsYXNzaWZ5X2Zsb2F0ICh4KSB7XG4gIGlmIChpc0Zpbml0ZSAoeCkpIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPj0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDgpIHJldHVybiAwO1xuICAgIGlmICh4ICE9IDApIHJldHVybiAxO1xuICAgIHJldHVybiAyO1xuICB9XG4gIHJldHVybiBpc05hTih4KT80OjM7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21vZGZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbW9kZl9mbG9hdCAoeCkge1xuICBpZiAoaXNGaW5pdGUgKHgpKSB7XG4gICAgdmFyIG5lZyA9ICgxL3gpIDwgMDtcbiAgICB4ID0gTWF0aC5hYnMoeCk7XG4gICAgdmFyIGkgPSBNYXRoLmZsb29yICh4KTtcbiAgICB2YXIgZiA9IHggLSBpO1xuICAgIGlmIChuZWcpIHsgaSA9IC1pOyBmID0gLWY7IH1cbiAgICByZXR1cm4gWzAsIGYsIGldO1xuICB9XG4gIGlmIChpc05hTiAoeCkpIHJldHVybiBbMCwgTmFOLCBOYU5dO1xuICByZXR1cm4gWzAsIDEveCwgeF07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2xkZXhwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xkZXhwX2Zsb2F0ICh4LGV4cCkge1xuICBleHAgfD0gMDtcbiAgaWYgKGV4cCA+IDEwMjMpIHtcbiAgICBleHAgLT0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIGlmIChleHAgPiAxMDIzKSB7ICAvLyBpbiBjYXNlIHggaXMgc3Vibm9ybWFsXG4gICAgICBleHAgLT0gMTAyMztcbiAgICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgfVxuICB9XG4gIGlmIChleHAgPCAtMTAyMykge1xuICAgIGV4cCArPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgLTEwMjMpO1xuICB9XG4gIHggKj0gTWF0aC5wb3coMiwgZXhwKTtcbiAgcmV0dXJuIHg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXhwX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2Zsb29yX2xvZzJcbmZ1bmN0aW9uIGNhbWxfZnJleHBfZmxvYXQgKHgpIHtcbiAgaWYgKCh4ID09IDApIHx8ICFpc0Zpbml0ZSh4KSkgcmV0dXJuIFswLCB4LCAwXTtcbiAgdmFyIG5lZyA9IHggPCAwO1xuICBpZiAobmVnKSB4ID0gLSB4O1xuICB2YXIgZXhwID0gTWF0aC5tYXgoLTEwMjMsIGpzb29fZmxvb3JfbG9nMih4KSArIDEpO1xuICB4ICo9IE1hdGgucG93KDIsLWV4cCk7XG4gIHdoaWxlICh4IDwgMC41KSB7XG4gICAgeCAqPSAyO1xuICAgIGV4cC0tO1xuICB9XG4gIHdoaWxlICh4ID49IDEpIHtcbiAgICB4ICo9IDAuNTtcbiAgICBleHArKztcbiAgfVxuICBpZiAobmVnKSB4ID0gLSB4O1xuICByZXR1cm4gWzAsIHgsIGV4cF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRfY29tcGFyZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9mbG9hdF9jb21wYXJlICh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSByZXR1cm4gMDtcbiAgaWYgKHggPCB5KSByZXR1cm4gLTE7XG4gIGlmICh4ID4geSkgcmV0dXJuIDE7XG4gIGlmICh4ID09PSB4KSByZXR1cm4gMTtcbiAgaWYgKHkgPT09IHkpIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29weXNpZ25fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29weXNpZ25fZmxvYXQgKHgsIHkpIHtcbiAgaWYgKHkgPT0gMCkgeSA9IDEgLyB5O1xuICB4ID0gTWF0aC5hYnMoeCk7XG4gIHJldHVybiAoeSA8IDApPygteCk6eDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zaWduYml0X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3NpZ25iaXRfZmxvYXQoeCkge1xuICBpZiAoeCA9PSAwKSB4ID0gMSAvIHg7XG4gIHJldHVybiAoeCA8IDApPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9leHBtMV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHBtMV9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5leHBtMSh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9leHAyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cDJfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5wb3coMiwgeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbG9nMXBfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMXBfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5sb2cxcCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9sb2cyX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzJfZmxvYXQoeCkgeyByZXR1cm4gTWF0aC5sb2cyKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2h5cG90X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2h5cG90X2Zsb2F0ICh4LCB5KSB7IHJldHVybiBNYXRoLmh5cG90KHgsIHkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzEwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzEwX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmxvZzEwKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2Nvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29zaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5jb3NoKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2Fjb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Fjb3NoX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmFjb3NoKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3NpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2luaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5zaW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2FzaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2FzaW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmFzaW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3RhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfdGFuaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC50YW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2F0YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2F0YW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmF0YW5oKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3JvdW5kX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3JvdW5kX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2NicnRfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY2JydF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5jYnJ0KHgpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXJmX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2VyZl9mbG9hdCh4KSB7XG4gIHZhciBhMSA9IDAuMjU0ODI5NTkyO1xuICB2YXIgYTIgPSAtMC4yODQ0OTY3MzY7XG4gIHZhciBhMyA9IDEuNDIxNDEzNzQxO1xuICB2YXIgYTQgPSAtMS40NTMxNTIwMjc7XG4gIHZhciBhNSA9IDEuMDYxNDA1NDI5O1xuICB2YXIgcCA9IDAuMzI3NTkxMTtcblxuICB2YXIgc2lnbiA9IDE7XG4gIGlmICh4IDwgMCkge1xuICAgIHNpZ24gPSAtMTtcbiAgfVxuICB4ID0gTWF0aC5hYnMoeCk7XG4gIHZhciB0ID0gMS4wIC8gKDEuMCArIHAgKiB4KTtcbiAgdmFyIHkgPSAxLjAgLSAoKCgoYTUgKiB0ICsgYTQpICogdCArIGEzKSAqIHQgKyBhMikgKiB0ICsgYTEpICogdCAqIE1hdGguZXhwKC14ICogeCk7XG5cbiAgcmV0dXJuIHNpZ24gKiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VyZmNfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfZXJmX2Zsb2F0XG5mdW5jdGlvbiBjYW1sX2VyZmNfZmxvYXQoeCkge1xuICByZXR1cm4gMSAtIGNhbWxfZXJmX2Zsb2F0KHgpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZm1hX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZtYV9mbG9hdCh4LCB5LCB6KSB7XG4gIHZhciBTUExJVCA9IE1hdGgucG93KDIsIDI3KSArIDE7XG4gIHZhciBNSU5fVkFMVUUgPSBNYXRoLnBvdygyLCAtMTAyMik7XG4gIHZhciBFUFNJTE9OID0gTWF0aC5wb3coMiwgLTUyKTtcbiAgdmFyIEMgPSA0MTY7XG4gIHZhciBBID0gTWF0aC5wb3coMiwgK0MpO1xuICB2YXIgQiA9IE1hdGgucG93KDIsIC1DKTtcblxuICBmdW5jdGlvbiBtdWx0aXBseSAoYSwgYikge1xuICAgIHZhciBhdCA9IFNQTElUICogYTtcbiAgICB2YXIgYWhpID0gYXQgLSAoYXQgLSBhKTtcbiAgICB2YXIgYWxvID0gYSAtIGFoaTtcbiAgICB2YXIgYnQgPSBTUExJVCAqIGI7XG4gICAgdmFyIGJoaSA9IGJ0IC0gKGJ0IC0gYik7XG4gICAgdmFyIGJsbyA9IGIgLSBiaGk7XG4gICAgdmFyIHAgPSBhICogYjtcbiAgICB2YXIgZSA9ICgoYWhpICogYmhpIC0gcCkgKyBhaGkgKiBibG8gKyBhbG8gKiBiaGkpICsgYWxvICogYmxvO1xuICAgIHJldHVybiB7XG4gICAgICBwOiBwLFxuICAgICAgZTogZVxuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gICAgdmFyIHMgPSBhICsgYjtcbiAgICB2YXIgdiA9IHMgLSBhO1xuICAgIHZhciBlID0gKGEgLSAocyAtIHYpKSArIChiIC0gdik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHM6IHMsXG4gICAgICBlOiBlXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGp1c3QgKHgsIHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCAmJiB5ICE9PSAwICYmIFNQTElUICogeCAtIChTUExJVCAqIHggLSB4KSA9PT0geCA/IHggKiAoMSArICh4IDwgMCA/IC0xIDogKzEpICogKHkgPCAwID8gLTEgOiArMSkgKiBFUFNJTE9OKSA6IHg7XG4gIH07XG5cbiAgaWYgKHggPT09IDAgfHwgeCAhPT0geCB8fCB4ID09PSArMSAvIDAgfHwgeCA9PT0gLTEgLyAwIHx8XG4gICAgICB5ID09PSAwIHx8IHkgIT09IHkgfHwgeSA9PT0gKzEgLyAwIHx8IHkgPT09IC0xIC8gMCkge1xuICAgIHJldHVybiB4ICogeSArIHo7XG4gIH1cbiAgaWYgKHogPT09IDApIHtcbiAgICByZXR1cm4geCAqIHk7XG4gIH1cbiAgaWYgKHogIT09IHogfHwgeiA9PT0gKzEgLyAwIHx8IHogPT09IC0xIC8gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHNjYWxlID0gMTtcbiAgd2hpbGUgKE1hdGguYWJzKHgpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeCAqPSBCO1xuICB9XG4gIHdoaWxlIChNYXRoLmFicyh5KSA+IEEpIHtcbiAgICBzY2FsZSAqPSBBO1xuICAgIHkgKj0gQjtcbiAgfVxuICBpZiAoc2NhbGUgPT09IDEgLyAwKSB7XG4gICAgcmV0dXJuIHggKiB5ICogc2NhbGU7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHgpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeCAqPSBBO1xuICB9XG4gIHdoaWxlIChNYXRoLmFicyh5KSA8IEIpIHtcbiAgICBzY2FsZSAqPSBCO1xuICAgIHkgKj0gQTtcbiAgfVxuICBpZiAoc2NhbGUgPT09IDApIHtcbiAgICByZXR1cm4gejtcbiAgfVxuXG4gIHZhciB4cyA9IHg7XG4gIHZhciB5cyA9IHk7XG4gIHZhciB6cyA9IHogLyBzY2FsZTtcblxuICBpZiAoTWF0aC5hYnMoenMpID4gTWF0aC5hYnMoeHMgKiB5cykgKiA0IC8gRVBTSUxPTikge1xuICAgIHJldHVybiB6O1xuICB9XG4gIGlmIChNYXRoLmFicyh6cykgPCBNYXRoLmFicyh4cyAqIHlzKSAqIEVQU0lMT04gLyA0ICogRVBTSUxPTiAvIDQpIHtcbiAgICB6cyA9ICh6IDwgMCA/IC0xIDogKzEpICogTUlOX1ZBTFVFO1xuICB9XG5cbiAgdmFyIHh5ID0gbXVsdGlwbHkoeHMsIHlzKTtcbiAgdmFyIHMgPSBhZGQoeHkucCwgenMpO1xuICB2YXIgdSA9IGFkZCh4eS5lLCBzLmUpO1xuICB2YXIgaSA9IGFkZChzLnMsIHUucyk7XG5cbiAgdmFyIGYgPSBpLnMgKyBhZGp1c3QoaS5lLCB1LmUpO1xuICBpZiAoZiA9PT0gMCkge1xuICAgIHJldHVybiBmO1xuICB9XG5cbiAgdmFyIGZzID0gZiAqIHNjYWxlO1xuICBpZiAoTWF0aC5hYnMoZnMpID4gTUlOX1ZBTFVFKSB7XG4gICAgcmV0dXJuIGZzO1xuICB9XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSB3YXMgZXh0cmEgcm91bmRpbmcgZm9yIGEgZGVub3JtYWxpemVkIHZhbHVlLlxuICByZXR1cm4gZnMgKyBhZGp1c3QoZiAtIGZzIC8gc2NhbGUsIGkuZSkgKiBzY2FsZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9mbG9hdCAoZm10LCB4KSB7XG4gIGZ1bmN0aW9uIHRvRml4ZWQoeCxkcCkge1xuICAgIGlmIChNYXRoLmFicyh4KSA8IDEuMCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChkcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlID0gcGFyc2VJbnQoeC50b1N0cmluZygpLnNwbGl0KCcrJylbMV0pO1xuICAgICAgaWYgKGUgPiAyMCkge1xuICAgICAgICBlIC09IDIwO1xuICAgICAgICB4IC89IE1hdGgucG93KDEwLGUpO1xuICAgICAgICB4ICs9IChuZXcgQXJyYXkoZSsxKSkuam9pbignMCcpO1xuICAgICAgICBpZihkcCA+IDApIHtcbiAgICAgICAgICB4ID0geCArICcuJyArIChuZXcgQXJyYXkoZHArMSkpLmpvaW4oJzAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICAgIH1cbiAgICAgIGVsc2UgcmV0dXJuIHgudG9GaXhlZChkcClcbiAgICB9XG4gIH1cbiAgdmFyIHMsIGYgPSBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpO1xuICB2YXIgcHJlYyA9IChmLnByZWMgPCAwKT82OmYucHJlYztcbiAgaWYgKHggPCAwIHx8ICh4ID09IDAgJiYgMS94ID09IC1JbmZpbml0eSkpIHsgZi5zaWduID0gLTE7IHggPSAteDsgfVxuICBpZiAoaXNOYU4oeCkpIHsgcyA9IFwibmFuXCI7IGYuZmlsbGVyID0gJyAnOyB9XG4gIGVsc2UgaWYgKCFpc0Zpbml0ZSh4KSkgeyBzID0gXCJpbmZcIjsgZi5maWxsZXIgPSAnICc7IH1cbiAgZWxzZVxuICAgIHN3aXRjaCAoZi5jb252KSB7XG4gICAgY2FzZSAnZSc6XG4gICAgICB2YXIgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjKTtcbiAgICAgIC8vIGV4cG9uZW50IHNob3VsZCBiZSBhdCBsZWFzdCB0d28gZGlnaXRzXG4gICAgICB2YXIgaSA9IHMubGVuZ3RoO1xuICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PSAnZScpXG4gICAgICAgIHMgPSBzLnNsaWNlICgwLCBpIC0gMSkgKyAnMCcgKyBzLnNsaWNlIChpIC0gMSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmJzpcbiAgICAgIHMgPSB0b0ZpeGVkKHgsIHByZWMpOyBicmVhaztcbiAgICBjYXNlICdnJzpcbiAgICAgIHByZWMgPSBwcmVjP3ByZWM6MTtcbiAgICAgIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyAtIDEpO1xuICAgICAgdmFyIGogPSBzLmluZGV4T2YoJ2UnKTtcbiAgICAgIHZhciBleHAgPSArcy5zbGljZShqICsgMSk7XG4gICAgICBpZiAoZXhwIDwgLTQgfHwgeCA+PSAxZTIxIHx8IHgudG9GaXhlZCgwKS5sZW5ndGggPiBwcmVjKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgdmFyIGkgPSBqIC0gMTsgd2hpbGUgKHMuY2hhckF0KGkpID09ICcwJykgaS0tO1xuICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gJy4nKSBpLS07XG4gICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgKyAxKSArIHMuc2xpY2Uoaik7XG4gICAgICAgIGkgPSBzLmxlbmd0aDtcbiAgICAgICAgaWYgKHMuY2hhckF0KGkgLSAzKSA9PSAnZScpXG4gICAgICAgICAgcyA9IHMuc2xpY2UgKDAsIGkgLSAxKSArICcwJyArIHMuc2xpY2UgKGkgLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcCA9IHByZWM7XG4gICAgICAgIGlmIChleHAgPCAwKSB7IHAgLT0gZXhwICsgMTsgcyA9IHgudG9GaXhlZChwKTsgfVxuICAgICAgICBlbHNlIHdoaWxlIChzID0geC50b0ZpeGVkKHApLCBzLmxlbmd0aCA+IHByZWMgKyAxKSBwLS07XG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHplcm9lc1xuICAgICAgICAgIHZhciBpID0gcy5sZW5ndGggLSAxOyB3aGlsZSAocy5jaGFyQXQoaSkgPT0gJzAnKSBpLS07XG4gICAgICAgICAgaWYgKHMuY2hhckF0KGkpID09ICcuJykgaS0tO1xuICAgICAgICAgIHMgPSBzLnNsaWNlKDAsIGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICByZXR1cm4gY2FtbF9maW5pc2hfZm9ybWF0dGluZyhmLCBzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9mbG9hdF9vZl9zdHJpbmcocykge1xuICB2YXIgcmVzO1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKVxuICByZXMgPSArcztcbiAgaWYgKChzLmxlbmd0aCA+IDApICYmIChyZXMgPT09IHJlcykpIHJldHVybiByZXM7XG4gIHMgPSBzLnJlcGxhY2UoL18vZyxcIlwiKTtcbiAgcmVzID0gK3M7XG4gIGlmICgoKHMubGVuZ3RoID4gMCkgJiYgKHJlcyA9PT0gcmVzKSkgfHwgL15bKy1dP25hbiQvaS50ZXN0KHMpKSByZXR1cm4gcmVzO1xuICB2YXIgbSA9IC9eICooWystXT8pMHgoWzAtOWEtZl0rKVxcLj8oWzAtOWEtZl0qKShwKFsrLV0/WzAtOV0rKSk/L2kuZXhlYyhzKTtcbiAgLy8gICAgICAgICAgMSAgICAgICAgMiAgICAgICAgICAgICAzICAgICAgICAgICA1XG4gIGlmKG0pe1xuICAgIHZhciBtMyA9IG1bM10ucmVwbGFjZSgvMCskLywnJyk7XG4gICAgdmFyIG1hbnRpc3NhID0gcGFyc2VJbnQobVsxXSArIG1bMl0gKyBtMywgMTYpO1xuICAgIHZhciBleHBvbmVudCA9IChtWzVdfDApIC0gNCptMy5sZW5ndGg7XG4gICAgcmVzID0gbWFudGlzc2EgKiBNYXRoLnBvdygyLCBleHBvbmVudCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZigvXlxcKz9pbmYoaW5pdHkpPyQvaS50ZXN0KHMpKSByZXR1cm4gSW5maW5pdHk7XG4gIGlmKC9eLWluZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiAtSW5maW5pdHk7XG4gIGNhbWxfZmFpbHdpdGgoXCJmbG9hdF9vZl9zdHJpbmdcIik7XG59XG4iLCIvKlxuVG8gZGVhbCB3aXRoIGVmZmVjdHMsIHRoZSBleGVjdXRpb24gY29udGV4dCBpcyBpbnR1aXRpdmVseSBjb21wb3NlZCBvZlxuYSBzdGFjayBvZiBmaWJlcnMuIEVhY2ggZmliZXIgaGFzIGEgY3VycmVudCBsb3ctbGV2ZWwgY29udGludWF0aW9uXG4ob25lLWFyZ3VtZW50IEphdmFTY3JpcHQgZnVuY3Rpb24pLCBhIHN0YWNrIG9mIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmRcbmEgdHJpcGxlIG9mIGhhbmRsZXJzLCB3aGljaCBhcmUgaW52b2tlZCB3aGVuIHRoZSBmaWJlciB0ZXJtaW5hdGVzXG4oZWl0aGVyIHdpdGggYSB2YWx1ZSBvciBhbiBleGNlcHRpb24pIG9yIHdoZW4gYW4gZWZmZWN0IGlzIHBlcmZvcm1lZC5cblRoZSBsb3ctbGV2ZWwgY29udGludWF0aW9uIG9mIHRoZSB0b3Btb3N0IGZpYmVyICh3aGljaCBpcyBjdXJyZW50bHlcbmV4ZWN1dGluZykgaXMgcGFzc2VkIGZyb20gZnVuY3Rpb24gdG8gZnVuY3Rpb24gYXMgYW4gYWRkaXRpb25hbFxuYXJndW1lbnQuIEl0cyBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgaXMgc3RvcmVkIGluXG5bY2FtbF9leG5fc3RhY2tdLiBFeGNlcHRpb24gaGFuZGxlcnMgYXJlIHB1c2hlZCBpbnRvIHRoaXMgc3RhY2sgd2hlblxuZW50ZXJpbmcgYSBbdHJ5IC4uLiB3aXRoIC4uLl0gYW5kIHBvcHBlZCBvbiBleGl0LiBUaGVuLCBoYW5kbGVycyBhbmRcbnRoZSByZW1haW5pbmcgZmliZXJzIGFyZSBzdG9yZWQgaW4gW2NhbWxfZmliZXJfc3RhY2tdLiBUbyBpbnN0YWxsIGFuXG5lZmZlY3QgaGFuZGxlciwgd2UgcHVzaCBhIG5ldyBmaWJlciBpbnRvIHRoZSBleGVjdXRpb24gY29udGV4dC5cblxuV2UgaGF2ZSBiYXNpY2FsbHkgdGhlIGZvbGxvd2luZyB0eXBlIGZvciByZWlmaWVkIGNvbnRpbnVhdGlvbnMgKHR5cGVcbltjb250aW51YXRpb25dIGluIG1vZHVsZSBbRWZmZWN0XSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSk6XG5cbiAgdHlwZSAoJ2EsICdiKSBjb250aW51YXRpb24gPSAoJ2EsICdiKSBzdGFjayByZWZcblxuICBhbmQgKF8sIF8pIHN0YWNrID1cbiAgICAgIENvbnMgOiAoJ2IgLT4gdW5pdCkgKiAgICAgICAgICAgICAoKiBsb3ctbGV2ZWwgY29udGludWF0aW9uICopXG4gICAgICAgICAgICAgKGV4biAtPiB1bml0KSBsaXN0ICogICAgICAgKCogZXhjZXB0aW9uIGhhbmRsZXJzICopXG4gICAgICAgICAgICAgKCdiLCAnYykgaGFuZGxlciAqXG4gICAgICAgICAgICAgKCdhLCAnYikgc3RhY2tcbiAgICAgICAgICAgICAtPiAoJ2EsICdjKSBzdGFja1xuICAgIHwgRW1wdHkgOiAoJ2EsICdhKSBzdGFja1xuXG4gIGFuZCAoJ2EsJ2IpIGhhbmRsZXIgPSAgICgqIEFzIGluIG1vZHVsZSBFZmZlY3QgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSAqKVxuICAgIHsgcmV0YzogJ2EgLT4gJ2I7XG4gICAgICBleG5jOiBleG4gLT4gJ2I7XG4gICAgICBlZmZjOiAnYy4nYyBFZmZlY3QudCAtPiAoKCdjLCdiKSBjb250aW51YXRpb24gLT4gJ2IpIG9wdGlvbiB9XG5cbkNvbnRpbnVhdGlvbnMgYXJlIG9uZS1zaG90LiBBIGNvbnRpbnVhdGlvbiBbcmVmIEVtcHR5XSBoYXMgYWxyZWFkeVxuYmVlbiByZXN1bWVkLlxuXG5BIGNvbnRpbnVhdGlvbiBpcyBiYXNpY2FsbHkgY29tcG9zZWQgb2YgYSBsaXN0IG9mIGZpYmVycywgd2hpY2ggZWFjaFxuaGFzIGl0cyBsb3ctbGV2ZWwgY29udGludWF0aW9uLCBpdHMgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZCBhXG50cmlwbGUgb2YgaGFuZGxlcnMgdG8gZGVhbCB3aXRoIHdoZW4gdGhlIGZpYmVyIHRlcm1pbmF0ZXMgb3IgYW5cbmVmZmVjdCBpcyBwZXJmb3JtZWQuIFdoZW4gcmVzdW1pbmcgYSBjb250aW51YXRpb24sIHRoZSBpbm5lcm1vc3QgZmliZXJcbmlzIHJlc3VtZWQgZmlyc3QuXG5cblRoZSBoYW5kbGVycyBhcmUgQ1BTLXRyYW5zZm9ybWVkIGZ1bmN0aW9uczogdGhleSBhY3R1YWxseSB0YWtlIGFuXG5hZGRpdGlvbmFsIHBhcmFtZXRlciB3aGljaCBpcyB0aGUgY3VycmVudCBsb3ctbGV2ZWwgY29udGludWF0aW9uLlxuKi9cblxuLy9Qcm92aWRlczogY2FtbF9leG5fc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vIFRoaXMgaXMgYW4gT0NhbWwgbGlzdCBvZiBleGNlcHRpb24gaGFuZGxlcnNcbnZhciBjYW1sX2V4bl9zdGFjayA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfcHVzaF90cmFwXG4vL1JlcXVpcmVzOiBjYW1sX2V4bl9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wdXNoX3RyYXAoaGFuZGxlcikge1xuICBjYW1sX2V4bl9zdGFjaz1bMCxoYW5kbGVyLGNhbWxfZXhuX3N0YWNrXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3BfdHJhcFxuLy9SZXF1aXJlczogY2FtbF9leG5fc3RhY2tcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfcG9wX3RyYXAoKSB7XG4gIGlmICghY2FtbF9leG5fc3RhY2spIHJldHVybiBmdW5jdGlvbih4KXt0aHJvdyB4O31cbiAgdmFyIGggPSBjYW1sX2V4bl9zdGFja1sxXTtcbiAgY2FtbF9leG5fc3RhY2s9Y2FtbF9leG5fc3RhY2tbMl07XG4gIHJldHVybiBoXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmliZXJfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbi8vIFRoaXMgaGFzIHRoZSBzaGFwZSB7aCwgcjp7aywgeCwgZX19IHdoZXJlIGggaXMgYSB0cmlwbGUgb2YgaGFuZGxlcnNcbi8vIChzZWUgZWZmZWN0LmpzKSBhbmQgaywgeCBhbmQgZSBhcmUgdGhlIHNhdmVkIGNvbnRpbnVhdGlvbixcbi8vIGV4Y2VwdGlvbiBzdGFjayBhbmQgZmliZXIgc3RhY2sgb2YgdGhlIHBhcmVudCBmaWJlci5cbnZhciBjYW1sX2ZpYmVyX3N0YWNrO1xuXG4vL1Byb3ZpZGVzOmNhbWxfcmVzdW1lX3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2V4bl9zdGFjaywgY2FtbF9maWJlcl9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9yZXN1bWVfc3RhY2soc3RhY2ssIGspIHtcbiAgaWYgKCFzdGFjaykgY2FtbF9yYWlzZV9jb25zdGFudFxuICAgICAgICAgICAgICAgICAoY2FtbF9uYW1lZF92YWx1ZShcIkVmZmVjdC5Db250aW51YXRpb25fYWxyZWFkeV9yZXN1bWVkXCIpKTtcbiAgLy8gVXBkYXRlIHRoZSBleGVjdXRpb24gY29udGV4dCB3aXRoIHRoZSBzdGFjayBvZiBmaWJlcnMgaW4gW3N0YWNrXSBpblxuICAvLyBvcmRlciB0byByZXN1bWUgdGhlIGNvbnRpbnVhdGlvblxuICBkbyB7XG4gICAgY2FtbF9maWJlcl9zdGFjayA9XG4gICAgICB7aDpzdGFja1szXSwgcjp7azprLCB4OmNhbWxfZXhuX3N0YWNrLCBlOmNhbWxfZmliZXJfc3RhY2t9fTtcbiAgICBrID0gc3RhY2tbMV07XG4gICAgY2FtbF9leG5fc3RhY2sgPSBzdGFja1syXTtcbiAgICBzdGFjayA9IHN0YWNrWzRdO1xuICB9IHdoaWxlIChzdGFjaylcbiAgcmV0dXJuIGs7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9wX2ZpYmVyXG4vL1JlcXVpcmVzOiBjYW1sX2V4bl9zdGFjaywgY2FtbF9maWJlcl9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wb3BfZmliZXIoKSB7XG4gIC8vIE1vdmUgdG8gdGhlIHBhcmVudCBmaWJlciwgcmV0dXJuaW5nIHRoZSBwYXJlbnQncyBsb3ctbGV2ZWwgY29udGludWF0aW9uXG4gIHZhciByZW0gPSBjYW1sX2ZpYmVyX3N0YWNrLnI7XG4gIGNhbWxfZXhuX3N0YWNrID0gcmVtLng7XG4gIGNhbWxfZmliZXJfc3RhY2sgPSByZW0uZTtcbiAgcmV0dXJuIHJlbS5rO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BlcmZvcm1fZWZmZWN0XG4vL1JlcXVpcmVzOiBjYW1sX3BvcF9maWJlciwgY2FtbF9zdGFja19jaGVja19kZXB0aCwgY2FtbF90cmFtcG9saW5lX3JldHVybiwgY2FtbF9leG5fc3RhY2ssIGNhbWxfZmliZXJfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfcGVyZm9ybV9lZmZlY3QoZWZmLCBjb250LCBrMCkge1xuICAvLyBBbGxvY2F0ZSBhIGNvbnRpbnVhdGlvbiBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lXG4gIGlmICghY29udCkgY29udCA9IFsyNDUgLypjb250aW51YXRpb24qLywgMF07XG4gIC8vIEdldCBjdXJyZW50IGVmZmVjdCBoYW5kbGVyXG4gIHZhciBoYW5kbGVyID0gY2FtbF9maWJlcl9zdGFjay5oWzNdO1xuICAvLyBDb25zIHRoZSBjdXJyZW50IGZpYmVyIG9udG8gdGhlIGNvbnRpbnVhdGlvbjpcbiAgLy8gICBjb250IDo9IENvbnMgKGssIGV4bl9zdGFjaywgaGFuZGxlcnMsICFjb250KVxuICBjb250WzFdID0gWzAsazAsY2FtbF9leG5fc3RhY2ssY2FtbF9maWJlcl9zdGFjay5oLGNvbnRbMV1dO1xuICAvLyBNb3ZlIHRvIHBhcmVudCBmaWJlciBhbmQgZXhlY3V0ZSB0aGUgZWZmZWN0IGhhbmRsZXIgdGhlcmVcbiAgLy8gVGhlIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiBTdGRsaWIuRWZmZWN0LCBzbyB3ZSBrbm93IHRoYXQgdGhlIGFyaXR5IG1hdGNoZXNcbiAgdmFyIGsxID0gY2FtbF9wb3BfZmliZXIoKTtcbiAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKT9oYW5kbGVyKGVmZixjb250LGsxLGsxKVxuICAgICAgICAgOmNhbWxfdHJhbXBvbGluZV9yZXR1cm4oaGFuZGxlcixbZWZmLGNvbnQsazEsazFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfZmliZXJfc3RhY2ssIGNhbWxfY2FsbF9nZW4sIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfYWxsb2Nfc3RhY2soaHYsIGh4LCBoZikge1xuICBmdW5jdGlvbiBjYWxsKGksIHgpIHtcbiAgICB2YXIgZj1jYW1sX2ZpYmVyX3N0YWNrLmhbaV07XG4gICAgdmFyIGFyZ3MgPSBbeCwgY2FtbF9wb3BfZmliZXIoKV07XG4gICAgcmV0dXJuIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKT9jYW1sX2NhbGxfZ2VuKGYsYXJncylcbiAgICAgICAgICAgOmNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZixhcmdzKTtcbiAgfVxuICBmdW5jdGlvbiBodmFsKHgpIHtcbiAgICAvLyBDYWxsIFtodl0gaW4gdGhlIHBhcmVudCBmaWJlclxuICAgIHJldHVybiBjYWxsKDEsIHgpO1xuICB9XG4gIGZ1bmN0aW9uIGhleG4oZSkge1xuICAgIC8vIENhbGwgW2h4XSBpbiB0aGUgcGFyZW50IGZpYmVyXG4gICAgcmV0dXJuIGNhbGwoMiwgZSk7XG4gIH1cbiAgcmV0dXJuIFswLCBodmFsLCBbMCwgaGV4biwgMF0sIFswLCBodiwgaHgsIGhmXSwgMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYWxsb2Nfc3RhY2tcbi8vSWY6ICFlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrKGh2LCBoeCwgaGYpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuZnVuY3Rpb24gY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjKGNvbnQpIHtcbiAgdmFyIHN0YWNrPWNvbnRbMV07XG4gIGNvbnRbMV09MDtcbiAgcmV0dXJuIHN0YWNrO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnRpbnVhdGlvbl91c2VfYW5kX3VwZGF0ZV9oYW5kbGVyX25vZXhjXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGNcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGMoY29udCwgaHZhbCwgaGV4biwgaGVmZikge1xuICB2YXIgc3RhY2sgPSBjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGMoY29udCk7XG4gIHN0YWNrWzNdID0gWzAsIGh2YWwsIGhleG4sIGhlZmZdO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcbmZ1bmN0aW9uIGNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2sgKCkgeyByZXR1cm4gWzBdOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX25ld1xuZnVuY3Rpb24gY2FtbF9tbF9jb25kaXRpb25fbmV3KHVuaXQpe1xuICAgIHJldHVybiB7Y29uZGl0aW9uOjF9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl93YWl0XG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl93YWl0KHQsbXV0ZXh0KXtcbiAgICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jb25kaXRpb25fYnJvYWRjYXN0XG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3QodCl7XG4gICAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbFxuZnVuY3Rpb24gY2FtbF9tbF9jb25kaXRpb25fc2lnbmFsKHQpe1xuICAgIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyFJZjogZWZmZWN0c1xuZnVuY3Rpb24ganNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZCgpe1xuICBjYW1sX2ZhaWx3aXRoKFwiRWZmZWN0IGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkXCIpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIGZzX25vZGVfc3VwcG9ydGVkICgpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzICE9PSAndW5kZWZpbmVkJ1xuICAgICAgJiYgdHlwZW9mIGdsb2JhbFRoaXMucHJvY2Vzcy52ZXJzaW9ucyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICYmIHR5cGVvZiBnbG9iYWxUaGlzLnByb2Nlc3MudmVyc2lvbnMubm9kZSAhPT0gJ3VuZGVmaW5lZCcpXG59XG4vL1Byb3ZpZGVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gZnNfbm9kZV9zdXBwb3J0ZWQgKCkge1xuICByZXR1cm4gZmFsc2Vcbn1cblxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vUmVxdWlyZXM6IE1sTm9kZUZkLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9yYWlzZV93aXRoX2FyZ3Ncbi8vUmVxdWlyZXM6IG1ha2VfdW5peF9lcnJfYXJncywgY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIE1sTm9kZURldmljZShyb290KSB7XG4gIHRoaXMuZnMgPSByZXF1aXJlKCdmcycpO1xuICB0aGlzLnJvb3QgPSByb290O1xufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5ubSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuICh0aGlzLnJvb3QgKyBuYW1lKTtcbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuZXhpc3RzID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLmV4aXN0c1N5bmModGhpcy5ubShuYW1lKSk/MTowO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5pc0ZpbGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMuc3RhdFN5bmModGhpcy5ubShuYW1lKSkuaXNGaWxlKCk/MTowO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUubWtkaXIgPSBmdW5jdGlvbihuYW1lLCBtb2RlLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5ta2RpclN5bmModGhpcy5ubShuYW1lKSx7bW9kZTptb2RlfSk7XG4gICAgcmV0dXJuIDBcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5ybWRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnJtZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICByZXR1cm4gMFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJlYWRkaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMucmVhZGRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuaXNfZGlyID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRGlyZWN0b3J5KCk/MTowO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUudW5saW5rID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBiID0gdGhpcy5mcy5leGlzdHNTeW5jKHRoaXMubm0obmFtZSkpPzE6MDtcbiAgICB0aGlzLmZzLnVubGlua1N5bmModGhpcy5ubShuYW1lKSk7XG4gICAgcmV0dXJuIGI7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG5hbWUsIGYsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIGNvbnN0cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpO1xuICB2YXIgcmVzID0gMDtcbiAgZm9yKHZhciBrZXkgaW4gZil7XG4gICAgc3dpdGNoKGtleSl7XG4gICAgY2FzZSBcInJkb25seVwiICA6IHJlcyB8PSBjb25zdHMuT19SRE9OTFk7IGJyZWFrO1xuICAgIGNhc2UgXCJ3cm9ubHlcIiAgOiByZXMgfD0gY29uc3RzLk9fV1JPTkxZOyBicmVhaztcbiAgICBjYXNlIFwiYXBwZW5kXCIgIDpcbiAgICAgIHJlcyB8PSBjb25zdHMuT19XUk9OTFkgfCBjb25zdHMuT19BUFBFTkQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiY3JlYXRlXCIgICA6IHJlcyB8PSBjb25zdHMuT19DUkVBVDsgICAgYnJlYWs7XG4gICAgY2FzZSBcInRydW5jYXRlXCIgOiByZXMgfD0gY29uc3RzLk9fVFJVTkM7ICAgIGJyZWFrO1xuICAgIGNhc2UgXCJleGNsXCIgICAgIDogcmVzIHw9IGNvbnN0cy5PX0VYQ0w7ICAgICBicmVhaztcbiAgICBjYXNlIFwiYmluYXJ5XCIgICA6IHJlcyB8PSBjb25zdHMuT19CSU5BUlk7ICAgYnJlYWs7XG4gICAgY2FzZSBcInRleHRcIiAgICAgOiByZXMgfD0gY29uc3RzLk9fVEVYVDsgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJub25ibG9ja1wiIDogcmVzIHw9IGNvbnN0cy5PX05PTkJMT0NLOyBicmVhaztcbiAgICB9XG4gIH1cbiAgdHJ5IHtcbiAgICB2YXIgZmQgPSB0aGlzLmZzLm9wZW5TeW5jKHRoaXMubm0obmFtZSksIHJlcyk7XG4gICAgdmFyIGlzQ2hhcmFjdGVyRGV2aWNlID0gdGhpcy5mcy5sc3RhdFN5bmModGhpcy5ubShuYW1lKSkuaXNDaGFyYWN0ZXJEZXZpY2UoKTtcbiAgICBmLmlzQ2hhcmFjdGVyRGV2aWNlID0gaXNDaGFyYWN0ZXJEZXZpY2U7XG4gICAgcmV0dXJuIG5ldyBNbE5vZGVGZChmZCwgZik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cblxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5yZW5hbWUgPSBmdW5jdGlvbihvLCBuLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5yZW5hbWVTeW5jKHRoaXMubm0obyksIHRoaXMubm0obikpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnN0YXQgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0c19mcm9tX2pzKGpzX3N0YXRzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5sc3RhdCA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLmxzdGF0U3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICByZXR1cm4gdGhpcy5zdGF0c19mcm9tX2pzKGpzX3N0YXRzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5zeW1saW5rID0gZnVuY3Rpb24odG9fZGlyLCB0YXJnZXQsIHBhdGgsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnN5bWxpbmtTeW5jKHRoaXMubm0odGFyZ2V0KSwgdGhpcy5ubShwYXRoKSwgdG9fZGlyID8gJ2RpcicgOiAnZmlsZScpO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJlYWRsaW5rID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBsaW5rID0gdGhpcy5mcy5yZWFkbGlua1N5bmModGhpcy5ubShuYW1lKSwgJ3V0ZjgnKTtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcobGluayk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUub3BlbmRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5vcGVuZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5yYWlzZV9ub2RlanNfZXJyb3IgPSBmdW5jdGlvbihlcnIsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKFwiVW5peC5Vbml4X2Vycm9yXCIpO1xuICBpZiAocmFpc2VfdW5peCAmJiB1bml4X2Vycm9yKSB7XG4gICAgdmFyIGFyZ3MgPSBtYWtlX3VuaXhfZXJyX2FyZ3MoZXJyLmNvZGUsIGVyci5zeXNjYWxsLCBlcnIucGF0aCwgZXJyLmVycm5vKTtcbiAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuc3RhdHNfZnJvbV9qcyA9IGZ1bmN0aW9uKGpzX3N0YXRzKSB7XG4gIC8qID09PVVuaXguZmlsZV9raW5kPT09XG4gICAqIHR5cGUgZmlsZV9raW5kID1cbiAgICogICAgIFNfUkVHICAgICAgICAgICAgICAgICAgICAgICAoKiogUmVndWxhciBmaWxlICopXG4gICAqICAgfCBTX0RJUiAgICAgICAgICAgICAgICAgICAgICAgKCoqIERpcmVjdG9yeSAqKVxuICAgKiAgIHwgU19DSFIgICAgICAgICAgICAgICAgICAgICAgICgqKiBDaGFyYWN0ZXIgZGV2aWNlICopXG4gICAqICAgfCBTX0JMSyAgICAgICAgICAgICAgICAgICAgICAgKCoqIEJsb2NrIGRldmljZSAqKVxuICAgKiAgIHwgU19MTksgICAgICAgICAgICAgICAgICAgICAgICgqKiBTeW1ib2xpYyBsaW5rICopXG4gICAqICAgfCBTX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgKCoqIE5hbWVkIHBpcGUgKilcbiAgICogICB8IFNfU09DSyAgICAgICAgICAgICAgICAgICAgICAoKiogU29ja2V0ICopXG4gICAqL1xuICB2YXIgZmlsZV9raW5kO1xuICBpZiAoanNfc3RhdHMuaXNGaWxlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAwO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICBmaWxlX2tpbmQgPSAxO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzQ2hhcmFjdGVyRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAyO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzQmxvY2tEZXZpY2UoKSkge1xuICAgIGZpbGVfa2luZCA9IDM7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgIGZpbGVfa2luZCA9IDQ7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNGSUZPKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA1O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU29ja2V0KCkpIHtcbiAgICBmaWxlX2tpbmQgPSA2O1xuICB9XG4gIC8qID09PVVuaXguc3RhdHM9PT1cbiAgICogdHlwZSBzdGF0cyA9XG4gICAqICB7IHN0X2RldiA6IGludDsgICAgICAgICAgICAgICAoKiogRGV2aWNlIG51bWJlciAqKVxuICAgKiAgICBzdF9pbm8gOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIElub2RlIG51bWJlciAqKVxuICAgKiAgICBzdF9raW5kIDogZmlsZV9raW5kOyAgICAgICAgKCoqIEtpbmQgb2YgdGhlIGZpbGUgKilcbiAgICogICAgc3RfcGVybSA6IGZpbGVfcGVybTsgICAgICAgICgqKiBBY2Nlc3MgcmlnaHRzICopXG4gICAqICAgIHN0X25saW5rIDogaW50OyAgICAgICAgICAgICAoKiogTnVtYmVyIG9mIGxpbmtzICopXG4gICAqICAgIHN0X3VpZCA6IGludDsgICAgICAgICAgICAgICAoKiogVXNlciBpZCBvZiB0aGUgb3duZXIgKilcbiAgICogICAgc3RfZ2lkIDogaW50OyAgICAgICAgICAgICAgICgqKiBHcm91cCBJRCBvZiB0aGUgZmlsZSdzIGdyb3VwICopXG4gICAqICAgIHN0X3JkZXYgOiBpbnQ7ICAgICAgICAgICAgICAoKiogRGV2aWNlIElEIChpZiBzcGVjaWFsIGZpbGUpICopXG4gICAqICAgIHN0X3NpemUgOiBpbnQ7ICAgICAgICAgICAgICAoKiogU2l6ZSBpbiBieXRlcyAqKVxuICAgKiAgICBzdF9hdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3QgYWNjZXNzIHRpbWUgKilcbiAgICogICAgc3RfbXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lICopXG4gICAqICAgIHN0X2N0aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBzdGF0dXMgY2hhbmdlIHRpbWUgKilcbiAgICogIH1cbiAgICovXG4gIHJldHVybiBCTE9DSyhcbiAgICAwLFxuICAgIGpzX3N0YXRzLmRldixcbiAgICBqc19zdGF0cy5pbm8sXG4gICAgZmlsZV9raW5kLFxuICAgIGpzX3N0YXRzLm1vZGUsXG4gICAganNfc3RhdHMubmxpbmssXG4gICAganNfc3RhdHMudWlkLFxuICAgIGpzX3N0YXRzLmdpZCxcbiAgICBqc19zdGF0cy5yZGV2LFxuICAgIGpzX3N0YXRzLnNpemUsXG4gICAganNfc3RhdHMuYXRpbWVNcyxcbiAgICBqc19zdGF0cy5tdGltZU1zLFxuICAgIGpzX3N0YXRzLmN0aW1lTXNcbiAgKTtcbn1cblxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sTm9kZURldmljZVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVEZXZpY2Vcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIE1sTm9kZURldmljZSgpIHtcbn1cblxuLy9Qcm92aWRlczogTWxOb2RlRmRcbi8vUmVxdWlyZXM6IE1sRmlsZSwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfYnl0ZXNfc2V0LCBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gTWxOb2RlRmQoZmQsIGZsYWdzKXtcbiAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHRoaXMuZmQgPSBmZDtcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xufVxuTWxOb2RlRmQucHJvdG90eXBlID0gbmV3IE1sRmlsZSAoKTtcbk1sTm9kZUZkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sTm9kZUZkO1xuXG5NbE5vZGVGZC5wcm90b3R5cGUudHJ1bmNhdGUgPSBmdW5jdGlvbihsZW4pe1xuICB0cnkge1xuICAgIHRoaXMuZnMuZnRydW5jYXRlU3luYyh0aGlzLmZkLGxlbnwwKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVGZC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLmZzdGF0U3luYyh0aGlzLmZkKS5zaXplO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZUZkLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG9mZnNldCxidWYsYnVmX29mZnNldCxsZW4pe1xuICB0cnkge1xuICAgIGlmKHRoaXMuZmxhZ3MuaXNDaGFyYWN0ZXJEZXZpY2UpXG4gICAgICB0aGlzLmZzLndyaXRlU3luYyh0aGlzLmZkLCBidWYsIGJ1Zl9vZmZzZXQsIGxlbik7XG4gICAgZWxzZVxuICAgICAgdGhpcy5mcy53cml0ZVN5bmModGhpcy5mZCwgYnVmLCBidWZfb2Zmc2V0LCBsZW4sIG9mZnNldCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbk1sTm9kZUZkLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24ob2Zmc2V0LGEsYnVmX29mZnNldCxsZW4pe1xuICB0cnkge1xuICAgIGlmKHRoaXMuZmxhZ3MuaXNDaGFyYWN0ZXJEZXZpY2UpXG4gICAgICB2YXIgcmVhZCA9IHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYSwgYnVmX29mZnNldCwgbGVuKTtcbiAgICBlbHNlXG4gICAgICB2YXIgcmVhZCA9IHRoaXMuZnMucmVhZFN5bmModGhpcy5mZCwgYSwgYnVmX29mZnNldCwgbGVuLCBvZmZzZXQpO1xuICAgIHJldHVybiByZWFkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZUZkLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCl7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5jbG9zZVN5bmModGhpcy5mZCk7XG4gICAgcmV0dXJuIDBcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5cblxuLy9Qcm92aWRlczogTWxOb2RlRmRcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIE1sTm9kZUZkKCl7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuLy9SZXF1aXJlczogTWxOb2RlRmRcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoZmQsIGZsYWdzKXtcbiAgaWYoZmxhZ3MubmFtZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gICAgICB2YXIgZmQyID0gZnMub3BlblN5bmMoZmxhZ3MubmFtZSwgXCJyc1wiKTtcbiAgICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQyLCBmbGFncyk7XG4gICAgfSBjYXRjaChlKSB7ICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBNbE5vZGVGZChmZCwgZmxhZ3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlKGZkLCBmbGFncyl7XG4gIHJldHVybiBudWxsO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBEdW1teSBmaWxlc3lzdGVtXG5cbi8vUHJvdmlkZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2hcbmZ1bmN0aW9uIGNhbWxfdHJhaWxpbmdfc2xhc2gobmFtZSl7XG4gIHJldHVybiAobmFtZS5zbGljZSgtMSkgIT09IFwiL1wiKSA/IChuYW1lICsgXCIvXCIpIDogbmFtZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmlmKGZzX25vZGVfc3VwcG9ydGVkICgpICYmIGdsb2JhbFRoaXMucHJvY2VzcyAmJiBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKVxuICB2YXIgY2FtbF9jdXJyZW50X2RpciA9IGdsb2JhbFRoaXMucHJvY2Vzcy5jd2QoKS5yZXBsYWNlKC9cXFxcL2csJy8nKTtcbmVsc2VcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSAgXCIvc3RhdGljXCI7XG5jYW1sX2N1cnJlbnRfZGlyID0gY2FtbF90cmFpbGluZ19zbGFzaChjYW1sX2N1cnJlbnRfZGlyKTtcblxuLy9Qcm92aWRlczogY2FtbF9nZXRfcm9vdFxuLy9SZXF1aXJlczogcGF0aF9pc19hYnNvbHV0ZVxuZnVuY3Rpb24gY2FtbF9nZXRfcm9vdChwYXRoKXtcbiAgdmFyIHggPSBwYXRoX2lzX2Fic29sdXRlKHBhdGgpO1xuICBpZiAoIXgpIHJldHVybjtcbiAgcmV0dXJuIHhbMF0gKyBcIi9cIn1cblxuLy9Qcm92aWRlczogY2FtbF9yb290XG4vL1JlcXVpcmVzOiBjYW1sX2dldF9yb290LCBjYW1sX2N1cnJlbnRfZGlyLCBjYW1sX2ZhaWx3aXRoXG52YXIgY2FtbF9yb290ID0gY2FtbF9nZXRfcm9vdChjYW1sX2N1cnJlbnRfZGlyKSB8fCBjYW1sX2ZhaWx3aXRoKFwidW5hYmxlIHRvIGNvbXB1dGUgY2FtbF9yb290XCIpO1xuXG5cbi8vUHJvdmlkZXM6IE1sRmlsZVxuZnVuY3Rpb24gTWxGaWxlKCl7ICB9XG5cbi8vUHJvdmlkZXM6IHBhdGhfaXNfYWJzb2x1dGVcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiBtYWtlX3BhdGhfaXNfYWJzb2x1dGUoKSB7XG4gIGZ1bmN0aW9uIHBvc2l4KHBhdGgpIHtcbiAgICBpZiAocGF0aC5jaGFyQXQoMCkgPT09ICcvJykgcmV0dXJuIFtcIlwiLCBwYXRoLnN1YnN0cmluZygxKV07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZnVuY3Rpb24gd2luMzIocGF0aCkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iL2IzZmNjMjQ1ZmIyNTUzOTkwOWVmMWQ1ZWFhMDFkYmY5MmUxNjg2MzMvbGliL3BhdGguanMjTDU2XG4gICAgdmFyIHNwbGl0RGV2aWNlUmUgPSAvXihbYS16QS1aXTp8W1xcXFwvXXsyfVteXFxcXC9dK1tcXFxcL10rW15cXFxcL10rKT8oW1xcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG4gICAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhwYXRoKTtcbiAgICB2YXIgZGV2aWNlID0gcmVzdWx0WzFdIHx8ICcnO1xuICAgIHZhciBpc1VuYyA9IEJvb2xlYW4oZGV2aWNlICYmIGRldmljZS5jaGFyQXQoMSkgIT09ICc6Jyk7XG5cbiAgICAvLyBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZVxuICAgIGlmIChCb29sZWFuKHJlc3VsdFsyXSB8fCBpc1VuYykpIHtcbiAgICAgIHZhciByb290ID0gKHJlc3VsdFsxXSB8fCAnJyk7XG4gICAgICB2YXIgc2VwID0gKHJlc3VsdFsyXSB8fCAnJyk7XG4gICAgICByZXR1cm4gW3Jvb3QsIHBhdGguc3Vic3RyaW5nKHJvb3QubGVuZ3RoICsgc2VwLmxlbmd0aCldXG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBpZihmc19ub2RlX3N1cHBvcnRlZCAoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLnBsYXRmb3JtKSB7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyIDogcG9zaXg7XG4gIH1cbiAgZWxzZSByZXR1cm4gcG9zaXhcbn1cbnZhciBwYXRoX2lzX2Fic29sdXRlID0gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV9wYXRoXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfZGlyXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZywgcGF0aF9pc19hYnNvbHV0ZVxuZnVuY3Rpb24gY2FtbF9tYWtlX3BhdGggKG5hbWUpIHtcbiAgbmFtZT1jYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lKTtcbiAgaWYoICFwYXRoX2lzX2Fic29sdXRlKG5hbWUpIClcbiAgICBuYW1lID0gY2FtbF9jdXJyZW50X2RpciArIG5hbWU7XG4gIHZhciBjb21wMCA9IHBhdGhfaXNfYWJzb2x1dGUobmFtZSk7XG4gIHZhciBjb21wID0gY29tcDBbMV0uc3BsaXQoXCIvXCIpO1xuICB2YXIgbmNvbXAgPSBbXVxuICBmb3IodmFyIGkgPSAwOyBpPGNvbXAubGVuZ3RoOyBpKyspe1xuICAgIHN3aXRjaChjb21wW2ldKXtcbiAgICBjYXNlIFwiLi5cIjogaWYobmNvbXAubGVuZ3RoPjEpIG5jb21wLnBvcCgpOyBicmVhaztcbiAgICBjYXNlIFwiLlwiOiBicmVhaztcbiAgICBjYXNlIFwiXCI6IGJyZWFrO1xuICAgIGRlZmF1bHQ6IG5jb21wLnB1c2goY29tcFtpXSk7YnJlYWtcbiAgICB9XG4gIH1cbiAgbmNvbXAudW5zaGlmdChjb21wMFswXSk7XG4gIG5jb21wLm9yaWcgPSBuYW1lO1xuICByZXR1cm4gbmNvbXA7XG59XG5cbi8vUHJvdmlkZXM6anNvb19tb3VudF9wb2ludFxuLy9SZXF1aXJlczogTWxGYWtlRGV2aWNlLCBNbE5vZGVEZXZpY2UsIGNhbWxfcm9vdCwgZnNfbm9kZV9zdXBwb3J0ZWRcbnZhciBqc29vX21vdW50X3BvaW50ID0gW11cbmlmIChmc19ub2RlX3N1cHBvcnRlZCgpKSB7XG4gIGpzb29fbW91bnRfcG9pbnQucHVzaCh7cGF0aDpjYW1sX3Jvb3QsZGV2aWNlOm5ldyBNbE5vZGVEZXZpY2UoY2FtbF9yb290KX0pO1xufSBlbHNlIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOmNhbWxfcm9vdCxkZXZpY2U6bmV3IE1sRmFrZURldmljZShjYW1sX3Jvb3QpfSk7XG59XG5qc29vX21vdW50X3BvaW50LnB1c2goe3BhdGg6XCIvc3RhdGljL1wiLCBkZXZpY2U6bmV3IE1sRmFrZURldmljZShcIi9zdGF0aWMvXCIpfSk7XG5cbi8vUHJvdmlkZXM6Y2FtbF9saXN0X21vdW50X3BvaW50XG4vL1JlcXVpcmVzOiBqc29vX21vdW50X3BvaW50LCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2xpc3RfbW91bnRfcG9pbnQoKXtcbiAgdmFyIHByZXYgPSAwXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKXtcbiAgICB2YXIgb2xkID0gcHJldjtcbiAgICBwcmV2ID0gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoanNvb19tb3VudF9wb2ludFtpXS5wYXRoKSwgb2xkXVxuICB9XG4gIHJldHVybiBwcmV2O1xufVxuXG4vL1Byb3ZpZGVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9tYWtlX3BhdGgsIGpzb29fbW91bnRfcG9pbnQsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX2dldF9yb290LCBNbE5vZGVEZXZpY2UsIGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiByZXNvbHZlX2ZzX2RldmljZShuYW1lKXtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBwYXRoLmpvaW4oXCIvXCIpO1xuICB2YXIgbmFtZV9zbGFzaCA9IGNhbWxfdHJhaWxpbmdfc2xhc2gobmFtZSk7XG4gIHZhciByZXM7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIG0gPSBqc29vX21vdW50X3BvaW50W2ldO1xuICAgIGlmKG5hbWVfc2xhc2guc2VhcmNoKG0ucGF0aCkgPT0gMFxuICAgICAgICYmICghcmVzIHx8IHJlcy5wYXRoLmxlbmd0aCA8IG0ucGF0aC5sZW5ndGgpKVxuICAgICAgcmVzID0ge3BhdGg6bS5wYXRoLGRldmljZTptLmRldmljZSxyZXN0Om5hbWUuc3Vic3RyaW5nKG0ucGF0aC5sZW5ndGgsbmFtZS5sZW5ndGgpfTtcbiAgfVxuICBpZiggIXJlcyAmJiBmc19ub2RlX3N1cHBvcnRlZCgpKSB7XG4gICAgdmFyIHJvb3QgPSBjYW1sX2dldF9yb290KG5hbWUpO1xuICAgIGlmIChyb290ICYmIHJvb3QubWF0Y2goL15bYS16QS1aXTpcXC8kLykpe1xuICAgICAgdmFyIG0gPSB7cGF0aDpyb290LGRldmljZTpuZXcgTWxOb2RlRGV2aWNlKHJvb3QpfTtcbiAgICAgIGpzb29fbW91bnRfcG9pbnQucHVzaChtKTtcbiAgICAgIHJlcyA9IHtwYXRoOm0ucGF0aCxkZXZpY2U6bS5kZXZpY2UscmVzdDpuYW1lLnN1YnN0cmluZyhtLnBhdGgubGVuZ3RoLG5hbWUubGVuZ3RoKX07XG4gICAgfVxuICB9XG4gIGlmKCByZXMgKSByZXR1cm4gcmVzO1xuICBjYW1sX3JhaXNlX3N5c19lcnJvcihcIm5vIGRldmljZSBmb3VuZCBmb3IgXCIgKyBuYW1lX3NsYXNoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tb3VudF9hdXRvbG9hZFxuLy9SZXF1aXJlczogTWxGYWtlRGV2aWNlLCBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF90cmFpbGluZ19zbGFzaFxuZnVuY3Rpb24gY2FtbF9tb3VudF9hdXRvbG9hZChuYW1lLGYpe1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocGF0aC5qb2luKFwiL1wiKSk7XG4gIGpzb29fbW91bnRfcG9pbnQucHVzaCh7cGF0aDpuYW1lLGRldmljZTpuZXcgTWxGYWtlRGV2aWNlKG5hbWUsZil9KVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bm1vdW50XG4vL1JlcXVpcmVzOiBqc29vX21vdW50X3BvaW50LCBjYW1sX21ha2VfcGF0aCwgY2FtbF90cmFpbGluZ19zbGFzaFxuZnVuY3Rpb24gY2FtbF91bm1vdW50KG5hbWUpe1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocGF0aC5qb2luKFwiL1wiKSk7XG4gIHZhciBpZHggPSAtMTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspXG4gICAgaWYoanNvb19tb3VudF9wb2ludFtpXS5wYXRoID09IG5hbWUpIGlkeCA9IGk7XG4gIGlmKGlkeCA+IC0xKSBqc29vX21vdW50X3BvaW50LnNwbGljZShpZHgsMSk7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGN3ZFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0Y3dkKCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhjYW1sX2N1cnJlbnRfZGlyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY2hkaXJcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXIsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfY2hkaXIoZGlyKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UoZGlyKTtcbiAgaWYocm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCkpIHtcbiAgICBpZihyb290LnJlc3QpIGNhbWxfY3VycmVudF9kaXIgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHJvb3QucGF0aCArIHJvb3QucmVzdCk7XG4gICAgZWxzZSBjYW1sX2N1cnJlbnRfZGlyID0gcm9vdC5wYXRoO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGVsc2Uge1xuICAgIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKGNhbWxfanNieXRlc19vZl9zdHJpbmcoZGlyKSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShuYW1lKXtcbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IgKG5hbWUgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub3RfYV9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3JhaXNlX25vdF9hX2RpcihuYW1lKXtcbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IgKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19maWxlX2V4aXN0c1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2ZpbGVfZXhpc3RzIChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJldHVybiByb290LmRldmljZS5leGlzdHMocm9vdC5yZXN0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVhZF9kaXJlY3Rvcnlcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2FfZGlyLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfcmVhZF9kaXJlY3RvcnkobmFtZSl7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBhID0gcm9vdC5kZXZpY2UucmVhZGRpcihyb290LnJlc3QpO1xuICB2YXIgbCA9IG5ldyBBcnJheShhLmxlbmd0aCArIDEpO1xuICBsWzBdID0gMDtcbiAgZm9yKHZhciBpPTA7aTxhLmxlbmd0aDtpKyspXG4gICAgbFtpKzFdID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhhW2ldKTtcbiAgcmV0dXJuIGw7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JlbW92ZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUsIHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N5c19yZW1vdmUobmFtZSl7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBvayA9IHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QpO1xuICBpZihvayA9PSAwKSBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5hbWUpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2lzX2RpcmVjdG9yeShuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGEgPSByb290LmRldmljZS5pc19kaXIocm9vdC5yZXN0KTtcbiAgcmV0dXJuIGE/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZW5hbWVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZW5hbWUobyxuKXtcbiAgdmFyIG9fcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG8pO1xuICB2YXIgbl9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobik7XG4gIGlmKG9fcm9vdC5kZXZpY2UgIT0gbl9yb290LmRldmljZSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zeXNfcmVuYW1lOiBjYW5ub3QgbW92ZSBmaWxlIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW1cIik7XG4gIGlmKCFvX3Jvb3QuZGV2aWNlLnJlbmFtZSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zeXNfcmVuYW1lOiBubyBpbXBsZW1lbnRlZFwiKTtcbiAgb19yb290LmRldmljZS5yZW5hbWUob19yb290LnJlc3QsIG5fcm9vdC5yZXN0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfbWtkaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9zeXNfbWtkaXIobmFtZSwgcGVybSl7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJvb3QuZGV2aWNlLm1rZGlyKHJvb3QucmVzdCxwZXJtKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfcmFpc2Vfbm90X2FfZGlyXG5mdW5jdGlvbiBjYW1sX3N5c19ybWRpcihuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcm9vdC5kZXZpY2Uucm1kaXIocm9vdC5yZXN0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGUodmZkLCBraW5kLCBsYXlvdXQsIHNoYXJlZCwgZGltcywgcG9zKSB7XG4gIC8vIHZhciBkYXRhID0gY2FtbF9zeXNfZmRzW3ZmZF07XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2JhX21hcF9maWxlIG5vdCBpbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9tYXBfZmlsZV9ieXRlY29kZVxuLy9SZXF1aXJlczogY2FtbF9iYV9tYXBfZmlsZVxuZnVuY3Rpb24gY2FtbF9iYV9tYXBfZmlsZV9ieXRlY29kZShhcmd2LGFyZ24pe1xuICByZXR1cm4gY2FtbF9iYV9tYXBfZmlsZShhcmd2WzBdLGFyZ3ZbMV0sYXJndlsyXSxhcmd2WzNdLGFyZ3ZbNF0sYXJndls1XSk7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlX2V4dGVybihuYW1lLGNvbnRlbnQpe1xuICBpZihnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUpXG4gICAgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKG5hbWUsY29udGVudCk7XG4gIGVsc2Uge1xuICAgIGlmKCFnbG9iYWxUaGlzLmNhbWxfZnNfdG1wKSBnbG9iYWxUaGlzLmNhbWxfZnNfdG1wID0gW107XG4gICAgZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcC5wdXNoKHtuYW1lOm5hbWUsY29udGVudDpjb250ZW50fSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZnNfaW5pdFxuLy9SZXF1aXJlczoganNvb19jcmVhdGVfZmlsZVxuZnVuY3Rpb24gY2FtbF9mc19pbml0ICgpe1xuICB2YXIgdG1wPWdsb2JhbFRoaXMuY2FtbF9mc190bXBcbiAgaWYodG1wKXtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKXtcbiAgICAgIGpzb29fY3JlYXRlX2ZpbGUodG1wW2ldLm5hbWUsdG1wW2ldLmNvbnRlbnQpO1xuICAgIH1cbiAgfVxuICBnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUgPSBqc29vX2NyZWF0ZV9maWxlO1xuICBnbG9iYWxUaGlzLmNhbWxfZnNfdG1wID0gW107XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9jcmVhdGVfZmlsZShuYW1lLGNvbnRlbnQpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYoISByb290LmRldmljZS5yZWdpc3RlcikgY2FtbF9mYWlsd2l0aChcImNhbm5vdCByZWdpc3RlciBmaWxlXCIpO1xuICByb290LmRldmljZS5yZWdpc3Rlcihyb290LnJlc3QsY29udGVudCk7XG4gIHJldHVybiAwO1xufVxuXG5cbi8vUHJvdmlkZXM6IGpzb29fY3JlYXRlX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2ZpbGUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGpzb29fY3JlYXRlX2ZpbGUobmFtZSxjb250ZW50KSB7XG4gIHZhciBuYW1lID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhuYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNvbnRlbnQpO1xuICByZXR1cm4gY2FtbF9jcmVhdGVfZmlsZShuYW1lLCBjb250ZW50KTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlYWRfZmlsZV9jb250ZW50XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUsIGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlYWRfZmlsZV9jb250ZW50IChuYW1lKSB7XG4gIHZhciBuYW1lID0gKHR5cGVvZiBuYW1lID09IFwic3RyaW5nXCIpP2NhbWxfc3RyaW5nX29mX2pzYnl0ZXMobmFtZSk6bmFtZTtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYocm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCkpIHtcbiAgICB2YXIgZmlsZSA9IHJvb3QuZGV2aWNlLm9wZW4ocm9vdC5yZXN0LHtyZG9ubHk6MX0pO1xuICAgIHZhciBsZW4gID0gZmlsZS5sZW5ndGgoKTtcbiAgICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBmaWxlLnJlYWQoMCxidWYsMCxsZW4pO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShidWYpXG4gIH1cbiAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSk7XG59XG4iLCIvL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5XG4vL0FsaWFzOiB1bml4X2dldHRpbWVvZmRheVxuZnVuY3Rpb24gY2FtbF91bml4X2dldHRpbWVvZmRheSAoKSB7XG4gIHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC8gMTAwMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3RpbWVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9nZXR0aW1lb2ZkYXlcbi8vQWxpYXM6IHVuaXhfdGltZVxuZnVuY3Rpb24gY2FtbF91bml4X3RpbWUgKCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihjYW1sX3VuaXhfZ2V0dGltZW9mZGF5ICgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dtdGltZVxuLy9BbGlhczogdW5peF9nbXRpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9nbXRpbWUgKHQpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSAodCAqIDEwMDApO1xuICB2YXIgZF9udW0gPSBkLmdldFRpbWUoKTtcbiAgdmFyIGphbnVhcnlmaXJzdCA9IChuZXcgRGF0ZShEYXRlLlVUQyhkLmdldFVUQ0Z1bGxZZWFyKCksIDAsIDEpKSkuZ2V0VGltZSgpO1xuICB2YXIgZG95ID0gTWF0aC5mbG9vcigoZF9udW0gLSBqYW51YXJ5Zmlyc3QpIC8gODY0MDAwMDApO1xuICByZXR1cm4gQkxPQ0soMCwgZC5nZXRVVENTZWNvbmRzKCksIGQuZ2V0VVRDTWludXRlcygpLCBkLmdldFVUQ0hvdXJzKCksXG4gICAgICAgICAgICAgICBkLmdldFVUQ0RhdGUoKSwgZC5nZXRVVENNb250aCgpLCBkLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTAwLFxuICAgICAgICAgICAgICAgZC5nZXRVVENEYXkoKSwgZG95LFxuICAgICAgICAgICAgICAgZmFsc2UgfCAwIC8qIGZvciBVVEMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lIGlzIGZhbHNlICovKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbG9jYWx0aW1lXG4vL0FsaWFzOiB1bml4X2xvY2FsdGltZVxuZnVuY3Rpb24gY2FtbF91bml4X2xvY2FsdGltZSAodCkge1xuICB2YXIgZCA9IG5ldyBEYXRlICh0ICogMTAwMCk7XG4gIHZhciBkX251bSA9IGQuZ2V0VGltZSgpO1xuICB2YXIgamFudWFyeWZpcnN0ID0gKG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgMCwgMSkpLmdldFRpbWUoKTtcbiAgdmFyIGRveSA9IE1hdGguZmxvb3IoKGRfbnVtIC0gamFudWFyeWZpcnN0KSAvIDg2NDAwMDAwKTtcbiAgdmFyIGphbiA9IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gIHZhciBqdWwgPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDYsIDEpO1xuICB2YXIgc3RkVGltZXpvbmVPZmZzZXQgPSBNYXRoLm1heChqYW4uZ2V0VGltZXpvbmVPZmZzZXQoKSwganVsLmdldFRpbWV6b25lT2Zmc2V0KCkpO1xuICByZXR1cm4gQkxPQ0soMCwgZC5nZXRTZWNvbmRzKCksIGQuZ2V0TWludXRlcygpLCBkLmdldEhvdXJzKCksXG4gICAgICAgICAgICAgICBkLmdldERhdGUoKSwgZC5nZXRNb250aCgpLCBkLmdldEZ1bGxZZWFyKCkgLSAxOTAwLFxuICAgICAgICAgICAgICAgZC5nZXREYXkoKSwgZG95LFxuICAgICAgICAgICAgICAgKGQuZ2V0VGltZXpvbmVPZmZzZXQoKSA8IHN0ZFRpbWV6b25lT2Zmc2V0KSB8IDAgLyogZGF5bGlnaHQgc2F2aW5ncyB0aW1lICBmaWVsZC4gKi8pXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta3RpbWVcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbWt0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbWt0aW1lKHRtKXtcbiAgdmFyIGQgPSAobmV3IERhdGUodG1bNl0rMTkwMCx0bVs1XSx0bVs0XSx0bVszXSx0bVsyXSx0bVsxXSkpLmdldFRpbWUoKTtcbiAgdmFyIHQgPSBNYXRoLmZsb29yKGQgLyAxMDAwKTtcbiAgdmFyIHRtMiA9IGNhbWxfdW5peF9sb2NhbHRpbWUodCk7XG4gIHJldHVybiBCTE9DSygwLHQsdG0yKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zdGFydHVwIGNvbnN0XG4vL0FsaWFzOiB3aW5fc3RhcnR1cFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXJ0dXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfY2xlYW51cCBjb25zdFxuLy9BbGlhczogd2luX2NsZWFudXBcbmZ1bmN0aW9uIGNhbWxfdW5peF9jbGVhbnVwKCkge31cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbGVkZXNjcl9vZl9mZCBjb25zdFxuLy9BbGlhczogd2luX2hhbmRsZV9mZFxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbGVkZXNjcl9vZl9mZCh4KSB7cmV0dXJuIHg7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaXNhdHR5XG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9BbGlhczogdW5peF9pc2F0dHlcbmZ1bmN0aW9uIGNhbWxfdW5peF9pc2F0dHkoZmlsZURlc2NyaXB0b3IpIHtcbiAgaWYoZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciB0dHkgPSByZXF1aXJlKCd0dHknKTtcbiAgICByZXR1cm4gdHR5LmlzYXR0eShmaWxlRGVzY3JpcHRvcik/MTowO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2lzYXR0eVxuLy9BbGlhczogdW5peF9pc2F0dHlcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9pc2F0dHkoZmlsZURlc2NyaXB0b3IpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IG1ha2VfdW5peF9lcnJfYXJnc1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbnZhciB1bml4X2Vycm9yID0gW1xuICAvKiA9PT1Vbml4LmVycm9yPT09XG4gICAqXG4gICAqIFRoaXMgYXJyYXkgaXMgaW4gb3JkZXIgb2YgdGhlIHZhcmlhbnQgaW4gT0NhbWxcbiAgICovXG4gIFwiRTJCSUdcIiwgXCJFQUNDRVNcIiwgXCJFQUdBSU5cIiwgXCJFQkFERlwiLCBcIkVCVVNZXCIsIFwiRUNISUxEXCIsIFwiRURFQURMS1wiLCBcIkVET01cIixcbiAgXCJFRVhJU1RcIiwgXCJFRkFVTFRcIiwgXCJFRkJJR1wiLCBcIkVJTlRSXCIsIFwiRUlOVkFMXCIsIFwiRUlPXCIsIFwiRUlTRElSXCIsIFwiRU1GSUxFXCIsXG4gIFwiRU1MSU5LXCIsIFwiRU5BTUVUT09MT05HXCIsIFwiRU5GSUxFXCIsIFwiRU5PREVWXCIsIFwiRU5PRU5UXCIsIFwiRU5PRVhFQ1wiLCBcIkVOT0xDS1wiLFxuICBcIkVOT01FTVwiLCBcIkVOT1NQQ1wiLCBcIkVOT1NZU1wiLCBcIkVOT1RESVJcIiwgXCJFTk9URU1QVFlcIiwgXCJFTk9UVFlcIiwgXCJFTlhJT1wiLFxuICBcIkVQRVJNXCIsIFwiRVBJUEVcIiwgXCJFUkFOR0VcIiwgXCJFUk9GU1wiLCBcIkVTUElQRVwiLCBcIkVTUkNIXCIsIFwiRVhERVZcIiwgXCJFV09VTERCTE9DS1wiLFxuICBcIkVJTlBST0dSRVNTXCIsIFwiRUFMUkVBRFlcIiwgXCJFTk9UU09DS1wiLCBcIkVERVNUQUREUlJFUVwiLCBcIkVNU0dTSVpFXCIsXG4gIFwiRVBST1RPVFlQRVwiLCBcIkVOT1BST1RPT1BUXCIsIFwiRVBST1RPTk9TVVBQT1JUXCIsIFwiRVNPQ0tUTk9TVVBQT1JUXCIsXG4gIFwiRU9QTk9UU1VQUFwiLCBcIkVQRk5PU1VQUE9SVFwiLCBcIkVBRk5PU1VQUE9SVFwiLCBcIkVBRERSSU5VU0VcIiwgXCJFQUREUk5PVEFWQUlMXCIsXG4gIFwiRU5FVERPV05cIiwgXCJFTkVUVU5SRUFDSFwiLCBcIkVORVRSRVNFVFwiLCBcIkVDT05OQUJPUlRFRFwiLCBcIkVDT05OUkVTRVRcIiwgXCJFTk9CVUZTXCIsXG4gIFwiRUlTQ09OTlwiLCBcIkVOT1RDT05OXCIsIFwiRVNIVVRET1dOXCIsIFwiRVRPT01BTllSRUZTXCIsIFwiRVRJTUVET1VUXCIsIFwiRUNPTk5SRUZVU0VEXCIsXG4gIFwiRUhPU1RET1dOXCIsIFwiRUhPU1RVTlJFQUNIXCIsIFwiRUxPT1BcIiwgXCJFT1ZFUkZMT1dcIlxuXTtcbmZ1bmN0aW9uIG1ha2VfdW5peF9lcnJfYXJncyhjb2RlLCBzeXNjYWxsLCBwYXRoLCBlcnJubykge1xuICB2YXIgdmFyaWFudCA9IHVuaXhfZXJyb3IuaW5kZXhPZihjb2RlKTtcbiAgaWYgKHZhcmlhbnQgPCAwKSB7XG4gICAgLy8gRGVmYXVsdCBpZiB1bmRlZmluZWRcbiAgICBpZiAoZXJybm8gPT0gbnVsbCkge1xuICAgICAgZXJybm8gPSAtOTk5OVxuICAgIH1cbiAgICAvLyBJZiBub25lIG9mIHRoZSBhYm92ZSB2YXJpYW50cywgZmFsbGJhY2sgdG8gRVVOS05PV05FUlIoaW50KVxuICAgIHZhcmlhbnQgPSBCTE9DSygwLCBlcnJubyk7XG4gIH1cbiAgdmFyIGFyZ3MgPSBbXG4gICAgdmFyaWFudCxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzeXNjYWxsIHx8IFwiXCIpLFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGggfHwgXCJcIilcbiAgXTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zdGF0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9zdGF0XG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2Uuc3RhdCkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfc3RhdDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5zdGF0KHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9zdGF0LCBjYW1sX2ludDY0X29mX2ludDMyXG4vL0FsaWFzOiB1bml4X3N0YXRfNjRcbmZ1bmN0aW9uIGNhbWxfdW5peF9zdGF0XzY0KG5hbWUpIHtcbiAgdmFyIHIgPSBjYW1sX3VuaXhfc3RhdChuYW1lKTtcbiAgcls5XSA9IGNhbWxfaW50NjRfb2ZfaW50MzIocls5XSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbHN0YXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdChuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubHN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X2xzdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmxzdGF0KHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2xzdGF0XzY0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbHN0YXQsIGNhbWxfaW50NjRfb2ZfaW50MzJcbi8vQWxpYXM6IHVuaXhfbHN0YXRfNjRcbmZ1bmN0aW9uIGNhbWxfdW5peF9sc3RhdF82NChuYW1lKSB7XG4gIHZhciByID0gY2FtbF91bml4X2xzdGF0KG5hbWUpO1xuICByWzldID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihyWzldKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X21rZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9ta2RpclxuZnVuY3Rpb24gY2FtbF91bml4X21rZGlyKG5hbWUsIHBlcm0pIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5ta2Rpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfbWtkaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UubWtkaXIocm9vdC5yZXN0LCBwZXJtLCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3JtZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfcm1kaXIobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnJtZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9ybWRpcjogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5ybWRpcihyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zeW1saW5rXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3ltbGluayh0b19kaXIsIHNyYywgZHN0KSB7XG4gIHZhciBzcmNfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKHNyYyk7XG4gIHZhciBkc3Rfcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRzdCk7XG4gIGlmKHNyY19yb290LmRldmljZSAhPSBkc3Rfcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9zeW1saW5rOiBjYW5ub3Qgc3ltbGluayBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtc1wiKTtcbiAgaWYgKCFzcmNfcm9vdC5kZXZpY2Uuc3ltbGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfc3ltbGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiBzcmNfcm9vdC5kZXZpY2Uuc3ltbGluayh0b19kaXIsIHNyY19yb290LnJlc3QsIGRzdF9yb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZWFkbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfcmVhZGxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkbGluayhuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UucmVhZGxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3JlYWRsaW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnJlYWRsaW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3VubGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfdW5saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfdW5saW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS51bmxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3VubGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS51bmxpbmsocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0dWlkXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9BbGlhczogdW5peF9nZXR1aWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXR1aWQodW5pdCkge1xuICBpZihnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmdldHVpZCl7XG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXR1aWQoKTtcbiAgfVxuICBjYW1sX3JhaXNlX25vdF9mb3VuZCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ2V0cHd1aWRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL0FsaWFzOiB1bml4X2dldHB3dWlkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0cHd1aWQodW5pdCkge1xuICBjYW1sX3JhaXNlX25vdF9mb3VuZCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaGFzX3N5bWxpbmtcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0FsaWFzOiB1bml4X2hhc19zeW1saW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfaGFzX3N5bWxpbmsodW5pdCkge1xuICByZXR1cm4gZnNfbm9kZV9zdXBwb3J0ZWQoKT8xOjBcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X29wZW5kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X29wZW5kaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShwYXRoKTtcbiAgaWYgKCFyb290LmRldmljZS5vcGVuZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9vcGVuZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgdmFyIGRpcl9oYW5kbGUgPSByb290LmRldmljZS5vcGVuZGlyKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbiAgcmV0dXJuIHsgcG9pbnRlciA6IGRpcl9oYW5kbGUsIHBhdGg6IHBhdGggfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IG1ha2VfdW5peF9lcnJfYXJncywgY2FtbF9yYWlzZV93aXRoX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVcbi8vQWxpYXM6IHVuaXhfcmVhZGRpclxuZnVuY3Rpb24gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSkge1xuICB2YXIgZW50cnk7XG4gIHRyeSB7XG4gICAgICBlbnRyeSA9IGRpcl9oYW5kbGUucG9pbnRlci5yZWFkU3luYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUJBREZcIiwgXCJyZWFkZGlyXCIsIGRpcl9oYW5kbGUucGF0aCkpO1xuICB9XG4gIGlmIChlbnRyeSA9PT0gbnVsbCkge1xuICAgICAgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGVudHJ5Lm5hbWUpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9jbG9zZWRpclxuLy9SZXF1aXJlczogbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX3JhaXNlX3dpdGhfYXJncywgY2FtbF9uYW1lZF92YWx1ZVxuLy9BbGlhczogdW5peF9jbG9zZWRpclxuZnVuY3Rpb24gY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpIHtcbiAgdHJ5IHtcbiAgICAgIGRpcl9oYW5kbGUucG9pbnRlci5jbG9zZVN5bmMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgICAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVCQURGXCIsIFwiY2xvc2VkaXJcIiwgZGlyX2hhbmRsZS5wYXRoKSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3Jld2luZGRpclxuLy9SZXF1aXJlczogY2FtbF91bml4X2Nsb3NlZGlyLCBjYW1sX3VuaXhfb3BlbmRpclxuLy9BbGlhczogdW5peF9yZXdpbmRkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZXdpbmRkaXIoZGlyX2hhbmRsZSkge1xuICBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSk7XG4gIHZhciBuZXdfZGlyX2hhbmRsZSA9IGNhbWxfdW5peF9vcGVuZGlyKGRpcl9oYW5kbGUucGF0aCk7XG4gIGRpcl9oYW5kbGUucG9pbnRlciA9IG5ld19kaXJfaGFuZGxlLnBvaW50ZXI7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmluZGZpcnN0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9vcGVuZGlyLCBjYW1sX3VuaXhfcmVhZGRpclxuLy9BbGlhczogd2luX2ZpbmRmaXJzdFxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRmaXJzdChwYXRoKSB7XG4gIC8vIFRoZSBXaW5kb3dzIGNvZGUgYWRkcyB0aGlzIGdsb2IgdG8gdGhlIHBhdGgsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIGl0XG4gIHZhciBwYXRoX2pzID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocGF0aCk7XG4gIHBhdGhfanMgPSBwYXRoX2pzLnJlcGxhY2UoLyhefFtcXFxcXFwvXSlcXCpcXC5cXCokLywgXCJcIik7XG4gIHBhdGggPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhwYXRoX2pzKTtcbiAgLy8gKi4qIGlzIG5vdyBzdHJpcHBlZFxuICB2YXIgZGlyX2hhbmRsZSA9IGNhbWxfdW5peF9vcGVuZGlyKHBhdGgpO1xuICB2YXIgZmlyc3RfZW50cnkgPSBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKTtcbiAgLy8gVGhlIFdpbmRvd3MgYmluZGluZ3MgdHlwZSBkaXJfaGFuZGxlIGFzIGFuIGBpbnRgIGJ1dCBpdCdzIG5vdCBpbiBKU1xuICByZXR1cm4gWzAsIGZpcnN0X2VudHJ5LCBkaXJfaGFuZGxlXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRuZXh0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfcmVhZGRpclxuLy9BbGlhczogd2luX2ZpbmRuZXh0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZG5leHQoZGlyX2hhbmRsZSkge1xuICByZXR1cm4gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9jbG9zZWRpclxuLy9BbGlhczogd2luX2ZpbmRjbG9zZVxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRjbG9zZShkaXJfaGFuZGxlKSB7XG4gIHJldHVybiBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbi8vQWxpYXM6IHVuaXhfaW5ldF9hZGRyX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF91bml4X2luZXRfYWRkcl9vZl9zdHJpbmcgKCkge3JldHVybiAwO31cblxuXG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBNbEZha2VEZXZpY2Vcbi8vUmVxdWlyZXM6IE1sRmFrZUZpbGUsIE1sRmFrZUZkLCBjYW1sX2NyZWF0ZV9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9hcnJheSwgY2FtbF9ieXRlc19vZl9zdHJpbmcsIGNhbWxfYnl0ZXNfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlc1xuLy9SZXF1aXJlczogbWFrZV91bml4X2Vycl9hcmdzXG5mdW5jdGlvbiBNbEZha2VEZXZpY2UgKHJvb3QsIGYpIHtcbiAgdGhpcy5jb250ZW50PXt9O1xuICB0aGlzLnJvb3QgPSByb290O1xuICB0aGlzLmxvb2t1cEZ1biA9IGY7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm5tID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gKHRoaXMucm9vdCArIG5hbWUpO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5jcmVhdGVfZGlyX2lmX25lZWRlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGNvbXAgPSBuYW1lLnNwbGl0KFwiL1wiKTtcbiAgdmFyIHJlcyA9IFwiXCI7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgcmVzICs9IGNvbXBbaV0gKyBcIi9cIjtcbiAgICBpZih0aGlzLmNvbnRlbnRbcmVzXSkgY29udGludWU7XG4gICAgdGhpcy5jb250ZW50W3Jlc10gPSBTeW1ib2woXCJkaXJlY3RvcnlcIik7XG4gIH1cbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuc2xhc2ggPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIC9cXC8kLy50ZXN0KG5hbWUpP25hbWU6KG5hbWUgKyBcIi9cIik7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmxvb2t1cCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYoIXRoaXMuY29udGVudFtuYW1lXSAmJiB0aGlzLmxvb2t1cEZ1bikge1xuICAgIHZhciByZXMgPSB0aGlzLmxvb2t1cEZ1bihjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHRoaXMucm9vdCksIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobmFtZSkpO1xuICAgIGlmKHJlcyAhPT0gMCkge1xuICAgICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuYW1lKTtcbiAgICAgIHRoaXMuY29udGVudFtuYW1lXT1uZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhyZXNbMV0pKTtcbiAgICB9XG4gIH1cbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuZXhpc3RzID0gZnVuY3Rpb24obmFtZSkge1xuICAvLyBUaGUgcm9vdCBvZiB0aGUgZGV2aWNlIGV4aXN0c1xuICBpZihuYW1lID09IFwiXCIpIHJldHVybiAxO1xuICAvLyBDaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgdmFyIG5hbWVfc2xhc2ggPSB0aGlzLnNsYXNoKG5hbWUpO1xuICBpZih0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF0pIHJldHVybiAxO1xuICAvLyBDaGVjayBpZiBhIGZpbGUgZXhpc3RzXG4gIHRoaXMubG9va3VwKG5hbWUpO1xuICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVdPzE6MDtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuaXNGaWxlID0gZnVuY3Rpb24obmFtZSkge1xuICBpZih0aGlzLmV4aXN0cyhuYW1lKSAmJiAhdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICByZXR1cm4gMVxuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiAwXG4gIH1cbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUubWtkaXIgPSBmdW5jdGlvbihuYW1lLG1vZGUsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSByYWlzZV91bml4ICYmIGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuICBpZih0aGlzLmV4aXN0cyhuYW1lKSkge1xuICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFRVhJU1RcIiwgXCJta2RpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBGaWxlIGV4aXN0c1wiKTtcbiAgICB9XG4gIH1cbiAgdmFyIHBhcmVudCA9IC9eKC4qKVxcL1teL10rLy5leGVjKG5hbWUpO1xuICBwYXJlbnQgPSAocGFyZW50ICYmIHBhcmVudFsxXSkgfHwgJyc7XG4gIGlmKCF0aGlzLmV4aXN0cyhwYXJlbnQpKXtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PRU5UXCIsIFwibWtkaXJcIiwgdGhpcy5ubShwYXJlbnQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IocGFyZW50ICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gICAgfVxuICB9XG4gIGlmKCF0aGlzLmlzX2RpcihwYXJlbnQpKXtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PVERJUlwiLCBcIm1rZGlyXCIsIHRoaXMubm0ocGFyZW50KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHBhcmVudCArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG4gICAgfVxuICB9XG4gIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQodGhpcy5zbGFzaChuYW1lKSk7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnJtZGlyID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB2YXIgdW5peF9lcnJvciA9IHJhaXNlX3VuaXggJiYgY2FtbF9uYW1lZF92YWx1ZSgnVW5peC5Vbml4X2Vycm9yJyk7XG4gIHZhciBuYW1lX3NsYXNoID0gKG5hbWUgPT0gXCJcIik/XCJcIjoodGhpcy5zbGFzaChuYW1lKSk7XG4gIHZhciByID0gbmV3IFJlZ0V4cChcIl5cIiArIG5hbWVfc2xhc2ggKyBcIihbXi9dKylcIik7XG4gIGlmKCF0aGlzLmV4aXN0cyhuYW1lKSkge1xuICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9FTlRcIiwgXCJybWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICBpZighdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PVERJUlwiLCBcInJtZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vdCBhIGRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cbiAgZm9yKHZhciBuIGluIHRoaXMuY29udGVudCkge1xuICAgIGlmKG4ubWF0Y2gocikpIHtcbiAgICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT1RFTVBUWVwiLCBcInJtZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIjogRGlyZWN0b3J5IG5vdCBlbXB0eVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZGVsZXRlIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUucmVhZGRpciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIG5hbWVfc2xhc2ggPSAobmFtZSA9PSBcIlwiKT9cIlwiOih0aGlzLnNsYXNoKG5hbWUpKTtcbiAgaWYoIXRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICB9XG4gIGlmKCF0aGlzLmlzX2RpcihuYW1lKSkge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICB9XG4gIHZhciByID0gbmV3IFJlZ0V4cChcIl5cIiArIG5hbWVfc2xhc2ggKyBcIihbXi9dKylcIik7XG4gIHZhciBzZWVuID0ge31cbiAgdmFyIGEgPSBbXTtcbiAgZm9yKHZhciBuIGluIHRoaXMuY29udGVudCkge1xuICAgIHZhciBtID0gbi5tYXRjaChyKTtcbiAgICBpZihtICYmICFzZWVuW21bMV1dKSB7c2VlblttWzFdXSA9IHRydWU7IGEucHVzaChtWzFdKX1cbiAgfVxuICByZXR1cm4gYTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUub3BlbmRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSByYWlzZV91bml4ICYmIGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuXG4gIHZhciBhID0gdGhpcy5yZWFkZGlyKG5hbWUpO1xuICB2YXIgYyA9IGZhbHNlO1xuICB2YXIgaSA9IDA7XG4gIHJldHVybiB7IHJlYWRTeW5jIDogKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYykge1xuICAgICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUJBREZcIiwgXCJjbG9zZWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBjbG9zZWRpciBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmKGkgPT0gYS5sZW5ndGgpIHJldHVybiBudWxsO1xuICAgIHZhciBlbnRyeSA9IGFbaV07XG4gICAgaSsrO1xuICAgIHJldHVybiB7IG5hbWU6IGVudHJ5IH1cbiAgfSlcbiAgICAsIGNsb3NlU3luYzogKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjKSB7XG4gICAgICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUJBREZcIiwgXCJjbG9zZWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBjbG9zZWRpciBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGMgPSB0cnVlO1xuICAgICAgYSA9IFtdO1xuICAgIH0pXG4gIH1cbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuaXNfZGlyID0gZnVuY3Rpb24obmFtZSkge1xuICBpZihuYW1lID09IFwiXCIpICByZXR1cm4gdHJ1ZTtcbiAgdmFyIG5hbWVfc2xhc2ggPSB0aGlzLnNsYXNoKG5hbWUpO1xuICByZXR1cm4gdGhpcy5jb250ZW50W25hbWVfc2xhc2hdPzE6MDtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUudW5saW5rID0gZnVuY3Rpb24obmFtZSkge1xuICB2YXIgb2sgPSB0aGlzLmNvbnRlbnRbbmFtZV0/dHJ1ZTpmYWxzZTtcbiAgZGVsZXRlIHRoaXMuY29udGVudFtuYW1lXTtcbiAgcmV0dXJuIG9rO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24obmFtZSwgZikge1xuICB2YXIgZmlsZTtcbiAgaWYoZi5yZG9ubHkgJiYgZi53cm9ubHkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl9yZG9ubHkgYW5kIE9wZW5fd3Jvbmx5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgaWYoZi50ZXh0ICYmIGYuYmluYXJ5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fdGV4dCBhbmQgT3Blbl9iaW5hcnkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgaWYgKHRoaXMuY29udGVudFtuYW1lXSkge1xuICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogaXMgYSBkaXJlY3RvcnlcIik7XG4gICAgaWYgKGYuY3JlYXRlICYmIGYuZXhjbCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICAgIGlmKGYudHJ1bmNhdGUpIGZpbGUudHJ1bmNhdGUoKTtcbiAgfSBlbHNlIGlmIChmLmNyZWF0ZSkge1xuICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgdGhpcy5jb250ZW50W25hbWVdID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9jcmVhdGVfYnl0ZXMoMCkpO1xuICAgIGZpbGUgPSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUgKHRoaXMubm0obmFtZSkpO1xuICB9XG4gIHJldHVybiBuZXcgTWxGYWtlRmQodGhpcy5ubShuYW1lKSwgZmlsZSwgZik7XG59XG5cbk1sRmFrZURldmljZS5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG5hbWUsIGYpIHtcbiAgdmFyIGZpbGU7XG4gIGlmKGYucmRvbmx5ICYmIGYud3Jvbmx5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fcmRvbmx5IGFuZCBPcGVuX3dyb25seSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIGlmKGYudGV4dCAmJiBmLmJpbmFyeSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3RleHQgYW5kIE9wZW5fYmluYXJ5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgdGhpcy5sb29rdXAobmFtZSk7XG4gIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICBpZiAodGhpcy5pc19kaXIobmFtZSkpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGlzIGEgZGlyZWN0b3J5XCIpO1xuICAgIGlmIChmLmNyZWF0ZSAmJiBmLmV4Y2wpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZpbGUgYWxyZWFkeSBleGlzdHNcIik7XG4gICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICBpZihmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKCk7XG4gIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgIHRoaXMuY29udGVudFtuYW1lXSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfY3JlYXRlX2J5dGVzKDApKTtcbiAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICB9IGVsc2Uge1xuICAgIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlICh0aGlzLm5tKG5hbWUpKTtcbiAgfVxuICByZXR1cm4gbmV3IE1sRmFrZUZkKHRoaXMubm0obmFtZSksIGZpbGUsIGYpO1xufVxuXG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnJlZ2lzdGVyPSBmdW5jdGlvbiAobmFtZSxjb250ZW50KXtcbiAgdmFyIGZpbGU7XG4gIGlmKHRoaXMuY29udGVudFtuYW1lXSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgaWYoY2FtbF9pc19tbF9ieXRlcyhjb250ZW50KSlcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY29udGVudCk7XG4gIGlmKGNhbWxfaXNfbWxfc3RyaW5nKGNvbnRlbnQpKVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX3N0cmluZyhjb250ZW50KSk7XG4gIGVsc2UgaWYoY29udGVudCBpbnN0YW5jZW9mIEFycmF5KVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX2FycmF5KGNvbnRlbnQpKTtcbiAgZWxzZSBpZih0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIilcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9qc2J5dGVzKGNvbnRlbnQpKTtcbiAgZWxzZSBpZihjb250ZW50LnRvU3RyaW5nKSB7XG4gICAgdmFyIGJ5dGVzID0gY2FtbF9ieXRlc19vZl9zdHJpbmcoY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoY29udGVudC50b1N0cmluZygpKSk7XG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGJ5dGVzKTtcbiAgfVxuICBpZihmaWxlKXtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgIHRoaXMuY29udGVudFtuYW1lXSA9IGZpbGU7XG4gIH1cbiAgZWxzZSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiByZWdpc3RlcmluZyBmaWxlIHdpdGggaW52YWxpZCBjb250ZW50IHR5cGVcIik7XG59XG5cbk1sRmFrZURldmljZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNbEZha2VEZXZpY2VcblxuLy9Qcm92aWRlczogTWxGYWtlRmlsZVxuLy9SZXF1aXJlczogTWxGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9ieXRlc19sZW5ndGgsIGNhbWxfYmxpdF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcywgY2FtbF9ieXRlc19vZl9hcnJheVxuZnVuY3Rpb24gTWxGYWtlRmlsZShjb250ZW50KXtcbiAgdGhpcy5kYXRhID0gY29udGVudDtcbn1cbk1sRmFrZUZpbGUucHJvdG90eXBlID0gbmV3IE1sRmlsZSAoKTtcbk1sRmFrZUZpbGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWxGYWtlRmlsZVxuTWxGYWtlRmlsZS5wcm90b3R5cGUudHJ1bmNhdGUgPSBmdW5jdGlvbihsZW4pe1xuICB2YXIgb2xkID0gdGhpcy5kYXRhO1xuICB0aGlzLmRhdGEgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW58MCk7XG4gIGNhbWxfYmxpdF9ieXRlcyhvbGQsIDAsIHRoaXMuZGF0YSwgMCwgbGVuKTtcbn1cbk1sRmFrZUZpbGUucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHRoaXMuZGF0YSk7XG59XG5NbEZha2VGaWxlLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG9mZnNldCxidWYscG9zLGxlbil7XG4gIHZhciBjbGVuID0gdGhpcy5sZW5ndGgoKTtcbiAgaWYob2Zmc2V0ICsgbGVuID49IGNsZW4pIHtcbiAgICB2YXIgbmV3X3N0ciA9IGNhbWxfY3JlYXRlX2J5dGVzKG9mZnNldCArIGxlbik7XG4gICAgdmFyIG9sZF9kYXRhID0gdGhpcy5kYXRhO1xuICAgIHRoaXMuZGF0YSA9IG5ld19zdHI7XG4gICAgY2FtbF9ibGl0X2J5dGVzKG9sZF9kYXRhLCAwLCB0aGlzLmRhdGEsIDAsIGNsZW4pO1xuICB9XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX2FycmF5KGJ1ZiksIHBvcywgdGhpcy5kYXRhLCBvZmZzZXQsIGxlbik7XG4gIHJldHVybiAwXG59XG5NbEZha2VGaWxlLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24ob2Zmc2V0LGJ1Zixwb3MsbGVuKXtcbiAgdmFyIGNsZW4gPSB0aGlzLmxlbmd0aCgpO1xuICBpZihvZmZzZXQgKyBsZW4gPj0gY2xlbikge1xuICAgIGxlbiA9IGNsZW4gLSBvZmZzZXQ7XG4gIH1cbiAgaWYobGVuKSB7XG4gICAgdmFyIGRhdGEgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW58MCk7XG4gICAgY2FtbF9ibGl0X2J5dGVzKHRoaXMuZGF0YSwgb2Zmc2V0LCBkYXRhLCAwLCBsZW4pO1xuICAgIGJ1Zi5zZXQoY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhkYXRhKSwgcG9zKTtcbiAgfVxuICByZXR1cm4gbGVuXG59XG5cblxuLy9Qcm92aWRlczogTWxGYWtlRmRfb3V0XG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gTWxGYWtlRmRfb3V0KGZkLGZsYWdzKSB7XG4gIE1sRmFrZUZpbGUuY2FsbCh0aGlzLCBjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gIHRoaXMubG9nID0gKGZ1bmN0aW9uIChzKSB7IHJldHVybiAwIH0pO1xuICBpZihmZCA9PSAxICYmIHR5cGVvZiBjb25zb2xlLmxvZyA9PSBcImZ1bmN0aW9uXCIpXG4gICAgdGhpcy5sb2cgPSBjb25zb2xlLmxvZztcbiAgZWxzZSBpZihmZCA9PSAyICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09IFwiZnVuY3Rpb25cIilcbiAgICB0aGlzLmxvZyA9IGNvbnNvbGUuZXJyb3I7XG4gIGVsc2UgaWYodHlwZW9mIGNvbnNvbGUubG9nID09IFwiZnVuY3Rpb25cIilcbiAgICB0aGlzLmxvZyA9IGNvbnNvbGUubG9nXG4gIHRoaXMuZmxhZ3MgPSBmbGFncztcbn1cbk1sRmFrZUZkX291dC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24oKSB7IHJldHVybiAwIH1cbk1sRmFrZUZkX291dC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAob2Zmc2V0LGJ1Zixwb3MsbGVuKSB7XG4gIGlmKHRoaXMubG9nKSB7XG4gICAgaWYobGVuID4gMFxuICAgICAgICYmIHBvcyA+PSAwXG4gICAgICAgJiYgcG9zK2xlbiA8PSBidWYubGVuZ3RoXG4gICAgICAgJiYgYnVmW3BvcytsZW4tMV0gPT0gMTApXG4gICAgICBsZW4gLS07XG4gICAgLy8gRG8gbm90IG91dHB1dCB0aGUgbGFzdCBcXG4gaWYgcHJlc2VudFxuICAgIC8vIGFzIGNvbnNvbGUgbG9nZ2luZyBkaXNwbGF5IGEgbmV3bGluZSBhdCB0aGUgZW5kXG4gICAgdmFyIHNyYyA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbik7XG4gICAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoYnVmKSwgcG9zLCBzcmMsIDAsIGxlbik7XG4gICAgdGhpcy5sb2coc3JjLnRvVXRmMTYoKSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5mZCAgKyBcIjogZmlsZSBkZXNjcmlwdG9yIGFscmVhZHkgY2xvc2VkXCIpO1xufVxuTWxGYWtlRmRfb3V0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG9mZnNldCwgYnVmLCBwb3MsIGxlbikge1xuICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLmZkICArIFwiOiBmaWxlIGRlc2NyaXB0b3IgaXMgd3JpdGUgb25seVwiKTtcbn1cbk1sRmFrZUZkX291dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubG9nID0gdW5kZWZpbmVkO1xufVxuXG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gTWxGYWtlRmQobmFtZSwgZmlsZSxmbGFncykge1xuICB0aGlzLmZpbGUgPSBmaWxlO1xuICB0aGlzLm5hbWUgPSBuYW1lO1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG59XG5cbk1sRmFrZUZkLnByb3RvdHlwZS5lcnJfY2xvc2VkID0gZnVuY3Rpb24gKCkge1xuICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5hbWUgICsgXCI6IGZpbGUgZGVzY3JpcHRvciBhbHJlYWR5IGNsb3NlZFwiKTtcbn1cbk1sRmFrZUZkLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcy5maWxlKSByZXR1cm4gdGhpcy5maWxlLmxlbmd0aCAoKVxuICB0aGlzLmVycl9jbG9zZWQoKTtcbn1cbk1sRmFrZUZkLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChvZmZzZXQsYnVmLHBvcyxsZW4pIHtcbiAgaWYodGhpcy5maWxlKSByZXR1cm4gdGhpcy5maWxlLndyaXRlKG9mZnNldCxidWYscG9zLGxlbilcbiAgdGhpcy5lcnJfY2xvc2VkKCk7XG59XG5NbEZha2VGZC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgaWYodGhpcy5maWxlKSByZXR1cm4gdGhpcy5maWxlLnJlYWQob2Zmc2V0LCBidWYsIHBvcywgbGVuKVxuICB0aGlzLmVycl9jbG9zZWQoKTtcbn1cbk1sRmFrZUZkLnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5maWxlID0gdW5kZWZpbmVkO1xufVxuIiwiLy9Qcm92aWRlczogaW5pdGlhbGl6ZV9uYXRcbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogc2VyaWFsaXplX25hdCwgZGVzZXJpYWxpemVfbmF0LCBjYW1sX2hhc2hfbmF0XG5mdW5jdGlvbiBpbml0aWFsaXplX25hdCgpIHtcbiAgY2FtbF9jdXN0b21fb3BzW1wiX25hdFwiXSA9XG4gICAgeyBkZXNlcmlhbGl6ZSA6IGRlc2VyaWFsaXplX25hdCxcbiAgICAgIHNlcmlhbGl6ZSA6IHNlcmlhbGl6ZV9uYXQsXG4gICAgICBoYXNoIDogY2FtbF9oYXNoX25hdFxuICAgIH1cbn1cblxuLy9Qcm92aWRlczogTWxOYXRcbmZ1bmN0aW9uIE1sTmF0KHgpe1xuICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheSh4KTtcbiAgLy8gbGVuZ3RoX25hdCBpc24ndCBleHRlcm5hbCwgc28gd2UgaGF2ZSB0byBtYWtlIHRoZSBPYmouc2l6ZVxuICAvLyB3b3JrIG91dCByaWdodC4gVGhlICsyIHRvIGFycmF5IGxlbmd0aCBzZWVtcyB0byB3b3JrLlxuICB0aGlzLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGggKyAyXG59XG5cbk1sTmF0LnByb3RvdHlwZS5jYW1sX2N1c3RvbSA9IFwiX25hdFwiO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbmF0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludCwgbnVtX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9uYXQoeCkge1xuICB2YXIgbGVuID0gbnVtX2RpZ2l0c19uYXQoeCwgMCwgeC5kYXRhLmxlbmd0aCk7XG4gIHZhciBoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB4LmRhdGFbaV0pO1xuICB9XG4gIHJldHVybiBoO1xufVxuXG5cbi8vUHJvdmlkZXM6IG5hdF9vZl9hcnJheVxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIG5hdF9vZl9hcnJheShsKXtcbiAgcmV0dXJuIG5ldyBNbE5hdChsKTtcbn1cblxuLy9Qcm92aWRlczogY3JlYXRlX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGNyZWF0ZV9uYXQoc2l6ZSkge1xuICB2YXIgYXJyID0gbmV3IE1sTmF0KHNpemUpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgYXJyLmRhdGFbaV0gPSAtMTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXRfdG9femVyb19uYXRcbmZ1bmN0aW9uIHNldF90b196ZXJvX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcytpXSA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGJsaXRfbmF0XG5mdW5jdGlvbiBibGl0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyLCBsZW4pIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSBuYXQyLmRhdGFbb2ZzMitpXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdFxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdChuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdFxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdChuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogc2V0X2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gbnRoX2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBudW1fZGlnaXRzX25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvcih2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYobmF0LmRhdGFbb2ZzK2ldICE9IDApIHJldHVybiBpKzE7XG4gIH1cbiAgcmV0dXJuIDE7IC8vIDAgY291bnRzIGFzIDEgZGlnaXRcbn1cblxuLy9Qcm92aWRlczogbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0XG5mdW5jdGlvbiBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0LCBvZnMpIHtcbiAgdmFyIGEgPSBuYXQuZGF0YVtvZnNdO1xuICB2YXIgYiA9IDA7XG4gIGlmKGEgJiAweEZGRkYwMDAwKSB7IGIgKz0xNjsgYSA+Pj49MTY7IH1cbiAgaWYoYSAmIDB4RkYwMCkgICAgIHsgYiArPSA4OyBhID4+Pj0gODsgfVxuICBpZihhICYgMHhGMCkgICAgICAgeyBiICs9IDQ7IGEgPj4+PSA0OyB9XG4gIGlmKGEgJiAxMikgICAgICAgICB7IGIgKz0gMjsgYSA+Pj49IDI7IH1cbiAgaWYoYSAmIDIpICAgICAgICAgIHsgYiArPSAxOyBhID4+Pj0gMTsgfVxuICBpZihhICYgMSkgICAgICAgICAgeyBiICs9IDE7IH1cbiAgcmV0dXJuIDMyIC0gYjtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfaW50XG5mdW5jdGlvbiBpc19kaWdpdF9pbnQobmF0LCBvZnMpIHtcbiAgaWYgKG5hdC5kYXRhW29mc10gPj0gMCkgcmV0dXJuIDFcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X3plcm9cbmZ1bmN0aW9uIGlzX2RpZ2l0X3plcm8obmF0LCBvZnMpIHtcbiAgaWYobmF0LmRhdGFbb2ZzXSA9PSAwKSByZXR1cm4gMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X29kZFxuZnVuY3Rpb24gaXNfZGlnaXRfb2RkKG5hdCwgb2ZzKSB7XG4gIGlmKG5hdC5kYXRhW29mc10gJiAxKSByZXR1cm4gMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGluY3JfbmF0XG5mdW5jdGlvbiBpbmNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgY2FycnkgPSBjYXJyeV9pbjtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0LmRhdGFbb2ZzK2ldID4+PiAwKSArIGNhcnJ5O1xuICAgIG5hdC5kYXRhW29mcytpXSA9ICh4IHwgMCk7XG4gICAgaWYoeCA9PSAoeCA+Pj4gMCkpIHtcbiAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBjYXJyeTtcbn1cblxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBhZGRfbmF0XG4vL1JlcXVpcmVzOiBpbmNyX25hdFxuZnVuY3Rpb24gYWRkX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBjYXJyeV9pbikge1xuICB2YXIgY2FycnkgPSBjYXJyeV9pbjtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSArIChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHhcbiAgICBpZih4ID09ICh4ID4+PiAwKSkge1xuICAgICAgY2FycnkgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYXJyeSA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmNyX25hdChuYXQxLCBvZnMxK2xlbjIsIGxlbjEtbGVuMiwgY2FycnkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wbGVtZW50X25hdFxuZnVuY3Rpb24gY29tcGxlbWVudF9uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQuZGF0YVtvZnMraV0gPSAoLTEgPj4+IDApIC0gKG5hdC5kYXRhW29mcytpXSA+Pj4gMCk7XG4gIH1cbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vUHJvdmlkZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBkZWNyX25hdChuYXQsIG9mcywgbGVuLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gKGNhcnJ5X2luID09IDEpID8gMCA6IDE7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcytpXSA+Pj4wKSAtIGJvcnJvdztcbiAgICBuYXQuZGF0YVtvZnMraV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgYm9ycm93ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChib3Jyb3cgPT0gMSkgPyAwIDogMTtcbn1cblxuLy8gb2NhbWwgZmxpcHMgY2FycnlfaW5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogc3ViX25hdFxuLy9SZXF1aXJlczogZGVjcl9uYXRcbmZ1bmN0aW9uIHN1Yl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGJvcnJvdyA9IChjYXJyeV9pbiA9PSAxKSA/IDAgOiAxO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApIC0gKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSAtIGJvcnJvdztcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYm9ycm93ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlY3JfbmF0KG5hdDEsIG9mczErbGVuMiwgbGVuMS1sZW4yLCAoYm9ycm93PT0xKT8wOjEpO1xufVxuXG4vLyBuYXQxICs9IG5hdDIgKiBuYXQzW29mczNdXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IG11bHRfZGlnaXRfbmF0XG4vL1JlcXVpcmVzOiBhZGRfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIG11bHRfZGlnaXRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGEgPSAobmF0My5kYXRhW29mczNdID4+PiAwKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4MSA9IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApICogKGEgJiAweDAwMDBGRkZGKSArIGNhcnJ5O1xuICAgIHZhciB4MiA9IChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgKiAoYSA+Pj4gMTYpO1xuICAgIGNhcnJ5ID0gTWF0aC5mbG9vcih4Mi82NTUzNik7XG4gICAgdmFyIHgzID0geDEgKyAoeDIgJSA2NTUzNikgKiA2NTUzNjtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHgzO1xuICAgIGNhcnJ5ICs9IE1hdGguZmxvb3IoeDMvNDI5NDk2NzI5Nik7XG4gIH1cblxuICBpZihsZW4yIDwgbGVuMSAmJiBjYXJyeSkge1xuICAgIHJldHVybiBhZGRfbmF0KG5hdDEsIG9mczErbGVuMiwgbGVuMS1sZW4yLCBuYXRfb2ZfYXJyYXkoW2NhcnJ5XSksIDAsIDEsIDApO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYXJyeTtcbiAgfVxufVxuXG4vLyBuYXQxICs9IG5hdDIgKiBuYXQzXG4vLyBsZW4xID49IGxlbjIgKyBsZW4zLlxuLy9Qcm92aWRlczogbXVsdF9uYXRcbi8vUmVxdWlyZXM6IG11bHRfZGlnaXRfbmF0XG5mdW5jdGlvbiBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzLCBsZW4zKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4zOyBpKyspIHtcbiAgICBjYXJyeSArPSBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxK2ksIGxlbjEtaSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0Mywgb2ZzMytpKTtcbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIG5hdDEgPSAyICogbmF0MSArIG5hdDIgKiBuYXQyXG4vLyBsZW4xID49IDIgKiBsZW4yXG4vL1Byb3ZpZGVzOiBzcXVhcmVfbmF0XG4vL1JlcXVpcmVzOiBtdWx0X25hdCwgYWRkX25hdFxuZnVuY3Rpb24gc3F1YXJlX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIGNhcnJ5ICs9IGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0MSwgb2ZzMSwgbGVuMSwgMCk7XG4gIGNhcnJ5ICs9IG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDIsIG9mczIsIGxlbjIpO1xuICByZXR1cm4gY2Fycnk7XG59XG5cblxuLy8gMCA8PSBzaGlmdCA8IDMyXG4vL1Byb3ZpZGVzOiBzaGlmdF9sZWZ0X25hdFxuZnVuY3Rpb24gc2hpZnRfbGVmdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbmJpdHMpIHtcbiAgaWYobmJpdHMgPT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMTsgaSsrKSB7XG4gICAgdmFyIGEgPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApO1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gKGEgPDwgbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA+Pj4gKDMyIC0gbmJpdHMpO1xuICB9XG4gIG5hdDIuZGF0YVtvZnMyXSA9IHdyYXA7XG4gIHJldHVybiAwO1xufVxuXG4vLyBBc3N1bWluZyBjID4gYSwgcmV0dXJucyBbcXVvdGllbnQsIHJlbWFpbmRlcl0gb2YgKGE8PDMyICsgYikvY1xuLy9Qcm92aWRlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2hlbHBlcihhLCBiLCBjKSB7XG4gIHZhciB4ID0gYSAqIDY1NTM2ICsgKGI+Pj4xNik7XG4gIHZhciB5ID0gTWF0aC5mbG9vcih4L2MpICogNjU1MzY7XG4gIHZhciB6ID0gKHggJSBjKSAqIDY1NTM2O1xuICB2YXIgdyA9IHogKyAoYiAmIDB4MDAwMEZGRkYpO1xuICByZXR1cm4gW3kgKyBNYXRoLmZsb29yKHcvYyksIHcgJSBjXTtcbn1cblxuLy8gbmF0MVtvZnMxK2xlbl0gPCBuYXQyW29mczJdXG4vL1Byb3ZpZGVzOiBkaXZfZGlnaXRfbmF0XG4vL1JlcXVpcmVzOiBkaXZfaGVscGVyXG5mdW5jdGlvbiBkaXZfZGlnaXRfbmF0KG5hdHEsIG9mc3EsIG5hdHIsIG9mc3IsIG5hdDEsIG9mczEsIGxlbiwgbmF0Miwgb2ZzMikge1xuICB2YXIgcmVtID0gKG5hdDEuZGF0YVtvZnMxK2xlbi0xXSA+Pj4wKTtcbiAgLy8gbmF0cVtvZnNxK2xlbi0xXSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gKGR1ZSB0byB0aGUgTVNEIHJlcXVpcmVtZW50KSxcbiAgLy8gYW5kIHNob3VsZCBub3QgYmUgd3JpdHRlbiB0by5cbiAgZm9yKHZhciBpID0gbGVuLTI7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHggPSBkaXZfaGVscGVyKHJlbSwgKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSwgKG5hdDIuZGF0YVtvZnMyXSA+Pj4gMCkpO1xuICAgIG5hdHEuZGF0YVtvZnNxK2ldID0geFswXTtcbiAgICByZW0gPSB4WzFdO1xuICB9XG4gIG5hdHIuZGF0YVtvZnNyXSA9IHJlbTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vIG5hdDFbbmF0MjpdIDo9IG5hdDEgLyBuYXQyXG4vLyBuYXQxWzpuYXQyXSA6PSBuYXQxICUgbmF0MlxuLy8gbGVuMSA+IGxlbjIsIG5hdDJbb2ZzMitsZW4yLTFdID4gbmF0MVtvZnMxK2xlbjEtMV1cbi8vUHJvdmlkZXM6IGRpdl9uYXRcbi8vUmVxdWlyZXM6IGRpdl9kaWdpdF9uYXQsIGRpdl9oZWxwZXIsIG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdCwgc2hpZnRfbGVmdF9uYXQsIHNoaWZ0X3JpZ2h0X25hdCwgY3JlYXRlX25hdCwgc2V0X3RvX3plcm9fbmF0LCBtdWx0X2RpZ2l0X25hdCwgc3ViX25hdCwgY29tcGFyZV9uYXQsIG5hdF9vZl9hcnJheVxuZnVuY3Rpb24gZGl2X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIGlmKGxlbjIgPT0gMSkge1xuICAgIGRpdl9kaWdpdF9uYXQobmF0MSwgb2ZzMSsxLCBuYXQxLCBvZnMxLCBuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBzID0gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdDIsIG9mczIrbGVuMi0xKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG5cbiAgdmFyIGQgPSAobmF0Mi5kYXRhW29mczIrbGVuMi0xXSA+Pj4gMCkgKyAxO1xuICB2YXIgYSA9IGNyZWF0ZV9uYXQobGVuMisxKTtcbiAgZm9yICh2YXIgaSA9IGxlbjEgLSAxOyBpID49IGxlbjI7IGktLSkge1xuICAgIC8vIERlY2VudCBsb3dlciBib3VuZCBvbiBxdW9cbiAgICB2YXIgcXVvID0gZCA9PSA0Mjk0OTY3Mjk2ID8gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSA6IGRpdl9oZWxwZXIoKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSwgKG5hdDEuZGF0YVtvZnMxK2ktMV0gPj4+MCksIGQpWzBdO1xuICAgIHNldF90b196ZXJvX25hdChhLCAwLCBsZW4yKzEpO1xuICAgIG11bHRfZGlnaXRfbmF0KGEsIDAsIGxlbjIrMSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFtxdW9dKSwgMCk7XG4gICAgc3ViX25hdChuYXQxLCBvZnMxK2ktbGVuMiwgbGVuMisxLCBhLCAwLCBsZW4yKzEsIDEpO1xuXG4gICAgd2hpbGUgKG5hdDEuZGF0YVtvZnMxK2ldICE9IDAgfHwgY29tcGFyZV9uYXQobmF0MSwgb2ZzMStpLWxlbjIsIGxlbjIsIG5hdDIsIG9mczIsIGxlbjIpID49IDApIHtcbiAgICAgIHF1byA9IHF1byArIDE7XG4gICAgICBzdWJfbmF0KG5hdDEsIG9mczEraS1sZW4yLCBsZW4yKzEsIG5hdDIsIG9mczIsIGxlbjIsIDEpO1xuICAgIH1cblxuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gcXVvO1xuICB9XG5cbiAgc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjIsIG5hdF9vZl9hcnJheShbMF0pLCAwLCBzKTsgLy8gc2hpZnQgcmVtYWluZGVyXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHJlc3RvcmVcbiAgcmV0dXJuIDA7XG59XG5cblxuLy8gMCA8PSBzaGlmdCA8IDMyXG4vL1Byb3ZpZGVzOiBzaGlmdF9yaWdodF9uYXRcbmZ1bmN0aW9uIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZihuYml0cyA9PSAwKSB7XG4gICAgbmF0Mi5kYXRhW29mczJdID0gMDtcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgd3JhcCA9IDA7XG4gIGZvcih2YXIgaSA9IGxlbjEtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgYSA9IG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwO1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gKGEgPj4+IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPDwgKDMyIC0gbmJpdHMpO1xuICB9XG4gIG5hdDIuZGF0YVtvZnMyXSA9IHdyYXA7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wYXJlX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIGNvbXBhcmVfZGlnaXRzX25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIGlmKG5hdDEuZGF0YVtvZnMxXSA+IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIDE7XG4gIGlmKG5hdDEuZGF0YVtvZnMxXSA8IG5hdDIuZGF0YVtvZnMyXSkgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY29tcGFyZV9uYXRcbi8vUmVxdWlyZXM6IG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBjb21wYXJlX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yKSB7XG4gIHZhciBhID0gbnVtX2RpZ2l0c19uYXQobmF0MSwgb2ZzMSwgbGVuMSk7XG4gIHZhciBiID0gbnVtX2RpZ2l0c19uYXQobmF0Miwgb2ZzMiwgbGVuMik7XG4gIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgaWYoYSA8IGIpIHJldHVybiAtMTtcbiAgZm9yKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgPiAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApKSByZXR1cm4gMTtcbiAgICBpZiAoKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSA8IChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkpIHJldHVybiAtMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY29tcGFyZV9uYXRfcmVhbFxuLy9SZXF1aXJlczogY29tcGFyZV9uYXRcbmZ1bmN0aW9uIGNvbXBhcmVfbmF0X3JlYWwobmF0MSxuYXQyKXtcbiAgcmV0dXJuIGNvbXBhcmVfbmF0KG5hdDEsMCxuYXQxLmRhdGEubGVuZ3RoLG5hdDIsMCxuYXQyLmRhdGEubGVuZ3RoKTtcbn1cblxuLy9Qcm92aWRlczogbGFuZF9kaWdpdF9uYXRcbmZ1bmN0aW9uIGxhbmRfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdICY9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGxvcl9kaWdpdF9uYXRcbmZ1bmN0aW9uIGxvcl9kaWdpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMikge1xuICBuYXQxLmRhdGFbb2ZzMV0gfD0gbmF0Mi5kYXRhW29mczJdO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbHhvcl9kaWdpdF9uYXRcbmZ1bmN0aW9uIGx4b3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIF49IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogc2VyaWFsaXplX25hdFxuZnVuY3Rpb24gc2VyaWFsaXplX25hdCh3cml0ZXIsIG5hdCwgc3ope1xuICB2YXIgbGVuID0gbmF0LmRhdGEubGVuZ3RoO1xuICB3cml0ZXIud3JpdGUoMzIsIGxlbik7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgd3JpdGVyLndyaXRlKDMyLCBuYXQuZGF0YVtpXSk7XG4gIH1cbiAgc3pbMF0gPSBsZW4gKiA0O1xuICBzelsxXSA9IGxlbiAqIDg7XG59XG5cbi8vUHJvdmlkZXM6IGRlc2VyaWFsaXplX25hdFxuLy9SZXF1aXJlczogTWxOYXRcbmZ1bmN0aW9uIGRlc2VyaWFsaXplX25hdChyZWFkZXIsIHN6KXtcbiAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBuYXQgPSBuZXcgTWxOYXQobGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKXtcbiAgICBuYXQuZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIH1cbiAgc3pbMF0gPSBsZW4gKiA0O1xuICByZXR1cm4gbmF0O1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IEh1Z28gSGV1emFyZFxuXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblxuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZVxudmFyIGNhbWxfZ3Jfc3RhdGU7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfZ2V0KCkge1xuICBpZihjYW1sX2dyX3N0YXRlKSB7XG4gICAgcmV0dXJuIGNhbWxfZ3Jfc3RhdGU7XG4gIH1cbiAgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLGNhbWxfbmFtZWRfdmFsdWUoXCJHcmFwaGljcy5HcmFwaGljX2ZhaWx1cmVcIiksIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJOb3QgaW5pdGlhbGl6ZWRcIildKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlLGNhbWxfZ3Jfc3RhdGVfaW5pdFxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KSB7XG4gIGNhbWxfZ3Jfc3RhdGU9Y3R4O1xuICBjYW1sX2dyX3N0YXRlX2luaXQoKVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9vcGVuX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fZ3JhcGgoaW5mbyl7XG4gIHZhciBpbmZvID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoaW5mbyk7XG4gIGZ1bmN0aW9uIGdldChuYW1lKXtcbiAgICB2YXIgcmVzID0gaW5mby5tYXRjaChcIihefCwpICpcIituYW1lK1wiICo9ICooW2EtekEtWjAtOV9dKykgKigsfCQpXCIpO1xuICAgIGlmKHJlcykgcmV0dXJuIHJlc1syXTtcbiAgfVxuICB2YXIgc3BlY3MgPSBbXTtcbiAgaWYoIShpbmZvPT1cIlwiKSkgc3BlY3MucHVzaChpbmZvKTtcbiAgdmFyIHRhcmdldCA9IGdldChcInRhcmdldFwiKTtcbiAgaWYoIXRhcmdldCkgdGFyZ2V0PVwiXCI7XG4gIHZhciBzdGF0dXMgPSBnZXQoXCJzdGF0dXNcIik7XG4gIGlmKCFzdGF0dXMpIHNwZWNzLnB1c2goXCJzdGF0dXM9MVwiKVxuXG4gIHZhciB3ID0gZ2V0KFwid2lkdGhcIik7XG4gIHcgPSB3P3BhcnNlSW50KHcpOjIwMDtcbiAgc3BlY3MucHVzaChcIndpZHRoPVwiK3cpO1xuXG4gIHZhciBoID0gZ2V0KFwiaGVpZ2h0XCIpO1xuICBoID0gaD9wYXJzZUludChoKToyMDA7XG4gIHNwZWNzLnB1c2goXCJoZWlnaHQ9XCIraCk7XG5cbiAgdmFyIHdpbiA9IGdsb2JhbFRoaXMub3BlbihcImFib3V0OmJsYW5rXCIsdGFyZ2V0LHNwZWNzLmpvaW4oXCIsXCIpKTtcbiAgaWYoIXdpbikge2NhbWxfZmFpbHdpdGgoXCJHcmFwaGljcy5vcGVuX2dyYXBoOiBjYW5ub3Qgb3BlbiB0aGUgd2luZG93XCIpfVxuICB2YXIgZG9jID0gd2luLmRvY3VtZW50O1xuICB2YXIgY2FudmFzID0gZG9jLmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIGNhbnZhcy53aWR0aCA9IHc7XG4gIGNhbnZhcy5oZWlnaHQgPSBoO1xuICB2YXIgY3R4ID0gY2FtbF9ncl9zdGF0ZV9jcmVhdGUoY2FudmFzLHcsaCk7XG4gIGN0eC5zZXRfdGl0bGUgPSBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICBkb2MudGl0bGUgPSB0aXRsZTtcbiAgfTtcbiAgY2FtbF9ncl9zdGF0ZV9zZXQoY3R4KTtcbiAgdmFyIGJvZHkgPSBkb2MuYm9keTtcbiAgYm9keS5zdHlsZS5tYXJnaW4gPSBcIjBweFwiO1xuICBib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2luaXRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2NvbG9yLGNhbWxfZ3JfbW92ZXRvLGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zZXRfbGluZV93aWR0aCxjYW1sX2dyX3NldF90ZXh0X3NpemUsY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2luaXQoKXtcbiAgY2FtbF9ncl9tb3ZldG8oY2FtbF9ncl9zdGF0ZS54LGNhbWxfZ3Jfc3RhdGUueSk7XG4gIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyhjYW1sX2dyX3N0YXRlLndpZHRoLGNhbWxfZ3Jfc3RhdGUuaGVpZ2h0KTtcbiAgY2FtbF9ncl9zZXRfbGluZV93aWR0aChjYW1sX2dyX3N0YXRlLmxpbmVfd2lkdGgpO1xuICBjYW1sX2dyX3NldF90ZXh0X3NpemUoY2FtbF9ncl9zdGF0ZS50ZXh0X3NpemUpO1xuICBjYW1sX2dyX3NldF9mb250KGNhbWxfZ3Jfc3RhdGUuZm9udCk7XG4gIGNhbWxfZ3Jfc2V0X2NvbG9yKGNhbWxfZ3Jfc3RhdGUuY29sb3IpO1xuICBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUoY2FtbF9ncl9zdGF0ZS50aXRsZSk7XG4gIC8vY2FtbF9ncl9yZXNpemVfd2luZG93IG1pZ2h0IHJlc2V0IHNvbWUgY2FudmFzJyBwcm9wZXJ0aWVzXG4gIGNhbWxfZ3Jfc3RhdGUuY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcyx3LGgpe1xuICB2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gIHJldHVybiB7XG4gICAgY29udGV4dDogY29udGV4dCxcbiAgICBjYW52YXMgOiBjYW52YXMsXG4gICAgeCA6IDAsXG4gICAgeSA6IDAsXG4gICAgd2lkdGggOiB3LFxuICAgIGhlaWdodCA6IGgsXG4gICAgbGluZV93aWR0aCA6IDEsXG4gICAgZm9udCA6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJmaXhlZFwiKSxcbiAgICB0ZXh0X3NpemUgOiAyNixcbiAgICBjb2xvciA6IDB4MDAwMDAwLFxuICAgIHRpdGxlIDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKVxuICB9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RvY19vZl9zdGF0ZVxuZnVuY3Rpb24gY2FtbF9ncl9kb2Nfb2Zfc3RhdGUoc3RhdGUpIHtcbiAgaWYoc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQpXG4gICAgcmV0dXJuIHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Nsb3NlX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbG9zZV9ncmFwaCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gMDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGUobmFtZSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy50aXRsZSA9IG5hbWU7XG4gIHZhciBqc25hbWUgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lKTtcbiAgaWYocy5zZXRfdGl0bGUpIHMuc2V0X3RpdGxlKGpzbmFtZSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3Jlc2l6ZV93aW5kb3codyxoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpXG4gIHMud2lkdGggPSB3O1xuICBzLmhlaWdodCA9IGg7XG4gIHMuY2FudmFzLndpZHRoID0gdztcbiAgcy5jYW52YXMuaGVpZ2h0ID0gaDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xlYXJfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2NsZWFyX2dyYXBoKCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jYW52YXMud2lkdGggPSBzLndpZHRoO1xuICBzLmNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgLy8gIHMuY29udGV4dC5zdHJva2VSZWN0ICgwLiwgMC4sIHMud2lkdGgsIHMuaGVpZ2h0KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3goKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy53aWR0aDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2l6ZV95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zaXplX3koKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy5oZWlnaHQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfY29sb3Jcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9jb2xvcihjb2xvcil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgZnVuY3Rpb24gY29udmVydChudW1iZXIpIHtcbiAgICB2YXIgc3RyID0gJycgKyBudW1iZXIudG9TdHJpbmcoMTYpO1xuICAgIHdoaWxlIChzdHIubGVuZ3RoIDwgMikgc3RyID0gJzAnICsgc3RyO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgdmFyXG4gIHIgPSAoY29sb3IgPj4gMTYpICYgMHhmZixcbiAgZyA9IChjb2xvciA+PiA4KSAgJiAweGZmLFxuICBiID0gKGNvbG9yID4+IDApICAmIDB4ZmY7XG4gIHMuY29sb3I9Y29sb3I7XG4gIHZhciBjX3N0ciA9ICcjJyArIGNvbnZlcnQocikgKyBjb252ZXJ0KGcpICsgY29udmVydChiKTtcbiAgcy5jb250ZXh0LmZpbGxTdHlsZSA9ICAgY19zdHI7XG4gIHMuY29udGV4dC5zdHJva2VTdHlsZSA9IGNfc3RyO1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcGxvdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcGxvdCh4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbT1zLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKDEsMSk7XG4gIHZhciBkID0gaW0uZGF0YTtcbiAgdmFyIGNvbG9yID0gcy5jb2xvcjtcbiAgZFswXSA9IChjb2xvciA+PiAxNikgJiAweGZmOyAvL3JcbiAgZFsxXSA9IChjb2xvciA+PiA4KSAgJiAweGZmLCAvL2dcbiAgZFsyXSA9IChjb2xvciA+PiAwKSAgJiAweGZmOyAvL2JcbiAgZFszXSA9IDB4RkY7IC8vYVxuICBzLng9eDtcbiAgcy55PXk7XG4gIHMuY29udGV4dC5wdXRJbWFnZURhdGEoaW0seCxzLmhlaWdodCAtIHkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9wb2ludF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcG9pbnRfY29sb3IoeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW09cy5jb250ZXh0LmdldEltYWdlRGF0YSh4LHMuaGVpZ2h0IC0geSwxLDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHJldHVybiAoZFswXSA8PCAxNikgKyAoZFsxXSA8PCA4KSArIGRbMl07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX21vdmV0b1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfbW92ZXRvKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy54PXg7XG4gIHMueT15O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jdXJyZW50X3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2N1cnJlbnRfeCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLnhcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF95XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3koKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy55XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2xpbmV0b1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfbGluZXRvKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKHMueCxzLmhlaWdodCAtIHMueSk7XG4gIHMuY29udGV4dC5saW5lVG8oeCxzLmhlaWdodCAtIHkpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHMueD14O1xuICBzLnk9eTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfcmVjdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19yZWN0KHgseSx3LGgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5zdHJva2VSZWN0KHgscy5oZWlnaHQgLSB5LHcsLWgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2FyY19hdXgoY3R4LGN4LGN5LHJ5LHJ4LGExLGEyKXtcbiAgd2hpbGUoYTE+YTIpIGEyKz0zNjA7XG4gIGExIC89IDE4MDtcbiAgYTIgLz0gMTgwO1xuICB2YXIgcm90ID0gMCx4UG9zLHlQb3MseFBvc19wcmV2LHlQb3NfcHJldjtcbiAgdmFyIHNwYWNlID0gMjtcbiAgdmFyIG51bSA9ICgoKGEyIC0gYTEpICogTWF0aC5QSSAqICgocngrcnkpLzIpKSAvIHNwYWNlKSB8IDA7XG4gIHZhciBkZWx0YSA9IChhMiAtIGExKSAqIE1hdGguUEkgLyBudW07XG4gIHZhciBpID0gYTEgKiBNYXRoLlBJO1xuICBmb3IgKHZhciBqPTA7ajw9bnVtO2orKyl7XG4gICAgeFBvcyA9IGN4IC0gKHJ4ICogTWF0aC5zaW4oaSkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgKyAocnkgKiBNYXRoLmNvcyhpKSkgKiBNYXRoLmNvcyhyb3QgKiBNYXRoLlBJKTtcbiAgICB4UG9zID0geFBvcy50b0ZpeGVkKDIpO1xuICAgIHlQb3MgPSBjeSArIChyeSAqIE1hdGguY29zKGkpKSAqIE1hdGguc2luKHJvdCAqIE1hdGguUEkpICsgKHJ4ICogTWF0aC5zaW4oaSkpICogTWF0aC5jb3Mocm90ICogTWF0aC5QSSk7XG4gICAgeVBvcyA9IHlQb3MudG9GaXhlZCgyKTtcbiAgICBpZiAoaj09MCkge1xuICAgICAgY3R4Lm1vdmVUbyh4UG9zLCB5UG9zKTtcbiAgICB9IGVsc2UgaWYgKHhQb3NfcHJldiE9eFBvcyB8fCB5UG9zX3ByZXYhPXlQb3Mpe1xuICAgICAgY3R4LmxpbmVUbyh4UG9zLCB5UG9zKTtcbiAgICB9XG4gICAgeFBvc19wcmV2PXhQb3M7XG4gICAgeVBvc19wcmV2PXlQb3M7XG4gICAgaS09IGRlbHRhOy8vY2N3XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2FyYyh4LHkscngscnksYTEsYTIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCx4LHMuaGVpZ2h0IC0geSxyeCxyeSxhMSxhMik7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NldF9saW5lX3dpZHRoKHcpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMubGluZV93aWR0aCA9IHc7XG4gIHMuY29udGV4dC5saW5lV2lkdGggPSB3XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcmVjdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9yZWN0KHgseSx3LGgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5maWxsUmVjdCh4LHMuaGVpZ2h0IC0geSx3LC1oKTtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfcG9seVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9wb2x5KGFyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIHMuY29udGV4dC5tb3ZlVG8oYXJbMV1bMV0scy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIGZvcih2YXIgaSA9IDI7IGkgPCBhci5sZW5ndGg7IGkrKylcbiAgICBzLmNvbnRleHQubGluZVRvKGFyW2ldWzFdLHMuaGVpZ2h0IC0gYXJbaV1bMl0pO1xuICBzLmNvbnRleHQubGluZVRvKGFyWzFdWzFdLHMuaGVpZ2h0IC0gYXJbMV1bMl0pO1xuICBzLmNvbnRleHQuZmlsbCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9maWxsX2FyY1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXQsIGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX2FyYyh4LHkscngscnksYTEsYTIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgY2FtbF9ncl9hcmNfYXV4KHMuY29udGV4dCx4LHMuaGVpZ2h0IC0geSxyeCxyeSxhMSxhMik7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfc3RyXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X3N0cihzdHIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBtID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KHN0cik7XG4gIHZhciBkeCA9IG0ud2lkdGg7XG4gIHMuY29udGV4dC5maWxsVGV4dChzdHIscy54LHMuaGVpZ2h0IC0gcy55KTtcbiAgcy54ICs9IGR4IHwgMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19jaGFyXG4vL1JlcXVpcmVzOiBjYW1sX2dyX2RyYXdfc3RyXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfY2hhcihjKXtcbiAgY2FtbF9ncl9kcmF3X3N0cihTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyaW5nKHN0cil7XG4gIGNhbWxfZ3JfZHJhd19zdHIoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoc3RyKSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9mb250XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2ZvbnQoZil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5mb250ID0gZjtcbiAgcy5jb250ZXh0LmZvbnQgPSBzLnRleHRfc2l6ZSArIFwicHggXCIgKyBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzLmZvbnQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X3RleHRfc2l6ZShzaXplKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRleHRfc2l6ZSA9IHNpemU7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfdGV4dF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfdGV4dF9zaXplKHR4dCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIHcgPSBzLmNvbnRleHQubWVhc3VyZVRleHQoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcodHh0KSkud2lkdGg7XG4gIHJldHVybiBbMCx3LHMudGV4dF9zaXplXTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX21ha2VfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21ha2VfaW1hZ2UoYXJyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaCA9IGFyci5sZW5ndGggLSAxIDtcbiAgdmFyIHcgPSBhcnJbMV0ubGVuZ3RoIC0gMTtcbiAgdmFyIGltID0gcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh3LGgpO1xuICBmb3IodmFyIGk9MDtpPGg7aSsrKXtcbiAgICBmb3IodmFyIGo9MDtqPHc7aisrKXtcbiAgICAgIHZhciBjID0gYXJyW2krMV1baisxXTtcbiAgICAgIHZhciBvID0gaSoodyo0KSArIChqICogNCk7XG4gICAgICBpZihjID09IC0xKSB7XG4gICAgICAgIGltLmRhdGFbbyArIDBdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgMV0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAyXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGltLmRhdGFbbyArIDBdID0gYyA+PiAxNiAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDFdID0gYyA+PiAgOCAmIDB4ZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gYyA+PiAgMCAmIDBYZmY7XG4gICAgICAgIGltLmRhdGFbbyArIDNdID0gMHhmZjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGltXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2R1bXBfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2R1bXBfaW1hZ2UoaW0pe1xuICB2YXIgZGF0YSA9IFswXVxuICBmb3IodmFyIGk9MDsgaTxpbS5oZWlnaHQ7aSsrKXtcbiAgICBkYXRhW2krMV0gPSBbMF1cbiAgICBmb3IodmFyIGo9MDsgajxpbS53aWR0aDtqKyspe1xuICAgICAgdmFyIG8gPSBpKihpbS53aWR0aCo0KSArIChqICogNCksXG4gICAgICAgICAgciA9IGltLmRhdGFbbyswXSxcbiAgICAgICAgICBnID0gaW0uZGF0YVtvKzFdLFxuICAgICAgICAgIGIgPSBpbS5kYXRhW28rMl07XG4gICAgICBkYXRhW2krMV1baisxXSA9IChyIDw8IDE2KSArIChnIDw8IDgpICsgYlxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YVxufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2ltYWdlKGltLHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgaWYoIWltLmltYWdlKSB7XG4gICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgY2FudmFzLndpZHRoID0gcy53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gcy5oZWlnaHQ7XG4gICAgY2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5wdXRJbWFnZURhdGEoaW0sMCwwKTtcbiAgICB2YXIgaW1hZ2UgPSBuZXcgZ2xvYmFsVGhpcy5JbWFnZSgpO1xuICAgIGltYWdlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHMuY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UseCxzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICAgICAgaW0uaW1hZ2UgPSBpbWFnZTtcbiAgICB9XG4gICAgaW1hZ2Uuc3JjID0gY2FudmFzLnRvRGF0YVVSTChcImltYWdlL3BuZ1wiKTtcbiAgfSBlbHNlIHtcbiAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltLmltYWdlLHgscy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3JlYXRlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jcmVhdGVfaW1hZ2UoeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSh4LHkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9ibGl0X2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9ibGl0X2ltYWdlKGltLHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltMiA9IHMuY29udGV4dC5nZXRJbWFnZURhdGEoeCxzLmhlaWdodCAtIGltLmhlaWdodCAtIHksaW0ud2lkdGgsaW0uaGVpZ2h0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbTIuZGF0YS5sZW5ndGg7IGkrPTQpe1xuICAgIGltLmRhdGFbaV0gPSBpbTIuZGF0YVtpXTtcbiAgICBpbS5kYXRhW2krMV0gPSBpbTIuZGF0YVtpKzFdO1xuICAgIGltLmRhdGFbaSsyXSA9IGltMi5kYXRhW2krMl07XG4gICAgaW0uZGF0YVtpKzNdID0gaW0yLmRhdGFbaSszXTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2lnaW9faGFuZGxlclxuZnVuY3Rpb24gY2FtbF9ncl9zaWdpb19oYW5kbGVyKCl7cmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NpZ2lvX3NpZ25hbFxuZnVuY3Rpb24gY2FtbF9ncl9zaWdpb19zaWduYWwoKXtyZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2FpdF9ldmVudFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93YWl0X2V2ZW50KF9ldmwpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93YWl0X2V2ZW50IG5vdCBJbXBsZW1lbnRlZDogdXNlIEdyYXBoaWNzX2pzIGluc3RlYWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3luY2hyb25pemVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3luY2hyb25pemUgKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9zeW5jaHJvbml6ZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3JlbWVtYmVyX21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVtZW1iZXJfbW9kZSAoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX3JlbWVtYmVyX21vZGUgbm90IEltcGxlbWVudGVkXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kaXNwbGF5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfZGlzcGxheV9tb2RlKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9kaXNwbGF5X21vZGUgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3dpbmRvd19pZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl93aW5kb3dfaWQoYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl93aW5kb3dfaWQgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX29wZW5fc3Vid2luZG93KGEsYixjLGQpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfb3Blbl9zdWJ3aW5kb3cgbm90IEltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Nsb3NlX3N1YndpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3coYSkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3cgbm90IEltcGxlbWVudGVkXCIpO1xufVxuIiwiXG4vL1Byb3ZpZGVzOiBjYW1sX2N1c3RvbV9ldmVudF9pbmRleFxudmFyIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4ID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyXG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9ldmVudF9pbmRleFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyKGV2ZW50X25hbWUsIGV2ZW50X3RhZywgZXZlbnRfdHlwZSkge1xuICBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCArPSAxO1xuICByZXR1cm4gWzAsIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4LCBldmVudF9uYW1lLCBldmVudF90eXBlLCBldmVudF90YWddO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfd3JpdGVcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl93cml0ZShldmVudCwgZXZlbnRfY29udGVudCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmVcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcGF1c2VcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfcGF1c2UoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3JcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfY3JlYXRlX2N1cnNvcih0YXJnZXQpIHtcbiAgcmV0dXJuIHt9O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yKGN1cnNvcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGxcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsKGN1cnNvciwgY2FsbGJhY2tzLCBudW0pIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2NvbnN0YW50c1xudmFyIGNhbWxfbWFyc2hhbF9jb25zdGFudHMgPSB7XG4gIFBSRUZJWF9TTUFMTF9CTE9DSzogICAgICAgICAweDgwLFxuICBQUkVGSVhfU01BTExfSU5UOiAgICAgICAgICAgMHg0MCxcbiAgUFJFRklYX1NNQUxMX1NUUklORzogICAgICAgIDB4MjAsXG4gIENPREVfSU5UODogICAgICAgICAgICAgICAgICAweDAwLFxuICBDT0RFX0lOVDE2OiAgICAgICAgICAgICAgICAgMHgwMSxcbiAgQ09ERV9JTlQzMjogICAgICAgICAgICAgICAgIDB4MDIsXG4gIENPREVfSU5UNjQ6ICAgICAgICAgICAgICAgICAweDAzLFxuICBDT0RFX1NIQVJFRDg6ICAgICAgICAgICAgICAgMHgwNCxcbiAgQ09ERV9TSEFSRUQxNjogICAgICAgICAgICAgIDB4MDUsXG4gIENPREVfU0hBUkVEMzI6ICAgICAgICAgICAgICAweDA2LFxuICBDT0RFX0JMT0NLMzI6ICAgICAgICAgICAgICAgMHgwOCxcbiAgQ09ERV9CTE9DSzY0OiAgICAgICAgICAgICAgIDB4MTMsXG4gIENPREVfU1RSSU5HODogICAgICAgICAgICAgICAweDA5LFxuICBDT0RFX1NUUklORzMyOiAgICAgICAgICAgICAgMHgwQSxcbiAgQ09ERV9ET1VCTEVfQklHOiAgICAgICAgICAgIDB4MEIsXG4gIENPREVfRE9VQkxFX0xJVFRMRTogICAgICAgICAweDBDLFxuICBDT0RFX0RPVUJMRV9BUlJBWThfQklHOiAgICAgMHgwRCxcbiAgQ09ERV9ET1VCTEVfQVJSQVk4X0xJVFRMRTogIDB4MEUsXG4gIENPREVfRE9VQkxFX0FSUkFZMzJfQklHOiAgICAweDBGLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0xJVFRMRTogMHgwNyxcbiAgQ09ERV9DT0RFUE9JTlRFUjogICAgICAgICAgIDB4MTAsXG4gIENPREVfSU5GSVhQT0lOVEVSOiAgICAgICAgICAweDExLFxuICBDT0RFX0NVU1RPTTogICAgICAgICAgICAgICAgMHgxMixcbiAgQ09ERV9DVVNUT01fTEVOOiAgICAgICAgICAgIDB4MTgsXG4gIENPREVfQ1VTVE9NX0ZJWEVEOiAgICAgICAgICAweDE5XG59XG5cblxuLy9Qcm92aWRlczogVUludDhBcnJheVJlYWRlclxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXksIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIFVJbnQ4QXJyYXlSZWFkZXIgKHMsIGkpIHsgdGhpcy5zID0gczsgdGhpcy5pID0gaTsgfVxuVUludDhBcnJheVJlYWRlci5wcm90b3R5cGUgPSB7XG4gIHJlYWQ4dTpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnNbdGhpcy5pKytdOyB9LFxuICByZWFkOHM6ZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zW3RoaXMuaSsrXSA8PCAyNCA+PiAyNDsgfSxcbiAgcmVhZDE2dTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzW2ldIDw8IDgpIHwgc1tpICsgMV1cbiAgfSxcbiAgcmVhZDE2czpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzW2ldIDw8IDI0ID4+IDE2KSB8IHNbaSArIDFdO1xuICB9LFxuICByZWFkMzJ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKChzW2ldIDw8IDI0KSB8IChzW2krMV0gPDwgMTYpIHxcbiAgICAgICAgICAgIChzW2krMl0gPDwgOCkgfCBzW2krM10pID4+PiAwO1xuICB9LFxuICByZWFkMzJzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKHNbaV0gPDwgMjQpIHwgKHNbaSsxXSA8PCAxNikgfFxuICAgICAgKHNbaSsyXSA8PCA4KSB8IHNbaSszXTtcbiAgfSxcbiAgcmVhZHN0cjpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkodGhpcy5zLnN1YmFycmF5KGksIGkgKyBsZW4pKTtcbiAgfSxcbiAgcmVhZHVpbnQ4YXJyYXk6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIHRoaXMucy5zdWJhcnJheShpLCBpICsgbGVuKTtcbiAgfVxufVxuXG5cbi8vUHJvdmlkZXM6IE1sU3RyaW5nUmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBNbFN0cmluZ1JlYWRlciAocywgaSkgeyB0aGlzLnMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpOyB0aGlzLmkgPSBpOyB9XG5NbFN0cmluZ1JlYWRlci5wcm90b3R5cGUgPSB7XG4gIHJlYWQ4dTpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnMuY2hhckNvZGVBdCh0aGlzLmkrKyk7IH0sXG4gIHJlYWQ4czpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnMuY2hhckNvZGVBdCh0aGlzLmkrKykgPDwgMjQgPj4gMjQ7IH0sXG4gIHJlYWQxNnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKVxuICB9LFxuICByZWFkMTZzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKHMuY2hhckNvZGVBdChpKSA8PCAyNCA+PiAxNikgfCBzLmNoYXJDb2RlQXQoaSArIDEpO1xuICB9LFxuICByZWFkMzJ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKChzLmNoYXJDb2RlQXQoaSkgPDwgMjQpIHwgKHMuY2hhckNvZGVBdChpKzEpIDw8IDE2KSB8XG4gICAgICAgICAgICAocy5jaGFyQ29kZUF0KGkrMikgPDwgOCkgfCBzLmNoYXJDb2RlQXQoaSszKSkgPj4+IDA7XG4gIH0sXG4gIHJlYWQzMnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDI0KSB8IChzLmNoYXJDb2RlQXQoaSsxKSA8PCAxNikgfFxuICAgICAgKHMuY2hhckNvZGVBdChpKzIpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkrMyk7XG4gIH0sXG4gIHJlYWRzdHI6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXModGhpcy5zLnN1YnN0cmluZyhpLCBpICsgbGVuKSk7XG4gIH0sXG4gIHJlYWR1aW50OGFycmF5OmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgdmFyIHMgPSB0aGlzLnM7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgZm9yKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICBiW2pdID0gcy5jaGFyQ29kZUF0KGkgKyBqKTtcbiAgICB9XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gYjtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBCaWdTdHJpbmdSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5LCBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBCaWdTdHJpbmdSZWFkZXIgKGJzLCBpKSB7IHRoaXMucyA9IGJzOyB0aGlzLmkgPSBpOyB9XG5CaWdTdHJpbmdSZWFkZXIucHJvdG90eXBlID0ge1xuICByZWFkOHU6ZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FtbF9iYV9nZXRfMSh0aGlzLnMsdGhpcy5pKyspOyB9LFxuICByZWFkOHM6ZnVuY3Rpb24gKCkgeyByZXR1cm4gY2FtbF9iYV9nZXRfMSh0aGlzLnMsdGhpcy5pKyspIDw8IDI0ID4+IDI0OyB9LFxuICByZWFkMTZ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKGNhbWxfYmFfZ2V0XzEocyxpKSA8PCA4KSB8IGNhbWxfYmFfZ2V0XzEocyxpICsgMSlcbiAgfSxcbiAgcmVhZDE2czpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChjYW1sX2JhX2dldF8xKHMsaSkgPDwgMjQgPj4gMTYpIHwgY2FtbF9iYV9nZXRfMShzLGkgKyAxKTtcbiAgfSxcbiAgcmVhZDMydTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuICgoY2FtbF9iYV9nZXRfMShzLGkpICAgPDwgMjQpIHwgKGNhbWxfYmFfZ2V0XzEocyxpKzEpIDw8IDE2KSB8XG4gICAgICAgICAgICAoY2FtbF9iYV9nZXRfMShzLGkrMikgPDwgOCkgIHwgY2FtbF9iYV9nZXRfMShzLGkrMykgICAgICAgICApID4+PiAwO1xuICB9LFxuICByZWFkMzJzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKGNhbWxfYmFfZ2V0XzEocyxpKSAgIDw8IDI0KSB8IChjYW1sX2JhX2dldF8xKHMsaSsxKSA8PCAxNikgfFxuICAgICAgKGNhbWxfYmFfZ2V0XzEocyxpKzIpIDw8IDgpICB8IGNhbWxfYmFfZ2V0XzEocyxpKzMpO1xuICB9LFxuICByZWFkc3RyOmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGxlbilcbiAgICBmb3IodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspe1xuICAgICAgYXJyW2pdID0gY2FtbF9iYV9nZXRfMSh0aGlzLnMsIGkraik7XG4gICAgfVxuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGFycik7XG4gIH0sXG4gIHJlYWR1aW50OGFycmF5OmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoaSk7XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gdGhpcy5zLmRhdGEuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW4pO1xuICB9XG59XG5cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMsIGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKGEpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyAoY2FtbF9pbnQ2NF9vZl9ieXRlcyAoYSkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IE1sU3RyaW5nUmVhZGVyLCBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fc3RyaW5nKHMsb2ZzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgTWxTdHJpbmdSZWFkZXIgKHMsIHR5cGVvZiBvZnM9PVwibnVtYmVyXCI/b2ZzOm9mc1swXSk7XG4gIHJldHVybiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyKHJlYWRlciwgb2ZzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMgbXV0YWJsZVxuLy9SZXF1aXJlczogTWxTdHJpbmdSZWFkZXIsIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIsIGNhbWxfc3RyaW5nX29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMocyxvZnMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBNbFN0cmluZ1JlYWRlciAoY2FtbF9zdHJpbmdfb2ZfYnl0ZXMocyksIHR5cGVvZiBvZnM9PVwibnVtYmVyXCI/b2ZzOm9mc1swXSk7XG4gIHJldHVybiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyKHJlYWRlciwgb2ZzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gIHNpemVbMF0gPSA4O1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyAodCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9tYXJzaGFsKHdyaXRlciwgdiwgc2l6ZXMpIHtcbiAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzICh2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlci53cml0ZSAoOCwgYltpXSk7XG4gIHNpemVzWzBdID0gODsgc2l6ZXNbMV0gPSA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX3VubWFyc2hhbFxuZnVuY3Rpb24gY2FtbF9pbnQzMl91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgc2l6ZVswXSA9IDQ7XG4gIHJldHVybiByZWFkZXIucmVhZDMycyAoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWwocmVhZGVyLCBzaXplKXtcbiAgc3dpdGNoIChyZWFkZXIucmVhZDh1ICgpKSB7XG4gIGNhc2UgMTpcbiAgICBzaXplWzBdID0gNDtcbiAgICByZXR1cm4gcmVhZGVyLnJlYWQzMnMgKCk7XG4gIGNhc2UgMjpcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IG5hdGl2ZSBpbnRlZ2VyIHZhbHVlIHRvbyBsYXJnZVwiKTtcbiAgZGVmYXVsdDogY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbGwtZm9ybWVkIG5hdGl2ZSBpbnRlZ2VyXCIpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF91bm1hcnNoYWwsIGNhbWxfaW50NjRfbWFyc2hhbCwgY2FtbF9pbnQ2NF9jb21wYXJlLCBjYW1sX2ludDY0X2hhc2hcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsLCBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfYmFfc2VyaWFsaXplLCBjYW1sX2JhX2Rlc2VyaWFsaXplLCBjYW1sX2JhX2NvbXBhcmUsIGNhbWxfYmFfaGFzaFxudmFyIGNhbWxfY3VzdG9tX29wcyA9XG4gICAge1wiX2pcIjoge1xuICAgICAgZGVzZXJpYWxpemUgOiBjYW1sX2ludDY0X3VubWFyc2hhbCxcbiAgICAgIHNlcmlhbGl6ZSAgOiBjYW1sX2ludDY0X21hcnNoYWwsXG4gICAgICBmaXhlZF9sZW5ndGggOiA4LFxuICAgICAgY29tcGFyZSA6IGNhbWxfaW50NjRfY29tcGFyZSxcbiAgICAgIGhhc2ggOiBjYW1sX2ludDY0X2hhc2hcbiAgICB9LFxuICAgICBcIl9pXCI6IHtcbiAgICAgICBkZXNlcmlhbGl6ZSA6IGNhbWxfaW50MzJfdW5tYXJzaGFsLFxuICAgICAgIGZpeGVkX2xlbmd0aCA6IDQsXG4gICAgIH0sXG4gICAgIFwiX25cIjoge1xuICAgICAgIGRlc2VyaWFsaXplIDogY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsLFxuICAgICAgIGZpeGVkX2xlbmd0aCA6IDQsXG4gICAgIH0sXG4gICAgIFwiX2JpZ2FycmF5XCI6e1xuICAgICAgIGRlc2VyaWFsaXplIDogKGZ1bmN0aW9uIChyZWFkZXIsIHN6KSB7cmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUgKHJlYWRlcixzeixcIl9iaWdhcnJheVwiKX0pLFxuICAgICAgIHNlcmlhbGl6ZSA6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgICAgIGNvbXBhcmUgOiBjYW1sX2JhX2NvbXBhcmUsXG4gICAgICAgaGFzaDogY2FtbF9iYV9oYXNoLFxuICAgICB9LFxuICAgICBcIl9iaWdhcnIwMlwiOntcbiAgICAgICBkZXNlcmlhbGl6ZSA6IChmdW5jdGlvbiAocmVhZGVyLCBzeikge3JldHVybiBjYW1sX2JhX2Rlc2VyaWFsaXplIChyZWFkZXIsc3osXCJfYmlnYXJyMDJcIil9KSxcbiAgICAgICBzZXJpYWxpemUgOiBjYW1sX2JhX3NlcmlhbGl6ZSxcbiAgICAgICBjb21wYXJlIDogY2FtbF9iYV9jb21wYXJlLFxuICAgICAgIGhhc2g6IGNhbWxfYmFfaGFzaCxcbiAgICAgfVxuICAgIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2Zsb2F0X29mX2J5dGVzLCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IHpzdGRfZGVjb21wcmVzc1xuLy9SZXF1aXJlczogVUludDhBcnJheVJlYWRlclxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIsIG9mcykge1xuICBmdW5jdGlvbiByZWFkdmxxKG92ZXJmbG93KSB7XG4gICAgdmFyIGMgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgdmFyIG4gPSBjICYgMHg3RjtcbiAgICB3aGlsZSAoKGMgJiAweDgwKSAhPSAwKSB7XG4gICAgICBjID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIG43ID0gbiA8PCA3O1xuICAgICAgaWYgKG4gIT0gbjcgPj4gNykgb3ZlcmZsb3dbMF0gPSB0cnVlO1xuICAgICAgbiA9IG43IHwgKGMgJiAweDdGKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgdmFyIG1hZ2ljID0gcmVhZGVyLnJlYWQzMnUgKClcbiAgc3dpdGNoKG1hZ2ljKXtcbiAgY2FzZSAweDg0OTVBNkJFOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovXG4gICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICB2YXIgY29tcHJlc3NlZCA9IDA7XG4gICAgdmFyIGRhdGFfbGVuID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgdmFyIHVuY29tcHJlc3NlZF9kYXRhX2xlbiA9IGRhdGFfbGVuO1xuICAgIHZhciBudW1fb2JqZWN0cyA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgIHZhciBfc2l6ZV8zMiA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgIHZhciBfc2l6ZV82NCA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgIGJyZWFrXG4gIGNhc2UgMHg4NDk1QTZCRDogLyogSW50ZXh0X21hZ2ljX251bWJlcl9jb21wcmVzc2VkICovXG4gICAgdmFyIGhlYWRlcl9sZW4gPSByZWFkZXIucmVhZDh1KCkgJiAweDNGO1xuICAgIHZhciBjb21wcmVzc2VkID0gMTtcbiAgICB2YXIgb3ZlcmZsb3cgPSBbZmFsc2VdO1xuICAgIHZhciBkYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgIHZhciB1bmNvbXByZXNzZWRfZGF0YV9sZW4gPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICB2YXIgbnVtX29iamVjdHMgPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICB2YXIgX3NpemVfMzIgPSByZWFkdmxxIChvdmVyZmxvdyk7XG4gICAgdmFyIF9zaXplXzY0ID0gcmVhZHZscSAob3ZlcmZsb3cpO1xuICAgIGlmKG92ZXJmbG93WzBdKXtcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIHRoaXMgcGxhdGZvcm1cIik7XG4gICAgfVxuICAgIGJyZWFrXG4gIGNhc2UgMHg4NDk1QTZCRjogLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi9cbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcjogb2JqZWN0IHRvbyBsYXJnZSB0byBiZSByZWFkIGJhY2sgb24gYSAzMi1iaXQgcGxhdGZvcm1cIik7XG4gICAgYnJlYWtcbiAgZGVmYXVsdDpcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcjogYmFkIG9iamVjdFwiKTtcbiAgICBicmVhaztcbiAgfVxuICB2YXIgc3RhY2sgPSBbXTtcbiAgdmFyIGludGVybl9vYmpfdGFibGUgPSAobnVtX29iamVjdHMgPiAwKT9bXTpudWxsO1xuICB2YXIgb2JqX2NvdW50ZXIgPSAwO1xuICBmdW5jdGlvbiBpbnRlcm5fcmVjIChyZWFkZXIpIHtcbiAgICB2YXIgY29kZSA9IHJlYWRlci5yZWFkOHUgKCk7XG4gICAgaWYgKGNvZGUgPj0gMHg0MCAvKmNzdC5QUkVGSVhfU01BTExfSU5UKi8pIHtcbiAgICAgIGlmIChjb2RlID49IDB4ODAgLypjc3QuUFJFRklYX1NNQUxMX0JMT0NLKi8pIHtcbiAgICAgICAgdmFyIHRhZyA9IGNvZGUgJiAweEY7XG4gICAgICAgIHZhciBzaXplID0gKGNvZGUgPj4gNCkgJiAweDc7XG4gICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgIGlmIChzaXplID09IDApIHJldHVybiB2O1xuICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiAoY29kZSAmIDB4M0YpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29kZSA+PSAweDIwLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyAqLykge1xuICAgICAgICB2YXIgbGVuID0gY29kZSAmIDB4MUY7XG4gICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIgKGxlbik7XG4gICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2goY29kZSkge1xuICAgICAgICBjYXNlIDB4MDA6IC8vY3N0LkNPREVfSU5UODpcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQ4cyAoKTtcbiAgICAgICAgY2FzZSAweDAxOiAvL2NzdC5DT0RFX0lOVDE2OlxuICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDE2cyAoKTtcbiAgICAgICAgY2FzZSAweDAyOiAvL2NzdC5DT0RFX0lOVDMyOlxuICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDMycyAoKTtcbiAgICAgICAgY2FzZSAweDAzOiAvL2NzdC5DT0RFX0lOVDY0OlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaW50ZWdlciB0b28gbGFyZ2VcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgwNDogLy9jc3QuQ09ERV9TSEFSRUQ4OlxuICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDh1ICgpO1xuICAgICAgICAgIGlmKGNvbXByZXNzZWQgPT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgY2FzZSAweDA1OiAvL2NzdC5DT0RFX1NIQVJFRDE2OlxuICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDE2dSAoKTtcbiAgICAgICAgICBpZihjb21wcmVzc2VkID09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgIGNhc2UgMHgwNjogLy9jc3QuQ09ERV9TSEFSRUQzMjpcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgICAgICAgaWYoY29tcHJlc3NlZCA9PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICBjYXNlIDB4MDg6IC8vY3N0LkNPREVfQkxPQ0szMjpcbiAgICAgICAgICB2YXIgaGVhZGVyID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgICAgICAgdmFyIHRhZyA9IGhlYWRlciAmIDB4RkY7XG4gICAgICAgICAgdmFyIHNpemUgPSBoZWFkZXIgPj4gMTA7XG4gICAgICAgICAgdmFyIHYgPSBbdGFnXTtcbiAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gdjtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDEzOiAvL2NzdC5DT0RFX0JMT0NLNjQ6XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aCAoXCJpbnB1dF92YWx1ZTogZGF0YSBibG9jayB0b28gbGFyZ2VcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgwOTogLy9jc3QuQ09ERV9TVFJJTkc4OlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgdmFyIHYgPSByZWFkZXIucmVhZHN0ciAobGVuKTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwQTogLy9jc3QuQ09ERV9TVFJJTkczMjpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyIChsZW4pO1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBDOiAvL2NzdC5DT0RFX0RPVUJMRV9MSVRUTEU6XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCA4O2krKykgdFs3IC0gaV0gPSByZWFkZXIucmVhZDh1ICgpO1xuICAgICAgICAgIHZhciB2ID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEI6IC8vY3N0LkNPREVfRE9VQkxFX0JJRzpcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IDg7aSsrKSB0W2ldID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBFOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfTElUVExFOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuKzEpO1xuICAgICAgICAgIHZbMF0gPSAyNTQ7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTtpIDw9IGxlbjtpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2W2ldID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEQ6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZOF9CSUc6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICB2YXIgdiA9IG5ldyBBcnJheShsZW4rMSk7XG4gICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxO2kgPD0gbGVuO2krKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdiBbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwNzogLy9jc3QuQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuKzEpO1xuICAgICAgICAgIHZbMF0gPSAyNTQ7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTtpIDw9IGxlbjtpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFs3IC0gal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2W2ldID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEY6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZMzJfQklHOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTtpIDw9IGxlbjtpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHYgW2ldID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MTA6IC8vY3N0LkNPREVfQ09ERVBPSU5URVI6XG4gICAgICAgIGNhc2UgMHgxMTogLy9jc3QuQ09ERV9JTkZJWFBPSU5URVI6XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aCAoXCJpbnB1dF92YWx1ZTogY29kZSBwb2ludGVyXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MTI6IC8vY3N0LkNPREVfQ1VTVE9NOlxuICAgICAgICBjYXNlIDB4MTg6IC8vY3N0LkNPREVfQ1VTVE9NX0xFTjpcbiAgICAgICAgY2FzZSAweDE5OiAvL2NzdC5DT0RFX0NVU1RPTV9GSVhFRDpcbiAgICAgICAgICB2YXIgYywgcyA9IFwiXCI7XG4gICAgICAgICAgd2hpbGUgKChjID0gcmVhZGVyLnJlYWQ4dSAoKSkgIT0gMCkgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlIChjKTtcbiAgICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW3NdO1xuICAgICAgICAgIHZhciBleHBlY3RlZF9zaXplO1xuICAgICAgICAgIGlmKCFvcHMpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHVua25vd24gY3VzdG9tIGJsb2NrIGlkZW50aWZpZXJcIik7XG4gICAgICAgICAgc3dpdGNoKGNvZGUpe1xuICAgICAgICAgIGNhc2UgMHgxMjogLy8gY3N0LkNPREVfQ1VTVE9NIChkZXByZWNhdGVkKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDE5OiAvLyBjc3QuQ09ERV9DVVNUT01fRklYRURcbiAgICAgICAgICAgIGlmKCFvcHMuZml4ZWRfbGVuZ3RoKVxuICAgICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGV4cGVjdGVkIGEgZml4ZWQtc2l6ZSBjdXN0b20gYmxvY2tcIik7XG4gICAgICAgICAgICBleHBlY3RlZF9zaXplID0gb3BzLmZpeGVkX2xlbmd0aDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgxODogLy8gY3N0LkNPREVfQ1VTVE9NX0xFTlxuICAgICAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgICAgICAgICAgLy8gU2tpcCBzaXplNjRcbiAgICAgICAgICAgIHJlYWRlci5yZWFkMzJzKCk7IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG9sZF9wb3MgPSByZWFkZXIuaTtcbiAgICAgICAgICB2YXIgc2l6ZSA9IFswXTtcbiAgICAgICAgICB2YXIgdiA9IG9wcy5kZXNlcmlhbGl6ZShyZWFkZXIsIHNpemUpO1xuICAgICAgICAgIGlmKGV4cGVjdGVkX3NpemUgIT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgIGlmKGV4cGVjdGVkX3NpemUgIT0gc2l6ZVswXSlcbiAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbmNvcnJlY3QgbGVuZ3RoIG9mIHNlcmlhbGl6ZWQgY3VzdG9tIGJsb2NrXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aCAoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBtZXNzYWdlXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmKGNvbXByZXNzZWQpIHtcbiAgICB2YXIgZGF0YSA9IHJlYWRlci5yZWFkdWludDhhcnJheShkYXRhX2xlbik7XG4gICAgdmFyIHJlcyA9IG5ldyBVaW50OEFycmF5KHVuY29tcHJlc3NlZF9kYXRhX2xlbik7XG4gICAgdmFyIHJlcyA9IHpzdGRfZGVjb21wcmVzcyhkYXRhLCByZXMpO1xuICAgIHZhciByZWFkZXIgPSBuZXcgVUludDhBcnJheVJlYWRlcihyZXMsIDApO1xuICB9XG4gIHZhciByZXMgPSBpbnRlcm5fcmVjIChyZWFkZXIpO1xuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIHZhciBzaXplID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIHYgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgZCA9IHYubGVuZ3RoO1xuICAgIGlmIChkIDwgc2l6ZSkgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICB2W2RdID0gaW50ZXJuX3JlYyAocmVhZGVyKTtcbiAgfVxuICBpZiAodHlwZW9mIG9mcyE9XCJudW1iZXJcIikgb2ZzWzBdID0gcmVhZGVyLmk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuLy9WZXJzaW9uOiA8IDUuMS4wXG52YXIgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplID0gMjBcblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplXG4vL1ZlcnNpb246ID49IDUuMS4wXG52YXIgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplID0gMTZcblxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBVSW50OEFycmF5UmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbmZ1bmN0aW9uIGNhbWxfbWFyc2hhbF9kYXRhX3NpemUgKHMsIG9mcykge1xuICB2YXIgciA9IG5ldyBVSW50OEFycmF5UmVhZGVyKGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMocyksIG9mcyk7XG4gIGZ1bmN0aW9uIHJlYWR2bHEob3ZlcmZsb3cpIHtcbiAgICB2YXIgYyA9IHIucmVhZDh1KCk7XG4gICAgdmFyIG4gPSBjICYgMHg3RjtcbiAgICB3aGlsZSAoKGMgJiAweDgwKSAhPSAwKSB7XG4gICAgICBjID0gci5yZWFkOHUoKTtcbiAgICAgIHZhciBuNyA9IG4gPDwgNztcbiAgICAgIGlmIChuICE9IG43ID4+IDcpIG92ZXJmbG93WzBdID0gdHJ1ZTtcbiAgICAgIG4gPSBuNyB8IChjICYgMHg3Rik7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG5cbiAgc3dpdGNoKHIucmVhZDMydSgpKXtcbiAgY2FzZSAweDg0OTVBNkJFOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX3NtYWxsICovXG4gICAgdmFyIGhlYWRlcl9sZW4gPSAyMDtcbiAgICB2YXIgZGF0YV9sZW4gPSByLnJlYWQzMnUoKTtcbiAgICBicmVhaztcbiAgY2FzZSAweDg0OTVBNkJEOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX2NvbXByZXNzZWQgKi9cbiAgICB2YXIgaGVhZGVyX2xlbiA9IHIucmVhZDh1KCkgJiAweDNGO1xuICAgIHZhciBvdmVyZmxvdyA9IFtmYWxzZV07XG4gICAgdmFyIGRhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgaWYob3ZlcmZsb3dbMF0pe1xuICAgICAgY2FtbF9mYWlsd2l0aChcIk1hcnNoYWwuZGF0YV9zaXplOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIpO1xuICAgIH1cbiAgICBicmVha1xuICBjYXNlIDB4ODQ5NUE2QkY6IC8qIEludGV4dF9tYWdpY19udW1iZXJfYmlnICovXG4gIGRlZmF1bHQ6XG4gICAgY2FtbF9mYWlsd2l0aChcIk1hcnNoYWwuZGF0YV9zaXplOiBiYWQgb2JqZWN0XCIpO1xuICAgIGJyZWFrXG4gIH1cbiAgcmV0dXJuIGhlYWRlcl9sZW4gLSBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgKyBkYXRhX2xlbjtcbn1cblxuLy9Qcm92aWRlczogTWxPYmplY3RUYWJsZVxudmFyIE1sT2JqZWN0VGFibGU7XG5pZiAodHlwZW9mIGdsb2JhbFRoaXMuV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgTWxPYmplY3RUYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIC8qIHBvbHlmaWxsICh1c2luZyBsaW5lYXIgc2VhcmNoKSAqL1xuICAgIGZ1bmN0aW9uIE5haXZlTG9va3VwKG9ianMpIHsgdGhpcy5vYmpzID0gb2JqczsgfVxuICAgIE5haXZlTG9va3VwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbih2KSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2Jqcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5vYmpzW2ldID09PSB2KSByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9O1xuICAgIE5haXZlTG9va3VwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcgaGVyZS4gW01sT2JqZWN0VGFibGUuc3RvcmVdIHdpbGwgcHVzaCB0byBbdGhpcy5vYmpzXSBkaXJlY3RseS5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIE1sT2JqZWN0VGFibGUoKSB7XG4gICAgICB0aGlzLm9ianMgPSBbXTsgdGhpcy5sb29rdXAgPSBuZXcgTmFpdmVMb29rdXAodGhpcy5vYmpzKTtcbiAgICB9O1xuICB9KCk7XG59XG5lbHNlIHtcbiAgTWxPYmplY3RUYWJsZSA9IGZ1bmN0aW9uIE1sT2JqZWN0VGFibGUoKSB7XG4gICAgdGhpcy5vYmpzID0gW107IHRoaXMubG9va3VwID0gbmV3IGdsb2JhbFRoaXMuV2Vha01hcCgpO1xuICB9O1xufVxuXG5NbE9iamVjdFRhYmxlLnByb3RvdHlwZS5zdG9yZSA9IGZ1bmN0aW9uKHYpIHtcbiAgdGhpcy5sb29rdXAuc2V0KHYsIHRoaXMub2Jqcy5sZW5ndGgpO1xuICB0aGlzLm9ianMucHVzaCh2KTtcbn1cblxuTWxPYmplY3RUYWJsZS5wcm90b3R5cGUucmVjYWxsID0gZnVuY3Rpb24odikge1xuICB2YXIgaSA9IHRoaXMubG9va3VwLmdldCh2KTtcbiAgcmV0dXJuIChpID09PSB1bmRlZmluZWQpXG4gICAgPyB1bmRlZmluZWQgOiB0aGlzLm9ianMubGVuZ3RoIC0gaTsgICAvKiBpbmRleCBpcyByZWxhdGl2ZSAqL1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9tbF9ieXRlc19sZW5ndGgsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogTWxPYmplY3RUYWJsZSwgY2FtbF9saXN0X3RvX2pzX2FycmF5LCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCxjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbnZhciBjYW1sX291dHB1dF92YWwgPSBmdW5jdGlvbiAoKXtcbiAgZnVuY3Rpb24gV3JpdGVyICgpIHsgdGhpcy5jaHVuayA9IFtdOyB9XG4gIFdyaXRlci5wcm90b3R5cGUgPSB7XG4gICAgY2h1bmtfaWR4OjIwLCBibG9ja19sZW46MCwgb2JqX2NvdW50ZXI6MCwgc2l6ZV8zMjowLCBzaXplXzY0OjAsXG4gICAgd3JpdGU6ZnVuY3Rpb24gKHNpemUsIHZhbHVlKSB7XG4gICAgICBmb3IgKHZhciBpID0gc2l6ZSAtIDg7aSA+PSAwO2kgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4RkY7XG4gICAgfSxcbiAgICB3cml0ZV9hdDpmdW5jdGlvbiAocG9zLCBzaXplLCB2YWx1ZSkge1xuICAgICAgdmFyIHBvcyA9IHBvcztcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODtpID49IDA7aSAtPSA4KVxuICAgICAgICB0aGlzLmNodW5rW3BvcysrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4RkY7XG4gICAgfSxcbiAgICB3cml0ZV9jb2RlOmZ1bmN0aW9uIChzaXplLCBjb2RlLCB2YWx1ZSkge1xuICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9IGNvZGU7XG4gICAgICBmb3IgKHZhciBpID0gc2l6ZSAtIDg7aSA+PSAwO2kgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1t0aGlzLmNodW5rX2lkeCsrXSA9ICh2YWx1ZSA+PiBpKSAmIDB4RkY7XG4gICAgfSxcbiAgICB3cml0ZV9zaGFyZWQ6ZnVuY3Rpb24gKG9mZnNldCkge1xuICAgICAgaWYgKG9mZnNldCA8ICgxIDw8IDgpKSB0aGlzLndyaXRlX2NvZGUoOCwgMHgwNCAvKmNzdC5DT0RFX1NIQVJFRDgqLywgb2Zmc2V0KTtcbiAgICAgIGVsc2UgaWYgKG9mZnNldCA8ICgxIDw8IDE2KSkgdGhpcy53cml0ZV9jb2RlKDE2LCAweDA1IC8qY3N0LkNPREVfU0hBUkVEMTYqLywgb2Zmc2V0KTtcbiAgICAgIGVsc2UgdGhpcy53cml0ZV9jb2RlKDMyLCAweDA2IC8qY3N0LkNPREVfU0hBUkVEMzIqLywgb2Zmc2V0KTtcbiAgICB9LFxuICAgIHBvczpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmNodW5rX2lkeCB9LFxuICAgIGZpbmFsaXplOmZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuYmxvY2tfbGVuID0gdGhpcy5jaHVua19pZHggLSAyMDtcbiAgICAgIHRoaXMuY2h1bmtfaWR4ID0gMDtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCAweDg0OTVBNkJFKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLmJsb2NrX2xlbik7XG4gICAgICB0aGlzLndyaXRlICgzMiwgdGhpcy5vYmpfY291bnRlcik7XG4gICAgICB0aGlzLndyaXRlICgzMiwgdGhpcy5zaXplXzMyKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLnNpemVfNjQpO1xuICAgICAgcmV0dXJuIHRoaXMuY2h1bms7XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiAodiwgZmxhZ3MpIHtcbiAgICBmbGFncyA9IGNhbWxfbGlzdF90b19qc19hcnJheShmbGFncyk7XG5cbiAgICB2YXIgbm9fc2hhcmluZyA9IChmbGFncy5pbmRleE9mKDAgLypNYXJzaGFsLk5vX3NoYXJpbmcqLykgIT09IC0xKSxcbiAgICAgICAgY2xvc3VyZXMgPSAgKGZsYWdzLmluZGV4T2YoMSAvKk1hcnNoYWwuQ2xvc3VyZXMqLykgIT09IC0xKTtcbiAgICAvKiBNYXJzaGFsLkNvbXBhdF8zMiBpcyByZWR1bmRhbnQgc2luY2UgaW50ZWdlcnMgYXJlIDMyLWJpdCBhbnl3YXkgKi9cblxuICAgIGlmIChjbG9zdXJlcylcbiAgICAgIGNvbnNvbGUud2FybihcImluIGNhbWxfb3V0cHV0X3ZhbDogZmxhZyBNYXJzaGFsLkNsb3N1cmVzIGlzIG5vdCBzdXBwb3J0ZWQuXCIpO1xuXG4gICAgdmFyIHdyaXRlciA9IG5ldyBXcml0ZXIgKCk7XG4gICAgdmFyIHN0YWNrID0gW107XG4gICAgdmFyIGludGVybl9vYmpfdGFibGUgPSBub19zaGFyaW5nID8gbnVsbCA6IG5ldyBNbE9iamVjdFRhYmxlKCk7XG5cbiAgICBmdW5jdGlvbiBtZW1vKHYpIHtcbiAgICAgIGlmIChub19zaGFyaW5nKSByZXR1cm4gZmFsc2U7XG4gICAgICB2YXIgZXhpc3Rpbmdfb2Zmc2V0ID0gaW50ZXJuX29ial90YWJsZS5yZWNhbGwodik7XG4gICAgICBpZiAoZXhpc3Rpbmdfb2Zmc2V0KSB7IHdyaXRlci53cml0ZV9zaGFyZWQoZXhpc3Rpbmdfb2Zmc2V0KTsgcmV0dXJuIHRydWU7IH1cbiAgICAgIGVsc2UgeyBpbnRlcm5fb2JqX3RhYmxlLnN0b3JlKHYpOyByZXR1cm4gZmFsc2U7IH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlcm5fcmVjICh2KSB7XG4gICAgICBpZiAodi5jYW1sX2N1c3RvbSkge1xuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbmFtZSA9IHYuY2FtbF9jdXN0b207XG4gICAgICAgIHZhciBvcHMgPSBjYW1sX2N1c3RvbV9vcHNbbmFtZV07XG4gICAgICAgIHZhciBzel8zMl82NCA9IFswLDBdO1xuICAgICAgICBpZighb3BzLnNlcmlhbGl6ZSlcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChDdXN0b20pXCIpO1xuICAgICAgICBpZihvcHMuZml4ZWRfbGVuZ3RoID09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDE4IC8qY3N0LkNPREVfQ1VTVE9NX0xFTiovKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIG5hbWUuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDApO1xuICAgICAgICAgIHZhciBoZWFkZXJfcG9zID0gd3JpdGVyLnBvcyAoKTtcbiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHMuc2VyaWFsaXplKHdyaXRlciwgdiwgc3pfMzJfNjQpO1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zLCAzMiwgc3pfMzJfNjRbMF0pO1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgNCwgMzIsIDApOyAvLyB6ZXJvXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2F0KGhlYWRlcl9wb3MgKyA4LCAzMiwgc3pfMzJfNjRbMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgxOSAvKmNzdC5DT0RFX0NVU1RPTV9GSVhFRCovKTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIG5hbWUuY2hhckNvZGVBdChpKSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlKDgsIDApO1xuICAgICAgICAgIHZhciBvbGRfcG9zID0gd3JpdGVyLnBvcygpO1xuICAgICAgICAgIG9wcy5zZXJpYWxpemUod3JpdGVyLCB2LCBzel8zMl82NCk7XG4gICAgICAgICAgaWYgKG9wcy5maXhlZF9sZW5ndGggIT0gd3JpdGVyLnBvcygpIC0gb2xkX3BvcylcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGluY29ycmVjdCBmaXhlZCBzaXplcyBzcGVjaWZpZWQgYnkgXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAyICsgKChzel8zMl82NFswXSArIDMpID4+IDIpO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAyICsgKChzel8zMl82NFsxXSArIDcpID4+IDMpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEFycmF5ICYmIHZbMF0gPT09ICh2WzBdfDApKSB7XG4gICAgICAgIGlmICh2WzBdID09IDI1MSkge1xuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChBYnN0cmFjdClcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh2WzBdKSlcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJvdXRwdXRfdmFsdWU6IGNvbnRpbnVhdGlvbiB2YWx1ZVwiKTtcbiAgICAgICAgaWYgKHYubGVuZ3RoID4gMSAmJiBtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIGlmICh2WzBdIDwgMTYgJiYgdi5sZW5ndGggLSAxIDwgOClcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4ODAgLypjc3QuUFJFRklYX1NNQUxMX0JMT0NLKi8gKyB2WzBdICsgKCh2Lmxlbmd0aCAtIDEpPDw0KSk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgzMiwgMHgwOCAvKmNzdC5DT0RFX0JMT0NLMzIqLywgKCh2Lmxlbmd0aC0xKSA8PCAxMCkgfCB2WzBdKTtcbiAgICAgICAgd3JpdGVyLnNpemVfMzIgKz0gdi5sZW5ndGg7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IHYubGVuZ3RoO1xuICAgICAgICBpZiAodi5sZW5ndGggPiAxKSBzdGFjay5wdXNoICh2LCAxKTtcbiAgICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgICBpZighKGNhbWxfaXNfbWxfYnl0ZXMoY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKSkpKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogW0J5dGVzLnRdIGNhbm5vdCBzYWZlbHkgYmUgbWFyc2hhbGVkIHdpdGggWy0tZW5hYmxlIHVzZS1qcy1zdHJpbmddXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIHZhciBsZW4gPSBjYW1sX21sX2J5dGVzX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlICg4LCAweDA5Lypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoMzIsIDB4MEEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuO2krKylcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldCh2LGkpKTtcbiAgICAgICAgd3JpdGVyLnNpemVfMzIgKz0gMSArICgoKGxlbiArIDQpIC8gNCl8MCk7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDEgKyAoKChsZW4gKyA4KSAvIDgpfDApO1xuICAgICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHYpO1xuICAgICAgICBpZiAobGVuIDwgMHgyMClcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MjAgLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyovICsgbGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuIDwgMHgxMDApXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUgKDgsIDB4MDkvKmNzdC5DT0RFX1NUUklORzgqLywgbGVuKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlICgzMiwgMHgwQSAvKmNzdC5DT0RFX1NUUklORzMyKi8sIGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCBsZW47aSsrKVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldCh2LGkpKTtcbiAgICAgICAgd3JpdGVyLnNpemVfMzIgKz0gMSArICgoKGxlbiArIDQpIC8gNCl8MCk7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDEgKyAoKChsZW4gKyA4KSAvIDgpfDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHYgIT0gKHZ8MCkpe1xuICAgICAgICAgIHZhciB0eXBlX29mX3YgPSB0eXBlb2YgdjtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIElmIGEgZmxvYXQgaGFwcGVucyB0byBiZSBhbiBpbnRlZ2VyIGl0IGlzIHNlcmlhbGl6ZWQgYXMgYW4gaW50ZWdlclxuICAgICAgICAgIC8vIChKc19vZl9vY2FtbCBjYW5ub3QgdGVsbCB3aGV0aGVyIHRoZSB0eXBlIG9mIGFuIGludGVnZXIgbnVtYmVyIGlzXG4gICAgICAgICAgLy8gZmxvYXQgb3IgaW50ZWdlci4pIFRoaXMgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGNyYXNoZXMgd2hlblxuICAgICAgICAgIC8vIHVubWFyc2hhbGxpbmcgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bnRpbWUuIEl0IHNlZW1zIGJldHRlciB0b1xuICAgICAgICAgIC8vIHN5c3RlbWF0aWNhbGx5IGZhaWwgb24gbWFyc2hhbGxpbmcuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyAgICAgICAgICBpZih0eXBlX29mX3YgIT0gXCJudW1iZXJcIilcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBhYnN0cmFjdCB2YWx1ZSAoXCIrdHlwZV9vZl92K1wiKVwiKTtcbiAgICAgICAgICAvLyAgICAgICAgICB2YXIgdCA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHYpKTtcbiAgICAgICAgICAvLyAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MEIgLypjc3QuQ09ERV9ET1VCTEVfQklHKi8pO1xuICAgICAgICAgIC8vICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGk8ODsgaSsrKXt3cml0ZXIud3JpdGUoOCx0W2ldKX1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2ID49IDAgJiYgdiA8IDB4NDApIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDBYNDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovICsgdik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHYgPj0gLSgxIDw8IDcpICYmIHYgPCAoMSA8PCA3KSlcbiAgICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDgsIDB4MDAgLypjc3QuQ09ERV9JTlQ4Ki8sIHYpO1xuICAgICAgICAgIGVsc2UgaWYgKHYgPj0gLSgxIDw8IDE1KSAmJiB2IDwgKDEgPDwgMTUpKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoMTYsIDB4MDEgLypjc3QuQ09ERV9JTlQxNiovLCB2KTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgzMiwgMHgwMiAvKmNzdC5DT0RFX0lOVDMyKi8sIHYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGV4dGVybl9yZWMgKHYpO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaSA9IHN0YWNrLnBvcCAoKTtcbiAgICAgIHZhciB2ID0gc3RhY2sucG9wICgpO1xuICAgICAgaWYgKGkgKyAxIDwgdi5sZW5ndGgpIHN0YWNrLnB1c2ggKHYsIGkgKyAxKTtcbiAgICAgIGV4dGVybl9yZWMgKHZbaV0pO1xuICAgIH1cbiAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgd3JpdGVyLm9ial9jb3VudGVyID0gaW50ZXJuX29ial90YWJsZS5vYmpzLmxlbmd0aDtcbiAgICB3cml0ZXIuZmluYWxpemUoKTtcbiAgICByZXR1cm4gd3JpdGVyLmNodW5rO1xuICB9XG59ICgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX3N0cmluZ19vZl9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nICh2LCBmbGFncykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkgKGNhbWxfb3V0cHV0X3ZhbCAodiwgZmxhZ3MpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXMgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2J5dGVzX29mX2FycmF5XG5mdW5jdGlvbiBjYW1sX291dHB1dF92YWx1ZV90b19ieXRlcyAodiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfYXJyYXkgKGNhbWxfb3V0cHV0X3ZhbCAodiwgZmxhZ3MpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnVmZmVyXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWwsIGNhbWxfZmFpbHdpdGgsIGNhbWxfYmxpdF9ieXRlc1xuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnVmZmVyIChzLCBvZnMsIGxlbiwgdiwgZmxhZ3MpIHtcbiAgdmFyIHQgPSBjYW1sX291dHB1dF92YWwgKHYsIGZsYWdzKTtcbiAgaWYgKHQubGVuZ3RoID4gbGVuKSBjYW1sX2ZhaWx3aXRoIChcIk1hcnNoYWwudG9fYnVmZmVyOiBidWZmZXIgb3ZlcmZsb3dcIik7XG4gIGNhbWxfYmxpdF9ieXRlcyh0LCAwLCBzLCBvZnMsIHQubGVuZ3RoKTtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIElvXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2Zkc1xudmFyIGNhbWxfc3lzX2ZkcyA9IG5ldyBBcnJheSgzKTtcblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY2xvc2Vcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Zkc1xuZnVuY3Rpb24gY2FtbF9zeXNfY2xvc2UoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3N5c19mZHNbZmRdO1xuICBpZihmaWxlKSBmaWxlLmNsb3NlKCk7XG4gIGRlbGV0ZSBjYW1sX3N5c19mZHNbZmRdO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogTWxGYWtlRmRfb3V0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlLGlkeCkge1xuICBpZihpZHggPT0gdW5kZWZpbmVkKXtcbiAgICBpZHggPSBjYW1sX3N5c19mZHMubGVuZ3RoO1xuICB9XG4gIGNhbWxfc3lzX2Zkc1tpZHhdID0gZmlsZTtcbiAgcmV0dXJuIGlkeCB8IDA7XG59XG5mdW5jdGlvbiBjYW1sX3N5c19vcGVuIChuYW1lLCBmbGFncywgX3Blcm1zKSB7XG4gIHZhciBmID0ge307XG4gIHdoaWxlKGZsYWdzKXtcbiAgICBzd2l0Y2goZmxhZ3NbMV0pe1xuICAgIGNhc2UgMDogZi5yZG9ubHkgPSAxO2JyZWFrO1xuICAgIGNhc2UgMTogZi53cm9ubHkgPSAxO2JyZWFrO1xuICAgIGNhc2UgMjogZi5hcHBlbmQgPSAxO2JyZWFrO1xuICAgIGNhc2UgMzogZi5jcmVhdGUgPSAxO2JyZWFrO1xuICAgIGNhc2UgNDogZi50cnVuY2F0ZSA9IDE7YnJlYWs7XG4gICAgY2FzZSA1OiBmLmV4Y2wgPSAxOyBicmVhaztcbiAgICBjYXNlIDY6IGYuYmluYXJ5ID0gMTticmVhaztcbiAgICBjYXNlIDc6IGYudGV4dCA9IDE7YnJlYWs7XG4gICAgY2FzZSA4OiBmLm5vbmJsb2NrID0gMTticmVhaztcbiAgICB9XG4gICAgZmxhZ3M9ZmxhZ3NbMl07XG4gIH1cbiAgaWYoZi5yZG9ubHkgJiYgZi53cm9ubHkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl9yZG9ubHkgYW5kIE9wZW5fd3Jvbmx5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgaWYoZi50ZXh0ICYmIGYuYmluYXJ5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGNhbWxfanNieXRlc19vZl9zdHJpbmcobmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fdGV4dCBhbmQgT3Blbl9iaW5hcnkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgZmlsZSA9IHJvb3QuZGV2aWNlLm9wZW4ocm9vdC5yZXN0LGYpO1xuICByZXR1cm4gY2FtbF9zeXNfb3Blbl9pbnRlcm5hbCAoZmlsZSwgdW5kZWZpbmVkKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGZpbGUoZmQsIGZsYWdzKSB7XG4gICAgaWYoZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgICAgcmV0dXJuIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoZmQsIGZsYWdzKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIG5ldyBNbEZha2VGZF9vdXQoZmQsIGZsYWdzKVxuICB9XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSgwLHtyZG9ubHk6MSxhbHRuYW1lOlwiL2Rldi9zdGRpblwiLGlzQ2hhcmFjdGVyRGV2aWNlOnRydWV9KSwgMCk7XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSgxLHtidWZmZXJlZDoyLHdyb25seToxLGlzQ2hhcmFjdGVyRGV2aWNlOnRydWV9KSwgMSk7XG4gIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSgyLHtidWZmZXJlZDoyLHdyb25seToxLGlzQ2hhcmFjdGVyRGV2aWNlOnRydWV9KSwgMik7XG59KSgpXG5cblxuLy8gb2NhbWwgQ2hhbm5lbHNcblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX25hbWUoY2hhbmlkLCBuYW1lKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBjaGFuLm5hbWUgPSBuYW1lO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsc1xudmFyIGNhbWxfbWxfY2hhbm5lbHMgPSBuZXcgQXJyYXkoKTtcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdCAoKSB7XG4gIHZhciBsID0gMDtcbiAgZm9yKHZhciBjID0gMDsgYyA8IGNhbWxfbWxfY2hhbm5lbHMubGVuZ3RoOyBjKyspe1xuICAgIGlmKGNhbWxfbWxfY2hhbm5lbHNbY10gJiYgY2FtbF9tbF9jaGFubmVsc1tjXS5vcGVuZWQgJiYgY2FtbF9tbF9jaGFubmVsc1tjXS5vdXQpXG4gICAgICBsPVswLGNhbWxfbWxfY2hhbm5lbHNbY10uZmQsbF07XG4gIH1cbiAgcmV0dXJuIGw7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXQgKGZkKSB7XG4gIHZhciBmaWxlID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYoZmlsZS5mbGFncy5yZG9ubHkpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiZmQgXCIrIGZkICsgXCIgaXMgcmVhZG9ubHlcIik7XG4gIHZhciBidWZmZXJlZCA9IChmaWxlLmZsYWdzLmJ1ZmZlcmVkICE9PSB1bmRlZmluZWQpID8gZmlsZS5mbGFncy5idWZmZXJlZCA6IDE7XG4gIHZhciBjaGFubmVsID0ge1xuICAgIGZpbGU6ZmlsZSxcbiAgICBvZmZzZXQ6ZmlsZS5mbGFncy5hcHBlbmQ/ZmlsZS5sZW5ndGgoKTowLFxuICAgIGZkOmZkLFxuICAgIG9wZW5lZDp0cnVlLFxuICAgIG91dDp0cnVlLFxuICAgIGJ1ZmZlcl9jdXJyOjAsXG4gICAgYnVmZmVyOm5ldyBVaW50OEFycmF5KDY1NTM2KSxcbiAgICBidWZmZXJlZDpidWZmZXJlZFxuICB9O1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5uZWwuZmRdPWNoYW5uZWw7XG4gIHJldHVybiBjaGFubmVsLmZkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogY2FtbF9zeXNfb3BlblxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW4gKGZkKSAge1xuICB2YXIgZmlsZSA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmKGZpbGUuZmxhZ3Mud3Jvbmx5KSBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiKyBmZCArIFwiIGlzIHdyaXRlb25seVwiKTtcbiAgdmFyIHJlZmlsbCA9IG51bGw7XG4gIHZhciBjaGFubmVsID0ge1xuICAgIGZpbGU6ZmlsZSxcbiAgICBvZmZzZXQ6ZmlsZS5mbGFncy5hcHBlbmQ/ZmlsZS5sZW5ndGgoKTowLFxuICAgIGZkOmZkLFxuICAgIG9wZW5lZDp0cnVlLFxuICAgIG91dDogZmFsc2UsXG4gICAgYnVmZmVyX2N1cnI6MCxcbiAgICBidWZmZXJfbWF4OjAsXG4gICAgYnVmZmVyOm5ldyBVaW50OEFycmF5KDY1NTM2KSxcbiAgICByZWZpbGw6cmVmaWxsXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbm5lbC5mZF09Y2hhbm5lbDtcbiAgcmV0dXJuIGNoYW5uZWwuZmQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9jaGFubmVsX2Rlc2NyaXB0b3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbi8vQWxpYXM6IHdpbl9maWxlZGVzY3Jfb2ZfY2hhbm5lbFxuZnVuY3Rpb24gY2FtbF9jaGFubmVsX2Rlc2NyaXB0b3IoY2hhbmlkKXtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjaGFuLmZkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUoY2hhbmlkLG1vZGUpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2hhbi5maWxlLmZsYWdzLnRleHQgPSAhbW9kZVxuICBjaGFuLmZpbGUuZmxhZ3MuYmluYXJ5ID0gbW9kZVxuICByZXR1cm4gMDtcbn1cblxuLy9JbnB1dCBmcm9tIGluX2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9jbG9zZV9jaGFubmVsXG4vL1JlcXVpcmVzOiBjYW1sX21sX2ZsdXNoLCBjYW1sX21sX2NoYW5uZWxzXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19jbG9zZVxuZnVuY3Rpb24gY2FtbF9tbF9jbG9zZV9jaGFubmVsIChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNoYW4ub3BlbmVkID0gZmFsc2U7XG4gIGNhbWxfc3lzX2Nsb3NlKGNoYW4uZmQpXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9jaGFubmVsX3NpemUoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICByZXR1cm4gY2hhbi5maWxlLmxlbmd0aCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCxjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZV82NChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNoYW4uZmlsZS5sZW5ndGggKCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXQoY2hhbmlkLGYpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNoYW4ub3V0cHV0ID0gKGZ1bmN0aW9uIChzKSB7ZihzKX0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsKGNoYW5pZCxmKSB7XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5yZWZpbGwgPSBmO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWZpbGxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfcmVmaWxsIChjaGFuKSB7XG4gIGlmKGNoYW4ucmVmaWxsICE9IG51bGwpe1xuICAgIHZhciBzdHIgPSBjaGFuLnJlZmlsbCgpO1xuICAgIHZhciBzdHJfYSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHN0cik7XG4gICAgaWYgKHN0cl9hLmxlbmd0aCA9PSAwKSB7XG4gICAgICBjaGFuLnJlZmlsbCA9IG51bGxcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZihjaGFuLmJ1ZmZlci5sZW5ndGggPCBjaGFuLmJ1ZmZlcl9tYXggKyBzdHJfYS5sZW5ndGgpe1xuICAgICAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGNoYW4uYnVmZmVyX21heCArIHN0cl9hLmxlbmd0aCk7XG4gICAgICAgIGIuc2V0KGNoYW4uYnVmZmVyKTtcbiAgICAgICAgY2hhbi5idWZmZXIgPSBiO1xuICAgICAgfVxuICAgICAgY2hhbi5idWZmZXIuc2V0KHN0cl9hLGNoYW4uYnVmZmVyX21heCk7XG4gICAgICBjaGFuLm9mZnNldCArPSBzdHJfYS5sZW5ndGg7XG4gICAgICBjaGFuLmJ1ZmZlcl9tYXggKz0gc3RyX2EubGVuZ3RoO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgbnJlYWQgPSBjaGFuLmZpbGUucmVhZChjaGFuLm9mZnNldCwgY2hhbi5idWZmZXIsIGNoYW4uYnVmZmVyX21heCwgY2hhbi5idWZmZXIubGVuZ3RoIC0gY2hhbi5idWZmZXJfbWF4KTtcbiAgICBjaGFuLm9mZnNldCArPSBucmVhZDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggKz0gbnJlYWQ7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dFxuLy9SZXF1aXJlczogY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dCAoY2hhbmlkLCBiLCBpLCBsKSB7XG4gIHZhciBiYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYik7XG4gIHJldHVybiBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCwgYmEsIGksIGwpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfcmVmaWxsLCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2Jsb2NrIChjaGFuaWQsIGJhLCBpLCBsKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICB2YXIgbiA9IGw7XG4gIHZhciBhdmFpbCA9IGNoYW4uYnVmZmVyX21heCAtIGNoYW4uYnVmZmVyX2N1cnI7XG4gIGlmKGwgPD0gYXZhaWwpIHtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VycixjaGFuLmJ1ZmZlcl9jdXJyICsgbCksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gbDtcbiAgfVxuICBlbHNlIGlmKGF2YWlsID4gMCkge1xuICAgIGJhLnNldChjaGFuLmJ1ZmZlci5zdWJhcnJheShjaGFuLmJ1ZmZlcl9jdXJyLGNoYW4uYnVmZmVyX2N1cnIgKyBhdmFpbCksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYXZhaWw7XG4gICAgbiA9IGF2YWlsO1xuICB9IGVsc2Uge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgICBpZihuID4gYXZhaWwpIG4gPSBhdmFpbDtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VycixjaGFuLmJ1ZmZlcl9jdXJyICsgbiksIGkpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gbjtcbiAgfVxuICByZXR1cm4gbiB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUsIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcywgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfcmVmaWxsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWUgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIGhlYWRlciA9IG5ldyBVaW50OEFycmF5KGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGZ1bmN0aW9uIGJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBuKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHdoaWxlKHIgPCBuKXtcbiAgICAgIGlmKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KXtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gICAgICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KVxuICAgICAgICBicmVhaztcbiAgICAgIGJ1ZmZlcltvZmZzZXQrcl0gPSBjaGFuLmJ1ZmZlcltjaGFuLmJ1ZmZlcl9jdXJyXTtcbiAgICAgIGNoYW4uYnVmZmVyX2N1cnIrKztcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgdmFyIHIgPSBibG9jayhoZWFkZXIsIDAsIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGlmKHIgPT0gMClcbiAgICBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIGVsc2UgaWYgKHIgPCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpXG4gICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB0cnVuY2F0ZWQgb2JqZWN0XCIpO1xuICB2YXIgbGVuID0gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSAoY2FtbF9ieXRlc19vZl9hcnJheShoZWFkZXIpLCAwKTtcbiAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbiArIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSk7XG4gIGJ1Zi5zZXQoaGVhZGVyLDApO1xuICB2YXIgciA9IGJsb2NrKGJ1ZiwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplLCBsZW4pXG4gIGlmKHIgPCBsZW4pXG4gICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB0cnVuY2F0ZWQgb2JqZWN0IFwiICsgciArIFwiICBcIiArIGxlbik7XG4gIHZhciBvZmZzZXQgPSBbMF07XG4gIHZhciByZXMgPSBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMoY2FtbF9ieXRlc19vZl9hcnJheShidWYpLCBvZmZzZXQpO1xuICBjaGFuLm9mZnNldCA9IGNoYW4ub2Zmc2V0ICsgb2Zmc2V0WzBdO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX3RvX291dHNpZGVfaGVhcFxuLy9SZXF1aXJlczogY2FtbF9pbnB1dF92YWx1ZVxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV90b19vdXRzaWRlX2hlYXAoYykge1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZShjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dF9jaGFyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlLCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3JlZmlsbFxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9jaGFyIChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGlmKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KXtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICB9XG4gIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heClcbiAgICBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIHZhciByZXMgPSBjaGFuLmJ1ZmZlcltjaGFuLmJ1ZmZlcl9jdXJyXTtcbiAgY2hhbi5idWZmZXJfY3VycisrO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9tbF9pbnB1dF9jaGFyLCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2ludCAoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICB2YXIgcmVzID0gMDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IDQ7IGkrKyl7XG4gICAgcmVzID0gKHJlcyA8PCA4KSArIGNhbWxfbWxfaW5wdXRfY2hhcihjaGFuaWQpIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zZWVrX2luXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9zZWVrX2luKGNoYW5pZCwgcG9zKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBpZiAoY2hhbi5yZWZpbGwgIT0gbnVsbCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJJbGxlZ2FsIHNlZWtcIik7XG4gIGlmKHBvcyA+PSBjaGFuLm9mZnNldCAtIGNoYW4uYnVmZmVyX21heFxuICAgICAmJiBwb3MgPD0gY2hhbi5vZmZzZXRcbiAgICAgJiYgY2hhbi5maWxlLmZsYWdzLmJpbmFyeSkge1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSBjaGFuLmJ1ZmZlcl9tYXggLSAoY2hhbi5vZmZzZXQgLSBwb3MpO1xuICB9IGVsc2Uge1xuICAgIGNoYW4ub2Zmc2V0ID0gcG9zO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19pblxuLy9SZXF1aXJlczogY2FtbF9zZWVrX2luXG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfaW4oY2hhbmlkLHBvcyl7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLHBvcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19pbl82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19mbG9hdCwgY2FtbF9zZWVrX2luXG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfaW5fNjQoY2hhbmlkLHBvcyl7XG4gIHZhciBwb3MgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICByZXR1cm4gY2hhbi5vZmZzZXQgLSAoY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycikgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19pblxuLy9SZXF1aXJlczogY2FtbF9wb3NfaW5cbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX2luKGNoYW5pZCkge1xuICByZXR1cm4gY2FtbF9wb3NfaW4oY2hhbmlkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3NfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfcG9zX2luXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbl82NChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2FtbF9wb3NfaW4oY2hhbmlkKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3JlZmlsbFxuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmUoY2hhbmlkKXtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHZhciBwID0gY2hhbi5idWZmZXJfY3VycjtcbiAgZG8ge1xuICAgIGlmKHAgPj0gY2hhbi5idWZmZXJfbWF4KSB7XG4gICAgICBpZihjaGFuLmJ1ZmZlcl9jdXJyID4gMCkge1xuICAgICAgICBjaGFuLmJ1ZmZlci5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VyciksMCk7XG4gICAgICAgIHAgLT0gY2hhbi5idWZmZXJfY3VycjtcbiAgICAgICAgY2hhbi5idWZmZXJfbWF4IC09IGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgICAgfVxuICAgICAgaWYoY2hhbi5idWZmZXJfbWF4ID49IGNoYW4uYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLShjaGFuLmJ1ZmZlcl9tYXgpIHwgMDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2X21heCA9IGNoYW4uYnVmZmVyX21heDtcbiAgICAgIGNhbWxfcmVmaWxsIChjaGFuKTtcbiAgICAgIGlmKHByZXZfbWF4ID09IGNoYW4uYnVmZmVyX21heCkge1xuICAgICAgICByZXR1cm4gLShjaGFuLmJ1ZmZlcl9tYXgpIHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH0gd2hpbGUgKGNoYW4uYnVmZmVyW3ArK10gIT0gMTApO1xuICByZXR1cm4gKHAgLSBjaGFuLmJ1ZmZlcl9jdXJyKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZmx1c2hcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxzXG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYoISBjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3QgZmx1c2ggYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgaWYoIWNoYW4uYnVmZmVyIHx8IGNoYW4uYnVmZmVyX2N1cnIgPT0gMCkgcmV0dXJuIDA7XG4gIGlmKGNoYW4ub3V0cHV0KSB7XG4gICAgY2hhbi5vdXRwdXQoY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGNoYW4uYnVmZmVyLCAwLCBjaGFuLmJ1ZmZlcl9jdXJyKSk7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5maWxlLndyaXRlKGNoYW4ub2Zmc2V0LCBjaGFuLmJ1ZmZlciwgMCwgY2hhbi5idWZmZXJfY3Vycik7XG4gIH1cbiAgY2hhbi5vZmZzZXQgKz0gY2hhbi5idWZmZXJfY3VycjtcbiAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gIHJldHVybiAwO1xufVxuXG4vL291dHB1dCB0byBvdXRfY2hhbm5lbFxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9mbHVzaCxjYW1sX21sX2J5dGVzX2xlbmd0aFxuLy9SZXF1aXJlczogY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9ieXRlcyhjaGFuaWQsYnVmZmVyLG9mZnNldCxsZW4pIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGlmKCEgY2hhbi5vcGVuZWQpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQ2Fubm90IG91dHB1dCB0byBhIGNsb3NlZCBjaGFubmVsXCIpO1xuICB2YXIgYnVmZmVyID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhidWZmZXIpO1xuICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyBsZW4pO1xuICBpZihjaGFuLmJ1ZmZlcl9jdXJyICsgYnVmZmVyLmxlbmd0aCA+IGNoYW4uYnVmZmVyLmxlbmd0aCkge1xuICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoY2hhbi5idWZmZXJfY3VyciArIGJ1ZmZlci5sZW5ndGgpO1xuICAgIGIuc2V0KGNoYW4uYnVmZmVyKTtcbiAgICBjaGFuLmJ1ZmZlciA9IGJcbiAgfVxuICBzd2l0Y2goY2hhbi5idWZmZXJlZCl7XG4gIGNhc2UgMDogLy8gVW5idWZmZXJlZFxuICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICBjYW1sX21sX2ZsdXNoIChjaGFuaWQpO1xuICAgIGJyZWFrXG4gIGNhc2UgMTogLy8gQnVmZmVyZWQgKHRoZSBkZWZhdWx0KVxuICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICBpZihjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyLmxlbmd0aClcbiAgICAgIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgMjogLy8gQnVmZmVyZWQgKG9ubHkgZm9yIHN0ZG91dCBhbmQgc3RkZXJyKVxuICAgIHZhciBpZCA9IGJ1ZmZlci5sYXN0SW5kZXhPZigxMClcbiAgICBpZihpZCA8IDApIHtcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlci5sZW5ndGgpXG4gICAgICAgIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheSgwLCBpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gaWQgKyAxO1xuICAgICAgY2FtbF9tbF9mbHVzaCAoY2hhbmlkKTtcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIuc3ViYXJyYXkoaWQgKyAxKSwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGggLSBpZCAtIDE7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dFxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dChjaGFuaWQsYnVmZmVyLG9mZnNldCxsZW4pe1xuICByZXR1cm4gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGJ1ZmZlciksb2Zmc2V0LGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9jaGFyIChjaGFuaWQsYykge1xuICB2YXIgcyA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoU3RyaW5nLmZyb21DaGFyQ29kZShjKSk7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxzLDAsMSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nLCBjYW1sX21sX291dHB1dCxjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlIChjaGFuaWQsdixmbGFncykge1xuICB2YXIgcyA9IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyh2LCBmbGFncyk7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxzLDAsY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zZWVrX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9zZWVrX291dChjaGFuaWQsIHBvcyl7XG4gIGNhbWxfbWxfZmx1c2goY2hhbmlkKTtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNoYW4ub2Zmc2V0ID0gcG9zO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZWVrX291dFxuLy9SZXF1aXJlczogY2FtbF9zZWVrX291dFxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX291dChjaGFuaWQscG9zKXtcbiAgcmV0dXJuIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpO1xufVxuLy9Qcm92aWRlczogY2FtbF9tbF9zZWVrX291dF82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19mbG9hdCwgY2FtbF9zZWVrX291dFxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX291dF82NChjaGFuaWQscG9zKXtcbiAgdmFyIHBvcyA9IGNhbWxfaW50NjRfdG9fZmxvYXQocG9zKTtcbiAgcmV0dXJuIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfcG9zX291dChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjaGFuLm9mZnNldCArIGNoYW4uYnVmZmVyX2N1cnJcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3Nfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX3Bvc19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX291dChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfcG9zX291dChjaGFuaWQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfcG9zX291dFxuZnVuY3Rpb24gY2FtbF9tbF9wb3Nfb3V0XzY0KGNoYW5pZCkge1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9mbG9hdCAoY2FtbF9wb3Nfb3V0KGNoYW5pZCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheVxuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfaW50IChjaGFuaWQsaSkge1xuICB2YXIgYXJyID0gWyhpPj4yNCkgJiAweEZGLChpPj4xNikgJiAweEZGLChpPj44KSAmIDB4RkYsaSAmIDB4RkYgXTtcbiAgdmFyIHMgPSBjYW1sX3N0cmluZ19vZl9hcnJheShhcnIpO1xuICBjYW1sX21sX291dHB1dChjaGFuaWQscywwLDQpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lzX2J1ZmZlcmVkXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2lzX2J1ZmZlcmVkKGNoYW5pZCkge1xuICByZXR1cm4gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdLmJ1ZmZlcmVkID8gMSA6IDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfYnVmZmVyZWRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2J1ZmZlcmVkKGNoYW5pZCx2KSB7XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5idWZmZXJlZCA9IHY7XG4gIGlmKCF2KSBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gIHJldHVybiAwXG59XG4iLCJcblxuLy9Qcm92aWRlczogY2FtbF9nY19taW5vclxuZnVuY3Rpb24gY2FtbF9nY19taW5vcih1bml0KXtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5nYyh0cnVlKTtcbiAgcmV0dXJuIDBcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWFqb3JcbmZ1bmN0aW9uIGNhbWxfZ2NfbWFqb3IodW5pdCl7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuZ2MoKTtcbiAgcmV0dXJuIDBcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfZnVsbF9tYWpvclxuZnVuY3Rpb24gY2FtbF9nY19mdWxsX21ham9yKHVuaXQpe1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLmdjKCk7XG4gIHJldHVybiAwXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvbXBhY3Rpb25cbmZ1bmN0aW9uIGNhbWxfZ2NfY29tcGFjdGlvbigpeyByZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY291bnRlcnNcbmZ1bmN0aW9uIGNhbWxfZ2NfY291bnRlcnMoKSB7IHJldHVybiBbMjU0LDAsMCwwXSB9XG4vL1Byb3ZpZGVzOiBjYW1sX2djX3F1aWNrX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2NfcXVpY2tfc3RhdCgpe1xuICByZXR1cm4gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc3RhdFxuZnVuY3Rpb24gY2FtbF9nY19zdGF0KCkge1xuICByZXR1cm4gWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19zZXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc2V0KF9jb250cm9sKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX2dldFxuZnVuY3Rpb24gY2FtbF9nY19nZXQoKXtcbiAgcmV0dXJuIFswLDAsMCwwLDAsMCwwLDAsMF1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3NldFxuZnVuY3Rpb24gY2FtbF9tZW1wcm9mX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maW5hbF9yZWdpc3RlciBjb25zdFxuZnVuY3Rpb24gY2FtbF9maW5hbF9yZWdpc3RlciAoKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWVcbnZhciBhbGxfZmluYWxpemVycyA9IG5ldyBnbG9iYWxUaGlzLlNldCgpXG5mdW5jdGlvbiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlIChjYiwgYSkge1xuICBpZihnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5ICYmIGEgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICB2YXIgeCA9IG5ldyBnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5KGZ1bmN0aW9uICh4KXthbGxfZmluYWxpemVycy5kZWxldGUoeCk7IGNiKDApOyByZXR1cm47fSk7XG4gICAgeC5yZWdpc3RlcihhLHgpO1xuICAgIGFsbF9maW5hbGl6ZXJzLmFkZCh4KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maW5hbF9yZWxlYXNlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZpbmFsX3JlbGVhc2UgKCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2Zfc3RhcnRcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdGFydChyYXRlLHN0YWNrX3NpemUsdHJhY2tlcil7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2Zfc3RvcFxuZnVuY3Rpb24gY2FtbF9tZW1wcm9mX3N0b3AodW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ldmVudGxvZ19yZXN1bWVcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcmVzdW1lKHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9ldmVudGxvZ19wYXVzZVxuZnVuY3Rpb24gY2FtbF9ldmVudGxvZ19wYXVzZSh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudFxuZnVuY3Rpb24gY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50KHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nY19tYWpvcl9zbGljZVxuZnVuY3Rpb24gY2FtbF9nY19tYWpvcl9zbGljZSh3b3JrKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWlub3Jfd29yZHNcbmZ1bmN0aW9uIGNhbWxfZ2NfbWlub3Jfd29yZHModW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9taW5vcl9mcmVlXG5mdW5jdGlvbiBjYW1sX2dldF9taW5vcl9mcmVlKHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfYnVja2V0XG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9idWNrZXQobikgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9tYWpvcl9jcmVkaXRcbmZ1bmN0aW9uIGNhbWxfZ2V0X21ham9yX2NyZWRpdChuKSB7IHJldHVybiAwOyB9XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZCwgQW5keSBSYXlcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbi8vXG4vLyBCaWdhcnJheS5cbi8vXG4vLyAtIGFsbCBiaWdhcnJheSB0eXBlcyBpbmNsdWRpbmcgSW50NjQgYW5kIENvbXBsZXguXG4vLyAtIGZvcnRyYW4gKyBjIGxheW91dHNcbi8vIC0gc3ViL3NsaWNlL3Jlc2hhcGVcbi8vIC0gcmV0YWluIGZhc3QgcGF0aCBmb3IgMWQgYXJyYXkgYWNjZXNzXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfaW5pdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9iYV9pbml0KCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplKGRpbXMpIHtcbiAgdmFyIG5fZGltcyA9IGRpbXMubGVuZ3RoO1xuICB2YXIgc2l6ZSA9IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbl9kaW1zOyBpKyspIHtcbiAgICBpZiAoZGltc1tpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5jcmVhdGU6IG5lZ2F0aXZlIGRpbWVuc2lvblwiKTtcbiAgICBzaXplID0gc2l6ZSAqIGRpbXNbaV07XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCl7XG4gIHN3aXRjaChraW5kKXtcbiAgY2FzZSA3OiBjYXNlIDEwOiBjYXNlIDExOiByZXR1cm4gMjtcbiAgZGVmYXVsdDogcmV0dXJuIDE7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBzaXplKXtcbiAgdmFyIHZpZXc7XG4gIHN3aXRjaChraW5kKXtcbiAgY2FzZSAwOiAgdmlldyA9IEZsb2F0MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgMTogIHZpZXcgPSBGbG9hdDY0QXJyYXk7IGJyZWFrO1xuICBjYXNlIDI6ICB2aWV3ID0gSW50OEFycmF5OyBicmVhaztcbiAgY2FzZSAzOiAgdmlldyA9IFVpbnQ4QXJyYXk7IGJyZWFrO1xuICBjYXNlIDQ6ICB2aWV3ID0gSW50MTZBcnJheTsgYnJlYWs7XG4gIGNhc2UgNTogIHZpZXcgPSBVaW50MTZBcnJheTsgYnJlYWs7XG4gIGNhc2UgNjogIHZpZXcgPSBJbnQzMkFycmF5OyBicmVhaztcbiAgY2FzZSA3OiAgdmlldyA9IEludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDg6ICB2aWV3ID0gSW50MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgOTogIHZpZXcgPSBJbnQzMkFycmF5OyBicmVhaztcbiAgY2FzZSAxMDogdmlldyA9IEZsb2F0MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgMTE6IHZpZXcgPSBGbG9hdDY0QXJyYXk7IGJyZWFrO1xuICBjYXNlIDEyOiB2aWV3ID0gVWludDhBcnJheTsgYnJlYWs7XG4gIH1cbiAgaWYgKCF2aWV3KSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5jcmVhdGU6IHVuc3VwcG9ydGVkIGtpbmRcIik7XG4gIHZhciBkYXRhID0gbmV3IHZpZXcoc2l6ZSAqIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCkpO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9WZXJzaW9uOiA8IDQuMTFcbnZhciBjYW1sX2JhX2N1c3RvbV9uYW1lID0gXCJfYmlnYXJyYXlcIlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2N1c3RvbV9uYW1lXG4vL1ZlcnNpb246ID49IDQuMTFcbnZhciBjYW1sX2JhX2N1c3RvbV9uYW1lID0gXCJfYmlnYXJyMDJcIlxuXG4vL1Byb3ZpZGVzOiBNbF9CaWdhcnJheVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2N1c3RvbV9uYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaSwgY2FtbF9pbnQ2NF9oaTMyLCBjYW1sX2ludDY0X2xvMzJcbmZ1bmN0aW9uIE1sX0JpZ2FycmF5IChraW5kLCBsYXlvdXQsIGRpbXMsIGJ1ZmZlcikge1xuXG4gIHRoaXMua2luZCAgID0ga2luZCA7XG4gIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICB0aGlzLmRpbXMgICA9IGRpbXM7XG4gIHRoaXMuZGF0YSA9IGJ1ZmZlcjtcbn1cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLmNhbWxfY3VzdG9tID0gY2FtbF9iYV9jdXN0b21fbmFtZTtcblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgdmFyIG9mcyA9IDA7XG4gIGlmKHR5cGVvZiBhcmcgPT09IFwibnVtYmVyXCIpIGFyZyA9IFthcmddO1xuICBpZiAoISAoYXJnIGluc3RhbmNlb2YgQXJyYXkpKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJiaWdhcnJheS5qczogaW52YWxpZCBvZmZzZXRcIik7XG4gIGlmICh0aGlzLmRpbXMubGVuZ3RoICE9IGFyZy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuZ2V0L3NldDogYmFkIG51bWJlciBvZiBkaW1lbnNpb25zXCIpO1xuICBpZih0aGlzLmxheW91dCA9PSAwIC8qIGNfbGF5b3V0ICovKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcmdbaV0gPCAwIHx8IGFyZ1tpXSA+PSB0aGlzLmRpbXNbaV0pXG4gICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgIG9mcyA9IChvZnMgKiB0aGlzLmRpbXNbaV0pICsgYXJnW2ldO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5kaW1zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoYXJnW2ldIDwgMSB8fCBhcmdbaV0gPiB0aGlzLmRpbXNbaV0pe1xuICAgICAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gICAgICB9XG4gICAgICBvZnMgPSAob2ZzICogdGhpcy5kaW1zW2ldKSArIChhcmdbaV0gLSAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9mcztcbn1cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChvZnMpIHtcbiAgc3dpdGNoKHRoaXMua2luZCl7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIHZhciBsID0gdGhpcy5kYXRhW29mcyAqIDIgKyAwXTtcbiAgICB2YXIgaCA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpKGwsaCk7XG4gIGNhc2UgMTA6IGNhc2UgMTE6XG4gICAgLy8gQ29tcGxleDMyLCBDb21wbGV4NjRcbiAgICB2YXIgciA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMF07XG4gICAgdmFyIGkgPSB0aGlzLmRhdGFbb2ZzICogMiArIDFdO1xuICAgIHJldHVybiBbMjU0LCByLCBpXTtcbiAgZGVmYXVsdDpcbiAgICByZXR1cm4gdGhpcy5kYXRhW29mc11cbiAgfVxufVxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG9mcyx2KSB7XG4gIHN3aXRjaCh0aGlzLmtpbmQpe1xuICBjYXNlIDc6XG4gICAgLy8gSW50NjRcbiAgICB0aGlzLmRhdGFbb2ZzICogMiArIDBdID0gY2FtbF9pbnQ2NF9sbzMyKHYpO1xuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IGNhc2UgMTE6XG4gICAgLy8gQ29tcGxleDMyLCBDb21wbGV4NjRcbiAgICB0aGlzLmRhdGFbb2ZzICogMiArIDBdID0gdlsxXTtcbiAgICB0aGlzLmRhdGFbb2ZzICogMiArIDFdID0gdlsyXTtcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICB0aGlzLmRhdGFbb2ZzXSA9IHY7XG4gICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uICh2KSB7XG4gIHN3aXRjaCh0aGlzLmtpbmQpe1xuICBjYXNlIDc6XG4gICAgLy8gSW50NjRcbiAgICB2YXIgYSA9IGNhbWxfaW50NjRfbG8zMih2KTtcbiAgICB2YXIgYiA9IGNhbWxfaW50NjRfaGkzMih2KTtcbiAgICBpZihhID09IGIpe1xuICAgICAgdGhpcy5kYXRhLmZpbGwoYSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yKHZhciBpID0gMDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgICB0aGlzLmRhdGFbaV0gPSAoaSUyID09IDApID8gYSA6IGI7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiBjYXNlIDExOlxuICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgdmFyIGltID0gdlsxXTtcbiAgICB2YXIgcmUgPSB2WzJdO1xuICAgIGlmKGltID09IHJlKXtcbiAgICAgIHRoaXMuZGF0YS5maWxsKGltKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHRoaXMuZGF0YVtpXSA9IChpJTIgPT0gMCkgPyBpbSA6IHJlO1xuICAgICAgfVxuICAgIH1cbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgICBicmVhaztcbiAgfVxufVxuXG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24gKGIsIHRvdGFsKSB7XG4gIGlmICh0aGlzLmxheW91dCAhPSBiLmxheW91dCB8fCB0aGlzLmtpbmQgIT0gYi5raW5kKSB7XG4gICAgdmFyIGsxID0gdGhpcy5raW5kIHwgKHRoaXMubGF5b3V0IDw8IDgpO1xuICAgIHZhciBrMiA9ICAgIGIua2luZCB8IChiLmxheW91dCA8PCA4KTtcbiAgICByZXR1cm4gazIgLSBrMTtcbiAgfVxuICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPSBiLmRpbXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGIuZGltcy5sZW5ndGggLSB0aGlzLmRpbXMubGVuZ3RoO1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmICh0aGlzLmRpbXNbaV0gIT0gYi5kaW1zW2ldKVxuICAgICAgcmV0dXJuICh0aGlzLmRpbXNbaV0gPCBiLmRpbXNbaV0pID8gLTEgOiAxO1xuICBzd2l0Y2ggKHRoaXMua2luZCkge1xuICBjYXNlIDA6XG4gIGNhc2UgMTpcbiAgY2FzZSAxMDpcbiAgY2FzZSAxMTpcbiAgICAvLyBGbG9hdHNcbiAgICB2YXIgeCwgeTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgeCA9IHRoaXMuZGF0YVtpXTtcbiAgICAgIHkgPSBiLmRhdGFbaV07XG4gICAgICBpZiAoeCA8IHkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICh4ID4geSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBpZiAoeCAhPSB5KSB7XG4gICAgICAgIGlmICghdG90YWwpIHJldHVybiBOYU47XG4gICAgICAgIGlmICh4ID09IHgpIHJldHVybiAxO1xuICAgICAgICBpZiAoeSA9PSB5KSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDc6XG4gICAgLy8gSW50NjRcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrPTIpIHtcbiAgICAgIC8vIENoZWNrIGhpZ2hlc3QgYml0cyBmaXJzdFxuICAgICAgaWYgKHRoaXMuZGF0YVtpKzFdIDwgYi5kYXRhW2krMV0pXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICh0aGlzLmRhdGFbaSsxXSA+IGIuZGF0YVtpKzFdKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmICgodGhpcy5kYXRhW2ldID4+PiAwKSA8IChiLmRhdGFbaV0gPj4+IDApKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoKHRoaXMuZGF0YVtpXSA+Pj4gMCkgPiAoYi5kYXRhW2ldID4+PiAwKSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDI6XG4gIGNhc2UgMzpcbiAgY2FzZSA0OlxuICBjYXNlIDU6XG4gIGNhc2UgNjpcbiAgY2FzZSA4OlxuICBjYXNlIDk6XG4gIGNhc2UgMTI6XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmRhdGFbaV0gPCBiLmRhdGFbaV0pXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICh0aGlzLmRhdGFbaV0gPiBiLmRhdGFbaV0pXG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlfY18xXzFcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIE1sX0JpZ2FycmF5X2NfMV8xKGtpbmQsIGxheW91dCwgZGltcywgYnVmZmVyKSB7XG4gIHRoaXMua2luZCAgID0ga2luZCA7XG4gIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICB0aGlzLmRpbXMgICA9IGRpbXM7XG4gIHRoaXMuZGF0YSAgID0gYnVmZmVyO1xufVxuXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUgPSBuZXcgTWxfQmlnYXJyYXkoKVxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLm9mZnNldCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgaWYodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIil7XG4gICAgaWYoKGFyZyBpbnN0YW5jZW9mIEFycmF5KSAmJiBhcmcubGVuZ3RoID09IDEpXG4gICAgICBhcmcgPSBhcmdbMF07XG4gICAgZWxzZSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJNbF9CaWdhcnJheV9jXzFfMS5vZmZzZXRcIik7XG4gIH1cbiAgaWYgKGFyZyA8IDAgfHwgYXJnID49IHRoaXMuZGltc1swXSlcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBhcmc7XG59XG5cbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAob2ZzKSB7XG4gIHJldHVybiB0aGlzLmRhdGFbb2ZzXTtcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChvZnMsdikge1xuICB0aGlzLmRhdGFbb2ZzXSA9IHY7XG4gIHJldHVybiAwXG59XG5cbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKHYpIHtcbiAgdGhpcy5kYXRhLmZpbGwodik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY29tcGFyZVxuZnVuY3Rpb24gY2FtbF9iYV9jb21wYXJlKGEsYix0b3RhbCl7XG4gIHJldHVybiBhLmNvbXBhcmUoYix0b3RhbClcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBNbF9CaWdhcnJheSwgTWxfQmlnYXJyYXlfY18xXzEsIGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSl7XG4gIHZhciBzaXplX3Blcl9lbGVtZW50ID0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKTtcbiAgaWYoY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSAqIHNpemVfcGVyX2VsZW1lbnQgIT0gZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJsZW5ndGggZG9lc24ndCBtYXRjaCBkaW1zXCIpO1xuICB9XG4gIGlmKGxheW91dCA9PSAwICYmIC8vIGNfbGF5b3V0XG4gICAgIGRpbXMubGVuZ3RoID09IDEgJiYgLy8gQXJyYXkxXG4gICAgIHNpemVfcGVyX2VsZW1lbnQgPT0gMSkgLy8gMS10by0xIG1hcHBpbmdcbiAgICByZXR1cm4gbmV3IE1sX0JpZ2FycmF5X2NfMV8xKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG4gIHJldHVybiBuZXcgTWxfQmlnYXJyYXkoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcblxufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZShraW5kLCBsYXlvdXQsIGRpbXNfbWwpIHtcbiAgdmFyIGRpbXMgPSBjYW1sX2pzX2Zyb21fYXJyYXkoZGltc19tbCk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIGNhbWxfYmFfZ2V0X3NpemUoZGltcykpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY2hhbmdlX2xheW91dFxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG5mdW5jdGlvbiBjYW1sX2JhX2NoYW5nZV9sYXlvdXQoYmEsIGxheW91dCkge1xuICBpZihiYS5sYXlvdXQgPT0gbGF5b3V0KSByZXR1cm4gYmE7XG4gIHZhciBuZXdfZGltcyA9IFtdXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSBuZXdfZGltc1tpXSA9IGJhLmRpbXNbYmEuZGltcy5sZW5ndGggLSBpIC0gMV07XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgbGF5b3V0LCBuZXdfZGltcywgYmEuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfa2luZFxuZnVuY3Rpb24gY2FtbF9iYV9raW5kKGJhKSB7XG4gIHJldHVybiBiYS5raW5kO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2xheW91dFxuZnVuY3Rpb24gY2FtbF9iYV9sYXlvdXQoYmEpIHtcbiAgcmV0dXJuIGJhLmxheW91dDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9udW1fZGltc1xuZnVuY3Rpb24gY2FtbF9iYV9udW1fZGltcyhiYSkge1xuICByZXR1cm4gYmEuZGltcy5sZW5ndGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfZGltKGJhLCBpKSB7XG4gIGlmIChpIDwgMCB8fCBpID49IGJhLmRpbXMubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmRpbVwiKTtcbiAgcmV0dXJuIGJhLmRpbXNbaV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzFcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8xKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzJcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8yKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGltXzNcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZGltXG5mdW5jdGlvbiBjYW1sX2JhX2RpbV8zKGJhKSB7XG4gIHJldHVybiBjYW1sX2JhX2RpbShiYSwgMik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfZ2VuZXJpYyhiYSwgaSkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSk7XG4gIHJldHVybiBiYS5nZXQob2ZzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQxNihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDEgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyk7XG4gIHZhciBiMiA9IGJhLmdldChvZnMgKyAxKTtcbiAgcmV0dXJuIChiMSB8IChiMiA8PCA4KSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfZ2V0MzIoYmEsIGkwKSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyAzID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMrMCk7XG4gIHZhciBiMiA9IGJhLmdldChvZnMrMSk7XG4gIHZhciBiMyA9IGJhLmdldChvZnMrMik7XG4gIHZhciBiNCA9IGJhLmdldChvZnMrMyk7XG4gIHJldHVybiAoIChiMSA8PCAwKSAgfFxuICAgICAgICAgICAoYjIgPDwgOCkgIHxcbiAgICAgICAgICAgKGIzIDw8IDE2KSB8XG4gICAgICAgICAgIChiNCA8PCAyNCkgKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQ2NChiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyswKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcysxKTtcbiAgdmFyIGIzID0gYmEuZ2V0KG9mcysyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyszKTtcbiAgdmFyIGI1ID0gYmEuZ2V0KG9mcys0KTtcbiAgdmFyIGI2ID0gYmEuZ2V0KG9mcys1KTtcbiAgdmFyIGI3ID0gYmEuZ2V0KG9mcys2KTtcbiAgdmFyIGI4ID0gYmEuZ2V0KG9mcys3KTtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoW2I4LGI3LGI2LGI1LGI0LGIzLGIyLGIxXSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzEoYmEsIGkwKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KGkwKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzJcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzIoYmEsIGkwLCBpMSkge1xuICByZXR1cm4gYmEuZ2V0KGJhLm9mZnNldChbaTAsaTFdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0XzNcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0XzMoYmEsIGkwLCBpMSwgaTIpIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoW2kwLGkxLGkyXSkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF9nZW5lcmljXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0X2dlbmVyaWMoYmEsIGksIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChjYW1sX2pzX2Zyb21fYXJyYXkoaSkpLCB2KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQxNihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDEgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgYmEuc2V0KG9mcyswLCAgdiAgICAgICAgJiAweGZmKTtcbiAgYmEuc2V0KG9mcysxLCAodiA+Pj4gOCkgJiAweGZmKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0MzIoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyAzID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGJhLnNldChvZnMrMCwgIHYgICAgICAgICAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzEsICh2ID4+PiA4KSAgJiAweGZmKTtcbiAgYmEuc2V0KG9mcysyLCAodiA+Pj4gMTYpICYgMHhmZik7XG4gIGJhLnNldChvZnMrMywgKHYgPj4+IDI0KSAmIDB4ZmYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9pbnQ2NF90b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQ2NChiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDcgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIHYgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHYpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgODsgaSsrKSBiYS5zZXQob2ZzK2ksIHZbNy1pXSlcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzEoYmEsIGkwLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoaTApLCB2KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfMihiYSwgaTAsIGkxLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLGkxXSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXRfM1xuZnVuY3Rpb24gY2FtbF9iYV9zZXRfMyhiYSwgaTAsIGkxLCBpMiwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KFtpMCxpMSxpMl0pLCB2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZmlsbFxuZnVuY3Rpb24gY2FtbF9iYV9maWxsKGJhLCB2KSB7XG4gIGJhLmZpbGwodik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9ibGl0KHNyYywgZHN0KSB7XG4gIGlmIChkc3QuZGltcy5sZW5ndGggIT0gc3JjLmRpbXMubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmJsaXQ6IGRpbWVuc2lvbiBtaXNtYXRjaFwiKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkc3QuZGltcy5sZW5ndGg7IGkrKylcbiAgICBpZiAoZHN0LmRpbXNbaV0gIT0gc3JjLmRpbXNbaV0pXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5ibGl0OiBkaW1lbnNpb24gbWlzbWF0Y2hcIik7XG4gIGRzdC5kYXRhLnNldChzcmMuZGF0YSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3N1YlxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc3ViKGJhLCBvZnMsIGxlbikge1xuICB2YXIgY2hhbmdlZF9kaW07XG4gIHZhciBtdWwgPSAxO1xuICBpZiAoYmEubGF5b3V0ID09IDApIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgICBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gMDtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IChiYS5kaW1zLmxlbmd0aCAtIDEpOyBpKyspXG4gICAgICBtdWwgPSBtdWwgKiBiYS5kaW1zW2ldO1xuICAgIGNoYW5nZWRfZGltID0gYmEuZGltcy5sZW5ndGggLSAxO1xuICAgIG9mcyA9IG9mcyAtIDE7XG4gIH1cbiAgaWYgKG9mcyA8IDAgfHwgbGVuIDwgMCB8fCAob2ZzICsgbGVuKSA+IGJhLmRpbXNbY2hhbmdlZF9kaW1dKXtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5zdWI6IGJhZCBzdWItYXJyYXlcIik7XG4gIH1cbiAgdmFyIG5ld19kaW1zID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKylcbiAgICBuZXdfZGltc1tpXSA9IGJhLmRpbXNbaV07XG4gIG5ld19kaW1zW2NoYW5nZWRfZGltXSA9IGxlbjtcbiAgbXVsICo9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogbXVsLCAob2ZzICsgbGVuKSAqIG11bCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBuZXdfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NsaWNlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX3NsaWNlKGJhLCB2aW5kKSB7XG4gIHZpbmQgPSBjYW1sX2pzX2Zyb21fYXJyYXkodmluZCk7XG4gIHZhciBudW1faW5kcyA9IHZpbmQubGVuZ3RoO1xuICB2YXIgaW5kZXggPSBbXTtcbiAgdmFyIHN1Yl9kaW1zID0gW107XG4gIHZhciBvZnM7XG5cbiAgaWYgKG51bV9pbmRzID4gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuc2xpY2U6IHRvbyBtYW55IGluZGljZXNcIik7XG5cbiAgLy8gQ29tcHV0ZSBvZmZzZXQgYW5kIGNoZWNrIGJvdW5kc1xuICBpZiAoYmEubGF5b3V0ID09IDApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtpXSA9IHZpbmRbaV07XG4gICAgZm9yICg7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgICAgaW5kZXhbaV0gPSAwO1xuICAgIHN1Yl9kaW1zID0gYmEuZGltcy5zbGljZShudW1faW5kcyk7XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1faW5kczsgaSsrKVxuICAgICAgaW5kZXhbYmEuZGltcy5sZW5ndGggLSBudW1faW5kcyArIGldID0gdmluZFtpXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHM7IGkrKylcbiAgICAgIGluZGV4W2ldID0gMTtcbiAgICBzdWJfZGltcyA9IGJhLmRpbXMuc2xpY2UoMCwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kcyk7XG4gIH1cbiAgb2ZzID0gYmEub2Zmc2V0KGluZGV4KTtcbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKHN1Yl9kaW1zKTtcbiAgdmFyIHNpemVfcGVyX2VsZW1lbnQgPSBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGJhLmtpbmQpO1xuICB2YXIgbmV3X2RhdGEgPSBiYS5kYXRhLnN1YmFycmF5KG9mcyAqIHNpemVfcGVyX2VsZW1lbnQsIChvZnMgKyBzaXplKSAqIHNpemVfcGVyX2VsZW1lbnQpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgc3ViX2RpbXMsIG5ld19kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9yZXNoYXBlXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2JhX2dldF9zaXplXG5mdW5jdGlvbiBjYW1sX2JhX3Jlc2hhcGUoYmEsIHZpbmQpIHtcbiAgdmluZCA9IGNhbWxfanNfZnJvbV9hcnJheSh2aW5kKTtcbiAgdmFyIG5ld19kaW0gPSBbXTtcbiAgdmFyIG51bV9kaW1zID0gdmluZC5sZW5ndGg7XG5cbiAgaWYgKG51bV9kaW1zIDwgMCB8fCBudW1fZGltcyA+IDE2KXtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIH1cbiAgdmFyIG51bV9lbHRzID0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSB7XG4gICAgbmV3X2RpbVtpXSA9IHZpbmRbaV07XG4gICAgaWYgKG5ld19kaW1baV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogbmVnYXRpdmUgZGltZW5zaW9uXCIpO1xuICAgIG51bV9lbHRzID0gbnVtX2VsdHMgKiBuZXdfZGltW2ldO1xuICB9XG5cbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKGJhLmRpbXMpO1xuICAvLyBDaGVjayB0aGF0IHNpemVzIGFncmVlXG4gIGlmIChudW1fZWx0cyAhPSBzaXplKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnJlc2hhcGU6IHNpemUgbWlzbWF0Y2hcIik7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBuZXdfZGltLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXJpYWxpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCwgY2FtbF9pbnQ2NF90b19ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0XG5mdW5jdGlvbiBjYW1sX2JhX3NlcmlhbGl6ZSh3cml0ZXIsIGJhLCBzeikge1xuICB3cml0ZXIud3JpdGUoMzIsIGJhLmRpbXMubGVuZ3RoKTtcbiAgd3JpdGVyLndyaXRlKDMyLCAoYmEua2luZCB8IChiYS5sYXlvdXQgPDwgOCkpKTtcbiAgaWYoYmEuY2FtbF9jdXN0b20gPT0gXCJfYmlnYXJyMDJcIilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYoYmEuZGltc1tpXSA8IDB4ZmZmZilcbiAgICAgICAgd3JpdGVyLndyaXRlKDE2LCBiYS5kaW1zW2ldKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIDB4ZmZmZik7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgMCk7XG4gICAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGltc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICBlbHNlXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspIHdyaXRlci53cml0ZSgzMixiYS5kaW1zW2ldKVxuICBzd2l0Y2goYmEua2luZCl7XG4gIGNhc2UgMjogIC8vSW50OEFycmF5XG4gIGNhc2UgMzogIC8vVWludDhBcnJheVxuICBjYXNlIDEyOiAvL1VpbnQ4QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB3cml0ZXIud3JpdGUoOCwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDQ6ICAvLyBJbnQxNkFycmF5XG4gIGNhc2UgNTogIC8vIFVpbnQxNkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgd3JpdGVyLndyaXRlKDE2LCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNjogIC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDg6ICAvLyBJbnQzMkFycmF5IChpbnQpXG4gIGNhc2UgOTogIC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICB3cml0ZXIud3JpdGUoOCwwKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA3OiAgLy8gSW50MzJBcnJheSAoaW50NjQpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKXtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhiYS5nZXQoaSkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHdyaXRlci53cml0ZSAoOCwgYltqXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDE6ICAvLyBGbG9hdDY0QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB2YXIgYiA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KGJhLmdldChpKSkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHdyaXRlci53cml0ZSAoOCwgYltqXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDA6ICAvLyBGbG9hdDMyQXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB2YXIgYiA9IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChiYS5nZXQoaSkpO1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBiKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKyl7XG4gICAgICB2YXIgaiA9IGJhLmdldChpKTtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGpbMV0pKTtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGpbMl0pKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKyl7XG4gICAgICB2YXIgY29tcGxleCA9IGJhLmdldChpKTtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsxXSkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHdyaXRlci53cml0ZSAoOCwgYltqXSk7XG4gICAgICB2YXIgYiA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KGNvbXBsZXhbMl0pKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUgKDgsIGJbal0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuICBzelswXSA9ICg0ICsgYmEuZGltcy5sZW5ndGgpICogNDtcbiAgc3pbMV0gPSAoNCArIGJhLmRpbXMubGVuZ3RoKSAqIDg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZGVzZXJpYWxpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlcywgY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX2J1ZmZlclxuZnVuY3Rpb24gY2FtbF9iYV9kZXNlcmlhbGl6ZShyZWFkZXIsIHN6LCBuYW1lKXtcbiAgdmFyIG51bV9kaW1zID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgaWYgKG51bV9kaW1zIDwgMCB8fCBudW1fZGltcyA+IDE2KVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogd3JvbmcgbnVtYmVyIG9mIGJpZ2FycmF5IGRpbWVuc2lvbnNcIik7XG4gIHZhciB0YWcgPSByZWFkZXIucmVhZDMycygpO1xuICB2YXIga2luZCA9IHRhZyAmIDB4ZmZcbiAgdmFyIGxheW91dCA9ICh0YWcgPj4gOCkgJiAxO1xuICB2YXIgZGltcyA9IFtdXG4gIGlmKG5hbWUgPT0gXCJfYmlnYXJyMDJcIilcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9kaW1zOyBpKyspIHtcbiAgICAgIHZhciBzaXplX2RpbSA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgICBpZihzaXplX2RpbSA9PSAweGZmZmYpe1xuICAgICAgICB2YXIgc2l6ZV9kaW1faGkgPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICB2YXIgc2l6ZV9kaW1fbG8gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICBpZihzaXplX2RpbV9oaSAhPSAwKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogYmlnYXJyYXkgZGltZW5zaW9uIG92ZXJmbG93IGluIDMyYml0XCIpO1xuICAgICAgICBzaXplX2RpbSA9IHNpemVfZGltX2xvO1xuICAgICAgfVxuICAgICAgZGltcy5wdXNoKHNpemVfZGltKTtcbiAgICB9XG4gIGVsc2VcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9kaW1zOyBpKyspIGRpbXMucHVzaChyZWFkZXIucmVhZDMydSgpKTtcbiAgdmFyIHNpemUgPSBjYW1sX2JhX2dldF9zaXplKGRpbXMpO1xuICB2YXIgZGF0YSA9IGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBzaXplKTtcbiAgdmFyIGJhID0gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG4gIHN3aXRjaChraW5kKXtcbiAgY2FzZSAyOiAgLy9JbnQ4QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDhzKCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDM6ICAvL1VpbnQ4QXJyYXlcbiAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA0OiAgLy8gSW50MTZBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMTZzKCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDU6ICAvLyBVaW50MTZBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMTZ1KCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDY6ICAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA4OiAgLy8gSW50MzJBcnJheSAoaW50KVxuICBjYXNlIDk6ICAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgdmFyIHNpeHR5ID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIGlmKHNpeHR5KSBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGNhbm5vdCByZWFkIGJpZ2FycmF5IHdpdGggNjQtYml0IE9DYW1sIGludHNcIik7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNzogLy8gKGludDY0KVxuICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBpbnQ2NCA9IGNhbWxfaW50NjRfb2ZfYnl0ZXModCk7XG4gICAgICBiYS5zZXQoaSxpbnQ2NCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDE6ICAvLyBGbG9hdDY0QXJyYXlcbiAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgZiA9IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKHQpKTtcbiAgICAgIGJhLnNldChpLGYpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAwOiAgLy8gRmxvYXQzMkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICB2YXIgZiA9IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyhyZWFkZXIucmVhZDMycygpKTtcbiAgICAgIGJhLnNldChpLGYpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICB2YXIgcmUgPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICB2YXIgaW0gPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICBiYS5zZXQoaSxbMjU0LHJlLGltXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDExOiAvLyBGbG9hdDY0QXJyYXkgKGNvbXBsZXg2NClcbiAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgcmUgPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgaW0gPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICBiYS5zZXQoaSxbMjU0LHJlLGltXSk7XG4gICAgfVxuICAgIGJyZWFrXG4gIH1cbiAgc3pbMF0gPSAoNCArIG51bV9kaW1zKSAqIDQ7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9EZXByZWNhdGVkXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV9mcm9tXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfZnJvbShkYXRhMSwgZGF0YTIsIGpzdHlwLCBraW5kLCBsYXlvdXQsIGRpbXMpe1xuICBpZihkYXRhMiB8fCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpID09IDIpe1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfY3JlYXRlX2Zyb206IHVzZSByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlXCIpO1xuICB9XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfaGFzaCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9oYXNoX21peF9pbnQsIGNhbWxfaGFzaF9taXhfZmxvYXRcbmZ1bmN0aW9uIGNhbWxfYmFfaGFzaChiYSl7XG4gIHZhciBudW1fZWx0cyA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIHZhciBoID0gMDtcbiAgc3dpdGNoKGJhLmtpbmQpe1xuICBjYXNlIDI6ICAvL0ludDhBcnJheVxuICBjYXNlIDM6ICAvL1VpbnQ4QXJyYXlcbiAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgaWYobnVtX2VsdHMgPiAyNTYpIG51bV9lbHRzID0gMjU2O1xuICAgIHZhciB3ID0gMCwgaSA9MDtcbiAgICBmb3IoaSA9IDA7IGkgKyA0IDw9IGJhLmRhdGEubGVuZ3RoOyBpKz00KXtcbiAgICAgIHcgPSBiYS5kYXRhW2krMF0gfCAoYmEuZGF0YVtpKzFdIDw8IDgpIHwgKGJhLmRhdGFbaSsyXSA8PCAxNikgfCAoYmEuZGF0YVtpKzNdIDw8IDI0KTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLHcpO1xuICAgIH1cbiAgICB3ID0gMDtcbiAgICBzd2l0Y2ggKG51bV9lbHRzICYgMykge1xuICAgIGNhc2UgMzogdyAgPSBiYS5kYXRhW2krMl0gPDwgMTY7ICAgIC8qIGZhbGx0aHJvdWdoICovXG4gICAgY2FzZSAyOiB3IHw9IGJhLmRhdGFbaSsxXSA8PCA4OyAgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICBjYXNlIDE6IHcgfD0gYmEuZGF0YVtpKzBdO1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA0OiAgLy8gSW50MTZBcnJheVxuICBjYXNlIDU6ICAvLyBVaW50MTZBcnJheVxuICAgIGlmKG51bV9lbHRzID4gMTI4KSBudW1fZWx0cyA9IDEyODtcbiAgICB2YXIgdyA9IDAsIGkgPTA7XG4gICAgZm9yKGkgPSAwOyBpICsgMiA8PSBiYS5kYXRhLmxlbmd0aDsgaSs9Mil7XG4gICAgICB3ID0gYmEuZGF0YVtpKzBdIHwgKGJhLmRhdGFbaSsxXSA8PCAxNik7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCx3KTtcbiAgICB9XG4gICAgaWYgKChudW1fZWx0cyAmIDEpICE9IDApXG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgNjogIC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICBjYXNlIDg6ICAvLyBJbnQzMkFycmF5IChpbnQpXG4gIGNhc2UgOTogIC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9lbHRzOyBpKyspIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgY2FzZSA3OiAgLy8gSW50MzJBcnJheSAoaW50NjQpXG4gICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgbnVtX2VsdHMgKj0gMlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgbnVtX2VsdHMgKj0yOyAvKiBmYWxsdGhyb3VnaCAqL1xuICBjYXNlIDA6ICAvLyBGbG9hdDMyQXJyYXlcbiAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9lbHRzOyBpKyspIGggPSBjYW1sX2hhc2hfbWl4X2Zsb2F0KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICBjYXNlIDExOiAvLyBGbG9hdDY0QXJyYXkgKGNvbXBsZXg2NClcbiAgICBudW1fZWx0cyAqPTI7IC8qIGZhbGx0aHJvdWdoICovXG4gIGNhc2UgMTogIC8vIEZsb2F0NjRBcnJheVxuICAgIGlmIChudW1fZWx0cyA+IDMyKSBudW1fZWx0cyA9IDMyO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdG9fdHlwZWRfYXJyYXkgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9iYV90b190eXBlZF9hcnJheShiYSl7XG4gIHJldHVybiBiYS5kYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpe1xuICB2YXIga2luZDtcbiAgaWYgICAgICAodGEgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkpIGtpbmQgPSAwO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkga2luZCA9IDE7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50OEFycmF5KSBraW5kID0gMjtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSBraW5kID0gMztcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQxNkFycmF5KSBraW5kID0gNDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50MTZBcnJheSkga2luZCA9IDU7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50MzJBcnJheSkga2luZCA9IDY7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgcmV0dXJuIGtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5KHRhKXtcbiAgdmFyIGtpbmQgPSBjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXkodGEpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zvcm1hdF9pbnQgY29uc3QgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nLCBjYW1sX3N0cl9yZXBlYXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZm9ybWF0X2ludChmbXQsIGkpIHtcbiAgaWYgKGNhbWxfanNieXRlc19vZl9zdHJpbmcoZm10KSA9PSBcIiVkXCIpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIraSk7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGkgPCAwKSB7IGlmIChmLnNpZ25lZGNvbnYpIHsgZi5zaWduID0gLTE7IGkgPSAtaTsgfSBlbHNlIGkgPj4+PSAwOyB9XG4gIHZhciBzID0gaS50b1N0cmluZyhmLmJhc2UpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9ICcgJztcbiAgICB2YXIgbiA9IGYucHJlYyAtIHMubGVuZ3RoO1xuICAgIGlmIChuID4gMCkgcyA9IGNhbWxfc3RyX3JlcGVhdCAobiwgJzAnKSArIHM7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UgKHMpIHtcbiAgdmFyIGkgPSAwLCBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyksIGJhc2UgPSAxMCwgc2lnbiA9IDE7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsaSkpIHtcbiAgICBjYXNlIDQ1OiBpKys7IHNpZ24gPSAtMTsgYnJlYWs7XG4gICAgY2FzZSA0MzogaSsrOyBzaWduID0gMTsgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChpICsgMSA8IGxlbiAmJiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpID09IDQ4KVxuICAgIHN3aXRjaCAoY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpICsgMSkpIHtcbiAgICBjYXNlIDEyMDogY2FzZSA4ODogYmFzZSA9IDE2OyBpICs9IDI7IGJyZWFrO1xuICAgIGNhc2UgMTExOiBjYXNlIDc5OiBiYXNlID0gIDg7IGkgKz0gMjsgYnJlYWs7XG4gICAgY2FzZSAgOTg6IGNhc2UgNjY6IGJhc2UgPSAgMjsgaSArPSAyOyBicmVhaztcbiAgICBjYXNlIDExNzogY2FzZSA4NTogaSArPSAyOyBicmVhaztcbiAgICB9XG4gIHJldHVybiBbaSwgc2lnbiwgYmFzZV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZGlnaXRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZGlnaXQoYykge1xuICBpZiAoYyA+PSA0OCAmJiBjIDw9IDU3KSAgcmV0dXJuIGMgLSA0ODtcbiAgaWYgKGMgPj0gNjUgJiYgYyA8PSA5MCkgIHJldHVybiBjIC0gNTU7XG4gIGlmIChjID49IDk3ICYmIGMgPD0gMTIyKSByZXR1cm4gYyAtIDg3O1xuICByZXR1cm4gLTE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSwgY2FtbF9wYXJzZV9kaWdpdCwgY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9pbnRfb2Zfc3RyaW5nIChzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIChzKTtcbiAgdmFyIGkgPSByWzBdLCBzaWduID0gclsxXSwgYmFzZSA9IHJbMl07XG4gIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciB0aHJlc2hvbGQgPSAtMSA+Pj4gMDtcbiAgdmFyIGMgPSAoaSA8IGxlbik/Y2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKTowO1xuICB2YXIgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB2YXIgcmVzID0gZDtcbiAgZm9yIChpKys7aTxsZW47aSsrKSB7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT0gOTUpIGNvbnRpbnVlO1xuICAgIGQgPSBjYW1sX3BhcnNlX2RpZ2l0KGMpO1xuICAgIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGJyZWFrO1xuICAgIHJlcyA9IGJhc2UgKiByZXMgKyBkO1xuICAgIGlmIChyZXMgPiB0aHJlc2hvbGQpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICB9XG4gIGlmIChpICE9IGxlbikgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIC8vIEZvciBiYXNlIGRpZmZlcmVudCBmcm9tIDEwLCB3ZSBleHBlY3QgYW4gdW5zaWduZWQgcmVwcmVzZW50YXRpb24sXG4gIC8vIGhlbmNlIGFueSB2YWx1ZSBvZiAncmVzJyAobGVzcyB0aGFuICd0aHJlc2hvbGQnKSBpcyBhY2NlcHRhYmxlLlxuICAvLyBCdXQgd2UgaGF2ZSB0byBjb252ZXJ0IHRoZSByZXN1bHQgYmFjayB0byBhIHNpZ25lZCBpbnRlZ2VyLlxuICByZXMgPSBzaWduICogcmVzO1xuICBpZiAoKGJhc2UgPT0gMTApICYmICgocmVzIHwgMCkgIT0gcmVzKSlcbiAgICAvKiBTaWduZWQgcmVwcmVzZW50YXRpb24gZXhwZWN0ZWQsIGFsbG93IC0yXihuYml0cy0xKSB0byAyXihuYml0cy0xKSAtIDEgKi9cbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgcmV0dXJuIHJlcyB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbXVsIGNvbnN0XG5mdW5jdGlvbiBjYW1sX211bChhLGIpe1xuICByZXR1cm4gTWF0aC5pbXVsKGEsYik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZGl2XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG5mdW5jdGlvbiBjYW1sX2Rpdih4LHkpIHtcbiAgaWYgKHkgPT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgcmV0dXJuICh4L3kpfDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW9kXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG5mdW5jdGlvbiBjYW1sX21vZCh4LHkpIHtcbiAgaWYgKHkgPT0gMCkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgcmV0dXJuIHgleTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ic3dhcDE2XG5mdW5jdGlvbiBjYW1sX2Jzd2FwMTYoeCkge1xuICByZXR1cm4gKCgoKHggJiAweDAwRkYpIDw8IDgpIHxcbiAgICAgICAgICAgKCh4ICYgMHhGRjAwKSA+PiA4KSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9ic3dhcFxuZnVuY3Rpb24gY2FtbF9pbnQzMl9ic3dhcCh4KSB7XG4gIHJldHVybiAoKCh4ICYgMHgwMDAwMDBGRikgPDwgMjQpIHxcbiAgICAgICAgICAoKHggJiAweDAwMDBGRjAwKSA8PCA4KSB8XG4gICAgICAgICAgKCh4ICYgMHgwMEZGMDAwMCkgPj4+IDgpIHxcbiAgICAgICAgICAoKHggJiAweEZGMDAwMDAwKSA+Pj4gMjQpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYnN3YXBcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMsIGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfYnN3YXAoeCkge1xuICB2YXIgeSA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoeCk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFt5WzddLCB5WzZdLCB5WzVdLCB5WzRdLCB5WzNdLCB5WzJdLCB5WzFdLCB5WzBdXSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEhhc2h0YmxcblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfdW5pdl9wYXJhbSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vVmVyc2lvbjogPCA0LjEyXG5mdW5jdGlvbiBjYW1sX2hhc2hfdW5pdl9wYXJhbSAoY291bnQsIGxpbWl0LCBvYmopIHtcbiAgdmFyIGhhc2hfYWNjdSA9IDA7XG4gIGZ1bmN0aW9uIGhhc2hfYXV4IChvYmopIHtcbiAgICBsaW1pdCAtLTtcbiAgICBpZiAoY291bnQgPCAwIHx8IGxpbWl0IDwgMCkgcmV0dXJuO1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSAmJiBvYmpbMF0gPT09IChvYmpbMF18MCkpIHtcbiAgICAgIHN3aXRjaCAob2JqWzBdKSB7XG4gICAgICBjYXNlIDI0ODpcbiAgICAgICAgLy8gT2JqZWN0XG4gICAgICAgIGNvdW50IC0tO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogNjU1OTkgKyBvYmpbMl0pIHwgMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MDpcbiAgICAgICAgLy8gRm9yd2FyZFxuICAgICAgICBsaW1pdCsrOyBoYXNoX2F1eChvYmopOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvdW50IC0tO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBvYmpbMF0pIHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IG9iai5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSBoYXNoX2F1eCAob2JqW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMob2JqKSkge1xuICAgICAgY291bnQgLS07XG4gICAgICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudChvYmopO1xuICAgICAgaWYodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yICh2YXIgYiA9IGNvbnRlbnQsIGwgPSBiLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYi5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gICAgICB9IGVsc2UgeyAvKiBBUlJBWSAqL1xuICAgICAgICBmb3IgKHZhciBhID0gY29udGVudCwgbCA9IGEubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBhW2ldKSB8IDA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhvYmopKSB7XG4gICAgICB2YXIganNieXRlcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob2JqKTtcbiAgICAgIGZvciAodmFyIGIgPSBqc2J5dGVzLCBsID0ganNieXRlcy5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBiLmNoYXJDb2RlQXQoaSkpIHwgMDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGZvciAodmFyIGIgPSBvYmosIGwgPSBvYmoubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYi5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gICAgfSBlbHNlIGlmIChvYmogPT09IChvYmp8MCkpIHtcbiAgICAgIC8vIEludGVnZXJcbiAgICAgIGNvdW50IC0tO1xuICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDY1NTk5ICsgb2JqKSB8IDA7XG4gICAgfSBlbHNlIGlmIChvYmogPT09ICtvYmopIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBjb3VudC0tO1xuICAgICAgdmFyIHAgPSBjYW1sX2ludDY0X3RvX2J5dGVzIChjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKG9iaikpO1xuICAgICAgZm9yICh2YXIgaSA9IDc7IGkgPj0gMDsgaS0tKSBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBwW2ldKSB8IDA7XG4gICAgfSBlbHNlIGlmKG9iaiAmJiBvYmouY2FtbF9jdXN0b20pIHtcbiAgICAgIGlmKGNhbWxfY3VzdG9tX29wc1tvYmouY2FtbF9jdXN0b21dICYmIGNhbWxfY3VzdG9tX29wc1tvYmouY2FtbF9jdXN0b21dLmhhc2gpIHtcbiAgICAgICAgdmFyIGggPSBjYW1sX2N1c3RvbV9vcHNbb2JqLmNhbWxfY3VzdG9tXS5oYXNoKG9iaikgfCAwO1xuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogNjU1OTkgKyBoKSB8IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGhhc2hfYXV4IChvYmopO1xuICByZXR1cm4gaGFzaF9hY2N1ICYgMHgzRkZGRkZGRjtcbn1cblxuLy9mdW5jdGlvbiBST1RMMzIoeCxuKSB7IHJldHVybiAoKHggPDwgbikgfCAoeCA+Pj4gKDMyLW4pKSk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX211bFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQoaCxkKSB7XG4gIGQgPSBjYW1sX211bChkLCAweGNjOWUyZDUxfDApO1xuICBkID0gKChkIDw8IDE1KSB8IChkID4+PiAoMzItMTUpKSk7IC8vIFJPVEwzMihkLCAxNSk7XG4gIGQgPSBjYW1sX211bChkLCAweDFiODczNTkzKTtcbiAgaCBePSBkO1xuICBoID0gKChoIDw8IDEzKSB8IChoID4+PiAoMzItMTMpKSk7ICAgLy9ST1RMMzIoaCwgMTMpO1xuICByZXR1cm4gKCgoaCArIChoIDw8IDIpKXwwKSArICgweGU2NTQ2YjY0fDApKXwwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX211bFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9maW5hbChoKSB7XG4gIGggXj0gaCA+Pj4gMTY7XG4gIGggPSBjYW1sX211bCAoaCwgMHg4NWViY2E2YnwwKTtcbiAgaCBePSBoID4+PiAxMztcbiAgaCA9IGNhbWxfbXVsIChoLCAweGMyYjJhZTM1fDApO1xuICBoIF49IGggPj4+IDE2O1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2hhc2hfbWl4X2ludDY0XG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2Zsb2F0IChoLCB2MCkge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9pbnQ2NChoLCBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKHYwKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9sbzMyLCBjYW1sX2ludDY0X2hpMzJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50NjQgKGgsIHYpIHtcbiAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGNhbWxfaW50NjRfbG8zMih2KSk7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2hpMzIodikpO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIHMpIHtcbiAgdmFyIGxlbiA9IHMubGVuZ3RoLCBpLCB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzLmNoYXJDb2RlQXQoaSlcbiAgICAgIHwgKHMuY2hhckNvZGVBdChpKzEpIDw8IDgpXG4gICAgICB8IChzLmNoYXJDb2RlQXQoaSsyKSA8PCAxNilcbiAgICAgIHwgKHMuY2hhckNvZGVBdChpKzMpIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICBjYXNlIDM6IHcgID0gcy5jaGFyQ29kZUF0KGkrMikgPDwgMTY7XG4gIGNhc2UgMjogdyB8PSBzLmNoYXJDb2RlQXQoaSsxKSA8PCA4O1xuICBjYXNlIDE6XG4gICAgdyB8PSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICBkZWZhdWx0OlxuICB9XG4gIGggXj0gbGVuO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCwgaSwgdztcbiAgZm9yIChpID0gMDsgaSArIDQgPD0gbGVuOyBpICs9IDQpIHtcbiAgICB3ID0gc1tpXVxuICAgICAgfCAoc1tpKzFdIDw8IDgpXG4gICAgICB8IChzW2krMl0gPDwgMTYpXG4gICAgICB8IChzW2krM10gPDwgMjQpO1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICB3ID0gMDtcbiAgc3dpdGNoIChsZW4gJiAzKSB7XG4gIGNhc2UgMzogdyAgPSBzW2krMl0gPDwgMTY7XG4gIGNhc2UgMjogdyB8PSBzW2krMV0gPDwgODtcbiAgY2FzZSAxOiB3IHw9IHNbaV07XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICBkZWZhdWx0OlxuICB9XG4gIGggXj0gbGVuO1xuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2J5dGVzKGgsIHYpIHtcbiAgdmFyIGNvbnRlbnQgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQodik7XG4gIGlmKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCwgY29udGVudClcbiAgZWxzZSAvKiBBUlJBWSAqL1xuICAgIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLCBjb250ZW50KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9zdHJpbmcoaCwgdikge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmcodikpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaCBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnQsIGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfZmxvYXQsIGNhbWxfaGFzaF9taXhfc3RyaW5nLCBjYW1sX2hhc2hfbWl4X2J5dGVzLCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pc19jb250aW51YXRpb25fdGFnXG5mdW5jdGlvbiBjYW1sX2hhc2ggKGNvdW50LCBsaW1pdCwgc2VlZCwgb2JqKSB7XG4gIHZhciBxdWV1ZSwgcmQsIHdyLCBzeiwgbnVtLCBoLCB2LCBpLCBsZW47XG4gIHN6ID0gbGltaXQ7XG4gIGlmIChzeiA8IDAgfHwgc3ogPiAyNTYpIHN6ID0gMjU2O1xuICBudW0gPSBjb3VudDtcbiAgaCA9IHNlZWQ7XG4gIHF1ZXVlID0gW29ial07IHJkID0gMDsgd3IgPSAxO1xuICB3aGlsZSAocmQgPCB3ciAmJiBudW0gPiAwKSB7XG4gICAgdiA9IHF1ZXVlW3JkKytdO1xuICAgIGlmICh2ICYmIHYuY2FtbF9jdXN0b20pe1xuICAgICAgaWYoY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dICYmIGNhbWxfY3VzdG9tX29wc1t2LmNhbWxfY3VzdG9tXS5oYXNoKSB7XG4gICAgICAgIHZhciBoaCA9IGNhbWxfY3VzdG9tX29wc1t2LmNhbWxfY3VzdG9tXS5oYXNoKHYpO1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQgKGgsIGhoKTtcbiAgICAgICAgbnVtIC0tO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgQXJyYXkgJiYgdlswXSA9PT0gKHZbMF18MCkpIHtcbiAgICAgIHN3aXRjaCAodlswXSkge1xuICAgICAgY2FzZSAyNDg6XG4gICAgICAgIC8vIE9iamVjdFxuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdlsyXSk7XG4gICAgICAgIG51bS0tO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUwOlxuICAgICAgICAvLyBGb3J3YXJkXG4gICAgICAgIHF1ZXVlWy0tcmRdID0gdlsxXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZihjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodlswXSkpIHtcbiAgICAgICAgICAvKiBBbGwgY29udGludWF0aW9ucyBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlLFxuICAgICAgICAgICAgIHNpbmNlIHdlIGhhdmUgbm8gaWRlYSBob3cgdG8gZGlzdGluZ3Vpc2ggdGhlbS4gKi9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGFnID0gKCh2Lmxlbmd0aCAtIDEpIDw8IDEwKSB8IHZbMF07XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB0YWcpO1xuICAgICAgICBmb3IgKGkgPSAxLCBsZW4gPSB2Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgaWYgKHdyID49IHN6KSBicmVhaztcbiAgICAgICAgICBxdWV1ZVt3cisrXSA9IHZbaV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHYpKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9ieXRlcyhoLHYpXG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHYpKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9zdHJpbmcoaCx2KVxuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfanNieXRlcyhoLHYpXG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHYgPT09ICh2fDApKSB7XG4gICAgICAvLyBJbnRlZ2VyXG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdit2KzEpO1xuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSArdikge1xuICAgICAgLy8gRmxvYXRcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2Zsb2F0KGgsdik7XG4gICAgICBudW0tLTtcbiAgICB9XG4gIH1cbiAgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoaCk7XG4gIHJldHVybiBoICYgMHgzRkZGRkZGRjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfaGFzaFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9maW5hbCwgY2FtbF9oYXNoX21peF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2hhc2goaCwgdil7XG4gIHZhciBoID0gY2FtbF9oYXNoX21peF9zdHJpbmcoaCx2KTtcbiAgdmFyIGggPSBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpO1xuICByZXR1cm4gaCAmIDB4M0ZGRkZGRkY7XG59XG4iLCIvL1Byb3ZpZGVzOiBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludDY0XG52YXIgQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQ2NCA9IGNhbWxfaGFzaF9taXhfaW50NjQ7XG4vL1Byb3ZpZGVzOiBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbnZhciBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludCA9IGNhbWxfaGFzaF9taXhfaW50O1xuLy9Qcm92aWRlczogQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9mbG9hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9mbG9hdFxudmFyIEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfZmxvYXQgPSBjYW1sX2hhc2hfbWl4X2Zsb2F0O1xuLy9Qcm92aWRlczogQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfc3RyaW5nXG52YXIgQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9zdHJpbmcgPSBjYW1sX2hhc2hfbWl4X3N0cmluZztcbi8vUHJvdmlkZXM6IEJhc2VfaW50ZXJuYWxoYXNoX2dldF9oYXNoX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsXG5mdW5jdGlvbiBCYXNlX2ludGVybmFsaGFzaF9nZXRfaGFzaF92YWx1ZShzZWVkKSB7XG4gIHZhciBoID0gY2FtbF9oYXNoX21peF9maW5hbChzZWVkKTtcbiAgcmV0dXJuIGggJiAweDNGRkZGRkZGO1xufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUgQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAqL1xuLyogIGVuIEF1dG9tYXRpcXVlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCAgICAqL1xuLyogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aXRoICAgICAqL1xuLyogIHRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiBmaWxlIC4uL0xJQ0VOU0UuICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKiAkSWQ6IHBhcnNpbmcuYyA4OTgzIDIwMDgtMDgtMDYgMDk6Mzg6MjVaIHhsZXJveSAkICovXG5cbi8qIFRoZSBQREEgYXV0b21hdG9uIGZvciBwYXJzZXJzIGdlbmVyYXRlZCBieSBjYW1seWFjYyAqL1xuXG4vKiBUaGUgcHVzaGRvd24gYXV0b21hdGEgKi9cblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZXJfdHJhY2VcbnZhciBjYW1sX3BhcnNlcl90cmFjZSA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2xleF9hcnJheSwgY2FtbF9wYXJzZXJfdHJhY2UsY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3V0cHV0LCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZW5naW5lKHRhYmxlcywgZW52LCBjbWQsIGFyZylcbntcbiAgdmFyIEVSUkNPREUgPSAyNTY7XG5cbiAgLy92YXIgU1RBUlQgPSAwO1xuICAvL3ZhciBUT0tFTl9SRUFEID0gMTtcbiAgLy92YXIgU1RBQ0tTX0dST1dOXzEgPSAyO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMiA9IDM7XG4gIC8vdmFyIFNFTUFOVElDX0FDVElPTl9DT01QVVRFRCA9IDQ7XG4gIC8vdmFyIEVSUk9SX0RFVEVDVEVEID0gNTtcbiAgdmFyIGxvb3AgPSA2O1xuICB2YXIgdGVzdHNoaWZ0ID0gNztcbiAgdmFyIHNoaWZ0ID0gODtcbiAgdmFyIHNoaWZ0X3JlY292ZXIgPSA5O1xuICB2YXIgcmVkdWNlID0gMTA7XG5cbiAgdmFyIFJFQURfVE9LRU4gPSAwO1xuICB2YXIgUkFJU0VfUEFSU0VfRVJST1IgPSAxO1xuICB2YXIgR1JPV19TVEFDS1NfMSA9IDI7XG4gIHZhciBHUk9XX1NUQUNLU18yID0gMztcbiAgdmFyIENPTVBVVEVfU0VNQU5USUNfQUNUSU9OID0gNDtcbiAgdmFyIENBTExfRVJST1JfRlVOQ1RJT04gPSA1O1xuXG4gIHZhciBlbnZfc19zdGFjayA9IDE7XG4gIHZhciBlbnZfdl9zdGFjayA9IDI7XG4gIHZhciBlbnZfc3ltYl9zdGFydF9zdGFjayA9IDM7XG4gIHZhciBlbnZfc3ltYl9lbmRfc3RhY2sgPSA0O1xuICB2YXIgZW52X3N0YWNrc2l6ZSA9IDU7XG4gIHZhciBlbnZfc3RhY2tiYXNlID0gNjtcbiAgdmFyIGVudl9jdXJyX2NoYXIgPSA3O1xuICB2YXIgZW52X2x2YWwgPSA4O1xuICB2YXIgZW52X3N5bWJfc3RhcnQgPSA5O1xuICB2YXIgZW52X3N5bWJfZW5kID0gMTA7XG4gIHZhciBlbnZfYXNwID0gMTE7XG4gIHZhciBlbnZfcnVsZV9sZW4gPSAxMjtcbiAgdmFyIGVudl9ydWxlX251bWJlciA9IDEzO1xuICB2YXIgZW52X3NwID0gMTQ7XG4gIHZhciBlbnZfc3RhdGUgPSAxNTtcbiAgdmFyIGVudl9lcnJmbGFnID0gMTY7XG5cbiAgLy8gdmFyIF90YmxfYWN0aW9ucyA9IDE7XG4gIHZhciB0YmxfdHJhbnNsX2NvbnN0ID0gMjtcbiAgdmFyIHRibF90cmFuc2xfYmxvY2sgPSAzO1xuICB2YXIgdGJsX2xocyA9IDQ7XG4gIHZhciB0YmxfbGVuID0gNTtcbiAgdmFyIHRibF9kZWZyZWQgPSA2O1xuICB2YXIgdGJsX2Rnb3RvID0gNztcbiAgdmFyIHRibF9zaW5kZXggPSA4O1xuICB2YXIgdGJsX3JpbmRleCA9IDk7XG4gIHZhciB0YmxfZ2luZGV4ID0gMTA7XG4gIHZhciB0YmxfdGFibGVzaXplID0gMTE7XG4gIHZhciB0YmxfdGFibGUgPSAxMjtcbiAgdmFyIHRibF9jaGVjayA9IDEzO1xuICAvLyB2YXIgX3RibF9lcnJvcl9mdW5jdGlvbiA9IDE0O1xuICB2YXIgdGJsX25hbWVzX2NvbnN0ID0gMTU7XG4gIHZhciB0YmxfbmFtZXNfYmxvY2sgPSAxNjtcblxuXG4gIGZ1bmN0aW9uIGxvZyh4KSB7XG4gICAgdmFyIHMgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHggKyBcIlxcblwiKTtcbiAgICBjYW1sX21sX291dHB1dCgyLCBzLCAwLCBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9rZW5fbmFtZShuYW1lcywgbnVtYmVyKVxuICB7XG4gICAgdmFyIHN0ciA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWVzKTtcbiAgICBpZiAoc3RyWzBdID09ICdcXHgwMCcpXG4gICAgICByZXR1cm4gXCI8dW5rbm93biB0b2tlbj5cIjtcbiAgICByZXR1cm4gc3RyLnNwbGl0KCdcXHgwMCcpW251bWJlcl07XG4gIH1cblxuICBmdW5jdGlvbiBwcmludF90b2tlbihzdGF0ZSwgdG9rKVxuICB7XG4gICAgdmFyIHRva2VuLCBraW5kO1xuICAgIGlmICh0b2sgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgdG9rZW4gPSB0b2tlbl9uYW1lKHRhYmxlc1t0YmxfbmFtZXNfYmxvY2tdLCB0b2tbMF0pO1xuICAgICAgaWYgKHR5cGVvZiB0b2tbMV0gPT0gXCJudW1iZXJcIilcbiAgICAgICAga2luZCA9IFwiXCIgKyB0b2tbMV07XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdG9rWzFdID09IFwic3RyaW5nXCIpXG4gICAgICAgIGtpbmQgPSB0b2tbMV1cbiAgICAgIGVsc2UgaWYgKHRva1sxXSBpbnN0YW5jZW9mIE1sQnl0ZXMpXG4gICAgICAgIGtpbmQgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRva1sxXSlcbiAgICAgIGVsc2VcbiAgICAgICAga2luZCA9IFwiX1wiXG4gICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlYWQgdG9rZW4gXCIgKyB0b2tlbiArIFwiKFwiICsga2luZCArIFwiKVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdG9rZW4gPSB0b2tlbl9uYW1lKHRhYmxlc1t0YmxfbmFtZXNfY29uc3RdLCB0b2spO1xuICAgICAgbG9nKFwiU3RhdGUgXCIgKyBzdGF0ZSArIFwiOiByZWFkIHRva2VuIFwiICsgdG9rZW4pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGFibGVzLmRnb3RvKSB7XG4gICAgdGFibGVzLmRlZnJlZCA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2RlZnJlZF0pO1xuICAgIHRhYmxlcy5zaW5kZXggPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9zaW5kZXhdKTtcbiAgICB0YWJsZXMuY2hlY2sgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfY2hlY2tdKTtcbiAgICB0YWJsZXMucmluZGV4ID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfcmluZGV4XSk7XG4gICAgdGFibGVzLnRhYmxlICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX3RhYmxlXSk7XG4gICAgdGFibGVzLmxlbiAgICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2xlbl0pO1xuICAgIHRhYmxlcy5saHMgICAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9saHNdKTtcbiAgICB0YWJsZXMuZ2luZGV4ID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfZ2luZGV4XSk7XG4gICAgdGFibGVzLmRnb3RvICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2Rnb3RvXSk7XG4gIH1cblxuICB2YXIgcmVzID0gMCwgbiwgbjEsIG4yLCBzdGF0ZTE7XG5cbiAgLy8gUkVTVE9SRVxuICB2YXIgc3AgPSBlbnZbZW52X3NwXTtcbiAgdmFyIHN0YXRlID0gZW52W2Vudl9zdGF0ZV07XG4gIHZhciBlcnJmbGFnID0gZW52W2Vudl9lcnJmbGFnXTtcblxuICBleGl0OmZvciAoOzspIHtcbiAgICBuZXh0OnN3aXRjaChjbWQpIHtcbiAgICBjYXNlIDA6Ly9TVEFSVDpcbiAgICAgIHN0YXRlID0gMDtcbiAgICAgIGVycmZsYWcgPSAwO1xuICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICBjYXNlIDY6Ly9sb29wOlxuICAgICAgbiA9IHRhYmxlcy5kZWZyZWRbc3RhdGVdO1xuICAgICAgaWYgKG4gIT0gMCkgeyBjbWQgPSByZWR1Y2U7IGJyZWFrOyB9XG4gICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID49IDApIHsgY21kID0gdGVzdHNoaWZ0OyBicmVhazsgfVxuICAgICAgcmVzID0gUkVBRF9UT0tFTjtcbiAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgbGV4ZXIgYW5kIHVwZGF0ZXMgKi9cbiAgICAgIC8qIHN5bWJfc3RhcnQgYW5kIHN5bWJfZW5kICovXG4gICAgY2FzZSAxOi8vVE9LRU5fUkVBRDpcbiAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSB0YWJsZXNbdGJsX3RyYW5zbF9ibG9ja11bYXJnWzBdICsgMV07XG4gICAgICAgIGVudltlbnZfbHZhbF0gPSBhcmdbMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSB0YWJsZXNbdGJsX3RyYW5zbF9jb25zdF1bYXJnICsgMV07XG4gICAgICAgIGVudltlbnZfbHZhbF0gPSAwO1xuICAgICAgfVxuICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKSBwcmludF90b2tlbiAoc3RhdGUsIGFyZyk7XG4gICAgICAvLyBGYWxsIHRocm91Z2hcblxuICAgIGNhc2UgNzovL3Rlc3RzaGlmdDpcbiAgICAgIG4xID0gdGFibGVzLnNpbmRleFtzdGF0ZV07XG4gICAgICBuMiA9IG4xICsgZW52W2Vudl9jdXJyX2NoYXJdO1xuICAgICAgaWYgKG4xICE9IDAgJiYgbjIgPj0gMCAmJiBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09IGVudltlbnZfY3Vycl9jaGFyXSkge1xuICAgICAgICBjbWQgPSBzaGlmdDsgYnJlYWs7XG4gICAgICB9XG4gICAgICBuMSA9IHRhYmxlcy5yaW5kZXhbc3RhdGVdO1xuICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBlbnZbZW52X2N1cnJfY2hhcl0pIHtcbiAgICAgICAgbiA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICAgIGNtZCA9IHJlZHVjZTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZXJyZmxhZyA8PSAwKSB7XG4gICAgICAgIHJlcyA9IENBTExfRVJST1JfRlVOQ1RJT047XG4gICAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBlcnJvciBmdW5jdGlvbiAqL1xuICAgIGNhc2UgNTovL0VSUk9SX0RFVEVDVEVEOlxuICAgICAgaWYgKGVycmZsYWcgPCAzKSB7XG4gICAgICAgIGVycmZsYWcgPSAzO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgc3RhdGUxID0gZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdO1xuICAgICAgICAgIG4xID0gdGFibGVzLnNpbmRleFtzdGF0ZTFdO1xuICAgICAgICAgIG4yID0gbjEgKyBFUlJDT0RFO1xuICAgICAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT0gRVJSQ09ERSkge1xuICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgICAgICBsb2coXCJSZWNvdmVyaW5nIGluIHN0YXRlIFwiICsgc3RhdGUxKTtcbiAgICAgICAgICAgIGNtZCA9IHNoaWZ0X3JlY292ZXI7IGJyZWFrIG5leHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgICAgICAgbG9nKFwiRGlzY2FyZGluZyBzdGF0ZSBcIiArIHN0YXRlMSk7XG4gICAgICAgICAgICBpZiAoc3AgPD0gZW52W2Vudl9zdGFja2Jhc2VdKSB7XG4gICAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgICAgICAgICBsb2coXCJObyBtb3JlIHN0YXRlcyB0byBkaXNjYXJkXCIpO1xuICAgICAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBUaGUgTUwgY29kZSByYWlzZXMgUGFyc2VfZXJyb3IgKi9cbiAgICAgICAgICAgIHNwLS07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZW52W2Vudl9jdXJyX2NoYXJdID09IDApXG4gICAgICAgICAgcmV0dXJuIFJBSVNFX1BBUlNFX0VSUk9SOyAvKiBUaGUgTUwgY29kZSByYWlzZXMgUGFyc2VfZXJyb3IgKi9cbiAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgIGxvZyhcIkRpc2NhcmRpbmcgbGFzdCB0b2tlbiByZWFkXCIpO1xuICAgICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSAtMTtcbiAgICAgICAgY21kID0gbG9vcDsgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICBjYXNlIDg6Ly9zaGlmdDpcbiAgICAgIGVudltlbnZfY3Vycl9jaGFyXSA9IC0xO1xuICAgICAgaWYgKGVycmZsYWcgPiAwKSBlcnJmbGFnLS07XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICBjYXNlIDk6Ly9zaGlmdF9yZWNvdmVyOlxuICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHNoaWZ0IHRvIHN0YXRlIFwiICsgdGFibGVzLnRhYmxlW24yXSk7XG4gICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICBzcCsrO1xuICAgICAgaWYgKHNwID49IGVudltlbnZfc3RhY2tzaXplXSkge1xuICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18xO1xuICAgICAgICBicmVhayBleGl0O1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSByZXNpemVzIHRoZSBzdGFja3MgKi9cbiAgICBjYXNlIDI6Ly9TVEFDS1NfR1JPV05fMTpcbiAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9sdmFsXTtcbiAgICAgIGVudltlbnZfc3ltYl9zdGFydF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9zdGFydF07XG4gICAgICBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX2VuZF07XG4gICAgICBjbWQgPSBsb29wO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIDEwOi8vcmVkdWNlOlxuICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlZHVjZSBieSBydWxlIFwiICsgbik7XG4gICAgICB2YXIgbSA9IHRhYmxlcy5sZW5bbl07XG4gICAgICBlbnZbZW52X2FzcF0gPSBzcDtcbiAgICAgIGVudltlbnZfcnVsZV9udW1iZXJdID0gbjtcbiAgICAgIGVudltlbnZfcnVsZV9sZW5dID0gbTtcbiAgICAgIHNwID0gc3AgLSBtICsgMTtcbiAgICAgIG0gPSB0YWJsZXMubGhzW25dO1xuICAgICAgc3RhdGUxID0gZW52W2Vudl9zX3N0YWNrXVtzcF07XG4gICAgICBuMSA9IHRhYmxlcy5naW5kZXhbbV07XG4gICAgICBuMiA9IG4xICsgc3RhdGUxO1xuICAgICAgaWYgKG4xICE9IDAgJiYgbjIgPj0gMCAmJiBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09IHN0YXRlMSlcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgZWxzZVxuICAgICAgICBzdGF0ZSA9IHRhYmxlcy5kZ290b1ttXTtcbiAgICAgIGlmIChzcCA+PSBlbnZbZW52X3N0YWNrc2l6ZV0pIHtcbiAgICAgICAgcmVzID0gR1JPV19TVEFDS1NfMjtcbiAgICAgICAgYnJlYWsgZXhpdDtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgcmVzaXplcyB0aGUgc3RhY2tzICovXG4gICAgY2FzZSAzOi8vU1RBQ0tTX0dST1dOXzI6XG4gICAgICByZXMgPSBDT01QVVRFX1NFTUFOVElDX0FDVElPTjtcbiAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgc2VtYW50aWMgYWN0aW9uICovXG4gICAgY2FzZSA0Oi8vU0VNQU5USUNfQUNUSU9OX0NPTVBVVEVEOlxuICAgICAgZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdID0gc3RhdGU7XG4gICAgICBlbnZbZW52X3Zfc3RhY2tdW3NwICsgMV0gPSBhcmc7XG4gICAgICB2YXIgYXNwID0gZW52W2Vudl9hc3BdO1xuICAgICAgZW52W2Vudl9zeW1iX2VuZF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW2FzcCArIDFdO1xuICAgICAgaWYgKHNwID4gYXNwKSB7XG4gICAgICAgIC8qIFRoaXMgaXMgYW4gZXBzaWxvbiBwcm9kdWN0aW9uLiBUYWtlIHN5bWJfc3RhcnQgZXF1YWwgdG8gc3ltYl9lbmQuICovXG4gICAgICAgIGVudltlbnZfc3ltYl9zdGFydF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW2FzcCArIDFdO1xuICAgICAgfVxuICAgICAgY21kID0gbG9vcDsgYnJlYWs7XG4gICAgICAvKiBTaG91bGQgbm90IGhhcHBlbiAqL1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7XG4gICAgfVxuICB9XG4gIC8vIFNBVkVcbiAgZW52W2Vudl9zcF0gPSBzcDtcbiAgZW52W2Vudl9zdGF0ZV0gPSBzdGF0ZTtcbiAgZW52W2Vudl9lcnJmbGFnXSA9IGVycmZsYWc7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X3BhcnNlcl90cmFjZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZXJfdHJhY2VcbmZ1bmN0aW9uIGNhbWxfc2V0X3BhcnNlcl90cmFjZShib29sKSB7XG4gIHZhciBvbGRmbGFnID0gY2FtbF9wYXJzZXJfdHJhY2U7XG4gIGNhbWxfcGFyc2VyX3RyYWNlID0gYm9vbDtcbiAgcmV0dXJuIG9sZGZsYWc7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VwZGF0ZV9kdW1teVxuZnVuY3Rpb24gY2FtbF91cGRhdGVfZHVtbXkgKHgsIHkpIHtcbiAgaWYoIHR5cGVvZiB5PT09XCJmdW5jdGlvblwiICkgeyB4LmZ1biA9IHk7IHJldHVybiAwOyB9XG4gIGlmKCB5LmZ1biApIHsgeC5mdW4gPSB5LmZ1bjsgcmV0dXJuIDA7IH1cbiAgdmFyIGkgPSB5Lmxlbmd0aDsgd2hpbGUgKGktLSkgeFtpXSA9IHlbaV07IHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX2R1bW15X2luZml4XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxfZ2VuXG5mdW5jdGlvbiBjYW1sX2FsbG9jX2R1bW15X2luZml4ICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGYgKHgpIHsgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZi5mdW4sIFt4XSkgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9pc19ibG9jayBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX29ial9pc19ibG9jayAoeCkgeyByZXR1cm4gKyh4IGluc3RhbmNlb2YgQXJyYXkpOyB9XG5cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX2lzX21sX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9vYmpfdGFnICh4KSB7XG4gIGlmICgoeCBpbnN0YW5jZW9mIEFycmF5KSAmJiB4WzBdID09ICh4WzBdID4+PiAwKSlcbiAgICByZXR1cm4geFswXVxuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHgpKVxuICAgIHJldHVybiAyNTJcbiAgZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcoeCkpXG4gICAgcmV0dXJuIDI1MlxuICBlbHNlIGlmICgoeCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fCB0eXBlb2YgeCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIDI0N1xuICBlbHNlIGlmICh4ICYmIHguY2FtbF9jdXN0b20pXG4gICAgcmV0dXJuIDI1NVxuICBlbHNlXG4gICAgcmV0dXJuIDEwMDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfc2V0X3RhZyAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX29ial9zZXRfdGFnICh4LCB0YWcpIHsgeFswXSA9IHRhZzsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2Jsb2NrIGNvbnN0IChjb25zdCxjb25zdClcbmZ1bmN0aW9uIGNhbWxfb2JqX2Jsb2NrICh0YWcsIHNpemUpIHtcbiAgdmFyIG8gPSBuZXcgQXJyYXkoc2l6ZSsxKTtcbiAgb1swXT10YWc7XG4gIGZvciAodmFyIGkgPSAxOyBpIDw9IHNpemU7IGkrKykgb1tpXSA9IDA7XG4gIHJldHVybiBvO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial93aXRoX3RhZ1xuZnVuY3Rpb24gY2FtbF9vYmpfd2l0aF90YWcodGFnLHgpIHtcbiAgdmFyIGwgPSB4Lmxlbmd0aDtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGFbMF0gPSB0YWc7XG4gIGZvcih2YXIgaSA9IDE7IGkgPCBsOyBpKysgKSBhW2ldID0geFtpXTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2R1cCBtdXRhYmxlIChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9vYmpfZHVwICh4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbDsgaSsrICkgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial90cnVuY2F0ZSAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfb2JqX3RydW5jYXRlICh4LCBzKSB7XG4gIGlmIChzPD0wIHx8IHMgKyAxID4geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIk9iai50cnVuY2F0ZVwiKTtcbiAgaWYgKHgubGVuZ3RoICE9IHMgKyAxKSB4Lmxlbmd0aCA9IHMgKyAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfbWFrZV9mb3J3YXJkXG5mdW5jdGlvbiBjYW1sX29ial9tYWtlX2ZvcndhcmQgKGIsdikge1xuICBiWzBdPTI1MDtcbiAgYlsxXT12O1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwXG5mdW5jdGlvbiBjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwKHgsaSxvbGQsbil7XG4gIGlmKHhbaSsxXSA9PSBvbGQpIHtcbiAgICB4W2krMV0gPSBuO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2lzX3NoYXJlZFxuZnVuY3Rpb24gY2FtbF9vYmpfaXNfc2hhcmVkKHgpe1xuICByZXR1cm4gMVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfbWFrZV9mb3J3YXJkIGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9sYXp5X21ha2VfZm9yd2FyZCAodikgeyByZXR1cm4gWzI1MCwgdl07IH1cblxuLy8vLy8vLy8vLy8vLyBDYW1saW50ZXJuYWxPT1xuLy9Qcm92aWRlczogY2FtbF9nZXRfcHVibGljX21ldGhvZCBjb25zdFxudmFyIGNhbWxfbWV0aG9kX2NhY2hlID0gW107XG5mdW5jdGlvbiBjYW1sX2dldF9wdWJsaWNfbWV0aG9kIChvYmosIHRhZywgY2FjaGVpZCkge1xuICB2YXIgbWV0aHMgPSBvYmpbMV07XG4gIHZhciBvZnMgPSBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXTtcbiAgaWYgKG9mcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBhcnJheSBpcyBub3Qgc3BhcnNlXG4gICAgZm9yICh2YXIgaSA9IGNhbWxfbWV0aG9kX2NhY2hlLmxlbmd0aDsgaSA8IGNhY2hlaWQ7IGkrKylcbiAgICAgIGNhbWxfbWV0aG9kX2NhY2hlW2ldID0gMDtcbiAgfSBlbHNlIGlmIChtZXRoc1tvZnNdID09PSB0YWcpIHtcbiAgICByZXR1cm4gbWV0aHNbb2ZzIC0gMV07XG4gIH1cbiAgdmFyIGxpID0gMywgaGkgPSBtZXRoc1sxXSAqIDIgKyAxLCBtaTtcbiAgd2hpbGUgKGxpIDwgaGkpIHtcbiAgICBtaSA9ICgobGkraGkpID4+IDEpIHwgMTtcbiAgICBpZiAodGFnIDwgbWV0aHNbbWkrMV0pIGhpID0gbWktMjtcbiAgICBlbHNlIGxpID0gbWk7XG4gIH1cbiAgY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF0gPSBsaSArIDE7XG4gIC8qIHJldHVybiAwIGlmIHRhZyBpcyBub3QgdGhlcmUgKi9cbiAgcmV0dXJuICh0YWcgPT0gbWV0aHNbbGkrMV0gPyBtZXRoc1tsaV0gOiAwKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vb19sYXN0X2lkXG52YXIgY2FtbF9vb19sYXN0X2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9zZXRfb29faWRcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9zZXRfb29faWQgKGIpIHtcbiAgYlsyXT1jYW1sX29vX2xhc3RfaWQrKztcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZnJlc2hfb29faWQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfb29fbGFzdF9pZFxuZnVuY3Rpb24gY2FtbF9mcmVzaF9vb19pZCgpIHtcbiAgcmV0dXJuIGNhbWxfb29fbGFzdF9pZCsrO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3Jhd19maWVsZChvLGkpIHsgcmV0dXJuIG9baSsxXSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF9yYXdfZmllbGRcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF9yYXdfZmllbGQobyxpLHYpIHsgcmV0dXJuIG9baSsxXSA9IHYgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9yZWFjaGFibGVfd29yZHNcbmZ1bmN0aW9uIGNhbWxfb2JqX3JlYWNoYWJsZV93b3JkcyhvKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2FkZF9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfb2JqX2FkZF9vZmZzZXQodixvZmZzZXQpIHtcbiAgY2FtbF9mYWlsd2l0aChcIk9iai5hZGRfb2Zmc2V0IGlzIG5vdCBzdXBwb3J0ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3VwZGF0ZV90YWdcbmZ1bmN0aW9uIGNhbWxfb2JqX3VwZGF0ZV90YWcoYixvLG4pIHtcbiAgICBpZihiWzBdPT1vKSB7IGJbMF0gPSBuOyByZXR1cm4gMSB9XG4gICAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X3VwZGF0ZV90b19mb3JjaW5nXG4vL1JlcXVpcmVzOiBjYW1sX29ial90YWcsIGNhbWxfb2JqX3VwZGF0ZV90YWcsIGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlblxuZnVuY3Rpb24gY2FtbF9sYXp5X3VwZGF0ZV90b19mb3JjaW5nKG8pIHtcbiAgdmFyIHQgPSBjYW1sX29ial90YWcobyk7XG4gIGlmKHQgIT0gMjQ2ICYmIHQgIT0gMjUwICYmIHQgIT0gMjQ0KVxuICAgIHJldHVybiA0XG4gIGlmKGNhbWxfb2JqX3VwZGF0ZV90YWcobywgMjQ2LCAyNDQpKSB7XG4gICAgcmV0dXJuIDBcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmllbGQwID0gb1sxXTtcbiAgICB0ID0gb1swXVxuICAgIGlmKHQgPT0gMjQ0KSB7XG4gICAgICBpZihmaWVsZDAgPT0gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuKDApKVxuICAgICAgICByZXR1cm4gMVxuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gMlxuICAgIH0gZWxzZSBpZiAodCA9PSAyNTApIHtcbiAgICAgIHJldHVybiAzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhc3NlcnQgdCA9IGxhenlfdGFnXG4gICAgICByZXR1cm4gMjtcbiAgICB9XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkXG4vL1JlcXVpcmVzOiBjYW1sX29ial91cGRhdGVfdGFnXG4gIGZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZChvKSB7XG4gIGNhbWxfb2JqX3VwZGF0ZV90YWcobywyNDQsMjUwKTtcbiAgcmV0dXJuIDA7IC8vIHVuaXRcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVzZXRfdG9fbGF6eVxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuZnVuY3Rpb24gY2FtbF9sYXp5X3Jlc2V0X3RvX2xhenkobykge1xuICBjYW1sX29ial91cGRhdGVfdGFnKG8sMjQ0LDI0Nik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfcmVhZF9yZXN1bHRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3RhZ1xuZnVuY3Rpb24gY2FtbF9sYXp5X3JlYWRfcmVzdWx0KG8pIHtcbiAgcmV0dXJuIChjYW1sX29ial90YWcobykgPT0gMjUwKT9vWzFdOm87XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9pc19jb250aW51YXRpb25fdGFnXG4vL1ZlcnNpb246IDwgNVxuZnVuY3Rpb24gY2FtbF9pc19jb250aW51YXRpb25fdGFnKHQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuLy9WZXJzaW9uOiA+PSA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodCkge1xuICByZXR1cm4gKHQgPT0gMjQ1KSA/IDEgOiAwO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzXG52YXIgY2FtbF9kb21haW5fZGxzID0gWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2RvbWFpbl9kbHNfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9kbHNcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX2Rsc19zZXQoYSkge1xuICBjYW1sX2RvbWFpbl9kbHMgPSBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2RvbWFpbl9kbHNfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9kbHNcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX2Rsc19nZXQodW5pdCkge1xuICByZXR1cm4gY2FtbF9kb21haW5fZGxzO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2xvYWRcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2xvYWQocmVmKXtcbiAgcmV0dXJuIHJlZlsxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfY2FzXG5mdW5jdGlvbiBjYW1sX2F0b21pY19jYXMocmVmLG8sbikge1xuICBpZihyZWZbMV0gPT09IG8pe1xuICAgIHJlZlsxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2ZldGNoX2FkZFxuZnVuY3Rpb24gY2FtbF9hdG9taWNfZmV0Y2hfYWRkKHJlZiwgaSkge1xuICB2YXIgb2xkID0gcmVmWzFdO1xuICByZWZbMV0gKz0gaTtcbiAgcmV0dXJuIG9sZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfZXhjaGFuZ2VcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2V4Y2hhbmdlKHJlZiwgdikge1xuICB2YXIgciA9IHJlZlsxXTtcbiAgcmVmWzFdID0gdjtcbiAgcmV0dXJuIHI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlblxudmFyIGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbl8gPSBbMF1cbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbih1bml0KSB7XG4gIHJldHVybiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fXG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fc2V0X25hbWVcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX3NldF9uYW1lKF9uYW1lKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuZnVuY3Rpb24gY2FtbF9yZWNvbW1lbmRlZF9kb21haW5fY291bnQodW5pdCkgeyByZXR1cm4gMSB9XG5cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5faWRcbnZhciBjYW1sX2RvbWFpbl9pZCA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX3NwYXduXG4vL1JlcXVpcmVzOiBjYW1sX21sX211dGV4X3VubG9ja1xuLy9SZXF1aXJlczogY2FtbF9kb21haW5faWRcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbnZhciBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4ID0gMVxuZnVuY3Rpb24gY2FtbF9kb21haW5fc3Bhd24oZixtdXRleCl7XG4gICAgdmFyIGlkID0gY2FtbF9kb21haW5fbGF0ZXN0X2lkeCsrO1xuICAgIHZhciBvbGQgPSBjYW1sX2RvbWFpbl9pZDtcbiAgICBjYW1sX2RvbWFpbl9pZCA9IGlkO1xuICAgIGNhbWxfY2FsbGJhY2soZixbMF0pO1xuICAgIGNhbWxfZG9tYWluX2lkID0gb2xkO1xuICAgIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKG11dGV4KTtcbiAgICByZXR1cm4gaWQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5faWRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG5mdW5jdGlvbiBjYW1sX21sX2RvbWFpbl9pZCh1bml0KXtcbiAgICByZXR1cm4gY2FtbF9kb21haW5faWQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4XG5mdW5jdGlvbiBjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXgodW5pdCl7XG4gICAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfdGFnKGEpe1xuICBpZiAodHlwZW9mIGEgPT09IFwibnVtYmVyXCIpIHJldHVybiAxMDAwOyAvLyBpbnRfdGFnICh3ZSB1c2UgaXQgZm9yIGFsbCBudW1iZXJzKVxuICBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKGEpKSByZXR1cm4gMjUyOyAvLyBzdHJpbmdfdGFnXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKGEpKSByZXR1cm4gMTI1MjsgLy8gb2NhbWwgc3RyaW5nIChpZiBkaWZmZXJlbnQgZnJvbSBieXRlcylcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIEFycmF5ICYmIGFbMF0gPT09IChhWzBdPj4+MCkgJiYgYVswXSA8PSAyNTUpIHtcbiAgICAvLyBMb29rIGxpa2UgYW4gb2NhbWwgYmxvY2tcbiAgICB2YXIgdGFnID0gYVswXSB8IDA7XG4gICAgLy8gaWdub3JlIGRvdWJsZV9hcnJheV90YWcgYmVjYXVzZSB3ZSBjYW5ub3QgYWNjdXJhdGVseSBzZXRcbiAgICAvLyB0aGlzIHRhZyB3aGVuIHdlIGNyZWF0ZSBhbiBhcnJheSBvZiBmbG9hdC5cbiAgICByZXR1cm4gKHRhZyA9PSAyNTQpPzA6dGFnXG4gIH1cbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIFN0cmluZykgcmV0dXJuIDEyNTIwOyAvLyBqYXZhc2NyaXB0IHN0cmluZywgbGlrZSBzdHJpbmdfdGFnICgyNTIpXG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwic3RyaW5nXCIpIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmIChhIGluc3RhbmNlb2YgTnVtYmVyKSByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoYSAmJiBhLmNhbWxfY3VzdG9tKSByZXR1cm4gMTI1NTsgLy8gbGlrZSBjdXN0b21fdGFnICgyNTUpXG4gIGVsc2UgaWYgKGEgJiYgYS5jb21wYXJlKSByZXR1cm4gMTI1NjsgLy8gbGlrZSBjdXN0b21fdGFnICgyNTUpXG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwiZnVuY3Rpb25cIikgcmV0dXJuIDEyNDc7IC8vIGxpa2UgY2xvc3VyZV90YWcgKDI0NylcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT0gXCJzeW1ib2xcIikgcmV0dXJuIDEyNTE7XG4gIHJldHVybiAxMDAxOyAvL291dF9vZl9oZWFwX3RhZ1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX29wc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpe1xuICByZXR1cm4gY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dICYmIGNhbWxfY3VzdG9tX29wc1thLmNhbWxfY3VzdG9tXS5jb21wYXJlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbVxuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tKG51bSwgY3VzdG9tLCBzd2FwLCB0b3RhbCkge1xuICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShjdXN0b20pO1xuICBpZihjb21wKSB7XG4gICAgdmFyIHggPSAoc3dhcCA+IDApP2NvbXAoY3VzdG9tLG51bSx0b3RhbCk6Y29tcChudW0sY3VzdG9tLHRvdGFsKTtcbiAgICBpZih0b3RhbCAmJiB4ICE9IHgpIHJldHVybiBzd2FwOyAvLyB0b3RhbCAmJiBuYW5cbiAgICBpZigreCAhPSAreCkgcmV0dXJuICt4OyAvLyBuYW5cbiAgICBpZigoeCB8IDApICE9IDApIHJldHVybiAoeCB8IDApOyAvLyAhbmFuXG4gIH1cbiAgcmV0dXJuIHN3YXBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbCAoY29uc3QsIGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW50X2NvbXBhcmUsIGNhbWxfc3RyaW5nX2NvbXBhcmUsIGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20sIGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b21cbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbCAoYSwgYiwgdG90YWwpIHtcbiAgdmFyIHN0YWNrID0gW107XG4gIGZvcig7Oykge1xuICAgIGlmICghKHRvdGFsICYmIGEgPT09IGIpKSB7XG4gICAgICB2YXIgdGFnX2EgPSBjYW1sX2NvbXBhcmVfdmFsX3RhZyhhKTtcbiAgICAgIC8vIGZvcndhcmRfdGFnID9cbiAgICAgIGlmKHRhZ19hID09IDI1MCkgeyBhID0gYVsxXTsgY29udGludWUgfVxuXG4gICAgICB2YXIgdGFnX2IgPSBjYW1sX2NvbXBhcmVfdmFsX3RhZyhiKTtcbiAgICAgIC8vIGZvcndhcmRfdGFnID9cbiAgICAgIGlmKHRhZ19iID09IDI1MCkgeyBiID0gYlsxXTsgY29udGludWUgfVxuXG4gICAgICAvLyB0YWdzIGFyZSBkaWZmZXJlbnRcbiAgICAgIGlmKHRhZ19hICE9PSB0YWdfYikge1xuICAgICAgICBpZih0YWdfYSA9PSAxMDAwKSB7XG4gICAgICAgICAgaWYodGFnX2IgPT0gMTI1NSkgeyAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShhLCBiLCAtMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgfVxuICAgICAgICBpZih0YWdfYiA9PSAxMDAwKSB7XG4gICAgICAgICAgaWYodGFnX2EgPT0gMTI1NSkgeyAvL2ltbWVkaWF0ZSBjYW4gY29tcGFyZSBhZ2FpbnN0IGN1c3RvbVxuICAgICAgICAgICAgcmV0dXJuIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShiLCBhLCAxLCB0b3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICh0YWdfYSA8IHRhZ19iKT8tMToxO1xuICAgICAgfVxuICAgICAgc3dpdGNoKHRhZ19hKXtcbiAgICAgICAgLy8gMjQ2OiBMYXp5X3RhZyBoYW5kbGVkIGJlbGxvd1xuICAgICAgY2FzZSAyNDc6IC8vIENsb3N1cmVfdGFnXG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjQ4OiAvLyBPYmplY3RcbiAgICAgICAgdmFyIHggPSBjYW1sX2ludF9jb21wYXJlKGFbMl0sIGJbMl0pO1xuICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI0OTogLy8gSW5maXhcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlblxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyNTA6IC8vIEZvcndhcmQgdGFnXG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW4sIGhhbmRsZWQgYWJvdmVcbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBGb3J3YXJkX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTE6IC8vQWJzdHJhY3RcbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGFic3RyYWN0IHZhbHVlXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUyOiAvLyBPQ2FtbCBieXRlc1xuICAgICAgICBpZiAoYSAhPT0gYikge1xuICAgICAgICAgIHZhciB4ID0gY2FtbF9ieXRlc19jb21wYXJlKGEsIGIpO1xuICAgICAgICAgIGlmICh4ICE9IDApIHJldHVybiAoeCB8IDApO1xuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUzOiAvLyBEb3VibGVfdGFnXG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBEb3VibGVfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1NDogLy8gRG91YmxlX2FycmF5X3RhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgRG91YmxlX2FycmF5X3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDI1NTogLy8gQ3VzdG9tX3RhZ1xuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IEN1c3RvbV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI0NzogLy8gRnVuY3Rpb25cbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTU6IC8vIEN1c3RvbVxuICAgICAgICB2YXIgY29tcCA9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShhKTtcbiAgICAgICAgaWYoY29tcCAhPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oYikpe1xuICAgICAgICAgIHJldHVybiAoYS5jYW1sX2N1c3RvbTxiLmNhbWxfY3VzdG9tKT8tMToxO1xuICAgICAgICB9XG4gICAgICAgIGlmKCFjb21wKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGFic3RyYWN0IHZhbHVlXCIpO1xuICAgICAgICB2YXIgeCA9IGNvbXAoYSxiLHRvdGFsKTtcbiAgICAgICAgaWYoeCAhPSB4KXsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgcmV0dXJuIHRvdGFsPy0xOng7XG4gICAgICAgIH1cbiAgICAgICAgaWYoeCAhPT0gKHh8MCkpeyAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTY6IC8vIGNvbXBhcmUgZnVuY3Rpb25cbiAgICAgICAgdmFyIHggPSBhLmNvbXBhcmUoYix0b3RhbCk7XG4gICAgICAgIGlmKHggIT0geCkgeyAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBVTk9SREVSRURcbiAgICAgICAgICByZXR1cm4gdG90YWw/LTE6eDtcbiAgICAgICAgfVxuICAgICAgICBpZih4ICE9PSAoeHwwKSl7IC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHJldHVybiB2YWx1ZVxuICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICB9XG4gICAgICAgIGlmICh4ICE9IDApIHJldHVybiAoeCB8IDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTAwMDogLy8gTnVtYmVyXG4gICAgICAgIGEgPSArYTtcbiAgICAgICAgYiA9ICtiO1xuICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKGEgIT0gYikge1xuICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOYU47XG4gICAgICAgICAgaWYgKGEgPT0gYSkgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGIgPT0gYikgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDAxOiAvLyBUaGUgcmVzdFxuICAgICAgICAvLyBIZXJlIHdlIGNhbiBiZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAgICAgICAvLyAxLiBKYXZhU2NyaXB0IHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAvLyAyLiBKYXZhU2NyaXB0IG9iamVjdCB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAvLyAzLiBKYXZhU2NyaXB0IG9iamVjdCB0aGFuIGNhbm5vdCBiZSBjb2VyY2VkIHRvIHByaW1pdGl2ZSB0eXBlc1xuICAgICAgICAvL1xuICAgICAgICAvLyAoMykgd2lsbCByYWlzZSBhIFtUeXBlRXJyb3JdXG4gICAgICAgIC8vICgyKSB3aWxsIGNvZXJjZSB0byBwcmltaXRpdmUgdHlwZXMgdXNpbmcgW3ZhbHVlT2ZdIG9yIFt0b1N0cmluZ11cbiAgICAgICAgLy8gKDIpIGFuZCAoMyksIGFmdGVyIGV2ZW50dWFsIGNvZXJjaW9uXG4gICAgICAgIC8vIC0gaWYgYSBhbmQgYiBhcmUgc3RyaW5ncywgYXBwbHkgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uXG4gICAgICAgIC8vIC0gaWYgYSBvciBiIGFyZSBub3Qgc3RyaW5ncywgY29udmVydCBhIGFuZCBiIHRvIG51bWJlclxuICAgICAgICAvLyAgIGFuZCBhcHBseSBzdGFuZGFyZCBjb21wYXJpc29uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEV4Y2VwdGlvbjogYCE9YCB3aWxsIG5vdCBjb2VyY2UvY29udmVydCBpZiBib3RoIGEgYW5kIGIgYXJlIG9iamVjdHNcbiAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhICE9IGIpIHtcbiAgICAgICAgICBpZiAoIXRvdGFsKSByZXR1cm4gTmFOO1xuICAgICAgICAgIGlmIChhID09IGEpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChiID09IGIpIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1MTogLy8gSmF2YVNjcmlwdCBTeW1ib2wsIG5vIG9yZGVyaW5nLlxuICAgICAgICBpZihhICE9PSBiKSB7XG4gICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1MjogLy8gb2NhbWwgc3RyaW5nc1xuICAgICAgICB2YXIgYSA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYSk7XG4gICAgICAgIHZhciBiID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhiKTtcbiAgICAgICAgaWYoYSAhPT0gYikge1xuICAgICAgICAgIGlmKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjUyMDogLy8gamF2YXNjcmlwdCBzdHJpbmdzXG4gICAgICAgIHZhciBhID0gYS50b1N0cmluZygpO1xuICAgICAgICB2YXIgYiA9IGIudG9TdHJpbmcoKTtcbiAgICAgICAgaWYoYSAhPT0gYikge1xuICAgICAgICAgIGlmKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgICAgaWYoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNDY6IC8vIExhenlfdGFnXG4gICAgICBjYXNlIDI1NDogLy8gRG91YmxlX2FycmF5XG4gICAgICBkZWZhdWx0OiAvLyBCbG9jayB3aXRoIG90aGVyIHRhZ1xuICAgICAgICBpZihjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodGFnX2EpKSB7XG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogY29udGludWF0aW9uIHZhbHVlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIChhLmxlbmd0aCA8IGIubGVuZ3RoKT8tMToxO1xuICAgICAgICBpZiAoYS5sZW5ndGggPiAxKSBzdGFjay5wdXNoKGEsIGIsIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YWNrLmxlbmd0aCA9PSAwKSByZXR1cm4gMDtcbiAgICB2YXIgaSA9IHN0YWNrLnBvcCgpO1xuICAgIGIgPSBzdGFjay5wb3AoKTtcbiAgICBhID0gc3RhY2sucG9wKCk7XG4gICAgaWYgKGkgKyAxIDwgYS5sZW5ndGgpIHN0YWNrLnB1c2goYSwgYiwgaSArIDEpO1xuICAgIGEgPSBhW2ldO1xuICAgIGIgPSBiW2ldO1xuICB9XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZSAoYSwgYikgeyByZXR1cm4gY2FtbF9jb21wYXJlX3ZhbCAoYSwgYiwgdHJ1ZSk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfaW50X2NvbXBhcmUgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9pbnRfY29tcGFyZSAoYSwgYikge1xuICBpZiAoYSA8IGIpIHJldHVybiAoLTEpOyBpZiAoYSA9PSBiKSByZXR1cm4gMDsgcmV0dXJuIDE7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2VxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZXF1YWwgKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpID09IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX25vdGVxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfbm90ZXF1YWwgKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpICE9IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJlcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPj0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JlYXRlcnRoYW4gbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ncmVhdGVydGhhbiAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPiAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9sZXNzZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzZXF1YWwgKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpIDw9IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3N0aGFuIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfbGVzc3RoYW4gKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpIDwgMCk7IH1cbiIsIi8vIEpzX29mX29jYW1sIGxpYnJhcnlcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBKc2xpYjogY29kZSBzcGVjaWZpYyB0byBKc19vZl9vY2FtbFxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29uX2llIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2pzX29uX2llICgpIHtcbiAgdmFyIHVhID1cbiAgICAgIGdsb2JhbFRoaXMubmF2aWdhdG9yP2dsb2JhbFRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudDpcIlwiO1xuICByZXR1cm4gdWEuaW5kZXhPZihcIk1TSUVcIikgIT0gLTEgJiYgdWEuaW5kZXhPZihcIk9wZXJhXCIpICE9IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaHRtbF9lc2NhcGUgY29uc3QgKGNvbnN0KVxudmFyIGNhbWxfanNfcmVnZXhwcyA9IHsgYW1wOi8mL2csIGx0Oi88L2csIHF1b3Q6L1xcXCIvZywgYWxsOi9bJjxcXFwiXS8gfTtcbmZ1bmN0aW9uIGNhbWxfanNfaHRtbF9lc2NhcGUgKHMpIHtcbiAgaWYgKCFjYW1sX2pzX3JlZ2V4cHMuYWxsLnRlc3QocykpIHJldHVybiBzO1xuICByZXR1cm4gcy5yZXBsYWNlKGNhbWxfanNfcmVnZXhwcy5hbXAsIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMubHQsIFwiJmx0O1wiKVxuICAgIC5yZXBsYWNlKGNhbWxfanNfcmVnZXhwcy5xdW90LCBcIiZxdW90O1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VudGl0aWVzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2pzX2h0bWxfZW50aXRpZXMocykge1xuICB2YXIgZW50aXR5ID0gL14mIz9bMC05YS16QS1aXSs7JC9cbiAgaWYocy5tYXRjaChlbnRpdHkpKVxuICB7XG4gICAgdmFyIHN0ciwgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3AnKTtcbiAgICB0ZW1wLmlubmVySFRNTD0gcztcbiAgICBzdHI9IHRlbXAudGV4dENvbnRlbnQgfHwgdGVtcC5pbm5lclRleHQ7XG4gICAgdGVtcD1udWxsO1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgZWxzZSB7XG4gICAgY2FtbF9mYWlsd2l0aChcIkludmFsaWQgZW50aXR5IFwiICsgcyk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19nZXRfY29uc29sZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9qc19nZXRfY29uc29sZSAoKSB7XG4gIHZhciBjID0gY29uc29sZTtcbiAgdmFyIG0gPSBbXCJsb2dcIiwgXCJkZWJ1Z1wiLCBcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIiwgXCJhc3NlcnRcIiwgXCJkaXJcIiwgXCJkaXJ4bWxcIixcbiAgICAgICAgICAgXCJ0cmFjZVwiLCBcImdyb3VwXCIsIFwiZ3JvdXBDb2xsYXBzZWRcIiwgXCJncm91cEVuZFwiLCBcInRpbWVcIiwgXCJ0aW1lRW5kXCJdO1xuICBmdW5jdGlvbiBmICgpIHt9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbS5sZW5ndGg7IGkrKykgaWYgKCFjW21baV1dKSBjW21baV1dPWY7XG4gIHJldHVybiBjO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3htbGh0dHByZXF1ZXN0X2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX3htbGh0dHByZXF1ZXN0X2NyZWF0ZSh1bml0KXtcbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLlhNTEh0dHBSZXF1ZXN0IH0gY2F0Y2ggKGUpIHsgfTtcbiAgfVxuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5hY3RpdmVYT2JqZWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7IHJldHVybiBuZXcgZ2xvYmFsVGhpcy5hY3RpdmVYT2JqZWN0KFwiTXN4bWwyLlhNTEhUVFBcIikgfSBjYXRjaChlKXsgfTtcbiAgICB0cnkgeyByZXR1cm4gbmV3IGdsb2JhbFRoaXMuYWN0aXZlWE9iamVjdChcIk1zeG1sMy5YTUxIVFRQXCIpIH0gY2F0Y2goZSl7IH07XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLmFjdGl2ZVhPYmplY3QoXCJNaWNyb3NvZnQuWE1MSFRUUFwiKSB9IGNhdGNoKGUpeyB9O1xuICB9XG4gIGNhbWxfZmFpbHdpdGgoXCJDYW5ub3QgY3JlYXRlIGEgWE1MSHR0cFJlcXVlc3RcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvbihleG4pIHtcbiAgaWYoZXhuLmpzX2Vycm9yKSB7IHJldHVybiBleG4uanNfZXJyb3I7IH1cbiAgcmV0dXJuIG51bGw7XG59XG4iLCIvLy8vLy8vLy8gQklHU1RSSU5HXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9iaWdzdHJpbmcoaCwgYnMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsYnMuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlcihicykge1xuICByZXR1cm4gYnMuZGF0YS5idWZmZXJcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5IG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b190eXBlZF9hcnJheShicykge1xuICByZXR1cm4gYnMuZGF0YVxufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlcihhYikge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShhYik7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGJpZ3N0cmluZ19vZl90eXBlZF9hcnJheShiYSkge1xuICB2YXIgdGEgPSBuZXcgVWludDhBcnJheShiYS5idWZmZXIsIGJhLmJ5dGVPZmZzZXQsIGJhLmxlbmd0aCAqIGJhLkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfbWVtY21wXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19tZW1jbXAoczEsIHBvczEsIHMyLCBwb3MyLCBsZW4pe1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGEgPSBjYW1sX2JhX2dldF8xKHMxLHBvczEgKyBpKTtcbiAgICB2YXIgYiA9IGNhbWxfYmFfZ2V0XzEoczIscG9zMiArIGkpO1xuICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYShiYTEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKXtcbiAgaWYoMTIgIT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYoMTIgIT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMSA9IGJhMS5vZmZzZXQocG9zMSk7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYob2ZzMSArIGxlbiA+IGJhMS5kYXRhLmxlbmd0aCl7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpe1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBiYTEuZGF0YS5zdWJhcnJheShvZnMxLG9mczErbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLHBvczIpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYShzdHIxLCBwb3MxLCBiYTIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMi5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZihsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYocG9zMSArIGxlbiA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzdHIxKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHN0cjEpLnNsaWNlKHBvczEscG9zMSArIGxlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSxvZnMyKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9ieXRlc190b19iYVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9ieXRlc190b19iYShzdHIxLCBwb3MxLCBiYTIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMi5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZihsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMyID0gYmEyLm9mZnNldChwb3MyKTtcbiAgaWYocG9zMSArIGxlbiA+IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHN0cjEpKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzdHIxKS5zbGljZShwb3MxLHBvczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2Usb2ZzMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9ibGl0X2J5dGVzLCBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlcyhiYTEsIHBvczEsIGJ5dGVzMiwgcG9zMiwgbGVuKXtcbiAgaWYoMTIgIT0gYmExLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICBpZihvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYocG9zMiArIGxlbiA+IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKGJ5dGVzMikpe1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBiYTEuZGF0YS5zbGljZShvZnMxLCBvZnMxK2xlbik7XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX2FycmF5KHNsaWNlKSwgMCwgYnl0ZXMyLCBwb3MyLCBsZW4pO1xuICByZXR1cm4gMFxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X2NoYW5cbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlLCBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX01ENUluaXQsIGNhbWxfTUQ1VXBkYXRlLCBjYW1sX01ENUZpbmFsXG5mdW5jdGlvbiBjYW1sX21kNV9jaGFuKGNoYW5pZCx0b3JlYWQpe1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSg0MDk2KTtcbiAgaWYodG9yZWFkIDwgMCl7XG4gICAgd2hpbGUodHJ1ZSl7XG4gICAgICB2YXIgcmVhZCA9IGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLGJ1ZmZlciwwLGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgaWYocmVhZCA9PSAwKSBicmVhaztcbiAgICAgIGNhbWxfTUQ1VXBkYXRlKGN0eCxidWZmZXIuc3ViYXJyYXkoMCwgcmVhZCksIHJlYWQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB3aGlsZSh0b3JlYWQgPiAwKSB7XG4gICAgICB2YXIgcmVhZCA9IGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLGJ1ZmZlciwwLCAodG9yZWFkID4gYnVmZmVyLmxlbmd0aCA/IGJ1ZmZlci5sZW5ndGggOiB0b3JlYWQpKTtcbiAgICAgIGlmKHJlYWQgPT0gMCkgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICAgICAgY2FtbF9NRDVVcGRhdGUoY3R4LGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKSwgcmVhZCk7XG4gICAgICB0b3JlYWQgLT0gcmVhZFxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkoY2FtbF9NRDVGaW5hbChjdHgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX3N0cmluZywgY2FtbF9tZDVfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWQ1X3N0cmluZyhzLCBvZnMsIGxlbikge1xuICByZXR1cm4gY2FtbF9tZDVfYnl0ZXMoY2FtbF9ieXRlc19vZl9zdHJpbmcocyksb2ZzLGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG52YXIgY2FtbF9NRDVUcmFuc2Zvcm0gPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBhZGQgKHgsIHkpIHsgcmV0dXJuICh4ICsgeSkgfCAwOyB9XG4gIGZ1bmN0aW9uIHh4KHEsYSxiLHgscyx0KSB7XG4gICAgYSA9IGFkZChhZGQoYSwgcSksIGFkZCh4LCB0KSk7XG4gICAgcmV0dXJuIGFkZCgoYSA8PCBzKSB8IChhID4+PiAoMzIgLSBzKSksIGIpO1xuICB9XG4gIGZ1bmN0aW9uIGZmKGEsYixjLGQseCxzLHQpIHtcbiAgICByZXR1cm4geHgoKGIgJiBjKSB8ICgofmIpICYgZCksIGEsIGIsIHgsIHMsIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGdnKGEsYixjLGQseCxzLHQpIHtcbiAgICByZXR1cm4geHgoKGIgJiBkKSB8IChjICYgKH5kKSksIGEsIGIsIHgsIHMsIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGhoKGEsYixjLGQseCxzLHQpIHsgcmV0dXJuIHh4KGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7IH1cbiAgZnVuY3Rpb24gaWkoYSxiLGMsZCx4LHMsdCkgeyByZXR1cm4geHgoYyBeIChiIHwgKH5kKSksIGEsIGIsIHgsIHMsIHQpOyB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh3LCBidWZmZXIpIHtcbiAgICB2YXIgYSA9IHdbMF0sIGIgPSB3WzFdLCBjID0gd1syXSwgZCA9IHdbM107XG5cbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWyAwXSwgNywgMHhENzZBQTQ3OCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsgMV0sIDEyLCAweEU4QzdCNzU2KTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWyAyXSwgMTcsIDB4MjQyMDcwREIpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbIDNdLCAyMiwgMHhDMUJEQ0VFRSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclsgNF0sIDcsIDB4RjU3QzBGQUYpO1xuICAgIGQgPSBmZihkLCBhLCBiLCBjLCBidWZmZXJbIDVdLCAxMiwgMHg0Nzg3QzYyQSk7XG4gICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlclsgNl0sIDE3LCAweEE4MzA0NjEzKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWyA3XSwgMjIsIDB4RkQ0Njk1MDEpO1xuICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbIDhdLCA3LCAweDY5ODA5OEQ4KTtcbiAgICBkID0gZmYoZCwgYSwgYiwgYywgYnVmZmVyWyA5XSwgMTIsIDB4OEI0NEY3QUYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMTBdLCAxNywgMHhGRkZGNUJCMSk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMV0sIDIyLCAweDg5NUNEN0JFKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWzEyXSwgNywgMHg2QjkwMTEyMik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsxM10sIDEyLCAweEZEOTg3MTkzKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWzE0XSwgMTcsIDB4QTY3OTQzOEUpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbMTVdLCAyMiwgMHg0OUI0MDgyMSk7XG5cbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWyAxXSwgNSwgMHhGNjFFMjU2Mik7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsgNl0sIDksIDB4QzA0MEIzNDApO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbMTFdLCAxNCwgMHgyNjVFNUE1MSk7XG4gICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlclsgMF0sIDIwLCAweEU5QjZDN0FBKTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWyA1XSwgNSwgMHhENjJGMTA1RCk7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsxMF0sIDksIDB4MDI0NDE0NTMpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbMTVdLCAxNCwgMHhEOEExRTY4MSk7XG4gICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlclsgNF0sIDIwLCAweEU3RDNGQkM4KTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWyA5XSwgNSwgMHgyMUUxQ0RFNik7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsxNF0sIDksIDB4QzMzNzA3RDYpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbIDNdLCAxNCwgMHhGNEQ1MEQ4Nyk7XG4gICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlclsgOF0sIDIwLCAweDQ1NUExNEVEKTtcbiAgICBhID0gZ2coYSwgYiwgYywgZCwgYnVmZmVyWzEzXSwgNSwgMHhBOUUzRTkwNSk7XG4gICAgZCA9IGdnKGQsIGEsIGIsIGMsIGJ1ZmZlclsgMl0sIDksIDB4RkNFRkEzRjgpO1xuICAgIGMgPSBnZyhjLCBkLCBhLCBiLCBidWZmZXJbIDddLCAxNCwgMHg2NzZGMDJEOSk7XG4gICAgYiA9IGdnKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMl0sIDIwLCAweDhEMkE0QzhBKTtcblxuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbIDVdLCA0LCAweEZGRkEzOTQyKTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWyA4XSwgMTEsIDB4ODc3MUY2ODEpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbMTFdLCAxNiwgMHg2RDlENjEyMik7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsxNF0sIDIzLCAweEZERTUzODBDKTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWyAxXSwgNCwgMHhBNEJFRUE0NCk7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlclsgNF0sIDExLCAweDRCREVDRkE5KTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWyA3XSwgMTYsIDB4RjZCQjRCNjApO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbMTBdLCAyMywgMHhCRUJGQkM3MCk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDQsIDB4Mjg5QjdFQzYpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbIDBdLCAxMSwgMHhFQUExMjdGQSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsgM10sIDE2LCAweEQ0RUYzMDg1KTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWyA2XSwgMjMsIDB4MDQ4ODFEMDUpO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbIDldLCA0LCAweEQ5RDREMDM5KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWzEyXSwgMTEsIDB4RTZEQjk5RTUpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbMTVdLCAxNiwgMHgxRkEyN0NGOCk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsgMl0sIDIzLCAweEM0QUM1NjY1KTtcblxuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbIDBdLCA2LCAweEY0MjkyMjQ0KTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWyA3XSwgMTAsIDB4NDMyQUZGOTcpO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbMTRdLCAxNSwgMHhBQjk0MjNBNyk7XG4gICAgYiA9IGlpKGIsIGMsIGQsIGEsIGJ1ZmZlclsgNV0sIDIxLCAweEZDOTNBMDM5KTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWzEyXSwgNiwgMHg2NTVCNTlDMyk7XG4gICAgZCA9IGlpKGQsIGEsIGIsIGMsIGJ1ZmZlclsgM10sIDEwLCAweDhGMENDQzkyKTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWzEwXSwgMTUsIDB4RkZFRkY0N0QpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbIDFdLCAyMSwgMHg4NTg0NUREMSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsgOF0sIDYsIDB4NkZBODdFNEYpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbMTVdLCAxMCwgMHhGRTJDRTZFMCk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsgNl0sIDE1LCAweEEzMDE0MzE0KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWzEzXSwgMjEsIDB4NEUwODExQTEpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbIDRdLCA2LCAweEY3NTM3RTgyKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzExXSwgMTAsIDB4QkQzQUYyMzUpO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbIDJdLCAxNSwgMHgyQUQ3RDJCQik7XG4gICAgYiA9IGlpKGIsIGMsIGQsIGEsIGJ1ZmZlclsgOV0sIDIxLCAweEVCODZEMzkxKTtcblxuICAgIHdbMF0gPSBhZGQoYSwgd1swXSk7XG4gICAgd1sxXSA9IGFkZChiLCB3WzFdKTtcbiAgICB3WzJdID0gYWRkKGMsIHdbMl0pO1xuICAgIHdbM10gPSBhZGQoZCwgd1szXSk7XG4gIH19KSgpXG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1SW5pdFxuZnVuY3Rpb24gY2FtbF9NRDVJbml0KCkge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDY0KTtcbiAgdmFyIGIzMiA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuICB2YXIgYjggPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICByZXR1cm4ge2xlbjowLFxuICAgICAgICAgIHc6bmV3IFVpbnQzMkFycmF5KFsweDY3NDUyMzAxLCAweEVGQ0RBQjg5LCAweDk4QkFEQ0ZFLCAweDEwMzI1NDc2XSksXG4gICAgICAgICAgYjMyOmIzMixcbiAgICAgICAgICBiODpiOH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9NRDVVcGRhdGVcbi8vUmVxdWlyZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG5mdW5jdGlvbiBjYW1sX01ENVVwZGF0ZShjdHgsIGlucHV0LCBpbnB1dF9sZW4pe1xuICB2YXIgaW5fYnVmID0gY3R4LmxlbiAmIDB4M2Y7XG4gIHZhciBpbnB1dF9wb3MgPSAwO1xuICBjdHgubGVuICs9IGlucHV0X2xlbjtcbiAgaWYoaW5fYnVmKXtcbiAgICB2YXIgbWlzc2luZyA9IDY0IC0gaW5fYnVmO1xuICAgIGlmKGlucHV0X2xlbiA8IG1pc3NpbmcpIHtcbiAgICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoMCxpbnB1dF9sZW4pLGluX2J1Zik7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheSgwLG1pc3NpbmcpLGluX2J1Zik7XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGlucHV0X2xlbiAtPSBtaXNzaW5nO1xuICAgIGlucHV0X3BvcyArPSBtaXNzaW5nO1xuICB9XG4gIHdoaWxlKGlucHV0X2xlbiA+PSA2NCl7XG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheShpbnB1dF9wb3MsaW5wdXRfcG9zICsgNjQpLCAwKTtcbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgaW5wdXRfbGVuIC09IDY0O1xuICAgIGlucHV0X3BvcyArPSA2NDtcbiAgfVxuICBpZihpbnB1dF9sZW4pXG4gICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheShpbnB1dF9wb3MsaW5wdXRfcG9zICsgaW5wdXRfbGVuKSwgMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1RmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfTUQ1VHJhbnNmb3JtXG5mdW5jdGlvbiBjYW1sX01ENUZpbmFsKGN0eCl7XG4gIHZhciBpbl9idWYgPSBjdHgubGVuICYgMHgzZjtcbiAgY3R4LmI4W2luX2J1Zl0gPSAweDgwO1xuICBpbl9idWYgKys7XG4gIGlmKGluX2J1ZiA+IDU2KSB7XG4gICAgZm9yKHZhciBqID0gaW5fYnVmOyBqIDwgNjQ7IGorKyl7XG4gICAgICBjdHguYjhbal0gPSAwO1xuICAgIH1cbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgZm9yKHZhciBqID0gMDsgaiA8IDU2OyBqKyspe1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yKHZhciBqID0gaW5fYnVmOyBqIDwgNTY7IGorKyl7XG4gICAgICBjdHguYjhbal0gPSAwO1xuICAgIH1cbiAgfVxuICBjdHguYjMyWzE0XSA9IGN0eC5sZW4gPDwgMztcbiAgY3R4LmIzMlsxNV0gPSAoY3R4LmxlbiA+PiAyOSkgJiAweDFGRkZGRkZGO1xuICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gIHZhciB0ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKylcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDQ7IGorKylcbiAgICAgIHRbaSAqIDQgKyBqXSA9IChjdHgud1tpXSA+PiAoOCAqIGopKSAmIDB4RkY7XG4gIHJldHVybiB0O1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX3N0cmluZ19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9NRDVJbml0LCBjYW1sX01ENVVwZGF0ZSwgY2FtbF9NRDVGaW5hbFxuZnVuY3Rpb24gY2FtbF9tZDVfYnl0ZXMocywgb2ZzLCBsZW4pIHtcbiAgdmFyIGN0eCA9IGNhbWxfTUQ1SW5pdCgpO1xuICB2YXIgYSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMocyk7XG4gIGNhbWxfTUQ1VXBkYXRlKGN0eCxhLnN1YmFycmF5KG9mcywgb2ZzICsgbGVuKSwgbGVuKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMjAgLSBIdWdvIEhldXphcmRcbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIFNoYWNoYXIgSXR6aGFreVxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNC4wNy9vdGhlcmxpYnMvc3RyL3N0cnN0dWJzLmNcbi8vIENvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc2NvcS9qc2NvcS9ibG9iL3Y4LjExL2NvcS1qcy9qc19zdHViL3N0ci5qc1xuXG4vL1Byb3ZpZGVzOiByZV9tYXRjaFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfZ2V0XG5cbnZhciByZV9tYXRjaCA9IGZ1bmN0aW9uKCl7XG4gIHZhciByZV93b3JkX2xldHRlcnMgPSBbXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogMHgwMC0weDFGOiBub25lICovXG4gICAgMHgwMCwgMHgwMCwgMHhGRiwgMHgwMywgICAgICAgLyogMHgyMC0weDNGOiBkaWdpdHMgMC05ICovXG4gICAgMHhGRSwgMHhGRiwgMHhGRiwgMHg4NywgICAgICAgLyogMHg0MC0weDVGOiBBIHRvIFosIF8gKi9cbiAgICAweEZFLCAweEZGLCAweEZGLCAweDA3LCAgICAgICAvKiAweDYwLTB4N0Y6IGEgdG8geiAqL1xuICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIDB4ODAtMHg5Rjogbm9uZSAqL1xuICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIDB4QTAtMHhCRjogbm9uZSAqL1xuICAgIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYsICAgICAgIC8qIDB4QzAtMHhERjogTGF0aW4tMSBhY2NlbnRlZCB1cHBlcmNhc2UgKi9cbiAgICAweEZGLCAweEZGLCAweDdGLCAweEZGICAgICAgICAvKiAweEUwLTB4RkY6IExhdGluLTEgYWNjZW50ZWQgbG93ZXJjYXNlICovXG4gIF07XG5cbiAgdmFyIG9wY29kZXMgPSB7XG4gICAgQ0hBUjogMCwgQ0hBUk5PUk06IDEsIFNUUklORzogMiwgU1RSSU5HTk9STTogMywgQ0hBUkNMQVNTOiA0LFxuICAgIEJPTDogNSwgRU9MOiA2LCBXT1JEQk9VTkRBUlk6IDcsXG4gICAgQkVHR1JPVVA6IDgsIEVOREdST1VQOiA5LCBSRUZHUk9VUDogMTAsXG4gICAgQUNDRVBUOiAxMSxcbiAgICBTSU1QTEVPUFQ6IDEyLCBTSU1QTEVTVEFSOiAxMywgU0lNUExFUExVUzogMTQsXG4gICAgR09UTzogMTUsIFBVU0hCQUNLOiAxNiwgU0VUTUFSSzogMTcsXG4gICAgQ0hFQ0tQUk9HUkVTUzogMThcbiAgfTtcblxuICBmdW5jdGlvbiBpc193b3JkX2xldHRlcihjKSB7XG4gICAgcmV0dXJuIChyZV93b3JkX2xldHRlcnNbICAoYyA+PiAzKV0gPj4gKGMgJiA3KSkgJiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5fYml0c2V0KHMsaSkge1xuICAgIHJldHVybiAoY2FtbF9zdHJpbmdfZ2V0KHMsKGkgPj4gMykpID4+IChpICYgNykpICYgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlX21hdGNoX2ltcGwocmUsIHMsIHBvcywgcGFydGlhbCkge1xuXG4gICAgdmFyIHByb2cgICAgICAgICAgPSBjYW1sX2pzX2Zyb21fYXJyYXkocmVbMV0pLFxuICAgICAgICBjcG9vbCAgICAgICAgID0gY2FtbF9qc19mcm9tX2FycmF5KHJlWzJdKSxcbiAgICAgICAgbm9ybXRhYmxlICAgICA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocmVbM10pLFxuICAgICAgICBudW1ncm91cHMgICAgID0gcmVbNF0gfCAwLFxuICAgICAgICBudW1yZWdpc3RlcnMgID0gcmVbNV0gfCAwLFxuICAgICAgICBzdGFydGNoYXJzICAgID0gcmVbNl0gfCAwO1xuXG4gICAgdmFyIHMgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhzKTtcblxuICAgIHZhciBwYyA9IDAsXG4gICAgICAgIHF1aXQgPSBmYWxzZSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgZ3JvdXBzID0gbmV3IEFycmF5KG51bWdyb3VwcyksXG4gICAgICAgIHJlX3JlZ2lzdGVyID0gbmV3IEFycmF5KG51bXJlZ2lzdGVycyk7XG5cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGdyb3Vwc1tpXSA9IHtzdGFydDogLTEsIGVuZDotMX1cbiAgICB9XG4gICAgZ3JvdXBzWzBdLnN0YXJ0ID0gcG9zO1xuXG4gICAgdmFyIGJhY2t0cmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBzdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKGl0ZW0udW5kbykge1xuICAgICAgICAgIGl0ZW0udW5kby5vYmpbaXRlbS51bmRvLnByb3BdID0gaXRlbS51bmRvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYoaXRlbS5wb3MpIHtcbiAgICAgICAgICBwYyA9IGl0ZW0ucG9zLnBjO1xuICAgICAgICAgIHBvcyA9IGl0ZW0ucG9zLnR4dDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1aXQgPSB0cnVlO1xuICAgIH07XG5cbiAgICB2YXIgcHVzaCA9IGZ1bmN0aW9uKGl0ZW0pIHsgc3RhY2sucHVzaChpdGVtKTsgfTtcblxuICAgIHZhciBhY2NlcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBncm91cHNbMF0uZW5kID0gcG9zO1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSgxICsgZ3JvdXBzLmxlbmd0aCoyKTtcbiAgICAgIHJlc3VsdFswXSA9IDA7IC8vIHRhZ1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBnID0gZ3JvdXBzW2ldO1xuICAgICAgICBpZihnLnN0YXJ0IDwgMCB8fCBnLmVuZCA8IDApIHtcbiAgICAgICAgICBnLnN0YXJ0ID0gZy5lbmQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbMippICsgMSBdID0gZy5zdGFydDtcbiAgICAgICAgcmVzdWx0WzIqaSArIDEgKyAxIF0gPSBnLmVuZDtcbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfTtcblxuICAgIHZhciBwcmVmaXhfbWF0Y2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZihwYXJ0aWFsKSByZXR1cm4gYWNjZXB0ICgpO1xuICAgICAgZWxzZSBiYWNrdHJhY2sgKCk7XG4gICAgfVxuXG4gICAgLyogTWFpbiBERkEgaW50ZXJwcmV0ZXIgbG9vcCAqL1xuICAgIHdoaWxlICghcXVpdCkge1xuICAgICAgdmFyIG9wID0gcHJvZ1twY10gJiAweGZmLFxuICAgICAgICAgIHNhcmcgPSBwcm9nW3BjXSA+PiA4LFxuICAgICAgICAgIHVhcmcgPSBzYXJnICYgMHhmZixcbiAgICAgICAgICBjID0gc1twb3NdLFxuICAgICAgICAgIGdyb3VwO1xuXG4gICAgICBwYysrO1xuXG4gICAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hBUjpcbiAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICBpZiAoYyA9PT0gdWFyZykgcG9zKys7XG4gICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkNIQVJOT1JNOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChub3JtdGFibGUuY2hhckNvZGVBdChjKSA9PT0gdWFyZykgcG9zKys7XG4gICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNUUklORzpcbiAgICAgICAgZm9yICh2YXIgYXJnID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhjcG9vbFt1YXJnXSksIGkgPSAwOyBpIDwgYXJnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmIChjID09PSBhcmcuY2hhckNvZGVBdChpKSlcbiAgICAgICAgICAgIGMgPSBzWysrcG9zXTtcbiAgICAgICAgICBlbHNlIHsgYmFja3RyYWNrKCk7IGJyZWFrOyB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU1RSSU5HTk9STTpcbiAgICAgICAgZm9yICh2YXIgYXJnID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhjcG9vbFt1YXJnXSksIGkgPSAwOyBpIDwgYXJnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmIChub3JtdGFibGUuY2hhckNvZGVBdChjKSA9PT0gYXJnLmNoYXJDb2RlQXQoaSkpXG4gICAgICAgICAgICBjID0gc1srK3Bvc107XG4gICAgICAgICAgZWxzZSB7IGJhY2t0cmFjaygpOyBicmVhazsgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkNIQVJDTEFTUzpcbiAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICBpZiAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkgcG9zKys7XG4gICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkJPTDpcbiAgICAgICAgaWYocG9zID4gMCAmJiBzW3BvcyAtIDFdICE9IDEwIC8qIFxcbiAqLykge2JhY2t0cmFjaygpfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5FT0w6XG4gICAgICAgIGlmKHBvcyA8IHMubGVuZ3RoICYmIHNbcG9zXSAhPSAxMCAvKiBcXG4gKi8pIHtiYWNrdHJhY2soKX1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuV09SREJPVU5EQVJZOlxuICAgICAgICBpZihwb3MgPT0gMCkge1xuICAgICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgICBpZihpc193b3JkX2xldHRlcihzWzBdKSkgYnJlYWs7XG4gICAgICAgICAgYmFja3RyYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zID09PSBzLmxlbmd0aCkge1xuICAgICAgICAgIGlmKGlzX3dvcmRfbGV0dGVyKHNbcG9zIC0gMV0pKSBicmVhaztcbiAgICAgICAgICBiYWNrdHJhY2sgKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYoaXNfd29yZF9sZXR0ZXIoc1twb3MgLSAxXSkgIT0gaXNfd29yZF9sZXR0ZXIoc1twb3NdKSkgYnJlYWs7XG4gICAgICAgICAgYmFja3RyYWNrICgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkJFR0dST1VQOlxuICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgcHVzaCh7dW5kbzoge29iajpncm91cCxcbiAgICAgICAgICAgICAgICAgICAgIHByb3A6J3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBncm91cC5zdGFydH19KTtcbiAgICAgICAgZ3JvdXAuc3RhcnQgPSBwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkVOREdST1VQOlxuICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgcHVzaCh7dW5kbzoge29iajogZ3JvdXAsXG4gICAgICAgICAgICAgICAgICAgICBwcm9wOidlbmQnLFxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwLmVuZH19KTtcbiAgICAgICAgZ3JvdXAuZW5kID0gcG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5SRUZHUk9VUDpcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgIGlmKGdyb3VwLnN0YXJ0IDwgMCB8fCBncm91cC5lbmQgPCAwKSB7YmFja3RyYWNrICgpOyBicmVha31cbiAgICAgICAgZm9yICh2YXIgaSA9IGdyb3VwLnN0YXJ0OyBpIDwgZ3JvdXAuZW5kOyBpKyspe1xuICAgICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgICBpZihzW2ldICE9IHNbcG9zXSkge2JhY2t0cmFjayAoKTsgYnJlYWt9XG4gICAgICAgICAgcG9zKys7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU0lNUExFT1BUOlxuICAgICAgICBpZiAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkgcG9zKys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNJTVBMRVNUQVI6XG4gICAgICAgIHdoaWxlIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKVxuICAgICAgICAgIGMgPSBzWysrcG9zXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU0lNUExFUExVUzpcbiAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICBpZiAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSkge1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGMgPSBzWysrcG9zXTtcbiAgICAgICAgICB9IHdoaWxlIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5BQ0NFUFQ6XG4gICAgICAgIHJldHVybiBhY2NlcHQoKTtcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5HT1RPOlxuICAgICAgICBwYyA9IHBjICsgc2FyZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuUFVTSEJBQ0s6XG4gICAgICAgIHB1c2goe3Bvczoge3BjOiBwYyArIHNhcmcsIHR4dDogcG9zfX0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TRVRNQVJLOlxuICAgICAgICBwdXNoKHt1bmRvOiB7b2JqOnJlX3JlZ2lzdGVyLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcDogdWFyZyxcbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZV9yZWdpc3Rlclt1YXJnXX19KTtcbiAgICAgICAgcmVfcmVnaXN0ZXJbdWFyZ10gPSBwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkNIRUNLUFJPR1JFU1M6XG4gICAgICAgIGlmIChyZV9yZWdpc3Rlclt1YXJnXSA9PT0gcG9zKSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJ5dGVjb2RlXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiByZV9tYXRjaF9pbXBsO1xufSgpO1xuXG5cbi8vUHJvdmlkZXM6IHJlX3NlYXJjaF9mb3J3YXJkXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIHJlX3NlYXJjaF9mb3J3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnNlYXJjaF9mb3J3YXJkXCIpXG4gIHdoaWxlIChwb3MgPD0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSB7XG4gICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgcG9zKys7XG4gIH1cblxuICByZXR1cm4gWzBdOyAgLyogW3x8XSA6IGludCBhcnJheSAqL1xufVxuXG4vL1Byb3ZpZGVzOiByZV9zZWFyY2hfYmFja3dhcmRcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfc2VhcmNoX2JhY2t3YXJkKHJlLCBzLCBwb3MpIHtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnNlYXJjaF9iYWNrd2FyZFwiKVxuICB3aGlsZSAocG9zID49IDApIHtcbiAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICBwb3MtLTtcbiAgfVxuXG4gIHJldHVybiBbMF07ICAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cblxuLy9Qcm92aWRlczogcmVfc3RyaW5nX21hdGNoXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIHJlX3N0cmluZ19tYXRjaChyZSxzLHBvcyl7XG4gIGlmKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zdHJpbmdfbWF0Y2hcIilcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3BhcnRpYWxfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfcGFydGlhbF9tYXRjaChyZSxzLHBvcyl7XG4gIGlmKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5wYXJ0aWFsX21hdGNoXCIpXG4gIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAxKTtcbiAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgZWxzZSByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiByZV9yZXBsYWNlbWVudF90ZXh0XG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2dldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy8gZXh0ZXJuYWwgcmVfcmVwbGFjZW1lbnRfdGV4dDogc3RyaW5nIC0+IGludCBhcnJheSAtPiBzdHJpbmcgLT4gc3RyaW5nXG5mdW5jdGlvbiByZV9yZXBsYWNlbWVudF90ZXh0KHJlcGwsZ3JvdXBzLG9yaWcpIHtcbiAgdmFyIHJlcGwgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHJlcGwpO1xuICB2YXIgbGVuID0gcmVwbC5sZW5ndGg7XG4gIHZhciBvcmlnID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhvcmlnKTtcbiAgdmFyIHJlcyA9IFwiXCI7IC8vcmVzdWx0XG4gIHZhciBuID0gMDsgLy8gY3VycmVudCBwb3NpdGlvblxuICB2YXIgY3VyOyAvL2N1cnJlbnQgY2hhclxuICB2YXIgc3RhcnQsIGVuZCwgYztcbiAgd2hpbGUobiA8IGxlbil7XG4gICAgY3VyID0gcmVwbC5jaGFyQXQobisrKTtcbiAgICBpZihjdXIgIT0gJ1xcXFwnKXtcbiAgICAgIHJlcyArPSBjdXI7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYobiA9PSBsZW4pIGNhbWxfZmFpbHdpdGgoXCJTdHIucmVwbGFjZTogaWxsZWdhbCBiYWNrc2xhc2ggc2VxdWVuY2VcIik7XG4gICAgICBjdXIgPSByZXBsLmNoYXJBdChuKyspO1xuICAgICAgc3dpdGNoKGN1cil7XG4gICAgICBjYXNlICdcXFxcJzpcbiAgICAgICAgcmVzICs9IGN1cjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6XG4gICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6XG4gICAgICAgIGMgPSArY3VyO1xuICAgICAgICBpZiAoYyoyID49IGdyb3Vwcy5sZW5ndGggLSAxIClcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IHJlZmVyZW5jZSB0byB1bm1hdGNoZWQgZ3JvdXBcIiApO1xuICAgICAgICBzdGFydCA9IGNhbWxfYXJyYXlfZ2V0KGdyb3VwcyxjKjIpO1xuICAgICAgICBlbmQgPSBjYW1sX2FycmF5X2dldChncm91cHMsIGMqMiArMSk7XG4gICAgICAgIGlmIChzdGFydCA9PSAtMSlcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IHJlZmVyZW5jZSB0byB1bm1hdGNoZWQgZ3JvdXBcIik7XG4gICAgICAgIHJlcys9b3JpZy5zbGljZShzdGFydCxlbmQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlcyArPSAoJ1xcXFwnICArIGN1cik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHJlcyk7IH1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cl9pbml0aWFsaXplXG5mdW5jdGlvbiBjYW1sX3N0cl9pbml0aWFsaXplKHVuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICovXG4vKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICovXG4vKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdpdGggICAgICovXG4vKiAgdGhlIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZpbGUgLi4vTElDRU5TRS4gICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qICRJZDogbGV4aW5nLmMgNjA0NSAyMDA0LTAxLTAxIDE2OjQyOjQzWiBkb2xpZ2V6ICQgKi9cblxuLyogVGhlIHRhYmxlLWRyaXZlbiBhdXRvbWF0b24gZm9yIGxleGVycyBnZW5lcmF0ZWQgYnkgY2FtbGxleC4gKi9cblxuLy9Qcm92aWRlczogY2FtbF9sZXhfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbGV4X2FycmF5KHMpIHtcbiAgcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocyk7XG4gIHZhciBsID0gcy5sZW5ndGggLyAyO1xuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgYVtpXSA9IChzLmNoYXJDb2RlQXQoMiAqIGkpIHwgKHMuY2hhckNvZGVBdCgyICogaSArIDEpIDw8IDgpKSA8PCAxNiA+PiAxNjtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGV4X2VuZ2luZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgY2FtbF9sZXhfYXJyYXksIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbGV4X2VuZ2luZSh0YmwsIHN0YXJ0X3N0YXRlLCBsZXhidWYpIHtcbiAgdmFyIGxleF9idWZmZXIgPSAyO1xuICB2YXIgbGV4X2J1ZmZlcl9sZW4gPSAzO1xuICB2YXIgbGV4X3N0YXJ0X3BvcyA9IDU7XG4gIHZhciBsZXhfY3Vycl9wb3MgPSA2O1xuICB2YXIgbGV4X2xhc3RfcG9zID0gNztcbiAgdmFyIGxleF9sYXN0X2FjdGlvbiA9IDg7XG4gIHZhciBsZXhfZW9mX3JlYWNoZWQgPSA5O1xuICB2YXIgbGV4X2Jhc2UgPSAxO1xuICB2YXIgbGV4X2JhY2t0cmsgPSAyO1xuICB2YXIgbGV4X2RlZmF1bHQgPSAzO1xuICB2YXIgbGV4X3RyYW5zID0gNDtcbiAgdmFyIGxleF9jaGVjayA9IDU7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSAgICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYXNlXSk7XG4gICAgdGJsLmxleF9iYWNrdHJrID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFja3Rya10pO1xuICAgIHRibC5sZXhfY2hlY2sgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2NoZWNrXSk7XG4gICAgdGJsLmxleF90cmFucyA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfdHJhbnNdKTtcbiAgICB0YmwubGV4X2RlZmF1bHQgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cblxuICB2YXIgYywgc3RhdGUgPSBzdGFydF9zdGF0ZTtcblxuICB2YXIgYnVmZmVyID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhsZXhidWZbbGV4X2J1ZmZlcl0pO1xuXG4gIGlmIChzdGF0ZSA+PSAwKSB7XG4gICAgLyogRmlyc3QgZW50cnkgKi9cbiAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfc3RhcnRfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgLyogUmVlbnRyeSBhZnRlciByZWZpbGwgKi9cbiAgICBzdGF0ZSA9IC1zdGF0ZSAtIDE7XG4gIH1cbiAgZm9yKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkgcmV0dXJuIC1iYXNlLTE7XG4gICAgLyogU2VlIGlmIGl0J3MgYSBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICB2YXIgYmFja3RyayA9IHRibC5sZXhfYmFja3Rya1tzdGF0ZV07XG4gICAgaWYgKGJhY2t0cmsgPj0gMCkge1xuICAgICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gYmFja3RyaztcbiAgICB9XG4gICAgLyogU2VlIGlmIHdlIG5lZWQgYSByZWZpbGwgKi9cbiAgICBpZiAobGV4YnVmW2xleF9jdXJyX3Bvc10gPj0gbGV4YnVmW2xleF9idWZmZXJfbGVuXSl7XG4gICAgICBpZiAobGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPT0gMClcbiAgICAgICAgcmV0dXJuIC1zdGF0ZSAtIDE7XG4gICAgICBlbHNlXG4gICAgICAgIGMgPSAyNTY7XG4gICAgfWVsc2V7XG4gICAgICAvKiBSZWFkIG5leHQgaW5wdXQgY2hhciAqL1xuICAgICAgYyA9IGJ1ZmZlcltsZXhidWZbbGV4X2N1cnJfcG9zXV07XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSArKztcbiAgICB9XG4gICAgLyogRGV0ZXJtaW5lIG5leHQgc3RhdGUgKi9cbiAgICBpZiAodGJsLmxleF9jaGVja1tiYXNlICsgY10gPT0gc3RhdGUpXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfdHJhbnNbYmFzZSArIGNdO1xuICAgIGVsc2VcbiAgICAgIHN0YXRlID0gdGJsLmxleF9kZWZhdWx0W3N0YXRlXTtcbiAgICAvKiBJZiBubyB0cmFuc2l0aW9uIG9uIHRoaXMgY2hhciwgcmV0dXJuIHRvIGxhc3QgYmFja3RyYWNrIHBvaW50ICovXG4gICAgaWYgKHN0YXRlIDwgMCkge1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gPSBsZXhidWZbbGV4X2xhc3RfcG9zXTtcbiAgICAgIGlmIChsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9PSAtMSlcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcImxleGluZzogZW1wdHkgdG9rZW5cIik7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXTtcbiAgICB9ZWxzZXtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09IDI1NikgbGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPSAwO1xuICAgIH1cbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiBOZXcgbGV4ZXIgZW5naW5lLCB3aXRoIG1lbW9yeSBvZiBwb3NpdGlvbnMgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vUHJvdmlkZXM6IGNhbWxfbmV3X2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fbWVtKHMsIGksIG1lbSwgY3Vycl9wb3MpIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkc3QgPSBzLmNoYXJDb2RlQXQoaSk7IGkrKztcbiAgICBpZiAoZHN0ID09IDB4ZmYpIHJldHVybjtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKHNyYyA9PSAweGZmKVxuICAgICAgbWVtIFtkc3QgKyAxXSA9IGN1cnJfcG9zO1xuICAgIGVsc2VcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSBtZW0gW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbGV4X3J1bl90YWcocywgaSwgbWVtKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZHN0ID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKGRzdCA9PSAweGZmKSByZXR1cm4gO1xuICAgIHZhciBzcmMgPSBzLmNoYXJDb2RlQXQoaSk7IGkrKztcbiAgICBpZiAoc3JjID09IDB4ZmYpXG4gICAgICBtZW0gW2RzdCArIDFdID0gLTE7XG4gICAgZWxzZVxuICAgICAgbWVtIFtkc3QgKyAxXSA9IG1lbSBbc3JjICsgMV07XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FtbF9uZXdfbGV4X2VuZ2luZSh0YmwsIHN0YXJ0X3N0YXRlLCBsZXhidWYpIHtcbiAgdmFyIGxleF9idWZmZXIgPSAyO1xuICB2YXIgbGV4X2J1ZmZlcl9sZW4gPSAzO1xuICB2YXIgbGV4X3N0YXJ0X3BvcyA9IDU7XG4gIHZhciBsZXhfY3Vycl9wb3MgPSA2O1xuICB2YXIgbGV4X2xhc3RfcG9zID0gNztcbiAgdmFyIGxleF9sYXN0X2FjdGlvbiA9IDg7XG4gIHZhciBsZXhfZW9mX3JlYWNoZWQgPSA5O1xuICB2YXIgbGV4X21lbSA9IDEwO1xuICB2YXIgbGV4X2Jhc2UgPSAxO1xuICB2YXIgbGV4X2JhY2t0cmsgPSAyO1xuICB2YXIgbGV4X2RlZmF1bHQgPSAzO1xuICB2YXIgbGV4X3RyYW5zID0gNDtcbiAgdmFyIGxleF9jaGVjayA9IDU7XG4gIHZhciBsZXhfYmFzZV9jb2RlID0gNjtcbiAgdmFyIGxleF9iYWNrdHJrX2NvZGUgPSA3O1xuICB2YXIgbGV4X2RlZmF1bHRfY29kZSA9IDg7XG4gIHZhciBsZXhfdHJhbnNfY29kZSA9IDk7XG4gIHZhciBsZXhfY2hlY2tfY29kZSA9IDEwO1xuICB2YXIgbGV4X2NvZGUgPSAxMTtcblxuICBpZiAoIXRibC5sZXhfZGVmYXVsdCkge1xuICAgIHRibC5sZXhfYmFzZSA9ICAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYWNrdHJrXSk7XG4gICAgdGJsLmxleF9jaGVjayA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfY2hlY2tdKTtcbiAgICB0YmwubGV4X3RyYW5zID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF90cmFuc10pO1xuICAgIHRibC5sZXhfZGVmYXVsdCA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2RlZmF1bHRdKTtcbiAgfVxuICBpZiAoIXRibC5sZXhfZGVmYXVsdF9jb2RlKSB7XG4gICAgdGJsLmxleF9iYXNlX2NvZGUgPSAgICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYXNlX2NvZGVdKTtcbiAgICB0YmwubGV4X2JhY2t0cmtfY29kZSA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2JhY2t0cmtfY29kZV0pO1xuICAgIHRibC5sZXhfY2hlY2tfY29kZSA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfY2hlY2tfY29kZV0pO1xuICAgIHRibC5sZXhfdHJhbnNfY29kZSA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfdHJhbnNfY29kZV0pO1xuICAgIHRibC5sZXhfZGVmYXVsdF9jb2RlID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfZGVmYXVsdF9jb2RlXSk7XG4gIH1cbiAgaWYgKHRibC5sZXhfY29kZSA9PSBudWxsKSB0YmwubGV4X2NvZGUgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHRibFtsZXhfY29kZV0pO1xuXG4gIHZhciBjLCBzdGF0ZSA9IHN0YXJ0X3N0YXRlO1xuXG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGxleGJ1ZltsZXhfYnVmZmVyXSk7XG5cbiAgaWYgKHN0YXRlID49IDApIHtcbiAgICAvKiBGaXJzdCBlbnRyeSAqL1xuICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9zdGFydF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICAvKiBSZWVudHJ5IGFmdGVyIHJlZmlsbCAqL1xuICAgIHN0YXRlID0gLXN0YXRlIC0gMTtcbiAgfVxuICBmb3IoOzspIHtcbiAgICAvKiBMb29rdXAgYmFzZSBhZGRyZXNzIG9yIGFjdGlvbiBudW1iZXIgZm9yIGN1cnJlbnQgc3RhdGUgKi9cbiAgICB2YXIgYmFzZSA9IHRibC5sZXhfYmFzZVtzdGF0ZV07XG4gICAgaWYgKGJhc2UgPCAwKSB7XG4gICAgICB2YXIgcGNfb2ZmID0gdGJsLmxleF9iYXNlX2NvZGVbc3RhdGVdO1xuICAgICAgY2FtbF9sZXhfcnVuX3RhZyh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dKTtcbiAgICAgIHJldHVybiAtYmFzZS0xO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgaXQncyBhIGJhY2t0cmFjayBwb2ludCAqL1xuICAgIHZhciBiYWNrdHJrID0gdGJsLmxleF9iYWNrdHJrW3N0YXRlXTtcbiAgICBpZiAoYmFja3RyayA+PSAwKSB7XG4gICAgICB2YXIgcGNfb2ZmID0gdGJsLmxleF9iYWNrdHJrX2NvZGVbc3RhdGVdO1xuICAgICAgY2FtbF9sZXhfcnVuX3RhZyh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dKTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IGJhY2t0cms7XG4gICAgfVxuICAgIC8qIFNlZSBpZiB3ZSBuZWVkIGEgcmVmaWxsICovXG4gICAgaWYgKGxleGJ1ZltsZXhfY3Vycl9wb3NdID49IGxleGJ1ZltsZXhfYnVmZmVyX2xlbl0pe1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09IDApXG4gICAgICAgIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZVxuICAgICAgICBjID0gMjU2O1xuICAgIH1lbHNle1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBidWZmZXJbbGV4YnVmW2xleF9jdXJyX3Bvc11dO1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgdmFyIHBzdGF0ZSA9IHN0YXRlIDtcbiAgICBpZiAodGJsLmxleF9jaGVja1tiYXNlICsgY10gPT0gc3RhdGUpXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfdHJhbnNbYmFzZSArIGNdO1xuICAgIGVsc2VcbiAgICAgIHN0YXRlID0gdGJsLmxleF9kZWZhdWx0W3N0YXRlXTtcbiAgICAvKiBJZiBubyB0cmFuc2l0aW9uIG9uIHRoaXMgY2hhciwgcmV0dXJuIHRvIGxhc3QgYmFja3RyYWNrIHBvaW50ICovXG4gICAgaWYgKHN0YXRlIDwgMCkge1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gPSBsZXhidWZbbGV4X2xhc3RfcG9zXTtcbiAgICAgIGlmIChsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9PSAtMSlcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcImxleGluZzogZW1wdHkgdG9rZW5cIik7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXTtcbiAgICB9ZWxzZXtcbiAgICAgIC8qIElmIHNvbWUgdHJhbnNpdGlvbiwgZ2V0IGFuZCBwZXJmb3JtIG1lbW9yeSBtb3ZlcyAqL1xuICAgICAgdmFyIGJhc2VfY29kZSA9IHRibC5sZXhfYmFzZV9jb2RlW3BzdGF0ZV0sIHBjX29mZjtcbiAgICAgIGlmICh0YmwubGV4X2NoZWNrX2NvZGVbYmFzZV9jb2RlICsgY10gPT0gcHN0YXRlKVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X3RyYW5zX2NvZGVbYmFzZV9jb2RlICsgY107XG4gICAgICBlbHNlXG4gICAgICAgIHBjX29mZiA9IHRibC5sZXhfZGVmYXVsdF9jb2RlW3BzdGF0ZV07XG4gICAgICBpZiAocGNfb2ZmID4gMClcbiAgICAgICAgY2FtbF9sZXhfcnVuX21lbVxuICAgICAgKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0sIGxleGJ1ZltsZXhfY3Vycl9wb3NdKTtcbiAgICAgIC8qIEVyYXNlIHRoZSBFT0YgY29uZGl0aW9uIG9ubHkgaWYgdGhlIEVPRiBwc2V1ZG8tY2hhcmFjdGVyIHdhc1xuICAgICAgICAgY29uc3VtZWQgYnkgdGhlIGF1dG9tYXRvbiAoaS5lLiB0aGVyZSB3YXMgbm8gYmFja3RyYWNrIGFib3ZlKVxuICAgICAgKi9cbiAgICAgIGlmIChjID09IDI1NikgbGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPSAwO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBBcnJheVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X3N1YiBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X3N1YiAoYSwgaSwgbGVuKSB7XG4gIHZhciBhMiA9IG5ldyBBcnJheShsZW4rMSk7XG4gIGEyWzBdPTA7XG4gIGZvcih2YXIgaTIgPSAxLCBpMT0gaSsxOyBpMiA8PSBsZW47IGkyKyssaTErKyApe1xuICAgIGEyW2kyXT1hW2kxXTtcbiAgfVxuICByZXR1cm4gYTI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYXBwZW5kIG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfYXBwZW5kKGExLCBhMikge1xuICB2YXIgbDEgPSBhMS5sZW5ndGgsIGwyID0gYTIubGVuZ3RoO1xuICB2YXIgbCA9IGwxK2wyLTFcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGFbMF0gPSAwO1xuICB2YXIgaSA9IDEsaiA9IDE7XG4gIGZvcig7aTxsMTtpKyspIGFbaV09YTFbaV07XG4gIGZvcig7aTxsO2krKyxqKyspIGFbaV09YTJbal07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2NvbmNhdCBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X2NvbmNhdChsKSB7XG4gIHZhciBhID0gWzBdO1xuICB3aGlsZSAobCAhPT0gMCkge1xuICAgIHZhciBiID0gbFsxXTtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGIubGVuZ3RoOyBpKyspIGEucHVzaChiW2ldKTtcbiAgICBsID0gbFsyXTtcbiAgfVxuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9ibGl0XG5mdW5jdGlvbiBjYW1sX2FycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICBpZiAoaTIgPD0gaTEpIHtcbiAgICBmb3IgKHZhciBqID0gMTsgaiA8PSBsZW47IGorKykgYTJbaTIgKyBqXSA9IGExW2kxICsgal07XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaiA9IGxlbjsgaiA+PSAxOyBqLS0pIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2JsaXRcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vLy8vLy8vLy8vLy8gUGVydmFzaXZlXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X3NldCAobXV0YWJsZSwgY29uc3QsIG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2FycmF5X3NldCAoYXJyYXksIGluZGV4LCBuZXd2YWwpIHtcbiAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBhcnJheS5sZW5ndGggLSAxKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBhcnJheVtpbmRleCsxXT1uZXd2YWw7IHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2dldCBtdXRhYmxlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfZ2V0IChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBhcnJheS5sZW5ndGggLSAxKSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXlbaW5kZXgrMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfZmlsbFxuZnVuY3Rpb24gY2FtbF9hcnJheV9maWxsKGFycmF5LCBvZnMsIGxlbiwgdil7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgYXJyYXlbb2ZzK2krMV0gPSB2O1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoZWNrX2JvdW5kIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfY2hlY2tfYm91bmQgKGFycmF5LCBpbmRleCkge1xuICBpZiAoaW5kZXggPj4+IDAgPj0gYXJyYXkubGVuZ3RoIC0gMSkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJyYXk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV92ZWN0IGNvbnN0IChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfbWFrZV92ZWN0IChsZW4sIGluaXQpIHtcbiAgaWYgKGxlbiA8IDApIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IGxlbiArIDEgfCAwO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4pO1xuICBiWzBdPTA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSBpbml0O1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX2Zsb2F0X3ZlY3QgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX2Zsb2F0X3ZlY3QobGVuKXtcbiAgaWYgKGxlbiA8IDApIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IGxlbiArIDEgfCAwO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4pO1xuICBiWzBdPTI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfZmxvYXRhcnJheV9jcmVhdGUobGVuKXtcbiAgaWYgKGxlbiA8IDApIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGxlbiA9IGxlbiArIDEgfCAwO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4pO1xuICBiWzBdPTI1NDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IDA7XG4gIHJldHVybiBiXG59XG4iLCIvL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludF9wb3Bjb3VudCBjb25zdFxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnRfcG9wY291bnQodikge1xuICB2ID0gdiAtICgodiA+Pj4gMSkgJiAweDU1NTU1NTU1KTtcbiAgdiA9ICh2ICYgMHgzMzMzMzMzMykgKyAoKHYgPj4+IDIpICYgMHgzMzMzMzMzMyk7XG4gIHJldHVybiAoKHYgKyAodiA+Pj4gNCkgJiAweEYwRjBGMEYpICogMHgxMDEwMTAxKSA+Pj4gMjQ7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfY2xlYXJfY2FtbF9iYWNrdHJhY2VfcG9zIGNvbnN0XG5mdW5jdGlvbiBCYXNlX2NsZWFyX2NhbWxfYmFja3RyYWNlX3Bvcyh4KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2NhbWxfZXhuX2lzX21vc3RfcmVjZW50X2V4biBjb25zdFxuZnVuY3Rpb24gQmFzZV9jYW1sX2V4bl9pc19tb3N0X3JlY2VudF9leG4oeCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHogY29uc3RcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50MzJfY2x6KHgpIHtcbiAgdmFyIG4gPSAzMjtcbiAgdmFyIHk7XG4gIHkgPSB4ID4+MTY7IGlmICh5ICE9IDApIHsgbiA9IG4gLTE2OyB4ID0geTsgfVxuICB5ID0geCA+PiA4OyBpZiAoeSAhPSAwKSB7IG4gPSBuIC0gODsgeCA9IHk7IH1cbiAgeSA9IHggPj4gNDsgaWYgKHkgIT0gMCkgeyBuID0gbiAtIDQ7IHggPSB5OyB9XG4gIHkgPSB4ID4+IDI7IGlmICh5ICE9IDApIHsgbiA9IG4gLSAyOyB4ID0geTsgfVxuICB5ID0geCA+PiAxOyBpZiAoeSAhPSAwKSByZXR1cm4gbiAtIDI7XG4gIHJldHVybiBuIC0geDtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnRfY2x6IGNvbnN0XG4vL1JlcXVpcmVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2NselxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnRfY2x6KHgpIHsgcmV0dXJuIEJhc2VfaW50X21hdGhfaW50MzJfY2x6KHgpOyB9XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfbmF0aXZlaW50X2NseiBjb25zdFxuLy9SZXF1aXJlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHpcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfbmF0aXZlaW50X2Nseih4KSB7IHJldHVybiBCYXNlX2ludF9tYXRoX2ludDMyX2Nseih4KTsgfVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludDY0X2NseiBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCwgY2FtbF9pbnQ2NF9pc196ZXJvLCBjYW1sX2ludDY0X3RvX2ludDMyXG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludDY0X2Nseih4KSB7XG4gIHZhciBuID0gNjQ7XG4gIHZhciB5O1xuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAzMik7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSB7IG4gPSBuIC0zMjsgeCA9IHk7IH1cbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMTYpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgeyBuID0gbiAtMTY7IHggPSB5OyB9XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDgpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgeyBuID0gbiAtIDg7IHggPSB5OyB9XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDQpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgeyBuID0gbiAtIDQ7IHggPSB5OyB9XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDIpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgeyBuID0gbiAtIDI7IHggPSB5OyB9XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDEpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgcmV0dXJuIG4gLSAyO1xuICByZXR1cm4gbiAtIGNhbWxfaW50NjRfdG9faW50MzIoeCk7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY3R6IGNvbnN0XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludDMyX2N0eih4KSB7XG4gIGlmICh4ID09PSAwKSB7IHJldHVybiAzMjsgfVxuICB2YXIgbiA9IDE7XG4gIGlmICggKHggJiAweDAwMDBGRkZGKSA9PT0gMCkgeyBuID0gbiArIDE2OyB4ID0geCA+PiAxNjsgfVxuICBpZiAoICh4ICYgMHgwMDAwMDBGRikgPT09IDApIHsgbiA9IG4gKyAgODsgeCA9IHggPj4gIDg7IH1cbiAgaWYgKCAoeCAmIDB4MDAwMDAwMEYpID09PSAwKSB7IG4gPSBuICsgIDQ7IHggPSB4ID4+ICA0OyB9XG4gIGlmICggKHggJiAweDAwMDAwMDAzKSA9PT0gMCkgeyBuID0gbiArICAyOyB4ID0geCA+PiAgMjsgfVxuICByZXR1cm4gbiAtICh4ICYgMSk7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50X2N0eiBjb25zdFxuLy9SZXF1aXJlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHpcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50X2N0eih4KSB7IHJldHVybiBCYXNlX2ludF9tYXRoX2ludDMyX2N0eih4KTsgfVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jdHogY29uc3Rcbi8vUmVxdWlyZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY3R6XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jdHooeCkgeyByZXR1cm4gQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHooeCk7IH1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnQ2NF9jdHogY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQsIGNhbWxfaW50NjRfaXNfemVybywgY2FtbF9pbnQ2NF90b19pbnQzMlxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hbmQsIGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludDY0X2N0eih4KSB7XG4gIGlmIChjYW1sX2ludDY0X2lzX3plcm8oeCkpIHsgcmV0dXJuIDY0OyB9XG4gIHZhciBuID0gMTtcbiAgZnVuY3Rpb24gaXNfemVybyAoeCkgICAgeyByZXR1cm4gY2FtbF9pbnQ2NF9pc196ZXJvKHgpOyB9XG4gIGZ1bmN0aW9uIGxhbmQgKHgseSkgICAgIHsgcmV0dXJuIGNhbWxfaW50NjRfYW5kKHgsIHkpOyB9XG4gIGZ1bmN0aW9uIHNtYWxsX2ludDY0KHgpIHsgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKHgsMCwwKTsgfVxuICBpZiAoaXNfemVybyhsYW5kKHgsIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKDB4RkZGRkZGLCAweDAwMDBGRiwgMHgwMDAwKSkpKSB7XG4gICAgbiA9IG4gKyAzMjsgeCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMzIpO1xuICB9XG4gIGlmIChpc196ZXJvKGxhbmQoeCwgc21hbGxfaW50NjQoMHgwMEZGRkYpKSkpIHtcbiAgICBuID0gbiArIDE2OyB4ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAxNik7XG4gIH1cbiAgaWYgKGlzX3plcm8obGFuZCh4LCBzbWFsbF9pbnQ2NCgweDAwMDBGRikpKSkge1xuICAgIG4gPSBuICsgIDg7IHggPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDgpO1xuICB9XG4gIGlmIChpc196ZXJvKGxhbmQoeCwgc21hbGxfaW50NjQoMHgwMDAwMEYpKSkpIHtcbiAgICBuID0gbiArICA0OyB4ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCA0KTtcbiAgfVxuICBpZiAoaXNfemVybyhsYW5kKHgsIHNtYWxsX2ludDY0KDB4MDAwMDAzKSkpKSB7XG4gICAgbiA9IG4gKyAgMjsgeCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMik7XG4gIH1cbiAgcmV0dXJuIG4gLSAoY2FtbF9pbnQ2NF90b19pbnQzMihjYW1sX2ludDY0X2FuZCh4LCBzbWFsbF9pbnQ2NCgweDAwMDAwMSkpKSk7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50X3Bvd19zdHViIGNvbnN0XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludF9wb3dfc3R1YihiYXNlLCBleHBvbmVudCkge1xuICB2YXIgb25lID0gMTtcbiAgdmFyIG11bCA9IFtvbmUsIGJhc2UsIG9uZSwgb25lXTtcbiAgdmFyIHJlcyA9IG9uZTtcbiAgd2hpbGUgKCFleHBvbmVudD09MCkge1xuICAgIG11bFsxXSA9IChtdWxbMV0gKiBtdWxbM10pIHwgMDtcbiAgICBtdWxbMl0gPSAobXVsWzFdICogbXVsWzFdKSB8IDA7XG4gICAgbXVsWzNdID0gKG11bFsyXSAqIG11bFsxXSkgfCAwO1xuICAgIHJlcyA9IChyZXMgKiBtdWxbZXhwb25lbnQgJiAzXSkgfCAwO1xuICAgIGV4cG9uZW50ID0gZXhwb25lbnQgPj4gMjtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludDY0X3Bvd19zdHViIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X211bCwgY2FtbF9pbnQ2NF9pc196ZXJvLCBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaSwgY2FtbF9pbnQ2NF9sbzMyXG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludDY0X3Bvd19zdHViKGJhc2UsIGV4cG9uZW50KSB7XG4gIHZhciBvbmUgPSBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaSgxLDApO1xuICB2YXIgbXVsID0gW29uZSwgYmFzZSwgb25lLCBvbmVdO1xuICB2YXIgcmVzID0gb25lO1xuICB3aGlsZSAoIWNhbWxfaW50NjRfaXNfemVybyhleHBvbmVudCkpIHtcbiAgICBtdWxbMV0gPSBjYW1sX2ludDY0X211bChtdWxbMV0sIG11bFszXSk7XG4gICAgbXVsWzJdID0gY2FtbF9pbnQ2NF9tdWwobXVsWzFdLCBtdWxbMV0pO1xuICAgIG11bFszXSA9IGNhbWxfaW50NjRfbXVsKG11bFsyXSwgbXVsWzFdKTtcbiAgICByZXMgPSBjYW1sX2ludDY0X211bChyZXMsIG11bFtjYW1sX2ludDY0X2xvMzIoZXhwb25lbnQpICYgM10pO1xuICAgIGV4cG9uZW50ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZChleHBvbmVudCwgMik7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogQmFzZV9oYXNoX3N0cmluZyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hcbmZ1bmN0aW9uIEJhc2VfaGFzaF9zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9oYXNoKDEsMSwwLHMpXG59XG4vL1Byb3ZpZGVzOiBCYXNlX2hhc2hfZG91YmxlIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hcbmZ1bmN0aW9uIEJhc2VfaGFzaF9kb3VibGUoZCkge1xuICByZXR1cm4gY2FtbF9oYXNoKDEsMSwwLGQpO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2FtX3Rlc3RpbmcgY29uc3Rcbi8vV2Vha2RlZlxuZnVuY3Rpb24gQmFzZV9hbV90ZXN0aW5nKHgpIHtcbiAgcmV0dXJuIDA7XG59XG4iLCJcbi8vUHJvdmlkZXM6IE1sTXV0ZXhcbmZ1bmN0aW9uIE1sTXV0ZXgoKSB7XG4gIHRoaXMubG9ja2VkID0gZmFsc2Vcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF9uZXdcbi8vUmVxdWlyZXM6IE1sTXV0ZXhcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfbmV3KHVuaXQpIHtcbiAgcmV0dXJuIG5ldyBNbE11dGV4KCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfbG9ja1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9sb2NrKHQpIHtcbiAgaWYodC5sb2NrZWQpXG4gICAgY2FtbF9mYWlsd2l0aChcIk11dGV4LmxvY2s6IG11dGV4IGFscmVhZHkgbG9ja2VkLiBDYW5ub3Qgd2FpdC5cIik7XG4gIGVsc2UgdC5sb2NrZWQgPSB0cnVlO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF90cnlfbG9ja1xuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF90cnlfbG9jayh0KSB7XG4gIGlmKCF0LmxvY2tlZCkge1xuICAgIHQubG9ja2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF91bmxvY2tcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfdW5sb2NrKHQpIHtcbiAgdC5sb2NrZWQgPSBmYWxzZTtcbiAgcmV0dXJuIDA7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gV2VhayBBUElcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbnZhciBjYW1sX2VwaGVfa2V5X29mZnNldCA9IDNcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2RhdGFfb2Zmc2V0ID0gMlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2VwaGVfa2V5X29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX3NldF9rZXkoeCwgaSwgdikge1xuICBpZihpIDwgMCB8fCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgPj0geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuc2V0XCIpO1xuICBpZiAodiBpbnN0YW5jZW9mIE9iamVjdCAmJiBnbG9iYWxUaGlzLldlYWtSZWYpIHtcbiAgICBpZih4WzFdLnJlZ2lzdGVyKSB4WzFdLnJlZ2lzdGVyKHYsIHVuZGVmaW5lZCwgdik7XG4gICAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gbmV3IGdsb2JhbFRoaXMuV2Vha1JlZih2KTtcbiAgfVxuICBlbHNlIHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXSA9IHY7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9rZXkoeCwgaSkge1xuICBpZihpIDwgMCB8fCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgPj0geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuc2V0XCIpO1xuICBpZihnbG9iYWxUaGlzLldlYWtSZWYgJiYgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmICYmIHhbMV0udW5yZWdpc3Rlcikge1xuICAgIHZhciBvbGQgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0uZGVyZWYoKTtcbiAgICBpZihvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGNvdW50ID0gMFxuICAgICAgZm9yKHZhciBqID0gY2FtbF9lcGhlX2tleV9vZmZzZXQ7IGogPCB4Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgdmFyIGtleSA9IHhbal07XG4gICAgICAgIGlmKGtleSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZil7XG4gICAgICAgICAga2V5ID0ga2V5LmRlcmVmKClcbiAgICAgICAgICBpZihrZXkgPT09IG9sZCkgY291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYoY291bnQgPT0gMSkgeFsxXS51bnJlZ2lzdGVyKG9sZCk7XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXSA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIDBcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX3dlYWtfY3JlYXRlLCBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jcmVhdGUgKG4pIHtcbiAgdmFyIHggPSBjYW1sX3dlYWtfY3JlYXRlKG4pO1xuICByZXR1cm4geDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF93ZWFrX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXQsIGNhbWxfaW52YWxpZF9hcmd1bWVudCxjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfd2Vha19jcmVhdGUgKG4pIHtcbiAgaWYgKG4gPCAwKSBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiV2Vhay5jcmVhdGVcIik7XG4gIHZhciB4ID0gWzI1MSxcImNhbWxfZXBoZV9saXN0X2hlYWRcIl07XG4gIHgubGVuZ3RoID0gY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBuO1xuICByZXR1cm4geDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF93ZWFrX3NldFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfc2V0X2tleSwgY2FtbF9lcGhlX3Vuc2V0X2tleVxuZnVuY3Rpb24gY2FtbF93ZWFrX3NldCh4LCBpLCB2KSB7XG4gIGlmKHYgPT0gMCkgY2FtbF9lcGhlX3Vuc2V0X2tleSh4LGkpXG4gIGVsc2UgY2FtbF9lcGhlX3NldF9rZXkoeCxpLHZbMV0pXG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vQWxpYXM6IGNhbWxfd2Vha19nZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfa2V5KHgsIGkpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLmdldF9rZXlcIik7XG4gIHZhciB3ZWFrID0geFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgXTtcbiAgaWYoZ2xvYmFsVGhpcy5XZWFrUmVmICYmIHdlYWsgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYpIHdlYWsgPSB3ZWFrLmRlcmVmKCk7XG4gIHJldHVybiAod2Vhaz09PXVuZGVmaW5lZCk/MDpbMCwgd2Vha107XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZ2V0X2tleV9jb3B5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZ2V0X2tleSxjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9vYmpfZHVwLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vQWxpYXM6IGNhbWxfd2Vha19nZXRfY29weVxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9rZXlfY29weSh4LCBpKSB7XG4gIGlmKGkgPCAwIHx8IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaSA+PSB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiV2Vhay5nZXRfY29weVwiKTtcbiAgdmFyIHkgPSBjYW1sX2VwaGVfZ2V0X2tleSh4LCBpKTtcbiAgaWYgKHkgPT09IDApIHJldHVybiB5O1xuICB2YXIgeiA9IHlbMV07XG4gIGlmICh6IGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBbMCwgY2FtbF9vYmpfZHVwKHopXTtcbiAgcmV0dXJuIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9jaGVja19rZXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vQWxpYXM6IGNhbWxfd2Vha19jaGVja1xuZnVuY3Rpb24gY2FtbF9lcGhlX2NoZWNrX2tleSh4LCBpKSB7XG4gIHZhciB3ZWFrID0geFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldO1xuICBpZihnbG9iYWxUaGlzLldlYWtSZWYgJiYgd2VhayBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikgd2VhayA9IHdlYWsuZGVyZWYoKTtcbiAgaWYod2Vhaz09PXVuZGVmaW5lZClcbiAgICByZXR1cm4gMDtcbiAgZWxzZVxuICAgIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vQWxpYXM6IGNhbWxfd2Vha19ibGl0XG5mdW5jdGlvbiBjYW1sX2VwaGVfYmxpdF9rZXkoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICAvLyBtaW51cyBvbmUgYmVjYXVzZSBjYW1sX2FycmF5X2JsaXQgd29ya3Mgb24gb2NhbWwgYXJyYXlcbiAgY2FtbF9hcnJheV9ibGl0KGExLCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkxIC0gMSxcbiAgICAgICAgICAgICAgICAgIGEyLCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkyIC0gMSxcbiAgICAgICAgICAgICAgICAgIGxlbik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfYmxpdF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9zZXRfZGF0YSwgY2FtbF9lcGhlX3Vuc2V0X2RhdGFcbmZ1bmN0aW9uIGNhbWxfZXBoZV9ibGl0X2RhdGEoc3JjLCBkc3Qpe1xuICB2YXIgbiA9IHNyY1tjYW1sX2VwaGVfZGF0YV9vZmZzZXRdO1xuICBpZihuID09PSB1bmRlZmluZWQpIGNhbWxfZXBoZV91bnNldF9kYXRhKGRzdCk7XG4gIGVsc2UgY2FtbF9lcGhlX3NldF9kYXRhKGRzdCwgbik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhKHgpe1xuICBpZih4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gMDtcbiAgZWxzZVxuICAgIHJldHVybiBbMCwgeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9vYmpfZHVwXG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2RhdGFfY29weSh4KXtcbiAgaWYoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0pXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2VwaGVfdW5zZXRfZGF0YVxuZnVuY3Rpb24gY2FtbF9lcGhlX3NldF9kYXRhKHgsIGRhdGEpe1xuICBpZihnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5ICYmIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIGlmKCEgKHhbMV0gaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5KSkge1xuICAgICAgeFsxXSA9IG5ldyBnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5KGZ1bmN0aW9uICgpIHsgY2FtbF9lcGhlX3Vuc2V0X2RhdGEoeCkgfSk7XG4gICAgICAvL3JlZ2lzdGVyIGFsbCBrZXlzXG4gICAgICBmb3IodmFyIGogPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaiA8IHgubGVuZ3RoOyBqKyspe1xuICAgICAgICB2YXIga2V5ID0geFtqXTtcbiAgICAgICAgaWYoa2V5IGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICAgICAga2V5ID0ga2V5LmRlcmVmKCk7XG4gICAgICAgICAgaWYoa2V5KSB4WzFdLnJlZ2lzdGVyKGtleSwgdW5kZWZpbmVkLCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IGRhdGE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfdW5zZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0LCBjYW1sX2VwaGVfa2V5X29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX3Vuc2V0X2RhdGEoeCl7XG4gIGlmKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgaWYoeFsxXSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkpe1xuICAgICAgLy91bnJlZ2lzdGVyIGFsbCBrZXlzXG4gICAgICBmb3IodmFyIGogPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaiA8IHgubGVuZ3RoOyBqKyspe1xuICAgICAgICB2YXIga2V5ID0geFtqXTtcbiAgICAgICAgaWYoa2V5IGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgICAgICAga2V5ID0ga2V5LmRlcmVmKCk7XG4gICAgICAgICAgaWYoa2V5KSB4WzFdLnVucmVnaXN0ZXIoa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSB1bmRlZmluZWQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfY2hlY2tfZGF0YSh4KXtcbiAgaWYoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gMTtcbn1cbiIsIlxuLy9Qcm92aWRlczogY2FtbF9seG1fbmV4dFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3hvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hZGRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NldF8xXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9uZXdfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2x4bV9uZXh0KHYpIHtcbiAgZnVuY3Rpb24gc2hpZnRfbCh4LCBrKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0KHgsayk7XG4gIH1cbiAgZnVuY3Rpb24gc2hpZnRfcih4LCBrKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LGspO1xuICB9XG4gIGZ1bmN0aW9uIG9yKGEsIGIpe1xuICAgIHJldHVybiBjYW1sX2ludDY0X29yKGEsYik7XG4gIH1cbiAgZnVuY3Rpb24geG9yKGEsIGIpe1xuICAgIHJldHVybiBjYW1sX2ludDY0X3hvcihhLGIpO1xuICB9XG4gIGZ1bmN0aW9uIGFkZChhLCBiKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9hZGQoYSxiKTtcbiAgfVxuICBmdW5jdGlvbiBtdWwoYSwgYil7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfbXVsKGEsYik7XG4gIH1cbiAgZnVuY3Rpb24gcm90bCh4LCBrKSB7XG4gICAgcmV0dXJuIG9yKHNoaWZ0X2woeCxrKSxzaGlmdF9yICh4LCA2NCAtIGspKTtcbiAgfVxuICBmdW5jdGlvbiBnZXQoYSwgaSkge1xuICAgIHJldHVybiBjYW1sX2JhX2dldF8xKGEsIGkpO1xuICB9XG4gIGZ1bmN0aW9uIHNldChhLCBpLCB4KSB7XG4gICAgcmV0dXJuIGNhbWxfYmFfc2V0XzEoYSwgaSwgeCk7XG4gIH1cbiAgdmFyIE0gPSBjYW1sX2ludDY0X29mX3N0cmluZyhjYW1sX25ld19zdHJpbmcoXCIweGQxMzQyNTQzZGU4MmVmOTVcIikpO1xuICB2YXIgZGFiYSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKGNhbWxfbmV3X3N0cmluZyhcIjB4ZGFiYTBiNmViMDkzMjJlM1wiKSk7XG4gIHZhciB6LCBxMCwgcTE7XG4gIHZhciBzdCA9IHY7XG4gIHZhciBhID0gZ2V0KHN0LDApO1xuICB2YXIgcyA9IGdldChzdCwxKTtcbiAgdmFyIHgwID0gZ2V0KHN0LDIpO1xuICB2YXIgeDEgPSBnZXQoc3QsMyk7XG4gIC8qIENvbWJpbmluZyBvcGVyYXRpb24gKi9cbiAgeiA9IGFkZChzLCB4MCk7XG4gIC8qIE1peGluZyBmdW5jdGlvbiAqL1xuICB6ID0gbXVsKHhvcih6LHNoaWZ0X3IoeiwzMikpLCBkYWJhKTtcbiAgeiA9IG11bCh4b3IoeixzaGlmdF9yKHosMzIpKSwgZGFiYSk7XG4gIHogPSB4b3IoeixzaGlmdF9yKHosMzIpKTtcbiAgLyogTENHIHVwZGF0ZSAqL1xuICBzZXQoc3QsIDEsIGFkZCAobXVsKHMsTSksIGEpKTtcbiAgLyogWEJHIHVwZGF0ZSAqL1xuICB2YXIgcTAgPSB4MFxuICB2YXIgcTEgPSB4MVxuICBxMSA9IHhvcihxMSxxMCk7XG4gIHEwID0gcm90bChxMCwgMjQpO1xuICBxMCA9IHhvcih4b3IocTAsIHExKSwgKHNoaWZ0X2wocTEsMTYpKSk7XG4gIHExID0gcm90bChxMSwgMzcpO1xuICBzZXQoc3QsIDIsIHEwKTtcbiAgc2V0KHN0LCAzLCBxMSk7XG4gIC8qIFJldHVybiByZXN1bHQgKi9cbiAgcmV0dXJuIHo7XG59XG4iLCJcbi8vUHJvdmlkZXM6IHpzdGRfZGVjb21wcmVzc1xudmFyIHpzdGRfZGVjb21wcmVzcyA9IChmdW5jdGlvbiAoKSB7XG5cInVzZSBzdHJpY3RcIjtcbi8vIGFsaWFzZXMgZm9yIHNob3J0ZXIgY29tcHJlc3NlZCBjb2RlIChtb3N0IG1pbmlmZXJzIGRvbid0IGRvIHRoaXMpXG52YXIgYWIgPSBBcnJheUJ1ZmZlciwgdTggPSBVaW50OEFycmF5LCB1MTYgPSBVaW50MTZBcnJheSwgaTE2ID0gSW50MTZBcnJheSwgdTMyID0gVWludDMyQXJyYXksIGkzMiA9IEludDMyQXJyYXk7XG52YXIgc2xjID0gZnVuY3Rpb24gKHYsIHMsIGUpIHtcbiAgICBpZiAodTgucHJvdG90eXBlLnNsaWNlKVxuICAgICAgICByZXR1cm4gdTgucHJvdG90eXBlLnNsaWNlLmNhbGwodiwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMClcbiAgICAgICAgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpXG4gICAgICAgIGUgPSB2Lmxlbmd0aDtcbiAgICB2YXIgbiA9IG5ldyB1OChlIC0gcyk7XG4gICAgbi5zZXQodi5zdWJhcnJheShzLCBlKSk7XG4gICAgcmV0dXJuIG47XG59O1xudmFyIGZpbGwgPSBmdW5jdGlvbiAodiwgbiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuZmlsbClcbiAgICAgICAgcmV0dXJuIHU4LnByb3RvdHlwZS5maWxsLmNhbGwodiwgbiwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMClcbiAgICAgICAgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpXG4gICAgICAgIGUgPSB2Lmxlbmd0aDtcbiAgICBmb3IgKDsgcyA8IGU7ICsrcylcbiAgICAgICAgdltzXSA9IG47XG4gICAgcmV0dXJuIHY7XG59O1xudmFyIGNwdyA9IGZ1bmN0aW9uICh2LCB0LCBzLCBlKSB7XG4gICAgaWYgKHU4LnByb3RvdHlwZS5jb3B5V2l0aGluKVxuICAgICAgICByZXR1cm4gdTgucHJvdG90eXBlLmNvcHlXaXRoaW4uY2FsbCh2LCB0LCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKVxuICAgICAgICBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aClcbiAgICAgICAgZSA9IHYubGVuZ3RoO1xuICAgIHdoaWxlIChzIDwgZSkge1xuICAgICAgICB2W3QrK10gPSB2W3MrK107XG4gICAgfVxufTtcbi8qKlxuICogQ29kZXMgZm9yIGVycm9ycyBnZW5lcmF0ZWQgd2l0aGluIHRoaXMgbGlicmFyeVxuICovXG4vLyBlcnJvciBjb2Rlc1xudmFyIGVjID0gW1xuICAgICdpbnZhbGlkIHpzdGQgZGF0YScsXG4gICAgJ3dpbmRvdyBzaXplIHRvbyBsYXJnZSAoPjIwNDZNQiknLFxuICAgICdpbnZhbGlkIGJsb2NrIHR5cGUnLFxuICAgICdGU0UgYWNjdXJhY3kgdG9vIGhpZ2gnLFxuICAgICdtYXRjaCBkaXN0YW5jZSB0b28gZmFyIGJhY2snLFxuICAgICd1bmV4cGVjdGVkIEVPRidcbl07XG47XG52YXIgZXJyID0gZnVuY3Rpb24gKGluZCwgbXNnLCBudCkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKG1zZyB8fCBlY1tpbmRdKTtcbiAgICBlLmNvZGUgPSBpbmQ7XG4gICAgaWYgKCFudClcbiAgICAgICAgdGhyb3cgZTtcbiAgICByZXR1cm4gZTtcbn07XG52YXIgcmIgPSBmdW5jdGlvbiAoZCwgYiwgbikge1xuICAgIHZhciBpID0gMCwgbyA9IDA7XG4gICAgZm9yICg7IGkgPCBuOyArK2kpXG4gICAgICAgIG8gfD0gZFtiKytdIDw8IChpIDw8IDMpO1xuICAgIHJldHVybiBvO1xufTtcbnZhciBiNCA9IGZ1bmN0aW9uIChkLCBiKSB7IHJldHVybiAoZFtiXSB8IChkW2IgKyAxXSA8PCA4KSB8IChkW2IgKyAyXSA8PCAxNikgfCAoZFtiICsgM10gPDwgMjQpKSA+Pj4gMDsgfTtcbi8vIHJlYWQgWnN0YW5kYXJkIGZyYW1lIGhlYWRlclxudmFyIHJ6ZmggPSBmdW5jdGlvbiAoZGF0LCB3KSB7XG4gICAgdmFyIG4zID0gZGF0WzBdIHwgKGRhdFsxXSA8PCA4KSB8IChkYXRbMl0gPDwgMTYpO1xuICAgIGlmIChuMyA9PSAweDJGQjUyOCAmJiBkYXRbM10gPT0gMjUzKSB7XG4gICAgICAgIC8vIFpzdGFuZGFyZFxuICAgICAgICB2YXIgZmxnID0gZGF0WzRdO1xuICAgICAgICAvLyAgICBzaW5nbGUgc2VnbWVudCAgICAgICBjaGVja3N1bSAgICAgICAgICAgICBkaWN0IGZsYWcgICAgIGZyYW1lIGNvbnRlbnQgZmxhZ1xuICAgICAgICB2YXIgc3MgPSAoZmxnID4+IDUpICYgMSwgY2MgPSAoZmxnID4+IDIpICYgMSwgZGYgPSBmbGcgJiAzLCBmY2YgPSBmbGcgPj4gNjtcbiAgICAgICAgaWYgKGZsZyAmIDgpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgIC8vIGJ5dGVcbiAgICAgICAgdmFyIGJ0ID0gNiAtIHNzO1xuICAgICAgICAvLyBkaWN0IGJ5dGVzXG4gICAgICAgIHZhciBkYiA9IGRmID09IDMgPyA0IDogZGY7XG4gICAgICAgIC8vIGRpY3Rpb25hcnkgaWRcbiAgICAgICAgdmFyIGRpID0gcmIoZGF0LCBidCwgZGIpO1xuICAgICAgICBidCArPSBkYjtcbiAgICAgICAgLy8gZnJhbWUgc2l6ZSBieXRlc1xuICAgICAgICB2YXIgZnNiID0gZmNmID8gKDEgPDwgZmNmKSA6IHNzO1xuICAgICAgICAvLyBmcmFtZSBzb3VyY2Ugc2l6ZVxuICAgICAgICB2YXIgZnNzID0gcmIoZGF0LCBidCwgZnNiKSArICgoZmNmID09IDEpICYmIDI1Nik7XG4gICAgICAgIC8vIHdpbmRvdyBzaXplXG4gICAgICAgIHZhciB3cyA9IGZzcztcbiAgICAgICAgaWYgKCFzcykge1xuICAgICAgICAgICAgLy8gd2luZG93IGRlc2NyaXB0b3JcbiAgICAgICAgICAgIHZhciB3YiA9IDEgPDwgKDEwICsgKGRhdFs1XSA+PiAzKSk7XG4gICAgICAgICAgICB3cyA9IHdiICsgKHdiID4+IDMpICogKGRhdFs1XSAmIDcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3cyA+IDIxNDUzODY0OTYpXG4gICAgICAgICAgICBlcnIoMSk7XG4gICAgICAgIHZhciBidWYgPSBuZXcgdTgoKHcgPT0gMSA/IChmc3MgfHwgd3MpIDogdyA/IDAgOiB3cykgKyAxMik7XG4gICAgICAgIGJ1ZlswXSA9IDEsIGJ1Zls0XSA9IDQsIGJ1Zls4XSA9IDg7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiOiBidCArIGZzYixcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICBsOiAwLFxuICAgICAgICAgICAgZDogZGksXG4gICAgICAgICAgICB3OiAodyAmJiB3ICE9IDEpID8gdyA6IGJ1Zi5zdWJhcnJheSgxMiksXG4gICAgICAgICAgICBlOiB3cyxcbiAgICAgICAgICAgIG86IG5ldyBpMzIoYnVmLmJ1ZmZlciwgMCwgMyksXG4gICAgICAgICAgICB1OiBmc3MsXG4gICAgICAgICAgICBjOiBjYyxcbiAgICAgICAgICAgIG06IE1hdGgubWluKDEzMTA3Miwgd3MpXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKCgobjMgPj4gNCkgfCAoZGF0WzNdIDw8IDIwKSkgPT0gMHgxODREMkE1KSB7XG4gICAgICAgIC8vIHNraXBwYWJsZVxuICAgICAgICByZXR1cm4gYjQoZGF0LCA0KSArIDg7XG4gICAgfVxuICAgIGVycigwKTtcbn07XG4vLyBtb3N0IHNpZ25pZmljYW50IGJpdCBmb3Igbm9uemVyb1xudmFyIG1zYiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgYml0cyA9IDA7XG4gICAgZm9yICg7ICgxIDw8IGJpdHMpIDw9IHZhbDsgKytiaXRzKVxuICAgICAgICA7XG4gICAgcmV0dXJuIGJpdHMgLSAxO1xufTtcbi8vIHJlYWQgZmluaXRlIHN0YXRlIGVudHJvcHlcbnZhciByZnNlID0gZnVuY3Rpb24gKGRhdCwgYnQsIG1hbCkge1xuICAgIC8vIHRhYmxlIHBvc1xuICAgIHZhciB0cG9zID0gKGJ0IDw8IDMpICsgNDtcbiAgICAvLyBhY2N1cmFjeSBsb2dcbiAgICB2YXIgYWwgPSAoZGF0W2J0XSAmIDE1KSArIDU7XG4gICAgaWYgKGFsID4gbWFsKVxuICAgICAgICBlcnIoMyk7XG4gICAgLy8gc2l6ZVxuICAgIHZhciBzeiA9IDEgPDwgYWw7XG4gICAgLy8gcHJvYmFiaWxpdGllcyBzeW1ib2xzICByZXBlYXQgICBpbmRleCAgIGhpZ2ggdGhyZXNob2xkXG4gICAgdmFyIHByb2JzID0gc3osIHN5bSA9IC0xLCByZSA9IC0xLCBpID0gLTEsIGh0ID0gc3o7XG4gICAgLy8gb3B0aW1pemF0aW9uOiBzaW5nbGUgYWxsb2NhdGlvbiBpcyBtdWNoIGZhc3RlclxuICAgIHZhciBidWYgPSBuZXcgYWIoNTEyICsgKHN6IDw8IDIpKTtcbiAgICB2YXIgZnJlcSA9IG5ldyBpMTYoYnVmLCAwLCAyNTYpO1xuICAgIC8vIHNhbWUgdmlldyBhcyBmcmVxXG4gICAgdmFyIGRzdGF0ZSA9IG5ldyB1MTYoYnVmLCAwLCAyNTYpO1xuICAgIHZhciBuc3RhdGUgPSBuZXcgdTE2KGJ1ZiwgNTEyLCBzeik7XG4gICAgdmFyIGJiMSA9IDUxMiArIChzeiA8PCAxKTtcbiAgICB2YXIgc3ltcyA9IG5ldyB1OChidWYsIGJiMSwgc3opO1xuICAgIHZhciBuYml0cyA9IG5ldyB1OChidWYsIGJiMSArIHN6KTtcbiAgICB3aGlsZSAoc3ltIDwgMjU1ICYmIHByb2JzID4gMCkge1xuICAgICAgICB2YXIgYml0cyA9IG1zYihwcm9icyArIDEpO1xuICAgICAgICB2YXIgY2J0ID0gdHBvcyA+PiAzO1xuICAgICAgICAvLyBtYXNrXG4gICAgICAgIHZhciBtc2sgPSAoMSA8PCAoYml0cyArIDEpKSAtIDE7XG4gICAgICAgIHZhciB2YWwgPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PiAodHBvcyAmIDcpKSAmIG1zaztcbiAgICAgICAgLy8gbWFzayAoMSBmZXdlciBiaXQpXG4gICAgICAgIHZhciBtc2sxZmIgPSAoMSA8PCBiaXRzKSAtIDE7XG4gICAgICAgIC8vIG1heCBzbWFsbCB2YWx1ZVxuICAgICAgICB2YXIgbXN2ID0gbXNrIC0gcHJvYnMgLSAxO1xuICAgICAgICAvLyBzbWFsbCB2YWx1ZVxuICAgICAgICB2YXIgc3ZhbCA9IHZhbCAmIG1zazFmYjtcbiAgICAgICAgaWYgKHN2YWwgPCBtc3YpXG4gICAgICAgICAgICB0cG9zICs9IGJpdHMsIHZhbCA9IHN2YWw7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHBvcyArPSBiaXRzICsgMTtcbiAgICAgICAgICAgIGlmICh2YWwgPiBtc2sxZmIpXG4gICAgICAgICAgICAgICAgdmFsIC09IG1zdjtcbiAgICAgICAgfVxuICAgICAgICBmcmVxWysrc3ltXSA9IC0tdmFsO1xuICAgICAgICBpZiAodmFsID09IC0xKSB7XG4gICAgICAgICAgICBwcm9icyArPSB2YWw7XG4gICAgICAgICAgICBzeW1zWy0taHRdID0gc3ltO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHByb2JzIC09IHZhbDtcbiAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAvLyByZXBlYXQgYnl0ZVxuICAgICAgICAgICAgICAgIHZhciByYnQgPSB0cG9zID4+IDM7XG4gICAgICAgICAgICAgICAgcmUgPSAoKGRhdFtyYnRdIHwgKGRhdFtyYnQgKyAxXSA8PCA4KSkgPj4gKHRwb3MgJiA3KSkgJiAzO1xuICAgICAgICAgICAgICAgIHRwb3MgKz0gMjtcbiAgICAgICAgICAgICAgICBzeW0gKz0gcmU7XG4gICAgICAgICAgICB9IHdoaWxlIChyZSA9PSAzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3ltID4gMjU1IHx8IHByb2JzKVxuICAgICAgICBlcnIoMCk7XG4gICAgdmFyIHN5bXBvcyA9IDA7XG4gICAgLy8gc3ltIHN0ZXAgKGNvcHJpbWUgd2l0aCBzeiAtIGZvcm11bGEgZnJvbSB6c3RkIHNvdXJjZSlcbiAgICB2YXIgc3N0ZXAgPSAoc3ogPj4gMSkgKyAoc3ogPj4gMykgKyAzO1xuICAgIC8vIHN5bSBtYXNrXG4gICAgdmFyIHNtYXNrID0gc3ogLSAxO1xuICAgIGZvciAodmFyIHMgPSAwOyBzIDw9IHN5bTsgKytzKSB7XG4gICAgICAgIHZhciBzZiA9IGZyZXFbc107XG4gICAgICAgIGlmIChzZiA8IDEpIHtcbiAgICAgICAgICAgIGRzdGF0ZVtzXSA9IC1zZjtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgaXMgc3BsaXQgaW50byB0d28gbG9vcHMgaW4genN0ZCB0byBhdm9pZCBicmFuY2hpbmcsIGJ1dCBhcyBKUyBpcyBoaWdoZXItbGV2ZWwgdGhhdCBpcyB1bm5lY2Vzc2FyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2Y7ICsraSkge1xuICAgICAgICAgICAgc3ltc1tzeW1wb3NdID0gcztcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICBzeW1wb3MgPSAoc3ltcG9zICsgc3N0ZXApICYgc21hc2s7XG4gICAgICAgICAgICB9IHdoaWxlIChzeW1wb3MgPj0gaHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIEFmdGVyIHNwcmVhZGluZyBzeW1ib2xzLCBzaG91bGQgYmUgemVybyBhZ2FpblxuICAgIGlmIChzeW1wb3MpXG4gICAgICAgIGVycigwKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc3o7ICsraSkge1xuICAgICAgICAvLyBuZXh0IHN0YXRlXG4gICAgICAgIHZhciBucyA9IGRzdGF0ZVtzeW1zW2ldXSsrO1xuICAgICAgICAvLyBudW0gYml0c1xuICAgICAgICB2YXIgbmIgPSBuYml0c1tpXSA9IGFsIC0gbXNiKG5zKTtcbiAgICAgICAgbnN0YXRlW2ldID0gKG5zIDw8IG5iKSAtIHN6O1xuICAgIH1cbiAgICByZXR1cm4gWyh0cG9zICsgNykgPj4gMywge1xuICAgICAgICAgICAgYjogYWwsXG4gICAgICAgICAgICBzOiBzeW1zLFxuICAgICAgICAgICAgbjogbmJpdHMsXG4gICAgICAgICAgICB0OiBuc3RhdGVcbiAgICAgICAgfV07XG59O1xuLy8gcmVhZCBodWZmbWFuXG52YXIgcmh1ID0gZnVuY3Rpb24gKGRhdCwgYnQpIHtcbiAgICAvLyAgaW5kZXggIHdlaWdodCBjb3VudFxuICAgIHZhciBpID0gMCwgd2MgPSAtMTtcbiAgICAvLyAgICBidWZmZXIgICAgICAgICAgICAgaGVhZGVyIGJ5dGVcbiAgICB2YXIgYnVmID0gbmV3IHU4KDI5MiksIGhiID0gZGF0W2J0XTtcbiAgICAvLyBodWZmbWFuIHdlaWdodHNcbiAgICB2YXIgaHcgPSBidWYuc3ViYXJyYXkoMCwgMjU2KTtcbiAgICAvLyByYW5rIGNvdW50XG4gICAgdmFyIHJjID0gYnVmLnN1YmFycmF5KDI1NiwgMjY4KTtcbiAgICAvLyByYW5rIGluZGV4XG4gICAgdmFyIHJpID0gbmV3IHUxNihidWYuYnVmZmVyLCAyNjgpO1xuICAgIC8vIE5PVEU6IGF0IHRoaXMgcG9pbnQgYnQgaXMgMSBsZXNzIHRoYW4gZXhwZWN0ZWRcbiAgICBpZiAoaGIgPCAxMjgpIHtcbiAgICAgICAgLy8gZW5kIGJ5dGUsIGZzZSBkZWNvZGUgdGFibGVcbiAgICAgICAgdmFyIF9hID0gcmZzZShkYXQsIGJ0ICsgMSwgNiksIGVidCA9IF9hWzBdLCBmZHQgPSBfYVsxXTtcbiAgICAgICAgYnQgKz0gaGI7XG4gICAgICAgIHZhciBlcG9zID0gZWJ0IDw8IDM7XG4gICAgICAgIC8vIGxhc3QgYnl0ZVxuICAgICAgICB2YXIgbGIgPSBkYXRbYnRdO1xuICAgICAgICBpZiAoIWxiKVxuICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAvLyAgc3RhdGUxICAgc3RhdGUyICAgc3RhdGUxIGJpdHMgICBzdGF0ZTIgYml0c1xuICAgICAgICB2YXIgc3QxID0gMCwgc3QyID0gMCwgYnRyMSA9IGZkdC5iLCBidHIyID0gYnRyMTtcbiAgICAgICAgLy8gZnNlIHBvc1xuICAgICAgICAvLyBwcmUtaW5jcmVtZW50IHRvIGFjY291bnQgZm9yIG9yaWdpbmFsIGRlZmljaXQgb2YgMVxuICAgICAgICB2YXIgZnBvcyA9ICgrK2J0IDw8IDMpIC0gOCArIG1zYihsYik7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGZwb3MgLT0gYnRyMTtcbiAgICAgICAgICAgIGlmIChmcG9zIDwgZXBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIHZhciBjYnQgPSBmcG9zID4+IDM7XG4gICAgICAgICAgICBzdDEgKz0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChmcG9zICYgNykpICYgKCgxIDw8IGJ0cjEpIC0gMSk7XG4gICAgICAgICAgICBod1srK3djXSA9IGZkdC5zW3N0MV07XG4gICAgICAgICAgICBmcG9zIC09IGJ0cjI7XG4gICAgICAgICAgICBpZiAoZnBvcyA8IGVwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYnQgPSBmcG9zID4+IDM7XG4gICAgICAgICAgICBzdDIgKz0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChmcG9zICYgNykpICYgKCgxIDw8IGJ0cjIpIC0gMSk7XG4gICAgICAgICAgICBod1srK3djXSA9IGZkdC5zW3N0Ml07XG4gICAgICAgICAgICBidHIxID0gZmR0Lm5bc3QxXTtcbiAgICAgICAgICAgIHN0MSA9IGZkdC50W3N0MV07XG4gICAgICAgICAgICBidHIyID0gZmR0Lm5bc3QyXTtcbiAgICAgICAgICAgIHN0MiA9IGZkdC50W3N0Ml07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsrd2MgPiAyNTUpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3YyA9IGhiIC0gMTI3O1xuICAgICAgICBmb3IgKDsgaSA8IHdjOyBpICs9IDIpIHtcbiAgICAgICAgICAgIHZhciBieXRlID0gZGF0WysrYnRdO1xuICAgICAgICAgICAgaHdbaV0gPSBieXRlID4+IDQ7XG4gICAgICAgICAgICBod1tpICsgMV0gPSBieXRlICYgMTU7XG4gICAgICAgIH1cbiAgICAgICAgKytidDtcbiAgICB9XG4gICAgLy8gd2VpZ2h0IGV4cG9uZW50aWFsIHN1bVxuICAgIHZhciB3ZXMgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB3YzsgKytpKSB7XG4gICAgICAgIHZhciB3dCA9IGh3W2ldO1xuICAgICAgICAvLyBiaXRzIG11c3QgYmUgYXQgbW9zdCAxMSwgc2FtZSBhcyB3ZWlnaHRcbiAgICAgICAgaWYgKHd0ID4gMTEpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgIHdlcyArPSB3dCAmJiAoMSA8PCAod3QgLSAxKSk7XG4gICAgfVxuICAgIC8vIG1heCBiaXRzXG4gICAgdmFyIG1iID0gbXNiKHdlcykgKyAxO1xuICAgIC8vIHRhYmxlIHNpemVcbiAgICB2YXIgdHMgPSAxIDw8IG1iO1xuICAgIC8vIHJlbWFpbmluZyBzdW1cbiAgICB2YXIgcmVtID0gdHMgLSB3ZXM7XG4gICAgLy8gbXVzdCBiZSBwb3dlciBvZiAyXG4gICAgaWYgKHJlbSAmIChyZW0gLSAxKSlcbiAgICAgICAgZXJyKDApO1xuICAgIGh3W3djKytdID0gbXNiKHJlbSkgKyAxO1xuICAgIGZvciAoaSA9IDA7IGkgPCB3YzsgKytpKSB7XG4gICAgICAgIHZhciB3dCA9IGh3W2ldO1xuICAgICAgICArK3JjW2h3W2ldID0gd3QgJiYgKG1iICsgMSAtIHd0KV07XG4gICAgfVxuICAgIC8vIGh1ZiBidWZcbiAgICB2YXIgaGJ1ZiA9IG5ldyB1OCh0cyA8PCAxKTtcbiAgICAvLyAgICBzeW1ib2xzICAgICAgICAgICAgICAgICAgICAgIG51bSBiaXRzXG4gICAgdmFyIHN5bXMgPSBoYnVmLnN1YmFycmF5KDAsIHRzKSwgbmIgPSBoYnVmLnN1YmFycmF5KHRzKTtcbiAgICByaVttYl0gPSAwO1xuICAgIGZvciAoaSA9IG1iOyBpID4gMDsgLS1pKSB7XG4gICAgICAgIHZhciBwdiA9IHJpW2ldO1xuICAgICAgICBmaWxsKG5iLCBpLCBwdiwgcmlbaSAtIDFdID0gcHYgKyByY1tpXSAqICgxIDw8IChtYiAtIGkpKSk7XG4gICAgfVxuICAgIGlmIChyaVswXSAhPSB0cylcbiAgICAgICAgZXJyKDApO1xuICAgIGZvciAoaSA9IDA7IGkgPCB3YzsgKytpKSB7XG4gICAgICAgIHZhciBiaXRzID0gaHdbaV07XG4gICAgICAgIGlmIChiaXRzKSB7XG4gICAgICAgICAgICB2YXIgY29kZSA9IHJpW2JpdHNdO1xuICAgICAgICAgICAgZmlsbChzeW1zLCBpLCBjb2RlLCByaVtiaXRzXSA9IGNvZGUgKyAoMSA8PCAobWIgLSBiaXRzKSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbYnQsIHtcbiAgICAgICAgICAgIG46IG5iLFxuICAgICAgICAgICAgYjogbWIsXG4gICAgICAgICAgICBzOiBzeW1zXG4gICAgICAgIH1dO1xufTtcbi8vIFRhYmxlcyBnZW5lcmF0ZWQgdXNpbmcgdGhpczpcbi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzEwMWFycm93ei9hOTc5NDUyZDQzNTU5OTJjYmY4ZjI1N2NiZmZjOWVkZFxuLy8gZGVmYXVsdCBsaXRlcmFsIGxlbmd0aCB0YWJsZVxudmFyIGRsbHQgPSAvKiNfX1BVUkVfXyovIHJmc2UoLyojX19QVVJFX18qLyBuZXcgdTgoW1xuICAgIDgxLCAxNiwgOTksIDE0MCwgNDksIDE5OCwgMjQsIDk5LCAxMiwgMzMsIDE5NiwgMjQsIDk5LCAxMDIsIDEwMiwgMTM0LCA3MCwgMTQ2LCA0XG5dKSwgMCwgNilbMV07XG4vLyBkZWZhdWx0IG1hdGNoIGxlbmd0aCB0YWJsZVxudmFyIGRtbHQgPSAvKiNfX1BVUkVfXyovIHJmc2UoLyojX19QVVJFX18qLyBuZXcgdTgoW1xuICAgIDMzLCAyMCwgMTk2LCAyNCwgOTksIDE0MCwgMzMsIDEzMiwgMTYsIDY2LCA4LCAzMywgMTMyLCAxNiwgNjYsIDgsIDMzLCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDM2LCA5XG5dKSwgMCwgNilbMV07XG4vLyBkZWZhdWx0IG9mZnNldCBjb2RlIHRhYmxlXG52YXIgZG9jdCA9IC8qI19fUFVSRV9fICovIHJmc2UoLyojX19QVVJFX18qLyBuZXcgdTgoW1xuICAgIDMyLCAxMzIsIDE2LCA2NiwgMTAyLCA3MCwgNjgsIDY4LCA2OCwgNjgsIDM2LCA3MywgMlxuXSksIDAsIDUpWzFdO1xuLy8gYml0cyB0byBiYXNlbGluZVxudmFyIGIyYmwgPSBmdW5jdGlvbiAoYiwgcykge1xuICAgIHZhciBsZW4gPSBiLmxlbmd0aCwgYmwgPSBuZXcgaTMyKGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBibFtpXSA9IHM7XG4gICAgICAgIHMgKz0gMSA8PCBiW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYmw7XG59O1xuLy8gbGl0ZXJhbCBsZW5ndGggYml0c1xudmFyIGxsYiA9IC8qI19fUFVSRV9fICovIG5ldyB1OCgoIC8qI19fUFVSRV9fICovbmV3IGkzMihbXG4gICAgMCwgMCwgMCwgMCwgMTY4NDMwMDksIDUwNTI4NzcwLCAxMzQ2NzgwMjAsIDIwMjA1MDA1NywgMjY5NDIyMDkzXG5dKSkuYnVmZmVyLCAwLCAzNik7XG4vLyBsaXRlcmFsIGxlbmd0aCBiYXNlbGluZVxudmFyIGxsYmwgPSAvKiNfX1BVUkVfXyAqLyBiMmJsKGxsYiwgMCk7XG4vLyBtYXRjaCBsZW5ndGggYml0c1xudmFyIG1sYiA9IC8qI19fUFVSRV9fICovIG5ldyB1OCgoIC8qI19fUFVSRV9fICovbmV3IGkzMihbXG4gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTY4NDMwMDksIDUwNTI4NzcwLCAxMTc3NjkyMjAsIDE4NTIwNzA0OCwgMjUyNTc5MDg0LCAxNlxuXSkpLmJ1ZmZlciwgMCwgNTMpO1xuLy8gbWF0Y2ggbGVuZ3RoIGJhc2VsaW5lXG52YXIgbWxibCA9IC8qI19fUFVSRV9fICovIGIyYmwobWxiLCAzKTtcbi8vIGRlY29kZSBodWZmbWFuIHN0cmVhbVxudmFyIGRodSA9IGZ1bmN0aW9uIChkYXQsIG91dCwgaHUpIHtcbiAgICB2YXIgbGVuID0gZGF0Lmxlbmd0aCwgc3MgPSBvdXQubGVuZ3RoLCBsYiA9IGRhdFtsZW4gLSAxXSwgbXNrID0gKDEgPDwgaHUuYikgLSAxLCBlYiA9IC1odS5iO1xuICAgIGlmICghbGIpXG4gICAgICAgIGVycigwKTtcbiAgICB2YXIgc3QgPSAwLCBidHIgPSBodS5iLCBwb3MgPSAobGVuIDw8IDMpIC0gOCArIG1zYihsYikgLSBidHIsIGkgPSAtMTtcbiAgICBmb3IgKDsgcG9zID4gZWIgJiYgaSA8IHNzOykge1xuICAgICAgICB2YXIgY2J0ID0gcG9zID4+IDM7XG4gICAgICAgIHZhciB2YWwgPSAoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChwb3MgJiA3KTtcbiAgICAgICAgc3QgPSAoKHN0IDw8IGJ0cikgfCB2YWwpICYgbXNrO1xuICAgICAgICBvdXRbKytpXSA9IGh1LnNbc3RdO1xuICAgICAgICBwb3MgLT0gKGJ0ciA9IGh1Lm5bc3RdKTtcbiAgICB9XG4gICAgaWYgKHBvcyAhPSBlYiB8fCBpICsgMSAhPSBzcylcbiAgICAgICAgZXJyKDApO1xufTtcbi8vIGRlY29kZSBodWZmbWFuIHN0cmVhbSA0eFxuLy8gVE9ETzogdXNlIHdvcmtlcnMgdG8gcGFyYWxsZWxpemVcbnZhciBkaHU0ID0gZnVuY3Rpb24gKGRhdCwgb3V0LCBodSkge1xuICAgIHZhciBidCA9IDY7XG4gICAgdmFyIHNzID0gb3V0Lmxlbmd0aCwgc3oxID0gKHNzICsgMykgPj4gMiwgc3oyID0gc3oxIDw8IDEsIHN6MyA9IHN6MSArIHN6MjtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0LCBidCArPSBkYXRbMF0gfCAoZGF0WzFdIDw8IDgpKSwgb3V0LnN1YmFycmF5KDAsIHN6MSksIGh1KTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0LCBidCArPSBkYXRbMl0gfCAoZGF0WzNdIDw8IDgpKSwgb3V0LnN1YmFycmF5KHN6MSwgc3oyKSwgaHUpO1xuICAgIGRodShkYXQuc3ViYXJyYXkoYnQsIGJ0ICs9IGRhdFs0XSB8IChkYXRbNV0gPDwgOCkpLCBvdXQuc3ViYXJyYXkoc3oyLCBzejMpLCBodSk7XG4gICAgZGh1KGRhdC5zdWJhcnJheShidCksIG91dC5zdWJhcnJheShzejMpLCBodSk7XG59O1xuLy8gcmVhZCBac3RhbmRhcmQgYmxvY2tcbnZhciByemIgPSBmdW5jdGlvbiAoZGF0LCBzdCwgb3V0KSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBidCA9IHN0LmI7XG4gICAgLy8gICAgYnl0ZSAwICAgICAgICBibG9jayB0eXBlXG4gICAgdmFyIGIwID0gZGF0W2J0XSwgYnR5cGUgPSAoYjAgPj4gMSkgJiAzO1xuICAgIHN0LmwgPSBiMCAmIDE7XG4gICAgdmFyIHN6ID0gKGIwID4+IDMpIHwgKGRhdFtidCArIDFdIDw8IDUpIHwgKGRhdFtidCArIDJdIDw8IDEzKTtcbiAgICAvLyBlbmQgYnl0ZSBmb3IgYmxvY2tcbiAgICB2YXIgZWJ0ID0gKGJ0ICs9IDMpICsgc3o7XG4gICAgaWYgKGJ0eXBlID09IDEpIHtcbiAgICAgICAgaWYgKGJ0ID49IGRhdC5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN0LmIgPSBidCArIDE7XG4gICAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgICAgIGZpbGwob3V0LCBkYXRbYnRdLCBzdC55LCBzdC55ICs9IHN6KTtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbGwobmV3IHU4KHN6KSwgZGF0W2J0XSk7XG4gICAgfVxuICAgIGlmIChlYnQgPiBkYXQubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGJ0eXBlID09IDApIHtcbiAgICAgICAgc3QuYiA9IGVidDtcbiAgICAgICAgaWYgKG91dCkge1xuICAgICAgICAgICAgb3V0LnNldChkYXQuc3ViYXJyYXkoYnQsIGVidCksIHN0LnkpO1xuICAgICAgICAgICAgc3QueSArPSBzejtcbiAgICAgICAgICAgIHJldHVybiBvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNsYyhkYXQsIGJ0LCBlYnQpO1xuICAgIH1cbiAgICBpZiAoYnR5cGUgPT0gMikge1xuICAgICAgICAvLyAgICBieXRlIDMgICAgICAgIGxpdCBidHlwZSAgICAgc2l6ZSBmb3JtYXRcbiAgICAgICAgdmFyIGIzID0gZGF0W2J0XSwgbGJ0ID0gYjMgJiAzLCBzZiA9IChiMyA+PiAyKSAmIDM7XG4gICAgICAgIC8vIGxpdCBzcmMgc2l6ZSAgbGl0IGNtcCBzeiA0IHN0cmVhbXNcbiAgICAgICAgdmFyIGxzcyA9IGIzID4+IDQsIGxjcyA9IDAsIHM0ID0gMDtcbiAgICAgICAgaWYgKGxidCA8IDIpIHtcbiAgICAgICAgICAgIGlmIChzZiAmIDEpXG4gICAgICAgICAgICAgICAgbHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKHNmICYgMikgJiYgKGRhdFsrK2J0XSA8PCAxMikpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxzcyA9IGIzID4+IDM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHNmO1xuICAgICAgICAgICAgaWYgKHNmIDwgMilcbiAgICAgICAgICAgICAgICBsc3MgfD0gKChkYXRbKytidF0gJiA2MykgPDwgNCksIGxjcyA9IChkYXRbYnRdID4+IDYpIHwgKGRhdFsrK2J0XSA8PCAyKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHNmID09IDIpXG4gICAgICAgICAgICAgICAgbHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKGRhdFsrK2J0XSAmIDMpIDw8IDEyKSwgbGNzID0gKGRhdFtidF0gPj4gMikgfCAoZGF0WysrYnRdIDw8IDYpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKChkYXRbKytidF0gJiA2MykgPDwgMTIpLCBsY3MgPSAoZGF0W2J0XSA+PiA2KSB8IChkYXRbKytidF0gPDwgMikgfCAoZGF0WysrYnRdIDw8IDEwKTtcbiAgICAgICAgfVxuICAgICAgICArK2J0O1xuICAgICAgICAvLyBhZGQgbGl0ZXJhbHMgdG8gZW5kIC0gY2FuIG5ldmVyIG92ZXJsYXAgd2l0aCBiYWNrcmVmZXJlbmNlcyBiZWNhdXNlIHVudXNlZCBsaXRlcmFscyBhbHdheXMgYXBwZW5kZWRcbiAgICAgICAgdmFyIGJ1ZiA9IG91dCA/IG91dC5zdWJhcnJheShzdC55LCBzdC55ICsgc3QubSkgOiBuZXcgdTgoc3QubSk7XG4gICAgICAgIC8vIHN0YXJ0aW5nIHBvaW50IGZvciBsaXRlcmFsc1xuICAgICAgICB2YXIgc3BsID0gYnVmLmxlbmd0aCAtIGxzcztcbiAgICAgICAgaWYgKGxidCA9PSAwKVxuICAgICAgICAgICAgYnVmLnNldChkYXQuc3ViYXJyYXkoYnQsIGJ0ICs9IGxzcyksIHNwbCk7XG4gICAgICAgIGVsc2UgaWYgKGxidCA9PSAxKVxuICAgICAgICAgICAgZmlsbChidWYsIGRhdFtidCsrXSwgc3BsKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBodWZmbWFuIHRhYmxlXG4gICAgICAgICAgICB2YXIgaHUgPSBzdC5oO1xuICAgICAgICAgICAgaWYgKGxidCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGh1ZCA9IHJodShkYXQsIGJ0KTtcbiAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdCBkZXNjcmlwdGlvbiBsZW5ndGhcbiAgICAgICAgICAgICAgICBsY3MgKz0gYnQgLSAoYnQgPSBodWRbMF0pO1xuICAgICAgICAgICAgICAgIHN0LmggPSBodSA9IGh1ZFsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFodSlcbiAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAoczQgPyBkaHU0IDogZGh1KShkYXQuc3ViYXJyYXkoYnQsIGJ0ICs9IGxjcyksIGJ1Zi5zdWJhcnJheShzcGwpLCBodSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbnVtIHNlcXVlbmNlc1xuICAgICAgICB2YXIgbnMgPSBkYXRbYnQrK107XG4gICAgICAgIGlmIChucykge1xuICAgICAgICAgICAgaWYgKG5zID09IDI1NSlcbiAgICAgICAgICAgICAgICBucyA9IChkYXRbYnQrK10gfCAoZGF0W2J0KytdIDw8IDgpKSArIDB4N0YwMDtcbiAgICAgICAgICAgIGVsc2UgaWYgKG5zID4gMTI3KVxuICAgICAgICAgICAgICAgIG5zID0gKChucyAtIDEyOCkgPDwgOCkgfCBkYXRbYnQrK107XG4gICAgICAgICAgICAvLyBzeW1ib2wgY29tcHJlc3Npb24gbW9kZXNcbiAgICAgICAgICAgIHZhciBzY20gPSBkYXRbYnQrK107XG4gICAgICAgICAgICBpZiAoc2NtICYgMylcbiAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICB2YXIgZHRzID0gW2RtbHQsIGRvY3QsIGRsbHRdO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPiAtMTsgLS1pKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1kID0gKHNjbSA+PiAoKGkgPDwgMSkgKyAyKSkgJiAzO1xuICAgICAgICAgICAgICAgIGlmIChtZCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJsZSBidWZcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJidWYgPSBuZXcgdTgoWzAsIDAsIGRhdFtidCsrXV0pO1xuICAgICAgICAgICAgICAgICAgICBkdHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzOiByYnVmLnN1YmFycmF5KDIsIDMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbjogcmJ1Zi5zdWJhcnJheSgwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHQ6IG5ldyB1MTYocmJ1Zi5idWZmZXIsIDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYjogMFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY3VyYWN5IGxvZyA4IGZvciBvZmZzZXRzLCA5IGZvciBvdGhlcnNcbiAgICAgICAgICAgICAgICAgICAgX2EgPSByZnNlKGRhdCwgYnQsIDkgLSAoaSAmIDEpKSwgYnQgPSBfYVswXSwgZHRzW2ldID0gX2FbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1kID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC50KVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAgICAgICAgICAgICBkdHNbaV0gPSBzdC50W2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBfYiA9IHN0LnQgPSBkdHMsIG1sdCA9IF9iWzBdLCBvY3QgPSBfYlsxXSwgbGx0ID0gX2JbMl07XG4gICAgICAgICAgICB2YXIgbGIgPSBkYXRbZWJ0IC0gMV07XG4gICAgICAgICAgICBpZiAoIWxiKVxuICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgIHZhciBzcG9zID0gKGVidCA8PCAzKSAtIDggKyBtc2IobGIpIC0gbGx0LmIsIGNidCA9IHNwb3MgPj4gMywgb3VidCA9IDA7XG4gICAgICAgICAgICB2YXIgbHN0ID0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxsdC5iKSAtIDEpO1xuICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2N0LmIpID4+IDM7XG4gICAgICAgICAgICB2YXIgb3N0ID0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG9jdC5iKSAtIDEpO1xuICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbWx0LmIpID4+IDM7XG4gICAgICAgICAgICB2YXIgbXN0ID0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1sdC5iKSAtIDEpO1xuICAgICAgICAgICAgZm9yICgrK25zOyAtLW5zOykge1xuICAgICAgICAgICAgICAgIHZhciBsbGMgPSBsbHQuc1tsc3RdO1xuICAgICAgICAgICAgICAgIHZhciBsYnRyID0gbGx0Lm5bbHN0XTtcbiAgICAgICAgICAgICAgICB2YXIgbWxjID0gbWx0LnNbbXN0XTtcbiAgICAgICAgICAgICAgICB2YXIgbWJ0ciA9IG1sdC5uW21zdF07XG4gICAgICAgICAgICAgICAgdmFyIG9mYyA9IG9jdC5zW29zdF07XG4gICAgICAgICAgICAgICAgdmFyIG9idHIgPSBvY3Qubltvc3RdO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG9mYykgPj4gMztcbiAgICAgICAgICAgICAgICB2YXIgb2ZwID0gMSA8PCBvZmM7XG4gICAgICAgICAgICAgICAgdmFyIG9mZiA9IG9mcCArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpIHwgKGRhdFtjYnQgKyAzXSA8PCAyNCkpID4+PiAoc3BvcyAmIDcpKSAmIChvZnAgLSAxKSk7XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbWxiW21sY10pID4+IDM7XG4gICAgICAgICAgICAgICAgdmFyIG1sID0gbWxibFttbGNdICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1sYlttbGNdKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBsbGJbbGxjXSkgPj4gMztcbiAgICAgICAgICAgICAgICB2YXIgbGwgPSBsbGJsW2xsY10gKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbGxiW2xsY10pIC0gMSkpO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IGxidHIpID4+IDM7XG4gICAgICAgICAgICAgICAgbHN0ID0gbGx0LnRbbHN0XSArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbGJ0cikgLSAxKSk7XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbWJ0cikgPj4gMztcbiAgICAgICAgICAgICAgICBtc3QgPSBtbHQudFttc3RdICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBtYnRyKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBvYnRyKSA+PiAzO1xuICAgICAgICAgICAgICAgIG9zdCA9IG9jdC50W29zdF0gKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG9idHIpIC0gMSkpO1xuICAgICAgICAgICAgICAgIGlmIChvZmYgPiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0Lm9bMl0gPSBzdC5vWzFdO1xuICAgICAgICAgICAgICAgICAgICBzdC5vWzFdID0gc3Qub1swXTtcbiAgICAgICAgICAgICAgICAgICAgc3Qub1swXSA9IG9mZiAtPSAzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlkeCA9IG9mZiAtIChsbCAhPSAwKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmID0gaWR4ID09IDMgPyBzdC5vWzBdIC0gMSA6IHN0Lm9baWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Lm9bMl0gPSBzdC5vWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Qub1sxXSA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzdC5vWzBdID0gb2ZmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZiA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGw7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBidWZbb3VidCArIGldID0gYnVmW3NwbCArIGldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdWJ0ICs9IGxsLCBzcGwgKz0gbGw7XG4gICAgICAgICAgICAgICAgdmFyIHN0aW4gPSBvdWJ0IC0gb2ZmO1xuICAgICAgICAgICAgICAgIGlmIChzdGluIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gLXN0aW47XG4gICAgICAgICAgICAgICAgICAgIHZhciBicyA9IHN0LmUgKyBzdGluO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gbWwpXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBtbDtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IHN0LndbYnMgKyBpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBvdWJ0ICs9IGxlbiwgbWwgLT0gbGVuLCBzdGluID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtbDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBidWZbc3RpbiArIGldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvdWJ0ICs9IG1sO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG91YnQgIT0gc3BsKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHNwbCA8IGJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW291YnQrK10gPSBidWZbc3BsKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBvdWJ0ID0gYnVmLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChvdXQpXG4gICAgICAgICAgICAgICAgc3QueSArPSBvdWJ0O1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGJ1ZiA9IHNsYyhidWYsIDAsIG91YnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG91dCkge1xuICAgICAgICAgICAgICAgIHN0LnkgKz0gbHNzO1xuICAgICAgICAgICAgICAgIGlmIChzcGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsc3M7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gYnVmW3NwbCArIGldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc3BsKVxuICAgICAgICAgICAgICAgIGJ1ZiA9IHNsYyhidWYsIHNwbCk7XG4gICAgICAgIH1cbiAgICAgICAgc3QuYiA9IGVidDtcbiAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG4gICAgZXJyKDIpO1xufTtcbi8vIGNvbmNhdFxudmFyIGNjdCA9IGZ1bmN0aW9uIChidWZzLCBvbCkge1xuICAgIGlmIChidWZzLmxlbmd0aCA9PSAxKVxuICAgICAgICByZXR1cm4gYnVmc1swXTtcbiAgICB2YXIgYnVmID0gbmV3IHU4KG9sKTtcbiAgICBmb3IgKHZhciBpID0gMCwgYiA9IDA7IGkgPCBidWZzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjaGsgPSBidWZzW2ldO1xuICAgICAgICBidWYuc2V0KGNoaywgYik7XG4gICAgICAgIGIgKz0gY2hrLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn07XG4vKipcbiAqIERlY29tcHJlc3NlcyBac3RhbmRhcmQgZGF0YVxuICogQHBhcmFtIGRhdCBUaGUgaW5wdXQgZGF0YVxuICogQHBhcmFtIGJ1ZiBUaGUgb3V0cHV0IGJ1ZmZlci4gSWYgdW5zcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlXG4gKiAgICAgICAgICAgIGV4YWN0bHkgZW5vdWdoIG1lbW9yeSB0byBmaXQgdGhlIGRlY29tcHJlc3NlZCBkYXRhLiBJZiB5b3VyXG4gKiAgICAgICAgICAgIGRhdGEgaGFzIG11bHRpcGxlIGZyYW1lcyBhbmQgeW91IGtub3cgdGhlIG91dHB1dCBzaXplLCBzcGVjaWZ5aW5nXG4gKiAgICAgICAgICAgIGl0IHdpbGwgeWllbGQgYmV0dGVyIHBlcmZvcm1hbmNlLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBkYXRhXG4gKi9cbnJldHVybiBmdW5jdGlvbiBkZWNvbXByZXNzKGRhdCwgYnVmKSB7XG4gICAgdmFyIGJ0ID0gMCwgYnVmcyA9IFtdLCBuYiA9ICshYnVmLCBvbCA9IDA7XG4gICAgZm9yICg7IGRhdC5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBzdCA9IHJ6ZmgoZGF0LCBuYiB8fCBidWYpO1xuICAgICAgICBpZiAodHlwZW9mIHN0ID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAobmIpIHtcbiAgICAgICAgICAgICAgICBidWYgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzdC53Lmxlbmd0aCA9PSBzdC51KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZnMucHVzaChidWYgPSBzdC53KTtcbiAgICAgICAgICAgICAgICAgICAgb2wgKz0gc3QudTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidWZzLnB1c2goYnVmKTtcbiAgICAgICAgICAgICAgICBzdC5lID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoOyAhc3QubDspIHtcbiAgICAgICAgICAgICAgICB2YXIgYmxrID0gcnpiKGRhdCwgc3QsIGJ1Zik7XG4gICAgICAgICAgICAgICAgaWYgKCFibGspXG4gICAgICAgICAgICAgICAgICAgIGVycig1KTtcbiAgICAgICAgICAgICAgICBpZiAoYnVmKVxuICAgICAgICAgICAgICAgICAgICBzdC5lID0gc3QueTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmcy5wdXNoKGJsayk7XG4gICAgICAgICAgICAgICAgICAgIG9sICs9IGJsay5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNwdyhzdC53LCAwLCBibGsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgc3Qudy5zZXQoYmxrLCBzdC53Lmxlbmd0aCAtIGJsay5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ0ID0gc3QuYiArIChzdC5jICogNCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnQgPSBzdDtcbiAgICAgICAgZGF0ID0gZGF0LnN1YmFycmF5KGJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIGNjdChidWZzLCBvbCk7XG59XG59KSAoKVxuIiwiLy8vLy8vLy8vIFRJTUVfTk9XXG5cbi8vUHJvdmlkZXM6IHRpbWVfbm93X25hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVyb1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfb2ZfZmxvYXQsIGNhbWxfaW50NjRfb2ZfaW50MzJcbnZhciBtc190b19uYW5vID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxMDAwKjEwMDApO1xuZnVuY3Rpb24gdGltZV9ub3dfbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvKCl7XG4gICAgdmFyIG1zID0gRGF0ZS5ub3coKTtcbiAgICAvLyBtdWx0aXBsZSBieSB0d28gLSBpbnQ2MyBpbnRlZ2VycyBhcmUgc2hpZnRlZCB0byB0aGUgbGVmdFxuICAgIHZhciBtc19pNjMgPSBjYW1sX2ludDY0X29mX2Zsb2F0KG1zKjIpO1xuICAgIHJldHVybiBjYW1sX2ludDY0X211bChtc19pNjMsbXNfdG9fbmFubyk7XG59XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgQmVub2l0IFZhdWdvbiwgRU5TVEEgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBhZGRpbmcgcG9zaXRpb24uICopXG50eXBlIHBhZHR5ID1cbiAgfCBMZWZ0ICAgKCogVGV4dCBpcyBsZWZ0IGp1c3RpZmllZCAoJy0nIG9wdGlvbikuICAgICAgICAgICAgICAgKilcbiAgfCBSaWdodCAgKCogVGV4dCBpcyByaWdodCBqdXN0aWZpZWQgKG5vICctJyBvcHRpb24pLiAgICAgICAgICAgKilcbiAgfCBaZXJvcyAgKCogVGV4dCBpcyByaWdodCBqdXN0aWZpZWQgYnkgemVyb3MgKHNlZSAnMCcgb3B0aW9uKS4gKilcblxuKCoqKilcblxuKCogSW50ZWdlciBjb252ZXJzaW9uLiAqKVxudHlwZSBpbnRfY29udiA9XG4gIHwgSW50X2QgfCBJbnRfcGQgfCBJbnRfc2QgICAgICAgICgqICAlZCB8ICUrZCB8ICUgZCAgKilcbiAgfCBJbnRfaSB8IEludF9waSB8IEludF9zaSAgICAgICAgKCogICVpIHwgJStpIHwgJSBpICAqKVxuICB8IEludF94IHwgSW50X0N4ICAgICAgICAgICAgICAgICAoKiAgJXggfCAlI3ggICAgICAgICopXG4gIHwgSW50X1ggfCBJbnRfQ1ggICAgICAgICAgICAgICAgICgqICAlWCB8ICUjWCAgICAgICAgKilcbiAgfCBJbnRfbyB8IEludF9DbyAgICAgICAgICAgICAgICAgKCogICVvIHwgJSNvICAgICAgICAqKVxuICB8IEludF91ICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJXUgICAgICAgICAgICAgICopXG4gIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1ICAgICAgICgqICAlI2QgfCAlI2kgfCAlI3UgKilcblxuKCogRmxvYXQgY29udmVyc2lvbi4gKilcbnR5cGUgZmxvYXRfZmxhZ19jb252ID1cbiAgfCBGbG9hdF9mbGFnXyAgICAgICAgICAgICAgICAgICAgKCogJVtmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3AgICAgICAgICAgICAgICAgICAgKCogJStbZmVFZ0dGaEhdICopXG4gIHwgRmxvYXRfZmxhZ19zICAgICAgICAgICAgICAgICAgICgqICUgW2ZlRWdHRmhIXSAqKVxudHlwZSBmbG9hdF9raW5kX2NvbnYgPVxuICB8IEZsb2F0X2YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJWYgfCAlK2YgfCAlIGYgICopXG4gIHwgRmxvYXRfZSAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZSB8ICUrZSB8ICUgZSAgKilcbiAgfCBGbG9hdF9FICAgICAgICAgICAgICAgICAgICAgICAgKCogICVFIHwgJStFIHwgJSBFICAqKVxuICB8IEZsb2F0X2cgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJWcgfCAlK2cgfCAlIGcgICopXG4gIHwgRmxvYXRfRyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlRyB8ICUrRyB8ICUgRyAgKilcbiAgfCBGbG9hdF9GICAgICAgICAgICAgICAgICAgICAgICAgKCogICVGIHwgJStGIHwgJSBGICAqKVxuICB8IEZsb2F0X2ggICAgICAgICAgICAgICAgICAgICAgICAoKiAgJWggfCAlK2ggfCAlIGggICopXG4gIHwgRmxvYXRfSCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlSCB8ICUrSCB8ICUgSCAgKilcbiAgfCBGbG9hdF9DRiAgICAgICAgICAgICAgICAgICAgICAgKCogICUjRnwgJSsjRnwgJSAjRiAqKVxudHlwZSBmbG9hdF9jb252ID0gZmxvYXRfZmxhZ19jb252ICogZmxvYXRfa2luZF9jb252XG5cbigqKiopXG5cbigqIENoYXIgc2V0cyAoc2VlICVbLi4uXSkgYXJlIGJpdG1hcHMgaW1wbGVtZW50ZWQgYXMgMzItY2hhciBzdHJpbmdzLiAqKVxudHlwZSBjaGFyX3NldCA9IHN0cmluZ1xuXG4oKioqKVxuXG4oKiBDb3VudGVyIHVzZWQgaW4gU2NhbmYuICopXG50eXBlIGNvdW50ZXIgPVxuICB8IExpbmVfY291bnRlciAgICAgKCogICVsICAgICAgKilcbiAgfCBDaGFyX2NvdW50ZXIgICAgICgqICAlbiAgICAgICopXG4gIHwgVG9rZW5fY291bnRlciAgICAoKiAgJU4sICVMICAqKVxuXG4oKioqKVxuXG4oKiBQYWRkaW5nIG9mIHN0cmluZ3MgYW5kIG51bWJlcnMuICopXG50eXBlICgnYSwgJ2IpIHBhZGRpbmcgPVxuICAoKiBObyBwYWRkaW5nIChleDogXCIlZFwiKSAqKVxuICB8IE5vX3BhZGRpbmcgIDogKCdhLCAnYSkgcGFkZGluZ1xuICAoKiBMaXRlcmFsIHBhZGRpbmcgKGV4OiBcIiU4ZFwiKSAqKVxuICB8IExpdF9wYWRkaW5nIDogcGFkdHkgKiBpbnQgLT4gKCdhLCAnYSkgcGFkZGluZ1xuICAoKiBQYWRkaW5nIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKmRcIikgKilcbiAgfCBBcmdfcGFkZGluZyA6IHBhZHR5IC0+IChpbnQgLT4gJ2EsICdhKSBwYWRkaW5nXG5cbigqIFNvbWUgZm9ybWF0cywgc3VjaCBhcyAlX2QsXG4gICBvbmx5IGFjY2VwdCBhbiBvcHRpb25hbCBudW1iZXIgYXMgcGFkZGluZyBvcHRpb24gKG5vIGV4dHJhIGFyZ3VtZW50KSAqKVxudHlwZSBwYWRfb3B0aW9uID0gaW50IG9wdGlvblxuXG4oKiBQcmVjaXNpb24gb2YgZmxvYXRzIGFuZCAnMCctcGFkZGluZyBvZiBpbnRlZ2Vycy4gKilcbnR5cGUgKCdhLCAnYikgcHJlY2lzaW9uID1cbiAgKCogTm8gcHJlY2lzaW9uIChleDogXCIlZlwiKSAqKVxuICB8IE5vX3ByZWNpc2lvbiA6ICgnYSwgJ2EpIHByZWNpc2lvblxuICAoKiBMaXRlcmFsIHByZWNpc2lvbiAoZXg6IFwiJS4zZlwiKSAqKVxuICB8IExpdF9wcmVjaXNpb24gOiBpbnQgLT4gKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIFByZWNpc2lvbiBhcyBleHRyYSBhcmd1bWVudCAoZXg6IFwiJS4qZlwiKSAqKVxuICB8IEFyZ19wcmVjaXNpb24gOiAoaW50IC0+ICdhLCAnYSkgcHJlY2lzaW9uXG5cbigqIFNvbWUgZm9ybWF0cywgc3VjaCBhcyAlX2YsXG4gICBvbmx5IGFjY2VwdCBhbiBvcHRpb25hbCBudW1iZXIgYXMgcHJlY2lzaW9uIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHByZWNfb3B0aW9uID0gaW50IG9wdGlvblxuXG4oKiBzZWUgdGhlIEN1c3RvbSBmb3JtYXQgY29tYmluYXRvciAqKVxudHlwZSAoJ2EsICdiLCAnYykgY3VzdG9tX2FyaXR5ID1cbiAgfCBDdXN0b21femVybyA6ICgnYSwgc3RyaW5nLCAnYSkgY3VzdG9tX2FyaXR5XG4gIHwgQ3VzdG9tX3N1Y2MgOiAoJ2EsICdiLCAnYykgY3VzdG9tX2FyaXR5IC0+XG4gICAgKCdhLCAneCAtPiAnYiwgJ3ggLT4gJ2MpIGN1c3RvbV9hcml0eVxuXG4oKioqKVxuXG4oKiAgICAgICAgUmVsYXRpb25hbCBmb3JtYXQgdHlwZXNcblxuSW4gdGhlIGZpcnN0IGZvcm1hdCtnYWR0cyBpbXBsZW1lbnRhdGlvbiwgdGhlIHR5cGUgZm9yICUoLi4lKSBpbiB0aGVcbmZtdCBHQURUIHdhcyBhcyBmb2xsb3dzOlxuXG58IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICBwYWRfb3B0aW9uICogKCdkMSwgJ3ExLCAnZDIsICdxMikgcmVhZGVyX25iX3VuaWZpZXIgKlxuICAgICgneCwgJ2IsICdjLCAnZDEsICdxMSwgJ3UpIGZtdHR5ICpcbiAgICAoJ3UsICdiLCAnYywgJ3ExLCAnZTEsICdmKSBmbXQgLT5cbiAgICAgICgoJ3gsICdiLCAnYywgJ2QyLCAncTIsICd1KSBmb3JtYXQ2IC0+ICd4LCAnYiwgJ2MsICdkMSwgJ2UxLCAnZikgZm10XG5cbk5vdGljZSB0aGF0IHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2YgcG9zaXRpb24gaW4gdGhlIGZvcm1hdCBhcmd1bWVudFxuKCgneCwgLi4sICd1KSBmb3JtYXQ2IC0+IC4uKSBpcyBlcXVhbCB0byB0aGUgJ3UgcGFyYW1ldGVyIGluICdhXG5wb3NpdGlvbiBpbiB0aGUgZm9ybWF0IHRhaWwgKCgndSwgLi4sICdmKSBmbXQpLiBUaGlzIG1lYW5zIHRoYXQgdGhlXG50eXBlIG9mIHRoZSBleHBlY3RlZCBmb3JtYXQgcGFyYW1ldGVyIGRlcGVuZHMgb2Ygd2hlcmUgdGhlICUoLi4uJSlcbmFyZSBpbiB0aGUgZm9ybWF0IHN0cmluZzpcblxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpXCJcbiAgLSA6ICh1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIHVuaXQpXG4gICAgICBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NiAtPiB1bml0XG4gID0gPGZ1bj5cbiAgIyBQcmludGYucHJpbnRmIFwiJSglKSVkXCJcbiAgLSA6IChpbnQgLT4gdW5pdCwgb3V0X2NoYW5uZWwsIHVuaXQsICdfYSwgJ19hLCBpbnQgLT4gdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IGludCAtPiB1bml0XG4gID0gPGZ1bj5cblxuT24gdGhlIGNvbnRyYXJ5LCB0aGUgbGVnYWN5IHR5cGVyIGdpdmVzIGEgY2xldmVyIHR5cGUgdGhhdCBkb2VzIG5vdFxuZGVwZW5kIG9uIHRoZSBwb3NpdGlvbiBvZiAlKC4uJSkgaW4gdGhlIGZvcm1hdCBzdHJpbmcuIEZvciBleGFtcGxlLFxuJSglKSB3aWxsIGhhdmUgdGhlIHBvbHltb3JwaGljIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpOiBpdCBjYW5cbmJlIGNvbmNhdGVuYXRlZCB0byBhbnkgZm9ybWF0IHR5cGUsIGFuZCBvbmx5IGVuZm9yY2VzIHRoZSBjb25zdHJhaW50XG50aGF0IGl0cyAnYSBhbmQgJ2YgcGFyYW1ldGVycyBhcmUgZXF1YWwgKG5vIGZvcm1hdCBhcmd1bWVudHMpIGFuZCAnZFxuYW5kICdlIGFyZSBlcXVhbCAobm8gcmVhZGVyIGFyZ3VtZW50KS5cblxuVGhlIHdlYWtlbmluZyBvZiB0aGlzIHBhcmFtZXRlciB0eXBlIGluIHRoZSBHQURUIHZlcnNpb24gYnJva2UgdXNlclxuY29kZSAoaW4gZmFjdCBpdCBlc3NlbnRpYWxseSBtYWRlICUoLi4uJSkgdW51c2FibGUgZXhjZXB0IGF0IHRoZSBsYXN0XG5wb3NpdGlvbiBvZiBhIGZvcm1hdCkuIEluIHBhcnRpY3VsYXIsIHRoZSBmb2xsb3dpbmcgd291bGQgbm90IHdvcmtcbmFueW1vcmU6XG5cbiAgZnVuIHNlcCAtPlxuICAgIEZvcm1hdC5wcmludGYgXCJmb28lKCUpYmFyJSglKWJhelwiIHNlcCBzZXBcblxuQXMgdGhlIHR5cGUtY2hlY2tlciB3b3VsZCByZXF1aXJlIHR3byAqaW5jb21wYXRpYmxlKiB0eXBlcyBmb3IgdGhlICUoJSlcbmluIGRpZmZlcmVudCBwb3NpdGlvbnMuXG5cblRoZSBzb2x1dGlvbiB0byByZWdhaW4gYSBnZW5lcmFsIHR5cGUgZm9yICUoLi4lKSBpcyB0byBnZW5lcmFsaXplIHRoaXNcbnRlY2huaXF1ZSwgbm90IG9ubHkgb24gdGhlICdkLCAnZSBwYXJhbWV0ZXJzLCBidXQgb24gYWxsIHNpeFxucGFyYW1ldGVycyBvZiBhIGZvcm1hdDogd2UgaW50cm9kdWNlIGEgXCJyZWxhdGlvbmFsXCIgdHlwZVxuICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxud2hvc2UgdmFsdWVzIGFyZSBwcm9vZnMgdGhhdCAoJ2ExLCAuLiwgJ2YxKSBhbmQgKCdhMiwgLi4sICdmMikgbW9yYWxseVxuY29ycmVzcG9uZCB0byB0aGUgc2FtZSBmb3JtYXQgdHlwZTogJ2ExIGlzIG9idGFpbmVkIGZyb20gJ2YxLCdiMSwnYzFcbmluIHRoZSBleGFjdCBzYW1lIHdheSB0aGF0ICdhMiBpcyBvYnRhaW5lZCBmcm9tICdmMiwnYjIsJ2MyLCBldGMuXG5cbkZvciBleGFtcGxlLCB0aGUgcmVsYXRpb24gYmV0d2VlbiB0d28gZm9ybWF0IHR5cGVzIGJlZ2lubmluZyB3aXRoIGEgQ2hhclxucGFyYW1ldGVyIGlzIGFzIGZvbGxvd3M6XG5cbnwgQ2hhcl90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVjICAqKVxuICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAoY2hhciAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG5JbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgdGVybSBzdHJ1Y3R1cmUgb2YgZm10dHlfcmVsIGlzIChhbG1vc3RbMV0pXG5pc29tb3JwaGljIHRvIHRoZSBmbXR0eSBvZiB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb246IGV2ZXJ5XG5jb25zdHJ1Y3RvciBpcyByZS1yZWFkIHdpdGggYSBiaW5hcnksIHJlbGF0aW9uYWwgdHlwZSwgaW5zdGVhZCBvZiB0aGVcbnByZXZpb3VzIHVuYXJ5IHR5cGluZy4gZm10dHkgY2FuIHRoZW4gYmUgcmUtZGVmaW5lZCBhcyB0aGUgZGlhZ29uYWwgb2ZcbmZtdHR5X3JlbDpcblxuICB0eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSA9XG4gICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YsXG4gICAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuXG5PbmNlIHdlIGhhdmUgdGhpcyBmbXR0eV9yZWwgdHlwZSBpbiBwbGFjZSwgd2UgY2FuIGdpdmUgdGhlIG1vcmVcbmdlbmVyYWwgdHlwZSB0byAlKC4uLiUpOlxuXG58IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICBwYWRfb3B0aW9uICpcbiAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYiwgJ2MsICdqMiwgJ2UsICdmKSBmbXRcblxuV2UgYWNjZXB0IGFueSBmb3JtYXQgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2KSAodGhpcyBpc1xuY29tcGxldGVseSB1bnJlbGF0ZWQgdG8gdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgZm9ybWF0KSwgYnV0IGFsc29cbnJlcXVpcmUgYSBwcm9vZiB0aGF0IHRoaXMgZm9ybWF0IGlzIGluIHJlbGF0aW9uIHRvIGFub3RoZXIgZm9ybWF0IHRoYXRcbmlzIGNvbmNhdGVuYWJsZSB0byB0aGUgZm9ybWF0IHRhaWwuIFdoZW4gZXhlY3V0aW5nIGEgJSguLi4lKSBmb3JtYXRcbihpbiBjYW1saW50ZXJuYWxGb3JtYXQubWw6bWFrZV9wcmludGYgb3Igc2NhbmYubWw6bWFrZV9zY2FuZiksIHdlXG50cmFuc3R5cGUgdGhlIGZvcm1hdCBhbG9uZyB0aGlzIHJlbGF0aW9uIHVzaW5nIHRoZSAncmVjYXN0JyBmdW5jdGlvblxudG8gdHJhbnNwb3NlIGJldHdlZW4gcmVsYXRlZCBmb3JtYXQgdHlwZXMuXG5cbiAgdmFsIHJlY2FzdCA6XG4gICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxKSBmbXRcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdFxuXG5OT1RFIFsxXTogdGhlIHR5cGluZyBvZiBGb3JtYXRfc3Vic3RfdHkgcmVxdWlyZXMgbm90IG9uZSBmb3JtYXQgdHlwZSwgYnV0XG50d28sIG9uZSB0byBlc3RhYmxpc2ggdGhlIGxpbmsgYmV0d2VlbiB0aGUgZm9ybWF0IGFyZ3VtZW50IGFuZCB0aGVcbmZpcnN0IHNpeCBwYXJhbWV0ZXJzLCBhbmQgdGhlIG90aGVyIGZvciB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXRcbmFyZ3VtZW50IGFuZCB0aGUgbGFzdCBzaXggcGFyYW1ldGVycy5cblxufCBGb3JtYXRfc3Vic3RfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiMiwgJ2MyLCAnajIsICdkMiwgJ2EyKSBmbXR0eV9yZWwgKlxuICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cxLCAnYjEsICdjMSwgJ2oxLCAnZTEsICdmMSxcbiAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbldoZW4gd2UgZ2VuZXJhdGUgYSBmb3JtYXQgQVNULCB3ZSBnZW5lcmF0ZSBleGFjdGx5IHRoZSBzYW1lIHdpdG5lc3NcbmZvciBib3RoIHJlbGF0aW9ucywgYW5kIHRoZSB3aXRuZXNzLWNvbnZlcnNpb24gZnVuY3Rpb25zIGluXG5jYW1saW50ZXJuYWxGb3JtYXQgZG8gcmVseSBvbiB0aGlzIGludmFyaWFudC4gRm9yIGV4YW1wbGUsIHRoZVxuZnVuY3Rpb24gdGhhdCBwcm92ZXMgdGhhdCB0aGUgcmVsYXRpb24gaXMgdHJhbnNpdGl2ZVxuXG4gIHZhbCB0cmFucyA6XG4gICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIC0+ICgnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyLFxuICAgICAgJ2EzLCAnYjMsICdjMywgJ2QzLCAnZTMsICdmMykgZm10dHlfcmVsXG4gIC0+ICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgJ2EzLCAnYjMsICdjMywgJ2QzLCAnZTMsICdmMykgZm10dHlfcmVsXG5cbmRvZXMgYXNzdW1lIHRoYXQgdGhlIHR3byBpbnB1dHMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHRlcm0gc3RydWN0dXJlXG4oYW5kIGlzIG9ubHkgZXZlcnkgdXNlZCBmb3IgYXJndW1lbnQgd2l0bmVzc2VzIG9mIHRoZVxuRm9ybWF0X3N1YnN0X3R5IGNvbnN0cnVjdG9yKS5cbiopXG5cbigqIFR5cGUgb2YgYSBibG9jayB1c2VkIGJ5IHRoZSBGb3JtYXQgcHJldHR5LXByaW50ZXIuICopXG50eXBlIGJsb2NrX3R5cGUgPVxuICB8IFBwX2hib3ggICAoKiBIb3Jpem9udGFsIGJsb2NrIG5vIGxpbmUgYnJlYWtpbmcgKilcbiAgfCBQcF92Ym94ICAgKCogVmVydGljYWwgYmxvY2sgZWFjaCBicmVhayBsZWFkcyB0byBhIG5ldyBsaW5lICopXG4gIHwgUHBfaHZib3ggICgqIEhvcml6b250YWwtdmVydGljYWwgYmxvY2s6IHNhbWUgYXMgdmJveCwgZXhjZXB0IGlmIHRoaXMgYmxvY2tcbiAgICAgICAgICAgICAgICAgaXMgc21hbGwgZW5vdWdoIHRvIGZpdCBvbiBhIHNpbmdsZSBsaW5lICopXG4gIHwgUHBfaG92Ym94ICgqIEhvcml6b250YWwgb3IgVmVydGljYWwgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrICopXG4gIHwgUHBfYm94ICAgICgqIEhvcml6b250YWwgb3IgSW5kZW50IGJsb2NrOiBicmVha3MgbGVhZCB0byBuZXcgbGluZVxuICAgICAgICAgICAgICAgICBvbmx5IHdoZW4gbmVjZXNzYXJ5IHRvIHByaW50IHRoZSBjb250ZW50IG9mIHRoZSBibG9jaywgb3JcbiAgICAgICAgICAgICAgICAgd2hlbiBpdCBsZWFkcyB0byBhIG5ldyBpbmRlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBsaW5lICopXG4gIHwgUHBfZml0cyAgICgqIEludGVybmFsIHVzYWdlOiB3aGVuIGEgYmxvY2sgZml0cyBvbiBhIHNpbmdsZSBsaW5lICopXG5cbigqIEZvcm1hdHRpbmcgZWxlbWVudCB1c2VkIGJ5IHRoZSBGb3JtYXQgcHJldHR5LXByaW50ZXIuICopXG50eXBlIGZvcm1hdHRpbmdfbGl0ID1cbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQF0gICAqKVxuICB8IENsb3NlX3RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAfSAgICopXG4gIHwgQnJlYWsgb2Ygc3RyaW5nICogaW50ICogaW50ICAgICAgICAgICgqIEAsIHwgQCAgfCBAOyB8IEA7PD4gKilcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQD8gICAqKVxuICB8IEZvcmNlX25ld2xpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXFxuICAqKVxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBALiAgICopXG4gIHwgTWFnaWNfc2l6ZSBvZiBzdHJpbmcgKiBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEA8bj4gKilcbiAgfCBFc2NhcGVkX2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQEAgICAqKVxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAJSUgICopXG4gIHwgU2Nhbl9pbmRpYyBvZiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBYICAgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuID1cbiAgfCBPcGVuX3RhZyA6ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+ICAgICAgKCogQHsgICAqKVxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXR0aW5nX2dlblxuICB8IE9wZW5fYm94IDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAWyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG5cbigqKiopXG5cbigqIExpc3Qgb2YgZm9ybWF0IHR5cGUgZWxlbWVudHMuICopXG4oKiBJbiBwYXJ0aWN1bGFyIHVzZWQgdG8gcmVwcmVzZW50ICUoLi4uJSkgYW5kICV7Li4uJX0gY29udGVudHMuICopXG5hbmQgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YsXG4gICAgICAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eV9yZWxcbmFuZCAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsID1cbiAgfCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgY2hhciAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBTdHJpbmdfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXMgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChzdHJpbmcgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBzdHJpbmcgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVkICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgaW50IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEludDMyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlbGQgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGludDMyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgaW50MzIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgTmF0aXZlaW50X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAobmF0aXZlaW50IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgbmF0aXZlaW50IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEludDY0X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlTGQgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGludDY0IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgaW50NjQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgRmxvYXRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVmICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoZmxvYXQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBmbG9hdCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBCb29sX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChib29sIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgYm9vbCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICB8IEZvcm1hdF9hcmdfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgKlxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKVxuICAgICAgICAgICBmbXR0eV9yZWxcbiAgfCBGb3JtYXRfc3Vic3RfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cxLCAnYjEsICdjMSwgJ2oxLCAnZDEsICdhMSkgZm10dHlfcmVsICpcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9ycy4gKilcbiAgfCBBbHBoYV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICd4IC0+ICdjMSkgLT4gJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICd4IC0+ICdjMikgLT4gJ3ggLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgVGhldGFfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV0ICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoKCdiMSAtPiAnYzEpIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdiMiAtPiAnYzIpIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEFueV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVXNlZCBmb3IgY3VzdG9tIGZvcm1hdHMgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCd4IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ3ggLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgUmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVyICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgKCdiMSAtPiAneCkgLT4gJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAoJ2IyIC0+ICd4KSAtPiAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9yICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ2ExLCAnYjEsICdjMSwgKCdiMSAtPiAneCkgLT4gJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAoJ2IyIC0+ICd4KSAtPiAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICB8IEVuZF9vZl9mbXR0eSA6XG4gICAgICAoJ2YxLCAnYjEsICdjMSwgJ2QxLCAnZDEsICdmMSxcbiAgICAgICAnZjIsICdiMiwgJ2MyLCAnZDIsICdkMiwgJ2YyKSBmbXR0eV9yZWxcblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgZWxlbWVudHMuICopXG5hbmQgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCA9XG4gIHwgQ2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgQ2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUMgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgU3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXMgKilcbiAgICAgICgneCwgc3RyaW5nIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgQ2FtbF9zdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVMgKilcbiAgICAgICgneCwgc3RyaW5nIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVtkaXhYdW9dICopXG4gICAgICBpbnRfY29udiAqICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksIGludCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEludDMyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50MzIgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBOYXRpdmVpbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlbltkaXhYdW9dICopXG4gICAgICBpbnRfY29udiAqICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksIG5hdGl2ZWludCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEludDY0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50NjQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBGbG9hdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICAgICAgZmxvYXRfY29udiAqICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksIGZsb2F0IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgQm9vbCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVtiQl0gKilcbiAgICAgICgneCwgYm9vbCAtPiAnYSkgcGFkZGluZyAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsdXNoIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUhICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcblxuICB8IFN0cmluZ19saXRlcmFsIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIGFiYyAqKVxuICAgICAgc3RyaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgQ2hhcl9saXRlcmFsIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogeCAqKVxuICAgICAgY2hhciAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgRm9ybWF0X2FyZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXsuLi4lfSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBGb3JtYXRfc3Vic3QgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICBwYWRfb3B0aW9uICpcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAgICdnMiwgJ2IsICdjLCAnajIsICdkLCAnYSkgZm10dHlfcmVsICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yLiAqKVxuICB8IEFscGhhIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVhICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgoJ2IgLT4gJ3ggLT4gJ2MpIC0+ICd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFRoZXRhIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV0ICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgoJ2IgLT4gJ2MpIC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcjogKilcbiAgfCBGb3JtYXR0aW5nX2xpdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgZm9ybWF0dGluZ19saXQgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBGb3JtYXR0aW5nX2dlbiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQF8gKilcbiAgICAgICgnYTEsICdiLCAnYywgJ2QxLCAnZTEsICdmMSkgZm9ybWF0dGluZ19nZW4gKlxuICAgICAgKCdmMSwgJ2IsICdjLCAnZTEsICdlMiwgJ2YyKSBmbXQgLT4gKCdhMSwgJ2IsICdjLCAnZDEsICdlMiwgJ2YyKSBmbXRcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgUmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4IC0+ICdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdlLCAnZikgZm10XG4gIHwgU2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVsuLi5dICopXG4gICAgICBwYWRfb3B0aW9uICogY2hhcl9zZXQgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgIChzdHJpbmcgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgU2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVtubE5MXSAqKVxuICAgICAgY291bnRlciAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKGludCAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlMGMgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgIChjaGFyIC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IElnbm9yZWRfcGFyYW0gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgaWdub3JlZCAqICgneCwgJ2IsICdjLCAneSwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIEN1c3RvbSBwcmludGluZyBmb3JtYXQgKFBSIzY0NTIsIEdQUiMxNDApXG5cbiAgICAgV2UgaW5jbHVkZSBhIHR5cGUgQ3VzdG9tIG9mIFwiY3VzdG9tIGNvbnZlcnRlcnNcIiwgd2hlcmUgYW5cbiAgICAgYXJiaXRyYXJ5IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgb25lIG9yIG1vcmVcbiAgICAgYXJndW1lbnRzLiBUaGVyZSBpcyBubyBzeW50YXggZm9yIGN1c3RvbSBjb252ZXJ0ZXJzLCBpdCBpcyBvbmx5XG4gICAgIGludGVuZGVkIGZvciBjdXN0b20gcHJvY2Vzc29ycyB0aGF0IHdpc2ggdG8gcmVseSBvbiB0aGVcbiAgICAgc3RkbGliLWRlZmluZWQgZm9ybWF0IEdBRFRzLlxuXG4gICAgIEZvciBpbnN0YW5jZSBhIHByZS1wcm9jZXNzb3IgY291bGQgY2hvb3NlIHRvIGludGVycHJldCBzdHJpbmdzXG4gICAgIHByZWZpeGVkIHdpdGggW1wiIVwiXSBhcyBmb3JtYXQgc3RyaW5ncyB3aGVyZSBbJXt7IC4uLiB9fV0gaXNcbiAgICAgYSBzcGVjaWFsIGZvcm0gdG8gcGFzcyBhIHRvX3N0cmluZyBmdW5jdGlvbiwgc28gdGhhdCBvbmUgY291bGRcbiAgICAgd3JpdGU6XG5cbiAgICAge1tcbiAgICAgICB0eXBlIHQgPSB7IHggOiBpbnQ7IHkgOiBpbnQgfVxuXG4gICAgICAgbGV0IHN0cmluZ19vZl90IHQgPSBQcmludGYuc3ByaW50ZiBcInsgeCA9ICVkOyB5ID0gJWQgfVwiIHQueCB0LnlcblxuICAgICAgIFByaW50Zi5wcmludGYgIVwidCA9ICV7e3N0cmluZ19vZl90fX1cIiB7IHggPSA0MjsgeSA9IDQyIH1cbiAgICAgXX1cbiAgKilcbiAgfCBDdXN0b20gOlxuICAgICAgKCdhLCAneCwgJ3kpIGN1c3RvbV9hcml0eSAqICh1bml0IC0+ICd4KSAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICgneSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcblxuICAoKiBlbmQgb2YgYSBmb3JtYXQgc3BlY2lmaWNhdGlvbiAqKVxuICB8IEVuZF9vZl9mb3JtYXQgOlxuICAgICAgICAoJ2YsICdiLCAnYywgJ2UsICdlLCAnZikgZm10XG5cbigqKiopXG5cbigqIFR5cGUgZm9yIGlnbm9yZWQgcGFyYW1ldGVycyAoc2VlIFwiJV9cIikuICopXG5hbmQgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGlnbm9yZWQgPVxuICB8IElnbm9yZWRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX0MgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9zICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9TICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9pbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9kICopXG4gICAgICBpbnRfY29udiAqIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludDMyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2xkICopXG4gICAgICBpbnRfY29udiAqIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX25hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX25kICopXG4gICAgICBpbnRfY29udiAqIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludDY0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX0xkICopXG4gICAgICBpbnRfY29udiAqIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2YgKilcbiAgICAgIHBhZF9vcHRpb24gKiBwcmVjX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfYm9vbCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQiAqKVxuICAgICAgcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfey4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8oLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3JlYWRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgKilcbiAgICAgICgnYSwgJ2IsICdjLCAoJ2IgLT4gJ3gpIC0+ICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1suLi5dICopXG4gICAgICBwYWRfb3B0aW9uICogY2hhcl9zZXQgLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1tubE5MXSAqKVxuICAgICAgY291bnRlciAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfMGMgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG5cbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9XG4gIEZvcm1hdCBvZiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ICogc3RyaW5nXG5cbmxldCByZWMgZXJhc2VfcmVsIDogdHlwZSBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCAuXG4gIChhLCBiLCBjLCBkLCBlLCBmLFxuICAgZywgaCwgaSwgaiwgaywgbCkgZm10dHlfcmVsIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eVxuPSBmdW5jdGlvblxuICB8IENoYXJfdHkgcmVzdCAtPlxuICAgIENoYXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnRfdHkgcmVzdCAtPlxuICAgIEludF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIEludDMyX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgSW50NjRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgTmF0aXZlaW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBGbG9hdF90eSByZXN0IC0+XG4gICAgRmxvYXRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9hcmdfdHkgKHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9hcmdfdHkgKHR5LCBlcmFzZV9yZWwgcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgX3R5MiwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkxLCBlcmFzZV9yZWwgcmVzdClcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IFRoZXRhX3R5IHJlc3QgLT5cbiAgICBUaGV0YV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQW55X3R5IHJlc3QgLT5cbiAgICBBbnlfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+XG4gICAgSWdub3JlZF9yZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEVuZF9vZl9mbXR0eSAtPiBFbmRfb2ZfZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwZSBjb25jYXRlbmF0aW9uICopXG5cbigqIENvbmNhdGVuYXRlIHR3byBmb3JtYXQgdHlwZXMuICopXG4oKiBVc2VkIGJ5OlxuICAgKiByZWFkZXJfbmJfdW5pZmllcl9vZl9mbXR0eSB0byBjb3VudCByZWFkZXJzIGluIGFuIGZtdHR5LFxuICAgKiBTY2FuZi50YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIHRvIGV4dHJhY3QgcmVhZGVycyBpbnNpZGUgJSguLi4lKSxcbiAgICogQ2FtbGludGVybmFsRm9ybWF0LmZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IHRvIGV4dHJhY3QgZm9ybWF0IHR5cGUuICopXG5cbigqXG5sZXQgcmVjIGNvbmNhdF9mbXR0eSA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoZiwgYiwgYywgZSwgZywgaCkgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZywgaCkgZm10dHkgPVxuKilcbmxldCByZWMgY29uY2F0X2ZtdHR5IDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyXG4gICAgICAgZzEgajEgZzIgajJcbiAgLlxuICAgIChnMSwgYjEsIGMxLCBqMSwgZDEsIGExLFxuICAgICBnMiwgYjIsIGMyLCBqMiwgZDIsIGEyKSBmbXR0eV9yZWwgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsIC0+XG4gICAgKGcxLCBiMSwgYzEsIGoxLCBlMSwgZjEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBlMiwgZjIpIGZtdHR5X3JlbCA9XG5mdW4gZm10dHkxIGZtdHR5MiAtPiBtYXRjaCBmbXR0eTEgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAtPlxuICAgIENoYXJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBTdHJpbmdfdHkgcmVzdCAtPlxuICAgIFN0cmluZ190eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIEludDMyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgSW50NjRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGbG9hdF90eSByZXN0IC0+XG4gICAgRmxvYXRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBCb29sX3R5IHJlc3QgLT5cbiAgICBCb29sX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgQWxwaGFfdHkgcmVzdCAtPlxuICAgIEFscGhhX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgQW55X3R5IHJlc3QgLT5cbiAgICBBbnlfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPlxuICAgIFJlYWRlcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZvcm1hdF9hcmdfdHkgKHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9hcmdfdHkgKHR5LCBjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCBjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IGZtdHR5MlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0IGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdHMuICopXG5sZXQgcmVjIGNvbmNhdF9mbXQgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCAuXG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZywgaCkgZm10ID1cbmZ1biBmbXQxIGZtdDIgLT4gbWF0Y2ggZm10MSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgU3RyaW5nIChwYWQsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgQ2FtbF9zdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBJbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgSW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IENoYXIgKHJlc3QpIC0+XG4gICAgQ2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBDYW1sX2NoYXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEJvb2wgKHBhZCwgcmVzdCkgLT5cbiAgICBCb29sIChwYWQsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEFscGhhIHJlc3QgLT5cbiAgICBBbHBoYSAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgVGhldGEgcmVzdCAtPlxuICAgIFRoZXRhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIEN1c3RvbSAoYXJpdHksIGYsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFJlYWRlciByZXN0IC0+XG4gICAgUmVhZGVyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGbHVzaCByZXN0IC0+XG4gICAgRmx1c2ggKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgLT5cbiAgICBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBDaGFyX2xpdGVyYWwgICAoY2hyLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdF9hcmcgKHBhZCwgZm10dHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZyAgIChwYWQsIGZtdHR5LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X3N1YnN0IChwYWQsIGZtdHR5LCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX25leHRfY2hhciAocmVzdCkgLT5cbiAgICBTY2FuX25leHRfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgIElnbm9yZWRfcGFyYW0gKGlnbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpIC0+XG4gICAgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAtPlxuICAgIGZtdDJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRXhjZXB0aW9ucyAqKVxuXG5leHRlcm5hbCByZWdpc3Rlcl9uYW1lZF92YWx1ZSA6IHN0cmluZyAtPiAnYSAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZVwiXG5cbmxldCAoKSA9XG4gICgqIGZvciBydW50aW1lL2ZhaWxfbmF0LmMgKilcbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQZXJ2YXNpdmVzLmFycmF5X2JvdW5kX2Vycm9yXCJcbiAgICAoSW52YWxpZF9hcmd1bWVudCBcImluZGV4IG91dCBvZiBib3VuZHNcIilcblxuZXh0ZXJuYWwgcmFpc2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZVwiXG5leHRlcm5hbCByYWlzZV9ub3RyYWNlIDogZXhuIC0+ICdhID0gXCIlcmFpc2Vfbm90cmFjZVwiXG5cbmxldCBmYWlsd2l0aCBzID0gcmFpc2UoRmFpbHVyZSBzKVxubGV0IGludmFsaWRfYXJnIHMgPSByYWlzZShJbnZhbGlkX2FyZ3VtZW50IHMpXG5cbmV4Y2VwdGlvbiBFeGl0XG5leGNlcHRpb24gTWF0Y2hfZmFpbHVyZSA9IE1hdGNoX2ZhaWx1cmVcbmV4Y2VwdGlvbiBBc3NlcnRfZmFpbHVyZSA9IEFzc2VydF9mYWlsdXJlXG5leGNlcHRpb24gSW52YWxpZF9hcmd1bWVudCA9IEludmFsaWRfYXJndW1lbnRcbmV4Y2VwdGlvbiBGYWlsdXJlID0gRmFpbHVyZVxuZXhjZXB0aW9uIE5vdF9mb3VuZCA9IE5vdF9mb3VuZFxuZXhjZXB0aW9uIE91dF9vZl9tZW1vcnkgPSBPdXRfb2ZfbWVtb3J5XG5leGNlcHRpb24gU3RhY2tfb3ZlcmZsb3cgPSBTdGFja19vdmVyZmxvd1xuZXhjZXB0aW9uIFN5c19lcnJvciA9IFN5c19lcnJvclxuZXhjZXB0aW9uIEVuZF9vZl9maWxlID0gRW5kX29mX2ZpbGVcbmV4Y2VwdGlvbiBEaXZpc2lvbl9ieV96ZXJvID0gRGl2aXNpb25fYnlfemVyb1xuZXhjZXB0aW9uIFN5c19ibG9ja2VkX2lvID0gU3lzX2Jsb2NrZWRfaW9cbmV4Y2VwdGlvbiBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSA9IFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlXG5cbigqIENvbXBvc2l0aW9uIG9wZXJhdG9ycyAqKVxuXG5leHRlcm5hbCAoIHw+ICkgOiAnYSAtPiAoJ2EgLT4gJ2IpIC0+ICdiID0gXCIlcmV2YXBwbHlcIlxuZXh0ZXJuYWwgKCBAQCApIDogKCdhIC0+ICdiKSAtPiAnYSAtPiAnYiA9IFwiJWFwcGx5XCJcblxuKCogRGVidWdnaW5nICopXG5cbmV4dGVybmFsIF9fTE9DX18gOiBzdHJpbmcgPSBcIiVsb2NfTE9DXCJcbmV4dGVybmFsIF9fRklMRV9fIDogc3RyaW5nID0gXCIlbG9jX0ZJTEVcIlxuZXh0ZXJuYWwgX19MSU5FX18gOiBpbnQgPSBcIiVsb2NfTElORVwiXG5leHRlcm5hbCBfX01PRFVMRV9fIDogc3RyaW5nID0gXCIlbG9jX01PRFVMRVwiXG5leHRlcm5hbCBfX1BPU19fIDogc3RyaW5nICogaW50ICogaW50ICogaW50ID0gXCIlbG9jX1BPU1wiXG5leHRlcm5hbCBfX0ZVTkNUSU9OX18gOiBzdHJpbmcgPSBcIiVsb2NfRlVOQ1RJT05cIlxuXG5leHRlcm5hbCBfX0xPQ19PRl9fIDogJ2EgLT4gc3RyaW5nICogJ2EgPSBcIiVsb2NfTE9DXCJcbmV4dGVybmFsIF9fTElORV9PRl9fIDogJ2EgLT4gaW50ICogJ2EgPSBcIiVsb2NfTElORVwiXG5leHRlcm5hbCBfX1BPU19PRl9fIDogJ2EgLT4gKHN0cmluZyAqIGludCAqIGludCAqIGludCkgKiAnYSA9IFwiJWxvY19QT1NcIlxuXG4oKiBDb21wYXJpc29ucyAqKVxuXG5leHRlcm5hbCAoID0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5leHRlcm5hbCAoIDw+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuZXh0ZXJuYWwgKCA8ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuZXh0ZXJuYWwgKCA+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuZXh0ZXJuYWwgKCA8PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5leHRlcm5hbCAoID49ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcbmV4dGVybmFsIGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcblxubGV0IG1pbiB4IHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG5leHRlcm5hbCAoID09ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXFcIlxuZXh0ZXJuYWwgKCAhPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxXCJcblxuKCogQm9vbGVhbiBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIG5vdCA6IGJvb2wgLT4gYm9vbCA9IFwiJWJvb2xub3RcIlxuZXh0ZXJuYWwgKCAmJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcbmV4dGVybmFsICggfHwgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdW9yXCJcblxuKCogSW50ZWdlciBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsICggfi0gKSA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuZXh0ZXJuYWwgKCB+KyApIDogaW50IC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHN1Y2MgOiBpbnQgLT4gaW50ID0gXCIlc3VjY2ludFwiXG5leHRlcm5hbCBwcmVkIDogaW50IC0+IGludCA9IFwiJXByZWRpbnRcIlxuZXh0ZXJuYWwgKCArICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFkZGludFwiXG5leHRlcm5hbCAoIC0gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlc3ViaW50XCJcbmV4dGVybmFsICggKiApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuZXh0ZXJuYWwgKCAvICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWRpdmludFwiXG5leHRlcm5hbCAoIG1vZCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtb2RpbnRcIlxuXG5sZXQgYWJzIHggPSBpZiB4ID49IDAgdGhlbiB4IGVsc2UgLXhcblxuZXh0ZXJuYWwgKCBsYW5kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFuZGludFwiXG5leHRlcm5hbCAoIGxvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVvcmludFwiXG5leHRlcm5hbCAoIGx4b3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcblxubGV0IGxub3QgeCA9IHggbHhvciAoLTEpXG5cbmV4dGVybmFsICggbHNsICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG5leHRlcm5hbCAoIGxzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc3JpbnRcIlxuZXh0ZXJuYWwgKCBhc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcblxubGV0IG1heF9pbnQgPSAoLTEpIGxzciAxXG5sZXQgbWluX2ludCA9IG1heF9pbnQgKyAxXG5cbigqIEZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgKCB+LS4gKSA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgKCB+Ky4gKSA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgKCArLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCAoIC0uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsICggKi4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgKCAvLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCAoICoqICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9wb3dlcl9mbG9hdFwiIFwicG93XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cG0xIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwbTFfZmxvYXRcIiBcImNhbWxfZXhwbTFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2dfZmxvYXRcIiBcImxvZ1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cxMCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzEwX2Zsb2F0XCIgXCJsb2cxMFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cxcCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzFwX2Zsb2F0XCIgXCJjYW1sX2xvZzFwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Npbl9mbG9hdFwiIFwic2luXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5oX2Zsb2F0XCIgXCJzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbmhfZmxvYXRcIiBcImNhbWxfYXNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc3FydCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NxcnRfZmxvYXRcIiBcInNxcnRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuaF9mbG9hdFwiIFwiY2FtbF9hdGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhYnNfZmxvYXQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFic2Zsb2F0XCJcbmV4dGVybmFsIGNvcHlzaWduIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2NvcHlzaWduX2Zsb2F0XCIgXCJjYW1sX2NvcHlzaWduXCJcbiAgICAgICAgICAgICAgICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RfZmxvYXQgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZyZXhwIDogZmxvYXQgLT4gZmxvYXQgKiBpbnQgPSBcImNhbWxfZnJleHBfZmxvYXRcIlxuZXh0ZXJuYWwgbGRleHAgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gKGludCBbQHVudGFnZ2VkXSkgLT4gKGZsb2F0IFtAdW5ib3hlZF0pID1cbiAgXCJjYW1sX2xkZXhwX2Zsb2F0XCIgXCJjYW1sX2xkZXhwX2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbW9kZiA6IGZsb2F0IC0+IGZsb2F0ICogZmxvYXQgPSBcImNhbWxfbW9kZl9mbG9hdFwiXG5leHRlcm5hbCBmbG9hdCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgZmxvYXRfb2ZfaW50IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCB0cnVuY2F0ZSA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuZXh0ZXJuYWwgaW50X29mX2Zsb2F0IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBmbG9hdF9vZl9iaXRzIDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1wiIFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzX3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxubGV0IGluZmluaXR5ID1cbiAgZmxvYXRfb2ZfYml0cyAweDdGX0YwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IG5lZ19pbmZpbml0eSA9XG4gIGZsb2F0X29mX2JpdHMgMHhGRl9GMF8wMF8wMF8wMF8wMF8wMF8wMExcbmxldCBuYW4gPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRjBfMDBfMDBfMDBfMDBfMDBfMDFMXG5sZXQgbWF4X2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDdGX0VGX0ZGX0ZGX0ZGX0ZGX0ZGX0ZGTFxubGV0IG1pbl9mbG9hdCA9XG4gIGZsb2F0X29mX2JpdHMgMHgwMF8xMF8wMF8wMF8wMF8wMF8wMF8wMExcbmxldCBlcHNpbG9uX2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDNDX0IwXzAwXzAwXzAwXzAwXzAwXzAwTFxuXG50eXBlIGZwY2xhc3MgPVxuICAgIEZQX25vcm1hbFxuICB8IEZQX3N1Ym5vcm1hbFxuICB8IEZQX3plcm9cbiAgfCBGUF9pbmZpbml0ZVxuICB8IEZQX25hblxuZXh0ZXJuYWwgY2xhc3NpZnlfZmxvYXQgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gZnBjbGFzcyA9XG4gIFwiY2FtbF9jbGFzc2lmeV9mbG9hdFwiIFwiY2FtbF9jbGFzc2lmeV9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cblxuKCogU3RyaW5nIGFuZCBieXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgLS0gbW9yZSBpbiBtb2R1bGVzIFN0cmluZyBhbmQgQnl0ZXMgKilcblxuZXh0ZXJuYWwgc3RyaW5nX2xlbmd0aCA6IHN0cmluZyAtPiBpbnQgPSBcIiVzdHJpbmdfbGVuZ3RoXCJcbmV4dGVybmFsIGJ5dGVzX2xlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG5leHRlcm5hbCBieXRlc19jcmVhdGUgOiBpbnQgLT4gYnl0ZXMgPSBcImNhbWxfY3JlYXRlX2J5dGVzXCJcbmV4dGVybmFsIHN0cmluZ19ibGl0IDogc3RyaW5nIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGJ5dGVzX2JsaXQgOiBieXRlcyAtPiBpbnQgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuXG5sZXQgKCBeICkgczEgczIgPVxuICBsZXQgbDEgPSBzdHJpbmdfbGVuZ3RoIHMxIGFuZCBsMiA9IHN0cmluZ19sZW5ndGggczIgaW5cbiAgbGV0IHMgPSBieXRlc19jcmVhdGUgKGwxICsgbDIpIGluXG4gIHN0cmluZ19ibGl0IHMxIDAgcyAwIGwxO1xuICBzdHJpbmdfYmxpdCBzMiAwIHMgbDEgbDI7XG4gIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgc1xuXG4oKiBDaGFyYWN0ZXIgb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZSBDaGFyICopXG5cbmV4dGVybmFsIGludF9vZl9jaGFyIDogY2hhciAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCB1bnNhZmVfY2hhcl9vZl9pbnQgOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcbmxldCBjaGFyX29mX2ludCBuID1cbiAgaWYgbiA8IDAgfHwgbiA+IDI1NSB0aGVuIGludmFsaWRfYXJnIFwiY2hhcl9vZl9pbnRcIiBlbHNlIHVuc2FmZV9jaGFyX29mX2ludCBuXG5cbigqIFVuaXQgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBpZ25vcmUgOiAnYSAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxuKCogUGFpciBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGZzdCA6ICdhICogJ2IgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuZXh0ZXJuYWwgc25kIDogJ2EgKiAnYiAtPiAnYiA9IFwiJWZpZWxkMVwiXG5cbigqIFJlZmVyZW5jZXMgKilcblxudHlwZSAnYSByZWYgPSB7IG11dGFibGUgY29udGVudHMgOiAnYSB9XG5leHRlcm5hbCByZWYgOiAnYSAtPiAnYSByZWYgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCAoICEgKSA6ICdhIHJlZiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCAoIDo9ICkgOiAnYSByZWYgLT4gJ2EgLT4gdW5pdCA9IFwiJXNldGZpZWxkMFwiXG5leHRlcm5hbCBpbmNyIDogaW50IHJlZiAtPiB1bml0ID0gXCIlaW5jclwiXG5leHRlcm5hbCBkZWNyIDogaW50IHJlZiAtPiB1bml0ID0gXCIlZGVjclwiXG5cbigqIFJlc3VsdCB0eXBlICopXG5cbnR5cGUgKCdhLCdiKSByZXN1bHQgPSBPayBvZiAnYSB8IEVycm9yIG9mICdiXG5cbigqIFN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQgOiBzdHJpbmcgLT4gZmxvYXQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9mbG9hdFwiXG5cbmxldCBzdHJpbmdfb2ZfYm9vbCBiID1cbiAgaWYgYiB0aGVuIFwidHJ1ZVwiIGVsc2UgXCJmYWxzZVwiXG5sZXQgYm9vbF9vZl9zdHJpbmcgPSBmdW5jdGlvblxuICB8IFwidHJ1ZVwiIC0+IHRydWVcbiAgfCBcImZhbHNlXCIgLT4gZmFsc2VcbiAgfCBfIC0+IGludmFsaWRfYXJnIFwiYm9vbF9vZl9zdHJpbmdcIlxuXG5sZXQgYm9vbF9vZl9zdHJpbmdfb3B0ID0gZnVuY3Rpb25cbiAgfCBcInRydWVcIiAtPiBTb21lIHRydWVcbiAgfCBcImZhbHNlXCIgLT4gU29tZSBmYWxzZVxuICB8IF8gLT4gTm9uZVxuXG5sZXQgc3RyaW5nX29mX2ludCBuID1cbiAgZm9ybWF0X2ludCBcIiVkXCIgblxuXG5leHRlcm5hbCBpbnRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludCA9IFwiY2FtbF9pbnRfb2Zfc3RyaW5nXCJcblxubGV0IGludF9vZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBwcm92aWRlIHRoaXMgZGlyZWN0bHkgYXMgYSBub24tcmFpc2luZyBwcmltaXRpdmUuICopXG4gIHRyeSBTb21lIChpbnRfb2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuZXh0ZXJuYWwgc3RyaW5nX2dldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ19zYWZlX2dldFwiXG5cbmxldCB2YWxpZF9mbG9hdF9sZXhlbSBzID1cbiAgbGV0IGwgPSBzdHJpbmdfbGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPj0gbCB0aGVuIHMgXiBcIi5cIiBlbHNlXG4gICAgbWF0Y2ggc3RyaW5nX2dldCBzIGkgd2l0aFxuICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPiBsb29wIChpICsgMSlcbiAgICB8IF8gLT4gc1xuICBpblxuICBsb29wIDBcblxubGV0IHN0cmluZ19vZl9mbG9hdCBmID0gdmFsaWRfZmxvYXRfbGV4ZW0gKGZvcm1hdF9mbG9hdCBcIiUuMTJnXCIgZilcblxuZXh0ZXJuYWwgZmxvYXRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGZsb2F0ID0gXCJjYW1sX2Zsb2F0X29mX3N0cmluZ1wiXG5cbmxldCBmbG9hdF9vZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBwcm92aWRlIHRoaXMgZGlyZWN0bHkgYXMgYSBub24tcmFpc2luZyBwcmltaXRpdmUuICopXG4gIHRyeSBTb21lIChmbG9hdF9vZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgLS0gbW9yZSBpbiBtb2R1bGUgTGlzdCAqKVxuXG5sZXQgcmVjICggQCApIGwxIGwyID1cbiAgbWF0Y2ggbDEgd2l0aFxuICAgIFtdIC0+IGwyXG4gIHwgaGQgOjogdGwgLT4gaGQgOjogKHRsIEAgbDIpXG5cbigqIEkvTyBvcGVyYXRpb25zICopXG5cbnR5cGUgaW5fY2hhbm5lbFxudHlwZSBvdXRfY2hhbm5lbFxuXG5leHRlcm5hbCBvcGVuX2Rlc2NyaXB0b3Jfb3V0IDogaW50IC0+IG91dF9jaGFubmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRcIlxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX2luIDogaW50IC0+IGluX2NoYW5uZWwgPSBcImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXCJcblxubGV0IHN0ZGluID0gb3Blbl9kZXNjcmlwdG9yX2luIDBcbmxldCBzdGRvdXQgPSBvcGVuX2Rlc2NyaXB0b3Jfb3V0IDFcbmxldCBzdGRlcnIgPSBvcGVuX2Rlc2NyaXB0b3Jfb3V0IDJcblxuKCogR2VuZXJhbCBvdXRwdXQgZnVuY3Rpb25zICopXG5cbnR5cGUgb3Blbl9mbGFnID1cbiAgICBPcGVuX3Jkb25seSB8IE9wZW5fd3Jvbmx5IHwgT3Blbl9hcHBlbmRcbiAgfCBPcGVuX2NyZWF0IHwgT3Blbl90cnVuYyB8IE9wZW5fZXhjbFxuICB8IE9wZW5fYmluYXJ5IHwgT3Blbl90ZXh0IHwgT3Blbl9ub25ibG9ja1xuXG5leHRlcm5hbCBvcGVuX2Rlc2MgOiBzdHJpbmcgLT4gb3Blbl9mbGFnIGxpc3QgLT4gaW50IC0+IGludCA9IFwiY2FtbF9zeXNfb3BlblwiXG5cbmV4dGVybmFsIHNldF9vdXRfY2hhbm5lbF9uYW1lOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXCJcblxubGV0IG9wZW5fb3V0X2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX291dChvcGVuX2Rlc2MgbmFtZSBtb2RlIHBlcm0pIGluXG4gIHNldF9vdXRfY2hhbm5lbF9uYW1lIGMgbmFtZTtcbiAgY1xuXG5sZXQgb3Blbl9vdXQgbmFtZSA9XG4gIG9wZW5fb3V0X2dlbiBbT3Blbl93cm9ubHk7IE9wZW5fY3JlYXQ7IE9wZW5fdHJ1bmM7IE9wZW5fdGV4dF0gMG82NjYgbmFtZVxuXG5sZXQgb3Blbl9vdXRfYmluIG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX2JpbmFyeV0gMG82NjYgbmFtZVxuXG5leHRlcm5hbCBmbHVzaCA6IG91dF9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfZmx1c2hcIlxuXG5leHRlcm5hbCBvdXRfY2hhbm5lbHNfbGlzdCA6IHVuaXQgLT4gb3V0X2NoYW5uZWwgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3RcIlxuXG5sZXQgZmx1c2hfYWxsICgpID1cbiAgbGV0IHJlYyBpdGVyID0gZnVuY3Rpb25cbiAgICAgIFtdIC0+ICgpXG4gICAgfCBhOjpsIC0+XG4gICAgICAgIGJlZ2luIHRyeVxuICAgICAgICAgICAgZmx1c2ggYVxuICAgICAgICB3aXRoIFN5c19lcnJvciBfIC0+XG4gICAgICAgICAgKCkgKCogaWdub3JlIGNoYW5uZWxzIGNsb3NlZCBkdXJpbmcgYSBwcmVjZWRpbmcgZmx1c2guICopXG4gICAgICAgIGVuZDtcbiAgICAgICAgaXRlciBsXG4gIGluIGl0ZXIgKG91dF9jaGFubmVsc19saXN0ICgpKVxuXG5leHRlcm5hbCB1bnNhZmVfb3V0cHV0IDogb3V0X2NoYW5uZWwgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dHB1dF9ieXRlc1wiXG5leHRlcm5hbCB1bnNhZmVfb3V0cHV0X3N0cmluZyA6IG91dF9jaGFubmVsIC0+IHN0cmluZyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dHB1dFwiXG5cbmV4dGVybmFsIG91dHB1dF9jaGFyIDogb3V0X2NoYW5uZWwgLT4gY2hhciAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9jaGFyXCJcblxubGV0IG91dHB1dF9ieXRlcyBvYyBzID1cbiAgdW5zYWZlX291dHB1dCBvYyBzIDAgKGJ5dGVzX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0X3N0cmluZyBvYyBzID1cbiAgdW5zYWZlX291dHB1dF9zdHJpbmcgb2MgcyAwIChzdHJpbmdfbGVuZ3RoIHMpXG5cbmxldCBvdXRwdXQgb2MgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRcIlxuICBlbHNlIHVuc2FmZV9vdXRwdXQgb2MgcyBvZnMgbGVuXG5cbmxldCBvdXRwdXRfc3Vic3RyaW5nIG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBzdHJpbmdfbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIm91dHB1dF9zdWJzdHJpbmdcIlxuICBlbHNlIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgb2ZzIGxlblxuXG5leHRlcm5hbCBvdXRwdXRfYnl0ZSA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9jaGFyXCJcbmV4dGVybmFsIG91dHB1dF9iaW5hcnlfaW50IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfb3V0cHV0X2ludFwiXG5cbmV4dGVybmFsIG1hcnNoYWxfdG9fY2hhbm5lbCA6IG91dF9jaGFubmVsIC0+ICdhIC0+IHVuaXQgbGlzdCAtPiB1bml0XG4gICAgID0gXCJjYW1sX291dHB1dF92YWx1ZVwiXG5sZXQgb3V0cHV0X3ZhbHVlIGNoYW4gdiA9IG1hcnNoYWxfdG9fY2hhbm5lbCBjaGFuIHYgW11cblxuZXh0ZXJuYWwgc2Vla19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9zZWVrX291dFwiXG5leHRlcm5hbCBwb3Nfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX3Bvc19vdXRcIlxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxfbGVuZ3RoIDogb3V0X2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2NoYW5uZWxfc2l6ZVwiXG5leHRlcm5hbCBjbG9zZV9vdXRfY2hhbm5lbCA6IG91dF9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2Vfb3V0IG9jID0gZmx1c2ggb2M7IGNsb3NlX291dF9jaGFubmVsIG9jXG5sZXQgY2xvc2Vfb3V0X25vZXJyIG9jID1cbiAgKHRyeSBmbHVzaCBvYyB3aXRoIF8gLT4gKCkpO1xuICAodHJ5IGNsb3NlX291dF9jaGFubmVsIG9jIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9vdXQgOiBvdXRfY2hhbm5lbCAtPiBib29sIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogR2VuZXJhbCBpbnB1dCBmdW5jdGlvbnMgKilcblxuZXh0ZXJuYWwgc2V0X2luX2NoYW5uZWxfbmFtZTogaW5fY2hhbm5lbCAtPiBzdHJpbmcgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lXCJcblxubGV0IG9wZW5faW5fZ2VuIG1vZGUgcGVybSBuYW1lID1cbiAgbGV0IGMgPSBvcGVuX2Rlc2NyaXB0b3JfaW4ob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfaW5fY2hhbm5lbF9uYW1lIGMgbmFtZTtcbiAgY1xuXG5sZXQgb3Blbl9pbiBuYW1lID1cbiAgb3Blbl9pbl9nZW4gW09wZW5fcmRvbmx5OyBPcGVuX3RleHRdIDAgbmFtZVxuXG5sZXQgb3Blbl9pbl9iaW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl9iaW5hcnldIDAgbmFtZVxuXG5leHRlcm5hbCBpbnB1dF9jaGFyIDogaW5fY2hhbm5lbCAtPiBjaGFyID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuXG5leHRlcm5hbCB1bnNhZmVfaW5wdXQgOiBpbl9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gaW50XG4gICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfaW5wdXRcIlxuXG5sZXQgaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJpbnB1dFwiXG4gIGVsc2UgdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlblxuXG5sZXQgcmVjIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgbGVuIDw9IDAgdGhlbiAoKSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSB1bnNhZmVfaW5wdXQgaWMgcyBvZnMgbGVuIGluXG4gICAgaWYgciA9IDBcbiAgICB0aGVuIHJhaXNlIEVuZF9vZl9maWxlXG4gICAgZWxzZSB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgKG9mcyArIHIpIChsZW4gLSByKVxuICBlbmRcblxubGV0IHJlYWxseV9pbnB1dCBpYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gYnl0ZXNfbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcInJlYWxseV9pbnB1dFwiXG4gIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYWxseV9pbnB1dF9zdHJpbmcgaWMgbGVuID1cbiAgbGV0IHMgPSBieXRlc19jcmVhdGUgbGVuIGluXG4gIHJlYWxseV9pbnB1dCBpYyBzIDAgbGVuO1xuICBieXRlc191bnNhZmVfdG9fc3RyaW5nIHNcblxuZXh0ZXJuYWwgaW5wdXRfc2Nhbl9saW5lIDogaW5fY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lXCJcblxubGV0IGlucHV0X2xpbmUgY2hhbiA9XG4gIGxldCByZWMgYnVpbGRfcmVzdWx0IGJ1ZiBwb3MgPSBmdW5jdGlvblxuICAgIFtdIC0+IGJ1ZlxuICB8IGhkIDo6IHRsIC0+XG4gICAgICBsZXQgbGVuID0gYnl0ZXNfbGVuZ3RoIGhkIGluXG4gICAgICBieXRlc19ibGl0IGhkIDAgYnVmIChwb3MgLSBsZW4pIGxlbjtcbiAgICAgIGJ1aWxkX3Jlc3VsdCBidWYgKHBvcyAtIGxlbikgdGwgaW5cbiAgbGV0IHJlYyBzY2FuIGFjY3UgbGVuID1cbiAgICBsZXQgbiA9IGlucHV0X3NjYW5fbGluZSBjaGFuIGluXG4gICAgaWYgbiA9IDAgdGhlbiBiZWdpbiAgICAgICAgICAgICAgICAgICAoKiBuID0gMDogd2UgYXJlIGF0IEVPRiAqKVxuICAgICAgbWF0Y2ggYWNjdSB3aXRoXG4gICAgICAgIFtdIC0+IHJhaXNlIEVuZF9vZl9maWxlXG4gICAgICB8IF8gIC0+IGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIGFjY3VcbiAgICBlbmQgZWxzZSBpZiBuID4gMCB0aGVuIGJlZ2luICAgICAgICAgICgqIG4gPiAwOiBuZXdsaW5lIGZvdW5kIGluIGJ1ZmZlciAqKVxuICAgICAgbGV0IHJlcyA9IGJ5dGVzX2NyZWF0ZSAobiAtIDEpIGluXG4gICAgICBpZ25vcmUgKHVuc2FmZV9pbnB1dCBjaGFuIHJlcyAwIChuIC0gMSkpO1xuICAgICAgaWdub3JlIChpbnB1dF9jaGFyIGNoYW4pOyAgICAgICAgICAgKCogc2tpcCB0aGUgbmV3bGluZSAqKVxuICAgICAgbWF0Y2ggYWNjdSB3aXRoXG4gICAgICAgIFtdIC0+IHJlc1xuICAgICAgfCAgXyAtPiBsZXQgbGVuID0gbGVuICsgbiAtIDEgaW5cbiAgICAgICAgICAgICAgYnVpbGRfcmVzdWx0IChieXRlc19jcmVhdGUgbGVuKSBsZW4gKHJlcyA6OiBhY2N1KVxuICAgIGVuZCBlbHNlIGJlZ2luICAgICAgICAgICAgICAgICAgICAgICAgKCogbiA8IDA6IG5ld2xpbmUgbm90IGZvdW5kICopXG4gICAgICBsZXQgYmVnID0gYnl0ZXNfY3JlYXRlICgtbikgaW5cbiAgICAgIGlnbm9yZSh1bnNhZmVfaW5wdXQgY2hhbiBiZWcgMCAoLW4pKTtcbiAgICAgIHNjYW4gKGJlZyA6OiBhY2N1KSAobGVuIC0gbilcbiAgICBlbmRcbiAgaW4gYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyAoc2NhbiBbXSAwKVxuXG5leHRlcm5hbCBpbnB1dF9ieXRlIDogaW5fY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfaW5wdXRfY2hhclwiXG5leHRlcm5hbCBpbnB1dF9iaW5hcnlfaW50IDogaW5fY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfaW5wdXRfaW50XCJcbmV4dGVybmFsIGlucHV0X3ZhbHVlIDogaW5fY2hhbm5lbCAtPiAnYSA9IFwiY2FtbF9pbnB1dF92YWx1ZVwiXG5leHRlcm5hbCBzZWVrX2luIDogaW5fY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9zZWVrX2luXCJcbmV4dGVybmFsIHBvc19pbiA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX3Bvc19pblwiXG5leHRlcm5hbCBpbl9jaGFubmVsX2xlbmd0aCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2NoYW5uZWxfc2l6ZVwiXG5leHRlcm5hbCBjbG9zZV9pbiA6IGluX2NoYW5uZWwgLT4gdW5pdCA9IFwiY2FtbF9tbF9jbG9zZV9jaGFubmVsXCJcbmxldCBjbG9zZV9pbl9ub2VyciBpYyA9ICh0cnkgY2xvc2VfaW4gaWMgd2l0aCBfIC0+ICgpKVxuZXh0ZXJuYWwgc2V0X2JpbmFyeV9tb2RlX2luIDogaW5fY2hhbm5lbCAtPiBib29sIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGVcIlxuXG4oKiBPdXRwdXQgZnVuY3Rpb25zIG9uIHN0YW5kYXJkIG91dHB1dCAqKVxuXG5sZXQgcHJpbnRfY2hhciBjID0gb3V0cHV0X2NoYXIgc3Rkb3V0IGNcbmxldCBwcmludF9zdHJpbmcgcyA9IG91dHB1dF9zdHJpbmcgc3Rkb3V0IHNcbmxldCBwcmludF9ieXRlcyBzID0gb3V0cHV0X2J5dGVzIHN0ZG91dCBzXG5sZXQgcHJpbnRfaW50IGkgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCAoc3RyaW5nX29mX2ludCBpKVxubGV0IHByaW50X2Zsb2F0IGYgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCAoc3RyaW5nX29mX2Zsb2F0IGYpXG5sZXQgcHJpbnRfZW5kbGluZSBzID1cbiAgb3V0cHV0X3N0cmluZyBzdGRvdXQgczsgb3V0cHV0X2NoYXIgc3Rkb3V0ICdcXG4nOyBmbHVzaCBzdGRvdXRcbmxldCBwcmludF9uZXdsaW5lICgpID0gb3V0cHV0X2NoYXIgc3Rkb3V0ICdcXG4nOyBmbHVzaCBzdGRvdXRcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBlcnJvciAqKVxuXG5sZXQgcHJlcnJfY2hhciBjID0gb3V0cHV0X2NoYXIgc3RkZXJyIGNcbmxldCBwcmVycl9zdHJpbmcgcyA9IG91dHB1dF9zdHJpbmcgc3RkZXJyIHNcbmxldCBwcmVycl9ieXRlcyBzID0gb3V0cHV0X2J5dGVzIHN0ZGVyciBzXG5sZXQgcHJlcnJfaW50IGkgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciAoc3RyaW5nX29mX2ludCBpKVxubGV0IHByZXJyX2Zsb2F0IGYgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciAoc3RyaW5nX29mX2Zsb2F0IGYpXG5sZXQgcHJlcnJfZW5kbGluZSBzID1cbiAgb3V0cHV0X3N0cmluZyBzdGRlcnIgczsgb3V0cHV0X2NoYXIgc3RkZXJyICdcXG4nOyBmbHVzaCBzdGRlcnJcbmxldCBwcmVycl9uZXdsaW5lICgpID0gb3V0cHV0X2NoYXIgc3RkZXJyICdcXG4nOyBmbHVzaCBzdGRlcnJcblxuKCogSW5wdXQgZnVuY3Rpb25zIG9uIHN0YW5kYXJkIGlucHV0ICopXG5cbmxldCByZWFkX2xpbmUgKCkgPSBmbHVzaCBzdGRvdXQ7IGlucHV0X2xpbmUgc3RkaW5cbmxldCByZWFkX2ludCAoKSA9IGludF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9pbnRfb3B0ICgpID0gaW50X29mX3N0cmluZ19vcHQocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdCAoKSA9IGZsb2F0X29mX3N0cmluZyhyZWFkX2xpbmUoKSlcbmxldCByZWFkX2Zsb2F0X29wdCAoKSA9IGZsb2F0X29mX3N0cmluZ19vcHQocmVhZF9saW5lKCkpXG5cbigqIE9wZXJhdGlvbnMgb24gbGFyZ2UgZmlsZXMgKilcblxubW9kdWxlIExhcmdlRmlsZSA9XG4gIHN0cnVjdFxuICAgIGV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50NjQgLT4gdW5pdCA9IFwiY2FtbF9tbF9zZWVrX291dF82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0ID0gXCJjYW1sX21sX3Bvc19vdXRfNjRcIlxuICAgIGV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludDY0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFwiXG4gICAgZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50NjQgLT4gdW5pdCA9IFwiY2FtbF9tbF9zZWVrX2luXzY0XCJcbiAgICBleHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0ID0gXCJjYW1sX21sX3Bvc19pbl82NFwiXG4gICAgZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludDY0ID0gXCJjYW1sX21sX2NoYW5uZWxfc2l6ZV82NFwiXG4gIGVuZFxuXG4oKiBGb3JtYXRzICopXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDZcbiAgID0gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2XG4gICA9IEZvcm1hdCBvZiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZtdFxuICAgICAgICAgICAgICAgKiBzdHJpbmdcblxudHlwZSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDQgPSAoJ2EsICdiLCAnYywgJ2MsICdjLCAnZCkgZm9ybWF0NlxuXG50eXBlICgnYSwgJ2IsICdjKSBmb3JtYXQgPSAoJ2EsICdiLCAnYywgJ2MpIGZvcm1hdDRcblxubGV0IHN0cmluZ19vZl9mb3JtYXQgKEZvcm1hdCAoX2ZtdCwgc3RyKSkgPSBzdHJcblxuZXh0ZXJuYWwgZm9ybWF0X29mX3N0cmluZyA6XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT5cbiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9IFwiJWlkZW50aXR5XCJcblxubGV0ICggXl4gKSAoRm9ybWF0IChmbXQxLCBzdHIxKSkgKEZvcm1hdCAoZm10Miwgc3RyMikpID1cbiAgRm9ybWF0IChDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuY29uY2F0X2ZtdCBmbXQxIGZtdDIsXG4gICAgICAgICAgc3RyMSBeIFwiJSxcIiBeIHN0cjIpXG5cbigqIE1pc2NlbGxhbmVvdXMgKilcblxuZXh0ZXJuYWwgc3lzX2V4aXQgOiBpbnQgLT4gJ2EgPSBcImNhbWxfc3lzX2V4aXRcIlxuXG4oKiBmb3IgYXRfZXhpdCAqKVxudHlwZSAnYSBhdG9taWNfdFxuZXh0ZXJuYWwgYXRvbWljX21ha2UgOiAnYSAtPiAnYSBhdG9taWNfdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsIGF0b21pY19nZXQgOiAnYSBhdG9taWNfdCAtPiAnYSA9IFwiJWF0b21pY19sb2FkXCJcbmV4dGVybmFsIGF0b21pY19jb21wYXJlX2FuZF9zZXQgOiAnYSBhdG9taWNfdCAtPiAnYSAtPiAnYSAtPiBib29sXG4gID0gXCIlYXRvbWljX2Nhc1wiXG5cbmxldCBleGl0X2Z1bmN0aW9uID0gYXRvbWljX21ha2UgZmx1c2hfYWxsXG5cbmxldCByZWMgYXRfZXhpdCBmID1cbiAgKCogTVBSIzcyNTMsIE1QUiM3Nzk2OiBtYWtlIHN1cmUgXCJmXCIgaXMgZXhlY3V0ZWQgb25seSBvbmNlICopXG4gIGxldCBmX3lldF90b19ydW4gPSBhdG9taWNfbWFrZSB0cnVlIGluXG4gIGxldCBvbGRfZXhpdCA9IGF0b21pY19nZXQgZXhpdF9mdW5jdGlvbiBpblxuICBsZXQgbmV3X2V4aXQgKCkgPVxuICAgIGlmIGF0b21pY19jb21wYXJlX2FuZF9zZXQgZl95ZXRfdG9fcnVuIHRydWUgZmFsc2UgdGhlbiBmICgpIDtcbiAgICBvbGRfZXhpdCAoKVxuICBpblxuICBsZXQgc3VjY2VzcyA9IGF0b21pY19jb21wYXJlX2FuZF9zZXQgZXhpdF9mdW5jdGlvbiBvbGRfZXhpdCBuZXdfZXhpdCBpblxuICBpZiBub3Qgc3VjY2VzcyB0aGVuIGF0X2V4aXQgZlxuXG5sZXQgZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQgPSByZWYgKGZ1biAoKSAtPiAoKSlcblxubGV0IGRvX2F0X2V4aXQgKCkgPVxuICAoIWRvX2RvbWFpbl9sb2NhbF9hdF9leGl0KSAoKTtcbiAgKGF0b21pY19nZXQgZXhpdF9mdW5jdGlvbikgKClcblxubGV0IGV4aXQgcmV0Y29kZSA9XG4gIGRvX2F0X2V4aXQgKCk7XG4gIHN5c19leGl0IHJldGNvZGVcblxubGV0IF8gPSByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuZG9fYXRfZXhpdFwiIGRvX2F0X2V4aXRcblxuKCpNT0RVTEVfQUxJQVNFUyopXG5tb2R1bGUgQXJnICAgICAgICAgICAgPSBBcmdcbm1vZHVsZSBBcnJheSAgICAgICAgICA9IEFycmF5XG5tb2R1bGUgQXJyYXlMYWJlbHMgICAgPSBBcnJheUxhYmVsc1xubW9kdWxlIEF0b21pYyAgICAgICAgID0gQXRvbWljXG5tb2R1bGUgQmlnYXJyYXkgICAgICAgPSBCaWdhcnJheVxubW9kdWxlIEJvb2wgICAgICAgICAgID0gQm9vbFxubW9kdWxlIEJ1ZmZlciAgICAgICAgID0gQnVmZmVyXG5tb2R1bGUgQnl0ZXMgICAgICAgICAgPSBCeXRlc1xubW9kdWxlIEJ5dGVzTGFiZWxzICAgID0gQnl0ZXNMYWJlbHNcbm1vZHVsZSBDYWxsYmFjayAgICAgICA9IENhbGxiYWNrXG5tb2R1bGUgQ2hhciAgICAgICAgICAgPSBDaGFyXG5tb2R1bGUgQ29tcGxleCAgICAgICAgPSBDb21wbGV4XG5tb2R1bGUgQ29uZGl0aW9uICAgICAgPSBDb25kaXRpb25cbm1vZHVsZSBEaWdlc3QgICAgICAgICA9IERpZ2VzdFxubW9kdWxlIERvbWFpbiAgICAgICAgID0gRG9tYWluXG5tb2R1bGUgRWZmZWN0ICAgICAgICAgPSBFZmZlY3Rcbm1vZHVsZSBFaXRoZXIgICAgICAgICA9IEVpdGhlclxubW9kdWxlIEVwaGVtZXJvbiAgICAgID0gRXBoZW1lcm9uXG5tb2R1bGUgRmlsZW5hbWUgICAgICAgPSBGaWxlbmFtZVxubW9kdWxlIEZsb2F0ICAgICAgICAgID0gRmxvYXRcbm1vZHVsZSBGb3JtYXQgICAgICAgICA9IEZvcm1hdFxubW9kdWxlIEZ1biAgICAgICAgICAgID0gRnVuXG5tb2R1bGUgR2MgICAgICAgICAgICAgPSBHY1xubW9kdWxlIEhhc2h0YmwgICAgICAgID0gSGFzaHRibFxubW9kdWxlIEluX2NoYW5uZWwgICAgID0gSW5fY2hhbm5lbFxubW9kdWxlIEludCAgICAgICAgICAgID0gSW50XG5tb2R1bGUgSW50MzIgICAgICAgICAgPSBJbnQzMlxubW9kdWxlIEludDY0ICAgICAgICAgID0gSW50NjRcbm1vZHVsZSBMYXp5ICAgICAgICAgICA9IExhenlcbm1vZHVsZSBMZXhpbmcgICAgICAgICA9IExleGluZ1xubW9kdWxlIExpc3QgICAgICAgICAgID0gTGlzdFxubW9kdWxlIExpc3RMYWJlbHMgICAgID0gTGlzdExhYmVsc1xubW9kdWxlIE1hcCAgICAgICAgICAgID0gTWFwXG5tb2R1bGUgTWFyc2hhbCAgICAgICAgPSBNYXJzaGFsXG5tb2R1bGUgTW9yZUxhYmVscyAgICAgPSBNb3JlTGFiZWxzXG5tb2R1bGUgTXV0ZXggICAgICAgICAgPSBNdXRleFxubW9kdWxlIE5hdGl2ZWludCAgICAgID0gTmF0aXZlaW50XG5tb2R1bGUgT2JqICAgICAgICAgICAgPSBPYmpcbm1vZHVsZSBPbyAgICAgICAgICAgICA9IE9vXG5tb2R1bGUgT3B0aW9uICAgICAgICAgPSBPcHRpb25cbm1vZHVsZSBPdXRfY2hhbm5lbCAgICA9IE91dF9jaGFubmVsXG5tb2R1bGUgUGFyc2luZyAgICAgICAgPSBQYXJzaW5nXG5tb2R1bGUgUHJpbnRleGMgICAgICAgPSBQcmludGV4Y1xubW9kdWxlIFByaW50ZiAgICAgICAgID0gUHJpbnRmXG5tb2R1bGUgUXVldWUgICAgICAgICAgPSBRdWV1ZVxubW9kdWxlIFJhbmRvbSAgICAgICAgID0gUmFuZG9tXG5tb2R1bGUgUmVzdWx0ICAgICAgICAgPSBSZXN1bHRcbm1vZHVsZSBTY2FuZiAgICAgICAgICA9IFNjYW5mXG5tb2R1bGUgU2VtYXBob3JlICAgICAgPSBTZW1hcGhvcmVcbm1vZHVsZSBTZXEgICAgICAgICAgICA9IFNlcVxubW9kdWxlIFNldCAgICAgICAgICAgID0gU2V0XG5tb2R1bGUgU3RhY2sgICAgICAgICAgPSBTdGFja1xubW9kdWxlIFN0ZExhYmVscyAgICAgID0gU3RkTGFiZWxzXG5tb2R1bGUgU3RyaW5nICAgICAgICAgPSBTdHJpbmdcbm1vZHVsZSBTdHJpbmdMYWJlbHMgICA9IFN0cmluZ0xhYmVsc1xubW9kdWxlIFN5cyAgICAgICAgICAgID0gU3lzXG5tb2R1bGUgVWNoYXIgICAgICAgICAgPSBVY2hhclxubW9kdWxlIFVuaXQgICAgICAgICAgID0gVW5pdFxubW9kdWxlIFdlYWsgICAgICAgICAgID0gV2Vha1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICBHYWJyaWVsIFNjaGVyZXIsIHByb2pldCBQYXJzaWZhbCwgSU5SSUEgU2FjbGF5ICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICgnYSwgJ2IpIHQgPSBMZWZ0IG9mICdhIHwgUmlnaHQgb2YgJ2JcblxubGV0IGxlZnQgdiA9IExlZnQgdlxubGV0IHJpZ2h0IHYgPSBSaWdodCB2XG5cbmxldCBpc19sZWZ0ID0gZnVuY3Rpb25cbnwgTGVmdCBfIC0+IHRydWVcbnwgUmlnaHQgXyAtPiBmYWxzZVxuXG5sZXQgaXNfcmlnaHQgPSBmdW5jdGlvblxufCBMZWZ0IF8gLT4gZmFsc2VcbnwgUmlnaHQgXyAtPiB0cnVlXG5cbmxldCBmaW5kX2xlZnQgPSBmdW5jdGlvblxufCBMZWZ0IHYgLT4gU29tZSB2XG58IFJpZ2h0IF8gLT4gTm9uZVxuXG5sZXQgZmluZF9yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgXyAtPiBOb25lXG58IFJpZ2h0IHYgLT4gU29tZSB2XG5cbmxldCBtYXBfbGVmdCBmID0gZnVuY3Rpb25cbnwgTGVmdCB2IC0+IExlZnQgKGYgdilcbnwgUmlnaHQgXyBhcyBlIC0+IGVcblxubGV0IG1hcF9yaWdodCBmID0gZnVuY3Rpb25cbnwgTGVmdCBfIGFzIGUgLT4gZVxufCBSaWdodCB2IC0+IFJpZ2h0IChmIHYpXG5cbmxldCBtYXAgfmxlZnQgfnJpZ2h0ID0gZnVuY3Rpb25cbnwgTGVmdCB2IC0+IExlZnQgKGxlZnQgdilcbnwgUmlnaHQgdiAtPiBSaWdodCAocmlnaHQgdilcblxubGV0IGZvbGQgfmxlZnQgfnJpZ2h0ID0gZnVuY3Rpb25cbnwgTGVmdCB2IC0+IGxlZnQgdlxufCBSaWdodCB2IC0+IHJpZ2h0IHZcblxubGV0IGl0ZXIgPSBmb2xkXG5cbmxldCBmb3JfYWxsID0gZm9sZFxuXG5sZXQgZXF1YWwgfmxlZnQgfnJpZ2h0IGUxIGUyID0gbWF0Y2ggZTEsIGUyIHdpdGhcbnwgTGVmdCB2MSwgTGVmdCB2MiAtPiBsZWZ0IHYxIHYyXG58IFJpZ2h0IHYxLCBSaWdodCB2MiAtPiByaWdodCB2MSB2MlxufCBMZWZ0IF8sIFJpZ2h0IF8gfCBSaWdodCBfLCBMZWZ0IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgfmxlZnQgfnJpZ2h0IGUxIGUyID0gbWF0Y2ggZTEsIGUyIHdpdGhcbnwgTGVmdCB2MSwgTGVmdCB2MiAtPiBsZWZ0IHYxIHYyXG58IFJpZ2h0IHYxLCBSaWdodCB2MiAtPiByaWdodCB2MSB2MlxufCBMZWZ0IF8sIFJpZ2h0IF8gLT4gKC0xKVxufCBSaWdodCBfLCBMZWZ0IF8gLT4gMVxuIiwiKCogQGNvbmZpZ3VyZV9pbnB1dEAgKilcbiMzIFwic3lzLm1sLmluXCJcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBiYWNrZW5kX3R5cGUgPVxuICB8IE5hdGl2ZVxuICB8IEJ5dGVjb2RlXG4gIHwgT3RoZXIgb2Ygc3RyaW5nXG4oKiBTeXN0ZW0gaW50ZXJmYWNlICopXG5cbmV4dGVybmFsIGdldF9jb25maWc6IHVuaXQgLT4gc3RyaW5nICogaW50ICogYm9vbCA9IFwiY2FtbF9zeXNfZ2V0X2NvbmZpZ1wiXG5leHRlcm5hbCBnZXRfZXhlY3V0YWJsZV9uYW1lIDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZVwiXG5leHRlcm5hbCBhcmd2IDogc3RyaW5nIGFycmF5ID0gXCIlc3lzX2FyZ3ZcIlxuZXh0ZXJuYWwgYmlnX2VuZGlhbiA6IHVuaXQgLT4gYm9vbCA9IFwiJWJpZ19lbmRpYW5cIlxuZXh0ZXJuYWwgd29yZF9zaXplIDogdW5pdCAtPiBpbnQgPSBcIiV3b3JkX3NpemVcIlxuZXh0ZXJuYWwgaW50X3NpemUgOiB1bml0IC0+IGludCA9IFwiJWludF9zaXplXCJcbmV4dGVybmFsIG1heF93b3NpemUgOiB1bml0IC0+IGludCA9IFwiJW1heF93b3NpemVcIlxuZXh0ZXJuYWwgdW5peCA6IHVuaXQgLT4gYm9vbCA9IFwiJW9zdHlwZV91bml4XCJcbmV4dGVybmFsIHdpbjMyIDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX3dpbjMyXCJcbmV4dGVybmFsIGN5Z3dpbiA6IHVuaXQgLT4gYm9vbCA9IFwiJW9zdHlwZV9jeWd3aW5cIlxuZXh0ZXJuYWwgZ2V0X2JhY2tlbmRfdHlwZSA6IHVuaXQgLT4gYmFja2VuZF90eXBlID0gXCIlYmFja2VuZF90eXBlXCJcblxubGV0IGV4ZWN1dGFibGVfbmFtZSA9IGdldF9leGVjdXRhYmxlX25hbWUoKVxubGV0IChvc190eXBlLCBfLCBfKSA9IGdldF9jb25maWcoKVxubGV0IGJhY2tlbmRfdHlwZSA9IGdldF9iYWNrZW5kX3R5cGUgKClcbmxldCBiaWdfZW5kaWFuID0gYmlnX2VuZGlhbiAoKVxubGV0IHdvcmRfc2l6ZSA9IHdvcmRfc2l6ZSAoKVxubGV0IGludF9zaXplID0gaW50X3NpemUgKClcbmxldCB1bml4ID0gdW5peCAoKVxubGV0IHdpbjMyID0gd2luMzIgKClcbmxldCBjeWd3aW4gPSBjeWd3aW4gKClcbmxldCBtYXhfYXJyYXlfbGVuZ3RoID0gbWF4X3dvc2l6ZSAoKVxubGV0IG1heF9mbG9hdGFycmF5X2xlbmd0aCA9IG1heF9hcnJheV9sZW5ndGggLyAoNjQgLyB3b3JkX3NpemUpXG5sZXQgbWF4X3N0cmluZ19sZW5ndGggPSB3b3JkX3NpemUgLyA4ICogbWF4X2FycmF5X2xlbmd0aCAtIDFcbmV4dGVybmFsIHJ1bnRpbWVfdmFyaWFudCA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3J1bnRpbWVfdmFyaWFudFwiXG5leHRlcm5hbCBydW50aW1lX3BhcmFtZXRlcnMgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9ydW50aW1lX3BhcmFtZXRlcnNcIlxuXG5leHRlcm5hbCBmaWxlX2V4aXN0czogc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3lzX2ZpbGVfZXhpc3RzXCJcbmV4dGVybmFsIGlzX2RpcmVjdG9yeSA6IHN0cmluZyAtPiBib29sID0gXCJjYW1sX3N5c19pc19kaXJlY3RvcnlcIlxuZXh0ZXJuYWwgcmVtb3ZlOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfcmVtb3ZlXCJcbmV4dGVybmFsIHJlbmFtZSA6IHN0cmluZyAtPiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfcmVuYW1lXCJcbmV4dGVybmFsIGdldGVudjogc3RyaW5nIC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZ2V0ZW52XCJcblxubGV0IGdldGVudl9vcHQgcyA9XG4gICgqIFRPRE86IGV4cG9zZSBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZSBkaXJlY3RseS4gKilcbiAgdHJ5IFNvbWUgKGdldGVudiBzKVxuICB3aXRoIE5vdF9mb3VuZCAtPiBOb25lXG5cbmV4dGVybmFsIGNvbW1hbmQ6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXCJcbmV4dGVybmFsIHRpbWU6IHVuaXQgLT4gKGZsb2F0IFtAdW5ib3hlZF0pID1cbiAgXCJjYW1sX3N5c190aW1lXCIgXCJjYW1sX3N5c190aW1lX3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2hkaXI6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19jaGRpclwiXG5leHRlcm5hbCBta2Rpcjogc3RyaW5nIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX3N5c19ta2RpclwiXG5leHRlcm5hbCBybWRpcjogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JtZGlyXCJcbmV4dGVybmFsIGdldGN3ZDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2dldGN3ZFwiXG5leHRlcm5hbCByZWFkZGlyIDogc3RyaW5nIC0+IHN0cmluZyBhcnJheSA9IFwiY2FtbF9zeXNfcmVhZF9kaXJlY3RvcnlcIlxuXG5sZXQgaW50ZXJhY3RpdmUgPSByZWYgZmFsc2VcblxudHlwZSBzaWduYWxfYmVoYXZpb3IgPVxuICAgIFNpZ25hbF9kZWZhdWx0XG4gIHwgU2lnbmFsX2lnbm9yZVxuICB8IFNpZ25hbF9oYW5kbGUgb2YgKGludCAtPiB1bml0KVxuXG5leHRlcm5hbCBzaWduYWwgOiBpbnQgLT4gc2lnbmFsX2JlaGF2aW9yIC0+IHNpZ25hbF9iZWhhdmlvclxuICAgICAgICAgICAgICAgID0gXCJjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXJcIlxuXG5sZXQgc2V0X3NpZ25hbCBzaWdfbnVtIHNpZ19iZWggPSBpZ25vcmUoc2lnbmFsIHNpZ19udW0gc2lnX2JlaClcblxubGV0IHNpZ2FicnQgPSAtMVxubGV0IHNpZ2Fscm0gPSAtMlxubGV0IHNpZ2ZwZSA9IC0zXG5sZXQgc2lnaHVwID0gLTRcbmxldCBzaWdpbGwgPSAtNVxubGV0IHNpZ2ludCA9IC02XG5sZXQgc2lna2lsbCA9IC03XG5sZXQgc2lncGlwZSA9IC04XG5sZXQgc2lncXVpdCA9IC05XG5sZXQgc2lnc2VndiA9IC0xMFxubGV0IHNpZ3Rlcm0gPSAtMTFcbmxldCBzaWd1c3IxID0gLTEyXG5sZXQgc2lndXNyMiA9IC0xM1xubGV0IHNpZ2NobGQgPSAtMTRcbmxldCBzaWdjb250ID0gLTE1XG5sZXQgc2lnc3RvcCA9IC0xNlxubGV0IHNpZ3RzdHAgPSAtMTdcbmxldCBzaWd0dGluID0gLTE4XG5sZXQgc2lndHRvdSA9IC0xOVxubGV0IHNpZ3Z0YWxybSA9IC0yMFxubGV0IHNpZ3Byb2YgPSAtMjFcbmxldCBzaWdidXMgPSAtMjJcbmxldCBzaWdwb2xsID0gLTIzXG5sZXQgc2lnc3lzID0gLTI0XG5sZXQgc2lndHJhcCA9IC0yNVxubGV0IHNpZ3VyZyA9IC0yNlxubGV0IHNpZ3hjcHUgPSAtMjdcbmxldCBzaWd4ZnN6ID0gLTI4XG5cbmV4Y2VwdGlvbiBCcmVha1xuXG5sZXQgY2F0Y2hfYnJlYWsgb24gPVxuICBpZiBvbiB0aGVuXG4gICAgc2V0X3NpZ25hbCBzaWdpbnQgKFNpZ25hbF9oYW5kbGUoZnVuIF8gLT4gcmFpc2UgQnJlYWspKVxuICBlbHNlXG4gICAgc2V0X3NpZ25hbCBzaWdpbnQgU2lnbmFsX2RlZmF1bHRcblxuXG5leHRlcm5hbCBlbmFibGVfcnVudGltZV93YXJuaW5nczogYm9vbCAtPiB1bml0ID1cbiAgXCJjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzXCJcbmV4dGVybmFsIHJ1bnRpbWVfd2FybmluZ3NfZW5hYmxlZDogdW5pdCAtPiBib29sID1cbiAgXCJjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZFwiXG5cbigqIFRoZSB2ZXJzaW9uIHN0cmluZyBpcyBmb3VuZCBpbiBmaWxlIC4uL1ZFUlNJT04gKilcblxubGV0IG9jYW1sX3ZlcnNpb24gPSBcIkBWRVJTSU9OQFwiXG5cbmxldCBkZXZlbG9wbWVudF92ZXJzaW9uID0gQE9DQU1MX0RFVkVMT1BNRU5UX1ZFUlNJT05AXG5cbnR5cGUgZXh0cmFfcHJlZml4ID0gUGx1cyB8IFRpbGRlXG5cbnR5cGUgZXh0cmFfaW5mbyA9IGV4dHJhX3ByZWZpeCAqIHN0cmluZ1xuXG50eXBlIG9jYW1sX3JlbGVhc2VfaW5mbyA9IHtcbiAgbWFqb3IgOiBpbnQ7XG4gIG1pbm9yIDogaW50O1xuICBwYXRjaGxldmVsIDogaW50O1xuICBleHRyYSA6IGV4dHJhX2luZm8gb3B0aW9uXG59XG5cbmxldCBvY2FtbF9yZWxlYXNlID0ge1xuICBtYWpvciA9IEBPQ0FNTF9WRVJTSU9OX01BSk9SQDtcbiAgbWlub3IgPSBAT0NBTUxfVkVSU0lPTl9NSU5PUkA7XG4gIHBhdGNobGV2ZWwgPSBAT0NBTUxfVkVSU0lPTl9QQVRDSExFVkVMQDtcbiAgZXh0cmEgPSBAT0NBTUxfUkVMRUFTRV9FWFRSQUBcbn1cblxuKCogT3B0aW1pemF0aW9uICopXG5cbmV4dGVybmFsIG9wYXF1ZV9pZGVudGl0eSA6ICdhIC0+ICdhID0gXCIlb3BhcXVlXCJcblxubW9kdWxlIEltbWVkaWF0ZTY0ID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIE5vbl9pbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHRcbiAgZW5kXG4gIG1vZHVsZSB0eXBlIEltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGVdXG4gIGVuZFxuXG4gIG1vZHVsZSBNYWtlKEltbWVkaWF0ZSA6IEltbWVkaWF0ZSkoTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUpID0gc3RydWN0XG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZTY0XVxuICAgIHR5cGUgJ2EgcmVwciA9XG4gICAgICB8IEltbWVkaWF0ZSA6IEltbWVkaWF0ZS50IHJlcHJcbiAgICAgIHwgTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUudCByZXByXG4gICAgZXh0ZXJuYWwgbWFnaWMgOiBfIHJlcHIgLT4gdCByZXByID0gXCIlaWRlbnRpdHlcIlxuICAgIGxldCByZXByID1cbiAgICAgIGlmIHdvcmRfc2l6ZSA9IDY0IHRoZW5cbiAgICAgICAgbWFnaWMgSW1tZWRpYXRlXG4gICAgICBlbHNlXG4gICAgICAgIG1hZ2ljIE5vbl9pbW1lZGlhdGVcbiAgZW5kXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogT3BlcmF0aW9ucyBvbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMgb2YgdmFsdWVzICopXG5cbnR5cGUgdFxuXG50eXBlIHJhd19kYXRhID0gbmF0aXZlaW50XG5cbmV4dGVybmFsIHJlcHIgOiAnYSAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgb2JqIDogdCAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIG1hZ2ljIDogJ2EgLT4gJ2IgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBpc19pbnQgOiB0IC0+IGJvb2wgPSBcIiVvYmpfaXNfaW50XCJcbmxldCBbQGlubGluZSBhbHdheXNdIGlzX2Jsb2NrIGEgPSBub3QgKGlzX2ludCBhKVxuZXh0ZXJuYWwgdGFnIDogdCAtPiBpbnQgPSBcImNhbWxfb2JqX3RhZ1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaXplIDogdCAtPiBpbnQgPSBcIiVvYmpfc2l6ZVwiXG5leHRlcm5hbCByZWFjaGFibGVfd29yZHMgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzXCJcbmV4dGVybmFsIGZpZWxkIDogdCAtPiBpbnQgLT4gdCA9IFwiJW9ial9maWVsZFwiXG5leHRlcm5hbCBzZXRfZmllbGQgOiB0IC0+IGludCAtPiB0IC0+IHVuaXQgPSBcIiVvYmpfc2V0X2ZpZWxkXCJcbmV4dGVybmFsIGNvbXBhcmVfYW5kX3N3YXBfZmllbGQgOiB0IC0+IGludCAtPiB0IC0+IHQgLT4gYm9vbFxuICA9IFwiY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcFwiXG5leHRlcm5hbCBpc19zaGFyZWQgOiB0IC0+IGJvb2wgPSBcImNhbWxfb2JqX2lzX3NoYXJlZFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X2dldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb2F0YXJyYXlfZ2V0XCJcbmV4dGVybmFsIGZsb2F0YXJyYXlfc2V0IDpcbiAgICBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCJjYW1sX2Zsb2F0YXJyYXlfc2V0XCJcbmxldCBbQGlubGluZSBhbHdheXNdIGRvdWJsZV9maWVsZCB4IGkgPSBmbG9hdGFycmF5X2dldCAob2JqIHggOiBmbG9hdGFycmF5KSBpXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBzZXRfZG91YmxlX2ZpZWxkIHggaSB2ID1cbiAgZmxvYXRhcnJheV9zZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaSB2XG5leHRlcm5hbCByYXdfZmllbGQgOiB0IC0+IGludCAtPiByYXdfZGF0YSA9IFwiY2FtbF9vYmpfcmF3X2ZpZWxkXCJcbmV4dGVybmFsIHNldF9yYXdfZmllbGQgOiB0IC0+IGludCAtPiByYXdfZGF0YSAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9vYmpfc2V0X3Jhd19maWVsZFwiXG5cbmV4dGVybmFsIG5ld19ibG9jayA6IGludCAtPiBpbnQgLT4gdCA9IFwiY2FtbF9vYmpfYmxvY2tcIlxuZXh0ZXJuYWwgZHVwIDogdCAtPiB0ID0gXCJjYW1sX29ial9kdXBcIlxuZXh0ZXJuYWwgYWRkX29mZnNldCA6IHQgLT4gSW50MzIudCAtPiB0ID0gXCJjYW1sX29ial9hZGRfb2Zmc2V0XCJcbmV4dGVybmFsIHdpdGhfdGFnIDogaW50IC0+IHQgLT4gdCA9IFwiY2FtbF9vYmpfd2l0aF90YWdcIlxuXG5sZXQgZmlyc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yX3RhZyA9IDBcbmxldCBsYXN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAyNDNcblxubGV0IGZvcmNpbmdfdGFnID0gMjQ0XG5sZXQgY29udF90YWcgPSAyNDVcbmxldCBsYXp5X3RhZyA9IDI0NlxubGV0IGNsb3N1cmVfdGFnID0gMjQ3XG5sZXQgb2JqZWN0X3RhZyA9IDI0OFxubGV0IGluZml4X3RhZyA9IDI0OVxubGV0IGZvcndhcmRfdGFnID0gMjUwXG5cbmxldCBub19zY2FuX3RhZyA9IDI1MVxuXG5sZXQgYWJzdHJhY3RfdGFnID0gMjUxXG5sZXQgc3RyaW5nX3RhZyA9IDI1MlxubGV0IGRvdWJsZV90YWcgPSAyNTNcbmxldCBkb3VibGVfYXJyYXlfdGFnID0gMjU0XG5sZXQgY3VzdG9tX3RhZyA9IDI1NVxuXG5cbmxldCBpbnRfdGFnID0gMTAwMFxubGV0IG91dF9vZl9oZWFwX3RhZyA9IDEwMDFcbmxldCB1bmFsaWduZWRfdGFnID0gMTAwMlxuXG5tb2R1bGUgQ2xvc3VyZSA9IHN0cnVjdFxuICB0eXBlIGluZm8gPSB7XG4gICAgYXJpdHk6IGludDtcbiAgICBzdGFydF9lbnY6IGludDtcbiAgfVxuXG4gIGxldCBpbmZvX29mX3JhdyAoaW5mbyA6IG5hdGl2ZWludCkgPVxuICAgIGxldCBvcGVuIE5hdGl2ZWludCBpblxuICAgIGxldCBhcml0eSA9XG4gICAgICAoKiBzaWduZWQ6IG5lZ2F0aXZlIGZvciB0dXBsZWQgZnVuY3Rpb25zICopXG4gICAgICBpZiBTeXMud29yZF9zaXplID0gNjQgdGhlblxuICAgICAgICB0b19pbnQgKHNoaWZ0X3JpZ2h0IGluZm8gNTYpXG4gICAgICBlbHNlXG4gICAgICAgIHRvX2ludCAoc2hpZnRfcmlnaHQgaW5mbyAyNClcbiAgICBpblxuICAgIGxldCBzdGFydF9lbnYgPVxuICAgICAgKCogc3RhcnRfZW52IGlzIHVuc2lnbmVkLCBidXQgd2Uga25vdyBpdCBjYW4gYWx3YXlzIGZpdCBhbiBPQ2FtbFxuICAgICAgICAgaW50ZWdlciBzbyB3ZSB1c2UgW3RvX2ludF0gaW5zdGVhZCBvZiBbdW5zaWduZWRfdG9faW50XS4gKilcbiAgICAgIHRvX2ludCAoc2hpZnRfcmlnaHRfbG9naWNhbCAoc2hpZnRfbGVmdCBpbmZvIDgpIDkpIGluXG4gICAgeyBhcml0eTsgc3RhcnRfZW52IH1cblxuICAoKiBub3RlOiB3ZSBleHBlY3QgYSBjbG9zdXJlLCBub3QgYW4gaW5maXggcG9pbnRlciAqKVxuICBsZXQgaW5mbyAob2JqIDogdCkgPVxuICAgIGFzc2VydCAodGFnIG9iaiA9IGNsb3N1cmVfdGFnKTtcbiAgICBpbmZvX29mX3JhdyAocmF3X2ZpZWxkIG9iaiAxKVxuZW5kXG5cbm1vZHVsZSBFeHRlbnNpb25fY29uc3RydWN0b3IgPVxuc3RydWN0XG4gIHR5cGUgdCA9IGV4dGVuc2lvbl9jb25zdHJ1Y3RvclxuICBsZXQgb2ZfdmFsIHggPVxuICAgIGxldCB4ID0gcmVwciB4IGluXG4gICAgbGV0IHNsb3QgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHgpICYmICh0YWcgeCkgPD4gb2JqZWN0X3RhZyAmJiAoc2l6ZSB4KSA+PSAxIHRoZW4gZmllbGQgeCAwXG4gICAgICBlbHNlIHhcbiAgICBpblxuICAgIGxldCBuYW1lID1cbiAgICAgIGlmIChpc19ibG9jayBzbG90KSAmJiAodGFnIHNsb3QpID0gb2JqZWN0X3RhZyB0aGVuIGZpZWxkIHNsb3QgMFxuICAgICAgZWxzZSBpbnZhbGlkX2FyZyBcIk9iai5leHRlbnNpb25fY29uc3RydWN0b3JcIlxuICAgIGluXG4gICAgICBpZiAodGFnIG5hbWUpID0gc3RyaW5nX3RhZyB0aGVuIChvYmogc2xvdCA6IHQpXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG5cbiAgbGV0IFtAaW5saW5lIGFsd2F5c10gbmFtZSAoc2xvdCA6IHQpID1cbiAgICAob2JqIChmaWVsZCAocmVwciBzbG90KSAwKSA6IHN0cmluZylcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBpZCAoc2xvdCA6IHQpID1cbiAgICAob2JqIChmaWVsZCAocmVwciBzbG90KSAxKSA6IGludClcbmVuZFxuXG5tb2R1bGUgRXBoZW1lcm9uID0gc3RydWN0XG4gIHR5cGUgb2JqX3QgPSB0XG5cbiAgdHlwZSB0ICgqKiBlcGhlbWVyb24gKilcblxuICAgKCoqIFRvIGNoYW5nZSBpbiBzeW5jIHdpdGggd2Vhay5oICopXG4gIGxldCBhZGRpdGlvbmFsX3ZhbHVlcyA9IDJcbiAgbGV0IG1heF9lcGhlX2xlbmd0aCA9IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIC0gYWRkaXRpb25hbF92YWx1ZXNcblxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9lcGhlX2NyZWF0ZVwiXG4gIGxldCBjcmVhdGUgbCA9XG4gICAgaWYgbm90ICgwIDw9IGwgJiYgbCA8PSBtYXhfZXBoZV9sZW5ndGgpIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5jcmVhdGVcIjtcbiAgICBjcmVhdGUgbFxuXG4gIGxldCBsZW5ndGggeCA9IHNpemUocmVwciB4KSAtIGFkZGl0aW9uYWxfdmFsdWVzXG5cbiAgbGV0IHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBtc2cgPVxuICAgIGlmIG5vdCAoMCA8PSBvICYmIG8gPCBsZW5ndGggZSkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgZXh0ZXJuYWwgZ2V0X2tleTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleVwiXG4gIGxldCBnZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi5nZXRfa2V5XCI7XG4gICAgZ2V0X2tleSBlIG9cblxuICBleHRlcm5hbCBnZXRfa2V5X2NvcHk6IHQgLT4gaW50IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9rZXlfY29weVwiXG4gIGxldCBnZXRfa2V5X2NvcHkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlfY29weVwiO1xuICAgIGdldF9rZXlfY29weSBlIG9cblxuICBleHRlcm5hbCBzZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2tleVwiXG4gIGxldCBzZXRfa2V5IGUgbyB4ID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLnNldF9rZXlcIjtcbiAgICBzZXRfa2V5IGUgbyB4XG5cbiAgZXh0ZXJuYWwgdW5zZXRfa2V5OiB0IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfdW5zZXRfa2V5XCJcbiAgbGV0IHVuc2V0X2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24udW5zZXRfa2V5XCI7XG4gICAgdW5zZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGNoZWNrX2tleTogdCAtPiBpbnQgLT4gYm9vbCA9IFwiY2FtbF9lcGhlX2NoZWNrX2tleVwiXG4gIGxldCBjaGVja19rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmNoZWNrX2tleVwiO1xuICAgIGNoZWNrX2tleSBlIG9cblxuICBleHRlcm5hbCBibGl0X2tleSA6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgPSBcImNhbWxfZXBoZV9ibGl0X2tleVwiXG5cbiAgbGV0IGJsaXRfa2V5IGUxIG8xIGUyIG8yIGwgPVxuICAgIGlmIGwgPCAwIHx8IG8xIDwgMCB8fCBvMSA+IGxlbmd0aCBlMSAtIGxcbiAgICAgICB8fCBvMiA8IDAgfHwgbzIgPiBsZW5ndGggZTIgLSBsXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIk9iai5FcGhlbWVyb24uYmxpdF9rZXlcIlxuICAgIGVsc2UgaWYgbCA8PiAwIHRoZW4gYmxpdF9rZXkgZTEgbzEgZTIgbzIgbFxuXG4gIGV4dGVybmFsIGdldF9kYXRhOiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhXCJcbiAgZXh0ZXJuYWwgZ2V0X2RhdGFfY29weTogdCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XCJcbiAgZXh0ZXJuYWwgc2V0X2RhdGE6IHQgLT4gb2JqX3QgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3NldF9kYXRhXCJcbiAgZXh0ZXJuYWwgdW5zZXRfZGF0YTogdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfdW5zZXRfZGF0YVwiXG4gIGV4dGVybmFsIGNoZWNrX2RhdGE6IHQgLT4gYm9vbCA9IFwiY2FtbF9lcGhlX2NoZWNrX2RhdGFcIlxuICBleHRlcm5hbCBibGl0X2RhdGEgOiB0IC0+IHQgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX2JsaXRfZGF0YVwiXG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9sYW4sIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNy0yMDE4IFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlLiAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICEnYSB0XG5cbmV4dGVybmFsIG1ha2UgOiAnYSAtPiAnYSB0ID0gXCIlbWFrZW11dGFibGVcIlxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiAnYSA9IFwiJWF0b21pY19sb2FkXCJcbmV4dGVybmFsIGV4Y2hhbmdlIDogJ2EgdCAtPiAnYSAtPiAnYSA9IFwiJWF0b21pY19leGNoYW5nZVwiXG5leHRlcm5hbCBjb21wYXJlX2FuZF9zZXQgOiAnYSB0IC0+ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVhdG9taWNfY2FzXCJcbmV4dGVybmFsIGZldGNoX2FuZF9hZGQgOiBpbnQgdCAtPiBpbnQgLT4gaW50ID0gXCIlYXRvbWljX2ZldGNoX2FkZFwiXG5leHRlcm5hbCBpZ25vcmUgOiAnYSAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxubGV0IHNldCByIHggPSBpZ25vcmUgKGV4Y2hhbmdlIHIgeClcbmxldCBpbmNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAxKVxubGV0IGRlY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByICgtMSkpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEludGVybmFscyBvZiBmb3JjaW5nIGxhenkgdmFsdWVzLiAqKVxuXG50eXBlICdhIHQgPSAnYSBsYXp5X3RcblxuZXhjZXB0aW9uIFVuZGVmaW5lZFxuXG4oKiBbdXBkYXRlX3RvX2ZvcmNpbmcgYmxrXSB0cmllcyB0byB1cGRhdGUgYSBbYmxrXSB3aXRoIFtsYXp5X3RhZ10gdG9cbiAgIFtmb3JjaW5nX3RhZ10gdXNpbmcgY29tcGFyZS1hbmQtc3dhcCAoQ0FTKSwgdGFraW5nIGNhcmUgdG8gaGFuZGxlIGNvbmN1cnJlbnRcbiAgIG1hcmtpbmcgb2YgdGhlIGhlYWRlciB3b3JkIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuIFJldHVybnMgWzBdIGlmIHRoZVxuICAgQ0FTIGlzIHN1Y2Nlc3NmdWwuIElmIHRoZSBDQVMgZmFpbHMsIHRoZW4gdGhlIHRhZyB3YXMgb2JzZXJ2ZWQgdG8gYmVcbiAgIHNvbWV0aGluZyBvdGhlciB0aGFuIFtsYXp5X3RhZ10gZHVlIHRvIGEgY29uY3VycmVudCBtdXRhdG9yLiBJbiB0aGlzIGNhc2UsXG4gICB0aGUgZnVuY3Rpb24gcmV0dXJucyBbMV0uICopXG5leHRlcm5hbCB1cGRhdGVfdG9fZm9yY2luZyA6IE9iai50IC0+IGludCA9XG4gIFwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3JjaW5nXCIgW0BAbm9hbGxvY11cblxuKCogW3Jlc2V0X3RvX2xhenkgYmxrXSBleHBlY3RzIFtibGtdIHRvIGJlIGEgbGF6eSBvYmplY3Qgd2l0aCBbT2JqLmZvcmNpbmdfdGFnXVxuICAgYW5kIHVwZGF0ZXMgdGhlIHRhZyB0byBbT2JqLmxhenlfdGFnXSwgdGFraW5nIGNhcmUgdG8gaGFuZGxlIGNvbmN1cnJlbnRcbiAgIG1hcmtpbmcgb2YgdGhpcyBvYmplY3QncyBoZWFkZXIgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC4gKilcbmV4dGVybmFsIHJlc2V0X3RvX2xhenkgOiBPYmoudCAtPiB1bml0ID0gXCJjYW1sX2xhenlfcmVzZXRfdG9fbGF6eVwiIFtAQG5vYWxsb2NdXG5cbigqIFt1cGRhdGVfdG9fZm9yd2FyZCBibGtdIGV4cGVjdHMgW2Jsa10gdG8gYmUgYSBsYXp5IG9iamVjdCB3aXRoXG4gICBbT2JqLmZvcmNpbmdfdGFnXSBhbmQgdXBkYXRlcyB0aGUgdGFnIHRvIFtPYmouZm9yd2FyZF90YWddLCB0YWtpbmcgY2FyZSB0b1xuICAgaGFuZGxlIGNvbmN1cnJlbnQgbWFya2luZyBvZiB0aGlzIG9iamVjdCdzIGhlYWRlciBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLlxuICopXG5leHRlcm5hbCB1cGRhdGVfdG9fZm9yd2FyZCA6IE9iai50IC0+IHVuaXQgPVxuICBcImNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZFwiIFtAQG5vYWxsb2NdXG5cbigqIEFzc3VtZXMgW2Jsa10gaXMgYSBibG9jayB3aXRoIHRhZyBmb3JjaW5nICopXG5sZXQgZG9fZm9yY2VfYmxvY2sgYmxrID1cbiAgbGV0IGIgPSBPYmoucmVwciBibGsgaW5cbiAgbGV0IGNsb3N1cmUgPSAoT2JqLm9iaiAoT2JqLmZpZWxkIGIgMCkgOiB1bml0IC0+ICdhcmcpIGluXG4gIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoKSk7ICgqIFJlbGVhc2UgdGhlIGNsb3N1cmUgKilcbiAgdHJ5XG4gICAgbGV0IHJlc3VsdCA9IGNsb3N1cmUgKCkgaW5cbiAgICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgICB1cGRhdGVfdG9fZm9yd2FyZCBiO1xuICAgIHJlc3VsdFxuICB3aXRoIGUgLT5cbiAgICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgKGZ1biAoKSAtPiByYWlzZSBlKSk7XG4gICAgcmVzZXRfdG9fbGF6eSBiO1xuICAgIHJhaXNlIGVcblxuKCogQXNzdW1lcyBbYmxrXSBpcyBhIGJsb2NrIHdpdGggdGFnIGZvcmNpbmcgKilcbmxldCBkb19mb3JjZV92YWxfYmxvY2sgYmxrID1cbiAgbGV0IGIgPSBPYmoucmVwciBibGsgaW5cbiAgbGV0IGNsb3N1cmUgPSAoT2JqLm9iaiAoT2JqLmZpZWxkIGIgMCkgOiB1bml0IC0+ICdhcmcpIGluXG4gIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoKSk7ICgqIFJlbGVhc2UgdGhlIGNsb3N1cmUgKilcbiAgbGV0IHJlc3VsdCA9IGNsb3N1cmUgKCkgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByIHJlc3VsdCk7XG4gIHVwZGF0ZV90b19mb3J3YXJkIGI7XG4gIHJlc3VsdFxuXG4oKiBDYWxsZWQgYnkgW2ZvcmNlX2dlbl0gKilcbmxldCBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWwgKGJsayA6ICdhcmcgbGF6eV90KSA9XG4gICgqIFdlIGV4cGVjdCB0aGUgdGFnIHRvIGJlIFtsYXp5X3RhZ10sIGJ1dCBtYXkgYmUgb3RoZXIgdGFncyBkdWUgdG9cbiAgICAgY29uY3VycmVudCBmb3JjaW5nIG9mIGxhenkgdmFsdWVzLiAqKVxuICBtYXRjaCB1cGRhdGVfdG9fZm9yY2luZyAoT2JqLnJlcHIgYmxrKSB3aXRoXG4gIHwgMCB3aGVuIG9ubHlfdmFsIC0+IGRvX2ZvcmNlX3ZhbF9ibG9jayBibGtcbiAgfCAwIC0+IGRvX2ZvcmNlX2Jsb2NrIGJsa1xuICB8IF8gLT4gcmFpc2UgVW5kZWZpbmVkXG5cbigqIHVzZWQgaW4gdGhlICVsYXp5X2ZvcmNlIHByaW1pdGl2ZSAqKVxubGV0IGZvcmNlX2xhenlfYmxvY2sgYmxrID0gZm9yY2VfZ2VuX2xhenlfYmxvY2sgfm9ubHlfdmFsOmZhbHNlIGJsa1xuXG4oKiBbZm9yY2VfZ2VuIH5vbmx5X3ZhbDpmYWxzZV0gaXMgbm90IHVzZWQsIHNpbmNlIFtMYXp5LmZvcmNlXSBpc1xuICAgZGVjbGFyZWQgYXMgYSBwcmltaXRpdmUgd2hvc2UgY29kZSBpbmxpbmVzIHRoZSB0YWcgdGVzdHMgb2YgaXRzXG4gICBhcmd1bWVudCwgZXhjZXB0IHdoZW4gYWZsIGluc3RydW1lbnRhdGlvbiBpcyB0dXJuZWQgb24uICopXG5sZXQgZm9yY2VfZ2VuIH5vbmx5X3ZhbCAobHp2IDogJ2FyZyBsYXp5X3QpID1cbiAgKCogVXNpbmcgW1N5cy5vcGFxdWVfaWRlbnRpdHldIHByZXZlbnRzIHR3byBwb3RlbnRpYWwgcHJvYmxlbXM6XG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGhhdmUgRm9yd2FyZF90YWcsIHRoZW4gaXQgY291bGQgaGF2ZSBiZWVuXG4gICAgICAgc2hvcnRjdXQgZHVyaW5nIEdDLCBzbyB0aGF0IGluZm9ybWF0aW9uIG11c3QgYmUgZm9yZ290dGVuIChzZWUgR1BSIzcxM1xuICAgICAgIGFuZCBpc3N1ZSAjNzMwMSkuIFRoaXMgaXMgbm90IGFuIGlzc3VlIGhlcmUgYXQgdGhlIG1vbWVudCBzaW5jZVxuICAgICAgIFtPYmoudGFnXSBpcyBub3Qgc2ltcGxpZmllZCBieSB0aGUgY29tcGlsZXIsIGFuZCBHUFIjNzEzIGFsc29cbiAgICAgICBlbnN1cmVzIHRoYXQgbm8gdmFsdWUgd2lsbCBiZSBrbm93biB0byBoYXZlIEZvcndhcmRfdGFnLlxuICAgICAtIElmIHRoZSB2YWx1ZSBpcyBrbm93biB0byBiZSBpbW11dGFibGUsIHRoZW4gaWYgdGhlIGNvbXBpbGVyXG4gICAgICAgY2Fubm90IHByb3ZlIHRoYXQgdGhlIGxhc3QgYnJhbmNoIGlzIG5vdCB0YWtlbiBpdCB3aWxsIGlzc3VlIGFcbiAgICAgICB3YXJuaW5nIDU5IChtb2RpZmljYXRpb24gb2YgYW4gaW1tdXRhYmxlIHZhbHVlKSAqKVxuICBsZXQgbHp2ID0gU3lzLm9wYXF1ZV9pZGVudGl0eSBsenYgaW5cbiAgbGV0IHggPSBPYmoucmVwciBsenYgaW5cbiAgKCogU1RBUlQgbm8gc2FmZSBwb2ludHMuIElmIGEgR0Mgb2NjdXJzIGhlcmUsIHRoZW4gdGhlIG9iamVjdCBbeF0gbWF5IGJlXG4gICAgIHNob3J0LWNpcmN1aXRlZCwgYW5kIGdldHRpbmcgdGhlIGZpcnN0IGZpZWxkIG9mIFt4XSB3b3VsZCBnZXQgdXMgdGhlIHdyb25nXG4gICAgIHZhbHVlLiBMdWNraWx5LCB0aGUgY29tcGlsZXIgZG9lcyBub3QgaW5zZXJ0IEdDIHNhZmUgcG9pbnRzIGF0IHRoaXMgcGxhY2UsXG4gICAgIHNvIGl0IGlzIG9rLiAqKVxuICBsZXQgdCA9IE9iai50YWcgeCBpblxuICBpZiB0ID0gT2JqLmZvcndhcmRfdGFnIHRoZW5cbiAgICAoT2JqLm9iaiAoT2JqLmZpZWxkIHggMCkgOiAnYXJnKVxuICAoKiBFTkQgbm8gc2FmZSBwb2ludHMgKilcbiAgZWxzZSBpZiB0ID0gT2JqLmZvcmNpbmdfdGFnIHRoZW4gcmFpc2UgVW5kZWZpbmVkXG4gIGVsc2UgaWYgdCA8PiBPYmoubGF6eV90YWcgdGhlbiAoT2JqLm9iaiB4IDogJ2FyZylcbiAgZWxzZSBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWwgbHp2XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbTGF6eV06IGRlZmVycmVkIGNvbXB1dGF0aW9ucyAqKVxuXG5cbigqXG4gICBXQVJOSU5HOiBzb21lIHB1cnBsZSBtYWdpYyBpcyBnb2luZyBvbiBoZXJlLiAgRG8gbm90IHRha2UgdGhpcyBmaWxlXG4gICBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBwcm9ncmFtIGluIE9DYW1sLlxuKilcblxuXG4oKiBXZSBtYWtlIHVzZSBvZiB0d28gc3BlY2lhbCB0YWdzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lOlxuICAgW2xhenlfdGFnXSBhbmQgW2ZvcndhcmRfdGFnXS5cblxuICAgQSB2YWx1ZSBvZiB0eXBlIFsnYSBMYXp5LnRdIGNhbiBiZSBvbmUgb2YgdGhyZWUgdGhpbmdzOlxuICAgMS4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2xhenlfdGFnXS4gIEl0cyBmaWVsZCBpcyBhIGNsb3N1cmUgb2ZcbiAgICAgIHR5cGUgW3VuaXQgLT4gJ2FdIHRoYXQgY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgMi4gQSBibG9jayBvZiBzaXplIDEgd2l0aCB0YWcgW2ZvcndhcmRfdGFnXS4gIEl0cyBmaWVsZCBpcyB0aGUgdmFsdWVcbiAgICAgIG9mIHR5cGUgWydhXSB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIDMuIEFueXRoaW5nIGVsc2UgZXhjZXB0IGEgZmxvYXQuICBUaGlzIGhhcyB0eXBlIFsnYV0gYW5kIGlzIHRoZSB2YWx1ZVxuICAgICAgdGhhdCB3YXMgY29tcHV0ZWQuXG4gICBFeGNlcHRpb25zIGFyZSBzdG9yZWQgaW4gZm9ybWF0ICgxKS5cbiAgIFRoZSBHQyB3aWxsIG1hZ2ljYWxseSBjaGFuZ2UgdGhpbmdzIGZyb20gKDIpIHRvICgzKSBhY2NvcmRpbmcgdG8gaXRzXG4gICBmYW5jeS5cblxuICAgSWYgT0NhbWwgd2FzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgLWZsYXQtZmxvYXQtYXJyYXkgb3B0aW9uICh3aGljaCBpc1xuICAgY3VycmVudGx5IHRoZSBkZWZhdWx0KSwgdGhlIGZvbGxvd2luZyBpcyBhbHNvIHRydWU6XG4gICBXZSBjYW5ub3QgdXNlIHJlcHJlc2VudGF0aW9uICgzKSBmb3IgYSBbZmxvYXQgTGF6eS50XSBiZWNhdXNlXG4gICBbY2FtbF9tYWtlX2FycmF5XSBhc3N1bWVzIHRoYXQgb25seSBhIFtmbG9hdF0gdmFsdWUgY2FuIGhhdmUgdGFnXG4gICBbRG91YmxlX3RhZ10uXG5cbiAgIFdlIGhhdmUgdG8gdXNlIHRoZSBidWlsdC1pbiB0eXBlIGNvbnN0cnVjdG9yIFtsYXp5X3RdIHRvXG4gICBsZXQgdGhlIGNvbXBpbGVyIGltcGxlbWVudCB0aGUgc3BlY2lhbCB0eXBpbmcgYW5kIGNvbXBpbGF0aW9uXG4gICBydWxlcyBmb3IgdGhlIFtsYXp5XSBrZXl3b3JkLlxuKilcblxudHlwZSAnYSB0ID0gJ2EgQ2FtbGludGVybmFsTGF6eS50XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWQgPSBDYW1saW50ZXJuYWxMYXp5LlVuZGVmaW5lZFxuZXh0ZXJuYWwgbWFrZV9mb3J3YXJkIDogJ2EgLT4gJ2EgbGF6eV90ID0gXCJjYW1sX2xhenlfbWFrZV9mb3J3YXJkXCJcbmV4dGVybmFsIGZvcmNlIDogJ2EgdCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuXG5sZXQgZm9yY2VfdmFsIGwgPSBDYW1saW50ZXJuYWxMYXp5LmZvcmNlX2dlbiB+b25seV92YWw6dHJ1ZSBsXG5cbmxldCBmcm9tX2Z1biAoZiA6IHVuaXQgLT4gJ2FyZykgPVxuICBsZXQgeCA9IE9iai5uZXdfYmxvY2sgT2JqLmxhenlfdGFnIDEgaW5cbiAgT2JqLnNldF9maWVsZCB4IDAgKE9iai5yZXByIGYpO1xuICAoT2JqLm9iaiB4IDogJ2FyZyB0KVxuXG5sZXQgZnJvbV92YWwgKHYgOiAnYXJnKSA9XG4gIGxldCB0ID0gT2JqLnRhZyAoT2JqLnJlcHIgdikgaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB8fCB0ID0gT2JqLmxhenlfdGFnIHx8XG4gICAgIHQgPSBPYmouZm9yY2luZ190YWcgfHwgdCA9IE9iai5kb3VibGVfdGFnIHRoZW4gYmVnaW5cbiAgICBtYWtlX2ZvcndhcmQgdlxuICBlbmQgZWxzZSBiZWdpblxuICAgIChPYmoubWFnaWMgdiA6ICdhcmcgdClcbiAgZW5kXG5cbmxldCBpc192YWwgKGwgOiAnYXJnIHQpID0gT2JqLnRhZyAoT2JqLnJlcHIgbCkgPD4gT2JqLmxhenlfdGFnXG5cbmxldCBtYXAgZiB4ID1cbiAgbGF6eSAoZiAoZm9yY2UgeCkpXG5cbmxldCBtYXBfdmFsIGYgeCA9XG4gIGlmIGlzX3ZhbCB4XG4gIHRoZW4gZnJvbV92YWwgKGYgKGZvcmNlIHgpKVxuICBlbHNlIGxhenkgKGYgKGZvcmNlIHgpKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFNpbW9uIENydWFuZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW1NlcV06IGZ1bmN0aW9uYWwgaXRlcmF0b3JzICopXG5cbnR5cGUgKydhIG5vZGUgPVxuICB8IE5pbFxuICB8IENvbnMgb2YgJ2EgKiAnYSB0XG5cbmFuZCAnYSB0ID0gdW5pdCAtPiAnYSBub2RlXG5cbmxldCBlbXB0eSAoKSA9IE5pbFxuXG5sZXQgcmV0dXJuIHggKCkgPSBDb25zICh4LCBlbXB0eSlcblxubGV0IGNvbnMgeCBuZXh0ICgpID0gQ29ucyAoeCwgbmV4dClcblxubGV0IHJlYyBhcHBlbmQgc2VxMSBzZXEyICgpID1cbiAgbWF0Y2ggc2VxMSgpIHdpdGhcbiAgfCBOaWwgLT4gc2VxMigpXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT4gQ29ucyAoeCwgYXBwZW5kIG5leHQgc2VxMilcblxubGV0IHJlYyBtYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKGYgeCwgbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBuZXh0ICgpXG4gICAgICAgIHwgU29tZSB5IC0+IENvbnMgKHksIGZpbHRlcl9tYXAgZiBuZXh0KVxuXG5sZXQgcmVjIGZpbHRlciBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIGlmIGYgeFxuICAgICAgdGhlbiBDb25zICh4LCBmaWx0ZXIgZiBuZXh0KVxuICAgICAgZWxzZSBmaWx0ZXIgZiBuZXh0ICgpXG5cbmxldCByZWMgY29uY2F0IHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgIGFwcGVuZCB4IChjb25jYXQgbmV4dCkgKClcblxubGV0IHJlYyBmbGF0X21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgYXBwZW5kIChmIHgpIChmbGF0X21hcCBmIG5leHQpICgpXG5cbmxldCBjb25jYXRfbWFwID0gZmxhdF9tYXBcblxubGV0IHJlYyBmb2xkX2xlZnQgZiBhY2Mgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiBhY2NcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGxldCBhY2MgPSBmIGFjYyB4IGluXG4gICAgICAgIGZvbGRfbGVmdCBmIGFjYyBuZXh0XG5cbmxldCByZWMgaXRlciBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gKClcbiAgICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICAgIGYgeDtcbiAgICAgICAgaXRlciBmIG5leHRcblxubGV0IHJlYyB1bmZvbGQgZiB1ICgpID1cbiAgbWF0Y2ggZiB1IHdpdGhcbiAgfCBOb25lIC0+IE5pbFxuICB8IFNvbWUgKHgsIHUnKSAtPiBDb25zICh4LCB1bmZvbGQgZiB1JylcblxubGV0IGlzX2VtcHR5IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoXywgXykgLT5cbiAgICAgIGZhbHNlXG5cbmxldCB1bmNvbnMgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIFNvbWUgKHgsIHhzKVxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuXG5cblxubGV0IHJlYyBsZW5ndGhfYXV4IGFjY3UgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zIChfLCB4cykgLT5cbiAgICAgIGxlbmd0aF9hdXggKGFjY3UgKyAxKSB4c1xuXG5sZXRbQGlubGluZV0gbGVuZ3RoIHhzID1cbiAgbGVuZ3RoX2F1eCAwIHhzXG5cbmxldCByZWMgaXRlcmlfYXV4IGYgaSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGYgaSB4O1xuICAgICAgaXRlcmlfYXV4IGYgKGkrMSkgeHNcblxubGV0W0BpbmxpbmVdIGl0ZXJpIGYgeHMgPVxuICBpdGVyaV9hdXggZiAwIHhzXG5cbmxldCByZWMgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGxldCBhY2N1ID0gZiBhY2N1IGkgeCBpblxuICAgICAgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBmb2xkX2xlZnRpIGYgYWNjdSB4cyA9XG4gIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAwIHhzXG5cbmxldCByZWMgZm9yX2FsbCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggJiYgZm9yX2FsbCBwIHhzXG5cbmxldCByZWMgZXhpc3RzIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBwIHggfHwgZXhpc3RzIHAgeHNcblxubGV0IHJlYyBmaW5kIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeCBlbHNlIGZpbmQgcCB4c1xuXG5sZXQgcmVjIGZpbmRfbWFwIGYgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IE5vbmUgLT5cbiAgICAgICAgICBmaW5kX21hcCBmIHhzXG4gICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT5cbiAgICAgICAgICByZXN1bHRcblxuKCogW2l0ZXIyXSwgW2ZvbGRfbGVmdDJdLCBbZm9yX2FsbDJdLCBbZXhpc3RzMl0sIFttYXAyXSwgW3ppcF0gd29yayBhbHNvIGluXG4gICB0aGUgY2FzZSB3aGVyZSB0aGUgdHdvIHNlcXVlbmNlcyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzLiBUaGV5IHN0b3AgYXMgc29vblxuICAgYXMgb25lIHNlcXVlbmNlIGlzIGV4aGF1c3RlZC4gVGhlaXIgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgYXN5bW1ldHJpYzogd2hlblxuICAgW3hzXSBpcyBlbXB0eSwgdGhleSBkbyBub3QgZm9yY2UgW3lzXTsgaG93ZXZlciwgd2hlbiBbeXNdIGlzIGVtcHR5LCBbeHNdIGlzXG4gICBmb3JjZWQsIGV2ZW4gdGhvdWdoIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGFwcGxpY2F0aW9uIFt4cygpXSB0dXJucyBvdXRcbiAgIHRvIGJlIHVzZWxlc3MuICopXG5cbmxldCByZWMgaXRlcjIgZiB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICAoKVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeTtcbiAgICAgICAgICBpdGVyMiBmIHhzIHlzXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGFjY3VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBhY2N1XG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGxldCBhY2N1ID0gZiBhY2N1IHggeSBpblxuICAgICAgICAgIGZvbGRfbGVmdDIgZiBhY2N1IHhzIHlzXG5cbmxldCByZWMgZm9yX2FsbDIgZiB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIHRydWVcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgZiB4IHkgJiYgZm9yX2FsbDIgZiB4cyB5c1xuXG5sZXQgcmVjIGV4aXN0czIgZiB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgZmFsc2VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeSB8fCBleGlzdHMyIGYgeHMgeXNcblxubGV0IHJlYyBlcXVhbCBlcSB4cyB5cyA9XG4gIG1hdGNoIHhzKCksIHlzKCkgd2l0aFxuICB8IE5pbCwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpLCBDb25zICh5LCB5cykgLT5cbiAgICAgIGVxIHggeSAmJiBlcXVhbCBlcSB4cyB5c1xuICB8IE5pbCwgQ29ucyAoXywgXylcbiAgfCBDb25zIChfLCBfKSwgTmlsIC0+XG4gICAgICBmYWxzZVxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gIHwgTmlsLCBOaWwgLT5cbiAgICAgIDBcbiAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgbGV0IGMgPSBjbXAgeCB5IGluXG4gICAgICBpZiBjIDw+IDAgdGhlbiBjIGVsc2UgY29tcGFyZSBjbXAgeHMgeXNcbiAgfCBOaWwsIENvbnMgKF8sIF8pIC0+XG4gICAgICAtMVxuICB8IENvbnMgKF8sIF8pLCBOaWwgLT5cbiAgICAgICsxXG5cblxuXG4oKiBbaW5pdF9hdXggZiBpIGpdIGlzIHRoZSBzZXF1ZW5jZSBbZiBpLCAuLi4sIGYgKGotMSldLiAqKVxuXG5sZXQgcmVjIGluaXRfYXV4IGYgaSBqICgpID1cbiAgaWYgaSA8IGogdGhlbiBiZWdpblxuICAgIENvbnMgKGYgaSwgaW5pdF9hdXggZiAoaSArIDEpIGopXG4gIGVuZFxuICBlbHNlXG4gICAgTmlsXG5cbmxldCBpbml0IG4gZiA9XG4gIGlmIG4gPCAwIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlNlcS5pbml0XCJcbiAgZWxzZVxuICAgIGluaXRfYXV4IGYgMCBuXG5cbmxldCByZWMgcmVwZWF0IHggKCkgPVxuICBDb25zICh4LCByZXBlYXQgeClcblxubGV0IHJlYyBmb3JldmVyIGYgKCkgPVxuICBDb25zIChmKCksIGZvcmV2ZXIgZilcblxuKCogVGhpcyBwcmVsaW1pbmFyeSBkZWZpbml0aW9uIG9mIFtjeWNsZV0gcmVxdWlyZXMgdGhlIHNlcXVlbmNlIFt4c11cbiAgIHRvIGJlIG5vbmVtcHR5LiBBcHBseWluZyBpdCB0byBhbiBlbXB0eSBzZXF1ZW5jZSB3b3VsZCBwcm9kdWNlIGFcbiAgIHNlcXVlbmNlIHRoYXQgZGl2ZXJnZXMgd2hlbiBpdCBpcyBmb3JjZWQuICopXG5cbmxldCByZWMgY3ljbGVfbm9uZW1wdHkgeHMgKCkgPVxuICBhcHBlbmQgeHMgKGN5Y2xlX25vbmVtcHR5IHhzKSAoKVxuXG4oKiBbY3ljbGUgeHNdIGNoZWNrcyB3aGV0aGVyIFt4c10gaXMgZW1wdHkgYW5kLCBpZiBzbywgcmV0dXJucyBhbiBlbXB0eVxuICAgc2VxdWVuY2UuIE90aGVyd2lzZSwgW2N5Y2xlIHhzXSBwcm9kdWNlcyBvbmUgY29weSBvZiBbeHNdIGZvbGxvd2VkXG4gICB3aXRoIHRoZSBpbmZpbml0ZSBzZXF1ZW5jZSBbY3ljbGVfbm9uZW1wdHkgeHNdLiBUaHVzLCB0aGUgbm9uZW1wdGluZXNzXG4gICBjaGVjayBpcyBwZXJmb3JtZWQganVzdCBvbmNlLiAqKVxuXG5sZXQgY3ljbGUgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzJykgLT5cbiAgICAgIENvbnMgKHgsIGFwcGVuZCB4cycgKGN5Y2xlX25vbmVtcHR5IHhzKSlcblxuKCogW2l0ZXJhdGUxIGYgeF0gaXMgdGhlIHNlcXVlbmNlIFtmIHgsIGYgKGYgeCksIC4uLl0uXG4gICBJdCBpcyBlcXVpdmFsZW50IHRvIFt0YWlsIChpdGVyYXRlIGYgeCldLlxuICAgW2l0ZXJhdGUxXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW2l0ZXJhdGVdLiAqKVxuXG5sZXQgcmVjIGl0ZXJhdGUxIGYgeCAoKSA9XG4gIGxldCB5ID0gZiB4IGluXG4gIENvbnMgKHksIGl0ZXJhdGUxIGYgeSlcblxuKCogW2l0ZXJhdGUgZiB4XSBpcyB0aGUgc2VxdWVuY2UgW3gsIGYgeCwgLi4uXS4gKilcblxuKCogVGhlIHJlYXNvbiB3aHkgd2UgZ2l2ZSB0aGlzIHNsaWdodGx5IGluZGlyZWN0IGRlZmluaXRpb24gb2YgW2l0ZXJhdGVdLFxuICAgYXMgb3Bwb3NlZCB0byB0aGUgbW9yZSBuYWl2ZSBkZWZpbml0aW9uIHRoYXQgbWF5IGNvbWUgdG8gbWluZCwgaXMgdGhhdFxuICAgd2UgYXJlIGNhcmVmdWwgdG8gYXZvaWQgZXZhbHVhdGluZyBbZiB4XSB1bnRpbCB0aGlzIGZ1bmN0aW9uIGNhbGwgaXNcbiAgIGFjdHVhbGx5IG5lY2Vzc2FyeS4gVGhlIG5haXZlIGRlZmluaXRpb24gKG5vdCBzaG93biBoZXJlKSBjb21wdXRlcyB0aGVcbiAgIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgc2VxdWVuY2UsIFtmIHhdLCB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBpc1xuICAgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLiAqKVxuXG5sZXQgaXRlcmF0ZSBmIHggPVxuICBjb25zIHggKGl0ZXJhdGUxIGYgeClcblxuXG5cbmxldCByZWMgbWFwaV9hdXggZiBpIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIENvbnMgKGYgaSB4LCBtYXBpX2F1eCBmIChpKzEpIHhzKVxuXG5sZXRbQGlubGluZV0gbWFwaSBmIHhzID1cbiAgbWFwaV9hdXggZiAwIHhzXG5cbigqIFt0YWlsX3NjYW4gZiBzIHhzXSBpcyBlcXVpdmFsZW50IHRvIFt0YWlsIChzY2FuIGYgcyB4cyldLlxuICAgW3RhaWxfc2Nhbl0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtzY2FuXS4gKilcblxuKCogVGhpcyBzbGlnaHRseSBpbmRpcmVjdCBkZWZpbml0aW9uIG9mIFtzY2FuXSBpcyBtZWFudCB0byBhdm9pZCBjb21wdXRpbmdcbiAgIGVsZW1lbnRzIHRvbyBlYXJseTsgc2VlIHRoZSBhYm92ZSBjb21tZW50IGFib3V0IFtpdGVyYXRlMV0gYW5kIFtpdGVyYXRlXS4gKilcblxubGV0IHJlYyB0YWlsX3NjYW4gZiBzIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGxldCBzID0gZiBzIHggaW5cbiAgICAgIENvbnMgKHMsIHRhaWxfc2NhbiBmIHMgeHMpXG5cbmxldCBzY2FuIGYgcyB4cyA9XG4gIGNvbnMgcyAodGFpbF9zY2FuIGYgcyB4cylcblxuKCogW3Rha2VdIGlzIGRlZmluZWQgaW4gc3VjaCBhIHdheSB0aGF0IFt0YWtlIDAgeHNdIHJldHVybnMgW2VtcHR5XVxuICAgaW1tZWRpYXRlbHksIHdpdGhvdXQgYWxsb2NhdGluZyBhbnkgbWVtb3J5LiAqKVxuXG5sZXQgcmVjIHRha2VfYXV4IG4geHMgPVxuICBpZiBuID0gMCB0aGVuXG4gICAgZW1wdHlcbiAgZWxzZVxuICAgIGZ1biAoKSAtPlxuICAgICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIE5pbFxuICAgICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgICBDb25zICh4LCB0YWtlX2F1eCAobi0xKSB4cylcblxubGV0IHRha2UgbiB4cyA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJTZXEudGFrZVwiO1xuICB0YWtlX2F1eCBuIHhzXG5cbigqIFtmb3JjZV9kcm9wIG4geHNdIGlzIGVxdWl2YWxlbnQgdG8gW2Ryb3AgbiB4cyAoKV0uXG4gICBbZm9yY2VfZHJvcCBuIHhzXSByZXF1aXJlcyBbbiA+IDBdLlxuICAgW2ZvcmNlX2Ryb3BdIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbZHJvcF0uICopXG5cbmxldCByZWMgZm9yY2VfZHJvcCBuIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zIChfLCB4cykgLT5cbiAgICAgIGxldCBuID0gbiAtIDEgaW5cbiAgICAgIGlmIG4gPSAwIHRoZW5cbiAgICAgICAgeHMoKVxuICAgICAgZWxzZVxuICAgICAgICBmb3JjZV9kcm9wIG4geHNcblxuKCogW2Ryb3BdIGlzIGRlZmluZWQgaW4gc3VjaCBhIHdheSB0aGF0IFtkcm9wIDAgeHNdIHJldHVybnMgW3hzXSBpbW1lZGlhdGVseSxcbiAgIHdpdGhvdXQgYWxsb2NhdGluZyBhbnkgbWVtb3J5LiAqKVxuXG5sZXQgZHJvcCBuIHhzID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcS5kcm9wXCJcbiAgZWxzZSBpZiBuID0gMCB0aGVuXG4gICAgeHNcbiAgZWxzZVxuICAgIGZ1biAoKSAtPlxuICAgICAgZm9yY2VfZHJvcCBuIHhzXG5cbmxldCByZWMgdGFrZV93aGlsZSBwIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIGlmIHAgeCB0aGVuIENvbnMgKHgsIHRha2Vfd2hpbGUgcCB4cykgZWxzZSBOaWxcblxubGV0IHJlYyBkcm9wX3doaWxlIHAgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSBhcyBub2RlIC0+XG4gICAgICBpZiBwIHggdGhlbiBkcm9wX3doaWxlIHAgeHMgKCkgZWxzZSBub2RlXG5cbmxldCByZWMgZ3JvdXAgZXEgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoY29ucyB4ICh0YWtlX3doaWxlIChlcSB4KSB4cyksIGdyb3VwIGVxIChkcm9wX3doaWxlIChlcSB4KSB4cykpXG5cbmV4Y2VwdGlvbiBGb3JjZWRfdHdpY2VcblxubW9kdWxlIFN1c3BlbnNpb24gPSBzdHJ1Y3RcblxuICB0eXBlICdhIHN1c3BlbnNpb24gPVxuICAgIHVuaXQgLT4gJ2FcblxuICAoKiBDb252ZXJzaW9ucy4gKilcblxuICBsZXQgdG9fbGF6eSA6ICdhIHN1c3BlbnNpb24gLT4gJ2EgTGF6eS50ID1cbiAgICBMYXp5LmZyb21fZnVuXG4gICAgKCogZnVuIHMgLT4gbGF6eSAocygpKSAqKVxuXG4gIGxldCBmcm9tX2xhenkgKHMgOiAnYSBMYXp5LnQpIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgZnVuICgpIC0+IExhenkuZm9yY2Ugc1xuXG4gICgqIFttZW1vaXplXSB0dXJucyBhbiBhcmJpdHJhcnkgc3VzcGVuc2lvbiBpbnRvIGEgcGVyc2lzdGVudCBzdXNwZW5zaW9uLiAqKVxuXG4gIGxldCBtZW1vaXplIChzIDogJ2Egc3VzcGVuc2lvbikgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBmcm9tX2xhenkgKHRvX2xhenkgcylcblxuICAoKiBbZmFpbHVyZV0gaXMgYSBzdXNwZW5zaW9uIHRoYXQgZmFpbHMgd2hlbiBmb3JjZWQuICopXG5cbiAgbGV0IGZhaWx1cmUgOiBfIHN1c3BlbnNpb24gPVxuICAgIGZ1biAoKSAtPlxuICAgICAgKCogQSBzdXNwZW5zaW9uIGNyZWF0ZWQgYnkgW29uY2VdIGhhcyBiZWVuIGZvcmNlZCB0d2ljZS4gKilcbiAgICAgIHJhaXNlIEZvcmNlZF90d2ljZVxuXG4gICgqIElmIFtmXSBpcyBhIHN1c3BlbnNpb24sIHRoZW4gW29uY2UgZl0gaXMgYSBzdXNwZW5zaW9uIHRoYXQgY2FuIGJlIGZvcmNlZFxuICAgICBhdCBtb3N0IG9uY2UuIElmIGl0IGlzIGZvcmNlZCBtb3JlIHRoYW4gb25jZSwgdGhlbiBbRm9yY2VkX3R3aWNlXSBpc1xuICAgICByYWlzZWQuICopXG5cbiAgbGV0IG9uY2UgKGYgOiAnYSBzdXNwZW5zaW9uKSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGxldCBhY3Rpb24gPSBBdG9taWMubWFrZSBmIGluXG4gICAgZnVuICgpIC0+XG4gICAgICAoKiBHZXQgdGhlIGZ1bmN0aW9uIGN1cnJlbnRseSBzdG9yZWQgaW4gW2FjdGlvbl0sIGFuZCB3cml0ZSB0aGVcbiAgICAgICAgIGZ1bmN0aW9uIFtmYWlsdXJlXSBpbiBpdHMgcGxhY2UsIHNvIHRoZSBuZXh0IGFjY2VzcyB3aWxsIHJlc3VsdFxuICAgICAgICAgaW4gYSBjYWxsIHRvIFtmYWlsdXJlKCldLiAqKVxuICAgICAgbGV0IGYgPSBBdG9taWMuZXhjaGFuZ2UgYWN0aW9uIGZhaWx1cmUgaW5cbiAgICAgIGYoKVxuXG5lbmQgKCogU3VzcGVuc2lvbiAqKVxuXG5sZXQgcmVjIG1lbW9pemUgeHMgPVxuICBTdXNwZW5zaW9uLm1lbW9pemUgKGZ1biAoKSAtPlxuICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIENvbnMgKHgsIG1lbW9pemUgeHMpXG4gIClcblxubGV0IHJlYyBvbmNlIHhzID1cbiAgU3VzcGVuc2lvbi5vbmNlIChmdW4gKCkgLT5cbiAgICBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBDb25zICh4LCBvbmNlIHhzKVxuICApXG5cblxubGV0IHJlYyB6aXAgeHMgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIE5pbFxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBDb25zICgoeCwgeSksIHppcCB4cyB5cylcblxubGV0IHJlYyBtYXAyIGYgeHMgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIE5pbFxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBDb25zIChmIHggeSwgbWFwMiBmIHhzIHlzKVxuXG5sZXQgcmVjIGludGVybGVhdmUgeHMgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIHlzKClcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIENvbnMgKHgsIGludGVybGVhdmUgeXMgeHMpXG5cbigqIFtzb3J0ZWRfbWVyZ2UxbCBjbXAgeCB4cyB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCAoY29ucyB4IHhzKSB5c10uXG5cbiAgIFtzb3J0ZWRfbWVyZ2UxciBjbXAgeHMgeSB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCB4cyAoY29ucyB5IHlzKV0uXG5cbiAgIFtzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgW3NvcnRlZF9tZXJnZSBjbXAgKGNvbnMgeCB4cykgKGNvbnMgeSB5cyldLlxuXG4gICBUaGVzZSB0aHJlZSBmdW5jdGlvbnMgYXJlIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIGluIHRoZSBkZWZpbml0aW9uXG4gICBvZiBbc29ydGVkX21lcmdlXS4gKilcblxubGV0IHJlYyBzb3J0ZWRfbWVyZ2UxbCBjbXAgeCB4cyB5cyAoKSA9XG4gIG1hdGNoIHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgQ29ucyAoeCwgeHMpXG4gIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXNcblxuYW5kIHNvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBDb25zICh5LCB5cylcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5hbmQgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzID1cbiAgaWYgY21wIHggeSA8PSAwIHRoZW5cbiAgICBDb25zICh4LCBzb3J0ZWRfbWVyZ2UxciBjbXAgeHMgeSB5cylcbiAgZWxzZVxuICAgIENvbnMgKHksIHNvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzKVxuXG5sZXQgc29ydGVkX21lcmdlIGNtcCB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCksIHlzKCkgd2l0aFxuICAgIHwgTmlsLCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBOaWwsIGNcbiAgICB8IGMsIE5pbCAtPlxuICAgICAgICBjXG4gICAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgICBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXNcblxuXG5sZXQgcmVjIG1hcF9mc3QgeHlzICgpID1cbiAgbWF0Y2ggeHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoKHgsIF8pLCB4eXMpIC0+XG4gICAgICBDb25zICh4LCBtYXBfZnN0IHh5cylcblxubGV0IHJlYyBtYXBfc25kIHh5cyAoKSA9XG4gIG1hdGNoIHh5cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKChfLCB5KSwgeHlzKSAtPlxuICAgICAgQ29ucyAoeSwgbWFwX3NuZCB4eXMpXG5cbmxldCB1bnppcCB4eXMgPVxuICBtYXBfZnN0IHh5cywgbWFwX3NuZCB4eXNcblxubGV0IHNwbGl0ID1cbiAgdW56aXBcblxuKCogW2ZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzXSBpcyBlcXVpdmFsZW50IHRvXG4gICBbZmlsdGVyX21hcCBFaXRoZXIuZmluZF9sZWZ0IChtYXAgZiB4cyldLiAqKVxuXG5sZXQgcmVjIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IEVpdGhlci5MZWZ0IHkgLT5cbiAgICAgICAgICBDb25zICh5LCBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cylcbiAgICAgIHwgRWl0aGVyLlJpZ2h0IF8gLT5cbiAgICAgICAgICBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyAoKVxuXG5sZXQgcmVjIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBFaXRoZXIuTGVmdCBfIC0+XG4gICAgICAgICAgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzICgpXG4gICAgICB8IEVpdGhlci5SaWdodCB6IC0+XG4gICAgICAgICAgQ29ucyAoeiwgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzKVxuXG5sZXQgcGFydGl0aW9uX21hcCBmIHhzID1cbiAgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMsXG4gIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4c1xuXG5sZXQgcGFydGl0aW9uIHAgeHMgPVxuICBmaWx0ZXIgcCB4cywgZmlsdGVyIChmdW4geCAtPiBub3QgKHAgeCkpIHhzXG5cbigqIElmIFt4c3NdIGlzIGEgbWF0cml4IChhIHNlcXVlbmNlIG9mIHJvd3MpLCB0aGVuIFtwZWVsIHhzc10gaXMgYSBwYWlyIG9mXG4gICB0aGUgZmlyc3QgY29sdW1uIChhIHNlcXVlbmNlIG9mIGVsZW1lbnRzKSBhbmQgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGVcbiAgIG1hdHJpeCAoYSBzZXF1ZW5jZSBvZiBzaG9ydGVyIHJvd3MpLiBUaGVzZSB0d28gc2VxdWVuY2VzIGhhdmUgdGhlIHNhbWVcbiAgIGxlbmd0aC4gVGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCBbeHNzXSBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIHNhbWVcbiAgIGxlbmd0aC4gQW4gZW1wdHkgcm93IGlzIGlnbm9yZWQuICopXG5cbigqIEJlY2F1c2UgW3BlZWxdIHVzZXMgW3VuemlwXSwgaXRzIGFyZ3VtZW50IG11c3QgYmUgcGVyc2lzdGVudC4gVGhlIHNhbWVcbiAgIHJlbWFyayBhcHBsaWVzIHRvIFt0cmFuc3Bvc2VdLCBbZGlhZ29uYWxzXSwgW3Byb2R1Y3RdLCBldGMuICopXG5cbmxldCBwZWVsIHhzcyA9XG4gIHVuemlwIChmaWx0ZXJfbWFwIHVuY29ucyB4c3MpXG5cbmxldCByZWMgdHJhbnNwb3NlIHhzcyAoKSA9XG4gIGxldCBoZWFkcywgdGFpbHMgPSBwZWVsIHhzcyBpblxuICBpZiBpc19lbXB0eSBoZWFkcyB0aGVuIGJlZ2luXG4gICAgYXNzZXJ0IChpc19lbXB0eSB0YWlscyk7XG4gICAgTmlsXG4gIGVuZFxuICBlbHNlXG4gICAgQ29ucyAoaGVhZHMsIHRyYW5zcG9zZSB0YWlscylcblxuKCogVGhlIGludGVybmFsIGZ1bmN0aW9uIFtkaWFnb25hbHNdIHRha2VzIGFuIGV4dHJhIGFyZ3VtZW50LCBbcmVtYWluZGVyc10sXG4gICB3aGljaCBjb250YWlucyB0aGUgcmVtYWluZGVycyBvZiB0aGUgcm93cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuXG4gICBkaXNjb3ZlcmVkLiAqKVxuXG5sZXQgcmVjIGRpYWdvbmFscyByZW1haW5kZXJzIHhzcyAoKSA9XG4gIG1hdGNoIHhzcygpIHdpdGhcbiAgfCBDb25zICh4cywgeHNzKSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggeHMoKSB3aXRoXG4gICAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICAgICgqIFdlIGRpc2NvdmVyIGEgbmV3IG5vbmVtcHR5IHJvdyBbeCA6OiB4c10uIFRodXMsIHRoZSBuZXh0IGRpYWdvbmFsXG4gICAgICAgICAgICAgaXMgW3ggOjogaGVhZHNdOiB0aGlzIGRpYWdvbmFsIGJlZ2lucyB3aXRoIFt4XSBhbmQgY29udGludWVzIHdpdGhcbiAgICAgICAgICAgICB0aGUgZmlyc3QgZWxlbWVudCBvZiBldmVyeSByb3cgaW4gW3JlbWFpbmRlcnNdLiBJbiB0aGUgcmVjdXJzaXZlXG4gICAgICAgICAgICAgY2FsbCwgdGhlIGFyZ3VtZW50IFtyZW1haW5kZXJzXSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBbeHMgOjpcbiAgICAgICAgICAgICB0YWlsc10sIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSBvbmUgbW9yZSByZW1haW5pbmcgcm93LCBbeHNdLFxuICAgICAgICAgICAgIGFuZCB0aGF0IHdlIGtlZXAgdGhlIHRhaWxzIG9mIHRoZSBwcmUtZXhpc3RpbmcgcmVtYWluaW5nIHJvd3MuICopXG4gICAgICAgICAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgcmVtYWluZGVycyBpblxuICAgICAgICAgIENvbnMgKGNvbnMgeCBoZWFkcywgZGlhZ29uYWxzIChjb25zIHhzIHRhaWxzKSB4c3MpXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgICgqIFdlIGRpc2NvdmVyIGEgbmV3IGVtcHR5IHJvdy4gSW4gdGhpcyBjYXNlLCB0aGUgbmV3IGRpYWdvbmFsIGlzXG4gICAgICAgICAgICAganVzdCBbaGVhZHNdLCBhbmQgW3JlbWFpbmRlcnNdIGlzIGluc3RhbnRpYXRlZCB3aXRoIGp1c3QgW3RhaWxzXSxcbiAgICAgICAgICAgICBhcyB3ZSBkbyBub3QgaGF2ZSBvbmUgbW9yZSByZW1haW5pbmcgcm93LiAqKVxuICAgICAgICAgIGxldCBoZWFkcywgdGFpbHMgPSBwZWVsIHJlbWFpbmRlcnMgaW5cbiAgICAgICAgICBDb25zIChoZWFkcywgZGlhZ29uYWxzIHRhaWxzIHhzcylcbiAgICAgIGVuZFxuICB8IE5pbCAtPlxuICAgICAgKCogVGhlcmUgYXJlIG5vIG1vcmUgcm93cyB0byBiZSBkaXNjb3ZlcmVkLiBUaGVyZSByZW1haW5zIHRvIGV4aGF1c3RcbiAgICAgICAgIHRoZSByZW1haW5pbmcgcm93cy4gKilcbiAgICAgIHRyYW5zcG9zZSByZW1haW5kZXJzICgpXG5cbigqIElmIFt4c3NdIGlzIGEgbWF0cml4IChhIHNlcXVlbmNlIG9mIHJvd3MpLCB0aGVuIFtkaWFnb25hbHMgeHNzXSBpc1xuICAgdGhlIHNlcXVlbmNlIG9mIGl0cyBkaWFnb25hbHMuXG5cbiAgIFRoZSBmaXJzdCBkaWFnb25hbCBjb250YWlucyBqdXN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZVxuICAgZmlyc3Qgcm93LiBUaGUgc2Vjb25kIGRpYWdvbmFsIGNvbnRhaW5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZVxuICAgc2Vjb25kIHJvdyBhbmQgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBmaXJzdCByb3c7IGFuZCBzbyBvbi5cbiAgIFRoaXMga2luZCBvZiBkaWFnb25hbCBpcyBpbiBmYWN0IHNvbWV0aW1lcyBrbm93biBhcyBhbiBhbnRpZGlhZ29uYWwuXG5cbiAgIC0gRXZlcnkgZGlhZ29uYWwgaXMgYSBmaW5pdGUgc2VxdWVuY2UuXG4gICAtIFRoZSByb3dzIG9mIHRoZSBtYXRyaXggW3hzc10gYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC5cbiAgIC0gVGhlIG1hdHJpeCBbeHNzXSBpcyBub3QgcmVxdWlyZWQgdG8gYmUgZmluaXRlIChpbiBlaXRoZXIgZGlyZWN0aW9uKS5cbiAgIC0gVGhlIG1hdHJpeCBbeHNzXSBtdXN0IGJlIHBlcnNpc3RlbnQuICopXG5cbmxldCBkaWFnb25hbHMgeHNzID1cbiAgZGlhZ29uYWxzIGVtcHR5IHhzc1xuXG5sZXQgbWFwX3Byb2R1Y3QgZiB4cyB5cyA9XG4gIGNvbmNhdCAoZGlhZ29uYWxzIChcbiAgICBtYXAgKGZ1biB4IC0+XG4gICAgICBtYXAgKGZ1biB5IC0+XG4gICAgICAgIGYgeCB5XG4gICAgICApIHlzXG4gICAgKSB4c1xuICApKVxuXG5sZXQgcHJvZHVjdCB4cyB5cyA9XG4gIG1hcF9wcm9kdWN0IChmdW4geCB5IC0+ICh4LCB5KSkgeHMgeXNcblxubGV0IG9mX2Rpc3BlbnNlciBpdCA9XG4gIGxldCByZWMgYyAoKSA9XG4gICAgbWF0Y2ggaXQoKSB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICAgIE5pbFxuICAgIHwgU29tZSB4IC0+XG4gICAgICAgIENvbnMgKHgsIGMpXG4gIGluXG4gIGNcblxubGV0IHRvX2Rpc3BlbnNlciB4cyA9XG4gIGxldCBzID0gcmVmIHhzIGluXG4gIGZ1biAoKSAtPlxuICAgIG1hdGNoICghcykoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTm9uZVxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIHMgOj0geHM7XG4gICAgICAgIFNvbWUgeFxuXG5cblxubGV0IHJlYyBpbnRzIGkgKCkgPVxuICBDb25zIChpLCBpbnRzIChpICsgMSkpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgJ2EgdCA9ICdhIG9wdGlvbiA9IE5vbmUgfCBTb21lIG9mICdhXG5cbmxldCBub25lID0gTm9uZVxubGV0IHNvbWUgdiA9IFNvbWUgdlxubGV0IHZhbHVlIG8gfmRlZmF1bHQgPSBtYXRjaCBvIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+IGRlZmF1bHRcbmxldCBnZXQgPSBmdW5jdGlvbiBTb21lIHYgLT4gdiB8IE5vbmUgLT4gaW52YWxpZF9hcmcgXCJvcHRpb24gaXMgTm9uZVwiXG5sZXQgYmluZCBvIGYgPSBtYXRjaCBvIHdpdGggTm9uZSAtPiBOb25lIHwgU29tZSB2IC0+IGYgdlxubGV0IGpvaW4gPSBmdW5jdGlvbiBTb21lIG8gLT4gbyB8IE5vbmUgLT4gTm9uZVxubGV0IG1hcCBmIG8gPSBtYXRjaCBvIHdpdGggTm9uZSAtPiBOb25lIHwgU29tZSB2IC0+IFNvbWUgKGYgdilcbmxldCBmb2xkIH5ub25lIH5zb21lID0gZnVuY3Rpb24gU29tZSB2IC0+IHNvbWUgdiB8IE5vbmUgLT4gbm9uZVxubGV0IGl0ZXIgZiA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBmIHYgfCBOb25lIC0+ICgpXG5sZXQgaXNfbm9uZSA9IGZ1bmN0aW9uIE5vbmUgLT4gdHJ1ZSB8IFNvbWUgXyAtPiBmYWxzZVxubGV0IGlzX3NvbWUgPSBmdW5jdGlvbiBOb25lIC0+IGZhbHNlIHwgU29tZSBfIC0+IHRydWVcblxubGV0IGVxdWFsIGVxIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBlcSB2MCB2MVxufCBOb25lLCBOb25lIC0+IHRydWVcbnwgXyAtPiBmYWxzZVxuXG5sZXQgY29tcGFyZSBjbXAgbzAgbzEgPSBtYXRjaCBvMCwgbzEgd2l0aFxufCBTb21lIHYwLCBTb21lIHYxIC0+IGNtcCB2MCB2MVxufCBOb25lLCBOb25lIC0+IDBcbnwgTm9uZSwgU29tZSBfIC0+IC0xXG58IFNvbWUgXywgTm9uZSAtPiAxXG5cbmxldCB0b19yZXN1bHQgfm5vbmUgPSBmdW5jdGlvbiBOb25lIC0+IEVycm9yIG5vbmUgfCBTb21lIHYgLT4gT2sgdlxubGV0IHRvX2xpc3QgPSBmdW5jdGlvbiBOb25lIC0+IFtdIHwgU29tZSB2IC0+IFt2XVxubGV0IHRvX3NlcSA9IGZ1bmN0aW9uIE5vbmUgLT4gU2VxLmVtcHR5IHwgU29tZSB2IC0+IFNlcS5yZXR1cm4gdlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlKSByZXN1bHQgPSBPayBvZiAnYSB8IEVycm9yIG9mICdlXG5cbmxldCBvayB2ID0gT2sgdlxubGV0IGVycm9yIGUgPSBFcnJvciBlXG5sZXQgdmFsdWUgciB+ZGVmYXVsdCA9IG1hdGNoIHIgd2l0aCBPayB2IC0+IHYgfCBFcnJvciBfIC0+IGRlZmF1bHRcbmxldCBnZXRfb2sgPSBmdW5jdGlvbiBPayB2IC0+IHYgfCBFcnJvciBfIC0+IGludmFsaWRfYXJnIFwicmVzdWx0IGlzIEVycm9yIF9cIlxubGV0IGdldF9lcnJvciA9IGZ1bmN0aW9uIEVycm9yIGUgLT4gZSB8IE9rIF8gLT4gaW52YWxpZF9hcmcgXCJyZXN1bHQgaXMgT2sgX1wiXG5sZXQgYmluZCByIGYgPSBtYXRjaCByIHdpdGggT2sgdiAtPiBmIHYgfCBFcnJvciBfIGFzIGUgLT4gZVxubGV0IGpvaW4gPSBmdW5jdGlvbiBPayByIC0+IHIgfCBFcnJvciBfIGFzIGUgLT4gZVxubGV0IG1hcCBmID0gZnVuY3Rpb24gT2sgdiAtPiBPayAoZiB2KSB8IEVycm9yIF8gYXMgZSAtPiBlXG5sZXQgbWFwX2Vycm9yIGYgPSBmdW5jdGlvbiBFcnJvciBlIC0+IEVycm9yIChmIGUpIHwgT2sgXyBhcyB2IC0+IHZcbmxldCBmb2xkIH5vayB+ZXJyb3IgPSBmdW5jdGlvbiBPayB2IC0+IG9rIHYgfCBFcnJvciBlIC0+IGVycm9yIGVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBPayB2IC0+IGYgdiB8IEVycm9yIF8gLT4gKClcbmxldCBpdGVyX2Vycm9yIGYgPSBmdW5jdGlvbiBFcnJvciBlIC0+IGYgZSB8IE9rIF8gLT4gKClcbmxldCBpc19vayA9IGZ1bmN0aW9uIE9rIF8gLT4gdHJ1ZSB8IEVycm9yIF8gLT4gZmFsc2VcbmxldCBpc19lcnJvciA9IGZ1bmN0aW9uIEVycm9yIF8gLT4gdHJ1ZSB8IE9rIF8gLT4gZmFsc2VcblxubGV0IGVxdWFsIH5vayB+ZXJyb3IgcjAgcjEgPSBtYXRjaCByMCwgcjEgd2l0aFxufCBPayB2MCwgT2sgdjEgLT4gb2sgdjAgdjFcbnwgRXJyb3IgZTAsIEVycm9yIGUxIC0+IGVycm9yIGUwIGUxXG58IF8sIF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgfm9rIH5lcnJvciByMCByMSA9IG1hdGNoIHIwLCByMSB3aXRoXG58IE9rIHYwLCBPayB2MSAtPiBvayB2MCB2MVxufCBFcnJvciBlMCwgRXJyb3IgZTEgLT4gZXJyb3IgZTAgZTFcbnwgT2sgXywgRXJyb3IgXyAtPiAtMVxufCBFcnJvciBfLCBPayBfIC0+IDFcblxubGV0IHRvX29wdGlvbiA9IGZ1bmN0aW9uIE9rIHYgLT4gU29tZSB2IHwgRXJyb3IgXyAtPiBOb25lXG5sZXQgdG9fbGlzdCA9IGZ1bmN0aW9uIE9rIHYgLT4gW3ZdIHwgRXJyb3IgXyAtPiBbXVxubGV0IHRvX3NlcSA9IGZ1bmN0aW9uIE9rIHYgLT4gU2VxLnJldHVybiB2IHwgRXJyb3IgXyAtPiBTZXEuZW1wdHlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gYm9vbCA9IGZhbHNlIHwgdHJ1ZVxuXG5leHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5leHRlcm5hbCAoIHx8ICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG5sZXQgZXF1YWwgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGJvb2wgLT4gYm9vbCAtPiBpbnQgPSBTdGRsaWIuY29tcGFyZVxuZXh0ZXJuYWwgdG9faW50IDogYm9vbCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5sZXQgdG9fZmxvYXQgPSBmdW5jdGlvbiBmYWxzZSAtPiAwLiB8IHRydWUgLT4gMS5cblxuKCpcbmxldCBvZl9zdHJpbmcgPSBmdW5jdGlvblxufCBcImZhbHNlXCIgLT4gU29tZSBmYWxzZVxufCBcInRydWVcIiAtPiBTb21lIHRydWVcbnwgXyAtPiBOb25lXG4qKVxuXG5sZXQgdG9fc3RyaW5nID0gZnVuY3Rpb24gZmFsc2UgLT4gXCJmYWxzZVwiIHwgdHJ1ZSAtPiBcInRydWVcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDaGFyYWN0ZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBjb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaHI6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgY2hyIG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJDaGFyLmNoclwiIGVsc2UgdW5zYWZlX2NociBuXG5cbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZTogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBieXRlc191bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuXG5sZXQgZXNjYXBlZCA9IGZ1bmN0aW9uXG4gIHwgJ1xcJycgLT4gXCJcXFxcJ1wiXG4gIHwgJ1xcXFwnIC0+IFwiXFxcXFxcXFxcIlxuICB8ICdcXG4nIC0+IFwiXFxcXG5cIlxuICB8ICdcXHQnIC0+IFwiXFxcXHRcIlxuICB8ICdcXHInIC0+IFwiXFxcXHJcIlxuICB8ICdcXGInIC0+IFwiXFxcXGJcIlxuICB8ICcgJyAuLiAnficgYXMgYyAtPlxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgMSBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgYztcbiAgICAgIHVuc2FmZV90b19zdHJpbmcgc1xuICB8IGMgLT5cbiAgICAgIGxldCBuID0gY29kZSBjIGluXG4gICAgICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSA0IGluXG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMCAnXFxcXCc7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMSAodW5zYWZlX2NociAoNDggKyBuIC8gMTAwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMiAodW5zYWZlX2NociAoNDggKyAobiAvIDEwKSBtb2QgMTApKTtcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAzICh1bnNhZmVfY2hyICg0OCArIG4gbW9kIDEwKSk7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcblxubGV0IGxvd2VyY2FzZV9hc2NpaSA9IGZ1bmN0aW9uXG4gIHwgJ0EnIC4uICdaJyBhcyBjIC0+IHVuc2FmZV9jaHIoY29kZSBjICsgMzIpXG4gIHwgYyAtPiBjXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyAtIDMyKVxuICB8IGMgLT4gY1xuXG50eXBlIHQgPSBjaGFyXG5cbmxldCBjb21wYXJlIGMxIGMyID0gY29kZSBjMSAtIGNvZGUgYzJcbmxldCBlcXVhbCAoYzE6IHQpIChjMjogdCkgPSBjb21wYXJlIGMxIGMyID0gMFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBEYW5pZWwgQy4gQnVlbnpsaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5cbmxldCBlcnJfbm9fcHJlZCA9IFwiVSswMDAwIGhhcyBubyBwcmVkZWNlc3NvclwiXG5sZXQgZXJyX25vX3N1Y2MgPSBcIlUrMTBGRkZGIGhhcyBubyBzdWNjZXNzb3JcIlxubGV0IGVycl9ub3Rfc3YgaSA9IGZvcm1hdF9pbnQgXCIlWFwiIGkgXiBcIiBpcyBub3QgYW4gVW5pY29kZSBzY2FsYXIgdmFsdWVcIlxubGV0IGVycl9ub3RfbGF0aW4xIHUgPSBcIlUrXCIgXiBmb3JtYXRfaW50IFwiJTA0WFwiIHUgXiBcIiBpcyBub3QgYSBsYXRpbjEgY2hhcmFjdGVyXCJcblxudHlwZSB0ID0gaW50XG5cbmxldCBtaW4gPSAweDAwMDBcbmxldCBtYXggPSAweDEwRkZGRlxubGV0IGxvX2JvdW5kID0gMHhEN0ZGXG5sZXQgaGlfYm91bmQgPSAweEUwMDBcblxubGV0IGJvbSA9IDB4RkVGRlxubGV0IHJlcCA9IDB4RkZGRFxuXG5sZXQgc3VjYyB1ID1cbiAgaWYgdSA9IGxvX2JvdW5kIHRoZW4gaGlfYm91bmQgZWxzZVxuICBpZiB1ID0gbWF4IHRoZW4gaW52YWxpZF9hcmcgZXJyX25vX3N1Y2MgZWxzZVxuICB1ICsgMVxuXG5sZXQgcHJlZCB1ID1cbiAgaWYgdSA9IGhpX2JvdW5kIHRoZW4gbG9fYm91bmQgZWxzZVxuICBpZiB1ID0gbWluIHRoZW4gaW52YWxpZF9hcmcgZXJyX25vX3ByZWQgZWxzZVxuICB1IC0gMVxuXG5sZXQgaXNfdmFsaWQgaSA9IChtaW4gPD0gaSAmJiBpIDw9IGxvX2JvdW5kKSB8fCAoaGlfYm91bmQgPD0gaSAmJiBpIDw9IG1heClcbmxldCBvZl9pbnQgaSA9IGlmIGlzX3ZhbGlkIGkgdGhlbiBpIGVsc2UgaW52YWxpZF9hcmcgKGVycl9ub3Rfc3YgaSlcbmV4dGVybmFsIHVuc2FmZV9vZl9pbnQgOiBpbnQgLT4gdCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHRvX2ludCA6IHQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgaXNfY2hhciB1ID0gdSA8IDI1NlxubGV0IG9mX2NoYXIgYyA9IENoYXIuY29kZSBjXG5sZXQgdG9fY2hhciB1ID1cbiAgaWYgdSA+IDI1NSB0aGVuIGludmFsaWRfYXJnIChlcnJfbm90X2xhdGluMSB1KSBlbHNlXG4gIENoYXIudW5zYWZlX2NociB1XG5cbmxldCB1bnNhZmVfdG9fY2hhciA9IENoYXIudW5zYWZlX2NoclxuXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgaGFzaCA9IHRvX2ludFxuXG4oKiBVVEYgY29kZWNzIHRvb2xzICopXG5cbnR5cGUgdXRmX2RlY29kZSA9IGludFxuKCogVGhpcyBpcyBhbiBpbnQgWzB4RFVVVVVVVV0gZGVjb21wb3NlZCBhcyBmb2xsb3dzOlxuICAgLSBbRF0gaXMgZm91ciBiaXRzIGZvciBkZWNvZGUgaW5mb3JtYXRpb24sIHRoZSBoaWdoZXN0IGJpdCBpcyBzZXQgaWYgdGhlXG4gICAgIGRlY29kZSBpcyB2YWxpZC4gVGhlIHRocmVlIGxvd2VyIGJpdHMgaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50c1xuICAgICBmcm9tIHRoZSBzb3VyY2UgdGhhdCB3ZXJlIGNvbnN1bWVkIGJ5IHRoZSBkZWNvZGUuXG4gICAtIFtVVVVVVVVdIGlzIHRoZSBkZWNvZGVkIFVuaWNvZGUgY2hhcmFjdGVyIG9yIHRoZSBVbmljb2RlIHJlcGxhY2VtZW50XG4gICAgIGNoYXJhY3RlciBVK0ZGRkQgaWYgZm9yIGludmFsaWQgZGVjb2Rlcy4gKilcblxubGV0IHZhbGlkX2JpdCA9IDI3XG5sZXQgZGVjb2RlX2JpdHMgPSAyNFxuXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pc192YWxpZCBkID0gKGQgbHNyIHZhbGlkX2JpdCkgPSAxXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9sZW5ndGggZCA9IChkIGxzciBkZWNvZGVfYml0cykgbGFuZCAwYjExMVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfdWNoYXIgZCA9IHVuc2FmZV9vZl9pbnQgKGQgbGFuZCAweEZGRkZGRilcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlIG4gdSA9ICgoOCBsb3IgbikgbHNsIGRlY29kZV9iaXRzKSBsb3IgKHRvX2ludCB1KVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfaW52YWxpZCBuID0gKG4gbHNsIGRlY29kZV9iaXRzKSBsb3IgcmVwXG5cbmxldCB1dGZfOF9ieXRlX2xlbmd0aCB1ID0gbWF0Y2ggdG9faW50IHUgd2l0aFxufCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG58IHUgd2hlbiB1IDw9IDB4MDA3RiAtPiAxXG58IHUgd2hlbiB1IDw9IDB4MDdGRiAtPiAyXG58IHUgd2hlbiB1IDw9IDB4RkZGRiAtPiAzXG58IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+IDRcbnwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHV0Zl8xNl9ieXRlX2xlbmd0aCB1ID0gbWF0Y2ggdG9faW50IHUgd2l0aFxufCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG58IHUgd2hlbiB1IDw9IDB4RkZGRiAtPiAyXG58IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+IDRcbnwgXyAtPiBhc3NlcnQgZmFsc2VcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQW4gYWxpYXMgZm9yIHRoZSB0eXBlIG9mIGxpc3RzLiAqKVxudHlwZSAnYSB0ID0gJ2EgbGlzdCA9IFtdIHwgKDo6KSBvZiAnYSAqICdhIGxpc3RcblxuKCogTGlzdCBvcGVyYXRpb25zICopXG5cbmxldCByZWMgbGVuZ3RoX2F1eCBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGxlblxuICB8IF86OmwgLT4gbGVuZ3RoX2F1eCAobGVuICsgMSkgbFxuXG5sZXQgbGVuZ3RoIGwgPSBsZW5ndGhfYXV4IDAgbFxuXG5sZXQgY29ucyBhIGwgPSBhOjpsXG5cbmxldCBoZCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFpbHdpdGggXCJoZFwiXG4gIHwgYTo6XyAtPiBhXG5cbmxldCB0bCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFpbHdpdGggXCJ0bFwiXG4gIHwgXzo6bCAtPiBsXG5cbmxldCBudGggbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IGZhaWx3aXRoIFwibnRoXCJcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBhIGVsc2UgbnRoX2F1eCBsIChuLTEpXG4gIGluIG50aF9hdXggbCBuXG5cbmxldCBudGhfb3B0IGwgbiA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0Lm50aFwiIGVsc2VcbiAgbGV0IHJlYyBudGhfYXV4IGwgbiA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBOb25lXG4gICAgfCBhOjpsIC0+IGlmIG4gPSAwIHRoZW4gU29tZSBhIGVsc2UgbnRoX2F1eCBsIChuLTEpXG4gIGluIG50aF9hdXggbCBuXG5cbmxldCBhcHBlbmQgPSAoQClcblxubGV0IHJlYyByZXZfYXBwZW5kIGwxIGwyID1cbiAgbWF0Y2ggbDEgd2l0aFxuICAgIFtdIC0+IGwyXG4gIHwgYSA6OiBsIC0+IHJldl9hcHBlbmQgbCAoYSA6OiBsMilcblxubGV0IHJldiBsID0gcmV2X2FwcGVuZCBsIFtdXG5cbmxldCByZWMgaW5pdF90YWlscmVjX2F1eCBhY2MgaSBuIGYgPVxuICBpZiBpID49IG4gdGhlbiBhY2NcbiAgZWxzZSBpbml0X3RhaWxyZWNfYXV4IChmIGkgOjogYWNjKSAoaSsxKSBuIGZcblxubGV0IHJlYyBpbml0X2F1eCBpIG4gZiA9XG4gIGlmIGkgPj0gbiB0aGVuIFtdXG4gIGVsc2VcbiAgICBsZXQgciA9IGYgaSBpblxuICAgIHIgOjogaW5pdF9hdXggKGkrMSkgbiBmXG5cbmxldCByZXZfaW5pdF90aHJlc2hvbGQgPVxuICBtYXRjaCBTeXMuYmFja2VuZF90eXBlIHdpdGhcbiAgfCBTeXMuTmF0aXZlIHwgU3lzLkJ5dGVjb2RlIC0+IDEwXzAwMFxuICAoKiBXZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzdGFjaywgYmV0dGVyIGJlIHNhZmUgYW5kIGFzc3VtZSBpdCdzXG4gICAgIHNtYWxsLiAqKVxuICB8IFN5cy5PdGhlciBfIC0+IDUwXG5cbmxldCBpbml0IGxlbiBmID1cbiAgaWYgbGVuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5pbml0XCIgZWxzZVxuICBpZiBsZW4gPiByZXZfaW5pdF90aHJlc2hvbGQgdGhlbiByZXYgKGluaXRfdGFpbHJlY19hdXggW10gMCBsZW4gZilcbiAgZWxzZSBpbml0X2F1eCAwIGxlbiBmXG5cbmxldCByZWMgZmxhdHRlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBsOjpyIC0+IGwgQCBmbGF0dGVuIHJcblxubGV0IGNvbmNhdCA9IGZsYXR0ZW5cblxubGV0IHJlYyBtYXAgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBhOjpsIC0+IGxldCByID0gZiBhIGluIHIgOjogbWFwIGYgbFxuXG5sZXQgcmVjIG1hcGkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IGE6OmwgLT4gbGV0IHIgPSBmIGkgYSBpbiByIDo6IG1hcGkgKGkgKyAxKSBmIGxcblxubGV0IG1hcGkgZiBsID0gbWFwaSAwIGYgbFxuXG5sZXQgcmV2X21hcCBmIGwgPVxuICBsZXQgcmVjIHJtYXBfZiBhY2N1ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY3VcbiAgICB8IGE6OmwgLT4gcm1hcF9mIChmIGEgOjogYWNjdSkgbFxuICBpblxuICBybWFwX2YgW10gbFxuXG5cbmxldCByZWMgaXRlciBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBhOyBpdGVyIGYgbFxuXG5sZXQgcmVjIGl0ZXJpIGkgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gKClcbiAgfCBhOjpsIC0+IGYgaSBhOyBpdGVyaSAoaSArIDEpIGYgbFxuXG5sZXQgaXRlcmkgZiBsID0gaXRlcmkgMCBmIGxcblxubGV0IHJlYyBmb2xkX2xlZnQgZiBhY2N1IGwgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmb2xkX2xlZnQgZiAoZiBhY2N1IGEpIGxcblxubGV0IHJlYyBmb2xkX3JpZ2h0IGYgbCBhY2N1ID1cbiAgbWF0Y2ggbCB3aXRoXG4gICAgW10gLT4gYWNjdVxuICB8IGE6OmwgLT4gZiBhIChmb2xkX3JpZ2h0IGYgbCBhY2N1KVxuXG5sZXQgcmVjIG1hcDIgZiBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gbGV0IHIgPSBmIGExIGEyIGluIHIgOjogbWFwMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5tYXAyXCJcblxubGV0IHJldl9tYXAyIGYgbDEgbDIgPVxuICBsZXQgcmVjIHJtYXAyX2YgYWNjdSBsMSBsMiA9XG4gICAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIHwgKFtdLCBbXSkgLT4gYWNjdVxuICAgIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBybWFwMl9mIChmIGExIGEyIDo6IGFjY3UpIGwxIGwyXG4gICAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LnJldl9tYXAyXCJcbiAgaW5cbiAgcm1hcDJfZiBbXSBsMSBsMlxuXG5cbmxldCByZWMgaXRlcjIgZiBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiAoKVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMjsgaXRlcjIgZiBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuaXRlcjJcIlxuXG5sZXQgcmVjIGZvbGRfbGVmdDIgZiBhY2N1IGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGFjY3VcbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IGZvbGRfbGVmdDIgZiAoZiBhY2N1IGExIGEyKSBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9sZWZ0MlwiXG5cbmxldCByZWMgZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1ID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGFjY3VcbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IGYgYTEgYTIgKGZvbGRfcmlnaHQyIGYgbDEgbDIgYWNjdSlcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LmZvbGRfcmlnaHQyXCJcblxubGV0IHJlYyBmb3JfYWxsIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IHRydWVcbiAgfCBhOjpsIC0+IHAgYSAmJiBmb3JfYWxsIHAgbFxuXG5sZXQgcmVjIGV4aXN0cyBwID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWxzZVxuICB8IGE6OmwgLT4gcCBhIHx8IGV4aXN0cyBwIGxcblxubGV0IHJlYyBmb3JfYWxsMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IHRydWVcbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHAgYTEgYTIgJiYgZm9yX2FsbDIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9yX2FsbDJcIlxuXG5sZXQgcmVjIGV4aXN0czIgcCBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBmYWxzZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiB8fCBleGlzdHMyIHAgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LmV4aXN0czJcIlxuXG5sZXQgcmVjIG1lbSB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWxzZVxuICB8IGE6OmwgLT4gY29tcGFyZSBhIHggPSAwIHx8IG1lbSB4IGxcblxubGV0IHJlYyBtZW1xIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBhID09IHggfHwgbWVtcSB4IGxcblxubGV0IHJlYyBhc3NvYyB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCAoYSxiKTo6bCAtPiBpZiBjb21wYXJlIGEgeCA9IDAgdGhlbiBiIGVsc2UgYXNzb2MgeCBsXG5cbmxldCByZWMgYXNzb2Nfb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBjb21wYXJlIGEgeCA9IDAgdGhlbiBTb21lIGIgZWxzZSBhc3NvY19vcHQgeCBsXG5cbmxldCByZWMgYXNzcSB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBiIGVsc2UgYXNzcSB4IGxcblxubGV0IHJlYyBhc3NxX29wdCB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBOb25lXG4gIHwgKGEsYik6OmwgLT4gaWYgYSA9PSB4IHRoZW4gU29tZSBiIGVsc2UgYXNzcV9vcHQgeCBsXG5cbmxldCByZWMgbWVtX2Fzc29jIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gY29tcGFyZSBhIHggPSAwIHx8IG1lbV9hc3NvYyB4IGxcblxubGV0IHJlYyBtZW1fYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBmYWxzZVxuICB8IChhLCBfKSA6OiBsIC0+IGEgPT0geCB8fCBtZW1fYXNzcSB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCAoYSwgXyBhcyBwYWlyKSA6OiBsIC0+XG4gICAgICBpZiBjb21wYXJlIGEgeCA9IDAgdGhlbiBsIGVsc2UgcGFpciA6OiByZW1vdmVfYXNzb2MgeCBsXG5cbmxldCByZWMgcmVtb3ZlX2Fzc3EgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCAoYSwgXyBhcyBwYWlyKSA6OiBsIC0+IGlmIGEgPT0geCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NxIHggbFxuXG5sZXQgcmVjIGZpbmQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHggZWxzZSBmaW5kIHAgbFxuXG5sZXQgcmVjIGZpbmRfb3B0IHAgPSBmdW5jdGlvblxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4gU29tZSB4IGVsc2UgZmluZF9vcHQgcCBsXG5cbmxldCByZWMgZmluZF9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPlxuICAgICBiZWdpbiBtYXRjaCBmIHggd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPiByZXN1bHRcbiAgICAgICB8IE5vbmUgLT4gZmluZF9tYXAgZiBsXG4gICAgIGVuZFxuXG5sZXQgZmluZF9hbGwgcCA9XG4gIGxldCByZWMgZmluZCBhY2N1ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByZXYgYWNjdVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBmaW5kICh4IDo6IGFjY3UpIGwgZWxzZSBmaW5kIGFjY3UgbCBpblxuICBmaW5kIFtdXG5cbmxldCBmaWx0ZXIgPSBmaW5kX2FsbFxuXG5sZXQgZmlsdGVyaSBwIGwgPVxuICBsZXQgcmVjIGF1eCBpIGFjYyA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gcmV2IGFjY1xuICB8IHg6OmwgLT4gYXV4IChpICsgMSkgKGlmIHAgaSB4IHRoZW4geDo6YWNjIGVsc2UgYWNjKSBsXG4gIGluXG4gIGF1eCAwIFtdIGxcblxubGV0IGZpbHRlcl9tYXAgZiA9XG4gIGxldCByZWMgYXV4IGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gcmV2IGFjY3VcbiAgICB8IHggOjogbCAtPlxuICAgICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgICB8IE5vbmUgLT4gYXV4IGFjY3UgbFxuICAgICAgICB8IFNvbWUgdiAtPiBhdXggKHYgOjogYWNjdSkgbFxuICBpblxuICBhdXggW11cblxubGV0IGNvbmNhdF9tYXAgZiBsID1cbiAgbGV0IHJlYyBhdXggZiBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gcmV2IGFjY1xuICAgIHwgeCA6OiBsIC0+XG4gICAgICAgbGV0IHhzID0gZiB4IGluXG4gICAgICAgYXV4IGYgKHJldl9hcHBlbmQgeHMgYWNjKSBsXG4gIGluIGF1eCBmIFtdIGxcblxubGV0IGZvbGRfbGVmdF9tYXAgZiBhY2N1IGwgPVxuICBsZXQgcmVjIGF1eCBhY2N1IGxfYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1LCByZXYgbF9hY2N1XG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICAgbGV0IGFjY3UsIHggPSBmIGFjY3UgeCBpblxuICAgICAgICBhdXggYWNjdSAoeCA6OiBsX2FjY3UpIGwgaW5cbiAgYXV4IGFjY3UgW10gbFxuXG5sZXQgcGFydGl0aW9uIHAgbCA9XG4gIGxldCByZWMgcGFydCB5ZXMgbm8gPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgeWVzLCByZXYgbm8pXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIHBhcnQgKHggOjogeWVzKSBubyBsIGVsc2UgcGFydCB5ZXMgKHggOjogbm8pIGwgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCBwYXJ0aXRpb25fbWFwIHAgbCA9XG4gIGxldCByZWMgcGFydCBsZWZ0IHJpZ2h0ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAocmV2IGxlZnQsIHJldiByaWdodClcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggcCB4IHdpdGhcbiAgICAgICB8IEVpdGhlci5MZWZ0IHYgLT4gcGFydCAodiA6OiBsZWZ0KSByaWdodCBsXG4gICAgICAgfCBFaXRoZXIuUmlnaHQgdiAtPiBwYXJ0IGxlZnQgKHYgOjogcmlnaHQpIGxcbiAgICAgZW5kXG4gIGluXG4gIHBhcnQgW10gW10gbFxuXG5sZXQgcmVjIHNwbGl0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoW10sIFtdKVxuICB8ICh4LHkpOjpsIC0+XG4gICAgICBsZXQgKHJ4LCByeSkgPSBzcGxpdCBsIGluICh4OjpyeCwgeTo6cnkpXG5cbmxldCByZWMgY29tYmluZSBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBbXVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gKGExLCBhMikgOjogY29tYmluZSBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuY29tYmluZVwiXG5cbigqKiBzb3J0aW5nICopXG5cbmxldCByZWMgbWVyZ2UgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgbDIgLT4gbDJcbiAgfCBsMSwgW10gLT4gbDFcbiAgfCBoMSA6OiB0MSwgaDIgOjogdDIgLT5cbiAgICAgIGlmIGNtcCBoMSBoMiA8PSAwXG4gICAgICB0aGVuIGgxIDo6IG1lcmdlIGNtcCB0MSBsMlxuICAgICAgZWxzZSBoMiA6OiBtZXJnZSBjbXAgbDEgdDJcblxuXG5sZXQgc3RhYmxlX3NvcnQgY21wIGwgPVxuICBsZXQgcmVjIHJldl9tZXJnZSBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgaWYgY21wIGgxIGgyID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyIDw9IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuXG4gICAgICAgICAgICBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPD0gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDIgeDMgPD0gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHJldl9zb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHJldl9zb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2VfcmV2IHMxIHMyIFtdLCB0bClcbiAgYW5kIHJldl9zb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9IGlmIGNtcCB4MSB4MiA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBpZiBjbXAgeDEgeDIgPiAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA+IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgc29ydCA9IHN0YWJsZV9zb3J0XG5sZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuKCogTm90ZTogb24gYSBsaXN0IG9mIGxlbmd0aCBiZXR3ZWVuIGFib3V0IDEwMDAwMCAoZGVwZW5kaW5nIG9uIHRoZSBtaW5vclxuICAgaGVhcCBzaXplIGFuZCB0aGUgdHlwZSBvZiB0aGUgbGlzdCkgYW5kIFN5cy5tYXhfYXJyYXlfc2l6ZSwgaXQgaXNcbiAgIGFjdHVhbGx5IGZhc3RlciB0byB1c2UgdGhlIGZvbGxvd2luZywgYnV0IGl0IG1pZ2h0IGFsc28gdXNlIG1vcmUgbWVtb3J5XG4gICBiZWNhdXNlIHRoZSBhcmd1bWVudCBsaXN0IGNhbm5vdCBiZSBkZWFsbG9jYXRlZCBpbmNyZW1lbnRhbGx5LlxuXG4gICBBbHNvLCB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiB0aGlzIGNvZGUgb3IgaW4gdGhlXG4gICBpbXBsZW1lbnRhdGlvbiBvZiBvYmpfdHJ1bmNhdGUuXG5cbmV4dGVybmFsIG9ial90cnVuY2F0ZSA6ICdhIGFycmF5IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX29ial90cnVuY2F0ZVwiXG5cbmxldCBhcnJheV90b19saXN0X2luX3BsYWNlIGEgPVxuICBsZXQgbCA9IEFycmF5Lmxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBhY2N1IG4gcCA9XG4gICAgaWYgcCA8PSAwIHRoZW4gYWNjdSBlbHNlIGJlZ2luXG4gICAgICBpZiBwID0gbiB0aGVuIGJlZ2luXG4gICAgICAgIG9ial90cnVuY2F0ZSBhIHA7XG4gICAgICAgIGxvb3AgKGEuKHAtMSkgOjogYWNjdSkgKG4tMTAwMCkgKHAtMSlcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIGxvb3AgKGEuKHAtMSkgOjogYWNjdSkgbiAocC0xKVxuICAgICAgZW5kXG4gICAgZW5kXG4gIGluXG4gIGxvb3AgW10gKGwtMTAwMCkgbFxuXG5cbmxldCBzdGFibGVfc29ydCBjbXAgbCA9XG4gIGxldCBhID0gQXJyYXkub2ZfbGlzdCBsIGluXG4gIEFycmF5LnN0YWJsZV9zb3J0IGNtcCBhO1xuICBhcnJheV90b19saXN0X2luX3BsYWNlIGFcblxuKilcblxuXG4oKiogc29ydGluZyArIHJlbW92aW5nIGR1cGxpY2F0ZXMgKilcblxubGV0IHNvcnRfdW5pcSBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZSB0MSB0MiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2UgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZSBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgcmV2X21lcmdlX3JldiBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgbGV0IGMgPSBjbXAgaDEgaDIgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjID4gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZV9yZXYgdDEgbDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIHJldl9tZXJnZV9yZXYgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHNvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxXSBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDJdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzXSBlbHNlIFt4MzsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgxOyB4Ml1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MyBpblxuICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgYyA9IGNtcCB4MiB4MyBpblxuICAgICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSBzb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2UgczEgczIgW10sIHRsKVxuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIGwgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIGwgZWxzZSBmc3QgKHNvcnQgbGVuIGwpXG5cblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aHMgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgXyA6OiBsMSwgXyA6OiBsMiAtPiBjb21wYXJlX2xlbmd0aHMgbDEgbDJcblxubGV0IHJlYyBjb21wYXJlX2xlbmd0aF93aXRoIGwgbiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgaWYgbiA9IDAgdGhlbiAwIGVsc2VcbiAgICAgIGlmIG4gPiAwIHRoZW4gLTEgZWxzZSAxXG4gIHwgXyA6OiBsIC0+XG4gICAgaWYgbiA8PSAwIHRoZW4gMSBlbHNlXG4gICAgICBjb21wYXJlX2xlbmd0aF93aXRoIGwgKG4tMSlcblxuKCoqIHsxIENvbXBhcmlzb259ICopXG5cbigqIE5vdGU6IHdlIGFyZSAqbm90KiBzaG9ydGN1dHRpbmcgdGhlIGxpc3QgYnkgdXNpbmdcbiAgIFtMaXN0LmNvbXBhcmVfbGVuZ3Roc10gZmlyc3Q7IHRoaXMgbWF5IGJlIHNsb3dlciBvbiBsb25nIGxpc3RzXG4gICBpbW1lZGlhdGVseSBzdGFydCB3aXRoIGRpc3RpbmN0IGVsZW1lbnRzLiBJdCBpcyBhbHNvIGluY29ycmVjdCBmb3JcbiAgIFtjb21wYXJlXSBiZWxvdywgYW5kIGl0IGlzIGJldHRlciAocHJpbmNpcGxlIG9mIGxlYXN0IHN1cnByaXNlKSB0b1xuICAgdXNlIHRoZSBzYW1lIGFwcHJvYWNoIGZvciBib3RoIGZ1bmN0aW9ucy4gKilcbmxldCByZWMgZXF1YWwgZXEgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiB0cnVlXG4gIHwgW10sIF86Ol8gfCBfOjpfLCBbXSAtPiBmYWxzZVxuICB8IGExOjpsMSwgYTI6OmwyIC0+IGVxIGExIGEyICYmIGVxdWFsIGVxIGwxIGwyXG5cbmxldCByZWMgY29tcGFyZSBjbXAgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF86Ol8gLT4gLTFcbiAgfCBfOjpfLCBbXSAtPiAxXG4gIHwgYTE6OmwxLCBhMjo6bDIgLT5cbiAgICBsZXQgYyA9IGNtcCBhMSBhMiBpblxuICAgIGlmIGMgPD4gMCB0aGVuIGNcbiAgICBlbHNlIGNvbXBhcmUgY21wIGwxIGwyXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgbCA9XG4gIGxldCByZWMgYXV4IGwgKCkgPSBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IFNlcS5OaWxcbiAgICB8IHggOjogdGFpbCAtPiBTZXEuQ29ucyAoeCwgYXV4IHRhaWwpXG4gIGluXG4gIGF1eCBsXG5cbmxldCBvZl9zZXEgc2VxID1cbiAgbGV0IHJlYyBkaXJlY3QgZGVwdGggc2VxIDogXyBsaXN0ID1cbiAgICBpZiBkZXB0aD0wXG4gICAgdGhlblxuICAgICAgU2VxLmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IHg6OmFjYykgW10gc2VxXG4gICAgICB8PiByZXYgKCogdGFpbHJlYyAqKVxuICAgIGVsc2UgbWF0Y2ggc2VxKCkgd2l0aFxuICAgICAgfCBTZXEuTmlsIC0+IFtdXG4gICAgICB8IFNlcS5Db25zICh4LCBuZXh0KSAtPiB4IDo6IGRpcmVjdCAoZGVwdGgtMSkgbmV4dFxuICBpblxuICBkaXJlY3QgNTAwIHNlcVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbnRcblxubGV0IHplcm8gPSAwXG5sZXQgb25lID0gMVxubGV0IG1pbnVzX29uZSA9IC0xXG5leHRlcm5hbCBuZWcgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcbmV4dGVybmFsIGFkZCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsIHN1YiA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlc3ViaW50XCJcbmV4dGVybmFsIG11bCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbmV4dGVybmFsIGRpdiA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsIHJlbSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbW9kaW50XCJcbmV4dGVybmFsIHN1Y2MgOiBpbnQgLT4gaW50ID0gXCIlc3VjY2ludFwiXG5leHRlcm5hbCBwcmVkIDogaW50IC0+IGludCA9IFwiJXByZWRpbnRcIlxubGV0IGFicyB4ID0gaWYgeCA+PSAwIHRoZW4geCBlbHNlIC14XG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcbmV4dGVybmFsIGxvZ2FuZCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsIGxvZ29yIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVvcmludFwiXG5leHRlcm5hbCBsb2d4b3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXhvcmludFwiXG5sZXQgbG9nbm90IHggPSBsb2d4b3IgeCAoLTEpXG5leHRlcm5hbCBzaGlmdF9sZWZ0IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc3JpbnRcIlxubGV0IGVxdWFsIDogaW50IC0+IGludCAtPiBib29sID0gKCA9IClcbmxldCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBTdGRsaWIuY29tcGFyZVxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5leHRlcm5hbCB0b19mbG9hdCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcblxuKCpcbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxubGV0IG9mX3N0cmluZyBzID0gdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcykgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuKilcblxuZXh0ZXJuYWwgZm9ybWF0X2ludCA6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxubGV0IHRvX3N0cmluZyB4ID0gZm9ybWF0X2ludCBcIiVkXCIgeFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBCeXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgKilcblxuKCogV0FSTklORzogU29tZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBzdHJpbmcubWwuXG4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIFwiZHVwbGljYXRlZFwiIGNvbW1lbnQgYWJvdmUgdGhlaXIgZGVmaW5pdGlvbi5cbiopXG5cbmV4dGVybmFsIGxlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc19zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCB1bnNhZmVfZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfZmlsbCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gY2hhciAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9maWxsX2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV90b19zdHJpbmcgOiBieXRlcyAtPiBzdHJpbmcgPSBcIiVieXRlc190b19zdHJpbmdcIlxuZXh0ZXJuYWwgdW5zYWZlX29mX3N0cmluZyA6IHN0cmluZyAtPiBieXRlcyA9IFwiJWJ5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHVuc2FmZV9ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfYmxpdF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5sZXQgbWFrZSBuIGMgPVxuICBsZXQgcyA9IGNyZWF0ZSBuIGluXG4gIHVuc2FmZV9maWxsIHMgMCBuIGM7XG4gIHNcblxubGV0IGluaXQgbiBmID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHMgaSAoZiBpKVxuICBkb25lO1xuICBzXG5cbmxldCBlbXB0eSA9IGNyZWF0ZSAwXG5cbmxldCBjb3B5IHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIHVuc2FmZV9ibGl0IHMgMCByIDAgbGVuO1xuICByXG5cbmxldCB0b19zdHJpbmcgYiA9IHVuc2FmZV90b19zdHJpbmcgKGNvcHkgYilcbmxldCBvZl9zdHJpbmcgcyA9IGNvcHkgKHVuc2FmZV9vZl9zdHJpbmcgcylcblxubGV0IHN1YiBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5zdWIgLyBCeXRlcy5zdWJcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgcyBvZnMgciAwIGxlbjtcbiAgICByXG4gIGVuZFxuXG5sZXQgc3ViX3N0cmluZyBiIG9mcyBsZW4gPSB1bnNhZmVfdG9fc3RyaW5nIChzdWIgYiBvZnMgbGVuKVxuXG4oKiBhZGRpdGlvbiB3aXRoIGFuIG92ZXJmbG93IGNoZWNrICopXG5sZXQgKCsrKSBhIGIgPVxuICBsZXQgYyA9IGEgKyBiIGluXG4gIG1hdGNoIGEgPCAwLCBiIDwgMCwgYyA8IDAgd2l0aFxuICB8IHRydWUgLCB0cnVlICwgZmFsc2VcbiAgfCBmYWxzZSwgZmFsc2UsIHRydWUgIC0+IGludmFsaWRfYXJnIFwiQnl0ZXMuZXh0ZW5kXCIgKCogb3ZlcmZsb3cgKilcbiAgfCBfIC0+IGNcblxubGV0IGV4dGVuZCBzIGxlZnQgcmlnaHQgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgKysgbGVmdCArKyByaWdodCBpblxuICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgbGV0IChzcmNvZmYsIGRzdG9mZikgPSBpZiBsZWZ0IDwgMCB0aGVuIC1sZWZ0LCAwIGVsc2UgMCwgbGVmdCBpblxuICBsZXQgY3B5bGVuID0gSW50Lm1pbiAobGVuZ3RoIHMgLSBzcmNvZmYpIChsZW4gLSBkc3RvZmYpIGluXG4gIGlmIGNweWxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCBzIHNyY29mZiByIGRzdG9mZiBjcHlsZW47XG4gIHJcblxubGV0IGZpbGwgcyBvZnMgbGVuIGMgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5maWxsIC8gQnl0ZXMuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgcyBvZnMgbGVuIGNcblxubGV0IGJsaXQgczEgb2ZzMSBzMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IHMxIG9mczEgczIgb2ZzMiBsZW5cblxubGV0IGJsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBzdHJpbmdfbGVuZ3RoIHMxIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBzMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmJsaXQgLyBCeXRlcy5ibGl0X3N0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX2JsaXRfc3RyaW5nIHMxIG9mczEgczIgb2ZzMiBsZW5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZih1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgZW5zdXJlX2dlICh4OmludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkJ5dGVzLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZW1wdHlcbiAgfCBsIC0+IGxldCBzZXBsZW4gPSBsZW5ndGggc2VwIGluXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoY3JlYXRlIChzdW1fbGVuZ3RocyAwIHNlcGxlbiBsKSlcbiAgICAgICAgICAgIDAgc2VwIHNlcGxlbiBsXG5cbmxldCBjYXQgczEgczIgPVxuICBsZXQgbDEgPSBsZW5ndGggczEgaW5cbiAgbGV0IGwyID0gbGVuZ3RoIHMyIGluXG4gIGxldCByID0gY3JlYXRlIChsMSArIGwyKSBpblxuICB1bnNhZmVfYmxpdCBzMSAwIHIgMCBsMTtcbiAgdW5zYWZlX2JsaXQgczIgMCByIGwxIGwyO1xuICByXG5cblxuZXh0ZXJuYWwgY2hhcl9jb2RlOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGNoYXJfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IGxlbiAmJiBpc19zcGFjZSAodW5zYWZlX2dldCBzICFpKSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBsZXQgaiA9IHJlZiAobGVuIC0gMSkgaW5cbiAgd2hpbGUgIWogPj0gIWkgJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaikgZG9cbiAgICBkZWNyIGpcbiAgZG9uZTtcbiAgaWYgIWogPj0gIWkgdGhlblxuICAgIHN1YiBzICFpICghaiAtICFpICsgMSlcbiAgZWxzZVxuICAgIGVtcHR5XG5cbmxldCB1bnNhZmVfZXNjYXBlIHMgPVxuICAoKiBXZSBwZXJmb3JtIHR3byBwYXNzZXMgb24gdGhlIGlucHV0IHNlcXVlbmNlLCBvbmUgdG8gY29tcHV0ZSB0aGVcbiAgICAgcmVzdWx0IHNpemUgYW5kIG9uZSB0byB3cml0ZSB0aGUgcmVzdWx0LlxuXG4gICAgICMxMTUwOCwgIzExNTA5OiBUaGlzIGxvZ2ljIHdvdWxkIGJlIGluY29ycmVjdCBpbiBwcmVzZW5jZSBvZlxuICAgICBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiB0byB0aGUgaW5wdXQsIG1ha2luZyB0aGUgdXNlIG9mXG4gICAgIFt1bnNhZmVfc2V0XSBiZWxvdyBtZW1vcnktdW5zYWZlLlxuXG4gICAgIFByZWNvbmRpdGlvbjogVGhpcyBmdW5jdGlvbiBtYXkgYmUgc2FmZWx5IGNhbGxlZCBvbjpcbiAgICAgLSBhbiBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZVxuICAgICAtIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZSAodGhlIGZ1bmN0aW9uIHRha2VzIG93bmVyc2hpcClcblxuICAgICBJbiBlaXRoZXIgY2FzZSB3ZSByZXR1cm4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlLlxuICAqKVxuICBsZXQgbiA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICBuIDo9ICFuICtcbiAgICAgIChtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgfCAnXFxcIicgfCAnXFxcXCcgfCAnXFxuJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxiJyAtPiAyXG4gICAgICAgfCAnICcgLi4gJ34nIC0+IDFcbiAgICAgICB8IF8gLT4gNClcbiAgZG9uZTtcbiAgaWYgIW4gPSBsZW5ndGggcyB0aGVuIHNcbiAgZWxzZSBiZWdpblxuICAgIGxldCBzJyA9IGNyZWF0ZSAhbiBpblxuICAgIG4gOj0gMDtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICBiZWdpbiBtYXRjaCB1bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgfCAoJyAnIC4uICd+JykgYXMgYyAtPiB1bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgIHwgYyAtPlxuICAgICAgICAgIGxldCBhID0gY2hhcl9jb2RlIGMgaW5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSAvIDEwMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyAoYSAvIDEwKSBtb2QgMTApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgYSBtb2QgMTApKTtcbiAgICAgIGVuZDtcbiAgICAgIGluY3IgblxuICAgIGRvbmU7XG4gICAgcydcbiAgZW5kXG5cbmxldCBlc2NhcGVkIGIgPVxuICBsZXQgYiA9IGNvcHkgYiBpblxuICAoKiBXZSBjb3B5IG91ciBpbnB1dCB0byBvYnRhaW4gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlIFtiXVxuICAgICB0byBzYXRpc2Z5IFt1bnNhZmVfZXNjYXBlXSdzIHByZWNvbmRpdGlvbiAqKVxuICB1bnNhZmVfZXNjYXBlIGJcblxubGV0IG1hcCBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBzIGkpKSBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBtYXBpIGYgcyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgbCA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIXJcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIHMgPVxuICBsZXQgbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgcyBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgdXBwZXJjYXNlX2FzY2lpIHMgPSBtYXAgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IGxvd2VyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxubGV0IGFwcGx5MSBmIHMgPVxuICBpZiBsZW5ndGggcyA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNvcHkgcyBpblxuICAgIHVuc2FmZV9zZXQgciAwIChmKHVuc2FmZV9nZXQgcyAwKSk7XG4gICAgclxuICBlbmRcblxubGV0IGNhcGl0YWxpemVfYXNjaWkgcyA9IGFwcGx5MSBDaGFyLnVwcGVyY2FzZV9hc2NpaSBzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci5sb3dlcmNhc2VfYXNjaWkgc1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHN0YXJ0c193aXRoIH5wcmVmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fcHJlID0gbGVuZ3RoIHByZWZpeCBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3ByZSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyBpIDw+IHVuc2FmZV9nZXQgcHJlZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gbGVuX3MgPj0gbGVuX3ByZSAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGVuZHNfd2l0aCB+c3VmZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3N1ZiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGV0IGRpZmYgPSBsZW5fcyAtIGxlbl9zdWYgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9zdWYgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgKGRpZmYgKyBpKSA8PiB1bnNhZmVfZ2V0IHN1ZmZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGRpZmYgPj0gMCAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWMgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgaW5kZXhfcmVjIHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIGluZGV4X3JlY19vcHQgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgaW5kZXhfcmVjX29wdCBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9vcHQgcyBjID0gaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgaW5kZXhfcmVjIHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMuaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgaW5kZXhfcmVjX29wdCBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4IHMgYyA9IHJpbmRleF9yZWMgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb20gLyBCeXRlcy5yaW5kZXhfZnJvbVwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjIHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfb3B0IHMgYyA9IHJpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5yaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgcmluZGV4X3JlY19vcHQgcyBpIGNcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb250YWluc19mcm9tIC8gQnl0ZXMuY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChpbmRleF9yZWMgcyBsIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGNvbnRhaW5zIHMgYyA9IGNvbnRhaW5zX2Zyb20gcyAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuXG50eXBlIHQgPSBieXRlc1xuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5leHRlcm5hbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2J5dGVzX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBuID0gcmVmIDAgaW5cbiAgbGV0IGJ1ZiA9IHJlZiAobWFrZSAyNTYgJ1xcMDAwJykgaW5cbiAgbGV0IHJlc2l6ZSAoKSA9XG4gICAgKCogcmVzaXplICopXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWluICgyICogbGVuZ3RoICFidWYpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgIGlmIGxlbmd0aCAhYnVmID0gbmV3X2xlbiB0aGVuIGZhaWx3aXRoIFwiQnl0ZXMub2Zfc2VxOiBjYW5ub3QgZ3JvdyBieXRlc1wiO1xuICAgIGxldCBuZXdfYnVmID0gbWFrZSBuZXdfbGVuICdcXDAwMCcgaW5cbiAgICBibGl0ICFidWYgMCBuZXdfYnVmIDAgIW47XG4gICAgYnVmIDo9IG5ld19idWZcbiAgaW5cbiAgU2VxLml0ZXJcbiAgICAoZnVuIGMgLT5cbiAgICAgICBpZiAhbiA9IGxlbmd0aCAhYnVmIHRoZW4gcmVzaXplKCk7XG4gICAgICAgc2V0ICFidWYgIW4gYztcbiAgICAgICBpbmNyIG4pXG4gICAgaTtcbiAgc3ViICFidWYgMCAhblxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG4oKiBUaGUgZ2V0XyBmdW5jdGlvbnMgYXJlIGFsbCBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxuXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNnVcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9ieXRlc19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX2J5dGVzX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjRcIlxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NF9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG4gIGVsc2Ugc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG5cbmxldCBnZXRfaW50OCBiIGkgPVxuICAoKGdldF91aW50OCBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gOCkpIGFzciAoU3lzLmludF9zaXplIC0gOClcblxubGV0IGdldF91aW50MTZfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfdWludDE2X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF9pbnQxNl9uZSBiIGkgPVxuICAoKGdldF91aW50MTZfbmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9sZSBiIGkgPVxuICAoKGdldF91aW50MTZfbGUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQxNl9iZSBiIGkgPVxuICAoKGdldF91aW50MTZfYmUgYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDE2KSkgYXNyIChTeXMuaW50X3NpemUgLSAxNilcblxubGV0IGdldF9pbnQzMl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50MzJfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4XG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9iZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHggZWxzZVxuICB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuXG5sZXQgc2V0X2ludDE2X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQxNl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2xlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9iZSBiIGkgeCA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X3VpbnQ4ID0gc2V0X2ludDhcbmxldCBzZXRfdWludDE2X25lID0gc2V0X2ludDE2X25lXG5sZXQgc2V0X3VpbnQxNl9iZSA9IHNldF9pbnQxNl9iZVxubGV0IHNldF91aW50MTZfbGUgPSBzZXRfaW50MTZfbGVcblxuKCogVVRGIGNvZGVjcyBhbmQgdmFsaWRhdGlvbnMgKilcblxubGV0IGRlY19pbnZhbGlkID0gVWNoYXIudXRmX2RlY29kZV9pbnZhbGlkXG5sZXRbQGlubGluZV0gZGVjX3JldCBuIHUgPSBVY2hhci51dGZfZGVjb2RlIG4gKFVjaGFyLnVuc2FmZV9vZl9pbnQgdSlcblxuKCogSW4gY2FzZSBvZiBkZWNvZGluZyBlcnJvciwgaWYgd2UgZXJyb3Igb24gdGhlIGZpcnN0IGJ5dGUsIHdlXG4gICBjb25zdW1lIHRoZSBieXRlLCBvdGhlcndpc2Ugd2UgY29uc3VtZSB0aGUgW25dIGJ5dGVzIHByZWNlZGluZ1xuICAgdGhlIGVycm9yaW5nIGJ5dGUuXG5cbiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBhIGNsaWVudCB1c2VzIGRlY29kZXMgd2l0aG91dCBjYXJpbmcgYWJvdXRcbiAgIHZhbGlkaXR5IGl0IG5hdHVyYWxseSByZXBsYWNlIGJvZ3VzIGRhdGEgd2l0aCBVY2hhci5yZXAgYWNjb3JkaW5nXG4gICB0byB0aGUgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkLiBPdGhlciBzY2hlbWVzIGFyZSBwb3NzaWJsZSBieVxuICAgY29uc3VsdGluZyB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgb24gaW52YWxpZCBkZWNvZGVzLiBGb3IgbW9yZVxuICAgZGV0YWlscyBzZWUgaHR0cHM6Ly9oc2l2b25lbi5maS9icm9rZW4tdXRmLTgvXG5cbiAgIEZvciB0aGlzIHJlYXNvbiBpbiBbZ2V0X3V0Zl84X3VjaGFyXSB3ZSBncmFkdWFsbHkgY2hlY2sgdGhlIG5leHRcbiAgIGJ5dGUgaXMgYXZhaWxhYmxlIHJhdGhlciB0aGFuIGRvaW5nIGl0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgZmlyc3QgYnl0ZS4gQ29udHJhc3Qgd2l0aCBbaXNfdmFsaWRfdXRmXzhdLiAqKVxuXG4oKiBVVEYtOCAqKVxuXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194QkYgYiA9IGIgbHNyIDYgPD4gMGIxMFxubGV0W0BpbmxpbmVdIG5vdF9pbl94QTBfdG9feEJGIGIgPSBiIGxzciA1IDw+IDBiMTAxXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OUYgYiA9IGIgbHNyIDUgPD4gMGIxMDBcbmxldFtAaW5saW5lXSBub3RfaW5feDkwX3RvX3hCRiBiID0gYiA8IDB4OTAgfHwgMHhCRiA8IGJcbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3g4RiBiID0gYiBsc3IgNCA8PiAweDhcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzIgYjAgYjEgPVxuICAoKGIwIGxhbmQgMHgxRikgbHNsIDYpIGxvclxuICAoKGIxIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8zIGIwIGIxIGIyID1cbiAgKChiMCBsYW5kIDB4MEYpIGxzbCAxMikgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSlcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMgPVxuICAoKGIwIGxhbmQgMHgwNykgbHNsIDE4KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpIGxzbCAxMikgbG9yXG4gICgoYjIgbGFuZCAweDNGKSBsc2wgNikgbG9yXG4gICgoYjMgbGFuZCAweDNGKSlcblxubGV0IGdldF91dGZfOF91Y2hhciBiIGkgPVxuICBsZXQgYjAgPSBnZXRfdWludDggYiBpIGluICgqIHJhaXNlcyBpZiBbaV0gaXMgbm90IGEgdmFsaWQgaW5kZXguICopXG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIGIwIHdpdGggKCogU2VlIFRoZSBVbmljb2RlIFN0YW5kYXJkLCBUYWJsZSAzLjcgKilcbiAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gZGVjX3JldCAxIGIwXG4gIHwgJ1xceEMyJyAuLiAnXFx4REYnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGRlY19yZXQgMiAodXRmXzhfdWNoYXJfMiBiMCBiMSlcbiAgfCAnXFx4RTAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3hBMF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RUQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OUYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhGMCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDkwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjEnIC4uICdcXHhGMycgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCAnXFx4RjQnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194OEYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgXyAtPiBkZWNfaW52YWxpZCAxXG5cbmxldCBzZXRfdXRmXzhfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+XG4gICAgICBzZXRfdWludDggYiBpIHU7XG4gICAgICAxXG4gIHwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhDMCBsb3IgKHUgbHNyIDYpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICAyKVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RTAgbG9yICh1IGxzciAxMikpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMylcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4RjAgbG9yICh1IGxzciAxOCkpO1xuICAgICAgIHNldCBiIChpICsgMSkgKDB4ODAgbG9yICgodSBsc3IgMTIpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIChpICsgMikgKDB4ODAgbG9yICgodSBsc3IgNikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgNClcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzggYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDggaW5cbiAgICBtYXRjaCBDaGFyLnVuc2FmZV9jaHIgKGdldCBiIGkpIHdpdGhcbiAgICB8ICdcXHgwMCcgLi4gJ1xceDdGJyAtPiBsb29wIG1heCBiIChpICsgMSlcbiAgICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94QTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEUxJyAuLiAnXFx4RUMnIHwgJ1xceEVFJyAuLiAnXFx4RUYnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFRCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feDlGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYwJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g5MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g4RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkJFICopXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2YmVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfYmUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmJlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2JlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG5cbigqIFVURi0xNkxFICopXG5cbmxldCBnZXRfdXRmXzE2bGVfdWNoYXIgYiBpID1cbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgaWYgaSA9IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19yZXQgMiB1XG4gIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZGVjX2ludmFsaWQgMlxuICB8IGhpIC0+ICgqIGNvbWJpbmUgW2hpXSB3aXRoIGEgbG93IHN1cnJvZ2F0ZSAqKVxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGRlY19pbnZhbGlkIChtYXggLSBpICsgMSkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZGVjX2ludmFsaWQgMiAoKiByZXRyeSBoZXJlICopXG4gICAgICB8IGxvIC0+XG4gICAgICAgICAgbGV0IHUgPSAoKChoaSBsYW5kIDB4M0ZGKSBsc2wgMTApIGxvciAobG8gbGFuZCAweDNGRikpICsgMHgxMDAwMCBpblxuICAgICAgICAgIGRlY19yZXQgNCB1XG5cbmxldCBzZXRfdXRmXzE2bGVfdWNoYXIgYiBpIHUgPVxuICBsZXQgc2V0ID0gdW5zYWZlX3NldF91aW50MTZfbGUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4RkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZSAoc2V0IGIgaSB1OyAyKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICBsZXQgdScgPSB1IC0gMHgxMDAwMCBpblxuICAgICAgbGV0IGhpID0gKDB4RDgwMCBsb3IgKHUnIGxzciAxMCkpIGluXG4gICAgICBsZXQgbG8gPSAoMHhEQzAwIGxvciAodScgbGFuZCAweDNGRikpIGluXG4gICAgICBzZXQgYiBpIGhpOyBzZXQgYiAoaSArIDIpIGxvOyA0XG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDE2X2xlIGluXG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGlmIGkgPSBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgfCB1IHdoZW4gdSA8IDB4RDgwMCB8fCB1ID4gMHhERkZGIC0+IGxvb3AgbWF4IGIgKGkgKyAyKVxuICAgIHwgdSB3aGVuIHUgPiAweERCRkYgLT4gZmFsc2VcbiAgICB8IF9oaSAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgICB8IHUgd2hlbiB1IDwgMHhEQzAwIHx8IHUgPiAweERGRkYgLT4gZmFsc2VcbiAgICAgICAgfCBfbG8gLT4gbG9vcCBtYXggYiAoaSArIDQpXG4gIGluXG4gIGxvb3AgKGxlbmd0aCBiIC0gMSkgYiAwXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBHYWxsaXVtLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFN0cmluZyBvcGVyYXRpb25zLCBiYXNlZCBvbiBieXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMgKilcblxuKCogV0FSTklORzogU29tZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sIGZvclxuICAgZWZmaWNpZW5jeSByZWFzb25zLiBXaGVuIHlvdSBtb2RpZnkgdGhlIG9uZSBpbiB0aGlzIGZpbGUgeW91IG5lZWQgdG9cbiAgIG1vZGlmeSBpdHMgZHVwbGljYXRlIGluIGJ5dGVzLm1sLlxuICAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBcImR1cGxpY2F0ZWRcIiBjb21tZW50IGFib3ZlIHRoZWlyIGRlZmluaXRpb24uXG4qKVxuXG5leHRlcm5hbCBsZW5ndGggOiBzdHJpbmcgLT4gaW50ID0gXCIlc3RyaW5nX2xlbmd0aFwiXG5leHRlcm5hbCBnZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDogc3RyaW5nIC0+IGludCAtPiAgYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X3N0cmluZ1wiIFtAQG5vYWxsb2NdXG5cbm1vZHVsZSBCID0gQnl0ZXNcblxubGV0IGJ0cyA9IEIudW5zYWZlX3RvX3N0cmluZ1xubGV0IGJvcyA9IEIudW5zYWZlX29mX3N0cmluZ1xuXG5sZXQgbWFrZSBuIGMgPVxuICBCLm1ha2UgbiBjIHw+IGJ0c1xubGV0IGluaXQgbiBmID1cbiAgQi5pbml0IG4gZiB8PiBidHNcbmxldCBlbXB0eSA9IFwiXCJcbmxldCBvZl9ieXRlcyA9IEIudG9fc3RyaW5nXG5sZXQgdG9fYnl0ZXMgPSBCLm9mX3N0cmluZ1xubGV0IHN1YiBzIG9mcyBsZW4gPVxuICBCLnN1YiAoYm9zIHMpIG9mcyBsZW4gfD4gYnRzXG5sZXQgYmxpdCA9XG4gIEIuYmxpdF9zdHJpbmdcblxubGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29uY2F0XCJcblxubGV0IHJlYyBzdW1fbGVuZ3RocyBhY2Mgc2VwbGVuID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBhY2NcbiAgfCBoZCA6OiBbXSAtPiBsZW5ndGggaGQgKyBhY2NcbiAgfCBoZCA6OiB0bCAtPiBzdW1fbGVuZ3RocyAoZW5zdXJlX2dlIChsZW5ndGggaGQgKyBzZXBsZW4gKyBhY2MpIGFjYykgc2VwbGVuIHRsXG5cbmxldCByZWMgdW5zYWZlX2JsaXRzIGRzdCBwb3Mgc2VwIHNlcGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZHN0XG4gIHwgaGQgOjogW10gLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7IGRzdFxuICB8IGhkIDo6IHRsIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpO1xuICAgIHVuc2FmZV9ibGl0IHNlcCAwIGRzdCAocG9zICsgbGVuZ3RoIGhkKSBzZXBsZW47XG4gICAgdW5zYWZlX2JsaXRzIGRzdCAocG9zICsgbGVuZ3RoIGhkICsgc2VwbGVuKSBzZXAgc2VwbGVuIHRsXG5cbmxldCBjb25jYXQgc2VwID0gZnVuY3Rpb25cbiAgICBbXSAtPiBcIlwiXG4gIHwgbCAtPiBsZXQgc2VwbGVuID0gbGVuZ3RoIHNlcCBpbiBidHMgQEBcbiAgICAgICAgICB1bnNhZmVfYmxpdHNcbiAgICAgICAgICAgIChCLmNyZWF0ZSAoc3VtX2xlbmd0aHMgMCBzZXBsZW4gbCkpXG4gICAgICAgICAgICAwIHNlcCBzZXBsZW4gbFxuXG5sZXQgY2F0ID0gKCBeIClcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXIgZiBzID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkbyBmICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaXRlcmkgZiBzID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgcyBpKSBkb25lXG5cbmxldCBtYXAgZiBzID1cbiAgQi5tYXAgZiAoYm9zIHMpIHw+IGJ0c1xubGV0IG1hcGkgZiBzID1cbiAgQi5tYXBpIGYgKGJvcyBzKSB8PiBidHNcbmxldCBmb2xkX3JpZ2h0IGYgeCBhID1cbiAgQi5mb2xkX3JpZ2h0IGYgKGJvcyB4KSBhXG5sZXQgZm9sZF9sZWZ0IGYgYSB4ID1cbiAgQi5mb2xkX2xlZnQgZiBhIChib3MgeClcbmxldCBleGlzdHMgZiBzID1cbiAgQi5leGlzdHMgZiAoYm9zIHMpXG5sZXQgZm9yX2FsbCBmIHMgPVxuICBCLmZvcl9hbGwgZiAoYm9zIHMpXG5cbigqIEJld2FyZTogd2UgY2Fubm90IHVzZSBCLnRyaW0gb3IgQi5lc2NhcGUgYmVjYXVzZSB0aGV5IGFsd2F5cyBtYWtlIGFcbiAgIGNvcHksIGJ1dCBTdHJpbmcubWxpIHNwZWxscyBvdXQgc29tZSBjYXNlcyB3aGVyZSB3ZSBhcmUgbm90IGFsbG93ZWRcbiAgIHRvIG1ha2UgYSBjb3B5LiAqKVxuXG5sZXQgaXNfc3BhY2UgPSBmdW5jdGlvblxuICB8ICcgJyB8ICdcXDAxMicgfCAnXFxuJyB8ICdcXHInIHwgJ1xcdCcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxubGV0IHRyaW0gcyA9XG4gIGlmIHMgPSBcIlwiIHRoZW4gc1xuICBlbHNlIGlmIGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgMCkgfHwgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAobGVuZ3RoIHMgLSAxKSlcbiAgICB0aGVuIGJ0cyAoQi50cmltIChib3MgcykpXG4gIGVsc2Ugc1xuXG5sZXQgZXNjYXBlZCBzID1cbiAgbGV0IGIgPSBib3MgcyBpblxuICAoKiBXZSBzYXRpc2Z5IFt1bnNhZmVfZXNjYXBlXSdzIHByZWNvbmRpdGlvbiBieSBwYXNzaW5nIGFuXG4gICAgIGltbXV0YWJsZSBieXRlIHNlcXVlbmNlIFtiXS4gKilcbiAgYnRzIChCLnVuc2FmZV9lc2NhcGUgYilcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWMgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgaW5kZXhfcmVjIHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXggcyBjID0gaW5kZXhfcmVjIHMgKGxlbmd0aCBzKSAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWNfb3B0IHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIGluZGV4X3JlY19vcHQgcyBsaW0gKGkgKyAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpbmRleF9vcHQgcyBjID0gaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpbmRleF9mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb20gLyBCeXRlcy5pbmRleF9mcm9tXCIgZWxzZVxuICAgIGluZGV4X3JlYyBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMuaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgaW5kZXhfcmVjX29wdCBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgcmluZGV4X3JlYyBzIGkgYyA9XG4gIGlmIGkgPCAwIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIHJpbmRleF9yZWMgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleCBzIGMgPSByaW5kZXhfcmVjIHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmluZGV4X2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb20gLyBCeXRlcy5yaW5kZXhfZnJvbVwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjIHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgcmluZGV4X3JlY19vcHQgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSByaW5kZXhfcmVjX29wdCBzIChpIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmluZGV4X29wdCBzIGMgPSByaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5yaW5kZXhfZnJvbV9vcHRcIlxuICBlbHNlXG4gICAgcmluZGV4X3JlY19vcHQgcyBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb250YWluc19mcm9tIC8gQnl0ZXMuY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChpbmRleF9yZWMgcyBsIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGNvbnRhaW5zIHMgYyA9IGNvbnRhaW5zX2Zyb20gcyAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJjb250YWluc19mcm9tIHMgaSBjID1cbiAgaWYgaSA8IDAgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmNvbnRhaW5zX2Zyb20gLyBCeXRlcy5yY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChyaW5kZXhfcmVjIHMgaSBjKTsgdHJ1ZSB3aXRoIE5vdF9mb3VuZCAtPiBmYWxzZVxuXG5sZXQgdXBwZXJjYXNlX2FzY2lpIHMgPVxuICBCLnVwcGVyY2FzZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xubGV0IGxvd2VyY2FzZV9hc2NpaSBzID1cbiAgQi5sb3dlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBjYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLmNhcGl0YWxpemVfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCB1bmNhcGl0YWxpemVfYXNjaWkgcyA9XG4gIEIudW5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBzdGFydHNfd2l0aCB+cHJlZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3ByZSA9IGxlbmd0aCBwcmVmaXggaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9wcmUgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgaSA8PiB1bnNhZmVfZ2V0IHByZWZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGxlbl9zID49IGxlbl9wcmUgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGVuZHNfd2l0aCB+c3VmZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3N1ZiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGV0IGRpZmYgPSBsZW5fcyAtIGxlbl9zdWYgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9zdWYgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgKGRpZmYgKyBpKSA8PiB1bnNhZmVfZ2V0IHN1ZmZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGRpZmYgPj0gMCAmJiBhdXggMFxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaCA6IGludCAtPiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX3N0cmluZ19oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaCAwIHhcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHNwbGl0X29uX2NoYXIgc2VwIHMgPVxuICBsZXQgciA9IHJlZiBbXSBpblxuICBsZXQgaiA9IHJlZiAobGVuZ3RoIHMpIGluXG4gIGZvciBpID0gbGVuZ3RoIHMgLSAxIGRvd250byAwIGRvXG4gICAgaWYgdW5zYWZlX2dldCBzIGkgPSBzZXAgdGhlbiBiZWdpblxuICAgICAgciA6PSBzdWIgcyAoaSArIDEpICghaiAtIGkgLSAxKSA6OiAhcjtcbiAgICAgIGogOj0gaVxuICAgIGVuZFxuICBkb25lO1xuICBzdWIgcyAwICFqIDo6ICFyXG5cbnR5cGUgdCA9IHN0cmluZ1xuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5leHRlcm5hbCBlcXVhbCA6IHN0cmluZyAtPiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zdHJpbmdfZXF1YWxcIiBbQEBub2FsbG9jXVxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPSBib3MgcyB8PiBCLnRvX3NlcVxuXG5sZXQgdG9fc2VxaSBzID0gYm9zIHMgfD4gQi50b19zZXFpXG5cbmxldCBvZl9zZXEgZyA9IEIub2Zfc2VxIGcgfD4gYnRzXG5cbigqIFVURiBkZWNvZGVycyBhbmQgdmFsaWRhdG9ycyAqKVxuXG5sZXQgZ2V0X3V0Zl84X3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl84X3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl84IHMgPSBCLmlzX3ZhbGlkX3V0Zl84IChib3MgcylcblxubGV0IGdldF91dGZfMTZiZV91Y2hhciBzIGkgPSBCLmdldF91dGZfMTZiZV91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfMTZiZSBzID0gQi5pc192YWxpZF91dGZfMTZiZSAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2bGVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2bGVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2bGUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2bGUgKGJvcyBzKVxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nL2RlY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG5leHRlcm5hbCBnZXRfdWludDggOiBzdHJpbmcgLT4gaW50IC0+IGludCA9IFwiJXN0cmluZ19zYWZlX2dldFwiXG5leHRlcm5hbCBnZXRfdWludDE2X25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVjYW1sX3N0cmluZ19nZXQxNlwiXG5leHRlcm5hbCBnZXRfaW50MzJfbmUgOiBzdHJpbmcgLT4gaW50IC0+IGludDMyID0gXCIlY2FtbF9zdHJpbmdfZ2V0MzJcIlxuZXh0ZXJuYWwgZ2V0X2ludDY0X25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfc3RyaW5nX2dldDY0XCJcblxubGV0IGdldF9pbnQ4IHMgaSA9IEIuZ2V0X2ludDggKGJvcyBzKSBpXG5sZXQgZ2V0X3VpbnQxNl9sZSBzIGkgPSBCLmdldF91aW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X3VpbnQxNl9iZSBzIGkgPSBCLmdldF91aW50MTZfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X25lIHMgaSA9IEIuZ2V0X2ludDE2X25lIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9sZSBzIGkgPSBCLmdldF9pbnQxNl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfYmUgcyBpID0gQi5nZXRfaW50MTZfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDMyX2xlIHMgaSA9IEIuZ2V0X2ludDMyX2xlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9iZSBzIGkgPSBCLmdldF9pbnQzMl9iZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50NjRfbGUgcyBpID0gQi5nZXRfaW50NjRfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2JlIHMgaSA9IEIuZ2V0X2ludDY0X2JlIChib3MgcykgaVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSB1bml0ID0gKClcblxubGV0IGVxdWFsICgpICgpID0gdHJ1ZVxubGV0IGNvbXBhcmUgKCkgKCkgPSAwXG5sZXQgdG9fc3RyaW5nICgpID0gXCIoKVwiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgZXh0ZXJuX2ZsYWdzID1cbiAgICBOb19zaGFyaW5nXG4gIHwgQ2xvc3VyZXNcbiAgfCBDb21wYXRfMzJcbigqIG5vdGU6IHRoaXMgdHlwZSBkZWZpbml0aW9uIGlzIHVzZWQgaW4gJ3J1bnRpbWUvZGVidWdnZXIuYycgKilcblxuZXh0ZXJuYWwgdG9fY2hhbm5lbDogb3V0X2NoYW5uZWwgLT4gJ2EgLT4gZXh0ZXJuX2ZsYWdzIGxpc3QgLT4gdW5pdFxuICAgID0gXCJjYW1sX291dHB1dF92YWx1ZVwiXG5leHRlcm5hbCB0b19ieXRlczogJ2EgLT4gZXh0ZXJuX2ZsYWdzIGxpc3QgLT4gYnl0ZXNcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXNcIlxuZXh0ZXJuYWwgdG9fc3RyaW5nOiAnYSAtPiBleHRlcm5fZmxhZ3MgbGlzdCAtPiBzdHJpbmdcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nXCJcbmV4dGVybmFsIHRvX2J1ZmZlcl91bnNhZmU6XG4gICAgICBieXRlcyAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IGludFxuICAgID0gXCJjYW1sX291dHB1dF92YWx1ZV90b19idWZmZXJcIlxuXG5sZXQgdG9fYnVmZmVyIGJ1ZmYgb2ZzIGxlbiB2IGZsYWdzID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IEJ5dGVzLmxlbmd0aCBidWZmIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJNYXJzaGFsLnRvX2J1ZmZlcjogc3Vic3RyaW5nIG91dCBvZiBib3VuZHNcIlxuICBlbHNlIHRvX2J1ZmZlcl91bnNhZmUgYnVmZiBvZnMgbGVuIHYgZmxhZ3NcblxuKCogVGhlIGZ1bmN0aW9ucyBiZWxvdyB1c2UgYnl0ZSBzZXF1ZW5jZXMgYXMgaW5wdXQsIG5ldmVyIHVzaW5nIGFueVxuICAgbXV0YXRpb24uIEl0IG1ha2VzIHNlbnNlIHRvIHVzZSBub24tbXV0YXRlZCBbYnl0ZXNdIHJhdGhlciB0aGFuXG4gICBbc3RyaW5nXSwgYmVjYXVzZSB3ZSByZWFsbHkgd29yayB3aXRoIHNlcXVlbmNlcyBvZiBieXRlcywgbm90XG4gICBhIHRleHQgcmVwcmVzZW50YXRpb24uXG4qKVxuXG5leHRlcm5hbCBmcm9tX2NoYW5uZWw6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgZnJvbV9ieXRlc191bnNhZmU6IGJ5dGVzIC0+IGludCAtPiAnYSA9IFwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzXCJcbmV4dGVybmFsIGRhdGFfc2l6ZV91bnNhZmU6IGJ5dGVzIC0+IGludCAtPiBpbnQgPSBcImNhbWxfbWFyc2hhbF9kYXRhX3NpemVcIlxuXG5sZXQgaGVhZGVyX3NpemUgPSAyMFxubGV0IGRhdGFfc2l6ZSBidWZmIG9mcyA9XG4gIGlmIG9mcyA8IDAgfHwgb2ZzID4gQnl0ZXMubGVuZ3RoIGJ1ZmYgLSBoZWFkZXJfc2l6ZVxuICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC5kYXRhX3NpemVcIlxuICBlbHNlIGRhdGFfc2l6ZV91bnNhZmUgYnVmZiBvZnNcbmxldCB0b3RhbF9zaXplIGJ1ZmYgb2ZzID0gaGVhZGVyX3NpemUgKyBkYXRhX3NpemUgYnVmZiBvZnNcblxubGV0IGZyb21fYnl0ZXMgYnVmZiBvZnMgPVxuICBpZiBvZnMgPCAwIHx8IG9mcyA+IEJ5dGVzLmxlbmd0aCBidWZmIC0gaGVhZGVyX3NpemVcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIk1hcnNoYWwuZnJvbV9ieXRlc1wiXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgbGVuID0gZGF0YV9zaXplX3Vuc2FmZSBidWZmIG9mcyBpblxuICAgIGlmIG9mcyA+IEJ5dGVzLmxlbmd0aCBidWZmIC0gKGhlYWRlcl9zaXplICsgbGVuKVxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJNYXJzaGFsLmZyb21fYnl0ZXNcIlxuICAgIGVsc2UgZnJvbV9ieXRlc191bnNhZmUgYnVmZiBvZnNcbiAgZW5kXG5cbmxldCBmcm9tX3N0cmluZyBidWZmIG9mcyA9XG4gICgqIEJ5dGVzLnVuc2FmZV9vZl9zdHJpbmcgaXMgc2FmZSBoZXJlLCBhcyB0aGUgcHJvZHVjZWQgYnl0ZVxuICAgICBzZXF1ZW5jZSBpcyBuZXZlciBtdXRhdGVkICopXG4gIGZyb21fYnl0ZXMgKEJ5dGVzLnVuc2FmZV9vZl9zdHJpbmcgYnVmZikgb2ZzXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEFuIGFsaWFzIGZvciB0aGUgdHlwZSBvZiBhcnJheXMuICopXG50eXBlICdhIHQgPSAnYSBhcnJheVxuXG4oKiBBcnJheSBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGxlbmd0aCA6ICdhIGFycmF5IC0+IGludCA9IFwiJWFycmF5X2xlbmd0aFwiXG5leHRlcm5hbCBnZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSA9IFwiJWFycmF5X3NhZmVfZ2V0XCJcbmV4dGVybmFsIHNldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVhcnJheV9zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV91bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfdW5zYWZlX3NldFwiXG5leHRlcm5hbCBtYWtlOiBpbnQgLT4gJ2EgLT4gJ2EgYXJyYXkgPSBcImNhbWxfbWFrZV92ZWN0XCJcbmV4dGVybmFsIGNyZWF0ZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCB1bnNhZmVfc3ViIDogJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSBhcnJheSA9IFwiY2FtbF9hcnJheV9zdWJcIlxuZXh0ZXJuYWwgYXBwZW5kX3ByaW0gOiAnYSBhcnJheSAtPiAnYSBhcnJheSAtPiAnYSBhcnJheSA9IFwiY2FtbF9hcnJheV9hcHBlbmRcIlxuZXh0ZXJuYWwgY29uY2F0IDogJ2EgYXJyYXkgbGlzdCAtPiAnYSBhcnJheSA9IFwiY2FtbF9hcnJheV9jb25jYXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2JsaXQgOlxuICAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2JsaXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2ZpbGwgOlxuICAnYSBhcnJheSAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYXJyYXlfZmlsbFwiXG5leHRlcm5hbCBjcmVhdGVfZmxvYXQ6IGludCAtPiBmbG9hdCBhcnJheSA9IFwiY2FtbF9tYWtlX2Zsb2F0X3ZlY3RcIlxuXG5tb2R1bGUgRmxvYXRhcnJheSA9IHN0cnVjdFxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gZmxvYXRhcnJheSA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIGxlbmd0aCA6IGZsb2F0YXJyYXkgLT4gaW50ID0gXCIlZmxvYXRhcnJheV9sZW5ndGhcIlxuICBleHRlcm5hbCBnZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9nZXRcIlxuICBleHRlcm5hbCBzZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV9zYWZlX3NldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCAtPiB1bml0XG4gICAgICA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX3NldFwiXG5lbmRcblxubGV0IGluaXQgbCBmID1cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2VcbiAgaWYgbCA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmluaXRcIlxuICAoKiBTZWUgIzY1NzUuIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIG1heGltdW0gYXJyYXkgc2l6ZSwgYnV0IHRoaXMgZGVwZW5kc1xuICAgICBvbiB3aGV0aGVyIHdlIGNyZWF0ZSBhIGZsb2F0IGFycmF5IG9yIGEgcmVndWxhciBvbmUuLi4gKilcbiAgZWxzZVxuICAgbGV0IHJlcyA9IGNyZWF0ZSBsIChmIDApIGluXG4gICBmb3IgaSA9IDEgdG8gcHJlZCBsIGRvXG4gICAgIHVuc2FmZV9zZXQgcmVzIGkgKGYgaSlcbiAgIGRvbmU7XG4gICByZXNcblxubGV0IG1ha2VfbWF0cml4IHN4IHN5IGluaXQgPVxuICBsZXQgcmVzID0gY3JlYXRlIHN4IFt8fF0gaW5cbiAgZm9yIHggPSAwIHRvIHByZWQgc3ggZG9cbiAgICB1bnNhZmVfc2V0IHJlcyB4IChjcmVhdGUgc3kgaW5pdClcbiAgZG9uZTtcbiAgcmVzXG5cbmxldCBjb3B5IGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIHVuc2FmZV9zdWIgYSAwIGxcblxubGV0IGFwcGVuZCBhMSBhMiA9XG4gIGxldCBsMSA9IGxlbmd0aCBhMSBpblxuICBpZiBsMSA9IDAgdGhlbiBjb3B5IGEyXG4gIGVsc2UgaWYgbGVuZ3RoIGEyID0gMCB0aGVuIHVuc2FmZV9zdWIgYTEgMCBsMVxuICBlbHNlIGFwcGVuZF9wcmltIGExIGEyXG5cbmxldCBzdWIgYSBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBhIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5zdWJcIlxuICBlbHNlIHVuc2FmZV9zdWIgYSBvZnMgbGVuXG5cbmxldCBmaWxsIGEgb2ZzIGxlbiB2ID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBhIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5maWxsXCJcbiAgZWxzZSB1bnNhZmVfZmlsbCBhIG9mcyBsZW4gdlxuXG5sZXQgYmxpdCBhMSBvZnMxIGEyIG9mczIgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBvZnMxIDwgMCB8fCBvZnMxID4gbGVuZ3RoIGExIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBhMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuYmxpdFwiXG4gIGVsc2UgdW5zYWZlX2JsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlblxuXG5sZXQgaXRlciBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYodW5zYWZlX2dldCBhIGkpIGRvbmVcblxubGV0IGl0ZXIyIGYgYSBiID1cbiAgaWYgbGVuZ3RoIGEgPD4gbGVuZ3RoIGIgdGhlblxuICAgIGludmFsaWRfYXJnIFwiQXJyYXkuaXRlcjI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgZWxzZVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiAodW5zYWZlX2dldCBhIGkpICh1bnNhZmVfZ2V0IGIgaSkgZG9uZVxuXG5sZXQgbWFwIGYgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIChmKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBtYXAyIGYgYSBiID1cbiAgbGV0IGxhID0gbGVuZ3RoIGEgaW5cbiAgbGV0IGxiID0gbGVuZ3RoIGIgaW5cbiAgaWYgbGEgPD4gbGIgdGhlblxuICAgIGludmFsaWRfYXJnIFwiQXJyYXkubWFwMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICBlbHNlIGJlZ2luXG4gICAgaWYgbGEgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGNyZWF0ZSBsYSAoZiAodW5zYWZlX2dldCBhIDApICh1bnNhZmVfZ2V0IGIgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbGEgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG4gIGVuZFxuXG5sZXQgaXRlcmkgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBtYXBpIGYgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIChmIDAgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCB0b19saXN0IGEgPVxuICBsZXQgcmVjIHRvbGlzdCBpIHJlcyA9XG4gICAgaWYgaSA8IDAgdGhlbiByZXMgZWxzZSB0b2xpc3QgKGkgLSAxKSAodW5zYWZlX2dldCBhIGkgOjogcmVzKSBpblxuICB0b2xpc3QgKGxlbmd0aCBhIC0gMSkgW11cblxuKCogQ2Fubm90IHVzZSBMaXN0Lmxlbmd0aCBoZXJlIGJlY2F1c2UgdGhlIExpc3QgbW9kdWxlIGRlcGVuZHMgb24gQXJyYXkuICopXG5sZXQgcmVjIGxpc3RfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY3VcbiAgfCBfOjp0IC0+IGxpc3RfbGVuZ3RoIChzdWNjIGFjY3UpIHRcblxubGV0IG9mX2xpc3QgPSBmdW5jdGlvblxuICAgIFtdIC0+IFt8fF1cbiAgfCBoZDo6dGwgYXMgbCAtPlxuICAgICAgbGV0IGEgPSBjcmVhdGUgKGxpc3RfbGVuZ3RoIDAgbCkgaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpKzEpIHRsIGluXG4gICAgICBmaWxsIDEgdGxcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX2xlZnRfbWFwIGYgYWNjIGlucHV0X2FycmF5ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBpbnB1dF9hcnJheSBpblxuICBpZiBsZW4gPSAwIHRoZW4gKGFjYywgW3x8XSkgZWxzZSBiZWdpblxuICAgIGxldCBhY2MsIGVsdCA9IGYgYWNjICh1bnNhZmVfZ2V0IGlucHV0X2FycmF5IDApIGluXG4gICAgbGV0IG91dHB1dF9hcnJheSA9IGNyZWF0ZSBsZW4gZWx0IGluXG4gICAgbGV0IGFjYyA9IHJlZiBhY2MgaW5cbiAgICBmb3IgaSA9IDEgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IGFjYycsIGVsdCA9IGYgIWFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSBpKSBpblxuICAgICAgYWNjIDo9IGFjYyc7XG4gICAgICB1bnNhZmVfc2V0IG91dHB1dF9hcnJheSBpIGVsdDtcbiAgICBkb25lO1xuICAgICFhY2MsIG91dHB1dF9hcnJheVxuICBlbmRcblxubGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgZG9uZTtcbiAgIXJcblxubGV0IGV4aXN0cyBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbCBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZm9yX2FsbDIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmZvcl9hbGwyXCJcbiAgZWxzZSBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4xIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIGxvb3AgKHN1Y2MgaSlcbiAgICBlbHNlIGZhbHNlIGluXG4gIGxvb3AgMFxuXG5sZXQgZXhpc3RzMiBwIGwxIGwyID1cbiAgbGV0IG4xID0gbGVuZ3RoIGwxXG4gIGFuZCBuMiA9IGxlbmd0aCBsMiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZXhpc3RzMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGwxIGkpICh1bnNhZmVfZ2V0IGwyIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEgaSkgeCA9IDAgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgbWVtcSB4IGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiB4ID09ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9vcHQgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgaWYgcCB4IHRoZW4gU29tZSB4XG4gICAgICBlbHNlIGxvb3AgKHN1Y2MgaSlcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX21hcCBmIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIE5vbmVcbiAgICBlbHNlXG4gICAgICBtYXRjaCBmICh1bnNhZmVfZ2V0IGEgaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgKHN1Y2MgaSlcbiAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICBpblxuICBsb29wIDBcblxubGV0IHNwbGl0IHggPVxuICBpZiB4ID0gW3x8XSB0aGVuIFt8fF0sIFt8fF1cbiAgZWxzZSBiZWdpblxuICAgIGxldCBhMCwgYjAgPSB1bnNhZmVfZ2V0IHggMCBpblxuICAgIGxldCBuID0gbGVuZ3RoIHggaW5cbiAgICBsZXQgYSA9IGNyZWF0ZSBuIGEwIGluXG4gICAgbGV0IGIgPSBjcmVhdGUgbiBiMCBpblxuICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgbGV0IGFpLCBiaSA9IHVuc2FmZV9nZXQgeCBpIGluXG4gICAgICB1bnNhZmVfc2V0IGEgaSBhaTtcbiAgICAgIHVuc2FmZV9zZXQgYiBpIGJpXG4gICAgZG9uZTtcbiAgICBhLCBiXG4gIGVuZFxuXG5sZXQgY29tYmluZSBhIGIgPVxuICBsZXQgbmEgPSBsZW5ndGggYSBpblxuICBsZXQgbmIgPSBsZW5ndGggYiBpblxuICBpZiBuYSA8PiBuYiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuY29tYmluZVwiO1xuICBpZiBuYSA9IDAgdGhlbiBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgeCA9IGNyZWF0ZSBuYSAodW5zYWZlX2dldCBhIDAsIHVuc2FmZV9nZXQgYiAwKSBpblxuICAgIGZvciBpID0gMSB0byBuYSAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgeCBpICh1bnNhZmVfZ2V0IGEgaSwgdW5zYWZlX2dldCBiIGkpXG4gICAgZG9uZTtcbiAgICB4XG4gIGVuZFxuXG5leGNlcHRpb24gQm90dG9tIG9mIGludFxubGV0IHNvcnQgY21wIGEgPVxuICBsZXQgbWF4c29uIGwgaSA9XG4gICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICBsZXQgeCA9IHJlZiBpMzEgaW5cbiAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgaWYgY21wIChnZXQgYSAheCkgKGdldCBhIChpMzErMikpIDwgMCB0aGVuIHggOj0gaTMxKzI7XG4gICAgICAheFxuICAgIGVuZCBlbHNlXG4gICAgICBpZiBpMzErMSA8IGwgJiYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDBcbiAgICAgIHRoZW4gaTMxKzFcbiAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgaW5cbiAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgaWYgY21wIChnZXQgYSBqKSBlID4gMCB0aGVuIGJlZ2luXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICBidWJibGVkb3duIGwgalxuICBpblxuICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICBsZXQgZmF0aGVyID0gKGkgLSAxKSAvIDMgaW5cbiAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgZmF0aGVyKTtcbiAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHNldCBhIGkgZTtcbiAgICBlbmQ7XG4gIGluXG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgbGV0IGUgPSAoZ2V0IGEgaSkgaW5cbiAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gIGRvbmU7XG4gIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cblxubGV0IGN1dG9mZiA9IDVcbmxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgbGV0IHNyYzFyID0gc3JjMW9mcyArIHNyYzFsZW4gYW5kIHNyYzJyID0gc3JjMm9mcyArIHNyYzJsZW4gaW5cbiAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBkc3QgZCBzMTtcbiAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgIGxvb3AgaTEgKGdldCBhIGkxKSBpMiBzMiAoZCArIDEpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICBpZiBpMiA8IHNyYzJyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBhIGkxIGRzdCAoZCArIDEpIChzcmMxciAtIGkxKVxuICAgICAgZW5kXG4gICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gIGluXG4gIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIChzcmNvZnMgKyBpKSkgaW5cbiAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSAoZ2V0IGRzdCAhaik7XG4gICAgICAgIGRlY3IgajtcbiAgICAgIGRvbmU7XG4gICAgICBzZXQgZHN0ICghaiArIDEpIGU7XG4gICAgZG9uZTtcbiAgaW5cbiAgbGV0IHJlYyBzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgbGV0IGwyID0gbGVuIC0gbDEgaW5cbiAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICBtZXJnZSAoc3Jjb2ZzICsgbDIpIGwxIGRzdCAoZHN0b2ZzICsgbDEpIGwyIGRzdCBkc3RvZnM7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgIGxldCBsMiA9IGwgLSBsMSBpblxuICAgIGxldCB0ID0gbWFrZSBsMiAoZ2V0IGEgMCkgaW5cbiAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgbWVyZ2UgbDIgbDEgdCAwIGwyIGEgMDtcbiAgZW5kXG5cblxubGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYSA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPCBsZW5ndGggYVxuICAgIHRoZW5cbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICBlbHNlIFNlcS5OaWxcbiAgaW5cbiAgYXV4IDBcblxubGV0IG9mX3Jldl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBsZW4gPSBsaXN0X2xlbmd0aCAwIGwgaW5cbiAgICAgIGxldCBhID0gY3JlYXRlIGxlbiBoZCBpblxuICAgICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICAgIFtdIC0+IGFcbiAgICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICAgIGluXG4gICAgICBmaWxsIChsZW4tMikgdGxcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gIG9mX3Jldl9saXN0IGxcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgTmljb2xhcyBPamVkYSBCYXIsIExleGlGaSAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgbmVnIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCBhZGQgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsIHN1YiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgbXVsIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCBkaXYgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsIHJlbSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Ztb2RfZmxvYXRcIiBcImZtb2RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZm1hIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZm1hX2Zsb2F0XCIgXCJjYW1sX2ZtYVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhYnMgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFic2Zsb2F0XCJcblxubGV0IHplcm8gPSAwLlxubGV0IG9uZSA9IDEuXG5sZXQgbWludXNfb25lID0gLTEuXG5sZXQgaW5maW5pdHkgPSBTdGRsaWIuaW5maW5pdHlcbmxldCBuZWdfaW5maW5pdHkgPSBTdGRsaWIubmVnX2luZmluaXR5XG5sZXQgbmFuID0gU3RkbGliLm5hblxubGV0IGlzX2Zpbml0ZSAoeDogZmxvYXQpID0geCAtLiB4ID0gMC5cbmxldCBpc19pbmZpbml0ZSAoeDogZmxvYXQpID0gMS4gLy4geCA9IDAuXG5sZXQgaXNfbmFuICh4OiBmbG9hdCkgPSB4IDw+IHhcblxubGV0IHBpID0gMHgxLjkyMWZiNTQ0NDJkMThwKzFcbmxldCBtYXhfZmxvYXQgPSBTdGRsaWIubWF4X2Zsb2F0XG5sZXQgbWluX2Zsb2F0ID0gU3RkbGliLm1pbl9mbG9hdFxubGV0IGVwc2lsb24gPSBTdGRsaWIuZXBzaWxvbl9mbG9hdFxuZXh0ZXJuYWwgb2ZfaW50IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCB0b19pbnQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIG9mX3N0cmluZyA6IHN0cmluZyAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdF9vZl9zdHJpbmdcIlxubGV0IG9mX3N0cmluZ19vcHQgPSBTdGRsaWIuZmxvYXRfb2Zfc3RyaW5nX29wdFxubGV0IHRvX3N0cmluZyA9IFN0ZGxpYi5zdHJpbmdfb2ZfZmxvYXRcbnR5cGUgZnBjbGFzcyA9IFN0ZGxpYi5mcGNsYXNzID1cbiAgICBGUF9ub3JtYWxcbiAgfCBGUF9zdWJub3JtYWxcbiAgfCBGUF96ZXJvXG4gIHwgRlBfaW5maW5pdGVcbiAgfCBGUF9uYW5cbmV4dGVybmFsIGNsYXNzaWZ5X2Zsb2F0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGZwY2xhc3MgPVxuICBcImNhbWxfY2xhc3NpZnlfZmxvYXRcIiBcImNhbWxfY2xhc3NpZnlfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBwb3cgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9wb3dlcl9mbG9hdFwiIFwicG93XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNxcnQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zcXJ0X2Zsb2F0XCIgXCJzcXJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNicnQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jYnJ0X2Zsb2F0XCIgXCJjYW1sX2NicnRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cDJfZmxvYXRcIiBcImNhbWxfZXhwMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2dfZmxvYXRcIiBcImxvZ1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cxMCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzEwX2Zsb2F0XCIgXCJsb2cxMFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cyIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMl9mbG9hdFwiIFwiY2FtbF9sb2cyXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cG0xIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwbTFfZmxvYXRcIiBcImNhbWxfZXhwbTFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMXAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxcF9mbG9hdFwiIFwiY2FtbF9sb2cxcFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5fZmxvYXRcIiBcInNpblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luaF9mbG9hdFwiIFwic2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NoX2Zsb2F0XCIgXCJjYW1sX2Fjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbmhfZmxvYXRcIiBcImNhbWxfYXNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuaF9mbG9hdFwiIFwiY2FtbF9hdGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmYgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9lcmZfZmxvYXRcIiBcImNhbWxfZXJmXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGVyZmMgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9lcmZjX2Zsb2F0XCIgXCJjYW1sX2VyZmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdHJ1bmMgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90cnVuY19mbG9hdFwiIFwiY2FtbF90cnVuY1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCByb3VuZCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3JvdW5kX2Zsb2F0XCIgXCJjYW1sX3JvdW5kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jZWlsX2Zsb2F0XCIgXCJjZWlsXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZmxvb3JfZmxvYXRcIiBcImZsb29yXCJcbltAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCBpc19pbnRlZ2VyIHggPSB4ID0gdHJ1bmMgeCAmJiBpc19maW5pdGUgeFxuXG5leHRlcm5hbCBuZXh0X2FmdGVyIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgPSBcImNhbWxfbmV4dGFmdGVyX2Zsb2F0XCIgXCJjYW1sX25leHRhZnRlclwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCBzdWNjIHggPSBuZXh0X2FmdGVyIHggaW5maW5pdHlcbmxldCBwcmVkIHggPSBuZXh0X2FmdGVyIHggbmVnX2luZmluaXR5XG5cbmV4dGVybmFsIGNvcHlfc2lnbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICAgICA9IFwiY2FtbF9jb3B5c2lnbl9mbG9hdFwiIFwiY2FtbF9jb3B5c2lnblwiXG4gICAgICAgICAgICAgICAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2lnbl9iaXQgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gYm9vbFxuICA9IFwiY2FtbF9zaWduYml0X2Zsb2F0XCIgXCJjYW1sX3NpZ25iaXRcIiBbQEBub2FsbG9jXVxuXG5leHRlcm5hbCBmcmV4cCA6IGZsb2F0IC0+IGZsb2F0ICogaW50ID0gXCJjYW1sX2ZyZXhwX2Zsb2F0XCJcbmV4dGVybmFsIGxkZXhwIDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IChpbnQgW0B1bnRhZ2dlZF0pIC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9sZGV4cF9mbG9hdFwiIFwiY2FtbF9sZGV4cF9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZGYgOiBmbG9hdCAtPiBmbG9hdCAqIGZsb2F0ID0gXCJjYW1sX21vZGZfZmxvYXRcIlxudHlwZSB0ID0gZmxvYXRcbmV4dGVybmFsIGNvbXBhcmUgOiBmbG9hdCAtPiBmbG9hdCAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbmxldCBlcXVhbCB4IHkgPSBjb21wYXJlIHggeSA9IDBcblxubGV0W0BpbmxpbmVdIG1pbiAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geSB0aGVuIHkgZWxzZSB4XG4gIGVsc2UgaWYgaXNfbmFuIHggdGhlbiB4IGVsc2UgeVxuXG5sZXRbQGlubGluZV0gbWF4ICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4ICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIGlzX25hbiB4IHx8IGlzX25hbiB5IHRoZW4gKG5hbiwgbmFuKVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCwgeSkgZWxzZSAoeSwgeClcblxubGV0W0BpbmxpbmVdIG1pbl9udW0gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHggdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heF9udW0gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB4IGVsc2UgeVxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcblxubGV0W0BpbmxpbmVdIG1pbl9tYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIGlzX25hbiB4IHRoZW4gKHkseSlcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuICh4LHgpXG4gIGVsc2UgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuICh4LHkpIGVsc2UgKHkseClcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOiBpbnQgLT4gaW50IC0+IGludCAtPiBmbG9hdCAtPiBpbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcblxubW9kdWxlIEFycmF5ID0gc3RydWN0XG5cbiAgdHlwZSB0ID0gZmxvYXRhcnJheVxuXG4gIGV4dGVybmFsIGxlbmd0aCA6IHQgLT4gaW50ID0gXCIlZmxvYXRhcnJheV9sZW5ndGhcIlxuICBleHRlcm5hbCBnZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9nZXRcIlxuICBleHRlcm5hbCBzZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV9zYWZlX3NldFwiXG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiB0ID0gXCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6IHQgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6IHQgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9zZXRcIlxuXG4gIGxldCB1bnNhZmVfZmlsbCBhIG9mcyBsZW4gdiA9XG4gICAgZm9yIGkgPSBvZnMgdG8gb2ZzICsgbGVuIC0gMSBkbyB1bnNhZmVfc2V0IGEgaSB2IGRvbmVcblxuICBleHRlcm5hbCB1bnNhZmVfYmxpdDogdCAtPiBpbnQgLT4gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPVxuICAgIFwiY2FtbF9mbG9hdGFycmF5X2JsaXRcIiBbQEBub2FsbG9jXVxuXG4gIGxldCBjaGVjayBhIG9mcyBsZW4gbXNnID1cbiAgICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzICsgbGVuIDwgMCB8fCBvZnMgKyBsZW4gPiBsZW5ndGggYSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBtc2dcblxuICBsZXQgbWFrZSBuIHYgPVxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbiBpblxuICAgIHVuc2FmZV9maWxsIHJlc3VsdCAwIG4gdjtcbiAgICByZXN1bHRcblxuICBsZXQgaW5pdCBsIGYgPVxuICAgIGlmIGwgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5pbml0XCJcbiAgICBlbHNlXG4gICAgICBsZXQgcmVzID0gY3JlYXRlIGwgaW5cbiAgICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICAgICBkb25lO1xuICAgICAgcmVzXG5cbiAgbGV0IGFwcGVuZCBhMSBhMiA9XG4gICAgbGV0IGwxID0gbGVuZ3RoIGExIGluXG4gICAgbGV0IGwyID0gbGVuZ3RoIGEyIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgICB1bnNhZmVfYmxpdCBhMSAwIHJlc3VsdCAwIGwxO1xuICAgIHVuc2FmZV9ibGl0IGEyIDAgcmVzdWx0IGwxIGwyO1xuICAgIHJlc3VsdFxuXG4gICgqIG5leHQgMyBmdW5jdGlvbnM6IG1vZGlmaWVkIGNvcHkgb2YgY29kZSBmcm9tIHN0cmluZy5tbCAqKVxuICBsZXQgZW5zdXJlX2dlICh4OmludCkgeSA9XG4gICAgaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuY29uY2F0XCJcblxuICBsZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIGFjYykgYWNjKSB0bFxuXG4gIGxldCBjb25jYXQgbCA9XG4gICAgbGV0IGxlbiA9IHN1bV9sZW5ndGhzIDAgbCBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGwgaSA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IChpID0gbGVuKVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBsZXQgaGxlbiA9IGxlbmd0aCBoZCBpblxuICAgICAgICB1bnNhZmVfYmxpdCBoZCAwIHJlc3VsdCBpIGhsZW47XG4gICAgICAgIGxvb3AgdGwgKGkgKyBobGVuKVxuICAgIGluXG4gICAgbG9vcCBsIDA7XG4gICAgcmVzdWx0XG5cbiAgbGV0IHN1YiBhIG9mcyBsZW4gPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LnN1YlwiO1xuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbGVuIGluXG4gICAgdW5zYWZlX2JsaXQgYSBvZnMgcmVzdWx0IDAgbGVuO1xuICAgIHJlc3VsdFxuXG4gIGxldCBjb3B5IGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGwgaW5cbiAgICB1bnNhZmVfYmxpdCBhIDAgcmVzdWx0IDAgbDtcbiAgICByZXN1bHRcblxuICBsZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gICAgY2hlY2sgYSBvZnMgbGVuIFwiRmxvYXQuQXJyYXkuZmlsbFwiO1xuICAgIHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2XG5cbiAgbGV0IGJsaXQgc3JjIHNvZnMgZHN0IGRvZnMgbGVuID1cbiAgICBjaGVjayBzcmMgc29mcyBsZW4gXCJGbG9hdC5hcnJheS5ibGl0XCI7XG4gICAgY2hlY2sgZHN0IGRvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIHVuc2FmZV9ibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlblxuXG4gIGxldCB0b19saXN0IGEgPVxuICAgIExpc3QuaW5pdCAobGVuZ3RoIGEpICh1bnNhZmVfZ2V0IGEpXG5cbiAgbGV0IG9mX2xpc3QgbCA9XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgaSBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiByZXN1bHRcbiAgICAgIHwgaCA6OiB0IC0+IHVuc2FmZV9zZXQgcmVzdWx0IGkgaDsgZmlsbCAoaSArIDEpIHRcbiAgICBpblxuICAgIGZpbGwgMCBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlcjIgZiBhIGIgPVxuICAgIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaXRlcjI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgICBlbHNlXG4gICAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxuICBsZXQgbWFwIGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbiAgbGV0IG1hcDIgZiBhIGIgPVxuICAgIGxldCBsYSA9IGxlbmd0aCBhIGluXG4gICAgbGV0IGxiID0gbGVuZ3RoIGIgaW5cbiAgICBpZiBsYSA8PiBsYiB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lm1hcDI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGNyZWF0ZSBsYSBpblxuICAgICAgZm9yIGkgPSAwIHRvIGxhIC0gMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpICh1bnNhZmVfZ2V0IGIgaSkpXG4gICAgICBkb25lO1xuICAgICAgclxuICAgIGVuZFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlcmkgZiBhID1cbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgaSAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxuICBsZXQgbWFwaSBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiBpICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb2xkX2xlZnQgZiB4IGEgPVxuICAgIGxldCByID0gcmVmIHggaW5cbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgYSBpKVxuICAgIGRvbmU7XG4gICAgIXJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvbGRfcmlnaHQgZiBhIHggPVxuICAgIGxldCByID0gcmVmIHggaW5cbiAgICBmb3IgaSA9IGxlbmd0aCBhIC0gMSBkb3dudG8gMCBkb1xuICAgICAgciA6PSBmICh1bnNhZmVfZ2V0IGEgaSkgIXJcbiAgICBkb25lO1xuICAgICFyXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBleGlzdHMgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgICBlbHNlIGxvb3AgKGkgKyAxKSBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9yX2FsbCBwIGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIHRydWVcbiAgICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gbG9vcCAoaSArIDEpXG4gICAgICBlbHNlIGZhbHNlIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBtZW0geCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgICAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEgaSkgeCA9IDAgdGhlbiB0cnVlXG4gICAgICBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogbW9zdGx5IGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCwgYnV0IHNsaWdodGx5IGRpZmZlcmVudCAqKVxuICBsZXQgbWVtX2llZWUgeCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgICAgZWxzZSBpZiB4ID0gKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgZXhjZXB0aW9uIEJvdHRvbSBvZiBpbnRcbiAgbGV0IHNvcnQgY21wIGEgPVxuICAgIGxldCBtYXhzb24gbCBpID1cbiAgICAgIGxldCBpMzEgPSBpK2kraSsxIGluXG4gICAgICBsZXQgeCA9IHJlZiBpMzEgaW5cbiAgICAgIGlmIGkzMSsyIDwgbCB0aGVuIGJlZ2luXG4gICAgICAgIGlmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwIHRoZW4geCA6PSBpMzErMTtcbiAgICAgICAgaWYgY21wIChnZXQgYSAheCkgKGdldCBhIChpMzErMikpIDwgMCB0aGVuIHggOj0gaTMxKzI7XG4gICAgICAgICF4XG4gICAgICBlbmQgZWxzZVxuICAgICAgICBpZiBpMzErMSA8IGwgJiYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDBcbiAgICAgICAgdGhlbiBpMzErMVxuICAgICAgICBlbHNlIGlmIGkzMSA8IGwgdGhlbiBpMzEgZWxzZSByYWlzZSAoQm90dG9tIGkpXG4gICAgaW5cbiAgICBsZXQgcmVjIHRyaWNrbGVkb3duIGwgaSBlID1cbiAgICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgICAgaWYgY21wIChnZXQgYSBqKSBlID4gMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBhIGkgKGdldCBhIGopO1xuICAgICAgICB0cmlja2xlZG93biBsIGogZTtcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIHNldCBhIGkgZTtcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCB0cmlja2xlIGwgaSBlID0gdHJ5IHRyaWNrbGVkb3duIGwgaSBlIHdpdGggQm90dG9tIGkgLT4gc2V0IGEgaSBlIGluXG4gICAgbGV0IHJlYyBidWJibGVkb3duIGwgaSA9XG4gICAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICAgIHNldCBhIGkgKGdldCBhIGopO1xuICAgICAgYnViYmxlZG93biBsIGpcbiAgICBpblxuICAgIGxldCBidWJibGUgbCBpID0gdHJ5IGJ1YmJsZWRvd24gbCBpIHdpdGggQm90dG9tIGkgLT4gaSBpblxuICAgIGxldCByZWMgdHJpY2tsZXVwIGkgZSA9XG4gICAgICBsZXQgZmF0aGVyID0gKGkgLSAxKSAvIDMgaW5cbiAgICAgIGFzc2VydCAoaSA8PiBmYXRoZXIpO1xuICAgICAgaWYgY21wIChnZXQgYSBmYXRoZXIpIGUgPCAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGEgaSAoZ2V0IGEgZmF0aGVyKTtcbiAgICAgICAgaWYgZmF0aGVyID4gMCB0aGVuIHRyaWNrbGV1cCBmYXRoZXIgZSBlbHNlIHNldCBhIDAgZTtcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIHNldCBhIGkgZTtcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBmb3IgaSA9IChsICsgMSkgLyAzIC0gMSBkb3dudG8gMCBkbyB0cmlja2xlIGwgaSAoZ2V0IGEgaSk7IGRvbmU7XG4gICAgZm9yIGkgPSBsIC0gMSBkb3dudG8gMiBkb1xuICAgICAgbGV0IGUgPSAoZ2V0IGEgaSkgaW5cbiAgICAgIHNldCBhIGkgKGdldCBhIDApO1xuICAgICAgdHJpY2tsZXVwIChidWJibGUgaSAwKSBlO1xuICAgIGRvbmU7XG4gICAgaWYgbCA+IDEgdGhlbiAobGV0IGUgPSAoZ2V0IGEgMSkgaW4gc2V0IGEgMSAoZ2V0IGEgMCk7IHNldCBhIDAgZSlcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwsIGV4Y2VwdCBmb3IgdGhlIGNhbGwgdG8gW2NyZWF0ZV0gKilcbiAgbGV0IGN1dG9mZiA9IDVcbiAgbGV0IHN0YWJsZV9zb3J0IGNtcCBhID1cbiAgICBsZXQgbWVyZ2Ugc3JjMW9mcyBzcmMxbGVuIHNyYzIgc3JjMm9mcyBzcmMybGVuIGRzdCBkc3RvZnMgPVxuICAgICAgbGV0IHNyYzFyID0gc3JjMW9mcyArIHNyYzFsZW4gYW5kIHNyYzJyID0gc3JjMm9mcyArIHNyYzJsZW4gaW5cbiAgICAgIGxldCByZWMgbG9vcCBpMSBzMSBpMiBzMiBkID1cbiAgICAgICAgaWYgY21wIHMxIHMyIDw9IDAgdGhlbiBiZWdpblxuICAgICAgICAgIHNldCBkc3QgZCBzMTtcbiAgICAgICAgICBsZXQgaTEgPSBpMSArIDEgaW5cbiAgICAgICAgICBpZiBpMSA8IHNyYzFyIHRoZW5cbiAgICAgICAgICAgIGxvb3AgaTEgKGdldCBhIGkxKSBpMiBzMiAoZCArIDEpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgYmxpdCBzcmMyIGkyIGRzdCAoZCArIDEpIChzcmMyciAtIGkyKVxuICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgIHNldCBkc3QgZCBzMjtcbiAgICAgICAgICBsZXQgaTIgPSBpMiArIDEgaW5cbiAgICAgICAgICBpZiBpMiA8IHNyYzJyIHRoZW5cbiAgICAgICAgICAgIGxvb3AgaTEgczEgaTIgKGdldCBzcmMyIGkyKSAoZCArIDEpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgYmxpdCBhIGkxIGRzdCAoZCArIDEpIChzcmMxciAtIGkxKVxuICAgICAgICBlbmRcbiAgICAgIGluIGxvb3Agc3JjMW9mcyAoZ2V0IGEgc3JjMW9mcykgc3JjMm9mcyAoZ2V0IHNyYzIgc3JjMm9mcykgZHN0b2ZzO1xuICAgIGluXG4gICAgbGV0IGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgIGxldCBlID0gKGdldCBhIChzcmNvZnMgKyBpKSkgaW5cbiAgICAgICAgbGV0IGogPSByZWYgKGRzdG9mcyArIGkgLSAxKSBpblxuICAgICAgICB3aGlsZSAoIWogPj0gZHN0b2ZzICYmIGNtcCAoZ2V0IGRzdCAhaikgZSA+IDApIGRvXG4gICAgICAgICAgc2V0IGRzdCAoIWogKyAxKSAoZ2V0IGRzdCAhaik7XG4gICAgICAgICAgZGVjciBqO1xuICAgICAgICBkb25lO1xuICAgICAgICBzZXQgZHN0ICghaiArIDEpIGU7XG4gICAgICBkb25lO1xuICAgIGluXG4gICAgbGV0IHJlYyBzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICAgIGlmIGxlbiA8PSBjdXRvZmYgdGhlbiBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBsMSA9IGxlbiAvIDIgaW5cbiAgICAgICAgbGV0IGwyID0gbGVuIC0gbDEgaW5cbiAgICAgICAgc29ydHRvIChzcmNvZnMgKyBsMSkgZHN0IChkc3RvZnMgKyBsMSkgbDI7XG4gICAgICAgIHNvcnR0byBzcmNvZnMgYSAoc3Jjb2ZzICsgbDIpIGwxO1xuICAgICAgICBtZXJnZSAoc3Jjb2ZzICsgbDIpIGwxIGRzdCAoZHN0b2ZzICsgbDEpIGwyIGRzdCBkc3RvZnM7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgaWYgbCA8PSBjdXRvZmYgdGhlbiBpc29ydHRvIDAgYSAwIGwgZWxzZSBiZWdpblxuICAgICAgbGV0IGwxID0gbCAvIDIgaW5cbiAgICAgIGxldCBsMiA9IGwgLSBsMSBpblxuICAgICAgbGV0IHQgPSBjcmVhdGUgbDIgaW5cbiAgICAgIHNvcnR0byBsMSB0IDAgbDI7XG4gICAgICBzb3J0dG8gMCBhIGwyIGwxO1xuICAgICAgbWVyZ2UgbDIgbDEgdCAwIGwyIGEgMDtcbiAgICBlbmRcblxuICBsZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IHRvX3NlcSBhID1cbiAgICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAgIGlmIGkgPCBsZW5ndGggYVxuICAgICAgdGhlblxuICAgICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gICAgICBlbHNlIFNlcS5OaWxcbiAgICBpblxuICAgIGF1eCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCB0b19zZXFpIGEgPVxuICAgIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgICB0aGVuXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gICAgICBlbHNlIFNlcS5OaWxcbiAgICBpblxuICAgIGF1eCAwXG5cbiAgKCogbW9zdGx5IGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgb2ZfcmV2X2xpc3QgbCA9XG4gICAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIGwgaW5cbiAgICBsZXQgYSA9IGNyZWF0ZSBsZW4gaW5cbiAgICBsZXQgcmVjIGZpbGwgaSA9IGZ1bmN0aW9uXG4gICAgICAgIFtdIC0+IGFcbiAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpLTEpIHRsXG4gICAgaW5cbiAgICBmaWxsIChsZW4tMSkgbFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgb2Zfc2VxIGkgPVxuICAgIGxldCBsID0gU2VxLmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IHg6OmFjYykgW10gaSBpblxuICAgIG9mX3Jldl9saXN0IGxcblxuXG4gIGxldCBtYXBfdG9fYXJyYXkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgaWYgbCA9IDAgdGhlbiBbfCB8XSBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IEFycmF5Lm1ha2UgbCAoZiAodW5zYWZlX2dldCBhIDApKSBpblxuICAgICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICAgIEFycmF5LnVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgICBkb25lO1xuICAgICAgclxuICAgIGVuZFxuXG4gIGxldCBtYXBfZnJvbV9hcnJheSBmIGEgPVxuICAgIGxldCBsID0gQXJyYXkubGVuZ3RoIGEgaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiAoQXJyYXkudW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG5lbmRcblxubW9kdWxlIEFycmF5TGFiZWxzID0gQXJyYXlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQzMl06IDMyLWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50MzIgLT4gaW50IC0+IGludDMyID0gXCIlaW50MzJfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQzMiA9IFwiJWludDMyX29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQzMiAtPiBpbnQgPSBcIiVpbnQzMl90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQzMlxuICA9IFwiY2FtbF9pbnQzMl9vZl9mbG9hdFwiIFwiY2FtbF9pbnQzMl9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50MzIgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50MzJfdG9fZmxvYXRcIiBcImNhbWxfaW50MzJfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBiaXRzX29mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdFwiIFwiY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvYXRfb2ZfYml0cyA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNcIiBcImNhbWxfaW50MzJfZmxvYXRfb2ZfYml0c191bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxubGV0IHplcm8gPSAwbFxubGV0IG9uZSA9IDFsXG5sZXQgbWludXNfb25lID0gLTFsXG5sZXQgc3VjYyBuID0gYWRkIG4gMWxcbmxldCBwcmVkIG4gPSBzdWIgbiAxbFxubGV0IGFicyBuID0gaWYgbiA+PSAwbCB0aGVuIG4gZWxzZSBuZWcgblxubGV0IG1pbl9pbnQgPSAweDgwMDAwMDAwbFxubGV0IG1heF9pbnQgPSAweDdGRkZGRkZGbFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xbClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIG1hdGNoIFN5cy53b3JkX3NpemUgd2l0aFxuICB8IDMyIC0+XG4gICAgICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICAgICAgZnVuIG4gLT5cbiAgICAgICAgaWYgY29tcGFyZSB6ZXJvIG4gPD0gMCAmJiBjb21wYXJlIG4gbWF4X2ludCA8PSAwIHRoZW5cbiAgICAgICAgICBTb21lICh0b19pbnQgbilcbiAgICAgICAgZWxzZVxuICAgICAgICAgIE5vbmVcbiAgfCA2NCAtPlxuICAgICAgKCogU28gdGhhdCBpdCBjb21waWxlcyBpbiAzMi1iaXQgKilcbiAgICAgIGxldCBtYXNrID0gMHhGRkZGIGxzbCAxNiBsb3IgMHhGRkZGIGluXG4gICAgICBmdW4gbiAtPiBTb21lICh0b19pbnQgbiBsYW5kIG1hc2spXG4gIHwgXyAtPlxuICAgICAgYXNzZXJ0IGZhbHNlXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBpbnQzMiAtPiBzdHJpbmcgPSBcImNhbWxfaW50MzJfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzIgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IGV4cG9zZSBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZSBkaXJlY3RseS4gKilcbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbnR5cGUgdCA9IGludDMyXG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWVcbiAgIGJpdG5lc3MuIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIG4gZCA8IDAgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgciBkID49IDAgdGhlbiBzdWNjIHEgZWxzZSBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtJbnQ2NF06IDY0LWJpdCBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWcgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X25lZ1wiXG5leHRlcm5hbCBhZGQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FkZFwiXG5leHRlcm5hbCBzdWIgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3N1YlwiXG5leHRlcm5hbCBtdWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X211bFwiXG5leHRlcm5hbCBkaXYgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2RpdlwiXG5leHRlcm5hbCByZW0gOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X21vZFwiXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X2FuZFwiXG5leHRlcm5hbCBsb2dvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNyXCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQgOiBpbnQ2NCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfdG9fZmxvYXRcIiBcImNhbWxfaW50NjRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzIgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX25hdGl2ZWludFwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnQgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuXG5sZXQgemVybyA9IDBMXG5sZXQgb25lID0gMUxcbmxldCBtaW51c19vbmUgPSAtMUxcbmxldCBzdWNjIG4gPSBhZGQgbiAxTFxubGV0IHByZWQgbiA9IHN1YiBuIDFMXG5sZXQgYWJzIG4gPSBpZiBuID49IDBMIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDAwMDAwMDAwMExcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRkZGRkZGRkZGTFxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xTClcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgY29tcGFyZSB6ZXJvIG4gPD0gMCAmJiBjb21wYXJlIG4gbWF4X2ludCA8PSAwIHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZyA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxubGV0IHRvX3N0cmluZyBuID0gZm9ybWF0IFwiJWRcIiBuXG5cbmV4dGVybmFsIG9mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQ2NCA9IFwiY2FtbF9pbnQ2NF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogZXhwb3NlIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlIGRpcmVjdGx5LiAqKVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuXG5cbmV4dGVybmFsIGJpdHNfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XCIgXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9hdF9vZl9iaXRzIDogaW50NjQgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1wiIFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzX3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG50eXBlIHQgPSBpbnQ2NFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lXG4gICBiaXRuZXNzLiBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSBuIGQgPCAwIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIHIgZCA+PSAwIHRoZW4gc3VjYyBxIGVsc2UgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbTmF0aXZlaW50XTogcHJvY2Vzc29yLW5hdGl2ZSBpbnRlZ2VycyAqKVxuXG5leHRlcm5hbCBuZWc6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbmVnXCJcbmV4dGVybmFsIGFkZDogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfYWRkXCJcbmV4dGVybmFsIHN1YjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfc3ViXCJcbmV4dGVybmFsIG11bDogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbXVsXCJcbmV4dGVybmFsIGRpdjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfZGl2XCJcbmV4dGVybmFsIHJlbTogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbW9kXCJcbmV4dGVybmFsIGxvZ2FuZDogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfYW5kXCJcbmV4dGVybmFsIGxvZ29yOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vclwiXG5leHRlcm5hbCBsb2d4b3I6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X3hvclwiXG5leHRlcm5hbCBzaGlmdF9sZWZ0OiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQ6IG5hdGl2ZWludCAtPiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FzclwiXG5leHRlcm5hbCBzaGlmdF9yaWdodF9sb2dpY2FsOiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9sc3JcIlxuZXh0ZXJuYWwgb2ZfaW50OiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X29mX2ludFwiXG5leHRlcm5hbCB0b19pbnQ6IG5hdGl2ZWludCAtPiBpbnQgPSBcIiVuYXRpdmVpbnRfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gbmF0aXZlaW50XG4gID0gXCJjYW1sX25hdGl2ZWludF9vZl9mbG9hdFwiIFwiY2FtbF9uYXRpdmVpbnRfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IG5hdGl2ZWludCAtPiBmbG9hdFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfdG9fZmxvYXRcIiBcImNhbWxfbmF0aXZlaW50X3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgb2ZfaW50MzI6IGludDMyIC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vZl9pbnQzMlwiXG5leHRlcm5hbCB0b19pbnQzMjogbmF0aXZlaW50IC0+IGludDMyID0gXCIlbmF0aXZlaW50X3RvX2ludDMyXCJcblxubGV0IHplcm8gPSAwblxubGV0IG9uZSA9IDFuXG5sZXQgbWludXNfb25lID0gLTFuXG5sZXQgc3VjYyBuID0gYWRkIG4gMW5cbmxldCBwcmVkIG4gPSBzdWIgbiAxblxubGV0IGFicyBuID0gaWYgbiA+PSAwbiB0aGVuIG4gZWxzZSBuZWcgblxubGV0IHNpemUgPSBTeXMud29yZF9zaXplXG5sZXQgbWluX2ludCA9IHNoaWZ0X2xlZnQgMW4gKHNpemUgLSAxKVxubGV0IG1heF9pbnQgPSBzdWIgbWluX2ludCAxblxubGV0IGxvZ25vdCBuID0gbG9neG9yIG4gKC0xbilcblxubGV0IHVuc2lnbmVkX3RvX2ludCA9XG4gIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gIGZ1biBuIC0+XG4gICAgaWYgY29tcGFyZSB6ZXJvIG4gPD0gMCAmJiBjb21wYXJlIG4gbWF4X2ludCA8PSAwIHRoZW5cbiAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IG5hdGl2ZWludCAtPiBzdHJpbmcgPSBcImNhbWxfbmF0aXZlaW50X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nOiBzdHJpbmcgLT4gbmF0aXZlaW50ID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogZXhwb3NlIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlIGRpcmVjdGx5LiAqKVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxudHlwZSB0ID0gbmF0aXZlaW50XG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWVcbiAgIGJpdG5lc3MuIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIG4gZCA8IDAgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgciBkID49IDAgdGhlbiBzdWNjIHEgZWxzZSBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogVGhlIHJ1bi10aW1lIGxpYnJhcnkgZm9yIGxleGVycyBnZW5lcmF0ZWQgYnkgY2FtbGxleCAqKVxuXG50eXBlIHBvc2l0aW9uID0ge1xuICBwb3NfZm5hbWUgOiBzdHJpbmc7XG4gIHBvc19sbnVtIDogaW50O1xuICBwb3NfYm9sIDogaW50O1xuICBwb3NfY251bSA6IGludDtcbn1cblxubGV0IGR1bW15X3BvcyA9IHtcbiAgcG9zX2ZuYW1lID0gXCJcIjtcbiAgcG9zX2xudW0gPSAwO1xuICBwb3NfYm9sID0gMDtcbiAgcG9zX2NudW0gPSAtMTtcbn1cblxudHlwZSBsZXhidWYgPVxuICB7IHJlZmlsbF9idWZmIDogbGV4YnVmIC0+IHVuaXQ7XG4gICAgbXV0YWJsZSBsZXhfYnVmZmVyIDogYnl0ZXM7XG4gICAgbXV0YWJsZSBsZXhfYnVmZmVyX2xlbiA6IGludDtcbiAgICBtdXRhYmxlIGxleF9hYnNfcG9zIDogaW50O1xuICAgIG11dGFibGUgbGV4X3N0YXJ0X3BvcyA6IGludDtcbiAgICBtdXRhYmxlIGxleF9jdXJyX3BvcyA6IGludDtcbiAgICBtdXRhYmxlIGxleF9sYXN0X3BvcyA6IGludDtcbiAgICBtdXRhYmxlIGxleF9sYXN0X2FjdGlvbiA6IGludDtcbiAgICBtdXRhYmxlIGxleF9lb2ZfcmVhY2hlZCA6IGJvb2w7XG4gICAgbXV0YWJsZSBsZXhfbWVtIDogaW50IGFycmF5O1xuICAgIG11dGFibGUgbGV4X3N0YXJ0X3AgOiBwb3NpdGlvbjtcbiAgICBtdXRhYmxlIGxleF9jdXJyX3AgOiBwb3NpdGlvbjtcbiAgfVxuXG50eXBlIGxleF90YWJsZXMgPVxuICB7IGxleF9iYXNlOiBzdHJpbmc7XG4gICAgbGV4X2JhY2t0cms6IHN0cmluZztcbiAgICBsZXhfZGVmYXVsdDogc3RyaW5nO1xuICAgIGxleF90cmFuczogc3RyaW5nO1xuICAgIGxleF9jaGVjazogc3RyaW5nO1xuICAgIGxleF9iYXNlX2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X2JhY2t0cmtfY29kZSA6IHN0cmluZztcbiAgICBsZXhfZGVmYXVsdF9jb2RlIDogc3RyaW5nO1xuICAgIGxleF90cmFuc19jb2RlIDogc3RyaW5nO1xuICAgIGxleF9jaGVja19jb2RlIDogc3RyaW5nO1xuICAgIGxleF9jb2RlOiBzdHJpbmc7fVxuXG5leHRlcm5hbCBjX2VuZ2luZSA6IGxleF90YWJsZXMgLT4gaW50IC0+IGxleGJ1ZiAtPiBpbnQgPSBcImNhbWxfbGV4X2VuZ2luZVwiXG5leHRlcm5hbCBjX25ld19lbmdpbmUgOiBsZXhfdGFibGVzIC0+IGludCAtPiBsZXhidWYgLT4gaW50XG4gICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbmV3X2xleF9lbmdpbmVcIlxuXG5sZXQgZW5naW5lIHRibCBzdGF0ZSBidWYgPVxuICBsZXQgcmVzdWx0ID0gY19lbmdpbmUgdGJsIHN0YXRlIGJ1ZiBpblxuICBpZiByZXN1bHQgPj0gMCAmJiBidWYubGV4X2N1cnJfcCAhPSBkdW1teV9wb3MgdGhlbiBiZWdpblxuICAgIGJ1Zi5sZXhfc3RhcnRfcCA8LSBidWYubGV4X2N1cnJfcDtcbiAgICBidWYubGV4X2N1cnJfcCA8LSB7YnVmLmxleF9jdXJyX3BcbiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBwb3NfY251bSA9IGJ1Zi5sZXhfYWJzX3BvcyArIGJ1Zi5sZXhfY3Vycl9wb3N9O1xuICBlbmQ7XG4gIHJlc3VsdFxuXG5cbmxldCBuZXdfZW5naW5lIHRibCBzdGF0ZSBidWYgPVxuICBsZXQgcmVzdWx0ID0gY19uZXdfZW5naW5lIHRibCBzdGF0ZSBidWYgaW5cbiAgaWYgcmVzdWx0ID49IDAgJiYgYnVmLmxleF9jdXJyX3AgIT0gZHVtbXlfcG9zIHRoZW4gYmVnaW5cbiAgICBidWYubGV4X3N0YXJ0X3AgPC0gYnVmLmxleF9jdXJyX3A7XG4gICAgYnVmLmxleF9jdXJyX3AgPC0ge2J1Zi5sZXhfY3Vycl9wXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggcG9zX2NudW0gPSBidWYubGV4X2Fic19wb3MgKyBidWYubGV4X2N1cnJfcG9zfTtcbiAgZW5kO1xuICByZXN1bHRcblxubGV0IGxleF9yZWZpbGwgcmVhZF9mdW4gYXV4X2J1ZmZlciBsZXhidWYgPVxuICBsZXQgcmVhZCA9XG4gICAgcmVhZF9mdW4gYXV4X2J1ZmZlciAoQnl0ZXMubGVuZ3RoIGF1eF9idWZmZXIpIGluXG4gIGxldCBuID1cbiAgICBpZiByZWFkID4gMFxuICAgIHRoZW4gcmVhZFxuICAgIGVsc2UgKGxleGJ1Zi5sZXhfZW9mX3JlYWNoZWQgPC0gdHJ1ZTsgMCkgaW5cbiAgKCogQ3VycmVudCBzdGF0ZSBvZiB0aGUgYnVmZmVyOlxuICAgICAgICA8LS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0+XG4gICAgICAgIHwgIGp1bmsgfCAgICAgIHZhbGlkIGRhdGEgICAgIHwgICBqdW5rICAgIHxcbiAgICAgICAgXiAgICAgICBeICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgXlxuICAgICAgICAwICAgIHN0YXJ0X3BvcyAgICAgICAgICAgICBidWZmZXJfZW5kICAgIEJ5dGVzLmxlbmd0aCBidWZmZXJcbiAgKilcbiAgaWYgbGV4YnVmLmxleF9idWZmZXJfbGVuICsgbiA+IEJ5dGVzLmxlbmd0aCBsZXhidWYubGV4X2J1ZmZlciB0aGVuIGJlZ2luXG4gICAgKCogVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKilcbiAgICBpZiBsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3BvcyArIG5cbiAgICAgICA8PSBCeXRlcy5sZW5ndGggbGV4YnVmLmxleF9idWZmZXJcbiAgICB0aGVuIGJlZ2luXG4gICAgICAoKiBCdXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGlmIHdlIHJlY2xhaW0gdGhlIGp1bmsgYXQgdGhlIGJlZ2lubmluZ1xuICAgICAgICAgb2YgdGhlIGJ1ZmZlciAqKVxuICAgICAgQnl0ZXMuYmxpdCBsZXhidWYubGV4X2J1ZmZlciBsZXhidWYubGV4X3N0YXJ0X3Bvc1xuICAgICAgICAgICAgICAgICAgbGV4YnVmLmxleF9idWZmZXIgMFxuICAgICAgICAgICAgICAgICAgKGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zKVxuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAoKiBXZSBtdXN0IGdyb3cgdGhlIGJ1ZmZlci4gIERvdWJsaW5nIGl0cyBzaXplIHdpbGwgcHJvdmlkZSBlbm91Z2hcbiAgICAgICAgIHNwYWNlIHNpbmNlIG4gPD0gU3RyaW5nLmxlbmd0aCBhdXhfYnVmZmVyIDw9IFN0cmluZy5sZW5ndGggYnVmZmVyLlxuICAgICAgICAgV2F0Y2ggb3V0IGZvciBzdHJpbmcgbGVuZ3RoIG92ZXJmbG93LCB0aG91Z2guICopXG4gICAgICBsZXQgbmV3bGVuID1cbiAgICAgICAgSW50Lm1pbiAoMiAqIEJ5dGVzLmxlbmd0aCBsZXhidWYubGV4X2J1ZmZlcikgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIGluXG4gICAgICBpZiBsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3BvcyArIG4gPiBuZXdsZW5cbiAgICAgIHRoZW4gZmFpbHdpdGggXCJMZXhpbmcubGV4X3JlZmlsbDogY2Fubm90IGdyb3cgYnVmZmVyXCI7XG4gICAgICBsZXQgbmV3YnVmID0gQnl0ZXMuY3JlYXRlIG5ld2xlbiBpblxuICAgICAgKCogQ29weSB0aGUgdmFsaWQgZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgYnVmZmVyICopXG4gICAgICBCeXRlcy5ibGl0IGxleGJ1Zi5sZXhfYnVmZmVyIGxleGJ1Zi5sZXhfc3RhcnRfcG9zXG4gICAgICAgICAgICAgICAgICBuZXdidWYgMFxuICAgICAgICAgICAgICAgICAgKGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zKTtcbiAgICAgIGxleGJ1Zi5sZXhfYnVmZmVyIDwtIG5ld2J1ZlxuICAgIGVuZDtcbiAgICAoKiBSZWFsbG9jYXRpb24gb3Igbm90LCB3ZSBoYXZlIHNoaWZ0ZWQgdGhlIGRhdGEgbGVmdCBieVxuICAgICAgIHN0YXJ0X3BvcyBjaGFyYWN0ZXJzOyB1cGRhdGUgdGhlIHBvc2l0aW9ucyAqKVxuICAgIGxldCBzID0gbGV4YnVmLmxleF9zdGFydF9wb3MgaW5cbiAgICBsZXhidWYubGV4X2Fic19wb3MgPC0gbGV4YnVmLmxleF9hYnNfcG9zICsgcztcbiAgICBsZXhidWYubGV4X2N1cnJfcG9zIDwtIGxleGJ1Zi5sZXhfY3Vycl9wb3MgLSBzO1xuICAgIGxleGJ1Zi5sZXhfc3RhcnRfcG9zIDwtIDA7XG4gICAgbGV4YnVmLmxleF9sYXN0X3BvcyA8LSBsZXhidWYubGV4X2xhc3RfcG9zIC0gcztcbiAgICBsZXhidWYubGV4X2J1ZmZlcl9sZW4gPC0gbGV4YnVmLmxleF9idWZmZXJfbGVuIC0gcyA7XG4gICAgbGV0IHQgPSBsZXhidWYubGV4X21lbSBpblxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggdC0xIGRvXG4gICAgICBsZXQgdiA9IHQuKGkpIGluXG4gICAgICBpZiB2ID49IDAgdGhlblxuICAgICAgICB0LihpKSA8LSB2LXNcbiAgICBkb25lXG4gIGVuZDtcbiAgKCogVGhlcmUgaXMgbm93IGVub3VnaCBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKilcbiAgQnl0ZXMuYmxpdCBhdXhfYnVmZmVyIDAgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9idWZmZXJfbGVuIG47XG4gIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiA8LSBsZXhidWYubGV4X2J1ZmZlcl9sZW4gKyBuXG5cbmxldCB6ZXJvX3BvcyA9IHtcbiAgcG9zX2ZuYW1lID0gXCJcIjtcbiAgcG9zX2xudW0gPSAxO1xuICBwb3NfYm9sID0gMDtcbiAgcG9zX2NudW0gPSAwO1xufVxuXG5sZXQgZnJvbV9mdW5jdGlvbiA/KHdpdGhfcG9zaXRpb25zID0gdHJ1ZSkgZiA9XG4gIHsgcmVmaWxsX2J1ZmYgPSBsZXhfcmVmaWxsIGYgKEJ5dGVzLmNyZWF0ZSA1MTIpO1xuICAgIGxleF9idWZmZXIgPSBCeXRlcy5jcmVhdGUgMTAyNDtcbiAgICBsZXhfYnVmZmVyX2xlbiA9IDA7XG4gICAgbGV4X2Fic19wb3MgPSAwO1xuICAgIGxleF9zdGFydF9wb3MgPSAwO1xuICAgIGxleF9jdXJyX3BvcyA9IDA7XG4gICAgbGV4X2xhc3RfcG9zID0gMDtcbiAgICBsZXhfbGFzdF9hY3Rpb24gPSAwO1xuICAgIGxleF9tZW0gPSBbfHxdO1xuICAgIGxleF9lb2ZfcmVhY2hlZCA9IGZhbHNlO1xuICAgIGxleF9zdGFydF9wID0gaWYgd2l0aF9wb3NpdGlvbnMgdGhlbiB6ZXJvX3BvcyBlbHNlIGR1bW15X3BvcztcbiAgICBsZXhfY3Vycl9wID0gaWYgd2l0aF9wb3NpdGlvbnMgdGhlbiB6ZXJvX3BvcyBlbHNlIGR1bW15X3BvcztcbiAgfVxuXG5sZXQgZnJvbV9jaGFubmVsID93aXRoX3Bvc2l0aW9ucyBpYyA9XG4gIGZyb21fZnVuY3Rpb24gP3dpdGhfcG9zaXRpb25zIChmdW4gYnVmIG4gLT4gaW5wdXQgaWMgYnVmIDAgbilcblxubGV0IGZyb21fc3RyaW5nID8od2l0aF9wb3NpdGlvbnMgPSB0cnVlKSBzID1cbiAgeyByZWZpbGxfYnVmZiA9IChmdW4gbGV4YnVmIC0+IGxleGJ1Zi5sZXhfZW9mX3JlYWNoZWQgPC0gdHJ1ZSk7XG4gICAgbGV4X2J1ZmZlciA9IEJ5dGVzLm9mX3N0cmluZyBzOyAoKiBoYXZlIHRvIG1ha2UgYSBjb3B5IGZvciBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHVuc2FmZS1zdHJpbmcgbW9kZSAqKVxuICAgIGxleF9idWZmZXJfbGVuID0gU3RyaW5nLmxlbmd0aCBzO1xuICAgIGxleF9hYnNfcG9zID0gMDtcbiAgICBsZXhfc3RhcnRfcG9zID0gMDtcbiAgICBsZXhfY3Vycl9wb3MgPSAwO1xuICAgIGxleF9sYXN0X3BvcyA9IDA7XG4gICAgbGV4X2xhc3RfYWN0aW9uID0gMDtcbiAgICBsZXhfbWVtID0gW3x8XTtcbiAgICBsZXhfZW9mX3JlYWNoZWQgPSB0cnVlO1xuICAgIGxleF9zdGFydF9wID0gaWYgd2l0aF9wb3NpdGlvbnMgdGhlbiB6ZXJvX3BvcyBlbHNlIGR1bW15X3BvcztcbiAgICBsZXhfY3Vycl9wID0gaWYgd2l0aF9wb3NpdGlvbnMgdGhlbiB6ZXJvX3BvcyBlbHNlIGR1bW15X3BvcztcbiAgfVxuXG5sZXQgc2V0X3Bvc2l0aW9uIGxleGJ1ZiBwb3NpdGlvbiA9XG4gIGxleGJ1Zi5sZXhfY3Vycl9wICA8LSB7cG9zaXRpb24gd2l0aCBwb3NfZm5hbWUgPSBsZXhidWYubGV4X2N1cnJfcC5wb3NfZm5hbWV9O1xuICBsZXhidWYubGV4X2Fic19wb3MgPC0gcG9zaXRpb24ucG9zX2NudW1cblxubGV0IHNldF9maWxlbmFtZSBsZXhidWYgZm5hbWUgPVxuICBsZXhidWYubGV4X2N1cnJfcCA8LSB7bGV4YnVmLmxleF9jdXJyX3Agd2l0aCBwb3NfZm5hbWUgPSBmbmFtZX1cblxubGV0IHdpdGhfcG9zaXRpb25zIGxleGJ1ZiA9IGxleGJ1Zi5sZXhfY3Vycl9wICE9IGR1bW15X3Bvc1xuXG5sZXQgbGV4ZW1lIGxleGJ1ZiA9XG4gIGxldCBsZW4gPSBsZXhidWYubGV4X2N1cnJfcG9zIC0gbGV4YnVmLmxleF9zdGFydF9wb3MgaW5cbiAgQnl0ZXMuc3ViX3N0cmluZyBsZXhidWYubGV4X2J1ZmZlciBsZXhidWYubGV4X3N0YXJ0X3BvcyBsZW5cblxubGV0IHN1Yl9sZXhlbWUgbGV4YnVmIGkxIGkyID1cbiAgbGV0IGxlbiA9IGkyLWkxIGluXG4gIEJ5dGVzLnN1Yl9zdHJpbmcgbGV4YnVmLmxleF9idWZmZXIgaTEgbGVuXG5cbmxldCBzdWJfbGV4ZW1lX29wdCBsZXhidWYgaTEgaTIgPVxuICBpZiBpMSA+PSAwIHRoZW4gYmVnaW5cbiAgICBsZXQgbGVuID0gaTItaTEgaW5cbiAgICBTb21lIChCeXRlcy5zdWJfc3RyaW5nIGxleGJ1Zi5sZXhfYnVmZmVyIGkxIGxlbilcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBOb25lXG4gIGVuZFxuXG5sZXQgc3ViX2xleGVtZV9jaGFyIGxleGJ1ZiBpID0gQnl0ZXMuZ2V0IGxleGJ1Zi5sZXhfYnVmZmVyIGlcblxubGV0IHN1Yl9sZXhlbWVfY2hhcl9vcHQgbGV4YnVmIGkgPVxuICBpZiBpID49IDAgdGhlblxuICAgIFNvbWUgKEJ5dGVzLmdldCBsZXhidWYubGV4X2J1ZmZlciBpKVxuICBlbHNlXG4gICAgTm9uZVxuXG5cbmxldCBsZXhlbWVfY2hhciBsZXhidWYgaSA9XG4gIEJ5dGVzLmdldCBsZXhidWYubGV4X2J1ZmZlciAobGV4YnVmLmxleF9zdGFydF9wb3MgKyBpKVxuXG5sZXQgbGV4ZW1lX3N0YXJ0IGxleGJ1ZiA9IGxleGJ1Zi5sZXhfc3RhcnRfcC5wb3NfY251bVxubGV0IGxleGVtZV9lbmQgbGV4YnVmID0gbGV4YnVmLmxleF9jdXJyX3AucG9zX2NudW1cblxubGV0IGxleGVtZV9zdGFydF9wIGxleGJ1ZiA9IGxleGJ1Zi5sZXhfc3RhcnRfcFxubGV0IGxleGVtZV9lbmRfcCBsZXhidWYgPSBsZXhidWYubGV4X2N1cnJfcFxuXG5sZXQgbmV3X2xpbmUgbGV4YnVmID1cbiAgbGV0IGxjcCA9IGxleGJ1Zi5sZXhfY3Vycl9wIGluXG4gIGlmIGxjcCAhPSBkdW1teV9wb3MgdGhlblxuICAgIGxleGJ1Zi5sZXhfY3Vycl9wIDwtXG4gICAgICB7IGxjcCB3aXRoXG4gICAgICAgIHBvc19sbnVtID0gbGNwLnBvc19sbnVtICsgMTtcbiAgICAgICAgcG9zX2JvbCA9IGxjcC5wb3NfY251bTtcbiAgICAgIH1cblxuXG5cbigqIERpc2NhcmQgZGF0YSBsZWZ0IGluIGxleGVyIGJ1ZmZlci4gKilcblxubGV0IGZsdXNoX2lucHV0IGxiID1cbiAgbGIubGV4X2N1cnJfcG9zIDwtIDA7XG4gIGxiLmxleF9hYnNfcG9zIDwtIDA7XG4gIGxldCBsY3AgPSBsYi5sZXhfY3Vycl9wIGluXG4gIGlmIGxjcCAhPSBkdW1teV9wb3MgdGhlblxuICAgIGxiLmxleF9jdXJyX3AgPC0ge3plcm9fcG9zIHdpdGggcG9zX2ZuYW1lID0gbGNwLnBvc19mbmFtZX07XG4gIGxiLmxleF9idWZmZXJfbGVuIDwtIDA7XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFRoZSBwYXJzaW5nIGVuZ2luZSAqKVxuXG5vcGVuIExleGluZ1xuXG4oKiBJbnRlcm5hbCBpbnRlcmZhY2UgdG8gdGhlIHBhcnNpbmcgZW5naW5lICopXG5cbnR5cGUgcGFyc2VyX2VudiA9XG4gIHsgbXV0YWJsZSBzX3N0YWNrIDogaW50IGFycmF5OyAgICAgICAgKCogU3RhdGVzICopXG4gICAgbXV0YWJsZSB2X3N0YWNrIDogT2JqLnQgYXJyYXk7ICAgICAgKCogU2VtYW50aWMgYXR0cmlidXRlcyAqKVxuICAgIG11dGFibGUgc3ltYl9zdGFydF9zdGFjayA6IHBvc2l0aW9uIGFycmF5OyAoKiBTdGFydCBwb3NpdGlvbnMgKilcbiAgICBtdXRhYmxlIHN5bWJfZW5kX3N0YWNrIDogcG9zaXRpb24gYXJyYXk7ICAgKCogRW5kIHBvc2l0aW9ucyAqKVxuICAgIG11dGFibGUgc3RhY2tzaXplIDogaW50OyAgICAgICAgICAgICgqIFNpemUgb2YgdGhlIHN0YWNrcyAqKVxuICAgIG11dGFibGUgc3RhY2tiYXNlIDogaW50OyAgICAgICAgICAgICgqIEJhc2Ugc3AgZm9yIGN1cnJlbnQgcGFyc2UgKilcbiAgICBtdXRhYmxlIGN1cnJfY2hhciA6IGludDsgICAgICAgICAgICAoKiBMYXN0IHRva2VuIHJlYWQgKilcbiAgICBtdXRhYmxlIGx2YWwgOiBPYmoudDsgICAgICAgICAgICAgICAoKiBJdHMgc2VtYW50aWMgYXR0cmlidXRlICopXG4gICAgbXV0YWJsZSBzeW1iX3N0YXJ0IDogcG9zaXRpb247ICAgICAgKCogU3RhcnQgcG9zLiBvZiB0aGUgY3VycmVudCBzeW1ib2wqKVxuICAgIG11dGFibGUgc3ltYl9lbmQgOiBwb3NpdGlvbjsgICAgICAgICgqIEVuZCBwb3MuIG9mIHRoZSBjdXJyZW50IHN5bWJvbCAqKVxuICAgIG11dGFibGUgYXNwIDogaW50OyAgICAgICAgICAgICAgICAgICgqIFRoZSBzdGFjayBwb2ludGVyIGZvciBhdHRyaWJ1dGVzICopXG4gICAgbXV0YWJsZSBydWxlX2xlbiA6IGludDsgICAgICAgICAgICAgKCogTnVtYmVyIG9mIHJocyBpdGVtcyBpbiB0aGUgcnVsZSAqKVxuICAgIG11dGFibGUgcnVsZV9udW1iZXIgOiBpbnQ7ICAgICAgICAgICgqIFJ1bGUgbnVtYmVyIHRvIHJlZHVjZSBieSAqKVxuICAgIG11dGFibGUgc3AgOiBpbnQ7ICAgICAgICAgICAgICAgICAgICgqIFNhdmVkIHNwIGZvciBwYXJzZV9lbmdpbmUgKilcbiAgICBtdXRhYmxlIHN0YXRlIDogaW50OyAgICAgICAgICAgICAgICAoKiBTYXZlZCBzdGF0ZSBmb3IgcGFyc2VfZW5naW5lICopXG4gICAgbXV0YWJsZSBlcnJmbGFnIDogaW50IH0gICAgICAgICAgICAgKCogU2F2ZWQgZXJyb3IgZmxhZyBmb3IgcGFyc2VfZW5naW5lICopXG5bQEB3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXVxuXG50eXBlIHBhcnNlX3RhYmxlcyA9XG4gIHsgYWN0aW9ucyA6IChwYXJzZXJfZW52IC0+IE9iai50KSBhcnJheTtcbiAgICB0cmFuc2xfY29uc3QgOiBpbnQgYXJyYXk7XG4gICAgdHJhbnNsX2Jsb2NrIDogaW50IGFycmF5O1xuICAgIGxocyA6IHN0cmluZztcbiAgICBsZW4gOiBzdHJpbmc7XG4gICAgZGVmcmVkIDogc3RyaW5nO1xuICAgIGRnb3RvIDogc3RyaW5nO1xuICAgIHNpbmRleCA6IHN0cmluZztcbiAgICByaW5kZXggOiBzdHJpbmc7XG4gICAgZ2luZGV4IDogc3RyaW5nO1xuICAgIHRhYmxlc2l6ZSA6IGludDtcbiAgICB0YWJsZSA6IHN0cmluZztcbiAgICBjaGVjayA6IHN0cmluZztcbiAgICBlcnJvcl9mdW5jdGlvbiA6IHN0cmluZyAtPiB1bml0O1xuICAgIG5hbWVzX2NvbnN0IDogc3RyaW5nO1xuICAgIG5hbWVzX2Jsb2NrIDogc3RyaW5nIH1cblxuZXhjZXB0aW9uIFlZZXhpdCBvZiBPYmoudFxuZXhjZXB0aW9uIFBhcnNlX2Vycm9yXG5cbnR5cGUgcGFyc2VyX2lucHV0ID1cbiAgICBTdGFydFxuICB8IFRva2VuX3JlYWRcbiAgfCBTdGFja3NfZ3Jvd25fMVxuICB8IFN0YWNrc19ncm93bl8yXG4gIHwgU2VtYW50aWNfYWN0aW9uX2NvbXB1dGVkXG4gIHwgRXJyb3JfZGV0ZWN0ZWRcblxudHlwZSBwYXJzZXJfb3V0cHV0ID1cbiAgICBSZWFkX3Rva2VuXG4gIHwgUmFpc2VfcGFyc2VfZXJyb3JcbiAgfCBHcm93X3N0YWNrc18xXG4gIHwgR3Jvd19zdGFja3NfMlxuICB8IENvbXB1dGVfc2VtYW50aWNfYWN0aW9uXG4gIHwgQ2FsbF9lcnJvcl9mdW5jdGlvblxuXG4oKiB0byBhdm9pZCB3YXJuaW5ncyAqKVxubGV0IF8gPSBbUmVhZF90b2tlbjsgUmFpc2VfcGFyc2VfZXJyb3I7IEdyb3dfc3RhY2tzXzE7IEdyb3dfc3RhY2tzXzI7XG4gICAgICAgICBDb21wdXRlX3NlbWFudGljX2FjdGlvbjsgQ2FsbF9lcnJvcl9mdW5jdGlvbl1cblxuZXh0ZXJuYWwgcGFyc2VfZW5naW5lIDpcbiAgICBwYXJzZV90YWJsZXMgLT4gcGFyc2VyX2VudiAtPiBwYXJzZXJfaW5wdXQgLT4gT2JqLnQgLT4gcGFyc2VyX291dHB1dFxuICAgID0gXCJjYW1sX3BhcnNlX2VuZ2luZVwiXG5cbmV4dGVybmFsIHNldF90cmFjZTogYm9vbCAtPiBib29sXG4gICAgPSBcImNhbWxfc2V0X3BhcnNlcl90cmFjZVwiXG5cbmxldCBlbnYgPVxuICB7IHNfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCAwO1xuICAgIHZfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCAoT2JqLnJlcHIgKCkpO1xuICAgIHN5bWJfc3RhcnRfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCBkdW1teV9wb3M7XG4gICAgc3ltYl9lbmRfc3RhY2sgPSBBcnJheS5tYWtlIDEwMCBkdW1teV9wb3M7XG4gICAgc3RhY2tzaXplID0gMTAwO1xuICAgIHN0YWNrYmFzZSA9IDA7XG4gICAgY3Vycl9jaGFyID0gMDtcbiAgICBsdmFsID0gT2JqLnJlcHIgKCk7XG4gICAgc3ltYl9zdGFydCA9IGR1bW15X3BvcztcbiAgICBzeW1iX2VuZCA9IGR1bW15X3BvcztcbiAgICBhc3AgPSAwO1xuICAgIHJ1bGVfbGVuID0gMDtcbiAgICBydWxlX251bWJlciA9IDA7XG4gICAgc3AgPSAwO1xuICAgIHN0YXRlID0gMDtcbiAgICBlcnJmbGFnID0gMCB9XG5cbmxldCBncm93X3N0YWNrcygpID1cbiAgbGV0IG9sZHNpemUgPSBlbnYuc3RhY2tzaXplIGluXG4gIGxldCBuZXdzaXplID0gb2xkc2l6ZSAqIDIgaW5cbiAgbGV0IG5ld19zID0gQXJyYXkubWFrZSBuZXdzaXplIDBcbiAgYW5kIG5ld192ID0gQXJyYXkubWFrZSBuZXdzaXplIChPYmoucmVwciAoKSlcbiAgYW5kIG5ld19zdGFydCA9IEFycmF5Lm1ha2UgbmV3c2l6ZSBkdW1teV9wb3NcbiAgYW5kIG5ld19lbmQgPSBBcnJheS5tYWtlIG5ld3NpemUgZHVtbXlfcG9zIGluXG4gICAgQXJyYXkuYmxpdCBlbnYuc19zdGFjayAwIG5ld19zIDAgb2xkc2l6ZTtcbiAgICBlbnYuc19zdGFjayA8LSBuZXdfcztcbiAgICBBcnJheS5ibGl0IGVudi52X3N0YWNrIDAgbmV3X3YgMCBvbGRzaXplO1xuICAgIGVudi52X3N0YWNrIDwtIG5ld192O1xuICAgIEFycmF5LmJsaXQgZW52LnN5bWJfc3RhcnRfc3RhY2sgMCBuZXdfc3RhcnQgMCBvbGRzaXplO1xuICAgIGVudi5zeW1iX3N0YXJ0X3N0YWNrIDwtIG5ld19zdGFydDtcbiAgICBBcnJheS5ibGl0IGVudi5zeW1iX2VuZF9zdGFjayAwIG5ld19lbmQgMCBvbGRzaXplO1xuICAgIGVudi5zeW1iX2VuZF9zdGFjayA8LSBuZXdfZW5kO1xuICAgIGVudi5zdGFja3NpemUgPC0gbmV3c2l6ZVxuXG5sZXQgY2xlYXJfcGFyc2VyKCkgPVxuICBBcnJheS5maWxsIGVudi52X3N0YWNrIDAgZW52LnN0YWNrc2l6ZSAoT2JqLnJlcHIgKCkpO1xuICBlbnYubHZhbCA8LSBPYmoucmVwciAoKVxuXG5sZXQgY3VycmVudF9sb29rYWhlYWRfZnVuID0gcmVmIChmdW4gKF8gOiBPYmoudCkgLT4gZmFsc2UpXG5cbmxldCB5eXBhcnNlIHRhYmxlcyBzdGFydCBsZXhlciBsZXhidWYgPVxuICBsZXQgcmVjIGxvb3AgY21kIGFyZyA9XG4gICAgbWF0Y2ggcGFyc2VfZW5naW5lIHRhYmxlcyBlbnYgY21kIGFyZyB3aXRoXG4gICAgICBSZWFkX3Rva2VuIC0+XG4gICAgICAgIGxldCB0ID0gT2JqLnJlcHIobGV4ZXIgbGV4YnVmKSBpblxuICAgICAgICBlbnYuc3ltYl9zdGFydCA8LSBsZXhidWYubGV4X3N0YXJ0X3A7XG4gICAgICAgIGVudi5zeW1iX2VuZCA8LSBsZXhidWYubGV4X2N1cnJfcDtcbiAgICAgICAgbG9vcCBUb2tlbl9yZWFkIHRcbiAgICB8IFJhaXNlX3BhcnNlX2Vycm9yIC0+XG4gICAgICAgIHJhaXNlIFBhcnNlX2Vycm9yXG4gICAgfCBDb21wdXRlX3NlbWFudGljX2FjdGlvbiAtPlxuICAgICAgICBsZXQgKGFjdGlvbiwgdmFsdWUpID1cbiAgICAgICAgICB0cnlcbiAgICAgICAgICAgIChTZW1hbnRpY19hY3Rpb25fY29tcHV0ZWQsIHRhYmxlcy5hY3Rpb25zLihlbnYucnVsZV9udW1iZXIpIGVudilcbiAgICAgICAgICB3aXRoIFBhcnNlX2Vycm9yIC0+XG4gICAgICAgICAgICAoRXJyb3JfZGV0ZWN0ZWQsIE9iai5yZXByICgpKSBpblxuICAgICAgICBsb29wIGFjdGlvbiB2YWx1ZVxuICAgIHwgR3Jvd19zdGFja3NfMSAtPlxuICAgICAgICBncm93X3N0YWNrcygpOyBsb29wIFN0YWNrc19ncm93bl8xIChPYmoucmVwciAoKSlcbiAgICB8IEdyb3dfc3RhY2tzXzIgLT5cbiAgICAgICAgZ3Jvd19zdGFja3MoKTsgbG9vcCBTdGFja3NfZ3Jvd25fMiAoT2JqLnJlcHIgKCkpXG4gICAgfCBDYWxsX2Vycm9yX2Z1bmN0aW9uIC0+XG4gICAgICAgIHRhYmxlcy5lcnJvcl9mdW5jdGlvbiBcInN5bnRheCBlcnJvclwiO1xuICAgICAgICBsb29wIEVycm9yX2RldGVjdGVkIChPYmoucmVwciAoKSkgaW5cbiAgbGV0IGluaXRfYXNwID0gZW52LmFzcFxuICBhbmQgaW5pdF9zcCA9IGVudi5zcFxuICBhbmQgaW5pdF9zdGFja2Jhc2UgPSBlbnYuc3RhY2tiYXNlXG4gIGFuZCBpbml0X3N0YXRlID0gZW52LnN0YXRlXG4gIGFuZCBpbml0X2N1cnJfY2hhciA9IGVudi5jdXJyX2NoYXJcbiAgYW5kIGluaXRfbHZhbCA9IGVudi5sdmFsXG4gIGFuZCBpbml0X2VycmZsYWcgPSBlbnYuZXJyZmxhZyBpblxuICBlbnYuc3RhY2tiYXNlIDwtIGVudi5zcCArIDE7XG4gIGVudi5jdXJyX2NoYXIgPC0gc3RhcnQ7XG4gIGVudi5zeW1iX2VuZCA8LSBsZXhidWYubGV4X2N1cnJfcDtcbiAgdHJ5XG4gICAgbG9vcCBTdGFydCAoT2JqLnJlcHIgKCkpXG4gIHdpdGggZXhuIC0+XG4gICAgbGV0IGN1cnJfY2hhciA9IGVudi5jdXJyX2NoYXIgaW5cbiAgICBlbnYuYXNwIDwtIGluaXRfYXNwO1xuICAgIGVudi5zcCA8LSBpbml0X3NwO1xuICAgIGVudi5zdGFja2Jhc2UgPC0gaW5pdF9zdGFja2Jhc2U7XG4gICAgZW52LnN0YXRlIDwtIGluaXRfc3RhdGU7XG4gICAgZW52LmN1cnJfY2hhciA8LSBpbml0X2N1cnJfY2hhcjtcbiAgICBlbnYubHZhbCA8LSBpbml0X2x2YWw7XG4gICAgZW52LmVycmZsYWcgPC0gaW5pdF9lcnJmbGFnO1xuICAgIG1hdGNoIGV4biB3aXRoXG4gICAgICBZWWV4aXQgdiAtPlxuICAgICAgICBPYmoubWFnaWMgdlxuICAgIHwgXyAtPlxuICAgICAgICBjdXJyZW50X2xvb2thaGVhZF9mdW4gOj1cbiAgICAgICAgICAoZnVuIHRvayAtPlxuICAgICAgICAgICAgaWYgT2JqLmlzX2Jsb2NrIHRva1xuICAgICAgICAgICAgdGhlbiB0YWJsZXMudHJhbnNsX2Jsb2NrLihPYmoudGFnIHRvaykgPSBjdXJyX2NoYXJcbiAgICAgICAgICAgIGVsc2UgdGFibGVzLnRyYW5zbF9jb25zdC4oT2JqLm1hZ2ljIHRvaykgPSBjdXJyX2NoYXIpO1xuICAgICAgICByYWlzZSBleG5cblxubGV0IHBlZWtfdmFsIGVudiBuID1cbiAgT2JqLm1hZ2ljIGVudi52X3N0YWNrLihlbnYuYXNwIC0gbilcblxubGV0IHN5bWJvbF9zdGFydF9wb3MgKCkgPVxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA8PSAwIHRoZW4gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwKVxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCBzdCA9IGVudi5zeW1iX3N0YXJ0X3N0YWNrLihlbnYuYXNwIC0gaSArIDEpIGluXG4gICAgICBsZXQgZW4gPSBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3AgLSBpICsgMSkgaW5cbiAgICAgIGlmIHN0IDw+IGVuIHRoZW4gc3QgZWxzZSBsb29wIChpIC0gMSlcbiAgICBlbmRcbiAgaW5cbiAgbG9vcCBlbnYucnVsZV9sZW5cblxubGV0IHN5bWJvbF9lbmRfcG9zICgpID0gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwKVxubGV0IHJoc19zdGFydF9wb3MgbiA9IGVudi5zeW1iX3N0YXJ0X3N0YWNrLihlbnYuYXNwIC0gKGVudi5ydWxlX2xlbiAtIG4pKVxubGV0IHJoc19lbmRfcG9zIG4gPSBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3AgLSAoZW52LnJ1bGVfbGVuIC0gbikpXG5cbmxldCBzeW1ib2xfc3RhcnQgKCkgPSAoc3ltYm9sX3N0YXJ0X3BvcyAoKSkucG9zX2NudW1cbmxldCBzeW1ib2xfZW5kICgpID0gKHN5bWJvbF9lbmRfcG9zICgpKS5wb3NfY251bVxubGV0IHJoc19zdGFydCBuID0gKHJoc19zdGFydF9wb3MgbikucG9zX2NudW1cbmxldCByaHNfZW5kIG4gPSAocmhzX2VuZF9wb3MgbikucG9zX2NudW1cblxubGV0IGlzX2N1cnJlbnRfbG9va2FoZWFkIHRvayA9XG4gICghY3VycmVudF9sb29rYWhlYWRfZnVuKShPYmoucmVwciB0b2spXG5cbmxldCBwYXJzZV9lcnJvciAoXyA6IHN0cmluZykgPSAoKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTZXRzIG92ZXIgb3JkZXJlZCB0eXBlcyAqKVxuXG5tb2R1bGUgdHlwZSBPcmRlcmVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBjb21wYXJlOiB0IC0+IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTID1cbiAgc2lnXG4gICAgdHlwZSBlbHRcbiAgICB0eXBlIHRcbiAgICB2YWwgZW1wdHk6IHRcbiAgICB2YWwgaXNfZW1wdHk6IHQgLT4gYm9vbFxuICAgIHZhbCBtZW06IGVsdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgYWRkOiBlbHQgLT4gdCAtPiB0XG4gICAgdmFsIHNpbmdsZXRvbjogZWx0IC0+IHRcbiAgICB2YWwgcmVtb3ZlOiBlbHQgLT4gdCAtPiB0XG4gICAgdmFsIHVuaW9uOiB0IC0+IHQgLT4gdFxuICAgIHZhbCBpbnRlcjogdCAtPiB0IC0+IHRcbiAgICB2YWwgZGlzam9pbnQ6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIGRpZmY6IHQgLT4gdCAtPiB0XG4gICAgdmFsIGNvbXBhcmU6IHQgLT4gdCAtPiBpbnRcbiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIHN1YnNldDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgaXRlcjogKGVsdCAtPiB1bml0KSAtPiB0IC0+IHVuaXRcbiAgICB2YWwgbWFwOiAoZWx0IC0+IGVsdCkgLT4gdCAtPiB0XG4gICAgdmFsIGZvbGQ6IChlbHQgLT4gJ2EgLT4gJ2EpIC0+IHQgLT4gJ2EgLT4gJ2FcbiAgICB2YWwgZm9yX2FsbDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGJvb2xcbiAgICB2YWwgZXhpc3RzOiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gYm9vbFxuICAgIHZhbCBmaWx0ZXI6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiB0XG4gICAgdmFsIGZpbHRlcl9tYXA6IChlbHQgLT4gZWx0IG9wdGlvbikgLT4gdCAtPiB0XG4gICAgdmFsIHBhcnRpdGlvbjogKGVsdCAtPiBib29sKSAtPiB0IC0+IHQgKiB0XG4gICAgdmFsIGNhcmRpbmFsOiB0IC0+IGludFxuICAgIHZhbCBlbGVtZW50czogdCAtPiBlbHQgbGlzdFxuICAgIHZhbCBtaW5fZWx0OiB0IC0+IGVsdFxuICAgIHZhbCBtaW5fZWx0X29wdDogdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIG1heF9lbHQ6IHQgLT4gZWx0XG4gICAgdmFsIG1heF9lbHRfb3B0OiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgY2hvb3NlOiB0IC0+IGVsdFxuICAgIHZhbCBjaG9vc2Vfb3B0OiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgc3BsaXQ6IGVsdCAtPiB0IC0+IHQgKiBib29sICogdFxuICAgIHZhbCBmaW5kOiBlbHQgLT4gdCAtPiBlbHRcbiAgICB2YWwgZmluZF9vcHQ6IGVsdCAtPiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgZmluZF9maXJzdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdFxuICAgIHZhbCBmaW5kX2ZpcnN0X29wdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgZmluZF9sYXN0OiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gZWx0XG4gICAgdmFsIGZpbmRfbGFzdF9vcHQ6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIG9mX2xpc3Q6IGVsdCBsaXN0IC0+IHRcbiAgICB2YWwgdG9fc2VxX2Zyb20gOiBlbHQgLT4gdCAtPiBlbHQgU2VxLnRcbiAgICB2YWwgdG9fc2VxIDogdCAtPiBlbHQgU2VxLnRcbiAgICB2YWwgdG9fcmV2X3NlcSA6IHQgLT4gZWx0IFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiBlbHQgU2VxLnQgLT4gdCAtPiB0XG4gICAgdmFsIG9mX3NlcSA6IGVsdCBTZXEudCAtPiB0XG4gIGVuZFxuXG5tb2R1bGUgTWFrZShPcmQ6IE9yZGVyZWRUeXBlKSA9XG4gIHN0cnVjdFxuICAgIHR5cGUgZWx0ID0gT3JkLnRcbiAgICB0eXBlIHQgPSBFbXB0eSB8IE5vZGUgb2Yge2w6dDsgdjplbHQ7IHI6dDsgaDppbnR9XG5cbiAgICAoKiBTZXRzIGFyZSByZXByZXNlbnRlZCBieSBiYWxhbmNlZCBiaW5hcnkgdHJlZXMgKHRoZSBoZWlnaHRzIG9mIHRoZVxuICAgICAgIGNoaWxkcmVuIGRpZmZlciBieSBhdCBtb3N0IDIgKilcblxuICAgIGxldCBoZWlnaHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAwXG4gICAgICB8IE5vZGUge2h9IC0+IGhcblxuICAgICgqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGxlZnQgc29uIGwsIHZhbHVlIHYgYW5kIHJpZ2h0IHNvbiByLlxuICAgICAgIFdlIG11c3QgaGF2ZSBhbGwgZWxlbWVudHMgb2YgbCA8IHYgPCBhbGwgZWxlbWVudHMgb2Ygci5cbiAgICAgICBsIGFuZCByIG11c3QgYmUgYmFsYW5jZWQgYW5kIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDIuXG4gICAgICAgSW5saW5lIGV4cGFuc2lvbiBvZiBoZWlnaHQgZm9yIGJldHRlciBzcGVlZC4gKilcblxuICAgIGxldCBjcmVhdGUgbCB2IHIgPVxuICAgICAgbGV0IGhsID0gbWF0Y2ggbCB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBsZXQgaHIgPSBtYXRjaCByIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIE5vZGV7bDsgdjsgcjsgaD0oaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpfVxuXG4gICAgKCogU2FtZSBhcyBjcmVhdGUsIGJ1dCBwZXJmb3JtcyBvbmUgc3RlcCBvZiByZWJhbGFuY2luZyBpZiBuZWNlc3NhcnkuXG4gICAgICAgQXNzdW1lcyBsIGFuZCByIGJhbGFuY2VkIGFuZCB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAzLlxuICAgICAgIElubGluZSBleHBhbnNpb24gb2YgY3JlYXRlIGZvciBiZXR0ZXIgc3BlZWQgaW4gdGhlIG1vc3QgZnJlcXVlbnQgY2FzZVxuICAgICAgIHdoZXJlIG5vIHJlYmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqKVxuXG4gICAgbGV0IGJhbCBsIHYgciA9XG4gICAgICBsZXQgaGwgPSBtYXRjaCBsIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgaWYgaGwgPiBociArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1sbDsgdj1sdjsgcj1scn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCBsbCA+PSBoZWlnaHQgbHIgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgbGwgbHYgKGNyZWF0ZSBsciB2IHIpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1scmw7IHY9bHJ2OyByPWxycn0tPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbGwgbHYgbHJsKSBscnYgKGNyZWF0ZSBscnIgdiByKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZSBpZiBociA+IGhsICsgMiB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgIHwgTm9kZXtsPXJsOyB2PXJ2OyByPXJyfSAtPlxuICAgICAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybCB0aGVuXG4gICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgdiBybCkgcnYgcnJcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPXJsbDsgdj1ybHY7IHI9cmxyfSAtPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB2IHJsbCkgcmx2IChjcmVhdGUgcmxyIHJ2IHJyKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZVxuICAgICAgICBOb2Rle2w7IHY7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgICgqIEluc2VydGlvbiBvZiBvbmUgZWxlbWVudCAqKVxuXG4gICAgbGV0IHJlYyBhZGQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vZGV7bD1FbXB0eTsgdj14OyByPUVtcHR5OyBoPTF9XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gYXMgdCAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiB0IGVsc2VcbiAgICAgICAgICBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgbGwgPSBhZGQgeCBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gdCBlbHNlIGJhbCBsbCB2IHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSBhZGQgeCByIGluXG4gICAgICAgICAgICBpZiByID09IHJyIHRoZW4gdCBlbHNlIGJhbCBsIHYgcnJcblxuICAgIGxldCBzaW5nbGV0b24geCA9IE5vZGV7bD1FbXB0eTsgdj14OyByPUVtcHR5OyBoPTF9XG5cbiAgICAoKiBCZXdhcmU6IHRob3NlIHR3byBmdW5jdGlvbnMgYXNzdW1lIHRoYXQgdGhlIGFkZGVkIHYgaXMgKnN0cmljdGx5KlxuICAgICAgIHNtYWxsZXIgKG9yIGJpZ2dlcikgdGhhbiBhbGwgdGhlIHByZXNlbnQgZWxlbWVudHMgaW4gdGhlIHRyZWU7IGl0XG4gICAgICAgZG9lcyBub3QgdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgY3VycmVudCBtaW4gKG9yIG1heCkgZWxlbWVudC5cbiAgICAgICBJbmRlZWQsIHRoZXkgYXJlIG9ubHkgdXNlZCBkdXJpbmcgdGhlIFwiam9pblwiIG9wZXJhdGlvbiB3aGljaFxuICAgICAgIHJlc3BlY3RzIHRoaXMgcHJlY29uZGl0aW9uLlxuICAgICopXG5cbiAgICBsZXQgcmVjIGFkZF9taW5fZWxlbWVudCB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgcn0gLT5cbiAgICAgICAgYmFsIChhZGRfbWluX2VsZW1lbnQgeCBsKSB2IHJcblxuICAgIGxldCByZWMgYWRkX21heF9lbGVtZW50IHggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBzaW5nbGV0b24geFxuICAgICAgfCBOb2RlIHtsOyB2OyByfSAtPlxuICAgICAgICBiYWwgbCB2IChhZGRfbWF4X2VsZW1lbnQgeCByKVxuXG4gICAgKCogU2FtZSBhcyBjcmVhdGUgYW5kIGJhbCwgYnV0IG5vIGFzc3VtcHRpb25zIGFyZSBtYWRlIG9uIHRoZVxuICAgICAgIHJlbGF0aXZlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCByZWMgam9pbiBsIHYgciA9XG4gICAgICBtYXRjaCAobCwgcikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIC0+IGFkZF9taW5fZWxlbWVudCB2IHJcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBhZGRfbWF4X2VsZW1lbnQgdiBsXG4gICAgICB8IChOb2Rle2w9bGw7IHY9bHY7IHI9bHI7IGg9bGh9LCBOb2Rle2w9cmw7IHY9cnY7IHI9cnI7IGg9cmh9KSAtPlxuICAgICAgICAgIGlmIGxoID4gcmggKyAyIHRoZW4gYmFsIGxsIGx2IChqb2luIGxyIHYgcikgZWxzZVxuICAgICAgICAgIGlmIHJoID4gbGggKyAyIHRoZW4gYmFsIChqb2luIGwgdiBybCkgcnYgcnIgZWxzZVxuICAgICAgICAgIGNyZWF0ZSBsIHYgclxuXG4gICAgKCogU21hbGxlc3QgYW5kIGdyZWF0ZXN0IGVsZW1lbnQgb2YgYSBzZXQgKilcblxuICAgIGxldCByZWMgbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w9RW1wdHk7IHZ9IC0+IHZcbiAgICAgIHwgTm9kZXtsfSAtPiBtaW5fZWx0IGxcblxuICAgIGxldCByZWMgbWluX2VsdF9vcHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGV7bD1FbXB0eTsgdn0gLT4gU29tZSB2XG4gICAgICB8IE5vZGV7bH0gLT4gbWluX2VsdF9vcHQgbFxuXG4gICAgbGV0IHJlYyBtYXhfZWx0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7djsgcj1FbXB0eX0gLT4gdlxuICAgICAgfCBOb2Rle3J9IC0+IG1heF9lbHQgclxuXG4gICAgbGV0IHJlYyBtYXhfZWx0X29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZXt2OyByPUVtcHR5fSAtPiBTb21lIHZcbiAgICAgIHwgTm9kZXtyfSAtPiBtYXhfZWx0X29wdCByXG5cbiAgICAoKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNldCAqKVxuXG4gICAgbGV0IHJlYyByZW1vdmVfbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LnJlbW92ZV9taW5fZWx0XCJcbiAgICAgIHwgTm9kZXtsPUVtcHR5OyByfSAtPiByXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gYmFsIChyZW1vdmVfbWluX2VsdCBsKSB2IHJcblxuICAgICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLlxuICAgICAgIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgICBBc3N1bWUgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi4gKilcblxuICAgIGxldCBtZXJnZSB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+IGJhbCB0MSAobWluX2VsdCB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuXG4gICAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuXG4gICAgICAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICAgIE5vIGFzc3VtcHRpb24gb24gdGhlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCBjb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPiBqb2luIHQxIChtaW5fZWx0IHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpXG5cbiAgICAoKiBTcGxpdHRpbmcuICBzcGxpdCB4IHMgcmV0dXJucyBhIHRyaXBsZSAobCwgcHJlc2VudCwgcikgd2hlcmVcbiAgICAgICAgLSBsIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgb2YgcyB0aGF0IGFyZSA8IHhcbiAgICAgICAgLSByIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgb2YgcyB0aGF0IGFyZSA+IHhcbiAgICAgICAgLSBwcmVzZW50IGlzIGZhbHNlIGlmIHMgY29udGFpbnMgbm8gZWxlbWVudCBlcXVhbCB0byB4LFxuICAgICAgICAgIG9yIHRydWUgaWYgcyBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIHguICopXG5cbiAgICBsZXQgcmVjIHNwbGl0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIChFbXB0eSwgZmFsc2UsIEVtcHR5KVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIChsLCB0cnVlLCByKVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IChsbCwgcHJlcywgcmwpID0gc3BsaXQgeCBsIGluIChsbCwgcHJlcywgam9pbiBybCB2IHIpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IChsciwgcHJlcywgcnIpID0gc3BsaXQgeCByIGluIChqb2luIGwgdiBsciwgcHJlcywgcnIpXG5cbiAgICAoKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0IG9wZXJhdGlvbnMgKilcblxuICAgIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvbiBFbXB0eSAtPiB0cnVlIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlYyBtZW0geCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGMgPSAwIHx8IG1lbSB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyByZW1vdmUgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IChOb2Rle2w7IHY7IHJ9IGFzIHQpIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIG1lcmdlIGwgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgICAgbGV0IGxsID0gcmVtb3ZlIHggbCBpblxuICAgICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gdFxuICAgICAgICAgICAgICBlbHNlIGJhbCBsbCB2IHJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IHJyID0gcmVtb3ZlIHggciBpblxuICAgICAgICAgICAgICBpZiByID09IHJyIHRoZW4gdFxuICAgICAgICAgICAgICBlbHNlIGJhbCBsIHYgcnJcblxuICAgIGxldCByZWMgdW5pb24gczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIHQyKSAtPiB0MlxuICAgICAgfCAodDEsIEVtcHR5KSAtPiB0MVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxOyBoPWgxfSwgTm9kZXtsPWwyOyB2PXYyOyByPXIyOyBoPWgyfSkgLT5cbiAgICAgICAgICBpZiBoMSA+PSBoMiB0aGVuXG4gICAgICAgICAgICBpZiBoMiA9IDEgdGhlbiBhZGQgdjIgczEgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBsZXQgKGwyLCBfLCByMikgPSBzcGxpdCB2MSBzMiBpblxuICAgICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikgdjEgKHVuaW9uIHIxIHIyKVxuICAgICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgaDEgPSAxIHRoZW4gYWRkIHYxIHMyIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbGV0IChsMSwgXywgcjEpID0gc3BsaXQgdjIgczEgaW5cbiAgICAgICAgICAgICAgam9pbiAodW5pb24gbDEgbDIpIHYyICh1bmlvbiByMSByMilcbiAgICAgICAgICAgIGVuZFxuXG4gICAgbGV0IHJlYyBpbnRlciBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gRW1wdHlcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBFbXB0eVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxfSwgdDIpIC0+XG4gICAgICAgICAgbWF0Y2ggc3BsaXQgdjEgdDIgd2l0aFxuICAgICAgICAgICAgKGwyLCBmYWxzZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGNvbmNhdCAoaW50ZXIgbDEgbDIpIChpbnRlciByMSByMilcbiAgICAgICAgICB8IChsMiwgdHJ1ZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGpvaW4gKGludGVyIGwxIGwyKSB2MSAoaW50ZXIgcjEgcjIpXG5cbiAgICAoKiBTYW1lIGFzIHNwbGl0LCBidXQgY29tcHV0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZXNcbiAgICAgICBvbmx5IGlmIHRoZSBwaXZvdCBlbGVtZW50IGlzIG5vdCBpbiB0aGUgc2V0LiAgVGhlIHJpZ2h0IHN1YnRyZWVcbiAgICAgICBpcyBjb21wdXRlZCBvbiBkZW1hbmQuICopXG5cbiAgICB0eXBlIHNwbGl0X2JpcyA9XG4gICAgICB8IEZvdW5kXG4gICAgICB8IE5vdEZvdW5kIG9mIHQgKiAodW5pdCAtPiB0KVxuXG4gICAgbGV0IHJlYyBzcGxpdF9iaXMgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm90Rm91bmQgKEVtcHR5LCAoZnVuICgpIC0+IEVtcHR5KSlcbiAgICAgIHwgTm9kZXtsOyB2OyByOyBffSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBGb3VuZFxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbWF0Y2ggc3BsaXRfYmlzIHggbCB3aXRoXG4gICAgICAgICAgICB8IEZvdW5kIC0+IEZvdW5kXG4gICAgICAgICAgICB8IE5vdEZvdW5kIChsbCwgcmwpIC0+IE5vdEZvdW5kIChsbCwgKGZ1biAoKSAtPiBqb2luIChybCAoKSkgdiByKSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXRjaCBzcGxpdF9iaXMgeCByIHdpdGhcbiAgICAgICAgICAgIHwgRm91bmQgLT4gRm91bmRcbiAgICAgICAgICAgIHwgTm90Rm91bmQgKGxyLCBycikgLT4gTm90Rm91bmQgKGpvaW4gbCB2IGxyLCBycilcblxuICAgIGxldCByZWMgZGlzam9pbnQgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIHwgKF8sIEVtcHR5KSAtPiB0cnVlXG4gICAgICB8IChOb2Rle2w9bDE7IHY9djE7IHI9cjF9LCB0MikgLT5cbiAgICAgICAgICBpZiBzMSA9PSBzMiB0aGVuIGZhbHNlXG4gICAgICAgICAgZWxzZSBtYXRjaCBzcGxpdF9iaXMgdjEgdDIgd2l0aFxuICAgICAgICAgICAgICBOb3RGb3VuZChsMiwgcjIpIC0+IGRpc2pvaW50IGwxIGwyICYmIGRpc2pvaW50IHIxIChyMiAoKSlcbiAgICAgICAgICAgIHwgRm91bmQgLT4gZmFsc2VcblxuICAgIGxldCByZWMgZGlmZiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gRW1wdHlcbiAgICAgIHwgKHQxLCBFbXB0eSkgLT4gdDFcbiAgICAgIHwgKE5vZGV7bD1sMTsgdj12MTsgcj1yMX0sIHQyKSAtPlxuICAgICAgICAgIG1hdGNoIHNwbGl0IHYxIHQyIHdpdGhcbiAgICAgICAgICAgIChsMiwgZmFsc2UsIHIyKSAtPlxuICAgICAgICAgICAgICBqb2luIChkaWZmIGwxIGwyKSB2MSAoZGlmZiByMSByMilcbiAgICAgICAgICB8IChsMiwgdHJ1ZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGNvbmNhdCAoZGlmZiBsMSBsMikgKGRpZmYgcjEgcjIpXG5cbiAgICB0eXBlIGVudW1lcmF0aW9uID0gRW5kIHwgTW9yZSBvZiBlbHQgKiB0ICogZW51bWVyYXRpb25cblxuICAgIGxldCByZWMgY29uc19lbnVtIHMgZSA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGNvbnNfZW51bSBsIChNb3JlKHYsIHIsIGUpKVxuXG4gICAgbGV0IHJlYyBjb21wYXJlX2F1eCBlMSBlMiA9XG4gICAgICAgIG1hdGNoIChlMSwgZTIpIHdpdGhcbiAgICAgICAgKEVuZCwgRW5kKSAtPiAwXG4gICAgICB8IChFbmQsIF8pICAtPiAtMVxuICAgICAgfCAoXywgRW5kKSAtPiAxXG4gICAgICB8IChNb3JlKHYxLCByMSwgZTEpLCBNb3JlKHYyLCByMiwgZTIpKSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgdjEgdjIgaW5cbiAgICAgICAgICBpZiBjIDw+IDBcbiAgICAgICAgICB0aGVuIGNcbiAgICAgICAgICBlbHNlIGNvbXBhcmVfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG5cbiAgICBsZXQgY29tcGFyZSBzMSBzMiA9XG4gICAgICBjb21wYXJlX2F1eCAoY29uc19lbnVtIHMxIEVuZCkgKGNvbnNfZW51bSBzMiBFbmQpXG5cbiAgICBsZXQgZXF1YWwgczEgczIgPVxuICAgICAgY29tcGFyZSBzMSBzMiA9IDBcblxuICAgIGxldCByZWMgc3Vic2V0IHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgRW1wdHksIF8gLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IF8sIEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgTm9kZSB7bD1sMTsgdj12MTsgcj1yMX0sIChOb2RlIHtsPWwyOyB2PXYyOyByPXIyfSBhcyB0MikgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHYxIHYyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlblxuICAgICAgICAgICAgc3Vic2V0IGwxIGwyICYmIHN1YnNldCByMSByMlxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgc3Vic2V0IChOb2RlIHtsPWwxOyB2PXYxOyByPUVtcHR5OyBoPTB9KSBsMiAmJiBzdWJzZXQgcjEgdDJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBzdWJzZXQgKE5vZGUge2w9RW1wdHk7IHY9djE7IHI9cjE7IGg9MH0pIHIyICYmIHN1YnNldCBsMSB0MlxuXG4gICAgbGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAoKVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGl0ZXIgZiBsOyBmIHY7IGl0ZXIgZiByXG5cbiAgICBsZXQgcmVjIGZvbGQgZiBzIGFjY3UgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBmb2xkIGYgciAoZiB2IChmb2xkIGYgbCBhY2N1KSlcblxuICAgIGxldCByZWMgZm9yX2FsbCBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IHAgdiAmJiBmb3JfYWxsIHAgbCAmJiBmb3JfYWxsIHAgclxuXG4gICAgbGV0IHJlYyBleGlzdHMgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gcCB2IHx8IGV4aXN0cyBwIGwgfHwgZXhpc3RzIHAgclxuXG4gICAgbGV0IHJlYyBmaWx0ZXIgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IChOb2Rle2w7IHY7IHJ9KSBhcyB0IC0+XG4gICAgICAgICAgKCogY2FsbCBbcF0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgbCcgPSBmaWx0ZXIgcCBsIGluXG4gICAgICAgICAgbGV0IHB2ID0gcCB2IGluXG4gICAgICAgICAgbGV0IHInID0gZmlsdGVyIHAgciBpblxuICAgICAgICAgIGlmIHB2IHRoZW5cbiAgICAgICAgICAgIGlmIGw9PWwnICYmIHI9PXInIHRoZW4gdCBlbHNlIGpvaW4gbCcgdiByJ1xuICAgICAgICAgIGVsc2UgY29uY2F0IGwnIHInXG5cbiAgICBsZXQgcmVjIHBhcnRpdGlvbiBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKEVtcHR5LCBFbXB0eSlcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgICgqIGNhbGwgW3BdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IChsdCwgbGYpID0gcGFydGl0aW9uIHAgbCBpblxuICAgICAgICAgIGxldCBwdiA9IHAgdiBpblxuICAgICAgICAgIGxldCAocnQsIHJmKSA9IHBhcnRpdGlvbiBwIHIgaW5cbiAgICAgICAgICBpZiBwdlxuICAgICAgICAgIHRoZW4gKGpvaW4gbHQgdiBydCwgY29uY2F0IGxmIHJmKVxuICAgICAgICAgIGVsc2UgKGNvbmNhdCBsdCBydCwgam9pbiBsZiB2IHJmKVxuXG4gICAgbGV0IHJlYyBjYXJkaW5hbCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZXtsOyByfSAtPiBjYXJkaW5hbCBsICsgMSArIGNhcmRpbmFsIHJcblxuICAgIGxldCByZWMgZWxlbWVudHNfYXV4IGFjY3UgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gZWxlbWVudHNfYXV4ICh2IDo6IGVsZW1lbnRzX2F1eCBhY2N1IHIpIGxcblxuICAgIGxldCBlbGVtZW50cyBzID1cbiAgICAgIGVsZW1lbnRzX2F1eCBbXSBzXG5cbiAgICBsZXQgY2hvb3NlID0gbWluX2VsdFxuXG4gICAgbGV0IGNob29zZV9vcHQgPSBtaW5fZWx0X29wdFxuXG4gICAgbGV0IHJlYyBmaW5kIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiB2XG4gICAgICAgICAgZWxzZSBmaW5kIHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3RfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdiBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2MCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3QgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYwIGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHQgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9hdXggdjAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2MCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3QgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIFNvbWUgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHQgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfb3B0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gU29tZSB2XG4gICAgICAgICAgZWxzZSBmaW5kX29wdCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHRyeV9qb2luIGwgdiByID1cbiAgICAgICgqIFtqb2luIGwgdiByXSBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiAoZWxlbWVudHMgb2YgbCA8IHYgPFxuICAgICAgICAgZWxlbWVudHMgb2Ygcik7IHVzZSBbdHJ5X2pvaW4gbCB2IHJdIHdoZW4gdGhpcyBwcm9wZXJ0eSBtYXlcbiAgICAgICAgIG5vdCBob2xkLCBidXQgeW91IGhvcGUgaXQgZG9lcyBob2xkIGluIHRoZSBjb21tb24gY2FzZSAqKVxuICAgICAgaWYgKGwgPSBFbXB0eSB8fCBPcmQuY29tcGFyZSAobWF4X2VsdCBsKSB2IDwgMClcbiAgICAgICYmIChyID0gRW1wdHkgfHwgT3JkLmNvbXBhcmUgdiAobWluX2VsdCByKSA8IDApXG4gICAgICB0aGVuIGpvaW4gbCB2IHJcbiAgICAgIGVsc2UgdW5pb24gbCAoYWRkIHYgcilcblxuICAgIGxldCByZWMgbWFwIGYgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IGFzIHQgLT5cbiAgICAgICAgICgqIGVuZm9yY2UgbGVmdC10by1yaWdodCBldmFsdWF0aW9uIG9yZGVyICopXG4gICAgICAgICBsZXQgbCcgPSBtYXAgZiBsIGluXG4gICAgICAgICBsZXQgdicgPSBmIHYgaW5cbiAgICAgICAgIGxldCByJyA9IG1hcCBmIHIgaW5cbiAgICAgICAgIGlmIGwgPT0gbCcgJiYgdiA9PSB2JyAmJiByID09IHInIHRoZW4gdFxuICAgICAgICAgZWxzZSB0cnlfam9pbiBsJyB2JyByJ1xuXG4gICAgbGV0IHRyeV9jb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPiB0cnlfam9pbiB0MSAobWluX2VsdCB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuXG4gICAgbGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IGFzIHQgLT5cbiAgICAgICAgICgqIGVuZm9yY2UgbGVmdC10by1yaWdodCBldmFsdWF0aW9uIG9yZGVyICopXG4gICAgICAgICBsZXQgbCcgPSBmaWx0ZXJfbWFwIGYgbCBpblxuICAgICAgICAgbGV0IHYnID0gZiB2IGluXG4gICAgICAgICBsZXQgcicgPSBmaWx0ZXJfbWFwIGYgciBpblxuICAgICAgICAgYmVnaW4gbWF0Y2ggdicgd2l0aFxuICAgICAgICAgICB8IFNvbWUgdicgLT5cbiAgICAgICAgICAgICAgaWYgbCA9PSBsJyAmJiB2ID09IHYnICYmIHIgPT0gcicgdGhlbiB0XG4gICAgICAgICAgICAgIGVsc2UgdHJ5X2pvaW4gbCcgdicgcidcbiAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgIHRyeV9jb25jYXQgbCcgcidcbiAgICAgICAgIGVuZFxuXG4gICAgbGV0IG9mX3NvcnRlZF9saXN0IGwgPVxuICAgICAgbGV0IHJlYyBzdWIgbiBsID1cbiAgICAgICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgICAgIHwgMCwgbCAtPiBFbXB0eSwgbFxuICAgICAgICB8IDEsIHgwIDo6IGwgLT4gTm9kZSB7bD1FbXB0eTsgdj14MDsgcj1FbXB0eTsgaD0xfSwgbFxuICAgICAgICB8IDIsIHgwIDo6IHgxIDo6IGwgLT5cbiAgICAgICAgICAgIE5vZGV7bD1Ob2Rle2w9RW1wdHk7IHY9eDA7IHI9RW1wdHk7IGg9MX07IHY9eDE7IHI9RW1wdHk7IGg9Mn0sIGxcbiAgICAgICAgfCAzLCB4MCA6OiB4MSA6OiB4MiA6OiBsIC0+XG4gICAgICAgICAgICBOb2Rle2w9Tm9kZXtsPUVtcHR5OyB2PXgwOyByPUVtcHR5OyBoPTF9OyB2PXgxO1xuICAgICAgICAgICAgICAgICByPU5vZGV7bD1FbXB0eTsgdj14Mjsgcj1FbXB0eTsgaD0xfTsgaD0yfSwgbFxuICAgICAgICB8IG4sIGwgLT5cbiAgICAgICAgICBsZXQgbmwgPSBuIC8gMiBpblxuICAgICAgICAgIGxldCBsZWZ0LCBsID0gc3ViIG5sIGwgaW5cbiAgICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgbWlkIDo6IGwgLT5cbiAgICAgICAgICAgIGxldCByaWdodCwgbCA9IHN1YiAobiAtIG5sIC0gMSkgbCBpblxuICAgICAgICAgICAgY3JlYXRlIGxlZnQgbWlkIHJpZ2h0LCBsXG4gICAgICBpblxuICAgICAgZnN0IChzdWIgKExpc3QubGVuZ3RoIGwpIGwpXG5cbiAgICBsZXQgb2ZfbGlzdCBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiBlbXB0eVxuICAgICAgfCBbeDBdIC0+IHNpbmdsZXRvbiB4MFxuICAgICAgfCBbeDA7IHgxXSAtPiBhZGQgeDEgKHNpbmdsZXRvbiB4MClcbiAgICAgIHwgW3gwOyB4MTsgeDJdIC0+IGFkZCB4MiAoYWRkIHgxIChzaW5nbGV0b24geDApKVxuICAgICAgfCBbeDA7IHgxOyB4MjsgeDNdIC0+IGFkZCB4MyAoYWRkIHgyIChhZGQgeDEgKHNpbmdsZXRvbiB4MCkpKVxuICAgICAgfCBbeDA7IHgxOyB4MjsgeDM7IHg0XSAtPiBhZGQgeDQgKGFkZCB4MyAoYWRkIHgyIChhZGQgeDEgKHNpbmdsZXRvbiB4MCkpKSlcbiAgICAgIHwgXyAtPiBvZl9zb3J0ZWRfbGlzdCAoTGlzdC5zb3J0X3VuaXEgT3JkLmNvbXBhcmUgbClcblxuICAgIGxldCBhZGRfc2VxIGkgbSA9XG4gICAgICBTZXEuZm9sZF9sZWZ0IChmdW4gcyB4IC0+IGFkZCB4IHMpIG0gaVxuXG4gICAgbGV0IG9mX3NlcSBpID0gYWRkX3NlcSBpIGVtcHR5XG5cbiAgICBsZXQgcmVjIHNlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKHgsIHQsIHJlc3QpIC0+IFNlcS5Db25zICh4LCBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3NlcSBjID0gc2VxX29mX2VudW1fIChjb25zX2VudW0gYyBFbmQpXG5cbiAgICBsZXQgcmVjIHNub2NfZW51bSBzIGUgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBzbm9jX2VudW0gciAoTW9yZSh2LCBsLCBlKSlcblxuICAgIGxldCByZWMgcmV2X3NlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKHgsIHQsIHJlc3QpIC0+IFNlcS5Db25zICh4LCByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gdCByZXN0KSlcblxuICAgIGxldCB0b19yZXZfc2VxIGMgPSByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gYyBFbmQpXG5cbiAgICBsZXQgdG9fc2VxX2Zyb20gbG93IHMgPVxuICAgICAgbGV0IHJlYyBhdXggbG93IHMgYyA9IG1hdGNoIHMgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGNcbiAgICAgICAgfCBOb2RlIHtsOyByOyB2OyBffSAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggT3JkLmNvbXBhcmUgdiBsb3cgd2l0aFxuICAgICAgICAgICAgICB8IDAgLT4gTW9yZSAodiwgciwgYylcbiAgICAgICAgICAgICAgfCBuIHdoZW4gbjwwIC0+IGF1eCBsb3cgciBjXG4gICAgICAgICAgICAgIHwgXyAtPiBhdXggbG93IGwgKE1vcmUgKHYsIHIsIGMpKVxuICAgICAgICAgICAgZW5kXG4gICAgICBpblxuICAgICAgc2VxX29mX2VudW1fIChhdXggbG93IHMgRW5kKVxuICBlbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubW9kdWxlIHR5cGUgT3JkZXJlZFR5cGUgPVxuICBzaWdcbiAgICB0eXBlIHRcbiAgICB2YWwgY29tcGFyZTogdCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhKydhIHRcbiAgICB2YWwgZW1wdHk6ICdhIHRcbiAgICB2YWwgaXNfZW1wdHk6ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBtZW06ICBrZXkgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGFkZDoga2V5IC0+ICdhIC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCB1cGRhdGU6IGtleSAtPiAoJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIHNpbmdsZXRvbjoga2V5IC0+ICdhIC0+ICdhIHRcbiAgICB2YWwgcmVtb3ZlOiBrZXkgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIG1lcmdlOlxuICAgICAgICAgIChrZXkgLT4gJ2Egb3B0aW9uIC0+ICdiIG9wdGlvbiAtPiAnYyBvcHRpb24pIC0+ICdhIHQgLT4gJ2IgdCAtPiAnYyB0XG4gICAgdmFsIHVuaW9uOiAoa2V5IC0+ICdhIC0+ICdhIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgY29tcGFyZTogKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludFxuICAgIHZhbCBlcXVhbDogKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGl0ZXI6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZvbGQ6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgZm9yX2FsbDogKGtleSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgZXhpc3RzOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBmaWx0ZXI6IChrZXkgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGZpbHRlcl9tYXA6IChrZXkgLT4gJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYSB0IC0+ICdiIHRcbiAgICB2YWwgcGFydGl0aW9uOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAqICdhIHRcbiAgICB2YWwgY2FyZGluYWw6ICdhIHQgLT4gaW50XG4gICAgdmFsIGJpbmRpbmdzOiAnYSB0IC0+IChrZXkgKiAnYSkgbGlzdFxuICAgIHZhbCBtaW5fYmluZGluZzogJ2EgdCAtPiAoa2V5ICogJ2EpXG4gICAgdmFsIG1pbl9iaW5kaW5nX29wdDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBtYXhfYmluZGluZzogJ2EgdCAtPiAoa2V5ICogJ2EpXG4gICAgdmFsIG1heF9iaW5kaW5nX29wdDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBjaG9vc2U6ICdhIHQgLT4gKGtleSAqICdhKVxuICAgIHZhbCBjaG9vc2Vfb3B0OiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIHNwbGl0OiBrZXkgLT4gJ2EgdCAtPiAnYSB0ICogJ2Egb3B0aW9uICogJ2EgdFxuICAgIHZhbCBmaW5kOiBrZXkgLT4gJ2EgdCAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDoga2V5IC0+ICdhIHQgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfZmlyc3Q6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiBrZXkgKiAnYVxuICAgIHZhbCBmaW5kX2ZpcnN0X29wdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIGZpbmRfbGFzdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IGtleSAqICdhXG4gICAgdmFsIGZpbmRfbGFzdF9vcHQ6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBtYXA6ICgnYSAtPiAnYikgLT4gJ2EgdCAtPiAnYiB0XG4gICAgdmFsIG1hcGk6IChrZXkgLT4gJ2EgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgdFxuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fcmV2X3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19zZXFfZnJvbSA6IGtleSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2UoT3JkOiBPcmRlcmVkVHlwZSkgPSBzdHJ1Y3RcblxuICAgIHR5cGUga2V5ID0gT3JkLnRcblxuICAgIHR5cGUgJ2EgdCA9XG4gICAgICAgIEVtcHR5XG4gICAgICB8IE5vZGUgb2Yge2w6J2EgdDsgdjprZXk7IGQ6J2E7IHI6J2EgdDsgaDppbnR9XG5cbiAgICBsZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gMFxuICAgICAgfCBOb2RlIHtofSAtPiBoXG5cbiAgICBsZXQgY3JlYXRlIGwgeCBkIHIgPVxuICAgICAgbGV0IGhsID0gaGVpZ2h0IGwgYW5kIGhyID0gaGVpZ2h0IHIgaW5cbiAgICAgIE5vZGV7bDsgdj14OyBkOyByOyBoPShpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSl9XG5cbiAgICBsZXQgc2luZ2xldG9uIHggZCA9IE5vZGV7bD1FbXB0eTsgdj14OyBkOyByPUVtcHR5OyBoPTF9XG5cbiAgICBsZXQgYmFsIGwgeCBkIHIgPVxuICAgICAgbGV0IGhsID0gbWF0Y2ggbCB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBsZXQgaHIgPSBtYXRjaCByIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGlmIGhsID4gaHIgKyAyIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgfCBOb2Rle2w9bGw7IHY9bHY7IGQ9bGQ7IHI9bHJ9IC0+XG4gICAgICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVpZ2h0IGxyIHRoZW5cbiAgICAgICAgICAgICAgY3JlYXRlIGxsIGx2IGxkIChjcmVhdGUgbHIgeCBkIHIpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1scmw7IHY9bHJ2OyBkPWxyZDsgcj1scnJ9LT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxkIGxybCkgbHJ2IGxyZCAoY3JlYXRlIGxyciB4IGQgcilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2UgaWYgaHIgPiBobCArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCByIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1ybDsgdj1ydjsgZD1yZDsgcj1ycn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCByciA+PSBoZWlnaHQgcmwgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHggZCBybCkgcnYgcmQgcnJcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPXJsbDsgdj1ybHY7IGQ9cmxkOyByPXJscn0gLT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgeCBkIHJsbCkgcmx2IHJsZCAoY3JlYXRlIHJsciBydiByZCBycilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2VcbiAgICAgICAgTm9kZXtsOyB2PXg7IGQ7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvbiBFbXB0eSAtPiB0cnVlIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlYyBhZGQgeCBkYXRhID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb2Rle2w9RW1wdHk7IHY9eDsgZD1kYXRhOyByPUVtcHR5OyBoPTF9XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IGFzIG0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGlmIGQgPT0gZGF0YSB0aGVuIG0gZWxzZSBOb2Rle2w7IHY9eDsgZD1kYXRhOyByOyBofVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gYWRkIHggZGF0YSBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gbSBlbHNlIGJhbCBsbCB2IGQgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IGFkZCB4IGRhdGEgciBpblxuICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIG0gZWxzZSBiYWwgbCB2IGQgcnJcblxuICAgIGxldCByZWMgZmluZCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gZFxuICAgICAgICAgIGVsc2UgZmluZCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGQgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdjAgZDAgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3QgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYgZCBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdF9hdXggdjAgZDAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgU29tZSAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBkMCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9vcHQgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3RfYXV4IHYwIGQwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBkIGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdjAgZDAgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2IGQgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBkMCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX29wdCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIFNvbWUgZFxuICAgICAgICAgIGVsc2UgZmluZF9vcHQgeCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IE5vZGUge2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBjID0gMCB8fCBtZW0geCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgbWluX2JpbmRpbmcgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bD1FbXB0eTsgdjsgZH0gLT4gKHYsIGQpXG4gICAgICB8IE5vZGUge2x9IC0+IG1pbl9iaW5kaW5nIGxcblxuICAgIGxldCByZWMgbWluX2JpbmRpbmdfb3B0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2RlIHtsPUVtcHR5OyB2OyBkfSAtPiBTb21lICh2LCBkKVxuICAgICAgfCBOb2RlIHtsfS0+IG1pbl9iaW5kaW5nX29wdCBsXG5cbiAgICBsZXQgcmVjIG1heF9iaW5kaW5nID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge3Y7IGQ7IHI9RW1wdHl9IC0+ICh2LCBkKVxuICAgICAgfCBOb2RlIHtyfSAtPiBtYXhfYmluZGluZyByXG5cbiAgICBsZXQgcmVjIG1heF9iaW5kaW5nX29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZSB7djsgZDsgcj1FbXB0eX0gLT4gU29tZSAodiwgZClcbiAgICAgIHwgTm9kZSB7cn0gLT4gbWF4X2JpbmRpbmdfb3B0IHJcblxuICAgIGxldCByZWMgcmVtb3ZlX21pbl9iaW5kaW5nID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAucmVtb3ZlX21pbl9lbHRcIlxuICAgICAgfCBOb2RlIHtsPUVtcHR5OyByfSAtPiByXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IGJhbCAocmVtb3ZlX21pbl9iaW5kaW5nIGwpIHYgZCByXG5cbiAgICBsZXQgbWVyZ2UgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPlxuICAgICAgICAgIGxldCAoeCwgZCkgPSBtaW5fYmluZGluZyB0MiBpblxuICAgICAgICAgIGJhbCB0MSB4IGQgKHJlbW92ZV9taW5fYmluZGluZyB0MilcblxuICAgIGxldCByZWMgcmVtb3ZlIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIEVtcHR5XG4gICAgICB8IChOb2RlIHtsOyB2OyBkOyByfSBhcyBtKSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBtZXJnZSBsIHJcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBsbCA9IHJlbW92ZSB4IGwgaW4gaWYgbCA9PSBsbCB0aGVuIG0gZWxzZSBiYWwgbGwgdiBkIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSByZW1vdmUgeCByIGluIGlmIHIgPT0gcnIgdGhlbiBtIGVsc2UgYmFsIGwgdiBkIHJyXG5cbiAgICBsZXQgcmVjIHVwZGF0ZSB4IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIGYgTm9uZSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IEVtcHR5XG4gICAgICAgICAgfCBTb21lIGRhdGEgLT4gTm9kZXtsPUVtcHR5OyB2PXg7IGQ9ZGF0YTsgcj1FbXB0eTsgaD0xfVxuICAgICAgICAgIGVuZFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSBhcyBtIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgICBtYXRjaCBmIChTb21lIGQpIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiBtZXJnZSBsIHJcbiAgICAgICAgICAgIHwgU29tZSBkYXRhIC0+XG4gICAgICAgICAgICAgICAgaWYgZCA9PSBkYXRhIHRoZW4gbSBlbHNlIE5vZGV7bDsgdj14OyBkPWRhdGE7IHI7IGh9XG4gICAgICAgICAgZW5kIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gdXBkYXRlIHggZiBsIGluXG4gICAgICAgICAgICBpZiBsID09IGxsIHRoZW4gbSBlbHNlIGJhbCBsbCB2IGQgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IHVwZGF0ZSB4IGYgciBpblxuICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIG0gZWxzZSBiYWwgbCB2IGQgcnJcblxuICAgIGxldCByZWMgaXRlciBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpdGVyIGYgbDsgZiB2IGQ7IGl0ZXIgZiByXG5cbiAgICBsZXQgcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSAtPlxuICAgICAgICAgIGxldCBsJyA9IG1hcCBmIGwgaW5cbiAgICAgICAgICBsZXQgZCcgPSBmIGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBtYXAgZiByIGluXG4gICAgICAgICAgTm9kZXtsPWwnOyB2OyBkPWQnOyByPXInOyBofVxuXG4gICAgbGV0IHJlYyBtYXBpIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IC0+XG4gICAgICAgICAgbGV0IGwnID0gbWFwaSBmIGwgaW5cbiAgICAgICAgICBsZXQgZCcgPSBmIHYgZCBpblxuICAgICAgICAgIGxldCByJyA9IG1hcGkgZiByIGluXG4gICAgICAgICAgTm9kZXtsPWwnOyB2OyBkPWQnOyByPXInOyBofVxuXG4gICAgbGV0IHJlYyBmb2xkIGYgbSBhY2N1ID1cbiAgICAgIG1hdGNoIG0gd2l0aFxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgZm9sZCBmIHIgKGYgdiBkIChmb2xkIGYgbCBhY2N1KSlcblxuICAgIGxldCByZWMgZm9yX2FsbCBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBwIHYgZCAmJiBmb3JfYWxsIHAgbCAmJiBmb3JfYWxsIHAgclxuXG4gICAgbGV0IHJlYyBleGlzdHMgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IHAgdiBkIHx8IGV4aXN0cyBwIGwgfHwgZXhpc3RzIHAgclxuXG4gICAgKCogQmV3YXJlOiB0aG9zZSB0d28gZnVuY3Rpb25zIGFzc3VtZSB0aGF0IHRoZSBhZGRlZCBrIGlzICpzdHJpY3RseSpcbiAgICAgICBzbWFsbGVyIChvciBiaWdnZXIpIHRoYW4gYWxsIHRoZSBwcmVzZW50IGtleXMgaW4gdGhlIHRyZWU7IGl0XG4gICAgICAgZG9lcyBub3QgdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGUgY3VycmVudCBtaW4gKG9yIG1heCkga2V5LlxuXG4gICAgICAgSW5kZWVkLCB0aGV5IGFyZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBcImpvaW5cIiBvcGVyYXRpb24gd2hpY2hcbiAgICAgICByZXNwZWN0cyB0aGlzIHByZWNvbmRpdGlvbi5cbiAgICAqKVxuXG4gICAgbGV0IHJlYyBhZGRfbWluX2JpbmRpbmcgayB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIGsgeFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICBiYWwgKGFkZF9taW5fYmluZGluZyBrIHggbCkgdiBkIHJcblxuICAgIGxldCByZWMgYWRkX21heF9iaW5kaW5nIGsgeCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IHNpbmdsZXRvbiBrIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgYmFsIGwgdiBkIChhZGRfbWF4X2JpbmRpbmcgayB4IHIpXG5cbiAgICAoKiBTYW1lIGFzIGNyZWF0ZSBhbmQgYmFsLCBidXQgbm8gYXNzdW1wdGlvbnMgYXJlIG1hZGUgb24gdGhlXG4gICAgICAgcmVsYXRpdmUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuXG4gICAgbGV0IHJlYyBqb2luIGwgdiBkIHIgPVxuICAgICAgbWF0Y2ggKGwsIHIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSAtPiBhZGRfbWluX2JpbmRpbmcgdiBkIHJcbiAgICAgIHwgKF8sIEVtcHR5KSAtPiBhZGRfbWF4X2JpbmRpbmcgdiBkIGxcbiAgICAgIHwgKE5vZGV7bD1sbDsgdj1sdjsgZD1sZDsgcj1scjsgaD1saH0sXG4gICAgICAgICBOb2Rle2w9cmw7IHY9cnY7IGQ9cmQ7IHI9cnI7IGg9cmh9KSAtPlxuICAgICAgICAgIGlmIGxoID4gcmggKyAyIHRoZW4gYmFsIGxsIGx2IGxkIChqb2luIGxyIHYgZCByKSBlbHNlXG4gICAgICAgICAgaWYgcmggPiBsaCArIDIgdGhlbiBiYWwgKGpvaW4gbCB2IGQgcmwpIHJ2IHJkIHJyIGVsc2VcbiAgICAgICAgICBjcmVhdGUgbCB2IGQgclxuXG4gICAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuXG4gICAgICAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICAgIE5vIGFzc3VtcHRpb24gb24gdGhlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCBjb25jYXQgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPlxuICAgICAgICAgIGxldCAoeCwgZCkgPSBtaW5fYmluZGluZyB0MiBpblxuICAgICAgICAgIGpvaW4gdDEgeCBkIChyZW1vdmVfbWluX2JpbmRpbmcgdDIpXG5cbiAgICBsZXQgY29uY2F0X29yX2pvaW4gdDEgdiBkIHQyID1cbiAgICAgIG1hdGNoIGQgd2l0aFxuICAgICAgfCBTb21lIGQgLT4gam9pbiB0MSB2IGQgdDJcbiAgICAgIHwgTm9uZSAtPiBjb25jYXQgdDEgdDJcblxuICAgIGxldCByZWMgc3BsaXQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgKEVtcHR5LCBOb25lLCBFbXB0eSlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gKGwsIFNvbWUgZCwgcilcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCAobGwsIHByZXMsIHJsKSA9IHNwbGl0IHggbCBpbiAobGwsIHByZXMsIGpvaW4gcmwgdiBkIHIpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IChsciwgcHJlcywgcnIpID0gc3BsaXQgeCByIGluIChqb2luIGwgdiBkIGxyLCBwcmVzLCBycilcblxuICAgIGxldCByZWMgbWVyZ2UgZiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgRW1wdHkpIC0+IEVtcHR5XG4gICAgICB8IChOb2RlIHtsPWwxOyB2PXYxOyBkPWQxOyByPXIxOyBoPWgxfSwgXykgd2hlbiBoMSA+PSBoZWlnaHQgczIgLT5cbiAgICAgICAgICBsZXQgKGwyLCBkMiwgcjIpID0gc3BsaXQgdjEgczIgaW5cbiAgICAgICAgICBjb25jYXRfb3Jfam9pbiAobWVyZ2UgZiBsMSBsMikgdjEgKGYgdjEgKFNvbWUgZDEpIGQyKSAobWVyZ2UgZiByMSByMilcbiAgICAgIHwgKF8sIE5vZGUge2w9bDI7IHY9djI7IGQ9ZDI7IHI9cjJ9KSAtPlxuICAgICAgICAgIGxldCAobDEsIGQxLCByMSkgPSBzcGxpdCB2MiBzMSBpblxuICAgICAgICAgIGNvbmNhdF9vcl9qb2luIChtZXJnZSBmIGwxIGwyKSB2MiAoZiB2MiBkMSAoU29tZSBkMikpIChtZXJnZSBmIHIxIHIyKVxuICAgICAgfCBfIC0+XG4gICAgICAgICAgYXNzZXJ0IGZhbHNlXG5cbiAgICBsZXQgcmVjIHVuaW9uIGYgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgfCAoRW1wdHksIHMpIHwgKHMsIEVtcHR5KSAtPiBzXG4gICAgICB8IChOb2RlIHtsPWwxOyB2PXYxOyBkPWQxOyByPXIxOyBoPWgxfSxcbiAgICAgICAgIE5vZGUge2w9bDI7IHY9djI7IGQ9ZDI7IHI9cjI7IGg9aDJ9KSAtPlxuICAgICAgICAgIGlmIGgxID49IGgyIHRoZW5cbiAgICAgICAgICAgIGxldCAobDIsIGQyLCByMikgPSBzcGxpdCB2MSBzMiBpblxuICAgICAgICAgICAgbGV0IGwgPSB1bmlvbiBmIGwxIGwyIGFuZCByID0gdW5pb24gZiByMSByMiBpblxuICAgICAgICAgICAgbWF0Y2ggZDIgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IGpvaW4gbCB2MSBkMSByXG4gICAgICAgICAgICB8IFNvbWUgZDIgLT4gY29uY2F0X29yX2pvaW4gbCB2MSAoZiB2MSBkMSBkMikgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCAobDEsIGQxLCByMSkgPSBzcGxpdCB2MiBzMSBpblxuICAgICAgICAgICAgbGV0IGwgPSB1bmlvbiBmIGwxIGwyIGFuZCByID0gdW5pb24gZiByMSByMiBpblxuICAgICAgICAgICAgbWF0Y2ggZDEgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IGpvaW4gbCB2MiBkMiByXG4gICAgICAgICAgICB8IFNvbWUgZDEgLT4gY29uY2F0X29yX2pvaW4gbCB2MiAoZiB2MiBkMSBkMikgclxuXG4gICAgbGV0IHJlYyBmaWx0ZXIgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IGFzIG0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCBsJyA9IGZpbHRlciBwIGwgaW5cbiAgICAgICAgICBsZXQgcHZkID0gcCB2IGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBmaWx0ZXIgcCByIGluXG4gICAgICAgICAgaWYgcHZkIHRoZW4gaWYgbD09bCcgJiYgcj09cicgdGhlbiBtIGVsc2Ugam9pbiBsJyB2IGQgcidcbiAgICAgICAgICBlbHNlIGNvbmNhdCBsJyByJ1xuXG4gICAgbGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgICgqIGNhbGwgW2ZdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IGwnID0gZmlsdGVyX21hcCBmIGwgaW5cbiAgICAgICAgICBsZXQgZnZkID0gZiB2IGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBmaWx0ZXJfbWFwIGYgciBpblxuICAgICAgICAgIGJlZ2luIG1hdGNoIGZ2ZCB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgZCcgLT4gam9pbiBsJyB2IGQnIHInXG4gICAgICAgICAgICB8IE5vbmUgLT4gY29uY2F0IGwnIHInXG4gICAgICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIHBhcnRpdGlvbiBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKEVtcHR5LCBFbXB0eSlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCAobHQsIGxmKSA9IHBhcnRpdGlvbiBwIGwgaW5cbiAgICAgICAgICBsZXQgcHZkID0gcCB2IGQgaW5cbiAgICAgICAgICBsZXQgKHJ0LCByZikgPSBwYXJ0aXRpb24gcCByIGluXG4gICAgICAgICAgaWYgcHZkXG4gICAgICAgICAgdGhlbiAoam9pbiBsdCB2IGQgcnQsIGNvbmNhdCBsZiByZilcbiAgICAgICAgICBlbHNlIChjb25jYXQgbHQgcnQsIGpvaW4gbGYgdiBkIHJmKVxuXG4gICAgdHlwZSAnYSBlbnVtZXJhdGlvbiA9IEVuZCB8IE1vcmUgb2Yga2V5ICogJ2EgKiAnYSB0ICogJ2EgZW51bWVyYXRpb25cblxuICAgIGxldCByZWMgY29uc19lbnVtIG0gZSA9XG4gICAgICBtYXRjaCBtIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBjb25zX2VudW0gbCAoTW9yZSh2LCBkLCByLCBlKSlcblxuICAgIGxldCBjb21wYXJlIGNtcCBtMSBtMiA9XG4gICAgICBsZXQgcmVjIGNvbXBhcmVfYXV4IGUxIGUyID1cbiAgICAgICAgICBtYXRjaCAoZTEsIGUyKSB3aXRoXG4gICAgICAgICAgKEVuZCwgRW5kKSAtPiAwXG4gICAgICAgIHwgKEVuZCwgXykgIC0+IC0xXG4gICAgICAgIHwgKF8sIEVuZCkgLT4gMVxuICAgICAgICB8IChNb3JlKHYxLCBkMSwgcjEsIGUxKSwgTW9yZSh2MiwgZDIsIHIyLCBlMikpIC0+XG4gICAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHYxIHYyIGluXG4gICAgICAgICAgICBpZiBjIDw+IDAgdGhlbiBjIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIGQxIGQyIGluXG4gICAgICAgICAgICBpZiBjIDw+IDAgdGhlbiBjIGVsc2VcbiAgICAgICAgICAgIGNvbXBhcmVfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG4gICAgICBpbiBjb21wYXJlX2F1eCAoY29uc19lbnVtIG0xIEVuZCkgKGNvbnNfZW51bSBtMiBFbmQpXG5cbiAgICBsZXQgZXF1YWwgY21wIG0xIG0yID1cbiAgICAgIGxldCByZWMgZXF1YWxfYXV4IGUxIGUyID1cbiAgICAgICAgICBtYXRjaCAoZTEsIGUyKSB3aXRoXG4gICAgICAgICAgKEVuZCwgRW5kKSAtPiB0cnVlXG4gICAgICAgIHwgKEVuZCwgXykgIC0+IGZhbHNlXG4gICAgICAgIHwgKF8sIEVuZCkgLT4gZmFsc2VcbiAgICAgICAgfCAoTW9yZSh2MSwgZDEsIHIxLCBlMSksIE1vcmUodjIsIGQyLCByMiwgZTIpKSAtPlxuICAgICAgICAgICAgT3JkLmNvbXBhcmUgdjEgdjIgPSAwICYmIGNtcCBkMSBkMiAmJlxuICAgICAgICAgICAgZXF1YWxfYXV4IChjb25zX2VudW0gcjEgZTEpIChjb25zX2VudW0gcjIgZTIpXG4gICAgICBpbiBlcXVhbF9hdXggKGNvbnNfZW51bSBtMSBFbmQpIChjb25zX2VudW0gbTIgRW5kKVxuXG4gICAgbGV0IHJlYyBjYXJkaW5hbCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZSB7bDsgcn0gLT4gY2FyZGluYWwgbCArIDEgKyBjYXJkaW5hbCByXG5cbiAgICBsZXQgcmVjIGJpbmRpbmdzX2F1eCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBiaW5kaW5nc19hdXggKCh2LCBkKSA6OiBiaW5kaW5nc19hdXggYWNjdSByKSBsXG5cbiAgICBsZXQgYmluZGluZ3MgcyA9XG4gICAgICBiaW5kaW5nc19hdXggW10gc1xuXG4gICAgbGV0IGNob29zZSA9IG1pbl9iaW5kaW5nXG5cbiAgICBsZXQgY2hvb3NlX29wdCA9IG1pbl9iaW5kaW5nX29wdFxuXG4gICAgbGV0IGFkZF9zZXEgaSBtID1cbiAgICAgIFNlcS5mb2xkX2xlZnQgKGZ1biBtIChrLHYpIC0+IGFkZCBrIHYgbSkgbSBpXG5cbiAgICBsZXQgb2Zfc2VxIGkgPSBhZGRfc2VxIGkgZW1wdHlcblxuICAgIGxldCByZWMgc2VxX29mX2VudW1fIGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICAgIHwgRW5kIC0+IFNlcS5OaWxcbiAgICAgIHwgTW9yZSAoayx2LHQscmVzdCkgLT4gU2VxLkNvbnMgKChrLHYpLCBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3NlcSBtID1cbiAgICAgIHNlcV9vZl9lbnVtXyAoY29uc19lbnVtIG0gRW5kKVxuXG4gICAgbGV0IHJlYyBzbm9jX2VudW0gcyBlID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgICBFbXB0eSAtPiBlXG4gICAgICB8IE5vZGV7bDsgdjsgZDsgcn0gLT4gc25vY19lbnVtIHIgKE1vcmUodiwgZCwgbCwgZSkpXG5cbiAgICBsZXQgcmVjIHJldl9zZXFfb2ZfZW51bV8gYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgICAgfCBFbmQgLT4gU2VxLk5pbFxuICAgICAgfCBNb3JlIChrLHYsdCxyZXN0KSAtPlxuICAgICAgICAgIFNlcS5Db25zICgoayx2KSwgcmV2X3NlcV9vZl9lbnVtXyAoc25vY19lbnVtIHQgcmVzdCkpXG5cbiAgICBsZXQgdG9fcmV2X3NlcSBjID1cbiAgICAgIHJldl9zZXFfb2ZfZW51bV8gKHNub2NfZW51bSBjIEVuZClcblxuICAgIGxldCB0b19zZXFfZnJvbSBsb3cgbSA9XG4gICAgICBsZXQgcmVjIGF1eCBsb3cgbSBjID0gbWF0Y2ggbSB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gY1xuICAgICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IF99IC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBPcmQuY29tcGFyZSB2IGxvdyB3aXRoXG4gICAgICAgICAgICAgIHwgMCAtPiBNb3JlICh2LCBkLCByLCBjKVxuICAgICAgICAgICAgICB8IG4gd2hlbiBuPDAgLT4gYXV4IGxvdyByIGNcbiAgICAgICAgICAgICAgfCBfIC0+IGF1eCBsb3cgbCAoTW9yZSAodiwgZCwgciwgYykpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGluXG4gICAgICBzZXFfb2ZfZW51bV8gKGF1eCBsb3cgbSBFbmQpXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAnYSB0ID0geyBtdXRhYmxlIGMgOiAnYSBsaXN0OyBtdXRhYmxlIGxlbiA6IGludDsgfVxuXG5leGNlcHRpb24gRW1wdHlcblxubGV0IGNyZWF0ZSAoKSA9IHsgYyA9IFtdOyBsZW4gPSAwOyB9XG5cbmxldCBjbGVhciBzID0gcy5jIDwtIFtdOyBzLmxlbiA8LSAwXG5cbmxldCBjb3B5IHMgPSB7IGMgPSBzLmM7IGxlbiA9IHMubGVuOyB9XG5cbmxldCBwdXNoIHggcyA9IHMuYyA8LSB4IDo6IHMuYzsgcy5sZW4gPC0gcy5sZW4gKyAxXG5cbmxldCBwb3AgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6OnRsIC0+IHMuYyA8LSB0bDsgcy5sZW4gPC0gcy5sZW4gLSAxOyBoZFxuICB8IFtdICAgICAtPiByYWlzZSBFbXB0eVxuXG5sZXQgcG9wX29wdCBzID1cbiAgbWF0Y2ggcy5jIHdpdGhcbiAgfCBoZDo6dGwgLT4gcy5jIDwtIHRsOyBzLmxlbiA8LSBzLmxlbiAtIDE7IFNvbWUgaGRcbiAgfCBbXSAgICAgLT4gTm9uZVxuXG5sZXQgdG9wIHMgPVxuICBtYXRjaCBzLmMgd2l0aFxuICB8IGhkOjpfIC0+IGhkXG4gIHwgW10gICAgLT4gcmFpc2UgRW1wdHlcblxubGV0IHRvcF9vcHQgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6Ol8gLT4gU29tZSBoZFxuICB8IFtdICAgIC0+IE5vbmVcblxubGV0IGlzX2VtcHR5IHMgPSAocy5jID0gW10pXG5cbmxldCBsZW5ndGggcyA9IHMubGVuXG5cbmxldCBpdGVyIGYgcyA9IExpc3QuaXRlciBmIHMuY1xuXG5sZXQgZm9sZCBmIGFjYyBzID0gTGlzdC5mb2xkX2xlZnQgZiBhY2Mgcy5jXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgcyA9IExpc3QudG9fc2VxIHMuY1xuXG5sZXQgYWRkX3NlcSBxIGkgPSBTZXEuaXRlciAoZnVuIHggLT4gcHVzaCB4IHEpIGlcblxubGV0IG9mX3NlcSBnID1cbiAgbGV0IHMgPSBjcmVhdGUoKSBpblxuICBhZGRfc2VxIHMgZztcbiAgc1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICBGcmFuY29pcyBQb3R0aWVyLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICBKZXJlbWllIERpbWlubywgSmFuZSBTdHJlZXQgRXVyb3BlICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leGNlcHRpb24gRW1wdHlcblxudHlwZSAnYSBjZWxsID1cbiAgfCBOaWxcbiAgfCBDb25zIG9mIHsgY29udGVudDogJ2E7IG11dGFibGUgbmV4dDogJ2EgY2VsbCB9XG5cbnR5cGUgJ2EgdCA9IHtcbiAgbXV0YWJsZSBsZW5ndGg6IGludDtcbiAgbXV0YWJsZSBmaXJzdDogJ2EgY2VsbDtcbiAgbXV0YWJsZSBsYXN0OiAnYSBjZWxsXG59XG5cbmxldCBjcmVhdGUgKCkgPSB7XG4gIGxlbmd0aCA9IDA7XG4gIGZpcnN0ID0gTmlsO1xuICBsYXN0ID0gTmlsXG59XG5cbmxldCBjbGVhciBxID1cbiAgcS5sZW5ndGggPC0gMDtcbiAgcS5maXJzdCA8LSBOaWw7XG4gIHEubGFzdCA8LSBOaWxcblxubGV0IGFkZCB4IHEgPVxuICBsZXQgY2VsbCA9IENvbnMge1xuICAgIGNvbnRlbnQgPSB4O1xuICAgIG5leHQgPSBOaWxcbiAgfSBpblxuICBtYXRjaCBxLmxhc3Qgd2l0aFxuICB8IE5pbCAtPlxuICAgIHEubGVuZ3RoIDwtIDE7XG4gICAgcS5maXJzdCA8LSBjZWxsO1xuICAgIHEubGFzdCA8LSBjZWxsXG4gIHwgQ29ucyBsYXN0IC0+XG4gICAgcS5sZW5ndGggPC0gcS5sZW5ndGggKyAxO1xuICAgIGxhc3QubmV4dCA8LSBjZWxsO1xuICAgIHEubGFzdCA8LSBjZWxsXG5cbmxldCBwdXNoID1cbiAgYWRkXG5cbmxldCBwZWVrIHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gcmFpc2UgRW1wdHlcbiAgfCBDb25zIHsgY29udGVudCB9IC0+IGNvbnRlbnRcblxubGV0IHBlZWtfb3B0IHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gTm9uZVxuICB8IENvbnMgeyBjb250ZW50IH0gLT4gU29tZSBjb250ZW50XG5cbmxldCB0b3AgPVxuICBwZWVrXG5cbmxldCB0YWtlIHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gcmFpc2UgRW1wdHlcbiAgfCBDb25zIHsgY29udGVudDsgbmV4dCA9IE5pbCB9IC0+XG4gICAgY2xlYXIgcTtcbiAgICBjb250ZW50XG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgIHEubGVuZ3RoIDwtIHEubGVuZ3RoIC0gMTtcbiAgICBxLmZpcnN0IDwtIG5leHQ7XG4gICAgY29udGVudFxuXG5sZXQgdGFrZV9vcHQgcSA9XG4gIG1hdGNoIHEuZmlyc3Qgd2l0aFxuICB8IE5pbCAtPiBOb25lXG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgPSBOaWwgfSAtPlxuICAgIGNsZWFyIHE7XG4gICAgU29tZSBjb250ZW50XG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgIHEubGVuZ3RoIDwtIHEubGVuZ3RoIC0gMTtcbiAgICBxLmZpcnN0IDwtIG5leHQ7XG4gICAgU29tZSBjb250ZW50XG5cbmxldCBwb3AgPVxuICB0YWtlXG5cbmxldCBjb3B5ID1cbiAgbGV0IHJlYyBjb3B5IHFfcmVzIHByZXYgY2VsbCA9XG4gICAgbWF0Y2ggY2VsbCB3aXRoXG4gICAgfCBOaWwgLT4gcV9yZXMubGFzdCA8LSBwcmV2OyBxX3Jlc1xuICAgIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgICAgbGV0IHJlcyA9IENvbnMgeyBjb250ZW50OyBuZXh0ID0gTmlsIH0gaW5cbiAgICAgIGJlZ2luIG1hdGNoIHByZXYgd2l0aFxuICAgICAgfCBOaWwgLT4gcV9yZXMuZmlyc3QgPC0gcmVzXG4gICAgICB8IENvbnMgcCAtPiBwLm5leHQgPC0gcmVzXG4gICAgICBlbmQ7XG4gICAgICBjb3B5IHFfcmVzIHJlcyBuZXh0XG4gIGluXG4gIGZ1biBxIC0+IGNvcHkgeyBsZW5ndGggPSBxLmxlbmd0aDsgZmlyc3QgPSBOaWw7IGxhc3QgPSBOaWwgfSBOaWwgcS5maXJzdFxuXG5sZXQgaXNfZW1wdHkgcSA9XG4gIHEubGVuZ3RoID0gMFxuXG5sZXQgbGVuZ3RoIHEgPVxuICBxLmxlbmd0aFxuXG5sZXQgaXRlciA9XG4gIGxldCByZWMgaXRlciBmIGNlbGwgPVxuICAgIG1hdGNoIGNlbGwgd2l0aFxuICAgIHwgTmlsIC0+ICgpXG4gICAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgICBmIGNvbnRlbnQ7XG4gICAgICBpdGVyIGYgbmV4dFxuICBpblxuICBmdW4gZiBxIC0+IGl0ZXIgZiBxLmZpcnN0XG5cbmxldCBmb2xkID1cbiAgbGV0IHJlYyBmb2xkIGYgYWNjdSBjZWxsID1cbiAgICBtYXRjaCBjZWxsIHdpdGhcbiAgICB8IE5pbCAtPiBhY2N1XG4gICAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgICBsZXQgYWNjdSA9IGYgYWNjdSBjb250ZW50IGluXG4gICAgICBmb2xkIGYgYWNjdSBuZXh0XG4gIGluXG4gIGZ1biBmIGFjY3UgcSAtPiBmb2xkIGYgYWNjdSBxLmZpcnN0XG5cbmxldCB0cmFuc2ZlciBxMSBxMiA9XG4gIGlmIHExLmxlbmd0aCA+IDAgdGhlblxuICAgIG1hdGNoIHEyLmxhc3Qgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICBxMi5sZW5ndGggPC0gcTEubGVuZ3RoO1xuICAgICAgcTIuZmlyc3QgPC0gcTEuZmlyc3Q7XG4gICAgICBxMi5sYXN0IDwtIHExLmxhc3Q7XG4gICAgICBjbGVhciBxMVxuICAgIHwgQ29ucyBsYXN0IC0+XG4gICAgICBxMi5sZW5ndGggPC0gcTIubGVuZ3RoICsgcTEubGVuZ3RoO1xuICAgICAgbGFzdC5uZXh0IDwtIHExLmZpcnN0O1xuICAgICAgcTIubGFzdCA8LSBxMS5sYXN0O1xuICAgICAgY2xlYXIgcTFcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBxID1cbiAgbGV0IHJlYyBhdXggYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgIHwgTmlsIC0+IFNlcS5OaWxcbiAgICB8IENvbnMgeyBjb250ZW50PXg7IG5leHQ7IH0gLT4gU2VxLkNvbnMgKHgsIGF1eCBuZXh0KVxuICBpblxuICBhdXggcS5maXJzdFxuXG5sZXQgYWRkX3NlcSBxIGkgPSBTZXEuaXRlciAoZnVuIHggLT4gcHVzaCB4IHEpIGlcblxubGV0IG9mX3NlcSBnID1cbiAgbGV0IHEgPSBjcmVhdGUoKSBpblxuICBhZGRfc2VxIHEgZztcbiAgcVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgUGllcnJlIFdlaXMgYW5kIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5OSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFeHRlbnNpYmxlIGJ1ZmZlcnMgKilcblxuKCogVGhlIFtpbm5lcl9idWZmZXJdIHR5cGUgZW5zdXJlcyB0aGF0IHRoZSBbbGVuZ3RoXSBhbmQgW2J1ZmZlcl0gZmllbGRzIGFyZVxuICAgYWx3YXlzIHN5bmNocm9uaXplZCwgW2xlbmd0aCA9IEJ5dGVzLmxlbmd0aCBidWZmZXJdLCBldmVuIGluIHByZXNlbmNlXG4gICBvZiBkYXRhIHJhY2VzLlxuKilcbnR5cGUgaW5uZXJfYnVmZmVyID0ge1xuICBidWZmZXI6IGJ5dGVzO1xuICBsZW5ndGg6IGludDtcbn1cblxudHlwZSB0ID1cbiB7bXV0YWJsZSBpbm5lciA6IGlubmVyX2J1ZmZlcjtcbiAgbXV0YWJsZSBwb3NpdGlvbiA6IGludDtcbiAgaW5pdGlhbF9idWZmZXIgOiBieXRlc31cbigqIEludmFyaWFudHM6IGFsbCBwYXJ0cyBvZiB0aGUgY29kZSBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50cyB0aGF0OlxuICAgLSBbaW5uZXIubGVuZ3RoID0gQnl0ZXMubGVuZ3RoIGlubmVyLmJ1ZmZlcl1cbiAgIEluIGFic2VuY2Ugb2YgZGF0YSByYWNlcywgd2UgYWxzbyBoYXZlXG4gICAtIFswIDw9IGIucG9zaXRpb24gPD0gYi5pbm5lci5sZW5ndGhdXG5cbiAgIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IFtiLnBvc2l0aW9uID0gYi5pbm5lci5sZW5ndGhdIGlzIGxlZ2FsLFxuICAgaXQgbWVhbnMgdGhhdCB0aGUgYnVmZmVyIGlzIGZ1bGwgYW5kIHdpbGwgaGF2ZSB0byBiZSBleHRlbmRlZFxuICAgYmVmb3JlIGFueSBmdXJ0aGVyIGFkZGl0aW9uLiAqKVxuXG5sZXQgY3JlYXRlIG4gPVxuIGxldCBuID0gaWYgbiA8IDEgdGhlbiAxIGVsc2UgbiBpblxuIGxldCBuID0gaWYgbiA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBlbHNlIG4gaW5cbiBsZXQgcyA9IEJ5dGVzLmNyZWF0ZSBuIGluXG4geyBpbm5lciA9IHsgYnVmZmVyID0gczsgbGVuZ3RoID0gbn07IHBvc2l0aW9uID0gMDsgaW5pdGlhbF9idWZmZXIgPSBzfVxuXG5sZXQgY29udGVudHMgYiA9IEJ5dGVzLnN1Yl9zdHJpbmcgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5sZXQgdG9fYnl0ZXMgYiA9IEJ5dGVzLnN1YiBiLmlubmVyLmJ1ZmZlciAwIGIucG9zaXRpb25cblxubGV0IHN1YiBiIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gYi5wb3NpdGlvbiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLnN1YlwiXG4gIGVsc2UgQnl0ZXMuc3ViX3N0cmluZyBiLmlubmVyLmJ1ZmZlciBvZnMgbGVuXG5cblxubGV0IGJsaXQgc3JjIHNyY29mZiBkc3QgZHN0b2ZmIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgc3Jjb2ZmIDwgMCB8fCBzcmNvZmYgPiBzcmMucG9zaXRpb24gLSBsZW5cbiAgICAgICAgICAgICB8fCBkc3RvZmYgPCAwIHx8IGRzdG9mZiA+IChCeXRlcy5sZW5ndGggZHN0KSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLmJsaXRcIlxuICBlbHNlXG4gICAgQnl0ZXMuYmxpdCBzcmMuaW5uZXIuYnVmZmVyIHNyY29mZiBkc3QgZHN0b2ZmIGxlblxuXG5cbmxldCBudGggYiBvZnMgPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGlmIG9mcyA8IDAgfHwgb2ZzID49IHBvc2l0aW9uIHx8IHBvc2l0aW9uID4gbGVuZ3RoIHRoZW5cbiAgIGludmFsaWRfYXJnIFwiQnVmZmVyLm50aFwiXG4gIGVsc2UgQnl0ZXMudW5zYWZlX2dldCBidWZmZXIgb2ZzXG5cblxubGV0IGxlbmd0aCBiID0gYi5wb3NpdGlvblxuXG5sZXQgY2xlYXIgYiA9IGIucG9zaXRpb24gPC0gMFxuXG5sZXQgcmVzZXQgYiA9XG4gIGIucG9zaXRpb24gPC0gMDtcbiAgbGV0IGlubmVyID1cbiAgICB7IGJ1ZmZlciA9IGIuaW5pdGlhbF9idWZmZXI7IGxlbmd0aCA9IEJ5dGVzLmxlbmd0aCBiLmluaXRpYWxfYnVmZmVyIH1cbiAgaW5cbiAgYi5pbm5lciA8LSBpbm5lclxuXG4oKiBbcmVzaXplIGIgbW9yZV0gZW5zdXJlcyB0aGF0IFtiLnBvc2l0aW9uICsgbW9yZSA8PSBiLmlubmVyLmxlbmd0aF0gaG9sZHNcbiAgIGJ5IGR5bmFtaWNhbGx5IGV4dGVuZGluZyBbYi5pbm5lcl0gaWYgbmVjZXNzYXJ5IC0tIGFuZCB0aHVzXG4gICBpbmNyZWFzaW5nIFtiLmlubmVyLmxlbmd0aF0uXG4qKVxubGV0IHJlc2l6ZSBiIG1vcmUgPVxuICBsZXQgb2xkX3BvcyA9IGIucG9zaXRpb24gaW5cbiAgbGV0IG9sZF9sZW4gPSBiLmlubmVyLmxlbmd0aCBpblxuICBsZXQgbmV3X2xlbiA9IHJlZiBvbGRfbGVuIGluXG4gIHdoaWxlIG9sZF9wb3MgKyBtb3JlID4gIW5ld19sZW4gZG8gbmV3X2xlbiA6PSAyICogIW5ld19sZW4gZG9uZTtcbiAgaWYgIW5ld19sZW4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiBiZWdpblxuICAgIGlmIG9sZF9wb3MgKyBtb3JlIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgIHRoZW4gbmV3X2xlbiA6PSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICBlbHNlIGZhaWx3aXRoIFwiQnVmZmVyLmFkZDogY2Fubm90IGdyb3cgYnVmZmVyXCJcbiAgZW5kO1xuICBsZXQgbmV3X2J1ZmZlciA9IEJ5dGVzLmNyZWF0ZSAhbmV3X2xlbiBpblxuICAoKiBQUiM2MTQ4OiBsZXQncyBrZWVwIHVzaW5nIFtibGl0XSByYXRoZXIgdGhhbiBbdW5zYWZlX2JsaXRdIGluXG4gICAgIHRoaXMgdHJpY2t5IGZ1bmN0aW9uIHRoYXQgaXMgc2xvdyBhbnl3YXkuICopXG4gIEJ5dGVzLmJsaXQgYi5pbm5lci5idWZmZXIgMCBuZXdfYnVmZmVyIDAgYi5wb3NpdGlvbjtcbiAgYi5pbm5lciA8LSB7IGJ1ZmZlciA9IG5ld19idWZmZXI7IGxlbmd0aCA9ICFuZXdfbGVuIH1cblxuKCogTm90ZTpcbiAgICBTb21lIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgaGF2ZSBhIGZhc3QgcGF0aCB3aGVuIHRoZSBpbm5lclxuICBidWZmZXIgZG9lc24ndCBuZWVkIHRvIGJlIGV4dGVuZGVkLlxuICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHVuc2FmZSBhY2Nlc3NlcyBvbiB0aGVcbiAgY29udGVudHMgb2YgdGhlIFtpbm5lcl0gZmllbGQgc2luY2UgaXRzIGZpZWxkcyBhcmUgaW1tdXRhYmxlLlxuICBJbiBwcmVzZW5jZSBvZiBkYXRhIHJhY2VzLCB3ZSBtYXkgYWNjZXNzIHRoZSB3cm9uZyBpbm5lciBidWZmZXIsIGJ1dCB3ZVxuICB3aWxsIHVzZSB0aGlzIGJ1ZmZlciBzYWZlbHkuXG4gIEFzIHNvb24gYXMgd2UgbmVlZCB0byByZXNpemUgdGhlIGJ1ZmZlciwgd2UgZmFsbCBiYWNrIHRvIHNhZmUgYWNjZXNzZXMuXG4qKVxuXG5sZXQgYWRkX2NoYXIgYiBjID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtidWZmZXI7bGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgaWYgcG9zID49IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAxO1xuICAgIEJ5dGVzLnNldCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGNcbiAgKSBlbHNlXG4gICAgQnl0ZXMudW5zYWZlX3NldCBidWZmZXIgcG9zIGM7XG4gIGIucG9zaXRpb24gPC0gcG9zICsgMVxuXG5sZXQgdWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4ID0gNFxubGV0IHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXggPSA0XG5cbmxldCByZWMgYWRkX3V0Zl84X3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heDtcbiAgbGV0IG4gPSBCeXRlcy5zZXRfdXRmXzhfdWNoYXIgYi5pbm5lci5idWZmZXIgcG9zIHUgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiAocmVzaXplIGIgdWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzhfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCByZWMgYWRkX3V0Zl8xNmJlX3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl8xNmJlX3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfMTZiZV91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IHJlYyBhZGRfdXRmXzE2bGVfdWNoYXIgYiB1ID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDtcbiAgbGV0IG4gPSBCeXRlcy5zZXRfdXRmXzE2bGVfdWNoYXIgYi5pbm5lci5idWZmZXIgcG9zIHUgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiAocmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl8xNmxlX3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgYWRkX3N1YnN0cmluZyBiIHMgb2Zmc2V0IGxlbiA9XG4gIGlmIG9mZnNldCA8IDAgfHwgbGVuIDwgMCB8fCBvZmZzZXQgPiBTdHJpbmcubGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5hZGRfc3Vic3RyaW5nL2FkZF9zdWJieXRlc1wiO1xuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBwb3NpdGlvbiArIGxlbiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgbGVuO1xuICAgIEJ5dGVzLmJsaXRfc3RyaW5nIHMgb2Zmc2V0IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuXG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9ibGl0X3N0cmluZyBzIG9mZnNldCBidWZmZXIgcG9zaXRpb24gbGVuO1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX3N1YmJ5dGVzIGIgcyBvZmZzZXQgbGVuID1cbiAgYWRkX3N1YnN0cmluZyBiIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMpIG9mZnNldCBsZW5cblxubGV0IGFkZF9zdHJpbmcgYiBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyOyBsZW5ndGh9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gYi5wb3NpdGlvbiArIGxlbiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgbGVuO1xuICAgIEJ5dGVzLmJsaXRfc3RyaW5nIHMgMCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlbjtcbiAgKSBlbHNlXG4gICAgQnl0ZXMudW5zYWZlX2JsaXRfc3RyaW5nIHMgMCBidWZmZXIgcG9zaXRpb24gbGVuO1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2J5dGVzIGIgcyA9IGFkZF9zdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKVxuXG5sZXQgYWRkX2J1ZmZlciBiIGJzID1cbiAgYWRkX3N1YmJ5dGVzIGIgYnMuaW5uZXIuYnVmZmVyIDAgYnMucG9zaXRpb25cblxuKCogdGhpcyAocHJpdmF0ZSkgZnVuY3Rpb24gY291bGQgbW92ZSBpbnRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG5sZXQgcmVhbGx5X2lucHV0X3VwX3RvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWQgPVxuICAgIGlmIHRvX3JlYWQgPSAwIHRoZW4gYWxyZWFkeV9yZWFkXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBpbnB1dCBpYyBidWYgb2ZzIHRvX3JlYWQgaW5cbiAgICAgIGlmIHIgPSAwIHRoZW4gYWxyZWFkeV9yZWFkXG4gICAgICBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBhbHJlYWR5X3JlYWQgPSBhbHJlYWR5X3JlYWQgKyByIGluXG4gICAgICAgIGxldCBvZnMgPSBvZnMgKyByIGluXG4gICAgICAgIGxldCB0b19yZWFkID0gdG9fcmVhZCAtIHIgaW5cbiAgICAgICAgbG9vcCBpYyBidWYgfmFscmVhZHlfcmVhZCB+b2ZzIH50b19yZWFkXG4gICAgICBlbmRcbiAgICBlbmRcbiAgaW4gbG9vcCBpYyBidWYgfmFscmVhZHlfcmVhZDowIH5vZnMgfnRvX3JlYWQ6bGVuXG5cblxubGV0IHVuc2FmZV9hZGRfY2hhbm5lbF91cF90byBiIGljIGxlbiA9XG4gIGlmIGIucG9zaXRpb24gKyBsZW4gPiBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIGxlbjtcbiAgbGV0IG4gPSByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBsZW4gaW5cbiAgYi5wb3NpdGlvbiA8LSBiLnBvc2l0aW9uICsgbjtcbiAgblxuXG5sZXQgYWRkX2NoYW5uZWwgYiBpYyBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IGxlbiA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuICAgKCogUFIjNTAwNCAqKVxuICAgIGludmFsaWRfYXJnIFwiQnVmZmVyLmFkZF9jaGFubmVsXCI7XG4gIGxldCBuID0gdW5zYWZlX2FkZF9jaGFubmVsX3VwX3RvIGIgaWMgbGVuIGluXG4gICgqIEl0IGlzIGludGVudGlvbmFsIHRoYXQgYSBjb25zdW1lciBjYXRjaGluZyBFbmRfb2ZfZmlsZVxuICAgICB3aWxsIHNlZSB0aGUgZGF0YSB3cml0dGVuIChzZWUgIzY3MTksICM3MTM2KS4gKilcbiAgaWYgbiA8IGxlbiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlO1xuICAoKVxuXG5sZXQgb3V0cHV0X2J1ZmZlciBvYyBiID1cbiAgb3V0cHV0IG9jIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxuXG5sZXQgY2xvc2luZyA9IGZ1bmN0aW9uXG4gIHwgJygnIC0+ICcpJ1xuICB8ICd7JyAtPiAnfSdcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4oKiBvcGVuaW5nIGFuZCBjbG9zaW5nOiBvcGVuIGFuZCBjbG9zZSBjaGFyYWN0ZXJzLCB0eXBpY2FsbHkgKCBhbmQgKVxuICAgazogYmFsYW5jZSBvZiBvcGVuaW5nIGFuZCBjbG9zaW5nIGNoYXJzXG4gICBzOiB0aGUgc3RyaW5nIHdoZXJlIHdlIGFyZSBzZWFyY2hpbmdcbiAgIHN0YXJ0OiB0aGUgaW5kZXggd2hlcmUgd2Ugc3RhcnQgdGhlIHNlYXJjaC4gKilcbmxldCBhZHZhbmNlX3RvX2Nsb3Npbmcgb3BlbmluZyBjbG9zaW5nIGsgcyBzdGFydCA9XG4gIGxldCByZWMgYWR2YW5jZSBrIGkgbGltID1cbiAgICBpZiBpID49IGxpbSB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gICAgaWYgcy5baV0gPSBvcGVuaW5nIHRoZW4gYWR2YW5jZSAoayArIDEpIChpICsgMSkgbGltIGVsc2VcbiAgICBpZiBzLltpXSA9IGNsb3NpbmcgdGhlblxuICAgICAgaWYgayA9IDAgdGhlbiBpIGVsc2UgYWR2YW5jZSAoayAtIDEpIChpICsgMSkgbGltXG4gICAgZWxzZSBhZHZhbmNlIGsgKGkgKyAxKSBsaW0gaW5cbiAgYWR2YW5jZSBrIHN0YXJ0IChTdHJpbmcubGVuZ3RoIHMpXG5cbmxldCBhZHZhbmNlX3RvX25vbl9hbHBoYSBzIHN0YXJ0ID1cbiAgbGV0IHJlYyBhZHZhbmNlIGkgbGltID1cbiAgICBpZiBpID49IGxpbSB0aGVuIGxpbSBlbHNlXG4gICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgIHwgJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIHwgJ18nIC0+IGFkdmFuY2UgKGkgKyAxKSBsaW1cbiAgICB8IF8gLT4gaSBpblxuICBhZHZhbmNlIHN0YXJ0IChTdHJpbmcubGVuZ3RoIHMpXG5cbigqIFdlIGFyZSBqdXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYW4gaWRlbnQgaW4gcywgc3RhcnRpbmcgYXQgc3RhcnQuICopXG5sZXQgZmluZF9pZGVudCBzIHN0YXJ0IGxpbSA9XG4gIGlmIHN0YXJ0ID49IGxpbSB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIG1hdGNoIHMuW3N0YXJ0XSB3aXRoXG4gICgqIFBhcmVudGhlc2l6ZWQgaWRlbnQgPyAqKVxuICB8ICcoJyB8ICd7JyBhcyBjIC0+XG4gICAgIGxldCBuZXdfc3RhcnQgPSBzdGFydCArIDEgaW5cbiAgICAgbGV0IHN0b3AgPSBhZHZhbmNlX3RvX2Nsb3NpbmcgYyAoY2xvc2luZyBjKSAwIHMgbmV3X3N0YXJ0IGluXG4gICAgIFN0cmluZy5zdWIgcyBuZXdfc3RhcnQgKHN0b3AgLSBzdGFydCAtIDEpLCBzdG9wICsgMVxuICAoKiBSZWd1bGFyIGlkZW50ICopXG4gIHwgXyAtPlxuICAgICBsZXQgc3RvcCA9IGFkdmFuY2VfdG9fbm9uX2FscGhhIHMgKHN0YXJ0ICsgMSkgaW5cbiAgICAgU3RyaW5nLnN1YiBzIHN0YXJ0IChzdG9wIC0gc3RhcnQpLCBzdG9wXG5cbigqIFN1YnN0aXR1dGUgJGlkZW50LCAkKGlkZW50KSwgb3IgJHtpZGVudH0gaW4gcyxcbiAgICBhY2NvcmRpbmcgdG8gdGhlIGZ1bmN0aW9uIG1hcHBpbmcgZi4gKilcbmxldCBhZGRfc3Vic3RpdHV0ZSBiIGYgcyA9XG4gIGxldCBsaW0gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBzdWJzdCBwcmV2aW91cyBpID1cbiAgICBpZiBpIDwgbGltIHRoZW4gYmVnaW5cbiAgICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICAgIHwgJyQnIGFzIGN1cnJlbnQgd2hlbiBwcmV2aW91cyA9ICdcXFxcJyAtPlxuICAgICAgICAgYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgJyAnIChpICsgMSlcbiAgICAgIHwgJyQnIC0+XG4gICAgICAgICBsZXQgaiA9IGkgKyAxIGluXG4gICAgICAgICBsZXQgaWRlbnQsIG5leHRfaSA9IGZpbmRfaWRlbnQgcyBqIGxpbSBpblxuICAgICAgICAgYWRkX3N0cmluZyBiIChmIGlkZW50KTtcbiAgICAgICAgIHN1YnN0ICcgJyBuZXh0X2lcbiAgICAgIHwgY3VycmVudCB3aGVuIHByZXZpb3VzID09ICdcXFxcJyAtPlxuICAgICAgICAgYWRkX2NoYXIgYiAnXFxcXCc7XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCAnICcgKGkgKyAxKVxuICAgICAgfCAnXFxcXCcgYXMgY3VycmVudCAtPlxuICAgICAgICAgc3Vic3QgY3VycmVudCAoaSArIDEpXG4gICAgICB8IGN1cnJlbnQgLT5cbiAgICAgICAgIGFkZF9jaGFyIGIgY3VycmVudDtcbiAgICAgICAgIHN1YnN0IGN1cnJlbnQgKGkgKyAxKVxuICAgIGVuZCBlbHNlXG4gICAgaWYgcHJldmlvdXMgPSAnXFxcXCcgdGhlbiBhZGRfY2hhciBiIHByZXZpb3VzIGluXG4gIHN1YnN0ICcgJyAwXG5cbmxldCB0cnVuY2F0ZSBiIGxlbiA9XG4gICAgaWYgbGVuIDwgMCB8fCBsZW4gPiBsZW5ndGggYiB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci50cnVuY2F0ZVwiXG4gICAgZWxzZVxuICAgICAgYi5wb3NpdGlvbiA8LSBsZW5cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBiID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgKCogTm90ZSB0aGF0IGIucG9zaXRpb24gaXMgbm90IGEgY29uc3RhbnQgYW5kIGNhbm5vdCBiZSBsaWZ0ZWQgb3V0IG9mIGF1eCAqKVxuICAgIGlmIGkgPj0gYi5wb3NpdGlvbiB0aGVuIFNlcS5OaWxcbiAgICBlbHNlXG4gICAgICBsZXQgeCA9IEJ5dGVzLmdldCBiLmlubmVyLmJ1ZmZlciBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBiID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgKCogTm90ZSB0aGF0IGIucG9zaXRpb24gaXMgbm90IGEgY29uc3RhbnQgYW5kIGNhbm5vdCBiZSBsaWZ0ZWQgb3V0IG9mIGF1eCAqKVxuICAgIGlmIGkgPj0gYi5wb3NpdGlvbiB0aGVuIFNlcS5OaWxcbiAgICBlbHNlXG4gICAgICBsZXQgeCA9IEJ5dGVzLmdldCBiLmlubmVyLmJ1ZmZlciBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgaW5cbiAgYXV4IDBcblxubGV0IGFkZF9zZXEgYiBzZXEgPSBTZXEuaXRlciAoYWRkX2NoYXIgYikgc2VxXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBiID0gY3JlYXRlIDMyIGluXG4gIGFkZF9zZXEgYiBpO1xuICBiXG5cbigqKiB7NiBCaW5hcnkgZW5jb2Rpbmcgb2YgaW50ZWdlcnN9ICopXG5cbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQxNiA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZ1XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50MzIgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MzJ1XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjR1XCJcbmV4dGVybmFsIHNldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgc2V0X2ludDE2IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNlwiXG5leHRlcm5hbCBzZXRfaW50MzIgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MzJcIlxuZXh0ZXJuYWwgc2V0X2ludDY0IDogYnl0ZXMgLT4gaW50IC0+IGludDY0IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDY0XCJcblxuZXh0ZXJuYWwgc3dhcDE2IDogaW50IC0+IGludCA9IFwiJWJzd2FwMTZcIlxuZXh0ZXJuYWwgc3dhcDMyIDogaW50MzIgLT4gaW50MzIgPSBcIiVic3dhcF9pbnQzMlwiXG5leHRlcm5hbCBzd2FwNjQgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWJzd2FwX2ludDY0XCJcblxuXG5sZXQgYWRkX2ludDggYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgMSBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMTtcbiAgICBzZXRfaW50OCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIHhcbiAgKSBlbHNlXG4gICAgdW5zYWZlX3NldF9pbnQ4IGJ1ZmZlciBwb3NpdGlvbiB4O1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2ludDE2X25lIGIgeCA9XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtsZW5ndGg7IGJ1ZmZlcn0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBwb3NpdGlvbiArIDIgaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIDI7XG4gICAgc2V0X2ludDE2IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDE2IGJ1ZmZlciBwb3NpdGlvbiB4O1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2ludDMyX25lIGIgeCA9XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtsZW5ndGg7IGJ1ZmZlcn0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBwb3NpdGlvbiArIDQgaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIDQ7XG4gICAgc2V0X2ludDMyIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDMyIGJ1ZmZlciBwb3NpdGlvbiB4O1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2ludDY0X25lIGIgeCA9XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtsZW5ndGg7IGJ1ZmZlcn0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBwb3NpdGlvbiArIDggaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIDg7XG4gICAgc2V0X2ludDY0IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDY0IGJ1ZmZlciBwb3NpdGlvbiB4O1xuICBiLnBvc2l0aW9uIDwtIG5ld19wb3NpdGlvblxuXG5sZXQgYWRkX2ludDE2X2xlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQxNl9iZSBiIHggPVxuICBhZGRfaW50MTZfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDE2IHgpXG5cbmxldCBhZGRfaW50MzJfbGUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDMyX2JlIGIgeCA9XG4gIGFkZF9pbnQzMl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMzIgeClcblxubGV0IGFkZF9pbnQ2NF9sZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwNjQgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50NjRfYmUgYiB4ID1cbiAgYWRkX2ludDY0X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXA2NCB4KVxuXG5sZXQgYWRkX3VpbnQ4ID0gYWRkX2ludDhcbmxldCBhZGRfdWludDE2X25lID0gYWRkX2ludDE2X25lXG5sZXQgYWRkX3VpbnQxNl9sZSA9IGFkZF9pbnQxNl9sZVxubGV0IGFkZF91aW50MTZfYmUgPSBhZGRfaW50MTZfYmVcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgIFhhdmllciBMZXJveSwgQ29sbMOoZ2UgZGUgRnJhbmNlIGFuZCBJTlJJQSBQYXJpcyAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDIwIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqKiBTZW1hcGhvcmVzICopXG5cbnR5cGUgc2VtID0ge1xuICBtdXQ6IE11dGV4LnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICgqIHByb3RlY3RzIFt2XSAqKVxuICBtdXRhYmxlIHY6IGludDsgICAgICAgICAgICAgICAgICAgICAgICgqIHRoZSBjdXJyZW50IHZhbHVlICopXG4gIG5vbnplcm86IENvbmRpdGlvbi50ICAgICAgICAgICAgICAgICAgKCogc2lnbmFsZWQgd2hlbiBbdiA+IDBdICopXG59XG5cbm1vZHVsZSBDb3VudGluZyA9IHN0cnVjdFxuXG50eXBlIHQgPSBzZW1cblxubGV0IG1ha2UgdiA9XG4gIGlmIHYgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJTZW1hcGhvcmUuQ291bnRpbmcuaW5pdDogd3JvbmcgaW5pdGlhbCB2YWx1ZVwiO1xuICB7IG11dCA9IE11dGV4LmNyZWF0ZSgpOyB2OyBub256ZXJvID0gQ29uZGl0aW9uLmNyZWF0ZSgpIH1cblxubGV0IHJlbGVhc2UgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIGlmIHMudiA8IG1heF9pbnQgdGhlbiBiZWdpblxuICAgIHMudiA8LSBzLnYgKyAxO1xuICAgIENvbmRpdGlvbi5zaWduYWwgcy5ub256ZXJvO1xuICAgIE11dGV4LnVubG9jayBzLm11dFxuICBlbmQgZWxzZSBiZWdpblxuICAgIE11dGV4LnVubG9jayBzLm11dDtcbiAgICByYWlzZSAoU3lzX2Vycm9yIFwiU2VtYXBob3JlLkNvdW50aW5nLnJlbGVhc2U6IG92ZXJmbG93XCIpXG4gIGVuZFxuXG5sZXQgYWNxdWlyZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgd2hpbGUgcy52ID0gMCBkbyBDb25kaXRpb24ud2FpdCBzLm5vbnplcm8gcy5tdXQgZG9uZTtcbiAgcy52IDwtIHMudiAtIDE7XG4gIE11dGV4LnVubG9jayBzLm11dFxuXG5sZXQgdHJ5X2FjcXVpcmUgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIGxldCByZXQgPSBpZiBzLnYgPSAwIHRoZW4gZmFsc2UgZWxzZSAocy52IDwtIHMudiAtIDE7IHRydWUpIGluXG4gIE11dGV4LnVubG9jayBzLm11dDtcbiAgcmV0XG5cbmxldCBnZXRfdmFsdWUgcyA9IHMudlxuXG5lbmRcblxubW9kdWxlIEJpbmFyeSA9IHN0cnVjdFxuXG50eXBlIHQgPSBzZW1cblxubGV0IG1ha2UgYiA9XG4gIHsgbXV0ID0gTXV0ZXguY3JlYXRlKCk7XG4gICAgdiA9IGlmIGIgdGhlbiAxIGVsc2UgMDtcbiAgICBub256ZXJvID0gQ29uZGl0aW9uLmNyZWF0ZSgpIH1cblxubGV0IHJlbGVhc2UgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIHMudiA8LSAxO1xuICBDb25kaXRpb24uc2lnbmFsIHMubm9uemVybztcbiAgTXV0ZXgudW5sb2NrIHMubXV0XG5cbmxldCBhY3F1aXJlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICB3aGlsZSBzLnYgPSAwIGRvIENvbmRpdGlvbi53YWl0IHMubm9uemVybyBzLm11dCBkb25lO1xuICBzLnYgPC0gMDtcbiAgTXV0ZXgudW5sb2NrIHMubXV0XG5cbmxldCB0cnlfYWNxdWlyZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgbGV0IHJldCA9IGlmIHMudiA9IDAgdGhlbiBmYWxzZSBlbHNlIChzLnYgPC0gMDsgdHJ1ZSkgaW5cbiAgTXV0ZXgudW5sb2NrIHMubXV0O1xuICByZXRcblxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgIEtDIFNpdmFyYW1ha3Jpc2huYW4sIEluZGlhbiBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgTWFkcmFzICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgU3RlcGhlbiBEb2xhbiwgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICBUb20gS2VsbHksIE9DYW1sIExhYnMgQ29uc3VsdGFuY3kgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE5IEluZGlhbiBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgTWFkcmFzICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDIxIE9DYW1sIExhYnMgQ29uc3VsdGFuY3kgTHRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm1vZHVsZSBSYXcgPSBzdHJ1Y3RcbiAgKCogTG93LWxldmVsIHByaW1pdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWUgKilcbiAgdHlwZSB0ID0gcHJpdmF0ZSBpbnRcbiAgZXh0ZXJuYWwgc3Bhd24gOiAodW5pdCAtPiB1bml0KSAtPiBNdXRleC50IC0+IHRcbiAgICA9IFwiY2FtbF9kb21haW5fc3Bhd25cIlxuICBleHRlcm5hbCBzZWxmIDogdW5pdCAtPiB0XG4gICAgPSBcImNhbWxfbWxfZG9tYWluX2lkXCJcbiAgZXh0ZXJuYWwgY3B1X3JlbGF4IDogdW5pdCAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfZG9tYWluX2NwdV9yZWxheFwiXG4gIGV4dGVybmFsIGdldF9yZWNvbW1lbmRlZF9kb21haW5fY291bnQ6IHVuaXQgLT4gaW50XG4gICAgPSBcImNhbWxfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50XCIgW0BAbm9hbGxvY11cbmVuZFxuXG5sZXQgY3B1X3JlbGF4ICgpID0gUmF3LmNwdV9yZWxheCAoKVxuXG50eXBlIGlkID0gUmF3LnRcblxudHlwZSAnYSBzdGF0ZSA9XG58IFJ1bm5pbmdcbnwgRmluaXNoZWQgb2YgKCdhLCBleG4pIHJlc3VsdFxuXG50eXBlICdhIHQgPSB7XG4gIGRvbWFpbiA6IFJhdy50O1xuICB0ZXJtX211dGV4OiBNdXRleC50O1xuICB0ZXJtX2NvbmRpdGlvbjogQ29uZGl0aW9uLnQ7XG4gIHRlcm1fc3RhdGU6ICdhIHN0YXRlIHJlZiAoKiBwcm90ZWN0ZWQgYnkgW3Rlcm1fbXV0ZXhdICopXG59XG5cbm1vZHVsZSBETFMgPSBzdHJ1Y3RcblxuICB0eXBlIGRsc19zdGF0ZSA9IE9iai50IGFycmF5XG5cbiAgbGV0IHVuaXF1ZV92YWx1ZSA9IE9iai5yZXByIChyZWYgMClcblxuICBleHRlcm5hbCBnZXRfZGxzX3N0YXRlIDogdW5pdCAtPiBkbHNfc3RhdGUgPSBcIiVkbHNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXRfZGxzX3N0YXRlIDogZGxzX3N0YXRlIC0+IHVuaXQgPVxuICAgIFwiY2FtbF9kb21haW5fZGxzX3NldFwiIFtAQG5vYWxsb2NdXG5cbiAgbGV0IGNyZWF0ZV9kbHMgKCkgPVxuICAgIGxldCBzdCA9IEFycmF5Lm1ha2UgOCB1bmlxdWVfdmFsdWUgaW5cbiAgICBzZXRfZGxzX3N0YXRlIHN0XG5cbiAgbGV0IF8gPSBjcmVhdGVfZGxzICgpXG5cbiAgdHlwZSAnYSBrZXkgPSBpbnQgKiAodW5pdCAtPiAnYSlcblxuICBsZXQga2V5X2NvdW50ZXIgPSBBdG9taWMubWFrZSAwXG5cbiAgdHlwZSBrZXlfaW5pdGlhbGl6ZXIgPVxuICAgIEtJOiAnYSBrZXkgKiAoJ2EgLT4gJ2EpIC0+IGtleV9pbml0aWFsaXplclxuXG4gIGxldCBwYXJlbnRfa2V5cyA9IEF0b21pYy5tYWtlIChbXSA6IGtleV9pbml0aWFsaXplciBsaXN0KVxuXG4gIGxldCByZWMgYWRkX3BhcmVudF9rZXkga2kgPVxuICAgIGxldCBsID0gQXRvbWljLmdldCBwYXJlbnRfa2V5cyBpblxuICAgIGlmIG5vdCAoQXRvbWljLmNvbXBhcmVfYW5kX3NldCBwYXJlbnRfa2V5cyBsIChraSA6OiBsKSlcbiAgICB0aGVuIGFkZF9wYXJlbnRfa2V5IGtpXG5cbiAgbGV0IG5ld19rZXkgP3NwbGl0X2Zyb21fcGFyZW50IGluaXRfb3JwaGFuID1cbiAgICBsZXQgaWR4ID0gQXRvbWljLmZldGNoX2FuZF9hZGQga2V5X2NvdW50ZXIgMSBpblxuICAgIGxldCBrID0gKGlkeCwgaW5pdF9vcnBoYW4pIGluXG4gICAgYmVnaW4gbWF0Y2ggc3BsaXRfZnJvbV9wYXJlbnQgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBzcGxpdCAtPiBhZGRfcGFyZW50X2tleSAoS0koaywgc3BsaXQpKVxuICAgIGVuZDtcbiAgICBrXG5cbiAgKCogSWYgbmVjZXNzYXJ5LCBncm93IHRoZSBjdXJyZW50IGRvbWFpbidzIGxvY2FsIHN0YXRlIGFycmF5IHN1Y2ggdGhhdCBbaWR4XVxuICAgKiBpcyBhIHZhbGlkIGluZGV4IGluIHRoZSBhcnJheS4gKilcbiAgbGV0IG1heWJlX2dyb3cgaWR4ID1cbiAgICBsZXQgc3QgPSBnZXRfZGxzX3N0YXRlICgpIGluXG4gICAgbGV0IHN6ID0gQXJyYXkubGVuZ3RoIHN0IGluXG4gICAgaWYgaWR4IDwgc3ogdGhlbiBzdFxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByZWMgY29tcHV0ZV9uZXdfc2l6ZSBzID1cbiAgICAgICAgaWYgaWR4IDwgcyB0aGVuIHMgZWxzZSBjb21wdXRlX25ld19zaXplICgyICogcylcbiAgICAgIGluXG4gICAgICBsZXQgbmV3X3N6ID0gY29tcHV0ZV9uZXdfc2l6ZSBzeiBpblxuICAgICAgbGV0IG5ld19zdCA9IEFycmF5Lm1ha2UgbmV3X3N6IHVuaXF1ZV92YWx1ZSBpblxuICAgICAgQXJyYXkuYmxpdCBzdCAwIG5ld19zdCAwIHN6O1xuICAgICAgc2V0X2Rsc19zdGF0ZSBuZXdfc3Q7XG4gICAgICBuZXdfc3RcbiAgICBlbmRcblxuICBsZXQgc2V0IChpZHgsIF9pbml0KSB4ID1cbiAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpblxuICAgICgqIFtTeXMub3BhcXVlX2lkZW50aXR5XSBlbnN1cmVzIHRoYXQgZmxhbWJkYSBkb2VzIG5vdCBsb29rIGF0IHRoZSB0eXBlIG9mXG4gICAgICogW3hdLCB3aGljaCBtYXkgYmUgYSBbZmxvYXRdIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBbc3RdIGlzIGEgZmxvYXQgYXJyYXkuXG4gICAgICogV2UgZG8gbm90IHdhbnQgT0NhbWwncyBmbG9hdCBhcnJheSBvcHRpbWlzYXRpb24ga2lja2luZyBpbiBoZXJlLiAqKVxuICAgIHN0LihpZHgpIDwtIE9iai5yZXByIChTeXMub3BhcXVlX2lkZW50aXR5IHgpXG5cbiAgbGV0IGdldCAoaWR4LCBpbml0KSA9XG4gICAgbGV0IHN0ID0gbWF5YmVfZ3JvdyBpZHggaW5cbiAgICBsZXQgdiA9IHN0LihpZHgpIGluXG4gICAgaWYgdiA9PSB1bmlxdWVfdmFsdWUgdGhlblxuICAgICAgbGV0IHYnID0gT2JqLnJlcHIgKGluaXQgKCkpIGluXG4gICAgICBzdC4oaWR4KSA8LSAoU3lzLm9wYXF1ZV9pZGVudGl0eSB2Jyk7XG4gICAgICBPYmoubWFnaWMgdidcbiAgICBlbHNlIE9iai5tYWdpYyB2XG5cbiAgbGV0IGdldF9pbml0aWFsX2tleXMgKCkgOiAoaW50ICogT2JqLnQpIGxpc3QgPVxuICAgIExpc3QubWFwXG4gICAgICAoZnVuIChLSSAoKGlkeCwgXykgYXMgaywgc3BsaXQpKSAtPlxuICAgICAgICAgICAoaWR4LCBPYmoucmVwciAoc3BsaXQgKGdldCBrKSkpKVxuICAgICAgKEF0b21pYy5nZXQgcGFyZW50X2tleXMpXG5cbiAgbGV0IHNldF9pbml0aWFsX2tleXMgKGw6IChpbnQgKiBPYmoudCkgbGlzdCkgPVxuICAgIExpc3QuaXRlclxuICAgICAgKGZ1biAoaWR4LCB2KSAtPlxuICAgICAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpbiBzdC4oaWR4KSA8LSB2KVxuICAgICAgbFxuXG5lbmRcblxuKCoqKioqKioqIElkZW50aXR5ICoqKioqKioqKiopXG5cbmxldCBnZXRfaWQgeyBkb21haW47IF8gfSA9IGRvbWFpblxuXG5sZXQgc2VsZiAoKSA9IFJhdy5zZWxmICgpXG5cbmxldCBpc19tYWluX2RvbWFpbiAoKSA9IChzZWxmICgpIDo+IGludCkgPSAwXG5cbigqKioqKioqKiBDYWxsYmFja3MgKioqKioqKioqKilcblxuKCogZmlyc3Qgc3Bhd24sIGRvbWFpbiBzdGFydHVwIGFuZCBhdCBleGl0IGZ1bmN0aW9uYWxpdHkgKilcbmxldCBmaXJzdF9kb21haW5fc3Bhd25lZCA9IEF0b21pYy5tYWtlIGZhbHNlXG5cbmxldCBmaXJzdF9zcGF3bl9mdW5jdGlvbiA9IHJlZiAoZnVuICgpIC0+ICgpKVxuXG5sZXQgYmVmb3JlX2ZpcnN0X3NwYXduIGYgPVxuICBpZiBBdG9taWMuZ2V0IGZpcnN0X2RvbWFpbl9zcGF3bmVkIHRoZW5cbiAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCBcImZpcnN0IGRvbWFpbiBhbHJlYWR5IHNwYXduZWRcIilcbiAgZWxzZSBiZWdpblxuICAgIGxldCBvbGRfZiA9ICFmaXJzdF9zcGF3bl9mdW5jdGlvbiBpblxuICAgIGxldCBuZXdfZiAoKSA9IG9sZF9mICgpOyBmICgpIGluXG4gICAgZmlyc3Rfc3Bhd25fZnVuY3Rpb24gOj0gbmV3X2ZcbiAgZW5kXG5cbmxldCBkb19iZWZvcmVfZmlyc3Rfc3Bhd24gKCkgPVxuICBpZiBub3QgKEF0b21pYy5nZXQgZmlyc3RfZG9tYWluX3NwYXduZWQpIHRoZW4gYmVnaW5cbiAgICBBdG9taWMuc2V0IGZpcnN0X2RvbWFpbl9zcGF3bmVkIHRydWU7XG4gICAgIWZpcnN0X3NwYXduX2Z1bmN0aW9uKCk7XG4gICAgKCogUmVsZWFzZSB0aGUgb2xkIGZ1bmN0aW9uICopXG4gICAgZmlyc3Rfc3Bhd25fZnVuY3Rpb24gOj0gKGZ1biAoKSAtPiAoKSlcbiAgZW5kXG5cbmxldCBhdF9leGl0X2tleSA9IERMUy5uZXdfa2V5IChmdW4gKCkgLT4gKGZ1biAoKSAtPiAoKSkpXG5cbmxldCBhdF9leGl0IGYgPVxuICBsZXQgb2xkX2V4aXQgOiB1bml0IC0+IHVuaXQgPSBETFMuZ2V0IGF0X2V4aXRfa2V5IGluXG4gIGxldCBuZXdfZXhpdCAoKSA9XG4gICAgKCogVGhlIGRvbWFpbiB0ZXJtaW5hdGlvbiBjYWxsYmFja3MgKFthdF9leGl0XSkgYXJlIHJ1biBpblxuICAgICAgIGxhc3QtaW4tZmlyc3Qtb3V0IChMSUZPKSBvcmRlciBpbiBvcmRlciB0byBiZSBzeW1tZXRyaWMgd2l0aCB0aGUgZG9tYWluXG4gICAgICAgY3JlYXRpb24gY2FsbGJhY2tzIChbYXRfZWFjaF9zcGF3bl0pIHdoaWNoIHJ1biBpbiBmaXJzdC1pbi1maXNydC1vdXRcbiAgICAgICAoRklGTykgb3JkZXIuICopXG4gICAgZiAoKTsgb2xkX2V4aXQgKClcbiAgaW5cbiAgRExTLnNldCBhdF9leGl0X2tleSBuZXdfZXhpdFxuXG5sZXQgZG9fYXRfZXhpdCAoKSA9XG4gIGxldCBmIDogdW5pdCAtPiB1bml0ID0gRExTLmdldCBhdF9leGl0X2tleSBpblxuICBmICgpXG5cbmxldCBfID0gU3RkbGliLmRvX2RvbWFpbl9sb2NhbF9hdF9leGl0IDo9IGRvX2F0X2V4aXRcblxuKCoqKioqKiogQ3JlYXRpb24gYW5kIFRlcm1pbmF0aW9uICoqKioqKioqKVxuXG5sZXQgc3Bhd24gZiA9XG4gIGRvX2JlZm9yZV9maXJzdF9zcGF3biAoKTtcbiAgbGV0IHBrID0gRExTLmdldF9pbml0aWFsX2tleXMgKCkgaW5cblxuICAoKiBUaGUgW3Rlcm1fbXV0ZXhdIGFuZCBbdGVybV9jb25kaXRpb25dIGFyZSB1c2VkIHRvXG4gICAgIHN5bmNocm9uaXplIHdpdGggdGhlIGpvaW5pbmcgZG9tYWlucyAqKVxuICBsZXQgdGVybV9tdXRleCA9IE11dGV4LmNyZWF0ZSAoKSBpblxuICBsZXQgdGVybV9jb25kaXRpb24gPSBDb25kaXRpb24uY3JlYXRlICgpIGluXG4gIGxldCB0ZXJtX3N0YXRlID0gcmVmIFJ1bm5pbmcgaW5cblxuICBsZXQgYm9keSAoKSA9XG4gICAgbGV0IHJlc3VsdCA9XG4gICAgICBtYXRjaFxuICAgICAgICBETFMuY3JlYXRlX2RscyAoKTtcbiAgICAgICAgRExTLnNldF9pbml0aWFsX2tleXMgcGs7XG4gICAgICAgIGxldCByZXMgPSBmICgpIGluXG4gICAgICAgIHJlc1xuICAgICAgd2l0aFxuICAgICAgfCB4IC0+IE9rIHhcbiAgICAgIHwgZXhjZXB0aW9uIGV4IC0+IEVycm9yIGV4XG4gICAgaW5cblxuICAgIGxldCByZXN1bHQnID1cbiAgICAgICgqIFJ1biB0aGUgW2F0X2V4aXRdIGNhbGxiYWNrcyB3aGVuIHRoZSBkb21haW4gY29tcHV0YXRpb24gZWl0aGVyXG4gICAgICAgICB0ZXJtaW5hdGVzIG5vcm1hbGx5IG9yIGV4Y2VwdGlvbmFsbHkuICopXG4gICAgICBtYXRjaCBkb19hdF9leGl0ICgpIHdpdGhcbiAgICAgIHwgKCkgLT4gcmVzdWx0XG4gICAgICB8IGV4Y2VwdGlvbiBleCAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHJlc3VsdCB3aXRoXG4gICAgICAgICAgfCBPayBfIC0+XG4gICAgICAgICAgICAgICgqIElmIHRoZSBkb21haW4gY29tcHV0YXRpb24gdGVybWluYXRlZCBub3JtYWxseSwgYnV0IHRoZVxuICAgICAgICAgICAgICAgICBbYXRfZXhpdF0gY2FsbGJhY2tzIHJhaXNlZCBhbiBleGNlcHRpb24sIHRoZW4gcmV0dXJuIHRoZVxuICAgICAgICAgICAgICAgICBleGNlcHRpb24uICopXG4gICAgICAgICAgICAgIEVycm9yIGV4XG4gICAgICAgICAgfCBFcnJvciBfIC0+XG4gICAgICAgICAgICAgICgqIElmIGJvdGggdGhlIGRvbWFpbiBjb21wdXRhdGlvbiBhbmQgdGhlIFthdF9leGl0XSBjYWxsYmFja3NcbiAgICAgICAgICAgICAgICAgcmFpc2VkIGV4Y2VwdGlvbnMsIHRoZW4gaWdub3JlIHRoZSBleGNlcHRpb24gZnJvbSB0aGVcbiAgICAgICAgICAgICAgICAgW2F0X2V4aXRdIGNhbGxiYWNrcyBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCBleGNlcHRpb24uICopXG4gICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgIGVuZFxuICAgIGluXG5cbiAgICAoKiBTeW5jaHJvbml6ZSB3aXRoIGpvaW5pbmcgZG9tYWlucyAqKVxuICAgIE11dGV4LmxvY2sgdGVybV9tdXRleDtcbiAgICBtYXRjaCAhdGVybV9zdGF0ZSB3aXRoXG4gICAgfCBSdW5uaW5nIC0+XG4gICAgICAgIHRlcm1fc3RhdGUgOj0gRmluaXNoZWQgcmVzdWx0JztcbiAgICAgICAgQ29uZGl0aW9uLmJyb2FkY2FzdCB0ZXJtX2NvbmRpdGlvbjtcbiAgICB8IEZpbmlzaGVkIF8gLT5cbiAgICAgICAgZmFpbHdpdGggXCJpbnRlcm5hbCBlcnJvcjogQW0gSSBhbHJlYWR5IGZpbmlzaGVkP1wiXG4gICAgKCogW3Rlcm1fbXV0ZXhdIGlzIHVubG9ja2VkIGluIHRoZSBydW50aW1lIGFmdGVyIHRoZSBjbGVhbnVwIGZ1bmN0aW9ucyBvblxuICAgICAgIHRoZSBDIHNpZGUgYXJlIGZpbmlzaGVkLiAqKVxuICBpblxuICB7IGRvbWFpbiA9IFJhdy5zcGF3biBib2R5IHRlcm1fbXV0ZXg7XG4gICAgdGVybV9tdXRleDtcbiAgICB0ZXJtX2NvbmRpdGlvbjtcbiAgICB0ZXJtX3N0YXRlIH1cblxubGV0IGpvaW4geyB0ZXJtX211dGV4OyB0ZXJtX2NvbmRpdGlvbjsgdGVybV9zdGF0ZTsgXyB9ID1cbiAgTXV0ZXgubG9jayB0ZXJtX211dGV4O1xuICBsZXQgcmVjIGxvb3AgKCkgPVxuICAgIG1hdGNoICF0ZXJtX3N0YXRlIHdpdGhcbiAgICB8IFJ1bm5pbmcgLT5cbiAgICAgICAgQ29uZGl0aW9uLndhaXQgdGVybV9jb25kaXRpb24gdGVybV9tdXRleDtcbiAgICAgICAgbG9vcCAoKVxuICAgIHwgRmluaXNoZWQgcmVzIC0+XG4gICAgICAgIE11dGV4LnVubG9jayB0ZXJtX211dGV4O1xuICAgICAgICByZXNcbiAgaW5cbiAgbWF0Y2ggbG9vcCAoKSB3aXRoXG4gIHwgT2sgeCAtPiB4XG4gIHwgRXJyb3IgZXggLT4gcmFpc2UgZXhcblxubGV0IHJlY29tbWVuZGVkX2RvbWFpbl9jb3VudCA9IFJhdy5nZXRfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgQmVub2l0IFZhdWdvbiwgRU5TVEEgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICgqIFRvb2xzIHRvIG1hbmlwdWxhdGUgc2Nhbm5pbmcgc2V0IG9mIGNoYXJzIChzZWUgJVsuLi5dKSAqKVxuXG50eXBlIG11dGFibGVfY2hhcl9zZXQgPSBieXRlc1xuXG4oKiBDcmVhdGUgYSBmcmVzaCwgZW1wdHksIG11dGFibGUgY2hhciBzZXQuICopXG5sZXQgY3JlYXRlX2NoYXJfc2V0ICgpID0gQnl0ZXMubWFrZSAzMiAnXFwwMDAnXG5cbigqIEFkZCBhIGNoYXIgaW4gYSBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCBjID1cbiAgbGV0IGluZCA9IGludF9vZl9jaGFyIGMgaW5cbiAgbGV0IHN0cl9pbmQgPSBpbmQgbHNyIDMgYW5kIG1hc2sgPSAxIGxzbCAoaW5kIGxhbmQgMGIxMTEpIGluXG4gIEJ5dGVzLnNldCBjaGFyX3NldCBzdHJfaW5kXG4gICAgKGNoYXJfb2ZfaW50IChpbnRfb2ZfY2hhciAoQnl0ZXMuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxvciBtYXNrKSlcblxubGV0IGZyZWV6ZV9jaGFyX3NldCBjaGFyX3NldCA9XG4gIEJ5dGVzLnRvX3N0cmluZyBjaGFyX3NldFxuXG4oKiBDb21wdXRlIHRoZSBjb21wbGVtZW50IG9mIGEgY2hhciBzZXQuICopXG5sZXQgcmV2X2NoYXJfc2V0IGNoYXJfc2V0ID1cbiAgbGV0IGNoYXJfc2V0JyA9IGNyZWF0ZV9jaGFyX3NldCAoKSBpblxuICBmb3IgaSA9IDAgdG8gMzEgZG9cbiAgICBCeXRlcy5zZXQgY2hhcl9zZXQnIGlcbiAgICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKFN0cmluZy5nZXQgY2hhcl9zZXQgaSkgbHhvciAweEZGKSk7XG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgY2hhcl9zZXQnXG5cbigqIFJldHVybiB0cnVlIGlmIGEgYGMnIGlzIGluIGBjaGFyX3NldCcuICopXG5sZXQgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICAoaW50X29mX2NoYXIgKFN0cmluZy5nZXQgY2hhcl9zZXQgc3RyX2luZCkgbGFuZCBtYXNrKSA8PiAwXG5cblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAoKiBJZ25vcmVkIHBhcmFtIGNvbnZlcnNpb24gKilcblxuKCogR0FEVCB1c2VkIHRvIGFic3RyYWN0IGFuIGV4aXN0ZW50aWFsIHR5cGUgcGFyYW1ldGVyLiAqKVxuKCogU2VlIHBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdC4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhcmFtX2Zvcm1hdF9lYmIgPSBQYXJhbV9mb3JtYXRfRUJCIDpcbiAgICAoJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhcmFtX2Zvcm1hdF9lYmJcblxuKCogQ29tcHV0ZSBhIHBhZGRpbmcgYXNzb2NpYXRlZCB0byBhIHBhZF9vcHRpb24gKHNlZSBcIiVfNDJkXCIpLiAqKVxubGV0IHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQgPSBtYXRjaCBwYWRfb3B0IHdpdGhcbiAgfCBOb25lIC0+IE5vX3BhZGRpbmdcbiAgfCBTb21lIHdpZHRoIC0+IExpdF9wYWRkaW5nIChSaWdodCwgd2lkdGgpXG5cbigqIENvbXB1dGUgYSBwcmVjaXNpb24gYXNzb2NpYXRlZCB0byBhIHByZWNfb3B0aW9uIChzZWUgXCIlXy40MmZcIikuICopXG5sZXQgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCA9IG1hdGNoIHByZWNfb3B0IHdpdGhcbiAgfCBOb25lIC0+IE5vX3ByZWNpc2lvblxuICB8IFNvbWUgbmRlYyAtPiBMaXRfcHJlY2lzaW9uIG5kZWNcblxuKCogVHVybiBhbiBpZ25vcmVkIHBhcmFtIGludG8gaXRzIGVxdWl2YWxlbnQgbm90LWlnbm9yZWQgZm9ybWF0IG5vZGUuICopXG4oKiBVc2VkIGZvciBmb3JtYXQgcHJldHR5LXByaW50aW5nIGFuZCBTY2FuZi4gKilcbmxldCBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgOiB0eXBlIGEgYiBjIGQgZSBmIHggeSAuXG4gICAgKGEsIGIsIGMsIGQsIHksIHgpIGlnbm9yZWQgLT4gKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgICAgKGEsIGIsIGMsIGQsIGUsIGYpIHBhcmFtX2Zvcm1hdF9lYmIgPVxuZnVuIGlnbiBmbXQgLT4gbWF0Y2ggaWduIHdpdGhcbiAgfCBJZ25vcmVkX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDaGFyIGZtdClcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKENhbWxfY2hhciBmbXQpXG4gIHwgSWdub3JlZF9zdHJpbmcgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKFN0cmluZyAocGFkX29mX3BhZF9vcHQgcGFkX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX3N0cmluZyAocGFkX29mX3BhZF9vcHQgcGFkX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2ludCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoSW50IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfaW50MzIgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChJbnQzMiAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX25hdGl2ZWludCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKE5hdGl2ZWludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDY0IChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50NjQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9mbG9hdCAocGFkX29wdCwgcHJlY19vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZsb2F0ICgoRmxvYXRfZmxhZ18sIEZsb2F0X2YpLFxuICAgICAgICAgICAgICBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBwcmVjX29mX3ByZWNfb3B0IHByZWNfb3B0LCBmbXQpKVxuICB8IElnbm9yZWRfYm9vbCBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQm9vbCAocGFkX29mX3BhZF9vcHQgcGFkX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgKHBhZF9vcHQsIGZtdHR5KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEZvcm1hdF9hcmcgKHBhZF9vcHQsIGZtdHR5LCBmbXQpKVxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoRm9ybWF0X3N1YnN0IChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX3JlYWRlciAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKFJlYWRlciBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCkpXG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX25leHRfY2hhciBmbXQpXG5cblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFR5cGVzICopXG5cbnR5cGUgKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuID1cbiAgfCBBY2Nfb3Blbl90YWcgb2YgKCdiLCAnYykgYWNjXG4gIHwgQWNjX29wZW5fYm94IG9mICgnYiwgJ2MpIGFjY1xuXG4oKiBSZXZlcnNlZCBsaXN0IG9mIHByaW50aW5nIGF0b21zLiAqKVxuKCogVXNlZCB0byBhY2N1bXVsYXRlIHByaW50ZiBhcmd1bWVudHMuICopXG5hbmQgKCdiLCAnYykgYWNjID1cbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgb2YgKCdiLCAnYykgYWNjICogZm9ybWF0dGluZ19saXRcbiAgICAgICgqIFNwZWNpYWwgZm10dGluZyAoYm94KSAqKVxuICB8IEFjY19mb3JtYXR0aW5nX2dlbiBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IsICdjKSBhY2NfZm9ybWF0dGluZ19nZW5cbiAgICAgICgqIFNwZWNpYWwgZm10dGluZyAoYm94KSAqKVxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIExpdGVyYWwgc3RyaW5nICopXG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAgIG9mICgnYiwgJ2MpIGFjYyAqIGNoYXIgICAgICAgKCogTGl0ZXJhbCBjaGFyICopXG4gIHwgQWNjX2RhdGFfc3RyaW5nICAgIG9mICgnYiwgJ2MpIGFjYyAqIHN0cmluZyAgICAgKCogR2VuZXJhdGVkIHN0cmluZyAqKVxuICB8IEFjY19kYXRhX2NoYXIgICAgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIEdlbmVyYXRlZCBjaGFyICopXG4gIHwgQWNjX2RlbGF5ICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAqICgnYiAtPiAnYylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIERlbGF5ZWQgcHJpbnRpbmcgKCVhLCAldCkgKilcbiAgfCBBY2NfZmx1c2ggICAgICAgICAgb2YgKCdiLCAnYykgYWNjICAgICAgICAgICAgICAoKiBGbHVzaCAqKVxuICB8IEFjY19pbnZhbGlkX2FyZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmdcbiAgICAgICgqIFJhaXNlIEludmFsaWRfYXJndW1lbnQgbXNnICopXG4gIHwgRW5kX29mX2FjY1xuXG4oKiBMaXN0IG9mIGhldGVyb2dlbmVvdXMgdmFsdWVzLiAqKVxuKCogVXNlZCB0byBhY2N1bXVsYXRlIHNjYW5mIGNhbGxiYWNrIGFyZ3VtZW50cy4gKilcbnR5cGUgKCdhLCAnYikgaGV0ZXJfbGlzdCA9XG4gIHwgQ29ucyA6ICdjICogKCdhLCAnYikgaGV0ZXJfbGlzdCAtPiAoJ2MgLT4gJ2EsICdiKSBoZXRlcl9saXN0XG4gIHwgTmlsIDogKCdiLCAnYikgaGV0ZXJfbGlzdFxuXG4oKiBFeGlzdGVudGlhbCBCbGFjayBCb3hlcy4gKilcbigqIFVzZWQgdG8gYWJzdHJhY3Qgc29tZSBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlcnMuICopXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdHR5LiAqKVxuKCogU2VlIHRoZSB0eXBlX3BhZGRpbmcgZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9IFBhZGRpbmdfZm10dHlfRUJCIDpcbiAgICAgKCd4LCAneSkgcGFkZGluZyAqICgneSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcGFkZGluZywgYSBwcmVjaXNpb24gYW5kIGFuIGZtdHR5LiAqKVxuKCogU2VlIHRoZSB0eXBlX3BhZHByZWMgZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9IFBhZHByZWNfZm10dHlfRUJCIDpcbiAgICAgKCd4LCAneSkgcGFkZGluZyAqICgneSwgJ3opIHByZWNpc2lvbiAqICgneiwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcGFkZGluZyBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkZGluZ19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmIgPSBQYWRkaW5nX2ZtdF9FQkIgOlxuICAgICAoXywgJ3ggLT4gJ2EpIHBhZGRpbmcgKlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICgneCwgJ2IsICdjLCAnZSwgJ2YpIHBhZGRpbmdfZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwcmVjaXNpb24gYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3ByZWNpc2lvbl9mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYiA9IFByZWNpc2lvbl9mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICgneCwgJ2IsICdjLCAnZSwgJ2YpIHByZWNpc2lvbl9mbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgYW5kIHBhcnNlX2Zvcm1hdCBmdW5jdGlvbnMuICopXG50eXBlICgncCwgJ2IsICdjLCAnZSwgJ2YpIHBhZHByZWNfZm10X2ViYiA9IFBhZHByZWNfZm10X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdwIC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICgncCwgJ2IsICdjLCAnZSwgJ2YpIHBhZHByZWNfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCB0aGUgJ2EgYW5kICdkIHBhcmFtZXRlcnMgb2YgYW4gZm10LiAqKVxuKCogT3V0cHV0IHR5cGUgb2YgdGhlIGZvcm1hdCBwYXJzaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2IsICdjLCAnZSwgJ2YpIGZtdF9lYmIgPSBGbXRfRUJCIDpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ2IsICdjLCAnZSwgJ2YpIGZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfZm9ybWF0X2dlbiBmdW5jdGlvbi4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmIgPSBGbXRfZm10dHlfRUJCIDpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAneSwgJ3gpIGZtdCAqXG4gICAgICgneCwgJ2IsICdjLCAneSwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10X2ZtdHR5X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYW4gZm10dHkgYW5kIGFuIGZtdC4gKilcbigqIFNlZSB0aGUgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eV9mbXRfZWJiID0gRm10dHlfZm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXR0eSAqXG4gICAgICgneCwgJ2IsICdjLCAneSwgJ2UsICdmKSBmbXRfZm10dHlfZWJiIC0+XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eV9mbXRfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBmbXR0eSB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgZm9ybWF0IHR5cGVzLiAqKVxudHlwZSBmbXR0eV9lYmIgPSBGbXR0eV9FQkIgOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT4gZm10dHlfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwYWRkaW5nIHR5cGUgcGFyYW1ldGVycy4gKilcbigqIFVzZWQgdG8gY29tcGFyZSBwYWRkaW5ncy4gKilcbnR5cGUgcGFkZGluZ19lYmIgPSBQYWRkaW5nX0VCQiA6ICgnYSwgJ2IpIHBhZGRpbmcgLT4gcGFkZGluZ19lYmJcblxuKCogQWJzdHJhY3QgYWxsIHByZWNpc2lvbiB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcHJlY2lzaW9ucy4gKilcbnR5cGUgcHJlY2lzaW9uX2ViYiA9IFByZWNpc2lvbl9FQkIgOiAoJ2EsICdiKSBwcmVjaXNpb24gLT4gcHJlY2lzaW9uX2ViYlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIENvbnN0YW50cyAqKVxuXG4oKiBEZWZhdWx0IHByZWNpc2lvbiBmb3IgZmxvYXQgcHJpbnRpbmcuICopXG5sZXQgZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24gZmNvbnYgPVxuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIHwgRmxvYXRfaCB8IEZsb2F0X0hcbiAgfCBGbG9hdF9DRiAtPiAtNlxuICAoKiBGb3IgJWggJUggYW5kICUjRiBmb3JtYXRzLCBhIG5lZ2F0aXZlIHByZWNpc2lvbiBtZWFucyBcImFzIG1hbnkgZGlnaXRzIGFzXG4gICAgIG5lY2Vzc2FyeVwiLiAgRm9yIHRoZSBvdGhlciBGUCBmb3JtYXRzLCB3ZSB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZVxuICAgICBvZiB0aGUgcHJlY2lzaW9uLCBoZW5jZSA2IGRpZ2l0cyBieSBkZWZhdWx0LiAqKVxuICB8IEZsb2F0X0YgLT4gMTJcbiAgKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIE9DYW1sIGZsb2F0IHByaW50aW5nICglRikuICopXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRXh0ZXJuYWxzICopXG5cbmV4dGVybmFsIGZvcm1hdF9mbG9hdDogc3RyaW5nIC0+IGZsb2F0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9mb3JtYXRfZmxvYXRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5leHRlcm5hbCBmb3JtYXRfaW50MzI6IHN0cmluZyAtPiBpbnQzMiAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaW50MzJfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9uYXRpdmVpbnQ6IHN0cmluZyAtPiBuYXRpdmVpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX25hdGl2ZWludF9mb3JtYXRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDY0OiBzdHJpbmcgLT4gaW50NjQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDY0X2Zvcm1hdFwiXG5leHRlcm5hbCBoZXhzdHJpbmdfb2ZfZmxvYXQ6IGZsb2F0IC0+IGludCAtPiBjaGFyIC0+IHN0cmluZ1xuICA9IFwiY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXRcIlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgKCogVG9vbHMgdG8gcHJldHR5LXByaW50IGZvcm1hdHMgKilcblxuKCogVHlwZSBvZiBleHRlbnNpYmxlIGNoYXJhY3RlciBidWZmZXJzLiAqKVxudHlwZSBidWZmZXIgPSB7XG4gIG11dGFibGUgaW5kIDogaW50O1xuICBtdXRhYmxlIGJ5dGVzIDogYnl0ZXM7XG59XG5cbigqIENyZWF0ZSBhIGZyZXNoIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY3JlYXRlIGluaXRfc2l6ZSA9IHsgaW5kID0gMDsgYnl0ZXMgPSBCeXRlcy5jcmVhdGUgaW5pdF9zaXplIH1cblxuKCogQ2hlY2sgc2l6ZSBvZiB0aGUgYnVmZmVyIGFuZCBncm93IGl0IGlmIG5lZWRlZC4gKilcbmxldCBidWZmZXJfY2hlY2tfc2l6ZSBidWYgb3ZlcmhlYWQgPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1Zi5ieXRlcyBpblxuICBsZXQgbWluX2xlbiA9IGJ1Zi5pbmQgKyBvdmVyaGVhZCBpblxuICBpZiBtaW5fbGVuID4gbGVuIHRoZW4gKFxuICAgIGxldCBuZXdfbGVuID0gSW50Lm1heCAobGVuICogMikgbWluX2xlbiBpblxuICAgIGxldCBuZXdfc3RyID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1Zi5ieXRlcyAwIG5ld19zdHIgMCBsZW47XG4gICAgYnVmLmJ5dGVzIDwtIG5ld19zdHI7XG4gIClcblxuKCogQWRkIHRoZSBjaGFyYWN0ZXIgYGMnIHRvIHRoZSBidWZmZXIgYGJ1ZicuICopXG5sZXQgYnVmZmVyX2FkZF9jaGFyIGJ1ZiBjID1cbiAgYnVmZmVyX2NoZWNrX3NpemUgYnVmIDE7XG4gIEJ5dGVzLnNldCBidWYuYnl0ZXMgYnVmLmluZCBjO1xuICBidWYuaW5kIDwtIGJ1Zi5pbmQgKyAxXG5cbigqIEFkZCB0aGUgc3RyaW5nIGBzJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzID1cbiAgbGV0IHN0cl9sZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgYnVmZmVyX2NoZWNrX3NpemUgYnVmIHN0cl9sZW47XG4gIFN0cmluZy5ibGl0IHMgMCBidWYuYnl0ZXMgYnVmLmluZCBzdHJfbGVuO1xuICBidWYuaW5kIDwtIGJ1Zi5pbmQgKyBzdHJfbGVuXG5cbigqIEdldCB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLiAqKVxubGV0IGJ1ZmZlcl9jb250ZW50cyBidWYgPVxuICBCeXRlcy5zdWJfc3RyaW5nIGJ1Zi5ieXRlcyAwIGJ1Zi5pbmRcblxuKCoqKilcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIGNvbnZlcnNpb24gdG8gY2hhci4gKilcbmxldCBjaGFyX29mX2ljb252IGljb252ID0gbWF0Y2ggaWNvbnYgd2l0aFxuICB8IEludF9kIHwgSW50X3BkIHwgSW50X3NkIHwgSW50X0NkIC0+ICdkJyB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpXG4gIHwgSW50X0NpIC0+ICdpJyB8IEludF94IHwgSW50X0N4IC0+ICd4JyB8IEludF9YIHwgSW50X0NYIC0+ICdYJyB8IEludF9vXG4gIHwgSW50X0NvIC0+ICdvJyB8IEludF91IHwgSW50X0N1IC0+ICd1J1xuXG4oKiBDb252ZXJ0IGEgZmxvYXQgY29udmVyc2lvbiB0byBjaGFyLiAqKVxuKCogYGNGJyB3aWxsIGJlICdGJyBmb3IgZGlzcGxheWluZyBmb3JtYXQgYW5kICdnJyB0byBjYWxsIGxpYmMgcHJpbnRmICopXG5sZXQgY2hhcl9vZl9mY29udiA/KGNGPSdGJykgZmNvbnYgPSBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X2YgLT4gJ2YnIHwgRmxvYXRfZSAtPiAnZSdcbiAgfCBGbG9hdF9FIC0+ICdFJyB8IEZsb2F0X2cgLT4gJ2cnXG4gIHwgRmxvYXRfRyAtPiAnRycgfCBGbG9hdF9GIC0+IGNGXG4gIHwgRmxvYXRfaCAtPiAnaCcgfCBGbG9hdF9IIC0+ICdIJ1xuICB8IEZsb2F0X0NGIC0+ICdGJ1xuXG5cbigqIENvbnZlcnQgYSBzY2FubmluZyBjb3VudGVyIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9jb3VudGVyIGNvdW50ZXIgPSBtYXRjaCBjb3VudGVyIHdpdGhcbiAgfCBMaW5lX2NvdW50ZXIgIC0+ICdsJ1xuICB8IENoYXJfY291bnRlciAgLT4gJ24nXG4gIHwgVG9rZW5fY291bnRlciAtPiAnTidcblxuKCoqKilcblxuKCogUHJpbnQgYSBjaGFyX3NldCBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBPQ2FtbCBmb3JtYXQgbGV4aWNhbCBjb252ZW50aW9uLiAqKVxubGV0IGJwcmludF9jaGFyX3NldCBidWYgY2hhcl9zZXQgPVxuICBsZXQgcmVjIHByaW50X3N0YXJ0IHNldCA9XG4gICAgbGV0IGlzX2Fsb25lIGMgPVxuICAgICAgbGV0IGJlZm9yZSwgYWZ0ZXIgPSBDaGFyLihjaHIgKGNvZGUgYyAtIDEpLCBjaHIgKGNvZGUgYyArIDEpKSBpblxuICAgICAgaXNfaW5fY2hhcl9zZXQgc2V0IGNcbiAgICAgICYmIG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IGJlZm9yZSAmJiBpc19pbl9jaGFyX3NldCBzZXQgYWZ0ZXIpIGluXG4gICAgaWYgaXNfYWxvbmUgJ10nIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXSc7XG4gICAgcHJpbnRfb3V0IHNldCAxO1xuICAgIGlmIGlzX2Fsb25lICctJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy0nO1xuICBhbmQgcHJpbnRfb3V0IHNldCBpID1cbiAgICBpZiBpIDwgMjU2IHRoZW5cbiAgICAgIGlmIGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgaSkgdGhlbiBwcmludF9maXJzdCBzZXQgaVxuICAgICAgZWxzZSBwcmludF9vdXQgc2V0IChpICsgMSlcbiAgYW5kIHByaW50X2ZpcnN0IHNldCBpID1cbiAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICB8ICdcXDI1NScgLT4gcHJpbnRfY2hhciBidWYgMjU1O1xuICAgIHwgJ10nIHwgJy0nIC0+IHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICB8IF8gLT4gcHJpbnRfc2Vjb25kIHNldCAoaSArIDEpO1xuICBhbmQgcHJpbnRfc2Vjb25kIHNldCBpID1cbiAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW5cbiAgICAgIG1hdGNoIGNoYXJfb2ZfaW50IGkgd2l0aFxuICAgICAgfCAnXFwyNTUnIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NDtcbiAgICAgICAgcHJpbnRfY2hhciBidWYgMjU1O1xuICAgICAgfCAnXScgfCAnLScgd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICAgIHwgXyB3aGVuIG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCAoaSArIDEpKSkgLT5cbiAgICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgICAgcHJpbnRfY2hhciBidWYgaTtcbiAgICAgICAgcHJpbnRfb3V0IHNldCAoaSArIDIpO1xuICAgICAgfCBfIC0+XG4gICAgICAgIHByaW50X2luIHNldCAoaSAtIDEpIChpICsgMik7XG4gICAgZWxzZSAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgcHJpbnRfb3V0IHNldCAoaSArIDEpO1xuICAgIClcbiAgYW5kIHByaW50X2luIHNldCBpIGogPVxuICAgIGlmIGogPSAyNTYgfHwgbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGopKSB0aGVuIChcbiAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaW50X29mX2NoYXIgJy0nKTtcbiAgICAgIHByaW50X2NoYXIgYnVmIChqIC0gMSk7XG4gICAgICBpZiBqIDwgMjU2IHRoZW4gcHJpbnRfb3V0IHNldCAoaiArIDEpO1xuICAgICkgZWxzZVxuICAgICAgcHJpbnRfaW4gc2V0IGkgKGogKyAxKTtcbiAgYW5kIHByaW50X2NoYXIgYnVmIGkgPSBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICB8ICclJyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgfCAnQCcgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ0AnO1xuICAgIHwgYyAgIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgYztcbiAgaW5cbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnWyc7XG4gIHByaW50X3N0YXJ0IChcbiAgICBpZiBpc19pbl9jaGFyX3NldCBjaGFyX3NldCAnXFwwMDAnXG4gICAgdGhlbiAoIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ14nOyByZXZfY2hhcl9zZXQgY2hhcl9zZXQgKVxuICAgIGVsc2UgY2hhcl9zZXRcbiAgKTtcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXSdcblxuKCoqKilcblxuKCogUHJpbnQgYSBwYWR0eSBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBmb3JtYXQtbGlrZSBzeW50YXguICopXG5sZXQgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eSA9IG1hdGNoIHBhZHR5IHdpdGhcbiAgfCBMZWZ0ICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICctJ1xuICB8IFJpZ2h0IC0+ICgpXG4gIHwgWmVyb3MgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnMCdcblxuKCogUHJpbnQgdGhlICdfJyBvZiBhbiBpZ25vcmVkIGZsYWcgaWYgbmVlZGVkLiAqKVxubGV0IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnID1cbiAgaWYgaWduX2ZsYWcgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICdfJ1xuXG4oKioqKVxuXG5sZXQgYnByaW50X3BhZF9vcHQgYnVmIHBhZF9vcHQgPSBtYXRjaCBwYWRfb3B0IHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSB3aWR0aCAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgKEludC50b19zdHJpbmcgd2lkdGgpXG5cbigqKiopXG5cbigqIFByaW50IHBhZGRpbmcgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWRkaW5nIDogdHlwZSBhIGIgLiBidWZmZXIgLT4gKGEsIGIpIHBhZGRpbmcgLT4gdW5pdCA9XG5mdW4gYnVmIHBhZCAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT4gKClcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIG4pIC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgKEludC50b19zdHJpbmcgbik7XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBicHJpbnRfcGFkdHkgYnVmIHBhZHR5O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyonXG5cbigqIFByaW50IHByZWNpc2lvbiBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBmb3JtYXQtbGlrZSBzeW50YXguICopXG5sZXQgYnByaW50X3ByZWNpc2lvbiA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwcmVjaXNpb24gLT4gdW5pdCA9XG4gIGZ1biBidWYgcHJlYyAtPiBtYXRjaCBwcmVjIHdpdGhcbiAgfCBOb19wcmVjaXNpb24gLT4gKClcbiAgfCBMaXRfcHJlY2lzaW9uIG4gLT5cbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcuJztcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgKEludC50b19zdHJpbmcgbik7XG4gIHwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIi4qXCJcblxuKCoqKilcblxuKCogUHJpbnQgdGhlIG9wdGlvbmFsICcrJywgJyAnIG9yICcjJyBhc3NvY2lhdGVkIHRvIGFuIGludCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfcGQgfCBJbnRfcGkgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKydcbiAgfCBJbnRfc2QgfCBJbnRfc2kgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnICdcbiAgfCBJbnRfQ3ggfCBJbnRfQ1ggfCBJbnRfQ28gfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgSW50X2QgfCBJbnRfaSB8IEludF94IHwgSW50X1ggfCBJbnRfbyB8IEludF91IC0+ICgpXG5cbigqIFByaW50IGFuIGNvbXBsZXRlIGludCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUzLipkXCIpLiAqKVxubGV0IGJwcmludF9pbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2ljb252IGljb252KVxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGludDMyLCBuYXRpdmVpbnQgb3IgaW50NjQgZm9ybWF0IGluIGEgYnVmZmVyLiAqKVxubGV0IGJwcmludF9hbHRpbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYyBjID1cbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gIGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnY7XG4gIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7XG4gIGJwcmludF9wcmVjaXNpb24gYnVmIHByZWM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCoqKilcblxuKCogUHJpbnQgdGhlIG9wdGlvbmFsICcrJywgJyAnIGFuZC9vciAnIycgYXNzb2NpYXRlZCB0byBhIGZsb2F0IGNvbnZlcnNpb24uICopXG5sZXQgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252ID1cbiAgYmVnaW4gbWF0Y2ggZnN0IGZjb252IHdpdGhcbiAgfCBGbG9hdF9mbGFnX3AgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKydcbiAgfCBGbG9hdF9mbGFnX3MgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnICdcbiAgfCBGbG9hdF9mbGFnXyAtPiAoKSBlbmQ7XG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfQ0YgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnIydcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfR1xuICB8IEZsb2F0X0YgfCBGbG9hdF9oIHwgRmxvYXRfSCAtPiAoKVxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZsb2F0IGZvcm1hdCBpbiBhIGJ1ZmZlciAoZXg6IFwiJSsqLjNmXCIpLiAqKVxubGV0IGJwcmludF9mbG9hdF9mbXQgYnVmIGlnbl9mbGFnIGZjb252IHBhZCBwcmVjID1cbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gIGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICBicHJpbnRfZmNvbnZfZmxhZyBidWYgZmNvbnY7XG4gIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7XG4gIGJwcmludF9wcmVjaXNpb24gYnVmIHByZWM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfZmNvbnYgZmNvbnYpXG5cbigqIENvbXB1dGUgdGhlIGxpdGVyYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRm9ybWF0dGluZ19saXQuICopXG4oKiBVc2VkIGJ5IFByaW50ZiBhbmQgU2NhbmYgd2hlcmUgZm9ybWF0dGluZyBpcyBub3QgaW50ZXJwcmV0ZWQuICopXG5sZXQgc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZvcm1hdHRpbmdfbGl0ID0gbWF0Y2ggZm9ybWF0dGluZ19saXQgd2l0aFxuICB8IENsb3NlX2JveCAgICAgICAgICAgIC0+IFwiQF1cIlxuICB8IENsb3NlX3RhZyAgICAgICAgICAgIC0+IFwiQH1cIlxuICB8IEJyZWFrIChzdHIsIF8sIF8pICAgIC0+IHN0clxuICB8IEZGbHVzaCAgICAgICAgICAgICAgIC0+IFwiQD9cIlxuICB8IEZvcmNlX25ld2xpbmUgICAgICAgIC0+IFwiQFxcblwiXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgLT4gXCJALlwiXG4gIHwgTWFnaWNfc2l6ZSAoc3RyLCBfKSAgLT4gc3RyXG4gIHwgRXNjYXBlZF9hdCAgICAgICAgICAgLT4gXCJAQFwiXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgLT4gXCJAJVwiXG4gIHwgU2Nhbl9pbmRpYyBjIC0+IFwiQFwiIF4gKFN0cmluZy5tYWtlIDEgYylcblxuKCoqKilcblxuKCogUHJpbnQgYSBsaXRlcmFsIGNoYXIgaW4gYSBidWZmZXIsIGVzY2FwZSAnJScgYnkgXCIlJVwiLiAqKVxubGV0IGJwcmludF9jaGFyX2xpdGVyYWwgYnVmIGNociA9IG1hdGNoIGNociB3aXRoXG4gIHwgJyUnIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUlXCJcbiAgfCBfIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgY2hyXG5cbigqIFByaW50IGEgbGl0ZXJhbCBzdHJpbmcgaW4gYSBidWZmZXIsIGVzY2FwZSBhbGwgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0ciA9XG4gIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHN0ciAtIDEgZG9cbiAgICBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBzdHIuW2ldXG4gIGRvbmVcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0IHByZXR0eS1wcmludGluZyAqKVxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCB0eXBlIChhbiBmbXR0eSkgaW4gYSBidWZmZXIuICopXG5sZXQgcmVjIGJwcmludF9mbXR0eSA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgLlxuICAgIGJ1ZmZlciAtPiAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgaywgbCkgZm10dHlfcmVsIC0+IHVuaXQgPVxuZnVuIGJ1ZiBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJWNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBTdHJpbmdfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlc1wiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludF90eSByZXN0ICAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVpXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJWxpXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlbmlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDY0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVMaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJWZcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBCb29sX3R5IHJlc3QgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlQlwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEFscGhhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVhXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgVGhldGFfdHkgcmVzdCAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXRcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlP1wiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFJlYWRlcl90eSByZXN0ICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVyXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG5cbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJV9yXCI7XG4gICAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5LCByZXN0KSAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV7XCI7IGJwcmludF9mbXR0eSBidWYgc3ViX2ZtdHR5O1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV9XCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1Yl9mbXR0eSwgXywgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlKFwiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlKVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG5cbiAgfCBFbmRfb2ZfZm10dHkgLT4gKClcblxuKCoqKilcblxubGV0IHJlYyBpbnRfb2ZfY3VzdG9tX2FyaXR5IDogdHlwZSBhIGIgYyAuXG4gIChhLCBiLCBjKSBjdXN0b21fYXJpdHkgLT4gaW50ID1cbiAgZnVuY3Rpb25cbiAgfCBDdXN0b21femVybyAtPiAwXG4gIHwgQ3VzdG9tX3N1Y2MgeCAtPiAxICsgaW50X29mX2N1c3RvbV9hcml0eSB4XG5cbigqIFByaW50IGEgY29tcGxldGUgZm9ybWF0IGluIGEgYnVmZmVyLiAqKVxubGV0IGJwcmludF9mbXQgYnVmIGZtdCA9XG4gIGxldCByZWMgZm10aXRlciA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiBib29sIC0+IHVuaXQgPVxuICBmdW4gZm10IGlnbl9mbGFnIC0+IG1hdGNoIGZtdCB3aXRoXG4gICAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ3MnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1MnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuXG4gICAgfCBJbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgIGJwcmludF9hbHRpbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYyAnbCc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ24nO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ0wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdjJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ0MnOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdCJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ2EnOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBUaGV0YSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICd0JzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgIGZvciBfaSA9IDEgdG8gaW50X29mX2N1c3RvbV9hcml0eSBhcml0eSBkb1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJz8nO1xuICAgICAgZG9uZTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFJlYWRlciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdyJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSFcIjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcblxuICAgIHwgU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgc3RyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuICAgIHwgQ2hhcl9saXRlcmFsIChjaHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IEZvcm1hdF9hcmcgKHBhZF9vcHQsIGZtdHR5LCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZF9vcHQgYnVmIHBhZF9vcHQ7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ3snO1xuICAgICAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ30nO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgRm9ybWF0X3N1YnN0IChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICcoJztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICcpJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiB3aWR0aF9vcHQ7IGJwcmludF9jaGFyX3NldCBidWYgY2hhcl9zZXQ7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9jb3VudGVyIGNvdW50ZXIpO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBcIjBjXCI7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgICAgbGV0IFBhcmFtX2Zvcm1hdF9FQkIgZm10JyA9IHBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdCBpblxuICAgICAgZm10aXRlciBmbXQnIHRydWU7XG5cbiAgICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgICAgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiAoc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQpO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuICAgIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpIC0+XG4gICAgICBiZWdpbiBtYXRjaCBmbXRpbmdfZ2VuIHdpdGhcbiAgICAgIHwgT3Blbl90YWcgKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQHtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgfCBPcGVuX2JveCAoRm9ybWF0IChfLCBzdHIpKSAtPlxuICAgICAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCJAW1wiOyBidWZmZXJfYWRkX3N0cmluZyBidWYgc3RyXG4gICAgICBlbmQ7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IEVuZF9vZl9mb3JtYXQgLT4gKClcblxuICBpbiBmbXRpdGVyIGZtdCBmYWxzZVxuXG4oKioqKVxuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHRvIHN0cmluZy4gKilcbmxldCBzdHJpbmdfb2ZfZm10IGZtdCA9XG4gIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gIGJwcmludF9mbXQgYnVmIGZtdDtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlIGV4dHJhY3Rpb24gKilcblxudHlwZSAoXywgXykgZXEgPSBSZWZsIDogKCdhLCAnYSkgZXFcblxuKCogSW52YXJpYW50OiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBpZGVudGl0eSBvbiB2YWx1ZXMuXG5cbiAgIEluIHBhcnRpY3VsYXIsIGlmICh0eTEsIHR5MikgaGF2ZSBlcXVhbCB2YWx1ZXMsIHRoZW5cbiAgICh0cmFucyAoc3ltbSB0eTEpIHR5MikgcmVzcGVjdHMgdGhlICd0cmFucycgcHJlY29uZGl0aW9uLiAqKVxubGV0IHJlYyBzeW1tIDogdHlwZSBhMSBiMSBjMSBkMSBlMSBmMSBhMiBiMiBjMiBkMiBlMiBmMiAuXG4gICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbi0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyLFxuICAgIGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdHR5X3JlbFxuPSBmdW5jdGlvblxuICB8IENoYXJfdHkgcmVzdCAtPiBDaGFyX3R5IChzeW1tIHJlc3QpXG4gIHwgSW50X3R5IHJlc3QgLT4gSW50X3R5IChzeW1tIHJlc3QpXG4gIHwgSW50MzJfdHkgcmVzdCAtPiBJbnQzMl90eSAoc3ltbSByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT4gSW50NjRfdHkgKHN5bW0gcmVzdClcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPiBOYXRpdmVpbnRfdHkgKHN5bW0gcmVzdClcbiAgfCBGbG9hdF90eSByZXN0IC0+IEZsb2F0X3R5IChzeW1tIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+IEJvb2xfdHkgKHN5bW0gcmVzdClcbiAgfCBTdHJpbmdfdHkgcmVzdCAtPiBTdHJpbmdfdHkgKHN5bW0gcmVzdClcbiAgfCBUaGV0YV90eSByZXN0IC0+IFRoZXRhX3R5IChzeW1tIHJlc3QpXG4gIHwgQWxwaGFfdHkgcmVzdCAtPiBBbHBoYV90eSAoc3ltbSByZXN0KVxuICB8IEFueV90eSByZXN0IC0+IEFueV90eSAoc3ltbSByZXN0KVxuICB8IFJlYWRlcl90eSByZXN0IC0+IFJlYWRlcl90eSAoc3ltbSByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT4gSWdub3JlZF9yZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfYXJnX3R5ICh0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgc3ltbSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIsIHR5MSwgc3ltbSByZXN0KVxuICB8IEVuZF9vZl9mbXR0eSAtPiBFbmRfb2ZfZm10dHlcblxubGV0IHJlYyBmbXR0eV9yZWxfZGV0IDogdHlwZSBhMSBiIGMgZDEgZTEgZjEgYTIgZDIgZTIgZjIgLlxuICAoYTEsIGIsIGMsIGQxLCBlMSwgZjEsXG4gICBhMiwgYiwgYywgZDIsIGUyLCBmMikgZm10dHlfcmVsIC0+XG4gICAgKChmMSwgZjIpIGVxIC0+IChhMSwgYTIpIGVxKVxuICAqICgoYTEsIGEyKSBlcSAtPiAoZjEsIGYyKSBlcSlcbiAgKiAoKGUxLCBlMikgZXEgLT4gKGQxLCBkMikgZXEpXG4gICogKChkMSwgZDIpIGVxIC0+IChlMSwgZTIpIGVxKVxuPSBmdW5jdGlvblxuICB8IEVuZF9vZl9mbXR0eSAtPlxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKVxuICB8IENoYXJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBTdHJpbmdfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnRfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgRmxvYXRfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBCb29sX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG5cbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQW55X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBlZCBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGRlIFJlZmwgaW4gUmVmbClcbiAgfCBGb3JtYXRfYXJnX3R5IChfdHksIHJlc3QpIC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBsZXQgYWcsIGdhLCBkaiwgamQgPSBmbXR0eV9yZWxfZGV0IHR5IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBsZXQgUmVmbCA9IGFnIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZ2EgUmVmbCBpbiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBsZXQgUmVmbCA9IGRqIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gamQgUmVmbCBpbiBsZXQgUmVmbCA9IGRlIFJlZmwgaW4gUmVmbClcblxuKCogUHJlY29uZGl0aW9uOiB3ZSBhc3N1bWUgdGhhdCB0aGUgdHdvIGZtdHR5X3JlbCBhcmd1bWVudHMgaGF2ZSBlcXVhbFxuICAgdmFsdWVzIChhdCBwb3NzaWJseSBkaXN0aW5jdCB0eXBlcyk7IHRoaXMgaW52YXJpYW50IGNvbWVzIGZyb20gdGhlIHdheVxuICAgZm10dHlfcmVsIHdpdG5lc3NlcyBhcmUgcHJvZHVjZWQgYnkgdGhlIHR5cGUtY2hlY2tlclxuXG4gICBUaGUgY29kZSBiZWxvdyB1c2VzIChhc3NlcnQgZmFsc2UpIHdoZW4gdGhpcyBhc3N1bXB0aW9uIGlzIGJyb2tlbi4gVGhlXG4gICBjb2RlIHBhdHRlcm4gaXMgdGhlIGZvbGxvd2luZzpcblxuICAgICB8IEZvbyB4LCBGb28geSAtPlxuICAgICAgICgqIGNhc2Ugd2hlcmUgaW5kZWVkIGJvdGggdmFsdWVzXG4gICAgICAgICAgc3RhcnQgd2l0aCBjb25zdHJ1Y3RvciBGb28gKilcbiAgICAgfCBGb28gXywgX1xuICAgICB8IF8sIEZvbyBfIC0+XG4gICAgICAgKCogZGlmZmVyZW50IGhlYWQgY29uc3RydWN0b3JzOiBicm9rZW4gcHJlY29uZGl0aW9uICopXG4gICAgICAgYXNzZXJ0IGZhbHNlXG4qKVxuYW5kIHRyYW5zIDogdHlwZVxuICBhMSBiMSBjMSBkMSBlMSBmMVxuICBhMiBiMiBjMiBkMiBlMiBmMlxuICBhMyBiMyBjMyBkMyBlMyBmM1xuLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbi0+IChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEzLCBiMywgYzMsIGQzLCBlMywgZjMpIGZtdHR5X3JlbFxuPSBmdW4gdHkxIHR5MiAtPiBtYXRjaCB0eTEsIHR5MiB3aXRoXG4gIHwgQ2hhcl90eSByZXN0MSwgQ2hhcl90eSByZXN0MiAtPiBDaGFyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBTdHJpbmdfdHkgcmVzdDEsIFN0cmluZ190eSByZXN0MiAtPiBTdHJpbmdfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEJvb2xfdHkgcmVzdDEsIEJvb2xfdHkgcmVzdDIgLT4gQm9vbF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50X3R5IHJlc3QxLCBJbnRfdHkgcmVzdDIgLT4gSW50X3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQzMl90eSByZXN0MSwgSW50MzJfdHkgcmVzdDIgLT4gSW50MzJfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludDY0X3R5IHJlc3QxLCBJbnQ2NF90eSByZXN0MiAtPiBJbnQ2NF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QxLCBOYXRpdmVpbnRfdHkgcmVzdDIgLT4gTmF0aXZlaW50X3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBGbG9hdF90eSByZXN0MSwgRmxvYXRfdHkgcmVzdDIgLT4gRmxvYXRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuXG4gIHwgQWxwaGFfdHkgcmVzdDEsIEFscGhhX3R5IHJlc3QyIC0+IEFscGhhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBBbHBoYV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFscGhhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBUaGV0YV90eSByZXN0MSwgVGhldGFfdHkgcmVzdDIgLT4gVGhldGFfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IFRoZXRhX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgVGhldGFfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IEFueV90eSByZXN0MSwgQW55X3R5IHJlc3QyIC0+IEFueV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQW55X3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgQW55X3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBSZWFkZXJfdHkgcmVzdDEsIFJlYWRlcl90eSByZXN0MiAtPiBSZWFkZXJfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IFJlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFJlYWRlcl90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdDEsIElnbm9yZWRfcmVhZGVyX3R5IHJlc3QyIC0+XG4gICAgSWdub3JlZF9yZWFkZXJfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgSWdub3JlZF9yZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IEZvcm1hdF9hcmdfdHkgKHR5MSwgcmVzdDEpLCBGb3JtYXRfYXJnX3R5ICh0eTIsIHJlc3QyKSAtPlxuICAgIEZvcm1hdF9hcmdfdHkgKHRyYW5zIHR5MSB0eTIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9hcmdfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBGb3JtYXRfYXJnX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MTIsIHJlc3QxKSxcbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MjEsIHR5MjIsIHJlc3QyKSAtPlxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MTIpIHR5MjEgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIGxldCBSZWZsID0gZjIgUmVmbCBpblxuICAgIGxldCBSZWZsID0gZjQgUmVmbCBpblxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxMSwgdHkyMiwgdHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRm9ybWF0X3N1YnN0X3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X3N1YnN0X3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBFbmRfb2ZfZm10dHksIEVuZF9vZl9mbXR0eSAtPiBFbmRfb2ZfZm10dHlcbiAgfCBFbmRfb2ZfZm10dHksIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRW5kX29mX2ZtdHR5IC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgcmVjIGZtdHR5X29mX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmb3JtYXR0aW5nX2dlbiAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gZm9ybWF0dGluZ19nZW4gLT4gbWF0Y2ggZm9ybWF0dGluZ19nZW4gd2l0aFxuICB8IE9wZW5fdGFnIChGb3JtYXQgKGZtdCwgXykpIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBPcGVuX2JveCAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEV4dHJhY3QgdGhlIHR5cGUgcmVwcmVzZW50YXRpb24gKGFuIGZtdHR5KSBvZiBhIGZvcm1hdC4gKilcbmFuZCBmbXR0eV9vZl9mbXQgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZtdHR5IC0+IG1hdGNoIGZtdHR5IHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCAoU3RyaW5nX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCAoU3RyaW5nX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG5cbiAgfCBJbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoSW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDMyIChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDMyX3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChOYXRpdmVpbnRfdHkgdHlfcmVzdCkgaW5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCBwcmVjX3R5XG4gIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoSW50NjRfdHkgdHlfcmVzdCkgaW5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCBwcmVjX3R5XG4gIHwgRmxvYXQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoRmxvYXRfdHkgdHlfcmVzdCkgaW5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCBwcmVjX3R5XG5cbiAgfCBDaGFyIHJlc3QgICAgICAgICAgICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDYW1sX2NoYXIgcmVzdCAgICAgICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBCb29sIChwYWQsIHJlc3QpICAgICAgICAgICAtPlxuICAgICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKEJvb2xfdHkgKGZtdHR5X29mX2ZtdCByZXN0KSlcbiAgfCBBbHBoYSByZXN0ICAgICAgICAgICAgICAgICAtPiBBbHBoYV90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgVGhldGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gVGhldGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpICAgIC0+IGZtdHR5X29mX2N1c3RvbSBhcml0eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgUmVhZGVyIHJlc3QgICAgICAgICAgICAgICAgLT4gUmVhZGVyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcblxuICB8IEZvcm1hdF9hcmcgKF8sIHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9hcmdfdHkgKHR5LCBmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBGb3JtYXRfc3Vic3QgKF8sIHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHksIHR5LCBmbXR0eV9vZl9mbXQgcmVzdClcblxuICB8IEZsdXNoIHJlc3QgICAgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgU3RyaW5nX2xpdGVyYWwgKF8sIHJlc3QpICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKF8sIHJlc3QpICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuXG4gIHwgU2Nhbl9jaGFyX3NldCAoXywgXywgcmVzdCkgLT4gU3RyaW5nX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPiBJbnRfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgICAgICAgIC0+IENoYXJfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgIC0+IGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IGlnbiByZXN0XG4gIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgIC0+XG4gICAgY29uY2F0X2ZtdHR5IChmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiBmbXRpbmdfZ2VuKSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0ICAgICAgICAgICAgICAtPiBFbmRfb2ZfZm10dHlcblxuYW5kIGZtdHR5X29mX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKGEsIHgsIHkpIGN1c3RvbV9hcml0eSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgKHksIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBhcml0eSBmbXR0eSAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gZm10dHlcbiAgfCBDdXN0b21fc3VjYyBhcml0eSAtPiBBbnlfdHkgKGZtdHR5X29mX2N1c3RvbSBhcml0eSBmbXR0eSlcblxuKCogRXh0cmFjdCB0aGUgZm10dHkgb2YgYW4gaWdub3JlZCBwYXJhbWV0ZXIgZm9sbG93ZWQgYnkgdGhlIHJlc3Qgb2ZcbiAgIHRoZSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKGEsIGIsIGMsIGQsIHksIHgpIGlnbm9yZWQgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyICAgICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBfICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9pbnQgKF8sIF8pICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKF8sIF8pICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9pbnQ2NCAoXywgXykgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9ib29sIF8gICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIF8gICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBjb25jYXRfZm10dHkgZm10dHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBJZ25vcmVkX3JlYWRlcl90eSAoZm10dHlfb2ZfZm10IGZtdClcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgXyAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcblxuKCogQWRkIGFuIEludF90eSBub2RlIGlmIHBhZGRpbmcgaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqc1wiKS4gKilcbmFuZCBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IDogdHlwZSB4IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgYSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT4gKHgsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbiAgZnVuIHBhZCBmbXR0eSAtPiBtYXRjaCBwYWQgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICAtPiBmbXR0eVxuICAgIHwgTGl0X3BhZGRpbmcgXyAtPiBmbXR0eVxuICAgIHwgQXJnX3BhZGRpbmcgXyAtPiBJbnRfdHkgZm10dHlcblxuKCogQWRkIGFuIEludF90eSBub2RlIGlmIHByZWNpc2lvbiBpcyB0YWtlbiBhcyBhbiBleHRyYSBhcmd1bWVudCAoZXg6IFwiJS4qZlwiKS4qKVxuYW5kIGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHByZWNpc2lvbiAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT4gKHgsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbiAgZnVuIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgfCBOb19wcmVjaXNpb24gICAgLT4gZm10dHlcbiAgICB8IExpdF9wcmVjaXNpb24gXyAtPiBmbXR0eVxuICAgIHwgQXJnX3ByZWNpc2lvbiAgIC0+IEludF90eSBmbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBpbmcgKilcblxuKCogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGEgZm9ybWF0IGRvZXMgbm90IG1hdGNoIGEgZ2l2ZW4gZm9ybWF0IHR5cGUuICopXG5leGNlcHRpb24gVHlwZV9taXNtYXRjaFxuXG4oKiBUeXBlIGEgcGFkZGluZy4gKilcbigqIFRha2UgYW4gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIHRoZSBpbnRlZ2VyIHNob3VsZCBiZSBrZXB0IGFzIGFyZ3VtZW50LiAqKVxuKCogUmFpc2UgVHlwZV9taXNtYXRjaCBpbiBjYXNlIG9mIHR5cGUgbWlzbWF0Y2guICopXG5sZXQgdHlwZV9wYWRkaW5nIDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgICh4LCB5KSBwYWRkaW5nIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgICAgKGEsIGIsIGMsIGQsIGUsIGYpIHBhZGRpbmdfZm10dHlfZWJiID1cbmZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkLCBmbXR0eSB3aXRoXG4gIHwgTm9fcGFkZGluZywgXyAtPiBQYWRkaW5nX2ZtdHR5X0VCQiAoTm9fcGFkZGluZywgZm10dHkpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgXyAtPiBQYWRkaW5nX2ZtdHR5X0VCQiAoTGl0X3BhZGRpbmcgKHBhZHR5LHcpLGZtdHR5KVxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBJbnRfdHkgcmVzdCAtPiBQYWRkaW5nX2ZtdHR5X0VCQiAoQXJnX3BhZGRpbmcgcGFkdHkscmVzdClcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogQ29udmVydCBhICh1cGFkZGluZywgdXByZWNpc2lvbikgdG8gYSAocGFkZGluZywgcHJlY2lzaW9uKS4gKilcbigqIFRha2Ugb25lIG9yIHR3byBJbnRfdHkgZnJvbSB0aGUgZm10dHkgaWYgbmVlZGVkLiAqKVxuKCogUmFpc2UgVHlwZV9taXNtYXRjaCBpbiBjYXNlIG9mIHR5cGUgbWlzbWF0Y2guICopXG5sZXQgdHlwZV9wYWRwcmVjIDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgeiAuXG4gICh4LCB5KSBwYWRkaW5nIC0+ICh5LCB6KSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIHBhZHByZWNfZm10dHlfZWJiID1cbmZ1biBwYWQgcHJlYyBmbXR0eSAtPiBtYXRjaCBwcmVjLCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgfCBOb19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTm9fcHJlY2lzaW9uLCByZXN0KVxuICB8IExpdF9wcmVjaXNpb24gcCwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgcmVzdCkgLT5cbiAgICBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBMaXRfcHJlY2lzaW9uIHAsIHJlc3QpXG4gIHwgQXJnX3ByZWNpc2lvbiwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgSW50X3R5IHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgQXJnX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBfLCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG4oKiBUeXBlIGEgZm9ybWF0IGFjY29yZGluZyB0byBhbiBmbXR0eS4gKilcbigqIElmIHR5cGluZyBzdWNjZWVkLCBnZW5lcmF0ZSBhIGNvcHkgb2YgdGhlIGZvcm1hdCB3aXRoIHRoZSBzYW1lXG4gICAgdHlwZSBwYXJhbWV0ZXJzIGFzIHRoZSBmbXR0eS4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHJlYyB0eXBlX2Zvcm1hdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMiAgLlxuICAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eVxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10XG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSB3aXRoXG4gIHwgRm10X2ZtdHR5X0VCQiAoZm10JywgRW5kX29mX2ZtdHR5KSAtPiBmbXQnXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdF9nZW4gOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGZtdCBmbXR0eSAtPiBtYXRjaCBmbXQsIGZtdHR5IHdpdGhcbiAgfCBDaGFyIGZtdF9yZXN0LCBDaGFyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoQ2hhciBmbXQnLCBmbXR0eScpXG4gIHwgQ2FtbF9jaGFyIGZtdF9yZXN0LCBDaGFyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoQ2FtbF9jaGFyIGZtdCcsIGZtdHR5JylcbiAgfCBTdHJpbmcgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIFN0cmluZ190eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIFN0cmluZ190eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludF90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnQzMl90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoSW50MzIgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50NjRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDY0IChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBGbG9hdF90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgQm9vbCAocGFkLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkZGluZyBwYWQgZm10dHkgd2l0aFxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgQm9vbF90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoQm9vbCAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEZsdXNoIGZtdF9yZXN0LCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZsdXNoIGZtdCcsIGZtdHR5JylcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIGZtdF9yZXN0KSwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXQnKSwgZm10dHknKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoQ2hhcl9saXRlcmFsIChjaHIsIGZtdCcpLCBmbXR0eScpXG5cbiAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBzdWJfZm10dHksIGZtdF9yZXN0KSxcbiAgICBGb3JtYXRfYXJnX3R5IChzdWJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWJfZm10dHkgPD4gRm10dHlfRUJCIHN1Yl9mbXR0eScgdGhlbiByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBzdWJfZm10dHknLCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHkxLCBfc3ViX2ZtdHR5MiwgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1Yl9mbXR0eTEpIHRoZW5cbiAgICAgIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPVxuICAgICAgdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IChlcmFzZV9yZWwgZm10dHlfcmVzdClcbiAgICBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgc3ViX2ZtdHR5MSwgZm10JyksIGZtdHR5JylcbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IEFscGhhIGZtdF9yZXN0LCBBbHBoYV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEFscGhhIGZtdCcsIGZtdHR5JylcbiAgfCBUaGV0YSBmbXRfcmVzdCwgVGhldGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChUaGV0YSBmbXQnLCBmbXR0eScpXG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIGZtdF9yZXN0KSwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmdfZ2VuLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2Zvcm1hdHRpbmdfZ2VuIGZvcm1hdHRpbmdfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3RcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgUmVhZGVyIGZtdF9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChSZWFkZXIgZm10JywgZm10dHknKVxuICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdF9yZXN0KSwgU3RyaW5nX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgZm10JyksIGZtdHR5JylcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCksIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdCcpLCBmbXR0eScpXG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSwgZm10dHlfcmVzdCAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbSBpZ24gcmVzdCBmbXR0eV9yZXN0XG5cbiAgfCBFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0IC0+IEZtdF9mbXR0eV9FQkIgKEVuZF9vZl9mb3JtYXQsIGZtdHR5X3Jlc3QpXG5cbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuYW5kIHR5cGVfZm9ybWF0dGluZ19nZW4gOiB0eXBlIGExIGEzIGIxIGIzIGMxIGMzIGQxIGQzIGUxIGUyIGUzIGYxIGYyIGYzIC5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoZjEsIGIxLCBjMSwgZTEsIGUyLCBmMikgZm10IC0+XG4gICAgKGEzLCBiMywgYzMsIGQzLCBlMywgZjMpIGZtdHR5IC0+XG4gICAgKGEzLCBiMywgYzMsIGQzLCBlMywgZjMpIGZtdF9mbXR0eV9lYmIgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIGZtdDAgZm10dHkwIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQxLCBzdHIpKSAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQyLCBmbXR0eTIpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDEgZm10dHkwIGluXG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDMsIGZtdHR5MykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MCBmbXR0eTIgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10Miwgc3RyKSksIGZtdDMpLCBmbXR0eTMpXG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuXG4oKiBUeXBlIGFuIElnbm9yZWRfcGFyYW0gbm9kZSBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG5hbmQgdHlwZV9pZ25vcmVkX3BhcmFtIDogdHlwZSBwIHEgeCB5IHogdCB1IHYgYSBiIGMgZCBlIGYgLlxuICAgICh4LCB5LCB6LCB0LCBxLCBwKSBpZ25vcmVkIC0+XG4gICAgKHAsIHksIHosIHEsIHUsIHYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXRfZm10dHlfZWJiID1cbmZ1biBpZ24gZm10IGZtdHR5IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyICAgICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBfICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9pbnQgXyAgICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9pbnQzMiBfICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgXyAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9pbnQ2NCBfICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mbG9hdCBfICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9ib29sIF8gICAgICAgICAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgYXMgaWduJyAtPiB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIGlnbicgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBzdWJfZm10dHkpIC0+XG4gICAgdHlwZV9pZ25vcmVkX3BhcmFtX29uZSAoSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBzdWJfZm10dHkpKSBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHknLCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHkgZm10IGZtdHR5IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eScpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdHR5JylcbiAgfCBJZ25vcmVkX3JlYWRlciAtPiAoXG4gICAgbWF0Y2ggZm10dHkgd2l0aFxuICAgIHwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfcmVhZGVyLCBmbXQnKSwgZm10dHknKVxuICAgIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcblxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgOiB0eXBlIGExIGEyIGIxIGIyIGMxIGMyIGQxIGQyIGUxIGUyIGYxIGYyIC5cbiAgICAoYTIsIGIyLCBjMiwgZDIsIGQyLCBhMikgaWdub3JlZCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXQgLT5cbiAgICAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHkgLT5cbiAgICAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10X2ZtdHR5X2ViYlxuPSBmdW4gaWduIGZtdCBmbXR0eSAtPlxuICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgaW5cbiAgRm10X2ZtdHR5X0VCQiAoSWdub3JlZF9wYXJhbSAoaWduLCBmbXQnKSwgZm10dHknKVxuXG4oKiBUeXBpbmcgb2YgdGhlIGNvbXBsZXggY2FzZTogXCIlXyguLi4lKVwiLiAqKVxuYW5kIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIDogdHlwZSB3IHggeSB6IHAgcyB0IHUgYSBiIGMgZCBlIGYgLlxuICAgICh3LCB4LCB5LCB6LCBzLCBwKSBmbXR0eSAtPlxuICAgIChwLCB4LCB5LCBzLCB0LCB1KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5X2ZtdF9lYmIgPVxuZnVuIHN1Yl9mbXR0eSBmbXQgZm10dHkgLT4gbWF0Y2ggc3ViX2ZtdHR5LCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSBzdWJfZm10dHlfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChDaGFyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBTdHJpbmdfdHkgc3ViX2ZtdHR5X3Jlc3QsIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChTdHJpbmdfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludF90eSBzdWJfZm10dHlfcmVzdCwgSW50X3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEludF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgSW50MzJfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludDMyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBOYXRpdmVpbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIE5hdGl2ZWludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChOYXRpdmVpbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDY0X3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQ2NF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgRmxvYXRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEZsb2F0X3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBCb29sX3R5IHN1Yl9mbXR0eV9yZXN0LCBCb29sX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEJvb2xfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEFscGhhX3R5IHN1Yl9mbXR0eV9yZXN0LCBBbHBoYV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChBbHBoYV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgVGhldGFfdHkgc3ViX2ZtdHR5X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBSZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIFJlYWRlcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChSZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJZ25vcmVkX3JlYWRlcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG5cbiAgfCBGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5LCBzdWJfZm10dHlfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eScsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIHN1YjJfZm10dHkgPD4gRm10dHlfRUJCIHN1YjJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBzdWJfZm10dHlfcmVzdCcpLCBmbXQnKVxuICB8IEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eSwgIHN1YjJfZm10dHksICBzdWJfZm10dHlfcmVzdCksXG4gICAgRm9ybWF0X3N1YnN0X3R5IChzdWIxX2ZtdHR5Jywgc3ViMl9mbXR0eScsIGZtdHR5X3Jlc3QpIC0+XG4gICAgKCogVE9ETyBkZWZpbmUgRm10dHlfcmVsX0VCQiB0byByZW1vdmUgdGhvc2UgZXJhc2VfcmVsICopXG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViMV9mbXR0eSkgPD4gRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViMV9mbXR0eScpXG4gICAgdGhlbiByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjJfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjJfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgc3ViX2ZtdHR5JyA9IHRyYW5zIChzeW1tIHN1YjFfZm10dHknKSBzdWIyX2ZtdHR5JyBpblxuICAgIGxldCBfLCBmMiwgXywgZjQgPSBmbXR0eV9yZWxfZGV0IHN1Yl9mbXR0eScgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiAoZXJhc2VfcmVsIHN1Yl9mbXR0eV9yZXN0KSBmbXQgZm10dHlfcmVzdFxuICAgIGluXG4gICAgRm10dHlfZm10X0VCQiAoRm9ybWF0X3N1YnN0X3R5IChzdWIxX2ZtdHR5Jywgc3ViMl9mbXR0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tIHN1Yl9mbXR0eV9yZXN0JyksXG4gICAgICAgICAgICAgICAgICAgZm10JylcbiAgfCBFbmRfb2ZfZm10dHksIGZtdHR5IC0+XG4gICAgRm10dHlfZm10X0VCQiAoRW5kX29mX2ZtdHR5LCB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5KVxuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG4oKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGByZWNhc3RgIGlzIGEgYml0IGRpc2FwcG9pbnRpbmcuIFRoZVxuICAgaW52YXJpYW50IHByb3ZpZGVkIGJ5IHRoZSB0eXBlIGFyZSB2ZXJ5IHN0cm9uZzogdGhlIGlucHV0IGZvcm1hdCdzXG4gICB0eXBlIGlzIGluIHJlbGF0aW9uIHRvIHRoZSBvdXRwdXQgdHlwZSdzIGFzIHdpdG5lc3NlZCBieSB0aGVcbiAgIGZtdHR5X3JlbCBhcmd1bWVudC4gT25lIHdvdWxkIGF0IGZpcnN0IGV4cGVjdCB0aGlzIGZ1bmN0aW9uIHRvIGJlXG4gICB0b3RhbCwgYW5kIGltcGxlbWVudGFibGUgYnkgZXhoYXVzdGl2ZSBwYXR0ZXJuIG1hdGNoaW5nLiBJbnN0ZWFkLFxuICAgd2UgcmV1c2UgdGhlIGhpZ2hseSBwYXJ0aWFsIGFuZCBtdWNoIGxlc3Mgd2VsbC1kZWZpbmVkIGZ1bmN0aW9uXG4gICBgdHlwZV9mb3JtYXRgIHRoYXQgaGFzIGxvc3QgYWxsIGtub3dsZWRnZSBvZiB0aGUgY29ycmVzcG9uZGVuY2VcbiAgIGJldHdlZW4gdGhlIGFyZ3VtZW50J3MgdHlwZXMuXG5cbiAgIEJlc2lkZXMgdGhlIGZhY3QgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldXNlcyBhIGxvdCBvZiB0aGVcbiAgIGB0eXBlX2Zvcm1hdGAgbG9naWMgKGVnLjogc2VlaW5nIEludF90eSBpbiB0aGUgZm10dHkgcGFyYW1ldGVyIGRvZXNcbiAgIG5vdCBsZXQgeW91IG1hdGNoIG9uIEludCBvbmx5LCBhcyB5b3UgbWF5IGluIGZhY3QgaGF2ZSBGbG9hdFxuICAgKEFyZ19wYWRkaW5nLCAuLi4pIChcIiUuKmRcIikgYmVnaW5uaW5nIHdpdGggYW4gSW50X3R5KSwgaXQgaXMgYWxzb1xuICAgYSBwYXJ0aWFsIGZ1bmN0aW9uLCBiZWNhdXNlIHRoZSB0eXBpbmcgaW5mb3JtYXRpb24gaW4gYSBmb3JtYXQgaXNcbiAgIG5vdCBxdWl0ZSBlbm91Z2ggdG8gcmVjb25zdHJ1Y3QgaXQgdW5hbWJpZ3VvdXNseS4gRm9yIGV4YW1wbGUsIHRoZVxuICAgZm9ybWF0IHR5cGVzIG9mIFwiJWQlX3JcIiBhbmQgXCIlX3IlZFwiIGhhdmUgdGhlIHNhbWUgZm9ybWF0NlxuICAgcGFyYW1ldGVycywgYnV0IHRoZXkgYXJlIG5vdCBhdCBhbGwgZXhjaGFuZ2VhYmxlLCBhbmQgcHV0dGluZyBvbmVcbiAgIGluIHBsYWNlIG9mIHRoZSBvdGhlciBtdXN0IHJlc3VsdCBpbiBhIGR5bmFtaWMgZmFpbHVyZS5cblxuICAgR2l2ZW4gdGhhdDpcbiAgIC0gd2UnZCBoYXZlIHRvIGR1cGxpY2F0ZSBhIGxvdCBvZiBub24tdHJpdmlhbCB0eXBpbmcgbG9naWMgZnJvbSB0eXBlX2Zvcm1hdFxuICAgLSB0aGlzIHdvdWxkbid0IGV2ZW4gZWxpbWluYXRlIChhbGwpIHRoZSBkeW5hbWljIGZhaWx1cmVzXG4gICB3ZSBkZWNpZGVkIHRvIGp1c3QgcmV1c2UgdHlwZV9mb3JtYXQgZGlyZWN0bHkgZm9yIG5vdy5cbiopXG5sZXQgcmVjYXN0IDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyXG4gIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10XG49IGZ1biBmbXQgZm10dHkgLT5cbiAgdHlwZV9mb3JtYXQgZm10IChlcmFzZV9yZWwgKHN5bW0gZm10dHkpKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBQcmludGluZyB0b29scyAqKVxuXG4oKiBBZGQgcGFkZGluZyBzcGFjZXMgYXJvdW5kIGEgc3RyaW5nLiAqKVxubGV0IGZpeF9wYWRkaW5nIHBhZHR5IHdpZHRoIHN0ciA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgd2lkdGgsIHBhZHR5ID1cbiAgICBhYnMgd2lkdGgsXG4gICAgKCogd2hpbGUgbGl0ZXJhbCBwYWRkaW5nIHdpZHRocyBhcmUgYWx3YXlzIG5vbi1uZWdhdGl2ZSxcbiAgICAgICBkeW5hbWljYWxseS1zZXQgd2lkdGhzIChBcmdfcGFkZGluZywgZWcuICUqZCkgbWF5IGJlIG5lZ2F0aXZlO1xuICAgICAgIHdlIGludGVycHJldCB0aG9zZSBhcyBzcGVjaWZ5aW5nIGEgcGFkZGluZy10by10aGUtbGVmdDsgdGhpc1xuICAgICAgIG1lYW5zIHRoYXQgJzAnIG1heSBnZXQgZHJvcHBlZCBldmVuIGlmIGl0IHdhcyBleHBsaWNpdGx5IHNldCxcbiAgICAgICBidXQ6XG4gICAgICAgLSB0aGlzIGlzIHdoYXQgdGhlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBkb2VzLCBhbmRcbiAgICAgICAgIHdlIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgaWYgcG9zc2libGVcbiAgICAgICAtIHdlIGNvdWxkIG9ubHkgc2lnbmFsIHRoaXMgaXNzdWUgYnkgZmFpbGluZyBhdCBydW50aW1lLFxuICAgICAgICAgd2hpY2ggaXMgbm90IHZlcnkgbmljZS4uLiAqKVxuICAgIGlmIHdpZHRoIDwgMCB0aGVuIExlZnQgZWxzZSBwYWR0eSBpblxuICBpZiB3aWR0aCA8PSBsZW4gdGhlbiBzdHIgZWxzZVxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHdpZHRoIChpZiBwYWR0eSA9IFplcm9zIHRoZW4gJzAnIGVsc2UgJyAnKSBpblxuICAgIGJlZ2luIG1hdGNoIHBhZHR5IHdpdGhcbiAgICB8IExlZnQgIC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAwIGxlblxuICAgIHwgUmlnaHQgLT4gU3RyaW5nLmJsaXQgc3RyIDAgcmVzICh3aWR0aCAtIGxlbikgbGVuXG4gICAgfCBaZXJvcyB3aGVuIGxlbiA+IDAgJiYgKHN0ci5bMF0gPSAnKycgfHwgc3RyLlswXSA9ICctJyB8fCBzdHIuWzBdID0gJyAnKSAtPlxuICAgICAgQnl0ZXMuc2V0IHJlcyAwIHN0ci5bMF07XG4gICAgICBTdHJpbmcuYmxpdCBzdHIgMSByZXMgKHdpZHRoIC0gbGVuICsgMSkgKGxlbiAtIDEpXG4gICAgfCBaZXJvcyB3aGVuIGxlbiA+IDEgJiYgc3RyLlswXSA9ICcwJyAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgICBTdHJpbmcuYmxpdCBzdHIgMiByZXMgKHdpZHRoIC0gbGVuICsgMikgKGxlbiAtIDIpXG4gICAgfCBaZXJvcyAtPlxuICAgICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzICh3aWR0aCAtIGxlbikgbGVuXG4gICAgZW5kO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEFkZCAnMCcgcGFkZGluZyB0byBpbnQsIGludDMyLCBuYXRpdmVpbnQgb3IgaW50NjQgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAqKVxubGV0IGZpeF9pbnRfcHJlY2lzaW9uIHByZWMgc3RyID1cbiAgbGV0IHByZWMgPSBhYnMgcHJlYyBpblxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbWF0Y2ggc3RyLlswXSB3aXRoXG4gIHwgKCcrJyB8ICctJyB8ICcgJykgYXMgYyB3aGVuIHByZWMgKyAxID4gbGVuIC0+XG4gICAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKHByZWMgKyAxKSAnMCcgaW5cbiAgICBCeXRlcy5zZXQgcmVzIDAgYztcbiAgICBTdHJpbmcuYmxpdCBzdHIgMSByZXMgKHByZWMgLSBsZW4gKyAyKSAobGVuIC0gMSk7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCAnMCcgd2hlbiBwcmVjICsgMiA+IGxlbiAmJiBsZW4gPiAxICYmIChzdHIuWzFdID0gJ3gnIHx8IHN0ci5bMV0gPSAnWCcpIC0+XG4gICAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKHByZWMgKyAyKSAnMCcgaW5cbiAgICBCeXRlcy5zZXQgcmVzIDEgc3RyLlsxXTtcbiAgICBTdHJpbmcuYmxpdCBzdHIgMiByZXMgKHByZWMgLSBsZW4gKyA0KSAobGVuIC0gMik7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgd2hlbiBwcmVjID4gbGVuIC0+XG4gICAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgcHJlYyAnMCcgaW5cbiAgICBTdHJpbmcuYmxpdCBzdHIgMCByZXMgKHByZWMgLSBsZW4pIGxlbjtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuICB8IF8gLT5cbiAgICBzdHJcblxuKCogRXNjYXBlIGEgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgT0NhbWwgbGV4aW5nIGNvbnZlbnRpb24uICopXG5sZXQgc3RyaW5nX3RvX2NhbWxfc3RyaW5nIHN0ciA9XG4gIGxldCBzdHIgPSBTdHJpbmcuZXNjYXBlZCBzdHIgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXFwiJyBpblxuICBTdHJpbmcudW5zYWZlX2JsaXQgc3RyIDAgcmVzIDEgbDtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcblxuKCogR2VuZXJhdGUgdGhlIGZvcm1hdF9pbnQvaW50MzIvbmF0aXZlaW50L2ludDY0IGZpcnN0IGFyZ3VtZW50XG4gICBmcm9tIGFuIGludF9jb252LiAqKVxubGV0IGZvcm1hdF9vZl9pY29udiA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlZFwiIHwgSW50X3BkIC0+IFwiJStkXCIgfCBJbnRfc2QgLT4gXCIlIGRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJWlcIiB8IEludF9waSAtPiBcIiUraVwiIHwgSW50X3NpIC0+IFwiJSBpXCJcbiAgfCBJbnRfeCAtPiBcIiV4XCIgfCBJbnRfQ3ggLT4gXCIlI3hcIlxuICB8IEludF9YIC0+IFwiJVhcIiB8IEludF9DWCAtPiBcIiUjWFwiXG4gIHwgSW50X28gLT4gXCIlb1wiIHwgSW50X0NvIC0+IFwiJSNvXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiV1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udkwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJUxkXCIgfCBJbnRfcGQgLT4gXCIlK0xkXCIgfCBJbnRfc2QgLT4gXCIlIExkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVMaVwiIHwgSW50X3BpIC0+IFwiJStMaVwiIHwgSW50X3NpIC0+IFwiJSBMaVwiXG4gIHwgSW50X3ggLT4gXCIlTHhcIiB8IEludF9DeCAtPiBcIiUjTHhcIlxuICB8IEludF9YIC0+IFwiJUxYXCIgfCBJbnRfQ1ggLT4gXCIlI0xYXCJcbiAgfCBJbnRfbyAtPiBcIiVMb1wiIHwgSW50X0NvIC0+IFwiJSNMb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlTHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252bCA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbGRcIiB8IEludF9wZCAtPiBcIiUrbGRcIiB8IEludF9zZCAtPiBcIiUgbGRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJWxpXCIgfCBJbnRfcGkgLT4gXCIlK2xpXCIgfCBJbnRfc2kgLT4gXCIlIGxpXCJcbiAgfCBJbnRfeCAtPiBcIiVseFwiIHwgSW50X0N4IC0+IFwiJSNseFwiXG4gIHwgSW50X1ggLT4gXCIlbFhcIiB8IEludF9DWCAtPiBcIiUjbFhcIlxuICB8IEludF9vIC0+IFwiJWxvXCIgfCBJbnRfQ28gLT4gXCIlI2xvXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVsdVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZuID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVuZFwiIHwgSW50X3BkIC0+IFwiJStuZFwiIHwgSW50X3NkIC0+IFwiJSBuZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlbmlcIiB8IEludF9waSAtPiBcIiUrbmlcIiB8IEludF9zaSAtPiBcIiUgbmlcIlxuICB8IEludF94IC0+IFwiJW54XCIgfCBJbnRfQ3ggLT4gXCIlI254XCJcbiAgfCBJbnRfWCAtPiBcIiVuWFwiIHwgSW50X0NYIC0+IFwiJSNuWFwiXG4gIHwgSW50X28gLT4gXCIlbm9cIiB8IEludF9DbyAtPiBcIiUjbm9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJW51XCJcblxuKCogR2VuZXJhdGUgdGhlIGZvcm1hdF9mbG9hdCBmaXJzdCBhcmd1bWVudCBmcm9tIGEgZmxvYXRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYyA9XG4gICAgbGV0IHByZWMgPSBhYnMgcHJlYyBpblxuICAgIGxldCBzeW1iID0gY2hhcl9vZl9mY29udiB+Y0Y6J2cnIGZjb252IGluXG4gICAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgICBicHJpbnRfZmNvbnZfZmxhZyBidWYgZmNvbnY7XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHByZWMpO1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgc3ltYjtcbiAgICBidWZmZXJfY29udGVudHMgYnVmXG5cbmxldCB0cmFuc2Zvcm1faW50X2FsdCBpY29udiBzID1cbiAgbWF0Y2ggaWNvbnYgd2l0aFxuICB8IEludF9DZCB8IEludF9DaSB8IEludF9DdSAtPlxuICAgIGxldCBkaWdpdHMgPVxuICAgICAgbGV0IG4gPSByZWYgMCBpblxuICAgICAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICAgICAgbWF0Y2ggU3RyaW5nLnVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgICAgfCAnMCcuLic5JyAtPiBpbmNyIG5cbiAgICAgICAgfCBfIC0+ICgpXG4gICAgICBkb25lO1xuICAgICAgIW5cbiAgICBpblxuICAgIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgKFN0cmluZy5sZW5ndGggcyArIChkaWdpdHMgLSAxKSAvIDMpIGluXG4gICAgbGV0IHBvcyA9IHJlZiAwIGluXG4gICAgbGV0IHB1dCBjID0gQnl0ZXMuc2V0IGJ1ZiAhcG9zIGM7IGluY3IgcG9zIGluXG4gICAgbGV0IGxlZnQgPSByZWYgKChkaWdpdHMgLSAxKSBtb2QgMyArIDEpIGluXG4gICAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICB8ICcwJy4uJzknIGFzIGMgLT5cbiAgICAgICAgICBpZiAhbGVmdCA9IDAgdGhlbiAocHV0ICdfJzsgbGVmdCA6PSAzKTsgZGVjciBsZWZ0OyBwdXQgY1xuICAgICAgfCBjIC0+IHB1dCBjXG4gICAgZG9uZTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJ1ZlxuICB8IF8gLT4gc1xuXG4oKiBDb252ZXJ0IGFuIGludGVnZXIgdG8gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIGEgY29udmVyc2lvbi4gKilcbmxldCBjb252ZXJ0X2ludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQgKGZvcm1hdF9vZl9pY29udiBpY29udikgbilcbmxldCBjb252ZXJ0X2ludDMyIGljb252IG4gPVxuICB0cmFuc2Zvcm1faW50X2FsdCBpY29udiAoZm9ybWF0X2ludDMyIChmb3JtYXRfb2ZfaWNvbnZsIGljb252KSBuKVxubGV0IGNvbnZlcnRfbmF0aXZlaW50IGljb252IG4gPVxuICB0cmFuc2Zvcm1faW50X2FsdCBpY29udiAoZm9ybWF0X25hdGl2ZWludCAoZm9ybWF0X29mX2ljb252biBpY29udikgbilcbmxldCBjb252ZXJ0X2ludDY0IGljb252IG4gPVxuICB0cmFuc2Zvcm1faW50X2FsdCBpY29udiAoZm9ybWF0X2ludDY0IChmb3JtYXRfb2ZfaWNvbnZMIGljb252KSBuKVxuXG4oKiBDb252ZXJ0IGEgZmxvYXQgdG8gc3RyaW5nLiAqKVxuKCogRml4IHNwZWNpYWwgY2FzZSBvZiBcIk9DYW1sIGZsb2F0IGZvcm1hdFwiLiAqKVxubGV0IGNvbnZlcnRfZmxvYXQgZmNvbnYgcHJlYyB4ID1cbiAgbGV0IGhleCAoKSA9XG4gICAgbGV0IHNpZ24gPVxuICAgICAgbWF0Y2ggZnN0IGZjb252IHdpdGhcbiAgICAgIHwgRmxvYXRfZmxhZ19wIC0+ICcrJ1xuICAgICAgfCBGbG9hdF9mbGFnX3MgLT4gJyAnXG4gICAgICB8IF8gLT4gJy0nIGluXG4gICAgaGV4c3RyaW5nX29mX2Zsb2F0IHggcHJlYyBzaWduIGluXG4gIGxldCBhZGRfZG90X2lmX25lZWRlZCBzdHIgPVxuICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICAgIGxldCByZWMgaXNfdmFsaWQgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gZmFsc2UgZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2ldIHdpdGhcbiAgICAgICAgfCAnLicgfCAnZScgfCAnRScgLT4gdHJ1ZVxuICAgICAgICB8IF8gLT4gaXNfdmFsaWQgKGkgKyAxKSBpblxuICAgIGlmIGlzX3ZhbGlkIDAgdGhlbiBzdHIgZWxzZSBzdHIgXiBcIi5cIiBpblxuICBsZXQgY2FtbF9zcGVjaWFsX3ZhbCBzdHIgPSBtYXRjaCBjbGFzc2lmeV9mbG9hdCB4IHdpdGhcbiAgICB8IEZQX25vcm1hbCB8IEZQX3N1Ym5vcm1hbCB8IEZQX3plcm8gLT4gc3RyXG4gICAgfCBGUF9pbmZpbml0ZSAtPiBpZiB4IDwgMC4wIHRoZW4gXCJuZWdfaW5maW5pdHlcIiBlbHNlIFwiaW5maW5pdHlcIlxuICAgIHwgRlBfbmFuIC0+IFwibmFuXCIgaW5cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9oIC0+IGhleCAoKVxuICB8IEZsb2F0X0ggLT4gU3RyaW5nLnVwcGVyY2FzZV9hc2NpaSAoaGV4ICgpKVxuICB8IEZsb2F0X0NGIC0+IGNhbWxfc3BlY2lhbF92YWwgKGhleCAoKSlcbiAgfCBGbG9hdF9GIC0+XG4gICAgbGV0IHN0ciA9IGZvcm1hdF9mbG9hdCAoZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMpIHggaW5cbiAgICBjYW1sX3NwZWNpYWxfdmFsIChhZGRfZG90X2lmX25lZWRlZCBzdHIpXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0cgLT5cbiAgICBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4XG5cbigqIENvbnZlcnQgYSBjaGFyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgT0NhbWwgbGV4aWNhbCBjb252ZW50aW9uLiAqKVxubGV0IGZvcm1hdF9jYW1sX2NoYXIgYyA9XG4gIGxldCBzdHIgPSBDaGFyLmVzY2FwZWQgYyBpblxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIGxldCByZXMgPSBCeXRlcy5tYWtlIChsICsgMikgJ1xcJycgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIENvbnZlcnQgYSBmb3JtYXQgdHlwZSB0byBzdHJpbmcgKilcbmxldCBzdHJpbmdfb2ZfZm10dHkgZm10dHkgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10dHkgYnVmIGZtdHR5O1xuICBidWZmZXJfY29udGVudHMgYnVmXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAoKiBHZW5lcmljIHByaW50aW5nIGZ1bmN0aW9uICopXG5cbigqIE1ha2UgYSBnZW5lcmljIHByaW50aW5nIGZ1bmN0aW9uLiAqKVxuKCogVXNlZCB0byBnZW5lcmF0ZSBQcmludGYgYW5kIEZvcm1hdCBwcmludGluZyBmdW5jdGlvbnMuICopXG4oKiBQYXJhbWV0ZXJzOlxuICAgICBrOiBhIGNvbnRpbnVhdGlvbiBmaW5hbGx5IGFwcGxpZWQgdG8gdGhlIG91dHB1dCBzdHJlYW0gYW5kIHRoZSBhY2N1bXVsYXRvci5cbiAgICAgbzogdGhlIG91dHB1dCBzdHJlYW0gKHNlZSBrLCAlYSBhbmQgJXQpLlxuICAgICBhY2M6IHJldiBsaXN0IG9mIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXNoLCBmb3JtYXR0aW5nLCAuLi4pLlxuICAgICBmbXQ6IHRoZSBmb3JtYXQuICopXG5sZXQgcmVjIG1ha2VfcHJpbnRmIDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgZm10IC0+IG1hdGNoIGZtdCB3aXRoXG4gIHwgQ2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfY2FtbF9jaGFyIGMpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgcmVzdFxuICB8IFN0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIG1ha2VfcGFkZGluZyBrIGFjYyByZXN0IHBhZCAoZnVuIHN0ciAtPiBzdHIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgc3RyaW5nX3RvX2NhbWxfc3RyaW5nXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9pbnQgaWNvbnZcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50MzIgaWNvbnZcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X25hdGl2ZWludCBpY29udlxuICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9pbnQ2NCBpY29udlxuICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBmY29udlxuICB8IEJvb2wgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgc3RyaW5nX29mX2Jvb2xcbiAgfCBBbHBoYSByZXN0IC0+XG4gICAgZnVuIGYgeCAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZnVuIG8gLT4gZiBvIHgpKSByZXN0XG4gIHwgVGhldGEgcmVzdCAtPlxuICAgIGZ1biBmIC0+IG1ha2VfcHJpbnRmIGsgKEFjY19kZWxheSAoYWNjLCBmKSkgcmVzdFxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiAoKSlcbiAgfCBSZWFkZXIgXyAtPlxuICAgICgqIFRoaXMgY2FzZSBpcyBpbXBvc3NpYmxlLCBieSB0eXBpbmcgb2YgZm9ybWF0cy4gKilcbiAgICAoKiBJbmRlZWQsIHNpbmNlIHByaW50ZiBhbmQgY28uIHRha2UgYSBmb3JtYXQ0IGFzIGFyZ3VtZW50LCB0aGUgJ2QgYW5kICdlXG4gICAgICAgdHlwZSBwYXJhbWV0ZXJzIG9mIGZtdCBhcmUgb2J2aW91c2x5IGVxdWFscy4gVGhlIFJlYWRlciBpcyB0aGVcbiAgICAgICBvbmx5IGNvbnN0cnVjdG9yIHdoaWNoIHRvdWNoICdkIGFuZCAnZSB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIGZvcm1hdFxuICAgICAgIHR5cGUsIGl0IGFkZHMgYW4gKC0+KSB0byB0aGUgJ2QgcGFyYW1ldGVycy4gQ29uc2VxdWVudGx5LCBhIGZvcm1hdDRcbiAgICAgICBjYW5ub3QgY29udGFpbiBhIFJlYWRlciBub2RlLCBleGNlcHQgaW4gdGhlIHN1Yi1mb3JtYXQgYXNzb2NpYXRlZCB0b1xuICAgICAgIGFuICV7Li4uJX0uIEl0J3Mgbm90IGEgcHJvYmxlbSBiZWNhdXNlIG1ha2VfcHJpbnRmIGRvIG5vdCBjYWxsXG4gICAgICAgaXRzZWxmIHJlY3Vyc2l2ZWx5IG9uIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG8gJXsuLi4lfS4gKilcbiAgICBhc3NlcnQgZmFsc2VcbiAgfCBGbHVzaCByZXN0IC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX2ZsdXNoIGFjYykgcmVzdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2Nfc3RyaW5nX2xpdGVyYWwgKGFjYywgc3RyKSkgcmVzdFxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19jaGFyX2xpdGVyYWwgKGFjYywgY2hyKSkgcmVzdFxuXG4gIHwgRm9ybWF0X2FyZyAoXywgc3ViX2ZtdHR5LCByZXN0KSAtPlxuICAgIGxldCB0eSA9IHN0cmluZ19vZl9mbXR0eSBzdWJfZm10dHkgaW5cbiAgICAoZnVuIHN0ciAtPlxuICAgICAgaWdub3JlIHN0cjtcbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCB0eSkpIHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBmdW4gKEZvcm1hdCAoZm10LCBfKSkgLT4gbWFrZV9wcmludGYgayBhY2NcbiAgICAgIChjb25jYXRfZm10IChyZWNhc3QgZm10IGZtdHR5KSByZXN0KVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAoXywgXywgcmVzdCkgLT5cbiAgICBsZXQgbmV3X2FjYyA9IEFjY19pbnZhbGlkX2FyZyAoYWNjLCBcIlByaW50ZjogYmFkIGNvbnZlcnNpb24gJVtcIikgaW5cbiAgICBmdW4gXyAtPiBtYWtlX3ByaW50ZiBrIG5ld19hY2MgcmVzdFxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKF8sIHJlc3QpIC0+XG4gICAgKCogVGhpcyBjYXNlIHNob3VsZCBiZSByZWZ1c2VkIGZvciBQcmludGYuICopXG4gICAgKCogQWNjZXB0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICopXG4gICAgKCogSW50ZXJwcmV0ICVsLCAlbiBhbmQgJUwgYXMgJXUuICopXG4gICAgZnVuIG4gLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfc3RyaW5nIChhY2MsIGZvcm1hdF9pbnQgXCIldVwiIG4pIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgcmVzdFxuICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9jaGFyIChhY2MsIGMpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgcmVzdFxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICBtYWtlX2lnbm9yZWRfcGFyYW0gayBhY2MgaWduIHJlc3RcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2xpdCAoYWNjLCBmbXRpbmdfbGl0KSkgcmVzdFxuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgbGV0IGsnIGthY2MgPVxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2Zvcm1hdHRpbmdfZ2VuIChhY2MsIEFjY19vcGVuX3RhZyBrYWNjKSkgcmVzdCBpblxuICAgIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10J1xuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgbGV0IGsnIGthY2MgPVxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2Zvcm1hdHRpbmdfZ2VuIChhY2MsIEFjY19vcGVuX2JveCBrYWNjKSkgcmVzdCBpblxuICAgIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10J1xuXG4gIHwgRW5kX29mX2Zvcm1hdCAtPlxuICAgIGsgYWNjXG5cbigqIERlbGF5IHRoZSBlcnJvciAoSW52YWxpZF9hcmd1bWVudCBcIlByaW50ZjogYmFkIGNvbnZlcnNpb24gJV9cIikuICopXG4oKiBHZW5lcmF0ZSBmdW5jdGlvbnMgdG8gdGFrZSByZW1haW5pbmcgYXJndW1lbnRzIChhZnRlciB0aGUgXCIlX1wiKS4gKilcbmFuZCBtYWtlX2lnbm9yZWRfcGFyYW0gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPiBhID1cbmZ1biBrIGFjYyBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyICAgICAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX3N0cmluZyBfICAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBfICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDMyIChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKF8sIF8pICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zsb2F0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9ib29sIF8gICAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoXywgZm10dHkpIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyBmbXR0eSBmbXRcbiAgfCBJZ25vcmVkX3JlYWRlciAgICAgICAgICAgICAgICAgIC0+IGFzc2VydCBmYWxzZVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgXyAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuXG5cbigqIFNwZWNpYWwgY2FzZSBvZiBwcmludGYgXCIlXyhcIi4gKilcbmFuZCBtYWtlX2Zyb21fZm10dHkgOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBmbXR0eSAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgZm10dHkgZm10IC0+IG1hdGNoIGZtdHR5IHdpdGhcbiAgfCBDaGFyX3R5IHJlc3QgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBTdHJpbmdfdHkgcmVzdCAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBJbnQzMl90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBGbG9hdF90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBCb29sX3R5IHJlc3QgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbHBoYV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IFRoZXRhX3R5IHJlc3QgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEFueV90eSByZXN0ICAgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IFJlYWRlcl90eSBfICAgICAgICAgICAgIC0+IGFzc2VydCBmYWxzZVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IF8gICAgIC0+IGFzc2VydCBmYWxzZVxuICB8IEZvcm1hdF9hcmdfdHkgKF8sIHJlc3QpIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEVuZF9vZl9mbXR0eSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEpIHR5MiBpblxuICAgIGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyAoY29uY2F0X2ZtdHR5IHR5IHJlc3QpIGZtdFxuXG4oKiBJbnNlcnQgYW4gQWNjX2ludmFsaWRfYXJnIGluIHRoZSBhY2N1bXVsYXRvciBhbmQgY29udGludWUgdG8gZ2VuZXJhdGVcbiAgIGNsb3N1cmVzIHRvIGdldCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cy4gKilcbmFuZCBtYWtlX2ludmFsaWRfYXJnIDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgZm10IC0+XG4gIG1ha2VfcHJpbnRmIGsgKEFjY19pbnZhbGlkX2FyZyAoYWNjLCBcIlByaW50ZjogYmFkIGNvbnZlcnNpb24gJV9cIikpIGZtdFxuXG4oKiBGaXggcGFkZGluZywgdGFrZSBpdCBhcyBhbiBleHRyYSBpbnRlZ2VyIGFyZ3VtZW50IGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX3BhZGRpbmcgOiB0eXBlIHggeiBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeiAtPiBhKSBwYWRkaW5nIC0+ICh6IC0+IHN0cmluZykgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHRyYW5zIC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCB0cmFucyB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgd2lkdGgpIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfc3RyaW5nIChhY2MsIGZpeF9wYWRkaW5nIHBhZHR5IHdpZHRoICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfc3RyaW5nIChhY2MsIGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIGZtdFxuXG4oKiBGaXggcGFkZGluZyBhbmQgcHJlY2lzaW9uIGZvciBpbnQsIGludDMyLCBuYXRpdmVpbnQgb3IgaW50NjQuICopXG4oKiBUYWtlIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIDogdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeiAtPiBhKSBwcmVjaXNpb24gLT4gKGludF9jb252IC0+IHogLT4gc3RyaW5nKSAtPlxuICAgIGludF9jb252IC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCBwcmVjIHRyYW5zIGljb252IC0+IG1hdGNoIHBhZCwgcHJlYyB3aXRoXG4gIHwgTm9fcGFkZGluZywgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSB0cmFucyBpY29udiB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgcCB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG5cbigqIENvbnZlcnQgYSBmbG9hdCwgZml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBpZiBuZWVkZWQuICopXG4oKiBUYWtlIHRoZSBmbG9hdCBhcmd1bWVudCBhbmQgb25lIG9yIHR3byBleHRyYSBpbnRlZ2VyIGFyZ3VtZW50cyBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9mbG9hdF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgICh4LCB5KSBwYWRkaW5nIC0+ICh5LCBmbG9hdCAtPiBhKSBwcmVjaXNpb24gLT4gZmxvYXRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyBmY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiAoZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24gZmNvbnYpIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiAoZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24gZmNvbnYpIHggaW5cbiAgICAgIGxldCBzdHInID0gZml4X3BhZGRpbmcgcGFkdHkgdyBzdHIgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHInKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiAoZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24gZmNvbnYpIHggaW5cbiAgICAgIGxldCBzdHInID0gZml4X3BhZGRpbmcgcGFkdHkgdyBzdHIgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHInKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuYW5kIG1ha2VfY3VzdG9tIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKGEsIHgsIHkpIGN1c3RvbV9hcml0eSAtPiB4IC0+IHkgPVxuICBmdW4gayBhY2MgcmVzdCBhcml0eSBmIC0+IG1hdGNoIGFyaXR5IHdpdGhcbiAgfCBDdXN0b21femVybyAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b21fc3VjYyBhcml0eSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBtYWtlX2N1c3RvbSBrIGFjYyByZXN0IGFyaXR5IChmIHgpXG5cbmxldCBjb25zdCB4IF8gPSB4XG5cbmxldCByZWMgbWFrZV9pcHJpbnRmIDogdHlwZSBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYSA9XG4gIGZ1biBrIG8gZm10IC0+IG1hdGNoIGZtdCB3aXRoXG4gICAgfCBDaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBTdHJpbmcgKE5vX3BhZGRpbmcsIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBTdHJpbmcgKExpdF9wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBTdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IENhbWxfc3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKExpdF9wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX3N0cmluZyAoQXJnX3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgTmF0aXZlaW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBJbnQ2NCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgRmxvYXQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEJvb2wgKE5vX3BhZGRpbmcsIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBCb29sIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoQXJnX3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgQWxwaGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBUaGV0YSByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9jdXN0b21fYXJpdHkgayBvIHJlc3QgYXJpdHlcbiAgICB8IFJlYWRlciBfIC0+XG4gICAgICAgICgqIFRoaXMgY2FzZSBpcyBpbXBvc3NpYmxlLCBieSB0eXBpbmcgb2YgZm9ybWF0cy4gIFNlZSB0aGVcbiAgICAgICAgICAgbm90ZSBpbiB0aGUgY29ycmVzcG9uZGluZyBjYXNlIGZvciBtYWtlX3ByaW50Zi4gKilcbiAgICAgICAgYXNzZXJ0IGZhbHNlXG4gICAgfCBGbHVzaCByZXN0IC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgU3RyaW5nX2xpdGVyYWwgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IEZvcm1hdF9hcmcgKF8sIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBGb3JtYXRfc3Vic3QgKF8sIGZtdHR5LCByZXN0KSAtPlxuICAgICAgICBmdW4gKEZvcm1hdCAoZm10LCBfKSkgLT5cbiAgICAgICAgICBtYWtlX2lwcmludGYgayBvXG4gICAgICAgICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcbiAgICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lnbm9yZWRfcGFyYW0gKGZ1biBfIC0+IGsgbykgKEVuZF9vZl9hY2MpIGlnbiByZXN0XG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgKGZ1biBrb2MgLT4gbWFrZV9pcHJpbnRmIGsga29jIHJlc3QpIG8gZm10J1xuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICAgICAgayBvXG5hbmQgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gOlxuICB0eXBlIHggeSB6IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT4gc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeiAtPiBhKSBwcmVjaXNpb24gLT4geCA9XG4gIGZ1biBrIG8gZm10IHBhZCBwcmVjIC0+IG1hdGNoIHBhZCwgcHJlYyB3aXRoXG4gICAgfCBOb19wYWRkaW5nICAgLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTm9fcGFkZGluZyAgICwgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IExpdF9wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBMaXRfcHJlY2lzaW9uIF8gLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgQXJnX3ByZWNpc2lvbiAgIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpKVxuICAgIHwgQXJnX3BhZGRpbmcgXywgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpKVxuICAgIHwgQXJnX3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpKVxuICAgIHwgQXJnX3BhZGRpbmcgXywgQXJnX3ByZWNpc2lvbiAgIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSkpXG5hbmQgZm5fb2ZfY3VzdG9tX2FyaXR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPlxuICBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geSA9XG4gIGZ1biBrIG8gZm10IC0+IGZ1bmN0aW9uXG4gICAgfCBDdXN0b21femVybyAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIGZtdFxuICAgIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICAgICAgY29uc3QgKGZuX29mX2N1c3RvbV9hcml0eSBrIG8gZm10IGFyaXR5KVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb250aW51YXRpb25zIGZvciBtYWtlX3ByaW50ZiAqKVxuXG4oKiBSZWN1cnNpdmVseSBvdXRwdXQgYW4gXCJhY2N1bXVsYXRvclwiIGNvbnRhaW5pbmcgYSByZXZlcnNlZCBsaXN0IG9mXG4gICBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzLCAuLi4pIGluIGFuIG91dHB1dF9zdHJlYW0uICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBvdXRwdXRfYWNjIG8gYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIG91dHB1dF9hY2MgbyBwOyBvdXRwdXRfc3RyaW5nIG8gcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIG91dHB1dF9hY2MgbyBwOyBvdXRwdXRfc3RyaW5nIG8gXCJAe1wiOyBvdXRwdXRfYWNjIG8gYWNjJztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX2JveCBhY2MnKSAtPlxuICAgIG91dHB1dF9hY2MgbyBwOyBvdXRwdXRfc3RyaW5nIG8gXCJAW1wiOyBvdXRwdXRfYWNjIG8gYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IG91dHB1dF9hY2MgbyBwOyBvdXRwdXRfc3RyaW5nIG8gc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBvdXRwdXRfY2hhciBvIGNcbiAgfCBBY2NfZGVsYXkgKHAsIGYpICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGYgb1xuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgZmx1c2ggb1xuICB8IEFjY19pbnZhbGlkX2FyZyAocCwgbXNnKSAtPiBvdXRwdXRfYWNjIG8gcDsgaW52YWxpZF9hcmcgbXNnO1xuICB8IEVuZF9vZl9hY2MgICAgICAgICAgICAgICAtPiAoKVxuXG4oKiBSZWN1cnNpdmVseSBvdXRwdXQgYW4gXCJhY2N1bXVsYXRvclwiIGNvbnRhaW5pbmcgYSByZXZlcnNlZCBsaXN0IG9mXG4gICBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzLCAuLi4pIGluIGEgYnVmZmVyLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgYnVmcHV0X2FjYyBiIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBzO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAe1wiOyBidWZwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX2JveCBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQFtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBzXG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAocCwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChwLCBjKSAgICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfY2hhciBiIGNcbiAgfCBBY2NfZGVsYXkgKHAsIGYpICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7IGYgYlxuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBidWZwdXRfYWNjIGIgcDtcbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gYnVmcHV0X2FjYyBiIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIERpZmZlciBmcm9tIGJ1ZnB1dF9hY2MgYnkgdGhlIGludGVycHJldGF0aW9uIG9mICVhIGFuZCAldC4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIHN0cnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgc3RycHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIChmICgpKVxuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDtcbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gc3RycHV0X2FjYyBiIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRXJyb3IgbWFuYWdlbWVudCAqKVxuXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIHByZXR0eS1wcmludGVkIGVycm9yIG1lc3NhZ2UuICopXG5sZXQgZmFpbHdpdGhfbWVzc2FnZSAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDI1NiBpblxuICBsZXQgayBhY2MgPSBzdHJwdXRfYWNjIGJ1ZiBhY2M7IGZhaWx3aXRoIChCdWZmZXIuY29udGVudHMgYnVmKSBpblxuICBtYWtlX3ByaW50ZiBrIEVuZF9vZl9hY2MgZm10XG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0dGluZyB0b29scyAqKVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGFuIG9wZW4gYmxvY2sgZGVzY3JpcHRpb24gKGluZGVudCwgYmxvY2tfdHlwZSkgKilcbmxldCBvcGVuX2JveF9vZl9zdHJpbmcgc3RyID1cbiAgaWYgc3RyID0gXCJcIiB0aGVuICgwLCBQcF9ib3gpIGVsc2VcbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgaW52YWxpZF9ib3ggKCkgPSBmYWlsd2l0aF9tZXNzYWdlIFwiaW52YWxpZCBib3ggZGVzY3JpcHRpb24gJVNcIiBzdHIgaW5cbiAgICBsZXQgcmVjIHBhcnNlX3NwYWNlcyBpID1cbiAgICAgIGlmIGkgPSBsZW4gdGhlbiBpIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJyAnIHwgJ1xcdCcgLT4gcGFyc2Vfc3BhY2VzIChpICsgMSlcbiAgICAgICAgfCBfIC0+IGlcbiAgICBhbmQgcGFyc2VfbHdvcmQgaSBqID1cbiAgICAgIGlmIGogPSBsZW4gdGhlbiBqIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltqXSB3aXRoXG4gICAgICAgIHwgJ2EnIC4uICd6JyAtPiBwYXJzZV9sd29yZCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGpcbiAgICBhbmQgcGFyc2VfaW50IGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gcGFyc2VfaW50IGkgKGogKyAxKVxuICAgICAgICB8IF8gLT4gaiBpblxuICAgIGxldCB3c3RhcnQgPSBwYXJzZV9zcGFjZXMgMCBpblxuICAgIGxldCB3ZW5kID0gcGFyc2VfbHdvcmQgd3N0YXJ0IHdzdGFydCBpblxuICAgIGxldCBib3hfbmFtZSA9IFN0cmluZy5zdWIgc3RyIHdzdGFydCAod2VuZCAtIHdzdGFydCkgaW5cbiAgICBsZXQgbnN0YXJ0ID0gcGFyc2Vfc3BhY2VzIHdlbmQgaW5cbiAgICBsZXQgbmVuZCA9IHBhcnNlX2ludCBuc3RhcnQgbnN0YXJ0IGluXG4gICAgbGV0IGluZGVudCA9XG4gICAgICBpZiBuc3RhcnQgPSBuZW5kIHRoZW4gMCBlbHNlXG4gICAgICAgIHRyeSBpbnRfb2Zfc3RyaW5nIChTdHJpbmcuc3ViIHN0ciBuc3RhcnQgKG5lbmQgLSBuc3RhcnQpKVxuICAgICAgICB3aXRoIEZhaWx1cmUgXyAtPiBpbnZhbGlkX2JveCAoKSBpblxuICAgIGxldCBleHBfZW5kID0gcGFyc2Vfc3BhY2VzIG5lbmQgaW5cbiAgICBpZiBleHBfZW5kIDw+IGxlbiB0aGVuIGludmFsaWRfYm94ICgpO1xuICAgIGxldCBib3hfdHlwZSA9IG1hdGNoIGJveF9uYW1lIHdpdGhcbiAgICAgIHwgXCJcIiB8IFwiYlwiIC0+IFBwX2JveFxuICAgICAgfCBcImhcIiAgICAgIC0+IFBwX2hib3hcbiAgICAgIHwgXCJ2XCIgICAgICAtPiBQcF92Ym94XG4gICAgICB8IFwiaHZcIiAgICAgLT4gUHBfaHZib3hcbiAgICAgIHwgXCJob3ZcIiAgICAtPiBQcF9ob3Zib3hcbiAgICAgIHwgXyAgICAgICAgLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICAoaW5kZW50LCBib3hfdHlwZSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBQYXJzaW5nIHRvb2xzICopXG5cbigqIENyZWF0ZSBhIHBhZGRpbmdfZm10X2ViYiBmcm9tIGEgcGFkZGluZyBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwYWRkaW5nIHRvIGRpc2pvaW4gdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhcmd1bWVudCBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkZGluZ19mbXRfZWJiIDogdHlwZSB4IHkgLlxuICAgICh4LCB5KSBwYWRkaW5nIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwYWRkaW5nX2ZtdF9lYmIgPVxuZnVuIHBhZCBmbXQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nICAgICAgICAgLT4gUGFkZGluZ19mbXRfRUJCIChOb19wYWRkaW5nLCBmbXQpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZGRpbmdfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBmbXQpXG4gIHwgQXJnX3BhZGRpbmcgcyAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoQXJnX3BhZGRpbmcgcywgZm10KVxuXG4oKiBDcmVhdGUgYSBwcmVjaXNpb25fZm10X2ViYiBmcm9tIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHByZWNpc2lvbiB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3ByZWNpc2lvbl9mbXRfZWJiIDogdHlwZSB4IHkgLlxuICAgICh4LCB5KSBwcmVjaXNpb24gLT4gKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgICAgKF8sIF8sIF8sIF8sIF8pIHByZWNpc2lvbl9mbXRfZWJiID1cbmZ1biBwcmVjIGZtdCAtPiBtYXRjaCBwcmVjIHdpdGhcbiAgfCBOb19wcmVjaXNpb24gICAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKE5vX3ByZWNpc2lvbiwgZm10KVxuICB8IExpdF9wcmVjaXNpb24gcCAtPiBQcmVjaXNpb25fZm10X0VCQiAoTGl0X3ByZWNpc2lvbiBwLCBmbXQpXG4gIHwgQXJnX3ByZWNpc2lvbiAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChBcmdfcHJlY2lzaW9uLCBmbXQpXG5cbigqIENyZWF0ZSBhIHBhZHByZWNfZm10X2ViYiBmcm9tIGEgcGFkZGluZywgYSBwcmVjaXNpb24gYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyBhbmQgdGhlIHByZWNpc2lvbiB0byBkaXNqb2luIHR5cGUgcGFyYW1ldGVycyBvZiBhcmd1bWVudHNcbiAgIGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgOiB0eXBlIHggeSB6IHQgLlxuICAgICh4LCB5KSBwYWRkaW5nIC0+ICh6LCB0KSBwcmVjaXNpb24gLT5cbiAgICAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgKF8sIF8sIF8sIF8sIF8pIHBhZHByZWNfZm10X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10IC0+XG4gIGxldCBQcmVjaXNpb25fZm10X0VCQiAocHJlYywgZm10JykgPSBtYWtlX3ByZWNpc2lvbl9mbXRfZWJiIHByZWMgZm10IGluXG4gIG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZHByZWNfZm10X0VCQiAoTm9fcGFkZGluZywgcHJlYywgZm10JylcbiAgfCBMaXRfcGFkZGluZyAocywgdykgLT4gUGFkcHJlY19mbXRfRUJCIChMaXRfcGFkZGluZyAocywgdyksIHByZWMsIGZtdCcpXG4gIHwgQXJnX3BhZGRpbmcgcyAgICAgIC0+IFBhZHByZWNfZm10X0VCQiAoQXJnX3BhZGRpbmcgcywgcHJlYywgZm10JylcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0IHBhcnNpbmcgKilcblxuKCogUGFyc2UgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZm9ybWF0IGFuZCBjcmVhdGUgYSBmbXRfZWJiLiAqKVxuKCogUmFpc2UgW0ZhaWx1cmVdIGluIGNhc2Ugb2YgaW52YWxpZCBmb3JtYXQuICopXG5sZXQgZm10X2ViYl9vZl9zdHJpbmcgP2xlZ2FjeV9iZWhhdmlvciBzdHIgPVxuICAoKiBQYXJhbWV0ZXJzIG5hbWluZyBjb252ZW50aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBsaXRfc3RhcnQ6IHN0YXJ0IG9mIHRoZSBsaXRlcmFsIHNlcXVlbmNlLiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHN0cl9pbmQ6IGN1cnJlbnQgaW5kZXggaW4gdGhlIHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gZW5kX2luZDogZW5kIG9mIHRoZSBjdXJyZW50IChzdWItKWZvcm1hdC4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBwY3RfaW5kOiBpbmRleCBvZiB0aGUgJyUnIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICAgICAgKilcbiAgKCogICAtIHplcm86ICBpcyB0aGUgJzAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gbWludXM6IGlzIHRoZSAnLScgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwbHVzOiAgaXMgdGhlICcrJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIGhhc2g6ICBpcyB0aGUgJyMnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gc3BhY2U6IGlzIHRoZSAnICcgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBpZ246ICAgaXMgdGhlICdfJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHBhZDogcGFkZGluZyBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcHJlYzogcHJlY2lzaW9uIG9mIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzeW1iOiBjaGFyIHJlcHJlc2VudGluZyB0aGUgY29udmVyc2lvbiAoJ2MnLCAncycsICdkJywgLi4uKS4gKilcbiAgKCogICAtIGNoYXJfc2V0OiBzZXQgb2YgY2hhcmFjdGVycyBhcyBiaXRtYXAgKHNlZSBzY2FuZiAlWy4uLl0pLiAgICAqKVxuXG4gIGxldCBsZWdhY3lfYmVoYXZpb3IgPSBtYXRjaCBsZWdhY3lfYmVoYXZpb3Igd2l0aFxuICAgIHwgU29tZSBmbGFnIC0+IGZsYWdcbiAgICB8IE5vbmUgLT4gdHJ1ZVxuICAoKiAgV2hlbiB0aGlzIGZsYWcgaXMgZW5hYmxlZCwgdGhlIGZvcm1hdCBwYXJzZXIgdHJpZXMgdG8gYmVoYXZlIGFzXG4gICAgICB0aGUgPDQuMDIgaW1wbGVtZW50YXRpb25zLCBpbiBwYXJ0aWN1bGFyIGl0IGlnbm9yZXMgbW9zdCBiZW5pbmVcbiAgICAgIG5vbnNlbnNpY2FsIGZvcm1hdC4gV2hlbiB0aGUgZmxhZyBpcyBkaXNhYmxlZCwgaXQgd2lsbCByZWplY3QgYW55XG4gICAgICBmb3JtYXQgdGhhdCBpcyBub3QgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmljYXRpb24uXG5cbiAgICAgIEEgdHlwaWNhbCBleGFtcGxlIHdvdWxkIGJlIFwiJSsgZFwiOiBzcGVjaWZ5aW5nIGJvdGggJysnIChpZiB0aGVcbiAgICAgIG51bWJlciBpcyBwb3NpdGl2ZSwgcGFkIHdpdGggYSAnKycgdG8gZ2V0IHRoZSBzYW1lIHdpZHRoIGFzXG4gICAgICBuZWdhdGl2ZSBudW1iZXJzKSBhbmQgJyAnIChpZiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlLCBwYWQgd2l0aFxuICAgICAgYSBzcGFjZSkgZG9lcyBub3QgbWFrZSBzZW5zZSwgYnV0IHRoZSBsZWdhY3kgKDwgNC4wMilcbiAgICAgIGltcGxlbWVudGF0aW9uIHdhcyBoYXBweSB0byBqdXN0IGlnbm9yZSB0aGUgc3BhY2UuXG4gICopXG4gIGluXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlLiAqKVxuICBsZXQgaW52YWxpZF9mb3JtYXRfbWVzc2FnZSBzdHJfaW5kIG1zZyA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJXNcIlxuICAgICAgc3RyIHN0cl9pbmQgbXNnXG4gIGluXG5cbiAgKCogVXNlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCAob3IgdGhlIGN1cnJlbnQgc3ViLWZvcm1hdCkgd2FzIGVuY291bnRlcmVkXG4gICAgICB1bmV4cGVjdGVkbHkuICopXG4gIGxldCB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZCA9XG4gICAgaW52YWxpZF9mb3JtYXRfbWVzc2FnZSBlbmRfaW5kXG4gICAgICBcInVuZXhwZWN0ZWQgZW5kIG9mIGZvcm1hdFwiXG4gIGluXG5cbiAgKCogVXNlZCBmb3IgJTBjOiBubyBvdGhlciB3aWR0aHMgYXJlIGltcGxlbWVudGVkICopXG4gIGxldCBpbnZhbGlkX25vbm51bGxfY2hhcl93aWR0aCBzdHJfaW5kID1cbiAgICBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIHN0cl9pbmRcbiAgICAgIFwibm9uLXplcm8gd2lkdGhzIGFyZSB1bnN1cHBvcnRlZCBmb3IgJWMgY29udmVyc2lvbnNcIlxuICBpblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UgYWJvdXQgYW4gb3B0aW9uIGRlcGVuZGVuY3lcbiAgICAgcHJvYmxlbS4gKilcbiAgbGV0IGludmFsaWRfZm9ybWF0X3dpdGhvdXQgc3RyX2luZCBjIHMgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsICclYycgd2l0aG91dCAlc1wiXG4gICAgICBzdHIgc3RyX2luZCBjIHNcbiAgaW5cblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UgYWJvdXQgYW4gdW5leHBlY3RlZFxuICAgICBjaGFyYWN0ZXIuICopXG4gIGxldCBleHBlY3RlZF9jaGFyYWN0ZXIgc3RyX2luZCBleHBlY3RlZCByZWFkID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsICVzIGV4cGVjdGVkLCByZWFkICVDXCJcbiAgICAgIHN0ciBzdHJfaW5kIGV4cGVjdGVkIHJlYWRcbiAgaW5cblxuICAoKiBQYXJzZSB0aGUgc3RyaW5nIGZyb20gYmVnX2luZCAoaW5jbHVkZWQpIHRvIGVuZF9pbmQgKGV4Y2x1ZGVkKS4gKilcbiAgbGV0IHJlYyBwYXJzZSA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBiZWdfaW5kIGVuZF9pbmQgLT4gcGFyc2VfbGl0ZXJhbCBiZWdfaW5kIGJlZ19pbmQgZW5kX2luZFxuXG4gICgqIFJlYWQgbGl0ZXJhbCBjaGFyYWN0ZXJzIHVwIHRvICclJyBvciAnQCcgc3BlY2lhbCBjaGFyYWN0ZXJzLiAqKVxuICBhbmQgcGFyc2VfbGl0ZXJhbCA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gbGl0X3N0YXJ0IHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gYWRkX2xpdGVyYWwgbGl0X3N0YXJ0IHN0cl9pbmQgRW5kX29mX2Zvcm1hdCBlbHNlXG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2VfZm9ybWF0IHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgICBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBmbXRfcmVzdFxuICAgICAgfCAnQCcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZV9hZnRlcl9hdCAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgYWRkX2xpdGVyYWwgbGl0X3N0YXJ0IHN0cl9pbmQgZm10X3Jlc3RcbiAgICAgIHwgXyAtPlxuICAgICAgICBwYXJzZV9saXRlcmFsIGxpdF9zdGFydCAoc3RyX2luZCArIDEpIGVuZF9pbmRcblxuICAoKiBQYXJzZSBhIGZvcm1hdCBhZnRlciAnJScgKilcbiAgYW5kIHBhcnNlX2Zvcm1hdCA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIGVuZF9pbmQgLT4gcGFyc2VfaWduIHBjdF9pbmQgKHBjdF9pbmQgKyAxKSBlbmRfaW5kXG5cbiAgYW5kIHBhcnNlX2lnbiA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXycgLT4gcGFyc2VfZmxhZ3MgcGN0X2luZCAoc3RyX2luZCsxKSBlbmRfaW5kIHRydWVcbiAgICAgIHwgXyAtPiBwYXJzZV9mbGFncyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBmYWxzZVxuXG4gIGFuZCBwYXJzZV9mbGFncyA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiAoXywgXywgZSwgZikgZm10X2ViYlxuICA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBpZ24gLT5cbiAgICBsZXQgemVybyA9IHJlZiBmYWxzZSBhbmQgbWludXMgPSByZWYgZmFsc2VcbiAgICBhbmQgcGx1cyA9IHJlZiBmYWxzZSBhbmQgc3BhY2UgPSByZWYgZmFsc2VcbiAgICBhbmQgaGFzaCA9IHJlZiBmYWxzZSBpblxuICAgIGxldCBzZXRfZmxhZyBzdHJfaW5kIGZsYWcgPVxuICAgICAgKCogaW4gbGVnYWN5IG1vZGUsIGR1cGxpY2F0ZSBmbGFncyBhcmUgYWNjZXB0ZWQgKilcbiAgICAgIGlmICFmbGFnICYmIG5vdCBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgZHVwbGljYXRlIGZsYWcgJUNcIlxuICAgICAgICAgIHN0ciBzdHJfaW5kIHN0ci5bc3RyX2luZF07XG4gICAgICBmbGFnIDo9IHRydWU7XG4gICAgaW5cbiAgICBsZXQgcmVjIHJlYWRfZmxhZ3Mgc3RyX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICcwJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHplcm87ICByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJy0nIC0+IHNldF9mbGFnIHN0cl9pbmQgbWludXM7IHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnKycgLT4gc2V0X2ZsYWcgc3RyX2luZCBwbHVzOyAgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcjJyAtPiBzZXRfZmxhZyBzdHJfaW5kIGhhc2g7IHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnICcgLT4gc2V0X2ZsYWcgc3RyX2luZCBzcGFjZTsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8IF8gLT5cbiAgICAgICAgcGFyc2VfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZFxuICAgICAgICAgICF6ZXJvICFtaW51cyAhcGx1cyAhaGFzaCAhc3BhY2UgaWduXG4gICAgICBlbmRcbiAgICBpblxuICAgIHJlYWRfZmxhZ3Mgc3RyX2luZFxuXG4gICgqIFRyeSB0byByZWFkIGEgZGlnaXRhbCBvciBhICcqJyBwYWRkaW5nLiAqKVxuICBhbmQgcGFyc2VfcGFkZGluZyA6IHR5cGUgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+XG4gICAgICAgIChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIHplcm8gbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbGV0IHBhZHR5ID0gbWF0Y2ggemVybywgbWludXMgd2l0aFxuICAgICAgfCBmYWxzZSwgZmFsc2UgLT4gUmlnaHRcbiAgICAgIHwgZmFsc2UsIHRydWUgIC0+IExlZnRcbiAgICAgIHwgIHRydWUsIGZhbHNlIC0+IFplcm9zXG4gICAgICB8ICB0cnVlLCB0cnVlICAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMZWZ0XG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICctJyBcIjBcIiBpblxuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJzAnIC4uICc5JyAtPlxuICAgICAgbGV0IG5ld19pbmQsIHdpZHRoID0gcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIDAgaW5cbiAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCBuZXdfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAoTGl0X3BhZGRpbmcgKHBhZHR5LCB3aWR0aCkpXG4gICAgfCAnKicgLT5cbiAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlXG4gICAgICAgIGlnbiAoQXJnX3BhZGRpbmcgcGFkdHkpXG4gICAgfCBfIC0+XG4gICAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgICB8IExlZnQgIC0+XG4gICAgICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICAgIGludmFsaWRfZm9ybWF0X3dpdGhvdXQgKHN0cl9pbmQgLSAxKSAnLScgXCJwYWRkaW5nXCI7XG4gICAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIE5vX3BhZGRpbmdcbiAgICAgIHwgWmVyb3MgLT5cbiAgICAgICAgICgqIGEgJzAnIHBhZGRpbmcgaW5kaWNhdGlvbiBub3QgZm9sbG93ZWQgYnkgYW55dGhpbmcgc2hvdWxkXG4gICAgICAgICAgIGJlIGludGVycHJldGVkIGFzIGEgUmlnaHQgcGFkZGluZyBvZiB3aWR0aCAwLiBUaGlzIGlzIHVzZWRcbiAgICAgICAgICAgYnkgc2Nhbm5pbmcgY29udmVyc2lvbnMgJTBzIGFuZCAlMGMgKilcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgKExpdF9wYWRkaW5nIChSaWdodCwgMCkpXG4gICAgICB8IFJpZ2h0IC0+XG4gICAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIE5vX3BhZGRpbmdcbiAgICAgIGVuZFxuXG4gICgqIElzIHByZWNpc2lvbiBkZWZpbmVkPyAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfcGFkZGluZyA6IHR5cGUgeCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+XG4gICAgICAgICh4LCBfKSBwYWRkaW5nIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcuJyAtPlxuICAgICAgcGFyc2VfcHJlY2lzaW9uIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgcGFkXG4gICAgfCBzeW1iIC0+XG4gICAgICBwYXJzZV9jb252ZXJzaW9uIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkXG4gICAgICAgIE5vX3ByZWNpc2lvbiBwYWQgc3ltYlxuXG4gICgqIFJlYWQgdGhlIGRpZ2l0YWwgb3IgJyonIHByZWNpc2lvbi4gKilcbiAgYW5kIHBhcnNlX3ByZWNpc2lvbiA6IHR5cGUgeCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+XG4gICAgICAgICh4LCBfKSBwYWRkaW5nIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFyc2VfbGl0ZXJhbCBtaW51cyBzdHJfaW5kID1cbiAgICAgIGxldCBuZXdfaW5kLCBwcmVjID0gcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIDAgaW5cbiAgICAgIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiBwY3RfaW5kIG5ld19pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIHBhZCAoTGl0X3ByZWNpc2lvbiBwcmVjKSBpblxuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJzAnIC4uICc5JyAtPiBwYXJzZV9saXRlcmFsIG1pbnVzIHN0cl9pbmRcbiAgICB8ICgnKycgfCAnLScpIGFzIHN5bWIgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT5cbiAgICAgICgqIExlZ2FjeSBtb2RlIHdvdWxkIGFjY2VwdCBhbmQgaWdub3JlICcrJyBvciAnLScgYmVmb3JlIHRoZVxuICAgICAgICAgaW50ZWdlciBkZXNjcmliaW5nIHRoZSBkZXNpcmVkIHByZWNpc2lvbjsgbm90ZSB0aGF0IHRoaXNcbiAgICAgICAgIGNhbm5vdCBoYXBwZW4gZm9yIHBhZGRpbmcgd2lkdGgsIGFzICcrJyBhbmQgJy0nIGFscmVhZHkgaGF2ZVxuICAgICAgICAgYSBzZW1hbnRpY3MgdGhlcmUuXG5cbiAgICAgICAgIFRoYXQgc2FpZCwgdGhlIGlkZWEgKHN1cHBvcnRlZCBieSB0aGlzIHR3ZWFrKSB0aGF0IHdpZHRoIGFuZFxuICAgICAgICAgcHJlY2lzaW9uIGxpdGVyYWxzIGFyZSBcImludGVnZXIgbGl0ZXJhbHNcIiBpbiB0aGUgT0NhbWwgc2Vuc2UgaXNcbiAgICAgICAgIHN0aWxsIGJsYXRhbnRseSB3cm9uZywgYXMgMTIzXzQ1NiBvciAweEZGIGFyZSByZWplY3RlZC4gKilcbiAgICAgIHBhcnNlX2xpdGVyYWwgKG1pbnVzIHx8IHN5bWIgPSAnLScpIChzdHJfaW5kICsgMSlcbiAgICB8ICcqJyAtPlxuICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZVxuICAgICAgICBpZ24gcGFkIEFyZ19wcmVjaXNpb25cbiAgICB8IF8gLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICgqIG5vdGUgdGhhdCBsZWdhY3kgaW1wbGVtZW50YXRpb24gZGlkIG5vdCBpZ25vcmUgJy4nIHdpdGhvdXRcbiAgICAgICAgICAgYSBudW1iZXIgKGFzIGl0IGRvZXMgZm9yIHBhZGRpbmcgaW5kaWNhdGlvbnMpLCBidXRcbiAgICAgICAgICAgaW50ZXJwcmV0cyBpdCBhcyAnLjAnICopXG4gICAgICAgIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgcGFkIChMaXRfcHJlY2lzaW9uIDApXG4gICAgICBlbHNlXG4gICAgICAgIGludmFsaWRfZm9ybWF0X3dpdGhvdXQgKHN0cl9pbmQgLSAxKSAnLicgXCJwcmVjaXNpb25cIlxuXG4gICgqIFRyeSB0byByZWFkIHRoZSBjb252ZXJzaW9uLiAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIDogdHlwZSB4IHkgeiB0IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIHkpIHBhZGRpbmcgLT4gKHosIHQpIHByZWNpc2lvbiAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCBwcmVjIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFyc2VfY29udiAodHlwZSB1KSAodHlwZSB2KSAocGFkcHJlYyA6ICh1LCB2KSBwYWRkaW5nKSA9XG4gICAgICBwYXJzZV9jb252ZXJzaW9uIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkXG4gICAgICAgIHByZWMgcGFkcHJlYyBzdHIuW3N0cl9pbmRdIGluXG4gICAgKCogaW4gbGVnYWN5IG1vZGUsIHNvbWUgZm9ybWF0cyAoJXMgYW5kICVTKSBhY2NlcHQgYSB3ZWlyZCBtaXggb2ZcbiAgICAgICBwYWRkaW5nIGFuZCBwcmVjaXNpb24sIHdoaWNoIGlzIG1lcmdlZCBhcyBhIHNpbmdsZSBwYWRkaW5nXG4gICAgICAgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCBpbiAlLjEwcyB0aGUgcHJlY2lzaW9uIGlzIGltcGxpY2l0bHlcbiAgICAgICB1bmRlcnN0b29kIGFzIHBhZGRpbmcgJTEwcywgYnV0IHRoZSBsZWZ0LXBhZGRpbmcgY29tcG9uZW50IG1heVxuICAgICAgIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYSBsZWZ0IHBhZGRpbmcgb3IgYSBuZWdhdGl2ZSBwcmVjaXNpb246XG4gICAgICAgJS0uM3MgYW5kICUuLTNzIGFyZSBlcXVpdmFsZW50IHRvICUtM3MgKilcbiAgICBtYXRjaCBwYWQgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAtPiAoXG4gICAgICBtYXRjaCBtaW51cywgcHJlYyB3aXRoXG4gICAgICAgIHwgXywgTm9fcHJlY2lzaW9uIC0+IHBhcnNlX2NvbnYgTm9fcGFkZGluZ1xuICAgICAgICB8IGZhbHNlLCBMaXRfcHJlY2lzaW9uIG4gLT4gcGFyc2VfY29udiAoTGl0X3BhZGRpbmcgKFJpZ2h0LCBuKSlcbiAgICAgICAgfCB0cnVlLCBMaXRfcHJlY2lzaW9uIG4gLT4gcGFyc2VfY29udiAoTGl0X3BhZGRpbmcgKExlZnQsIG4pKVxuICAgICAgICB8IGZhbHNlLCBBcmdfcHJlY2lzaW9uIC0+IHBhcnNlX2NvbnYgKEFyZ19wYWRkaW5nIFJpZ2h0KVxuICAgICAgICB8IHRydWUsIEFyZ19wcmVjaXNpb24gLT4gcGFyc2VfY29udiAoQXJnX3BhZGRpbmcgTGVmdClcbiAgICApXG4gICAgfCBwYWQgLT4gcGFyc2VfY29udiBwYWRcblxuICAoKiBDYXNlIGFuYWx5c2lzIG9uIGNvbnZlcnNpb24uICopXG4gIGFuZCBwYXJzZV9jb252ZXJzaW9uIDogdHlwZSB4IHkgeiB0IHUgdiBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiAoeCwgeSkgcGFkZGluZyAtPlxuICAgICAgICAoeiwgdCkgcHJlY2lzaW9uIC0+ICh1LCB2KSBwYWRkaW5nIC0+IGNoYXIgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgcHJlYyBwYWRwcmVjIHN5bWIgLT5cbiAgICAoKiBGbGFncyB1c2VkIHRvIGNoZWNrIG9wdGlvbiB1c2FnZXMvY29tcGF0aWJpbGl0aWVzLiAqKVxuICAgIGxldCBwbHVzX3VzZWQgID0gcmVmIGZhbHNlIGFuZCBoYXNoX3VzZWQgPSByZWYgZmFsc2VcbiAgICBhbmQgc3BhY2VfdXNlZCA9IHJlZiBmYWxzZSBhbmQgaWduX3VzZWQgICA9IHJlZiBmYWxzZVxuICAgIGFuZCBwYWRfdXNlZCAgID0gcmVmIGZhbHNlIGFuZCBwcmVjX3VzZWQgID0gcmVmIGZhbHNlIGluXG5cbiAgICAoKiBBY2Nlc3MgdG8gb3B0aW9ucywgdXBkYXRlIGZsYWdzLiAqKVxuICAgIGxldCBnZXRfcGx1cyAgICAoKSA9IHBsdXNfdXNlZCAgOj0gdHJ1ZTsgcGx1c1xuICAgIGFuZCBnZXRfaGFzaCAgICgpID0gaGFzaF91c2VkIDo9IHRydWU7IGhhc2hcbiAgICBhbmQgZ2V0X3NwYWNlICAgKCkgPSBzcGFjZV91c2VkIDo9IHRydWU7IHNwYWNlXG4gICAgYW5kIGdldF9pZ24gICAgICgpID0gaWduX3VzZWQgICA6PSB0cnVlOyBpZ25cbiAgICBhbmQgZ2V0X3BhZCAgICAgKCkgPSBwYWRfdXNlZCAgIDo9IHRydWU7IHBhZFxuICAgIGFuZCBnZXRfcHJlYyAgICAoKSA9IHByZWNfdXNlZCAgOj0gdHJ1ZTsgcHJlY1xuICAgIGFuZCBnZXRfcGFkcHJlYyAoKSA9IHBhZF91c2VkICAgOj0gdHJ1ZTsgcGFkcHJlYyBpblxuXG4gICAgbGV0IGdldF9pbnRfcGFkICgpIDogKHgseSkgcGFkZGluZyA9XG4gICAgICAoKiAlNS4zZCBpcyBhY2NlcHRlZCBhbmQgbWVhbmluZ2Z1bDogcGFkIHRvIGxlbmd0aCA1IHdpdGhcbiAgICAgICAgIHNwYWNlcywgYnV0IGZpcnN0IHBhZCB3aXRoIHplcm9zIHVwdG8gbGVuZ3RoIDMgKDAtcGFkZGluZ1xuICAgICAgICAgaXMgdGhlIGludGVycHJldGF0aW9uIG9mIFwicHJlY2lzaW9uXCIgZm9yIGludGVnZXIgZm9ybWF0cykuXG5cbiAgICAgICAgICUwNS4zZCBpcyByZWR1bmRhbnQ6IHBhZCB0byBsZW5ndGggNSAqd2l0aCB6ZXJvcyosIGJ1dFxuICAgICAgICAgZmlyc3QgcGFkIHdpdGggemVyb3MuLi4gVG8gYWRkIGluc3VsdCB0byB0aGUgaW5qdXJ5LCB0aGVcbiAgICAgICAgIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSAwLXBhZGRpbmcgaW5kaWNhdGlvbiBhbmRcbiAgICAgICAgIGRvZXMgdGhlIDUgcGFkZGluZyB3aXRoIHNwYWNlcyBpbnN0ZWFkLiBXZSByZXVzZSB0aGlzXG4gICAgICAgICBpbnRlcnByZXRhdGlvbiBmb3IgY29tcGF0aWJpbGl0eSwgYnV0IHN0YXRpY2FsbHkgcmVqZWN0IHRoaXNcbiAgICAgICAgIGZvcm1hdCB3aGVuIHRoZSBsZWdhY3kgbW9kZSBpcyBkaXNhYmxlZCwgdG8gcHJvdGVjdCBzdHJpY3RcbiAgICAgICAgIHVzZXJzIGZyb20gdGhpcyBjb3JuZXIgY2FzZS4gKilcbiAgICAgICBtYXRjaCBnZXRfcGFkICgpLCBnZXRfcHJlYyAoKSB3aXRoXG4gICAgICAgICB8IHBhZCwgTm9fcHJlY2lzaW9uIC0+IHBhZFxuICAgICAgICAgfCBOb19wYWRkaW5nLCBfICAgICAtPiBOb19wYWRkaW5nXG4gICAgICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgbiksIF8gLT5cbiAgICAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gTGl0X3BhZGRpbmcgKFJpZ2h0LCBuKVxuICAgICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnMCcgXCJwcmVjaXNpb25cIlxuICAgICAgICAgfCBBcmdfcGFkZGluZyBaZXJvcywgXyAtPlxuICAgICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBBcmdfcGFkZGluZyBSaWdodFxuICAgICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnMCcgXCJwcmVjaXNpb25cIlxuICAgICAgICAgfCBMaXRfcGFkZGluZyBfIGFzIHBhZCwgXyAtPiBwYWRcbiAgICAgICAgIHwgQXJnX3BhZGRpbmcgXyBhcyBwYWQsIF8gLT4gcGFkIGluXG5cbiAgICAoKiBDaGVjayB0aGF0IHBhZHR5IDw+IFplcm9zLiAqKVxuICAgIGxldCBjaGVja19ub18wIHN5bWIgKHR5cGUgYSBiKSAocGFkIDogKGEsIGIpIHBhZGRpbmcpIDogKGEsYikgcGFkZGluZyA9XG4gICAgICBtYXRjaCBwYWQgd2l0aFxuICAgICAgfCBOb19wYWRkaW5nIC0+IHBhZFxuICAgICAgfCBMaXRfcGFkZGluZyAoKExlZnQgfCBSaWdodCksIF8pIC0+IHBhZFxuICAgICAgfCBBcmdfcGFkZGluZyAoTGVmdCB8IFJpZ2h0KSAtPiBwYWRcbiAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gTGl0X3BhZGRpbmcgKFJpZ2h0LCB3aWR0aClcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIjBcIlxuICAgICAgfCBBcmdfcGFkZGluZyBaZXJvcyAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBBcmdfcGFkZGluZyBSaWdodFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiMFwiXG4gICAgaW5cblxuICAgICgqIEdldCBwYWRkaW5nIGFzIGEgcGFkX29wdGlvbiAoc2VlIFwiJV9cIiwgXCIle1wiLCBcIiUoXCIgYW5kIFwiJVtcIikuXG4gICAgICAgKG5vIG5lZWQgZm9yIGxlZ2FjeSBtb2RlIHR3ZWFraW5nLCB0aG9zZSB3ZXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgICAgIGxlZ2FjeSBwYXJzZXIgYXMgd2VsbCkgKilcbiAgICBsZXQgb3B0X29mX3BhZCBjICh0eXBlIGEpICh0eXBlIGIpIChwYWQgOiAoYSwgYikgcGFkZGluZykgPSBtYXRjaCBwYWQgd2l0aFxuICAgICAgfCBOb19wYWRkaW5nIC0+IE5vbmVcbiAgICAgIHwgTGl0X3BhZGRpbmcgKFJpZ2h0LCB3aWR0aCkgLT4gU29tZSB3aWR0aFxuICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBTb21lIHdpZHRoXG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIGMgXCInMCdcIlxuICAgICAgfCBMaXRfcGFkZGluZyAoTGVmdCwgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIFNvbWUgd2lkdGhcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIictJ1wiXG4gICAgICB8IEFyZ19wYWRkaW5nIF8gLT4gaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIGMgXCInKidcIlxuICAgIGluXG4gICAgbGV0IGdldF9wYWRfb3B0IGMgPSBvcHRfb2ZfcGFkIGMgKGdldF9wYWQgKCkpIGluXG4gICAgbGV0IGdldF9wYWRwcmVjX29wdCBjID0gb3B0X29mX3BhZCBjIChnZXRfcGFkcHJlYyAoKSkgaW5cblxuICAgICgqIEdldCBwcmVjaXNpb24gYXMgYSBwcmVjX29wdGlvbiAoc2VlIFwiJV9mXCIpLlxuICAgICAgIChubyBuZWVkIGZvciBsZWdhY3kgbW9kZSB0d2Vha2luZywgdGhvc2Ugd2VyZSByZWplY3RlZCBieSB0aGVcbiAgICAgICBsZWdhY3kgcGFyc2VyIGFzIHdlbGwpICopXG4gICAgbGV0IGdldF9wcmVjX29wdCAoKSA9IG1hdGNoIGdldF9wcmVjICgpIHdpdGhcbiAgICAgIHwgTm9fcHJlY2lzaW9uICAgICAgIC0+IE5vbmVcbiAgICAgIHwgTGl0X3ByZWNpc2lvbiBuZGVjIC0+IFNvbWUgbmRlY1xuICAgICAgfCBBcmdfcHJlY2lzaW9uICAgICAgLT4gaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICdfJyBcIicqJ1wiXG4gICAgaW5cblxuICAgIGxldCBmbXRfcmVzdWx0ID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnLCcgLT5cbiAgICAgIHBhcnNlIHN0cl9pbmQgZW5kX2luZFxuICAgIHwgJ2MnIC0+XG4gICAgICBsZXQgY2hhcl9mb3JtYXQgZm10X3Jlc3QgPSAoKiAlYyAqKVxuICAgICAgICBpZiBnZXRfaWduICgpXG4gICAgICAgIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9jaGFyLCBmbXRfcmVzdCkpXG4gICAgICAgIGVsc2UgRm10X0VCQiAoQ2hhciBmbXRfcmVzdClcbiAgICAgIGluXG4gICAgICBsZXQgc2Nhbl9mb3JtYXQgZm10X3Jlc3QgPSAoKiAlMGMgKilcbiAgICAgICAgaWYgZ2V0X2lnbiAoKVxuICAgICAgICB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIsIGZtdF9yZXN0KSlcbiAgICAgICAgZWxzZSBGbXRfRUJCIChTY2FuX25leHRfY2hhciBmbXRfcmVzdClcbiAgICAgIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgYmVnaW4gbWF0Y2ggZ2V0X3BhZF9vcHQgJ2MnIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGNoYXJfZm9ybWF0IGZtdF9yZXN0XG4gICAgICAgIHwgU29tZSAwIC0+IHNjYW5fZm9ybWF0IGZtdF9yZXN0XG4gICAgICAgIHwgU29tZSBfbiAtPlxuICAgICAgICAgICBpZiBub3QgbGVnYWN5X2JlaGF2aW9yXG4gICAgICAgICAgIHRoZW4gaW52YWxpZF9ub25udWxsX2NoYXJfd2lkdGggc3RyX2luZFxuICAgICAgICAgICBlbHNlICgqIGxlZ2FjeSBpZ25vcmVzICVjIHdpZHRocyAqKSBjaGFyX2Zvcm1hdCBmbXRfcmVzdFxuICAgICAgZW5kXG4gICAgfCAnQycgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9jYW1sX2NoYXIsZm10X3Jlc3QpKVxuICAgICAgZWxzZSBGbXRfRUJCIChDYW1sX2NoYXIgZm10X3Jlc3QpXG4gICAgfCAncycgLT5cbiAgICAgIGxldCBwYWQgPSBjaGVja19ub18wIHN5bWIgKGdldF9wYWRwcmVjICgpKSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc3RyaW5nIChnZXRfcGFkcHJlY19vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRkaW5nX2ZtdF9FQkIgKHBhZCcsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkZGluZ19mbXRfZWJiIHBhZCBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChTdHJpbmcgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnUycgLT5cbiAgICAgIGxldCBwYWQgPSBjaGVja19ub18wIHN5bWIgKGdldF9wYWRwcmVjICgpKSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfY2FtbF9zdHJpbmcgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKENhbWxfc3RyaW5nIChwYWQnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2QnIHwgJ2knIHwgJ3gnIHwgJ1gnIHwgJ28nIHwgJ3UnIC0+XG4gICAgICBsZXQgaWNvbnYgPSBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgKGdldF9zcGFjZSAoKSkgc3ltYiBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfaW50IChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoSW50IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnTicgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgY291bnRlciA9IFRva2VuX2NvdW50ZXIgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpKVxuICAgIHwgJ2wnIHwgJ24nIHwgJ0wnIHdoZW4gc3RyX2luZD1lbmRfaW5kIHx8IG5vdCAoaXNfaW50X2Jhc2Ugc3RyLltzdHJfaW5kXSkgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgY291bnRlciA9IGNvdW50ZXJfb2ZfY2hhciBzeW1iIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgY291bnRlciBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdF9yZXN0KSlcbiAgICB8ICdsJyAtPlxuICAgICAgbGV0IGljb252ID1cbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIChzdHJfaW5kICsgMSkgKGdldF9wbHVzICgpKSAoZ2V0X2hhc2ggKCkpXG4gICAgICAgICAgKGdldF9zcGFjZSAoKSkgc3RyLltzdHJfaW5kXSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfaW50MzIgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQzMiAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ24nIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpXG4gICAgICAgICAgKGdldF9oYXNoICgpKSAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdMJyAtPlxuICAgICAgbGV0IGljb252ID1cbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIChzdHJfaW5kICsgMSkgKGdldF9wbHVzICgpKSAoZ2V0X2hhc2ggKCkpXG4gICAgICAgICAgKGdldF9zcGFjZSAoKSkgc3RyLltzdHJfaW5kXSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfaW50NjQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2YnIHwgJ2UnIHwgJ0UnIHwgJ2cnIHwgJ0cnIHwgJ0YnIHwgJ2gnIHwgJ0gnIC0+XG4gICAgICBsZXQgZmNvbnYgPVxuICAgICAgICBjb21wdXRlX2Zsb2F0X2NvbnYgcGN0X2luZCBzdHJfaW5kXG4gICAgICAgICAgKGdldF9wbHVzICgpKSAoZ2V0X2hhc2ggKCkpIChnZXRfc3BhY2UgKCkpIHN5bWIgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zsb2F0IChnZXRfcGFkX29wdCAnXycsIGdldF9wcmVjX29wdCAoKSkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoRmxvYXQgKGZjb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdiJyB8ICdCJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9ib29sIChnZXRfcGFkcHJlY19vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRkaW5nX2ZtdF9FQkIgKHBhZCcsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkZGluZ19mbXRfZWJiIHBhZCBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChCb29sIChwYWQnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2EnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoQWxwaGEgZm10X3Jlc3QpXG4gICAgfCAndCcgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChUaGV0YSBmbXRfcmVzdClcbiAgICB8ICdyJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10X3Jlc3QpKVxuICAgICAgZWxzZSBGbXRfRUJCIChSZWFkZXIgZm10X3Jlc3QpXG4gICAgfCAnIScgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChGbHVzaCBmbXRfcmVzdClcbiAgICB8ICgnJScgfCAnQCcpIGFzIGMgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKGMsIGZtdF9yZXN0KSlcbiAgICB8ICd7JyAtPlxuICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgJ30nIGluXG4gICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCBzdWJfZW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdWJfZW5kICsgMikgZW5kX2luZCBpblxuICAgICAgbGV0IHN1Yl9mbXR0eSA9IGZtdHR5X29mX2ZtdCBzdWJfZm10IGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zvcm1hdF9hcmcgKGdldF9wYWRfb3B0ICdfJywgc3ViX2ZtdHR5KSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdF9hcmcgKGdldF9wYWRfb3B0ICd7Jywgc3ViX2ZtdHR5LCBmbXRfcmVzdCkpXG4gICAgfCAnKCcgLT5cbiAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgc3RyX2luZCBlbmRfaW5kICcpJyBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3ViX2VuZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIHN1Yl9lbmQgaW5cbiAgICAgIGxldCBzdWJfZm10dHkgPSBmbXR0eV9vZl9mbXQgc3ViX2ZtdCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9mb3JtYXRfc3Vic3QgKGdldF9wYWRfb3B0ICdfJywgc3ViX2ZtdHR5KSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdF9zdWJzdCAoZ2V0X3BhZF9vcHQgJygnLCBzdWJfZm10dHksIGZtdF9yZXN0KSlcbiAgICB8ICdbJyAtPlxuICAgICAgbGV0IG5leHRfaW5kLCBjaGFyX3NldCA9IHBhcnNlX2NoYXJfc2V0IHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBuZXh0X2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgKGdldF9wYWRfb3B0ICdfJywgY2hhcl9zZXQpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9jaGFyX3NldCAoZ2V0X3BhZF9vcHQgJ1snLCBjaGFyX3NldCwgZm10X3Jlc3QpKVxuICAgIHwgJy0nIHwgJysnIHwgJyMnIHwgJyAnIHwgJ18nIC0+XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIFxcXG4gICAgICAgICBmbGFnICVDIGlzIG9ubHkgYWxsb3dlZCBhZnRlciB0aGUgJyUlJywgYmVmb3JlIHBhZGRpbmcgYW5kIHByZWNpc2lvblwiXG4gICAgICAgIHN0ciBwY3RfaW5kIHN5bWJcbiAgICB8IF8gLT5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgIGludmFsaWQgY29udmVyc2lvbiBcXFwiJSUlY1xcXCJcIiBzdHIgKHN0cl9pbmQgLSAxKSBzeW1iXG4gICAgaW5cbiAgICAoKiBDaGVjayBmb3IgdW51c2VkIG9wdGlvbnMsIGFuZCByZWplY3QgdGhlbSBhcyBpbmNvbXBhdGlibGUuXG5cbiAgICAgICBTdWNoIGNoZWNrcyBuZWVkIHRvIGJlIGRpc2FibGVkIGluIGxlZ2FjeSBtb2RlLCBhcyB0aGUgbGVnYWN5XG4gICAgICAgcGFyc2VyIHNpbGVudGx5IGlnbm9yZWQgaW5jb21wYXRpYmxlIGZsYWdzLiAqKVxuICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3IgdGhlbiBiZWdpblxuICAgIGlmIG5vdCAhcGx1c191c2VkICYmIHBsdXMgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInKydcIjtcbiAgICBpZiBub3QgIWhhc2hfdXNlZCAmJiBoYXNoIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyMnXCI7XG4gICAgaWYgbm90ICFzcGFjZV91c2VkICYmIHNwYWNlIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyAnXCI7XG4gICAgaWYgbm90ICFwYWRfdXNlZCAgJiYgUGFkZGluZ19FQkIgcGFkIDw+IFBhZGRpbmdfRUJCIE5vX3BhZGRpbmcgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCJgcGFkZGluZydcIjtcbiAgICBpZiBub3QgIXByZWNfdXNlZCAmJiBQcmVjaXNpb25fRUJCIHByZWMgPD4gUHJlY2lzaW9uX0VCQiBOb19wcmVjaXNpb24gdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIChpZiBpZ24gdGhlbiAnXycgZWxzZSBzeW1iKVxuICAgICAgICBcImBwcmVjaXNpb24nXCI7XG4gICAgaWYgaWduICYmIHBsdXMgdGhlbiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJ18nIFwiJysnXCI7XG4gICAgZW5kO1xuICAgICgqIHRoaXMgbGFzdCB0ZXN0IG11c3Qgbm90IGJlIGRpc2FibGVkIGluIGxlZ2FjeSBtb2RlLFxuICAgICAgIGFzIGlnbm9yaW5nIGl0IHdvdWxkIHR5cGljYWxseSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgdHlwaW5nXG4gICAgICAgdGhhbiB3aGF0IHRoZSBsZWdhY3kgcGFyc2VyIHVzZWQgKilcbiAgICBpZiBub3QgIWlnbl91c2VkICYmIGlnbiB0aGVuXG4gICAgICBiZWdpbiBtYXRjaCBzeW1iIHdpdGhcbiAgICAgICAgKCogYXJndW1lbnQtbGVzcyBmb3JtYXRzIGNhbiBzYWZlbHkgYmUgaWdub3JlZCBpbiBsZWdhY3kgbW9kZSAqKVxuICAgICAgICB8ICgnQCcgfCAnJScgfCAnIScgfCAnLCcpIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+ICgpXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJ18nXCJcbiAgICAgIGVuZDtcbiAgICBmbXRfcmVzdWx0XG5cbiAgKCogUGFyc2UgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiAoYWZ0ZXIgJ0AnKS4gKilcbiAgYW5kIHBhcnNlX2FmdGVyX2F0IDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gRm10X0VCQiAoQ2hhcl9saXRlcmFsICgnQCcsIEVuZF9vZl9mb3JtYXQpKVxuICAgIGVsc2VcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnWycgLT5cbiAgICAgICAgcGFyc2VfdGFnIGZhbHNlIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKENsb3NlX2JveCwgZm10X3Jlc3QpKVxuICAgICAgfCAneycgLT5cbiAgICAgICAgcGFyc2VfdGFnIHRydWUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICd9JyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQ2xvc2VfdGFnLCBmbXRfcmVzdCkpXG4gICAgICB8ICcsJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQnJlYWsgKFwiQCxcIiwgMCwgMCksIGZtdF9yZXN0KSlcbiAgICAgIHwgJyAnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChCcmVhayAoXCJAIFwiLCAxLCAwKSwgZm10X3Jlc3QpKVxuICAgICAgfCAnOycgLT5cbiAgICAgICAgcGFyc2VfZ29vZF9icmVhayAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJz8nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChGRmx1c2gsIGZtdF9yZXN0KSlcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZvcmNlX25ld2xpbmUsIGZtdF9yZXN0KSlcbiAgICAgIHwgJy4nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChGbHVzaF9uZXdsaW5lLCBmbXRfcmVzdCkpXG4gICAgICB8ICc8JyAtPlxuICAgICAgICBwYXJzZV9tYWdpY19zaXplIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnQCcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEVzY2FwZWRfYXQsIGZtdF9yZXN0KSlcbiAgICAgIHwgJyUnIHdoZW4gc3RyX2luZCArIDEgPCBlbmRfaW5kICYmIHN0ci5bc3RyX2luZCArIDFdID0gJyUnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChFc2NhcGVkX3BlcmNlbnQsIGZtdF9yZXN0KSlcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoJ0AnLCBmbXRfcmVzdCkpXG4gICAgICB8IGMgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKFNjYW5faW5kaWMgYywgZm10X3Jlc3QpKVxuXG4gICgqIFRyeSB0byByZWFkIHRoZSBvcHRpb25hbCA8bmFtZT4gYWZ0ZXIgXCJAe1wiIG9yIFwiQFtcIi4gKilcbiAgYW5kIHBhcnNlX3RhZyA6IHR5cGUgZSBmIC4gYm9vbCAtPiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGlzX29wZW5fdGFnIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIHRyeVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJzwnIC0+XG4gICAgICAgIGxldCBpbmQgPSBTdHJpbmcuaW5kZXhfZnJvbSBzdHIgKHN0cl9pbmQgKyAxKSAnPicgaW5cbiAgICAgICAgaWYgaW5kID49IGVuZF9pbmQgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgIGxldCBzdWJfc3RyID0gU3RyaW5nLnN1YiBzdHIgc3RyX2luZCAoaW5kIC0gc3RyX2luZCArIDEpIGluXG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKGluZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgKGluZCArIDEpIGluXG4gICAgICAgIGxldCBzdWJfZm9ybWF0ID0gRm9ybWF0IChzdWJfZm10LCBzdWJfc3RyKSBpblxuICAgICAgICBsZXQgZm9ybWF0dGluZyA9XG4gICAgICAgICAgaWYgaXNfb3Blbl90YWcgdGhlbiBPcGVuX3RhZyBzdWJfZm9ybWF0IGVsc2UgT3Blbl9ib3ggc3ViX2Zvcm1hdCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2dlbiAoZm9ybWF0dGluZywgZm10X3Jlc3QpKVxuICAgICAgfCBfIC0+XG4gICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IHN1Yl9mb3JtYXQgPSBGb3JtYXQgKEVuZF9vZl9mb3JtYXQsIFwiXCIpIGluXG4gICAgICBsZXQgZm9ybWF0dGluZyA9XG4gICAgICAgIGlmIGlzX29wZW5fdGFnIHRoZW4gT3Blbl90YWcgc3ViX2Zvcm1hdCBlbHNlIE9wZW5fYm94IHN1Yl9mb3JtYXQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nLCBmbXRfcmVzdCkpXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIG9wdGlvbmFsIDx3aWR0aCBvZmZzZXQ+IGFmdGVyIFwiQDtcIi4gKilcbiAgYW5kIHBhcnNlX2dvb2RfYnJlYWsgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgbGV0IG5leHRfaW5kLCBmb3JtYXR0aW5nX2xpdCA9XG4gICAgICB0cnlcbiAgICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgfHwgc3RyLltzdHJfaW5kXSA8PiAnPCcgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgIGxldCBzdHJfaW5kXzEgPSBwYXJzZV9zcGFjZXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8xXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPiAoXG4gICAgICAgICAgbGV0IHN0cl9pbmRfMiwgd2lkdGggPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMSBlbmRfaW5kIGluXG4gICAgICAgICAgICBsZXQgc3RyX2luZF8zID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfMiBlbmRfaW5kIGluXG4gICAgICAgICAgICBtYXRjaCBzdHIuW3N0cl9pbmRfM10gd2l0aFxuICAgICAgICAgICAgICB8ICc+JyAtPlxuICAgICAgICAgICAgICAgIGxldCBzID0gU3RyaW5nLnN1YiBzdHIgKHN0cl9pbmQtMikgKHN0cl9pbmRfMy1zdHJfaW5kKzMpIGluXG4gICAgICAgICAgICAgICAgc3RyX2luZF8zICsgMSwgQnJlYWsgKHMsIHdpZHRoLCAwKVxuICAgICAgICAgICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT5cbiAgICAgICAgICAgICAgICBsZXQgc3RyX2luZF80LCBvZmZzZXQgPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMyBlbmRfaW5kIGluXG4gICAgICAgICAgICAgICAgbGV0IHN0cl9pbmRfNSA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzQgZW5kX2luZCBpblxuICAgICAgICAgICAgICAgIGlmIHN0ci5bc3RyX2luZF81XSA8PiAnPicgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZC0yKSAoc3RyX2luZF81LXN0cl9pbmQrMykgaW5cbiAgICAgICAgICAgICAgICBzdHJfaW5kXzUgKyAxLCBCcmVhayAocywgd2lkdGgsIG9mZnNldClcbiAgICAgICAgICAgICAgfCBfIC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICApXG4gICAgICAgIHwgXyAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHdpdGggTm90X2ZvdW5kIHwgRmFpbHVyZSBfIC0+XG4gICAgICAgIHN0cl9pbmQsIEJyZWFrIChcIkA7XCIsIDEsIDApXG4gICAgaW5cbiAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIGZtdF9yZXN0KSlcblxuICAoKiBQYXJzZSB0aGUgc2l6ZSBpbiBhIDxuPi4gKilcbiAgYW5kIHBhcnNlX21hZ2ljX3NpemUgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgbWF0Y2hcbiAgICAgIHRyeVxuICAgICAgICBsZXQgc3RyX2luZF8xID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgICBtYXRjaCBzdHIuW3N0cl9pbmRfMV0gd2l0aFxuICAgICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT5cbiAgICAgICAgICBsZXQgc3RyX2luZF8yLCBzaXplID0gcGFyc2VfaW50ZWdlciBzdHJfaW5kXzEgZW5kX2luZCBpblxuICAgICAgICAgIGxldCBzdHJfaW5kXzMgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF8yIGVuZF9pbmQgaW5cbiAgICAgICAgICBpZiBzdHIuW3N0cl9pbmRfM10gPD4gJz4nIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICAgIGxldCBzID0gU3RyaW5nLnN1YiBzdHIgKHN0cl9pbmQgLSAyKSAoc3RyX2luZF8zIC0gc3RyX2luZCArIDMpIGluXG4gICAgICAgICAgU29tZSAoc3RyX2luZF8zICsgMSwgTWFnaWNfc2l6ZSAocywgc2l6ZSkpXG4gICAgICAgIHwgXyAtPiBOb25lXG4gICAgICB3aXRoIE5vdF9mb3VuZCB8IEZhaWx1cmUgXyAtPlxuICAgICAgICBOb25lXG4gICAgd2l0aFxuICAgIHwgU29tZSAobmV4dF9pbmQsIGZvcm1hdHRpbmdfbGl0KSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBuZXh0X2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIGZtdF9yZXN0KSlcbiAgICB8IE5vbmUgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoU2Nhbl9pbmRpYyAnPCcsIGZtdF9yZXN0KSlcblxuICAoKiBQYXJzZSBhbmQgY29uc3RydWN0IGEgY2hhciBzZXQuICopXG4gIGFuZCBwYXJzZV9jaGFyX3NldCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG5cbiAgICBsZXQgY2hhcl9zZXQgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgICBsZXQgYWRkX2NoYXIgYyA9XG4gICAgICBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYztcbiAgICBpblxuICAgIGxldCBhZGRfcmFuZ2UgYyBjJyA9XG4gICAgICBmb3IgaSA9IGludF9vZl9jaGFyIGMgdG8gaW50X29mX2NoYXIgYycgZG9cbiAgICAgICAgYWRkX2luX2NoYXJfc2V0IGNoYXJfc2V0IChjaGFyX29mX2ludCBpKTtcbiAgICAgIGRvbmU7XG4gICAgaW5cblxuICAgIGxldCBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmQgPVxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiAnJSUnIGFsb25lIGlzIG5vdCBhY2NlcHRlZCBpbiBjaGFyYWN0ZXIgc2V0cywgXFxcbiAgICAgICAgIHVzZSAlJSUlIGluc3RlYWQgYXQgcG9zaXRpb24gJWQuXCIgc3RyIHN0cl9pbmRcbiAgICBpblxuXG4gICAgKCogUGFyc2UgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGNoYXIgc2V0LiAqKVxuICAgIGxldCByZWMgcGFyc2VfY2hhcl9zZXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBsZXQgYyA9IHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAgICgqIFBhcnNlIHRoZSBjb250ZW50IG9mIGEgY2hhciBzZXQgdW50aWwgdGhlIGZpcnN0ICddJy4gKilcbiAgICBhbmQgcGFyc2VfY2hhcl9zZXRfY29udGVudCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJy0nIC0+XG4gICAgICAgIGFkZF9jaGFyICctJztcbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfY29udGVudCAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgYyAtPlxuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG5cbiAgICAoKiBUZXN0IGZvciByYW5nZSBpbiBjaGFyIHNldC4gKilcbiAgICBhbmQgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciBzdHJfaW5kIGVuZF9pbmQgYyA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnLScgLT5cbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfbWludXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcbiAgICAgIHwgKCclJyB8ICdAJykgYXMgYycgd2hlbiBjID0gJyUnIC0+XG4gICAgICAgIGFkZF9jaGFyIGMnO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCBjJyAtPlxuICAgICAgICBpZiBjID0gJyUnIHRoZW4gZmFpbF9zaW5nbGVfcGVyY2VudCBzdHJfaW5kO1xuICAgICAgICAoKiBub3RlIHRoYXQgJ0AnIGFsb25lIGlzIGFjY2VwdGVkLCBhcyBkb25lIGJ5IHRoZSBsZWdhY3lcbiAgICAgICAgICAgaW1wbGVtZW50YXRpb247IHRoZSBkb2N1bWVudGF0aW9uIHNwZWNpZmljYWxseSByZXF1aXJlcyAlQFxuICAgICAgICAgICBzbyB3ZSBjb3VsZCB3YXJuIG9uIHRoYXQgKilcbiAgICAgICAgYWRkX2NoYXIgYztcbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgYydcblxuICAgICgqIE1hbmFnZSByYW5nZSBpbiBjaGFyIHNldCAoZXhjZXB0IGlmIHRoZSAnLScgdGhlIGxhc3QgY2hhciBiZWZvcmUgJ10nKSAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9hZnRlcl9taW51cyBzdHJfaW5kIGVuZF9pbmQgYyA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBhZGRfY2hhciAnLSc7XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICclJyAtPlxuICAgICAgICBpZiBzdHJfaW5kICsgMSA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgICAgIHwgKCclJyB8ICdAJykgYXMgYycgLT5cbiAgICAgICAgICAgIGFkZF9yYW5nZSBjIGMnO1xuICAgICAgICAgICAgcGFyc2VfY2hhcl9zZXRfY29udGVudCAoc3RyX2luZCArIDIpIGVuZF9pbmRcbiAgICAgICAgICB8IF8gLT4gZmFpbF9zaW5nbGVfcGVyY2VudCBzdHJfaW5kXG4gICAgICAgIGVuZFxuICAgICAgfCBjJyAtPlxuICAgICAgICBhZGRfcmFuZ2UgYyBjJztcbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfY29udGVudCAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICBpblxuICAgIGxldCBzdHJfaW5kLCByZXZlcnNlID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgICAgfCAnXicgLT4gc3RyX2luZCArIDEsIHRydWVcbiAgICAgICAgfCBfIC0+IHN0cl9pbmQsIGZhbHNlIGluXG4gICAgbGV0IG5leHRfaW5kID0gcGFyc2VfY2hhcl9zZXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgbGV0IGNoYXJfc2V0ID0gZnJlZXplX2NoYXJfc2V0IGNoYXJfc2V0IGluXG4gICAgbmV4dF9pbmQsIChpZiByZXZlcnNlIHRoZW4gcmV2X2NoYXJfc2V0IGNoYXJfc2V0IGVsc2UgY2hhcl9zZXQpXG5cbiAgKCogQ29uc3VtZSBhbGwgbmV4dCBzcGFjZXMsIHJhaXNlIGFuIEZhaWx1cmUgaWYgZW5kX2luZCBpcyByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2Vfc3BhY2VzIHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBpZiBzdHIuW3N0cl9pbmRdID0gJyAnIHRoZW4gcGFyc2Vfc3BhY2VzIChzdHJfaW5kICsgMSkgZW5kX2luZCBlbHNlIHN0cl9pbmRcblxuICAoKiBSZWFkIGEgcG9zaXRpdmUgaW50ZWdlciBmcm9tIHRoZSBzdHJpbmcsIHJhaXNlIGEgRmFpbHVyZSBpZiBlbmRfaW5kIGlzXG4gICAgIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgYWNjID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJzAnIC4uICc5JyBhcyBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IGFjYyAqIDEwICsgKGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnMCcpIGluXG4gICAgICBpZiBuZXdfYWNjID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGludGVnZXIgJWQgaXMgZ3JlYXRlciB0aGFuIHRoZSBsaW1pdCAlZFwiXG4gICAgICAgICAgc3RyIG5ld19hY2MgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIHBhcnNlX3Bvc2l0aXZlIChzdHJfaW5kICsgMSkgZW5kX2luZCBuZXdfYWNjXG4gICAgfCBfIC0+IHN0cl9pbmQsIGFjY1xuXG4gICgqIFJlYWQgYSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbnRlZ2VyIGZyb20gdGhlIHN0cmluZywgcmFpc2UgYSBGYWlsdXJlXG4gICAgIGlmIGVuZF9pbmQgaXMgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX2ludGVnZXIgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJzAnIC4uICc5JyAtPiBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMFxuICAgIHwgJy0nIC0+IChcbiAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgfCAnMCcgLi4gJzknIC0+XG4gICAgICAgIGxldCBuZXh0X2luZCwgbiA9IHBhcnNlX3Bvc2l0aXZlIChzdHJfaW5kICsgMSkgZW5kX2luZCAwIGluXG4gICAgICAgIG5leHRfaW5kLCAtblxuICAgICAgfCBjIC0+XG4gICAgICAgIGV4cGVjdGVkX2NoYXJhY3RlciAoc3RyX2luZCArIDEpIFwiZGlnaXRcIiBjXG4gICAgKVxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBBZGQgYSBsaXRlcmFsIHRvIGEgZm9ybWF0IGZyb20gYSBsaXRlcmFsIGNoYXJhY3RlciBzdWItc2VxdWVuY2UuICopXG4gIGFuZCBhZGRfbGl0ZXJhbCA6IHR5cGUgYSBkIGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IChhLCBfLCBfLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAgIChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGxpdF9zdGFydCBzdHJfaW5kIGZtdCAtPiBtYXRjaCBzdHJfaW5kIC0gbGl0X3N0YXJ0IHdpdGhcbiAgICB8IDAgICAgLT4gRm10X0VCQiBmbXRcbiAgICB8IDEgICAgLT4gRm10X0VCQiAoQ2hhcl9saXRlcmFsIChzdHIuW2xpdF9zdGFydF0sIGZtdCkpXG4gICAgfCBzaXplIC0+IEZtdF9FQkIgKFN0cmluZ19saXRlcmFsIChTdHJpbmcuc3ViIHN0ciBsaXRfc3RhcnQgc2l6ZSwgZm10KSlcblxuICAoKiBTZWFyY2ggdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdWItZm9ybWF0XG4gICAgIChpLmUuIHRoZSBjb3JyZXNwb25kaW5nIFwiJX1cIiBvciBcIiUpXCIpICopXG4gIGFuZCBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgYyA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlblxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiB1bmNsb3NlZCBzdWItZm9ybWF0LCBcXFxuICAgICAgICAgZXhwZWN0ZWQgXFxcIiUlJWNcXFwiIGF0IGNoYXJhY3RlciBudW1iZXIgJWRcIiBzdHIgYyBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJyUnIC0+XG4gICAgICBpZiBzdHJfaW5kICsgMSA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGlmIHN0ci5bc3RyX2luZCArIDFdID0gYyB0aGVuICgqIEVuZCBvZiBmb3JtYXQgZm91bmQgKikgc3RyX2luZCBlbHNlXG4gICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDFdIHdpdGhcbiAgICAgICAgfCAnXycgLT5cbiAgICAgICAgICAoKiBTZWFyY2ggZm9yIFwiJV8oXCIgb3IgXCIlX3tcIi4gKilcbiAgICAgICAgICBpZiBzdHJfaW5kICsgMiA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAyXSB3aXRoXG4gICAgICAgICAgfCAneycgLT5cbiAgICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAzKSBlbmRfaW5kICd9JyBpblxuICAgICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgICB8ICcoJyAtPlxuICAgICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgJyknIGluXG4gICAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICAgIHwgXyAtPiBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgY1xuICAgICAgICAgIGVuZFxuICAgICAgICB8ICd7JyAtPlxuICAgICAgICAgICgqICV7Li4uJX0gc3ViLWZvcm1hdCBmb3VuZC4gKilcbiAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCAnfScgaW5cbiAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICB8ICcoJyAtPlxuICAgICAgICAgICgqICUoLi4uJSkgc3ViLWZvcm1hdCBmb3VuZC4gKilcbiAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCAnKScgaW5cbiAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICB8ICd9JyAtPlxuICAgICAgICAgICgqIEVycm9yOiAlKC4uLiV9LiAqKVxuICAgICAgICAgIGV4cGVjdGVkX2NoYXJhY3RlciAoc3RyX2luZCArIDEpIFwiY2hhcmFjdGVyICcpJ1wiICd9J1xuICAgICAgICB8ICcpJyAtPlxuICAgICAgICAgICgqIEVycm9yOiAley4uLiUpLiAqKVxuICAgICAgICAgIGV4cGVjdGVkX2NoYXJhY3RlciAoc3RyX2luZCArIDEpIFwiY2hhcmFjdGVyICd9J1wiICcpJ1xuICAgICAgICB8IF8gLT5cbiAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICBlbmRcbiAgICB8IF8gLT4gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAoKiBDaGVjayBpZiBzeW1iIGlzIGEgdmFsaWQgaW50IGNvbnZlcnNpb24gYWZ0ZXIgXCIlbFwiLCBcIiVuXCIgb3IgXCIlTFwiICopXG4gIGFuZCBpc19pbnRfYmFzZSBzeW1iID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnZCcgfCAnaScgfCAneCcgfCAnWCcgfCAnbycgfCAndScgLT4gdHJ1ZVxuICAgIHwgXyAtPiBmYWxzZVxuXG4gICgqIENvbnZlcnQgYSBjaGFyIChsLCBuIG9yIEwpIHRvIGl0cyBhc3NvY2lhdGVkIGNvdW50ZXIuICopXG4gIGFuZCBjb3VudGVyX29mX2NoYXIgc3ltYiA9IG1hdGNoIHN5bWIgd2l0aFxuICAgIHwgJ2wnIC0+IExpbmVfY291bnRlciAgfCAnbicgLT4gQ2hhcl9jb3VudGVyXG4gICAgfCAnTCcgLT4gVG9rZW5fY291bnRlciB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgKCogQ29udmVydCAocGx1cywgc3ltYikgdG8gaXRzIGFzc29jaWF0ZWQgaW50X2NvbnYuICopXG4gIGFuZCBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggc3BhY2Ugc3ltYiA9XG4gICAgbWF0Y2ggcGx1cywgaGFzaCwgc3BhY2UsIHN5bWIgd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ2QnIC0+IEludF9kICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdpJyAtPiBJbnRfaVxuICAgIHwgZmFsc2UsIGZhbHNlLCAgdHJ1ZSwgJ2QnIC0+IEludF9zZCB8IGZhbHNlLCBmYWxzZSwgIHRydWUsICdpJyAtPiBJbnRfc2lcbiAgICB8ICB0cnVlLCBmYWxzZSwgZmFsc2UsICdkJyAtPiBJbnRfcGQgfCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAnaScgLT4gSW50X3BpXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAneCcgLT4gSW50X3ggIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ1gnIC0+IEludF9YXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAneCcgLT4gSW50X0N4IHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ1gnIC0+IEludF9DWFxuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ28nIC0+IEludF9vXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnbycgLT4gSW50X0NvXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAndScgLT4gSW50X3VcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdkJyAtPiBJbnRfQ2RcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdpJyAtPiBJbnRfQ2lcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICd1JyAtPiBJbnRfQ3VcbiAgICB8IF8sIHRydWUsIF8sICd4JyB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPiBJbnRfQ3hcbiAgICB8IF8sIHRydWUsIF8sICdYJyB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPiBJbnRfQ1hcbiAgICB8IF8sIHRydWUsIF8sICdvJyB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPiBJbnRfQ29cbiAgICB8IF8sIHRydWUsIF8sICgnZCcgfCAnaScgfCAndScpIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBmYWxzZSBzcGFjZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyMnXCJcbiAgICB8IHRydWUsIF8sIHRydWUsIF8gLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICgqIHBsdXMgYW5kIHNwYWNlOiBsZWdhY3kgaW1wbGVtZW50YXRpb24gcHJlZmVycyBwbHVzICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBmYWxzZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnICcgXCInKydcIlxuICAgIHwgZmFsc2UsIF8sIHRydWUsIF8gICAgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggZmFsc2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicgJ1wiXG4gICAgfCB0cnVlLCBfLCBmYWxzZSwgXyAgICAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIGZhbHNlIGhhc2ggc3BhY2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicrJ1wiXG4gICAgfCBmYWxzZSwgXywgZmFsc2UsIF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgKCogQ29udmVydCAocGx1cywgc3BhY2UsIHN5bWIpIHRvIGl0cyBhc3NvY2lhdGVkIGZsb2F0X2NvbnYuICopXG4gIGFuZCBjb21wdXRlX2Zsb2F0X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBzcGFjZSBzeW1iID1cbiAgICBsZXQgZmxhZyA9IG1hdGNoIHBsdXMsIHNwYWNlIHdpdGhcbiAgICB8IGZhbHNlLCBmYWxzZSAtPiBGbG9hdF9mbGFnX1xuICAgIHwgZmFsc2UsICB0cnVlIC0+IEZsb2F0X2ZsYWdfc1xuICAgIHwgIHRydWUsIGZhbHNlIC0+IEZsb2F0X2ZsYWdfcFxuICAgIHwgIHRydWUsICB0cnVlIC0+XG4gICAgICAoKiBwbHVzIGFuZCBzcGFjZTogbGVnYWN5IGltcGxlbWVudGF0aW9uIHByZWZlcnMgcGx1cyAqKVxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gRmxvYXRfZmxhZ19wXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnICcgXCInKydcIiBpblxuICAgIGxldCBraW5kID0gbWF0Y2ggaGFzaCwgc3ltYiB3aXRoXG4gICAgfCBfLCAnZicgLT4gRmxvYXRfZlxuICAgIHwgXywgJ2UnIC0+IEZsb2F0X2VcbiAgICB8IF8sICdFJyAtPiBGbG9hdF9FXG4gICAgfCBfLCAnZycgLT4gRmxvYXRfZ1xuICAgIHwgXywgJ0cnIC0+IEZsb2F0X0dcbiAgICB8IF8sICdoJyAtPiBGbG9hdF9oXG4gICAgfCBfLCAnSCcgLT4gRmxvYXRfSFxuICAgIHwgZmFsc2UsICdGJyAtPiBGbG9hdF9GXG4gICAgfCB0cnVlLCAnRicgLT4gRmxvYXRfQ0ZcbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIGluXG4gICAgZmxhZywga2luZFxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBpbmNvbXBhdGlibGUgb3B0aW9ucy4qKVxuICBhbmQgaW5jb21wYXRpYmxlX2ZsYWcgOiB0eXBlIGEgLiBpbnQgLT4gaW50IC0+IGNoYXIgLT4gc3RyaW5nIC0+IGEgPVxuICAgIGZ1biBwY3RfaW5kIHN0cl9pbmQgc3ltYiBvcHRpb24gLT5cbiAgICAgIGxldCBzdWJmbXQgPSBTdHJpbmcuc3ViIHN0ciBwY3RfaW5kIChzdHJfaW5kIC0gcGN0X2luZCkgaW5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgICVzIGlzIGluY29tcGF0aWJsZSB3aXRoICclYycgaW4gc3ViLWZvcm1hdCAlU1wiXG4gICAgICAgIHN0ciBwY3RfaW5kIG9wdGlvbiBzeW1iIHN1YmZtdFxuXG4gIGluIHBhcnNlIDAgKFN0cmluZy5sZW5ndGggc3RyKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgKCogR3VhcmRlZCBzdHJpbmcgdG8gZm9ybWF0IGNvbnZlcnNpb25zICopXG5cbigqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIHR5cGUgbWlzbWF0Y2guICopXG5sZXQgZm9ybWF0X29mX3N0cmluZ19mbXR0eSBzdHIgZm10dHkgPVxuICBsZXQgRm10X0VCQiBmbXQgPSBmbXRfZWJiX29mX3N0cmluZyBzdHIgaW5cbiAgdHJ5IEZvcm1hdCAodHlwZV9mb3JtYXQgZm10IGZtdHR5LCBzdHIpXG4gIHdpdGggVHlwZV9taXNtYXRjaCAtPlxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiYmFkIGlucHV0OiBmb3JtYXQgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICVTIGFuZCAlU1wiXG4gICAgICBzdHIgKHN0cmluZ19vZl9mbXR0eSBmbXR0eSlcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggYW4gb3RoZXIgZm9ybWF0LiAqKVxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIHR5cGUgbWlzbWF0Y2guICopXG5sZXQgZm9ybWF0X29mX3N0cmluZ19mb3JtYXQgc3RyIChGb3JtYXQgKGZtdCcsIHN0cicpKSA9XG4gIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHN0ciBpblxuICB0cnkgRm9ybWF0ICh0eXBlX2Zvcm1hdCBmbXQgKGZtdHR5X29mX2ZtdCBmbXQnKSwgc3RyKVxuICB3aXRoIFR5cGVfbWlzbWF0Y2ggLT5cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImJhZCBpbnB1dDogZm9ybWF0IHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiAlUyBhbmQgJVNcIiBzdHIgc3RyJ1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBYYXZpZXIgTGVyb3kgYW5kIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxubGV0IGtmcHJpbnRmIGsgbyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgbyBhY2M7IGsgbykgRW5kX29mX2FjYyBmbXRcbmxldCBrYnByaW50ZiBrIGIgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBidWZwdXRfYWNjIGIgYWNjOyBrIGIpIEVuZF9vZl9hY2MgZm10XG5sZXQgaWtmcHJpbnRmIGsgb2MgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBvYyBmbXRcbmxldCBpa2JwcmludGYgPSBpa2ZwcmludGZcblxubGV0IGZwcmludGYgb2MgZm10ID0ga2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGJwcmludGYgYiBmbXQgPSBrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBpZnByaW50ZiBvYyBmbXQgPSBpa2ZwcmludGYgaWdub3JlIG9jIGZtdFxubGV0IGlicHJpbnRmIGIgZm10ID0gaWticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IHByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZG91dCBmbXRcbmxldCBlcHJpbnRmIGZtdCA9IGZwcmludGYgc3RkZXJyIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBrJyBhY2MgPVxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDY0IGluXG4gICAgc3RycHV0X2FjYyBidWYgYWNjO1xuICAgIGsgKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsnIEVuZF9vZl9hY2MgZm10XG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAtPiBzKSBmbXRcblxubGV0IGtwcmludGYgPSBrc3ByaW50ZlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGtleSA9IHN0cmluZ1xudHlwZSBkb2MgPSBzdHJpbmdcbnR5cGUgdXNhZ2VfbXNnID0gc3RyaW5nXG50eXBlIGFub25fZnVuID0gKHN0cmluZyAtPiB1bml0KVxuXG50eXBlIHNwZWMgPVxuICB8IFVuaXQgb2YgKHVuaXQgLT4gdW5pdCkgICAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdW5pdCBhcmd1bWVudCAqKVxuICB8IEJvb2wgb2YgKGJvb2wgLT4gdW5pdCkgICAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBib29sIGFyZ3VtZW50ICopXG4gIHwgU2V0IG9mIGJvb2wgcmVmICAgICAgICAgICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gdHJ1ZSAqKVxuICB8IENsZWFyIG9mIGJvb2wgcmVmICAgICAgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIGZhbHNlICopXG4gIHwgU3RyaW5nIG9mIChzdHJpbmcgLT4gdW5pdCkgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIHN0cmluZyBhcmd1bWVudCAqKVxuICB8IFNldF9zdHJpbmcgb2Ygc3RyaW5nIHJlZiAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBzdHJpbmcgYXJndW1lbnQgKilcbiAgfCBJbnQgb2YgKGludCAtPiB1bml0KSAgICAgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGFuIGludCBhcmd1bWVudCAqKVxuICB8IFNldF9pbnQgb2YgaW50IHJlZiAgICAgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbnQgYXJndW1lbnQgKilcbiAgfCBGbG9hdCBvZiAoZmxvYXQgLT4gdW5pdCkgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGEgZmxvYXQgYXJndW1lbnQgKilcbiAgfCBTZXRfZmxvYXQgb2YgZmxvYXQgcmVmICAgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmxvYXQgYXJndW1lbnQgKilcbiAgfCBUdXBsZSBvZiBzcGVjIGxpc3QgICAgICAgICAoKiBUYWtlIHNldmVyYWwgYXJndW1lbnRzIGFjY29yZGluZyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjIGxpc3QgKilcbiAgfCBTeW1ib2wgb2Ygc3RyaW5nIGxpc3QgKiAoc3RyaW5nIC0+IHVuaXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVGFrZSBvbmUgb2YgdGhlIHN5bWJvbHMgYXMgYXJndW1lbnQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc3ltYm9sLiAqKVxuICB8IFJlc3Qgb2YgKHN0cmluZyAtPiB1bml0KSAgICgqIFN0b3AgaW50ZXJwcmV0aW5nIGtleXdvcmRzIGFuZCBjYWxsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggZWFjaCByZW1haW5pbmcgYXJndW1lbnQgKilcbiAgfCBSZXN0X2FsbCBvZiAoc3RyaW5nIGxpc3QgLT4gdW5pdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBTdG9wIGludGVycHJldGluZyBrZXl3b3JkcyBhbmQgY2FsbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aXRoIGFsbCByZW1haW5pbmcgYXJndW1lbnRzLiAqKVxuICB8IEV4cGFuZCBvZiAoc3RyaW5nIC0+IHN0cmluZyBhcnJheSkgKCogSWYgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgdG8gcHJvY2Vzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG9mIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW1wiLWZvb1wiOyBcImFyZ1wiXSBAIHJlc3RdIHdoZXJlIFwiZm9vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJlZ2lzdGVyZWQgYXMgW0V4cGFuZCBmXSwgdGhlbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyBbZiBcImFyZ1wiIEAgcmVzdF0gYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuIE9ubHkgYWxsb3dlZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljXS4gKilcblxuZXhjZXB0aW9uIEJhZCBvZiBzdHJpbmdcbmV4Y2VwdGlvbiBIZWxwIG9mIHN0cmluZ1xuXG50eXBlIGVycm9yID1cbiAgfCBVbmtub3duIG9mIHN0cmluZ1xuICB8IFdyb25nIG9mIHN0cmluZyAqIHN0cmluZyAqIHN0cmluZyAgKCogb3B0aW9uLCBhY3R1YWwsIGV4cGVjdGVkICopXG4gIHwgTWlzc2luZyBvZiBzdHJpbmdcbiAgfCBNZXNzYWdlIG9mIHN0cmluZ1xuXG5leGNlcHRpb24gU3RvcCBvZiBlcnJvciAoKiB1c2VkIGludGVybmFsbHkgKilcblxub3BlbiBQcmludGZcblxubGV0IHJlYyBhc3NvYzMgeCBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgKHkxLCB5MiwgXykgOjogXyB3aGVuIHkxID0geCAtPiB5MlxuICB8IF8gOjogdCAtPiBhc3NvYzMgeCB0XG5cblxubGV0IHNwbGl0IHMgPVxuICBsZXQgaSA9IFN0cmluZy5pbmRleCBzICc9JyBpblxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIFN0cmluZy5zdWIgcyAwIGksIFN0cmluZy5zdWIgcyAoaSsxKSAobGVuLShpKzEpKVxuXG5cbmxldCBtYWtlX3N5bWxpc3QgcHJlZml4IHNlcCBzdWZmaXggbCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFwiPG5vbmU+XCJcbiAgfCBoOjp0IC0+IChMaXN0LmZvbGRfbGVmdCAoZnVuIHggeSAtPiB4IF4gc2VwIF4geSkgKHByZWZpeCBeIGgpIHQpIF4gc3VmZml4XG5cblxubGV0IHByaW50X3NwZWMgYnVmIChrZXksIHNwZWMsIGRvYykgPVxuICBpZiBTdHJpbmcubGVuZ3RoIGRvYyA+IDAgdGhlblxuICAgIG1hdGNoIHNwZWMgd2l0aFxuICAgIHwgU3ltYm9sIChsLCBfKSAtPlxuICAgICAgICBicHJpbnRmIGJ1ZiBcIiAgJXMgJXMlc1xcblwiIGtleSAobWFrZV9zeW1saXN0IFwie1wiIFwifFwiIFwifVwiIGwpIGRvY1xuICAgIHwgXyAtPlxuICAgICAgICBicHJpbnRmIGJ1ZiBcIiAgJXMgJXNcXG5cIiBrZXkgZG9jXG5cblxubGV0IGhlbHBfYWN0aW9uICgpID0gcmFpc2UgKFN0b3AgKFVua25vd24gXCItaGVscFwiKSlcblxubGV0IGFkZF9oZWxwIHNwZWNsaXN0ID1cbiAgbGV0IGFkZDEgPVxuICAgIHRyeSBpZ25vcmUgKGFzc29jMyBcIi1oZWxwXCIgc3BlY2xpc3QpOyBbXVxuICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgICAgICBbXCItaGVscFwiLCBVbml0IGhlbHBfYWN0aW9uLCBcIiBEaXNwbGF5IHRoaXMgbGlzdCBvZiBvcHRpb25zXCJdXG4gIGFuZCBhZGQyID1cbiAgICB0cnkgaWdub3JlIChhc3NvYzMgXCItLWhlbHBcIiBzcGVjbGlzdCk7IFtdXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICAgIFtcIi0taGVscFwiLCBVbml0IGhlbHBfYWN0aW9uLCBcIiBEaXNwbGF5IHRoaXMgbGlzdCBvZiBvcHRpb25zXCJdXG4gIGluXG4gIHNwZWNsaXN0IEAgKGFkZDEgQCBhZGQyKVxuXG5cbmxldCB1c2FnZV9iIGJ1ZiBzcGVjbGlzdCBlcnJtc2cgPVxuICBicHJpbnRmIGJ1ZiBcIiVzXFxuXCIgZXJybXNnO1xuICBMaXN0Lml0ZXIgKHByaW50X3NwZWMgYnVmKSAoYWRkX2hlbHAgc3BlY2xpc3QpXG5cblxubGV0IHVzYWdlX3N0cmluZyBzcGVjbGlzdCBlcnJtc2cgPVxuICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgMjAwIGluXG4gIHVzYWdlX2IgYiBzcGVjbGlzdCBlcnJtc2c7XG4gIEJ1ZmZlci5jb250ZW50cyBiXG5cblxubGV0IHVzYWdlIHNwZWNsaXN0IGVycm1zZyA9XG4gIGVwcmludGYgXCIlc1wiICh1c2FnZV9zdHJpbmcgc3BlY2xpc3QgZXJybXNnKVxuXG5cbmxldCBjdXJyZW50ID0gcmVmIDBcblxubGV0IGJvb2xfb2Zfc3RyaW5nX29wdCB4ID1cbiAgdHJ5IFNvbWUgKGJvb2xfb2Zfc3RyaW5nIHgpXG4gIHdpdGggSW52YWxpZF9hcmd1bWVudCBfIC0+IE5vbmVcblxubGV0IGludF9vZl9zdHJpbmdfb3B0IHggPVxuICB0cnkgU29tZSAoaW50X29mX3N0cmluZyB4KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmbG9hdF9vZl9zdHJpbmdfb3B0IHggPVxuICB0cnkgU29tZSAoZmxvYXRfb2Zfc3RyaW5nIHgpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxubGV0IHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljX2F1eCBhbGxvd19leHBhbmQgY3VycmVudCBhcmd2IHNwZWNsaXN0IGFub25mdW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnID1cbiAgbGV0IGluaXRwb3MgPSAhY3VycmVudCBpblxuICBsZXQgY29udmVydF9lcnJvciBlcnJvciA9XG4gICAgKCogY29udmVydCBhbiBpbnRlcm5hbCBlcnJvciB0byBhIEJhZC9IZWxwIGV4Y2VwdGlvblxuICAgICAgICpvciogYWRkIHRoZSBwcm9ncmFtIG5hbWUgYXMgYSBwcmVmaXggYW5kIHRoZSB1c2FnZSBtZXNzYWdlIGFzIGEgc3VmZml4XG4gICAgICAgdG8gYW4gdXNlci1yYWlzZWQgQmFkIGV4Y2VwdGlvbi5cbiAgICAqKVxuICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAyMDAgaW5cbiAgICBsZXQgcHJvZ25hbWUgPVxuICAgICAgaWYgaW5pdHBvcyA8IChBcnJheS5sZW5ndGggIWFyZ3YpIHRoZW4gIWFyZ3YuKGluaXRwb3MpIGVsc2UgXCIoPylcIiBpblxuICAgIGJlZ2luIG1hdGNoIGVycm9yIHdpdGhcbiAgICAgIHwgVW5rbm93biBcIi1oZWxwXCIgLT4gKClcbiAgICAgIHwgVW5rbm93biBcIi0taGVscFwiIC0+ICgpXG4gICAgICB8IFVua25vd24gcyAtPlxuICAgICAgICAgIGJwcmludGYgYiBcIiVzOiB1bmtub3duIG9wdGlvbiAnJXMnLlxcblwiIHByb2duYW1lIHNcbiAgICAgIHwgTWlzc2luZyBzIC0+XG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6IG9wdGlvbiAnJXMnIG5lZWRzIGFuIGFyZ3VtZW50LlxcblwiIHByb2duYW1lIHNcbiAgICAgIHwgV3JvbmcgKG9wdCwgYXJnLCBleHBlY3RlZCkgLT5cbiAgICAgICAgICBicHJpbnRmIGIgXCIlczogd3JvbmcgYXJndW1lbnQgJyVzJzsgb3B0aW9uICclcycgZXhwZWN0cyAlcy5cXG5cIlxuICAgICAgICAgICAgICAgICAgcHJvZ25hbWUgYXJnIG9wdCBleHBlY3RlZFxuICAgICAgfCBNZXNzYWdlIHMgLT4gKCogdXNlciBlcnJvciBtZXNzYWdlICopXG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6ICVzLlxcblwiIHByb2duYW1lIHNcbiAgICBlbmQ7XG4gICAgdXNhZ2VfYiBiICFzcGVjbGlzdCBlcnJtc2c7XG4gICAgaWYgZXJyb3IgPSBVbmtub3duIFwiLWhlbHBcIiB8fCBlcnJvciA9IFVua25vd24gXCItLWhlbHBcIlxuICAgIHRoZW4gSGVscCAoQnVmZmVyLmNvbnRlbnRzIGIpXG4gICAgZWxzZSBCYWQgKEJ1ZmZlci5jb250ZW50cyBiKVxuICBpblxuICBpbmNyIGN1cnJlbnQ7XG4gIHdoaWxlICFjdXJyZW50IDwgKEFycmF5Lmxlbmd0aCAhYXJndikgZG9cbiAgICBiZWdpbiB0cnlcbiAgICAgIGxldCBzID0gIWFyZ3YuKCFjdXJyZW50KSBpblxuICAgICAgaWYgU3RyaW5nLmxlbmd0aCBzID49IDEgJiYgcy5bMF0gPSAnLScgdGhlbiBiZWdpblxuICAgICAgICBsZXQgYWN0aW9uLCBmb2xsb3cgPVxuICAgICAgICAgIHRyeSBhc3NvYzMgcyAhc3BlY2xpc3QsIE5vbmVcbiAgICAgICAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICAgIHRyeVxuICAgICAgICAgICAgbGV0IGtleXdvcmQsIGFyZyA9IHNwbGl0IHMgaW5cbiAgICAgICAgICAgIGFzc29jMyBrZXl3b3JkICFzcGVjbGlzdCwgU29tZSBhcmdcbiAgICAgICAgICB3aXRoIE5vdF9mb3VuZCAtPiByYWlzZSAoU3RvcCAoVW5rbm93biBzKSlcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5vX2FyZyAoKSA9XG4gICAgICAgICAgbWF0Y2ggZm9sbG93IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgYXJnIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcIm5vIGFyZ3VtZW50XCIpKSkgaW5cbiAgICAgICAgbGV0IGdldF9hcmcgKCkgPVxuICAgICAgICAgIG1hdGNoIGZvbGxvdyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgIGlmICFjdXJyZW50ICsgMSA8IChBcnJheS5sZW5ndGggIWFyZ3YpIHRoZW4gIWFyZ3YuKCFjdXJyZW50ICsgMSlcbiAgICAgICAgICAgICAgZWxzZSByYWlzZSAoU3RvcCAoTWlzc2luZyBzKSlcbiAgICAgICAgICB8IFNvbWUgYXJnIC0+IGFyZ1xuICAgICAgICBpblxuICAgICAgICBsZXQgY29uc3VtZV9hcmcgKCkgPVxuICAgICAgICAgIG1hdGNoIGZvbGxvdyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGluY3IgY3VycmVudFxuICAgICAgICAgIHwgU29tZSBfIC0+ICgpXG4gICAgICAgIGluXG4gICAgICAgIGxldCByZWMgdHJlYXRfYWN0aW9uID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbml0IGYgLT4gbm9fYXJnICgpOyBmICgpO1xuICAgICAgICB8IEJvb2wgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGJvb2xfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImEgYm9vbGVhblwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgcyAtPiBmIHNcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFNldCByIC0+IG5vX2FyZyAoKTsgciA6PSB0cnVlO1xuICAgICAgICB8IENsZWFyIHIgLT4gbm9fYXJnICgpOyByIDo9IGZhbHNlO1xuICAgICAgICB8IFN0cmluZyBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgZiBhcmc7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBTeW1ib2wgKHN5bWIsIGYpIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgaWYgTGlzdC5tZW0gYXJnIHN5bWIgdGhlbiBiZWdpblxuICAgICAgICAgICAgICBmIGFyZztcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgICByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJvbmUgb2Y6IFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIChtYWtlX3N5bWxpc3QgXCJcIiBcIiBcIiBcIlwiIHN5bWIpKSkpXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfCBTZXRfc3RyaW5nIHIgLT5cbiAgICAgICAgICAgIHIgOj0gZ2V0X2FyZyAoKTtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IEludCBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggaW50X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhbiBpbnRlZ2VyXCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IGYgeFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU2V0X2ludCByIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggaW50X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhbiBpbnRlZ2VyXCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IHIgOj0geFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgRmxvYXQgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGZsb2F0X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhIGZsb2F0XCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IGYgeFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU2V0X2Zsb2F0IHIgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYSBmbG9hdFwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgeCAtPiByIDo9IHhcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFR1cGxlIHNwZWNzIC0+XG4gICAgICAgICAgICBub19hcmcgKCk7XG4gICAgICAgICAgICBMaXN0Lml0ZXIgdHJlYXRfYWN0aW9uIHNwZWNzO1xuICAgICAgICB8IFJlc3QgZiAtPlxuICAgICAgICAgICAgbm9fYXJnICgpO1xuICAgICAgICAgICAgd2hpbGUgIWN1cnJlbnQgPCAoQXJyYXkubGVuZ3RoICFhcmd2KSAtIDEgZG9cbiAgICAgICAgICAgICAgZiAhYXJndi4oIWN1cnJlbnQgKyAxKTtcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBkb25lO1xuICAgICAgICB8IFJlc3RfYWxsIGYgLT5cbiAgICAgICAgICAgIG5vX2FyZyAoKTtcbiAgICAgICAgICAgIGxldCBhY2MgPSByZWYgW10gaW5cbiAgICAgICAgICAgIHdoaWxlICFjdXJyZW50IDwgQXJyYXkubGVuZ3RoICFhcmd2IC0gMSBkb1xuICAgICAgICAgICAgICBhY2MgOj0gIWFyZ3YuKCFjdXJyZW50ICsgMSkgOjogIWFjYztcbiAgICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBkb25lO1xuICAgICAgICAgICAgZiAoTGlzdC5yZXYgIWFjYylcbiAgICAgICAgfCBFeHBhbmQgZiAtPlxuICAgICAgICAgICAgaWYgbm90IGFsbG93X2V4cGFuZCB0aGVuXG4gICAgICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiQXJnLkV4cGFuZCBpcyBpcyBvbmx5IGFsbG93ZWQgd2l0aCBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnLnBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljXCIpO1xuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGxldCBuZXdhcmcgPSBmIGFyZyBpblxuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gQXJyYXkuc3ViICFhcmd2IDAgKCFjdXJyZW50ICsgMSlcbiAgICAgICAgICAgIGFuZCBhZnRlciA9XG4gICAgICAgICAgICAgIEFycmF5LnN1YiAhYXJndiAoIWN1cnJlbnQgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKChBcnJheS5sZW5ndGggIWFyZ3YpIC0gIWN1cnJlbnQgLSAxKSBpblxuICAgICAgICAgICAgYXJndjo9IEFycmF5LmNvbmNhdCBbYmVmb3JlO25ld2FyZzthZnRlcl07XG4gICAgICAgIGluXG4gICAgICAgIHRyZWF0X2FjdGlvbiBhY3Rpb24gZW5kXG4gICAgICBlbHNlIGFub25mdW4gc1xuICAgIHdpdGggfCBCYWQgbSAtPiByYWlzZSAoY29udmVydF9lcnJvciAoTWVzc2FnZSBtKSk7XG4gICAgICAgICB8IFN0b3AgZSAtPiByYWlzZSAoY29udmVydF9lcnJvciBlKTtcbiAgICBlbmQ7XG4gICAgaW5jciBjdXJyZW50XG4gIGRvbmVcblxubGV0IHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljIGN1cnJlbnQgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZyA9XG4gIHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljX2F1eCB0cnVlIGN1cnJlbnQgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZ1xuXG5sZXQgcGFyc2VfYXJndl9keW5hbWljID8oY3VycmVudD1jdXJyZW50KSBhcmd2IHNwZWNsaXN0IGFub25mdW4gZXJybXNnID1cbiAgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNfYXV4IGZhbHNlIGN1cnJlbnQgKHJlZiBhcmd2KSBzcGVjbGlzdCBhbm9uZnVuXG4gICAgZXJybXNnXG5cblxubGV0IHBhcnNlX2FyZ3YgPyhjdXJyZW50PWN1cnJlbnQpIGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1biBlcnJtc2cgPVxuICBwYXJzZV9hcmd2X2R5bmFtaWMgfmN1cnJlbnQ6Y3VycmVudCBhcmd2IChyZWYgc3BlY2xpc3QpIGFub25mdW4gZXJybXNnXG5cblxubGV0IHBhcnNlIGwgZiBtc2cgPVxuICB0cnlcbiAgICBwYXJzZV9hcmd2IFN5cy5hcmd2IGwgZiBtc2dcbiAgd2l0aFxuICB8IEJhZCBtc2cgLT4gZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDJcbiAgfCBIZWxwIG1zZyAtPiBwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG5cblxubGV0IHBhcnNlX2R5bmFtaWMgbCBmIG1zZyA9XG4gIHRyeVxuICAgIHBhcnNlX2FyZ3ZfZHluYW1pYyBTeXMuYXJndiBsIGYgbXNnXG4gIHdpdGhcbiAgfCBCYWQgbXNnIC0+IGVwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAyXG4gIHwgSGVscCBtc2cgLT4gcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMFxuXG5sZXQgcGFyc2VfZXhwYW5kIGwgZiBtc2cgPVxuICB0cnlcbiAgICBsZXQgYXJndiA9IHJlZiBTeXMuYXJndiBpblxuICAgIGxldCBzcGVjID0gcmVmIGwgaW5cbiAgICBsZXQgY3VycmVudCA9IHJlZiAoIWN1cnJlbnQpIGluXG4gICAgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWMgY3VycmVudCBhcmd2IHNwZWMgZiBtc2dcbiAgd2l0aFxuICB8IEJhZCBtc2cgLT4gZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDJcbiAgfCBIZWxwIG1zZyAtPiBwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG5cblxubGV0IHNlY29uZF93b3JkIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBuID1cbiAgICBpZiBuID49IGxlbiB0aGVuIGxlblxuICAgIGVsc2UgaWYgcy5bbl0gPSAnICcgdGhlbiBsb29wIChuKzEpXG4gICAgZWxzZSBuXG4gIGluXG4gIG1hdGNoIFN0cmluZy5pbmRleCBzICdcXHQnIHdpdGhcbiAgfCBuIC0+IGxvb3AgKG4rMSlcbiAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgICBiZWdpbiBtYXRjaCBTdHJpbmcuaW5kZXggcyAnICcgd2l0aFxuICAgICAgfCBuIC0+IGxvb3AgKG4rMSlcbiAgICAgIHwgZXhjZXB0aW9uIE5vdF9mb3VuZCAtPiBsZW5cbiAgICAgIGVuZFxuXG5cbmxldCBtYXhfYXJnX2xlbiBjdXIgKGt3ZCwgc3BlYywgZG9jKSA9XG4gIG1hdGNoIHNwZWMgd2l0aFxuICB8IFN5bWJvbCBfIC0+IEludC5tYXggY3VyIChTdHJpbmcubGVuZ3RoIGt3ZClcbiAgfCBfIC0+IEludC5tYXggY3VyIChTdHJpbmcubGVuZ3RoIGt3ZCArIHNlY29uZF93b3JkIGRvYylcblxuXG5sZXQgcmVwbGFjZV9sZWFkaW5nX3RhYiBzID1cbiAgbGV0IHNlZW4gPSByZWYgZmFsc2UgaW5cbiAgU3RyaW5nLm1hcCAoZnVuY3Rpb24gJ1xcdCcgd2hlbiBub3QgIXNlZW4gLT4gc2VlbiA6PSB0cnVlOyAnICcgfCBjIC0+IGMpIHNcblxubGV0IGFkZF9wYWRkaW5nIGxlbiBrc2QgPVxuICBtYXRjaCBrc2Qgd2l0aFxuICB8IChfLCBfLCBcIlwiKSAtPlxuICAgICAgKCogRG8gbm90IHBhZCB1bmRvY3VtZW50ZWQgb3B0aW9ucywgc28gdGhhdCB0aGV5IHN0aWxsIGRvbid0IHNob3cgdXAgd2hlblxuICAgICAgICogcnVuIHRocm91Z2ggW3VzYWdlXSBvciBbcGFyc2VdLiAqKVxuICAgICAga3NkXG4gIHwgKGt3ZCwgKFN5bWJvbCBfIGFzIHNwZWMpLCBtc2cpIC0+XG4gICAgICBsZXQgY3V0Y29sID0gc2Vjb25kX3dvcmQgbXNnIGluXG4gICAgICBsZXQgc3BhY2VzID0gU3RyaW5nLm1ha2UgKChJbnQubWF4IDAgKGxlbiAtIGN1dGNvbCkpICsgMykgJyAnIGluXG4gICAgICAoa3dkLCBzcGVjLCBcIlxcblwiIF4gc3BhY2VzIF4gcmVwbGFjZV9sZWFkaW5nX3RhYiBtc2cpXG4gIHwgKGt3ZCwgc3BlYywgbXNnKSAtPlxuICAgICAgbGV0IGN1dGNvbCA9IHNlY29uZF93b3JkIG1zZyBpblxuICAgICAgbGV0IGt3ZF9sZW4gPSBTdHJpbmcubGVuZ3RoIGt3ZCBpblxuICAgICAgbGV0IGRpZmYgPSBsZW4gLSBrd2RfbGVuIC0gY3V0Y29sIGluXG4gICAgICBpZiBkaWZmIDw9IDAgdGhlblxuICAgICAgICAoa3dkLCBzcGVjLCByZXBsYWNlX2xlYWRpbmdfdGFiIG1zZylcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IHNwYWNlcyA9IFN0cmluZy5tYWtlIGRpZmYgJyAnIGluXG4gICAgICAgIGxldCBwcmVmaXggPSBTdHJpbmcuc3ViIChyZXBsYWNlX2xlYWRpbmdfdGFiIG1zZykgMCBjdXRjb2wgaW5cbiAgICAgICAgbGV0IHN1ZmZpeCA9IFN0cmluZy5zdWIgbXNnIGN1dGNvbCAoU3RyaW5nLmxlbmd0aCBtc2cgLSBjdXRjb2wpIGluXG4gICAgICAgIChrd2QsIHNwZWMsIHByZWZpeCBeIHNwYWNlcyBeIHN1ZmZpeClcblxuXG5sZXQgYWxpZ24gPyhsaW1pdD1tYXhfaW50KSBzcGVjbGlzdCA9XG4gIGxldCBjb21wbGV0ZWQgPSBhZGRfaGVscCBzcGVjbGlzdCBpblxuICBsZXQgbGVuID0gTGlzdC5mb2xkX2xlZnQgbWF4X2FyZ19sZW4gMCBjb21wbGV0ZWQgaW5cbiAgbGV0IGxlbiA9IEludC5taW4gbGVuIGxpbWl0IGluXG4gIExpc3QubWFwIChhZGRfcGFkZGluZyBsZW4pIGNvbXBsZXRlZFxuXG5sZXQgdHJpbV9jciBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBpZiBsZW4gPiAwICYmIFN0cmluZy5nZXQgcyAobGVuIC0gMSkgPSAnXFxyJyB0aGVuXG4gICAgU3RyaW5nLnN1YiBzIDAgKGxlbiAtIDEpXG4gIGVsc2VcbiAgICBzXG5cbmxldCByZWFkX2F1eCB0cmltIHNlcCBmaWxlID1cbiAgbGV0IGljID0gb3Blbl9pbl9iaW4gZmlsZSBpblxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyMDAgaW5cbiAgbGV0IHdvcmRzID0gcmVmIFtdIGluXG4gIGxldCBzdGFzaCAoKSA9XG4gICAgbGV0IHdvcmQgPSBCdWZmZXIuY29udGVudHMgYnVmIGluXG4gICAgbGV0IHdvcmQgPSBpZiB0cmltIHRoZW4gdHJpbV9jciB3b3JkIGVsc2Ugd29yZCBpblxuICAgIHdvcmRzIDo9IHdvcmQgOjogIXdvcmRzO1xuICAgIEJ1ZmZlci5jbGVhciBidWZcbiAgaW5cbiAgYmVnaW5cbiAgICB0cnkgd2hpbGUgdHJ1ZSBkb1xuICAgICAgICBsZXQgYyA9IGlucHV0X2NoYXIgaWMgaW5cbiAgICAgICAgaWYgYyA9IHNlcCB0aGVuIHN0YXNoICgpIGVsc2UgQnVmZmVyLmFkZF9jaGFyIGJ1ZiBjXG4gICAgICBkb25lXG4gICAgd2l0aCBFbmRfb2ZfZmlsZSAtPiAoKVxuICBlbmQ7XG4gIGlmIEJ1ZmZlci5sZW5ndGggYnVmID4gMCB0aGVuIHN0YXNoICgpO1xuICBjbG9zZV9pbiBpYztcbiAgQXJyYXkub2ZfbGlzdCAoTGlzdC5yZXYgIXdvcmRzKVxuXG5sZXQgcmVhZF9hcmcgPSByZWFkX2F1eCB0cnVlICdcXG4nXG5cbmxldCByZWFkX2FyZzAgPSByZWFkX2F1eCBmYWxzZSAnXFx4MDAnXG5cbmxldCB3cml0ZV9hdXggc2VwIGZpbGUgYXJncyA9XG4gIGxldCBvYyA9IG9wZW5fb3V0X2JpbiBmaWxlIGluXG4gIEFycmF5Lml0ZXIgKGZ1biBzIC0+IGZwcmludGYgb2MgXCIlcyVjXCIgcyBzZXApIGFyZ3M7XG4gIGNsb3NlX291dCBvY1xuXG5sZXQgd3JpdGVfYXJnID0gd3JpdGVfYXV4ICdcXG4nXG5cbmxldCB3cml0ZV9hcmcwID0gd3JpdGVfYXV4ICdcXHgwMCdcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBQcmludGZcblxudHlwZSB0ID0gZXhuID0gLi5cblxubGV0IHByaW50ZXJzID0gQXRvbWljLm1ha2UgW11cblxubGV0IGxvY2ZtdCA9IGZvcm1hdF9vZl9zdHJpbmcgXCJGaWxlIFxcXCIlc1xcXCIsIGxpbmUgJWQsIGNoYXJhY3RlcnMgJWQtJWQ6ICVzXCJcblxubGV0IGZpZWxkIHggaSA9XG4gIGxldCBmID0gT2JqLmZpZWxkIHggaSBpblxuICBpZiBub3QgKE9iai5pc19ibG9jayBmKSB0aGVuXG4gICAgc3ByaW50ZiBcIiVkXCIgKE9iai5tYWdpYyBmIDogaW50KSAgICAgICAgICAgKCogY2FuIGFsc28gYmUgYSBjaGFyICopXG4gIGVsc2UgaWYgT2JqLnRhZyBmID0gT2JqLnN0cmluZ190YWcgdGhlblxuICAgIHNwcmludGYgXCIlU1wiIChPYmoubWFnaWMgZiA6IHN0cmluZylcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouZG91YmxlX3RhZyB0aGVuXG4gICAgc3RyaW5nX29mX2Zsb2F0IChPYmoubWFnaWMgZiA6IGZsb2F0KVxuICBlbHNlXG4gICAgXCJfXCJcblxubGV0IHJlYyBvdGhlcl9maWVsZHMgeCBpID1cbiAgaWYgaSA+PSBPYmouc2l6ZSB4IHRoZW4gXCJcIlxuICBlbHNlIHNwcmludGYgXCIsICVzJXNcIiAoZmllbGQgeCBpKSAob3RoZXJfZmllbGRzIHggKGkrMSkpXG5cbmxldCBmaWVsZHMgeCA9XG4gIG1hdGNoIE9iai5zaXplIHggd2l0aFxuICB8IDAgLT4gXCJcIlxuICB8IDEgLT4gXCJcIlxuICB8IDIgLT4gc3ByaW50ZiBcIiglcylcIiAoZmllbGQgeCAxKVxuICB8IF8gLT4gc3ByaW50ZiBcIiglcyVzKVwiIChmaWVsZCB4IDEpIChvdGhlcl9maWVsZHMgeCAyKVxuXG5sZXQgdXNlX3ByaW50ZXJzIHggPVxuICBsZXQgcmVjIGNvbnYgPSBmdW5jdGlvblxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgKG1hdGNoIGhkIHggd2l0aFxuICAgICAgICAgfCBOb25lIHwgZXhjZXB0aW9uIF8gLT4gY29udiB0bFxuICAgICAgICAgfCBTb21lIHMgLT4gU29tZSBzKVxuICAgIHwgW10gLT4gTm9uZSBpblxuICBjb252IChBdG9taWMuZ2V0IHByaW50ZXJzKVxuXG5sZXQgZGVzdHJ1Y3RfZXh0X2NvbnN0cnVjdG9yIHggPVxuICBpZiBPYmoudGFnIHggPD4gMCB0aGVuXG4gICAgKChPYmoubWFnaWMgKE9iai5maWVsZCB4IDApIDogc3RyaW5nKSwgTm9uZSlcbiAgZWxzZVxuICAgIGxldCBjb25zdHJ1Y3RvciA9XG4gICAgICAoT2JqLm1hZ2ljIChPYmouZmllbGQgKE9iai5maWVsZCB4IDApIDApIDogc3RyaW5nKSBpblxuICAgIChjb25zdHJ1Y3RvciwgU29tZSAoZmllbGRzIHgpKVxuXG5sZXQgc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciB0ID1cbiAgbGV0IGNvbnN0cnVjdG9yLCBmaWVsZHNfb3B0ID0gZGVzdHJ1Y3RfZXh0X2NvbnN0cnVjdG9yIHQgaW5cbiAgbWF0Y2ggZmllbGRzX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBjb25zdHJ1Y3RvclxuICB8IFNvbWUgZiAtPiBjb25zdHJ1Y3RvciBeIGZcblxubGV0IHRvX3N0cmluZ19kZWZhdWx0ID0gZnVuY3Rpb25cbiAgfCBPdXRfb2ZfbWVtb3J5IC0+IFwiT3V0IG9mIG1lbW9yeVwiXG4gIHwgU3RhY2tfb3ZlcmZsb3cgLT4gXCJTdGFjayBvdmVyZmxvd1wiXG4gIHwgTWF0Y2hfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNSkgXCJQYXR0ZXJuIG1hdGNoaW5nIGZhaWxlZFwiXG4gIHwgQXNzZXJ0X2ZhaWx1cmUoZmlsZSwgbGluZSwgY2hhcikgLT5cbiAgICAgIHNwcmludGYgbG9jZm10IGZpbGUgbGluZSBjaGFyIChjaGFyKzYpIFwiQXNzZXJ0aW9uIGZhaWxlZFwiXG4gIHwgVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUoZmlsZSwgbGluZSwgY2hhcikgLT5cbiAgICAgIHNwcmludGYgbG9jZm10IGZpbGUgbGluZSBjaGFyIChjaGFyKzYpIFwiVW5kZWZpbmVkIHJlY3Vyc2l2ZSBtb2R1bGVcIlxuICB8IHggLT5cbiAgICAgIHN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0b3IgKE9iai5yZXByIHgpXG5cbmxldCB0b19zdHJpbmcgZSA9XG4gIG1hdGNoIHVzZV9wcmludGVycyBlIHdpdGhcbiAgfCBTb21lIHMgLT4gc1xuICB8IE5vbmUgLT4gdG9fc3RyaW5nX2RlZmF1bHQgZVxuXG5sZXQgcHJpbnQgZmN0IGFyZyA9XG4gIHRyeVxuICAgIGZjdCBhcmdcbiAgd2l0aCB4IC0+XG4gICAgZXByaW50ZiBcIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXNcXG5cIiAodG9fc3RyaW5nIHgpO1xuICAgIGZsdXNoIHN0ZGVycjtcbiAgICByYWlzZSB4XG5cbmxldCBjYXRjaCBmY3QgYXJnID1cbiAgdHJ5XG4gICAgZmN0IGFyZ1xuICB3aXRoIHggLT5cbiAgICBmbHVzaCBzdGRvdXQ7XG4gICAgZXByaW50ZiBcIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXNcXG5cIiAodG9fc3RyaW5nIHgpO1xuICAgIGV4aXQgMlxuXG50eXBlIHJhd19iYWNrdHJhY2Vfc2xvdFxudHlwZSByYXdfYmFja3RyYWNlX2VudHJ5ID0gcHJpdmF0ZSBpbnRcbnR5cGUgcmF3X2JhY2t0cmFjZSA9IHJhd19iYWNrdHJhY2VfZW50cnkgYXJyYXlcblxubGV0IHJhd19iYWNrdHJhY2VfZW50cmllcyBidCA9IGJ0XG5cbmV4dGVybmFsIGdldF9yYXdfYmFja3RyYWNlOlxuICB1bml0IC0+IHJhd19iYWNrdHJhY2UgPSBcImNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYWNlXCJcblxuZXh0ZXJuYWwgcmFpc2Vfd2l0aF9iYWNrdHJhY2U6IGV4biAtPiByYXdfYmFja3RyYWNlIC0+ICdhXG4gID0gXCIlcmFpc2Vfd2l0aF9iYWNrdHJhY2VcIlxuXG50eXBlIGJhY2t0cmFjZV9zbG90ID1cbiAgfCBLbm93bl9sb2NhdGlvbiBvZiB7XG4gICAgICBpc19yYWlzZSAgICA6IGJvb2w7XG4gICAgICBmaWxlbmFtZSAgICA6IHN0cmluZztcbiAgICAgIGxpbmVfbnVtYmVyIDogaW50O1xuICAgICAgc3RhcnRfY2hhciAgOiBpbnQ7XG4gICAgICBlbmRfY2hhciAgICA6IGludDtcbiAgICAgIGlzX2lubGluZSAgIDogYm9vbDtcbiAgICAgIGRlZm5hbWUgICAgIDogc3RyaW5nO1xuICAgIH1cbiAgfCBVbmtub3duX2xvY2F0aW9uIG9mIHtcbiAgICAgIGlzX3JhaXNlIDogYm9vbFxuICAgIH1cblxuKCogdG8gYXZvaWQgd2FybmluZyAqKVxubGV0IF8gPSBbS25vd25fbG9jYXRpb24geyBpc19yYWlzZSA9IGZhbHNlOyBmaWxlbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtYmVyID0gMDsgc3RhcnRfY2hhciA9IDA7IGVuZF9jaGFyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaW5saW5lID0gZmFsc2U7IGRlZm5hbWUgPSBcIlwiIH07XG4gICAgICAgICBVbmtub3duX2xvY2F0aW9uIHsgaXNfcmFpc2UgPSBmYWxzZSB9XVxuXG5leHRlcm5hbCBjb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdDpcbiAgcmF3X2JhY2t0cmFjZV9zbG90IC0+IGJhY2t0cmFjZV9zbG90ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCJcblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlOlxuICByYXdfYmFja3RyYWNlIC0+IGJhY2t0cmFjZV9zbG90IGFycmF5ID0gXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZVwiXG5cbmxldCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgYnQgPVxuICB0cnkgU29tZSAoY29udmVydF9yYXdfYmFja3RyYWNlIGJ0KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgcG9zIHNsb3QgPVxuICBsZXQgaW5mbyBpc19yYWlzZSA9XG4gICAgaWYgaXNfcmFpc2UgdGhlblxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGF0XCIgZWxzZSBcIlJlLXJhaXNlZCBhdFwiXG4gICAgZWxzZVxuICAgICAgaWYgcG9zID0gMCB0aGVuIFwiUmFpc2VkIGJ5IHByaW1pdGl2ZSBvcGVyYXRpb24gYXRcIiBlbHNlIFwiQ2FsbGVkIGZyb21cIlxuICBpblxuICBtYXRjaCBzbG90IHdpdGhcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIGlmIGwuaXNfcmFpc2UgdGhlblxuICAgICAgICAoKiBjb21waWxlci1pbnNlcnRlZCByZS1yYWlzZSwgc2tpcHBlZCAqKSBOb25lXG4gICAgICBlbHNlXG4gICAgICAgIFNvbWUgKHNwcmludGYgXCIlcyB1bmtub3duIGxvY2F0aW9uXCIgKGluZm8gZmFsc2UpKVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT5cbiAgICAgIFNvbWUgKHNwcmludGYgXCIlcyAlcyBpbiBmaWxlIFxcXCIlc1xcXCIlcywgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZFwiXG4gICAgICAgICAgICAgIChpbmZvIGwuaXNfcmFpc2UpIGwuZGVmbmFtZSBsLmZpbGVuYW1lXG4gICAgICAgICAgICAgIChpZiBsLmlzX2lubGluZSB0aGVuIFwiIChpbmxpbmVkKVwiIGVsc2UgXCJcIilcbiAgICAgICAgICAgICAgbC5saW5lX251bWJlciBsLnN0YXJ0X2NoYXIgbC5lbmRfY2hhcilcblxubGV0IHByaW50X2V4Y2VwdGlvbl9iYWNrdHJhY2Ugb3V0Y2hhbiBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgIGZwcmludGYgb3V0Y2hhblxuICAgICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBhIC0gMSBkb1xuICAgICAgICBtYXRjaCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgaSBhLihpKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIHN0ciAtPiBmcHJpbnRmIG91dGNoYW4gXCIlc1xcblwiIHN0clxuICAgICAgZG9uZVxuXG5sZXQgcHJpbnRfcmF3X2JhY2t0cmFjZSBvdXRjaGFuIHJhd19iYWNrdHJhY2UgPVxuICBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG4oKiBjb25mdXNpbmdseSBuYW1lZDogcHJpbnRzIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBwcmludF9iYWNrdHJhY2Ugb3V0Y2hhbiA9XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiAoZ2V0X3Jhd19iYWNrdHJhY2UgKCkpXG5cbmxldCBiYWNrdHJhY2VfdG9fc3RyaW5nIGJhY2t0cmFjZSA9XG4gIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICBcIihQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgY2Fubm90IHByaW50IHN0YWNrIGJhY2t0cmFjZSlcXG5cIlxuICB8IFNvbWUgYSAtPlxuICAgICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDEwMjQgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gYnByaW50ZiBiIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmU7XG4gICAgICBCdWZmZXIuY29udGVudHMgYlxuXG5sZXQgcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgcmF3X2JhY2t0cmFjZSA9XG4gIGJhY2t0cmFjZV90b19zdHJpbmcgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlKVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2UgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuICB8IFVua25vd25fbG9jYXRpb24gbCAtPiBsLmlzX3JhaXNlXG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmUgPSBmdW5jdGlvblxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19pbmxpbmVcbiAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcblxudHlwZSBsb2NhdGlvbiA9IHtcbiAgZmlsZW5hbWUgOiBzdHJpbmc7XG4gIGxpbmVfbnVtYmVyIDogaW50O1xuICBzdGFydF9jaGFyIDogaW50O1xuICBlbmRfY2hhciA6IGludDtcbn1cblxubGV0IGJhY2t0cmFjZV9zbG90X2xvY2F0aW9uID0gZnVuY3Rpb25cbiAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gTm9uZVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT5cbiAgICBTb21lIHtcbiAgICAgIGZpbGVuYW1lICAgID0gbC5maWxlbmFtZTtcbiAgICAgIGxpbmVfbnVtYmVyID0gbC5saW5lX251bWJlcjtcbiAgICAgIHN0YXJ0X2NoYXIgID0gbC5zdGFydF9jaGFyO1xuICAgICAgZW5kX2NoYXIgICAgPSBsLmVuZF9jaGFyO1xuICAgIH1cblxubGV0IGJhY2t0cmFjZV9zbG90X2RlZm5hbWUgPSBmdW5jdGlvblxuICB8IFVua25vd25fbG9jYXRpb24gX1xuICB8IEtub3duX2xvY2F0aW9uIHsgZGVmbmFtZSA9IFwiXCIgfSAtPiBOb25lXG4gIHwgS25vd25fbG9jYXRpb24gbCAtPiBTb21lIGwuZGVmbmFtZVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RzIHJhd19iYWNrdHJhY2UgPVxuICAoKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGd1YXJhbnRlZXMgdGhhdCBTb21lIGlzXG4gICAgIHJldHVybmVkIG9ubHkgaWYgYSBwYXJ0IG9mIHRoZSB0cmFjZSBpcyB1c2FibGUuIFRoaXMgZ2l2ZXMgdXNcbiAgICAgYSBiaXQgbW9yZSB3b3JrIHRoYW4ganVzdCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UsIGJ1dCBpdCBtYWtlcyB0aGVcbiAgICAgQVBJIG1vcmUgdXNlci1mcmllbmRseSAtLSBvdGhlcndpc2UgbW9zdCB1c2VycyB3b3VsZCBoYXZlIHRvXG4gICAgIHJlaW1wbGVtZW50IHRoZSBcIlByb2dyYW0gbm90IGxpbmtlZCB3aXRoIC1nLCBzb3JyeVwiIGxvZ2ljXG4gICAgIHRoZW1zZWx2ZXMuICopXG4gIG1hdGNoIGNvbnZlcnRfcmF3X2JhY2t0cmFjZSByYXdfYmFja3RyYWNlIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBiYWNrdHJhY2UgLT5cbiAgICAgIGxldCB1c2FibGVfc2xvdCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IGZhbHNlXG4gICAgICAgIHwgS25vd25fbG9jYXRpb24gXyAtPiB0cnVlIGluXG4gICAgICBsZXQgcmVjIGV4aXN0c191c2FibGUgPSBmdW5jdGlvblxuICAgICAgICB8ICgtMSkgLT4gZmFsc2VcbiAgICAgICAgfCBpIC0+IHVzYWJsZV9zbG90IGJhY2t0cmFjZS4oaSkgfHwgZXhpc3RzX3VzYWJsZSAoaSAtIDEpIGluXG4gICAgICBpZiBleGlzdHNfdXNhYmxlIChBcnJheS5sZW5ndGggYmFja3RyYWNlIC0gMSlcbiAgICAgIHRoZW4gU29tZSBiYWNrdHJhY2VcbiAgICAgIGVsc2UgTm9uZVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RzX29mX3Jhd19lbnRyeSBlbnRyeSA9XG4gIGJhY2t0cmFjZV9zbG90cyBbfCBlbnRyeSB8XVxuXG5tb2R1bGUgU2xvdCA9IHN0cnVjdFxuICB0eXBlIHQgPSBiYWNrdHJhY2Vfc2xvdFxuICBsZXQgZm9ybWF0ID0gZm9ybWF0X2JhY2t0cmFjZV9zbG90XG4gIGxldCBpc19yYWlzZSA9IGJhY2t0cmFjZV9zbG90X2lzX3JhaXNlXG4gIGxldCBpc19pbmxpbmUgPSBiYWNrdHJhY2Vfc2xvdF9pc19pbmxpbmVcbiAgbGV0IGxvY2F0aW9uID0gYmFja3RyYWNlX3Nsb3RfbG9jYXRpb25cbiAgbGV0IG5hbWUgPSBiYWNrdHJhY2Vfc2xvdF9kZWZuYW1lXG5lbmRcblxubGV0IHJhd19iYWNrdHJhY2VfbGVuZ3RoIGJ0ID0gQXJyYXkubGVuZ3RoIGJ0XG5cbmV4dGVybmFsIGdldF9yYXdfYmFja3RyYWNlX3Nsb3QgOlxuICByYXdfYmFja3RyYWNlIC0+IGludCAtPiByYXdfYmFja3RyYWNlX3Nsb3QgPSBcImNhbWxfcmF3X2JhY2t0cmFjZV9zbG90XCJcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90IDpcbiAgcmF3X2JhY2t0cmFjZV9zbG90IC0+IHJhd19iYWNrdHJhY2Vfc2xvdCBvcHRpb25cbiAgPSBcImNhbWxfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3RcIlxuXG4oKiBjb25mdXNpbmdseSBuYW1lZDpcbiAgIHJldHVybnMgdGhlICpzdHJpbmcqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdsb2JhbCBjdXJyZW50IGJhY2t0cmFjZSAqKVxubGV0IGdldF9iYWNrdHJhY2UgKCkgPSByYXdfYmFja3RyYWNlX3RvX3N0cmluZyAoZ2V0X3Jhd19iYWNrdHJhY2UgKCkpXG5cbmV4dGVybmFsIHJlY29yZF9iYWNrdHJhY2U6IGJvb2wgLT4gdW5pdCA9IFwiY2FtbF9yZWNvcmRfYmFja3RyYWNlXCJcbmV4dGVybmFsIGJhY2t0cmFjZV9zdGF0dXM6IHVuaXQgLT4gYm9vbCA9IFwiY2FtbF9iYWNrdHJhY2Vfc3RhdHVzXCJcblxubGV0IHJlYyByZWdpc3Rlcl9wcmludGVyIGZuID1cbiAgbGV0IG9sZF9wcmludGVycyA9IEF0b21pYy5nZXQgcHJpbnRlcnMgaW5cbiAgbGV0IG5ld19wcmludGVycyA9IGZuIDo6IG9sZF9wcmludGVycyBpblxuICBsZXQgc3VjY2VzcyA9IEF0b21pYy5jb21wYXJlX2FuZF9zZXQgcHJpbnRlcnMgb2xkX3ByaW50ZXJzIG5ld19wcmludGVycyBpblxuICBpZiBub3Qgc3VjY2VzcyB0aGVuIHJlZ2lzdGVyX3ByaW50ZXIgZm5cblxuZXh0ZXJuYWwgZ2V0X2NhbGxzdGFjazogaW50IC0+IHJhd19iYWNrdHJhY2UgPSBcImNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrXCJcblxubGV0IGV4bl9zbG90IHggPVxuICBsZXQgeCA9IE9iai5yZXByIHggaW5cbiAgaWYgT2JqLnRhZyB4ID0gMCB0aGVuIE9iai5maWVsZCB4IDAgZWxzZSB4XG5cbmxldCBleG5fc2xvdF9pZCB4ID1cbiAgbGV0IHNsb3QgPSBleG5fc2xvdCB4IGluXG4gIChPYmoub2JqIChPYmouZmllbGQgc2xvdCAxKSA6IGludClcblxubGV0IGV4bl9zbG90X25hbWUgeCA9XG4gIGxldCBzbG90ID0gZXhuX3Nsb3QgeCBpblxuICAoT2JqLm9iaiAoT2JqLmZpZWxkIHNsb3QgMCkgOiBzdHJpbmcpXG5cbmV4dGVybmFsIGdldF9kZWJ1Z19pbmZvX3N0YXR1cyA6IHVuaXQgLT4gaW50ID0gXCJjYW1sX21sX2RlYnVnX2luZm9fc3RhdHVzXCJcblxuKCogRGVzY3JpcHRpb25zIGZvciBlcnJvcnMgaW4gc3RhcnR1cC5oLiBTZWUgYWxzbyBiYWNrdHJhY2UuYyAqKVxubGV0IGVycm9ycyA9IFt8IFwiXCI7XG4gICgqIEZJTEVfTk9UX0ZPVU5EICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBub3QgZm91bmQpXCI7XG4gICgqIEJBRF9CWVRFQ09ERSAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgYXBwZWFycyB0byBiZSBjb3JydXB0KVwiO1xuICAoKiBXUk9OR19NQUdJQyAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgaGFzIHdyb25nIG1hZ2ljIG51bWJlcilcIjtcbiAgKCogTk9fRkRTICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBjYW5ub3QgYmUgb3BlbmVkO1xcbiBcXFxuICAgICAgLS0gdG9vIG1hbnkgb3BlbiBmaWxlcy4gVHJ5IHJ1bm5pbmcgd2l0aCBPQ0FNTFJVTlBBUkFNPWI9MilcIlxufF1cblxubGV0IGRlZmF1bHRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZXhuIHJhd19iYWNrdHJhY2UgPVxuICBlcHJpbnRmIFwiRmF0YWwgZXJyb3I6IGV4Y2VwdGlvbiAlc1xcblwiICh0b19zdHJpbmcgZXhuKTtcbiAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgbGV0IHN0YXR1cyA9IGdldF9kZWJ1Z19pbmZvX3N0YXR1cyAoKSBpblxuICBpZiBzdGF0dXMgPCAwIHRoZW5cbiAgICBwcmVycl9lbmRsaW5lIGVycm9ycy4oYWJzIHN0YXR1cyk7XG4gIGZsdXNoIHN0ZGVyclxuXG5sZXQgdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgPSByZWYgZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlclxuXG5sZXQgc2V0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGZuID0gdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgOj0gZm5cblxubGV0IGVtcHR5X2JhY2t0cmFjZSA6IHJhd19iYWNrdHJhY2UgPSBbfCB8XVxuXG5sZXQgdHJ5X2dldF9yYXdfYmFja3RyYWNlICgpID1cbiAgdHJ5XG4gICAgZ2V0X3Jhd19iYWNrdHJhY2UgKClcbiAgd2l0aCBfICgqIE91dF9vZl9tZW1vcnk/ICopIC0+XG4gICAgZW1wdHlfYmFja3RyYWNlXG5cbmxldCBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uJyBleG4gZGVidWdnZXJfaW5fdXNlID1cbiAgdHJ5XG4gICAgKCogR2V0IHRoZSBiYWNrdHJhY2Ugbm93LCBpbiBjYXNlIG9uZSBvZiB0aGUgW2F0X2V4aXRdIGZ1bmN0aW9uXG4gICAgICAgZGVzdHJveXMgaXQuICopXG4gICAgbGV0IHJhd19iYWNrdHJhY2UgPVxuICAgICAgaWYgZGVidWdnZXJfaW5fdXNlICgqIFNhbWUgdGVzdCBhcyBpbiBbcnVudGltZS9wcmludGV4Yy5jXSAqKSB0aGVuXG4gICAgICAgIGVtcHR5X2JhY2t0cmFjZVxuICAgICAgZWxzZVxuICAgICAgICB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKClcbiAgICBpblxuICAgICh0cnkgU3RkbGliLmRvX2F0X2V4aXQgKCkgd2l0aCBfIC0+ICgpKTtcbiAgICB0cnlcbiAgICAgICF1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBleG4gcmF3X2JhY2t0cmFjZVxuICAgIHdpdGggZXhuJyAtPlxuICAgICAgbGV0IHJhd19iYWNrdHJhY2UnID0gdHJ5X2dldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgICBlcHJpbnRmIFwiRmF0YWwgZXJyb3I6IGV4Y2VwdGlvbiAlc1xcblwiICh0b19zdHJpbmcgZXhuKTtcbiAgICAgIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2U7XG4gICAgICBlcHJpbnRmIFwiRmF0YWwgZXJyb3IgaW4gdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXI6IGV4Y2VwdGlvbiAlc1xcblwiXG4gICAgICAgICh0b19zdHJpbmcgZXhuJyk7XG4gICAgICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlJztcbiAgICAgIGZsdXNoIHN0ZGVyclxuICB3aXRoXG4gICAgfCBPdXRfb2ZfbWVtb3J5IC0+XG4gICAgICAgIHByZXJyX2VuZGxpbmVcbiAgICAgICAgICBcIkZhdGFsIGVycm9yOiBvdXQgb2YgbWVtb3J5IGluIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyXCJcblxuKCogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgW2NhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uXSBpblxuICAgW3J1bnRpbWUvcHJpbnRleGMuY10gd2hpY2ggZXhwZWN0cyBubyBleGNlcHRpb24gaXMgcmFpc2VkLiAqKVxubGV0IGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24gZXhuIGRlYnVnZ2VyX2luX3VzZSA9XG4gIHRyeVxuICAgIGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24nIGV4biBkZWJ1Z2dlcl9pbl91c2VcbiAgd2l0aCBfIC0+XG4gICAgKCogVGhlcmUgaXMgbm90IG11Y2ggd2UgY2FuIGRvIGF0IHRoaXMgcG9pbnQgKilcbiAgICAoKVxuXG5leHRlcm5hbCByZWdpc3Rlcl9uYW1lZF92YWx1ZSA6IHN0cmluZyAtPiAnYSAtPiB1bml0XG4gID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0ICgpID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCJcbiAgICBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIGlkIDogJ2EgLT4gJ2EgPSBcIiVpZGVudGl0eVwiXG5sZXQgY29uc3QgYyBfID0gY1xubGV0IGZsaXAgZiB4IHkgPSBmIHkgeFxubGV0IG5lZ2F0ZSBwIHYgPSBub3QgKHAgdilcblxuZXhjZXB0aW9uIEZpbmFsbHlfcmFpc2VkIG9mIGV4blxuXG5sZXQgKCkgPSBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIEBAIGZ1bmN0aW9uXG58IEZpbmFsbHlfcmFpc2VkIGV4biAtPiBTb21lIChcIkZ1bi5GaW5hbGx5X3JhaXNlZDogXCIgXiBQcmludGV4Yy50b19zdHJpbmcgZXhuKVxufCBfIC0+IE5vbmVcblxubGV0IHByb3RlY3QgfihmaW5hbGx5IDogdW5pdCAtPiB1bml0KSB3b3JrID1cbiAgbGV0IGZpbmFsbHlfbm9fZXhuICgpID1cbiAgICB0cnkgZmluYWxseSAoKSB3aXRoIGUgLT5cbiAgICAgIGxldCBidCA9IFByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgICBQcmludGV4Yy5yYWlzZV93aXRoX2JhY2t0cmFjZSAoRmluYWxseV9yYWlzZWQgZSkgYnRcbiAgaW5cbiAgbWF0Y2ggd29yayAoKSB3aXRoXG4gIHwgcmVzdWx0IC0+IGZpbmFsbHlfbm9fZXhuICgpIDsgcmVzdWx0XG4gIHwgZXhjZXB0aW9uIHdvcmtfZXhuIC0+XG4gICAgICBsZXQgd29ya19idCA9IFByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgICBmaW5hbGx5X25vX2V4biAoKSA7XG4gICAgICBQcmludGV4Yy5yYWlzZV93aXRoX2JhY2t0cmFjZSB3b3JrX2V4biB3b3JrX2J0XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgIEphY3F1ZXMtSGVucmkgSm91cmRhbiwgcHJvamV0IEdhbGxpdW0sIElOUklBIFBhcmlzICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2LTIwMTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSAgICopXG4oKiAgICAgZXQgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgc3RhdCA9IHtcbiAgbWlub3Jfd29yZHMgOiBmbG9hdDtcbiAgcHJvbW90ZWRfd29yZHMgOiBmbG9hdDtcbiAgbWFqb3Jfd29yZHMgOiBmbG9hdDtcbiAgbWlub3JfY29sbGVjdGlvbnMgOiBpbnQ7XG4gIG1ham9yX2NvbGxlY3Rpb25zIDogaW50O1xuICBoZWFwX3dvcmRzIDogaW50O1xuICBoZWFwX2NodW5rcyA6IGludDtcbiAgbGl2ZV93b3JkcyA6IGludDtcbiAgbGl2ZV9ibG9ja3MgOiBpbnQ7XG4gIGZyZWVfd29yZHMgOiBpbnQ7XG4gIGZyZWVfYmxvY2tzIDogaW50O1xuICBsYXJnZXN0X2ZyZWUgOiBpbnQ7XG4gIGZyYWdtZW50cyA6IGludDtcbiAgY29tcGFjdGlvbnMgOiBpbnQ7XG4gIHRvcF9oZWFwX3dvcmRzIDogaW50O1xuICBzdGFja19zaXplIDogaW50O1xuICBmb3JjZWRfbWFqb3JfY29sbGVjdGlvbnM6IGludDtcbn1cblxudHlwZSBjb250cm9sID0ge1xuICBtaW5vcl9oZWFwX3NpemUgOiBpbnQ7XG4gIG1ham9yX2hlYXBfaW5jcmVtZW50IDogaW50O1xuICBzcGFjZV9vdmVyaGVhZCA6IGludDtcbiAgdmVyYm9zZSA6IGludDtcbiAgbWF4X292ZXJoZWFkIDogaW50O1xuICBzdGFja19saW1pdCA6IGludDtcbiAgYWxsb2NhdGlvbl9wb2xpY3kgOiBpbnQ7XG4gIHdpbmRvd19zaXplIDogaW50O1xuICBjdXN0b21fbWFqb3JfcmF0aW8gOiBpbnQ7XG4gIGN1c3RvbV9taW5vcl9yYXRpbyA6IGludDtcbiAgY3VzdG9tX21pbm9yX21heF9zaXplIDogaW50O1xufVxuXG5leHRlcm5hbCBzdGF0IDogdW5pdCAtPiBzdGF0ID0gXCJjYW1sX2djX3N0YXRcIlxuZXh0ZXJuYWwgcXVpY2tfc3RhdCA6IHVuaXQgLT4gc3RhdCA9IFwiY2FtbF9nY19xdWlja19zdGF0XCJcbmV4dGVybmFsIGNvdW50ZXJzIDogdW5pdCAtPiAoZmxvYXQgKiBmbG9hdCAqIGZsb2F0KSA9IFwiY2FtbF9nY19jb3VudGVyc1wiXG5leHRlcm5hbCBtaW5vcl93b3JkcyA6IHVuaXQgLT4gKGZsb2F0IFtAdW5ib3hlZF0pXG4gID0gXCJjYW1sX2djX21pbm9yX3dvcmRzXCIgXCJjYW1sX2djX21pbm9yX3dvcmRzX3VuYm94ZWRcIlxuZXh0ZXJuYWwgZ2V0IDogdW5pdCAtPiBjb250cm9sID0gXCJjYW1sX2djX2dldFwiXG5leHRlcm5hbCBzZXQgOiBjb250cm9sIC0+IHVuaXQgPSBcImNhbWxfZ2Nfc2V0XCJcbmV4dGVybmFsIG1pbm9yIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2djX21pbm9yXCJcbmV4dGVybmFsIG1ham9yX3NsaWNlIDogaW50IC0+IGludCA9IFwiY2FtbF9nY19tYWpvcl9zbGljZVwiXG5leHRlcm5hbCBtYWpvciA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19tYWpvclwiXG5leHRlcm5hbCBmdWxsX21ham9yIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2djX2Z1bGxfbWFqb3JcIlxuZXh0ZXJuYWwgY29tcGFjdCA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19jb21wYWN0aW9uXCJcbmV4dGVybmFsIGdldF9taW5vcl9mcmVlIDogdW5pdCAtPiBpbnQgPSBcImNhbWxfZ2V0X21pbm9yX2ZyZWVcIlxuXG5sZXQgZXZlbnRsb2dfcGF1c2UgKCkgPSAoKVxubGV0IGV2ZW50bG9nX3Jlc3VtZSAoKSA9ICgpXG5cbm9wZW4gUHJpbnRmXG5cbmxldCBwcmludF9zdGF0IGMgPVxuICBsZXQgc3QgPSBzdGF0ICgpIGluXG4gIGZwcmludGYgYyBcIm1pbm9yX2NvbGxlY3Rpb25zOiAgICAgICVkXFxuXCIgc3QubWlub3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcIm1ham9yX2NvbGxlY3Rpb25zOiAgICAgICVkXFxuXCIgc3QubWFqb3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcImNvbXBhY3Rpb25zOiAgICAgICAgICAgICVkXFxuXCIgc3QuY29tcGFjdGlvbnM7XG4gIGZwcmludGYgYyBcImZvcmNlZF9tYWpvcl9jb2xsZWN0aW9uczogJWRcXG5cIiBzdC5mb3JjZWRfbWFqb3JfY29sbGVjdGlvbnM7XG4gIGZwcmludGYgYyBcIlxcblwiO1xuICBsZXQgbDEgPSBTdHJpbmcubGVuZ3RoIChzcHJpbnRmIFwiJS4wZlwiIHN0Lm1pbm9yX3dvcmRzKSBpblxuICBmcHJpbnRmIGMgXCJtaW5vcl93b3JkczogICAgJSouMGZcXG5cIiBsMSBzdC5taW5vcl93b3JkcztcbiAgZnByaW50ZiBjIFwicHJvbW90ZWRfd29yZHM6ICUqLjBmXFxuXCIgbDEgc3QucHJvbW90ZWRfd29yZHM7XG4gIGZwcmludGYgYyBcIm1ham9yX3dvcmRzOiAgICAlKi4wZlxcblwiIGwxIHN0Lm1ham9yX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJcXG5cIjtcbiAgbGV0IGwyID0gU3RyaW5nLmxlbmd0aCAoc3ByaW50ZiBcIiVkXCIgc3QudG9wX2hlYXBfd29yZHMpIGluXG4gIGZwcmludGYgYyBcInRvcF9oZWFwX3dvcmRzOiAlKmRcXG5cIiBsMiBzdC50b3BfaGVhcF93b3JkcztcbiAgZnByaW50ZiBjIFwiaGVhcF93b3JkczogICAgICUqZFxcblwiIGwyIHN0LmhlYXBfd29yZHM7XG4gIGZwcmludGYgYyBcImxpdmVfd29yZHM6ICAgICAlKmRcXG5cIiBsMiBzdC5saXZlX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJmcmVlX3dvcmRzOiAgICAgJSpkXFxuXCIgbDIgc3QuZnJlZV93b3JkcztcbiAgZnByaW50ZiBjIFwibGFyZ2VzdF9mcmVlOiAgICUqZFxcblwiIGwyIHN0Lmxhcmdlc3RfZnJlZTtcbiAgZnByaW50ZiBjIFwiZnJhZ21lbnRzOiAgICAgICUqZFxcblwiIGwyIHN0LmZyYWdtZW50cztcbiAgZnByaW50ZiBjIFwiXFxuXCI7XG4gIGZwcmludGYgYyBcImxpdmVfYmxvY2tzOiAlZFxcblwiIHN0LmxpdmVfYmxvY2tzO1xuICBmcHJpbnRmIGMgXCJmcmVlX2Jsb2NrczogJWRcXG5cIiBzdC5mcmVlX2Jsb2NrcztcbiAgZnByaW50ZiBjIFwiaGVhcF9jaHVua3M6ICVkXFxuXCIgc3QuaGVhcF9jaHVua3NcblxuXG5sZXQgYWxsb2NhdGVkX2J5dGVzICgpID1cbiAgbGV0IChtaSwgcHJvLCBtYSkgPSBjb3VudGVycyAoKSBpblxuICAobWkgKy4gbWEgLS4gcHJvKSAqLiBmbG9hdF9vZl9pbnQgKFN5cy53b3JkX3NpemUgLyA4KVxuXG5cbmV4dGVybmFsIGZpbmFsaXNlIDogKCdhIC0+IHVuaXQpIC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfZmluYWxfcmVnaXN0ZXJcIlxuZXh0ZXJuYWwgZmluYWxpc2VfbGFzdCA6ICh1bml0IC0+IHVuaXQpIC0+ICdhIC0+IHVuaXQgPVxuICBcImNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWVcIlxuZXh0ZXJuYWwgZmluYWxpc2VfcmVsZWFzZSA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9maW5hbF9yZWxlYXNlXCJcblxuXG50eXBlIGFsYXJtID0gYm9vbCBBdG9taWMudFxudHlwZSBhbGFybV9yZWMgPSB7YWN0aXZlIDogYWxhcm07IGYgOiB1bml0IC0+IHVuaXR9XG5cbmxldCByZWMgY2FsbF9hbGFybSBhcmVjID1cbiAgaWYgQXRvbWljLmdldCBhcmVjLmFjdGl2ZSB0aGVuIGJlZ2luXG4gICAgZmluYWxpc2UgY2FsbF9hbGFybSBhcmVjO1xuICAgIGFyZWMuZiAoKTtcbiAgZW5kXG5cblxubGV0IGNyZWF0ZV9hbGFybSBmID1cbiAgbGV0IGFyZWMgPSB7IGFjdGl2ZSA9IEF0b21pYy5tYWtlIHRydWU7IGYgPSBmIH0gaW5cbiAgZmluYWxpc2UgY2FsbF9hbGFybSBhcmVjO1xuICBhcmVjLmFjdGl2ZVxuXG5cbmxldCBkZWxldGVfYWxhcm0gYSA9IEF0b21pYy5zZXQgYSBmYWxzZVxuXG5tb2R1bGUgTWVtcHJvZiA9XG4gIHN0cnVjdFxuICAgIHR5cGUgYWxsb2NhdGlvbl9zb3VyY2UgPSBOb3JtYWwgfCBNYXJzaGFsIHwgQ3VzdG9tXG4gICAgdHlwZSBhbGxvY2F0aW9uID1cbiAgICAgIHsgbl9zYW1wbGVzIDogaW50O1xuICAgICAgICBzaXplIDogaW50O1xuICAgICAgICBzb3VyY2UgOiBhbGxvY2F0aW9uX3NvdXJjZTtcbiAgICAgICAgY2FsbHN0YWNrIDogUHJpbnRleGMucmF3X2JhY2t0cmFjZSB9XG5cbiAgICB0eXBlICgnbWlub3IsICdtYWpvcikgdHJhY2tlciA9IHtcbiAgICAgIGFsbG9jX21pbm9yOiBhbGxvY2F0aW9uIC0+ICdtaW5vciBvcHRpb247XG4gICAgICBhbGxvY19tYWpvcjogYWxsb2NhdGlvbiAtPiAnbWFqb3Igb3B0aW9uO1xuICAgICAgcHJvbW90ZTogJ21pbm9yIC0+ICdtYWpvciBvcHRpb247XG4gICAgICBkZWFsbG9jX21pbm9yOiAnbWlub3IgLT4gdW5pdDtcbiAgICAgIGRlYWxsb2NfbWFqb3I6ICdtYWpvciAtPiB1bml0O1xuICAgIH1cblxuICAgIGxldCBudWxsX3RyYWNrZXIgPSB7XG4gICAgICBhbGxvY19taW5vciA9IChmdW4gXyAtPiBOb25lKTtcbiAgICAgIGFsbG9jX21ham9yID0gKGZ1biBfIC0+IE5vbmUpO1xuICAgICAgcHJvbW90ZSA9IChmdW4gXyAtPiBOb25lKTtcbiAgICAgIGRlYWxsb2NfbWlub3IgPSAoZnVuIF8gLT4gKCkpO1xuICAgICAgZGVhbGxvY19tYWpvciA9IChmdW4gXyAtPiAoKSk7XG4gICAgfVxuXG4gICAgZXh0ZXJuYWwgY19zdGFydCA6XG4gICAgICBmbG9hdCAtPiBpbnQgLT4gKCdtaW5vciwgJ21ham9yKSB0cmFja2VyIC0+IHVuaXRcbiAgICAgID0gXCJjYW1sX21lbXByb2Zfc3RhcnRcIlxuXG4gICAgbGV0IHN0YXJ0XG4gICAgICB+c2FtcGxpbmdfcmF0ZVxuICAgICAgPyhjYWxsc3RhY2tfc2l6ZSA9IG1heF9pbnQpXG4gICAgICB0cmFja2VyID1cbiAgICAgIGNfc3RhcnQgc2FtcGxpbmdfcmF0ZSBjYWxsc3RhY2tfc2l6ZSB0cmFja2VyXG5cbiAgICBleHRlcm5hbCBzdG9wIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX21lbXByb2Zfc3RvcFwiXG4gIGVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNZXNzYWdlIGRpZ2VzdCAoTUQ1KSAqKVxuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgPSBTdHJpbmcuY29tcGFyZVxubGV0IGVxdWFsID0gU3RyaW5nLmVxdWFsXG5cbmV4dGVybmFsIHVuc2FmZV9zdHJpbmc6IHN0cmluZyAtPiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfbWQ1X3N0cmluZ1wiXG5leHRlcm5hbCBjaGFubmVsOiBpbl9jaGFubmVsIC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9jaGFuXCJcblxubGV0IHN0cmluZyBzdHIgPVxuICB1bnNhZmVfc3RyaW5nIHN0ciAwIChTdHJpbmcubGVuZ3RoIHN0cilcblxubGV0IGJ5dGVzIGIgPSBzdHJpbmcgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYilcblxubGV0IHN1YnN0cmluZyBzdHIgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBTdHJpbmcubGVuZ3RoIHN0ciAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LnN1YnN0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX3N0cmluZyBzdHIgb2ZzIGxlblxuXG5sZXQgc3ViYnl0ZXMgYiBvZnMgbGVuID0gc3Vic3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpIG9mcyBsZW5cblxubGV0IGZpbGUgZmlsZW5hbWUgPVxuICBsZXQgaWMgPSBvcGVuX2luX2JpbiBmaWxlbmFtZSBpblxuICBtYXRjaCBjaGFubmVsIGljICgtMSkgd2l0aFxuICAgIHwgZCAtPiBjbG9zZV9pbiBpYzsgZFxuICAgIHwgZXhjZXB0aW9uIGUgLT4gY2xvc2VfaW4gaWM7IHJhaXNlIGVcblxubGV0IG91dHB1dCBjaGFuIGRpZ2VzdCA9XG4gIG91dHB1dF9zdHJpbmcgY2hhbiBkaWdlc3RcblxubGV0IGlucHV0IGNoYW4gPSByZWFsbHlfaW5wdXRfc3RyaW5nIGNoYW4gMTZcblxubGV0IGNoYXJfaGV4IG4gPVxuICBDaGFyLnVuc2FmZV9jaHIgKG4gKyBpZiBuIDwgMTAgdGhlbiBDaGFyLmNvZGUgJzAnIGVsc2UgKENoYXIuY29kZSAnYScgLSAxMCkpXG5cbmxldCB0b19oZXggZCA9XG4gIGlmIFN0cmluZy5sZW5ndGggZCA8PiAxNiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LnRvX2hleFwiO1xuICBsZXQgcmVzdWx0ID0gQnl0ZXMuY3JlYXRlIDMyIGluXG4gIGZvciBpID0gMCB0byAxNSBkb1xuICAgIGxldCB4ID0gQ2hhci5jb2RlIGQuW2ldIGluXG4gICAgQnl0ZXMudW5zYWZlX3NldCByZXN1bHQgKGkqMikgKGNoYXJfaGV4ICh4IGxzciA0KSk7XG4gICAgQnl0ZXMudW5zYWZlX3NldCByZXN1bHQgKGkqMisxKSAoY2hhcl9oZXggKHggbGFuZCAweDBmKSk7XG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzdWx0XG5cbmxldCBmcm9tX2hleCBzID1cbiAgaWYgU3RyaW5nLmxlbmd0aCBzIDw+IDMyIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3QuZnJvbV9oZXhcIjtcbiAgbGV0IGRpZ2l0IGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJzAnLi4nOScgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJzAnXG4gICAgfCAnQScuLidGJyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnQScgKyAxMFxuICAgIHwgJ2EnLi4nZicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ2EnICsgMTBcbiAgICB8IF8gLT4gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgXCJEaWdlc3QuZnJvbV9oZXhcIilcbiAgaW5cbiAgbGV0IGJ5dGUgaSA9IGRpZ2l0IHMuW2ldIGxzbCA0ICsgZGlnaXQgcy5baSsxXSBpblxuICBsZXQgcmVzdWx0ID0gQnl0ZXMuY3JlYXRlIDE2IGluXG4gIGZvciBpID0gMCB0byAxNSBkb1xuICAgIEJ5dGVzLnNldCByZXN1bHQgaSAoQ2hhci5jaHIgKGJ5dGUgKDIgKiBpKSkpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIE1hbnVlbCBTZXJyYW5vIGV0IFhhdmllciBMZXJveSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW0JpZ2FycmF5XTogbGFyZ2UsIG11bHRpLWRpbWVuc2lvbmFsLCBudW1lcmljYWwgYXJyYXlzICopXG5cbigqIFRoZXNlIHR5cGVzIGluIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHRhYmxlcyBpblxuICAgLi4vdHlwaW5nL3R5cGVvcHQubWwgKilcblxudHlwZSBmbG9hdDMyX2VsdCA9IEZsb2F0MzJfZWx0XG50eXBlIGZsb2F0NjRfZWx0ID0gRmxvYXQ2NF9lbHRcbnR5cGUgaW50OF9zaWduZWRfZWx0ID0gSW50OF9zaWduZWRfZWx0XG50eXBlIGludDhfdW5zaWduZWRfZWx0ID0gSW50OF91bnNpZ25lZF9lbHRcbnR5cGUgaW50MTZfc2lnbmVkX2VsdCA9IEludDE2X3NpZ25lZF9lbHRcbnR5cGUgaW50MTZfdW5zaWduZWRfZWx0ID0gSW50MTZfdW5zaWduZWRfZWx0XG50eXBlIGludDMyX2VsdCA9IEludDMyX2VsdFxudHlwZSBpbnQ2NF9lbHQgPSBJbnQ2NF9lbHRcbnR5cGUgaW50X2VsdCA9IEludF9lbHRcbnR5cGUgbmF0aXZlaW50X2VsdCA9IE5hdGl2ZWludF9lbHRcbnR5cGUgY29tcGxleDMyX2VsdCA9IENvbXBsZXgzMl9lbHRcbnR5cGUgY29tcGxleDY0X2VsdCA9IENvbXBsZXg2NF9lbHRcblxudHlwZSAoJ2EsICdiKSBraW5kID1cbiAgICBGbG9hdDMyIDogKGZsb2F0LCBmbG9hdDMyX2VsdCkga2luZFxuICB8IEZsb2F0NjQgOiAoZmxvYXQsIGZsb2F0NjRfZWx0KSBraW5kXG4gIHwgSW50OF9zaWduZWQgOiAoaW50LCBpbnQ4X3NpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQ4X3Vuc2lnbmVkIDogKGludCwgaW50OF91bnNpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQxNl9zaWduZWQgOiAoaW50LCBpbnQxNl9zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50MTZfdW5zaWduZWQgOiAoaW50LCBpbnQxNl91bnNpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQzMiA6IChpbnQzMiwgaW50MzJfZWx0KSBraW5kXG4gIHwgSW50NjQgOiAoaW50NjQsIGludDY0X2VsdCkga2luZFxuICB8IEludCA6IChpbnQsIGludF9lbHQpIGtpbmRcbiAgfCBOYXRpdmVpbnQgOiAobmF0aXZlaW50LCBuYXRpdmVpbnRfZWx0KSBraW5kXG4gIHwgQ29tcGxleDMyIDogKENvbXBsZXgudCwgY29tcGxleDMyX2VsdCkga2luZFxuICB8IENvbXBsZXg2NCA6IChDb21wbGV4LnQsIGNvbXBsZXg2NF9lbHQpIGtpbmRcbiAgfCBDaGFyIDogKGNoYXIsIGludDhfdW5zaWduZWRfZWx0KSBraW5kXG5cbnR5cGUgY19sYXlvdXQgPSBDX2xheW91dF90eXBcbnR5cGUgZm9ydHJhbl9sYXlvdXQgPSBGb3J0cmFuX2xheW91dF90eXAgKCoqKVxuXG50eXBlICdhIGxheW91dCA9XG4gICAgQ19sYXlvdXQ6IGNfbGF5b3V0IGxheW91dFxuICB8IEZvcnRyYW5fbGF5b3V0OiBmb3J0cmFuX2xheW91dCBsYXlvdXRcblxuKCogS2VlcCB0aG9zZSBjb25zdGFudHMgaW4gc3luYyB3aXRoIHRoZSBjYW1sX2JhX2tpbmQgZW51bWVyYXRpb25cbiAgIGluIGJpZ2FycmF5LmggKilcblxubGV0IGZsb2F0MzIgPSBGbG9hdDMyXG5sZXQgZmxvYXQ2NCA9IEZsb2F0NjRcbmxldCBpbnQ4X3NpZ25lZCA9IEludDhfc2lnbmVkXG5sZXQgaW50OF91bnNpZ25lZCA9IEludDhfdW5zaWduZWRcbmxldCBpbnQxNl9zaWduZWQgPSBJbnQxNl9zaWduZWRcbmxldCBpbnQxNl91bnNpZ25lZCA9IEludDE2X3Vuc2lnbmVkXG5sZXQgaW50MzIgPSBJbnQzMlxubGV0IGludDY0ID0gSW50NjRcbmxldCBpbnQgPSBJbnRcbmxldCBuYXRpdmVpbnQgPSBOYXRpdmVpbnRcbmxldCBjb21wbGV4MzIgPSBDb21wbGV4MzJcbmxldCBjb21wbGV4NjQgPSBDb21wbGV4NjRcbmxldCBjaGFyID0gQ2hhclxuXG5sZXQga2luZF9zaXplX2luX2J5dGVzIDogdHlwZSBhIGIuIChhLCBiKSBraW5kIC0+IGludCA9IGZ1bmN0aW9uXG4gIHwgRmxvYXQzMiAtPiA0XG4gIHwgRmxvYXQ2NCAtPiA4XG4gIHwgSW50OF9zaWduZWQgLT4gMVxuICB8IEludDhfdW5zaWduZWQgLT4gMVxuICB8IEludDE2X3NpZ25lZCAtPiAyXG4gIHwgSW50MTZfdW5zaWduZWQgLT4gMlxuICB8IEludDMyIC0+IDRcbiAgfCBJbnQ2NCAtPiA4XG4gIHwgSW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgTmF0aXZlaW50IC0+IFN5cy53b3JkX3NpemUgLyA4XG4gIHwgQ29tcGxleDMyIC0+IDhcbiAgfCBDb21wbGV4NjQgLT4gMTZcbiAgfCBDaGFyIC0+IDFcblxuKCogS2VlcCB0aG9zZSBjb25zdGFudHMgaW4gc3luYyB3aXRoIHRoZSBjYW1sX2JhX2xheW91dCBlbnVtZXJhdGlvblxuICAgaW4gYmlnYXJyYXkuaCAqKVxuXG5sZXQgY19sYXlvdXQgPSBDX2xheW91dFxubGV0IGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRcblxubW9kdWxlIEdlbmFycmF5ID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHRcbiAgZXh0ZXJuYWwgY3JlYXRlOiAoJ2EsICdiKSBraW5kIC0+ICdjIGxheW91dCAtPiBpbnQgYXJyYXkgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgPSBcImNhbWxfYmFfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2FcbiAgICAgPSBcImNhbWxfYmFfZ2V0X2dlbmVyaWNcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCBhcnJheSAtPiAnYSAtPiB1bml0XG4gICAgID0gXCJjYW1sX2JhX3NldF9nZW5lcmljXCJcblxuICBsZXQgcmVjIGNsb29wIGFyciBpZHggZiBjb2wgbWF4ID1cbiAgICBpZiBjb2wgPSBBcnJheS5sZW5ndGggaWR4IHRoZW4gc2V0IGFyciBpZHggKGYgaWR4KVxuICAgIGVsc2UgZm9yIGogPSAwIHRvIHByZWQgbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBjbG9vcCBhcnIgaWR4IGYgKHN1Y2MgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IHJlYyBmbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sIDwgMCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMSB0byBtYXguKGNvbCkgZG9cbiAgICAgICAgICAgaWR4Lihjb2wpIDwtIGo7XG4gICAgICAgICAgIGZsb29wIGFyciBpZHggZiAocHJlZCBjb2wpIG1heFxuICAgICAgICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltcyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbXMgaW5cbiAgICBsZXQgZGxlbiA9IEFycmF5Lmxlbmd0aCBkaW1zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDApIGYgMCBkaW1zOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZsb29wIGFyciAoQXJyYXkubWFrZSBkbGVuIDEpIGYgKHByZWQgZGxlbikgZGltczsgYXJyXG5cbiAgZXh0ZXJuYWwgbnVtX2RpbXM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiY2FtbF9iYV9udW1fZGltc1wiXG4gIGV4dGVybmFsIG50aF9kaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfYmFfZGltXCJcbiAgbGV0IGRpbXMgYSA9XG4gICAgbGV0IG4gPSBudW1fZGltcyBhIGluXG4gICAgbGV0IGQgPSBBcnJheS5tYWtlIG4gMCBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG8gZC4oaSkgPC0gbnRoX2RpbSBhIGkgZG9uZTtcbiAgICBkXG5cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChBcnJheS5mb2xkX2xlZnQgKCAqICkgMSAoZGltcyBhcnIpKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzbGljZV9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBzbGljZV9yaWdodDogKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbmVuZFxuXG5tb2R1bGUgQXJyYXkwID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0ID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3x8XVxuICBsZXQgZ2V0IGFyciA9IEdlbmFycmF5LmdldCBhcnIgW3x8XVxuICBsZXQgc2V0IGFyciA9IEdlbmFycmF5LnNldCBhcnIgW3x8XVxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9IGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpXG5cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcblxuICBsZXQgb2ZfdmFsdWUga2luZCBsYXlvdXQgdiA9XG4gICAgbGV0IGEgPSBjcmVhdGUga2luZCBsYXlvdXQgaW5cbiAgICBzZXQgYSB2O1xuICAgIGFcbiAgbGV0IGluaXQgPSBvZl92YWx1ZVxuZW5kXG5cbm1vZHVsZSBBcnJheTEgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW18XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzFcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMVwiXG4gIGV4dGVybmFsIGRpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbSBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsICdjKSB0ID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZSAodHlwZSB0KSAoYSA6IChfLCBfLCB0KSBHZW5hcnJheS50KSBuID1cbiAgICBtYXRjaCBsYXlvdXQgYSB3aXRoXG4gICAgfCBDX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiAoR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XTogKF8sIF8sIHQpIEdlbmFycmF5LnQpXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbSBmID1cbiAgICBmb3IgaSA9IDEgdG8gZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0gZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgKEFycmF5Lmxlbmd0aCBkYXRhKSBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGRhdGEgLSAxIGRvIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIGRhdGEuKGkpIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkyID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMnxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzJcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzJcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzJcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfMlwiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0IGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHQgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogKGYgaSBqKVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTIub2ZfYXJyYXk6IG5vbi1yZWN0YW5ndWxhciBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSByb3cuKGopXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTMgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTI7IGRpbTN8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfM1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfc2V0XzNcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8zXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBkaW0zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8zXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltMSBhcnIpICogKGRpbTIgYXJyKSAqIChkaW0zIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfcmlnaHRfMSBhIG4gbSA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX2xlZnRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG58XVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIGZvciBrID0gMCB0byBwcmVkIGRpbTMgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGsgPSAxIHRvIGRpbTMgZG9cbiAgICAgIGZvciBqID0gMSB0byBkaW0yIGRvXG4gICAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGRpbTEgPSBBcnJheS5sZW5ndGggZGF0YSBpblxuICAgIGxldCBkaW0yID0gaWYgZGltMSA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApIGluXG4gICAgbGV0IGRpbTMgPSBpZiBkaW0yID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkuKDApIGluXG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgbGV0IGNvbCA9IHJvdy4oaikgaW5cbiAgICAgICAgaWYgQXJyYXkubGVuZ3RoIGNvbCA8PiBkaW0zIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5My5vZl9hcnJheTogbm9uLWN1YmljIGRhdGFcIik7XG4gICAgICAgIGZvciBrID0gMCB0byBkaW0zIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYmEgKGkgKyBvZnMpIChqICsgb2ZzKSAoayArIG9mcykgY29sLihrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICBiYVxuZW5kXG5cbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MDogKCdhLCAnYiwgJ2MpIEFycmF5MC50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MTogKCdhLCAnYiwgJ2MpIEFycmF5MS50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MjogKCdhLCAnYiwgJ2MpIEFycmF5Mi50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGdlbmFycmF5X29mX2FycmF5MzogKCdhLCAnYiwgJ2MpIEFycmF5My50IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiJWlkZW50aXR5XCJcbmxldCBhcnJheTBfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAwIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkwX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTFfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAxIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkxX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTJfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAyIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkyX29mX2dlbmFycmF5XCJcbmxldCBhcnJheTNfb2ZfZ2VuYXJyYXkgYSA9XG4gIGlmIEdlbmFycmF5Lm51bV9kaW1zIGEgPSAzIHRoZW4gYVxuICBlbHNlIGludmFsaWRfYXJnIFwiQmlnYXJyYXkuYXJyYXkzX29mX2dlbmFycmF5XCJcblxuZXh0ZXJuYWwgcmVzaGFwZTpcbiAgICgnYSwgJ2IsICdjKSBHZW5hcnJheS50IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcImNhbWxfYmFfcmVzaGFwZVwiXG5sZXQgcmVzaGFwZV8wIGEgPSByZXNoYXBlIGEgW3x8XVxubGV0IHJlc2hhcGVfMSBhIGRpbTEgPSByZXNoYXBlIGEgW3xkaW0xfF1cbmxldCByZXNoYXBlXzIgYSBkaW0xIGRpbTIgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTJ8XVxubGV0IHJlc2hhcGVfMyBhIGRpbTEgZGltMiBkaW0zID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yO2RpbTN8XVxuXG4oKiBGb3JjZSBjYW1sX2JhX2dldF97MSwyLDMsTn0gdG8gYmUgbGlua2VkIGluLCBzaW5jZSB3ZSBkb24ndCByZWZlclxuICAgdG8gdGhvc2UgcHJpbWl0aXZlcyBkaXJlY3RseSBpbiB0aGlzIGZpbGUgKilcblxubGV0IF8gPVxuICBsZXQgXyA9IEdlbmFycmF5LmdldCBpblxuICBsZXQgXyA9IEFycmF5MS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTIuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkzLmdldCBpblxuICAoKVxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMlwiXVxuZXh0ZXJuYWwgZ2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8xXCJcbmV4dGVybmFsIGdldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMlwiXG5leHRlcm5hbCBnZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzNcIlxuZXh0ZXJuYWwgc2V0MTogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8xXCJcbmV4dGVybmFsIHNldDI6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMlwiXG5leHRlcm5hbCBzZXQzOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzNcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAqKVxuKCogICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ2FtYml1bSwgQ29sbGVnZSBkZSBGcmFuY2UgYW5kIElucmlhICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBQc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKilcblxuZXh0ZXJuYWwgcmFuZG9tX3NlZWQ6IHVuaXQgLT4gaW50IGFycmF5ID0gXCJjYW1sX3N5c19yYW5kb21fc2VlZFwiXG5cbm1vZHVsZSBTdGF0ZSA9IHN0cnVjdFxuXG4gIG9wZW4gQmlnYXJyYXlcblxuICB0eXBlIHQgPSAoaW50NjQsIGludDY0X2VsdCwgY19sYXlvdXQpIEFycmF5MS50XG5cbiAgZXh0ZXJuYWwgbmV4dDogdCAtPiAoaW50NjRbQHVuYm94ZWRdKVxuICAgICAgPSBcImNhbWxfbHhtX25leHRcIiBcImNhbWxfbHhtX25leHRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5cbiAgbGV0IGNyZWF0ZSAoKSA6IHQgPVxuICAgIEFycmF5MS5jcmVhdGUgSW50NjQgQ19sYXlvdXQgNFxuXG4gIGxldCBzZXQgcyBpMSBpMiBpMyBpNCA9XG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAwIChJbnQ2NC5sb2dvciBpMSAxTCk7ICgqIG11c3QgYmUgb2RkICopXG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAxIGkyO1xuICAgIEFycmF5MS51bnNhZmVfc2V0IHMgMiAoaWYgaTMgPD4gMEwgdGhlbiBpMyBlbHNlIDFMKTsgKCogbXVzdCBub3QgYmUgMCAqKVxuICAgIEFycmF5MS51bnNhZmVfc2V0IHMgMyAoaWYgaTQgPD4gMEwgdGhlbiBpNCBlbHNlIDJMKSAoKiBtdXN0IG5vdCBiZSAwICopXG5cbiAgbGV0IG1rIGkxIGkyIGkzIGk0ID1cbiAgICBsZXQgcyA9IGNyZWF0ZSAoKSBpblxuICAgIHNldCBzIGkxIGkyIGkzIGk0OyBzXG5cbiAgbGV0IGFzc2lnbiAoZHN0OiB0KSAoc3JjOiB0KSA9XG4gICAgQXJyYXkxLmJsaXQgc3JjIGRzdFxuXG4gIGxldCBjb3B5IHMgPVxuICAgIGxldCBzJyA9IGNyZWF0ZSgpIGluIGFzc2lnbiBzJyBzOyBzJ1xuXG4gICgqIFRoZSBzZWVkIGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgSXQgY2FuIGJlIGp1c3Qgb25lIGludGVnZXIsXG4gICAgIGJ1dCBpdCBjYW4gYWxzbyBiZSAxMiBvciBtb3JlIGJ5dGVzLiAgVG8gaGlkZSB0aGUgZGlmZmVyZW5jZSxcbiAgICAgd2Ugc2VyaWFsaXplIHRoZSBhcnJheSBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzLCB0aGVuIGhhc2ggdGhlXG4gICAgIHNlcXVlbmNlIHdpdGggTUQ1IChEaWdlc3QuYnl0ZXMpLiAgTUQ1IGdpdmVzIG9ubHkgMTI4IGJpdHMgd2hpbGVcbiAgICAgd2UgbmVlZCAyNTYgYml0cywgc28gd2UgaGFzaCB0d2ljZSB3aXRoIGRpZmZlcmVudCBzdWZmaXhlcy4gKilcbiAgbGV0IHJlaW5pdCBzIHNlZWQgPVxuICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIHNlZWQgaW5cbiAgICBsZXQgYiA9IEJ5dGVzLmNyZWF0ZSAobiAqIDggKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBuLTEgZG9cbiAgICAgIEJ5dGVzLnNldF9pbnQ2NF9sZSBiIChpICogOCkgKEludDY0Lm9mX2ludCBzZWVkLihpKSlcbiAgICBkb25lO1xuICAgIEJ5dGVzLnNldCBiIChuICogOCkgJ1xceDAxJztcbiAgICBsZXQgZDEgPSBEaWdlc3QuYnl0ZXMgYiBpblxuICAgIEJ5dGVzLnNldCBiIChuICogOCkgJ1xceDAyJztcbiAgICBsZXQgZDIgPSBEaWdlc3QuYnl0ZXMgYiBpblxuICAgIHNldCBzIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQxIDApXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDEgOClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMiAwKVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQyIDgpXG5cbiAgbGV0IG1ha2Ugc2VlZCA9XG4gICAgbGV0IHMgPSBjcmVhdGUoKSBpbiByZWluaXQgcyBzZWVkOyBzXG5cbiAgbGV0IG1ha2Vfc2VsZl9pbml0ICgpID1cbiAgICBtYWtlIChyYW5kb21fc2VlZCAoKSlcblxuICAoKiBSZXR1cm4gMzAgcmFuZG9tIGJpdHMgYXMgYW4gaW50ZWdlciAwIDw9IHggPCAxMDczNzQxODI0ICopXG4gIGxldCBiaXRzIHMgPVxuICAgIEludDY0LnRvX2ludCAobmV4dCBzKSBsYW5kIDB4M0ZGRl9GRkZGXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKSAqKVxuICBsZXQgcmVjIGludGF1eCBzIG4gPVxuICAgIGxldCByID0gYml0cyBzIGluXG4gICAgbGV0IHYgPSByIG1vZCBuIGluXG4gICAgaWYgciAtIHYgPiAweDNGRkZGRkZGIC0gbiArIDEgdGhlbiBpbnRhdXggcyBuIGVsc2UgdlxuXG4gIGxldCBpbnQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPiAweDNGRkZGRkZGIHx8IGJvdW5kIDw9IDBcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludFwiXG4gICAgZWxzZSBpbnRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuXG4gICAgIFtib3VuZF0gbWF5IGJlIGFueSBwb3NpdGl2ZSBbaW50XS4gKilcbiAgbGV0IHJlYyBpbnQ2M2F1eCBzIG4gPVxuICAgIGxldCByID0gSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgbWF4X2ludCBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgIGlmIHIgLSB2ID4gbWF4X2ludCAtIG4gKyAxIHRoZW4gaW50NjNhdXggcyBuIGVsc2UgdlxuXG4gIGxldCBmdWxsX2ludCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiUmFuZG9tLmZ1bGxfaW50XCJcbiAgICBlbHNlIGlmIGJvdW5kID4gMHgzRkZGRkZGRiB0aGVuXG4gICAgICBpbnQ2M2F1eCBzIGJvdW5kXG4gICAgZWxzZVxuICAgICAgaW50YXV4IHMgYm91bmRcblxuICAoKiBSZXR1cm4gMzIgcmFuZG9tIGJpdHMgYXMgYW4gW2ludDMyXSAqKVxuICBsZXQgYml0czMyIHMgPVxuICAgIEludDY0LnRvX2ludDMyIChuZXh0IHMpXG5cbiAgKCogUmV0dXJuIGFuIFtpbnQzMl0gYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS4gKilcbiAgbGV0IHJlYyBpbnQzMmF1eCBzIG4gPVxuICAgIGxldCByID0gSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbCAoYml0czMyIHMpIDEgaW5cbiAgICBsZXQgdiA9IEludDMyLnJlbSByIG4gaW5cbiAgICBpZiBJbnQzMi4oc3ViIHIgdiA+IGFkZCAoc3ViIG1heF9pbnQgbikgMWwpXG4gICAgdGhlbiBpbnQzMmF1eCBzIG5cbiAgICBlbHNlIHZcblxuICBsZXQgaW50MzIgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMGxcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludDMyXCJcbiAgICBlbHNlIGludDMyYXV4IHMgYm91bmRcblxuICAoKiBSZXR1cm4gNjQgcmFuZG9tIGJpdHMgYXMgYW4gW2ludDY0XSAqKVxuICBsZXQgYml0czY0IHMgPVxuICAgIG5leHQgc1xuXG4gICgqIFJldHVybiBhbiBbaW50NjRdIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuICopXG4gIGxldCByZWMgaW50NjRhdXggcyBuID1cbiAgICBsZXQgciA9IEludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJpdHM2NCBzKSAxIGluXG4gICAgbGV0IHYgPSBJbnQ2NC5yZW0gciBuIGluXG4gICAgaWYgSW50NjQuKHN1YiByIHYgPiBhZGQgKHN1YiBtYXhfaW50IG4pIDFMKVxuICAgIHRoZW4gaW50NjRhdXggcyBuXG4gICAgZWxzZSB2XG5cbiAgbGV0IGludDY0IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kIDw9IDBMXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlJhbmRvbS5pbnQ2NFwiXG4gICAgZWxzZSBpbnQ2NGF1eCBzIGJvdW5kXG5cbiAgKCogUmV0dXJuIDMyIG9yIDY0IHJhbmRvbSBiaXRzIGFzIGEgW25hdGl2ZWludF0gKilcbiAgbGV0IG5hdGl2ZWJpdHMgPVxuICAgIGlmIE5hdGl2ZWludC5zaXplID0gMzJcbiAgICB0aGVuIGZ1biBzIC0+IE5hdGl2ZWludC5vZl9pbnQzMiAoYml0czMyIHMpXG4gICAgZWxzZSBmdW4gcyAtPiBJbnQ2NC50b19uYXRpdmVpbnQgKGJpdHM2NCBzKVxuXG4gICgqIFJldHVybiBhIFtuYXRpdmVpbnRdIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuICopXG4gIGxldCBuYXRpdmVpbnQgPVxuICAgIGlmIE5hdGl2ZWludC5zaXplID0gMzJcbiAgICB0aGVuIGZ1biBzIGJvdW5kIC0+IE5hdGl2ZWludC5vZl9pbnQzMiAoaW50MzIgcyAoTmF0aXZlaW50LnRvX2ludDMyIGJvdW5kKSlcbiAgICBlbHNlIGZ1biBzIGJvdW5kIC0+IEludDY0LnRvX25hdGl2ZWludCAoaW50NjQgcyAoSW50NjQub2ZfbmF0aXZlaW50IGJvdW5kKSlcblxuICAoKiBSZXR1cm4gYSBmbG9hdCAwIDwgeCA8IDEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGFtb25nIHRoZVxuICAgICBtdWx0aXBsZXMgb2YgMl4tNTMgKilcbiAgbGV0IHJlYyByYXdmbG9hdCBzID1cbiAgICBsZXQgYiA9IG5leHQgcyBpblxuICAgIGxldCBuID0gSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCBiIDExIGluXG4gICAgaWYgbiA8PiAwTCB0aGVuIEludDY0LnRvX2Zsb2F0IG4gKi4gMHgxLnAtNTMgZWxzZSByYXdmbG9hdCBzXG5cbiAgKCogUmV0dXJuIGEgZmxvYXQgYmV0d2VlbiAwIGFuZCBbYm91bmRdICopXG4gIGxldCBmbG9hdCBzIGJvdW5kID0gcmF3ZmxvYXQgcyAqLiBib3VuZFxuXG4gICgqIFJldHVybiBhIHJhbmRvbSBCb29sZWFuICopXG4gIGxldCBib29sIHMgPSBuZXh0IHMgPCAwTFxuXG4gICgqIFNwbGl0IGEgbmV3IFBSTkcgb2ZmIHRoZSBnaXZlbiBQUk5HICopXG4gIGxldCBzcGxpdCBzID1cbiAgICBsZXQgaTEgPSBiaXRzNjQgcyBpbiBsZXQgaTIgPSBiaXRzNjQgcyBpblxuICAgIGxldCBpMyA9IGJpdHM2NCBzIGluIGxldCBpNCA9IGJpdHM2NCBzIGluXG4gICAgbWsgaTEgaTIgaTMgaTRcbmVuZFxuXG5sZXQgbWtfZGVmYXVsdCAoKSA9XG4gICgqIFRoaXMgaXMgdGhlIHN0YXRlIG9idGFpbmVkIHdpdGggW1N0YXRlLm1ha2UgW3wgMzE0MTU5MjY1IHxdXS4gKilcbiAgU3RhdGUubWsgKC02MTk2ODc0Mjg5NTY3NzA1MDk3TClcbiAgICAgICAgICAgNTg2NTczMjQ5ODMzNzEzMTg5TFxuICAgICAgICAgICAoLTg1OTEyNjg4MDM4NjUwNDM0MDdMKVxuICAgICAgICAgICA2Mzg4NjEzNTk1ODQ5NzcyMDQ0TFxuXG5sZXQgcmFuZG9tX2tleSA9XG4gIERvbWFpbi5ETFMubmV3X2tleSB+c3BsaXRfZnJvbV9wYXJlbnQ6U3RhdGUuc3BsaXQgbWtfZGVmYXVsdFxuXG5sZXQgYml0cyAoKSA9IFN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgaW50IGJvdW5kID0gU3RhdGUuaW50IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGZ1bGxfaW50IGJvdW5kID0gU3RhdGUuZnVsbF9pbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgaW50MzIgYm91bmQgPSBTdGF0ZS5pbnQzMiAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBuYXRpdmVpbnQgYm91bmQgPSBTdGF0ZS5uYXRpdmVpbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgaW50NjQgYm91bmQgPSBTdGF0ZS5pbnQ2NCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBmbG9hdCBzY2FsZSA9IFN0YXRlLmZsb2F0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzY2FsZVxubGV0IGJvb2wgKCkgPSBTdGF0ZS5ib29sIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IGJpdHMzMiAoKSA9IFN0YXRlLmJpdHMzMiAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBiaXRzNjQgKCkgPSBTdGF0ZS5iaXRzNjQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgbmF0aXZlYml0cyAoKSA9IFN0YXRlLm5hdGl2ZWJpdHMgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5cbmxldCBmdWxsX2luaXQgc2VlZCA9IFN0YXRlLnJlaW5pdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc2VlZFxubGV0IGluaXQgc2VlZCA9IGZ1bGxfaW5pdCBbfCBzZWVkIHxdXG5sZXQgc2VsZl9pbml0ICgpID0gZnVsbF9pbml0IChyYW5kb21fc2VlZCgpKVxuXG4oKiBTcGxpdHRpbmcgKilcblxubGV0IHNwbGl0ICgpID0gU3RhdGUuc3BsaXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5cbigqIE1hbmlwdWxhdGluZyB0aGUgY3VycmVudCBzdGF0ZS4gKilcblxubGV0IGdldF9zdGF0ZSAoKSA9IFN0YXRlLmNvcHkgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgc2V0X3N0YXRlIHMgPSBTdGF0ZS5hc3NpZ24gKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSGFzaCB0YWJsZXMgKilcblxuKCogV2UgZG8gZHluYW1pYyBoYXNoaW5nLCBhbmQgcmVzaXplIHRoZSB0YWJsZSBhbmQgcmVoYXNoIHRoZSBlbGVtZW50c1xuICAgd2hlbiB0aGUgbG9hZCBmYWN0b3IgYmVjb21lcyB0b28gaGlnaC4gKilcblxudHlwZSAoJ2EsICdiKSB0ID1cbiAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgIG11dGFibGUgZGF0YTogKCdhLCAnYikgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgbXV0YWJsZSBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gIH1cblxuYW5kICgnYSwgJ2IpIGJ1Y2tldGxpc3QgPVxuICAgIEVtcHR5XG4gIHwgQ29ucyBvZiB7IG11dGFibGUga2V5OiAnYTtcbiAgICAgICAgICAgICAgbXV0YWJsZSBkYXRhOiAnYjtcbiAgICAgICAgICAgICAgbXV0YWJsZSBuZXh0OiAoJ2EsICdiKSBidWNrZXRsaXN0IH1cblxuKCogVGhlIHNpZ24gb2YgaW5pdGlhbF9zaXplIGVuY29kZXMgdGhlIGZhY3QgdGhhdCBhIHRyYXZlcnNhbCBpc1xuICAgb25nb2luZyBvciBub3QuXG5cbiAgIFRoaXMgZGlzYWJsZXMgdGhlIGVmZmljaWVudCBpbiBwbGFjZSBpbXBsZW1lbnRhdGlvbiBvZiByZXNpemluZy5cbiopXG5cbmxldCBvbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gIHx8IGguaW5pdGlhbF9zaXplIDwgMFxuXG5sZXQgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoID1cbiAgaC5pbml0aWFsX3NpemUgPC0gLSBoLmluaXRpYWxfc2l6ZVxuXG4oKiBUbyBwaWNrIHJhbmRvbSBzZWVkcyBpZiByZXF1ZXN0ZWQgKilcblxubGV0IHJhbmRvbWl6ZWRfZGVmYXVsdCA9XG4gIGxldCBwYXJhbXMgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJDQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPiBcIlwiIGluXG4gIFN0cmluZy5jb250YWlucyBwYXJhbXMgJ1InXG5cbmxldCByYW5kb21pemVkID0gQXRvbWljLm1ha2UgcmFuZG9taXplZF9kZWZhdWx0XG5cbmxldCByYW5kb21pemUgKCkgPSBBdG9taWMuc2V0IHJhbmRvbWl6ZWQgdHJ1ZVxubGV0IGlzX3JhbmRvbWl6ZWQgKCkgPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWRcblxubGV0IHBybmdfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdFxuXG4oKiBGdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGJlZm9yZSB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgbXVzdCBlaXRoZXIgYmVcbiAgIGluZGVwZW5kZW50IG9mIHRoZSBoYXNoIGZ1bmN0aW9uIG9yIHRha2UgaXQgYXMgYSBwYXJhbWV0ZXIgKHNlZSAjMjIwMiBhbmRcbiAgIGNvZGUgYmVsb3cgdGhlIGZ1bmN0b3IgZGVmaW5pdGlvbnMuICopXG5cbigqIENyZWF0aW5nIGEgZnJlc2gsIGVtcHR5IHRhYmxlICopXG5cbmxldCByZWMgcG93ZXJfMl9hYm92ZSB4IG4gPVxuICBpZiB4ID49IG4gdGhlbiB4XG4gIGVsc2UgaWYgeCAqIDIgPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIHhcbiAgZWxzZSBwb3dlcl8yX2Fib3ZlICh4ICogMikgblxuXG5sZXQgY3JlYXRlID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBpbml0aWFsX3NpemUgPVxuICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgaW5pdGlhbF9zaXplIGluXG4gIGxldCBzZWVkID1cbiAgICBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkpIGVsc2UgMFxuICBpblxuICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbmxldCBjbGVhciBoID1cbiAgaWYgaC5zaXplID4gMCB0aGVuIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgQXJyYXkuZmlsbCBoLmRhdGEgMCAoQXJyYXkubGVuZ3RoIGguZGF0YSkgRW1wdHlcbiAgZW5kXG5cbmxldCByZXNldCBoID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpIDwgNCAoKiBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGhhc2ggdGFibGVzICopXG4gICAgfHwgbGVuID0gYWJzIGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICBjbGVhciBoXG4gIGVsc2UgYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSAoYWJzIGguaW5pdGlhbF9zaXplKSBFbXB0eVxuICBlbmRcblxubGV0IGNvcHlfYnVja2V0bGlzdCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gRW1wdHlcbiAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICBsZXQgcmVjIGxvb3AgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgQ29ucyBwcmVjIC0+ICBwcmVjLm5leHQgPC0gclxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgbG9vcCByIG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgciA9IENvbnMge2tleTsgZGF0YTsgbmV4dH0gaW5cbiAgICAgIGxvb3AgciBuZXh0O1xuICAgICAgclxuXG5sZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5Lm1hcCBjb3B5X2J1Y2tldGxpc3QgaC5kYXRhIH1cblxubGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbmxldCBpbnNlcnRfYWxsX2J1Y2tldHMgaW5kZXhmdW4gaW5wbGFjZSBvZGF0YSBuZGF0YSA9XG4gIGxldCBuc2l6ZSA9IEFycmF5Lmxlbmd0aCBuZGF0YSBpblxuICBsZXQgbmRhdGFfdGFpbCA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGFzIGNlbGwgLT5cbiAgICAgICAgbGV0IGNlbGwgPVxuICAgICAgICAgIGlmIGlucGxhY2UgdGhlbiBjZWxsXG4gICAgICAgICAgZWxzZSBDb25zIHtrZXk7IGRhdGE7IG5leHQgPSBFbXB0eX1cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG5pZHggPSBpbmRleGZ1biBrZXkgaW5cbiAgICAgICAgYmVnaW4gbWF0Y2ggbmRhdGFfdGFpbC4obmlkeCkgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IG5kYXRhLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gY2VsbDtcbiAgICAgICAgZW5kO1xuICAgICAgICBuZGF0YV90YWlsLihuaWR4KSA8LSBjZWxsO1xuICAgICAgICBpbnNlcnRfYnVja2V0IG5leHRcbiAgaW5cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvZGF0YSAtIDEgZG9cbiAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICBkb25lO1xuICBpZiBpbnBsYWNlIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbnNpemUgLSAxIGRvXG4gICAgICBtYXRjaCBuZGF0YV90YWlsLihpKSB3aXRoXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IENvbnMgdGFpbCAtPiB0YWlsLm5leHQgPC0gRW1wdHlcbiAgICBkb25lXG5cbmxldCByZXNpemUgaW5kZXhmdW4gaCA9XG4gIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBiZWdpblxuICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICBsZXQgaW5wbGFjZSA9IG5vdCAob25nb2luZ190cmF2ZXJzYWwgaCkgaW5cbiAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICAgICgqIHNvIHRoYXQgaW5kZXhmdW4gc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgIGluc2VydF9hbGxfYnVja2V0cyAoaW5kZXhmdW4gaCkgaW5wbGFjZSBvZGF0YSBuZGF0YVxuICBlbmRcblxubGV0IGl0ZXIgZiBoID1cbiAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKClcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBmIGtleSBkYXRhOyBkb19idWNrZXQgbmV4dCBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBkb19idWNrZXQgZC4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCByZWMgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBFbXB0eVxuICAgICAgZW5kXG4gIHwgKENvbnMgKHtrZXk7IGRhdGE7IG5leHR9IGFzIGMpKSBhcyBzbG90IC0+XG4gICAgICBiZWdpbiBtYXRjaCBmIGtleSBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyBuZXh0XG4gICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBzbG90XG4gICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIHNsb3RcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgYy5kYXRhIDwtIGRhdGE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBzbG90IG5leHRcbiAgICAgIGVuZFxuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIGYgaCA9XG4gIGxldCBkID0gaC5kYXRhIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIEVtcHR5IGguZGF0YS4oaSlcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaFxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IGZvbGQgZiBoIGluaXQgPVxuICBsZXQgcmVjIGRvX2J1Y2tldCBiIGFjY3UgPVxuICAgIG1hdGNoIGIgd2l0aFxuICAgICAgRW1wdHkgLT5cbiAgICAgICAgYWNjdVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGRvX2J1Y2tldCBuZXh0IChmIGtleSBkYXRhIGFjY3UpIGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGxldCBhY2N1ID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICBhY2N1IDo9IGRvX2J1Y2tldCBkLihpKSAhYWNjdVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgICFhY2N1XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG50eXBlIHN0YXRpc3RpY3MgPSB7XG4gIG51bV9iaW5kaW5nczogaW50O1xuICBudW1fYnVja2V0czogaW50O1xuICBtYXhfYnVja2V0X2xlbmd0aDogaW50O1xuICBidWNrZXRfaGlzdG9ncmFtOiBpbnQgYXJyYXlcbn1cblxubGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFjY3VcbiAgfCBDb25ze25leHR9IC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSBuZXh0XG5cbmxldCBzdGF0cyBoID1cbiAgbGV0IG1ibCA9XG4gICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gIEFycmF5Lml0ZXJcbiAgICAoZnVuIGIgLT5cbiAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgIGguZGF0YTtcbiAgeyBudW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgdGJsID1cbiAgKCogY2FwdHVyZSBjdXJyZW50IGFycmF5LCBzbyB0aGF0IGV2ZW4gaWYgdGhlIHRhYmxlIGlzIHJlc2l6ZWQgd2VcbiAgICAga2VlcCBpdGVyYXRpbmcgb24gdGhlIHNhbWUgYXJyYXkgKilcbiAgbGV0IHRibF9kYXRhID0gdGJsLmRhdGEgaW5cbiAgKCogc3RhdGU6IGluZGV4ICogbmV4dCBidWNrZXQgdG8gdHJhdmVyc2UgKilcbiAgbGV0IHJlYyBhdXggaSBidWNrICgpID0gbWF0Y2ggYnVjayB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBpZiBpID0gQXJyYXkubGVuZ3RoIHRibF9kYXRhXG4gICAgICAgIHRoZW4gU2VxLk5pbFxuICAgICAgICBlbHNlIGF1eChpKzEpIHRibF9kYXRhLihpKSAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBTZXEuQ29ucyAoKGtleSwgZGF0YSksIGF1eCBpIG5leHQpXG4gIGluXG4gIGF1eCAwIEVtcHR5XG5cbmxldCB0b19zZXFfa2V5cyBtID0gU2VxLm1hcCBmc3QgKHRvX3NlcSBtKVxuXG5sZXQgdG9fc2VxX3ZhbHVlcyBtID0gU2VxLm1hcCBzbmQgKHRvX3NlcSBtKVxuXG4oKiBGdW5jdG9yaWFsIGludGVyZmFjZSAqKVxuXG5tb2R1bGUgdHlwZSBIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBoYXNoOiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgc2VlZGVkX2hhc2g6IGludCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGU6IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHk6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQ6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgcmVtb3ZlOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQ6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGw6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGg6ICdhIHQgLT4gaW50XG4gICAgdmFsIHN0YXRzOiAnYSB0IC0+IHN0YXRpc3RpY3NcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9rZXlzIDogXyB0IC0+IGtleSBTZXEudFxuICAgIHZhbCB0b19zZXFfdmFsdWVzIDogJ2EgdCAtPiAnYSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFNlZWRlZFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISdhIHRcbiAgICB2YWwgY3JlYXRlIDogP3JhbmRvbTpib29sIC0+IGludCAtPiAnYSB0XG4gICAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gICAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gICAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXIgOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2U6IChrZXkgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZCA6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIE1ha2VTZWVkZWQoSDogU2VlZGVkSGFzaGVkVHlwZSk6IChTZWVkZWRTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgdHlwZSBrZXkgPSBILnRcbiAgICB0eXBlICdhIGhhc2h0YmwgPSAoa2V5LCAnYSkgdFxuICAgIHR5cGUgJ2EgdCA9ICdhIGhhc2h0YmxcbiAgICBsZXQgY3JlYXRlID0gY3JlYXRlXG4gICAgbGV0IGNsZWFyID0gY2xlYXJcbiAgICBsZXQgcmVzZXQgPSByZXNldFxuICAgIGxldCBjb3B5ID0gY29weVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGtleSA9XG4gICAgICAoSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5KSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBhZGQgaCBrZXkgZGF0YSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgbGV0IGJ1Y2tldCA9IENvbnN7a2V5OyBkYXRhOyBuZXh0PWguZGF0YS4oaSl9IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuXG4gICAgbGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGJlZ2luXG4gICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBuZXh0XG4gICAgICAgICAgZW5kXG4gICAgICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlYyBrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBkYXRhIGVsc2UgZmluZF9yZWMga2V5IG5leHRcblxuICAgIGxldCBmaW5kIGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMSB0aGVuIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMiB0aGVuIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazMgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgayB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBTb21lIGQxIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBTb21lIGQyIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gU29tZSBkMyBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dDNcblxuICAgIGxldCBmaW5kX2FsbCBoIGtleSA9XG4gICAgICBsZXQgcmVjIGZpbmRfaW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBbXVxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhPWQ7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrIGtleVxuICAgICAgICAgIHRoZW4gZCA6OiBmaW5kX2luX2J1Y2tldCBuZXh0XG4gICAgICAgICAgZWxzZSBmaW5kX2luX2J1Y2tldCBuZXh0IGluXG4gICAgICBmaW5kX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCByZWMgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHRydWVcbiAgICAgIHwgQ29ucyAoe2tleT1rOyBuZXh0fSBhcyBzbG90KSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIChzbG90LmtleSA8LSBrZXk7IHNsb3QuZGF0YSA8LSBkYXRhOyBmYWxzZSlcbiAgICAgICAgICBlbHNlIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIG5leHRcblxuICAgIGxldCByZXBsYWNlIGgga2V5IGRhdGEgPVxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgICAgIGxldCBsID0gaC5kYXRhLihpKSBpblxuICAgICAgaWYgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbCB0aGVuIGJlZ2luXG4gICAgICAgIGguZGF0YS4oaSkgPC0gQ29uc3trZXk7IGRhdGE7IG5leHQ9bH07XG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG4gICAgICBlbmRcblxuICAgIGxldCBtZW0gaCBrZXkgPVxuICAgICAgbGV0IHJlYyBtZW1faW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25ze2tleT1rOyBuZXh0fSAtPlxuICAgICAgICAgIEguZXF1YWwgayBrZXkgfHwgbWVtX2luX2J1Y2tldCBuZXh0IGluXG4gICAgICBtZW1faW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG4gICAgbGV0IGFkZF9zZXEgdGJsIGkgPVxuICAgICAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiBhZGQgdGJsIGsgdikgaVxuXG4gICAgbGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gcmVwbGFjZSB0YmwgayB2KSBpXG5cbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcblxuICAgIGxldCBpdGVyID0gaXRlclxuICAgIGxldCBmaWx0ZXJfbWFwX2lucGxhY2UgPSBmaWx0ZXJfbWFwX2lucGxhY2VcbiAgICBsZXQgZm9sZCA9IGZvbGRcbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgbGV0IHN0YXRzID0gc3RhdHNcbiAgICBsZXQgdG9fc2VxID0gdG9fc2VxXG4gICAgbGV0IHRvX3NlcV9rZXlzID0gdG9fc2VxX2tleXNcbiAgICBsZXQgdG9fc2VxX3ZhbHVlcyA9IHRvX3NlcV92YWx1ZXNcbiAgZW5kXG5cbm1vZHVsZSBNYWtlKEg6IEhhc2hlZFR5cGUpOiAoUyB3aXRoIHR5cGUga2V5ID0gSC50KSA9XG4gIHN0cnVjdFxuICAgIGluY2x1ZGUgTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgICAgdHlwZSB0ID0gSC50XG4gICAgICAgIGxldCBlcXVhbCA9IEguZXF1YWxcbiAgICAgICAgbGV0IHNlZWRlZF9oYXNoIChfc2VlZDogaW50KSB4ID0gSC5oYXNoIHhcbiAgICAgIGVuZClcbiAgICBsZXQgY3JlYXRlIHN6ID0gY3JlYXRlIH5yYW5kb206ZmFsc2Ugc3pcbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcbiAgZW5kXG5cbigqIFBvbHltb3JwaGljIGhhc2ggZnVuY3Rpb24tYmFzZWQgdGFibGVzICopXG4oKiBDb2RlIGluY2x1ZGVkIGJlbG93IHRoZSBmdW5jdG9yaWFsIGludGVyZmFjZSB0byBndWFyZCBhZ2FpbnN0IGFjY2lkZW50YWxcbiAgIHVzZSAtIHNlZSAjMjIwMiAqKVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6XG4gIGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IGludCA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cblxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCAwIHhcbmxldCBoYXNoX3BhcmFtIG4xIG4yIHggPSBzZWVkZWRfaGFzaF9wYXJhbSBuMSBuMiAwIHhcbmxldCBzZWVkZWRfaGFzaCBzZWVkIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgc2VlZCB4XG5cbmxldCBrZXlfaW5kZXggaCBrZXkgPVxuICBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNFxuICB0aGVuIChzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgaC5zZWVkIGtleSkgbGFuZCAoQXJyYXkubGVuZ3RoIGguZGF0YSAtIDEpXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJIYXNodGJsOiB1bnN1cHBvcnRlZCBoYXNoIHRhYmxlIGZvcm1hdFwiXG5cbmxldCBhZGQgaCBrZXkgZGF0YSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIGxldCBidWNrZXQgPSBDb25ze2tleTsgZGF0YTsgbmV4dD1oLmRhdGEuKGkpfSBpblxuICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcblxubGV0IHJlYyByZW1vdmVfYnVja2V0IGggaSBrZXkgcHJlYyA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgICgpXG4gIHwgKENvbnMge2tleT1rOyBuZXh0fSkgYXMgYyAtPlxuICAgICAgaWYgY29tcGFyZSBrIGtleSA9IDBcbiAgICAgIHRoZW4gYmVnaW5cbiAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgIG1hdGNoIHByZWMgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gbmV4dFxuICAgICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gbmV4dFxuICAgICAgZW5kXG4gICAgICBlbHNlIHJlbW92ZV9idWNrZXQgaCBpIGtleSBjIG5leHRcblxubGV0IHJlbW92ZSBoIGtleSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIHJlbW92ZV9idWNrZXQgaCBpIGtleSBFbXB0eSBoLmRhdGEuKGkpXG5cbmxldCByZWMgZmluZF9yZWMga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsgPSAwIHRoZW4gZGF0YSBlbHNlIGZpbmRfcmVjIGtleSBuZXh0XG5cbmxldCBmaW5kIGgga2V5ID1cbiAgbWF0Y2ggaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpIHdpdGhcbiAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIGQxIGVsc2VcbiAgICAgIG1hdGNoIG5leHQxIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIGQyIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MiB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBkMyBlbHNlIGZpbmRfcmVjIGtleSBuZXh0M1xuXG5sZXQgcmVjIGZpbmRfcmVjX29wdCBrZXkgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBOb25lXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsgPSAwIHRoZW4gU29tZSBkYXRhIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0XG5cbmxldCBmaW5kX29wdCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gTm9uZVxuICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgaWYgY29tcGFyZSBrZXkgazEgPSAwIHRoZW4gU29tZSBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgaWYgY29tcGFyZSBrZXkgazIgPSAwIHRoZW4gU29tZSBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGszID0gMCB0aGVuIFNvbWUgZDMgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHQzXG5cbmxldCBmaW5kX2FsbCBoIGtleSA9XG4gIGxldCByZWMgZmluZF9pbl9idWNrZXQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBbXVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGsga2V5ID0gMFxuICAgICAgdGhlbiBkYXRhIDo6IGZpbmRfaW5fYnVja2V0IG5leHRcbiAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICBmaW5kX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxubGV0IHJlYyByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh7a2V5PWs7IG5leHR9IGFzIHNsb3QpIC0+XG4gICAgICBpZiBjb21wYXJlIGsga2V5ID0gMFxuICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICBlbHNlIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIG5leHRcblxubGV0IHJlcGxhY2UgaCBrZXkgZGF0YSA9XG4gIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gIGxldCBsID0gaC5kYXRhLihpKSBpblxuICBpZiByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBsIHRoZW4gYmVnaW5cbiAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcbiAgZW5kXG5cbmxldCBtZW0gaCBrZXkgPVxuICBsZXQgcmVjIG1lbV9pbl9idWNrZXQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBmYWxzZVxuICB8IENvbnN7a2V5PWs7IG5leHR9IC0+XG4gICAgICBjb21wYXJlIGsga2V5ID0gMCB8fCBtZW1faW5fYnVja2V0IG5leHQgaW5cbiAgbWVtX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxubGV0IGFkZF9zZXEgdGJsIGkgPVxuICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IGFkZCB0YmwgayB2KSBpXG5cbmxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gcmVwbGFjZSB0YmwgayB2KSBpXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gIHRibFxuXG5sZXQgcmVidWlsZCA/KHJhbmRvbSA9IEF0b21pYy5nZXQgcmFuZG9taXplZCkgaCA9XG4gIGxldCBzID0gcG93ZXJfMl9hYm92ZSAxNiAoQXJyYXkubGVuZ3RoIGguZGF0YSkgaW5cbiAgbGV0IHNlZWQgPVxuICAgIGlmIHJhbmRvbSB0aGVuIFJhbmRvbS5TdGF0ZS5iaXRzIChEb21haW4uRExTLmdldCBwcm5nX2tleSlcbiAgICBlbHNlIGlmIE9iai5zaXplIChPYmoucmVwciBoKSA+PSA0IHRoZW4gaC5zZWVkXG4gICAgZWxzZSAwIGluXG4gIGxldCBoJyA9IHtcbiAgICBzaXplID0gaC5zaXplO1xuICAgIGRhdGEgPSBBcnJheS5tYWtlIHMgRW1wdHk7XG4gICAgc2VlZCA9IHNlZWQ7XG4gICAgaW5pdGlhbF9zaXplID0gaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLmluaXRpYWxfc2l6ZSBlbHNlIHNcbiAgfSBpblxuICBpbnNlcnRfYWxsX2J1Y2tldHMgKGtleV9pbmRleCBoJykgZmFsc2UgaC5kYXRhIGgnLmRhdGE7XG4gIGgnXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqKiBXZWFrIGFycmF5IG9wZXJhdGlvbnMgKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gJ2EgdCA9IFwiY2FtbF93ZWFrX2NyZWF0ZVwiXG5cbigqKiBudW1iZXIgb2YgYWRkaXRpb25hbCB2YWx1ZXMgaW4gYSB3ZWFrIHBvaW50ZXJcbiAqICAgIC0gTGlua1xuICogICAgLSBEYXRhICopXG5sZXQgYWRkaXRpb25hbF92YWx1ZXMgPSAyICgqIENBTUxfRVBIRV9GSVJTVF9LRVkgaW4gd2Vhay5oICopXG5cbmxldCBjcmVhdGUgbCA9XG4gIGlmIG5vdCAoMCA8PSBsICYmIGwgPD0gT2JqLkVwaGVtZXJvbi5tYXhfZXBoZV9sZW5ndGgpIHRoZW5cbiAgICBpbnZhbGlkX2FyZyhcIldlYWsuY3JlYXRlXCIpO1xuICBjcmVhdGUgbFxuXG5cbmxldCBsZW5ndGggeCA9IE9iai5zaXplKE9iai5yZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxubGV0IHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBtc2cgPVxuICBpZiBub3QgKDAgPD0gbyAmJiBvIDwgbGVuZ3RoIGUpIHRoZW5cbiAgICBpbnZhbGlkX2FyZyhtc2cpXG5cbmV4dGVybmFsIHNldCcgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2tleVwiXG5leHRlcm5hbCB1bnNldCA6ICdhIHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxubGV0IHNldCBlIG8geCA9XG4gIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIldlYWsuc2V0XCI7XG4gIG1hdGNoIHggd2l0aFxuICB8IE5vbmUgLT4gdW5zZXQgZSBvXG4gIHwgU29tZSB4IC0+IHNldCcgZSBvIHhcblxuZXh0ZXJuYWwgZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uID0gXCJjYW1sX3dlYWtfZ2V0XCJcbmxldCBnZXQgZSBvID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5nZXRcIjtcbiAgZ2V0IGUgb1xuXG5leHRlcm5hbCBnZXRfY29weSA6ICdhIHQgLT4gaW50IC0+ICdhIG9wdGlvbiA9IFwiY2FtbF93ZWFrX2dldF9jb3B5XCJcbmxldCBnZXRfY29weSBlIG8gPVxuICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJXZWFrLmdldF9jb3B5XCI7XG4gIGdldF9jb3B5IGUgb1xuXG5leHRlcm5hbCBjaGVjayA6ICdhIHQgLT4gaW50IC0+IGJvb2wgPSBcImNhbWxfd2Vha19jaGVja1wiXG5sZXQgY2hlY2sgZSBvID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5jaGVja1wiO1xuICBjaGVjayBlIG9cblxuZXh0ZXJuYWwgYmxpdCA6ICdhIHQgLT4gaW50IC0+ICdhIHQgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX3dlYWtfYmxpdFwiXG5cbigqIGJsaXQ6IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gKilcbmxldCBibGl0IGUxIG8xIGUyIG8yIGwgPVxuICBpZiBsIDwgMCB8fCBvMSA8IDAgfHwgbzEgPiBsZW5ndGggZTEgLSBsXG4gICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIldlYWsuYmxpdFwiXG4gIGVsc2UgaWYgbCA8PiAwIHRoZW4gYmxpdCBlMSBvMSBlMiBvMiBsXG5cbmxldCBmaWxsIGFyIG9mcyBsZW4geCA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYXIgLSBsZW5cbiAgdGhlbiByYWlzZSAoSW52YWxpZF9hcmd1bWVudCBcIldlYWsuZmlsbFwiKVxuICBlbHNlIGJlZ2luXG4gICAgZm9yIGkgPSBvZnMgdG8gKG9mcyArIGxlbiAtIDEpIGRvXG4gICAgICBzZXQgYXIgaSB4XG4gICAgZG9uZVxuICBlbmRcblxuXG4oKiogV2VhayBoYXNoIHRhYmxlcyAqKVxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgZGF0YVxuICB0eXBlIHRcbiAgdmFsIGNyZWF0ZSA6IGludCAtPiB0XG4gIHZhbCBjbGVhciA6IHQgLT4gdW5pdFxuICB2YWwgbWVyZ2UgOiB0IC0+IGRhdGEgLT4gZGF0YVxuICB2YWwgYWRkIDogdCAtPiBkYXRhIC0+IHVuaXRcbiAgdmFsIHJlbW92ZSA6IHQgLT4gZGF0YSAtPiB1bml0XG4gIHZhbCBmaW5kIDogdCAtPiBkYXRhIC0+IGRhdGFcbiAgdmFsIGZpbmRfb3B0IDogdCAtPiBkYXRhIC0+IGRhdGEgb3B0aW9uXG4gIHZhbCBmaW5kX2FsbCA6IHQgLT4gZGF0YSAtPiBkYXRhIGxpc3RcbiAgdmFsIG1lbSA6IHQgLT4gZGF0YSAtPiBib29sXG4gIHZhbCBpdGVyIDogKGRhdGEgLT4gdW5pdCkgLT4gdCAtPiB1bml0XG4gIHZhbCBmb2xkIDogKGRhdGEgLT4gJ2EgLT4gJ2EpIC0+IHQgLT4gJ2EgLT4gJ2FcbiAgdmFsIGNvdW50IDogdCAtPiBpbnRcbiAgdmFsIHN0YXRzIDogdCAtPiBpbnQgKiBpbnQgKiBpbnQgKiBpbnQgKiBpbnQgKiBpbnRcbmVuZFxuXG5tb2R1bGUgTWFrZSAoSCA6IEhhc2h0YmwuSGFzaGVkVHlwZSkgOiAoUyB3aXRoIHR5cGUgZGF0YSA9IEgudCkgPSBzdHJ1Y3RcblxuICB0eXBlICdhIHdlYWtfdCA9ICdhIHRcbiAgbGV0IHdlYWtfY3JlYXRlID0gY3JlYXRlXG4gIGxldCBlbXB0eWJ1Y2tldCA9IHdlYWtfY3JlYXRlIDBcblxuICB0eXBlIGRhdGEgPSBILnRcblxuICB0eXBlIHQgPSB7XG4gICAgbXV0YWJsZSB0YWJsZSA6IGRhdGEgd2Vha190IGFycmF5O1xuICAgIG11dGFibGUgaGFzaGVzIDogaW50IGFycmF5IGFycmF5O1xuICAgIG11dGFibGUgbGltaXQgOiBpbnQ7ICAgICAgICAgICAgICAgKCogYnVja2V0IHNpemUgbGltaXQgKilcbiAgICBtdXRhYmxlIG92ZXJzaXplIDogaW50OyAgICAgICAgICAgICgqIG51bWJlciBvZiBvdmVyc2l6ZSBidWNrZXRzICopXG4gICAgbXV0YWJsZSByb3ZlciA6IGludDsgICAgICAgICAgICAgICAoKiBmb3IgaW50ZXJuYWwgYm9va2tlZXBpbmcgKilcbiAgfVxuXG4gIGxldCBnZXRfaW5kZXggdCBoID0gKGggbGFuZCBtYXhfaW50KSBtb2QgKEFycmF5Lmxlbmd0aCB0LnRhYmxlKVxuXG4gIGxldCBsaW1pdCA9IDdcbiAgbGV0IG92ZXJfbGltaXQgPSAyXG5cbiAgbGV0IGNyZWF0ZSBzeiA9XG4gICAgbGV0IHN6ID0gaWYgc3ogPCA3IHRoZW4gNyBlbHNlIHN6IGluXG4gICAgbGV0IHN6ID0gaWYgc3ogPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIFN5cy5tYXhfYXJyYXlfbGVuZ3RoIGVsc2Ugc3ogaW5cbiAgICB7XG4gICAgICB0YWJsZSA9IEFycmF5Lm1ha2Ugc3ogZW1wdHlidWNrZXQ7XG4gICAgICBoYXNoZXMgPSBBcnJheS5tYWtlIHN6IFt8IHxdO1xuICAgICAgbGltaXQgPSBsaW1pdDtcbiAgICAgIG92ZXJzaXplID0gMDtcbiAgICAgIHJvdmVyID0gMDtcbiAgICB9XG5cbiAgbGV0IGNsZWFyIHQgPVxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggdC50YWJsZSAtIDEgZG9cbiAgICAgIHQudGFibGUuKGkpIDwtIGVtcHR5YnVja2V0O1xuICAgICAgdC5oYXNoZXMuKGkpIDwtIFt8IHxdO1xuICAgIGRvbmU7XG4gICAgdC5saW1pdCA8LSBsaW1pdDtcbiAgICB0Lm92ZXJzaXplIDwtIDBcblxuXG4gIGxldCBmb2xkIGYgdCBpbml0ID1cbiAgICBsZXQgcmVjIGZvbGRfYnVja2V0IGkgYiBhY2N1ID1cbiAgICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiBhY2N1IGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgICAgfCBTb21lIHYgLT4gZm9sZF9idWNrZXQgKGkrMSkgYiAoZiB2IGFjY3UpXG4gICAgICB8IE5vbmUgLT4gZm9sZF9idWNrZXQgKGkrMSkgYiBhY2N1XG4gICAgaW5cbiAgICBBcnJheS5mb2xkX3JpZ2h0IChmb2xkX2J1Y2tldCAwKSB0LnRhYmxlIGluaXRcblxuXG4gIGxldCBpdGVyIGYgdCA9XG4gICAgbGV0IHJlYyBpdGVyX2J1Y2tldCBpIGIgPVxuICAgICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuICgpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgICAgfCBTb21lIHYgLT4gZiB2OyBpdGVyX2J1Y2tldCAoaSsxKSBiXG4gICAgICB8IE5vbmUgLT4gaXRlcl9idWNrZXQgKGkrMSkgYlxuICAgIGluXG4gICAgQXJyYXkuaXRlciAoaXRlcl9idWNrZXQgMCkgdC50YWJsZVxuXG5cbiAgbGV0IGl0ZXJfd2VhayBmIHQgPVxuICAgIGxldCByZWMgaXRlcl9idWNrZXQgaSBqIGIgPVxuICAgICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuICgpIGVsc2VcbiAgICAgIG1hdGNoIGNoZWNrIGIgaSB3aXRoXG4gICAgICB8IHRydWUgLT4gZiBiIHQuaGFzaGVzLihqKSBpOyBpdGVyX2J1Y2tldCAoaSsxKSBqIGJcbiAgICAgIHwgZmFsc2UgLT4gaXRlcl9idWNrZXQgKGkrMSkgaiBiXG4gICAgaW5cbiAgICBBcnJheS5pdGVyaSAoaXRlcl9idWNrZXQgMCkgdC50YWJsZVxuXG5cbiAgbGV0IHJlYyBjb3VudF9idWNrZXQgaSBiIGFjY3UgPVxuICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiBhY2N1IGVsc2VcbiAgICBjb3VudF9idWNrZXQgKGkrMSkgYiAoYWNjdSArIChpZiBjaGVjayBiIGkgdGhlbiAxIGVsc2UgMCkpXG5cblxuICBsZXQgY291bnQgdCA9XG4gICAgQXJyYXkuZm9sZF9yaWdodCAoY291bnRfYnVja2V0IDApIHQudGFibGUgMFxuXG5cbiAgbGV0IG5leHRfc3ogbiA9IEludC5taW4gKDMgKiBuIC8gMiArIDMpIFN5cy5tYXhfYXJyYXlfbGVuZ3RoXG4gIGxldCBwcmV2X3N6IG4gPSAoKG4gLSAzKSAqIDIgKyAyKSAvIDNcblxuICBsZXQgdGVzdF9zaHJpbmtfYnVja2V0IHQgPVxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLih0LnJvdmVyKSBpblxuICAgIGxldCBoYnVja2V0ID0gdC5oYXNoZXMuKHQucm92ZXIpIGluXG4gICAgbGV0IGxlbiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcHJldl9sZW4gPSBwcmV2X3N6IGxlbiBpblxuICAgIGxldCBsaXZlID0gY291bnRfYnVja2V0IDAgYnVja2V0IDAgaW5cbiAgICBpZiBsaXZlIDw9IHByZXZfbGVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCByZWMgbG9vcCBpIGogPVxuICAgICAgICBpZiBqID49IHByZXZfbGVuIHRoZW4gYmVnaW5cbiAgICAgICAgICBpZiBjaGVjayBidWNrZXQgaSB0aGVuIGxvb3AgKGkgKyAxKSBqXG4gICAgICAgICAgZWxzZSBpZiBjaGVjayBidWNrZXQgaiB0aGVuIGJlZ2luXG4gICAgICAgICAgICBibGl0IGJ1Y2tldCBqIGJ1Y2tldCBpIDE7XG4gICAgICAgICAgICBoYnVja2V0LihpKSA8LSBoYnVja2V0LihqKTtcbiAgICAgICAgICAgIGxvb3AgKGkgKyAxKSAoaiAtIDEpO1xuICAgICAgICAgIGVuZCBlbHNlIGxvb3AgaSAoaiAtIDEpO1xuICAgICAgICBlbmQ7XG4gICAgICBpblxuICAgICAgbG9vcCAwIChsZW5ndGggYnVja2V0IC0gMSk7XG4gICAgICBpZiBwcmV2X2xlbiA9IDAgdGhlbiBiZWdpblxuICAgICAgICB0LnRhYmxlLih0LnJvdmVyKSA8LSBlbXB0eWJ1Y2tldDtcbiAgICAgICAgdC5oYXNoZXMuKHQucm92ZXIpIDwtIFt8IHxdO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IG5ld2J1Y2tldCA9IHdlYWtfY3JlYXRlIHByZXZfbGVuIGluXG4gICAgICAgIGJsaXQgYnVja2V0IDAgbmV3YnVja2V0IDAgcHJldl9sZW47XG4gICAgICAgIHQudGFibGUuKHQucm92ZXIpIDwtIG5ld2J1Y2tldDtcbiAgICAgICAgdC5oYXNoZXMuKHQucm92ZXIpIDwtIEFycmF5LnN1YiBoYnVja2V0IDAgcHJldl9sZW5cbiAgICAgIGVuZDtcbiAgICAgIGlmIGxlbiA+IHQubGltaXQgJiYgcHJldl9sZW4gPD0gdC5saW1pdCB0aGVuIHQub3ZlcnNpemUgPC0gdC5vdmVyc2l6ZSAtIDE7XG4gICAgZW5kO1xuICAgIHQucm92ZXIgPC0gKHQucm92ZXIgKyAxKSBtb2QgKEFycmF5Lmxlbmd0aCB0LnRhYmxlKVxuXG5cbiAgbGV0IHJlYyByZXNpemUgdCA9XG4gICAgbGV0IG9sZGxlbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IG5ld2xlbiA9IG5leHRfc3ogb2xkbGVuIGluXG4gICAgaWYgbmV3bGVuID4gb2xkbGVuIHRoZW4gYmVnaW5cbiAgICAgIGxldCBuZXd0ID0gY3JlYXRlIG5ld2xlbiBpblxuICAgICAgbGV0IGFkZF93ZWFrIG9iIG9oIG9pID1cbiAgICAgICAgbGV0IHNldHRlciBuYiBuaSBfID0gYmxpdCBvYiBvaSBuYiBuaSAxIGluXG4gICAgICAgIGxldCBoID0gb2guKG9pKSBpblxuICAgICAgICBhZGRfYXV4IG5ld3Qgc2V0dGVyIE5vbmUgaCAoZ2V0X2luZGV4IG5ld3QgaCk7XG4gICAgICBpblxuICAgICAgaXRlcl93ZWFrIGFkZF93ZWFrIHQ7XG4gICAgICB0LnRhYmxlIDwtIG5ld3QudGFibGU7XG4gICAgICB0Lmhhc2hlcyA8LSBuZXd0Lmhhc2hlcztcbiAgICAgIHQubGltaXQgPC0gbmV3dC5saW1pdDtcbiAgICAgIHQub3ZlcnNpemUgPC0gbmV3dC5vdmVyc2l6ZTtcbiAgICAgIHQucm92ZXIgPC0gdC5yb3ZlciBtb2QgQXJyYXkubGVuZ3RoIG5ld3QudGFibGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHQubGltaXQgPC0gbWF4X2ludDsgICAgICAgICAgICAgKCogbWF4aW11bSBzaXplIGFscmVhZHkgcmVhY2hlZCAqKVxuICAgICAgdC5vdmVyc2l6ZSA8LSAwO1xuICAgIGVuZFxuXG4gIGFuZCBhZGRfYXV4IHQgc2V0dGVyIGQgaCBpbmRleCA9XG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBiZWdpblxuICAgICAgICBsZXQgbmV3c3ogPVxuICAgICAgICAgIEludC5taW4gKDMgKiBzeiAvIDIgKyAzKSAoU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlcylcbiAgICAgICAgaW5cbiAgICAgICAgaWYgbmV3c3ogPD0gc3ogdGhlbiBmYWlsd2l0aCBcIldlYWsuTWFrZTogaGFzaCBidWNrZXQgY2Fubm90IGdyb3cgbW9yZVwiO1xuICAgICAgICBsZXQgbmV3YnVja2V0ID0gd2Vha19jcmVhdGUgbmV3c3ogaW5cbiAgICAgICAgbGV0IG5ld2hhc2hlcyA9IEFycmF5Lm1ha2UgbmV3c3ogMCBpblxuICAgICAgICBibGl0IGJ1Y2tldCAwIG5ld2J1Y2tldCAwIHN6O1xuICAgICAgICBBcnJheS5ibGl0IGhhc2hlcyAwIG5ld2hhc2hlcyAwIHN6O1xuICAgICAgICBzZXR0ZXIgbmV3YnVja2V0IHN6IGQ7XG4gICAgICAgIG5ld2hhc2hlcy4oc3opIDwtIGg7XG4gICAgICAgIHQudGFibGUuKGluZGV4KSA8LSBuZXdidWNrZXQ7XG4gICAgICAgIHQuaGFzaGVzLihpbmRleCkgPC0gbmV3aGFzaGVzO1xuICAgICAgICBpZiBzeiA8PSB0LmxpbWl0ICYmIG5ld3N6ID4gdC5saW1pdCB0aGVuIGJlZ2luXG4gICAgICAgICAgdC5vdmVyc2l6ZSA8LSB0Lm92ZXJzaXplICsgMTtcbiAgICAgICAgICBmb3IgX2kgPSAwIHRvIG92ZXJfbGltaXQgZG8gdGVzdF9zaHJpbmtfYnVja2V0IHQgZG9uZTtcbiAgICAgICAgZW5kO1xuICAgICAgICBpZiB0Lm92ZXJzaXplID4gQXJyYXkubGVuZ3RoIHQudGFibGUgLyBvdmVyX2xpbWl0IHRoZW4gcmVzaXplIHQ7XG4gICAgICBlbmQgZWxzZSBpZiBjaGVjayBidWNrZXQgaSB0aGVuIGJlZ2luXG4gICAgICAgIGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0dGVyIGJ1Y2tldCBpIGQ7XG4gICAgICAgIGhhc2hlcy4oaSkgPC0gaDtcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IGFkZCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBhZGRfYXV4IHQgc2V0IChTb21lIGQpIGggKGdldF9pbmRleCB0IGgpXG5cblxuICBsZXQgZmluZF9vciB0IGQgaWZub3Rmb3VuZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGxldCBpbmRleCA9IGdldF9pbmRleCB0IGggaW5cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGlmbm90Zm91bmQgaCBpbmRleFxuICAgICAgZWxzZSBpZiBoID0gaGFzaGVzLihpKSB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGdldF9jb3B5IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgfCBTb21lIHYgd2hlbiBILmVxdWFsIHYgZFxuICAgICAgICAgICAtPiBiZWdpbiBtYXRjaCBnZXQgYnVja2V0IGkgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgdiAtPiB2XG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSlcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgXyAtPiBsb29wIChpICsgMSlcbiAgICAgIGVuZCBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cblxuICBsZXQgbWVyZ2UgdCBkID1cbiAgICBmaW5kX29yIHQgZCAoZnVuIGggaW5kZXggLT4gYWRkX2F1eCB0IHNldCAoU29tZSBkKSBoIGluZGV4OyBkKVxuXG5cbiAgbGV0IGZpbmQgdCBkID0gZmluZF9vciB0IGQgKGZ1biBfaCBfaW5kZXggLT4gcmFpc2UgTm90X2ZvdW5kKVxuXG4gIGxldCBmaW5kX29wdCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBOb25lXG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkXG4gICAgICAgICAgIC0+IGJlZ2luIG1hdGNoIGdldCBidWNrZXQgaSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSBfIGFzIHYgLT4gdlxuICAgICAgICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICB8IF8gLT4gbG9vcCAoaSArIDEpXG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IGZpbmRfc2hhZG93IHQgZCBpZmZvdW5kIGlmbm90Zm91bmQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBpZm5vdGZvdW5kXG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkIC0+IGlmZm91bmQgYnVja2V0IGlcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuXG4gIGxldCByZW1vdmUgdCBkID0gZmluZF9zaGFkb3cgdCBkIChmdW4gdyBpIC0+IHNldCB3IGkgTm9uZSkgKClcblxuXG4gIGxldCBtZW0gdCBkID0gZmluZF9zaGFkb3cgdCBkIChmdW4gX3cgX2kgLT4gdHJ1ZSkgZmFsc2VcblxuXG4gIGxldCBmaW5kX2FsbCB0IGQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpIGFjY3UgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGFjY3VcbiAgICAgIGVsc2UgaWYgaCA9IGhhc2hlcy4oaSkgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBnZXRfY29weSBidWNrZXQgaSB3aXRoXG4gICAgICAgIHwgU29tZSB2IHdoZW4gSC5lcXVhbCB2IGRcbiAgICAgICAgICAgLT4gYmVnaW4gbWF0Y2ggZ2V0IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIHYgLT4gbG9vcCAoaSArIDEpICh2IDo6IGFjY3UpXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSkgYWNjdVxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKSBhY2N1XG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSkgYWNjdVxuICAgIGluXG4gICAgbG9vcCAwIFtdXG5cblxuICBsZXQgc3RhdHMgdCA9XG4gICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IGxlbnMgPSBBcnJheS5tYXAgbGVuZ3RoIHQudGFibGUgaW5cbiAgICBBcnJheS5zb3J0IGNvbXBhcmUgbGVucztcbiAgICBsZXQgdG90bGVuID0gQXJyYXkuZm9sZF9sZWZ0ICggKyApIDAgbGVucyBpblxuICAgIChsZW4sIGNvdW50IHQsIHRvdGxlbiwgbGVucy4oMCksIGxlbnMuKGxlbi8yKSwgbGVucy4obGVuLTEpKVxuXG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgUGllcnJlIFdlaXMsIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBIHByZXR0eS1wcmludGluZyBmYWNpbGl0eSBhbmQgZGVmaW5pdGlvbiBvZiBmb3JtYXR0ZXJzIGZvciAncGFyYWxsZWwnXG4gICAoaS5lLiB1bnJlbGF0ZWQgb3IgaW5kZXBlbmRlbnQpIHByZXR0eS1wcmludGluZyBvbiBtdWx0aXBsZSBvdXQgY2hhbm5lbHMuICopXG5cbigqXG4gICBUaGUgcHJldHR5LXByaW50aW5nIGVuZ2luZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuXG4qKVxuXG5sZXQgaWQgeCA9IHhcblxuKCogQSBkZXZvdGVkIHR5cGUgZm9yIHNpemVzIHRvIGF2b2lkIGNvbmZ1c2lvblxuICAgYmV0d2VlbiBzaXplcyBhbmQgbWVyZSBpbnRlZ2Vycy4gKilcbm1vZHVsZSBTaXplIDogc2lnXG4gIHR5cGUgdFxuXG4gIHZhbCB0b19pbnQgOiB0IC0+IGludFxuICB2YWwgb2ZfaW50IDogaW50IC0+IHRcbiAgdmFsIHplcm8gOiB0XG4gIHZhbCB1bmtub3duIDogdFxuICB2YWwgaXNfa25vd24gOiB0IC0+IGJvb2xcbmVuZCAgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50XG5cbiAgbGV0IHRvX2ludCA9IGlkXG4gIGxldCBvZl9pbnQgPSBpZFxuICBsZXQgemVybyA9IDBcbiAgbGV0IHVua25vd24gPSAtMVxuICBsZXQgaXNfa25vd24gbiA9IG4gPj0gMFxuZW5kXG5cblxuXG4oKiBUaGUgcHJldHR5LXByaW50aW5nIGJveGVzIGRlZmluaXRpb246XG4gICBhIHByZXR0eS1wcmludGluZyBib3ggaXMgZWl0aGVyXG4gICAtIGhib3g6IGhvcml6b250YWwgYm94IChubyBsaW5lIHNwbGl0dGluZylcbiAgIC0gdmJveDogdmVydGljYWwgYm94IChldmVyeSBicmVhayBoaW50IHNwbGl0cyB0aGUgbGluZSlcbiAgIC0gaHZib3g6IGhvcml6b250YWwvdmVydGljYWwgYm94XG4gICAgICh0aGUgYm94IGJlaGF2ZXMgYXMgYW4gaG9yaXpvbnRhbCBib3ggaWYgaXQgZml0cyBvblxuICAgICAgdGhlIGN1cnJlbnQgbGluZSwgb3RoZXJ3aXNlIHRoZSBib3ggYmVoYXZlcyBhcyBhIHZlcnRpY2FsIGJveClcbiAgIC0gaG92Ym94OiBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGNvbXBhY3RpbmcgYm94XG4gICAgICh0aGUgYm94IGlzIGNvbXBhY3RpbmcgbWF0ZXJpYWwsIHByaW50aW5nIGFzIG11Y2ggbWF0ZXJpYWwgYXMgcG9zc2libGVcbiAgICAgIG9uIGV2ZXJ5IGxpbmVzKVxuICAgLSBib3g6IGhvcml6b250YWwgb3IgdmVydGljYWwgY29tcGFjdGluZyBib3ggd2l0aCBlbmhhbmNlZCBib3ggc3RydWN0dXJlXG4gICAgICh0aGUgYm94IGJlaGF2ZXMgYXMgYW4gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBib3ggYnV0IGJyZWFrIGhpbnRzIHNwbGl0XG4gICAgICB0aGUgbGluZSBpZiBzcGxpdHRpbmcgd291bGQgbW92ZSB0byB0aGUgbGVmdClcbiopXG50eXBlIGJveF90eXBlID0gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmJsb2NrX3R5cGUgPVxuICB8IFBwX2hib3ggfCBQcF92Ym94IHwgUHBfaHZib3ggfCBQcF9ob3Zib3ggfCBQcF9ib3ggfCBQcF9maXRzXG5cblxuKCogVGhlIHByZXR0eS1wcmludGluZyB0b2tlbnMgZGVmaW5pdGlvbjpcbiAgIGFyZSBlaXRoZXIgdGV4dCB0byBwcmludCBvciBwcmV0dHkgcHJpbnRpbmdcbiAgIGVsZW1lbnRzIHRoYXQgZHJpdmUgaW5kZW50YXRpb24gYW5kIGxpbmUgc3BsaXR0aW5nLiAqKVxudHlwZSBwcF90b2tlbiA9XG4gIHwgUHBfdGV4dCBvZiBzdHJpbmcgICAgICAgICAgKCogbm9ybWFsIHRleHQgKilcbiAgfCBQcF9icmVhayBvZiB7ICAgICAgICAgICAgICAoKiBjb21wbGV0ZSBicmVhayAqKVxuICAgICAgZml0czogc3RyaW5nICogaW50ICogc3RyaW5nOyAgICgqIGxpbmUgaXMgbm90IHNwbGl0ICopXG4gICAgICBicmVha3M6IHN0cmluZyAqIGludCAqIHN0cmluZzsgKCogbGluZSBpcyBzcGxpdCAqKVxuICAgIH1cbiAgfCBQcF90YnJlYWsgb2YgaW50ICogaW50ICAgICAoKiBnbyB0byBuZXh0IHRhYnVsYXRpb24gKilcbiAgfCBQcF9zdGFiICAgICAgICAgICAgICAgICAgICAoKiBzZXQgYSB0YWJ1bGF0aW9uICopXG4gIHwgUHBfYmVnaW4gb2YgaW50ICogYm94X3R5cGUgKCogYmVnaW5uaW5nIG9mIGEgYm94ICopXG4gIHwgUHBfZW5kICAgICAgICAgICAgICAgICAgICAgKCogZW5kIG9mIGEgYm94ICopXG4gIHwgUHBfdGJlZ2luIG9mIHRib3ggICAgICAgICAgKCogYmVnaW5uaW5nIG9mIGEgdGFidWxhdGlvbiBib3ggKilcbiAgfCBQcF90ZW5kICAgICAgICAgICAgICAgICAgICAoKiBlbmQgb2YgYSB0YWJ1bGF0aW9uIGJveCAqKVxuICB8IFBwX25ld2xpbmUgICAgICAgICAgICAgICAgICgqIHRvIGZvcmNlIGEgbmV3bGluZSBpbnNpZGUgYSBib3ggKilcbiAgfCBQcF9pZl9uZXdsaW5lICAgICAgICAgICAgICAoKiB0byBkbyBzb21ldGhpbmcgb25seSBpZiB0aGlzIHZlcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGhhcyBiZWVuIGJyb2tlbiAqKVxuICB8IFBwX29wZW5fdGFnIG9mIHN0YWcgICAgICAgICAoKiBvcGVuaW5nIGEgdGFnIG5hbWUgKilcbiAgfCBQcF9jbG9zZV90YWcgICAgICAgICAgICAgICAoKiBjbG9zaW5nIHRoZSBtb3N0IHJlY2VudGx5IG9wZW4gdGFnICopXG5cbmFuZCBzdGFnID0gLi5cblxuYW5kIHRib3ggPSBQcF90Ym94IG9mIGludCBsaXN0IHJlZiAgKCogVGFidWxhdGlvbiBib3ggKilcblxudHlwZSB0YWcgPSBzdHJpbmdcbnR5cGUgc3RhZyArPSBTdHJpbmdfdGFnIG9mIHRhZ1xuXG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZTpcbiAgIHByZXR0eS1wcmludGluZyBtYXRlcmlhbCBpcyBub3Qgd3JpdHRlbiBpbiB0aGUgb3V0cHV0IGFzIHNvb24gYXMgZW1pdHRlZDtcbiAgIGluc3RlYWQsIHRoZSBtYXRlcmlhbCBpcyBzaW1wbHkgcmVjb3JkZWQgaW4gdGhlIHByZXR0eS1wcmludGVyIHF1ZXVlLFxuICAgdW50aWwgdGhlIGVuY2xvc2luZyBib3ggaGFzIGEga25vd24gY29tcHV0ZWQgc2l6ZSBhbmQgcHJvcGVyIHNwbGl0dGluZ1xuICAgZGVjaXNpb25zIGNhbiBiZSBtYWRlLlxuXG4gICBUaGUgcHJldHR5LXByaW50ZXIgcXVldWUgY29udGFpbnMgZm9ybWF0dGluZyBlbGVtZW50cyB0byBiZSBwcmludGVkLlxuICAgRWFjaCBmb3JtYXR0aW5nIGVsZW1lbnQgaXMgYSB0dXBsZSAoc2l6ZSwgdG9rZW4sIGxlbmd0aCksIHdoZXJlXG4gICAtIGxlbmd0aCBpcyB0aGUgZGVjbGFyZWQgbGVuZ3RoIG9mIHRoZSB0b2tlbixcbiAgIC0gc2l6ZSBpcyBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgdG9rZW4gd2hlbiBpdCBpcyBwcmludGVkXG4gICAgIChzaXplIGlzIHNldCB3aGVuIHRoZSBzaXplIG9mIHRoZSBib3ggaXMga25vd24sIHNvIHRoYXQgc2l6ZSBvZiBicmVha1xuICAgICAgaGludHMgYXJlIGRlZmluaXRpdmUpLiAqKVxudHlwZSBwcF9xdWV1ZV9lbGVtID0ge1xuICBtdXRhYmxlIHNpemUgOiBTaXplLnQ7XG4gIHRva2VuIDogcHBfdG9rZW47XG4gIGxlbmd0aCA6IGludDtcbn1cblxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgcXVldWUgZGVmaW5pdGlvbi4gKilcbnR5cGUgcHBfcXVldWUgPSBwcF9xdWV1ZV9lbGVtIFF1ZXVlLnRcblxuKCogVGhlIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrLiAqKVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2s6IHNjYW5uaW5nIGVsZW1lbnQgZGVmaW5pdGlvbi4gKilcbnR5cGUgcHBfc2Nhbl9lbGVtID0ge1xuICBsZWZ0X3RvdGFsIDogaW50OyAoKiBWYWx1ZSBvZiBwcF9sZWZ0X3RvdGFsIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGVucXVldWVkLiAqKVxuICBxdWV1ZV9lbGVtIDogcHBfcXVldWVfZWxlbVxufVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjazpcbiAgIHRoZSBmb3JtYXR0aW5nIHN0YWNrIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiBhbGwgdGhlIGN1cnJlbnRseSBhY3RpdmVcbiAgIGJveGVzOyB0aGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjayBpcyB1c2VkIHRvIHNwbGl0IHRoZSBsaW5lc1xuICAgd2hpbGUgcHJpbnRpbmcgdG9rZW5zLiAqKVxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjazogZm9ybWF0dGluZyBzdGFjayBlbGVtZW50IGRlZmluaXRpb24uXG4gICBFYWNoIHN0YWNrIGVsZW1lbnQgZGVzY3JpYmVzIGEgcHJldHR5LXByaW50aW5nIGJveC4gKilcbnR5cGUgcHBfZm9ybWF0X2VsZW0gPSB7IGJveF90eXBlIDogYm94X3R5cGU7IHdpZHRoIDogaW50IH1cblxuKCogVGhlIGZvcm1hdHRlciBkZWZpbml0aW9uLlxuICAgRWFjaCBmb3JtYXR0ZXIgdmFsdWUgaXMgYSBwcmV0dHktcHJpbnRlciBpbnN0YW5jZSB3aXRoIGFsbCBpdHNcbiAgIG1hY2hpbmVyeS4gKilcbnR5cGUgZm9ybWF0dGVyID0ge1xuICAoKiBUaGUgcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2suICopXG4gIHBwX3NjYW5fc3RhY2sgOiBwcF9zY2FuX2VsZW0gU3RhY2sudDtcbiAgKCogVGhlIHByZXR0eS1wcmludGVyIGZvcm1hdHRpbmcgc3RhY2suICopXG4gIHBwX2Zvcm1hdF9zdGFjayA6IHBwX2Zvcm1hdF9lbGVtIFN0YWNrLnQ7XG4gIHBwX3Rib3hfc3RhY2sgOiB0Ym94IFN0YWNrLnQ7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBzZW1hbnRpY3MgdGFnIHN0YWNrLiAqKVxuICBwcF90YWdfc3RhY2sgOiBzdGFnIFN0YWNrLnQ7XG4gIHBwX21hcmtfc3RhY2sgOiBzdGFnIFN0YWNrLnQ7XG4gICgqIFZhbHVlIG9mIHJpZ2h0IG1hcmdpbi4gKilcbiAgbXV0YWJsZSBwcF9tYXJnaW4gOiBpbnQ7XG4gICgqIE1pbmltYWwgc3BhY2UgbGVmdCBiZWZvcmUgbWFyZ2luLCB3aGVuIG9wZW5pbmcgYSBib3guICopXG4gIG11dGFibGUgcHBfbWluX3NwYWNlX2xlZnQgOiBpbnQ7XG4gICgqIE1heGltdW0gdmFsdWUgb2YgaW5kZW50YXRpb246XG4gICAgIG5vIGJveCBjYW4gYmUgb3BlbmVkIGZ1cnRoZXIuICopXG4gIG11dGFibGUgcHBfbWF4X2luZGVudCA6IGludDtcbiAgKCogU3BhY2UgcmVtYWluaW5nIG9uIHRoZSBjdXJyZW50IGxpbmUuICopXG4gIG11dGFibGUgcHBfc3BhY2VfbGVmdCA6IGludDtcbiAgKCogQ3VycmVudCB2YWx1ZSBvZiBpbmRlbnRhdGlvbi4gKilcbiAgbXV0YWJsZSBwcF9jdXJyZW50X2luZGVudCA6IGludDtcbiAgKCogVHJ1ZSB3aGVuIHRoZSBsaW5lIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgcHJldHR5LXByaW50ZXIuICopXG4gIG11dGFibGUgcHBfaXNfbmV3X2xpbmUgOiBib29sO1xuICAoKiBUb3RhbCB3aWR0aCBvZiB0b2tlbnMgYWxyZWFkeSBwcmludGVkLiAqKVxuICBtdXRhYmxlIHBwX2xlZnRfdG90YWwgOiBpbnQ7XG4gICgqIFRvdGFsIHdpZHRoIG9mIHRva2VucyBldmVyIHB1dCBpbiBxdWV1ZS4gKilcbiAgbXV0YWJsZSBwcF9yaWdodF90b3RhbCA6IGludDtcbiAgKCogQ3VycmVudCBudW1iZXIgb2Ygb3BlbiBib3hlcy4gKilcbiAgbXV0YWJsZSBwcF9jdXJyX2RlcHRoIDogaW50O1xuICAoKiBNYXhpbXVtIG51bWJlciBvZiBib3hlcyB3aGljaCBjYW4gYmUgc2ltdWx0YW5lb3VzbHkgb3Blbi4gKilcbiAgbXV0YWJsZSBwcF9tYXhfYm94ZXMgOiBpbnQ7XG4gICgqIEVsbGlwc2lzIHN0cmluZy4gKilcbiAgbXV0YWJsZSBwcF9lbGxpcHNpcyA6IHN0cmluZztcbiAgKCogT3V0cHV0IGZ1bmN0aW9uLiAqKVxuICBtdXRhYmxlIHBwX291dF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0O1xuICAoKiBGbHVzaGluZyBmdW5jdGlvbi4gKilcbiAgbXV0YWJsZSBwcF9vdXRfZmx1c2ggOiB1bml0IC0+IHVuaXQ7XG4gICgqIE91dHB1dCBvZiBuZXcgbGluZXMuICopXG4gIG11dGFibGUgcHBfb3V0X25ld2xpbmUgOiB1bml0IC0+IHVuaXQ7XG4gICgqIE91dHB1dCBvZiBicmVhayBoaW50cyBzcGFjZXMuICopXG4gIG11dGFibGUgcHBfb3V0X3NwYWNlcyA6IGludCAtPiB1bml0O1xuICAoKiBPdXRwdXQgb2YgaW5kZW50YXRpb24gb2YgbmV3IGxpbmVzLiAqKVxuICBtdXRhYmxlIHBwX291dF9pbmRlbnQgOiBpbnQgLT4gdW5pdDtcbiAgKCogQXJlIHRhZ3MgcHJpbnRlZCA/ICopXG4gIG11dGFibGUgcHBfcHJpbnRfdGFncyA6IGJvb2w7XG4gICgqIEFyZSB0YWdzIG1hcmtlZCA/ICopXG4gIG11dGFibGUgcHBfbWFya190YWdzIDogYm9vbDtcbiAgKCogRmluZCBvcGVuaW5nIGFuZCBjbG9zaW5nIG1hcmtlcnMgb2YgdGFncy4gKilcbiAgbXV0YWJsZSBwcF9tYXJrX29wZW5fdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIG11dGFibGUgcHBfbWFya19jbG9zZV90YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgbXV0YWJsZSBwcF9wcmludF9vcGVuX3RhZyA6IHN0YWcgLT4gdW5pdDtcbiAgbXV0YWJsZSBwcF9wcmludF9jbG9zZV90YWcgOiBzdGFnIC0+IHVuaXQ7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZS4gKilcbiAgcHBfcXVldWUgOiBwcF9xdWV1ZTtcbn1cblxuXG4oKiBUaGUgZm9ybWF0dGVyIHNwZWNpZmljIHRhZyBoYW5kbGluZyBmdW5jdGlvbnMuICopXG50eXBlIGZvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyA9IHtcbiAgbWFya19vcGVuX3N0YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgbWFya19jbG9zZV9zdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIHByaW50X29wZW5fc3RhZyA6IHN0YWcgLT4gdW5pdDtcbiAgcHJpbnRfY2xvc2Vfc3RhZyA6IHN0YWcgLT4gdW5pdDtcbn1cblxuXG4oKiBUaGUgZm9ybWF0dGVyIGZ1bmN0aW9ucyB0byBvdXRwdXQgbWF0ZXJpYWwuICopXG50eXBlIGZvcm1hdHRlcl9vdXRfZnVuY3Rpb25zID0ge1xuICBvdXRfc3RyaW5nIDogc3RyaW5nIC0+IGludCAtPiBpbnQgLT4gdW5pdDtcbiAgb3V0X2ZsdXNoIDogdW5pdCAtPiB1bml0O1xuICBvdXRfbmV3bGluZSA6IHVuaXQgLT4gdW5pdDtcbiAgb3V0X3NwYWNlcyA6IGludCAtPiB1bml0O1xuICBvdXRfaW5kZW50IDogaW50IC0+IHVuaXQ7XG59XG5cblxuKCpcblxuICBBdXhpbGlhcmllcyBhbmQgYmFzaWMgZnVuY3Rpb25zLlxuXG4qKVxuXG4oKiBFbnRlciBhIHRva2VuIGluIHRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZS4gKilcbmxldCBwcF9lbnF1ZXVlIHN0YXRlIHRva2VuID1cbiAgc3RhdGUucHBfcmlnaHRfdG90YWwgPC0gc3RhdGUucHBfcmlnaHRfdG90YWwgKyB0b2tlbi5sZW5ndGg7XG4gIFF1ZXVlLmFkZCB0b2tlbiBzdGF0ZS5wcF9xdWV1ZVxuXG5cbmxldCBwcF9jbGVhcl9xdWV1ZSBzdGF0ZSA9XG4gIHN0YXRlLnBwX2xlZnRfdG90YWwgPC0gMTsgc3RhdGUucHBfcmlnaHRfdG90YWwgPC0gMTtcbiAgUXVldWUuY2xlYXIgc3RhdGUucHBfcXVldWVcblxuXG4oKiBQcF9pbmZpbml0eTogbGFyZ2UgdmFsdWUgZm9yIGRlZmF1bHQgdG9rZW5zIHNpemUuXG5cbiAgIFBwX2luZmluaXR5IGlzIGRvY3VtZW50ZWQgYXMgYmVpbmcgZ3JlYXRlciB0aGFuIDFlMTA7IHRvIGF2b2lkXG4gICBjb25mdXNpb24gYWJvdXQgdGhlIHdvcmQgJ2dyZWF0ZXInLCB3ZSBjaG9vc2UgcHBfaW5maW5pdHkgZ3JlYXRlclxuICAgdGhhbiAxZTEwICsgMTsgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgdGVzdHMgaW4gdGhlIGFsZ29yaXRobSxcbiAgIHBwX2luZmluaXR5IG11c3QgYmUgZXZlbiBvbmUgbW9yZSB0aGFuIDFlMTAgKyAxOyBsZXQncyBzdGFuZCBvbiB0aGVcbiAgIHNhZmUgc2lkZSBieSBjaG9vc2luZyAxLmUxMCsxMC5cblxuICAgUHBfaW5maW5pdHkgY291bGQgcHJvYmFibHkgYmUgMTA3Mzc0MTgyMyB0aGF0IGlzIDJeMzAgLSAxLCB0aGF0IGlzXG4gICB0aGUgbWluaW1hbCB1cHBlciBib3VuZCBmb3IgaW50ZWdlcnM7IG5vdyB0aGF0IG1heF9pbnQgaXMgZGVmaW5lZCxcbiAgIHRoaXMgbGltaXQgY291bGQgYWxzbyBiZSBkZWZpbmVkIGFzIG1heF9pbnQgLSAxLlxuXG4gICBIb3dldmVyLCBiZWZvcmUgc2V0dGluZyBwcF9pbmZpbml0eSB0byBzb21ldGhpbmcgYXJvdW5kIG1heF9pbnQsIHdlXG4gICBtdXN0IGNhcmVmdWxseSBkb3VibGUtY2hlY2sgYWxsIHRoZSBpbnRlZ2VyIGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuICAgdGhhdCBpbnZvbHZlIHBwX2luZmluaXR5LCBzaW5jZSBhbnkgb3ZlcmZsb3cgd291bGQgd3JlY2sgaGF2b2MgdGhlXG4gICBwcmV0dHktcHJpbnRpbmcgYWxnb3JpdGhtJ3MgaW52YXJpYW50cy4gR2l2ZW4gdGhhdCB0aGlzIGFyaXRobWV0aWNcbiAgIGNvcnJlY3RuZXNzIGNoZWNrIGlzIGRpZmZpY3VsdCBhbmQgZXJyb3IgcHJvbmUgYW5kIGdpdmVuIHRoYXQgMWUxMFxuICAgKyAxIGlzIGluIHByYWN0aWNlIGxhcmdlIGVub3VnaCwgdGhlcmUgaXMgbm8gbmVlZCB0byBhdHRlbXB0IHRvIHNldFxuICAgcHBfaW5maW5pdHkgdG8gdGhlIHRoZW9yZXRpY2FsbHkgbWF4aW11bSBsaW1pdC4gSXQgaXMgbm90IHdvcnRoIHRoZVxuICAgYnVyZGVuICEgKilcbmxldCBwcF9pbmZpbml0eSA9IDEwMDAwMDAwMTBcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBmb3IgdGhlIGZvcm1hdHRlci4gKilcbmxldCBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIHMgPSBzdGF0ZS5wcF9vdXRfc3RyaW5nIHMgMCAoU3RyaW5nLmxlbmd0aCBzKVxuYW5kIHBwX291dHB1dF9uZXdsaW5lIHN0YXRlID0gc3RhdGUucHBfb3V0X25ld2xpbmUgKClcbmFuZCBwcF9vdXRwdXRfc3BhY2VzIHN0YXRlIG4gPSBzdGF0ZS5wcF9vdXRfc3BhY2VzIG5cbmFuZCBwcF9vdXRwdXRfaW5kZW50IHN0YXRlIG4gPSBzdGF0ZS5wcF9vdXRfaW5kZW50IG5cblxuKCogRm9ybWF0IGEgdGV4dHVhbCB0b2tlbiAqKVxubGV0IGZvcm1hdF9wcF90ZXh0IHN0YXRlIHNpemUgdGV4dCA9XG4gIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfc3BhY2VfbGVmdCAtIHNpemU7XG4gIHBwX291dHB1dF9zdHJpbmcgc3RhdGUgdGV4dDtcbiAgc3RhdGUucHBfaXNfbmV3X2xpbmUgPC0gZmFsc2VcblxuKCogRm9ybWF0IGEgc3RyaW5nIGJ5IGl0cyBsZW5ndGgsIGlmIG5vdCBlbXB0eSAqKVxubGV0IGZvcm1hdF9zdHJpbmcgc3RhdGUgcyA9XG4gIGlmIHMgPD4gXCJcIiB0aGVuIGZvcm1hdF9wcF90ZXh0IHN0YXRlIChTdHJpbmcubGVuZ3RoIHMpIHNcblxuKCogVG8gZm9ybWF0IGEgYnJlYWssIGluZGVudGluZyBhIG5ldyBsaW5lLiAqKVxubGV0IGJyZWFrX25ld19saW5lIHN0YXRlIChiZWZvcmUsIG9mZnNldCwgYWZ0ZXIpIHdpZHRoID1cbiAgZm9ybWF0X3N0cmluZyBzdGF0ZSBiZWZvcmU7XG4gIHBwX291dHB1dF9uZXdsaW5lIHN0YXRlO1xuICBzdGF0ZS5wcF9pc19uZXdfbGluZSA8LSB0cnVlO1xuICBsZXQgaW5kZW50ID0gc3RhdGUucHBfbWFyZ2luIC0gd2lkdGggKyBvZmZzZXQgaW5cbiAgKCogRG9uJ3QgaW5kZW50IG1vcmUgdGhhbiBwcF9tYXhfaW5kZW50LiAqKVxuICBsZXQgcmVhbF9pbmRlbnQgPSBJbnQubWluIHN0YXRlLnBwX21heF9pbmRlbnQgaW5kZW50IGluXG4gIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50IDwtIHJlYWxfaW5kZW50O1xuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50O1xuICBwcF9vdXRwdXRfaW5kZW50IHN0YXRlIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50O1xuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGFmdGVyXG5cblxuKCogVG8gZm9yY2UgYSBsaW5lIGJyZWFrIGluc2lkZSBhIGJveDogbm8gb2Zmc2V0IGlzIGFkZGVkLiAqKVxubGV0IGJyZWFrX2xpbmUgc3RhdGUgd2lkdGggPSBicmVha19uZXdfbGluZSBzdGF0ZSAoXCJcIiwgMCwgXCJcIikgd2lkdGhcblxuKCogVG8gZm9ybWF0IGEgYnJlYWsgdGhhdCBmaXRzIG9uIHRoZSBjdXJyZW50IGxpbmUuICopXG5sZXQgYnJlYWtfc2FtZV9saW5lIHN0YXRlIChiZWZvcmUsIHdpZHRoLCBhZnRlcikgPVxuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGJlZm9yZTtcbiAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IC0gd2lkdGg7XG4gIHBwX291dHB1dF9zcGFjZXMgc3RhdGUgd2lkdGg7XG4gIGZvcm1hdF9zdHJpbmcgc3RhdGUgYWZ0ZXJcblxuXG4oKiBUbyBpbmRlbnQgbm8gbW9yZSB0aGFuIHBwX21heF9pbmRlbnQsIGlmIG9uZSB0cmllcyB0byBvcGVuIGEgYm94XG4gICBiZXlvbmQgcHBfbWF4X2luZGVudCwgdGhlbiB0aGUgYm94IGlzIHJlamVjdGVkIG9uIHRoZSBsZWZ0XG4gICBieSBzaW11bGF0aW5nIGEgYnJlYWsuICopXG5sZXQgcHBfZm9yY2VfYnJlYWtfbGluZSBzdGF0ZSA9XG4gIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfZm9ybWF0X3N0YWNrIHdpdGhcbiAgfCBOb25lIC0+IHBwX291dHB1dF9uZXdsaW5lIHN0YXRlXG4gIHwgU29tZSB7IGJveF90eXBlOyB3aWR0aCB9IC0+XG4gICAgaWYgd2lkdGggPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0IHRoZW5cbiAgICAgIG1hdGNoIGJveF90eXBlIHdpdGhcbiAgICAgIHwgUHBfZml0cyB8IFBwX2hib3ggLT4gKClcbiAgICAgIHwgUHBfdmJveCB8IFBwX2h2Ym94IHwgUHBfaG92Ym94IHwgUHBfYm94IC0+IGJyZWFrX2xpbmUgc3RhdGUgd2lkdGhcblxuXG4oKiBUbyBza2lwIGEgdG9rZW4sIGlmIHRoZSBwcmV2aW91cyBsaW5lIGhhcyBiZWVuIGJyb2tlbi4gKilcbmxldCBwcF9za2lwX3Rva2VuIHN0YXRlID1cbiAgbWF0Y2ggUXVldWUudGFrZV9vcHQgc3RhdGUucHBfcXVldWUgd2l0aFxuICB8IE5vbmUgLT4gKCkgKCogcHJpbnRfaWZfbmV3bGluZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBwcmludGluZyBjb21tYW5kICopXG4gIHwgU29tZSB7IHNpemU7IGxlbmd0aDsgXyB9IC0+XG4gICAgc3RhdGUucHBfbGVmdF90b3RhbCA8LSBzdGF0ZS5wcF9sZWZ0X3RvdGFsIC0gbGVuZ3RoO1xuICAgIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfc3BhY2VfbGVmdCArIFNpemUudG9faW50IHNpemVcblxuXG4oKlxuXG4gIFRoZSBtYWluIHByZXR0eSBwcmludGluZyBmdW5jdGlvbnMuXG5cbiopXG5cbigqIEZvcm1hdHRpbmcgYSB0b2tlbiB3aXRoIGEgZ2l2ZW4gc2l6ZS4gKilcbmxldCBmb3JtYXRfcHBfdG9rZW4gc3RhdGUgc2l6ZSA9IGZ1bmN0aW9uXG5cbiAgfCBQcF90ZXh0IHMgLT5cbiAgICBmb3JtYXRfcHBfdGV4dCBzdGF0ZSBzaXplIHNcblxuICB8IFBwX2JlZ2luIChvZmYsIHR5KSAtPlxuICAgIGxldCBpbnNlcnRpb25fcG9pbnQgPSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IGluXG4gICAgaWYgaW5zZXJ0aW9uX3BvaW50ID4gc3RhdGUucHBfbWF4X2luZGVudCB0aGVuXG4gICAgICAoKiBjYW4gbm90IG9wZW4gYSBib3ggcmlnaHQgdGhlcmUuICopXG4gICAgICBiZWdpbiBwcF9mb3JjZV9icmVha19saW5lIHN0YXRlIGVuZDtcbiAgICBsZXQgd2lkdGggPSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IC0gb2ZmIGluXG4gICAgbGV0IGJveF90eXBlID1cbiAgICAgIG1hdGNoIHR5IHdpdGhcbiAgICAgIHwgUHBfdmJveCAtPiBQcF92Ym94XG4gICAgICB8IFBwX2hib3ggfCBQcF9odmJveCB8IFBwX2hvdmJveCB8IFBwX2JveCB8IFBwX2ZpdHMgLT5cbiAgICAgICAgaWYgc2l6ZSA+IHN0YXRlLnBwX3NwYWNlX2xlZnQgdGhlbiB0eSBlbHNlIFBwX2ZpdHMgaW5cbiAgICBTdGFjay5wdXNoIHsgYm94X3R5cGU7IHdpZHRoIH0gc3RhdGUucHBfZm9ybWF0X3N0YWNrXG5cbiAgfCBQcF9lbmQgLT5cbiAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB8PiBpZ25vcmVcblxuICB8IFBwX3RiZWdpbiAoUHBfdGJveCBfIGFzIHRib3gpIC0+XG4gICAgU3RhY2sucHVzaCB0Ym94IHN0YXRlLnBwX3Rib3hfc3RhY2tcblxuICB8IFBwX3RlbmQgLT5cbiAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX3Rib3hfc3RhY2sgfD4gaWdub3JlXG5cbiAgfCBQcF9zdGFiIC0+XG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF90Ym94X3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gKCkgKCogTm8gb3BlbiB0YWJ1bGF0aW9uIGJveC4gKilcbiAgICB8IFNvbWUgKFBwX3Rib3ggdGFicykgLT5cbiAgICAgIGxldCByZWMgYWRkX3RhYiBuID0gZnVuY3Rpb25cbiAgICAgICAgfCBbXSAtPiBbbl1cbiAgICAgICAgfCB4IDo6IGwgYXMgbHMgLT4gaWYgbiA8IHggdGhlbiBuIDo6IGxzIGVsc2UgeCA6OiBhZGRfdGFiIG4gbCBpblxuICAgICAgdGFicyA6PSBhZGRfdGFiIChzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0KSAhdGFic1xuICAgIGVuZFxuXG4gIHwgUHBfdGJyZWFrIChuLCBvZmYpIC0+XG4gICAgbGV0IGluc2VydGlvbl9wb2ludCA9IHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnQgaW5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX3Rib3hfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBvcGVuIHRhYnVsYXRpb24gYm94LiAqKVxuICAgIHwgU29tZSAoUHBfdGJveCB0YWJzKSAtPlxuICAgICAgbGV0IHRhYiA9XG4gICAgICAgIG1hdGNoICF0YWJzIHdpdGhcbiAgICAgICAgfCBbXSAtPiBpbnNlcnRpb25fcG9pbnRcbiAgICAgICAgfCBmaXJzdCA6OiBfIC0+XG4gICAgICAgICAgbGV0IHJlYyBmaW5kID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgaGVhZCA6OiB0YWlsIC0+XG4gICAgICAgICAgICAgIGlmIGhlYWQgPj0gaW5zZXJ0aW9uX3BvaW50IHRoZW4gaGVhZCBlbHNlIGZpbmQgdGFpbFxuICAgICAgICAgICAgfCBbXSAtPiBmaXJzdCBpblxuICAgICAgICAgIGZpbmQgIXRhYnMgaW5cbiAgICAgIGxldCBvZmZzZXQgPSB0YWIgLSBpbnNlcnRpb25fcG9pbnQgaW5cbiAgICAgIGlmIG9mZnNldCA+PSAwXG4gICAgICB0aGVuIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSAoXCJcIiwgb2Zmc2V0ICsgbiwgXCJcIilcbiAgICAgIGVsc2UgYnJlYWtfbmV3X2xpbmUgc3RhdGUgKFwiXCIsIHRhYiArIG9mZiwgXCJcIikgc3RhdGUucHBfbWFyZ2luXG4gICAgZW5kXG5cbiAgfCBQcF9uZXdsaW5lIC0+XG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9mb3JtYXRfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZSAoKiBObyBvcGVuIGJveC4gKilcbiAgICB8IFNvbWUgeyB3aWR0aDsgX30gLT4gYnJlYWtfbGluZSBzdGF0ZSB3aWR0aFxuICAgIGVuZFxuXG4gIHwgUHBfaWZfbmV3bGluZSAtPlxuICAgIGlmIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50ICE9IHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnRcbiAgICB0aGVuIHBwX3NraXBfdG9rZW4gc3RhdGVcblxuICB8IFBwX2JyZWFrIHsgZml0czsgYnJlYWtzIH0gLT5cbiAgICBsZXQgYmVmb3JlLCBvZmYsIF8gPSBicmVha3MgaW5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+ICgpICgqIE5vIG9wZW4gYm94LiAqKVxuICAgIHwgU29tZSB7IGJveF90eXBlOyB3aWR0aCB9IC0+XG4gICAgICBiZWdpbiBtYXRjaCBib3hfdHlwZSB3aXRoXG4gICAgICB8IFBwX2hvdmJveCAtPlxuICAgICAgICBpZiBzaXplICsgU3RyaW5nLmxlbmd0aCBiZWZvcmUgPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0XG4gICAgICAgIHRoZW4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICAgIGVsc2UgYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIHwgUHBfYm94IC0+XG4gICAgICAgICgqIEhhdmUgdGhlIGxpbmUganVzdCBiZWVuIGJyb2tlbiBoZXJlID8gKilcbiAgICAgICAgaWYgc3RhdGUucHBfaXNfbmV3X2xpbmUgdGhlbiBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0cyBlbHNlXG4gICAgICAgIGlmIHNpemUgKyBTdHJpbmcubGVuZ3RoIGJlZm9yZSA+IHN0YXRlLnBwX3NwYWNlX2xlZnRcbiAgICAgICAgICB0aGVuIGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aCBlbHNlXG4gICAgICAgICgqIGJyZWFrIHRoZSBsaW5lIGhlcmUgbGVhZHMgdG8gbmV3IGluZGVudGF0aW9uID8gKilcbiAgICAgICAgaWYgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgPiBzdGF0ZS5wcF9tYXJnaW4gLSB3aWR0aCArIG9mZlxuICAgICAgICB0aGVuIGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgICBlbHNlIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICB8IFBwX2h2Ym94IC0+IGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgfCBQcF9maXRzIC0+IGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICB8IFBwX3Zib3ggLT4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICB8IFBwX2hib3ggLT4gYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIGVuZFxuICAgIGVuZFxuXG4gICB8IFBwX29wZW5fdGFnIHRhZ19uYW1lIC0+XG4gICAgIGxldCBtYXJrZXIgPSBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnIHRhZ19uYW1lIGluXG4gICAgIHBwX291dHB1dF9zdHJpbmcgc3RhdGUgbWFya2VyO1xuICAgICBTdGFjay5wdXNoIHRhZ19uYW1lIHN0YXRlLnBwX21hcmtfc3RhY2tcblxuICAgfCBQcF9jbG9zZV90YWcgLT5cbiAgICAgYmVnaW4gbWF0Y2ggU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9tYXJrX3N0YWNrIHdpdGhcbiAgICAgfCBOb25lIC0+ICgpICgqIE5vIG1vcmUgdGFnIHRvIGNsb3NlLiAqKVxuICAgICB8IFNvbWUgdGFnX25hbWUgLT5cbiAgICAgICBsZXQgbWFya2VyID0gc3RhdGUucHBfbWFya19jbG9zZV90YWcgdGFnX25hbWUgaW5cbiAgICAgICBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIG1hcmtlclxuICAgICBlbmRcblxuXG4oKiBQcmludCBpZiB0b2tlbiBzaXplIGlzIGtub3duIGVsc2UgcHJpbnRpbmcgaXMgZGVsYXllZC5cbiAgIFByaW50aW5nIGlzIGRlbGF5ZWQgd2hlbiB0aGUgdGV4dCB3YWl0aW5nIGluIHRoZSBxdWV1ZSByZXF1aXJlc1xuICAgbW9yZSByb29tIHRvIGZvcm1hdCB0aGFuIGV4aXN0cyBvbiB0aGUgY3VycmVudCBsaW5lLiAqKVxubGV0IHJlYyBhZHZhbmNlX2xlZnQgc3RhdGUgPVxuICBtYXRjaCBRdWV1ZS5wZWVrX29wdCBzdGF0ZS5wcF9xdWV1ZSB3aXRoXG4gIHwgTm9uZSAtPiAoKSAoKiBObyB0b2tlbnMgdG8gcHJpbnQgKilcbiAgfCBTb21lIHsgc2l6ZTsgdG9rZW47IGxlbmd0aCB9IC0+XG4gICAgbGV0IHBlbmRpbmdfY291bnQgPSBzdGF0ZS5wcF9yaWdodF90b3RhbCAtIHN0YXRlLnBwX2xlZnRfdG90YWwgaW5cbiAgICBpZiBTaXplLmlzX2tub3duIHNpemUgfHwgcGVuZGluZ19jb3VudCA+PSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IHRoZW4gYmVnaW5cbiAgICAgIFF1ZXVlLnRha2Ugc3RhdGUucHBfcXVldWUgfD4gaWdub3JlOyAoKiBOb3QgZW1wdHk6IHdlIHBlZWsgaW50byBpdCAqKVxuICAgICAgbGV0IHNpemUgPSBpZiBTaXplLmlzX2tub3duIHNpemUgdGhlbiBTaXplLnRvX2ludCBzaXplIGVsc2UgcHBfaW5maW5pdHkgaW5cbiAgICAgIGZvcm1hdF9wcF90b2tlbiBzdGF0ZSBzaXplIHRva2VuO1xuICAgICAgc3RhdGUucHBfbGVmdF90b3RhbCA8LSBsZW5ndGggKyBzdGF0ZS5wcF9sZWZ0X3RvdGFsO1xuICAgICAgKGFkdmFuY2VfbGVmdCBbQHRhaWxjYWxsXSkgc3RhdGVcbiAgICBlbmRcblxuXG4oKiBUbyBlbnF1ZXVlIGEgdG9rZW4gOiB0cnkgdG8gYWR2YW5jZS4gKilcbmxldCBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgdG9rID0gcHBfZW5xdWV1ZSBzdGF0ZSB0b2s7IGFkdmFuY2VfbGVmdCBzdGF0ZVxuXG5cbigqIFRvIGVucXVldWUgc3RyaW5ncy4gKilcbmxldCBlbnF1ZXVlX3N0cmluZ19hcyBzdGF0ZSBzaXplIHMgPVxuICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgeyBzaXplOyB0b2tlbiA9IFBwX3RleHQgczsgbGVuZ3RoID0gU2l6ZS50b19pbnQgc2l6ZSB9XG5cblxubGV0IGVucXVldWVfc3RyaW5nIHN0YXRlIHMgPVxuICBlbnF1ZXVlX3N0cmluZ19hcyBzdGF0ZSAoU2l6ZS5vZl9pbnQgKFN0cmluZy5sZW5ndGggcykpIHNcblxuXG4oKiBSb3V0aW5lcyBmb3Igc2NhbiBzdGFja1xuICAgZGV0ZXJtaW5lIHNpemUgb2YgYm94ZXMuICopXG5cbigqIFRoZSBzY2FuX3N0YWNrIGlzIG5ldmVyIGVtcHR5LiAqKVxubGV0IGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGFjayA9XG4gIFN0YWNrLmNsZWFyIHN0YWNrO1xuICBsZXQgcXVldWVfZWxlbSA9IHsgc2l6ZSA9IFNpemUudW5rbm93bjsgdG9rZW4gPSBQcF90ZXh0IFwiXCI7IGxlbmd0aCA9IDAgfSBpblxuICBTdGFjay5wdXNoIHsgbGVmdF90b3RhbCA9IC0xOyBxdWV1ZV9lbGVtIH0gc3RhY2tcblxuKCogU2V0dGluZyB0aGUgc2l6ZSBvZiBib3hlcyBvbiBzY2FuIHN0YWNrOlxuICAgaWYgdHkgPSB0cnVlIHRoZW4gc2l6ZSBvZiBicmVhayBpcyBzZXQgZWxzZSBzaXplIG9mIGJveCBpcyBzZXQ7XG4gICBpbiBlYWNoIGNhc2UgcHBfc2Nhbl9zdGFjayBpcyBwb3BwZWQuXG5cbiAgIE5vdGU6XG4gICBQYXR0ZXJuIG1hdGNoaW5nIG9uIHNjYW4gc3RhY2sgaXMgZXhoYXVzdGl2ZSwgc2luY2Ugc2Nhbl9zdGFjayBpcyBuZXZlclxuICAgZW1wdHkuXG4gICBQYXR0ZXJuIG1hdGNoaW5nIG9uIHRva2VuIGluIHNjYW4gc3RhY2sgaXMgYWxzbyBleGhhdXN0aXZlLFxuICAgc2luY2Ugc2Nhbl9wdXNoIGlzIHVzZWQgb24gYnJlYWtzIGFuZCBvcGVuaW5nIG9mIGJveGVzLiAqKVxubGV0IHNldF9zaXplIHN0YXRlIHR5ID1cbiAgbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9zY2FuX3N0YWNrIHdpdGhcbiAgfCBOb25lIC0+ICgpICgqIHNjYW5fc3RhY2sgaXMgbmV2ZXIgZW1wdHkuICopXG4gIHwgU29tZSB7IGxlZnRfdG90YWw7IHF1ZXVlX2VsZW0gfSAtPlxuICAgIGxldCBzaXplID0gU2l6ZS50b19pbnQgcXVldWVfZWxlbS5zaXplIGluXG4gICAgKCogdGVzdCBpZiBzY2FuIHN0YWNrIGNvbnRhaW5zIGFueSBkYXRhIHRoYXQgaXMgbm90IG9ic29sZXRlLiAqKVxuICAgIGlmIGxlZnRfdG90YWwgPCBzdGF0ZS5wcF9sZWZ0X3RvdGFsIHRoZW5cbiAgICAgIGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGF0ZS5wcF9zY2FuX3N0YWNrXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggcXVldWVfZWxlbS50b2tlbiB3aXRoXG4gICAgICB8IFBwX2JyZWFrIF8gfCBQcF90YnJlYWsgKF8sIF8pIC0+XG4gICAgICAgIGlmIHR5IHRoZW4gYmVnaW5cbiAgICAgICAgICBxdWV1ZV9lbGVtLnNpemUgPC0gU2l6ZS5vZl9pbnQgKHN0YXRlLnBwX3JpZ2h0X3RvdGFsICsgc2l6ZSk7XG4gICAgICAgICAgU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9zY2FuX3N0YWNrIHw+IGlnbm9yZVxuICAgICAgICBlbmRcbiAgICAgIHwgUHBfYmVnaW4gKF8sIF8pIC0+XG4gICAgICAgIGlmIG5vdCB0eSB0aGVuIGJlZ2luXG4gICAgICAgICAgcXVldWVfZWxlbS5zaXplIDwtIFNpemUub2ZfaW50IChzdGF0ZS5wcF9yaWdodF90b3RhbCArIHNpemUpO1xuICAgICAgICAgIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfc2Nhbl9zdGFjayB8PiBpZ25vcmVcbiAgICAgICAgZW5kXG4gICAgICB8IFBwX3RleHQgXyB8IFBwX3N0YWIgfCBQcF90YmVnaW4gXyB8IFBwX3RlbmQgfCBQcF9lbmRcbiAgICAgIHwgUHBfbmV3bGluZSB8IFBwX2lmX25ld2xpbmUgfCBQcF9vcGVuX3RhZyBfIHwgUHBfY2xvc2VfdGFnIC0+XG4gICAgICAgICgpICgqIHNjYW5fcHVzaCBpcyBvbmx5IHVzZWQgZm9yIGJyZWFrcyBhbmQgYm94ZXMuICopXG5cblxuKCogUHVzaCBhIHRva2VuIG9uIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrLlxuICAgSWYgYiBpcyB0cnVlIHNldF9zaXplIGlzIGNhbGxlZC4gKilcbmxldCBzY2FuX3B1c2ggc3RhdGUgYiB0b2tlbiA9XG4gIHBwX2VucXVldWUgc3RhdGUgdG9rZW47XG4gIGlmIGIgdGhlbiBzZXRfc2l6ZSBzdGF0ZSB0cnVlO1xuICBsZXQgZWxlbSA9IHsgbGVmdF90b3RhbCA9IHN0YXRlLnBwX3JpZ2h0X3RvdGFsOyBxdWV1ZV9lbGVtID0gdG9rZW4gfSBpblxuICBTdGFjay5wdXNoIGVsZW0gc3RhdGUucHBfc2Nhbl9zdGFja1xuXG5cbigqIFRvIG9wZW4gYSBuZXcgYm94IDpcbiAgIHRoZSB1c2VyIG1heSBzZXQgdGhlIGRlcHRoIGJvdW5kIHBwX21heF9ib3hlc1xuICAgYW55IHRleHQgbmVzdGVkIGRlZXBlciBpcyBwcmludGVkIGFzIHRoZSBlbGxpcHNpcyBzdHJpbmcuICopXG5sZXQgcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBicl90eSA9XG4gIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCArIDE7XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS5vZl9pbnQgKC0gc3RhdGUucHBfcmlnaHRfdG90YWwpIGluXG4gICAgbGV0IGVsZW0gPSB7IHNpemU7IHRva2VuID0gUHBfYmVnaW4gKGluZGVudCwgYnJfdHkpOyBsZW5ndGggPSAwIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgZmFsc2UgZWxlbSBlbHNlXG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPSBzdGF0ZS5wcF9tYXhfYm94ZXNcbiAgdGhlbiBlbnF1ZXVlX3N0cmluZyBzdGF0ZSBzdGF0ZS5wcF9lbGxpcHNpc1xuXG5cbigqIFRoZSBib3ggd2hpY2ggaXMgYWx3YXlzIG9wZW4uICopXG5sZXQgcHBfb3Blbl9zeXNfYm94IHN0YXRlID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIDAgUHBfaG92Ym94XG5cbigqIENsb3NlIGEgYm94LCBzZXR0aW5nIHNpemVzIG9mIGl0cyBzdWIgYm94ZXMuICopXG5sZXQgcHBfY2xvc2VfYm94IHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA+IDEgdGhlblxuICBiZWdpblxuICAgIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGJlZ2luXG4gICAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9lbmQ7IGxlbmd0aCA9IDAgfTtcbiAgICAgIHNldF9zaXplIHN0YXRlIHRydWU7IHNldF9zaXplIHN0YXRlIGZhbHNlXG4gICAgZW5kO1xuICAgIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCAtIDE7XG4gIGVuZFxuXG5cbigqIE9wZW4gYSB0YWcsIHB1c2hpbmcgaXQgb24gdGhlIHRhZyBzdGFjay4gKilcbmxldCBwcF9vcGVuX3N0YWcgc3RhdGUgdGFnX25hbWUgPVxuICBpZiBzdGF0ZS5wcF9wcmludF90YWdzIHRoZW5cbiAgYmVnaW5cbiAgICBTdGFjay5wdXNoIHRhZ19uYW1lIHN0YXRlLnBwX3RhZ19zdGFjaztcbiAgICBzdGF0ZS5wcF9wcmludF9vcGVuX3RhZyB0YWdfbmFtZVxuICBlbmQ7XG4gIGlmIHN0YXRlLnBwX21hcmtfdGFncyB0aGVuXG4gICAgbGV0IHRva2VuID0gUHBfb3Blbl90YWcgdGFnX25hbWUgaW5cbiAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW47IGxlbmd0aCA9IDAgfVxuXG5cbigqIENsb3NlIGEgdGFnLCBwb3BwaW5nIGl0IGZyb20gdGhlIHRhZyBzdGFjay4gKilcbmxldCBwcF9jbG9zZV9zdGFnIHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfbWFya190YWdzIHRoZW5cbiAgICBwcF9lbnF1ZXVlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9jbG9zZV90YWc7IGxlbmd0aCA9IDAgfTtcbiAgaWYgc3RhdGUucHBfcHJpbnRfdGFncyB0aGVuXG4gICAgbWF0Y2ggU3RhY2sucG9wX29wdCBzdGF0ZS5wcF90YWdfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBtb3JlIHRhZyB0byBjbG9zZS4gKilcbiAgICB8IFNvbWUgdGFnX25hbWUgLT5cbiAgICAgIHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZyB0YWdfbmFtZVxuXG5sZXQgcHBfc2V0X3ByaW50X3RhZ3Mgc3RhdGUgYiA9IHN0YXRlLnBwX3ByaW50X3RhZ3MgPC0gYlxubGV0IHBwX3NldF9tYXJrX3RhZ3Mgc3RhdGUgYiA9IHN0YXRlLnBwX21hcmtfdGFncyA8LSBiXG5sZXQgcHBfZ2V0X3ByaW50X3RhZ3Mgc3RhdGUgKCkgPSBzdGF0ZS5wcF9wcmludF90YWdzXG5sZXQgcHBfZ2V0X21hcmtfdGFncyBzdGF0ZSAoKSA9IHN0YXRlLnBwX21hcmtfdGFnc1xubGV0IHBwX3NldF90YWdzIHN0YXRlIGIgPVxuICBwcF9zZXRfcHJpbnRfdGFncyBzdGF0ZSBiOyBwcF9zZXRfbWFya190YWdzIHN0YXRlIGJcblxuXG4oKiBIYW5kbGluZyB0YWcgaGFuZGxpbmcgZnVuY3Rpb25zOiBnZXQvc2V0IGZ1bmN0aW9ucy4gKilcbmxldCBwcF9nZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIHN0YXRlICgpID0ge1xuICBtYXJrX29wZW5fc3RhZyA9IHN0YXRlLnBwX21hcmtfb3Blbl90YWc7XG4gIG1hcmtfY2xvc2Vfc3RhZyA9IHN0YXRlLnBwX21hcmtfY2xvc2VfdGFnO1xuICBwcmludF9vcGVuX3N0YWcgPSBzdGF0ZS5wcF9wcmludF9vcGVuX3RhZztcbiAgcHJpbnRfY2xvc2Vfc3RhZyA9IHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZztcbn1cblxuXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyBzdGF0ZSB7XG4gICAgIG1hcmtfb3Blbl9zdGFnID0gbW90O1xuICAgICBtYXJrX2Nsb3NlX3N0YWcgPSBtY3Q7XG4gICAgIHByaW50X29wZW5fc3RhZyA9IHBvdDtcbiAgICAgcHJpbnRfY2xvc2Vfc3RhZyA9IHBjdDtcbiAgfSA9XG4gIHN0YXRlLnBwX21hcmtfb3Blbl90YWcgPC0gbW90O1xuICBzdGF0ZS5wcF9tYXJrX2Nsb3NlX3RhZyA8LSBtY3Q7XG4gIHN0YXRlLnBwX3ByaW50X29wZW5fdGFnIDwtIHBvdDtcbiAgc3RhdGUucHBfcHJpbnRfY2xvc2VfdGFnIDwtIHBjdFxuXG5cbigqIEluaXRpYWxpemUgcHJldHR5LXByaW50ZXIuICopXG5sZXQgcHBfcmluaXQgc3RhdGUgPVxuICBwcF9jbGVhcl9xdWV1ZSBzdGF0ZTtcbiAgaW5pdGlhbGl6ZV9zY2FuX3N0YWNrIHN0YXRlLnBwX3NjYW5fc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX2Zvcm1hdF9zdGFjaztcbiAgU3RhY2suY2xlYXIgc3RhdGUucHBfdGJveF9zdGFjaztcbiAgU3RhY2suY2xlYXIgc3RhdGUucHBfdGFnX3N0YWNrO1xuICBTdGFjay5jbGVhciBzdGF0ZS5wcF9tYXJrX3N0YWNrO1xuICBzdGF0ZS5wcF9jdXJyZW50X2luZGVudCA8LSAwO1xuICBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwtIDA7XG4gIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfbWFyZ2luO1xuICBwcF9vcGVuX3N5c19ib3ggc3RhdGVcblxubGV0IGNsZWFyX3RhZ19zdGFjayBzdGF0ZSA9XG4gIFN0YWNrLml0ZXIgKGZ1biBfIC0+IHBwX2Nsb3NlX3N0YWcgc3RhdGUgKCkpIHN0YXRlLnBwX3RhZ19zdGFja1xuXG5cbigqIEZsdXNoaW5nIHByZXR0eS1wcmludGVyIHF1ZXVlLiAqKVxubGV0IHBwX2ZsdXNoX3F1ZXVlIHN0YXRlIGIgPVxuICBjbGVhcl90YWdfc3RhY2sgc3RhdGU7XG4gIHdoaWxlIHN0YXRlLnBwX2N1cnJfZGVwdGggPiAxIGRvXG4gICAgcHBfY2xvc2VfYm94IHN0YXRlICgpXG4gIGRvbmU7XG4gIHN0YXRlLnBwX3JpZ2h0X3RvdGFsIDwtIHBwX2luZmluaXR5O1xuICBhZHZhbmNlX2xlZnQgc3RhdGU7XG4gIGlmIGIgdGhlbiBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZTtcbiAgcHBfcmluaXQgc3RhdGVcblxuKCpcblxuICBQcm9jZWR1cmVzIHRvIGZvcm1hdCB2YWx1ZXMgYW5kIHVzZSBib3hlcy5cblxuKilcblxuKCogVG8gZm9ybWF0IGEgc3RyaW5nLiAqKVxubGV0IHBwX3ByaW50X2FzX3NpemUgc3RhdGUgc2l6ZSBzID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlc1xuICB0aGVuIGVucXVldWVfc3RyaW5nX2FzIHN0YXRlIHNpemUgc1xuXG5cbmxldCBwcF9wcmludF9hcyBzdGF0ZSBpc2l6ZSBzID1cbiAgcHBfcHJpbnRfYXNfc2l6ZSBzdGF0ZSAoU2l6ZS5vZl9pbnQgaXNpemUpIHNcblxuXG5sZXQgcHBfcHJpbnRfc3RyaW5nIHN0YXRlIHMgPVxuICBwcF9wcmludF9hcyBzdGF0ZSAoU3RyaW5nLmxlbmd0aCBzKSBzXG5cbmxldCBwcF9wcmludF9ieXRlcyBzdGF0ZSBzID1cbiAgcHBfcHJpbnRfYXMgc3RhdGUgKEJ5dGVzLmxlbmd0aCBzKSAoQnl0ZXMudG9fc3RyaW5nIHMpXG5cbigqIFRvIGZvcm1hdCBhbiBpbnRlZ2VyLiAqKVxubGV0IHBwX3ByaW50X2ludCBzdGF0ZSBpID0gcHBfcHJpbnRfc3RyaW5nIHN0YXRlIChJbnQudG9fc3RyaW5nIGkpXG5cbigqIFRvIGZvcm1hdCBhIGZsb2F0LiAqKVxubGV0IHBwX3ByaW50X2Zsb2F0IHN0YXRlIGYgPSBwcF9wcmludF9zdHJpbmcgc3RhdGUgKHN0cmluZ19vZl9mbG9hdCBmKVxuXG4oKiBUbyBmb3JtYXQgYSBib29sZWFuLiAqKVxubGV0IHBwX3ByaW50X2Jvb2wgc3RhdGUgYiA9IHBwX3ByaW50X3N0cmluZyBzdGF0ZSAoc3RyaW5nX29mX2Jvb2wgYilcblxuKCogVG8gZm9ybWF0IGEgY2hhci4gKilcbmxldCBwcF9wcmludF9jaGFyIHN0YXRlIGMgPVxuICBwcF9wcmludF9hcyBzdGF0ZSAxIChTdHJpbmcubWFrZSAxIGMpXG5cblxuKCogT3BlbmluZyBib3hlcy4gKilcbmxldCBwcF9vcGVuX2hib3ggc3RhdGUgKCkgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgMCBQcF9oYm94XG5hbmQgcHBfb3Blbl92Ym94IHN0YXRlIGluZGVudCA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgUHBfdmJveFxuXG5hbmQgcHBfb3Blbl9odmJveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX2h2Ym94XG5hbmQgcHBfb3Blbl9ob3Zib3ggc3RhdGUgaW5kZW50ID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBQcF9ob3Zib3hcbmFuZCBwcF9vcGVuX2JveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX2JveFxuXG5cbigqIFByaW50aW5nIHF1ZXVlZCB0ZXh0LlxuXG4gICBbcHBfcHJpbnRfZmx1c2hdIHByaW50cyBhbGwgcGVuZGluZyBpdGVtcyBpbiB0aGUgcHJldHR5LXByaW50ZXIgcXVldWUgYW5kXG4gICB0aGVuIGZsdXNoZXMgdGhlIGxvdyBsZXZlbCBvdXRwdXQgZGV2aWNlIG9mIHRoZSBmb3JtYXR0ZXIgdG8gYWN0dWFsbHlcbiAgIGRpc3BsYXkgcHJpbnRpbmcgbWF0ZXJpYWwuXG5cbiAgIFtwcF9wcmludF9uZXdsaW5lXSBiZWhhdmVzIGFzIFtwcF9wcmludF9mbHVzaF0gYWZ0ZXIgcHJpbnRpbmcgYW4gYWRkaXRpb25hbFxuICAgbmV3IGxpbmUuICopXG5sZXQgcHBfcHJpbnRfbmV3bGluZSBzdGF0ZSAoKSA9XG4gIHBwX2ZsdXNoX3F1ZXVlIHN0YXRlIHRydWU7IHN0YXRlLnBwX291dF9mbHVzaCAoKVxuYW5kIHBwX3ByaW50X2ZsdXNoIHN0YXRlICgpID1cbiAgcHBfZmx1c2hfcXVldWUgc3RhdGUgZmFsc2U7IHN0YXRlLnBwX291dF9mbHVzaCAoKVxuXG5cbigqIFRvIGdldCBhIG5ld2xpbmUgd2hlbiBvbmUgZG9lcyBub3Qgd2FudCB0byBjbG9zZSB0aGUgY3VycmVudCBib3guICopXG5sZXQgcHBfZm9yY2VfbmV3bGluZSBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfbmV3bGluZTsgbGVuZ3RoID0gMCB9XG5cblxuKCogVG8gZm9ybWF0IHNvbWV0aGluZywgb25seSBpbiBjYXNlIHRoZSBsaW5lIGhhcyBqdXN0IGJlZW4gYnJva2VuLiAqKVxubGV0IHBwX3ByaW50X2lmX25ld2xpbmUgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGVcbiAgICAgIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9pZl9uZXdsaW5lOyBsZW5ndGggPSAwIH1cblxuXG4oKiBHZW5lcmFsaXplZCBicmVhayBoaW50IHRoYXQgYWxsb3dzIHByaW50aW5nIHN0cmluZ3MgYmVmb3JlL2FmdGVyXG4gICBzYW1lLWxpbmUgb2Zmc2V0ICh3aWR0aCkgb3IgbmV3LWxpbmUgb2Zmc2V0ICopXG5sZXQgcHBfcHJpbnRfY3VzdG9tX2JyZWFrIHN0YXRlIH5maXRzIH5icmVha3MgPVxuICBsZXQgYmVmb3JlLCB3aWR0aCwgYWZ0ZXIgPSBmaXRzIGluXG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS5vZl9pbnQgKC0gc3RhdGUucHBfcmlnaHRfdG90YWwpIGluXG4gICAgbGV0IHRva2VuID0gUHBfYnJlYWsgeyBmaXRzOyBicmVha3MgfSBpblxuICAgIGxldCBsZW5ndGggPSBTdHJpbmcubGVuZ3RoIGJlZm9yZSArIHdpZHRoICsgU3RyaW5nLmxlbmd0aCBhZnRlciBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbjsgbGVuZ3RoIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgdHJ1ZSBlbGVtXG5cbigqIFByaW50aW5nIGJyZWFrIGhpbnRzOlxuICAgQSBicmVhayBoaW50IGluZGljYXRlcyB3aGVyZSBhIGJveCBtYXkgYmUgYnJva2VuLlxuICAgSWYgbGluZSBpcyBicm9rZW4gdGhlbiBvZmZzZXQgaXMgYWRkZWQgdG8gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50XG4gICBib3ggZWxzZSAodGhlIHZhbHVlIG9mKSB3aWR0aCBibGFua3MgYXJlIHByaW50ZWQuICopXG5sZXQgcHBfcHJpbnRfYnJlYWsgc3RhdGUgd2lkdGggb2Zmc2V0ID1cbiAgcHBfcHJpbnRfY3VzdG9tX2JyZWFrIHN0YXRlXG4gICAgfmZpdHM6KFwiXCIsIHdpZHRoLCBcIlwiKSB+YnJlYWtzOihcIlwiLCBvZmZzZXQsIFwiXCIpXG5cblxuKCogUHJpbnQgYSBzcGFjZSA6XG4gICBhIHNwYWNlIGlzIGEgYnJlYWsgaGludCB0aGF0IHByaW50cyBhIHNpbmdsZSBzcGFjZSBpZiB0aGUgYnJlYWsgZG9lcyBub3RcbiAgIHNwbGl0IHRoZSBsaW5lO1xuICAgYSBjdXQgaXMgYSBicmVhayBoaW50IHRoYXQgcHJpbnRzIG5vdGhpbmcgaWYgdGhlIGJyZWFrIGRvZXMgbm90IHNwbGl0IHRoZVxuICAgbGluZS4gKilcbmxldCBwcF9wcmludF9zcGFjZSBzdGF0ZSAoKSA9IHBwX3ByaW50X2JyZWFrIHN0YXRlIDEgMFxuYW5kIHBwX3ByaW50X2N1dCBzdGF0ZSAoKSA9IHBwX3ByaW50X2JyZWFrIHN0YXRlIDAgMFxuXG5cbigqIFRhYnVsYXRpb24gYm94ZXMuICopXG5sZXQgcHBfb3Blbl90Ym94IHN0YXRlICgpID1cbiAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSBzdGF0ZS5wcF9jdXJyX2RlcHRoICsgMTtcbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IHNpemUgPSBTaXplLnplcm8gaW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZTsgdG9rZW4gPSBQcF90YmVnaW4gKFBwX3Rib3ggKHJlZiBbXSkpOyBsZW5ndGggPSAwIH0gaW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgZWxlbVxuXG5cbigqIENsb3NlIGEgdGFidWxhdGlvbiBib3guICopXG5sZXQgcHBfY2xvc2VfdGJveCBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPiAxIHRoZW5cbiAgYmVnaW5cbiAgIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgICBsZXQgZWxlbSA9IHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF90ZW5kOyBsZW5ndGggPSAwIH0gaW5cbiAgICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIGVsZW07XG4gICAgIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCAtIDFcbiAgZW5kXG5cblxuKCogUHJpbnQgYSB0YWJ1bGF0aW9uIGJyZWFrLiAqKVxubGV0IHBwX3ByaW50X3RicmVhayBzdGF0ZSB3aWR0aCBvZmZzZXQgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgc2l6ZSA9IFNpemUub2ZfaW50ICgtIHN0YXRlLnBwX3JpZ2h0X3RvdGFsKSBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbiA9IFBwX3RicmVhayAod2lkdGgsIG9mZnNldCk7IGxlbmd0aCA9IHdpZHRoIH0gaW5cbiAgICBzY2FuX3B1c2ggc3RhdGUgdHJ1ZSBlbGVtXG5cblxubGV0IHBwX3ByaW50X3RhYiBzdGF0ZSAoKSA9IHBwX3ByaW50X3RicmVhayBzdGF0ZSAwIDBcblxubGV0IHBwX3NldF90YWIgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9zdGFiOyBsZW5ndGggPSAwIH0gaW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgZWxlbVxuXG5cbigqXG5cbiAgUHJvY2VkdXJlcyB0byBjb250cm9sIHRoZSBwcmV0dHktcHJpbnRlcnNcblxuKilcblxuKCogU2V0X21heF9ib3hlcy4gKilcbmxldCBwcF9zZXRfbWF4X2JveGVzIHN0YXRlIG4gPSBpZiBuID4gMSB0aGVuIHN0YXRlLnBwX21heF9ib3hlcyA8LSBuXG5cbigqIFRvIGtub3cgdGhlIGN1cnJlbnQgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgYWxsb3dlZC4gKilcbmxldCBwcF9nZXRfbWF4X2JveGVzIHN0YXRlICgpID0gc3RhdGUucHBfbWF4X2JveGVzXG5cbmxldCBwcF9vdmVyX21heF9ib3hlcyBzdGF0ZSAoKSA9IHN0YXRlLnBwX2N1cnJfZGVwdGggPSBzdGF0ZS5wcF9tYXhfYm94ZXNcblxuKCogRWxsaXBzaXMuICopXG5sZXQgcHBfc2V0X2VsbGlwc2lzX3RleHQgc3RhdGUgcyA9IHN0YXRlLnBwX2VsbGlwc2lzIDwtIHNcbmFuZCBwcF9nZXRfZWxsaXBzaXNfdGV4dCBzdGF0ZSAoKSA9IHN0YXRlLnBwX2VsbGlwc2lzXG5cblxuKCogVG8gc2V0IHRoZSBtYXJnaW4gb2YgcHJldHR5LXByaW50ZXIuICopXG5sZXQgcHBfbGltaXQgbiA9XG4gIGlmIG4gPCBwcF9pbmZpbml0eSB0aGVuIG4gZWxzZSBwcmVkIHBwX2luZmluaXR5XG5cblxuKCogSW50ZXJuYWwgcHJldHR5LXByaW50ZXIgZnVuY3Rpb25zLiAqKVxubGV0IHBwX3NldF9taW5fc3BhY2VfbGVmdCBzdGF0ZSBuID1cbiAgaWYgbiA+PSAxIHRoZW5cbiAgICBsZXQgbiA9IHBwX2xpbWl0IG4gaW5cbiAgICBzdGF0ZS5wcF9taW5fc3BhY2VfbGVmdCA8LSBuO1xuICAgIHN0YXRlLnBwX21heF9pbmRlbnQgPC0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfbWluX3NwYWNlX2xlZnQ7XG4gICAgcHBfcmluaXQgc3RhdGVcblxuXG4oKiBJbml0aWFsbHksIHdlIGhhdmUgOlxuICAgcHBfbWF4X2luZGVudCA9IHBwX21hcmdpbiAtIHBwX21pbl9zcGFjZV9sZWZ0LCBhbmRcbiAgIHBwX3NwYWNlX2xlZnQgPSBwcF9tYXJnaW4uICopXG5sZXQgcHBfc2V0X21heF9pbmRlbnQgc3RhdGUgbiA9XG4gIGlmIG4gPiAxIHRoZW5cbiAgICBwcF9zZXRfbWluX3NwYWNlX2xlZnQgc3RhdGUgKHN0YXRlLnBwX21hcmdpbiAtIG4pXG5cblxubGV0IHBwX2dldF9tYXhfaW5kZW50IHN0YXRlICgpID0gc3RhdGUucHBfbWF4X2luZGVudFxuXG5sZXQgcHBfc2V0X21hcmdpbiBzdGF0ZSBuID1cbiAgaWYgbiA+PSAxIHRoZW5cbiAgICBsZXQgbiA9IHBwX2xpbWl0IG4gaW5cbiAgICBzdGF0ZS5wcF9tYXJnaW4gPC0gbjtcbiAgICBsZXQgbmV3X21heF9pbmRlbnQgPVxuICAgICAgKCogVHJ5IHRvIG1haW50YWluIG1heF9pbmRlbnQgdG8gaXRzIGFjdHVhbCB2YWx1ZS4gKilcbiAgICAgIGlmIHN0YXRlLnBwX21heF9pbmRlbnQgPD0gc3RhdGUucHBfbWFyZ2luXG4gICAgICB0aGVuIHN0YXRlLnBwX21heF9pbmRlbnQgZWxzZVxuICAgICAgKCogSWYgcG9zc2libGUgbWFpbnRhaW4gcHBfbWluX3NwYWNlX2xlZnQgdG8gaXRzIGFjdHVhbCB2YWx1ZSxcbiAgICAgICAgIGlmIHRoaXMgbGVhZHMgdG8gYSB0b28gc21hbGwgbWF4X2luZGVudCwgdGFrZSBoYWxmIG9mIHRoZVxuICAgICAgICAgbmV3IG1hcmdpbiwgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIDEuICopXG4gICAgICAgSW50Lm1heCAoSW50Lm1heCAoc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfbWluX3NwYWNlX2xlZnQpXG4gICAgICAgICAgICAgICAgKHN0YXRlLnBwX21hcmdpbiAvIDIpKSAxIGluXG4gICAgKCogUmVidWlsZCBpbnZhcmlhbnRzLiAqKVxuICAgIHBwX3NldF9tYXhfaW5kZW50IHN0YXRlIG5ld19tYXhfaW5kZW50XG5cblxuKCoqIEdlb21ldHJ5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgKilcbnR5cGUgZ2VvbWV0cnkgPSB7IG1heF9pbmRlbnQ6aW50OyBtYXJnaW46IGludH1cblxubGV0IHZhbGlkYXRlX2dlb21ldHJ5IHttYXJnaW47IG1heF9pbmRlbnR9ID1cbiAgaWYgbWF4X2luZGVudCA8IDIgdGhlblxuICAgIEVycm9yIFwibWF4X2luZGVudCA8IDJcIlxuICBlbHNlIGlmIG1hcmdpbiA8PSBtYXhfaW5kZW50IHRoZW5cbiAgICBFcnJvciBcIm1hcmdpbiA8PSBtYXhfaW5kZW50XCJcbiAgZWxzZSBPayAoKVxuXG5sZXQgY2hlY2tfZ2VvbWV0cnkgZ2VvbWV0cnkgPVxuICBtYXRjaCB2YWxpZGF0ZV9nZW9tZXRyeSBnZW9tZXRyeSB3aXRoXG4gIHwgT2sgKCkgLT4gdHJ1ZVxuICB8IEVycm9yIF8gLT4gZmFsc2VcblxubGV0IHBwX2dldF9tYXJnaW4gc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXJnaW5cblxubGV0IHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlIHttYXJnaW47IG1heF9pbmRlbnR9ID1cbiAgcHBfc2V0X21hcmdpbiBzdGF0ZSBtYXJnaW47XG4gIHBwX3NldF9tYXhfaW5kZW50IHN0YXRlIG1heF9pbmRlbnQ7XG4gICgpXG5cbmxldCBwcF9zZXRfZ2VvbWV0cnkgc3RhdGUgfm1heF9pbmRlbnQgfm1hcmdpbiA9XG4gIGxldCBnZW9tZXRyeSA9IHsgbWF4X2luZGVudDsgbWFyZ2luIH0gaW5cbiAgbWF0Y2ggdmFsaWRhdGVfZ2VvbWV0cnkgZ2VvbWV0cnkgd2l0aFxuICB8IEVycm9yIG1zZyAtPlxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcIkZvcm1hdC5wcF9zZXRfZ2VvbWV0cnk6IFwiIF4gbXNnKSlcbiAgfCBPayAoKSAtPlxuICAgIHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlIGdlb21ldHJ5XG5cbmxldCBwcF9zYWZlX3NldF9nZW9tZXRyeSBzdGF0ZSB+bWF4X2luZGVudCB+bWFyZ2luID1cbiAgbGV0IGdlb21ldHJ5ID0geyBtYXhfaW5kZW50OyBtYXJnaW4gfSBpblxuICBtYXRjaCB2YWxpZGF0ZV9nZW9tZXRyeSBnZW9tZXRyeSB3aXRoXG4gIHwgRXJyb3IgX21zZyAtPlxuICAgICAoKVxuICB8IE9rICgpIC0+XG4gICAgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUgZ2VvbWV0cnlcblxubGV0IHBwX2dldF9nZW9tZXRyeSBzdGF0ZSAoKSA9XG4gIHsgbWFyZ2luID0gcHBfZ2V0X21hcmdpbiBzdGF0ZSAoKTsgbWF4X2luZGVudCA9IHBwX2dldF9tYXhfaW5kZW50IHN0YXRlICgpIH1cblxubGV0IHBwX3VwZGF0ZV9nZW9tZXRyeSBzdGF0ZSB1cGRhdGUgPVxuICBsZXQgZ2VvbWV0cnkgPSBwcF9nZXRfZ2VvbWV0cnkgc3RhdGUgKCkgaW5cbiAgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUgKHVwZGF0ZSBnZW9tZXRyeSlcblxuKCogU2V0dGluZyBhIGZvcm1hdHRlciBiYXNpYyBvdXRwdXQgZnVuY3Rpb25zLiAqKVxubGV0IHBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGF0ZSB7XG4gICAgICBvdXRfc3RyaW5nID0gZjtcbiAgICAgIG91dF9mbHVzaCA9IGc7XG4gICAgICBvdXRfbmV3bGluZSA9IGg7XG4gICAgICBvdXRfc3BhY2VzID0gaTtcbiAgICAgIG91dF9pbmRlbnQgPSBqO1xuICAgIH0gPVxuICBzdGF0ZS5wcF9vdXRfc3RyaW5nIDwtIGY7XG4gIHN0YXRlLnBwX291dF9mbHVzaCA8LSBnO1xuICBzdGF0ZS5wcF9vdXRfbmV3bGluZSA8LSBoO1xuICBzdGF0ZS5wcF9vdXRfc3BhY2VzIDwtIGk7XG4gIHN0YXRlLnBwX291dF9pbmRlbnQgPC0galxuXG5sZXQgcHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHN0YXRlICgpID0ge1xuICBvdXRfc3RyaW5nID0gc3RhdGUucHBfb3V0X3N0cmluZztcbiAgb3V0X2ZsdXNoID0gc3RhdGUucHBfb3V0X2ZsdXNoO1xuICBvdXRfbmV3bGluZSA9IHN0YXRlLnBwX291dF9uZXdsaW5lO1xuICBvdXRfc3BhY2VzID0gc3RhdGUucHBfb3V0X3NwYWNlcztcbiAgb3V0X2luZGVudCA9IHN0YXRlLnBwX291dF9pbmRlbnQ7XG59XG5cblxuKCogU2V0dGluZyBhIGZvcm1hdHRlciBiYXNpYyBzdHJpbmcgb3V0cHV0IGFuZCBmbHVzaCBmdW5jdGlvbnMuICopXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlIGYgZyA9XG4gIHN0YXRlLnBwX291dF9zdHJpbmcgPC0gZjsgc3RhdGUucHBfb3V0X2ZsdXNoIDwtIGdcblxubGV0IHBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyBzdGF0ZSAoKSA9XG4gIChzdGF0ZS5wcF9vdXRfc3RyaW5nLCBzdGF0ZS5wcF9vdXRfZmx1c2gpXG5cblxuKCogVGhlIGRlZmF1bHQgZnVuY3Rpb24gdG8gb3V0cHV0IG5ldyBsaW5lcy4gKilcbmxldCBkaXNwbGF5X25ld2xpbmUgc3RhdGUgKCkgPSBzdGF0ZS5wcF9vdXRfc3RyaW5nIFwiXFxuXCIgMCAgMVxuXG4oKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBvdXRwdXQgc3BhY2VzLiAqKVxubGV0IGJsYW5rX2xpbmUgPSBTdHJpbmcubWFrZSA4MCAnICdcbmxldCByZWMgZGlzcGxheV9ibGFua3Mgc3RhdGUgbiA9XG4gIGlmIG4gPiAwIHRoZW5cbiAgaWYgbiA8PSA4MCB0aGVuIHN0YXRlLnBwX291dF9zdHJpbmcgYmxhbmtfbGluZSAwIG4gZWxzZVxuICBiZWdpblxuICAgIHN0YXRlLnBwX291dF9zdHJpbmcgYmxhbmtfbGluZSAwIDgwO1xuICAgIGRpc3BsYXlfYmxhbmtzIHN0YXRlIChuIC0gODApXG4gIGVuZFxuXG5cbigqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIG91dHB1dCBpbmRlbnRhdGlvbiBvZiBuZXcgbGluZXMuICopXG5sZXQgZGlzcGxheV9pbmRlbnQgPSBkaXNwbGF5X2JsYW5rc1xuXG4oKiBTZXR0aW5nIGEgZm9ybWF0dGVyIGJhc2ljIG91dHB1dCBmdW5jdGlvbnMgYXMgcHJpbnRpbmcgdG8gYSBnaXZlblxuICAgW1N0ZGxpYi5vdXRfY2hhbm5lbF0gdmFsdWUuICopXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCBzdGF0ZSBvYyA9XG4gIHN0YXRlLnBwX291dF9zdHJpbmcgPC0gb3V0cHV0X3N1YnN0cmluZyBvYztcbiAgc3RhdGUucHBfb3V0X2ZsdXNoIDwtIChmdW4gKCkgLT4gZmx1c2ggb2MpO1xuICBzdGF0ZS5wcF9vdXRfbmV3bGluZSA8LSBkaXNwbGF5X25ld2xpbmUgc3RhdGU7XG4gIHN0YXRlLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3Mgc3RhdGU7XG4gIHN0YXRlLnBwX291dF9pbmRlbnQgPC0gZGlzcGxheV9pbmRlbnQgc3RhdGVcblxuKCpcblxuICBEZWZpbmluZyBzcGVjaWZpYyBmb3JtYXR0ZXJzXG5cbiopXG5cbmxldCBkZWZhdWx0X3BwX21hcmtfb3Blbl90YWcgPSBmdW5jdGlvblxuICB8IFN0cmluZ190YWcgcyAtPiBcIjxcIiBeIHMgXiBcIj5cIlxuICB8IF8gLT4gXCJcIlxubGV0IGRlZmF1bHRfcHBfbWFya19jbG9zZV90YWcgPSBmdW5jdGlvblxuICB8IFN0cmluZ190YWcgcyAtPiBcIjwvXCIgXiBzIF4gXCI+XCJcbiAgfCBfIC0+IFwiXCJcblxubGV0IGRlZmF1bHRfcHBfcHJpbnRfb3Blbl90YWcgPSBpZ25vcmVcbmxldCBkZWZhdWx0X3BwX3ByaW50X2Nsb3NlX3RhZyA9IGlnbm9yZVxuXG4oKiBCdWlsZGluZyBhIGZvcm1hdHRlciBnaXZlbiBpdHMgYmFzaWMgb3V0cHV0IGZ1bmN0aW9ucy5cbiAgIE90aGVyIGZpZWxkcyBnZXQgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlcy4gKilcbmxldCBwcF9tYWtlX2Zvcm1hdHRlciBmIGcgaCBpIGogPVxuICAoKiBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZm9ybWF0dGVyIGNvbnRhaW5zIGEgZHVtbXkgYm94LiAqKVxuICBsZXQgcHBfcXVldWUgPSBRdWV1ZS5jcmVhdGUgKCkgaW5cbiAgbGV0IHN5c190b2sgPVxuICAgIHsgc2l6ZSA9IFNpemUudW5rbm93bjsgdG9rZW4gPSBQcF9iZWdpbiAoMCwgUHBfaG92Ym94KTsgbGVuZ3RoID0gMCB9IGluXG4gIFF1ZXVlLmFkZCBzeXNfdG9rIHBwX3F1ZXVlO1xuICBsZXQgc2Nhbl9zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKSBpblxuICBpbml0aWFsaXplX3NjYW5fc3RhY2sgc2Nhbl9zdGFjaztcbiAgU3RhY2sucHVzaCB7IGxlZnRfdG90YWwgPSAxOyBxdWV1ZV9lbGVtID0gc3lzX3RvayB9IHNjYW5fc3RhY2s7XG4gIGxldCBwcF9tYXJnaW4gPSA3OFxuICBhbmQgcHBfbWluX3NwYWNlX2xlZnQgPSAxMCBpblxuICB7XG4gICAgcHBfc2Nhbl9zdGFjayA9IHNjYW5fc3RhY2s7XG4gICAgcHBfZm9ybWF0X3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX3Rib3hfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfdGFnX3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX21hcmtfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfbWFyZ2luID0gcHBfbWFyZ2luO1xuICAgIHBwX21pbl9zcGFjZV9sZWZ0ID0gcHBfbWluX3NwYWNlX2xlZnQ7XG4gICAgcHBfbWF4X2luZGVudCA9IHBwX21hcmdpbiAtIHBwX21pbl9zcGFjZV9sZWZ0O1xuICAgIHBwX3NwYWNlX2xlZnQgPSBwcF9tYXJnaW47XG4gICAgcHBfY3VycmVudF9pbmRlbnQgPSAwO1xuICAgIHBwX2lzX25ld19saW5lID0gdHJ1ZTtcbiAgICBwcF9sZWZ0X3RvdGFsID0gMTtcbiAgICBwcF9yaWdodF90b3RhbCA9IDE7XG4gICAgcHBfY3Vycl9kZXB0aCA9IDE7XG4gICAgcHBfbWF4X2JveGVzID0gbWF4X2ludDtcbiAgICBwcF9lbGxpcHNpcyA9IFwiLlwiO1xuICAgIHBwX291dF9zdHJpbmcgPSBmO1xuICAgIHBwX291dF9mbHVzaCA9IGc7XG4gICAgcHBfb3V0X25ld2xpbmUgPSBoO1xuICAgIHBwX291dF9zcGFjZXMgPSBpO1xuICAgIHBwX291dF9pbmRlbnQgPSBqO1xuICAgIHBwX3ByaW50X3RhZ3MgPSBmYWxzZTtcbiAgICBwcF9tYXJrX3RhZ3MgPSBmYWxzZTtcbiAgICBwcF9tYXJrX29wZW5fdGFnID0gZGVmYXVsdF9wcF9tYXJrX29wZW5fdGFnO1xuICAgIHBwX21hcmtfY2xvc2VfdGFnID0gZGVmYXVsdF9wcF9tYXJrX2Nsb3NlX3RhZztcbiAgICBwcF9wcmludF9vcGVuX3RhZyA9IGRlZmF1bHRfcHBfcHJpbnRfb3Blbl90YWc7XG4gICAgcHBfcHJpbnRfY2xvc2VfdGFnID0gZGVmYXVsdF9wcF9wcmludF9jbG9zZV90YWc7XG4gICAgcHBfcXVldWUgPSBwcF9xdWV1ZTtcbiAgfVxuXG5cbigqIEJ1aWxkIGEgZm9ybWF0dGVyIG91dCBvZiBpdHMgb3V0IGZ1bmN0aW9ucy4gKilcbmxldCBmb3JtYXR0ZXJfb2Zfb3V0X2Z1bmN0aW9ucyBvdXRfZnVucyA9XG4gIHBwX21ha2VfZm9ybWF0dGVyXG4gICAgb3V0X2Z1bnMub3V0X3N0cmluZ1xuICAgIG91dF9mdW5zLm91dF9mbHVzaFxuICAgIG91dF9mdW5zLm91dF9uZXdsaW5lXG4gICAgb3V0X2Z1bnMub3V0X3NwYWNlc1xuICAgIG91dF9mdW5zLm91dF9pbmRlbnRcblxuXG4oKiBNYWtlIGEgZm9ybWF0dGVyIHdpdGggZGVmYXVsdCBmdW5jdGlvbnMgdG8gb3V0cHV0IHNwYWNlcyxcbiAgaW5kZW50YXRpb24sIGFuZCBuZXcgbGluZXMuICopXG5sZXQgbWFrZV9mb3JtYXR0ZXIgb3V0cHV0IGZsdXNoID1cbiAgbGV0IHBwZiA9IHBwX21ha2VfZm9ybWF0dGVyIG91dHB1dCBmbHVzaCBpZ25vcmUgaWdub3JlIGlnbm9yZSBpblxuICBwcGYucHBfb3V0X25ld2xpbmUgPC0gZGlzcGxheV9uZXdsaW5lIHBwZjtcbiAgcHBmLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3MgcHBmO1xuICBwcGYucHBfb3V0X2luZGVudCA8LSBkaXNwbGF5X2luZGVudCBwcGY7XG4gIHBwZlxuXG5cbigqIE1ha2UgYSBmb3JtYXR0ZXIgd3JpdGluZyB0byBhIGdpdmVuIFtTdGRsaWIub3V0X2NoYW5uZWxdIHZhbHVlLiAqKVxubGV0IGZvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCBvYyA9XG4gIG1ha2VfZm9ybWF0dGVyIChvdXRwdXRfc3Vic3RyaW5nIG9jKSAoZnVuICgpIC0+IGZsdXNoIG9jKVxuXG5cbigqIE1ha2UgYSBmb3JtYXR0ZXIgd3JpdGluZyB0byBhIGdpdmVuIFtCdWZmZXIudF0gdmFsdWUuICopXG5sZXQgZm9ybWF0dGVyX29mX2J1ZmZlciBiID1cbiAgbWFrZV9mb3JtYXR0ZXIgKEJ1ZmZlci5hZGRfc3Vic3RyaW5nIGIpIGlnbm9yZVxuXG5cbigqIEFsbG9jYXRpbmcgYnVmZmVyIGZvciBwcmV0dHktcHJpbnRpbmcgcHVycG9zZXMuXG4gICBEZWZhdWx0IGJ1ZmZlciBzaXplIGlzIHBwX2J1ZmZlcl9zaXplIG9yIDUxMi5cbiopXG5sZXQgcHBfYnVmZmVyX3NpemUgPSA1MTJcbmxldCBwcF9tYWtlX2J1ZmZlciAoKSA9IEJ1ZmZlci5jcmVhdGUgcHBfYnVmZmVyX3NpemVcblxuKCogVGhlIHN0YW5kYXJkIChzaGFyZWQpIGJ1ZmZlci4gKilcbmxldCBzdGRidWYgPSBwcF9tYWtlX2J1ZmZlciAoKVxuXG4oKiBQcmVkZWZpbmVkIGZvcm1hdHRlcnMgc3RhbmRhcmQgZm9ybWF0dGVyIHRvIHByaW50XG4gICB0byBbU3RkbGliLnN0ZG91dF0sIFtTdGRsaWIuc3RkZXJyXSwgYW5kIHshc3RkYnVmfS4gKilcbmxldCBzdGRfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX291dF9jaGFubmVsIFN0ZGxpYi5zdGRvdXRcbmFuZCBlcnJfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX291dF9jaGFubmVsIFN0ZGxpYi5zdGRlcnJcbmFuZCBzdHJfZm9ybWF0dGVyID0gZm9ybWF0dGVyX29mX2J1ZmZlciBzdGRidWZcblxuKCogSW5pdGlhbGlzZSBkb21haW4gbG9jYWwgc3RhdGUgKilcbm1vZHVsZSBETFMgPSBEb21haW4uRExTXG5cbmxldCBzdGRidWZfa2V5ID0gRExTLm5ld19rZXkgcHBfbWFrZV9idWZmZXJcbmxldCBfID0gRExTLnNldCBzdGRidWZfa2V5IHN0ZGJ1ZlxuXG5sZXQgc3RyX2Zvcm1hdHRlcl9rZXkgPSBETFMubmV3X2tleSAoZnVuICgpIC0+XG4gIGZvcm1hdHRlcl9vZl9idWZmZXIgKERMUy5nZXQgc3RkYnVmX2tleSkpXG5sZXQgXyA9IERMUy5zZXQgc3RyX2Zvcm1hdHRlcl9rZXkgc3RyX2Zvcm1hdHRlclxuXG5sZXQgYnVmZmVyZWRfb3V0X3N0cmluZyBrZXkgc3RyIG9mcyBsZW4gPVxuICBCdWZmZXIuYWRkX3N1YnN0cmluZyAoRG9tYWluLkRMUy5nZXQga2V5KSBzdHIgb2ZzIGxlblxuXG5sZXQgYnVmZmVyZWRfb3V0X2ZsdXNoIG9jIGtleSAoKSA9XG4gIGxldCBidWYgPSBEb21haW4uRExTLmdldCBrZXkgaW5cbiAgbGV0IGxlbiA9IEJ1ZmZlci5sZW5ndGggYnVmIGluXG4gIGxldCBzdHIgPSBCdWZmZXIuY29udGVudHMgYnVmIGluXG4gIG91dHB1dF9zdWJzdHJpbmcgb2Mgc3RyIDAgbGVuIDtcbiAgU3RkbGliLmZsdXNoIG9jO1xuICBCdWZmZXIuY2xlYXIgYnVmXG5cbmxldCBzdGRfYnVmX2tleSA9IERvbWFpbi5ETFMubmV3X2tleSAoZnVuICgpIC0+IEJ1ZmZlci5jcmVhdGUgcHBfYnVmZmVyX3NpemUpXG5sZXQgZXJyX2J1Zl9rZXkgPSBEb21haW4uRExTLm5ld19rZXkgKGZ1biAoKSAtPiBCdWZmZXIuY3JlYXRlIHBwX2J1ZmZlcl9zaXplKVxuXG5sZXQgc3RkX2Zvcm1hdHRlcl9rZXkgPSBETFMubmV3X2tleSAoZnVuICgpIC0+XG4gIGxldCBwcGYgPVxuICAgIHBwX21ha2VfZm9ybWF0dGVyIChidWZmZXJlZF9vdXRfc3RyaW5nIHN0ZF9idWZfa2V5KVxuICAgICAgKGJ1ZmZlcmVkX291dF9mbHVzaCBTdGRsaWIuc3Rkb3V0IHN0ZF9idWZfa2V5KSBpZ25vcmUgaWdub3JlIGlnbm9yZVxuICBpblxuICBwcGYucHBfb3V0X25ld2xpbmUgPC0gZGlzcGxheV9uZXdsaW5lIHBwZjtcbiAgcHBmLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3MgcHBmO1xuICBwcGYucHBfb3V0X2luZGVudCA8LSBkaXNwbGF5X2luZGVudCBwcGY7XG4gIERvbWFpbi5hdF9leGl0IChwcF9wcmludF9mbHVzaCBwcGYpO1xuICBwcGYpXG5sZXQgXyA9IERMUy5zZXQgc3RkX2Zvcm1hdHRlcl9rZXkgc3RkX2Zvcm1hdHRlclxuXG5sZXQgZXJyX2Zvcm1hdHRlcl9rZXkgPSBETFMubmV3X2tleSAoZnVuICgpIC0+XG4gIGxldCBwcGYgPVxuICAgIHBwX21ha2VfZm9ybWF0dGVyIChidWZmZXJlZF9vdXRfc3RyaW5nIGVycl9idWZfa2V5KVxuICAgICAgKGJ1ZmZlcmVkX291dF9mbHVzaCBTdGRsaWIuc3RkZXJyIGVycl9idWZfa2V5KSBpZ25vcmUgaWdub3JlIGlnbm9yZVxuICBpblxuICBwcGYucHBfb3V0X25ld2xpbmUgPC0gZGlzcGxheV9uZXdsaW5lIHBwZjtcbiAgcHBmLnBwX291dF9zcGFjZXMgPC0gZGlzcGxheV9ibGFua3MgcHBmO1xuICBwcGYucHBfb3V0X2luZGVudCA8LSBkaXNwbGF5X2luZGVudCBwcGY7XG4gIERvbWFpbi5hdF9leGl0IChwcF9wcmludF9mbHVzaCBwcGYpO1xuICBwcGYpXG5sZXQgXyA9IERMUy5zZXQgZXJyX2Zvcm1hdHRlcl9rZXkgZXJyX2Zvcm1hdHRlclxuXG5sZXQgZ2V0X3N0ZF9mb3JtYXR0ZXIgKCkgPSBETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5XG5sZXQgZ2V0X2Vycl9mb3JtYXR0ZXIgKCkgPSBETFMuZ2V0IGVycl9mb3JtYXR0ZXJfa2V5XG5sZXQgZ2V0X3N0cl9mb3JtYXR0ZXIgKCkgPSBETFMuZ2V0IHN0cl9mb3JtYXR0ZXJfa2V5XG5sZXQgZ2V0X3N0ZGJ1ZiAoKSA9IERMUy5nZXQgc3RkYnVmX2tleVxuXG4oKiBbZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBidWYgcHBmXSBmbHVzaGVzIGZvcm1hdHRlciBbcHBmXSxcbiAgIHRoZW4gcmV0dXJucyB0aGUgY29udGVudHMgb2YgYnVmZmVyIFtidWZdIHRoYXQgaXMgcmVzZXQuXG4gICBGb3JtYXR0ZXIgW3BwZl0gaXMgc3VwcG9zZWQgdG8gcHJpbnQgdG8gYnVmZmVyIFtidWZdLCBvdGhlcndpc2UgdGhpc1xuICAgZnVuY3Rpb24gaXMgbm90IHJlYWxseSB1c2VmdWwuICopXG5sZXQgZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBidWYgcHBmID1cbiAgcHBfZmx1c2hfcXVldWUgcHBmIGZhbHNlO1xuICBsZXQgcyA9IEJ1ZmZlci5jb250ZW50cyBidWYgaW5cbiAgQnVmZmVyLnJlc2V0IGJ1ZjtcbiAgc1xuXG4oKiBGbHVzaCBbc3RyX2Zvcm1hdHRlcl0gYW5kIGdldCB0aGUgY29udGVudHMgb2YgW3N0ZGJ1Zl0uICopXG5sZXQgZmx1c2hfc3RyX2Zvcm1hdHRlciAoKSA9XG4gIGxldCBzdGRidWYgPSBETFMuZ2V0IHN0ZGJ1Zl9rZXkgaW5cbiAgbGV0IHN0cl9mb3JtYXR0ZXIgPSBETFMuZ2V0IHN0cl9mb3JtYXR0ZXJfa2V5IGluXG4gIGZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIgc3RkYnVmIHN0cl9mb3JtYXR0ZXJcblxubGV0IG1ha2Vfc3luY2hyb25pemVkX2Zvcm1hdHRlciBvdXRwdXQgZmx1c2ggPVxuICBETFMubmV3X2tleSAoZnVuICgpIC0+XG4gICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgcHBfYnVmZmVyX3NpemUgaW5cbiAgICBsZXQgb3V0cHV0JyA9IEJ1ZmZlci5hZGRfc3Vic3RyaW5nIGJ1ZiBpblxuICAgIGxldCBmbHVzaCcgKCkgPVxuICAgICAgb3V0cHV0IChCdWZmZXIuY29udGVudHMgYnVmKSAwIChCdWZmZXIubGVuZ3RoIGJ1Zik7XG4gICAgICBCdWZmZXIuY2xlYXIgYnVmO1xuICAgICAgZmx1c2ggKClcbiAgICBpblxuICAgIG1ha2VfZm9ybWF0dGVyIG91dHB1dCcgZmx1c2gnKVxuXG5sZXQgc3luY2hyb25pemVkX2Zvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCBvYyA9XG4gIG1ha2Vfc3luY2hyb25pemVkX2Zvcm1hdHRlciAob3V0cHV0X3N1YnN0cmluZyBvYykgKGZ1biAoKSAtPiBmbHVzaCBvYylcblxuKCpcbiAgU3ltYm9saWMgcHJldHR5LXByaW50aW5nXG4qKVxuXG4oKlxuICBTeW1ib2xpYyBwcmV0dHktcHJpbnRpbmcgaXMgcHJldHR5LXByaW50aW5nIHdpdGggbm8gbG93IGxldmVsIG91dHB1dC5cblxuICBXaGVuIHVzaW5nIGEgc3ltYm9saWMgZm9ybWF0dGVyLCBhbGwgcmVndWxhciBwcmV0dHktcHJpbnRpbmcgYWN0aXZpdGllc1xuICBvY2N1ciBidXQgb3V0cHV0IG1hdGVyaWFsIGlzIHN5bWJvbGljIGFuZCBzdG9yZWQgaW4gYSBidWZmZXIgb2Ygb3V0cHV0XG4gIGl0ZW1zLiBBdCB0aGUgZW5kIG9mIHByZXR0eS1wcmludGluZywgZmx1c2hpbmcgdGhlIG91dHB1dCBidWZmZXIgYWxsb3dzXG4gIHBvc3QtcHJvY2Vzc2luZyBvZiBzeW1ib2xpYyBvdXRwdXQgYmVmb3JlIGxvdyBsZXZlbCBvdXRwdXQgb3BlcmF0aW9ucy5cbiopXG5cbnR5cGUgc3ltYm9saWNfb3V0cHV0X2l0ZW0gPVxuICB8IE91dHB1dF9mbHVzaFxuICB8IE91dHB1dF9uZXdsaW5lXG4gIHwgT3V0cHV0X3N0cmluZyBvZiBzdHJpbmdcbiAgfCBPdXRwdXRfc3BhY2VzIG9mIGludFxuICB8IE91dHB1dF9pbmRlbnQgb2YgaW50XG5cbnR5cGUgc3ltYm9saWNfb3V0cHV0X2J1ZmZlciA9IHtcbiAgbXV0YWJsZSBzeW1ib2xpY19vdXRwdXRfY29udGVudHMgOiBzeW1ib2xpY19vdXRwdXRfaXRlbSBsaXN0O1xufVxuXG5sZXQgbWFrZV9zeW1ib2xpY19vdXRwdXRfYnVmZmVyICgpID1cbiAgeyBzeW1ib2xpY19vdXRwdXRfY29udGVudHMgPSBbXSB9XG5cbmxldCBjbGVhcl9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYiA9XG4gIHNvYi5zeW1ib2xpY19vdXRwdXRfY29udGVudHMgPC0gW11cblxubGV0IGdldF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYiA9XG4gIExpc3QucmV2IHNvYi5zeW1ib2xpY19vdXRwdXRfY29udGVudHNcblxubGV0IGZsdXNoX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgbGV0IGl0ZW1zID0gZ2V0X3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iIGluXG4gIGNsZWFyX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iO1xuICBpdGVtc1xuXG5sZXQgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiBpdGVtID1cbiAgc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50cyA8LSBpdGVtIDo6IHNvYi5zeW1ib2xpY19vdXRwdXRfY29udGVudHNcblxubGV0IGZvcm1hdHRlcl9vZl9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYiA9XG4gIGxldCBzeW1ib2xpY19mbHVzaCBzb2IgKCkgPVxuICAgIGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgT3V0cHV0X2ZsdXNoXG4gIGFuZCBzeW1ib2xpY19uZXdsaW5lIHNvYiAoKSA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiBPdXRwdXRfbmV3bGluZVxuICBhbmQgc3ltYm9saWNfc3RyaW5nIHNvYiBzIGkgbiA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiAoT3V0cHV0X3N0cmluZyAoU3RyaW5nLnN1YiBzIGkgbikpXG4gIGFuZCBzeW1ib2xpY19zcGFjZXMgc29iIG4gPVxuICAgIGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgKE91dHB1dF9zcGFjZXMgbilcbiAgYW5kIHN5bWJvbGljX2luZGVudCBzb2IgbiA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiAoT3V0cHV0X2luZGVudCBuKSBpblxuXG4gIGxldCBmID0gc3ltYm9saWNfc3RyaW5nIHNvYlxuICBhbmQgZyA9IHN5bWJvbGljX2ZsdXNoIHNvYlxuICBhbmQgaCA9IHN5bWJvbGljX25ld2xpbmUgc29iXG4gIGFuZCBpID0gc3ltYm9saWNfc3BhY2VzIHNvYlxuICBhbmQgaiA9IHN5bWJvbGljX2luZGVudCBzb2IgaW5cbiAgcHBfbWFrZV9mb3JtYXR0ZXIgZiBnIGggaSBqXG5cbigqXG5cbiAgQmFzaWMgZnVuY3Rpb25zIG9uIHRoZSAnc3RhbmRhcmQnIGZvcm1hdHRlclxuICAodGhlIGZvcm1hdHRlciB0aGF0IHByaW50cyB0byBbU3RkbGliLnN0ZG91dF0pLlxuXG4qKVxuXG5sZXQgb3Blbl9oYm94IHYgPSBwcF9vcGVuX2hib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvcGVuX3Zib3ggdiA9IHBwX29wZW5fdmJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG9wZW5faHZib3ggdiA9IHBwX29wZW5faHZib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvcGVuX2hvdmJveCB2ID0gcHBfb3Blbl9ob3Zib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvcGVuX2JveCB2ID0gcHBfb3Blbl9ib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBjbG9zZV9ib3ggdiA9IHBwX2Nsb3NlX2JveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG9wZW5fc3RhZyB2ID0gcHBfb3Blbl9zdGFnIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgY2xvc2Vfc3RhZyB2ID0gcHBfY2xvc2Vfc3RhZyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2FzIHYgdyA9IHBwX3ByaW50X2FzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2IHdcbmFuZCBwcmludF9zdHJpbmcgdiA9IHBwX3ByaW50X3N0cmluZyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2J5dGVzIHYgPSBwcF9wcmludF9ieXRlcyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2ludCB2ID0gcHBfcHJpbnRfaW50IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfZmxvYXQgdiA9IHBwX3ByaW50X2Zsb2F0IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfY2hhciB2ID0gcHBfcHJpbnRfY2hhciAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2Jvb2wgdiA9IHBwX3ByaW50X2Jvb2wgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9icmVhayB2IHcgPSBwcF9wcmludF9icmVhayAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdiB3XG5hbmQgcHJpbnRfY3V0IHYgPSBwcF9wcmludF9jdXQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9zcGFjZSB2ID0gcHBfcHJpbnRfc3BhY2UgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBmb3JjZV9uZXdsaW5lIHYgPSBwcF9mb3JjZV9uZXdsaW5lIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfZmx1c2ggdiA9IHBwX3ByaW50X2ZsdXNoIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfbmV3bGluZSB2ID0gcHBfcHJpbnRfbmV3bGluZSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2lmX25ld2xpbmUgdiA9IHBwX3ByaW50X2lmX25ld2xpbmUgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIG9wZW5fdGJveCB2ID0gcHBfb3Blbl90Ym94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgY2xvc2VfdGJveCB2ID0gcHBfY2xvc2VfdGJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X3RicmVhayB2IHcgPSBwcF9wcmludF90YnJlYWsgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHYgd1xuXG5hbmQgc2V0X3RhYiB2ID0gcHBfc2V0X3RhYiAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X3RhYiB2ID0gcHBfcHJpbnRfdGFiIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfbWFyZ2luIHYgPSBwcF9zZXRfbWFyZ2luIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X21hcmdpbiB2ID0gcHBfZ2V0X21hcmdpbiAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X21heF9pbmRlbnQgdiA9IHBwX3NldF9tYXhfaW5kZW50IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X21heF9pbmRlbnQgdiA9IHBwX2dldF9tYXhfaW5kZW50IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZ2VvbWV0cnkgfm1heF9pbmRlbnQgfm1hcmdpbiA9XG4gIHBwX3NldF9nZW9tZXRyeSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgfm1heF9pbmRlbnQgfm1hcmdpblxuYW5kIHNhZmVfc2V0X2dlb21ldHJ5IH5tYXhfaW5kZW50IH5tYXJnaW4gPVxuICBwcF9zYWZlX3NldF9nZW9tZXRyeSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgfm1heF9pbmRlbnQgfm1hcmdpblxuYW5kIGdldF9nZW9tZXRyeSB2ID0gcHBfZ2V0X2dlb21ldHJ5IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgdXBkYXRlX2dlb21ldHJ5IHYgPSBwcF91cGRhdGVfZ2VvbWV0cnkgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9tYXhfYm94ZXMgdiA9IHBwX3NldF9tYXhfYm94ZXMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfbWF4X2JveGVzIHYgPSBwcF9nZXRfbWF4X2JveGVzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Zlcl9tYXhfYm94ZXMgdiA9IHBwX292ZXJfbWF4X2JveGVzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZWxsaXBzaXNfdGV4dCB2ID0gcHBfc2V0X2VsbGlwc2lzX3RleHQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfZWxsaXBzaXNfdGV4dCB2ID0gcHBfZ2V0X2VsbGlwc2lzX3RleHQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWwgdiA9XG4gIHBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWwgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyB2ID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHYgPVxuICBwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyB2IHcgPVxuICBwcF9zZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHYgd1xuYW5kIGdldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyB2ID1cbiAgcHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIHYgPVxuICBwcF9zZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyB2ID1cbiAgcHBfZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHNldF9wcmludF90YWdzIHYgPVxuICBwcF9zZXRfcHJpbnRfdGFncyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9wcmludF90YWdzIHYgPVxuICBwcF9nZXRfcHJpbnRfdGFncyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHNldF9tYXJrX3RhZ3MgdiA9XG4gIHBwX3NldF9tYXJrX3RhZ3MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfbWFya190YWdzIHYgPVxuICBwcF9nZXRfbWFya190YWdzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgc2V0X3RhZ3MgdiA9XG4gIHBwX3NldF90YWdzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cblxuKCogQ29udmVuaWVuY2UgZnVuY3Rpb25zICopXG5cbigqIFRvIGZvcm1hdCBhIGxpc3QgKilcbmxldCByZWMgcHBfcHJpbnRfbGlzdCA/KHBwX3NlcCA9IHBwX3ByaW50X2N1dCkgcHBfdiBwcGYgPSBmdW5jdGlvblxuICB8IFtdIC0+ICgpXG4gIHwgW3ZdIC0+IHBwX3YgcHBmIHZcbiAgfCB2IDo6IHZzIC0+XG4gICAgcHBfdiBwcGYgdjtcbiAgICBwcF9zZXAgcHBmICgpO1xuICAgIHBwX3ByaW50X2xpc3QgfnBwX3NlcCBwcF92IHBwZiB2c1xuXG4oKiBUbyBmb3JtYXQgYSBzZXF1ZW5jZSAqKVxubGV0IHJlYyBwcF9wcmludF9zZXFfaW4gfnBwX3NlcCBwcF92IHBwZiBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IFNlcS5OaWwgLT4gKClcbiAgfCBTZXEuQ29ucyAodiwgc2VxKSAtPlxuICAgIHBwX3NlcCBwcGYgKCk7XG4gICAgcHBfdiBwcGYgdjtcbiAgICBwcF9wcmludF9zZXFfaW4gfnBwX3NlcCBwcF92IHBwZiBzZXFcblxubGV0IHBwX3ByaW50X3NlcSA/KHBwX3NlcCA9IHBwX3ByaW50X2N1dCkgcHBfdiBwcGYgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+ICgpXG4gIHwgU2VxLkNvbnMgKHYsIHNlcSkgLT5cbiAgICBwcF92IHBwZiB2O1xuICAgIHBwX3ByaW50X3NlcV9pbiB+cHBfc2VwIHBwX3YgcHBmIHNlcVxuXG4oKiBUbyBmb3JtYXQgZnJlZS1mbG93aW5nIHRleHQgKilcbmxldCBwcF9wcmludF90ZXh0IHBwZiBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgbGVmdCA9IHJlZiAwIGluXG4gIGxldCByaWdodCA9IHJlZiAwIGluXG4gIGxldCBmbHVzaCAoKSA9XG4gICAgcHBfcHJpbnRfc3RyaW5nIHBwZiAoU3RyaW5nLnN1YiBzICFsZWZ0ICghcmlnaHQgLSAhbGVmdCkpO1xuICAgIGluY3IgcmlnaHQ7IGxlZnQgOj0gIXJpZ2h0O1xuICBpblxuICB3aGlsZSAoIXJpZ2h0IDw+IGxlbikgZG9cbiAgICBtYXRjaCBzLlshcmlnaHRdIHdpdGhcbiAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgZmx1c2ggKCk7XG4gICAgICAgIHBwX2ZvcmNlX25ld2xpbmUgcHBmICgpXG4gICAgICB8ICcgJyAtPlxuICAgICAgICBmbHVzaCAoKTsgcHBfcHJpbnRfc3BhY2UgcHBmICgpXG4gICAgICAoKiB0aGVyZSBpcyBubyBzcGVjaWZpYyBzdXBwb3J0IGZvciAnXFx0J1xuICAgICAgICAgYXMgaXQgaXMgdW5jbGVhciB3aGF0IGEgcmlnaHQgc2VtYW50aWNzIHdvdWxkIGJlICopXG4gICAgICB8IF8gLT4gaW5jciByaWdodFxuICBkb25lO1xuICBpZiAhbGVmdCA8PiBsZW4gdGhlbiBmbHVzaCAoKVxuXG5sZXQgcHBfcHJpbnRfb3B0aW9uID8obm9uZSA9IGZ1biBfICgpIC0+ICgpKSBwcF92IHBwZiA9IGZ1bmN0aW9uXG58IE5vbmUgLT4gbm9uZSBwcGYgKClcbnwgU29tZSB2IC0+IHBwX3YgcHBmIHZcblxubGV0IHBwX3ByaW50X3Jlc3VsdCB+b2sgfmVycm9yIHBwZiA9IGZ1bmN0aW9uXG58IE9rIHYgLT4gb2sgcHBmIHZcbnwgRXJyb3IgZSAtPiBlcnJvciBwcGYgZVxuXG5sZXQgcHBfcHJpbnRfZWl0aGVyIH5sZWZ0IH5yaWdodCBwcGYgPSBmdW5jdGlvblxufCBFaXRoZXIuTGVmdCBsIC0+IGxlZnQgcHBmIGxcbnwgRWl0aGVyLlJpZ2h0IHIgLT4gcmlnaHQgcHBmIHJcblxuICgqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubGV0IGNvbXB1dGVfdGFnIG91dHB1dCB0YWdfYWNjID1cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgMTYgaW5cbiAgbGV0IHBwZiA9IGZvcm1hdHRlcl9vZl9idWZmZXIgYnVmIGluXG4gIG91dHB1dCBwcGYgdGFnX2FjYztcbiAgcHBfcHJpbnRfZmx1c2ggcHBmICgpO1xuICBsZXQgbGVuID0gQnVmZmVyLmxlbmd0aCBidWYgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgZWxzZSBCdWZmZXIuc3ViIGJ1ZiAxIChsZW4gLSAyKVxuXG4gKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgRGVmaW5pbmcgY29udGludWF0aW9ucyB0byBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIG9mXG4gIENhbWxpbnRlcm5hbEZvcm1hdC5tYWtlX3ByaW50Zi5cblxuICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3Ncbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0XG5cbigqIEludGVycHJldCBhIGZvcm1hdHRpbmcgZW50aXR5IG9uIGEgZm9ybWF0dGVyLiAqKVxubGV0IG91dHB1dF9mb3JtYXR0aW5nX2xpdCBwcGYgZm10aW5nX2xpdCA9IG1hdGNoIGZtdGluZ19saXQgd2l0aFxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgLT4gcHBfY2xvc2VfYm94IHBwZiAoKVxuICB8IENsb3NlX3RhZyAgICAgICAgICAgICAgICAgLT4gcHBfY2xvc2Vfc3RhZyBwcGYgKClcbiAgfCBCcmVhayAoXywgd2lkdGgsIG9mZnNldCkgIC0+IHBwX3ByaW50X2JyZWFrIHBwZiB3aWR0aCBvZmZzZXRcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAgICAgIC0+IHBwX3ByaW50X2ZsdXNoIHBwZiAoKVxuICB8IEZvcmNlX25ld2xpbmUgICAgICAgICAgICAgLT4gcHBfZm9yY2VfbmV3bGluZSBwcGYgKClcbiAgfCBGbHVzaF9uZXdsaW5lICAgICAgICAgICAgIC0+IHBwX3ByaW50X25ld2xpbmUgcHBmICgpXG4gIHwgTWFnaWNfc2l6ZSAoXywgXykgICAgICAgICAtPiAoKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgLT4gcHBfcHJpbnRfY2hhciBwcGYgJ0AnXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAtPiBwcF9wcmludF9jaGFyIHBwZiAnJSdcbiAgfCBTY2FuX2luZGljIGMgICAgICAgICAgICAgIC0+IHBwX3ByaW50X2NoYXIgcHBmICdAJzsgcHBfcHJpbnRfY2hhciBwcGYgY1xuXG4oKiBSZWN1cnNpdmVseSBvdXRwdXQgYW4gXCJhY2N1bXVsYXRvclwiIGNvbnRhaW5pbmcgYSByZXZlcnNlZCBsaXN0IG9mXG4gICBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzLCAuLi4pIGluIGFuIG91dHB1dF9zdHJlYW0uICopXG4oKiBEaWZmZXIgZnJvbSBQcmludGYub3V0cHV0X2FjYyBieSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZm9ybWF0dGluZy4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgQ2FtbGludGVybmFsRm9ybWF0Lm1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBvdXRwdXRfYWNjIHBwZiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcykgLT5cbiAgICBvdXRwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBjKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIChTdHJpbmcubWFrZSAxIGMpO1xuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZikgLT5cbiAgICBvdXRwdXRfYWNjIHBwZiBwO1xuICAgIG91dHB1dF9mb3JtYXR0aW5nX2xpdCBwcGYgZjtcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgcHBfb3Blbl9zdGFnIHBwZiAoU3RyaW5nX3RhZyAoY29tcHV0ZV90YWcgb3V0cHV0X2FjYyBhY2MnKSlcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX2JveCBhY2MnKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgbGV0IChpbmRlbnQsIGJ0eSkgPSBvcGVuX2JveF9vZl9zdHJpbmcgKGNvbXB1dGVfdGFnIG91dHB1dF9hY2MgYWNjJykgaW5cbiAgICBwcF9vcGVuX2JveF9nZW4gcHBmIGluZGVudCBidHlcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X3N0cmluZyBwcGYgcztcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9jaGFyIHBwZiBjO1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBvdXRwdXRfYWNjIHBwZiBwOyBmIHBwZjtcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfZmx1c2ggcHBmICgpO1xuICB8IEFjY19pbnZhbGlkX2FyZyAocCwgbXNnKSAtPiBvdXRwdXRfYWNjIHBwZiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBQcmludGYuYnVmcHV0X2FjYyBieSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgZm9ybWF0dGluZy4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgQ2FtbGludGVybmFsRm9ybWF0Lm1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIHBwZiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcykgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBjKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIChTdHJpbmcubWFrZSAxIGMpO1xuICB8IEFjY19kZWxheSAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGYpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgKGYgKCkpO1xuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZikgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIG91dHB1dF9mb3JtYXR0aW5nX2xpdCBwcGYgZjtcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgcHBfb3Blbl9zdGFnIHBwZiAoU3RyaW5nX3RhZyAoY29tcHV0ZV90YWcgc3RycHV0X2FjYyBhY2MnKSlcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX2JveCBhY2MnKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgbGV0IChpbmRlbnQsIGJ0eSkgPSBvcGVuX2JveF9vZl9zdHJpbmcgKGNvbXB1dGVfdGFnIHN0cnB1dF9hY2MgYWNjJykgaW5cbiAgICBwcF9vcGVuX2JveF9nZW4gcHBmIGluZGVudCBidHlcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X3N0cmluZyBwcGYgcztcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9jaGFyIHBwZiBjO1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9zdHJpbmcgcHBmIChmICgpKTtcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfZmx1c2ggcHBmICgpO1xuICB8IEFjY19pbnZhbGlkX2FyZyAocCwgbXNnKSAtPiBzdHJwdXRfYWNjIHBwZiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqXG5cbiAgRGVmaW5pbmcgW2ZwcmludGZdIGFuZCB2YXJpb3VzIGZsYXZvcnMgb2YgW2ZwcmludGZdLlxuXG4qKVxuXG5sZXQga2ZwcmludGYgayBwcGYgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZlxuICAgIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgcHBmIGFjYzsgayBwcGYpXG4gICAgRW5kX29mX2FjYyBmbXRcblxuYW5kIGlrZnByaW50ZiBrIHBwZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfaXByaW50ZiBrIHBwZiBmbXRcblxubGV0IGlmcHJpbnRmIF9wcGYgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgaWdub3JlICgpIGZtdFxuXG5sZXQgZnByaW50ZiBwcGYgPSBrZnByaW50ZiBpZ25vcmUgcHBmXG5cbmxldCBwcmludGYgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZlxuICAgIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIGFjYylcbiAgICBFbmRfb2ZfYWNjIGZtdFxuXG5sZXQgZXByaW50ZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gb3V0cHV0X2FjYyAoRExTLmdldCBlcnJfZm9ybWF0dGVyX2tleSkgYWNjKVxuICAgIEVuZF9vZl9hY2MgZm10XG5cbmxldCBrZHByaW50ZiBrIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGZcbiAgICAoZnVuIGFjYyAtPiBrIChmdW4gcHBmIC0+IG91dHB1dF9hY2MgcHBmIGFjYykpXG4gICAgRW5kX29mX2FjYyBmbXRcblxubGV0IGRwcmludGYgZm10ID0ga2RwcmludGYgKGZ1biBpIC0+IGkpIGZtdFxuXG5sZXQga3NwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBiID0gcHBfbWFrZV9idWZmZXIgKCkgaW5cbiAgbGV0IHBwZiA9IGZvcm1hdHRlcl9vZl9idWZmZXIgYiBpblxuICBsZXQgayBhY2MgPVxuICAgIHN0cnB1dF9hY2MgcHBmIGFjYztcbiAgICBrIChmbHVzaF9idWZmZXJfZm9ybWF0dGVyIGIgcHBmKSBpblxuICBtYWtlX3ByaW50ZiBrIEVuZF9vZl9hY2MgZm10XG5cblxubGV0IHNwcmludGYgZm10ID0ga3NwcmludGYgaWQgZm10XG5cbmxldCBrYXNwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIGxldCBiID0gcHBfbWFrZV9idWZmZXIgKCkgaW5cbiAgbGV0IHBwZiA9IGZvcm1hdHRlcl9vZl9idWZmZXIgYiBpblxuICBsZXQgayBhY2MgPVxuICAgIG91dHB1dF9hY2MgcHBmIGFjYztcbiAgICBrIChmbHVzaF9idWZmZXJfZm9ybWF0dGVyIGIgcHBmKSBpblxuICBtYWtlX3ByaW50ZiBrIEVuZF9vZl9hY2MgZm10XG5cblxubGV0IGFzcHJpbnRmIGZtdCA9IGthc3ByaW50ZiBpZCBmbXRcblxuKCogRmx1c2hpbmcgc3RhbmRhcmQgZm9ybWF0dGVycyBhdCBlbmQgb2YgZXhlY3V0aW9uLiAqKVxuXG5sZXQgZmx1c2hfc3RhbmRhcmRfZm9ybWF0dGVycyAoKSA9XG4gIHBwX3ByaW50X2ZsdXNoIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSAoKTtcbiAgcHBfcHJpbnRfZmx1c2ggKERMUy5nZXQgZXJyX2Zvcm1hdHRlcl9rZXkpICgpXG5cbmxldCAoKSA9IGF0X2V4aXQgZmx1c2hfc3RhbmRhcmRfZm9ybWF0dGVyc1xuXG5sZXQgKCkgPSBEb21haW4uYmVmb3JlX2ZpcnN0X3NwYXduIChmdW4gKCkgLT5cbiAgZmx1c2hfc3RhbmRhcmRfZm9ybWF0dGVycyAoKTtcbiAgbGV0IGZzID0gcHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHN0ZF9mb3JtYXR0ZXIgKCkgaW5cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHN0ZF9mb3JtYXR0ZXJcbiAgICB7ZnMgd2l0aCBvdXRfc3RyaW5nID0gYnVmZmVyZWRfb3V0X3N0cmluZyBzdGRfYnVmX2tleTtcbiAgICAgICAgICAgICBvdXRfZmx1c2ggPSBidWZmZXJlZF9vdXRfZmx1c2ggU3RkbGliLnN0ZG91dCBzdGRfYnVmX2tleX07XG5cbiAgbGV0IGZzID0gcHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIGVycl9mb3JtYXR0ZXIgKCkgaW5cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIGVycl9mb3JtYXR0ZXJcbiAgICB7ZnMgd2l0aCBvdXRfc3RyaW5nID0gYnVmZmVyZWRfb3V0X3N0cmluZyBlcnJfYnVmX2tleTtcbiAgICAgICAgICAgICBvdXRfZmx1c2ggPSBidWZmZXJlZF9vdXRfZmx1c2ggU3RkbGliLnN0ZGVyciBlcnJfYnVmX2tleX07XG4pXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBQaWVycmUgV2VpcywgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAyIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdFxuXG4oKiBhbGlhcyB0byBhdm9pZCB3YXJuaW5nIGZvciBhbWJpZ3VpdHkgYmV0d2VlblxuICAgU3RkbGliLmZvcm1hdDZcbiAgIGFuZCBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuXG4gICAodGhlIGZvcm1lciBpcyBpbiBmYWN0IGFuIGFsaWFzIGZvciB0aGUgbGF0dGVyLFxuICAgIGJ1dCB0aGUgYW1iaWd1aXR5IHdhcm5pbmcgZG9lc24ndCBjYXJlKVxuKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPVxuICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgU3RkbGliLmZvcm1hdDZcblxuXG4oKiBUaGUgcnVuLXRpbWUgbGlicmFyeSBmb3Igc2Nhbm5lcnMuICopXG5cbigqIFNjYW5uaW5nIGJ1ZmZlcnMuICopXG5tb2R1bGUgdHlwZSBTQ0FOTklORyA9IHNpZ1xuXG4gIHR5cGUgaW5fY2hhbm5lbFxuXG4gIHR5cGUgc2NhbmJ1ZiA9IGluX2NoYW5uZWxcblxuICB0eXBlIGZpbGVfbmFtZSA9IHN0cmluZ1xuXG4gIHZhbCBzdGRpbiA6IGluX2NoYW5uZWxcbiAgKCogVGhlIHNjYW5uaW5nIGJ1ZmZlciByZWFkaW5nIGZyb20gW1N0ZGxpYi5zdGRpbl0uICopXG5cbiAgdmFsIG5leHRfY2hhciA6IHNjYW5idWYgLT4gY2hhclxuICAoKiBbU2Nhbm5pbmcubmV4dF9jaGFyIGliXSBhZHZhbmNlIHRoZSBzY2FubmluZyBidWZmZXIgZm9yXG4gICAgIG9uZSBjaGFyYWN0ZXIuXG4gICAgIElmIG5vIG1vcmUgY2hhcmFjdGVyIGNhbiBiZSByZWFkLCBzZXRzIGEgZW5kIG9mIGZpbGUgY29uZGl0aW9uIGFuZFxuICAgICByZXR1cm5zICdcXDAwMCcuICopXG5cbiAgdmFsIGludmFsaWRhdGVfY3VycmVudF9jaGFyIDogc2NhbmJ1ZiAtPiB1bml0XG4gICgqIFtTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYl0gbWFyayB0aGUgY3VycmVudF9jaGFyIGFzIGFscmVhZHlcbiAgICAgc2Nhbm5lZC4gKilcblxuICB2YWwgcGVla19jaGFyIDogc2NhbmJ1ZiAtPiBjaGFyXG4gICgqIFtTY2FubmluZy5wZWVrX2NoYXIgaWJdIHJldHVybnMgdGhlIGN1cnJlbnQgY2hhciBhdmFpbGFibGUgaW5cbiAgICAgdGhlIGJ1ZmZlciBvciByZWFkcyBvbmUgaWYgbmVjZXNzYXJ5ICh3aGVuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpc1xuICAgICBhbHJlYWR5IHNjYW5uZWQpLlxuICAgICBJZiBubyBjaGFyYWN0ZXIgY2FuIGJlIHJlYWQsIHNldHMgYW4gZW5kIG9mIGZpbGUgY29uZGl0aW9uIGFuZFxuICAgICByZXR1cm5zICdcXDAwMCcuICopXG5cbiAgdmFsIGNoZWNrZWRfcGVla19jaGFyIDogc2NhbmJ1ZiAtPiBjaGFyXG4gICgqIFNhbWUgYXMgW1NjYW5uaW5nLnBlZWtfY2hhcl0gYWJvdmUgYnV0IGFsd2F5cyByZXR1cm5zIGEgdmFsaWQgY2hhciBvclxuICAgICBmYWlsczogaW5zdGVhZCBvZiByZXR1cm5pbmcgYSBudWxsIGNoYXIgd2hlbiB0aGUgcmVhZGluZyBtZXRob2Qgb2YgdGhlXG4gICAgIGlucHV0IGJ1ZmZlciBoYXMgcmVhY2hlZCBhbiBlbmQgb2YgZmlsZSwgdGhlIGZ1bmN0aW9uIHJhaXNlcyBleGNlcHRpb25cbiAgICAgW0VuZF9vZl9maWxlXS4gKilcblxuICB2YWwgc3RvcmVfY2hhciA6IGludCAtPiBzY2FuYnVmIC0+IGNoYXIgLT4gaW50XG4gICgqIFtTY2FubmluZy5zdG9yZV9jaGFyIGxpbSBpYiBjXSBhZGRzIFtjXSB0byB0aGUgdG9rZW4gYnVmZmVyXG4gICAgIG9mIHRoZSBzY2FubmluZyBidWZmZXIgW2liXS4gSXQgYWxzbyBhZHZhbmNlcyB0aGUgc2Nhbm5pbmcgYnVmZmVyIGZvclxuICAgICBvbmUgY2hhcmFjdGVyIGFuZCByZXR1cm5zIFtsaW0gLSAxXSwgaW5kaWNhdGluZyB0aGUgbmV3IGxpbWl0IGZvciB0aGVcbiAgICAgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLiAqKVxuXG4gIHZhbCBza2lwX2NoYXIgOiBpbnQgLT4gc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLnNraXBfY2hhciBsaW0gaWJdIGlnbm9yZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLiAqKVxuXG4gIHZhbCBpZ25vcmVfY2hhciA6IGludCAtPiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcuaWdub3JlX2NoYXIgaWIgbGltXSBpZ25vcmVzIHRoZSBjdXJyZW50IGNoYXJhY3RlciBhbmRcbiAgICAgZGVjcmVtZW50cyB0aGUgbGltaXQuICopXG5cbiAgdmFsIHRva2VuIDogc2NhbmJ1ZiAtPiBzdHJpbmdcbiAgKCogW1NjYW5uaW5nLnRva2VuIGliXSByZXR1cm5zIHRoZSBzdHJpbmcgc3RvcmVkIGludG8gdGhlIHRva2VuXG4gICAgIGJ1ZmZlciBvZiB0aGUgc2Nhbm5pbmcgYnVmZmVyOiBpdCByZXR1cm5zIHRoZSB0b2tlbiBtYXRjaGVkIGJ5IHRoZVxuICAgICBmb3JtYXQuICopXG5cbiAgdmFsIHJlc2V0X3Rva2VuIDogc2NhbmJ1ZiAtPiB1bml0XG4gICgqIFtTY2FubmluZy5yZXNldF90b2tlbiBpYl0gcmVzZXRzIHRoZSB0b2tlbiBidWZmZXIgb2ZcbiAgICAgdGhlIGdpdmVuIHNjYW5uaW5nIGJ1ZmZlci4gKilcblxuICB2YWwgY2hhcl9jb3VudCA6IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5jaGFyX2NvdW50IGliXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVyc1xuICAgICByZWFkIHNvIGZhciBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICopXG5cbiAgdmFsIGxpbmVfY291bnQgOiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcubGluZV9jb3VudCBpYl0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIG5ldyBsaW5lXG4gICAgIGNoYXJhY3RlcnMgcmVhZCBzbyBmYXIgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAqKVxuXG4gIHZhbCB0b2tlbl9jb3VudCA6IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy50b2tlbl9jb3VudCBpYl0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRva2VucyByZWFkXG4gICAgIHNvIGZhciBmcm9tIFtpYl0uICopXG5cbiAgdmFsIGVvZiA6IHNjYW5idWYgLT4gYm9vbFxuICAoKiBbU2Nhbm5pbmcuZW9mIGliXSByZXR1cm5zIHRoZSBlbmQgb2YgaW5wdXQgY29uZGl0aW9uXG4gICAgIG9mIHRoZSBnaXZlbiBidWZmZXIuICopXG5cbiAgdmFsIGVuZF9vZl9pbnB1dCA6IHNjYW5idWYgLT4gYm9vbFxuICAoKiBbU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliXSB0ZXN0cyB0aGUgZW5kIG9mIGlucHV0IGNvbmRpdGlvblxuICAgICBvZiB0aGUgZ2l2ZW4gYnVmZmVyIChpZiBubyBjaGFyIGhhcyBldmVyIGJlZW4gcmVhZCwgYW4gYXR0ZW1wdCB0b1xuICAgICByZWFkIG9uZSBpcyBwZXJmb3JtZWQpLiAqKVxuXG4gIHZhbCBiZWdpbm5pbmdfb2ZfaW5wdXQgOiBzY2FuYnVmIC0+IGJvb2xcbiAgKCogW1NjYW5uaW5nLmJlZ2lubmluZ19vZl9pbnB1dCBpYl0gdGVzdHMgdGhlIGJlZ2lubmluZyBvZiBpbnB1dFxuICAgICBjb25kaXRpb24gb2YgdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgbmFtZV9vZl9pbnB1dCA6IHNjYW5idWYgLT4gc3RyaW5nXG4gICgqIFtTY2FubmluZy5uYW1lX29mX2lucHV0IGliXSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjaGFyYWN0ZXJcbiAgICAgc291cmNlIGZvciBpbnB1dCBidWZmZXIgW2liXS4gKilcblxuICB2YWwgb3Blbl9pbiA6IGZpbGVfbmFtZSAtPiBpbl9jaGFubmVsXG4gIHZhbCBvcGVuX2luX2JpbiA6IGZpbGVfbmFtZSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2ZpbGUgOiBmaWxlX25hbWUgLT4gaW5fY2hhbm5lbFxuICB2YWwgZnJvbV9maWxlX2JpbiA6IGZpbGVfbmFtZSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX3N0cmluZyA6IHN0cmluZyAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2Z1bmN0aW9uIDogKHVuaXQgLT4gY2hhcikgLT4gaW5fY2hhbm5lbFxuICB2YWwgZnJvbV9jaGFubmVsIDogU3RkbGliLmluX2NoYW5uZWwgLT4gaW5fY2hhbm5lbFxuXG4gIHZhbCBjbG9zZV9pbiA6IGluX2NoYW5uZWwgLT4gdW5pdFxuXG5lbmRcblxuXG5tb2R1bGUgU2Nhbm5pbmcgOiBTQ0FOTklORyA9IHN0cnVjdFxuXG4gICgqIFRoZSBydW4tdGltZSBsaWJyYXJ5IGZvciBzY2FuZi4gKilcblxuICB0eXBlIGZpbGVfbmFtZSA9IHN0cmluZ1xuXG4gIHR5cGUgaW5fY2hhbm5lbF9uYW1lID1cbiAgICB8IEZyb21fY2hhbm5lbCBvZiBTdGRsaWIuaW5fY2hhbm5lbFxuICAgIHwgRnJvbV9maWxlIG9mIGZpbGVfbmFtZSAqIFN0ZGxpYi5pbl9jaGFubmVsXG4gICAgfCBGcm9tX2Z1bmN0aW9uXG4gICAgfCBGcm9tX3N0cmluZ1xuXG5cbiAgdHlwZSBpbl9jaGFubmVsID0ge1xuICAgIG11dGFibGUgaWNfZW9mIDogYm9vbDtcbiAgICBtdXRhYmxlIGljX2N1cnJlbnRfY2hhciA6IGNoYXI7XG4gICAgbXV0YWJsZSBpY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgOiBib29sO1xuICAgIG11dGFibGUgaWNfY2hhcl9jb3VudCA6IGludDtcbiAgICBtdXRhYmxlIGljX2xpbmVfY291bnQgOiBpbnQ7XG4gICAgbXV0YWJsZSBpY190b2tlbl9jb3VudCA6IGludDtcbiAgICBpY19nZXRfbmV4dF9jaGFyIDogdW5pdCAtPiBjaGFyO1xuICAgIGljX3Rva2VuX2J1ZmZlciA6IEJ1ZmZlci50O1xuICAgIGljX2lucHV0X25hbWUgOiBpbl9jaGFubmVsX25hbWU7XG4gIH1cblxuXG4gIHR5cGUgc2NhbmJ1ZiA9IGluX2NoYW5uZWxcblxuICBsZXQgbnVsbF9jaGFyID0gJ1xcMDAwJ1xuXG4gICgqIFJlYWRzIGEgbmV3IGNoYXJhY3RlciBmcm9tIGlucHV0IGJ1ZmZlci5cbiAgICAgTmV4dF9jaGFyIG5ldmVyIGZhaWxzLCBldmVuIGluIGNhc2Ugb2YgZW5kIG9mIGlucHV0OlxuICAgICBpdCB0aGVuIHNpbXBseSBzZXRzIHRoZSBlbmQgb2YgZmlsZSBjb25kaXRpb24uICopXG4gIGxldCBuZXh0X2NoYXIgaWIgPVxuICAgIHRyeVxuICAgICAgbGV0IGMgPSBpYi5pY19nZXRfbmV4dF9jaGFyICgpIGluXG4gICAgICBpYi5pY19jdXJyZW50X2NoYXIgPC0gYztcbiAgICAgIGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZCA8LSB0cnVlO1xuICAgICAgaWIuaWNfY2hhcl9jb3VudCA8LSBzdWNjIGliLmljX2NoYXJfY291bnQ7XG4gICAgICBpZiBjID0gJ1xcbicgdGhlbiBpYi5pY19saW5lX2NvdW50IDwtIHN1Y2MgaWIuaWNfbGluZV9jb3VudDtcbiAgICAgIGMgd2l0aFxuICAgIHwgRW5kX29mX2ZpbGUgLT5cbiAgICAgIGxldCBjID0gbnVsbF9jaGFyIGluXG4gICAgICBpYi5pY19jdXJyZW50X2NoYXIgPC0gYztcbiAgICAgIGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZCA8LSBmYWxzZTtcbiAgICAgIGliLmljX2VvZiA8LSB0cnVlO1xuICAgICAgY1xuXG5cbiAgbGV0IHBlZWtfY2hhciBpYiA9XG4gICAgaWYgaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkXG4gICAgdGhlbiBpYi5pY19jdXJyZW50X2NoYXJcbiAgICBlbHNlIG5leHRfY2hhciBpYlxuXG5cbiAgKCogUmV0dXJucyBhIHZhbGlkIGN1cnJlbnQgY2hhciBmb3IgdGhlIGlucHV0IGJ1ZmZlci4gSW4gcGFydGljdWxhclxuICAgICBubyBpcnJlbGV2YW50IG51bGwgY2hhcmFjdGVyIChhcyBzZXQgYnkgW25leHRfY2hhcl0gaW4gY2FzZSBvZiBlbmRcbiAgICAgb2YgaW5wdXQpIGlzIHJldHVybmVkLCBzaW5jZSBbRW5kX29mX2ZpbGVdIGlzIHJhaXNlZCB3aGVuXG4gICAgIFtuZXh0X2NoYXJdIHNldHMgdGhlIGVuZCBvZiBmaWxlIGNvbmRpdGlvbiB3aGlsZSB0cnlpbmcgdG8gcmVhZCBhXG4gICAgIG5ldyBjaGFyYWN0ZXIuICopXG4gIGxldCBjaGVja2VkX3BlZWtfY2hhciBpYiA9XG4gICAgbGV0IGMgPSBwZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBpYi5pY19lb2YgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZTtcbiAgICBjXG5cblxuICBsZXQgZW5kX29mX2lucHV0IGliID1cbiAgICBpZ25vcmUgKHBlZWtfY2hhciBpYik7XG4gICAgaWIuaWNfZW9mXG5cblxuICBsZXQgZW9mIGliID0gaWIuaWNfZW9mXG5cbiAgbGV0IGJlZ2lubmluZ19vZl9pbnB1dCBpYiA9IGliLmljX2NoYXJfY291bnQgPSAwXG5cbiAgbGV0IG5hbWVfb2ZfaW5wdXQgaWIgPVxuICAgIG1hdGNoIGliLmljX2lucHV0X25hbWUgd2l0aFxuICAgIHwgRnJvbV9jaGFubmVsIF9pYyAtPiBcInVubmFtZWQgU3RkbGliIGlucHV0IGNoYW5uZWxcIlxuICAgIHwgRnJvbV9maWxlIChmbmFtZSwgX2ljKSAtPiBmbmFtZVxuICAgIHwgRnJvbV9mdW5jdGlvbiAtPiBcInVubmFtZWQgZnVuY3Rpb25cIlxuICAgIHwgRnJvbV9zdHJpbmcgLT4gXCJ1bm5hbWVkIGNoYXJhY3RlciBzdHJpbmdcIlxuXG5cbiAgbGV0IGNoYXJfY291bnQgaWIgPVxuICAgIGlmIGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZFxuICAgIHRoZW4gaWIuaWNfY2hhcl9jb3VudCAtIDFcbiAgICBlbHNlIGliLmljX2NoYXJfY291bnRcblxuXG4gIGxldCBsaW5lX2NvdW50IGliID0gaWIuaWNfbGluZV9jb3VudFxuXG4gIGxldCByZXNldF90b2tlbiBpYiA9IEJ1ZmZlci5yZXNldCBpYi5pY190b2tlbl9idWZmZXJcblxuICBsZXQgaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWIgPSBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPC0gZmFsc2VcblxuICBsZXQgdG9rZW4gaWIgPVxuICAgIGxldCB0b2tlbl9idWZmZXIgPSBpYi5pY190b2tlbl9idWZmZXIgaW5cbiAgICBsZXQgdG9rID0gQnVmZmVyLmNvbnRlbnRzIHRva2VuX2J1ZmZlciBpblxuICAgIEJ1ZmZlci5jbGVhciB0b2tlbl9idWZmZXI7XG4gICAgaWIuaWNfdG9rZW5fY291bnQgPC0gc3VjYyBpYi5pY190b2tlbl9jb3VudDtcbiAgICB0b2tcblxuXG4gIGxldCB0b2tlbl9jb3VudCBpYiA9IGliLmljX3Rva2VuX2NvdW50XG5cbiAgbGV0IHNraXBfY2hhciB3aWR0aCBpYiA9XG4gICAgaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWI7XG4gICAgd2lkdGhcblxuXG4gIGxldCBpZ25vcmVfY2hhciB3aWR0aCBpYiA9IHNraXBfY2hhciAod2lkdGggLSAxKSBpYlxuXG4gIGxldCBzdG9yZV9jaGFyIHdpZHRoIGliIGMgPVxuICAgIEJ1ZmZlci5hZGRfY2hhciBpYi5pY190b2tlbl9idWZmZXIgYztcbiAgICBpZ25vcmVfY2hhciB3aWR0aCBpYlxuXG5cbiAgbGV0IGRlZmF1bHRfdG9rZW5fYnVmZmVyX3NpemUgPSAxMDI0XG5cbiAgbGV0IGNyZWF0ZSBpbmFtZSBuZXh0ID0ge1xuICAgIGljX2VvZiA9IGZhbHNlO1xuICAgIGljX2N1cnJlbnRfY2hhciA9IG51bGxfY2hhcjtcbiAgICBpY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPSBmYWxzZTtcbiAgICBpY19jaGFyX2NvdW50ID0gMDtcbiAgICBpY19saW5lX2NvdW50ID0gMDtcbiAgICBpY190b2tlbl9jb3VudCA9IDA7XG4gICAgaWNfZ2V0X25leHRfY2hhciA9IG5leHQ7XG4gICAgaWNfdG9rZW5fYnVmZmVyID0gQnVmZmVyLmNyZWF0ZSBkZWZhdWx0X3Rva2VuX2J1ZmZlcl9zaXplO1xuICAgIGljX2lucHV0X25hbWUgPSBpbmFtZTtcbiAgfVxuXG5cbiAgbGV0IGZyb21fc3RyaW5nIHMgPVxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgbGV0IG5leHQgKCkgPVxuICAgICAgaWYgIWkgPj0gbGVuIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGUgZWxzZVxuICAgICAgbGV0IGMgPSBzLlshaV0gaW5cbiAgICAgIGluY3IgaTtcbiAgICAgIGMgaW5cbiAgICBjcmVhdGUgRnJvbV9zdHJpbmcgbmV4dFxuXG5cbiAgbGV0IGZyb21fZnVuY3Rpb24gPSBjcmVhdGUgRnJvbV9mdW5jdGlvblxuXG4gICgqIFNjYW5uaW5nIGZyb20gYW4gaW5wdXQgY2hhbm5lbC4gKilcblxuICAoKiBQb3NpdGlvbiBvZiB0aGUgcHJvYmxlbTpcblxuICAgICBXZSBjYW5ub3QgcHJldmVudCB0aGUgc2Nhbm5pbmcgbWVjaGFuaXNtIHRvIHVzZSBvbmUgbG9va2FoZWFkIGNoYXJhY3RlcixcbiAgICAgaWYgbmVlZGVkIGJ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGZvcm1hdCBzdHJpbmcgc3BlY2lmaWNhdGlvbnMgKGUuZy4gYVxuICAgICB0cmFpbGluZyAnc2tpcCBzcGFjZScgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybWF0IHN0cmluZyk7IGluIHRoaXMgY2FzZSxcbiAgICAgdGhlIG1hbmRhdG9yeSBsb29rYWhlYWQgY2hhcmFjdGVyIGlzIGluZGVlZCByZWFkIGZyb20gdGhlIGlucHV0IGFuZCBub3RcbiAgICAgdXNlZCB0byByZXR1cm4gdGhlIHRva2VuIHJlYWQuIEl0IGlzIHRodXMgbWFuZGF0b3J5IHRvIGJlIGFibGUgdG8gc3RvcmVcbiAgICAgYW4gdW51c2VkIGxvb2thaGVhZCBjaGFyYWN0ZXIgc29tZXdoZXJlIHRvIGdldCBpdCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gICAgIG9mIHRoZSBuZXh0IHNjYW4uXG5cbiAgICAgVG8gY2lyY3VtdmVudCB0aGlzIHByb2JsZW0sIGFsbCB0aGUgc2Nhbm5pbmcgZnVuY3Rpb25zIGdldCBhIGxvdyBsZXZlbFxuICAgICBpbnB1dCBidWZmZXIgYXJndW1lbnQgd2hlcmUgdGhleSBzdG9yZSB0aGUgbG9va2FoZWFkIGNoYXJhY3RlciB3aGVuXG4gICAgIG5lZWRlZDsgYWRkaXRpb25hbGx5LCB0aGUgaW5wdXQgYnVmZmVyIGlzIHRoZSBvbmx5IHNvdXJjZSBvZiBjaGFyYWN0ZXIgb2ZcbiAgICAgYSBzY2FubmVyLiBUaGUgW3NjYW5idWZdIGlucHV0IGJ1ZmZlcnMgYXJlIGRlZmluZWQgaW4gbW9kdWxlIHshU2Nhbm5pbmd9LlxuXG4gICAgIE5vdyB3ZSB1bmRlcnN0YW5kIHRoYXQgaXQgaXMgZXh0cmVtZWx5IGltcG9ydGFudCB0aGF0IHJlbGF0ZWQgYW5kXG4gICAgIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gc2Nhbm5lcnMgaW5kZWVkIHJlYWQgZnJvbSB0aGUgc2FtZSBpbnB1dCBidWZmZXIuXG4gICAgIEluIGVmZmVjdCwgaWYgYSBzY2FubmVyIFtzY2FuMV0gaXMgcmVhZGluZyBmcm9tIFtpYjFdIGFuZCBzdG9yZXMgYW5cbiAgICAgdW51c2VkIGxvb2thaGVhZCBjaGFyYWN0ZXIgW2MxXSBpbnRvIGl0cyBpbnB1dCBidWZmZXIgW2liMV0sIHRoZW5cbiAgICAgYW5vdGhlciBzY2FubmVyIFtzY2FuMl0gbm90IHJlYWRpbmcgZnJvbSB0aGUgc2FtZSBidWZmZXIgW2liMV0gd2lsbCBtaXNzXG4gICAgIHRoZSBjaGFyYWN0ZXIgW2MxXSwgc2VlbWluZ2x5IHZhbmlzaGVkIGluIHRoZSBhaXIgZnJvbSB0aGUgcG9pbnQgb2Ygdmlld1xuICAgICBvZiBbc2NhbjJdLlxuXG4gICAgIFRoaXMgbWVjaGFuaXNtIHdvcmtzIHBlcmZlY3RseSB0byByZWFkIGZyb20gc3RyaW5ncywgZnJvbSBmaWxlcywgYW5kIGZyb21cbiAgICAgZnVuY3Rpb25zLCBzaW5jZSBpbiB0aG9zZSBjYXNlcywgYWxsb2NhdGluZyB0d28gYnVmZmVycyByZWFkaW5nIGZyb20gdGhlXG4gICAgIHNhbWUgc291cmNlIGlzIHVubmF0dXJhbC5cblxuICAgICBTdGlsbCwgdGhlcmUgaXMgYSBkaWZmaWN1bHR5IGluIHRoZSBjYXNlIG9mIHNjYW5uaW5nIGZyb20gYW4gaW5wdXRcbiAgICAgY2hhbm5lbC4gSW4gZWZmZWN0LCB3aGVuIHNjYW5uaW5nIGZyb20gYW4gaW5wdXQgY2hhbm5lbCBbaWNdLCB0aGlzIGNoYW5uZWxcbiAgICAgbWF5IG5vdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gd2l0aGluIHRoaXMgbGlicmFyeS4gSGVuY2UsIGl0IG1heSBiZVxuICAgICBzaGFyZWQgKHR3byBmdW5jdGlvbnMgb2YgdGhlIHVzZXIncyBwcm9ncmFtIG1heSBzdWNjZXNzaXZlbHkgcmVhZCBmcm9tXG4gICAgIFtpY10pLiBUaGlzIGlzIGhpZ2hseSBlcnJvciBwcm9uZSBzaW5jZSwgb25lIG9mIHRoZSBmdW5jdGlvbiBtYXkgc2VlayB0aGVcbiAgICAgaW5wdXQgY2hhbm5lbCwgd2hpbGUgdGhlIG90aGVyIGZ1bmN0aW9uIGhhcyBzdGlsbCBhbiB1bnVzZWQgbG9va2FoZWFkXG4gICAgIGNoYXJhY3RlciBpbiBpdHMgaW5wdXQgYnVmZmVyLiBJbiBjb25jbHVzaW9uLCB5b3Ugc2hvdWxkIG5ldmVyIG1peCBkaXJlY3RcbiAgICAgbG93IGxldmVsIHJlYWRpbmcgYW5kIGhpZ2ggbGV2ZWwgc2Nhbm5pbmcgZnJvbSB0aGUgc2FtZSBpbnB1dCBjaGFubmVsLlxuXG4gICopXG5cbiAgKCogUGVyZm9ybSBidWZmZXJpemVkIGlucHV0IHRvIGltcHJvdmUgZWZmaWNpZW5jeS4gKilcbiAgbGV0IGZpbGVfYnVmZmVyX3NpemUgPSByZWYgMTAyNFxuXG4gICgqIFRoZSBzY2FubmVyIGNsb3NlcyB0aGUgaW5wdXQgY2hhbm5lbCBhdCBlbmQgb2YgaW5wdXQuICopXG4gIGxldCBzY2FuX2Nsb3NlX2F0X2VuZCBpYyA9IFN0ZGxpYi5jbG9zZV9pbiBpYzsgcmFpc2UgRW5kX29mX2ZpbGVcblxuICAoKiBUaGUgc2Nhbm5lciBkb2VzIG5vdCBjbG9zZSB0aGUgaW5wdXQgY2hhbm5lbCBhdCBlbmQgb2YgaW5wdXQ6XG4gICAgIGl0IGp1c3QgcmFpc2VzIFtFbmRfb2ZfZmlsZV0uICopXG4gIGxldCBzY2FuX3JhaXNlX2F0X2VuZCBfaWMgPSByYWlzZSBFbmRfb2ZfZmlsZVxuXG4gIGxldCBmcm9tX2ljIHNjYW5fY2xvc2VfaWMgaW5hbWUgaWMgPVxuICAgIGxldCBsZW4gPSAhZmlsZV9idWZmZXJfc2l6ZSBpblxuICAgIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgbGVuIGluXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGxldCBsaW0gPSByZWYgMCBpblxuICAgIGxldCBlb2YgPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgbmV4dCAoKSA9XG4gICAgICBpZiAhaSA8ICFsaW0gdGhlbiBiZWdpbiBsZXQgYyA9IEJ5dGVzLmdldCBidWYgIWkgaW4gaW5jciBpOyBjIGVuZCBlbHNlXG4gICAgICBpZiAhZW9mIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGUgZWxzZSBiZWdpblxuICAgICAgICBsaW0gOj0gaW5wdXQgaWMgYnVmIDAgbGVuO1xuICAgICAgICBpZiAhbGltID0gMCB0aGVuIGJlZ2luIGVvZiA6PSB0cnVlOyBzY2FuX2Nsb3NlX2ljIGljIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgaSA6PSAxO1xuICAgICAgICAgIEJ5dGVzLmdldCBidWYgMFxuICAgICAgICBlbmRcbiAgICAgIGVuZCBpblxuICAgIGNyZWF0ZSBpbmFtZSBuZXh0XG5cblxuICBsZXQgZnJvbV9pY19jbG9zZV9hdF9lbmQgPSBmcm9tX2ljIHNjYW5fY2xvc2VfYXRfZW5kXG4gIGxldCBmcm9tX2ljX3JhaXNlX2F0X2VuZCA9IGZyb21faWMgc2Nhbl9yYWlzZV9hdF9lbmRcblxuICAoKiBUaGUgc2Nhbm5pbmcgYnVmZmVyIHJlYWRpbmcgZnJvbSBbU3RkbGliLnN0ZGluXS5cbiAgICAgT25lIGNvdWxkIHRyeSB0byBkZWZpbmUgW3N0ZGluXSBhcyBhIHNjYW5uaW5nIGJ1ZmZlciByZWFkaW5nIGEgY2hhcmFjdGVyXG4gICAgIGF0IGEgdGltZSAobm8gYnVmZmVyaXphdGlvbiBhdCBhbGwpLCBidXQgdW5mb3J0dW5hdGVseSB0aGUgdG9wLWxldmVsXG4gICAgIGludGVyYWN0aW9uIHdvdWxkIGJlIHdyb25nLiBUaGlzIGlzIGR1ZSB0byBzb21lIGtpbmQgb2ZcbiAgICAgJ3JhY2UgY29uZGl0aW9uJyB3aGVuIHJlYWRpbmcgZnJvbSBbU3RkbGliLnN0ZGluXSxcbiAgICAgc2luY2UgdGhlIGludGVyYWN0aXZlIGNvbXBpbGVyIGFuZCBbU2NhbmYuc2NhbmZdIHdpbGwgc2ltdWx0YW5lb3VzbHlcbiAgICAgcmVhZCB0aGUgbWF0ZXJpYWwgdGhleSBuZWVkIGZyb20gW1N0ZGxpYi5zdGRpbl07IHRoZW4sIGNvbmZ1c2lvblxuICAgICB3aWxsIHJlc3VsdCBmcm9tIHdoYXQgc2hvdWxkIGJlIHJlYWQgYnkgdGhlIHRvcC1sZXZlbCBhbmQgd2hhdCBzaG91bGQgYmVcbiAgICAgcmVhZCBieSBbU2NhbmYuc2NhbmZdLlxuICAgICBUaGlzIGlzIGV2ZW4gbW9yZSBjb21wbGljYXRlZCBieSB0aGUgb25lIGNoYXJhY3RlciBsb29rYWhlYWQgdGhhdFxuICAgICBbU2NhbmYuc2NhbmZdIGlzIHNvbWV0aW1lcyBvYmxpZ2VkIHRvIG1haW50YWluOiB0aGUgbG9va2FoZWFkIGNoYXJhY3RlclxuICAgICB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgW1NjYW5mLnNjYW5mXSBlbnRyeSwgc2VlbWluZ2x5IGNvbWluZyBmcm9tXG4gICAgIG5vd2hlcmUuXG4gICAgIEFsc28gbm8gW0VuZF9vZl9maWxlXSBpcyByYWlzZWQgd2hlbiByZWFkaW5nIGZyb20gc3RkaW46IGlmIG5vdCBlbm91Z2hcbiAgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gcmVhZCwgd2Ugc2ltcGx5IGFzayB0byByZWFkIG1vcmUuICopXG4gIGxldCBzdGRpbiA9XG4gICAgZnJvbV9pYyBzY2FuX3JhaXNlX2F0X2VuZFxuICAgICAgKEZyb21fZmlsZSAoXCItXCIsIFN0ZGxpYi5zdGRpbikpIFN0ZGxpYi5zdGRpblxuXG4gIGxldCBvcGVuX2luX2ZpbGUgb3Blbl9pbiBmbmFtZSA9XG4gICAgbWF0Y2ggZm5hbWUgd2l0aFxuICAgIHwgXCItXCIgLT4gc3RkaW5cbiAgICB8IGZuYW1lIC0+XG4gICAgICBsZXQgaWMgPSBvcGVuX2luIGZuYW1lIGluXG4gICAgICBmcm9tX2ljX2Nsb3NlX2F0X2VuZCAoRnJvbV9maWxlIChmbmFtZSwgaWMpKSBpY1xuXG5cbiAgbGV0IG9wZW5faW4gPSBvcGVuX2luX2ZpbGUgU3RkbGliLm9wZW5faW5cbiAgbGV0IG9wZW5faW5fYmluID0gb3Blbl9pbl9maWxlIFN0ZGxpYi5vcGVuX2luX2JpblxuXG4gIGxldCBmcm9tX2ZpbGUgPSBvcGVuX2luXG4gIGxldCBmcm9tX2ZpbGVfYmluID0gb3Blbl9pbl9iaW5cblxuICBsZXQgZnJvbV9jaGFubmVsIGljID1cbiAgICBmcm9tX2ljX3JhaXNlX2F0X2VuZCAoRnJvbV9jaGFubmVsIGljKSBpY1xuXG5cbiAgbGV0IGNsb3NlX2luIGliID1cbiAgICBtYXRjaCBpYi5pY19pbnB1dF9uYW1lIHdpdGhcbiAgICB8IEZyb21fY2hhbm5lbCBpYyAtPlxuICAgICAgU3RkbGliLmNsb3NlX2luIGljXG4gICAgfCBGcm9tX2ZpbGUgKF9mbmFtZSwgaWMpIC0+IFN0ZGxpYi5jbG9zZV9pbiBpY1xuICAgIHwgRnJvbV9mdW5jdGlvbiB8IEZyb21fc3RyaW5nIC0+ICgpXG5cbmVuZFxuXG5cbigqIEZvcm1hdHRlZCBpbnB1dCBmdW5jdGlvbnMuICopXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBzY2FubmVyID1cbiAgICAgKCdhLCBTY2FubmluZy5pbl9jaGFubmVsLCAnYiwgJ2MsICdhIC0+ICdkLCAnZCkgZm9ybWF0NiAtPiAnY1xuXG50eXBlICgnYSwgJ2IsICdjLCAnZCkgc2Nhbm5lcl9vcHQgPVxuICAgICAoJ2EsIFNjYW5uaW5nLmluX2NoYW5uZWwsICdiLCAnYywgJ2EgLT4gJ2Qgb3B0aW9uLCAnZCkgZm9ybWF0NiAtPiAnY1xuXG4oKiBSZXBvcnRpbmcgZXJyb3JzLiAqKVxuZXhjZXB0aW9uIFNjYW5fZmFpbHVyZSBvZiBzdHJpbmdcblxubGV0IGJhZF9pbnB1dCBzID0gcmFpc2UgKFNjYW5fZmFpbHVyZSBzKVxuXG5sZXQgYmFkX2lucHV0X2VzY2FwZSBjID1cbiAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcImlsbGVnYWwgZXNjYXBlIGNoYXJhY3RlciAlQ1wiIGMpXG5cblxubGV0IGJhZF90b2tlbl9sZW5ndGggbWVzc2FnZSA9XG4gIGJhZF9pbnB1dFxuICAgIChQcmludGYuc3ByaW50ZlxuICAgICAgIFwic2Nhbm5pbmcgb2YgJXMgZmFpbGVkOiBcXFxuICAgICAgICB0aGUgc3BlY2lmaWVkIGxlbmd0aCB3YXMgdG9vIHNob3J0IGZvciB0b2tlblwiXG4gICAgICAgbWVzc2FnZSlcblxuXG5sZXQgYmFkX2VuZF9vZl9pbnB1dCBtZXNzYWdlID1cbiAgYmFkX2lucHV0XG4gICAgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgXCJzY2FubmluZyBvZiAlcyBmYWlsZWQ6IFxcXG4gICAgICAgIHByZW1hdHVyZSBlbmQgb2YgZmlsZSBvY2N1cnJlZCBiZWZvcmUgZW5kIG9mIHRva2VuXCJcbiAgICAgICBtZXNzYWdlKVxuXG5cbmxldCBiYWRfZmxvYXQgKCkgPVxuICBiYWRfaW5wdXQgXCJubyBkb3Qgb3IgZXhwb25lbnQgcGFydCBmb3VuZCBpbiBmbG9hdCB0b2tlblwiXG5cblxubGV0IGJhZF9oZXhfZmxvYXQgKCkgPVxuICBiYWRfaW5wdXQgXCJub3QgYSB2YWxpZCBmbG9hdCBpbiBoZXhhZGVjaW1hbCBub3RhdGlvblwiXG5cblxubGV0IGNoYXJhY3Rlcl9taXNtYXRjaF9lcnIgYyBjaSA9XG4gIFByaW50Zi5zcHJpbnRmIFwibG9va2luZyBmb3IgJUMsIGZvdW5kICVDXCIgYyBjaVxuXG5cbmxldCBjaGFyYWN0ZXJfbWlzbWF0Y2ggYyBjaSA9XG4gIGJhZF9pbnB1dCAoY2hhcmFjdGVyX21pc21hdGNoX2VyciBjIGNpKVxuXG5cbmxldCByZWMgc2tpcF93aGl0ZXMgaWIgPVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBub3QgKFNjYW5uaW5nLmVvZiBpYikgdGhlbiBiZWdpblxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJyAnIHwgJ1xcdCcgfCAnXFxuJyB8ICdcXHInIC0+XG4gICAgICBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYjsgc2tpcF93aGl0ZXMgaWJcbiAgICB8IF8gLT4gKClcbiAgZW5kXG5cblxuKCogQ2hlY2tpbmcgdGhhdCBbY10gaXMgaW5kZWVkIGluIHRoZSBpbnB1dCwgdGhlbiBza2lwcyBpdC5cbiAgIEluIHRoaXMgY2FzZSwgdGhlIGNoYXJhY3RlciBbY10gaGFzIGJlZW4gZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gdGhlXG4gICBmb3JtYXQgYXMgYmVpbmcgbWFuZGF0b3J5IGluIHRoZSBpbnB1dDsgaGVuY2Ugd2Ugc2hvdWxkIGZhaWwgd2l0aFxuICAgW0VuZF9vZl9maWxlXSBpbiBjYXNlIG9mIGVuZF9vZl9pbnB1dC5cbiAgIChSZW1lbWJlciB0aGF0IFtTY2FuX2ZhaWx1cmVdIGlzIHJhaXNlZCBvbmx5IHdoZW4gKHdlIGNhbiBwcm92ZSBieVxuICAgZXZpZGVuY2UpIHRoYXQgdGhlIGlucHV0IGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuLiBXZSBtdXN0XG4gICB0aHVzIGRpZmZlcmVudGlhdGUgW0VuZF9vZl9maWxlXSBhcyBhbiBlcnJvciBkdWUgdG8gbGFjayBvZiBpbnB1dCwgYW5kXG4gICBbU2Nhbl9mYWlsdXJlXSB3aGljaCBpcyBkdWUgdG8gcHJvdmFibHkgd3JvbmcgaW5wdXQuIEkgYW0gbm90IHN1cmUgdGhpcyBpc1xuICAgd29ydGggdGhlIGJ1cmRlbjogaXQgaXMgY29tcGxleCBhbmQgc29tZWhvdyBzdWJsaW1pbmFsOyBzaG91bGQgYmUgY2xlYXJlclxuICAgdG8gZmFpbCB3aXRoIFNjYW5fZmFpbHVyZSBcIk5vdCBlbm91Z2ggaW5wdXQgdG8gY29tcGxldGUgc2Nhbm5pbmdcIiEpXG5cbiAgIFRoYXQncyB3aHksIHdhaXRpbmcgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLCB3ZSB1c2UgY2hlY2tlZF9wZWVrX2NoYXIgaGVyZS5cbiAgIFdlIGFyZSBhbHNvIGNhcmVmdWwgdG8gdHJlYXQgXCJcXHJcXG5cIiBpbiB0aGUgaW5wdXQgYXMgYW4gZW5kIG9mIGxpbmUgbWFya2VyOlxuICAgaXQgYWx3YXlzIG1hdGNoZXMgYSAnXFxuJyBzcGVjaWZpY2F0aW9uIGluIHRoZSBpbnB1dCBmb3JtYXQgc3RyaW5nLiAqKVxubGV0IHJlYyBjaGVja19jaGFyIGliIGMgPVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnICcgLT4gc2tpcF93aGl0ZXMgaWJcbiAgfCAnXFxuJyAtPiBjaGVja19uZXdsaW5lIGliXG4gIHwgYyAtPiBjaGVja190aGlzX2NoYXIgaWIgY1xuXG5hbmQgY2hlY2tfdGhpc19jaGFyIGliIGMgPVxuICBsZXQgY2kgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBpZiBjaSA9IGMgdGhlbiBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYiBlbHNlXG4gIGNoYXJhY3Rlcl9taXNtYXRjaCBjIGNpXG5cbmFuZCBjaGVja19uZXdsaW5lIGliID1cbiAgbGV0IGNpID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgbWF0Y2ggY2kgd2l0aFxuICB8ICdcXG4nIC0+IFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliXG4gIHwgJ1xccicgLT4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWI7IGNoZWNrX3RoaXNfY2hhciBpYiAnXFxuJ1xuICB8IF8gLT4gY2hhcmFjdGVyX21pc21hdGNoICdcXG4nIGNpXG5cblxuKCogRXh0cmFjdGluZyB0b2tlbnMgZnJvbSB0aGUgb3V0cHV0IHRva2VuIGJ1ZmZlci4gKilcblxubGV0IHRva2VuX2NoYXIgaWIgPSAoU2Nhbm5pbmcudG9rZW4gaWIpLlswXVxuXG5sZXQgdG9rZW5fc3RyaW5nID0gU2Nhbm5pbmcudG9rZW5cblxubGV0IHRva2VuX2Jvb2wgaWIgPVxuICBtYXRjaCBTY2FubmluZy50b2tlbiBpYiB3aXRoXG4gIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICB8IHMgLT4gYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcImludmFsaWQgYm9vbGVhbiAnJXMnXCIgcylcblxuXG4oKiBUaGUgdHlwZSBvZiBpbnRlZ2VyIGNvbnZlcnNpb25zLiAqKVxudHlwZSBpbnRlZ2VyX2NvbnZlcnNpb24gPVxuICB8IEJfY29udmVyc2lvbiAoKiBVbnNpZ25lZCBiaW5hcnkgY29udmVyc2lvbiAqKVxuICB8IERfY29udmVyc2lvbiAoKiBTaWduZWQgZGVjaW1hbCBjb252ZXJzaW9uICopXG4gIHwgSV9jb252ZXJzaW9uICgqIFNpZ25lZCBpbnRlZ2VyIGNvbnZlcnNpb24gKilcbiAgfCBPX2NvbnZlcnNpb24gKCogVW5zaWduZWQgb2N0YWwgY29udmVyc2lvbiAqKVxuICB8IFVfY29udmVyc2lvbiAoKiBVbnNpZ25lZCBkZWNpbWFsIGNvbnZlcnNpb24gKilcbiAgfCBYX2NvbnZlcnNpb24gKCogVW5zaWduZWQgaGV4YWRlY2ltYWwgY29udmVyc2lvbiAqKVxuXG5cbmxldCBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciA9IGZ1bmN0aW9uXG4gIHwgJ2InIC0+IEJfY29udmVyc2lvblxuICB8ICdkJyAtPiBEX2NvbnZlcnNpb25cbiAgfCAnaScgLT4gSV9jb252ZXJzaW9uXG4gIHwgJ28nIC0+IE9fY29udmVyc2lvblxuICB8ICd1JyAtPiBVX2NvbnZlcnNpb25cbiAgfCAneCcgfCAnWCcgLT4gWF9jb252ZXJzaW9uXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuXG4oKiBFeHRyYWN0IGFuIGludGVnZXIgbGl0ZXJhbCB0b2tlbi5cbiAgIFNpbmNlIHRoZSBmdW5jdGlvbnMgU3RkbGliLippbnQqX29mX3N0cmluZyBkbyBub3QgYWNjZXB0IGEgbGVhZGluZyArLFxuICAgd2Ugc2tpcCBpdCBpZiBuZWNlc3NhcnkuICopXG5sZXQgdG9rZW5faW50X2xpdGVyYWwgY29udiBpYiA9XG4gIGxldCB0b2sgPVxuICAgIG1hdGNoIGNvbnYgd2l0aFxuICAgIHwgRF9jb252ZXJzaW9uIHwgSV9jb252ZXJzaW9uIC0+IFNjYW5uaW5nLnRva2VuIGliXG4gICAgfCBVX2NvbnZlcnNpb24gLT4gXCIwdVwiIF4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IE9fY29udmVyc2lvbiAtPiBcIjBvXCIgXiBTY2FubmluZy50b2tlbiBpYlxuICAgIHwgWF9jb252ZXJzaW9uIC0+IFwiMHhcIiBeIFNjYW5uaW5nLnRva2VuIGliXG4gICAgfCBCX2NvbnZlcnNpb24gLT4gXCIwYlwiIF4gU2Nhbm5pbmcudG9rZW4gaWIgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHRvayBpblxuICBpZiBsID0gMCB8fCB0b2suWzBdIDw+ICcrJyB0aGVuIHRvayBlbHNlIFN0cmluZy5zdWIgdG9rIDEgKGwgLSAxKVxuXG5cbigqIEFsbCB0aGUgZnVuY3Rpb25zIHRoYXQgY29udmVydCBhIHN0cmluZyB0byBhIG51bWJlciByYWlzZSB0aGUgZXhjZXB0aW9uXG4gICBGYWlsdXJlIHdoZW4gdGhlIGNvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlLlxuICAgVGhpcyBleGNlcHRpb24gaXMgdGhlbiB0cmFwcGVkIGluIFtrc2NhbmZdLiAqKVxubGV0IHRva2VuX2ludCBjb252IGliID0gaW50X29mX3N0cmluZyAodG9rZW5faW50X2xpdGVyYWwgY29udiBpYilcblxubGV0IHRva2VuX2Zsb2F0IGliID0gZmxvYXRfb2Zfc3RyaW5nIChTY2FubmluZy50b2tlbiBpYilcblxuKCogVG8gc2NhbiBuYXRpdmUgaW50cywgaW50MzIgYW5kIGludDY0IGludGVnZXJzLlxuICAgV2UgY2Fubm90IGFjY2VzcyB0byBjb252ZXJzaW9ucyB0by9mcm9tIHN0cmluZ3MgZm9yIHRob3NlIHR5cGVzLFxuICAgTmF0aXZlaW50Lm9mX3N0cmluZywgSW50MzIub2Zfc3RyaW5nLCBhbmQgSW50NjQub2Zfc3RyaW5nLFxuICAgc2luY2UgdGhvc2UgbW9kdWxlcyBhcmUgbm90IGF2YWlsYWJsZSB0byBbU2NhbmZdLlxuICAgSG93ZXZlciwgd2UgY2FuIGJpbmQgYW5kIHVzZSB0aGUgY29ycmVzcG9uZGluZyBwcmltaXRpdmVzIHRoYXQgYXJlXG4gICBhdmFpbGFibGUgaW4gdGhlIHJ1bnRpbWUuICopXG5leHRlcm5hbCBuYXRpdmVpbnRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IG5hdGl2ZWludFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgaW50MzJfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIGludDY0X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQ2NFxuICA9IFwiY2FtbF9pbnQ2NF9vZl9zdHJpbmdcIlxuXG5cbmxldCB0b2tlbl9uYXRpdmVpbnQgY29udiBpYiA9IG5hdGl2ZWludF9vZl9zdHJpbmcgKHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIpXG5sZXQgdG9rZW5faW50MzIgY29udiBpYiA9IGludDMyX29mX3N0cmluZyAodG9rZW5faW50X2xpdGVyYWwgY29udiBpYilcbmxldCB0b2tlbl9pbnQ2NCBjb252IGliID0gaW50NjRfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxuXG4oKiBTY2FubmluZyBudW1iZXJzLiAqKVxuXG4oKiBEaWdpdHMgc2Nhbm5pbmcgZnVuY3Rpb25zIHN1cHBvc2UgdGhhdCBvbmUgY2hhcmFjdGVyIGhhcyBiZWVuIGNoZWNrZWQgYW5kXG4gICBpcyBhdmFpbGFibGUsIHNpbmNlIHRoZXkgcmV0dXJuIGF0IGVuZCBvZiBmaWxlIHdpdGggdGhlIGN1cnJlbnRseSBmb3VuZFxuICAgdG9rZW4gc2VsZWN0ZWQuXG5cbiAgIFB1dCBpdCBpbiBhbm90aGVyIHdheSwgdGhlIGRpZ2l0cyBzY2FubmluZyBmdW5jdGlvbnMgc2NhbiBmb3IgYSBwb3NzaWJseVxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgZGlnaXRzLCAoaGVuY2UsIGEgc3VjY2Vzc2Z1bCBzY2FubmluZyBmcm9tIG9uZSBvZiB0aG9zZVxuICAgZnVuY3Rpb25zIGRvZXMgbm90IGltcGx5IHRoYXQgdGhlIHRva2VuIGlzIGEgd2VsbC1mb3JtZWQgbnVtYmVyOiB0byBnZXQgYVxuICAgdHJ1ZSBudW1iZXIsIGl0IGlzIG1hbmRhdG9yeSB0byBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZSB2YWxpZCBkaWdpdCBpc1xuICAgYXZhaWxhYmxlIGJlZm9yZSBjYWxsaW5nIG9uZSBvZiB0aGUgZGlnaXQgc2Nhbm5pbmcgZnVuY3Rpb25zKS4gKilcblxuKCogVGhlIGRlY2ltYWwgY2FzZSBpcyB0cmVhdGVkIGVzcGVjaWFsbHkgZm9yIG9wdGltaXphdGlvbiBwdXJwb3Nlcy4gKilcbmxldCByZWMgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJzAnIC4uICc5JyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWJcbiAgfCAnXycgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYiBpblxuICAgIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliXG4gIHwgXyAtPiB3aWR0aFxuXG5cbmxldCBzY2FuX2RlY2ltYWxfZGlnaXRfcGx1cyB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIGJhZF90b2tlbl9sZW5ndGggXCJkZWNpbWFsIGRpZ2l0c1wiIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBtYXRjaCBjIHdpdGhcbiAgfCAnMCcgLi4gJzknIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWJcbiAgfCBjIC0+XG4gICAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcImNoYXJhY3RlciAlQyBpcyBub3QgYSBkZWNpbWFsIGRpZ2l0XCIgYylcblxuXG4oKiBUbyBzY2FuIG51bWJlcnMgZnJvbSBvdGhlciBiYXNlcywgd2UgdXNlIGEgcHJlZGljYXRlIGFyZ3VtZW50IHRvXG4gICBzY2FuIGRpZ2l0cy4gKilcbmxldCBzY2FuX2RpZ2l0X3N0YXIgZGlnaXRwIHdpZHRoIGliID1cbiAgbGV0IHJlYyBzY2FuX2RpZ2l0cyB3aWR0aCBpYiA9XG4gICAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgYyB3aGVuIGRpZ2l0cCBjIC0+XG4gICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgIHNjYW5fZGlnaXRzIHdpZHRoIGliXG4gICAgfCAnXycgLT5cbiAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliIGluXG4gICAgICBzY2FuX2RpZ2l0cyB3aWR0aCBpYlxuICAgIHwgXyAtPiB3aWR0aCBpblxuICBzY2FuX2RpZ2l0cyB3aWR0aCBpYlxuXG5cbmxldCBzY2FuX2RpZ2l0X3BsdXMgYmFzaXMgZGlnaXRwIHdpZHRoIGliID1cbiAgKCogRW5zdXJlIHdlIGhhdmUgZ290IGVub3VnaCB3aWR0aCBsZWZ0LFxuICAgICBhbmQgcmVhZCBhdCBsZWFzdCBvbmUgZGlnaXQuICopXG4gIGlmIHdpZHRoID0gMCB0aGVuIGJhZF90b2tlbl9sZW5ndGggXCJkaWdpdHNcIiBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgaWYgZGlnaXRwIGMgdGhlblxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIHNjYW5fZGlnaXRfc3RhciBkaWdpdHAgd2lkdGggaWJcbiAgZWxzZVxuICAgIGJhZF9pbnB1dCAoUHJpbnRmLnNwcmludGYgXCJjaGFyYWN0ZXIgJUMgaXMgbm90IGEgdmFsaWQgJXMgZGlnaXRcIiBjIGJhc2lzKVxuXG5cbmxldCBpc19iaW5hcnlfZGlnaXQgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnMScgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxuXG5sZXQgc2Nhbl9iaW5hcnlfaW50ID0gc2Nhbl9kaWdpdF9wbHVzIFwiYmluYXJ5XCIgaXNfYmluYXJ5X2RpZ2l0XG5cbmxldCBpc19vY3RhbF9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc3JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5cbmxldCBzY2FuX29jdGFsX2ludCA9IHNjYW5fZGlnaXRfcGx1cyBcIm9jdGFsXCIgaXNfb2N0YWxfZGlnaXRcblxubGV0IGlzX2hleGFfZGlnaXQgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5cbmxldCBzY2FuX2hleGFkZWNpbWFsX2ludCA9IHNjYW5fZGlnaXRfcGx1cyBcImhleGFkZWNpbWFsXCIgaXNfaGV4YV9kaWdpdFxuXG4oKiBTY2FuIGEgZGVjaW1hbCBpbnRlZ2VyLiAqKVxubGV0IHNjYW5fdW5zaWduZWRfZGVjaW1hbF9pbnQgPSBzY2FuX2RlY2ltYWxfZGlnaXRfcGx1c1xuXG5sZXQgc2Nhbl9zaWduIHdpZHRoIGliID1cbiAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBtYXRjaCBjIHdpdGhcbiAgfCAnKycgLT4gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjXG4gIHwgJy0nIC0+IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgY1xuICB8IF8gLT4gd2lkdGhcblxuXG5sZXQgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYiA9XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG5cblxuKCogU2NhbiBhbiB1bnNpZ25lZCBpbnRlZ2VyIHRoYXQgY291bGQgYmUgZ2l2ZW4gaW4gYW55IChjb21tb24pIGJhc2lzLlxuICAgSWYgZGlnaXRzIGFyZSBwcmVmaXhlZCBieSBvbmUgb2YgMHgsIDBYLCAwbywgb3IgMGIsIHRoZSBudW1iZXIgaXNcbiAgIGFzc3VtZWQgdG8gYmUgd3JpdHRlbiByZXNwZWN0aXZlbHkgaW4gaGV4YWRlY2ltYWwsIGhleGFkZWNpbWFsLFxuICAgb2N0YWwsIG9yIGJpbmFyeS4gKilcbmxldCBzY2FuX3Vuc2lnbmVkX2ludCB3aWR0aCBpYiA9XG4gIG1hdGNoIFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIHdpdGhcbiAgfCAnMCcgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICBiZWdpbiBtYXRjaCBjIHdpdGhcbiAgICB8ICd4JyB8ICdYJyAtPiBzY2FuX2hleGFkZWNpbWFsX2ludCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICAgIHwgJ28nIC0+IHNjYW5fb2N0YWxfaW50IChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gICAgfCAnYicgLT4gc2Nhbl9iaW5hcnlfaW50IChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gICAgfCBfIC0+IHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliIGVuZFxuICB8IF8gLT4gc2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuXG5cbmxldCBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2ludCB3aWR0aCBpYiA9XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBzY2FuX3Vuc2lnbmVkX2ludCB3aWR0aCBpYlxuXG5cbmxldCBzY2FuX2ludF9jb252ZXJzaW9uIGNvbnYgd2lkdGggaWIgPVxuICBtYXRjaCBjb252IHdpdGhcbiAgfCBCX2NvbnZlcnNpb24gLT4gc2Nhbl9iaW5hcnlfaW50IHdpZHRoIGliXG4gIHwgRF9jb252ZXJzaW9uIC0+IHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcbiAgfCBJX2NvbnZlcnNpb24gLT4gc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9pbnQgd2lkdGggaWJcbiAgfCBPX2NvbnZlcnNpb24gLT4gc2Nhbl9vY3RhbF9pbnQgd2lkdGggaWJcbiAgfCBVX2NvbnZlcnNpb24gLT4gc2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuICB8IFhfY29udmVyc2lvbiAtPiBzY2FuX2hleGFkZWNpbWFsX2ludCB3aWR0aCBpYlxuXG5cbigqIFNjYW5uaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICopXG5cbigqIEZyYWN0aW9uYWwgcGFydCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlZHVjZWQgdG8gMCBkaWdpdHMuICopXG5sZXQgc2Nhbl9mcmFjdGlvbmFsX3BhcnQgd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJzAnIC4uICc5JyBhcyBjIC0+XG4gICAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgfCBfIC0+IHdpZHRoXG5cblxuKCogRXhwIHBhcnQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZWR1Y2VkIHRvIDAgZGlnaXRzLiAqKVxubGV0IHNjYW5fZXhwb25lbnRfcGFydCB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnZScgfCAnRScgYXMgYyAtPlxuICAgIHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgfCBfIC0+IHdpZHRoXG5cblxuKCogU2NhbiB0aGUgaW50ZWdlciBwYXJ0IG9mIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCAobm90IHVzaW5nIHRoZVxuICAgT0NhbWwgbGV4aWNhbCBjb252ZW50aW9uIHNpbmNlIHRoZSBpbnRlZ2VyIHBhcnQgY2FuIGJlIGVtcHR5KTpcbiAgIGFuIG9wdGlvbmFsIHNpZ24sIGZvbGxvd2VkIGJ5IGEgcG9zc2libHkgZW1wdHkgc2VxdWVuY2Ugb2YgZGVjaW1hbFxuICAgZGlnaXRzIChlLmcuIC0uMSkuICopXG5sZXQgc2Nhbl9pbnRlZ2VyX3BhcnQgd2lkdGggaWIgPVxuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWJcblxuXG4oKlxuICAgRm9yIHRoZSB0aW1lIGJlaW5nIHdlIGhhdmUgKGFzIGZvdW5kIGluIHNjYW5mLm1saSk6XG4gICB0aGUgZmllbGQgd2lkdGggaXMgY29tcG9zZWQgb2YgYW4gb3B0aW9uYWwgaW50ZWdlciBsaXRlcmFsXG4gICBpbmRpY2F0aW5nIHRoZSBtYXhpbWFsIHdpZHRoIG9mIHRoZSB0b2tlbiB0byByZWFkLlxuICAgVW5mb3J0dW5hdGVseSwgdGhlIHR5cGUtY2hlY2tlciBsZXQgdGhlIHVzZXIgd3JpdGUgYW4gb3B0aW9uYWwgcHJlY2lzaW9uLFxuICAgc2luY2UgdGhpcyBpcyB2YWxpZCBmb3IgcHJpbnRmIGZvcm1hdCBzdHJpbmdzLlxuXG4gICBUaHVzLCB0aGUgbmV4dCBzdGVwIGZvciBTY2FuZiBpcyB0byBzdXBwb3J0IGEgZnVsbCB3aWR0aCBhbmQgcHJlY2lzaW9uXG4gICBpbmRpY2F0aW9uLCBtb3JlIG9yIGxlc3Mgc2ltaWxhciB0byB0aGUgb25lIGZvciBwcmludGYsIHBvc3NpYmx5IGV4dGVuZGVkXG4gICB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIFttYXgsIG1pbl0gcmFuZ2UgZm9yIHRoZSB3aWR0aCBvZiB0aGUgdG9rZW4gcmVhZFxuICAgZm9yIHN0cmluZ3MuIFNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgc3BlYyBmb3Igc2NhbmYubWxpOlxuXG4gICBUaGUgb3B0aW9uYWwgW3dpZHRoXSBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG1heGltYWxcbiAgIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkLiBGb3IgaW5zdGFuY2UsIFslNmRdIHJlYWRzIGFuIGludGVnZXIsXG4gICBoYXZpbmcgYXQgbW9zdCA2IGNoYXJhY3RlcnMuXG5cbiAgIFRoZSBvcHRpb25hbCBbcHJlY2lzaW9uXSBpcyBhIGRvdCBbLl0gZm9sbG93ZWQgYnkgYW4gaW50ZWdlcjpcblxuICAgLSBpbiB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvbnZlcnNpb25zIChbJWZdLCBbJWVdLCBbJWddLCBbJUZdLCBbJUVdLFxuICAgYW5kIFslRl0gY29udmVyc2lvbnMsIHRoZSBbcHJlY2lzaW9uXSBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mXG4gICBkaWdpdHMgdGhhdCBtYXkgZm9sbG93IHRoZSBkZWNpbWFsIHBvaW50LiBGb3IgaW5zdGFuY2UsIFslLjRmXSByZWFkcyBhXG4gICBbZmxvYXRdIHdpdGggYXQgbW9zdCA0IGZyYWN0aW9uYWwgZGlnaXRzLFxuXG4gICAtIGluIHRoZSBzdHJpbmcgY29udmVyc2lvbnMgKFslc10sIFslU10sIFslXFxbIHJhbmdlIFxcXV0pLCBhbmQgaW4gdGhlXG4gICBpbnRlZ2VyIG51bWJlciBjb252ZXJzaW9ucyAoWyVpXSwgWyVkXSwgWyV1XSwgWyV4XSwgWyVvXSwgYW5kIHRoZWlyXG4gICBbaW50MzJdLCBbaW50NjRdLCBhbmQgW25hdGl2ZV9pbnRdIGNvcnJlc3BvbmRlbnQpLCB0aGUgW3ByZWNpc2lvbl1cbiAgIGluZGljYXRlcyB0aGUgcmVxdWlyZWQgbWluaW11bSB3aWR0aCBvZiB0aGUgdG9rZW4gcmVhZCxcblxuICAgLSBvbiBhbGwgb3RoZXIgY29udmVyc2lvbnMsIHRoZSB3aWR0aCBhbmQgcHJlY2lzaW9uIHNwZWNpZnkgdGhlIFttYXgsIG1pbl1cbiAgIHJhbmdlIGZvciB0aGUgd2lkdGggb2YgdGhlIHRva2VuIHJlYWQuXG4qKVxubGV0IHNjYW5fZmxvYXQgd2lkdGggcHJlY2lzaW9uIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9pbnRlZ2VyX3BhcnQgd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGgsIHByZWNpc2lvbiBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoLCBwcmVjaXNpb24gZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnLicgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICBsZXQgd2lkdGggPSB3aWR0aCAtIChwcmVjaXNpb24gLSBzY2FuX2ZyYWN0aW9uYWxfcGFydCBwcmVjaXNpb24gaWIpIGluXG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliLCBwcmVjaXNpb25cbiAgfCBfIC0+XG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliLCBwcmVjaXNpb25cblxuXG5sZXQgY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmcgd2lkdGggaWIgZXJyb3Igc3RyID1cbiAgbGV0IGxvd2VyY2FzZSBjID1cbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8ICdBJyAuLiAnWicgLT5cbiAgICAgIGNoYXJfb2ZfaW50IChpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJ0EnICsgaW50X29mX2NoYXIgJ2EnKVxuICAgIHwgXyAtPiBjIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgd2lkdGggPSByZWYgd2lkdGggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIGxvd2VyY2FzZSBjIDw+IGxvd2VyY2FzZSBzdHIuW2ldIHRoZW4gZXJyb3IgKCk7XG4gICAgaWYgIXdpZHRoID0gMCB0aGVuIGVycm9yICgpO1xuICAgIHdpZHRoIDo9IFNjYW5uaW5nLnN0b3JlX2NoYXIgIXdpZHRoIGliIGM7XG4gIGRvbmU7XG4gICF3aWR0aFxuXG5cbmxldCBzY2FuX2hleF9mbG9hdCB3aWR0aCBwcmVjaXNpb24gaWIgPVxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICB8ICcwJyBhcyBjIC0+IChcbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICBsZXQgd2lkdGggPSBjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyB3aWR0aCBpYiBiYWRfaGV4X2Zsb2F0IFwieFwiIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgIGxldCB3aWR0aCA9IG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ3AnIHwgJ1AnIC0+IHdpZHRoXG4gICAgICAgIHwgXyAtPiBzY2FuX2hleGFkZWNpbWFsX2ludCB3aWR0aCBpYiBpblxuICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgICAgbGV0IHdpZHRoID0gbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgICB8ICcuJyBhcyBjIC0+IChcbiAgICAgICAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgICAgICAgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgbGV0IHByZWNpc2lvbiA9IEludC5taW4gd2lkdGggcHJlY2lzaW9uIGluXG4gICAgICAgICAgICAgICAgd2lkdGggLSAocHJlY2lzaW9uIC0gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgcHJlY2lzaW9uIGliKVxuICAgICAgICAgIClcbiAgICAgICAgICB8IF8gLT4gd2lkdGggaW5cbiAgICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgIHwgJ3AnIHwgJ1AnIGFzIGMgLT5cbiAgICAgICAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgICAgICAgICBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gICAgICAgICAgfCBfIC0+IHdpZHRoXG4gIClcbiAgfCAnbicgfCAnTicgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgIGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGJhZF9oZXhfZmxvYXQgXCJhblwiXG4gIHwgJ2knIHwgJ0knIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICBjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyB3aWR0aCBpYiBiYWRfaGV4X2Zsb2F0IFwibmZpbml0eVwiXG4gIHwgXyAtPiBiYWRfaGV4X2Zsb2F0ICgpXG5cblxubGV0IHNjYW5fY2FtbF9mbG9hdF9yZXN0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gIGxldCB3aWR0aCA9IHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliIGluXG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcuJyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICgqIFRoZSBlZmZlY3RpdmUgd2lkdGggYXZhaWxhYmxlIGZvciBzY2FubmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzXG4gICAgICAgdGhlIG1pbmltdW0gb2YgZGVjbGFyZWQgcHJlY2lzaW9uIGFuZCB3aWR0aCBsZWZ0LiAqKVxuICAgIGxldCBwcmVjaXNpb24gPSBJbnQubWluIHdpZHRoIHByZWNpc2lvbiBpblxuICAgICgqIEFmdGVyIHNjYW5uaW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQgd2l0aCBbcHJlY2lzaW9uXSBwcm92aXNpb25hbCB3aWR0aCxcbiAgICAgICBbd2lkdGhfcHJlY2lzaW9uXSBpcyBsZWZ0LiAqKVxuICAgIGxldCB3aWR0aF9wcmVjaXNpb24gPSBzY2FuX2ZyYWN0aW9uYWxfcGFydCBwcmVjaXNpb24gaWIgaW5cbiAgICAoKiBIZW5jZSwgc2Nhbm5pbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB0b29rIGV4YWN0bHlcbiAgICAgICBbcHJlY2lzaW9uIC0gd2lkdGhfcHJlY2lzaW9uXSBjaGFycy4gKilcbiAgICBsZXQgZnJhY193aWR0aCA9IHByZWNpc2lvbiAtIHdpZHRoX3ByZWNpc2lvbiBpblxuICAgICgqIEFuZCBuZXcgcHJvdmlzaW9uYWwgd2lkdGggaXMgW3dpZHRoIC0gd2lkdGhfcHJlY2lzaW9uLiAqKVxuICAgIGxldCB3aWR0aCA9IHdpZHRoIC0gZnJhY193aWR0aCBpblxuICAgIHNjYW5fZXhwb25lbnRfcGFydCB3aWR0aCBpYlxuICB8ICdlJyB8ICdFJyAtPlxuICAgIHNjYW5fZXhwb25lbnRfcGFydCB3aWR0aCBpYlxuICB8IF8gLT4gYmFkX2Zsb2F0ICgpXG5cblxubGV0IHNjYW5fY2FtbF9mbG9hdCB3aWR0aCBwcmVjaXNpb24gaWIgPVxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgfCAnMCcgYXMgYyAtPiAoXG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgIHwgJ3gnIHwgJ1gnIGFzIGMgLT4gKFxuICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICAgICAgbGV0IHdpZHRoID0gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgd2lkdGggaWIgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gICAgICBsZXQgd2lkdGggPSBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICB8ICcuJyBhcyBjIC0+IChcbiAgICAgICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICAgICAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgICAgIHwgJ3AnIHwgJ1AnIC0+IHdpZHRoXG4gICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgbGV0IHByZWNpc2lvbiA9IEludC5taW4gd2lkdGggcHJlY2lzaW9uIGluXG4gICAgICAgICAgICAgIHdpZHRoIC0gKHByZWNpc2lvbiAtIHNjYW5faGV4YWRlY2ltYWxfaW50IHByZWNpc2lvbiBpYilcbiAgICAgICAgKVxuICAgICAgICB8ICdwJyB8ICdQJyAtPiB3aWR0aFxuICAgICAgICB8IF8gLT4gYmFkX2Zsb2F0ICgpIGluXG4gICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICB8ICdwJyB8ICdQJyBhcyBjIC0+XG4gICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgICAgICAgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuICAgICAgICB8IF8gLT4gd2lkdGhcbiAgICApXG4gICAgfCBfIC0+XG4gICAgICBzY2FuX2NhbWxfZmxvYXRfcmVzdCB3aWR0aCBwcmVjaXNpb24gaWJcbiAgKVxuICB8ICcxJyAuLiAnOScgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gICAgc2Nhbl9jYW1sX2Zsb2F0X3Jlc3Qgd2lkdGggcHJlY2lzaW9uIGliXG4oKiBTcGVjaWFsIGNhc2Ugb2YgbmFuIGFuZCBpbmZpbml0eTpcbiAgfCAnaScgLT5cbiAgfCAnbicgLT5cbiopXG4gIHwgXyAtPiBiYWRfZmxvYXQgKClcblxuXG4oKiBTY2FuIGEgcmVndWxhciBzdHJpbmc6XG4gICBzdG9wcyB3aGVuIGVuY291bnRlcmluZyBhIHNwYWNlLCBpZiBubyBzY2FubmluZyBpbmRpY2F0aW9uIGhhcyBiZWVuIGdpdmVuO1xuICAgb3RoZXJ3aXNlLCBzdG9wcyB3aGVuIGVuY291bnRlcmluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgc2Nhbm5pbmdcbiAgIGluZGljYXRpb24gW3N0cF0uXG4gICBJdCBhbHNvIHN0b3BzIGF0IGVuZCBvZiBmaWxlIG9yIHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaGFzXG4gICBiZWVuIHJlYWQuICopXG5sZXQgc2Nhbl9zdHJpbmcgc3RwIHdpZHRoIGliID1cbiAgbGV0IHJlYyBsb29wIHdpZHRoID1cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICBtYXRjaCBzdHAgd2l0aFxuICAgICAgfCBTb21lIGMnIHdoZW4gYyA9IGMnIC0+IFNjYW5uaW5nLnNraXBfY2hhciB3aWR0aCBpYlxuICAgICAgfCBTb21lIF8gLT4gbG9vcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKVxuICAgICAgfCBOb25lIC0+XG4gICAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIHwgJ1xcbicgfCAnXFxyJyAtPiB3aWR0aFxuICAgICAgICB8IF8gLT4gbG9vcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpblxuICBsb29wIHdpZHRoXG5cblxuKCogU2NhbiBhIGNoYXI6IHBlZWsgc3RyaWN0bHkgb25lIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQsIHdoYXRzb2V2ZXIuICopXG5sZXQgc2Nhbl9jaGFyIHdpZHRoIGliID1cbiAgKCogVGhlIGNhc2Ugd2lkdGggPSAwIGNvdWxkIG5vdCBoYXBwZW4gaGVyZSwgc2luY2UgaXQgaXMgdGVzdGVkIGJlZm9yZVxuICAgICBjYWxsaW5nIHNjYW5fY2hhciwgaW4gdGhlIG1haW4gc2Nhbm5pbmcgZnVuY3Rpb24uXG4gICAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBcImEgY2hhcmFjdGVyXCIgZWxzZSAqKVxuICBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIChTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYilcblxuXG5sZXQgY2hhcl9mb3JfYmFja3NsYXNoID0gZnVuY3Rpb25cbiAgfCAnbicgLT4gJ1xcMDEwJ1xuICB8ICdyJyAtPiAnXFwwMTMnXG4gIHwgJ2InIC0+ICdcXDAwOCdcbiAgfCAndCcgLT4gJ1xcMDA5J1xuICB8IGMgLT4gY1xuXG5cbigqIFRoZSBpbnRlZ2VyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZhY2lhbCB2YWx1ZSBvZiBhIHZhbGlkXG4gICBkZWNpbWFsIGRpZ2l0IGNoYXJhY3Rlci4gKilcbmxldCBkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYyA9IGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnMCdcblxubGV0IGNoYXJfZm9yX2RlY2ltYWxfY29kZSBjMCBjMSBjMiA9XG4gIGxldCBjID1cbiAgICAxMDAgKiBkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzAgK1xuICAgICAxMCAqIGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMSArXG4gICAgICAgICAgZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMyIGluXG4gIGlmIGMgPCAwIHx8IGMgPiAyNTUgdGhlblxuICAgIGJhZF9pbnB1dFxuICAgICAgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgICBcImJhZCBjaGFyYWN0ZXIgZGVjaW1hbCBlbmNvZGluZyBcXFxcJWMlYyVjXCIgYzAgYzEgYzIpIGVsc2VcbiAgY2hhcl9vZl9pbnQgY1xuXG5cbigqIFRoZSBpbnRlZ2VyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZhY2lhbCB2YWx1ZSBvZiBhIHZhbGlkXG4gICBoZXhhZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIuICopXG5sZXQgaGV4YWRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjID1cbiAgbGV0IGQgPSBpbnRfb2ZfY2hhciBjIGluXG4gICgqIENvdWxkIGFsc28gYmU6XG4gICAgaWYgZCA8PSBpbnRfb2ZfY2hhciAnOScgdGhlbiBkIC0gaW50X29mX2NoYXIgJzAnIGVsc2VcbiAgICBpZiBkIDw9IGludF9vZl9jaGFyICdGJyB0aGVuIDEwICsgZCAtIGludF9vZl9jaGFyICdBJyBlbHNlXG4gICAgaWYgZCA8PSBpbnRfb2ZfY2hhciAnZicgdGhlbiAxMCArIGQgLSBpbnRfb2ZfY2hhciAnYScgZWxzZSBhc3NlcnQgZmFsc2VcbiAgKilcbiAgaWYgZCA+PSBpbnRfb2ZfY2hhciAnYScgdGhlblxuICAgIGQgLSA4NyAoKiAxMCArIGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnYScgKikgZWxzZVxuICBpZiBkID49IGludF9vZl9jaGFyICdBJyB0aGVuXG4gICAgZCAtIDU1ICAoKiAxMCArIGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnQScgKikgZWxzZVxuICAgIGQgLSBpbnRfb2ZfY2hhciAnMCdcblxuXG5sZXQgY2hhcl9mb3JfaGV4YWRlY2ltYWxfY29kZSBjMSBjMiA9XG4gIGxldCBjID1cbiAgICAxNiAqIGhleGFkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzEgK1xuICAgICAgICAgaGV4YWRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMiBpblxuICBpZiBjIDwgMCB8fCBjID4gMjU1IHRoZW5cbiAgICBiYWRfaW5wdXRcbiAgICAgIChQcmludGYuc3ByaW50ZiBcImJhZCBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgZW5jb2RpbmcgXFxcXCVjJWNcIiBjMSBjMikgZWxzZVxuICBjaGFyX29mX2ludCBjXG5cblxuKCogQ2FsbGVkIGluIHBhcnRpY3VsYXIgd2hlbiBlbmNvdW50ZXJpbmcgJ1xcXFwnIGFzIHN0YXJ0ZXIgb2YgYSBjaGFyLlxuICAgU3RvcHMgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nICdcXCcnLiAqKVxubGV0IGNoZWNrX25leHRfY2hhciBtZXNzYWdlIHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBtZXNzYWdlIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gYmFkX2VuZF9vZl9pbnB1dCBtZXNzYWdlIGVsc2VcbiAgY1xuXG5cbmxldCBjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIgPSBjaGVja19uZXh0X2NoYXIgXCJhIENoYXJcIlxubGV0IGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nID0gY2hlY2tfbmV4dF9jaGFyIFwiYSBTdHJpbmdcIlxuXG5sZXQgc2Nhbl9iYWNrc2xhc2hfY2hhciB3aWR0aCBpYiA9XG4gIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciB3aWR0aCBpYiB3aXRoXG4gIHwgJ1xcXFwnIHwgJ1xcJycgfCAnXFxcIicgfCAnbicgfCAndCcgfCAnYicgfCAncicgYXMgYyAtPlxuICAgIFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgKGNoYXJfZm9yX2JhY2tzbGFzaCBjKVxuICB8ICcwJyAuLiAnOScgYXMgYyAtPlxuICAgIGxldCBnZXRfZGlnaXQgKCkgPVxuICAgICAgbGV0IGMgPSBTY2FubmluZy5uZXh0X2NoYXIgaWIgaW5cbiAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgfCAnMCcgLi4gJzknIGFzIGMgLT4gY1xuICAgICAgfCBjIC0+IGJhZF9pbnB1dF9lc2NhcGUgYyBpblxuICAgIGxldCBjMCA9IGMgaW5cbiAgICBsZXQgYzEgPSBnZXRfZGlnaXQgKCkgaW5cbiAgICBsZXQgYzIgPSBnZXRfZGlnaXQgKCkgaW5cbiAgICBTY2FubmluZy5zdG9yZV9jaGFyICh3aWR0aCAtIDIpIGliIChjaGFyX2Zvcl9kZWNpbWFsX2NvZGUgYzAgYzEgYzIpXG4gIHwgJ3gnIC0+XG4gICAgbGV0IGdldF9kaWdpdCAoKSA9XG4gICAgICBsZXQgYyA9IFNjYW5uaW5nLm5leHRfY2hhciBpYiBpblxuICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgfCAnQScgLi4gJ0YnIHwgJ2EnIC4uICdmJyBhcyBjIC0+IGNcbiAgICAgIHwgYyAtPiBiYWRfaW5wdXRfZXNjYXBlIGMgaW5cbiAgICBsZXQgYzEgPSBnZXRfZGlnaXQgKCkgaW5cbiAgICBsZXQgYzIgPSBnZXRfZGlnaXQgKCkgaW5cbiAgICBTY2FubmluZy5zdG9yZV9jaGFyICh3aWR0aCAtIDIpIGliIChjaGFyX2Zvcl9oZXhhZGVjaW1hbF9jb2RlIGMxIGMyKVxuICB8IGMgLT5cbiAgICBiYWRfaW5wdXRfZXNjYXBlIGNcblxuXG4oKiBTY2FuIGEgY2hhcmFjdGVyIChhbiBPQ2FtbCB0b2tlbikuICopXG5sZXQgc2Nhbl9jYW1sX2NoYXIgd2lkdGggaWIgPVxuXG4gIGxldCByZWMgZmluZF9zdGFydCB3aWR0aCA9XG4gICAgbWF0Y2ggU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgd2l0aFxuICAgIHwgJ1xcJycgLT4gZmluZF9jaGFyIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IGMgLT4gY2hhcmFjdGVyX21pc21hdGNoICdcXCcnIGNcblxuICBhbmQgZmluZF9jaGFyIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xcXFwnIC0+XG4gICAgICBmaW5kX3N0b3AgKHNjYW5fYmFja3NsYXNoX2NoYXIgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKSBpYilcbiAgICB8IGMgLT5cbiAgICAgIGZpbmRfc3RvcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKVxuXG4gIGFuZCBmaW5kX3N0b3Agd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFwnJyAtPiBTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYlxuICAgIHwgYyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcJycgYyBpblxuXG4gIGZpbmRfc3RhcnQgd2lkdGhcblxuXG4oKiBTY2FuIGEgZGVsaW1pdGVkIHN0cmluZyAoYW4gT0NhbWwgdG9rZW4pLiAqKVxubGV0IHNjYW5fY2FtbF9zdHJpbmcgd2lkdGggaWIgPVxuXG4gIGxldCByZWMgZmluZF9zdGFydCB3aWR0aCA9XG4gICAgbWF0Y2ggU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgd2l0aFxuICAgIHwgJ1xcXCInIC0+IGZpbmRfc3RvcCAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBjIC0+IGNoYXJhY3Rlcl9taXNtYXRjaCAnXFxcIicgY1xuXG4gIGFuZCBmaW5kX3N0b3Agd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXFwiJyAtPiBTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYlxuICAgIHwgJ1xcXFwnIC0+IHNjYW5fYmFja3NsYXNoIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IGMgLT4gZmluZF9zdG9wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpXG5cbiAgYW5kIHNjYW5fYmFja3NsYXNoIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxyJyAtPiBza2lwX25ld2xpbmUgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgJ1xcbicgLT4gc2tpcF9zcGFjZXMgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgXyAtPiBmaW5kX3N0b3AgKHNjYW5fYmFja3NsYXNoX2NoYXIgd2lkdGggaWIpXG5cbiAgYW5kIHNraXBfbmV3bGluZSB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xcbicgLT4gc2tpcF9zcGFjZXMgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgXyAtPiBmaW5kX3N0b3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgJ1xccicpXG5cbiAgYW5kIHNraXBfc3BhY2VzIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyB3aWR0aCBpYiB3aXRoXG4gICAgfCAnICcgLT4gc2tpcF9zcGFjZXMgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgXyAtPiBmaW5kX3N0b3Agd2lkdGggaW5cblxuICBmaW5kX3N0YXJ0IHdpZHRoXG5cblxuKCogU2NhbiBhIGJvb2xlYW4gKGFuIE9DYW1sIHRva2VuKS4gKilcbmxldCBzY2FuX2Jvb2wgaWIgPVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIGxldCBtID1cbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8ICd0JyAtPiA0XG4gICAgfCAnZicgLT4gNVxuICAgIHwgYyAtPlxuICAgICAgYmFkX2lucHV0XG4gICAgICAgIChQcmludGYuc3ByaW50ZiBcInRoZSBjaGFyYWN0ZXIgJUMgY2Fubm90IHN0YXJ0IGEgYm9vbGVhblwiIGMpIGluXG4gIHNjYW5fc3RyaW5nIE5vbmUgbSBpYlxuXG5cbigqIFNjYW4gYSBzdHJpbmcgY29udGFpbmluZyBlbGVtZW50cyBpbiBjaGFyX3NldCBhbmQgdGVybWluYXRlZCBieSBzY2FuX2luZGljXG4gICBpZiBwcm92aWRlZC4gKilcbmxldCBzY2FuX2NoYXJzX2luX2NoYXJfc2V0IGNoYXJfc2V0IHNjYW5faW5kaWMgd2lkdGggaWIgPVxuICBsZXQgcmVjIHNjYW5fY2hhcnMgaSBzdHAgPVxuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgaSA+IDAgJiYgbm90IChTY2FubmluZy5lb2YgaWIpICYmXG4gICAgICAgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyAmJlxuICAgICAgIGludF9vZl9jaGFyIGMgPD4gc3RwIHRoZW5cbiAgICAgIGxldCBfID0gU2Nhbm5pbmcuc3RvcmVfY2hhciBtYXhfaW50IGliIGMgaW5cbiAgICAgIHNjYW5fY2hhcnMgKGkgLSAxKSBzdHAgaW5cbiAgbWF0Y2ggc2Nhbl9pbmRpYyB3aXRoXG4gIHwgTm9uZSAtPiBzY2FuX2NoYXJzIHdpZHRoICgtMSk7XG4gIHwgU29tZSBjIC0+XG4gICAgc2Nhbl9jaGFycyB3aWR0aCAoaW50X29mX2NoYXIgYyk7XG4gICAgaWYgbm90IChTY2FubmluZy5lb2YgaWIpIHRoZW5cbiAgICAgIGxldCBjaSA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgICAgaWYgYyA9IGNpXG4gICAgICB0aGVuIFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliXG4gICAgICBlbHNlIGNoYXJhY3Rlcl9taXNtYXRjaCBjIGNpXG5cblxuKCogVGhlIGdsb2JhbCBlcnJvciByZXBvcnQgZnVuY3Rpb24gZm9yIFtTY2FuZl0uICopXG5sZXQgc2NhbmZfYmFkX2lucHV0IGliID0gZnVuY3Rpb25cbiAgfCBTY2FuX2ZhaWx1cmUgcyB8IEZhaWx1cmUgcyAtPlxuICAgIGxldCBpID0gU2Nhbm5pbmcuY2hhcl9jb3VudCBpYiBpblxuICAgIGJhZF9pbnB1dCAoUHJpbnRmLnNwcmludGYgXCJzY2FuZjogYmFkIGlucHV0IGF0IGNoYXIgbnVtYmVyICVpOiAlc1wiIGkgcylcbiAgfCB4IC0+IHJhaXNlIHhcblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgYSBjb3VudGVyIGZyb20gYW4gaW5wdXQgYnVmZmVyLiAqKVxubGV0IGdldF9jb3VudGVyIGliIGNvdW50ZXIgPVxuICBtYXRjaCBjb3VudGVyIHdpdGhcbiAgfCBMaW5lX2NvdW50ZXIgLT4gU2Nhbm5pbmcubGluZV9jb3VudCBpYlxuICB8IENoYXJfY291bnRlciAtPiBTY2FubmluZy5jaGFyX2NvdW50IGliXG4gIHwgVG9rZW5fY291bnRlciAtPiBTY2FubmluZy50b2tlbl9jb3VudCBpYlxuXG5cbigqIENvbXB1dGUgdGhlIHdpZHRoIG9mIGEgcGFkZGluZyBvcHRpb24gKHNlZSBcIiU0MntcIiBhbmQgXCIlMTIzKFwiKS4gKilcbmxldCB3aWR0aF9vZl9wYWRfb3B0IHBhZF9vcHQgPSBtYXRjaCBwYWRfb3B0IHdpdGhcbiAgfCBOb25lIC0+IG1heF9pbnRcbiAgfCBTb21lIHdpZHRoIC0+IHdpZHRoXG5cblxubGV0IHN0b3BwZXJfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nID1cbiAgaWYgZm10aW5nID0gRXNjYXBlZF9wZXJjZW50IHRoZW4gJyUnLCBcIlwiIGVsc2VcbiAgICBsZXQgc3RyID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZyBpblxuICAgIGxldCBzdHAgPSBzdHIuWzFdIGluXG4gICAgbGV0IHN1Yl9zdHIgPSBTdHJpbmcuc3ViIHN0ciAyIChTdHJpbmcubGVuZ3RoIHN0ciAtIDIpIGluXG4gICAgc3RwLCBzdWJfc3RyXG5cblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFJlYWRlciBtYW5hZ2VtZW50ICopXG5cbigqIEEgY2FsbCB0byB0YWtlX2Zvcm1hdF9yZWFkZXJzIG9uIGEgZm9ybWF0IGlzIGV2YWx1YXRlZCBpbnRvIGZ1bmN0aW9uc1xuICAgdGFraW5nIHJlYWRlcnMgYXMgYXJndW1lbnRzIGFuZCBhZ2dyZWdhdGUgdGhlbSBpbnRvIGFuIGhldGVyb2dlbmVvdXMgbGlzdCAqKVxuKCogV2hlbiBhbGwgcmVhZGVycyBhcmUgdGFrZW4sIGZpbmFsbHkgcGFzcyB0aGUgbGlzdCBvZiB0aGUgcmVhZGVycyB0byB0aGVcbiAgIGNvbnRpbnVhdGlvbiBrLiAqKVxubGV0IHJlYyB0YWtlX2Zvcm1hdF9yZWFkZXJzIDogdHlwZSBhIGMgZCBlIGYgLlxuICAgICgoZCwgZSkgaGV0ZXJfbGlzdCAtPiBlKSAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgZCA9XG5mdW4gayBmbXQgLT4gbWF0Y2ggZm10IHdpdGhcbiAgfCBSZWFkZXIgZm10X3Jlc3QgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRfcmVzdFxuICB8IENoYXIgcmVzdCAgICAgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTdHJpbmcgKF8sIHJlc3QpICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IENhbWxfc3RyaW5nIChfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgSW50IChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBJbnQzMiAoXywgXywgXywgcmVzdCkgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IE5hdGl2ZWludCAoXywgXywgXywgcmVzdCkgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgSW50NjQgKF8sIF8sIF8sIHJlc3QpICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGbG9hdCAoXywgXywgXywgcmVzdCkgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEJvb2wgKF8sIHJlc3QpICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBUaGV0YSByZXN0ICAgICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEZsdXNoIHJlc3QgICAgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgU3RyaW5nX2xpdGVyYWwgKF8sIHJlc3QpICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKF8sIHJlc3QpICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEN1c3RvbSAoXywgXywgcmVzdCkgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG5cbiAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKF8sIHJlc3QpICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcblxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCwgXykpLCByZXN0KSAtPlxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBrIChjb25jYXRfZm10IGZtdCByZXN0KVxuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQsIF8pKSwgcmVzdCkgLT5cbiAgICAgIHRha2VfZm9ybWF0X3JlYWRlcnMgayAoY29uY2F0X2ZtdCBmbXQgcmVzdClcblxuICB8IEZvcm1hdF9hcmcgKF8sIF8sIHJlc3QpICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgICAgLT5cbiAgICAgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIChlcmFzZV9yZWwgKHN5bW0gZm10dHkpKSByZXN0XG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAgICAgICAgLT4gdGFrZV9pZ25vcmVkX2Zvcm1hdF9yZWFkZXJzIGsgaWduIHJlc3RcblxuICB8IEVuZF9vZl9mb3JtYXQgICAgICAgICAgICAgICAgICAgIC0+IGsgTmlsXG5cbigqIFRha2UgcmVhZGVycyBhc3NvY2lhdGVkIHRvIGFuIGZtdHR5IGNvbWluZyBmcm9tIGEgRm9ybWF0X3N1YnN0IFwiJSguLi4lKVwiLiAqKVxuYW5kIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgOiB0eXBlIHggeSBhIGMgZCBlIGYgLlxuICAgICgoZCwgZSkgaGV0ZXJfbGlzdCAtPiBlKSAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgeCwgeSkgZm10dHkgLT5cbiAgICAgICh5LCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCB4LCBlLCBmKSBmbXQgLT4gZCA9XG5mdW4gayBmbXR0eSBmbXQgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IFJlYWRlcl90eSBmbXRfcmVzdCAtPlxuICAgIGZ1biByZWFkZXIgLT5cbiAgICAgIGxldCBuZXdfayByZWFkZXJzX3Jlc3QgPSBrIChDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkpIGluXG4gICAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIG5ld19rIGZtdF9yZXN0IGZtdFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdF9yZXN0IC0+XG4gICAgZnVuIHJlYWRlciAtPlxuICAgICAgbGV0IG5ld19rIHJlYWRlcnNfcmVzdCA9IGsgKENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSkgaW5cbiAgICAgIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgbmV3X2sgZm10X3Jlc3QgZm10XG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IFN0cmluZ190eSByZXN0ICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IE5hdGl2ZWludF90eSByZXN0ICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEJvb2xfdHkgcmVzdCAgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBBbHBoYV90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgVGhldGFfdHkgcmVzdCAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEFueV90eSByZXN0ICAgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgRW5kX29mX2ZtdHR5ICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIChjb25jYXRfZm10dHkgdHkgcmVzdCkgZm10XG5cbigqIFRha2UgcmVhZGVycyBhc3NvY2lhdGVkIHRvIGFuIGlnbm9yZWQgcGFyYW1ldGVyLiAqKVxuYW5kIHRha2VfaWdub3JlZF9mb3JtYXRfcmVhZGVycyA6IHR5cGUgeCB5IGEgYyBkIGUgZiAuXG4gICAgKChkLCBlKSBoZXRlcl9saXN0IC0+IGUpIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCB4LCB5KSBpZ25vcmVkIC0+XG4gICAgICAoeSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgeCwgZSwgZikgZm10IC0+IGQgPVxuZnVuIGsgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfcmVhZGVyIC0+XG4gICAgZnVuIHJlYWRlciAtPlxuICAgICAgbGV0IG5ld19rIHJlYWRlcnNfcmVzdCA9IGsgKENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSkgaW5cbiAgICAgIHRha2VfZm9ybWF0X3JlYWRlcnMgbmV3X2sgZm10XG4gIHwgSWdub3JlZF9jaGFyICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBfICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9pbnQgKF8sIF8pICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKF8sIF8pICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9pbnQ2NCAoXywgXykgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9ib29sIF8gICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIF8gICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgZm10dHkgZm10XG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEdlbmVyaWMgc2Nhbm5pbmcgKilcblxuKCogTWFrZSBhIGdlbmVyaWMgc2Nhbm5pbmcgZnVuY3Rpb24uICopXG4oKiBTY2FuIGEgc3RyZWFtIGFjY29yZGluZyB0byBhIGZvcm1hdCBhbmQgcmVhZGVycyBvYnRhaW5lZCBieVxuICAgdGFrZV9mb3JtYXRfcmVhZGVycywgYW5kIGFnZ3JlZ2F0ZSBzY2FubmVkIHZhbHVlcyBpbnRvIGFuXG4gICBoZXRlcm9nZW5lb3VzIGxpc3QuICopXG4oKiBSZXR1cm4gdGhlIGhldGVyb2dlbmVvdXMgbGlzdCBvZiBzY2FubmVkIHZhbHVlcy4gKilcbmxldCByZWMgbWFrZV9zY2FuZiA6IHR5cGUgYSBjIGQgZSBmLlxuICAgIFNjYW5uaW5nLmluX2NoYW5uZWwgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKGQsIGUpIGhldGVyX2xpc3QgLT4gKGEsIGYpIGhldGVyX2xpc3QgPVxuZnVuIGliIGZtdCByZWFkZXJzIC0+IG1hdGNoIGZtdCB3aXRoXG4gIHwgQ2hhciByZXN0IC0+XG4gICAgbGV0IF8gPSBzY2FuX2NoYXIgMCBpYiBpblxuICAgIGxldCBjID0gdG9rZW5fY2hhciBpYiBpblxuICAgIENvbnMgKGMsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfY2hhciAwIGliIGluXG4gICAgbGV0IGMgPSB0b2tlbl9jaGFyIGliIGluXG4gICAgQ29ucyAoYywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG5cbiAgfCBTdHJpbmcgKHBhZCwgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIHJlc3QpKSAtPlxuICAgIGxldCBzdHAsIHN0ciA9IHN0b3BwZXJfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX3N0cmluZyAoU29tZSBzdHApIHdpZHRoIGliIGluXG4gICAgbGV0IHN0cl9yZXN0ID0gU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiBzdHJfcmVzdCByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhbiB0b2tlbl9zdHJpbmdcbiAgfCBTdHJpbmcgKHBhZCwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIChTb21lICd7Jykgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuXG4gICAgICAgICAgICAgICAgICAgdG9rZW5fc3RyaW5nXG4gIHwgU3RyaW5nIChwYWQsIEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpKSAtPlxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX3N0cmluZyAoU29tZSAnWycpIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgKGNvbmNhdF9mbXQgZm10JyByZXN0KSByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhblxuICAgICAgICAgICAgICAgICAgIHRva2VuX3N0cmluZ1xuICB8IFN0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX3N0cmluZyBOb25lIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhbiB0b2tlbl9zdHJpbmdcblxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fY2FtbF9zdHJpbmcgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgYyA9IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIChjaGFyX29mX2ljb252IGljb252KSBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2ludF9jb252ZXJzaW9uIGMgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2NhbiAodG9rZW5faW50IGMpXG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IGMgPSBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciAoY2hhcl9vZl9pY29udiBpY29udikgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9pbnRfY29udmVyc2lvbiBjIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gKHRva2VuX2ludDMyIGMpXG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9uYXRpdmVpbnQgYylcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgYyA9IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIChjaGFyX29mX2ljb252IGljb252KSBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2ludF9jb252ZXJzaW9uIGMgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2NhbiAodG9rZW5faW50NjQgYylcbiAgfCBGbG9hdCAoKF8sIChGbG9hdF9GIHwgRmxvYXRfQ0YpKSwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuX2NhbWxfZmxvYXQgdG9rZW5fZmxvYXRcbiAgfCBGbG9hdCAoKF8sIChGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRykpLFxuICAgICAgICAgICBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW5fZmxvYXQgdG9rZW5fZmxvYXRcbiAgfCBGbG9hdCAoKF8sIChGbG9hdF9oIHwgRmxvYXRfSCkpLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW5faGV4X2Zsb2F0IHRva2VuX2Zsb2F0XG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIGxldCBzY2FuIF8gXyBpYiA9IHNjYW5fYm9vbCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW4gdG9rZW5fYm9vbFxuICB8IEFscGhhIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJWFcXFwiXCJcbiAgfCBUaGV0YSBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiV0XFxcIlwiXG4gIHwgQ3VzdG9tIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJT9cXFwiIChjdXN0b20gY29udmVydGVyKVwiXG4gIHwgUmVhZGVyIGZtdF9yZXN0IC0+XG4gICAgYmVnaW4gbWF0Y2ggcmVhZGVycyB3aXRoXG4gICAgfCBDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkgLT5cbiAgICAgICAgbGV0IHggPSByZWFkZXIgaWIgaW5cbiAgICAgICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXRfcmVzdCByZWFkZXJzX3Jlc3QpXG4gICAgfCBOaWwgLT5cbiAgICAgICAgaW52YWxpZF9hcmcgXCJzY2FuZjogbWlzc2luZyByZWFkZXJcIlxuICAgIGVuZFxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBpZiBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVyc1xuICAgIGVsc2UgYmFkX2lucHV0IFwiZW5kIG9mIGlucHV0IG5vdCBmb3VuZFwiXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZy5pdGVyIChjaGVja19jaGFyIGliKSBzdHI7XG4gICAgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnNcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBjaGVja19jaGFyIGliIGNocjtcbiAgICBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVyc1xuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfc3RyaW5nICh3aWR0aF9vZl9wYWRfb3B0IHBhZF9vcHQpIGliIGluXG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgZm10ID1cbiAgICAgIHRyeSBmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IHMgZm10dHlcbiAgICAgIHdpdGggRmFpbHVyZSBtc2cgLT4gYmFkX2lucHV0IG1zZ1xuICAgIGluXG4gICAgQ29ucyAoZm10LCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIGZtdHR5LCByZXN0KSAtPlxuICAgIGxldCBfID0gc2Nhbl9jYW1sX3N0cmluZyAod2lkdGhfb2ZfcGFkX29wdCBwYWRfb3B0KSBpYiBpblxuICAgIGxldCBzID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgbGV0IGZtdCwgZm10JyA9XG4gICAgICB0cnlcbiAgICAgICAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgcyBpblxuICAgICAgICBsZXQgRm10X0VCQiBmbXQnID0gZm10X2ViYl9vZl9zdHJpbmcgcyBpblxuICAgICAgICAoKiBUT0RPOiBmaW5kIGEgd2F5IHRvIGF2b2lkIHJlcGFyc2luZyB0d2ljZSAqKVxuXG4gICAgICAgICgqIFRPRE86IHRoZXNlIHR5cGUtY2hlY2tzIGJlbG93ICpjYW4qIGZhaWwgYmVjYXVzZSBvZiB0eXBlXG4gICAgICAgICAgIGFtYmlndWl0eSBpbiBwcmVzZW5jZSBvZiBpZ25vcmVkLXJlYWRlcnM6IFwiJV9yJWRcIiBhbmQgXCIlZCVfclwiXG4gICAgICAgICAgIGFyZSB0eXBlZCBpbiB0aGUgc2FtZSB3YXkuXG5cbiAgICAgICAgICAgIyBTY2FuZi5zc2NhbmYgXCJcXFwiJV9yJWRcXFwiM1wiIFwiJSglZCVfciUpXCIgaWdub3JlXG4gICAgICAgICAgICAgKGZ1biBmbXQgbiAtPiBzdHJpbmdfb2ZfZm9ybWF0IGZtdCwgbilcbiAgICAgICAgICAgRXhjZXB0aW9uOiBDYW1saW50ZXJuYWxGb3JtYXQuVHlwZV9taXNtYXRjaC5cblxuICAgICAgICAgICBXZSBzaG91bGQgcHJvcGVybHkgY2F0Y2ggdGhpcyBleGNlcHRpb24uXG4gICAgICAgICopXG4gICAgICAgIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIGZtdHR5KSxcbiAgICAgICAgdHlwZV9mb3JtYXQgZm10JyAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcbiAgICAgIHdpdGggRmFpbHVyZSBtc2cgLT4gYmFkX2lucHV0IG1zZ1xuICAgIGluXG4gICAgQ29ucyAoRm9ybWF0IChmbXQsIHMpLFxuICAgICAgICAgIG1ha2Vfc2NhbmYgaWIgKGNvbmNhdF9mbXQgZm10JyByZXN0KSByZWFkZXJzKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIHJlc3QpKSAtPlxuICAgIGxldCBzdHAsIHN0ciA9IHN0b3BwZXJfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIGxldCB3aWR0aCA9IHdpZHRoX29mX3BhZF9vcHQgd2lkdGhfb3B0IGluXG4gICAgc2Nhbl9jaGFyc19pbl9jaGFyX3NldCBjaGFyX3NldCAoU29tZSBzdHApIHdpZHRoIGliO1xuICAgIGxldCBzID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgbGV0IHN0cl9yZXN0ID0gU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgaW5cbiAgICBDb25zIChzLCBtYWtlX3NjYW5mIGliIHN0cl9yZXN0IHJlYWRlcnMpXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBsZXQgd2lkdGggPSB3aWR0aF9vZl9wYWRfb3B0IHdpZHRoX29wdCBpblxuICAgIHNjYW5fY2hhcnNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgTm9uZSB3aWR0aCBpYjtcbiAgICBsZXQgcyA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIENvbnMgKHMsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIHJlc3QpIC0+XG4gICAgbGV0IGNvdW50ID0gZ2V0X2NvdW50ZXIgaWIgY291bnRlciBpblxuICAgIENvbnMgKGNvdW50LCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICAgIENvbnMgKGMsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCByZXN0KSAtPlxuICAgIFN0cmluZy5pdGVyIChjaGVja19jaGFyIGliKSAoc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZvcm1hdHRpbmdfbGl0KTtcbiAgICBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVyc1xuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgY2hlY2tfY2hhciBpYiAnQCc7IGNoZWNrX2NoYXIgaWIgJ3snO1xuICAgIG1ha2Vfc2NhbmYgaWIgKGNvbmNhdF9mbXQgZm10JyByZXN0KSByZWFkZXJzXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICBjaGVja19jaGFyIGliICdAJzsgY2hlY2tfY2hhciBpYiAnWyc7XG4gICAgbWFrZV9zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnNcblxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICBsZXQgUGFyYW1fZm9ybWF0X0VCQiBmbXQnID0gcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IGlnbiByZXN0IGluXG4gICAgYmVnaW4gbWF0Y2ggbWFrZV9zY2FuZiBpYiBmbXQnIHJlYWRlcnMgd2l0aFxuICAgIHwgQ29ucyAoXywgYXJnX3Jlc3QpIC0+IGFyZ19yZXN0XG4gICAgfCBOaWwgLT4gYXNzZXJ0IGZhbHNlXG4gICAgZW5kXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgTmlsXG5cbigqIENhc2UgYW5hbHlzaXMgb24gcGFkZGluZyBhbmQgcHJlY2lzaW9uLiAqKVxuKCogUmVqZWN0IGZvcm1hdHMgY29udGFpbmluZyBcIiUqXCIgb3IgXCIlLipcIi4gKilcbigqIFBhc3MgcGFkZGluZyBhbmQgcHJlY2lzaW9uIHRvIHRoZSBnZW5lcmljIHNjYW5uZXIgYHNjYW4nLiAqKVxuYW5kIHBhZF9wcmVjX3NjYW5mIDogdHlwZSBhIGMgZCBlIGYgeCB5IHogdCAuXG4gICAgU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgICAoZCwgZSkgaGV0ZXJfbGlzdCAtPiAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeiAtPiBhKSBwcmVjaXNpb24gLT5cbiAgICAgIChpbnQgLT4gaW50IC0+IFNjYW5uaW5nLmluX2NoYW5uZWwgLT4gdCkgLT5cbiAgICAgIChTY2FubmluZy5pbl9jaGFubmVsIC0+IHopIC0+XG4gICAgICAoeCwgZikgaGV0ZXJfbGlzdCA9XG5mdW4gaWIgZm10IHJlYWRlcnMgcGFkIHByZWMgc2NhbiB0b2tlbiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGxldCBfID0gc2NhbiBtYXhfaW50IG1heF9pbnQgaWIgaW5cbiAgICBsZXQgeCA9IHRva2VuIGliIGluXG4gICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycylcbiAgfCBOb19wYWRkaW5nLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBsZXQgXyA9IHNjYW4gbWF4X2ludCBwIGliIGluXG4gICAgbGV0IHggPSB0b2tlbiBpYiBpblxuICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMpXG4gIHwgTGl0X3BhZGRpbmcgKChSaWdodCB8IFplcm9zKSwgdyksIE5vX3ByZWNpc2lvbiAtPlxuICAgIGxldCBfID0gc2NhbiB3IG1heF9pbnQgaWIgaW5cbiAgICBsZXQgeCA9IHRva2VuIGliIGluXG4gICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycylcbiAgfCBMaXRfcGFkZGluZyAoKFJpZ2h0IHwgWmVyb3MpLCB3KSwgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgbGV0IF8gPSBzY2FuIHcgcCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IExpdF9wYWRkaW5nIChMZWZ0LCBfKSwgXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlLVxcXCJcIlxuICB8IExpdF9wYWRkaW5nICgoUmlnaHQgfCBaZXJvcyksIF8pLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUqXFxcIlwiXG4gIHwgQXJnX3BhZGRpbmcgXywgXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlKlxcXCJcIlxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJSpcXFwiXCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICgqIERlZmluaW5nIFtzY2FuZl0gYW5kIHZhcmlvdXMgZmxhdm9ycyBvZiBbc2NhbmZdICopXG5cbmxldCBrc2NhbmZfZ2VuIGliIGVmIGFmIChGb3JtYXQgKGZtdCwgc3RyKSkgPVxuICBsZXQgcmVjIGFwcGx5IDogdHlwZSBhIGIgLiBhIC0+IChhLCBiKSBoZXRlcl9saXN0IC0+IGIgPVxuICAgIGZ1biBmIGFyZ3MgLT4gbWF0Y2ggYXJncyB3aXRoXG4gICAgfCBDb25zICh4LCByKSAtPiBhcHBseSAoZiB4KSByXG4gICAgfCBOaWwgLT4gZlxuICBpblxuICBsZXQgayByZWFkZXJzIGYgPVxuICAgIFNjYW5uaW5nLnJlc2V0X3Rva2VuIGliO1xuICAgIG1hdGNoIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIChTY2FuX2ZhaWx1cmUgXyB8IEZhaWx1cmUgXyB8IEVuZF9vZl9maWxlIGFzIGV4YykgLT5cbiAgICAgICAgZWYgaWIgZXhjXG4gICAgfCBleGNlcHRpb24gSW52YWxpZF9hcmd1bWVudCBtc2cgLT5cbiAgICAgICAgaW52YWxpZF9hcmcgKG1zZyBeIFwiIGluIGZvcm1hdCBcXFwiXCIgXiBTdHJpbmcuZXNjYXBlZCBzdHIgXiBcIlxcXCJcIilcbiAgICB8IGFyZ3MgLT5cbiAgICAgICAgYWYgKGFwcGx5IGYgYXJncylcbiAgaW5cbiAgdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuXG5sZXQga3NjYW5mIGliIGVmIGZtdCA9XG4gIGtzY2FuZl9nZW4gaWIgZWYgKGZ1biB4IC0+IHgpIGZtdFxuXG5sZXQga3NjYW5mX29wdCBpYiBmbXQgPVxuICBrc2NhbmZfZ2VuIGliIChmdW4gXyBfIC0+IE5vbmUpIChmdW4geCAtPiBTb21lIHgpIGZtdFxuXG4oKioqKVxuXG5sZXQga2JzY2FuZiA9IGtzY2FuZlxubGV0IGJzY2FuZiBpYiBmbXQgPSBrYnNjYW5mIGliIHNjYW5mX2JhZF9pbnB1dCBmbXRcbmxldCBic2NhbmZfb3B0IGliIGZtdCA9IGtzY2FuZl9vcHQgaWIgZm10XG5cbmxldCBrc3NjYW5mIHMgZWYgZm10ID0ga2JzY2FuZiAoU2Nhbm5pbmcuZnJvbV9zdHJpbmcgcykgZWYgZm10XG5sZXQgc3NjYW5mIHMgZm10ID0ga2JzY2FuZiAoU2Nhbm5pbmcuZnJvbV9zdHJpbmcgcykgc2NhbmZfYmFkX2lucHV0IGZtdFxubGV0IHNzY2FuZl9vcHQgcyBmbXQgPSBrc2NhbmZfb3B0IChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBmbXRcblxubGV0IHNjYW5mIGZtdCA9IGtzY2FuZiBTY2FubmluZy5zdGRpbiBzY2FuZl9iYWRfaW5wdXQgZm10XG5sZXQgc2NhbmZfb3B0IGZtdCA9IGtzY2FuZl9vcHQgU2Nhbm5pbmcuc3RkaW4gZm10XG5cbigqKiopXG5cbigqIFNjYW5uaW5nIGZvcm1hdCBzdHJpbmdzLiAqKVxubGV0IGJzY2FuZl9mb3JtYXQgOlxuICBTY2FubmluZy5pbl9jaGFubmVsIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gICgoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAnZykgLT4gJ2cgPVxuICBmdW4gaWIgZm9ybWF0IGYgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9zdHJpbmcgbWF4X2ludCBpYiBpblxuICAgIGxldCBzdHIgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgZm10JyA9XG4gICAgICB0cnkgZm9ybWF0X29mX3N0cmluZ19mb3JtYXQgc3RyIGZvcm1hdFxuICAgICAgd2l0aCBGYWlsdXJlIG1zZyAtPiBiYWRfaW5wdXQgbXNnIGluXG4gICAgZiBmbXQnXG5cblxubGV0IHNzY2FuZl9mb3JtYXQgOlxuICBzdHJpbmcgLT4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT5cbiAgKCgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+ICdnKSAtPiAnZyA9XG4gIGZ1biBzIGZvcm1hdCBmIC0+IGJzY2FuZl9mb3JtYXQgKFNjYW5uaW5nLmZyb21fc3RyaW5nIHMpIGZvcm1hdCBmXG5cblxubGV0IGZvcm1hdF9mcm9tX3N0cmluZyBzIGZtdCA9XG4gIHNzY2FuZl9mb3JtYXQgKFwiXFxcIlwiIF4gU3RyaW5nLmVzY2FwZWQgcyBeIFwiXFxcIlwiKSBmbXQgKGZ1biB4IC0+IHgpXG5cblxubGV0IHVuZXNjYXBlZCBzID1cbiAgc3NjYW5mIChcIlxcXCJcIiBeIHMgXiBcIlxcXCJcIikgXCIlUyUhXCIgKGZ1biB4IC0+IHgpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFJlZ2lzdGVyaW5nIE9DYW1sIHZhbHVlcyB3aXRoIHRoZSBDIHJ1bnRpbWUgZm9yIGxhdGVyIGNhbGxiYWNrcyAqKVxuXG5leHRlcm5hbCByZWdpc3Rlcl9uYW1lZF92YWx1ZSA6IHN0cmluZyAtPiBPYmoudCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZVwiXG5cbmxldCByZWdpc3RlciBuYW1lIHYgPVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBuYW1lIChPYmoucmVwciB2KVxuXG5sZXQgcmVnaXN0ZXJfZXhjZXB0aW9uIG5hbWUgKGV4biA6IGV4bikgPVxuICBsZXQgZXhuID0gT2JqLnJlcHIgZXhuIGluXG4gIGxldCBzbG90ID0gaWYgT2JqLnRhZyBleG4gPSBPYmoub2JqZWN0X3RhZyB0aGVuIGV4biBlbHNlIE9iai5maWVsZCBleG4gMCBpblxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBuYW1lIHNsb3RcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgIEplcm9tZSBWb3VpbGxvbiwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBPYmpcblxuKCoqKiogT2JqZWN0IHJlcHJlc2VudGF0aW9uICoqKiopXG5cbmV4dGVybmFsIHNldF9pZDogJ2EgLT4gJ2EgPSBcImNhbWxfc2V0X29vX2lkXCIgW0BAbm9hbGxvY11cblxuKCoqKiogT2JqZWN0IGNvcHkgKioqKilcblxubGV0IGNvcHkgbyA9XG4gIGxldCBvID0gKE9iai5vYmogKE9iai5kdXAgKE9iai5yZXByIG8pKSkgaW5cbiAgc2V0X2lkIG9cblxuKCoqKiogQ29tcHJlc3Npb24gb3B0aW9ucyAqKioqKVxuKCogUGFyYW1ldGVycyAqKVxudHlwZSBwYXJhbXMgPSB7XG4gICAgbXV0YWJsZSBjb21wYWN0X3RhYmxlIDogYm9vbDtcbiAgICBtdXRhYmxlIGNvcHlfcGFyZW50IDogYm9vbDtcbiAgICBtdXRhYmxlIGNsZWFuX3doZW5fY29weWluZyA6IGJvb2w7XG4gICAgbXV0YWJsZSByZXRyeV9jb3VudCA6IGludDtcbiAgICBtdXRhYmxlIGJ1Y2tldF9zbWFsbF9zaXplIDogaW50XG4gIH1cblxubGV0IHBhcmFtcyA9IHtcbiAgY29tcGFjdF90YWJsZSA9IHRydWU7XG4gIGNvcHlfcGFyZW50ID0gdHJ1ZTtcbiAgY2xlYW5fd2hlbl9jb3B5aW5nID0gdHJ1ZTtcbiAgcmV0cnlfY291bnQgPSAzO1xuICBidWNrZXRfc21hbGxfc2l6ZSA9IDE2XG59XG5cbigqKioqIFBhcmFtZXRlcnMgKioqKilcblxubGV0IGluaXRpYWxfb2JqZWN0X3NpemUgPSAyXG5cbigqKioqIEl0ZW1zICoqKiopXG5cbnR5cGUgaXRlbSA9IER1bW15QSB8IER1bW15QiB8IER1bW15QyBvZiBpbnRcbmxldCBfID0gW0R1bW15QTsgRHVtbXlCOyBEdW1teUMgMF0gKCogdG8gYXZvaWQgd2FybmluZ3MgKilcblxubGV0IGR1bW15X2l0ZW0gPSAobWFnaWMgKCkgOiBpdGVtKVxuXG4oKioqKiBUeXBlcyAqKioqKVxuXG50eXBlIHRhZ1xudHlwZSBsYWJlbCA9IGludFxudHlwZSBjbG9zdXJlID0gaXRlbVxudHlwZSB0ID0gRHVtbXlBIHwgRHVtbXlCIHwgRHVtbXlDIG9mIGludFxubGV0IF8gPSBbRHVtbXlBOyBEdW1teUI7IER1bW15QyAwXSAoKiB0byBhdm9pZCB3YXJuaW5ncyAqKVxuXG50eXBlIG9iaiA9IHQgYXJyYXlcbmV4dGVybmFsIHJldCA6IChvYmogLT4gJ2EpIC0+IGNsb3N1cmUgPSBcIiVpZGVudGl0eVwiXG5cbigqKioqIExhYmVscyAqKioqKVxuXG5sZXQgcHVibGljX21ldGhvZF9sYWJlbCBzIDogdGFnID1cbiAgbGV0IGFjY3UgPSByZWYgMCBpblxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzIC0gMSBkb1xuICAgIGFjY3UgOj0gMjIzICogIWFjY3UgKyBDaGFyLmNvZGUgcy5baV1cbiAgZG9uZTtcbiAgKCogcmVkdWNlIHRvIDMxIGJpdHMgKilcbiAgYWNjdSA6PSAhYWNjdSBsYW5kICgxIGxzbCAzMSAtIDEpO1xuICAoKiBtYWtlIGl0IHNpZ25lZCBmb3IgNjQgYml0cyBhcmNoaXRlY3R1cmVzICopXG4gIGxldCB0YWcgPSBpZiAhYWNjdSA+IDB4M0ZGRkZGRkYgdGhlbiAhYWNjdSAtICgxIGxzbCAzMSkgZWxzZSAhYWNjdSBpblxuICAoKiBQcmludGYuZXByaW50ZiBcIiVzID0gJWRcXG5cIiBzIHRhZzsgZmx1c2ggc3RkZXJyOyAqKVxuICBtYWdpYyB0YWdcblxuKCoqKiogU3BhcnNlIGFycmF5ICoqKiopXG5cbm1vZHVsZSBWYXJzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IHN0cmluZyBsZXQgY29tcGFyZSAoeDp0KSB5ID0gY29tcGFyZSB4IHkgZW5kKVxudHlwZSB2YXJzID0gaW50IFZhcnMudFxuXG5tb2R1bGUgTWV0aHMgPVxuICBNYXAuTWFrZShzdHJ1Y3QgdHlwZSB0ID0gc3RyaW5nIGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG50eXBlIG1ldGhzID0gbGFiZWwgTWV0aHMudFxubW9kdWxlIExhYnMgPVxuICBNYXAuTWFrZShzdHJ1Y3QgdHlwZSB0ID0gbGFiZWwgbGV0IGNvbXBhcmUgKHg6dCkgeSA9IGNvbXBhcmUgeCB5IGVuZClcbnR5cGUgbGFicyA9IGJvb2wgTGFicy50XG5cbigqIFRoZSBjb21waWxlciBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGZpZWxkIG9mIHRoaXMgc3RydWN0dXJlIGlzIFtzaXplXS4gKilcbnR5cGUgdGFibGUgPVxuIHsgbXV0YWJsZSBzaXplOiBpbnQ7XG4gICBtdXRhYmxlIG1ldGhvZHM6IGNsb3N1cmUgYXJyYXk7XG4gICBtdXRhYmxlIG1ldGhvZHNfYnlfbmFtZTogbWV0aHM7XG4gICBtdXRhYmxlIG1ldGhvZHNfYnlfbGFiZWw6IGxhYnM7XG4gICBtdXRhYmxlIHByZXZpb3VzX3N0YXRlczpcbiAgICAgKG1ldGhzICogbGFicyAqIChsYWJlbCAqIGl0ZW0pIGxpc3QgKiB2YXJzICpcbiAgICAgIGxhYmVsIGxpc3QgKiBzdHJpbmcgbGlzdCkgbGlzdDtcbiAgIG11dGFibGUgaGlkZGVuX21ldGhzOiAobGFiZWwgKiBpdGVtKSBsaXN0O1xuICAgbXV0YWJsZSB2YXJzOiB2YXJzO1xuICAgbXV0YWJsZSBpbml0aWFsaXplcnM6IChvYmogLT4gdW5pdCkgbGlzdCB9XG5cbmxldCBkdW1teV90YWJsZSA9XG4gIHsgbWV0aG9kcyA9IFt8IGR1bW15X2l0ZW0gfF07XG4gICAgbWV0aG9kc19ieV9uYW1lID0gTWV0aHMuZW1wdHk7XG4gICAgbWV0aG9kc19ieV9sYWJlbCA9IExhYnMuZW1wdHk7XG4gICAgcHJldmlvdXNfc3RhdGVzID0gW107XG4gICAgaGlkZGVuX21ldGhzID0gW107XG4gICAgdmFycyA9IFZhcnMuZW1wdHk7XG4gICAgaW5pdGlhbGl6ZXJzID0gW107XG4gICAgc2l6ZSA9IDAgfVxuXG5sZXQgdGFibGVfY291bnQgPSByZWYgMFxuXG4oKiBkdW1teV9tZXQgc2hvdWxkIGJlIGEgcG9pbnRlciwgc28gdXNlIGFuIGF0b20gKilcbmxldCBkdW1teV9tZXQgOiBpdGVtID0gb2JqIChPYmoubmV3X2Jsb2NrIDAgMClcbigqIGlmIGRlYnVnZ2luZyBpcyBuZWVkZWQsIHRoaXMgY291bGQgYmUgYSBnb29kIGlkZWE6ICopXG4oKiBsZXQgZHVtbXlfbWV0ICgpID0gZmFpbHdpdGggXCJVbmRlZmluZWQgbWV0aG9kXCIgKilcblxubGV0IHJlYyBmaXRfc2l6ZSBuID1cbiAgaWYgbiA8PSAyIHRoZW4gbiBlbHNlXG4gIGZpdF9zaXplICgobisxKS8yKSAqIDJcblxubGV0IG5ld190YWJsZSBwdWJfbGFiZWxzID1cbiAgaW5jciB0YWJsZV9jb3VudDtcbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwdWJfbGFiZWxzIGluXG4gIGxldCBtZXRob2RzID0gQXJyYXkubWFrZSAobGVuKjIrMikgZHVtbXlfbWV0IGluXG4gIG1ldGhvZHMuKDApIDwtIG1hZ2ljIGxlbjtcbiAgbWV0aG9kcy4oMSkgPC0gbWFnaWMgKGZpdF9zaXplIGxlbiAqIFN5cy53b3JkX3NpemUgLyA4IC0gMSk7XG4gIGZvciBpID0gMCB0byBsZW4gLSAxIGRvIG1ldGhvZHMuKGkqMiszKSA8LSBtYWdpYyBwdWJfbGFiZWxzLihpKSBkb25lO1xuICB7IG1ldGhvZHMgPSBtZXRob2RzO1xuICAgIG1ldGhvZHNfYnlfbmFtZSA9IE1ldGhzLmVtcHR5O1xuICAgIG1ldGhvZHNfYnlfbGFiZWwgPSBMYWJzLmVtcHR5O1xuICAgIHByZXZpb3VzX3N0YXRlcyA9IFtdO1xuICAgIGhpZGRlbl9tZXRocyA9IFtdO1xuICAgIHZhcnMgPSBWYXJzLmVtcHR5O1xuICAgIGluaXRpYWxpemVycyA9IFtdO1xuICAgIHNpemUgPSBpbml0aWFsX29iamVjdF9zaXplIH1cblxubGV0IHJlc2l6ZSBhcnJheSBuZXdfc2l6ZSA9XG4gIGxldCBvbGRfc2l6ZSA9IEFycmF5Lmxlbmd0aCBhcnJheS5tZXRob2RzIGluXG4gIGlmIG5ld19zaXplID4gb2xkX3NpemUgdGhlbiBiZWdpblxuICAgIGxldCBuZXdfYnVjayA9IEFycmF5Lm1ha2UgbmV3X3NpemUgZHVtbXlfbWV0IGluXG4gICAgQXJyYXkuYmxpdCBhcnJheS5tZXRob2RzIDAgbmV3X2J1Y2sgMCBvbGRfc2l6ZTtcbiAgICBhcnJheS5tZXRob2RzIDwtIG5ld19idWNrXG4gZW5kXG5cbmxldCBwdXQgYXJyYXkgbGFiZWwgZWxlbWVudCA9XG4gIHJlc2l6ZSBhcnJheSAobGFiZWwgKyAxKTtcbiAgYXJyYXkubWV0aG9kcy4obGFiZWwpIDwtIGVsZW1lbnRcblxuKCoqKiogQ2xhc3NlcyAqKioqKVxuXG5sZXQgbWV0aG9kX2NvdW50ID0gcmVmIDBcbmxldCBpbnN0X3Zhcl9jb3VudCA9IHJlZiAwXG5cbigqIHR5cGUgdCAqKVxudHlwZSBtZXRoID0gaXRlbVxuXG5sZXQgbmV3X21ldGhvZCB0YWJsZSA9XG4gIGxldCBpbmRleCA9IEFycmF5Lmxlbmd0aCB0YWJsZS5tZXRob2RzIGluXG4gIHJlc2l6ZSB0YWJsZSAoaW5kZXggKyAxKTtcbiAgaW5kZXhcblxubGV0IGdldF9tZXRob2RfbGFiZWwgdGFibGUgbmFtZSA9XG4gIHRyeVxuICAgIE1ldGhzLmZpbmQgbmFtZSB0YWJsZS5tZXRob2RzX2J5X25hbWVcbiAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICBsZXQgbGFiZWwgPSBuZXdfbWV0aG9kIHRhYmxlIGluXG4gICAgdGFibGUubWV0aG9kc19ieV9uYW1lIDwtIE1ldGhzLmFkZCBuYW1lIGxhYmVsIHRhYmxlLm1ldGhvZHNfYnlfbmFtZTtcbiAgICB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIDwtIExhYnMuYWRkIGxhYmVsIHRydWUgdGFibGUubWV0aG9kc19ieV9sYWJlbDtcbiAgICBsYWJlbFxuXG5sZXQgZ2V0X21ldGhvZF9sYWJlbHMgdGFibGUgbmFtZXMgPVxuICBBcnJheS5tYXAgKGdldF9tZXRob2RfbGFiZWwgdGFibGUpIG5hbWVzXG5cbmxldCBzZXRfbWV0aG9kIHRhYmxlIGxhYmVsIGVsZW1lbnQgPVxuICBpbmNyIG1ldGhvZF9jb3VudDtcbiAgaWYgTGFicy5maW5kIGxhYmVsIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgdGhlblxuICAgIHB1dCB0YWJsZSBsYWJlbCBlbGVtZW50XG4gIGVsc2VcbiAgICB0YWJsZS5oaWRkZW5fbWV0aHMgPC0gKGxhYmVsLCBlbGVtZW50KSA6OiB0YWJsZS5oaWRkZW5fbWV0aHNcblxubGV0IGdldF9tZXRob2QgdGFibGUgbGFiZWwgPVxuICB0cnkgTGlzdC5hc3NvYyBsYWJlbCB0YWJsZS5oaWRkZW5fbWV0aHNcbiAgd2l0aCBOb3RfZm91bmQgLT4gdGFibGUubWV0aG9kcy4obGFiZWwpXG5cbmxldCB0b19saXN0IGFyciA9XG4gIGlmIGFyciA9PSBtYWdpYyAwIHRoZW4gW10gZWxzZSBBcnJheS50b19saXN0IGFyclxuXG5sZXQgbmFycm93IHRhYmxlIHZhcnMgdmlydF9tZXRocyBjb25jcl9tZXRocyA9XG4gIGxldCB2YXJzID0gdG9fbGlzdCB2YXJzXG4gIGFuZCB2aXJ0X21ldGhzID0gdG9fbGlzdCB2aXJ0X21ldGhzXG4gIGFuZCBjb25jcl9tZXRocyA9IHRvX2xpc3QgY29uY3JfbWV0aHMgaW5cbiAgbGV0IHZpcnRfbWV0aF9sYWJzID0gTGlzdC5tYXAgKGdldF9tZXRob2RfbGFiZWwgdGFibGUpIHZpcnRfbWV0aHMgaW5cbiAgbGV0IGNvbmNyX21ldGhfbGFicyA9IExpc3QubWFwIChnZXRfbWV0aG9kX2xhYmVsIHRhYmxlKSBjb25jcl9tZXRocyBpblxuICB0YWJsZS5wcmV2aW91c19zdGF0ZXMgPC1cbiAgICAgKHRhYmxlLm1ldGhvZHNfYnlfbmFtZSwgdGFibGUubWV0aG9kc19ieV9sYWJlbCwgdGFibGUuaGlkZGVuX21ldGhzLFxuICAgICAgdGFibGUudmFycywgdmlydF9tZXRoX2xhYnMsIHZhcnMpXG4gICAgIDo6IHRhYmxlLnByZXZpb3VzX3N0YXRlcztcbiAgdGFibGUudmFycyA8LVxuICAgIFZhcnMuZm9sZFxuICAgICAgKGZ1biBsYWIgaW5mbyB0dmFycyAtPlxuICAgICAgICBpZiBMaXN0Lm1lbSBsYWIgdmFycyB0aGVuIFZhcnMuYWRkIGxhYiBpbmZvIHR2YXJzIGVsc2UgdHZhcnMpXG4gICAgICB0YWJsZS52YXJzIFZhcnMuZW1wdHk7XG4gIGxldCBieV9uYW1lID0gcmVmIE1ldGhzLmVtcHR5IGluXG4gIGxldCBieV9sYWJlbCA9IHJlZiBMYWJzLmVtcHR5IGluXG4gIExpc3QuaXRlcjJcbiAgICAoZnVuIG1ldCBsYWJlbCAtPlxuICAgICAgIGJ5X25hbWUgOj0gTWV0aHMuYWRkIG1ldCBsYWJlbCAhYnlfbmFtZTtcbiAgICAgICBieV9sYWJlbCA6PVxuICAgICAgICAgIExhYnMuYWRkIGxhYmVsXG4gICAgICAgICAgICAodHJ5IExhYnMuZmluZCBsYWJlbCB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIHdpdGggTm90X2ZvdW5kIC0+IHRydWUpXG4gICAgICAgICAgICAhYnlfbGFiZWwpXG4gICAgY29uY3JfbWV0aHMgY29uY3JfbWV0aF9sYWJzO1xuICBMaXN0Lml0ZXIyXG4gICAgKGZ1biBtZXQgbGFiZWwgLT5cbiAgICAgICBieV9uYW1lIDo9IE1ldGhzLmFkZCBtZXQgbGFiZWwgIWJ5X25hbWU7XG4gICAgICAgYnlfbGFiZWwgOj0gTGFicy5hZGQgbGFiZWwgZmFsc2UgIWJ5X2xhYmVsKVxuICAgIHZpcnRfbWV0aHMgdmlydF9tZXRoX2xhYnM7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSA8LSAhYnlfbmFtZTtcbiAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSAhYnlfbGFiZWw7XG4gIHRhYmxlLmhpZGRlbl9tZXRocyA8LVxuICAgICBMaXN0LmZvbGRfcmlnaHRcbiAgICAgICAoZnVuICgobGFiLCBfKSBhcyBtZXQpIGhtIC0+XG4gICAgICAgICAgaWYgTGlzdC5tZW0gbGFiIHZpcnRfbWV0aF9sYWJzIHRoZW4gaG0gZWxzZSBtZXQ6OmhtKVxuICAgICAgIHRhYmxlLmhpZGRlbl9tZXRoc1xuICAgICAgIFtdXG5cbmxldCB3aWRlbiB0YWJsZSA9XG4gIGxldCAoYnlfbmFtZSwgYnlfbGFiZWwsIHNhdmVkX2hpZGRlbl9tZXRocywgc2F2ZWRfdmFycywgdmlydF9tZXRocywgdmFycykgPVxuICAgIExpc3QuaGQgdGFibGUucHJldmlvdXNfc3RhdGVzXG4gIGluXG4gIHRhYmxlLnByZXZpb3VzX3N0YXRlcyA8LSBMaXN0LnRsIHRhYmxlLnByZXZpb3VzX3N0YXRlcztcbiAgdGFibGUudmFycyA8LVxuICAgICBMaXN0LmZvbGRfbGVmdFxuICAgICAgIChmdW4gcyB2IC0+IFZhcnMuYWRkIHYgKFZhcnMuZmluZCB2IHRhYmxlLnZhcnMpIHMpXG4gICAgICAgc2F2ZWRfdmFycyB2YXJzO1xuICB0YWJsZS5tZXRob2RzX2J5X25hbWUgPC0gYnlfbmFtZTtcbiAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSBieV9sYWJlbDtcbiAgdGFibGUuaGlkZGVuX21ldGhzIDwtXG4gICAgIExpc3QuZm9sZF9yaWdodFxuICAgICAgIChmdW4gKChsYWIsIF8pIGFzIG1ldCkgaG0gLT5cbiAgICAgICAgICBpZiBMaXN0Lm1lbSBsYWIgdmlydF9tZXRocyB0aGVuIGhtIGVsc2UgbWV0OjpobSlcbiAgICAgICB0YWJsZS5oaWRkZW5fbWV0aHNcbiAgICAgICBzYXZlZF9oaWRkZW5fbWV0aHNcblxubGV0IG5ld19zbG90IHRhYmxlID1cbiAgbGV0IGluZGV4ID0gdGFibGUuc2l6ZSBpblxuICB0YWJsZS5zaXplIDwtIGluZGV4ICsgMTtcbiAgaW5kZXhcblxubGV0IG5ld192YXJpYWJsZSB0YWJsZSBuYW1lID1cbiAgdHJ5IFZhcnMuZmluZCBuYW1lIHRhYmxlLnZhcnNcbiAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICBsZXQgaW5kZXggPSBuZXdfc2xvdCB0YWJsZSBpblxuICAgIGlmIG5hbWUgPD4gXCJcIiB0aGVuIHRhYmxlLnZhcnMgPC0gVmFycy5hZGQgbmFtZSBpbmRleCB0YWJsZS52YXJzO1xuICAgIGluZGV4XG5cbmxldCB0b19hcnJheSBhcnIgPVxuICBpZiBhcnIgPSBPYmoubWFnaWMgMCB0aGVuIFt8fF0gZWxzZSBhcnJcblxubGV0IG5ld19tZXRob2RzX3ZhcmlhYmxlcyB0YWJsZSBtZXRocyB2YWxzID1cbiAgbGV0IG1ldGhzID0gdG9fYXJyYXkgbWV0aHMgaW5cbiAgbGV0IG5tZXRocyA9IEFycmF5Lmxlbmd0aCBtZXRocyBhbmQgbnZhbHMgPSBBcnJheS5sZW5ndGggdmFscyBpblxuICBsZXQgcmVzID0gQXJyYXkubWFrZSAobm1ldGhzICsgbnZhbHMpIDAgaW5cbiAgZm9yIGkgPSAwIHRvIG5tZXRocyAtIDEgZG9cbiAgICByZXMuKGkpIDwtIGdldF9tZXRob2RfbGFiZWwgdGFibGUgbWV0aHMuKGkpXG4gIGRvbmU7XG4gIGZvciBpID0gMCB0byBudmFscyAtIDEgZG9cbiAgICByZXMuKGkrbm1ldGhzKSA8LSBuZXdfdmFyaWFibGUgdGFibGUgdmFscy4oaSlcbiAgZG9uZTtcbiAgcmVzXG5cbmxldCBnZXRfdmFyaWFibGUgdGFibGUgbmFtZSA9XG4gIHRyeSBWYXJzLmZpbmQgbmFtZSB0YWJsZS52YXJzIHdpdGggTm90X2ZvdW5kIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgZ2V0X3ZhcmlhYmxlcyB0YWJsZSBuYW1lcyA9XG4gIEFycmF5Lm1hcCAoZ2V0X3ZhcmlhYmxlIHRhYmxlKSBuYW1lc1xuXG5sZXQgYWRkX2luaXRpYWxpemVyIHRhYmxlIGYgPVxuICB0YWJsZS5pbml0aWFsaXplcnMgPC0gZjo6dGFibGUuaW5pdGlhbGl6ZXJzXG5cbigqXG5tb2R1bGUgS2V5cyA9XG4gIE1hcC5NYWtlKHN0cnVjdCB0eXBlIHQgPSB0YWcgYXJyYXkgbGV0IGNvbXBhcmUgKHg6dCkgeSA9IGNvbXBhcmUgeCB5IGVuZClcbmxldCBrZXlfbWFwID0gcmVmIEtleXMuZW1wdHlcbmxldCBnZXRfa2V5IHRhZ3MgOiBpdGVtID1cbiAgdHJ5IG1hZ2ljIChLZXlzLmZpbmQgdGFncyAha2V5X21hcCA6IHRhZyBhcnJheSlcbiAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICBrZXlfbWFwIDo9IEtleXMuYWRkIHRhZ3MgdGFncyAha2V5X21hcDtcbiAgICBtYWdpYyB0YWdzXG4qKVxuXG5sZXQgY3JlYXRlX3RhYmxlIHB1YmxpY19tZXRob2RzID1cbiAgaWYgcHVibGljX21ldGhvZHMgPT0gbWFnaWMgMCB0aGVuIG5ld190YWJsZSBbfHxdIGVsc2VcbiAgKCogW3B1YmxpY19tZXRob2RzXSBtdXN0IGJlIGluIGFzY2VuZGluZyBvcmRlciBmb3IgYnl0ZWNvZGUgKilcbiAgbGV0IHRhZ3MgPSBBcnJheS5tYXAgcHVibGljX21ldGhvZF9sYWJlbCBwdWJsaWNfbWV0aG9kcyBpblxuICBsZXQgdGFibGUgPSBuZXdfdGFibGUgdGFncyBpblxuICBBcnJheS5pdGVyaVxuICAgIChmdW4gaSBtZXQgLT5cbiAgICAgIGxldCBsYWIgPSBpKjIrMiBpblxuICAgICAgdGFibGUubWV0aG9kc19ieV9uYW1lICA8LSBNZXRocy5hZGQgbWV0IGxhYiB0YWJsZS5tZXRob2RzX2J5X25hbWU7XG4gICAgICB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIDwtIExhYnMuYWRkIGxhYiB0cnVlIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwpXG4gICAgcHVibGljX21ldGhvZHM7XG4gIHRhYmxlXG5cbmxldCBpbml0X2NsYXNzIHRhYmxlID1cbiAgaW5zdF92YXJfY291bnQgOj0gIWluc3RfdmFyX2NvdW50ICsgdGFibGUuc2l6ZSAtIDE7XG4gIHRhYmxlLmluaXRpYWxpemVycyA8LSBMaXN0LnJldiB0YWJsZS5pbml0aWFsaXplcnM7XG4gIHJlc2l6ZSB0YWJsZSAoMyArIG1hZ2ljIHRhYmxlLm1ldGhvZHMuKDEpICogMTYgLyBTeXMud29yZF9zaXplKVxuXG5sZXQgaW5oZXJpdHMgY2xhIHZhbHMgdmlydF9tZXRocyBjb25jcl9tZXRocyAoXywgc3VwZXIsIF8sIGVudikgdG9wID1cbiAgbmFycm93IGNsYSB2YWxzIHZpcnRfbWV0aHMgY29uY3JfbWV0aHM7XG4gIGxldCBpbml0ID1cbiAgICBpZiB0b3AgdGhlbiBzdXBlciBjbGEgZW52IGVsc2UgT2JqLnJlcHIgKHN1cGVyIGNsYSkgaW5cbiAgd2lkZW4gY2xhO1xuICBBcnJheS5jb25jYXRcbiAgICBbW3wgcmVwciBpbml0IHxdO1xuICAgICBtYWdpYyAoQXJyYXkubWFwIChnZXRfdmFyaWFibGUgY2xhKSAodG9fYXJyYXkgdmFscykgOiBpbnQgYXJyYXkpO1xuICAgICBBcnJheS5tYXBcbiAgICAgICAoZnVuIG5tIC0+IHJlcHIgKGdldF9tZXRob2QgY2xhIChnZXRfbWV0aG9kX2xhYmVsIGNsYSBubSkgOiBjbG9zdXJlKSlcbiAgICAgICAodG9fYXJyYXkgY29uY3JfbWV0aHMpIF1cblxubGV0IG1ha2VfY2xhc3MgcHViX21ldGhzIGNsYXNzX2luaXQgPVxuICBsZXQgdGFibGUgPSBjcmVhdGVfdGFibGUgcHViX21ldGhzIGluXG4gIGxldCBlbnZfaW5pdCA9IGNsYXNzX2luaXQgdGFibGUgaW5cbiAgaW5pdF9jbGFzcyB0YWJsZTtcbiAgKGVudl9pbml0IChPYmoucmVwciAwKSwgY2xhc3NfaW5pdCwgZW52X2luaXQsIE9iai5yZXByIDApXG5cbnR5cGUgaW5pdF90YWJsZSA9IHsgbXV0YWJsZSBlbnZfaW5pdDogdDsgbXV0YWJsZSBjbGFzc19pbml0OiB0YWJsZSAtPiB0IH1cbltAQHdhcm5pbmcgXCItdW51c2VkLWZpZWxkXCJdXG5cbmxldCBtYWtlX2NsYXNzX3N0b3JlIHB1Yl9tZXRocyBjbGFzc19pbml0IGluaXRfdGFibGUgPVxuICBsZXQgdGFibGUgPSBjcmVhdGVfdGFibGUgcHViX21ldGhzIGluXG4gIGxldCBlbnZfaW5pdCA9IGNsYXNzX2luaXQgdGFibGUgaW5cbiAgaW5pdF9jbGFzcyB0YWJsZTtcbiAgaW5pdF90YWJsZS5jbGFzc19pbml0IDwtIGNsYXNzX2luaXQ7XG4gIGluaXRfdGFibGUuZW52X2luaXQgPC0gZW52X2luaXRcblxubGV0IGR1bW15X2NsYXNzIGxvYyA9XG4gIGxldCB1bmRlZiA9IGZ1biBfIC0+IHJhaXNlIChVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSBsb2MpIGluXG4gIChPYmoubWFnaWMgdW5kZWYsIHVuZGVmLCB1bmRlZiwgT2JqLnJlcHIgMClcblxuKCoqKiogT2JqZWN0cyAqKioqKVxuXG5sZXQgY3JlYXRlX29iamVjdCB0YWJsZSA9XG4gICgqIFhYWCBBcHBlbCBkZSBbb2JqX2Jsb2NrXSB8IENhbGwgdG8gW29ial9ibG9ja10gICopXG4gIGxldCBvYmogPSBPYmoubmV3X2Jsb2NrIE9iai5vYmplY3RfdGFnIHRhYmxlLnNpemUgaW5cbiAgKCogWFhYIEFwcGVsIGRlIFtjYW1sX21vZGlmeV0gfCBDYWxsIHRvIFtjYW1sX21vZGlmeV0gKilcbiAgT2JqLnNldF9maWVsZCBvYmogMCAoT2JqLnJlcHIgdGFibGUubWV0aG9kcyk7XG4gIE9iai5vYmogKHNldF9pZCBvYmopXG5cbmxldCBjcmVhdGVfb2JqZWN0X29wdCBvYmpfMCB0YWJsZSA9XG4gIGlmIChPYmoubWFnaWMgb2JqXzAgOiBib29sKSB0aGVuIG9ial8wIGVsc2UgYmVnaW5cbiAgICAoKiBYWFggQXBwZWwgZGUgW29ial9ibG9ja10gfCBDYWxsIHRvIFtvYmpfYmxvY2tdICAqKVxuICAgIGxldCBvYmogPSBPYmoubmV3X2Jsb2NrIE9iai5vYmplY3RfdGFnIHRhYmxlLnNpemUgaW5cbiAgICAoKiBYWFggQXBwZWwgZGUgW2NhbWxfbW9kaWZ5XSB8IENhbGwgdG8gW2NhbWxfbW9kaWZ5XSAqKVxuICAgIE9iai5zZXRfZmllbGQgb2JqIDAgKE9iai5yZXByIHRhYmxlLm1ldGhvZHMpO1xuICAgIE9iai5vYmogKHNldF9pZCBvYmopXG4gIGVuZFxuXG5sZXQgcmVjIGl0ZXJfZiBvYmogPVxuICBmdW5jdGlvblxuICAgIFtdICAgLT4gKClcbiAgfCBmOjpsIC0+IGYgb2JqOyBpdGVyX2Ygb2JqIGxcblxubGV0IHJ1bl9pbml0aWFsaXplcnMgb2JqIHRhYmxlID1cbiAgbGV0IGluaXRzID0gdGFibGUuaW5pdGlhbGl6ZXJzIGluXG4gIGlmIGluaXRzIDw+IFtdIHRoZW5cbiAgICBpdGVyX2Ygb2JqIGluaXRzXG5cbmxldCBydW5faW5pdGlhbGl6ZXJzX29wdCBvYmpfMCBvYmogdGFibGUgPVxuICBpZiAoT2JqLm1hZ2ljIG9ial8wIDogYm9vbCkgdGhlbiBvYmogZWxzZSBiZWdpblxuICAgIGxldCBpbml0cyA9IHRhYmxlLmluaXRpYWxpemVycyBpblxuICAgIGlmIGluaXRzIDw+IFtdIHRoZW4gaXRlcl9mIG9iaiBpbml0cztcbiAgICBvYmpcbiAgZW5kXG5cbmxldCBjcmVhdGVfb2JqZWN0X2FuZF9ydW5faW5pdGlhbGl6ZXJzIG9ial8wIHRhYmxlID1cbiAgaWYgKE9iai5tYWdpYyBvYmpfMCA6IGJvb2wpIHRoZW4gb2JqXzAgZWxzZSBiZWdpblxuICAgIGxldCBvYmogPSBjcmVhdGVfb2JqZWN0IHRhYmxlIGluXG4gICAgcnVuX2luaXRpYWxpemVycyBvYmogdGFibGU7XG4gICAgb2JqXG4gIGVuZFxuXG4oKiBFcXVpdmFsZW50IHByaW1pdGl2ZSBiZWxvd1xubGV0IHNlbmRzZWxmIG9iaiBsYWIgPVxuICAobWFnaWMgb2JqIDogKG9iaiAtPiB0KSBhcnJheSBhcnJheSkuKDApLihsYWIpIG9ialxuKilcbmV4dGVybmFsIHNlbmQgOiBvYmogLT4gdGFnIC0+ICdhID0gXCIlc2VuZFwiXG5leHRlcm5hbCBzZW5kY2FjaGUgOiBvYmogLT4gdGFnIC0+IHQgLT4gaW50IC0+ICdhID0gXCIlc2VuZGNhY2hlXCJcbmV4dGVybmFsIHNlbmRzZWxmIDogb2JqIC0+IGxhYmVsIC0+ICdhID0gXCIlc2VuZHNlbGZcIlxuZXh0ZXJuYWwgZ2V0X3B1YmxpY19tZXRob2QgOiBvYmogLT4gdGFnIC0+IGNsb3N1cmVcbiAgICA9IFwiY2FtbF9nZXRfcHVibGljX21ldGhvZFwiIFtAQG5vYWxsb2NdXG5cbigqKioqIHRhYmxlIGNvbGxlY3Rpb24gYWNjZXNzICoqKiopXG5cbnR5cGUgdGFibGVzID1cbiAgfCBFbXB0eVxuICB8IENvbnMgb2Yge2tleSA6IGNsb3N1cmU7IG11dGFibGUgZGF0YTogdGFibGVzOyBtdXRhYmxlIG5leHQ6IHRhYmxlc31cblxubGV0IHNldF9kYXRhIHRhYmxlcyB2ID0gbWF0Y2ggdGFibGVzIHdpdGhcbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMuZGF0YSA8LSB2XG5sZXQgc2V0X25leHQgdGFibGVzIHYgPSBtYXRjaCB0YWJsZXMgd2l0aFxuICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICB8IENvbnMgdGFibGVzIC0+IHRhYmxlcy5uZXh0IDwtIHZcbmxldCBnZXRfa2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMua2V5XG5sZXQgZ2V0X2RhdGEgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICB8IENvbnMgdGFibGVzIC0+IHRhYmxlcy5kYXRhXG5sZXQgZ2V0X25leHQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICB8IENvbnMgdGFibGVzIC0+IHRhYmxlcy5uZXh0XG5cbmxldCBidWlsZF9wYXRoIG4ga2V5cyB0YWJsZXMgPVxuICBsZXQgcmVzID0gQ29ucyB7a2V5ID0gT2JqLm1hZ2ljIDA7IGRhdGEgPSBFbXB0eTsgbmV4dCA9IEVtcHR5fSBpblxuICBsZXQgciA9IHJlZiByZXMgaW5cbiAgZm9yIGkgPSAwIHRvIG4gZG9cbiAgICByIDo9IENvbnMge2tleSA9IGtleXMuKGkpOyBkYXRhID0gIXI7IG5leHQgPSBFbXB0eX1cbiAgZG9uZTtcbiAgc2V0X2RhdGEgdGFibGVzICFyO1xuICByZXNcblxubGV0IHJlYyBsb29rdXBfa2V5cyBpIGtleXMgdGFibGVzID1cbiAgaWYgaSA8IDAgdGhlbiB0YWJsZXMgZWxzZVxuICBsZXQga2V5ID0ga2V5cy4oaSkgaW5cbiAgbGV0IHJlYyBsb29rdXBfa2V5ICh0YWJsZXM6dGFibGVzKSA9XG4gICAgaWYgZ2V0X2tleSB0YWJsZXMgPT0ga2V5IHRoZW5cbiAgICAgIG1hdGNoIGdldF9kYXRhIHRhYmxlcyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBDb25zIF8gYXMgdGFibGVzX2RhdGEgLT5cbiAgICAgICAgICBsb29rdXBfa2V5cyAoaS0xKSBrZXlzIHRhYmxlc19kYXRhXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZ2V0X25leHQgdGFibGVzIHdpdGhcbiAgICAgIHwgQ29ucyBfIGFzIG5leHQgLT4gbG9va3VwX2tleSBuZXh0XG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgbGV0IG5leHQgOiB0YWJsZXMgPSBDb25zIHtrZXk7IGRhdGEgPSBFbXB0eTsgbmV4dCA9IEVtcHR5fSBpblxuICAgICAgICAgIHNldF9uZXh0IHRhYmxlcyBuZXh0O1xuICAgICAgICAgIGJ1aWxkX3BhdGggKGktMSkga2V5cyBuZXh0XG4gIGluXG4gIGxvb2t1cF9rZXkgdGFibGVzXG5cbmxldCBsb29rdXBfdGFibGVzIHJvb3Qga2V5cyA9XG4gIG1hdGNoIGdldF9kYXRhIHJvb3Qgd2l0aFxuICB8IENvbnMgXyBhcyByb290X2RhdGEgLT5cbiAgICBsb29rdXBfa2V5cyAoQXJyYXkubGVuZ3RoIGtleXMgLSAxKSBrZXlzIHJvb3RfZGF0YVxuICB8IEVtcHR5IC0+XG4gICAgYnVpbGRfcGF0aCAoQXJyYXkubGVuZ3RoIGtleXMgLSAxKSBrZXlzIHJvb3RcblxuKCoqKiogYnVpbHRpbiBtZXRob2RzICoqKiopXG5cbmxldCBnZXRfY29uc3QgeCA9IHJldCAoZnVuIF9vYmogLT4geClcbmxldCBnZXRfdmFyIG4gICA9IHJldCAoZnVuIG9iaiAtPiBBcnJheS51bnNhZmVfZ2V0IG9iaiBuKVxubGV0IGdldF9lbnYgZSBuID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbilcbmxldCBnZXRfbWV0aCBuICA9IHJldCAoZnVuIG9iaiAtPiBzZW5kc2VsZiBvYmogbilcbmxldCBzZXRfdmFyIG4gICA9IHJldCAoZnVuIG9iaiB4IC0+IEFycmF5LnVuc2FmZV9zZXQgb2JqIG4geClcbmxldCBhcHBfY29uc3QgZiB4ID0gcmV0IChmdW4gX29iaiAtPiBmIHgpXG5sZXQgYXBwX3ZhciBmIG4gICA9IHJldCAoZnVuIG9iaiAtPiBmIChBcnJheS51bnNhZmVfZ2V0IG9iaiBuKSlcbmxldCBhcHBfZW52IGYgZSBuID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgZiAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikpXG5sZXQgYXBwX21ldGggZiBuICA9IHJldCAoZnVuIG9iaiAtPiBmIChzZW5kc2VsZiBvYmogbikpXG5sZXQgYXBwX2NvbnN0X2NvbnN0IGYgeCB5ID0gcmV0IChmdW4gX29iaiAtPiBmIHggeSlcbmxldCBhcHBfY29uc3RfdmFyIGYgeCBuICAgPSByZXQgKGZ1biBvYmogLT4gZiB4IChBcnJheS51bnNhZmVfZ2V0IG9iaiBuKSlcbmxldCBhcHBfY29uc3RfbWV0aCBmIHggbiA9IHJldCAoZnVuIG9iaiAtPiBmIHggKHNlbmRzZWxmIG9iaiBuKSlcbmxldCBhcHBfdmFyX2NvbnN0IGYgbiB4ID0gcmV0IChmdW4gb2JqIC0+IGYgKEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pIHgpXG5sZXQgYXBwX21ldGhfY29uc3QgZiBuIHggPSByZXQgKGZ1biBvYmogLT4gZiAoc2VuZHNlbGYgb2JqIG4pIHgpXG5sZXQgYXBwX2NvbnN0X2VudiBmIHggZSBuID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgZiB4IChBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKSlcbmxldCBhcHBfZW52X2NvbnN0IGYgZSBuIHggPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBmIChBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKSB4KVxubGV0IG1ldGhfYXBwX2NvbnN0IG4geCA9IHJldCAoZnVuIG9iaiAtPiAoc2VuZHNlbGYgb2JqIG4gOiBfIC0+IF8pIHgpXG5sZXQgbWV0aF9hcHBfdmFyIG4gbSA9XG4gIHJldCAoZnVuIG9iaiAtPiAoc2VuZHNlbGYgb2JqIG4gOiBfIC0+IF8pIChBcnJheS51bnNhZmVfZ2V0IG9iaiBtKSlcbmxldCBtZXRoX2FwcF9lbnYgbiBlIG0gPVxuICByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKVxuICAgICAgKEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG0pKVxubGV0IG1ldGhfYXBwX21ldGggbiBtID1cbiAgcmV0IChmdW4gb2JqIC0+IChzZW5kc2VsZiBvYmogbiA6IF8gLT4gXykgKHNlbmRzZWxmIG9iaiBtKSlcbmxldCBzZW5kX2NvbnN0IG0geCBjID1cbiAgcmV0IChmdW4gb2JqIC0+IHNlbmRjYWNoZSB4IG0gKEFycmF5LnVuc2FmZV9nZXQgb2JqIDApIGMpXG5sZXQgc2VuZF92YXIgbSBuIGMgPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBzZW5kY2FjaGUgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogbikgOiBvYmopIG1cbiAgICAgIChBcnJheS51bnNhZmVfZ2V0IG9iaiAwKSBjKVxubGV0IHNlbmRfZW52IG0gZSBuIGMgPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBzZW5kY2FjaGVcbiAgICAgIChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXRcbiAgICAgICAgICAgICAgICAgICAgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pIDogb2JqKVxuICAgICAgbSAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBzZW5kX21ldGggbSBuIGMgPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBzZW5kY2FjaGUgKHNlbmRzZWxmIG9iaiBuKSBtIChBcnJheS51bnNhZmVfZ2V0IG9iaiAwKSBjKVxubGV0IG5ld19jYWNoZSB0YWJsZSA9XG4gIGxldCBuID0gbmV3X21ldGhvZCB0YWJsZSBpblxuICBsZXQgbiA9XG4gICAgaWYgbiBtb2QgMiA9IDAgfHwgbiA+IDIgKyBtYWdpYyB0YWJsZS5tZXRob2RzLigxKSAqIDE2IC8gU3lzLndvcmRfc2l6ZVxuICAgIHRoZW4gbiBlbHNlIG5ld19tZXRob2QgdGFibGVcbiAgaW5cbiAgdGFibGUubWV0aG9kcy4obikgPC0gT2JqLm1hZ2ljIDA7XG4gIG5cblxudHlwZSBpbXBsID1cbiAgICBHZXRDb25zdFxuICB8IEdldFZhclxuICB8IEdldEVudlxuICB8IEdldE1ldGhcbiAgfCBTZXRWYXJcbiAgfCBBcHBDb25zdFxuICB8IEFwcFZhclxuICB8IEFwcEVudlxuICB8IEFwcE1ldGhcbiAgfCBBcHBDb25zdENvbnN0XG4gIHwgQXBwQ29uc3RWYXJcbiAgfCBBcHBDb25zdEVudlxuICB8IEFwcENvbnN0TWV0aFxuICB8IEFwcFZhckNvbnN0XG4gIHwgQXBwRW52Q29uc3RcbiAgfCBBcHBNZXRoQ29uc3RcbiAgfCBNZXRoQXBwQ29uc3RcbiAgfCBNZXRoQXBwVmFyXG4gIHwgTWV0aEFwcEVudlxuICB8IE1ldGhBcHBNZXRoXG4gIHwgU2VuZENvbnN0XG4gIHwgU2VuZFZhclxuICB8IFNlbmRFbnZcbiAgfCBTZW5kTWV0aFxuICB8IENsb3N1cmUgb2YgY2xvc3VyZVxuXG5sZXQgbWV0aG9kX2ltcGwgdGFibGUgaSBhcnIgPVxuICBsZXQgbmV4dCAoKSA9IGluY3IgaTsgbWFnaWMgYXJyLighaSkgaW5cbiAgbWF0Y2ggbmV4dCgpIHdpdGhcbiAgICBHZXRDb25zdCAtPiBsZXQgeCA6IHQgPSBuZXh0KCkgaW4gZ2V0X2NvbnN0IHhcbiAgfCBHZXRWYXIgICAtPiBsZXQgbiA9IG5leHQoKSBpbiBnZXRfdmFyIG5cbiAgfCBHZXRFbnYgICAtPiBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBnZXRfZW52IGUgblxuICB8IEdldE1ldGggIC0+IGxldCBuID0gbmV4dCgpIGluIGdldF9tZXRoIG5cbiAgfCBTZXRWYXIgICAtPiBsZXQgbiA9IG5leHQoKSBpbiBzZXRfdmFyIG5cbiAgfCBBcHBDb25zdCAtPiBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBhcHBfY29uc3QgZiB4XG4gIHwgQXBwVmFyICAgLT4gbGV0IGYgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0ICgpIGluIGFwcF92YXIgZiBuXG4gIHwgQXBwRW52ICAgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluICBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgYXBwX2VudiBmIGUgblxuICB8IEFwcE1ldGggIC0+IGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBhcHBfbWV0aCBmIG5cbiAgfCBBcHBDb25zdENvbnN0IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgeSA9IG5leHQoKSBpblxuICAgICAgYXBwX2NvbnN0X2NvbnN0IGYgeCB5XG4gIHwgQXBwQ29uc3RWYXIgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluXG4gICAgICBhcHBfY29uc3RfdmFyIGYgeCBuXG4gIHwgQXBwQ29uc3RFbnYgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIGxldCBlID0gbmV4dCAoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgYXBwX2NvbnN0X2VudiBmIHggZSBuXG4gIHwgQXBwQ29uc3RNZXRoIC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgYXBwX2NvbnN0X21ldGggZiB4IG5cbiAgfCBBcHBWYXJDb25zdCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW5cbiAgICAgIGFwcF92YXJfY29uc3QgZiBuIHhcbiAgfCBBcHBFbnZDb25zdCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IGUgPSBuZXh0ICgpIGluIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluXG4gICAgICBhcHBfZW52X2NvbnN0IGYgZSBuIHhcbiAgfCBBcHBNZXRoQ29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluXG4gICAgICBhcHBfbWV0aF9jb25zdCBmIG4geFxuICB8IE1ldGhBcHBDb25zdCAtPlxuICAgICAgbGV0IG4gPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbWV0aF9hcHBfY29uc3QgbiB4XG4gIHwgTWV0aEFwcFZhciAtPlxuICAgICAgbGV0IG4gPSBuZXh0KCkgaW4gbGV0IG0gPSBuZXh0KCkgaW4gbWV0aF9hcHBfdmFyIG4gbVxuICB8IE1ldGhBcHBFbnYgLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCBlID0gbmV4dCgpIGluIGxldCBtID0gbmV4dCgpIGluXG4gICAgICBtZXRoX2FwcF9lbnYgbiBlIG1cbiAgfCBNZXRoQXBwTWV0aCAtPlxuICAgICAgbGV0IG4gPSBuZXh0KCkgaW4gbGV0IG0gPSBuZXh0KCkgaW4gbWV0aF9hcHBfbWV0aCBuIG1cbiAgfCBTZW5kQ29uc3QgLT5cbiAgICAgIGxldCBtID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIHNlbmRfY29uc3QgbSB4IChuZXdfY2FjaGUgdGFibGUpXG4gIHwgU2VuZFZhciAtPlxuICAgICAgbGV0IG0gPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0ICgpIGluIHNlbmRfdmFyIG0gbiAobmV3X2NhY2hlIHRhYmxlKVxuICB8IFNlbmRFbnYgLT5cbiAgICAgIGxldCBtID0gbmV4dCgpIGluIGxldCBlID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluXG4gICAgICBzZW5kX2VudiBtIGUgbiAobmV3X2NhY2hlIHRhYmxlKVxuICB8IFNlbmRNZXRoIC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQgKCkgaW4gc2VuZF9tZXRoIG0gbiAobmV3X2NhY2hlIHRhYmxlKVxuICB8IENsb3N1cmUgXyBhcyBjbG8gLT4gbWFnaWMgY2xvXG5cbmxldCBzZXRfbWV0aG9kcyB0YWJsZSBtZXRob2RzID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBtZXRob2RzIGluIGxldCBpID0gcmVmIDAgaW5cbiAgd2hpbGUgIWkgPCBsZW4gZG9cbiAgICBsZXQgbGFiZWwgPSBtZXRob2RzLighaSkgaW4gbGV0IGNsbyA9IG1ldGhvZF9pbXBsIHRhYmxlIGkgbWV0aG9kcyBpblxuICAgIHNldF9tZXRob2QgdGFibGUgbGFiZWwgY2xvO1xuICAgIGluY3IgaVxuICBkb25lXG5cbigqKioqIFN0YXRpc3RpY3MgKioqKilcblxudHlwZSBzdGF0cyA9XG4gIHsgY2xhc3NlczogaW50OyBtZXRob2RzOiBpbnQ7IGluc3RfdmFyczogaW50OyB9XG5cbmxldCBzdGF0cyAoKSA9XG4gIHsgY2xhc3NlcyA9ICF0YWJsZV9jb3VudDtcbiAgICBtZXRob2RzID0gIW1ldGhvZF9jb3VudDsgaW5zdF92YXJzID0gIWluc3RfdmFyX2NvdW50OyB9XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDA0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgc2hhcGUgPVxuICB8IEZ1bmN0aW9uXG4gIHwgTGF6eVxuICB8IENsYXNzXG4gIHwgTW9kdWxlIG9mIHNoYXBlIGFycmF5XG4gIHwgVmFsdWUgb2YgT2JqLnRcblxubGV0IHJlYyBpbml0X21vZF9maWVsZCBtb2R1IGkgbG9jIHNoYXBlID1cbiAgbGV0IGluaXQgPVxuICAgIG1hdGNoIHNoYXBlIHdpdGhcbiAgICB8IEZ1bmN0aW9uIC0+XG4gICAgICAgbGV0IHJlYyBmbiAoeCA6ICdhKSA9XG4gICAgICAgICBsZXQgZm4nIDogJ2EgLT4gJ2IgPSBPYmoub2JqIChPYmouZmllbGQgbW9kdSBpKSBpblxuICAgICAgICAgaWYgZm4gPT0gZm4nIHRoZW5cbiAgICAgICAgICAgcmFpc2UgKFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIGxvYylcbiAgICAgICAgIGVsc2VcbiAgICAgICAgICAgZm4nIHggaW5cbiAgICAgICBPYmoucmVwciBmblxuICAgIHwgTGF6eSAtPlxuICAgICAgIGxldCByZWMgbCA9XG4gICAgICAgICBsYXp5IChcbiAgICAgICAgICAgbGV0IGwnID0gT2JqLm9iaiAoT2JqLmZpZWxkIG1vZHUgaSkgaW5cbiAgICAgICAgICAgaWYgbCA9PSBsJyB0aGVuXG4gICAgICAgICAgICAgcmFpc2UgKFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIGxvYylcbiAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgIExhenkuZm9yY2UgbCcpIGluXG4gICAgICAgT2JqLnJlcHIgbFxuICAgIHwgQ2xhc3MgLT5cbiAgICAgICBPYmoucmVwciAoQ2FtbGludGVybmFsT08uZHVtbXlfY2xhc3MgbG9jKVxuICAgIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgICAgT2JqLnJlcHIgKGluaXRfbW9kX2Jsb2NrIGxvYyBjb21wcylcbiAgICB8IFZhbHVlIHYgLT4gdlxuICBpblxuICBPYmouc2V0X2ZpZWxkIG1vZHUgaSBpbml0XG5cbmFuZCBpbml0X21vZF9ibG9jayBsb2MgY29tcHMgPVxuICBsZXQgbGVuZ3RoID0gQXJyYXkubGVuZ3RoIGNvbXBzIGluXG4gIGxldCBtb2R1ID0gT2JqLm5ld19ibG9jayAwIGxlbmd0aCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIC0gMSBkb1xuICAgIGluaXRfbW9kX2ZpZWxkIG1vZHUgaSBsb2MgY29tcHMuKGkpXG4gIGRvbmU7XG4gIG1vZHVcblxubGV0IGluaXRfbW9kIGxvYyBzaGFwZSA9XG4gIG1hdGNoIHNoYXBlIHdpdGhcbiAgfCBNb2R1bGUgY29tcHMgLT5cbiAgICAgT2JqLnJlcHIgKGluaXRfbW9kX2Jsb2NrIGxvYyBjb21wcylcbiAgfCBfIC0+IGZhaWx3aXRoIFwiQ2FtbGludGVybmFsTW9kLmluaXRfbW9kOiBub3QgYSBtb2R1bGVcIlxuXG5sZXQgcmVjIHVwZGF0ZV9tb2RfZmllbGQgbW9kdSBpIHNoYXBlIG4gPVxuICBtYXRjaCBzaGFwZSB3aXRoXG4gIHwgRnVuY3Rpb24gfCBMYXp5IC0+XG4gICAgIE9iai5zZXRfZmllbGQgbW9kdSBpIG5cbiAgfCBWYWx1ZSBfIC0+XG4gICAgICgpICgqIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZXJlICopXG4gIHwgQ2xhc3MgLT5cbiAgICAgYXNzZXJ0IChPYmoudGFnIG4gPSAwICYmIE9iai5zaXplIG4gPSA0KTtcbiAgICAgbGV0IGNsID0gT2JqLmZpZWxkIG1vZHUgaSBpblxuICAgICBmb3IgaiA9IDAgdG8gMyBkb1xuICAgICAgIE9iai5zZXRfZmllbGQgY2wgaiAoT2JqLmZpZWxkIG4gailcbiAgICAgZG9uZVxuICB8IE1vZHVsZSBjb21wcyAtPlxuICAgICB1cGRhdGVfbW9kX2Jsb2NrIGNvbXBzIChPYmouZmllbGQgbW9kdSBpKSBuXG5cbmFuZCB1cGRhdGVfbW9kX2Jsb2NrIGNvbXBzIG8gbiA9XG4gIGFzc2VydCAoT2JqLnRhZyBuID0gMCAmJiBPYmouc2l6ZSBuID49IEFycmF5Lmxlbmd0aCBjb21wcyk7XG4gIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggY29tcHMgLSAxIGRvXG4gICAgdXBkYXRlX21vZF9maWVsZCBvIGkgY29tcHMuKGkpIChPYmouZmllbGQgbiBpKVxuICBkb25lXG5cbmxldCB1cGRhdGVfbW9kIHNoYXBlIG8gbiA9XG4gIG1hdGNoIHNoYXBlIHdpdGhcbiAgfCBNb2R1bGUgY29tcHMgLT5cbiAgICAgdXBkYXRlX21vZF9ibG9jayBjb21wcyBvIG5cbiAgfCBfIC0+IGZhaWx3aXRoIFwiQ2FtbGludGVybmFsTW9kLnVwZGF0ZV9tb2Q6IG5vdCBhIG1vZHVsZVwiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm1vZHVsZSB0eXBlIFNlZWRlZFMgPSBzaWdcblxuICB0eXBlIGtleVxuICB0eXBlICEnYSB0XG4gIHZhbCBjcmVhdGUgOiA/cmFuZG9tICgqdGh3YXJ0IHRvb2xzL3N5bmNfc3RkbGliX2RvY3MqKSA6IGJvb2wgLT4gaW50IC0+ICdhIHRcbiAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gIHZhbCByZXNldCA6ICdhIHQgLT4gdW5pdFxuICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiBrZXkgLT4gdW5pdFxuICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gIHZhbCBmaW5kX29wdCA6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICB2YWwgZmluZF9hbGwgOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgdmFsIHN0YXRzIDogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIHZhbCBjbGVhbjogJ2EgdCAtPiB1bml0XG4gIHZhbCBzdGF0c19hbGl2ZTogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgICAoKiogc2FtZSBhcyB7IXN0YXRzfSBidXQgb25seSBjb3VudCB0aGUgYWxpdmUgYmluZGluZ3MgKilcbmVuZFxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG5cbiAgdHlwZSBrZXlcbiAgdHlwZSAhJ2EgdFxuICB2YWwgY3JlYXRlIDogaW50IC0+ICdhIHRcbiAgdmFsIGNsZWFyIDogJ2EgdCAtPiB1bml0XG4gIHZhbCByZXNldCA6ICdhIHQgLT4gdW5pdFxuICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICB2YWwgYWRkIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiBrZXkgLT4gdW5pdFxuICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gIHZhbCBmaW5kX29wdCA6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICB2YWwgZmluZF9hbGwgOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgdmFsIHN0YXRzIDogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIHZhbCBjbGVhbjogJ2EgdCAtPiB1bml0XG4gIHZhbCBzdGF0c19hbGl2ZTogJ2EgdCAtPiBIYXNodGJsLnN0YXRpc3RpY3NcbiAgICAoKiogc2FtZSBhcyB7IXN0YXRzfSBidXQgb25seSBjb3VudCB0aGUgYWxpdmUgYmluZGluZ3MgKilcbmVuZFxuXG5tb2R1bGUgR2VuSGFzaFRhYmxlID0gc3RydWN0XG5cbiAgdHlwZSBlcXVhbCA9XG4gIHwgRVRydWUgfCBFRmFsc2VcbiAgfCBFRGVhZCAoKiogdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHJlY2xhaW1lZCB0aGUgZGF0YSAqKVxuXG4gIG1vZHVsZSBNYWtlU2VlZGVkKEg6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHR5cGUgJ2EgY29udGFpbmVyXG4gICAgdmFsIGNyZWF0ZTogdCAtPiAnYSAtPiAnYSBjb250YWluZXJcbiAgICB2YWwgc2VlZGVkX2hhc2g6IGludCAtPiB0IC0+IGludFxuICAgIHZhbCBlcXVhbDogJ2EgY29udGFpbmVyIC0+IHQgLT4gZXF1YWxcbiAgICB2YWwgZ2V0X2RhdGE6ICdhIGNvbnRhaW5lciAtPiAnYSBvcHRpb25cbiAgICB2YWwgc2V0X2tleV9kYXRhOiAnYSBjb250YWluZXIgLT4gdCAtPiAnYSAtPiB1bml0XG4gICAgdmFsIGNoZWNrX2tleTogJ2EgY29udGFpbmVyIC0+IGJvb2xcbiAgZW5kKSA6IFNlZWRlZFMgd2l0aCB0eXBlIGtleSA9IEgudFxuICA9IHN0cnVjdFxuXG4gICAgdHlwZSAnYSB0ID1cbiAgICAgIHsgbXV0YWJsZSBzaXplOiBpbnQ7ICAgICAgICAgICAgICAgICAgKCogbnVtYmVyIG9mIGVudHJpZXMgKilcbiAgICAgICAgbXV0YWJsZSBkYXRhOiAnYSBidWNrZXRsaXN0IGFycmF5OyAgKCogdGhlIGJ1Y2tldHMgKilcbiAgICAgICAgc2VlZDogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgKCogZm9yIHJhbmRvbWl6YXRpb24gKilcbiAgICAgICAgaW5pdGlhbF9zaXplOiBpbnQ7ICAgICAgICAgICAgICAgICAgKCogaW5pdGlhbCBhcnJheSBzaXplICopXG4gICAgICB9XG5cbiAgICBhbmQgJ2EgYnVja2V0bGlzdCA9XG4gICAgfCBFbXB0eVxuICAgIHwgQ29ucyBvZiBpbnQgKCogaGFzaCBvZiB0aGUga2V5ICopICogJ2EgSC5jb250YWluZXIgKiAnYSBidWNrZXRsaXN0XG5cbiAgICAoKiogdGhlIGhhc2ggb2YgdGhlIGtleSBpcyBrZXB0IGluIG9yZGVyIHRvIHRlc3QgdGhlIGVxdWFsaXR5IG9mIHRoZSBoYXNoXG4gICAgICBiZWZvcmUgdGhlIGtleS4gU2FtZSByZWFzb24gYXMgZm9yIFdlYWsuTWFrZSAqKVxuXG4gICAgdHlwZSBrZXkgPSBILnRcblxuICAgIGxldCByZWMgcG93ZXJfMl9hYm92ZSB4IG4gPVxuICAgICAgaWYgeCA+PSBuIHRoZW4geFxuICAgICAgZWxzZSBpZiB4ICogMiA+IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIHRoZW4geFxuICAgICAgZWxzZSBwb3dlcl8yX2Fib3ZlICh4ICogMikgblxuXG4gICAgbGV0IHBybmcgPSBsYXp5IChSYW5kb20uU3RhdGUubWFrZV9zZWxmX2luaXQoKSlcblxuICAgIGxldCBjcmVhdGUgPyhyYW5kb20gPSAoSGFzaHRibC5pc19yYW5kb21pemVkICgpKSkgaW5pdGlhbF9zaXplID1cbiAgICAgIGxldCBzID0gcG93ZXJfMl9hYm92ZSAxNiBpbml0aWFsX3NpemUgaW5cbiAgICAgIGxldCBzZWVkID0gaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKExhenkuZm9yY2UgcHJuZykgZWxzZSAwIGluXG4gICAgICB7IGluaXRpYWxfc2l6ZSA9IHM7IHNpemUgPSAwOyBzZWVkID0gc2VlZDsgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eSB9XG5cbiAgICBsZXQgY2xlYXIgaCA9XG4gICAgICBoLnNpemUgPC0gMDtcbiAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggaC5kYXRhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgICBoLmRhdGEuKGkpIDwtIEVtcHR5XG4gICAgICBkb25lXG5cbiAgICBsZXQgcmVzZXQgaCA9XG4gICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIGguZGF0YSBpblxuICAgICAgaWYgbGVuID0gaC5pbml0aWFsX3NpemUgdGhlblxuICAgICAgICBjbGVhciBoXG4gICAgICBlbHNlIGJlZ2luXG4gICAgICAgIGguc2l6ZSA8LSAwO1xuICAgICAgICBoLmRhdGEgPC0gQXJyYXkubWFrZSBoLmluaXRpYWxfc2l6ZSBFbXB0eVxuICAgICAgZW5kXG5cbiAgICBsZXQgY29weSBoID0geyBoIHdpdGggZGF0YSA9IEFycmF5LmNvcHkgaC5kYXRhIH1cblxuICAgIGxldCBrZXlfaW5kZXggaCBoa2V5ID1cbiAgICAgIGhrZXkgbGFuZCAoQXJyYXkubGVuZ3RoIGguZGF0YSAtIDEpXG5cbiAgICBsZXQgY2xlYW4gaCA9XG4gICAgICBsZXQgcmVjIGRvX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICAgIEVtcHR5XG4gICAgICAgIHwgQ29ucyhfLCBjLCByZXN0KSB3aGVuIG5vdCAoSC5jaGVja19rZXkgYykgLT5cbiAgICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgICAgZG9fYnVja2V0IHJlc3RcbiAgICAgICAgfCBDb25zKGhrZXksIGMsIHJlc3QpIC0+XG4gICAgICAgICAgICBDb25zKGhrZXksIGMsIGRvX2J1Y2tldCByZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBkID0gaC5kYXRhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGQgLSAxIGRvXG4gICAgICAgIGQuKGkpIDwtIGRvX2J1Y2tldCBkLihpKVxuICAgICAgZG9uZVxuXG4gICAgKCoqIHJlc2l6ZSBpcyB0aGUgb25seSBmdW5jdGlvbiB0byBkbyB0aGUgYWN0dWFsIGNsZWFuaW5nIG9mIGRlYWQga2V5c1xuICAgICAgICAocmVtb3ZlIGRvZXMgaXQganVzdCBiZWNhdXNlIGl0IGNvdWxkKS5cblxuICAgICAgICBUaGUgZ29hbCBpcyB0bzpcblxuICAgICAgICAtIG5vdCByZXNpemUgaW5maW5pdGVseSB3aGVuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGFsaXZlIGtleXMgaXNcbiAgICAgICAgYm91bmRlZCBidXQga2V5cyBhcmUgY29udGludW91c2x5IGFkZGVkLiBUaGF0IHdvdWxkIGhhcHBlbiBpZlxuICAgICAgICB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXNpemUuXG4gICAgICAgIC0gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBlYWNoIGFkZGl0aW9uLCB0aGF0IHdvdWxkIGhhcHBlbiBpZiB0aGlzXG4gICAgICAgIGZ1bmN0aW9uIGRvbid0IHJlc2l6ZSBldmVuIHdoZW4gb25seSBvbmUga2V5IGlzIGRlYWQuXG5cbiAgICAgICAgU28gdGhlIGFsZ29yaXRobTpcbiAgICAgICAgLSBjbGVhbiB0aGUga2V5cyBiZWZvcmUgcmVzaXppbmdcbiAgICAgICAgLSBpZiB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBrZXlzIGlzIGxlc3MgdGhhbiBoYWxmIHRoZSBzaXplIG9mIHRoZVxuICAgICAgICBhcnJheSwgZG9uJ3QgcmVzaXplLlxuICAgICAgICAtIGlmIGl0IGlzIG1vcmUsIHJlc2l6ZS5cblxuICAgICAgICBUaGUgc2Vjb25kIHByb2JsZW0gcmVtYWlucyBpZiB0aGUgdGFibGUgcmVhY2hlcyB7IVN5cy5tYXhfYXJyYXlfbGVuZ3RofS5cblxuICAgICopXG4gICAgbGV0IHJlc2l6ZSBoID1cbiAgICAgIGxldCBvZGF0YSA9IGguZGF0YSBpblxuICAgICAgbGV0IG9zaXplID0gQXJyYXkubGVuZ3RoIG9kYXRhIGluXG4gICAgICBsZXQgbnNpemUgPSBvc2l6ZSAqIDIgaW5cbiAgICAgIGNsZWFuIGg7XG4gICAgICBpZiBuc2l6ZSA8IFN5cy5tYXhfYXJyYXlfbGVuZ3RoICYmIGguc2l6ZSA+PSBvc2l6ZSBsc3IgMSB0aGVuIGJlZ2luXG4gICAgICAgIGxldCBuZGF0YSA9IEFycmF5Lm1ha2UgbnNpemUgRW1wdHkgaW5cbiAgICAgICAgaC5kYXRhIDwtIG5kYXRhOyAgICAgICAoKiBzbyB0aGF0IGtleV9pbmRleCBzZWVzIHRoZSBuZXcgYnVja2V0IGNvdW50ICopXG4gICAgICAgIGxldCByZWMgaW5zZXJ0X2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICBFbXB0eSAtPiAoKVxuICAgICAgICAgIHwgQ29ucyhoa2V5LCBkYXRhLCByZXN0KSAtPlxuICAgICAgICAgICAgICBpbnNlcnRfYnVja2V0IHJlc3Q7ICgqIHByZXNlcnZlIG9yaWdpbmFsIG9yZGVyIG9mIGVsZW1lbnRzICopXG4gICAgICAgICAgICAgIGxldCBuaWR4ID0ga2V5X2luZGV4IGggaGtleSBpblxuICAgICAgICAgICAgICBuZGF0YS4obmlkeCkgPC0gQ29ucyhoa2V5LCBkYXRhLCBuZGF0YS4obmlkeCkpIGluXG4gICAgICAgIGZvciBpID0gMCB0byBvc2l6ZSAtIDEgZG9cbiAgICAgICAgICBpbnNlcnRfYnVja2V0IG9kYXRhLihpKVxuICAgICAgICBkb25lXG4gICAgICBlbmRcblxuICAgIGxldCBhZGQgaCBrZXkgaW5mbyA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICBsZXQgY29udGFpbmVyID0gSC5jcmVhdGUga2V5IGluZm8gaW5cbiAgICAgIGxldCBidWNrZXQgPSBDb25zKGhrZXksIGNvbnRhaW5lciwgaC5kYXRhLihpKSkgaW5cbiAgICAgIGguZGF0YS4oaSkgPC0gYnVja2V0O1xuICAgICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGhcblxuICAgIGxldCByZW1vdmUgaCBrZXkgPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgcmVtb3ZlX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICAgICAgfCBDb25zKGhrLCBjLCBuZXh0KSB3aGVuIGhrZXkgPSBoayAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgICB8IEVUcnVlIC0+IGguc2l6ZSA8LSBoLnNpemUgLSAxOyBuZXh0XG4gICAgICAgICAgICB8IEVGYWxzZSAtPiBDb25zKGhrLCBjLCByZW1vdmVfYnVja2V0IG5leHQpXG4gICAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgICAgKCogVGhlIGRlYWQga2V5IGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC4gSXQgaXMgYWNjZXB0YWJsZVxuICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyBmdW5jdGlvbiBzaW5jZSBpdCBhbHJlYWR5IHJlbW92ZXMgYSBiaW5kaW5nICopXG4gICAgICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgcmVtb3ZlX2J1Y2tldCBuZXh0XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfCBDb25zKGhrLGMsbmV4dCkgLT4gQ29ucyhoaywgYywgcmVtb3ZlX2J1Y2tldCBuZXh0KSBpblxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICBoLmRhdGEuKGkpIDwtIHJlbW92ZV9idWNrZXQgaC5kYXRhLihpKVxuXG4gICAgKCoqIHshZmluZH0gZG9uJ3QgcmVtb3ZlIGRlYWQga2V5cyBiZWNhdXNlIGl0IHdvdWxkIGJlIHN1cnByaXNpbmcgZm9yXG4gICAgICAgIHRoZSB1c2VyIHRoYXQgYSByZWFkLW9ubHkgZnVuY3Rpb24gbXV0YXRlcyB0aGUgc3RhdGUgKGVnLiBjb25jdXJyZW50XG4gICAgICAgIGFjY2VzcykuIFNhbWUgZm9yIHshbWVtfS5cbiAgICAqKVxuICAgIGxldCByZWMgZmluZF9yZWMga2V5IGhrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrZXkgPSBoayAgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+XG4gICAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZ2V0X2RhdGEgYyB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgKCogVGhpcyBjYXNlIGlzIG5vdCBpbXBvc3NpYmxlIGJlY2F1c2UgdGhlIGdjIGNhbiBydW4gYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgIEguZXF1YWwgYW5kIEguZ2V0X2RhdGEgKilcbiAgICAgICAgICAgICAgICAgIGZpbmRfcmVjIGtleSBoa2V5IHJlc3RcbiAgICAgICAgICAgICAgfCBTb21lIGQgLT4gZFxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICB8IEVGYWxzZSAtPiBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG4gICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG5cbiAgICBsZXQgZmluZCBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgKCogVE9ETyBpbmxpbmUgMyBpdGVyYXRpb25zICopXG4gICAgICBmaW5kX3JlYyBrZXkgaGtleSAoaC5kYXRhLihrZXlfaW5kZXggaCBoa2V5KSlcblxuICAgIGxldCByZWMgZmluZF9yZWNfb3B0IGtleSBoa2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IENvbnMoaGssIGMsIHJlc3QpIHdoZW4gaGtleSA9IGhrICAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgIHwgRVRydWUgLT5cbiAgICAgICAgICAgICAgYmVnaW4gbWF0Y2ggSC5nZXRfZGF0YSBjIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAoKiBUaGlzIGNhc2UgaXMgbm90IGltcG9zc2libGUgYmVjYXVzZSB0aGUgZ2MgY2FuIHJ1biBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgICAgSC5lcXVhbCBhbmQgSC5nZXRfZGF0YSAqKVxuICAgICAgICAgICAgICAgICAgZmluZF9yZWNfb3B0IGtleSBoa2V5IHJlc3RcbiAgICAgICAgICAgICAgfCBTb21lIF8gYXMgZCAtPiBkXG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICAgIHwgRUZhbHNlIC0+IGZpbmRfcmVjX29wdCBrZXkgaGtleSByZXN0XG4gICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuICAgICAgICAgIGVuZFxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+XG4gICAgICAgICAgZmluZF9yZWNfb3B0IGtleSBoa2V5IHJlc3RcblxuICAgIGxldCBmaW5kX29wdCBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgKCogVE9ETyBpbmxpbmUgMyBpdGVyYXRpb25zICopXG4gICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgKGguZGF0YS4oa2V5X2luZGV4IGggaGtleSkpXG5cbiAgICBsZXQgZmluZF9hbGwgaCBrZXkgPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgZmluZF9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBbXVxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrZXkgPSBoayAgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+IGJlZ2luIG1hdGNoIEguZ2V0X2RhdGEgYyB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgZmluZF9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgICAgICB8IFNvbWUgZCAtPiBkOjpmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICB8IEVGYWxzZSAtPiBmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICBmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX2luX2J1Y2tldCByZXN0IGluXG4gICAgICBmaW5kX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpXG5cblxuICAgIGxldCByZXBsYWNlIGgga2V5IGluZm8gPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgcmVwbGFjZV9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICB8IENvbnMoaGssIGMsIG5leHQpIHdoZW4gaGtleSA9IGhrIC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICAgIHwgRVRydWUgLT4gSC5zZXRfa2V5X2RhdGEgYyBrZXkgaW5mb1xuICAgICAgICAgICAgfCBFRmFsc2UgfCBFRGVhZCAtPiByZXBsYWNlX2J1Y2tldCBuZXh0XG4gICAgICAgICAgICBlbmRcbiAgICAgICAgfCBDb25zKF8sXyxuZXh0KSAtPiByZXBsYWNlX2J1Y2tldCBuZXh0XG4gICAgICBpblxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIHRyeVxuICAgICAgICByZXBsYWNlX2J1Y2tldCBsXG4gICAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICBsZXQgY29udGFpbmVyID0gSC5jcmVhdGUga2V5IGluZm8gaW5cbiAgICAgICAgaC5kYXRhLihpKSA8LSBDb25zKGhrZXksIGNvbnRhaW5lciwgbCk7XG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGhcblxuICAgIGxldCBtZW0gaCBrZXkgPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCByZWMgbWVtX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgd2hlbiBoayA9IGhrZXkgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+IHRydWVcbiAgICAgICAgICB8IEVGYWxzZSB8IEVEZWFkIC0+IG1lbV9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgIGVuZFxuICAgICAgfCBDb25zKF9oaywgX2MsIHJlc3QpIC0+IG1lbV9pbl9idWNrZXQgcmVzdCBpblxuICAgICAgbWVtX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpXG5cbiAgICBsZXQgbGVuZ3RoIGggPSBoLnNpemVcblxuICAgIGxldCByZWMgYnVja2V0X2xlbmd0aCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+IGJ1Y2tldF9sZW5ndGggKGFjY3UgKyAxKSByZXN0XG5cbiAgICBsZXQgc3RhdHMgaCA9XG4gICAgICBsZXQgbWJsID1cbiAgICAgICAgQXJyYXkuZm9sZF9sZWZ0IChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aCAwIGIpKSAwIGguZGF0YSBpblxuICAgICAgbGV0IGhpc3RvID0gQXJyYXkubWFrZSAobWJsICsgMSkgMCBpblxuICAgICAgQXJyYXkuaXRlclxuICAgICAgICAoZnVuIGIgLT5cbiAgICAgICAgICAgbGV0IGwgPSBidWNrZXRfbGVuZ3RoIDAgYiBpblxuICAgICAgICAgICBoaXN0by4obCkgPC0gaGlzdG8uKGwpICsgMSlcbiAgICAgICAgaC5kYXRhO1xuICAgICAgeyBIYXNodGJsLm51bV9iaW5kaW5ncyA9IGguc2l6ZTtcbiAgICAgICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgICAgICBtYXhfYnVja2V0X2xlbmd0aCA9IG1ibDtcbiAgICAgICAgYnVja2V0X2hpc3RvZ3JhbSA9IGhpc3RvIH1cblxuICAgIGxldCByZWMgYnVja2V0X2xlbmd0aF9hbGl2ZSBhY2N1ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBDb25zKF8sIGMsIHJlc3QpIHdoZW4gSC5jaGVja19rZXkgYyAtPlxuICAgICAgICAgIGJ1Y2tldF9sZW5ndGhfYWxpdmUgKGFjY3UgKyAxKSByZXN0XG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT4gYnVja2V0X2xlbmd0aF9hbGl2ZSBhY2N1IHJlc3RcblxuICAgIGxldCBzdGF0c19hbGl2ZSBoID1cbiAgICAgIGxldCBzaXplID0gcmVmIDAgaW5cbiAgICAgIGxldCBtYmwgPVxuICAgICAgICBBcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAoZnVuIG0gYiAtPiBJbnQubWF4IG0gKGJ1Y2tldF9sZW5ndGhfYWxpdmUgMCBiKSkgMCBoLmRhdGFcbiAgICAgIGluXG4gICAgICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gICAgICBBcnJheS5pdGVyXG4gICAgICAgIChmdW4gYiAtPlxuICAgICAgICAgICBsZXQgbCA9IGJ1Y2tldF9sZW5ndGhfYWxpdmUgMCBiIGluXG4gICAgICAgICAgIHNpemUgOj0gIXNpemUgKyBsO1xuICAgICAgICAgICBoaXN0by4obCkgPC0gaGlzdG8uKGwpICsgMSlcbiAgICAgICAgaC5kYXRhO1xuICAgICAgeyBIYXNodGJsLm51bV9iaW5kaW5ncyA9ICFzaXplO1xuICAgICAgICBudW1fYnVja2V0cyA9IEFycmF5Lmxlbmd0aCBoLmRhdGE7XG4gICAgICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgICAgICBidWNrZXRfaGlzdG9ncmFtID0gaGlzdG8gfVxuXG4gICAgbGV0IGFkZF9zZXEgdGJsIGkgPVxuICAgICAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiBhZGQgdGJsIGsgdikgaVxuXG4gICAgbGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gcmVwbGFjZSB0YmwgayB2KSBpXG5cbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcblxuICBlbmRcbmVuZFxuXG5tb2R1bGUgT2JqRXBoID0gT2JqLkVwaGVtZXJvblxuXG5sZXQgX29ial9vcHQgOiBPYmoudCBvcHRpb24gLT4gJ2Egb3B0aW9uID0gZnVuIHggLT5cbiAgbWF0Y2ggeCB3aXRoXG4gIHwgTm9uZSAtPiB4XG4gIHwgU29tZSB2IC0+IFNvbWUgKE9iai5vYmogdilcblxuKCoqIFRoZSBwcmV2aW91cyBmdW5jdGlvbiBpcyB0eXBlZCBzbyB0aGlzIG9uZSBpcyBhbHNvIGNvcnJlY3QgKilcbmxldCBvYmpfb3B0IDogT2JqLnQgb3B0aW9uIC0+ICdhIG9wdGlvbiA9IGZ1biB4IC0+IE9iai5tYWdpYyB4XG5cblxubW9kdWxlIEsxID0gc3RydWN0XG4gIHR5cGUgKCdrLCdkKSB0ID0gT2JqRXBoLnRcblxuICBsZXQgY3JlYXRlICgpIDogKCdrLCdkKSB0ID0gT2JqRXBoLmNyZWF0ZSAxXG5cbiAgbGV0IGdldF9rZXkgKHQ6KCdrLCdkKSB0KSA6ICdrIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfa2V5IHQgMClcbiAgbGV0IHNldF9rZXkgKHQ6KCdrLCdkKSB0KSAoazonaykgOiB1bml0ID0gT2JqRXBoLnNldF9rZXkgdCAwIChPYmoucmVwciBrKVxuICBsZXQgY2hlY2tfa2V5ICh0OignaywnZCkgdCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IDBcblxuICBsZXQgZ2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSA6ICdkIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfZGF0YSB0KVxuICBsZXQgc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSAoZDonZCkgOiB1bml0ID0gT2JqRXBoLnNldF9kYXRhIHQgKE9iai5yZXByIGQpXG4gIGxldCB1bnNldF9kYXRhICh0OignaywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2RhdGEgdFxuXG4gIGxldCBtYWtlIGtleSBkYXRhID1cbiAgICBsZXQgZXBoID0gY3JlYXRlICgpIGluXG4gICAgc2V0X2RhdGEgZXBoIGRhdGE7XG4gICAgc2V0X2tleSBlcGgga2V5O1xuICAgIGVwaFxuXG4gIGxldCBxdWVyeSBlcGgga2V5ID1cbiAgICBtYXRjaCBnZXRfa2V5IGVwaCB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5IC0+IGdldF9kYXRhIGVwaFxuICAgIHwgU29tZSBfIC0+IE5vbmVcblxuICBtb2R1bGUgTWFrZVNlZWRlZCAoSDpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpID1cbiAgICBHZW5IYXNoVGFibGUuTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgY29udGFpbmVyID0gKEgudCwnYSkgdFxuICAgICAgdHlwZSB0ID0gSC50XG4gICAgICBsZXQgY3JlYXRlIGsgZCA9XG4gICAgICAgIGxldCBjID0gY3JlYXRlICgpIGluXG4gICAgICAgIHNldF9kYXRhIGMgZDtcbiAgICAgICAgc2V0X2tleSBjIGs7XG4gICAgICAgIGNcbiAgICAgIGxldCBzZWVkZWRfaGFzaCA9IEguc2VlZGVkX2hhc2hcbiAgICAgIGxldCBlcXVhbCBjIGsgPVxuICAgICAgICAoKiB7IWdldF9rZXlfY29weX0gaXMgbm90IHVzZWQgYmVjYXVzZSB0aGUgZXF1YWxpdHkgb2YgdGhlIHVzZXIgY2FuIGJlXG4gICAgICAgICAgICB0aGUgcGh5c2ljYWwgZXF1YWxpdHkgKilcbiAgICAgICAgbWF0Y2ggZ2V0X2tleSBjIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IEdlbkhhc2hUYWJsZS5FRGVhZFxuICAgICAgICB8IFNvbWUgaycgLT5cbiAgICAgICAgICAgIGlmIEguZXF1YWwgayBrJyB0aGVuIEdlbkhhc2hUYWJsZS5FVHJ1ZSBlbHNlIEdlbkhhc2hUYWJsZS5FRmFsc2VcbiAgICAgIGxldCBnZXRfZGF0YSA9IGdldF9kYXRhXG4gICAgICBsZXQgc2V0X2tleV9kYXRhIGMgayBkID1cbiAgICAgICAgdW5zZXRfZGF0YSBjO1xuICAgICAgICBzZXRfa2V5IGMgaztcbiAgICAgICAgc2V0X2RhdGEgYyBkXG4gICAgICBsZXQgY2hlY2tfa2V5ID0gY2hlY2tfa2V5XG4gICAgZW5kKVxuXG4gIG1vZHVsZSBNYWtlKEg6IEhhc2h0YmwuSGFzaGVkVHlwZSk6IChTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgICB0eXBlIHQgPSBILnRcbiAgICAgICAgbGV0IGVxdWFsID0gSC5lcXVhbFxuICAgICAgICBsZXQgc2VlZGVkX2hhc2ggKF9zZWVkOiBpbnQpIHggPSBILmhhc2ggeFxuICAgICAgZW5kKVxuICAgIGxldCBjcmVhdGUgc3ogPSBjcmVhdGUgfnJhbmRvbTpmYWxzZSBzelxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuICBlbmRcblxuICBtb2R1bGUgQnVja2V0ID0gc3RydWN0XG5cbiAgICB0eXBlIG5vbnJlYyAoJ2ssICdkKSB0ID0gKCdrLCAnZCkgdCBsaXN0IHJlZlxuICAgIGxldCBrMV9tYWtlID0gbWFrZVxuICAgIGxldCBtYWtlICgpID0gcmVmIFtdXG4gICAgbGV0IGFkZCBiIGsgZCA9IGIgOj0gazFfbWFrZSBrIGQgOjogIWJcblxuICAgIGxldCB0ZXN0X2tleSBrIGUgPVxuICAgICAgbWF0Y2ggZ2V0X2tleSBlIHdpdGhcbiAgICAgIHwgU29tZSB4IHdoZW4geCA9PSBrIC0+IHRydWVcbiAgICAgIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlbW92ZSBiIGsgPVxuICAgICAgbGV0IHJlYyBsb29wIGwgYWNjID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgW10gLT4gKClcbiAgICAgICAgfCBoIDo6IHQgd2hlbiB0ZXN0X2tleSBrIGggLT4gYiA6PSBMaXN0LnJldl9hcHBlbmQgYWNjIHRcbiAgICAgICAgfCBoIDo6IHQgLT4gbG9vcCB0IChoIDo6IGFjYylcbiAgICAgIGluXG4gICAgICBsb29wICFiIFtdXG5cbiAgICBsZXQgZmluZCBiIGsgPVxuICAgICAgbWF0Y2ggTGlzdC5maW5kX29wdCAodGVzdF9rZXkgaykgIWIgd2l0aFxuICAgICAgfCBTb21lIGUgLT4gZ2V0X2RhdGEgZVxuICAgICAgfCBOb25lIC0+IE5vbmVcblxuICAgIGxldCBsZW5ndGggYiA9IExpc3QubGVuZ3RoICFiXG4gICAgbGV0IGNsZWFyIGIgPSBiIDo9IFtdXG5cbiAgZW5kXG5cbmVuZFxuXG5tb2R1bGUgSzIgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2sxLCAnazIsICdkKSB0ID0gT2JqRXBoLnRcblxuICBsZXQgY3JlYXRlICgpIDogKCdrMSwnazIsJ2QpIHQgPSBPYmpFcGguY3JlYXRlIDJcblxuICBsZXQgZ2V0X2tleTEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogJ2sxIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfa2V5IHQgMClcbiAgbGV0IHNldF9rZXkxICh0OignazEsJ2syLCdkKSB0KSAoazonazEpIDogdW5pdCA9XG4gICAgT2JqRXBoLnNldF9rZXkgdCAwIChPYmoucmVwciBrKVxuICBsZXQgY2hlY2tfa2V5MSAodDooJ2sxLCdrMiwnZCkgdCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IDBcblxuICBsZXQgZ2V0X2tleTIgKHQ6KCdrMSwnazIsJ2QpIHQpIDogJ2syIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfa2V5IHQgMSlcbiAgbGV0IHNldF9rZXkyICh0OignazEsJ2syLCdkKSB0KSAoazonazIpIDogdW5pdCA9XG4gICAgT2JqRXBoLnNldF9rZXkgdCAxIChPYmoucmVwciBrKVxuICBsZXQgY2hlY2tfa2V5MiAodDooJ2sxLCdrMiwnZCkgdCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IDFcblxuICBsZXQgZ2V0X2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBzZXRfZGF0YSAodDooJ2sxLCdrMiwnZCkgdCkgKGQ6J2QpIDogdW5pdCA9XG4gICAgT2JqRXBoLnNldF9kYXRhIHQgKE9iai5yZXByIGQpXG4gIGxldCB1bnNldF9kYXRhICh0OignazEsJ2syLCdkKSB0KSA6IHVuaXQgPSBPYmpFcGgudW5zZXRfZGF0YSB0XG5cbiAgbGV0IG1ha2Uga2V5MSBrZXkyIGRhdGEgPVxuICAgIGxldCBlcGggPSBjcmVhdGUgKCkgaW5cbiAgICBzZXRfZGF0YSBlcGggZGF0YTtcbiAgICBzZXRfa2V5MSBlcGgga2V5MTtcbiAgICBzZXRfa2V5MiBlcGgga2V5MjtcbiAgICBpZ25vcmUgKFN5cy5vcGFxdWVfaWRlbnRpdHkga2V5MSk7XG4gICAgZXBoXG5cbiAgbGV0IHF1ZXJ5IGVwaCBrZXkxIGtleTIgPVxuICAgIG1hdGNoIGdldF9rZXkxIGVwaCB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5MSAtPlxuICAgICAgICBiZWdpbiBtYXRjaCBnZXRfa2V5MiBlcGggd2l0aFxuICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5MiAtPiBnZXRfZGF0YSBlcGhcbiAgICAgICAgfCBTb21lIF8gLT4gTm9uZVxuICAgICAgICBlbmRcbiAgICB8IFNvbWUgXyAtPiBOb25lXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWRcbiAgICAgIChIMTpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpXG4gICAgICAoSDI6SGFzaHRibC5TZWVkZWRIYXNoZWRUeXBlKSA9XG4gICAgR2VuSGFzaFRhYmxlLk1ha2VTZWVkZWQoc3RydWN0XG4gICAgICB0eXBlICdhIGNvbnRhaW5lciA9IChIMS50LEgyLnQsJ2EpIHRcbiAgICAgIHR5cGUgdCA9IEgxLnQgKiBIMi50XG4gICAgICBsZXQgY3JlYXRlIChrMSxrMikgZCA9XG4gICAgICAgIGxldCBjID0gY3JlYXRlICgpIGluXG4gICAgICAgIHNldF9kYXRhIGMgZDtcbiAgICAgICAgc2V0X2tleTEgYyBrMTsgc2V0X2tleTIgYyBrMjtcbiAgICAgICAgY1xuICAgICAgbGV0IHNlZWRlZF9oYXNoIHNlZWQgKGsxLGsyKSA9XG4gICAgICAgIEgxLnNlZWRlZF9oYXNoIHNlZWQgazEgKyBIMi5zZWVkZWRfaGFzaCBzZWVkIGsyICogNjU1OTlcbiAgICAgIGxldCBlcXVhbCBjIChrMSxrMikgPVxuICAgICAgICBtYXRjaCBnZXRfa2V5MSBjLCBnZXRfa2V5MiBjIHdpdGhcbiAgICAgICAgfCBOb25lLCBfIHwgXyAsIE5vbmUgLT4gR2VuSGFzaFRhYmxlLkVEZWFkXG4gICAgICAgIHwgU29tZSBrMScsIFNvbWUgazInIC0+XG4gICAgICAgICAgICBpZiBIMS5lcXVhbCBrMSBrMScgJiYgSDIuZXF1YWwgazIgazInXG4gICAgICAgICAgICB0aGVuIEdlbkhhc2hUYWJsZS5FVHJ1ZSBlbHNlIEdlbkhhc2hUYWJsZS5FRmFsc2VcbiAgICAgIGxldCBnZXRfZGF0YSA9IGdldF9kYXRhXG4gICAgICBsZXQgc2V0X2tleV9kYXRhIGMgKGsxLGsyKSBkID1cbiAgICAgICAgdW5zZXRfZGF0YSBjO1xuICAgICAgICBzZXRfa2V5MSBjIGsxOyBzZXRfa2V5MiBjIGsyO1xuICAgICAgICBzZXRfZGF0YSBjIGRcbiAgICAgIGxldCBjaGVja19rZXkgYyA9IGNoZWNrX2tleTEgYyAmJiBjaGVja19rZXkyIGNcbiAgICBlbmQpXG5cbiAgbW9kdWxlIE1ha2UoSDE6IEhhc2h0YmwuSGFzaGVkVHlwZSkoSDI6IEhhc2h0YmwuSGFzaGVkVHlwZSk6XG4gICAgKFMgd2l0aCB0eXBlIGtleSA9IEgxLnQgKiBIMi50KSA9XG4gIHN0cnVjdFxuICAgIGluY2x1ZGUgTWFrZVNlZWRlZFxuICAgICAgICAoc3RydWN0XG4gICAgICAgICAgdHlwZSB0ID0gSDEudFxuICAgICAgICAgIGxldCBlcXVhbCA9IEgxLmVxdWFsXG4gICAgICAgICAgbGV0IHNlZWRlZF9oYXNoIChfc2VlZDogaW50KSB4ID0gSDEuaGFzaCB4XG4gICAgICAgIGVuZClcbiAgICAgICAgKHN0cnVjdFxuICAgICAgICAgIHR5cGUgdCA9IEgyLnRcbiAgICAgICAgICBsZXQgZXF1YWwgPSBIMi5lcXVhbFxuICAgICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEgyLmhhc2ggeFxuICAgICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4gIG1vZHVsZSBCdWNrZXQgPSBzdHJ1Y3RcblxuICAgIHR5cGUgbm9ucmVjICgnazEsICdrMiwgJ2QpIHQgPSAoJ2sxLCAnazIsICdkKSB0IGxpc3QgcmVmXG4gICAgbGV0IGsyX21ha2UgPSBtYWtlXG4gICAgbGV0IG1ha2UgKCkgPSByZWYgW11cbiAgICBsZXQgYWRkIGIgazEgazIgZCA9IGIgOj0gazJfbWFrZSBrMSBrMiBkIDo6ICFiXG5cbiAgICBsZXQgdGVzdF9rZXlzIGsxIGsyIGUgPVxuICAgICAgbWF0Y2ggZ2V0X2tleTEgZSwgZ2V0X2tleTIgZSB3aXRoXG4gICAgICB8IFNvbWUgeDEsIFNvbWUgeDIgd2hlbiB4MSA9PSBrMSAmJiB4MiA9PSBrMiAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcblxuICAgIGxldCByZW1vdmUgYiBrMSBrMiA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5cyBrMSBrMiBoIC0+IGIgOj0gTGlzdC5yZXZfYXBwZW5kIGFjYyB0XG4gICAgICAgIHwgaCA6OiB0IC0+IGxvb3AgdCAoaCA6OiBhY2MpXG4gICAgICBpblxuICAgICAgbG9vcCAhYiBbXVxuXG4gICAgbGV0IGZpbmQgYiBrMSBrMiA9XG4gICAgICBtYXRjaCBMaXN0LmZpbmRfb3B0ICh0ZXN0X2tleXMgazEgazIpICFiIHdpdGhcbiAgICAgIHwgU29tZSBlIC0+IGdldF9kYXRhIGVcbiAgICAgIHwgTm9uZSAtPiBOb25lXG5cbiAgICBsZXQgbGVuZ3RoIGIgPSBMaXN0Lmxlbmd0aCAhYlxuICAgIGxldCBjbGVhciBiID0gYiA6PSBbXVxuXG4gIGVuZFxuXG5lbmRcblxubW9kdWxlIEtuID0gc3RydWN0XG4gIHR5cGUgKCdrLCdkKSB0ID0gT2JqRXBoLnRcblxuICBsZXQgY3JlYXRlIG4gOiAoJ2ssJ2QpIHQgPSBPYmpFcGguY3JlYXRlIG5cbiAgbGV0IGxlbmd0aCAoazooJ2ssJ2QpIHQpIDogaW50ID0gT2JqRXBoLmxlbmd0aCBrXG5cbiAgbGV0IGdldF9rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIDogJ2sgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCBuKVxuICBsZXQgc2V0X2tleSAodDooJ2ssJ2QpIHQpIChuOmludCkgKGs6J2spIDogdW5pdCA9XG4gICAgT2JqRXBoLnNldF9rZXkgdCBuIChPYmoucmVwciBrKVxuICBsZXQgY2hlY2tfa2V5ICh0OignaywnZCkgdCkgKG46aW50KSA6IGJvb2wgPSBPYmpFcGguY2hlY2tfa2V5IHQgblxuXG4gIGxldCBnZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBzZXRfZGF0YSAodDooJ2ssJ2QpIHQpIChkOidkKSA6IHVuaXQgPSBPYmpFcGguc2V0X2RhdGEgdCAoT2JqLnJlcHIgZClcbiAgbGV0IHVuc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSA6IHVuaXQgPSBPYmpFcGgudW5zZXRfZGF0YSB0XG5cbiAgbGV0IG1ha2Uga2V5cyBkYXRhID1cbiAgICBsZXQgbCA9IEFycmF5Lmxlbmd0aCBrZXlzIGluXG4gICAgbGV0IGVwaCA9IGNyZWF0ZSBsIGluXG4gICAgc2V0X2RhdGEgZXBoIGRhdGE7XG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHNldF9rZXkgZXBoIGkga2V5cy4oaSkgZG9uZTtcbiAgICBlcGhcblxuICBsZXQgcXVlcnkgZXBoIGtleXMgPVxuICAgIGxldCBsID0gbGVuZ3RoIGVwaCBpblxuICAgIHRyeVxuICAgICAgaWYgbCA8PiBBcnJheS5sZW5ndGgga2V5cyB0aGVuIHJhaXNlIEV4aXQ7XG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZ2V0X2tleSBlcGggaSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiByYWlzZSBFeGl0XG4gICAgICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXlzLihpKSAtPiAoKVxuICAgICAgICB8IFNvbWUgXyAtPiByYWlzZSBFeGl0XG4gICAgICBkb25lO1xuICAgICAgZ2V0X2RhdGEgZXBoXG4gICAgd2l0aCBFeGl0IC0+IE5vbmVcblxuICBtb2R1bGUgTWFrZVNlZWRlZCAoSDpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpID1cbiAgICBHZW5IYXNoVGFibGUuTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgY29udGFpbmVyID0gKEgudCwnYSkgdFxuICAgICAgdHlwZSB0ID0gSC50IGFycmF5XG4gICAgICBsZXQgY3JlYXRlIGsgZCA9XG4gICAgICAgIGxldCBjID0gY3JlYXRlIChBcnJheS5sZW5ndGggaykgaW5cbiAgICAgICAgc2V0X2RhdGEgYyBkO1xuICAgICAgICBmb3IgaT0wIHRvIEFycmF5Lmxlbmd0aCBrIC0xIGRvXG4gICAgICAgICAgc2V0X2tleSBjIGkgay4oaSk7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIGNcbiAgICAgIGxldCBzZWVkZWRfaGFzaCBzZWVkIGsgPVxuICAgICAgICBsZXQgaCA9IHJlZiAwIGluXG4gICAgICAgIGZvciBpPTAgdG8gQXJyYXkubGVuZ3RoIGsgLTEgZG9cbiAgICAgICAgICBoIDo9IEguc2VlZGVkX2hhc2ggc2VlZCBrLihpKSAqIDY1NTk5ICsgIWg7XG4gICAgICAgIGRvbmU7XG4gICAgICAgICFoXG4gICAgICBsZXQgZXF1YWwgYyBrID1cbiAgICAgICAgbGV0IGxlbiAgPSBBcnJheS5sZW5ndGggayBpblxuICAgICAgICBsZXQgbGVuJyA9IGxlbmd0aCBjIGluXG4gICAgICAgIGlmIGxlbiAhPSBsZW4nIHRoZW4gR2VuSGFzaFRhYmxlLkVGYWxzZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgbGV0IHJlYyBlcXVhbF9hcnJheSBrIGMgaSA9XG4gICAgICAgICAgICBpZiBpIDwgMCB0aGVuIEdlbkhhc2hUYWJsZS5FVHJ1ZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBtYXRjaCBnZXRfa2V5IGMgaSB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBHZW5IYXNoVGFibGUuRURlYWRcbiAgICAgICAgICAgICAgfCBTb21lIGtpIC0+XG4gICAgICAgICAgICAgICAgICBpZiBILmVxdWFsIGsuKGkpIGtpXG4gICAgICAgICAgICAgICAgICB0aGVuIGVxdWFsX2FycmF5IGsgYyAoaS0xKVxuICAgICAgICAgICAgICAgICAgZWxzZSBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICAgICAgaW5cbiAgICAgICAgICBlcXVhbF9hcnJheSBrIGMgKGxlbi0xKVxuICAgICAgbGV0IGdldF9kYXRhID0gZ2V0X2RhdGFcbiAgICAgIGxldCBzZXRfa2V5X2RhdGEgYyBrIGQgPVxuICAgICAgICB1bnNldF9kYXRhIGM7XG4gICAgICAgIGZvciBpPTAgdG8gQXJyYXkubGVuZ3RoIGsgLTEgZG9cbiAgICAgICAgICBzZXRfa2V5IGMgaSBrLihpKTtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgc2V0X2RhdGEgYyBkXG4gICAgICBsZXQgY2hlY2tfa2V5IGMgPVxuICAgICAgICBsZXQgcmVjIGNoZWNrIGMgaSA9XG4gICAgICAgICAgaSA8IDAgfHwgKGNoZWNrX2tleSBjIGkgJiYgY2hlY2sgYyAoaS0xKSkgaW5cbiAgICAgICAgY2hlY2sgYyAobGVuZ3RoIGMgLSAxKVxuICAgIGVuZClcblxuICBtb2R1bGUgTWFrZShIOiBIYXNodGJsLkhhc2hlZFR5cGUpOiAoUyB3aXRoIHR5cGUga2V5ID0gSC50IGFycmF5KSA9XG4gIHN0cnVjdFxuICAgIGluY2x1ZGUgTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgICAgdHlwZSB0ID0gSC50XG4gICAgICAgIGxldCBlcXVhbCA9IEguZXF1YWxcbiAgICAgICAgbGV0IHNlZWRlZF9oYXNoIChfc2VlZDogaW50KSB4ID0gSC5oYXNoIHhcbiAgICAgIGVuZClcbiAgICBsZXQgY3JlYXRlIHN6ID0gY3JlYXRlIH5yYW5kb206ZmFsc2Ugc3pcbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcbiAgZW5kXG5cbiAgbW9kdWxlIEJ1Y2tldCA9IHN0cnVjdFxuXG4gICAgdHlwZSBub25yZWMgKCdrLCAnZCkgdCA9ICgnaywgJ2QpIHQgbGlzdCByZWZcbiAgICBsZXQga25fbWFrZSA9IG1ha2VcbiAgICBsZXQgbWFrZSAoKSA9IHJlZiBbXVxuICAgIGxldCBhZGQgYiBrIGQgPSBiIDo9IGtuX21ha2UgayBkIDo6ICFiXG5cbiAgICBsZXQgdGVzdF9rZXlzIGsgZSA9XG4gICAgICB0cnlcbiAgICAgICAgaWYgbGVuZ3RoIGUgPD4gQXJyYXkubGVuZ3RoIGsgdGhlbiByYWlzZSBFeGl0O1xuICAgICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGsgLSAxIGRvXG4gICAgICAgICAgbWF0Y2ggZ2V0X2tleSBlIGkgd2l0aFxuICAgICAgICAgIHwgU29tZSB4IHdoZW4geCA9PSBrLihpKSAtPiAoKVxuICAgICAgICAgIHwgXyAtPiByYWlzZSBFeGl0XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHRydWVcbiAgICAgIHdpdGggRXhpdCAtPiBmYWxzZVxuXG4gICAgbGV0IHJlbW92ZSBiIGsgPVxuICAgICAgbGV0IHJlYyBsb29wIGwgYWNjID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgW10gLT4gKClcbiAgICAgICAgfCBoIDo6IHQgd2hlbiB0ZXN0X2tleXMgayBoIC0+IGIgOj0gTGlzdC5yZXZfYXBwZW5kIGFjYyB0XG4gICAgICAgIHwgaCA6OiB0IC0+IGxvb3AgdCAoaCA6OiBhY2MpXG4gICAgICBpblxuICAgICAgbG9vcCAhYiBbXVxuXG4gICAgbGV0IGZpbmQgYiBrID1cbiAgICAgIG1hdGNoIExpc3QuZmluZF9vcHQgKHRlc3Rfa2V5cyBrKSAhYiB3aXRoXG4gICAgICB8IFNvbWUgZSAtPiBnZXRfZGF0YSBlXG4gICAgICB8IE5vbmUgLT4gTm9uZVxuXG4gICAgbGV0IGxlbmd0aCBiID0gTGlzdC5sZW5ndGggIWJcbiAgICBsZXQgY2xlYXIgYiA9IGIgOj0gW11cblxuICBlbmRcblxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgWGF2aWVyIExlcm95IGFuZCBEYW1pZW4gRG9saWdleiwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmxldCBnZW5lcmljX3F1b3RlIHF1b3RlcXVvdGUgcyA9XG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAobCArIDIwKSBpblxuICBCdWZmZXIuYWRkX2NoYXIgYiAnXFwnJztcbiAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgaWYgcy5baV0gPSAnXFwnJ1xuICAgIHRoZW4gQnVmZmVyLmFkZF9zdHJpbmcgYiBxdW90ZXF1b3RlXG4gICAgZWxzZSBCdWZmZXIuYWRkX2NoYXIgYiAgcy5baV1cbiAgZG9uZTtcbiAgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcJyc7XG4gIEJ1ZmZlci5jb250ZW50cyBiXG5cbigqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgT3BlbiBHcm91cCBzcGVjaWZpY2F0aW9uIGZvdW5kIGhlcmU6XG4gIFtbMV1dIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9iYXNlbmFtZS5odG1sXG4gIEluIHN0ZXAgMSBvZiBbWzFdXSwgd2UgY2hvb3NlIHRvIHJldHVybiBcIi5cIiBmb3IgZW1wdHkgaW5wdXQuXG4gICAgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgT0NhbWwpXG4gIEluIHN0ZXAgMiwgd2UgY2hvb3NlIHRvIHByb2Nlc3MgXCIvL1wiIG5vcm1hbGx5LlxuICBTdGVwIDYgaXMgbm90IGltcGxlbWVudGVkOiB3ZSBjb25zaWRlciB0aGF0IHRoZSBbc3VmZml4XSBvcGVyYW5kIGlzXG4gICAgYWx3YXlzIGFic2VudC4gIFN1ZmZpeGVzIGFyZSBoYW5kbGVkIGJ5IFtjaG9wX3N1ZmZpeF0gYW5kIFtjaG9wX2V4dGVuc2lvbl0uXG4qKVxubGV0IGdlbmVyaWNfYmFzZW5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lIG5hbWUgPVxuICBsZXQgcmVjIGZpbmRfZW5kIG4gPVxuICAgIGlmIG4gPCAwIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgMVxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiBmaW5kX2VuZCAobiAtIDEpXG4gICAgZWxzZSBmaW5kX2JlZyBuIChuICsgMSlcbiAgYW5kIGZpbmRfYmVnIG4gcCA9XG4gICAgaWYgbiA8IDAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCBwXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIFN0cmluZy5zdWIgbmFtZSAobiArIDEpIChwIC0gbiAtIDEpXG4gICAgZWxzZSBmaW5kX2JlZyAobiAtIDEpIHBcbiAgaW5cbiAgaWYgbmFtZSA9IFwiXCJcbiAgdGhlbiBjdXJyZW50X2Rpcl9uYW1lXG4gIGVsc2UgZmluZF9lbmQgKFN0cmluZy5sZW5ndGggbmFtZSAtIDEpXG5cbigqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgT3BlbiBHcm91cCBzcGVjaWZpY2F0aW9uIGZvdW5kIGhlcmU6XG4gIFtbMl1dIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9kaXJuYW1lLmh0bWxcbiAgSW4gc3RlcCA2IG9mIFtbMl1dLCB3ZSBjaG9vc2UgdG8gcHJvY2VzcyBcIi8vXCIgbm9ybWFsbHkuXG4qKVxubGV0IGdlbmVyaWNfZGlybmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgbmFtZSA9XG4gIGxldCByZWMgdHJhaWxpbmdfc2VwIG4gPVxuICAgIGlmIG4gPCAwIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgMVxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiB0cmFpbGluZ19zZXAgKG4gLSAxKVxuICAgIGVsc2UgYmFzZSBuXG4gIGFuZCBiYXNlIG4gPVxuICAgIGlmIG4gPCAwIHRoZW4gY3VycmVudF9kaXJfbmFtZVxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiBpbnRlcm1lZGlhdGVfc2VwIG5cbiAgICBlbHNlIGJhc2UgKG4gLSAxKVxuICBhbmQgaW50ZXJtZWRpYXRlX3NlcCBuID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIDFcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gaW50ZXJtZWRpYXRlX3NlcCAobiAtIDEpXG4gICAgZWxzZSBTdHJpbmcuc3ViIG5hbWUgMCAobiArIDEpXG4gIGluXG4gIGlmIG5hbWUgPSBcIlwiXG4gIHRoZW4gY3VycmVudF9kaXJfbmFtZVxuICBlbHNlIHRyYWlsaW5nX3NlcCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gMSlcblxubW9kdWxlIHR5cGUgU1lTREVQUyA9IHNpZ1xuICB2YWwgbnVsbCA6IHN0cmluZ1xuICB2YWwgY3VycmVudF9kaXJfbmFtZSA6IHN0cmluZ1xuICB2YWwgcGFyZW50X2Rpcl9uYW1lIDogc3RyaW5nXG4gIHZhbCBkaXJfc2VwIDogc3RyaW5nXG4gIHZhbCBpc19kaXJfc2VwIDogc3RyaW5nIC0+IGludCAtPiBib29sXG4gIHZhbCBpc19yZWxhdGl2ZSA6IHN0cmluZyAtPiBib29sXG4gIHZhbCBpc19pbXBsaWNpdCA6IHN0cmluZyAtPiBib29sXG4gIHZhbCBjaGVja19zdWZmaXggOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2xcbiAgdmFsIGNob3Bfc3VmZml4X29wdCA6IHN1ZmZpeDpzdHJpbmcgLT4gc3RyaW5nIC0+IHN0cmluZyBvcHRpb25cbiAgdmFsIHRlbXBfZGlyX25hbWUgOiBzdHJpbmdcbiAgdmFsIHF1b3RlIDogc3RyaW5nIC0+IHN0cmluZ1xuICB2YWwgcXVvdGVfY29tbWFuZCA6XG4gICAgc3RyaW5nIC0+ID9zdGRpbjogc3RyaW5nIC0+ID9zdGRvdXQ6IHN0cmluZyAtPiA/c3RkZXJyOiBzdHJpbmdcbiAgICAgICAgICAgLT4gc3RyaW5nIGxpc3QgLT4gc3RyaW5nXG4gIHZhbCBiYXNlbmFtZSA6IHN0cmluZyAtPiBzdHJpbmdcbiAgdmFsIGRpcm5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nXG5lbmRcblxubW9kdWxlIFVuaXggOiBTWVNERVBTID0gc3RydWN0XG4gIGxldCBudWxsID0gXCIvZGV2L251bGxcIlxuICBsZXQgY3VycmVudF9kaXJfbmFtZSA9IFwiLlwiXG4gIGxldCBwYXJlbnRfZGlyX25hbWUgPSBcIi4uXCJcbiAgbGV0IGRpcl9zZXAgPSBcIi9cIlxuICBsZXQgaXNfZGlyX3NlcCBzIGkgPSBzLltpXSA9ICcvJ1xuICBsZXQgaXNfcmVsYXRpdmUgbiA9IFN0cmluZy5sZW5ndGggbiA8IDEgfHwgbi5bMF0gPD4gJy8nXG4gIGxldCBpc19pbXBsaWNpdCBuID1cbiAgICBpc19yZWxhdGl2ZSBuXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDIgfHwgU3RyaW5nLnN1YiBuIDAgMiA8PiBcIi4vXCIpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDMgfHwgU3RyaW5nLnN1YiBuIDAgMyA8PiBcIi4uL1wiKVxuICBsZXQgY2hlY2tfc3VmZml4IG5hbWUgc3VmZiA9XG4gICAgU3RyaW5nLmVuZHNfd2l0aCB+c3VmZml4OnN1ZmYgbmFtZVxuXG4gIGxldCBjaG9wX3N1ZmZpeF9vcHQgfnN1ZmZpeCBmaWxlbmFtZSA9XG4gICAgbGV0IGxlbl9zID0gU3RyaW5nLmxlbmd0aCBzdWZmaXggYW5kIGxlbl9mID0gU3RyaW5nLmxlbmd0aCBmaWxlbmFtZSBpblxuICAgIGlmIGxlbl9mID49IGxlbl9zIHRoZW5cbiAgICAgIGxldCByID0gU3RyaW5nLnN1YiBmaWxlbmFtZSAobGVuX2YgLSBsZW5fcykgbGVuX3MgaW5cbiAgICAgIGlmIHIgPSBzdWZmaXggdGhlblxuICAgICAgICBTb21lIChTdHJpbmcuc3ViIGZpbGVuYW1lIDAgKGxlbl9mIC0gbGVuX3MpKVxuICAgICAgZWxzZVxuICAgICAgICBOb25lXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG4gIGxldCB0ZW1wX2Rpcl9uYW1lID1cbiAgICB0cnkgU3lzLmdldGVudiBcIlRNUERJUlwiIHdpdGggTm90X2ZvdW5kIC0+IFwiL3RtcFwiXG4gIGxldCBxdW90ZSA9IGdlbmVyaWNfcXVvdGUgXCInXFxcXCcnXCJcbiAgbGV0IHF1b3RlX2NvbW1hbmQgY21kID9zdGRpbiA/c3Rkb3V0ID9zdGRlcnIgYXJncyA9XG4gICAgU3RyaW5nLmNvbmNhdCBcIiBcIiAoTGlzdC5tYXAgcXVvdGUgKGNtZCA6OiBhcmdzKSlcbiAgICBeIChtYXRjaCBzdGRpbiAgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT4gXCIgPFwiIF4gcXVvdGUgZilcbiAgICBeIChtYXRjaCBzdGRvdXQgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT4gXCIgPlwiIF4gcXVvdGUgZilcbiAgICBeIChtYXRjaCBzdGRlcnIgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT4gaWYgc3RkZXJyID0gc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIFwiIDI+JjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcIiAyPlwiIF4gcXVvdGUgZilcbiAgbGV0IGJhc2VuYW1lID0gZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWVcbiAgbGV0IGRpcm5hbWUgPSBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG5lbmRcblxubW9kdWxlIFdpbjMyIDogU1lTREVQUyA9IHN0cnVjdFxuICBsZXQgbnVsbCA9IFwiTlVMXCJcbiAgbGV0IGN1cnJlbnRfZGlyX25hbWUgPSBcIi5cIlxuICBsZXQgcGFyZW50X2Rpcl9uYW1lID0gXCIuLlwiXG4gIGxldCBkaXJfc2VwID0gXCJcXFxcXCJcbiAgbGV0IGlzX2Rpcl9zZXAgcyBpID0gbGV0IGMgPSBzLltpXSBpbiBjID0gJy8nIHx8IGMgPSAnXFxcXCcgfHwgYyA9ICc6J1xuICBsZXQgaXNfcmVsYXRpdmUgbiA9XG4gICAgKFN0cmluZy5sZW5ndGggbiA8IDEgfHwgbi5bMF0gPD4gJy8nKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAxIHx8IG4uWzBdIDw+ICdcXFxcJylcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMiB8fCBuLlsxXSA8PiAnOicpXG4gIGxldCBpc19pbXBsaWNpdCBuID1cbiAgICBpc19yZWxhdGl2ZSBuXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDIgfHwgU3RyaW5nLnN1YiBuIDAgMiA8PiBcIi4vXCIpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDIgfHwgU3RyaW5nLnN1YiBuIDAgMiA8PiBcIi5cXFxcXCIpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDMgfHwgU3RyaW5nLnN1YiBuIDAgMyA8PiBcIi4uL1wiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAzIHx8IFN0cmluZy5zdWIgbiAwIDMgPD4gXCIuLlxcXFxcIilcbiAgbGV0IGNoZWNrX3N1ZmZpeCBuYW1lIHN1ZmYgPVxuICAgU3RyaW5nLmxlbmd0aCBuYW1lID49IFN0cmluZy5sZW5ndGggc3VmZiAmJlxuICAgKGxldCBzID0gU3RyaW5nLnN1YiBuYW1lIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBTdHJpbmcubGVuZ3RoIHN1ZmYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZy5sZW5ndGggc3VmZikgaW5cbiAgICBTdHJpbmcubG93ZXJjYXNlX2FzY2lpIHMgPSBTdHJpbmcubG93ZXJjYXNlX2FzY2lpIHN1ZmYpXG5cbiAgbGV0IGNob3Bfc3VmZml4X29wdCB+c3VmZml4IGZpbGVuYW1lID1cbiAgICBsZXQgbGVuX3MgPSBTdHJpbmcubGVuZ3RoIHN1ZmZpeCBhbmQgbGVuX2YgPSBTdHJpbmcubGVuZ3RoIGZpbGVuYW1lIGluXG4gICAgaWYgbGVuX2YgPj0gbGVuX3MgdGhlblxuICAgICAgbGV0IHIgPSBTdHJpbmcuc3ViIGZpbGVuYW1lIChsZW5fZiAtIGxlbl9zKSBsZW5fcyBpblxuICAgICAgaWYgU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSByID0gU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSBzdWZmaXggdGhlblxuICAgICAgICBTb21lIChTdHJpbmcuc3ViIGZpbGVuYW1lIDAgKGxlbl9mIC0gbGVuX3MpKVxuICAgICAgZWxzZVxuICAgICAgICBOb25lXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5cbiAgbGV0IHRlbXBfZGlyX25hbWUgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiVEVNUFwiIHdpdGggTm90X2ZvdW5kIC0+IFwiLlwiXG4gIGxldCBxdW90ZSBzID1cbiAgICBsZXQgbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAobCArIDIwKSBpblxuICAgIEJ1ZmZlci5hZGRfY2hhciBiICdcXFwiJztcbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbCB0aGVuIEJ1ZmZlci5hZGRfY2hhciBiICdcXFwiJyBlbHNlXG4gICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICB8ICdcXFwiJyAtPiBsb29wX2JzIDAgaTtcbiAgICAgIHwgJ1xcXFwnIC0+IGxvb3BfYnMgMCBpO1xuICAgICAgfCBjICAgIC0+IEJ1ZmZlci5hZGRfY2hhciBiIGM7IGxvb3AgKGkrMSk7XG4gICAgYW5kIGxvb3BfYnMgbiBpID1cbiAgICAgIGlmIGkgPSBsIHRoZW4gYmVnaW5cbiAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXCInO1xuICAgICAgICBhZGRfYnMgbjtcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICAgICAgfCAnXFxcIicgLT4gYWRkX2JzICgyKm4rMSk7IEJ1ZmZlci5hZGRfY2hhciBiICdcXFwiJzsgbG9vcCAoaSsxKTtcbiAgICAgICAgfCAnXFxcXCcgLT4gbG9vcF9icyAobisxKSAoaSsxKTtcbiAgICAgICAgfCBfICAgIC0+IGFkZF9icyBuOyBsb29wIGlcbiAgICAgIGVuZFxuICAgIGFuZCBhZGRfYnMgbiA9IGZvciBfaiA9IDEgdG8gbiBkbyBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcXCc7IGRvbmVcbiAgICBpblxuICAgIGxvb3AgMDtcbiAgICBCdWZmZXIuY29udGVudHMgYlxuKCpcblF1b3RpbmcgY29tbWFuZHMgZm9yIGV4ZWN1dGlvbiBieSBjbWQuZXhlIGlzIGRpZmZpY3VsdC5cbjEtIEVhY2ggYXJndW1lbnQgaXMgZmlyc3QgcXVvdGVkIHVzaW5nIHRoZSBcInF1b3RlXCIgZnVuY3Rpb24gYWJvdmUsIHRvXG4gICBwcm90ZWN0IGl0IGFnYWluc3QgdGhlIHByb2Nlc3NpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDIHJ1bnRpbWUgc3lzdGVtLFxuICAgdGhlbiBjbWQuZXhlJ3Mgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHdpdGggJ14nLCB1c2luZ1xuICAgdGhlIFwicXVvdGVfY21kXCIgZnVuY3Rpb24gYmVsb3cuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWVcbiAgIGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL3R3aXN0eWxpdHRsZXBhc3NhZ2VzYWxsYWxpa2UvMjAxMS8wNC8yM1xuMi0gVGhlIGNvbW1hbmQgYW5kIHRoZSByZWRpcmVjdGlvbiBmaWxlcywgaWYgYW55LCBtdXN0IGJlIGRvdWJsZS1xdW90ZWRcbiAgIGluIGNhc2UgdGhleSBjb250YWluIHNwYWNlcy4gIFRoaXMgcXVvdGluZyBpcyBpbnRlcnByZXRlZCBieSBjbWQuZXhlLFxuICAgbm90IGJ5IHRoZSBDIHJ1bnRpbWUgc3lzdGVtLCBoZW5jZSB0aGUgXCJxdW90ZVwiIGZ1bmN0aW9uIGFib3ZlXG4gICBjYW5ub3QgYmUgdXNlZC4gIFRoZSB0d28gY2hhcmFjdGVycyB3ZSBkb24ndCBrbm93IGhvdyB0byBxdW90ZVxuICAgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBjbWQuZXhlIHN0cmluZyBhcmUgZG91YmxlLXF1b3RlIGFuZCBwZXJjZW50LlxuICAgV2UganVzdCBmYWlsIGlmIHRoZSBjb21tYW5kIG5hbWUgb3IgdGhlIHJlZGlyZWN0aW9uIGZpbGUgbmFtZXNcbiAgIGNvbnRhaW4gYSBkb3VibGUgcXVvdGUgKG5vdCBhbGxvd2VkIGluIFdpbmRvd3MgZmlsZSBuYW1lcywgYW55d2F5KVxuICAgb3IgYSBwZXJjZW50LiAgU2VlIGZ1bmN0aW9uIFwicXVvdGVfY21kX2ZpbGVuYW1lXCIgYmVsb3cuXG4zLSBUaGUgd2hvbGUgc3RyaW5nIHBhc3NlZCB0byBTeXMuY29tbWFuZCBpcyB0aGVuIGVuY2xvc2VkIGluIGRvdWJsZVxuICAgcXVvdGVzLCB3aGljaCBhcmUgaW1tZWRpYXRlbHkgc3RyaXBwZWQgYnkgY21kLmV4ZS4gIE90aGVyd2lzZSxcbiAgIHNvbWUgb2YgdGhlIGRvdWJsZSBxdW90ZXMgZnJvbSBzdGVwIDIgYWJvdmUgY2FuIGJlIG1pc3BhcnNlZC5cbiAgIFNlZSBlLmcuIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS85OTY1MTQxXG4qKVxuICBsZXQgcXVvdGVfY21kIHMgPVxuICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAoU3RyaW5nLmxlbmd0aCBzICsgMjApIGluXG4gICAgU3RyaW5nLml0ZXJcbiAgICAgIChmdW4gYyAtPlxuICAgICAgICBtYXRjaCBjIHdpdGhcbiAgICAgICAgfCAnKCcgfCAnKScgfCAnIScgfCAnXicgfCAnJScgfCAnXFxcIicgfCAnPCcgfCAnPicgfCAnJicgfCAnfCcgLT5cbiAgICAgICAgICAgIEJ1ZmZlci5hZGRfY2hhciBiICdeJzsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgIEJ1ZmZlci5hZGRfY2hhciBiIGMpXG4gICAgICBzO1xuICAgIEJ1ZmZlci5jb250ZW50cyBiXG4gIGxldCBxdW90ZV9jbWRfZmlsZW5hbWUgZiA9XG4gICAgaWYgU3RyaW5nLmNvbnRhaW5zIGYgJ1xcXCInIHx8IFN0cmluZy5jb250YWlucyBmICclJyB0aGVuXG4gICAgICBmYWlsd2l0aCAoXCJGaWxlbmFtZS5xdW90ZV9jb21tYW5kOiBiYWQgZmlsZSBuYW1lIFwiIF4gZilcbiAgICBlbHNlIGlmIFN0cmluZy5jb250YWlucyBmICcgJyB0aGVuXG4gICAgICBcIlxcXCJcIiBeIGYgXiBcIlxcXCJcIlxuICAgIGVsc2VcbiAgICAgIGZcbiAgKCogUmVkaXJlY3Rpb25zIGluIGNtZC5leGU6IHNlZSBodHRwczovL3NzNjQuY29tL250L3N5bnRheC1yZWRpcmVjdGlvbi5odG1sXG4gICAgIGFuZCBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wcmV2aW91cy12ZXJzaW9ucy93aW5kb3dzL2l0LXByby93aW5kb3dzLXhwL2JiNDkwOTgyKHY9dGVjaG5ldC4xMClcbiAgKilcbiAgbGV0IHF1b3RlX2NvbW1hbmQgY21kID9zdGRpbiA/c3Rkb3V0ID9zdGRlcnIgYXJncyA9XG4gICAgU3RyaW5nLmNvbmNhdCBcIlwiIFtcbiAgICAgIFwiXFxcIlwiO1xuICAgICAgcXVvdGVfY21kX2ZpbGVuYW1lIGNtZDtcbiAgICAgIFwiIFwiO1xuICAgICAgcXVvdGVfY21kIChTdHJpbmcuY29uY2F0IFwiIFwiIChMaXN0Lm1hcCBxdW90ZSBhcmdzKSk7XG4gICAgICAobWF0Y2ggc3RkaW4gIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiIDxcIiBeIHF1b3RlX2NtZF9maWxlbmFtZSBmKTtcbiAgICAgIChtYXRjaCBzdGRvdXQgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT4gXCIgPlwiIF4gcXVvdGVfY21kX2ZpbGVuYW1lIGYpO1xuICAgICAgKG1hdGNoIHN0ZGVyciB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN0ZGVyciA9IHN0ZG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gXCIgMj4mMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcIiAyPlwiIF4gcXVvdGVfY21kX2ZpbGVuYW1lIGYpO1xuICAgICAgXCJcXFwiXCJcbiAgICBdXG4gIGxldCBoYXNfZHJpdmUgcyA9XG4gICAgbGV0IGlzX2xldHRlciA9IGZ1bmN0aW9uXG4gICAgICB8ICdBJyAuLiAnWicgfCAnYScgLi4gJ3onIC0+IHRydWVcbiAgICAgIHwgXyAtPiBmYWxzZVxuICAgIGluXG4gICAgU3RyaW5nLmxlbmd0aCBzID49IDIgJiYgaXNfbGV0dGVyIHMuWzBdICYmIHMuWzFdID0gJzonXG4gIGxldCBkcml2ZV9hbmRfcGF0aCBzID1cbiAgICBpZiBoYXNfZHJpdmUgc1xuICAgIHRoZW4gKFN0cmluZy5zdWIgcyAwIDIsIFN0cmluZy5zdWIgcyAyIChTdHJpbmcubGVuZ3RoIHMgLSAyKSlcbiAgICBlbHNlIChcIlwiLCBzKVxuICBsZXQgZGlybmFtZSBzID1cbiAgICBsZXQgKGRyaXZlLCBwYXRoKSA9IGRyaXZlX2FuZF9wYXRoIHMgaW5cbiAgICBsZXQgZGlyID0gZ2VuZXJpY19kaXJuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZSBwYXRoIGluXG4gICAgZHJpdmUgXiBkaXJcbiAgbGV0IGJhc2VuYW1lIHMgPVxuICAgIGxldCAoX2RyaXZlLCBwYXRoKSA9IGRyaXZlX2FuZF9wYXRoIHMgaW5cbiAgICBnZW5lcmljX2Jhc2VuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZSBwYXRoXG5lbmRcblxubW9kdWxlIEN5Z3dpbiA6IFNZU0RFUFMgPSBzdHJ1Y3RcbiAgbGV0IG51bGwgPSBcIi9kZXYvbnVsbFwiXG4gIGxldCBjdXJyZW50X2Rpcl9uYW1lID0gXCIuXCJcbiAgbGV0IHBhcmVudF9kaXJfbmFtZSA9IFwiLi5cIlxuICBsZXQgZGlyX3NlcCA9IFwiL1wiXG4gIGxldCBpc19kaXJfc2VwID0gV2luMzIuaXNfZGlyX3NlcFxuICBsZXQgaXNfcmVsYXRpdmUgPSBXaW4zMi5pc19yZWxhdGl2ZVxuICBsZXQgaXNfaW1wbGljaXQgPSBXaW4zMi5pc19pbXBsaWNpdFxuICBsZXQgY2hlY2tfc3VmZml4ID0gV2luMzIuY2hlY2tfc3VmZml4XG4gIGxldCBjaG9wX3N1ZmZpeF9vcHQgPSBXaW4zMi5jaG9wX3N1ZmZpeF9vcHRcbiAgbGV0IHRlbXBfZGlyX25hbWUgPSBVbml4LnRlbXBfZGlyX25hbWVcbiAgbGV0IHF1b3RlID0gVW5peC5xdW90ZVxuICBsZXQgcXVvdGVfY29tbWFuZCA9IFVuaXgucXVvdGVfY29tbWFuZFxuICBsZXQgYmFzZW5hbWUgPSBnZW5lcmljX2Jhc2VuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZVxuICBsZXQgZGlybmFtZSA9IGdlbmVyaWNfZGlybmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWVcbmVuZFxuXG5tb2R1bGUgU3lzZGVwcyA9XG4gICh2YWwgKG1hdGNoIFN5cy5vc190eXBlIHdpdGhcbiAgICAgICB8IFwiV2luMzJcIiAtPiAobW9kdWxlIFdpbjMyOiBTWVNERVBTKVxuICAgICAgIHwgXCJDeWd3aW5cIiAtPiAobW9kdWxlIEN5Z3dpbjogU1lTREVQUylcbiAgICAgICB8IF8gLT4gKG1vZHVsZSBVbml4OiBTWVNERVBTKSkpXG5cbmluY2x1ZGUgU3lzZGVwc1xuXG5sZXQgY29uY2F0IGRpcm5hbWUgZmlsZW5hbWUgPVxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggZGlybmFtZSBpblxuICBpZiBsID0gMCB8fCBpc19kaXJfc2VwIGRpcm5hbWUgKGwtMSlcbiAgdGhlbiBkaXJuYW1lIF4gZmlsZW5hbWVcbiAgZWxzZSBkaXJuYW1lIF4gZGlyX3NlcCBeIGZpbGVuYW1lXG5cbmxldCBjaG9wX3N1ZmZpeCBuYW1lIHN1ZmYgPVxuICBpZiBjaGVja19zdWZmaXggbmFtZSBzdWZmXG4gIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgKFN0cmluZy5sZW5ndGggbmFtZSAtIFN0cmluZy5sZW5ndGggc3VmZilcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkZpbGVuYW1lLmNob3Bfc3VmZml4XCJcblxubGV0IGV4dGVuc2lvbl9sZW4gbmFtZSA9XG4gIGxldCByZWMgY2hlY2sgaTAgaSA9XG4gICAgaWYgaSA8IDAgfHwgaXNfZGlyX3NlcCBuYW1lIGkgdGhlbiAwXG4gICAgZWxzZSBpZiBuYW1lLltpXSA9ICcuJyB0aGVuIGNoZWNrIGkwIChpIC0gMSlcbiAgICBlbHNlIFN0cmluZy5sZW5ndGggbmFtZSAtIGkwXG4gIGluXG4gIGxldCByZWMgc2VhcmNoX2RvdCBpID1cbiAgICBpZiBpIDwgMCB8fCBpc19kaXJfc2VwIG5hbWUgaSB0aGVuIDBcbiAgICBlbHNlIGlmIG5hbWUuW2ldID0gJy4nIHRoZW4gY2hlY2sgaSAoaSAtIDEpXG4gICAgZWxzZSBzZWFyY2hfZG90IChpIC0gMSlcbiAgaW5cbiAgc2VhcmNoX2RvdCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gMSlcblxubGV0IGV4dGVuc2lvbiBuYW1lID1cbiAgbGV0IGwgPSBleHRlbnNpb25fbGVuIG5hbWUgaW5cbiAgaWYgbCA9IDAgdGhlbiBcIlwiIGVsc2UgU3RyaW5nLnN1YiBuYW1lIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBsKSBsXG5cbmxldCBjaG9wX2V4dGVuc2lvbiBuYW1lID1cbiAgbGV0IGwgPSBleHRlbnNpb25fbGVuIG5hbWUgaW5cbiAgaWYgbCA9IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZpbGVuYW1lLmNob3BfZXh0ZW5zaW9uXCJcbiAgZWxzZSBTdHJpbmcuc3ViIG5hbWUgMCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gbClcblxubGV0IHJlbW92ZV9leHRlbnNpb24gbmFtZSA9XG4gIGxldCBsID0gZXh0ZW5zaW9uX2xlbiBuYW1lIGluXG4gIGlmIGwgPSAwIHRoZW4gbmFtZSBlbHNlIFN0cmluZy5zdWIgbmFtZSAwIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBsKVxuXG5leHRlcm5hbCBvcGVuX2Rlc2M6IHN0cmluZyAtPiBvcGVuX2ZsYWcgbGlzdCAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX3N5c19vcGVuXCJcbmV4dGVybmFsIGNsb3NlX2Rlc2M6IGludCAtPiB1bml0ID0gXCJjYW1sX3N5c19jbG9zZVwiXG5cbmxldCBwcm5nX2tleSA9XG4gIERvbWFpbi5ETFMubmV3X2tleSBSYW5kb20uU3RhdGUubWFrZV9zZWxmX2luaXRcblxubGV0IHRlbXBfZmlsZV9uYW1lIHRlbXBfZGlyIHByZWZpeCBzdWZmaXggPVxuICBsZXQgcmFuZG9tX3N0YXRlID0gRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkgaW5cbiAgbGV0IHJuZCA9IChSYW5kb20uU3RhdGUuYml0cyByYW5kb21fc3RhdGUpIGxhbmQgMHhGRkZGRkYgaW5cbiAgY29uY2F0IHRlbXBfZGlyIChQcmludGYuc3ByaW50ZiBcIiVzJTA2eCVzXCIgcHJlZml4IHJuZCBzdWZmaXgpXG5cbmxldCBjdXJyZW50X3RlbXBfZGlyX25hbWUgPVxuICBEb21haW4uRExTLm5ld19rZXkgfnNwbGl0X2Zyb21fcGFyZW50OkZ1bi5pZCAoZnVuICgpIC0+IHRlbXBfZGlyX25hbWUpXG5cbmxldCBzZXRfdGVtcF9kaXJfbmFtZSBzID0gRG9tYWluLkRMUy5zZXQgY3VycmVudF90ZW1wX2Rpcl9uYW1lIHNcbmxldCBnZXRfdGVtcF9kaXJfbmFtZSAoKSA9IERvbWFpbi5ETFMuZ2V0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZVxuXG5sZXQgdGVtcF9maWxlID8odGVtcF9kaXIgPSBEb21haW4uRExTLmdldCBjdXJyZW50X3RlbXBfZGlyX25hbWUpIHByZWZpeCBzdWZmaXggPVxuICBsZXQgcmVjIHRyeV9uYW1lIGNvdW50ZXIgPVxuICAgIGxldCBuYW1lID0gdGVtcF9maWxlX25hbWUgdGVtcF9kaXIgcHJlZml4IHN1ZmZpeCBpblxuICAgIHRyeVxuICAgICAgY2xvc2VfZGVzYyhvcGVuX2Rlc2MgbmFtZSBbT3Blbl93cm9ubHk7IE9wZW5fY3JlYXQ7IE9wZW5fZXhjbF0gMG82MDApO1xuICAgICAgbmFtZVxuICAgIHdpdGggU3lzX2Vycm9yIF8gYXMgZSAtPlxuICAgICAgaWYgY291bnRlciA+PSAxMDAwIHRoZW4gcmFpc2UgZSBlbHNlIHRyeV9uYW1lIChjb3VudGVyICsgMSlcbiAgaW4gdHJ5X25hbWUgMFxuXG5sZXQgb3Blbl90ZW1wX2ZpbGUgPyhtb2RlID0gW09wZW5fdGV4dF0pID8ocGVybXMgPSAwbzYwMClcbiAgICA/KHRlbXBfZGlyID0gRG9tYWluLkRMUy5nZXQgY3VycmVudF90ZW1wX2Rpcl9uYW1lKVxuICAgIHByZWZpeCBzdWZmaXggPVxuICBsZXQgcmVjIHRyeV9uYW1lIGNvdW50ZXIgPVxuICAgIGxldCBuYW1lID0gdGVtcF9maWxlX25hbWUgdGVtcF9kaXIgcHJlZml4IHN1ZmZpeCBpblxuICAgIHRyeVxuICAgICAgKG5hbWUsXG4gICAgICAgb3Blbl9vdXRfZ2VuIChPcGVuX3dyb25seTo6T3Blbl9jcmVhdDo6T3Blbl9leGNsOjptb2RlKSBwZXJtcyBuYW1lKVxuICAgIHdpdGggU3lzX2Vycm9yIF8gYXMgZSAtPlxuICAgICAgaWYgY291bnRlciA+PSAxMDAwIHRoZW4gcmFpc2UgZSBlbHNlIHRyeV9uYW1lIChjb3VudGVyICsgMSlcbiAgaW4gdHJ5X25hbWUgMFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBDb21wbGV4IG51bWJlcnMgKilcblxudHlwZSB0ID0geyByZTogZmxvYXQ7IGltOiBmbG9hdCB9XG5cbmxldCB6ZXJvID0geyByZSA9IDAuMDsgaW0gPSAwLjAgfVxubGV0IG9uZSA9IHsgcmUgPSAxLjA7IGltID0gMC4wIH1cbmxldCBpID0geyByZSA9IDAuMDsgaW0gPSAxLjAgfVxuXG5sZXQgYWRkIHggeSA9IHsgcmUgPSB4LnJlICsuIHkucmU7IGltID0geC5pbSArLiB5LmltIH1cblxubGV0IHN1YiB4IHkgPSB7IHJlID0geC5yZSAtLiB5LnJlOyBpbSA9IHguaW0gLS4geS5pbSB9XG5cbmxldCBuZWcgeCA9IHsgcmUgPSAtLiB4LnJlOyBpbSA9IC0uIHguaW0gfVxuXG5sZXQgY29uaiB4ID0geyByZSA9IHgucmU7IGltID0gLS4geC5pbSB9XG5cbmxldCBtdWwgeCB5ID0geyByZSA9IHgucmUgKi4geS5yZSAtLiB4LmltICouIHkuaW07XG4gICAgICAgICAgICAgICAgaW0gPSB4LnJlICouIHkuaW0gKy4geC5pbSAqLiB5LnJlIH1cblxubGV0IGRpdiB4IHkgPVxuICBpZiBhYnNfZmxvYXQgeS5yZSA+PSBhYnNfZmxvYXQgeS5pbSB0aGVuXG4gICAgbGV0IHIgPSB5LmltIC8uIHkucmUgaW5cbiAgICBsZXQgZCA9IHkucmUgKy4gciAqLiB5LmltIGluXG4gICAgeyByZSA9ICh4LnJlICsuIHIgKi4geC5pbSkgLy4gZDtcbiAgICAgIGltID0gKHguaW0gLS4gciAqLiB4LnJlKSAvLiBkIH1cbiAgZWxzZVxuICAgIGxldCByID0geS5yZSAvLiB5LmltIGluXG4gICAgbGV0IGQgPSB5LmltICsuIHIgKi4geS5yZSBpblxuICAgIHsgcmUgPSAociAqLiB4LnJlICsuIHguaW0pIC8uIGQ7XG4gICAgICBpbSA9IChyICouIHguaW0gLS4geC5yZSkgLy4gZCB9XG5cbmxldCBpbnYgeCA9IGRpdiBvbmUgeFxuXG5sZXQgbm9ybTIgeCA9IHgucmUgKi4geC5yZSArLiB4LmltICouIHguaW1cblxubGV0IG5vcm0geCA9IEZsb2F0Lmh5cG90IHgucmUgeC5pbVxuXG5sZXQgYXJnIHggPSBhdGFuMiB4LmltIHgucmVcblxubGV0IHBvbGFyIG4gYSA9IHsgcmUgPSBjb3MgYSAqLiBuOyBpbSA9IHNpbiBhICouIG4gfVxuXG5sZXQgc3FydCB4ID1cbiAgaWYgeC5yZSA9IDAuMCAmJiB4LmltID0gMC4wIHRoZW4geyByZSA9IDAuMDsgaW0gPSAwLjAgfVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBhYnNfZmxvYXQgeC5yZSBhbmQgaSA9IGFic19mbG9hdCB4LmltIGluXG4gICAgbGV0IHcgPVxuICAgICAgaWYgciA+PSBpIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IHEgPSBpIC8uIHIgaW5cbiAgICAgICAgc3FydChyKSAqLiBzcXJ0KDAuNSAqLiAoMS4wICsuIHNxcnQoMS4wICsuIHEgKi4gcSkpKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IHEgPSByIC8uIGkgaW5cbiAgICAgICAgc3FydChpKSAqLiBzcXJ0KDAuNSAqLiAocSArLiBzcXJ0KDEuMCArLiBxICouIHEpKSlcbiAgICAgIGVuZCBpblxuICAgIGlmIHgucmUgPj0gMC4wXG4gICAgdGhlbiB7IHJlID0gdzsgIGltID0gMC41ICouIHguaW0gLy4gdyB9XG4gICAgZWxzZSB7IHJlID0gMC41ICouIGkgLy4gdzsgIGltID0gaWYgeC5pbSA+PSAwLjAgdGhlbiB3IGVsc2UgLS4gdyB9XG4gIGVuZFxuXG5sZXQgZXhwIHggPVxuICBsZXQgZSA9IGV4cCB4LnJlIGluIHsgcmUgPSBlICouIGNvcyB4LmltOyBpbSA9IGUgKi4gc2luIHguaW0gfVxuXG5sZXQgbG9nIHggPSB7IHJlID0gbG9nIChub3JtIHgpOyBpbSA9IGF0YW4yIHguaW0geC5yZSB9XG5cbmxldCBwb3cgeCB5ID0gZXhwIChtdWwgeSAobG9nIHgpKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBpbl9jaGFubmVsXG5cbnR5cGUgb3Blbl9mbGFnID0gU3RkbGliLm9wZW5fZmxhZyA9XG4gIHwgT3Blbl9yZG9ubHlcbiAgfCBPcGVuX3dyb25seVxuICB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdFxuICB8IE9wZW5fdHJ1bmNcbiAgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeVxuICB8IE9wZW5fdGV4dFxuICB8IE9wZW5fbm9uYmxvY2tcblxubGV0IHN0ZGluID0gU3RkbGliLnN0ZGluXG5sZXQgb3Blbl9iaW4gPSBTdGRsaWIub3Blbl9pbl9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9pblxubGV0IG9wZW5fZ2VuID0gU3RkbGliLm9wZW5faW5fZ2VuXG5cbmxldCB3aXRoX29wZW4gb3BlbmZ1biBzIGYgPVxuICBsZXQgaWMgPSBvcGVuZnVuIHMgaW5cbiAgRnVuLnByb3RlY3QgfmZpbmFsbHk6KGZ1biAoKSAtPiBTdGRsaWIuY2xvc2VfaW5fbm9lcnIgaWMpXG4gICAgKGZ1biAoKSAtPiBmIGljKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5faW5fYmluIHMgZlxuXG5sZXQgd2l0aF9vcGVuX3RleHQgcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luIHMgZlxuXG5sZXQgd2l0aF9vcGVuX2dlbiBmbGFncyBwZXJtIHMgZiA9XG4gIHdpdGhfb3BlbiAoU3RkbGliLm9wZW5faW5fZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19pblxubGV0IHBvcyA9IFN0ZGxpYi5MYXJnZUZpbGUucG9zX2luXG5sZXQgbGVuZ3RoID0gU3RkbGliLkxhcmdlRmlsZS5pbl9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX2luXG5sZXQgY2xvc2Vfbm9lcnIgPSBTdGRsaWIuY2xvc2VfaW5fbm9lcnJcblxubGV0IGlucHV0X2NoYXIgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfY2hhciBpYyB3aXRoXG4gIHwgYyAtPiBTb21lIGNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfYnl0ZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9ieXRlIGljIHdpdGhcbiAgfCBuIC0+IFNvbWUgblxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dF9saW5lIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2xpbmUgaWMgd2l0aFxuICB8IHMgLT4gU29tZSBzXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0ID0gU3RkbGliLmlucHV0XG5cbmxldCByZWFsbHlfaW5wdXQgaWMgYnVmIHBvcyBsZW4gPVxuICBtYXRjaCBTdGRsaWIucmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuIHdpdGhcbiAgfCAoKSAtPiBTb21lICgpXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IHJlYWxseV9pbnB1dF9zdHJpbmcgaWMgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dF9zdHJpbmcgaWMgbGVuIHdpdGhcbiAgfCBzIC0+IFNvbWUgc1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbigqIFJlYWQgdXAgdG8gW2xlbl0gYnl0ZXMgaW50byBbYnVmXSwgc3RhcnRpbmcgYXQgW29mc10uIFJldHVybiB0b3RhbCBieXRlc1xuICAgcmVhZC4gKilcbmxldCByZWFkX3VwdG8gaWMgYnVmIG9mcyBsZW4gPVxuICBsZXQgcmVjIGxvb3Agb2ZzIGxlbiA9XG4gICAgaWYgbGVuID0gMCB0aGVuIG9mc1xuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gU3RkbGliLmlucHV0IGljIGJ1ZiBvZnMgbGVuIGluXG4gICAgICBpZiByID0gMCB0aGVuXG4gICAgICAgIG9mc1xuICAgICAgZWxzZVxuICAgICAgICBsb29wIChvZnMgKyByKSAobGVuIC0gcilcbiAgICBlbmRcbiAgaW5cbiAgbG9vcCBvZnMgbGVuIC0gb2ZzXG5cbigqIEJlc3QgZWZmb3J0IGF0dGVtcHQgdG8gcmV0dXJuIGEgYnVmZmVyIHdpdGggPj0gKG9mcyArIG4pIGJ5dGVzIG9mIHN0b3JhZ2UsXG4gICBhbmQgc3VjaCB0aGF0IGl0IGNvaW5jaWRlcyB3aXRoIFtidWZdIGF0IGluZGljZXMgPCBbb2ZzXS5cblxuICAgVGhlIHJldHVybmVkIGJ1ZmZlciBpcyBlcXVhbCB0byBbYnVmXSBpdHNlbGYgaWYgaXQgYWxyZWFkeSBoYXMgc3VmZmljaWVudFxuICAgZnJlZSBzcGFjZS5cblxuICAgVGhlIHJldHVybmVkIGJ1ZmZlciBtYXkgaGF2ZSAqZmV3ZXIqIHRoYW4gW29mcyArIG5dIGJ5dGVzIG9mIHN0b3JhZ2UgaWYgdGhpc1xuICAgbnVtYmVyIGlzID4gW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0uIEhvd2V2ZXIgdGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsXG4gICAqYWx3YXlzKiBoYXZlID4gW29mc10gYnl0ZXMgb2Ygc3RvcmFnZS4gSW4gdGhlIGxpbWl0aW5nIGNhc2Ugd2hlbiBbb2ZzID0gbGVuXG4gICA9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKHNvIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlc2l6ZSB0aGUgYnVmZmVyIGF0XG4gICBhbGwpLCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiAqKVxuXG5sZXQgZW5zdXJlIGJ1ZiBvZnMgbiA9XG4gIGxldCBsZW4gPSBCeXRlcy5sZW5ndGggYnVmIGluXG4gIGlmIGxlbiA+PSBvZnMgKyBuIHRoZW4gYnVmXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgbmV3X2xlbiA9IHJlZiBsZW4gaW5cbiAgICB3aGlsZSAhbmV3X2xlbiA8IG9mcyArIG4gZG9cbiAgICAgIG5ld19sZW4gOj0gMiAqICFuZXdfbGVuICsgMVxuICAgIGRvbmU7XG4gICAgbGV0IG5ld19sZW4gPSAhbmV3X2xlbiBpblxuICAgIGxldCBuZXdfbGVuID1cbiAgICAgIGlmIG5ld19sZW4gPD0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgbmV3X2xlblxuICAgICAgZWxzZSBpZiBvZnMgPCBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICAgIGVsc2VcbiAgICAgICAgZmFpbHdpdGggXCJJbl9jaGFubmVsLmlucHV0X2FsbDogY2hhbm5lbCBjb250ZW50IFxcXG4gICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIHN0cmluZyBsZW5ndGhcIlxuICAgIGluXG4gICAgbGV0IG5ld19idWYgPSBCeXRlcy5jcmVhdGUgbmV3X2xlbiBpblxuICAgIEJ5dGVzLmJsaXQgYnVmIDAgbmV3X2J1ZiAwIG9mcztcbiAgICBuZXdfYnVmXG4gIGVuZFxuXG5sZXQgaW5wdXRfYWxsIGljID1cbiAgbGV0IGNodW5rX3NpemUgPSA2NTUzNiBpbiAoKiBJT19CVUZGRVJfU0laRSAqKVxuICBsZXQgaW5pdGlhbF9zaXplID1cbiAgICB0cnlcbiAgICAgIFN0ZGxpYi5pbl9jaGFubmVsX2xlbmd0aCBpYyAtIFN0ZGxpYi5wb3NfaW4gaWNcbiAgICB3aXRoIFN5c19lcnJvciBfIC0+XG4gICAgICAtMVxuICBpblxuICBsZXQgaW5pdGlhbF9zaXplID0gaWYgaW5pdGlhbF9zaXplIDwgMCB0aGVuIGNodW5rX3NpemUgZWxzZSBpbml0aWFsX3NpemUgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgaWYgaW5pdGlhbF9zaXplIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICBpbml0aWFsX3NpemVcbiAgICBlbHNlXG4gICAgICBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgaW5cbiAgbGV0IGJ1ZiA9IEJ5dGVzLmNyZWF0ZSBpbml0aWFsX3NpemUgaW5cbiAgbGV0IG5yZWFkID0gcmVhZF91cHRvIGljIGJ1ZiAwIGluaXRpYWxfc2l6ZSBpblxuICBpZiBucmVhZCA8IGluaXRpYWxfc2l6ZSB0aGVuICgqIEVPRiByZWFjaGVkLCBidWZmZXIgcGFydGlhbGx5IGZpbGxlZCAqKVxuICAgIEJ5dGVzLnN1Yl9zdHJpbmcgYnVmIDAgbnJlYWRcbiAgZWxzZSBiZWdpbiAoKiBucmVhZCA9IGluaXRpYWxfc2l6ZSwgbWF5YmUgRU9GIHJlYWNoZWQgKilcbiAgICBtYXRjaCBTdGRsaWIuaW5wdXRfY2hhciBpYyB3aXRoXG4gICAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT5cbiAgICAgICAgKCogRU9GIHJlYWNoZWQsIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGZpbGxlZCAqKVxuICAgICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJ1ZlxuICAgIHwgYyAtPlxuICAgICAgICAoKiBFT0Ygbm90IHJlYWNoZWQgKilcbiAgICAgICAgbGV0IHJlYyBsb29wIGJ1ZiBvZnMgPVxuICAgICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG9mcyBjaHVua19zaXplIGluXG4gICAgICAgICAgbGV0IHJlbSA9IEJ5dGVzLmxlbmd0aCBidWYgLSBvZnMgaW5cbiAgICAgICAgICAoKiBbcmVtXSBjYW4gYmUgPCBbY2h1bmtfc2l6ZV0gaWYgYnVmZmVyIHNpemUgY2xvc2UgdG9cbiAgICAgICAgICAgICBbU3lzLm1heF9zdHJpbmdfbGVuZ3RoXSAqKVxuICAgICAgICAgIGxldCByID0gcmVhZF91cHRvIGljIGJ1ZiBvZnMgcmVtIGluXG4gICAgICAgICAgaWYgciA8IHJlbSB0aGVuICgqIEVPRiByZWFjaGVkICopXG4gICAgICAgICAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIChvZnMgKyByKVxuICAgICAgICAgIGVsc2UgKCogciA9IHJlbSAqKVxuICAgICAgICAgICAgbG9vcCBidWYgKG9mcyArIHJlbSlcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGJ1ZiA9IGVuc3VyZSBidWYgbnJlYWQgKGNodW5rX3NpemUgKyAxKSBpblxuICAgICAgICBCeXRlcy5zZXQgYnVmIG5yZWFkIGM7XG4gICAgICAgIGxvb3AgYnVmIChucmVhZCArIDEpXG4gIGVuZFxuXG5sZXQgc2V0X2JpbmFyeV9tb2RlID0gU3RkbGliLnNldF9iaW5hcnlfbW9kZV9pblxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBvdXRfY2hhbm5lbFxuXG50eXBlIG9wZW5fZmxhZyA9IFN0ZGxpYi5vcGVuX2ZsYWcgPVxuICB8IE9wZW5fcmRvbmx5XG4gIHwgT3Blbl93cm9ubHlcbiAgfCBPcGVuX2FwcGVuZFxuICB8IE9wZW5fY3JlYXRcbiAgfCBPcGVuX3RydW5jXG4gIHwgT3Blbl9leGNsXG4gIHwgT3Blbl9iaW5hcnlcbiAgfCBPcGVuX3RleHRcbiAgfCBPcGVuX25vbmJsb2NrXG5cbmxldCBzdGRvdXQgPSBTdGRsaWIuc3Rkb3V0XG5sZXQgc3RkZXJyID0gU3RkbGliLnN0ZGVyclxubGV0IG9wZW5fYmluID0gU3RkbGliLm9wZW5fb3V0X2JpblxubGV0IG9wZW5fdGV4dCA9IFN0ZGxpYi5vcGVuX291dFxubGV0IG9wZW5fZ2VuID0gU3RkbGliLm9wZW5fb3V0X2dlblxuXG5sZXQgd2l0aF9vcGVuIG9wZW5mdW4gcyBmID1cbiAgbGV0IG9jID0gb3BlbmZ1biBzIGluXG4gIEZ1bi5wcm90ZWN0IH5maW5hbGx5OihmdW4gKCkgLT4gU3RkbGliLmNsb3NlX291dF9ub2VyciBvYylcbiAgICAoZnVuICgpIC0+IGYgb2MpXG5cbmxldCB3aXRoX29wZW5fYmluIHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9vdXRfYmluIHMgZlxuXG5sZXQgd2l0aF9vcGVuX3RleHQgcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX291dCBzIGZcblxubGV0IHdpdGhfb3Blbl9nZW4gZmxhZ3MgcGVybSBzIGYgPVxuICB3aXRoX29wZW4gKFN0ZGxpYi5vcGVuX291dF9nZW4gZmxhZ3MgcGVybSkgcyBmXG5cbmxldCBzZWVrID0gU3RkbGliLkxhcmdlRmlsZS5zZWVrX291dFxubGV0IHBvcyA9IFN0ZGxpYi5MYXJnZUZpbGUucG9zX291dFxubGV0IGxlbmd0aCA9IFN0ZGxpYi5MYXJnZUZpbGUub3V0X2NoYW5uZWxfbGVuZ3RoXG5sZXQgY2xvc2UgPSBTdGRsaWIuY2xvc2Vfb3V0XG5sZXQgY2xvc2Vfbm9lcnIgPSBTdGRsaWIuY2xvc2Vfb3V0X25vZXJyXG5sZXQgZmx1c2ggPSBTdGRsaWIuZmx1c2hcbmxldCBmbHVzaF9hbGwgPSBTdGRsaWIuZmx1c2hfYWxsXG5sZXQgb3V0cHV0X2NoYXIgPSBTdGRsaWIub3V0cHV0X2NoYXJcbmxldCBvdXRwdXRfYnl0ZSA9IFN0ZGxpYi5vdXRwdXRfYnl0ZVxubGV0IG91dHB1dF9zdHJpbmcgPSBTdGRsaWIub3V0cHV0X3N0cmluZ1xubGV0IG91dHB1dF9ieXRlcyA9IFN0ZGxpYi5vdXRwdXRfYnl0ZXNcbmxldCBvdXRwdXQgPSBTdGRsaWIub3V0cHV0XG5sZXQgb3V0cHV0X3N1YnN0cmluZyA9IFN0ZGxpYi5vdXRwdXRfc3Vic3RyaW5nXG5sZXQgc2V0X2JpbmFyeV9tb2RlID0gU3RkbGliLnNldF9iaW5hcnlfbW9kZV9vdXRcblxuZXh0ZXJuYWwgc2V0X2J1ZmZlcmVkIDogdCAtPiBib29sIC0+IHVuaXQgPSBcImNhbWxfbWxfc2V0X2J1ZmZlcmVkXCJcblxuZXh0ZXJuYWwgaXNfYnVmZmVyZWQgOiB0IC0+IGJvb2wgPSBcImNhbWxfbWxfaXNfYnVmZmVyZWRcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICBLQyBTaXZhcmFtYWtyaXNobmFuLCBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAuLlxuZXh0ZXJuYWwgcGVyZm9ybSA6ICdhIHQgLT4gJ2EgPSBcIiVwZXJmb3JtXCJcblxudHlwZSBleG4gKz0gVW5oYW5kbGVkOiAnYSB0IC0+IGV4blxuZXhjZXB0aW9uIENvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcblxubGV0ICgpID1cbiAgbGV0IHByaW50ZXIgPSBmdW5jdGlvblxuICAgIHwgVW5oYW5kbGVkIHggLT5cbiAgICAgICAgbGV0IG1zZyA9IFByaW50Zi5zcHJpbnRmIFwiU3RkbGliLkVmZmVjdC5VbmhhbmRsZWQoJXMpXCJcbiAgICAgICAgICAgIChQcmludGV4Yy5zdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEBAIE9iai5yZXByIHgpXG4gICAgICAgIGluXG4gICAgICAgIFNvbWUgbXNnXG4gICAgfCBfIC0+IE5vbmVcbiAgaW5cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciBwcmludGVyXG5cbigqIFJlZ2lzdGVyIHRoZSBleGNlcHRpb25zIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIGFjY2VzcyBpdCAqKVxudHlwZSBfIHQgKz0gU2hvdWxkX25vdF9zZWVfdGhpc19fIDogdW5pdCB0XG5sZXQgXyA9IENhbGxiYWNrLnJlZ2lzdGVyX2V4Y2VwdGlvbiBcIkVmZmVjdC5VbmhhbmRsZWRcIlxuICAgICAgICAgIChVbmhhbmRsZWQgU2hvdWxkX25vdF9zZWVfdGhpc19fKVxubGV0IF8gPSBDYWxsYmFjay5yZWdpc3Rlcl9leGNlcHRpb24gXCJFZmZlY3QuQ29udGludWF0aW9uX2FscmVhZHlfcmVzdW1lZFwiXG4gICAgICAgICAgQ29udGludWF0aW9uX2FscmVhZHlfcmVzdW1lZFxuXG50eXBlICgnYSwgJ2IpIHN0YWNrXG5cbmV4dGVybmFsIHJlc3VtZSA6ICgnYSwgJ2IpIHN0YWNrIC0+ICgnYyAtPiAnYSkgLT4gJ2MgLT4gJ2IgPSBcIiVyZXN1bWVcIlxuZXh0ZXJuYWwgcnVuc3RhY2sgOiAoJ2EsICdiKSBzdGFjayAtPiAoJ2MgLT4gJ2EpIC0+ICdjIC0+ICdiID0gXCIlcnVuc3RhY2tcIlxuXG5tb2R1bGUgRGVlcCA9IHN0cnVjdFxuXG4gIHR5cGUgKCdhLCdiKSBjb250aW51YXRpb25cbiAgdHlwZSBsYXN0X2ZpYmVyXG5cbiAgZXh0ZXJuYWwgdGFrZV9jb250X25vZXhjIDogKCdhLCAnYikgY29udGludWF0aW9uIC0+ICgnYSwgJ2IpIHN0YWNrID1cbiAgICBcImNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1wiIFtAQG5vYWxsb2NdXG4gIGV4dGVybmFsIGFsbG9jX3N0YWNrIDpcbiAgICAoJ2EgLT4gJ2IpIC0+XG4gICAgKGV4biAtPiAnYikgLT5cbiAgICAoJ2MgdCAtPiAoJ2MsICdiKSBjb250aW51YXRpb24gLT4gbGFzdF9maWJlciAtPiAnYikgLT5cbiAgICAoJ2EsICdiKSBzdGFjayA9IFwiY2FtbF9hbGxvY19zdGFja1wiXG5cbiAgbGV0IGNvbnRpbnVlIGsgdiA9IHJlc3VtZSAodGFrZV9jb250X25vZXhjIGspIChmdW4geCAtPiB4KSB2XG5cbiAgbGV0IGRpc2NvbnRpbnVlIGsgZSA9IHJlc3VtZSAodGFrZV9jb250X25vZXhjIGspIChmdW4gZSAtPiByYWlzZSBlKSBlXG5cbiAgbGV0IGRpc2NvbnRpbnVlX3dpdGhfYmFja3RyYWNlIGsgZSBidCA9IHJlc3VtZSAodGFrZV9jb250X25vZXhjIGspIChmdW4gZSAtPlxuICAgIFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIGUgYnQpIGVcblxuICB0eXBlICgnYSwnYikgaGFuZGxlciA9XG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIHQgLT4gKCgnYywnYikgY29udGludWF0aW9uIC0+ICdiKSBvcHRpb24gfVxuXG4gIGV4dGVybmFsIHJlcGVyZm9ybSA6XG4gICAgJ2EgdCAtPiAoJ2EsICdiKSBjb250aW51YXRpb24gLT4gbGFzdF9maWJlciAtPiAnYiA9IFwiJXJlcGVyZm9ybVwiXG5cbiAgbGV0IG1hdGNoX3dpdGggY29tcCBhcmcgaGFuZGxlciA9XG4gICAgbGV0IGVmZmMgZWZmIGsgbGFzdF9maWJlciA9XG4gICAgICBtYXRjaCBoYW5kbGVyLmVmZmMgZWZmIHdpdGhcbiAgICAgIHwgU29tZSBmIC0+IGYga1xuICAgICAgfCBOb25lIC0+IHJlcGVyZm9ybSBlZmYgayBsYXN0X2ZpYmVyXG4gICAgaW5cbiAgICBsZXQgcyA9IGFsbG9jX3N0YWNrIGhhbmRsZXIucmV0YyBoYW5kbGVyLmV4bmMgZWZmYyBpblxuICAgIHJ1bnN0YWNrIHMgY29tcCBhcmdcblxuICB0eXBlICdhIGVmZmVjdF9oYW5kbGVyID1cbiAgICB7IGVmZmM6ICdiLiAnYiB0IC0+ICgoJ2IsJ2EpIGNvbnRpbnVhdGlvbiAtPiAnYSkgb3B0aW9uIH1cblxuICBsZXQgdHJ5X3dpdGggY29tcCBhcmcgaGFuZGxlciA9XG4gICAgbGV0IGVmZmMnIGVmZiBrIGxhc3RfZmliZXIgPVxuICAgICAgbWF0Y2ggaGFuZGxlci5lZmZjIGVmZiB3aXRoXG4gICAgICB8IFNvbWUgZiAtPiBmIGtcbiAgICAgIHwgTm9uZSAtPiByZXBlcmZvcm0gZWZmIGsgbGFzdF9maWJlclxuICAgIGluXG4gICAgbGV0IHMgPSBhbGxvY19zdGFjayAoZnVuIHggLT4geCkgKGZ1biBlIC0+IHJhaXNlIGUpIGVmZmMnIGluXG4gICAgcnVuc3RhY2sgcyBjb21wIGFyZ1xuXG4gIGV4dGVybmFsIGdldF9jYWxsc3RhY2sgOlxuICAgICgnYSwnYikgY29udGludWF0aW9uIC0+IGludCAtPiBQcmludGV4Yy5yYXdfYmFja3RyYWNlID1cbiAgICBcImNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcIlxuZW5kXG5cbm1vZHVsZSBTaGFsbG93ID0gc3RydWN0XG5cbiAgdHlwZSAoJ2EsJ2IpIGNvbnRpbnVhdGlvblxuICB0eXBlIGxhc3RfZmliZXJcblxuICBleHRlcm5hbCBhbGxvY19zdGFjayA6XG4gICAgKCdhIC0+ICdiKSAtPlxuICAgIChleG4gLT4gJ2IpIC0+XG4gICAgKCdjIHQgLT4gKCdjLCAnYikgY29udGludWF0aW9uIC0+IGxhc3RfZmliZXIgLT4gJ2IpIC0+XG4gICAgKCdhLCAnYikgc3RhY2sgPSBcImNhbWxfYWxsb2Nfc3RhY2tcIlxuXG5cbiAgbGV0IGZpYmVyIDogdHlwZSBhIGIuIChhIC0+IGIpIC0+IChhLCBiKSBjb250aW51YXRpb24gPSBmdW4gZiAtPlxuICAgIGxldCBtb2R1bGUgTSA9IHN0cnVjdCB0eXBlIF8gdCArPSBJbml0aWFsX3NldHVwX18gOiBhIHQgZW5kIGluXG4gICAgbGV0IGV4Y2VwdGlvbiBFIG9mIChhLGIpIGNvbnRpbnVhdGlvbiBpblxuICAgIGxldCBmJyAoKSA9IGYgKHBlcmZvcm0gTS5Jbml0aWFsX3NldHVwX18pIGluXG4gICAgbGV0IGVycm9yIF8gPSBmYWlsd2l0aCBcImltcG9zc2libGVcIiBpblxuICAgIGxldCBlZmZjIGVmZiBrIF9sYXN0X2ZpYmVyID1cbiAgICAgIG1hdGNoIGVmZiB3aXRoXG4gICAgICB8IE0uSW5pdGlhbF9zZXR1cF9fIC0+IHJhaXNlX25vdHJhY2UgKEUgaylcbiAgICAgIHwgXyAtPiBlcnJvciAoKVxuICAgIGluXG4gICAgbGV0IHMgPSBhbGxvY19zdGFjayBlcnJvciBlcnJvciBlZmZjIGluXG4gICAgbWF0Y2ggcnVuc3RhY2sgcyBmJyAoKSB3aXRoXG4gICAgfCBleGNlcHRpb24gRSBrIC0+IGtcbiAgICB8IF8gLT4gZXJyb3IgKClcblxuICB0eXBlICgnYSwnYikgaGFuZGxlciA9XG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIHQgLT4gKCgnYywnYSkgY29udGludWF0aW9uIC0+ICdiKSBvcHRpb24gfVxuXG4gIGV4dGVybmFsIHVwZGF0ZV9oYW5kbGVyIDpcbiAgICAoJ2EsJ2IpIGNvbnRpbnVhdGlvbiAtPlxuICAgICgnYiAtPiAnYykgLT5cbiAgICAoZXhuIC0+ICdjKSAtPlxuICAgICgnZCB0IC0+ICgnZCwnYikgY29udGludWF0aW9uIC0+IGxhc3RfZmliZXIgLT4gJ2MpIC0+XG4gICAgKCdhLCdjKSBzdGFjayA9IFwiY2FtbF9jb250aW51YXRpb25fdXNlX2FuZF91cGRhdGVfaGFuZGxlcl9ub2V4Y1wiIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgcmVwZXJmb3JtIDpcbiAgICAnYSB0IC0+ICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiAtPiBsYXN0X2ZpYmVyIC0+ICdjID0gXCIlcmVwZXJmb3JtXCJcblxuICBsZXQgY29udGludWVfZ2VuIGsgcmVzdW1lX2Z1biB2IGhhbmRsZXIgPVxuICAgIGxldCBlZmZjIGVmZiBrIGxhc3RfZmliZXIgPVxuICAgICAgbWF0Y2ggaGFuZGxlci5lZmZjIGVmZiB3aXRoXG4gICAgICB8IFNvbWUgZiAtPiBmIGtcbiAgICAgIHwgTm9uZSAtPiByZXBlcmZvcm0gZWZmIGsgbGFzdF9maWJlclxuICAgIGluXG4gICAgbGV0IHN0YWNrID0gdXBkYXRlX2hhbmRsZXIgayBoYW5kbGVyLnJldGMgaGFuZGxlci5leG5jIGVmZmMgaW5cbiAgICByZXN1bWUgc3RhY2sgcmVzdW1lX2Z1biB2XG5cbiAgbGV0IGNvbnRpbnVlX3dpdGggayB2IGhhbmRsZXIgPVxuICAgIGNvbnRpbnVlX2dlbiBrIChmdW4geCAtPiB4KSB2IGhhbmRsZXJcblxuICBsZXQgZGlzY29udGludWVfd2l0aCBrIHYgaGFuZGxlciA9XG4gICAgY29udGludWVfZ2VuIGsgKGZ1biBlIC0+IHJhaXNlIGUpIHYgaGFuZGxlclxuXG4gIGxldCBkaXNjb250aW51ZV93aXRoX2JhY2t0cmFjZSBrIHYgYnQgaGFuZGxlciA9XG4gICAgY29udGludWVfZ2VuIGsgKGZ1biBlIC0+IFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIGUgYnQpIHYgaGFuZGxlclxuXG4gIGV4dGVybmFsIGdldF9jYWxsc3RhY2sgOlxuICAgICgnYSwnYikgY29udGludWF0aW9uIC0+IGludCAtPiBQcmludGV4Yy5yYXdfYmFja3RyYWNlID1cbiAgICBcImNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2tcIlxuZW5kXG4iLCIoKiBnZW5lcmF0ZWQgYnkgZHVuZSAqKVxuXG4oKiogQGNhbm9uaWNhbCBKc29vX3J1bnRpbWUuUnVudGltZV92ZXJzaW9uICopXG5tb2R1bGUgUnVudGltZV92ZXJzaW9uID0gSnNvb19ydW50aW1lX19SdW50aW1lX3ZlcnNpb25cblxubW9kdWxlIEpzb29fcnVudGltZV9fID0gc3RydWN0IGVuZFxuW0BAZGVwcmVjYXRlZCBcInRoaXMgbW9kdWxlIGlzIHNoYWRvd2VkXCJdXG4iLCJtb2R1bGUgSnMgPSBzdHJ1Y3RcbiAgdHlwZSB0XG5cbiAgdHlwZSAnYSBqc19hcnJheSA9IHRcblxuICB0eXBlICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2sgPSB0XG5cbiAgZXh0ZXJuYWwgc3RyaW5nIDogc3RyaW5nIC0+IHQgPSBcImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19zdHJpbmcgOiB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcIlxuXG4gIGV4dGVybmFsIGJ5dGVzdHJpbmcgOiBzdHJpbmcgLT4gdCA9IFwiY2FtbF9qc2J5dGVzX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fYnl0ZXN0cmluZyA6IHQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9qc2J5dGVzXCJcblxuICBleHRlcm5hbCBib29sIDogYm9vbCAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fYm9vbFwiXG5cbiAgZXh0ZXJuYWwgdG9fYm9vbCA6IHQgLT4gYm9vbCA9IFwiY2FtbF9qc190b19ib29sXCJcblxuICBleHRlcm5hbCBhcnJheSA6ICdhIGFycmF5IC0+IHQgPSBcImNhbWxfanNfZnJvbV9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdG9fYXJyYXkgOiB0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2pzX3RvX2FycmF5XCJcblxuICBleHRlcm5hbCBudW1iZXJfb2ZfZmxvYXQgOiBmbG9hdCAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fZmxvYXRcIlxuXG4gIGV4dGVybmFsIGZsb2F0X29mX251bWJlciA6IHQgLT4gZmxvYXQgPSBcImNhbWxfanNfdG9fZmxvYXRcIlxuXG4gIGV4dGVybmFsIHR5cGVvZiA6IHQgLT4gdCA9IFwiY2FtbF9qc190eXBlb2ZcIlxuXG4gIGV4dGVybmFsIGluc3RhbmNlb2YgOiB0IC0+IHQgLT4gYm9vbCA9IFwiY2FtbF9qc19pbnN0YW5jZW9mXCJcblxuICBleHRlcm5hbCBkZWJ1Z2dlciA6IHVuaXQgLT4gdW5pdCA9IFwiZGVidWdnZXJcIlxuXG4gIGV4dGVybmFsIGdldCA6IHQgLT4gdCAtPiB0ID0gXCJjYW1sX2pzX2dldFwiXG5cbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiB0IC0+IHQgLT4gdW5pdCA9IFwiY2FtbF9qc19zZXRcIlxuXG4gIGV4dGVybmFsIGRlbGV0ZSA6IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2pzX2RlbGV0ZVwiXG5cbiAgZXh0ZXJuYWwgY2FsbCA6IHQgLT4gdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfY2FsbFwiXG5cbiAgZXh0ZXJuYWwgZnVuX2NhbGwgOiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19mdW5fY2FsbFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsIDogdCAtPiBzdHJpbmcgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX21ldGhfY2FsbFwiXG5cbiAgZXh0ZXJuYWwgbmV3X29iaiA6IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX25ld1wiXG5cbiAgZXh0ZXJuYWwgbmV3X29ial9hcnIgOiB0IC0+IHQganNfYXJyYXkgLT4gdCA9IFwiY2FtbF9vanNfbmV3X2FyclwiXG5cbiAgZXh0ZXJuYWwgb2JqIDogKHN0cmluZyAqIHQpIGFycmF5IC0+IHQgPSBcImNhbWxfanNfb2JqZWN0XCJcblxuICBleHRlcm5hbCBlcXVhbHMgOiB0IC0+IHQgLT4gYm9vbCA9IFwiY2FtbF9qc19lcXVhbHNcIlxuXG4gIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gIGV4dGVybmFsIGV2YWxfc3RyaW5nIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V2YWxfc3RyaW5nXCJcblxuICBleHRlcm5hbCBqc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmVcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAodCBqc19hcnJheSAtPiAnYikgLT4gKCdjLCB0IGpzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgKCdiIC0+IHQganNfYXJyYXkgLT4gJ2EpIC0+ICgnYiwgdCBqc19hcnJheSAtPiAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gIGV4dGVybmFsIHdyYXBfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrXCJcblxuICBleHRlcm5hbCB3cmFwX21ldGhfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tcIlxuZW5kXG5cbm1vZHVsZSBTeXMgPSBzdHJ1Y3RcbiAgdHlwZSAnYSBjYWxsYmFjayA9ICdhXG5cbiAgZXh0ZXJuYWwgY3JlYXRlX2ZpbGUgOiBuYW1lOnN0cmluZyAtPiBjb250ZW50OnN0cmluZyAtPiB1bml0ID0gXCJjYW1sX2NyZWF0ZV9maWxlXCJcblxuICBleHRlcm5hbCByZWFkX2ZpbGUgOiBuYW1lOnN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfcmVhZF9maWxlX2NvbnRlbnRcIlxuXG4gIGV4dGVybmFsIHNldF9jaGFubmVsX291dHB1dCcgOiBvdXRfY2hhbm5lbCAtPiAoanNfc3RyaW5nOkpzLnQgLT4gdW5pdCkgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX3NldF9jaGFubmVsX291dHB1dFwiXG5cbiAgZXh0ZXJuYWwgc2V0X2NoYW5uZWxfaW5wdXQnIDogaW5fY2hhbm5lbCAtPiAodW5pdCAtPiBzdHJpbmcpIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcIlxuXG4gIGV4dGVybmFsIG1vdW50X3BvaW50IDogdW5pdCAtPiBzdHJpbmcgbGlzdCA9IFwiY2FtbF9saXN0X21vdW50X3BvaW50XCJcblxuICBleHRlcm5hbCBtb3VudF9hdXRvbG9hZCA6IHN0cmluZyAtPiAoc3RyaW5nIC0+IHN0cmluZyAtPiBzdHJpbmcgb3B0aW9uKSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbW91bnRfYXV0b2xvYWRcIlxuXG4gIGV4dGVybmFsIHVubW91bnQgOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF91bm1vdW50XCJcblxuICBtb2R1bGUgQ29uZmlnID0gc3RydWN0XG4gICAgZXh0ZXJuYWwgdXNlX2pzX3N0cmluZyA6IHVuaXQgLT4gYm9vbCA9IFwiY2FtbF9qc29vX2ZsYWdzX3VzZV9qc19zdHJpbmdcIlxuXG4gICAgZXh0ZXJuYWwgZWZmZWN0cyA6IHVuaXQgLT4gYm9vbCA9IFwiY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHNcIlxuICBlbmRcblxuICBsZXQgdmVyc2lvbiA9IFJ1bnRpbWVfdmVyc2lvbi5zXG5cbiAgbGV0IGdpdF92ZXJzaW9uID0gUnVudGltZV92ZXJzaW9uLmdpdF92ZXJzaW9uXG5lbmRcblxubW9kdWxlIEVycm9yIDogc2lnXG4gIHR5cGUgdFxuXG4gIHZhbCByYWlzZV8gOiB0IC0+ICdhXG5cbiAgdmFsIGF0dGFjaF9qc19iYWNrdHJhY2UgOiBleG4gLT4gZm9yY2U6Ym9vbCAtPiBleG5cbiAgKCoqIEF0dGFjaCBhIEphdmFzU2NyaXB0IGVycm9yIHRvIGFuIE9DYW1sIGV4Y2VwdGlvbi4gIGlmIFtmb3JjZSA9IGZhbHNlXSBhbmQgYVxuICAgIEphdmFzU2NyaXB0IGVycm9yIGlzIGFscmVhZHkgYXR0YWNoZWQsIGl0IHdpbGwgZG8gbm90aGluZy4gVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG9cbiAgICBzdG9yZSBhbmQgcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgSmF2YVNjcmlwdCBzdGFjayB0cmFjZXMuXG5cbiAgICBBdHRhY2hpbmcgSmF2YXNTY3JpcHQgZXJyb3JzIHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkgd2hlbiBjb21waWxpbmcgd2l0aFxuICAgIFstLWVuYWJsZSB3aXRoLWpzLWVycm9yXS4gKilcblxuICB2YWwgb2ZfZXhuIDogZXhuIC0+IHQgb3B0aW9uXG4gICgqKiBFeHRyYWN0IGEgSmF2YVNjcmlwdCBlcnJvciBhdHRhY2hlZCB0byBhbiBPQ2FtbCBleGNlcHRpb24sIGlmIGFueS4gIFRoaXMgaXMgdXNlZnVsIHRvXG4gICAgICBpbnNwZWN0IGFuIGV2ZW50dWFsIHN0YWNrIHN0cmFjZSwgZXNwZWNpYWxseSB3aGVuIHNvdXJjZW1hcCBpcyBlbmFibGVkLiAqKVxuXG4gIGV4Y2VwdGlvbiBFeG4gb2YgdFxuICAoKiogVGhlIFtFcnJvcl0gZXhjZXB0aW9uIHdyYXAgamF2YXNjcmlwdCBleGNlcHRpb25zIHdoZW4gY2F1Z2h0IGJ5IE9DYW1sIGNvZGUuXG4gICAgICBJbiBjYXNlIHRoZSBqYXZhc2NyaXB0IGV4Y2VwdGlvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgamF2YXNjcmlwdCBbRXJyb3JdLFxuICAgICAgaXQgd2lsbCBiZSBzZXJpYWxpemVkIGFuZCB3cmFwcGVkIGludG8gYSBbRmFpbHVyZV0gZXhjZXB0aW9uLlxuICAqKVxuZW5kID0gc3RydWN0XG4gIHR5cGUgdFxuXG4gIGV4Y2VwdGlvbiBFeG4gb2YgdFxuXG4gIGxldCBfID0gQ2FsbGJhY2sucmVnaXN0ZXJfZXhjZXB0aW9uIFwianNFcnJvclwiIChFeG4gKE9iai5tYWdpYyBbfHxdKSlcblxuICBsZXQgcmFpc2VfIDogdCAtPiAnYSA9IEpzLmpzX2V4cHIgXCIoZnVuY3Rpb24gKGV4bikgeyB0aHJvdyBleG4gfSlcIlxuXG4gIGV4dGVybmFsIG9mX2V4biA6IGV4biAtPiB0IG9wdGlvbiA9IFwiY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXCJcblxuICBleHRlcm5hbCBhdHRhY2hfanNfYmFja3RyYWNlIDogZXhuIC0+IGZvcmNlOmJvb2wgLT4gZXhuID0gXCJjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVwiXG5lbmRcblxuW0BAQG9jYW1sLndhcm5pbmcgXCItMzItNjBcIl1cblxubW9kdWxlIEZvcl9jb21wYXRpYmlsaXR5X29ubHkgPSBzdHJ1Y3RcbiAgKCogQWRkIHByaW1pdGl2ZXMgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gRXhpc3RpbmcgdXNlcnMgbWlnaHRcbiAgICAgZGVwZW5kIG9uIGl0IChlLmcuIGdlbl9qc19hcGkpLCB3ZSBkb250IHdhbnQgdGhlIG9jYW1sIGNvbXBpbGVyXG4gICAgIHRvIGNvbXBsYWluIGFib3V0IHRoZXNlcyBtaXNzaW5nIHByaW1pdGl2ZXMuICopXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc19mcm9tX3N0cmluZyA6IHN0cmluZyAtPiBKcy50ID0gXCJjYW1sX2pzX2Zyb21fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fYnl0ZV9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfanNfdG9fc3RyaW5nIDogSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfanNfdG9fc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkgOiAnYSBKcy5qc19hcnJheSAtPiAnYSBsaXN0ID0gXCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGNhbWxfbGlzdF90b19qc19hcnJheSA6ICdhIGxpc3QgLT4gJ2EgSnMuanNfYXJyYXkgPSBcImNhbWxfbGlzdF90b19qc19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdmFyaWFibGUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfdmFyXCJcbmVuZFxuXG5tb2R1bGUgVHlwZWRfYXJyYXkgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiKSB0eXBlZEFycmF5ID0gSnMudFxuXG4gIHR5cGUgYXJyYXlCdWZmZXIgPSBKcy50XG5cbiAgdHlwZSB1aW50OEFycmF5ID0gSnMudFxuXG4gIGV4dGVybmFsIGtpbmQgOiAoJ2EsICdiKSB0eXBlZEFycmF5IC0+ICgnYSwgJ2IpIEJpZ2FycmF5LmtpbmRcbiAgICA9IFwiY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5XCJcblxuICBleHRlcm5hbCBmcm9tX2dlbmFycmF5IDpcbiAgICAoJ2EsICdiLCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuR2VuYXJyYXkudCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5XG4gICAgPSBcImNhbWxfYmFfdG9fdHlwZWRfYXJyYXlcIlxuXG4gIGV4dGVybmFsIHRvX2dlbmFycmF5IDpcbiAgICAoJ2EsICdiKSB0eXBlZEFycmF5IC0+ICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50XG4gICAgPSBcImNhbWxfYmFfZnJvbV90eXBlZF9hcnJheVwiXG5cbiAgbW9kdWxlIEJpZ3N0cmluZyA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IChjaGFyLCBCaWdhcnJheS5pbnQ4X3Vuc2lnbmVkX2VsdCwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkFycmF5MS50XG5cbiAgICBleHRlcm5hbCB0b19hcnJheUJ1ZmZlciA6IHQgLT4gYXJyYXlCdWZmZXIgPSBcImJpZ3N0cmluZ190b19hcnJheV9idWZmZXJcIlxuXG4gICAgZXh0ZXJuYWwgdG9fdWludDhBcnJheSA6IHQgLT4gdWludDhBcnJheSA9IFwiYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5XCJcblxuICAgIGV4dGVybmFsIG9mX2FycmF5QnVmZmVyIDogYXJyYXlCdWZmZXIgLT4gdCA9IFwiYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlclwiXG5cbiAgICBleHRlcm5hbCBvZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXlcIlxuICBlbmRcblxuICBleHRlcm5hbCBvZl91aW50OEFycmF5IDogdWludDhBcnJheSAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2FycmF5XCJcbmVuZFxuXG5tb2R1bGUgSW50NjQgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlX2ludDY0X2xvX21pX2hpIDogaW50IC0+IGludCAtPiBpbnQgLT4gSW50NjQudFxuICAgID0gXCJjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVwiXG5lbmRcbiIsIigqIGdlbmVyYXRlZCBieSBkdW5lICopXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkNTUyAqKVxubW9kdWxlIENTUyA9IEpzX29mX29jYW1sX19DU1NcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRG9tICopXG5tb2R1bGUgRG9tID0gSnNfb2Zfb2NhbWxfX0RvbVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Eb21fZXZlbnRzICopXG5tb2R1bGUgRG9tX2V2ZW50cyA9IEpzX29mX29jYW1sX19Eb21fZXZlbnRzXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkRvbV9odG1sICopXG5tb2R1bGUgRG9tX2h0bWwgPSBKc19vZl9vY2FtbF9fRG9tX2h0bWxcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRG9tX3N2ZyAqKVxubW9kdWxlIERvbV9zdmcgPSBKc19vZl9vY2FtbF9fRG9tX3N2Z1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5FdmVudFNvdXJjZSAqKVxubW9kdWxlIEV2ZW50U291cmNlID0gSnNfb2Zfb2NhbWxfX0V2ZW50U291cmNlXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkZpbGUgKilcbm1vZHVsZSBGaWxlID0gSnNfb2Zfb2NhbWxfX0ZpbGVcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRmlyZWJ1ZyAqKVxubW9kdWxlIEZpcmVidWcgPSBKc19vZl9vY2FtbF9fRmlyZWJ1Z1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Gb3JtICopXG5tb2R1bGUgRm9ybSA9IEpzX29mX29jYW1sX19Gb3JtXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkdlb2xvY2F0aW9uICopXG5tb2R1bGUgR2VvbG9jYXRpb24gPSBKc19vZl9vY2FtbF9fR2VvbG9jYXRpb25cblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSW1wb3J0ICopXG5tb2R1bGUgSW1wb3J0ID0gSnNfb2Zfb2NhbWxfX0ltcG9ydFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5JbnRlcnNlY3Rpb25PYnNlcnZlciAqKVxubW9kdWxlIEludGVyc2VjdGlvbk9ic2VydmVyID0gSnNfb2Zfb2NhbWxfX0ludGVyc2VjdGlvbk9ic2VydmVyXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkludGwgKilcbm1vZHVsZSBJbnRsID0gSnNfb2Zfb2NhbWxfX0ludGxcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSnMgKilcbm1vZHVsZSBKcyA9IEpzX29mX29jYW1sX19Kc1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Kc29uICopXG5tb2R1bGUgSnNvbiA9IEpzX29mX29jYW1sX19Kc29uXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkpzdGFibGUgKilcbm1vZHVsZSBKc3RhYmxlID0gSnNfb2Zfb2NhbWxfX0pzdGFibGVcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuTGliX3ZlcnNpb24gKilcbm1vZHVsZSBMaWJfdmVyc2lvbiA9IEpzX29mX29jYW1sX19MaWJfdmVyc2lvblxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5NdXRhdGlvbk9ic2VydmVyICopXG5tb2R1bGUgTXV0YXRpb25PYnNlcnZlciA9IEpzX29mX29jYW1sX19NdXRhdGlvbk9ic2VydmVyXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlBlcmZvcm1hbmNlT2JzZXJ2ZXIgKilcbm1vZHVsZSBQZXJmb3JtYW5jZU9ic2VydmVyID0gSnNfb2Zfb2NhbWxfX1BlcmZvcm1hbmNlT2JzZXJ2ZXJcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuUmVnZXhwICopXG5tb2R1bGUgUmVnZXhwID0gSnNfb2Zfb2NhbWxfX1JlZ2V4cFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5SZXNpemVPYnNlcnZlciAqKVxubW9kdWxlIFJlc2l6ZU9ic2VydmVyID0gSnNfb2Zfb2NhbWxfX1Jlc2l6ZU9ic2VydmVyXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlN5c19qcyAqKVxubW9kdWxlIFN5c19qcyA9IEpzX29mX29jYW1sX19TeXNfanNcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuVHlwZWRfYXJyYXkgKilcbm1vZHVsZSBUeXBlZF9hcnJheSA9IEpzX29mX29jYW1sX19UeXBlZF9hcnJheVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5VcmwgKilcbm1vZHVsZSBVcmwgPSBKc19vZl9vY2FtbF9fVXJsXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLldlYkdMICopXG5tb2R1bGUgV2ViR0wgPSBKc19vZl9vY2FtbF9fV2ViR0xcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuV2ViU29ja2V0cyAqKVxubW9kdWxlIFdlYlNvY2tldHMgPSBKc19vZl9vY2FtbF9fV2ViU29ja2V0c1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Xb3JrZXIgKilcbm1vZHVsZSBXb3JrZXIgPSBKc19vZl9vY2FtbF9fV29ya2VyXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlhtbEh0dHBSZXF1ZXN0ICopXG5tb2R1bGUgWG1sSHR0cFJlcXVlc3QgPSBKc19vZl9vY2FtbF9fWG1sSHR0cFJlcXVlc3RcblxubW9kdWxlIEpzX29mX29jYW1sX18gPSBzdHJ1Y3QgZW5kXG5bQEBkZXByZWNhdGVkIFwidGhpcyBtb2R1bGUgaXMgc2hhZG93ZWRcIl1cbiIsIigqIEpzX29mX29jYW1sXG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICBleHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA8PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA8PiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcblxuICBleHRlcm5hbCAoID0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuXG4gIGV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuXG4gIGV4dGVybmFsIGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcblxuICBleHRlcm5hbCBlcXVhbCA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5lbmRcblxubW9kdWxlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCA8ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA8PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcblxuICBleHRlcm5hbCAoIDw+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA9ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA+PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcblxuICBleHRlcm5hbCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVjb21wYXJlXCJcblxuICBleHRlcm5hbCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBsZXQgbWF4ICh4IDogaW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuICBsZXQgbWluICh4IDogaW50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgU3RyaW5nID0gc3RydWN0XG4gIGluY2x1ZGUgU3RyaW5nXG5cbiAgbGV0IGVxdWFsICh4IDogc3RyaW5nKSAoeSA6IHN0cmluZykgPSBQb2x5LmVxdWFsIHggeVxuZW5kXG5cbm1vZHVsZSBDaGFyID0gc3RydWN0XG4gIGluY2x1ZGUgQ2hhclxuXG4gIGxldCBlcXVhbCAoeCA6IGNoYXIpICh5IDogY2hhcikgPSBQb2x5LmVxdWFsIHggeVxuZW5kXG5cbmluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuKCogVGhpcyBsb2NhbCBtb2R1bGUgW0pzXSBpcyBuZWVkZWQgc28gdGhhdCB0aGUgcHB4X2pzIGV4dGVuc2lvbiB3b3JrIHdpdGhpbiB0aGF0IGZpbGUuICopXG5tb2R1bGUgSnMgPSBzdHJ1Y3RcbiAgdHlwZSArJ2EgdFxuXG4gIHR5cGUgKC0nYSwgKydiKSBtZXRoX2NhbGxiYWNrXG5cbiAgbW9kdWxlIFVuc2FmZSA9IHN0cnVjdFxuICAgIHR5cGUgdG9wXG5cbiAgICB0eXBlIGFueSA9IHRvcCB0XG5cbiAgICB0eXBlIGFueV9qc19hcnJheSA9IGFueVxuXG4gICAgZXh0ZXJuYWwgaW5qZWN0IDogJ2EgLT4gYW55ID0gXCIlaWRlbnRpdHlcIlxuXG4gICAgZXh0ZXJuYWwgY29lcmNlIDogXyB0IC0+IF8gdCA9IFwiJWlkZW50aXR5XCJcblxuICAgIGV4dGVybmFsIGdldCA6ICdhIC0+ICdiIC0+ICdjID0gXCJjYW1sX2pzX2dldFwiXG5cbiAgICBleHRlcm5hbCBzZXQgOiAnYSAtPiAnYiAtPiAnYyAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbiAgICBleHRlcm5hbCBkZWxldGUgOiAnYSAtPiAnYiAtPiB1bml0ID0gXCJjYW1sX2pzX2RlbGV0ZVwiXG5cbiAgICBleHRlcm5hbCBjYWxsIDogJ2EgLT4gJ2IgLT4gYW55IGFycmF5IC0+ICdjID0gXCJjYW1sX2pzX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgZnVuX2NhbGwgOiAnYSAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfZnVuX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsIDogJ2EgLT4gc3RyaW5nIC0+IGFueSBhcnJheSAtPiAnYiA9IFwiY2FtbF9qc19tZXRoX2NhbGxcIlxuXG4gICAgZXh0ZXJuYWwgbmV3X29iaiA6ICdhIC0+IGFueSBhcnJheSAtPiAnYiA9IFwiY2FtbF9qc19uZXdcIlxuXG4gICAgZXh0ZXJuYWwgbmV3X29ial9hcnIgOiAnYSAtPiBhbnlfanNfYXJyYXkgLT4gJ2IgPSBcImNhbWxfb2pzX25ld19hcnJcIlxuXG4gICAgZXh0ZXJuYWwgb2JqIDogKHN0cmluZyAqIGFueSkgYXJyYXkgLT4gJ2EgPSBcImNhbWxfanNfb2JqZWN0XCJcblxuICAgIGV4dGVybmFsIGVxdWFscyA6ICdhIC0+ICdiIC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICAgIGV4dGVybmFsIHB1cmVfZXhwciA6ICh1bml0IC0+ICdhKSAtPiAnYSA9IFwiY2FtbF9qc19wdXJlX2V4cHJcIlxuXG4gICAgZXh0ZXJuYWwgZXZhbF9zdHJpbmcgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXZhbF9zdHJpbmdcIlxuXG4gICAgZXh0ZXJuYWwganNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19leHByXCJcblxuICAgIGV4dGVybmFsIHB1cmVfanNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9wdXJlX2pzX2V4cHJcIlxuXG4gICAgbGV0IGdsb2JhbCA9IHB1cmVfanNfZXhwciBcImdsb2JhbFRoaXNcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAgIChhbnlfanNfYXJyYXkgLT4gJ2IpIC0+ICgnYywgYW55X2pzX2FycmF5IC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3RcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0XCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICAgKCdiIC0+IGFueV9qc19hcnJheSAtPiAnYSkgLT4gKCdiLCBhbnlfanNfYXJyYXkgLT4gJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gICAgKCogREVQUkVDQVRFRCAqKVxuICAgIGV4dGVybmFsIHZhcmlhYmxlIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX3ZhclwiXG4gIGVuZFxuXG4gICgqKioqKVxuXG4gIHR5cGUgJ2Egb3B0ID0gJ2FcblxuICB0eXBlICdhIG9wdGRlZiA9ICdhXG5cbiAgZXh0ZXJuYWwgZGVidWdnZXIgOiB1bml0IC0+IHVuaXQgPSBcImRlYnVnZ2VyXCJcblxuICBsZXQgbnVsbCA6ICdhIG9wdCA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJudWxsXCJcblxuICBleHRlcm5hbCBzb21lIDogJ2EgLT4gJ2Egb3B0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCB1bmRlZmluZWQgOiAnYSBvcHRkZWYgPSBVbnNhZmUucHVyZV9qc19leHByIFwidW5kZWZpbmVkXCJcblxuICBleHRlcm5hbCBkZWYgOiAnYSAtPiAnYSBvcHRkZWYgPSBcIiVpZGVudGl0eVwiXG5cbiAgbW9kdWxlIHR5cGUgT1BUID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgZW1wdHkgOiAnYSB0XG5cbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICAgdmFsIG1hcCA6ICdhIHQgLT4gKCdhIC0+ICdiKSAtPiAnYiB0XG5cbiAgICB2YWwgYmluZCA6ICdhIHQgLT4gKCdhIC0+ICdiIHQpIC0+ICdiIHRcblxuICAgIHZhbCB0ZXN0IDogJ2EgdCAtPiBib29sXG5cbiAgICB2YWwgaXRlciA6ICdhIHQgLT4gKCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAgIHZhbCBjYXNlIDogJ2EgdCAtPiAodW5pdCAtPiAnYikgLT4gKCdhIC0+ICdiKSAtPiAnYlxuXG4gICAgdmFsIGdldCA6ICdhIHQgLT4gKHVuaXQgLT4gJ2EpIC0+ICdhXG5cbiAgICB2YWwgb3B0aW9uIDogJ2Egb3B0aW9uIC0+ICdhIHRcblxuICAgIHZhbCB0b19vcHRpb24gOiAnYSB0IC0+ICdhIG9wdGlvblxuICBlbmRcblxuICBtb2R1bGUgT3B0IDogT1BUIHdpdGggdHlwZSAnYSB0ID0gJ2Egb3B0ID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gJ2Egb3B0XG5cbiAgICBsZXQgZW1wdHkgPSBudWxsXG5cbiAgICBsZXQgcmV0dXJuID0gc29tZVxuXG4gICAgbGV0IG1hcCB4IGYgPSBpZiBVbnNhZmUuZXF1YWxzIHggbnVsbCB0aGVuIG51bGwgZWxzZSByZXR1cm4gKGYgeClcblxuICAgIGxldCBiaW5kIHggZiA9IGlmIFVuc2FmZS5lcXVhbHMgeCBudWxsIHRoZW4gbnVsbCBlbHNlIGYgeFxuXG4gICAgbGV0IHRlc3QgeCA9IG5vdCAoVW5zYWZlLmVxdWFscyB4IG51bGwpXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiBub3QgKFVuc2FmZS5lcXVhbHMgeCBudWxsKSB0aGVuIGYgeFxuXG4gICAgbGV0IGNhc2UgeCBmIGcgPSBpZiBVbnNhZmUuZXF1YWxzIHggbnVsbCB0aGVuIGYgKCkgZWxzZSBnIHhcblxuICAgIGxldCBnZXQgeCBmID0gaWYgVW5zYWZlLmVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgbW9kdWxlIE9wdGRlZiA6IE9QVCB3aXRoIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZiA9IHN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9ICdhIG9wdGRlZlxuXG4gICAgbGV0IGVtcHR5ID0gdW5kZWZpbmVkXG5cbiAgICBsZXQgcmV0dXJuID0gZGVmXG5cbiAgICBsZXQgbWFwIHggZiA9IGlmIHggPT0gdW5kZWZpbmVkIHRoZW4gdW5kZWZpbmVkIGVsc2UgcmV0dXJuIChmIHgpXG5cbiAgICBsZXQgYmluZCB4IGYgPSBpZiB4ID09IHVuZGVmaW5lZCB0aGVuIHVuZGVmaW5lZCBlbHNlIGYgeFxuXG4gICAgbGV0IHRlc3QgeCA9IHggIT0gdW5kZWZpbmVkXG5cbiAgICBsZXQgaXRlciB4IGYgPSBpZiB4ICE9IHVuZGVmaW5lZCB0aGVuIGYgeFxuXG4gICAgbGV0IGNhc2UgeCBmIGcgPSBpZiB4ID09IHVuZGVmaW5lZCB0aGVuIGYgKCkgZWxzZSBnIHhcblxuICAgIGxldCBnZXQgeCBmID0gaWYgeCA9PSB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgeFxuXG4gICAgbGV0IG9wdGlvbiB4ID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBOb25lIC0+IGVtcHR5XG4gICAgICB8IFNvbWUgeCAtPiByZXR1cm4geFxuXG4gICAgbGV0IHRvX29wdGlvbiB4ID0gY2FzZSB4IChmdW4gKCkgLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeClcbiAgZW5kXG5cbiAgKCoqKiopXG5cbiAgbGV0IGNvZXJjZSB4IGYgZyA9IE9wdC5nZXQgKGYgeCkgKGZ1biAoKSAtPiBnIHgpXG5cbiAgbGV0IGNvZXJjZV9vcHQgeCBmIGcgPSBPcHQuZ2V0IChPcHQuYmluZCB4IGYpIChmdW4gKCkgLT4gZyB4KVxuXG4gICgqKioqKVxuXG4gIHR5cGUgKydhIG1ldGhcblxuICB0eXBlICsnYSBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcmVhZG9ubHlfcHJvcCA9IDwgZ2V0IDogJ2EgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2Egd3JpdGVvbmx5X3Byb3AgPSA8IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2EgcHJvcCA9IDwgZ2V0IDogJ2EgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICdhIG9wdGRlZl9wcm9wID0gPCBnZXQgOiAnYSBvcHRkZWYgOyBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICsnYSBjb25zdHJcblxuICAoKioqKilcblxuICB0eXBlICdhIGNhbGxiYWNrID0gKHVuaXQsICdhKSBtZXRoX2NhbGxiYWNrXG5cbiAgZXh0ZXJuYWwgd3JhcF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHdyYXBfbWV0aF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdhLCAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja1wiXG5cbiAgKCoqKiopXG5cbiAgbGV0IF90cnVlID0gVW5zYWZlLnB1cmVfanNfZXhwciBcInRydWVcIlxuXG4gIGxldCBfZmFsc2UgPSBVbnNhZmUucHVyZV9qc19leHByIFwiZmFsc2VcIlxuXG4gIHR5cGUgbWF0Y2hfcmVzdWx0X2hhbmRsZVxuXG4gIHR5cGUgc3RyaW5nX2FycmF5XG5cbiAgY2xhc3MgdHlwZSBqc19zdHJpbmcgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdmFsdWVPZiA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGNoYXJBdCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBjaGFyQ29kZUF0IDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgICAgKCogVGhpcyBtYXkgcmV0dXJuIE5hTi4uLiAqKVxuICAgICAgbWV0aG9kIGNvbmNhdCA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGNvbmNhdF8yIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgY29uY2F0XzMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBjb25jYXRfNCA6XG4gICAgICAgIGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGluZGV4T2YgOiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgICBtZXRob2QgaW5kZXhPZl9mcm9tIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IGludCBtZXRoXG5cbiAgICAgIG1ldGhvZCBsYXN0SW5kZXhPZiA6IGpzX3N0cmluZyB0IC0+IGludCBtZXRoXG5cbiAgICAgIG1ldGhvZCBsYXN0SW5kZXhPZl9mcm9tIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IGludCBtZXRoXG5cbiAgICAgIG1ldGhvZCBsb2NhbGVDb21wYXJlIDoganNfc3RyaW5nIHQgLT4gZmxvYXQgbWV0aFxuXG4gICAgICBtZXRob2QgX21hdGNoIDogcmVnRXhwIHQgLT4gbWF0Y2hfcmVzdWx0X2hhbmRsZSB0IG9wdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBub3JtYWxpemUgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBub3JtYWxpemVfZm9ybSA6IG5vcm1hbGl6YXRpb24gdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCByZXBsYWNlIDogcmVnRXhwIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgcmVwbGFjZV9zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzZWFyY2ggOiByZWdFeHAgdCAtPiBpbnQgbWV0aFxuXG4gICAgICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNsaWNlX2VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzcGxpdCA6IGpzX3N0cmluZyB0IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNwbGl0X2xpbWl0ZWQgOiBqc19zdHJpbmcgdCAtPiBpbnQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3BsaXRfcmVnRXhwIDogcmVnRXhwIHQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3BsaXRfcmVnRXhwTGltaXRlZCA6IHJlZ0V4cCB0IC0+IGludCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzdWJzdHJpbmcgOiBpbnQgLT4gaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHN1YnN0cmluZ190b0VuZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0b0xvd2VyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRvTG9jYWxlTG93ZXJDYXNlIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdG9VcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0b0xvY2FsZVVwcGVyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRyaW0gOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICAgIGVuZFxuXG4gIGFuZCByZWdFeHAgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGV4ZWMgOiBqc19zdHJpbmcgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgICAgbWV0aG9kIHRlc3QgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzb3VyY2UgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBnbG9iYWwgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgaWdub3JlQ2FzZSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBtdWx0aWxpbmUgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbGFzdEluZGV4IDogaW50IHByb3BcbiAgICBlbmRcblxuICBhbmQgbm9ybWFsaXphdGlvbiA9IGpzX3N0cmluZ1xuXG4gICgqIHN0cmluZyBpcyB1c2VkIGJ5IHBweF9qcywgaXQgbmVlZHMgdG8gY29tZSBiZWZvcmUgYW55IHVzZSBvZiB0aGVcbiAgICAgbmV3IHN5bnRheCBpbiB0aGlzIGZpbGUgKilcbiAgZXh0ZXJuYWwgc3RyaW5nIDogc3RyaW5nIC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fc3RyaW5nIDoganNfc3RyaW5nIHQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1wiXG5cbiAgbGV0IG5mYyA9IHN0cmluZyBcIk5GQ1wiXG5cbiAgbGV0IG5mZCA9IHN0cmluZyBcIk5GRFwiXG5cbiAgbGV0IG5ma2MgPSBzdHJpbmcgXCJORktDXCJcblxuICBsZXQgbmZrZCA9IHN0cmluZyBcIk5GS0RcIlxuZW5kXG5cbmluY2x1ZGUgSnNcblxuY2xhc3MgdHlwZSBzdHJpbmdfY29uc3RyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGZyb21DaGFyQ29kZSA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5sZXQgc3RyaW5nX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fU3RyaW5nXG5cbmxldCByZWdFeHAgPSBVbnNhZmUuZ2xvYmFsIyMuX1JlZ0V4cFxuXG5sZXQgcmVnRXhwX2NvcHkgPSByZWdFeHBcblxubGV0IHJlZ0V4cF93aXRoRmxhZ3MgPSByZWdFeHBcblxuY2xhc3MgdHlwZSBbJ2FdIGpzX2FycmF5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbmNhdCA6ICdhIGpzX2FycmF5IHQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgam9pbiA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBwb3AgOiAnYSBvcHRkZWYgbWV0aFxuXG4gICAgbWV0aG9kIHB1c2ggOiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHB1c2hfMiA6ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgcHVzaF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBwdXNoXzQgOiAnYSAtPiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHJldmVyc2UgOiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzaGlmdCA6ICdhIG9wdGRlZiBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX2VuZCA6IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzb3J0IDogKCdhIC0+ICdhIC0+IGZsb2F0KSBjYWxsYmFjayAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzb3J0X2FzU3RyaW5ncyA6ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGljZSA6IGludCAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaWNlXzEgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGljZV8yIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpY2VfMyA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaWNlXzQgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc2hpZnQgOiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc2hpZnRfMiA6ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgdW5zaGlmdF8zIDogJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCB1bnNoaWZ0XzQgOiAnYSAtPiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHNvbWUgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gYm9vbCB0KSBjYWxsYmFjayAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGV2ZXJ5IDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBmb3JFYWNoIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IHVuaXQpIGNhbGxiYWNrIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG1hcCA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYikgY2FsbGJhY2sgLT4gJ2IganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2QgZmlsdGVyIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVkdWNlX2luaXQgOlxuICAgICAgKCdiIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAtPiAnYiBtZXRoXG5cbiAgICBtZXRob2QgcmVkdWNlIDogKCdhIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdhKSBjYWxsYmFjayAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgcmVkdWNlUmlnaHRfaW5pdCA6XG4gICAgICAoJ2IgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIC0+ICdiIG1ldGhcblxuICAgIG1ldGhvZCByZWR1Y2VSaWdodCA6ICgnYSAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYSkgY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCBwcm9wXG4gIGVuZFxuXG5sZXQgb2JqZWN0X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9PYmplY3RcblxubGV0IG9iamVjdF9rZXlzIG8gOiBqc19zdHJpbmcgdCBqc19hcnJheSB0ID0gb2JqZWN0X2NvbnN0cnVjdG9yIyNrZXlzIG9cblxubGV0IGFycmF5X2NvbnN0cnVjdG9yID0gVW5zYWZlLmdsb2JhbCMjLl9BcnJheVxuXG5sZXQgYXJyYXlfZW1wdHkgPSBhcnJheV9jb25zdHJ1Y3RvclxuXG5sZXQgYXJyYXlfbGVuZ3RoID0gYXJyYXlfY29uc3RydWN0b3JcblxubGV0IGFycmF5X2dldCA6ICdhICNqc19hcnJheSB0IC0+IGludCAtPiAnYSBvcHRkZWYgPSBVbnNhZmUuZ2V0XG5cbmxldCBhcnJheV9zZXQgOiAnYSAjanNfYXJyYXkgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFVuc2FmZS5zZXRcblxubGV0IGFycmF5X21hcF9wb2x5IDpcbiAgICAnYSAjanNfYXJyYXkgdCAtPiAoJ2EgLT4gaW50IC0+ICdhICNqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAjanNfYXJyYXkgdCA9XG4gZnVuIGEgY2IgLT4gKFVuc2FmZS5jb2VyY2UgYSkjI21hcCBjYlxuXG5sZXQgYXJyYXlfbWFwIGYgYSA9IGFycmF5X21hcF9wb2x5IGEgKHdyYXBfY2FsbGJhY2sgKGZ1biB4IF9pZHggXyAtPiBmIHgpKVxuXG5sZXQgYXJyYXlfbWFwaSBmIGEgPSBhcnJheV9tYXBfcG9seSBhICh3cmFwX2NhbGxiYWNrIChmdW4geCBpZHggXyAtPiBmIGlkeCB4KSlcblxuY2xhc3MgdHlwZSBtYXRjaF9yZXN1bHQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtqc19zdHJpbmcgdF0ganNfYXJyYXlcblxuICAgIG1ldGhvZCBpbmRleCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5wdXQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgc3RyX2FycmF5IDogc3RyaW5nX2FycmF5IHQgLT4ganNfc3RyaW5nIHQganNfYXJyYXkgdCA9IFVuc2FmZS5jb2VyY2VcblxubGV0IG1hdGNoX3Jlc3VsdCA6IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCAtPiBtYXRjaF9yZXN1bHQgdCA9IFVuc2FmZS5jb2VyY2VcblxuY2xhc3MgdHlwZSBudW1iZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9TdHJpbmdfcmFkaXggOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRml4ZWQgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRXhwb25lbnRpYWwgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9FeHBvbmVudGlhbF9kaWdpdHMgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvUHJlY2lzaW9uIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmV4dGVybmFsIG51bWJlcl9vZl9mbG9hdCA6IGZsb2F0IC0+IG51bWJlciB0ID0gXCJjYW1sX2pzX2Zyb21fZmxvYXRcIlxuXG5leHRlcm5hbCBmbG9hdF9vZl9udW1iZXIgOiBudW1iZXIgdCAtPiBmbG9hdCA9IFwiY2FtbF9qc190b19mbG9hdFwiXG5cbmNsYXNzIHR5cGUgZGF0ZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0RhdGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9UaW1lU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvTG9jYWxlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvTG9jYWxlRGF0ZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVRpbWVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdmFsdWVPZiA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRUaW1lIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZ1bGxZZWFyIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENGdWxsWWVhciA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0TW9udGggOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ01vbnRoIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXREYXRlIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENEYXRlIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXREYXkgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ0RheSA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SG91cnMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ0hvdXJzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRNaW51dGVzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENNaW51dGVzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTZWNvbmRzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENTZWNvbmRzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRNaWxsaXNlY29uZHMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ01pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VGltZXpvbmVPZmZzZXQgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFRpbWUgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RnVsbFllYXIgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ0Z1bGxZZWFyIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRNb250aCA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDTW9udGggOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldERhdGUgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ0RhdGUgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldERheSA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDRGF5IDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRIb3VycyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDSG91cnMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldE1pbnV0ZXMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ01pbnV0ZXMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFNlY29uZHMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ1NlY29uZHMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldE1pbGxpc2Vjb25kcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDTWlsbGlzZWNvbmRzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCB0b1VUQ1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0lTT1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0pTT04gOiAnYSAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGRhdGVfY29uc3RyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBhcnNlIDoganNfc3RyaW5nIHQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfbW9udGggOiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX2RheSA6IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfaG91ciA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19taW4gOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX3NlYyA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX21zIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBub3cgOiBmbG9hdCBtZXRoXG4gIGVuZFxuXG5sZXQgZGF0ZV9jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX0RhdGVcblxubGV0IGRhdGUgOiBkYXRlX2NvbnN0ciB0ID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbm93IDogZGF0ZSB0IGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2Zyb21UaW1lVmFsdWUgOiAoZmxvYXQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9tb250aCA6IChpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfZGF5IDogKGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfaG91ciA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9taW4gOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX3NlYyA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX21zIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9XG4gIGRhdGVfY29uc3RyXG5cbmNsYXNzIHR5cGUgbWF0aCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfRSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE4yIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MTjEwIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MT0cyRSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE9HMTBFIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QSSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1FSVDFfMl8gOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NRUlQyIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFicyA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBhY29zIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgYXRhbiA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvcyA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBleHAgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZmxvb3IgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1heCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtYXhfMyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtYXhfNCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtaW4gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWluXzMgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWluXzQgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHJhbmRvbSA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCByb3VuZCA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzaW4gOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc3FydCA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCB0YW4gOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG4gIGVuZFxuXG5sZXQgbWF0aCA9IFVuc2FmZS5nbG9iYWwjIy5fTWF0aFxuXG5jbGFzcyB0eXBlIGVycm9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWVzc2FnZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdGFjayA6IGpzX3N0cmluZyB0IG9wdGRlZiBwcm9wXG5cbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5sZXQgZXJyb3JfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9FcnJvclxuXG5tb2R1bGUgSnNfZXJyb3IgPSBzdHJ1Y3RcbiAgdHlwZSBlcnJvcl90ID0gZXJyb3IgdFxuXG4gIGluY2x1ZGUgSnNvb19ydW50aW1lLkVycm9yXG5cbiAgZXh0ZXJuYWwgb2ZfZXJyb3IgOiBlcnJvcl90IC0+IHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgZXh0ZXJuYWwgdG9fZXJyb3IgOiB0IC0+IGVycm9yX3QgPSBcIiVpZGVudGl0eVwiXG5cbiAgbGV0IG5hbWUgZSA9IHRvX3N0cmluZyAodG9fZXJyb3IgZSkjIy5uYW1lXG5cbiAgbGV0IG1lc3NhZ2UgZSA9IHRvX3N0cmluZyAodG9fZXJyb3IgZSkjIy5tZXNzYWdlXG5cbiAgbGV0IHN0YWNrIChlIDogdCkgOiBzdHJpbmcgb3B0aW9uID1cbiAgICBPcHQudG9fb3B0aW9uIChPcHQubWFwICh0b19lcnJvciBlKSMjLnN0YWNrIHRvX3N0cmluZylcblxuICBsZXQgdG9fc3RyaW5nIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyN0b1N0cmluZ1xuZW5kXG5cbm1vZHVsZSBNYWdpYyA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBUID0gc2lnXG4gICAgZXhjZXB0aW9uIEVycm9yIG9mIGVycm9yIHRcbiAgZW5kXG5cbiAgdHlwZSAoJ2EsICdiKSBlcSA9IEVxIDogKCdhLCAnYSkgZXFcblxuICBsZXQgKGVxIDogKGVycm9yIHQsIEpzX2Vycm9yLnQpIGVxKSA9IE9iai5tYWdpYyBFcVxuXG4gIGxldCBtID1cbiAgICBtYXRjaCBlcSB3aXRoXG4gICAgfCBFcSAtPlxuICAgICAgICAobW9kdWxlIHN0cnVjdFxuICAgICAgICAgIGV4Y2VwdGlvbiBFcnJvciA9IEpzX2Vycm9yLkV4blxuICAgICAgICBlbmQgOiBUKVxuXG4gIG1vZHVsZSBFcnJvciA9ICh2YWwgbSA6IFQpXG5lbmRcblxuaW5jbHVkZSBNYWdpYy5FcnJvclxuXG5sZXQgcmFpc2VfanNfZXJyb3IgZSA9IEpzX2Vycm9yLnJhaXNlXyAoSnNfZXJyb3Iub2ZfZXJyb3IgZSlcblxubGV0IHN0cmluZ19vZl9lcnJvciBlID0gSnNfZXJyb3IudG9fc3RyaW5nIChKc19lcnJvci5vZl9lcnJvciBlKVxuXG5sZXQgZXhuX3dpdGhfanNfYmFja3RyYWNlID0gSnNfZXJyb3IuYXR0YWNoX2pzX2JhY2t0cmFjZVxuXG5leHRlcm5hbCBqc19lcnJvcl9vZl9leG4gOiBleG4gLT4gZXJyb3IgdCBvcHQgPSBcImNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uXCJcblxuY2xhc3MgdHlwZSBqc29uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBhcnNlIDoganNfc3RyaW5nIHQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHN0cmluZ2lmeSA6ICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmxldCBfSlNPTiA6IGpzb24gdCA9IFVuc2FmZS5nbG9iYWwjIy5fSlNPTlxuXG5sZXQgZGVjb2RlVVJJIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmRlY29kZVVSSSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGRlY29kZVVSSUNvbXBvbmVudCAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5kZWNvZGVVUklDb21wb25lbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlbmNvZGVVUkkgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZW5jb2RlVVJJIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZW5jb2RlVVJJQ29tcG9uZW50IChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVuY29kZVVSSUNvbXBvbmVudCBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVzY2FwZSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lc2NhcGUgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCB1bmVzY2FwZSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy51bmVzY2FwZSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxuZXh0ZXJuYWwgYm9vbCA6IGJvb2wgLT4gYm9vbCB0ID0gXCJjYW1sX2pzX2Zyb21fYm9vbFwiXG5cbmV4dGVybmFsIHRvX2Jvb2wgOiBib29sIHQgLT4gYm9vbCA9IFwiY2FtbF9qc190b19ib29sXCJcblxuZXh0ZXJuYWwgYXJyYXkgOiAnYSBhcnJheSAtPiAnYSBqc19hcnJheSB0ID0gXCJjYW1sX2pzX2Zyb21fYXJyYXlcIlxuXG5leHRlcm5hbCB0b19hcnJheSA6ICdhIGpzX2FycmF5IHQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfanNfdG9fYXJyYXlcIlxuXG5leHRlcm5hbCBieXRlc3RyaW5nIDogc3RyaW5nIC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgdG9fYnl0ZXN0cmluZyA6IGpzX3N0cmluZyB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNieXRlc1wiXG5cbmV4dGVybmFsIHR5cGVvZiA6IF8gdCAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc190eXBlb2ZcIlxuXG5leHRlcm5hbCBpbnN0YW5jZW9mIDogXyB0IC0+IF8gY29uc3RyIC0+IGJvb2wgPSBcImNhbWxfanNfaW5zdGFuY2VvZlwiXG5cbmxldCBpc05hTiAoaSA6ICdhKSA6IGJvb2wgPVxuICB0b19ib29sIChVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmlzTmFOIFt8IFVuc2FmZS5pbmplY3QgaSB8XSlcblxubGV0IHBhcnNlSW50IChzIDoganNfc3RyaW5nIHQpIDogaW50ID1cbiAgbGV0IHMgPSBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLnBhcnNlSW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XSBpblxuICBpZiBpc05hTiBzIHRoZW4gZmFpbHdpdGggXCJwYXJzZUludFwiIGVsc2Ugc1xuXG5sZXQgcGFyc2VGbG9hdCAocyA6IGpzX3N0cmluZyB0KSA6IGZsb2F0ID1cbiAgbGV0IHMgPSBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLnBhcnNlRmxvYXQgW3wgVW5zYWZlLmluamVjdCBzIHxdIGluXG4gIGlmIGlzTmFOIHMgdGhlbiBmYWlsd2l0aCBcInBhcnNlRmxvYXRcIiBlbHNlIHNcblxubGV0IF8gPVxuICBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIChmdW5jdGlvblxuICAgICAgfCBKc19lcnJvci5FeG4gZSAtPiBTb21lIChKc19lcnJvci50b19zdHJpbmcgZSlcbiAgICAgIHwgXyAtPiBOb25lKVxuXG5sZXQgXyA9XG4gIFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgKGZ1biBlIC0+XG4gICAgICBsZXQgZSA6IDwgLi4gPiB0ID0gT2JqLm1hZ2ljIGUgaW5cbiAgICAgIGlmIGluc3RhbmNlb2YgZSBhcnJheV9jb25zdHJ1Y3RvciB0aGVuIE5vbmUgZWxzZSBTb21lICh0b19zdHJpbmcgZSMjdG9TdHJpbmcpKVxuXG5sZXQgZXhwb3J0X2pzIChmaWVsZCA6IGpzX3N0cmluZyB0KSB4ID1cbiAgVW5zYWZlLnNldFxuICAgIChVbnNhZmUucHVyZV9qc19leHByIFwianNvb19leHBvcnRzXCIpXG4gICAgZmllbGRcbiAgICAoaWYgU3RyaW5nLmVxdWFsIChKcy50b19zdHJpbmcgKHR5cGVvZiAoT2JqLm1hZ2ljIHgpKSkgXCJmdW5jdGlvblwiXG4gICAgICAgICgqIGZ1bmN0aW9uIHdpdGggYXJpdHkvbGVuZ3RoIGVxdWFsIHRvIHplcm8gYXJlIGFscmVhZHkgd3JhcHBlZCAqKVxuICAgICAgICAmJiBVbnNhZmUuZ2V0IChPYmoubWFnaWMgeCkgKEpzLnN0cmluZyBcImxlbmd0aFwiKSA+IDBcbiAgICB0aGVuIE9iai5tYWdpYyAod3JhcF9jYWxsYmFjayAoT2JqLm1hZ2ljIHgpKVxuICAgIGVsc2UgeClcblxubGV0IGV4cG9ydCBmaWVsZCB4ID0gZXhwb3J0X2pzIChzdHJpbmcgZmllbGQpIHhcblxubGV0IGV4cG9ydF9hbGwgb2JqID1cbiAgbGV0IGtleXMgPSBvYmplY3Rfa2V5cyBvYmogaW5cbiAga2V5cyMjZm9yRWFjaFxuICAgICh3cmFwX2NhbGxiYWNrIChmdW4gKGtleSA6IGpzX3N0cmluZyB0KSBfIF8gLT4gZXhwb3J0X2pzIGtleSAoVW5zYWZlLmdldCBvYmoga2V5KSkpXG5cbigqKioqKVxuXG4oKiBERVBSRUNBVEVEICopXG5cbnR5cGUgZmxvYXRfcHJvcCA9IGZsb2F0IHByb3BcblxuZXh0ZXJuYWwgZmxvYXQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWlkZW50aXR5XCJcblxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWlkZW50aXR5XCJcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBbJ25vZGVdIG5vZGVMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgbGlzdF9vZl9ub2RlTGlzdCAobm9kZUxpc3QgOiAnYSBub2RlTGlzdCB0KSA9XG4gIGxldCBsZW5ndGggPSBub2RlTGlzdCMjLmxlbmd0aCBpblxuICBsZXQgcmVjIGFkZF9pdGVtIGFjYyBpID1cbiAgICBpZiBpIDwgbGVuZ3RoXG4gICAgdGhlblxuICAgICAgbWF0Y2ggT3B0LnRvX29wdGlvbiAobm9kZUxpc3QjI2l0ZW0gaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGFkZF9pdGVtIGFjYyAoaSArIDEpXG4gICAgICB8IFNvbWUgZSAtPiBhZGRfaXRlbSAoZSA6OiBhY2MpIChpICsgMSlcbiAgICBlbHNlIExpc3QucmV2IGFjY1xuICBpblxuICBhZGRfaXRlbSBbXSAwXG5cbnR5cGUgbm9kZVR5cGUgPVxuICB8IE9USEVSXG4gICgqIFdpbGwgbm90IGhhcHBlbiAqKVxuICB8IEVMRU1FTlRcbiAgfCBBVFRSSUJVVEVcbiAgfCBURVhUXG4gIHwgQ0RBVEFfU0VDVElPTlxuICB8IEVOVElUWV9SRUZFUkVOQ0VcbiAgfCBFTlRJVFlcbiAgfCBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OXG4gIHwgQ09NTUVOVFxuICB8IERPQ1VNRU5UXG4gIHwgRE9DVU1FTlRfVFlQRVxuICB8IERPQ1VNRU5UX0ZSQUdNRU5UXG4gIHwgTk9UQVRJT05cblxubW9kdWxlIERvY3VtZW50UG9zaXRpb24gPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50XG5cbiAgdHlwZSBtYXNrID0gaW50XG5cbiAgbGV0IGRpc2Nvbm5lY3RlZCA9IDB4MDFcblxuICBsZXQgcHJlY2VkaW5nID0gMHgwMlxuXG4gIGxldCBmb2xsb3dpbmcgPSAweDA0XG5cbiAgbGV0IGNvbnRhaW5zID0gMHgwOFxuXG4gIGxldCBjb250YWluZWRfYnkgPSAweDEwXG5cbiAgbGV0IGltcGxlbWVudGF0aW9uX3NwZWNpZmljID0gMHgyMFxuXG4gIGxldCBoYXMgdCBtYXNrID0gdCBsYW5kIG1hc2sgPSBtYXNrXG5cbiAgbGV0IGFkZCB4IHkgPSB4IGxvciB5XG5cbiAgbGV0ICggKyApID0gYWRkXG5lbmRcblxuY2xhc3MgdHlwZSBub2RlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG5vZGVOYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5vZGVWYWx1ZSA6IGpzX3N0cmluZyB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgbm9kZVR5cGUgOiBub2RlVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFyZW50Tm9kZSA6IG5vZGUgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoaWxkTm9kZXMgOiBub2RlIG5vZGVMaXN0IHQgcHJvcFxuXG4gICAgbWV0aG9kIGZpcnN0Q2hpbGQgOiBub2RlIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBsYXN0Q2hpbGQgOiBub2RlIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBwcmV2aW91c1NpYmxpbmcgOiBub2RlIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBuZXh0U2libGluZyA6IG5vZGUgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWVzcGFjZVVSSSA6IGpzX3N0cmluZyB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgaW5zZXJ0QmVmb3JlIDogbm9kZSB0IC0+IG5vZGUgdCBvcHQgLT4gbm9kZSB0IG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlQ2hpbGQgOiBub2RlIHQgLT4gbm9kZSB0IC0+IG5vZGUgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlQ2hpbGQgOiBub2RlIHQgLT4gbm9kZSB0IG1ldGhcblxuICAgIG1ldGhvZCBhcHBlbmRDaGlsZCA6IG5vZGUgdCAtPiBub2RlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGhhc0NoaWxkTm9kZXMgOiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb25lTm9kZSA6IGJvb2wgdCAtPiBub2RlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIDogbm9kZSB0IC0+IERvY3VtZW50UG9zaXRpb24udCBtZXRoXG5cbiAgICBtZXRob2QgbG9va3VwTmFtZXNwYWNlVVJJIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBsb29rdXBQcmVmaXggOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuICBlbmRcblxubGV0IGFwcGVuZENoaWxkIChwIDogI25vZGUgdCkgKG4gOiAjbm9kZSB0KSA9IGlnbm9yZSAocCMjYXBwZW5kQ2hpbGQgKG4gOj4gbm9kZSB0KSlcblxubGV0IHJlbW92ZUNoaWxkIChwIDogI25vZGUgdCkgKG4gOiAjbm9kZSB0KSA9IGlnbm9yZSAocCMjcmVtb3ZlQ2hpbGQgKG4gOj4gbm9kZSB0KSlcblxubGV0IHJlcGxhY2VDaGlsZCAocCA6ICNub2RlIHQpIChuIDogI25vZGUgdCkgKG8gOiAjbm9kZSB0KSA9XG4gIGlnbm9yZSAocCMjcmVwbGFjZUNoaWxkIChuIDo+IG5vZGUgdCkgKG8gOj4gbm9kZSB0KSlcblxubGV0IGluc2VydEJlZm9yZSAocCA6ICNub2RlIHQpIChuIDogI25vZGUgdCkgKG8gOiAjbm9kZSB0IG9wdCkgPVxuICBpZ25vcmUgKHAjI2luc2VydEJlZm9yZSAobiA6PiBub2RlIHQpIChvIDo+IG5vZGUgdCBvcHQpKVxuXG4oKiogU3BlY2lmaWNhdGlvbiBvZiBbQXR0cl0gb2JqZWN0cy4gKilcbmNsYXNzIHR5cGUgYXR0ciA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbm9kZVxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3BlY2lmaWVkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvd25lckVsZW1lbnQgOiBlbGVtZW50IHQgcHJvcFxuICBlbmRcblxuKCoqIFNwZWNpZmljYXRpb24gb2YgW05hbWVkTm9kZU1hcF0gb2JqZWN0cy4gKilcbmFuZCBbJ25vZGVdIG5hbWVkTm9kZU1hcCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBnZXROYW1lZEl0ZW0gOiBqc19zdHJpbmcgdCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0TmFtZWRJdGVtIDogJ25vZGUgdCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlTmFtZWRJdGVtIDoganNfc3RyaW5nIHQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiogU3BlY2lmaWNhdGlvbiBvZiBbRWxlbWVudF0gb2JqZWN0cy4gKilcbmFuZCBlbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBub2RlXG5cbiAgICBtZXRob2QgdGFnTmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRBdHRyaWJ1dGUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEF0dHJpYnV0ZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUF0dHJpYnV0ZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGhhc0F0dHJpYnV0ZSA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QXR0cmlidXRlTlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEF0dHJpYnV0ZU5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlQXR0cmlidXRlTlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBoYXNBdHRyaWJ1dGVOUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QXR0cmlidXRlTm9kZSA6IGpzX3N0cmluZyB0IC0+IGF0dHIgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEF0dHJpYnV0ZU5vZGUgOiBhdHRyIHQgLT4gYXR0ciB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlQXR0cmlidXRlTm9kZSA6IGF0dHIgdCAtPiBhdHRyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEF0dHJpYnV0ZU5vZGVOUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGF0dHIgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEF0dHJpYnV0ZU5vZGVOUyA6IGF0dHIgdCAtPiBhdHRyIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50c0J5VGFnTmFtZSA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgbm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgYXR0cmlidXRlcyA6IGF0dHIgbmFtZWROb2RlTWFwIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBjaGFyYWN0ZXJEYXRhID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBub2RlXG5cbiAgICBtZXRob2QgZGF0YSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN1YmpzX3N0cmluZ0RhdGEgOiBpbnQgLT4gaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBhcHBlbmREYXRhIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5zZXJ0RGF0YSA6IGludCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVEYXRhIDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlRGF0YSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGNvbW1lbnQgPSBjaGFyYWN0ZXJEYXRhXG5cbmNsYXNzIHR5cGUgdGV4dCA9IGNoYXJhY3RlckRhdGFcblxuY2xhc3MgdHlwZSBkb2N1bWVudEZyYWdtZW50ID0gbm9kZVxuXG5jbGFzcyB0eXBlIFsnZWxlbWVudF0gZG9jdW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG5vZGVcblxuICAgIG1ldGhvZCBkb2N1bWVudEVsZW1lbnQgOiAnZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjcmVhdGVEb2N1bWVudEZyYWdtZW50IDogZG9jdW1lbnRGcmFnbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVFbGVtZW50IDoganNfc3RyaW5nIHQgLT4gJ2VsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlRWxlbWVudE5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gJ2VsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlVGV4dE5vZGUgOiBqc19zdHJpbmcgdCAtPiB0ZXh0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUF0dHJpYnV0ZSA6IGpzX3N0cmluZyB0IC0+IGF0dHIgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlQ29tbWVudCA6IGpzX3N0cmluZyB0IC0+IGNvbW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudEJ5SWQgOiBqc19zdHJpbmcgdCAtPiAnZWxlbWVudCB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudHNCeVRhZ05hbWUgOiBqc19zdHJpbmcgdCAtPiAnZWxlbWVudCBub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBpbXBvcnROb2RlIDogZWxlbWVudCB0IC0+IGJvb2wgdCAtPiAnZWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBhZG9wdE5vZGUgOiBlbGVtZW50IHQgLT4gJ2VsZW1lbnQgdCBtZXRoXG4gIGVuZFxuXG50eXBlIG5vZGVfdHlwZSA9XG4gIHwgRWxlbWVudCBvZiBlbGVtZW50IHRcbiAgfCBBdHRyIG9mIGF0dHIgdFxuICB8IFRleHQgb2YgdGV4dCB0XG4gIHwgT3RoZXIgb2Ygbm9kZSB0XG5cbmxldCBub2RlVHlwZSBlID1cbiAgbWF0Y2ggZSMjLm5vZGVUeXBlIHdpdGhcbiAgfCBFTEVNRU5UIC0+IEVsZW1lbnQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgfCBBVFRSSUJVVEUgLT4gQXR0ciAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICB8IENEQVRBX1NFQ1RJT04gfCBURVhUIC0+IFRleHQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgfCBfIC0+IE90aGVyIChlIDo+IG5vZGUgdClcblxubW9kdWxlIENvZXJjZVRvID0gc3RydWN0XG4gIGxldCBjYXN0IChlIDogI25vZGUgSnMudCkgdCA9XG4gICAgaWYgZSMjLm5vZGVUeXBlID09IHQgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpIGVsc2UgSnMubnVsbFxuXG4gIGxldCBlbGVtZW50IGUgOiBlbGVtZW50IEpzLnQgSnMub3B0ID0gY2FzdCBlIEVMRU1FTlRcblxuICBsZXQgdGV4dCBlIDogdGV4dCBKcy50IEpzLm9wdCA9XG4gICAgaWYgZSMjLm5vZGVUeXBlID09IFRFWFQgfHwgZSMjLm5vZGVUeXBlID09IENEQVRBX1NFQ1RJT05cbiAgICB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgYXR0ciBlIDogYXR0ciBKcy50IEpzLm9wdCA9IGNhc3QgZSBBVFRSSUJVVEVcbmVuZFxuXG50eXBlICgnYSwgJ2IpIGV2ZW50X2xpc3RlbmVyID0gKCdhLCAnYiAtPiBib29sIHQpIG1ldGhfY2FsbGJhY2sgb3B0XG4oKiogVGhlIHR5cGUgb2YgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb25zLiAgVGhlIGZpcnN0IHR5cGUgcGFyYW1ldGVyXG4gICAgICBbJ2FdIGlzIHRoZSB0eXBlIG9mIHRoZSB0YXJnZXQgb2JqZWN0OyB0aGUgc2Vjb25kIHBhcmFtZXRlclxuICAgICAgWydiXSBpcyB0aGUgdHlwZSBvZiB0aGUgZXZlbnQgb2JqZWN0LiAqKVxuXG5jbGFzcyB0eXBlIFsnYV0gZXZlbnQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDogJ2EgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRUYXJnZXQgOiAnYSB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICAoKiBMZWdhY3kgbWV0aG9kcyAqKVxuICAgIG1ldGhvZCBzcmNFbGVtZW50IDogJ2EgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBbJ2EsICdiXSBjdXN0b21FdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgWydhXSBldmVudFxuXG4gICAgbWV0aG9kIGRldGFpbCA6ICdiIEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgbm9faGFuZGxlciA6ICgnYSwgJ2IpIGV2ZW50X2xpc3RlbmVyID0gSnMubnVsbFxuXG5sZXQgd2luZG93X2V2ZW50ICgpIDogJ2EgI2V2ZW50IHQgPSBKcy5VbnNhZmUucHVyZV9qc19leHByIFwiZXZlbnRcIlxuXG4oKiBUaGUgZnVuY3Rpb24gcHJldmVudERlZmF1bHQgbXVzdCBiZSBjYWxsZWQgZXhwbGljaXRseSB3aGVuXG4gICB1c2luZyBhZGRFdmVudExpc3RlbmVyLi4uICopXG5sZXQgaGFuZGxlciBmID1cbiAgSnMuc29tZVxuICAgIChKcy5VbnNhZmUuY2FsbGJhY2sgKGZ1biBlIC0+XG4gICAgICAgICAoKiBkZXBlbmRpbmcgb24gdGhlIGludGVybmV0IGV4cGxvcmVyIHZlcnNpb24sIGUgY2FuIGJlIG51bGwgb3IgdW5kZWZpbmVkLiAqKVxuICAgICAgICAgaWYgbm90IChKcy5PcHQudGVzdCAoc29tZSBlKSlcbiAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICBsZXQgZSA9IHdpbmRvd19ldmVudCAoKSBpblxuICAgICAgICAgICBsZXQgcmVzID0gZiBlIGluXG4gICAgICAgICAgIGlmIG5vdCAoSnMudG9fYm9vbCByZXMpIHRoZW4gZSMjLnJldHVyblZhbHVlIDo9IHJlcztcbiAgICAgICAgICAgcmVzKVxuICAgICAgICAgZWxzZVxuICAgICAgICAgICBsZXQgcmVzID0gZiBlIGluXG4gICAgICAgICAgIGlmIG5vdCAoSnMudG9fYm9vbCByZXMpIHRoZW4gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI3ByZXZlbnREZWZhdWx0O1xuICAgICAgICAgICByZXMpKVxuXG5sZXQgZnVsbF9oYW5kbGVyIGYgPVxuICBKcy5zb21lXG4gICAgKEpzLlVuc2FmZS5tZXRoX2NhbGxiYWNrIChmdW4gdGhpcyBlIC0+XG4gICAgICAgICAoKiBkZXBlbmRpbmcgb24gdGhlIGludGVybmV0IGV4cGxvcmVyIHZlcnNpb24sIGUgY2FuIGJlIG51bGwgb3IgdW5kZWZpbmVkICopXG4gICAgICAgICBpZiBub3QgKEpzLk9wdC50ZXN0IChzb21lIGUpKVxuICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgIGxldCBlID0gd2luZG93X2V2ZW50ICgpIGluXG4gICAgICAgICAgIGxldCByZXMgPSBmIHRoaXMgZSBpblxuICAgICAgICAgICBpZiBub3QgKEpzLnRvX2Jvb2wgcmVzKSB0aGVuIGUjIy5yZXR1cm5WYWx1ZSA6PSByZXM7XG4gICAgICAgICAgIHJlcylcbiAgICAgICAgIGVsc2VcbiAgICAgICAgICAgbGV0IHJlcyA9IGYgdGhpcyBlIGluXG4gICAgICAgICAgIGlmIG5vdCAoSnMudG9fYm9vbCByZXMpIHRoZW4gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI3ByZXZlbnREZWZhdWx0O1xuICAgICAgICAgICByZXMpKVxuXG5sZXQgaW52b2tlX2hhbmRsZXIgKGYgOiAoJ2EsICdiKSBldmVudF9saXN0ZW5lcikgKHRoaXMgOiAnYSkgKGV2ZW50IDogJ2IpIDogYm9vbCB0ID1cbiAgSnMuVW5zYWZlLmNhbGwgZiB0aGlzIFt8IEpzLlVuc2FmZS5pbmplY3QgZXZlbnQgfF1cblxubGV0IGV2ZW50VGFyZ2V0IChlIDogKDwgLi4gPiBhcyAnYSkgI2V2ZW50IHQpIDogJ2EgdCA9XG4gIGxldCB0YXJnZXQgPVxuICAgIE9wdC5nZXQgZSMjLnRhcmdldCAoZnVuICgpIC0+IE9wdC5nZXQgZSMjLnNyY0VsZW1lbnQgKGZ1biAoKSAtPiByYWlzZSBOb3RfZm91bmQpKVxuICBpblxuICBpZiBKcy5pbnN0YW5jZW9mIHRhcmdldCBKcy5VbnNhZmUuZ2xvYmFsIyMuX05vZGVcbiAgdGhlblxuICAgICgqIFdvcmthcm91bmQgZm9yIFNhZmFyaSBidWcgKilcbiAgICBsZXQgdGFyZ2V0JyA6IG5vZGUgSnMudCA9IEpzLlVuc2FmZS5jb2VyY2UgdGFyZ2V0IGluXG4gICAgaWYgdGFyZ2V0JyMjLm5vZGVUeXBlID09IFRFWFRcbiAgICB0aGVuIEpzLlVuc2FmZS5jb2VyY2UgKE9wdC5nZXQgdGFyZ2V0JyMjLnBhcmVudE5vZGUgKGZ1biAoKSAtPiBhc3NlcnQgZmFsc2UpKVxuICAgIGVsc2UgdGFyZ2V0XG4gIGVsc2UgdGFyZ2V0XG5cbm1vZHVsZSBFdmVudCA9IHN0cnVjdFxuICB0eXBlICdhIHR5cCA9IEpzLmpzX3N0cmluZyBKcy50XG5cbiAgbGV0IG1ha2UgcyA9IEpzLnN0cmluZyBzXG5lbmRcblxudHlwZSBldmVudF9saXN0ZW5lcl9pZCA9IHVuaXQgLT4gdW5pdFxuXG5jbGFzcyB0eXBlIGV2ZW50X2xpc3RlbmVyX29wdGlvbnMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY2FwdHVyZSA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uY2UgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXNzaXZlIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zIChlIDogKDwgLi4gPiBhcyAnYSkgdCkgdHlwID9jYXB0dXJlID9vbmNlID9wYXNzaXZlIGggPVxuICBpZiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjLmFkZEV2ZW50TGlzdGVuZXIgPT0gSnMudW5kZWZpbmVkXG4gIHRoZW5cbiAgICBsZXQgZXYgPSAoSnMuc3RyaW5nIFwib25cIikjI2NvbmNhdCB0eXAgaW5cbiAgICBsZXQgY2FsbGJhY2sgZSA9IEpzLlVuc2FmZS5jYWxsIChoLCBlLCBbfHxdKSBpblxuICAgIGxldCAoKSA9IChKcy5VbnNhZmUuY29lcmNlIGUpIyNhdHRhY2hFdmVudCBldiBjYWxsYmFjayBpblxuICAgIGZ1biAoKSAtPiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjZGV0YWNoRXZlbnQgZXYgY2FsbGJhY2tcbiAgZWxzZVxuICAgIGxldCBvcHRzIDogZXZlbnRfbGlzdGVuZXJfb3B0aW9ucyB0ID0gSnMuVW5zYWZlLm9iaiBbfHxdIGluXG4gICAgbGV0IGl0ZXIgdCBmID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBOb25lIC0+ICgpXG4gICAgICB8IFNvbWUgYiAtPiBmIGJcbiAgICBpblxuICAgIGl0ZXIgY2FwdHVyZSAoZnVuIGIgLT4gb3B0cyMjLmNhcHR1cmUgOj0gYik7XG4gICAgaXRlciBvbmNlIChmdW4gYiAtPiBvcHRzIyMub25jZSA6PSBiKTtcbiAgICBpdGVyIHBhc3NpdmUgKGZ1biBiIC0+IG9wdHMjIy5wYXNzaXZlIDo9IGIpO1xuICAgIGxldCAoKSA9IChKcy5VbnNhZmUuY29lcmNlIGUpIyNhZGRFdmVudExpc3RlbmVyIHR5cCBoIG9wdHMgaW5cbiAgICBmdW4gKCkgLT4gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI3JlbW92ZUV2ZW50TGlzdGVuZXIgdHlwIGggb3B0c1xuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lciAoZSA6ICg8IC4uID4gYXMgJ2EpIHQpIHR5cCBoIGNhcHQgPVxuICBhZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgZSB0eXAgfmNhcHR1cmU6Y2FwdCBoXG5cbmxldCByZW1vdmVFdmVudExpc3RlbmVyIGlkID0gaWQgKClcblxubGV0IHByZXZlbnREZWZhdWx0IGV2ID1cbiAgaWYgSnMuT3B0ZGVmLnRlc3QgKEpzLlVuc2FmZS5jb2VyY2UgZXYpIyMucHJldmVudERlZmF1bHQgKCogSUUgaGFjayAqKVxuICB0aGVuIChKcy5VbnNhZmUuY29lcmNlIGV2KSMjcHJldmVudERlZmF1bHRcbiAgZWxzZSAoSnMuVW5zYWZlLmNvZXJjZSBldikjIy5yZXR1cm5WYWx1ZSA6PSBKcy5ib29sIGZhbHNlXG5cbmxldCBjcmVhdGVDdXN0b21FdmVudCA/YnViYmxlcyA/Y2FuY2VsYWJsZSA/ZGV0YWlsIHR5cCA9XG4gIGxldCBvcHRfaXRlciBmID0gZnVuY3Rpb25cbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgeCAtPiBmIHhcbiAgaW5cbiAgbGV0IG9wdHMgPSBVbnNhZmUub2JqIFt8fF0gaW5cbiAgb3B0X2l0ZXIgKGZ1biB4IC0+IG9wdHMjIy5idWJibGVzIDo9IGJvb2wgeCkgYnViYmxlcztcbiAgb3B0X2l0ZXIgKGZ1biB4IC0+IG9wdHMjIy5jYW5jZWxhYmxlIDo9IGJvb2wgeCkgY2FuY2VsYWJsZTtcbiAgb3B0X2l0ZXIgKGZ1biB4IC0+IG9wdHMjIy5kZXRhaWwgOj0gc29tZSB4KSBkZXRhaWw7XG4gIGxldCBjb25zdHIgOlxuICAgICAgKCAgICgnYSwgJ2IpICNjdXN0b21FdmVudCBKcy50IEV2ZW50LnR5cFxuICAgICAgIC0+IDwgZGV0YWlsIDogJ2Igb3B0IHByb3AgPiB0XG4gICAgICAgLT4gKCdhLCAnYikgY3VzdG9tRXZlbnQgdClcbiAgICAgIGNvbnN0ciA9XG4gICAgVW5zYWZlLmdsb2JhbCMjLl9DdXN0b21FdmVudFxuICBpblxuICBuZXclanMgY29uc3RyIHR5cCBvcHRzXG5cbigqIElFIDwgOSAqKVxuXG5jbGFzcyB0eXBlIHN0cmluZ0xpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udGFpbnMgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuICBlbmRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5vcGVuIEpzXG5cbnR5cGUgdWludDMyID0gZmxvYXRcblxuY2xhc3MgdHlwZSBhcnJheUJ1ZmZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBieXRlTGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4gYXJyYXlCdWZmZXIgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2VfdG9FbmQgOiBpbnQgLT4gYXJyYXlCdWZmZXIgdCBtZXRoXG4gIGVuZFxuXG5sZXQgYXJyYXlCdWZmZXIgOiAoaW50IC0+IGFycmF5QnVmZmVyIHQpIGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fQXJyYXlCdWZmZXJcblxuY2xhc3MgdHlwZSBhcnJheUJ1ZmZlclZpZXcgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYnVmZmVyIDogYXJyYXlCdWZmZXIgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYnl0ZU9mZnNldCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYnl0ZUxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIFsnYSwgJ2JdIHR5cGVkQXJyYXkgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGFycmF5QnVmZmVyVmlld1xuXG4gICAgbWV0aG9kIF9CWVRFU19QRVJfRUxFTUVOVCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZXRfZnJvbUFycmF5IDogJ2EganNfYXJyYXkgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0X2Zyb21UeXBlZEFycmF5IDogKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdWJhcnJheSA6IGludCAtPiBpbnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzdWJhcnJheV90b0VuZCA6IGludCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX3RvRW5kIDogaW50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCBtZXRoXG5cbiAgICAoKiBUaGlzIGZha2UgbWV0aG9kIGlzIG5lZWRlZCBmb3IgdHlwaW5nIHB1cnBvc2VzLlxuICAgICAgIFdpdGhvdXQgaXQsIFsnYl0gd291bGQgbm90IGJlIGNvbnN0cmFpbmVkLiAqKVxuICAgIG1ldGhvZCBfY29udGVudF90eXBlXyA6ICdiIG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG50eXBlIGludDhBcnJheSA9IChpbnQsIEJpZ2FycmF5LmludDhfc2lnbmVkX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIHVpbnQ4QXJyYXkgPSAoaW50LCBCaWdhcnJheS5pbnQ4X3Vuc2lnbmVkX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIGludDE2QXJyYXkgPSAoaW50LCBCaWdhcnJheS5pbnQxNl9zaWduZWRfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgdWludDE2QXJyYXkgPSAoaW50LCBCaWdhcnJheS5pbnQxNl91bnNpZ25lZF9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSBpbnQzMkFycmF5ID0gKGludDMyLCBCaWdhcnJheS5pbnQzMl9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSB1aW50MzJBcnJheSA9IChpbnQzMiwgQmlnYXJyYXkuaW50MzJfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgZmxvYXQzMkFycmF5ID0gKGZsb2F0LCBCaWdhcnJheS5mbG9hdDMyX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIGZsb2F0NjRBcnJheSA9IChmbG9hdCwgQmlnYXJyYXkuZmxvYXQ2NF9lbHQpIHR5cGVkQXJyYXlcblxuZXh0ZXJuYWwga2luZCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiAoJ2EsICdiKSBCaWdhcnJheS5raW5kXG4gID0gXCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcIlxuXG5leHRlcm5hbCBmcm9tX2dlbmFycmF5IDpcbiAgKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheSB0XG4gID0gXCJjYW1sX2JhX3RvX3R5cGVkX2FycmF5XCJcblxuZXh0ZXJuYWwgdG9fZ2VuYXJyYXkgOlxuICAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnRcbiAgPSBcImNhbWxfYmFfZnJvbV90eXBlZF9hcnJheVwiXG5cbmxldCBpbnQ4QXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludDhBcnJheVxuXG5sZXQgaW50OEFycmF5X2Zyb21BcnJheSA9IGludDhBcnJheVxuXG5sZXQgaW50OEFycmF5X2Zyb21UeXBlZEFycmF5ID0gaW50OEFycmF5XG5cbmxldCBpbnQ4QXJyYXlfZnJvbUJ1ZmZlciA9IGludDhBcnJheVxuXG5sZXQgaW50OEFycmF5X2luQnVmZmVyID0gaW50OEFycmF5XG5cbmxldCB1aW50OEFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9VaW50OEFycmF5XG5cbmxldCB1aW50OEFycmF5X2Zyb21BcnJheSA9IHVpbnQ4QXJyYXlcblxubGV0IHVpbnQ4QXJyYXlfZnJvbVR5cGVkQXJyYXkgPSB1aW50OEFycmF5XG5cbmxldCB1aW50OEFycmF5X2Zyb21CdWZmZXIgPSB1aW50OEFycmF5XG5cbmxldCB1aW50OEFycmF5X2luQnVmZmVyID0gdWludDhBcnJheVxuXG5sZXQgaW50MTZBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50MTZBcnJheVxuXG5sZXQgaW50MTZBcnJheV9mcm9tQXJyYXkgPSBpbnQxNkFycmF5XG5cbmxldCBpbnQxNkFycmF5X2Zyb21UeXBlZEFycmF5ID0gaW50MTZBcnJheVxuXG5sZXQgaW50MTZBcnJheV9mcm9tQnVmZmVyID0gaW50MTZBcnJheVxuXG5sZXQgaW50MTZBcnJheV9pbkJ1ZmZlciA9IGludDE2QXJyYXlcblxubGV0IHVpbnQxNkFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9VaW50MTZBcnJheVxuXG5sZXQgdWludDE2QXJyYXlfZnJvbUFycmF5ID0gdWludDE2QXJyYXlcblxubGV0IHVpbnQxNkFycmF5X2Zyb21UeXBlZEFycmF5ID0gdWludDE2QXJyYXlcblxubGV0IHVpbnQxNkFycmF5X2Zyb21CdWZmZXIgPSB1aW50MTZBcnJheVxuXG5sZXQgdWludDE2QXJyYXlfaW5CdWZmZXIgPSB1aW50MTZBcnJheVxuXG5sZXQgaW50MzJBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50MzJBcnJheVxuXG5sZXQgaW50MzJBcnJheV9mcm9tQXJyYXkgPSBpbnQzMkFycmF5XG5cbmxldCBpbnQzMkFycmF5X2Zyb21UeXBlZEFycmF5ID0gaW50MzJBcnJheVxuXG5sZXQgaW50MzJBcnJheV9mcm9tQnVmZmVyID0gaW50MzJBcnJheVxuXG5sZXQgaW50MzJBcnJheV9pbkJ1ZmZlciA9IGludDMyQXJyYXlcblxubGV0IHVpbnQzMkFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9VaW50MzJBcnJheVxuXG5sZXQgdWludDMyQXJyYXlfZnJvbUFycmF5ID0gdWludDMyQXJyYXlcblxubGV0IHVpbnQzMkFycmF5X2Zyb21UeXBlZEFycmF5ID0gdWludDMyQXJyYXlcblxubGV0IHVpbnQzMkFycmF5X2Zyb21CdWZmZXIgPSB1aW50MzJBcnJheVxuXG5sZXQgdWludDMyQXJyYXlfaW5CdWZmZXIgPSB1aW50MzJBcnJheVxuXG5sZXQgZmxvYXQzMkFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9GbG9hdDMyQXJyYXlcblxubGV0IGZsb2F0MzJBcnJheV9mcm9tQXJyYXkgPSBmbG9hdDMyQXJyYXlcblxubGV0IGZsb2F0MzJBcnJheV9mcm9tVHlwZWRBcnJheSA9IGZsb2F0MzJBcnJheVxuXG5sZXQgZmxvYXQzMkFycmF5X2Zyb21CdWZmZXIgPSBmbG9hdDMyQXJyYXlcblxubGV0IGZsb2F0MzJBcnJheV9pbkJ1ZmZlciA9IGZsb2F0MzJBcnJheVxuXG5sZXQgZmxvYXQ2NEFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9GbG9hdDY0QXJyYXlcblxubGV0IGZsb2F0NjRBcnJheV9mcm9tQXJyYXkgPSBmbG9hdDY0QXJyYXlcblxubGV0IGZsb2F0NjRBcnJheV9mcm9tVHlwZWRBcnJheSA9IGZsb2F0NjRBcnJheVxuXG5sZXQgZmxvYXQ2NEFycmF5X2Zyb21CdWZmZXIgPSBmbG9hdDY0QXJyYXlcblxubGV0IGZsb2F0NjRBcnJheV9pbkJ1ZmZlciA9IGZsb2F0NjRBcnJheVxuXG5sZXQgc2V0IDogKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID1cbiBmdW4gYSBpIHYgLT4gYXJyYXlfc2V0IChVbnNhZmUuY29lcmNlIGEpIGkgdlxuXG5sZXQgZ2V0IDogKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+IGludCAtPiAnYSBvcHRkZWYgPSBmdW4gYSBpIC0+IEpzLlVuc2FmZS5nZXQgYSBpXG5cbmxldCB1bnNhZmVfZ2V0IDogKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+IGludCAtPiAnYSA9IGZ1biBhIGkgLT4gSnMuVW5zYWZlLmdldCBhIGlcblxuY2xhc3MgdHlwZSBkYXRhVmlldyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgYXJyYXlCdWZmZXJWaWV3XG5cbiAgICBtZXRob2QgZ2V0SW50OCA6IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVpbnQ4IDogaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW50MTYgOiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbnQxNl8gOiBpbnQgLT4gYm9vbCB0IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VWludDE2IDogaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VWludDE2XyA6IGludCAtPiBib29sIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbnQzMiA6IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEludDMyXyA6IGludCAtPiBib29sIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVaW50MzIgOiBpbnQgLT4gdWludDMyIG1ldGhcblxuICAgIG1ldGhvZCBnZXRVaW50MzJfIDogaW50IC0+IGJvb2wgdCAtPiB1aW50MzIgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZsb2F0MzIgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZsb2F0MzJfIDogaW50IC0+IGJvb2wgdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RmxvYXQ2NCA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RmxvYXQ2NF8gOiBpbnQgLT4gYm9vbCB0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnQ4IDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVaW50OCA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50MTYgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludDE2XyA6IGludCAtPiBpbnQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVpbnQxNiA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VWludDE2XyA6IGludCAtPiBpbnQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludDMyIDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnQzMl8gOiBpbnQgLT4gaW50IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVaW50MzIgOiBpbnQgLT4gdWludDMyIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVpbnQzMl8gOiBpbnQgLT4gdWludDMyIC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRGbG9hdDMyIDogaW50IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEZsb2F0MzJfIDogaW50IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRGbG9hdDY0IDogaW50IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEZsb2F0NjRfIDogaW50IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmxldCBkYXRhVmlldyA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRGF0YVZpZXdcblxubGV0IGRhdGFWaWV3X2luQnVmZmVyID0gZGF0YVZpZXdcblxubW9kdWxlIEJpZ3N0cmluZyA9IHN0cnVjdFxuICB0eXBlIHQgPSAoY2hhciwgQmlnYXJyYXkuaW50OF91bnNpZ25lZF9lbHQsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5BcnJheTEudFxuXG4gIGV4dGVybmFsIHRvX2FycmF5QnVmZmVyIDogdCAtPiBhcnJheUJ1ZmZlciBKcy50ID0gXCJiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyXCJcblxuICBleHRlcm5hbCB0b191aW50OEFycmF5IDogdCAtPiB1aW50OEFycmF5IEpzLnQgPSBcImJpZ3N0cmluZ190b190eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgb2ZfYXJyYXlCdWZmZXIgOiBhcnJheUJ1ZmZlciBKcy50IC0+IHQgPSBcImJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXJcIlxuXG4gIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IEpzLnQgLT4gdCA9IFwiYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5XCJcbmVuZFxuXG5tb2R1bGUgU3RyaW5nID0gc3RydWN0XG4gIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IEpzLnQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9hcnJheVwiXG5cbiAgbGV0IG9mX2FycmF5QnVmZmVyIGFiID1cbiAgICBsZXQgdWludDggPSBuZXclanMgdWludDhBcnJheV9mcm9tQnVmZmVyIGFiIGluXG4gICAgb2ZfdWludDhBcnJheSB1aW50OFxuZW5kXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDExIFBpZXJyZSBDaGFtYmFydFxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4gRG9tXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBibG9iID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHNpemUgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiBibG9iIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX3dpdGhDb250ZW50VHlwZSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgLT4gYmxvYiB0IG1ldGhcbiAgZW5kXG5cbmxldCBibG9iX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fQmxvYlxuXG50eXBlICdhIG1ha2VfYmxvYiA9XG4gID9jb250ZW50VHlwZTpzdHJpbmcgLT4gP2VuZGluZ3M6WyBgVHJhbnNwYXJlbnQgfCBgTmF0aXZlIF0gLT4gJ2EgLT4gYmxvYiB0XG5cbmxldCByZWMgZmlsdGVyX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IHYgOjogcSAtPiAoXG4gICAgICBtYXRjaCBmIHYgd2l0aFxuICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBxXG4gICAgICB8IFNvbWUgdicgLT4gdicgOjogZmlsdGVyX21hcCBmIHEpXG5cbmxldCBtYWtlX2Jsb2Jfb3B0aW9ucyBjb250ZW50VHlwZSBlbmRpbmdzID1cbiAgbGV0IG9wdGlvbnMgPVxuICAgIGZpbHRlcl9tYXBcbiAgICAgIChmdW4gKG5hbWUsIHYpIC0+XG4gICAgICAgIG1hdGNoIHYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICB8IFNvbWUgdiAtPiBTb21lIChuYW1lLCBVbnNhZmUuaW5qZWN0IChzdHJpbmcgdikpKVxuICAgICAgWyBcInR5cGVcIiwgY29udGVudFR5cGVcbiAgICAgIDsgKCBcImVuZGluZ3NcIlxuICAgICAgICAsIG1hdGNoIGVuZGluZ3Mgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgICAgfCBTb21lIGBUcmFuc3BhcmVudCAtPiBTb21lIFwidHJhbnNwYXJlbnRcIlxuICAgICAgICAgIHwgU29tZSBgTmF0aXZlIC0+IFNvbWUgXCJuYXRpdmVcIiApXG4gICAgICBdXG4gIGluXG4gIG1hdGNoIG9wdGlvbnMgd2l0aFxuICB8IFtdIC0+IHVuZGVmaW5lZFxuICB8IGwgLT4gVW5zYWZlLm9iaiAoQXJyYXkub2ZfbGlzdCBsKVxuXG5sZXQgYmxvYl9yYXcgP2NvbnRlbnRUeXBlID9lbmRpbmdzIGEgPVxuICBsZXQgb3B0aW9ucyA9IG1ha2VfYmxvYl9vcHRpb25zIGNvbnRlbnRUeXBlIGVuZGluZ3MgaW5cbiAgbmV3JWpzIGJsb2JfY29uc3RyIChhcnJheSBhKSBvcHRpb25zXG5cbmxldCBibG9iX2Zyb21fc3RyaW5nID9jb250ZW50VHlwZSA/ZW5kaW5ncyBzID1cbiAgYmxvYl9yYXcgP2NvbnRlbnRUeXBlID9lbmRpbmdzIFt8IHN0cmluZyBzIHxdXG5cbmxldCBibG9iX2Zyb21fYW55ID9jb250ZW50VHlwZSA/ZW5kaW5ncyBsID1cbiAgbGV0IGwgPVxuICAgIExpc3QubWFwXG4gICAgICAoZnVuY3Rpb25cbiAgICAgICAgfCBgYXJyYXlCdWZmZXIgYSAtPiBVbnNhZmUuaW5qZWN0IGFcbiAgICAgICAgfCBgYXJyYXlCdWZmZXJWaWV3IGEgLT4gVW5zYWZlLmluamVjdCBhXG4gICAgICAgIHwgYHN0cmluZyBzIC0+IFVuc2FmZS5pbmplY3QgKHN0cmluZyBzKVxuICAgICAgICB8IGBqc19zdHJpbmcgcyAtPiBVbnNhZmUuaW5qZWN0IHNcbiAgICAgICAgfCBgYmxvYiBiIC0+IFVuc2FmZS5pbmplY3QgYilcbiAgICAgIGxcbiAgaW5cbiAgYmxvYl9yYXcgP2NvbnRlbnRUeXBlID9lbmRpbmdzIChBcnJheS5vZl9saXN0IGwpXG5cbmNsYXNzIHR5cGUgZmlsZSA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgYmxvYlxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGFzdE1vZGlmaWVkRGF0ZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGluIGZpcmVmb3ggMy4wLTMuNSBmaWxlLm5hbWUgaXMgbm90IGF2YWlsYWJsZSwgd2UgdXNlIHRoZSBub25zdGFuZGFyZCBmaWxlTmFtZSBpbnN0ZWFkICopXG5jbGFzcyB0eXBlIGZpbGVfbmFtZV9vbmx5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbGVOYW1lIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBmaWxlbmFtZSBmaWxlID1cbiAgbGV0IGZpbGUgOiBmaWxlX25hbWVfb25seSB0ID0gSnMuVW5zYWZlLmNvZXJjZSBmaWxlIGluXG4gIG1hdGNoIE9wdGRlZi50b19vcHRpb24gZmlsZSMjLm5hbWUgd2l0aFxuICB8IE5vbmUgLT4gKFxuICAgICAgbWF0Y2ggT3B0ZGVmLnRvX29wdGlvbiBmaWxlIyMuZmlsZU5hbWUgd2l0aFxuICAgICAgfCBOb25lIC0+IGZhaWx3aXRoIFwiY2FuJ3QgcmV0cmlldmUgZmlsZSBuYW1lOiBub3QgaW1wbGVtZW50ZWRcIlxuICAgICAgfCBTb21lIG5hbWUgLT4gbmFtZSlcbiAgfCBTb21lIG5hbWUgLT4gbmFtZVxuXG50eXBlIGZpbGVfYW55ID0gPCA+IHRcblxubGV0IGRvY19jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX0RvY3VtZW50XG5cbm1vZHVsZSBDb2VyY2VUbyA9IHN0cnVjdFxuICBleHRlcm5hbCBqc29uIDogZmlsZV9hbnkgLT4gJ2EgT3B0LnQgPSBcIiVpZGVudGl0eVwiXG5cbiAgbGV0IGRvY3VtZW50IChlIDogZmlsZV9hbnkpID1cbiAgICBpZiBpbnN0YW5jZW9mIGUgZG9jX2NvbnN0clxuICAgIHRoZW4gSnMuc29tZSAoVW5zYWZlLmNvZXJjZSBlIDogZWxlbWVudCBkb2N1bWVudCB0KVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBibG9iIChlIDogZmlsZV9hbnkpID1cbiAgICBpZiBpbnN0YW5jZW9mIGUgYmxvYl9jb25zdHIgdGhlbiBKcy5zb21lIChVbnNhZmUuY29lcmNlIGUgOiAjYmxvYiB0KSBlbHNlIEpzLm51bGxcblxuICBsZXQgc3RyaW5nIChlIDogZmlsZV9hbnkpID1cbiAgICBpZiB0eXBlb2YgZSA9PSBzdHJpbmcgXCJzdHJpbmdcIlxuICAgIHRoZW4gSnMuc29tZSAoVW5zYWZlLmNvZXJjZSBlIDoganNfc3RyaW5nIHQpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGFycmF5QnVmZmVyIChlIDogZmlsZV9hbnkpID1cbiAgICBpZiBpbnN0YW5jZW9mIGUgVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJcbiAgICB0aGVuIEpzLnNvbWUgKFVuc2FmZS5jb2VyY2UgZSA6IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIHQpXG4gICAgZWxzZSBKcy5udWxsXG5lbmRcblxuY2xhc3MgdHlwZSBmaWxlTGlzdCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2ZpbGVdIERvbS5ub2RlTGlzdFxuICBlbmRcblxuY2xhc3MgdHlwZSBmaWxlRXJyb3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY29kZSA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIFsnYV0gcHJvZ3Jlc3NFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgWydhXSBldmVudFxuXG4gICAgbWV0aG9kIGxlbmd0aENvbXB1dGFibGUgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxvYWRlZCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdG90YWwgOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwcm9ncmVzc0V2ZW50VGFyZ2V0ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBtZXRob2Qgb25sb2Fkc3RhcnQgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucHJvZ3Jlc3MgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZCA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25hYm9ydCA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25lcnJvciA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb2FkZW5kIDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbnR5cGUgcmVhZHlTdGF0ZSA9XG4gIHwgRU1QVFlcbiAgfCBMT0FESU5HXG4gIHwgRE9ORVxuXG5jbGFzcyB0eXBlIGZpbGVSZWFkZXIgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIG1ldGhvZCByZWFkQXNBcnJheUJ1ZmZlciA6ICNibG9iIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZEFzQmluYXJ5U3RyaW5nIDogI2Jsb2IgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkQXNUZXh0IDogI2Jsb2IgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkQXNUZXh0X3dpdGhFbmNvZGluZyA6ICNibG9iIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZEFzRGF0YVVSTCA6ICNibG9iIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYWJvcnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDogcmVhZHlTdGF0ZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVzdWx0IDogZmlsZV9hbnkgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVycm9yIDogZmlsZUVycm9yIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgaW5oZXJpdCBwcm9ncmVzc0V2ZW50VGFyZ2V0XG4gIGVuZFxuXG5tb2R1bGUgUmVhZGVyRXZlbnQgPSBzdHJ1Y3RcbiAgdHlwZSB0eXAgPSBmaWxlUmVhZGVyIHByb2dyZXNzRXZlbnQgdCBEb20uRXZlbnQudHlwXG5cbiAgbGV0IGxvYWRzdGFydCA9IEV2ZW50Lm1ha2UgXCJsb2Fkc3RhcnRcIlxuXG4gIGxldCBwcm9ncmVzcyA9IEV2ZW50Lm1ha2UgXCJwcm9ncmVzc1wiXG5cbiAgbGV0IGFib3J0ID0gRXZlbnQubWFrZSBcImFib3J0XCJcblxuICBsZXQgZXJyb3IgPSBFdmVudC5tYWtlIFwiZXJyb3JcIlxuXG4gIGxldCBsb2FkID0gRXZlbnQubWFrZSBcImxvYWRcIlxuXG4gIGxldCBsb2FkZW5kID0gRXZlbnQubWFrZSBcImxvYWRlbmRcIlxuZW5kXG5cbmxldCBmaWxlUmVhZGVyIDogZmlsZVJlYWRlciB0IGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRmlsZVJlYWRlclxuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lciA9IERvbS5hZGRFdmVudExpc3RlbmVyXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbmV4dGVybmFsIGNhbWxfanNfb25faWUgOiB1bml0IC0+IGJvb2wgdCA9IFwiY2FtbF9qc19vbl9pZVwiXG5cbmxldCBvbklFID0gSnMudG9fYm9vbCAoY2FtbF9qc19vbl9pZSAoKSlcblxuZXh0ZXJuYWwgaHRtbF9lc2NhcGUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc19odG1sX2VzY2FwZVwiXG5cbmV4dGVybmFsIGRlY29kZV9odG1sX2VudGl0aWVzIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNfaHRtbF9lbnRpdGllc1wiXG5cbmNsYXNzIHR5cGUgY3NzU3R5bGVEZWNsYXJhdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBzZXRQcm9wZXJ0eSA6XG4gICAgICBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHRkZWYgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFByb3BlcnR5VmFsdWUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UHJvcGVydHlQcmlvcml0eSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVQcm9wZXJ0eSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBhbmltYXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uRGVsYXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uRGlyZWN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbkR1cmF0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbkZpbGxNb2RlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbk5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uUGxheVN0YXRlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZEF0dGFjaG1lbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZENvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmRJbWFnZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kUG9zaXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZFJlcGVhdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQm90dG9tIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckJvdHRvbUNvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckJvdHRvbVN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckJvdHRvbVdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckNvbGxhcHNlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckNvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckxlZnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyTGVmdENvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckxlZnRTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJMZWZ0V2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyUmFkaXVzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclJpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclJpZ2h0Q29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyUmlnaHRTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJSaWdodFdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclNwYWNpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyU3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyVG9wIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclRvcENvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclRvcFN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclRvcFdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlcldpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvdHRvbSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjYXB0aW9uU2lkZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGVhciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGlwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY291bnRlckluY3JlbWVudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb3VudGVyUmVzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY3NzRmxvYXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY3NzVGV4dCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjdXJzb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGlyZWN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRpc3BsYXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZW1wdHlDZWxscyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmaWxsIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udEZhbWlseSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250U2l6ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250U3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udFZhcmlhbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udFdlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGVmdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsZXR0ZXJTcGFjaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpbmVIZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGlzdFN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpc3RTdHlsZUltYWdlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpc3RTdHlsZVBvc2l0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpc3RTdHlsZVR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbkJvdHRvbSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5MZWZ0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpblJpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpblRvcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXhIZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWF4V2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWluSGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1pbldpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG9wYWNpdHkgOiBqc19zdHJpbmcgdCBvcHRkZWYgcHJvcFxuXG4gICAgbWV0aG9kIG91dGxpbmUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3V0bGluZUNvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG91dGxpbmVPZmZzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3V0bGluZVN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG91dGxpbmVXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdmVyZmxvdyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdmVyZmxvd1ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3ZlcmZsb3dZIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZGRpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFkZGluZ0JvdHRvbSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWRkaW5nTGVmdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWRkaW5nUmlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFkZGluZ1RvcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWdlQnJlYWtBZnRlciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWdlQnJlYWtCZWZvcmUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcG9pbnRlckV2ZW50cyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwb3NpdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdHJva2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3Ryb2tlV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFibGVMYXlvdXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dEFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRBbmNob3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dERlY29yYXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dEluZGVudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0VHJhbnNmb3JtIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRvcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0cmFuc2Zvcm0gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdmVydGljYWxBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2aXNpYmlsaXR5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdoaXRlU3BhY2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd29yZFNwYWNpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgekluZGV4IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxudHlwZSAoJ2EsICdiKSBldmVudF9saXN0ZW5lciA9ICgnYSwgJ2IpIERvbS5ldmVudF9saXN0ZW5lclxuXG50eXBlIG1vdXNlX2J1dHRvbiA9XG4gIHwgTm9fYnV0dG9uXG4gIHwgTGVmdF9idXR0b25cbiAgfCBNaWRkbGVfYnV0dG9uXG4gIHwgUmlnaHRfYnV0dG9uXG5cbnR5cGUgZGVsdGFfbW9kZSA9XG4gIHwgRGVsdGFfcGl4ZWxcbiAgfCBEZWx0YV9saW5lXG4gIHwgRGVsdGFfcGFnZVxuXG5jbGFzcyB0eXBlIGV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbZWxlbWVudF0gRG9tLmV2ZW50XG4gIGVuZFxuXG5hbmQgWydhXSBjdXN0b21FdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2VsZW1lbnQsICdhXSBEb20uY3VzdG9tRXZlbnRcbiAgZW5kXG5cbmFuZCBmb2N1c0V2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHJlbGF0ZWRUYXJnZXQgOiBlbGVtZW50IHQgb3B0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgbW91c2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCByZWxhdGVkVGFyZ2V0IDogZWxlbWVudCB0IG9wdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldFggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldFkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN0cmxLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNoaWZ0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbHRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1ldGFLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJ1dHRvbiA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2hpY2ggOiBtb3VzZV9idXR0b24gb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmcm9tRWxlbWVudCA6IGVsZW1lbnQgdCBvcHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0b0VsZW1lbnQgOiBlbGVtZW50IHQgb3B0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFnZVggOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYWdlWSA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGtleWJvYXJkRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgYWx0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzaGlmdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3RybEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWV0YUtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbG9jYXRpb24gOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGtleSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29kZSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2hpY2ggOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjaGFyQ29kZSA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGtleUNvZGUgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldE1vZGlmaWVyU3RhdGUgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGtleUlkZW50aWZpZXIgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIG1vdXNld2hlZWxFdmVudCA9XG4gIG9iamVjdFxuICAgICgqIEFsbCBtb2Rlcm4gYnJvd3NlcnMgKilcbiAgICBpbmhlcml0IG1vdXNlRXZlbnRcblxuICAgIG1ldGhvZCB3aGVlbERlbHRhIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aGVlbERlbHRhWCA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdoZWVsRGVsdGFZIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGVsdGFYIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRlbHRhWSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZWx0YVogOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGVsdGFNb2RlIDogZGVsdGFfbW9kZSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgbW91c2VTY3JvbGxFdmVudCA9XG4gIG9iamVjdFxuICAgICgqIEZpcmVmb3ggKilcbiAgICBpbmhlcml0IG1vdXNlRXZlbnRcblxuICAgIG1ldGhvZCBkZXRhaWwgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF4aXMgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSE9SSVpPTlRBTF9BWElTIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRJQ0FMX0FYSVMgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCB0b3VjaEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHRvdWNoZXMgOiB0b3VjaExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0VG91Y2hlcyA6IHRvdWNoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjaGFuZ2VkVG91Y2hlcyA6IHRvdWNoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdHJsS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzaGlmdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWx0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZXRhS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWxhdGVkVGFyZ2V0IDogZWxlbWVudCB0IG9wdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHRvdWNoTGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gdG91Y2ggdCBvcHRkZWYgbWV0aFxuICBlbmRcblxuYW5kIHRvdWNoID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGlkZW50aWZpZXIgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGVsZW1lbnQgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VYIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYWdlWSA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgc3VibWl0RXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2Qgc3VibWl0dGVyIDogZWxlbWVudCB0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgZHJhZ0V2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBtb3VzZUV2ZW50XG5cbiAgICBtZXRob2QgZGF0YVRyYW5zZmVyIDogZGF0YVRyYW5zZmVyIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGNsaXBib2FyZEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGNsaXBib2FyZERhdGEgOiBkYXRhVHJhbnNmZXIgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgZGF0YVRyYW5zZmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGRyb3BFZmZlY3QgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZWZmZWN0QWxsb3dlZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmaWxlcyA6IEZpbGUuZmlsZUxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdHlwZXMgOiBqc19zdHJpbmcgdCBqc19hcnJheSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhZGRFbGVtZW50IDogZWxlbWVudCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyRGF0YSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyRGF0YV9hbGwgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXREYXRhIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldERhdGEgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXREcmFnSW1hZ2UgOiBlbGVtZW50IHQgLT4gaW50IC0+IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmFuZCBldmVudFRhcmdldCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgbWV0aG9kIG9uY2xpY2sgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZGJsY2xpY2sgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubW91c2Vkb3duIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1vdXNldXAgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubW91c2VvdmVyIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1vdXNlbW92ZSA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tb3VzZW91dCA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25rZXlwcmVzcyA6ICgnc2VsZiB0LCBrZXlib2FyZEV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25rZXlkb3duIDogKCdzZWxmIHQsIGtleWJvYXJkRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmtleXVwIDogKCdzZWxmIHQsIGtleWJvYXJkRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnNjcm9sbCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ud2hlZWwgOiAoJ3NlbGYgdCwgbW91c2V3aGVlbEV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnc3RhcnQgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnZW5kIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZ2VudGVyIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZ292ZXIgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnbGVhdmUgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJvcCA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmFuaW1hdGlvbnN0YXJ0IDogKCdzZWxmIHQsIGFuaW1hdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25hbmltYXRpb25lbmQgOiAoJ3NlbGYgdCwgYW5pbWF0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmFuaW1hdGlvbml0ZXJhdGlvbiA6XG4gICAgICAoJ3NlbGYgdCwgYW5pbWF0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmFuaW1hdGlvbmNhbmNlbCA6ICgnc2VsZiB0LCBhbmltYXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9udHJhbnNpdGlvbnJ1biA6ICgnc2VsZiB0LCB0cmFuc2l0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnRyYW5zaXRpb25zdGFydCA6ICgnc2VsZiB0LCB0cmFuc2l0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnRyYW5zaXRpb25lbmQgOiAoJ3NlbGYgdCwgdHJhbnNpdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb250cmFuc2l0aW9uY2FuY2VsIDogKCdzZWxmIHQsIHRyYW5zaXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZ290cG9pbnRlcmNhcHR1cmUgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb3N0cG9pbnRlcmNhcHR1cmUgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVyZW50ZXIgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVyY2FuY2VsIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcmRvd24gOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVybGVhdmUgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVybW92ZSA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJvdXQgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVyb3ZlciA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJ1cCA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkaXNwYXRjaEV2ZW50IDogZXZlbnQgdCAtPiBib29sIHQgbWV0aFxuICBlbmRcblxuYW5kIHBvcFN0YXRlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2Qgc3RhdGUgOiBKcy5VbnNhZmUuYW55IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBwb2ludGVyRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG1vdXNlRXZlbnRcblxuICAgIG1ldGhvZCBwb2ludGVySWQgOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmVzc3VyZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YW5nZW50aWFsUHJlc3N1cmUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGlsdFggOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRpbHRZIDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0d2lzdCA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcG9pbnRlclR5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXNQcmltYXJ5IDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBzdG9yYWdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2Qga2V5IDoganNfc3RyaW5nIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbGRWYWx1ZSA6IGpzX3N0cmluZyB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmV3VmFsdWUgOiBqc19zdHJpbmcgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVybCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdG9yYWdlQXJlYSA6IHN0b3JhZ2UgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHN0b3JhZ2UgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBrZXkgOiBpbnQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJdGVtIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJdGVtIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlSXRlbSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyIDogdW5pdCBtZXRoXG4gIGVuZFxuXG5hbmQgaGFzaENoYW5nZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIG9sZFVSTCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuZXdVUkwgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgYW5pbWF0aW9uRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgYW5pbWF0aW9uTmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbGFwc2VkVGltZSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwc2V1ZG9FbGVtZW50IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHRyYW5zaXRpb25FdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBwcm9wZXJ0eU5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZWxhcHNlZFRpbWUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHNldWRvRWxlbWVudCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBtZWRpYUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuICBlbmRcblxuYW5kIG1lc3NhZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBkYXRhIDogVW5zYWZlLmFueSBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNvdXJjZSA6IFVuc2FmZS5hbnkgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBub2RlU2VsZWN0b3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcXVlcnlTZWxlY3RvciA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHF1ZXJ5U2VsZWN0b3JBbGwgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IERvbS5ub2RlTGlzdCB0IG1ldGhcbiAgZW5kXG5cbmFuZCB0b2tlbkxpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+IGpzX3N0cmluZyB0IG9wdGRlZiBtZXRoXG5cbiAgICBtZXRob2QgY29udGFpbnMgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGFkZCA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRvZ2dsZSA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RyaW5naWZpZXIgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5hbmQgZWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgRG9tLmVsZW1lbnRcblxuICAgIGluaGVyaXQgbm9kZVNlbGVjdG9yXG5cbiAgICBtZXRob2QgaWQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGl0bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGFuZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkaXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xhc3NOYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsYXNzTGlzdCA6IHRva2VuTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbG9zZXN0IDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc3R5bGUgOiBjc3NTdHlsZURlY2xhcmF0aW9uIHQgcHJvcFxuXG4gICAgbWV0aG9kIGlubmVySFRNTCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdXRlckhUTUwgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dENvbnRlbnQgOiBqc19zdHJpbmcgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIGlubmVyVGV4dCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGllbnRMZWZ0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRUb3AgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFdpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRIZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldExlZnQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldFRvcCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0UGFyZW50IDogZWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0V2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldEhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsTGVmdCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsVG9wIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzY3JvbGxXaWR0aCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsSGVpZ2h0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBnZXRDbGllbnRSZWN0cyA6IGNsaWVudFJlY3RMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEJvdW5kaW5nQ2xpZW50UmVjdCA6IGNsaWVudFJlY3QgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2Nyb2xsSW50b1ZpZXcgOiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xpY2sgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmb2N1cyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsdXIgOiB1bml0IG1ldGhcblxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcbiAgZW5kXG5cbmFuZCBjbGllbnRSZWN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRvcCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByaWdodCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBib3R0b20gOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGVmdCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGZsb2F0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogZmxvYXQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBjbGllbnRSZWN0TGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gY2xpZW50UmVjdCB0IG9wdCBtZXRoXG4gIGVuZFxuXG5sZXQgbm9faGFuZGxlciA6ICgnYSwgJ2IpIGV2ZW50X2xpc3RlbmVyID0gRG9tLm5vX2hhbmRsZXJcblxubGV0IGhhbmRsZXIgPSBEb20uaGFuZGxlclxuXG5sZXQgZnVsbF9oYW5kbGVyID0gRG9tLmZ1bGxfaGFuZGxlclxuXG5sZXQgaW52b2tlX2hhbmRsZXIgPSBEb20uaW52b2tlX2hhbmRsZXJcblxubW9kdWxlIEV2ZW50ID0gc3RydWN0XG4gIHR5cGUgJ2EgdHlwID0gJ2EgRG9tLkV2ZW50LnR5cFxuXG4gIGxldCBjbGljayA9IERvbS5FdmVudC5tYWtlIFwiY2xpY2tcIlxuXG4gIGxldCBjb3B5ID0gRG9tLkV2ZW50Lm1ha2UgXCJjb3B5XCJcblxuICBsZXQgY3V0ID0gRG9tLkV2ZW50Lm1ha2UgXCJjdXRcIlxuXG4gIGxldCBwYXN0ZSA9IERvbS5FdmVudC5tYWtlIFwicGFzdGVcIlxuXG4gIGxldCBkYmxjbGljayA9IERvbS5FdmVudC5tYWtlIFwiZGJsY2xpY2tcIlxuXG4gIGxldCBtb3VzZWRvd24gPSBEb20uRXZlbnQubWFrZSBcIm1vdXNlZG93blwiXG5cbiAgbGV0IG1vdXNldXAgPSBEb20uRXZlbnQubWFrZSBcIm1vdXNldXBcIlxuXG4gIGxldCBtb3VzZW92ZXIgPSBEb20uRXZlbnQubWFrZSBcIm1vdXNlb3ZlclwiXG5cbiAgbGV0IG1vdXNlbW92ZSA9IERvbS5FdmVudC5tYWtlIFwibW91c2Vtb3ZlXCJcblxuICBsZXQgbW91c2VvdXQgPSBEb20uRXZlbnQubWFrZSBcIm1vdXNlb3V0XCJcblxuICBsZXQga2V5cHJlc3MgPSBEb20uRXZlbnQubWFrZSBcImtleXByZXNzXCJcblxuICBsZXQga2V5ZG93biA9IERvbS5FdmVudC5tYWtlIFwia2V5ZG93blwiXG5cbiAgbGV0IGtleXVwID0gRG9tLkV2ZW50Lm1ha2UgXCJrZXl1cFwiXG5cbiAgbGV0IG1vdXNld2hlZWwgPSBEb20uRXZlbnQubWFrZSBcIm1vdXNld2hlZWxcIlxuXG4gIGxldCB3aGVlbCA9IERvbS5FdmVudC5tYWtlIFwid2hlZWxcIlxuXG4gIGxldCBfRE9NTW91c2VTY3JvbGwgPSBEb20uRXZlbnQubWFrZSBcIkRPTU1vdXNlU2Nyb2xsXCJcblxuICBsZXQgdG91Y2hzdGFydCA9IERvbS5FdmVudC5tYWtlIFwidG91Y2hzdGFydFwiXG5cbiAgbGV0IHRvdWNobW92ZSA9IERvbS5FdmVudC5tYWtlIFwidG91Y2htb3ZlXCJcblxuICBsZXQgdG91Y2hlbmQgPSBEb20uRXZlbnQubWFrZSBcInRvdWNoZW5kXCJcblxuICBsZXQgdG91Y2hjYW5jZWwgPSBEb20uRXZlbnQubWFrZSBcInRvdWNoY2FuY2VsXCJcblxuICBsZXQgZHJhZ3N0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnc3RhcnRcIlxuXG4gIGxldCBkcmFnZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnZW5kXCJcblxuICBsZXQgZHJhZ2VudGVyID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnZW50ZXJcIlxuXG4gIGxldCBkcmFnb3ZlciA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ292ZXJcIlxuXG4gIGxldCBkcmFnbGVhdmUgPSBEb20uRXZlbnQubWFrZSBcImRyYWdsZWF2ZVwiXG5cbiAgbGV0IGRyYWcgPSBEb20uRXZlbnQubWFrZSBcImRyYWdcIlxuXG4gIGxldCBkcm9wID0gRG9tLkV2ZW50Lm1ha2UgXCJkcm9wXCJcblxuICBsZXQgaGFzaGNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwiaGFzaGNoYW5nZVwiXG5cbiAgbGV0IGNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwiY2hhbmdlXCJcblxuICBsZXQgaW5wdXQgPSBEb20uRXZlbnQubWFrZSBcImlucHV0XCJcblxuICBsZXQgdGltZXVwZGF0ZSA9IERvbS5FdmVudC5tYWtlIFwidGltZXVwZGF0ZVwiXG5cbiAgbGV0IHN1Ym1pdCA9IERvbS5FdmVudC5tYWtlIFwic3VibWl0XCJcblxuICBsZXQgc2Nyb2xsID0gRG9tLkV2ZW50Lm1ha2UgXCJzY3JvbGxcIlxuXG4gIGxldCBmb2N1cyA9IERvbS5FdmVudC5tYWtlIFwiZm9jdXNcIlxuXG4gIGxldCBibHVyID0gRG9tLkV2ZW50Lm1ha2UgXCJibHVyXCJcblxuICBsZXQgbG9hZCA9IERvbS5FdmVudC5tYWtlIFwibG9hZFwiXG5cbiAgbGV0IHVubG9hZCA9IERvbS5FdmVudC5tYWtlIFwidW5sb2FkXCJcblxuICBsZXQgYmVmb3JldW5sb2FkID0gRG9tLkV2ZW50Lm1ha2UgXCJiZWZvcmV1bmxvYWRcIlxuXG4gIGxldCByZXNpemUgPSBEb20uRXZlbnQubWFrZSBcInJlc2l6ZVwiXG5cbiAgbGV0IG9yaWVudGF0aW9uY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJvcmllbnRhdGlvbmNoYW5nZVwiXG5cbiAgbGV0IHBvcHN0YXRlID0gRG9tLkV2ZW50Lm1ha2UgXCJwb3BzdGF0ZVwiXG5cbiAgbGV0IGVycm9yID0gRG9tLkV2ZW50Lm1ha2UgXCJlcnJvclwiXG5cbiAgbGV0IGFib3J0ID0gRG9tLkV2ZW50Lm1ha2UgXCJhYm9ydFwiXG5cbiAgbGV0IHNlbGVjdCA9IERvbS5FdmVudC5tYWtlIFwic2VsZWN0XCJcblxuICBsZXQgb25saW5lID0gRG9tLkV2ZW50Lm1ha2UgXCJvbmxpbmVcIlxuXG4gIGxldCBvZmZsaW5lID0gRG9tLkV2ZW50Lm1ha2UgXCJvZmZsaW5lXCJcblxuICBsZXQgY2hlY2tpbmcgPSBEb20uRXZlbnQubWFrZSBcImNoZWNraW5nXCJcblxuICBsZXQgbm91cGRhdGUgPSBEb20uRXZlbnQubWFrZSBcIm5vdXBkYXRlXCJcblxuICBsZXQgZG93bmxvYWRpbmcgPSBEb20uRXZlbnQubWFrZSBcImRvd25sb2FkaW5nXCJcblxuICBsZXQgcHJvZ3Jlc3MgPSBEb20uRXZlbnQubWFrZSBcInByb2dyZXNzXCJcblxuICBsZXQgdXBkYXRlcmVhZHkgPSBEb20uRXZlbnQubWFrZSBcInVwZGF0ZXJlYWR5XCJcblxuICBsZXQgY2FjaGVkID0gRG9tLkV2ZW50Lm1ha2UgXCJjYWNoZWRcIlxuXG4gIGxldCBvYnNvbGV0ZSA9IERvbS5FdmVudC5tYWtlIFwib2Jzb2xldGVcIlxuXG4gIGxldCBkb21Db250ZW50TG9hZGVkID0gRG9tLkV2ZW50Lm1ha2UgXCJET01Db250ZW50TG9hZGVkXCJcblxuICBsZXQgYW5pbWF0aW9uc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcImFuaW1hdGlvbnN0YXJ0XCJcblxuICBsZXQgYW5pbWF0aW9uZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJhbmltYXRpb25lbmRcIlxuXG4gIGxldCBhbmltYXRpb25pdGVyYXRpb24gPSBEb20uRXZlbnQubWFrZSBcImFuaW1hdGlvbml0ZXJhdGlvblwiXG5cbiAgbGV0IGFuaW1hdGlvbmNhbmNlbCA9IERvbS5FdmVudC5tYWtlIFwiYW5pbWF0aW9uY2FuY2VsXCJcblxuICBsZXQgdHJhbnNpdGlvbnJ1biA9IERvbS5FdmVudC5tYWtlIFwidHJhbnNpdGlvbnJ1blwiXG5cbiAgbGV0IHRyYW5zaXRpb25zdGFydCA9IERvbS5FdmVudC5tYWtlIFwidHJhbnNpdGlvbnN0YXJ0XCJcblxuICBsZXQgdHJhbnNpdGlvbmVuZCA9IERvbS5FdmVudC5tYWtlIFwidHJhbnNpdGlvbmVuZFwiXG5cbiAgbGV0IHRyYW5zaXRpb25jYW5jZWwgPSBEb20uRXZlbnQubWFrZSBcInRyYW5zaXRpb25jYW5jZWxcIlxuXG4gIGxldCBjYW5wbGF5ID0gRG9tLkV2ZW50Lm1ha2UgXCJjYW5wbGF5XCJcblxuICBsZXQgY2FucGxheXRocm91Z2ggPSBEb20uRXZlbnQubWFrZSBcImNhbnBsYXl0aHJvdWdoXCJcblxuICBsZXQgZHVyYXRpb25jaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcImR1cmF0aW9uY2hhbmdlXCJcblxuICBsZXQgZW1wdGllZCA9IERvbS5FdmVudC5tYWtlIFwiZW1wdGllZFwiXG5cbiAgbGV0IGVuZGVkID0gRG9tLkV2ZW50Lm1ha2UgXCJlbmRlZFwiXG5cbiAgbGV0IGdvdHBvaW50ZXJjYXB0dXJlID0gRG9tLkV2ZW50Lm1ha2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiXG5cbiAgbGV0IGxvYWRlZGRhdGEgPSBEb20uRXZlbnQubWFrZSBcImxvYWRlZGRhdGFcIlxuXG4gIGxldCBsb2FkZWRtZXRhZGF0YSA9IERvbS5FdmVudC5tYWtlIFwibG9hZGVkbWV0YWRhdGFcIlxuXG4gIGxldCBsb2Fkc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcImxvYWRzdGFydFwiXG5cbiAgbGV0IGxvc3Rwb2ludGVyY2FwdHVyZSA9IERvbS5FdmVudC5tYWtlIFwibG9zdHBvaW50ZXJjYXB0dXJlXCJcblxuICBsZXQgbWVzc2FnZSA9IERvbS5FdmVudC5tYWtlIFwibWVzc2FnZVwiXG5cbiAgbGV0IHBhdXNlID0gRG9tLkV2ZW50Lm1ha2UgXCJwYXVzZVwiXG5cbiAgbGV0IHBsYXkgPSBEb20uRXZlbnQubWFrZSBcInBsYXlcIlxuXG4gIGxldCBwbGF5aW5nID0gRG9tLkV2ZW50Lm1ha2UgXCJwbGF5aW5nXCJcblxuICBsZXQgcG9pbnRlcmVudGVyID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVyZW50ZXJcIlxuXG4gIGxldCBwb2ludGVyY2FuY2VsID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVyY2FuY2VsXCJcblxuICBsZXQgcG9pbnRlcmRvd24gPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJkb3duXCJcblxuICBsZXQgcG9pbnRlcmxlYXZlID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVybGVhdmVcIlxuXG4gIGxldCBwb2ludGVybW92ZSA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcm1vdmVcIlxuXG4gIGxldCBwb2ludGVyb3V0ID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVyb3V0XCJcblxuICBsZXQgcG9pbnRlcm92ZXIgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJvdmVyXCJcblxuICBsZXQgcG9pbnRlcnVwID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVydXBcIlxuXG4gIGxldCByYXRlY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJyYXRlY2hhbmdlXCJcblxuICBsZXQgc2Vla2VkID0gRG9tLkV2ZW50Lm1ha2UgXCJzZWVrZWRcIlxuXG4gIGxldCBzZWVraW5nID0gRG9tLkV2ZW50Lm1ha2UgXCJzZWVraW5nXCJcblxuICBsZXQgc3RhbGxlZCA9IERvbS5FdmVudC5tYWtlIFwic3RhbGxlZFwiXG5cbiAgbGV0IHN1c3BlbmQgPSBEb20uRXZlbnQubWFrZSBcInN1c3BlbmRcIlxuXG4gIGxldCB2b2x1bWVjaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcInZvbHVtZWNoYW5nZVwiXG5cbiAgbGV0IHdhaXRpbmcgPSBEb20uRXZlbnQubWFrZSBcIndhaXRpbmdcIlxuXG4gIGxldCBtYWtlID0gRG9tLkV2ZW50Lm1ha2VcbmVuZFxuXG50eXBlIGV2ZW50X2xpc3RlbmVyX2lkID0gRG9tLmV2ZW50X2xpc3RlbmVyX2lkXG5cbmxldCBhZGRFdmVudExpc3RlbmVyID0gRG9tLmFkZEV2ZW50TGlzdGVuZXJcblxubGV0IGFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyA9IERvbS5hZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcblxubGV0IHJlbW92ZUV2ZW50TGlzdGVuZXIgPSBEb20ucmVtb3ZlRXZlbnRMaXN0ZW5lclxuXG5sZXQgY3JlYXRlQ3VzdG9tRXZlbnQgPSBEb20uY3JlYXRlQ3VzdG9tRXZlbnRcblxuY2xhc3MgdHlwZSBbJ25vZGVdIGNvbGxlY3Rpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBuYW1lZEl0ZW0gOiBqc19zdHJpbmcgdCAtPiAnbm9kZSB0IG9wdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGh0bWxFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGhlYWRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgcHJvZmlsZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbGlua0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hhcnNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjcm9zc29yaWdpbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBocmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhyZWZsYW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1lZGlhIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlbCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZXYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB0aXRsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCB0ZXh0IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBtZXRhRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNvbnRlbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHR0cEVxdWl2IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2NoZW1lIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBiYXNlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGhyZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBzdHlsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbWVkaWEgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGJvZHlFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGZvcm1FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZWxlbWVudHMgOiBlbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2NlcHRDaGFyc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFjdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBlbmN0eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF9tZXRob2QgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN1Ym1pdCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlc2V0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgb25zdWJtaXQgOiAoJ3NlbGYgdCwgc3VibWl0RXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgb3B0R3JvdXBFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxhYmVsIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBvcHRpb25FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBvcHRHcm91cEVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRlZmF1bHRTZWxlY3RlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbmRleCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0ZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBzZWxlY3RFbGVtZW50ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWxlY3RlZEluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb3B0aW9ucyA6IG9wdGlvbkVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbXVsdGlwbGUgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2l6ZSA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGFkZCA6ICNvcHRHcm91cEVsZW1lbnQgdCAtPiAjb3B0R3JvdXBFbGVtZW50IHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZSA6IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXF1aXJlZCA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uY2hhbmdlIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmlucHV0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaW5wdXRFbGVtZW50ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBkZWZhdWx0VmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGVmYXVsdENoZWNrZWQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2NlcHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFsdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaGVja2VkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbWF4TGVuZ3RoIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWRPbmx5IDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCByZXF1aXJlZCA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNpemUgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXNlTWFwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbGVzIDogRmlsZS5maWxlTGlzdCB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGxhY2Vob2xkZXIgOiBqc19zdHJpbmcgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvbkRpcmVjdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25TdGFydCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uRW5kIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBvbnNlbGVjdCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25jaGFuZ2UgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uaW5wdXQgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uYmx1ciA6ICgnc2VsZiB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmZvY3VzIDogKCdzZWxmIHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB0ZXh0QXJlYUVsZW1lbnQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGRlZmF1bHRWYWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2xzIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkT25seSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgcm93cyA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uRGlyZWN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvbkVuZCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uU3RhcnQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3QgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXF1aXJlZCA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBsYWNlaG9sZGVyIDoganNfc3RyaW5nIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnNlbGVjdCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25jaGFuZ2UgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uaW5wdXQgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uYmx1ciA6ICgnc2VsZiB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmZvY3VzIDogKCdzZWxmIHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBidXR0b25FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBsYWJlbEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBodG1sRm9yIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBmaWVsZFNldEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBsZWdlbmRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHVMaXN0RWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBvTGlzdEVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgZExpc3RFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGxpRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBkaXZFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIHBhcmFncmFwaEVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgaGVhZGluZ0VsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgcXVvdGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY2l0ZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcHJlRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBickVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgaHJFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIG1vZEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjaXRlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRhdGVUaW1lIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBhbmNob3JFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29vcmRzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhyZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHJlZmxhbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZWwgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmV2IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGltYWdlRWxlbWVudCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYWx0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB1c2VNYXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaXNNYXAgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIG5hdHVyYWxXaWR0aCA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5hdHVyYWxIZWlnaHQgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb21wbGV0ZSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgb25sb2FkIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmVycm9yIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmFib3J0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgb2JqZWN0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29kZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhcmNoaXZlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvZGVCYXNlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvZGVUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRhdGEgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGVjbGFyZSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3RhbmRieSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdXNlTWFwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRvY3VtZW50IDogRG9tLmVsZW1lbnQgRG9tLmRvY3VtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcGFyYW1FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZVR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGFyZWFFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFsdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb29yZHMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBub0hyZWYgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG1hcEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhcmVhcyA6IGFyZWFFbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgc2NyaXB0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHRleHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hhcnNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkZWZlciA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFzeW5jIDogYm9vbCB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZW1iZWRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGFibGVDZWxsRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNlbGxJbmRleCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWJiciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBheGlzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoT2ZmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbFNwYW4gOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGhlYWRlcnMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgcm93U3BhbiA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2NvcGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdkFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB0YWJsZVJvd0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCByb3dJbmRleCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2VjdGlvblJvd0luZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjZWxscyA6IHRhYmxlQ2VsbEVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaE9mZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaW5zZXJ0Q2VsbCA6IGludCAtPiB0YWJsZUNlbGxFbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUNlbGwgOiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRhYmxlQ29sRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoT2ZmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNwYW4gOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHZBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGFibGVTZWN0aW9uRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoT2ZmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByb3dzIDogdGFibGVSb3dFbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5zZXJ0Um93IDogaW50IC0+IHRhYmxlUm93RWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVSb3cgOiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRhYmxlQ2FwdGlvbkVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgdGFibGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY2FwdGlvbiA6IHRhYmxlQ2FwdGlvbkVsZW1lbnQgdCBwcm9wXG5cbiAgICBtZXRob2QgdEhlYWQgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgcHJvcFxuXG4gICAgbWV0aG9kIHRGb290IDogdGFibGVTZWN0aW9uRWxlbWVudCB0IHByb3BcblxuICAgIG1ldGhvZCByb3dzIDogdGFibGVSb3dFbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdEJvZGllcyA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2VsbFBhZGRpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2VsbFNwYWNpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZnJhbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcnVsZXMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3VtbWFyeSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjcmVhdGVUSGVhZCA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlVEhlYWQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVURm9vdCA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlVEZvb3QgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVDYXB0aW9uIDogdGFibGVDYXB0aW9uRWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVDYXB0aW9uIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5zZXJ0Um93IDogaW50IC0+IHRhYmxlUm93RWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVSb3cgOiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRpbWVSYW5nZXMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGFydCA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZW5kXyA6IGludCAtPiBmbG9hdCBtZXRoXG4gIGVuZFxuXG50eXBlIG5ldHdvcmtTdGF0ZSA9XG4gIHwgTkVUV09SS19FTVBUWVxuICB8IE5FVFdPUktfSURMRVxuICB8IE5FVFdPUktfTE9BRElOR1xuICB8IE5FVFdPUktfTk9fU09VUkNFXG5cbnR5cGUgcmVhZHlTdGF0ZSA9XG4gIHwgSEFWRV9OT1RISU5HXG4gIHwgSEFWRV9NRVRBREFUQVxuICB8IEhBVkVfQ1VSUkVOVF9EQVRBXG4gIHwgSEFWRV9GVVRVUkVfREFUQVxuICB8IEhBVkVfRU5PVUdIX0RBVEFcblxuKCogaHR0cDovL3d3dy53M3NjaG9vbHMuY29tL3RhZ3MvcmVmX2F2X2RvbS5hc3AgKilcbigqIG9ubHkgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IGFsbCBicm93c2VyLiAoSUU5KykgKilcbmNsYXNzIHR5cGUgbWVkaWFFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY2FuUGxheVR5cGUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgbG9hZCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHBsYXkgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwYXVzZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGF1dG9wbGF5IDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBidWZmZXJlZCA6IHRpbWVSYW5nZXMgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udHJvbHMgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRTcmMgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFRpbWUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgZHVyYXRpb24gOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZW5kZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxvb3AgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1lZGlhZ3JvdXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbXV0ZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5ldHdvcmtTdGF0ZV9pbnQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5ldHdvcmtTdGF0ZSA6IG5ldHdvcmtTdGF0ZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGF1c2VkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwbGF5YmFja1JhdGUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgcGxheWVkIDogdGltZVJhbmdlcyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmVsb2FkIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGVfaW50IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDogcmVhZHlTdGF0ZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2Vla2FibGUgOiB0aW1lUmFuZ2VzIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlZWtpbmcgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2b2x1bWUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgb25jYW5wbGF5IDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmNhbnBsYXl0aHJvdWdoIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmR1cmF0aW9uY2hhbmdlIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmVtcHRpZWQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZW5kZWQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZGVkZGF0YSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb2FkZWRtZXRhZGF0YSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb2Fkc3RhcnQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucGF1c2UgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucGxheSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wbGF5aW5nIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnJhdGVjaGFuZ2UgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc2Vla2VkIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnNlZWtpbmcgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc3RhbGxlZCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zdXNwZW5kIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnZvbHVtZWNoYW5nZSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb253YWl0aW5nIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYXVkaW9FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBtZWRpYUVsZW1lbnRcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdmlkZW9FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBtZWRpYUVsZW1lbnRcbiAgZW5kXG5cbnR5cGUgY29udGV4dCA9IGpzX3N0cmluZyB0XG5cbmxldCBfMmRfID0gSnMuc3RyaW5nIFwiMmRcIlxuXG50eXBlIGNhbnZhc1BhdHRlcm5cblxuY2xhc3MgdHlwZSBjYW52YXNFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2Qgd2lkdGggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdG9EYXRhVVJMIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRGF0YVVSTF90eXBlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRGF0YVVSTF90eXBlX2NvbXByZXNzaW9uIDoganNfc3RyaW5nIHQgLT4gZmxvYXQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENvbnRleHQgOiBqc19zdHJpbmcgdCAtPiBjYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgdCBtZXRoXG4gIGVuZFxuXG5hbmQgY2FudmFzUmVuZGVyaW5nQ29udGV4dDJEID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNhbnZhcyA6IGNhbnZhc0VsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2F2ZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlc3RvcmUgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzY2FsZSA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJvdGF0ZSA6IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRyYW5zbGF0ZSA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRyYW5zZm9ybSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFRyYW5zZm9ybSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdsb2JhbEFscGhhIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdHJva2VTdHlsZSA6IGpzX3N0cmluZyB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3Ryb2tlU3R5bGVfZ3JhZGllbnQgOiBjYW52YXNHcmFkaWVudCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3Ryb2tlU3R5bGVfcGF0dGVybiA6IGNhbnZhc1BhdHRlcm4gdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbGxTdHlsZSA6IGpzX3N0cmluZyB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsbFN0eWxlX2dyYWRpZW50IDogY2FudmFzR3JhZGllbnQgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbGxTdHlsZV9wYXR0ZXJuIDogY2FudmFzUGF0dGVybiB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3JlYXRlTGluZWFyR3JhZGllbnQgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gY2FudmFzR3JhZGllbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUmFkaWFsR3JhZGllbnQgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gY2FudmFzR3JhZGllbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUGF0dGVybiA6IGltYWdlRWxlbWVudCB0IC0+IGpzX3N0cmluZyB0IC0+IGNhbnZhc1BhdHRlcm4gdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUGF0dGVybl9mcm9tQ2FudmFzIDpcbiAgICAgIGNhbnZhc0VsZW1lbnQgdCAtPiBqc19zdHJpbmcgdCAtPiBjYW52YXNQYXR0ZXJuIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVBhdHRlcm5fZnJvbVZpZGVvIDogdmlkZW9FbGVtZW50IHQgLT4ganNfc3RyaW5nIHQgLT4gY2FudmFzUGF0dGVybiB0IG1ldGhcblxuICAgIG1ldGhvZCBsaW5lV2lkdGggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgbGluZUNhcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaW5lSm9pbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtaXRlckxpbWl0IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYWRvd09mZnNldFggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhZG93T2Zmc2V0WSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBzaGFkb3dCbHVyIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYWRvd0NvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsZWFyUmVjdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbGxSZWN0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Ryb2tlUmVjdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJlZ2luUGF0aCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlUGF0aCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG1vdmVUbyA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxpbmVUbyA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHF1YWRyYXRpY0N1cnZlVG8gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiZXppZXJDdXJ2ZVRvIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXJjVG8gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWN0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXJjIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbGwgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJva2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGlwIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaXNQb2ludEluUGF0aCA6IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ZvY3VzUmluZyA6ICNlbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZm9udCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dEJhc2VsaW5lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZpbGxUZXh0IDoganNfc3RyaW5nIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmlsbFRleHRfd2l0aFdpZHRoIDoganNfc3RyaW5nIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Ryb2tlVGV4dCA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cm9rZVRleHRfd2l0aFdpZHRoIDoganNfc3RyaW5nIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbWVhc3VyZVRleHQgOiBqc19zdHJpbmcgdCAtPiB0ZXh0TWV0cmljcyB0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2UgOiBpbWFnZUVsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2Vfd2l0aFNpemUgOlxuICAgICAgaW1hZ2VFbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Z1bGwgOlxuICAgICAgICAgaW1hZ2VFbGVtZW50IHRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Zyb21DYW52YXMgOiBjYW52YXNFbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Zyb21DYW52YXNXaXRoU2l6ZSA6XG4gICAgICBjYW52YXNFbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Z1bGxGcm9tQ2FudmFzIDpcbiAgICAgICAgIGNhbnZhc0VsZW1lbnQgdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnJvbVZpZGVvV2l0aFZpZGVvIDogdmlkZW9FbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Zyb21WaWRlb1dpdGhTaXplIDpcbiAgICAgIHZpZGVvRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mdWxsRnJvbVZpZGVvIDpcbiAgICAgICAgIHZpZGVvRWxlbWVudCB0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUltYWdlRGF0YSA6IGludCAtPiBpbnQgLT4gaW1hZ2VEYXRhIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEltYWdlRGF0YSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGltYWdlRGF0YSB0IG1ldGhcblxuICAgIG1ldGhvZCBwdXRJbWFnZURhdGEgOiBpbWFnZURhdGEgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmFuZCBjYW52YXNHcmFkaWVudCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhZGRDb2xvclN0b3AgOiBmbG9hdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmFuZCB0ZXh0TWV0cmljcyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB3aWR0aCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBpbWFnZURhdGEgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgd2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGF0YSA6IGNhbnZhc1BpeGVsQXJyYXkgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgY2FudmFzUGl4ZWxBcnJheSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuZXh0ZXJuYWwgcGl4ZWxfZ2V0IDogY2FudmFzUGl4ZWxBcnJheSB0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfanNfZ2V0XCJcblxuZXh0ZXJuYWwgcGl4ZWxfc2V0IDogY2FudmFzUGl4ZWxBcnJheSB0IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9qc19zZXRcIlxuXG5jbGFzcyB0eXBlIHJhbmdlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNvbGxhcHNlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhcnRPZmZzZXQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVuZE9mZnNldCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhcnRDb250YWluZXIgOiBEb20ubm9kZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbmRDb250YWluZXIgOiBEb20ubm9kZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZXRTdGFydCA6IERvbS5ub2RlIHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEVuZCA6IERvbS5ub2RlIHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFN0YXJ0QmVmb3JlIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRFbmRCZWZvcmUgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFN0YXJ0QWZ0ZXIgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEVuZEFmdGVyIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZWxlY3ROb2RlIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZWxlY3ROb2RlQ29udGVudHMgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbGxhcHNlIDogYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb25lQ29udGVudHMgOiBEb20uZG9jdW1lbnRGcmFnbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBleHRyYWN0Q29udGVudHMgOiBEb20uZG9jdW1lbnRGcmFnbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVDb250ZW50cyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluc2VydE5vZGUgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN1cnJvdW5kQ29udGVudHMgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb25lUmFuZ2UgOiByYW5nZSB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbigqKiBJbmZvcm1hdGlvbiBvbiBjdXJyZW50IHNlbGVjdGlvbiAqKVxuY2xhc3MgdHlwZSBzZWxlY3Rpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgYW5jaG9yTm9kZSA6IERvbS5ub2RlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFuY2hvck9mZnNldCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZm9jdXNOb2RlIDogRG9tLm5vZGUgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZm9jdXNPZmZzZXQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlzQ29sbGFwc2VkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByYW5nZUNvdW50IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRSYW5nZUF0IDogaW50IC0+IHJhbmdlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbGxhcHNlIDogYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGV4dGVuZCA6IERvbS5ub2RlIHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG1vZGlmeSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbGxhcHNlVG9TdGFydCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbGxhcHNlVG9FbmQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZWxlY3RBbGxDaGlsZHJlbiA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYWRkUmFuZ2UgOiByYW5nZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZVJhbmdlIDogcmFuZ2UgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVBbGxSYW5nZXMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVGcm9tRG9jdW1lbnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb250YWluc05vZGUgOiBEb20ubm9kZSB0IC0+IGJvb2wgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSBkb2N1bWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2VsZW1lbnRdIERvbS5kb2N1bWVudFxuXG4gICAgaW5oZXJpdCBub2RlU2VsZWN0b3JcblxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCB0aXRsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZWZlcnJlciA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkb21haW4gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX1VSTCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWFkIDogaGVhZEVsZW1lbnQgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9keSA6IGJvZHlFbGVtZW50IHQgcHJvcFxuXG4gICAgbWV0aG9kIGRvY3VtZW50RWxlbWVudCA6IGh0bWxFbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGltYWdlcyA6IGltYWdlRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFwcGxldHMgOiBlbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGlua3MgOiBlbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZm9ybXMgOiBmb3JtRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFuY2hvcnMgOiBlbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29va2llIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRlc2lnbk1vZGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3Blbl8gOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9zZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdyaXRlIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXhlY0NvbW1hbmQgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgLT4ganNfc3RyaW5nIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVJhbmdlIDogcmFuZ2UgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCBEb20ubm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudHNCeU5hbWUgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IERvbS5ub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBhY3RpdmVFbGVtZW50IDogZWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGlkZGVuIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmZ1bGxzY3JlZW5jaGFuZ2UgOiAoZG9jdW1lbnQgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgOiAoZG9jdW1lbnQgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcbiAgZW5kXG5cbnR5cGUgaW50ZXJ2YWxfaWRcblxudHlwZSB0aW1lb3V0X2lkXG5cbnR5cGUgYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfaWRcblxuY2xhc3MgdHlwZSBsb2NhdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBocmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHByb3RvY29sIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhvc3QgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaG9zdG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3JpZ2luIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwb3J0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhdGhuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNlYXJjaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBoYXNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFzc2lnbiA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2UgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWxvYWQgOiB1bml0IG1ldGhcbiAgZW5kXG5cbmxldCBsb2NhdGlvbl9vcmlnaW4gKGxvYyA6IGxvY2F0aW9uIHQpID1cbiAgT3B0ZGVmLmNhc2VcbiAgICBsb2MjIy5vcmlnaW5cbiAgICAoZnVuICgpIC0+XG4gICAgICBsZXQgcHJvdG9jb2wgPSBsb2MjIy5wcm90b2NvbCBpblxuICAgICAgbGV0IGhvc3RuYW1lID0gbG9jIyMuaG9zdG5hbWUgaW5cbiAgICAgIGxldCBwb3J0ID0gbG9jIyMucG9ydCBpblxuICAgICAgaWYgcHJvdG9jb2wjIy5sZW5ndGggPSAwICYmIGhvc3RuYW1lIyMubGVuZ3RoID0gMFxuICAgICAgdGhlbiBKcy5zdHJpbmcgXCJcIlxuICAgICAgZWxzZVxuICAgICAgICBsZXQgb3JpZ2luID0gcHJvdG9jb2wjI2NvbmNhdF8yIChKcy5zdHJpbmcgXCIvL1wiKSBob3N0bmFtZSBpblxuICAgICAgICBpZiBwb3J0IyMubGVuZ3RoID4gMCB0aGVuIG9yaWdpbiMjY29uY2F0XzIgKEpzLnN0cmluZyBcIjpcIikgbG9jIyMucG9ydCBlbHNlIG9yaWdpbilcbiAgICAoZnVuIG8gLT4gbylcblxuY2xhc3MgdHlwZSBoaXN0b3J5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhdGUgOiBKcy5VbnNhZmUuYW55IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnbyA6IGludCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmFjayA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZvcndhcmQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwdXNoU3RhdGUgOiAnYS4gJ2EgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2VTdGF0ZSA6ICdhLiAnYSAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHVuZG9NYW5hZ2VyID0gb2JqZWN0IGVuZFxuXG5jbGFzcyB0eXBlIG5hdmlnYXRvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhcHBDb2RlTmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhcHBOYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFwcFZlcnNpb24gOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29va2llRW5hYmxlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25MaW5lIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwbGF0Zm9ybSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2ZW5kb3IgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXNlckFnZW50IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhbmd1YWdlIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1c2VyTGFuZ3VhZ2UgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1heFRvdWNoUG9pbnRzIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgc2NyZWVuID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHdpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF2YWlsV2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF2YWlsSGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYXBwbGljYXRpb25DYWNoZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBzdGF0dXMgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVwZGF0ZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFib3J0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3dhcENhY2hlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgb25jaGVja2luZyA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmVycm9yIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ubm91cGRhdGUgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25kb3dubG9hZGluZyA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbnByb2dyZXNzIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9udXBkYXRlcmVhZHkgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25jYWNoZWQgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25vYnNvbGV0ZSA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcbiAgZW5kXG5cbmNsYXNzIHR5cGUgX1VSTCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjcmVhdGVPYmplY3RVUkwgOiAjRmlsZS5ibG9iIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJldm9rZU9iamVjdFVSTCA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSB3aW5kb3cgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgZG9jdW1lbnQgOiBkb2N1bWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhcHBsaWNhdGlvbkNhY2hlIDogYXBwbGljYXRpb25DYWNoZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxvY2F0aW9uIDogbG9jYXRpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGlzdG9yeSA6IGhpc3RvcnkgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdW5kb01hbmFnZXIgOiB1bmRvTWFuYWdlciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuYXZpZ2F0b3IgOiBuYXZpZ2F0b3IgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0U2VsZWN0aW9uIDogc2VsZWN0aW9uIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvc2VkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdG9wIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZm9jdXMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibHVyIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2Nyb2xsIDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzY3JvbGxCeSA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2Vzc2lvblN0b3JhZ2UgOiBzdG9yYWdlIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsb2NhbFN0b3JhZ2UgOiBzdG9yYWdlIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0b3AgOiB3aW5kb3cgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFyZW50IDogd2luZG93IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZyYW1lRWxlbWVudCA6IGVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9wZW5fIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IC0+IHdpbmRvdyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgYWxlcnQgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb25maXJtIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBwcm9tcHQgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHByaW50IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50ZXJ2YWwgOiAodW5pdCAtPiB1bml0KSBKcy5jYWxsYmFjayAtPiBmbG9hdCAtPiBpbnRlcnZhbF9pZCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJJbnRlcnZhbCA6IGludGVydmFsX2lkIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFRpbWVvdXQgOiAodW5pdCAtPiB1bml0KSBKcy5jYWxsYmFjayAtPiBmbG9hdCAtPiB0aW1lb3V0X2lkIG1ldGhcblxuICAgIG1ldGhvZCBjbGVhclRpbWVvdXQgOiB0aW1lb3V0X2lkIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcXVlc3RBbmltYXRpb25GcmFtZSA6XG4gICAgICAoZmxvYXQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgLT4gYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfaWQgbWV0aFxuXG4gICAgbWV0aG9kIGNhbmNlbEFuaW1hdGlvbkZyYW1lIDogYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfaWQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2NyZWVuIDogc2NyZWVuIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlubmVyV2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlubmVySGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvdXRlcldpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvdXRlckhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0Q29tcHV0ZWRTdHlsZSA6ICNlbGVtZW50IHQgLT4gY3NzU3R5bGVEZWNsYXJhdGlvbiB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDb21wdXRlZFN0eWxlX3BzZXVkb0VsdCA6XG4gICAgICAjZWxlbWVudCB0IC0+IGpzX3N0cmluZyB0IC0+IGNzc1N0eWxlRGVjbGFyYXRpb24gdCBtZXRoXG5cbiAgICBtZXRob2QgYXRvYiA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBidG9hIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIG9ubG9hZCA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9udW5sb2FkIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25iZWZvcmV1bmxvYWQgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmJsdXIgOiAod2luZG93IHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZm9jdXMgOiAod2luZG93IHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ucmVzaXplIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25vcmllbnRhdGlvbmNoYW5nZSA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9wc3RhdGUgOiAod2luZG93IHQsIHBvcFN0YXRlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uaGFzaGNoYW5nZSA6ICh3aW5kb3cgdCwgaGFzaENoYW5nZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbm9ubGluZSA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm9mZmxpbmUgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VSTCA6IF9VUkwgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGV2aWNlUGl4ZWxSYXRpbyA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCB3aW5kb3cgOiB3aW5kb3cgdCA9IEpzLlVuc2FmZS5nbG9iYWxcblxuKCogVGhlIHRvcGxldmVsIG9iamVjdCAqKVxuXG5sZXQgZG9jdW1lbnQgPSB3aW5kb3cjIy5kb2N1bWVudFxuXG5sZXQgZ2V0RWxlbWVudEJ5SWQgaWQgPVxuICBKcy5PcHQuY2FzZVxuICAgIChkb2N1bWVudCMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBpZCkpXG4gICAgKGZ1biAoKSAtPiByYWlzZSBOb3RfZm91bmQpXG4gICAgKGZ1biBwbm9kZSAtPiBwbm9kZSlcblxubGV0IGdldEVsZW1lbnRCeUlkX2V4biBpZCA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKGRvY3VtZW50IyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIGlkKSlcbiAgICAoZnVuICgpIC0+IGZhaWx3aXRoIChQcmludGYuc3ByaW50ZiBcImdldEVsZW1lbnRCeUlkX2V4bjogJVMgbm90IGZvdW5kXCIgaWQpKVxuICAgIChmdW4gcG5vZGUgLT4gcG5vZGUpXG5cbmxldCBnZXRFbGVtZW50QnlJZF9vcHQgaWQgPSBKcy5PcHQudG9fb3B0aW9uIChkb2N1bWVudCMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBpZCkpXG5cbmxldCBnZXRFbGVtZW50QnlJZF9jb2VyY2UgaWQgY29lcmNlID1cbiAgSnMuT3B0LmNhc2VcbiAgICAoZG9jdW1lbnQjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgaWQpKVxuICAgIChmdW4gKCkgLT4gTm9uZSlcbiAgICAoZnVuIGUgLT4gSnMuT3B0LnRvX29wdGlvbiAoY29lcmNlIGUpKVxuXG4oKioqKilcblxuY2xhc3MgdHlwZSBmcmFtZVNldEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjb2xzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJvd3MgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGZyYW1lRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZyYW1lQm9yZGVyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxvbmdEZXNjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbkhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5XaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5vUmVzaXplIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBzY3JvbGxpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnREb2N1bWVudCA6IGRvY3VtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaUZyYW1lRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZyYW1lQm9yZGVyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsb25nRGVzYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5IZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzY3JvbGxpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnREb2N1bWVudCA6IGRvY3VtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250ZW50V2luZG93IDogd2luZG93IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCoqKiopXG5cbigqWFhYIFNob3VsZCBwcm92aWRlIGNyZWF0aW9uIGZ1bmN0aW9ucyBhIGxhIGxhYmxndGsuLi4gKilcblxubGV0IG9wdF9pdGVyIHggZiA9XG4gIG1hdGNoIHggd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIHYgLT4gZiB2XG5cbmxldCBjcmVhdGVFbGVtZW50IChkb2MgOiBkb2N1bWVudCB0KSBuYW1lID0gZG9jIyNjcmVhdGVFbGVtZW50IChKcy5zdHJpbmcgbmFtZSlcblxubGV0IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIG5hbWUgPSBKcy5VbnNhZmUuY29lcmNlIChjcmVhdGVFbGVtZW50IGRvYyBuYW1lKVxuXG5sZXQgY3JlYXRlRWxlbWVudFN5bnRheCA9IHJlZiBgVW5rbm93blxuXG5sZXQgcmVjIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIGVsdCA9XG4gIGlmIFBvbHkuKF90eXBlID0gTm9uZSkgJiYgUG9seS4obmFtZSA9IE5vbmUpXG4gIHRoZW4gSnMuVW5zYWZlLmNvZXJjZSAoY3JlYXRlRWxlbWVudCBkb2MgZWx0KVxuICBlbHNlXG4gICAgbWF0Y2ggIWNyZWF0ZUVsZW1lbnRTeW50YXggd2l0aFxuICAgIHwgYFN0YW5kYXJkIC0+XG4gICAgICAgIGxldCByZXMgPSBKcy5VbnNhZmUuY29lcmNlIChjcmVhdGVFbGVtZW50IGRvYyBlbHQpIGluXG4gICAgICAgIG9wdF9pdGVyIF90eXBlIChmdW4gdCAtPiByZXMjIy5fdHlwZSA6PSB0KTtcbiAgICAgICAgb3B0X2l0ZXIgbmFtZSAoZnVuIG4gLT4gcmVzIyMubmFtZSA6PSBuKTtcbiAgICAgICAgcmVzXG4gICAgfCBgRXh0ZW5kZWQgLT5cbiAgICAgICAgbGV0IGEgPSBuZXclanMgSnMuYXJyYXlfZW1wdHkgaW5cbiAgICAgICAgaWdub3JlIChhIyNwdXNoXzIgKEpzLnN0cmluZyBcIjxcIikgKEpzLnN0cmluZyBlbHQpKTtcbiAgICAgICAgb3B0X2l0ZXIgX3R5cGUgKGZ1biB0IC0+XG4gICAgICAgICAgICBpZ25vcmUgKGEjI3B1c2hfMyAoSnMuc3RyaW5nIFwiIHR5cGU9XFxcIlwiKSAoaHRtbF9lc2NhcGUgdCkgKEpzLnN0cmluZyBcIlxcXCJcIikpKTtcbiAgICAgICAgb3B0X2l0ZXIgbmFtZSAoZnVuIG4gLT5cbiAgICAgICAgICAgIGlnbm9yZSAoYSMjcHVzaF8zIChKcy5zdHJpbmcgXCIgbmFtZT1cXFwiXCIpIChodG1sX2VzY2FwZSBuKSAoSnMuc3RyaW5nIFwiXFxcIlwiKSkpO1xuICAgICAgICBpZ25vcmUgKGEjI3B1c2ggKEpzLnN0cmluZyBcIj5cIikpO1xuICAgICAgICBKcy5VbnNhZmUuY29lcmNlIChkb2MjI2NyZWF0ZUVsZW1lbnQgKGEjI2pvaW4gKEpzLnN0cmluZyBcIlwiKSkpXG4gICAgfCBgVW5rbm93biAtPlxuICAgICAgICBjcmVhdGVFbGVtZW50U3ludGF4IDo9XG4gICAgICAgICAgaWYgdHJ5XG4gICAgICAgICAgICAgICBsZXQgZWwgOiBpbnB1dEVsZW1lbnQgSnMudCA9XG4gICAgICAgICAgICAgICAgIEpzLlVuc2FmZS5jb2VyY2VcbiAgICAgICAgICAgICAgICAgICAoZG9jdW1lbnQjI2NyZWF0ZUVsZW1lbnQgKEpzLnN0cmluZyBcIjxpbnB1dCBuYW1lPVxcXCJ4XFxcIj5cIikpXG4gICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgZWwjIy50YWdOYW1lIyN0b0xvd2VyQ2FzZSA9PSBKcy5zdHJpbmcgXCJpbnB1dFwiXG4gICAgICAgICAgICAgICAmJiBlbCMjLm5hbWUgPT0gSnMuc3RyaW5nIFwieFwiXG4gICAgICAgICAgICAgd2l0aCBfIC0+IGZhbHNlXG4gICAgICAgICAgdGhlbiBgRXh0ZW5kZWRcbiAgICAgICAgICBlbHNlIGBTdGFuZGFyZDtcbiAgICAgICAgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgZWx0XG5cbmxldCBjcmVhdGVIdG1sIGRvYyA6IGh0bWxFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImh0bWxcIlxuXG5sZXQgY3JlYXRlSGVhZCBkb2MgOiBoZWFkRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoZWFkXCJcblxubGV0IGNyZWF0ZUxpbmsgZG9jIDogbGlua0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGlua1wiXG5cbmxldCBjcmVhdGVUaXRsZSBkb2MgOiB0aXRsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGl0bGVcIlxuXG5sZXQgY3JlYXRlTWV0YSBkb2MgOiBtZXRhRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtZXRhXCJcblxubGV0IGNyZWF0ZUJhc2UgZG9jIDogYmFzZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYmFzZVwiXG5cbmxldCBjcmVhdGVTdHlsZSBkb2MgOiBzdHlsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3R5bGVcIlxuXG5sZXQgY3JlYXRlQm9keSBkb2MgOiBib2R5RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJib2R5XCJcblxubGV0IGNyZWF0ZUZvcm0gZG9jIDogZm9ybUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9ybVwiXG5cbmxldCBjcmVhdGVPcHRncm91cCBkb2MgOiBvcHRHcm91cEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwib3B0Z3JvdXBcIlxuXG5sZXQgY3JlYXRlT3B0aW9uIGRvYyA6IG9wdGlvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwib3B0aW9uXCJcblxubGV0IGNyZWF0ZVNlbGVjdCA/X3R5cGUgP25hbWUgZG9jIDogc2VsZWN0RWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgXCJzZWxlY3RcIlxuXG5sZXQgY3JlYXRlSW5wdXQgP190eXBlID9uYW1lIGRvYyA6IGlucHV0RWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgXCJpbnB1dFwiXG5cbmxldCBjcmVhdGVUZXh0YXJlYSA/X3R5cGUgP25hbWUgZG9jIDogdGV4dEFyZWFFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBcInRleHRhcmVhXCJcblxubGV0IGNyZWF0ZUJ1dHRvbiA/X3R5cGUgP25hbWUgZG9jIDogYnV0dG9uRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgXCJidXR0b25cIlxuXG5sZXQgY3JlYXRlTGFiZWwgZG9jIDogbGFiZWxFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxhYmVsXCJcblxubGV0IGNyZWF0ZUZpZWxkc2V0IGRvYyA6IGZpZWxkU2V0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmaWVsZHNldFwiXG5cbmxldCBjcmVhdGVMZWdlbmQgZG9jIDogbGVnZW5kRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsZWdlbmRcIlxuXG5sZXQgY3JlYXRlVWwgZG9jIDogdUxpc3RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInVsXCJcblxubGV0IGNyZWF0ZU9sIGRvYyA6IG9MaXN0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJvbFwiXG5cbmxldCBjcmVhdGVEbCBkb2MgOiBkTGlzdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZGxcIlxuXG5sZXQgY3JlYXRlTGkgZG9jIDogbGlFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxpXCJcblxubGV0IGNyZWF0ZURpdiBkb2MgOiBkaXZFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImRpdlwiXG5cbmxldCBjcmVhdGVFbWJlZCBkb2MgOiBlbWJlZEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZW1iZWRcIlxuXG5sZXQgY3JlYXRlUCBkb2MgOiBwYXJhZ3JhcGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBcIlxuXG5sZXQgY3JlYXRlSDEgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDFcIlxuXG5sZXQgY3JlYXRlSDIgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDJcIlxuXG5sZXQgY3JlYXRlSDMgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDNcIlxuXG5sZXQgY3JlYXRlSDQgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDRcIlxuXG5sZXQgY3JlYXRlSDUgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDVcIlxuXG5sZXQgY3JlYXRlSDYgZG9jIDogaGVhZGluZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaDZcIlxuXG5sZXQgY3JlYXRlUSBkb2MgOiBxdW90ZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicVwiXG5cbmxldCBjcmVhdGVCbG9ja3F1b3RlIGRvYyA6IHF1b3RlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJibG9ja3F1b3RlXCJcblxubGV0IGNyZWF0ZVByZSBkb2MgOiBwcmVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInByZVwiXG5cbmxldCBjcmVhdGVCciBkb2MgOiBickVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYnJcIlxuXG5sZXQgY3JlYXRlSHIgZG9jIDogaHJFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImhyXCJcblxubGV0IGNyZWF0ZUlucyBkb2MgOiBtb2RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImluc1wiXG5cbmxldCBjcmVhdGVEZWwgZG9jIDogbW9kRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJkZWxcIlxuXG5sZXQgY3JlYXRlQSBkb2MgOiBhbmNob3JFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFcIlxuXG5sZXQgY3JlYXRlSW1nIGRvYyA6IGltYWdlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJpbWdcIlxuXG5sZXQgY3JlYXRlT2JqZWN0IGRvYyA6IG9iamVjdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwib2JqZWN0XCJcblxubGV0IGNyZWF0ZVBhcmFtIGRvYyA6IHBhcmFtRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwYXJhbVwiXG5cbmxldCBjcmVhdGVNYXAgZG9jIDogbWFwRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtYXBcIlxuXG5sZXQgY3JlYXRlQXJlYSBkb2MgOiBhcmVhRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhcmVhXCJcblxubGV0IGNyZWF0ZVNjcmlwdCBkb2MgOiBzY3JpcHRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInNjcmlwdFwiXG5cbmxldCBjcmVhdGVUYWJsZSBkb2MgOiB0YWJsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGFibGVcIlxuXG5sZXQgY3JlYXRlQ2FwdGlvbiBkb2MgOiB0YWJsZUNhcHRpb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNhcHRpb25cIlxuXG5sZXQgY3JlYXRlQ29sIGRvYyA6IHRhYmxlQ29sRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjb2xcIlxuXG5sZXQgY3JlYXRlQ29sZ3JvdXAgZG9jIDogdGFibGVDb2xFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNvbGdyb3VwXCJcblxubGV0IGNyZWF0ZVRoZWFkIGRvYyA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGhlYWRcIlxuXG5sZXQgY3JlYXRlVGZvb3QgZG9jIDogdGFibGVTZWN0aW9uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0Zm9vdFwiXG5cbmxldCBjcmVhdGVUYm9keSBkb2MgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRib2R5XCJcblxubGV0IGNyZWF0ZVRyIGRvYyA6IHRhYmxlUm93RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0clwiXG5cbmxldCBjcmVhdGVUaCBkb2MgOiB0YWJsZUNlbGxFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRoXCJcblxubGV0IGNyZWF0ZVRkIGRvYyA6IHRhYmxlQ2VsbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGRcIlxuXG5sZXQgY3JlYXRlU3ViIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic3ViXCJcblxubGV0IGNyZWF0ZVN1cCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInN1cFwiXG5cbmxldCBjcmVhdGVTcGFuIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic3BhblwiXG5cbmxldCBjcmVhdGVUdCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInR0XCJcblxubGV0IGNyZWF0ZUkgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJpXCJcblxubGV0IGNyZWF0ZUIgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJiXCJcblxubGV0IGNyZWF0ZUJpZyBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImJpZ1wiXG5cbmxldCBjcmVhdGVTbWFsbCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInNtYWxsXCJcblxubGV0IGNyZWF0ZUVtIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiZW1cIlxuXG5sZXQgY3JlYXRlU3Ryb25nIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic3Ryb25nXCJcblxubGV0IGNyZWF0ZUNpdGUgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJjaXRlXCJcblxubGV0IGNyZWF0ZURmbiBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImRmblwiXG5cbmxldCBjcmVhdGVDb2RlIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiY29kZVwiXG5cbmxldCBjcmVhdGVTYW1wIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic2FtcFwiXG5cbmxldCBjcmVhdGVLYmQgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJrYmRcIlxuXG5sZXQgY3JlYXRlVmFyIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwidmFyXCJcblxubGV0IGNyZWF0ZUFiYnIgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJhYmJyXCJcblxubGV0IGNyZWF0ZURkIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiZGRcIlxuXG5sZXQgY3JlYXRlRHQgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJkdFwiXG5cbmxldCBjcmVhdGVOb3NjcmlwdCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcIm5vc2NyaXB0XCJcblxubGV0IGNyZWF0ZUFkZHJlc3MgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJhZGRyZXNzXCJcblxubGV0IGNyZWF0ZUZyYW1lc2V0IGRvYyA6IGZyYW1lU2V0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmcmFtZXNldFwiXG5cbmxldCBjcmVhdGVGcmFtZSBkb2MgOiBmcmFtZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZnJhbWVcIlxuXG5sZXQgY3JlYXRlSWZyYW1lIGRvYyA6IGlGcmFtZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaWZyYW1lXCJcblxubGV0IGNyZWF0ZUF1ZGlvIGRvYyA6IGF1ZGlvRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhdWRpb1wiXG5cbmxldCBjcmVhdGVWaWRlbyBkb2MgOiBhdWRpb0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidmlkZW9cIlxuXG5leGNlcHRpb24gQ2FudmFzX25vdF9hdmFpbGFibGVcblxubGV0IGNyZWF0ZUNhbnZhcyBkb2MgOiBjYW52YXNFbGVtZW50IHQgPVxuICBsZXQgYyA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY2FudmFzXCIgaW5cbiAgaWYgbm90IChPcHQudGVzdCBjIyMuZ2V0Q29udGV4dCkgdGhlbiByYWlzZSBDYW52YXNfbm90X2F2YWlsYWJsZTtcbiAgY1xuXG5sZXQgaHRtbF9lbGVtZW50IDogaHRtbEVsZW1lbnQgdCBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0hUTUxFbGVtZW50XG5cbm1vZHVsZSBDb2VyY2VUbyA9IHN0cnVjdFxuICBsZXQgZWxlbWVudCA6ICNEb20ubm9kZSBKcy50IC0+IGVsZW1lbnQgSnMudCBKcy5vcHQgPVxuICAgIGlmIGRlZiBodG1sX2VsZW1lbnQgPT0gdW5kZWZpbmVkXG4gICAgdGhlblxuICAgICAgKCogaWUgPCA5IGRvZXMgbm90IGhhdmUgSFRNTEVsZW1lbnQ6IHdlIGhhdmUgdG8gY2hlYXQgdG8gY2hlY2tcbiAgICAgICAgIHRoYXQgc29tZXRoaW5nIGlzIGFuIGh0bWwgZWxlbWVudCAqKVxuICAgICAgZnVuIGUgLT5cbiAgICAgIGlmIGRlZiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjLmlubmVySFRNTCA9PSB1bmRlZmluZWRcbiAgICAgIHRoZW4gSnMubnVsbFxuICAgICAgZWxzZSBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgZWxzZVxuICAgICAgZnVuIGUgLT5cbiAgICAgIGlmIEpzLmluc3RhbmNlb2YgZSBodG1sX2VsZW1lbnQgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpIGVsc2UgSnMubnVsbFxuXG4gIGxldCB1bnNhZmVDb2VyY2UgdGFnIChlIDogI2VsZW1lbnQgdCkgPVxuICAgIGlmIGUjIy50YWdOYW1lIyN0b0xvd2VyQ2FzZSA9PSBKcy5zdHJpbmcgdGFnXG4gICAgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGEgZSA9IHVuc2FmZUNvZXJjZSBcImFcIiBlXG5cbiAgbGV0IGFyZWEgZSA9IHVuc2FmZUNvZXJjZSBcImFyZWFcIiBlXG5cbiAgbGV0IGJhc2UgZSA9IHVuc2FmZUNvZXJjZSBcImJhc2VcIiBlXG5cbiAgbGV0IGJsb2NrcXVvdGUgZSA9IHVuc2FmZUNvZXJjZSBcImJsb2NrcXVvdGVcIiBlXG5cbiAgbGV0IGJvZHkgZSA9IHVuc2FmZUNvZXJjZSBcImJvZHlcIiBlXG5cbiAgbGV0IGJyIGUgPSB1bnNhZmVDb2VyY2UgXCJiclwiIGVcblxuICBsZXQgYnV0dG9uIGUgPSB1bnNhZmVDb2VyY2UgXCJidXR0b25cIiBlXG5cbiAgbGV0IGNhbnZhcyBlID0gdW5zYWZlQ29lcmNlIFwiY2FudmFzXCIgZVxuXG4gIGxldCBjYXB0aW9uIGUgPSB1bnNhZmVDb2VyY2UgXCJjYXB0aW9uXCIgZVxuXG4gIGxldCBjb2wgZSA9IHVuc2FmZUNvZXJjZSBcImNvbFwiIGVcblxuICBsZXQgY29sZ3JvdXAgZSA9IHVuc2FmZUNvZXJjZSBcImNvbGdyb3VwXCIgZVxuXG4gIGxldCBkZWwgZSA9IHVuc2FmZUNvZXJjZSBcImRlbFwiIGVcblxuICBsZXQgZGl2IGUgPSB1bnNhZmVDb2VyY2UgXCJkaXZcIiBlXG5cbiAgbGV0IGRsIGUgPSB1bnNhZmVDb2VyY2UgXCJkbFwiIGVcblxuICBsZXQgZmllbGRzZXQgZSA9IHVuc2FmZUNvZXJjZSBcImZpZWxkc2V0XCIgZVxuXG4gIGxldCBlbWJlZCBlID0gdW5zYWZlQ29lcmNlIFwiZW1iZWRcIiBlXG5cbiAgbGV0IGZvcm0gZSA9IHVuc2FmZUNvZXJjZSBcImZvcm1cIiBlXG5cbiAgbGV0IGZyYW1lc2V0IGUgPSB1bnNhZmVDb2VyY2UgXCJmcmFtZXNldFwiIGVcblxuICBsZXQgZnJhbWUgZSA9IHVuc2FmZUNvZXJjZSBcImZyYW1lXCIgZVxuXG4gIGxldCBoMSBlID0gdW5zYWZlQ29lcmNlIFwiaDFcIiBlXG5cbiAgbGV0IGgyIGUgPSB1bnNhZmVDb2VyY2UgXCJoMlwiIGVcblxuICBsZXQgaDMgZSA9IHVuc2FmZUNvZXJjZSBcImgzXCIgZVxuXG4gIGxldCBoNCBlID0gdW5zYWZlQ29lcmNlIFwiaDRcIiBlXG5cbiAgbGV0IGg1IGUgPSB1bnNhZmVDb2VyY2UgXCJoNVwiIGVcblxuICBsZXQgaDYgZSA9IHVuc2FmZUNvZXJjZSBcImg2XCIgZVxuXG4gIGxldCBoZWFkIGUgPSB1bnNhZmVDb2VyY2UgXCJoZWFkXCIgZVxuXG4gIGxldCBociBlID0gdW5zYWZlQ29lcmNlIFwiaHJcIiBlXG5cbiAgbGV0IGh0bWwgZSA9IHVuc2FmZUNvZXJjZSBcImh0bWxcIiBlXG5cbiAgbGV0IGlmcmFtZSBlID0gdW5zYWZlQ29lcmNlIFwiaWZyYW1lXCIgZVxuXG4gIGxldCBpbWcgZSA9IHVuc2FmZUNvZXJjZSBcImltZ1wiIGVcblxuICBsZXQgaW5wdXQgZSA9IHVuc2FmZUNvZXJjZSBcImlucHV0XCIgZVxuXG4gIGxldCBpbnMgZSA9IHVuc2FmZUNvZXJjZSBcImluc1wiIGVcblxuICBsZXQgbGFiZWwgZSA9IHVuc2FmZUNvZXJjZSBcImxhYmVsXCIgZVxuXG4gIGxldCBsZWdlbmQgZSA9IHVuc2FmZUNvZXJjZSBcImxlZ2VuZFwiIGVcblxuICBsZXQgbGkgZSA9IHVuc2FmZUNvZXJjZSBcImxpXCIgZVxuXG4gIGxldCBsaW5rIGUgPSB1bnNhZmVDb2VyY2UgXCJsaW5rXCIgZVxuXG4gIGxldCBtYXAgZSA9IHVuc2FmZUNvZXJjZSBcIm1hcFwiIGVcblxuICBsZXQgbWV0YSBlID0gdW5zYWZlQ29lcmNlIFwibWV0YVwiIGVcblxuICBsZXQgX29iamVjdCBlID0gdW5zYWZlQ29lcmNlIFwib2JqZWN0XCIgZVxuXG4gIGxldCBvbCBlID0gdW5zYWZlQ29lcmNlIFwib2xcIiBlXG5cbiAgbGV0IG9wdGdyb3VwIGUgPSB1bnNhZmVDb2VyY2UgXCJvcHRncm91cFwiIGVcblxuICBsZXQgb3B0aW9uIGUgPSB1bnNhZmVDb2VyY2UgXCJvcHRpb25cIiBlXG5cbiAgbGV0IHAgZSA9IHVuc2FmZUNvZXJjZSBcInBcIiBlXG5cbiAgbGV0IHBhcmFtIGUgPSB1bnNhZmVDb2VyY2UgXCJwYXJhbVwiIGVcblxuICBsZXQgcHJlIGUgPSB1bnNhZmVDb2VyY2UgXCJwcmVcIiBlXG5cbiAgbGV0IHEgZSA9IHVuc2FmZUNvZXJjZSBcInFcIiBlXG5cbiAgbGV0IHNjcmlwdCBlID0gdW5zYWZlQ29lcmNlIFwic2NyaXB0XCIgZVxuXG4gIGxldCBzZWxlY3QgZSA9IHVuc2FmZUNvZXJjZSBcInNlbGVjdFwiIGVcblxuICBsZXQgc3R5bGUgZSA9IHVuc2FmZUNvZXJjZSBcInN0eWxlXCIgZVxuXG4gIGxldCB0YWJsZSBlID0gdW5zYWZlQ29lcmNlIFwidGFibGVcIiBlXG5cbiAgbGV0IHRib2R5IGUgPSB1bnNhZmVDb2VyY2UgXCJ0Ym9keVwiIGVcblxuICBsZXQgdGQgZSA9IHVuc2FmZUNvZXJjZSBcInRkXCIgZVxuXG4gIGxldCB0ZXh0YXJlYSBlID0gdW5zYWZlQ29lcmNlIFwidGV4dGFyZWFcIiBlXG5cbiAgbGV0IHRmb290IGUgPSB1bnNhZmVDb2VyY2UgXCJ0Zm9vdFwiIGVcblxuICBsZXQgdGggZSA9IHVuc2FmZUNvZXJjZSBcInRoXCIgZVxuXG4gIGxldCB0aGVhZCBlID0gdW5zYWZlQ29lcmNlIFwidGhlYWRcIiBlXG5cbiAgbGV0IHRpdGxlIGUgPSB1bnNhZmVDb2VyY2UgXCJ0aXRsZVwiIGVcblxuICBsZXQgdHIgZSA9IHVuc2FmZUNvZXJjZSBcInRyXCIgZVxuXG4gIGxldCB1bCBlID0gdW5zYWZlQ29lcmNlIFwidWxcIiBlXG5cbiAgbGV0IGF1ZGlvIGUgPSB1bnNhZmVDb2VyY2UgXCJhdWRpb1wiIGVcblxuICBsZXQgdmlkZW8gZSA9IHVuc2FmZUNvZXJjZSBcInZpZGVvXCIgZVxuXG4gIGxldCB1bnNhZmVDb2VyY2VFdmVudCBjb25zdHIgKGV2IDogI2V2ZW50IHQpID1cbiAgICBpZiBkZWYgY29uc3RyICE9IHVuZGVmaW5lZCAmJiBKcy5pbnN0YW5jZW9mIGV2IGNvbnN0clxuICAgIHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBldilcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgbW91c2VFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fTW91c2VFdmVudCBldlxuXG4gIGxldCBrZXlib2FyZEV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9LZXlib2FyZEV2ZW50IGV2XG5cbiAgbGV0IHdoZWVsRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX1doZWVsRXZlbnQgZXZcblxuICBsZXQgbW91c2VTY3JvbGxFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fTW91c2VTY3JvbGxFdmVudCBldlxuXG4gIGxldCBwb3BTdGF0ZUV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9Qb3BTdGF0ZUV2ZW50IGV2XG5cbiAgbGV0IG1lc3NhZ2VFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fTWVzc2FnZUV2ZW50IGV2XG5lbmRcblxuKCoqKiopXG5cbmxldCBldmVudFRhcmdldCA9IERvbS5ldmVudFRhcmdldFxuXG5sZXQgZXZlbnRSZWxhdGVkVGFyZ2V0IChlIDogI21vdXNlRXZlbnQgdCkgPVxuICBPcHRkZWYuZ2V0IGUjIy5yZWxhdGVkVGFyZ2V0IChmdW4gKCkgLT5cbiAgICAgIG1hdGNoIEpzLnRvX3N0cmluZyBlIyMuX3R5cGUgd2l0aFxuICAgICAgfCBcIm1vdXNlb3ZlclwiIC0+IE9wdGRlZi5nZXQgZSMjLmZyb21FbGVtZW50IChmdW4gKCkgLT4gYXNzZXJ0IGZhbHNlKVxuICAgICAgfCBcIm1vdXNlb3V0XCIgLT4gT3B0ZGVmLmdldCBlIyMudG9FbGVtZW50IChmdW4gKCkgLT4gYXNzZXJ0IGZhbHNlKVxuICAgICAgfCBfIC0+IEpzLm51bGwpXG5cbmxldCBldmVudEFic29sdXRlUG9zaXRpb24nIChlIDogI21vdXNlRXZlbnQgdCkgPVxuICBsZXQgYm9keSA9IGRvY3VtZW50IyMuYm9keSBpblxuICBsZXQgaHRtbCA9IGRvY3VtZW50IyMuZG9jdW1lbnRFbGVtZW50IGluXG4gICggZSMjLmNsaWVudFggKyBib2R5IyMuc2Nyb2xsTGVmdCArIGh0bWwjIy5zY3JvbGxMZWZ0XG4gICwgZSMjLmNsaWVudFkgKyBib2R5IyMuc2Nyb2xsVG9wICsgaHRtbCMjLnNjcm9sbFRvcCApXG5cbmxldCBldmVudEFic29sdXRlUG9zaXRpb24gKGUgOiAjbW91c2VFdmVudCB0KSA9XG4gIE9wdGRlZi5jYXNlXG4gICAgZSMjLnBhZ2VYXG4gICAgKGZ1biAoKSAtPiBldmVudEFic29sdXRlUG9zaXRpb24nIGUpXG4gICAgKGZ1biB4IC0+IE9wdGRlZi5jYXNlIGUjIy5wYWdlWSAoZnVuICgpIC0+IGV2ZW50QWJzb2x1dGVQb3NpdGlvbicgZSkgKGZ1biB5IC0+IHgsIHkpKVxuXG5sZXQgZWxlbWVudENsaWVudFBvc2l0aW9uIChlIDogI2VsZW1lbnQgdCkgPVxuICBsZXQgciA9IGUjI2dldEJvdW5kaW5nQ2xpZW50UmVjdCBpblxuICBsZXQgYm9keSA9IGRvY3VtZW50IyMuYm9keSBpblxuICBsZXQgaHRtbCA9IGRvY3VtZW50IyMuZG9jdW1lbnRFbGVtZW50IGluXG4gICggdHJ1bmNhdGUgciMjLmxlZnQgLSBib2R5IyMuY2xpZW50TGVmdCAtIGh0bWwjIy5jbGllbnRMZWZ0XG4gICwgdHJ1bmNhdGUgciMjLnRvcCAtIGJvZHkjIy5jbGllbnRUb3AgLSBodG1sIyMuY2xpZW50VG9wIClcblxubGV0IGdldERvY3VtZW50U2Nyb2xsICgpID1cbiAgbGV0IGJvZHkgPSBkb2N1bWVudCMjLmJvZHkgaW5cbiAgbGV0IGh0bWwgPSBkb2N1bWVudCMjLmRvY3VtZW50RWxlbWVudCBpblxuICBib2R5IyMuc2Nyb2xsTGVmdCArIGh0bWwjIy5zY3JvbGxMZWZ0LCBib2R5IyMuc2Nyb2xsVG9wICsgaHRtbCMjLnNjcm9sbFRvcFxuXG5sZXQgYnV0dG9uUHJlc3NlZCAoZXYgOiAjbW91c2VFdmVudCBKcy50KSA9XG4gIEpzLk9wdGRlZi5jYXNlXG4gICAgZXYjIy53aGljaFxuICAgIChmdW4gKCkgLT5cbiAgICAgIG1hdGNoIGV2IyMuYnV0dG9uIHdpdGhcbiAgICAgIHwgMSAtPiBMZWZ0X2J1dHRvblxuICAgICAgfCAyIC0+IFJpZ2h0X2J1dHRvblxuICAgICAgfCA0IC0+IE1pZGRsZV9idXR0b25cbiAgICAgIHwgXyAtPiBOb19idXR0b24pXG4gICAgKGZ1biB4IC0+IHgpXG5cbmxldCBhZGRNb3VzZXdoZWVsRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zIGUgP2NhcHR1cmUgP29uY2UgP3Bhc3NpdmUgaCA9XG4gIGFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuICAgID9jYXB0dXJlXG4gICAgP29uY2VcbiAgICA/cGFzc2l2ZVxuICAgIGVcbiAgICBFdmVudC53aGVlbFxuICAgIChoYW5kbGVyIChmdW4gKGUgOiBtb3VzZXdoZWVsRXZlbnQgdCkgLT5cbiAgICAgICAgIGxldCBkeCA9IC1PcHRkZWYuZ2V0IGUjIy53aGVlbERlbHRhWCAoZnVuICgpIC0+IDApIC8gNDAgaW5cbiAgICAgICAgIGxldCBkeSA9IC1PcHRkZWYuZ2V0IGUjIy53aGVlbERlbHRhWSAoZnVuICgpIC0+IGUjIy53aGVlbERlbHRhKSAvIDQwIGluXG4gICAgICAgICBoIChlIDo+IG1vdXNlRXZlbnQgdCkgfmR4IH5keSkpXG5cbmxldCBhZGRNb3VzZXdoZWVsRXZlbnRMaXN0ZW5lciBlIGggY2FwdCA9XG4gIGFkZE1vdXNld2hlZWxFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgfmNhcHR1cmU6Y2FwdCBlIGhcblxuKCoqKioqKVxuXG5tb2R1bGUgS2V5Ym9hcmRfY29kZSA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgVW5pZGVudGlmaWVkXG4gICAgKCogQWxwaGFiZXRpYyBDaGFyYWN0ZXJzICopXG4gICAgfCBLZXlBXG4gICAgfCBLZXlCXG4gICAgfCBLZXlDXG4gICAgfCBLZXlEXG4gICAgfCBLZXlFXG4gICAgfCBLZXlGXG4gICAgfCBLZXlHXG4gICAgfCBLZXlIXG4gICAgfCBLZXlJXG4gICAgfCBLZXlKXG4gICAgfCBLZXlLXG4gICAgfCBLZXlMXG4gICAgfCBLZXlNXG4gICAgfCBLZXlOXG4gICAgfCBLZXlPXG4gICAgfCBLZXlQXG4gICAgfCBLZXlRXG4gICAgfCBLZXlSXG4gICAgfCBLZXlTXG4gICAgfCBLZXlUXG4gICAgfCBLZXlVXG4gICAgfCBLZXlWXG4gICAgfCBLZXlXXG4gICAgfCBLZXlYXG4gICAgfCBLZXlZXG4gICAgfCBLZXlaXG4gICAgKCogRGlnaXRzICopXG4gICAgfCBEaWdpdDBcbiAgICB8IERpZ2l0MVxuICAgIHwgRGlnaXQyXG4gICAgfCBEaWdpdDNcbiAgICB8IERpZ2l0NFxuICAgIHwgRGlnaXQ1XG4gICAgfCBEaWdpdDZcbiAgICB8IERpZ2l0N1xuICAgIHwgRGlnaXQ4XG4gICAgfCBEaWdpdDlcbiAgICB8IE1pbnVzXG4gICAgfCBFcXVhbFxuICAgICgqIFdoaXRlc3BhY2UgKilcbiAgICB8IFRhYlxuICAgIHwgRW50ZXJcbiAgICB8IFNwYWNlXG4gICAgKCogRWRpdGluZyAqKVxuICAgIHwgRXNjYXBlXG4gICAgfCBCYWNrc3BhY2VcbiAgICB8IEluc2VydFxuICAgIHwgRGVsZXRlXG4gICAgfCBDYXBzTG9ja1xuICAgICgqIE1pc2MgUHJpbnRhYmxlICopXG4gICAgfCBCcmFja2V0TGVmdFxuICAgIHwgQnJhY2tldFJpZ2h0XG4gICAgfCBTZW1pY29sb25cbiAgICB8IFF1b3RlXG4gICAgfCBCYWNrcXVvdGVcbiAgICB8IEJhY2tzbGFzaFxuICAgIHwgQ29tbWFcbiAgICB8IFBlcmlvZFxuICAgIHwgU2xhc2hcbiAgICAoKiBGdW5jdGlvbiBrZXlzICopXG4gICAgfCBGMVxuICAgIHwgRjJcbiAgICB8IEYzXG4gICAgfCBGNFxuICAgIHwgRjVcbiAgICB8IEY2XG4gICAgfCBGN1xuICAgIHwgRjhcbiAgICB8IEY5XG4gICAgfCBGMTBcbiAgICB8IEYxMVxuICAgIHwgRjEyXG4gICAgKCogTnVtcGFkIGtleXMgKilcbiAgICB8IE51bXBhZDBcbiAgICB8IE51bXBhZDFcbiAgICB8IE51bXBhZDJcbiAgICB8IE51bXBhZDNcbiAgICB8IE51bXBhZDRcbiAgICB8IE51bXBhZDVcbiAgICB8IE51bXBhZDZcbiAgICB8IE51bXBhZDdcbiAgICB8IE51bXBhZDhcbiAgICB8IE51bXBhZDlcbiAgICB8IE51bXBhZE11bHRpcGx5XG4gICAgfCBOdW1wYWRTdWJ0cmFjdFxuICAgIHwgTnVtcGFkQWRkXG4gICAgfCBOdW1wYWREZWNpbWFsXG4gICAgfCBOdW1wYWRFcXVhbFxuICAgIHwgTnVtcGFkRW50ZXJcbiAgICB8IE51bXBhZERpdmlkZVxuICAgIHwgTnVtTG9ja1xuICAgICgqIE1vZGlmaWVyIGtleXMgKilcbiAgICB8IENvbnRyb2xMZWZ0XG4gICAgfCBDb250cm9sUmlnaHRcbiAgICB8IE1ldGFMZWZ0XG4gICAgfCBNZXRhUmlnaHRcbiAgICB8IFNoaWZ0TGVmdFxuICAgIHwgU2hpZnRSaWdodFxuICAgIHwgQWx0TGVmdFxuICAgIHwgQWx0UmlnaHRcbiAgICAoKiBBcnJvdyBrZXlzICopXG4gICAgfCBBcnJvd0xlZnRcbiAgICB8IEFycm93UmlnaHRcbiAgICB8IEFycm93VXBcbiAgICB8IEFycm93RG93blxuICAgICgqIE5hdmlnYXRpb24gKilcbiAgICB8IFBhZ2VVcFxuICAgIHwgUGFnZURvd25cbiAgICB8IEhvbWVcbiAgICB8IEVuZFxuICAgICgqIFNvdW5kICopXG4gICAgfCBWb2x1bWVNdXRlXG4gICAgfCBWb2x1bWVEb3duXG4gICAgfCBWb2x1bWVVcFxuICAgICgqIE1lZGlhICopXG4gICAgfCBNZWRpYVRyYWNrUHJldmlvdXNcbiAgICB8IE1lZGlhVHJhY2tOZXh0XG4gICAgfCBNZWRpYVBsYXlQYXVzZVxuICAgIHwgTWVkaWFTdG9wXG4gICAgKCogQnJvd3NlciBzcGVjaWFsICopXG4gICAgfCBDb250ZXh0TWVudVxuICAgIHwgQnJvd3NlclNlYXJjaFxuICAgIHwgQnJvd3NlckhvbWVcbiAgICB8IEJyb3dzZXJGYXZvcml0ZXNcbiAgICB8IEJyb3dzZXJSZWZyZXNoXG4gICAgfCBCcm93c2VyU3RvcFxuICAgIHwgQnJvd3NlckZvcndhcmRcbiAgICB8IEJyb3dzZXJCYWNrXG4gICAgKCogTWlzYyAqKVxuICAgIHwgT1NMZWZ0XG4gICAgfCBPU1JpZ2h0XG4gICAgfCBTY3JvbGxMb2NrXG4gICAgfCBQcmludFNjcmVlblxuICAgIHwgSW50bEJhY2tzbGFzaFxuICAgIHwgSW50bFllblxuICAgIHwgUGF1c2VcblxuICBsZXQgdHJ5X2NvZGUgdiA9XG4gICAgbWF0Y2ggSnMudG9fc3RyaW5nIHYgd2l0aFxuICAgICgqIEFscGhhYmV0aWMgQ2hhcmFjdGVycyAqKVxuICAgIHwgXCJLZXlBXCIgLT4gS2V5QVxuICAgIHwgXCJLZXlCXCIgLT4gS2V5QlxuICAgIHwgXCJLZXlDXCIgLT4gS2V5Q1xuICAgIHwgXCJLZXlEXCIgLT4gS2V5RFxuICAgIHwgXCJLZXlFXCIgLT4gS2V5RVxuICAgIHwgXCJLZXlGXCIgLT4gS2V5RlxuICAgIHwgXCJLZXlHXCIgLT4gS2V5R1xuICAgIHwgXCJLZXlIXCIgLT4gS2V5SFxuICAgIHwgXCJLZXlJXCIgLT4gS2V5SVxuICAgIHwgXCJLZXlKXCIgLT4gS2V5SlxuICAgIHwgXCJLZXlLXCIgLT4gS2V5S1xuICAgIHwgXCJLZXlMXCIgLT4gS2V5TFxuICAgIHwgXCJLZXlNXCIgLT4gS2V5TVxuICAgIHwgXCJLZXlOXCIgLT4gS2V5TlxuICAgIHwgXCJLZXlPXCIgLT4gS2V5T1xuICAgIHwgXCJLZXlQXCIgLT4gS2V5UFxuICAgIHwgXCJLZXlRXCIgLT4gS2V5UVxuICAgIHwgXCJLZXlSXCIgLT4gS2V5UlxuICAgIHwgXCJLZXlTXCIgLT4gS2V5U1xuICAgIHwgXCJLZXlUXCIgLT4gS2V5VFxuICAgIHwgXCJLZXlVXCIgLT4gS2V5VVxuICAgIHwgXCJLZXlWXCIgLT4gS2V5VlxuICAgIHwgXCJLZXlXXCIgLT4gS2V5V1xuICAgIHwgXCJLZXlYXCIgLT4gS2V5WFxuICAgIHwgXCJLZXlZXCIgLT4gS2V5WVxuICAgIHwgXCJLZXlaXCIgLT4gS2V5WlxuICAgICgqIERpZ2l0cyAqKVxuICAgIHwgXCJEaWdpdDBcIiAtPiBEaWdpdDBcbiAgICB8IFwiRGlnaXQxXCIgLT4gRGlnaXQxXG4gICAgfCBcIkRpZ2l0MlwiIC0+IERpZ2l0MlxuICAgIHwgXCJEaWdpdDNcIiAtPiBEaWdpdDNcbiAgICB8IFwiRGlnaXQ0XCIgLT4gRGlnaXQ0XG4gICAgfCBcIkRpZ2l0NVwiIC0+IERpZ2l0NVxuICAgIHwgXCJEaWdpdDZcIiAtPiBEaWdpdDZcbiAgICB8IFwiRGlnaXQ3XCIgLT4gRGlnaXQ3XG4gICAgfCBcIkRpZ2l0OFwiIC0+IERpZ2l0OFxuICAgIHwgXCJEaWdpdDlcIiAtPiBEaWdpdDlcbiAgICB8IFwiTWludXNcIiAtPiBNaW51c1xuICAgIHwgXCJFcXVhbFwiIC0+IEVxdWFsXG4gICAgKCogV2hpdGVzcGFjZSAqKVxuICAgIHwgXCJUYWJcIiAtPiBUYWJcbiAgICB8IFwiRW50ZXJcIiAtPiBFbnRlclxuICAgIHwgXCJTcGFjZVwiIC0+IFNwYWNlXG4gICAgKCogRWRpdGluZyAqKVxuICAgIHwgXCJFc2NhcGVcIiAtPiBFc2NhcGVcbiAgICB8IFwiQmFja3NwYWNlXCIgLT4gQmFja3NwYWNlXG4gICAgfCBcIkluc2VydFwiIC0+IEluc2VydFxuICAgIHwgXCJEZWxldGVcIiAtPiBEZWxldGVcbiAgICB8IFwiQ2Fwc0xvY2tcIiAtPiBDYXBzTG9ja1xuICAgICgqIE1pc2MgUHJpbnRhYmxlICopXG4gICAgfCBcIkJyYWNrZXRMZWZ0XCIgLT4gQnJhY2tldExlZnRcbiAgICB8IFwiQnJhY2tldFJpZ2h0XCIgLT4gQnJhY2tldFJpZ2h0XG4gICAgfCBcIlNlbWljb2xvblwiIC0+IFNlbWljb2xvblxuICAgIHwgXCJRdW90ZVwiIC0+IFF1b3RlXG4gICAgfCBcIkJhY2txdW90ZVwiIC0+IEJhY2txdW90ZVxuICAgIHwgXCJCYWNrc2xhc2hcIiAtPiBCYWNrc2xhc2hcbiAgICB8IFwiQ29tbWFcIiAtPiBDb21tYVxuICAgIHwgXCJQZXJpb2RcIiAtPiBQZXJpb2RcbiAgICB8IFwiU2xhc2hcIiAtPiBTbGFzaFxuICAgICgqIEZ1bmN0aW9uIGtleXMgKilcbiAgICB8IFwiRjFcIiAtPiBGMVxuICAgIHwgXCJGMlwiIC0+IEYyXG4gICAgfCBcIkYzXCIgLT4gRjNcbiAgICB8IFwiRjRcIiAtPiBGNFxuICAgIHwgXCJGNVwiIC0+IEY1XG4gICAgfCBcIkY2XCIgLT4gRjZcbiAgICB8IFwiRjdcIiAtPiBGN1xuICAgIHwgXCJGOFwiIC0+IEY4XG4gICAgfCBcIkY5XCIgLT4gRjlcbiAgICB8IFwiRjEwXCIgLT4gRjEwXG4gICAgfCBcIkYxMVwiIC0+IEYxMVxuICAgIHwgXCJGMTJcIiAtPiBGMTJcbiAgICAoKiBOdW1wYWQga2V5cyAqKVxuICAgIHwgXCJOdW1wYWQwXCIgLT4gTnVtcGFkMFxuICAgIHwgXCJOdW1wYWQxXCIgLT4gTnVtcGFkMVxuICAgIHwgXCJOdW1wYWQyXCIgLT4gTnVtcGFkMlxuICAgIHwgXCJOdW1wYWQzXCIgLT4gTnVtcGFkM1xuICAgIHwgXCJOdW1wYWQ0XCIgLT4gTnVtcGFkNFxuICAgIHwgXCJOdW1wYWQ1XCIgLT4gTnVtcGFkNVxuICAgIHwgXCJOdW1wYWQ2XCIgLT4gTnVtcGFkNlxuICAgIHwgXCJOdW1wYWQ3XCIgLT4gTnVtcGFkN1xuICAgIHwgXCJOdW1wYWQ4XCIgLT4gTnVtcGFkOFxuICAgIHwgXCJOdW1wYWQ5XCIgLT4gTnVtcGFkOVxuICAgIHwgXCJOdW1wYWRNdWx0aXBseVwiIC0+IE51bXBhZE11bHRpcGx5XG4gICAgfCBcIk51bXBhZFN1YnRyYWN0XCIgLT4gTnVtcGFkU3VidHJhY3RcbiAgICB8IFwiTnVtcGFkQWRkXCIgLT4gTnVtcGFkQWRkXG4gICAgfCBcIk51bXBhZERlY2ltYWxcIiAtPiBOdW1wYWREZWNpbWFsXG4gICAgfCBcIk51bXBhZEVxdWFsXCIgLT4gTnVtcGFkRXF1YWxcbiAgICB8IFwiTnVtcGFkRW50ZXJcIiAtPiBOdW1wYWRFbnRlclxuICAgIHwgXCJOdW1wYWREaXZpZGVcIiAtPiBOdW1wYWREaXZpZGVcbiAgICB8IFwiTnVtTG9ja1wiIC0+IE51bUxvY2tcbiAgICAoKiBNb2RpZmllciBrZXlzICopXG4gICAgfCBcIkNvbnRyb2xMZWZ0XCIgLT4gQ29udHJvbExlZnRcbiAgICB8IFwiQ29udHJvbFJpZ2h0XCIgLT4gQ29udHJvbFJpZ2h0XG4gICAgfCBcIk1ldGFMZWZ0XCIgLT4gTWV0YUxlZnRcbiAgICB8IFwiTWV0YVJpZ2h0XCIgLT4gTWV0YVJpZ2h0XG4gICAgfCBcIlNoaWZ0TGVmdFwiIC0+IFNoaWZ0TGVmdFxuICAgIHwgXCJTaGlmdFJpZ2h0XCIgLT4gU2hpZnRSaWdodFxuICAgIHwgXCJBbHRMZWZ0XCIgLT4gQWx0TGVmdFxuICAgIHwgXCJBbHRSaWdodFwiIC0+IEFsdFJpZ2h0XG4gICAgKCogQXJyb3cga2V5cyAqKVxuICAgIHwgXCJBcnJvd0xlZnRcIiAtPiBBcnJvd0xlZnRcbiAgICB8IFwiQXJyb3dSaWdodFwiIC0+IEFycm93UmlnaHRcbiAgICB8IFwiQXJyb3dVcFwiIC0+IEFycm93VXBcbiAgICB8IFwiQXJyb3dEb3duXCIgLT4gQXJyb3dEb3duXG4gICAgKCogTmF2aWdhdGlvbiAqKVxuICAgIHwgXCJQYWdlVXBcIiAtPiBQYWdlVXBcbiAgICB8IFwiUGFnZURvd25cIiAtPiBQYWdlRG93blxuICAgIHwgXCJIb21lXCIgLT4gSG9tZVxuICAgIHwgXCJFbmRcIiAtPiBFbmRcbiAgICAoKiBTb3VuZCAqKVxuICAgIHwgXCJWb2x1bWVNdXRlXCIgLT4gVm9sdW1lTXV0ZVxuICAgIHwgXCJWb2x1bWVEb3duXCIgLT4gVm9sdW1lRG93blxuICAgIHwgXCJWb2x1bWVVcFwiIC0+IFZvbHVtZVVwXG4gICAgKCogTWVkaWEgKilcbiAgICB8IFwiTWVkaWFUcmFja1ByZXZpb3VzXCIgLT4gTWVkaWFUcmFja1ByZXZpb3VzXG4gICAgfCBcIk1lZGlhVHJhY2tOZXh0XCIgLT4gTWVkaWFUcmFja05leHRcbiAgICB8IFwiTWVkaWFQbGF5UGF1c2VcIiAtPiBNZWRpYVBsYXlQYXVzZVxuICAgIHwgXCJNZWRpYVN0b3BcIiAtPiBNZWRpYVN0b3BcbiAgICAoKiBCcm93c2VyIHNwZWNpYWwgKilcbiAgICB8IFwiQ29udGV4dE1lbnVcIiAtPiBDb250ZXh0TWVudVxuICAgIHwgXCJCcm93c2VyU2VhcmNoXCIgLT4gQnJvd3NlclNlYXJjaFxuICAgIHwgXCJCcm93c2VySG9tZVwiIC0+IEJyb3dzZXJIb21lXG4gICAgfCBcIkJyb3dzZXJGYXZvcml0ZXNcIiAtPiBCcm93c2VyRmF2b3JpdGVzXG4gICAgfCBcIkJyb3dzZXJSZWZyZXNoXCIgLT4gQnJvd3NlclJlZnJlc2hcbiAgICB8IFwiQnJvd3NlclN0b3BcIiAtPiBCcm93c2VyU3RvcFxuICAgIHwgXCJCcm93c2VyRm9yd2FyZFwiIC0+IEJyb3dzZXJGb3J3YXJkXG4gICAgfCBcIkJyb3dzZXJCYWNrXCIgLT4gQnJvd3NlckJhY2tcbiAgICAoKiBNaXNjICopXG4gICAgfCBcIk9TTGVmdFwiIC0+IE9TTGVmdFxuICAgIHwgXCJPU1JpZ2h0XCIgLT4gT1NSaWdodFxuICAgIHwgXCJTY3JvbGxMb2NrXCIgLT4gU2Nyb2xsTG9ja1xuICAgIHwgXCJQcmludFNjcmVlblwiIC0+IFByaW50U2NyZWVuXG4gICAgfCBcIkludGxCYWNrc2xhc2hcIiAtPiBJbnRsQmFja3NsYXNoXG4gICAgfCBcIkludGxZZW5cIiAtPiBJbnRsWWVuXG4gICAgfCBcIlBhdXNlXCIgLT4gUGF1c2VcbiAgICB8IF8gLT4gVW5pZGVudGlmaWVkXG5cbiAgbGV0IHRyeV9rZXlfY29kZV9sZWZ0ID0gZnVuY3Rpb25cbiAgICB8IDE2IC0+IFNoaWZ0TGVmdFxuICAgIHwgMTcgLT4gQ29udHJvbExlZnRcbiAgICB8IDE4IC0+IEFsdExlZnRcbiAgICB8IDkxIC0+IE1ldGFMZWZ0XG4gICAgfCBfIC0+IFVuaWRlbnRpZmllZFxuXG4gIGxldCB0cnlfa2V5X2NvZGVfcmlnaHQgPSBmdW5jdGlvblxuICAgIHwgMTYgLT4gU2hpZnRSaWdodFxuICAgIHwgMTcgLT4gQ29udHJvbFJpZ2h0XG4gICAgfCAxOCAtPiBBbHRSaWdodFxuICAgIHwgOTEgLT4gTWV0YVJpZ2h0XG4gICAgfCBfIC0+IFVuaWRlbnRpZmllZFxuXG4gIGxldCB0cnlfa2V5X2NvZGVfbnVtcGFkID0gZnVuY3Rpb25cbiAgICB8IDQ2IC0+IE51bXBhZERlY2ltYWxcbiAgICB8IDQ1IC0+IE51bXBhZDBcbiAgICB8IDM1IC0+IE51bXBhZDFcbiAgICB8IDQwIC0+IE51bXBhZDJcbiAgICB8IDM0IC0+IE51bXBhZDNcbiAgICB8IDM3IC0+IE51bXBhZDRcbiAgICB8IDEyIC0+IE51bXBhZDVcbiAgICB8IDM5IC0+IE51bXBhZDZcbiAgICB8IDM2IC0+IE51bXBhZDdcbiAgICB8IDM4IC0+IE51bXBhZDhcbiAgICB8IDMzIC0+IE51bXBhZDlcbiAgICB8IDEzIC0+IE51bXBhZEVudGVyXG4gICAgfCAxMTEgLT4gTnVtcGFkRGl2aWRlXG4gICAgfCAxMDcgLT4gTnVtcGFkQWRkXG4gICAgfCAxMDkgLT4gTnVtcGFkU3VidHJhY3RcbiAgICB8IDEwNiAtPiBOdW1wYWRNdWx0aXBseVxuICAgIHwgMTEwIC0+IE51bXBhZERlY2ltYWxcbiAgICB8IDk2IC0+IE51bXBhZDBcbiAgICB8IDk3IC0+IE51bXBhZDFcbiAgICB8IDk4IC0+IE51bXBhZDJcbiAgICB8IDk5IC0+IE51bXBhZDNcbiAgICB8IDEwMCAtPiBOdW1wYWQ0XG4gICAgfCAxMDEgLT4gTnVtcGFkNVxuICAgIHwgMTAyIC0+IE51bXBhZDZcbiAgICB8IDEwMyAtPiBOdW1wYWQ3XG4gICAgfCAxMDQgLT4gTnVtcGFkOFxuICAgIHwgMTA1IC0+IE51bXBhZDlcbiAgICB8IF8gLT4gVW5pZGVudGlmaWVkXG5cbiAgbGV0IHRyeV9rZXlfY29kZV9ub3JtYWwgPSBmdW5jdGlvblxuICAgIHwgMjcgLT4gRXNjYXBlXG4gICAgfCAxMTIgLT4gRjFcbiAgICB8IDExMyAtPiBGMlxuICAgIHwgMTE0IC0+IEYzXG4gICAgfCAxMTUgLT4gRjRcbiAgICB8IDExNiAtPiBGNVxuICAgIHwgMTE3IC0+IEY2XG4gICAgfCAxMTggLT4gRjdcbiAgICB8IDExOSAtPiBGOFxuICAgIHwgMTIwIC0+IEY5XG4gICAgfCAxMjEgLT4gRjEwXG4gICAgfCAxMjIgLT4gRjExXG4gICAgfCAxMjMgLT4gRjEyXG4gICAgfCA0MiAtPiBQcmludFNjcmVlblxuICAgIHwgMTQ1IC0+IFNjcm9sbExvY2tcbiAgICB8IDE5IC0+IFBhdXNlXG4gICAgfCAxOTIgLT4gQmFja3F1b3RlXG4gICAgfCA0OSAtPiBEaWdpdDFcbiAgICB8IDUwIC0+IERpZ2l0MlxuICAgIHwgNTEgLT4gRGlnaXQzXG4gICAgfCA1MiAtPiBEaWdpdDRcbiAgICB8IDUzIC0+IERpZ2l0NVxuICAgIHwgNTQgLT4gRGlnaXQ2XG4gICAgfCA1NSAtPiBEaWdpdDdcbiAgICB8IDU2IC0+IERpZ2l0OFxuICAgIHwgNTcgLT4gRGlnaXQ5XG4gICAgfCA0OCAtPiBEaWdpdDBcbiAgICB8IDE4OSAtPiBNaW51c1xuICAgIHwgMTg3IC0+IEVxdWFsXG4gICAgfCA4IC0+IEJhY2tzcGFjZVxuICAgIHwgOSAtPiBUYWJcbiAgICB8IDgxIC0+IEtleVFcbiAgICB8IDg3IC0+IEtleVdcbiAgICB8IDY5IC0+IEtleUVcbiAgICB8IDgyIC0+IEtleVJcbiAgICB8IDg0IC0+IEtleVRcbiAgICB8IDg5IC0+IEtleVlcbiAgICB8IDg1IC0+IEtleVVcbiAgICB8IDczIC0+IEtleUlcbiAgICB8IDc5IC0+IEtleU9cbiAgICB8IDgwIC0+IEtleVBcbiAgICB8IDIxOSAtPiBCcmFja2V0TGVmdFxuICAgIHwgMjIxIC0+IEJyYWNrZXRSaWdodFxuICAgIHwgMjIwIC0+IEJhY2tzbGFzaFxuICAgIHwgMjAgLT4gQ2Fwc0xvY2tcbiAgICB8IDY1IC0+IEtleUFcbiAgICB8IDgzIC0+IEtleVNcbiAgICB8IDY4IC0+IEtleURcbiAgICB8IDcwIC0+IEtleUZcbiAgICB8IDcxIC0+IEtleUdcbiAgICB8IDcyIC0+IEtleUhcbiAgICB8IDc0IC0+IEtleUpcbiAgICB8IDc1IC0+IEtleUtcbiAgICB8IDc2IC0+IEtleUxcbiAgICB8IDE4NiAtPiBTZW1pY29sb25cbiAgICB8IDIyMiAtPiBRdW90ZVxuICAgIHwgMTMgLT4gRW50ZXJcbiAgICB8IDkwIC0+IEtleVpcbiAgICB8IDg4IC0+IEtleVhcbiAgICB8IDY3IC0+IEtleUNcbiAgICB8IDg2IC0+IEtleVZcbiAgICB8IDY2IC0+IEtleUJcbiAgICB8IDc4IC0+IEtleU5cbiAgICB8IDc3IC0+IEtleU1cbiAgICB8IDE4OCAtPiBDb21tYVxuICAgIHwgMTkwIC0+IFBlcmlvZFxuICAgIHwgMTkxIC0+IFNsYXNoXG4gICAgfCAzMiAtPiBTcGFjZVxuICAgIHwgOTMgLT4gQ29udGV4dE1lbnVcbiAgICB8IDQ1IC0+IEluc2VydFxuICAgIHwgMzYgLT4gSG9tZVxuICAgIHwgMzMgLT4gUGFnZVVwXG4gICAgfCA0NiAtPiBEZWxldGVcbiAgICB8IDM1IC0+IEVuZFxuICAgIHwgMzQgLT4gUGFnZURvd25cbiAgICB8IDM3IC0+IEFycm93TGVmdFxuICAgIHwgNDAgLT4gQXJyb3dEb3duXG4gICAgfCAzOSAtPiBBcnJvd1JpZ2h0XG4gICAgfCAzOCAtPiBBcnJvd1VwXG4gICAgfCBfIC0+IFVuaWRlbnRpZmllZFxuXG4gIGxldCBtYWtlX3VuaWRlbnRpZmllZCBfID0gVW5pZGVudGlmaWVkXG5cbiAgbGV0IHRyeV9uZXh0IHZhbHVlIGYgPSBmdW5jdGlvblxuICAgIHwgVW5pZGVudGlmaWVkIC0+IE9wdGRlZi5jYXNlIHZhbHVlIG1ha2VfdW5pZGVudGlmaWVkIGZcbiAgICB8IHYgLT4gdlxuXG4gIGxldCBydW5fbmV4dCB2YWx1ZSBmID0gZnVuY3Rpb25cbiAgICB8IFVuaWRlbnRpZmllZCAtPiBmIHZhbHVlXG4gICAgfCB2IC0+IHZcblxuICBsZXQgZ2V0X2tleV9jb2RlIGV2dCA9IGV2dCMjLmtleUNvZGVcblxuICBsZXQgdHJ5X2tleV9sb2NhdGlvbiBldnQgPVxuICAgIG1hdGNoIGV2dCMjLmxvY2F0aW9uIHdpdGhcbiAgICB8IDEgLT4gcnVuX25leHQgKGdldF9rZXlfY29kZSBldnQpIHRyeV9rZXlfY29kZV9sZWZ0XG4gICAgfCAyIC0+IHJ1bl9uZXh0IChnZXRfa2V5X2NvZGUgZXZ0KSB0cnlfa2V5X2NvZGVfcmlnaHRcbiAgICB8IDMgLT4gcnVuX25leHQgKGdldF9rZXlfY29kZSBldnQpIHRyeV9rZXlfY29kZV9udW1wYWRcbiAgICB8IF8gLT4gbWFrZV91bmlkZW50aWZpZWRcblxuICBsZXQgKCB8PiApIHggZiA9IGYgeFxuXG4gIGxldCBvZl9ldmVudCBldnQgPVxuICAgIFVuaWRlbnRpZmllZFxuICAgIHw+IHRyeV9uZXh0IGV2dCMjLmNvZGUgdHJ5X2NvZGVcbiAgICB8PiB0cnlfa2V5X2xvY2F0aW9uIGV2dFxuICAgIHw+IHJ1bl9uZXh0IChnZXRfa2V5X2NvZGUgZXZ0KSB0cnlfa2V5X2NvZGVfbm9ybWFsXG5cbiAgbGV0IG9mX2tleV9jb2RlID0gdHJ5X2tleV9jb2RlX25vcm1hbFxuZW5kXG5cbm1vZHVsZSBLZXlib2FyZF9rZXkgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gVWNoYXIudCBvcHRpb25cblxuICBsZXQgY2hhcl9vZl9pbnQgdmFsdWUgPVxuICAgIGlmIDAgPCB2YWx1ZSB0aGVuIHRyeSBTb21lIChVY2hhci5vZl9pbnQgdmFsdWUpIHdpdGggXyAtPiBOb25lIGVsc2UgTm9uZVxuXG4gIGxldCBlbXB0eV9zdHJpbmcgXyA9IEpzLnN0cmluZyBcIlwiXG5cbiAgbGV0IG5vbmUgXyA9IE5vbmVcblxuICBsZXQgb2ZfZXZlbnQgZXZ0ID1cbiAgICBsZXQga2V5ID0gT3B0ZGVmLmdldCBldnQjIy5rZXkgZW1wdHlfc3RyaW5nIGluXG4gICAgbWF0Y2gga2V5IyMubGVuZ3RoIHdpdGhcbiAgICB8IDAgLT4gT3B0ZGVmLmNhc2UgZXZ0IyMuY2hhckNvZGUgbm9uZSBjaGFyX29mX2ludFxuICAgIHwgMSAtPiBjaGFyX29mX2ludCAoaW50X29mX2Zsb2F0IChrZXkjI2NoYXJDb2RlQXQgMCkpXG4gICAgfCBfIC0+IE5vbmVcbmVuZFxuXG4oKioqKiopXG5cbmxldCBlbGVtZW50IDogI0RvbS5lbGVtZW50IHQgLT4gZWxlbWVudCB0ID0gSnMuVW5zYWZlLmNvZXJjZVxuXG50eXBlIHRhZ2dlZEVsZW1lbnQgPVxuICB8IEEgb2YgYW5jaG9yRWxlbWVudCB0XG4gIHwgQXJlYSBvZiBhcmVhRWxlbWVudCB0XG4gIHwgQXVkaW8gb2YgYXVkaW9FbGVtZW50IHRcbiAgfCBCYXNlIG9mIGJhc2VFbGVtZW50IHRcbiAgfCBCbG9ja3F1b3RlIG9mIHF1b3RlRWxlbWVudCB0XG4gIHwgQm9keSBvZiBib2R5RWxlbWVudCB0XG4gIHwgQnIgb2YgYnJFbGVtZW50IHRcbiAgfCBCdXR0b24gb2YgYnV0dG9uRWxlbWVudCB0XG4gIHwgQ2FudmFzIG9mIGNhbnZhc0VsZW1lbnQgdFxuICB8IENhcHRpb24gb2YgdGFibGVDYXB0aW9uRWxlbWVudCB0XG4gIHwgQ29sIG9mIHRhYmxlQ29sRWxlbWVudCB0XG4gIHwgQ29sZ3JvdXAgb2YgdGFibGVDb2xFbGVtZW50IHRcbiAgfCBEZWwgb2YgbW9kRWxlbWVudCB0XG4gIHwgRGl2IG9mIGRpdkVsZW1lbnQgdFxuICB8IERsIG9mIGRMaXN0RWxlbWVudCB0XG4gIHwgRW1iZWQgb2YgZW1iZWRFbGVtZW50IHRcbiAgfCBGaWVsZHNldCBvZiBmaWVsZFNldEVsZW1lbnQgdFxuICB8IEZvcm0gb2YgZm9ybUVsZW1lbnQgdFxuICB8IEZyYW1lc2V0IG9mIGZyYW1lU2V0RWxlbWVudCB0XG4gIHwgRnJhbWUgb2YgZnJhbWVFbGVtZW50IHRcbiAgfCBIMSBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSDIgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEgzIG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBINCBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSDUgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEg2IG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBIZWFkIG9mIGhlYWRFbGVtZW50IHRcbiAgfCBIciBvZiBockVsZW1lbnQgdFxuICB8IEh0bWwgb2YgaHRtbEVsZW1lbnQgdFxuICB8IElmcmFtZSBvZiBpRnJhbWVFbGVtZW50IHRcbiAgfCBJbWcgb2YgaW1hZ2VFbGVtZW50IHRcbiAgfCBJbnB1dCBvZiBpbnB1dEVsZW1lbnQgdFxuICB8IElucyBvZiBtb2RFbGVtZW50IHRcbiAgfCBMYWJlbCBvZiBsYWJlbEVsZW1lbnQgdFxuICB8IExlZ2VuZCBvZiBsZWdlbmRFbGVtZW50IHRcbiAgfCBMaSBvZiBsaUVsZW1lbnQgdFxuICB8IExpbmsgb2YgbGlua0VsZW1lbnQgdFxuICB8IE1hcCBvZiBtYXBFbGVtZW50IHRcbiAgfCBNZXRhIG9mIG1ldGFFbGVtZW50IHRcbiAgfCBPYmplY3Qgb2Ygb2JqZWN0RWxlbWVudCB0XG4gIHwgT2wgb2Ygb0xpc3RFbGVtZW50IHRcbiAgfCBPcHRncm91cCBvZiBvcHRHcm91cEVsZW1lbnQgdFxuICB8IE9wdGlvbiBvZiBvcHRpb25FbGVtZW50IHRcbiAgfCBQIG9mIHBhcmFtRWxlbWVudCB0XG4gIHwgUGFyYW0gb2YgcGFyYW1FbGVtZW50IHRcbiAgfCBQcmUgb2YgcHJlRWxlbWVudCB0XG4gIHwgUSBvZiBxdW90ZUVsZW1lbnQgdFxuICB8IFNjcmlwdCBvZiBzY3JpcHRFbGVtZW50IHRcbiAgfCBTZWxlY3Qgb2Ygc2VsZWN0RWxlbWVudCB0XG4gIHwgU3R5bGUgb2Ygc3R5bGVFbGVtZW50IHRcbiAgfCBUYWJsZSBvZiB0YWJsZUVsZW1lbnQgdFxuICB8IFRib2R5IG9mIHRhYmxlU2VjdGlvbkVsZW1lbnQgdFxuICB8IFRkIG9mIHRhYmxlQ2VsbEVsZW1lbnQgdFxuICB8IFRleHRhcmVhIG9mIHRleHRBcmVhRWxlbWVudCB0XG4gIHwgVGZvb3Qgb2YgdGFibGVTZWN0aW9uRWxlbWVudCB0XG4gIHwgVGggb2YgdGFibGVDZWxsRWxlbWVudCB0XG4gIHwgVGhlYWQgb2YgdGFibGVTZWN0aW9uRWxlbWVudCB0XG4gIHwgVGl0bGUgb2YgdGl0bGVFbGVtZW50IHRcbiAgfCBUciBvZiB0YWJsZVJvd0VsZW1lbnQgdFxuICB8IFVsIG9mIHVMaXN0RWxlbWVudCB0XG4gIHwgVmlkZW8gb2YgdmlkZW9FbGVtZW50IHRcbiAgfCBPdGhlciBvZiBlbGVtZW50IHRcblxubGV0IG90aGVyIGUgPSBPdGhlciAoZSA6ICNlbGVtZW50IHQgOj4gZWxlbWVudCB0KVxuXG5sZXQgdGFnZ2VkIChlIDogI2VsZW1lbnQgdCkgPVxuICBsZXQgdGFnID0gSnMudG9fYnl0ZXN0cmluZyBlIyMudGFnTmFtZSMjdG9Mb3dlckNhc2UgaW5cbiAgaWYgU3RyaW5nLmxlbmd0aCB0YWcgPSAwXG4gIHRoZW4gb3RoZXIgZVxuICBlbHNlXG4gICAgbWF0Y2ggU3RyaW5nLnVuc2FmZV9nZXQgdGFnIDAgd2l0aFxuICAgIHwgJ2EnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImFcIiAtPiBBIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJhcmVhXCIgLT4gQXJlYSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYXVkaW9cIiAtPiBBdWRpbyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdiJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJiYXNlXCIgLT4gQmFzZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYmxvY2txdW90ZVwiIC0+IEJsb2NrcXVvdGUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImJvZHlcIiAtPiBCb2R5IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJiclwiIC0+IEJyIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJidXR0b25cIiAtPiBCdXR0b24gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnYycgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiY2FudmFzXCIgLT4gQ2FudmFzIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJjYXB0aW9uXCIgLT4gQ2FwdGlvbiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiY29sXCIgLT4gQ29sIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJjb2xncm91cFwiIC0+IENvbGdyb3VwIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2QnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImRlbFwiIC0+IERlbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiZGl2XCIgLT4gRGl2IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJkbFwiIC0+IERsIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2UnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImVtYmVkXCIgLT4gRW1iZWQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnZicgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiZmllbGRzZXRcIiAtPiBGaWVsZHNldCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiZm9ybVwiIC0+IEZvcm0gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImZyYW1lc2V0XCIgLT4gRnJhbWVzZXQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImZyYW1lXCIgLT4gRnJhbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnaCcgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiaDFcIiAtPiBIMSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaDJcIiAtPiBIMiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaDNcIiAtPiBIMyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaDRcIiAtPiBINCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaDVcIiAtPiBINSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaDZcIiAtPiBINiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaGVhZFwiIC0+IEhlYWQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImhyXCIgLT4gSHIgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImh0bWxcIiAtPiBIdG1sIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2knIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImlmcmFtZVwiIC0+IElmcmFtZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaW1nXCIgLT4gSW1nIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJpbnB1dFwiIC0+IElucHV0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJpbnNcIiAtPiBJbnMgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnbCcgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwibGFiZWxcIiAtPiBMYWJlbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwibGVnZW5kXCIgLT4gTGVnZW5kIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJsaVwiIC0+IExpIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJsaW5rXCIgLT4gTGluayAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdtJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJtYXBcIiAtPiBNYXAgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcIm1ldGFcIiAtPiBNZXRhIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ28nIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcIm9iamVjdFwiIC0+IE9iamVjdCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwib2xcIiAtPiBPbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwib3B0Z3JvdXBcIiAtPiBPcHRncm91cCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwib3B0aW9uXCIgLT4gT3B0aW9uIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3AnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInBcIiAtPiBQIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJwYXJhbVwiIC0+IFBhcmFtIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJwcmVcIiAtPiBQcmUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAncScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwicVwiIC0+IFEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAncycgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwic2NyaXB0XCIgLT4gU2NyaXB0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJzZWxlY3RcIiAtPiBTZWxlY3QgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInN0eWxlXCIgLT4gU3R5bGUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAndCcgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwidGFibGVcIiAtPiBUYWJsZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGJvZHlcIiAtPiBUYm9keSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGRcIiAtPiBUZCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGV4dGFyZWFcIiAtPiBUZXh0YXJlYSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGZvb3RcIiAtPiBUZm9vdCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGhcIiAtPiBUaCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGhlYWRcIiAtPiBUaGVhZCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidGl0bGVcIiAtPiBUaXRsZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwidHJcIiAtPiBUciAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICd1JyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJ1bFwiIC0+IFVsIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3YnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInZpZGVvXCIgLT4gVmlkZW8gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCBfIC0+IG90aGVyIGVcblxubGV0IG9wdF90YWdnZWQgZSA9IE9wdC5jYXNlIGUgKGZ1biAoKSAtPiBOb25lKSAoZnVuIGUgLT4gU29tZSAodGFnZ2VkIGUpKVxuXG50eXBlIHRhZ2dlZEV2ZW50ID1cbiAgfCBNb3VzZUV2ZW50IG9mIG1vdXNlRXZlbnQgdFxuICB8IEtleWJvYXJkRXZlbnQgb2Yga2V5Ym9hcmRFdmVudCB0XG4gIHwgTWVzc2FnZUV2ZW50IG9mIG1lc3NhZ2VFdmVudCB0XG4gIHwgTW91c2V3aGVlbEV2ZW50IG9mIG1vdXNld2hlZWxFdmVudCB0XG4gIHwgTW91c2VTY3JvbGxFdmVudCBvZiBtb3VzZVNjcm9sbEV2ZW50IHRcbiAgfCBQb3BTdGF0ZUV2ZW50IG9mIHBvcFN0YXRlRXZlbnQgdFxuICB8IE90aGVyRXZlbnQgb2YgZXZlbnQgdFxuXG5sZXQgdGFnZ2VkRXZlbnQgKGV2IDogI2V2ZW50IEpzLnQpID1cbiAgSnMuT3B0LmNhc2VcbiAgICAoQ29lcmNlVG8ubW91c2VFdmVudCBldilcbiAgICAoZnVuICgpIC0+XG4gICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAoQ29lcmNlVG8ua2V5Ym9hcmRFdmVudCBldilcbiAgICAgICAgKGZ1biAoKSAtPlxuICAgICAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgICAgICAoQ29lcmNlVG8ud2hlZWxFdmVudCBldilcbiAgICAgICAgICAgIChmdW4gKCkgLT5cbiAgICAgICAgICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgICAgICAgICAoQ29lcmNlVG8ubW91c2VTY3JvbGxFdmVudCBldilcbiAgICAgICAgICAgICAgICAoZnVuICgpIC0+XG4gICAgICAgICAgICAgICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAgICAgICAgICAgICAoQ29lcmNlVG8ucG9wU3RhdGVFdmVudCBldilcbiAgICAgICAgICAgICAgICAgICAgKGZ1biAoKSAtPlxuICAgICAgICAgICAgICAgICAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAoQ29lcmNlVG8ubWVzc2FnZUV2ZW50IGV2KVxuICAgICAgICAgICAgICAgICAgICAgICAgKGZ1biAoKSAtPiBPdGhlckV2ZW50IChldiA6PiBldmVudCB0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gZXYgLT4gTWVzc2FnZUV2ZW50IGV2KSlcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBldiAtPiBQb3BTdGF0ZUV2ZW50IGV2KSlcbiAgICAgICAgICAgICAgICAoZnVuIGV2IC0+IE1vdXNlU2Nyb2xsRXZlbnQgZXYpKVxuICAgICAgICAgICAgKGZ1biBldiAtPiBNb3VzZXdoZWVsRXZlbnQgZXYpKVxuICAgICAgICAoZnVuIGV2IC0+IEtleWJvYXJkRXZlbnQgZXYpKVxuICAgIChmdW4gZXYgLT4gTW91c2VFdmVudCBldilcblxubGV0IG9wdF90YWdnZWRFdmVudCBldiA9IE9wdC5jYXNlIGV2IChmdW4gKCkgLT4gTm9uZSkgKGZ1biBldiAtPiBTb21lICh0YWdnZWRFdmVudCBldikpXG5cbmxldCBzdG9wUHJvcGFnYXRpb24gZXYgPVxuICBsZXQgZSA9IEpzLlVuc2FmZS5jb2VyY2UgZXYgaW5cbiAgT3B0ZGVmLmNhc2VcbiAgICBlIyMuc3RvcFByb3BhZ2F0aW9uXG4gICAgKGZ1biAoKSAtPiBlIyMuY2FuY2VsQnViYmxlIDo9IEpzLl90cnVlKVxuICAgIChmdW4gXyAtPiBlIyNfc3RvcFByb3BhZ2F0aW9uKVxuXG5sZXQgX3JlcXVlc3RBbmltYXRpb25GcmFtZSA6ICh1bml0IC0+IHVuaXQpIEpzLmNhbGxiYWNrIC0+IHVuaXQgPVxuICBKcy5VbnNhZmUucHVyZV9leHByIChmdW4gXyAtPlxuICAgICAgbGV0IHcgPSBKcy5VbnNhZmUuY29lcmNlIHdpbmRvdyBpblxuICAgICAgbGV0IGwgPVxuICAgICAgICBbIHcjIy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOyB3IyMubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgIDsgdyMjLndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA7IHcjIy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgIDsgdyMjLm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgIF1cbiAgICAgIGluXG4gICAgICB0cnlcbiAgICAgICAgbGV0IHJlcSA9IExpc3QuZmluZCAoZnVuIGMgLT4gSnMuT3B0ZGVmLnRlc3QgYykgbCBpblxuICAgICAgICBmdW4gY2FsbGJhY2sgLT4gSnMuVW5zYWZlLmZ1bl9jYWxsIHJlcSBbfCBKcy5VbnNhZmUuaW5qZWN0IGNhbGxiYWNrIHxdXG4gICAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICBsZXQgbm93ICgpID0gKG5ldyVqcyBKcy5kYXRlX25vdykjI2dldFRpbWUgaW5cbiAgICAgICAgbGV0IGxhc3QgPSByZWYgKG5vdyAoKSkgaW5cbiAgICAgICAgZnVuIGNhbGxiYWNrIC0+XG4gICAgICAgICAgbGV0IHQgPSBub3cgKCkgaW5cbiAgICAgICAgICBsZXQgZHQgPSAhbGFzdCArLiAoMTAwMC4gLy4gNjAuKSAtLiB0IGluXG4gICAgICAgICAgbGV0IGR0ID0gaWYgUG9seS4oZHQgPCAwLikgdGhlbiAwLiBlbHNlIGR0IGluXG4gICAgICAgICAgbGFzdCA6PSB0O1xuICAgICAgICAgIGlnbm9yZSAod2luZG93IyNzZXRUaW1lb3V0IGNhbGxiYWNrIGR0KSlcblxuKCoqKiopXG5cbmxldCBoYXNQdXNoU3RhdGUgKCkgPSBKcy5PcHRkZWYudGVzdCAoSnMuVW5zYWZlLmNvZXJjZSB3aW5kb3cjIy5oaXN0b3J5KSMjLnB1c2hTdGF0ZVxuXG5sZXQgaGFzUGxhY2Vob2xkZXIgKCkgPVxuICBsZXQgaSA9IGNyZWF0ZUlucHV0IGRvY3VtZW50IGluXG4gIEpzLk9wdGRlZi50ZXN0IChKcy5VbnNhZmUuY29lcmNlIGkpIyMucGxhY2Vob2xkZXJcblxubGV0IGhhc1JlcXVpcmVkICgpID1cbiAgbGV0IGkgPSBjcmVhdGVJbnB1dCBkb2N1bWVudCBpblxuICBKcy5PcHRkZWYudGVzdCAoSnMuVW5zYWZlLmNvZXJjZSBpKSMjLnJlcXVpcmVkXG5cbmxldCBvdmVyZmxvd19saW1pdCA9IDIxNDc0ODNfMDAwLlxuXG4oKiBtcyAqKVxuXG50eXBlIHRpbWVvdXRfaWRfc2FmZSA9IHRpbWVvdXRfaWQgb3B0aW9uIHJlZlxuXG5sZXQgc2V0VGltZW91dCBjYWxsYmFjayBkIDogdGltZW91dF9pZF9zYWZlID1cbiAgbGV0IGlkID0gcmVmIE5vbmUgaW5cbiAgbGV0IHJlYyBsb29wIGQgKCkgPVxuICAgIGxldCBzdGVwLCByZW1haW4gPVxuICAgICAgaWYgUG9seS4oZCA+IG92ZXJmbG93X2xpbWl0KSB0aGVuIG92ZXJmbG93X2xpbWl0LCBkIC0uIG92ZXJmbG93X2xpbWl0IGVsc2UgZCwgMC5cbiAgICBpblxuICAgIGxldCBjYiA9IGlmIFBvbHkuKHJlbWFpbiA9IDAuKSB0aGVuIGNhbGxiYWNrIGVsc2UgbG9vcCByZW1haW4gaW5cbiAgICBpZCA6PSBTb21lICh3aW5kb3cjI3NldFRpbWVvdXQgKEpzLndyYXBfY2FsbGJhY2sgY2IpIHN0ZXApXG4gIGluXG4gIGxvb3AgZCAoKTtcbiAgaWRcblxubGV0IGNsZWFyVGltZW91dCAoaWQgOiB0aW1lb3V0X2lkX3NhZmUpID1cbiAgbWF0Y2ggIWlkIHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSB4IC0+XG4gICAgICBpZCA6PSBOb25lO1xuICAgICAgd2luZG93IyNjbGVhclRpbWVvdXQgeFxuXG5sZXQganNfYXJyYXlfb2ZfY29sbGVjdGlvbiAoYyA6ICNlbGVtZW50IGNvbGxlY3Rpb24gSnMudCkgOiAjZWxlbWVudCBKcy50IEpzLmpzX2FycmF5IEpzLnRcbiAgICA9XG4gIEpzLlVuc2FmZS4obWV0aF9jYWxsIChqc19leHByIFwiW10uc2xpY2VcIikgXCJjYWxsXCIgW3wgaW5qZWN0IGMgfF0pXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDExIFBpZXJyZSBDaGFtYmFydFxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4gRG9tX2h0bWxcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIGZvcm1EYXRhID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFwcGVuZCA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFwcGVuZF9ibG9iIDoganNfc3RyaW5nIHQgLT4gRmlsZS5ibG9iIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5sZXQgZm9ybURhdGEgOiBmb3JtRGF0YSB0IGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRm9ybURhdGFcblxubGV0IGZvcm1EYXRhX2Zvcm0gOiAoZm9ybUVsZW1lbnQgdCAtPiBmb3JtRGF0YSB0KSBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0Zvcm1EYXRhXG5cbnR5cGUgZm9ybV9lbHQgPVxuICBbIGBTdHJpbmcgb2YganNfc3RyaW5nIHRcbiAgfCBgRmlsZSBvZiBGaWxlLmZpbGUgdFxuICBdXG5cbnR5cGUgZm9ybV9jb250ZW50cyA9XG4gIFsgYEZpZWxkcyBvZiAoc3RyaW5nICogZm9ybV9lbHQpIGxpc3QgcmVmXG4gIHwgYEZvcm1EYXRhIG9mIGZvcm1EYXRhIHRcbiAgXVxuXG5sZXQgcmVjIGZpbHRlcl9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB2IDo6IHEgLT4gKFxuICAgICAgbWF0Y2ggZiB2IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBmaWx0ZXJfbWFwIGYgcVxuICAgICAgfCBTb21lIHYnIC0+IHYnIDo6IGZpbHRlcl9tYXAgZiBxKVxuXG5jbGFzcyB0eXBlIHN1Ym1pdHRhYmxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmxldCBoYXZlX2NvbnRlbnQgKGVsdCA6IHN1Ym1pdHRhYmxlRWxlbWVudCB0KSA9XG4gIGVsdCMjLm5hbWUjIy5sZW5ndGggPiAwICYmIG5vdCAoSnMudG9fYm9vbCBlbHQjIy5kaXNhYmxlZClcblxubGV0IGdldF90ZXh0YXJlYV92YWwgKGVsdCA6IHRleHRBcmVhRWxlbWVudCB0KSA9XG4gIGlmIGhhdmVfY29udGVudCAoZWx0IDo+IHN1Ym1pdHRhYmxlRWxlbWVudCB0KVxuICB0aGVuXG4gICAgbGV0IG5hbWUgPSB0b19zdHJpbmcgZWx0IyMubmFtZSBpblxuICAgIFsgbmFtZSwgYFN0cmluZyBlbHQjIy52YWx1ZSBdXG4gIGVsc2UgW11cblxubGV0IGdldF9zZWxlY3RfdmFsIChlbHQgOiBzZWxlY3RFbGVtZW50IHQpID1cbiAgaWYgaGF2ZV9jb250ZW50IChlbHQgOj4gc3VibWl0dGFibGVFbGVtZW50IHQpXG4gIHRoZW5cbiAgICBsZXQgbmFtZSA9IHRvX3N0cmluZyBlbHQjIy5uYW1lIGluXG4gICAgaWYgdG9fYm9vbCBlbHQjIy5tdWx0aXBsZVxuICAgIHRoZW5cbiAgICAgIGxldCBvcHRpb25zID1cbiAgICAgICAgQXJyYXkuaW5pdCBlbHQjIy5vcHRpb25zIyMubGVuZ3RoIChmdW4gaSAtPiBPcHQudG9fb3B0aW9uIChlbHQjIy5vcHRpb25zIyNpdGVtIGkpKVxuICAgICAgaW5cbiAgICAgIGZpbHRlcl9tYXBcbiAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgICB8IFNvbWUgZSAtPlxuICAgICAgICAgICAgICBpZiBKcy50b19ib29sIGUjIy5zZWxlY3RlZCB0aGVuIFNvbWUgKG5hbWUsIGBTdHJpbmcgZSMjLnZhbHVlKSBlbHNlIE5vbmUpXG4gICAgICAgIChBcnJheS50b19saXN0IG9wdGlvbnMpXG4gICAgZWxzZSBbIG5hbWUsIGBTdHJpbmcgZWx0IyMudmFsdWUgXVxuICBlbHNlIFtdXG5cbmNsYXNzIHR5cGUgZmlsZV9pbnB1dCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgaW5wdXRFbGVtZW50XG5cbiAgICBtZXRob2QgZmlsZXMgOiBGaWxlLmZpbGVMaXN0IHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtdWx0aXBsZSA6IGJvb2wgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBnZXRfaW5wdXRfdmFsID8oZ2V0ID0gZmFsc2UpIChlbHQgOiBpbnB1dEVsZW1lbnQgdCkgPVxuICBpZiBoYXZlX2NvbnRlbnQgKGVsdCA6PiBzdWJtaXR0YWJsZUVsZW1lbnQgdClcbiAgdGhlblxuICAgIGxldCBuYW1lID0gdG9fc3RyaW5nIGVsdCMjLm5hbWUgaW5cbiAgICBsZXQgdmFsdWUgPSBlbHQjIy52YWx1ZSBpblxuICAgIG1hdGNoIHRvX2J5dGVzdHJpbmcgZWx0IyMuX3R5cGUjI3RvTG93ZXJDYXNlIHdpdGhcbiAgICB8IFwiY2hlY2tib3hcIiB8IFwicmFkaW9cIiAtPlxuICAgICAgICBpZiB0b19ib29sIGVsdCMjLmNoZWNrZWQgdGhlbiBbIG5hbWUsIGBTdHJpbmcgdmFsdWUgXSBlbHNlIFtdXG4gICAgfCBcInN1Ym1pdFwiIHwgXCJyZXNldFwiIC0+IFtdXG4gICAgfCBcInRleHRcIiB8IFwicGFzc3dvcmRcIiAtPiBbIG5hbWUsIGBTdHJpbmcgdmFsdWUgXVxuICAgIHwgXCJmaWxlXCIgLT4gKFxuICAgICAgICBpZiBnZXRcbiAgICAgICAgdGhlbiBbIG5hbWUsIGBTdHJpbmcgdmFsdWUgXVxuICAgICAgICBlbHNlXG4gICAgICAgICAgbGV0IGVsdCA6IGZpbGVfaW5wdXQgdCA9IFVuc2FmZS5jb2VyY2UgZWx0IGluXG4gICAgICAgICAgbWF0Y2ggT3B0ZGVmLnRvX29wdGlvbiBlbHQjIy5maWxlcyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IFtdXG4gICAgICAgICAgfCBTb21lIGxpc3QgLT4gKFxuICAgICAgICAgICAgICBpZiBsaXN0IyMubGVuZ3RoID0gMFxuICAgICAgICAgICAgICB0aGVuIFsgbmFtZSwgYFN0cmluZyAoSnMuc3RyaW5nIFwiXCIpIF1cbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1hdGNoIE9wdGRlZi50b19vcHRpb24gZWx0IyMubXVsdGlwbGUgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSB8IFNvbWUgZmFsc2UgLT4gKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaCBPcHQudG9fb3B0aW9uIChsaXN0IyNpdGVtIDApIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IFtdXG4gICAgICAgICAgICAgICAgICAgIHwgU29tZSBmaWxlIC0+IFsgbmFtZSwgYEZpbGUgZmlsZSBdKVxuICAgICAgICAgICAgICAgIHwgU29tZSB0cnVlIC0+XG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcl9tYXBcbiAgICAgICAgICAgICAgICAgICAgICAoZnVuIGYgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIE9wdC50b19vcHRpb24gZiB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIGZpbGUgLT4gU29tZSAobmFtZSwgYEZpbGUgZmlsZSkpXG4gICAgICAgICAgICAgICAgICAgICAgKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgbGlzdCMjLmxlbmd0aCAoZnVuIGkgLT4gbGlzdCMjaXRlbSBpKSkpKSlcbiAgICB8IF8gLT4gWyBuYW1lLCBgU3RyaW5nIHZhbHVlIF1cbiAgZWxzZSBbXVxuXG5sZXQgZ2V0X2Zvcm1fZWxlbWVudHMgKGZvcm0gOiBmb3JtRWxlbWVudCB0KSA9XG4gIGxldCByZWMgbG9vcCBhY2MgaSA9XG4gICAgaWYgaSA8IDBcbiAgICB0aGVuIGFjY1xuICAgIGVsc2VcbiAgICAgIG1hdGNoIE9wdC50b19vcHRpb24gKGZvcm0jIy5lbGVtZW50cyMjaXRlbSBpKSB3aXRoXG4gICAgICB8IE5vbmUgLT4gbG9vcCBhY2MgKGkgLSBpKVxuICAgICAgfCBTb21lIHggLT4gbG9vcCAoeCA6OiBhY2MpIChpIC0gMSlcbiAgaW5cbiAgbG9vcCBbXSAoZm9ybSMjLmVsZW1lbnRzIyMubGVuZ3RoIC0gMSlcblxubGV0IGdldF9lbGVtZW50X2NvbnRlbnQgP2dldCB2ID1cbiAgbWF0Y2ggdGFnZ2VkIHYgd2l0aFxuICB8IFNlbGVjdCB2IC0+IGdldF9zZWxlY3RfdmFsIHZcbiAgfCBJbnB1dCB2IC0+IGdldF9pbnB1dF92YWwgP2dldCB2XG4gIHwgVGV4dGFyZWEgdiAtPiBnZXRfdGV4dGFyZWFfdmFsIHZcbiAgfCBfIC0+IFtdXG5cbmxldCBmb3JtX2VsZW1lbnRzID9nZXQgKGZvcm0gOiBmb3JtRWxlbWVudCB0KSA9XG4gIExpc3QuZmxhdHRlbiAoTGlzdC5tYXAgKGZ1biB2IC0+IGdldF9lbGVtZW50X2NvbnRlbnQgP2dldCB2KSAoZ2V0X2Zvcm1fZWxlbWVudHMgZm9ybSkpXG5cbmxldCBhcHBlbmQgKGZvcm1fY29udGVudHMgOiBmb3JtX2NvbnRlbnRzKSAoZm9ybV9lbHQgOiBzdHJpbmcgKiBmb3JtX2VsdCkgPVxuICBtYXRjaCBmb3JtX2NvbnRlbnRzIHdpdGhcbiAgfCBgRmllbGRzIGxpc3QgLT4gbGlzdCA6PSBmb3JtX2VsdCA6OiAhbGlzdFxuICB8IGBGb3JtRGF0YSBmIC0+IChcbiAgICAgIG1hdGNoIGZvcm1fZWx0IHdpdGhcbiAgICAgIHwgbmFtZSwgYFN0cmluZyBzIC0+IGYjI2FwcGVuZCAoc3RyaW5nIG5hbWUpIHNcbiAgICAgIHwgbmFtZSwgYEZpbGUgZmlsZSAtPiBmIyNhcHBlbmRfYmxvYiAoc3RyaW5nIG5hbWUpIChmaWxlIDo+IEZpbGUuYmxvYiB0KSlcblxubGV0IGVtcHR5X2Zvcm1fY29udGVudHMgKCkgPVxuICBtYXRjaCBPcHRkZWYudG9fb3B0aW9uIChKcy5kZWYgZm9ybURhdGEpIHdpdGhcbiAgfCBOb25lIC0+IGBGaWVsZHMgKHJlZiBbXSlcbiAgfCBTb21lIGNvbnN0ciAtPiBgRm9ybURhdGEgKG5ldyVqcyBjb25zdHIpXG5cbmxldCBwb3N0X2Zvcm1fY29udGVudHMgZm9ybSA9XG4gIGxldCBjb250ZW50cyA9IGVtcHR5X2Zvcm1fY29udGVudHMgKCkgaW5cbiAgTGlzdC5pdGVyIChhcHBlbmQgY29udGVudHMpIChmb3JtX2VsZW1lbnRzIGZvcm0pO1xuICBjb250ZW50c1xuXG5sZXQgZ2V0X2Zvcm1fY29udGVudHMgZm9ybSA9XG4gIExpc3QubWFwXG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IG5hbWUsIGBTdHJpbmcgcyAtPiBuYW1lLCB0b19zdHJpbmcgc1xuICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbiAgICAoZm9ybV9lbGVtZW50cyB+Z2V0OnRydWUgZm9ybSlcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxudHlwZSByZWFkeVN0YXRlID1cbiAgfCBVTlNFTlRcbiAgfCBPUEVORURcbiAgfCBIRUFERVJTX1JFQ0VJVkVEXG4gIHwgTE9BRElOR1xuICB8IERPTkVcblxudHlwZSBfIHJlc3BvbnNlID1cbiAgfCBBcnJheUJ1ZmZlciA6IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIHQgT3B0LnQgcmVzcG9uc2VcbiAgfCBCbG9iIDogI0ZpbGUuYmxvYiB0IE9wdC50IHJlc3BvbnNlXG4gIHwgRG9jdW1lbnQgOiBEb20uZWxlbWVudCBEb20uZG9jdW1lbnQgdCBPcHQudCByZXNwb25zZVxuICB8IEpTT04gOiAnYSBPcHQudCByZXNwb25zZVxuICB8IFRleHQgOiBqc19zdHJpbmcgdCByZXNwb25zZVxuICB8IERlZmF1bHQgOiBzdHJpbmcgcmVzcG9uc2VcblxuY2xhc3MgdHlwZSB4bWxIdHRwUmVxdWVzdCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgbWV0aG9kIG9ucmVhZHlzdGF0ZWNoYW5nZSA6ICh1bml0IC0+IHVuaXQpIEpzLmNhbGxiYWNrIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IHJlYWR5U3RhdGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9vcGVuIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIF9vcGVuX2Z1bGwgOlxuICAgICAgICAganNfc3RyaW5nIHRcbiAgICAgIC0+IGpzX3N0cmluZyB0XG4gICAgICAtPiBib29sIHRcbiAgICAgIC0+IGpzX3N0cmluZyB0IG9wdFxuICAgICAgLT4ganNfc3RyaW5nIHQgb3B0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRSZXF1ZXN0SGVhZGVyIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgb3ZlcnJpZGVNaW1lVHlwZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbmQgOiBqc19zdHJpbmcgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9ibG9iIDogI0ZpbGUuYmxvYiB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfZG9jdW1lbnQgOiBEb20uZWxlbWVudCBEb20uZG9jdW1lbnQgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZW5kX2Zvcm1EYXRhIDogRm9ybS5mb3JtRGF0YSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFib3J0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RhdHVzIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGF0dXNUZXh0IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldFJlc3BvbnNlSGVhZGVyIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBbGxSZXNwb25zZUhlYWRlcnMgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVzcG9uc2UgOiBGaWxlLmZpbGVfYW55IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXNwb25zZVRleHQgOiBqc19zdHJpbmcgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlc3BvbnNlWE1MIDogRG9tLmVsZW1lbnQgRG9tLmRvY3VtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXNwb25zZVR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2l0aENyZWRlbnRpYWxzIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBpbmhlcml0IEZpbGUucHJvZ3Jlc3NFdmVudFRhcmdldFxuXG4gICAgbWV0aG9kIG9udGltZW91dCA6XG4gICAgICAoJ3NlbGYgdCwgJ3NlbGYgRmlsZS5wcm9ncmVzc0V2ZW50IHQpIERvbS5ldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVwbG9hZCA6IHhtbEh0dHBSZXF1ZXN0VXBsb2FkIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCB4bWxIdHRwUmVxdWVzdFVwbG9hZCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBGaWxlLnByb2dyZXNzRXZlbnRUYXJnZXRcbiAgZW5kXG5cbm1vZHVsZSBFdmVudCA9IHN0cnVjdFxuICB0eXBlIHR5cCA9IHhtbEh0dHBSZXF1ZXN0IEZpbGUucHJvZ3Jlc3NFdmVudCB0IERvbS5FdmVudC50eXBcblxuICBsZXQgcmVhZHlzdGF0ZWNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwicmVhZHlzdGF0ZWNoYW5nZVwiXG5cbiAgbGV0IGxvYWRzdGFydCA9IERvbS5FdmVudC5tYWtlIFwibG9hZHN0YXJ0XCJcblxuICBsZXQgcHJvZ3Jlc3MgPSBEb20uRXZlbnQubWFrZSBcInByb2dyZXNzXCJcblxuICBsZXQgYWJvcnQgPSBEb20uRXZlbnQubWFrZSBcImFib3J0XCJcblxuICBsZXQgZXJyb3IgPSBEb20uRXZlbnQubWFrZSBcImVycm9yXCJcblxuICBsZXQgbG9hZCA9IERvbS5FdmVudC5tYWtlIFwibG9hZFwiXG5cbiAgbGV0IHRpbWVvdXQgPSBEb20uRXZlbnQubWFrZSBcInRpbWVvdXRcIlxuXG4gIGxldCBsb2FkZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2FkZW5kXCJcbmVuZFxuXG5leHRlcm5hbCBjcmVhdGUgOiB1bml0IC0+IHhtbEh0dHBSZXF1ZXN0IEpzLnQgPSBcImNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXCJcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgT0NhbWxQcm86IEdyw6lnb2lyZSBIZW5yeSwgw4dhxJ9kYcWfIEJvem1hbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiBEb21faHRtbFxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgWydhLCAnYl0gd29ya2VyID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2Qgb25lcnJvciA6ICgnc2VsZiB0LCBlcnJvckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tZXNzYWdlIDogKCdzZWxmIHQsICdiIG1lc3NhZ2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBvc3RNZXNzYWdlIDogJ2EgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGVybWluYXRlIDogdW5pdCBtZXRoXG4gIGVuZFxuXG5hbmQgZXJyb3JFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBtZXNzYWdlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbGVuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxpbmVubyA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29sbm8gOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVycm9yIDogVW5zYWZlLmFueSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgWydhXSBtZXNzYWdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgZGF0YSA6ICdhIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCB3b3JrZXIgPSBVbnNhZmUuZ2xvYmFsIyMuX1dvcmtlclxuXG5sZXQgY3JlYXRlIHNjcmlwdCA9IG5ldyVqcyB3b3JrZXIgKHN0cmluZyBzY3JpcHQpXG5cbmxldCBpbXBvcnRfc2NyaXB0cyBzY3JpcHRzIDogdW5pdCA9XG4gIGlmIFVuc2FmZS5nbG9iYWwjIy5pbXBvcnRTY3JpcHRzID09IHVuZGVmaW5lZFxuICB0aGVuIGludmFsaWRfYXJnIFwiV29ya2VyLmltcG9ydF9zY3JpcHRzIGlzIHVuZGVmaW5lZFwiO1xuICBVbnNhZmUuZnVuX2NhbGxcbiAgICBVbnNhZmUuZ2xvYmFsIyMuaW1wb3J0U2NyaXB0c1xuICAgIChBcnJheS5tYXAgKGZ1biBzIC0+IFVuc2FmZS5pbmplY3QgKHN0cmluZyBzKSkgKEFycmF5Lm9mX2xpc3Qgc2NyaXB0cykpXG5cbmxldCBzZXRfb25tZXNzYWdlIGhhbmRsZXIgPVxuICBpZiBVbnNhZmUuZ2xvYmFsIyMub25tZXNzYWdlID09IHVuZGVmaW5lZFxuICB0aGVuIGludmFsaWRfYXJnIFwiV29ya2VyLm9ubWVzc2FnZSBpcyB1bmRlZmluZWRcIjtcbiAgbGV0IGpzX2hhbmRsZXIgKGV2IDogJ2EgbWVzc2FnZUV2ZW50IEpzLnQpID0gaGFuZGxlciBldiMjLmRhdGEgaW5cbiAgVW5zYWZlLmdsb2JhbCMjLm9ubWVzc2FnZSA6PSB3cmFwX2NhbGxiYWNrIGpzX2hhbmRsZXJcblxubGV0IHBvc3RfbWVzc2FnZSBtc2cgPVxuICBpZiBVbnNhZmUuZ2xvYmFsIyMucG9zdE1lc3NhZ2UgPT0gdW5kZWZpbmVkXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJXb3JrZXIub25tZXNzYWdlIGlzIHVuZGVmaW5lZFwiO1xuICBVbnNhZmUuZ2xvYmFsIyNwb3N0TWVzc2FnZSBtc2dcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSmFjcXVlcy1QYXNjYWwgRGVwbGFpeFxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4hIEltcG9ydFxuXG50eXBlIHJlYWR5U3RhdGUgPVxuICB8IENPTk5FQ1RJTkdcbiAgfCBPUEVOXG4gIHwgQ0xPU0lOR1xuICB8IENMT1NFRFxuXG5jbGFzcyB0eXBlIFsnYV0gY2xvc2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgWydhXSBEb20uZXZlbnRcblxuICAgIG1ldGhvZCBjb2RlIDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFzb24gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2FzQ2xlYW4gOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBbJ2FdIG1lc3NhZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgWydhXSBEb20uZXZlbnRcblxuICAgIG1ldGhvZCBkYXRhIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRhdGFfYnVmZmVyIDogVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGF0YV9ibG9iIDogRmlsZS5ibG9iIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB3ZWJTb2NrZXQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCB1cmwgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IHJlYWR5U3RhdGUgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJ1ZmZlcmVkQW1vdW50IDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm9wZW4gOlxuICAgICAgKCdzZWxmIEpzLnQsICdzZWxmIERvbS5ldmVudCBKcy50KSBEb20uZXZlbnRfbGlzdGVuZXIgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmNsb3NlIDpcbiAgICAgICgnc2VsZiBKcy50LCAnc2VsZiBjbG9zZUV2ZW50IEpzLnQpIERvbS5ldmVudF9saXN0ZW5lciBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOlxuICAgICAgKCdzZWxmIEpzLnQsICdzZWxmIERvbS5ldmVudCBKcy50KSBEb20uZXZlbnRfbGlzdGVuZXIgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBleHRlbnNpb25zIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByb3RvY29sIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsb3NlIDogdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgY2xvc2Vfd2l0aENvZGUgOiBpbnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgY2xvc2Vfd2l0aENvZGVBbmRSZWFzb24gOiBpbnQgLT4gSnMuanNfc3RyaW5nIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgb25tZXNzYWdlIDpcbiAgICAgICgnc2VsZiBKcy50LCAnc2VsZiBtZXNzYWdlRXZlbnQgSnMudCkgRG9tLmV2ZW50X2xpc3RlbmVyIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgYmluYXJ5VHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgIG1ldGhvZCBzZW5kIDogSnMuanNfc3RyaW5nIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9idWZmZXIgOiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfYmxvYiA6IEZpbGUuYmxvYiBKcy50IC0+IHVuaXQgSnMubWV0aFxuICBlbmRcblxubGV0IHdlYlNvY2tldCA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fV2ViU29ja2V0XG5cbmxldCB3ZWJTb2NrZXRfd2l0aFByb3RvY29sID0gd2ViU29ja2V0XG5cbmxldCB3ZWJTb2NrZXRfd2l0aFByb3RvY29scyA9IHdlYlNvY2tldFxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3Qgd2ViU29ja2V0XG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEyIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbigqKiA1LjEgVHlwZXMgKilcblxudHlwZSBzaXplaSA9IGludFxuXG50eXBlIHNpemVpcHRyID0gaW50XG5cbnR5cGUgaW50cHRyID0gaW50XG5cbnR5cGUgdWludCA9IGludFxuXG50eXBlIGNsYW1wZiA9IGZsb2F0XG5cbnR5cGUgdm9pZFxuXG50eXBlIGNsZWFyQnVmZmVyTWFzayA9IGludFxuXG50eXBlIGJlZ2luTW9kZVxuXG50eXBlIGJsZW5kaW5nRmFjdG9yXG5cbnR5cGUgYmxlbmRNb2RlXG5cbnR5cGUgYnVmZmVyVGFyZ2V0XG5cbnR5cGUgYnVmZmVyVXNhZ2VcblxudHlwZSBjdWxsRmFjZU1vZGVcblxudHlwZSBkZXB0aEZ1bmN0aW9uXG5cbnR5cGUgZW5hYmxlQ2FwXG5cbnR5cGUgZXJyb3JDb2RlXG5cbnR5cGUgZnJvbnRGYWNlRGlyXG5cbnR5cGUgaGludFRhcmdldFxuXG50eXBlIGhpbnRNb2RlXG5cbnR5cGUgdGV4dHVyZVVuaXQgPSBpbnRcblxudHlwZSAnYSBwaXhlbFN0b3JlUGFyYW1cblxudHlwZSBzdGVuY2lsT3BcblxudHlwZSBmYlRhcmdldFxuXG50eXBlIGF0dGFjaG1lbnRQb2ludFxuXG50eXBlIHJiVGFyZ2V0XG5cbnR5cGUgdGV4VGFyZ2V0XG5cbnR5cGUgJ2EgcGFyYW1ldGVyXG5cbnR5cGUgJ2EgYnVmZmVyUGFyYW1ldGVyXG5cbnR5cGUgJ2EgdmVydGV4QXR0cmliUGFyYW1cblxudHlwZSB2ZXJ0ZXhBdHRyaWJQb2ludGVyUGFyYW1cblxudHlwZSAnYSBhdHRhY2hQYXJhbVxuXG50eXBlIGZyYW1lYnVmZmVyU3RhdHVzXG5cbnR5cGUgJ2EgcmVuZGVyYnVmZmVyUGFyYW1cblxudHlwZSBmb3JtYXRcblxudHlwZSBwaXhlbEZvcm1hdFxuXG50eXBlIHBpeGVsVHlwZVxuXG50eXBlICdhIHRleFBhcmFtXG5cbnR5cGUgZGF0YVR5cGVcblxudHlwZSBzaGFkZXJUeXBlXG5cbnR5cGUgJ2EgcHJvZ3JhbVBhcmFtXG5cbnR5cGUgJ2Egc2hhZGVyUGFyYW1cblxudHlwZSB0ZXh0dXJlRmlsdGVyXG5cbnR5cGUgd3JhcE1vZGVcblxudHlwZSB0ZXhGaWx0ZXJcblxudHlwZSB1bmlmb3JtVHlwZVxuXG50eXBlIGNvbG9yc3BhY2VDb252ZXJzaW9uXG5cbnR5cGUgc2hhZGVyUHJlY2lzaW9uVHlwZVxuXG50eXBlIG9iamVjdFR5cGVcblxuKCoqIDUuMiBXZWJHTENvbnRleHRBdHRyaWJ1dGVzICopXG5jbGFzcyB0eXBlIGNvbnRleHRBdHRyaWJ1dGVzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFscGhhIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBkZXB0aCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3RlbmNpbCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgYW50aWFsaWFzIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBwcmVtdWx0aXBsaWVkQWxwaGEgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgcHJlZmVyTG93UG93ZXJUb0hpZ2hQZXJmb3JtYW5jZSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA6IGJvb2wgdCBwcm9wXG4gIGVuZFxuXG5sZXQgZGVmYXVsdENvbnRleHRBdHRyaWJ1dGVzID1cbiAgSnMuVW5zYWZlLihcbiAgICBvYmpcbiAgICAgIFt8IFwiYWxwaGFcIiwgaW5qZWN0IF90cnVlXG4gICAgICAgOyBcImRlcHRoXCIsIGluamVjdCBfdHJ1ZVxuICAgICAgIDsgXCJzdGVuY2lsXCIsIGluamVjdCBfZmFsc2VcbiAgICAgICA7IFwiYW50aWFsaWFzXCIsIGluamVjdCBfdHJ1ZVxuICAgICAgIDsgXCJwcmVtdWx0aXBsaWVkQWxwaGFcIiwgaW5qZWN0IF9mYWxzZVxuICAgICAgIDsgXCJwcmVzZXJ2ZURyYXdpbmdCdWZmZXJcIiwgaW5qZWN0IF9mYWxzZVxuICAgICAgIDsgXCJwcmVmZXJMb3dQb3dlclRvSGlnaFBlcmZvcm1hbmNlXCIsIGluamVjdCBfZmFsc2VcbiAgICAgICA7IFwiZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdFwiLCBpbmplY3QgX2ZhbHNlXG4gICAgICB8XSlcblxudHlwZSBidWZmZXJcblxudHlwZSBmcmFtZWJ1ZmZlclxuXG50eXBlIHByb2dyYW1cblxudHlwZSByZW5kZXJidWZmZXJcblxudHlwZSBzaGFkZXJcblxudHlwZSB0ZXh0dXJlXG5cbnR5cGUgJ2EgdW5pZm9ybUxvY2F0aW9uXG5cbmNsYXNzIHR5cGUgYWN0aXZlSW5mbyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBzaXplIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBzaGFkZXJQcmVjaXNpb25Gb3JtYXQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcmFuZ2VNaW4gOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJhbmdlTWF4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmVjaXNpb24gOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSByZW5kZXJpbmdDb250ZXh0ID1cbiAgb2JqZWN0XG5cbiAgICAoKiogNS4xMy4xIEF0dHJpYnV0ZXMgKilcblxuICAgIG1ldGhvZCBjYW52YXMgOiBEb21faHRtbC5jYW52YXNFbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRyYXdpbmdCdWZmZXJXaWR0aCA6IHNpemVpIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkcmF3aW5nQnVmZmVySGVpZ2h0IDogc2l6ZWkgcmVhZG9ubHlfcHJvcFxuXG4gICAgKCoqIDUuMTMuMiBHZXR0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0ICopXG5cbiAgICBtZXRob2QgZ2V0Q29udGV4dEF0dHJpYnV0ZXMgOiBjb250ZXh0QXR0cmlidXRlcyB0IG1ldGhcblxuICAgICgqKiA1LjEzLjMgU2V0dGluZyBhbmQgZ2V0dGluZyBzdGF0ZSAqKVxuXG4gICAgbWV0aG9kIGFjdGl2ZVRleHR1cmUgOiB0ZXh0dXJlVW5pdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibGVuZENvbG9yIDogY2xhbXBmIC0+IGNsYW1wZiAtPiBjbGFtcGYgLT4gY2xhbXBmIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsZW5kRXF1YXRpb24gOiBibGVuZE1vZGUgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmxlbmRFcXVhdGlvblNlcGFyYXRlIDogYmxlbmRNb2RlIC0+IGJsZW5kTW9kZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibGVuZEZ1bmMgOiBibGVuZGluZ0ZhY3RvciAtPiBibGVuZGluZ0ZhY3RvciAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibGVuZEZ1bmNTZXBhcmF0ZSA6XG4gICAgICBibGVuZGluZ0ZhY3RvciAtPiBibGVuZGluZ0ZhY3RvciAtPiBibGVuZGluZ0ZhY3RvciAtPiBibGVuZGluZ0ZhY3RvciAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhckNvbG9yIDogY2xhbXBmIC0+IGNsYW1wZiAtPiBjbGFtcGYgLT4gY2xhbXBmIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyRGVwdGggOiBjbGFtcGYgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJTdGVuY2lsIDogaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbG9yTWFzayA6IGJvb2wgdCAtPiBib29sIHQgLT4gYm9vbCB0IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjdWxsRmFjZSA6IGN1bGxGYWNlTW9kZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZXB0aEZ1bmMgOiBkZXB0aEZ1bmN0aW9uIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlcHRoTWFzayA6IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZXB0aFJhbmdlIDogY2xhbXBmIC0+IGNsYW1wZiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkaXNhYmxlIDogZW5hYmxlQ2FwIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVuYWJsZSA6IGVuYWJsZUNhcCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmcm9udEZhY2UgOiBmcm9udEZhY2VEaXIgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UGFyYW1ldGVyIDogJ2EuICdhIHBhcmFtZXRlciAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RXJyb3IgOiBlcnJvckNvZGUgbWV0aFxuXG4gICAgbWV0aG9kIGhpbnQgOiBoaW50VGFyZ2V0IC0+IGhpbnRNb2RlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGlzRW5hYmxlZCA6IGVuYWJsZUNhcCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGxpbmVXaWR0aCA6IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHBpeGVsU3RvcmVpIDogJ2EuICdhIHBpeGVsU3RvcmVQYXJhbSAtPiAnYSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwb2x5Z29uT2Zmc2V0IDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2FtcGxlQ292ZXJhZ2UgOiBjbGFtcGYgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxGdW5jIDogZGVwdGhGdW5jdGlvbiAtPiBpbnQgLT4gdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsRnVuY1NlcGFyYXRlIDogY3VsbEZhY2VNb2RlIC0+IGRlcHRoRnVuY3Rpb24gLT4gaW50IC0+IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbE1hc2sgOiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxNYXNrU2VwYXJhdGUgOiBjdWxsRmFjZU1vZGUgLT4gdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsT3AgOiBzdGVuY2lsT3AgLT4gc3RlbmNpbE9wIC0+IHN0ZW5jaWxPcCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsT3BTZXBhcmF0ZSA6XG4gICAgICBjdWxsRmFjZU1vZGUgLT4gc3RlbmNpbE9wIC0+IHN0ZW5jaWxPcCAtPiBzdGVuY2lsT3AgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy40IFZpZXdpbmcgYW5kIGNsaXBwaW5nICopXG5cbiAgICBtZXRob2Qgc2Npc3NvciA6IGludCAtPiBpbnQgLT4gc2l6ZWkgLT4gc2l6ZWkgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgdmlld3BvcnQgOiBpbnQgLT4gaW50IC0+IHNpemVpIC0+IHNpemVpIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuNSBCdWZmZXIgb2JqZWN0cyAqKVxuXG4gICAgbWV0aG9kIGJpbmRCdWZmZXIgOiBidWZmZXJUYXJnZXQgLT4gYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmluZEJ1ZmZlcl8gOiBidWZmZXJUYXJnZXQgLT4gYnVmZmVyIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJ1ZmZlckRhdGFfY3JlYXRlIDogYnVmZmVyVGFyZ2V0IC0+IHNpemVpcHRyIC0+IGJ1ZmZlclVzYWdlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJ1ZmZlckRhdGEgOlxuICAgICAgYnVmZmVyVGFyZ2V0IC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdCAtPiBidWZmZXJVc2FnZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBidWZmZXJEYXRhX3JhdyA6XG4gICAgICBidWZmZXJUYXJnZXQgLT4gVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgdCAtPiBidWZmZXJVc2FnZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBidWZmZXJTdWJEYXRhIDpcbiAgICAgIGJ1ZmZlclRhcmdldCAtPiBpbnRwdHIgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJ1ZmZlclN1YkRhdGFfcmF3IDpcbiAgICAgIGJ1ZmZlclRhcmdldCAtPiBpbnRwdHIgLT4gVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVCdWZmZXIgOiBidWZmZXIgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlQnVmZmVyIDogYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QnVmZmVyUGFyYW1ldGVyIDogJ2EuIGJ1ZmZlclRhcmdldCAtPiAnYSBidWZmZXJQYXJhbWV0ZXIgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGlzQnVmZmVyIDogYnVmZmVyIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgICgqKiA1LjEzLjYgRnJhbWVidWZmZXIgb2JqZWN0cyAqKVxuXG4gICAgbWV0aG9kIGJpbmRGcmFtZWJ1ZmZlciA6IGZiVGFyZ2V0IC0+IGZyYW1lYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmluZEZyYW1lYnVmZmVyXyA6IGZiVGFyZ2V0IC0+IGZyYW1lYnVmZmVyIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNoZWNrRnJhbWVidWZmZXJTdGF0dXMgOiBmYlRhcmdldCAtPiBmcmFtZWJ1ZmZlclN0YXR1cyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlRnJhbWVidWZmZXIgOiBmcmFtZWJ1ZmZlciB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVGcmFtZWJ1ZmZlciA6IGZyYW1lYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZnJhbWVidWZmZXJSZW5kZXJidWZmZXIgOlxuICAgICAgZmJUYXJnZXQgLT4gYXR0YWNobWVudFBvaW50IC0+IHJiVGFyZ2V0IC0+IHJlbmRlcmJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZyYW1lYnVmZmVyVGV4dHVyZTJEIDpcbiAgICAgIGZiVGFyZ2V0IC0+IGF0dGFjaG1lbnRQb2ludCAtPiB0ZXhUYXJnZXQgLT4gdGV4dHVyZSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIgOlxuICAgICAgJ2EuIGZiVGFyZ2V0IC0+IGF0dGFjaG1lbnRQb2ludCAtPiAnYSBhdHRhY2hQYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgaXNGcmFtZWJ1ZmZlciA6IGZyYW1lYnVmZmVyIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgICgqKiA1LjEzLjcgUmVuZGVyYnVmZmVyIG9iamVjdHMgKilcblxuICAgIG1ldGhvZCBiaW5kUmVuZGVyYnVmZmVyIDogcmJUYXJnZXQgLT4gcmVuZGVyYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmluZFJlbmRlcmJ1ZmZlcl8gOiByYlRhcmdldCAtPiByZW5kZXJidWZmZXIgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUmVuZGVyYnVmZmVyIDogcmVuZGVyYnVmZmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVJlbmRlcmJ1ZmZlciA6IHJlbmRlcmJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlciA6ICdhLiByYlRhcmdldCAtPiAnYSByZW5kZXJidWZmZXJQYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgaXNSZW5kZXJidWZmZXIgOiByZW5kZXJidWZmZXIgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbmRlcmJ1ZmZlclN0b3JhZ2UgOiByYlRhcmdldCAtPiBmb3JtYXQgLT4gc2l6ZWkgLT4gc2l6ZWkgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy44IFRleHR1cmUgb2JqZWN0cyAqKVxuXG4gICAgbWV0aG9kIGJpbmRUZXh0dXJlIDogdGV4VGFyZ2V0IC0+IHRleHR1cmUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiaW5kVGV4dHVyZV8gOiB0ZXhUYXJnZXQgLT4gdGV4dHVyZSB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb21wcmVzc2VkVGV4SW1hZ2UyRCA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gaW50XG4gICAgICAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb3B5VGV4SW1hZ2UyRCA6XG4gICAgICB0ZXhUYXJnZXQgLT4gaW50IC0+IHBpeGVsRm9ybWF0IC0+IGludCAtPiBpbnQgLT4gc2l6ZWkgLT4gc2l6ZWkgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvcHlUZXhTdWJJbWFnZTJEIDpcbiAgICAgIHRleFRhcmdldCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IHNpemVpIC0+IHNpemVpIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVRleHR1cmUgOiB0ZXh0dXJlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVRleHR1cmUgOiB0ZXh0dXJlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2VuZXJhdGVNaXBtYXAgOiB0ZXhUYXJnZXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VGV4UGFyYW1ldGVyIDogdGV4VGFyZ2V0IC0+ICdhIHRleFBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBpc1RleHR1cmUgOiB0ZXh0dXJlIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX25ldyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiB2b2lkIG9wdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9mcm9tVmlldyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfZnJvbUltYWdlRGF0YSA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmltYWdlRGF0YSB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX2Zyb21JbWFnZSA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmltYWdlRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX2Zyb21DYW52YXMgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5jYW52YXNFbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfZnJvbVZpZGVvIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwudmlkZW9FbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoge1tcbiAgICAgICAgbWV0aG9kIHRleFBhcmFtZXRlcmYgOiB0ZXhUYXJnZXQgLT4gdGV4UGFyYW0gLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG4gICAgICAgXX1cbiAgICAqKVxuICAgIG1ldGhvZCB0ZXhQYXJhbWV0ZXJpIDogdGV4VGFyZ2V0IC0+ICdhIHRleFBhcmFtIC0+ICdhIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleFN1YkltYWdlMkRfZnJvbVZpZXcgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4U3ViSW1hZ2UyRF9mcm9tSW1hZ2VEYXRhIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuaW1hZ2VEYXRhIHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleFN1YkltYWdlMkRfZnJvbUltYWdlIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuaW1hZ2VFbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleFN1YkltYWdlMkRfZnJvbUNhbnZhcyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmNhbnZhc0VsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4U3ViSW1hZ2UyRF9mcm9tVmlkZW8gOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC52aWRlb0VsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy45IFByb2dyYW1zIGFuZCBTaGFkZXJzICopXG5cbiAgICBtZXRob2QgYXR0YWNoU2hhZGVyIDogcHJvZ3JhbSB0IC0+IHNoYWRlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJpbmRBdHRyaWJMb2NhdGlvbiA6IHByb2dyYW0gdCAtPiB1aW50IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbXBpbGVTaGFkZXIgOiBzaGFkZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVQcm9ncmFtIDogcHJvZ3JhbSB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTaGFkZXIgOiBzaGFkZXJUeXBlIC0+IHNoYWRlciB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVQcm9ncmFtIDogcHJvZ3JhbSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVNoYWRlciA6IHNoYWRlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRldGFjaFNoYWRlciA6IHByb2dyYW0gdCAtPiBzaGFkZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBdHRhY2hlZFNoYWRlcnMgOiBwcm9ncmFtIHQgLT4gc2hhZGVyIHQganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UHJvZ3JhbVBhcmFtZXRlciA6ICdhLiBwcm9ncmFtIHQgLT4gJ2EgcHJvZ3JhbVBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBnZXRQcm9ncmFtSW5mb0xvZyA6IHByb2dyYW0gdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2hhZGVyUGFyYW1ldGVyIDogJ2EuIHNoYWRlciB0IC0+ICdhIHNoYWRlclBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBnZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgOlxuICAgICAgc2hhZGVyVHlwZSAtPiBzaGFkZXJQcmVjaXNpb25UeXBlIC0+IHNoYWRlclByZWNpc2lvbkZvcm1hdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTaGFkZXJJbmZvTG9nIDogc2hhZGVyIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNoYWRlclNvdXJjZSA6IHNoYWRlciB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBpc1Byb2dyYW0gOiBwcm9ncmFtIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBpc1NoYWRlciA6IHNoYWRlciB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgbGlua1Byb2dyYW0gOiBwcm9ncmFtIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2hhZGVyU291cmNlIDogc2hhZGVyIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdXNlUHJvZ3JhbSA6IHByb2dyYW0gdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2YWxpZGF0ZVByb2dyYW0gOiBwcm9ncmFtIHQgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy4xMCBVbmlmb3JtcyBhbmQgYXR0cmlidXRlcyAqKVxuXG4gICAgbWV0aG9kIGRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSA6IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZW5hYmxlVmVydGV4QXR0cmliQXJyYXkgOiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEFjdGl2ZUF0dHJpYiA6IHByb2dyYW0gdCAtPiB1aW50IC0+IGFjdGl2ZUluZm8gdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QWN0aXZlVW5pZm9ybSA6IHByb2dyYW0gdCAtPiB1aW50IC0+IGFjdGl2ZUluZm8gdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QXR0cmliTG9jYXRpb24gOiBwcm9ncmFtIHQgLT4ganNfc3RyaW5nIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVbmlmb3JtIDogJ2EgJ2IuIHByb2dyYW0gdCAtPiAnYSB1bmlmb3JtTG9jYXRpb24gdCAtPiAnYiBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VW5pZm9ybUxvY2F0aW9uIDogJ2EuIHByb2dyYW0gdCAtPiBqc19zdHJpbmcgdCAtPiAnYSB1bmlmb3JtTG9jYXRpb24gdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VmVydGV4QXR0cmliIDogJ2EuIHVpbnQgLT4gJ2EgdmVydGV4QXR0cmliUGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGdldFZlcnRleEF0dHJpYk9mZnNldCA6IHVpbnQgLT4gdmVydGV4QXR0cmliUG9pbnRlclBhcmFtIC0+IHNpemVpcHRyIG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWYgOiBmbG9hdCB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWZ2X3R5cGVkIDpcbiAgICAgIGZsb2F0IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xZnYgOiBmbG9hdCB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xaSA6IGludCB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFpdl90eXBlZCA6XG4gICAgICBpbnQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xaXYgOiBpbnQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJmIDogWyBgdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yZnZfdHlwZWQgOlxuICAgICAgWyBgdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yZnYgOiBbIGB2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMmkgOiBbIGBpdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJpdiA6IFsgYGl2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJpdl90eXBlZCA6XG4gICAgICBbIGBpdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2YgOiBbIGB2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNmdl90eXBlZCA6XG4gICAgICBbIGB2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNmdiA6IFsgYHZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zaSA6IFsgYGl2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNpdiA6IFsgYGl2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNpdl90eXBlZCA6XG4gICAgICBbIGBpdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGYgOlxuICAgICAgWyBgdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00ZnZfdHlwZWQgOlxuICAgICAgWyBgdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00ZnYgOiBbIGB2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGkgOlxuICAgICAgWyBgaXZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRpdiA6IFsgYGl2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRpdl90eXBlZCA6XG4gICAgICBbIGBpdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4MmZ2IDpcbiAgICAgIFsgYG1hdDIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4MmZ2X3R5cGVkIDpcbiAgICAgIFsgYG1hdDIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDNmdiA6XG4gICAgICBbIGBtYXQzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDNmdl90eXBlZCA6XG4gICAgICBbIGBtYXQzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXg0ZnYgOlxuICAgICAgWyBgbWF0NCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXg0ZnZfdHlwZWQgOlxuICAgICAgWyBgbWF0NCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIxZiA6IHVpbnQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMWZ2IDogdWludCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjFmdl90eXBlZCA6IHVpbnQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMmYgOiB1aW50IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjJmdiA6IHVpbnQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIyZnZfdHlwZWQgOiB1aW50IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjNmIDogdWludCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIzZnYgOiB1aW50IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliM2Z2X3R5cGVkIDogdWludCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWI0ZiA6IHVpbnQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliNGZ2IDogdWludCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjRmdl90eXBlZCA6IHVpbnQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliUG9pbnRlciA6XG4gICAgICB1aW50IC0+IGludCAtPiBkYXRhVHlwZSAtPiBib29sIHQgLT4gc2l6ZWkgLT4gaW50cHRyIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMTEgV3JpdGluZyB0byB0aGUgZHJhd2luZyBidWZmZXIgKilcblxuICAgIG1ldGhvZCBjbGVhciA6IGNsZWFyQnVmZmVyTWFzayAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3QXJyYXlzIDogYmVnaW5Nb2RlIC0+IGludCAtPiBzaXplaSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3RWxlbWVudHMgOiBiZWdpbk1vZGUgLT4gc2l6ZWkgLT4gZGF0YVR5cGUgLT4gaW50cHRyIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbmlzaCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZsdXNoIDogdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy4xMiBSZWFkaW5nIGJhY2sgcGl4ZWxzICopXG5cbiAgICBtZXRob2QgcmVhZFBpeGVscyA6XG4gICAgICAgICBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMTMgRGV0ZWN0aW5nIGNvbnRleHQgbG9zdCBldmVudHMgKilcblxuICAgIG1ldGhvZCBpc0NvbnRleHRMb3N0IDogYm9vbCB0IG1ldGhcblxuICAgICgqKiA1LjEzLjE0IERldGVjdGluZyBhbmQgZW5hYmxpbmcgZXh0ZW5zaW9ucyAqKVxuXG4gICAgbWV0aG9kIGdldFN1cHBvcnRlZEV4dGVuc2lvbnMgOiBqc19zdHJpbmcgdCBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFeHRlbnNpb24gOiAnYS4ganNfc3RyaW5nIHQgLT4gJ2EgdCBvcHQgbWV0aFxuXG4gICAgKCogVW50eXBlZCEgKilcbiAgICAoKiogQ29uc3RhbnRzICopXG5cbiAgICBtZXRob2QgX0RFUFRIX0JVRkZFUl9CSVRfIDogY2xlYXJCdWZmZXJNYXNrIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CVUZGRVJfQklUXyA6IGNsZWFyQnVmZmVyTWFzayByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTE9SX0JVRkZFUl9CSVRfIDogY2xlYXJCdWZmZXJNYXNrIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9JTlRTIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORVMgOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FX0xPT1BfIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORV9TVFJJUF8gOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9UUklBTkdMRVMgOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9UUklBTkdMRV9TVFJJUF8gOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9UUklBTkdMRV9GQU5fIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfWkVSTyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TUkNfQ09MT1JfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfU1JDX0NPTE9SXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1JDX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX1NSQ19BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RTVF9BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19EU1RfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9EU1RfQ09MT1JfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfRFNUX0NPTE9SXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1JDX0FMUEhBX1NBVFVSQVRFXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlVOQ19BRERfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlVOQ19TVUJUUkFDVF8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09OU1RBTlRfQ09MT1JfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTlNUQU5UX0FMUEhBXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQV8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BUlJBWV9CVUZGRVJfIDogYnVmZmVyVGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRUxFTUVOVF9BUlJBWV9CVUZGRVJfIDogYnVmZmVyVGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RSRUFNX0RSQVdfIDogYnVmZmVyVXNhZ2UgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEFUSUNfRFJBV18gOiBidWZmZXJVc2FnZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RZTkFNSUNfRFJBV18gOiBidWZmZXJVc2FnZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZST05UIDogY3VsbEZhY2VNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkFDSyA6IGN1bGxGYWNlTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZST05UX0FORF9CQUNLXyA6IGN1bGxGYWNlTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NVTExfRkFDRV8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORCA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RJVEhFUiA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfVEVTVF8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9URVNUXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NDSVNTT1JfVEVTVF8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT0xZR09OX09GRlNFVF9GSUxMXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRV8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVfQ09WRVJBR0VfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTk9fRVJST1JfIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5WQUxJRF9FTlVNXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVkFMSURfVkFMVUVfIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5WQUxJRF9PUEVSQVRJT05fIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT1VUX09GX01FTU9SWV8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT05URVhUX0xPU1RfV0VCR0xfIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1cgOiBmcm9udEZhY2VEaXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DQ1cgOiBmcm9udEZhY2VEaXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ET05UX0NBUkVfIDogaGludE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GQVNURVNUIDogaGludE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OSUNFU1QgOiBoaW50TW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0dFTkVSQVRFX01JUE1BUF9ISU5UXyA6IGhpbnRUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9FUVVBVElPTl8gOiBibGVuZE1vZGUgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfRVFVQVRJT05fUkdCXyA6IGJsZW5kTW9kZSBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9FUVVBVElPTl9BTFBIQV8gOiBibGVuZE1vZGUgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfRFNUX1JHQl8gOiBibGVuZGluZ0ZhY3RvciBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9TUkNfUkdCXyA6IGJsZW5kaW5nRmFjdG9yIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0RTVF9BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9TUkNfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfQ09MT1JfIDogVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQVJSQVlfQlVGRkVSX0JJTkRJTkdfIDogYnVmZmVyIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfIDogYnVmZmVyIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NVTExfRkFDRV9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ESVRIRVJfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9URVNUX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1RFU1RfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0NJU1NPUl9URVNUX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPTFlHT05fT0ZGU0VUX0ZJTExfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORV9XSURUSF8gOiBmbG9hdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0VfIDogVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFXyA6IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NVTExfRkFDRV9NT0RFXyA6IGN1bGxGYWNlTW9kZSBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUk9OVF9GQUNFXyA6IGZyb250RmFjZURpciBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9SQU5HRV8gOiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9XUklURU1BU0tfIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0NMRUFSX1ZBTFVFXyA6IGZsb2F0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0ZVTkNfIDogZGVwdGhGdW5jdGlvbiBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0NMRUFSX1ZBTFVFXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0ZVTkNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfRkFJTF8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUxfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1JFRl8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9WQUxVRV9NQVNLXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1dSSVRFTUFTS18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX0ZVTkNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19GQUlMXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfUkVGXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTS18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX1dSSVRFTUFTS18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVklFV1BPUlQgOiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0NJU1NPUl9CT1hfIDogVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTE9SX0NMRUFSX1ZBTFVFXyA6IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTE9SX1dSSVRFTUFTS18gOiBib29sIHQganNfYXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfQUxJR05NRU5UX1BBUkFNIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BBQ0tfQUxJR05NRU5UXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVEVYVFVSRV9TSVpFXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVklFV1BPUlRfRElNU18gOiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1VCUElYRUxfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVEX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0dSRUVOX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMVUVfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUxQSEFfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT0xZR09OX09GRlNFVF9VTklUU18gOiBmbG9hdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT0xZR09OX09GRlNFVF9GQUNUT1JfIDogZmxvYXQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9CSU5ESU5HXzJEXyA6IHRleHR1cmUgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQXyA6IHRleHR1cmUgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFX0JVRkZFUlNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRVNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRV8gOiBmbG9hdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUXyA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTXyA6XG4gICAgICBUeXBlZF9hcnJheS51aW50MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0dFTkVSQVRFX01JUE1BUF9ISU5UX1BBUkFNXyA6IGhpbnRNb2RlIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JVRkZFUl9TSVpFXyA6IGludCBidWZmZXJQYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CVUZGRVJfVVNBR0VfIDogYnVmZmVyVXNhZ2UgYnVmZmVyUGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQllURSA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfQllURV9EVCA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0hPUlQgOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX1NIT1JUXyA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5UIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9JTlRfIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVCA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfQllURV8gOiBwaXhlbFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9TSE9SVF80XzRfNF80XyA6IHBpeGVsVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX1NIT1JUXzVfNV81XzFfIDogcGl4ZWxUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfU0hPUlRfNV82XzVfIDogcGl4ZWxUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUxQSEEgOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JHQiA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkdCQSA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTFVNSU5BTkNFIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MVU1JTkFOQ0VfQUxQSEFfIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0lOREVYXyA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfU1RFTkNJTF8gOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0NPTVBPTkVOVF8gOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQUdNRU5UX1NIQURFUl8gOiBzaGFkZXJUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX1NIQURFUl8gOiBzaGFkZXJUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1ZFUlRFWF9BVFRSSUJTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1ZBUllJTkdfVkVDVE9SU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NIQURFUl9UWVBFXyA6IHNoYWRlclR5cGUgc2hhZGVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERUxFVEVfU1RBVFVTXyA6IGJvb2wgdCBzaGFkZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTVBJTEVfU1RBVFVTXyA6IGJvb2wgdCBzaGFkZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFTEVURV9TVEFUVVNfUFJPRyA6IGJvb2wgdCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5LX1NUQVRVU18gOiBib29sIHQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkFMSURBVEVfU1RBVFVTXyA6IGJvb2wgdCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BVFRBQ0hFRF9TSEFERVJTXyA6IGludCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BQ1RJVkVfVU5JRk9STVNfIDogaW50IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FDVElWRV9BVFRSSUJVVEVTXyA6IGludCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT05fIDoganNfc3RyaW5nIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1VSUkVOVF9QUk9HUkFNXyA6IHByb2dyYW0gdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVORE9SIDoganNfc3RyaW5nIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSRVIgOiBqc19zdHJpbmcgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJTSU9OIDoganNfc3RyaW5nIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRV8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUNUSVZFX1RFWFRVUkVfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0JJTkRJTkdfIDogZnJhbWVidWZmZXIgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0JJTkRJTkdfIDogcmVuZGVyYnVmZmVyIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9SRU5ERVJCVUZGRVJfU0laRSA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ORVZFUiA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MRVNTIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0VRVUFMIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xFUVVBTCA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9HUkVBVEVSIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05PVEVRVUFMIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0dFUVVBTCA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BTFdBWVMgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfS0VFUCA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFUExBQ0UgOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTkNSIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVDUiA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVkVSVCA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOQ1JfV1JBUF8gOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERUNSX1dSQVBfIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfWkVST18gOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ORUFSRVNUIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORUFSIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVF8gOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FQVJfTUlQTUFQX05FQVJFU1RfIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTkVBUkVTVF9NSVBNQVBfTElORUFSXyA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVBUl9NSVBNQVBfTElORUFSXyA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfTUFHX0ZJTFRFUl8gOiB0ZXhGaWx0ZXIgdGV4UGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX01JTl9GSUxURVJfIDogdGV4RmlsdGVyIHRleFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9XUkFQX1NfIDogd3JhcE1vZGUgdGV4UGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX1dSQVBfVF8gOiB3cmFwTW9kZSB0ZXhQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05PTkVfT1QgOiBvYmplY3RUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9PVCA6IG9iamVjdFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfT1QgOiBvYmplY3RUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV8yRF8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUwIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTIgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUzIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFNCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTUgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU2IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFNyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTggOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU5IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTAgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxMSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTEyIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTMgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxNCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE1IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTYgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxNyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE4IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTkgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyMCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTIxIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjIgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyMyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI0IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjUgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyNiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI3IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjggOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyOSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTMwIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMzEgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFUEVBVCA6IHdyYXBNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ0xBTVBfVE9fRURHRV8gOiB3cmFwTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01JUlJPUkVEX1JFUEVBVF8gOiB3cmFwTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfVkVDMl8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX1ZFQzNfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9WRUM0XyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5UXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5UX1ZFQzJfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlRfVkVDM18gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVF9WRUM0XyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQk9PTF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JPT0xfVkVDMl8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JPT0xfVkVDM18gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JPT0xfVkVDNF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX01BVDJfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9NQVQzXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfTUFUNF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRVJfMkRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVSX0NVQkVfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRURfIDogYm9vbCB0IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFXyA6IGludCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFXyA6IGludCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRV8gOiBpbnQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRURfIDogYm9vbCB0IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSXyA6IHZlcnRleEF0dHJpYlBvaW50ZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkdfIDpcbiAgICAgIGJ1ZmZlciB0IG9wdCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NVUlJFTlRfVkVSVEVYX0FUVFJJQl8gOlxuICAgICAgVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MT1dfRkxPQVRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01FRElVTV9GTE9BVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSElHSF9GTE9BVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE9XX0lOVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUVESVVNX0lOVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSElHSF9JTlRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSIDogZmJUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVIgOiByYlRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JHQkE0IDogZm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkdCNV9BMV8gOiBmb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SR0I1NjUgOiBmb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9DT01QT05FTlQxNl8gOiBmb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0lOREVYOF8gOiBmb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfV0lEVEhfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0hFSUdIVF8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUXyA6IGZvcm1hdCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9SRURfU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV8gOiBvYmplY3RUeXBlIGF0dGFjaFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9SRU5ERVJCVUZGRVIgOlxuICAgICAgcmVuZGVyYnVmZmVyIHQgYXR0YWNoUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX1RFWFRVUkUgOlxuICAgICAgdGV4dHVyZSB0IGF0dGFjaFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMXyA6IGludCBhdHRhY2hQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFXyA6IGludCBhdHRhY2hQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTE9SX0FUVEFDSE1FTlQwXyA6IGF0dGFjaG1lbnRQb2ludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0FUVEFDSE1FTlRfIDogYXR0YWNobWVudFBvaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9BVFRBQ0hNRU5UXyA6IGF0dGFjaG1lbnRQb2ludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVF8gOiBhdHRhY2htZW50UG9pbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9DT01QTEVURV8gOiBmcmFtZWJ1ZmZlclN0YXR1cyByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVF8gOiBmcmFtZWJ1ZmZlclN0YXR1cyByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UXyA6IGZyYW1lYnVmZmVyU3RhdHVzIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TXyA6IGZyYW1lYnVmZmVyU3RhdHVzIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfIDogZnJhbWVidWZmZXJTdGF0dXMgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfRkxJUF9ZX1dFQkdMX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMX1BBUkFNIDpcbiAgICAgIGNvbG9yc3BhY2VDb252ZXJzaW9uIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05PTkUgOiBjb2xvcnNwYWNlQ29udmVyc2lvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JST1dTRVJfREVGQVVMVF9XRUJHTF8gOiBjb2xvcnNwYWNlQ29udmVyc2lvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19BTElHTk1FTlRfIDogaW50IHBpeGVsU3RvcmVQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19GTElQX1lfV0VCR0xfIDogYm9vbCB0IHBpeGVsU3RvcmVQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTF8gOiBib29sIHQgcGl4ZWxTdG9yZVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTF8gOiBpbnQgcGl4ZWxTdG9yZVBhcmFtIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqKiA1LjE0IFdlYkdMQ29udGV4dEV2ZW50ICopXG5cbmNsYXNzIHR5cGUgY29udGV4dEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFxuXG4gICAgbWV0aG9kIHN0YXR1c01lc3NhZ2UgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5tb2R1bGUgRXZlbnQgPSBzdHJ1Y3RcbiAgbGV0IHdlYmdsY29udGV4dGxvc3QgPSBEb21faHRtbC5FdmVudC5tYWtlIFwid2ViZ2xjb250ZXh0bG9zdFwiXG5cbiAgbGV0IHdlYmdsY29udGV4dHJlc3RvcmVkID0gRG9tX2h0bWwuRXZlbnQubWFrZSBcIndlYmdsY29udGV4dHJlc3RvcmVkXCJcblxuICBsZXQgd2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciA9IERvbV9odG1sLkV2ZW50Lm1ha2UgXCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yXCJcbmVuZFxuXG4oKioqKilcblxuY2xhc3MgdHlwZSBjYW52YXNFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGdldENvbnRleHQgOiBqc19zdHJpbmcgdCAtPiByZW5kZXJpbmdDb250ZXh0IHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDb250ZXh0XyA6IGpzX3N0cmluZyB0IC0+IGNvbnRleHRBdHRyaWJ1dGVzIHQgLT4gcmVuZGVyaW5nQ29udGV4dCB0IG9wdCBtZXRoXG4gIGVuZFxuXG5sZXQgZ2V0Q29udGV4dCAoYyA6IERvbV9odG1sLmNhbnZhc0VsZW1lbnQgdCkgPVxuICBsZXQgYyA6IGNhbnZhc0VsZW1lbnQgdCA9IEpzLlVuc2FmZS5jb2VyY2UgYyBpblxuICBsZXQgY3R4ID0gYyMjZ2V0Q29udGV4dCAoSnMuc3RyaW5nIFwid2ViZ2xcIikgaW5cbiAgaWYgT3B0LnRlc3QgY3R4IHRoZW4gY3R4IGVsc2UgYyAjIyAoZ2V0Q29udGV4dCAoSnMuc3RyaW5nIFwiZXhwZXJpbWVudGFsLXdlYmdsXCIpKVxuXG5sZXQgZ2V0Q29udGV4dFdpdGhBdHRyaWJ1dGVzIChjIDogRG9tX2h0bWwuY2FudmFzRWxlbWVudCB0KSBhdHRyaWJzID1cbiAgbGV0IGMgOiBjYW52YXNFbGVtZW50IHQgPSBKcy5VbnNhZmUuY29lcmNlIGMgaW5cbiAgbGV0IGN0eCA9IGMjI2dldENvbnRleHRfIChKcy5zdHJpbmcgXCJ3ZWJnbFwiKSBhdHRyaWJzIGluXG4gIGlmIE9wdC50ZXN0IGN0eCB0aGVuIGN0eCBlbHNlIGMjI2dldENvbnRleHRfIChKcy5zdHJpbmcgXCJleHBlcmltZW50YWwtd2ViZ2xcIikgYXR0cmlic1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBSYXBoYcOrbCBQcm91c3QsIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG50eXBlIHJlZ2V4cCA9IEpzLnJlZ0V4cCBKcy50XG5cbnR5cGUgcmVzdWx0ID0gSnMubWF0Y2hfcmVzdWx0IEpzLnRcblxubGV0IHJlZ2V4cCBzID0gbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgKEpzLmJ5dGVzdHJpbmcgcykgKEpzLnN0cmluZyBcImdcIilcblxubGV0IHJlZ2V4cF9jYXNlX2ZvbGQgcyA9IG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIChKcy5ieXRlc3RyaW5nIHMpIChKcy5zdHJpbmcgXCJnaVwiKVxuXG5sZXQgcmVnZXhwX3dpdGhfZmxhZyBzIGYgPVxuICBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyAoSnMuYnl0ZXN0cmluZyBzKSAoSnMuc3RyaW5nIChcImdcIiBeIGYpKVxuXG5sZXQgYmx1bnRfc3RyX2FycmF5X2dldCBhIGkgPVxuICBKcy50b19ieXRlc3RyaW5nIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgYSBpKSAoZnVuICgpIC0+IGFzc2VydCBmYWxzZSkpXG5cbmxldCBzdHJpbmdfbWF0Y2ggciBzIGkgPVxuICByIyMubGFzdEluZGV4IDo9IGk7XG4gIEpzLk9wdC50b19vcHRpb24gKEpzLk9wdC5tYXAgKHIjI2V4ZWMgKEpzLmJ5dGVzdHJpbmcgcykpIEpzLm1hdGNoX3Jlc3VsdClcblxubGV0IHNlYXJjaCByIHMgaSA9XG4gIHIjIy5sYXN0SW5kZXggOj0gaTtcbiAgSnMuT3B0LnRvX29wdGlvblxuICAgIChKcy5PcHQubWFwXG4gICAgICAgKHIjI2V4ZWMgKEpzLmJ5dGVzdHJpbmcgcykpXG4gICAgICAgKGZ1biByZXNfcHJlIC0+XG4gICAgICAgICBsZXQgcmVzID0gSnMubWF0Y2hfcmVzdWx0IHJlc19wcmUgaW5cbiAgICAgICAgIHJlcyMjLmluZGV4LCByZXMpKVxuXG5sZXQgc2VhcmNoX2ZvcndhcmQgPSBzZWFyY2hcblxubGV0IG1hdGNoZWRfc3RyaW5nIHIgPSBibHVudF9zdHJfYXJyYXlfZ2V0IHIgMFxuXG5sZXQgbWF0Y2hlZF9ncm91cCByIGkgPVxuICBKcy5PcHRkZWYudG9fb3B0aW9uIChKcy5PcHRkZWYubWFwIChKcy5hcnJheV9nZXQgciBpKSBKcy50b19ieXRlc3RyaW5nKVxuXG5sZXQgcXVvdGVfcmVwbF9yZSA9IG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIChKcy5zdHJpbmcgXCJbJF1cIikgKEpzLnN0cmluZyBcImdcIilcblxubGV0IHF1b3RlX3JlcGwgcyA9IChKcy5ieXRlc3RyaW5nIHMpIyNyZXBsYWNlIHF1b3RlX3JlcGxfcmUgKEpzLnN0cmluZyBcIiQkJCRcIilcblxubGV0IGdsb2JhbF9yZXBsYWNlIHIgcyBzX2J5ID1cbiAgciMjLmxhc3RJbmRleCA6PSAwO1xuICBKcy50b19ieXRlc3RyaW5nIChKcy5ieXRlc3RyaW5nIHMpICMjIChyZXBsYWNlIHIgKHF1b3RlX3JlcGwgc19ieSkpXG5cbmxldCByZXBsYWNlX2ZpcnN0IHIgcyBzX2J5ID1cbiAgbGV0IGZsYWdzID1cbiAgICBtYXRjaCBKcy50b19ib29sIHIjIy5pZ25vcmVDYXNlLCBKcy50b19ib29sIHIjIy5tdWx0aWxpbmUgd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlIC0+IEpzLnN0cmluZyBcIlwiXG4gICAgfCBmYWxzZSwgdHJ1ZSAtPiBKcy5zdHJpbmcgXCJtXCJcbiAgICB8IHRydWUsIGZhbHNlIC0+IEpzLnN0cmluZyBcImlcIlxuICAgIHwgdHJ1ZSwgdHJ1ZSAtPiBKcy5zdHJpbmcgXCJtaVwiXG4gIGluXG4gIGxldCByJyA9IG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIHIjIy5zb3VyY2UgZmxhZ3MgaW5cbiAgSnMudG9fYnl0ZXN0cmluZyAoSnMuYnl0ZXN0cmluZyBzKSAjIyAocmVwbGFjZSByJyAocXVvdGVfcmVwbCBzX2J5KSlcblxubGV0IGxpc3Rfb2ZfanNfYXJyYXkgYSA9XG4gIGxldCByZWMgYXV4IGFjY3UgaWR4ID1cbiAgICBpZiBpZHggPCAwIHRoZW4gYWNjdSBlbHNlIGF1eCAoYmx1bnRfc3RyX2FycmF5X2dldCBhIGlkeCA6OiBhY2N1KSAoaWR4IC0gMSlcbiAgaW5cbiAgYXV4IFtdIChhIyMubGVuZ3RoIC0gMSlcblxubGV0IHNwbGl0IHIgcyA9XG4gIHIjIy5sYXN0SW5kZXggOj0gMDtcbiAgbGlzdF9vZl9qc19hcnJheSAoSnMuc3RyX2FycmF5IChKcy5ieXRlc3RyaW5nIHMpICMjIChzcGxpdF9yZWdFeHAgcikpXG5cbmxldCBib3VuZGVkX3NwbGl0IHIgcyBpID1cbiAgciMjLmxhc3RJbmRleCA6PSAwO1xuICBsaXN0X29mX2pzX2FycmF5IChKcy5zdHJfYXJyYXkgKEpzLmJ5dGVzdHJpbmcgcykgIyMgKHNwbGl0X3JlZ0V4cExpbWl0ZWQgciBpKSlcblxuKCogTW9yZSBjb25zdHJ1Y3RvcnMgKilcblxubGV0IHF1b3RlX3JlID0gcmVnZXhwIFwiW1xcXFxdWygpXFxcXFxcXFx8KyouP3t9XiRdXCJcblxubGV0IHF1b3RlIHMgPSBKcy50b19ieXRlc3RyaW5nIChKcy5ieXRlc3RyaW5nIHMpICMjIChyZXBsYWNlIHF1b3RlX3JlIChKcy5zdHJpbmcgXCJcXFxcJCZcIikpXG5cbmxldCByZWdleHBfc3RyaW5nIHMgPSByZWdleHAgKHF1b3RlIHMpXG5cbmxldCByZWdleHBfc3RyaW5nX2Nhc2VfZm9sZCBzID0gcmVnZXhwX2Nhc2VfZm9sZCAocXVvdGUgcylcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmFwaGHDq2wgUHJvdXN0XG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG4oKiBVcmwgdGFtcGVyaW5nLiAqKVxuXG5sZXQgc3BsaXQgYyBzID0gSnMuc3RyX2FycmF5IChzIyNzcGxpdCAoSnMuc3RyaW5nIChTdHJpbmcubWFrZSAxIGMpKSlcblxubGV0IHNwbGl0XzIgYyBzID1cbiAgbGV0IGluZGV4ID0gcyMjaW5kZXhPZiAoSnMuc3RyaW5nIChTdHJpbmcubWFrZSAxIGMpKSBpblxuICBpZiBpbmRleCA8IDAgdGhlbiBKcy51bmRlZmluZWQgZWxzZSBKcy5kZWYgKHMjI3NsaWNlIDAgaW5kZXgsIHMjI3NsaWNlX2VuZCAoaW5kZXggKyAxKSlcblxuZXhjZXB0aW9uIExvY2FsX2V4blxuXG5sZXQgaW50ZXJydXB0ICgpID0gcmFpc2UgTG9jYWxfZXhuXG5cbigqIHVybCAoQUtBIHBlcmNlbnQpIGVuY29kaW5nL2RlY29kaW5nICopXG5cbmxldCBwbHVzX3JlID0gUmVnZXhwLnJlZ2V4cF9zdHJpbmcgXCIrXCJcblxubGV0IGVzY2FwZV9wbHVzIHMgPSBSZWdleHAuZ2xvYmFsX3JlcGxhY2UgcGx1c19yZSBzIFwiJTJCXCJcblxubGV0IHVuZXNjYXBlX3BsdXMgcyA9IFJlZ2V4cC5nbG9iYWxfcmVwbGFjZSBwbHVzX3JlIHMgXCIgXCJcblxubGV0IHBsdXNfcmVfanNfc3RyaW5nID0gbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgKEpzLnN0cmluZyBcIlxcXFwrXCIpIChKcy5zdHJpbmcgXCJnXCIpXG5cbmxldCB1bmVzY2FwZV9wbHVzX2pzX3N0cmluZyBzID1cbiAgcGx1c19yZV9qc19zdHJpbmcjIy5sYXN0SW5kZXggOj0gMDtcbiAgcyMjcmVwbGFjZSBwbHVzX3JlX2pzX3N0cmluZyAoSnMuc3RyaW5nIFwiIFwiKVxuXG5sZXQgdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgcyA9XG4gIEpzLnRvX2J5dGVzdHJpbmcgKEpzLnVuZXNjYXBlICh1bmVzY2FwZV9wbHVzX2pzX3N0cmluZyBzKSlcblxubGV0IHVybGRlY29kZSBzID0gSnMudG9fYnl0ZXN0cmluZyAoSnMudW5lc2NhcGUgKEpzLmJ5dGVzdHJpbmcgKHVuZXNjYXBlX3BsdXMgcykpKVxuXG4oKmxldCB1cmxlbmNvZGVfanNfc3RyaW5nX3N0cmluZyBzID1cbiAgSnMudG9fYnl0ZXN0cmluZyAoSnMuZXNjYXBlIHMpKilcblxubGV0IHVybGVuY29kZSA/KHdpdGhfcGx1cyA9IHRydWUpIHMgPVxuICBpZiB3aXRoX3BsdXNcbiAgdGhlbiBlc2NhcGVfcGx1cyAoSnMudG9fYnl0ZXN0cmluZyAoSnMuZXNjYXBlIChKcy5ieXRlc3RyaW5nIHMpKSlcbiAgZWxzZSBKcy50b19ieXRlc3RyaW5nIChKcy5lc2NhcGUgKEpzLmJ5dGVzdHJpbmcgcykpXG5cbnR5cGUgaHR0cF91cmwgPVxuICB7IGh1X2hvc3QgOiBzdHJpbmcgICgqKiBUaGUgaG9zdCBwYXJ0IG9mIHRoZSB1cmwuICopXG4gIDsgaHVfcG9ydCA6IGludCAgKCoqIFRoZSBwb3J0IGZvciB0aGUgY29ubmVjdGlvbiBpZiBhbnkuICopXG4gIDsgaHVfcGF0aCA6IHN0cmluZyBsaXN0ICAoKiogVGhlIHBhdGggc3BsaXQgb24gWycvJ10gY2hhcmFjdGVycy4gKilcbiAgOyBodV9wYXRoX3N0cmluZyA6IHN0cmluZyAgKCoqIFRoZSBvcmlnaW5hbCBlbnRpcmUgcGF0aC4gKilcbiAgOyBodV9hcmd1bWVudHMgOiAoc3RyaW5nICogc3RyaW5nKSBsaXN0XG4gICAgICAgICgqKiBBcmd1bWVudHMgYXMgYSBmaWVsZC12YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRpb24gbGlzdC4qKVxuICA7IGh1X2ZyYWdtZW50IDogc3RyaW5nICAoKiogVGhlIGZyYWdtZW50IHBhcnQgKGFmdGVyIHRoZSBbJyMnXSBjaGFyYWN0ZXIpLiAqKVxuICB9XG4oKiogVGhlIHR5cGUgZm9yIEhUVFAgdXJsLiAqKVxuXG50eXBlIGZpbGVfdXJsID1cbiAgeyBmdV9wYXRoIDogc3RyaW5nIGxpc3RcbiAgOyBmdV9wYXRoX3N0cmluZyA6IHN0cmluZ1xuICA7IGZ1X2FyZ3VtZW50cyA6IChzdHJpbmcgKiBzdHJpbmcpIGxpc3RcbiAgOyBmdV9mcmFnbWVudCA6IHN0cmluZ1xuICB9XG4oKiogVGhlIHR5cGUgZm9yIGxvY2FsIGZpbGUgdXJscy4gKilcblxudHlwZSB1cmwgPVxuICB8IEh0dHAgb2YgaHR0cF91cmxcbiAgfCBIdHRwcyBvZiBodHRwX3VybFxuICB8IEZpbGUgb2YgZmlsZV91cmxcbiAgICAgICgqKiBUaGUgdHlwZSBmb3IgdXJscy4gW0ZpbGVdIGlzIGZvciBsb2NhbCBmaWxlcyBhbmQgW0V4b3RpYyBzXSBpcyBmb3JcbiAgICB1bmtub3duL3Vuc3VwcG9ydGVkIHByb3RvY29scy4gKilcblxuZXhjZXB0aW9uIE5vdF9hbl9odHRwX3Byb3RvY29sXG5cbmxldCBpc19zZWN1cmUgcHJvdF9zdHJpbmcgPVxuICBtYXRjaCBKcy50b19ieXRlc3RyaW5nIHByb3Rfc3RyaW5nIyN0b0xvd2VyQ2FzZSB3aXRoXG4gIHwgXCJodHRwczpcIiB8IFwiaHR0cHNcIiAtPiB0cnVlXG4gIHwgXCJodHRwOlwiIHwgXCJodHRwXCIgLT4gZmFsc2VcbiAgfCBcImZpbGU6XCIgfCBcImZpbGVcIiB8IF8gLT4gcmFpc2UgTm90X2FuX2h0dHBfcHJvdG9jb2xcblxuKCogcG9ydCBudW1iZXIgKilcbmxldCBkZWZhdWx0X2h0dHBfcG9ydCA9IDgwXG5cbmxldCBkZWZhdWx0X2h0dHBzX3BvcnQgPSA0NDNcblxuKCogcGF0aCAqKVxubGV0IHBhdGhfb2ZfcGF0aF9zdHJpbmcgcyA9XG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGxldCBqID0gdHJ5IFN0cmluZy5pbmRleF9mcm9tIHMgaSAnLycgd2l0aCBOb3RfZm91bmQgLT4gbCBpblxuICAgIGxldCB3b3JkID0gU3RyaW5nLnN1YiBzIGkgKGogLSBpKSBpblxuICAgIGlmIGogPj0gbCB0aGVuIFsgd29yZCBdIGVsc2Ugd29yZCA6OiBhdXggKGogKyAxKVxuICBpblxuICBtYXRjaCBhdXggMCB3aXRoXG4gIHwgWyBcIlwiIF0gLT4gW11cbiAgfCBbIFwiXCI7IFwiXCIgXSAtPiBbIFwiXCIgXVxuICB8IGEgLT4gYVxuXG4oKiBBcmd1bWVudHMgKilcbmxldCBlbmNvZGVfYXJndW1lbnRzIGwgPVxuICBTdHJpbmcuY29uY2F0IFwiJlwiIChMaXN0Lm1hcCAoZnVuIChuLCB2KSAtPiB1cmxlbmNvZGUgbiBeIFwiPVwiIF4gdXJsZW5jb2RlIHYpIGwpXG5cbmxldCBkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZyBzID1cbiAgbGV0IGFyciA9IHNwbGl0ICcmJyBzIGluXG4gIGxldCBsZW4gPSBhcnIjIy5sZW5ndGggaW5cbiAgbGV0IG5hbWVfdmFsdWVfc3BsaXQgcyA9IHNwbGl0XzIgJz0nIHMgaW5cbiAgbGV0IHJlYyBhdXggYWNjIGlkeCA9XG4gICAgaWYgaWR4IDwgMFxuICAgIHRoZW4gYWNjXG4gICAgZWxzZVxuICAgICAgdHJ5XG4gICAgICAgIGF1eFxuICAgICAgICAgIChKcy5PcHRkZWYuY2FzZSAoSnMuYXJyYXlfZ2V0IGFyciBpZHgpIGludGVycnVwdCAoZnVuIHMgLT5cbiAgICAgICAgICAgICAgIEpzLk9wdGRlZi5jYXNlIChuYW1lX3ZhbHVlX3NwbGl0IHMpIGludGVycnVwdCAoZnVuICh4LCB5KSAtPlxuICAgICAgICAgICAgICAgICAgIGxldCBnZXQgPSB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBpblxuICAgICAgICAgICAgICAgICAgIGdldCB4LCBnZXQgeSkpXG4gICAgICAgICAgOjogYWNjKVxuICAgICAgICAgIChwcmVkIGlkeClcbiAgICAgIHdpdGggTG9jYWxfZXhuIC0+IGF1eCBhY2MgKHByZWQgaWR4KVxuICBpblxuICBhdXggW10gKGxlbiAtIDEpXG5cbmxldCBkZWNvZGVfYXJndW1lbnRzIHMgPSBkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZyAoSnMuYnl0ZXN0cmluZyBzKVxuXG5sZXQgdXJsX3JlID1cbiAgbmV3JWpzIEpzLnJlZ0V4cFxuICAgIChKcy5ieXRlc3RyaW5nXG4gICAgICAgXCJeKFtIaF1bVHRdW1R0XVtQcF1bU3NdPyk6Ly8oWzAtOWEtekEtWi4tXSt8XFxcXFtbMC05YS16QS1aLi1dK1xcXFxdfFxcXFxbWzAtOUEtRmEtZjouXStcXFxcXSk/KDooWzAtOV0rKSk/KC8oW15cXFxcPyNdKikoXFxcXD8oW14jXSopKT8oIyguKikpPyk/JFwiKVxuXG5sZXQgZmlsZV9yZSA9XG4gIG5ldyVqcyBKcy5yZWdFeHBcbiAgICAoSnMuYnl0ZXN0cmluZyBcIl4oW0ZmXVtJaV1bTGxdW0VlXSk6Ly8oW15cXFxcPyNdKikoXFxcXD8oW14jXSopKT8oIyguKikpPyRcIilcblxubGV0IHVybF9vZl9qc19zdHJpbmcgcyA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKHVybF9yZSMjZXhlYyBzKVxuICAgIChmdW4gKCkgLT5cbiAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgIChmaWxlX3JlIyNleGVjIHMpXG4gICAgICAgIChmdW4gKCkgLT4gTm9uZSlcbiAgICAgICAgKGZ1biBoYW5kbGUgLT5cbiAgICAgICAgICBsZXQgcmVzID0gSnMubWF0Y2hfcmVzdWx0IGhhbmRsZSBpblxuICAgICAgICAgIGxldCBwYXRoX3N0ciA9XG4gICAgICAgICAgICB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyAyKSBpbnRlcnJ1cHQpXG4gICAgICAgICAgaW5cbiAgICAgICAgICBTb21lXG4gICAgICAgICAgICAoRmlsZVxuICAgICAgICAgICAgICAgeyBmdV9wYXRoID0gcGF0aF9vZl9wYXRoX3N0cmluZyBwYXRoX3N0clxuICAgICAgICAgICAgICAgOyBmdV9wYXRoX3N0cmluZyA9IHBhdGhfc3RyXG4gICAgICAgICAgICAgICA7IGZ1X2FyZ3VtZW50cyA9XG4gICAgICAgICAgICAgICAgICAgZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDQpIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSlcbiAgICAgICAgICAgICAgIDsgZnVfZnJhZ21lbnQgPVxuICAgICAgICAgICAgICAgICAgIEpzLnRvX2J5dGVzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDYpIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSlcbiAgICAgICAgICAgICAgIH0pKSlcbiAgICAoZnVuIGhhbmRsZSAtPlxuICAgICAgbGV0IHJlcyA9IEpzLm1hdGNoX3Jlc3VsdCBoYW5kbGUgaW5cbiAgICAgIGxldCBzc2wgPSBpc19zZWN1cmUgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgMSkgaW50ZXJydXB0KSBpblxuICAgICAgbGV0IHBvcnRfb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgICAgICAgfCBcIlwiIC0+IGlmIHNzbCB0aGVuIDQ0MyBlbHNlIDgwXG4gICAgICAgIHwgcyAtPiBpbnRfb2Zfc3RyaW5nIHNcbiAgICAgIGluXG4gICAgICBsZXQgcGF0aF9zdHIgPVxuICAgICAgICB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZ1xuICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDYpIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSlcbiAgICAgIGluXG4gICAgICBsZXQgdXJsID1cbiAgICAgICAgeyBodV9ob3N0ID1cbiAgICAgICAgICAgIHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDIpIGludGVycnVwdClcbiAgICAgICAgOyBodV9wb3J0ID1cbiAgICAgICAgICAgIHBvcnRfb2Zfc3RyaW5nXG4gICAgICAgICAgICAgIChKcy50b19ieXRlc3RyaW5nXG4gICAgICAgICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDQpIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSkpXG4gICAgICAgIDsgaHVfcGF0aCA9IHBhdGhfb2ZfcGF0aF9zdHJpbmcgcGF0aF9zdHJcbiAgICAgICAgOyBodV9wYXRoX3N0cmluZyA9IHBhdGhfc3RyXG4gICAgICAgIDsgaHVfYXJndW1lbnRzID1cbiAgICAgICAgICAgIGRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nXG4gICAgICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDgpIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSlcbiAgICAgICAgOyBodV9mcmFnbWVudCA9XG4gICAgICAgICAgICB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZ1xuICAgICAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyAxMCkgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKVxuICAgICAgICB9XG4gICAgICBpblxuICAgICAgU29tZSAoaWYgc3NsIHRoZW4gSHR0cHMgdXJsIGVsc2UgSHR0cCB1cmwpKVxuXG5sZXQgdXJsX29mX3N0cmluZyBzID0gdXJsX29mX2pzX3N0cmluZyAoSnMuYnl0ZXN0cmluZyBzKVxuXG5sZXQgc3RyaW5nX29mX3VybCA9IGZ1bmN0aW9uXG4gIHwgRmlsZSB7IGZ1X3BhdGggPSBwYXRoOyBmdV9hcmd1bWVudHMgPSBhcmdzOyBmdV9mcmFnbWVudCA9IGZyYWc7IF8gfSAtPiAoXG4gICAgICBcImZpbGU6Ly9cIlxuICAgICAgXiBTdHJpbmcuY29uY2F0IFwiL1wiIChMaXN0Lm1hcCAoZnVuIHggLT4gdXJsZW5jb2RlIHgpIHBhdGgpXG4gICAgICBeIChtYXRjaCBhcmdzIHdpdGhcbiAgICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICAgIHwgbCAtPiBcIj9cIiBeIGVuY29kZV9hcmd1bWVudHMgbClcbiAgICAgIF5cbiAgICAgIG1hdGNoIGZyYWcgd2l0aFxuICAgICAgfCBcIlwiIC0+IFwiXCJcbiAgICAgIHwgcyAtPiBcIiNcIiBeIHVybGVuY29kZSBzKVxuICB8IEh0dHBcbiAgICAgIHsgaHVfaG9zdCA9IGhvc3RcbiAgICAgIDsgaHVfcG9ydCA9IHBvcnRcbiAgICAgIDsgaHVfcGF0aCA9IHBhdGhcbiAgICAgIDsgaHVfYXJndW1lbnRzID0gYXJnc1xuICAgICAgOyBodV9mcmFnbWVudCA9IGZyYWdcbiAgICAgIDsgX1xuICAgICAgfSAtPiAoXG4gICAgICBcImh0dHA6Ly9cIlxuICAgICAgXiB1cmxlbmNvZGUgaG9zdFxuICAgICAgXiAobWF0Y2ggcG9ydCB3aXRoXG4gICAgICAgIHwgODAgLT4gXCJcIlxuICAgICAgICB8IG4gLT4gXCI6XCIgXiBzdHJpbmdfb2ZfaW50IG4pXG4gICAgICBeIFwiL1wiXG4gICAgICBeIFN0cmluZy5jb25jYXQgXCIvXCIgKExpc3QubWFwIChmdW4geCAtPiB1cmxlbmNvZGUgeCkgcGF0aClcbiAgICAgIF4gKG1hdGNoIGFyZ3Mgd2l0aFxuICAgICAgICB8IFtdIC0+IFwiXCJcbiAgICAgICAgfCBsIC0+IFwiP1wiIF4gZW5jb2RlX2FyZ3VtZW50cyBsKVxuICAgICAgXlxuICAgICAgbWF0Y2ggZnJhZyB3aXRoXG4gICAgICB8IFwiXCIgLT4gXCJcIlxuICAgICAgfCBzIC0+IFwiI1wiIF4gdXJsZW5jb2RlIHMpXG4gIHwgSHR0cHNcbiAgICAgIHsgaHVfaG9zdCA9IGhvc3RcbiAgICAgIDsgaHVfcG9ydCA9IHBvcnRcbiAgICAgIDsgaHVfcGF0aCA9IHBhdGhcbiAgICAgIDsgaHVfYXJndW1lbnRzID0gYXJnc1xuICAgICAgOyBodV9mcmFnbWVudCA9IGZyYWdcbiAgICAgIDsgX1xuICAgICAgfSAtPiAoXG4gICAgICBcImh0dHBzOi8vXCJcbiAgICAgIF4gdXJsZW5jb2RlIGhvc3RcbiAgICAgIF4gKG1hdGNoIHBvcnQgd2l0aFxuICAgICAgICB8IDQ0MyAtPiBcIlwiXG4gICAgICAgIHwgbiAtPiBcIjpcIiBeIHN0cmluZ19vZl9pbnQgbilcbiAgICAgIF4gXCIvXCJcbiAgICAgIF4gU3RyaW5nLmNvbmNhdCBcIi9cIiAoTGlzdC5tYXAgKGZ1biB4IC0+IHVybGVuY29kZSB4KSBwYXRoKVxuICAgICAgXiAobWF0Y2ggYXJncyB3aXRoXG4gICAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgICB8IGwgLT4gXCI/XCIgXiBlbmNvZGVfYXJndW1lbnRzIGwpXG4gICAgICBeXG4gICAgICBtYXRjaCBmcmFnIHdpdGhcbiAgICAgIHwgXCJcIiAtPiBcIlwiXG4gICAgICB8IHMgLT4gXCIjXCIgXiB1cmxlbmNvZGUgcylcblxubW9kdWxlIEN1cnJlbnQgPSBzdHJ1Y3RcbiAgbGV0IGwgPVxuICAgIGlmIEpzLk9wdGRlZi50ZXN0IChKcy5PcHRkZWYucmV0dXJuIERvbV9odG1sLndpbmRvdyMjLmxvY2F0aW9uKVxuICAgIHRoZW4gRG9tX2h0bWwud2luZG93IyMubG9jYXRpb25cbiAgICBlbHNlXG4gICAgICBsZXQgZW1wdHkgPSBKcy5zdHJpbmcgXCJcIiBpblxuICAgICAgb2JqZWN0JWpzXG4gICAgICAgIHZhbCBtdXRhYmxlIGhyZWYgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIHByb3RvY29sID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBob3N0ID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBob3N0bmFtZSA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgcG9ydCA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgcGF0aG5hbWUgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIHNlYXJjaCA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgaGFzaCA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG9yaWdpbiA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICAgIG1ldGhvZCByZWxvYWQgPSAoKVxuXG4gICAgICAgIG1ldGhvZCByZXBsYWNlIF8gPSAoKVxuXG4gICAgICAgIG1ldGhvZCBhc3NpZ24gXyA9ICgpXG4gICAgICBlbmRcblxuICBsZXQgaG9zdCA9IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIGwjIy5ob3N0bmFtZVxuXG4gIGxldCBwcm90b2NvbCA9IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIGwjIy5wcm90b2NvbFxuXG4gIGxldCBwb3J0ID1cbiAgICAoZnVuICgpIC0+XG4gICAgICB0cnkgU29tZSAoaW50X29mX3N0cmluZyAoSnMudG9fYnl0ZXN0cmluZyBsIyMucG9ydCkpIHdpdGggRmFpbHVyZSBfIC0+IE5vbmUpXG4gICAgICAoKVxuXG4gIGxldCBwYXRoX3N0cmluZyA9IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIGwjIy5wYXRobmFtZVxuXG4gIGxldCBwYXRoID0gcGF0aF9vZl9wYXRoX3N0cmluZyBwYXRoX3N0cmluZ1xuXG4gIGxldCBhcmd1bWVudHMgPVxuICAgIGRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nXG4gICAgICAoaWYgbCMjLnNlYXJjaCMjY2hhckF0IDAgPT0gSnMuc3RyaW5nIFwiP1wiXG4gICAgICB0aGVuIGwjIy5zZWFyY2gjI3NsaWNlX2VuZCAxXG4gICAgICBlbHNlIGwjIy5zZWFyY2gpXG5cbiAgbGV0IGdldF9mcmFnbWVudCAoKSA9XG4gICAgKCogbG9jYXRpb24uaGFzaCBkb2Vzbid0IGhhdmUgdGhlIHNhbWUgYmVoYXZpb3IgZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyXG4gICAgICAgRmlyZWZveCBidWcgOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00ODMzMDQgKilcbiAgICAoKiBsZXQgcyA9IEpzLnRvX2J5dGVzdHJpbmcgKGwjI2hhc2gpIGluICopXG4gICAgKCogaWYgU3RyaW5nLmxlbmd0aCBzID4gMCAmJiBzLlswXSA9ICcjJyAqKVxuICAgICgqIHRoZW4gU3RyaW5nLnN1YiBzIDEgKFN0cmluZy5sZW5ndGggcyAtIDEpICopXG4gICAgKCogZWxzZSBzOyAqKVxuICAgIEpzLk9wdC5jYXNlXG4gICAgICAobCMjLmhyZWYjI19tYXRjaCAobmV3JWpzIEpzLnJlZ0V4cCAoSnMuc3RyaW5nIFwiIyguKilcIikpKVxuICAgICAgKGZ1biAoKSAtPiBcIlwiKVxuICAgICAgKGZ1biByZXMgLT5cbiAgICAgICAgbGV0IHJlcyA9IEpzLm1hdGNoX3Jlc3VsdCByZXMgaW5cbiAgICAgICAgSnMudG9fc3RyaW5nIChKcy5VbnNhZmUuZ2V0IHJlcyAxKSlcblxuICBsZXQgc2V0X2ZyYWdtZW50IHMgPSBsIyMuaGFzaCA6PSBKcy5ieXRlc3RyaW5nICh1cmxlbmNvZGUgcylcblxuICBsZXQgZ2V0ICgpID0gdXJsX29mX2pzX3N0cmluZyBsIyMuaHJlZlxuXG4gIGxldCBzZXQgdSA9IGwjIy5ocmVmIDo9IEpzLmJ5dGVzdHJpbmcgKHN0cmluZ19vZl91cmwgdSlcblxuICBsZXQgYXNfc3RyaW5nID0gdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgbCMjLmhyZWZcbmVuZFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG5leHRlcm5hbCBjcmVhdGVfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IGNvbnRlbnQ6c3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfY3JlYXRlX2ZpbGVcIlxuXG5leHRlcm5hbCByZWFkX2ZpbGUgOiBuYW1lOnN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfcmVhZF9maWxlX2NvbnRlbnRcIlxuXG5sZXQgdXBkYXRlX2ZpbGUgfm5hbWUgfmNvbnRlbnQgPVxuICBsZXQgb2MgPSBvcGVuX291dCBuYW1lIGluXG4gIG91dHB1dF9zdHJpbmcgb2MgY29udGVudDtcbiAgY2xvc2Vfb3V0IG9jXG5cbmV4dGVybmFsIHNldF9jaGFubmVsX291dHB1dCcgOlxuICBvdXRfY2hhbm5lbCAtPiAoSnMuanNfc3RyaW5nIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgLT4gdW5pdFxuICA9IFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBzZXRfY2hhbm5lbF9pbnB1dCcgOiBpbl9jaGFubmVsIC0+ICh1bml0IC0+IHN0cmluZykgSnMuY2FsbGJhY2sgLT4gdW5pdFxuICA9IFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGxcIlxuXG5sZXQgc2V0X2NoYW5uZWxfZmx1c2hlciAob3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCkgKGYgOiBzdHJpbmcgLT4gdW5pdCkgPVxuICBsZXQgZicgOiAoSnMuanNfc3RyaW5nIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgPVxuICAgIEpzLndyYXBfY2FsbGJhY2sgKGZ1biBzIC0+IGYgKEpzLnRvX2J5dGVzdHJpbmcgcykpXG4gIGluXG4gIHNldF9jaGFubmVsX291dHB1dCcgb3V0X2NoYW5uZWwgZidcblxubGV0IHNldF9jaGFubmVsX2ZpbGxlciAoaW5fY2hhbm5lbCA6IGluX2NoYW5uZWwpIChmIDogdW5pdCAtPiBzdHJpbmcpID1cbiAgbGV0IGYnIDogKHVuaXQgLT4gc3RyaW5nKSBKcy5jYWxsYmFjayA9IEpzLndyYXBfY2FsbGJhY2sgZiBpblxuICBzZXRfY2hhbm5lbF9pbnB1dCcgaW5fY2hhbm5lbCBmJ1xuXG5leHRlcm5hbCBtb3VudF9wb2ludCA6IHVuaXQgLT4gc3RyaW5nIGxpc3QgPSBcImNhbWxfbGlzdF9tb3VudF9wb2ludFwiXG5cbmV4dGVybmFsIG1vdW50X2F1dG9sb2FkIDpcbiAgc3RyaW5nIC0+IChzdHJpbmcgLT4gc3RyaW5nIC0+IHN0cmluZyBvcHRpb24pIEpzLmNhbGxiYWNrIC0+IHVuaXRcbiAgPSBcImNhbWxfbW91bnRfYXV0b2xvYWRcIlxuXG5leHRlcm5hbCB1bm1vdW50IDogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfdW5tb3VudFwiXG5cbmxldCBtb3VudCB+cGF0aCBmID1cbiAgbW91bnRfYXV0b2xvYWQgcGF0aCAoSnMud3JhcF9jYWxsYmFjayAoZnVuIHByZWZpeCBwYXRoIC0+IGYgfnByZWZpeCB+cGF0aCkpXG5cbmxldCB1bm1vdW50IH5wYXRoID0gdW5tb3VudCBwYXRoXG5cbmxldCBqc19vZl9vY2FtbF92ZXJzaW9uID1cbiAgaWYgU3RyaW5nLmVxdWFsIExpYl92ZXJzaW9uLmdpdF92ZXJzaW9uIFwiXCJcbiAgdGhlbiBMaWJfdmVyc2lvbi5zXG4gIGVsc2UgTGliX3ZlcnNpb24ucyBeIFwiK1wiIF4gTGliX3ZlcnNpb24uZ2l0X3ZlcnNpb25cbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTkgQWxleGFuZGVyIFlhbmluXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSByZXNpemVPYnNlcnZlclNpemUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgaW5saW5lU2l6ZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBibG9ja1NpemUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHJlc2l6ZU9ic2VydmVyRW50cnkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdGFyZ2V0IDogRG9tLm5vZGUgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udGVudFJlY3QgOiBEb21faHRtbC5jbGllbnRSZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckJveFNpemUgOiByZXNpemVPYnNlcnZlclNpemUgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250ZW50Qm94U2l6ZSA6IHJlc2l6ZU9ic2VydmVyU2l6ZSBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSByZXNpemVPYnNlcnZlck9wdGlvbnMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYm94IDogSnMuanNfc3RyaW5nIEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcmVzaXplT2JzZXJ2ZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgb2JzZXJ2ZSA6ICNEb20ubm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIG9ic2VydmVfd2l0aE9wdGlvbnMgOlxuICAgICAgI0RvbS5ub2RlIEpzLnQgLT4gcmVzaXplT2JzZXJ2ZXJPcHRpb25zIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgdW5vYnNlcnZlIDogI0RvbS5ub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgZGlzY29ubmVjdCA6IHVuaXQgSnMubWV0aFxuICBlbmRcblxubGV0IGVtcHR5X3Jlc2l6ZV9vYnNlcnZlcl9vcHRpb25zICgpIDogcmVzaXplT2JzZXJ2ZXJPcHRpb25zIEpzLnQgPSBKcy5VbnNhZmUub2JqIFt8fF1cblxubGV0IHJlc2l6ZU9ic2VydmVyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9SZXNpemVPYnNlcnZlclxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgcmVzaXplT2JzZXJ2ZXJcblxubGV0IHJlc2l6ZU9ic2VydmVyIDpcbiAgICAoICAgKHJlc2l6ZU9ic2VydmVyRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy50IC0+IHJlc2l6ZU9ic2VydmVyIEpzLnQgLT4gdW5pdClcbiAgICAgICAgSnMuY2FsbGJhY2tcbiAgICAgLT4gcmVzaXplT2JzZXJ2ZXIgSnMudClcbiAgICBKcy5jb25zdHIgPVxuICByZXNpemVPYnNlcnZlclxuXG5sZXQgb2JzZXJ2ZVxuICAgIH4obm9kZSA6ICNEb20ubm9kZSBKcy50KVxuICAgIH4oZiA6IHJlc2l6ZU9ic2VydmVyRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy50IC0+IHJlc2l6ZU9ic2VydmVyIEpzLnQgLT4gdW5pdClcbiAgICA/KGJveCA6IEpzLmpzX3N0cmluZyBKcy50IG9wdGlvbilcbiAgICAoKSA6IHJlc2l6ZU9ic2VydmVyIEpzLnQgPVxuICBsZXQgb2JzID0gbmV3JWpzIHJlc2l6ZU9ic2VydmVyIChKcy53cmFwX2NhbGxiYWNrIGYpIGluXG4gIChtYXRjaCBib3ggd2l0aFxuICB8IE5vbmUgLT4gb2JzIyNvYnNlcnZlIG5vZGVcbiAgfCBTb21lIGJveCAtPlxuICAgICAgbGV0IG9wdHMgPSBlbXB0eV9yZXNpemVfb2JzZXJ2ZXJfb3B0aW9ucyAoKSBpblxuICAgICAgb3B0cyMjLmJveCA6PSBib3g7XG4gICAgICBvYnMjI29ic2VydmVfd2l0aE9wdGlvbnMgbm9kZSBvcHRzKTtcbiAgb2JzXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDIxIFBoaWxpcCBXaGl0ZVxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBwZXJmb3JtYW5jZU9ic2VydmVySW5pdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBlbnRyeVR5cGVzIDogSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwZXJmb3JtYW5jZUVudHJ5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG5hbWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZW50cnlUeXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXJ0VGltZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkdXJhdGlvbiA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcGVyZm9ybWFuY2VPYnNlcnZlckVudHJ5TGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBnZXRFbnRyaWVzIDogcGVyZm9ybWFuY2VFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSBwZXJmb3JtYW5jZU9ic2VydmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG9ic2VydmUgOiBwZXJmb3JtYW5jZU9ic2VydmVySW5pdCBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGRpc2Nvbm5lY3QgOiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB0YWtlUmVjb3JkcyA6IHBlcmZvcm1hbmNlRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBwZXJmb3JtYW5jZU9ic2VydmVyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9QZXJmb3JtYW5jZU9ic2VydmVyXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCBwZXJmb3JtYW5jZU9ic2VydmVyXG5cbmxldCBwZXJmb3JtYW5jZU9ic2VydmVyIDpcbiAgICAoICAgKHBlcmZvcm1hbmNlT2JzZXJ2ZXJFbnRyeUxpc3QgSnMudCAtPiBwZXJmb3JtYW5jZU9ic2VydmVyIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgLT4gcGVyZm9ybWFuY2VPYnNlcnZlciBKcy50KVxuICAgIEpzLmNvbnN0ciA9XG4gIHBlcmZvcm1hbmNlT2JzZXJ2ZXJcblxubGV0IG9ic2VydmUgfmVudHJ5X3R5cGVzIH5mID1cbiAgbGV0IGVudHJ5X3R5cGVzID0gZW50cnlfdHlwZXMgfD4gTGlzdC5tYXAgSnMuc3RyaW5nIHw+IEFycmF5Lm9mX2xpc3QgfD4gSnMuYXJyYXkgaW5cbiAgbGV0IHBlcmZvcm1hbmNlX29ic2VydmVyX2luaXQgOiBwZXJmb3JtYW5jZU9ic2VydmVySW5pdCBKcy50ID0gSnMuVW5zYWZlLm9iaiBbfHxdIGluXG4gIGxldCAoKSA9IHBlcmZvcm1hbmNlX29ic2VydmVyX2luaXQjIy5lbnRyeVR5cGVzIDo9IGVudHJ5X3R5cGVzIGluXG4gIGxldCBvYnMgPSBuZXclanMgcGVyZm9ybWFuY2VPYnNlcnZlciAoSnMud3JhcF9jYWxsYmFjayBmKSBpblxuICBsZXQgKCkgPSBvYnMjI29ic2VydmUgcGVyZm9ybWFuY2Vfb2JzZXJ2ZXJfaW5pdCBpblxuICBvYnNcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3TDqXBoYW5lIExlZ3JhbmRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIG11dGF0aW9uT2JzZXJ2ZXJJbml0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNoaWxkTGlzdCA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVzIDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJhY3RlckRhdGEgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3VidHJlZSA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVPbGRWYWx1ZSA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjaGFyYWN0ZXJEYXRhT2xkVmFsdWUgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXR0cmlidXRlRmlsdGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBtdXRhdGlvblJlY29yZCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfdHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBEb20ubm9kZSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhZGRlZE5vZGVzIDogRG9tLm5vZGUgRG9tLm5vZGVMaXN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlbW92ZWROb2RlcyA6IERvbS5ub2RlIERvbS5ub2RlTGlzdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmV2aW91c1NpYmxpbmcgOiBEb20ubm9kZSBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmV4dFNpYmxpbmcgOiBEb20ubm9kZSBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXR0cmlidXRlTmFtZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXR0cmlidXRlTmFtZXNwYWNlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbGRWYWx1ZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG11dGF0aW9uT2JzZXJ2ZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgb2JzZXJ2ZSA6ICNEb20ubm9kZSBKcy50IC0+IG11dGF0aW9uT2JzZXJ2ZXJJbml0IEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgZGlzY29ubmVjdCA6IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHRha2VSZWNvcmRzIDogbXV0YXRpb25SZWNvcmQgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBlbXB0eV9tdXRhdGlvbl9vYnNlcnZlcl9pbml0ICgpIDogbXV0YXRpb25PYnNlcnZlckluaXQgSnMudCA9IEpzLlVuc2FmZS5vYmogW3x8XVxuXG5sZXQgbXV0YXRpb25PYnNlcnZlciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fTXV0YXRpb25PYnNlcnZlclxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgbXV0YXRpb25PYnNlcnZlclxuXG5sZXQgbXV0YXRpb25PYnNlcnZlciA6XG4gICAgKCAgIChtdXRhdGlvblJlY29yZCBKcy50IEpzLmpzX2FycmF5IEpzLnQgLT4gbXV0YXRpb25PYnNlcnZlciBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgIC0+IG11dGF0aW9uT2JzZXJ2ZXIgSnMudClcbiAgICBKcy5jb25zdHIgPVxuICBtdXRhdGlvbk9ic2VydmVyXG5cbmxldCBvYnNlcnZlXG4gICAgfihub2RlIDogI0RvbS5ub2RlIEpzLnQpXG4gICAgfihmIDogbXV0YXRpb25SZWNvcmQgSnMudCBKcy5qc19hcnJheSBKcy50IC0+IG11dGF0aW9uT2JzZXJ2ZXIgSnMudCAtPiB1bml0KVxuICAgID8oY2hpbGRfbGlzdCA6IGJvb2wgb3B0aW9uKVxuICAgID8oYXR0cmlidXRlcyA6IGJvb2wgb3B0aW9uKVxuICAgID8oY2hhcmFjdGVyX2RhdGEgOiBib29sIG9wdGlvbilcbiAgICA/KHN1YnRyZWUgOiBib29sIG9wdGlvbilcbiAgICA/KGF0dHJpYnV0ZV9vbGRfdmFsdWUgOiBib29sIG9wdGlvbilcbiAgICA/KGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSA6IGJvb2wgb3B0aW9uKVxuICAgID8oYXR0cmlidXRlX2ZpbHRlciA6IEpzLmpzX3N0cmluZyBKcy50IGxpc3Qgb3B0aW9uKVxuICAgICgpIDogbXV0YXRpb25PYnNlcnZlciBKcy50ID1cbiAgbGV0IG9wdF9pdGVyIHggZiA9XG4gICAgbWF0Y2ggeCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHggLT4gZiB4XG4gIGluXG4gIGxldCBvYnMgPSBuZXclanMgbXV0YXRpb25PYnNlcnZlciAoSnMud3JhcF9jYWxsYmFjayBmKSBpblxuICBsZXQgY2ZnID0gZW1wdHlfbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdCAoKSBpblxuICBsZXQgKCkgPSBvcHRfaXRlciBjaGlsZF9saXN0IChmdW4gdiAtPiBjZmcjIy5jaGlsZExpc3QgOj0gdikgaW5cbiAgbGV0ICgpID0gb3B0X2l0ZXIgYXR0cmlidXRlcyAoZnVuIHYgLT4gY2ZnIyMuYXR0cmlidXRlcyA6PSB2KSBpblxuICBsZXQgKCkgPSBvcHRfaXRlciBjaGFyYWN0ZXJfZGF0YSAoZnVuIHYgLT4gY2ZnIyMuY2hhcmFjdGVyRGF0YSA6PSB2KSBpblxuICBsZXQgKCkgPSBvcHRfaXRlciBzdWJ0cmVlIChmdW4gdiAtPiBjZmcjIy5zdWJ0cmVlIDo9IHYpIGluXG4gIGxldCAoKSA9IG9wdF9pdGVyIGF0dHJpYnV0ZV9vbGRfdmFsdWUgKGZ1biB2IC0+IGNmZyMjLmF0dHJpYnV0ZU9sZFZhbHVlIDo9IHYpIGluXG4gIGxldCAoKSA9XG4gICAgb3B0X2l0ZXIgY2hhcmFjdGVyX2RhdGFfb2xkX3ZhbHVlIChmdW4gdiAtPiBjZmcjIy5jaGFyYWN0ZXJEYXRhT2xkVmFsdWUgOj0gdilcbiAgaW5cbiAgbGV0ICgpID1cbiAgICBvcHRfaXRlciBhdHRyaWJ1dGVfZmlsdGVyIChmdW4gbCAtPlxuICAgICAgICBjZmcjIy5hdHRyaWJ1dGVGaWx0ZXIgOj0gSnMuYXJyYXkgKEFycmF5Lm9mX2xpc3QgbCkpXG4gIGluXG4gIGxldCAoKSA9IG9icyMjb2JzZXJ2ZSBub2RlIGNmZyBpblxuICBvYnNcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgUGllcnJlIENoYW1iYXJ0IDIwMTIuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxudHlwZSAnYSB0ID0gPCA+IEpzLnRcblxubGV0IG9iaiA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fT2JqZWN0XG5cbmxldCBjcmVhdGUgKCkgOiAnYSB0ID0gbmV3JWpzIG9ialxuXG5sZXQgYWRkICh0IDogJ2EgdCkgKGsgOiBKcy5qc19zdHJpbmcgSnMudCkgKHYgOiAnYSkgPVxuICAoKiAnXycgaXMgYWRkZWQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb2JqZWN0cyBtZXRob2RzICopXG4gIEpzLlVuc2FmZS5zZXQgdCAoayMjY29uY2F0IChKcy5zdHJpbmcgXCJfXCIpKSB2XG5cbmxldCByZW1vdmUgKHQgOiAnYSB0KSAoayA6IEpzLmpzX3N0cmluZyBKcy50KSA9XG4gIEpzLlVuc2FmZS5kZWxldGUgdCAoayMjY29uY2F0IChKcy5zdHJpbmcgXCJfXCIpKVxuXG5sZXQgZmluZCAodCA6ICdhIHQpIChrIDogSnMuanNfc3RyaW5nIEpzLnQpIDogJ2EgSnMuT3B0ZGVmLnQgPVxuICBKcy5VbnNhZmUuZ2V0IHQgKGsjI2NvbmNhdCAoSnMuc3RyaW5nIFwiX1wiKSlcblxubGV0IGtleXMgKHQgOiAnYSB0KSA6IEpzLmpzX3N0cmluZyBKcy50IGxpc3QgPVxuICBsZXQga2V5X2FycmF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCA9XG4gICAgSnMuVW5zYWZlLmdsb2JhbCMjLl9PYmplY3QjI2tleXMgdFxuICBpblxuICBsZXQgcmVzID0gcmVmIFtdIGluXG4gIGZvciBpID0gMCB0byBwcmVkIGtleV9hcnJheSMjLmxlbmd0aCBkb1xuICAgIGxldCBrZXkgPVxuICAgICAgSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IGtleV9hcnJheSBpKSAoZnVuICgpIC0+IGZhaWx3aXRoIFwiSnN0YWJsZS5rZXlzXCIpXG4gICAgaW5cbiAgICByZXMgOj0ga2V5IyNzdWJzdHJpbmcgMCAocHJlZCBrZXkjIy5sZW5ndGgpIDo6ICFyZXNcbiAgZG9uZTtcbiAgTGlzdC5yZXYgIXJlc1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCBHcsOpZ29pcmUgSGVucnkgMjAxMC5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUganNvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwYXJzZSA6ICdhLiBqc19zdHJpbmcgdCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgcGFyc2VfIDpcbiAgICAgICdhICdiICdjICdkLiBqc19zdHJpbmcgdCAtPiAoJ2IgdCwganNfc3RyaW5nIHQgLT4gJ2MgLT4gJ2QpIG1ldGhfY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHN0cmluZ2lmeSA6ICdhLiAnYSAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RyaW5naWZ5XyA6XG4gICAgICAnYSAnYiAnYyAnZC4gJ2EgLT4gKCdiLCBqc19zdHJpbmcgdCAtPiAnYyAtPiAnZCkgbWV0aF9jYWxsYmFjayAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5sZXQganNvbiA6IGpzb24gSnMudCA9IFVuc2FmZS5nbG9iYWwjIy5fSlNPTlxuXG5sZXQgaW5wdXRfcmV2aXZlciA9XG4gIGxldCByZXZpdmVyIF90aGlzIF9rZXkgKHZhbHVlIDogVW5zYWZlLmFueSkgOiBPYmoudCA9XG4gICAgaWYgdHlwZW9mIHZhbHVlID09IHN0cmluZyBcInN0cmluZ1wiXG4gICAgdGhlbiBPYmoucmVwciAodG9fYnl0ZXN0cmluZyAoVW5zYWZlLmNvZXJjZSB2YWx1ZSkpXG4gICAgZWxzZSBpZiBpbnN0YW5jZW9mIHZhbHVlIEpzLmFycmF5X2VtcHR5XG4gICAgICAgICAgICAmJiAoVW5zYWZlLmNvZXJjZSB2YWx1ZSkjIy5sZW5ndGggPT0gNFxuICAgICAgICAgICAgJiYgVW5zYWZlLmdldCB2YWx1ZSAwID09IDI1NVxuICAgIHRoZW5cbiAgICAgIE9iai5yZXByXG4gICAgICAgIChKc29vX3J1bnRpbWUuSW50NjQuY3JlYXRlX2ludDY0X2xvX21pX2hpXG4gICAgICAgICAgIChVbnNhZmUuZ2V0IHZhbHVlIDEpXG4gICAgICAgICAgIChVbnNhZmUuZ2V0IHZhbHVlIDIpXG4gICAgICAgICAgIChVbnNhZmUuZ2V0IHZhbHVlIDMpKVxuICAgIGVsc2UgT2JqLnJlcHIgdmFsdWVcbiAgaW5cbiAgd3JhcF9tZXRoX2NhbGxiYWNrIHJldml2ZXJcblxubGV0IHVuc2FmZV9pbnB1dCBzID0ganNvbiMjcGFyc2VfIHMgaW5wdXRfcmV2aXZlclxuXG5jbGFzcyB0eXBlIG9iaiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjb25zdHJ1Y3RvciA6ICdhLiAnYSBjb25zdHIgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IG1sSW50NjRfY29uc3RyID1cbiAgbGV0IGR1bW15X2ludDY0ID0gMUwgaW5cbiAgbGV0IGR1bW15X29iaiA6IG9iaiB0ID0gT2JqLm1hZ2ljIGR1bW15X2ludDY0IGluXG4gIGR1bW15X29iaiMjLmNvbnN0cnVjdG9yXG5cbmxldCBvdXRwdXRfcmV2aXZlciBfa2V5ICh2YWx1ZSA6IFVuc2FmZS5hbnkpIDogT2JqLnQgPVxuICBpZiBPYmoudGFnIChPYmoucmVwciB2YWx1ZSkgPSBPYmouc3RyaW5nX3RhZ1xuICB0aGVuIE9iai5yZXByIChieXRlc3RyaW5nIChPYmoubWFnaWMgdmFsdWUgOiBzdHJpbmcpKVxuICBlbHNlIGlmIGluc3RhbmNlb2YgdmFsdWUgbWxJbnQ2NF9jb25zdHJcbiAgdGhlblxuICAgIGxldCB2YWx1ZSA9IFVuc2FmZS5jb2VyY2UgdmFsdWUgaW5cbiAgICBPYmoucmVwciAoYXJyYXkgW3wgMjU1OyB2YWx1ZSMjLmxvOyB2YWx1ZSMjLm1pOyB2YWx1ZSMjLmhpIHxdKVxuICBlbHNlIE9iai5yZXByIHZhbHVlXG5cbmxldCBvdXRwdXQgb2JqID0ganNvbiMjc3RyaW5naWZ5XyBvYmogKEpzLndyYXBfY2FsbGJhY2sgb3V0cHV0X3Jldml2ZXIpXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIFJhcGhhw6tsIFByb3VzdFxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgQ29sb3IgPSBzdHJ1Y3RcbiAgKCogVGhlIHR5cGUgb2YgQ1NTIGNvbG9ycy4gRmlyc3QgYnkgbmFtZSBhbmQgdGhlbiBieSBjb25zdHJ1Y3Rvci4gKilcbiAgdHlwZSBuYW1lID1cbiAgICB8IEFsaWNlYmx1ZVxuICAgIHwgQW50aXF1ZXdoaXRlXG4gICAgfCBBcXVhXG4gICAgfCBBcXVhbWFyaW5lXG4gICAgfCBBenVyZVxuICAgIHwgQmVpZ2VcbiAgICB8IEJpc3F1ZVxuICAgIHwgQmxhY2tcbiAgICB8IEJsYW5jaGVkYWxtb25kXG4gICAgfCBCbHVlXG4gICAgfCBCbHVldmlvbGV0XG4gICAgfCBCcm93blxuICAgIHwgQnVybHl3b29kXG4gICAgfCBDYWRldGJsdWVcbiAgICB8IENoYXJ0cmV1c2VcbiAgICB8IENob2NvbGF0ZVxuICAgIHwgQ29yYWxcbiAgICB8IENvcm5mbG93ZXJibHVlXG4gICAgfCBDb3Juc2lsa1xuICAgIHwgQ3JpbXNvblxuICAgIHwgQ3lhblxuICAgIHwgRGFya2JsdWVcbiAgICB8IERhcmtjeWFuXG4gICAgfCBEYXJrZ29sZGVucm9kXG4gICAgfCBEYXJrZ3JheVxuICAgIHwgRGFya2dyZWVuXG4gICAgfCBEYXJrZ3JleVxuICAgIHwgRGFya2toYWtpXG4gICAgfCBEYXJrbWFnZW50YVxuICAgIHwgRGFya29saXZlZ3JlZW5cbiAgICB8IERhcmtvcmFuZ2VcbiAgICB8IERhcmtvcmNoaWRcbiAgICB8IERhcmtyZWRcbiAgICB8IERhcmtzYWxtb25cbiAgICB8IERhcmtzZWFncmVlblxuICAgIHwgRGFya3NsYXRlYmx1ZVxuICAgIHwgRGFya3NsYXRlZ3JheVxuICAgIHwgRGFya3NsYXRlZ3JleVxuICAgIHwgRGFya3R1cnF1b2lzZVxuICAgIHwgRGFya3Zpb2xldFxuICAgIHwgRGVlcHBpbmtcbiAgICB8IERlZXBza3libHVlXG4gICAgfCBEaW1ncmF5XG4gICAgfCBEaW1ncmV5XG4gICAgfCBEb2RnZXJibHVlXG4gICAgfCBGaXJlYnJpY2tcbiAgICB8IEZsb3JhbHdoaXRlXG4gICAgfCBGb3Jlc3RncmVlblxuICAgIHwgRnVjaHNpYVxuICAgIHwgR2FpbnNib3JvXG4gICAgfCBHaG9zdHdoaXRlXG4gICAgfCBHb2xkXG4gICAgfCBHb2xkZW5yb2RcbiAgICB8IEdyYXlcbiAgICB8IEdyZXlcbiAgICB8IEdyZWVuXG4gICAgfCBHcmVlbnllbGxvd1xuICAgIHwgSG9uZXlkZXdcbiAgICB8IEhvdHBpbmtcbiAgICB8IEluZGlhbnJlZFxuICAgIHwgSW5kaWdvXG4gICAgfCBJdm9yeVxuICAgIHwgS2hha2lcbiAgICB8IExhdmVuZGVyXG4gICAgfCBMYXZlbmRlcmJsdXNoXG4gICAgfCBMYXduZ3JlZW5cbiAgICB8IExlbW9uY2hpZmZvblxuICAgIHwgTGlnaHRibHVlXG4gICAgfCBMaWdodGNvcmFsXG4gICAgfCBMaWdodGN5YW5cbiAgICB8IExpZ2h0Z29sZGVucm9keWVsbG93XG4gICAgfCBMaWdodGdyYXlcbiAgICB8IExpZ2h0Z3JlZW5cbiAgICB8IExpZ2h0Z3JleVxuICAgIHwgTGlnaHRwaW5rXG4gICAgfCBMaWdodHNhbG1vblxuICAgIHwgTGlnaHRzZWFncmVlblxuICAgIHwgTGlnaHRza3libHVlXG4gICAgfCBMaWdodHNsYXRlZ3JheVxuICAgIHwgTGlnaHRzbGF0ZWdyZXlcbiAgICB8IExpZ2h0c3RlZWxibHVlXG4gICAgfCBMaWdodHllbGxvd1xuICAgIHwgTGltZVxuICAgIHwgTGltZWdyZWVuXG4gICAgfCBMaW5lblxuICAgIHwgTWFnZW50YVxuICAgIHwgTWFyb29uXG4gICAgfCBNZWRpdW1hcXVhbWFyaW5lXG4gICAgfCBNZWRpdW1ibHVlXG4gICAgfCBNZWRpdW1vcmNoaWRcbiAgICB8IE1lZGl1bXB1cnBsZVxuICAgIHwgTWVkaXVtc2VhZ3JlZW5cbiAgICB8IE1lZGl1bXNsYXRlYmx1ZVxuICAgIHwgTWVkaXVtc3ByaW5nZ3JlZW5cbiAgICB8IE1lZGl1bXR1cnF1b2lzZVxuICAgIHwgTWVkaXVtdmlvbGV0cmVkXG4gICAgfCBNaWRuaWdodGJsdWVcbiAgICB8IE1pbnRjcmVhbVxuICAgIHwgTWlzdHlyb3NlXG4gICAgfCBNb2NjYXNpblxuICAgIHwgTmF2YWpvd2hpdGVcbiAgICB8IE5hdnlcbiAgICB8IE9sZGxhY2VcbiAgICB8IE9saXZlXG4gICAgfCBPbGl2ZWRyYWJcbiAgICB8IE9yYW5nZVxuICAgIHwgT3JhbmdlcmVkXG4gICAgfCBPcmNoaWRcbiAgICB8IFBhbGVnb2xkZW5yb2RcbiAgICB8IFBhbGVncmVlblxuICAgIHwgUGFsZXR1cnF1b2lzZVxuICAgIHwgUGFsZXZpb2xldHJlZFxuICAgIHwgUGFwYXlhd2hpcFxuICAgIHwgUGVhY2hwdWZmXG4gICAgfCBQZXJ1XG4gICAgfCBQaW5rXG4gICAgfCBQbHVtXG4gICAgfCBQb3dkZXJibHVlXG4gICAgfCBQdXJwbGVcbiAgICB8IFJlZFxuICAgIHwgUm9zeWJyb3duXG4gICAgfCBSb3lhbGJsdWVcbiAgICB8IFNhZGRsZWJyb3duXG4gICAgfCBTYWxtb25cbiAgICB8IFNhbmR5YnJvd25cbiAgICB8IFNlYWdyZWVuXG4gICAgfCBTZWFzaGVsbFxuICAgIHwgU2llbm5hXG4gICAgfCBTaWx2ZXJcbiAgICB8IFNreWJsdWVcbiAgICB8IFNsYXRlYmx1ZVxuICAgIHwgU2xhdGVncmF5XG4gICAgfCBTbGF0ZWdyZXlcbiAgICB8IFNub3dcbiAgICB8IFNwcmluZ2dyZWVuXG4gICAgfCBTdGVlbGJsdWVcbiAgICB8IFRhblxuICAgIHwgVGVhbFxuICAgIHwgVGhpc3RsZVxuICAgIHwgVG9tYXRvXG4gICAgfCBUdXJxdW9pc2VcbiAgICB8IFZpb2xldFxuICAgIHwgV2hlYXRcbiAgICB8IFdoaXRlXG4gICAgfCBXaGl0ZXNtb2tlXG4gICAgfCBZZWxsb3dcbiAgICB8IFllbGxvd2dyZWVuXG5cbiAgbGV0IHN0cmluZ19vZl9uYW1lID0gZnVuY3Rpb25cbiAgICB8IEFsaWNlYmx1ZSAtPiBcImFsaWNlYmx1ZVwiXG4gICAgfCBBbnRpcXVld2hpdGUgLT4gXCJhbnRpcXVld2hpdGVcIlxuICAgIHwgQXF1YSAtPiBcImFxdWFcIlxuICAgIHwgQXF1YW1hcmluZSAtPiBcImFxdWFtYXJpbmVcIlxuICAgIHwgQXp1cmUgLT4gXCJhenVyZVwiXG4gICAgfCBCZWlnZSAtPiBcImJlaWdlXCJcbiAgICB8IEJpc3F1ZSAtPiBcImJpc3F1ZVwiXG4gICAgfCBCbGFjayAtPiBcImJsYWNrXCJcbiAgICB8IEJsYW5jaGVkYWxtb25kIC0+IFwiYmxhbmNoZWRhbG1vbmRcIlxuICAgIHwgQmx1ZSAtPiBcImJsdWVcIlxuICAgIHwgQmx1ZXZpb2xldCAtPiBcImJsdWV2aW9sZXRcIlxuICAgIHwgQnJvd24gLT4gXCJicm93blwiXG4gICAgfCBCdXJseXdvb2QgLT4gXCJidXJseXdvb2RcIlxuICAgIHwgQ2FkZXRibHVlIC0+IFwiY2FkZXRibHVlXCJcbiAgICB8IENoYXJ0cmV1c2UgLT4gXCJjaGFydHJldXNlXCJcbiAgICB8IENob2NvbGF0ZSAtPiBcImNob2NvbGF0ZVwiXG4gICAgfCBDb3JhbCAtPiBcImNvcmFsXCJcbiAgICB8IENvcm5mbG93ZXJibHVlIC0+IFwiY29ybmZsb3dlcmJsdWVcIlxuICAgIHwgQ29ybnNpbGsgLT4gXCJjb3Juc2lsa1wiXG4gICAgfCBDcmltc29uIC0+IFwiY3JpbXNvblwiXG4gICAgfCBDeWFuIC0+IFwiY3lhblwiXG4gICAgfCBEYXJrYmx1ZSAtPiBcImRhcmtibHVlXCJcbiAgICB8IERhcmtjeWFuIC0+IFwiZGFya2N5YW5cIlxuICAgIHwgRGFya2dvbGRlbnJvZCAtPiBcImRhcmtnb2xkZW5yb2RcIlxuICAgIHwgRGFya2dyYXkgLT4gXCJkYXJrZ3JheVwiXG4gICAgfCBEYXJrZ3JlZW4gLT4gXCJkYXJrZ3JlZW5cIlxuICAgIHwgRGFya2dyZXkgLT4gXCJkYXJrZ3JleVwiXG4gICAgfCBEYXJra2hha2kgLT4gXCJkYXJra2hha2lcIlxuICAgIHwgRGFya21hZ2VudGEgLT4gXCJkYXJrbWFnZW50YVwiXG4gICAgfCBEYXJrb2xpdmVncmVlbiAtPiBcImRhcmtvbGl2ZWdyZWVuXCJcbiAgICB8IERhcmtvcmFuZ2UgLT4gXCJkYXJrb3JhbmdlXCJcbiAgICB8IERhcmtvcmNoaWQgLT4gXCJkYXJrb3JjaGlkXCJcbiAgICB8IERhcmtyZWQgLT4gXCJkYXJrcmVkXCJcbiAgICB8IERhcmtzYWxtb24gLT4gXCJkYXJrc2FsbW9uXCJcbiAgICB8IERhcmtzZWFncmVlbiAtPiBcImRhcmtzZWFncmVlblwiXG4gICAgfCBEYXJrc2xhdGVibHVlIC0+IFwiZGFya3NsYXRlYmx1ZVwiXG4gICAgfCBEYXJrc2xhdGVncmF5IC0+IFwiZGFya3NsYXRlZ3JheVwiXG4gICAgfCBEYXJrc2xhdGVncmV5IC0+IFwiZGFya3NsYXRlZ3JleVwiXG4gICAgfCBEYXJrdHVycXVvaXNlIC0+IFwiZGFya3R1cnF1b2lzZVwiXG4gICAgfCBEYXJrdmlvbGV0IC0+IFwiZGFya3Zpb2xldFwiXG4gICAgfCBEZWVwcGluayAtPiBcImRlZXBwaW5rXCJcbiAgICB8IERlZXBza3libHVlIC0+IFwiZGVlcHNreWJsdWVcIlxuICAgIHwgRGltZ3JheSAtPiBcImRpbWdyYXlcIlxuICAgIHwgRGltZ3JleSAtPiBcImRpbWdyZXlcIlxuICAgIHwgRG9kZ2VyYmx1ZSAtPiBcImRvZGdlcmJsdWVcIlxuICAgIHwgRmlyZWJyaWNrIC0+IFwiZmlyZWJyaWNrXCJcbiAgICB8IEZsb3JhbHdoaXRlIC0+IFwiZmxvcmFsd2hpdGVcIlxuICAgIHwgRm9yZXN0Z3JlZW4gLT4gXCJmb3Jlc3RncmVlblwiXG4gICAgfCBGdWNoc2lhIC0+IFwiZnVjaHNpYVwiXG4gICAgfCBHYWluc2Jvcm8gLT4gXCJnYWluc2Jvcm9cIlxuICAgIHwgR2hvc3R3aGl0ZSAtPiBcImdob3N0d2hpdGVcIlxuICAgIHwgR29sZCAtPiBcImdvbGRcIlxuICAgIHwgR29sZGVucm9kIC0+IFwiZ29sZGVucm9kXCJcbiAgICB8IEdyYXkgLT4gXCJncmF5XCJcbiAgICB8IEdyZWVuIC0+IFwiZ3JlZW5cIlxuICAgIHwgR3JlZW55ZWxsb3cgLT4gXCJncmVlbnllbGxvd1wiXG4gICAgfCBHcmV5IC0+IFwiZ3JleVwiXG4gICAgfCBIb25leWRldyAtPiBcImhvbmV5ZGV3XCJcbiAgICB8IEhvdHBpbmsgLT4gXCJob3RwaW5rXCJcbiAgICB8IEluZGlhbnJlZCAtPiBcImluZGlhbnJlZFwiXG4gICAgfCBJbmRpZ28gLT4gXCJpbmRpZ29cIlxuICAgIHwgSXZvcnkgLT4gXCJpdm9yeVwiXG4gICAgfCBLaGFraSAtPiBcImtoYWtpXCJcbiAgICB8IExhdmVuZGVyIC0+IFwibGF2ZW5kZXJcIlxuICAgIHwgTGF2ZW5kZXJibHVzaCAtPiBcImxhdmVuZGVyYmx1c2hcIlxuICAgIHwgTGF3bmdyZWVuIC0+IFwibGF3bmdyZWVuXCJcbiAgICB8IExlbW9uY2hpZmZvbiAtPiBcImxlbW9uY2hpZmZvblwiXG4gICAgfCBMaWdodGJsdWUgLT4gXCJsaWdodGJsdWVcIlxuICAgIHwgTGlnaHRjb3JhbCAtPiBcImxpZ2h0Y29yYWxcIlxuICAgIHwgTGlnaHRjeWFuIC0+IFwibGlnaHRjeWFuXCJcbiAgICB8IExpZ2h0Z29sZGVucm9keWVsbG93IC0+IFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIlxuICAgIHwgTGlnaHRncmF5IC0+IFwibGlnaHRncmF5XCJcbiAgICB8IExpZ2h0Z3JlZW4gLT4gXCJsaWdodGdyZWVuXCJcbiAgICB8IExpZ2h0Z3JleSAtPiBcImxpZ2h0Z3JleVwiXG4gICAgfCBMaWdodHBpbmsgLT4gXCJsaWdodHBpbmtcIlxuICAgIHwgTGlnaHRzYWxtb24gLT4gXCJsaWdodHNhbG1vblwiXG4gICAgfCBMaWdodHNlYWdyZWVuIC0+IFwibGlnaHRzZWFncmVlblwiXG4gICAgfCBMaWdodHNreWJsdWUgLT4gXCJsaWdodHNreWJsdWVcIlxuICAgIHwgTGlnaHRzbGF0ZWdyYXkgLT4gXCJsaWdodHNsYXRlZ3JheVwiXG4gICAgfCBMaWdodHNsYXRlZ3JleSAtPiBcImxpZ2h0c2xhdGVncmV5XCJcbiAgICB8IExpZ2h0c3RlZWxibHVlIC0+IFwibGlnaHRzdGVlbGJsdWVcIlxuICAgIHwgTGlnaHR5ZWxsb3cgLT4gXCJsaWdodHllbGxvd1wiXG4gICAgfCBMaW1lIC0+IFwibGltZVwiXG4gICAgfCBMaW1lZ3JlZW4gLT4gXCJsaW1lZ3JlZW5cIlxuICAgIHwgTGluZW4gLT4gXCJsaW5lblwiXG4gICAgfCBNYWdlbnRhIC0+IFwibWFnZW50YVwiXG4gICAgfCBNYXJvb24gLT4gXCJtYXJvb25cIlxuICAgIHwgTWVkaXVtYXF1YW1hcmluZSAtPiBcIm1lZGl1bWFxdWFtYXJpbmVcIlxuICAgIHwgTWVkaXVtYmx1ZSAtPiBcIm1lZGl1bWJsdWVcIlxuICAgIHwgTWVkaXVtb3JjaGlkIC0+IFwibWVkaXVtb3JjaGlkXCJcbiAgICB8IE1lZGl1bXB1cnBsZSAtPiBcIm1lZGl1bXB1cnBsZVwiXG4gICAgfCBNZWRpdW1zZWFncmVlbiAtPiBcIm1lZGl1bXNlYWdyZWVuXCJcbiAgICB8IE1lZGl1bXNsYXRlYmx1ZSAtPiBcIm1lZGl1bXNsYXRlYmx1ZVwiXG4gICAgfCBNZWRpdW1zcHJpbmdncmVlbiAtPiBcIm1lZGl1bXNwcmluZ2dyZWVuXCJcbiAgICB8IE1lZGl1bXR1cnF1b2lzZSAtPiBcIm1lZGl1bXR1cnF1b2lzZVwiXG4gICAgfCBNZWRpdW12aW9sZXRyZWQgLT4gXCJtZWRpdW12aW9sZXRyZWRcIlxuICAgIHwgTWlkbmlnaHRibHVlIC0+IFwibWlkbmlnaHRibHVlXCJcbiAgICB8IE1pbnRjcmVhbSAtPiBcIm1pbnRjcmVhbVwiXG4gICAgfCBNaXN0eXJvc2UgLT4gXCJtaXN0eXJvc2VcIlxuICAgIHwgTW9jY2FzaW4gLT4gXCJtb2NjYXNpblwiXG4gICAgfCBOYXZham93aGl0ZSAtPiBcIm5hdmFqb3doaXRlXCJcbiAgICB8IE5hdnkgLT4gXCJuYXZ5XCJcbiAgICB8IE9sZGxhY2UgLT4gXCJvbGRsYWNlXCJcbiAgICB8IE9saXZlIC0+IFwib2xpdmVcIlxuICAgIHwgT2xpdmVkcmFiIC0+IFwib2xpdmVkcmFiXCJcbiAgICB8IE9yYW5nZSAtPiBcIm9yYW5nZVwiXG4gICAgfCBPcmFuZ2VyZWQgLT4gXCJvcmFuZ2VyZWRcIlxuICAgIHwgT3JjaGlkIC0+IFwib3JjaGlkXCJcbiAgICB8IFBhbGVnb2xkZW5yb2QgLT4gXCJwYWxlZ29sZGVucm9kXCJcbiAgICB8IFBhbGVncmVlbiAtPiBcInBhbGVncmVlblwiXG4gICAgfCBQYWxldHVycXVvaXNlIC0+IFwicGFsZXR1cnF1b2lzZVwiXG4gICAgfCBQYWxldmlvbGV0cmVkIC0+IFwicGFsZXZpb2xldHJlZFwiXG4gICAgfCBQYXBheWF3aGlwIC0+IFwicGFwYXlhd2hpcFwiXG4gICAgfCBQZWFjaHB1ZmYgLT4gXCJwZWFjaHB1ZmZcIlxuICAgIHwgUGVydSAtPiBcInBlcnVcIlxuICAgIHwgUGluayAtPiBcInBpbmtcIlxuICAgIHwgUGx1bSAtPiBcInBsdW1cIlxuICAgIHwgUG93ZGVyYmx1ZSAtPiBcInBvd2RlcmJsdWVcIlxuICAgIHwgUHVycGxlIC0+IFwicHVycGxlXCJcbiAgICB8IFJlZCAtPiBcInJlZFwiXG4gICAgfCBSb3N5YnJvd24gLT4gXCJyb3N5YnJvd25cIlxuICAgIHwgUm95YWxibHVlIC0+IFwicm95YWxibHVlXCJcbiAgICB8IFNhZGRsZWJyb3duIC0+IFwic2FkZGxlYnJvd25cIlxuICAgIHwgU2FsbW9uIC0+IFwic2FsbW9uXCJcbiAgICB8IFNhbmR5YnJvd24gLT4gXCJzYW5keWJyb3duXCJcbiAgICB8IFNlYWdyZWVuIC0+IFwic2VhZ3JlZW5cIlxuICAgIHwgU2Vhc2hlbGwgLT4gXCJzZWFzaGVsbFwiXG4gICAgfCBTaWVubmEgLT4gXCJzaWVubmFcIlxuICAgIHwgU2lsdmVyIC0+IFwic2lsdmVyXCJcbiAgICB8IFNreWJsdWUgLT4gXCJza3libHVlXCJcbiAgICB8IFNsYXRlYmx1ZSAtPiBcInNsYXRlYmx1ZVwiXG4gICAgfCBTbGF0ZWdyYXkgLT4gXCJzbGF0ZWdyYXlcIlxuICAgIHwgU2xhdGVncmV5IC0+IFwic2xhdGVncmV5XCJcbiAgICB8IFNub3cgLT4gXCJzbm93XCJcbiAgICB8IFNwcmluZ2dyZWVuIC0+IFwic3ByaW5nZ3JlZW5cIlxuICAgIHwgU3RlZWxibHVlIC0+IFwic3RlZWxibHVlXCJcbiAgICB8IFRhbiAtPiBcInRhblwiXG4gICAgfCBUZWFsIC0+IFwidGVhbFwiXG4gICAgfCBUaGlzdGxlIC0+IFwidGhpc3RsZVwiXG4gICAgfCBUb21hdG8gLT4gXCJ0b21hdG9cIlxuICAgIHwgVHVycXVvaXNlIC0+IFwidHVycXVvaXNlXCJcbiAgICB8IFZpb2xldCAtPiBcInZpb2xldFwiXG4gICAgfCBXaGVhdCAtPiBcIndoZWF0XCJcbiAgICB8IFdoaXRlIC0+IFwid2hpdGVcIlxuICAgIHwgV2hpdGVzbW9rZSAtPiBcIndoaXRlc21va2VcIlxuICAgIHwgWWVsbG93IC0+IFwieWVsbG93XCJcbiAgICB8IFllbGxvd2dyZWVuIC0+IFwieWVsbG93Z3JlZW5cIlxuXG4gIGxldCBuYW1lX29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gICAgfCBcImFsaWNlYmx1ZVwiIC0+IEFsaWNlYmx1ZVxuICAgIHwgXCJhbnRpcXVld2hpdGVcIiAtPiBBbnRpcXVld2hpdGVcbiAgICB8IFwiYXF1YVwiIC0+IEFxdWFcbiAgICB8IFwiYXF1YW1hcmluZVwiIC0+IEFxdWFtYXJpbmVcbiAgICB8IFwiYXp1cmVcIiAtPiBBenVyZVxuICAgIHwgXCJiZWlnZVwiIC0+IEJlaWdlXG4gICAgfCBcImJpc3F1ZVwiIC0+IEJpc3F1ZVxuICAgIHwgXCJibGFja1wiIC0+IEJsYWNrXG4gICAgfCBcImJsYW5jaGVkYWxtb25kXCIgLT4gQmxhbmNoZWRhbG1vbmRcbiAgICB8IFwiYmx1ZVwiIC0+IEJsdWVcbiAgICB8IFwiYmx1ZXZpb2xldFwiIC0+IEJsdWV2aW9sZXRcbiAgICB8IFwiYnJvd25cIiAtPiBCcm93blxuICAgIHwgXCJidXJseXdvb2RcIiAtPiBCdXJseXdvb2RcbiAgICB8IFwiY2FkZXRibHVlXCIgLT4gQ2FkZXRibHVlXG4gICAgfCBcImNoYXJ0cmV1c2VcIiAtPiBDaGFydHJldXNlXG4gICAgfCBcImNob2NvbGF0ZVwiIC0+IENob2NvbGF0ZVxuICAgIHwgXCJjb3JhbFwiIC0+IENvcmFsXG4gICAgfCBcImNvcm5mbG93ZXJibHVlXCIgLT4gQ29ybmZsb3dlcmJsdWVcbiAgICB8IFwiY29ybnNpbGtcIiAtPiBDb3Juc2lsa1xuICAgIHwgXCJjcmltc29uXCIgLT4gQ3JpbXNvblxuICAgIHwgXCJjeWFuXCIgLT4gQ3lhblxuICAgIHwgXCJkYXJrYmx1ZVwiIC0+IERhcmtibHVlXG4gICAgfCBcImRhcmtjeWFuXCIgLT4gRGFya2N5YW5cbiAgICB8IFwiZGFya2dvbGRlbnJvZFwiIC0+IERhcmtnb2xkZW5yb2RcbiAgICB8IFwiZGFya2dyYXlcIiAtPiBEYXJrZ3JheVxuICAgIHwgXCJkYXJrZ3JlZW5cIiAtPiBEYXJrZ3JlZW5cbiAgICB8IFwiZGFya2dyZXlcIiAtPiBEYXJrZ3JleVxuICAgIHwgXCJkYXJra2hha2lcIiAtPiBEYXJra2hha2lcbiAgICB8IFwiZGFya21hZ2VudGFcIiAtPiBEYXJrbWFnZW50YVxuICAgIHwgXCJkYXJrb2xpdmVncmVlblwiIC0+IERhcmtvbGl2ZWdyZWVuXG4gICAgfCBcImRhcmtvcmFuZ2VcIiAtPiBEYXJrb3JhbmdlXG4gICAgfCBcImRhcmtvcmNoaWRcIiAtPiBEYXJrb3JjaGlkXG4gICAgfCBcImRhcmtyZWRcIiAtPiBEYXJrcmVkXG4gICAgfCBcImRhcmtzYWxtb25cIiAtPiBEYXJrc2FsbW9uXG4gICAgfCBcImRhcmtzZWFncmVlblwiIC0+IERhcmtzZWFncmVlblxuICAgIHwgXCJkYXJrc2xhdGVibHVlXCIgLT4gRGFya3NsYXRlYmx1ZVxuICAgIHwgXCJkYXJrc2xhdGVncmF5XCIgLT4gRGFya3NsYXRlZ3JheVxuICAgIHwgXCJkYXJrc2xhdGVncmV5XCIgLT4gRGFya3NsYXRlZ3JleVxuICAgIHwgXCJkYXJrdHVycXVvaXNlXCIgLT4gRGFya3R1cnF1b2lzZVxuICAgIHwgXCJkYXJrdmlvbGV0XCIgLT4gRGFya3Zpb2xldFxuICAgIHwgXCJkZWVwcGlua1wiIC0+IERlZXBwaW5rXG4gICAgfCBcImRlZXBza3libHVlXCIgLT4gRGVlcHNreWJsdWVcbiAgICB8IFwiZGltZ3JheVwiIC0+IERpbWdyYXlcbiAgICB8IFwiZGltZ3JleVwiIC0+IERpbWdyZXlcbiAgICB8IFwiZG9kZ2VyYmx1ZVwiIC0+IERvZGdlcmJsdWVcbiAgICB8IFwiZmlyZWJyaWNrXCIgLT4gRmlyZWJyaWNrXG4gICAgfCBcImZsb3JhbHdoaXRlXCIgLT4gRmxvcmFsd2hpdGVcbiAgICB8IFwiZm9yZXN0Z3JlZW5cIiAtPiBGb3Jlc3RncmVlblxuICAgIHwgXCJmdWNoc2lhXCIgLT4gRnVjaHNpYVxuICAgIHwgXCJnYWluc2Jvcm9cIiAtPiBHYWluc2Jvcm9cbiAgICB8IFwiZ2hvc3R3aGl0ZVwiIC0+IEdob3N0d2hpdGVcbiAgICB8IFwiZ29sZFwiIC0+IEdvbGRcbiAgICB8IFwiZ29sZGVucm9kXCIgLT4gR29sZGVucm9kXG4gICAgfCBcImdyYXlcIiAtPiBHcmF5XG4gICAgfCBcImdyZWVuXCIgLT4gR3JlZW5cbiAgICB8IFwiZ3JlZW55ZWxsb3dcIiAtPiBHcmVlbnllbGxvd1xuICAgIHwgXCJncmV5XCIgLT4gR3JleVxuICAgIHwgXCJob25leWRld1wiIC0+IEhvbmV5ZGV3XG4gICAgfCBcImhvdHBpbmtcIiAtPiBIb3RwaW5rXG4gICAgfCBcImluZGlhbnJlZFwiIC0+IEluZGlhbnJlZFxuICAgIHwgXCJpbmRpZ29cIiAtPiBJbmRpZ29cbiAgICB8IFwiaXZvcnlcIiAtPiBJdm9yeVxuICAgIHwgXCJraGFraVwiIC0+IEtoYWtpXG4gICAgfCBcImxhdmVuZGVyXCIgLT4gTGF2ZW5kZXJcbiAgICB8IFwibGF2ZW5kZXJibHVzaFwiIC0+IExhdmVuZGVyYmx1c2hcbiAgICB8IFwibGF3bmdyZWVuXCIgLT4gTGF3bmdyZWVuXG4gICAgfCBcImxlbW9uY2hpZmZvblwiIC0+IExlbW9uY2hpZmZvblxuICAgIHwgXCJsaWdodGJsdWVcIiAtPiBMaWdodGJsdWVcbiAgICB8IFwibGlnaHRjb3JhbFwiIC0+IExpZ2h0Y29yYWxcbiAgICB8IFwibGlnaHRjeWFuXCIgLT4gTGlnaHRjeWFuXG4gICAgfCBcImxpZ2h0Z29sZGVucm9keWVsbG93XCIgLT4gTGlnaHRnb2xkZW5yb2R5ZWxsb3dcbiAgICB8IFwibGlnaHRncmF5XCIgLT4gTGlnaHRncmF5XG4gICAgfCBcImxpZ2h0Z3JlZW5cIiAtPiBMaWdodGdyZWVuXG4gICAgfCBcImxpZ2h0Z3JleVwiIC0+IExpZ2h0Z3JleVxuICAgIHwgXCJsaWdodHBpbmtcIiAtPiBMaWdodHBpbmtcbiAgICB8IFwibGlnaHRzYWxtb25cIiAtPiBMaWdodHNhbG1vblxuICAgIHwgXCJsaWdodHNlYWdyZWVuXCIgLT4gTGlnaHRzZWFncmVlblxuICAgIHwgXCJsaWdodHNreWJsdWVcIiAtPiBMaWdodHNreWJsdWVcbiAgICB8IFwibGlnaHRzbGF0ZWdyYXlcIiAtPiBMaWdodHNsYXRlZ3JheVxuICAgIHwgXCJsaWdodHNsYXRlZ3JleVwiIC0+IExpZ2h0c2xhdGVncmV5XG4gICAgfCBcImxpZ2h0c3RlZWxibHVlXCIgLT4gTGlnaHRzdGVlbGJsdWVcbiAgICB8IFwibGlnaHR5ZWxsb3dcIiAtPiBMaWdodHllbGxvd1xuICAgIHwgXCJsaW1lXCIgLT4gTGltZVxuICAgIHwgXCJsaW1lZ3JlZW5cIiAtPiBMaW1lZ3JlZW5cbiAgICB8IFwibGluZW5cIiAtPiBMaW5lblxuICAgIHwgXCJtYWdlbnRhXCIgLT4gTWFnZW50YVxuICAgIHwgXCJtYXJvb25cIiAtPiBNYXJvb25cbiAgICB8IFwibWVkaXVtYXF1YW1hcmluZVwiIC0+IE1lZGl1bWFxdWFtYXJpbmVcbiAgICB8IFwibWVkaXVtYmx1ZVwiIC0+IE1lZGl1bWJsdWVcbiAgICB8IFwibWVkaXVtb3JjaGlkXCIgLT4gTWVkaXVtb3JjaGlkXG4gICAgfCBcIm1lZGl1bXB1cnBsZVwiIC0+IE1lZGl1bXB1cnBsZVxuICAgIHwgXCJtZWRpdW1zZWFncmVlblwiIC0+IE1lZGl1bXNlYWdyZWVuXG4gICAgfCBcIm1lZGl1bXNsYXRlYmx1ZVwiIC0+IE1lZGl1bXNsYXRlYmx1ZVxuICAgIHwgXCJtZWRpdW1zcHJpbmdncmVlblwiIC0+IE1lZGl1bXNwcmluZ2dyZWVuXG4gICAgfCBcIm1lZGl1bXR1cnF1b2lzZVwiIC0+IE1lZGl1bXR1cnF1b2lzZVxuICAgIHwgXCJtZWRpdW12aW9sZXRyZWRcIiAtPiBNZWRpdW12aW9sZXRyZWRcbiAgICB8IFwibWlkbmlnaHRibHVlXCIgLT4gTWlkbmlnaHRibHVlXG4gICAgfCBcIm1pbnRjcmVhbVwiIC0+IE1pbnRjcmVhbVxuICAgIHwgXCJtaXN0eXJvc2VcIiAtPiBNaXN0eXJvc2VcbiAgICB8IFwibW9jY2FzaW5cIiAtPiBNb2NjYXNpblxuICAgIHwgXCJuYXZham93aGl0ZVwiIC0+IE5hdmFqb3doaXRlXG4gICAgfCBcIm5hdnlcIiAtPiBOYXZ5XG4gICAgfCBcIm9sZGxhY2VcIiAtPiBPbGRsYWNlXG4gICAgfCBcIm9saXZlXCIgLT4gT2xpdmVcbiAgICB8IFwib2xpdmVkcmFiXCIgLT4gT2xpdmVkcmFiXG4gICAgfCBcIm9yYW5nZVwiIC0+IE9yYW5nZVxuICAgIHwgXCJvcmFuZ2VyZWRcIiAtPiBPcmFuZ2VyZWRcbiAgICB8IFwib3JjaGlkXCIgLT4gT3JjaGlkXG4gICAgfCBcInBhbGVnb2xkZW5yb2RcIiAtPiBQYWxlZ29sZGVucm9kXG4gICAgfCBcInBhbGVncmVlblwiIC0+IFBhbGVncmVlblxuICAgIHwgXCJwYWxldHVycXVvaXNlXCIgLT4gUGFsZXR1cnF1b2lzZVxuICAgIHwgXCJwYWxldmlvbGV0cmVkXCIgLT4gUGFsZXZpb2xldHJlZFxuICAgIHwgXCJwYXBheWF3aGlwXCIgLT4gUGFwYXlhd2hpcFxuICAgIHwgXCJwZWFjaHB1ZmZcIiAtPiBQZWFjaHB1ZmZcbiAgICB8IFwicGVydVwiIC0+IFBlcnVcbiAgICB8IFwicGlua1wiIC0+IFBpbmtcbiAgICB8IFwicGx1bVwiIC0+IFBsdW1cbiAgICB8IFwicG93ZGVyYmx1ZVwiIC0+IFBvd2RlcmJsdWVcbiAgICB8IFwicHVycGxlXCIgLT4gUHVycGxlXG4gICAgfCBcInJlZFwiIC0+IFJlZFxuICAgIHwgXCJyb3N5YnJvd25cIiAtPiBSb3N5YnJvd25cbiAgICB8IFwicm95YWxibHVlXCIgLT4gUm95YWxibHVlXG4gICAgfCBcInNhZGRsZWJyb3duXCIgLT4gU2FkZGxlYnJvd25cbiAgICB8IFwic2FsbW9uXCIgLT4gU2FsbW9uXG4gICAgfCBcInNhbmR5YnJvd25cIiAtPiBTYW5keWJyb3duXG4gICAgfCBcInNlYWdyZWVuXCIgLT4gU2VhZ3JlZW5cbiAgICB8IFwic2Vhc2hlbGxcIiAtPiBTZWFzaGVsbFxuICAgIHwgXCJzaWVubmFcIiAtPiBTaWVubmFcbiAgICB8IFwic2lsdmVyXCIgLT4gU2lsdmVyXG4gICAgfCBcInNreWJsdWVcIiAtPiBTa3libHVlXG4gICAgfCBcInNsYXRlYmx1ZVwiIC0+IFNsYXRlYmx1ZVxuICAgIHwgXCJzbGF0ZWdyYXlcIiAtPiBTbGF0ZWdyYXlcbiAgICB8IFwic2xhdGVncmV5XCIgLT4gU2xhdGVncmV5XG4gICAgfCBcInNub3dcIiAtPiBTbm93XG4gICAgfCBcInNwcmluZ2dyZWVuXCIgLT4gU3ByaW5nZ3JlZW5cbiAgICB8IFwic3RlZWxibHVlXCIgLT4gU3RlZWxibHVlXG4gICAgfCBcInRhblwiIC0+IFRhblxuICAgIHwgXCJ0ZWFsXCIgLT4gVGVhbFxuICAgIHwgXCJ0aGlzdGxlXCIgLT4gVGhpc3RsZVxuICAgIHwgXCJ0b21hdG9cIiAtPiBUb21hdG9cbiAgICB8IFwidHVycXVvaXNlXCIgLT4gVHVycXVvaXNlXG4gICAgfCBcInZpb2xldFwiIC0+IFZpb2xldFxuICAgIHwgXCJ3aGVhdFwiIC0+IFdoZWF0XG4gICAgfCBcIndoaXRlXCIgLT4gV2hpdGVcbiAgICB8IFwid2hpdGVzbW9rZVwiIC0+IFdoaXRlc21va2VcbiAgICB8IFwieWVsbG93XCIgLT4gWWVsbG93XG4gICAgfCBcInllbGxvd2dyZWVuXCIgLT4gWWVsbG93Z3JlZW5cbiAgICB8IHMgLT4gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKHMgXiBcIiBpcyBub3QgYSB2YWxpZCBjb2xvciBuYW1lXCIpKVxuXG4gIGxldCByZ2Jfb2ZfbmFtZSA9IGZ1bmN0aW9uXG4gICAgfCBBbGljZWJsdWUgLT4gMjQwLCAyNDgsIDI1NVxuICAgIHwgQW50aXF1ZXdoaXRlIC0+IDI1MCwgMjM1LCAyMTVcbiAgICB8IEFxdWEgLT4gMCwgMjU1LCAyNTVcbiAgICB8IEFxdWFtYXJpbmUgLT4gMTI3LCAyNTUsIDIxMlxuICAgIHwgQXp1cmUgLT4gMjQwLCAyNTUsIDI1NVxuICAgIHwgQmVpZ2UgLT4gMjQ1LCAyNDUsIDIyMFxuICAgIHwgQmlzcXVlIC0+IDI1NSwgMjI4LCAxOTZcbiAgICB8IEJsYWNrIC0+IDAsIDAsIDBcbiAgICB8IEJsYW5jaGVkYWxtb25kIC0+IDI1NSwgMjM1LCAyMDVcbiAgICB8IEJsdWUgLT4gMCwgMCwgMjU1XG4gICAgfCBCbHVldmlvbGV0IC0+IDEzOCwgNDMsIDIyNlxuICAgIHwgQnJvd24gLT4gMTY1LCA0MiwgNDJcbiAgICB8IEJ1cmx5d29vZCAtPiAyMjIsIDE4NCwgMTM1XG4gICAgfCBDYWRldGJsdWUgLT4gOTUsIDE1OCwgMTYwXG4gICAgfCBDaGFydHJldXNlIC0+IDEyNywgMjU1LCAwXG4gICAgfCBDaG9jb2xhdGUgLT4gMjEwLCAxMDUsIDMwXG4gICAgfCBDb3JhbCAtPiAyNTUsIDEyNywgODBcbiAgICB8IENvcm5mbG93ZXJibHVlIC0+IDEwMCwgMTQ5LCAyMzdcbiAgICB8IENvcm5zaWxrIC0+IDI1NSwgMjQ4LCAyMjBcbiAgICB8IENyaW1zb24gLT4gMjIwLCAyMCwgNjBcbiAgICB8IEN5YW4gLT4gMCwgMjU1LCAyNTVcbiAgICB8IERhcmtibHVlIC0+IDAsIDAsIDEzOVxuICAgIHwgRGFya2N5YW4gLT4gMCwgMTM5LCAxMzlcbiAgICB8IERhcmtnb2xkZW5yb2QgLT4gMTg0LCAxMzQsIDExXG4gICAgfCBEYXJrZ3JheSAtPiAxNjksIDE2OSwgMTY5XG4gICAgfCBEYXJrZ3JlZW4gLT4gMCwgMTAwLCAwXG4gICAgfCBEYXJrZ3JleSAtPiAxNjksIDE2OSwgMTY5XG4gICAgfCBEYXJra2hha2kgLT4gMTg5LCAxODMsIDEwN1xuICAgIHwgRGFya21hZ2VudGEgLT4gMTM5LCAwLCAxMzlcbiAgICB8IERhcmtvbGl2ZWdyZWVuIC0+IDg1LCAxMDcsIDQ3XG4gICAgfCBEYXJrb3JhbmdlIC0+IDI1NSwgMTQwLCAwXG4gICAgfCBEYXJrb3JjaGlkIC0+IDE1MywgNTAsIDIwNFxuICAgIHwgRGFya3JlZCAtPiAxMzksIDAsIDBcbiAgICB8IERhcmtzYWxtb24gLT4gMjMzLCAxNTAsIDEyMlxuICAgIHwgRGFya3NlYWdyZWVuIC0+IDE0MywgMTg4LCAxNDNcbiAgICB8IERhcmtzbGF0ZWJsdWUgLT4gNzIsIDYxLCAxMzlcbiAgICB8IERhcmtzbGF0ZWdyYXkgLT4gNDcsIDc5LCA3OVxuICAgIHwgRGFya3NsYXRlZ3JleSAtPiA0NywgNzksIDc5XG4gICAgfCBEYXJrdHVycXVvaXNlIC0+IDAsIDIwNiwgMjA5XG4gICAgfCBEYXJrdmlvbGV0IC0+IDE0OCwgMCwgMjExXG4gICAgfCBEZWVwcGluayAtPiAyNTUsIDIwLCAxNDdcbiAgICB8IERlZXBza3libHVlIC0+IDAsIDE5MSwgMjU1XG4gICAgfCBEaW1ncmF5IC0+IDEwNSwgMTA1LCAxMDVcbiAgICB8IERpbWdyZXkgLT4gMTA1LCAxMDUsIDEwNVxuICAgIHwgRG9kZ2VyYmx1ZSAtPiAzMCwgMTQ0LCAyNTVcbiAgICB8IEZpcmVicmljayAtPiAxNzgsIDM0LCAzNFxuICAgIHwgRmxvcmFsd2hpdGUgLT4gMjU1LCAyNTAsIDI0MFxuICAgIHwgRm9yZXN0Z3JlZW4gLT4gMzQsIDEzOSwgMzRcbiAgICB8IEZ1Y2hzaWEgLT4gMjU1LCAwLCAyNTVcbiAgICB8IEdhaW5zYm9ybyAtPiAyMjAsIDIyMCwgMjIwXG4gICAgfCBHaG9zdHdoaXRlIC0+IDI0OCwgMjQ4LCAyNTVcbiAgICB8IEdvbGQgLT4gMjU1LCAyMTUsIDBcbiAgICB8IEdvbGRlbnJvZCAtPiAyMTgsIDE2NSwgMzJcbiAgICB8IEdyYXkgLT4gMTI4LCAxMjgsIDEyOFxuICAgIHwgR3JlZW4gLT4gMCwgMTI4LCAwXG4gICAgfCBHcmVlbnllbGxvdyAtPiAxNzMsIDI1NSwgNDdcbiAgICB8IEdyZXkgLT4gMTI4LCAxMjgsIDEyOFxuICAgIHwgSG9uZXlkZXcgLT4gMjQwLCAyNTUsIDI0MFxuICAgIHwgSG90cGluayAtPiAyNTUsIDEwNSwgMTgwXG4gICAgfCBJbmRpYW5yZWQgLT4gMjA1LCA5MiwgOTJcbiAgICB8IEluZGlnbyAtPiA3NSwgMCwgMTMwXG4gICAgfCBJdm9yeSAtPiAyNTUsIDI1NSwgMjQwXG4gICAgfCBLaGFraSAtPiAyNDAsIDIzMCwgMTQwXG4gICAgfCBMYXZlbmRlciAtPiAyMzAsIDIzMCwgMjUwXG4gICAgfCBMYXZlbmRlcmJsdXNoIC0+IDI1NSwgMjQwLCAyNDVcbiAgICB8IExhd25ncmVlbiAtPiAxMjQsIDI1MiwgMFxuICAgIHwgTGVtb25jaGlmZm9uIC0+IDI1NSwgMjUwLCAyMDVcbiAgICB8IExpZ2h0Ymx1ZSAtPiAxNzMsIDIxNiwgMjMwXG4gICAgfCBMaWdodGNvcmFsIC0+IDI0MCwgMTI4LCAxMjhcbiAgICB8IExpZ2h0Y3lhbiAtPiAyMjQsIDI1NSwgMjU1XG4gICAgfCBMaWdodGdvbGRlbnJvZHllbGxvdyAtPiAyNTAsIDI1MCwgMjEwXG4gICAgfCBMaWdodGdyYXkgLT4gMjExLCAyMTEsIDIxMVxuICAgIHwgTGlnaHRncmVlbiAtPiAxNDQsIDIzOCwgMTQ0XG4gICAgfCBMaWdodGdyZXkgLT4gMjExLCAyMTEsIDIxMVxuICAgIHwgTGlnaHRwaW5rIC0+IDI1NSwgMTgyLCAxOTNcbiAgICB8IExpZ2h0c2FsbW9uIC0+IDI1NSwgMTYwLCAxMjJcbiAgICB8IExpZ2h0c2VhZ3JlZW4gLT4gMzIsIDE3OCwgMTcwXG4gICAgfCBMaWdodHNreWJsdWUgLT4gMTM1LCAyMDYsIDI1MFxuICAgIHwgTGlnaHRzbGF0ZWdyYXkgLT4gMTE5LCAxMzYsIDE1M1xuICAgIHwgTGlnaHRzbGF0ZWdyZXkgLT4gMTE5LCAxMzYsIDE1M1xuICAgIHwgTGlnaHRzdGVlbGJsdWUgLT4gMTc2LCAxOTYsIDIyMlxuICAgIHwgTGlnaHR5ZWxsb3cgLT4gMjU1LCAyNTUsIDIyNFxuICAgIHwgTGltZSAtPiAwLCAyNTUsIDBcbiAgICB8IExpbWVncmVlbiAtPiA1MCwgMjA1LCA1MFxuICAgIHwgTGluZW4gLT4gMjUwLCAyNDAsIDIzMFxuICAgIHwgTWFnZW50YSAtPiAyNTUsIDAsIDI1NVxuICAgIHwgTWFyb29uIC0+IDEyOCwgMCwgMFxuICAgIHwgTWVkaXVtYXF1YW1hcmluZSAtPiAxMDIsIDIwNSwgMTcwXG4gICAgfCBNZWRpdW1ibHVlIC0+IDAsIDAsIDIwNVxuICAgIHwgTWVkaXVtb3JjaGlkIC0+IDE4NiwgODUsIDIxMVxuICAgIHwgTWVkaXVtcHVycGxlIC0+IDE0NywgMTEyLCAyMTlcbiAgICB8IE1lZGl1bXNlYWdyZWVuIC0+IDYwLCAxNzksIDExM1xuICAgIHwgTWVkaXVtc2xhdGVibHVlIC0+IDEyMywgMTA0LCAyMzhcbiAgICB8IE1lZGl1bXNwcmluZ2dyZWVuIC0+IDAsIDI1MCwgMTU0XG4gICAgfCBNZWRpdW10dXJxdW9pc2UgLT4gNzIsIDIwOSwgMjA0XG4gICAgfCBNZWRpdW12aW9sZXRyZWQgLT4gMTk5LCAyMSwgMTMzXG4gICAgfCBNaWRuaWdodGJsdWUgLT4gMjUsIDI1LCAxMTJcbiAgICB8IE1pbnRjcmVhbSAtPiAyNDUsIDI1NSwgMjUwXG4gICAgfCBNaXN0eXJvc2UgLT4gMjU1LCAyMjgsIDIyNVxuICAgIHwgTW9jY2FzaW4gLT4gMjU1LCAyMjgsIDE4MVxuICAgIHwgTmF2YWpvd2hpdGUgLT4gMjU1LCAyMjIsIDE3M1xuICAgIHwgTmF2eSAtPiAwLCAwLCAxMjhcbiAgICB8IE9sZGxhY2UgLT4gMjUzLCAyNDUsIDIzMFxuICAgIHwgT2xpdmUgLT4gMTI4LCAxMjgsIDBcbiAgICB8IE9saXZlZHJhYiAtPiAxMDcsIDE0MiwgMzVcbiAgICB8IE9yYW5nZSAtPiAyNTUsIDE2NSwgMFxuICAgIHwgT3JhbmdlcmVkIC0+IDI1NSwgNjksIDBcbiAgICB8IE9yY2hpZCAtPiAyMTgsIDExMiwgMjE0XG4gICAgfCBQYWxlZ29sZGVucm9kIC0+IDIzOCwgMjMyLCAxNzBcbiAgICB8IFBhbGVncmVlbiAtPiAxNTIsIDI1MSwgMTUyXG4gICAgfCBQYWxldHVycXVvaXNlIC0+IDE3NSwgMjM4LCAyMzhcbiAgICB8IFBhbGV2aW9sZXRyZWQgLT4gMjE5LCAxMTIsIDE0N1xuICAgIHwgUGFwYXlhd2hpcCAtPiAyNTUsIDIzOSwgMjEzXG4gICAgfCBQZWFjaHB1ZmYgLT4gMjU1LCAyMTgsIDE4NVxuICAgIHwgUGVydSAtPiAyMDUsIDEzMywgNjNcbiAgICB8IFBpbmsgLT4gMjU1LCAxOTIsIDIwM1xuICAgIHwgUGx1bSAtPiAyMjEsIDE2MCwgMjIxXG4gICAgfCBQb3dkZXJibHVlIC0+IDE3NiwgMjI0LCAyMzBcbiAgICB8IFB1cnBsZSAtPiAxMjgsIDAsIDEyOFxuICAgIHwgUmVkIC0+IDI1NSwgMCwgMFxuICAgIHwgUm9zeWJyb3duIC0+IDE4OCwgMTQzLCAxNDNcbiAgICB8IFJveWFsYmx1ZSAtPiA2NSwgMTA1LCAyMjVcbiAgICB8IFNhZGRsZWJyb3duIC0+IDEzOSwgNjksIDE5XG4gICAgfCBTYWxtb24gLT4gMjUwLCAxMjgsIDExNFxuICAgIHwgU2FuZHlicm93biAtPiAyNDQsIDE2NCwgOTZcbiAgICB8IFNlYWdyZWVuIC0+IDQ2LCAxMzksIDg3XG4gICAgfCBTZWFzaGVsbCAtPiAyNTUsIDI0NSwgMjM4XG4gICAgfCBTaWVubmEgLT4gMTYwLCA4MiwgNDVcbiAgICB8IFNpbHZlciAtPiAxOTIsIDE5MiwgMTkyXG4gICAgfCBTa3libHVlIC0+IDEzNSwgMjA2LCAyMzVcbiAgICB8IFNsYXRlYmx1ZSAtPiAxMDYsIDkwLCAyMDVcbiAgICB8IFNsYXRlZ3JheSAtPiAxMTIsIDEyOCwgMTQ0XG4gICAgfCBTbGF0ZWdyZXkgLT4gMTEyLCAxMjgsIDE0NFxuICAgIHwgU25vdyAtPiAyNTUsIDI1MCwgMjUwXG4gICAgfCBTcHJpbmdncmVlbiAtPiAwLCAyNTUsIDEyN1xuICAgIHwgU3RlZWxibHVlIC0+IDcwLCAxMzAsIDE4MFxuICAgIHwgVGFuIC0+IDIxMCwgMTgwLCAxNDBcbiAgICB8IFRlYWwgLT4gMCwgMTI4LCAxMjhcbiAgICB8IFRoaXN0bGUgLT4gMjE2LCAxOTEsIDIxNlxuICAgIHwgVG9tYXRvIC0+IDI1NSwgOTksIDcxXG4gICAgfCBUdXJxdW9pc2UgLT4gNjQsIDIyNCwgMjA4XG4gICAgfCBWaW9sZXQgLT4gMjM4LCAxMzAsIDIzOFxuICAgIHwgV2hlYXQgLT4gMjQ1LCAyMjIsIDE3OVxuICAgIHwgV2hpdGUgLT4gMjU1LCAyNTUsIDI1NVxuICAgIHwgV2hpdGVzbW9rZSAtPiAyNDUsIDI0NSwgMjQ1XG4gICAgfCBZZWxsb3cgLT4gMjU1LCAyNTUsIDBcbiAgICB8IFllbGxvd2dyZWVuIC0+IDE1NCwgMjA1LCA1MFxuXG4gIHR5cGUgdCA9XG4gICAgfCBOYW1lIG9mIG5hbWVcbiAgICB8IFJHQiBvZiAoaW50ICogaW50ICogaW50KVxuICAgICAgICAoKiogUmVkLCBHcmVlbiBhbmQgQmx1ZSB2YWx1ZXMuIENsaXBwZWQgdG8gW1swLi4yNTVdXSBieSBtb3N0IChBbGw/KVxuICAgICAgICAgICAgYnJvd3NlcnMuICopXG4gICAgfCBSR0JfcGVyY2VudCBvZiAoaW50ICogaW50ICogaW50KVxuICAgICAgICAoKiogUkdCIGNoYW5uZWxzIGFyZSBzcGVjaWZpZWQgYXMgYSBwZXJjZW50YWdlIG9mIHRoZWlyIG1heGltYWwgdmFsdWUuICopXG4gICAgfCBSR0JBIG9mIChpbnQgKiBpbnQgKiBpbnQgKiBmbG9hdClcbiAgICAgICAgKCoqIFNhbWUgYXMgUkdCIHdpdGggYWRkaXRpb25hbCB0cmFuc3BhcmVuY3kgYXJndW1lbnQuIE9wYWNpdHkgc2hvdWxkIGJlIGluXG4gICAgICAgICAgICBbMC5dIChjb21wbGV0ZWx5IHRyYW5zcGFyZW50KSBhbmQgWzEuXSAoY29tcGxldGVseSBvcGFxdWUpLiAqKVxuICAgIHwgUkdCQV9wZXJjZW50IG9mIChpbnQgKiBpbnQgKiBpbnQgKiBmbG9hdClcbiAgICAgICAgKCoqIFJHQiBjaGFubmVscyBzcGVjaWZpZWQgYXMgcGVyY2VudGFnZSBvZiB0aGVpciBtYXhpbWFsIHZhbHVlLiBBbHBoYVxuICAgICAgICAgICAgY2hhbm5lbCAob3BhY2l0eSkgaXMgc3RpbGwgYSBbMC5dIHRvIFsxLl0gZmxvYXQuICopXG4gICAgfCBIU0wgb2YgKGludCAqIGludCAqIGludClcbiAgICAgICAgKCoqIEh1ZSwgU2F0dXJhdGlvbiBhbmQgTGlnaHRuZXNzIHZhbHVlcy4gSHVlIGlzIGFuIGFuZ2xlIGluIGRlZ3JlZSAoaW5cbiAgICAgICAgICAgIGludGVydmFsIFtbMC4uMzYwW10pLiBTYXR1cmF0aW9uIGlzIGEgcGVyY2VudGFnZSAoW1swLi4xMDBdXSkgd2l0aCBbMF1cbiAgICAgICAgICAgIGJlaW5nIGNvbG9ybGVzcy4gTGlnaHRuZXNzIGlzIGFsc28gYSBwZXJjZW50YWdlIChbWzAuLjEwMF1dKSB3aXRoIFswXVxuICAgICAgICAgICAgYmVpbmcgYmxhY2suICopXG4gICAgfCBIU0xBIG9mIChpbnQgKiBpbnQgKiBpbnQgKiBmbG9hdClcbiAgICAgICAgKCoqIFNhbWUgYXMgSFNMIHdpdGggYW4gb3BhY2l0eSBhcmd1bWVudCBiZXR3ZWVuIFswLl0gYW5kIFsxLl0uICopXG5cbiAgbGV0IHJnYiA/YSByIGcgYiA9XG4gICAgbWF0Y2ggYSB3aXRoXG4gICAgfCBOb25lIC0+IFJHQiAociwgZywgYilcbiAgICB8IFNvbWUgYSAtPiBSR0JBIChyLCBnLCBiLCBhKVxuXG4gIGxldCBoc2wgP2EgaCBzIGwgPVxuICAgIG1hdGNoIGEgd2l0aFxuICAgIHwgTm9uZSAtPiBIU0wgKGgsIHMsIGwpXG4gICAgfCBTb21lIGEgLT4gSFNMQSAoaCwgcywgbCwgYSlcblxuICBsZXQgc3RyaW5nX29mX3QgPSBmdW5jdGlvblxuICAgIHwgTmFtZSBuIC0+IHN0cmluZ19vZl9uYW1lIG5cbiAgICB8IFJHQiAociwgZywgYikgLT4gUHJpbnRmLnNwcmludGYgXCJyZ2IoJWQsJWQsJWQpXCIgciBnIGJcbiAgICB8IFJHQl9wZXJjZW50IChyLCBnLCBiKSAtPiBQcmludGYuc3ByaW50ZiBcInJnYiglZCUlLCVkJSUsJWQlJSlcIiByIGcgYlxuICAgIHwgUkdCQSAociwgZywgYiwgYSkgLT4gUHJpbnRmLnNwcmludGYgXCJyZ2JhKCVkLCVkLCVkLCVmKVwiIHIgZyBiIGFcbiAgICB8IFJHQkFfcGVyY2VudCAociwgZywgYiwgYSkgLT4gUHJpbnRmLnNwcmludGYgXCJyZ2JhKCVkJSUsJWQlJSwlZCUlLCVmKVwiIHIgZyBiIGFcbiAgICB8IEhTTCAoaCwgcywgbCkgLT4gUHJpbnRmLnNwcmludGYgXCJoc2woJWQsJWQlJSwlZCUlKVwiIGggcyBsXG4gICAgfCBIU0xBIChoLCBzLCBsLCBhKSAtPiBQcmludGYuc3ByaW50ZiBcImhzbGEoJWQsJWQlJSwlZCUlLCVmKVwiIGggcyBsIGFcblxuICBsZXQgaGV4X29mX3JnYiAocmVkLCBncmVlbiwgYmx1ZSkgPVxuICAgIGxldCBpbl9yYW5nZSBpID1cbiAgICAgIGlmIGkgPCAwIHx8IGkgPiAyNTVcbiAgICAgIHRoZW4gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKHN0cmluZ19vZl9pbnQgaSBeIFwiIGlzIG91dCBvZiB2YWxpZCByYW5nZVwiKSlcbiAgICBpblxuICAgIGluX3JhbmdlIHJlZDtcbiAgICBpbl9yYW5nZSBncmVlbjtcbiAgICBpbl9yYW5nZSBibHVlO1xuICAgIFByaW50Zi5zcHJpbnRmIFwiIyUwMlglMDJYJTAyWFwiIHJlZCBncmVlbiBibHVlXG5cbiAgKCogT2NhbWwgPC0+IEpTIHJlcHJlc2VudGF0aW9uICopXG4gIHR5cGUganNfdCA9IEpzLmpzX3N0cmluZyBKcy50XG5cbiAgKCogVE9ETz8gYmUgbW9yZSByZXN0cmljdGl2ZSwgY2xpcCB2YWx1ZXMgaW50byBzdGFuZGFyZCByYW5nZSAqKVxuICBsZXQganNfdF9vZl9qc19zdHJpbmcgcyA9XG4gICAgbGV0IHJnYl9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwIChKcy5ieXRlc3RyaW5nIFwiXnJnYlxcXFwoXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKixcXFxccypcXFxcZCpcXFxcKSRcIilcbiAgICBpblxuICAgIGxldCByZ2JfcGN0X3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHAgKEpzLmJ5dGVzdHJpbmcgXCJecmdiXFxcXChcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJVxcXFwpJFwiKVxuICAgIGluXG4gICAgbGV0IHJnYmFfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cFxuICAgICAgICAoSnMuYnl0ZXN0cmluZyBcIl5yZ2JhXFxcXChcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKixcXFxcZCpcXFxcLj9cXFxcZCpcXFxcKSRcIilcbiAgICBpblxuICAgIGxldCByZ2JhX3BjdF9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwXG4gICAgICAgIChKcy5ieXRlc3RyaW5nIFwiXnJnYmFcXFxcKFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColLFxcXFxkKlxcXFwuP1xcXFxkKlxcXFwpJFwiKVxuICAgIGluXG4gICAgbGV0IGhzbF9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwIChKcy5ieXRlc3RyaW5nIFwiXmhzbFxcXFwoXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJVxcXFwpJFwiKVxuICAgIGluXG4gICAgbGV0IGhzbGFfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cFxuICAgICAgICAoSnMuYnl0ZXN0cmluZyBcIl5oc2xhXFxcXChcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColLFxcXFxkKlxcXFwuP1xcXFxkKlxcXFwpJFwiKVxuICAgIGluXG4gICAgaWYgSnMudG9fYm9vbCAocmdiX3JlIyN0ZXN0IHMpXG4gICAgICAgfHwgSnMudG9fYm9vbCAocmdiYV9yZSMjdGVzdCBzKVxuICAgICAgIHx8IEpzLnRvX2Jvb2wgKHJnYl9wY3RfcmUjI3Rlc3QgcylcbiAgICAgICB8fCBKcy50b19ib29sIChyZ2JhX3BjdF9yZSMjdGVzdCBzKVxuICAgICAgIHx8IEpzLnRvX2Jvb2wgKGhzbF9yZSMjdGVzdCBzKVxuICAgICAgIHx8IEpzLnRvX2Jvb2wgKGhzbGFfcmUjI3Rlc3QgcylcbiAgICB0aGVuIHNcbiAgICBlbHNlIGlmIExpc3QubWVtXG4gICAgICAgICAgICAgIChKcy50b19zdHJpbmcgcylcbiAgICAgICAgICAgICAgWyBcImFsaWNlYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJhbnRpcXVld2hpdGVcIlxuICAgICAgICAgICAgICA7IFwiYXF1YVwiXG4gICAgICAgICAgICAgIDsgXCJhcXVhbWFyaW5lXCJcbiAgICAgICAgICAgICAgOyBcImF6dXJlXCJcbiAgICAgICAgICAgICAgOyBcImJlaWdlXCJcbiAgICAgICAgICAgICAgOyBcImJpc3F1ZVwiXG4gICAgICAgICAgICAgIDsgXCJibGFja1wiXG4gICAgICAgICAgICAgIDsgXCJibGFuY2hlZGFsbW9uZFwiXG4gICAgICAgICAgICAgIDsgXCJibHVlXCJcbiAgICAgICAgICAgICAgOyBcImJsdWV2aW9sZXRcIlxuICAgICAgICAgICAgICA7IFwiYnJvd25cIlxuICAgICAgICAgICAgICA7IFwiYnVybHl3b29kXCJcbiAgICAgICAgICAgICAgOyBcImNhZGV0Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJjaGFydHJldXNlXCJcbiAgICAgICAgICAgICAgOyBcImNob2NvbGF0ZVwiXG4gICAgICAgICAgICAgIDsgXCJjb3JhbFwiXG4gICAgICAgICAgICAgIDsgXCJjb3JuZmxvd2VyYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJjb3Juc2lsa1wiXG4gICAgICAgICAgICAgIDsgXCJjcmltc29uXCJcbiAgICAgICAgICAgICAgOyBcImN5YW5cIlxuICAgICAgICAgICAgICA7IFwiZGFya2JsdWVcIlxuICAgICAgICAgICAgICA7IFwiZGFya2N5YW5cIlxuICAgICAgICAgICAgICA7IFwiZGFya2dvbGRlbnJvZFwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwiZGFya2dyZXlcIlxuICAgICAgICAgICAgICA7IFwiZGFya2toYWtpXCJcbiAgICAgICAgICAgICAgOyBcImRhcmttYWdlbnRhXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtvbGl2ZWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtvcmFuZ2VcIlxuICAgICAgICAgICAgICA7IFwiZGFya29yY2hpZFwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrcmVkXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtzYWxtb25cIlxuICAgICAgICAgICAgICA7IFwiZGFya3NlYWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtzbGF0ZWJsdWVcIlxuICAgICAgICAgICAgICA7IFwiZGFya3NsYXRlZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrc2xhdGVncmV5XCJcbiAgICAgICAgICAgICAgOyBcImRhcmt0dXJxdW9pc2VcIlxuICAgICAgICAgICAgICA7IFwiZGFya3Zpb2xldFwiXG4gICAgICAgICAgICAgIDsgXCJkZWVwcGlua1wiXG4gICAgICAgICAgICAgIDsgXCJkZWVwc2t5Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJkaW1ncmF5XCJcbiAgICAgICAgICAgICAgOyBcImRpbWdyZXlcIlxuICAgICAgICAgICAgICA7IFwiZG9kZ2VyYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJmaXJlYnJpY2tcIlxuICAgICAgICAgICAgICA7IFwiZmxvcmFsd2hpdGVcIlxuICAgICAgICAgICAgICA7IFwiZm9yZXN0Z3JlZW5cIlxuICAgICAgICAgICAgICA7IFwiZnVjaHNpYVwiXG4gICAgICAgICAgICAgIDsgXCJnYWluc2Jvcm9cIlxuICAgICAgICAgICAgICA7IFwiZ2hvc3R3aGl0ZVwiXG4gICAgICAgICAgICAgIDsgXCJnb2xkXCJcbiAgICAgICAgICAgICAgOyBcImdvbGRlbnJvZFwiXG4gICAgICAgICAgICAgIDsgXCJncmF5XCJcbiAgICAgICAgICAgICAgOyBcImdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImdyZWVueWVsbG93XCJcbiAgICAgICAgICAgICAgOyBcImdyZXlcIlxuICAgICAgICAgICAgICA7IFwiaG9uZXlkZXdcIlxuICAgICAgICAgICAgICA7IFwiaG90cGlua1wiXG4gICAgICAgICAgICAgIDsgXCJpbmRpYW5yZWRcIlxuICAgICAgICAgICAgICA7IFwiaW5kaWdvXCJcbiAgICAgICAgICAgICAgOyBcIml2b3J5XCJcbiAgICAgICAgICAgICAgOyBcImtoYWtpXCJcbiAgICAgICAgICAgICAgOyBcImxhdmVuZGVyXCJcbiAgICAgICAgICAgICAgOyBcImxhdmVuZGVyYmx1c2hcIlxuICAgICAgICAgICAgICA7IFwibGF3bmdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImxlbW9uY2hpZmZvblwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGJsdWVcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRjb3JhbFwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGN5YW5cIlxuICAgICAgICAgICAgICA7IFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRncmF5XCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Z3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibGlnaHRncmV5XCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0cGlua1wiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHNhbG1vblwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHNlYWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c2t5Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHNsYXRlZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHNsYXRlZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHN0ZWVsYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHllbGxvd1wiXG4gICAgICAgICAgICAgIDsgXCJsaW1lXCJcbiAgICAgICAgICAgICAgOyBcImxpbWVncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJsaW5lblwiXG4gICAgICAgICAgICAgIDsgXCJtYWdlbnRhXCJcbiAgICAgICAgICAgICAgOyBcIm1hcm9vblwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1hcXVhbWFyaW5lXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bWJsdWVcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtb3JjaGlkXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXB1cnBsZVwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1zZWFncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1zbGF0ZWJsdWVcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtc3ByaW5nZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtdHVycXVvaXNlXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXZpb2xldHJlZFwiXG4gICAgICAgICAgICAgIDsgXCJtaWRuaWdodGJsdWVcIlxuICAgICAgICAgICAgICA7IFwibWludGNyZWFtXCJcbiAgICAgICAgICAgICAgOyBcIm1pc3R5cm9zZVwiXG4gICAgICAgICAgICAgIDsgXCJtb2NjYXNpblwiXG4gICAgICAgICAgICAgIDsgXCJuYXZham93aGl0ZVwiXG4gICAgICAgICAgICAgIDsgXCJuYXZ5XCJcbiAgICAgICAgICAgICAgOyBcIm9sZGxhY2VcIlxuICAgICAgICAgICAgICA7IFwib2xpdmVcIlxuICAgICAgICAgICAgICA7IFwib2xpdmVkcmFiXCJcbiAgICAgICAgICAgICAgOyBcIm9yYW5nZVwiXG4gICAgICAgICAgICAgIDsgXCJvcmFuZ2VyZWRcIlxuICAgICAgICAgICAgICA7IFwib3JjaGlkXCJcbiAgICAgICAgICAgICAgOyBcInBhbGVnb2xkZW5yb2RcIlxuICAgICAgICAgICAgICA7IFwicGFsZWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcInBhbGV0dXJxdW9pc2VcIlxuICAgICAgICAgICAgICA7IFwicGFsZXZpb2xldHJlZFwiXG4gICAgICAgICAgICAgIDsgXCJwYXBheWF3aGlwXCJcbiAgICAgICAgICAgICAgOyBcInBlYWNocHVmZlwiXG4gICAgICAgICAgICAgIDsgXCJwZXJ1XCJcbiAgICAgICAgICAgICAgOyBcInBpbmtcIlxuICAgICAgICAgICAgICA7IFwicGx1bVwiXG4gICAgICAgICAgICAgIDsgXCJwb3dkZXJibHVlXCJcbiAgICAgICAgICAgICAgOyBcInB1cnBsZVwiXG4gICAgICAgICAgICAgIDsgXCJyZWRcIlxuICAgICAgICAgICAgICA7IFwicm9zeWJyb3duXCJcbiAgICAgICAgICAgICAgOyBcInJveWFsYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJzYWRkbGVicm93blwiXG4gICAgICAgICAgICAgIDsgXCJzYWxtb25cIlxuICAgICAgICAgICAgICA7IFwic2FuZHlicm93blwiXG4gICAgICAgICAgICAgIDsgXCJzZWFncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJzZWFzaGVsbFwiXG4gICAgICAgICAgICAgIDsgXCJzaWVubmFcIlxuICAgICAgICAgICAgICA7IFwic2lsdmVyXCJcbiAgICAgICAgICAgICAgOyBcInNreWJsdWVcIlxuICAgICAgICAgICAgICA7IFwic2xhdGVibHVlXCJcbiAgICAgICAgICAgICAgOyBcInNsYXRlZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJzbGF0ZWdyZXlcIlxuICAgICAgICAgICAgICA7IFwic25vd1wiXG4gICAgICAgICAgICAgIDsgXCJzcHJpbmdncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJzdGVlbGJsdWVcIlxuICAgICAgICAgICAgICA7IFwidGFuXCJcbiAgICAgICAgICAgICAgOyBcInRlYWxcIlxuICAgICAgICAgICAgICA7IFwidGhpc3RsZVwiXG4gICAgICAgICAgICAgIDsgXCJ0b21hdG9cIlxuICAgICAgICAgICAgICA7IFwidHVycXVvaXNlXCJcbiAgICAgICAgICAgICAgOyBcInZpb2xldFwiXG4gICAgICAgICAgICAgIDsgXCJ3aGVhdFwiXG4gICAgICAgICAgICAgIDsgXCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIDsgXCJ3aGl0ZXNtb2tlXCJcbiAgICAgICAgICAgICAgOyBcInllbGxvd1wiXG4gICAgICAgICAgICAgIDsgXCJ5ZWxsb3dncmVlblwiXG4gICAgICAgICAgICAgIF1cbiAgICB0aGVuIHNcbiAgICBlbHNlIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChKcy50b19zdHJpbmcgcyBeIFwiIGlzIG5vdCBhIHZhbGlkIGNvbG9yXCIpKVxuXG4gIGxldCBuYW1lIGNuID0gSnMuc3RyaW5nIChzdHJpbmdfb2ZfbmFtZSBjbilcblxuICBsZXQganMgPSBmdW5jdGlvblxuICAgIHwgTmFtZSBuIC0+IG5hbWUgblxuICAgIHwgKFJHQiBfIHwgUkdCX3BlcmNlbnQgXyB8IFJHQkEgXyB8IFJHQkFfcGVyY2VudCBfIHwgSFNMIF8gfCBIU0xBIF8pIGFzIGMgLT5cbiAgICAgICAgSnMuc3RyaW5nIChzdHJpbmdfb2ZfdCBjKVxuXG4gIGxldCBtbCBjID1cbiAgICBsZXQgcyA9IEpzLnRvX3N0cmluZyBjIGluXG4gICAgdHJ5IE5hbWUgKG5hbWVfb2Zfc3RyaW5nIHMpXG4gICAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IF8gLT4gKFxuICAgICAgbGV0IGZhaWwgKCkgPSByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAocyBeIFwiIGlzIG5vdCBhIHZhbGlkIGNvbG9yXCIpKSBpblxuICAgICAgbGV0IHJlX3JnYiA9XG4gICAgICAgIFJlZ2V4cC5yZWdleHAgXCIocmdiYT8pXFxcXCgoPzooXFxcXGQqKSwoXFxcXGQqKSwoXFxcXGQqKSg/OiwoXFxcXGQqKD86XFxcXC5cXFxcZCopPykpPylcXFxcKVwiXG4gICAgICBpblxuICAgICAgbGV0IHJlX3JnYl9wY3QgPVxuICAgICAgICBSZWdleHAucmVnZXhwIFwiKHJnYmE/KVxcXFwoKD86KFxcXFxkKiklLChcXFxcZCopJSwoXFxcXGQqKSUoPzosKFxcXFxkKig/OlxcXFwuXFxcXGQqKT8pKT8pXFxcXClcIlxuICAgICAgaW5cbiAgICAgIGxldCByZV9oc2wgPVxuICAgICAgICBSZWdleHAucmVnZXhwIFwiKGhzbGE/KVxcXFwoKD86KFxcXFxkKiksKFxcXFxkKiklLChcXFxcZCopJSg/OiwoXFxcXGQqKD86XFxcXC5cXFxcZCopPykpPylcXFxcKVwiXG4gICAgICBpblxuICAgICAgbGV0IGlfb2Zfc19vID0gZnVuY3Rpb25cbiAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgfCBTb21lIGkgLT4gKFxuICAgICAgICAgICAgdHJ5IGludF9vZl9zdHJpbmcgaVxuICAgICAgICAgICAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IHMgfCBGYWlsdXJlIHMgLT5cbiAgICAgICAgICAgICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKFwiY29sb3IgY29udmVyc2lvbiBlcnJvciAoXCIgXiBpIF4gXCIpOiBcIiBeIHMpKSlcbiAgICAgIGluXG4gICAgICBsZXQgZl9vZl9zIGYgPVxuICAgICAgICB0cnkgZmxvYXRfb2Zfc3RyaW5nIGZcbiAgICAgICAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IHMgfCBGYWlsdXJlIHMgLT5cbiAgICAgICAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoXCJjb2xvciBjb252ZXJzaW9uIGVycm9yIChcIiBeIGYgXiBcIik6IFwiIF4gcykpXG4gICAgICBpblxuICAgICAgbWF0Y2ggUmVnZXhwLnN0cmluZ19tYXRjaCByZV9yZ2IgcyAwIHdpdGhcbiAgICAgIHwgU29tZSByIC0+IChcbiAgICAgICAgICBsZXQgcmVkID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAyIGluXG4gICAgICAgICAgbGV0IGdyZWVuID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAzIGluXG4gICAgICAgICAgbGV0IGJsdWUgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDQgaW5cbiAgICAgICAgICBsZXQgYWxwaGEgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDUgaW5cbiAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDEgd2l0aFxuICAgICAgICAgIHwgU29tZSBcInJnYlwiIC0+IChcbiAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgXyAtPiBmYWlsICgpXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBSR0IgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUpKVxuICAgICAgICAgIHwgU29tZSBcInJnYmFcIiAtPiAoXG4gICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgfCBTb21lIGEgLT4gUkdCQSAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSwgZl9vZl9zIGEpKVxuICAgICAgICAgIHwgU29tZSBfIHwgTm9uZSAtPiBmYWlsICgpKVxuICAgICAgfCBOb25lIC0+IChcbiAgICAgICAgICBtYXRjaCBSZWdleHAuc3RyaW5nX21hdGNoIHJlX3JnYl9wY3QgcyAwIHdpdGhcbiAgICAgICAgICB8IFNvbWUgciAtPiAoXG4gICAgICAgICAgICAgIGxldCByZWQgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDIgaW5cbiAgICAgICAgICAgICAgbGV0IGdyZWVuID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAzIGluXG4gICAgICAgICAgICAgIGxldCBibHVlID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA0IGluXG4gICAgICAgICAgICAgIGxldCBhbHBoYSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNSBpblxuICAgICAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDEgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgXCJyZ2JcIiAtPiAoXG4gICAgICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPiBmYWlsICgpXG4gICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gUkdCX3BlcmNlbnQgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUpKVxuICAgICAgICAgICAgICB8IFNvbWUgXCJyZ2JhXCIgLT4gKFxuICAgICAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgICAgIHwgU29tZSBhIC0+XG4gICAgICAgICAgICAgICAgICAgICAgUkdCQV9wZXJjZW50IChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlLCBmX29mX3MgYSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfCBTb21lIF8gfCBOb25lIC0+IGZhaWwgKCkpXG4gICAgICAgICAgfCBOb25lIC0+IChcbiAgICAgICAgICAgICAgbWF0Y2ggUmVnZXhwLnN0cmluZ19tYXRjaCByZV9oc2wgcyAwIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIHIgLT4gKFxuICAgICAgICAgICAgICAgICAgbGV0IHJlZCA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMiBpblxuICAgICAgICAgICAgICAgICAgbGV0IGdyZWVuID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAzIGluXG4gICAgICAgICAgICAgICAgICBsZXQgYmx1ZSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNCBpblxuICAgICAgICAgICAgICAgICAgbGV0IGFscGhhID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA1IGluXG4gICAgICAgICAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDEgd2l0aFxuICAgICAgICAgICAgICAgICAgfCBTb21lIFwiaHNsXCIgLT4gKFxuICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPiBmYWlsICgpXG4gICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IEhTTCAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSkpXG4gICAgICAgICAgICAgICAgICB8IFNvbWUgXCJoc2xhXCIgLT4gKFxuICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBhIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhTTEEgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUsIGZfb2ZfcyBhKSlcbiAgICAgICAgICAgICAgICAgIHwgU29tZSBfIHwgTm9uZSAtPiBmYWlsICgpKVxuICAgICAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKSkpKVxuZW5kXG5cbm1vZHVsZSBMZW5ndGggPSBzdHJ1Y3RcbiAgKCogaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy12YWx1ZXMvI2xlbmd0aHMgKilcblxuICAoKiBUT0RPOlxuICAgICB7W1xuICAgICAgIHR5cGUganNfdCA9IHByaXZhdGUgSnMuc3RyaW5nIEpzLnRcbiAgICAgICB2YWwganNfdF9vZl90XG4gICAgICAgdmFsIHRfb2ZfanNfdFxuICAgICAgIHZhbCB0X29mX3N0cmluZ1xuICAgICBdfVxuICAqKVxuXG4gIHR5cGUgdCA9XG4gICAgfCBaZXJvXG4gICAgKCogcmVsYXRpdmUgKilcbiAgICB8IEVtIG9mIGZsb2F0XG4gICAgfCBFeCBvZiBmbG9hdFxuICAgIHwgUHggb2YgZmxvYXRcbiAgICB8IEdkIG9mIGZsb2F0XG4gICAgfCBSZW0gb2YgZmxvYXRcbiAgICB8IFZ3IG9mIGZsb2F0XG4gICAgfCBWaCBvZiBmbG9hdFxuICAgIHwgVm0gb2YgZmxvYXRcbiAgICB8IENoIG9mIGZsb2F0XG4gICAgKCogYWJzb2x1dGUgKilcbiAgICB8IE1tIG9mIGZsb2F0XG4gICAgfCBDbSBvZiBmbG9hdFxuICAgIHwgSW4gb2YgZmxvYXRcbiAgICB8IFB0IG9mIGZsb2F0XG4gICAgfCBQYyBvZiBmbG9hdFxuXG4gIGxldCBzdHJpbmdfb2ZfdCA9IGZ1bmN0aW9uXG4gICAgfCBaZXJvIC0+IFwiMFwiXG4gICAgfCBFbSBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJlbVwiXG4gICAgfCBFeCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJleFwiXG4gICAgfCBQeCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJweFwiXG4gICAgfCBHZCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJnZFwiXG4gICAgfCBSZW0gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwicmVtXCJcbiAgICB8IFZ3IGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInZ3XCJcbiAgICB8IFZoIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInZoXCJcbiAgICB8IFZtIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInZtXCJcbiAgICB8IENoIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImNoXCJcbiAgICB8IE1tIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcIm1tXCJcbiAgICB8IENtIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImNtXCJcbiAgICB8IEluIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImluXCJcbiAgICB8IFB0IGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInB0XCJcbiAgICB8IFBjIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInBjXCJcblxuICB0eXBlIGpzX3QgPSBKcy5qc19zdHJpbmcgSnMudFxuXG4gIGxldCBqcyB0ID0gSnMuc3RyaW5nIChzdHJpbmdfb2ZfdCB0KVxuXG4gIGxldCBtbCB0ID1cbiAgICBsZXQgcyA9IEpzLnRvX3N0cmluZyB0IGluXG4gICAgaWYgU3RyaW5nLmVxdWFsIHMgXCIwXCJcbiAgICB0aGVuIFplcm9cbiAgICBlbHNlXG4gICAgICBsZXQgZmFpbCAoKSA9IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChzIF4gXCIgaXMgbm90IGEgdmFsaWQgbGVuZ3RoXCIpKSBpblxuICAgICAgbGV0IHJlID0gUmVnZXhwLnJlZ2V4cCBcIl4oXFxcXGQqKD86XFxcXC5cXFxcZCopPylcXFxccyooXFxcXFMqKSRcIiBpblxuICAgICAgbWF0Y2ggUmVnZXhwLnN0cmluZ19tYXRjaCByZSBzIDAgd2l0aFxuICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgIHwgU29tZSByIC0+IChcbiAgICAgICAgICBsZXQgZiA9XG4gICAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDEgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICAgIHwgU29tZSBmIC0+IChcbiAgICAgICAgICAgICAgICB0cnkgZmxvYXRfb2Zfc3RyaW5nIGZcbiAgICAgICAgICAgICAgICB3aXRoIEludmFsaWRfYXJndW1lbnQgcyAtPlxuICAgICAgICAgICAgICAgICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKFwibGVuZ3RoIGNvbnZlcnNpb24gZXJyb3I6IFwiIF4gcykpKVxuICAgICAgICAgIGluXG4gICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAyIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgIHwgU29tZSBcImVtXCIgLT4gRW0gZlxuICAgICAgICAgIHwgU29tZSBcImV4XCIgLT4gRXggZlxuICAgICAgICAgIHwgU29tZSBcInB4XCIgLT4gUHggZlxuICAgICAgICAgIHwgU29tZSBcImdkXCIgLT4gR2QgZlxuICAgICAgICAgIHwgU29tZSBcInJlbVwiIC0+IFJlbSBmXG4gICAgICAgICAgfCBTb21lIFwidndcIiAtPiBWdyBmXG4gICAgICAgICAgfCBTb21lIFwidmhcIiAtPiBWaCBmXG4gICAgICAgICAgfCBTb21lIFwidm1cIiAtPiBWbSBmXG4gICAgICAgICAgfCBTb21lIFwiY2hcIiAtPiBDaCBmXG4gICAgICAgICAgfCBTb21lIFwibW1cIiAtPiBNbSBmXG4gICAgICAgICAgfCBTb21lIFwiY21cIiAtPiBDbSBmXG4gICAgICAgICAgfCBTb21lIFwiaW5cIiAtPiBJbiBmXG4gICAgICAgICAgfCBTb21lIFwicHRcIiAtPiBQdCBmXG4gICAgICAgICAgfCBTb21lIFwicGNcIiAtPiBQYyBmXG4gICAgICAgICAgfCBTb21lIF8gLT4gZmFpbCAoKSlcbmVuZFxuXG5tb2R1bGUgQW5nbGUgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IERlZyBvZiBmbG9hdFxuICAgIHwgR3JhZCBvZiBmbG9hdFxuICAgIHwgUmFkIG9mIGZsb2F0XG4gICAgfCBUdXJucyBvZiBmbG9hdFxuXG4gIGxldCBzdHJpbmdfb2ZfdCA9IGZ1bmN0aW9uXG4gICAgfCBEZWcgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiZGVnXCJcbiAgICB8IEdyYWQgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiZ3JhZFwiXG4gICAgfCBSYWQgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwicmFkXCJcbiAgICB8IFR1cm5zIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInR1cm5zXCJcblxuICB0eXBlIGpzX3QgPSBKcy5qc19zdHJpbmcgSnMudFxuXG4gIGxldCBqcyB0ID0gSnMuc3RyaW5nIChzdHJpbmdfb2ZfdCB0KVxuXG4gIGxldCBtbCBqID1cbiAgICBsZXQgcyA9IEpzLnRvX3N0cmluZyBqIGluXG4gICAgbGV0IHJlID0gUmVnZXhwLnJlZ2V4cCBcIl4oXFxcXGQqKD86XFxcXC5cXFxcZCopKShkZWd8Z3JhZHxyYWR8dHVybnMpJFwiIGluXG4gICAgbGV0IGZhaWwgKCkgPSByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAocyBeIFwiIGlzIG5vdCBhIHZhbGlkIGxlbmd0aFwiKSkgaW5cbiAgICBtYXRjaCBSZWdleHAuc3RyaW5nX21hdGNoIHJlIHMgMCB3aXRoXG4gICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICB8IFNvbWUgciAtPiAoXG4gICAgICAgIGxldCBmID1cbiAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDEgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgfCBTb21lIGYgLT4gKFxuICAgICAgICAgICAgICB0cnkgZmxvYXRfb2Zfc3RyaW5nIGZcbiAgICAgICAgICAgICAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IHMgLT5cbiAgICAgICAgICAgICAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoXCJsZW5ndGggY29udmVyc2lvbiBlcnJvcjogXCIgXiBzKSkpXG4gICAgICAgIGluXG4gICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMiB3aXRoXG4gICAgICAgIHwgU29tZSBcImRlZ1wiIC0+IERlZyBmXG4gICAgICAgIHwgU29tZSBcImdyYWRcIiAtPiBHcmFkIGZcbiAgICAgICAgfCBTb21lIFwicmFkXCIgLT4gUmFkIGZcbiAgICAgICAgfCBTb21lIFwidHVybnNcIiAtPiBUdXJucyBmXG4gICAgICAgIHwgU29tZSBfIHwgTm9uZSAtPiBmYWlsICgpKVxuZW5kXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxuKCoqIEphdmFzY3JpcHQgZXZlbnRzLiAqKVxuXG5vcGVuISBJbXBvcnRcbm1vZHVsZSBUeXAgPSBEb21faHRtbC5FdmVudFxuXG50eXBlIGxpc3RlbmVyID0gRG9tX2h0bWwuZXZlbnRfbGlzdGVuZXJfaWRcblxubGV0IGxpc3RlbiA/KGNhcHR1cmUgPSBmYWxzZSkgdGFyZ2V0IHR5cCBjYiA9XG4gIERvbV9odG1sLmFkZEV2ZW50TGlzdGVuZXJcbiAgICB0YXJnZXRcbiAgICB0eXBcbiAgICAoRG9tX2h0bWwuZnVsbF9oYW5kbGVyIChmdW4gbiBlIC0+IEpzLmJvb2wgKGNiIG4gZSkpKVxuICAgIChKcy5ib29sIGNhcHR1cmUpXG5cbmxldCBzdG9wX2xpc3RlbiA9IERvbV9odG1sLnJlbW92ZUV2ZW50TGlzdGVuZXJcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTQgSHVnbyBIZXV6YXJkXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb25cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbmxldCB4bWxucyA9IEpzLnN0cmluZyBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcblxuKCogdHJhbnNsYXRlIHNwZWMgZnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvaWRsLmh0bWwgKilcbigqIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9zdHJ1Y3QuaHRtbCAqKVxuXG50eXBlIGVycm9yX2NvZGUgPVxuICB8IFdST05HX1RZUEVfRVJSXG4gIHwgSU5WQUxJRF9WQUxVRV9FUlJcbiAgfCBNQVRSSVhfTk9UX0lOVkVSVEFCTEVcblxuY2xhc3MgdHlwZSBzdmdfZXJyb3IgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IEpzLmVycm9yXG5cbiAgICBtZXRob2QgY29kZSA6IGVycm9yX2NvZGUgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5leGNlcHRpb24gU1ZHRXJyb3Igb2Ygc3ZnX2Vycm9yXG5cbnR5cGUgbGVuZ3RoVW5pdFR5cGUgPVxuICB8IExFTkdUSFRZUEVfVU5LTk9XTlxuICB8IExFTkdUSFRZUEVfTlVNQkVSXG4gIHwgTEVOR1RIVFlQRV9QRVJDRU5UQUdFXG4gIHwgTEVOR1RIVFlQRV9FTVNcbiAgfCBMRU5HVEhUWVBFX0VYU1xuICB8IExFTkdUSFRZUEVfUFhcbiAgfCBMRU5HVEhUWVBFX0NNXG4gIHwgTEVOR1RIVFlQRV9NTVxuICB8IExFTkdUSFRZUEVfSU5cbiAgfCBMRU5HVEhUWVBFX1BUXG4gIHwgTEVOR1RIVFlQRV9QQ1xuXG50eXBlIGFuZ2xlVW5pdFR5cGUgPVxuICB8IEFOR0xFVFlQRV9VTktOT1dOXG4gIHwgQU5HTEVUWVBFX1VOU1BFQ0lGSUVEXG4gIHwgQU5HTEVUWVBFX0RFR1xuICB8IEFOR0xFVFlQRV9SQURcbiAgfCBBTkdMRVRZUEVfR1JBRFxuXG50eXBlIGNvbG9yVHlwZSA9XG4gIHwgQ09MT1JUWVBFX1VOS05PV05cbiAgfCBDT0xPUlRZUEVfUkdCQ09MT1JcbiAgfCBDT0xPUlRZUEVfUkdCQ09MT1JfSUNDQ09MT1JcbiAgfCBDT0xPUlRZUEVfQ1VSUkVOVENPTE9SXG5cbnR5cGUgYWxpZ25tZW50VHlwZSA9XG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19VTktOT1dOXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19OT05FXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlOWU1JTlxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSU5cbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNQVhZTUlOXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlOWU1JRFxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSURcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNQVhZTUlEXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlOWU1BWFxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNQVhcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNQVhZTUFYXG5cbnR5cGUgbWVldE9yU2xpY2VUeXBlID1cbiAgfCBNRUVUT1JTTElDRV9VTktOT1dOXG4gIHwgTUVFVE9SU0xJQ0VfTUVFVFxuICB8IE1FRVRPUlNMSUNFX1NMSUNFXG5cbnR5cGUgdHJhbnNmb3JtVHlwZSA9XG4gIHwgVFJBTlNGT1JNX1VOS05PV05cbiAgfCBUUkFOU0ZPUk1fTUFUUklYXG4gIHwgVFJBTlNGT1JNX1RSQU5TTEFURVxuICB8IFRSQU5TRk9STV9TQ0FMRVxuICB8IFRSQU5TRk9STV9ST1RBVEVcbiAgfCBUUkFOU0ZPUk1fU0tFV1hcbiAgfCBUUkFOU0ZPUk1fU0tFV1lcblxudHlwZSB6b29tQW5kUGFuVHlwZSA9XG4gIHwgWk9PTUFORFBBTl9VTktOT1dOXG4gIHwgWk9PTUFORFBBTl9ESVNBQkxFXG4gIHwgWk9PTUFORFBBTl9NQUdOSUZZXG5cbnR5cGUgbGVuZ3RoQWRqdXN0ID1cbiAgfCBMRU5HVEhBREpVU1RfVU5LTk9XTlxuICB8IExFTkdUSEFESlVTVF9TUEFDSU5HXG4gIHwgTEVOR1RIQURKVVNUX1NQQUNJTkdBTkRHTFlQSFNcblxudHlwZSB1bml0VHlwZSA9XG4gIHwgVU5JVF9UWVBFX1VOS05PV05cbiAgfCBVTklUX1RZUEVfVVNFUlNQQUNFT05VU0VcbiAgfCBVTklUX1RZUEVfT0JKRUNUQk9VTkRJTkdCT1hcblxuKCogaW50ZXJmYWNlIFNWR1JlbmRlcmluZ0ludGVudCAqKVxudHlwZSBpbnRlbnRUeXBlID1cbiAgfCBSRU5ERVJJTkdfSU5URU5UX1VOS05PV05cbiAgfCBSRU5ERVJJTkdfSU5URU5UX0FVVE9cbiAgfCBSRU5ERVJJTkdfSU5URU5UX1BFUkNFUFRVQUxcbiAgfCBSRU5ERVJJTkdfSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQ1xuICB8IFJFTkRFUklOR19JTlRFTlRfU0FUVVJBVElPTlxuICB8IFJFTkRFUklOR19JTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDXG5cbigqIFBhdGggU2VnbWVudCBUeXBlcyAqKVxudHlwZSBwYXRoU2VnbWVudFR5cGUgPVxuICB8IFBBVEhTRUdfVU5LTk9XTlxuICB8IFBBVEhTRUdfQ0xPU0VQQVRIXG4gIHwgUEFUSFNFR19NT1ZFVE9fQUJTXG4gIHwgUEFUSFNFR19NT1ZFVE9fUkVMXG4gIHwgUEFUSFNFR19MSU5FVE9fQUJTXG4gIHwgUEFUSFNFR19MSU5FVE9fUkVMXG4gIHwgUEFUSFNFR19DVVJWRVRPX0NVQklDX0FCU1xuICB8IFBBVEhTRUdfQ1VSVkVUT19DVUJJQ19SRUxcbiAgfCBQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX0FCU1xuICB8IFBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfUkVMXG4gIHwgUEFUSFNFR19BUkNfQUJTXG4gIHwgUEFUSFNFR19BUkNfUkVMXG4gIHwgUEFUSFNFR19MSU5FVE9fSE9SSVpPTlRBTF9BQlNcbiAgfCBQQVRIU0VHX0xJTkVUT19IT1JJWk9OVEFMX1JFTFxuICB8IFBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX0FCU1xuICB8IFBBVEhTRUdfTElORVRPX1ZFUlRJQ0FMX1JFTFxuICB8IFBBVEhTRUdfQ1VSVkVUT19DVUJJQ19TTU9PVEhfQUJTXG4gIHwgUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9SRUxcbiAgfCBQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1NNT09USF9BQlNcbiAgfCBQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1NNT09USF9SRUxcblxuKCogdGV4dFBhdGggTWV0aG9kIFR5cGVzICopXG50eXBlIHRleHRQYXRoTWV0aG9kVHlwZSA9XG4gIHwgVEVYVFBBVEhfTUVUSE9EVFlQRV9VTktOT1dOXG4gIHwgVEVYVFBBVEhfTUVUSE9EVFlQRV9BTElHTlxuICB8IFRFWFRQQVRIX01FVEhPRFRZUEVfU1RSRVRDSFxuXG4oKiB0ZXh0UGF0aCBTcGFjaW5nIFR5cGVzICopXG50eXBlIHRleHRQYXRoU3BhY2luZ1R5cGUgPVxuICB8IFRFWFRQQVRIX1NQQUNJTkdUWVBFX1VOS05PV05cbiAgfCBURVhUUEFUSF9TUEFDSU5HVFlQRV9BVVRPXG4gIHwgVEVYVFBBVEhfU1BBQ0lOR1RZUEVfRVhBQ1RcblxuKCogU3ByZWFkIE1ldGhvZCBUeXBlcyAqKVxudHlwZSBzcHJlYWRNZXRob2RUeXBlID1cbiAgfCBTUFJFQURNRVRIT0RfVU5LTk9XTlxuICB8IFNQUkVBRE1FVEhPRF9QQURcbiAgfCBTUFJFQURNRVRIT0RfUkVGTEVDVFxuICB8IFNQUkVBRE1FVEhPRF9SRVBFQVRcblxudHlwZSBzdXNwZW5kSGFuZGxlSURcblxuKCoqKiopXG5cbmNsYXNzIHR5cGUgWydhXSBhbmltYXRlZCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBiYXNlVmFsIDogJ2EgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1WYWwgOiAnYSBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIFsnYV0gbGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBudW1iZXJPZkl0ZW1zIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGVhciA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluaXRpYWxpemUgOiAnYSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SXRlbSA6IGludCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgaW5zZXJ0SXRlbUJlZm9yZSA6ICdhIC0+IGludCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZUl0ZW0gOiAnYSAtPiBpbnQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUl0ZW0gOiBpbnQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGFwcGVuZEl0ZW0gOiAnYSAtPiAnYSBtZXRoXG4gIGVuZFxuXG4oKioqKilcblxuKCogaW50ZXJmYWNlIFNWR0VsZW1lbnQgKilcbmNsYXNzIHR5cGUgZWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgRG9tLmVsZW1lbnRcblxuICAgIG1ldGhvZCBpZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB4bWxiYXNlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG93bmVyU1ZHRWxlbWVudCA6IHN2Z0VsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgdmlld3BvcnRFbGVtZW50IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFN0cmluZyAqKVxuYW5kIGFuaW1hdGVkU3RyaW5nID0gW2pzX3N0cmluZyB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRCb29sZWFuICopXG5hbmQgYW5pbWF0ZWRCb29sZWFuID0gW2Jvb2wgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR1N0cmluZ0xpc3QgKilcbmFuZCBzdHJpbmdMaXN0ID0gW2pzX3N0cmluZyB0XSBsaXN0XG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uICopXG5hbmQgYW5pbWF0ZWRFbnVtZXJhdGlvbiA9IFtpbnQgKCpzaG9ydCopXSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRJbnRlZ2VyICopXG5hbmQgYW5pbWF0ZWRJbnRlZ2VyID0gW2ludF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkTnVtYmVyICopXG5hbmQgYW5pbWF0ZWROdW1iZXIgPSBbZmxvYXRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdOdW1iZXJMaXN0ICopXG5hbmQgbnVtYmVyTGlzdCA9IFtudW1iZXIgdF0gbGlzdFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWROdW1iZXJMaXN0ICopXG5hbmQgYW5pbWF0ZWROdW1iZXJMaXN0ID0gW251bWJlckxpc3QgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0xlbmd0aCAqKVxuYW5kIGxlbmd0aCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB1bml0VHlwZSA6IGxlbmd0aFVuaXRUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZUluU3BlY2lmaWVkVW5pdHMgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWVBc1N0cmluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuZXdWYWx1ZVNwZWNpZmllZFVuaXRzIDogbGVuZ3RoVW5pdFR5cGUgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29udmVydFRvU3BlY2lmaWVkVW5pdHMgOiBsZW5ndGhVbml0VHlwZSAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZExlbmd0aCAqKVxuYW5kIGFuaW1hdGVkTGVuZ3RoID0gW2xlbmd0aCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTGVuZ3RoTGlzdCAqKVxuYW5kIGxlbmd0aExpc3QgPSBbbGVuZ3RoIHRdIGxpc3RcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkTGVuZ3RoTGlzdCAqKVxuYW5kIGFuaW1hdGVkTGVuZ3RoTGlzdCA9IFtsZW5ndGhMaXN0IHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdBbmdsZSAqKVxuYW5kIGFuZ2xlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHVuaXRUeXBlIDogYW5nbGVVbml0VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWVJblNwZWNpZmllZFVuaXRzIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlQXNTdHJpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmV3VmFsdWVTcGVjaWZpZWRVbml0cyA6IGFuZ2xlVW5pdFR5cGUgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29udmVydFRvU3BlY2lmaWVkVW5pdHMgOiBhbmdsZVVuaXRUeXBlIC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkQW5nbGUgKilcbmFuZCBhbmltYXRlZEFuZ2xlID0gW2FuZ2xlIHRdIGFuaW1hdGVkXG5cbigqIFhYWFhYIE1vdmUgaXQgKilcbmFuZCByZ2JDb2xvciA9IG9iamVjdCBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0NvbG9yICopXG5hbmQgY29sb3IgPVxuICBvYmplY3RcbiAgICAoKiBYWFggaW5oZXJpdCBjc3NWYWx1ZSAqKVxuICAgIG1ldGhvZCBjb2xvclR5cGUgOiBjb2xvclR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJnYkNvbG9yIDogcmdiQ29sb3IgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaWNjQ29sb3IgOiBpY2NDb2xvciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZXRSR0JDb2xvciA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFJHQkNvbG9ySUNDQ29sb3IgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRDb2xvciA6IGNvbG9yVHlwZSAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdJQ0NDb2xvciAqKVxuYW5kIGljY0NvbG9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNvbG9yUHJvZmlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2xvcnMgOiBudW1iZXJMaXN0IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1JlY3QgKilcbmFuZCByZWN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRSZWN0ICopXG5hbmQgYW5pbWF0ZWRSZWN0ID0gW3JlY3QgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR1N0eWxhYmxlICopXG5hbmQgc3R5bGFibGUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY2xhc3NOYW1lIDogYW5pbWF0ZWRTdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3R5bGUgOiBEb21faHRtbC5jc3NTdHlsZURlY2xhcmF0aW9uIHQgcmVhZG9ubHlfcHJvcFxuICAgICgqICAgQ1NTVmFsdWUgZ2V0UHJlc2VudGF0aW9uQXR0cmlidXRlKGluIERPTVN0cmluZyBuYW1lKTsgKilcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdMb2NhdGFibGUgKilcbmFuZCBsb2NhdGFibGUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbmVhcmVzdFZpZXdwb3J0RWxlbWVudCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmFydGhlc3RWaWV3cG9ydEVsZW1lbnQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldEJCb3ggOiByZWN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENUTSA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTY3JlZW5DVE0gOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VHJhbnNmb3JtVG9FbGVtZW50IDogZWxlbWVudCB0IC0+IG1hdHJpeCB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUcmFuc2Zvcm1hYmxlICopXG5hbmQgdHJhbnNmb3JtYWJsZSA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbG9jYXRhYmxlXG5cbiAgICBtZXRob2QgdHJhbnNmb3JtIDogYW5pbWF0ZWRUcmFuc2Zvcm1MaXN0IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1Rlc3RzICopXG5hbmQgdGVzdHMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcmVxdWlyZWRGZWF0dXJlcyA6IHN0cmluZ0xpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVxdWlyZWRFeHRlbnNpb25zIDogc3RyaW5nTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzeXN0ZW1MYW5ndWFnZSA6IHN0cmluZ0xpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGFzRXh0ZW5zaW9uIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdMYW5nU3BhY2UgKilcbmFuZCBsYW5nU3BhY2UgPVxuICBvYmplY3RcbiAgICBtZXRob2QgeG1sbGFuZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB4bWxzcGFjZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdFeHRlcm5hbFJlc291cmNlc1JlcXVpcmVkICopXG5hbmQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIDogYW5pbWF0ZWRCb29sZWFuIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0ZpdFRvVmlld0JveCAqKVxuYW5kIGZpdFRvVmlld0JveCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB2aWV3Qm94IDogYW5pbWF0ZWRSZWN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZXNlcnZlQXNwZWN0UmF0aW8gOiBhbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW8gdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHWm9vbUFuZFBhbiAqKVxuYW5kIHpvb21BbmRQYW4gPVxuICBvYmplY3RcbiAgICBtZXRob2Qgem9vbUFuZFBhbiA6IHpvb21BbmRQYW5UeXBlIHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdWaWV3U3BlYyAqKVxuYW5kIHZpZXdTcGVjID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB6b29tQW5kUGFuXG5cbiAgICBpbmhlcml0IGZpdFRvVmlld0JveFxuXG4gICAgbWV0aG9kIHRyYW5zZm9ybSA6IHRyYW5zZm9ybUxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgdmlld1RhcmdldCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgdmlld0JveFN0cmluZyA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmVzZXJ2ZUFzcGVjdFJhdGlvU3RyaW5nIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRyYW5zZm9ybVN0cmluZyA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2aWV3VGFyZ2V0U3RyaW5nIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1VSSVJlZmVyZW5jZSAqKVxuYW5kIHVyaVJlZmVyZW5jZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBocmVmIDogYW5pbWF0ZWRTdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQ1NTUnVsZSA6IENTU1J1bGUgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09MT1JfUFJPRklMRV9SVUxFID0gNzsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdEb2N1bWVudCAqKVxuYW5kIGRvY3VtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbZWxlbWVudF0gRG9tLmRvY3VtZW50XG5cbiAgICAoKlhYWCBpbmhlcml0IGRvY3VtZW50RXZlbnQgKilcbiAgICBtZXRob2QgdGl0bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVmZXJyZXIgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZG9tYWluIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF9VUkwgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgcm9vdEVsZW1lbnQgOiBzdmdFbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgICAoKiByb290RWxlbWVudCB3aWxsIGJlIG51bGwgb3IgdW5kZWZpbmVkIGluIGFuIGh0bWwgY29udGV4dCAqKVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1NWR0VsZW1lbnQgKilcbmFuZCBzdmdFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IGxvY2F0YWJsZVxuXG4gICAgaW5oZXJpdCBmaXRUb1ZpZXdCb3hcblxuICAgIGluaGVyaXQgem9vbUFuZFBhblxuXG4gICAgKCpYWFggaW5oZXJpdCBkb2N1bWVudGV2ZW50LCB2aWV3Y3NzLCBkb2N1bWVudGNzcyAqKVxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udGVudFNjcmlwdFR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29udGVudFN0eWxlVHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2aWV3cG9ydCA6IHJlY3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGl4ZWxVbml0VG9NaWxsaW1ldGVyWCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwaXhlbFVuaXRUb01pbGxpbWV0ZXJZIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblBpeGVsVW5pdFRvTWlsbGltZXRlclggOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuUGl4ZWxVbml0VG9NaWxsaW1ldGVyWSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1c2VDdXJyZW50VmlldyA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFZpZXcgOiB2aWV3U3BlYyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdXJyZW50U2NhbGUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFRyYW5zbGF0ZSA6IHBvaW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN1c3BlbmRSZWRyYXcgOiBpbnQgLT4gc3VzcGVuZEhhbmRsZUlEIG1ldGhcblxuICAgIG1ldGhvZCB1bnN1c3BlbmRSZWRyYXcgOiBzdXNwZW5kSGFuZGxlSUQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5zdXNwZW5kUmVkcmF3QWxsIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZm9yY2VSZWRyYXcgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwYXVzZUFuaW1hdGlvbnMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bnBhdXNlQW5pbWF0aW9ucyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbnNQYXVzZWQgOiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEN1cnJlbnRUaW1lIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEN1cnJlbnRUaW1lIDogaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEludGVyc2VjdGlvbkxpc3QgOiByZWN0IHQgLT4gZWxlbWVudCB0IC0+IGVsZW1lbnQgRG9tLm5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVuY2xvc3VyZUxpc3QgOiByZWN0IHQgLT4gZWxlbWVudCB0IC0+IGVsZW1lbnQgRG9tLm5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNoZWNrSW50ZXJzZWN0aW9uIDogZWxlbWVudCB0IC0+IHJlY3QgdCAtPiBib29sIHRcblxuICAgIG1ldGhvZCBjaGVja0VuY2xvc3VyZSA6IGVsZW1lbnQgdCAtPiByZWN0IHQgLT4gYm9vbCB0XG5cbiAgICBtZXRob2QgZGVzZWxlY3RBbGwgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdOdW1iZXIgOiBudW1iZXIgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHTGVuZ3RoIDogbGVuZ3RoIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR0FuZ2xlIDogYW5nbGUgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUG9pbnQgOiBwb2ludCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdNYXRyaXggOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUmVjdCA6IHJlY3QgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHVHJhbnNmb3JtIDogdHJhbnNmb3JtIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1RyYW5zZm9ybUZyb21NYXRyaXggOiBtYXRyaXggdCAtPiB0cmFuc2Zvcm0gdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudEJ5SWQgOiBqc19zdHJpbmcgdCAtPiBEb20uZWxlbWVudCB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdHRWxlbWVudCAqKVxuYW5kIGdFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdEZWZzRWxlbWVudCAqKVxuYW5kIGRlZnNFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcbiAgICAoKiBYWFhYWFhYID8gaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldCAqKVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0Rlc2NFbGVtZW50ICopXG5hbmQgZGVzY0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gICAgKCogWFhYWFhYWCA/IGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXQgKilcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUaXRsZUVsZW1lbnQgKilcbmFuZCB0aXRsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU3ltYm9sRWxlbWVudCAqKVxuYW5kIHN5bWJvbEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgZml0VG9WaWV3Qm94XG5cbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVXNlRWxlbWVudCAqKVxuYW5kIHVzZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5zdGFuY2VSb290IDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGVkSW5zdGFuY2VSb290IDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGVsZW1lbnRJbnN0YW5jZSA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCBjb3JyZXNwb25kaW5nRWxlbWVudCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQgOiB1c2VFbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhcmVudE5vZGUgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2hpbGROb2RlcyA6IGVsZW1lbnRJbnN0YW5jZUxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlyc3RDaGlsZCA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsYXN0Q2hpbGQgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJldmlvdXNTaWJsaW5nIDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5leHRTaWJsaW5nIDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0VsZW1lbnRJbnN0YW5jZUxpc3QgKilcbmFuZCBlbGVtZW50SW5zdGFuY2VMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiBlbGVtZW50SW5zdGFuY2UgdFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0ltYWdlRWxlbWVudCAqKVxuYW5kIGltYWdlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgICAoKiByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRQcmVzZXJ2ZUFzcGVjdFJhdGlvIHByZXNlcnZlQXNwZWN0UmF0aW8gKilcbiAgZW5kXG5cbmFuZCBzd2l0Y2hFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcbiAgZW5kXG5cbigqIFhYWCBkZXByZWNhdGVkID0+IGludGVyZmFjZSBHZXRTVkdEb2N1bWVudCA9PiBTVkdEb2N1bWVudCBnZXRTVkdEb2N1bWVudCgpICopXG5cbigqIGludGVyZmFjZSBTVkdTdHlsZUVsZW1lbnQgKilcbmFuZCBzdHlsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBtZXRob2QgdHlwZV8gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWVkaWEgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGl0bGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUG9pbnQgKilcbmFuZCBwb2ludCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB4IDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWF0cml4VHJhbnNmb3JtIDogbWF0cml4IHQgLT4gcG9pbnQgdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUG9pbnRMaXN0ICopXG5hbmQgcG9pbnRMaXN0ID0gW3BvaW50IHRdIGxpc3RcblxuKCogaW50ZXJmYWNlIFNWR01hdHJpeCAqKVxuYW5kIG1hdHJpeCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGIgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYyA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtdWx0aXBseSA6IG1hdHJpeCB0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBpbnZlcnNlIDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHRyYW5zbGF0ZSA6IGZsb2F0IC0+IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBzY2FsZSA6IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBzY2FsZU5vblVuaWZvcm0gOiBmbG9hdCAtPiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgcm90YXRlIDogZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHJvdGF0ZUZyb21WZWN0b3IgOiBmbG9hdCAtPiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgZmxpcFggOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgZmxpcFkgOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgc2tld1ggOiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgc2tld1kgOiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVHJhbnNmb3JtICopXG5hbmQgdHJhbnNmb3JtID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF90eXBlIDogdHJhbnNmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWF0cml4IDogbWF0cml4IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFuZ2xlIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNldE1hdHJpeCA6IG1hdHJpeCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFRyYW5zbGF0ZSA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFNjYWxlIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0Um90YXRlIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U2tld1ggOiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTa2V3WSA6IGZsb2F0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RyYW5zZm9ybUxpc3QgKilcbmFuZCB0cmFuc2Zvcm1MaXN0ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbdHJhbnNmb3JtIHRdIGxpc3RcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdUcmFuc2Zvcm1Gcm9tTWF0cml4IDogbWF0cml4IC0+IHRyYW5zZm9ybSB0IG1ldGhcblxuICAgIG1ldGhvZCBjb25zb2xpZGF0ZSA6IHRyYW5zZm9ybSB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFRyYW5zZm9ybUxpc3QgKilcbmFuZCBhbmltYXRlZFRyYW5zZm9ybUxpc3QgPSBbdHJhbnNmb3JtTGlzdCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUHJlc2VydmVBc3BlY3RSYXRpbyAqKVxuYW5kIHByZXNlcnZlQXNwZWN0UmF0aW8gPVxuICBvYmplY3RcbiAgICBtZXRob2QgYWxpZ24gOiBhbGlnbm1lbnRUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZWV0T3JTbGljZSA6IG1lZXRPclNsaWNlVHlwZSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRQcmVzZXJ2ZUFzcGVjdFJhdGlvICopXG5hbmQgYW5pbWF0ZWRQcmVzZXJ2ZUFzcGVjdFJhdGlvID0gW3ByZXNlcnZlQXNwZWN0UmF0aW8gdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWcgKilcbmFuZCBwYXRoU2VnID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBhdGhTZWdUeXBlIDogcGF0aFNlZ21lbnRUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXRoU2VnVHlwZUFzTGV0dGVyIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDbG9zZVBhdGggKilcbmFuZCBwYXRoU2VnQ2xvc2VQYXRoID0gcGF0aFNlZ1xuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ01vdmV0b0FicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdNb3ZldG9SZWwgKilcbmFuZCBwYXRoU2VnTW92ZXRvID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9BYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvUmVsICopXG5hbmQgcGF0aFNlZ0xpbmV0byA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1JlbCAqKVxuYW5kIHBhdGhTZWdDdXJ2ZXRvQ3ViaWMgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeDEgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeTEgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeDIgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeTIgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbCAqKVxuYW5kIHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHgxIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkxIDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdBcmNBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQXJjUmVsKilcbmFuZCBwYXRoU2VnQXJjID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCByMSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCByMiA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBhbmdsZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBsYXJnZUFyY0ZsYWcgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN3ZWVwRmxhZyA6IGJvb2wgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbFJlbCAqKVxuYW5kIHBhdGhTZWdMaW5ldG9Ib3Jpem9udGFsID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0XG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsICopXG5hbmQgcGF0aFNlZ0xpbmV0b1ZlcnRpY2FsID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0XG4gIGVuZFxuXG5hbmQgcGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdFxuXG4gICAgbWV0aG9kIHgyIDogZmxvYXRcblxuICAgIG1ldGhvZCB5MiA6IGZsb2F0XG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbCAgKilcbmFuZCBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdFxuICBlbmRcblxuYW5kIHBhdGhTZWdMaXN0ID0gW3BhdGhTZWcgdF0gbGlzdFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRQYXRoRGF0YSAqKVxuYW5kIGFuaW1hdGVkUGF0aERhdGEgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcGF0aFNlZ0xpc3QgOiBwYXRoU2VnTGlzdCB0IHByb3BcblxuICAgIG1ldGhvZCBub3JtYWxpemVkUGF0aFNlZ0xpc3QgOiBwYXRoU2VnTGlzdCB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRlZFBhdGhTZWdMaXN0IDogcGF0aFNlZ0xpc3QgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0ZWROb3JtYWxpemVkUGF0aFNlZ0xpc3QgOiBwYXRoU2VnTGlzdCB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoRWxlbWVudCAqKVxuYW5kIHBhdGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIGluaGVyaXQgYW5pbWF0ZWRQYXRoRGF0YVxuXG4gICAgbWV0aG9kIHBhdGhMZW5ndGggOiBhbmltYXRlZE51bWJlciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRUb3RhbExlbmd0aCA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQb2ludEF0TGVuZ3RoIDogZmxvYXQgLT4gcG9pbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UGF0aFNlZ0F0TGVuZ3RoIDogZmxvYXQgLT4gaW50XG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0Nsb3NlUGF0aCA6IHBhdGhTZWdDbG9zZVBhdGggbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdNb3ZldG9BYnMgOiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnTW92ZXRvIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTW92ZXRvUmVsIDogZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ01vdmV0byBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0FicyA6IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG8gbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9SZWwgOiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljQWJzIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvQ3ViaWMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9DdWJpYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNBYnMgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQXJjQWJzIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiBib29sIHQgLT4gcGF0aFNlZ0FyYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0FyY1JlbCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBib29sIHQgLT4gYm9vbCB0IC0+IHBhdGhTZWdBcmMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzIDogZmxvYXQgLT4gcGF0aFNlZ0xpbmV0b0hvcml6b250YWwgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsIDogZmxvYXQgLT4gcGF0aFNlZ0xpbmV0b0hvcml6b250YWwgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicyA6IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG9WZXJ0aWNhbCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsUmVsIDogZmxvYXQgLT4gcGF0aFNlZ0xpbmV0b1ZlcnRpY2FsIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoQWJzIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGggbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhSZWwgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhBYnMgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGggbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoUmVsIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoIG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdSZWN0RWxlbWVudCAqKVxuYW5kIHJlY3RFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcnggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0NpcmNsZUVsZW1lbnQgKilcbmFuZCBjaXJjbGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCBjeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgciA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0VsbGlwc2VFbGVtZW50ICopXG5hbmQgZWxsaXBzZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIGN4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3kgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJ5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTGluZUVsZW1lbnQgKilcbmNsYXNzIHR5cGUgbGluZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIHgxIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeTEgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB4MiA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkyIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRQb2ludHMgKilcbmFuZCBhbmltYXRlZFBvaW50cyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwb2ludHMgOiBwb2ludExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0ZWRwb2ludHMgOiBwb2ludExpc3QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUG9seWxpbmVFbGVtZW50ICopXG5hbmQgcG9seUxpbmVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIGluaGVyaXQgYW5pbWF0ZWRQb2ludHNcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQb2x5Z29uRWxlbWVudCAqKVxuYW5kIHBvbHlnb25FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIGluaGVyaXQgYW5pbWF0ZWRQb2ludHNcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUZXh0Q29udGVudEVsZW1lbnQgKilcbmFuZCB0ZXh0Q29udGVudEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCB0ZXh0TGVuZ3RoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGVuZ3RoQWRqdXN0IDogbGVuZ3RoQWRqdXN0IGFuaW1hdGVkIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldE51bWJlck9mQ2hhcnMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENvbXB1dGVkVGV4dExlbmd0aCA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTdWJTdHJpbmdMZW5ndGggOiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTdGFydFBvc2l0aW9uT2ZDaGFyIDogaW50IC0+IHBvaW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVuZFBvc2l0aW9uT2ZDaGFyIDogaW50IC0+IHBvaW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEV4dGVudE9mQ2hhciA6IGludCAtPiByZWN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFJvdGF0aW9uT2ZDaGFyIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDaGFyTnVtQXRQb3NpdGlvbiA6IHBvaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2Qgc2VsZWN0U3ViU3RyaW5nIDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUZXh0UG9zaXRpb25pbmdFbGVtZW50ICopXG5hbmQgdGV4dFBvc2l0aW9uaW5nRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgdGV4dENvbnRlbnRFbGVtZW50XG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGhMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGR4IDogYW5pbWF0ZWRMZW5ndGhMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGR5IDogYW5pbWF0ZWRMZW5ndGhMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJvdGF0ZSA6IGFuaW1hdGVkTnVtYmVyTGlzdCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUZXh0RWxlbWVudCAqKVxuYW5kIHRleHRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB0ZXh0UG9zaXRpb25pbmdFbGVtZW50XG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcbiAgZW5kXG5cbmFuZCB0c3BhbkVsZW1lbnQgPSB0ZXh0UG9zaXRpb25pbmdFbGVtZW50XG5cbmFuZCB0cmVmRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgdGV4dFBvc2l0aW9uaW5nRWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUZXh0UGF0aEVsZW1lbnQgKilcbmFuZCB0ZXh0UGF0aEVsZW1lbnRNZXRob2QgPSBbdGV4dFBhdGhNZXRob2RUeXBlXSBhbmltYXRlZFxuXG5hbmQgdGV4dFBhdGhFbGVtZW50U3BhY2luZyA9IFt0ZXh0UGF0aFNwYWNpbmdUeXBlXSBhbmltYXRlZFxuXG5hbmQgdGV4dFBhdGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB0ZXh0Q29udGVudEVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBtZXRob2Qgc3RhcnRPZmZzZXQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZXRob2RfIDogdGV4dFBhdGhFbGVtZW50TWV0aG9kIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzcGFjaW5nIDogdGV4dFBhdGhFbGVtZW50U3BhY2luZyByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQWx0R2x5cGhFbGVtZW50ICopXG5hbmQgYWx0R2x5cGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB0ZXh0UG9zaXRpb25pbmdFbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgbWV0aG9kIGdseXBoUmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvcm1hdCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbHRHbHlwaERlZkVsZW1lbnQgKilcbmFuZCBhbHRHbHlwaERlZkVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdBbHRHbHlwaEl0ZW1FbGVtZW50ICopXG5hbmQgYWx0R2x5cGhJdGVtRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0dseXBoUmVmRWxlbWVudCAqKVxuYW5kIGdseXBoUmVmRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIG1ldGhvZCBnbHlwaFJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb3JtYXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGR4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGR5IDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhaW50IDogU1ZHQ29sb3IgeyAqKVxuXG4oKiAgIC8vIFBhaW50IFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfUkdCQ09MT1IgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1JHQkNPTE9SX0lDQ0NPTE9SID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9OT05FID0gMTAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX0NVUlJFTlRDT0xPUiA9IDEwMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VUklfTk9ORSA9IDEwMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VUklfQ1VSUkVOVENPTE9SID0gMTA0OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VSSV9SR0JDT0xPUiA9IDEwNTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VUklfUkdCQ09MT1JfSUNDQ09MT1IgPSAxMDY7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVVJJID0gMTA3OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBwYWludFR5cGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdXJpOyAqKVxuXG4oKiAgIHZvaWQgc2V0VXJpKGluIERPTVN0cmluZyB1cmkpOyAqKVxuKCogICB2b2lkIHNldFBhaW50KGluIHVuc2lnbmVkIHNob3J0IHBhaW50VHlwZSwgaW4gRE9NU3RyaW5nIHVyaSwgaW4gRE9NU3RyaW5nIHJnYkNvbG9yLCBpbiBET01TdHJpbmcgaWNjQ29sb3IpIHJhaXNlcyhTVkdFeGNlcHRpb24pOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR01hcmtlckVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdMYW5nU3BhY2UsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR1N0eWxhYmxlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaXRUb1ZpZXdCb3ggeyAqKVxuXG4oKiAgIC8vIE1hcmtlciBVbml0IFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJVTklUU19VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUlVOSVRTX1VTRVJTUEFDRU9OVVNFID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUlVOSVRTX1NUUk9LRVdJRFRIID0gMjsgKilcblxuKCogICAvLyBNYXJrZXIgT3JpZW50YXRpb24gVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUl9PUklFTlRfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJfT1JJRU5UX0FVVE8gPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSX09SSUVOVF9BTkdMRSA9IDI7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIHJlZlg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCByZWZZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBtYXJrZXJVbml0czsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIG1hcmtlcldpZHRoOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggbWFya2VySGVpZ2h0OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBvcmllbnRUeXBlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRBbmdsZSBvcmllbnRBbmdsZTsgKilcblxuKCogICB2b2lkIHNldE9yaWVudFRvQXV0bygpIHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogICB2b2lkIHNldE9yaWVudFRvQW5nbGUoaW4gU1ZHQW5nbGUgYW5nbGUpIHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0NvbG9yUHJvZmlsZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdVUklSZWZlcmVuY2UsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR1JlbmRlcmluZ0ludGVudCB7ICopXG4oKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcgbG9jYWw7ICopXG4oKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZTsgKilcbigqICAgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHJlbmRlcmluZ0ludGVudDsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdDb2xvclByb2ZpbGVSdWxlIDogU1ZHQ1NTUnVsZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHUmVuZGVyaW5nSW50ZW50IHsgKilcbigqICAgYXR0cmlidXRlIERPTVN0cmluZyBzcmMgc2V0cmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZSBzZXRyYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqICAgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHJlbmRlcmluZ0ludGVudCBzZXRyYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdHcmFkaWVudEVsZW1lbnQgKilcbmFuZCBhbmltYXRlZFNwcmVhZE1ldGhvZCA9IFtzcHJlYWRNZXRob2RUeXBlXSBhbmltYXRlZFxuXG5hbmQgZ3JhZGllbnRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBncmFkaWVudFVuaXRzOyAqKVxuICAgIG1ldGhvZCBncmFkaWVudFRyYW5zZm9ybSA6IGFuaW1hdGVkVHJhbnNmb3JtTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzcHJlYWRNZXRob2QgOiBhbmltYXRlZFNwcmVhZE1ldGhvZCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdMaW5lYXJHcmFkaWVudEVsZW1lbnQgKilcbmFuZCBsaW5lYXJHcmFkaWVudEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGdyYWRpZW50RWxlbWVudFxuXG4gICAgbWV0aG9kIHgxIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeTEgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB4MiA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkyIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUmFkaWFsR3JhZGllbnRFbGVtZW50ICopXG5hbmQgcmFkaWFsR3JhZGllbnRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBncmFkaWVudEVsZW1lbnRcblxuICAgIG1ldGhvZCBjeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgciA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZ4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZnkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdTdG9wRWxlbWVudCAqKVxuYW5kIHN0b3BFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBtZXRob2Qgb2Zmc2V0IDogYW5pbWF0ZWROdW1iZXIgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0dGVybkVsZW1lbnQgKilcbmFuZCBwYXR0ZXJuRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgZml0VG9WaWV3Qm94XG5cbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHBhdHRlcm5Vbml0czsgKilcbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHBhdHRlcm5Db250ZW50VW5pdHM7ICopXG4gICAgbWV0aG9kIHBhdHRlcm5UcmFuc2Zvcm0gOiBhbmltYXRlZFRyYW5zZm9ybUxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0NsaXBQYXRoRWxlbWVudCAqKVxuYW5kIGNsaXBQYXRoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBjbGlwUGF0aFVuaXRzOyAqKVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR01hc2tFbGVtZW50ICopXG5hbmQgbWFza0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gbWFza1VuaXRzOyAqKVxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gbWFza0NvbnRlbnRVbml0czsgKilcbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0ZpbHRlckVsZW1lbnQgKilcbmFuZCBmaWx0ZXJFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBmaWx0ZXJVbml0czsgKilcbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHByaW1pdGl2ZVVuaXRzOyAqKVxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsdGVyUmVzWCA6IGFuaW1hdGVkSW50ZWdlciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWx0ZXJSZXNZIDogYW5pbWF0ZWRJbnRlZ2VyIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNldEZpbHRlclJlcyA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIDogU1ZHU3R5bGFibGUgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggeDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIHk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCB3aWR0aDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIGhlaWdodDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIHJlc3VsdDsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUJsZW5kRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIEJsZW5kIE1vZGUgVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9OT1JNQUwgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX01VTFRJUExZID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9TQ1JFRU4gPSAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX0RBUktFTiA9IDQ7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfTElHSFRFTiA9IDU7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gbW9kZTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUNvbG9yTWF0cml4RWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIENvbG9yIE1hdHJpeCBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT0xPUk1BVFJJWF9UWVBFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT0xPUk1BVFJJWF9UWVBFX01BVFJJWCA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTE9STUFUUklYX1RZUEVfU0FUVVJBVEUgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT0xPUk1BVFJJWF9UWVBFX0hVRVJPVEFURSA9IDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTE9STUFUUklYX1RZUEVfTFVNSU5BTkNFVE9BTFBIQSA9IDQ7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gdHlwZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyTGlzdCB2YWx1ZXM7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudCA6IFNWR0VsZW1lbnQgeyAqKVxuXG4oKiAgIC8vIENvbXBvbmVudCBUcmFuc2ZlciBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX0lERU5USVRZID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9UQUJMRSA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfRElTQ1JFVEUgPSAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX0xJTkVBUiA9IDQ7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfR0FNTUEgPSA1OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHR5cGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlckxpc3QgdGFibGVWYWx1ZXM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzbG9wZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGludGVyY2VwdDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGFtcGxpdHVkZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGV4cG9uZW50OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgb2Zmc2V0OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRnVuY1JFbGVtZW50IDogU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRnVuY0dFbGVtZW50IDogU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRnVuY0JFbGVtZW50IDogU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRnVuY0FFbGVtZW50IDogU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFQ29tcG9zaXRlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBDb21wb3NpdGUgT3BlcmF0b3JzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX09WRVIgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfSU4gPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfT1VUID0gMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX0FUT1AgPSA0OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfWE9SID0gNTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX0FSSVRITUVUSUMgPSA2OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjI7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG9wZXJhdG9yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgazE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrMjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGszOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgazQ7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVDb252b2x2ZU1hdHJpeEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBFZGdlIE1vZGUgVmFsdWVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19FREdFTU9ERV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0VER0VNT0RFX0RVUExJQ0FURSA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19FREdFTU9ERV9XUkFQID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0VER0VNT0RFX05PTkUgPSAzOyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEludGVnZXIgb3JkZXJYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRJbnRlZ2VyIG9yZGVyWTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyTGlzdCBrZXJuZWxNYXRyaXg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBkaXZpc29yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgYmlhczsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkSW50ZWdlciB0YXJnZXRYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRJbnRlZ2VyIHRhcmdldFk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIGVkZ2VNb2RlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkQm9vbGVhbiBwcmVzZXJ2ZUFscGhhOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRGlmZnVzZUxpZ2h0aW5nRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHN1cmZhY2VTY2FsZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGRpZmZ1c2VDb25zdGFudDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFk7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50IDogU1ZHRWxlbWVudCB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBhemltdXRoOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZWxldmF0aW9uOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFUG9pbnRMaWdodEVsZW1lbnQgOiBTVkdFbGVtZW50IHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB5OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgejsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRVNwb3RMaWdodEVsZW1lbnQgOiBTVkdFbGVtZW50IHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB5OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgejsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHBvaW50c0F0WDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHBvaW50c0F0WTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHBvaW50c0F0WjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNwZWN1bGFyRXhwb25lbnQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBsaW1pdGluZ0NvbmVBbmdsZTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gQ2hhbm5lbCBTZWxlY3RvcnMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0NIQU5ORUxfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19DSEFOTkVMX1IgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfQ0hBTk5FTF9HID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0NIQU5ORUxfQiA9IDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19DSEFOTkVMX0EgPSA0OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjI7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzY2FsZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24geENoYW5uZWxTZWxlY3RvcjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24geUNoYW5uZWxTZWxlY3RvcjsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUZsb29kRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3RkRGV2aWF0aW9uWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHN0ZERldmlhdGlvblk7ICopXG5cbigqICAgdm9pZCBzZXRTdGREZXZpYXRpb24oaW4gZmxvYXQgc3RkRGV2aWF0aW9uWCwgaW4gZmxvYXQgc3RkRGV2aWF0aW9uWSkgcmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVJbWFnZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHVVJJUmVmZXJlbmNlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHTGFuZ1NwYWNlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW8gcHJlc2VydmVBc3BlY3RSYXRpbzsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRU1lcmdlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFTWVyZ2VOb2RlRWxlbWVudCA6IFNWR0VsZW1lbnQgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFTW9ycGhvbG9neUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIE1vcnBob2xvZ3kgT3BlcmF0b3JzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NT1JQSE9MT0dZX09QRVJBVE9SX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTU9SUEhPTE9HWV9PUEVSQVRPUl9FUk9ERSA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NT1JQSE9MT0dZX09QRVJBVE9SX0RJTEFURSA9IDI7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gb3BlcmF0b3I7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciByYWRpdXNYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgcmFkaXVzWTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRU9mZnNldEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBkeDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGR5OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3VyZmFjZVNjYWxlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3BlY3VsYXJDb25zdGFudDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNwZWN1bGFyRXhwb25lbnQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhZOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFVGlsZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFVHVyYnVsZW5jZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIFR1cmJ1bGVuY2UgVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1RVUkJVTEVOQ0VfVFlQRV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1RVUkJVTEVOQ0VfVFlQRV9GUkFDVEFMTk9JU0UgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfVFVSQlVMRU5DRV9UWVBFX1RVUkJVTEVOQ0UgPSAyOyAqKVxuXG4oKiAgIC8vIFN0aXRjaCBPcHRpb25zICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19TVElUQ0hUWVBFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfU1RJVENIVFlQRV9TVElUQ0ggPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfU1RJVENIVFlQRV9OT1NUSVRDSCA9IDI7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGJhc2VGcmVxdWVuY3lYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgYmFzZUZyZXF1ZW5jeVk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEludGVnZXIgbnVtT2N0YXZlczsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNlZWQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHN0aXRjaFRpbGVzOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiB0eXBlOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0N1cnNvckVsZW1lbnQgKilcbmFuZCBjdXJzb3JFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBRWxlbWVudCAqKVxuYW5kIGFFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgdGFyZ2V0IDogYW5pbWF0ZWRTdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVmlld0VsZW1lbnQgKilcbmFuZCB2aWV3RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IGZpdFRvVmlld0JveFxuXG4gICAgaW5oZXJpdCB6b29tQW5kUGFuXG5cbiAgICBtZXRob2Qgdmlld1RhcmdldCA6IHN0cmluZ0xpc3QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU2NyaXB0RWxlbWVudCAqKVxuYW5kIHNjcmlwdEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIG1ldGhvZCB0eXBlXyA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdab29tRXZlbnQgOiBVSUV2ZW50ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdSZWN0IHpvb21SZWN0U2NyZWVuOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgcHJldmlvdXNTY2FsZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR1BvaW50IHByZXZpb3VzVHJhbnNsYXRlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgbmV3U2NhbGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdQb2ludCBuZXdUcmFuc2xhdGU7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0aW9uRWxlbWVudCAqKVxuYW5kIGFuaW1hdGlvbkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgKCogaW5oZXJpdCBlbGVtZW50VGltZUNvbnRyb2wgKilcbiAgICBtZXRob2QgdGFyZ2V0RWxlbWVudCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0U3RhcnRUaW1lIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEN1cnJlbnRUaW1lIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNpbXBsZUR1cmF0aW9uIDogZmxvYXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVFbGVtZW50ICopXG5hbmQgYW5pbWF0ZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGFuaW1hdGlvbkVsZW1lbnRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdTZXRFbGVtZW50ICopXG5hbmQgc2V0RWxlbWVudCA9IGFuaW1hdGlvbkVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVNb3Rpb25FbGVtZW50ICopXG5hbmQgYW5pbWF0ZU1vdGlvbkVsZW1lbnQgPSBhbmltYXRpb25FbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdNUGF0aEVsZW1lbnQgKilcbmFuZCBtUGF0aEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlQ29sb3JFbGVtZW50ICopXG5hbmQgYW5pbWF0ZUNvbG9yRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgYW5pbWF0aW9uRWxlbWVudFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVUcmFuc2Zvcm1FbGVtZW50ICopXG5hbmQgYW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQgPSBhbmltYXRpb25FbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb250RWxlbWVudCAqKVxuYW5kIGZvbnRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHR2x5cGhFbGVtZW50ICopXG4oKiBpbnRlcmZhY2UgU1ZHTWlzc2luZ0dseXBoRWxlbWVudCopXG5hbmQgZ2x5cGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHSEtlcm5FbGVtZW50IDogU1ZHRWxlbWVudCAqKVxuKCogaW50ZXJmYWNlIFNWR1ZLZXJuRWxlbWVudCA6IFNWR0VsZW1lbnQgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRGYWNlRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb250RmFjZUVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb250RmFjZVNyY0VsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9udEZhY2VTcmNFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEZhY2VVcmlFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvbnRGYWNlVXJpRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRGYWNlRm9ybWF0RWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb250RmFjZUZvcm1hdEVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb250RmFjZU5hbWVFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvbnRGYWNlTmFtZUVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdNZXRhZGF0YUVsZW1lbnQgKilcbmNsYXNzIHR5cGUgbWV0YWRhdGFFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9yZWlnbk9iamVjdEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBjcmVhdGVFbGVtZW50IChkb2MgOiBkb2N1bWVudCB0KSBuYW1lID0gZG9jIyNjcmVhdGVFbGVtZW50TlMgeG1sbnMgKEpzLnN0cmluZyBuYW1lKVxuXG5sZXQgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgbmFtZSA9IEpzLlVuc2FmZS5jb2VyY2UgKGNyZWF0ZUVsZW1lbnQgZG9jIG5hbWUpXG5cbmxldCBjcmVhdGVBIGRvYyA6IGFFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFcIlxuXG5sZXQgY3JlYXRlQWx0R2x5cGggZG9jIDogYWx0R2x5cGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFsdGdseXBoXCJcblxubGV0IGNyZWF0ZUFsdEdseXBoRGVmIGRvYyA6IGFsdEdseXBoRGVmRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbHRnbHlwaGRlZlwiXG5cbmxldCBjcmVhdGVBbHRHbHlwaEl0ZW0gZG9jIDogYWx0R2x5cGhJdGVtRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbHRnbHlwaGl0ZW1cIlxuXG5sZXQgY3JlYXRlQW5pbWF0ZSBkb2MgOiBhbmltYXRlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbmltYXRlXCJcblxubGV0IGNyZWF0ZUFuaW1hdGVDb2xvciBkb2MgOiBhbmltYXRlQ29sb3JFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFuaW1hdGVjb2xvclwiXG5cbmxldCBjcmVhdGVBbmltYXRlTW90aW9uIGRvYyA6IGFuaW1hdGVNb3Rpb25FbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFuaW1hdGVtb3Rpb25cIlxuXG5sZXQgY3JlYXRlQW5pbWF0ZVRyYW5zZm9ybSBkb2MgOiBhbmltYXRlVHJhbnNmb3JtRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbmltYXRldHJhbnNmb3JtXCJcblxubGV0IGNyZWF0ZUNpcmNsZSBkb2MgOiBjaXJjbGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNpcmNsZVwiXG5cbmxldCBjcmVhdGVDbGlwUGF0aCBkb2MgOiBjbGlwUGF0aEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY2xpcHBhdGhcIlxuXG4oKiBsZXQgY3JlYXRlQ29sb3JQcm9maWxlIGRvYyA6IGNvbG9yUHJvZmlsZSB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjb2xvci1wcm9maWxlXCIgKilcbmxldCBjcmVhdGVDdXJzb3IgZG9jIDogY3Vyc29yRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjdXJzb3JcIlxuXG5sZXQgY3JlYXRlRGVmcyBkb2MgOiBkZWZzRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJkZWZzXCJcblxubGV0IGNyZWF0ZURlc2MgZG9jIDogZGVzY0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZGVzY1wiXG5cbmxldCBjcmVhdGVFbGxpcHNlIGRvYyA6IGVsbGlwc2VFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImVsbGlwc2VcIlxuXG4oKiBsZXQgY3JlYXRlRmUqICopXG5sZXQgY3JlYXRlRmlsdGVyIGRvYyA6IGZpbHRlckVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZmlsdGVyXCJcblxubGV0IGNyZWF0ZUZvbnQgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udFwiXG5cbmxldCBjcmVhdGVGb250RmFjZSBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250LWZhY2VcIlxuXG5sZXQgY3JlYXRlRm9udEZhY2VGb3JtYXQgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udC1mYWNlLWZvcm1hdFwiXG5cbmxldCBjcmVhdGVGb250RmFjZU5hbWUgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udC1mYWNlLW5hbWVcIlxuXG5sZXQgY3JlYXRlRm9udEZhY2VTcmMgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udC1mYWNlLXNyY1wiXG5cbmxldCBjcmVhdGVGb250RmFjZVVyaSBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250LWZhY2UtdXJpXCJcblxubGV0IGNyZWF0ZUZvcmVpZ25PYmplY3QgZG9jIDogZm9yZWlnbk9iamVjdEVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9yZWlnbk9iamVjdFwiXG5cbmxldCBjcmVhdGVHIGRvYyA6IGdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImdcIlxuXG5sZXQgY3JlYXRlR2x5cGggZG9jIDogZ2x5cGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImdseXBoXCJcblxubGV0IGNyZWF0ZUdseXBoUmVmIGRvYyA6IGdseXBoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJnbHlwaHJlZlwiXG5cbmxldCBjcmVhdGVoa2VybiBkb2MgOiBlbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImhrZXJuXCJcblxubGV0IGNyZWF0ZUltYWdlIGRvYyA6IGltYWdlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJpbWFnZVwiXG5cbmxldCBjcmVhdGVMaW5lRWxlbWVudCBkb2MgOiBsaW5lRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsaW5lXCJcblxubGV0IGNyZWF0ZUxpbmVhckVsZW1lbnQgZG9jIDogbGluZWFyR3JhZGllbnRFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxpbmVhcmdyYWRpZW50XCJcblxuKCogbGV0IGNyZWF0ZU1hcmtlciBkb2MgOiBtYXJrZXJFbGVtZW50ICopXG5sZXQgY3JlYXRlTWFzayBkb2MgOiBtYXNrRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtYXNrXCJcblxubGV0IGNyZWF0ZU1ldGFEYXRhIGRvYyA6IG1ldGFkYXRhRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtZXRhZGF0YVwiXG5cbmxldCBjcmVhdGVNaXNzaW5nR2x5cGggZG9jIDogZ2x5cGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1pc3NpbmctZ2x5cGhcIlxuXG5sZXQgY3JlYXRlTVBhdGggZG9jIDogbVBhdGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1wYXRoXCJcblxubGV0IGNyZWF0ZVBhdGggZG9jIDogcGF0aEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicGF0aFwiXG5cbmxldCBjcmVhdGVQYXR0ZXJuIGRvYyA6IHBhdHRlcm5FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBhdHRlcm5cIlxuXG5sZXQgY3JlYXRlUG9seWdvbiBkb2MgOiBwb2x5Z29uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwb2x5Z29uXCJcblxubGV0IGNyZWF0ZVBvbHlsaW5lIGRvYyA6IHBvbHlMaW5lRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwb2x5bGluZVwiXG5cbmxldCBjcmVhdGVSYWRpYWxncmFkaWVudCBkb2MgOiByYWRpYWxHcmFkaWVudEVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicmFkaWFsZ3JhZGllbnRcIlxuXG5sZXQgY3JlYXRlUmVjdCBkb2MgOiByZWN0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJyZWN0XCJcblxubGV0IGNyZWF0ZVNjcmlwdCBkb2MgOiBzY3JpcHRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInNjcmlwdFwiXG5cbmxldCBjcmVhdGVTZXQgZG9jIDogc2V0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzZXRcIlxuXG5sZXQgY3JlYXRlU3RvcCBkb2MgOiBzdG9wRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzdG9wXCJcblxubGV0IGNyZWF0ZVN0eWxlIGRvYyA6IHN0eWxlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzdHlsZVwiXG5cbmxldCBjcmVhdGVTdmcgZG9jIDogc3ZnRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzdmdcIlxuXG5sZXQgY3JlYXRlU3dpdGNoIGRvYyA6IHN3aXRjaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3dpdGNoXCJcblxubGV0IGNyZWF0ZVN5bWJvbCBkb2MgOiBzeW1ib2xFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN5bWJvbFwiXG5cbmxldCBjcmVhdGVUZXh0RWxlbWVudCBkb2MgOiB0ZXh0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0ZXh0XCJcblxubGV0IGNyZWF0ZVRleHRwYXRoIGRvYyA6IHRleHRQYXRoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0ZXh0cGF0aFwiXG5cbmxldCBjcmVhdGVUaXRsZSBkb2MgOiB0aXRsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGl0bGVcIlxuXG5sZXQgY3JlYXRlVHJlZiBkb2MgOiB0cmVmRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0cmVmXCJcblxubGV0IGNyZWF0ZVRzcGFuIGRvYyA6IHRzcGFuRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0c3BhblwiXG5cbmxldCBjcmVhdGVVc2UgZG9jIDogdXNlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ1c2VcIlxuXG5sZXQgY3JlYXRlVmlldyBkb2MgOiB2aWV3RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ2aWV3XCJcblxubGV0IGNyZWF0ZXZrZXJuIGRvYyA6IGVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidmtlcm5cIlxuXG4oKioqKilcblxubGV0IHN2Z19lbGVtZW50IDogZWxlbWVudCB0IGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fU1ZHRWxlbWVudFxuXG5sZXQgZG9jdW1lbnQgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuZG9jdW1lbnRcblxubGV0IGdldEVsZW1lbnRCeUlkIGlkIDogZWxlbWVudCB0ID1cbiAgSnMuT3B0LmNhc2VcbiAgICAoSnMuVW5zYWZlLmdsb2JhbCMjLmRvY3VtZW50IyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIGlkKSlcbiAgICAoZnVuICgpIC0+IHJhaXNlIE5vdF9mb3VuZClcbiAgICAoZnVuIGUgLT4gaWYgSnMuaW5zdGFuY2VvZiBlIHN2Z19lbGVtZW50IHRoZW4gZSBlbHNlIHJhaXNlIE5vdF9mb3VuZClcblxubW9kdWxlIENvZXJjZVRvID0gc3RydWN0XG4gIGxldCBlbGVtZW50IChlIDogI0RvbS5ub2RlIEpzLnQpIDogZWxlbWVudCBKcy50IEpzLm9wdCA9XG4gICAgaWYgSnMuaW5zdGFuY2VvZiBlIHN2Z19lbGVtZW50IHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKSBlbHNlIEpzLm51bGxcblxuICBsZXQgdW5zYWZlQ29lcmNlIChlIDogI2VsZW1lbnQgdCkgdGFnID1cbiAgICBpZiBlIyMudGFnTmFtZSMjdG9Mb3dlckNhc2UgPT0gSnMuc3RyaW5nIHRhZ1xuICAgIHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBhIGUgOiBhRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYVwiXG5cbiAgbGV0IGFsdEdseXBoIGUgOiBhbHRHbHlwaEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFsdGdseXBoXCJcblxuICBsZXQgYWx0R2x5cGhEZWYgZSA6IGFsdEdseXBoRGVmRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYWx0Z2x5cGhkZWZcIlxuXG4gIGxldCBhbHRHbHlwaEl0ZW0gZSA6IGFsdEdseXBoSXRlbUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFsdGdseXBoaXRlbVwiXG5cbiAgbGV0IGFuaW1hdGUgZSA6IGFuaW1hdGVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbmltYXRlXCJcblxuICBsZXQgYW5pbWF0ZUNvbG9yIGUgOiBhbmltYXRlQ29sb3JFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbmltYXRlY29sb3JcIlxuXG4gIGxldCBhbmltYXRlTW90aW9uIGUgOiBhbmltYXRlTW90aW9uRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYW5pbWF0ZW1vdGlvblwiXG5cbiAgbGV0IGFuaW1hdGVUcmFuc2Zvcm0gZSA6IGFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50IHQgb3B0ID1cbiAgICB1bnNhZmVDb2VyY2UgZSBcImFuaW1hdGV0cmFuc2Zvcm1cIlxuXG4gIGxldCBjaXJjbGUgZSA6IGNpcmNsZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImNpcmNsZVwiXG5cbiAgbGV0IGNsaXBQYXRoIGUgOiBjbGlwUGF0aEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImNsaXBwYXRoXCJcblxuICAoKiBsZXQgQ29sb3JQcm9maWxlIGUgOiBjb2xvclByb2ZpbGUgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImNvbG9yLXByb2ZpbGVcIiAqKVxuICBsZXQgY3Vyc29yIGUgOiBjdXJzb3JFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJjdXJzb3JcIlxuXG4gIGxldCBkZWZzIGUgOiBkZWZzRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZGVmc1wiXG5cbiAgbGV0IGRlc2MgZSA6IGRlc2NFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJkZXNjXCJcblxuICBsZXQgZWxsaXBzZSBlIDogZWxsaXBzZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImVsbGlwc2VcIlxuXG4gICgqIGxldCBGZSogKilcbiAgbGV0IGZpbHRlciBlIDogZmlsdGVyRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZmlsdGVyXCJcblxuICBsZXQgZm9udCBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnRcIlxuXG4gIGxldCBmb250RmFjZSBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnQtZmFjZVwiXG5cbiAgbGV0IGZvbnRGYWNlRm9ybWF0IGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udC1mYWNlLWZvcm1hdFwiXG5cbiAgbGV0IGZvbnRGYWNlTmFtZSBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnQtZmFjZS1uYW1lXCJcblxuICBsZXQgZm9udEZhY2VTcmMgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250LWZhY2Utc3JjXCJcblxuICBsZXQgZm9udEZhY2VVcmkgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250LWZhY2UtdXJpXCJcblxuICBsZXQgZm9yZWlnbk9iamVjdCBlIDogZm9yZWlnbk9iamVjdEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvcmVpZ25vYmplY3RcIlxuXG4gIGxldCBnIGUgOiBnRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZ1wiXG5cbiAgbGV0IGdseXBoIGUgOiBnbHlwaEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImdseXBoXCJcblxuICBsZXQgZ2x5cGhSZWYgZSA6IGdseXBoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZ2x5cGhyZWZcIlxuXG4gIGxldCBoa2VybiBlIDogZWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiaGtlcm5cIlxuXG4gIGxldCBpbWFnZSBlIDogaW1hZ2VFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJpbWFnZVwiXG5cbiAgbGV0IGxpbmVFbGVtZW50IGUgOiBsaW5lRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibGluZVwiXG5cbiAgbGV0IGxpbmVhckVsZW1lbnQgZSA6IGxpbmVhckdyYWRpZW50RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibGluZWFyZ3JhZGllbnRcIlxuXG4gICgqIGxldCBNYXJrZXIgZSA6IG1hcmtlckVsZW1lbnQgKilcbiAgbGV0IG1hc2sgZSA6IG1hc2tFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJtYXNrXCJcblxuICBsZXQgbWV0YURhdGEgZSA6IG1ldGFkYXRhRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibWV0YWRhdGFcIlxuXG4gIGxldCBtaXNzaW5nR2x5cGggZSA6IGdseXBoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibWlzc2luZy1nbHlwaFwiXG5cbiAgbGV0IG1QYXRoIGUgOiBtUGF0aEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcIm1wYXRoXCJcblxuICBsZXQgcGF0aCBlIDogcGF0aEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInBhdGhcIlxuXG4gIGxldCBwYXR0ZXJuIGUgOiBwYXR0ZXJuRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicGF0dGVyblwiXG5cbiAgbGV0IHBvbHlnb24gZSA6IHBvbHlnb25FbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJwb2x5Z29uXCJcblxuICBsZXQgcG9seWxpbmUgZSA6IHBvbHlMaW5lRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicG9seWxpbmVcIlxuXG4gIGxldCByYWRpYWxncmFkaWVudCBlIDogcmFkaWFsR3JhZGllbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJyYWRpYWxncmFkaWVudFwiXG5cbiAgbGV0IHJlY3QgZSA6IHJlY3RFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJyZWN0XCJcblxuICBsZXQgc2NyaXB0IGUgOiBzY3JpcHRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzY3JpcHRcIlxuXG4gIGxldCBzZXQgZSA6IHNldEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInNldFwiXG5cbiAgbGV0IHN0b3AgZSA6IHN0b3BFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzdG9wXCJcblxuICBsZXQgc3R5bGUgZSA6IHN0eWxlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic3R5bGVcIlxuXG4gIGxldCBzdmcgZSA6IHN2Z0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInN2Z1wiXG5cbiAgbGV0IHN3aXRjaCBlIDogc3dpdGNoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic3dpdGNoXCJcblxuICBsZXQgc3ltYm9sIGUgOiBzeW1ib2xFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzeW1ib2xcIlxuXG4gIGxldCB0ZXh0RWxlbWVudCBlIDogdGV4dEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInRleHRcIlxuXG4gIGxldCB0ZXh0cGF0aCBlIDogdGV4dFBhdGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ0ZXh0cGF0aFwiXG5cbiAgbGV0IHRpdGxlIGUgOiB0aXRsZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInRpdGxlXCJcblxuICBsZXQgdHJlZiBlIDogdHJlZkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInRyZWZcIlxuXG4gIGxldCB0c3BhbiBlIDogdHNwYW5FbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ0c3BhblwiXG5cbiAgbGV0IHVzZSBlIDogdXNlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidXNlXCJcblxuICBsZXQgdmlldyBlIDogdmlld0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInZpZXdcIlxuXG4gIGxldCB2a2VybiBlIDogZWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidmtlcm5cIlxuZW5kXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE0IEh1Z28gSGV1emFyZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG4oKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRTb3VyY2UgKilcbm9wZW4gSnNcbm9wZW4gRG9tXG5vcGVuISBJbXBvcnRcblxudHlwZSBzdGF0ZSA9XG4gIHwgQ09OTkVDVElOR1xuICB8IE9QRU5cbiAgfCBDTE9TRURcblxuY2xhc3MgdHlwZSBbJ2FdIG1lc3NhZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgWydhXSBEb20uZXZlbnRcblxuICAgIG1ldGhvZCBkYXRhIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9yaWdpbiA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsYXN0RXZlbnRJZCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgICAoKiBtZXRob2Qgc291cmNlIDogdW5pdCAqKVxuICBlbmRcblxuY2xhc3MgdHlwZSBldmVudFNvdXJjZSA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgbWV0aG9kIHVybCA6IHN0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aXRoQ3JlZGVudGlhbHMgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiBzdGF0ZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xvc2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBvbm9wZW4gOiAoJ3NlbGYgdCwgJ3NlbGYgbWVzc2FnZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tZXNzYWdlIDogKCdzZWxmIHQsICdzZWxmIG1lc3NhZ2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOiAoJ3NlbGYgdCwgJ3NlbGYgbWVzc2FnZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG9wdGlvbnMgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgd2l0aENyZWRlbnRpYWxzIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgd2l0aENyZWRlbnRpYWxzIGIgOiBvcHRpb25zIHQgPVxuICBsZXQgaW5pdCA9IEpzLlVuc2FmZS5vYmogW3x8XSBpblxuICBpbml0IyMud2l0aENyZWRlbnRpYWxzIDo9IEpzLmJvb2wgYjtcbiAgaW5pdFxuXG5sZXQgZXZlbnRTb3VyY2UgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0V2ZW50U291cmNlXG5cbmxldCBldmVudFNvdXJjZV9vcHRpb25zID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9FdmVudFNvdXJjZVxuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lciA9IERvbS5hZGRFdmVudExpc3RlbmVyXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgY29uc29sZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsb2cgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ18yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ18zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ181IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ182IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzcgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ184IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlYnVnIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWJ1Z18yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlYnVnXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWJ1Z180IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWJ1Z181IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluZm8gOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluZm9fMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbmZvXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbmZvXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluZm9fNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3YXJuIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3YXJuXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd2Fybl8zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd2Fybl80IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3YXJuXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXJyb3IgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVycm9yXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXJyb3JfMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVycm9yXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVycm9yXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XyA6IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfMSA6IGJvb2wgdCAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF8yIDogYm9vbCB0IC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfMyA6IGJvb2wgdCAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfNCA6IGJvb2wgdCAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF81IDogYm9vbCB0IC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkaXIgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRpcnhtbCA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdHJhY2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cCA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBfMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cF8zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBfNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBfNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cENvbGxhcHNlZCA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBDb2xsYXBzZWRfMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cENvbGxhcHNlZF8zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBDb2xsYXBzZWRfNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBDb2xsYXBzZWRfNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cEVuZCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRpbWUgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0aW1lRW5kIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5leHRlcm5hbCBnZXRfY29uc29sZSA6IHVuaXQgLT4gY29uc29sZSB0ID0gXCJjYW1sX2pzX2dldF9jb25zb2xlXCJcblxubGV0IGNvbnNvbGUgPSBnZXRfY29uc29sZSAoKVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNSBTdMOpcGhhbmUgTGVncmFuZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbnR5cGUgcG9zaXRpb25FcnJvckNvZGVcblxudHlwZSB3YXRjaElkXG5cbmNsYXNzIHR5cGUgY29vcmRpbmF0ZXMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGF0aXR1ZGUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbG9uZ2l0dWRlIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsdGl0dWRlIDogZmxvYXQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2N1cmFjeSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbHRpdHVkZUFjY3VyYWN5IDogZmxvYXQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWFkaW5nIDogZmxvYXQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzcGVlZCA6IGZsb2F0IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBvc2l0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNvb3JkcyA6IGNvb3JkaW5hdGVzIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRpbWVzdGFtcCA6IEpzLmRhdGUgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwb3NpdGlvbk9wdGlvbnMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZW5hYmxlSGlnaEFjY3VyYWN5IDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRpbWVvdXQgOiBpbnQgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtYXhpbXVtQWdlIDogaW50IEpzLndyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBvc2l0aW9uRXJyb3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgX1BFUk1JU1NJT05fREVOSUVEXyA6IHBvc2l0aW9uRXJyb3JDb2RlIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9TSVRJT05fVU5BVkFJTEFCTEVfIDogcG9zaXRpb25FcnJvckNvZGUgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9USU1FT1VUIDogcG9zaXRpb25FcnJvckNvZGUgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvZGUgOiBwb3NpdGlvbkVycm9yQ29kZSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWVzc2FnZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZ2VvbG9jYXRpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgZ2V0Q3VycmVudFBvc2l0aW9uIDpcbiAgICAgICAgIChwb3NpdGlvbiBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgICAtPiAocG9zaXRpb25FcnJvciBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgICAtPiBwb3NpdGlvbk9wdGlvbnMgSnMudFxuICAgICAgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgd2F0Y2hQb3NpdGlvbiA6XG4gICAgICAgICAocG9zaXRpb24gSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAgLT4gKHBvc2l0aW9uRXJyb3IgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAgLT4gcG9zaXRpb25PcHRpb25zIEpzLnRcbiAgICAgIC0+IHdhdGNoSWQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyV2F0Y2ggOiB3YXRjaElkIC0+IHVuaXQgSnMubWV0aFxuICBlbmRcblxubGV0IGVtcHR5X3Bvc2l0aW9uX29wdGlvbnMgKCkgPSBKcy5VbnNhZmUub2JqIFt8fF1cblxubGV0IGdlb2xvY2F0aW9uID1cbiAgbGV0IHggPSBKcy5VbnNhZmUuZ2xvYmFsIyMubmF2aWdhdG9yIGluXG4gIGlmIEpzLk9wdGRlZi50ZXN0IHggdGhlbiB4IyMuZ2VvbG9jYXRpb24gZWxzZSB4XG5cbigqIHVuZGVmaW5lZCAqKVxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgZ2VvbG9jYXRpb25cbiIsImNsYXNzIHR5cGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0YXJnZXQgOiBEb20ubm9kZSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBib3VuZGluZ0NsaWVudFJlY3QgOiBEb21faHRtbC5jbGllbnRSZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJvb3RCb3VuZHMgOiBEb21faHRtbC5jbGllbnRSZWN0IEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbnRlcnNlY3Rpb25SZWN0IDogRG9tX2h0bWwuY2xpZW50UmVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbnRlcnNlY3Rpb25SYXRpbyA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpc0ludGVyc2VjdGluZyA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGltZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJPcHRpb25zID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHJvb3QgOiBEb20ubm9kZSBKcy50IEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgcm9vdE1hcmdpbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGhyZXNob2xkIDogZmxvYXQgSnMuanNfYXJyYXkgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBpbnRlcnNlY3Rpb25PYnNlcnZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCByb290IDogRG9tLm5vZGUgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJvb3RNYXJnaW4gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGhyZXNob2xkcyA6IGZsb2F0IEpzLmpzX2FycmF5IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ic2VydmUgOiAjRG9tLm5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB1bm9ic2VydmUgOiAjRG9tLm5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBkaXNjb25uZWN0IDogdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgdGFrZVJlY29yZHMgOiBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMubWV0aFxuICBlbmRcblxubGV0IGVtcHR5X2ludGVyc2VjdGlvbl9vYnNlcnZlcl9vcHRpb25zICgpIDogaW50ZXJzZWN0aW9uT2JzZXJ2ZXJPcHRpb25zIEpzLnQgPVxuICBKcy5VbnNhZmUub2JqIFt8fF1cblxubGV0IGludGVyc2VjdGlvbk9ic2VydmVyX3Vuc2FmZSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IGludGVyc2VjdGlvbk9ic2VydmVyX3Vuc2FmZVxuXG5sZXQgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgOlxuICAgICggICAoICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLnRcbiAgICAgICAgIC0+IGludGVyc2VjdGlvbk9ic2VydmVyIEpzLnRcbiAgICAgICAgIC0+IHVuaXQpXG4gICAgICAgIEpzLmNhbGxiYWNrXG4gICAgIC0+IGludGVyc2VjdGlvbk9ic2VydmVyT3B0aW9ucyBKcy50XG4gICAgIC0+IGludGVyc2VjdGlvbk9ic2VydmVyIEpzLnQpXG4gICAgSnMuY29uc3RyID1cbiAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJfdW5zYWZlXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE4IFN0w6lwaGFuZSBMZWdyYW5kXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxubW9kdWxlIHR5cGUgU2hhcmVkID0gc2lnXG4gIGNsYXNzIHR5cGUgb2JqZWN0X29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG4gICAgZW5kXG5cbiAgdmFsIG9iamVjdF9vcHRpb25zIDogdW5pdCAtPiBvYmplY3Rfb3B0aW9ucyBKcy50XG5cbiAgY2xhc3MgdHlwZSBfb2JqZWN0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBzdXBwb3J0ZWRMb2NhbGVzT2YgOlxuICAgICAgICAgICBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50XG4gICAgICAgIC0+IG9iamVjdF9vcHRpb25zIEpzLnQgSnMub3B0ZGVmXG4gICAgICAgIC0+IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbm1vZHVsZSBTaGFyZWQgOiBTaGFyZWQgPSBzdHJ1Y3RcbiAgY2xhc3MgdHlwZSBvYmplY3Rfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcbiAgICBlbmRcblxuICBsZXQgb2JqZWN0X29wdGlvbnMgKCkgPVxuICAgIG9iamVjdCVqc1xuICAgICAgdmFsIG11dGFibGUgbG9jYWxlTWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIF9vYmplY3QgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIHN1cHBvcnRlZExvY2FsZXNPZiA6XG4gICAgICAgICAgIEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnRcbiAgICAgICAgLT4gb2JqZWN0X29wdGlvbnMgSnMudCBKcy5vcHRkZWZcbiAgICAgICAgLT4gSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxubW9kdWxlIENvbGxhdG9yID0gc3RydWN0XG4gIGluY2x1ZGUgU2hhcmVkXG5cbiAgY2xhc3MgdHlwZSByZXNvbHZlZF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCB1c2FnZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHNlbnNpdGl2aXR5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgaWdub3JlUHVuY3R1YXRpb24gOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgY29sbGF0aW9uIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbnVtZXJpYyA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBjYXNlRmlyc3QgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBvcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdXNhZ2UgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBzZW5zaXRpdml0eSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIGlnbm9yZVB1bmN0dWF0aW9uIDogYm9vbCBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIG51bWVyaWMgOiBib29sIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgY2FzZUZpcnN0IDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuICAgIGVuZFxuXG4gIGxldCBvcHRpb25zICgpID1cbiAgICBvYmplY3QlanNcbiAgICAgIHZhbCBtdXRhYmxlIGxvY2FsZU1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIHVzYWdlID0gSnMuc3RyaW5nIFwic29ydFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIHNlbnNpdGl2aXR5ID0gSnMuc3RyaW5nIFwidmFyaWFudFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIGlnbm9yZVB1bmN0dWF0aW9uID0gSnMuX2ZhbHNlXG5cbiAgICAgIHZhbCBtdXRhYmxlIG51bWVyaWMgPSBKcy5fZmFsc2VcblxuICAgICAgdmFsIG11dGFibGUgY2FzZUZpcnN0ID0gSnMuc3RyaW5nIFwiZmFsc2VcIlxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgY29tcGFyZSA6IChKcy5qc19zdHJpbmcgSnMudCAtPiBKcy5qc19zdHJpbmcgSnMudCAtPiBpbnQpIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHJlc29sdmVkT3B0aW9ucyA6IHVuaXQgLT4gcmVzb2x2ZWRfb3B0aW9ucyBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5tb2R1bGUgRGF0ZVRpbWVGb3JtYXQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTaGFyZWRcblxuICBjbGFzcyB0eXBlIHJlc29sdmVkX29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGNhbGVuZGFyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbnVtYmVyaW5nU3lzdGVtIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgdGltZVpvbmUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBob3VyMTIgOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2Qgd2Vla2RheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBlcmEgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgeWVhciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtb250aCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBkYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgaG91ciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW51dGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2Qgc2Vjb25kIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIHRpbWVab25lTmFtZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBvcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBkYXRlU3R5bGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdGltZVN0eWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGNhbGVuZGFyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGRheVBlcmlvZCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1iZXJpbmdTeXN0ZW0gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHRpbWVab25lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGhvdXIxMiA6IGJvb2wgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgaG91ckN5Y2xlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGZvcm1hdE1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB3ZWVrZGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGVyYSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB5ZWFyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1vbnRoIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGRheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBob3VyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1pbnV0ZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBzZWNvbmQgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgZnJhY3Rpb25hbFNlY29uZERpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdGltZVpvbmVOYW1lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcbiAgICBlbmRcblxuICBsZXQgb3B0aW9ucyAoKSA6IG9wdGlvbnMgSnMudCA9XG4gICAgb2JqZWN0JWpzXG4gICAgICB2YWwgbXV0YWJsZSBkYXRlU3R5bGUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgdGltZVN0eWxlID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGNhbGVuZGFyID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGRheVBlcmlvZCA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBudW1iZXJpbmdTeXN0ZW0gPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbG9jYWxlTWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcblxuICAgICAgdmFsIG11dGFibGUgdGltZVpvbmUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgaG91cjEyID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGhvdXJDeWNsZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBmb3JtYXRNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSB3ZWVrZGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGVyYSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB5ZWFyID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1vbnRoID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGRheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBob3VyID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1pbnV0ZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBzZWNvbmQgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgZnJhY3Rpb25hbFNlY29uZERpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB0aW1lWm9uZU5hbWUgPSBKcy51bmRlZmluZWRcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIGZvcm1hdF9wYXJ0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBfdHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIF92YWx1ZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIHQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGZvcm1hdCA6IChKcy5kYXRlIEpzLnQgLT4gSnMuanNfc3RyaW5nIEpzLnQpIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGZvcm1hdFRvUGFydHMgOlxuICAgICAgICBKcy5kYXRlIEpzLnQgSnMub3B0ZGVmIC0+IGZvcm1hdF9wYXJ0IEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG5cbiAgICAgIG1ldGhvZCByZXNvbHZlZE9wdGlvbnMgOiB1bml0IC0+IHJlc29sdmVkX29wdGlvbnMgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxubW9kdWxlIE51bWJlckZvcm1hdCA9IHN0cnVjdFxuICBpbmNsdWRlIFNoYXJlZFxuXG4gIGNsYXNzIHR5cGUgcmVzb2x2ZWRfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbnVtYmVyaW5nU3lzdGVtIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2Qgc3R5bGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBjdXJyZW5jeSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBjdXJyZW5jeURpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgdXNlR3JvdXBpbmcgOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUludGVnZXJEaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgY29tcGFjdERpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgY3VycmVuY3kgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgY3VycmVuY3lEaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGN1cnJlbmN5U2lnbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgbm90YXRpb24gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbnVtYmVyaW5nU3lzdGVtIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHNpZ25EaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHN0eWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdW5pdCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB1bml0RGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB1c2VHcm91cGluZyA6IGJvb2wgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCByb3VuZGluZ01vZGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgcm91bmRpbmdQcmlvcml0eSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCByb3VuZGluZ0luY3JlbWVudCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB0cmFpbGluZ1plcm9EaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1JbnRlZ2VyRGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcbiAgICBlbmRcblxuICBsZXQgb3B0aW9ucyAoKSA6IG9wdGlvbnMgSnMudCA9XG4gICAgb2JqZWN0JWpzXG4gICAgICB2YWwgbXV0YWJsZSBjb21wYWN0RGlzcGxheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBjdXJyZW5jeSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBjdXJyZW5jeURpc3BsYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgY3VycmVuY3lTaWduID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGxvY2FsZU1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIG5vdGF0aW9uID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG51bWJlcmluZ1N5c3RlbSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBzaWduRGlzcGxheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBzdHlsZSA9IEpzLnN0cmluZyBcImRlY2ltYWxcIlxuXG4gICAgICB2YWwgbXV0YWJsZSB1bml0ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHVuaXREaXNwbGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHVzZUdyb3VwaW5nID0gSnMuX3RydWVcblxuICAgICAgdmFsIG11dGFibGUgcm91bmRpbmdNb2RlID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHJvdW5kaW5nUHJpb3JpdHkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgcm91bmRpbmdJbmNyZW1lbnQgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgdHJhaWxpbmdaZXJvRGlzcGxheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtaW5pbXVtSW50ZWdlckRpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWF4aW11bUZyYWN0aW9uRGlnaXRzID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1pbmltdW1TaWduaWZpY2FudERpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgPSBKcy51bmRlZmluZWRcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIGZvcm1hdF9wYXJ0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBfdHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIF92YWx1ZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIHQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGZvcm1hdCA6IChKcy5udW1iZXIgSnMudCAtPiBKcy5qc19zdHJpbmcgSnMudCkgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgZm9ybWF0VG9QYXJ0cyA6XG4gICAgICAgIEpzLm51bWJlciBKcy50IEpzLm9wdGRlZiAtPiBmb3JtYXRfcGFydCBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuXG4gICAgICBtZXRob2QgcmVzb2x2ZWRPcHRpb25zIDogdW5pdCAtPiByZXNvbHZlZF9vcHRpb25zIEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbm1vZHVsZSBQbHVyYWxSdWxlcyA9IHN0cnVjdFxuICBpbmNsdWRlIFNoYXJlZFxuXG4gIGNsYXNzIHR5cGUgcmVzb2x2ZWRfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgcGx1cmFsQ2F0ZWdvcmllcyA6IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgX3R5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtSW50ZWdlckRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBvcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgX3R5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG4gICAgZW5kXG5cbiAgbGV0IG9wdGlvbnMgKCkgOiBvcHRpb25zIEpzLnQgPVxuICAgIG9iamVjdCVqc1xuICAgICAgdmFsIG11dGFibGUgbG9jYWxlTWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcblxuICAgICAgdmFsIG11dGFibGUgX3R5cGUgPSBKcy5zdHJpbmcgXCJjYXJkaW5hbFwiXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSB0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBzZWxlY3QgOiBKcy5udW1iZXIgSnMudCAtPiBKcy5qc19zdHJpbmcgSnMudCBKcy5tZXRoXG5cbiAgICAgIG1ldGhvZCByZXNvbHZlZE9wdGlvbnMgOiB1bml0IC0+IHJlc29sdmVkX29wdGlvbnMgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxuY2xhc3MgdHlwZSBpbnRsID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF9Db2xsYXRvciA6IENvbGxhdG9yLl9vYmplY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RhdGVUaW1lRm9ybWF0IDogRGF0ZVRpbWVGb3JtYXQuX29iamVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTnVtYmVyRm9ybWF0IDogTnVtYmVyRm9ybWF0Ll9vYmplY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BsdXJhbFJ1bGVzIDogUGx1cmFsUnVsZXMuX29iamVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRDYW5vbmljYWxMb2NhbGVzIDpcbiAgICAgIEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgLT4gSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgaW50bCA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50bFxuXG5sZXQgY29sbGF0b3JfY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRsIyMuX0NvbGxhdG9yXG5cbmxldCBkYXRlVGltZUZvcm1hdF9jb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGwjIy5fRGF0ZVRpbWVGb3JtYXRcblxubGV0IG51bWJlckZvcm1hdF9jb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGwjIy5fTnVtYmVyRm9ybWF0XG5cbmxldCBwbHVyYWxSdWxlc19jb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGwjIy5fUGx1cmFsUnVsZXNcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IGludGxcbiIsIm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdmFsIHByZV90ZXN0X2hvb2sgOiB1bml0IC0+IHVuaXRcbmVuZFxuXG5sZXQgcHJlX3Rlc3RfaG9vayA9IGlnbm9yZVxuIiwiW0BAQG9jYW1sLndhcm5pbmcgXCItM1wiXVxuXG4oKiBibGl0X3N0cmluZyBkb2Vzbid0IGV4aXN0IGluIFtTdGRMYWJlbHMuQnl0ZXNdLi4uICAqKVxubGV0IGJ5dGVzX2JsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3MgfmRzdCB+ZHN0X3BvcyB+bGVuID1cbiAgQnl0ZXMuYmxpdF9zdHJpbmcgc3JjIHNyY19wb3MgZHN0IGRzdF9wb3MgbGVuXG47O1xuXG5vcGVuIFN0ZExhYmVsc1xub3BlbiBGb3JtYXRcblxuKCoqIFR5cGUgb2YgUy1leHByZXNzaW9ucyAqKVxudHlwZSB0ID1cbiAgfCBBdG9tIG9mIHN0cmluZ1xuICB8IExpc3Qgb2YgdCBsaXN0XG5cbmxldCBzZXhwX29mX3QgdCA9IHRcbmxldCB0X29mX3NleHAgdCA9IHRcblxubGV0IHJlYyBjb21wYXJlX2xpc3QgYSBiID1cbiAgbWF0Y2ggYSwgYiB3aXRoXG4gIHwgW10sIFtdIC0+IDBcbiAgfCBbXSwgXyAtPiAtMVxuICB8IF8sIFtdIC0+IDFcbiAgfCB4IDo6IHhzLCB5IDo6IHlzIC0+XG4gICAgbGV0IHJlcyA9IGNvbXBhcmUgeCB5IGluXG4gICAgaWYgcmVzIDw+IDAgdGhlbiByZXMgZWxzZSBjb21wYXJlX2xpc3QgeHMgeXNcblxuYW5kIGNvbXBhcmUgYSBiID1cbiAgaWYgYSA9PSBiXG4gIHRoZW4gMFxuICBlbHNlIChcbiAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IEF0b20gYSwgQXRvbSBiIC0+IFN0cmluZy5jb21wYXJlIGEgYlxuICAgIHwgQXRvbSBfLCBfIC0+IC0xXG4gICAgfCBfLCBBdG9tIF8gLT4gMVxuICAgIHwgTGlzdCBhLCBMaXN0IGIgLT4gY29tcGFyZV9saXN0IGEgYilcbjs7XG5cbmxldCBlcXVhbCBhIGIgPSBjb21wYXJlIGEgYiA9IDBcblxuZXhjZXB0aW9uIE5vdF9mb3VuZF9zIG9mIHRcbmV4Y2VwdGlvbiBPZl9zZXhwX2Vycm9yIG9mIGV4biAqIHRcblxubW9kdWxlIFByaW50aW5nID0gc3RydWN0XG4gICgqIERlZmF1bHQgaW5kZW50YXRpb24gbGV2ZWwgZm9yIGh1bWFuLXJlYWRhYmxlIGNvbnZlcnNpb25zICopXG5cbiAgbGV0IGRlZmF1bHRfaW5kZW50ID0gcmVmIDFcblxuICAoKiBFc2NhcGluZyBvZiBzdHJpbmdzIHVzZWQgYXMgYXRvbXMgaW4gUy1leHByZXNzaW9ucyAqKVxuXG4gIGxldCBtdXN0X2VzY2FwZSBzdHIgPVxuICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICAgIGxlbiA9IDBcbiAgICB8fFxuICAgIGxldCByZWMgbG9vcCBzdHIgaXggPVxuICAgICAgbWF0Y2ggc3RyLltpeF0gd2l0aFxuICAgICAgfCAnXCInIHwgJygnIHwgJyknIHwgJzsnIHwgJ1xcXFwnIC0+IHRydWVcbiAgICAgIHwgJ3wnIC0+XG4gICAgICAgIGl4ID4gMFxuICAgICAgICAmJlxuICAgICAgICBsZXQgbmV4dCA9IGl4IC0gMSBpblxuICAgICAgICBDaGFyLmVxdWFsIHN0ci5bbmV4dF0gJyMnIHx8IGxvb3Agc3RyIG5leHRcbiAgICAgIHwgJyMnIC0+XG4gICAgICAgIGl4ID4gMFxuICAgICAgICAmJlxuICAgICAgICBsZXQgbmV4dCA9IGl4IC0gMSBpblxuICAgICAgICBDaGFyLmVxdWFsIHN0ci5bbmV4dF0gJ3wnIHx8IGxvb3Agc3RyIG5leHRcbiAgICAgIHwgJ1xcMDAwJyAuLiAnXFwwMzInIHwgJ1xcMTI3JyAuLiAnXFwyNTUnIC0+IHRydWVcbiAgICAgIHwgXyAtPiBpeCA+IDAgJiYgbG9vcCBzdHIgKGl4IC0gMSlcbiAgICBpblxuICAgIGxvb3Agc3RyIChsZW4gLSAxKVxuICA7O1xuXG4gIGxldCBlc2NhcGVkIHMgPVxuICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzIC0gMSBkb1xuICAgICAgblxuICAgICAgOj0gIW5cbiAgICAgICAgICtcbiAgICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgICB8ICdcXFwiJyB8ICdcXFxcJyB8ICdcXG4nIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXGInIC0+IDJcbiAgICAgICAgIHwgJyAnIC4uICd+JyAtPiAxXG4gICAgICAgICB8IF8gLT4gNFxuICAgIGRvbmU7XG4gICAgaWYgIW4gPSBTdHJpbmcubGVuZ3RoIHNcbiAgICB0aGVuIHNcbiAgICBlbHNlIChcbiAgICAgIGxldCBzJyA9IEJ5dGVzLmNyZWF0ZSAhbiBpblxuICAgICAgbiA6PSAwO1xuICAgICAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICAgICAgKG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgICB8ICgnXFxcIicgfCAnXFxcXCcpIGFzIGMgLT5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiBjXG4gICAgICAgICB8ICdcXG4nIC0+XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ24nXG4gICAgICAgICB8ICdcXHQnIC0+XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ3QnXG4gICAgICAgICB8ICdcXHInIC0+XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ3InXG4gICAgICAgICB8ICdcXGInIC0+XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ2InXG4gICAgICAgICB8ICcgJyAuLiAnficgYXMgYyAtPiBCeXRlcy51bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgICAgIHwgYyAtPlxuICAgICAgICAgICBsZXQgYSA9IENoYXIuY29kZSBjIGluXG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gKENoYXIuY2hyICg0OCArIChhIC8gMTAwKSkpO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gKENoYXIuY2hyICg0OCArIChhIC8gMTAgbW9kIDEwKSkpO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gKENoYXIuY2hyICg0OCArIChhIG1vZCAxMCkpKSk7XG4gICAgICAgIGluY3IgblxuICAgICAgZG9uZTtcbiAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcycpXG4gIDs7XG5cbiAgbGV0IGVzY19zdHIgc3RyID1cbiAgICBsZXQgZXN0ciA9IGVzY2FwZWQgc3RyIGluXG4gICAgbGV0IGVsZW4gPSBTdHJpbmcubGVuZ3RoIGVzdHIgaW5cbiAgICBsZXQgcmVzID0gQnl0ZXMuY3JlYXRlIChlbGVuICsgMikgaW5cbiAgICBieXRlc19ibGl0X3N0cmluZyB+c3JjOmVzdHIgfnNyY19wb3M6MCB+ZHN0OnJlcyB+ZHN0X3BvczoxIH5sZW46ZWxlbjtcbiAgICBCeXRlcy51bnNhZmVfc2V0IHJlcyAwICdcIic7XG4gICAgQnl0ZXMudW5zYWZlX3NldCByZXMgKGVsZW4gKyAxKSAnXCInO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIDs7XG5cbiAgbGV0IGluZGV4X29mX25ld2xpbmUgc3RyIHN0YXJ0ID1cbiAgICB0cnkgU29tZSAoU3RyaW5nLmluZGV4X2Zyb20gc3RyIHN0YXJ0ICdcXG4nKSB3aXRoXG4gICAgfCBOb3RfZm91bmQgLT4gTm9uZVxuICA7O1xuXG4gIGxldCBnZXRfc3Vic3RyaW5nIHN0ciBpbmRleCBlbmRfcG9zX29wdCA9XG4gICAgbGV0IGVuZF9wb3MgPVxuICAgICAgbWF0Y2ggZW5kX3Bvc19vcHQgd2l0aFxuICAgICAgfCBOb25lIC0+IFN0cmluZy5sZW5ndGggc3RyXG4gICAgICB8IFNvbWUgZW5kX3BvcyAtPiBlbmRfcG9zXG4gICAgaW5cbiAgICBTdHJpbmcuc3ViIHN0ciB+cG9zOmluZGV4IH5sZW46KGVuZF9wb3MgLSBpbmRleClcbiAgOztcblxuICBsZXQgaXNfb25lX2xpbmUgc3RyID1cbiAgICBtYXRjaCBpbmRleF9vZl9uZXdsaW5lIHN0ciAwIHdpdGhcbiAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgIHwgU29tZSBpbmRleCAtPiBpbmRleCArIDEgPSBTdHJpbmcubGVuZ3RoIHN0clxuICA7O1xuXG4gIGxldCBwcF9odW1fbWF5YmVfZXNjX3N0ciBwcGYgc3RyID1cbiAgICBpZiBub3QgKG11c3RfZXNjYXBlIHN0cilcbiAgICB0aGVuIHBwX3ByaW50X3N0cmluZyBwcGYgc3RyXG4gICAgZWxzZSBpZiBpc19vbmVfbGluZSBzdHJcbiAgICB0aGVuIHBwX3ByaW50X3N0cmluZyBwcGYgKGVzY19zdHIgc3RyKVxuICAgIGVsc2UgKFxuICAgICAgbGV0IHJlYyBsb29wIGluZGV4ID1cbiAgICAgICAgbGV0IG5leHRfbmV3bGluZSA9IGluZGV4X29mX25ld2xpbmUgc3RyIGluZGV4IGluXG4gICAgICAgIGxldCBuZXh0X2xpbmUgPSBnZXRfc3Vic3RyaW5nIHN0ciBpbmRleCBuZXh0X25ld2xpbmUgaW5cbiAgICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiAoZXNjYXBlZCBuZXh0X2xpbmUpO1xuICAgICAgICBtYXRjaCBuZXh0X25ld2xpbmUgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgfCBTb21lIG5ld2xpbmVfaW5kZXggLT5cbiAgICAgICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiXFxcXFwiO1xuICAgICAgICAgIHBwX2ZvcmNlX25ld2xpbmUgcHBmICgpO1xuICAgICAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCJcXFxcblwiO1xuICAgICAgICAgIGxvb3AgKG5ld2xpbmVfaW5kZXggKyAxKVxuICAgICAgaW5cbiAgICAgIHBwX29wZW5fYm94IHBwZiAwO1xuICAgICAgKCogdGhlIGxlYWRpbmcgc3BhY2UgaXMgdG8gbGluZSB1cCB0aGUgbGluZXMgKilcbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCIgXFxcIlwiO1xuICAgICAgbG9vcCAwO1xuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIlxcXCJcIjtcbiAgICAgIHBwX2Nsb3NlX2JveCBwcGYgKCkpXG4gIDs7XG5cbiAgbGV0IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHIgPSBpZiBtdXN0X2VzY2FwZSBzdHIgdGhlbiBlc2Nfc3RyIHN0ciBlbHNlIHN0clxuXG4gICgqIE91dHB1dCBvZiBTLWV4cHJlc3Npb25zIHRvIGZvcm1hdHRlcnMgKilcblxuICBsZXQgcmVjIHBwX2h1bV9pbmRlbnQgaW5kZW50IHBwZiA9IGZ1bmN0aW9uXG4gICAgfCBBdG9tIHN0ciAtPiBwcF9odW1fbWF5YmVfZXNjX3N0ciBwcGYgc3RyXG4gICAgfCBMaXN0IChoIDo6IHQpIC0+XG4gICAgICBwcF9vcGVuX2JveCBwcGYgaW5kZW50O1xuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIihcIjtcbiAgICAgIHBwX2h1bV9pbmRlbnQgaW5kZW50IHBwZiBoO1xuICAgICAgcHBfaHVtX3Jlc3QgaW5kZW50IHBwZiB0XG4gICAgfCBMaXN0IFtdIC0+IHBwX3ByaW50X3N0cmluZyBwcGYgXCIoKVwiXG5cbiAgYW5kIHBwX2h1bV9yZXN0IGluZGVudCBwcGYgPSBmdW5jdGlvblxuICAgIHwgaCA6OiB0IC0+XG4gICAgICBwcF9wcmludF9zcGFjZSBwcGYgKCk7XG4gICAgICBwcF9odW1faW5kZW50IGluZGVudCBwcGYgaDtcbiAgICAgIHBwX2h1bV9yZXN0IGluZGVudCBwcGYgdFxuICAgIHwgW10gLT5cbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCIpXCI7XG4gICAgICBwcF9jbG9zZV9ib3ggcHBmICgpXG4gIDs7XG5cbiAgbGV0IHJlYyBwcF9tYWNoX2ludGVybmFsIG1heV9uZWVkX3NwYWNlIHBwZiA9IGZ1bmN0aW9uXG4gICAgfCBBdG9tIHN0ciAtPlxuICAgICAgbGV0IHN0cicgPSBtYWNoX21heWJlX2VzY19zdHIgc3RyIGluXG4gICAgICBsZXQgbmV3X21heV9uZWVkX3NwYWNlID0gc3RyJyA9PSBzdHIgaW5cbiAgICAgIGlmIG1heV9uZWVkX3NwYWNlICYmIG5ld19tYXlfbmVlZF9zcGFjZSB0aGVuIHBwX3ByaW50X3N0cmluZyBwcGYgXCIgXCI7XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIHN0cic7XG4gICAgICBuZXdfbWF5X25lZWRfc3BhY2VcbiAgICB8IExpc3QgKGggOjogdCkgLT5cbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCIoXCI7XG4gICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBwcF9tYWNoX2ludGVybmFsIGZhbHNlIHBwZiBoIGluXG4gICAgICBwcF9tYWNoX3Jlc3QgbWF5X25lZWRfc3BhY2UgcHBmIHQ7XG4gICAgICBmYWxzZVxuICAgIHwgTGlzdCBbXSAtPlxuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIigpXCI7XG4gICAgICBmYWxzZVxuXG4gIGFuZCBwcF9tYWNoX3Jlc3QgbWF5X25lZWRfc3BhY2UgcHBmID0gZnVuY3Rpb25cbiAgICB8IGggOjogdCAtPlxuICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gcHBfbWFjaF9pbnRlcm5hbCBtYXlfbmVlZF9zcGFjZSBwcGYgaCBpblxuICAgICAgcHBfbWFjaF9yZXN0IG1heV9uZWVkX3NwYWNlIHBwZiB0XG4gICAgfCBbXSAtPiBwcF9wcmludF9zdHJpbmcgcHBmIFwiKVwiXG4gIDs7XG5cbiAgbGV0IHBwX2h1bSBwcGYgc2V4cCA9IHBwX2h1bV9pbmRlbnQgIWRlZmF1bHRfaW5kZW50IHBwZiBzZXhwXG4gIGxldCBwcF9tYWNoIHBwZiBzZXhwID0gaWdub3JlIChwcF9tYWNoX2ludGVybmFsIGZhbHNlIHBwZiBzZXhwKVxuICBsZXQgcHAgPSBwcF9tYWNoXG5cbiAgKCogU2V4cCBzaXplICopXG5cbiAgbGV0IHJlYyBzaXplX2xvb3AgKCh2LCBjKSBhcyBhY2MpID0gZnVuY3Rpb25cbiAgICB8IEF0b20gc3RyIC0+IHYgKyAxLCBjICsgU3RyaW5nLmxlbmd0aCBzdHJcbiAgICB8IExpc3QgbHN0IC0+IExpc3QuZm9sZF9sZWZ0IGxzdCB+aW5pdDphY2MgfmY6c2l6ZV9sb29wXG4gIDs7XG5cbiAgbGV0IHNpemUgc2V4cCA9IHNpemVfbG9vcCAoMCwgMCkgc2V4cFxuXG4gICgqIEJ1ZmZlciBjb252ZXJzaW9ucyAqKVxuXG4gIGxldCB0b19idWZmZXJfaHVtIH5idWYgPyhpbmRlbnQgPSAhZGVmYXVsdF9pbmRlbnQpIHNleHAgPVxuICAgIGxldCBwcGYgPSBGb3JtYXQuZm9ybWF0dGVyX29mX2J1ZmZlciBidWYgaW5cbiAgICBGb3JtYXQuZnByaW50ZiBwcGYgXCIlYUA/XCIgKHBwX2h1bV9pbmRlbnQgaW5kZW50KSBzZXhwXG4gIDs7XG5cbiAgbGV0IHRvX2J1ZmZlcl9tYWNoIH5idWYgc2V4cCA9XG4gICAgbGV0IHJlYyBsb29wIG1heV9uZWVkX3NwYWNlID0gZnVuY3Rpb25cbiAgICAgIHwgQXRvbSBzdHIgLT5cbiAgICAgICAgbGV0IHN0cicgPSBtYWNoX21heWJlX2VzY19zdHIgc3RyIGluXG4gICAgICAgIGxldCBuZXdfbWF5X25lZWRfc3BhY2UgPSBzdHInID09IHN0ciBpblxuICAgICAgICBpZiBtYXlfbmVlZF9zcGFjZSAmJiBuZXdfbWF5X25lZWRfc3BhY2UgdGhlbiBCdWZmZXIuYWRkX2NoYXIgYnVmICcgJztcbiAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIHN0cic7XG4gICAgICAgIG5ld19tYXlfbmVlZF9zcGFjZVxuICAgICAgfCBMaXN0IChoIDo6IHQpIC0+XG4gICAgICAgIEJ1ZmZlci5hZGRfY2hhciBidWYgJygnO1xuICAgICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBsb29wIGZhbHNlIGggaW5cbiAgICAgICAgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlIHQ7XG4gICAgICAgIGZhbHNlXG4gICAgICB8IExpc3QgW10gLT5cbiAgICAgICAgQnVmZmVyLmFkZF9zdHJpbmcgYnVmIFwiKClcIjtcbiAgICAgICAgZmFsc2VcbiAgICBhbmQgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlID0gZnVuY3Rpb25cbiAgICAgIHwgaCA6OiB0IC0+XG4gICAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IGxvb3AgbWF5X25lZWRfc3BhY2UgaCBpblxuICAgICAgICBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgdFxuICAgICAgfCBbXSAtPiBCdWZmZXIuYWRkX2NoYXIgYnVmICcpJ1xuICAgIGluXG4gICAgaWdub3JlIChsb29wIGZhbHNlIHNleHApXG4gIDs7XG5cbiAgbGV0IHRvX2J1ZmZlciA9IHRvX2J1ZmZlcl9tYWNoXG5cbiAgbGV0IHRvX2J1ZmZlcl9nZW4gfmJ1ZiB+YWRkX2NoYXIgfmFkZF9zdHJpbmcgc2V4cCA9XG4gICAgbGV0IHJlYyBsb29wIG1heV9uZWVkX3NwYWNlID0gZnVuY3Rpb25cbiAgICAgIHwgQXRvbSBzdHIgLT5cbiAgICAgICAgbGV0IHN0cicgPSBtYWNoX21heWJlX2VzY19zdHIgc3RyIGluXG4gICAgICAgIGxldCBuZXdfbWF5X25lZWRfc3BhY2UgPSBzdHInID09IHN0ciBpblxuICAgICAgICBpZiBtYXlfbmVlZF9zcGFjZSAmJiBuZXdfbWF5X25lZWRfc3BhY2UgdGhlbiBhZGRfY2hhciBidWYgJyAnO1xuICAgICAgICBhZGRfc3RyaW5nIGJ1ZiBzdHInO1xuICAgICAgICBuZXdfbWF5X25lZWRfc3BhY2VcbiAgICAgIHwgTGlzdCAoaCA6OiB0KSAtPlxuICAgICAgICBhZGRfY2hhciBidWYgJygnO1xuICAgICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBsb29wIGZhbHNlIGggaW5cbiAgICAgICAgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlIHQ7XG4gICAgICAgIGZhbHNlXG4gICAgICB8IExpc3QgW10gLT5cbiAgICAgICAgYWRkX3N0cmluZyBidWYgXCIoKVwiO1xuICAgICAgICBmYWxzZVxuICAgIGFuZCBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgPSBmdW5jdGlvblxuICAgICAgfCBoIDo6IHQgLT5cbiAgICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gbG9vcCBtYXlfbmVlZF9zcGFjZSBoIGluXG4gICAgICAgIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSB0XG4gICAgICB8IFtdIC0+IGFkZF9jaGFyIGJ1ZiAnKSdcbiAgICBpblxuICAgIGlnbm9yZSAobG9vcCBmYWxzZSBzZXhwKVxuICA7O1xuXG4gICgqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSB0aGluZyBvbiB0aGUgbWlub3IgaGVhcCBpcyAyNTYgd29yZHMuXG4gICAgIFByZXZpb3VzbHksIHRoaXMgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgYnVmZmVyIGhlcmUgd2FzIDQwOTYgYnl0ZXMsIHdoaWNoXG4gICAgIGNhdXNlZCB0aGUgQnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBvbiB0aGUgKm1ham9yKiBoZWFwIGV2ZXJ5IHRpbWUuXG5cbiAgICAgQWNjb3JkaW5nIHRvIGEgc2ltcGxlIGJlbmNobWFyayBieSBSb24sIHdlIGNhbiBpbXByb3ZlIHBlcmZvcm1hbmNlIGZvclxuICAgICBzbWFsbCBzLWV4cHJlc3Npb25zIGJ5IGEgZmFjdG9yIG9mIH40IGlmIHdlIG9ubHkgYWxsb2NhdGUgMTAyNCBieXRlc1xuICAgICAoMTI4IHdvcmRzICsgc29tZSBzbWFsbCBvdmVyaGVhZCkgd29ydGggb2YgYnVmZmVyIGluaXRpYWxseS4gIEFuZCBvbmVcbiAgICAgY2FuIGFyZ3VlIHRoYXQgaWYgaXQncyBmcmVlIHRvIGFsbG9jYXRlIHN0cmluZ3Mgc21hbGxlciB0aGFuIDI1NiB3b3JkcyxcbiAgICAgbGFyZ2Ugcy1leHByZXNzaW9ucyByZXF1aXJpbmcgbGFyZ2VyIGV4cGVuc2l2ZSBidWZmZXJzIHdvbid0IG5vdGljZVxuICAgICB0aGUgZXh0cmEgdHdvIGRvdWJsaW5ncyBmcm9tIDEwMjQgYnl0ZXMgdG8gMjA0OCBhbmQgNDA5Ni4gQW5kIGVzcGVjaWFsbHlcbiAgICAgcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucyB0byBhbHdheXMgcGFzcyBpbiBhIGxhcmdlciBidWZmZXIgdG9cbiAgICAgdXNlLiAqKVxuICBsZXQgYnVmZmVyICgpID0gQnVmZmVyLmNyZWF0ZSAxMDI0XG5cbiAgKCogU3RyaW5nIGNvbnZlcnNpb25zICopXG5cbiAgbGV0IHRvX3N0cmluZ19odW0gP2luZGVudCA9IGZ1bmN0aW9uXG4gICAgfCBBdG9tIHN0clxuICAgICAgd2hlbiBtYXRjaCBpbmRleF9vZl9uZXdsaW5lIHN0ciAwIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgICAgfCBTb21lIF8gLT4gZmFsc2UgLT4gbWFjaF9tYXliZV9lc2Nfc3RyIHN0clxuICAgIHwgc2V4cCAtPlxuICAgICAgbGV0IGJ1ZiA9IGJ1ZmZlciAoKSBpblxuICAgICAgdG9fYnVmZmVyX2h1bSA/aW5kZW50IHNleHAgfmJ1ZjtcbiAgICAgIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nX21hY2ggPSBmdW5jdGlvblxuICAgIHwgQXRvbSBzdHIgLT4gbWFjaF9tYXliZV9lc2Nfc3RyIHN0clxuICAgIHwgc2V4cCAtPlxuICAgICAgbGV0IGJ1ZiA9IGJ1ZmZlciAoKSBpblxuICAgICAgdG9fYnVmZmVyX21hY2ggc2V4cCB+YnVmO1xuICAgICAgQnVmZmVyLmNvbnRlbnRzIGJ1ZlxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdfbWFjaFxuZW5kXG5cbmluY2x1ZGUgUHJpbnRpbmdcblxubGV0IG9mX2Zsb2F0X3N0eWxlIDogWyBgVW5kZXJzY29yZXMgfCBgTm9fdW5kZXJzY29yZXMgXSByZWYgPSByZWYgYE5vX3VuZGVyc2NvcmVzXG5sZXQgb2ZfaW50X3N0eWxlIDogWyBgVW5kZXJzY29yZXMgfCBgTm9fdW5kZXJzY29yZXMgXSByZWYgPSByZWYgYE5vX3VuZGVyc2NvcmVzXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGluY2x1ZGUgUHJpbnRpbmdcbmVuZFxuXG5sZXQgbWVzc2FnZSBuYW1lIGZpZWxkcyA9XG4gIGxldCByZWMgY29udl9maWVsZHMgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gW11cbiAgICB8IChmbmFtZSwgZnNleHApIDo6IHJlc3QgLT5cbiAgICAgIChtYXRjaCBmbmFtZSB3aXRoXG4gICAgICAgfCBcIlwiIC0+IGZzZXhwIDo6IGNvbnZfZmllbGRzIHJlc3RcbiAgICAgICB8IF8gLT4gTGlzdCBbIEF0b20gZm5hbWU7IGZzZXhwIF0gOjogY29udl9maWVsZHMgcmVzdClcbiAgaW5cbiAgTGlzdCAoQXRvbSBuYW1lIDo6IGNvbnZfZmllbGRzIGZpZWxkcylcbjs7XG4iLCIoKiogUmVwcmVzZW50YXRpb24gb2YgUy1leHByZXNzaW9uIGdyYW1tYXJzICopXG5cbigqKiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgcmVwcmVzZW50YXRpb24gZm9yIHMtZXhwcmVzc2lvbiBncmFtbWFycy4gVXNpbmcgcHB4X3NleHBfY29udlxuICAgIGFuZCBbW0BAZGVyaXZpbmcgc2V4cF9ncmFtbWFyXV0gcHJvZHVjZXMgYSBncmFtbWFyIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXJpdmVkXG4gICAgW29mX3NleHBdIGZvciBhIGdpdmVuIHR5cGUuXG5cbiAgICBBcyB3aXRoIG90aGVyIGRlcml2ZWQgZGVmaW5pdGlvbnMsIHBvbHltb3JwaGljIHR5cGVzIGRlcml2ZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYVxuICAgIGdyYW1tYXIgZm9yIGVhY2ggdHlwZSBhcmd1bWVudCBhbmQgcHJvZHVjZXMgYSBncmFtbWFyIGZvciB0aGUgbW9ub21vcnBoaXplZCB0eXBlLlxuXG4gICAgTW9ub21vcnBoaWMgdHlwZXMgZGVyaXZlIGEgZ3JhbW1hciBkaXJlY3RseS4gVG8gYXZvaWQgdG9wLWxldmVsIHNpZGUgZWZmZWN0cyxcbiAgICBbW0BAZGVyaXZpbmcgc2V4cF9ncmFtbWFyXV0gd3JhcHMgZ3JhbW1hcnMgaW4gdGhlIFtMYXp5XSBjb25zdHJ1Y3RvciBhcyBuZWVkZWQuXG5cbiAgICBUaGlzIHR5cGUgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYXMgb3VyIG5lZWRzIGZvciBleHByZXNzaXZlIGdyYW1tYXJzIGNoYW5nZS4gV2Ugd2lsbFxuICAgIGF0dGVtcHQgdG8gbWFrZSBjaGFuZ2VzIGJhY2t3YXJkLWNvbXBhdGlibGUsIG9yIGF0IGxlYXN0IHByb3ZpZGUgYSByZWFzb25hYmxlIHVwZ3JhZGVcbiAgICBwYXRoLiAqKVxuXG5bQEBAd2FybmluZyBcIi0zMFwiXSAoKiBhbGxvdyBkdXBsaWNhdGUgZmllbGQgbmFtZXMgKilcblxuKCoqIEdyYW1tYXIgb2YgYSBzZXhwLiAqKVxudHlwZSBncmFtbWFyID1cbiAgfCBBbnkgb2Ygc3RyaW5nICgqKiBhY2NlcHRzIGFueSBzZXhwOyBzdHJpbmcgaXMgYSB0eXBlIG5hbWUgZm9yIGh1bWFuIHJlYWRhYmlsaXR5ICopXG4gIHwgQm9vbCAoKiogYWNjZXB0cyB0aGUgYXRvbXMgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLCBtb2R1bG8gY2FwaXRhbGl6YXRpb24gKilcbiAgfCBDaGFyICgqKiBhY2NlcHRzIGFueSBzaW5nbGUtY2hhcmFjdGVyIGF0b20gKilcbiAgfCBJbnRlZ2VyICgqKiBhY2NlcHRzIGFueSBhdG9tIG1hdGNoaW5nIG9jYW1sIGludGVnZXIgc3ludGF4LCByZWdhcmRsZXNzIG9mIGJpdCB3aWR0aCAqKVxuICB8IEZsb2F0ICgqKiBhY2NlcHRzIGFueSBhdG9tIG1hdGNoaW5nIG9jYW1sIGZsb2F0IHN5bnRheCAqKVxuICB8IFN0cmluZyAoKiogYWNjZXB0cyBhbnkgYXRvbSAqKVxuICB8IE9wdGlvbiBvZiBncmFtbWFyICgqKiBhY2NlcHRzIGFuIG9wdGlvbiwgYm90aCBbTm9uZV0gdnMgW1NvbWUgX10gYW5kIFsoKV0gdnMgWyhfKV0uICopXG4gIHwgTGlzdCBvZiBsaXN0X2dyYW1tYXIgKCoqIGFjY2VwdHMgYSBsaXN0ICopXG4gIHwgVmFyaWFudCBvZiB2YXJpYW50ICgqKiBhY2NlcHRzIGNsYXVzZXMga2V5ZWQgYnkgYSBsZWFkaW5nIG9yIHNvbGUgYXRvbSAqKVxuICB8IFVuaW9uIG9mIGdyYW1tYXIgbGlzdCAoKiogYWNjZXB0cyBhIHNleHAgaWYgYW55IG9mIHRoZSBsaXN0ZWQgZ3JhbW1hcnMgYWNjZXB0cyBpdCAqKVxuICB8IFRhZ2dlZCBvZiBncmFtbWFyIHdpdGhfdGFnXG4gICgqKiBhbm5vdGF0ZXMgYSBncmFtbWFyIHdpdGggYSBjbGllbnQtc3BlY2lmaWMga2V5L3ZhbHVlIHBhaXIgKilcbiAgfCBUeXZhciBvZiBzdHJpbmdcbiAgKCoqIE5hbWUgb2YgYSB0eXBlIHZhcmlhYmxlLCBlLmcuIFtUeXZhciBcImFcIl0gZm9yIFsnYV0uIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBib2R5IG9mXG4gICAgICB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBbZGVmbl0gZGVmaW5lcyBhIGNvcnJlc3BvbmRpbmcgdHlwZSB2YXJpYWJsZS4gKilcbiAgfCBUeWNvbiBvZiBzdHJpbmcgKiBncmFtbWFyIGxpc3RcbiAgKCoqIFR5cGUgY29uc3RydWN0b3IgYXBwbGllZCB0byBhcmd1bWVudHMuIEZvciBleGFtcGxlLCBbVHljb24gKFwibGlzdFwiLCBbIEludGVnZXIgXSldXG4gICAgICByZXByZXNlbnRzIFtpbnQgbGlzdF0uIE9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIFtSZWN1cnNpdmVdXG4gICAgICBncmFtbWFyIGRlZmluZXMgYSBjb3JyZXNwb25kaW5nIHR5cGUgY29uc3RydWN0b3IuICopXG4gIHwgUmVjdXJzaXZlIG9mIGdyYW1tYXIgKiBkZWZuIGxpc3RcbiAgKCoqIFtSZWN1cnNpdmUgKGdyYW1tYXIsIGRlZmluaXRpb25zKV0gYWxsb3dzIFtncmFtbWFyXSB0byByZWZlciB0byB0eXBlIGNvbnN0cnVjdG9yc1xuICAgICAgZnJvbSB0aGUgbXV0dWFsbHkgcmVjdXJzaXZlIFtkZWZpbml0aW9uc10uIFRoZSBkZWZpbml0aW9ucyBtYXkgYWxzbyByZWZlciB0byBlYWNoXG4gICAgICBvdGhlcnMnIHR5cGUgY29uc3RydWN0b3JzLlxuXG4gICAgICBPcmRpbmFyaWx5LCBbZ3JhbW1hcl0gaXRzZWxmIGlzIGp1c3QgYSBbVHljb25dIGFyZ3VtZW50LCBhbHRob3VnaCB0ZWNobmljYWxseSBpdCBjYW5cbiAgICAgIGJlIGFueSBncmFtbWFyLlxuXG4gICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBkZWZpbmUgYSBiaW5hcnkgdHJlZSBwYXJhbWV0ZXJpemVkIGJ5IGEgdHlwZVxuICAgICAgc3RvcmVkIGF0IGl0cyBsZWF2ZXMuXG5cbiAgICAgIHtbXG4gICAgICAgIGxldCBkZWZucyA9XG4gICAgICAgICAgWyB7IHR5Y29uID0gXCJ0cmVlXCJcbiAgICAgICAgICAgIDsgdHl2YXJzID0gW1wiYVwiXVxuICAgICAgICAgICAgOyBncmFtbWFyID1cbiAgICAgICAgICAgICAgICBWYXJpYW50XG4gICAgICAgICAgICAgICAgICB7IG5hbWVfa2luZCA9IENhcGl0YWxpemVkXG4gICAgICAgICAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICAgICAgICAgIFsgeyBuYW1lID0gXCJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJncyA9IENvbnMgKFR5Y29uIChcIm5vZGVcIiwgW1R5dmFyIFwiYVwiXSksIEVtcHR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDsgeyBuYW1lID0gXCJUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDsgYXJncyA9IENvbnMgKFR5Y29uIChcImxlYWZcIiwgW1R5dmFyIFwiYVwiXSksIEVtcHR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA7IHsgdHljb24gPSBcIm5vZGVcIlxuICAgICAgICAgICAgOyB0eXZhcnMgPSBbXCJhXCJdXG4gICAgICAgICAgICA7IGdyYW1tYXIgPSBMaXN0IChNYW55IChUeWNvbiBcInRyZWVcIiwgW1R5dmFyIFwiYVwiXSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOyB7IHR5Y29uID0gXCJsZWFmXCJcbiAgICAgICAgICAgIDsgdHl2YXJzID0gW1wiYVwiXVxuICAgICAgICAgICAgOyBncmFtbWFyID0gW1R5dmFyIFwiYVwiXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgOztcbiAgICAgIF19XG5cbiAgICAgIE5vcm1hbGx5LCB0aGUgdHlwZSBvZiBhIHRyZWUgc3RvcmluZyBpbnRlZ2VycyB3b3VsZCBiZSB3cml0dGVuIGxpa2UgdGhpczpcblxuICAgICAge1tcbiAgICAgICAgUmVjdXJzaXZlIChUeWNvbiAoXCJ0cmVlXCIsIFsgSW50ZWdlciBdKSwgZGVmbnMpXG4gICAgICBdfVxuXG4gICAgICBJdCBpcyBlcXVpdmFsZW50LCB0aG91Z2ggbmVlZGxlc3NseSB2ZXJib3NlLCB0byByZXBsYWNlIHRoZSBbVHljb25dIHJlZmVyZW5jZSB3aXRoXG4gICAgICB0aGUgZ3JhbW1hciBvZiBbXCJ0cmVlXCJdLCBzdWJzdGl0dXRpbmcgW0ludGVnZXJdIGZvciBbVHl2YXIgXCJhXCJdOlxuXG4gICAgICB7W1xuICAgICAgICBSZWN1cnNpdmVcbiAgICAgICAgICAoIFZhcmlhbnRcbiAgICAgICAgICAgICAgeyBuYW1lX2tpbmQgPSBDYXBpdGFsaXplZFxuICAgICAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICAgICAgWyB7IG5hbWUgPSBcIk5vZGVcIlxuICAgICAgICAgICAgICAgICAgICA7IGFyZ3MgPSBDb25zIChUeWNvbiAoXCJub2RlXCIsIFtUeXZhciBcImFcIl0pLCBFbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgOyB7IG5hbWUgPSBcIlRyZWVcIlxuICAgICAgICAgICAgICAgICAgICA7IGFyZ3MgPSBDb25zIChUeWNvbiAoXCJsZWFmXCIsIFtUeXZhciBcImFcIl0pLCBFbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgLCBkZWZucyApXG4gICAgICBdfVxuICAqKVxuICB8IExhenkgb2YgZ3JhbW1hciBsYXp5X3RcbiAgKCoqIExhemlseSBjb21wdXRlZCBncmFtbWFyLiBVc2UgW0xhenldIHRvIGF2b2lkIHRvcC1sZXZlbCBzaWRlIGVmZmVjdHMuIFRvIGRlZmluZVxuICAgICAgcmVjdXJzaXZlIGdyYW1tYXJzLCB1c2UgW1JlY3Vyc2l2ZV0gaW5zdGVhZC4gKilcblxuKCoqIEdyYW1tYXIgb2YgYSBsaXN0IG9mIHNleHBzLiAqKVxuYW5kIGxpc3RfZ3JhbW1hciA9XG4gIHwgRW1wdHkgKCoqIGFjY2VwdHMgYW4gZW1wdHkgbGlzdCBvZiBzZXhwcyAqKVxuICB8IENvbnMgb2YgZ3JhbW1hciAqIGxpc3RfZ3JhbW1hclxuICAoKiogYWNjZXB0cyBhIG5vbi1lbXB0eSBsaXN0IHdpdGggaGVhZCBhbmQgdGFpbCBtYXRjaGluZyB0aGUgZ2l2ZW4gZ3JhbW1hcnMgKilcbiAgfCBNYW55IG9mIGdyYW1tYXIgKCoqIGFjY2VwdHMgemVybyBvciBtb3JlIHNleHBzLCBlYWNoIG1hdGNoaW5nIHRoZSBnaXZlbiBncmFtbWFyICopXG4gIHwgRmllbGRzIG9mIHJlY29yZCAoKiogYWNjZXB0cyBzZXhwcyByZXByZXNlbnRpbmcgZmllbGRzIG9mIGEgcmVjb3JkICopXG5cbigqKiBDYXNlIHNlbnNpdGl2aXR5IG9wdGlvbnMgZm9yIG5hbWVzIG9mIHZhcmlhbnQgY29uc3RydWN0b3JzLiAqKVxuYW5kIGNhc2Vfc2Vuc2l0aXZpdHkgPVxuICB8IENhc2VfaW5zZW5zaXRpdmUgKCoqIENvbXBhcmlzb24gaXMgY2FzZSBpbnNlbnNpdGl2ZS4gVXNlZCBmb3IgY3VzdG9tIHBhcnNlcnMuICopXG4gIHwgQ2FzZV9zZW5zaXRpdmUgKCoqIENvbXBhcmlzb24gaXMgY2FzZSBzZW5zaXRpdmUuIFVzZWQgZm9yIHBvbHltb3JwaGljIHZhcmlhbnRzLiAqKVxuICB8IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgKCoqIENvbXBhcmlzb24gaXMgY2FzZSBpbnNlbnNpdGl2ZSBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBhbmQgY2FzZSBzZW5zaXRpdmUgYWZ0ZXJ3YXJkLlxuICAgICAgVXNlZCBmb3IgcmVndWxhciB2YXJpYW50cy4gKilcblxuKCoqIEdyYW1tYXIgb2YgdmFyaWFudHMuIEFjY2VwdHMgYW55IHNleHAgbWF0Y2hpbmcgb25lIG9mIHRoZSBjbGF1c2VzLiAqKVxuYW5kIHZhcmlhbnQgPVxuICB7IGNhc2Vfc2Vuc2l0aXZpdHkgOiBjYXNlX3NlbnNpdGl2aXR5XG4gIDsgY2xhdXNlcyA6IGNsYXVzZSB3aXRoX3RhZ19saXN0IGxpc3RcbiAgfVxuXG4oKiogR3JhbW1hciBvZiBhIHNpbmdsZSB2YXJpYW50IGNsYXVzZS4gQWNjZXB0cyBzZXhwcyBiYXNlZCBvbiB0aGUgW2NsYXVzZV9raW5kXS4gKilcbmFuZCBjbGF1c2UgPVxuICB7IG5hbWUgOiBzdHJpbmdcbiAgOyBjbGF1c2Vfa2luZCA6IGNsYXVzZV9raW5kXG4gIH1cblxuKCoqIEdyYW1tYXIgb2YgYSBzaW5nbGUgdmFyaWFudCBjbGF1c2UncyBjb250ZW50cy4gW0F0b21fY2xhdXNlXSBhY2NlcHRzIGFuIGF0b20gbWF0Y2hpbmdcbiAgICB0aGUgY2xhdXNlJ3MgbmFtZS4gW0xpc3RfY2xhdXNlXSBhY2NlcHRzIGEgbGlzdCB3aG9zZSBoZWFkIGlzIGFuIGF0b20gbWF0Y2hpbmcgdGhlXG4gICAgY2xhdXNlJ3MgbmFtZSBhbmQgd2hvc2UgdGFpbCBtYXRjaGVzIFthcmdzXS4gVGhlIGNsYXVzZSdzIG5hbWUgaXMgbWF0Y2hlZCBtb2R1bG8gdGhlXG4gICAgdmFyaWFudCdzIFtuYW1lX2tpbmRdLiAqKVxuYW5kIGNsYXVzZV9raW5kID1cbiAgfCBBdG9tX2NsYXVzZVxuICB8IExpc3RfY2xhdXNlIG9mIHsgYXJncyA6IGxpc3RfZ3JhbW1hciB9XG5cbigqKiBHcmFtbWFyIG9mIGEgcmVjb3JkLiBBY2NlcHRzIGFueSBsaXN0IG9mIHNleHBzIHNwZWNpZnlpbmcgZWFjaCBvZiB0aGUgZmllbGRzLFxuICAgIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuIElmIFthbGxvd19leHRyYV9maWVsZHNdIGlzIHNwZWNpZmllZCwgaWdub3JlcyBzZXhwcyB3aXRoIG5hbWVzXG4gICAgbm90IGZvdW5kIGluIFtmaWVsZHNdLiAqKVxuYW5kIHJlY29yZCA9XG4gIHsgYWxsb3dfZXh0cmFfZmllbGRzIDogYm9vbFxuICA7IGZpZWxkcyA6IGZpZWxkIHdpdGhfdGFnX2xpc3QgbGlzdFxuICB9XG5cbigqKiBHcmFtbWFyIG9mIGEgcmVjb3JkIGZpZWxkLiBBIGZpZWxkIG11c3Qgc2hvdyB1cCBleGFjdGx5IG9uY2UgaW4gYSByZWNvcmQgaWZcbiAgICBbcmVxdWlyZWRdLCBvciBhdCBtb3N0IG9uY2Ugb3RoZXJ3aXNlLiBBY2NlcHRzIGEgbGlzdCBoZWFkZWQgYnkgW25hbWVdIGFzIGFuIGF0b20sXG4gICAgZm9sbG93ZWQgYnkgc2V4cHMgbWF0Y2hpbmcgW2FyZ3NdLiAqKVxuYW5kIGZpZWxkID1cbiAgeyBuYW1lIDogc3RyaW5nXG4gIDsgcmVxdWlyZWQgOiBib29sXG4gIDsgYXJncyA6IGxpc3RfZ3JhbW1hclxuICB9XG5cbigqKiBHcmFtbWFyIHRhZ2dlZCB3aXRoIGNsaWVudC1zcGVjaWZpYyBrZXkvdmFsdWUgcGFpci4gKilcbmFuZCAnYSB3aXRoX3RhZyA9XG4gIHsga2V5IDogc3RyaW5nXG4gIDsgdmFsdWUgOiBTZXhwLnRcbiAgOyBncmFtbWFyIDogJ2FcbiAgfVxuXG5hbmQgJ2Egd2l0aF90YWdfbGlzdCA9XG4gIHwgVGFnIG9mICdhIHdpdGhfdGFnX2xpc3Qgd2l0aF90YWdcbiAgfCBOb190YWcgb2YgJ2FcblxuKCoqIEdyYW1tYXIgb2YgYSByZWN1cnNpdmUgdHlwZSBkZWZpbml0aW9uLiBOYW1lcyB0aGUgW3R5Y29uXSBiZWluZyBkZWZpbmVkLCBhbmQgdGhlXG4gICAgW3R5dmFyc10gaXQgdGFrZXMgYXMgcGFyYW1ldGVycy4gU3BlY2lmaWVzIHRoZSBbZ3JhbW1hcl0gb2YgdGhlIFt0eWNvbl0uIFRoZSBncmFtbWFyXG4gICAgbWF5IHJlZmVyIHRvIGFueSBvZiB0aGUgW3R5dmFyc10sIGFuZCB0byBhbnkgb2YgdGhlIFt0eWNvbl1zIGZyb20gdGhlIHNhbWUgc2V0IG9mXG4gICAgW1JlY3Vyc2l2ZV0gZGVmaW5pdGlvbnMuICopXG5hbmQgZGVmbiA9XG4gIHsgdHljb24gOiBzdHJpbmdcbiAgOyB0eXZhcnMgOiBzdHJpbmcgbGlzdFxuICA7IGdyYW1tYXIgOiBncmFtbWFyXG4gIH1cblxuKCoqIFRvcC1sZXZlbCBncmFtbWFyIHR5cGUuIEhhcyBhIHBoYW50b20gdHlwZSBwYXJhbWV0ZXIgdG8gYXNzb2NpYXRlIGVhY2ggZ3JhbW1hciB3aXRoXG4gICAgdGhlIHR5cGUgaXRzIHNleHBzIHJlcHJlc2VudC4gVGhpcyBtYWtlcyBpdCBoYXJkZXIgdG8gYXBwbHkgZ3JhbW1hcnMgdG8gdGhlIHdyb25nXG4gICAgdHlwZSwgd2hpbGUgZ3JhbW1hcnMgY2FuIHN0aWxsIGJlIGVhc2lseSBjb2VyY2VkIHRvIGEgbmV3IHR5cGUgaWYgbmVlZGVkLiAqKVxudHlwZSBfIHQgPSB7IHVudHlwZWQgOiBncmFtbWFyIH0gW0BAdW5ib3hlZF1cblxubGV0IGNvZXJjZSAodHlwZSBhIGIpICh7IHVudHlwZWQgPSBfIH0gYXMgdCA6IGEgdCkgOiBiIHQgPSB0XG5cbigqKiBUaGlzIHJlc2VydmVkIGtleSBpcyB1c2VkIGZvciBhbGwgdGFncyBnZW5lcmF0ZWQgZnJvbSBkb2MgY29tbWVudHMuICopXG5sZXQgZG9jX2NvbW1lbnRfdGFnID0gXCJzZXhwX2dyYW1tYXIuZG9jX2NvbW1lbnRcIlxuIiwibGV0IHVuaXRfc2V4cF9ncmFtbWFyIDogdW5pdCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IExpc3QgRW1wdHkgfVxubGV0IGJvb2xfc2V4cF9ncmFtbWFyIDogYm9vbCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEJvb2wgfVxubGV0IHN0cmluZ19zZXhwX2dyYW1tYXIgOiBzdHJpbmcgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBTdHJpbmcgfVxubGV0IGJ5dGVzX3NleHBfZ3JhbW1hciA6IGJ5dGVzIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gU3RyaW5nIH1cbmxldCBjaGFyX3NleHBfZ3JhbW1hciA6IGNoYXIgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBDaGFyIH1cbmxldCBpbnRfc2V4cF9ncmFtbWFyIDogaW50IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gSW50ZWdlciB9XG5sZXQgZmxvYXRfc2V4cF9ncmFtbWFyIDogZmxvYXQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBGbG9hdCB9XG5sZXQgaW50MzJfc2V4cF9ncmFtbWFyIDogaW50MzIgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBJbnRlZ2VyIH1cbmxldCBpbnQ2NF9zZXhwX2dyYW1tYXIgOiBpbnQ2NCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEludGVnZXIgfVxubGV0IG5hdGl2ZWludF9zZXhwX2dyYW1tYXIgOiBuYXRpdmVpbnQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBJbnRlZ2VyIH1cbmxldCBzZXhwX3Rfc2V4cF9ncmFtbWFyIDogU2V4cC50IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gQW55IFwiU2V4cC50XCIgfVxubGV0IHJlZl9zZXhwX2dyYW1tYXIgZ3JhbW1hciA9IFNleHBfZ3JhbW1hci5jb2VyY2UgZ3JhbW1hclxubGV0IGxhenlfdF9zZXhwX2dyYW1tYXIgZ3JhbW1hciA9IFNleHBfZ3JhbW1hci5jb2VyY2UgZ3JhbW1hclxuXG5sZXQgb3B0aW9uX3NleHBfZ3JhbW1hciAoeyB1bnR5cGVkIH0gOiBfIFNleHBfZ3JhbW1hci50KSA6IF8gb3B0aW9uIFNleHBfZ3JhbW1hci50ID1cbiAgeyB1bnR5cGVkID0gT3B0aW9uIHVudHlwZWQgfVxuOztcblxubGV0IGxpc3Rfc2V4cF9ncmFtbWFyICh7IHVudHlwZWQgfSA6IF8gU2V4cF9ncmFtbWFyLnQpIDogXyBsaXN0IFNleHBfZ3JhbW1hci50ID1cbiAgeyB1bnR5cGVkID0gTGlzdCAoTWFueSB1bnR5cGVkKSB9XG47O1xuXG5sZXQgYXJyYXlfc2V4cF9ncmFtbWFyICh7IHVudHlwZWQgfSA6IF8gU2V4cF9ncmFtbWFyLnQpIDogXyBhcnJheSBTZXhwX2dyYW1tYXIudCA9XG4gIHsgdW50eXBlZCA9IExpc3QgKE1hbnkgdW50eXBlZCkgfVxuOztcblxubGV0IGVtcHR5X3NleHBfZ3JhbW1hciA6IF8gU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBVbmlvbiBbXSB9XG5sZXQgb3BhcXVlX3NleHBfZ3JhbW1hciA9IGVtcHR5X3NleHBfZ3JhbW1hclxubGV0IGZ1bl9zZXhwX2dyYW1tYXIgPSBlbXB0eV9zZXhwX2dyYW1tYXJcbiIsIigqIFV0aWxpdHkgTW9kdWxlIGZvciBTLWV4cHJlc3Npb24gQ29udmVyc2lvbnMgKilcblxub3BlbiBTdGRMYWJlbHNcbm9wZW4gTW9yZUxhYmVsc1xub3BlbiBQcmludGZcbm9wZW4gU2V4cFxuXG4oKiBDb252ZXJzaW9uIG9mIE9DYW1sLXZhbHVlcyB0byBTLWV4cHJlc3Npb25zICopXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQgOiBzdHJpbmcgLT4gZmxvYXQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9mbG9hdFwiXG5cbigqICclLjE3ZycgaXMgZ3VhcmFudGVlZCB0byBiZSByb3VuZC10cmlwcGFibGUuXG5cbiAgICclLjE1Zycgd2lsbCBiZSByb3VuZC10cmlwcGFibGUgYW5kIG5vdCBoYXZlIG5vaXNlIGF0IHRoZSBsYXN0IGRpZ2l0IG9yIHR3byBmb3IgYSBmbG9hdFxuICAgd2hpY2ggd2FzIGNvbnZlcnRlZCBmcm9tIGEgZGVjaW1hbCAoc3RyaW5nKSB3aXRoIDw9IDE1IHNpZ25pZmljYW50IGRpZ2l0cy4gIFNvIGl0J3NcbiAgIHdvcnRoIHRyeWluZyBmaXJzdCB0byBhdm9pZCB0aGluZ3MgbGlrZSBcIjMuMTQwMDAwMDAwMDAwMDAwMVwiLlxuXG4gICBTZWUgY29tbWVudCBhYm92ZSBbdG9fc3RyaW5nX3JvdW5kX3RyaXBwYWJsZV0gaW4geyFDb3JlLkZsb2F0fSBmb3JcbiAgIGRldGFpbGVkIGV4cGxhbmF0aW9uIGFuZCBleGFtcGxlcy4gKilcbmxldCBkZWZhdWx0X3N0cmluZ19vZl9mbG9hdCA9XG4gIHJlZiAoZnVuIHggLT5cbiAgICBsZXQgeSA9IGZvcm1hdF9mbG9hdCBcIiUuMTVHXCIgeCBpblxuICAgIGlmIGZsb2F0X29mX3N0cmluZyB5ID0geCB0aGVuIHkgZWxzZSBmb3JtYXRfZmxvYXQgXCIlLjE3R1wiIHgpXG47O1xuXG5sZXQgcmVhZF9vbGRfb3B0aW9uX2Zvcm1hdCA9IHJlZiB0cnVlXG5sZXQgd3JpdGVfb2xkX29wdGlvbl9mb3JtYXQgPSByZWYgdHJ1ZVxubGV0IGxpc3RfbWFwIGYgbCA9IExpc3QucmV2IChMaXN0LnJldl9tYXAgbCB+ZilcbmxldCBzZXhwX29mX3VuaXQgKCkgPSBMaXN0IFtdXG5sZXQgc2V4cF9vZl9ib29sIGIgPSBBdG9tIChzdHJpbmdfb2ZfYm9vbCBiKVxubGV0IHNleHBfb2Zfc3RyaW5nIHN0ciA9IEF0b20gc3RyXG5sZXQgc2V4cF9vZl9ieXRlcyBieXRlcyA9IEF0b20gKEJ5dGVzLnRvX3N0cmluZyBieXRlcylcbmxldCBzZXhwX29mX2NoYXIgYyA9IEF0b20gKFN0cmluZy5tYWtlIDEgYylcbmxldCBzZXhwX29mX2ludCBuID0gQXRvbSAoc3RyaW5nX29mX2ludCBuKVxubGV0IHNleHBfb2ZfZmxvYXQgbiA9IEF0b20gKCFkZWZhdWx0X3N0cmluZ19vZl9mbG9hdCBuKVxubGV0IHNleHBfb2ZfaW50MzIgbiA9IEF0b20gKEludDMyLnRvX3N0cmluZyBuKVxubGV0IHNleHBfb2ZfaW50NjQgbiA9IEF0b20gKEludDY0LnRvX3N0cmluZyBuKVxubGV0IHNleHBfb2ZfbmF0aXZlaW50IG4gPSBBdG9tIChOYXRpdmVpbnQudG9fc3RyaW5nIG4pXG5sZXQgc2V4cF9vZl9yZWYgc2V4cF9vZl9fYSByZiA9IHNleHBfb2ZfX2EgIXJmXG5sZXQgc2V4cF9vZl9sYXp5X3Qgc2V4cF9vZl9fYSBsdiA9IHNleHBfb2ZfX2EgKExhenkuZm9yY2UgbHYpXG5cbmxldCBzZXhwX29mX29wdGlvbiBzZXhwX29mX19hID0gZnVuY3Rpb25cbiAgfCBTb21lIHggd2hlbiAhd3JpdGVfb2xkX29wdGlvbl9mb3JtYXQgLT4gTGlzdCBbIHNleHBfb2ZfX2EgeCBdXG4gIHwgU29tZSB4IC0+IExpc3QgWyBBdG9tIFwic29tZVwiOyBzZXhwX29mX19hIHggXVxuICB8IE5vbmUgd2hlbiAhd3JpdGVfb2xkX29wdGlvbl9mb3JtYXQgLT4gTGlzdCBbXVxuICB8IE5vbmUgLT4gQXRvbSBcIm5vbmVcIlxuOztcblxubGV0IHNleHBfb2ZfcGFpciBzZXhwX29mX19hIHNleHBfb2ZfX2IgKGEsIGIpID0gTGlzdCBbIHNleHBfb2ZfX2EgYTsgc2V4cF9vZl9fYiBiIF1cblxubGV0IHNleHBfb2ZfdHJpcGxlIHNleHBfb2ZfX2Egc2V4cF9vZl9fYiBzZXhwX29mX19jIChhLCBiLCBjKSA9XG4gIExpc3QgWyBzZXhwX29mX19hIGE7IHNleHBfb2ZfX2IgYjsgc2V4cF9vZl9fYyBjIF1cbjs7XG5cbigqIExpc3QucmV2IChMaXN0LnJldl9tYXAgLi4uKSBpcyB0YWlsIHJlY3Vyc2l2ZSwgdGhlIE9DYW1sIHN0YW5kYXJkXG4gICBsaWJyYXJ5IExpc3QubWFwIGlzIE5PVC4gKilcbmxldCBzZXhwX29mX2xpc3Qgc2V4cF9vZl9fYSBsc3QgPSBMaXN0IChMaXN0LnJldiAoTGlzdC5yZXZfbWFwIGxzdCB+ZjpzZXhwX29mX19hKSlcblxubGV0IHNleHBfb2ZfYXJyYXkgc2V4cF9vZl9fYSBhciA9XG4gIGxldCBsc3RfcmVmID0gcmVmIFtdIGluXG4gIGZvciBpID0gQXJyYXkubGVuZ3RoIGFyIC0gMSBkb3dudG8gMCBkb1xuICAgIGxzdF9yZWYgOj0gc2V4cF9vZl9fYSBhci4oaSkgOjogIWxzdF9yZWZcbiAgZG9uZTtcbiAgTGlzdCAhbHN0X3JlZlxuOztcblxubGV0IHNleHBfb2ZfaGFzaHRibCBzZXhwX29mX2tleSBzZXhwX29mX3ZhbCBodGJsID1cbiAgbGV0IGNvbGwgfmtleTprIH5kYXRhOnYgYWNjID0gTGlzdCBbIHNleHBfb2Zfa2V5IGs7IHNleHBfb2ZfdmFsIHYgXSA6OiBhY2MgaW5cbiAgTGlzdCAoSGFzaHRibC5mb2xkIGh0YmwgfmluaXQ6W10gfmY6Y29sbClcbjs7XG5cbmxldCBzZXhwX29mX29wYXF1ZSBfID0gQXRvbSBcIjxvcGFxdWU+XCJcbmxldCBzZXhwX29mX2Z1biBfID0gQXRvbSBcIjxmdW4+XCJcblxuKCogRXhjZXB0aW9uIGNvbnZlcnRlciByZWdpc3RyYXRpb24gYW5kIGxvb2t1cCAqKVxuXG5tb2R1bGUgRXhuX2NvbnZlcnRlciA9IHN0cnVjdFxuICAoKiBUaGVzZSBleGNlcHRpb24gcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBhc3N1bWUgdGhhdCBjb250ZXh0LXN3aXRjaGVzXG4gICAgIGNhbm5vdCBoYXBwZW4gdW5sZXNzIHRoZXJlIGlzIGFuIGFsbG9jYXRpb24uICBJdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdFxuICAgICB0aGF0IHRoaXMgd2lsbCByZW1haW4gdHJ1ZSBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZS4gIFRoYXQgd2F5IHdlXG4gICAgIGF2b2lkIHVzaW5nIG11dGV4ZXMgYW5kIHRodXMgYSBkZXBlbmRlbmN5IG9uIHRoZSB0aHJlYWRzIGxpYnJhcnkuICopXG5cbiAgKCogRmFzdCBhbmQgYXV0b21hdGljIGV4Y2VwdGlvbiByZWdpc3RyYXRpb24gKilcblxuICBtb2R1bGUgUmVnaXN0cmF0aW9uID0gc3RydWN0XG4gICAgdHlwZSB0ID1cbiAgICAgIHsgc2V4cF9vZl9leG4gOiBleG4gLT4gU2V4cC50XG4gICAgICA7ICgqIElmIFtwcmludGV4YyA9IHRydWVdIHRoZW4gdGhpcyBzZXhwIGNvbnZlcnRlciBpcyB1c2VkIGZvciBQcmludGV4Yy50b19zdHJpbmcgKilcbiAgICAgICAgcHJpbnRleGMgOiBib29sXG4gICAgICB9XG4gIGVuZFxuXG4gIG1vZHVsZSBFeG5fdGFibGUgPSBFcGhlbWVyb24uSzEuTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIHQgPSBleHRlbnNpb25fY29uc3RydWN0b3JcblxuICAgICAgbGV0IGVxdWFsID0gKCA9PSApXG4gICAgICBsZXQgaGFzaCA9IE9iai5FeHRlbnNpb25fY29uc3RydWN0b3IuaWRcbiAgICBlbmQpXG5cbiAgbGV0IHRoZV9leG5fdGFibGUgOiBSZWdpc3RyYXRpb24udCBFeG5fdGFibGUudCA9IEV4bl90YWJsZS5jcmVhdGUgMTdcblxuICAoKiBFcGhlbWVyb25zIGFyZSB1c2VkIHNvIHRoYXQgW3NleHBfb2ZfZXhuXSBjbG9zdXJlIGRvbid0IGtlZXAgdGhlXG4gICAgIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciBsaXZlLiAqKVxuICBsZXQgYWRkID8ocHJpbnRleGMgPSB0cnVlKSA/ZmluYWxpc2U6XyBleHRlbnNpb25fY29uc3RydWN0b3Igc2V4cF9vZl9leG4gPVxuICAgIEV4bl90YWJsZS5hZGQgdGhlX2V4bl90YWJsZSBleHRlbnNpb25fY29uc3RydWN0b3IgeyBzZXhwX29mX2V4bjsgcHJpbnRleGMgfVxuICA7O1xuXG4gIGxldCBmaW5kX2F1dG8gfmZvcl9wcmludGV4YyBleG4gPVxuICAgIGxldCBleHRlbnNpb25fY29uc3RydWN0b3IgPSBPYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLm9mX3ZhbCBleG4gaW5cbiAgICBtYXRjaCBFeG5fdGFibGUuZmluZF9vcHQgdGhlX2V4bl90YWJsZSBleHRlbnNpb25fY29uc3RydWN0b3Igd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIHsgc2V4cF9vZl9leG47IHByaW50ZXhjIH0gLT5cbiAgICAgIChtYXRjaCBmb3JfcHJpbnRleGMsIHByaW50ZXhjIHdpdGhcbiAgICAgICB8IGZhbHNlLCBfIHwgXywgdHJ1ZSAtPiBTb21lIChzZXhwX29mX2V4biBleG4pXG4gICAgICAgfCB0cnVlLCBmYWxzZSAtPiBOb25lKVxuICA7O1xuXG4gIG1vZHVsZSBGb3JfdW5pdF90ZXN0c19vbmx5ID0gc3RydWN0XG4gICAgbGV0IHNpemUgKCkgPSAoRXhuX3RhYmxlLnN0YXRzX2FsaXZlIHRoZV9leG5fdGFibGUpLm51bV9iaW5kaW5nc1xuICBlbmRcbmVuZFxuXG5sZXQgc2V4cF9vZl9leG5fb3B0X2Zvcl9wcmludGV4YyBleG4gPSBFeG5fY29udmVydGVyLmZpbmRfYXV0byB+Zm9yX3ByaW50ZXhjOnRydWUgZXhuXG5sZXQgc2V4cF9vZl9leG5fb3B0IGV4biA9IEV4bl9jb252ZXJ0ZXIuZmluZF9hdXRvIH5mb3JfcHJpbnRleGM6ZmFsc2UgZXhuXG5cbmxldCBzZXhwX29mX2V4biBleG4gPVxuICBtYXRjaCBzZXhwX29mX2V4bl9vcHQgZXhuIHdpdGhcbiAgfCBOb25lIC0+IExpc3QgWyBBdG9tIChQcmludGV4Yy50b19zdHJpbmcgZXhuKSBdXG4gIHwgU29tZSBzZXhwIC0+IHNleHBcbjs7XG5cbmxldCBleG5fdG9fc3RyaW5nIGUgPSBTZXhwLnRvX3N0cmluZ19odW0gKHNleHBfb2ZfZXhuIGUpXG5cbigqIHtbZXhjZXB0aW9uIEJsYWggW0BAZGVyaXZpbmcgc2V4cF1dfSBnZW5lcmF0ZXMgYSBjYWxsIHRvIHRoZSBmdW5jdGlvblxuICAgW0V4bl9jb252ZXJ0ZXIuYWRkXSBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIFNvIHdlIGFyZSBndWFyYW50ZWQgdGhhdCBhcyBzb29uIGFzIHdlXG4gICBtYXJrIGFuIGV4Y2VwdGlvbiBhcyBzZXhwYWJsZSwgdGhpcyBtb2R1bGUgd2lsbCBiZSBsaW5rZWQgaW4gYW5kIHRoaXMgcHJpbnRlciB3aWxsIGJlXG4gICByZWdpc3RlcmVkLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuICopXG5sZXQgKCkgPVxuICBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIChmdW4gZXhuIC0+XG4gICAgbWF0Y2ggc2V4cF9vZl9leG5fb3B0X2Zvcl9wcmludGV4YyBleG4gd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIHNleHAgLT4gU29tZSAoU2V4cC50b19zdHJpbmdfaHVtIH5pbmRlbnQ6MiBzZXhwKSlcbjs7XG5cbmxldCBwcmludGV4Y19wcmVmZXJfc2V4cCBleG4gPVxuICBtYXRjaCBzZXhwX29mX2V4bl9vcHQgZXhuIHdpdGhcbiAgfCBOb25lIC0+IFByaW50ZXhjLnRvX3N0cmluZyBleG5cbiAgfCBTb21lIHNleHAgLT4gU2V4cC50b19zdHJpbmdfaHVtIH5pbmRlbnQ6MiBzZXhwXG47O1xuXG4oKiBDb252ZXJzaW9uIG9mIFMtZXhwcmVzc2lvbnMgdG8gT0NhbWwtdmFsdWVzICopXG5cbmV4Y2VwdGlvbiBPZl9zZXhwX2Vycm9yID0gU2V4cC5PZl9zZXhwX2Vycm9yXG5cbmxldCByZWNvcmRfY2hlY2tfZXh0cmFfZmllbGRzID0gcmVmIHRydWVcbmxldCBvZl9zZXhwX2Vycm9yX2V4biBleGMgc2V4cCA9IHJhaXNlIChPZl9zZXhwX2Vycm9yIChleGMsIHNleHApKVxubGV0IG9mX3NleHBfZXJyb3Igd2hhdCBzZXhwID0gcmFpc2UgKE9mX3NleHBfZXJyb3IgKEZhaWx1cmUgd2hhdCwgc2V4cCkpXG5cbmxldCB1bml0X29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgW10gLT4gKClcbiAgfCBBdG9tIF8gfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcInVuaXRfb2Zfc2V4cDogZW1wdHkgbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgYm9vbF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIChcInRydWVcIiB8IFwiVHJ1ZVwiKSAtPiB0cnVlXG4gIHwgQXRvbSAoXCJmYWxzZVwiIHwgXCJGYWxzZVwiKSAtPiBmYWxzZVxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwiYm9vbF9vZl9zZXhwOiB1bmtub3duIHN0cmluZ1wiIHNleHBcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImJvb2xfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgc3RyaW5nX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+IHN0clxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwic3RyaW5nX29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGJ5dGVzX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+IEJ5dGVzLm9mX3N0cmluZyBzdHJcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImJ5dGVzX29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGNoYXJfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICBpZiBTdHJpbmcubGVuZ3RoIHN0ciA8PiAxXG4gICAgdGhlbiBvZl9zZXhwX2Vycm9yIFwiY2hhcl9vZl9zZXhwOiBhdG9tIHN0cmluZyBtdXN0IGNvbnRhaW4gb25lIGNoYXJhY3RlciBvbmx5XCIgc2V4cDtcbiAgICBzdHIuWzBdXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJjaGFyX29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGludF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgICh0cnkgaW50X29mX3N0cmluZyBzdHIgd2l0aFxuICAgICB8IGV4YyAtPiBvZl9zZXhwX2Vycm9yIChcImludF9vZl9zZXhwOiBcIiBeIGV4bl90b19zdHJpbmcgZXhjKSBzZXhwKVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiaW50X29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGZsb2F0X29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgKHRyeSBmbG9hdF9vZl9zdHJpbmcgc3RyIHdpdGhcbiAgICAgfCBleGMgLT4gb2Zfc2V4cF9lcnJvciAoXCJmbG9hdF9vZl9zZXhwOiBcIiBeIGV4bl90b19zdHJpbmcgZXhjKSBzZXhwKVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiZmxvYXRfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgaW50MzJfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICAodHJ5IEludDMyLm9mX3N0cmluZyBzdHIgd2l0aFxuICAgICB8IGV4YyAtPiBvZl9zZXhwX2Vycm9yIChcImludDMyX29mX3NleHA6IFwiIF4gZXhuX3RvX3N0cmluZyBleGMpIHNleHApXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJpbnQzMl9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBpbnQ2NF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgICh0cnkgSW50NjQub2Zfc3RyaW5nIHN0ciB3aXRoXG4gICAgIHwgZXhjIC0+IG9mX3NleHBfZXJyb3IgKFwiaW50NjRfb2Zfc2V4cDogXCIgXiBleG5fdG9fc3RyaW5nIGV4Yykgc2V4cClcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImludDY0X29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IG5hdGl2ZWludF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgICh0cnkgTmF0aXZlaW50Lm9mX3N0cmluZyBzdHIgd2l0aFxuICAgICB8IGV4YyAtPiBvZl9zZXhwX2Vycm9yIChcIm5hdGl2ZWludF9vZl9zZXhwOiBcIiBeIGV4bl90b19zdHJpbmcgZXhjKSBzZXhwKVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwibmF0aXZlaW50X29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IHJlZl9vZl9zZXhwIGFfX29mX3NleHAgc2V4cCA9IHJlZiAoYV9fb2Zfc2V4cCBzZXhwKVxubGV0IGxhenlfdF9vZl9zZXhwIGFfX29mX3NleHAgc2V4cCA9IExhenkuZnJvbV92YWwgKGFfX29mX3NleHAgc2V4cClcblxubGV0IG9wdGlvbl9vZl9zZXhwIGFfX29mX3NleHAgc2V4cCA9XG4gIGlmICFyZWFkX29sZF9vcHRpb25fZm9ybWF0XG4gIHRoZW4gKFxuICAgIG1hdGNoIHNleHAgd2l0aFxuICAgIHwgTGlzdCBbXSB8IEF0b20gKFwibm9uZVwiIHwgXCJOb25lXCIpIC0+IE5vbmVcbiAgICB8IExpc3QgWyBlbCBdIHwgTGlzdCBbIEF0b20gKFwic29tZVwiIHwgXCJTb21lXCIpOyBlbCBdIC0+IFNvbWUgKGFfX29mX3NleHAgZWwpXG4gICAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcIm9wdGlvbl9vZl9zZXhwOiBsaXN0IG11c3QgcmVwcmVzZW50IG9wdGlvbmFsIHZhbHVlXCIgc2V4cFxuICAgIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJvcHRpb25fb2Zfc2V4cDogb25seSBub25lIGNhbiBiZSBhdG9tXCIgc2V4cClcbiAgZWxzZSAoXG4gICAgbWF0Y2ggc2V4cCB3aXRoXG4gICAgfCBBdG9tIChcIm5vbmVcIiB8IFwiTm9uZVwiKSAtPiBOb25lXG4gICAgfCBMaXN0IFsgQXRvbSAoXCJzb21lXCIgfCBcIlNvbWVcIik7IGVsIF0gLT4gU29tZSAoYV9fb2Zfc2V4cCBlbClcbiAgICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwib3B0aW9uX29mX3NleHA6IG9ubHkgbm9uZSBjYW4gYmUgYXRvbVwiIHNleHBcbiAgICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwib3B0aW9uX29mX3NleHA6IGxpc3QgbXVzdCBiZSAoc29tZSBlbClcIiBzZXhwKVxuOztcblxubGV0IHBhaXJfb2Zfc2V4cCBhX19vZl9zZXhwIGJfX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgWyBhX3NleHA7IGJfc2V4cCBdIC0+XG4gICAgbGV0IGEgPSBhX19vZl9zZXhwIGFfc2V4cCBpblxuICAgIGxldCBiID0gYl9fb2Zfc2V4cCBiX3NleHAgaW5cbiAgICBhLCBiXG4gIHwgTGlzdCBfIC0+XG4gICAgb2Zfc2V4cF9lcnJvciBcInBhaXJfb2Zfc2V4cDogbGlzdCBtdXN0IGNvbnRhaW4gZXhhY3RseSB0d28gZWxlbWVudHMgb25seVwiIHNleHBcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcInBhaXJfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgdHJpcGxlX29mX3NleHAgYV9fb2Zfc2V4cCBiX19vZl9zZXhwIGNfX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgWyBhX3NleHA7IGJfc2V4cDsgY19zZXhwIF0gLT5cbiAgICBsZXQgYSA9IGFfX29mX3NleHAgYV9zZXhwIGluXG4gICAgbGV0IGIgPSBiX19vZl9zZXhwIGJfc2V4cCBpblxuICAgIGxldCBjID0gY19fb2Zfc2V4cCBjX3NleHAgaW5cbiAgICBhLCBiLCBjXG4gIHwgTGlzdCBfIC0+XG4gICAgb2Zfc2V4cF9lcnJvciBcInRyaXBsZV9vZl9zZXhwOiBsaXN0IG11c3QgY29udGFpbiBleGFjdGx5IHRocmVlIGVsZW1lbnRzIG9ubHlcIiBzZXhwXG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJ0cmlwbGVfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgbGlzdF9vZl9zZXhwIGFfX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgbHN0IC0+XG4gICAgbGV0IHJldl9sc3QgPSBMaXN0LnJldl9tYXAgbHN0IH5mOmFfX29mX3NleHAgaW5cbiAgICBMaXN0LnJldiByZXZfbHN0XG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJsaXN0X29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGFycmF5X29mX3NleHAgYV9fb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBbXSAtPiBbfHxdXG4gIHwgTGlzdCAoaCA6OiB0KSAtPlxuICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCB0ICsgMSBpblxuICAgIGxldCByZXMgPSBBcnJheS5tYWtlIGxlbiAoYV9fb2Zfc2V4cCBoKSBpblxuICAgIGxldCByZWMgbG9vcCBpID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gcmVzXG4gICAgICB8IGggOjogdCAtPlxuICAgICAgICByZXMuKGkpIDwtIGFfX29mX3NleHAgaDtcbiAgICAgICAgbG9vcCAoaSArIDEpIHRcbiAgICBpblxuICAgIGxvb3AgMSB0XG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJhcnJheV9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBoYXNodGJsX29mX3NleHAga2V5X29mX3NleHAgdmFsX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgbHN0IC0+XG4gICAgbGV0IGh0YmwgPSBIYXNodGJsLmNyZWF0ZSAwIGluXG4gICAgbGV0IGFjdCA9IGZ1bmN0aW9uXG4gICAgICB8IExpc3QgWyBrX3NleHA7IHZfc2V4cCBdIC0+XG4gICAgICAgIEhhc2h0YmwuYWRkIGh0YmwgfmtleTooa2V5X29mX3NleHAga19zZXhwKSB+ZGF0YToodmFsX29mX3NleHAgdl9zZXhwKVxuICAgICAgfCBMaXN0IF8gfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcImhhc2h0Ymxfb2Zfc2V4cDogdHVwbGUgbGlzdCBuZWVkZWRcIiBzZXhwXG4gICAgaW5cbiAgICBMaXN0Lml0ZXIgbHN0IH5mOmFjdDtcbiAgICBodGJsXG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJoYXNodGJsX29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IG9wYXF1ZV9vZl9zZXhwIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIFwib3BhcXVlX29mX3NleHA6IGNhbm5vdCBjb252ZXJ0IG9wYXF1ZSB2YWx1ZXNcIiBzZXhwXG47O1xuXG5sZXQgZnVuX29mX3NleHAgc2V4cCA9IG9mX3NleHBfZXJyb3IgXCJmdW5fb2Zfc2V4cDogY2Fubm90IGNvbnZlcnQgZnVuY3Rpb24gdmFsdWVzXCIgc2V4cFxuXG4oKiBTZXhwIEdyYW1tYXJzICopXG5cbmluY2x1ZGUgU2V4cF9jb252X2dyYW1tYXJcblxuKCogUmVnaXN0ZXJpbmcgZGVmYXVsdCBleGNlcHRpb24gcHJpbnRlcnMgKilcblxubGV0IGdldF9mbGNfZXJyb3IgbmFtZSAoZmlsZSwgbGluZSwgY2hyKSA9IEF0b20gKHNwcmludGYgXCIlcyAlczolZDolZFwiIG5hbWUgZmlsZSBsaW5lIGNocilcblxubGV0ICgpID1cbiAgTGlzdC5pdGVyXG4gICAgfmY6KGZ1biAoZXh0ZW5zaW9uX2NvbnN0cnVjdG9yLCBoYW5kbGVyKSAtPlxuICAgICAgRXhuX2NvbnZlcnRlci5hZGQgfnByaW50ZXhjOmZhbHNlIH5maW5hbGlzZTpmYWxzZSBleHRlbnNpb25fY29uc3RydWN0b3IgaGFuZGxlcilcbiAgICBbICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgQXNzZXJ0X2ZhaWx1cmVdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgQXNzZXJ0X2ZhaWx1cmUgYXJnIC0+IGdldF9mbGNfZXJyb3IgXCJBc3NlcnRfZmFpbHVyZVwiIGFyZ1xuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgRXhpdF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBFeGl0IC0+IEF0b20gXCJFeGl0XCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEVuZF9vZl9maWxlXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEVuZF9vZl9maWxlIC0+IEF0b20gXCJFbmRfb2ZfZmlsZVwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBGYWlsdXJlXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEZhaWx1cmUgYXJnIC0+IExpc3QgWyBBdG9tIFwiRmFpbHVyZVwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBOb3RfZm91bmRdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgTm90X2ZvdW5kIC0+IEF0b20gXCJOb3RfZm91bmRcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgSW52YWxpZF9hcmd1bWVudF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBJbnZhbGlkX2FyZ3VtZW50IGFyZyAtPiBMaXN0IFsgQXRvbSBcIkludmFsaWRfYXJndW1lbnRcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgTWF0Y2hfZmFpbHVyZV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBNYXRjaF9mYWlsdXJlIGFyZyAtPiBnZXRfZmxjX2Vycm9yIFwiTWF0Y2hfZmFpbHVyZVwiIGFyZ1xuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgTm90X2ZvdW5kX3NdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgTm90X2ZvdW5kX3MgYXJnIC0+IExpc3QgWyBBdG9tIFwiTm90X2ZvdW5kX3NcIjsgYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFN5c19lcnJvcl1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBTeXNfZXJyb3IgYXJnIC0+IExpc3QgWyBBdG9tIFwiU3lzX2Vycm9yXCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEFyZy5IZWxwXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEFyZy5IZWxwIGFyZyAtPiBMaXN0IFsgQXRvbSBcIkFyZy5IZWxwXCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEFyZy5CYWRdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgQXJnLkJhZCBhcmcgLT4gTGlzdCBbIEF0b20gXCJBcmcuQmFkXCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIExhenkuVW5kZWZpbmVkXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IExhenkuVW5kZWZpbmVkIC0+IEF0b20gXCJMYXp5LlVuZGVmaW5lZFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBQYXJzaW5nLlBhcnNlX2Vycm9yXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFBhcnNpbmcuUGFyc2VfZXJyb3IgLT4gQXRvbSBcIlBhcnNpbmcuUGFyc2VfZXJyb3JcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgUXVldWUuRW1wdHldXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgUXVldWUuRW1wdHkgLT4gQXRvbSBcIlF1ZXVlLkVtcHR5XCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFNjYW5mLlNjYW5fZmFpbHVyZV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBTY2FuZi5TY2FuX2ZhaWx1cmUgYXJnIC0+IExpc3QgWyBBdG9tIFwiU2NhbmYuU2Nhbl9mYWlsdXJlXCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFN0YWNrLkVtcHR5XVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFN0YWNrLkVtcHR5IC0+IEF0b20gXCJTdGFjay5FbXB0eVwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTeXMuQnJlYWtdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgU3lzLkJyZWFrIC0+IEF0b20gXCJTeXMuQnJlYWtcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICBdXG47O1xuXG5sZXQgKCkgPVxuICBMaXN0Lml0ZXJcbiAgICB+ZjooZnVuIChleHRlbnNpb25fY29uc3RydWN0b3IsIGhhbmRsZXIpIC0+XG4gICAgICBFeG5fY29udmVydGVyLmFkZCB+cHJpbnRleGM6dHJ1ZSB+ZmluYWxpc2U6ZmFsc2UgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIGhhbmRsZXIpXG4gICAgWyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE9mX3NleHBfZXJyb3JdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgT2Zfc2V4cF9lcnJvciAoZXhjLCBzZXhwKSAtPlxuICAgICAgICAgIExpc3QgWyBBdG9tIFwiU2V4cGxpYi5Db252Lk9mX3NleHBfZXJyb3JcIjsgc2V4cF9vZl9leG4gZXhjOyBzZXhwIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgXVxuOztcblxuZXh0ZXJuYWwgaWdub3JlIDogXyAtPiB1bml0ID0gXCIlaWdub3JlXCJcbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbiIsIigqIENvbnZfZXJyb3I6IE1vZHVsZSBmb3IgSGFuZGxpbmcgRXJyb3JzIGR1cmluZyBBdXRvbWF0ZWQgUy1leHByZXNzaW9uXG4gICBDb252ZXJzaW9ucyAqKVxuXG5vcGVuIFN0ZExhYmVsc1xub3BlbiBQcmludGZcbm9wZW4gU2V4cF9jb252XG5cbmV4Y2VwdGlvbiBPZl9zZXhwX2Vycm9yID0gT2Zfc2V4cF9lcnJvclxuXG4oKiBFcnJvcnMgY29uY2VybmluZyB0dXBsZXMgKilcblxubGV0IHR1cGxlX29mX3NpemVfbl9leHBlY3RlZCBsb2MgbiBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAoc3ByaW50ZiBcIiVzX29mX3NleHA6IHR1cGxlIG9mIHNpemUgJWQgZXhwZWN0ZWRcIiBsb2Mgbikgc2V4cFxuOztcblxuKCogRXJyb3JzIGNvbmNlcm5pbmcgc3VtIHR5cGVzICopXG5cbmxldCBzdGFnX25vX2FyZ3MgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiB0aGlzIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRha2UgYXJndW1lbnRzXCIpIHNleHBcbjs7XG5cbmxldCBzdGFnX2luY29ycmVjdF9uX2FyZ3MgbG9jIHRhZyBzZXhwID1cbiAgbGV0IG1zZyA9IHNwcmludGYgXCIlc19vZl9zZXhwOiBzdW0gdGFnICVTIGhhcyBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50c1wiIGxvYyB0YWcgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHN0YWdfdGFrZXNfYXJncyBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHRoaXMgY29uc3RydWN0b3IgcmVxdWlyZXMgYXJndW1lbnRzXCIpIHNleHBcbjs7XG5cbmxldCBuZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IGV4cGVjdGVkIGEgdmFyaWFudCB0eXBlLCBzYXcgYSBuZXN0ZWQgbGlzdFwiKSBzZXhwXG47O1xuXG5sZXQgZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IGV4cGVjdGVkIGEgdmFyaWFudCB0eXBlLCBzYXcgYW4gZW1wdHkgbGlzdFwiKSBzZXhwXG47O1xuXG5sZXQgdW5leHBlY3RlZF9zdGFnIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogdW5leHBlY3RlZCB2YXJpYW50IGNvbnN0cnVjdG9yXCIpIHNleHBcbjs7XG5cbigqIEVycm9ycyBjb25jZXJuaW5nIHJlY29yZHMgKilcblxubGV0IHJlY29yZF9zZXhwX2Jvb2xfd2l0aF9wYXlsb2FkIGxvYyBzZXhwID1cbiAgbGV0IG1zZyA9XG4gICAgbG9jIF4gXCJfb2Zfc2V4cDogcmVjb3JkIGNvbnZlcnNpb246IGEgW3NleHAuYm9vbF0gZmllbGQgd2FzIGdpdmVuIGEgcGF5bG9hZC5cIlxuICBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX29ubHlfcGFpcnNfZXhwZWN0ZWQgbG9jIHNleHAgPVxuICBsZXQgbXNnID1cbiAgICBsb2NcbiAgICBeIFwiX29mX3NleHA6IHJlY29yZCBjb252ZXJzaW9uOiBvbmx5IHBhaXJzIGV4cGVjdGVkLCB0aGVpciBmaXJzdCBlbGVtZW50IG11c3QgYmUgYW4gXFxcbiAgICAgICBhdG9tXCJcbiAgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHJlY29yZF9zdXBlcmZsdW91c19maWVsZHMgfndoYXQgfmxvYyByZXZfZmxkX25hbWVzIHNleHAgPVxuICBsZXQgZmxkX25hbWVzX3N0ciA9IFN0cmluZy5jb25jYXQgKExpc3QucmV2IHJldl9mbGRfbmFtZXMpIH5zZXA6XCIgXCIgaW5cbiAgbGV0IG1zZyA9IHNwcmludGYgXCIlc19vZl9zZXhwOiAlczogJXNcIiBsb2Mgd2hhdCBmbGRfbmFtZXNfc3RyIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCByZWNvcmRfZHVwbGljYXRlX2ZpZWxkcyBsb2MgcmV2X2ZsZF9uYW1lcyBzZXhwID1cbiAgcmVjb3JkX3N1cGVyZmx1b3VzX2ZpZWxkcyB+d2hhdDpcImR1cGxpY2F0ZSBmaWVsZHNcIiB+bG9jIHJldl9mbGRfbmFtZXMgc2V4cFxuOztcblxubGV0IHJlY29yZF9leHRyYV9maWVsZHMgbG9jIHJldl9mbGRfbmFtZXMgc2V4cCA9XG4gIHJlY29yZF9zdXBlcmZsdW91c19maWVsZHMgfndoYXQ6XCJleHRyYSBmaWVsZHNcIiB+bG9jIHJldl9mbGRfbmFtZXMgc2V4cFxuOztcblxubGV0IHJlYyByZWNvcmRfZ2V0X3VuZGVmaW5lZF9sb29wIGZpZWxkcyA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gU3RyaW5nLmNvbmNhdCAoTGlzdC5yZXYgZmllbGRzKSB+c2VwOlwiIFwiXG4gIHwgKHRydWUsIGZpZWxkKSA6OiByZXN0IC0+IHJlY29yZF9nZXRfdW5kZWZpbmVkX2xvb3AgKGZpZWxkIDo6IGZpZWxkcykgcmVzdFxuICB8IF8gOjogcmVzdCAtPiByZWNvcmRfZ2V0X3VuZGVmaW5lZF9sb29wIGZpZWxkcyByZXN0XG47O1xuXG5sZXQgcmVjb3JkX3VuZGVmaW5lZF9lbGVtZW50cyBsb2Mgc2V4cCBsc3QgPVxuICBsZXQgdW5kZWZpbmVkID0gcmVjb3JkX2dldF91bmRlZmluZWRfbG9vcCBbXSBsc3QgaW5cbiAgbGV0IG1zZyA9XG4gICAgc3ByaW50ZiBcIiVzX29mX3NleHA6IHRoZSBmb2xsb3dpbmcgcmVjb3JkIGVsZW1lbnRzIHdlcmUgdW5kZWZpbmVkOiAlc1wiIGxvYyB1bmRlZmluZWRcbiAgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHJlY29yZF9saXN0X2luc3RlYWRfYXRvbSBsb2Mgc2V4cCA9XG4gIGxldCBtc2cgPSBsb2MgXiBcIl9vZl9zZXhwOiBsaXN0IGluc3RlYWQgb2YgYXRvbSBmb3IgcmVjb3JkIGV4cGVjdGVkXCIgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHJlY29yZF9wb2x5X2ZpZWxkX3ZhbHVlIGxvYyBzZXhwID1cbiAgbGV0IG1zZyA9XG4gICAgbG9jXG4gICAgXiBcIl9vZl9zZXhwOiBjYW5ub3QgY29udmVydCB2YWx1ZXMgb2YgdHlwZXMgcmVzdWx0aW5nIGZyb20gcG9seW1vcnBoaWMgcmVjb3JkIGZpZWxkc1wiXG4gIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbigqIEVycm9ycyBjb25jZXJuaW5nIHBvbHltb3JwaGljIHZhcmlhbnRzICopXG5cbmV4Y2VwdGlvbiBOb192YXJpYW50X21hdGNoXG5cbmxldCBub192YXJpYW50X21hdGNoICgpID0gcmFpc2UgTm9fdmFyaWFudF9tYXRjaFxuXG5sZXQgbm9fbWF0Y2hpbmdfdmFyaWFudF9mb3VuZCBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IG5vIG1hdGNoaW5nIHZhcmlhbnQgZm91bmRcIikgc2V4cFxuOztcblxubGV0IHB0YWdfbm9fYXJncyBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHBvbHltb3JwaGljIHZhcmlhbnQgZG9lcyBub3QgdGFrZSBhcmd1bWVudHNcIikgc2V4cFxuOztcblxubGV0IHB0YWdfaW5jb3JyZWN0X25fYXJncyBsb2MgY25zdHIgc2V4cCA9XG4gIGxldCBtc2cgPVxuICAgIHNwcmludGZcbiAgICAgIFwiJXNfb2Zfc2V4cDogcG9seW1vcnBoaWMgdmFyaWFudCB0YWcgJVMgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzXCJcbiAgICAgIGxvY1xuICAgICAgY25zdHJcbiAgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHB0YWdfdGFrZXNfYXJncyBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHBvbHltb3JwaGljIHZhcmlhbnQgdGFnIHRha2VzIGFuIGFyZ3VtZW50XCIpIHNleHBcbjs7XG5cbmxldCBuZXN0ZWRfbGlzdF9pbnZhbGlkX3BvbHlfdmFyIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogYSBuZXN0ZWQgbGlzdCBpcyBhbiBpbnZhbGlkIHBvbHltb3JwaGljIHZhcmlhbnRcIikgc2V4cFxuOztcblxubGV0IGVtcHR5X2xpc3RfaW52YWxpZF9wb2x5X3ZhciBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHRoZSBlbXB0eSBsaXN0IGlzIGFuIGludmFsaWQgcG9seW1vcnBoaWMgdmFyaWFudFwiKSBzZXhwXG47O1xuXG5sZXQgZW1wdHlfdHlwZSBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHRyeWluZyB0byBjb252ZXJ0IGFuIGVtcHR5IHR5cGVcIikgc2V4cFxuOztcbiIsIigqKiBQcmltaXRpdmVzIGZvciBwb2x5bW9ycGhpYyBjb21wYXJlLiAqKVxuXG4oKl8gUG9seW1vcnBoaWMgY29tcGlsZXIgcHJpbWl0aXZlcyBjYW4ndCBiZSBhbGlhc2VzIGFzIHRoaXMgZG9lc24ndCBwbGF5IHdlbGwgd2l0aFxuICBpbmxpbmluZy4gKElmIGFsaWFzZWQgd2l0aG91dCBhIHR5cGUgYW5ub3RhdGlvbiwgdGhlIGNvbXBpbGVyIHdvdWxkIGltcGxlbWVudCB0aGVtXG4gIHVzaW5nIHRoZSBnZW5lcmljIGNvZGUgZG9pbmcgYSBDIGNhbGwsIGFuZCBpdCdzIHRoaXMgY29kZSB0aGF0IHdvdWxkIGJlIGlubGluZWQuKSBBcyBhXG4gIHJlc3VsdCB3ZSBoYXZlIHRvIGNvcHkgdGhlIFtleHRlcm5hbCAuLi5dIGRlY2xhcmF0aW9uIGhlcmUuICopXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoID0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoID49ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcbmV4dGVybmFsIGFzY2VuZGluZyA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuZXh0ZXJuYWwgZXF1YWwgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuXG5sZXQgZGVzY2VuZGluZyB4IHkgPSBjb21wYXJlIHkgeFxubGV0IG1heCA9IENhbWwubWF4XG5sZXQgbWluID0gQ2FtbC5taW5cbiIsIigqIFRoaXMgbW9kdWxlIGlzIGluY2x1ZGVkIGluIFtJbXBvcnRdLiAgSXQgaXMgYWltZWQgYXQgbW9kdWxlcyB0aGF0IGRlZmluZSB0aGUgc3RhbmRhcmRcbiAgIGNvbWJpbmF0b3JzIGZvciBbc2V4cF9vZl0sIFtvZl9zZXhwXSwgW2NvbXBhcmVdIGFuZCBbaGFzaF0gYW5kIGFyZSBpbmNsdWRlZCBpblxuICAgW0ltcG9ydF0uICopXG5cbmluY2x1ZGUgKFxuICBTaGFkb3dfc3RkbGliIDpcbiAgICBtb2R1bGUgdHlwZSBvZiBzdHJ1Y3RcbiAgICBpbmNsdWRlIFNoYWRvd19zdGRsaWJcbiAgZW5kXG4gIHdpdGggdHlwZSAnYSByZWYgOj0gJ2EgcmVmXG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0IDo9ICgnYSwgJ2IsICdjKSBmb3JtYXRcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NCA6PSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDRcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IDo9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICgqIFRoZXNlIG1vZHVsZXMgYXJlIHJlZGVmaW5lZCBpbiBCYXNlICopXG4gIHdpdGggbW9kdWxlIEFycmF5IDo9IFNoYWRvd19zdGRsaWIuQXJyYXlcbiAgd2l0aCBtb2R1bGUgQXRvbWljIDo9IFNoYWRvd19zdGRsaWIuQXRvbWljXG4gIHdpdGggbW9kdWxlIEJvb2wgOj0gU2hhZG93X3N0ZGxpYi5Cb29sXG4gIHdpdGggbW9kdWxlIEJ1ZmZlciA6PSBTaGFkb3dfc3RkbGliLkJ1ZmZlclxuICB3aXRoIG1vZHVsZSBCeXRlcyA6PSBTaGFkb3dfc3RkbGliLkJ5dGVzXG4gIHdpdGggbW9kdWxlIENoYXIgOj0gU2hhZG93X3N0ZGxpYi5DaGFyXG4gIHdpdGggbW9kdWxlIEVpdGhlciA6PSBTaGFkb3dfc3RkbGliLkVpdGhlclxuICB3aXRoIG1vZHVsZSBGbG9hdCA6PSBTaGFkb3dfc3RkbGliLkZsb2F0XG4gIHdpdGggbW9kdWxlIEhhc2h0YmwgOj0gU2hhZG93X3N0ZGxpYi5IYXNodGJsXG4gIHdpdGggbW9kdWxlIEludCA6PSBTaGFkb3dfc3RkbGliLkludFxuICB3aXRoIG1vZHVsZSBJbnQzMiA6PSBTaGFkb3dfc3RkbGliLkludDMyXG4gIHdpdGggbW9kdWxlIEludDY0IDo9IFNoYWRvd19zdGRsaWIuSW50NjRcbiAgd2l0aCBtb2R1bGUgTGF6eSA6PSBTaGFkb3dfc3RkbGliLkxhenlcbiAgd2l0aCBtb2R1bGUgTGlzdCA6PSBTaGFkb3dfc3RkbGliLkxpc3RcbiAgd2l0aCBtb2R1bGUgTWFwIDo9IFNoYWRvd19zdGRsaWIuTWFwXG4gIHdpdGggbW9kdWxlIE5hdGl2ZWludCA6PSBTaGFkb3dfc3RkbGliLk5hdGl2ZWludFxuICB3aXRoIG1vZHVsZSBPcHRpb24gOj0gU2hhZG93X3N0ZGxpYi5PcHRpb25cbiAgd2l0aCBtb2R1bGUgUHJpbnRmIDo9IFNoYWRvd19zdGRsaWIuUHJpbnRmXG4gIHdpdGggbW9kdWxlIFF1ZXVlIDo9IFNoYWRvd19zdGRsaWIuUXVldWVcbiAgd2l0aCBtb2R1bGUgUmFuZG9tIDo9IFNoYWRvd19zdGRsaWIuUmFuZG9tXG4gIHdpdGggbW9kdWxlIFJlc3VsdCA6PSBTaGFkb3dfc3RkbGliLlJlc3VsdFxuICB3aXRoIG1vZHVsZSBTZXQgOj0gU2hhZG93X3N0ZGxpYi5TZXRcbiAgd2l0aCBtb2R1bGUgU3RhY2sgOj0gU2hhZG93X3N0ZGxpYi5TdGFja1xuICB3aXRoIG1vZHVsZSBTdHJpbmcgOj0gU2hhZG93X3N0ZGxpYi5TdHJpbmdcbiAgd2l0aCBtb2R1bGUgU3lzIDo9IFNoYWRvd19zdGRsaWIuU3lzXG4gIHdpdGggbW9kdWxlIFVjaGFyIDo9IFNoYWRvd19zdGRsaWIuVWNoYXJcbiAgd2l0aCBtb2R1bGUgVW5pdCA6PSBTaGFkb3dfc3RkbGliLlVuaXQpIFtAb2NhbWwud2FybmluZyBcIi0zXCJdXG5cbnR5cGUgJ2EgcmVmID0gJ2EgQ2FtbC5yZWYgPSB7IG11dGFibGUgY29udGVudHMgOiAnYSB9XG5cbigqIFJlc2h1ZmZsZSBbQ2FtbF0gc28gdGhhdCB3ZSBjaG9vc2UgdGhlIG1vZHVsZXMgdXNpbmcgbGFiZWxzIHdoZW4gYXZhaWxhYmxlLiAqKVxubW9kdWxlIENhbWwgPSBzdHJ1Y3RcblxuICBpbmNsdWRlIENhbWxcblxuICBtb2R1bGUgQXJnID0gQ2FtbC5BcmcgKCoqIEBjYW5vbmljYWwgQ2FtbC5BcmcgKilcblxuICBtb2R1bGUgQXJyYXkgPSBDYW1sLlN0ZExhYmVscy5BcnJheSAoKiogQGNhbm9uaWNhbCBDYW1sLlN0ZExhYmVscy5BcnJheSAqKVxuXG4gIG1vZHVsZSBCb29sID0gQ2FtbC5Cb29sICgqKiBAY2Fub25pY2FsIENhbWwuQm9vbCAqKVxuXG4gIG1vZHVsZSBCdWZmZXIgPSBDYW1sLkJ1ZmZlciAoKiogQGNhbm9uaWNhbCBDYW1sLkJ1ZmZlciAqKVxuXG4gIG1vZHVsZSBCeXRlcyA9IENhbWwuU3RkTGFiZWxzLkJ5dGVzICgqKiBAY2Fub25pY2FsIENhbWwuU3RkTGFiZWxzLkJ5dGVzICopXG5cbiAgbW9kdWxlIENoYXIgPSBDYW1sLkNoYXIgKCoqIEBjYW5vbmljYWwgQ2FtbC5DaGFyICopXG5cbiAgbW9kdWxlIEVwaGVtZXJvbiA9IENhbWwuRXBoZW1lcm9uICgqKiBAY2Fub25pY2FsIENhbWwuRXBoZW1lcm9uICopXG5cbiAgbW9kdWxlIEZsb2F0ID0gQ2FtbC5GbG9hdCAoKiogQGNhbm9uaWNhbCBDYW1sLkZsb2F0ICopXG5cbiAgbW9kdWxlIEZvcm1hdCA9IENhbWwuRm9ybWF0ICgqKiBAY2Fub25pY2FsIENhbWwuRm9ybWF0ICopXG5cbiAgbW9kdWxlIEZ1biA9IENhbWwuRnVuICgqKiBAY2Fub25pY2FsIENhbWwuRnVuICopXG5cbiAgbW9kdWxlIEdjID0gQ2FtbC5HYyAoKiogQGNhbm9uaWNhbCBDYW1sLkdjICopXG5cbiAgbW9kdWxlIEhhc2h0YmwgPSBDYW1sLk1vcmVMYWJlbHMuSGFzaHRibCAoKiogQGNhbm9uaWNhbCBDYW1sLk1vcmVMYWJlbHMuSGFzaHRibCAqKVxuXG4gIG1vZHVsZSBJbnQzMiA9IENhbWwuSW50MzIgKCoqIEBjYW5vbmljYWwgQ2FtbC5JbnQzMiAqKVxuXG4gIG1vZHVsZSBJbnQgPSBDYW1sLkludCAoKiogQGNhbm9uaWNhbCBDYW1sLkludCAqKVxuXG4gIG1vZHVsZSBJbnQ2NCA9IENhbWwuSW50NjQgKCoqIEBjYW5vbmljYWwgQ2FtbC5JbnQ2NCAqKVxuXG4gIG1vZHVsZSBMYXp5ID0gQ2FtbC5MYXp5ICgqKiBAY2Fub25pY2FsIENhbWwuTGF6eSAqKVxuXG4gIG1vZHVsZSBMZXhpbmcgPSBDYW1sLkxleGluZyAoKiogQGNhbm9uaWNhbCBDYW1sLkxleGluZyAqKVxuXG4gIG1vZHVsZSBMaXN0ID0gQ2FtbC5TdGRMYWJlbHMuTGlzdCAoKiogQGNhbm9uaWNhbCBDYW1sLlN0ZExhYmVscy5MaXN0ICopXG5cbiAgbW9kdWxlIE1hcCA9IENhbWwuTW9yZUxhYmVscy5NYXAgKCoqIEBjYW5vbmljYWwgQ2FtbC5Nb3JlTGFiZWxzLk1hcCAqKVxuXG4gIG1vZHVsZSBOYXRpdmVpbnQgPSBDYW1sLk5hdGl2ZWludCAoKiogQGNhbm9uaWNhbCBDYW1sLk5hdGl2ZWludCAqKVxuXG4gIG1vZHVsZSBPYmogPSBDYW1sLk9iaiAoKiogQGNhbm9uaWNhbCBDYW1sLk9iaiAqKVxuXG4gIG1vZHVsZSBPcHRpb24gPSBDYW1sLk9wdGlvbiAoKiogQGNhbm9uaWNhbCBDYW1sLk9wdGlvbiAqKVxuXG4gIG1vZHVsZSBQYXJzaW5nID0gQ2FtbC5QYXJzaW5nICgqKiBAY2Fub25pY2FsIENhbWwuUGFyc2luZyAqKVxuXG4gIG1vZHVsZSBQcmludGV4YyA9IENhbWwuUHJpbnRleGMgKCoqIEBjYW5vbmljYWwgQ2FtbC5QcmludGV4YyAqKVxuXG4gIG1vZHVsZSBQcmludGYgPSBDYW1sLlByaW50ZiAoKiogQGNhbm9uaWNhbCBDYW1sLlByaW50ZiAqKVxuXG4gIG1vZHVsZSBRdWV1ZSA9IENhbWwuUXVldWUgKCoqIEBjYW5vbmljYWwgQ2FtbC5RdWV1ZSAqKVxuXG4gIG1vZHVsZSBSYW5kb20gPSBDYW1sLlJhbmRvbSAoKiogQGNhbm9uaWNhbCBDYW1sLlJhbmRvbSAqKVxuXG4gIG1vZHVsZSBSZXN1bHQgPSBDYW1sLlJlc3VsdCAoKiogQGNhbm9uaWNhbCBDYW1sLlJlc3VsdCAqKVxuXG4gIG1vZHVsZSBTY2FuZiA9IENhbWwuU2NhbmYgKCoqIEBjYW5vbmljYWwgQ2FtbC5TY2FuZiAqKVxuXG4gIG1vZHVsZSBTZXEgPSBDYW1sLlNlcSAoKiogQGNhbm9uaWNhbCBDYW1sLlNlcSAqKVxuXG4gIG1vZHVsZSBTZXQgPSBDYW1sLk1vcmVMYWJlbHMuU2V0ICgqKiBAY2Fub25pY2FsIENhbWwuTW9yZUxhYmVscy5TZXQgKilcblxuICBtb2R1bGUgU3RhY2sgPSBDYW1sLlN0YWNrICgqKiBAY2Fub25pY2FsIENhbWwuU3RhY2sgKilcblxuICBtb2R1bGUgU3RyaW5nID0gQ2FtbC5TdGRMYWJlbHMuU3RyaW5nICgqKiBAY2Fub25pY2FsIENhbWwuU3RkTGFiZWxzLlN0cmluZyAqKVxuXG4gIG1vZHVsZSBTeXMgPSBDYW1sLlN5cyAoKiogQGNhbm9uaWNhbCBDYW1sLlN5cyAqKVxuXG4gIG1vZHVsZSBVY2hhciA9IENhbWwuVWNoYXIgKCoqIEBjYW5vbmljYWwgQ2FtbC5VY2hhciAqKVxuXG4gIG1vZHVsZSBVbml0ID0gQ2FtbC5Vbml0ICgqKiBAY2Fub25pY2FsIENhbWwuVW5pdCAqKVxuXG4gIGV4Y2VwdGlvbiBOb3RfZm91bmQgPSBDYW1sLk5vdF9mb3VuZFxuZW5kXG5cbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5cbigqIFRoZXNlIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgdG8gZ2V0IHRoZSBsYXp5IGJlaGF2aW9yICopXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5cbigqIFdlIHVzZSBbT2JqLm1hZ2ljXSBoZXJlIGFzIG90aGVyIGltcGxlbWVudGF0aW9ucyBnZW5lcmF0ZSBhIGNvbmRpdGlvbmFsIGp1bXAgYW5kIHRoZVxuICAgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSBpcyBub3RpY2VhYmxlLiAqKVxubGV0IGJvb2xfdG9faW50ICh4IDogYm9vbCkgOiBpbnQgPSBDYW1sLk9iai5tYWdpYyB4XG5cbigqIFRoaXMgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyBhbiBleHRlcm5hbCBmb3IgdGhlIHdhcm5pbmdzIHRvIHdvcmsgcHJvcGVybHkgKilcbmV4dGVybmFsIGlnbm9yZSA6IF8gLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbmxldCAoICE9ICkgPSBDYW1sLiggIT0gKVxubGV0ICggKiApID0gQ2FtbC4oICogKVxubGV0ICggKiogKSA9IENhbWwuKCAqKiApXG5sZXQgKCAqLiApID0gQ2FtbC4oICouIClcbmxldCAoICsgKSA9IENhbWwuKCArIClcbmxldCAoICsuICkgPSBDYW1sLiggKy4gKVxubGV0ICggLSApID0gQ2FtbC4oIC0gKVxubGV0ICggLS4gKSA9IENhbWwuKCAtLiApXG5sZXQgKCAvICkgPSBDYW1sLiggLyApXG5sZXQgKCAvLiApID0gQ2FtbC4oIC8uIClcblxubW9kdWxlIFBvbHkgPSBQb2x5MCAoKiogQGNhbm9uaWNhbCBCYXNlLlBvbHkgKilcblxubW9kdWxlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgKCogRGVjbGFyZWQgYXMgZXh0ZXJuYWxzIHNvIHRoYXQgdGhlIGNvbXBpbGVyIHNraXBzIHRoZSBjYW1sX2FwcGx5X1ggd3JhcHBpbmcgZXZlbiB3aGVuXG4gICAgIGNvbXBpbGluZyB3aXRob3V0IGNyb3NzIGxpYnJhcnkgaW5saW5pbmcuICopXG4gIGV4dGVybmFsICggPSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuICBleHRlcm5hbCAoIDw+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG4gIGV4dGVybmFsICggPCApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuICBleHRlcm5hbCAoID4gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbiAgZXh0ZXJuYWwgKCA8PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbiAgZXh0ZXJuYWwgKCA+PSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcbiAgZXh0ZXJuYWwgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG4gIGV4dGVybmFsIGVxdWFsIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGxldCBhc2NlbmRpbmcgKHggOiBpbnQpIHkgPSBjb21wYXJlIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IGludCkgeSA9IGNvbXBhcmUgeSB4XG4gIGxldCBtYXggKHggOiBpbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogaW50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5pbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubW9kdWxlIEludDMyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IENhbWwuSW50MzIudCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBDYW1sLkludDMyLnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgKCogRGVjbGFyZWQgYXMgZXh0ZXJuYWxzIHNvIHRoYXQgdGhlIGNvbXBpbGVyIHNraXBzIHRoZSBjYW1sX2FwcGx5X1ggd3JhcHBpbmcgZXZlbiB3aGVuXG4gICAgIGNvbXBpbGluZyB3aXRob3V0IGNyb3NzIGxpYnJhcnkgaW5saW5pbmcuICopXG4gIGV4dGVybmFsICggPSApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlZXF1YWxcIlxuICBleHRlcm5hbCAoIDw+ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG4gIGV4dGVybmFsICggPCApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuICBleHRlcm5hbCAoID4gKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbiAgZXh0ZXJuYWwgKCA8PSApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbiAgZXh0ZXJuYWwgKCA+PSApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcbiAgZXh0ZXJuYWwgY29tcGFyZSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG4gIGV4dGVybmFsIGVxdWFsIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGxldCBhc2NlbmRpbmcgKHggOiBDYW1sLkludDY0LnQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBDYW1sLkludDY0LnQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBtYXggKHggOiBDYW1sLkludDY0LnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogQ2FtbC5JbnQ2NC50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBCb29sX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBib29sKSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogYm9vbCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IGJvb2wpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogYm9vbCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogYm9vbCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBib29sKSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IGJvb2wpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBDaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogY2hhcikgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogY2hhcikgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogY2hhcikgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IGNoYXIpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogY2hhcikgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogY2hhcikgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBjaGFyKSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IGNoYXIpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBVY2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0IGkgeCA9IENhbWwuVWNoYXIudG9faW50IHhcbiAgbGV0ICggPCApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSAoaSB4KSAoaSB5KVxuICBsZXQgKCA8PSApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgKGkgeCkgKGkgeSlcbiAgbGV0ICggPD4gKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PiApIChpIHgpIChpIHkpXG4gIGxldCAoID0gKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA9ICkgKGkgeCkgKGkgeSlcbiAgbGV0ICggPiApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID4gKSAoaSB4KSAoaSB5KVxuICBsZXQgKCA+PSApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgKGkgeCkgKGkgeSlcblxuICBsZXQgYXNjZW5kaW5nICh4IDogQ2FtbC5VY2hhci50KSB5ID1cbiAgICBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmFzY2VuZGluZyAoaSB4KSAoaSB5KVxuICA7O1xuXG4gIGxldCBkZXNjZW5kaW5nICh4IDogQ2FtbC5VY2hhci50KSB5ID1cbiAgICBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmRlc2NlbmRpbmcgKGkgeCkgKGkgeSlcbiAgOztcblxuICBsZXQgY29tcGFyZSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuY29tcGFyZSAoaSB4KSAoaSB5KVxuICBsZXQgZXF1YWwgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmVxdWFsIChpIHgpIChpIHkpXG4gIGxldCBtYXggKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogQ2FtbC5VY2hhci50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBmbG9hdCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IGZsb2F0KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IGZsb2F0KSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBmbG9hdCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBmbG9hdCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBmbG9hdCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIFN0cmluZ19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IHN0cmluZykgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IHN0cmluZykgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBzdHJpbmcpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IHN0cmluZykgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBzdHJpbmcpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogc3RyaW5nKSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgQnl0ZXNfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBieXRlcykgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IGJ5dGVzKSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IGJ5dGVzKSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBieXRlcykgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBieXRlcykgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBieXRlcykgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxuKCogVGhpcyBuZWVkcyB0byBiZSBkZWZpbmVkIGFzIGFuIGV4dGVybmFsIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGNhbiBzcGVjaWFsaXplIGl0IGFzIGFcbiAgIGRpcmVjdCBzZXQgb3IgY2FtbF9tb2RpZnkgKilcbmV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcblxuKCogVGhlc2UgbmVlZCB0byBiZSBkZWZpbmVkIGFzIGFuIGV4dGVybmFsIG90aGVyd2lzZSB0aGUgY29tcGlsZXIgd29uJ3QgdW5ib3hcbiAgIHJlZmVyZW5jZXMgKilcbmV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcblxubGV0ICggQCApID0gQ2FtbC4oIEAgKVxubGV0ICggXiApID0gQ2FtbC4oIF4gKVxubGV0ICggfi0gKSA9IENhbWwuKCB+LSApXG5sZXQgKCB+LS4gKSA9IENhbWwuKCB+LS4gKVxubGV0ICggYXNyICkgPSBDYW1sLiggYXNyIClcbmxldCAoIGxhbmQgKSA9IENhbWwuKCBsYW5kIClcbmxldCBsbm90ID0gQ2FtbC5sbm90XG5sZXQgKCBsb3IgKSA9IENhbWwuKCBsb3IgKVxubGV0ICggbHNsICkgPSBDYW1sLiggbHNsIClcbmxldCAoIGxzciApID0gQ2FtbC4oIGxzciApXG5sZXQgKCBseG9yICkgPSBDYW1sLiggbHhvciApXG5sZXQgKCBtb2QgKSA9IENhbWwuKCBtb2QgKVxubGV0IGFicyA9IENhbWwuYWJzXG5sZXQgZmFpbHdpdGggPSBDYW1sLmZhaWx3aXRoXG5sZXQgZnN0ID0gQ2FtbC5mc3RcbmxldCBpbnZhbGlkX2FyZyA9IENhbWwuaW52YWxpZF9hcmdcbmxldCBzbmQgPSBDYW1sLnNuZFxuXG4oKiBbcmFpc2VdIG5lZWRzIHRvIGJlIGRlZmluZWQgYXMgYW4gZXh0ZXJuYWwgYXMgdGhlIGNvbXBpbGVyIGF1dG9tYXRpY2FsbHkgcmVwbGFjZXNcbiAgICclcmFpc2UnIGJ5ICclcmVyYWlzZScgd2hlbiBhcHByb3ByaWF0ZS4gKilcbmV4dGVybmFsIHJhaXNlIDogZXhuIC0+IF8gPSBcIiVyYWlzZVwiXG5cbmxldCBwaHlzX2VxdWFsID0gQ2FtbC4oID09IClcbmxldCBkZWNyID0gQ2FtbC5kZWNyXG5sZXQgaW5jciA9IENhbWwuaW5jclxuXG4oKiB1c2VkIGJ5IHNleHBfY29udiwgd2hpY2ggZmxvYXQwIGRlcGVuZHMgb24gdGhyb3VnaCBvcHRpb24gKilcbmxldCBmbG9hdF9vZl9zdHJpbmcgPSBDYW1sLmZsb2F0X29mX3N0cmluZ1xuXG4oKiBbYW1fdGVzdGluZ10gaXMgdXNlZCBpbiBhIGZldyBwbGFjZXMgdG8gYmVoYXZlIGRpZmZlcmVudGx5IHdoZW4gaW4gdGVzdGluZyBtb2RlLCBzdWNoXG4gICBhcyBpbiBbcmFuZG9tLm1sXS4gIFthbV90ZXN0aW5nXSBpcyBpbXBsZW1lbnRlZCB1c2luZyBbQmFzZV9hbV90ZXN0aW5nXSwgYSB3ZWFrIEMvanNcbiAgIHByaW1pdGl2ZSB0aGF0IHJldHVybnMgW2ZhbHNlXSwgYnV0IHdoZW4gbGlua2luZyBhbiBpbmxpbmUtdGVzdC1ydW5uZXIgZXhlY3V0YWJsZSwgaXNcbiAgIG92ZXJyaWRkZW4gYnkgYW5vdGhlciBwcmltaXRpdmUgdGhhdCByZXR1cm5zIFt0cnVlXS4gKilcbmV4dGVybmFsIGFtX3Rlc3RpbmcgOiB1bml0IC0+IGJvb2wgPSBcIkJhc2VfYW1fdGVzdGluZ1wiXG5cbmxldCBhbV90ZXN0aW5nID0gYW1fdGVzdGluZyAoKVxuIiwib3BlbiEgSW1wb3J0MFxuaW5jbHVkZSBDYW1sLlByaW50ZlxuXG4oKiogZmFpbHdpdGgsIGludmFsaWRfYXJnLCBhbmQgZXhpdCBhY2NlcHRpbmcgcHJpbnRmJ3MgZm9ybWF0LiAqKVxuXG5sZXQgZmFpbHdpdGhmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAoKSAtPiBmYWlsd2l0aCBzKSBmbXRcbmxldCBpbnZhbGlkX2FyZ2YgZm10ID0ga3NwcmludGYgKGZ1biBzICgpIC0+IGludmFsaWRfYXJnIHMpIGZtdFxuIiwiKCogW1N5czBdIGRlZmluZXMgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseSBkZWZpbmVkIGluXG4gICB0ZXJtcyBvZiBbQ2FtbC5TeXNdLiAgW1N5czBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGUgcGFydCBvZlxuICAgW0NhbWwuU3lzXSB0aGF0IFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlciB0aGFuIHN5cy5tbFxuICAgc2hvdWxkIHVzZSBbQ2FtbC5TeXNdLiBbU3lzMF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGVcbiAgIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci4gIEFsbCBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2UgdGhlc2VcbiAgIGZ1bmN0aW9ucyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuU3lzXSBpbiBidWlsZCBvcmRlciBzaG91bGQgZG9cbiAgIFttb2R1bGUgU3lzID0gU3lzMF0uICBEZWZpbmluZyBbbW9kdWxlIFN5cyA9IFN5czBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2VcbiAgIGl0IHByZXZlbnRzIG9jYW1sZGVwIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuU3lzXS4gKilcblxub3BlbiEgSW1wb3J0MFxuXG50eXBlIGJhY2tlbmRfdHlwZSA9IENhbWwuU3lzLmJhY2tlbmRfdHlwZSA9XG4gIHwgTmF0aXZlXG4gIHwgQnl0ZWNvZGVcbiAgfCBPdGhlciBvZiBzdHJpbmdcblxubGV0IGJhY2tlbmRfdHlwZSA9IENhbWwuU3lzLmJhY2tlbmRfdHlwZVxubGV0IGludGVyYWN0aXZlID0gQ2FtbC5TeXMuaW50ZXJhY3RpdmVcbmxldCBvc190eXBlID0gQ2FtbC5TeXMub3NfdHlwZVxubGV0IHVuaXggPSBDYW1sLlN5cy51bml4XG5sZXQgd2luMzIgPSBDYW1sLlN5cy53aW4zMlxubGV0IGN5Z3dpbiA9IENhbWwuU3lzLmN5Z3dpblxubGV0IHdvcmRfc2l6ZV9pbl9iaXRzID0gQ2FtbC5TeXMud29yZF9zaXplXG5sZXQgaW50X3NpemVfaW5fYml0cyA9IENhbWwuU3lzLmludF9zaXplXG5sZXQgYmlnX2VuZGlhbiA9IENhbWwuU3lzLmJpZ19lbmRpYW5cbmxldCBtYXhfc3RyaW5nX2xlbmd0aCA9IENhbWwuU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG5sZXQgbWF4X2FycmF5X2xlbmd0aCA9IENhbWwuU3lzLm1heF9hcnJheV9sZW5ndGhcbmxldCBydW50aW1lX3ZhcmlhbnQgPSBDYW1sLlN5cy5ydW50aW1lX3ZhcmlhbnRcbmxldCBydW50aW1lX3BhcmFtZXRlcnMgPSBDYW1sLlN5cy5ydW50aW1lX3BhcmFtZXRlcnNcbmxldCBhcmd2ID0gQ2FtbC5TeXMuYXJndlxubGV0IGdldF9hcmd2ICgpID0gQ2FtbC5TeXMuYXJndlxubGV0IG9jYW1sX3ZlcnNpb24gPSBDYW1sLlN5cy5vY2FtbF92ZXJzaW9uXG5sZXQgZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MgPSBDYW1sLlN5cy5lbmFibGVfcnVudGltZV93YXJuaW5nc1xubGV0IHJ1bnRpbWVfd2FybmluZ3NfZW5hYmxlZCA9IENhbWwuU3lzLnJ1bnRpbWVfd2FybmluZ3NfZW5hYmxlZFxuXG5sZXQgZ2V0ZW52X2V4biB2YXIgPVxuICB0cnkgQ2FtbC5TeXMuZ2V0ZW52IHZhciB3aXRoXG4gIHwgQ2FtbC5Ob3RfZm91bmQgLT5cbiAgICBQcmludGYuZmFpbHdpdGhmIFwiU3lzLmdldGVudl9leG46IGVudmlyb25tZW50IHZhcmlhYmxlICVzIGlzIG5vdCBzZXRcIiB2YXIgKClcbjs7XG5cbmxldCBnZXRlbnYgdmFyID1cbiAgbWF0Y2ggQ2FtbC5TeXMuZ2V0ZW52IHZhciB3aXRoXG4gIHwgeCAtPiBTb21lIHhcbiAgfCBleGNlcHRpb24gQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxuZXh0ZXJuYWwgb3BhcXVlX2lkZW50aXR5IDogJ2EgLT4gJ2EgPSBcIiVvcGFxdWVcIlxuXG5leGNlcHRpb24gQnJlYWsgPSBDYW1sLlN5cy5CcmVha1xuIiwiKCogW0FycmF5MF0gZGVmaW5lcyBhcnJheSBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5IGRlZmluZWQgaW4gdGVybXNcbiAgIG9mIFtDYW1sLkFycmF5XS4gIFtBcnJheTBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGUgcGFydCBvZiBbQ2FtbC5BcnJheV1cbiAgIHRoYXQgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyIHRoYW4gYXJyYXkwLm1sIHNob3VsZCB1c2UgW0NhbWwuQXJyYXldLlxuICAgW0FycmF5MF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLiAgQWxsXG4gICBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2UgYXJyYXlzIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5BcnJheV0gaW4gYnVpbGQgb3JkZXIgc2hvdWxkXG4gICBkbyBbbW9kdWxlIEFycmF5ID0gQXJyYXkwXS4gIFRoaXMgaW5jbHVkZXMgdXNlcyBvZiBzdWJzY3JpcHQgc3ludGF4IChbeC4oaSldLCBbeC4oaSkgPC1cbiAgIGVdKSwgd2hpY2ggdGhlIE9DYW1sIHBhcnNlciBkZXN1Z2FycyBpbnRvIGNhbGxzIHRvIFtBcnJheS5nZXRdIGFuZCBbQXJyYXkuc2V0XS5cbiAgIERlZmluaW5nIFttb2R1bGUgQXJyYXkgPSBBcnJheTBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXQgcHJldmVudHMgb2NhbWxkZXAgZnJvbVxuICAgbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuQXJyYXldLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5tb2R1bGUgU3lzID0gU3lzMFxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxuXG5tb2R1bGUgQXJyYXkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG4gIGV4dGVybmFsIGNyZWF0ZV9mbG9hdF91bmluaXRpYWxpemVkIDogaW50IC0+IGZsb2F0IGFycmF5ID0gXCJjYW1sX21ha2VfZmxvYXRfdmVjdFwiXG4gIGV4dGVybmFsIGdldCA6ICdhIGFycmF5IC0+IGludCAtPiAnYSA9IFwiJWFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgbGVuZ3RoIDogJ2EgYXJyYXkgLT4gaW50ID0gXCIlYXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgc2V0IDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVhcnJheV9zYWZlX3NldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV91bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfdW5zYWZlX3NldFwiXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXRcbiAgICA6ICBzcmM6J2EgYXJyYXlcbiAgICAtPiBzcmNfcG9zOmludFxuICAgIC0+IGRzdDonYSBhcnJheVxuICAgIC0+IGRzdF9wb3M6aW50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmVuZFxuXG5pbmNsdWRlIEFycmF5XG5cbmxldCBtYXhfbGVuZ3RoID0gU3lzLm1heF9hcnJheV9sZW5ndGhcblxubGV0IGNyZWF0ZSB+bGVuIHggPVxuICB0cnkgY3JlYXRlIGxlbiB4IHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IF8gLT4gaW52YWxpZF9hcmdmIFwiQXJyYXkuY3JlYXRlIH5sZW46JWQ6IGludmFsaWQgbGVuZ3RoXCIgbGVuICgpXG47O1xuXG5sZXQgY3JlYXRlX2Zsb2F0X3VuaW5pdGlhbGl6ZWQgfmxlbiA9XG4gIHRyeSBjcmVhdGVfZmxvYXRfdW5pbml0aWFsaXplZCBsZW4gd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgXyAtPlxuICAgIGludmFsaWRfYXJnZiBcIkFycmF5LmNyZWF0ZV9mbG9hdF91bmluaXRpYWxpemVkIH5sZW46JWQ6IGludmFsaWQgbGVuZ3RoXCIgbGVuICgpXG47O1xuXG5sZXQgYXBwZW5kID0gQ2FtbC5BcnJheS5hcHBlbmRcbmxldCBibGl0ID0gQ2FtbC5BcnJheS5ibGl0XG5sZXQgY29uY2F0ID0gQ2FtbC5BcnJheS5jb25jYXRcbmxldCBjb3B5ID0gQ2FtbC5BcnJheS5jb3B5XG5sZXQgZmlsbCA9IENhbWwuQXJyYXkuZmlsbFxubGV0IGluaXQgPSBDYW1sLkFycmF5LmluaXRcbmxldCBtYWtlX21hdHJpeCA9IENhbWwuQXJyYXkubWFrZV9tYXRyaXhcbmxldCBvZl9saXN0ID0gQ2FtbC5BcnJheS5vZl9saXN0XG5sZXQgc3ViID0gQ2FtbC5BcnJheS5zdWJcbmxldCB0b19saXN0ID0gQ2FtbC5BcnJheS50b19saXN0XG5cbigqIFRoZXNlIGFyZSBldGEgZXhwYW5kZWQgaW4gb3JkZXIgdG8gcGVybXV0ZSBwYXJhbWV0ZXIgb3JkZXIgdG8gZm9sbG93IEJhc2VcbiAgIGNvbnZlbnRpb25zLiAqKVxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9IENhbWwuQXJyYXkuZm9sZF9sZWZ0IHQgfmluaXQgfmZcbmxldCBmb2xkX3JpZ2h0IHQgfmYgfmluaXQgPSBDYW1sLkFycmF5LmZvbGRfcmlnaHQgdCB+ZiB+aW5pdFxubGV0IGl0ZXIgdCB+ZiA9IENhbWwuQXJyYXkuaXRlciB0IH5mXG5sZXQgaXRlcmkgdCB+ZiA9IENhbWwuQXJyYXkuaXRlcmkgdCB+ZlxubGV0IG1hcCB0IH5mID0gQ2FtbC5BcnJheS5tYXAgdCB+ZlxubGV0IG1hcGkgdCB+ZiA9IENhbWwuQXJyYXkubWFwaSB0IH5mXG5sZXQgc3RhYmxlX3NvcnQgdCB+Y29tcGFyZSA9IENhbWwuQXJyYXkuc3RhYmxlX3NvcnQgdCB+Y21wOmNvbXBhcmVcblxubGV0IHN3YXAgdCBpIGogPVxuICBsZXQgZWx0X2kgPSB0LihpKSBpblxuICBsZXQgZWx0X2ogPSB0LihqKSBpblxuICB1bnNhZmVfc2V0IHQgaSBlbHRfajtcbiAgdW5zYWZlX3NldCB0IGogZWx0X2lcbjs7XG4iLCIoKiBbQ2hhcjBdIGRlZmluZXMgY2hhciBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5IGRlZmluZWQgaW4gdGVybXMgb2ZcbiAgIFtDYW1sLkNoYXJdLiAgW0NoYXIwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlIHBhcnQgb2YgW0NhbWwuQ2hhcl0gdGhhdFxuICAgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyIHRoYW4gY2hhcjAubWwgc2hvdWxkIHVzZSBbQ2FtbC5DaGFyXS5cbiAgIFtDaGFyMF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLiAgQWxsXG4gICBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2UgY2hhcnMgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLkNoYXJdIGluIGJ1aWxkIG9yZGVyIHNob3VsZCBkb1xuICAgW21vZHVsZSBDaGFyID0gQ2hhcjBdLiAgRGVmaW5pbmcgW21vZHVsZSBDaGFyID0gQ2hhcjBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXRcbiAgIHByZXZlbnRzIG9jYW1sZGVwIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuQ2hhcl0uICopXG5cbm9wZW4hIEltcG9ydDBcblxubGV0IGZhaWx3aXRoZiA9IFByaW50Zi5mYWlsd2l0aGZcbmxldCBlc2NhcGVkID0gQ2FtbC5DaGFyLmVzY2FwZWRcbmxldCBsb3dlcmNhc2UgPSBDYW1sLkNoYXIubG93ZXJjYXNlX2FzY2lpXG5sZXQgdG9faW50ID0gQ2FtbC5DaGFyLmNvZGVcbmxldCB1bnNhZmVfb2ZfaW50ID0gQ2FtbC5DaGFyLnVuc2FmZV9jaHJcbmxldCB1cHBlcmNhc2UgPSBDYW1sLkNoYXIudXBwZXJjYXNlX2FzY2lpXG5cbigqIFdlIHVzZSBvdXIgb3duIHJhbmdlIHRlc3Qgd2hlbiBjb252ZXJ0aW5nIGludGVnZXJzIHRvIGNoYXJzIHJhdGhlciB0aGFuXG4gICBjYWxsaW5nIFtDYW1sLkNoYXIuY2hyXSBiZWNhdXNlIGl0J3Mgc2ltcGxlIGFuZCBpdCBzYXZlcyB1cyBhIGZ1bmN0aW9uIGNhbGxcbiAgIGFuZCB0aGUgdHJ5LXdpdGggKGV4Y2VwdGlvbnMgY29zdCwgZXNwZWNpYWxseSBpbiB0aGUgd29ybGQgd2l0aCBiYWNrdHJhY2VzKS4gKilcbmxldCBpbnRfaXNfb2sgaSA9IDAgPD0gaSAmJiBpIDw9IDI1NVxubGV0IG1pbl92YWx1ZSA9IHVuc2FmZV9vZl9pbnQgMFxubGV0IG1heF92YWx1ZSA9IHVuc2FmZV9vZl9pbnQgMjU1XG5sZXQgb2ZfaW50IGkgPSBpZiBpbnRfaXNfb2sgaSB0aGVuIFNvbWUgKHVuc2FmZV9vZl9pbnQgaSkgZWxzZSBOb25lXG5cbmxldCBvZl9pbnRfZXhuIGkgPVxuICBpZiBpbnRfaXNfb2sgaVxuICB0aGVuIHVuc2FmZV9vZl9pbnQgaVxuICBlbHNlIGZhaWx3aXRoZiBcIkNoYXIub2ZfaW50X2V4biBnb3QgaW50ZWdlciBvdXQgb2YgcmFuZ2U6ICVkXCIgaSAoKVxuOztcblxubGV0IGVxdWFsICh0MSA6IGNoYXIpIHQyID0gUG9seS5lcXVhbCB0MSB0MlxuIiwiKCogW0ludDBdIGRlZmluZXMgaW50ZWdlciBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5XG4gICBkZWZpbmVkIGluIHRlcm1zIG9mIFtDYW1sXS4gW0ludDBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGVcbiAgIHBhcnQgb2YgW0NhbWxdIHRoYXQgW0Jhc2VdIHVzZXMgZm9yIGludGVnZXJzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlclxuICAgdGhhbiBpbnQwLm1sIHNob3VsZCB1c2UgdGhlc2UgZnVuY3Rpb25zIGRpcmVjdGx5IHRocm91Z2ggW0NhbWxdLiBbSW50MF0gaGFzXG4gICBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci5cblxuICAgQWxsIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBpbnRzIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5JbnRdIGluIGJ1aWxkXG4gICBvcmRlciBzaG91bGQgZG86XG5cbiAgIHtbXG4gICAgIG1vZHVsZSBJbnQgID0gSW50MFxuICAgXX1cblxuICAgRGVmaW5pbmcgW21vZHVsZSBJbnQgPSBJbnQwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0IHByZXZlbnRzIG9jYW1sZGVwXG4gICBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLkludF0uICopXG5cbmxldCB0b19zdHJpbmcgPSBDYW1sLnN0cmluZ19vZl9pbnRcbmxldCBvZl9zdHJpbmcgPSBDYW1sLmludF9vZl9zdHJpbmdcbmxldCB0b19mbG9hdCA9IENhbWwuZmxvYXRfb2ZfaW50XG5sZXQgb2ZfZmxvYXQgPSBDYW1sLmludF9vZl9mbG9hdFxubGV0IG1heF92YWx1ZSA9IENhbWwubWF4X2ludFxubGV0IG1pbl92YWx1ZSA9IENhbWwubWluX2ludFxubGV0IHN1Y2MgPSBDYW1sLnN1Y2NcbiIsIigqIFtMaXN0MF0gZGVmaW5lcyBsaXN0IGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHkgZGVmaW5lZCBpbiB0ZXJtcyBvZlxuICAgW0NhbWwuTGlzdF0uICBbTGlzdDBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGUgcGFydCBvZiBbQ2FtbC5MaXN0XSB0aGF0XG4gICBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXIgdGhhbiBsaXN0MC5tbCBzaG91bGQgdXNlIFtDYW1sLkxpc3RdLlxuICAgW0xpc3QwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuICBBbGxcbiAgIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBsaXN0cyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuTGlzdF0gaW4gYnVpbGQgb3JkZXIgc2hvdWxkIGRvXG4gICBbbW9kdWxlIExpc3QgPSBMaXN0MF0uICBEZWZpbmluZyBbbW9kdWxlIExpc3QgPSBMaXN0MF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdFxuICAgcHJldmVudHMgb2NhbWxkZXAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5MaXN0XS4gKilcblxub3BlbiEgSW1wb3J0MFxuXG5sZXQgaGRfZXhuID0gQ2FtbC5MaXN0LmhkXG5sZXQgbGVuZ3RoID0gQ2FtbC5MaXN0Lmxlbmd0aFxubGV0IHJldl9hcHBlbmQgPSBDYW1sLkxpc3QucmV2X2FwcGVuZFxubGV0IHRsX2V4biA9IENhbWwuTGlzdC50bFxubGV0IHVuemlwID0gQ2FtbC5MaXN0LnNwbGl0XG5cbigqIFRoZXNlIGFyZSBldGEgZXhwYW5kZWQgaW4gb3JkZXIgdG8gcGVybXV0ZSBwYXJhbWV0ZXIgb3JkZXIgdG8gZm9sbG93IEJhc2VcbiAgIGNvbnZlbnRpb25zLiAqKVxubGV0IGV4aXN0cyB0IH5mID0gQ2FtbC5MaXN0LmV4aXN0cyB0IH5mXG5sZXQgZXhpc3RzMl9vayBsMSBsMiB+ZiA9IENhbWwuTGlzdC5leGlzdHMyIGwxIGwyIH5mXG5sZXQgZm9sZCB0IH5pbml0IH5mID0gQ2FtbC5MaXN0LmZvbGRfbGVmdCB0IH5mIH5pbml0XG5sZXQgZm9sZDJfb2sgbDEgbDIgfmluaXQgfmYgPSBDYW1sLkxpc3QuZm9sZF9sZWZ0MiBsMSBsMiB+aW5pdCB+ZlxubGV0IGZvcl9hbGwgdCB+ZiA9IENhbWwuTGlzdC5mb3JfYWxsIHQgfmZcbmxldCBmb3JfYWxsMl9vayBsMSBsMiB+ZiA9IENhbWwuTGlzdC5mb3JfYWxsMiBsMSBsMiB+ZlxubGV0IGl0ZXIgdCB+ZiA9IENhbWwuTGlzdC5pdGVyIHQgfmZcbmxldCBpdGVyMl9vayBsMSBsMiB+ZiA9IENhbWwuTGlzdC5pdGVyMiBsMSBsMiB+ZlxubGV0IG5vbnRhaWxfbWFwIHQgfmYgPSBDYW1sLkxpc3QubWFwIHQgfmZcbmxldCBub250YWlsX21hcGkgdCB+ZiA9IENhbWwuTGlzdC5tYXBpIHQgfmZcbmxldCBwYXJ0aXRpb24gdCB+ZiA9IENhbWwuTGlzdC5wYXJ0aXRpb24gdCB+ZlxubGV0IHJldl9tYXAgdCB+ZiA9IENhbWwuTGlzdC5yZXZfbWFwIHQgfmZcbmxldCByZXZfbWFwMl9vayBsMSBsMiB+ZiA9IENhbWwuTGlzdC5yZXZfbWFwMiBsMSBsMiB+ZlxubGV0IHNvcnQgbCB+Y29tcGFyZSA9IENhbWwuTGlzdC5zb3J0IGwgfmNtcDpjb21wYXJlXG5sZXQgc3RhYmxlX3NvcnQgbCB+Y29tcGFyZSA9IENhbWwuTGlzdC5zdGFibGVfc29ydCBsIH5jbXA6Y29tcGFyZVxuXG5sZXQgcmV2ID0gZnVuY3Rpb25cbiAgfCAoW10gfCBbIF8gXSkgYXMgcmVzIC0+IHJlc1xuICB8IHggOjogeSA6OiByZXN0IC0+IHJldl9hcHBlbmQgcmVzdCBbIHk7IHggXVxuOztcblxubGV0IGZvbGRfcmlnaHQgbCB+ZiB+aW5pdCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IGluaXQgKCogYXZvaWQgdGhlIGFsbG9jYXRpb24gb2YgW35mXSBiZWxvdyAqKVxuICB8IF8gLT4gZm9sZCB+ZjooZnVuIGEgYiAtPiBmIGIgYSkgfmluaXQgKHJldiBsKVxuOztcbiIsIigqXG4gICBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHJ1bnRpbWUgc3VwcG9ydCBmb3IgW3BweF9oYXNoXS5cblxuICAgVGhlIFtwcHhfaGFzaF0gc3ludGF4IGV4dGVuc2lvbiBzdXBwb3J0czogW0BAZGVyaXZpbmcgaGFzaF0gYW5kIFslaGFzaF9mb2xkOiBUWVBFXSBhbmRcbiAgIFslaGFzaDogVFlQRV1cblxuICAgRm9yIHR5cGUgW3RdIGEgZnVuY3Rpb24gW2hhc2hfZm9sZF90XSBvZiB0eXBlIFtIYXNoLnN0YXRlIC0+IHQgLT4gSGFzaC5zdGF0ZV0gaXNcbiAgIGdlbmVyYXRlZC5cblxuICAgVGhlIGdlbmVyYXRlZCBbaGFzaF9mb2xkXzxUPl0gZnVuY3Rpb24gaXMgY29tcG9zaXRpb25hbCwgZm9sbG93aW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlXG4gICB0eXBlOyBhbGxvd2luZyB1c2VyIG92ZXJyaWRlcyBhdCBldmVyeSBsZXZlbC4gVGhpcyBpcyBpbiBjb250cmFzdCB0byBvY2FtbCdzIGJ1aWx0aW5cbiAgIHBvbHltb3JwaGljIGhhc2hpbmcgW0hhc2h0YmwuaGFzaF0gd2hpY2ggaWdub3JlcyB1c2VyIG92ZXJyaWRlcy5cblxuICAgVGhlIGdlbmVyYXRvciBhbHNvIHByb3ZpZGVzIGEgZGlyZWN0IGhhc2gtZnVuY3Rpb24gW2hhc2hdIChuYW1lZCBbaGFzaF88VD5dIHdoZW4gPFQ+ICE9XG4gICBcInRcIikgb2YgdHlwZTogW3QgLT4gSGFzaC5oYXNoX3ZhbHVlXS5cblxuICAgVGhlIGZvbGRpbmcgaGFzaCBmdW5jdGlvbiBjYW4gYmUgYWNjZXNzZWQgYXMgWyVoYXNoX2ZvbGQ6IFRZUEVdXG4gICBUaGUgZGlyZWN0IGhhc2ggZnVuY3Rpb24gY2FuIGJlIGFjY2Vzc2VkIGFzIFslaGFzaDogVFlQRV1cbiopXG5cbm9wZW4hIEltcG9ydDBcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxubW9kdWxlIENoYXIgPSBDaGFyMFxubW9kdWxlIEludCA9IEludDBcbm1vZHVsZSBMaXN0ID0gTGlzdDBcbmluY2x1ZGUgSGFzaF9pbnRmXG5cbigqKiBCdWlsdGluIGZvbGRpbmctc3R5bGUgaGFzaCBmdW5jdGlvbnMsIGFic3RyYWN0ZWQgb3ZlciBbSGFzaF9pbnRmLlNdICopXG5tb2R1bGUgRm9sZGluZyAoSGFzaCA6IEhhc2hfaW50Zi5TKSA6XG4gIEhhc2hfaW50Zi5CdWlsdGluX2ludGZcbiAgd2l0aCB0eXBlIHN0YXRlID0gSGFzaC5zdGF0ZVxuICAgYW5kIHR5cGUgaGFzaF92YWx1ZSA9IEhhc2guaGFzaF92YWx1ZSA9IHN0cnVjdFxuICB0eXBlIHN0YXRlID0gSGFzaC5zdGF0ZVxuICB0eXBlIGhhc2hfdmFsdWUgPSBIYXNoLmhhc2hfdmFsdWVcbiAgdHlwZSAnYSBmb2xkZXIgPSBzdGF0ZSAtPiAnYSAtPiBzdGF0ZVxuXG4gIGxldCBoYXNoX2ZvbGRfdW5pdCBzICgpID0gc1xuICBsZXQgaGFzaF9mb2xkX2ludCA9IEhhc2guZm9sZF9pbnRcbiAgbGV0IGhhc2hfZm9sZF9pbnQ2NCA9IEhhc2guZm9sZF9pbnQ2NFxuICBsZXQgaGFzaF9mb2xkX2Zsb2F0ID0gSGFzaC5mb2xkX2Zsb2F0XG4gIGxldCBoYXNoX2ZvbGRfc3RyaW5nID0gSGFzaC5mb2xkX3N0cmluZ1xuICBsZXQgYXNfaW50IGYgcyB4ID0gaGFzaF9mb2xkX2ludCBzIChmIHgpXG5cbiAgKCogVGhpcyBpZ25vcmVzIHRoZSBzaWduIGJpdCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgYnV0IGl0J3MgdW5saWtlbHkgdG8gbGVhZCB0b1xuICAgICBmcmVxdWVudCBjb2xsaXNpb25zIChtaW5fdmFsdWUgY29sbGlkaW5nIHdpdGggMCBpcyB0aGUgbW9zdCBsaWtlbHkgb25lKS4gICopXG4gIGxldCBoYXNoX2ZvbGRfaW50MzIgPSBhc19pbnQgQ2FtbC5JbnQzMi50b19pbnRcbiAgbGV0IGhhc2hfZm9sZF9jaGFyID0gYXNfaW50IENoYXIudG9faW50XG5cbiAgbGV0IGhhc2hfZm9sZF9ib29sID1cbiAgICBhc19pbnQgKGZ1bmN0aW9uXG4gICAgICB8IHRydWUgLT4gMVxuICAgICAgfCBmYWxzZSAtPiAwKVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfbmF0aXZlaW50IHMgeCA9IGhhc2hfZm9sZF9pbnQ2NCBzIChDYW1sLkludDY0Lm9mX25hdGl2ZWludCB4KVxuXG4gIGxldCBoYXNoX2ZvbGRfb3B0aW9uIGhhc2hfZm9sZF9lbGVtIHMgPSBmdW5jdGlvblxuICAgIHwgTm9uZSAtPiBoYXNoX2ZvbGRfaW50IHMgMFxuICAgIHwgU29tZSB4IC0+IGhhc2hfZm9sZF9lbGVtIChoYXNoX2ZvbGRfaW50IHMgMSkgeFxuICA7O1xuXG4gIGxldCByZWMgaGFzaF9mb2xkX2xpc3RfYm9keSBoYXNoX2ZvbGRfZWxlbSBzIGxpc3QgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gc1xuICAgIHwgeCA6OiB4cyAtPiBoYXNoX2ZvbGRfbGlzdF9ib2R5IGhhc2hfZm9sZF9lbGVtIChoYXNoX2ZvbGRfZWxlbSBzIHgpIHhzXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9saXN0IGhhc2hfZm9sZF9lbGVtIHMgbGlzdCA9XG4gICAgKCogVGhlIFtsZW5ndGhdIG9mIHRoZSBsaXN0IG11c3QgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIGhhc2gtc3RhdGUgc28gdmFsdWVzIG9mXG4gICAgICAgdHlwZXMgc3VjaCBhcyBbdW5pdCBsaXN0XSAtIChbXSwgWygpXSwgWygpOygpXSwuLikgYXJlIGhhc2hlZCBkaWZmZXJlbnRseS4gKilcbiAgICAoKiBUaGUgW2xlbmd0aF0gbXVzdCBjb21lIGJlZm9yZSB0aGUgZWxlbWVudHMgdG8gYXZvaWQgYSB2aW9sYXRpb24gb2YgdGhlIHJ1bGVcbiAgICAgICBlbmZvcmNlZCBieSBQZXJmZWN0X2hhc2guICopXG4gICAgbGV0IHMgPSBoYXNoX2ZvbGRfaW50IHMgKExpc3QubGVuZ3RoIGxpc3QpIGluXG4gICAgbGV0IHMgPSBoYXNoX2ZvbGRfbGlzdF9ib2R5IGhhc2hfZm9sZF9lbGVtIHMgbGlzdCBpblxuICAgIHNcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX2xhenlfdCBoYXNoX2ZvbGRfZWxlbSBzIHggPSBoYXNoX2ZvbGRfZWxlbSBzIChDYW1sLkxhenkuZm9yY2UgeClcbiAgbGV0IGhhc2hfZm9sZF9yZWZfZnJvemVuIGhhc2hfZm9sZF9lbGVtIHMgeCA9IGhhc2hfZm9sZF9lbGVtIHMgIXhcblxuICBsZXQgcmVjIGhhc2hfZm9sZF9hcnJheV9mcm96ZW5faSBoYXNoX2ZvbGRfZWxlbSBzIGFycmF5IGkgPVxuICAgIGlmIGkgPSBBcnJheS5sZW5ndGggYXJyYXlcbiAgICB0aGVuIHNcbiAgICBlbHNlIChcbiAgICAgIGxldCBlID0gQXJyYXkudW5zYWZlX2dldCBhcnJheSBpIGluXG4gICAgICBoYXNoX2ZvbGRfYXJyYXlfZnJvemVuX2kgaGFzaF9mb2xkX2VsZW0gKGhhc2hfZm9sZF9lbGVtIHMgZSkgYXJyYXkgKGkgKyAxKSlcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX2FycmF5X2Zyb3plbiBoYXNoX2ZvbGRfZWxlbSBzIGFycmF5ID1cbiAgICBoYXNoX2ZvbGRfYXJyYXlfZnJvemVuX2lcbiAgICAgICgqIFtsZW5ndGhdIG11c3QgYmUgaW5jb3Jwb3JhdGVkIGZvciBhcnJheXMsIGFzIGl0IGlzIGZvciBsaXN0cy4gU2VlIGNvbW1lbnQgYWJvdmUgKilcbiAgICAgIGhhc2hfZm9sZF9lbGVtXG4gICAgICAoaGFzaF9mb2xkX2ludCBzIChBcnJheS5sZW5ndGggYXJyYXkpKVxuICAgICAgYXJyYXlcbiAgICAgIDBcbiAgOztcblxuICAoKiB0aGUgZHVwbGljYXRpb24gaGVyZSBpcyBiZWNhdXNlIHdlIHRoaW5rXG4gICAgIG9jYW1sIGNhbid0IGVsaW1pbmF0ZSBpbmRpcmVjdCBmdW5jdGlvbiBjYWxscyBvdGhlcndpc2UuICopXG4gIGxldCBoYXNoX25hdGl2ZWludCB4ID1cbiAgICBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfbmF0aXZlaW50IChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgOztcblxuICBsZXQgaGFzaF9pbnQ2NCB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2ludDY0IChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgbGV0IGhhc2hfaW50MzIgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9pbnQzMiAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIGxldCBoYXNoX2NoYXIgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9jaGFyIChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgbGV0IGhhc2hfaW50IHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfaW50IChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgbGV0IGhhc2hfYm9vbCB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2Jvb2wgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuXG4gIGxldCBoYXNoX3N0cmluZyB4ID1cbiAgICBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfc3RyaW5nIChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgOztcblxuICBsZXQgaGFzaF9mbG9hdCB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2Zsb2F0IChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgbGV0IGhhc2hfdW5pdCB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX3VuaXQgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuZW5kXG5cbm1vZHVsZSBGIChIYXNoIDogSGFzaF9pbnRmLlMpIDpcbiAgSGFzaF9pbnRmLkZ1bGxcbiAgd2l0aCB0eXBlIGhhc2hfdmFsdWUgPSBIYXNoLmhhc2hfdmFsdWVcbiAgIGFuZCB0eXBlIHN0YXRlID0gSGFzaC5zdGF0ZVxuICAgYW5kIHR5cGUgc2VlZCA9IEhhc2guc2VlZCA9IHN0cnVjdFxuICBpbmNsdWRlIEhhc2hcblxuICB0eXBlICdhIGZvbGRlciA9IHN0YXRlIC0+ICdhIC0+IHN0YXRlXG5cbiAgbGV0IGNyZWF0ZSA/c2VlZCAoKSA9IHJlc2V0ID9zZWVkIChhbGxvYyAoKSlcbiAgbGV0IG9mX2ZvbGQgaGFzaF9mb2xkX3QgdCA9IGdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfdCAoY3JlYXRlICgpKSB0KVxuXG4gIG1vZHVsZSBCdWlsdGluID0gRm9sZGluZyAoSGFzaClcblxuICBsZXQgcnVuID9zZWVkIGZvbGRlciB4ID1cbiAgICBIYXNoLmdldF9oYXNoX3ZhbHVlIChmb2xkZXIgKEhhc2gucmVzZXQgP3NlZWQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICA7O1xuZW5kXG5cbm1vZHVsZSBJbnRlcm5hbGhhc2ggOiBzaWdcbiAgaW5jbHVkZVxuICAgIEhhc2hfaW50Zi5TXG4gICAgd2l0aCB0eXBlIHN0YXRlID0gQmFzZV9pbnRlcm5hbGhhc2hfdHlwZXMuc3RhdGVcbiAgICAgKCogV2UgZ2l2ZSBhIGNvbmNyZXRlIHR5cGUgZm9yIFtzdGF0ZV0sIGFsYmVpdCBvbmx5IHBhcnRpYWxseSBleHBvc2VkIChzZWVcbiAgICAgICAgQmFzZV9pbnRlcm5hbGhhc2hfdHlwZXMpLCBzbyB0aGF0IGl0IHVuaWZpZXMgd2l0aCB0aGUgc2FtZSB0eXBlIGluIFtCYXNlX2Jvb3RdLFxuICAgICAgICBhbmQgdG8gYWxsb3cgb3B0aW1pemF0aW9ucyBmb3IgdGhlIGltbWVkaWF0ZSB0eXBlLiAqKVxuICAgICBhbmQgdHlwZSBzZWVkID0gQmFzZV9pbnRlcm5hbGhhc2hfdHlwZXMuc2VlZFxuICAgICBhbmQgdHlwZSBoYXNoX3ZhbHVlID0gQmFzZV9pbnRlcm5hbGhhc2hfdHlwZXMuaGFzaF92YWx1ZVxuXG4gIGV4dGVybmFsIGZvbGRfaW50NjQgOiBzdGF0ZSAtPiBpbnQ2NCAtPiBzdGF0ZSA9IFwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQ2NFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgZm9sZF9pbnQgOiBzdGF0ZSAtPiBpbnQgLT4gc3RhdGUgPSBcIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50XCIgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBmb2xkX2Zsb2F0IDogc3RhdGUgLT4gZmxvYXQgLT4gc3RhdGUgPSBcIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfZmxvYXRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGZvbGRfc3RyaW5nIDogc3RhdGUgLT4gc3RyaW5nIC0+IHN0YXRlID0gXCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX3N0cmluZ1wiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgZ2V0X2hhc2hfdmFsdWUgOiBzdGF0ZSAtPiBoYXNoX3ZhbHVlID0gXCJCYXNlX2ludGVybmFsaGFzaF9nZXRfaGFzaF92YWx1ZVwiXG4gIFtAQG5vYWxsb2NdXG5lbmQgPSBzdHJ1Y3RcbiAgbGV0IGRlc2NyaXB0aW9uID0gXCJpbnRlcm5hbGhhc2hcIlxuXG4gIGluY2x1ZGUgQmFzZV9pbnRlcm5hbGhhc2hfdHlwZXNcblxuICBsZXQgYWxsb2MgKCkgPSBjcmVhdGVfc2VlZGVkIDBcbiAgbGV0IHJlc2V0ID8oc2VlZCA9IDApIF90ID0gY3JlYXRlX3NlZWRlZCBzZWVkXG5cbiAgbW9kdWxlIEZvcl90ZXN0cyA9IHN0cnVjdFxuICAgIGxldCBjb21wYXJlX3N0YXRlIChhIDogc3RhdGUpIChiIDogc3RhdGUpID0gY29tcGFyZSAoYSA6PiBpbnQpIChiIDo+IGludClcbiAgICBsZXQgc3RhdGVfdG9fc3RyaW5nIChzdGF0ZSA6IHN0YXRlKSA9IEludC50b19zdHJpbmcgKHN0YXRlIDo+IGludClcbiAgZW5kXG5lbmRcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBJbnRlcm5hbGhhc2hcblxuICB0eXBlICdhIGZvbGRlciA9IHN0YXRlIC0+ICdhIC0+IHN0YXRlXG5cbiAgbGV0IGNyZWF0ZSA/c2VlZCAoKSA9IHJlc2V0ID9zZWVkIChhbGxvYyAoKSlcbiAgbGV0IHJ1biA/c2VlZCBmb2xkZXIgeCA9IGdldF9oYXNoX3ZhbHVlIChmb2xkZXIgKHJlc2V0ID9zZWVkIChhbGxvYyAoKSkpIHgpXG4gIGxldCBvZl9mb2xkIGhhc2hfZm9sZF90IHQgPSBnZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX3QgKGNyZWF0ZSAoKSkgdClcblxuICBtb2R1bGUgQnVpbHRpbiA9IHN0cnVjdFxuICAgIG1vZHVsZSBGb2xkaW5nID0gRm9sZGluZyAoSW50ZXJuYWxoYXNoKVxuICAgIGluY2x1ZGUgRm9sZGluZ1xuXG4gICAgKCogW0ZvbGRpbmddIHByb3ZpZGVzIHNvbWUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBbaGFzaF8qXSBmdW5jdGlvbnMgYmVsb3csXG4gICAgICAgYnV0IHRoZXkgYXJlIGluZWZmaWNpZW50IGZvciBzb21lIHVzZS1jYXNlcyBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YgdGhlIFtoYXNoX2ZvbGRdXG4gICAgICAgZnVuY3Rpb25zLiBBdCB0aGlzIHBvaW50LCB0aGUgW2hhc2hfdmFsdWVdIHR5cGUgaGFzIGJlZW4gZml4ZWQgdG8gW2ludF0sIHNvIHRoaXNcbiAgICAgICBtb2R1bGUgY2FuIHByb3ZpZGUgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zLiAqKVxuXG4gICAgbGV0IGhhc2hfY2hhciA9IENoYXIwLnRvX2ludFxuXG4gICAgKCogVGhpcyBoYXNoIHdhcyBjaG9zZW4gZnJvbSBoZXJlOiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9iYWRib3kvNjI2Nzc0M1xuXG4gICAgICAgSXQgYXR0ZW1wdHMgdG8gZnVsZmlsbCB0aGUgcHJpbWFyeSBnb2FscyBvZiBhIG5vbi1jcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb246XG5cbiAgICAgICAtIGEgYml0IGNoYW5nZSBpbiB0aGUgaW5wdXQgc2hvdWxkIGNoYW5nZSB+MS8yIG9mIHRoZSBvdXRwdXQgYml0c1xuICAgICAgIC0gdGhlIG91dHB1dCBzaG91bGQgYmUgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgb3V0cHV0IHJhbmdlXG4gICAgICAgLSBpbnB1dHMgdGhhdCBhcmUgY2xvc2UgdG8gZWFjaCBvdGhlciBzaG91bGRuJ3QgbGVhZCB0byBvdXRwdXRzIHRoYXQgYXJlIGNsb3NlIHRvXG4gICAgICAgICBlYWNoIG90aGVyLlxuICAgICAgIC0gYWxsIGJpdHMgb2YgdGhlIGlucHV0IGFyZSB1c2VkIGluIGdlbmVyYXRpbmcgdGhlIG91dHB1dFxuXG4gICAgICAgSW4gb3VyIGNhc2Ugd2UgYWxzbyB3YW50IGl0IHRvIGJlIGZhc3QsIG5vbi1hbGxvY2F0aW5nLCBhbmQgaW5saW5hYmxlLiAgKilcbiAgICBsZXRbQGlubGluZSBhbHdheXNdIGhhc2hfaW50ICh0IDogaW50KSA9XG4gICAgICBsZXQgdCA9IGxub3QgdCArICh0IGxzbCAyMSkgaW5cbiAgICAgIGxldCB0ID0gdCBseG9yICh0IGxzciAyNCkgaW5cbiAgICAgIGxldCB0ID0gdCArICh0IGxzbCAzKSArICh0IGxzbCA4KSBpblxuICAgICAgbGV0IHQgPSB0IGx4b3IgKHQgbHNyIDE0KSBpblxuICAgICAgbGV0IHQgPSB0ICsgKHQgbHNsIDIpICsgKHQgbHNsIDQpIGluXG4gICAgICBsZXQgdCA9IHQgbHhvciAodCBsc3IgMjgpIGluXG4gICAgICB0ICsgKHQgbHNsIDMxKVxuICAgIDs7XG5cbiAgICBsZXQgaGFzaF9ib29sIHggPSBpZiB4IHRoZW4gMSBlbHNlIDBcblxuICAgIGV4dGVybmFsIGhhc2hfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIkJhc2VfaGFzaF9kb3VibGVcIiBbQEBub2FsbG9jXVxuXG4gICAgbGV0IGhhc2hfdW5pdCAoKSA9IDBcbiAgZW5kXG5lbmRcblxuaW5jbHVkZSBUXG4iLCJvcGVuIEltcG9ydDBcblxubGV0IHBoeXNfZXF1YWwgPSBwaHlzX2VxdWFsXG5cbmV4dGVybmFsIHBvbHltb3JwaGljX2NvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbmV4dGVybmFsIHBvbHltb3JwaGljX2VxdWFsIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5cbmxldCBjb21wYXJlX2Fic3RyYWN0IH50eXBlX25hbWUgXyBfID1cbiAgUHJpbnRmLmtzcHJpbnRmXG4gICAgZmFpbHdpdGhcbiAgICBcIkNvbXBhcmUgY2FsbGVkIG9uIHRoZSB0eXBlICVzLCB3aGljaCBpcyBhYnN0cmFjdCBpbiBhbiBpbXBsZW1lbnRhdGlvbi5cIlxuICAgIHR5cGVfbmFtZVxuOztcblxubGV0IGVxdWFsX2Fic3RyYWN0IH50eXBlX25hbWUgXyBfID1cbiAgUHJpbnRmLmtzcHJpbnRmXG4gICAgZmFpbHdpdGhcbiAgICBcIkVxdWFsIGNhbGxlZCBvbiB0aGUgdHlwZSAlcywgd2hpY2ggaXMgYWJzdHJhY3QgaW4gYW4gaW1wbGVtZW50YXRpb24uXCJcbiAgICB0eXBlX25hbWVcbjs7XG5cbnR5cGUgJ2EgY29tcGFyZSA9ICdhIC0+ICdhIC0+IGludFxudHlwZSAnYSBlcXVhbCA9ICdhIC0+ICdhIC0+IGJvb2xcblxubW9kdWxlIENvbXBhcmFibGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiB0IGNvbXBhcmVcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBjb21wYXJlIDogJ2EgY29tcGFyZSAtPiAnYSB0IGNvbXBhcmVcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBjb21wYXJlIDogJ2EgY29tcGFyZSAtPiAnYiBjb21wYXJlIC0+ICgnYSwgJ2IpIHQgY29tcGFyZVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgIHZhbCBjb21wYXJlIDogJ2EgY29tcGFyZSAtPiAnYiBjb21wYXJlIC0+ICdjIGNvbXBhcmUgLT4gKCdhLCAnYiwgJ2MpIHQgY29tcGFyZVxuICBlbmRcbmVuZFxuXG5tb2R1bGUgRXF1YWwgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGVxdWFsIDogdCBlcXVhbFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGVxdWFsIDogJ2EgZXF1YWwgLT4gJ2EgdCBlcXVhbFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGVxdWFsIDogJ2EgZXF1YWwgLT4gJ2IgZXF1YWwgLT4gKCdhLCAnYikgdCBlcXVhbFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgIHZhbCBlcXVhbCA6ICdhIGVxdWFsIC0+ICdiIGVxdWFsIC0+ICdjIGVxdWFsIC0+ICgnYSwgJ2IsICdjKSB0IGVxdWFsXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBCdWlsdGluID0gc3RydWN0XG4gIGxldCBjb21wYXJlX2Jvb2wgOiBib29sIGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfY2hhciA6IGNoYXIgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9mbG9hdCA6IGZsb2F0IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfaW50IDogaW50IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfaW50MzIgOiBpbnQzMiBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX2ludDY0IDogaW50NjQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9zdHJpbmcgOiBzdHJpbmcgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV91bml0IDogdW5pdCBjb21wYXJlID0gUG9seS5jb21wYXJlXG5cbiAgbGV0IGNvbXBhcmVfYXJyYXkgY29tcGFyZV9lbHQgYSBiID1cbiAgICBpZiBwaHlzX2VxdWFsIGEgYlxuICAgIHRoZW4gMFxuICAgIGVsc2UgKFxuICAgICAgbGV0IGxlbl9hID0gQXJyYXkwLmxlbmd0aCBhIGluXG4gICAgICBsZXQgbGVuX2IgPSBBcnJheTAubGVuZ3RoIGIgaW5cbiAgICAgIGxldCByZXQgPSBjb21wYXJlIGxlbl9hIGxlbl9iIGluXG4gICAgICBpZiByZXQgPD4gMFxuICAgICAgdGhlbiByZXRcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICAgICAgaWYgaSA9IGxlbl9hXG4gICAgICAgICAgdGhlbiAwXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgbCA9IEFycmF5MC51bnNhZmVfZ2V0IGEgaVxuICAgICAgICAgICAgYW5kIHIgPSBBcnJheTAudW5zYWZlX2dldCBiIGkgaW5cbiAgICAgICAgICAgIGxldCByZXMgPSBjb21wYXJlX2VsdCBsIHIgaW5cbiAgICAgICAgICAgIGlmIHJlcyA8PiAwIHRoZW4gcmVzIGVsc2UgbG9vcCAoaSArIDEpKVxuICAgICAgICBpblxuICAgICAgICBsb29wIDApKVxuICA7O1xuXG4gIGxldCByZWMgY29tcGFyZV9saXN0IGNvbXBhcmVfZWx0IGEgYiA9XG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBbXSwgW10gLT4gMFxuICAgIHwgW10sIF8gLT4gLTFcbiAgICB8IF8sIFtdIC0+IDFcbiAgICB8IHggOjogeHMsIHkgOjogeXMgLT5cbiAgICAgIGxldCByZXMgPSBjb21wYXJlX2VsdCB4IHkgaW5cbiAgICAgIGlmIHJlcyA8PiAwIHRoZW4gcmVzIGVsc2UgY29tcGFyZV9saXN0IGNvbXBhcmVfZWx0IHhzIHlzXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfb3B0aW9uIGNvbXBhcmVfZWx0IGEgYiA9XG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBOb25lLCBOb25lIC0+IDBcbiAgICB8IE5vbmUsIFNvbWUgXyAtPiAtMVxuICAgIHwgU29tZSBfLCBOb25lIC0+IDFcbiAgICB8IFNvbWUgYSwgU29tZSBiIC0+IGNvbXBhcmVfZWx0IGEgYlxuICA7O1xuXG4gIGxldCBjb21wYXJlX3JlZiBjb21wYXJlX2VsdCBhIGIgPSBjb21wYXJlX2VsdCAhYSAhYlxuICBsZXQgZXF1YWxfYm9vbCA6IGJvb2wgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9jaGFyIDogY2hhciBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX2ludCA6IGludCBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX2ludDMyIDogaW50MzIgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9pbnQ2NCA6IGludDY0IGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfbmF0aXZlaW50IDogbmF0aXZlaW50IGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfc3RyaW5nIDogc3RyaW5nIGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfdW5pdCA6IHVuaXQgZXF1YWwgPSBQb2x5LmVxdWFsXG5cbiAgKCogW1BvbHkuZXF1YWxdIGlzIElFRUUgY29tcGxpYW50LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50IGhlcmUuICopXG4gIGxldCBlcXVhbF9mbG9hdCB4IHkgPSBlcXVhbF9pbnQgKGNvbXBhcmVfZmxvYXQgeCB5KSAwXG5cbiAgbGV0IGVxdWFsX2FycmF5IGVxdWFsX2VsdCBhIGIgPVxuICAgIHBoeXNfZXF1YWwgYSBiXG4gICAgfHxcbiAgICBsZXQgbGVuX2EgPSBBcnJheTAubGVuZ3RoIGEgaW5cbiAgICBsZXQgbGVuX2IgPSBBcnJheTAubGVuZ3RoIGIgaW5cbiAgICBlcXVhbCBsZW5fYSBsZW5fYlxuICAgICYmXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaSA9IGxlbl9hXG4gICAgICB8fFxuICAgICAgbGV0IGwgPSBBcnJheTAudW5zYWZlX2dldCBhIGlcbiAgICAgIGFuZCByID0gQXJyYXkwLnVuc2FmZV9nZXQgYiBpIGluXG4gICAgICBlcXVhbF9lbHQgbCByICYmIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG4gIDs7XG5cbiAgbGV0IHJlYyBlcXVhbF9saXN0IGVxdWFsX2VsdCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgW10sIFtdIC0+IHRydWVcbiAgICB8IFtdLCBfIHwgXywgW10gLT4gZmFsc2VcbiAgICB8IHggOjogeHMsIHkgOjogeXMgLT4gZXF1YWxfZWx0IHggeSAmJiBlcXVhbF9saXN0IGVxdWFsX2VsdCB4cyB5c1xuICA7O1xuXG4gIGxldCBlcXVhbF9vcHRpb24gZXF1YWxfZWx0IGEgYiA9XG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBOb25lLCBOb25lIC0+IHRydWVcbiAgICB8IE5vbmUsIFNvbWUgXyB8IFNvbWUgXywgTm9uZSAtPiBmYWxzZVxuICAgIHwgU29tZSBhLCBTb21lIGIgLT4gZXF1YWxfZWx0IGEgYlxuICA7O1xuXG4gIGxldCBlcXVhbF9yZWYgZXF1YWxfZWx0IGEgYiA9IGVxdWFsX2VsdCAhYSAhYlxuZW5kXG4iLCIoKiogVGhpcyBtb2R1bGUgaXMgZm9yIHVzZSBieSBwcHhfaGFzaCwgYW5kIGlzIHRodXMgbm90IGluIHRoZSBpbnRlcmZhY2Ugb2YgQmFzZS4gKilcbm1vZHVsZSBTdGQgPSBzdHJ1Y3RcbiAgbW9kdWxlIEhhc2ggPSBIYXNoICgqKiBAY2Fub25pY2FsIEJhc2UuSGFzaCAqKVxuZW5kXG5cbnR5cGUgJ2EgaGFzaF9mb2xkID0gU3RkLkhhc2guc3RhdGUgLT4gJ2EgLT4gU3RkLkhhc2guc3RhdGVcblxubW9kdWxlIEhhc2hhYmxlID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBoYXNoX2ZvbGRfdCA6IHQgaGFzaF9mb2xkXG4gICAgdmFsIGhhc2ggOiB0IC0+IFN0ZC5IYXNoLmhhc2hfdmFsdWVcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBoYXNoX2ZvbGRfdCA6ICdhIGhhc2hfZm9sZCAtPiAnYSB0IGhhc2hfZm9sZFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGhhc2hfZm9sZF90IDogJ2EgaGFzaF9mb2xkIC0+ICdiIGhhc2hfZm9sZCAtPiAoJ2EsICdiKSB0IGhhc2hfZm9sZFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgIHZhbCBoYXNoX2ZvbGRfdFxuICAgICAgOiAgJ2EgaGFzaF9mb2xkXG4gICAgICAtPiAnYiBoYXNoX2ZvbGRcbiAgICAgIC0+ICdjIGhhc2hfZm9sZFxuICAgICAgLT4gKCdhLCAnYiwgJ2MpIHQgaGFzaF9mb2xkXG4gIGVuZFxuZW5kXG4iLCJvcGVuIEhhc2guQnVpbHRpblxub3BlbiBQcHhfY29tcGFyZV9saWIuQnVpbHRpblxuaW5jbHVkZSBTZXhwbGliMC5TZXhwXG5cbigqKiBUeXBlIG9mIFMtZXhwcmVzc2lvbnMgKilcbnR5cGUgdCA9IFNleHBsaWIwLlNleHAudCA9XG4gIHwgQXRvbSBvZiBzdHJpbmdcbiAgfCBMaXN0IG9mIHQgbGlzdFxuW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbmxldCByZWMgY29tcGFyZSA9XG4gIChmdW4gYV9fMDAxXyBiX18wMDJfIC0+XG4gICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwMV8gYl9fMDAyX1xuICAgICB0aGVuIDBcbiAgICAgZWxzZSAoXG4gICAgICAgbWF0Y2ggYV9fMDAxXywgYl9fMDAyXyB3aXRoXG4gICAgICAgfCBBdG9tIF9hX18wMDNfLCBBdG9tIF9iX18wMDRfIC0+IGNvbXBhcmVfc3RyaW5nIF9hX18wMDNfIF9iX18wMDRfXG4gICAgICAgfCBBdG9tIF8sIF8gLT4gLTFcbiAgICAgICB8IF8sIEF0b20gXyAtPiAxXG4gICAgICAgfCBMaXN0IF9hX18wMDVfLCBMaXN0IF9iX18wMDZfIC0+IGNvbXBhcmVfbGlzdCBjb21wYXJlIF9hX18wMDVfIF9iX18wMDZfKVxuICAgICAgIDogdCAtPiB0IC0+IGludClcbjs7XG5cbmxldCByZWMgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gIChmdW4gaHN2IGFyZyAtPlxuICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICB8IEF0b20gX2EwIC0+XG4gICAgICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMCBpblxuICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICBoYXNoX2ZvbGRfc3RyaW5nIGhzdiBfYTBcbiAgICAgfCBMaXN0IF9hMCAtPlxuICAgICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDEgaW5cbiAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgaGFzaF9mb2xkX2xpc3QgaGFzaF9mb2xkX3QgaHN2IF9hMFxuICAgICAgIDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuXG5hbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gIGxldCBmdW5jIGFyZyA9XG4gICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICBoYXNoX2ZvbGRfdCBoc3YgYXJnKVxuICBpblxuICBmdW4geCAtPiBmdW5jIHhcbjs7XG5cbltAQEBlbmRdXG5cbmxldCB0X3NleHBfZ3JhbW1hciA9IFNleHBsaWIwLlNleHBfY29udi5zZXhwX3Rfc2V4cF9ncmFtbWFyXG5sZXQgb2Zfc3RyaW5nID0gKClcbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbnR5cGUgdCA9XG4gIHwgVzMyXG4gIHwgVzY0XG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxubGV0IHNleHBfb2ZfdCA9XG4gIChmdW5jdGlvblxuICAgIHwgVzMyIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlczMlwiXG4gICAgfCBXNjQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVzY0XCJcbiAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuOztcblxuW0BAQGVuZF1cblxubGV0IG51bV9iaXRzID0gZnVuY3Rpb25cbiAgfCBXMzIgLT4gMzJcbiAgfCBXNjQgLT4gNjRcbjs7XG5cbmxldCB3b3JkX3NpemUgPVxuICBtYXRjaCBTeXMud29yZF9zaXplX2luX2JpdHMgd2l0aFxuICB8IDMyIC0+IFczMlxuICB8IDY0IC0+IFc2NFxuICB8IF8gLT4gZmFpbHdpdGggXCJ1bmtub3duIHdvcmQgc2l6ZVwiXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbmxldCByID0gcmVmIFsgXCJCYXNlLlNleHAucHBfaHVtXCIgXVxubGV0IGFsbCAoKSA9ICFyXG5sZXQgcmVnaXN0ZXIgcCA9IHIgOj0gcCA6OiAhclxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgdFxuXG4gIHZhbCBwcCA6IEZvcm1hdHRlci50IC0+IHQgLT4gdW5pdFxuZW5kXG5cbm1vZHVsZSBSZWdpc3Rlcl9wcCAoTSA6IHNpZ1xuICAgIGluY2x1ZGUgU1xuXG4gICAgdmFsIG1vZHVsZV9uYW1lIDogc3RyaW5nXG4gIGVuZCkgPVxuc3RydWN0XG4gIGluY2x1ZGUgTVxuXG4gIGxldCAoKSA9IHJlZ2lzdGVyIChNLm1vZHVsZV9uYW1lIF4gXCIucHBcIilcbmVuZFxuXG5tb2R1bGUgUmVnaXN0ZXIgKE0gOiBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBtb2R1bGVfbmFtZSA6IHN0cmluZ1xuICAgIHZhbCB0b19zdHJpbmcgOiB0IC0+IHN0cmluZ1xuICBlbmQpID1cbiAgUmVnaXN0ZXJfcHAgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgbGV0IHBwIGZvcm1hdHRlciB0ID0gQ2FtbC5Gb3JtYXQucHBfcHJpbnRfc3RyaW5nIGZvcm1hdHRlciAoTS50b19zdHJpbmcgdClcbiAgZW5kKVxuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgdCA9IGV4biBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxubGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2V4biA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuXG5bQEBAZW5kXVxuXG5sZXQgZXhpdCA9IENhbWwuZXhpdFxuXG5leGNlcHRpb24gRmluYWxseSBvZiB0ICogdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxubGV0ICgpID1cbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEZpbmFsbHldIChmdW5jdGlvblxuICAgIHwgRmluYWxseSAoYXJnMF9fMDAxXywgYXJnMV9fMDAyXykgLT5cbiAgICAgIGxldCByZXMwX18wMDNfID0gc2V4cF9vZl90IGFyZzBfXzAwMV9cbiAgICAgIGFuZCByZXMxX18wMDRfID0gc2V4cF9vZl90IGFyZzFfXzAwMl8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImV4bi5tbC5GaW5hbGx5XCI7IHJlczBfXzAwM187IHJlczFfXzAwNF8gXVxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG47O1xuXG5bQEBAZW5kXVxuXG5leGNlcHRpb24gUmVyYWlzZWQgb2Ygc3RyaW5nICogdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxubGV0ICgpID1cbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFJlcmFpc2VkXSAoZnVuY3Rpb25cbiAgICB8IFJlcmFpc2VkIChhcmcwX18wMDVfLCBhcmcxX18wMDZfKSAtPlxuICAgICAgbGV0IHJlczBfXzAwN18gPSBzZXhwX29mX3N0cmluZyBhcmcwX18wMDVfXG4gICAgICBhbmQgcmVzMV9fMDA4XyA9IHNleHBfb2ZfdCBhcmcxX18wMDZfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJleG4ubWwuUmVyYWlzZWRcIjsgcmVzMF9fMDA3XzsgcmVzMV9fMDA4XyBdXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbjs7XG5cbltAQEBlbmRdXG5cbmV4Y2VwdGlvbiBTZXhwIG9mIFNleHAudFxuXG4oKiBXZSBpbnN0YWxsIGEgY3VzdG9tIGV4bi1jb252ZXJ0ZXIgcmF0aGVyIHRoYW4gdXNlOlxuXG4gICB7W1xuICAgICBleGNlcHRpb24gU2V4cCBvZiBTZXhwLnQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG4gICAgICgqIC4uLiAqKVxuICAgICBbQEBAZW5kXVxuICAgXX1cblxuICAgdG8gZWxpbWluYXRlIHRoZSBleHRyYSB3cmFwcGluZyBvZiBbKFNleHAgLi4uKV0uICopXG5sZXQgKCkgPVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGQgWyVleHRlbnNpb25fY29uc3RydWN0b3IgU2V4cF0gKGZ1bmN0aW9uXG4gICAgfCBTZXhwIHQgLT4gdFxuICAgIHwgXyAtPlxuICAgICAgKCogUmVhY2hpbmcgdGhpcyBicmFuY2ggaW5kaWNhdGVzIGEgYnVnIGluIHNleHBsaWIuICopXG4gICAgICBhc3NlcnQgZmFsc2UpXG47O1xuXG5sZXQgY3JlYXRlX3Mgc2V4cCA9IFNleHAgc2V4cFxuXG5sZXQgcmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UgdCBiYWNrdHJhY2UgPVxuICBDYW1sLlByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIHQgYmFja3RyYWNlXG47O1xuXG5leHRlcm5hbCBpc19waHlzX2VxdWFsX21vc3RfcmVjZW50IDogdCAtPiBib29sID0gXCJCYXNlX2NhbWxfZXhuX2lzX21vc3RfcmVjZW50X2V4blwiXG5cbmxldCByZXJhaXNlIGV4biBzdHIgPVxuICBsZXQgZXhuJyA9IFJlcmFpc2VkIChzdHIsIGV4bikgaW5cbiAgaWYgaXNfcGh5c19lcXVhbF9tb3N0X3JlY2VudCBleG5cbiAgdGhlbiAoXG4gICAgbGV0IGJ0ID0gQ2FtbC5QcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgIHJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIGV4bicgYnQpXG4gIGVsc2UgcmFpc2UgZXhuJ1xuOztcblxubGV0IHJlcmFpc2VmIGV4YyBmb3JtYXQgPSBQcmludGYua3NwcmludGYgKGZ1biBzdHIgKCkgLT4gcmVyYWlzZSBleGMgc3RyKSBmb3JtYXRcbmxldCB0b19zdHJpbmcgZXhjID0gU2V4cC50b19zdHJpbmdfaHVtIH5pbmRlbnQ6MiAoc2V4cF9vZl9leG4gZXhjKVxubGV0IHRvX3N0cmluZ19tYWNoIGV4YyA9IFNleHAudG9fc3RyaW5nX21hY2ggKHNleHBfb2ZfZXhuIGV4YylcbmxldCBzZXhwX29mX3QgPSBzZXhwX29mX2V4blxuXG5sZXQgcHJvdGVjdHggfmYgeCB+KGZpbmFsbHkgOiBfIC0+IHVuaXQpID1cbiAgbWF0Y2ggZiB4IHdpdGhcbiAgfCByZXMgLT5cbiAgICBmaW5hbGx5IHg7XG4gICAgcmVzXG4gIHwgZXhjZXB0aW9uIGV4biAtPlxuICAgIGxldCBidCA9IENhbWwuUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAobWF0Y2ggZmluYWxseSB4IHdpdGhcbiAgICAgfCAoKSAtPiByYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSBleG4gYnRcbiAgICAgfCBleGNlcHRpb24gZmluYWxfZXhuIC0+XG4gICAgICAgKCogVW5mb3J0dW5hdGVseSwgdGhlIGJhY2t0cmFjZSBvZiB0aGUgW2ZpbmFsX2V4bl0gaXMgZGlzY2FyZGVkIGhlcmUuICopXG4gICAgICAgcmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UgKEZpbmFsbHkgKGV4biwgZmluYWxfZXhuKSkgYnQpXG47O1xuXG5sZXQgcHJvdGVjdCB+ZiB+ZmluYWxseSA9IHByb3RlY3R4IH5mICgpIH5maW5hbGx5XG5cbmxldCBkb2VzX3JhaXNlICh0eXBlIGEpIChmIDogdW5pdCAtPiBhKSA9XG4gIHRyeVxuICAgIGlnbm9yZSAoZiAoKSA6IGEpO1xuICAgIGZhbHNlXG4gIHdpdGhcbiAgfCBfIC0+IHRydWVcbjs7XG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXJfcHAgKHN0cnVjdFxuICAgIHR5cGUgdCA9IGV4blxuXG4gICAgbGV0IHBwIHBwZiB0ID1cbiAgICAgIG1hdGNoIHNleHBfb2ZfZXhuX29wdCB0IHdpdGhcbiAgICAgIHwgU29tZSBzZXhwIC0+IFNleHAucHBfaHVtIHBwZiBzZXhwXG4gICAgICB8IE5vbmUgLT4gQ2FtbC5Gb3JtYXQucHBfcHJpbnRfc3RyaW5nIHBwZiAoQ2FtbC5QcmludGV4Yy50b19zdHJpbmcgdClcbiAgICA7O1xuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkV4blwiXG4gIGVuZClcblxubGV0IHByaW50X3dpdGhfYmFja3RyYWNlIGV4YyByYXdfYmFja3RyYWNlID1cbiAgQ2FtbC5Gb3JtYXQuZXByaW50ZiBcIkBbPDI+VW5jYXVnaHQgZXhjZXB0aW9uOkBcXG5AXFxuQFslYUBdQF1AXFxuQC5cIiBwcCBleGM7XG4gIGlmIENhbWwuUHJpbnRleGMuYmFja3RyYWNlX3N0YXR1cyAoKVxuICB0aGVuIENhbWwuUHJpbnRleGMucHJpbnRfcmF3X2JhY2t0cmFjZSBDYW1sLnN0ZGVyciByYXdfYmFja3RyYWNlO1xuICBDYW1sLmZsdXNoIENhbWwuc3RkZXJyXG47O1xuXG5sZXQgc2V0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyICgpID1cbiAgQ2FtbC5QcmludGV4Yy5zZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgcHJpbnRfd2l0aF9iYWNrdHJhY2Vcbjs7XG5cbmxldCBoYW5kbGVfdW5jYXVnaHRfYXV4IH5kb19hdF9leGl0IH5leGl0IGYgPVxuICB0cnkgZiAoKSB3aXRoXG4gIHwgZXhjIC0+XG4gICAgbGV0IHJhd19iYWNrdHJhY2UgPSBDYW1sLlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgKCogT25lIHJlYXNvbiB0byBydW4gW2RvX2F0X2V4aXRdIGhhbmRsZXJzIGJlZm9yZSBwcmludGluZyBvdXQgdGhlIGVycm9yIG1lc3NhZ2UgaXNcbiAgICAgICB0aGF0IGl0IGhlbHBzIGN1cnNlcyBhcHBsaWNhdGlvbnMgYnJpbmcgdGhlIHRlcm1pbmFsIGluIGEgZ29vZCBzdGF0ZSwgb3RoZXJ3aXNlIHRoZVxuICAgICAgIGVycm9yIG1lc3NhZ2UgbWlnaHQgZ2V0IGNvcnJ1cHRlZC4gIEFsc28sIHRoZSBPQ2FtbCB0b3AtbGV2ZWwgdW5jYXVnaHQgZXhjZXB0aW9uXG4gICAgICAgaGFuZGxlciBkb2VzIHRoZSBzYW1lLiAqKVxuICAgIGlmIGRvX2F0X2V4aXRcbiAgICB0aGVuIChcbiAgICAgIHRyeSBDYW1sLmRvX2F0X2V4aXQgKCkgd2l0aFxuICAgICAgfCBfIC0+ICgpKTtcbiAgICAodHJ5IHByaW50X3dpdGhfYmFja3RyYWNlIGV4YyByYXdfYmFja3RyYWNlIHdpdGhcbiAgICAgfCBfIC0+XG4gICAgICAgKHRyeVxuICAgICAgICAgIENhbWwuUHJpbnRmLmVwcmludGYgXCJFeG4uaGFuZGxlX3VuY2F1Z2h0IGNvdWxkIG5vdCBwcmludDsgZXhpdGluZyBhbnl3YXlcXG4lIVwiXG4gICAgICAgIHdpdGhcbiAgICAgICAgfCBfIC0+ICgpKSk7XG4gICAgZXhpdCAxXG47O1xuXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2FuZF9leGl0IGYgPSBoYW5kbGVfdW5jYXVnaHRfYXV4IGYgfmV4aXQgfmRvX2F0X2V4aXQ6dHJ1ZVxuXG5sZXQgaGFuZGxlX3VuY2F1Z2h0IH5leGl0Om11c3RfZXhpdCBmID1cbiAgaGFuZGxlX3VuY2F1Z2h0X2F1eCBmIH5leGl0OihpZiBtdXN0X2V4aXQgdGhlbiBleGl0IGVsc2UgaWdub3JlKSB+ZG9fYXRfZXhpdDptdXN0X2V4aXRcbjs7XG5cbmxldCByZXJhaXNlX3VuY2F1Z2h0IHN0ciBmdW5jID1cbiAgdHJ5IGZ1bmMgKCkgd2l0aFxuICB8IGV4biAtPlxuICAgIGxldCBidCA9IENhbWwuUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICByYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSAoUmVyYWlzZWQgKHN0ciwgZXhuKSkgYnRcbjs7XG5cbmV4dGVybmFsIGNsZWFyX2JhY2t0cmFjZSA6IHVuaXQgLT4gdW5pdCA9IFwiQmFzZV9jbGVhcl9jYW1sX2JhY2t0cmFjZV9wb3NcIiBbQEBub2FsbG9jXVxuXG5sZXQgcmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgZSA9XG4gICgqIFdlIGNsZWFyIHRoZSBiYWNrdHJhY2UgdG8gcmVkdWNlIGNvbmZ1c2lvbiwgc28gdGhhdCBwZW9wbGUgZG9uJ3QgdGhpbmsgd2hhdGV2ZXJcbiAgICAgaXMgc3RvcmVkIGNvcnJlc3BvbmRzIHRvIHRoaXMgcmFpc2UuICopXG4gIGNsZWFyX2JhY2t0cmFjZSAoKTtcbiAgQ2FtbC5yYWlzZV9ub3RyYWNlIGVcbjs7XG5cbmxldCBpbml0aWFsaXplX21vZHVsZSAoKSA9IHNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciAoKVxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBsZXQgY2xlYXJfYmFja3RyYWNlID0gY2xlYXJfYmFja3RyYWNlXG5lbmRcbiIsIigqIGJlbG9uZ3MgaW4gQ29tbW9uLCBidXQgbW92ZWQgaGVyZSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMgKilcblxub3BlbiEgSW1wb3J0XG5cbnR5cGUgJ2EgcmV0dXJuID0geyByZXR1cm4gOiAnYi4gJ2EgLT4gJ2IgfSBbQEB1bmJveGVkXVxuXG5sZXQgd2l0aF9yZXR1cm4gKHR5cGUgYSkgZiA9XG4gIGxldCBtb2R1bGUgTSA9IHN0cnVjdFxuICAgICgqIFJhaXNlZCB0byBpbmRpY2F0ZSB+cmV0dXJuIHdhcyBjYWxsZWQuICBMb2NhbCBzbyB0aGF0IHRoZSBleGNlcHRpb24gaXMgdGllZCB0byBhXG4gICAgICAgcGFydGljdWxhciBjYWxsIG9mIFt3aXRoX3JldHVybl0uICopXG4gICAgZXhjZXB0aW9uIFJldHVybiBvZiBhXG4gIGVuZFxuICBpblxuICBsZXQgaXNfYWxpdmUgPSByZWYgdHJ1ZSBpblxuICBsZXQgcmV0dXJuIGEgPVxuICAgIGlmIG5vdCAhaXNfYWxpdmVcbiAgICB0aGVuIGZhaWx3aXRoIFwidXNlIG9mIFtyZXR1cm5dIGZyb20gYSBbd2l0aF9yZXR1cm5dIHRoYXQgYWxyZWFkeSByZXR1cm5lZFwiO1xuICAgIEV4bi5yYWlzZV93aXRob3V0X2JhY2t0cmFjZSAoTS5SZXR1cm4gYSlcbiAgaW5cbiAgdHJ5XG4gICAgbGV0IGEgPSBmIHsgcmV0dXJuIH0gaW5cbiAgICBpc19hbGl2ZSA6PSBmYWxzZTtcbiAgICBhXG4gIHdpdGhcbiAgfCBleG4gLT5cbiAgICBpc19hbGl2ZSA6PSBmYWxzZTtcbiAgICAobWF0Y2ggZXhuIHdpdGhcbiAgICAgfCBNLlJldHVybiBhIC0+IGFcbiAgICAgfCBfIC0+IHJhaXNlIGV4bilcbjs7XG5cbmxldCB3aXRoX3JldHVybl9vcHRpb24gZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gcmV0dXJuIC0+XG4gICAgZiB7IHJldHVybiA9IChmdW4gYSAtPiByZXR1cm4ucmV0dXJuIChTb21lIGEpKSB9O1xuICAgIE5vbmUpXG47O1xuXG5sZXQgcHJlcGVuZCB7IHJldHVybiB9IH5mID0geyByZXR1cm4gPSAoZnVuIHggLT4gcmV0dXJuIChmIHgpKSB9XG4iLCJvcGVuISBJbXBvcnRcblxubW9kdWxlIHR5cGUgQmFzaWMgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGJpbmQgOiAnYSB0IC0+IGY6KCdhIC0+ICdiIHQpIC0+ICdiIHRcbiAgdmFsIHJldHVybiA6ICdhIC0+ICdhIHRcblxuICAoKiogVGhlIGZvbGxvd2luZyBpZGVudGl0aWVzIG91Z2h0IHRvIGhvbGQgKGZvciBzb21lIHZhbHVlIG9mID0pOlxuXG4gICAgICAtIFtyZXR1cm4geCA+Pj0gZiA9IGYgeF1cbiAgICAgIC0gW3QgPj49IGZ1biB4IC0+IHJldHVybiB4ID0gdF1cbiAgICAgIC0gWyh0ID4+PSBmKSA+Pj0gZyA9IHQgPj49IGZ1biB4IC0+IChmIHggPj49IGcpXVxuXG4gICAgICBOb3RlOiBbPj49XSBpcyB0aGUgaW5maXggbm90YXRpb24gZm9yIFtiaW5kXSkgKilcblxuICAoKiogVGhlIFttYXBdIGFyZ3VtZW50IHRvIFtNb25hZC5NYWtlXSBzYXlzIGhvdyB0byBpbXBsZW1lbnQgdGhlIG1vbmFkJ3MgW21hcF0gZnVuY3Rpb24uXG4gICAgICBbYERlZmluZV91c2luZ19iaW5kXSBtZWFucyB0byBkZWZpbmUgW21hcCB0IH5mID0gYmluZCB0IH5mOihmdW4gYSAtPiByZXR1cm4gKGYgYSkpXS5cbiAgICAgIFtgQ3VzdG9tXSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHByZXN1bWFibHkgd2l0aCBzb21ldGhpbmcgbW9yZVxuICAgICAgZWZmaWNpZW50LlxuXG4gICAgICBTb21lIG90aGVyIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBbTW9uYWQuTWFrZV0gYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgW21hcF0sIHNvXG4gICAgICBwYXNzaW5nIGluIGEgbW9yZSBlZmZpY2llbnQgW21hcF0gd2lsbCBpbXByb3ZlIHRoZWlyIGVmZmljaWVuY3kgYXMgd2VsbC4gKilcbiAgdmFsIG1hcCA6IFsgYERlZmluZV91c2luZ19iaW5kIHwgYEN1c3RvbSBvZiAnYSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAnYiB0IF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmZpeCA9IHNpZ1xuICB0eXBlICdhIHRcblxuICAoKiogW3QgPj49IGZdIHJldHVybnMgYSBjb21wdXRhdGlvbiB0aGF0IHNlcXVlbmNlcyB0aGUgY29tcHV0YXRpb25zIHJlcHJlc2VudGVkIGJ5IHR3b1xuICAgICAgbW9uYWQgZWxlbWVudHMuICBUaGUgcmVzdWx0aW5nIGNvbXB1dGF0aW9uIGZpcnN0IGRvZXMgW3RdIHRvIHlpZWxkIGEgdmFsdWUgW3ZdLCBhbmRcbiAgICAgIHRoZW4gcnVucyB0aGUgY29tcHV0YXRpb24gcmV0dXJuZWQgYnkgW2Ygdl0uICopXG4gIHZhbCAoID4+PSApIDogJ2EgdCAtPiAoJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuXG4gICgqKiBbdCA+PnwgZl0gaXMgW3QgPj49IChmdW4gYSAtPiByZXR1cm4gKGYgYSkpXS4gKilcbiAgdmFsICggPj58ICkgOiAnYSB0IC0+ICgnYSAtPiAnYikgLT4gJ2IgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFN5bnRheCA9IHNpZ1xuICAoKiogT3BlbmluZyBhIG1vZHVsZSBvZiB0aGlzIHR5cGUgYWxsb3dzIG9uZSB0byB1c2UgdGhlIFslYmluZF0gYW5kIFslbWFwXSBzeW50YXhcbiAgICAgIGV4dGVuc2lvbnMgZGVmaW5lZCBieSBwcHhfbGV0LCBhbmQgYnJpbmdzIFtyZXR1cm5dIGludG8gc2NvcGUuICopXG5cbiAgdHlwZSAnYSB0XG5cbiAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICAoKiogVGhlc2UgYXJlIGNvbnZlbmllbnQgdG8gaGF2ZSBpbiBzY29wZSB3aGVuIHByb2dyYW1taW5nIHdpdGggYSBtb25hZDogKilcblxuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG5cbiAgICBpbmNsdWRlIEluZml4IHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuICAgICAgdmFsIGJpbmQgOiAnYSB0IC0+IGY6KCdhIC0+ICdiIHQpIC0+ICdiIHRcbiAgICAgIHZhbCBtYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAnYiB0XG4gICAgICB2YWwgYm90aCA6ICdhIHQgLT4gJ2IgdCAtPiAoJ2EgKiAnYikgdFxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgOiBzaWcgZW5kXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfd2l0aG91dF9zeW50YXggPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgaW5jbHVkZSBJbmZpeCB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIG1vZHVsZSBNb25hZF9pbmZpeCA6IEluZml4IHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcblxuICAoKiogW2JpbmQgdCB+Zl0gPSBbdCA+Pj0gZl0gKilcbiAgdmFsIGJpbmQgOiAnYSB0IC0+IGY6KCdhIC0+ICdiIHQpIC0+ICdiIHRcblxuICAoKiogW3JldHVybiB2XSByZXR1cm5zIHRoZSAodHJpdmlhbCkgY29tcHV0YXRpb24gdGhhdCByZXR1cm5zIHYuICopXG4gIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG5cbiAgKCoqIFttYXAgdCB+Zl0gaXMgdCA+PnwgZi4gKilcbiAgdmFsIG1hcCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICdiIHRcblxuICAoKiogW2pvaW4gdF0gaXMgW3QgPj49IChmdW4gdCcgLT4gdCcpXS4gKilcbiAgdmFsIGpvaW4gOiAnYSB0IHQgLT4gJ2EgdFxuXG4gICgqKiBbaWdub3JlX20gdF0gaXMgW21hcCB0IH5mOihmdW4gXyAtPiAoKSldLiAgW2lnbm9yZV9tXSB1c2VkIHRvIGJlIGNhbGxlZCBbaWdub3JlXSxcbiAgICAgIGJ1dCB3ZSBkZWNpZGVkIHRoYXQgd2FzIGEgYmFkIG5hbWUsIGJlY2F1c2UgaXQgc2hhZG93ZWQgdGhlIHdpZGVseSB1c2VkXG4gICAgICBbQ2FtbC5pZ25vcmVdLiAgU29tZSBtb25hZHMgc3RpbGwgZG8gW2xldCBpZ25vcmUgPSBpZ25vcmVfbV0gZm9yIGhpc3RvcmljYWxcbiAgICAgIHJlYXNvbnMuICopXG4gIHZhbCBpZ25vcmVfbSA6ICdhIHQgLT4gdW5pdCB0XG5cbiAgdmFsIGFsbCA6ICdhIHQgbGlzdCAtPiAnYSBsaXN0IHRcblxuICAoKiogTGlrZSBbYWxsXSwgYnV0IGVuc3VyZXMgdGhhdCBldmVyeSBtb25hZGljIHZhbHVlIGluIHRoZSBsaXN0IHByb2R1Y2VzIGEgdW5pdCB2YWx1ZSxcbiAgICAgIGFsbCBvZiB3aGljaCBhcmUgZGlzY2FyZGVkIHJhdGhlciB0aGFuIGJlaW5nIGNvbGxlY3RlZCBpbnRvIGEgbGlzdC4gKilcbiAgdmFsIGFsbF91bml0IDogdW5pdCB0IGxpc3QgLT4gdW5pdCB0XG5lbmRcblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB0eXBlICdhIHRcblxuICBpbmNsdWRlIFNfd2l0aG91dF9zeW50YXggd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBpbmNsdWRlIFN5bnRheCB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQmFzaWMyID0gc2lnXG4gICgqKiBNdWx0aSBwYXJhbWV0ZXIgbW9uYWQuIFRoZSBzZWNvbmQgcGFyYW1ldGVyIGdldHMgdW5pZmllZCBhY3Jvc3MgYWxsIHRoZSBjb21wdXRhdGlvbi5cbiAgICAgIFRoaXMgaXMgdXNlZCB0byBlbmNvZGUgbW9uYWRzIHdvcmtpbmcgb24gYSBtdWx0aSBwYXJhbWV0ZXIgZGF0YSBzdHJ1Y3R1cmUgbGlrZVxuICAgICAgKFsoJ2EsJ2IpIHJlc3VsdF0pLiAqKVxuXG4gIHR5cGUgKCdhLCAnZSkgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdlKSB0KSAtPiAoJ2IsICdlKSB0XG4gIHZhbCBtYXAgOiBbIGBEZWZpbmVfdXNpbmdfYmluZCB8IGBDdXN0b20gb2YgKCdhLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZSkgdCBdXG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8pIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmZpeDIgPSBzaWdcbiAgKCoqIFNhbWUgYXMgeyFJbmZpeH0sIGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdHdvIGFyZ3VtZW50cy4gVGhlIHNlY29uZCBpcyBhbHdheXMganVzdFxuICAgICAgcGFzc2VkIHRocm91Z2guICopXG5cbiAgdHlwZSAoJ2EsICdlKSB0XG5cbiAgdmFsICggPj49ICkgOiAoJ2EsICdlKSB0IC0+ICgnYSAtPiAoJ2IsICdlKSB0KSAtPiAoJ2IsICdlKSB0XG4gIHZhbCAoID4+fCApIDogKCdhLCAnZSkgdCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYiwgJ2UpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTeW50YXgyID0gc2lnXG4gIHR5cGUgKCdhLCAnZSkgdFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXykgdFxuXG4gICAgaW5jbHVkZSBJbmZpeDIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgdFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8pIHRcbiAgICAgIHZhbCBiaW5kIDogKCdhLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdlKSB0KSAtPiAoJ2IsICdlKSB0XG4gICAgICB2YWwgbWFwIDogKCdhLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZSkgdFxuICAgICAgdmFsIGJvdGggOiAoJ2EsICdlKSB0IC0+ICgnYiwgJ2UpIHQgLT4gKCdhICogJ2IsICdlKSB0XG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA6IHNpZyBlbmRcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxubW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgKCoqIFRoZSBzYW1lIGFzIHshU30gZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0d28gYXJndW1lbnRzLiBUaGUgc2Vjb25kIGlzIGFsd2F5cyBqdXN0XG4gICAgICBwYXNzZWQgdGhyb3VnaC4gKilcblxuICB0eXBlICgnYSwgJ2UpIHRcblxuICBpbmNsdWRlIEluZml4MiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSB0XG4gIGluY2x1ZGUgU3ludGF4MiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSB0XG4gIG1vZHVsZSBNb25hZF9pbmZpeCA6IEluZml4MiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2UpIHQpIC0+ICgnYiwgJ2UpIHRcbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXykgdFxuICB2YWwgbWFwIDogKCdhLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZSkgdFxuICB2YWwgam9pbiA6ICgoJ2EsICdlKSB0LCAnZSkgdCAtPiAoJ2EsICdlKSB0XG4gIHZhbCBpZ25vcmVfbSA6IChfLCAnZSkgdCAtPiAodW5pdCwgJ2UpIHRcbiAgdmFsIGFsbCA6ICgnYSwgJ2UpIHQgbGlzdCAtPiAoJ2EgbGlzdCwgJ2UpIHRcbiAgdmFsIGFsbF91bml0IDogKHVuaXQsICdlKSB0IGxpc3QgLT4gKHVuaXQsICdlKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQmFzaWMzID0gc2lnXG4gICgqKiBNdWx0aSBwYXJhbWV0ZXIgbW9uYWQuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIHBhcmFtZXRlcnMgZ2V0IHVuaWZpZWQgYWNyb3NzIGFsbCB0aGVcbiAgICAgIGNvbXB1dGF0aW9uLiAqKVxuXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2QsICdlKSB0KSAtPiAoJ2IsICdkLCAnZSkgdFxuXG4gIHZhbCBtYXBcbiAgICA6IFsgYERlZmluZV91c2luZ19iaW5kIHwgYEN1c3RvbSBvZiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZCwgJ2UpIHQgXVxuXG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8sIF8pIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmZpeDMgPSBzaWdcbiAgKCoqIFNhbWUgYXMgSW5maXgsIGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdGhyZWUgYXJndW1lbnRzLiBUaGUgc2Vjb25kIGFuZCB0aGlyZCBhcmVcbiAgICAgIGFsd2F5cyBqdXN0IHBhc3NlZCB0aHJvdWdoLiAqKVxuXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHRcblxuICB2YWwgKCA+Pj0gKSA6ICgnYSwgJ2QsICdlKSB0IC0+ICgnYSAtPiAoJ2IsICdkLCAnZSkgdCkgLT4gKCdiLCAnZCwgJ2UpIHRcbiAgdmFsICggPj58ICkgOiAoJ2EsICdkLCAnZSkgdCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYiwgJ2QsICdlKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU3ludGF4MyA9IHNpZ1xuICB0eXBlICgnYSwgJ2QsICdlKSB0XG5cbiAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfLCBfKSB0XG5cbiAgICBpbmNsdWRlIEluZml4MyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIHRcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfLCBfKSB0XG4gICAgICB2YWwgYmluZCA6ICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2QsICdlKSB0KSAtPiAoJ2IsICdkLCAnZSkgdFxuICAgICAgdmFsIG1hcCA6ICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdkLCAnZSkgdFxuICAgICAgdmFsIGJvdGggOiAoJ2EsICdkLCAnZSkgdCAtPiAoJ2IsICdkLCAnZSkgdCAtPiAoJ2EgKiAnYiwgJ2QsICdlKSB0XG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA6IHNpZyBlbmRcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxubW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgKCoqIFRoZSBzYW1lIGFzIHshU30gZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0aHJlZSBhcmd1bWVudHMuIFRoZSBzZWNvbmRcbiAgICAgIGFuZCB0aGlyZCBhcmUgYWx3YXlzIGp1c3QgcGFzc2VkIHRocm91Z2guICopXG5cbiAgdHlwZSAoJ2EsICdkLCAnZSkgdFxuXG4gIGluY2x1ZGUgSW5maXgzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgdFxuICBpbmNsdWRlIFN5bnRheDMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSB0XG4gIG1vZHVsZSBNb25hZF9pbmZpeCA6IEluZml4MyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2QsICdlKSB0KSAtPiAoJ2IsICdkLCAnZSkgdFxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfLCBfKSB0XG4gIHZhbCBtYXAgOiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZCwgJ2UpIHRcbiAgdmFsIGpvaW4gOiAoKCdhLCAnZCwgJ2UpIHQsICdkLCAnZSkgdCAtPiAoJ2EsICdkLCAnZSkgdFxuICB2YWwgaWdub3JlX20gOiAoXywgJ2QsICdlKSB0IC0+ICh1bml0LCAnZCwgJ2UpIHRcbiAgdmFsIGFsbCA6ICgnYSwgJ2QsICdlKSB0IGxpc3QgLT4gKCdhIGxpc3QsICdkLCAnZSkgdFxuICB2YWwgYWxsX3VuaXQgOiAodW5pdCwgJ2QsICdlKSB0IGxpc3QgLT4gKHVuaXQsICdkLCAnZSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEJhc2ljX2luZGV4ZWQgPSBzaWdcbiAgKCoqIEluZGV4ZWQgbW9uYWQsIGluIHRoZSBzdHlsZSBvZiBBdGtleS4gVGhlIHNlY29uZCBhbmQgdGhpcmQgcGFyYW1ldGVycyBhcmUgY29tcG9zZWRcbiAgICAgIGFjcm9zcyBhbGwgY29tcHV0YXRpb24uIFRvIHNlZSB0aGlzIG1vcmUgY2xlYXJseSwgeW91IGNhbiBsb29rIGF0IHRoZSB0eXBlIG9mIGJpbmQ6XG5cbiAgICAgIHtbXG4gICAgICAgIHZhbCBiaW5kIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2spIHQpIC0+ICgnYiwgJ2ksICdrKSB0XG4gICAgICBdfVxuXG4gICAgICBhbmQgaXNvbGF0ZSBzb21lIG9mIHRoZSB0eXBlIHZhcmlhYmxlcyB0byBzZWUgdGhlaXIgaW5kaXZpZHVhbCBiZWhhdmlvcnM6XG5cbiAgICAgIHtbXG4gICAgICAgIHZhbCBiaW5kIDogJ2EgICAgICAgICAgICAgLT4gZjooJ2EgLT4gICdiICAgICAgICAgICApIC0+ICAnYlxuICAgICAgICB2YWwgYmluZCA6ICAgICAgJ2ksICdqICAgIC0+ICAgICAgICAgICAgICAgJ2osICdrICAgICAtPiAgICAgJ2ksICdrXG4gICAgICBdfVxuXG4gICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBBdGtleS1zdHlsZSBpbmRleGVkIG1vbmFkcywgc2VlOlxuXG4gICAgICB7dlxuICAgICAgICBQYXJhbWV0ZXJpc2VkIE5vdGlvbnMgb2YgQ29tcHV0YXRpb25cbiAgICAgICAgUm9iZXJ0IEF0a2V5XG4gICAgICAgIGh0dHA6Ly9iZW50bmliLm9yZy9wYXJhbW5vdGlvbnMtamZwLnBkZlxuICAgICAgdn0gKilcblxuICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAoJ2IsICdqLCAnaykgdCkgLT4gKCdiLCAnaSwgJ2spIHRcblxuICB2YWwgbWFwXG4gICAgOiBbIGBEZWZpbmVfdXNpbmdfYmluZCB8IGBDdXN0b20gb2YgKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqKSB0IF1cblxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2kpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmZpeF9pbmRleGVkID0gc2lnXG4gICgqKiBTYW1lIGFzIHshSW5maXh9LCBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHRocmVlIGFyZ3VtZW50cy4gVGhlIHNlY29uZCBhbmRcbiAgICAgIHRoaXJkIGFyZSBjb21wb3NlZCBhY3Jvc3MgYWxsIGNvbXB1dGF0aW9uLiAqKVxuXG4gIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICB2YWwgKCA+Pj0gKSA6ICgnYSwgJ2ksICdqKSB0IC0+ICgnYSAtPiAoJ2IsICdqLCAnaykgdCkgLT4gKCdiLCAnaSwgJ2spIHRcbiAgdmFsICggPj58ICkgOiAoJ2EsICdpLCAnaikgdCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU3ludGF4X2luZGV4ZWQgPSBzaWdcbiAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpKSB0XG5cbiAgICBpbmNsdWRlIEluZml4X2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSB0XG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpKSB0XG4gICAgICB2YWwgYmluZCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrKSB0KSAtPiAoJ2IsICdpLCAnaykgdFxuICAgICAgdmFsIG1hcCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaikgdFxuICAgICAgdmFsIGJvdGggOiAoJ2EsICdpLCAnaikgdCAtPiAoJ2IsICdqLCAnaykgdCAtPiAoJ2EgKiAnYiwgJ2ksICdrKSB0XG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA6IHNpZyBlbmRcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxubW9kdWxlIHR5cGUgU19pbmRleGVkID0gc2lnXG4gICgqKiBUaGUgc2FtZSBhcyB7IVN9IGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdGhyZWUgYXJndW1lbnRzLiBUaGUgc2Vjb25kIGFuZFxuICAgICAgdGhpcmQgYXJlIGNvbXBvc2VkIGFjcm9zcyBhbGwgY29tcHV0YXRpb24uICopXG5cbiAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gIGluY2x1ZGUgSW5maXhfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIHRcbiAgaW5jbHVkZSBTeW50YXhfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIHRcbiAgbW9kdWxlIE1vbmFkX2luZml4IDogSW5maXhfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrKSB0KSAtPiAoJ2IsICdpLCAnaykgdFxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2kpIHRcbiAgdmFsIG1hcCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaikgdFxuICB2YWwgam9pbiA6ICgoJ2EsICdqLCAnaykgdCwgJ2ksICdqKSB0IC0+ICgnYSwgJ2ksICdrKSB0XG4gIHZhbCBpZ25vcmVfbSA6IChfLCAnaSwgJ2opIHQgLT4gKHVuaXQsICdpLCAnaikgdFxuICB2YWwgYWxsIDogKCdhLCAnaSwgJ2kpIHQgbGlzdCAtPiAoJ2EgbGlzdCwgJ2ksICdpKSB0XG4gIHZhbCBhbGxfdW5pdCA6ICh1bml0LCAnaSwgJ2kpIHQgbGlzdCAtPiAodW5pdCwgJ2ksICdpKSB0XG5lbmRcblxubW9kdWxlIFNfdG9fUzIgKFggOiBTKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudFxuZW5kXG5cbm1vZHVsZSBTMl90b19TMyAoWCA6IFMyKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50XG5lbmRcblxubW9kdWxlIFNfdG9fU19pbmRleGVkIChYIDogUykgOiBTX2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0ID0gJ2EgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnaSwgJ2opIHQgPSAnYSBYLnRcbmVuZFxuXG5tb2R1bGUgUzJfdG9fUyAoWCA6IFMyKSA6IFMgd2l0aCB0eXBlICdhIHQgPSAoJ2EsIHVuaXQpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICdhIHQgPSAoJ2EsIHVuaXQpIFgudFxuZW5kXG5cbm1vZHVsZSBTM190b19TMiAoWCA6IFMzKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSwgdW5pdCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UsIHVuaXQpIFgudFxuZW5kXG5cbm1vZHVsZSBTX2luZGV4ZWRfdG9fUzIgKFggOiBTX2luZGV4ZWQpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlLCAnZSkgWC50ID1cbnN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlLCAnZSkgWC50XG5lbmRcblxubW9kdWxlIHR5cGUgTW9uYWQgPSBzaWdcbiAgKCoqIEEgbW9uYWQgaXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlIGNvbmNlcHQgb2Ygc2VxdWVuY2luZyBvZiBjb21wdXRhdGlvbnMuICBBIHZhbHVlIG9mXG4gICAgICB0eXBlIFsnYSBtb25hZF0gcmVwcmVzZW50cyBhIGNvbXB1dGF0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlIG9mIHR5cGUgWydhXS4gKilcblxuICBtb2R1bGUgdHlwZSBCYXNpYyA9IEJhc2ljXG4gIG1vZHVsZSB0eXBlIEJhc2ljMiA9IEJhc2ljMlxuICBtb2R1bGUgdHlwZSBCYXNpYzMgPSBCYXNpYzNcbiAgbW9kdWxlIHR5cGUgQmFzaWNfaW5kZXhlZCA9IEJhc2ljX2luZGV4ZWRcbiAgbW9kdWxlIHR5cGUgSW5maXggPSBJbmZpeFxuICBtb2R1bGUgdHlwZSBJbmZpeDIgPSBJbmZpeDJcbiAgbW9kdWxlIHR5cGUgSW5maXgzID0gSW5maXgzXG4gIG1vZHVsZSB0eXBlIEluZml4X2luZGV4ZWQgPSBJbmZpeF9pbmRleGVkXG4gIG1vZHVsZSB0eXBlIFN5bnRheCA9IFN5bnRheFxuICBtb2R1bGUgdHlwZSBTeW50YXgyID0gU3ludGF4MlxuICBtb2R1bGUgdHlwZSBTeW50YXgzID0gU3ludGF4M1xuICBtb2R1bGUgdHlwZSBTeW50YXhfaW5kZXhlZCA9IFN5bnRheF9pbmRleGVkXG4gIG1vZHVsZSB0eXBlIFNfd2l0aG91dF9zeW50YXggPSBTX3dpdGhvdXRfc3ludGF4XG4gIG1vZHVsZSB0eXBlIFMgPSBTXG4gIG1vZHVsZSB0eXBlIFMyID0gUzJcbiAgbW9kdWxlIHR5cGUgUzMgPSBTM1xuICBtb2R1bGUgdHlwZSBTX2luZGV4ZWQgPSBTX2luZGV4ZWRcblxuICBtb2R1bGUgTWFrZSAoWCA6IEJhc2ljKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgWC50XG4gIG1vZHVsZSBNYWtlMiAoWCA6IEJhc2ljMikgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSBYLnRcbiAgbW9kdWxlIE1ha2UzIChYIDogQmFzaWMzKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgWC50XG5cbiAgbW9kdWxlIE1ha2VfaW5kZXhlZCAoWCA6IEJhc2ljX2luZGV4ZWQpIDpcbiAgICBTX2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSBYLnRcblxuICAoKiogRGVmaW5lIGEgbW9uYWQgdGhyb3VnaCBhbiBpc29tb3JwaGlzbSB3aXRoIGFuIGV4aXN0aW5nIG1vbmFkLiBGb3IgZXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSAnYSB0ID0geyB2YWx1ZSA6ICdhIH1cblxuICAgICAgICBpbmNsdWRlIE1vbmFkLk9mX21vbmFkIChNb25hZC5JZGVudCkgKHN0cnVjdFxuICAgICAgICAgICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgICAgICAgICAgbGV0IHRvX21vbmFkIHsgdmFsdWUgfSA9IHZhbHVlXG4gICAgICAgICAgICBsZXQgb2ZfbW9uYWQgdmFsdWUgPSB7IHZhbHVlIH1cbiAgICAgICAgICBlbmQpXG4gICAgICBdfSAqKVxuICBtb2R1bGUgT2ZfbW9uYWRcbiAgICAgIChNb25hZCA6IFMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICB0eXBlICdhIHRcblxuICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogJ2EgdCAtPiAnYSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAnYSBNb25hZC50IC0+ICdhIHRcbiAgICAgICAgICAgICAgICAgICBlbmQpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBNLnRcblxuICBtb2R1bGUgT2ZfbW9uYWQyXG4gICAgICAoTW9uYWQgOiBTMikgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2IpIE1vbmFkLnQgLT4gKCdhLCAnYikgdFxuICAgICAgICAgICAgICAgICAgICBlbmQpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgTS50XG5cbiAgbW9kdWxlIE9mX21vbmFkM1xuICAgICAgKE1vbmFkIDogUzMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdiLCAnYykgTW9uYWQudCAtPiAoJ2EsICdiLCAnYykgdFxuICAgICAgICAgICAgICAgICAgICBlbmQpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSBNLnRcblxuICBtb2R1bGUgT2ZfbW9uYWRfaW5kZXhlZFxuICAgICAgKE1vbmFkIDogU19pbmRleGVkKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnaSwgJ2opIHQgLT4gKCdhLCAnaSwgJ2opIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnaSwgJ2opIE1vbmFkLnQgLT4gKCdhLCAnaSwgJ2opIHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTX2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSBNLnRcblxuICBtb2R1bGUgSWRlbnQgOiBTIHdpdGggdHlwZSAnYSB0ID0gJ2FcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgTGlzdCA9IExpc3QwXG5pbmNsdWRlIE1vbmFkX2ludGZcblxubW9kdWxlIHR5cGUgQmFzaWNfZ2VuZXJhbCA9IHNpZ1xuICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcblxuICB2YWwgYmluZFxuICAgIDogICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcbiAgICAtPiBmOignYSAtPiAoJ2IsICdqLCAnaywgJ2QsICdlKSB0KVxuICAgIC0+ICgnYiwgJ2ksICdrLCAnZCwgJ2UpIHRcblxuICB2YWwgbWFwXG4gICAgOiBbIGBEZWZpbmVfdXNpbmdfYmluZFxuICAgICAgfCBgQ3VzdG9tIG9mICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqLCAnZCwgJ2UpIHRcbiAgICAgIF1cblxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2ksICdkLCAnZSkgdFxuZW5kXG5cbm1vZHVsZSBNYWtlX2dlbmVyYWwgKE0gOiBCYXNpY19nZW5lcmFsKSA9IHN0cnVjdFxuICBsZXQgYmluZCA9IE0uYmluZFxuICBsZXQgcmV0dXJuID0gTS5yZXR1cm5cbiAgbGV0IG1hcF92aWFfYmluZCBtYSB+ZiA9IE0uYmluZCBtYSB+ZjooZnVuIGEgLT4gTS5yZXR1cm4gKGYgYSkpXG5cbiAgbGV0IG1hcCA9XG4gICAgbWF0Y2ggTS5tYXAgd2l0aFxuICAgIHwgYERlZmluZV91c2luZ19iaW5kIC0+IG1hcF92aWFfYmluZFxuICAgIHwgYEN1c3RvbSB4IC0+IHhcbiAgOztcblxuICBtb2R1bGUgTW9uYWRfaW5maXggPSBzdHJ1Y3RcbiAgICBsZXQgKCA+Pj0gKSB0IGYgPSBiaW5kIHQgfmZcbiAgICBsZXQgKCA+PnwgKSB0IGYgPSBtYXAgdCB+ZlxuICBlbmRcblxuICBpbmNsdWRlIE1vbmFkX2luZml4XG5cbiAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG5cbiAgICBpbmNsdWRlIE1vbmFkX2luZml4XG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgICBsZXQgbWFwID0gbWFwXG4gICAgICBsZXQgYm90aCBhIGIgPSBhID4+PSBmdW4gYSAtPiBiID4+fCBmdW4gYiAtPiBhLCBiXG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA9IHN0cnVjdCBlbmRcbiAgICBlbmRcbiAgZW5kXG5cbiAgbGV0IGpvaW4gdCA9IHQgPj49IGZ1biB0JyAtPiB0J1xuICBsZXQgaWdub3JlX20gdCA9IG1hcCB0IH5mOihmdW4gXyAtPiAoKSlcblxuICBsZXQgYWxsID1cbiAgICBsZXQgcmVjIGxvb3AgdnMgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiByZXR1cm4gKExpc3QucmV2IHZzKVxuICAgICAgfCB0IDo6IHRzIC0+IHQgPj49IGZ1biB2IC0+IGxvb3AgKHYgOjogdnMpIHRzXG4gICAgaW5cbiAgICBmdW4gdHMgLT4gbG9vcCBbXSB0c1xuICA7O1xuXG4gIGxldCByZWMgYWxsX3VuaXQgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gcmV0dXJuICgpXG4gICAgfCB0IDo6IHRzIC0+IHQgPj49IGZ1biAoKSAtPiBhbGxfdW5pdCB0c1xuICA7O1xuZW5kXG5cbm1vZHVsZSBNYWtlX2luZGV4ZWQgKE0gOiBCYXNpY19pbmRleGVkKSA6XG4gIFNfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIE0udCA9IE1ha2VfZ2VuZXJhbCAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdpLCAnaikgTS50XG4gIGVuZClcblxubW9kdWxlIE1ha2UzIChNIDogQmFzaWMzKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgTS50ID1cbiAgTWFrZV9nZW5lcmFsIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QsICdlKSBNLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZTIgKE0gOiBCYXNpYzIpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2QpIHQgOj0gKCdhLCAnZCkgTS50ID0gTWFrZV9nZW5lcmFsIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QpIE0udFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlIChNIDogQmFzaWMpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBNLnQgPSBNYWtlX2dlbmVyYWwgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gJ2EgTS50XG4gIGVuZClcblxubW9kdWxlIE9mX21vbmFkX2dlbmVyYWwgKE1vbmFkIDogc2lnXG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG5cbiAgICB2YWwgYmluZFxuICAgICAgOiAgKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuICAgICAgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2ssICdkLCAnZSkgdClcbiAgICAgIC0+ICgnYiwgJ2ksICdrLCAnZCwgJ2UpIHRcblxuICAgIHZhbCBtYXAgOiAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaiwgJ2QsICdlKSB0XG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpLCAnZCwgJ2UpIHRcbiAgZW5kKSAoTSA6IHNpZ1xuICAgICAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuXG4gICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnaSwgJ2osICdkLCAnZSkgdCAtPiAoJ2EsICdpLCAnaiwgJ2QsICdlKSBNb25hZC50XG4gICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnaSwgJ2osICdkLCAnZSkgTW9uYWQudCAtPiAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG4gICAgICAgIGVuZCkgPVxuICBNYWtlX2dlbmVyYWwgKHN0cnVjdFxuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIE0udFxuXG4gICAgbGV0IHJldHVybiBhID0gTS5vZl9tb25hZCAoTW9uYWQucmV0dXJuIGEpXG4gICAgbGV0IGJpbmQgdCB+ZiA9IE0ub2ZfbW9uYWQgKE1vbmFkLmJpbmQgKE0udG9fbW9uYWQgdCkgfmY6KGZ1biBhIC0+IE0udG9fbW9uYWQgKGYgYSkpKVxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIChmdW4gdCB+ZiAtPiBNLm9mX21vbmFkIChNb25hZC5tYXAgKE0udG9fbW9uYWQgdCkgfmYpKVxuICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZF9pbmRleGVkXG4gICAgKE1vbmFkIDogU19pbmRleGVkKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdpLCAnaikgdCAtPiAoJ2EsICdpLCAnaikgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnaSwgJ2opIE1vbmFkLnQgLT4gKCdhLCAnaSwgJ2opIHRcbiAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpID1cbiAgT2ZfbW9uYWRfZ2VuZXJhbFxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTW9uYWRcblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnaSwgJ2opIE1vbmFkLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2ksICdqKSBNLnRcbiAgICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZDNcbiAgICAoTW9uYWQgOiBTMykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2IsICdjKSBNb25hZC50IC0+ICgnYSwgJ2IsICdjKSB0XG4gICAgICAgICAgICAgICAgICBlbmQpID1cbiAgT2ZfbW9uYWRfZ2VuZXJhbFxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTW9uYWRcblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCwgJ2UpIE1vbmFkLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QsICdlKSBNLnRcbiAgICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZDJcbiAgICAoTW9uYWQgOiBTMikgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnYikgdCAtPiAoJ2EsICdiKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2IpIE1vbmFkLnQgLT4gKCdhLCAnYikgdFxuICAgICAgICAgICAgICAgICAgZW5kKSA9XG4gIE9mX21vbmFkX2dlbmVyYWxcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1vbmFkXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QpIE1vbmFkLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QpIE0udFxuICAgIGVuZClcblxubW9kdWxlIE9mX21vbmFkXG4gICAgKE1vbmFkIDogUykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICB0eXBlICdhIHRcblxuICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICdhIHQgLT4gJ2EgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICdhIE1vbmFkLnQgLT4gJ2EgdFxuICAgICAgICAgICAgICAgICBlbmQpID1cbiAgT2ZfbW9uYWRfZ2VuZXJhbFxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTW9uYWRcblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gJ2EgTW9uYWQudFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1cblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gJ2EgTS50XG4gICAgZW5kKVxuXG5tb2R1bGUgSWRlbnQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2FcblxuICBpbmNsdWRlIE1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgICAgbGV0IGJpbmQgYSB+ZiA9IGYgYVxuICAgICAgbGV0IHJldHVybiBhID0gYVxuICAgICAgbGV0IG1hcCA9IGBDdXN0b20gKGZ1biBhIH5mIC0+IGYgYSlcbiAgICBlbmQpXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBBcHBsaWNhdGl2ZV9pbnRmXG5tb2R1bGUgTGlzdCA9IExpc3QwXG5cbigqKiBUaGlzIG1vZHVsZSBzZXJ2ZXMgbW9zdGx5IGFzIGEgcGFydGlhbCBjaGVjayB0aGF0IFtTMl0gYW5kIFtTXSBhcmUgaW4gc3luYywgYnV0XG4gICAgYWN0dWFsbHkgY2FsbGluZyBpdCBpcyBvY2Nhc2lvbmFsbHkgdXNlZnVsLiAqKVxubW9kdWxlIFNfdG9fUzIgKFggOiBTKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudFxuZW5kXG5cbm1vZHVsZSBTMl90b19TIChYIDogUzIpIDogUyB3aXRoIHR5cGUgJ2EgdCA9ICgnYSwgdW5pdCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgJ2EgdCA9ICgnYSwgdW5pdCkgWC50XG5lbmRcblxubW9kdWxlIFMyX3RvX1MzIChYIDogUzIpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnRcbmVuZFxuXG5tb2R1bGUgUzNfdG9fUzIgKFggOiBTMykgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZCkgdCA9ICgnYSwgJ2QsIHVuaXQpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2QpIHQgPSAoJ2EsICdkLCB1bml0KSBYLnRcbmVuZFxuXG5tb2R1bGUgTWFrZTMgKFggOiBCYXNpYzMpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgbGV0ICggPCo+ICkgPSBhcHBseVxuICBsZXQgZGVyaXZlZF9tYXAgdCB+ZiA9IHJldHVybiBmIDwqPiB0XG5cbiAgbGV0IG1hcCA9XG4gICAgbWF0Y2ggWC5tYXAgd2l0aFxuICAgIHwgYERlZmluZV91c2luZ19hcHBseSAtPiBkZXJpdmVkX21hcFxuICAgIHwgYEN1c3RvbSB4IC0+IHhcbiAgOztcblxuICBsZXQgKCA+PnwgKSB0IGYgPSBtYXAgdCB+ZlxuICBsZXQgbWFwMiB0YSB0YiB+ZiA9IG1hcCB+ZiB0YSA8Kj4gdGJcbiAgbGV0IG1hcDMgdGEgdGIgdGMgfmYgPSBtYXAgfmYgdGEgPCo+IHRiIDwqPiB0Y1xuICBsZXQgYWxsIHRzID0gTGlzdC5mb2xkX3JpZ2h0IHRzIH5pbml0OihyZXR1cm4gW10pIH5mOihtYXAyIH5mOihmdW4geCB4cyAtPiB4IDo6IHhzKSlcbiAgbGV0IGJvdGggdGEgdGIgPSBtYXAyIHRhIHRiIH5mOihmdW4gYSBiIC0+IGEsIGIpXG4gIGxldCAoICo+ICkgdSB2ID0gcmV0dXJuIChmdW4gKCkgeSAtPiB5KSA8Kj4gdSA8Kj4gdlxuICBsZXQgKCA8KiApIHUgdiA9IHJldHVybiAoZnVuIHggKCkgLT4geCkgPCo+IHUgPCo+IHZcbiAgbGV0IGFsbF91bml0IHRzID0gTGlzdC5mb2xkIHRzIH5pbml0OihyZXR1cm4gKCkpIH5mOiggKj4gKVxuXG4gIG1vZHVsZSBBcHBsaWNhdGl2ZV9pbmZpeCA9IHN0cnVjdFxuICAgIGxldCAoIDwqPiApID0gKCA8Kj4gKVxuICAgIGxldCAoICo+ICkgPSAoICo+IClcbiAgICBsZXQgKCA8KiApID0gKCA8KiApXG4gICAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBNYWtlMiAoWCA6IEJhc2ljMikgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSBYLnQgPSBNYWtlMyAoc3RydWN0XG4gICAgaW5jbHVkZSBYXG5cbiAgICB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50XG4gIGVuZClcblxubW9kdWxlIE1ha2UgKFggOiBCYXNpYykgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIFgudCA9IE1ha2UyIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFhcblxuICAgIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlX2xldF9zeW50YXgzXG4gICAgKFggOiBGb3JfbGV0X3N5bnRheDMpIChJbnRmIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB0eXBlIFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZClcbiAgICAoSW1wbCA6IEludGYuUykgPVxuc3RydWN0XG4gIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgaW5jbHVkZSBYXG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgICAgaW5jbHVkZSBYXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgPSBJbXBsXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBNYWtlX2xldF9zeW50YXgyXG4gICAgKFggOiBGb3JfbGV0X3N5bnRheDIpIChJbnRmIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB0eXBlIFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZClcbiAgICAoSW1wbCA6IEludGYuUykgPVxuICBNYWtlX2xldF9zeW50YXgzXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBYXG5cbiAgICAgIHR5cGUgKCdhLCAnZCwgXykgdCA9ICgnYSwgJ2QpIFgudFxuICAgIGVuZClcbiAgICAoSW50ZilcbiAgICAoSW1wbClcblxubW9kdWxlIE1ha2VfbGV0X3N5bnRheFxuICAgIChYIDogRm9yX2xldF9zeW50YXgpIChJbnRmIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHR5cGUgU1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpXG4gICAgKEltcGwgOiBJbnRmLlMpID1cbiAgTWFrZV9sZXRfc3ludGF4MlxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgWFxuXG4gICAgICB0eXBlICgnYSwgXykgdCA9ICdhIFgudFxuICAgIGVuZClcbiAgICAoSW50ZilcbiAgICAoSW1wbClcblxuKCoqIFRoaXMgZnVuY3RvciBjbG9zZWx5IHJlc2VtYmxlcyBbTWFrZTNdLCBhbmQgaW5kZWVkIGl0IGNvdWxkIGJlIGltcGxlbWVudGVkXG4gICAgbXVjaCBzaG9ydGVyIGluIHRlcm1zIG9mIFtNYWtlM10uIEhvd2V2ZXIsIHdlIGltcGxlbWVudCBpdCBieSBoYW5kIHNvIHRoYXRcbiAgICB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9ucyBhcmUgbW9yZSBlZmZpY2llbnQsIGUuZy4gdXNpbmcgW21hcDJdIGRpcmVjdGx5IGluc3RlYWQgb2ZcbiAgICBkZWZpbmluZyBbYXBwbHldIGluIHRlcm1zIG9mIGl0IGFuZCB0aGVuIFttYXAyXSBpbiB0ZXJtcyBvZiB0aGF0LiBGb3IgbW9zdFxuICAgIGFwcGxpY2F0aXZlcyB0aGlzIGRvZXMgbm90IG1hdHRlciwgYnV0IGZvciBzb21lIChzdWNoIGFzIEJvbnNhaS5WYWx1ZS50KSwgaXQgaGFzIGFcbiAgICBsYXJnZXIgaW1wYWN0LiAqKVxubW9kdWxlIE1ha2UzX3VzaW5nX21hcDIgKFggOiBCYXNpYzNfdXNpbmdfbWFwMikgOlxuICBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICBsZXQgYXBwbHkgdGYgdGEgPSBtYXAyIHRmIHRhIH5mOihmdW4gZiBhIC0+IGYgYSlcbiAgbGV0ICggPCo+ICkgPSBhcHBseVxuICBsZXQgZGVyaXZlZF9tYXAgdCB+ZiA9IHJldHVybiBmIDwqPiB0XG5cbiAgbGV0IG1hcCA9XG4gICAgbWF0Y2ggWC5tYXAgd2l0aFxuICAgIHwgYERlZmluZV91c2luZ19tYXAyIC0+IGRlcml2ZWRfbWFwXG4gICAgfCBgQ3VzdG9tIHggLT4geFxuICA7O1xuXG4gIGxldCAoID4+fCApIHQgZiA9IG1hcCB0IH5mXG4gIGxldCBib3RoIHRhIHRiID0gbWFwMiB0YSB0YiB+ZjooZnVuIGEgYiAtPiBhLCBiKVxuICBsZXQgbWFwMyB0YSB0YiB0YyB+ZiA9IG1hcDIgKG1hcDIgdGEgdGIgfmYpIHRjIH5mOihmdW4gZmFiIGMgLT4gZmFiIGMpXG4gIGxldCBhbGwgdHMgPSBMaXN0LmZvbGRfcmlnaHQgdHMgfmluaXQ6KHJldHVybiBbXSkgfmY6KG1hcDIgfmY6KGZ1biB4IHhzIC0+IHggOjogeHMpKVxuICBsZXQgKCAqPiApIHUgdiA9IG1hcDIgdSB2IH5mOihmdW4gKCkgeSAtPiB5KVxuICBsZXQgKCA8KiApIHUgdiA9IG1hcDIgdSB2IH5mOihmdW4geCAoKSAtPiB4KVxuICBsZXQgYWxsX3VuaXQgdHMgPSBMaXN0LmZvbGQgdHMgfmluaXQ6KHJldHVybiAoKSkgfmY6KCAqPiApXG5cbiAgbW9kdWxlIEFwcGxpY2F0aXZlX2luZml4ID0gc3RydWN0XG4gICAgbGV0ICggPCo+ICkgPSAoIDwqPiApXG4gICAgbGV0ICggKj4gKSA9ICggKj4gKVxuICAgIGxldCAoIDwqICkgPSAoIDwqIClcbiAgICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgZW5kXG5lbmRcblxubW9kdWxlIE1ha2UyX3VzaW5nX21hcDIgKFggOiBCYXNpYzJfdXNpbmdfbWFwMikgOlxuICBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSBYLnQgPSBNYWtlM191c2luZ19tYXAyIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFhcblxuICAgIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZV91c2luZ19tYXAyIChYIDogQmFzaWNfdXNpbmdfbWFwMikgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIFgudCA9XG4gIE1ha2UyX3VzaW5nX21hcDIgKHN0cnVjdFxuICAgIGluY2x1ZGUgWFxuXG4gICAgdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50XG4gIGVuZClcblxubW9kdWxlIE9mX21vbmFkMiAoTSA6IE1vbmFkLlMyKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIE0udCA9IE1ha2UyIChzdHJ1Y3RcbiAgICB0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlKSBNLnRcblxuICAgIGxldCByZXR1cm4gPSBNLnJldHVyblxuICAgIGxldCBhcHBseSBtZiBteCA9IE0uYmluZCBtZiB+ZjooZnVuIGYgLT4gTS5tYXAgbXggfmYpXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gTS5tYXBcbiAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWQgKE0gOiBNb25hZC5TKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgTS50ID0gT2ZfbW9uYWQyIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIHR5cGUgKCdhLCBfKSB0ID0gJ2EgTS50XG4gIGVuZClcblxubW9kdWxlIENvbXBvc2UgKEYgOiBTKSAoRyA6IFMpIDogUyB3aXRoIHR5cGUgJ2EgdCA9ICdhIEYudCBHLnQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgRi50IEcudFxuXG4gIGluY2x1ZGUgTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgICBsZXQgcmV0dXJuIGEgPSBHLnJldHVybiAoRi5yZXR1cm4gYSlcbiAgICAgIGxldCBhcHBseSB0ZiB0eCA9IEcuYXBwbHkgKEcubWFwIH5mOkYuYXBwbHkgdGYpIHR4XG4gICAgICBsZXQgY3VzdG9tX21hcCB0IH5mID0gRy5tYXAgfmY6KEYubWFwIH5mKSB0XG4gICAgICBsZXQgbWFwID0gYEN1c3RvbSBjdXN0b21fbWFwXG4gICAgZW5kKVxuZW5kXG5cbm1vZHVsZSBQYWlyIChGIDogUykgKEcgOiBTKSA6IFMgd2l0aCB0eXBlICdhIHQgPSAnYSBGLnQgKiAnYSBHLnQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgRi50ICogJ2EgRy50XG5cbiAgaW5jbHVkZSBNYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICAgIGxldCByZXR1cm4gYSA9IEYucmV0dXJuIGEsIEcucmV0dXJuIGFcbiAgICAgIGxldCBhcHBseSB0ZiB0eCA9IEYuYXBwbHkgKGZzdCB0ZikgKGZzdCB0eCksIEcuYXBwbHkgKHNuZCB0ZikgKHNuZCB0eClcbiAgICAgIGxldCBjdXN0b21fbWFwIHQgfmYgPSBGLm1hcCB+ZiAoZnN0IHQpLCBHLm1hcCB+ZiAoc25kIHQpXG4gICAgICBsZXQgbWFwID0gYEN1c3RvbSBjdXN0b21fbWFwXG4gICAgZW5kKVxuZW5kXG4iLCIoKiBbQnl0ZXMwXSBkZWZpbmVzIHN0cmluZyBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5XG4gICBkZWZpbmVkIGluIHRlcm1zIG9mIFtDYW1sLkJ5dGVzXS4gW0J5dGVzMF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzXG4gICB0aGUgcGFydCBvZiBbQ2FtbC5CeXRlc10gdGhhdCBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXJcbiAgIHRoYW4gYnl0ZXMwLm1sIHNob3VsZCB1c2UgW0NhbWwuQnl0ZXNdLiBbQnl0ZXMwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kXG4gICBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLlxuXG4gICBBbGwgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIHN0cmluZ3MgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLkJ5dGVzXSBpblxuICAgYnVpbGQgb3JkZXIgc2hvdWxkIGRvOlxuXG4gICB7W1xuICAgICBtb2R1bGUgQnl0ZXMgID0gQnl0ZXMwXG4gICBdfVxuXG4gICBEZWZpbmluZyBbbW9kdWxlIEJ5dGVzID0gQnl0ZXMwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0IHByZXZlbnRzXG4gICBvY2FtbGRlcCBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLkJ5dGVzXS4gKilcblxub3BlbiEgSW1wb3J0MFxubW9kdWxlIFN5cyA9IFN5czBcblxubW9kdWxlIFByaW1pdGl2ZXMgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc19zYWZlX2dldFwiXG4gIGV4dGVybmFsIGxlbmd0aCA6IGJ5dGVzIC0+IGludCA9IFwiJWJ5dGVzX2xlbmd0aFwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCBzZXQgICAgICAgIDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcblxuICAoKiBbdW5zYWZlX2JsaXRfc3RyaW5nXSBpcyBub3QgZXhwb3J0ZWQgaW4gdGhlIFtzdGRsaWJdIHNvIHdlIGV4cG9ydCBpdCBoZXJlICopXG4gIGV4dGVybmFsIHVuc2FmZV9ibGl0X3N0cmluZ1xuICAgIDogIHNyYzpzdHJpbmdcbiAgICAtPiBzcmNfcG9zOmludFxuICAgIC0+IGRzdDpieXRlc1xuICAgIC0+IGRzdF9wb3M6aW50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9ibGl0X3N0cmluZ1wiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2dldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCA9IFwiJWNhbWxfYnl0ZXNfZ2V0NjR1XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NHVcIlxuZW5kXG5cbmluY2x1ZGUgUHJpbWl0aXZlc1xuXG5sZXQgbWF4X2xlbmd0aCA9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxubGV0IGJsaXQgPSBDYW1sLkJ5dGVzLmJsaXRcbmxldCBibGl0X3N0cmluZyA9IENhbWwuQnl0ZXMuYmxpdF9zdHJpbmdcbmxldCBjb21wYXJlID0gQ2FtbC5CeXRlcy5jb21wYXJlXG5sZXQgY29weSA9IENhbWwuQnl0ZXMuY29weVxubGV0IGNyZWF0ZSA9IENhbWwuQnl0ZXMuY3JlYXRlXG5sZXQgZmlsbCA9IENhbWwuQnl0ZXMuZmlsbFxubGV0IG1ha2UgPSBDYW1sLkJ5dGVzLm1ha2VcbmxldCBtYXAgPSBDYW1sLkJ5dGVzLm1hcFxubGV0IG1hcGkgPSBDYW1sLkJ5dGVzLm1hcGlcbmxldCBzdWIgPSBDYW1sLkJ5dGVzLnN1YlxubGV0IHVuc2FmZV9ibGl0ID0gQ2FtbC5CeXRlcy51bnNhZmVfYmxpdFxubGV0IHRvX3N0cmluZyA9IENhbWwuQnl0ZXMudG9fc3RyaW5nXG5sZXQgb2Zfc3RyaW5nID0gQ2FtbC5CeXRlcy5vZl9zdHJpbmdcbmxldCB1bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnMgPSBDYW1sLkJ5dGVzLnVuc2FmZV90b19zdHJpbmcgc1xubGV0IHVuc2FmZV9vZl9zdHJpbmdfcHJvbWlzZV9ub19tdXRhdGlvbiA9IENhbWwuQnl0ZXMudW5zYWZlX29mX3N0cmluZ1xuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgKCdhLCAnd2l0bmVzcykgdCA9XG4gIHsgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludFxuICA7IHNleHBfb2ZfdCA6ICdhIC0+IFNleHAudFxuICB9XG5cbnR5cGUgKCdhLCAnYikgY29tcGFyYXRvciA9ICgnYSwgJ2IpIHRcblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB0eXBlIHRcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgY29tcGFyYXRvciA6ICh0LCBjb21wYXJhdG9yX3dpdG5lc3MpIGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgY29tcGFyYXRvciA6ICgnYSB0LCBjb21wYXJhdG9yX3dpdG5lc3MpIGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX2ZjID0gc2lnXG4gIHR5cGUgY29tcGFyYWJsZV90XG5cbiAgaW5jbHVkZSBTIHdpdGggdHlwZSB0IDo9IGNvbXBhcmFibGVfdFxuZW5kXG5cbm1vZHVsZSBNb2R1bGUgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiKSB0ID0gKG1vZHVsZSBTIHdpdGggdHlwZSB0ID0gJ2EgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gJ2IpXG5lbmRcblxubGV0IG1ha2UgKHR5cGUgdCkgfmNvbXBhcmUgfnNleHBfb2ZfdCA9XG4gIChtb2R1bGUgc3RydWN0XG4gICAgdHlwZSBjb21wYXJhYmxlX3QgPSB0XG4gICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICAgIGxldCBjb21wYXJhdG9yID0geyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBlbmQgOiBTX2ZjXG4gICAgd2l0aCB0eXBlIGNvbXBhcmFibGVfdCA9IHQpXG47O1xuXG5tb2R1bGUgU190b19TMSAoUyA6IFMpID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9IFMudFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IFMuY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgb3BlbiBTXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIE1ha2UgKE0gOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpID1cbnN0cnVjdFxuICBpbmNsdWRlIE1cblxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yID0gTS57IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5lbmRcblxubW9kdWxlIE1ha2UxIChNIDogc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgY29tcGFyZSA6ICdhIHQgLT4gJ2EgdCAtPiBpbnRcbiAgICB2YWwgc2V4cF9vZl90IDogJ2EgdCAtPiBTZXhwLnRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciA9IE0ueyBjb21wYXJlOyBzZXhwX29mX3QgfVxuZW5kXG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhXG5cbiAgaW5jbHVkZSBNYWtlMSAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuXG4gICAgICBsZXQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICAgICAgbGV0IHNleHBfb2ZfdCBfID0gU2V4cC5BdG9tIFwiX1wiXG4gICAgZW5kKVxuZW5kXG5cbm1vZHVsZSB0eXBlIERlcml2ZWQgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2NtcCBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgY29tcGFyYXRvciA6ICgnYSwgJ2NtcCkgY29tcGFyYXRvciAtPiAoJ2EgdCwgJ2NtcCBjb21wYXJhdG9yX3dpdG5lc3MpIGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgRGVyaXZlZCAoTSA6IHNpZ1xuICAgIHR5cGUgJ2EgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuXG4gICAgdmFsIHNleHBfb2ZfdCA6ICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlICdjbXAgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgYSA9XG4gICAgeyBjb21wYXJlID0gTS5jb21wYXJlIGEuY29tcGFyZTsgc2V4cF9vZl90ID0gTS5zZXhwX29mX3QgYS5zZXhwX29mX3QgfVxuICA7O1xuZW5kXG5cbm1vZHVsZSB0eXBlIERlcml2ZWQyID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICgnY21wX2EsICdjbXBfYikgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGNvbXBhcmF0b3JcbiAgICA6ICAoJ2EsICdjbXBfYSkgY29tcGFyYXRvclxuICAgIC0+ICgnYiwgJ2NtcF9iKSBjb21wYXJhdG9yXG4gICAgLT4gKCgnYSwgJ2IpIHQsICgnY21wX2EsICdjbXBfYikgY29tcGFyYXRvcl93aXRuZXNzKSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIERlcml2ZWQyIChNIDogc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgc2V4cF9vZl90XG4gICAgICA6ICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdiIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSAoJ2NtcF9hLCAnY21wX2IpIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yIGEgYiA9XG4gICAgeyBjb21wYXJlID0gTS5jb21wYXJlIGEuY29tcGFyZSBiLmNvbXBhcmVcbiAgICA7IHNleHBfb2ZfdCA9IE0uc2V4cF9vZl90IGEuc2V4cF9vZl90IGIuc2V4cF9vZl90XG4gICAgfVxuICA7O1xuZW5kXG5cbm1vZHVsZSB0eXBlIERlcml2ZWRfcGhhbnRvbSA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAnY21wIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBjb21wYXJhdG9yXG4gICAgOiAgKCdhLCAnY21wKSBjb21wYXJhdG9yXG4gICAgLT4gKCgnYSwgXykgdCwgJ2NtcCBjb21wYXJhdG9yX3dpdG5lc3MpIGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgRGVyaXZlZF9waGFudG9tIChNIDogc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgY29tcGFyZSA6ICgnYSAtPiAnYSAtPiBpbnQpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBpbnRcbiAgICB2YWwgc2V4cF9vZl90IDogKCdhIC0+IFNleHAudCkgLT4gKCdhLCBfKSB0IC0+IFNleHAudFxuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlICdjbXBfYSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciBhID1cbiAgICB7IGNvbXBhcmUgPSBNLmNvbXBhcmUgYS5jb21wYXJlOyBzZXhwX29mX3QgPSBNLnNleHBfb2ZfdCBhLnNleHBfb2ZfdCB9XG4gIDs7XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlICgnZiwgJ3MpIHQgPVxuICB8IEZpcnN0IG9mICdmXG4gIHwgU2Vjb25kIG9mICdzXG5bQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgY29tcGFyZSA6XG4gICdmICdzLiAoJ2YgLT4gJ2YgLT4gaW50KSAtPiAoJ3MgLT4gJ3MgLT4gaW50KSAtPiAoJ2YsICdzKSB0IC0+ICgnZiwgJ3MpIHQgLT4gaW50XG4gID1cbiAgZnVuIF9jbXBfX2YgX2NtcF9fcyBhX18wMDFfIGJfXzAwMl8gLT5cbiAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDAxXyBiX18wMDJfXG4gIHRoZW4gMFxuICBlbHNlIChcbiAgICBtYXRjaCBhX18wMDFfLCBiX18wMDJfIHdpdGhcbiAgICB8IEZpcnN0IF9hX18wMDNfLCBGaXJzdCBfYl9fMDA0XyAtPiBfY21wX19mIF9hX18wMDNfIF9iX18wMDRfXG4gICAgfCBGaXJzdCBfLCBfIC0+IC0xXG4gICAgfCBfLCBGaXJzdCBfIC0+IDFcbiAgICB8IFNlY29uZCBfYV9fMDA1XywgU2Vjb25kIF9iX18wMDZfIC0+IF9jbXBfX3MgX2FfXzAwNV8gX2JfXzAwNl8pXG47O1xuXG5sZXQgaGFzaF9mb2xkX3RcbiAgOiB0eXBlIGYgcy5cbiAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGYgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gcyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgLT4gKGYsIHMpIHRcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgPVxuICBmdW4gX2hhc2hfZm9sZF9mIF9oYXNoX2ZvbGRfcyBoc3YgYXJnIC0+XG4gIG1hdGNoIGFyZyB3aXRoXG4gIHwgRmlyc3QgX2EwIC0+XG4gICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMCBpblxuICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICBfaGFzaF9mb2xkX2YgaHN2IF9hMFxuICB8IFNlY29uZCBfYTAgLT5cbiAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxIGluXG4gICAgbGV0IGhzdiA9IGhzdiBpblxuICAgIF9oYXNoX2ZvbGRfcyBoc3YgX2EwXG47O1xuXG5sZXQgdF9vZl9zZXhwIDpcbiAgJ2YgJ3MuXG4gIChTZXhwbGliMC5TZXhwLnQgLT4gJ2YpIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gJ3MpIC0+IFNleHBsaWIwLlNleHAudCAtPiAoJ2YsICdzKSB0XG4gID1cbiAgZnVuICh0eXBlIGZfXzAyM18gc19fMDI0XylcbiAgICAgIDogICgoU2V4cGxpYjAuU2V4cC50IC0+IGZfXzAyM18pIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gc19fMDI0XykgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgICAgICAgLT4gKGZfXzAyM18sIHNfXzAyNF8pIHQpIC0+XG4gICAgbGV0IGVycm9yX3NvdXJjZV9fMDExXyA9IFwiZWl0aGVyMC5tbC50XCIgaW5cbiAgICBmdW4gX29mX2ZfXzAwN18gX29mX3NfXzAwOF8gLT4gZnVuY3Rpb25cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwiZmlyc3RcIiB8IFwiRmlyc3RcIikgYXMgX3RhZ19fMDE0XykgOjogc2V4cF9hcmdzX18wMTVfKSBhc1xuICAgICAgICBfc2V4cF9fMDEzXyAtPlxuICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMTVfIHdpdGhcbiAgICAgICAgIHwgWyBhcmcwX18wMTZfIF0gLT5cbiAgICAgICAgICAgbGV0IHJlczBfXzAxN18gPSBfb2ZfZl9fMDA3XyBhcmcwX18wMTZfIGluXG4gICAgICAgICAgIEZpcnN0IHJlczBfXzAxN19cbiAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMTFfXG4gICAgICAgICAgICAgX3RhZ19fMDE0X1xuICAgICAgICAgICAgIF9zZXhwX18wMTNfKVxuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJzZWNvbmRcIiB8IFwiU2Vjb25kXCIpIGFzIF90YWdfXzAxOV8pIDo6IHNleHBfYXJnc19fMDIwXykgYXNcbiAgICAgICAgX3NleHBfXzAxOF8gLT5cbiAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDIwXyB3aXRoXG4gICAgICAgICB8IFsgYXJnMF9fMDIxXyBdIC0+XG4gICAgICAgICAgIGxldCByZXMwX18wMjJfID0gX29mX3NfXzAwOF8gYXJnMF9fMDIxXyBpblxuICAgICAgICAgICBTZWNvbmQgcmVzMF9fMDIyX1xuICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAxMV9cbiAgICAgICAgICAgICBfdGFnX18wMTlfXG4gICAgICAgICAgICAgX3NleHBfXzAxOF8pXG4gICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJmaXJzdFwiIHwgXCJGaXJzdFwiKSBhcyBzZXhwX18wMTJfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMTFfIHNleHBfXzAxMl9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInNlY29uZFwiIHwgXCJTZWNvbmRcIikgYXMgc2V4cF9fMDEyXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDExXyBzZXhwX18wMTJfXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDEwXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMTFfIHNleHBfXzAxMF9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAxMF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMTFfIHNleHBfXzAxMF9cbiAgICAgIHwgc2V4cF9fMDEwXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDExXyBzZXhwX18wMTBfXG47O1xuXG5sZXQgc2V4cF9vZl90IDpcbiAgJ2YgJ3MuXG4gICgnZiAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgncyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgnZiwgJ3MpIHQgLT4gU2V4cGxpYjAuU2V4cC50XG4gID1cbiAgZnVuICh0eXBlIGZfXzAzMV8gc19fMDMyXylcbiAgICAgIDogICgoZl9fMDMxXyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IChzX18wMzJfIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgICAtPiAoZl9fMDMxXywgc19fMDMyXykgdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgZnVuIF9vZl9mX18wMjVfIF9vZl9zX18wMjZfIC0+IGZ1bmN0aW9uXG4gICAgICB8IEZpcnN0IGFyZzBfXzAyN18gLT5cbiAgICAgICAgbGV0IHJlczBfXzAyOF8gPSBfb2ZfZl9fMDI1XyBhcmcwX18wMjdfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkZpcnN0XCI7IHJlczBfXzAyOF8gXVxuICAgICAgfCBTZWNvbmQgYXJnMF9fMDI5XyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDMwXyA9IF9vZl9zX18wMjZfIGFyZzBfXzAyOV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiU2Vjb25kXCI7IHJlczBfXzAzMF8gXVxuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6XG4gICAgICAgJ2YgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgLT4gJ3MgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgLT4gKCdmLCAncykgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgPVxuICBmdW4gXydmX3NleHBfZ3JhbW1hciBfJ3Nfc2V4cF9ncmFtbWFyIC0+XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJGaXJzdFwiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nZl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiU2Vjb25kXCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydzX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5bQEBAZW5kXVxuIiwiKCogVGhlIHR5cGUgW3RdIHNob3VsZCBiZSBhYnN0cmFjdCB0byBtYWtlIHRoZSBmc2V0IGFuZCBzZXQgZnVuY3Rpb25zIHVuYXZhaWxhYmxlXG4gICBmb3IgcHJpdmF0ZSB0eXBlcyBhdCB0aGUgbGV2ZWwgb2YgdHlwZXMgKGFuZCBub3QgYnkgcHV0dGluZyBOb25lIGluIHRoZSBmaWVsZCkuXG4gICBVbmZvcnR1bmF0ZWx5LCBtYWtpbmcgdGhlIHR5cGUgYWJzdHJhY3QgbWVhbnMgdGhhdCB3aGVuIGNyZWF0aW5nIGZpZWxkcyAodGhyb3VnaFxuICAgYSBbY3JlYXRlXSBmdW5jdGlvbikgdmFsdWUgcmVzdHJpY3Rpb24ga2lja3MgaW4uIFRoaXMgaXMgd29ya2VkIGFyb3VuZCBieSBpbnN0ZWFkXG4gICBub3QgbWFraW5nIHRoZSB0eXBlIGFic3RyYWN0LCBidXQgZm9yY2luZyBhbnlvbmUgYnJlYWtpbmcgdGhlIGFic3RyYWN0aW9uIHRvIHVzZVxuICAgdGhlIFtGb3JfZ2VuZXJhdGVkX2NvZGVdIG1vZHVsZSwgbWFraW5nIGl0IG9idmlvdXMgdG8gYW55IHJlYWRlciB0aGF0IHNvbWV0aGluZyB1Z2x5XG4gICBpcyBnb2luZyBvbi5cbiAgIHRfd2l0aF9wZXJtIChhbmQgZGVyaXZhdGl2ZXMpIGlzIHRoZSB0eXBlIHRoYXQgdXNlcnMgcmVhbGx5IHVzZS4gSXQgaXMgYSBjb25zdHJ1Y3RvclxuICAgYmVjYXVzZTpcbiAgIDEuIGl0IG1ha2VzIHR5cGUgZXJyb3JzIG1vcmUgcmVhZGFibGUgKGxlc3MgYWxpYXNpbmcpXG4gICAyLiB0aGUgdHlwZXIgaW4gb2NhbWwgNC4wMSBhbGxvd3MgdGhpczpcblxuICAge1tcbiAgICAgbW9kdWxlIEEgPSBzdHJ1Y3RcbiAgICAgICB0eXBlIHQgPSB7YSA6IGludH1cbiAgICAgZW5kXG4gICAgIHR5cGUgdCA9IEEudFxuICAgICBsZXQgZiAoeCA6IHQpID0geC5hXG4gICBdfVxuXG4gICAoYWx0aG91Z2ggd2l0aCBXYXJuaW5nIDQwOiBhIGlzIHVzZWQgb3V0IG9mIHNjb3BlKVxuICAgd2hpY2ggbWVhbnMgdGhhdCBpZiBbdF93aXRoX3Blcm1dIHdhcyByZWFsbHkgYW4gYWxpYXMgb24gW0Zvcl9nZW5lcmF0ZWRfY29kZS50XSxcbiAgIHBlb3BsZSBjb3VsZCBzYXkgW3Quc2V0dGVyXSBhbmQgYnJlYWsgdGhlIGFic3RyYWN0aW9uIHdpdGggbm8gaW5kaWNhdGlvbiB0aGF0XG4gICBzb21ldGhpbmcgdWdseSBpcyBnb2luZyBvbiBpbiB0aGUgc291cmNlIGNvZGUuXG4gICBUaGUgd2FybmluZyBpcyAoSSB0aGluaykgZm9yIHBlb3BsZSB3aG8gd2FudCB0byBtYWtlIHRoZWlyIGNvZGUgY29tcGF0aWJsZSB3aXRoXG4gICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBvY2FtbCwgc28gd2UgbWF5IHZlcnkgd2VsbCB0dXJuIGl0IG9mZi5cblxuICAgVGhlIHR5cGUgdF93aXRoX3Blcm0gY291bGQgYWxzbyBoYXZlIGJlZW4gYSBbdW5pdCAtPiBGb3JfZ2VuZXJhdGVkX2NvZGUudF0gdG8gd29ya1xuICAgYXJvdW5kIHZhbHVlIHJlc3RyaWN0aW9uIGFuZCB0aGVuIFtGb3JfZ2VuZXJhdGVkX2NvZGUudF0gd291bGQgaGF2ZSBiZWVuIGEgcHJvcGVyXG4gICBhYnN0cmFjdCB0eXBlLCBidXQgaXQgbG9va3MgbGlrZSBpdCBjb3VsZCBpbXBhY3QgcGVyZm9ybWFuY2UgKGZvciBleGFtcGxlLCBhIGZvbGQgb24gYVxuICAgcmVjb3JkIHR5cGUgd2l0aCA0MCBmaWVsZHMgd291bGQgYWN0dWFsbHkgYWxsb2NhdGUgdGhlIDQwIFtGb3JfZ2VuZXJhdGVkX2NvZGUudF0ncyBhdFxuICAgZXZlcnkgc2luZ2xlIGZvbGQuKSAqKVxuXG5tb2R1bGUgRm9yX2dlbmVyYXRlZF9jb2RlID0gc3RydWN0XG4gIHR5cGUgKCdwZXJtLCAncmVjb3JkLCAnZmllbGQpIHQgPVxuICAgIHsgZm9yY2VfdmFyaWFuY2UgOiAncGVybSAtPiB1bml0XG4gICAgOyAoKiBmb3JjZSBbdF0gdG8gYmUgY29udHJhdmFyaWFudCBpbiBbJ3Blcm1dLCBiZWNhdXNlIHBoYW50b20gdHlwZSB2YXJpYWJsZXMgb25cbiAgICAgICAgIGNvbmNyZXRlIHR5cGVzIGRvbid0IHdvcmsgdGhhdCB3ZWxsIG90aGVyd2lzZSAodXNpbmcgOj4gY2FuIHJlbW92ZSB0aGVtIGVhc2lseSkgKilcbiAgICAgIG5hbWUgOiBzdHJpbmdcbiAgICA7IHNldHRlciA6ICgncmVjb3JkIC0+ICdmaWVsZCAtPiB1bml0KSBvcHRpb25cbiAgICA7IGdldHRlciA6ICdyZWNvcmQgLT4gJ2ZpZWxkXG4gICAgOyBmc2V0IDogJ3JlY29yZCAtPiAnZmllbGQgLT4gJ3JlY29yZFxuICAgIH1cblxuICBsZXQgb3BhcXVlX2lkZW50aXR5ID0gU3lzMC5vcGFxdWVfaWRlbnRpdHlcbmVuZFxuXG50eXBlICgncGVybSwgJ3JlY29yZCwgJ2ZpZWxkKSB0X3dpdGhfcGVybSA9XG4gIHwgRmllbGQgb2YgKCdwZXJtLCAncmVjb3JkLCAnZmllbGQpIEZvcl9nZW5lcmF0ZWRfY29kZS50XG5bQEB1bmJveGVkXVxuXG50eXBlICgncmVjb3JkLCAnZmllbGQpIHQgPSAoWyBgUmVhZCB8IGBTZXRfYW5kX2NyZWF0ZSBdLCAncmVjb3JkLCAnZmllbGQpIHRfd2l0aF9wZXJtXG50eXBlICgncmVjb3JkLCAnZmllbGQpIHJlYWRvbmx5X3QgPSAoWyBgUmVhZCBdLCAncmVjb3JkLCAnZmllbGQpIHRfd2l0aF9wZXJtXG5cbmxldCBuYW1lIChGaWVsZCBmaWVsZCkgPSBmaWVsZC5uYW1lXG5sZXQgZ2V0IChGaWVsZCBmaWVsZCkgciA9IGZpZWxkLmdldHRlciByXG5sZXQgZnNldCAoRmllbGQgZmllbGQpIHIgdiA9IGZpZWxkLmZzZXQgciB2XG5sZXQgc2V0dGVyIChGaWVsZCBmaWVsZCkgPSBmaWVsZC5zZXR0ZXJcblxudHlwZSAoJ3Blcm0sICdyZWNvcmQsICdyZXN1bHQpIHVzZXIgPVxuICB7IGYgOiAnZmllbGQuICgncGVybSwgJ3JlY29yZCwgJ2ZpZWxkKSB0X3dpdGhfcGVybSAtPiAncmVzdWx0IH1cblxubGV0IG1hcCAoRmllbGQgZmllbGQpIHIgfmYgPSBmaWVsZC5mc2V0IHIgKGYgKGZpZWxkLmdldHRlciByKSlcblxubGV0IHVwZGF0ZXIgKEZpZWxkIGZpZWxkKSA9XG4gIG1hdGNoIGZpZWxkLnNldHRlciB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSBzZXR0ZXIgLT4gU29tZSAoZnVuIHIgfmYgLT4gc2V0dGVyIHIgKGYgKGZpZWxkLmdldHRlciByKSkpXG47O1xuIiwiKCogW1N0cmluZzBdIGRlZmluZXMgc3RyaW5nIGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHkgZGVmaW5lZCBpblxuICAgdGVybXMgb2YgW0NhbWwuU3RyaW5nXS4gW1N0cmluZzBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGUgcGFydCBvZlxuICAgW0NhbWwuU3RyaW5nXSB0aGF0IFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlciB0aGFuIHN0cmluZzAubWwgc2hvdWxkXG4gICB1c2UgW0NhbWwuU3RyaW5nXS4gIFtTdHJpbmcwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3NcbiAgIGJ1aWxkIG9yZGVyLlxuXG4gICBBbGwgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIHN0cmluZ3MsIGluY2x1ZGluZyB0aGUgc3Vic2NyaXB0IHN5bnRheFxuICAgW3guKGkpXSBvciBbeC4oaSkgPC0gZV0gd2hpY2ggdGhlIE9DYW1sIHBhcnNlciBkZXN1Z2FycyBpbnRvIGNhbGxzIHRvXG4gICBbU3RyaW5nXSwgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLlN0cmluZ10gaW4gYnVpbGQgb3JkZXIgc2hvdWxkIGRvXG5cbiAgIHtbXG4gICAgIG1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG4gICBdfVxuXG4gICBEZWZpbmluZyBbbW9kdWxlIFN0cmluZyA9IFN0cmluZzBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXQgcHJldmVudHNcbiAgIG9jYW1sZGVwIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuU3RyaW5nXS4gKilcblxub3BlbiEgSW1wb3J0MFxubW9kdWxlIEJ5dGVzID0gQnl0ZXMwXG5tb2R1bGUgU3lzID0gU3lzMFxuXG5tb2R1bGUgU3RyaW5nID0gc3RydWN0XG4gIGV4dGVybmFsIGdldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ19zYWZlX2dldFwiXG4gIGV4dGVybmFsIGxlbmd0aCA6IHN0cmluZyAtPiBpbnQgPSBcIiVzdHJpbmdfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ191bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0ICAgICAgICA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5lbmRcblxuaW5jbHVkZSBTdHJpbmdcblxubGV0IG1heF9sZW5ndGggPSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbmxldCAoIF4gKSA9ICggXiApXG5sZXQgY2FwaXRhbGl6ZSA9IENhbWwuU3RyaW5nLmNhcGl0YWxpemVfYXNjaWlcbmxldCBjb21wYXJlID0gQ2FtbC5TdHJpbmcuY29tcGFyZVxuXG5sZXQgY29weSB4ID1cbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZ1xuICAgIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOlxuICAgICAgKEJ5dGVzLm9mX3N0cmluZyB4KVxuOztcblxubGV0IGVzY2FwZWQgPSBDYW1sLlN0cmluZy5lc2NhcGVkXG5sZXQgbG93ZXJjYXNlID0gQ2FtbC5TdHJpbmcubG93ZXJjYXNlX2FzY2lpXG5sZXQgbWFrZSA9IENhbWwuU3RyaW5nLm1ha2VcbmxldCBzdWIgPSBDYW1sLlN0cmluZy5zdWJcbmxldCB1bmNhcGl0YWxpemUgPSBDYW1sLlN0cmluZy51bmNhcGl0YWxpemVfYXNjaWlcbmxldCB1bnNhZmVfYmxpdCA9IENhbWwuU3RyaW5nLnVuc2FmZV9ibGl0XG5sZXQgdXBwZXJjYXNlID0gQ2FtbC5TdHJpbmcudXBwZXJjYXNlX2FzY2lpXG5cbmxldCBjb25jYXQgPyhzZXAgPSBcIlwiKSBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gXCJcIlxuICAoKiBUaGUgc3RkbGliIGRvZXMgbm90IHNwZWNpYWxpemUgdGhpcyBjYXNlIGJlY2F1c2UgaXQgY291bGQgYnJlYWsgZXhpc3RpbmcgcHJvamVjdHMuICopXG4gIHwgWyB4IF0gLT4geFxuICB8IGwgLT4gQ2FtbC5TdHJpbmcuY29uY2F0IH5zZXAgbFxuOztcblxuKCogVGhlc2UgYXJlIGV0YSBleHBhbmRlZCBpbiBvcmRlciB0byBwZXJtdXRlIHBhcmFtZXRlciBvcmRlciB0byBmb2xsb3cgQmFzZVxuICAgY29udmVudGlvbnMuICopXG5sZXQgaXRlciB0IH5mID0gQ2FtbC5TdHJpbmcuaXRlciB0IH5mXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBJbnQgPSBJbnQwXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBDYW1sLkxleGluZy5wb3NpdGlvbiA9XG4gICAgeyBwb3NfZm5hbWUgOiBzdHJpbmdcbiAgICA7IHBvc19sbnVtIDogaW50XG4gICAgOyBwb3NfYm9sIDogaW50XG4gICAgOyBwb3NfY251bSA6IGludFxuICAgIH1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgPVxuICAgIChmdW4gYV9fMDAxXyBiX18wMDJfIC0+XG4gICAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDAxXyBiX18wMDJfXG4gICAgICAgdGhlbiAwXG4gICAgICAgZWxzZSAoXG4gICAgICAgICBtYXRjaCBjb21wYXJlX3N0cmluZyBhX18wMDFfLnBvc19mbmFtZSBiX18wMDJfLnBvc19mbmFtZSB3aXRoXG4gICAgICAgICB8IDAgLT5cbiAgICAgICAgICAgKG1hdGNoIGNvbXBhcmVfaW50IGFfXzAwMV8ucG9zX2xudW0gYl9fMDAyXy5wb3NfbG51bSB3aXRoXG4gICAgICAgICAgICB8IDAgLT5cbiAgICAgICAgICAgICAgKG1hdGNoIGNvbXBhcmVfaW50IGFfXzAwMV8ucG9zX2JvbCBiX18wMDJfLnBvc19ib2wgd2l0aFxuICAgICAgICAgICAgICAgfCAwIC0+IGNvbXBhcmVfaW50IGFfXzAwMV8ucG9zX2NudW0gYl9fMDAyXy5wb3NfY251bVxuICAgICAgICAgICAgICAgfCBuIC0+IG4pXG4gICAgICAgICAgICB8IG4gLT4gbilcbiAgICAgICAgIHwgbiAtPiBuKVxuICAgICAgICAgOiB0IC0+IHQgLT4gaW50KVxuICA7O1xuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBmdW4gaHN2IGFyZyAtPlxuICAgICAgbGV0IGhzdiA9XG4gICAgICAgIGxldCBoc3YgPVxuICAgICAgICAgIGxldCBoc3YgPVxuICAgICAgICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgICAgICAgaGFzaF9mb2xkX3N0cmluZyBoc3YgYXJnLnBvc19mbmFtZVxuICAgICAgICAgIGluXG4gICAgICAgICAgaGFzaF9mb2xkX2ludCBoc3YgYXJnLnBvc19sbnVtXG4gICAgICAgIGluXG4gICAgICAgIGhhc2hfZm9sZF9pbnQgaHN2IGFyZy5wb3NfYm9sXG4gICAgICBpblxuICAgICAgaGFzaF9mb2xkX2ludCBoc3YgYXJnLnBvc19jbnVtXG4gIDs7XG5cbiAgbGV0IChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jIGFyZyA9XG4gICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgICBoYXNoX2ZvbGRfdCBoc3YgYXJnKVxuICAgIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA9XG4gICAgKGZ1biB7IHBvc19mbmFtZSA9IHBvc19mbmFtZV9fMDA0X1xuICAgICAgICAgOyBwb3NfbG51bSA9IHBvc19sbnVtX18wMDZfXG4gICAgICAgICA7IHBvc19ib2wgPSBwb3NfYm9sX18wMDhfXG4gICAgICAgICA7IHBvc19jbnVtID0gcG9zX2NudW1fXzAxMF9cbiAgICAgICAgIH0gLT5cbiAgICAgIGxldCBibmRzX18wMDNfID0gW10gaW5cbiAgICAgIGxldCBibmRzX18wMDNfID1cbiAgICAgICAgbGV0IGFyZ19fMDExXyA9IHNleHBfb2ZfaW50IHBvc19jbnVtX18wMTBfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInBvc19jbnVtXCI7IGFyZ19fMDExXyBdIDo6IGJuZHNfXzAwM19cbiAgICAgIGluXG4gICAgICBsZXQgYm5kc19fMDAzXyA9XG4gICAgICAgIGxldCBhcmdfXzAwOV8gPSBzZXhwX29mX2ludCBwb3NfYm9sX18wMDhfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInBvc19ib2xcIjsgYXJnX18wMDlfIF0gOjogYm5kc19fMDAzX1xuICAgICAgaW5cbiAgICAgIGxldCBibmRzX18wMDNfID1cbiAgICAgICAgbGV0IGFyZ19fMDA3XyA9IHNleHBfb2ZfaW50IHBvc19sbnVtX18wMDZfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInBvc19sbnVtXCI7IGFyZ19fMDA3XyBdIDo6IGJuZHNfXzAwM19cbiAgICAgIGluXG4gICAgICBsZXQgYm5kc19fMDAzXyA9XG4gICAgICAgIGxldCBhcmdfXzAwNV8gPSBzZXhwX29mX3N0cmluZyBwb3NfZm5hbWVfXzAwNF8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwicG9zX2ZuYW1lXCI7IGFyZ19fMDA1XyBdIDo6IGJuZHNfXzAwM19cbiAgICAgIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgYm5kc19fMDAzX1xuICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbigqIFRoaXMgaXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgUHB4X2hlcmUubGlmdF9wb3NpdGlvbl9hc19zdHJpbmcuICopXG5sZXQgbWFrZV9sb2NhdGlvbl9zdHJpbmcgfnBvc19mbmFtZSB+cG9zX2xudW0gfnBvc19jbnVtIH5wb3NfYm9sID1cbiAgU3RyaW5nLmNvbmNhdFxuICAgIFsgcG9zX2ZuYW1lOyBcIjpcIjsgSW50LnRvX3N0cmluZyBwb3NfbG51bTsgXCI6XCI7IEludC50b19zdHJpbmcgKHBvc19jbnVtIC0gcG9zX2JvbCkgXVxuOztcblxubGV0IHRvX3N0cmluZyB7IENhbWwuTGV4aW5nLnBvc19mbmFtZTsgcG9zX2xudW07IHBvc19jbnVtOyBwb3NfYm9sIH0gPVxuICBtYWtlX2xvY2F0aW9uX3N0cmluZyB+cG9zX2ZuYW1lIH5wb3NfbG51bSB+cG9zX2NudW0gfnBvc19ib2xcbjs7XG5cbmxldCBzZXhwX29mX3QgdCA9IFNleHAuQXRvbSAodG9fc3RyaW5nIHQpXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgTGlzdDBcblxubGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IHBhcnRpdGlvbl9tYXAgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCB0IGZzdCBzbmQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gcmV2IGZzdCwgcmV2IHNuZFxuICAgIHwgeCA6OiB0IC0+XG4gICAgICAobWF0Y2ggKGYgeCA6IF8gRWl0aGVyMC50KSB3aXRoXG4gICAgICAgfCBGaXJzdCB5IC0+IGxvb3AgdCAoeSA6OiBmc3QpIHNuZFxuICAgICAgIHwgU2Vjb25kIHkgLT4gbG9vcCB0IGZzdCAoeSA6OiBzbmQpKVxuICBpblxuICBsb29wIHQgW10gW11cbjs7XG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBFaXRoZXIgPSBFaXRoZXIwXG5cbnR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIENhbWwucmVzdWx0ID1cbiAgfCBPayBvZiAnYVxuICB8IEVycm9yIG9mICdiXG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyLCBjb21wYXJlLCBlcXVhbCwgaGFzaF1cblxubGV0IHRfb2Zfc2V4cCA6XG4gICdhICdiLlxuICAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiAoU2V4cGxpYjAuU2V4cC50IC0+ICdiKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gKCdhLCAnYikgdFxuICA9XG4gIGZ1biAodHlwZSBhX18wMTdfIGJfXzAxOF8pXG4gICAgICA6ICAoKFNleHBsaWIwLlNleHAudCAtPiBhX18wMTdfKSAtPiAoU2V4cGxpYjAuU2V4cC50IC0+IGJfXzAxOF8pIC0+IFNleHBsaWIwLlNleHAudFxuICAgICAgICAgIC0+IChhX18wMTdfLCBiX18wMThfKSB0KSAtPlxuICAgIGxldCBlcnJvcl9zb3VyY2VfXzAwNV8gPSBcInJlc3VsdC5tbC50XCIgaW5cbiAgICBmdW4gX29mX2FfXzAwMV8gX29mX2JfXzAwMl8gLT4gZnVuY3Rpb25cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwib2tcIiB8IFwiT2tcIikgYXMgX3RhZ19fMDA4XykgOjogc2V4cF9hcmdzX18wMDlfKSBhc1xuICAgICAgICBfc2V4cF9fMDA3XyAtPlxuICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMDlfIHdpdGhcbiAgICAgICAgIHwgWyBhcmcwX18wMTBfIF0gLT5cbiAgICAgICAgICAgbGV0IHJlczBfXzAxMV8gPSBfb2ZfYV9fMDAxXyBhcmcwX18wMTBfIGluXG4gICAgICAgICAgIE9rIHJlczBfXzAxMV9cbiAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMDVfXG4gICAgICAgICAgICAgX3RhZ19fMDA4X1xuICAgICAgICAgICAgIF9zZXhwX18wMDdfKVxuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJlcnJvclwiIHwgXCJFcnJvclwiKSBhcyBfdGFnX18wMTNfKSA6OiBzZXhwX2FyZ3NfXzAxNF8pIGFzXG4gICAgICAgIF9zZXhwX18wMTJfIC0+XG4gICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAxNF8gd2l0aFxuICAgICAgICAgfCBbIGFyZzBfXzAxNV8gXSAtPlxuICAgICAgICAgICBsZXQgcmVzMF9fMDE2XyA9IF9vZl9iX18wMDJfIGFyZzBfXzAxNV8gaW5cbiAgICAgICAgICAgRXJyb3IgcmVzMF9fMDE2X1xuICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAwNV9cbiAgICAgICAgICAgICBfdGFnX18wMTNfXG4gICAgICAgICAgICAgX3NleHBfXzAxMl8pXG4gICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJva1wiIHwgXCJPa1wiKSBhcyBzZXhwX18wMDZfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNl9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImVycm9yXCIgfCBcIkVycm9yXCIpIGFzIHNleHBfXzAwNl8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA2X1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG4gICAgICB8IHNleHBfXzAwNF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuOztcblxubGV0IHNleHBfb2ZfdCA6XG4gICdhICdiLlxuICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ2IgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ2EsICdiKSB0IC0+IFNleHBsaWIwLlNleHAudFxuICA9XG4gIGZ1biAodHlwZSBhX18wMjVfIGJfXzAyNl8pXG4gICAgICA6ICAoKGFfXzAyNV8gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoYl9fMDI2XyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgICAgLT4gKGFfXzAyNV8sIGJfXzAyNl8pIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgIGZ1biBfb2ZfYV9fMDE5XyBfb2ZfYl9fMDIwXyAtPiBmdW5jdGlvblxuICAgICAgfCBPayBhcmcwX18wMjFfIC0+XG4gICAgICAgIGxldCByZXMwX18wMjJfID0gX29mX2FfXzAxOV8gYXJnMF9fMDIxXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJPa1wiOyByZXMwX18wMjJfIF1cbiAgICAgIHwgRXJyb3IgYXJnMF9fMDIzXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDI0XyA9IF9vZl9iX18wMjBfIGFyZzBfXzAyM18gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiRXJyb3JcIjsgcmVzMF9fMDI0XyBdXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAtPiAnYiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAtPiAoJ2EsICdiKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIF8nYl9zZXhwX2dyYW1tYXIgLT5cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIk9rXCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydhX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJFcnJvclwiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxubGV0IGNvbXBhcmUgOlxuICAnYSAnYi4gKCdhIC0+ICdhIC0+IGludCkgLT4gKCdiIC0+ICdiIC0+IGludCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGludFxuICA9XG4gIGZ1biBfY21wX19hIF9jbXBfX2IgYV9fMDI3XyBiX18wMjhfIC0+XG4gIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAyN18gYl9fMDI4X1xuICB0aGVuIDBcbiAgZWxzZSAoXG4gICAgbWF0Y2ggYV9fMDI3XywgYl9fMDI4XyB3aXRoXG4gICAgfCBPayBfYV9fMDI5XywgT2sgX2JfXzAzMF8gLT4gX2NtcF9fYSBfYV9fMDI5XyBfYl9fMDMwX1xuICAgIHwgT2sgXywgXyAtPiAtMVxuICAgIHwgXywgT2sgXyAtPiAxXG4gICAgfCBFcnJvciBfYV9fMDMxXywgRXJyb3IgX2JfXzAzMl8gLT4gX2NtcF9fYiBfYV9fMDMxXyBfYl9fMDMyXylcbjs7XG5cbmxldCBlcXVhbCA6XG4gICdhICdiLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gKCdiIC0+ICdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBib29sXG4gID1cbiAgZnVuIF9jbXBfX2EgX2NtcF9fYiBhX18wMzNfIGJfXzAzNF8gLT5cbiAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDMzXyBiX18wMzRfXG4gIHRoZW4gdHJ1ZVxuICBlbHNlIChcbiAgICBtYXRjaCBhX18wMzNfLCBiX18wMzRfIHdpdGhcbiAgICB8IE9rIF9hX18wMzVfLCBPayBfYl9fMDM2XyAtPiBfY21wX19hIF9hX18wMzVfIF9iX18wMzZfXG4gICAgfCBPayBfLCBfIC0+IGZhbHNlXG4gICAgfCBfLCBPayBfIC0+IGZhbHNlXG4gICAgfCBFcnJvciBfYV9fMDM3XywgRXJyb3IgX2JfXzAzOF8gLT4gX2NtcF9fYiBfYV9fMDM3XyBfYl9fMDM4Xylcbjs7XG5cbmxldCBoYXNoX2ZvbGRfdFxuICA6IHR5cGUgYSBiLlxuICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBiIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAtPiAoYSwgYikgdFxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICA9XG4gIGZ1biBfaGFzaF9mb2xkX2EgX2hhc2hfZm9sZF9iIGhzdiBhcmcgLT5cbiAgbWF0Y2ggYXJnIHdpdGhcbiAgfCBPayBfYTAgLT5cbiAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwIGluXG4gICAgbGV0IGhzdiA9IGhzdiBpblxuICAgIF9oYXNoX2ZvbGRfYSBoc3YgX2EwXG4gIHwgRXJyb3IgX2EwIC0+XG4gICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMSBpblxuICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICBfaGFzaF9mb2xkX2IgaHN2IF9hMFxuOztcblxuW0BAQGVuZF1cblxuaW5jbHVkZSBNb25hZC5NYWtlMiAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcblxuICAgIGxldCBiaW5kIHggfmYgPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IEVycm9yIF8gYXMgeCAtPiB4XG4gICAgICB8IE9rIHggLT4gZiB4XG4gICAgOztcblxuICAgIGxldCBtYXAgeCB+ZiA9XG4gICAgICBtYXRjaCB4IHdpdGhcbiAgICAgIHwgRXJyb3IgXyBhcyB4IC0+IHhcbiAgICAgIHwgT2sgeCAtPiBPayAoZiB4KVxuICAgIDs7XG5cbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICBsZXQgcmV0dXJuIHggPSBPayB4XG4gIGVuZClcblxubGV0IGludmFyaWFudCBjaGVja19vayBjaGVja19lcnJvciB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgT2sgb2sgLT4gY2hlY2tfb2sgb2tcbiAgfCBFcnJvciBlcnJvciAtPiBjaGVja19lcnJvciBlcnJvclxuOztcblxubGV0IGZhaWwgeCA9IEVycm9yIHhcbmxldCBmYWlsZiBmb3JtYXQgPSBQcmludGYua3NwcmludGYgZmFpbCBmb3JtYXRcblxubGV0IG1hcF9lcnJvciB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgT2sgXyBhcyB4IC0+IHhcbiAgfCBFcnJvciB4IC0+IEVycm9yIChmIHgpXG47O1xuXG5tb2R1bGUgRXJyb3IgPSBNb25hZC5NYWtlMiAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYiwgJ2EpIHRcblxuICAgIGxldCBiaW5kIHggfmYgPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IE9rIF8gYXMgb2sgLT4gb2tcbiAgICAgIHwgRXJyb3IgZSAtPiBmIGVcbiAgICA7O1xuXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwX2Vycm9yXG4gICAgbGV0IHJldHVybiBlID0gRXJyb3IgZVxuICBlbmQpXG5cbmxldCBpc19vayA9IGZ1bmN0aW9uXG4gIHwgT2sgXyAtPiB0cnVlXG4gIHwgRXJyb3IgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX2Vycm9yID0gZnVuY3Rpb25cbiAgfCBPayBfIC0+IGZhbHNlXG4gIHwgRXJyb3IgXyAtPiB0cnVlXG47O1xuXG5sZXQgb2sgPSBmdW5jdGlvblxuICB8IE9rIHggLT4gU29tZSB4XG4gIHwgRXJyb3IgXyAtPiBOb25lXG47O1xuXG5sZXQgZXJyb3IgPSBmdW5jdGlvblxuICB8IE9rIF8gLT4gTm9uZVxuICB8IEVycm9yIHggLT4gU29tZSB4XG47O1xuXG5sZXQgb2Zfb3B0aW9uIG9wdCB+ZXJyb3IgPVxuICBtYXRjaCBvcHQgd2l0aFxuICB8IFNvbWUgeCAtPiBPayB4XG4gIHwgTm9uZSAtPiBFcnJvciBlcnJvclxuOztcblxubGV0IGl0ZXIgdiB+ZiA9XG4gIG1hdGNoIHYgd2l0aFxuICB8IE9rIHggLT4gZiB4XG4gIHwgRXJyb3IgXyAtPiAoKVxuOztcblxubGV0IGl0ZXJfZXJyb3IgdiB+ZiA9XG4gIG1hdGNoIHYgd2l0aFxuICB8IE9rIF8gLT4gKClcbiAgfCBFcnJvciB4IC0+IGYgeFxuOztcblxubGV0IHRvX2VpdGhlciA6IF8gdCAtPiBfIEVpdGhlci50ID0gZnVuY3Rpb25cbiAgfCBPayB4IC0+IEZpcnN0IHhcbiAgfCBFcnJvciB4IC0+IFNlY29uZCB4XG47O1xuXG5sZXQgb2ZfZWl0aGVyIDogXyBFaXRoZXIudCAtPiBfIHQgPSBmdW5jdGlvblxuICB8IEZpcnN0IHggLT4gT2sgeFxuICB8IFNlY29uZCB4IC0+IEVycm9yIHhcbjs7XG5cbmxldCBva19pZl90cnVlIGJvb2wgfmVycm9yID0gaWYgYm9vbCB0aGVuIE9rICgpIGVsc2UgRXJyb3IgZXJyb3JcblxubGV0IHRyeV93aXRoIGYgPVxuICB0cnkgT2sgKGYgKCkpIHdpdGhcbiAgfCBleG4gLT4gRXJyb3IgZXhuXG47O1xuXG5sZXQgb2tfZXhuID0gZnVuY3Rpb25cbiAgfCBPayB4IC0+IHhcbiAgfCBFcnJvciBleG4gLT4gcmFpc2UgZXhuXG47O1xuXG5sZXQgb2tfb3JfZmFpbHdpdGggPSBmdW5jdGlvblxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIHN0ciAtPiBmYWlsd2l0aCBzdHJcbjs7XG5cbm1vZHVsZSBFeHBvcnQgPSBzdHJ1Y3RcbiAgdHlwZSAoJ29rLCAnZXJyKSBfcmVzdWx0ID0gKCdvaywgJ2VycikgdCA9XG4gICAgfCBPayBvZiAnb2tcbiAgICB8IEVycm9yIG9mICdlcnJcblxuICBsZXQgaXNfZXJyb3IgPSBpc19lcnJvclxuICBsZXQgaXNfb2sgPSBpc19va1xuZW5kXG5cbmxldCBjb21iaW5lIHQxIHQyIH5vayB+ZXJyID1cbiAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgfCBPayBfLCBFcnJvciBlIHwgRXJyb3IgZSwgT2sgXyAtPiBFcnJvciBlXG4gIHwgT2sgb2sxLCBPayBvazIgLT4gT2sgKG9rIG9rMSBvazIpXG4gIHwgRXJyb3IgZXJyMSwgRXJyb3IgZXJyMiAtPiBFcnJvciAoZXJyIGVycjEgZXJyMilcbjs7XG5cbmxldCBjb21iaW5lX2Vycm9ycyBsID1cbiAgbGV0IG9rLCBlcnJzID0gTGlzdDEucGFydGl0aW9uX21hcCBsIH5mOnRvX2VpdGhlciBpblxuICBtYXRjaCBlcnJzIHdpdGhcbiAgfCBbXSAtPiBPayBva1xuICB8IF8gOjogXyAtPiBFcnJvciBlcnJzXG47O1xuXG5sZXQgY29tYmluZV9lcnJvcnNfdW5pdCBsID0gbWFwIChjb21iaW5lX2Vycm9ycyBsKSB+ZjooZnVuIChfIDogdW5pdCBsaXN0KSAtPiAoKSlcblxuKCogZGVwcmVjYXRlZCBiaW5kaW5nIGZvciBleHBvcnQgb25seSAqKVxubGV0IG9rX2ZzdCA9IHRvX2VpdGhlclxuIiwiKCoqIFByb3ZpZGVzIGdlbmVyaWMgc2lnbmF0dXJlcyBmb3IgY29udGFpbmVyIGRhdGEgc3RydWN0dXJlcy5cblxuICAgIFRoZXNlIHNpZ25hdHVyZXMgaW5jbHVkZSBmdW5jdGlvbnMgKFtpdGVyXSwgW2ZvbGRdLCBbZXhpc3RzXSwgW2Zvcl9hbGxdLCAuLi4pIHRoYXRcbiAgICB5b3Ugd291bGQgZXhwZWN0IHRvIGZpbmQgaW4gYW55IGNvbnRhaW5lci4gVXNlZCBieSBpbmNsdWRpbmcgW0NvbnRhaW5lci5TMF0gb3JcbiAgICBbQ29udGFpbmVyLlMxXSBpbiB0aGUgc2lnbmF0dXJlIGZvciBldmVyeSBjb250YWluZXItbGlrZSBkYXRhIHN0cnVjdHVyZSAoW0FycmF5XSxcbiAgICBbTGlzdF0sIFtTdHJpbmddLCAuLi4pIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlLiAqKVxuXG5vcGVuISBJbXBvcnRcblxubW9kdWxlIEV4cG9ydCA9IHN0cnVjdFxuICAoKiogW0NvbnRpbnVlX29yX3N0b3AudF0gaXMgdXNlZCBieSB0aGUgW2ZdIGFyZ3VtZW50IHRvIFtmb2xkX3VudGlsXSBpbiBvcmRlciB0b1xuICAgICAgaW5kaWNhdGUgd2hldGhlciBmb2xkaW5nIHNob3VsZCBjb250aW51ZSwgb3Igc3RvcCBlYXJseS5cblxuICAgICAgQGNhbm9uaWNhbCBCYXNlLkNvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wXG4gICopXG4gIG1vZHVsZSBDb250aW51ZV9vcl9zdG9wID0gc3RydWN0XG4gICAgdHlwZSAoJ2EsICdiKSB0ID1cbiAgICAgIHwgQ29udGludWUgb2YgJ2FcbiAgICAgIHwgU3RvcCBvZiAnYlxuICBlbmRcbmVuZFxuXG5pbmNsdWRlIEV4cG9ydFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLkNvbnRhaW5lci5TdW1tYWJsZSAqKVxubW9kdWxlIHR5cGUgU3VtbWFibGUgPSBzaWdcbiAgdHlwZSB0XG5cbiAgKCoqIFRoZSByZXN1bHQgb2Ygc3VtbWluZyBubyB2YWx1ZXMuICopXG4gIHZhbCB6ZXJvIDogdFxuXG4gICgqKiBBbiBvcGVyYXRpb24gdGhhdCBjb21iaW5lcyB0d28gW3RdJ3MgYW5kIGhhbmRsZXMgW3plcm8gKyB4XSBieSBqdXN0IHJldHVybmluZyBbeF0sXG4gICAgICBhcyB3ZWxsIGFzIGluIHRoZSBzeW1tZXRyaWMgY2FzZS4gKilcbiAgdmFsICggKyApIDogdCAtPiB0IC0+IHRcbmVuZFxuXG4oKiogU2lnbmF0dXJlIGZvciBtb25vbW9ycGhpYyBjb250YWluZXIgLSBhIGNvbnRhaW5lciBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IHR5cGUsIGUuZy4sXG4gICAgc3RyaW5nLCB3aGljaCBpcyBhIGNvbnRhaW5lciBvZiBjaGFyYWN0ZXJzIChbdHlwZSBlbHQgPSBjaGFyXSkgYW5kIG5ldmVyIG9mIGFueXRoaW5nXG4gICAgZWxzZS4gKilcbm1vZHVsZSB0eXBlIFMwID0gc2lnXG4gIHR5cGUgdFxuICB0eXBlIGVsdFxuXG4gICgqKiBDaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyB0aGVyZSwgdXNpbmcgZXF1YWxpdHkgb24gW2VsdF1zLiAqKVxuICB2YWwgbWVtIDogdCAtPiBlbHQgLT4gYm9vbFxuXG4gIHZhbCBsZW5ndGggOiB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiB0IC0+IGJvb2xcblxuICAoKiogW2l0ZXJdIG11c3QgYWxsb3cgZXhjZXB0aW9ucyByYWlzZWQgaW4gW2ZdIHRvIGVzY2FwZSwgdGVybWluYXRpbmcgdGhlIGl0ZXJhdGlvblxuICAgICAgY2xlYW5seS4gIFRoZSBzYW1lIGhvbGRzIGZvciBhbGwgZnVuY3Rpb25zIGJlbG93IHRha2luZyBhbiBbZl0uICopXG4gIHZhbCBpdGVyIDogdCAtPiBmOihlbHQgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBbZm9sZCB0IH5pbml0IH5mXSByZXR1cm5zIFtmICguLi4gZiAoZiAoZiBpbml0IGUxKSBlMikgZTMgLi4uKSBlbl0sIHdoZXJlIFtlMS4uZW5dXG4gICAgICBhcmUgdGhlIGVsZW1lbnRzIG9mIFt0XS4gKilcbiAgdmFsIGZvbGQgOiB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2ZvbGRfcmVzdWx0IHQgfmluaXQgfmZdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXSB0aGF0IHJ1bnMgaW4gdGhlXG4gICAgICBbUmVzdWx0XSBtb25hZC4gIElmIFtmXSByZXR1cm5zIGFuIFtFcnJvciBfXSwgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCB3aXRob3V0IGFueVxuICAgICAgYWRkaXRpb25hbCBpbnZvY2F0aW9ucyBvZiBbZl0uICopXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gICgqKiBbZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2hdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXS4gSWYgW2ZdXG4gICAgICByZXR1cm5zIFtTdG9wIF9dIHRoZSBjb21wdXRhdGlvbiBjZWFzZXMgYW5kIHJlc3VsdHMgaW4gdGhhdCB2YWx1ZS4gSWYgW2ZdIHJldHVybnNcbiAgICAgIFtDb250aW51ZSBfXSwgdGhlIGZvbGQgd2lsbCBwcm9jZWVkLiBJZiBbZl0gbmV2ZXIgcmV0dXJucyBbU3RvcCBfXSwgdGhlIGZpbmFsIHJlc3VsdFxuICAgICAgaXMgY29tcHV0ZWQgYnkgW2ZpbmlzaF0uXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgbWF5YmVfbmVnYXRpdmUgPVxuICAgICAgICAgIHwgRm91bmRfbmVnYXRpdmUgb2YgaW50XG4gICAgICAgICAgfCBBbGxfbm9ubmVnYXRpdmUgb2YgeyBzdW0gOiBpbnQgfVxuXG4gICAgICAgICgqKiBbZmlyc3RfbmVnX29yX3N1bSBsaXN0XSByZXR1cm5zIHRoZSBmaXJzdCBuZWdhdGl2ZSBudW1iZXIgaW4gW2xpc3RdLCBpZiBhbnksXG4gICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsaXN0LiAqKVxuICAgICAgICBsZXQgZmlyc3RfbmVnX29yX3N1bSA9XG4gICAgICAgICAgTGlzdC5mb2xkX3VudGlsIH5pbml0OjBcbiAgICAgICAgICAgIH5mOihmdW4gc3VtIHggLT5cbiAgICAgICAgICAgICAgaWYgeCA8IDBcbiAgICAgICAgICAgICAgdGhlbiBTdG9wIChGb3VuZF9uZWdhdGl2ZSB4KVxuICAgICAgICAgICAgICBlbHNlIENvbnRpbnVlIChzdW0gKyB4KSlcbiAgICAgICAgICAgIH5maW5pc2g6KGZ1biBzdW0gLT4gQWxsX25vbm5lZ2F0aXZlIHsgc3VtIH0pXG4gICAgICAgIDs7XG5cbiAgICAgICAgbGV0IHggPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAzOyA0OyA1XVxuICAgICAgICB2YWwgeCA6IG1heWJlX25lZ2F0aXZlID0gQWxsX25vbm5lZ2F0aXZlIHtzdW0gPSAxNX1cblxuICAgICAgICBsZXQgeSA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IC0zOyA0OyA1XVxuICAgICAgICB2YWwgeSA6IG1heWJlX25lZ2F0aXZlID0gRm91bmRfbmVnYXRpdmUgLTNcbiAgICAgIF19ICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGV4aXN0cyBhbiBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvdmlkZWRcbiAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0uIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGV4aXN0cyA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0gZm9yIGFsbFxuICAgICAgZWxlbWVudHMuIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGZvcl9hbGwgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgY291bnQgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBpbnRcblxuICAoKiogUmV0dXJucyB0aGUgc3VtIG9mIFtmIGldIGZvciBhbGwgW2ldIGluIHRoZSBjb250YWluZXIuICopXG4gIHZhbCBzdW0gOiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSkgLT4gdCAtPiBmOihlbHQgLT4gJ3N1bSkgLT4gJ3N1bVxuXG4gICgqKiBSZXR1cm5zIGFzIGFuIFtvcHRpb25dIHRoZSBmaXJzdCBlbGVtZW50IGZvciB3aGljaCBbZl0gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBmaW5kIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gZWx0IG9wdGlvblxuXG4gICgqKiBSZXR1cm5zIHRoZSBmaXJzdCBldmFsdWF0aW9uIG9mIFtmXSB0aGF0IHJldHVybnMgW1NvbWVdLCBhbmQgcmV0dXJucyBbTm9uZV0gaWYgdGhlcmVcbiAgICAgIGlzIG5vIHN1Y2ggZWxlbWVudC4gICopXG4gIHZhbCBmaW5kX21hcCA6IHQgLT4gZjooZWx0IC0+ICdhIG9wdGlvbikgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIHRvX2xpc3QgOiB0IC0+IGVsdCBsaXN0XG4gIHZhbCB0b19hcnJheSA6IHQgLT4gZWx0IGFycmF5XG5cbiAgKCoqIFJldHVybnMgYSBtaW4gKHJlc3AuIG1heCkgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBbY29tcGFyZV1cbiAgICAgIGZ1bmN0aW9uLiBJbiBjYXNlIG9mIGEgdGllLCB0aGUgZmlyc3QgZWxlbWVudCBlbmNvdW50ZXJlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZVxuICAgICAgY29sbGVjdGlvbiBpcyByZXR1cm5lZC4gVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgW2ZvbGRdIHNvIGl0IGhhcyB0aGUgc2FtZVxuICAgICAgY29tcGxleGl0eSBhcyBbZm9sZF0uIFJldHVybnMgW05vbmVdIGlmZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4gKilcbiAgdmFsIG1pbl9lbHQgOiB0IC0+IGNvbXBhcmU6KGVsdCAtPiBlbHQgLT4gaW50KSAtPiBlbHQgb3B0aW9uXG5cbiAgdmFsIG1heF9lbHQgOiB0IC0+IGNvbXBhcmU6KGVsdCAtPiBlbHQgLT4gaW50KSAtPiBlbHQgb3B0aW9uXG5lbmRcblxubW9kdWxlIHR5cGUgUzBfcGhhbnRvbSA9IHNpZ1xuICB0eXBlIGVsdFxuICB0eXBlICdhIHRcblxuICAoKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgdGhlcmUsIHVzaW5nIGVxdWFsaXR5IG9uIFtlbHRdcy4gKilcbiAgdmFsIG1lbSA6IF8gdCAtPiBlbHQgLT4gYm9vbFxuXG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IF8gdCAtPiBib29sXG4gIHZhbCBpdGVyIDogXyB0IC0+IGY6KGVsdCAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIFtmb2xkIHQgfmluaXQgfmZdIHJldHVybnMgW2YgKC4uLiBmIChmIChmIGluaXQgZTEpIGUyKSBlMyAuLi4pIGVuXSwgd2hlcmUgW2UxLi5lbl1cbiAgICAgIGFyZSB0aGUgZWxlbWVudHMgb2YgW3RdLiAqKVxuICB2YWwgZm9sZCA6IF8gdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtmb2xkX3Jlc3VsdCB0IH5pbml0IH5mXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0gdGhhdCBydW5zIGluIHRoZVxuICAgICAgW1Jlc3VsdF0gbW9uYWQuICBJZiBbZl0gcmV0dXJucyBhbiBbRXJyb3IgX10sIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aG91dCBhbnlcbiAgICAgIGFkZGl0aW9uYWwgaW52b2NhdGlvbnMgb2YgW2ZdLiAqKVxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICBfIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gICgqKiBbZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2hdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXS4gSWYgW2ZdXG4gICAgICByZXR1cm5zIFtTdG9wIF9dIHRoZSBjb21wdXRhdGlvbiBjZWFzZXMgYW5kIHJlc3VsdHMgaW4gdGhhdCB2YWx1ZS4gSWYgW2ZdIHJldHVybnNcbiAgICAgIFtDb250aW51ZSBfXSwgdGhlIGZvbGQgd2lsbCBwcm9jZWVkLiBJZiBbZl0gbmV2ZXIgcmV0dXJucyBbU3RvcCBfXSwgdGhlIGZpbmFsIHJlc3VsdFxuICAgICAgaXMgY29tcHV0ZWQgYnkgW2ZpbmlzaF0uXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgbWF5YmVfbmVnYXRpdmUgPVxuICAgICAgICAgIHwgRm91bmRfbmVnYXRpdmUgb2YgaW50XG4gICAgICAgICAgfCBBbGxfbm9ubmVnYXRpdmUgb2YgeyBzdW0gOiBpbnQgfVxuXG4gICAgICAgICgqKiBbZmlyc3RfbmVnX29yX3N1bSBsaXN0XSByZXR1cm5zIHRoZSBmaXJzdCBuZWdhdGl2ZSBudW1iZXIgaW4gW2xpc3RdLCBpZiBhbnksXG4gICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsaXN0LiAqKVxuICAgICAgICBsZXQgZmlyc3RfbmVnX29yX3N1bSA9XG4gICAgICAgICAgTGlzdC5mb2xkX3VudGlsIH5pbml0OjBcbiAgICAgICAgICAgIH5mOihmdW4gc3VtIHggLT5cbiAgICAgICAgICAgICAgaWYgeCA8IDBcbiAgICAgICAgICAgICAgdGhlbiBTdG9wIChGb3VuZF9uZWdhdGl2ZSB4KVxuICAgICAgICAgICAgICBlbHNlIENvbnRpbnVlIChzdW0gKyB4KSlcbiAgICAgICAgICAgIH5maW5pc2g6KGZ1biBzdW0gLT4gQWxsX25vbm5lZ2F0aXZlIHsgc3VtIH0pXG4gICAgICAgIDs7XG5cbiAgICAgICAgbGV0IHggPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAzOyA0OyA1XVxuICAgICAgICB2YWwgeCA6IG1heWJlX25lZ2F0aXZlID0gQWxsX25vbm5lZ2F0aXZlIHtzdW0gPSAxNX1cblxuICAgICAgICBsZXQgeSA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IC0zOyA0OyA1XVxuICAgICAgICB2YWwgeSA6IG1heWJlX25lZ2F0aXZlID0gRm91bmRfbmVnYXRpdmUgLTNcbiAgICAgIF19ICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgXyB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlcmUgZXhpc3RzIGFuIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm92aWRlZFxuICAgICAgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXS4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGV4aXN0cyA6IF8gdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXSBmb3IgYWxsXG4gICAgICBlbGVtZW50cy4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGZvcl9hbGwgOiBfIHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBjb3VudCA6IF8gdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gaW50XG5cbiAgKCoqIFJldHVybnMgdGhlIHN1bSBvZiBbZiBpXSBmb3IgYWxsIFtpXSBpbiB0aGUgY29udGFpbmVyLiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlXG4gICAgICBlbGVtZW50cyB3aWxsIGJlIHN1bW1lZCBpcyB1bnNwZWNpZmllZC4gKilcbiAgdmFsIHN1bSA6IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKSAtPiBfIHQgLT4gZjooZWx0IC0+ICdzdW0pIC0+ICdzdW1cblxuICAoKiogUmV0dXJucyBhcyBhbiBbb3B0aW9uXSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggW2ZdIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgZmluZCA6IF8gdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gZWx0IG9wdGlvblxuXG4gICgqKiBSZXR1cm5zIHRoZSBmaXJzdCBldmFsdWF0aW9uIG9mIFtmXSB0aGF0IHJldHVybnMgW1NvbWVdLCBhbmQgcmV0dXJucyBbTm9uZV0gaWYgdGhlcmVcbiAgICAgIGlzIG5vIHN1Y2ggZWxlbWVudC4gICopXG4gIHZhbCBmaW5kX21hcCA6IF8gdCAtPiBmOihlbHQgLT4gJ2Egb3B0aW9uKSAtPiAnYSBvcHRpb25cblxuICB2YWwgdG9fbGlzdCA6IF8gdCAtPiBlbHQgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiBfIHQgLT4gZWx0IGFycmF5XG5cbiAgKCoqIFJldHVybnMgYSBtaW4gKHJlc3AgbWF4KSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIHByb3ZpZGVkIFtjb21wYXJlXVxuICAgICAgZnVuY3Rpb24sIG9yIFtOb25lXSBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4gIEluIGNhc2Ugb2YgYSB0aWUsIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICBlbmNvdW50ZXJlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZSBjb2xsZWN0aW9uIGlzIHJldHVybmVkLiAqKVxuICB2YWwgbWluX2VsdCA6IF8gdCAtPiBjb21wYXJlOihlbHQgLT4gZWx0IC0+IGludCkgLT4gZWx0IG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0IDogXyB0IC0+IGNvbXBhcmU6KGVsdCAtPiBlbHQgLT4gaW50KSAtPiBlbHQgb3B0aW9uXG5lbmRcblxuKCoqIFNpZ25hdHVyZSBmb3IgcG9seW1vcnBoaWMgY29udGFpbmVyLCBlLmcuLCBbJ2EgbGlzdF0gb3IgWydhIGFycmF5XS4gKilcbm1vZHVsZSB0eXBlIFMxID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gICgqKiBDaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyB0aGVyZSwgdXNpbmcgW2VxdWFsXS4gKilcbiAgdmFsIG1lbSA6ICdhIHQgLT4gJ2EgLT4gZXF1YWw6KCdhIC0+ICdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogJ2EgdCAtPiBib29sXG4gIHZhbCBpdGVyIDogJ2EgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIFtmb2xkIHQgfmluaXQgfmZdIHJldHVybnMgW2YgKC4uLiBmIChmIChmIGluaXQgZTEpIGUyKSBlMyAuLi4pIGVuXSwgd2hlcmUgW2UxLi5lbl1cbiAgICAgIGFyZSB0aGUgZWxlbWVudHMgb2YgW3RdICAqKVxuICB2YWwgZm9sZCA6ICdhIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtmb2xkX3Jlc3VsdCB0IH5pbml0IH5mXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0gdGhhdCBydW5zIGluIHRoZVxuICAgICAgW1Jlc3VsdF0gbW9uYWQuICBJZiBbZl0gcmV0dXJucyBhbiBbRXJyb3IgX10sIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aG91dCBhbnlcbiAgICAgIGFkZGl0aW9uYWwgaW52b2NhdGlvbnMgb2YgW2ZdLiAqKVxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gICgqKiBbZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2hdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXS4gSWYgW2ZdXG4gICAgICByZXR1cm5zIFtTdG9wIF9dIHRoZSBjb21wdXRhdGlvbiBjZWFzZXMgYW5kIHJlc3VsdHMgaW4gdGhhdCB2YWx1ZS4gSWYgW2ZdIHJldHVybnNcbiAgICAgIFtDb250aW51ZSBfXSwgdGhlIGZvbGQgd2lsbCBwcm9jZWVkLiBJZiBbZl0gbmV2ZXIgcmV0dXJucyBbU3RvcCBfXSwgdGhlIGZpbmFsIHJlc3VsdFxuICAgICAgaXMgY29tcHV0ZWQgYnkgW2ZpbmlzaF0uXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgbWF5YmVfbmVnYXRpdmUgPVxuICAgICAgICAgIHwgRm91bmRfbmVnYXRpdmUgb2YgaW50XG4gICAgICAgICAgfCBBbGxfbm9ubmVnYXRpdmUgb2YgeyBzdW0gOiBpbnQgfVxuXG4gICAgICAgICgqKiBbZmlyc3RfbmVnX29yX3N1bSBsaXN0XSByZXR1cm5zIHRoZSBmaXJzdCBuZWdhdGl2ZSBudW1iZXIgaW4gW2xpc3RdLCBpZiBhbnksXG4gICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsaXN0LiAqKVxuICAgICAgICBsZXQgZmlyc3RfbmVnX29yX3N1bSA9XG4gICAgICAgICAgTGlzdC5mb2xkX3VudGlsIH5pbml0OjBcbiAgICAgICAgICAgIH5mOihmdW4gc3VtIHggLT5cbiAgICAgICAgICAgICAgaWYgeCA8IDBcbiAgICAgICAgICAgICAgdGhlbiBTdG9wIChGb3VuZF9uZWdhdGl2ZSB4KVxuICAgICAgICAgICAgICBlbHNlIENvbnRpbnVlIChzdW0gKyB4KSlcbiAgICAgICAgICAgIH5maW5pc2g6KGZ1biBzdW0gLT4gQWxsX25vbm5lZ2F0aXZlIHsgc3VtIH0pXG4gICAgICAgIDs7XG5cbiAgICAgICAgbGV0IHggPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAzOyA0OyA1XVxuICAgICAgICB2YWwgeCA6IG1heWJlX25lZ2F0aXZlID0gQWxsX25vbm5lZ2F0aXZlIHtzdW0gPSAxNX1cblxuICAgICAgICBsZXQgeSA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IC0zOyA0OyA1XVxuICAgICAgICB2YWwgeSA6IG1heWJlX25lZ2F0aXZlID0gRm91bmRfbmVnYXRpdmUgLTNcbiAgICAgIF19ICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlcmUgZXhpc3RzIGFuIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm92aWRlZFxuICAgICAgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXS4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGV4aXN0cyA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXSBmb3IgYWxsXG4gICAgICBlbGVtZW50cy4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGZvcl9hbGwgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBjb3VudCA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gaW50XG5cbiAgKCoqIFJldHVybnMgdGhlIHN1bSBvZiBbZiBpXSBmb3IgYWxsIFtpXSBpbiB0aGUgY29udGFpbmVyLiAqKVxuICB2YWwgc3VtIDogKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pIC0+ICdhIHQgLT4gZjooJ2EgLT4gJ3N1bSkgLT4gJ3N1bVxuXG4gICgqKiBSZXR1cm5zIGFzIGFuIFtvcHRpb25dIHRoZSBmaXJzdCBlbGVtZW50IGZvciB3aGljaCBbZl0gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBmaW5kIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSBvcHRpb25cblxuICAoKiogUmV0dXJucyB0aGUgZmlyc3QgZXZhbHVhdGlvbiBvZiBbZl0gdGhhdCByZXR1cm5zIFtTb21lXSwgYW5kIHJldHVybnMgW05vbmVdIGlmIHRoZXJlXG4gICAgICBpcyBubyBzdWNoIGVsZW1lbnQuICAqKVxuICB2YWwgZmluZF9tYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG5cbiAgdmFsIHRvX2xpc3QgOiAnYSB0IC0+ICdhIGxpc3RcbiAgdmFsIHRvX2FycmF5IDogJ2EgdCAtPiAnYSBhcnJheVxuXG4gICgqKiBSZXR1cm5zIGEgbWluaW11bSAocmVzcCBtYXhpbXVtKSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIHByb3ZpZGVkXG4gICAgICBbY29tcGFyZV0gZnVuY3Rpb24sIG9yIFtOb25lXSBpZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4gSW4gY2FzZSBvZiBhIHRpZSwgdGhlIGZpcnN0XG4gICAgICBlbGVtZW50IGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgdGhlIGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQuIFRoZSBpbXBsZW1lbnRhdGlvblxuICAgICAgdXNlcyBbZm9sZF0gc28gaXQgaGFzIHRoZSBzYW1lIGNvbXBsZXhpdHkgYXMgW2ZvbGRdLiAqKVxuICB2YWwgbWluX2VsdCA6ICdhIHQgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBvcHRpb25cblxuICB2YWwgbWF4X2VsdCA6ICdhIHQgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBvcHRpb25cbmVuZFxuXG5tb2R1bGUgdHlwZSBTMV9waGFudG9tX2ludmFyaWFudCA9IHNpZ1xuICB0eXBlICgnYSwgJ3BoYW50b20pIHRcblxuICAoKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgdGhlcmUsIHVzaW5nIFtlcXVhbF0uICopXG4gIHZhbCBtZW0gOiAoJ2EsIF8pIHQgLT4gJ2EgLT4gZXF1YWw6KCdhIC0+ICdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICB2YWwgbGVuZ3RoIDogKF8sIF8pIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBbZm9sZCB0IH5pbml0IH5mXSByZXR1cm5zIFtmICguLi4gZiAoZiAoZiBpbml0IGUxKSBlMikgZTMgLi4uKSBlbl0sIHdoZXJlIFtlMS4uZW5dXG4gICAgICBhcmUgdGhlIGVsZW1lbnRzIG9mIFt0XS4gKilcbiAgdmFsIGZvbGQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtmb2xkX3Jlc3VsdCB0IH5pbml0IH5mXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0gdGhhdCBydW5zIGluIHRoZVxuICAgICAgW1Jlc3VsdF0gbW9uYWQuICBJZiBbZl0gcmV0dXJucyBhbiBbRXJyb3IgX10sIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aG91dCBhbnlcbiAgICAgIGFkZGl0aW9uYWwgaW52b2NhdGlvbnMgb2YgW2ZdLiAqKVxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgKCoqIFtmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaF0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdLiBJZiBbZl1cbiAgICAgIHJldHVybnMgW1N0b3AgX10gdGhlIGNvbXB1dGF0aW9uIGNlYXNlcyBhbmQgcmVzdWx0cyBpbiB0aGF0IHZhbHVlLiBJZiBbZl0gcmV0dXJuc1xuICAgICAgW0NvbnRpbnVlIF9dLCB0aGUgZm9sZCB3aWxsIHByb2NlZWQuIElmIFtmXSBuZXZlciByZXR1cm5zIFtTdG9wIF9dLCB0aGUgZmluYWwgcmVzdWx0XG4gICAgICBpcyBjb21wdXRlZCBieSBbZmluaXNoXS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBtYXliZV9uZWdhdGl2ZSA9XG4gICAgICAgICAgfCBGb3VuZF9uZWdhdGl2ZSBvZiBpbnRcbiAgICAgICAgICB8IEFsbF9ub25uZWdhdGl2ZSBvZiB7IHN1bSA6IGludCB9XG5cbiAgICAgICAgKCoqIFtmaXJzdF9uZWdfb3Jfc3VtIGxpc3RdIHJldHVybnMgdGhlIGZpcnN0IG5lZ2F0aXZlIG51bWJlciBpbiBbbGlzdF0sIGlmIGFueSxcbiAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGxpc3QuICopXG4gICAgICAgIGxldCBmaXJzdF9uZWdfb3Jfc3VtID1cbiAgICAgICAgICBMaXN0LmZvbGRfdW50aWwgfmluaXQ6MFxuICAgICAgICAgICAgfmY6KGZ1biBzdW0geCAtPlxuICAgICAgICAgICAgICBpZiB4IDwgMFxuICAgICAgICAgICAgICB0aGVuIFN0b3AgKEZvdW5kX25lZ2F0aXZlIHgpXG4gICAgICAgICAgICAgIGVsc2UgQ29udGludWUgKHN1bSArIHgpKVxuICAgICAgICAgICAgfmZpbmlzaDooZnVuIHN1bSAtPiBBbGxfbm9ubmVnYXRpdmUgeyBzdW0gfSlcbiAgICAgICAgOztcblxuICAgICAgICBsZXQgeCA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IDM7IDQ7IDVdXG4gICAgICAgIHZhbCB4IDogbWF5YmVfbmVnYXRpdmUgPSBBbGxfbm9ubmVnYXRpdmUge3N1bSA9IDE1fVxuXG4gICAgICAgIGxldCB5ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgLTM7IDQ7IDVdXG4gICAgICAgIHZhbCB5IDogbWF5YmVfbmVnYXRpdmUgPSBGb3VuZF9uZWdhdGl2ZSAtM1xuICAgICAgXX0gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGV4aXN0cyBhbiBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvdmlkZWRcbiAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0uICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBleGlzdHMgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXSBmb3IgYWxsXG4gICAgICBlbGVtZW50cy4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGZvcl9hbGwgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGNvdW50IDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGludFxuXG4gICgqKiBSZXR1cm5zIHRoZSBzdW0gb2YgW2YgaV0gZm9yIGFsbCBbaV0gaW4gdGhlIGNvbnRhaW5lci4gKilcbiAgdmFsIHN1bSA6IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKSAtPiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gJ3N1bSkgLT4gJ3N1bVxuXG4gICgqKiBSZXR1cm5zIGFzIGFuIFtvcHRpb25dIHRoZSBmaXJzdCBlbGVtZW50IGZvciB3aGljaCBbZl0gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBmaW5kIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIG9wdGlvblxuXG4gICgqKiBSZXR1cm5zIHRoZSBmaXJzdCBldmFsdWF0aW9uIG9mIFtmXSB0aGF0IHJldHVybnMgW1NvbWVdLCBhbmQgcmV0dXJucyBbTm9uZV0gaWYgdGhlcmVcbiAgICAgIGlzIG5vIHN1Y2ggZWxlbWVudC4gICopXG4gIHZhbCBmaW5kX21hcCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuXG4gIHZhbCB0b19saXN0IDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIHRvX2FycmF5IDogKCdhLCBfKSB0IC0+ICdhIGFycmF5XG5cbiAgKCoqIFJldHVybnMgYSBtaW4gKHJlc3AgbWF4KSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIHByb3ZpZGVkIFtjb21wYXJlXVxuICAgICAgZnVuY3Rpb24uIEluIGNhc2Ugb2YgYSB0aWUsIHRoZSBmaXJzdCBlbGVtZW50IGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgdGhlXG4gICAgICBjb2xsZWN0aW9uIGlzIHJldHVybmVkLiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBbZm9sZF0gc28gaXQgaGFzIHRoZSBzYW1lIGNvbXBsZXhpdHlcbiAgICAgIGFzIFtmb2xkXS4gUmV0dXJucyBbTm9uZV0gaWZmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiAqKVxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludCkgLT4gJ2Egb3B0aW9uXG5lbmRcblxubW9kdWxlIHR5cGUgUzFfcGhhbnRvbSA9IHNpZ1xuICB0eXBlICgnYSwgKydwaGFudG9tKSB0XG5cbiAgaW5jbHVkZSBTMV9waGFudG9tX2ludmFyaWFudCB3aXRoIHR5cGUgKCdhLCAncGhhbnRvbSkgdCA6PSAoJ2EsICdwaGFudG9tKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgR2VuZXJpYyA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSAnYSBlbHRcblxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiBfIHQgLT4gYm9vbFxuICB2YWwgaXRlciA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGZvbGQgOiAnYSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBleGlzdHMgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsIDogJ2EgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBpbnRcbiAgdmFsIHN1bSA6IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKSAtPiAnYSB0IC0+IGY6KCdhIGVsdCAtPiAnc3VtKSAtPiAnc3VtXG4gIHZhbCBmaW5kIDogJ2EgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgZmluZF9tYXAgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuICB2YWwgdG9fbGlzdCA6ICdhIHQgLT4gJ2EgZWx0IGxpc3RcbiAgdmFsIHRvX2FycmF5IDogJ2EgdCAtPiAnYSBlbHQgYXJyYXlcbiAgdmFsIG1pbl9lbHQgOiAnYSB0IC0+IGNvbXBhcmU6KCdhIGVsdCAtPiAnYSBlbHQgLT4gaW50KSAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBtYXhfZWx0IDogJ2EgdCAtPiBjb21wYXJlOignYSBlbHQgLT4gJ2EgZWx0IC0+IGludCkgLT4gJ2EgZWx0IG9wdGlvblxuZW5kXG5cbm1vZHVsZSB0eXBlIEdlbmVyaWNfcGhhbnRvbSA9IHNpZ1xuICB0eXBlICgnYSwgJ3BoYW50b20pIHRcbiAgdHlwZSAnYSBlbHRcblxuICB2YWwgbGVuZ3RoIDogKF8sIF8pIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGZvbGQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBleGlzdHMgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGwgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBpbnRcblxuICB2YWwgc3VtXG4gICAgOiAgKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pXG4gICAgLT4gKCdhLCBfKSB0XG4gICAgLT4gZjooJ2EgZWx0IC0+ICdzdW0pXG4gICAgLT4gJ3N1bVxuXG4gIHZhbCBmaW5kIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBmaW5kX21hcCA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cbiAgdmFsIHRvX2xpc3QgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IGxpc3RcbiAgdmFsIHRvX2FycmF5IDogKCdhLCBfKSB0IC0+ICdhIGVsdCBhcnJheVxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiBjb21wYXJlOignYSBlbHQgLT4gJ2EgZWx0IC0+IGludCkgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiBjb21wYXJlOignYSBlbHQgLT4gJ2EgZWx0IC0+IGludCkgLT4gJ2EgZWx0IG9wdGlvblxuZW5kXG5cbm1vZHVsZSB0eXBlIE1ha2VfZ2VuX2FyZyA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSAnYSBlbHRcblxuICB2YWwgZm9sZCA6ICdhIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBUaGUgW2l0ZXJdIGFyZ3VtZW50IHRvIFtDb250YWluZXIuTWFrZV0gc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQgdGhlXG4gICAgICBjb250YWluZXIncyBbaXRlcl0gZnVuY3Rpb24uICBbYERlZmluZV91c2luZ19mb2xkXSBtZWFucyB0byBkZWZpbmUgW2l0ZXJdXG4gICAgICB2aWE6XG5cbiAgICAgIHtbXG4gICAgICAgIGl0ZXIgdCB+ZiA9IENvbnRhaW5lci5pdGVyIH5mb2xkIHQgfmZcbiAgICAgIF19XG5cbiAgICAgIFtgQ3VzdG9tXSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHByZXN1bWFibHkgd2l0aCBzb21ldGhpbmcgbW9yZVxuICAgICAgZWZmaWNpZW50LiAgU2V2ZXJhbCBvdGhlciBmdW5jdGlvbnMgcmV0dXJuZWQgYnkgW0NvbnRhaW5lci5NYWtlXSBhcmUgZGVmaW5lZCBpblxuICAgICAgdGVybXMgb2YgW2l0ZXJdLCBzbyBwYXNzaW5nIGluIGEgbW9yZSBlZmZpY2llbnQgW2l0ZXJdIHdpbGwgaW1wcm92ZSB0aGVpciBlZmZpY2llbmN5XG4gICAgICBhcyB3ZWxsLiAqKVxuICB2YWwgaXRlciA6IFsgYERlZmluZV91c2luZ19mb2xkIHwgYEN1c3RvbSBvZiAnYSB0IC0+IGY6KCdhIGVsdCAtPiB1bml0KSAtPiB1bml0IF1cblxuICAoKiogVGhlIFtsZW5ndGhdIGFyZ3VtZW50IHRvIFtDb250YWluZXIuTWFrZV0gc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQgdGhlXG4gICAgICBjb250YWluZXIncyBbbGVuZ3RoXSBmdW5jdGlvbi4gIFtgRGVmaW5lX3VzaW5nX2ZvbGRdIG1lYW5zIHRvIGRlZmluZVxuICAgICAgW2xlbmd0aF0gdmlhOlxuXG4gICAgICB7W1xuICAgICAgICBsZW5ndGggdCB+ZiA9IENvbnRhaW5lci5sZW5ndGggfmZvbGQgdCB+ZlxuICAgICAgXX1cblxuICAgICAgW2BDdXN0b21dIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgcHJlc3VtYWJseSB3aXRoIHNvbWV0aGluZyBtb3JlXG4gICAgICBlZmZpY2llbnQuICBTZXZlcmFsIG90aGVyIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBbQ29udGFpbmVyLk1ha2VdIGFyZSBkZWZpbmVkIGluXG4gICAgICB0ZXJtcyBvZiBbbGVuZ3RoXSwgc28gcGFzc2luZyBpbiBhIG1vcmUgZWZmaWNpZW50IFtsZW5ndGhdIHdpbGwgaW1wcm92ZSB0aGVpclxuICAgICAgZWZmaWNpZW5jeSBhcyB3ZWxsLiAqKVxuICB2YWwgbGVuZ3RoIDogWyBgRGVmaW5lX3VzaW5nX2ZvbGQgfCBgQ3VzdG9tIG9mICdhIHQgLT4gaW50IF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBNYWtlX2FyZyA9IE1ha2VfZ2VuX2FyZyB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIE1vbmFkLklkZW50LnRcblxubW9kdWxlIHR5cGUgTWFrZTBfYXJnID0gc2lnXG4gIG1vZHVsZSBFbHQgOiBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sXG4gIGVuZFxuXG4gIHR5cGUgdFxuXG4gIGluY2x1ZGUgTWFrZV9nZW5fYXJnIHdpdGggdHlwZSAnYSB0IDo9IHQgYW5kIHR5cGUgJ2EgZWx0IDo9IEVsdC50XG5lbmRcblxubW9kdWxlIHR5cGUgQ29udGFpbmVyID0gc2lnXG4gIGluY2x1ZGUgbW9kdWxlIHR5cGUgb2Ygc3RydWN0XG4gICAgaW5jbHVkZSBFeHBvcnRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzAgPSBTMFxuICBtb2R1bGUgdHlwZSBTMF9waGFudG9tID0gUzBfcGhhbnRvbVxuICBtb2R1bGUgdHlwZSBTMSA9IFMxXG4gIG1vZHVsZSB0eXBlIFMxX3BoYW50b21faW52YXJpYW50ID0gUzFfcGhhbnRvbV9pbnZhcmlhbnRcbiAgbW9kdWxlIHR5cGUgUzFfcGhhbnRvbSA9IFMxX3BoYW50b21cbiAgbW9kdWxlIHR5cGUgR2VuZXJpYyA9IEdlbmVyaWNcbiAgbW9kdWxlIHR5cGUgR2VuZXJpY19waGFudG9tID0gR2VuZXJpY19waGFudG9tXG4gIG1vZHVsZSB0eXBlIFN1bW1hYmxlID0gU3VtbWFibGVcblxuICAoKiogR2VuZXJpYyBkZWZpbml0aW9ucyBvZiBjb250YWluZXIgb3BlcmF0aW9ucyBpbiB0ZXJtcyBvZiBbZm9sZF0uXG5cbiAgICAgIEUuZy46IFtpdGVyIH5mb2xkIHQgfmYgPSBmb2xkIHQgfmluaXQ6KCkgfmY6KGZ1biAoKSBhIC0+IGYgYSldLiAqKVxuXG4gIHR5cGUgKCd0LCAnYSwgJ2FjY3VtKSBmb2xkID0gJ3QgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG4gIHR5cGUgKCd0LCAnYSkgaXRlciA9ICd0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgdHlwZSAndCBsZW5ndGggPSAndCAtPiBpbnRcblxuICB2YWwgaXRlciA6IGZvbGQ6KCd0LCAnYSwgdW5pdCkgZm9sZCAtPiAoJ3QsICdhKSBpdGVyXG4gIHZhbCBjb3VudCA6IGZvbGQ6KCd0LCAnYSwgaW50KSBmb2xkIC0+ICd0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGludFxuXG4gIHZhbCBtaW5fZWx0XG4gICAgOiAgZm9sZDooJ3QsICdhLCAnYSBvcHRpb24pIGZvbGRcbiAgICAtPiAndFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludClcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgbWF4X2VsdFxuICAgIDogIGZvbGQ6KCd0LCAnYSwgJ2Egb3B0aW9uKSBmb2xkXG4gICAgLT4gJ3RcbiAgICAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpXG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIGxlbmd0aCA6IGZvbGQ6KCd0LCBfLCBpbnQpIGZvbGQgLT4gJ3QgLT4gaW50XG4gIHZhbCB0b19saXN0IDogZm9sZDooJ3QsICdhLCAnYSBsaXN0KSBmb2xkIC0+ICd0IC0+ICdhIGxpc3RcblxuICB2YWwgc3VtXG4gICAgOiAgZm9sZDooJ3QsICdhLCAnc3VtKSBmb2xkXG4gICAgLT4gKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pXG4gICAgLT4gJ3RcbiAgICAtPiBmOignYSAtPiAnc3VtKVxuICAgIC0+ICdzdW1cblxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICBmb2xkOigndCwgJ2EsICdiKSBmb2xkXG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+ICdhIC0+ICgnYiwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICd0XG4gICAgLT4gKCdiLCAnZSkgUmVzdWx0LnRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogIGZvbGQ6KCd0LCAnYSwgJ2IpIGZvbGRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gJ2EgLT4gKCdiLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdiIC0+ICdmaW5hbClcbiAgICAtPiAndFxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBHZW5lcmljIGRlZmluaXRpb25zIG9mIGNvbnRhaW5lciBvcGVyYXRpb25zIGluIHRlcm1zIG9mIFtpdGVyXSBhbmQgW2xlbmd0aF0uICopXG4gIHZhbCBpc19lbXB0eSA6IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiBib29sXG5cbiAgdmFsIGV4aXN0cyA6IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsIDogaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZpbmQgOiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2Egb3B0aW9uXG4gIHZhbCBmaW5kX21hcCA6IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuICB2YWwgdG9fYXJyYXkgOiBsZW5ndGg6J3QgbGVuZ3RoIC0+IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiAnYSBhcnJheVxuXG4gICgqKiBUaGUgaWRpb20gZm9yIHVzaW5nIFtDb250YWluZXIuTWFrZV0gaXMgdG8gYmluZCB0aGUgcmVzdWx0aW5nIG1vZHVsZSBhbmQgdG9cbiAgICAgIGV4cGxpY2l0bHkgaW1wb3J0IGVhY2ggb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IG9uZSB3YW50czpcblxuICAgICAge1tcbiAgICAgICAgbW9kdWxlIEMgPSBDb250YWluZXIuTWFrZSAoc3RydWN0IC4uLiBlbmQpXG4gICAgICAgIGxldCBjb3VudCAgICA9IEMuY291bnRcbiAgICAgICAgbGV0IGV4aXN0cyAgID0gQy5leGlzdHNcbiAgICAgICAgbGV0IGZpbmQgICAgID0gQy5maW5kXG4gICAgICAgICgqIC4uLiAqKVxuICAgICAgXX1cblxuICAgICAgVGhpcyBpcyBwcmVmZXJhYmxlIHRvOlxuXG4gICAgICB7W1xuICAgICAgICBpbmNsdWRlIENvbnRhaW5lci5NYWtlIChzdHJ1Y3QgLi4uIGVuZClcbiAgICAgIF19XG5cbiAgICAgIGJlY2F1c2UgdGhlIFtpbmNsdWRlXSBtYWtlcyBpdCB0b28gZWFzeSB0byBzaGFkb3cgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zIG9mXG4gICAgICBjb250YWluZXIgZnVuY3Rpb25zIChbbGVuZ3RoXSBiZWluZyBhIGNvbW1vbiBvbmUpLlxuXG4gICAgICBbQ29udGFpbmVyLk1ha2UwXSBpcyBsaWtlIFtDb250YWluZXIuTWFrZV0sIGJ1dCBmb3IgbW9ub21vcnBoaWMgY29udGFpbmVycyBsaWtlXG4gICAgICBbc3RyaW5nXS4gKilcbiAgbW9kdWxlIE1ha2UgKFQgOiBNYWtlX2FyZykgOiBTMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBULnRcblxuICBtb2R1bGUgTWFrZTAgKFQgOiBNYWtlMF9hcmcpIDogUzAgd2l0aCB0eXBlIHQgOj0gVC50IGFuZCB0eXBlIGVsdCA6PSBULkVsdC50XG5cbiAgbW9kdWxlIE1ha2VfZ2VuIChUIDogTWFrZV9nZW5fYXJnKSA6XG4gICAgR2VuZXJpYyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBULnQgYW5kIHR5cGUgJ2EgZWx0IDo9ICdhIFQuZWx0XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5tb2R1bGUgTGlzdCA9IExpc3QwXG5pbmNsdWRlIENvbnRhaW5lcl9pbnRmXG5cbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5cbnR5cGUgKCd0LCAnYSwgJ2FjY3VtKSBmb2xkID0gJ3QgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG50eXBlICgndCwgJ2EpIGl0ZXIgPSAndCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG50eXBlICd0IGxlbmd0aCA9ICd0IC0+IGludFxuXG5sZXQgaXRlciB+Zm9sZCB0IH5mID0gZm9sZCB0IH5pbml0OigpIH5mOihmdW4gKCkgYSAtPiBmIGEpXG5sZXQgY291bnQgfmZvbGQgdCB+ZiA9IGZvbGQgdCB+aW5pdDowIH5mOihmdW4gbiBhIC0+IGlmIGYgYSB0aGVuIG4gKyAxIGVsc2UgbilcblxubGV0IHN1bSAodHlwZSBhKSB+Zm9sZCAobW9kdWxlIE0gOiBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9IGEpIHQgfmYgPVxuICBmb2xkIHQgfmluaXQ6TS56ZXJvIH5mOihmdW4gbiBhIC0+IE0uKCArICkgbiAoZiBhKSlcbjs7XG5cbmxldCBmb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0ID1cbiAgd2l0aF9yZXR1cm4gKGZ1biB7IHJldHVybiB9IC0+XG4gICAgUmVzdWx0Lk9rXG4gICAgICAoZm9sZCB0IH5pbml0IH5mOihmdW4gYWNjIGl0ZW0gLT5cbiAgICAgICAgIG1hdGNoIGYgYWNjIGl0ZW0gd2l0aFxuICAgICAgICAgfCBSZXN1bHQuT2sgeCAtPiB4XG4gICAgICAgICB8IEVycm9yIF8gYXMgZSAtPiByZXR1cm4gZSkpKVxuOztcblxubGV0IGZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgfmZpbmlzaCB0ID1cbiAgd2l0aF9yZXR1cm4gKGZ1biB7IHJldHVybiB9IC0+XG4gICAgZmluaXNoXG4gICAgICAoZm9sZCB0IH5pbml0IH5mOihmdW4gYWNjIGl0ZW0gLT5cbiAgICAgICAgIG1hdGNoIGYgYWNjIGl0ZW0gd2l0aFxuICAgICAgICAgfCBDb250aW51ZV9vcl9zdG9wLkNvbnRpbnVlIHggLT4geFxuICAgICAgICAgfCBTdG9wIHggLT4gcmV0dXJuIHgpKSlcbjs7XG5cbmxldCBtaW5fZWx0IH5mb2xkIHQgfmNvbXBhcmUgPVxuICBmb2xkIHQgfmluaXQ6Tm9uZSB+ZjooZnVuIGFjYyBlbHQgLT5cbiAgICBtYXRjaCBhY2Mgd2l0aFxuICAgIHwgTm9uZSAtPiBTb21lIGVsdFxuICAgIHwgU29tZSBtaW4gLT4gaWYgY29tcGFyZSBtaW4gZWx0ID4gMCB0aGVuIFNvbWUgZWx0IGVsc2UgYWNjKVxuOztcblxubGV0IG1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZSA9XG4gIGZvbGQgdCB+aW5pdDpOb25lIH5mOihmdW4gYWNjIGVsdCAtPlxuICAgIG1hdGNoIGFjYyB3aXRoXG4gICAgfCBOb25lIC0+IFNvbWUgZWx0XG4gICAgfCBTb21lIG1heCAtPiBpZiBjb21wYXJlIG1heCBlbHQgPCAwIHRoZW4gU29tZSBlbHQgZWxzZSBhY2MpXG47O1xuXG5sZXQgbGVuZ3RoIH5mb2xkIGMgPSBmb2xkIGMgfmluaXQ6MCB+ZjooZnVuIGFjYyBfIC0+IGFjYyArIDEpXG5cbmxldCBpc19lbXB0eSB+aXRlciBjID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciBjIH5mOihmdW4gXyAtPiByLnJldHVybiBmYWxzZSk7XG4gICAgdHJ1ZSlcbjs7XG5cbmxldCBleGlzdHMgfml0ZXIgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgYyB+ZjooZnVuIHggLT4gaWYgZiB4IHRoZW4gci5yZXR1cm4gdHJ1ZSk7XG4gICAgZmFsc2UpXG47O1xuXG5sZXQgZm9yX2FsbCB+aXRlciBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciBjIH5mOihmdW4geCAtPiBpZiBub3QgKGYgeCkgdGhlbiByLnJldHVybiBmYWxzZSk7XG4gICAgdHJ1ZSlcbjs7XG5cbmxldCBmaW5kX21hcCB+aXRlciB0IH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciB0IH5mOihmdW4geCAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgfCBTb21lIF8gYXMgcmVzIC0+IHIucmV0dXJuIHJlcyk7XG4gICAgTm9uZSlcbjs7XG5cbmxldCBmaW5kIH5pdGVyIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyIGMgfmY6KGZ1biB4IC0+IGlmIGYgeCB0aGVuIHIucmV0dXJuIChTb21lIHgpKTtcbiAgICBOb25lKVxuOztcblxubGV0IHRvX2xpc3QgfmZvbGQgYyA9IExpc3QucmV2IChmb2xkIGMgfmluaXQ6W10gfmY6KGZ1biBhY2MgeCAtPiB4IDo6IGFjYykpXG5cbmxldCB0b19hcnJheSB+bGVuZ3RoIH5pdGVyIGMgPVxuICBsZXQgYXJyYXkgPSByZWYgW3x8XSBpblxuICBsZXQgaSA9IHJlZiAwIGluXG4gIGl0ZXIgYyB+ZjooZnVuIHggLT5cbiAgICBpZiAhaSA9IDAgdGhlbiBhcnJheSA6PSBBcnJheS5jcmVhdGUgfmxlbjoobGVuZ3RoIGMpIHg7XG4gICAgIWFycmF5LighaSkgPC0geDtcbiAgICBpbmNyIGkpO1xuICAhYXJyYXlcbjs7XG5cbm1vZHVsZSBNYWtlX2dlbiAoVCA6IE1ha2VfZ2VuX2FyZykgOiBzaWdcbiAgaW5jbHVkZSBHZW5lcmljIHdpdGggdHlwZSAnYSB0IDo9ICdhIFQudCB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIFQuZWx0XG5lbmQgPSBzdHJ1Y3RcbiAgbGV0IGZvbGQgPSBULmZvbGRcblxuICBsZXQgaXRlciA9XG4gICAgbWF0Y2ggVC5pdGVyIHdpdGhcbiAgICB8IGBDdXN0b20gaXRlciAtPiBpdGVyXG4gICAgfCBgRGVmaW5lX3VzaW5nX2ZvbGQgLT4gZnVuIHQgfmYgLT4gaXRlciB+Zm9sZCB0IH5mXG4gIDs7XG5cbiAgbGV0IGxlbmd0aCA9XG4gICAgbWF0Y2ggVC5sZW5ndGggd2l0aFxuICAgIHwgYEN1c3RvbSBsZW5ndGggLT4gbGVuZ3RoXG4gICAgfCBgRGVmaW5lX3VzaW5nX2ZvbGQgLT4gZnVuIHQgLT4gbGVuZ3RoIH5mb2xkIHRcbiAgOztcblxuICBsZXQgaXNfZW1wdHkgdCA9IGlzX2VtcHR5IH5pdGVyIHRcbiAgbGV0IHN1bSBtIHQgPSBzdW0gfmZvbGQgbSB0XG4gIGxldCBjb3VudCB0IH5mID0gY291bnQgfmZvbGQgdCB+ZlxuICBsZXQgZXhpc3RzIHQgfmYgPSBleGlzdHMgfml0ZXIgdCB+ZlxuICBsZXQgZm9yX2FsbCB0IH5mID0gZm9yX2FsbCB+aXRlciB0IH5mXG4gIGxldCBmaW5kX21hcCB0IH5mID0gZmluZF9tYXAgfml0ZXIgdCB+ZlxuICBsZXQgZmluZCB0IH5mID0gZmluZCB+aXRlciB0IH5mXG4gIGxldCB0b19saXN0IHQgPSB0b19saXN0IH5mb2xkIHRcbiAgbGV0IHRvX2FycmF5IHQgPSB0b19hcnJheSB+bGVuZ3RoIH5pdGVyIHRcbiAgbGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IG1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuICBsZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gbWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG4gIGxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gZm9sZF9yZXN1bHQgdCB+Zm9sZCB+aW5pdCB+ZlxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2ggPSBmb2xkX3VudGlsIHQgfmZvbGQgfmluaXQgfmYgfmZpbmlzaFxuZW5kXG5cbm1vZHVsZSBNYWtlIChUIDogTWFrZV9hcmcpID0gc3RydWN0XG4gIGluY2x1ZGUgTWFrZV9nZW4gKHN0cnVjdFxuICAgICAgaW5jbHVkZSBUXG5cbiAgICAgIHR5cGUgJ2EgZWx0ID0gJ2FcbiAgICBlbmQpXG5cbiAgbGV0IG1lbSB0IGEgfmVxdWFsID0gZXhpc3RzIHQgfmY6KGVxdWFsIGEpXG5lbmRcblxubW9kdWxlIE1ha2UwIChUIDogTWFrZTBfYXJnKSA9IHN0cnVjdFxuICBpbmNsdWRlIE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgVFxuXG4gICAgICB0eXBlICdhIHQgPSBULnRcbiAgICAgIHR5cGUgJ2EgZWx0ID0gVC5FbHQudFxuICAgIGVuZClcblxuICBsZXQgbWVtIHQgZWx0ID0gZXhpc3RzIHQgfmY6KFQuRWx0LmVxdWFsIGVsdClcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIENhbWwuTGF6eVxuXG50eXBlICdhIHQgPSAnYSBsYXp5X3QgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9IGxhenlfdF9vZl9zZXhwXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID0gc2V4cF9vZl9sYXp5X3RcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gbGF6eV90X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgbWFwIHQgfmYgPSBsYXp5IChmIChmb3JjZSB0KSlcblxubGV0IGNvbXBhcmUgY29tcGFyZV9hIHQxIHQyID1cbiAgaWYgcGh5c19lcXVhbCB0MSB0MiB0aGVuIDAgZWxzZSBjb21wYXJlX2EgKGZvcmNlIHQxKSAoZm9yY2UgdDIpXG47O1xuXG5sZXQgZXF1YWwgZXF1YWxfYSB0MSB0MiA9IGlmIHBoeXNfZXF1YWwgdDEgdDIgdGhlbiB0cnVlIGVsc2UgZXF1YWxfYSAoZm9yY2UgdDEpIChmb3JjZSB0MilcbmxldCBoYXNoX2ZvbGRfdCA9IEhhc2guQnVpbHRpbi5oYXNoX2ZvbGRfbGF6eV90XG5cbmluY2x1ZGUgTW9uYWQuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCByZXR1cm4geCA9IGZyb21fdmFsIHhcbiAgICBsZXQgYmluZCB0IH5mID0gbGF6eSAoZm9yY2UgKGYgKGZvcmNlIHQpKSlcbiAgICBsZXQgbWFwID0gbWFwXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gIGVuZClcblxubW9kdWxlIFRfdW5mb3JjaW5nID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9XG4gICAgaWYgaXNfdmFsIHQgdGhlbiBzZXhwX29mX2EgKGZvcmNlIHQpIGVsc2Ugc2V4cF9vZl9zdHJpbmcgXCI8dW5mb3JjZWQgbGF6eT5cIlxuICA7O1xuZW5kXG4iLCIoKiBTcGxpdCBvZmYgdG8gYXZvaWQgYSBjeWNsaWMgZGVwZW5kZW5jeSB3aXRoIFtPcl9lcnJvcl0uICopXG5cbm9wZW4hIEltcG9ydFxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxuXG5sZXQgc2xvd19jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aCA9XG4gIGlmIHBvcyA8IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJOZWdhdGl2ZSBwb3NpdGlvbjogJWRcIiBwb3MgKCk7XG4gIGlmIGxlbiA8IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJOZWdhdGl2ZSBsZW5ndGg6ICVkXCIgbGVuICgpO1xuICAoKiBXZSB1c2UgW3BvcyA+IHRvdGFsX2xlbmd0aCAtIGxlbl0gcmF0aGVyIHRoYW4gW3BvcyArIGxlbiA+IHRvdGFsX2xlbmd0aF0gdG8gYXZvaWQgdGhlXG4gICAgIHBvc3NpYmlsaXR5IG9mIG92ZXJmbG93LiAqKVxuICBpZiBwb3MgPiB0b3RhbF9sZW5ndGggLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJwb3MgKyBsZW4gcGFzdCBlbmQ6ICVkICsgJWQgPiAlZFwiIHBvcyBsZW4gdG90YWxfbGVuZ3RoICgpXG5bQEBjb2xkXSBbQEBpbmxpbmUgbmV2ZXJdIFtAQGxvY2FsIG5ldmVyXSBbQEBzcGVjaWFsaXNlIG5ldmVyXVxuOztcblxubGV0IGNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoID1cbiAgKCogVGhpcyBpcyBiZXR0ZXIgdGhhbiBbc2xvd19jaGVja19wb3NfbGVuX2V4bl0gZm9yIHR3byByZWFzb25zOlxuXG4gICAgIC0gbXVjaCBsZXNzIGlubGluZWQgY29kZVxuICAgICAtIG9ubHkgb25lIGNvbmRpdGlvbmFsIGp1bXBcblxuICAgICBUaGUgcmVhc29uIGl0IHdvcmtzIGlzIHRoYXQgY2hlY2tpbmcgWzwgMF0gaXMgdGVzdGluZyB0aGUgaGlnaGVzdCBvcmRlciBiaXQsIHNvXG4gICAgIFthIDwgMCB8fCBiIDwgMF0gaXMgdGhlIHNhbWUgYXMgW2EgbG9yIGIgPCAwXS5cblxuICAgICBbcG9zICsgbGVuXSBjYW4gb3ZlcmZsb3csIHNvIFtwb3MgPiB0b3RhbF9sZW5ndGggLSBsZW5dIGlzIG5vdCBlcXVpdmFsZW50IHRvXG4gICAgIFt0b3RhbF9sZW5ndGggLSBsZW4gLSBwb3MgPCAwXSwgd2UgbmVlZCB0byB0ZXN0IGZvciBbcG9zICsgbGVuXSBvdmVyZmxvdyBhc1xuICAgICB3ZWxsLiAqKVxuICBsZXQgc3RvcCA9IHBvcyArIGxlbiBpblxuICBpZiBwb3MgbG9yIGxlbiBsb3Igc3RvcCBsb3IgKHRvdGFsX2xlbmd0aCAtIHN0b3ApIDwgMFxuICB0aGVuIHNsb3dfY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGhcbjs7XG5cbmxldCBnZXRfcG9zX2xlbl9leG4gPyhwb3MgPSAwKSA/bGVuICgpIH50b3RhbF9sZW5ndGggPVxuICBsZXQgbGVuID1cbiAgICBtYXRjaCBsZW4gd2l0aFxuICAgIHwgU29tZSBpIC0+IGlcbiAgICB8IE5vbmUgLT4gdG90YWxfbGVuZ3RoIC0gcG9zXG4gIGluXG4gIGNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoO1xuICBwb3MsIGxlblxuOztcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbGV0IHNsb3dfY2hlY2tfcG9zX2xlbl9leG4gPSBzbG93X2NoZWNrX3Bvc19sZW5fZXhuXG5lbmRcbiIsIlxubW9kdWxlIFJlcHIgPSBzdHJ1Y3RcbiAgb3BlbiBDYW1sLkJpZ2FycmF5XG5cbiAgdHlwZSB0ID0gKGludDY0LCBpbnQ2NF9lbHQsIGNfbGF5b3V0KSBBcnJheTEudFxuXG4gIGxldCBvZl9zdGF0ZSA6IENhbWwuUmFuZG9tLlN0YXRlLnQgLT4gdCA9IENhbWwuT2JqLm1hZ2ljXG5lbmRcblxubGV0IGFzc2lnbiBkc3Qgc3JjID1cbiAgbGV0IGRzdCA9IFJlcHIub2Zfc3RhdGUgKExhenkuZm9yY2UgZHN0KSBpblxuICBsZXQgc3JjID0gUmVwci5vZl9zdGF0ZSAoTGF6eS5mb3JjZSBzcmMpIGluXG4gIENhbWwuQmlnYXJyYXkuQXJyYXkxLmJsaXQgc3JjIGRzdFxuXG5sZXQgbWFrZV9kZWZhdWx0IGRlZmF1bHQgPVxuICBsZXQgc3BsaXRfZnJvbV9wYXJlbnQgdiA9XG4gICAgQ2FtbC5MYXp5Lm1hcF92YWwgQ2FtbC5SYW5kb20uU3RhdGUuc3BsaXQgdlxuICBpblxuICBDYW1sLkRvbWFpbi5ETFMubmV3X2tleSB+c3BsaXRfZnJvbV9wYXJlbnQgKGZ1biAoKSAtPiBkZWZhdWx0KVxuXG5sZXQgZ2V0X3N0YXRlIHJhbmRvbV9rZXkgPSBDYW1sLkRvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXlcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEludCA9IEludDBcbm1vZHVsZSBDaGFyID0gQ2hhcjBcblxuKCogVW5mb3J0dW5hdGVseSwgYmVjYXVzZSB0aGUgc3RhbmRhcmQgbGlicmFyeSBkb2VzIG5vdCBleHBvc2VcbiAgIFtDYW1sLlJhbmRvbS5TdGF0ZS5kZWZhdWx0XSwgd2UgaGF2ZSB0byBjb25zdHJ1Y3Qgb3VyIG93bi4gIFdlIHRoZW4gYnVpbGQgdGhlXG4gICBbQ2FtbC5SYW5kb20uaW50XSwgW0NhbWwuUmFuZG9tLmJvb2xdIGZ1bmN0aW9ucyBhbmQgZnJpZW5kcyB1c2luZyB0aGF0IGRlZmF1bHQgc3RhdGUgaW5cbiAgIGV4YWN0bHkgdGhlIHNhbWUgd2F5IGFzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LlxuXG4gICBPbmUgb3RoZXIgdHJpY2tpbmVzcyBpcyB0aGF0IHdlIG5lZWQgYWNjZXNzIHRvIHRoZSB1bmV4cG9zZWQgW0NhbWwuUmFuZG9tLlN0YXRlLmFzc2lnbl1cbiAgIGZ1bmN0aW9uLCB3aGljaCBhY2Nlc3NlcyB0aGUgdW5leHBvc2VkIHN0YXRlIHJlcHJlc2VudGF0aW9uLiAgU28sIHdlIGNvcHkgdGhlXG4gICBbU3RhdGUucmVwcl0gdHlwZSBkZWZpbml0aW9uIGFuZCBbYXNzaWduXSBmdW5jdGlvbiB0byBoZXJlIGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnksXG4gICBhbmQgdXNlIFtPYmoubWFnaWNdIHRvIGdldCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uICopXG5cbigqIFJlZ3Jlc3Npb24gdGVzdHMgb3VnaHQgdG8gYmUgZGV0ZXJtaW5pc3RpYyBiZWNhdXNlIHRoYXQgd2F5IGFueW9uZSB3aG8gYnJlYWtzIHRoZSB0ZXN0XG4gICBrbm93cyB0aGF0IGl0J3MgdGhlaXIgY29kZSB0aGF0IGJyb2tlIHRoZSB0ZXN0LiAgSWYgdGVzdHMgYXJlIG5vbmRldGVybWluaXN0aWMsIGEgdGVzdFxuICAgZmFpbHVyZSBtYXkgaW5zdGVhZCBoYXBwZW4gYmVjYXVzZSB0aGUgdGVzdCBydW5uZXIgZ290IHVubHVja3kgYW5kIHVuY292ZXJlZCBhblxuICAgZXhpc3RpbmcgYnVnIGluIHRoZSBjb2RlIHN1cHBvc2VkbHkgYmVpbmcgXCJwcm90ZWN0ZWRcIiBieSB0aGUgdGVzdCBpbiBxdWVzdGlvbi4gKilcbmxldCBmb3JiaWRfbm9uZGV0ZXJtaW5pc21faW5fdGVzdHMgfmFsbG93X2luX3Rlc3RzID1cbiAgaWYgYW1fdGVzdGluZ1xuICB0aGVuIChcbiAgICBtYXRjaCBhbGxvd19pbl90ZXN0cyB3aXRoXG4gICAgfCBTb21lIHRydWUgLT4gKClcbiAgICB8IE5vbmUgfCBTb21lIGZhbHNlIC0+XG4gICAgICBmYWlsd2l0aFxuICAgICAgICBcImluaXRpYWxpemluZyBSYW5kb20gd2l0aCBhIG5vbmRldGVybWluaXN0aWMgc2VlZCBpcyBmb3JiaWRkZW4gaW4gaW5saW5lIHRlc3RzXCIpXG47O1xuXG5leHRlcm5hbCByYW5kb21fc2VlZCA6IHVuaXQgLT4gaW50IGFycmF5ID0gXCJjYW1sX3N5c19yYW5kb21fc2VlZFwiXG5cbmxldCByYW5kb21fc2VlZCA/YWxsb3dfaW5fdGVzdHMgKCkgPVxuICBmb3JiaWRfbm9uZGV0ZXJtaW5pc21faW5fdGVzdHMgfmFsbG93X2luX3Rlc3RzO1xuICByYW5kb21fc2VlZCAoKVxuOztcblxubW9kdWxlIFN0YXRlID0gc3RydWN0XG4gICgqIFdlIGFsbG93IGxhemluZXNzIG9ubHkgZm9yIHRoZSBkZWZpbml0aW9uIG9mIFtkZWZhdWx0XSwgYmVsb3csIHdoaWNoIG1heSBsYXppbHkgY2FsbFxuICAgICBbbWFrZV9zZWxmX2luaXRdLiBGb3IgYWxsIG90aGVyIHB1cnBvc2VzLCB3ZSBjcmVhdGUgYW5kIHVzZSBbdF0gZWFnZXJseS4gKilcbiAgdHlwZSB0ID0gQ2FtbC5SYW5kb20uU3RhdGUudCBMYXp5LnRcblxuICBsZXQgYml0cyB0ID0gQ2FtbC5SYW5kb20uU3RhdGUuYml0cyAoTGF6eS5mb3JjZSB0KVxuICBsZXQgYm9vbCB0ID0gQ2FtbC5SYW5kb20uU3RhdGUuYm9vbCAoTGF6eS5mb3JjZSB0KVxuICBsZXQgaW50IHQgeCA9IENhbWwuUmFuZG9tLlN0YXRlLmludCAoTGF6eS5mb3JjZSB0KSB4XG4gIGxldCBpbnQzMiB0IHggPSBDYW1sLlJhbmRvbS5TdGF0ZS5pbnQzMiAoTGF6eS5mb3JjZSB0KSB4XG4gIGxldCBpbnQ2NCB0IHggPSBDYW1sLlJhbmRvbS5TdGF0ZS5pbnQ2NCAoTGF6eS5mb3JjZSB0KSB4XG4gIGxldCBuYXRpdmVpbnQgdCB4ID0gQ2FtbC5SYW5kb20uU3RhdGUubmF0aXZlaW50IChMYXp5LmZvcmNlIHQpIHhcbiAgbGV0IG1ha2Ugc2VlZCA9IExhenkuZnJvbV92YWwgKENhbWwuUmFuZG9tLlN0YXRlLm1ha2Ugc2VlZClcbiAgbGV0IGNvcHkgdCA9IExhenkuZnJvbV92YWwgKENhbWwuUmFuZG9tLlN0YXRlLmNvcHkgKExhenkuZm9yY2UgdCkpXG4gIGxldCBjaGFyIHQgPSBpbnQgdCAyNTYgfD4gQ2hhci51bnNhZmVfb2ZfaW50XG4gIGxldCBhc2NpaSB0ID0gaW50IHQgMTI4IHw+IENoYXIudW5zYWZlX29mX2ludFxuXG4gIGxldCBtYWtlX3NlbGZfaW5pdCA/YWxsb3dfaW5fdGVzdHMgKCkgPVxuICAgIGZvcmJpZF9ub25kZXRlcm1pbmlzbV9pbl90ZXN0cyB+YWxsb3dfaW5fdGVzdHM7XG4gICAgTGF6eS5mcm9tX3ZhbCAoQ2FtbC5SYW5kb20uU3RhdGUubWFrZV9zZWxmX2luaXQgKCkpXG4gIDs7XG5cbiAgbGV0IGFzc2lnbiA9IFJhbmRvbV9yZXByLmFzc2lnblxuXG4gIGxldCBmdWxsX2luaXQgdCBzZWVkID0gYXNzaWduIHQgKG1ha2Ugc2VlZClcblxuICBsZXQgZGVmYXVsdCA9XG4gICAgaWYgYW1fdGVzdGluZ1xuICAgIHRoZW4gKFxuICAgICAgKCogV2UgZGVmaW5lIEJhc2UncyBkZWZhdWx0IHJhbmRvbSBzdGF0ZSBhcyBhIGNvcHkgb2YgT0NhbWwncyBkZWZhdWx0IHJhbmRvbSBzdGF0ZS5cbiAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCBwcm9ncmFtcyB0aGF0IHVzZSBCYXNlLlJhbmRvbSB3aWxsIHNlZSB0aGUgc2FtZSBzZXF1ZW5jZSBvZlxuICAgICAgICAgcmFuZG9tIGJpdHMgYXMgaWYgdGhleSBoYWQgdXNlZCBDYW1sLlJhbmRvbS4gSG93ZXZlciwgYmVjYXVzZSBbZ2V0X3N0YXRlXSByZXR1cm5zXG4gICAgICAgICBhIGNvcHksIEJhc2UuUmFuZG9tIGFuZCBPQ2FtbC5SYW5kb20gYXJlIG5vdCB1c2luZyB0aGUgc2FtZSBzdGF0ZS4gSWYgYSBwcm9ncmFtXG4gICAgICAgICB1c2VkIGJvdGgsIGVhY2ggb2YgdGhlbSB3b3VsZCBnbyB0aHJvdWdoIHRoZSBzYW1lIHNlcXVlbmNlIG9mIHJhbmRvbSBiaXRzLiBUb1xuICAgICAgICAgYXZvaWQgdGhhdCwgd2UgcmVzZXQgT0NhbWwncyByYW5kb20gc3RhdGUgdG8gYSBkaWZmZXJlbnQgc2VlZCwgZ2l2aW5nIGl0IGFcbiAgICAgICAgIGRpZmZlcmVudCBzZXF1ZW5jZS4gKilcbiAgICAgIGxldCB0ID0gQ2FtbC5SYW5kb20uZ2V0X3N0YXRlICgpIGluXG4gICAgICBDYW1sLlJhbmRvbS5pbml0IDEzNztcbiAgICAgIExhenkuZnJvbV92YWwgdClcbiAgICBlbHNlXG4gICAgICBsYXp5XG4gICAgICAgICgqIE91dHNpZGUgb2YgdGVzdHMsIHdlIGluaXRpYWxpemUgcmFuZG9tIHN0YXRlIG5vbmRldGVybWluaXN0aWNhbGx5IGFuZCBsYXppbHkuXG4gICAgICAgICAgIFdlIGZvcmNlIHRoZSByYW5kb20gaW5pdGlhbGl6YXRpb24gdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvIG5vdCBwYXkgYW55IGNvc3RcbiAgICAgICAgICAgZm9yIGl0IGluIHByb2dyYW1zIHRoYXQgZG8gbm90IHVzZSByYW5kb21uZXNzLiAqKVxuICAgICAgICAoTGF6eS5mb3JjZSAobWFrZV9zZWxmX2luaXQgKCkpKVxuICA7O1xuXG4gIGxldCBpbnRfb25fNjRiaXRzIHQgYm91bmQgPVxuICAgIGlmIGJvdW5kIDw9IDB4M0ZGRkZGRkYgKCogKDEgbHNsIDMwKSAtIDEgKilcbiAgICB0aGVuIGludCB0IGJvdW5kXG4gICAgZWxzZSBDYW1sLkludDY0LnRvX2ludCAoaW50NjQgdCAoQ2FtbC5JbnQ2NC5vZl9pbnQgYm91bmQpKVxuICA7O1xuXG4gIGxldCBpbnRfb25fMzJiaXRzIHQgYm91bmQgPVxuICAgICgqIE5vdCBhbHdheXMgdHJ1ZSB3aXRoIHRoZSBKYXZhU2NyaXB0IGJhY2tlbmQuICopXG4gICAgaWYgYm91bmQgPD0gMHgzRkZGRkZGRiAoKiAoMSBsc2wgMzApIC0gMSAqKVxuICAgIHRoZW4gaW50IHQgYm91bmRcbiAgICBlbHNlIENhbWwuSW50MzIudG9faW50IChpbnQzMiB0IChDYW1sLkludDMyLm9mX2ludCBib3VuZCkpXG4gIDs7XG5cbiAgbGV0IGludCA9XG4gICAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gICAgfCBXNjQgLT4gaW50X29uXzY0Yml0c1xuICAgIHwgVzMyIC0+IGludF9vbl8zMmJpdHNcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9pbnQ2NCA9XG4gICAgbGV0IG9wZW4gQ2FtbC5JbnQ2NCBpblxuICAgIGxldCBiaXRzIHN0YXRlID0gb2ZfaW50IChiaXRzIHN0YXRlKSBpblxuICAgIGZ1biBzdGF0ZSAtPlxuICAgICAgbG9neG9yXG4gICAgICAgIChiaXRzIHN0YXRlKVxuICAgICAgICAobG9neG9yIChzaGlmdF9sZWZ0IChiaXRzIHN0YXRlKSAzMCkgKHNoaWZ0X2xlZnQgKGJpdHMgc3RhdGUpIDYwKSlcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9pbnQzMiA9XG4gICAgbGV0IG9wZW4gQ2FtbC5JbnQzMiBpblxuICAgIGxldCBiaXRzIHN0YXRlID0gb2ZfaW50IChiaXRzIHN0YXRlKSBpblxuICAgIGZ1biBzdGF0ZSAtPiBsb2d4b3IgKGJpdHMgc3RhdGUpIChzaGlmdF9sZWZ0IChiaXRzIHN0YXRlKSAzMClcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9pbnRfb25fNjRiaXRzIHN0YXRlID0gQ2FtbC5JbnQ2NC50b19pbnQgKGZ1bGxfcmFuZ2VfaW50NjQgc3RhdGUpXG4gIGxldCBmdWxsX3JhbmdlX2ludF9vbl8zMmJpdHMgc3RhdGUgPSBDYW1sLkludDMyLnRvX2ludCAoZnVsbF9yYW5nZV9pbnQzMiBzdGF0ZSlcblxuICBsZXQgZnVsbF9yYW5nZV9pbnQgPVxuICAgIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICAgIHwgVzY0IC0+IGZ1bGxfcmFuZ2VfaW50X29uXzY0Yml0c1xuICAgIHwgVzMyIC0+IGZ1bGxfcmFuZ2VfaW50X29uXzMyYml0c1xuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX25hdGl2ZWludF9vbl82NGJpdHMgc3RhdGUgPVxuICAgIENhbWwuSW50NjQudG9fbmF0aXZlaW50IChmdWxsX3JhbmdlX2ludDY0IHN0YXRlKVxuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX25hdGl2ZWludF9vbl8zMmJpdHMgc3RhdGUgPVxuICAgIENhbWwuTmF0aXZlaW50Lm9mX2ludDMyIChmdWxsX3JhbmdlX2ludDMyIHN0YXRlKVxuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX25hdGl2ZWludCA9XG4gICAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gICAgfCBXNjQgLT4gZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fNjRiaXRzXG4gICAgfCBXMzIgLT4gZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fMzJiaXRzXG4gIDs7XG5cbiAgbGV0IHJhaXNlX2Nyb3NzZWRfYm91bmRzIG5hbWUgbG93ZXJfYm91bmQgdXBwZXJfYm91bmQgc3RyaW5nX29mX2JvdW5kID1cbiAgICBQcmludGYuZmFpbHdpdGhmXG4gICAgICBcIlJhbmRvbS4lczogY3Jvc3NlZCBib3VuZHMgWyVzID4gJXNdXCJcbiAgICAgIG5hbWVcbiAgICAgIChzdHJpbmdfb2ZfYm91bmQgbG93ZXJfYm91bmQpXG4gICAgICAoc3RyaW5nX29mX2JvdW5kIHVwcGVyX2JvdW5kKVxuICAgICAgKClcbiAgW0BAY29sZF0gW0BAaW5saW5lIG5ldmVyXSBbQEBsb2NhbCBuZXZlcl0gW0BAc3BlY2lhbGlzZSBuZXZlcl1cbiAgOztcblxuICBsZXQgaW50X2luY2wgPVxuICAgIGxldCByZWMgaW5fcmFuZ2Ugc3RhdGUgbG8gaGkgPVxuICAgICAgbGV0IGludCA9IGZ1bGxfcmFuZ2VfaW50IHN0YXRlIGluXG4gICAgICBpZiBpbnQgPj0gbG8gJiYgaW50IDw9IGhpIHRoZW4gaW50IGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgICBpblxuICAgIGZ1biBzdGF0ZSBsbyBoaSAtPlxuICAgICAgaWYgbG8gPiBoaSB0aGVuIHJhaXNlX2Nyb3NzZWRfYm91bmRzIFwiaW50XCIgbG8gaGkgSW50LnRvX3N0cmluZztcbiAgICAgIGxldCBkaWZmID0gaGkgLSBsbyBpblxuICAgICAgaWYgZGlmZiA9IEludC5tYXhfdmFsdWVcbiAgICAgIHRoZW4gbG8gKyAoZnVsbF9yYW5nZV9pbnQgc3RhdGUgbGFuZCBJbnQubWF4X3ZhbHVlKVxuICAgICAgZWxzZSBpZiBkaWZmID49IDBcbiAgICAgIHRoZW4gbG8gKyBpbnQgc3RhdGUgKEludC5zdWNjIGRpZmYpXG4gICAgICBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gIDs7XG5cbiAgbGV0IGludDMyX2luY2wgPVxuICAgIGxldCBvcGVuIEludDMyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGxldCByZWMgaW5fcmFuZ2Ugc3RhdGUgbG8gaGkgPVxuICAgICAgbGV0IGludCA9IGZ1bGxfcmFuZ2VfaW50MzIgc3RhdGUgaW5cbiAgICAgIGlmIGludCA+PSBsbyAmJiBpbnQgPD0gaGkgdGhlbiBpbnQgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICAgIGluXG4gICAgbGV0IG9wZW4gQ2FtbC5JbnQzMiBpblxuICAgIGZ1biBzdGF0ZSBsbyBoaSAtPlxuICAgICAgaWYgbG8gPiBoaSB0aGVuIHJhaXNlX2Nyb3NzZWRfYm91bmRzIFwiaW50MzJcIiBsbyBoaSB0b19zdHJpbmc7XG4gICAgICBsZXQgZGlmZiA9IHN1YiBoaSBsbyBpblxuICAgICAgaWYgZGlmZiA9IG1heF9pbnRcbiAgICAgIHRoZW4gYWRkIGxvIChsb2dhbmQgKGZ1bGxfcmFuZ2VfaW50MzIgc3RhdGUpIG1heF9pbnQpXG4gICAgICBlbHNlIGlmIGRpZmYgPj0gMGxcbiAgICAgIHRoZW4gYWRkIGxvIChpbnQzMiBzdGF0ZSAoc3VjYyBkaWZmKSlcbiAgICAgIGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgOztcblxuICBsZXQgbmF0aXZlaW50X2luY2wgPVxuICAgIGxldCBvcGVuIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBsZXQgcmVjIGluX3JhbmdlIHN0YXRlIGxvIGhpID1cbiAgICAgIGxldCBpbnQgPSBmdWxsX3JhbmdlX25hdGl2ZWludCBzdGF0ZSBpblxuICAgICAgaWYgaW50ID49IGxvICYmIGludCA8PSBoaSB0aGVuIGludCBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gICAgaW5cbiAgICBsZXQgb3BlbiBDYW1sLk5hdGl2ZWludCBpblxuICAgIGZ1biBzdGF0ZSBsbyBoaSAtPlxuICAgICAgaWYgbG8gPiBoaSB0aGVuIHJhaXNlX2Nyb3NzZWRfYm91bmRzIFwibmF0aXZlaW50XCIgbG8gaGkgdG9fc3RyaW5nO1xuICAgICAgbGV0IGRpZmYgPSBzdWIgaGkgbG8gaW5cbiAgICAgIGlmIGRpZmYgPSBtYXhfaW50XG4gICAgICB0aGVuIGFkZCBsbyAobG9nYW5kIChmdWxsX3JhbmdlX25hdGl2ZWludCBzdGF0ZSkgbWF4X2ludClcbiAgICAgIGVsc2UgaWYgZGlmZiA+PSAwblxuICAgICAgdGhlbiBhZGQgbG8gKG5hdGl2ZWludCBzdGF0ZSAoc3VjYyBkaWZmKSlcbiAgICAgIGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgOztcblxuICBsZXQgaW50NjRfaW5jbCA9XG4gICAgbGV0IG9wZW4gSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgbGV0IHJlYyBpbl9yYW5nZSBzdGF0ZSBsbyBoaSA9XG4gICAgICBsZXQgaW50ID0gZnVsbF9yYW5nZV9pbnQ2NCBzdGF0ZSBpblxuICAgICAgaWYgaW50ID49IGxvICYmIGludCA8PSBoaSB0aGVuIGludCBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gICAgaW5cbiAgICBsZXQgb3BlbiBDYW1sLkludDY0IGluXG4gICAgZnVuIHN0YXRlIGxvIGhpIC0+XG4gICAgICBpZiBsbyA+IGhpIHRoZW4gcmFpc2VfY3Jvc3NlZF9ib3VuZHMgXCJpbnQ2NFwiIGxvIGhpIHRvX3N0cmluZztcbiAgICAgIGxldCBkaWZmID0gc3ViIGhpIGxvIGluXG4gICAgICBpZiBkaWZmID0gbWF4X2ludFxuICAgICAgdGhlbiBhZGQgbG8gKGxvZ2FuZCAoZnVsbF9yYW5nZV9pbnQ2NCBzdGF0ZSkgbWF4X2ludClcbiAgICAgIGVsc2UgaWYgZGlmZiA+PSAwTFxuICAgICAgdGhlbiBhZGQgbG8gKGludDY0IHN0YXRlIChzdWNjIGRpZmYpKVxuICAgICAgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICA7O1xuXG4gICgqIFJldHVybiBhIHVuaWZvcm1seSByYW5kb20gZmxvYXQgaW4gWzAsIDEpLiAqKVxuICBsZXQgcmVjIHJhd2Zsb2F0IHN0YXRlID1cbiAgICBsZXQgb3BlbiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBsZXQgc2NhbGUgPSAweDFwLTMwIGluXG4gICAgKCogMl4tMzAgKilcbiAgICBsZXQgcjEgPSBDYW1sLmZsb2F0X29mX2ludCAoYml0cyBzdGF0ZSkgaW5cbiAgICBsZXQgcjIgPSBDYW1sLmZsb2F0X29mX2ludCAoYml0cyBzdGF0ZSkgaW5cbiAgICBsZXQgcmVzdWx0ID0gKChyMSAqLiBzY2FsZSkgKy4gcjIpICouIHNjYWxlIGluXG4gICAgKCogV2l0aCB2ZXJ5IHNtYWxsIHByb2JhYmlsaXR5LCByZXN1bHQgY2FuIHJvdW5kIHVwIHRvIDEuMCwgc28gaW4gdGhhdCBjYXNlLCB3ZSBqdXN0XG4gICAgICAgdHJ5IGFnYWluLiAqKVxuICAgIGlmIHJlc3VsdCA8IDEuMCB0aGVuIHJlc3VsdCBlbHNlIHJhd2Zsb2F0IHN0YXRlXG4gIDs7XG5cbiAgbGV0IGZsb2F0IHN0YXRlIGhpID0gcmF3ZmxvYXQgc3RhdGUgKi4gaGlcblxuICBsZXQgZmxvYXRfcmFuZ2Ugc3RhdGUgbG8gaGkgPVxuICAgIGxldCBvcGVuIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGlmIGxvID4gaGkgdGhlbiByYWlzZV9jcm9zc2VkX2JvdW5kcyBcImZsb2F0XCIgbG8gaGkgQ2FtbC5zdHJpbmdfb2ZfZmxvYXQ7XG4gICAgbG8gKy4gZmxvYXQgc3RhdGUgKGhpIC0uIGxvKVxuICA7O1xuZW5kXG5cbmxldCBkZWZhdWx0ID0gUmFuZG9tX3JlcHIubWFrZV9kZWZhdWx0IFN0YXRlLmRlZmF1bHRcblxubGV0IGJpdHMgKCkgPSBTdGF0ZS5iaXRzIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdClcbmxldCBpbnQgeCA9IFN0YXRlLmludCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHhcbmxldCBpbnQzMiB4ID0gU3RhdGUuaW50MzIgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4XG5sZXQgbmF0aXZlaW50IHggPSBTdGF0ZS5uYXRpdmVpbnQgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4XG5sZXQgaW50NjQgeCA9IFN0YXRlLmludDY0IChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeFxubGV0IGZsb2F0IHggPSBTdGF0ZS5mbG9hdCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHhcbmxldCBpbnRfaW5jbCB4IHkgPSBTdGF0ZS5pbnRfaW5jbCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHggeVxubGV0IGludDMyX2luY2wgeCB5ID0gU3RhdGUuaW50MzJfaW5jbCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHggeVxubGV0IG5hdGl2ZWludF9pbmNsIHggeSA9IFN0YXRlLm5hdGl2ZWludF9pbmNsIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeCB5XG5sZXQgaW50NjRfaW5jbCB4IHkgPSBTdGF0ZS5pbnQ2NF9pbmNsIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeCB5XG5sZXQgZmxvYXRfcmFuZ2UgeCB5ID0gU3RhdGUuZmxvYXRfcmFuZ2UgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4IHlcbmxldCBib29sICgpID0gU3RhdGUuYm9vbCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpXG5sZXQgY2hhciAoKSA9IFN0YXRlLmNoYXIgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KVxubGV0IGFzY2lpICgpID0gU3RhdGUuYXNjaWkgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KVxubGV0IGZ1bGxfaW5pdCBzZWVkID0gU3RhdGUuZnVsbF9pbml0IChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgc2VlZFxubGV0IGluaXQgc2VlZCA9IGZ1bGxfaW5pdCBbfCBzZWVkIHxdXG5sZXQgc2VsZl9pbml0ID9hbGxvd19pbl90ZXN0cyAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQgP2FsbG93X2luX3Rlc3RzICgpKVxubGV0IHNldF9zdGF0ZSBzID0gU3RhdGUuYXNzaWduIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgc1xuIiwiKCoqIEFuIGludGVybmFsLW9ubHkgbW9kdWxlIGZhY3RvcmVkIG91dCBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gY29yZV9hcnJheVxuICAgIGFuZCBjb3JlX2xpc3QuICBDb250YWlucyBjb2RlIGZvciBwZXJtdXRpbmcgYW4gYXJyYXkuICopXG5cbm9wZW4hIEltcG9ydFxuaW5jbHVkZSBBcnJheTBcblxubGV0IHBlcm11dGUgPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgPyhwb3MgPSAwKSA/bGVuIHQgPVxuICAoKiBDb3BpZWQgZnJvbSBbT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbjBdIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSB0dXBsZSB3aGVuIGNvbXBpbGluZ1xuICAgICB3aXRob3V0IGZsYW1iZGEuICopXG4gIGxldCB0b3RhbF9sZW5ndGggPSBsZW5ndGggdCBpblxuICBsZXQgbGVuID1cbiAgICBtYXRjaCBsZW4gd2l0aFxuICAgIHwgU29tZSBsIC0+IGxcbiAgICB8IE5vbmUgLT4gdG90YWxfbGVuZ3RoIC0gcG9zXG4gIGluXG4gIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24wLmNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoO1xuICBsZXQgbnVtX3N3YXBzID0gbGVuIC0gMSBpblxuICBmb3IgaSA9IG51bV9zd2FwcyBkb3dudG8gMSBkb1xuICAgIGxldCB0aGlzX2kgPSBwb3MgKyBpIGluXG4gICAgKCogW3JhbmRvbV9pXSBpcyBkcmF3biBmcm9tIFtwb3MsdGhpc19pXSAqKVxuICAgIGxldCByYW5kb21faSA9IHBvcyArIFJhbmRvbS5TdGF0ZS5pbnQgcmFuZG9tX3N0YXRlIChpICsgMSkgaW5cbiAgICBzd2FwIHQgdGhpc19pIHJhbmRvbV9pXG4gIGRvbmVcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxubGV0IGNvbnN0IGMgXyA9IGNcblxuZXh0ZXJuYWwgaWdub3JlIDogXyAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxuKCogdGhpcyBoYXMgdGhlIHNhbWUgYmVoYXZpb3IgYXMgW0NhbWwuaWdub3JlXSAqKVxuXG5sZXQgbm9uIGYgeCA9IG5vdCAoZiB4KVxuXG5sZXQgZm9yZXZlciBmID1cbiAgbGV0IHJlYyBmb3JldmVyICgpID1cbiAgICBmICgpO1xuICAgIGZvcmV2ZXIgKClcbiAgaW5cbiAgdHJ5IGZvcmV2ZXIgKCkgd2l0aFxuICB8IGUgLT4gZVxuOztcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5cbigqIFRoZSB0eXBpY2FsIHVzZSBjYXNlIGZvciB0aGVzZSBmdW5jdGlvbnMgaXMgdG8gcGFzcyBpbiBmdW5jdGlvbmFsIGFyZ3VtZW50cyBhbmQgZ2V0XG4gICBmdW5jdGlvbnMgYXMgYSByZXN1bHQuICopXG5sZXQgY29tcG9zZSBmIGcgeCA9IGYgKGcgeClcbmxldCBmbGlwIGYgeCB5ID0gZiB5IHhcbmxldCByZWMgYXBwbHlfbl90aW1lcyB+biBmIHggPSBpZiBuIDw9IDAgdGhlbiB4IGVsc2UgYXBwbHlfbl90aW1lcyB+bjoobiAtIDEpIGYgKGYgeClcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlIHQgPVxuICB8IExlc3NcbiAgfCBFcXVhbFxuICB8IEdyZWF0ZXJcbltAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBlbnVtZXJhdGUsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuXG5sZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gIChmdW4gaHN2IGFyZyAtPlxuICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICB8IExlc3MgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwXG4gICAgIHwgRXF1YWwgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxXG4gICAgIHwgR3JlYXRlciAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDJcbiAgICAgICAgICAgICAgICAgIDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuOztcblxubGV0IChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICBsZXQgZnVuYyBhcmcgPVxuICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgaGFzaF9mb2xkX3QgaHN2IGFyZylcbiAgaW5cbiAgZnVuIHggLT4gZnVuYyB4XG47O1xuXG5sZXQgYWxsID0gKFsgTGVzczsgRXF1YWw7IEdyZWF0ZXIgXSA6IHQgbGlzdClcblxubGV0IHRfb2Zfc2V4cCA9XG4gIChsZXQgZXJyb3Jfc291cmNlX18wMDVfID0gXCJvcmRlcmluZy5tbC50XCIgaW5cbiAgIGZ1bmN0aW9uXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJsZXNzXCIgfCBcIkxlc3NcIikgLT4gTGVzc1xuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiZXF1YWxcIiB8IFwiRXF1YWxcIikgLT4gRXF1YWxcbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImdyZWF0ZXJcIiB8IFwiR3JlYXRlclwiKSAtPiBHcmVhdGVyXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImxlc3NcIiB8IFwiTGVzc1wiKSA6OiBfKSBhcyBzZXhwX18wMDZfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNl9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiZXF1YWxcIiB8IFwiRXF1YWxcIikgOjogXykgYXMgc2V4cF9fMDA2XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDZfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImdyZWF0ZXJcIiB8IFwiR3JlYXRlclwiKSA6OiBfKSBhcyBzZXhwX18wMDZfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNl9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDA0XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuICAgfCBzZXhwX18wMDRfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbiAgICAgICAgICAgICAgICAgICA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuOztcblxubGV0IHNleHBfb2ZfdCA9XG4gIChmdW5jdGlvblxuICAgIHwgTGVzcyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJMZXNzXCJcbiAgICB8IEVxdWFsIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkVxdWFsXCJcbiAgICB8IEdyZWF0ZXIgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiR3JlYXRlclwiXG4gICAgICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZyB7IG5hbWUgPSBcIkxlc3NcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIkVxdWFsXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJHcmVhdGVyXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbltAQEBlbmRdXG5cbmxldCBlcXVhbCBhIGIgPSBjb21wYXJlIGEgYiA9IDBcblxubW9kdWxlIEV4cG9ydCA9IHN0cnVjdFxuICB0eXBlIF9vcmRlcmluZyA9IHQgPVxuICAgIHwgTGVzc1xuICAgIHwgRXF1YWxcbiAgICB8IEdyZWF0ZXJcbmVuZFxuXG5sZXQgb2ZfaW50IG4gPSBpZiBuIDwgMCB0aGVuIExlc3MgZWxzZSBpZiBuID0gMCB0aGVuIEVxdWFsIGVsc2UgR3JlYXRlclxuXG5sZXQgdG9faW50ID0gZnVuY3Rpb25cbiAgfCBMZXNzIC0+IC0xXG4gIHwgRXF1YWwgLT4gMFxuICB8IEdyZWF0ZXIgLT4gMVxuOztcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5tb2R1bGUgRWl0aGVyID0gRWl0aGVyMFxuXG5cbmluY2x1ZGUgTGlzdDFcblxuKCogVGhpcyBpdHNlbGYgaW5jbHVkZXMgW0xpc3QwXS4gKilcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgbGlzdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPSBsaXN0X29mX3NleHBcbiAgbGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9IHNleHBfb2ZfbGlzdFxuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gbGlzdF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIE9yX3VuZXF1YWxfbGVuZ3RocyA9IHN0cnVjdFxuICB0eXBlICdhIHQgPVxuICAgIHwgT2sgb2YgJ2FcbiAgICB8IFVuZXF1YWxfbGVuZ3Roc1xuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID1cbiAgICBmdW4gX2NtcF9fYSBhX18wMDZfIGJfXzAwN18gLT5cbiAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDZfIGJfXzAwN19cbiAgICB0aGVuIDBcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGFfXzAwNl8sIGJfXzAwN18gd2l0aFxuICAgICAgfCBPayBfYV9fMDA4XywgT2sgX2JfXzAwOV8gLT4gX2NtcF9fYSBfYV9fMDA4XyBfYl9fMDA5X1xuICAgICAgfCBPayBfLCBfIC0+IC0xXG4gICAgICB8IF8sIE9rIF8gLT4gMVxuICAgICAgfCBVbmVxdWFsX2xlbmd0aHMsIFVuZXF1YWxfbGVuZ3RocyAtPiAwKVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIGZ1biAodHlwZSBhX18wMTNfKSA6ICgoYV9fMDEzXyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IGFfXzAxM18gdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgZnVuIF9vZl9hX18wMTBfIC0+IGZ1bmN0aW9uXG4gICAgICB8IE9rIGFyZzBfXzAxMV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAxMl8gPSBfb2ZfYV9fMDEwXyBhcmcwX18wMTFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIk9rXCI7IHJlczBfXzAxMl8gXVxuICAgICAgfCBVbmVxdWFsX2xlbmd0aHMgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVW5lcXVhbF9sZW5ndGhzXCJcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbmluY2x1ZGUgVFxuXG5sZXQgaW52YXJpYW50IGYgdCA9IGl0ZXIgdCB+ZlxubGV0IG9mX2xpc3QgdCA9IHRcblxubGV0IHJhbmdlJyB+Y29tcGFyZSB+c3RyaWRlID8oc3RhcnQgPSBgaW5jbHVzaXZlKSA/KHN0b3AgPSBgZXhjbHVzaXZlKSBzdGFydF9pIHN0b3BfaSA9XG4gIGxldCBuZXh0X2kgPSBzdHJpZGUgc3RhcnRfaSBpblxuICBsZXQgb3JkZXIgeCB5ID0gT3JkZXJpbmcub2ZfaW50IChjb21wYXJlIHggeSkgaW5cbiAgbGV0IHJhaXNlX3N0cmlkZV9jYW5ub3RfcmV0dXJuX3NhbWVfdmFsdWUgKCkgPVxuICAgIGludmFsaWRfYXJnIFwiTGlzdC5yYW5nZSc6IHN0cmlkZSBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIHRoZSBzYW1lIHZhbHVlXCJcbiAgaW5cbiAgbGV0IGluaXRpYWxfc3RyaWRlX29yZGVyID1cbiAgICBtYXRjaCBvcmRlciBzdGFydF9pIG5leHRfaSB3aXRoXG4gICAgfCBFcXVhbCAtPiByYWlzZV9zdHJpZGVfY2Fubm90X3JldHVybl9zYW1lX3ZhbHVlICgpXG4gICAgfCBMZXNzIC0+IGBMZXNzXG4gICAgfCBHcmVhdGVyIC0+IGBHcmVhdGVyXG4gIGluXG4gIGxldCByZWMgbG9vcCBpIGFjY3VtID1cbiAgICBsZXQgaV90b19zdG9wX29yZGVyID0gb3JkZXIgaSBzdG9wX2kgaW5cbiAgICBtYXRjaCBpX3RvX3N0b3Bfb3JkZXIsIGluaXRpYWxfc3RyaWRlX29yZGVyIHdpdGhcbiAgICB8IExlc3MsIGBMZXNzIHwgR3JlYXRlciwgYEdyZWF0ZXIgLT5cbiAgICAgICgqIGhhdmVuJ3QgeWV0IHJlYWNoZWQgW3N0b3BfaV0uIENvbnRpbnVlLiAqKVxuICAgICAgbGV0IG5leHRfaSA9IHN0cmlkZSBpIGluXG4gICAgICAobWF0Y2ggb3JkZXIgaSBuZXh0X2ksIGluaXRpYWxfc3RyaWRlX29yZGVyIHdpdGhcbiAgICAgICB8IEVxdWFsLCBfIC0+IHJhaXNlX3N0cmlkZV9jYW5ub3RfcmV0dXJuX3NhbWVfdmFsdWUgKClcbiAgICAgICB8IExlc3MsIGBHcmVhdGVyIHwgR3JlYXRlciwgYExlc3MgLT5cbiAgICAgICAgIGludmFsaWRfYXJnIFwiTGlzdC5yYW5nZSc6IHN0cmlkZSBmdW5jdGlvbiBjYW5ub3QgY2hhbmdlIGRpcmVjdGlvblwiXG4gICAgICAgfCBMZXNzLCBgTGVzcyB8IEdyZWF0ZXIsIGBHcmVhdGVyIC0+IGxvb3AgbmV4dF9pIChpIDo6IGFjY3VtKSlcbiAgICB8IExlc3MsIGBHcmVhdGVyIHwgR3JlYXRlciwgYExlc3MgLT5cbiAgICAgICgqIHN0ZXBwZWQgcGFzdCBbc3RvcF9pXS4gIEZpbmlzaGVkLiAqKVxuICAgICAgYWNjdW1cbiAgICB8IEVxdWFsLCBfIC0+XG4gICAgICAoKiByZWFjaGVkIFtzdG9wX2ldLiAgRmluaXNoZWQuICopXG4gICAgICAobWF0Y2ggc3RvcCB3aXRoXG4gICAgICAgfCBgaW5jbHVzaXZlIC0+IGkgOjogYWNjdW1cbiAgICAgICB8IGBleGNsdXNpdmUgLT4gYWNjdW0pXG4gIGluXG4gIGxldCBzdGFydF9pID1cbiAgICBtYXRjaCBzdGFydCB3aXRoXG4gICAgfCBgaW5jbHVzaXZlIC0+IHN0YXJ0X2lcbiAgICB8IGBleGNsdXNpdmUgLT4gbmV4dF9pXG4gIGluXG4gIHJldiAobG9vcCBzdGFydF9pIFtdKVxuOztcblxubGV0IHJhbmdlID8oc3RyaWRlID0gMSkgPyhzdGFydCA9IGBpbmNsdXNpdmUpID8oc3RvcCA9IGBleGNsdXNpdmUpIHN0YXJ0X2kgc3RvcF9pID1cbiAgaWYgc3RyaWRlID0gMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5yYW5nZTogc3RyaWRlIG11c3QgYmUgbm9uLXplcm9cIjtcbiAgcmFuZ2UnIH5jb21wYXJlIH5zdHJpZGU6KGZ1biB4IC0+IHggKyBzdHJpZGUpIH5zdGFydCB+c3RvcCBzdGFydF9pIHN0b3BfaVxuOztcblxubGV0IGhkIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBfIC0+IFNvbWUgeFxuOztcblxubGV0IHRsIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgXyA6OiB0JyAtPiBTb21lIHQnXG47O1xuXG5sZXQgbnRoIHQgbiA9XG4gIGlmIG4gPCAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgcmVjIG50aF9hdXggdCBuID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBbXSAtPiBOb25lXG4gICAgICB8IGEgOjogdCAtPiBpZiBuID0gMCB0aGVuIFNvbWUgYSBlbHNlIG50aF9hdXggdCAobiAtIDEpXG4gICAgaW5cbiAgICBudGhfYXV4IHQgbilcbjs7XG5cbmxldCBudGhfZXhuIHQgbiA9XG4gIG1hdGNoIG50aCB0IG4gd2l0aFxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmdmIFwiTGlzdC5udGhfZXhuICVkIGNhbGxlZCBvbiBsaXN0IG9mIGxlbmd0aCAlZFwiIG4gKGxlbmd0aCB0KSAoKVxuICB8IFNvbWUgYSAtPiBhXG47O1xuXG5sZXQgdW5vcmRlcmVkX2FwcGVuZCBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIGwgfCBsLCBbXSAtPiBsXG4gIHwgXyAtPiByZXZfYXBwZW5kIGwxIGwyXG47O1xuXG5tb2R1bGUgQ2hlY2tfbGVuZ3RoMiA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHQgPVxuICAgIHwgU2FtZV9sZW5ndGggb2YgaW50XG4gICAgfCBVbmVxdWFsX2xlbmd0aHMgb2ZcbiAgICAgICAgeyBzaGFyZWRfbGVuZ3RoIDogaW50XG4gICAgICAgIDsgdGFpbF9vZl9hIDogJ2EgbGlzdFxuICAgICAgICA7IHRhaWxfb2ZfYiA6ICdiIGxpc3RcbiAgICAgICAgfVxuXG4gICgqIEluIHRoZSBbVW5lcXVhbF9sZW5ndGhzXSBjYXNlLCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRhaWxzIHdpbGwgYmUgbm9uLWVtcHR5LiAqKVxuICBsZXQgb2ZfbGlzdHMgbDEgbDIgPVxuICAgIGxldCByZWMgbG9vcCBhIGIgc2hhcmVkX2xlbmd0aCA9XG4gICAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICAgIHwgW10sIFtdIC0+IFNhbWVfbGVuZ3RoIHNoYXJlZF9sZW5ndGhcbiAgICAgIHwgXyA6OiBhLCBfIDo6IGIgLT4gbG9vcCBhIGIgKHNoYXJlZF9sZW5ndGggKyAxKVxuICAgICAgfCBbXSwgXyB8IF8sIFtdIC0+IFVuZXF1YWxfbGVuZ3RocyB7IHNoYXJlZF9sZW5ndGg7IHRhaWxfb2ZfYSA9IGE7IHRhaWxfb2ZfYiA9IGIgfVxuICAgIGluXG4gICAgbG9vcCBsMSBsMiAwXG4gIDs7XG5lbmRcblxubGV0IGNoZWNrX2xlbmd0aDJfZXhuIG5hbWUgbDEgbDIgPVxuICBtYXRjaCBDaGVja19sZW5ndGgyLm9mX2xpc3RzIGwxIGwyIHdpdGhcbiAgfCBTYW1lX2xlbmd0aCBfIC0+ICgpXG4gIHwgVW5lcXVhbF9sZW5ndGhzIHsgc2hhcmVkX2xlbmd0aDsgdGFpbF9vZl9hOyB0YWlsX29mX2IgfSAtPlxuICAgIGludmFsaWRfYXJnZlxuICAgICAgXCJsZW5ndGggbWlzbWF0Y2ggaW4gJXM6ICVkIDw+ICVkXCJcbiAgICAgIG5hbWVcbiAgICAgIChzaGFyZWRfbGVuZ3RoICsgbGVuZ3RoIHRhaWxfb2ZfYSlcbiAgICAgIChzaGFyZWRfbGVuZ3RoICsgbGVuZ3RoIHRhaWxfb2ZfYilcbiAgICAgICgpXG47O1xuXG5sZXQgY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZiA9XG4gIG1hdGNoIENoZWNrX2xlbmd0aDIub2ZfbGlzdHMgbDEgbDIgd2l0aFxuICB8IFNhbWVfbGVuZ3RoIF8gLT4gT3JfdW5lcXVhbF9sZW5ndGhzLk9rIChmIGwxIGwyKVxuICB8IFVuZXF1YWxfbGVuZ3RocyBfIC0+IFVuZXF1YWxfbGVuZ3Roc1xuOztcblxubW9kdWxlIENoZWNrX2xlbmd0aDMgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiLCAnYykgdCA9XG4gICAgfCBTYW1lX2xlbmd0aCBvZiBpbnRcbiAgICB8IFVuZXF1YWxfbGVuZ3RocyBvZlxuICAgICAgICB7IHNoYXJlZF9sZW5ndGggOiBpbnRcbiAgICAgICAgOyB0YWlsX29mX2EgOiAnYSBsaXN0XG4gICAgICAgIDsgdGFpbF9vZl9iIDogJ2IgbGlzdFxuICAgICAgICA7IHRhaWxfb2ZfYyA6ICdjIGxpc3RcbiAgICAgICAgfVxuXG4gICgqIEluIHRoZSBbVW5lcXVhbF9sZW5ndGhzXSBjYXNlLCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRhaWxzIHdpbGwgYmUgbm9uLWVtcHR5LiAqKVxuICBsZXQgb2ZfbGlzdHMgbDEgbDIgbDMgPVxuICAgIGxldCByZWMgbG9vcCBhIGIgYyBzaGFyZWRfbGVuZ3RoID1cbiAgICAgIG1hdGNoIGEsIGIsIGMgd2l0aFxuICAgICAgfCBbXSwgW10sIFtdIC0+IFNhbWVfbGVuZ3RoIHNoYXJlZF9sZW5ndGhcbiAgICAgIHwgXyA6OiBhLCBfIDo6IGIsIF8gOjogYyAtPiBsb29wIGEgYiBjIChzaGFyZWRfbGVuZ3RoICsgMSlcbiAgICAgIHwgW10sIF8sIF8gfCBfLCBbXSwgXyB8IF8sIF8sIFtdIC0+XG4gICAgICAgIFVuZXF1YWxfbGVuZ3RocyB7IHNoYXJlZF9sZW5ndGg7IHRhaWxfb2ZfYSA9IGE7IHRhaWxfb2ZfYiA9IGI7IHRhaWxfb2ZfYyA9IGMgfVxuICAgIGluXG4gICAgbG9vcCBsMSBsMiBsMyAwXG4gIDs7XG5lbmRcblxubGV0IGNoZWNrX2xlbmd0aDNfZXhuIG5hbWUgbDEgbDIgbDMgPVxuICBtYXRjaCBDaGVja19sZW5ndGgzLm9mX2xpc3RzIGwxIGwyIGwzIHdpdGhcbiAgfCBTYW1lX2xlbmd0aCBfIC0+ICgpXG4gIHwgVW5lcXVhbF9sZW5ndGhzIHsgc2hhcmVkX2xlbmd0aDsgdGFpbF9vZl9hOyB0YWlsX29mX2I7IHRhaWxfb2ZfYyB9IC0+XG4gICAgbGV0IG4xID0gc2hhcmVkX2xlbmd0aCArIGxlbmd0aCB0YWlsX29mX2EgaW5cbiAgICBsZXQgbjIgPSBzaGFyZWRfbGVuZ3RoICsgbGVuZ3RoIHRhaWxfb2ZfYiBpblxuICAgIGxldCBuMyA9IHNoYXJlZF9sZW5ndGggKyBsZW5ndGggdGFpbF9vZl9jIGluXG4gICAgaW52YWxpZF9hcmdmIFwibGVuZ3RoIG1pc21hdGNoIGluICVzOiAlZCA8PiAlZCB8fCAlZCA8PiAlZFwiIG5hbWUgbjEgbjIgbjIgbjMgKClcbjs7XG5cbmxldCBjaGVja19sZW5ndGgzIGwxIGwyIGwzIH5mID1cbiAgbWF0Y2ggQ2hlY2tfbGVuZ3RoMy5vZl9saXN0cyBsMSBsMiBsMyB3aXRoXG4gIHwgU2FtZV9sZW5ndGggXyAtPiBPcl91bmVxdWFsX2xlbmd0aHMuT2sgKGYgbDEgbDIgbDMpXG4gIHwgVW5lcXVhbF9sZW5ndGhzIF8gLT4gVW5lcXVhbF9sZW5ndGhzXG47O1xuXG5sZXQgaXRlcjIgbDEgbDIgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihpdGVyMl9vayB+ZilcblxubGV0IGl0ZXIyX2V4biBsMSBsMiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiaXRlcjJfZXhuXCIgbDEgbDI7XG4gIGl0ZXIyX29rIGwxIGwyIH5mXG47O1xuXG5sZXQgcmV2X21hcDIgbDEgbDIgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihyZXZfbWFwMl9vayB+ZilcblxubGV0IHJldl9tYXAyX2V4biBsMSBsMiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwicmV2X21hcDJfZXhuXCIgbDEgbDI7XG4gIHJldl9tYXAyX29rIGwxIGwyIH5mXG47O1xuXG5sZXQgZm9sZDIgbDEgbDIgfmluaXQgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihmb2xkMl9vayB+aW5pdCB+ZilcblxubGV0IGZvbGQyX2V4biBsMSBsMiB+aW5pdCB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiZm9sZDJfZXhuXCIgbDEgbDI7XG4gIGZvbGQyX29rIGwxIGwyIH5pbml0IH5mXG47O1xuXG5sZXQgZm9yX2FsbDIgbDEgbDIgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihmb3JfYWxsMl9vayB+ZilcblxubGV0IGZvcl9hbGwyX2V4biBsMSBsMiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiZm9yX2FsbDJfZXhuXCIgbDEgbDI7XG4gIGZvcl9hbGwyX29rIGwxIGwyIH5mXG47O1xuXG5sZXQgZXhpc3RzMiBsMSBsMiB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KGV4aXN0czJfb2sgfmYpXG5cbmxldCBleGlzdHMyX2V4biBsMSBsMiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiZXhpc3RzMl9leG5cIiBsMSBsMjtcbiAgZXhpc3RzMl9vayBsMSBsMiB+ZlxuOztcblxubGV0IG1lbSB0IGEgfmVxdWFsID1cbiAgbGV0IHJlYyBsb29wIGVxdWFsIGEgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gZmFsc2VcbiAgICB8IGIgOjogYnMgLT4gZXF1YWwgYSBiIHx8IGxvb3AgZXF1YWwgYSBic1xuICBpblxuICBsb29wIGVxdWFsIGEgdFxuOztcblxuKCogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIGNvZGUgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSwgd2l0aCBhbiBleHRyYSBldGEtZXhwYW5zaW9uIHRvXG4gICBhdm9pZCBjcmVhdGluZyBwYXJ0aWFsIGNsb3N1cmVzIChzaG93ZWQgdXAgZm9yIFtmaWx0ZXJdKSBpbiBwcm9maWxpbmcpLiAqKVxubGV0IHJldl9maWx0ZXIgdCB+ZiA9XG4gIGxldCByZWMgZmluZCB+ZiBhY2N1ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY3VcbiAgICB8IHggOjogbCAtPiBpZiBmIHggdGhlbiBmaW5kIH5mICh4IDo6IGFjY3UpIGwgZWxzZSBmaW5kIH5mIGFjY3UgbFxuICBpblxuICBmaW5kIH5mIFtdIHRcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9IHJldiAocmV2X2ZpbHRlciB0IH5mKVxuXG5sZXQgZmluZF9tYXAgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBOb25lXG4gICAgfCB4IDo6IGwgLT5cbiAgICAgIChtYXRjaCBmIHggd2l0aFxuICAgICAgIHwgTm9uZSAtPiBsb29wIGxcbiAgICAgICB8IFNvbWUgXyBhcyByIC0+IHIpXG4gIGluXG4gIGxvb3AgdFxuOztcblxubGV0IGZpbmRfbWFwX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkxpc3QuZmluZF9tYXBfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGZpbmRfbWFwX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kX21hcCB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCBTb21lIHggLT4geFxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfbWFwX2V4blxuOztcblxubGV0IGZpbmQgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBOb25lXG4gICAgfCB4IDo6IGwgLT4gaWYgZiB4IHRoZW4gU29tZSB4IGVsc2UgbG9vcCBsXG4gIGluXG4gIGxvb3AgdFxuOztcblxubGV0IGZpbmRfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiTGlzdC5maW5kX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCByZWMgZmluZF9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IHggOjogdCAtPiBpZiBmIHggdGhlbiB4IGVsc2UgZmluZF9leG4gdCB+ZlxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfZXhuXG47O1xuXG5sZXQgZmluZGkgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gTm9uZVxuICAgIHwgeCA6OiBsIC0+IGlmIGYgaSB4IHRoZW4gU29tZSAoaSwgeCkgZWxzZSBsb29wIChpICsgMSkgbFxuICBpblxuICBsb29wIDAgdFxuOztcblxubGV0IGZpbmRpX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkxpc3QuZmluZGlfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGZpbmRpX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kaSB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCBTb21lIHggLT4geFxuICBpblxuICBmaW5kaV9leG5cbjs7XG5cbmxldCBmaW5kX21hcGkgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gTm9uZVxuICAgIHwgeCA6OiBsIC0+XG4gICAgICAobWF0Y2ggZiBpIHggd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPiByZXN1bHRcbiAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpIGwpXG4gIGluXG4gIGxvb3AgMCB0XG47O1xuXG5sZXQgZmluZF9tYXBpX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkxpc3QuZmluZF9tYXBpX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBmaW5kX21hcGlfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmRfbWFwaSB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCBTb21lIHggLT4geFxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfbWFwaV9leG5cbjs7XG5cbmxldCBmb3JfYWxsaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIGkgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiB0cnVlXG4gICAgfCBoZCA6OiB0bCAtPiBmIGkgaGQgJiYgbG9vcCAoaSArIDEpIHRsXG4gIGluXG4gIGxvb3AgMCB0XG47O1xuXG5sZXQgZXhpc3RzaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIGkgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiBmYWxzZVxuICAgIHwgaGQgOjogdGwgLT4gZiBpIGhkIHx8IGxvb3AgKGkgKyAxKSB0bFxuICBpblxuICBsb29wIDAgdFxuOztcblxuKCoqIEZvciB0aGUgY29udGFpbmVyIGludGVyZmFjZS4gKilcbmxldCBmb2xkX2xlZnQgPSBmb2xkXG5cbmxldCB0b19hcnJheSA9IEFycmF5Lm9mX2xpc3RcbmxldCB0b19saXN0IHQgPSB0XG5cbmxldCBtYXhfbm9uX3RhaWxjYWxsID1cbiAgbWF0Y2ggU3lzLmJhY2tlbmRfdHlwZSB3aXRoXG4gIHwgU3lzLk5hdGl2ZSB8IFN5cy5CeXRlY29kZSAtPiAxXzAwMFxuICAoKiBXZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzdGFjaywgYmV0dGVyIGJlIHNhZmUgYW5kIGFzc3VtZSBpdCdzIHNtYWxsLiBUaGlzXG4gICAgIG51bWJlciB3YXMgdGFrZW4gZnJvbSBvY2FtbCNzdGRsaWIvbGlzdC5tbCB3aGljaCBpcyBhbHNvIGVxdWFsIHRvIHRoZSBkZWZhdWx0IGxpbWl0XG4gICAgIG9mIHJlY3Vyc2l2ZSBjYWxsIGluIHRoZSBqc19vZl9vY2FtbCBjb21waWxlciBiZWZvcmUgc3dpdGNoaW5nIHRvIHRyYW1wb2xpbmUuICopXG4gIHwgU3lzLk90aGVyIF8gLT4gNTBcbjs7XG5cbigqKiBUYWlsIHJlY3Vyc2l2ZSB2ZXJzaW9ucyBvZiBzdGFuZGFyZCBbTGlzdF0gbW9kdWxlICopXG5cbmxldCB0YWlsX2FwcGVuZCBsMSBsMiA9IHJldl9hcHBlbmQgKHJldiBsMSkgbDJcblxuKCogVGhlcmUgYXJlIGEgZmV3IG9wdGltaXplZCBsaXN0IG9wZXJhdGlvbnMgaGVyZSwgaW5jbHVkaW5nIGFwcGVuZCBhbmQgbWFwLiAgVGhlcmUgYXJlXG4gICBiYXNpY2FsbHkgdHdvIG9wdGltaXphdGlvbnMgaW4gcGxheTogbG9vcCB1bnJvbGxpbmcsIGFuZCBkeW5hbWljIHN3aXRjaGluZyBiZXR3ZWVuXG4gICBzdGFjayBhbmQgaGVhcCBhbGxvY2F0aW9uLlxuXG4gICBUaGUgbG9vcC11bnJvbGxpbmcgaXMgc3RyYWlnaHRmb3J3YXJkLCB3ZSBqdXN0IHVucm9sbCA1IGxldmVscyBvZiB0aGUgbG9vcC4gIFRoaXMgbWFrZXNcbiAgIGVhY2ggaXRlcmF0aW9uIGZhc3RlciwgYW5kIGFsc28gcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcyBjb25zdW1lZCBwZXIgbGlzdFxuICAgZWxlbWVudC5cblxuICAgVGhlIGR5bmFtaWMgc3dpdGNoaW5nIGlzIGRvbmUgYnkgY291bnRpbmcgdGhlIG51bWJlciBvZiBzdGFjayBmcmFtZXMsIGFuZCB0aGVuXG4gICBzd2l0Y2hpbmcgdG8gdGhlIFwic2xvd1wiIGltcGxlbWVudGF0aW9uIHdoZW4gd2UgZXhjZWVkIGEgZ2l2ZW4gbGltaXQuICBUaGlzIG1lYW5zIHRoYXRcbiAgIHNob3J0IGxpc3RzIHVzZSB0aGUgZmFzdCBzdGFjay1hbGxvY2F0aW9uIG1ldGhvZCwgYW5kIGxvbmcgbGlzdHMgdXNlIGEgc2xvd2VyIG9uZSB0aGF0XG4gICBkb2Vzbid0IHJlcXVpcmUgc3RhY2sgc3BhY2UuICopXG5sZXQgcmVjIGNvdW50X2FwcGVuZCBsMSBsMiBjb3VudCA9XG4gIG1hdGNoIGwyIHdpdGhcbiAgfCBbXSAtPiBsMVxuICB8IF8gLT5cbiAgICAobWF0Y2ggbDEgd2l0aFxuICAgICB8IFtdIC0+IGwyXG4gICAgIHwgWyB4MSBdIC0+IHgxIDo6IGwyXG4gICAgIHwgWyB4MTsgeDIgXSAtPiB4MSA6OiB4MiA6OiBsMlxuICAgICB8IFsgeDE7IHgyOyB4MyBdIC0+IHgxIDo6IHgyIDo6IHgzIDo6IGwyXG4gICAgIHwgWyB4MTsgeDI7IHgzOyB4NCBdIC0+IHgxIDo6IHgyIDo6IHgzIDo6IHg0IDo6IGwyXG4gICAgIHwgeDEgOjogeDIgOjogeDMgOjogeDQgOjogeDUgOjogdGwgLT5cbiAgICAgICB4MVxuICAgICAgIDo6IHgyXG4gICAgICAgOjogeDNcbiAgICAgICA6OiB4NFxuICAgICAgIDo6IHg1XG4gICAgICAgOjpcbiAgICAgICAoaWYgY291bnQgPiBtYXhfbm9uX3RhaWxjYWxsXG4gICAgICAgIHRoZW4gdGFpbF9hcHBlbmQgdGwgbDJcbiAgICAgICAgZWxzZSBjb3VudF9hcHBlbmQgdGwgbDIgKGNvdW50ICsgMSkpKVxuOztcblxubGV0IGFwcGVuZCBsMSBsMiA9IGNvdW50X2FwcGVuZCBsMSBsMiAwXG5cbigqIEFuIG9yZGluYXJ5IHRhaWwgcmVjdXJzaXZlIG1hcCBidWlsZHMgdXAgYW4gaW50ZXJtZWRpYXRlIChyZXZlcnNlZCkgcmVwcmVzZW50YXRpb24sXG4gICB3aXRoIG9uZSBoZWFwIGFsbG9jYXRlZCBvYmplY3QgcGVyIGVsZW1lbnQuIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBjaHVua3NcbiAgIDkgb2JqZWN0cyBpbnRvIG9uZSBoZWFwIGFsbG9jYXRlZCBvYmplY3QsIHJlZHVjaW5nIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIGNvc3RzXG4gICBhY2NvcmRpbmdseS4gTm90ZSB0aGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgbGlzdCBpcyBkb25lIGJ5IHRoZSBzdGRsaWIncyBtYXBcbiAgIGZ1bmN0aW9uLiAqKVxubGV0IHRhaWxfbWFwIHhzIH5mID1cbiAgbGV0IHJlYyByaXNlIHlzID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHlzXG4gICAgfCAoeTAsIHkxLCB5MiwgeTMsIHk0LCB5NSwgeTYsIHk3LCB5OCkgOjogYnMgLT5cbiAgICAgIHJpc2UgKHkwIDo6IHkxIDo6IHkyIDo6IHkzIDo6IHk0IDo6IHk1IDo6IHk2IDo6IHk3IDo6IHk4IDo6IHlzKSBic1xuICBpblxuICBsZXQgcmVjIGRpdmUgYnMgPSBmdW5jdGlvblxuICAgIHwgeDAgOjogeDEgOjogeDIgOjogeDMgOjogeDQgOjogeDUgOjogeDYgOjogeDcgOjogeDggOjogeHMgLT5cbiAgICAgIGxldCB5MCA9IGYgeDAgaW5cbiAgICAgIGxldCB5MSA9IGYgeDEgaW5cbiAgICAgIGxldCB5MiA9IGYgeDIgaW5cbiAgICAgIGxldCB5MyA9IGYgeDMgaW5cbiAgICAgIGxldCB5NCA9IGYgeDQgaW5cbiAgICAgIGxldCB5NSA9IGYgeDUgaW5cbiAgICAgIGxldCB5NiA9IGYgeDYgaW5cbiAgICAgIGxldCB5NyA9IGYgeDcgaW5cbiAgICAgIGxldCB5OCA9IGYgeDggaW5cbiAgICAgIGRpdmUgKCh5MCwgeTEsIHkyLCB5MywgeTQsIHk1LCB5NiwgeTcsIHk4KSA6OiBicykgeHNcbiAgICB8IHhzIC0+IHJpc2UgKG5vbnRhaWxfbWFwIH5mIHhzKSBic1xuICBpblxuICBkaXZlIFtdIHhzXG47O1xuXG5sZXQgcmVjIGNvdW50X21hcCB+ZiBsIGN0ciA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFtdXG4gIHwgWyB4MSBdIC0+XG4gICAgbGV0IGYxID0gZiB4MSBpblxuICAgIFsgZjEgXVxuICB8IFsgeDE7IHgyIF0gLT5cbiAgICBsZXQgZjEgPSBmIHgxIGluXG4gICAgbGV0IGYyID0gZiB4MiBpblxuICAgIFsgZjE7IGYyIF1cbiAgfCBbIHgxOyB4MjsgeDMgXSAtPlxuICAgIGxldCBmMSA9IGYgeDEgaW5cbiAgICBsZXQgZjIgPSBmIHgyIGluXG4gICAgbGV0IGYzID0gZiB4MyBpblxuICAgIFsgZjE7IGYyOyBmMyBdXG4gIHwgWyB4MTsgeDI7IHgzOyB4NCBdIC0+XG4gICAgbGV0IGYxID0gZiB4MSBpblxuICAgIGxldCBmMiA9IGYgeDIgaW5cbiAgICBsZXQgZjMgPSBmIHgzIGluXG4gICAgbGV0IGY0ID0gZiB4NCBpblxuICAgIFsgZjE7IGYyOyBmMzsgZjQgXVxuICB8IHgxIDo6IHgyIDo6IHgzIDo6IHg0IDo6IHg1IDo6IHRsIC0+XG4gICAgbGV0IGYxID0gZiB4MSBpblxuICAgIGxldCBmMiA9IGYgeDIgaW5cbiAgICBsZXQgZjMgPSBmIHgzIGluXG4gICAgbGV0IGY0ID0gZiB4NCBpblxuICAgIGxldCBmNSA9IGYgeDUgaW5cbiAgICBmMVxuICAgIDo6IGYyXG4gICAgOjogZjNcbiAgICA6OiBmNFxuICAgIDo6IGY1XG4gICAgOjogKGlmIGN0ciA+IG1heF9ub25fdGFpbGNhbGwgdGhlbiB0YWlsX21hcCB+ZiB0bCBlbHNlIGNvdW50X21hcCB+ZiB0bCAoY3RyICsgMSkpXG47O1xuXG5sZXQgbWFwIGwgfmYgPSBjb3VudF9tYXAgfmYgbCAwXG5cbmxldCBmb2xkaW5nX21hcCB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIG1hcCB0IH5mOihmdW4geCAtPlxuICAgIGxldCBuZXdfYWNjLCB5ID0gZiAhYWNjIHggaW5cbiAgICBhY2MgOj0gbmV3X2FjYztcbiAgICB5KVxuOztcblxubGV0IGZvbGRfbWFwIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbGV0IHJlc3VsdCA9XG4gICAgbWFwIHQgfmY6KGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYywgeSA9IGYgIWFjYyB4IGluXG4gICAgICBhY2MgOj0gbmV3X2FjYztcbiAgICAgIHkpXG4gIGluXG4gICFhY2MsIHJlc3VsdFxuOztcblxubGV0ICggPj58ICkgbCBmID0gbWFwIGwgfmZcbmxldCBtYXAyX29rIGwxIGwyIH5mID0gcmV2IChyZXZfbWFwMl9vayBsMSBsMiB+ZilcbmxldCBtYXAyIGwxIGwyIH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjoobWFwMl9vayB+ZilcblxubGV0IG1hcDJfZXhuIGwxIGwyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJtYXAyX2V4blwiIGwxIGwyO1xuICBtYXAyX29rIGwxIGwyIH5mXG47O1xuXG5sZXQgcmV2X21hcDNfb2sgbDEgbDIgbDMgfmYgPVxuICBsZXQgcmVjIGxvb3AgbDEgbDIgbDMgYWMgPVxuICAgIG1hdGNoIGwxLCBsMiwgbDMgd2l0aFxuICAgIHwgW10sIFtdLCBbXSAtPiBhY1xuICAgIHwgeDEgOjogbDEsIHgyIDo6IGwyLCB4MyA6OiBsMyAtPiBsb29wIGwxIGwyIGwzIChmIHgxIHgyIHgzIDo6IGFjKVxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2VcbiAgaW5cbiAgbG9vcCBsMSBsMiBsMyBbXVxuOztcblxubGV0IHJldl9tYXAzIGwxIGwyIGwzIH5mID0gY2hlY2tfbGVuZ3RoMyBsMSBsMiBsMyB+ZjoocmV2X21hcDNfb2sgfmYpXG5cbmxldCByZXZfbWFwM19leG4gbDEgbDIgbDMgfmYgPVxuICBjaGVja19sZW5ndGgzX2V4biBcInJldl9tYXAzX2V4blwiIGwxIGwyIGwzO1xuICByZXZfbWFwM19vayBsMSBsMiBsMyB+ZlxuOztcblxubGV0IG1hcDNfb2sgbDEgbDIgbDMgfmYgPSByZXYgKHJldl9tYXAzX29rIGwxIGwyIGwzIH5mKVxubGV0IG1hcDMgbDEgbDIgbDMgfmYgPSBjaGVja19sZW5ndGgzIGwxIGwyIGwzIH5mOihtYXAzX29rIH5mKVxuXG5sZXQgbWFwM19leG4gbDEgbDIgbDMgfmYgPVxuICBjaGVja19sZW5ndGgzX2V4biBcIm1hcDNfZXhuXCIgbDEgbDIgbDM7XG4gIG1hcDNfb2sgbDEgbDIgbDMgfmZcbjs7XG5cbmxldCByZWMgcmV2X21hcF9hcHBlbmQgbDEgbDIgfmYgPVxuICBtYXRjaCBsMSB3aXRoXG4gIHwgW10gLT4gbDJcbiAgfCBoIDo6IHQgLT4gcmV2X21hcF9hcHBlbmQgfmYgdCAoZiBoIDo6IGwyKVxuOztcblxubGV0IHVuemlwIGxpc3QgPVxuICBsZXQgcmVjIGxvb3AgbGlzdCBsMSBsMiA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBsMSwgbDJcbiAgICB8ICh4LCB5KSA6OiB0bCAtPiBsb29wIHRsICh4IDo6IGwxKSAoeSA6OiBsMilcbiAgaW5cbiAgbG9vcCAocmV2IGxpc3QpIFtdIFtdXG47O1xuXG5sZXQgdW56aXAzIGxpc3QgPVxuICBsZXQgcmVjIGxvb3AgbGlzdCBsMSBsMiBsMyA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBsMSwgbDIsIGwzXG4gICAgfCAoeCwgeSwgeikgOjogdGwgLT4gbG9vcCB0bCAoeCA6OiBsMSkgKHkgOjogbDIpICh6IDo6IGwzKVxuICBpblxuICBsb29wIChyZXYgbGlzdCkgW10gW10gW11cbjs7XG5cbmxldCB6aXBfZXhuIGwxIGwyID1cbiAgdHJ5IG1hcDJfb2sgfmY6KGZ1biBhIGIgLT4gYSwgYikgbDEgbDIgd2l0aFxuICB8IF8gLT4gaW52YWxpZF9hcmdmIFwibGVuZ3RoIG1pc21hdGNoIGluIHppcF9leG46ICVkIDw+ICVkXCIgKGxlbmd0aCBsMSkgKGxlbmd0aCBsMikgKClcbjs7XG5cbmxldCB6aXAgbDEgbDIgPSBtYXAyIH5mOihmdW4gYSBiIC0+IGEsIGIpIGwxIGwyXG5cbigqKiBBZGRpdGlvbmFsIGxpc3Qgb3BlcmF0aW9ucyAqKVxuXG5sZXQgcmV2X21hcGkgbCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGggOjogdCAtPiBsb29wIChpICsgMSkgKGYgaSBoIDo6IGFjYykgdFxuICBpblxuICBsb29wIDAgW10gbFxuOztcblxubGV0IG1hcGkgbCB+ZiA9IHJldiAocmV2X21hcGkgbCB+ZilcblxubGV0IGZvbGRpbmdfbWFwaSB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIG1hcGkgdCB+ZjooZnVuIGkgeCAtPlxuICAgIGxldCBuZXdfYWNjLCB5ID0gZiBpICFhY2MgeCBpblxuICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgIHkpXG47O1xuXG5sZXQgZm9sZF9tYXBpIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbGV0IHJlc3VsdCA9XG4gICAgbWFwaSB0IH5mOihmdW4gaSB4IC0+XG4gICAgICBsZXQgbmV3X2FjYywgeSA9IGYgaSAhYWNjIHggaW5cbiAgICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgICAgeSlcbiAgaW5cbiAgIWFjYywgcmVzdWx0XG47O1xuXG5sZXQgaXRlcmkgbCB+ZiA9XG4gIGlnbm9yZVxuICAgIChmb2xkIGwgfmluaXQ6MCB+ZjooZnVuIGkgeCAtPlxuICAgICAgIGYgaSB4O1xuICAgICAgIGkgKyAxKVxuICAgICA6IGludClcbjs7XG5cbmxldCBmb2xkaSB0IH5pbml0IH5mID1cbiAgc25kIChmb2xkIHQgfmluaXQ6KDAsIGluaXQpIH5mOihmdW4gKGksIGFjYykgdiAtPiBpICsgMSwgZiBpIGFjYyB2KSlcbjs7XG5cbmxldCBmaWx0ZXJpIGwgfmYgPVxuICByZXYgKGZvbGRpIGwgfmY6KGZ1biBwb3MgYWNjIHggLT4gaWYgZiBwb3MgeCB0aGVuIHggOjogYWNjIGVsc2UgYWNjKSB+aW5pdDpbXSlcbjs7XG5cbmxldCByZWR1Y2UgbCB+ZiA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCBoZCA6OiB0bCAtPiBTb21lIChmb2xkIH5pbml0OmhkIH5mIHRsKVxuOztcblxubGV0IHJlZHVjZV9leG4gbCB+ZiA9XG4gIG1hdGNoIHJlZHVjZSBsIH5mIHdpdGhcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnIFwiTGlzdC5yZWR1Y2VfZXhuXCJcbiAgfCBTb21lIHYgLT4gdlxuOztcblxubGV0IHJlZHVjZV9iYWxhbmNlZCBsIH5mID1cbiAgKCogQ2FsbCB0aGUgXCJzaXplXCIgb2YgYSB2YWx1ZSB0aGUgbnVtYmVyIG9mIGxpc3QgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gY29tYmluZWQgaW50b1xuICAgICBpdCB2aWEgY2FsbHMgdG8gW2ZdLiAgV2UgcHJvY2VlZCBieSB1c2luZyBbZl0gdG8gY29tYmluZSBlbGVtZW50cyBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICAgb2YgdGhlIHNhbWUgc2l6ZSB1bnRpbCB3ZSBjYW4ndCBjb21iaW5lIGFueSBtb3JlLCB0aGVuIGdldHRpbmcgYSBuZXcgZWxlbWVudCBmcm9tIHRoZVxuICAgICBpbnB1dCBsaXN0IGFuZCByZXBlYXRpbmcuXG5cbiAgICAgV2l0aCB0aGlzIHN0cmF0ZWd5LCBpbiB0aGUgYWNjdW11bGF0b3I6XG4gICAgIC0gd2Ugb25seSBldmVyIGhhdmUgZWxlbWVudHMgb2Ygc2l6ZXMgYSBwb3dlciBvZiB0d29cbiAgICAgLSB3ZSBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBvZiBlYWNoIHNpemVcbiAgICAgLSB0aGUgc3VtIG9mIGFsbCB0aGUgZWxlbWVudCBzaXplcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnN1bWVkXG5cbiAgICAgVGhlc2UgY29uZGl0aW9ucyBlbmZvcmNlIHRoYXQgbGlzdCBvZiBlbGVtZW50cyBvZiBlYWNoIHNpemUgaXMgcHJlY2lzZWx5IHRoZSBiaW5hcnlcbiAgICAgZXhwYW5zaW9uIG9mIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29uc3VtZWQ6IGlmIHlvdSd2ZSBjb25zdW1lZCAxMyA9IDBiMTEwMVxuICAgICBlbGVtZW50cywgeW91IGhhdmUgb25lIGVsZW1lbnQgb2Ygc2l6ZSA4LCBvbmUgb2Ygc2l6ZSA0LCBhbmQgb25lIG9mIHNpemUgMS4gIEhlbmNlXG4gICAgIHdoZW4gYSBuZXcgZWxlbWVudCBjb21lcyBhbG9uZywgdGhlIG51bWJlciBvZiBjb21iaW5pbmdzIHlvdSBuZWVkIHRvIGRvIGlzIHRoZSBudW1iZXJcbiAgICAgb2YgdHJhaWxpbmcgMXMgaW4gdGhlIGJpbmFyeSBleHBhbnNpb24gb2YgW251bV0sIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBoYXZlXG4gICAgIGFscmVhZHkgZ29uZSBpbnRvIHRoZSBhY2N1bXVsYXRvci4gIFRoZSBhY2N1bXVsYXRvciBpcyBpbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2l6ZSwgc29cbiAgICAgdGhlIG5leHQgZWxlbWVudCB0byBjb21iaW5lIHdpdGggaXMgYWx3YXlzIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAqKVxuICBsZXQgcmVjIHN0ZXBfYWNjdW0gbnVtIGFjYyB4ID1cbiAgICBpZiBudW0gbGFuZCAxID0gMFxuICAgIHRoZW4geCA6OiBhY2NcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGFjYyB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgICAgKCogTmV3IGVsZW1lbnRzIGZyb20gbGF0ZXIgaW4gdGhlIGlucHV0IGxpc3QgZ28gb24gdGhlIGZyb250IG9mIHRoZSBhY2N1bXVsYXRvciwgc29cbiAgICAgICAgIHRoZSBhY2N1bXVsYXRvciBpcyBpbiByZXZlcnNlIG9yZGVyIHdydCB0aGUgb3JpZ2luYWwgbGlzdCBvcmRlciwgaGVuY2UgW2YgeSB4XVxuICAgICAgICAgaW5zdGVhZCBvZiBbZiB4IHldLiAqKVxuICAgICAgfCB5IDo6IHlzIC0+IHN0ZXBfYWNjdW0gKG51bSBhc3IgMSkgeXMgKGYgeSB4KSlcbiAgaW5cbiAgKCogRXhwZXJpbWVudGFsbHksIGlubGluaW5nIFtmb2xkaV0gYW5kIHVucm9sbGluZyB0aGlzIGxvb3AgYSBmZXcgdGltZXMgY2FuIHJlZHVjZVxuICAgICBydW50aW1lIGRvd24gdG8gYSB0aGlyZCBhbmQgYWxsb2NhdGlvbiB0byAxLzE2dGggb3Igc28gaW4gdGhlIG1pY3JvYmVuY2htYXJrcyBiZWxvdy5cbiAgICAgSG93ZXZlciwgaW4gbW9zdCB1c2UgY2FzZXMgW2ZdIGlzIGxpa2VseSB0byBiZSBleHBlbnNpdmUgKG90aGVyd2lzZSB3aHkgZG8geW91IGNhcmVcbiAgICAgYWJvdXQgdGhlIG9yZGVyIG9mIHJlZHVjdGlvbj8pIHNvIHRoZSBvdmVyaGVhZCBvZiB0aGlzIGZ1bmN0aW9uIGl0c2VsZiBkb2Vzbid0IHJlYWxseVxuICAgICBtYXR0ZXIuIElmIHlvdSBjb21lIHVwIHdpdGggYSB1c2UtY2FzZSB3aGVyZSBpdCBkb2VzLCB0aGVuIHRoYXQncyBzb21ldGhpbmcgeW91IG1pZ2h0XG4gICAgIHdhbnQgdG8gdHJ5OiBzZWUgaGcgbG9nIC1wciA0OWVmMDY1ZjQyOWQuICopXG4gIG1hdGNoIGZvbGRpIGwgfmluaXQ6W10gfmY6c3RlcF9hY2N1bSB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogeHMgLT4gU29tZSAoZm9sZCB4cyB+aW5pdDp4IH5mOihmdW4geCB5IC0+IGYgeSB4KSlcbjs7XG5cbmxldCByZWR1Y2VfYmFsYW5jZWRfZXhuIGwgfmYgPVxuICBtYXRjaCByZWR1Y2VfYmFsYW5jZWQgbCB+ZiB3aXRoXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmVkdWNlX2JhbGFuY2VkX2V4blwiXG4gIHwgU29tZSB2IC0+IHZcbjs7XG5cbmxldCBncm91cGkgbCB+YnJlYWsgPVxuICBsZXQgZ3JvdXBzID1cbiAgICBmb2xkaSBsIH5pbml0OltdIH5mOihmdW4gaSBhY2MgeCAtPlxuICAgICAgbWF0Y2ggYWNjIHdpdGhcbiAgICAgIHwgW10gLT4gWyBbIHggXSBdXG4gICAgICB8IGN1cnJlbnRfZ3JvdXAgOjogdGwgLT5cbiAgICAgICAgaWYgYnJlYWsgaSAoaGRfZXhuIGN1cnJlbnRfZ3JvdXApIHhcbiAgICAgICAgdGhlbiBbIHggXSA6OiBjdXJyZW50X2dyb3VwIDo6IHRsICgqIHN0YXJ0IG5ldyBncm91cCAqKVxuICAgICAgICBlbHNlICh4IDo6IGN1cnJlbnRfZ3JvdXApIDo6IHRsKVxuICAgICgqIGV4dGVuZCBjdXJyZW50IGdyb3VwICopXG4gIGluXG4gIG1hdGNoIGdyb3VwcyB3aXRoXG4gIHwgW10gLT4gW11cbiAgfCBsIC0+IHJldl9tYXAgbCB+ZjpyZXZcbjs7XG5cbmxldCBncm91cCBsIH5icmVhayA9IGdyb3VwaSBsIH5icmVhazooZnVuIF8geCB5IC0+IGJyZWFrIHggeSlcblxubGV0IHNvcnRfYW5kX2dyb3VwIGwgfmNvbXBhcmUgPVxuICBsIHw+IHN0YWJsZV9zb3J0IH5jb21wYXJlIHw+IGdyb3VwIH5icmVhazooZnVuIHggeSAtPiBjb21wYXJlIHggeSA8PiAwKVxuOztcblxubGV0IGNvbmNhdF9tYXAgbCB+ZiA9XG4gIGxldCByZWMgYXV4IGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjXG4gICAgfCBoZCA6OiB0bCAtPiBhdXggKHJldl9hcHBlbmQgKGYgaGQpIGFjYykgdGxcbiAgaW5cbiAgYXV4IFtdIGxcbjs7XG5cbmxldCBjb25jYXRfbWFwaSBsIH5mID1cbiAgbGV0IHJlYyBhdXggY29udCBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gcmV2IGFjY1xuICAgIHwgaGQgOjogdGwgLT4gYXV4IChjb250ICsgMSkgKHJldl9hcHBlbmQgKGYgY29udCBoZCkgYWNjKSB0bFxuICBpblxuICBhdXggMCBbXSBsXG47O1xuXG5sZXQgbWVyZ2UgbDEgbDIgfmNvbXBhcmUgPVxuICBsZXQgcmVjIGxvb3AgYWNjIGwxIGwyID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgYWNjIGwyXG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBhY2MgbDFcbiAgICB8IGgxIDo6IHQxLCBoMiA6OiB0MiAtPlxuICAgICAgaWYgY29tcGFyZSBoMSBoMiA8PSAwIHRoZW4gbG9vcCAoaDEgOjogYWNjKSB0MSBsMiBlbHNlIGxvb3AgKGgyIDo6IGFjYykgbDEgdDJcbiAgaW5cbiAgbG9vcCBbXSBsMSBsMlxuOztcblxubW9kdWxlIENhcnRlc2lhbl9wcm9kdWN0ID0gc3RydWN0XG4gICgqIFdlIGFyZSBleHBsaWNpdCBhYm91dCB3aGF0IHdlIGV4cG9ydCBmcm9tIGZ1bmN0b3JzIHNvIHRoYXQgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5XG4gICAgIHJlYmluZCBtb3JlIGVmZmljaWVudCBsaXN0LXNwZWNpZmljIGZ1bmN0aW9ucy4gKilcblxuICBsZXQgYmluZCA9IGNvbmNhdF9tYXBcbiAgbGV0IG1hcCA9IG1hcFxuICBsZXQgbWFwMiBhIGIgfmYgPSBjb25jYXRfbWFwIGEgfmY6KGZ1biB4IC0+IG1hcCBiIH5mOihmdW4geSAtPiBmIHggeSkpXG4gIGxldCByZXR1cm4geCA9IFsgeCBdXG4gIGxldCAoID4+fCApID0gKCA+PnwgKVxuICBsZXQgKCA+Pj0gKSB0IGYgPSBiaW5kIHQgfmZcblxuICBvcGVuIHN0cnVjdFxuICAgIG1vZHVsZSBBcHBsaWNhdGl2ZSA9IEFwcGxpY2F0aXZlLk1ha2VfdXNpbmdfbWFwMiAoc3RydWN0XG4gICAgICAgIHR5cGUgJ2EgdCA9ICdhIGxpc3RcblxuICAgICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgICAgICBsZXQgbWFwMiA9IG1hcDJcbiAgICAgIGVuZClcblxuICAgIG1vZHVsZSBNb25hZCA9IE1vbmFkLk1ha2UgKHN0cnVjdFxuICAgICAgICB0eXBlICdhIHQgPSAnYSBsaXN0XG5cbiAgICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICAgICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgICBlbmQpXG4gIGVuZFxuXG4gIGxldCBhbGwgPSBNb25hZC5hbGxcbiAgbGV0IGFsbF91bml0ID0gTW9uYWQuYWxsX3VuaXRcbiAgbGV0IGlnbm9yZV9tID0gTW9uYWQuaWdub3JlX21cbiAgbGV0IGpvaW4gPSBNb25hZC5qb2luXG5cbiAgbW9kdWxlIE1vbmFkX2luZml4ID0gc3RydWN0XG4gICAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gICAgbGV0ICggPj49ICkgPSAoID4+PSApXG4gIGVuZFxuXG4gIGxldCBhcHBseSA9IEFwcGxpY2F0aXZlLmFwcGx5XG4gIGxldCBib3RoID0gQXBwbGljYXRpdmUuYm90aFxuICBsZXQgbWFwMyA9IEFwcGxpY2F0aXZlLm1hcDNcbiAgbGV0ICggPCo+ICkgPSBBcHBsaWNhdGl2ZS4oIDwqPiApXG4gIGxldCAoICo+ICkgPSBBcHBsaWNhdGl2ZS4oICo+IClcbiAgbGV0ICggPCogKSA9IEFwcGxpY2F0aXZlLiggPCogKVxuXG4gIG1vZHVsZSBBcHBsaWNhdGl2ZV9pbmZpeCA9IHN0cnVjdFxuICAgIGxldCAoID4+fCApID0gKCA+PnwgKVxuICAgIGxldCAoIDwqPiApID0gQXBwbGljYXRpdmUuKCA8Kj4gKVxuICAgIGxldCAoICo+ICkgPSBBcHBsaWNhdGl2ZS4oICo+IClcbiAgICBsZXQgKCA8KiApID0gQXBwbGljYXRpdmUuKCA8KiApXG4gIGVuZFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgIGxldCAoID4+fCApID0gKCA+PnwgKVxuICAgIGxldCAoID4+PSApID0gKCA+Pj0gKVxuXG4gICAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgIGxldCBiaW5kID0gYmluZFxuICAgICAgbGV0IG1hcCA9IG1hcFxuICAgICAgbGV0IGJvdGggPSBib3RoXG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA9IHN0cnVjdCBlbmRcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxuaW5jbHVkZSAoQ2FydGVzaWFuX3Byb2R1Y3QgOiBNb25hZC5TIHdpdGggdHlwZSAnYSB0IDo9ICdhIHQpXG5cbigqKiByZXR1cm5zIGZpbmFsIGVsZW1lbnQgb2YgbGlzdCAqKVxubGV0IHJlYyBsYXN0X2V4biBsaXN0ID1cbiAgbWF0Y2ggbGlzdCB3aXRoXG4gIHwgWyB4IF0gLT4geFxuICB8IF8gOjogdGwgLT4gbGFzdF9leG4gdGxcbiAgfCBbXSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QubGFzdFwiXG47O1xuXG4oKiogb3B0aW9uYWxseSByZXR1cm5zIGZpbmFsIGVsZW1lbnQgb2YgbGlzdCAqKVxubGV0IHJlYyBsYXN0IGxpc3QgPVxuICBtYXRjaCBsaXN0IHdpdGhcbiAgfCBbIHggXSAtPiBTb21lIHhcbiAgfCBfIDo6IHRsIC0+IGxhc3QgdGxcbiAgfCBbXSAtPiBOb25lXG47O1xuXG5sZXQgcmVjIGlzX3ByZWZpeCBsaXN0IH5wcmVmaXggfmVxdWFsID1cbiAgbWF0Y2ggcHJlZml4IHdpdGhcbiAgfCBbXSAtPiB0cnVlXG4gIHwgaGQgOjogdGwgLT5cbiAgICAobWF0Y2ggbGlzdCB3aXRoXG4gICAgIHwgW10gLT4gZmFsc2VcbiAgICAgfCBoZCcgOjogdGwnIC0+IGVxdWFsIGhkIGhkJyAmJiBpc19wcmVmaXggdGwnIH5wcmVmaXg6dGwgfmVxdWFsKVxuOztcblxubGV0IGZpbmRfY29uc2VjdXRpdmVfZHVwbGljYXRlIHQgfmVxdWFsID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IGExIDo6IHQgLT5cbiAgICBsZXQgcmVjIGxvb3AgYTEgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgW10gLT4gTm9uZVxuICAgICAgfCBhMiA6OiB0IC0+IGlmIGVxdWFsIGExIGEyIHRoZW4gU29tZSAoYTEsIGEyKSBlbHNlIGxvb3AgYTIgdFxuICAgIGluXG4gICAgbG9vcCBhMSB0XG47O1xuXG4oKiByZXR1cm5zIGxpc3Qgd2l0aG91dCBhZGphY2VudCBkdXBsaWNhdGVzICopXG5sZXQgcmVtb3ZlX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZXMgPyh3aGljaF90b19rZWVwID0gYExhc3QpIGxpc3QgfmVxdWFsID1cbiAgbGV0IHJlYyBsb29wIHRvX2tlZXAgYWNjdW0gPSBmdW5jdGlvblxuICAgIHwgW10gLT4gdG9fa2VlcCA6OiBhY2N1bVxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgIGlmIGVxdWFsIGhkIHRvX2tlZXBcbiAgICAgIHRoZW4gKFxuICAgICAgICBsZXQgdG9fa2VlcCA9XG4gICAgICAgICAgbWF0Y2ggd2hpY2hfdG9fa2VlcCB3aXRoXG4gICAgICAgICAgfCBgRmlyc3QgLT4gdG9fa2VlcFxuICAgICAgICAgIHwgYExhc3QgLT4gaGRcbiAgICAgICAgaW5cbiAgICAgICAgbG9vcCB0b19rZWVwIGFjY3VtIHRsKVxuICAgICAgZWxzZSBsb29wIGhkICh0b19rZWVwIDo6IGFjY3VtKSB0bFxuICBpblxuICBtYXRjaCBsaXN0IHdpdGhcbiAgfCBbXSAtPiBbXVxuICB8IGhkIDo6IHRsIC0+IHJldiAobG9vcCBoZCBbXSB0bClcbjs7XG5cbigqKiByZXR1cm5zIHNvcnRlZCB2ZXJzaW9uIG9mIGxpc3Qgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQgKilcbmxldCBkZWR1cF9hbmRfc29ydCBsaXN0IH5jb21wYXJlID1cbiAgbWF0Y2ggbGlzdCB3aXRoXG4gIHwgW10gfCBbIF8gXSAtPiBsaXN0ICgqIHBlcmZvcm1hbmNlIGhhY2sgKilcbiAgfCBfIC0+XG4gICAgbGV0IGVxdWFsIHggeCcgPSBjb21wYXJlIHggeCcgPSAwIGluXG4gICAgbGV0IHNvcnRlZCA9IHNvcnQgfmNvbXBhcmUgbGlzdCBpblxuICAgIHJlbW92ZV9jb25zZWN1dGl2ZV9kdXBsaWNhdGVzIH5lcXVhbCBzb3J0ZWRcbjs7XG5cbmxldCBmaW5kX2FfZHVwIGwgfmNvbXBhcmUgPVxuICBsZXQgc29ydGVkID0gc29ydCBsIH5jb21wYXJlIGluXG4gIGxldCByZWMgbG9vcCBsID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIHwgWyBfIF0gLT4gTm9uZVxuICAgIHwgaGQxIDo6IChoZDIgOjogXyBhcyB0bCkgLT4gaWYgY29tcGFyZSBoZDEgaGQyID0gMCB0aGVuIFNvbWUgaGQxIGVsc2UgbG9vcCB0bFxuICBpblxuICBsb29wIHNvcnRlZFxuOztcblxubGV0IGNvbnRhaW5zX2R1cCBsc3QgfmNvbXBhcmUgPVxuICBtYXRjaCBmaW5kX2FfZHVwIGxzdCB+Y29tcGFyZSB3aXRoXG4gIHwgU29tZSBfIC0+IHRydWVcbiAgfCBOb25lIC0+IGZhbHNlXG47O1xuXG5sZXQgZmluZF9hbGxfZHVwcyBsIH5jb21wYXJlID1cbiAgKCogV2UgYWRkIHRoaXMgcmV2ZXJzYWwsIHNvIHdlIGNhbiBza2lwIGEgW3Jldl0gYXQgdGhlIGVuZC4gV2UgY291bGQgc2tpcFxuICAgICBbcmV2XSBhbnl3YXkgc2luY2Ugd2UgZG9uIG5vdCBnaXZlIGFueSBvcmRlcmluZyBndWFyYW50ZWVzLCBidXQgaXQgaXNcbiAgICAgbmljZSB0byBnZXQgcmVzdWx0cyBpbiBuYXR1cmFsIG9yZGVyLiAqKVxuICBsZXQgY29tcGFyZSBhIGIgPSAtMSAqIGNvbXBhcmUgYSBiIGluXG4gIGxldCBzb3J0ZWQgPSBzb3J0IH5jb21wYXJlIGwgaW5cbiAgKCogV2FsayB0aGUgbGlzdCBhbmQgcmVjb3JkIHRoZSBmaXJzdCBvZiBlYWNoIGNvbnNlY3V0aXZlIHJ1biBvZiBpZGVudGljYWwgZWxlbWVudHMgKilcbiAgbGV0IHJlYyBsb29wIHNvcnRlZCBwcmV2IH5hbHJlYWR5X3JlY29yZGVkIGFjYyA9XG4gICAgbWF0Y2ggc29ydGVkIHdpdGhcbiAgICB8IFtdIC0+IGFjY1xuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgcHJldiBoZCA8PiAwXG4gICAgICB0aGVuIGxvb3AgdGwgaGQgfmFscmVhZHlfcmVjb3JkZWQ6ZmFsc2UgYWNjXG4gICAgICBlbHNlIGlmIGFscmVhZHlfcmVjb3JkZWRcbiAgICAgIHRoZW4gbG9vcCB0bCBoZCB+YWxyZWFkeV9yZWNvcmRlZDp0cnVlIGFjY1xuICAgICAgZWxzZSBsb29wIHRsIGhkIH5hbHJlYWR5X3JlY29yZGVkOnRydWUgKGhkIDo6IGFjYylcbiAgaW5cbiAgbWF0Y2ggc29ydGVkIHdpdGhcbiAgfCBbXSAtPiBbXVxuICB8IGhkIDo6IHRsIC0+IGxvb3AgdGwgaGQgfmFscmVhZHlfcmVjb3JkZWQ6ZmFsc2UgW11cbjs7XG5cbmxldCByZWMgYWxsX2VxdWFsX3RvIHQgdiB+ZXF1YWwgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiB0cnVlXG4gIHwgeCA6OiB4cyAtPiBlcXVhbCB4IHYgJiYgYWxsX2VxdWFsX3RvIHhzIHYgfmVxdWFsXG47O1xuXG5sZXQgYWxsX2VxdWFsIHQgfmVxdWFsID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogeHMgLT4gaWYgYWxsX2VxdWFsX3RvIHhzIHggfmVxdWFsIHRoZW4gU29tZSB4IGVsc2UgTm9uZVxuOztcblxubGV0IGNvdW50IHQgfmYgPSBDb250YWluZXIuY291bnQgfmZvbGQgdCB+ZlxubGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxubGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbmxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5cbmxldCBjb3VudGkgdCB+ZiA9XG4gIGZvbGRpIHQgfmluaXQ6MCB+ZjooZnVuIGlkeCBjb3VudCBhIC0+IGlmIGYgaWR4IGEgdGhlbiBjb3VudCArIDEgZWxzZSBjb3VudClcbjs7XG5cbmxldCBpbml0IG4gfmYgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnZiBcIkxpc3QuaW5pdCAlZFwiIG4gKCk7XG4gIGxldCByZWMgbG9vcCBpIGFjY3VtID1cbiAgICBhc3NlcnQgKGkgPj0gMCk7XG4gICAgaWYgaSA9IDAgdGhlbiBhY2N1bSBlbHNlIGxvb3AgKGkgLSAxKSAoZiAoaSAtIDEpIDo6IGFjY3VtKVxuICBpblxuICBsb29wIG4gW11cbjs7XG5cbmxldCByZXZfZmlsdGVyX21hcCBsIH5mID1cbiAgbGV0IHJlYyBsb29wIGwgYWNjdW0gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gYWNjdW1cbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAobWF0Y2ggZiBoZCB3aXRoXG4gICAgICAgfCBTb21lIHggLT4gbG9vcCB0bCAoeCA6OiBhY2N1bSlcbiAgICAgICB8IE5vbmUgLT4gbG9vcCB0bCBhY2N1bSlcbiAgaW5cbiAgbG9vcCBsIFtdXG47O1xuXG5sZXQgZmlsdGVyX21hcCBsIH5mID0gcmV2IChyZXZfZmlsdGVyX21hcCBsIH5mKVxuXG5sZXQgcmV2X2ZpbHRlcl9tYXBpIGwgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSBsIGFjY3VtID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IGFjY3VtXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgKG1hdGNoIGYgaSBoZCB3aXRoXG4gICAgICAgfCBTb21lIHggLT4gbG9vcCAoaSArIDEpIHRsICh4IDo6IGFjY3VtKVxuICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSkgdGwgYWNjdW0pXG4gIGluXG4gIGxvb3AgMCBsIFtdXG47O1xuXG5sZXQgZmlsdGVyX21hcGkgbCB+ZiA9IHJldiAocmV2X2ZpbHRlcl9tYXBpIGwgfmYpXG5sZXQgZmlsdGVyX29wdCBsID0gZmlsdGVyX21hcCBsIH5mOkZuLmlkXG5cbmxldCBwYXJ0aXRpb24zX21hcCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHQgZnN0IHNuZCB0cmQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gcmV2IGZzdCwgcmV2IHNuZCwgcmV2IHRyZFxuICAgIHwgeCA6OiB0IC0+XG4gICAgICAobWF0Y2ggZiB4IHdpdGhcbiAgICAgICB8IGBGc3QgeSAtPiBsb29wIHQgKHkgOjogZnN0KSBzbmQgdHJkXG4gICAgICAgfCBgU25kIHkgLT4gbG9vcCB0IGZzdCAoeSA6OiBzbmQpIHRyZFxuICAgICAgIHwgYFRyZCB5IC0+IGxvb3AgdCBmc3Qgc25kICh5IDo6IHRyZCkpXG4gIGluXG4gIGxvb3AgdCBbXSBbXSBbXVxuOztcblxubGV0IHBhcnRpdGlvbl90ZiB0IH5mID1cbiAgbGV0IGYgeCA6IF8gRWl0aGVyLnQgPSBpZiBmIHggdGhlbiBGaXJzdCB4IGVsc2UgU2Vjb25kIHggaW5cbiAgcGFydGl0aW9uX21hcCB0IH5mXG47O1xuXG5sZXQgcGFydGl0aW9uX3Jlc3VsdCB0ID0gcGFydGl0aW9uX21hcCB0IH5mOlJlc3VsdC50b19laXRoZXJcblxubW9kdWxlIEFzc29jID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdCA9ICgnYSAqICdiKSBsaXN0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IHRfb2Zfc2V4cCA6XG4gICAgJ2EgJ2IuXG4gICAgKFNleHBsaWIwLlNleHAudCAtPiAnYSlcbiAgICAtPiAoU2V4cGxpYjAuU2V4cC50IC0+ICdiKVxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICA9XG4gICAgbGV0IGVycm9yX3NvdXJjZV9fMDIyXyA9IFwibGlzdC5tbC5Bc3NvYy50XCIgaW5cbiAgICBmdW4gX29mX2FfXzAxNF8gX29mX2JfXzAxNV8geF9fMDIzXyAtPlxuICAgICAgbGlzdF9vZl9zZXhwXG4gICAgICAgIChmdW5jdGlvblxuICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFsgYXJnMF9fMDE3XzsgYXJnMV9fMDE4XyBdIC0+XG4gICAgICAgICAgICBsZXQgcmVzMF9fMDE5XyA9IF9vZl9hX18wMTRfIGFyZzBfXzAxN19cbiAgICAgICAgICAgIGFuZCByZXMxX18wMjBfID0gX29mX2JfXzAxNV8gYXJnMV9fMDE4XyBpblxuICAgICAgICAgICAgcmVzMF9fMDE5XywgcmVzMV9fMDIwX1xuICAgICAgICAgIHwgc2V4cF9fMDIxXyAtPlxuICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnR1cGxlX29mX3NpemVfbl9leHBlY3RlZFxuICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAyMl9cbiAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICBzZXhwX18wMjFfKVxuICAgICAgICB4X18wMjNfXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6XG4gICAgJ2EgJ2IuXG4gICAgKCdhIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2IgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICA9XG4gICAgZnVuIF9vZl9hX18wMjRfIF9vZl9iX18wMjVfIHhfXzAzMF8gLT5cbiAgICAgIHNleHBfb2ZfbGlzdFxuICAgICAgICAoZnVuIChhcmcwX18wMjZfLCBhcmcxX18wMjdfKSAtPlxuICAgICAgICAgICBsZXQgcmVzMF9fMDI4XyA9IF9vZl9hX18wMjRfIGFyZzBfXzAyNl9cbiAgICAgICAgICAgYW5kIHJlczFfXzAyOV8gPSBfb2ZfYl9fMDI1XyBhcmcxX18wMjdfIGluXG4gICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIHJlczBfXzAyOF87IHJlczFfXzAyOV8gXSlcbiAgICAgICAgeF9fMDMwX1xuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOlxuICAgICAgICAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAnYiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICgnYSwgJ2IpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIF8nYl9zZXhwX2dyYW1tYXIgLT5cbiAgICAgIGxpc3Rfc2V4cF9ncmFtbWFyXG4gICAgICAgIHsgdW50eXBlZCA9XG4gICAgICAgICAgICBMaXN0IChDb25zIChfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWQsIENvbnMgKF8nYl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpKSlcbiAgICAgICAgfVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IHBhaXJfb2ZfZ3JvdXAgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYXNzZXJ0IGZhbHNlXG4gICAgfCAoaywgXykgOjogXyBhcyBsaXN0IC0+IGssIG1hcCBsaXN0IH5mOnNuZFxuICA7O1xuXG4gIGxldCBncm91cCBhbGlzdCB+ZXF1YWwgPVxuICAgIGdyb3VwIGFsaXN0IH5icmVhazooZnVuICh4LCBfKSAoeSwgXykgLT4gbm90IChlcXVhbCB4IHkpKSB8PiBtYXAgfmY6cGFpcl9vZl9ncm91cFxuICA7O1xuXG4gIGxldCBzb3J0X2FuZF9ncm91cCBhbGlzdCB+Y29tcGFyZSA9XG4gICAgc29ydF9hbmRfZ3JvdXAgYWxpc3QgfmNvbXBhcmU6KGZ1biAoeCwgXykgKHksIF8pIC0+IGNvbXBhcmUgeCB5KVxuICAgIHw+IG1hcCB+ZjpwYWlyX29mX2dyb3VwXG4gIDs7XG5cbiAgbGV0IGZpbmQgdCB+ZXF1YWwga2V5ID1cbiAgICBtYXRjaCBmaW5kIHQgfmY6KGZ1biAoa2V5JywgXykgLT4gZXF1YWwga2V5IGtleScpIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSB4IC0+IFNvbWUgKHNuZCB4KVxuICA7O1xuXG4gIGxldCBmaW5kX2V4biA9XG4gICAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiTGlzdC5Bc3NvYy5maW5kX2V4bjogbm90IGZvdW5kXCIpIGluXG4gICAgbGV0IGZpbmRfZXhuIHQgfmVxdWFsIGtleSA9XG4gICAgICBtYXRjaCBmaW5kIHQga2V5IH5lcXVhbCB3aXRoXG4gICAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgICB8IFNvbWUgdmFsdWUgLT4gdmFsdWVcbiAgICBpblxuICAgICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgICBmaW5kX2V4blxuICA7O1xuXG4gIGxldCBtZW0gdCB+ZXF1YWwga2V5ID1cbiAgICBtYXRjaCBmaW5kIHQgfmVxdWFsIGtleSB3aXRoXG4gICAgfCBOb25lIC0+IGZhbHNlXG4gICAgfCBTb21lIF8gLT4gdHJ1ZVxuICA7O1xuXG4gIGxldCByZW1vdmUgdCB+ZXF1YWwga2V5ID0gZmlsdGVyIHQgfmY6KGZ1biAoa2V5JywgXykgLT4gbm90IChlcXVhbCBrZXkga2V5JykpXG5cbiAgbGV0IGFkZCB0IH5lcXVhbCBrZXkgdmFsdWUgPVxuICAgICgqIHRoZSByZW1vdmUgZG9lc24ndCBjaGFuZ2UgdGhlIG1hcCBzZW1hbnRpY3MsIGJ1dCBrZWVwcyB0aGUgbGlzdCBzbWFsbCAqKVxuICAgIChrZXksIHZhbHVlKSA6OiByZW1vdmUgdCB+ZXF1YWwga2V5XG4gIDs7XG5cbiAgbGV0IGludmVyc2UgdCA9IG1hcCB0IH5mOihmdW4gKHgsIHkpIC0+IHksIHgpXG4gIGxldCBtYXAgdCB+ZiA9IG1hcCB0IH5mOihmdW4gKGtleSwgdmFsdWUpIC0+IGtleSwgZiB2YWx1ZSlcbmVuZFxuXG5sZXQgc3ViIGwgfnBvcyB+bGVuID1cbiAgKCogV2UgdXNlIFtwb3MgPiBsZW5ndGggbCAtIGxlbl0gcmF0aGVyIHRoYW4gW3BvcyArIGxlbiA+IGxlbmd0aCBsXSB0byBhdm9pZCB0aGVcbiAgICAgcG9zc2liaWxpdHkgb2Ygb3ZlcmZsb3cuICopXG4gIGlmIHBvcyA8IDAgfHwgbGVuIDwgMCB8fCBwb3MgPiBsZW5ndGggbCAtIGxlbiB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5zdWJcIjtcbiAgcmV2XG4gICAgKGZvbGRpIGwgfmluaXQ6W10gfmY6KGZ1biBpIGFjYyBlbCAtPlxuICAgICAgIGlmIGkgPj0gcG9zICYmIGkgPCBwb3MgKyBsZW4gdGhlbiBlbCA6OiBhY2MgZWxzZSBhY2MpKVxuOztcblxubGV0IHNwbGl0X24gdF9vcmlnIG4gPVxuICBpZiBuIDw9IDBcbiAgdGhlbiBbXSwgdF9vcmlnXG4gIGVsc2UgKFxuICAgIGxldCByZWMgbG9vcCBuIHQgYWNjdW0gPVxuICAgICAgaWYgbiA9IDBcbiAgICAgIHRoZW4gcmV2IGFjY3VtLCB0XG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgW10gLT4gdF9vcmlnLCBbXSAoKiBpbiB0aGlzIGNhc2UsIHRfb3JpZyA9IHJldiBhY2N1bSAqKVxuICAgICAgICB8IGhkIDo6IHRsIC0+IGxvb3AgKG4gLSAxKSB0bCAoaGQgOjogYWNjdW0pKVxuICAgIGluXG4gICAgbG9vcCBuIHRfb3JpZyBbXSlcbjs7XG5cbigqIGNvcGllZCBmcm9tIFtzcGxpdF9uXSB0byBhdm9pZCBhbGxvY2F0aW5nIGEgdHVwbGUgKilcbmxldCB0YWtlIHRfb3JpZyBuID1cbiAgaWYgbiA8PSAwXG4gIHRoZW4gW11cbiAgZWxzZSAoXG4gICAgbGV0IHJlYyBsb29wIG4gdCBhY2N1bSA9XG4gICAgICBpZiBuID0gMFxuICAgICAgdGhlbiByZXYgYWNjdW1cbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBbXSAtPiB0X29yaWdcbiAgICAgICAgfCBoZCA6OiB0bCAtPiBsb29wIChuIC0gMSkgdGwgKGhkIDo6IGFjY3VtKSlcbiAgICBpblxuICAgIGxvb3AgbiB0X29yaWcgW10pXG47O1xuXG5sZXQgcmVjIGRyb3AgdCBuID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgXyA6OiB0bCB3aGVuIG4gPiAwIC0+IGRyb3AgdGwgKG4gLSAxKVxuICB8IHQgLT4gdFxuOztcblxubGV0IGNodW5rc19vZiBsIH5sZW5ndGggPVxuICBpZiBsZW5ndGggPD0gMCB0aGVuIGludmFsaWRfYXJnZiBcIkxpc3QuY2h1bmtzX29mOiBFeHBlY3RlZCBsZW5ndGggPiAwLCBnb3QgJWRcIiBsZW5ndGggKCk7XG4gIGxldCByZWMgYXV4IG9mX2xlbmd0aCBhY2MgbCA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiByZXYgYWNjXG4gICAgfCBfIDo6IF8gLT5cbiAgICAgIGxldCBzdWJsaXN0LCBsID0gc3BsaXRfbiBsIGxlbmd0aCBpblxuICAgICAgYXV4IG9mX2xlbmd0aCAoc3VibGlzdCA6OiBhY2MpIGxcbiAgaW5cbiAgYXV4IGxlbmd0aCBbXSBsXG47O1xuXG5sZXQgc3BsaXRfd2hpbGUgeHMgfmYgPVxuICBsZXQgcmVjIGxvb3AgYWNjID0gZnVuY3Rpb25cbiAgICB8IGhkIDo6IHRsIHdoZW4gZiBoZCAtPiBsb29wIChoZCA6OiBhY2MpIHRsXG4gICAgfCB0IC0+IHJldiBhY2MsIHRcbiAgaW5cbiAgbG9vcCBbXSB4c1xuOztcblxuKCogY29waWVkIGZyb20gW3NwbGl0X3doaWxlXSB0byBhdm9pZCBhbGxvY2F0aW5nIGEgdHVwbGUgKilcbmxldCB0YWtlX3doaWxlIHhzIH5mID1cbiAgbGV0IHJlYyBsb29wIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCB3aGVuIGYgaGQgLT4gbG9vcCAoaGQgOjogYWNjKSB0bFxuICAgIHwgXyAtPiByZXYgYWNjXG4gIGluXG4gIGxvb3AgW10geHNcbjs7XG5cbmxldCByZWMgZHJvcF93aGlsZSB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgaGQgOjogdGwgd2hlbiBmIGhkIC0+IGRyb3Bfd2hpbGUgdGwgfmZcbiAgfCB0IC0+IHRcbjs7XG5cbmxldCBkcm9wX2xhc3QgdCA9XG4gIG1hdGNoIHJldiB0IHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgXyA6OiBsc3QgLT4gU29tZSAocmV2IGxzdClcbjs7XG5cbmxldCBkcm9wX2xhc3RfZXhuIHQgPVxuICBtYXRjaCBkcm9wX2xhc3QgdCB3aXRoXG4gIHwgTm9uZSAtPiBmYWlsd2l0aCBcIkxpc3QuZHJvcF9sYXN0X2V4bjogZW1wdHkgbGlzdFwiXG4gIHwgU29tZSBsc3QgLT4gbHN0XG47O1xuXG5sZXQgY2FydGVzaWFuX3Byb2R1Y3QgbGlzdDEgbGlzdDIgPVxuICBpZiBpc19lbXB0eSBsaXN0MlxuICB0aGVuIFtdXG4gIGVsc2UgKFxuICAgIGxldCByZWMgbG9vcCBsMSBsMiBhY2N1bSA9XG4gICAgICBtYXRjaCBsMSB3aXRoXG4gICAgICB8IFtdIC0+IGFjY3VtXG4gICAgICB8IGhkIDo6IHRsIC0+IGxvb3AgdGwgbDIgKHJldl9hcHBlbmQgKG1hcCB+ZjooZnVuIHggLT4gaGQsIHgpIGwyKSBhY2N1bSlcbiAgICBpblxuICAgIHJldiAobG9vcCBsaXN0MSBsaXN0MiBbXSkpXG47O1xuXG5sZXQgY29uY2F0IGwgPSBmb2xkX3JpZ2h0IGwgfmluaXQ6W10gfmY6YXBwZW5kXG5sZXQgY29uY2F0X25vX29yZGVyIGwgPSBmb2xkIGwgfmluaXQ6W10gfmY6KGZ1biBhY2MgbCAtPiByZXZfYXBwZW5kIGwgYWNjKVxubGV0IGNvbnMgeCBsID0geCA6OiBsXG5cbmxldCBpc19zb3J0ZWQgbCB+Y29tcGFyZSA9XG4gIGxldCByZWMgbG9vcCBsID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIHwgWyBfIF0gLT4gdHJ1ZVxuICAgIHwgeDEgOjogKHgyIDo6IF8gYXMgcmVzdCkgLT4gY29tcGFyZSB4MSB4MiA8PSAwICYmIGxvb3AgcmVzdFxuICBpblxuICBsb29wIGxcbjs7XG5cbmxldCBpc19zb3J0ZWRfc3RyaWN0bHkgbCB+Y29tcGFyZSA9XG4gIGxldCByZWMgbG9vcCBsID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIHwgWyBfIF0gLT4gdHJ1ZVxuICAgIHwgeDEgOjogKHgyIDo6IF8gYXMgcmVzdCkgLT4gY29tcGFyZSB4MSB4MiA8IDAgJiYgbG9vcCByZXN0XG4gIGluXG4gIGxvb3AgbFxuOztcblxubW9kdWxlIEluZml4ID0gc3RydWN0XG4gIGxldCAoIEAgKSA9IGFwcGVuZFxuZW5kXG5cbmxldCBwZXJtdXRlID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGxpc3QgPVxuICBtYXRjaCBsaXN0IHdpdGhcbiAgKCogc3BlY2lhbCBjYXNlcyB0byBzcGVlZCB0aGluZ3MgdXAgaW4gdHJpdmlhbCBjYXNlcyAqKVxuICB8IFtdIHwgWyBfIF0gLT4gbGlzdFxuICB8IFsgeDsgeSBdIC0+IGlmIFJhbmRvbS5TdGF0ZS5ib29sIHJhbmRvbV9zdGF0ZSB0aGVuIFsgeTsgeCBdIGVsc2UgbGlzdFxuICB8IF8gLT5cbiAgICBsZXQgYXJyID0gQXJyYXkub2ZfbGlzdCBsaXN0IGluXG4gICAgQXJyYXlfcGVybXV0ZS5wZXJtdXRlIGFyciB+cmFuZG9tX3N0YXRlO1xuICAgIEFycmF5LnRvX2xpc3QgYXJyXG47O1xuXG5sZXQgcmFuZG9tX2VsZW1lbnRfZXhuID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGxpc3QgPVxuICBpZiBpc19lbXB0eSBsaXN0XG4gIHRoZW4gZmFpbHdpdGggXCJMaXN0LnJhbmRvbV9lbGVtZW50X2V4bjogZW1wdHkgbGlzdFwiXG4gIGVsc2UgbnRoX2V4biBsaXN0IChSYW5kb20uU3RhdGUuaW50IHJhbmRvbV9zdGF0ZSAobGVuZ3RoIGxpc3QpKVxuOztcblxubGV0IHJhbmRvbV9lbGVtZW50ID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGxpc3QgPVxuICB0cnkgU29tZSAocmFuZG9tX2VsZW1lbnRfZXhuIH5yYW5kb21fc3RhdGUgbGlzdCkgd2l0aFxuICB8IF8gLT4gTm9uZVxuOztcblxubGV0IHJlYyBjb21wYXJlIGNtcCBhIGIgPVxuICBtYXRjaCBhLCBiIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfIC0+IC0xXG4gIHwgXywgW10gLT4gMVxuICB8IHggOjogeHMsIHkgOjogeXMgLT5cbiAgICBsZXQgbiA9IGNtcCB4IHkgaW5cbiAgICBpZiBuID0gMCB0aGVuIGNvbXBhcmUgY21wIHhzIHlzIGVsc2UgblxuOztcblxubGV0IGhhc2hfZm9sZF90ID0gaGFzaF9mb2xkX2xpc3RcblxubGV0IGVxdWFsIGVxdWFsIHQxIHQyID1cbiAgbGV0IHJlYyBsb29wIH5lcXVhbCB0MSB0MiA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IFtdLCBbXSAtPiB0cnVlXG4gICAgfCB4MSA6OiB0MSwgeDIgOjogdDIgLT4gZXF1YWwgeDEgeDIgJiYgbG9vcCB+ZXF1YWwgdDEgdDJcbiAgICB8IF8gLT4gZmFsc2VcbiAgaW5cbiAgbG9vcCB+ZXF1YWwgdDEgdDJcbjs7XG5cbmxldCB0cmFuc3Bvc2UgPVxuICBsZXQgcmVjIHNwbGl0X29mZl9maXJzdF9jb2x1bW4gdCBjb2x1bW5fYWNjIHRyaW1tZWQgZm91bmRfZW1wdHkgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gY29sdW1uX2FjYywgdHJpbW1lZCwgZm91bmRfZW1wdHlcbiAgICB8IFtdIDo6IHRsIC0+IHNwbGl0X29mZl9maXJzdF9jb2x1bW4gdGwgY29sdW1uX2FjYyB0cmltbWVkIHRydWVcbiAgICB8ICh4IDo6IHhzKSA6OiB0bCAtPlxuICAgICAgc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiB0bCAoeCA6OiBjb2x1bW5fYWNjKSAoeHMgOjogdHJpbW1lZCkgZm91bmRfZW1wdHlcbiAgaW5cbiAgbGV0IHNwbGl0X29mZl9maXJzdF9jb2x1bW4gcm93cyA9IHNwbGl0X29mZl9maXJzdF9jb2x1bW4gcm93cyBbXSBbXSBmYWxzZSBpblxuICBsZXQgcmVjIGxvb3Agcm93cyBjb2x1bW5zIGRvX3JldiA9XG4gICAgbWF0Y2ggc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiByb3dzIHdpdGhcbiAgICB8IFtdLCBbXSwgXyAtPiBTb21lIChyZXYgY29sdW1ucylcbiAgICB8IGNvbHVtbiwgdHJpbW1lZF9yb3dzLCBmb3VuZF9lbXB0eSAtPlxuICAgICAgaWYgZm91bmRfZW1wdHlcbiAgICAgIHRoZW4gTm9uZVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBjb2x1bW4gPSBpZiBkb19yZXYgdGhlbiByZXYgY29sdW1uIGVsc2UgY29sdW1uIGluXG4gICAgICAgIGxvb3AgdHJpbW1lZF9yb3dzIChjb2x1bW4gOjogY29sdW1ucykgKG5vdCBkb19yZXYpKVxuICBpblxuICBmdW4gdCAtPiBsb29wIHQgW10gdHJ1ZVxuOztcblxuZXhjZXB0aW9uIFRyYW5zcG9zZV9nb3RfbGlzdHNfb2ZfZGlmZmVyZW50X2xlbmd0aHMgb2YgaW50IGxpc3QgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbmxldCAoKSA9XG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZFxuICAgIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFRyYW5zcG9zZV9nb3RfbGlzdHNfb2ZfZGlmZmVyZW50X2xlbmd0aHNdXG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IFRyYW5zcG9zZV9nb3RfbGlzdHNfb2ZfZGlmZmVyZW50X2xlbmd0aHMgYXJnMF9fMDMxXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDMyXyA9IHNleHBfb2ZfbGlzdCBzZXhwX29mX2ludCBhcmcwX18wMzFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwibGlzdC5tbC5UcmFuc3Bvc2VfZ290X2xpc3RzX29mX2RpZmZlcmVudF9sZW5ndGhzXCJcbiAgICAgICAgICA7IHJlczBfXzAzMl9cbiAgICAgICAgICBdXG4gICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuOztcblxuW0BAQGVuZF1cblxubGV0IHRyYW5zcG9zZV9leG4gbCA9XG4gIG1hdGNoIHRyYW5zcG9zZSBsIHdpdGhcbiAgfCBTb21lIGwgLT4gbFxuICB8IE5vbmUgLT4gcmFpc2UgKFRyYW5zcG9zZV9nb3RfbGlzdHNfb2ZfZGlmZmVyZW50X2xlbmd0aHMgKG1hcCBsIH5mOmxlbmd0aCkpXG47O1xuXG5sZXQgaW50ZXJzcGVyc2UgdCB+c2VwID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gW11cbiAgfCB4IDo6IHhzIC0+IHggOjogZm9sZF9yaWdodCB4cyB+aW5pdDpbXSB+ZjooZnVuIHkgYWNjIC0+IHNlcCA6OiB5IDo6IGFjYylcbjs7XG5cbmxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbmxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB0XG5cbmxldCBpc19zdWZmaXggbGlzdCB+c3VmZml4IH5lcXVhbDplcXVhbF9lbHQgPVxuICBsZXQgbGlzdF9sZW4gPSBsZW5ndGggbGlzdCBpblxuICBsZXQgc3VmZml4X2xlbiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgbGlzdF9sZW4gPj0gc3VmZml4X2xlbiAmJiBlcXVhbCBlcXVhbF9lbHQgKGRyb3AgbGlzdCAobGlzdF9sZW4gLSBzdWZmaXhfbGVuKSkgc3VmZml4XG47O1xuIiwiKCogVGhpcyBtb2R1bGUgaXMgdHJ5aW5nIHRvIG1pbmltaXplIGRlcGVuZGVuY2llcyBvbiBtb2R1bGVzIGluIENvcmUsIHNvIGFzIHRvIGFsbG93XG4gICBbSW5mb10sIFtFcnJvcl0sIGFuZCBbT3JfZXJyb3JdIHRvIGJlIHVzZWQgaW4gYXMgbWFueSBwbGFjZXMgYXMgcG9zc2libGUuIFBsZWFzZSBhdm9pZFxuICAgYWRkaW5nIG5ldyBkZXBlbmRlbmNpZXMuICopXG5cbm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJbmZvX2ludGZcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG5cbm1vZHVsZSBNZXNzYWdlID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBDb3VsZF9ub3RfY29uc3RydWN0IG9mIFNleHAudFxuICAgIHwgU3RyaW5nIG9mIHN0cmluZ1xuICAgIHwgRXhuIG9mIGV4blxuICAgIHwgU2V4cCBvZiBTZXhwLnRcbiAgICB8IFRhZ19zZXhwIG9mIHN0cmluZyAqIFNleHAudCAqIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC50IG9wdGlvblxuICAgIHwgVGFnX3Qgb2Ygc3RyaW5nICogdFxuICAgIHwgVGFnX2FyZyBvZiBzdHJpbmcgKiBTZXhwLnQgKiB0XG4gICAgfCBPZl9saXN0IG9mIGludCBvcHRpb24gKiB0IGxpc3RcbiAgICB8IFdpdGhfYmFja3RyYWNlIG9mIHQgKiBzdHJpbmcgKCogYmFja3RyYWNlICopXG4gIFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIGxldCByZWMgc2V4cF9vZl90ID1cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgQ291bGRfbm90X2NvbnN0cnVjdCBhcmcwX18wMDFfIC0+XG4gICAgICAgIGxldCByZXMwX18wMDJfID0gU2V4cC5zZXhwX29mX3QgYXJnMF9fMDAxXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJDb3VsZF9ub3RfY29uc3RydWN0XCI7IHJlczBfXzAwMl8gXVxuICAgICAgfCBTdHJpbmcgYXJnMF9fMDAzXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDA0XyA9IHNleHBfb2Zfc3RyaW5nIGFyZzBfXzAwM18gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiU3RyaW5nXCI7IHJlczBfXzAwNF8gXVxuICAgICAgfCBFeG4gYXJnMF9fMDA1XyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDA2XyA9IHNleHBfb2ZfZXhuIGFyZzBfXzAwNV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiRXhuXCI7IHJlczBfXzAwNl8gXVxuICAgICAgfCBTZXhwIGFyZzBfXzAwN18gLT5cbiAgICAgICAgbGV0IHJlczBfXzAwOF8gPSBTZXhwLnNleHBfb2ZfdCBhcmcwX18wMDdfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlNleHBcIjsgcmVzMF9fMDA4XyBdXG4gICAgICB8IFRhZ19zZXhwIChhcmcwX18wMDlfLCBhcmcxX18wMTBfLCBhcmcyX18wMTFfKSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDEyXyA9IHNleHBfb2Zfc3RyaW5nIGFyZzBfXzAwOV9cbiAgICAgICAgYW5kIHJlczFfXzAxM18gPSBTZXhwLnNleHBfb2ZfdCBhcmcxX18wMTBfXG4gICAgICAgIGFuZCByZXMyX18wMTRfID0gc2V4cF9vZl9vcHRpb24gU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdCBhcmcyX18wMTFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiVGFnX3NleHBcIjsgcmVzMF9fMDEyXzsgcmVzMV9fMDEzXzsgcmVzMl9fMDE0XyBdXG4gICAgICB8IFRhZ190IChhcmcwX18wMTVfLCBhcmcxX18wMTZfKSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDE3XyA9IHNleHBfb2Zfc3RyaW5nIGFyZzBfXzAxNV9cbiAgICAgICAgYW5kIHJlczFfXzAxOF8gPSBzZXhwX29mX3QgYXJnMV9fMDE2XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJUYWdfdFwiOyByZXMwX18wMTdfOyByZXMxX18wMThfIF1cbiAgICAgIHwgVGFnX2FyZyAoYXJnMF9fMDE5XywgYXJnMV9fMDIwXywgYXJnMl9fMDIxXykgLT5cbiAgICAgICAgbGV0IHJlczBfXzAyMl8gPSBzZXhwX29mX3N0cmluZyBhcmcwX18wMTlfXG4gICAgICAgIGFuZCByZXMxX18wMjNfID0gU2V4cC5zZXhwX29mX3QgYXJnMV9fMDIwX1xuICAgICAgICBhbmQgcmVzMl9fMDI0XyA9IHNleHBfb2ZfdCBhcmcyX18wMjFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiVGFnX2FyZ1wiOyByZXMwX18wMjJfOyByZXMxX18wMjNfOyByZXMyX18wMjRfIF1cbiAgICAgIHwgT2ZfbGlzdCAoYXJnMF9fMDI1XywgYXJnMV9fMDI2XykgLT5cbiAgICAgICAgbGV0IHJlczBfXzAyN18gPSBzZXhwX29mX29wdGlvbiBzZXhwX29mX2ludCBhcmcwX18wMjVfXG4gICAgICAgIGFuZCByZXMxX18wMjhfID0gc2V4cF9vZl9saXN0IHNleHBfb2ZfdCBhcmcxX18wMjZfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIk9mX2xpc3RcIjsgcmVzMF9fMDI3XzsgcmVzMV9fMDI4XyBdXG4gICAgICB8IFdpdGhfYmFja3RyYWNlIChhcmcwX18wMjlfLCBhcmcxX18wMzBfKSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDMxXyA9IHNleHBfb2ZfdCBhcmcwX18wMjlfXG4gICAgICAgIGFuZCByZXMxX18wMzJfID0gc2V4cF9vZl9zdHJpbmcgYXJnMV9fMDMwXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJXaXRoX2JhY2t0cmFjZVwiOyByZXMwX18wMzFfOyByZXMxX18wMzJfIF1cbiAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGxldCByZWMgdG9fc3RyaW5nc19odW0gdCBhYyA9XG4gICAgKCogV2UgdXNlIFtTZXhwLnRvX3N0cmluZ19tYWNoXSwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHdlIGFyZSBpbXBsZW1lbnRpbmdcbiAgICAgICBbdG9fc3RyaW5nc19odW1dLCBiZWNhdXNlIHdlIHdhbnQgdGhlIGluZm8gdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUsIGFuZCBvbmNlIHdlJ3ZlXG4gICAgICAgaGFkIHRvIHJlc29ydCB0byBzZXhwcywgdGhlIG1lc3NhZ2UgaXMgZ29pbmcgdG8gc3RhcnQgbm90IGxvb2tpbmcgc28gcHJldHR5XG4gICAgICAgYW55d2F5LiAqKVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgQ291bGRfbm90X2NvbnN0cnVjdCBzZXhwIC0+XG4gICAgICBcImNvdWxkIG5vdCBjb25zdHJ1Y3QgaW5mbzogXCIgOjogU2V4cC50b19zdHJpbmdfbWFjaCBzZXhwIDo6IGFjXG4gICAgfCBTdHJpbmcgc3RyaW5nIC0+IHN0cmluZyA6OiBhY1xuICAgIHwgRXhuIGV4biAtPiBTZXhwLnRvX3N0cmluZ19tYWNoIChFeG4uc2V4cF9vZl90IGV4bikgOjogYWNcbiAgICB8IFNleHAgc2V4cCAtPiBTZXhwLnRvX3N0cmluZ19tYWNoIHNleHAgOjogYWNcbiAgICB8IFRhZ19zZXhwICh0YWcsIHNleHAsIF8pIC0+IHRhZyA6OiBcIjogXCIgOjogU2V4cC50b19zdHJpbmdfbWFjaCBzZXhwIDo6IGFjXG4gICAgfCBUYWdfdCAodGFnLCB0KSAtPiB0YWcgOjogXCI6IFwiIDo6IHRvX3N0cmluZ3NfaHVtIHQgYWNcbiAgICB8IFRhZ19hcmcgKHRhZywgc2V4cCwgdCkgLT5cbiAgICAgIGxldCBib2R5ID0gU2V4cC50b19zdHJpbmdfbWFjaCBzZXhwIDo6IFwiOiBcIiA6OiB0b19zdHJpbmdzX2h1bSB0IGFjIGluXG4gICAgICBpZiBTdHJpbmcubGVuZ3RoIHRhZyA9IDAgdGhlbiBib2R5IGVsc2UgdGFnIDo6IFwiOiBcIiA6OiBib2R5XG4gICAgfCBXaXRoX2JhY2t0cmFjZSAodCwgYmFja3RyYWNlKSAtPlxuICAgICAgdG9fc3RyaW5nc19odW0gdCAoXCJcXG5CYWNrdHJhY2U6XFxuXCIgOjogYmFja3RyYWNlIDo6IGFjKVxuICAgIHwgT2ZfbGlzdCAodHJ1bmNfYWZ0ZXIsIHRzKSAtPlxuICAgICAgbGV0IHRzID1cbiAgICAgICAgbWF0Y2ggdHJ1bmNfYWZ0ZXIgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gdHNcbiAgICAgICAgfCBTb21lIG1heCAtPlxuICAgICAgICAgIGxldCBuID0gTGlzdC5sZW5ndGggdHMgaW5cbiAgICAgICAgICBpZiBuIDw9IG1heFxuICAgICAgICAgIHRoZW4gdHNcbiAgICAgICAgICBlbHNlIExpc3QudGFrZSB0cyBtYXggQCBbIFN0cmluZyAoUHJpbnRmLnNwcmludGYgXCJhbmQgJWQgbW9yZSBpbmZvXCIgKG4gLSBtYXgpKSBdXG4gICAgICBpblxuICAgICAgTGlzdC5mb2xkIChMaXN0LnJldiB0cykgfmluaXQ6YWMgfmY6KGZ1biBhYyB0IC0+XG4gICAgICAgIHRvX3N0cmluZ3NfaHVtIHQgKGlmIExpc3QuaXNfZW1wdHkgYWMgdGhlbiBhYyBlbHNlIFwiOyBcIiA6OiBhYykpXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZ19odW1fZGVwcmVjYXRlZCB0ID0gU3RyaW5nLmNvbmNhdCAodG9fc3RyaW5nc19odW0gdCBbXSlcblxuICBsZXQgcmVjIHRvX3NleHBzX2h1bSB0IGFjID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IENvdWxkX25vdF9jb25zdHJ1Y3QgXyBhcyB0IC0+IHNleHBfb2ZfdCB0IDo6IGFjXG4gICAgfCBTdHJpbmcgc3RyaW5nIC0+IEF0b20gc3RyaW5nIDo6IGFjXG4gICAgfCBFeG4gZXhuIC0+IEV4bi5zZXhwX29mX3QgZXhuIDo6IGFjXG4gICAgfCBTZXhwIHNleHAgLT4gc2V4cCA6OiBhY1xuICAgIHwgVGFnX3NleHAgKHRhZywgc2V4cCwgaGVyZSkgLT5cbiAgICAgIExpc3RcbiAgICAgICAgKEF0b20gdGFnXG4gICAgICAgICA6OiBzZXhwXG4gICAgICAgICA6OlxuICAgICAgICAgKG1hdGNoIGhlcmUgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBbXVxuICAgICAgICAgIHwgU29tZSBoZXJlIC0+IFsgU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdCBoZXJlIF0pKVxuICAgICAgOjogYWNcbiAgICB8IFRhZ190ICh0YWcsIHQpIC0+IExpc3QgKEF0b20gdGFnIDo6IHRvX3NleHBzX2h1bSB0IFtdKSA6OiBhY1xuICAgIHwgVGFnX2FyZyAodGFnLCBzZXhwLCB0KSAtPlxuICAgICAgbGV0IGJvZHkgPSBzZXhwIDo6IHRvX3NleHBzX2h1bSB0IFtdIGluXG4gICAgICBpZiBTdHJpbmcubGVuZ3RoIHRhZyA9IDAgdGhlbiBMaXN0IGJvZHkgOjogYWMgZWxzZSBMaXN0IChBdG9tIHRhZyA6OiBib2R5KSA6OiBhY1xuICAgIHwgV2l0aF9iYWNrdHJhY2UgKHQsIGJhY2t0cmFjZSkgLT5cbiAgICAgIFNleHAuTGlzdCBbIHRvX3NleHBfaHVtIHQ7IFNleHAuQXRvbSBiYWNrdHJhY2UgXSA6OiBhY1xuICAgIHwgT2ZfbGlzdCAoXywgdHMpIC0+XG4gICAgICBMaXN0LmZvbGQgKExpc3QucmV2IHRzKSB+aW5pdDphYyB+ZjooZnVuIGFjIHQgLT4gdG9fc2V4cHNfaHVtIHQgYWMpXG5cbiAgYW5kIHRvX3NleHBfaHVtIHQgPVxuICAgIG1hdGNoIHRvX3NleHBzX2h1bSB0IFtdIHdpdGhcbiAgICB8IFsgc2V4cCBdIC0+IHNleHBcbiAgICB8IHNleHBzIC0+IFNleHAuTGlzdCBzZXhwc1xuICA7O1xuXG4gICgqIFdlIHVzZSBbcHJvdGVjdF0gdG8gZ3VhcmQgYWdhaW5zdCBleGNlcHRpb25zIHJhaXNlZCBieSB1c2VyLXN1cHBsaWVkIGZ1bmN0aW9ucywgc29cbiAgICAgdGhhdCBmYWlsdXJlIHRvIHByb2R1Y2Ugb25lIHBhcnQgb2YgYW4gaW5mbyBkb2Vzbid0IGludGVyZmVyZSB3aXRoIG90aGVyIHBhcnRzLiAqKVxuICBsZXQgcHJvdGVjdCBmID1cbiAgICB0cnkgZiAoKSB3aXRoXG4gICAgfCBleG4gLT4gQ291bGRfbm90X2NvbnN0cnVjdCAoRXhuLnNleHBfb2ZfdCBleG4pXG4gIDs7XG5cbiAgbGV0IG9mX2luZm8gaW5mbyA9IHByb3RlY3QgKGZ1biAoKSAtPiBMYXp5LmZvcmNlIGluZm8pXG4gIGxldCB0b19pbmZvIHQgPSBsYXp5IHRcbmVuZFxuXG5vcGVuIE1lc3NhZ2VcblxudHlwZSB0ID0gTWVzc2FnZS50IExhenkudFxuXG5sZXQgaW52YXJpYW50IF8gPSAoKVxubGV0IHRvX21lc3NhZ2UgPSBNZXNzYWdlLm9mX2luZm9cbmxldCBvZl9tZXNzYWdlID0gTWVzc2FnZS50b19pbmZvXG5cbigqIEl0IGlzIE9LIHRvIHVzZSBbTWVzc2FnZS50b19zZXhwX2h1bV0sIHdoaWNoIGlzIG5vdCBzdGFibGUsIGJlY2F1c2UgW3Rfb2Zfc2V4cF0gYmVsb3dcbiAgIGNhbiBoYW5kbGUgYW55IHNleHAuICopXG5sZXQgc2V4cF9vZl90IHQgPSBNZXNzYWdlLnRvX3NleHBfaHVtICh0b19tZXNzYWdlIHQpXG5sZXQgdF9vZl9zZXhwIHNleHAgPSBsYXp5IChNZXNzYWdlLlNleHAgc2V4cClcbmxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IHsgdW50eXBlZCA9IEFueSBcIkluZm8udFwiIH1cbmxldCBjb21wYXJlIHQxIHQyID0gU2V4cC5jb21wYXJlIChzZXhwX29mX3QgdDEpIChzZXhwX29mX3QgdDIpXG5sZXQgZXF1YWwgdDEgdDIgPSBTZXhwLmVxdWFsIChzZXhwX29mX3QgdDEpIChzZXhwX29mX3QgdDIpXG5sZXQgaGFzaF9mb2xkX3Qgc3RhdGUgdCA9IFNleHAuaGFzaF9mb2xkX3Qgc3RhdGUgKHNleHBfb2ZfdCB0KVxubGV0IGhhc2ggdCA9IEhhc2gucnVuIGhhc2hfZm9sZF90IHRcblxubGV0IHRvX3N0cmluZ19odW0gdCA9XG4gIG1hdGNoIHRvX21lc3NhZ2UgdCB3aXRoXG4gIHwgU3RyaW5nIHMgLT4gc1xuICB8IG1lc3NhZ2UgLT4gU2V4cC50b19zdHJpbmdfaHVtIChNZXNzYWdlLnRvX3NleHBfaHVtIG1lc3NhZ2UpXG47O1xuXG5sZXQgdG9fc3RyaW5nX2h1bV9kZXByZWNhdGVkIHQgPSBNZXNzYWdlLnRvX3N0cmluZ19odW1fZGVwcmVjYXRlZCAodG9fbWVzc2FnZSB0KVxubGV0IHRvX3N0cmluZ19tYWNoIHQgPSBTZXhwLnRvX3N0cmluZ19tYWNoIChzZXhwX29mX3QgdClcbmxldCBvZl9sYXp5IGwgPSBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gU3RyaW5nIChMYXp5LmZvcmNlIGwpKSlcbmxldCBvZl9sYXp5X3NleHAgbCA9IGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBTZXhwIChMYXp5LmZvcmNlIGwpKSlcbmxldCBvZl9sYXp5X3QgbGF6eV90ID0gTGF6eS5qb2luIGxhenlfdFxubGV0IG9mX3N0cmluZyBtZXNzYWdlID0gTGF6eS5mcm9tX3ZhbCAoU3RyaW5nIG1lc3NhZ2UpXG5sZXQgY3JlYXRlZiBmb3JtYXQgPSBQcmludGYua3NwcmludGYgb2Zfc3RyaW5nIGZvcm1hdFxubGV0IG9mX3RodW5rIGYgPSBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gU3RyaW5nIChmICgpKSkpXG5cbmxldCBjcmVhdGUgP2hlcmUgP3N0cmljdCB0YWcgeCBzZXhwX29mX3ggPVxuICBtYXRjaCBzdHJpY3Qgd2l0aFxuICB8IE5vbmUgLT4gbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFRhZ19zZXhwICh0YWcsIHNleHBfb2ZfeCB4LCBoZXJlKSkpXG4gIHwgU29tZSAoKSAtPiBvZl9tZXNzYWdlIChUYWdfc2V4cCAodGFnLCBzZXhwX29mX3ggeCwgaGVyZSkpXG47O1xuXG5sZXQgY3JlYXRlX3Mgc2V4cCA9IExhenkuZnJvbV92YWwgKFNleHAgc2V4cClcbmxldCB0YWcgdCB+dGFnID0gbGF6eSAoVGFnX3QgKHRhZywgdG9fbWVzc2FnZSB0KSlcblxubGV0IHRhZ19zX2xhenkgdCB+dGFnID1cbiAgbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFRhZ19hcmcgKFwiXCIsIExhenkuZm9yY2UgdGFnLCB0b19tZXNzYWdlIHQpKSlcbjs7XG5cbmxldCB0YWdfcyB0IH50YWcgPSB0YWdfc19sYXp5IHQgfnRhZzooTGF6eS5mcm9tX3ZhbCB0YWcpXG5cbmxldCB0YWdfYXJnIHQgdGFnIHggc2V4cF9vZl94ID1cbiAgbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFRhZ19hcmcgKHRhZywgc2V4cF9vZl94IHgsIHRvX21lc3NhZ2UgdCkpKVxuOztcblxubGV0IG9mX2xpc3QgP3RydW5jX2FmdGVyIHRzID0gbGF6eSAoT2ZfbGlzdCAodHJ1bmNfYWZ0ZXIsIExpc3QubWFwIHRzIH5mOnRvX21lc3NhZ2UpKVxuXG5leGNlcHRpb24gRXhuIG9mIHRcblxubGV0ICgpID1cbiAgKCogV2UgaW5zdGFsbCBhIGN1c3RvbSBleG4tY29udmVydGVyIHJhdGhlciB0aGFuIHVzZVxuICAgICBbZXhjZXB0aW9uIEV4biBvZiB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXSAuLi4gW0BAQGVuZF1dIHRvIGVsaW1pbmF0ZSB0aGUgZXh0cmFcbiAgICAgd3JhcHBpbmcgb2YgXCIoRXhuIC4uLilcIi4gKilcbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEV4bl0gKGZ1bmN0aW9uXG4gICAgfCBFeG4gdCAtPiBzZXhwX29mX3QgdFxuICAgIHwgXyAtPlxuICAgICAgKCogUmVhY2hpbmcgdGhpcyBicmFuY2ggaW5kaWNhdGVzIGEgYnVnIGluIHNleHBsaWIuICopXG4gICAgICBhc3NlcnQgZmFsc2UpXG47O1xuXG5sZXQgdG9fZXhuIHQgPVxuICBpZiBub3QgKExhenkuaXNfdmFsIHQpXG4gIHRoZW4gRXhuIHRcbiAgZWxzZSAoXG4gICAgbWF0Y2ggTGF6eS5mb3JjZSB0IHdpdGhcbiAgICB8IE1lc3NhZ2UuRXhuIGV4biAtPiBleG5cbiAgICB8IF8gLT4gRXhuIHQpXG47O1xuXG5sZXQgb2ZfZXhuID9iYWNrdHJhY2UgZXhuID1cbiAgbGV0IGJhY2t0cmFjZSA9XG4gICAgbWF0Y2ggYmFja3RyYWNlIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBgR2V0IC0+IFNvbWUgKENhbWwuUHJpbnRleGMuZ2V0X2JhY2t0cmFjZSAoKSlcbiAgICB8IFNvbWUgKGBUaGlzIHMpIC0+IFNvbWUgc1xuICBpblxuICBtYXRjaCBleG4sIGJhY2t0cmFjZSB3aXRoXG4gIHwgRXhuIHQsIE5vbmUgLT4gdFxuICB8IEV4biB0LCBTb21lIGJhY2t0cmFjZSAtPiBsYXp5IChXaXRoX2JhY2t0cmFjZSAodG9fbWVzc2FnZSB0LCBiYWNrdHJhY2UpKVxuICB8IF8sIE5vbmUgLT4gTGF6eS5mcm9tX3ZhbCAoTWVzc2FnZS5FeG4gZXhuKVxuICB8IF8sIFNvbWUgYmFja3RyYWNlIC0+IGxhenkgKFdpdGhfYmFja3RyYWNlIChTZXhwIChFeG4uc2V4cF9vZl90IGV4biksIGJhY2t0cmFjZSkpXG47O1xuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyX3BwIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkluZm9cIlxuICAgIGxldCBwcCBwcGYgdCA9IENhbWwuRm9ybWF0LnBwX3ByaW50X3N0cmluZyBwcGYgKHRvX3N0cmluZ19odW0gdClcbiAgZW5kKVxuXG5tb2R1bGUgSW50ZXJuYWxfcmVwciA9IE1lc3NhZ2VcblxuIiwiKCogVGhpcyBtb2R1bGUgaXMgdHJ5aW5nIHRvIG1pbmltaXplIGRlcGVuZGVuY2llcyBvbiBtb2R1bGVzIGluIENvcmUsIHNvIGFzIHRvIGFsbG93XG4gICBbRXJyb3JdIGFuZCBbT3JfZXJyb3JdIHRvIGJlIHVzZWQgaW4gdmFyaW91cyBwbGFjZXMuICBQbGVhc2UgYXZvaWQgYWRkaW5nIG5ld1xuICAgZGVwZW5kZW5jaWVzLiAqKVxuXG5vcGVuISBJbXBvcnRcbmluY2x1ZGUgSW5mb1xuXG5sZXQgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gQW55IFwiRXJyb3IudFwiIH1cbmxldCByYWlzZSB0ID0gcmFpc2UgKHRvX2V4biB0KVxubGV0IHJhaXNlX3Mgc2V4cCA9IHJhaXNlIChjcmVhdGVfcyBzZXhwKVxubGV0IHRvX2luZm8gdCA9IHRcbmxldCBvZl9pbmZvIHQgPSB0XG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXJfcHAgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuRXJyb3JcIlxuICAgIGxldCBwcCA9IHBwXG4gIGVuZClcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJbnZhcmlhbnRfaW50ZlxuXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxubGV0IGludmFyaWFudCBoZXJlIHQgc2V4cF9vZl90IGYgOiB1bml0ID1cbiAgdHJ5IGYgKCkgd2l0aFxuICB8IGV4biAtPlxuICAgIHJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiaW52YXJpYW50IGZhaWxlZFwiXG4gICAgICAgICBbIFwiXCIsIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3QgaGVyZVxuICAgICAgICAgOyBcImV4blwiLCBzZXhwX29mX2V4biBleG5cbiAgICAgICAgIDsgXCJcIiwgc2V4cF9vZl90IHRcbiAgICAgICAgIF0pXG47O1xuXG5sZXQgY2hlY2tfZmllbGQgdCBmIGZpZWxkID1cbiAgdHJ5IGYgKEZpZWxkLmdldCBmaWVsZCB0KSB3aXRoXG4gIHwgZXhuIC0+XG4gICAgcmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJwcm9ibGVtIHdpdGggZmllbGRcIlxuICAgICAgICAgWyBcImZpZWxkXCIsIHNleHBfb2Zfc3RyaW5nIChGaWVsZC5uYW1lIGZpZWxkKTsgXCJleG5cIiwgc2V4cF9vZl9leG4gZXhuIF0pXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbmluY2x1ZGUgKFxuICBSZXN1bHQgOlxuICAgIG1vZHVsZSB0eXBlIG9mIHN0cnVjdFxuICAgIGluY2x1ZGUgUmVzdWx0XG4gIGVuZFxuICB3aXRoIG1vZHVsZSBFcnJvciA6PSBSZXN1bHQuRXJyb3IpXG5cbnR5cGUgJ2EgdCA9ICgnYSwgRXJyb3IudCkgUmVzdWx0LnRcbltAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID1cbiAgZnVuIF9jbXBfX2EgYV9fMDAxXyBiX18wMDJfIC0+IFJlc3VsdC5jb21wYXJlIF9jbXBfX2EgRXJyb3IuY29tcGFyZSBhX18wMDFfIGJfXzAwMl9cbjs7XG5cbmxldCBlcXVhbCA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGJvb2wgPVxuICBmdW4gX2NtcF9fYSBhX18wMDdfIGJfXzAwOF8gLT4gUmVzdWx0LmVxdWFsIF9jbXBfX2EgRXJyb3IuZXF1YWwgYV9fMDA3XyBiX18wMDhfXG47O1xuXG5sZXQgaGFzaF9mb2xkX3QgOlxuICAnYS5cbiAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiAnYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAtPiAnYSB0XG4gIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICA9XG4gIGZ1biBfaGFzaF9mb2xkX2EgaHN2IGFyZyAtPiBSZXN1bHQuaGFzaF9mb2xkX3QgX2hhc2hfZm9sZF9hIEVycm9yLmhhc2hfZm9sZF90IGhzdiBhcmdcbjs7XG5cbmxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPVxuICBmdW4gX29mX2FfXzAxM18geF9fMDE1XyAtPiBSZXN1bHQudF9vZl9zZXhwIF9vZl9hX18wMTNfIEVycm9yLnRfb2Zfc2V4cCB4X18wMTVfXG47O1xuXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgZnVuIF9vZl9hX18wMTZfIHhfXzAxN18gLT4gUmVzdWx0LnNleHBfb2ZfdCBfb2ZfYV9fMDE2XyBFcnJvci5zZXhwX29mX3QgeF9fMDE3X1xuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gUmVzdWx0LnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXIgRXJyb3IudF9zZXhwX2dyYW1tYXJcbjs7XG5cbltAQEBlbmRdXG5cbmxldCBpbnZhcmlhbnQgaW52YXJpYW50X2EgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE9rIGEgLT4gaW52YXJpYW50X2EgYVxuICB8IEVycm9yIGVycm9yIC0+IEVycm9yLmludmFyaWFudCBlcnJvclxuOztcblxuaW5jbHVkZSBBcHBsaWNhdGl2ZS5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuXG4gICAgbGV0IGFwcGx5IGYgeCA9XG4gICAgICBSZXN1bHQuY29tYmluZSBmIHggfm9rOihmdW4gZiB4IC0+IGYgeCkgfmVycjooZnVuIGUxIGUyIC0+IEVycm9yLm9mX2xpc3QgWyBlMTsgZTIgXSlcbiAgICA7O1xuXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gIGVuZClcblxubW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgbGV0IHJldHVybiA9IHJldHVyblxuXG4gIGluY2x1ZGUgTW9uYWRfaW5maXhcblxuICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICBsZXQgbWFwID0gbWFwXG4gICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgbGV0IGJvdGggPSBib3RoXG5cbiAgICAoKiBmcm9tIEFwcGxpY2F0aXZlLk1ha2UgKilcbiAgICBtb2R1bGUgT3Blbl9vbl9yaHMgPSBzdHJ1Y3QgZW5kXG4gIGVuZFxuZW5kXG5cbmxldCBvayA9IFJlc3VsdC5va1xubGV0IGlzX29rID0gUmVzdWx0LmlzX29rXG5sZXQgaXNfZXJyb3IgPSBSZXN1bHQuaXNfZXJyb3JcblxubGV0IHRyeV93aXRoID8oYmFja3RyYWNlID0gZmFsc2UpIGYgPVxuICB0cnkgT2sgKGYgKCkpIHdpdGhcbiAgfCBleG4gLT4gRXJyb3IgKEVycm9yLm9mX2V4biBleG4gP2JhY2t0cmFjZTooaWYgYmFja3RyYWNlIHRoZW4gU29tZSBgR2V0IGVsc2UgTm9uZSkpXG47O1xuXG5sZXQgdHJ5X3dpdGhfam9pbiA/YmFja3RyYWNlIGYgPSBqb2luICh0cnlfd2l0aCA/YmFja3RyYWNlIGYpXG5cbmxldCBva19leG4gPSBmdW5jdGlvblxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGVyciAtPiBFcnJvci5yYWlzZSBlcnJcbjs7XG5cbmxldCBvZl9leG4gP2JhY2t0cmFjZSBleG4gPSBFcnJvciAoRXJyb3Iub2ZfZXhuID9iYWNrdHJhY2UgZXhuKVxuXG5sZXQgb2ZfZXhuX3Jlc3VsdCA/YmFja3RyYWNlID0gZnVuY3Rpb25cbiAgfCBPayBfIGFzIHogLT4gelxuICB8IEVycm9yIGV4biAtPiBvZl9leG4gP2JhY2t0cmFjZSBleG5cbjs7XG5cbmxldCBlcnJvciA/aGVyZSA/c3RyaWN0IG1lc3NhZ2UgYSBzZXhwX29mX2EgPVxuICBFcnJvciAoRXJyb3IuY3JlYXRlID9oZXJlID9zdHJpY3QgbWVzc2FnZSBhIHNleHBfb2ZfYSlcbjs7XG5cbmxldCBlcnJvcl9zIHNleHAgPSBFcnJvciAoRXJyb3IuY3JlYXRlX3Mgc2V4cClcbmxldCBlcnJvcl9zdHJpbmcgbWVzc2FnZSA9IEVycm9yIChFcnJvci5vZl9zdHJpbmcgbWVzc2FnZSlcbmxldCBlcnJvcmYgZm9ybWF0ID0gUHJpbnRmLmtzcHJpbnRmIGVycm9yX3N0cmluZyBmb3JtYXRcbmxldCB0YWcgdCB+dGFnID0gUmVzdWx0Lm1hcF9lcnJvciB0IH5mOihFcnJvci50YWcgfnRhZylcbmxldCB0YWdfcyB0IH50YWcgPSBSZXN1bHQubWFwX2Vycm9yIHQgfmY6KEVycm9yLnRhZ19zIH50YWcpXG5sZXQgdGFnX3NfbGF6eSB0IH50YWcgPSBSZXN1bHQubWFwX2Vycm9yIHQgfmY6KEVycm9yLnRhZ19zX2xhenkgfnRhZylcblxubGV0IHRhZ19hcmcgdCBtZXNzYWdlIGEgc2V4cF9vZl9hID1cbiAgUmVzdWx0Lm1hcF9lcnJvciB0IH5mOihmdW4gZSAtPiBFcnJvci50YWdfYXJnIGUgbWVzc2FnZSBhIHNleHBfb2ZfYSlcbjs7XG5cbmxldCB1bmltcGxlbWVudGVkIHMgPSBlcnJvciBcInVuaW1wbGVtZW50ZWRcIiBzIHNleHBfb2Zfc3RyaW5nXG5sZXQgY29tYmluZV9lcnJvcnMgbCA9IFJlc3VsdC5tYXBfZXJyb3IgKFJlc3VsdC5jb21iaW5lX2Vycm9ycyBsKSB+ZjpFcnJvci5vZl9saXN0XG5sZXQgY29tYmluZV9lcnJvcnNfdW5pdCBsID0gUmVzdWx0Lm1hcCAoY29tYmluZV9lcnJvcnMgbCkgfmY6KGZ1biAoXyA6IHVuaXQgbGlzdCkgLT4gKCkpXG5cbmxldCBmaWx0ZXJfb2tfYXRfbGVhc3Rfb25lIGwgPVxuICBsZXQgb2ssIGVycnMgPSBMaXN0LnBhcnRpdGlvbl9tYXAgbCB+ZjpSZXN1bHQudG9fZWl0aGVyIGluXG4gIG1hdGNoIG9rIHdpdGhcbiAgfCBbXSAtPiBFcnJvciAoRXJyb3Iub2ZfbGlzdCBlcnJzKVxuICB8IF8gLT4gT2sgb2tcbjs7XG5cbmxldCBmaW5kX29rIGwgPVxuICBtYXRjaCBMaXN0LmZpbmRfbWFwIGwgfmY6UmVzdWx0Lm9rIHdpdGhcbiAgfCBTb21lIHggLT4gT2sgeFxuICB8IE5vbmUgLT5cbiAgICBFcnJvclxuICAgICAgKEVycm9yLm9mX2xpc3RcbiAgICAgICAgIChMaXN0Lm1hcCBsIH5mOihmdW5jdGlvblxuICAgICAgICAgICAgfCBPayBfIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgICAgfCBFcnJvciBlcnIgLT4gZXJyKSkpXG47O1xuXG5sZXQgZmluZF9tYXBfb2sgbCB+ZiA9XG4gIFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuIChmdW4geyByZXR1cm4gfSAtPlxuICAgIEVycm9yXG4gICAgICAoRXJyb3Iub2ZfbGlzdFxuICAgICAgICAgKExpc3QubWFwIGwgfmY6KGZ1biBlbHQgLT5cbiAgICAgICAgICAgIG1hdGNoIGYgZWx0IHdpdGhcbiAgICAgICAgICAgIHwgT2sgXyBhcyB4IC0+IHJldHVybiB4XG4gICAgICAgICAgICB8IEVycm9yIGVyciAtPiBlcnIpKSkpXG47O1xuXG5sZXQgbWFwID0gUmVzdWx0Lm1hcFxubGV0IGl0ZXIgPSBSZXN1bHQuaXRlclxubGV0IGl0ZXJfZXJyb3IgPSBSZXN1bHQuaXRlcl9lcnJvclxuIiwiKCogVGhpcyBpcyBicm9rZW4gb2ZmIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBTaWduIGFuZCBDb21wYXJhYmxlLiAqKVxuXG5vcGVuISBJbXBvcnRcblxudHlwZSB0ID1cbiAgfCBOZWdcbiAgfCBaZXJvXG4gIHwgUG9zXG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyLCBjb21wYXJlLCBoYXNoLCBlbnVtZXJhdGVdXG5cbmxldCB0X29mX3NleHAgPVxuICAobGV0IGVycm9yX3NvdXJjZV9fMDAzXyA9IFwic2lnbjAubWwudFwiIGluXG4gICBmdW5jdGlvblxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibmVnXCIgfCBcIk5lZ1wiKSAtPiBOZWdcbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSAtPiBaZXJvXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJwb3NcIiB8IFwiUG9zXCIpIC0+IFBvc1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJuZWdcIiB8IFwiTmVnXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInBvc1wiIHwgXCJQb3NcIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDAyXyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwMl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgIHwgc2V4cF9fMDAyXyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICAgICAgICAgICAgICAgICAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbjs7XG5cbmxldCBzZXhwX29mX3QgPVxuICAoZnVuY3Rpb25cbiAgICB8IE5lZyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJOZWdcIlxuICAgIHwgWmVybyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJaZXJvXCJcbiAgICB8IFBvcyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJQb3NcIlxuICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZyB7IG5hbWUgPSBcIk5lZ1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiWmVyb1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiUG9zXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbmxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcblxubGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAoZnVuIGhzdiBhcmcgLT5cbiAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgfCBOZWcgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwXG4gICAgIHwgWmVybyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDFcbiAgICAgfCBQb3MgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAyXG4gICAgICAgICAgICAgIDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuOztcblxubGV0IChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICBsZXQgZnVuYyBhcmcgPVxuICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgaGFzaF9mb2xkX3QgaHN2IGFyZylcbiAgaW5cbiAgZnVuIHggLT4gZnVuYyB4XG47O1xuXG5sZXQgYWxsID0gKFsgTmVnOyBaZXJvOyBQb3MgXSA6IHQgbGlzdClcblxuW0BAQGVuZF1cblxubW9kdWxlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiB0KSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IHQpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IHQpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogdCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IHQpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogdCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogdCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IHQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogdCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogdCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiB0KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IHQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbmxldCBvZl9zdHJpbmcgcyA9IHRfb2Zfc2V4cCAoc2V4cF9vZl9zdHJpbmcgcylcbmxldCB0b19zdHJpbmcgdCA9IHN0cmluZ19vZl9zZXhwIChzZXhwX29mX3QgdClcblxubGV0IHRvX2ludCA9IGZ1bmN0aW9uXG4gIHwgTmVnIC0+IC0xXG4gIHwgWmVybyAtPiAwXG4gIHwgUG9zIC0+IDFcbjs7XG5cbmxldCBfID0gaGFzaFxuXG4oKiBJZ25vcmUgdGhlIGhhc2ggZnVuY3Rpb24gcHJvZHVjZWQgYnkgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2hdICopXG5sZXQgaGFzaCA9IHRvX2ludFxubGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLlNpZ25cIlxubGV0IG9mX2ludCBuID0gaWYgbiA8IDAgdGhlbiBOZWcgZWxzZSBpZiBuID0gMCB0aGVuIFplcm8gZWxzZSBQb3NcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBDb21wYXJhYmxlX2ludGZcblxubW9kdWxlIFdpdGhfemVybyAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZV1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgdmFsIHplcm8gOiB0XG4gIGVuZCkgPVxuc3RydWN0XG4gIG9wZW4gVFxuXG4gIGxldCBpc19wb3NpdGl2ZSB0ID0gY29tcGFyZSB0IHplcm8gPiAwXG4gIGxldCBpc19ub25fbmVnYXRpdmUgdCA9IGNvbXBhcmUgdCB6ZXJvID49IDBcbiAgbGV0IGlzX25lZ2F0aXZlIHQgPSBjb21wYXJlIHQgemVybyA8IDBcbiAgbGV0IGlzX25vbl9wb3NpdGl2ZSB0ID0gY29tcGFyZSB0IHplcm8gPD0gMFxuICBsZXQgc2lnbiB0ID0gU2lnbjAub2ZfaW50IChjb21wYXJlIHQgemVybylcbmVuZFxuXG5tb2R1bGUgUG9seSAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbW9kdWxlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IFQudCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIGxldCBzZXhwX29mX3QgPSAoVC5zZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudClcblxuICAgIFtAQEBlbmRdXG5cbiAgICBpbmNsdWRlIFBvbHlcbiAgZW5kXG5cbiAgaW5jbHVkZSBQb2x5XG5cbiAgbGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG4gIGxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbiAgbGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gICAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbiAgOztcblxuICBsZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICAgIGlmIG1pbiA+IG1heFxuICAgIHRoZW5cbiAgICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG4gIDs7XG5cbiAgbW9kdWxlIEMgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcbiAgICBpbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlKVxuICBlbmRcblxuICBpbmNsdWRlIENcbmVuZFxuXG5sZXQgZ3QgY21wIGEgYiA9IGNtcCBhIGIgPiAwXG5sZXQgbHQgY21wIGEgYiA9IGNtcCBhIGIgPCAwXG5sZXQgZ2VxIGNtcCBhIGIgPSBjbXAgYSBiID49IDBcbmxldCBsZXEgY21wIGEgYiA9IGNtcCBhIGIgPD0gMFxubGV0IGVxdWFsIGNtcCBhIGIgPSBjbXAgYSBiID0gMFxubGV0IG5vdF9lcXVhbCBjbXAgYSBiID0gY21wIGEgYiA8PiAwXG5sZXQgbWluIGNtcCB0IHQnID0gaWYgbGVxIGNtcCB0IHQnIHRoZW4gdCBlbHNlIHQnXG5sZXQgbWF4IGNtcCB0IHQnID0gaWYgZ2VxIGNtcCB0IHQnIHRoZW4gdCBlbHNlIHQnXG5cbm1vZHVsZSBJbmZpeCAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZV1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpIDogSW5maXggd2l0aCB0eXBlIHQgOj0gVC50ID0gc3RydWN0XG4gIGxldCAoID4gKSBhIGIgPSBndCBULmNvbXBhcmUgYSBiXG4gIGxldCAoIDwgKSBhIGIgPSBsdCBULmNvbXBhcmUgYSBiXG4gIGxldCAoID49ICkgYSBiID0gZ2VxIFQuY29tcGFyZSBhIGJcbiAgbGV0ICggPD0gKSBhIGIgPSBsZXEgVC5jb21wYXJlIGEgYlxuICBsZXQgKCA9ICkgYSBiID0gZXF1YWwgVC5jb21wYXJlIGEgYlxuICBsZXQgKCA8PiApIGEgYiA9IG5vdF9lcXVhbCBULmNvbXBhcmUgYSBiXG5lbmRcblxubW9kdWxlIFBvbHltb3JwaGljX2NvbXBhcmUgKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmVdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA6IFBvbHltb3JwaGljX2NvbXBhcmUgd2l0aCB0eXBlIHQgOj0gVC50ID0gc3RydWN0XG4gIGluY2x1ZGUgSW5maXggKFQpXG5cbiAgbGV0IGNvbXBhcmUgPSBULmNvbXBhcmVcbiAgbGV0IGVxdWFsID0gKCA9IClcbiAgbGV0IG1pbiB0IHQnID0gbWluIGNvbXBhcmUgdCB0J1xuICBsZXQgbWF4IHQgdCcgPSBtYXggY29tcGFyZSB0IHQnXG5lbmRcblxubW9kdWxlIE1ha2VfdXNpbmdfY29tcGFyYXRvciAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgIGluY2x1ZGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0IDo9IHRcbiAgZW5kKSA6IFMgd2l0aCB0eXBlIHQgOj0gVC50IGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IFQuY29tcGFyYXRvcl93aXRuZXNzID0gc3RydWN0XG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgY29tcGFyZSA9IGNvbXBhcmF0b3IuY29tcGFyZVxuICBlbmRcblxuICBpbmNsdWRlIFRcbiAgbW9kdWxlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IFBvbHltb3JwaGljX2NvbXBhcmUgKFQpXG4gIGluY2x1ZGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IGFzY2VuZGluZyA9IGNvbXBhcmVcbiAgbGV0IGRlc2NlbmRpbmcgdCB0JyA9IGNvbXBhcmUgdCcgdFxuICBsZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbiAgbGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxuICBsZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICAgIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuICA7O1xuXG4gIGxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4XG4gICAgdGhlblxuICAgICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICAgIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbiAgOztcbmVuZFxuXG5tb2R1bGUgTWFrZSAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgPVxuICBNYWtlX3VzaW5nX2NvbXBhcmF0b3IgKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuICAgIGluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuICBlbmQpXG5cbm1vZHVsZSBJbmhlcml0IChDIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgKFQgOiBzaWdcbiAgICAgICAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICAgICAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgICAgICAgIFtAQEBlbmRdXG5cbiAgICAgICAgICB2YWwgY29tcG9uZW50IDogdCAtPiBDLnRcbiAgICAgICAgZW5kKSA9XG4gIE1ha2UgKHN0cnVjdFxuICAgIHR5cGUgdCA9IFQudCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIGxldCBzZXhwX29mX3QgPSAoVC5zZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudClcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgY29tcGFyZSB0IHQnID0gQy5jb21wYXJlIChULmNvbXBvbmVudCB0KSAoVC5jb21wb25lbnQgdCcpXG4gIGVuZClcblxuKCogY29tcGFyZSBbeF0gYW5kIFt5XSBsZXhpY29ncmFwaGljYWxseSB1c2luZyBmdW5jdGlvbnMgaW4gdGhlIGxpc3QgW2NtcHNdICopXG5sZXQgbGV4aWNvZ3JhcGhpYyBjbXBzIHggeSA9XG4gIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uXG4gICAgfCBjbXAgOjogY21wcyAtPlxuICAgICAgbGV0IHJlcyA9IGNtcCB4IHkgaW5cbiAgICAgIGlmIHJlcyA9IDAgdGhlbiBsb29wIGNtcHMgZWxzZSByZXNcbiAgICB8IFtdIC0+IDBcbiAgaW5cbiAgbG9vcCBjbXBzXG47O1xuXG5sZXQgbGlmdCBjbXAgfmYgeCB5ID0gY21wIChmIHgpIChmIHkpXG5sZXQgcmV2ZXJzZSBjbXAgeCB5ID0gY21wIHkgeFxuIiwib3BlbiEgSW1wb3J0XG5cbigqKiBAY2Fub25pY2FsIEJhc2UuSGFzaGFibGUuS2V5ICopXG5tb2R1bGUgdHlwZSBLZXkgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgW0BAQGVuZF1cblxuICAoKiogVmFsdWVzIHJldHVybmVkIGJ5IFtoYXNoXSBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4gIEFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCBpbiB0aGVcbiAgICAgIGNhc2UgdGhhdCBbaGFzaF0gcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLiAqKVxuICB2YWwgaGFzaCA6IHQgLT4gaW50XG5lbmRcblxubW9kdWxlIEhhc2hhYmxlID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9XG4gICAgeyBoYXNoIDogJ2EgLT4gaW50XG4gICAgOyBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50XG4gICAgOyBzZXhwX29mX3QgOiAnYSAtPiBTZXhwLnRcbiAgICB9XG5cbiAgKCoqIFRoaXMgZnVuY3Rpb24gaXMgc291bmQgYnV0IG5vdCBjb21wbGV0ZSwgbWVhbmluZyB0aGF0IGlmIGl0IHJldHVybnMgW3RydWVdIHRoZW4gaXQnc1xuICAgICAgc2FmZSB0byB1c2UgdGhlIHR3byBpbnRlcmNoYW5nZWFibHkuICBJZiBpdCdzIFtmYWxzZV0sIHlvdSBoYXZlIG5vIGd1YXJhbnRlZXMuICBGb3JcbiAgICAgIGV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgID4gdXRvcFxuICAgICAgICBvcGVuIENvcmU7O1xuICAgICAgICBsZXQgZXF1YWwgKGEgOiAnYSBIYXNodGJsX2ludGYuSGFzaGFibGUudCkgYiA9XG4gICAgICAgICAgcGh5c19lcXVhbCBhIGJcbiAgICAgICAgICB8fCAocGh5c19lcXVhbCBhLmhhc2ggYi5oYXNoXG4gICAgICAgICAgICAgICYmIHBoeXNfZXF1YWwgYS5jb21wYXJlIGIuY29tcGFyZVxuICAgICAgICAgICAgICAmJiBwaHlzX2VxdWFsIGEuc2V4cF9vZl90IGIuc2V4cF9vZl90KVxuICAgICAgICA7O1xuICAgICAgICBsZXQgYSA9IEhhc2h0YmxfaW50Zi5IYXNoYWJsZS57IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCA9IEludC5zZXhwX29mX3QgfTs7XG4gICAgICAgIGxldCBiID0gSGFzaHRibF9pbnRmLkhhc2hhYmxlLnsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90ID0gSW50LnNleHBfb2ZfdCB9OztcbiAgICAgICAgZXF1YWwgYSBiOzsgICgqIGZhbHNlPyEgKilcbiAgICAgIF19XG4gICopXG4gIGxldCBlcXVhbCBhIGIgPVxuICAgIHBoeXNfZXF1YWwgYSBiXG4gICAgfHwgKHBoeXNfZXF1YWwgYS5oYXNoIGIuaGFzaFxuICAgICAgICAmJiBwaHlzX2VxdWFsIGEuY29tcGFyZSBiLmNvbXBhcmVcbiAgICAgICAgJiYgcGh5c19lcXVhbCBhLnNleHBfb2ZfdCBiLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgaGFzaF9wYXJhbSA9IENhbWwuSGFzaHRibC5oYXNoX3BhcmFtXG4gIGxldCBoYXNoID0gQ2FtbC5IYXNodGJsLmhhc2hcbiAgbGV0IHBvbHkgPSB7IGhhc2g7IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmU7IHNleHBfb2ZfdCA9IChmdW4gXyAtPiBTZXhwLkF0b20gXCJfXCIpIH1cblxuICBsZXQgb2Zfa2V5ICh0eXBlIGEpIChtb2R1bGUgS2V5IDogS2V5IHdpdGggdHlwZSB0ID0gYSkgPVxuICAgIHsgaGFzaCA9IEtleS5oYXNoOyBjb21wYXJlID0gS2V5LmNvbXBhcmU7IHNleHBfb2ZfdCA9IEtleS5zZXhwX29mX3QgfVxuICA7O1xuXG4gIGxldCB0b19rZXkgKHR5cGUgYSkgeyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfSA9XG4gICAgKG1vZHVsZSBzdHJ1Y3RcbiAgICAgIHR5cGUgdCA9IGFcblxuICAgICAgbGV0IGhhc2ggPSBoYXNoXG4gICAgICBsZXQgY29tcGFyZSA9IGNvbXBhcmVcbiAgICAgIGxldCBzZXhwX29mX3QgPSBzZXhwX29mX3RcbiAgICBlbmQgOiBLZXlcbiAgICAgIHdpdGggdHlwZSB0ID0gYSlcbiAgOztcbmVuZFxuXG5pbmNsdWRlIEhhc2hhYmxlXG5cbm1vZHVsZSB0eXBlIEhhc2hhYmxlID0gc2lnXG4gIHR5cGUgJ2EgdCA9ICdhIEhhc2hhYmxlLnQgPVxuICAgIHsgaGFzaCA6ICdhIC0+IGludFxuICAgIDsgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludFxuICAgIDsgc2V4cF9vZl90IDogJ2EgLT4gU2V4cC50XG4gICAgfVxuXG4gIHZhbCBlcXVhbCA6ICdhIHQgLT4gJ2EgdCAtPiBib29sXG4gIHZhbCBwb2x5IDogJ2EgdFxuICB2YWwgb2Zfa2V5IDogKG1vZHVsZSBLZXkgd2l0aCB0eXBlIHQgPSAnYSkgLT4gJ2EgdFxuICB2YWwgdG9fa2V5IDogJ2EgdCAtPiAobW9kdWxlIEtleSB3aXRoIHR5cGUgdCA9ICdhKVxuICB2YWwgaGFzaF9wYXJhbSA6IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50XG4gIHZhbCBoYXNoIDogJ2EgLT4gaW50XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJZGVudGlmaWFibGVfaW50ZlxuXG5tb2R1bGUgTWFrZSAoVCA6IEFyZykgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlIChUKVxuICBpbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChUKVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbmVuZFxuXG5tb2R1bGUgTWFrZV91c2luZ19jb21wYXJhdG9yIChUIDogQXJnX3dpdGhfY29tcGFyYXRvcikgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlX3VzaW5nX2NvbXBhcmF0b3IgKFQpXG4gIGluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKFQpXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gdW5pdCBbQEBkZXJpdmluZ19pbmxpbmUgZW51bWVyYXRlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGFsbCA9IChbICgpIF0gOiB0IGxpc3QpXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF91bml0XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF91bml0IGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9ICh1bml0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX3VuaXQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gdW5pdF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBjb21wYXJlIF8gXyA9IDBcblxuICBsZXQgb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgICB8IFwiKClcIiAtPiAoKVxuICAgIHwgXyAtPiBmYWlsd2l0aCBcIkJhc2UuVW5pdC5vZl9zdHJpbmc6ICgpIGV4cGVjdGVkXCJcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nICgpID0gXCIoKVwiXG4gIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5Vbml0XCJcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgSWRlbnRpZmlhYmxlLk1ha2UgKFQpXG5cbmxldCBpbnZhcmlhbnQgKCkgPSAoKVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24wXG5cbmxldCBnZXRfcG9zX2xlbiA/cG9zID9sZW4gKCkgfnRvdGFsX2xlbmd0aCA9XG4gIHRyeSBSZXN1bHQuT2sgKGdldF9wb3NfbGVuX2V4biAoKSA/cG9zID9sZW4gfnRvdGFsX2xlbmd0aCkgd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgcyAtPiBPcl9lcnJvci5lcnJvcl9zdHJpbmcgc1xuOztcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IGEgc2VhcmNoIGZvciB0aGUgZmlyc3QgKHJlc3AuIGxhc3QpIGVsZW1lbnRcbiAgIHNhdGlzZnlpbmcgYSBwcmVkaWNhdGUsIGFzc3VtaW5nIHRoYXQgdGhlIHByZWRpY2F0ZSBpcyBpbmNyZWFzaW5nIG9uXG4gICB0aGUgY29udGFpbmVyLCBtZWFuaW5nIHRoYXQsIGlmIHRoZSBjb250YWluZXIgaXMgW3UxLi4udW5dLCB0aGVyZSBleGlzdHMgYVxuICAgayBzdWNoIHRoYXQgcCh1MSk9Li4uLj1wKHVrKSA9IGZhbHNlIGFuZCBwKHVrKzEpPS4uLi49cCh1bik9IHRydWUuXG4gICBJZiB0aGlzIGsgPSAxIChyZXNwIG4pLCBmaW5kX2xhc3Rfbm90X3NhdGlzZnlpbmcgKHJlc3AgZmluZF9maXJzdF9zYXRpc2Z5aW5nKVxuICAgd2lsbCByZXR1cm4gTm9uZS4gKilcblxubGV0IHJlYyBsaW5lYXJfc2VhcmNoX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbyB+aGkgfnByZWQgPVxuICBpZiBsbyA+IGhpXG4gIHRoZW4gTm9uZVxuICBlbHNlIGlmIHByZWQgKGdldCB0IGxvKVxuICB0aGVuIFNvbWUgbG9cbiAgZWxzZSBsaW5lYXJfc2VhcmNoX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbzoobG8gKyAxKSB+aGkgfnByZWRcbjs7XG5cbigqIFRha2VzIGEgY29udGFpbmVyIFt0XSwgYSBwcmVkaWNhdGUgW3ByZWRdIGFuZCB0d28gaW5kaWNlcyBbbG8gPCBoaV0sIHN1Y2ggdGhhdFxuICAgW3ByZWRdIGlzIGluY3JlYXNpbmcgb24gW3RdIGJldHdlZW4gW2xvXSBhbmQgW2hpXS5cblxuICAgcmV0dXJuIGEgcmFuZ2UgKGxvLCBoaSkgd2hlcmU6XG4gICAtIGxvIGFuZCBoaSBhcmUgY2xvc2UgZW5vdWdoIHRvZ2V0aGVyIGZvciBhIGxpbmVhciBzZWFyY2hcbiAgIC0gSWYgW3ByZWRdIGlzIG5vdCBjb25zdGFudGx5IFtmYWxzZV0gb24gW3RdIGJldHdlZW4gW2xvXSBhbmQgW2hpXSwgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgb24gd2hpY2ggW3ByZWRdIGlzIFt0cnVlXSBpcyBiZXR3ZWVuIFtsb10gYW5kIFtoaV0uICopXG4oKiBJbnZhcmlhbnQ6IHRoZSBmaXJzdCBlbGVtZW50IHNhdGlzZnlpbmcgW3ByZWRdLCBpZiBpdCBleGlzdHMgaXMgYmV0d2VlbiBbbG9dIGFuZCBbaGldICopXG5sZXQgcmVjIGZpbmRfcmFuZ2VfbmVhcl9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG8gfmhpIH5wcmVkID1cbiAgKCogV2FybmluZzogdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCB0ZXJtaW5hdGUgaWYgdGhlIGNvbnN0YW50IChjdXJyZW50bHkgOCkgaXNcbiAgICAgc2V0IDw9IDEgKilcbiAgaWYgaGkgLSBsbyA8PSA4XG4gIHRoZW4gbG8sIGhpXG4gIGVsc2UgKFxuICAgIGxldCBtaWQgPSBsbyArICgoaGkgLSBsbykgLyAyKSBpblxuICAgIGlmIHByZWQgKGdldCB0IG1pZClcbiAgICAoKiBJTlZBUklBTlQgY2hlY2s6IGl0IG1lYW5zIHRoZSBmaXJzdCBzYXRpc2Z5aW5nIGVsZW1lbnQgaXMgYmV0d2VlbiBbbG9dIGFuZCBbbWlkXSAqKVxuICAgIHRoZW5cbiAgICAgIGZpbmRfcmFuZ2VfbmVhcl9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG8gfmhpOm1pZCB+cHJlZFxuICAgICAgKCogSU5WQVJJQU5UIGNoZWNrOiBpdCBtZWFucyB0aGUgZmlyc3Qgc2F0aXNmeWluZyBlbGVtZW50LCBpZiBpdCBleGlzdHMsXG4gICAgICAgICBpcyBiZXR3ZWVuIFttaWQrMV0gYW5kIFtoaV0gKilcbiAgICBlbHNlIGZpbmRfcmFuZ2VfbmVhcl9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG86KG1pZCArIDEpIH5oaSB+cHJlZClcbjs7XG5cbmxldCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkID1cbiAgbGV0IHBvcywgbGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmdldF9wb3NfbGVuX2V4biAoKSA/cG9zID9sZW4gfnRvdGFsX2xlbmd0aDoobGVuZ3RoIHQpXG4gIGluXG4gIGxldCBsbyA9IHBvcyBpblxuICBsZXQgaGkgPSBwb3MgKyBsZW4gLSAxIGluXG4gIGxldCBsbywgaGkgPSBmaW5kX3JhbmdlX25lYXJfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvIH5oaSB+cHJlZCBpblxuICBsaW5lYXJfc2VhcmNoX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbyB+aGkgfnByZWRcbjs7XG5cbigqIFRha2VzIGFuIGFycmF5IHdpdGggc2hhcGUgW3RydWUsLi4udHJ1ZSxmYWxzZSwuLi5mYWxzZV0gKGkuZS4sIHRoZSBfcmV2ZXJzZV8gb2Ygd2hhdFxuICAgaXMgZGVzY3JpYmVkIGFib3ZlKSBhbmQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdHJ1ZSBvciBOb25lIGlmIHRoZXJlIGFyZSBub1xuICAgdHJ1ZSopXG5sZXQgZmluZF9sYXN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfnByZWQgfmdldCB+bGVuZ3RoID1cbiAgbGV0IHBvcywgbGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmdldF9wb3NfbGVuX2V4biAoKSA/cG9zID9sZW4gfnRvdGFsX2xlbmd0aDoobGVuZ3RoIHQpXG4gIGluXG4gIGlmIGxlbiA9IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgICgqIFRoZSBsYXN0IHNhdGlzZnlpbmcgaXMgdGhlIG9uZSBqdXN0IGJlZm9yZSB0aGUgZmlyc3Qgbm90IHNhdGlzZnlpbmcgKilcbiAgICBtYXRjaCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgfnBvcyB+bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihGbi5ub24gcHJlZCkgd2l0aFxuICAgIHwgTm9uZSAtPiBTb21lIChwb3MgKyBsZW4gLSAxKVxuICAgICgqIFRoaXMgbWVhbnMgdGhhdCBhbGwgZWxlbWVudHMgc2F0aXNmeSBwcmVkLlxuICAgICAgIFRoZXJlIGlzIGF0IGxlYXN0IGFuIGVsZW1lbnQgYXMgKGxlbiA+IDApICopXG4gICAgfCBTb21lIGkgd2hlbiBpID0gcG9zIC0+IE5vbmUgKCogbm8gZWxlbWVudCBzYXRpc2ZpZXMgcHJlZCAqKVxuICAgIHwgU29tZSBpIC0+IFNvbWUgKGkgLSAxKSlcbjs7XG5cbmxldCBiaW5hcnlfc2VhcmNoID9wb3MgP2xlbiB0IH5sZW5ndGggfmdldCB+Y29tcGFyZSBob3cgdiA9XG4gIG1hdGNoIGhvdyB3aXRoXG4gIHwgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuIC0+XG4gICAgZmluZF9sYXN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA8IDApXG4gIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvIC0+XG4gICAgZmluZF9sYXN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA8PSAwKVxuICB8IGBGaXJzdF9lcXVhbF90byAtPlxuICAgIChtYXRjaFxuICAgICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID49IDApXG4gICAgIHdpdGhcbiAgICAgfCBTb21lIHggd2hlbiBjb21wYXJlIChnZXQgdCB4KSB2ID0gMCAtPiBTb21lIHhcbiAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gIHwgYExhc3RfZXF1YWxfdG8gLT5cbiAgICAobWF0Y2hcbiAgICAgICBmaW5kX2xhc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDw9IDApXG4gICAgIHdpdGhcbiAgICAgfCBTb21lIHggd2hlbiBjb21wYXJlIChnZXQgdCB4KSB2ID0gMCAtPiBTb21lIHhcbiAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAtPlxuICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID49IDApXG4gIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAtPlxuICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID4gMClcbjs7XG5cbmxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA/cG9zID9sZW4gdCB+bGVuZ3RoIH5nZXQgfnNlZ21lbnRfb2YgaG93ID1cbiAgbGV0IGlzX2xlZnQgeCA9XG4gICAgbWF0Y2ggc2VnbWVudF9vZiB4IHdpdGhcbiAgICB8IGBMZWZ0IC0+IHRydWVcbiAgICB8IGBSaWdodCAtPiBmYWxzZVxuICBpblxuICBsZXQgaXNfcmlnaHQgeCA9IG5vdCAoaXNfbGVmdCB4KSBpblxuICBtYXRjaCBob3cgd2l0aFxuICB8IGBMYXN0X29uX2xlZnQgLT4gZmluZF9sYXN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmxlbmd0aCB+Z2V0IH5wcmVkOmlzX2xlZnRcbiAgfCBgRmlyc3Rfb25fcmlnaHQgLT4gZmluZF9maXJzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5sZW5ndGggfmdldCB+cHJlZDppc19yaWdodFxuOztcbiIsIigqKiBNb2R1bGUgdHlwZXMgZm9yIGEgW2JpbmFyeV9zZWFyY2hdIGZ1bmN0aW9uIGZvciBhIHNlcXVlbmNlLCBhbmQgZnVuY3RvcnMgZm9yIGJ1aWxkaW5nXG4gICAgW2JpbmFyeV9zZWFyY2hdIGZ1bmN0aW9ucy4gKilcblxub3BlbiEgSW1wb3J0XG5cbigqKiBBbiBbSW5kZXhhYmxlXSB0eXBlIGlzIGEgZmluaXRlIHNlcXVlbmNlIG9mIGVsZW1lbnRzIGluZGV4ZWQgYnkgY29uc2VjdXRpdmUgaW50ZWdlcnNcbiAgICBbMF0gLi4uIFtsZW5ndGggdCAtIDFdLiAgW2dldF0gYW5kIFtsZW5ndGhdIG11c3QgYmUgTygxKSBmb3IgdGhlIHJlc3VsdGluZ1xuICAgIFtiaW5hcnlfc2VhcmNoXSB0byBiZSBsZyhuKS4gKilcbm1vZHVsZSB0eXBlIEluZGV4YWJsZSA9IHNpZ1xuICB0eXBlIGVsdFxuICB0eXBlIHRcblxuICB2YWwgZ2V0IDogdCAtPiBpbnQgLT4gZWx0XG4gIHZhbCBsZW5ndGggOiB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSB0eXBlIEluZGV4YWJsZTEgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGdldCA6ICdhIHQgLT4gaW50IC0+ICdhXG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG5lbmRcblxubW9kdWxlIFdoaWNoX3RhcmdldF9ieV9rZXkgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICBbIGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAoKiogICAgICAgIHt2IHwgPCBlbHQgWCB8ICAgICAgICAgICAgICAgICAgICAgICB2fSAqKVxuICAgIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvICgqKiAgICAge3YgfCAgICAgIDw9IGVsdCAgICAgICBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgfCBgTGFzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCAgID0gZWx0IFggfCAgICAgICAgICAgdn0gKilcbiAgICB8IGBGaXJzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8IFggPSBlbHQgICB8ICAgICAgICAgICB2fSAqKVxuICAgIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAoKioge3YgICAgICAgICAgIHwgWCAgICAgICA+PSBlbHQgICAgICB8IHZ9ICopXG4gICAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuICgqKiAgICB7diAgICAgICAgICAgICAgICAgICAgICAgfCBYID4gZWx0IHwgdn0gKilcbiAgICBdXG4gIFtAQGRlcml2aW5nX2lubGluZSBlbnVtZXJhdGVdXG5cbiAgbGV0IGFsbCA9XG4gICAgKFsgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuXG4gICAgIDsgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvXG4gICAgIDsgYExhc3RfZXF1YWxfdG9cbiAgICAgOyBgRmlyc3RfZXF1YWxfdG9cbiAgICAgOyBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvXG4gICAgIDsgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhblxuICAgICBdXG4gICAgIDogdCBsaXN0KVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIFdoaWNoX3RhcmdldF9ieV9zZWdtZW50ID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgWyBgTGFzdF9vbl9sZWZ0XG4gICAgfCBgRmlyc3Rfb25fcmlnaHRcbiAgICBdXG4gIFtAQGRlcml2aW5nX2lubGluZSBlbnVtZXJhdGVdXG5cbiAgbGV0IGFsbCA9IChbIGBMYXN0X29uX2xlZnQ7IGBGaXJzdF9vbl9yaWdodCBdIDogdCBsaXN0KVxuXG4gIFtAQEBlbmRdXG5lbmRcblxudHlwZSAoJ3QsICdlbHQsICdrZXkpIGJpbmFyeV9zZWFyY2ggPVxuICA/cG9zOmludFxuICAtPiA/bGVuOmludFxuICAtPiAndFxuICAtPiBjb21wYXJlOignZWx0IC0+ICdrZXkgLT4gaW50KVxuICAtPiBXaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgLT4gJ2tleVxuICAtPiBpbnQgb3B0aW9uXG5cbnR5cGUgKCd0LCAnZWx0KSBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA9XG4gID9wb3M6aW50XG4gIC0+ID9sZW46aW50XG4gIC0+ICd0XG4gIC0+IHNlZ21lbnRfb2Y6KCdlbHQgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAtPiBXaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gIC0+IGludCBvcHRpb25cblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB0eXBlIGVsdFxuICB0eXBlIHRcblxuICAoKiogU2VlIFtCaW5hcnlfc2VhcmNoLmJpbmFyeV9zZWFyY2hdIGluIGJpbmFyeV9zZWFyY2gubWwgKilcbiAgdmFsIGJpbmFyeV9zZWFyY2ggOiAodCwgZWx0LCAna2V5KSBiaW5hcnlfc2VhcmNoXG5cbiAgKCoqIFNlZSBbQmluYXJ5X3NlYXJjaC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZF0gaW4gYmluYXJ5X3NlYXJjaC5tbCAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgOiAodCwgZWx0KSBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuZW5kXG5cbm1vZHVsZSB0eXBlIFMxID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoIDogKCdhIHQsICdhLCAna2V5KSBiaW5hcnlfc2VhcmNoXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA6ICgnYSB0LCAnYSkgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbmVuZFxuXG5tb2R1bGUgdHlwZSBCaW5hcnlfc2VhcmNoYWJsZSA9IHNpZ1xuICBtb2R1bGUgdHlwZSBTID0gU1xuICBtb2R1bGUgdHlwZSBTMSA9IFMxXG4gIG1vZHVsZSB0eXBlIEluZGV4YWJsZSA9IEluZGV4YWJsZVxuICBtb2R1bGUgdHlwZSBJbmRleGFibGUxID0gSW5kZXhhYmxlMVxuXG4gIG1vZHVsZSBXaGljaF90YXJnZXRfYnlfa2V5ID0gV2hpY2hfdGFyZ2V0X2J5X2tleVxuICBtb2R1bGUgV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQgPSBXaGljaF90YXJnZXRfYnlfc2VnbWVudFxuXG4gIHR5cGUgbm9ucmVjICgndCwgJ2VsdCwgJ2tleSkgYmluYXJ5X3NlYXJjaCA9ICgndCwgJ2VsdCwgJ2tleSkgYmluYXJ5X3NlYXJjaFxuICB0eXBlIG5vbnJlYyAoJ3QsICdlbHQpIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkID0gKCd0LCAnZWx0KSBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuXG4gIG1vZHVsZSBNYWtlIChUIDogSW5kZXhhYmxlKSA6IFMgd2l0aCB0eXBlIHQgOj0gVC50IHdpdGggdHlwZSBlbHQgOj0gVC5lbHRcbiAgbW9kdWxlIE1ha2UxIChUIDogSW5kZXhhYmxlMSkgOiBTMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBULnRcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEJpbmFyeV9zZWFyY2hhYmxlX2ludGZcblxubW9kdWxlIHR5cGUgQXJnID0gc2lnXG4gIHR5cGUgJ2EgZWx0XG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBnZXQgOiAnYSB0IC0+IGludCAtPiAnYSBlbHRcbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgTWFrZV9nZW4gKFQgOiBBcmcpID0gc3RydWN0XG4gIGxldCBnZXQgPSBULmdldFxuICBsZXQgbGVuZ3RoID0gVC5sZW5ndGhcblxuICBsZXQgYmluYXJ5X3NlYXJjaCA/cG9zID9sZW4gdCB+Y29tcGFyZSBob3cgdiA9XG4gICAgQmluYXJ5X3NlYXJjaC5iaW5hcnlfc2VhcmNoID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+Y29tcGFyZSBob3cgdlxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA/cG9zID9sZW4gdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIEJpbmFyeV9zZWFyY2guYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5zZWdtZW50X29mIGhvd1xuICA7O1xuZW5kXG5cbm1vZHVsZSBNYWtlIChUIDogSW5kZXhhYmxlKSA9IE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIHR5cGUgJ2EgZWx0ID0gVC5lbHRcbiAgICB0eXBlICdhIHQgPSBULnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZTEgKFQgOiBJbmRleGFibGUxKSA9IE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICB0eXBlICdhIGVsdCA9ICdhXG4gICAgdHlwZSAnYSB0ID0gJ2EgVC50XG5cbiAgICBsZXQgZ2V0ID0gVC5nZXRcbiAgICBsZXQgbGVuZ3RoID0gVC5sZW5ndGhcbiAgZW5kKVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEJsaXRfaW50ZlxuXG5tb2R1bGUgdHlwZSBTZXF1ZW5jZV9nZW4gPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgTWFrZV9nZW5cbiAgICAoU3JjIDogU2VxdWVuY2VfZ2VuKSAoRHN0IDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBTZXF1ZW5jZV9nZW5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBjcmVhdGVfbGlrZSA6IGxlbjppbnQgLT4gJ2EgU3JjLnQgLT4gJ2EgdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCB1bnNhZmVfYmxpdCA6ICgnYSBTcmMudCwgJ2EgdCkgYmxpdFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpID1cbnN0cnVjdFxuICBsZXQgdW5zYWZlX2JsaXQgPSBEc3QudW5zYWZlX2JsaXRcblxuICBsZXQgYmxpdCB+c3JjIH5zcmNfcG9zIH5kc3QgfmRzdF9wb3MgfmxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5jaGVja19wb3NfbGVuX2V4blxuICAgICAgfnBvczpzcmNfcG9zXG4gICAgICB+bGVuXG4gICAgICB+dG90YWxfbGVuZ3RoOihTcmMubGVuZ3RoIHNyYyk7XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5jaGVja19wb3NfbGVuX2V4blxuICAgICAgfnBvczpkc3RfcG9zXG4gICAgICB+bGVuXG4gICAgICB+dG90YWxfbGVuZ3RoOihEc3QubGVuZ3RoIGRzdCk7XG4gICAgaWYgbGVuID4gMCB0aGVuIHVuc2FmZV9ibGl0IH5zcmMgfnNyY19wb3MgfmRzdCB+ZHN0X3BvcyB+bGVuXG4gIDs7XG5cbiAgbGV0IGJsaXRvXG4gICAgICAgIH5zcmNcbiAgICAgICAgPyhzcmNfcG9zID0gMClcbiAgICAgICAgPyhzcmNfbGVuID0gU3JjLmxlbmd0aCBzcmMgLSBzcmNfcG9zKVxuICAgICAgICB+ZHN0XG4gICAgICAgID8oZHN0X3BvcyA9IDApXG4gICAgICAgICgpXG4gICAgPVxuICAgIGJsaXQgfnNyYyB+c3JjX3BvcyB+bGVuOnNyY19sZW4gfmRzdCB+ZHN0X3Bvc1xuICA7O1xuXG4gICgqIFtzdWJdIGFuZCBbc3Vib10gZW5zdXJlIHRoYXQgZXZlcnkgcG9zaXRpb24gb2YgdGhlIGNyZWF0ZWQgc2VxdWVuY2UgaXMgcG9wdWxhdGVkIGJ5XG4gICAgIGFuIGVsZW1lbnQgb2YgdGhlIHNvdXJjZSBhcnJheS4gIFRodXMgZXZlcnkgZWxlbWVudCBvZiBbZHN0XSBiZWxvdyBpcyB3ZWxsXG4gICAgIGRlZmluZWQuICopXG4gIGxldCBzdWIgc3JjIH5wb3MgfmxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aDooU3JjLmxlbmd0aCBzcmMpO1xuICAgIGxldCBkc3QgPSBEc3QuY3JlYXRlX2xpa2UgfmxlbiBzcmMgaW5cbiAgICBpZiBsZW4gPiAwIHRoZW4gdW5zYWZlX2JsaXQgfnNyYyB+c3JjX3Bvczpwb3MgfmRzdCB+ZHN0X3BvczowIH5sZW47XG4gICAgZHN0XG4gIDs7XG5cbiAgbGV0IHN1Ym8gPyhwb3MgPSAwKSA/bGVuIHNyYyA9XG4gICAgc3ViXG4gICAgICBzcmNcbiAgICAgIH5wb3NcbiAgICAgIH5sZW46XG4gICAgICAgIChtYXRjaCBsZW4gd2l0aFxuICAgICAgICAgfCBTb21lIGkgLT4gaVxuICAgICAgICAgfCBOb25lIC0+IFNyYy5sZW5ndGggc3JjIC0gcG9zKVxuICA7O1xuZW5kXG5cbm1vZHVsZSBNYWtlMSAoU2VxdWVuY2UgOiBzaWdcbiAgICBpbmNsdWRlIFNlcXVlbmNlX2dlblxuXG4gICAgdmFsIGNyZWF0ZV9saWtlIDogbGVuOmludCAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgdW5zYWZlX2JsaXQgOiAoJ2EgdCwgJ2EgdCkgYmxpdFxuICBlbmQpID1cbiAgTWFrZV9nZW4gKFNlcXVlbmNlKSAoU2VxdWVuY2UpXG5cbm1vZHVsZSBNYWtlMV9nZW5lcmljIChTZXF1ZW5jZSA6IFNlcXVlbmNlMSkgPSBNYWtlX2dlbiAoU2VxdWVuY2UpIChTZXF1ZW5jZSlcblxubW9kdWxlIE1ha2UgKFNlcXVlbmNlIDogc2lnXG4gICAgaW5jbHVkZSBTZXF1ZW5jZVxuXG4gICAgdmFsIGNyZWF0ZSA6IGxlbjppbnQgLT4gdFxuICAgIHZhbCB1bnNhZmVfYmxpdCA6ICh0LCB0KSBibGl0XG4gIGVuZCkgPVxuc3RydWN0XG4gIG1vZHVsZSBTZXF1ZW5jZSA9IHN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9IFNlcXVlbmNlLnRcblxuICAgIG9wZW4gU2VxdWVuY2VcblxuICAgIGxldCBjcmVhdGVfbGlrZSB+bGVuIF8gPSBjcmVhdGUgfmxlblxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdFxuICBlbmRcblxuICBpbmNsdWRlIE1ha2VfZ2VuIChTZXF1ZW5jZSkgKFNlcXVlbmNlKVxuZW5kXG5cbm1vZHVsZSBNYWtlX2Rpc3RpbmN0XG4gICAgKFNyYyA6IFNlcXVlbmNlKSAoRHN0IDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIFNlcXVlbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBjcmVhdGUgOiBsZW46aW50IC0+IHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbCB1bnNhZmVfYmxpdCA6IChTcmMudCwgdCkgYmxpdFxuICAgICAgICAgICAgICAgICAgICAgIGVuZCkgPVxuICBNYWtlX2dlblxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IFNyYy50XG5cbiAgICAgIG9wZW4gU3JjXG5cbiAgICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gRHN0LnRcblxuICAgICAgb3BlbiBEc3RcblxuICAgICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgICAgbGV0IGNyZWF0ZV9saWtlIH5sZW4gXyA9IGNyZWF0ZSB+bGVuXG4gICAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdFxuICAgIGVuZClcblxubW9kdWxlIE1ha2VfdG9fc3RyaW5nIChUIDogc2lnXG4gICAgdHlwZSB0XG4gIGVuZClcbiAgICAoVG9fYnl0ZXMgOiBTX2Rpc3RpbmN0IHdpdGggdHlwZSBzcmMgOj0gVC50IHdpdGggdHlwZSBkc3QgOj0gYnl0ZXMpID1cbnN0cnVjdFxuICBvcGVuIFRvX2J5dGVzXG5cbiAgbGV0IHN1YiBzcmMgfnBvcyB+bGVuID1cbiAgICBCeXRlczAudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTooc3ViIHNyYyB+cG9zIH5sZW4pXG4gIDs7XG5cbiAgbGV0IHN1Ym8gP3BvcyA/bGVuIHNyYyA9XG4gICAgQnl0ZXMwLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6KHN1Ym8gP3BvcyA/bGVuIHNyYylcbiAgOztcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbmluY2x1ZGUgKFxuc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIG9wdGlvbiBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPSBjb21wYXJlX29wdGlvblxuXG4gIGxldCBoYXNoX2ZvbGRfdCA6XG4gICAgJ2EuXG4gICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiAnYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgLT4gJ2EgdFxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgID1cbiAgICBoYXNoX2ZvbGRfb3B0aW9uXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9XG4gICAgb3B0aW9uX29mX3NleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBzZXhwX29mX29wdGlvblxuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gb3B0aW9uX3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZCA6XG5zaWdcbiAgdHlwZSAnYSB0ID0gJ2Egb3B0aW9uIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIGluY2x1ZGUgUHB4X2hhc2hfbGliLkhhc2hhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5lbmQpXG5cbnR5cGUgJ2EgdCA9ICdhIG9wdGlvbiA9XG4gIHwgTm9uZVxuICB8IFNvbWUgb2YgJ2FcblxubGV0IGlzX25vbmUgPSBmdW5jdGlvblxuICB8IE5vbmUgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19zb21lID0gZnVuY3Rpb25cbiAgfCBTb21lIF8gLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCB2YWx1ZV9tYXAgbyB+ZGVmYXVsdCB+ZiA9XG4gIG1hdGNoIG8gd2l0aFxuICB8IFNvbWUgeCAtPiBmIHhcbiAgfCBOb25lIC0+IGRlZmF1bHRcbjs7XG5cbmxldCBpdGVyIG8gfmYgPVxuICBtYXRjaCBvIHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSBhIC0+IGYgYVxuOztcblxubGV0IGludmFyaWFudCBmIHQgPSBpdGVyIHQgfmZcblxubGV0IGNhbGwgeCB+ZiA9XG4gIG1hdGNoIGYgd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIGYgLT4gZiB4XG47O1xuXG5sZXQgdmFsdWUgdCB+ZGVmYXVsdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gZGVmYXVsdFxuICB8IFNvbWUgeCAtPiB4XG47O1xuXG5sZXQgdmFsdWVfZXhuID9oZXJlID9lcnJvciA/bWVzc2FnZSB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU29tZSB4IC0+IHhcbiAgfCBOb25lIC0+XG4gICAgbGV0IGVycm9yID1cbiAgICAgIG1hdGNoIGhlcmUsIGVycm9yLCBtZXNzYWdlIHdpdGhcbiAgICAgIHwgTm9uZSwgTm9uZSwgTm9uZSAtPiBFcnJvci5vZl9zdHJpbmcgXCJPcHRpb24udmFsdWVfZXhuIE5vbmVcIlxuICAgICAgfCBOb25lLCBOb25lLCBTb21lIG0gLT4gRXJyb3Iub2Zfc3RyaW5nIG1cbiAgICAgIHwgTm9uZSwgU29tZSBlLCBOb25lIC0+IGVcbiAgICAgIHwgTm9uZSwgU29tZSBlLCBTb21lIG0gLT4gRXJyb3IudGFnIGUgfnRhZzptXG4gICAgICB8IFNvbWUgcCwgTm9uZSwgTm9uZSAtPlxuICAgICAgICBFcnJvci5jcmVhdGUgXCJPcHRpb24udmFsdWVfZXhuXCIgcCBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90XG4gICAgICB8IFNvbWUgcCwgTm9uZSwgU29tZSBtIC0+IEVycm9yLmNyZWF0ZSBtIHAgU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdFxuICAgICAgfCBTb21lIHAsIFNvbWUgZSwgXyAtPlxuICAgICAgICBFcnJvci5jcmVhdGVcbiAgICAgICAgICAodmFsdWUgbWVzc2FnZSB+ZGVmYXVsdDpcIlwiKVxuICAgICAgICAgIChlLCBwKVxuICAgICAgICAgIChzZXhwX29mX3BhaXIgRXJyb3Iuc2V4cF9vZl90IFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3QpXG4gICAgaW5cbiAgICBFcnJvci5yYWlzZSBlcnJvclxuOztcblxubGV0IHZhbHVlX29yX3RodW5rIG8gfmRlZmF1bHQgPVxuICBtYXRjaCBvIHdpdGhcbiAgfCBTb21lIHggLT4geFxuICB8IE5vbmUgLT4gZGVmYXVsdCAoKVxuOztcblxubGV0IHRvX2FycmF5IHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IFt8fF1cbiAgfCBTb21lIHggLT4gW3wgeCB8XVxuOztcblxubGV0IHRvX2xpc3QgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gW11cbiAgfCBTb21lIHggLT4gWyB4IF1cbjs7XG5cbmxldCBtaW5fZWx0IHQgfmNvbXBhcmU6XyA9IHRcbmxldCBtYXhfZWx0IHQgfmNvbXBhcmU6XyA9IHRcblxubGV0IHN1bSAodHlwZSBhKSAobW9kdWxlIE0gOiBDb250YWluZXIuU3VtbWFibGUgd2l0aCB0eXBlIHQgPSBhKSB0IH5mID1cbiAgdmFsdWVfbWFwIHQgfmRlZmF1bHQ6TS56ZXJvIH5mXG47O1xuXG5sZXQgZm9yX2FsbCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiB0cnVlXG4gIHwgU29tZSB4IC0+IGYgeFxuOztcblxubGV0IGV4aXN0cyB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBmYWxzZVxuICB8IFNvbWUgeCAtPiBmIHhcbjs7XG5cbmxldCBtZW0gdCBhIH5lcXVhbCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gZmFsc2VcbiAgfCBTb21lIGEnIC0+IGVxdWFsIGEgYSdcbjs7XG5cbmxldCBsZW5ndGggdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gMFxuICB8IFNvbWUgXyAtPiAxXG47O1xuXG5sZXQgaXNfZW1wdHkgPSBpc19ub25lXG5cbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IGluaXRcbiAgfCBTb21lIHggLT4gZiBpbml0IHhcbjs7XG5cbmxldCBjb3VudCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiAwXG4gIHwgU29tZSBhIC0+IGlmIGYgYSB0aGVuIDEgZWxzZSAwXG47O1xuXG5sZXQgZmluZCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSB4IC0+IGlmIGYgeCB0aGVuIHQgZWxzZSBOb25lXG47O1xuXG5sZXQgZmluZF9tYXAgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgYSAtPiBmIGFcbjs7XG5cbmxldCBlcXVhbCBmIHQgdCcgPVxuICBtYXRjaCB0LCB0JyB3aXRoXG4gIHwgTm9uZSwgTm9uZSAtPiB0cnVlXG4gIHwgU29tZSB4LCBTb21lIHgnIC0+IGYgeCB4J1xuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBzb21lIHggPSBTb21lIHhcblxubGV0IGZpcnN0X3NvbWUgeCB5ID1cbiAgbWF0Y2ggeCB3aXRoXG4gIHwgU29tZSBfIC0+IHhcbiAgfCBOb25lIC0+IHlcbjs7XG5cbmxldCBzb21lX2lmIGNvbmQgeCA9IGlmIGNvbmQgdGhlbiBTb21lIHggZWxzZSBOb25lXG5cbmxldCBtZXJnZSBhIGIgfmYgPVxuICBtYXRjaCBhLCBiIHdpdGhcbiAgfCBOb25lLCB4IHwgeCwgTm9uZSAtPiB4XG4gIHwgU29tZSBhLCBTb21lIGIgLT4gU29tZSAoZiBhIGIpXG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBTb21lIHYgYXMgbyB3aGVuIGYgdiAtPiBvXG4gIHwgXyAtPiBOb25lXG47O1xuXG5sZXQgdHJ5X3dpdGggZiA9XG4gIG1hdGNoIGYgKCkgd2l0aFxuICB8IHggLT4gU29tZSB4XG4gIHwgZXhjZXB0aW9uIF8gLT4gTm9uZVxuOztcblxubGV0IHRyeV93aXRoX2pvaW4gZiA9XG4gIG1hdGNoIGYgKCkgd2l0aFxuICB8IHggLT4geFxuICB8IGV4Y2VwdGlvbiBfIC0+IE5vbmVcbjs7XG5cbmxldCBtYXAgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgYSAtPiBTb21lIChmIGEpXG47O1xuXG5sZXQgYXBwbHkgZiB4ID1cbiAgbWF0Y2ggZiB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSBmIC0+IG1hcCB+ZiB4XG47O1xuXG5tb2R1bGUgTW9uYWRfYXJnID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIG9wdGlvblxuXG4gIGxldCByZXR1cm4geCA9IFNvbWUgeFxuICBsZXQgYXBwbHkgPSBhcHBseVxuICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcblxuICBsZXQgYmluZCBvIH5mID1cbiAgICBtYXRjaCBvIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSB4IC0+IGYgeFxuICA7O1xuZW5kXG5cbmluY2x1ZGUgTW9uYWQuTWFrZSAoTW9uYWRfYXJnKVxuaW5jbHVkZSBBcHBsaWNhdGl2ZS5NYWtlIChNb25hZF9hcmcpXG5cbmxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbmxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB0XG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGVcblxubW9kdWxlIE9mX3NleHBhYmxlXG4gICAgKFNleHBhYmxlIDogUykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlIHRcblxuICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19zZXhwYWJsZSA6IHQgLT4gU2V4cGFibGUudFxuICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9zZXhwYWJsZSA6IFNleHBhYmxlLnQgLT4gdFxuICAgICAgICAgICAgICAgICAgICBlbmQpIDogUyB3aXRoIHR5cGUgdCA6PSBNLnQgPSBzdHJ1Y3RcbiAgbGV0IHRfb2Zfc2V4cCBzZXhwID1cbiAgICBsZXQgcyA9IFNleHBhYmxlLnRfb2Zfc2V4cCBzZXhwIGluXG4gICAgdHJ5IE0ub2Zfc2V4cGFibGUgcyB3aXRoXG4gICAgfCBleG4gLT4gb2Zfc2V4cF9lcnJvcl9leG4gZXhuIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHQgPSBTZXhwYWJsZS5zZXhwX29mX3QgKE0udG9fc2V4cGFibGUgdClcbmVuZFxuXG5tb2R1bGUgT2Zfc2V4cGFibGUxXG4gICAgKFNleHBhYmxlIDogUzEpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGUgJ2EgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19zZXhwYWJsZSA6ICdhIHQgLT4gJ2EgU2V4cGFibGUudFxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgb2Zfc2V4cGFibGUgOiAnYSBTZXhwYWJsZS50IC0+ICdhIHRcbiAgICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBNLnQgPSBzdHJ1Y3RcbiAgbGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCA9XG4gICAgbGV0IHMgPSBTZXhwYWJsZS50X29mX3NleHAgYV9vZl9zZXhwIHNleHAgaW5cbiAgICB0cnkgTS5vZl9zZXhwYWJsZSBzIHdpdGhcbiAgICB8IGV4biAtPiBvZl9zZXhwX2Vycm9yX2V4biBleG4gc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPSBTZXhwYWJsZS5zZXhwX29mX3Qgc2V4cF9vZl9hIChNLnRvX3NleHBhYmxlIHQpXG5lbmRcblxubW9kdWxlIE9mX3NleHBhYmxlMlxuICAgIChTZXhwYWJsZSA6IFMyKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fc2V4cGFibGUgOiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIFNleHBhYmxlLnRcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX3NleHBhYmxlIDogKCdhLCAnYikgU2V4cGFibGUudCAtPiAoJ2EsICdiKSB0XG4gICAgICAgICAgICAgICAgICAgICBlbmQpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgTS50ID0gc3RydWN0XG4gIGxldCB0X29mX3NleHAgYV9vZl9zZXhwIGJfb2Zfc2V4cCBzZXhwID1cbiAgICBsZXQgcyA9IFNleHBhYmxlLnRfb2Zfc2V4cCBhX29mX3NleHAgYl9vZl9zZXhwIHNleHAgaW5cbiAgICB0cnkgTS5vZl9zZXhwYWJsZSBzIHdpdGhcbiAgICB8IGV4biAtPiBvZl9zZXhwX2Vycm9yX2V4biBleG4gc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHNleHBfb2ZfYiB0ID1cbiAgICBTZXhwYWJsZS5zZXhwX29mX3Qgc2V4cF9vZl9hIHNleHBfb2ZfYiAoTS50b19zZXhwYWJsZSB0KVxuICA7O1xuZW5kXG5cbm1vZHVsZSBPZl9zZXhwYWJsZTNcbiAgICAoU2V4cGFibGUgOiBTMykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19zZXhwYWJsZSA6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSBTZXhwYWJsZS50XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9zZXhwYWJsZSA6ICgnYSwgJ2IsICdjKSBTZXhwYWJsZS50IC0+ICgnYSwgJ2IsICdjKSB0XG4gICAgICAgICAgICAgICAgICAgICBlbmQpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSBNLnQgPSBzdHJ1Y3RcbiAgbGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgYl9vZl9zZXhwIGNfb2Zfc2V4cCBzZXhwID1cbiAgICBsZXQgcyA9IFNleHBhYmxlLnRfb2Zfc2V4cCBhX29mX3NleHAgYl9vZl9zZXhwIGNfb2Zfc2V4cCBzZXhwIGluXG4gICAgdHJ5IE0ub2Zfc2V4cGFibGUgcyB3aXRoXG4gICAgfCBleG4gLT4gb2Zfc2V4cF9lcnJvcl9leG4gZXhuIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSBzZXhwX29mX2Igc2V4cF9vZl9jIHQgPVxuICAgIFNleHBhYmxlLnNleHBfb2ZfdCBzZXhwX29mX2Egc2V4cF9vZl9iIHNleHBfb2ZfYyAoTS50b19zZXhwYWJsZSB0KVxuICA7O1xuZW5kXG5cbm1vZHVsZSBPZl9zdHJpbmdhYmxlIChNIDogU3RyaW5nYWJsZS5TKSA6IFMgd2l0aCB0eXBlIHQgOj0gTS50ID0gc3RydWN0XG4gIGxldCB0X29mX3NleHAgc2V4cCA9XG4gICAgbWF0Y2ggc2V4cCB3aXRoXG4gICAgfCBTZXhwLkF0b20gcyAtPlxuICAgICAgKHRyeSBNLm9mX3N0cmluZyBzIHdpdGhcbiAgICAgICB8IGV4biAtPiBvZl9zZXhwX2Vycm9yX2V4biBleG4gc2V4cClcbiAgICB8IFNleHAuTGlzdCBfIC0+XG4gICAgICBvZl9zZXhwX2Vycm9yXG4gICAgICAgIFwiU2V4cGFibGUuT2Zfc3RyaW5nYWJsZS50X29mX3NleHAgZXhwZWN0ZWQgYW4gYXRvbSwgYnV0IGdvdCBhIGxpc3RcIlxuICAgICAgICBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCB0ID0gU2V4cC5BdG9tIChNLnRvX3N0cmluZyB0KVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgRWl0aGVyX2ludGZcbm1vZHVsZSBMaXN0ID0gTGlzdDBcbmluY2x1ZGUgRWl0aGVyMFxuXG5sZXQgc3dhcCA9IGZ1bmN0aW9uXG4gIHwgRmlyc3QgeCAtPiBTZWNvbmQgeFxuICB8IFNlY29uZCB4IC0+IEZpcnN0IHhcbjs7XG5cbmxldCBpc19maXJzdCA9IGZ1bmN0aW9uXG4gIHwgRmlyc3QgXyAtPiB0cnVlXG4gIHwgU2Vjb25kIF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19zZWNvbmQgPSBmdW5jdGlvblxuICB8IEZpcnN0IF8gLT4gZmFsc2VcbiAgfCBTZWNvbmQgXyAtPiB0cnVlXG47O1xuXG5sZXQgdmFsdWUgKEZpcnN0IHggfCBTZWNvbmQgeCkgPSB4XG5cbmxldCB2YWx1ZV9tYXAgdCB+Zmlyc3QgfnNlY29uZCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEZpcnN0IHggLT4gZmlyc3QgeFxuICB8IFNlY29uZCB4IC0+IHNlY29uZCB4XG47O1xuXG5sZXQgaXRlciA9IHZhbHVlX21hcFxuXG5sZXQgbWFwIHQgfmZpcnN0IH5zZWNvbmQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBGaXJzdCB4IC0+IEZpcnN0IChmaXJzdCB4KVxuICB8IFNlY29uZCB4IC0+IFNlY29uZCAoc2Vjb25kIHgpXG47O1xuXG5sZXQgZmlyc3QgeCA9IEZpcnN0IHhcbmxldCBzZWNvbmQgeCA9IFNlY29uZCB4XG5cbmxldCBlcXVhbCBlcTEgZXEyIHQxIHQyID1cbiAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgfCBGaXJzdCB4LCBGaXJzdCB5IC0+IGVxMSB4IHlcbiAgfCBTZWNvbmQgeCwgU2Vjb25kIHkgLT4gZXEyIHggeVxuICB8IEZpcnN0IF8sIFNlY29uZCBfIHwgU2Vjb25kIF8sIEZpcnN0IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpbnZhcmlhbnQgZiBzID0gZnVuY3Rpb25cbiAgfCBGaXJzdCB4IC0+IGYgeFxuICB8IFNlY29uZCB5IC0+IHMgeVxuOztcblxubW9kdWxlIE1ha2VfZm9jdXNlZCAoTSA6IHNpZ1xuICAgIHR5cGUgKCsnYSwgKydiKSB0XG5cbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfKSB0XG4gICAgdmFsIG90aGVyIDogJ2IgLT4gKF8sICdiKSB0XG4gICAgdmFsIGVpdGhlciA6ICgnYSwgJ2IpIHQgLT4gcmV0dXJuOignYSAtPiAnYykgLT4gb3RoZXI6KCdiIC0+ICdjKSAtPiAnY1xuXG4gICAgdmFsIGNvbWJpbmVcbiAgICAgIDogICgnYSwgJ2QpIHRcbiAgICAgIC0+ICgnYiwgJ2QpIHRcbiAgICAgIC0+IGY6KCdhIC0+ICdiIC0+ICdjKVxuICAgICAgLT4gb3RoZXI6KCdkIC0+ICdkIC0+ICdkKVxuICAgICAgLT4gKCdjLCAnZCkgdFxuXG4gICAgdmFsIGJpbmQgOiAoJ2EsICdiKSB0IC0+IGY6KCdhIC0+ICgnYywgJ2IpIHQpIC0+ICgnYywgJ2IpIHRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgaW5jbHVkZSBNXG4gIG9wZW4gV2l0aF9yZXR1cm5cblxuICBsZXQgbWFwIHQgfmYgPSBiaW5kIHQgfmY6KGZ1biB4IC0+IHJldHVybiAoZiB4KSlcblxuICBpbmNsdWRlIE1vbmFkLk1ha2UyIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG5cbiAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgIGxldCBiaW5kID0gYmluZFxuICAgICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgZW5kKVxuXG4gIG1vZHVsZSBBcHAgPSBBcHBsaWNhdGl2ZS5NYWtlMiAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuXG4gICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICBsZXQgYXBwbHkgdDEgdDIgPSBiaW5kIHQxIH5mOihmdW4gZiAtPiBiaW5kIHQyIH5mOihmdW4geCAtPiByZXR1cm4gKGYgeCkpKVxuICAgICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgZW5kKVxuXG4gIGluY2x1ZGUgQXBwXG5cbiAgbGV0IGNvbWJpbmVfYWxsID1cbiAgICBsZXQgcmVjIG90aGVyX2xvb3AgZiBhY2MgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBvdGhlciBhY2NcbiAgICAgIHwgdCA6OiB0cyAtPlxuICAgICAgICBlaXRoZXJcbiAgICAgICAgICB0XG4gICAgICAgICAgfnJldHVybjooZnVuIF8gLT4gb3RoZXJfbG9vcCBmIGFjYyB0cylcbiAgICAgICAgICB+b3RoZXI6KGZ1biBvIC0+IG90aGVyX2xvb3AgZiAoZiBhY2MgbykgdHMpXG4gICAgaW5cbiAgICBsZXQgcmVjIHJldHVybl9sb29wIGYgYWNjID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gcmV0dXJuIChMaXN0LnJldiBhY2MpXG4gICAgICB8IHQgOjogdHMgLT5cbiAgICAgICAgZWl0aGVyXG4gICAgICAgICAgdFxuICAgICAgICAgIH5yZXR1cm46KGZ1biB4IC0+IHJldHVybl9sb29wIGYgKHggOjogYWNjKSB0cylcbiAgICAgICAgICB+b3RoZXI6KGZ1biBvIC0+IG90aGVyX2xvb3AgZiBvIHRzKVxuICAgIGluXG4gICAgZnVuIHRzIH5mIC0+IHJldHVybl9sb29wIGYgW10gdHNcbiAgOztcblxuICBsZXQgY29tYmluZV9hbGxfdW5pdCA9XG4gICAgbGV0IHJlYyBvdGhlcl9sb29wIGYgYWNjID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gb3RoZXIgYWNjXG4gICAgICB8IHQgOjogdHMgLT5cbiAgICAgICAgZWl0aGVyXG4gICAgICAgICAgdFxuICAgICAgICAgIH5yZXR1cm46KGZ1biAoKSAtPiBvdGhlcl9sb29wIGYgYWNjIHRzKVxuICAgICAgICAgIH5vdGhlcjooZnVuIG8gLT4gb3RoZXJfbG9vcCBmIChmIGFjYyBvKSB0cylcbiAgICBpblxuICAgIGxldCByZWMgcmV0dXJuX2xvb3AgZiA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IHJldHVybiAoKVxuICAgICAgfCB0IDo6IHRzIC0+XG4gICAgICAgIGVpdGhlciB0IH5yZXR1cm46KGZ1biAoKSAtPiByZXR1cm5fbG9vcCBmIHRzKSB+b3RoZXI6KGZ1biBvIC0+IG90aGVyX2xvb3AgZiBvIHRzKVxuICAgIGluXG4gICAgZnVuIHRzIH5mIC0+IHJldHVybl9sb29wIGYgdHNcbiAgOztcblxuICBsZXQgdG9fb3B0aW9uIHQgPSBlaXRoZXIgdCB+cmV0dXJuOk9wdGlvbi5zb21lIH5vdGhlcjooZnVuIF8gLT4gTm9uZSlcbiAgbGV0IHZhbHVlIHQgfmRlZmF1bHQgPSBlaXRoZXIgdCB+cmV0dXJuOkZuLmlkIH5vdGhlcjooZnVuIF8gLT4gZGVmYXVsdClcblxuICBsZXQgd2l0aF9yZXR1cm4gZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByZXQgLT4gb3RoZXIgKGYgKFdpdGhfcmV0dXJuLnByZXBlbmQgcmV0IH5mOnJldHVybikpKVxuICA7O1xuZW5kXG5cbm1vZHVsZSBGaXJzdCA9IE1ha2VfZm9jdXNlZCAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcblxuICAgIGxldCByZXR1cm4gPSBmaXJzdFxuICAgIGxldCBvdGhlciA9IHNlY29uZFxuXG4gICAgbGV0IGVpdGhlciB0IH5yZXR1cm4gfm90aGVyID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBGaXJzdCB4IC0+IHJldHVybiB4XG4gICAgICB8IFNlY29uZCB5IC0+IG90aGVyIHlcbiAgICA7O1xuXG4gICAgbGV0IGNvbWJpbmUgdDEgdDIgfmYgfm90aGVyID1cbiAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICB8IEZpcnN0IHgsIEZpcnN0IHkgLT4gRmlyc3QgKGYgeCB5KVxuICAgICAgfCBTZWNvbmQgeCwgU2Vjb25kIHkgLT4gU2Vjb25kIChvdGhlciB4IHkpXG4gICAgICB8IFNlY29uZCB4LCBfIHwgXywgU2Vjb25kIHggLT4gU2Vjb25kIHhcbiAgICA7O1xuXG4gICAgbGV0IGJpbmQgdCB+ZiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRmlyc3QgeCAtPiBmIHhcbiAgICAgICgqIFJldXNlIHRoZSB2YWx1ZSBpbiBvcmRlciB0byBhdm9pZCBhbGxvY2F0aW9uLiAqKVxuICAgICAgfCBTZWNvbmQgXyBhcyB5IC0+IHlcbiAgICA7O1xuICBlbmQpXG5cbm1vZHVsZSBTZWNvbmQgPSBNYWtlX2ZvY3VzZWQgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2IsICdhKSB0XG5cbiAgICBsZXQgcmV0dXJuID0gc2Vjb25kXG4gICAgbGV0IG90aGVyID0gZmlyc3RcblxuICAgIGxldCBlaXRoZXIgdCB+cmV0dXJuIH5vdGhlciA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgU2Vjb25kIHkgLT4gcmV0dXJuIHlcbiAgICAgIHwgRmlyc3QgeCAtPiBvdGhlciB4XG4gICAgOztcblxuICAgIGxldCBjb21iaW5lIHQxIHQyIH5mIH5vdGhlciA9XG4gICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgfCBTZWNvbmQgeCwgU2Vjb25kIHkgLT4gU2Vjb25kIChmIHggeSlcbiAgICAgIHwgRmlyc3QgeCwgRmlyc3QgeSAtPiBGaXJzdCAob3RoZXIgeCB5KVxuICAgICAgfCBGaXJzdCB4LCBfIHwgXywgRmlyc3QgeCAtPiBGaXJzdCB4XG4gICAgOztcblxuICAgIGxldCBiaW5kIHQgfmYgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IFNlY29uZCB4IC0+IGYgeFxuICAgICAgKCogUmV1c2UgdGhlIHZhbHVlIGluIG9yZGVyIHRvIGF2b2lkIGFsbG9jYXRpb24sIGxpa2UgW0ZpcnN0LmJpbmRdIGFib3ZlLiAqKVxuICAgICAgfCBGaXJzdCBfIGFzIHkgLT4geVxuICAgIDs7XG4gIGVuZClcblxubW9kdWxlIEV4cG9ydCA9IHN0cnVjdFxuICB0eXBlICgnZiwgJ3MpIF9laXRoZXIgPSAoJ2YsICdzKSB0ID1cbiAgICB8IEZpcnN0IG9mICdmXG4gICAgfCBTZWNvbmQgb2YgJ3NcbmVuZFxuIiwiaW5jbHVkZSBJbmRleGVkX2NvbnRhaW5lcl9pbnRmXG5cbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5cbmxldCBpdGVyaSB+Zm9sZCB0IH5mID1cbiAgaWdub3JlXG4gICAgKGZvbGQgdCB+aW5pdDowIH5mOihmdW4gaSB4IC0+XG4gICAgICAgZiBpIHg7XG4gICAgICAgaSArIDEpXG4gICAgIDogaW50KVxuOztcblxubGV0IGZvbGRpIH5mb2xkIHQgfmluaXQgfmYgPVxuICBsZXQgaSA9IHJlZiAwIGluXG4gIGZvbGQgdCB+aW5pdCB+ZjooZnVuIGFjYyB2IC0+XG4gICAgbGV0IGFjYyA9IGYgIWkgYWNjIHYgaW5cbiAgICBpIDo9ICFpICsgMTtcbiAgICBhY2MpXG47O1xuXG5sZXQgY291bnRpIH5mb2xkaSB0IH5mID0gZm9sZGkgdCB+aW5pdDowIH5mOihmdW4gaSBuIGEgLT4gaWYgZiBpIGEgdGhlbiBuICsgMSBlbHNlIG4pXG5cbmxldCBleGlzdHNpIH5pdGVyaSBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlcmkgYyB+ZjooZnVuIGkgeCAtPiBpZiBmIGkgeCB0aGVuIHIucmV0dXJuIHRydWUpO1xuICAgIGZhbHNlKVxuOztcblxubGV0IGZvcl9hbGxpIH5pdGVyaSBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlcmkgYyB+ZjooZnVuIGkgeCAtPiBpZiBub3QgKGYgaSB4KSB0aGVuIHIucmV0dXJuIGZhbHNlKTtcbiAgICB0cnVlKVxuOztcblxubGV0IGZpbmRfbWFwaSB+aXRlcmkgdCB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXJpIHQgfmY6KGZ1biBpIHggLT5cbiAgICAgIG1hdGNoIGYgaSB4IHdpdGhcbiAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgfCBTb21lIF8gYXMgcmVzIC0+IHIucmV0dXJuIHJlcyk7XG4gICAgTm9uZSlcbjs7XG5cbmxldCBmaW5kaSB+aXRlcmkgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXJpIGMgfmY6KGZ1biBpIHggLT4gaWYgZiBpIHggdGhlbiByLnJldHVybiAoU29tZSAoaSwgeCkpKTtcbiAgICBOb25lKVxuOztcblxubW9kdWxlIE1ha2VfZ2VuIChUIDogc2lnXG4gICAgaW5jbHVkZSBDb250YWluZXJfaW50Zi5NYWtlX2dlbl9hcmdcblxuICAgIHZhbCBpdGVyaSA6IFsgYERlZmluZV91c2luZ19mb2xkIHwgYEN1c3RvbSBvZiAoJ2EgdCwgJ2EgZWx0KSBpdGVyaSBdXG4gICAgdmFsIGZvbGRpIDogWyBgRGVmaW5lX3VzaW5nX2ZvbGQgfCBgQ3VzdG9tIG9mICgnYSB0LCAnYSBlbHQsIF8pIGZvbGRpIF1cbiAgZW5kKSA6IEdlbmVyaWMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgVC50IHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgVC5lbHQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBDb250YWluZXIuTWFrZV9nZW4gKFQpXG5cbiAgbGV0IGl0ZXJpID1cbiAgICBtYXRjaCBULml0ZXJpIHdpdGhcbiAgICB8IGBDdXN0b20gaXRlcmkgLT4gaXRlcmlcbiAgICB8IGBEZWZpbmVfdXNpbmdfZm9sZCAtPiBmdW4gdCB+ZiAtPiBpdGVyaSB+Zm9sZCB0IH5mXG4gIDs7XG5cbiAgbGV0IGZvbGRpID1cbiAgICBtYXRjaCBULmZvbGRpIHdpdGhcbiAgICB8IGBDdXN0b20gZm9sZGkgLT4gZm9sZGlcbiAgICB8IGBEZWZpbmVfdXNpbmdfZm9sZCAtPiBmdW4gdCB+aW5pdCB+ZiAtPiBmb2xkaSB+Zm9sZCB0IH5pbml0IH5mXG4gIDs7XG5cbiAgbGV0IGNvdW50aSB0IH5mID0gY291bnRpIH5mb2xkaSB0IH5mXG4gIGxldCBleGlzdHNpIHQgfmYgPSBleGlzdHNpIH5pdGVyaSB0IH5mXG4gIGxldCBmb3JfYWxsaSB0IH5mID0gZm9yX2FsbGkgfml0ZXJpIHQgfmZcbiAgbGV0IGZpbmRfbWFwaSB0IH5mID0gZmluZF9tYXBpIH5pdGVyaSB0IH5mXG4gIGxldCBmaW5kaSB0IH5mID0gZmluZGkgfml0ZXJpIHQgfmZcbmVuZFxuXG5tb2R1bGUgTWFrZSAoVCA6IE1ha2VfYXJnKSA9IHN0cnVjdFxuICBtb2R1bGUgQyA9IENvbnRhaW5lci5NYWtlIChUKVxuXG4gICgqIE5vdCBwYXJ0IG9mIFtDb250YWluZXIuR2VuZXJpY10uICopXG4gIGxldCBtZW0gPSBDLm1lbVxuXG4gIGluY2x1ZGUgTWFrZV9nZW4gKHN0cnVjdFxuICAgICAgaW5jbHVkZSBUXG5cbiAgICAgIHR5cGUgJ2EgdCA9ICdhIFQudFxuICAgICAgdHlwZSAnYSBlbHQgPSAnYVxuICAgIGVuZClcbmVuZFxuXG5tb2R1bGUgTWFrZTAgKFQgOiBNYWtlMF9hcmcpID0gc3RydWN0XG4gIG1vZHVsZSBDID0gQ29udGFpbmVyLk1ha2UwIChUKVxuXG4gICgqIE5vdCBwYXJ0IG9mIFtDb250YWluZXIuR2VuZXJpY10uICopXG4gIGxldCBtZW0gPSBDLm1lbVxuXG4gIGluY2x1ZGUgTWFrZV9nZW4gKHN0cnVjdFxuICAgICAgaW5jbHVkZSBUXG5cbiAgICAgIHR5cGUgJ2EgdCA9IFQudFxuICAgICAgdHlwZSAnYSBlbHQgPSBULkVsdC50XG4gICAgZW5kKVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm9wZW4gQ29udGFpbmVyX2ludGYuRXhwb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbm1vZHVsZSBMaXN0ID0gTGlzdDFcblxubW9kdWxlIFN0ZXAgPSBzdHJ1Y3RcbiAgKCogJ2EgaXMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UsICdzIGlzIHRoZSBzdGF0ZSB0aGF0IHdpbGwgcHJvZHVjZSB0aGUgcmVtYWluZGVyIG9mXG4gICAgIHRoZSBzZXF1ZW5jZSAqKVxuICB0eXBlICgnYSwgJ3MpIHQgPVxuICAgIHwgRG9uZVxuICAgIHwgU2tpcCBvZiAnc1xuICAgIHwgWWllbGQgb2YgJ2EgKiAnc1xuICBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICBsZXQgc2V4cF9vZl90IDpcbiAgICAnYSAncy5cbiAgICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgncyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdhLCAncykgdFxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgID1cbiAgICBmdW4gKHR5cGUgYV9fMDA5XyBzX18wMTBfKVxuICAgICAgICA6ICAoKGFfXzAwOV8gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoc19fMDEwXyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgICAgICAtPiAoYV9fMDA5Xywgc19fMDEwXykgdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgICBmdW4gX29mX2FfXzAwMV8gX29mX3NfXzAwMl8gLT4gZnVuY3Rpb25cbiAgICAgICAgfCBEb25lIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkRvbmVcIlxuICAgICAgICB8IFNraXAgYXJnMF9fMDAzXyAtPlxuICAgICAgICAgIGxldCByZXMwX18wMDRfID0gX29mX3NfXzAwMl8gYXJnMF9fMDAzXyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlNraXBcIjsgcmVzMF9fMDA0XyBdXG4gICAgICAgIHwgWWllbGQgKGFyZzBfXzAwNV8sIGFyZzFfXzAwNl8pIC0+XG4gICAgICAgICAgbGV0IHJlczBfXzAwN18gPSBfb2ZfYV9fMDAxXyBhcmcwX18wMDVfXG4gICAgICAgICAgYW5kIHJlczFfXzAwOF8gPSBfb2Zfc19fMDAyXyBhcmcxX18wMDZfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiWWllbGRcIjsgcmVzMF9fMDA3XzsgcmVzMV9fMDA4XyBdXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5vcGVuIFN0ZXBcblxuKCogJ2EgaXMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UsICdzIGlzIHRoZSBzdGF0ZSB0aGF0IHdpbGwgcHJvZHVjZSB0aGUgcmVtYWluZGVyIG9mIHRoZVxuICAgc2VxdWVuY2UgKilcbnR5cGUgK18gdCA9IFNlcXVlbmNlIDogJ3MgKiAoJ3MgLT4gKCdhLCAncykgU3RlcC50KSAtPiAnYSB0XG50eXBlICdhIHNlcXVlbmNlID0gJ2EgdFxuXG5tb2R1bGUgRXhwZXJ0ID0gc3RydWN0XG4gIGxldCBuZXh0X3N0ZXAgKFNlcXVlbmNlIChzLCBmKSkgPVxuICAgIG1hdGNoIGYgcyB3aXRoXG4gICAgfCBEb25lIC0+IERvbmVcbiAgICB8IFNraXAgcyAtPiBTa2lwIChTZXF1ZW5jZSAocywgZikpXG4gICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIFNlcXVlbmNlIChzLCBmKSlcbiAgOztcblxuICBsZXQgZGVsYXllZF9mb2xkX3N0ZXAgcyB+aW5pdCB+ZiB+ZmluaXNoID1cbiAgICBsZXQgcmVjIGxvb3AgcyBuZXh0IGZpbmlzaCBmIGFjYyA9XG4gICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgfCBEb25lIC0+IGZpbmlzaCBhY2NcbiAgICAgIHwgU2tpcCBzIC0+IGYgYWNjIE5vbmUgfms6KGxvb3AgcyBuZXh0IGZpbmlzaCBmKVxuICAgICAgfCBZaWVsZCAoYSwgcykgLT4gZiBhY2MgKFNvbWUgYSkgfms6KGxvb3AgcyBuZXh0IGZpbmlzaCBmKVxuICAgIGluXG4gICAgbWF0Y2ggcyB3aXRoXG4gICAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG5leHQgZmluaXNoIGYgaW5pdFxuICA7O1xuZW5kXG5cbmxldCB1bmZvbGRfc3RlcCB+aW5pdCB+ZiA9IFNlcXVlbmNlIChpbml0LCBmKVxuXG5sZXQgdW5mb2xkIH5pbml0IH5mID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQgfmY6KGZ1biBzIC0+XG4gICAgbWF0Y2ggZiBzIHdpdGhcbiAgICB8IE5vbmUgLT4gU3RlcC5Eb25lXG4gICAgfCBTb21lIChhLCBzKSAtPiBTdGVwLllpZWxkIChhLCBzKSlcbjs7XG5cbmxldCB1bmZvbGRfd2l0aCBzIH5pbml0IH5mID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggKGluaXQsIHMpXG4gICAgICAsIGZ1biAoc2VlZCwgcykgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoc2VlZCwgcylcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgICAgICAobWF0Y2ggZiBzZWVkIGEgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgc2VlZCAtPiBTa2lwIChzZWVkLCBzKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzZWVkKSAtPiBZaWVsZCAoYSwgKHNlZWQsIHMpKSkgKVxuOztcblxubGV0IHVuZm9sZF93aXRoX2FuZF9maW5pc2ggcyB+aW5pdCB+cnVubmluZ19zdGVwIH5pbm5lcl9maW5pc2hlZCB+ZmluaXNoaW5nX3N0ZXAgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBgSW5uZXJfcnVubmluZyAoaW5pdCwgcylcbiAgICAgICwgZnVuIHN0YXRlIC0+XG4gICAgICAgIG1hdGNoIHN0YXRlIHdpdGhcbiAgICAgICAgfCBgSW5uZXJfcnVubmluZyAoc3RhdGUsIGlubmVyX3N0YXRlKSAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0IGlubmVyX3N0YXRlIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IFNraXAgKGBJbm5lcl9maW5pc2hlZCAoaW5uZXJfZmluaXNoZWQgc3RhdGUpKVxuICAgICAgICAgICB8IFNraXAgaW5uZXJfc3RhdGUgLT4gU2tpcCAoYElubmVyX3J1bm5pbmcgKHN0YXRlLCBpbm5lcl9zdGF0ZSkpXG4gICAgICAgICAgIHwgWWllbGQgKHgsIGlubmVyX3N0YXRlKSAtPlxuICAgICAgICAgICAgIChtYXRjaCBydW5uaW5nX3N0ZXAgc3RhdGUgeCB3aXRoXG4gICAgICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgICAgIHwgU2tpcCBzdGF0ZSAtPiBTa2lwIChgSW5uZXJfcnVubmluZyAoc3RhdGUsIGlubmVyX3N0YXRlKSlcbiAgICAgICAgICAgICAgfCBZaWVsZCAoeSwgc3RhdGUpIC0+IFlpZWxkICh5LCBgSW5uZXJfcnVubmluZyAoc3RhdGUsIGlubmVyX3N0YXRlKSkpKVxuICAgICAgICB8IGBJbm5lcl9maW5pc2hlZCBzdGF0ZSAtPlxuICAgICAgICAgIChtYXRjaCBmaW5pc2hpbmdfc3RlcCBzdGF0ZSB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzdGF0ZSAtPiBTa2lwIChgSW5uZXJfZmluaXNoZWQgc3RhdGUpXG4gICAgICAgICAgIHwgWWllbGQgKHksIHN0YXRlKSAtPiBZaWVsZCAoeSwgYElubmVyX2ZpbmlzaGVkIHN0YXRlKSkgKVxuOztcblxubGV0IG9mX2xpc3QgbCA9XG4gIHVuZm9sZF9zdGVwIH5pbml0OmwgfmY6KGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBEb25lXG4gICAgfCB4IDo6IGwgLT4gWWllbGQgKHgsIGwpKVxuOztcblxuXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgbGV0IHJlYyBsb29wIHNlZWQgdiBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgfCBEb25lIC0+IHZcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgdiBuZXh0IGZcbiAgICB8IFlpZWxkIChhLCBzKSAtPiBsb29wIHMgKGYgdiBhKSBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBpbml0IG5leHQgZlxuOztcblxubGV0IHRvX2xpc3RfcmV2IHQgPSBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biBsIHggLT4geCA6OiBsKVxuXG5cbmxldCB0b19saXN0IChTZXF1ZW5jZSAocywgbmV4dCkpID1cbiAgbGV0IHNhZmVfdG9fbGlzdCB0ID0gTGlzdC5yZXYgKHRvX2xpc3RfcmV2IHQpIGluXG4gIGxldCByZWMgdG9fbGlzdCBzIG5leHQgaSA9XG4gICAgaWYgaSA9IDBcbiAgICB0aGVuIHNhZmVfdG9fbGlzdCAoU2VxdWVuY2UgKHMsIG5leHQpKVxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBbXVxuICAgICAgfCBTa2lwIHMgLT4gdG9fbGlzdCBzIG5leHQgaVxuICAgICAgfCBZaWVsZCAoYSwgcykgLT4gYSA6OiB0b19saXN0IHMgbmV4dCAoaSAtIDEpKVxuICBpblxuICB0b19saXN0IHMgbmV4dCA1MDBcbjs7XG5cbmxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPSBzZXhwX29mX2xpc3Qgc2V4cF9vZl9hICh0b19saXN0IHQpXG5cbmxldCByYW5nZSA/KHN0cmlkZSA9IDEpID8oc3RhcnQgPSBgaW5jbHVzaXZlKSA/KHN0b3AgPSBgZXhjbHVzaXZlKSBzdGFydF92IHN0b3BfdiA9XG4gIGxldCBzdGVwID1cbiAgICBtYXRjaCBzdG9wIHdpdGhcbiAgICB8IGBpbmNsdXNpdmUgd2hlbiBzdHJpZGUgPj0gMCAtPlxuICAgICAgZnVuIGkgLT4gaWYgaSA+IHN0b3BfdiB0aGVuIERvbmUgZWxzZSBZaWVsZCAoaSwgaSArIHN0cmlkZSlcbiAgICB8IGBpbmNsdXNpdmUgLT4gZnVuIGkgLT4gaWYgaSA8IHN0b3BfdiB0aGVuIERvbmUgZWxzZSBZaWVsZCAoaSwgaSArIHN0cmlkZSlcbiAgICB8IGBleGNsdXNpdmUgd2hlbiBzdHJpZGUgPj0gMCAtPlxuICAgICAgZnVuIGkgLT4gaWYgaSA+PSBzdG9wX3YgdGhlbiBEb25lIGVsc2UgWWllbGQgKGksIGkgKyBzdHJpZGUpXG4gICAgfCBgZXhjbHVzaXZlIC0+IGZ1biBpIC0+IGlmIGkgPD0gc3RvcF92IHRoZW4gRG9uZSBlbHNlIFlpZWxkIChpLCBpICsgc3RyaWRlKVxuICBpblxuICBsZXQgaW5pdCA9XG4gICAgbWF0Y2ggc3RhcnQgd2l0aFxuICAgIHwgYGluY2x1c2l2ZSAtPiBzdGFydF92XG4gICAgfCBgZXhjbHVzaXZlIC0+IHN0YXJ0X3YgKyBzdHJpZGVcbiAgaW5cbiAgdW5mb2xkX3N0ZXAgfmluaXQgfmY6c3RlcFxuOztcblxubGV0IG9mX2xhenkgdF9sYXp5ID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQ6dF9sYXp5IH5mOihmdW4gdF9sYXp5IC0+XG4gICAgbGV0IChTZXF1ZW5jZSAocywgbmV4dCkpID0gTGF6eS5mb3JjZSB0X2xhenkgaW5cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBEb25lXG4gICAgfCBTa2lwIHMgLT5cbiAgICAgIFNraXBcbiAgICAgICAgKGxldCB2ID0gU2VxdWVuY2UgKHMsIG5leHQpIGluXG4gICAgICAgICBsYXp5IHYpXG4gICAgfCBZaWVsZCAoeCwgcykgLT5cbiAgICAgIFlpZWxkXG4gICAgICAgICggeFxuICAgICAgICAsIGxldCB2ID0gU2VxdWVuY2UgKHMsIG5leHQpIGluXG4gICAgICAgICAgbGF6eSB2ICkpXG47O1xuXG5sZXQgbWFwIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBzZWVkXG4gICAgICAsIGZ1biBzZWVkIC0+XG4gICAgICAgIG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgc1xuICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoZiBhLCBzKSApXG47O1xuXG5sZXQgbWFwaSB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggKDAsIHMpXG4gICAgICAsIGZ1biAoaSwgcykgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoaSwgcylcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGYgaSBhLCAoaSArIDEsIHMpKSApXG47O1xuXG5sZXQgZm9sZGluZ19tYXAgdCB+aW5pdCB+ZiA9XG4gIHVuZm9sZF93aXRoIHQgfmluaXQgfmY6KGZ1biBhY2MgeCAtPlxuICAgIGxldCBhY2MsIHggPSBmIGFjYyB4IGluXG4gICAgWWllbGQgKHgsIGFjYykpXG47O1xuXG5sZXQgZm9sZGluZ19tYXBpIHQgfmluaXQgfmYgPVxuICB1bmZvbGRfd2l0aCB0IH5pbml0OigwLCBpbml0KSB+ZjooZnVuIChpLCBhY2MpIHggLT5cbiAgICBsZXQgYWNjLCB4ID0gZiBpIGFjYyB4IGluXG4gICAgWWllbGQgKHgsIChpICsgMSwgYWNjKSkpXG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBzZWVkXG4gICAgICAsIGZ1biBzZWVkIC0+XG4gICAgICAgIG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgc1xuICAgICAgICB8IFlpZWxkIChhLCBzKSB3aGVuIGYgYSAtPiBZaWVsZCAoYSwgcylcbiAgICAgICAgfCBZaWVsZCAoXywgcykgLT4gU2tpcCBzIClcbjs7XG5cbmxldCBmaWx0ZXJpIHQgfmYgPVxuICBtYXAgfmY6c25kIChmaWx0ZXIgKG1hcGkgdCB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biAoaSwgcykgLT4gZiBpIHMpKVxuOztcblxubGV0IGxlbmd0aCB0ID1cbiAgbGV0IHJlYyBsb29wIGkgcyBuZXh0ID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBpIHMgbmV4dFxuICAgIHwgWWllbGQgKF8sIHMpIC0+IGxvb3AgKGkgKyAxKSBzIG5leHRcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3AgMCBzZWVkIG5leHRcbjs7XG5cbmxldCB0b19saXN0X3Jldl93aXRoX2xlbmd0aCB0ID0gZm9sZCB0IH5pbml0OihbXSwgMCkgfmY6KGZ1biAobCwgaSkgeCAtPiB4IDo6IGwsIGkgKyAxKVxuXG5sZXQgdG9fYXJyYXkgdCA9XG4gIGxldCBsLCBsZW4gPSB0b19saXN0X3Jldl93aXRoX2xlbmd0aCB0IGluXG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFt8fF1cbiAgfCB4IDo6IGwgLT5cbiAgICBsZXQgYSA9IEFycmF5LmNyZWF0ZSB+bGVuIHggaW5cbiAgICBsZXQgcmVjIGxvb3AgaSBsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiBhc3NlcnQgKGkgPSAtMSlcbiAgICAgIHwgeCA6OiBsIC0+XG4gICAgICAgIGEuKGkpIDwtIHg7XG4gICAgICAgIGxvb3AgKGkgLSAxKSBsXG4gICAgaW5cbiAgICBsb29wIChsZW4gLSAyKSBsO1xuICAgIGFcbjs7XG5cbmxldCBmaW5kIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFlpZWxkIChhLCBfKSB3aGVuIGYgYSAtPiBTb21lIGFcbiAgICB8IFlpZWxkIChfLCBzKSB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmXG47O1xuXG5sZXQgZmluZF9tYXAgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAobWF0Y2ggZiBhIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gbG9vcCBzIG5leHQgZlxuICAgICAgIHwgc29tZV9iIC0+IHNvbWVfYilcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmXG47O1xuXG5cbmxldCBmaW5kX21hcGkgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiBpID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIChtYXRjaCBmIGkgYSB3aXRoXG4gICAgICAgfCBOb25lIC0+IGxvb3AgcyBuZXh0IGYgKGkgKyAxKVxuICAgICAgIHwgc29tZV9iIC0+IHNvbWVfYilcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmIGlcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGYgMFxuOztcblxubGV0IGZvcl9hbGwgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gdHJ1ZVxuICAgIHwgWWllbGQgKGEsIF8pIHdoZW4gbm90IChmIGEpIC0+IGZhbHNlXG4gICAgfCBZaWVsZCAoXywgcykgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZlxuOztcblxubGV0IGZvcl9hbGxpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgaSA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gdHJ1ZVxuICAgIHwgWWllbGQgKGEsIF8pIHdoZW4gbm90IChmIGkgYSkgLT4gZmFsc2VcbiAgICB8IFlpZWxkIChfLCBzKSAtPiBsb29wIHMgbmV4dCBmIChpICsgMSlcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmIGlcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGYgMFxuOztcblxubGV0IGV4aXN0cyB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBmYWxzZVxuICAgIHwgWWllbGQgKGEsIF8pIHdoZW4gZiBhIC0+IHRydWVcbiAgICB8IFlpZWxkIChfLCBzKSB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmXG47O1xuXG5sZXQgZXhpc3RzaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmIGkgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IGZhbHNlXG4gICAgfCBZaWVsZCAoYSwgXykgd2hlbiBmIGkgYSAtPiB0cnVlXG4gICAgfCBZaWVsZCAoXywgcykgLT4gbG9vcCBzIG5leHQgZiAoaSArIDEpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZiBpXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmIDBcbjs7XG5cbmxldCBpdGVyIHQgfmYgPVxuICBsZXQgcmVjIGxvb3Agc2VlZCBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgfCBEb25lIC0+ICgpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZlxuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICBmIGE7XG4gICAgICBsb29wIHMgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmXG47O1xuXG5sZXQgaXNfZW1wdHkgdCA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IHRydWVcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dFxuICAgIHwgWWllbGQgXyAtPiBmYWxzZVxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHRcbjs7XG5cbmxldCBtZW0gdCBhIH5lcXVhbCA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgYSA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gZmFsc2VcbiAgICB8IFlpZWxkIChiLCBfKSB3aGVuIGVxdWFsIGEgYiAtPiB0cnVlXG4gICAgfCBZaWVsZCAoXywgcykgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgYVxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgYVxuOztcblxubGV0IGVtcHR5ID0gU2VxdWVuY2UgKCgpLCBmdW4gKCkgLT4gRG9uZSlcblxubGV0IGJpbmQgdCB+ZiA9XG4gIHVuZm9sZF9zdGVwXG4gICAgfmY6KGZ1bmN0aW9uXG4gICAgICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSwgcmVzdCAtPlxuICAgICAgICAobWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICAgICAgIHwgRG9uZSAtPlxuICAgICAgICAgICAobWF0Y2ggcmVzdCB3aXRoXG4gICAgICAgICAgICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPlxuICAgICAgICAgICAgICAobWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICAgICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChlbXB0eSwgU2VxdWVuY2UgKHMsIG5leHQpKVxuICAgICAgICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gU2tpcCAoZiBhLCBTZXF1ZW5jZSAocywgbmV4dCkpKSlcbiAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKFNlcXVlbmNlIChzLCBuZXh0KSwgcmVzdClcbiAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCAoU2VxdWVuY2UgKHMsIG5leHQpLCByZXN0KSkpKVxuICAgIH5pbml0OihlbXB0eSwgdClcbjs7XG5cbmxldCByZXR1cm4geCA9XG4gIHVuZm9sZF9zdGVwIH5pbml0OihTb21lIHgpIH5mOihmdW5jdGlvblxuICAgIHwgTm9uZSAtPiBEb25lXG4gICAgfCBTb21lIHggLT4gWWllbGQgKHgsIE5vbmUpKVxuOztcblxuaW5jbHVkZSBNb25hZC5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuICBlbmQpXG5cbmxldCBudGggcyBuID1cbiAgaWYgbiA8IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCByZWMgbG9vcCBpIHMgbmV4dCA9XG4gICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgfCBEb25lIC0+IE5vbmVcbiAgICAgIHwgU2tpcCBzIC0+IGxvb3AgaSBzIG5leHRcbiAgICAgIHwgWWllbGQgKGEsIHMpIC0+IGlmIHBoeXNfZXF1YWwgaSAwIHRoZW4gU29tZSBhIGVsc2UgbG9vcCAoaSAtIDEpIHMgbmV4dFxuICAgIGluXG4gICAgbWF0Y2ggcyB3aXRoXG4gICAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBuIHMgbmV4dClcbjs7XG5cbmxldCBudGhfZXhuIHMgbiA9XG4gIGlmIG4gPCAwXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTZXF1ZW5jZS5udGhcIlxuICBlbHNlIChcbiAgICBtYXRjaCBudGggcyBuIHdpdGhcbiAgICB8IE5vbmUgLT4gZmFpbHdpdGggXCJTZXF1ZW5jZS5udGhcIlxuICAgIHwgU29tZSB4IC0+IHgpXG47O1xuXG5tb2R1bGUgTWVyZ2Vfd2l0aF9kdXBsaWNhdGVzX2VsZW1lbnQgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiKSB0ID1cbiAgICB8IExlZnQgb2YgJ2FcbiAgICB8IFJpZ2h0IG9mICdiXG4gICAgfCBCb3RoIG9mICdhICogJ2JcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA6XG4gICAgJ2EgJ2IuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICgnYiAtPiAnYiAtPiBpbnQpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBpbnRcbiAgICA9XG4gICAgZnVuIF9jbXBfX2EgX2NtcF9fYiBhX18wMTFfIGJfXzAxMl8gLT5cbiAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMTFfIGJfXzAxMl9cbiAgICB0aGVuIDBcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGFfXzAxMV8sIGJfXzAxMl8gd2l0aFxuICAgICAgfCBMZWZ0IF9hX18wMTNfLCBMZWZ0IF9iX18wMTRfIC0+IF9jbXBfX2EgX2FfXzAxM18gX2JfXzAxNF9cbiAgICAgIHwgTGVmdCBfLCBfIC0+IC0xXG4gICAgICB8IF8sIExlZnQgXyAtPiAxXG4gICAgICB8IFJpZ2h0IF9hX18wMTVfLCBSaWdodCBfYl9fMDE2XyAtPiBfY21wX19iIF9hX18wMTVfIF9iX18wMTZfXG4gICAgICB8IFJpZ2h0IF8sIF8gLT4gLTFcbiAgICAgIHwgXywgUmlnaHQgXyAtPiAxXG4gICAgICB8IEJvdGggKF9hX18wMTdfLCBfYV9fMDE5XyksIEJvdGggKF9iX18wMThfLCBfYl9fMDIwXykgLT5cbiAgICAgICAgKG1hdGNoIF9jbXBfX2EgX2FfXzAxN18gX2JfXzAxOF8gd2l0aFxuICAgICAgICAgfCAwIC0+IF9jbXBfX2IgX2FfXzAxOV8gX2JfXzAyMF9cbiAgICAgICAgIHwgbiAtPiBuKSlcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX3RcbiAgICA6IHR5cGUgYSBiLlxuICAgICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAgIC0+IChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gYiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAgIC0+IChhLCBiKSB0XG4gICAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICA9XG4gICAgZnVuIF9oYXNoX2ZvbGRfYSBfaGFzaF9mb2xkX2IgaHN2IGFyZyAtPlxuICAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgIHwgTGVmdCBfYTAgLT5cbiAgICAgICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMCBpblxuICAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgIF9oYXNoX2ZvbGRfYSBoc3YgX2EwXG4gICAgICB8IFJpZ2h0IF9hMCAtPlxuICAgICAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxIGluXG4gICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICAgX2hhc2hfZm9sZF9iIGhzdiBfYTBcbiAgICAgIHwgQm90aCAoX2EwLCBfYTEpIC0+XG4gICAgICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDIgaW5cbiAgICAgICAgbGV0IGhzdiA9XG4gICAgICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgICAgIF9oYXNoX2ZvbGRfYSBoc3YgX2EwXG4gICAgICAgIGluXG4gICAgICAgIF9oYXNoX2ZvbGRfYiBoc3YgX2ExXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA6XG4gICAgJ2EgJ2IuXG4gICAgKFNleHBsaWIwLlNleHAudCAtPiAnYSlcbiAgICAtPiAoU2V4cGxpYjAuU2V4cC50IC0+ICdiKVxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICA9XG4gICAgZnVuICh0eXBlIGFfXzA0NF8gYl9fMDQ1XylcbiAgICAgICAgOiAgKChTZXhwbGliMC5TZXhwLnQgLT4gYV9fMDQ0XykgLT4gKFNleHBsaWIwLlNleHAudCAtPiBiX18wNDVfKVxuICAgICAgICAgICAgLT4gU2V4cGxpYjAuU2V4cC50IC0+IChhX18wNDRfLCBiX18wNDVfKSB0KSAtPlxuICAgICAgbGV0IGVycm9yX3NvdXJjZV9fMDI1XyA9IFwic2VxdWVuY2UubWwuTWVyZ2Vfd2l0aF9kdXBsaWNhdGVzX2VsZW1lbnQudFwiIGluXG4gICAgICBmdW4gX29mX2FfXzAyMV8gX29mX2JfXzAyMl8gLT4gZnVuY3Rpb25cbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImxlZnRcIiB8IFwiTGVmdFwiKSBhcyBfdGFnX18wMjhfKSA6OiBzZXhwX2FyZ3NfXzAyOV8pIGFzXG4gICAgICAgICAgX3NleHBfXzAyN18gLT5cbiAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMjlfIHdpdGhcbiAgICAgICAgICAgfCBbIGFyZzBfXzAzMF8gXSAtPlxuICAgICAgICAgICAgIGxldCByZXMwX18wMzFfID0gX29mX2FfXzAyMV8gYXJnMF9fMDMwXyBpblxuICAgICAgICAgICAgIExlZnQgcmVzMF9fMDMxX1xuICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAyNV9cbiAgICAgICAgICAgICAgIF90YWdfXzAyOF9cbiAgICAgICAgICAgICAgIF9zZXhwX18wMjdfKVxuICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwicmlnaHRcIiB8IFwiUmlnaHRcIikgYXMgX3RhZ19fMDMzXykgOjogc2V4cF9hcmdzX18wMzRfKSBhc1xuICAgICAgICAgIF9zZXhwX18wMzJfIC0+XG4gICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDM0XyB3aXRoXG4gICAgICAgICAgIHwgWyBhcmcwX18wMzVfIF0gLT5cbiAgICAgICAgICAgICBsZXQgcmVzMF9fMDM2XyA9IF9vZl9iX18wMjJfIGFyZzBfXzAzNV8gaW5cbiAgICAgICAgICAgICBSaWdodCByZXMwX18wMzZfXG4gICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDI1X1xuICAgICAgICAgICAgICAgX3RhZ19fMDMzX1xuICAgICAgICAgICAgICAgX3NleHBfXzAzMl8pXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJib3RoXCIgfCBcIkJvdGhcIikgYXMgX3RhZ19fMDM4XykgOjogc2V4cF9hcmdzX18wMzlfKSBhc1xuICAgICAgICAgIF9zZXhwX18wMzdfIC0+XG4gICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDM5XyB3aXRoXG4gICAgICAgICAgIHwgWyBhcmcwX18wNDBfOyBhcmcxX18wNDFfIF0gLT5cbiAgICAgICAgICAgICBsZXQgcmVzMF9fMDQyXyA9IF9vZl9hX18wMjFfIGFyZzBfXzA0MF9cbiAgICAgICAgICAgICBhbmQgcmVzMV9fMDQzXyA9IF9vZl9iX18wMjJfIGFyZzFfXzA0MV8gaW5cbiAgICAgICAgICAgICBCb3RoIChyZXMwX18wNDJfLCByZXMxX18wNDNfKVxuICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAyNV9cbiAgICAgICAgICAgICAgIF90YWdfXzAzOF9cbiAgICAgICAgICAgICAgIF9zZXhwX18wMzdfKVxuICAgICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJsZWZ0XCIgfCBcIkxlZnRcIikgYXMgc2V4cF9fMDI2XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNl9cbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwicmlnaHRcIiB8IFwiUmlnaHRcIikgYXMgc2V4cF9fMDI2XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNl9cbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiYm90aFwiIHwgXCJCb3RoXCIpIGFzIHNleHBfXzAyNl8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjZfXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMjRfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjRfXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAyNF8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI0X1xuICAgICAgICB8IHNleHBfXzAyNF8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjRfXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6XG4gICAgJ2EgJ2IuXG4gICAgKCdhIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2IgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICA9XG4gICAgZnVuICh0eXBlIGFfXzA1Nl8gYl9fMDU3XylcbiAgICAgICAgOiAgKChhX18wNTZfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKGJfXzA1N18gLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAgICAgLT4gKGFfXzA1Nl8sIGJfXzA1N18pIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgICAgZnVuIF9vZl9hX18wNDZfIF9vZl9iX18wNDdfIC0+IGZ1bmN0aW9uXG4gICAgICAgIHwgTGVmdCBhcmcwX18wNDhfIC0+XG4gICAgICAgICAgbGV0IHJlczBfXzA0OV8gPSBfb2ZfYV9fMDQ2XyBhcmcwX18wNDhfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiTGVmdFwiOyByZXMwX18wNDlfIF1cbiAgICAgICAgfCBSaWdodCBhcmcwX18wNTBfIC0+XG4gICAgICAgICAgbGV0IHJlczBfXzA1MV8gPSBfb2ZfYl9fMDQ3XyBhcmcwX18wNTBfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiUmlnaHRcIjsgcmVzMF9fMDUxXyBdXG4gICAgICAgIHwgQm90aCAoYXJnMF9fMDUyXywgYXJnMV9fMDUzXykgLT5cbiAgICAgICAgICBsZXQgcmVzMF9fMDU0XyA9IF9vZl9hX18wNDZfIGFyZzBfXzA1Ml9cbiAgICAgICAgICBhbmQgcmVzMV9fMDU1XyA9IF9vZl9iX18wNDdfIGFyZzFfXzA1M18gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJCb3RoXCI7IHJlczBfXzA1NF87IHJlczFfXzA1NV8gXVxuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOlxuICAgICAgICAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAnYiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICgnYSwgJ2IpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIF8nYl9zZXhwX2dyYW1tYXIgLT5cbiAgICAgIHsgdW50eXBlZCA9XG4gICAgICAgICAgVmFyaWFudFxuICAgICAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgICBbIE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkxlZnRcIlxuICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiQm90aFwiXG4gICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhcmdzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBDb25zIChfJ2Jfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbmxldCBtZXJnZV93aXRoX2R1cGxpY2F0ZXMgKFNlcXVlbmNlIChzMSwgbmV4dDEpKSAoU2VxdWVuY2UgKHMyLCBuZXh0MikpIH5jb21wYXJlID1cbiAgbGV0IHVuc2hhZG93ZWRfY29tcGFyZSA9IGNvbXBhcmUgaW5cbiAgbGV0IG9wZW4gTWVyZ2Vfd2l0aF9kdXBsaWNhdGVzX2VsZW1lbnQgaW5cbiAgbGV0IG5leHQgPSBmdW5jdGlvblxuICAgIHwgU2tpcCBzMSwgczIgLT4gU2tpcCAobmV4dDEgczEsIHMyKVxuICAgIHwgczEsIFNraXAgczIgLT4gU2tpcCAoczEsIG5leHQyIHMyKVxuICAgIHwgKFlpZWxkIChhLCBzMScpIGFzIHMxKSwgKFlpZWxkIChiLCBzMicpIGFzIHMyKSAtPlxuICAgICAgbGV0IGNvbXBhcmlzb24gPSB1bnNoYWRvd2VkX2NvbXBhcmUgYSBiIGluXG4gICAgICBpZiBjb21wYXJpc29uIDwgMFxuICAgICAgdGhlbiBZaWVsZCAoTGVmdCBhLCAoU2tpcCBzMScsIHMyKSlcbiAgICAgIGVsc2UgaWYgY29tcGFyaXNvbiA9IDBcbiAgICAgIHRoZW4gWWllbGQgKEJvdGggKGEsIGIpLCAoU2tpcCBzMScsIFNraXAgczInKSlcbiAgICAgIGVsc2UgWWllbGQgKFJpZ2h0IGIsIChzMSwgU2tpcCBzMicpKVxuICAgIHwgRG9uZSwgRG9uZSAtPiBEb25lXG4gICAgfCBZaWVsZCAoYSwgczEpLCBEb25lIC0+IFlpZWxkIChMZWZ0IGEsIChTa2lwIHMxLCBEb25lKSlcbiAgICB8IERvbmUsIFlpZWxkIChiLCBzMikgLT4gWWllbGQgKFJpZ2h0IGIsIChEb25lLCBTa2lwIHMyKSlcbiAgaW5cbiAgU2VxdWVuY2UgKChTa2lwIHMxLCBTa2lwIHMyKSwgbmV4dClcbjs7XG5cbmxldCBtZXJnZV9kZWR1cGVkX2FuZF9zb3J0ZWQgczEgczIgfmNvbXBhcmUgPVxuICBtYXAgKG1lcmdlX3dpdGhfZHVwbGljYXRlcyBzMSBzMiB+Y29tcGFyZSkgfmY6KGZ1bmN0aW9uXG4gICAgfCBMZWZ0IHggfCBSaWdodCB4IHwgQm90aCAoeCwgXykgLT4geClcbjs7XG5cbmxldCAobWVyZ2UgW0BkZXByZWNhdGVkXG4gICAgICAgXCJbc2luY2UgMjAyMS0wN10gRm9yIGlkZW50aWNhbCBiZWhhdmlvciwgdXNlIFxcXG4gICAgICAgIFtTZXF1ZW5jZS5tZXJnZV9kZWR1cGVkX2FuZF9zb3J0ZWRdLCBidXQgY29uc2lkZXIgdXNpbmcgXFxcbiAgICAgICAgW1NlcXVlbmNlLm1lcmdlX3NvcnRlZF0gaW5zdGVhZC5cIl0pXG4gID1cbiAgbWVyZ2VfZGVkdXBlZF9hbmRfc29ydGVkXG47O1xuXG5sZXQgbWVyZ2Vfc29ydGVkIChTZXF1ZW5jZSAoczEsIG5leHQxKSkgKFNlcXVlbmNlIChzMiwgbmV4dDIpKSB+Y29tcGFyZSA9XG4gIGxldCBuZXh0ID0gZnVuY3Rpb25cbiAgICB8IFNraXAgczEsIHMyIC0+IFNraXAgKG5leHQxIHMxLCBzMilcbiAgICB8IHMxLCBTa2lwIHMyIC0+IFNraXAgKHMxLCBuZXh0MiBzMilcbiAgICB8IChZaWVsZCAoYSwgczEnKSBhcyBzMSksIChZaWVsZCAoYiwgczInKSBhcyBzMikgLT5cbiAgICAgIGxldCBjb21wYXJpc29uID0gY29tcGFyZSBhIGIgaW5cbiAgICAgIGlmIGNvbXBhcmlzb24gPD0gMCB0aGVuIFlpZWxkIChhLCAoU2tpcCBzMScsIHMyKSkgZWxzZSBZaWVsZCAoYiwgKHMxLCBTa2lwIHMyJykpXG4gICAgfCBEb25lLCBEb25lIC0+IERvbmVcbiAgICB8IFlpZWxkIChhLCBzMSksIERvbmUgLT4gWWllbGQgKGEsIChTa2lwIHMxLCBEb25lKSlcbiAgICB8IERvbmUsIFlpZWxkIChiLCBzMikgLT4gWWllbGQgKGIsIChEb25lLCBTa2lwIHMyKSlcbiAgaW5cbiAgU2VxdWVuY2UgKChTa2lwIHMxLCBTa2lwIHMyKSwgbmV4dClcbjs7XG5cbmxldCBoZCBzID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0XG4gICAgfCBZaWVsZCAoYSwgXykgLT4gU29tZSBhXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbmV4dFxuOztcblxubGV0IGhkX2V4biBzID1cbiAgbWF0Y2ggaGQgcyB3aXRoXG4gIHwgTm9uZSAtPiBmYWlsd2l0aCBcImhkX2V4blwiXG4gIHwgU29tZSBhIC0+IGFcbjs7XG5cbmxldCB0bCBzID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0XG4gICAgfCBZaWVsZCAoXywgYSkgLT4gU29tZSBhXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIChtYXRjaCBsb29wIHMgbmV4dCB3aXRoXG4gICAgIHwgTm9uZSAtPiBOb25lXG4gICAgIHwgU29tZSBzIC0+IFNvbWUgKFNlcXVlbmNlIChzLCBuZXh0KSkpXG47O1xuXG5sZXQgdGxfZWFnZXJseV9leG4gcyA9XG4gIG1hdGNoIHRsIHMgd2l0aFxuICB8IE5vbmUgLT4gZmFpbHdpdGggXCJTZXF1ZW5jZS50bF9leG5cIlxuICB8IFNvbWUgcyAtPiBzXG47O1xuXG5sZXQgbGlmdF9pZGVudGl0eSBuZXh0IHMgPVxuICBtYXRjaCBuZXh0IHMgd2l0aFxuICB8IERvbmUgLT4gRG9uZVxuICB8IFNraXAgcyAtPiBTa2lwIChgSWRlbnRpdHkgcylcbiAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIGBJZGVudGl0eSBzKVxuOztcblxubGV0IG5leHQgcyA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dFxuICAgIHwgWWllbGQgKGEsIHMpIC0+IFNvbWUgKGEsIFNlcXVlbmNlIChzLCBuZXh0KSlcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuZXh0XG47O1xuXG5sZXQgZmlsdGVyX29wdCBzID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggc1xuICAgICAgLCBmdW4gcyAtPlxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIHNcbiAgICAgICAgfCBZaWVsZCAoTm9uZSwgcykgLT4gU2tpcCBzXG4gICAgICAgIHwgWWllbGQgKFNvbWUgYSwgcykgLT4gWWllbGQgKGEsIHMpIClcbjs7XG5cbmxldCBmaWx0ZXJfbWFwIHMgfmYgPSBmaWx0ZXJfb3B0IChtYXAgcyB+ZilcbmxldCBmaWx0ZXJfbWFwaSBzIH5mID0gZmlsdGVyX21hcCAobWFwaSBzIH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIChpLCBzKSAtPiBmIGkgcylcblxubGV0IHNwbGl0X24gcyBuID1cbiAgbGV0IHJlYyBsb29wIHMgaSBhY2N1bSBuZXh0ID1cbiAgICBpZiBpIDw9IDBcbiAgICB0aGVuIExpc3QucmV2IGFjY3VtLCBTZXF1ZW5jZSAocywgbmV4dClcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICB8IERvbmUgLT4gTGlzdC5yZXYgYWNjdW0sIGVtcHR5XG4gICAgICB8IFNraXAgcyAtPiBsb29wIHMgaSBhY2N1bSBuZXh0XG4gICAgICB8IFlpZWxkIChhLCBzKSAtPiBsb29wIHMgKGkgLSAxKSAoYSA6OiBhY2N1bSkgbmV4dClcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuIFtdIG5leHRcbjs7XG5cbmxldCBjaHVua3NfZXhuIHQgbiA9XG4gIGlmIG4gPD0gMFxuICB0aGVuIGludmFsaWRfYXJnIFwiU2VxdWVuY2UuY2h1bmtzX2V4blwiXG4gIGVsc2VcbiAgICB1bmZvbGRfc3RlcCB+aW5pdDp0IH5mOihmdW4gdCAtPlxuICAgICAgbWF0Y2ggc3BsaXRfbiB0IG4gd2l0aFxuICAgICAgfCBbXSwgX2VtcHR5IC0+IERvbmVcbiAgICAgIHwgKF8gOjogXyBhcyB4cyksIHQgLT4gWWllbGQgKHhzLCB0KSlcbjs7XG5cbmxldCBmaW5kaSBzIH5mID0gZmluZCAobWFwaSBzIH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIChpLCBzKSAtPiBmIGkgcylcblxubGV0IGZpbmRfZXhuIHMgfmYgPVxuICBtYXRjaCBmaW5kIHMgfmYgd2l0aFxuICB8IE5vbmUgLT4gZmFpbHdpdGggXCJTZXF1ZW5jZS5maW5kX2V4blwiXG4gIHwgU29tZSB4IC0+IHhcbjs7XG5cbmxldCBhcHBlbmQgczEgczIgPVxuICBtYXRjaCBzMSwgczIgd2l0aFxuICB8IFNlcXVlbmNlIChzMSwgbmV4dDEpLCBTZXF1ZW5jZSAoczIsIG5leHQyKSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIGBGaXJzdF9saXN0IHMxXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgYEZpcnN0X2xpc3QgczEgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dDEgczEgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gU2tpcCAoYFNlY29uZF9saXN0IHMyKVxuICAgICAgICAgICB8IFNraXAgczEgLT4gU2tpcCAoYEZpcnN0X2xpc3QgczEpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMxKSAtPiBZaWVsZCAoYSwgYEZpcnN0X2xpc3QgczEpKVxuICAgICAgICB8IGBTZWNvbmRfbGlzdCBzMiAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0MiBzMiB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzMiAtPiBTa2lwIChgU2Vjb25kX2xpc3QgczIpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMyKSAtPiBZaWVsZCAoYSwgYFNlY29uZF9saXN0IHMyKSkgKVxuOztcblxubGV0IGNvbmNhdF9tYXAgcyB+ZiA9IGJpbmQgcyB+ZlxubGV0IGNvbmNhdCBzID0gY29uY2F0X21hcCBzIH5mOkZuLmlkXG5sZXQgY29uY2F0X21hcGkgcyB+ZiA9IGNvbmNhdF9tYXAgKG1hcGkgcyB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biAoaSwgcykgLT4gZiBpIHMpXG5cbmxldCB6aXAgKFNlcXVlbmNlIChzMSwgbmV4dDEpKSAoU2VxdWVuY2UgKHMyLCBuZXh0MikpID1cbiAgbGV0IG5leHQgPSBmdW5jdGlvblxuICAgIHwgWWllbGQgKGEsIHMxKSwgWWllbGQgKGIsIHMyKSAtPiBZaWVsZCAoKGEsIGIpLCAoU2tpcCBzMSwgU2tpcCBzMikpXG4gICAgfCBEb25lLCBfIHwgXywgRG9uZSAtPiBEb25lXG4gICAgfCBTa2lwIHMxLCBzMiAtPiBTa2lwIChuZXh0MSBzMSwgczIpXG4gICAgfCBzMSwgU2tpcCBzMiAtPiBTa2lwIChzMSwgbmV4dDIgczIpXG4gIGluXG4gIFNlcXVlbmNlICgoU2tpcCBzMSwgU2tpcCBzMiksIG5leHQpXG47O1xuXG5sZXQgemlwX2Z1bGwgKFNlcXVlbmNlIChzMSwgbmV4dDEpKSAoU2VxdWVuY2UgKHMyLCBuZXh0MikpID1cbiAgbGV0IG5leHQgPSBmdW5jdGlvblxuICAgIHwgWWllbGQgKGEsIHMxKSwgWWllbGQgKGIsIHMyKSAtPiBZaWVsZCAoYEJvdGggKGEsIGIpLCAoU2tpcCBzMSwgU2tpcCBzMikpXG4gICAgfCBEb25lLCBEb25lIC0+IERvbmVcbiAgICB8IFNraXAgczEsIHMyIC0+IFNraXAgKG5leHQxIHMxLCBzMilcbiAgICB8IHMxLCBTa2lwIHMyIC0+IFNraXAgKHMxLCBuZXh0MiBzMilcbiAgICB8IERvbmUsIFlpZWxkIChiLCBzMikgLT4gWWllbGQgKGBSaWdodCBiLCAoRG9uZSwgbmV4dDIgczIpKVxuICAgIHwgWWllbGQgKGEsIHMxKSwgRG9uZSAtPiBZaWVsZCAoYExlZnQgYSwgKG5leHQxIHMxLCBEb25lKSlcbiAgaW5cbiAgU2VxdWVuY2UgKChTa2lwIHMxLCBTa2lwIHMyKSwgbmV4dClcbjs7XG5cbmxldCBib3VuZGVkX2xlbmd0aCAoU2VxdWVuY2UgKHNlZWQsIG5leHQpKSB+YXRfbW9zdCA9XG4gIGxldCByZWMgbG9vcCBpIHNlZWQgbmV4dCA9XG4gICAgaWYgaSA+IGF0X21vc3RcbiAgICB0aGVuIGBHcmVhdGVyXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgICAgfCBEb25lIC0+IGBJcyBpXG4gICAgICB8IFNraXAgc2VlZCAtPiBsb29wIGkgc2VlZCBuZXh0XG4gICAgICB8IFlpZWxkIChfLCBzZWVkKSAtPiBsb29wIChpICsgMSkgc2VlZCBuZXh0KVxuICBpblxuICBsb29wIDAgc2VlZCBuZXh0XG47O1xuXG5sZXQgbGVuZ3RoX2lzX2JvdW5kZWRfYnkgPyhtaW4gPSAtMSkgP21heCB0ID1cbiAgbGV0IGxlbmd0aF9pc19hdF9sZWFzdCAoU2VxdWVuY2UgKHMsIG5leHQpKSA9XG4gICAgbGV0IHJlYyBsb29wIHMgYWNjID1cbiAgICAgIGlmIGFjYyA+PSBtaW5cbiAgICAgIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBmYWxzZVxuICAgICAgICB8IFNraXAgcyAtPiBsb29wIHMgYWNjXG4gICAgICAgIHwgWWllbGQgKF8sIHMpIC0+IGxvb3AgcyAoYWNjICsgMSkpXG4gICAgaW5cbiAgICBsb29wIHMgMFxuICBpblxuICBtYXRjaCBtYXggd2l0aFxuICB8IE5vbmUgLT4gbGVuZ3RoX2lzX2F0X2xlYXN0IHRcbiAgfCBTb21lIG1heCAtPlxuICAgIChtYXRjaCBib3VuZGVkX2xlbmd0aCB0IH5hdF9tb3N0Om1heCB3aXRoXG4gICAgIHwgYElzIGxlbiB3aGVuIGxlbiA+PSBtaW4gLT4gdHJ1ZVxuICAgICB8IF8gLT4gZmFsc2UpXG47O1xuXG5sZXQgaXRlcmkgcyB+ZiA9IGl0ZXIgKG1hcGkgcyB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biAoaSwgcykgLT4gZiBpIHMpXG5cbmxldCBmb2xkaSBzIH5pbml0IH5mID1cbiAgZm9sZCB+aW5pdCAobWFwaSBzIH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIGFjYyAoaSwgcykgLT4gZiBpIGFjYyBzKVxuOztcblxubGV0IHJlZHVjZSBzIH5mID1cbiAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIChhLCBzKSAtPiBTb21lIChmb2xkIHMgfmluaXQ6YSB+Zilcbjs7XG5cbmxldCByZWR1Y2VfZXhuIHMgfmYgPVxuICBtYXRjaCByZWR1Y2UgcyB+ZiB3aXRoXG4gIHwgTm9uZSAtPiBmYWlsd2l0aCBcIlNlcXVlbmNlLnJlZHVjZV9leG5cIlxuICB8IFNvbWUgcmVzIC0+IHJlc1xuOztcblxubGV0IGdyb3VwIChTZXF1ZW5jZSAocywgbmV4dCkpIH5icmVhayA9XG4gIHVuZm9sZF9zdGVwXG4gICAgfmluaXQ6KFNvbWUgKFtdLCBzKSlcbiAgICB+ZjooZnVuY3Rpb25cbiAgICAgIHwgTm9uZSAtPiBEb25lXG4gICAgICB8IFNvbWUgKGFjYywgcykgLT5cbiAgICAgICAgKG1hdGNoIGFjYywgbmV4dCBzIHdpdGhcbiAgICAgICAgIHwgXywgU2tpcCBzIC0+IFNraXAgKFNvbWUgKGFjYywgcykpXG4gICAgICAgICB8IFtdLCBEb25lIC0+IERvbmVcbiAgICAgICAgIHwgYWNjLCBEb25lIC0+IFlpZWxkIChMaXN0LnJldiBhY2MsIE5vbmUpXG4gICAgICAgICB8IFtdLCBZaWVsZCAoY3VyLCBzKSAtPiBTa2lwIChTb21lIChbIGN1ciBdLCBzKSlcbiAgICAgICAgIHwgKHByZXYgOjogXyBhcyBhY2MpLCBZaWVsZCAoY3VyLCBzKSAtPlxuICAgICAgICAgICBpZiBicmVhayBwcmV2IGN1clxuICAgICAgICAgICB0aGVuIFlpZWxkIChMaXN0LnJldiBhY2MsIFNvbWUgKFsgY3VyIF0sIHMpKVxuICAgICAgICAgICBlbHNlIFNraXAgKFNvbWUgKGN1ciA6OiBhY2MsIHMpKSkpXG47O1xuXG5sZXQgZmluZF9jb25zZWN1dGl2ZV9kdXBsaWNhdGUgKFNlcXVlbmNlIChzLCBuZXh0KSkgfmVxdWFsID1cbiAgbGV0IHJlYyBsb29wIGxhc3RfZWx0IHMgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFNraXAgcyAtPiBsb29wIGxhc3RfZWx0IHNcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgKG1hdGNoIGxhc3RfZWx0IHdpdGhcbiAgICAgICB8IFNvbWUgYiB3aGVuIGVxdWFsIGEgYiAtPiBTb21lIChiLCBhKVxuICAgICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBsb29wIChTb21lIGEpIHMpXG4gIGluXG4gIGxvb3AgTm9uZSBzXG47O1xuXG5sZXQgcmVtb3ZlX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZXMgcyB+ZXF1YWwgPVxuICB1bmZvbGRfd2l0aCBzIH5pbml0Ok5vbmUgfmY6KGZ1biBwcmV2IGEgLT5cbiAgICBtYXRjaCBwcmV2IHdpdGhcbiAgICB8IFNvbWUgYiB3aGVuIGVxdWFsIGEgYiAtPiBTa2lwIChTb21lIGEpXG4gICAgfCBOb25lIHwgU29tZSBfIC0+IFlpZWxkIChhLCBTb21lIGEpKVxuOztcblxubGV0IGNvdW50IHMgfmYgPSBsZW5ndGggKGZpbHRlciBzIH5mKVxubGV0IGNvdW50aSB0IH5mID0gbGVuZ3RoIChmaWx0ZXJpIHQgfmYpXG5sZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG5sZXQgbWluX2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxubGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcblxubGV0IGluaXQgbiB+ZiA9XG4gIHVuZm9sZF9zdGVwIH5pbml0OjAgfmY6KGZ1biBpIC0+IGlmIGkgPj0gbiB0aGVuIERvbmUgZWxzZSBZaWVsZCAoZiBpLCBpICsgMSkpXG47O1xuXG5sZXQgc3ViIHMgfnBvcyB+bGVuID1cbiAgaWYgcG9zIDwgMCB8fCBsZW4gPCAwIHRoZW4gZmFpbHdpdGggXCJTZXF1ZW5jZS5zdWJcIjtcbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggKDAsIHMpXG4gICAgICAsIGZ1biAoaSwgcykgLT5cbiAgICAgICAgaWYgaSAtIHBvcyA+PSBsZW5cbiAgICAgICAgdGhlbiBEb25lXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChpLCBzKVxuICAgICAgICAgIHwgWWllbGQgKGEsIHMpIHdoZW4gaSA+PSBwb3MgLT4gWWllbGQgKGEsIChpICsgMSwgcykpXG4gICAgICAgICAgfCBZaWVsZCAoXywgcykgLT4gU2tpcCAoaSArIDEsIHMpKSApXG47O1xuXG5sZXQgdGFrZSBzIGxlbiA9XG4gIGlmIGxlbiA8IDAgdGhlbiBmYWlsd2l0aCBcIlNlcXVlbmNlLnRha2VcIjtcbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggKDAsIHMpXG4gICAgICAsIGZ1biAoaSwgcykgLT5cbiAgICAgICAgaWYgaSA+PSBsZW5cbiAgICAgICAgdGhlbiBEb25lXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChpLCBzKVxuICAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCAoaSArIDEsIHMpKSkgKVxuOztcblxubGV0IGRyb3AgcyBsZW4gPVxuICBpZiBsZW4gPCAwIHRoZW4gZmFpbHdpdGggXCJTZXF1ZW5jZS5kcm9wXCI7XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoICgwLCBzKVxuICAgICAgLCBmdW4gKGksIHMpIC0+XG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGksIHMpXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIHdoZW4gaSA+PSBsZW4gLT4gWWllbGQgKGEsIChpICsgMSwgcykpXG4gICAgICAgIHwgWWllbGQgKF8sIHMpIC0+IFNraXAgKGkgKyAxLCBzKSApXG47O1xuXG5sZXQgdGFrZV93aGlsZSBzIH5mID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggc1xuICAgICAgLCBmdW4gcyAtPlxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIHNcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgd2hlbiBmIGEgLT4gWWllbGQgKGEsIHMpXG4gICAgICAgIHwgWWllbGQgKF8sIF8pIC0+IERvbmUgKVxuOztcblxubGV0IGRyb3Bfd2hpbGUgcyB+ZiA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIGBEcm9wcGluZyBzXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgYERyb3BwaW5nIHMgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoYERyb3BwaW5nIHMpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMpIHdoZW4gZiBhIC0+IFNraXAgKGBEcm9wcGluZyBzKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgYElkZW50aXR5IHMpKVxuICAgICAgICB8IGBJZGVudGl0eSBzIC0+IGxpZnRfaWRlbnRpdHkgbmV4dCBzIClcbjs7XG5cbmxldCBzaGlmdF9yaWdodCBzIHggPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBgQ29uc2luZyAoc2VlZCwgeClcbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBgQ29uc2luZyAoc2VlZCwgeCkgLT4gWWllbGQgKHgsIGBJZGVudGl0eSBzZWVkKVxuICAgICAgICB8IGBJZGVudGl0eSBzIC0+IGxpZnRfaWRlbnRpdHkgbmV4dCBzIClcbjs7XG5cbmxldCBzaGlmdF9yaWdodF93aXRoX2xpc3QgcyBsID0gYXBwZW5kIChvZl9saXN0IGwpIHNcbmxldCBzaGlmdF9sZWZ0ID0gZHJvcFxuXG5tb2R1bGUgSW5maXggPSBzdHJ1Y3RcbiAgbGV0ICggQCApID0gYXBwZW5kXG5lbmRcblxubGV0IGludGVyc3BlcnNlIHMgfnNlcCA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIGBJbml0IHNcbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBgSW5pdCBzIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGBJbml0IHMpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCBgUnVubmluZyBzKSlcbiAgICAgICAgfCBgUnVubmluZyBzIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGBSdW5uaW5nIHMpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChzZXAsIGBQdXR0aW5nIChhLCBzKSkpXG4gICAgICAgIHwgYFB1dHRpbmcgKGEsIHMpIC0+IFlpZWxkIChhLCBgUnVubmluZyBzKSApXG47O1xuXG5sZXQgcmVwZWF0IHggPSB1bmZvbGRfc3RlcCB+aW5pdDp4IH5mOihmdW4geCAtPiBZaWVsZCAoeCwgeCkpXG5cbmxldCBjeWNsZV9saXN0X2V4biB4cyA9XG4gIGlmIExpc3QuaXNfZW1wdHkgeHMgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcXVlbmNlLmN5Y2xlX2xpc3RfZXhuXCI7XG4gIGxldCBzID0gb2ZfbGlzdCB4cyBpblxuICBjb25jYXRfbWFwIH5mOihmdW4gKCkgLT4gcykgKHJlcGVhdCAoKSlcbjs7XG5cbmxldCBjYXJ0ZXNpYW5fcHJvZHVjdCBzYSBzYiA9IGNvbmNhdF9tYXAgc2EgfmY6KGZ1biBhIC0+IHppcCAocmVwZWF0IGEpIHNiKVxubGV0IHNpbmdsZXRvbiB4ID0gcmV0dXJuIHhcblxubGV0IGRlbGF5ZWRfZm9sZCBzIH5pbml0IH5mIH5maW5pc2ggPVxuICBFeHBlcnQuZGVsYXllZF9mb2xkX3N0ZXAgcyB+aW5pdCB+ZmluaXNoIH5mOihmdW4gYWNjIG9wdGlvbiB+ayAtPlxuICAgIG1hdGNoIG9wdGlvbiB3aXRoXG4gICAgfCBOb25lIC0+IGsgYWNjXG4gICAgfCBTb21lIGEgLT4gZiBhY2MgYSB+aylcbjs7XG5cbmxldCBmb2xkX20gfmJpbmQgfnJldHVybiB0IH5pbml0IH5mID1cbiAgRXhwZXJ0LmRlbGF5ZWRfZm9sZF9zdGVwXG4gICAgdFxuICAgIH5pbml0XG4gICAgfmY6KGZ1biBhY2Mgb3B0aW9uIH5rIC0+XG4gICAgICBtYXRjaCBvcHRpb24gd2l0aFxuICAgICAgfCBOb25lIC0+IGJpbmQgKHJldHVybiBhY2MpIH5mOmtcbiAgICAgIHwgU29tZSBhIC0+IGJpbmQgKGYgYWNjIGEpIH5mOmspXG4gICAgfmZpbmlzaDpyZXR1cm5cbjs7XG5cbmxldCBpdGVyX20gfmJpbmQgfnJldHVybiB0IH5mID1cbiAgRXhwZXJ0LmRlbGF5ZWRfZm9sZF9zdGVwXG4gICAgdFxuICAgIH5pbml0OigpXG4gICAgfmY6KGZ1biAoKSBvcHRpb24gfmsgLT5cbiAgICAgIG1hdGNoIG9wdGlvbiB3aXRoXG4gICAgICB8IE5vbmUgLT4gYmluZCAocmV0dXJuICgpKSB+ZjprXG4gICAgICB8IFNvbWUgYSAtPiBiaW5kIChmIGEpIH5mOmspXG4gICAgfmZpbmlzaDpyZXR1cm5cbjs7XG5cbmxldCBmb2xkX3VudGlsIHMgfmluaXQgfmYgfmZpbmlzaCA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiBhY2MgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IGZpbmlzaCBhY2NcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmIGFjY1xuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAobWF0Y2ggKGYgYWNjIGEgOiAoJ2EsICdiKSBDb250aW51ZV9vcl9zdG9wLnQpIHdpdGhcbiAgICAgICB8IFN0b3AgeCAtPiB4XG4gICAgICAgfCBDb250aW51ZSBhY2MgLT4gbG9vcCBzIG5leHQgZiBhY2MpXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbmV4dCBmIGluaXRcbjs7XG5cbmxldCBmb2xkX3Jlc3VsdCBzIH5pbml0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmIGFjYyA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gUmVzdWx0LnJldHVybiBhY2NcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmIGFjY1xuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAobWF0Y2ggKGYgYWNjIGEgOiAoXywgXykgUmVzdWx0LnQpIHdpdGhcbiAgICAgICB8IEVycm9yIF8gYXMgZSAtPiBlXG4gICAgICAgfCBPayBhY2MgLT4gbG9vcCBzIG5leHQgZiBhY2MpXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbmV4dCBmIGluaXRcbjs7XG5cbmxldCBmb3JjZV9lYWdlcmx5IHQgPSBvZl9saXN0ICh0b19saXN0IHQpXG5cbmxldCBtZW1vaXplICh0eXBlIGEpIChTZXF1ZW5jZSAocywgbmV4dCkpID1cbiAgbGV0IG1vZHVsZSBNID0gc3RydWN0XG4gICAgdHlwZSB0ID0gVCBvZiAoYSwgdCkgU3RlcC50IExhenkudFxuICBlbmRcbiAgaW5cbiAgbGV0IHJlYyBtZW1vaXplIHMgPSBNLlQgKGxhenkgKGZpbmRfc3RlcCBzKSlcbiAgYW5kIGZpbmRfc3RlcCBzID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBEb25lXG4gICAgfCBTa2lwIHMgLT4gZmluZF9zdGVwIHNcbiAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgbWVtb2l6ZSBzKVxuICBpblxuICBTZXF1ZW5jZSAobWVtb2l6ZSBzLCBmdW4gKE0uVCBsKSAtPiBMYXp5LmZvcmNlIGwpXG47O1xuXG5sZXQgZHJvcF9lYWdlcmx5IHMgbGVuID1cbiAgbGV0IHJlYyBsb29wIGkgfmxlbiBzIG5leHQgPVxuICAgIGlmIGkgPj0gbGVuXG4gICAgdGhlbiBTZXF1ZW5jZSAocywgbmV4dClcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICB8IERvbmUgLT4gZW1wdHlcbiAgICAgIHwgU2tpcCBzIC0+IGxvb3AgaSB+bGVuIHMgbmV4dFxuICAgICAgfCBZaWVsZCAoXywgcykgLT4gbG9vcCAoaSArIDEpIH5sZW4gcyBuZXh0KVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCAwIH5sZW4gcyBuZXh0XG47O1xuXG5sZXQgZHJvcF93aGlsZV9vcHRpb24gKFNlcXVlbmNlIChzLCBuZXh0KSkgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgU2tpcCBzIC0+IGxvb3Agc1xuICAgIHwgWWllbGQgKHgsIHMpIC0+IGlmIGYgeCB0aGVuIGxvb3AgcyBlbHNlIFNvbWUgKHgsIFNlcXVlbmNlIChzLCBuZXh0KSlcbiAgaW5cbiAgbG9vcCBzXG47O1xuXG5sZXQgY29tcGFyZSBjb21wYXJlX2EgdDEgdDIgPVxuICBXaXRoX3JldHVybi53aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyICh6aXBfZnVsbCB0MSB0MikgfmY6KGZ1bmN0aW9uXG4gICAgICB8IGBMZWZ0IF8gLT4gci5yZXR1cm4gMVxuICAgICAgfCBgUmlnaHQgXyAtPiByLnJldHVybiAoLTEpXG4gICAgICB8IGBCb3RoICh2MSwgdjIpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9hIHYxIHYyIGluXG4gICAgICAgIGlmIGMgPD4gMCB0aGVuIHIucmV0dXJuIGMpO1xuICAgIDApXG47O1xuXG5sZXQgZXF1YWwgZXF1YWxfYSB0MSB0MiA9XG4gIGZvcl9hbGwgKHppcF9mdWxsIHQxIHQyKSB+ZjooZnVuY3Rpb25cbiAgICB8IGBCb3RoIChhMSwgYTIpIC0+IGVxdWFsX2EgYTEgYTJcbiAgICB8IGBMZWZ0IF8gfCBgUmlnaHQgXyAtPiBmYWxzZSlcbjs7XG5cbmxldCByb3VuZF9yb2JpbiBsaXN0ID1cbiAgbGV0IG5leHQgKHRvZG9fc3RhY2ssIGRvbmVfc3RhY2spID1cbiAgICBtYXRjaCB0b2RvX3N0YWNrIHdpdGhcbiAgICB8IFNlcXVlbmNlIChzLCBmKSA6OiB0b2RvX3N0YWNrIC0+XG4gICAgICAobWF0Y2ggZiBzIHdpdGhcbiAgICAgICB8IFlpZWxkICh4LCBzKSAtPiBZaWVsZCAoeCwgKHRvZG9fc3RhY2ssIFNlcXVlbmNlIChzLCBmKSA6OiBkb25lX3N0YWNrKSlcbiAgICAgICB8IFNraXAgcyAtPiBTa2lwIChTZXF1ZW5jZSAocywgZikgOjogdG9kb19zdGFjaywgZG9uZV9zdGFjaylcbiAgICAgICB8IERvbmUgLT4gU2tpcCAodG9kb19zdGFjaywgZG9uZV9zdGFjaykpXG4gICAgfCBbXSAtPiBpZiBMaXN0LmlzX2VtcHR5IGRvbmVfc3RhY2sgdGhlbiBEb25lIGVsc2UgU2tpcCAoTGlzdC5yZXYgZG9uZV9zdGFjaywgW10pXG4gIGluXG4gIGxldCBzdGF0ZSA9IGxpc3QsIFtdIGluXG4gIFNlcXVlbmNlIChzdGF0ZSwgbmV4dClcbjs7XG5cbmxldCBpbnRlcmxlYXZlIChTZXF1ZW5jZSAoczEsIGYxKSkgPVxuICBsZXQgbmV4dCAodG9kb19zdGFjaywgZG9uZV9zdGFjaywgczEpID1cbiAgICBtYXRjaCB0b2RvX3N0YWNrIHdpdGhcbiAgICB8IFNlcXVlbmNlIChzMiwgZjIpIDo6IHRvZG9fc3RhY2sgLT5cbiAgICAgIChtYXRjaCBmMiBzMiB3aXRoXG4gICAgICAgfCBZaWVsZCAoeCwgczIpIC0+IFlpZWxkICh4LCAodG9kb19zdGFjaywgU2VxdWVuY2UgKHMyLCBmMikgOjogZG9uZV9zdGFjaywgczEpKVxuICAgICAgIHwgU2tpcCBzMiAtPiBTa2lwICh0b2RvX3N0YWNrLCBTZXF1ZW5jZSAoczIsIGYyKSA6OiBkb25lX3N0YWNrLCBzMSlcbiAgICAgICB8IERvbmUgLT4gU2tpcCAodG9kb19zdGFjaywgZG9uZV9zdGFjaywgczEpKVxuICAgIHwgW10gLT5cbiAgICAgIChtYXRjaCBmMSBzMSwgZG9uZV9zdGFjayB3aXRoXG4gICAgICAgfCBZaWVsZCAodCwgczEpLCBfIC0+IFNraXAgKExpc3QucmV2ICh0IDo6IGRvbmVfc3RhY2spLCBbXSwgczEpXG4gICAgICAgfCBTa2lwIHMxLCBfIC0+IFNraXAgKExpc3QucmV2IGRvbmVfc3RhY2ssIFtdLCBzMSlcbiAgICAgICB8IERvbmUsIF8gOjogXyAtPiBTa2lwIChMaXN0LnJldiBkb25lX3N0YWNrLCBbXSwgczEpXG4gICAgICAgfCBEb25lLCBbXSAtPiBEb25lKVxuICBpblxuICBsZXQgc3RhdGUgPSBbXSwgW10sIHMxIGluXG4gIFNlcXVlbmNlIChzdGF0ZSwgbmV4dClcbjs7XG5cbmxldCBpbnRlcmxlYXZlZF9jYXJ0ZXNpYW5fcHJvZHVjdCBzMSBzMiA9XG4gIG1hcCBzMSB+ZjooZnVuIHgxIC0+IG1hcCBzMiB+ZjooZnVuIHgyIC0+IHgxLCB4MikpIHw+IGludGVybGVhdmVcbjs7XG5cbmxldCBvZl9zZXEgKHNlcSA6IF8gQ2FtbC5TZXEudCkgPVxuICB1bmZvbGRfc3RlcCB+aW5pdDpzZXEgfmY6KGZ1biBzZXEgLT5cbiAgICBtYXRjaCBzZXEgKCkgd2l0aFxuICAgIHwgTmlsIC0+IERvbmVcbiAgICB8IENvbnMgKGhkLCB0bCkgLT4gWWllbGQgKGhkLCB0bCkpXG47O1xuXG5sZXQgdG9fc2VxIChTZXF1ZW5jZSAoc3RhdGUsIG5leHQpKSA9XG4gIGxldCByZWMgbG9vcCBzdGF0ZSA9XG4gICAgbWF0Y2ggbmV4dCBzdGF0ZSB3aXRoXG4gICAgfCBEb25lIC0+IENhbWwuU2VxLk5pbFxuICAgIHwgU2tpcCBzdGF0ZSAtPiBsb29wIHN0YXRlXG4gICAgfCBZaWVsZCAoaGQsIHN0YXRlKSAtPiBDYW1sLlNlcS5Db25zIChoZCwgZnVuICgpIC0+IGxvb3Agc3RhdGUpXG4gIGluXG4gIGZ1biAoKSAtPiBsb29wIHN0YXRlXG47O1xuXG5tb2R1bGUgR2VuZXJhdG9yID0gc3RydWN0XG4gIHR5cGUgJ2VsdCBzdGVwcyA9IFdyYXAgb2YgKCdlbHQsIHVuaXQgLT4gJ2VsdCBzdGVwcykgU3RlcC50XG5cbiAgbGV0IHVud3JhcCAoV3JhcCBzdGVwKSA9IHN0ZXBcblxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIHR5cGUgKCdhLCAnZWx0KSB0ID0gKCdhIC0+ICdlbHQgc3RlcHMpIC0+ICdlbHQgc3RlcHNcblxuICAgIGxldCByZXR1cm4geCBrID0gayB4XG5cbiAgICBsZXQgYmluZCBtIH5mIGsgPVxuICAgICAgbSAoZnVuIGEgLT5cbiAgICAgICAgbGV0IG0nID0gZiBhIGluXG4gICAgICAgIG0nIGspXG4gICAgOztcblxuICAgIGxldCBtYXAgbSB+ZiBrID0gbSAoZnVuIGEgLT4gayAoZiBhKSlcbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgZW5kXG5cbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgTW9uYWQuTWFrZTIgKFQpXG5cbiAgbGV0IHlpZWxkIGUgayA9IFdyYXAgKFlpZWxkIChlLCBrKSlcbiAgbGV0IHRvX3N0ZXBzIHQgPSB0IChmdW4gKCkgLT4gV3JhcCBEb25lKVxuXG4gIGxldCBvZl9zZXF1ZW5jZSBzZXF1ZW5jZSA9XG4gICAgZGVsYXllZF9mb2xkXG4gICAgICBzZXF1ZW5jZVxuICAgICAgfmluaXQ6KClcbiAgICAgIH5mOihmdW4gKCkgeCB+ayBmIC0+IFdyYXAgKFlpZWxkICh4LCBmdW4gKCkgLT4gayAoKSBmKSkpXG4gICAgICB+ZmluaXNoOnJldHVyblxuICA7O1xuXG4gIGxldCBydW4gdCA9XG4gICAgbGV0IGluaXQgKCkgPSB0b19zdGVwcyB0IGluXG4gICAgbGV0IGYgdGh1bmsgPSB1bndyYXAgKHRodW5rICgpKSBpblxuICAgIHVuZm9sZF9zdGVwIH5pbml0IH5mXG4gIDs7XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBBcnJheTBcblxudHlwZSAnYSB0ID0gJ2EgYXJyYXkgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9IGNvbXBhcmVfYXJyYXlcbmxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPSBhcnJheV9vZl9zZXhwXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID0gc2V4cF9vZl9hcnJheVxuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBhcnJheV9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuOztcblxuW0BAQGVuZF1cblxuKCogVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIG5ldyBpbi1wbGFjZSwgY29uc3RhbnQgaGVhcCBzb3J0aW5nIGFsZ29yaXRobSB0byByZXBsYWNlIHRoZVxuICAgb25lIHVzZWQgYnkgdGhlIHN0YW5kYXJkIGxpYnJhcmllcy4gIEl0cyBvbmx5IHB1cnBvc2UgaXMgdG8gYmUgZmFzdGVyIChob3BlZnVsbHlcbiAgIHN0cmljdGx5IGZhc3RlcikgdGhhbiB0aGUgYmFzZSBzb3J0IGFuZCBzdGFibGVfc29ydC5cblxuICAgQXQgYSBoaWdoIGxldmVsIHRoZSBhbGdvcml0aG0gaXM6XG4gICAtIHBpY2sgdHdvIHBpdm90IHBvaW50cyBieTpcbiAgIC0gcGljayA1IGFyYml0cmFyeSBlbGVtZW50cyBmcm9tIHRoZSBhcnJheVxuICAgLSBzb3J0IHRoZW0gd2l0aGluIHRoZSBhcnJheVxuICAgLSB0YWtlIHRoZSBlbGVtZW50cyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgbWlkZGxlIGVsZW1lbnQgb2YgdGhlIHNvcnQgYXMgdGhlIHBpdm90c1xuICAgLSBzb3J0IHRoZSBhcnJheSB3aXRoOlxuICAgLSBhbGwgZWxlbWVudHMgbGVzcyB0aGFuIHBpdm90MSB0byB0aGUgbGVmdCAocmFuZ2UgMSlcbiAgIC0gYWxsIGVsZW1lbnRzID49IHBpdm90MSBhbmQgPD0gcGl2b3QyIGluIHRoZSBtaWRkbGUgKHJhbmdlIDIpXG4gICAtIGFsbCBlbGVtZW50cyA+IHBpdm90MiB0byB0aGUgcmlnaHQgKHJhbmdlIDMpXG4gICAtIGlmIHBpdm90MSBhbmQgcGl2b3QyIGFyZSBlcXVhbCwgdGhlbiB0aGUgbWlkZGxlIHJhbmdlIGlzIHNvcnRlZCwgc28gaWdub3JlIGl0XG4gICAtIHJlY3Vyc2UgaW50byByYW5nZSAxLCAyIChpZiBwaXZvdDEgYW5kIHBpdm90MiBhcmUgdW5lcXVhbCksIGFuZCAzXG4gICAtIGR1cmluZyByZWN1cnNpb24gdGhlcmUgYXJlIHR3byBpbmZsZWN0aW9uIHBvaW50czpcbiAgIC0gaWYgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgcmFuZ2UgaXMgc21hbGwsIHVzZSBpbnNlcnRpb24gc29ydCB0byBzb3J0IGl0XG4gICAtIGlmIHRoZSBzdGFjayBkZXB0aCBpcyBsYXJnZSwgc29ydCB0aGUgcmFuZ2Ugd2l0aCBoZWFwLXNvcnQgdG8gYXZvaWQgbl4yIHdvcnN0LWNhc2VcbiAgICAgYmVoYXZpb3JcblxuICAgU2VlIHRoZSBmb2xsb3dpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb246XG4gICAtIFwiRHVhbC1QaXZvdCBRdWlja3NvcnRcIiBieSBWbGFkaW1pciBZYXJvc2xhdnNraXkuXG4gICAgIEF2YWlsYWJsZSBhdFxuICAgICBodHRwOi8vd3d3LmtyaWNoZS5jb20uYXIvcm9vdC9wcm9ncmFtbWluZy9zcGFjZVRpbWVDb21wbGV4aXR5L0R1YWxQaXZvdFF1aWNrc29ydC5wZGZcbiAgIC0gXCJRdWlja3NvcnQgaXMgT3B0aW1hbFwiIGJ5IFNlZGdld2ljayBhbmQgQmVudGxleS5cbiAgICAgU2xpZGVzIGF0IGh0dHA6Ly93d3cuY3MucHJpbmNldG9uLmVkdS9+cnMvdGFsa3MvUXVpY2tzb3J0SXNPcHRpbWFsLnBkZlxuICAgLSBodHRwOi8vd3d3LnNvcnRpbmctYWxnb3JpdGhtcy5jb20vcXVpY2stc29ydC0zLXdheSAqKVxuXG5tb2R1bGUgU29ydCA9IHN0cnVjdFxuICAoKiBGb3IgdGhlIHNha2Ugb2Ygc3BlZWQgd2UgY291bGQgdXNlIHVuc2FmZSBnZXQvc2V0IHRocm91Z2hvdXQsIGJ1dCBzcGVlZCB0ZXN0cyBkb24ndFxuICAgICBzaG93IGEgc2lnbmlmaWNhbnQgaW1wcm92ZW1lbnQuICopXG4gIGxldCBnZXQgPSBnZXRcbiAgbGV0IHNldCA9IHNldFxuXG4gIGxldCBzd2FwIGFyciBpIGogPVxuICAgIGxldCB0bXAgPSBnZXQgYXJyIGkgaW5cbiAgICBzZXQgYXJyIGkgKGdldCBhcnIgaik7XG4gICAgc2V0IGFyciBqIHRtcFxuICA7O1xuXG4gIG1vZHVsZSB0eXBlIFNvcnQgPSBzaWdcbiAgICB2YWwgc29ydFxuICAgICAgOiAgJ2EgdFxuICAgICAgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KVxuICAgICAgLT4gbGVmdDppbnQgKCogbGVmdG1vc3QgaW5kZXggb2Ygc3ViLWFycmF5IHRvIHNvcnQgKilcbiAgICAgIC0+IHJpZ2h0OmludCAoKiByaWdodG1vc3QgaW5kZXggb2Ygc3ViLWFycmF5IHRvIHNvcnQgKilcbiAgICAgIC0+IHVuaXRcbiAgZW5kXG5cbiAgKCogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnNlcnRpb25fc29ydCAqKVxuICBtb2R1bGUgSW5zZXJ0aW9uX3NvcnQgOiBTb3J0ID0gc3RydWN0XG4gICAgbGV0IHNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICAoKiBsb29wIGludmFyaWFudDpcbiAgICAgICAgIFthcnJdIGlzIHNvcnRlZCBmcm9tIFtsZWZ0XSB0byBbcG9zIC0gMV0sIGluY2x1c2l2ZSAqKVxuICAgICAgZm9yIHBvcyA9IGxlZnQgKyAxIHRvIHJpZ2h0IGRvXG4gICAgICAgICgqIGxvb3AgaW52YXJpYW50czpcbiAgICAgICAgICAgMS4gIHRoZSBzdWJhcnJheSBhcnJbbGVmdCAuLiBpLTFdIGlzIHNvcnRlZFxuICAgICAgICAgICAyLiAgdGhlIHN1YmFycmF5IGFycltpKzEgLi4gcG9zXSBpcyBzb3J0ZWQgYW5kIGNvbnRhaW5zIG9ubHkgZWxlbWVudHMgPiB2XG4gICAgICAgICAgIDMuICBhcnJbaV0gbWF5IGJlIHRob3VnaHQgb2YgYXMgY29udGFpbmluZyB2XG5cbiAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWxsb2NhdGUgYSBjbG9zdXJlLCBidXQgaXMgbGVmdCBpbiB0aGUgZm9yXG4gICAgICAgICAgIGxvb3AgZm9yIHRoZSByZWFkYWJpbGl0eSBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gKilcbiAgICAgICAgbGV0IHJlYyBsb29wIGFyciB+bGVmdCB+Y29tcGFyZSBpIHYgPVxuICAgICAgICAgIGxldCBpX25leHQgPSBpIC0gMSBpblxuICAgICAgICAgIGlmIGlfbmV4dCA+PSBsZWZ0ICYmIGNvbXBhcmUgKGdldCBhcnIgaV9uZXh0KSB2ID4gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgc2V0IGFyciBpIChnZXQgYXJyIGlfbmV4dCk7XG4gICAgICAgICAgICBsb29wIGFyciB+bGVmdCB+Y29tcGFyZSBpX25leHQgdilcbiAgICAgICAgICBlbHNlIGlcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHYgPSBnZXQgYXJyIHBvcyBpblxuICAgICAgICBsZXQgZmluYWxfcG9zID0gbG9vcCBhcnIgfmxlZnQgfmNvbXBhcmUgcG9zIHYgaW5cbiAgICAgICAgc2V0IGFyciBmaW5hbF9wb3MgdlxuICAgICAgZG9uZVxuICAgIDs7XG4gIGVuZFxuXG4gICgqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGVhcHNvcnQgKilcbiAgbW9kdWxlIEhlYXBfc29ydCA6IFNvcnQgPSBzdHJ1Y3RcbiAgICAoKiBsb29wIGludmFyaWFudDpcbiAgICAgICByb290J3MgY2hpbGRyZW4gYXJlIGJvdGggZWl0aGVyIHJvb3RzIG9mIG1heC1oZWFwcyBvciA+IHJpZ2h0ICopXG4gICAgbGV0IHJlYyBoZWFwaWZ5IGFyciB+Y29tcGFyZSByb290IH5sZWZ0IH5yaWdodCA9XG4gICAgICBsZXQgcmVsYXRpdmVfcm9vdCA9IHJvb3QgLSBsZWZ0IGluXG4gICAgICBsZXQgbGVmdF9jaGlsZCA9ICgyICogcmVsYXRpdmVfcm9vdCkgKyBsZWZ0ICsgMSBpblxuICAgICAgbGV0IHJpZ2h0X2NoaWxkID0gKDIgKiByZWxhdGl2ZV9yb290KSArIGxlZnQgKyAyIGluXG4gICAgICBsZXQgbGFyZ2VzdCA9XG4gICAgICAgIGlmIGxlZnRfY2hpbGQgPD0gcmlnaHQgJiYgY29tcGFyZSAoZ2V0IGFyciBsZWZ0X2NoaWxkKSAoZ2V0IGFyciByb290KSA+IDBcbiAgICAgICAgdGhlbiBsZWZ0X2NoaWxkXG4gICAgICAgIGVsc2Ugcm9vdFxuICAgICAgaW5cbiAgICAgIGxldCBsYXJnZXN0ID1cbiAgICAgICAgaWYgcmlnaHRfY2hpbGQgPD0gcmlnaHQgJiYgY29tcGFyZSAoZ2V0IGFyciByaWdodF9jaGlsZCkgKGdldCBhcnIgbGFyZ2VzdCkgPiAwXG4gICAgICAgIHRoZW4gcmlnaHRfY2hpbGRcbiAgICAgICAgZWxzZSBsYXJnZXN0XG4gICAgICBpblxuICAgICAgaWYgbGFyZ2VzdCA8PiByb290XG4gICAgICB0aGVuIChcbiAgICAgICAgc3dhcCBhcnIgcm9vdCBsYXJnZXN0O1xuICAgICAgICBoZWFwaWZ5IGFyciB+Y29tcGFyZSBsYXJnZXN0IH5sZWZ0IH5yaWdodClcbiAgICA7O1xuXG4gICAgbGV0IGJ1aWxkX2hlYXAgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICAoKiBFbGVtZW50cyBpbiB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGFycmF5IGFyZSBhbHJlYWR5IGhlYXBzIG9mIHNpemUgMS4gIFdlIG1vdmVcbiAgICAgICAgIHRocm91Z2ggdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGFycmF5IGZyb20gYmFjayB0byBmcm9udCBleGFtaW5pbmcgdGhlIGVsZW1lbnQgYXRcbiAgICAgICAgIGhhbmQsIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4sIGZpeGluZyB0aGUgaGVhcCBwcm9wZXJ0eSBhcyB3ZSBnby4gKilcbiAgICAgIGZvciBpID0gKGxlZnQgKyByaWdodCkgLyAyIGRvd250byBsZWZ0IGRvXG4gICAgICAgIGhlYXBpZnkgYXJyIH5jb21wYXJlIGkgfmxlZnQgfnJpZ2h0XG4gICAgICBkb25lXG4gICAgOztcblxuICAgIGxldCBzb3J0IGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgYnVpbGRfaGVhcCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0O1xuICAgICAgKCogbG9vcCBpbnZhcmlhbnRzOlxuICAgICAgICAgMS4gIHRoZSBzdWJhcnJheSBhcnJbbGVmdCAuLi4gaV0gaXMgYSBtYXgtaGVhcCBIXG4gICAgICAgICAyLiAgdGhlIHN1YmFycmF5IGFycltpKzEgLi4uIHJpZ2h0XSBpcyBzb3J0ZWQgKGNhbGwgaXQgUylcbiAgICAgICAgIDMuICBldmVyeSBlbGVtZW50IG9mIEggaXMgbGVzcyB0aGFuIGV2ZXJ5IGVsZW1lbnQgb2YgUyAqKVxuICAgICAgZm9yIGkgPSByaWdodCBkb3dudG8gbGVmdCArIDEgZG9cbiAgICAgICAgc3dhcCBhcnIgbGVmdCBpO1xuICAgICAgICBoZWFwaWZ5IGFyciB+Y29tcGFyZSBsZWZ0IH5sZWZ0IH5yaWdodDooaSAtIDEpXG4gICAgICBkb25lXG4gICAgOztcbiAgZW5kXG5cbiAgKCogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JbnRyb3NvcnQgKilcbiAgbW9kdWxlIEludHJvX3NvcnQgOiBzaWdcbiAgICBpbmNsdWRlIFNvcnRcblxuICAgIHZhbCBmaXZlX2VsZW1lbnRfc29ydFxuICAgICAgOiAgJ2EgdFxuICAgICAgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KVxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHVuaXRcbiAgZW5kID0gc3RydWN0XG4gICAgbGV0IGZpdmVfZWxlbWVudF9zb3J0IGFyciB+Y29tcGFyZSBtMSBtMiBtMyBtNCBtNSA9XG4gICAgICBsZXQgY29tcGFyZV9hbmRfc3dhcCBpIGogPVxuICAgICAgICBpZiBjb21wYXJlIChnZXQgYXJyIGkpIChnZXQgYXJyIGopID4gMCB0aGVuIHN3YXAgYXJyIGkgalxuICAgICAgaW5cbiAgICAgICgqIE9wdGltYWwgNS1lbGVtZW50IHNvcnRpbmcgbmV0d29yazpcblxuICAgICAgICAge3ZcbiAgICAgICAgICAgIDEtLW8tLS0tLW8tLS0tLW8tLS0tLS0tLS0tLS0tLTFcbiAgICAgICAgICAgICAgIHwgICAgIHwgICAgIHxcbiAgICAgICAgICAgIDItLW8tLS0tLXwtLW8tLXwtLS0tLW8tLW8tLS0tLTJcbiAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHwgICAgIHwgIHxcbiAgICAgICAgICAgIDMtLS0tLS0tLW8tLW8tLXwtLW8tLXwtLW8tLS0tLTNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIHwgIHxcbiAgICAgICAgICAgIDQtLS0tLW8tLS0tLS0tLW8tLW8tLXwtLS0tLW8tLTRcbiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgIHxcbiAgICAgICAgICAgIDUtLS0tLW8tLS0tLS0tLS0tLS0tLW8tLS0tLW8tLTVcbiAgICAgICAgICB2fSAqKVxuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMSBtMjtcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTQgbTU7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0xIG0zO1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMiBtMztcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTEgbTQ7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0zIG00O1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMiBtNTtcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTIgbTM7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG00IG01XG4gICAgOztcblxuICAgICgqIGNob29zZSBwaXZvdHMgZm9yIHRoZSBhcnJheSBieSBzb3J0aW5nIDUgZWxlbWVudHMgYW5kIGV4YW1pbmluZyB0aGUgY2VudGVyIHRocmVlXG4gICAgICAgZWxlbWVudHMuICBUaGUgZ29hbCBpcyB0byBjaG9vc2UgdHdvIHBpdm90cyB0aGF0IHdpbGwgZWl0aGVyOlxuICAgICAgIC0gYnJlYWsgdGhlIHJhbmdlIHVwIGludG8gMyBldmVuIHBhcnRpdGlvbnNcbiAgICAgICAgIG9yXG4gICAgICAgLSBlbGltaW5hdGUgYSBjb21tb25seSBhcHBlYXJpbmcgZWxlbWVudCBieSBzb3J0aW5nIGl0IGludG8gdGhlIGNlbnRlciBwYXJ0aXRpb25cbiAgICAgICAgIGJ5IGl0c2VsZlxuICAgICAgICAgVG8gdGhpcyBlbmQgd2UgbG9vayBhdCB0aGUgY2VudGVyIDMgZWxlbWVudHMgb2YgdGhlIDUgYW5kIHJldHVybiBwYWlycyBvZiBlcXVhbFxuICAgICAgICAgZWxlbWVudHMgb3IgdGhlIHdpZGVzdCByYW5nZSAqKVxuICAgIGxldCBjaG9vc2VfcGl2b3RzIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgbGV0IHNpeHRoID0gKHJpZ2h0IC0gbGVmdCkgLyA2IGluXG4gICAgICBsZXQgbTEgPSBsZWZ0ICsgc2l4dGggaW5cbiAgICAgIGxldCBtMiA9IG0xICsgc2l4dGggaW5cbiAgICAgIGxldCBtMyA9IG0yICsgc2l4dGggaW5cbiAgICAgIGxldCBtNCA9IG0zICsgc2l4dGggaW5cbiAgICAgIGxldCBtNSA9IG00ICsgc2l4dGggaW5cbiAgICAgIGZpdmVfZWxlbWVudF9zb3J0IGFyciB+Y29tcGFyZSBtMSBtMiBtMyBtNCBtNTtcbiAgICAgIGxldCBtMl92YWwgPSBnZXQgYXJyIG0yIGluXG4gICAgICBsZXQgbTNfdmFsID0gZ2V0IGFyciBtMyBpblxuICAgICAgbGV0IG00X3ZhbCA9IGdldCBhcnIgbTQgaW5cbiAgICAgIGlmIGNvbXBhcmUgbTJfdmFsIG0zX3ZhbCA9IDBcbiAgICAgIHRoZW4gbTJfdmFsLCBtM192YWwsIHRydWVcbiAgICAgIGVsc2UgaWYgY29tcGFyZSBtM192YWwgbTRfdmFsID0gMFxuICAgICAgdGhlbiBtM192YWwsIG00X3ZhbCwgdHJ1ZVxuICAgICAgZWxzZSBtMl92YWwsIG00X3ZhbCwgZmFsc2VcbiAgICA7O1xuXG4gICAgbGV0IGR1YWxfcGl2b3RfcGFydGl0aW9uIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgbGV0IHBpdm90MSwgcGl2b3QyLCBwaXZvdHNfZXF1YWwgPSBjaG9vc2VfcGl2b3RzIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgaW5cbiAgICAgICgqIGxvb3AgaW52YXJpYW50czpcbiAgICAgICAgIDEuICBsZWZ0IDw9IGwgPCByIDw9IHJpZ2h0XG4gICAgICAgICAyLiAgbCA8PSBwIDw9IHJcbiAgICAgICAgIDMuICBsIDw9IHggPCBwICAgICBpbXBsaWVzIGFyclt4XSA+PSBwaXZvdDFcbiAgICAgICAgIGFuZCBhcnJbeF0gPD0gcGl2b3QyXG4gICAgICAgICA0LiAgbGVmdCA8PSB4IDwgbCAgaW1wbGllcyBhcnJbeF0gPCBwaXZvdDFcbiAgICAgICAgIDUuICByIDwgeCA8PSByaWdodCBpbXBsaWVzIGFyclt4XSA+IHBpdm90MiAqKVxuICAgICAgbGV0IHJlYyBsb29wIGwgcCByID1cbiAgICAgICAgbGV0IHB2ID0gZ2V0IGFyciBwIGluXG4gICAgICAgIGlmIGNvbXBhcmUgcHYgcGl2b3QxIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBzd2FwIGFyciBwIGw7XG4gICAgICAgICAgY29udCAobCArIDEpIChwICsgMSkgcilcbiAgICAgICAgZWxzZSBpZiBjb21wYXJlIHB2IHBpdm90MiA+IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgKCogbG9vcCBpbnZhcmlhbnRzOiAgc2FtZSBhcyB0aG9zZSBvZiB0aGUgb3V0ZXIgbG9vcCAqKVxuICAgICAgICAgIGxldCByZWMgc2Nhbl9iYWNrd2FyZHMgciA9XG4gICAgICAgICAgICBpZiByID4gcCAmJiBjb21wYXJlIChnZXQgYXJyIHIpIHBpdm90MiA+IDAgdGhlbiBzY2FuX2JhY2t3YXJkcyAociAtIDEpIGVsc2UgclxuICAgICAgICAgIGluXG4gICAgICAgICAgbGV0IHIgPSBzY2FuX2JhY2t3YXJkcyByIGluXG4gICAgICAgICAgc3dhcCBhcnIgciBwO1xuICAgICAgICAgIGNvbnQgbCBwIChyIC0gMSkpXG4gICAgICAgIGVsc2UgY29udCBsIChwICsgMSkgclxuICAgICAgYW5kIGNvbnQgbCBwIHIgPSBpZiBwID4gciB0aGVuIGwsIHIgZWxzZSBsb29wIGwgcCByIGluXG4gICAgICBsZXQgbCwgciA9IGNvbnQgbGVmdCBsZWZ0IHJpZ2h0IGluXG4gICAgICBsLCByLCBwaXZvdHNfZXF1YWxcbiAgICA7O1xuXG4gICAgbGV0IHJlYyBpbnRyb19zb3J0IGFyciB+bWF4X2RlcHRoIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICBsZXQgbGVuID0gcmlnaHQgLSBsZWZ0ICsgMSBpblxuICAgICAgKCogVGhpcyB0YWtlcyBjYXJlIG9mIHNvbWUgZWRnZSBjYXNlcywgc3VjaCBhcyBsZWZ0ID4gcmlnaHQgb3IgdmVyeSBzaG9ydCBhcnJheXMsXG4gICAgICAgICBzaW5jZSBJbnNlcnRpb25fc29ydC5zb3J0IGhhbmRsZXMgdGhlc2UgY2FzZXMgcHJvcGVybHkuICBUaHVzIHdlIGRvbid0IG5lZWQgdG9cbiAgICAgICAgIG1ha2Ugc3VyZSB0aGF0IGxlZnQgYW5kIHJpZ2h0IGFyZSB2YWxpZCBpbiByZWN1cnNpdmUgY2FsbHMuICopXG4gICAgICBpZiBsZW4gPD0gMzJcbiAgICAgIHRoZW4gSW5zZXJ0aW9uX3NvcnQuc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0XG4gICAgICBlbHNlIGlmIG1heF9kZXB0aCA8IDBcbiAgICAgIHRoZW4gSGVhcF9zb3J0LnNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodFxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBtYXhfZGVwdGggPSBtYXhfZGVwdGggLSAxIGluXG4gICAgICAgIGxldCBsLCByLCBtaWRkbGVfc29ydGVkID0gZHVhbF9waXZvdF9wYXJ0aXRpb24gYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCBpblxuICAgICAgICBpbnRyb19zb3J0IGFyciB+bWF4X2RlcHRoIH5jb21wYXJlIH5sZWZ0IH5yaWdodDoobCAtIDEpO1xuICAgICAgICBpZiBub3QgbWlkZGxlX3NvcnRlZCB0aGVuIGludHJvX3NvcnQgYXJyIH5tYXhfZGVwdGggfmNvbXBhcmUgfmxlZnQ6bCB+cmlnaHQ6cjtcbiAgICAgICAgaW50cm9fc29ydCBhcnIgfm1heF9kZXB0aCB+Y29tcGFyZSB+bGVmdDoociArIDEpIH5yaWdodClcbiAgICA7O1xuXG4gICAgbGV0IHNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICBsZXQgaGVhcF9zb3J0X3N3aXRjaF9kZXB0aCA9XG4gICAgICAgICgqIFdlIGJhaWwgb3V0IHRvIGhlYXAgc29ydCBhdCBhIHJlY3Vyc2lvbiBkZXB0aCBvZiAzMi4gR05VIGludHJvc29ydCB1c2VzIDJsZyhuKS5cbiAgICAgICAgICAgVGhlIGV4cGVjdGVkIHJlY3Vyc2lvbiBkZXB0aCBmb3IgcGVyZmVjdCAzLXdheSBzcGxpdHMgaXMgbG9nXzMobikuXG5cbiAgICAgICAgICAgVXNpbmcgMzIgbWVhbnMgYSBiYWxhbmNlZCAzLXdheSBzcGxpdCB3b3VsZCB3b3JrIHVwIHRvIDNeMzIgZWxlbWVudHMgKHJvdWdobHlcbiAgICAgICAgICAgMl41MCBvciAxMF4xNSkuIEdOVSByZWFjaGVzIGEgZGVwdGggb2YgMzIgYXQgNjU1MzYgZWxlbWVudHMuXG5cbiAgICAgICAgICAgRm9yIHNtYWxsIGFycmF5cywgdGhpcyBtYWtlcyB1cyBsZXNzIGxpa2VseSB0byBiYWlsIG91dCB0byBoZWFwIHNvcnQsIGJ1dCB0aGVcbiAgICAgICAgICAgMzIqTiBjb3N0IGJlZm9yZSB3ZSBkbyBpcyBub3QgdGhhdCBtdWNoLlxuXG4gICAgICAgICAgIEZvciBsYXJnZSBhcnJheXMsIHRoaXMgbWVhbnMgd2UgYXJlIG1vcmUgbGlrZWx5IHRvIGJhaWwgb3V0IHRvIGhlYXAgc29ydCBhdFxuICAgICAgICAgICBzb21lIHBvaW50IGlmIHdlIGdldCBzb21lIGJhZCBzcGxpdHMgb3IgaWYgdGhlIGFycmF5IGlzIGh1Z2UuIEJ1dCB0aGF0J3Mgb25seSBhXG4gICAgICAgICAgIGNvbnN0YW50IGZhY3RvciBjb3N0IGluIHRoZSBmaW5hbCBzdGFnZXMgb2YgcmVjdXJzaW9uLlxuXG4gICAgICAgICAgIEFsbCBpbiBhbGwsIHRoaXMgc2VlbXMgdG8gYmUgYSBzbWFsbCB0cmFkZW9mZiBhbmQgYXZvaWRzIHBheWluZyBhIGNvc3QgdG9cbiAgICAgICAgICAgY29tcHV0ZSBhIGxvZ2FyaXRobSBhdCB0aGUgc3RhcnQuICopXG4gICAgICAgIDMyXG4gICAgICBpblxuICAgICAgaW50cm9fc29ydCBhcnIgfm1heF9kZXB0aDpoZWFwX3NvcnRfc3dpdGNoX2RlcHRoIH5jb21wYXJlIH5sZWZ0IH5yaWdodFxuICAgIDs7XG4gIGVuZFxuZW5kXG5cbmxldCBzb3J0ID9wb3MgP2xlbiBhcnIgfmNvbXBhcmUgPVxuICBsZXQgcG9zLCBsZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uZ2V0X3Bvc19sZW5fZXhuICgpID9wb3MgP2xlbiB+dG90YWxfbGVuZ3RoOihsZW5ndGggYXJyKVxuICBpblxuICBTb3J0LkludHJvX3NvcnQuc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQ6cG9zIH5yaWdodDoocG9zICsgbGVuIC0gMSlcbjs7XG5cbmxldCB0b19hcnJheSB0ID0gdFxubGV0IGlzX2VtcHR5IHQgPSBsZW5ndGggdCA9IDBcblxubGV0IGlzX3NvcnRlZCB0IH5jb21wYXJlID1cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiB0cnVlIGluXG4gIHdoaWxlICFpID4gMCAmJiAhcmVzdWx0IGRvXG4gICAgbGV0IGVsdF9pID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgbGV0IGVsdF9pX21pbnVzXzEgPSB1bnNhZmVfZ2V0IHQgKCFpIC0gMSkgaW5cbiAgICBpZiBjb21wYXJlIGVsdF9pX21pbnVzXzEgZWx0X2kgPiAwIHRoZW4gcmVzdWx0IDo9IGZhbHNlO1xuICAgIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgaXNfc29ydGVkX3N0cmljdGx5IHQgfmNvbXBhcmUgPVxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIHRydWUgaW5cbiAgd2hpbGUgIWkgPiAwICYmICFyZXN1bHQgZG9cbiAgICBsZXQgZWx0X2kgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICBsZXQgZWx0X2lfbWludXNfMSA9IHVuc2FmZV9nZXQgdCAoIWkgLSAxKSBpblxuICAgIGlmIGNvbXBhcmUgZWx0X2lfbWludXNfMSBlbHRfaSA+PSAwIHRoZW4gcmVzdWx0IDo9IGZhbHNlO1xuICAgIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgbWVyZ2UgYTEgYTIgfmNvbXBhcmUgPVxuICBsZXQgbDEgPSBBcnJheS5sZW5ndGggYTEgaW5cbiAgbGV0IGwyID0gQXJyYXkubGVuZ3RoIGEyIGluXG4gIGlmIGwxID0gMFxuICB0aGVuIGNvcHkgYTJcbiAgZWxzZSBpZiBsMiA9IDBcbiAgdGhlbiBjb3B5IGExXG4gIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhMiAwKSAodW5zYWZlX2dldCBhMSAobDEgLSAxKSkgPj0gMFxuICB0aGVuIGFwcGVuZCBhMSBhMlxuICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYTEgMCkgKHVuc2FmZV9nZXQgYTIgKGwyIC0gMSkpID4gMFxuICB0aGVuIGFwcGVuZCBhMiBhMVxuICBlbHNlIChcbiAgICBsZXQgbGVuID0gbDEgKyBsMiBpblxuICAgIGxldCBtZXJnZWQgPSBjcmVhdGUgfmxlbiAodW5zYWZlX2dldCBhMSAwKSBpblxuICAgIGxldCBhMV9pbmRleCA9IHJlZiAwIGluXG4gICAgbGV0IGEyX2luZGV4ID0gcmVmIDAgaW5cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IHVzZV9hMSA9XG4gICAgICAgIGlmIGwxID0gIWExX2luZGV4XG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBpZiBsMiA9ICFhMl9pbmRleFxuICAgICAgICB0aGVuIHRydWVcbiAgICAgICAgZWxzZSBjb21wYXJlICh1bnNhZmVfZ2V0IGExICFhMV9pbmRleCkgKHVuc2FmZV9nZXQgYTIgIWEyX2luZGV4KSA8PSAwXG4gICAgICBpblxuICAgICAgaWYgdXNlX2ExXG4gICAgICB0aGVuIChcbiAgICAgICAgdW5zYWZlX3NldCBtZXJnZWQgaSAodW5zYWZlX2dldCBhMSAhYTFfaW5kZXgpO1xuICAgICAgICBhMV9pbmRleCA6PSAhYTFfaW5kZXggKyAxKVxuICAgICAgZWxzZSAoXG4gICAgICAgIHVuc2FmZV9zZXQgbWVyZ2VkIGkgKHVuc2FmZV9nZXQgYTIgIWEyX2luZGV4KTtcbiAgICAgICAgYTJfaW5kZXggOj0gIWEyX2luZGV4ICsgMSlcbiAgICBkb25lO1xuICAgIG1lcmdlZClcbjs7XG5cbmxldCBjb3B5X21hdHJpeCA9IG1hcCB+Zjpjb3B5XG5cbmxldCBmb2xkaW5nX21hcCB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIG1hcCB0IH5mOihmdW4geCAtPlxuICAgIGxldCBuZXdfYWNjLCB5ID0gZiAhYWNjIHggaW5cbiAgICBhY2MgOj0gbmV3X2FjYztcbiAgICB5KVxuOztcblxubGV0IGZvbGRfbWFwIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbGV0IHJlc3VsdCA9XG4gICAgbWFwIHQgfmY6KGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYywgeSA9IGYgIWFjYyB4IGluXG4gICAgICBhY2MgOj0gbmV3X2FjYztcbiAgICAgIHkpXG4gIGluXG4gICFhY2MsIHJlc3VsdFxuOztcblxubGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxubGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIHRcbmxldCBjb3VudCB0IH5mID0gQ29udGFpbmVyLmNvdW50IH5mb2xkIHQgfmZcbmxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcbmxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5sZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuXG5sZXQgZm9sZGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgYWNjIDo9IGYgaSAhYWNjICh1bnNhZmVfZ2V0IHQgaSlcbiAgZG9uZTtcbiAgIWFjY1xuOztcblxubGV0IGZvbGRpbmdfbWFwaSB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIG1hcGkgdCB+ZjooZnVuIGkgeCAtPlxuICAgIGxldCBuZXdfYWNjLCB5ID0gZiBpICFhY2MgeCBpblxuICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgIHkpXG47O1xuXG5sZXQgZm9sZF9tYXBpIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbGV0IHJlc3VsdCA9XG4gICAgbWFwaSB0IH5mOihmdW4gaSB4IC0+XG4gICAgICBsZXQgbmV3X2FjYywgeSA9IGYgaSAhYWNjIHggaW5cbiAgICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgICAgeSlcbiAgaW5cbiAgIWFjYywgcmVzdWx0XG47O1xuXG5sZXQgY291bnRpIHQgfmYgPVxuICBmb2xkaSB0IH5pbml0OjAgfmY6KGZ1biBpZHggY291bnQgYSAtPiBpZiBmIGlkeCBhIHRoZW4gY291bnQgKyAxIGVsc2UgY291bnQpXG47O1xuXG5sZXQgY29uY2F0X21hcCB0IH5mID0gY29uY2F0ICh0b19saXN0IChtYXAgfmYgdCkpXG5sZXQgY29uY2F0X21hcGkgdCB+ZiA9IGNvbmNhdCAodG9fbGlzdCAobWFwaSB+ZiB0KSlcblxubGV0IHJldl9pbnBsYWNlIHQgPVxuICBsZXQgaSA9IHJlZiAwIGluXG4gIGxldCBqID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIHdoaWxlICFpIDwgIWogZG9cbiAgICBzd2FwIHQgIWkgIWo7XG4gICAgaW5jciBpO1xuICAgIGRlY3IgalxuICBkb25lXG47O1xuXG5sZXQgcmV2IHQgPVxuICBsZXQgdCA9IGNvcHkgdCBpblxuICByZXZfaW5wbGFjZSB0O1xuICB0XG47O1xuXG5sZXQgb2ZfbGlzdF9yZXYgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFt8fF1cbiAgfCBhIDo6IGwgLT5cbiAgICBsZXQgbGVuID0gMSArIExpc3QubGVuZ3RoIGwgaW5cbiAgICBsZXQgdCA9IGNyZWF0ZSB+bGVuIGEgaW5cbiAgICBsZXQgciA9IHJlZiBsIGluXG4gICAgKCogV2Ugc3RhcnQgYXQgW2xlbiAtIDJdIGJlY2F1c2Ugd2UgYWxyZWFkeSBwdXQgW2FdIGF0IFt0LihsZW4gLSAxKV0uICopXG4gICAgZm9yIGkgPSBsZW4gLSAyIGRvd250byAwIGRvXG4gICAgICBtYXRjaCAhciB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBhIDo6IGwgLT5cbiAgICAgICAgdC4oaSkgPC0gYTtcbiAgICAgICAgciA6PSBsXG4gICAgZG9uZTtcbiAgICB0XG47O1xuXG4oKiBbb2ZfbGlzdF9tYXBdIGFuZCBbb2ZfbGlzdF9yZXZfbWFwXSBhcmUgYmFzZWQgb24gZnVuY3Rpb25zIGZyb20gdGhlIE9DYW1sXG4gICBkaXN0cmlidXRpb24uICopXG5cbmxldCBvZl9saXN0X21hcCB4cyB+ZiA9XG4gIG1hdGNoIHhzIHdpdGhcbiAgfCBbXSAtPiBbfHxdXG4gIHwgaGQgOjogdGwgLT5cbiAgICBsZXQgYSA9IGNyZWF0ZSB+bGVuOigxICsgTGlzdC5sZW5ndGggdGwpIChmIGhkKSBpblxuICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gYVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICB1bnNhZmVfc2V0IGEgaSAoZiBoZCk7XG4gICAgICAgIGZpbGwgKGkgKyAxKSB0bFxuICAgIGluXG4gICAgZmlsbCAxIHRsXG47O1xuXG5sZXQgb2ZfbGlzdF9tYXBpIHhzIH5mID1cbiAgbWF0Y2ggeHMgd2l0aFxuICB8IFtdIC0+IFt8fF1cbiAgfCBoZCA6OiB0bCAtPlxuICAgIGxldCBhID0gY3JlYXRlIH5sZW46KDEgKyBMaXN0Lmxlbmd0aCB0bCkgKGYgMCBoZCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgYSBpID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gYVxuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICB1bnNhZmVfc2V0IGEgaSAoZiBpIGhkKTtcbiAgICAgICAgZmlsbCBhIChpICsgMSkgdGxcbiAgICBpblxuICAgIGZpbGwgYSAxIHRsXG47O1xuXG5sZXQgb2ZfbGlzdF9yZXZfbWFwIHhzIH5mID1cbiAgbGV0IHQgPSBvZl9saXN0X21hcCB4cyB+ZiBpblxuICByZXZfaW5wbGFjZSB0O1xuICB0XG47O1xuXG5sZXQgb2ZfbGlzdF9yZXZfbWFwaSB4cyB+ZiA9XG4gIGxldCB0ID0gb2ZfbGlzdF9tYXBpIHhzIH5mIGluXG4gIHJldl9pbnBsYWNlIHQ7XG4gIHRcbjs7XG5cbmxldCBmaWx0ZXJfbWFwaSB0IH5mID1cbiAgbGV0IHIgPSByZWYgW3x8XSBpblxuICBsZXQgayA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICBtYXRjaCBmIGkgKHVuc2FmZV9nZXQgdCBpKSB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIGEgLT5cbiAgICAgIGlmICFrID0gMCB0aGVuIHIgOj0gY3JlYXRlIH5sZW46KGxlbmd0aCB0KSBhO1xuICAgICAgdW5zYWZlX3NldCAhciAhayBhO1xuICAgICAgaW5jciBrXG4gIGRvbmU7XG4gIGlmICFrID0gbGVuZ3RoIHQgdGhlbiAhciBlbHNlIGlmICFrID4gMCB0aGVuIHN1YiB+cG9zOjAgfmxlbjohayAhciBlbHNlIFt8fF1cbjs7XG5cbmxldCBmaWx0ZXJfbWFwIHQgfmYgPSBmaWx0ZXJfbWFwaSB0IH5mOihmdW4gX2kgYSAtPiBmIGEpXG5sZXQgZmlsdGVyX29wdCB0ID0gZmlsdGVyX21hcCB0IH5mOkZuLmlkXG5cbmxldCByYWlzZV9sZW5ndGhfbWlzbWF0Y2ggbmFtZSBuMSBuMiA9XG4gIGludmFsaWRfYXJnZiBcImxlbmd0aCBtaXNtYXRjaCBpbiAlczogJWQgPD4gJWRcIiBuYW1lIG4xIG4yICgpXG5bQEBjb2xkXSBbQEBpbmxpbmUgbmV2ZXJdIFtAQGxvY2FsIG5ldmVyXSBbQEBzcGVjaWFsaXNlIG5ldmVyXVxuOztcblxubGV0IGNoZWNrX2xlbmd0aDJfZXhuIG5hbWUgdDEgdDIgPVxuICBsZXQgbjEgPSBsZW5ndGggdDEgaW5cbiAgbGV0IG4yID0gbGVuZ3RoIHQyIGluXG4gIGlmIG4xIDw+IG4yIHRoZW4gcmFpc2VfbGVuZ3RoX21pc21hdGNoIG5hbWUgbjEgbjJcbjs7XG5cbmxldCBpdGVyMl9leG4gdDEgdDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIkFycmF5Lml0ZXIyX2V4blwiIHQxIHQyO1xuICBpdGVyaSB0MSB+ZjooZnVuIGkgeDEgLT4gZiB4MSAodW5zYWZlX2dldCB0MiBpKSlcbjs7XG5cbmxldCBtYXAyX2V4biB0MSB0MiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiQXJyYXkubWFwMl9leG5cIiB0MSB0MjtcbiAgaW5pdCAobGVuZ3RoIHQxKSB+ZjooZnVuIGkgLT4gZiAodW5zYWZlX2dldCB0MSBpKSAodW5zYWZlX2dldCB0MiBpKSlcbjs7XG5cbmxldCBmb2xkMl9leG4gdDEgdDIgfmluaXQgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIkFycmF5LmZvbGQyX2V4blwiIHQxIHQyO1xuICBmb2xkaSB0MSB+aW5pdCB+ZjooZnVuIGkgYWMgeCAtPiBmIGFjIHggKHVuc2FmZV9nZXQgdDIgaSkpXG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPSBmaWx0ZXJfbWFwIHQgfmY6KGZ1biB4IC0+IGlmIGYgeCB0aGVuIFNvbWUgeCBlbHNlIE5vbmUpXG5sZXQgZmlsdGVyaSB0IH5mID0gZmlsdGVyX21hcGkgdCB+ZjooZnVuIGkgeCAtPiBpZiBmIGkgeCB0aGVuIFNvbWUgeCBlbHNlIE5vbmUpXG5cblxubGV0IGV4aXN0cyB0IH5mID1cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiBmYWxzZSBpblxuICB3aGlsZSAhaSA+PSAwICYmIG5vdCAhcmVzdWx0IGRvXG4gICAgaWYgZiAodW5zYWZlX2dldCB0ICFpKSB0aGVuIHJlc3VsdCA6PSB0cnVlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBleGlzdHNpIHQgfmYgPVxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIGZhbHNlIGluXG4gIHdoaWxlICFpID49IDAgJiYgbm90ICFyZXN1bHQgZG9cbiAgICBpZiBmICFpICh1bnNhZmVfZ2V0IHQgIWkpIHRoZW4gcmVzdWx0IDo9IHRydWUgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IG1lbSB0IGEgfmVxdWFsID0gZXhpc3RzIHQgfmY6KGVxdWFsIGEpXG5cbmxldCBmb3JfYWxsIHQgfmYgPVxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIHRydWUgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiAhcmVzdWx0IGRvXG4gICAgaWYgbm90IChmICh1bnNhZmVfZ2V0IHQgIWkpKSB0aGVuIHJlc3VsdCA6PSBmYWxzZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgZm9yX2FsbGkgdCB+ZiA9XG4gIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiB0cnVlIGluXG4gIHdoaWxlICFpID49IDAgJiYgIXJlc3VsdCBkb1xuICAgIGlmIG5vdCAoZiAhaSAodW5zYWZlX2dldCB0ICFpKSkgdGhlbiByZXN1bHQgOj0gZmFsc2UgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGV4aXN0czJfZXhuIHQxIHQyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJBcnJheS5leGlzdHMyX2V4blwiIHQxIHQyO1xuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQxIC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiBmYWxzZSBpblxuICB3aGlsZSAhaSA+PSAwICYmIG5vdCAhcmVzdWx0IGRvXG4gICAgaWYgZiAodW5zYWZlX2dldCB0MSAhaSkgKHVuc2FmZV9nZXQgdDIgIWkpIHRoZW4gcmVzdWx0IDo9IHRydWUgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGZvcl9hbGwyX2V4biB0MSB0MiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiQXJyYXkuZm9yX2FsbDJfZXhuXCIgdDEgdDI7XG4gIGxldCBpID0gcmVmIChsZW5ndGggdDEgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIHRydWUgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiAhcmVzdWx0IGRvXG4gICAgaWYgbm90IChmICh1bnNhZmVfZ2V0IHQxICFpKSAodW5zYWZlX2dldCB0MiAhaSkpIHRoZW4gcmVzdWx0IDo9IGZhbHNlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBlcXVhbCBlcXVhbCB0MSB0MiA9IGxlbmd0aCB0MSA9IGxlbmd0aCB0MiAmJiBmb3JfYWxsMl9leG4gdDEgdDIgfmY6ZXF1YWxcblxuXG5sZXQgbWFwX2lucGxhY2UgdCB+ZiA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHQgaSAoZiAodW5zYWZlX2dldCB0IGkpKVxuICBkb25lXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIGZpbmRpX2ludGVybmFsIHQgfmYgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgaWYgbGVuZ3RoID0gMFxuICB0aGVuIGlmX25vdF9mb3VuZCAoKVxuICBlbHNlIChcbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IGZvdW5kID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IHZhbHVlX2ZvdW5kID0gcmVmICh1bnNhZmVfZ2V0IHQgMCkgaW5cbiAgICB3aGlsZSAobm90ICFmb3VuZCkgJiYgIWkgPCBsZW5ndGggZG9cbiAgICAgIGxldCB2YWx1ZSA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgICAgaWYgZiAhaSB2YWx1ZVxuICAgICAgdGhlbiAoXG4gICAgICAgIHZhbHVlX2ZvdW5kIDo9IHZhbHVlO1xuICAgICAgICBmb3VuZCA6PSB0cnVlKVxuICAgICAgZWxzZSBpbmNyIGlcbiAgICBkb25lO1xuICAgIGlmICFmb3VuZCB0aGVuIGlmX2ZvdW5kIH5pOiFpIH52YWx1ZTohdmFsdWVfZm91bmQgZWxzZSBpZl9ub3RfZm91bmQgKCkpXG47O1xuXG5sZXQgZmluZGkgdCB+ZiA9XG4gIGZpbmRpX2ludGVybmFsXG4gICAgdFxuICAgIH5mXG4gICAgfmlmX2ZvdW5kOihmdW4gfmkgfnZhbHVlIC0+IFNvbWUgKGksIHZhbHVlKSlcbiAgICB+aWZfbm90X2ZvdW5kOihmdW4gKCkgLT4gTm9uZSlcbjs7XG5cbmxldCBmaW5kaV9leG4gdCB+ZiA9XG4gIGZpbmRpX2ludGVybmFsXG4gICAgdFxuICAgIH5mXG4gICAgfmlmX2ZvdW5kOihmdW4gfmkgfnZhbHVlIC0+IGksIHZhbHVlKVxuICAgIH5pZl9ub3RfZm91bmQ6KGZ1biAoKSAtPiByYWlzZSAoTm90X2ZvdW5kX3MgKEF0b20gXCJBcnJheS5maW5kaV9leG46IG5vdCBmb3VuZFwiKSkpXG47O1xuXG5sZXQgZmluZF9leG4gdCB+ZiA9XG4gIGZpbmRpX2ludGVybmFsXG4gICAgdFxuICAgIH5mOihmdW4gX2kgeCAtPiBmIHgpXG4gICAgfmlmX2ZvdW5kOihmdW4gfmk6XyB+dmFsdWUgLT4gdmFsdWUpXG4gICAgfmlmX25vdF9mb3VuZDooZnVuICgpIC0+IHJhaXNlIChOb3RfZm91bmRfcyAoQXRvbSBcIkFycmF5LmZpbmRfZXhuOiBub3QgZm91bmRcIikpKVxuOztcblxubGV0IGZpbmQgdCB+ZiA9IE9wdGlvbi5tYXAgKGZpbmRpIHQgfmY6KGZ1biBfaSB4IC0+IGYgeCkpIH5mOihmdW4gKF9pLCB4KSAtPiB4KVxuXG5sZXQgZmluZF9tYXAgdCB+ZiA9XG4gIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICBpZiBsZW5ndGggPSAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IHZhbHVlX2ZvdW5kID0gcmVmIE5vbmUgaW5cbiAgICB3aGlsZSBPcHRpb24uaXNfbm9uZSAhdmFsdWVfZm91bmQgJiYgIWkgPCBsZW5ndGggZG9cbiAgICAgIGxldCB2YWx1ZSA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgICAgdmFsdWVfZm91bmQgOj0gZiB2YWx1ZTtcbiAgICAgIGluY3IgaVxuICAgIGRvbmU7XG4gICAgIXZhbHVlX2ZvdW5kKVxuOztcblxubGV0IGZpbmRfbWFwX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkFycmF5LmZpbmRfbWFwX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBmaW5kX21hcF9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZF9tYXAgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgU29tZSB4IC0+IHhcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX21hcF9leG5cbjs7XG5cbmxldCBmaW5kX21hcGkgdCB+ZiA9XG4gIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICBpZiBsZW5ndGggPSAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IHZhbHVlX2ZvdW5kID0gcmVmIE5vbmUgaW5cbiAgICB3aGlsZSBPcHRpb24uaXNfbm9uZSAhdmFsdWVfZm91bmQgJiYgIWkgPCBsZW5ndGggZG9cbiAgICAgIGxldCB2YWx1ZSA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgICAgdmFsdWVfZm91bmQgOj0gZiAhaSB2YWx1ZTtcbiAgICAgIGluY3IgaVxuICAgIGRvbmU7XG4gICAgIXZhbHVlX2ZvdW5kKVxuOztcblxubGV0IGZpbmRfbWFwaV9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJBcnJheS5maW5kX21hcGlfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGZpbmRfbWFwaV9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZF9tYXBpIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IFNvbWUgeCAtPiB4XG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9tYXBpX2V4blxuOztcblxubGV0IGZpbmRfY29uc2VjdXRpdmVfZHVwbGljYXRlIHQgfmVxdWFsID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBpZiBuIDw9IDFcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCByZXN1bHQgPSByZWYgTm9uZSBpblxuICAgIGxldCBpID0gcmVmIDEgaW5cbiAgICBsZXQgcHJldiA9IHJlZiAodW5zYWZlX2dldCB0IDApIGluXG4gICAgd2hpbGUgIWkgPCBuIGRvXG4gICAgICBsZXQgY3VyID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgICBpZiBlcXVhbCBjdXIgIXByZXZcbiAgICAgIHRoZW4gKFxuICAgICAgICByZXN1bHQgOj0gU29tZSAoIXByZXYsIGN1cik7XG4gICAgICAgIGkgOj0gbilcbiAgICAgIGVsc2UgKFxuICAgICAgICBwcmV2IDo9IGN1cjtcbiAgICAgICAgaW5jciBpKVxuICAgIGRvbmU7XG4gICAgIXJlc3VsdClcbjs7XG5cbmxldCByZWR1Y2UgdCB+ZiA9XG4gIGlmIGxlbmd0aCB0ID0gMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IHIgPSByZWYgKHVuc2FmZV9nZXQgdCAwKSBpblxuICAgIGZvciBpID0gMSB0byBsZW5ndGggdCAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCB0IGkpXG4gICAgZG9uZTtcbiAgICBTb21lICFyKVxuOztcblxubGV0IHJlZHVjZV9leG4gdCB+ZiA9XG4gIG1hdGNoIHJlZHVjZSB0IH5mIHdpdGhcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnIFwiQXJyYXkucmVkdWNlX2V4blwiXG4gIHwgU29tZSB2IC0+IHZcbjs7XG5cbmxldCBwZXJtdXRlID0gQXJyYXlfcGVybXV0ZS5wZXJtdXRlXG5cbmxldCByYW5kb21fZWxlbWVudF9leG4gPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgdCA9XG4gIGlmIGlzX2VtcHR5IHRcbiAgdGhlbiBmYWlsd2l0aCBcIkFycmF5LnJhbmRvbV9lbGVtZW50X2V4bjogZW1wdHkgYXJyYXlcIlxuICBlbHNlIHQuKFJhbmRvbS5TdGF0ZS5pbnQgcmFuZG9tX3N0YXRlIChsZW5ndGggdCkpXG47O1xuXG5sZXQgcmFuZG9tX2VsZW1lbnQgPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgdCA9XG4gIHRyeSBTb21lIChyYW5kb21fZWxlbWVudF9leG4gfnJhbmRvbV9zdGF0ZSB0KSB3aXRoXG4gIHwgXyAtPiBOb25lXG47O1xuXG5sZXQgemlwIHQxIHQyID1cbiAgaWYgbGVuZ3RoIHQxIDw+IGxlbmd0aCB0MiB0aGVuIE5vbmUgZWxzZSBTb21lIChtYXAyX2V4biB0MSB0MiB+ZjooZnVuIHgxIHgyIC0+IHgxLCB4MikpXG47O1xuXG5sZXQgemlwX2V4biB0MSB0MiA9XG4gIGlmIGxlbmd0aCB0MSA8PiBsZW5ndGggdDJcbiAgdGhlbiBmYWlsd2l0aCBcIkFycmF5LnppcF9leG5cIlxuICBlbHNlIG1hcDJfZXhuIHQxIHQyIH5mOihmdW4geDEgeDIgLT4geDEsIHgyKVxuOztcblxubGV0IHVuemlwIHQgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gW3x8XSwgW3x8XVxuICBlbHNlIChcbiAgICBsZXQgeCwgeSA9IHQuKDApIGluXG4gICAgbGV0IHJlczEgPSBjcmVhdGUgfmxlbjpuIHggaW5cbiAgICBsZXQgcmVzMiA9IGNyZWF0ZSB+bGVuOm4geSBpblxuICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgbGV0IHgsIHkgPSB0LihpKSBpblxuICAgICAgcmVzMS4oaSkgPC0geDtcbiAgICAgIHJlczIuKGkpIDwtIHlcbiAgICBkb25lO1xuICAgIHJlczEsIHJlczIpXG47O1xuXG5sZXQgc29ydGVkX2NvcHkgdCB+Y29tcGFyZSA9XG4gIGxldCB0MSA9IGNvcHkgdCBpblxuICBzb3J0IHQxIH5jb21wYXJlO1xuICB0MVxuOztcblxubGV0IHBhcnRpdGlvbmlfdGYgdCB+ZiA9XG4gIGxldCBib3RoID0gbWFwaSB0IH5mOihmdW4gaSB4IC0+IGlmIGYgaSB4IHRoZW4gRWl0aGVyLkZpcnN0IHggZWxzZSBFaXRoZXIuU2Vjb25kIHgpIGluXG4gIGxldCB0cnVlcyA9XG4gICAgZmlsdGVyX21hcCBib3RoIH5mOihmdW5jdGlvblxuICAgICAgfCBGaXJzdCB4IC0+IFNvbWUgeFxuICAgICAgfCBTZWNvbmQgXyAtPiBOb25lKVxuICBpblxuICBsZXQgZmFsc2VzID1cbiAgICBmaWx0ZXJfbWFwIGJvdGggfmY6KGZ1bmN0aW9uXG4gICAgICB8IEZpcnN0IF8gLT4gTm9uZVxuICAgICAgfCBTZWNvbmQgeCAtPiBTb21lIHgpXG4gIGluXG4gIHRydWVzLCBmYWxzZXNcbjs7XG5cbmxldCBwYXJ0aXRpb25fdGYgdCB+ZiA9IHBhcnRpdGlvbmlfdGYgdCB+ZjooZnVuIF9pIHggLT4gZiB4KVxubGV0IGxhc3QgdCA9IHQuKGxlbmd0aCB0IC0gMSlcblxuKCogQ29udmVydCB0byBhIHNlcXVlbmNlIGJ1dCBkb2VzIG5vdCBhdHRlbXB0IHRvIHByb3RlY3QgYWdhaW5zdCBtb2RpZmljYXRpb25cbiAgIGluIHRoZSBhcnJheS4gKilcbmxldCB0b19zZXF1ZW5jZV9tdXRhYmxlIHQgPVxuICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdDowIH5mOihmdW4gaSAtPlxuICAgIGlmIGkgPj0gbGVuZ3RoIHQgdGhlbiBTZXF1ZW5jZS5TdGVwLkRvbmUgZWxzZSBTZXF1ZW5jZS5TdGVwLllpZWxkICh0LihpKSwgaSArIDEpKVxuOztcblxubGV0IHRvX3NlcXVlbmNlIHQgPSB0b19zZXF1ZW5jZV9tdXRhYmxlIChjb3B5IHQpXG5cbmxldCBjYXJ0ZXNpYW5fcHJvZHVjdCB0MSB0MiA9XG4gIGlmIGlzX2VtcHR5IHQxIHx8IGlzX2VtcHR5IHQyXG4gIHRoZW4gW3x8XVxuICBlbHNlIChcbiAgICBsZXQgbjEgPSBsZW5ndGggdDEgaW5cbiAgICBsZXQgbjIgPSBsZW5ndGggdDIgaW5cbiAgICBsZXQgdCA9IGNyZWF0ZSB+bGVuOihuMSAqIG4yKSAodDEuKDApLCB0Mi4oMCkpIGluXG4gICAgbGV0IHIgPSByZWYgMCBpblxuICAgIGZvciBpMSA9IDAgdG8gbjEgLSAxIGRvXG4gICAgICBmb3IgaTIgPSAwIHRvIG4yIC0gMSBkb1xuICAgICAgICB0LighcikgPC0gdDEuKGkxKSwgdDIuKGkyKTtcbiAgICAgICAgaW5jciByXG4gICAgICBkb25lXG4gICAgZG9uZTtcbiAgICB0KVxuOztcblxubGV0IHRyYW5zcG9zZSB0dCA9XG4gIGlmIGxlbmd0aCB0dCA9IDBcbiAgdGhlbiBTb21lIFt8fF1cbiAgZWxzZSAoXG4gICAgbGV0IHdpZHRoID0gbGVuZ3RoIHR0IGluXG4gICAgbGV0IGRlcHRoID0gbGVuZ3RoIHR0LigwKSBpblxuICAgIGlmIGV4aXN0cyB0dCB+ZjooZnVuIHQgLT4gbGVuZ3RoIHQgPD4gZGVwdGgpXG4gICAgdGhlbiBOb25lXG4gICAgZWxzZSBTb21lIChpbml0IGRlcHRoIH5mOihmdW4gZCAtPiBpbml0IHdpZHRoIH5mOihmdW4gdyAtPiB0dC4odykuKGQpKSkpKVxuOztcblxubGV0IHRyYW5zcG9zZV9leG4gdHQgPVxuICBtYXRjaCB0cmFuc3Bvc2UgdHQgd2l0aFxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmcgXCJBcnJheS50cmFuc3Bvc2VfZXhuXCJcbiAgfCBTb21lIHR0JyAtPiB0dCdcbjs7XG5cbmluY2x1ZGUgQmluYXJ5X3NlYXJjaGFibGUuTWFrZTEgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgZ2V0ID0gZ2V0XG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICBlbmQpXG5cbmluY2x1ZGUgQmxpdC5NYWtlMSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcblxuICAgIGxldCBjcmVhdGVfbGlrZSB+bGVuIHQgPVxuICAgICAgaWYgbGVuID0gMFxuICAgICAgdGhlbiBbfHxdXG4gICAgICBlbHNlIChcbiAgICAgICAgYXNzZXJ0IChsZW5ndGggdCA+IDApO1xuICAgICAgICBjcmVhdGUgfmxlbiB0LigwKSlcbiAgICA7O1xuXG4gICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRcbiAgZW5kKVxuXG5sZXQgaW52YXJpYW50IGludmFyaWFudF9hIHQgPSBpdGVyIHQgfmY6aW52YXJpYW50X2FcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIFNvcnQgPSBTb3J0XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEludCA9IEludDBcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcblxuKCogV2UgbWFpbnRhaW4gdGhlIHByb3BlcnR5IHRoYXQgYWxsIHZhbHVlcyBvZiB0eXBlIFt0XSBkbyBub3QgaGF2ZSB0aGUgdGFnXG4gICBbZG91YmxlX2FycmF5X3RhZ10uICBTb21lIGZ1bmN0aW9ucyBiZWxvdyBhc3N1bWUgdGhpcyBpbiBvcmRlciB0byBhdm9pZCB0ZXN0aW5nIHRoZVxuICAgdGFnLCBhbmQgd2lsbCBzZWdmYXVsdCBpZiB0aGlzIHByb3BlcnR5IGRvZXNuJ3QgaG9sZC4gKilcbnR5cGUgdCA9IENhbWwuT2JqLnQgYXJyYXlcblxubGV0IGludmFyaWFudCB0ID0gYXNzZXJ0IChDYW1sLk9iai50YWcgKENhbWwuT2JqLnJlcHIgdCkgPD4gQ2FtbC5PYmouZG91YmxlX2FycmF5X3RhZylcbmxldCBsZW5ndGggPSBBcnJheS5sZW5ndGggKCogd291bGQgY2hlY2sgZm9yIGZsb2F0IGFycmF5cyBpbiAzMiBiaXQsIGJ1dCB3aGF0ZXZlciAqKVxuXG5sZXQgc2V4cF9vZl90IHQgPVxuICBTZXhwLkF0b21cbiAgICAoU3RyaW5nLmNvbmNhdCB+c2VwOlwiXCIgWyBcIjxPYmpfYXJyYXkudCBvZiBsZW5ndGggXCI7IEludC50b19zdHJpbmcgKGxlbmd0aCB0KTsgXCI+XCIgXSlcbjs7XG5cbmxldCB6ZXJvX29iaiA9IENhbWwuT2JqLnJlcHIgKDAgOiBpbnQpXG5cbigqIFdlIGNhbGwgW0FycmF5LmNyZWF0ZV0gd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGEgZmxvYXQgc28gdGhhdCB0aGUgYXJyYXkgZG9lc24ndCBnZXRcbiAgIHRhZ2dlZCB3aXRoIFtEb3VibGVfYXJyYXlfdGFnXS4gKilcbmxldCBjcmVhdGVfemVybyB+bGVuID0gQXJyYXkuY3JlYXRlIH5sZW4gemVyb19vYmpcbmxldCBlbXB0eSA9IFt8fF1cblxudHlwZSBub3RfYV9mbG9hdCA9XG4gIHwgTm90X2FfZmxvYXRfMFxuICB8IE5vdF9hX2Zsb2F0XzEgb2YgaW50XG5cbmxldCBfbm90X2FfZmxvYXRfMCA9IE5vdF9hX2Zsb2F0XzBcbmxldCBfbm90X2FfZmxvYXRfMSA9IE5vdF9hX2Zsb2F0XzEgNDJcblxubGV0IGdldCB0IGkgPVxuICAoKiBNYWtlIHRoZSBjb21waWxlciBiZWxpZXZlIFt0XSBpcyBhbiBhcnJheSBub3QgY29udGFpbmluZyBmbG9hdHMgc28gaXQgZG9lcyBub3QgY2hlY2tcbiAgICAgaWYgW3RdIGlzIHRhZ2dlZCB3aXRoIFtEb3VibGVfYXJyYXlfdGFnXS4gIEl0IGlzIE5PVCBvayB0byB1c2UgW2ludCBhcnJheV0gc2luY2UgKGlmXG4gICAgIHRoaXMgZnVuY3Rpb24gaXMgaW5saW5lZCBhbmQgdGhlIGFycmF5IGNvbnRhaW5zIGluLWhlYXAgYm94ZWQgdmFsdWVzKSB3cm9uZyByZWdpc3RlclxuICAgICB0eXBpbmcgbWF5IHJlc3VsdCwgbGVhZGluZyB0byBhIGZhaWx1cmUgdG8gcmVnaXN0ZXIgbmVjZXNzYXJ5IEdDIHJvb3RzLiAqKVxuICBDYW1sLk9iai5yZXByICgoQ2FtbC5PYmoubWFnaWMgKHQgOiB0KSA6IG5vdF9hX2Zsb2F0IGFycmF5KS4oaSkgOiBub3RfYV9mbG9hdClcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gdW5zYWZlX2dldCB0IGkgPVxuICAoKiBNYWtlIHRoZSBjb21waWxlciBiZWxpZXZlIFt0XSBpcyBhbiBhcnJheSBub3QgY29udGFpbmluZyBmbG9hdHMgc28gaXQgZG9lcyBub3QgY2hlY2tcbiAgICAgaWYgW3RdIGlzIHRhZ2dlZCB3aXRoIFtEb3VibGVfYXJyYXlfdGFnXS4gKilcbiAgQ2FtbC5PYmoucmVwclxuICAgIChBcnJheS51bnNhZmVfZ2V0IChDYW1sLk9iai5tYWdpYyAodCA6IHQpIDogbm90X2FfZmxvYXQgYXJyYXkpIGkgOiBub3RfYV9mbG9hdClcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmogPVxuICAoKiBTYW1lIGNvbW1lbnQgYXMgW3Vuc2FmZV9nZXRdLiBTeXMub3BhcXVlX2lkZW50aXR5IHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tXG4gICAgIHBvdGVudGlhbGx5IHdyb25nbHkgZ3Vlc3NpbmcgdGhlIHR5cGUgb2YgdGhlIGFycmF5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVsZW1lbnQsIHRoYXRcbiAgICAgaXMgcHJldmVudCB0aGUgaW1wbGljYXRpb246IChPYmoudGFnIG9iaiA9IE9iai5kb3VibGVfdGFnKSA9PiAoT2JqLnRhZyB0ID1cbiAgICAgT2JqLmRvdWJsZV9hcnJheV90YWcpIHdoaWNoIGZsYW1iZGEgaGFzIHRyaWVkIGluIHRoZSBwYXN0IChhdCBsZWFzdCB0aGF0J3MgYXNzdW1pbmdcbiAgICAgdGhlIGNvbXBpbGVyIHJlc3BlY3RzIFN5cy5vcGFxdWVfaWRlbnRpdHksIHdoaWNoIGlzIG5vdCBhbHdheXMgdGhlIGNhc2UpLiAqKVxuICBBcnJheS51bnNhZmVfc2V0XG4gICAgKENhbWwuT2JqLm1hZ2ljICh0IDogdCkgOiBub3RfYV9mbG9hdCBhcnJheSlcbiAgICBpXG4gICAgKENhbWwuT2JqLm9iaiAoU3lzLm9wYXF1ZV9pZGVudGl0eSBvYmopIDogbm90X2FfZmxvYXQpXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHNldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmogPVxuICAoKiBzYW1lIGFzIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSBidXQgc2FmZSAqKVxuICAoQ2FtbC5PYmoubWFnaWMgKHQgOiB0KSA6IG5vdF9hX2Zsb2F0IGFycmF5KS4oaSlcbiAgPC0gKENhbWwuT2JqLm9iaiAoU3lzLm9wYXF1ZV9pZGVudGl0eSBvYmopIDogbm90X2FfZmxvYXQpXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIGludCA9XG4gICgqIFRoaXMgc2tpcHMgW2NhbWxfbW9kaWZ5XSwgd2hpY2ggaXMgT0sgaWYgYm90aCB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBpbnRlZ2Vycy4gKilcbiAgQXJyYXkudW5zYWZlX3NldCAoQ2FtbC5PYmoubWFnaWMgKHQgOiB0KSA6IGludCBhcnJheSkgaSAoU3lzLm9wYXF1ZV9pZGVudGl0eSBpbnQpXG47O1xuXG4oKiBGb3IgW3NldF0gYW5kIFt1bnNhZmVfc2V0XSwgaWYgYSBwb2ludGVyIGlzIGludm9sdmVkLCB3ZSBmaXJzdCBkbyBhIHBoeXNpY2FsLWVxdWFsaXR5XG4gICB0ZXN0IHRvIHNlZSBpZiB0aGUgcG9pbnRlciBpcyBjaGFuZ2luZy4gIElmIG5vdCwgd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGUgW3NldF0sIHdoaWNoXG4gICBzYXZlcyBhIGNhbGwgdG8gW2NhbWxfbW9kaWZ5XS4gIFdlIHRoaW5rIHRoaXMgcGh5c2ljYWwtZXF1YWxpdHkgdGVzdCBpcyB3b3J0aCBpdFxuICAgYmVjYXVzZSBpdCBpcyB2ZXJ5IGNoZWFwIChib3RoIHZhbHVlcyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgZnJvbSB0aGUgW2lzX2ludF0gdGVzdClcbiAgIGFuZCBiZWNhdXNlIFtjYW1sX21vZGlmeV0gaXMgZXhwZW5zaXZlLiAqKVxuXG5sZXQgc2V0IHQgaSBvYmogPVxuICAoKiBXZSB1c2UgW2dldF0gZmlyc3QgYnV0IHRoZW4gd2UgdXNlIFtBcnJheS51bnNhZmVfc2V0XSBzaW5jZSB3ZSBrbm93IHRoYXQgW2ldIGlzXG4gICAgIHZhbGlkLiAqKVxuICBsZXQgb2xkX29iaiA9IGdldCB0IGkgaW5cbiAgaWYgQ2FtbC5PYmouaXNfaW50IG9sZF9vYmogJiYgQ2FtbC5PYmouaXNfaW50IG9ialxuICB0aGVuIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIChDYW1sLk9iai5vYmogb2JqIDogaW50KVxuICBlbHNlIGlmIG5vdCAocGh5c19lcXVhbCBvbGRfb2JqIG9iailcbiAgdGhlbiB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9ialxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSB1bnNhZmVfc2V0IHQgaSBvYmogPVxuICBsZXQgb2xkX29iaiA9IHVuc2FmZV9nZXQgdCBpIGluXG4gIGlmIENhbWwuT2JqLmlzX2ludCBvbGRfb2JqICYmIENhbWwuT2JqLmlzX2ludCBvYmpcbiAgdGhlbiB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSAoQ2FtbC5PYmoub2JqIG9iaiA6IGludClcbiAgZWxzZSBpZiBub3QgKHBoeXNfZXF1YWwgb2xkX29iaiBvYmopXG4gIHRoZW4gdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmpcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gdW5zYWZlX3NldF9vbWl0X3BoeXNfZXF1YWxfY2hlY2sgdCBpIG9iaiA9XG4gIGxldCBvbGRfb2JqID0gdW5zYWZlX2dldCB0IGkgaW5cbiAgaWYgQ2FtbC5PYmouaXNfaW50IG9sZF9vYmogJiYgQ2FtbC5PYmouaXNfaW50IG9ialxuICB0aGVuIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIChDYW1sLk9iai5vYmogb2JqIDogaW50KVxuICBlbHNlIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqXG47O1xuXG5sZXQgc3dhcCB0IGkgaiA9XG4gIGxldCBhID0gZ2V0IHQgaSBpblxuICBsZXQgYiA9IGdldCB0IGogaW5cbiAgdW5zYWZlX3NldCB0IGkgYjtcbiAgdW5zYWZlX3NldCB0IGogYVxuOztcblxubGV0IGNyZWF0ZSB+bGVuIHggPVxuICAoKiBJZiB3ZSBjYW4sIHVzZSBbQXJyYXkuY3JlYXRlXSBkaXJlY3RseS4gKilcbiAgaWYgQ2FtbC5PYmoudGFnIHggPD4gQ2FtbC5PYmouZG91YmxlX3RhZ1xuICB0aGVuIEFycmF5LmNyZWF0ZSB+bGVuIHhcbiAgZWxzZSAoXG4gICAgKCogT3RoZXJ3aXNlIHVzZSBbY3JlYXRlX3plcm9dIGFuZCBzZXQgdGhlIGNvbnRlbnRzICopXG4gICAgbGV0IHQgPSBjcmVhdGVfemVybyB+bGVuIGluXG4gICAgbGV0IHggPSBTeXMub3BhcXVlX2lkZW50aXR5IHggaW5cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSB4XG4gICAgZG9uZTtcbiAgICB0KVxuOztcblxubGV0IHNpbmdsZXRvbiBvYmogPSBjcmVhdGUgfmxlbjoxIG9ialxuXG4oKiBQcmUtY29uZGl0aW9uOiB0LihpKSBpcyBhbiBpbnRlZ2VyLiAqKVxubGV0IHVuc2FmZV9zZXRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgb2JqID1cbiAgaWYgQ2FtbC5PYmouaXNfaW50IG9ialxuICB0aGVuIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIChDYW1sLk9iai5vYmogb2JqIDogaW50KVxuICBlbHNlXG4gICAgKCogW3QuKGkpXSBpcyBhbiBpbnRlZ2VyIGFuZCBbb2JqXSBpcyBub3QsIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrIGlmIHRoZXkgYXJlXG4gICAgICAgZXF1YWwuICopXG4gICAgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmpcbjs7XG5cbmxldCB1bnNhZmVfc2V0X2ludCB0IGkgaW50ID1cbiAgbGV0IG9sZF9vYmogPSB1bnNhZmVfZ2V0IHQgaSBpblxuICBpZiBDYW1sLk9iai5pc19pbnQgb2xkX29ialxuICB0aGVuIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIGludFxuICBlbHNlIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgKENhbWwuT2JqLnJlcHIgaW50KVxuOztcblxubGV0IHVuc2FmZV9jbGVhcl9pZl9wb2ludGVyIHQgaSA9XG4gIGxldCBvbGRfb2JqID0gdW5zYWZlX2dldCB0IGkgaW5cbiAgaWYgbm90IChDYW1sLk9iai5pc19pbnQgb2xkX29iaikgdGhlbiB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIChDYW1sLk9iai5yZXByIDApXG47O1xuXG4oKiogW3Vuc2FmZV9ibGl0XSBpcyBsaWtlIFtBcnJheS5ibGl0XSwgZXhjZXB0IGl0IHVzZXMgb3VyIG93biBmb3ItbG9vcCB0byBhdm9pZFxuICAgIGNhbWxfbW9kaWZ5IHdoZW4gcG9zc2libGUuICBJdHMgcGVyZm9ybWFuY2UgaXMgc3RpbGwgbm90IGNvbXBhcmFibGUgdG8gYSBtZW1jcHkuICopXG5sZXQgdW5zYWZlX2JsaXQgfnNyYyB+c3JjX3BvcyB+ZHN0IH5kc3RfcG9zIH5sZW4gPVxuICAoKiBXaGVuIFtwaHlzX2VxdWFsIHNyYyBkc3RdLCB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgW2RzdF9wb3MgPCBzcmNfcG9zXSBhbmQgaGF2ZSB0aGVcbiAgICAgZm9yIGxvb3AgZ28gaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbiBzbyB0aGF0IHdlIGRvbid0IG92ZXJ3cml0ZSBkYXRhIHRoYXQgd2Ugc3RpbGwgbmVlZFxuICAgICB0byByZWFkLiAgV2hlbiBbbm90IChwaHlzX2VxdWFsIHNyYyBkc3QpXSwgZG9pbmcgdGhpcyBpcyBoYXJtbGVzcy4gIEZyb20gYVxuICAgICBtZW1vcnktcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmUsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgb25lIGxvb3BzIHVwIG9yIGRvd24uXG4gICAgIENvbnN0YW50LXN0cmlkZSBhY2Nlc3MsIGZvcndhcmQgb3IgYmFja3dhcmQsIHNob3VsZCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSAoYXQgbGVhc3Qgb25cbiAgICAgYW4gaW50ZWwgaTcpLiAgU28sIHdlIGRvbid0IGRvIGEgY2hlY2sgZm9yIFtwaHlzX2VxdWFsIHNyYyBkc3RdIGFuZCBhbHdheXMgbG9vcCB1cCBpblxuICAgICB0aGF0IGNhc2UuICopXG4gIGlmIGRzdF9wb3MgPCBzcmNfcG9zXG4gIHRoZW5cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCBkc3QgKGRzdF9wb3MgKyBpKSAodW5zYWZlX2dldCBzcmMgKHNyY19wb3MgKyBpKSlcbiAgICBkb25lXG4gIGVsc2VcbiAgICBmb3IgaSA9IGxlbiAtIDEgZG93bnRvIDAgZG9cbiAgICAgIHVuc2FmZV9zZXQgZHN0IChkc3RfcG9zICsgaSkgKHVuc2FmZV9nZXQgc3JjIChzcmNfcG9zICsgaSkpXG4gICAgZG9uZVxuOztcblxuaW5jbHVkZSBCbGl0Lk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgY3JlYXRlID0gY3JlYXRlX3plcm9cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRcbiAgZW5kKVxuXG5sZXQgY29weSBzcmMgPVxuICBsZXQgZHN0ID0gY3JlYXRlX3plcm8gfmxlbjoobGVuZ3RoIHNyYykgaW5cbiAgYmxpdG8gfnNyYyB+ZHN0ICgpO1xuICBkc3Rcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuKCogV0FSTklORzpcbiAgIFdlIHVzZSBub24tbWVtb3J5LXNhZmUgdGhpbmdzIHRocm91Z2hvdXQgdGhlIFtUcnVzdGVkXSBtb2R1bGUuXG4gICBNb3N0IG9mIGl0IGlzIG9ubHkgc2FmZSBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSB0eXBlIHNpZ25hdHVyZSAoZS5nLiBleHBvc2luZ1xuICAgW3ZhbCBjb3B5IDogJ2EgdCAtPiAnYiB0XSB3b3VsZCBiZSBhIGJpZyBtaXN0YWtlKS4gKilcbm1vZHVsZSBUcnVzdGVkIDogc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBlbXB0eSA6ICdhIHRcbiAgdmFsIHVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCA6IGxlbjppbnQgLT4gJ2EgdFxuICB2YWwgY3JlYXRlX29ial9hcnJheSA6IGxlbjppbnQgLT4gJ2EgdFxuICB2YWwgY3JlYXRlIDogbGVuOmludCAtPiAnYSAtPiAnYSB0XG4gIHZhbCBzaW5nbGV0b24gOiAnYSAtPiAnYSB0XG4gIHZhbCBnZXQgOiAnYSB0IC0+IGludCAtPiAnYVxuICB2YWwgc2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgc3dhcCA6IF8gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9nZXQgOiAnYSB0IC0+IGludCAtPiAnYVxuICB2YWwgdW5zYWZlX3NldCA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9zZXRfb21pdF9waHlzX2VxdWFsX2NoZWNrIDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgdW5zYWZlX3NldF9pbnQgOiAnYSB0IC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICB2YWwgdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCA6ICdhIHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4gIHZhbCB1bnNhZmVfc2V0X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCBzZXRfd2l0aF9jYW1sX21vZGlmeSA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gIHZhbCB1bnNhZmVfYmxpdCA6ICgnYSB0LCAnYSB0KSBCbGl0LmJsaXRcbiAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgdmFsIHVuc2FmZV9jbGVhcl9pZl9wb2ludGVyIDogXyB0IC0+IGludCAtPiB1bml0XG5lbmQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gT2JqX2FycmF5LnRcblxuICBsZXQgZW1wdHkgPSBPYmpfYXJyYXkuZW1wdHlcbiAgbGV0IHVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCB+bGVuID0gT2JqX2FycmF5LmNyZWF0ZV96ZXJvIH5sZW5cbiAgbGV0IGNyZWF0ZV9vYmpfYXJyYXkgfmxlbiA9IE9ial9hcnJheS5jcmVhdGVfemVybyB+bGVuXG4gIGxldCBjcmVhdGUgfmxlbiB4ID0gT2JqX2FycmF5LmNyZWF0ZSB+bGVuIChDYW1sLk9iai5yZXByIHgpXG4gIGxldCBzaW5nbGV0b24geCA9IE9ial9hcnJheS5zaW5nbGV0b24gKENhbWwuT2JqLnJlcHIgeClcbiAgbGV0IHN3YXAgdCBpIGogPSBPYmpfYXJyYXkuc3dhcCB0IGkgalxuICBsZXQgZ2V0IGFyciBpID0gQ2FtbC5PYmoub2JqIChPYmpfYXJyYXkuZ2V0IGFyciBpKVxuICBsZXQgc2V0IGFyciBpIHggPSBPYmpfYXJyYXkuc2V0IGFyciBpIChDYW1sLk9iai5yZXByIHgpXG4gIGxldCB1bnNhZmVfZ2V0IGFyciBpID0gQ2FtbC5PYmoub2JqIChPYmpfYXJyYXkudW5zYWZlX2dldCBhcnIgaSlcbiAgbGV0IHVuc2FmZV9zZXQgYXJyIGkgeCA9IE9ial9hcnJheS51bnNhZmVfc2V0IGFyciBpIChDYW1sLk9iai5yZXByIHgpXG4gIGxldCB1bnNhZmVfc2V0X2ludCBhcnIgaSB4ID0gT2JqX2FycmF5LnVuc2FmZV9zZXRfaW50IGFyciBpIHhcblxuICBsZXQgdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCBhcnIgaSB4ID1cbiAgICBPYmpfYXJyYXkudW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCBhcnIgaSB4XG4gIDs7XG5cbiAgbGV0IHVuc2FmZV9zZXRfYXNzdW1pbmdfY3VycmVudGx5X2ludCBhcnIgaSB4ID1cbiAgICBPYmpfYXJyYXkudW5zYWZlX3NldF9hc3N1bWluZ19jdXJyZW50bHlfaW50IGFyciBpIChDYW1sLk9iai5yZXByIHgpXG4gIDs7XG5cbiAgbGV0IGxlbmd0aCA9IE9ial9hcnJheS5sZW5ndGhcbiAgbGV0IHVuc2FmZV9ibGl0ID0gT2JqX2FycmF5LnVuc2FmZV9ibGl0XG4gIGxldCBjb3B5ID0gT2JqX2FycmF5LmNvcHlcblxuICBsZXQgdW5zYWZlX3NldF9vbWl0X3BoeXNfZXF1YWxfY2hlY2sgdCBpIHggPVxuICAgIE9ial9hcnJheS51bnNhZmVfc2V0X29taXRfcGh5c19lcXVhbF9jaGVjayB0IGkgKENhbWwuT2JqLnJlcHIgeClcbiAgOztcblxuICBsZXQgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSB4ID1cbiAgICBPYmpfYXJyYXkudW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSAoQ2FtbC5PYmoucmVwciB4KVxuICA7O1xuXG4gIGxldCBzZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgeCA9IE9ial9hcnJheS5zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgKENhbWwuT2JqLnJlcHIgeClcbiAgbGV0IHVuc2FmZV9jbGVhcl9pZl9wb2ludGVyID0gT2JqX2FycmF5LnVuc2FmZV9jbGVhcl9pZl9wb2ludGVyXG5lbmRcblxuaW5jbHVkZSBUcnVzdGVkXG5cbmxldCBpbnZhcmlhbnQgdCA9IGFzc2VydCAoQ2FtbC5PYmoudGFnIChDYW1sLk9iai5yZXByIHQpIDw+IENhbWwuT2JqLmRvdWJsZV9hcnJheV90YWcpXG5cbmxldCBpbml0IGwgfmYgPVxuICBpZiBsIDwgMFxuICB0aGVuIGludmFsaWRfYXJnIFwiVW5pZm9ybV9hcnJheS5pbml0XCJcbiAgZWxzZSAoXG4gICAgbGV0IHJlcyA9IHVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCB+bGVuOmwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgcmVzIGkgKGYgaSlcbiAgICBkb25lO1xuICAgIHJlcylcbjs7XG5cbmxldCBvZl9hcnJheSBhcnIgPSBpbml0IH5mOihBcnJheS51bnNhZmVfZ2V0IGFycikgKEFycmF5Lmxlbmd0aCBhcnIpXG5sZXQgbWFwIGEgfmYgPSBpbml0IH5mOihmdW4gaSAtPiBmICh1bnNhZmVfZ2V0IGEgaSkpIChsZW5ndGggYSlcbmxldCBtYXBpIGEgfmYgPSBpbml0IH5mOihmdW4gaSAtPiBmIGkgKHVuc2FmZV9nZXQgYSBpKSkgKGxlbmd0aCBhKVxuXG5sZXQgaXRlciBhIH5mID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIGYgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lXG47O1xuXG5sZXQgaXRlcmkgYSB+ZiA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICBmIGkgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lXG47O1xuXG5sZXQgZm9sZGkgYSB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgYWNjIDo9IGYgaSAhYWNjICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIWFjY1xuOztcblxubGV0IHRvX2xpc3QgdCA9IExpc3QuaW5pdCB+ZjooZ2V0IHQpIChsZW5ndGggdClcblxubGV0IG9mX2xpc3QgbCA9XG4gIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBsIGluXG4gIGxldCByZXMgPSB1bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQgfmxlbiBpblxuICBMaXN0Lml0ZXJpIGwgfmY6KGZ1biBpIHggLT4gc2V0IHJlcyBpIHgpO1xuICByZXNcbjs7XG5cbigqIEl0IGlzIG5vdCBzYWZlIGZvciBbdG9fYXJyYXldIHRvIGJlIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBiZWNhdXNlIHdlIGhhdmUgY29kZSB0aGF0XG4gICByZWxpZXMgb24gW2Zsb2F0IGFycmF5XXMgYmVpbmcgdW5ib3hlZCwgZm9yIGV4YW1wbGUgaW4gW2Jpbl93cml0ZV9hcnJheV0uICopXG5sZXQgdG9fYXJyYXkgdCA9IEFycmF5LmluaXQgKGxlbmd0aCB0KSB+ZjooZnVuIGkgLT4gdW5zYWZlX2dldCB0IGkpXG5cbmxldCBleGlzdHMgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCB0IH5mIGkgPVxuICAgIGlmIGkgPCAwIHRoZW4gZmFsc2UgZWxzZSBmICh1bnNhZmVfZ2V0IHQgaSkgfHwgbG9vcCB0IH5mIChpIC0gMSlcbiAgaW5cbiAgbG9vcCB0IH5mIChsZW5ndGggdCAtIDEpXG47O1xuXG5sZXQgZm9yX2FsbCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHQgfmYgaSA9IGlmIGkgPCAwIHRoZW4gdHJ1ZSBlbHNlIGYgKHVuc2FmZV9nZXQgdCBpKSAmJiBsb29wIHQgfmYgKGkgLSAxKSBpblxuICBsb29wIHQgfmYgKGxlbmd0aCB0IC0gMSlcbjs7XG5cbmxldCBtYXAyX2V4biB0MSB0MiB+ZiA9XG4gIGxldCBsZW4gPSBsZW5ndGggdDEgaW5cbiAgaWYgbGVuZ3RoIHQyIDw+IGxlbiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkubWFwMl9leG5cIjtcbiAgaW5pdCBsZW4gfmY6KGZ1biBpIC0+IGYgKHVuc2FmZV9nZXQgdDEgaSkgKHVuc2FmZV9nZXQgdDIgaSkpXG47O1xuXG5sZXQgdF9zZXhwX2dyYW1tYXIgKHR5cGUgZWx0KSAoZ3JhbW1hciA6IGVsdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiBlbHQgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKEFycmF5LnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG47O1xuXG5pbmNsdWRlXG4gIFNleHBhYmxlLk9mX3NleHBhYmxlMVxuICAgIChBcnJheSlcbiAgICAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgICBsZXQgdG9fc2V4cGFibGUgPSB0b19hcnJheVxuICAgICAgbGV0IG9mX3NleHBhYmxlID0gb2ZfYXJyYXlcbiAgICBlbmQpXG5cbmluY2x1ZGUgQmxpdC5NYWtlMSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcblxuICAgIGxldCBjcmVhdGVfbGlrZSB+bGVuIHQgPVxuICAgICAgaWYgbGVuID0gMFxuICAgICAgdGhlbiBlbXB0eVxuICAgICAgZWxzZSAoXG4gICAgICAgIGFzc2VydCAobGVuZ3RoIHQgPiAwKTtcbiAgICAgICAgY3JlYXRlIH5sZW4gKGdldCB0IDApKVxuICAgIDs7XG5cbiAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdFxuICBlbmQpXG5cbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBsZXQgciA9IHJlZiBpbml0IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgdCBpKVxuICBkb25lO1xuICAhclxuOztcblxubGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbmxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5cbigqIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHBweF9jb21wYXJlIFtjb21wYXJlX2FycmF5XSBidXQgdXNlcyBvdXIgW3Vuc2FmZV9nZXRdIGFuZCBbbGVuZ3RoXS4gKilcbmxldCBjb21wYXJlIGNvbXBhcmVfZWx0IGEgYiA9XG4gIGlmIHBoeXNfZXF1YWwgYSBiXG4gIHRoZW4gMFxuICBlbHNlIChcbiAgICBsZXQgbGVuX2EgPSBsZW5ndGggYSBpblxuICAgIGxldCBsZW5fYiA9IGxlbmd0aCBiIGluXG4gICAgbGV0IHJldCA9IGNvbXBhcmUgbGVuX2EgbGVuX2IgaW5cbiAgICBpZiByZXQgPD4gMFxuICAgIHRoZW4gcmV0XG4gICAgZWxzZSAoXG4gICAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICAgIGlmIGkgPSBsZW5fYVxuICAgICAgICB0aGVuIDBcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IGwgPSB1bnNhZmVfZ2V0IGEgaVxuICAgICAgICAgIGFuZCByID0gdW5zYWZlX2dldCBiIGkgaW5cbiAgICAgICAgICBsZXQgcmVzID0gY29tcGFyZV9lbHQgbCByIGluXG4gICAgICAgICAgaWYgcmVzIDw+IDAgdGhlbiByZXMgZWxzZSBsb29wIChpICsgMSkpXG4gICAgICBpblxuICAgICAgbG9vcCAwKSlcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBjZWlsID0gQ2FtbC5jZWlsXG5sZXQgZmxvb3IgPSBDYW1sLmZsb29yXG5sZXQgbW9kX2Zsb2F0ID0gQ2FtbC5tb2RfZmxvYXRcbmxldCBtb2RmID0gQ2FtbC5tb2RmXG5sZXQgZmxvYXRfb2Zfc3RyaW5nID0gQ2FtbC5mbG9hdF9vZl9zdHJpbmdcbmxldCBuYW4gPSBDYW1sLm5hblxubGV0IGluZmluaXR5ID0gQ2FtbC5pbmZpbml0eVxubGV0IG5lZ19pbmZpbml0eSA9IENhbWwubmVnX2luZmluaXR5XG5sZXQgbWF4X2Zpbml0ZV92YWx1ZSA9IENhbWwubWF4X2Zsb2F0XG5sZXQgZXBzaWxvbl9mbG9hdCA9IENhbWwuZXBzaWxvbl9mbG9hdFxubGV0IGNsYXNzaWZ5X2Zsb2F0ID0gQ2FtbC5jbGFzc2lmeV9mbG9hdFxubGV0IGFic19mbG9hdCA9IENhbWwuYWJzX2Zsb2F0XG5sZXQgaXNfaW50ZWdlciA9IENhbWwuRmxvYXQuaXNfaW50ZWdlclxubGV0ICggKiogKSA9IENhbWwuKCAqKiApXG5cbmxldCAoICUuICkgYSBiID1cbiAgKCogUmFpc2UgaW4gY2FzZSBvZiBhIG5lZ2F0aXZlIG1vZHVsdXMsIGFzIGRvZXMgSW50LiggJSApLiAqKVxuICBpZiBiIDwgMC5cbiAgdGhlbiBQcmludGYuaW52YWxpZF9hcmdmIFwiJWYgJSUgJWYgaW4gZmxvYXQwLm1sOiBtb2R1bHVzIHNob3VsZCBiZSBwb3NpdGl2ZVwiIGEgYiAoKTtcbiAgbGV0IG0gPSBDYW1sLm1vZF9mbG9hdCBhIGIgaW5cbiAgKCogUHJvZHVjZSBhIG5vbi1uZWdhdGl2ZSByZXN1bHQgaW4gYW5hbG9neSB3aXRoIEludC4oICUgKS4gKilcbiAgaWYgbSA8IDAuIHRoZW4gbSArLiBiIGVsc2UgbVxuOztcblxuKCogVGhlIGJpdHMgb2YgSU5SSUEncyBbUGVydmFzaXZlc10gdGhhdCB3ZSBqdXN0IHdhbnQgdG8gZXhwb3NlIGluIFtGbG9hdF0uIE1vc3QgYXJlXG4gICBhbHJlYWR5IGRlcHJlY2F0ZWQgaW4gW1BlcnZhc2l2ZXNdLCBhbmQgZXZlbnR1YWxseSBhbGwgb2YgdGhlbSBzaG91bGQgYmUuICopXG5pbmNsdWRlIChcbiAgQ2FtbCA6XG4gIHNpZ1xuICAgIGV4dGVybmFsIGZyZXhwIDogZmxvYXQgLT4gZmxvYXQgKiBpbnQgPSBcImNhbWxfZnJleHBfZmxvYXRcIlxuXG4gICAgZXh0ZXJuYWwgbGRleHBcbiAgICAgIDogIChmbG9hdFtAdW5ib3hlZF0pXG4gICAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgICAtPiAoZmxvYXRbQHVuYm94ZWRdKVxuICAgICAgPSBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiXG4gICAgW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGV4cG0xIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwbTFfZmxvYXRcIiBcImNhbWxfZXhwbTFcIlxuICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBsb2cxcCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzFwX2Zsb2F0XCIgXCJjYW1sX2xvZzFwXCJcbiAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgY29weXNpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3B5c2lnbl9mbG9hdFwiIFwiY2FtbF9jb3B5c2lnblwiXG4gICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc19mbG9hdFwiIFwiY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5fZmxvYXRcIiBcInNpblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zX2Zsb2F0XCIgXCJhY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2h5cG90X2Zsb2F0XCIgXCJjYW1sX2h5cG90XCJcbiAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIHNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5oX2Zsb2F0XCIgXCJzaW5oXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgc3FydCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NxcnRfZmxvYXRcIiBcInNxcnRcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBsb2cgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2dfZmxvYXRcIiBcImxvZ1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gIGVuZClcblxuKCogV2UgbmVlZCB0aGlzIGluZGlyZWN0aW9uIGJlY2F1c2UgdGhlc2UgYXJlIGV4cG9zZWQgYXMgXCJ2YWxcIiBpbnN0ZWFkIG9mIFwiZXh0ZXJuYWxcIiAqKVxubGV0IGZyZXhwID0gZnJleHBcbmxldCBsZGV4cCA9IGxkZXhwXG5sZXQgaXNfbmFuIHggPSAoeCA6IGZsb2F0KSA8PiB4XG5cbigqIEFuIG9yZGVyLXByZXNlcnZpbmcgYmlqZWN0aW9uIGJldHdlZW4gYWxsIGZsb2F0cyBleGNlcHQgZm9yIE5hTnMsIGFuZCA5OS45NSUgb2ZcbiAgIGludDY0cy5cblxuICAgTm90ZSB3ZSBkb24ndCBkaXN0aW5ndWlzaCAwLiBhbmQgLTAuIGFzIHNlcGFyYXRlIHZhbHVlcyBoZXJlLCB0aGV5IGJvdGggbWFwIHRvIDBMLCB3aGljaFxuICAgbWFwcyBiYWNrIHRvIDAuXG5cbiAgIFRoaXMgc2hvdWxkIHdvcmsgYm90aCBvbiBsaXR0bGUtZW5kaWFuIGFuZCBoaWdoLWVuZGlhbiBDUFVzLiAgV2lraXBlZGlhIHNheXM6IFwib25cbiAgIG1vZGVybiBzdGFuZGFyZCBjb21wdXRlcnMgKGkuZS4sIGltcGxlbWVudGluZyBJRUVFIDc1NCksIG9uZSBtYXkgaW4gcHJhY3RpY2Ugc2FmZWx5XG4gICBhc3N1bWUgdGhhdCB0aGUgZW5kaWFubmVzcyBpcyB0aGUgc2FtZSBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhcyBmb3IgaW50ZWdlcnNcIlxuICAgKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRW5kaWFubmVzcyNGbG9hdGluZy1wb2ludF9hbmRfZW5kaWFubmVzcykuXG4qKVxubGV0IHRvX2ludDY0X3ByZXNlcnZlX29yZGVyIHQgPVxuICBpZiBpc19uYW4gdFxuICB0aGVuIE5vbmVcbiAgZWxzZSBpZiB0ID0gMC5cbiAgdGhlbiAoKiBhbHNvIGluY2x1ZGVzIC0wLiAqKVxuICAgIFNvbWUgMExcbiAgZWxzZSBpZiB0ID4gMC5cbiAgdGhlbiBTb21lIChDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgdClcbiAgZWxzZSBTb21lIChDYW1sLkludDY0Lm5lZyAoQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0ICgtLnQpKSlcbjs7XG5cbmxldCB0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlcl9leG4geCA9IE9wdGlvbi52YWx1ZV9leG4gKHRvX2ludDY0X3ByZXNlcnZlX29yZGVyIHgpXG5cbmxldCBvZl9pbnQ2NF9wcmVzZXJ2ZV9vcmRlciB4ID1cbiAgaWYgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSB4IDBMXG4gIHRoZW4gQ2FtbC5JbnQ2NC5mbG9hdF9vZl9iaXRzIHhcbiAgZWxzZSB+LS4oQ2FtbC5JbnQ2NC5mbG9hdF9vZl9iaXRzIChDYW1sLkludDY0Lm5lZyB4KSlcbjs7XG5cbmxldCBvbmVfdWxwIGRpciB0ID1cbiAgbWF0Y2ggdG9faW50NjRfcHJlc2VydmVfb3JkZXIgdCB3aXRoXG4gIHwgTm9uZSAtPiBDYW1sLm5hblxuICB8IFNvbWUgeCAtPlxuICAgIG9mX2ludDY0X3ByZXNlcnZlX29yZGVyXG4gICAgICAoQ2FtbC5JbnQ2NC5hZGRcbiAgICAgICAgIHhcbiAgICAgICAgIChtYXRjaCBkaXIgd2l0aFxuICAgICAgICAgIHwgYFVwIC0+IDFMXG4gICAgICAgICAgfCBgRG93biAtPiAtMUwpKVxuOztcblxuKCogW3VwcGVyX2JvdW5kX2Zvcl9pbnRdIGFuZCBbbG93ZXJfYm91bmRfZm9yX2ludF0gYXJlIGZvciBjYWxjdWxhdGluZyB0aGUgbWF4L21pbiBmbG9hdFxuICAgdGhhdCBmaXRzIGluIGEgZ2l2ZW4tc2l6ZSBpbnRlZ2VyIHdoZW4gcm91bmRlZCB0b3dhcmRzIDAgKHVzaW5nIFtpbnRfb2ZfZmxvYXRdKS5cblxuICAgbWF4X2ludC9taW5faW50IGRlcGVuZCBvbiBbbnVtX2JpdHNdLCBlLmcuICsvLSAyXjMwLCArLy0gMl42MiBpZiAzMS1iaXQsIDYzLWJpdFxuICAgKHJlc3BlY3RpdmVseSkgd2hpbGUgZmxvYXQgaXMgSUVFRSBzdGFuZGFyZCBmb3IgZG91YmxlICg1MiBzaWduaWZpY2FudCBiaXRzKS5cblxuICAgSW4gYWxsIGNhc2VzLCB3ZSB3YW50IHRvIGd1YXJhbnRlZSB0aGF0XG4gICBbbG93ZXJfYm91bmRfZm9yX2ludCA8PSB4IDw9IHVwcGVyX2JvdW5kX2Zvcl9pbnRdXG4gICBpZmYgW2ludF9vZl9mbG9hdCB4XSBmaXRzIGluIGFuIGludCB3aXRoIFtudW1fYml0c10gYml0cy5cblxuICAgWzIgKiogKG51bV9iaXRzIC0gMSldIGlzIHRoZSBmaXJzdCBmbG9hdCBncmVhdGVyIHRoYXQgbWF4X2ludCwgd2UgdXNlIHRoZSBwcmVjZWRpbmdcbiAgIGZsb2F0IGFzIHVwcGVyIGJvdW5kLlxuXG4gICBbLSAoMiAqKiAobnVtX2JpdHMgLSAxKSldIGlzIGVxdWFsIHRvIG1pbl9pbnQuXG4gICBGb3IgbG93ZXIgYm91bmQgd2UgbG9vayBmb3IgdGhlIHNtYWxsZXN0IGZsb2F0IFtmXSBzYXRpc2Z5aW5nIFtmID4gbWluX2ludCAtIDFdIHNvIHRoYXRcbiAgIFtmXSByb3VuZHMgdG93YXJkIHplcm8gdG8gW21pbl9pbnRdXG5cbiAgIFNvIGluIHBhcnRpY3VsYXIgd2Ugd2lsbCBoYXZlOlxuICAgW2xvd2VyX2JvdW5kX2Zvcl9pbnQgeCA8PSAtICgyICoqICgxLXgpKV1cbiAgIFt1cHBlcl9ib3VuZF9mb3JfaW50IHggIDwgICAgMiAqKiAoMS14KSBdXG4qKVxubGV0IHVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHMgPVxuICBsZXQgZXhwID0gQ2FtbC5mbG9hdF9vZl9pbnQgKG51bV9iaXRzIC0gMSkgaW5cbiAgb25lX3VscCBgRG93biAoMi4gKiogZXhwKVxuOztcblxubGV0IGlzX3hfbWludXNfb25lX2V4YWN0IHggPVxuICAoKiBbeCA9IHggLS4gMS5dIGRvZXMgbm90IHdvcmsgd2l0aCB4ODcgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBiYWNrZW5kICh3aGljaCBpcyB1c2VkXG4gICAgIG9uIDMyLWJpdCBvY2FtbCkgYmVjYXVzZSBvZiA4MC1iaXQgcmVnaXN0ZXIgcHJlY2lzaW9uIG9mIGludGVybWVkaWF0ZSBjb21wdXRhdGlvbnMuXG5cbiAgICAgQW4gYWx0ZXJuYXRpdmUgd2F5IG9mIGNvbXB1dGluZyB0aGlzOiBbeCAtLiBvbmVfdWxwIGBEb3duIHggPD0gMS5dIGlzIGFsc28gcHJvbmUgdG9cbiAgICAgdGhlIHNhbWUgcHJlY2lzaW9uIGlzc3VlczogeW91IG5lZWQgdG8gbWFrZSBzdXJlIFt4XSBpcyA2NC1iaXQuXG4gICopXG4gIGxldCBvcGVuIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICBub3QgKENhbWwuSW50NjQuYml0c19vZl9mbG9hdCB4ID0gQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0ICh4IC0uIDEuKSlcbjs7XG5cbmxldCBsb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzID1cbiAgbGV0IGV4cCA9IENhbWwuZmxvYXRfb2ZfaW50IChudW1fYml0cyAtIDEpIGluXG4gIGxldCBtaW5faW50X2FzX2Zsb2F0ID0gfi0uKDIuICoqIGV4cCkgaW5cbiAgbGV0IG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICBpZiBudW1fYml0cyAtIDEgPCA1MyAoKiA1MyA9ICNiaXRzIGluIHRoZSBmbG9hdCdzIG1hbnRpc3NhIHdpdGggc2lnbiBpbmNsdWRlZCAqKVxuICB0aGVuIChcbiAgICAoKiBUaGUgc21hbGxlc3QgZmxvYXQgdGhhdCByb3VuZHMgdG93YXJkcyB6ZXJvIHRvIFttaW5faW50XSBpc1xuICAgICAgIFttaW5faW50IC0gMSArIGVwc2lsb25dICopXG4gICAgYXNzZXJ0IChpc194X21pbnVzX29uZV9leGFjdCBtaW5faW50X2FzX2Zsb2F0KTtcbiAgICBvbmVfdWxwIGBVcCAobWluX2ludF9hc19mbG9hdCAtLiAxLikpXG4gIGVsc2UgKFxuICAgICgqIFttaW5faW50X2FzX2Zsb2F0XSBpcyBhbHJlYWR5IHRoZSBzbWFsbGVzdCBmbG9hdCBbZl0gc2F0aXNmeWluZyBbZiA+IG1pbl9pbnQgLSAxXS4gKilcbiAgICBhc3NlcnQgKG5vdCAoaXNfeF9taW51c19vbmVfZXhhY3QgbWluX2ludF9hc19mbG9hdCkpO1xuICAgIG1pbl9pbnRfYXNfZmxvYXQpXG47O1xuXG4oKiBGbG9hdCBjbGFtcGluZyBpcyBzdHJ1Y3R1cmVkIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gY2xhbXBpbmcgZm9yIG90aGVyIHR5cGVzLCBzb1xuICAgdGhhdCB3ZSBnZXQgdGhlIGJlaGF2aW9yIG9mIFtjbGFtcF91bmNoZWNrZWQgbmFuIH5taW4gfm1heCA9IG5hbl0gKGZvciBhbnkgW21pbl0gYW5kXG4gICBbbWF4XSkgZm9yIGZyZWUuXG4qKVxubGV0IGNsYW1wX3VuY2hlY2tlZCAodCA6IGZsb2F0KSB+bWluIH5tYXggPVxuICBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgbWF4IDwgdCB0aGVuIG1heCBlbHNlIHRcbjs7XG5cbmxldCBib3ggPVxuICAoKiBQcmV2ZW50IHBvdGVudGlhbCBjb25zdGFudCBmb2xkaW5nIG9mIFsrLiAwLl0gaW4gdGhlIG5lYXIgb2NhbWxvcHQgZnV0dXJlLiAqKVxuICBsZXQgeCA9IFN5czAub3BhcXVlX2lkZW50aXR5IDAuIGluXG4gIGZ1biBmIC0+IGYgKy4geFxuOztcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG5pbmNsdWRlIENoYXIwXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGNoYXIgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2NoYXIgOiB0IC0+IHQgLT4gaW50KVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfY2hhclxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfY2hhciBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoY2hhcl9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9jaGFyIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGNoYXJfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgdG9fc3RyaW5nIHQgPSBTdHJpbmcubWFrZSAxIHRcblxuICBsZXQgb2Zfc3RyaW5nIHMgPVxuICAgIG1hdGNoIFN0cmluZy5sZW5ndGggcyB3aXRoXG4gICAgfCAxIC0+IHMuWzBdXG4gICAgfCBfIC0+IGZhaWx3aXRoZiBcIkNoYXIub2Zfc3RyaW5nOiAlU1wiIHMgKClcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFRcblxuaW5jbHVkZSBJZGVudGlmaWFibGUuTWFrZSAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuQ2hhclwiXG4gIGVuZClcblxubGV0IHBwIGZtdCBjID0gQ2FtbC5Gb3JtYXQuZnByaW50ZiBmbXQgXCIlQ1wiIGNcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgQ2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBhbGwgPSBBcnJheS5pbml0IDI1NiB+Zjp1bnNhZmVfb2ZfaW50IHw+IEFycmF5LnRvX2xpc3RcblxubGV0IGlzX2xvd2VyY2FzZSA9IGZ1bmN0aW9uXG4gIHwgJ2EnIC4uICd6JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX3VwcGVyY2FzZSA9IGZ1bmN0aW9uXG4gIHwgJ0EnIC4uICdaJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX3ByaW50ID0gZnVuY3Rpb25cbiAgfCAnICcgLi4gJ34nIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfd2hpdGVzcGFjZSA9IGZ1bmN0aW9uXG4gIHwgJ1xcdCcgfCAnXFxuJyB8ICdcXDAxMScgKCogdmVydGljYWwgdGFiICopIHwgJ1xcMDEyJyAoKiBmb3JtIGZlZWQgKikgfCAnXFxyJyB8ICcgJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfYWxwaGEgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgfCAnQScgLi4gJ1onIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG4oKiBXcml0aW5nIHRoZXNlIG91dCwgaW5zdGVhZCBvZiBjYWxsaW5nIFtpc19hbHBoYV0gYW5kIFtpc19kaWdpdF0sIHJlZHVjZXNcbiAgIHJ1bnRpbWUgYnkgYXBwcm94LiAzMCUgKilcbmxldCBpc19hbHBoYW51bSA9IGZ1bmN0aW9uXG4gIHwgJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnMCcgLi4gJzknIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgZ2V0X2RpZ2l0X3Vuc2FmZSB0ID0gdG9faW50IHQgLSB0b19pbnQgJzAnXG5cbmxldCBnZXRfZGlnaXRfZXhuIHQgPVxuICBpZiBpc19kaWdpdCB0XG4gIHRoZW4gZ2V0X2RpZ2l0X3Vuc2FmZSB0XG4gIGVsc2UgZmFpbHdpdGhmIFwiQ2hhci5nZXRfZGlnaXRfZXhuICVDOiBub3QgYSBkaWdpdFwiIHQgKClcbjs7XG5cbmxldCBnZXRfZGlnaXQgdCA9IGlmIGlzX2RpZ2l0IHQgdGhlbiBTb21lIChnZXRfZGlnaXRfdW5zYWZlIHQpIGVsc2UgTm9uZVxuXG5sZXQgaXNfaGV4X2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19oZXhfZGlnaXRfbG93ZXIgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfaGV4X2RpZ2l0X3VwcGVyID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIHwgJ0EnIC4uICdGJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGdldF9oZXhfZGlnaXRfZXhuID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIGFzIHQgLT4gdG9faW50IHQgLSB0b19pbnQgJzAnXG4gIHwgJ2EnIC4uICdmJyBhcyB0IC0+IHRvX2ludCB0IC0gdG9faW50ICdhJyArIDEwXG4gIHwgJ0EnIC4uICdGJyBhcyB0IC0+IHRvX2ludCB0IC0gdG9faW50ICdBJyArIDEwXG4gIHwgdCAtPlxuICAgIEVycm9yLnJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiQ2hhci5nZXRfaGV4X2RpZ2l0X2V4bjogbm90IGEgaGV4YWRlY2ltYWwgZGlnaXRcIlxuICAgICAgICAgWyBcImNoYXJcIiwgc2V4cF9vZl90IHQgXSlcbjs7XG5cbmxldCBnZXRfaGV4X2RpZ2l0IHQgPSBpZiBpc19oZXhfZGlnaXQgdCB0aGVuIFNvbWUgKGdldF9oZXhfZGlnaXRfZXhuIHQpIGVsc2UgTm9uZVxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBsZXQgKCA+PSApID0gKCA+PSApXG4gIGxldCAoIDw9ICkgPSAoIDw9IClcbiAgbGV0ICggPSApID0gKCA9IClcbiAgbGV0ICggPiApID0gKCA+IClcbiAgbGV0ICggPCApID0gKCA8IClcbiAgbGV0ICggPD4gKSA9ICggPD4gKVxuZW5kXG5cbm1vZHVsZSBDYXNlbGVzcyA9IHN0cnVjdFxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IGNoYXIgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICAgIGxldCB0X29mX3NleHAgPSAoY2hhcl9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gICAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2NoYXIgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBjaGFyX3NleHBfZ3JhbW1hclxuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCBjb21wYXJlIGMxIGMyID0gY29tcGFyZSAobG93ZXJjYXNlIGMxKSAobG93ZXJjYXNlIGMyKVxuICAgIGxldCBoYXNoX2ZvbGRfdCBzdGF0ZSB0ID0gaGFzaF9mb2xkX2NoYXIgc3RhdGUgKGxvd2VyY2FzZSB0KVxuICAgIGxldCBoYXNoIHQgPSBIYXNoLnJ1biBoYXNoX2ZvbGRfdCB0XG4gIGVuZFxuXG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIENvbXBhcmFibGUuTWFrZSAoVClcbmVuZFxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgQ2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm1vZHVsZSBMaXN0ID0gTGlzdFxuXG5tb2R1bGUgRW51bWVyYWJsZSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgYWxsIDogdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMxID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYSB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdiIGxpc3QgLT4gKCdhLCAnYikgdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2IgbGlzdCAtPiAnYyBsaXN0IC0+ICgnYSwgJ2IsICdjKSB0IGxpc3RcbiAgZW5kXG5lbmRcbiIsIm9wZW4hIEltcG9ydDAuSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxubW9kdWxlIEJ5dGVzID0gQnl0ZXMwXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxuXG4oKiBDb25zdHJ1Y3QgYSBieXRlIHN0cmluZyBvZiBsZW5ndGggMjU2LCBtYXBwaW5nIGV2ZXJ5IGlucHV0IGNoYXJhY3RlciBjb2RlIHRvXG4gICBpdHMgY29ycmVzcG9uZGluZyBvdXRwdXQgY2hhcmFjdGVyLlxuXG4gICBCZW5jaG1hcmtzIGluZGljYXRlIHRoYXQgdGhpcyBpcyBmYXN0ZXIgdGhhbiB0aGUgbGFtYmRhIChpbmNsdWRpbmcgY29zdCBvZlxuICAgdGhpcyBmdW5jdGlvbiksIGV2ZW4gaWYgdGFyZ2V0L3JlcGxhY2VtZW50IGFyZSBqdXN0IDIgY2hhcmFjdGVycyBlYWNoLlxuXG4gICBSZXR1cm4gTm9uZSBpZiB0aGUgdHJhbnNsYXRpb24gbWFwIGlzIGVxdWl2YWxlbnQgdG8ganVzdCB0aGUgaWRlbnRpdHkuICopXG5sZXQgdHJfY3JlYXRlX21hcCB+dGFyZ2V0IH5yZXBsYWNlbWVudCA9XG4gIGxldCB0cl9tYXAgPSBCeXRlcy5jcmVhdGUgMjU2IGluXG4gIGZvciBpID0gMCB0byAyNTUgZG9cbiAgICBCeXRlcy51bnNhZmVfc2V0IHRyX21hcCBpIChDaGFyLm9mX2ludF9leG4gaSlcbiAgZG9uZTtcbiAgZm9yIGkgPSAwIHRvIG1pbiAoU3RyaW5nLmxlbmd0aCB0YXJnZXQpIChTdHJpbmcubGVuZ3RoIHJlcGxhY2VtZW50KSAtIDEgZG9cbiAgICBsZXQgaW5kZXggPSBDaGFyLnRvX2ludCAoU3RyaW5nLnVuc2FmZV9nZXQgdGFyZ2V0IGkpIGluXG4gICAgQnl0ZXMudW5zYWZlX3NldCB0cl9tYXAgaW5kZXggKFN0cmluZy51bnNhZmVfZ2V0IHJlcGxhY2VtZW50IGkpXG4gIGRvbmU7XG4gIGxldCBsYXN0X3JlcGxhY2VtZW50ID0gU3RyaW5nLnVuc2FmZV9nZXQgcmVwbGFjZW1lbnQgKFN0cmluZy5sZW5ndGggcmVwbGFjZW1lbnQgLSAxKSBpblxuICBmb3JcbiAgICBpID0gbWluIChTdHJpbmcubGVuZ3RoIHRhcmdldCkgKFN0cmluZy5sZW5ndGggcmVwbGFjZW1lbnQpIHRvIFN0cmluZy5sZW5ndGggdGFyZ2V0IC0gMVxuICBkb1xuICAgIGxldCBpbmRleCA9IENoYXIudG9faW50IChTdHJpbmcudW5zYWZlX2dldCB0YXJnZXQgaSkgaW5cbiAgICBCeXRlcy51bnNhZmVfc2V0IHRyX21hcCBpbmRleCBsYXN0X3JlcGxhY2VtZW50XG4gIGRvbmU7XG4gIGxldCByZWMgaGF2ZV9hbnlfZGlmZmVyZW50IHRyX21hcCBpID1cbiAgICBpZiBpID0gMjU2XG4gICAgdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgQ2hhci4oIDw+ICkgKEJ5dGVzMC51bnNhZmVfZ2V0IHRyX21hcCBpKSAoQ2hhci5vZl9pbnRfZXhuIGkpXG4gICAgdGhlbiB0cnVlXG4gICAgZWxzZSBoYXZlX2FueV9kaWZmZXJlbnQgdHJfbWFwIChpICsgMSlcbiAgaW5cbiAgKCogcXVpY2sgY2hlY2sgb24gdGhlIGZpcnN0IHRhcmdldCBjaGFyYWN0ZXIgd2hpY2ggd2lsbCA5OSUgYmUgdHJ1ZSAqKVxuICBsZXQgZmlyc3RfdGFyZ2V0ID0gdGFyZ2V0LlswXSBpblxuICBpZiBDaGFyLiggPD4gKSAoQnl0ZXMwLnVuc2FmZV9nZXQgdHJfbWFwIChDaGFyLnRvX2ludCBmaXJzdF90YXJnZXQpKSBmaXJzdF90YXJnZXRcbiAgfHwgaGF2ZV9hbnlfZGlmZmVyZW50IHRyX21hcCAwXG4gIHRoZW4gU29tZSAoQnl0ZXMwLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6dHJfbWFwKVxuICBlbHNlIE5vbmVcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSAnYSB0ID0gJ2FcblxubGV0IHN0YWdlID0gRm4uaWRcbmxldCB1bnN0YWdlID0gRm4uaWRcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5pbmNsdWRlIFN0cmluZzBcbm1vZHVsZSBCeXRlcyA9IEJ5dGVzMFxuKCogVGhpcyBhbGlhcyBpcyBuZWNlc3NhcnkgZGVzcGl0ZSBbU3RyaW5nMF0gZGVmaW5pbmcgW0J5dGVzID0gQnl0ZXMwXSwgaW4gb3JkZXIgdG9cbiAgIGNvbnZpbmNlIG9jYW1sZGVwIHRoYXQgdGhpcyBmaWxlIGRvZXNuJ3QgZGVwZW5kIG9uIGJ5dGVzLm1sLiAqKVxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5sZXQgc3RhZ2UgPSBTdGFnZWQuc3RhZ2VcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gc3RyaW5nIFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9zdHJpbmdcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX3N0cmluZyBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoc3RyaW5nX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX3N0cmluZyA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBzdHJpbmdfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBjb21wYXJlID0gY29tcGFyZVxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbnR5cGUgZWx0ID0gY2hhclxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxuXG4oKiBUaGlzIGlzIGNvcGllZC9hZGFwdGVkIGZyb20gJ2JsaXQubWwnLlxuICAgW3N1Yl0sIFtzdWJvXSBjb3VsZCBiZSBpbXBsZW1lbnRlZCB1c2luZyBbQmxpdC5NYWtlKEJ5dGVzKV0gcGx1cyB1bnNhZmUgY2FzdHMgdG8vZnJvbVxuICAgc3RyaW5nIGJ1dCB3ZXJlIGlubGluZWQgaGVyZSB0byBhdm9pZCB1c2luZyBbQnl0ZXMudW5zYWZlX29mX3N0cmluZ10gYXMgbXVjaCBhcyBwb3NzaWJsZS5cbiopXG5sZXQgc3ViIHNyYyB+cG9zIH5sZW4gPVxuICBpZiBwb3MgPSAwICYmIGxlbiA9IFN0cmluZy5sZW5ndGggc3JjXG4gIHRoZW4gc3JjXG4gIGVsc2UgKFxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGg6KGxlbmd0aCBzcmMpO1xuICAgIGlmIGxlbiA9IDBcbiAgICB0aGVuIFwiXCJcbiAgICBlbHNlIChcbiAgICAgIGxldCBkc3QgPSBCeXRlcy5jcmVhdGUgbGVuIGluXG4gICAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3Bvczpwb3MgfmRzdCB+ZHN0X3BvczowIH5sZW47XG4gICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOmRzdCkpXG47O1xuXG5sZXQgc3VibyA/KHBvcyA9IDApID9sZW4gc3JjID1cbiAgc3ViXG4gICAgc3JjXG4gICAgfnBvc1xuICAgIH5sZW46XG4gICAgICAobWF0Y2ggbGVuIHdpdGhcbiAgICAgICB8IFNvbWUgaSAtPiBpXG4gICAgICAgfCBOb25lIC0+IGxlbmd0aCBzcmMgLSBwb3MpXG47O1xuXG5sZXQgcmVjIGNvbnRhaW5zX3Vuc2FmZSB0IH5wb3MgfmVuZF8gY2hhciA9XG4gIHBvcyA8IGVuZF9cbiAgJiYgKENoYXIuZXF1YWwgKHVuc2FmZV9nZXQgdCBwb3MpIGNoYXIgfHwgY29udGFpbnNfdW5zYWZlIHQgfnBvczoocG9zICsgMSkgfmVuZF8gY2hhcilcbjs7XG5cbmxldCBjb250YWlucyA/KHBvcyA9IDApID9sZW4gdCBjaGFyID1cbiAgbGV0IHRvdGFsX2xlbmd0aCA9IFN0cmluZy5sZW5ndGggdCBpblxuICBsZXQgbGVuID0gT3B0aW9uLnZhbHVlIGxlbiB+ZGVmYXVsdDoodG90YWxfbGVuZ3RoIC0gcG9zKSBpblxuICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoO1xuICBjb250YWluc191bnNhZmUgdCB+cG9zIH5lbmRfOihwb3MgKyBsZW4pIGNoYXJcbjs7XG5cbmxldCBpc19lbXB0eSB0ID0gbGVuZ3RoIHQgPSAwXG5cbmxldCByZWMgaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgc3RyaW5nIH5wb3MgfmxlbiB+bm90X2ZvdW5kIGNoYXIgPVxuICBpZiBwb3MgPj0gbGVuXG4gIHRoZW4gcmFpc2Ugbm90X2ZvdW5kXG4gIGVsc2UgaWYgQ2hhci5lcXVhbCAodW5zYWZlX2dldCBzdHJpbmcgcG9zKSBjaGFyXG4gIHRoZW4gcG9zXG4gIGVsc2UgaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgc3RyaW5nIH5wb3M6KHBvcyArIDEpIH5sZW4gfm5vdF9mb3VuZCBjaGFyXG47O1xuXG5sZXQgaW5kZXhfZXhuX2ludGVybmFsIHQgfm5vdF9mb3VuZCBjaGFyID1cbiAgaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgdCB+cG9zOjAgfmxlbjoobGVuZ3RoIHQpIH5ub3RfZm91bmQgY2hhclxuOztcblxubGV0IGluZGV4X2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5pbmRleF9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgaW5kZXhfZXhuIHQgY2hhciA9IGluZGV4X2V4bl9pbnRlcm5hbCB0IH5ub3RfZm91bmQgY2hhciBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGluZGV4X2V4blxuOztcblxubGV0IGluZGV4X2Zyb21fZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLmluZGV4X2Zyb21fZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGluZGV4X2Zyb21fZXhuIHQgcG9zIGNoYXIgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICAgIGlmIHBvcyA8IDAgfHwgcG9zID4gbGVuXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX2V4blwiXG4gICAgZWxzZSBpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCB0IH5wb3MgfmxlbiB+bm90X2ZvdW5kIGNoYXJcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBpbmRleF9mcm9tX2V4blxuOztcblxubGV0IHJlYyByaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgc3RyaW5nIH5wb3MgfmxlbiB+bm90X2ZvdW5kIGNoYXIgPVxuICBpZiBwb3MgPCAwXG4gIHRoZW4gcmFpc2Ugbm90X2ZvdW5kXG4gIGVsc2UgaWYgQ2hhci5lcXVhbCAodW5zYWZlX2dldCBzdHJpbmcgcG9zKSBjaGFyXG4gIHRoZW4gcG9zXG4gIGVsc2UgcmluZGV4X2Zyb21fZXhuX2ludGVybmFsIHN0cmluZyB+cG9zOihwb3MgLSAxKSB+bGVuIH5ub3RfZm91bmQgY2hhclxuOztcblxubGV0IHJpbmRleF9leG5faW50ZXJuYWwgdCB+bm90X2ZvdW5kIGNoYXIgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgcmluZGV4X2Zyb21fZXhuX2ludGVybmFsIHQgfnBvczoobGVuIC0gMSkgfmxlbiB+bm90X2ZvdW5kIGNoYXJcbjs7XG5cbmxldCByaW5kZXhfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLnJpbmRleF9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgcmluZGV4X2V4biB0IGNoYXIgPSByaW5kZXhfZXhuX2ludGVybmFsIHQgfm5vdF9mb3VuZCBjaGFyIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgcmluZGV4X2V4blxuOztcblxubGV0IHJpbmRleF9mcm9tX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5yaW5kZXhfZnJvbV9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgcmluZGV4X2Zyb21fZXhuIHQgcG9zIGNoYXIgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICAgIGlmIHBvcyA8IC0xIHx8IHBvcyA+PSBsZW5cbiAgICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tX2V4blwiXG4gICAgZWxzZSByaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgdCB+cG9zIH5sZW4gfm5vdF9mb3VuZCBjaGFyXG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgcmluZGV4X2Zyb21fZXhuXG47O1xuXG5sZXQgaW5kZXggdCBjaGFyID1cbiAgdHJ5IFNvbWUgKGluZGV4X2V4biB0IGNoYXIpIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubGV0IHJpbmRleCB0IGNoYXIgPVxuICB0cnkgU29tZSAocmluZGV4X2V4biB0IGNoYXIpIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubGV0IGluZGV4X2Zyb20gdCBwb3MgY2hhciA9XG4gIHRyeSBTb21lIChpbmRleF9mcm9tX2V4biB0IHBvcyBjaGFyKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmxldCByaW5kZXhfZnJvbSB0IHBvcyBjaGFyID1cbiAgdHJ5IFNvbWUgKHJpbmRleF9mcm9tX2V4biB0IHBvcyBjaGFyKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbm1vZHVsZSBTZWFyY2hfcGF0dGVybjAgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB7IHBhdHRlcm4gOiBzdHJpbmdcbiAgICA7IGNhc2Vfc2Vuc2l0aXZlIDogYm9vbFxuICAgIDsga21wX2FycmF5IDogaW50IGFycmF5XG4gICAgfVxuXG4gIGxldCBzZXhwX29mX3QgeyBwYXR0ZXJuOyBjYXNlX3NlbnNpdGl2ZTsga21wX2FycmF5ID0gXyB9IDogU2V4cC50ID1cbiAgICBMaXN0XG4gICAgICBbIExpc3QgWyBBdG9tIFwicGF0dGVyblwiOyBzZXhwX29mX3N0cmluZyBwYXR0ZXJuIF1cbiAgICAgIDsgTGlzdCBbIEF0b20gXCJjYXNlX3NlbnNpdGl2ZVwiOyBzZXhwX29mX2Jvb2wgY2FzZV9zZW5zaXRpdmUgXVxuICAgICAgXVxuICA7O1xuXG4gIGxldCBwYXR0ZXJuIHQgPSB0LnBhdHRlcm5cbiAgbGV0IGNhc2Vfc2Vuc2l0aXZlIHQgPSB0LmNhc2Vfc2Vuc2l0aXZlXG5cbiAgKCogRmluZCBtYXggbnVtYmVyIG9mIG1hdGNoZWQgY2hhcmFjdGVycyBhdCBbbmV4dF90ZXh0X2NoYXJdLCBnaXZlbiB0aGUgY3VycmVudFxuICAgICBbbWF0Y2hlZF9jaGFyc10uIFRyeSB0byBleHRlbmQgdGhlIGN1cnJlbnQgbWF0Y2gsIGlmIGNoYXJzIGRvbid0IG1hdGNoLCB0cnkgdG8gbWF0Y2hcbiAgICAgZmV3ZXIgY2hhcnMuIElmIGNoYXJzIG1hdGNoIHRoZW4gZXh0ZW5kIHRoZSBtYXRjaC4gKilcbiAgbGV0IGttcF9pbnRlcm5hbF9sb29wIH5tYXRjaGVkX2NoYXJzIH5uZXh0X3RleHRfY2hhciB+cGF0dGVybiB+a21wX2FycmF5IH5jaGFyX2VxdWFsID1cbiAgICBsZXQgbWF0Y2hlZF9jaGFycyA9IHJlZiBtYXRjaGVkX2NoYXJzIGluXG4gICAgd2hpbGVcbiAgICAgICFtYXRjaGVkX2NoYXJzID4gMFxuICAgICAgJiYgbm90IChjaGFyX2VxdWFsIG5leHRfdGV4dF9jaGFyICh1bnNhZmVfZ2V0IHBhdHRlcm4gIW1hdGNoZWRfY2hhcnMpKVxuICAgIGRvXG4gICAgICBtYXRjaGVkX2NoYXJzIDo9IEFycmF5LnVuc2FmZV9nZXQga21wX2FycmF5ICghbWF0Y2hlZF9jaGFycyAtIDEpXG4gICAgZG9uZTtcbiAgICBpZiBjaGFyX2VxdWFsIG5leHRfdGV4dF9jaGFyICh1bnNhZmVfZ2V0IHBhdHRlcm4gIW1hdGNoZWRfY2hhcnMpXG4gICAgdGhlbiBtYXRjaGVkX2NoYXJzIDo9ICFtYXRjaGVkX2NoYXJzICsgMTtcbiAgICAhbWF0Y2hlZF9jaGFyc1xuICA7O1xuXG4gIGxldCBnZXRfY2hhcl9lcXVhbCB+Y2FzZV9zZW5zaXRpdmUgPVxuICAgIG1hdGNoIGNhc2Vfc2Vuc2l0aXZlIHdpdGhcbiAgICB8IHRydWUgLT4gQ2hhci5lcXVhbFxuICAgIHwgZmFsc2UgLT4gQ2hhci5DYXNlbGVzcy5lcXVhbFxuICA7O1xuXG4gICgqIENsYXNzaWMgS01QIHByZS1wcm9jZXNzaW5nIG9mIHRoZSBwYXR0ZXJuOiBidWlsZCB0aGUgaW50IGFycmF5LCB3aGljaCwgZm9yIGVhY2ggaSxcbiAgICAgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBub24tdHJpdmlhbCBwcmVmaXggb2YgcyB3aGljaCBpcyBlcXVhbCB0byBhIHN1ZmZpeFxuICAgICBlbmRpbmcgYXQgcy5baV0gKilcbiAgbGV0IGNyZWF0ZSBwYXR0ZXJuIH5jYXNlX3NlbnNpdGl2ZSA9XG4gICAgbGV0IG4gPSBsZW5ndGggcGF0dGVybiBpblxuICAgIGxldCBrbXBfYXJyYXkgPSBBcnJheS5jcmVhdGUgfmxlbjpuICgtMSkgaW5cbiAgICBpZiBuID4gMFxuICAgIHRoZW4gKFxuICAgICAgbGV0IGNoYXJfZXF1YWwgPSBnZXRfY2hhcl9lcXVhbCB+Y2FzZV9zZW5zaXRpdmUgaW5cbiAgICAgIEFycmF5LnVuc2FmZV9zZXQga21wX2FycmF5IDAgMDtcbiAgICAgIGxldCBtYXRjaGVkX2NoYXJzID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMSB0byBuIC0gMSBkb1xuICAgICAgICBtYXRjaGVkX2NoYXJzXG4gICAgICAgIDo9IGttcF9pbnRlcm5hbF9sb29wXG4gICAgICAgICAgICAgfm1hdGNoZWRfY2hhcnM6IW1hdGNoZWRfY2hhcnNcbiAgICAgICAgICAgICB+bmV4dF90ZXh0X2NoYXI6KHVuc2FmZV9nZXQgcGF0dGVybiBpKVxuICAgICAgICAgICAgIH5wYXR0ZXJuXG4gICAgICAgICAgICAgfmttcF9hcnJheVxuICAgICAgICAgICAgIH5jaGFyX2VxdWFsO1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IGttcF9hcnJheSBpICFtYXRjaGVkX2NoYXJzXG4gICAgICBkb25lKTtcbiAgICB7IHBhdHRlcm47IGNhc2Vfc2Vuc2l0aXZlOyBrbXBfYXJyYXkgfVxuICA7O1xuXG4gICgqIENsYXNzaWMgS01QOiB1c2UgdGhlIHByZS1wcm9jZXNzZWQgcGF0dGVybiB0byBvcHRpbWl6ZSBsb29rLWJlaGluZHMgb24gbm9uLW1hdGNoZXMuXG4gICAgIFdlIHJldHVybiBpbnQgdG8gYXZvaWQgYWxsb2NhdGlvbiBpbiBbaW5kZXhfZXhuXS4gLTEgbWVhbnMgbm8gbWF0Y2guICopXG4gIGxldCBpbmRleF9pbnRlcm5hbCA/KHBvcyA9IDApIHsgcGF0dGVybjsgY2FzZV9zZW5zaXRpdmU7IGttcF9hcnJheSB9IH5pbl86dGV4dCA9XG4gICAgaWYgcG9zIDwgMCB8fCBwb3MgPiBsZW5ndGggdGV4dCAtIGxlbmd0aCBwYXR0ZXJuXG4gICAgdGhlbiAtMVxuICAgIGVsc2UgKFxuICAgICAgbGV0IGNoYXJfZXF1YWwgPSBnZXRfY2hhcl9lcXVhbCB+Y2FzZV9zZW5zaXRpdmUgaW5cbiAgICAgIGxldCBqID0gcmVmIHBvcyBpblxuICAgICAgbGV0IG1hdGNoZWRfY2hhcnMgPSByZWYgMCBpblxuICAgICAgbGV0IGsgPSBsZW5ndGggcGF0dGVybiBpblxuICAgICAgbGV0IG4gPSBsZW5ndGggdGV4dCBpblxuICAgICAgd2hpbGUgIWogPCBuICYmICFtYXRjaGVkX2NoYXJzIDwgayBkb1xuICAgICAgICBsZXQgbmV4dF90ZXh0X2NoYXIgPSB1bnNhZmVfZ2V0IHRleHQgIWogaW5cbiAgICAgICAgbWF0Y2hlZF9jaGFyc1xuICAgICAgICA6PSBrbXBfaW50ZXJuYWxfbG9vcFxuICAgICAgICAgICAgIH5tYXRjaGVkX2NoYXJzOiFtYXRjaGVkX2NoYXJzXG4gICAgICAgICAgICAgfm5leHRfdGV4dF9jaGFyXG4gICAgICAgICAgICAgfnBhdHRlcm5cbiAgICAgICAgICAgICB+a21wX2FycmF5XG4gICAgICAgICAgICAgfmNoYXJfZXF1YWw7XG4gICAgICAgIGogOj0gIWogKyAxXG4gICAgICBkb25lO1xuICAgICAgaWYgIW1hdGNoZWRfY2hhcnMgPSBrIHRoZW4gIWogLSBrIGVsc2UgLTEpXG4gIDs7XG5cbiAgbGV0IG1hdGNoZXMgdCBzdHIgPSBpbmRleF9pbnRlcm5hbCB0IH5pbl86c3RyID49IDBcblxuICBsZXQgaW5kZXggP3BvcyB0IH5pbl8gPVxuICAgIGxldCBwID0gaW5kZXhfaW50ZXJuYWwgP3BvcyB0IH5pbl8gaW5cbiAgICBpZiBwIDwgMCB0aGVuIE5vbmUgZWxzZSBTb21lIHBcbiAgOztcblxuICBsZXQgaW5kZXhfZXhuID9wb3MgdCB+aW5fID1cbiAgICBsZXQgcCA9IGluZGV4X2ludGVybmFsID9wb3MgdCB+aW5fIGluXG4gICAgaWYgcCA+PSAwXG4gICAgdGhlbiBwXG4gICAgZWxzZVxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlIFwiU3Vic3RyaW5nIG5vdCBmb3VuZFwiIFsgXCJzdWJzdHJpbmdcIiwgc2V4cF9vZl9zdHJpbmcgdC5wYXR0ZXJuIF0pXG4gIDs7XG5cbiAgbGV0IGluZGV4X2FsbCB7IHBhdHRlcm47IGNhc2Vfc2Vuc2l0aXZlOyBrbXBfYXJyYXkgfSB+bWF5X292ZXJsYXAgfmluXzp0ZXh0ID1cbiAgICBpZiBsZW5ndGggcGF0dGVybiA9IDBcbiAgICB0aGVuIExpc3QuaW5pdCAoMSArIGxlbmd0aCB0ZXh0KSB+ZjpGbi5pZFxuICAgIGVsc2UgKFxuICAgICAgbGV0IGNoYXJfZXF1YWwgPSBnZXRfY2hhcl9lcXVhbCB+Y2FzZV9zZW5zaXRpdmUgaW5cbiAgICAgIGxldCBtYXRjaGVkX2NoYXJzID0gcmVmIDAgaW5cbiAgICAgIGxldCBrID0gbGVuZ3RoIHBhdHRlcm4gaW5cbiAgICAgIGxldCBuID0gbGVuZ3RoIHRleHQgaW5cbiAgICAgIGxldCBmb3VuZCA9IHJlZiBbXSBpblxuICAgICAgZm9yIGogPSAwIHRvIG4gZG9cbiAgICAgICAgaWYgIW1hdGNoZWRfY2hhcnMgPSBrXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGZvdW5kIDo9IChqIC0gaykgOjogIWZvdW5kO1xuICAgICAgICAgICgqIHdlIGp1c3QgZm91bmQgYSBtYXRjaCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uICopXG4gICAgICAgICAgbWF0Y2ggbWF5X292ZXJsYXAgd2l0aFxuICAgICAgICAgIHwgdHJ1ZSAtPiBtYXRjaGVkX2NoYXJzIDo9IEFycmF5LnVuc2FmZV9nZXQga21wX2FycmF5IChrIC0gMSlcbiAgICAgICAgICB8IGZhbHNlIC0+IG1hdGNoZWRfY2hhcnMgOj0gMCk7XG4gICAgICAgIGlmIGogPCBuXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBuZXh0X3RleHRfY2hhciA9IHVuc2FmZV9nZXQgdGV4dCBqIGluXG4gICAgICAgICAgbWF0Y2hlZF9jaGFyc1xuICAgICAgICAgIDo9IGttcF9pbnRlcm5hbF9sb29wXG4gICAgICAgICAgICAgICB+bWF0Y2hlZF9jaGFyczohbWF0Y2hlZF9jaGFyc1xuICAgICAgICAgICAgICAgfm5leHRfdGV4dF9jaGFyXG4gICAgICAgICAgICAgICB+cGF0dGVyblxuICAgICAgICAgICAgICAgfmttcF9hcnJheVxuICAgICAgICAgICAgICAgfmNoYXJfZXF1YWwpXG4gICAgICBkb25lO1xuICAgICAgTGlzdC5yZXYgIWZvdW5kKVxuICA7O1xuXG4gIGxldCByZXBsYWNlX2ZpcnN0ID9wb3MgdCB+aW5fOnMgfndpdGhfID1cbiAgICBtYXRjaCBpbmRleCA/cG9zIHQgfmluXzpzIHdpdGhcbiAgICB8IE5vbmUgLT4gc1xuICAgIHwgU29tZSBpIC0+XG4gICAgICBsZXQgbGVuX3MgPSBsZW5ndGggcyBpblxuICAgICAgbGV0IGxlbl90ID0gbGVuZ3RoIHQucGF0dGVybiBpblxuICAgICAgbGV0IGxlbl93aXRoID0gbGVuZ3RoIHdpdGhfIGluXG4gICAgICBsZXQgZHN0ID0gQnl0ZXMuY3JlYXRlIChsZW5fcyArIGxlbl93aXRoIC0gbGVuX3QpIGluXG4gICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjOnMgfnNyY19wb3M6MCB+ZHN0IH5kc3RfcG9zOjAgfmxlbjppO1xuICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYzp3aXRoXyB+c3JjX3BvczowIH5kc3QgfmRzdF9wb3M6aSB+bGVuOmxlbl93aXRoO1xuICAgICAgQnl0ZXMuYmxpdF9zdHJpbmdcbiAgICAgICAgfnNyYzpzXG4gICAgICAgIH5zcmNfcG9zOihpICsgbGVuX3QpXG4gICAgICAgIH5kc3RcbiAgICAgICAgfmRzdF9wb3M6KGkgKyBsZW5fd2l0aClcbiAgICAgICAgfmxlbjoobGVuX3MgLSBpIC0gbGVuX3QpO1xuICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpkc3RcbiAgOztcblxuXG4gIGxldCByZXBsYWNlX2FsbCB0IH5pbl86cyB+d2l0aF8gPVxuICAgIGxldCBtYXRjaGVzID0gaW5kZXhfYWxsIHQgfm1heV9vdmVybGFwOmZhbHNlIH5pbl86cyBpblxuICAgIG1hdGNoIG1hdGNoZXMgd2l0aFxuICAgIHwgW10gLT4gc1xuICAgIHwgXyA6OiBfIC0+XG4gICAgICBsZXQgbGVuX3MgPSBsZW5ndGggcyBpblxuICAgICAgbGV0IGxlbl90ID0gbGVuZ3RoIHQucGF0dGVybiBpblxuICAgICAgbGV0IGxlbl93aXRoID0gbGVuZ3RoIHdpdGhfIGluXG4gICAgICBsZXQgbnVtX21hdGNoZXMgPSBMaXN0Lmxlbmd0aCBtYXRjaGVzIGluXG4gICAgICBsZXQgZHN0ID0gQnl0ZXMuY3JlYXRlIChsZW5fcyArICgobGVuX3dpdGggLSBsZW5fdCkgKiBudW1fbWF0Y2hlcykpIGluXG4gICAgICBsZXQgbmV4dF9kc3RfcG9zID0gcmVmIDAgaW5cbiAgICAgIGxldCBuZXh0X3NyY19wb3MgPSByZWYgMCBpblxuICAgICAgTGlzdC5pdGVyIG1hdGNoZXMgfmY6KGZ1biBpIC0+XG4gICAgICAgIGxldCBsZW4gPSBpIC0gIW5leHRfc3JjX3BvcyBpblxuICAgICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjOnMgfnNyY19wb3M6IW5leHRfc3JjX3BvcyB+ZHN0IH5kc3RfcG9zOiFuZXh0X2RzdF9wb3MgfmxlbjtcbiAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmdcbiAgICAgICAgICB+c3JjOndpdGhfXG4gICAgICAgICAgfnNyY19wb3M6MFxuICAgICAgICAgIH5kc3RcbiAgICAgICAgICB+ZHN0X3BvczooIW5leHRfZHN0X3BvcyArIGxlbilcbiAgICAgICAgICB+bGVuOmxlbl93aXRoO1xuICAgICAgICBuZXh0X2RzdF9wb3MgOj0gIW5leHRfZHN0X3BvcyArIGxlbiArIGxlbl93aXRoO1xuICAgICAgICBuZXh0X3NyY19wb3MgOj0gIW5leHRfc3JjX3BvcyArIGxlbiArIGxlbl90KTtcbiAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nXG4gICAgICAgIH5zcmM6c1xuICAgICAgICB+c3JjX3BvczohbmV4dF9zcmNfcG9zXG4gICAgICAgIH5kc3RcbiAgICAgICAgfmRzdF9wb3M6IW5leHRfZHN0X3Bvc1xuICAgICAgICB+bGVuOihsZW5fcyAtICFuZXh0X3NyY19wb3MpO1xuICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpkc3RcbiAgOztcblxuICBsZXQgc3BsaXRfb24gdCBzID1cbiAgICBsZXQgcGF0dGVybl9sZW4gPSBTdHJpbmcubGVuZ3RoIHQucGF0dGVybiBpblxuICAgIGxldCBtYXRjaGVzID0gaW5kZXhfYWxsIHQgfm1heV9vdmVybGFwOmZhbHNlIH5pbl86cyBpblxuICAgIExpc3QubWFwMl9leG5cbiAgICAgICgtcGF0dGVybl9sZW4gOjogbWF0Y2hlcylcbiAgICAgIChtYXRjaGVzIEAgWyBTdHJpbmcubGVuZ3RoIHMgXSlcbiAgICAgIH5mOihmdW4gaSBqIC0+IHN1YiBzIH5wb3M6KGkgKyBwYXR0ZXJuX2xlbikgfmxlbjooaiAtIGkgLSBwYXR0ZXJuX2xlbikpXG4gIDs7XG5cbiAgbW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgICB0eXBlIHB1YmxpYyA9IHRcblxuICAgIHR5cGUgbm9ucmVjIHQgPSB0ID1cbiAgICAgIHsgcGF0dGVybiA6IHN0cmluZ1xuICAgICAgOyBjYXNlX3NlbnNpdGl2ZSA6IGJvb2xcbiAgICAgIDsga21wX2FycmF5IDogaW50IGFycmF5XG4gICAgICB9XG4gICAgW0BAZGVyaXZpbmdfaW5saW5lIGVxdWFsLCBzZXhwX29mXVxuXG4gICAgbGV0IGVxdWFsID1cbiAgICAgIChmdW4gYV9fMDAyXyBiX18wMDNfIC0+XG4gICAgICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDJfIGJfXzAwM19cbiAgICAgICAgIHRoZW4gdHJ1ZVxuICAgICAgICAgZWxzZVxuICAgICAgICAgICBQcHhfY29tcGFyZV9saWIuKCAmJiApXG4gICAgICAgICAgICAgKGVxdWFsX3N0cmluZyBhX18wMDJfLnBhdHRlcm4gYl9fMDAzXy5wYXR0ZXJuKVxuICAgICAgICAgICAgIChQcHhfY29tcGFyZV9saWIuKCAmJiApXG4gICAgICAgICAgICAgICAgKGVxdWFsX2Jvb2wgYV9fMDAyXy5jYXNlX3NlbnNpdGl2ZSBiX18wMDNfLmNhc2Vfc2Vuc2l0aXZlKVxuICAgICAgICAgICAgICAgIChlcXVhbF9hcnJheSBlcXVhbF9pbnQgYV9fMDAyXy5rbXBfYXJyYXkgYl9fMDAzXy5rbXBfYXJyYXkpKVxuICAgICAgICAgICA6IHQgLT4gdCAtPiBib29sKVxuICAgIDs7XG5cbiAgICBsZXQgc2V4cF9vZl90ID1cbiAgICAgIChmdW4geyBwYXR0ZXJuID0gcGF0dGVybl9fMDA3X1xuICAgICAgICAgICA7IGNhc2Vfc2Vuc2l0aXZlID0gY2FzZV9zZW5zaXRpdmVfXzAwOV9cbiAgICAgICAgICAgOyBrbXBfYXJyYXkgPSBrbXBfYXJyYXlfXzAxMV9cbiAgICAgICAgICAgfSAtPlxuICAgICAgICBsZXQgYm5kc19fMDA2XyA9IFtdIGluXG4gICAgICAgIGxldCBibmRzX18wMDZfID1cbiAgICAgICAgICBsZXQgYXJnX18wMTJfID0gc2V4cF9vZl9hcnJheSBzZXhwX29mX2ludCBrbXBfYXJyYXlfXzAxMV8gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJrbXBfYXJyYXlcIjsgYXJnX18wMTJfIF0gOjogYm5kc19fMDA2X1xuICAgICAgICBpblxuICAgICAgICBsZXQgYm5kc19fMDA2XyA9XG4gICAgICAgICAgbGV0IGFyZ19fMDEwXyA9IHNleHBfb2ZfYm9vbCBjYXNlX3NlbnNpdGl2ZV9fMDA5XyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImNhc2Vfc2Vuc2l0aXZlXCI7IGFyZ19fMDEwXyBdXG4gICAgICAgICAgOjogYm5kc19fMDA2X1xuICAgICAgICBpblxuICAgICAgICBsZXQgYm5kc19fMDA2XyA9XG4gICAgICAgICAgbGV0IGFyZ19fMDA4XyA9IHNleHBfb2Zfc3RyaW5nIHBhdHRlcm5fXzAwN18gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJwYXR0ZXJuXCI7IGFyZ19fMDA4XyBdIDo6IGJuZHNfXzAwNl9cbiAgICAgICAgaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IGJuZHNfXzAwNl9cbiAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCByZXByZXNlbnRhdGlvbiA9IEZuLmlkXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBTZWFyY2hfcGF0dGVybl9oZWxwZXIgPSBzdHJ1Y3RcbiAgbW9kdWxlIFNlYXJjaF9wYXR0ZXJuID0gU2VhcmNoX3BhdHRlcm4wXG5lbmRcblxub3BlbiBTZWFyY2hfcGF0dGVybl9oZWxwZXJcblxubGV0IHN1YnN0cl9pbmRleF9nZW4gfmNhc2Vfc2Vuc2l0aXZlID9wb3MgdCB+cGF0dGVybiA9XG4gIFNlYXJjaF9wYXR0ZXJuLmluZGV4ID9wb3MgKFNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSB+Y2FzZV9zZW5zaXRpdmUgcGF0dGVybikgfmluXzp0XG47O1xuXG5sZXQgc3Vic3RyX2luZGV4X2V4bl9nZW4gfmNhc2Vfc2Vuc2l0aXZlID9wb3MgdCB+cGF0dGVybiA9XG4gIFNlYXJjaF9wYXR0ZXJuLmluZGV4X2V4biA/cG9zIChTZWFyY2hfcGF0dGVybi5jcmVhdGUgfmNhc2Vfc2Vuc2l0aXZlIHBhdHRlcm4pIH5pbl86dFxuOztcblxubGV0IHN1YnN0cl9pbmRleF9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZSB0IH5tYXlfb3ZlcmxhcCB+cGF0dGVybiA9XG4gIFNlYXJjaF9wYXR0ZXJuLmluZGV4X2FsbFxuICAgIChTZWFyY2hfcGF0dGVybi5jcmVhdGUgfmNhc2Vfc2Vuc2l0aXZlIHBhdHRlcm4pXG4gICAgfm1heV9vdmVybGFwXG4gICAgfmluXzp0XG47O1xuXG5sZXQgc3Vic3RyX3JlcGxhY2VfZmlyc3RfZ2VuIH5jYXNlX3NlbnNpdGl2ZSA/cG9zIHQgfnBhdHRlcm4gPVxuICBTZWFyY2hfcGF0dGVybi5yZXBsYWNlX2ZpcnN0ID9wb3MgKFNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSB+Y2FzZV9zZW5zaXRpdmUgcGF0dGVybikgfmluXzp0XG47O1xuXG5sZXQgc3Vic3RyX3JlcGxhY2VfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmUgdCB+cGF0dGVybiA9XG4gIFNlYXJjaF9wYXR0ZXJuLnJlcGxhY2VfYWxsIChTZWFyY2hfcGF0dGVybi5jcmVhdGUgfmNhc2Vfc2Vuc2l0aXZlIHBhdHRlcm4pIH5pbl86dFxuOztcblxubGV0IGlzX3N1YnN0cmluZ19nZW4gfmNhc2Vfc2Vuc2l0aXZlIHQgfnN1YnN0cmluZyA9XG4gIE9wdGlvbi5pc19zb21lIChzdWJzdHJfaW5kZXhfZ2VuIHQgfnBhdHRlcm46c3Vic3RyaW5nIH5jYXNlX3NlbnNpdGl2ZSlcbjs7XG5cbmxldCBzdWJzdHJfaW5kZXggPSBzdWJzdHJfaW5kZXhfZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5sZXQgc3Vic3RyX2luZGV4X2V4biA9IHN1YnN0cl9pbmRleF9leG5fZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5sZXQgc3Vic3RyX2luZGV4X2FsbCA9IHN1YnN0cl9pbmRleF9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5sZXQgc3Vic3RyX3JlcGxhY2VfZmlyc3QgPSBzdWJzdHJfcmVwbGFjZV9maXJzdF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcbmxldCBzdWJzdHJfcmVwbGFjZV9hbGwgPSBzdWJzdHJfcmVwbGFjZV9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5sZXQgaXNfc3Vic3RyaW5nID0gaXNfc3Vic3RyaW5nX2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxuXG5sZXQgaXNfc3Vic3RyaW5nX2F0X2dlbiA9XG4gIGxldCByZWMgbG9vcCB+c3RyIH5zdHJfcG9zIH5zdWIgfnN1Yl9wb3MgfnN1Yl9sZW4gfmNoYXJfZXF1YWwgPVxuICAgIGlmIHN1Yl9wb3MgPSBzdWJfbGVuXG4gICAgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBjaGFyX2VxdWFsICh1bnNhZmVfZ2V0IHN0ciBzdHJfcG9zKSAodW5zYWZlX2dldCBzdWIgc3ViX3BvcylcbiAgICB0aGVuIGxvb3AgfnN0ciB+c3RyX3Bvczooc3RyX3BvcyArIDEpIH5zdWIgfnN1Yl9wb3M6KHN1Yl9wb3MgKyAxKSB+c3ViX2xlbiB+Y2hhcl9lcXVhbFxuICAgIGVsc2UgZmFsc2VcbiAgaW5cbiAgZnVuIHN0ciB+cG9zOnN0cl9wb3MgfnN1YnN0cmluZzpzdWIgfmNoYXJfZXF1YWwgLT5cbiAgICBsZXQgc3RyX2xlbiA9IGxlbmd0aCBzdHIgaW5cbiAgICBsZXQgc3ViX2xlbiA9IGxlbmd0aCBzdWIgaW5cbiAgICBpZiBzdHJfcG9zIDwgMCB8fCBzdHJfcG9zID4gc3RyX2xlblxuICAgIHRoZW5cbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIlN0cmluZy5pc19zdWJzdHJpbmdfYXQ6IGludmFsaWQgaW5kZXggJWQgZm9yIHN0cmluZyBvZiBsZW5ndGggJWRcIlxuICAgICAgICBzdHJfcG9zXG4gICAgICAgIHN0cl9sZW5cbiAgICAgICAgKCk7XG4gICAgc3RyX3BvcyArIHN1Yl9sZW4gPD0gc3RyX2xlblxuICAgICYmIGxvb3AgfnN0ciB+c3RyX3BvcyB+c3ViIH5zdWJfcG9zOjAgfnN1Yl9sZW4gfmNoYXJfZXF1YWxcbjs7XG5cbmxldCBpc19zdWZmaXhfZ2VuIHN0cmluZyB+c3VmZml4IH5jaGFyX2VxdWFsID1cbiAgbGV0IHN0cmluZ19sZW4gPSBsZW5ndGggc3RyaW5nIGluXG4gIGxldCBzdWZmaXhfbGVuID0gbGVuZ3RoIHN1ZmZpeCBpblxuICBzdHJpbmdfbGVuID49IHN1ZmZpeF9sZW5cbiAgJiYgaXNfc3Vic3RyaW5nX2F0X2dlblxuICAgICAgIHN0cmluZ1xuICAgICAgIH5wb3M6KHN0cmluZ19sZW4gLSBzdWZmaXhfbGVuKVxuICAgICAgIH5zdWJzdHJpbmc6c3VmZml4XG4gICAgICAgfmNoYXJfZXF1YWxcbjs7XG5cbmxldCBpc19wcmVmaXhfZ2VuIHN0cmluZyB+cHJlZml4IH5jaGFyX2VxdWFsID1cbiAgbGV0IHN0cmluZ19sZW4gPSBsZW5ndGggc3RyaW5nIGluXG4gIGxldCBwcmVmaXhfbGVuID0gbGVuZ3RoIHByZWZpeCBpblxuICBzdHJpbmdfbGVuID49IHByZWZpeF9sZW5cbiAgJiYgaXNfc3Vic3RyaW5nX2F0X2dlbiBzdHJpbmcgfnBvczowIH5zdWJzdHJpbmc6cHJlZml4IH5jaGFyX2VxdWFsXG47O1xuXG5tb2R1bGUgQ2FzZWxlc3MgPSBzdHJ1Y3RcbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBzdHJpbmcgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICAgIGxldCB0X29mX3NleHAgPSAoc3RyaW5nX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2Zfc3RyaW5nIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gc3RyaW5nX3NleHBfZ3JhbW1hclxuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCBjaGFyX2NvbXBhcmVfY2FzZWxlc3MgYzEgYzIgPSBDaGFyLmNvbXBhcmUgKENoYXIubG93ZXJjYXNlIGMxKSAoQ2hhci5sb3dlcmNhc2UgYzIpXG5cbiAgICBsZXQgcmVjIGNvbXBhcmVfbG9vcCB+cG9zIH5zdHJpbmcxIH5sZW4xIH5zdHJpbmcyIH5sZW4yID1cbiAgICAgIGlmIHBvcyA9IGxlbjFcbiAgICAgIHRoZW4gaWYgcG9zID0gbGVuMiB0aGVuIDAgZWxzZSAtMVxuICAgICAgZWxzZSBpZiBwb3MgPSBsZW4yXG4gICAgICB0aGVuIDFcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgYyA9IGNoYXJfY29tcGFyZV9jYXNlbGVzcyAodW5zYWZlX2dldCBzdHJpbmcxIHBvcykgKHVuc2FmZV9nZXQgc3RyaW5nMiBwb3MpIGluXG4gICAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgICB8IDAgLT4gY29tcGFyZV9sb29wIH5wb3M6KHBvcyArIDEpIH5zdHJpbmcxIH5sZW4xIH5zdHJpbmcyIH5sZW4yXG4gICAgICAgIHwgXyAtPiBjKVxuICAgIDs7XG5cbiAgICBsZXQgY29tcGFyZSBzdHJpbmcxIHN0cmluZzIgPVxuICAgICAgaWYgcGh5c19lcXVhbCBzdHJpbmcxIHN0cmluZzJcbiAgICAgIHRoZW4gMFxuICAgICAgZWxzZVxuICAgICAgICBjb21wYXJlX2xvb3BcbiAgICAgICAgICB+cG9zOjBcbiAgICAgICAgICB+c3RyaW5nMVxuICAgICAgICAgIH5sZW4xOihTdHJpbmcubGVuZ3RoIHN0cmluZzEpXG4gICAgICAgICAgfnN0cmluZzJcbiAgICAgICAgICB+bGVuMjooU3RyaW5nLmxlbmd0aCBzdHJpbmcyKVxuICAgIDs7XG5cbiAgICBsZXQgaGFzaF9mb2xkX3Qgc3RhdGUgdCA9XG4gICAgICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgICAgIGxldCBzdGF0ZSA9IHJlZiAoaGFzaF9mb2xkX2ludCBzdGF0ZSBsZW4pIGluXG4gICAgICBmb3IgcG9zID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgIHN0YXRlIDo9IGhhc2hfZm9sZF9jaGFyICFzdGF0ZSAoQ2hhci5sb3dlcmNhc2UgKHVuc2FmZV9nZXQgdCBwb3MpKVxuICAgICAgZG9uZTtcbiAgICAgICFzdGF0ZVxuICAgIDs7XG5cbiAgICBsZXQgaGFzaCB0ID0gSGFzaC5ydW4gaGFzaF9mb2xkX3QgdFxuICAgIGxldCBpc19zdWZmaXggcyB+c3VmZml4ID0gaXNfc3VmZml4X2dlbiBzIH5zdWZmaXggfmNoYXJfZXF1YWw6Q2hhci5DYXNlbGVzcy5lcXVhbFxuICAgIGxldCBpc19wcmVmaXggcyB+cHJlZml4ID0gaXNfcHJlZml4X2dlbiBzIH5wcmVmaXggfmNoYXJfZXF1YWw6Q2hhci5DYXNlbGVzcy5lcXVhbFxuICAgIGxldCBzdWJzdHJfaW5kZXggPSBzdWJzdHJfaW5kZXhfZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBzdWJzdHJfaW5kZXhfZXhuID0gc3Vic3RyX2luZGV4X2V4bl9nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IHN1YnN0cl9pbmRleF9hbGwgPSBzdWJzdHJfaW5kZXhfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgc3Vic3RyX3JlcGxhY2VfZmlyc3QgPSBzdWJzdHJfcmVwbGFjZV9maXJzdF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IHN1YnN0cl9yZXBsYWNlX2FsbCA9IHN1YnN0cl9yZXBsYWNlX2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IGlzX3N1YnN0cmluZyA9IGlzX3N1YnN0cmluZ19nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IGlzX3N1YnN0cmluZ19hdCA9IGlzX3N1YnN0cmluZ19hdF9nZW4gfmNoYXJfZXF1YWw6Q2hhci5DYXNlbGVzcy5lcXVhbFxuICBlbmRcblxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBDb21wYXJhYmxlLk1ha2UgKFQpXG5lbmRcblxubGV0IG9mX3N0cmluZyA9IEZuLmlkXG5sZXQgdG9fc3RyaW5nID0gRm4uaWRcblxubGV0IGluaXQgbiB+ZiA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmdmIFwiU3RyaW5nLmluaXQgJWRcIiBuICgpO1xuICBsZXQgdCA9IEJ5dGVzLmNyZWF0ZSBuIGluXG4gIGZvciBpID0gMCB0byBuIC0gMSBkb1xuICAgIEJ5dGVzLnNldCB0IGkgKGYgaSlcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp0XG47O1xuXG5sZXQgdG9fbGlzdCBzID1cbiAgbGV0IHJlYyBsb29wIGFjYyBpID0gaWYgaSA8IDAgdGhlbiBhY2MgZWxzZSBsb29wIChzLltpXSA6OiBhY2MpIChpIC0gMSkgaW5cbiAgbG9vcCBbXSAobGVuZ3RoIHMgLSAxKVxuOztcblxubGV0IHRvX2xpc3RfcmV2IHMgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIGFjYyBpID0gaWYgaSA9IGxlbiB0aGVuIGFjYyBlbHNlIGxvb3AgKHMuW2ldIDo6IGFjYykgKGkgKyAxKSBpblxuICBsb29wIFtdIDBcbjs7XG5cbmxldCByZXYgdCA9XG4gIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICBsZXQgcmVzID0gQnl0ZXMuY3JlYXRlIGxlbiBpblxuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgcmVzIGkgKHVuc2FmZV9nZXQgdCAobGVuIC0gMSAtIGkpKVxuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnJlc1xuOztcblxuKCoqIEVmZmljaWVudCBzdHJpbmcgc3BsaXR0aW5nICopXG5cbmxldCBsc3BsaXQyX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5sc3BsaXQyX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBsc3BsaXQyX2V4biBsaW5lIH5vbjpkZWxpbSA9XG4gICAgbGV0IHBvcyA9IGluZGV4X2V4bl9pbnRlcm5hbCBsaW5lIH5ub3RfZm91bmQgZGVsaW0gaW5cbiAgICBzdWIgbGluZSB+cG9zOjAgfmxlbjpwb3MsIHN1YiBsaW5lIH5wb3M6KHBvcyArIDEpIH5sZW46KGxlbmd0aCBsaW5lIC0gcG9zIC0gMSlcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBsc3BsaXQyX2V4blxuOztcblxubGV0IHJzcGxpdDJfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLnJzcGxpdDJfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IHJzcGxpdDJfZXhuIGxpbmUgfm9uOmRlbGltID1cbiAgICBsZXQgcG9zID0gcmluZGV4X2V4bl9pbnRlcm5hbCBsaW5lIH5ub3RfZm91bmQgZGVsaW0gaW5cbiAgICBzdWIgbGluZSB+cG9zOjAgfmxlbjpwb3MsIHN1YiBsaW5lIH5wb3M6KHBvcyArIDEpIH5sZW46KGxlbmd0aCBsaW5lIC0gcG9zIC0gMSlcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICByc3BsaXQyX2V4blxuOztcblxubGV0IGxzcGxpdDIgbGluZSB+b24gPVxuICB0cnkgU29tZSAobHNwbGl0Ml9leG4gbGluZSB+b24pIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubGV0IHJzcGxpdDIgbGluZSB+b24gPVxuICB0cnkgU29tZSAocnNwbGl0Ml9leG4gbGluZSB+b24pIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubGV0IHJlYyBjaGFyX2xpc3RfbWVtIGwgKGMgOiBjaGFyKSA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IGZhbHNlXG4gIHwgaGQgOjogdGwgLT4gQ2hhci5lcXVhbCBoZCBjIHx8IGNoYXJfbGlzdF9tZW0gdGwgY1xuOztcblxubGV0IHNwbGl0X2dlbiBzdHIgfm9uID1cbiAgbGV0IGlzX2RlbGltID1cbiAgICBtYXRjaCBvbiB3aXRoXG4gICAgfCBgY2hhciBjJyAtPiBmdW4gYyAtPiBDaGFyLmVxdWFsIGMgYydcbiAgICB8IGBjaGFyX2xpc3QgbCAtPiBmdW4gYyAtPiBjaGFyX2xpc3RfbWVtIGwgY1xuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIHN0ciBpblxuICBsZXQgcmVjIGxvb3AgYWNjIGxhc3RfcG9zIHBvcyA9XG4gICAgaWYgcG9zID0gLTFcbiAgICB0aGVuIHN1YiBzdHIgfnBvczowIH5sZW46bGFzdF9wb3MgOjogYWNjXG4gICAgZWxzZSBpZiBpc19kZWxpbSBzdHIuW3Bvc11cbiAgICB0aGVuIChcbiAgICAgIGxldCBwb3MxID0gcG9zICsgMSBpblxuICAgICAgbGV0IHN1Yl9zdHIgPSBzdWIgc3RyIH5wb3M6cG9zMSB+bGVuOihsYXN0X3BvcyAtIHBvczEpIGluXG4gICAgICBsb29wIChzdWJfc3RyIDo6IGFjYykgcG9zIChwb3MgLSAxKSlcbiAgICBlbHNlIGxvb3AgYWNjIGxhc3RfcG9zIChwb3MgLSAxKVxuICBpblxuICBsb29wIFtdIGxlbiAobGVuIC0gMSlcbjs7XG5cbmxldCBzcGxpdCBzdHIgfm9uID0gc3BsaXRfZ2VuIHN0ciB+b246KGBjaGFyIG9uKVxubGV0IHNwbGl0X29uX2NoYXJzIHN0ciB+b246Y2hhcnMgPSBzcGxpdF9nZW4gc3RyIH5vbjooYGNoYXJfbGlzdCBjaGFycylcblxubGV0IHNwbGl0X2xpbmVzID1cbiAgbGV0IGJhY2tfdXBfYXRfbmV3bGluZSB+dCB+cG9zIH5lb2wgPVxuICAgIHBvcyA6PSAhcG9zIC0gaWYgIXBvcyA+IDAgJiYgQ2hhci5lcXVhbCB0LlshcG9zIC0gMV0gJ1xccicgdGhlbiAyIGVsc2UgMTtcbiAgICBlb2wgOj0gIXBvcyArIDFcbiAgaW5cbiAgZnVuIHQgLT5cbiAgICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gICAgaWYgbiA9IDBcbiAgICB0aGVuIFtdXG4gICAgZWxzZSAoXG4gICAgICAoKiBJbnZhcmlhbnQ6IFstMSA8PSBwb3MgPCBlb2xdLiAqKVxuICAgICAgbGV0IHBvcyA9IHJlZiAobiAtIDEpIGluXG4gICAgICBsZXQgZW9sID0gcmVmIG4gaW5cbiAgICAgIGxldCBhYyA9IHJlZiBbXSBpblxuICAgICAgKCogV2UgdHJlYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHNwZWNpYWxseSwgYmVjYXVzZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhXG4gICAgICAgICBuZXdsaW5lLCB3ZSBkb24ndCB3YW50IGFuIGV4dHJhIGVtcHR5IHN0cmluZyBhdCB0aGUgZW5kIG9mIHRoZSBvdXRwdXQuICopXG4gICAgICBpZiBDaGFyLmVxdWFsIHQuWyFwb3NdICdcXG4nIHRoZW4gYmFja191cF9hdF9uZXdsaW5lIH50IH5wb3MgfmVvbDtcbiAgICAgIHdoaWxlICFwb3MgPj0gMCBkb1xuICAgICAgICBpZiBDaGFyLiggPD4gKSB0LlshcG9zXSAnXFxuJ1xuICAgICAgICB0aGVuIGRlY3IgcG9zXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgICgqIEJlY2F1c2UgW3BvcyA8IGVvbF0sIHdlIGtub3cgdGhhdCBbc3RhcnQgPD0gZW9sXS4gKilcbiAgICAgICAgICBsZXQgc3RhcnQgPSAhcG9zICsgMSBpblxuICAgICAgICAgIGFjIDo9IHN1YiB0IH5wb3M6c3RhcnQgfmxlbjooIWVvbCAtIHN0YXJ0KSA6OiAhYWM7XG4gICAgICAgICAgYmFja191cF9hdF9uZXdsaW5lIH50IH5wb3MgfmVvbClcbiAgICAgIGRvbmU7XG4gICAgICBzdWIgdCB+cG9zOjAgfmxlbjohZW9sIDo6ICFhYylcbjs7XG5cbmxldCBpc19zdWZmaXggcyB+c3VmZml4ID0gaXNfc3VmZml4X2dlbiBzIH5zdWZmaXggfmNoYXJfZXF1YWw6Q2hhci5lcXVhbFxubGV0IGlzX3ByZWZpeCBzIH5wcmVmaXggPSBpc19wcmVmaXhfZ2VuIHMgfnByZWZpeCB+Y2hhcl9lcXVhbDpDaGFyLmVxdWFsXG5cbmxldCBpc19zdWJzdHJpbmdfYXQgcyB+cG9zIH5zdWJzdHJpbmcgPVxuICBpc19zdWJzdHJpbmdfYXRfZ2VuIHMgfnBvcyB+c3Vic3RyaW5nIH5jaGFyX2VxdWFsOkNoYXIuZXF1YWxcbjs7XG5cbmxldCB3cmFwX3N1Yl9uIHQgbiB+bmFtZSB+cG9zIH5sZW4gfm9uX2Vycm9yID1cbiAgaWYgbiA8IDBcbiAgdGhlbiBpbnZhbGlkX2FyZyAobmFtZSBeIFwiIGV4cGVjdGluZyBub25uZWdhdGl2ZSBhcmd1bWVudFwiKVxuICBlbHNlIChcbiAgICB0cnkgc3ViIHQgfnBvcyB+bGVuIHdpdGhcbiAgICB8IF8gLT4gb25fZXJyb3IpXG47O1xuXG5sZXQgZHJvcF9wcmVmaXggdCBuID1cbiAgd3JhcF9zdWJfbiB+bmFtZTpcImRyb3BfcHJlZml4XCIgdCBuIH5wb3M6biB+bGVuOihsZW5ndGggdCAtIG4pIH5vbl9lcnJvcjpcIlwiXG47O1xuXG5sZXQgZHJvcF9zdWZmaXggdCBuID1cbiAgd3JhcF9zdWJfbiB+bmFtZTpcImRyb3Bfc3VmZml4XCIgdCBuIH5wb3M6MCB+bGVuOihsZW5ndGggdCAtIG4pIH5vbl9lcnJvcjpcIlwiXG47O1xuXG5sZXQgcHJlZml4IHQgbiA9IHdyYXBfc3ViX24gfm5hbWU6XCJwcmVmaXhcIiB0IG4gfnBvczowIH5sZW46biB+b25fZXJyb3I6dFxubGV0IHN1ZmZpeCB0IG4gPSB3cmFwX3N1Yl9uIH5uYW1lOlwic3VmZml4XCIgdCBuIH5wb3M6KGxlbmd0aCB0IC0gbikgfmxlbjpuIH5vbl9lcnJvcjp0XG5cbmxldCBsZmluZGkgPyhwb3MgPSAwKSB0IH5mID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBsZXQgcmVjIGxvb3AgaSA9IGlmIGkgPSBuIHRoZW4gTm9uZSBlbHNlIGlmIGYgaSB0LltpXSB0aGVuIFNvbWUgaSBlbHNlIGxvb3AgKGkgKyAxKSBpblxuICBsb29wIHBvc1xuOztcblxubGV0IGZpbmQgdCB+ZiA9XG4gIG1hdGNoIGxmaW5kaSB0IH5mOihmdW4gXyBjIC0+IGYgYykgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgaSAtPiBTb21lIHQuW2ldXG47O1xuXG5sZXQgZmluZF9tYXAgdCB+ZiA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuXG4gICAgdGhlbiBOb25lXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBmIHQuW2ldIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSlcbiAgICAgIHwgU29tZSBfIGFzIHJlcyAtPiByZXMpXG4gIGluXG4gIGxvb3AgMFxuOztcblxubGV0IHJmaW5kaSA/cG9zIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSA9IGlmIGkgPCAwIHRoZW4gTm9uZSBlbHNlIGlmIGYgaSB0LltpXSB0aGVuIFNvbWUgaSBlbHNlIGxvb3AgKGkgLSAxKSBpblxuICBsZXQgcG9zID1cbiAgICBtYXRjaCBwb3Mgd2l0aFxuICAgIHwgU29tZSBwb3MgLT4gcG9zXG4gICAgfCBOb25lIC0+IGxlbmd0aCB0IC0gMVxuICBpblxuICBsb29wIHBvc1xuOztcblxubGV0IGxhc3Rfbm9uX2Ryb3AgfmRyb3AgdCA9IHJmaW5kaSB0IH5mOihmdW4gXyBjIC0+IG5vdCAoZHJvcCBjKSlcblxubGV0IHJzdHJpcCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgPVxuICBtYXRjaCBsYXN0X25vbl9kcm9wIHQgfmRyb3Agd2l0aFxuICB8IE5vbmUgLT4gXCJcIlxuICB8IFNvbWUgaSAtPiBpZiBpID0gbGVuZ3RoIHQgLSAxIHRoZW4gdCBlbHNlIHByZWZpeCB0IChpICsgMSlcbjs7XG5cbmxldCBmaXJzdF9ub25fZHJvcCB+ZHJvcCB0ID0gbGZpbmRpIHQgfmY6KGZ1biBfIGMgLT4gbm90IChkcm9wIGMpKVxuXG5sZXQgbHN0cmlwID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCA9XG4gIG1hdGNoIGZpcnN0X25vbl9kcm9wIHQgfmRyb3Agd2l0aFxuICB8IE5vbmUgLT4gXCJcIlxuICB8IFNvbWUgMCAtPiB0XG4gIHwgU29tZSBuIC0+IGRyb3BfcHJlZml4IHQgblxuOztcblxuKCogW3N0cmlwIHRdIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIFtsc3RyaXAgKHJzdHJpcCB0KV0uICBUaGUgaW1wbGVtZW50YXRpb25cbiAgIGJlbG93IHNhdmVzIChhdCBsZWFzdCkgYSBmYWN0b3Igb2YgdHdvIGFsbG9jYXRpb24sIGJ5IG9ubHkgYWxsb2NhdGluZyB0aGVcbiAgIGZpbmFsIHJlc3VsdC4gIFRoaXMgYWxzbyBzYXZlcyBzb21lIGFtb3VudCBvZiB0aW1lLiAqKVxubGV0IHN0cmlwID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCA9XG4gIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICBpZiBsZW5ndGggPSAwIHx8IG5vdCAoZHJvcCB0LlswXSB8fCBkcm9wIHQuW2xlbmd0aCAtIDFdKVxuICB0aGVuIHRcbiAgZWxzZSAoXG4gICAgbWF0Y2ggZmlyc3Rfbm9uX2Ryb3AgdCB+ZHJvcCB3aXRoXG4gICAgfCBOb25lIC0+IFwiXCJcbiAgICB8IFNvbWUgZmlyc3QgLT5cbiAgICAgIChtYXRjaCBsYXN0X25vbl9kcm9wIHQgfmRyb3Agd2l0aFxuICAgICAgIHwgTm9uZSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICB8IFNvbWUgbGFzdCAtPiBzdWIgdCB+cG9zOmZpcnN0IH5sZW46KGxhc3QgLSBmaXJzdCArIDEpKSlcbjs7XG5cbmxldCBtYXBpIHQgfmYgPVxuICBsZXQgbCA9IGxlbmd0aCB0IGluXG4gIGxldCB0JyA9IEJ5dGVzLmNyZWF0ZSBsIGluXG4gIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgdCcgaSAoZiBpIHQuW2ldKVxuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnQnXG47O1xuXG4oKiByZXBlYXRlZCBjb2RlIHRvIGF2b2lkIHJlcXVpcmluZyBhbiBleHRyYSBhbGxvY2F0aW9uIGZvciBhIGNsb3N1cmUgb24gZWFjaCBjYWxsLiAqKVxubGV0IG1hcCB0IH5mID1cbiAgbGV0IGwgPSBsZW5ndGggdCBpblxuICBsZXQgdCcgPSBCeXRlcy5jcmVhdGUgbCBpblxuICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICBCeXRlcy51bnNhZmVfc2V0IHQnIGkgKGYgdC5baV0pXG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6dCdcbjs7XG5cbmxldCB0b19hcnJheSBzID0gQXJyYXkuaW5pdCAobGVuZ3RoIHMpIH5mOihmdW4gaSAtPiBzLltpXSlcblxubGV0IGV4aXN0cyA9XG4gIGxldCByZWMgbG9vcCBzIGkgfmxlbiB+ZiA9IGkgPCBsZW4gJiYgKGYgcy5baV0gfHwgbG9vcCBzIChpICsgMSkgfmxlbiB+ZikgaW5cbiAgZnVuIHMgfmYgLT4gbG9vcCBzIDAgfmxlbjoobGVuZ3RoIHMpIH5mXG47O1xuXG5sZXQgZm9yX2FsbCA9XG4gIGxldCByZWMgbG9vcCBzIGkgfmxlbiB+ZiA9IGkgPSBsZW4gfHwgKGYgcy5baV0gJiYgbG9vcCBzIChpICsgMSkgfmxlbiB+ZikgaW5cbiAgZnVuIHMgfmYgLT4gbG9vcCBzIDAgfmxlbjoobGVuZ3RoIHMpIH5mXG47O1xuXG5sZXQgZm9sZCA9XG4gIGxldCByZWMgbG9vcCB0IGkgYWMgfmYgfmxlbiA9XG4gICAgaWYgaSA9IGxlbiB0aGVuIGFjIGVsc2UgbG9vcCB0IChpICsgMSkgKGYgYWMgdC5baV0pIH5mIH5sZW5cbiAgaW5cbiAgZnVuIHQgfmluaXQgfmYgLT4gbG9vcCB0IDAgaW5pdCB+ZiB+bGVuOihsZW5ndGggdClcbjs7XG5cbmxldCBmb2xkaSA9XG4gIGxldCByZWMgbG9vcCB0IGkgYWMgfmYgfmxlbiA9XG4gICAgaWYgaSA9IGxlbiB0aGVuIGFjIGVsc2UgbG9vcCB0IChpICsgMSkgKGYgaSBhYyB0LltpXSkgfmYgfmxlblxuICBpblxuICBmdW4gdCB+aW5pdCB+ZiAtPiBsb29wIHQgMCBpbml0IH5mIH5sZW46KGxlbmd0aCB0KVxuOztcblxubGV0IGl0ZXJpIHQgfmYgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgZiBpICh1bnNhZmVfZ2V0IHQgaSlcbiAgZG9uZVxuOztcblxubGV0IGNvdW50IHQgfmYgPSBDb250YWluZXIuY291bnQgfmZvbGQgdCB+ZlxubGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxubGV0IG1pbl9lbHQgdCA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHRcbmxldCBtYXhfZWx0IHQgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0XG5sZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgdFxubGV0IGZpbmRfbWFwaSB0IH5mID0gSW5kZXhlZF9jb250YWluZXIuZmluZF9tYXBpIH5pdGVyaSB0IH5mXG5sZXQgZmluZGkgdCB+ZiA9IEluZGV4ZWRfY29udGFpbmVyLmZpbmRpIH5pdGVyaSB0IH5mXG5sZXQgY291bnRpIHQgfmYgPSBJbmRleGVkX2NvbnRhaW5lci5jb3VudGkgfmZvbGRpIHQgfmZcbmxldCBmb3JfYWxsaSB0IH5mID0gSW5kZXhlZF9jb250YWluZXIuZm9yX2FsbGkgfml0ZXJpIHQgfmZcbmxldCBleGlzdHNpIHQgfmYgPSBJbmRleGVkX2NvbnRhaW5lci5leGlzdHNpIH5pdGVyaSB0IH5mXG5cbmxldCBtZW0gPVxuICBsZXQgcmVjIGxvb3AgdCBjIH5wb3M6aSB+bGVuID1cbiAgICBpIDwgbGVuICYmIChDaGFyLmVxdWFsIGMgKHVuc2FmZV9nZXQgdCBpKSB8fCBsb29wIHQgYyB+cG9zOihpICsgMSkgfmxlbilcbiAgaW5cbiAgZnVuIHQgYyAtPiBsb29wIHQgYyB+cG9zOjAgfmxlbjoobGVuZ3RoIHQpXG47O1xuXG5sZXQgdHIgfnRhcmdldCB+cmVwbGFjZW1lbnQgcyA9XG4gIGlmIENoYXIuZXF1YWwgdGFyZ2V0IHJlcGxhY2VtZW50XG4gIHRoZW4gc1xuICBlbHNlIGlmIG1lbSBzIHRhcmdldFxuICB0aGVuIG1hcCBzIH5mOihmdW4gYyAtPiBpZiBDaGFyLmVxdWFsIGMgdGFyZ2V0IHRoZW4gcmVwbGFjZW1lbnQgZWxzZSBjKVxuICBlbHNlIHNcbjs7XG5cbmxldCB0cl9tdWx0aSB+dGFyZ2V0IH5yZXBsYWNlbWVudCA9XG4gIGlmIGlzX2VtcHR5IHRhcmdldFxuICB0aGVuIHN0YWdlIEZuLmlkXG4gIGVsc2UgaWYgaXNfZW1wdHkgcmVwbGFjZW1lbnRcbiAgdGhlbiBpbnZhbGlkX2FyZyBcInRyX211bHRpIHJlcGxhY2VtZW50IGlzIGVtcHR5IHN0cmluZ1wiXG4gIGVsc2UgKFxuICAgIG1hdGNoIEJ5dGVzX3RyLnRyX2NyZWF0ZV9tYXAgfnRhcmdldCB+cmVwbGFjZW1lbnQgd2l0aFxuICAgIHwgTm9uZSAtPiBzdGFnZSBGbi5pZFxuICAgIHwgU29tZSB0cl9tYXAgLT5cbiAgICAgIHN0YWdlIChmdW4gcyAtPlxuICAgICAgICBpZiBleGlzdHMgcyB+ZjooZnVuIGMgLT4gQ2hhci4oIDw+ICkgYyAodW5zYWZlX2dldCB0cl9tYXAgKENoYXIudG9faW50IGMpKSlcbiAgICAgICAgdGhlbiBtYXAgcyB+ZjooZnVuIGMgLT4gdW5zYWZlX2dldCB0cl9tYXAgKENoYXIudG9faW50IGMpKVxuICAgICAgICBlbHNlIHMpKVxuOztcblxuKCogZmFzdCB2ZXJzaW9uLCBpZiB3ZSBldmVyIG5lZWQgaXQ6XG4gICB7W1xuICAgICBsZXQgY29uY2F0X2FycmF5IH5zZXAgYXIgPVxuICAgICAgIGxldCBhcl9sZW4gPSBBcnJheS5sZW5ndGggYXIgaW5cbiAgICAgICBpZiBhcl9sZW4gPSAwIHRoZW4gXCJcIlxuICAgICAgIGVsc2VcbiAgICAgICAgIGxldCBzZXBfbGVuID0gbGVuZ3RoIHNlcCBpblxuICAgICAgICAgbGV0IHJlc19sZW5fcmVmID0gcmVmIChzZXBfbGVuICogKGFyX2xlbiAtIDEpKSBpblxuICAgICAgICAgZm9yIGkgPSAwIHRvIGFyX2xlbiAtIDEgZG9cbiAgICAgICAgICAgcmVzX2xlbl9yZWYgOj0gIXJlc19sZW5fcmVmICsgbGVuZ3RoIGFyLihpKVxuICAgICAgICAgZG9uZTtcbiAgICAgICAgIGxldCByZXMgPSBjcmVhdGUgIXJlc19sZW5fcmVmIGluXG4gICAgICAgICBsZXQgc3RyXzAgPSBhci4oMCkgaW5cbiAgICAgICAgIGxldCBsZW5fMCA9IGxlbmd0aCBzdHJfMCBpblxuICAgICAgICAgYmxpdCB+c3JjOnN0cl8wIH5zcmNfcG9zOjAgfmRzdDpyZXMgfmRzdF9wb3M6MCB+bGVuOmxlbl8wO1xuICAgICAgICAgbGV0IHBvc19yZWYgPSByZWYgbGVuXzAgaW5cbiAgICAgICAgIGZvciBpID0gMSB0byBhcl9sZW4gLSAxIGRvXG4gICAgICAgICAgIGxldCBwb3MgPSAhcG9zX3JlZiBpblxuICAgICAgICAgICBibGl0IH5zcmM6c2VwIH5zcmNfcG9zOjAgfmRzdDpyZXMgfmRzdF9wb3M6cG9zIH5sZW46c2VwX2xlbjtcbiAgICAgICAgICAgbGV0IG5ld19wb3MgPSBwb3MgKyBzZXBfbGVuIGluXG4gICAgICAgICAgIGxldCBzdHJfaSA9IGFyLihpKSBpblxuICAgICAgICAgICBsZXQgbGVuX2kgPSBsZW5ndGggc3RyX2kgaW5cbiAgICAgICAgICAgYmxpdCB+c3JjOnN0cl9pIH5zcmNfcG9zOjAgfmRzdDpyZXMgfmRzdF9wb3M6bmV3X3BvcyB+bGVuOmxlbl9pO1xuICAgICAgICAgICBwb3NfcmVmIDo9IG5ld19wb3MgKyBsZW5faVxuICAgICAgICAgZG9uZTtcbiAgICAgICAgIHJlc1xuICAgXX0gKilcblxubGV0IGNvbmNhdF9hcnJheSA/c2VwIGFyID0gY29uY2F0ID9zZXAgKEFycmF5LnRvX2xpc3QgYXIpXG5sZXQgY29uY2F0X21hcCA/c2VwIHMgfmYgPSBjb25jYXRfYXJyYXkgP3NlcCAoQXJyYXkubWFwICh0b19hcnJheSBzKSB+ZilcblxuKCogW2ZpbHRlciB0IGZdIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtLlxuXG4gICBMZXQgW24gPSBsZW5ndGggdF0uXG5cbiAgIDEuIEZpbmQgdGhlIGxvd2VzdCBbaV0gc3VjaCB0aGF0IFtub3QgKGYgdC5baV0pXS5cblxuICAgMi4gSWYgdGhlcmUgaXMgbm8gc3VjaCBbaV0sIHRoZW4gcmV0dXJuIFt0XS5cblxuICAgMy4gSWYgdGhlcmUgaXMgc3VjaCBhbiBbaV0sIGFsbG9jYXRlIGEgc3RyaW5nLCBbb3V0XSwgdG8gaG9sZCB0aGUgcmVzdWx0LiAgW291dF0gaGFzXG4gICBsZW5ndGggW24gLSAxXSwgd2hpY2ggaXMgdGhlIG1heGltdW0gcG9zc2libGUgb3V0cHV0IHNpemUgZ2l2ZW4gdGhhdCB0aGVyZSBpcyBhdCBsZWFzdFxuICAgb25lIGNoYXJhY3RlciBub3Qgc2F0aXNmeWluZyBbZl0uXG5cbiAgIDQuIENvcHkgY2hhcmFjdGVycyBhdCBpbmRpY2VzIDAgLi4uIFtpIC0gMV0gZnJvbSBbdF0gdG8gW291dF0uXG5cbiAgIDUuIFdhbGsgdGhyb3VnaCBjaGFyYWN0ZXJzIGF0IGluZGljZXMgW2krMV0gLi4uIFtuLTFdIG9mIFt0XSwgY29weWluZyB0aG9zZSB0aGF0XG4gICBzYXRpc2Z5IFtmXSBmcm9tIFt0XSB0byBbb3V0XS5cblxuICAgNi4gSWYgd2UgY29tcGxldGVseSBmaWxsZWQgW291dF0sIHRoZW4gcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIHByZWZpeCBvZiBbb3V0XVxuICAgdGhhdCB3ZSBkaWQgZmlsbCBpbi5cblxuICAgVGhpcyBhbGdvcml0aG0gaGFzIHRoZSBwcm9wZXJ0eSB0aGF0IGl0IGRvZXNuJ3QgYWxsb2NhdGUgYSBuZXcgc3RyaW5nIGlmIHRoZXJlJ3NcbiAgIG5vdGhpbmcgdG8gZmlsdGVyLCB3aGljaCBpcyBhIGNvbW1vbiBjYXNlLiAqKVxubGV0IGZpbHRlciB0IH5mID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBsZXQgaSA9IHJlZiAwIGluXG4gIHdoaWxlICFpIDwgbiAmJiBmIHQuWyFpXSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBpZiAhaSA9IG5cbiAgdGhlbiB0XG4gIGVsc2UgKFxuICAgIGxldCBvdXQgPSBCeXRlcy5jcmVhdGUgKG4gLSAxKSBpblxuICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmM6dCB+c3JjX3BvczowIH5kc3Q6b3V0IH5kc3RfcG9zOjAgfmxlbjohaTtcbiAgICBsZXQgb3V0X3BvcyA9IHJlZiAhaSBpblxuICAgIGluY3IgaTtcbiAgICB3aGlsZSAhaSA8IG4gZG9cbiAgICAgIGxldCBjID0gdC5bIWldIGluXG4gICAgICBpZiBmIGNcbiAgICAgIHRoZW4gKFxuICAgICAgICBCeXRlcy5zZXQgb3V0ICFvdXRfcG9zIGM7XG4gICAgICAgIGluY3Igb3V0X3Bvcyk7XG4gICAgICBpbmNyIGlcbiAgICBkb25lO1xuICAgIGxldCBvdXQgPSBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOm91dCBpblxuICAgIGlmICFvdXRfcG9zID0gbiAtIDEgdGhlbiBvdXQgZWxzZSBzdWIgb3V0IH5wb3M6MCB+bGVuOiFvdXRfcG9zKVxuOztcblxuKCogcmVwZWF0ZWQgY29kZSB0byBhdm9pZCByZXF1aXJpbmcgYW4gZXh0cmEgYWxsb2NhdGlvbiBmb3IgYSBjbG9zdXJlIG9uIGVhY2ggY2FsbC4gKilcbmxldCBmaWx0ZXJpIHQgfmYgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGxldCBpID0gcmVmIDAgaW5cbiAgd2hpbGUgIWkgPCBuICYmIGYgIWkgdC5bIWldIGRvXG4gICAgaW5jciBpXG4gIGRvbmU7XG4gIGlmICFpID0gblxuICB0aGVuIHRcbiAgZWxzZSAoXG4gICAgbGV0IG91dCA9IEJ5dGVzLmNyZWF0ZSAobiAtIDEpIGluXG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYzp0IH5zcmNfcG9zOjAgfmRzdDpvdXQgfmRzdF9wb3M6MCB+bGVuOiFpO1xuICAgIGxldCBvdXRfcG9zID0gcmVmICFpIGluXG4gICAgaW5jciBpO1xuICAgIHdoaWxlICFpIDwgbiBkb1xuICAgICAgbGV0IGMgPSB0LlshaV0gaW5cbiAgICAgIGlmIGYgIWkgY1xuICAgICAgdGhlbiAoXG4gICAgICAgIEJ5dGVzLnNldCBvdXQgIW91dF9wb3MgYztcbiAgICAgICAgaW5jciBvdXRfcG9zKTtcbiAgICAgIGluY3IgaVxuICAgIGRvbmU7XG4gICAgbGV0IG91dCA9IEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6b3V0IGluXG4gICAgaWYgIW91dF9wb3MgPSBuIC0gMSB0aGVuIG91dCBlbHNlIHN1YiBvdXQgfnBvczowIH5sZW46IW91dF9wb3MpXG47O1xuXG5sZXQgY2hvcF9wcmVmaXggcyB+cHJlZml4ID1cbiAgaWYgaXNfcHJlZml4IHMgfnByZWZpeCB0aGVuIFNvbWUgKGRyb3BfcHJlZml4IHMgKGxlbmd0aCBwcmVmaXgpKSBlbHNlIE5vbmVcbjs7XG5cbmxldCBjaG9wX3ByZWZpeF9pZl9leGlzdHMgcyB+cHJlZml4ID1cbiAgaWYgaXNfcHJlZml4IHMgfnByZWZpeCB0aGVuIGRyb3BfcHJlZml4IHMgKGxlbmd0aCBwcmVmaXgpIGVsc2Ugc1xuOztcblxubGV0IGNob3BfcHJlZml4X2V4biBzIH5wcmVmaXggPVxuICBtYXRjaCBjaG9wX3ByZWZpeCBzIH5wcmVmaXggd2l0aFxuICB8IFNvbWUgc3RyIC0+IHN0clxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmdmIFwiU3RyaW5nLmNob3BfcHJlZml4X2V4biAlUyAlU1wiIHMgcHJlZml4ICgpXG47O1xuXG5sZXQgY2hvcF9zdWZmaXggcyB+c3VmZml4ID1cbiAgaWYgaXNfc3VmZml4IHMgfnN1ZmZpeCB0aGVuIFNvbWUgKGRyb3Bfc3VmZml4IHMgKGxlbmd0aCBzdWZmaXgpKSBlbHNlIE5vbmVcbjs7XG5cbmxldCBjaG9wX3N1ZmZpeF9pZl9leGlzdHMgcyB+c3VmZml4ID1cbiAgaWYgaXNfc3VmZml4IHMgfnN1ZmZpeCB0aGVuIGRyb3Bfc3VmZml4IHMgKGxlbmd0aCBzdWZmaXgpIGVsc2Ugc1xuOztcblxubGV0IGNob3Bfc3VmZml4X2V4biBzIH5zdWZmaXggPVxuICBtYXRjaCBjaG9wX3N1ZmZpeCBzIH5zdWZmaXggd2l0aFxuICB8IFNvbWUgc3RyIC0+IHN0clxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmdmIFwiU3RyaW5nLmNob3Bfc3VmZml4X2V4biAlUyAlU1wiIHMgc3VmZml4ICgpXG47O1xuXG5tb2R1bGUgRm9yX2NvbW1vbl9wcmVmaXhfYW5kX3N1ZmZpeCA9IHN0cnVjdFxuICAoKiBXaGVuIHRha2luZyBhIHN0cmluZyBwcmVmaXggb3Igc3VmZml4LCB3ZSBleHRyYWN0IGZyb20gdGhlIHNob3J0ZXN0IGlucHV0IGF2YWlsYWJsZVxuICAgICBpbiBjYXNlIHdlIGNhbiBqdXN0IHJldHVybiBvbmUgb2Ygb3VyIGlucHV0cyB3aXRob3V0IGFsbG9jYXRpbmcgYSBuZXcgc3RyaW5nLiAqKVxuXG4gIGxldCBzaG9ydGVyIGEgYiA9IGlmIGxlbmd0aCBhIDw9IGxlbmd0aCBiIHRoZW4gYSBlbHNlIGJcblxuICBsZXQgc2hvcnRlc3QgbGlzdCA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBcIlwiXG4gICAgfCBmaXJzdCA6OiByZXN0IC0+IExpc3QuZm9sZCByZXN0IH5pbml0OmZpcnN0IH5mOnNob3J0ZXJcbiAgOztcblxuICAoKiBPdXIgZ2VuZXJpYyBhY2Nlc3NvcnMgZm9yIGNvbW1vbiBwcmVmaXgvc3VmZml4IGFic3RyYWN0IG92ZXIgW2dldF9wb3NdLCB3aGljaCBpc1xuICAgICBlaXRoZXIgW3Bvc19mcm9tX2xlZnRdIG9yIFtwb3NfZnJvbV9yaWdodF0uICopXG5cbiAgbGV0IHBvc19mcm9tX2xlZnQgKF8gOiB0KSAoaSA6IGludCkgPSBpXG4gIGxldCBwb3NfZnJvbV9yaWdodCB0IGkgPSBsZW5ndGggdCAtIGkgLSAxXG5cbiAgbGV0IHJlYyBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3AgYSBiIH5nZXRfcG9zIH5tYXhfbGVuIH5sZW5fc29fZmFyID1cbiAgICBpZiBsZW5fc29fZmFyID49IG1heF9sZW5cbiAgICB0aGVuIG1heF9sZW5cbiAgICBlbHNlIGlmIENoYXIuZXF1YWxcbiAgICAgICAgICAgICAgKHVuc2FmZV9nZXQgYSAoZ2V0X3BvcyBhIGxlbl9zb19mYXIpKVxuICAgICAgICAgICAgICAodW5zYWZlX2dldCBiIChnZXRfcG9zIGIgbGVuX3NvX2ZhcikpXG4gICAgdGhlbiBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3AgYSBiIH5nZXRfcG9zIH5tYXhfbGVuIH5sZW5fc29fZmFyOihsZW5fc29fZmFyICsgMSlcbiAgICBlbHNlIGxlbl9zb19mYXJcbiAgOztcblxuICBsZXQgY29tbW9uX2dlbmVyaWMyX2xlbmd0aCBhIGIgfmdldF9wb3MgPVxuICAgIGxldCBtYXhfbGVuID0gbWluIChsZW5ndGggYSkgKGxlbmd0aCBiKSBpblxuICAgIGNvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcCBhIGIgfmdldF9wb3Mgfm1heF9sZW4gfmxlbl9zb19mYXI6MFxuICA7O1xuXG4gIGxldCByZWMgY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3AgZmlyc3QgbGlzdCB+Z2V0X3BvcyB+bWF4X2xlbiA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBtYXhfbGVuXG4gICAgfCBzZWNvbmQgOjogcmVzdCAtPlxuICAgICAgbGV0IG1heF9sZW4gPVxuICAgICAgICAoKiBXZSBjYWxsIFtjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3BdIHJhdGhlciB0aGFuIFtjb21tb25fZ2VuZXJpYzJfbGVuZ3RoXSBzb1xuICAgICAgICAgICB0aGF0IFttYXhfbGVuXSBsaW1pdHMgb3VyIHRyYXZlcnNhbCBvZiBbZmlyc3RdIGFuZCBbc2Vjb25kXS4gKilcbiAgICAgICAgY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wIGZpcnN0IHNlY29uZCB+Z2V0X3BvcyB+bWF4X2xlbiB+bGVuX3NvX2ZhcjowXG4gICAgICBpblxuICAgICAgY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3Agc2Vjb25kIHJlc3QgfmdldF9wb3Mgfm1heF9sZW5cbiAgOztcblxuICBsZXQgY29tbW9uX2dlbmVyaWNfbGVuZ3RoIGxpc3QgfmdldF9wb3MgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gMFxuICAgIHwgZmlyc3QgOjogcmVzdCAtPlxuICAgICAgKCogUHJlY29tcHV0aW5nIFttYXhfbGVuXSBiYXNlZCBvbiBbc2hvcnRlc3QgbGlzdF0gc2F2ZXMgdXMgd29yayBpbiBsb25nZXIgc3RyaW5ncyxcbiAgICAgICAgIGF0IHRoZSBjb3N0IG9mIGFuIGV4dHJhIHBhc3Mgb3ZlciB0aGUgc3BpbmUgb2YgW2xpc3RdLlxuXG4gICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91J3JlIGxvb2tpbmcgZm9yIHRoZSBsb25nZXN0IHByZWZpeCBvZiB0aGUgc3RyaW5nczpcblxuICAgICAgICAge3ZcbiAgICAgICAgICAgIGxldCBsb25nX2EgPSBMaXN0LmluaXQgMTAwMCB+ZjooRm4uY29uc3QgJ2EnKVxuICAgICAgICAgICAgWyBsb25nX2E7IGxvbmdfYTsgJ2FhJyBdXG4gICAgICAgICB2fVxuXG4gICAgICAgICB0aGUgYXBwcm9hY2ggYmVsb3cgd2lsbCBqdXN0IGNoZWNrIHRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBvZiBhbGwgdGhlIHN0cmluZ3MuXG4gICAgICAqKVxuICAgICAgbGV0IG1heF9sZW4gPSBsZW5ndGggKHNob3J0ZXN0IGxpc3QpIGluXG4gICAgICBjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcCBmaXJzdCByZXN0IH5nZXRfcG9zIH5tYXhfbGVuXG4gIDs7XG5cbiAgKCogT3VyIGdlbmVyaWMgYWNjZXNzb3JzIHRoYXQgcHJvZHVjZSBhIHN0cmluZyBhYnN0cmFjdCBvdmVyIFt0YWtlXSwgd2hpY2ggaXMgZWl0aGVyXG4gICAgIFtwcmVmaXhdIG9yIFtzdWZmaXhdLiAqKVxuXG4gIGxldCBjb21tb25fZ2VuZXJpYzIgYSBiIH5nZXRfcG9zIH50YWtlID1cbiAgICBsZXQgbGVuID0gY29tbW9uX2dlbmVyaWMyX2xlbmd0aCBhIGIgfmdldF9wb3MgaW5cbiAgICAoKiBVc2UgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byBzdHJpbmdzLCBzbyB0aGF0IGlmIHRoZSBzaG9ydGVyIG9uZSBpcyB0aGUgc2hhcmVkXG4gICAgICAgcHJlZml4LCBbdGFrZV0gd29uJ3QgYWxsb2NhdGUgYW5vdGhlciBzdHJpbmcuICopXG4gICAgdGFrZSAoc2hvcnRlciBhIGIpIGxlblxuICA7O1xuXG4gIGxldCBjb21tb25fZ2VuZXJpYyBsaXN0IH5nZXRfcG9zIH50YWtlID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IFwiXCJcbiAgICB8IGZpcnN0IDo6IHJlc3QgLT5cbiAgICAgICgqIEFzIHdpdGggW2NvbW1vbl9nZW5lcmljX2xlbmd0aF0sIHdlIGJhc2UgW21heF9sZW5dIG9uIFtzaG9ydGVzdCBsaXN0XS4gV2UgYWxzb1xuICAgICAgICAgdXNlIHRoaXMgcmVzdWx0IGZvciBbdGFrZV0sIGJlbG93LCB0byBwb3RlbnRpYWxseSBhdm9pZCBhbGxvY2F0aW5nIGEgc3RyaW5nLiAqKVxuICAgICAgbGV0IHMgPSBzaG9ydGVzdCBsaXN0IGluXG4gICAgICBsZXQgbWF4X2xlbiA9IGxlbmd0aCBzIGluXG4gICAgICBpZiBtYXhfbGVuID0gMFxuICAgICAgdGhlbiBcIlwiXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGxlbiA9XG4gICAgICAgICAgKCogV2UgY2FsbCBkaXJlY3RseSBpbnRvIFtjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcF0gcmF0aGVyIHRoYW5cbiAgICAgICAgICAgICBbY29tbW9uX2dlbmVyaWNfbGVuZ3RoXSB0byBhdm9pZCByZWNvbXB1dGluZyBbc2hvcnRlc3QgbGlzdF0uICopXG4gICAgICAgICAgY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3AgZmlyc3QgcmVzdCB+Z2V0X3BvcyB+bWF4X2xlblxuICAgICAgICBpblxuICAgICAgICB0YWtlIHMgbGVuKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgc3RydWN0XG4gIG9wZW4gRm9yX2NvbW1vbl9wcmVmaXhfYW5kX3N1ZmZpeFxuXG4gIGxldCBjb21tb25fcHJlZml4IGxpc3QgPSBjb21tb25fZ2VuZXJpYyBsaXN0IH50YWtlOnByZWZpeCB+Z2V0X3Bvczpwb3NfZnJvbV9sZWZ0XG4gIGxldCBjb21tb25fc3VmZml4IGxpc3QgPSBjb21tb25fZ2VuZXJpYyBsaXN0IH50YWtlOnN1ZmZpeCB+Z2V0X3Bvczpwb3NfZnJvbV9yaWdodFxuICBsZXQgY29tbW9uX3ByZWZpeDIgYSBiID0gY29tbW9uX2dlbmVyaWMyIGEgYiB+dGFrZTpwcmVmaXggfmdldF9wb3M6cG9zX2Zyb21fbGVmdFxuICBsZXQgY29tbW9uX3N1ZmZpeDIgYSBiID0gY29tbW9uX2dlbmVyaWMyIGEgYiB+dGFrZTpzdWZmaXggfmdldF9wb3M6cG9zX2Zyb21fcmlnaHRcbiAgbGV0IGNvbW1vbl9wcmVmaXhfbGVuZ3RoIGxpc3QgPSBjb21tb25fZ2VuZXJpY19sZW5ndGggbGlzdCB+Z2V0X3Bvczpwb3NfZnJvbV9sZWZ0XG4gIGxldCBjb21tb25fc3VmZml4X2xlbmd0aCBsaXN0ID0gY29tbW9uX2dlbmVyaWNfbGVuZ3RoIGxpc3QgfmdldF9wb3M6cG9zX2Zyb21fcmlnaHRcbiAgbGV0IGNvbW1vbl9wcmVmaXgyX2xlbmd0aCBhIGIgPSBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoIGEgYiB+Z2V0X3Bvczpwb3NfZnJvbV9sZWZ0XG4gIGxldCBjb21tb25fc3VmZml4Ml9sZW5ndGggYSBiID0gY29tbW9uX2dlbmVyaWMyX2xlbmd0aCBhIGIgfmdldF9wb3M6cG9zX2Zyb21fcmlnaHRcbmVuZFxuXG4oKiBUaGVyZSB1c2VkIHRvIGJlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIHRoYXQgd2FzIGZhc3RlciBmb3IgdmVyeSBzaG9ydCBzdHJpbmdzXG4gICAocGVha2luZyBhdCA0MCUgZmFzdGVyIGZvciA0LTYgY2hhciBsb25nIHN0cmluZ3MpLlxuICAgVGhpcyBuZXcgZnVuY3Rpb24gaXMgYXJvdW5kIDIwJSBmYXN0ZXIgdGhhbiB0aGUgZGVmYXVsdCBoYXNoIGZ1bmN0aW9uLCBidXQgc2xvd2VyXG4gICB0aGFuIHRoZSBwcmV2aW91cyBjdXN0b20gaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIHRoZSBuZXcgT0NhbWwgZnVuY3Rpb24gaXMgd2VsbFxuICAgYmVoYXZlZCwgYW5kIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbGVzcyBsaWtlbHkgdG8gZGl2ZXJnZSBmcm9tIHRoZSBkZWZhdWx0IE9DYW1sXG4gICBpbXBsZW1lbnRhdGlvbiBkb2VzLCB3aGljaCBpcyBhIGRlc2lyYWJsZSBwcm9wZXJ0eS4gKFRoZSBvbmx5IHdheSB0byBhdm9pZCB0aGVcbiAgIGRpdmVyZ2VuY2UgaXMgdG8gZXhwb3NlIHRoZSBtYWNybyByZWRlZmluZWQgaW4gaGFzaF9zdHVicy5jIGluIHRoZSBoYXNoLmggaGVhZGVyIG9mXG4gICB0aGUgT0NhbWwgY29tcGlsZXIuKSAqKVxubW9kdWxlIEhhc2ggPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgaGFzaCA6IHN0cmluZyAtPiBpbnQgPSBcIkJhc2VfaGFzaF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuZW5kXG5cbigqIFtpbmNsdWRlIEhhc2hdIHRvIG1ha2UgdGhlIFtleHRlcm5hbF0gdmVyc2lvbiBvdmVycmlkZSB0aGUgW2hhc2hdIGZyb21cbiAgIFtIYXNoYWJsZS5NYWtlX2JpbmFibGVdLCBzbyB0aGF0IHdlIGdldCBhIGxpdHRsZSBiaXQgb2YgYSBzcGVlZHVwIGJ5IGV4cG9zaW5nIGl0IGFzXG4gICBleHRlcm5hbCBpbiB0aGUgbWxpLiAqKVxubGV0IF8gPSBoYXNoXG5cbmluY2x1ZGUgSGFzaFxuXG4oKiBmb3IgaW50ZXJhY3RpdmUgdG9wLWxldmVscyAtLSBtb2R1bGVzIGRlcml2aW5nIGZyb20gU3RyaW5nIHNob3VsZCBoYXZlIFN0cmluZydzIHByZXR0eVxuICAgcHJpbnRlci4gKilcbmxldCBwcCBwcGYgc3RyaW5nID0gQ2FtbC5Gb3JtYXQuZnByaW50ZiBwcGYgXCIlU1wiIHN0cmluZ1xubGV0IG9mX2NoYXIgYyA9IG1ha2UgMSBjXG5cbmxldCBvZl9jaGFyX2xpc3QgbCA9XG4gIGxldCB0ID0gQnl0ZXMuY3JlYXRlIChMaXN0Lmxlbmd0aCBsKSBpblxuICBMaXN0Lml0ZXJpIGwgfmY6KGZ1biBpIGMgLT4gQnl0ZXMuc2V0IHQgaSBjKTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp0XG47O1xuXG5tb2R1bGUgRXNjYXBpbmcgPSBzdHJ1Y3RcbiAgKCogSWYgdGhpcyBpcyBjaGFuZ2VkLCBtYWtlIHN1cmUgdG8gdXBkYXRlIFtlc2NhcGVdLCB3aGljaCBhdHRlbXB0cyB0byBlbnN1cmUgYWxsIHRoZVxuICAgICBpbnZhcmlhbnRzIGNoZWNrZWQgaGVyZS4gICopXG4gIGxldCBidWlsZF9hbmRfdmFsaWRhdGVfZXNjYXBld29ydGh5X21hcCBlc2NhcGV3b3J0aHlfbWFwIGVzY2FwZV9jaGFyIGZ1bmMgPVxuICAgIGxldCBlc2NhcGV3b3J0aHlfbWFwID1cbiAgICAgIGlmIExpc3QuQXNzb2MubWVtIGVzY2FwZXdvcnRoeV9tYXAgfmVxdWFsOkNoYXIuZXF1YWwgZXNjYXBlX2NoYXJcbiAgICAgIHRoZW4gZXNjYXBld29ydGh5X21hcFxuICAgICAgZWxzZSAoZXNjYXBlX2NoYXIsIGVzY2FwZV9jaGFyKSA6OiBlc2NhcGV3b3J0aHlfbWFwXG4gICAgaW5cbiAgICBsZXQgYXJyID0gQXJyYXkuY3JlYXRlIH5sZW46MjU2ICgtMSkgaW5cbiAgICBsZXQgdmFscyA9IEFycmF5LmNyZWF0ZSB+bGVuOjI1NiBmYWxzZSBpblxuICAgIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IE9rIGFyclxuICAgICAgfCAoY19mcm9tLCBjX3RvKSA6OiBsIC0+XG4gICAgICAgIGxldCBrLCB2ID1cbiAgICAgICAgICBtYXRjaCBmdW5jIHdpdGhcbiAgICAgICAgICB8IGBFc2NhcGUgLT4gQ2hhci50b19pbnQgY19mcm9tLCBjX3RvXG4gICAgICAgICAgfCBgVW5lc2NhcGUgLT4gQ2hhci50b19pbnQgY190bywgY19mcm9tXG4gICAgICAgIGluXG4gICAgICAgIGlmIGFyci4oaykgPD4gLTEgfHwgdmFscy4oQ2hhci50b19pbnQgdilcbiAgICAgICAgdGhlblxuICAgICAgICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgICAgIFwiZXNjYXBld29ydGh5X21hcCBub3Qgb25lLXRvLW9uZVwiXG4gICAgICAgICAgICAgICBbIFwiY19mcm9tXCIsIHNleHBfb2ZfY2hhciBjX2Zyb21cbiAgICAgICAgICAgICAgIDsgXCJjX3RvXCIsIHNleHBfb2ZfY2hhciBjX3RvXG4gICAgICAgICAgICAgICA7ICggXCJlc2NhcGV3b3J0aHlfbWFwXCJcbiAgICAgICAgICAgICAgICAgLCBzZXhwX29mX2xpc3QgKHNleHBfb2ZfcGFpciBzZXhwX29mX2NoYXIgc2V4cF9vZl9jaGFyKSBlc2NhcGV3b3J0aHlfbWFwXG4gICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgIF0pXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGFyci4oaykgPC0gQ2hhci50b19pbnQgdjtcbiAgICAgICAgICB2YWxzLihDaGFyLnRvX2ludCB2KSA8LSB0cnVlO1xuICAgICAgICAgIGxvb3AgbClcbiAgICBpblxuICAgIGxvb3AgZXNjYXBld29ydGh5X21hcFxuICA7O1xuXG4gIGxldCBlc2NhcGVfZ2VuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhciA9XG4gICAgbWF0Y2ggYnVpbGRfYW5kX3ZhbGlkYXRlX2VzY2FwZXdvcnRoeV9tYXAgZXNjYXBld29ydGh5X21hcCBlc2NhcGVfY2hhciBgRXNjYXBlIHdpdGhcbiAgICB8IEVycm9yIF8gYXMgeCAtPiB4XG4gICAgfCBPayBlc2NhcGV3b3J0aHkgLT5cbiAgICAgIE9rXG4gICAgICAgIChmdW4gc3JjIC0+XG4gICAgICAgICAgICgqIGNhbGN1bGF0ZSBhIGxpc3Qgb2YgKGluZGV4IG9mIGNoYXIgdG8gZXNjYXBlICogZXNjYXBlZCBjaGFyKSBmaXJzdCwgdGhlIG9yZGVyXG4gICAgICAgICAgICAgIGlzIGZyb20gdGFpbCB0byBoZWFkICopXG4gICAgICAgICAgIGxldCB0b19lc2NhcGVfbGVuID0gcmVmIDAgaW5cbiAgICAgICAgICAgbGV0IHRvX2VzY2FwZSA9XG4gICAgICAgICAgICAgZm9sZGkgc3JjIH5pbml0OltdIH5mOihmdW4gaSBhY2MgYyAtPlxuICAgICAgICAgICAgICAgbWF0Y2ggZXNjYXBld29ydGh5LihDaGFyLnRvX2ludCBjKSB3aXRoXG4gICAgICAgICAgICAgICB8IC0xIC0+IGFjY1xuICAgICAgICAgICAgICAgfCBuIC0+XG4gICAgICAgICAgICAgICAgICgqIChpbmRleCBvZiBjaGFyIHRvIGVzY2FwZSAqIGVzY2FwZWQgY2hhcikgKilcbiAgICAgICAgICAgICAgICAgaW5jciB0b19lc2NhcGVfbGVuO1xuICAgICAgICAgICAgICAgICAoaSwgQ2hhci51bnNhZmVfb2ZfaW50IG4pIDo6IGFjYylcbiAgICAgICAgICAgaW5cbiAgICAgICAgICAgbWF0Y2ggdG9fZXNjYXBlIHdpdGhcbiAgICAgICAgICAgfCBbXSAtPiBzcmNcbiAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgKCogW3RvX2VzY2FwZV0gZGl2aWRlIFtzcmNdIHRvIFtMaXN0Lmxlbmd0aCB0b19lc2NhcGUgKyAxXSBwaWVjZXMgc2VwYXJhdGVkIGJ5XG4gICAgICAgICAgICAgICAgdGhlIGNoYXJzIHRvIGVzY2FwZS5cblxuICAgICAgICAgICAgICAgIExldHMgdGFrZVxuICAgICAgICAgICAgICAgIHtbXG4gICAgICAgICAgICAgICAgICBlc2NhcGVfZ2VuX2V4blxuICAgICAgICAgICAgICAgICAgICB+ZXNjYXBld29ydGh5X21hcDpbKCdhJywgJ0EnKTsgKCdiJywgJ0InKTsgKCdjJywgJ0MnKV1cbiAgICAgICAgICAgICAgICAgICAgfmVzY2FwZV9jaGFyOidfJ1xuICAgICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUsIGFuZCBhc3N1bWUgdGhlIHN0cmluZyB0byBlc2NhcGUgaXNcblxuICAgICAgICAgICAgICAgIFwiMDAwYTExMWIyMjJjMzMzXCJcblxuICAgICAgICAgICAgICAgIHRoZW4gW3RvX2VzY2FwZV0gaXMgWygxMSwgJ0MnKTsgKDcsICdCJyk7ICgzLCAnQScpXS5cblxuICAgICAgICAgICAgICAgIFRoZW4gd2UgY3JlYXRlIGEgW2RzdF0gb2YgbGVuZ3RoIFtsZW5ndGggc3JjICsgM10gdG8gc3RvcmUgdGhlXG4gICAgICAgICAgICAgICAgcmVzdWx0LCBjb3B5IHBpZWNlIFwiMzMzXCIgdG8gW2RzdF0gZGlyZWN0bHksIHRoZW4gY29weSAnXycgYW5kICdDJyB0byBbZHN0XTtcbiAgICAgICAgICAgICAgICB0aGVuIG1vdmUgb24gdG8gbmV4dDsgYWZ0ZXIgMyBpdGVyYXRpb25zLCBjb3B5IHBpZWNlIFwiMDAwXCIgYW5kIHdlIGFyZSBkb25lLlxuXG4gICAgICAgICAgICAgICAgRmluYWxseSB0aGUgcmVzdWx0IHdpbGwgYmVcblxuICAgICAgICAgICAgICAgIFwiMDAwX0ExMTFfQjIyMl9DMzMzXCIgKilcbiAgICAgICAgICAgICBsZXQgc3JjX2xlbiA9IGxlbmd0aCBzcmMgaW5cbiAgICAgICAgICAgICBsZXQgZHN0X2xlbiA9IHNyY19sZW4gKyAhdG9fZXNjYXBlX2xlbiBpblxuICAgICAgICAgICAgIGxldCBkc3QgPSBCeXRlcy5jcmVhdGUgZHN0X2xlbiBpblxuICAgICAgICAgICAgIGxldCByZWMgbG9vcCBsYXN0X2lkeCBsYXN0X2RzdF9wb3MgPSBmdW5jdGlvblxuICAgICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgICAoKiBjb3B5IFwiMDAwXCIgYXQgbGFzdCAqKVxuICAgICAgICAgICAgICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zOjAgfmRzdCB+ZHN0X3BvczowIH5sZW46bGFzdF9pZHhcbiAgICAgICAgICAgICAgIHwgKGlkeCwgZXNjYXBlZF9jaGFyKSA6OiB0b19lc2NhcGUgLT5cbiAgICAgICAgICAgICAgICAgKCpbaWR4XSA9IHRoZSBjaGFyIHRvIGVzY2FwZSopXG4gICAgICAgICAgICAgICAgICgqIHRha2UgZmlyc3QgaXRlcmF0aW9uIGZvciBleGFtcGxlICopXG4gICAgICAgICAgICAgICAgICgqIGNhbGN1bGF0ZSBsZW5ndGggb2YgXCIzMzNcIiwgbWludXMgMSBiZWNhdXNlIHdlIGRvbid0IGNvcHkgJ2MnICopXG4gICAgICAgICAgICAgICAgIGxldCBsZW4gPSBsYXN0X2lkeCAtIGlkeCAtIDEgaW5cbiAgICAgICAgICAgICAgICAgKCogc2V0IHRoZSBkc3RfcG9zIHRvIGNvcHkgdG8gKilcbiAgICAgICAgICAgICAgICAgbGV0IGRzdF9wb3MgPSBsYXN0X2RzdF9wb3MgLSBsZW4gaW5cbiAgICAgICAgICAgICAgICAgKCogY29weSBcIjMzM1wiLCBzZXQgW3NyY19wb3NdIHRvIFtpZHggKyAxXSB0byBza2lwICdjJyAqKVxuICAgICAgICAgICAgICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zOihpZHggKyAxKSB+ZHN0IH5kc3RfcG9zIH5sZW47XG4gICAgICAgICAgICAgICAgICgqIGJhY2tvZmYgW2RzdF9wb3NdIGJ5IDIgdG8gY29weSAnXycgYW5kICdDJyAqKVxuICAgICAgICAgICAgICAgICBsZXQgZHN0X3BvcyA9IGRzdF9wb3MgLSAyIGluXG4gICAgICAgICAgICAgICAgIEJ5dGVzLnNldCBkc3QgZHN0X3BvcyBlc2NhcGVfY2hhcjtcbiAgICAgICAgICAgICAgICAgQnl0ZXMuc2V0IGRzdCAoZHN0X3BvcyArIDEpIGVzY2FwZWRfY2hhcjtcbiAgICAgICAgICAgICAgICAgbG9vcCBpZHggZHN0X3BvcyB0b19lc2NhcGVcbiAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICgqIHNldCBbbGFzdF9kc3RfcG9zXSBhbmQgW2xhc3RfaWR4XSB0byBsZW5ndGggb2YgW2RzdF0gYW5kIFtzcmNdIGZpcnN0ICopXG4gICAgICAgICAgICAgbG9vcCBzcmNfbGVuIGRzdF9sZW4gdG9fZXNjYXBlO1xuICAgICAgICAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6ZHN0KVxuICA7O1xuXG4gIGxldCBlc2NhcGVfZ2VuX2V4biB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIgPVxuICAgIE9yX2Vycm9yLm9rX2V4biAoZXNjYXBlX2dlbiB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIpIHw+IHN0YWdlXG4gIDs7XG5cbiAgbGV0IGVzY2FwZSB+ZXNjYXBld29ydGh5IH5lc2NhcGVfY2hhciA9XG4gICAgKCogRm9yIFtlc2NhcGVfZ2VuX2V4bl0sIHdlIGRvbid0IGtub3cgaG93IHRvIGZpeCBpbnZhbGlkIGVzY2FwZXdvcnRoeV9tYXAgc28gd2UgaGF2ZVxuICAgICAgIHRvIHJhaXNlIGV4Y2VwdGlvbjsgYnV0IGluIHRoaXMgY2FzZSwgd2Uga25vdyBob3cgdG8gZml4IGR1cGxpY2F0ZWQgZWxlbWVudHMgaW5cbiAgICAgICBlc2NhcGV3b3J0aHkgbGlzdCwgc28gd2UganVzdCBmaXggaXQgaW5zdGVhZCBvZiByYWlzaW5nIGV4Y2VwdGlvbiB0byBtYWtlIHRoaXNcbiAgICAgICBmdW5jdGlvbiBlYXNpZXIgdG8gdXNlLiAgKilcbiAgICBsZXQgZXNjYXBld29ydGh5X21hcCA9XG4gICAgICBlc2NhcGV3b3J0aHlcbiAgICAgIHw+IExpc3QuZGVkdXBfYW5kX3NvcnQgfmNvbXBhcmU6Q2hhci5jb21wYXJlXG4gICAgICB8PiBMaXN0Lm1hcCB+ZjooZnVuIGMgLT4gYywgYylcbiAgICBpblxuICAgIGVzY2FwZV9nZW5fZXhuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhclxuICA7O1xuXG4gICgqIEluIGFuIGVzY2FwZWQgc3RyaW5nLCBhbnkgY2hhciBpcyBlaXRoZXIgYEVzY2FwaW5nLCBgRXNjYXBlZCBvciBgTGl0ZXJhbC4gRm9yXG4gICAgIGV4YW1wbGUsIHRoZSBlc2NhcGUgc3RhdHVzZXMgb2YgY2hhcnMgaW4gc3RyaW5nIFwiYV9hX19cIiB3aXRoIGVzY2FwZV9jaGFyID0gJ18nIGFyZVxuXG4gICAgIGEgOiBgTGl0ZXJhbFxuICAgICBfIDogYEVzY2FwaW5nXG4gICAgIGEgOiBgRXNjYXBlZFxuICAgICBfIDogYEVzY2FwaW5nXG4gICAgIF8gOiBgRXNjYXBlZFxuXG4gICAgIFt1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIGkgcHJldmlvdXNfc3RhdHVzXSBnZXRzIGVzY2FwZSBzdGF0dXMgb2ZcbiAgICAgc3RyLltpXSBiYXNpbmcgb24gZXNjYXBlIHN0YXR1cyBvZiBzdHIuW2kgLSAxXSAqKVxuICBsZXQgdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBpID0gZnVuY3Rpb25cbiAgICB8IGBFc2NhcGluZyAtPiBgRXNjYXBlZFxuICAgIHwgYExpdGVyYWwgfCBgRXNjYXBlZCAtPlxuICAgICAgaWYgQ2hhci5lcXVhbCBzdHIuW2ldIGVzY2FwZV9jaGFyIHRoZW4gYEVzY2FwaW5nIGVsc2UgYExpdGVyYWxcbiAgOztcblxuICBsZXQgdW5lc2NhcGVfZ2VuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhciA9XG4gICAgbWF0Y2ggYnVpbGRfYW5kX3ZhbGlkYXRlX2VzY2FwZXdvcnRoeV9tYXAgZXNjYXBld29ydGh5X21hcCBlc2NhcGVfY2hhciBgVW5lc2NhcGUgd2l0aFxuICAgIHwgRXJyb3IgXyBhcyB4IC0+IHhcbiAgICB8IE9rIGVzY2FwZXdvcnRoeSAtPlxuICAgICAgT2tcbiAgICAgICAgKGZ1biBzcmMgLT5cbiAgICAgICAgICAgKCogQ29udGludWUgdGhlIGV4YW1wbGUgaW4gW2VzY2FwZV9nZW5fZXhuXSwgbm93IHdlIHVuZXNjYXBlXG5cbiAgICAgICAgICAgICAgXCIwMDBfQTExMV9CMjIyX0MzMzNcIlxuXG4gICAgICAgICAgICAgIGJhY2sgdG9cblxuICAgICAgICAgICAgICBcIjAwMGExMTFiMjIyYzMzM1wiXG5cbiAgICAgICAgICAgICAgVGhlbiBbdG9fdW5lc2NhcGVdIGlzIFsxNDsgOTsgNF0sIHdoaWNoIGlzIGluZGV4ZXMgb2YgJ18ncy5cblxuICAgICAgICAgICAgICBUaGVuIHdlIGNyZWF0ZSBhIHN0cmluZyBbZHN0XSB0byBzdG9yZSB0aGUgcmVzdWx0LCBjb3B5IFwiMzMzXCIgdG8gaXQsIHRoZW4gY29weVxuICAgICAgICAgICAgICAnYycsIHRoZW4gbW92ZSBvbiB0byBuZXh0IGl0ZXJhdGlvbi4gQWZ0ZXIgMyBpdGVyYXRpb25zIGNvcHkgXCIwMDBcIiBhbmQgd2UgYXJlXG4gICAgICAgICAgICAgIGRvbmUuICAqKVxuICAgICAgICAgICAoKiBpbmRleGVzIG9mIGVzY2FwZSBjaGFycyAqKVxuICAgICAgICAgICBsZXQgdG9fdW5lc2NhcGUgPVxuICAgICAgICAgICAgIGxldCByZWMgbG9vcCBpIHN0YXR1cyBhY2MgPVxuICAgICAgICAgICAgICAgaWYgaSA+PSBsZW5ndGggc3JjXG4gICAgICAgICAgICAgICB0aGVuIGFjY1xuICAgICAgICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSB1cGRhdGVfZXNjYXBlX3N0YXR1cyBzcmMgfmVzY2FwZV9jaGFyIGkgc3RhdHVzIGluXG4gICAgICAgICAgICAgICAgIGxvb3BcbiAgICAgICAgICAgICAgICAgICAoaSArIDEpXG4gICAgICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICAgICAgICAgKG1hdGNoIHN0YXR1cyB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHwgYEVzY2FwaW5nIC0+IGkgOjogYWNjXG4gICAgICAgICAgICAgICAgICAgIHwgYEVzY2FwZWQgfCBgTGl0ZXJhbCAtPiBhY2MpKVxuICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgbG9vcCAwIGBMaXRlcmFsIFtdXG4gICAgICAgICAgIGluXG4gICAgICAgICAgIG1hdGNoIHRvX3VuZXNjYXBlIHdpdGhcbiAgICAgICAgICAgfCBbXSAtPiBzcmNcbiAgICAgICAgICAgfCBpZHggOjogdG9fdW5lc2NhcGUnIC0+XG4gICAgICAgICAgICAgbGV0IGRzdCA9IEJ5dGVzLmNyZWF0ZSAobGVuZ3RoIHNyYyAtIExpc3QubGVuZ3RoIHRvX3VuZXNjYXBlKSBpblxuICAgICAgICAgICAgIGxldCByZWMgbG9vcCBsYXN0X2lkeCBsYXN0X2RzdF9wb3MgPSBmdW5jdGlvblxuICAgICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgICAoKiBjb3B5IFwiMDAwXCIgYXQgbGFzdCAqKVxuICAgICAgICAgICAgICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zOjAgfmRzdCB+ZHN0X3BvczowIH5sZW46bGFzdF9pZHhcbiAgICAgICAgICAgICAgIHwgaWR4IDo6IHRvX3VuZXNjYXBlIC0+XG4gICAgICAgICAgICAgICAgICgqIFtpZHhdID0gaW5kZXggb2YgZXNjYXBpbmcgY2hhciAqKVxuICAgICAgICAgICAgICAgICAoKiB0YWtlIDFzdCBpdGVyYXRpb24gYXMgZXhhbXBsZSwgY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgXCIzMzNcIiwgbWludXMgMiB0b1xuICAgICAgICAgICAgICAgICAgICBza2lwICdfQycgKilcbiAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IGxhc3RfaWR4IC0gaWR4IC0gMiBpblxuICAgICAgICAgICAgICAgICAoKiBwb2ludCBbZHN0X3Bvc10gdG8gdGhlIHBvc2l0aW9uIHRvIGNvcHkgXCIzMzNcIiB0byAqKVxuICAgICAgICAgICAgICAgICBsZXQgZHN0X3BvcyA9IGxhc3RfZHN0X3BvcyAtIGxlbiBpblxuICAgICAgICAgICAgICAgICAoKiBjb3B5IFwiMzMzXCIgKilcbiAgICAgICAgICAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3BvczooaWR4ICsgMikgfmRzdCB+ZHN0X3BvcyB+bGVuO1xuICAgICAgICAgICAgICAgICAoKiBiYWNrb2ZmIFtkc3RfcG9zXSBieSAxIHRvIGNvcHkgJ2MnICopXG4gICAgICAgICAgICAgICAgIGxldCBkc3RfcG9zID0gZHN0X3BvcyAtIDEgaW5cbiAgICAgICAgICAgICAgICAgQnl0ZXMuc2V0XG4gICAgICAgICAgICAgICAgICAgZHN0XG4gICAgICAgICAgICAgICAgICAgZHN0X3Bvc1xuICAgICAgICAgICAgICAgICAgIChtYXRjaCBlc2NhcGV3b3J0aHkuKENoYXIudG9faW50IHNyYy5baWR4ICsgMV0pIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgfCAtMSAtPiBzcmMuW2lkeCArIDFdXG4gICAgICAgICAgICAgICAgICAgIHwgbiAtPiBDaGFyLnVuc2FmZV9vZl9pbnQgbik7XG4gICAgICAgICAgICAgICAgICgqIHVwZGF0ZSBbbGFzdF9kc3RfcG9zXSBhbmQgW2xhc3RfaWR4XSAqKVxuICAgICAgICAgICAgICAgICBsb29wIGlkeCBkc3RfcG9zIHRvX3VuZXNjYXBlXG4gICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICBpZiBpZHggPCBsZW5ndGggc3JjIC0gMVxuICAgICAgICAgICAgIHRoZW5cbiAgICAgICAgICAgICAgICgqIHNldCBbbGFzdF9kc3RfcG9zXSBhbmQgW2xhc3RfaWR4XSB0byBsZW5ndGggb2YgW2RzdF0gYW5kIFtzcmNdICopXG4gICAgICAgICAgICAgICBsb29wIChsZW5ndGggc3JjKSAoQnl0ZXMubGVuZ3RoIGRzdCkgdG9fdW5lc2NhcGVcbiAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAoKiBmb3IgZXNjYXBlZCBzdHJpbmcgZW5kaW5nIHdpdGggYW4gZXNjYXBpbmcgY2hhciBsaWtlIFwiMDAwX1wiLCBqdXN0IGlnbm9yZVxuICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgZXNjYXBpbmcgY2hhciAqKVxuICAgICAgICAgICAgICAgbG9vcCAobGVuZ3RoIHNyYyAtIDEpIChCeXRlcy5sZW5ndGggZHN0KSB0b191bmVzY2FwZSc7XG4gICAgICAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpkc3QpXG4gIDs7XG5cbiAgbGV0IHVuZXNjYXBlX2dlbl9leG4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyID1cbiAgICBPcl9lcnJvci5va19leG4gKHVuZXNjYXBlX2dlbiB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIpIHw+IHN0YWdlXG4gIDs7XG5cbiAgbGV0IHVuZXNjYXBlIH5lc2NhcGVfY2hhciA9IHVuZXNjYXBlX2dlbl9leG4gfmVzY2FwZXdvcnRoeV9tYXA6W10gfmVzY2FwZV9jaGFyXG5cbiAgbGV0IHByZWNlZGluZ19lc2NhcGVfY2hhcnMgc3RyIH5lc2NhcGVfY2hhciBwb3MgPVxuICAgIGxldCByZWMgbG9vcCBwIGNudCA9XG4gICAgICBpZiBwIDwgMCB8fCBDaGFyLiggPD4gKSBzdHIuW3BdIGVzY2FwZV9jaGFyIHRoZW4gY250IGVsc2UgbG9vcCAocCAtIDEpIChjbnQgKyAxKVxuICAgIGluXG4gICAgbG9vcCAocG9zIC0gMSkgMFxuICA7O1xuXG4gICgqIEluIGFuIGVzY2FwZWQgc3RyaW5nLCBhbnkgY2hhciBpcyBlaXRoZXIgYEVzY2FwaW5nLCBgRXNjYXBlZCBvciBgTGl0ZXJhbC4gRm9yXG4gICAgIGV4YW1wbGUsIHRoZSBlc2NhcGUgc3RhdHVzZXMgb2YgY2hhcnMgaW4gc3RyaW5nIFwiYV9hX19cIiB3aXRoIGVzY2FwZV9jaGFyID0gJ18nIGFyZVxuXG4gICAgIGEgOiBgTGl0ZXJhbFxuICAgICBfIDogYEVzY2FwaW5nXG4gICAgIGEgOiBgRXNjYXBlZFxuICAgICBfIDogYEVzY2FwaW5nXG4gICAgIF8gOiBgRXNjYXBlZFxuXG4gICAgIFt1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIGkgcHJldmlvdXNfc3RhdHVzXSBnZXRzIGVzY2FwZSBzdGF0dXMgb2ZcbiAgICAgc3RyLltpXSBiYXNpbmcgb24gZXNjYXBlIHN0YXR1cyBvZiBzdHIuW2kgLSAxXSAqKVxuICBsZXQgdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBpID0gZnVuY3Rpb25cbiAgICB8IGBFc2NhcGluZyAtPiBgRXNjYXBlZFxuICAgIHwgYExpdGVyYWwgfCBgRXNjYXBlZCAtPlxuICAgICAgaWYgQ2hhci5lcXVhbCBzdHIuW2ldIGVzY2FwZV9jaGFyIHRoZW4gYEVzY2FwaW5nIGVsc2UgYExpdGVyYWxcbiAgOztcblxuICBsZXQgZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcyA9XG4gICAgbGV0IG9kZCA9IHByZWNlZGluZ19lc2NhcGVfY2hhcnMgc3RyIH5lc2NhcGVfY2hhciBwb3MgbW9kIDIgPSAxIGluXG4gICAgbWF0Y2ggb2RkLCBDaGFyLmVxdWFsIHN0ci5bcG9zXSBlc2NhcGVfY2hhciB3aXRoXG4gICAgfCB0cnVlLCAodHJ1ZSB8IGZhbHNlKSAtPiBgRXNjYXBlZFxuICAgIHwgZmFsc2UsIHRydWUgLT4gYEVzY2FwaW5nXG4gICAgfCBmYWxzZSwgZmFsc2UgLT4gYExpdGVyYWxcbiAgOztcblxuICBsZXQgY2hlY2tfYm91bmQgc3RyIHBvcyBmdW5jdGlvbl9uYW1lID1cbiAgICBpZiBwb3MgPj0gbGVuZ3RoIHN0ciB8fCBwb3MgPCAwIHRoZW4gaW52YWxpZF9hcmdmIFwiJXM6IG91dCBvZiBib3VuZHNcIiBmdW5jdGlvbl9uYW1lICgpXG4gIDs7XG5cbiAgbGV0IGlzX2NoYXJfZXNjYXBpbmcgc3RyIH5lc2NhcGVfY2hhciBwb3MgPVxuICAgIGNoZWNrX2JvdW5kIHN0ciBwb3MgXCJpc19jaGFyX2VzY2FwaW5nXCI7XG4gICAgbWF0Y2ggZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcyB3aXRoXG4gICAgfCBgRXNjYXBpbmcgLT4gdHJ1ZVxuICAgIHwgYEVzY2FwZWQgfCBgTGl0ZXJhbCAtPiBmYWxzZVxuICA7O1xuXG4gIGxldCBpc19jaGFyX2VzY2FwZWQgc3RyIH5lc2NhcGVfY2hhciBwb3MgPVxuICAgIGNoZWNrX2JvdW5kIHN0ciBwb3MgXCJpc19jaGFyX2VzY2FwZWRcIjtcbiAgICBtYXRjaCBlc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIHdpdGhcbiAgICB8IGBFc2NhcGVkIC0+IHRydWVcbiAgICB8IGBFc2NhcGluZyB8IGBMaXRlcmFsIC0+IGZhbHNlXG4gIDs7XG5cbiAgbGV0IGlzX2NoYXJfbGl0ZXJhbCBzdHIgfmVzY2FwZV9jaGFyIHBvcyA9XG4gICAgY2hlY2tfYm91bmQgc3RyIHBvcyBcImlzX2NoYXJfbGl0ZXJhbFwiO1xuICAgIG1hdGNoIGVzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3Mgd2l0aFxuICAgIHwgYExpdGVyYWwgLT4gdHJ1ZVxuICAgIHwgYEVzY2FwZWQgfCBgRXNjYXBpbmcgLT4gZmFsc2VcbiAgOztcblxuICBsZXQgaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyID1cbiAgICBjaGVja19ib3VuZCBzdHIgcG9zIFwiaW5kZXhfZnJvbVwiO1xuICAgIGxldCByZWMgbG9vcCBpIHN0YXR1cyA9XG4gICAgICBpZiBpID49IHBvc1xuICAgICAgJiYgKG1hdGNoIHN0YXR1cyB3aXRoXG4gICAgICAgICAgfCBgTGl0ZXJhbCAtPiB0cnVlXG4gICAgICAgICAgfCBgRXNjYXBlZCB8IGBFc2NhcGluZyAtPiBmYWxzZSlcbiAgICAgICYmIENoYXIuZXF1YWwgc3RyLltpXSBjaGFyXG4gICAgICB0aGVuIFNvbWUgaVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBpID0gaSArIDEgaW5cbiAgICAgICAgaWYgaSA+PSBsZW5ndGggc3RyXG4gICAgICAgIHRoZW4gTm9uZVxuICAgICAgICBlbHNlIGxvb3AgaSAodXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBpIHN0YXR1cykpXG4gICAgaW5cbiAgICBsb29wIHBvcyAoZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcylcbiAgOztcblxuICBsZXQgaW5kZXhfZnJvbV9leG4gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciA9XG4gICAgbWF0Y2ggaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcImluZGV4X2Zyb21fZXhuOiBub3QgZm91bmRcIlxuICAgICAgICAgICBbIFwic3RyXCIsIHNleHBfb2ZfdCBzdHJcbiAgICAgICAgICAgOyBcImVzY2FwZV9jaGFyXCIsIHNleHBfb2ZfY2hhciBlc2NhcGVfY2hhclxuICAgICAgICAgICA7IFwicG9zXCIsIHNleHBfb2ZfaW50IHBvc1xuICAgICAgICAgICA7IFwiY2hhclwiLCBzZXhwX29mX2NoYXIgY2hhclxuICAgICAgICAgICBdKVxuICAgIHwgU29tZSBwb3MgLT4gcG9zXG4gIDs7XG5cbiAgbGV0IGluZGV4IHN0ciB+ZXNjYXBlX2NoYXIgY2hhciA9IGluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciAwIGNoYXJcbiAgbGV0IGluZGV4X2V4biBzdHIgfmVzY2FwZV9jaGFyIGNoYXIgPSBpbmRleF9mcm9tX2V4biBzdHIgfmVzY2FwZV9jaGFyIDAgY2hhclxuXG4gIGxldCByaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyID1cbiAgICBjaGVja19ib3VuZCBzdHIgcG9zIFwicmluZGV4X2Zyb21cIjtcbiAgICAoKiBpZiB0aGUgdGFyZ2V0IGNoYXIgaXMgdGhlIHNhbWUgYXMgW2VzY2FwZV9jaGFyXSwgd2UgaGF2ZSBubyB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoXG4gICAgICAgZXNjYXBlX2NoYXIgaXMgbGl0ZXJhbCwgc28ganVzdCByZXR1cm4gTm9uZSAqKVxuICAgIGlmIENoYXIuZXF1YWwgY2hhciBlc2NhcGVfY2hhclxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgKFxuICAgICAgbGV0IHJlYyBsb29wIHBvcyA9XG4gICAgICAgIGlmIHBvcyA8IDBcbiAgICAgICAgdGhlbiBOb25lXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCBlc2NhcGVfY2hhcnMgPSBwcmVjZWRpbmdfZXNjYXBlX2NoYXJzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGluXG4gICAgICAgICAgaWYgZXNjYXBlX2NoYXJzIG1vZCAyID0gMCAmJiBDaGFyLmVxdWFsIHN0ci5bcG9zXSBjaGFyXG4gICAgICAgICAgdGhlbiBTb21lIHBvc1xuICAgICAgICAgIGVsc2UgbG9vcCAocG9zIC0gZXNjYXBlX2NoYXJzIC0gMSkpXG4gICAgICBpblxuICAgICAgbG9vcCBwb3MpXG4gIDs7XG5cbiAgbGV0IHJpbmRleF9mcm9tX2V4biBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyID1cbiAgICBtYXRjaCByaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcInJpbmRleF9mcm9tX2V4bjogbm90IGZvdW5kXCJcbiAgICAgICAgICAgWyBcInN0clwiLCBzZXhwX29mX3Qgc3RyXG4gICAgICAgICAgIDsgXCJlc2NhcGVfY2hhclwiLCBzZXhwX29mX2NoYXIgZXNjYXBlX2NoYXJcbiAgICAgICAgICAgOyBcInBvc1wiLCBzZXhwX29mX2ludCBwb3NcbiAgICAgICAgICAgOyBcImNoYXJcIiwgc2V4cF9vZl9jaGFyIGNoYXJcbiAgICAgICAgICAgXSlcbiAgICB8IFNvbWUgcG9zIC0+IHBvc1xuICA7O1xuXG4gIGxldCByaW5kZXggc3RyIH5lc2NhcGVfY2hhciBjaGFyID1cbiAgICBpZiBpc19lbXB0eSBzdHIgdGhlbiBOb25lIGVsc2UgcmluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciAobGVuZ3RoIHN0ciAtIDEpIGNoYXJcbiAgOztcblxuICBsZXQgcmluZGV4X2V4biBzdHIgfmVzY2FwZV9jaGFyIGNoYXIgPVxuICAgIHJpbmRleF9mcm9tX2V4biBzdHIgfmVzY2FwZV9jaGFyIChsZW5ndGggc3RyIC0gMSkgY2hhclxuICA7O1xuXG4gICgqIFtzcGxpdF9nZW4gc3RyIH5lc2NhcGVfY2hhciB+b25dIHdvcmtzIHNpbWlsYXJseSB0byBbU3RyaW5nLnNwbGl0X2dlbl0sIHdpdGggYW5cbiAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudDogb25seSBzcGxpdCBvbiBsaXRlcmFsIGNoYXJzLCBub3QgZXNjYXBpbmcgb3IgZXNjYXBlZCAqKVxuICBsZXQgc3BsaXRfZ2VuIHN0ciB+ZXNjYXBlX2NoYXIgfm9uID1cbiAgICBsZXQgaXNfZGVsaW0gPVxuICAgICAgbWF0Y2ggb24gd2l0aFxuICAgICAgfCBgY2hhciBjJyAtPiBmdW4gYyAtPiBDaGFyLmVxdWFsIGMgYydcbiAgICAgIHwgYGNoYXJfbGlzdCBsIC0+IGZ1biBjIC0+IGNoYXJfbGlzdF9tZW0gbCBjXG4gICAgaW5cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHN0ciBpblxuICAgIGxldCByZWMgbG9vcCBhY2Mgc3RhdHVzIGxhc3RfcG9zIHBvcyA9XG4gICAgICBpZiBwb3MgPSBsZW5cbiAgICAgIHRoZW4gTGlzdC5yZXYgKHN1YiBzdHIgfnBvczpsYXN0X3BvcyB+bGVuOihsZW4gLSBsYXN0X3BvcykgOjogYWNjKVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBzdGF0dXMgPSB1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcyBzdGF0dXMgaW5cbiAgICAgICAgaWYgKG1hdGNoIHN0YXR1cyB3aXRoXG4gICAgICAgICAgfCBgTGl0ZXJhbCAtPiB0cnVlXG4gICAgICAgICAgfCBgRXNjYXBlZCB8IGBFc2NhcGluZyAtPiBmYWxzZSlcbiAgICAgICAgJiYgaXNfZGVsaW0gc3RyLltwb3NdXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBzdWJfc3RyID0gc3ViIHN0ciB+cG9zOmxhc3RfcG9zIH5sZW46KHBvcyAtIGxhc3RfcG9zKSBpblxuICAgICAgICAgIGxvb3AgKHN1Yl9zdHIgOjogYWNjKSBzdGF0dXMgKHBvcyArIDEpIChwb3MgKyAxKSlcbiAgICAgICAgZWxzZSBsb29wIGFjYyBzdGF0dXMgbGFzdF9wb3MgKHBvcyArIDEpKVxuICAgIGluXG4gICAgbG9vcCBbXSBgTGl0ZXJhbCAwIDBcbiAgOztcblxuICBsZXQgc3BsaXQgc3RyIH5vbiA9IHNwbGl0X2dlbiBzdHIgfm9uOihgY2hhciBvbilcbiAgbGV0IHNwbGl0X29uX2NoYXJzIHN0ciB+b246Y2hhcnMgPSBzcGxpdF9nZW4gc3RyIH5vbjooYGNoYXJfbGlzdCBjaGFycylcblxuICBsZXQgc3BsaXRfYXQgc3RyIHBvcyA9XG4gICAgc3ViIHN0ciB+cG9zOjAgfmxlbjpwb3MsIHN1YiBzdHIgfnBvczoocG9zICsgMSkgfmxlbjoobGVuZ3RoIHN0ciAtIHBvcyAtIDEpXG4gIDs7XG5cbiAgbGV0IGxzcGxpdDIgc3RyIH5vbiB+ZXNjYXBlX2NoYXIgPVxuICAgIE9wdGlvbi5tYXAgKGluZGV4IHN0ciB+ZXNjYXBlX2NoYXIgb24pIH5mOihmdW4geCAtPiBzcGxpdF9hdCBzdHIgeClcbiAgOztcblxuICBsZXQgcnNwbGl0MiBzdHIgfm9uIH5lc2NhcGVfY2hhciA9XG4gICAgT3B0aW9uLm1hcCAocmluZGV4IHN0ciB+ZXNjYXBlX2NoYXIgb24pIH5mOihmdW4geCAtPiBzcGxpdF9hdCBzdHIgeClcbiAgOztcblxuICBsZXQgbHNwbGl0Ml9leG4gc3RyIH5vbiB+ZXNjYXBlX2NoYXIgPSBzcGxpdF9hdCBzdHIgKGluZGV4X2V4biBzdHIgfmVzY2FwZV9jaGFyIG9uKVxuICBsZXQgcnNwbGl0Ml9leG4gc3RyIH5vbiB+ZXNjYXBlX2NoYXIgPSBzcGxpdF9hdCBzdHIgKHJpbmRleF9leG4gc3RyIH5lc2NhcGVfY2hhciBvbilcblxuICAoKiBbbGFzdF9ub25fZHJvcF9saXRlcmFsXSBhbmQgW2ZpcnN0X25vbl9kcm9wX2xpdGVyYWxdIGFyZSBlaXRoZXIgYm90aCBbTm9uZV0gb3IgYm90aFxuICAgICBbU29tZV0uIElmIFtTb21lXSwgdGhlbiB0aGUgZm9ybWVyIGlzID49IHRoZSBsYXR0ZXIuICopXG4gIGxldCBsYXN0X25vbl9kcm9wX2xpdGVyYWwgfmRyb3AgfmVzY2FwZV9jaGFyIHQgPVxuICAgIHJmaW5kaSB0IH5mOihmdW4gaSBjIC0+XG4gICAgICAobm90IChkcm9wIGMpKVxuICAgICAgfHwgaXNfY2hhcl9lc2NhcGluZyB0IH5lc2NhcGVfY2hhciBpXG4gICAgICB8fCBpc19jaGFyX2VzY2FwZWQgdCB+ZXNjYXBlX2NoYXIgaSlcbiAgOztcblxuICBsZXQgZmlyc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB+ZHJvcCB+ZXNjYXBlX2NoYXIgdCA9XG4gICAgbGZpbmRpIHQgfmY6KGZ1biBpIGMgLT5cbiAgICAgIChub3QgKGRyb3AgYykpXG4gICAgICB8fCBpc19jaGFyX2VzY2FwaW5nIHQgfmVzY2FwZV9jaGFyIGlcbiAgICAgIHx8IGlzX2NoYXJfZXNjYXBlZCB0IH5lc2NhcGVfY2hhciBpKVxuICA7O1xuXG4gIGxldCByc3RyaXBfbGl0ZXJhbCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgfmVzY2FwZV9jaGFyID1cbiAgICBtYXRjaCBsYXN0X25vbl9kcm9wX2xpdGVyYWwgdCB+ZHJvcCB+ZXNjYXBlX2NoYXIgd2l0aFxuICAgIHwgTm9uZSAtPiBcIlwiXG4gICAgfCBTb21lIGkgLT4gaWYgaSA9IGxlbmd0aCB0IC0gMSB0aGVuIHQgZWxzZSBwcmVmaXggdCAoaSArIDEpXG4gIDs7XG5cbiAgbGV0IGxzdHJpcF9saXRlcmFsID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCB+ZXNjYXBlX2NoYXIgPVxuICAgIG1hdGNoIGZpcnN0X25vbl9kcm9wX2xpdGVyYWwgdCB+ZHJvcCB+ZXNjYXBlX2NoYXIgd2l0aFxuICAgIHwgTm9uZSAtPiBcIlwiXG4gICAgfCBTb21lIDAgLT4gdFxuICAgIHwgU29tZSBuIC0+IGRyb3BfcHJlZml4IHQgblxuICA7O1xuXG4gICgqIFtzdHJpcCB0XSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBbbHN0cmlwIChyc3RyaXAgdCldLiAgVGhlIGltcGxlbWVudGF0aW9uXG4gICAgIGJlbG93IHNhdmVzIChhdCBsZWFzdCkgYSBmYWN0b3Igb2YgdHdvIGFsbG9jYXRpb24sIGJ5IG9ubHkgYWxsb2NhdGluZyB0aGVcbiAgICAgZmluYWwgcmVzdWx0LiAgVGhpcyBhbHNvIHNhdmVzIHNvbWUgYW1vdW50IG9mIHRpbWUuICopXG4gIGxldCBzdHJpcF9saXRlcmFsID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCB+ZXNjYXBlX2NoYXIgPVxuICAgIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICAgICgqIHBlcmZvcm1hbmNlIGhhY2s6IGF2b2lkIGNvcHlpbmcgW3RdIGluIGNvbW1vbiBjYXNlcyAqKVxuICAgIGlmIGxlbmd0aCA9IDAgfHwgbm90IChkcm9wIHQuWzBdIHx8IGRyb3AgdC5bbGVuZ3RoIC0gMV0pXG4gICAgdGhlbiB0XG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBmaXJzdF9ub25fZHJvcF9saXRlcmFsIHQgfmRyb3AgfmVzY2FwZV9jaGFyIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBcIlwiXG4gICAgICB8IFNvbWUgZmlyc3QgLT5cbiAgICAgICAgKG1hdGNoIGxhc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB0IH5kcm9wIH5lc2NhcGVfY2hhciB3aXRoXG4gICAgICAgICB8IE5vbmUgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICB8IFNvbWUgbGFzdCAtPiBzdWIgdCB+cG9zOmZpcnN0IH5sZW46KGxhc3QgLSBmaXJzdCArIDEpKSlcbiAgOztcbmVuZFxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBTdHJpbmdfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbigqIE92ZXJyaWRlIFtTZWFyY2hfcGF0dGVybl0gd2l0aCBkZWZhdWx0IGNhc2Utc2Vuc2l0aXZpdHkgYXJndW1lbnQgYXQgdGhlIGVuZCBvZiB0aGVcbiAgIGZpbGUsIHNvIHRoYXQgY2FsbCBzaXRlcyBhYm92ZSBhcmUgZm9yY2VkIHRvIHN1cHBseSBjYXNlLXNlbnNpdGl2aXR5IGV4cGxpY2l0bHkuICopXG5tb2R1bGUgU2VhcmNoX3BhdHRlcm4gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTZWFyY2hfcGF0dGVybjBcblxuICBsZXQgY3JlYXRlID8oY2FzZV9zZW5zaXRpdmUgPSB0cnVlKSBwYXR0ZXJuID0gY3JlYXRlIHBhdHRlcm4gfmNhc2Vfc2Vuc2l0aXZlXG5lbmRcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIFN0cmluZ19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5cbmxldCBzdGFnZSA9IFN0YWdlZC5zdGFnZVxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBieXRlcyBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCB0X29mX3NleHAgPSAoYnl0ZXNfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfYnl0ZXMgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gYnl0ZXNfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBpbmNsdWRlIEJ5dGVzMFxuXG4gIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5CeXRlc1wiXG4gIGxldCBwcCBmbXQgdCA9IENhbWwuRm9ybWF0LmZwcmludGYgZm10IFwiJVNcIiAodG9fc3RyaW5nIHQpXG5lbmRcblxuaW5jbHVkZSBUXG5cbm1vZHVsZSBUb19ieXRlcyA9IEJsaXQuTWFrZSAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgY3JlYXRlIH5sZW4gPSBjcmVhdGUgbGVuXG4gIGVuZClcblxuaW5jbHVkZSBUb19ieXRlc1xuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyX3BwIChUKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBCeXRlc19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbm1vZHVsZSBUb19zdHJpbmcgPSBCbGl0Lk1ha2VfdG9fc3RyaW5nIChUKSAoVG9fYnl0ZXMpXG5cbm1vZHVsZSBGcm9tX3N0cmluZyA9XG4gIEJsaXQuTWFrZV9kaXN0aW5jdFxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgdCA9IHN0cmluZ1xuXG4gICAgICBsZXQgbGVuZ3RoID0gU3RyaW5nLmxlbmd0aFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBsZXQgY3JlYXRlIH5sZW4gPSBjcmVhdGUgbGVuXG4gICAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdF9zdHJpbmdcbiAgICBlbmQpXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5cbmxldCBpbml0IG4gfmYgPVxuICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIG4gMFxuICB0aGVuIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJCeXRlcy5pbml0ICVkXCIgbiAoKTtcbiAgbGV0IHQgPSBjcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHQgaSAoZiBpKVxuICBkb25lO1xuICB0XG47O1xuXG5sZXQgb2ZfY2hhcl9saXN0IGwgPVxuICBsZXQgdCA9IGNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgTGlzdC5pdGVyaSBsIH5mOihmdW4gaSBjIC0+IHNldCB0IGkgYyk7XG4gIHRcbjs7XG5cbmxldCB0b19saXN0IHQgPVxuICBsZXQgcmVjIGxvb3AgdCBpIGFjYyA9XG4gICAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSBpIDBcbiAgICB0aGVuIGFjY1xuICAgIGVsc2UgbG9vcCB0IChpIC0gMSkgKHVuc2FmZV9nZXQgdCBpIDo6IGFjYylcbiAgaW5cbiAgbG9vcCB0IChsZW5ndGggdCAtIDEpIFtdXG47O1xuXG5sZXQgdG9fYXJyYXkgdCA9IEFycmF5LmluaXQgKGxlbmd0aCB0KSB+ZjooZnVuIGkgLT4gdW5zYWZlX2dldCB0IGkpXG5sZXQgbWFwIHQgfmYgPSBtYXAgdCB+ZlxubGV0IG1hcGkgdCB+ZiA9IG1hcGkgdCB+ZlxuXG5sZXQgZm9sZCA9XG4gIGxldCByZWMgbG9vcCB0IH5mIH5sZW4gfnBvcyBhY2MgPVxuICAgIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuZXF1YWwgcG9zIGxlblxuICAgIHRoZW4gYWNjXG4gICAgZWxzZSBsb29wIHQgfmYgfmxlbiB+cG9zOihwb3MgKyAxKSAoZiBhY2MgKHVuc2FmZV9nZXQgdCBwb3MpKVxuICBpblxuICBmdW4gdCB+aW5pdCB+ZiAtPiBsb29wIHQgfmYgfmxlbjoobGVuZ3RoIHQpIH5wb3M6MCBpbml0XG47O1xuXG5sZXQgZm9sZGkgPVxuICBsZXQgcmVjIGxvb3AgdCB+ZiB+bGVuIH5wb3MgYWNjID1cbiAgICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmVxdWFsIHBvcyBsZW5cbiAgICB0aGVuIGFjY1xuICAgIGVsc2UgbG9vcCB0IH5mIH5sZW4gfnBvczoocG9zICsgMSkgKGYgcG9zIGFjYyAodW5zYWZlX2dldCB0IHBvcykpXG4gIGluXG4gIGZ1biB0IH5pbml0IH5mIC0+IGxvb3AgdCB+ZiB+bGVuOihsZW5ndGggdCkgfnBvczowIGluaXRcbjs7XG5cbmxldCB0ciB+dGFyZ2V0IH5yZXBsYWNlbWVudCBzID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkb1xuICAgIGlmIENoYXIuZXF1YWwgKHVuc2FmZV9nZXQgcyBpKSB0YXJnZXQgdGhlbiB1bnNhZmVfc2V0IHMgaSByZXBsYWNlbWVudFxuICBkb25lXG47O1xuXG5sZXQgdHJfbXVsdGkgfnRhcmdldCB+cmVwbGFjZW1lbnQgPVxuICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPSApIChTdHJpbmcubGVuZ3RoIHRhcmdldCkgMFxuICB0aGVuIHN0YWdlIGlnbm9yZVxuICBlbHNlIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA9ICkgKFN0cmluZy5sZW5ndGggcmVwbGFjZW1lbnQpIDBcbiAgdGhlbiBpbnZhbGlkX2FyZyBcInRyX211bHRpOiByZXBsYWNlbWVudCBpcyB0aGUgZW1wdHkgc3RyaW5nXCJcbiAgZWxzZSAoXG4gICAgbWF0Y2ggQnl0ZXNfdHIudHJfY3JlYXRlX21hcCB+dGFyZ2V0IH5yZXBsYWNlbWVudCB3aXRoXG4gICAgfCBOb25lIC0+IHN0YWdlIGlnbm9yZVxuICAgIHwgU29tZSB0cl9tYXAgLT5cbiAgICAgIHN0YWdlIChmdW4gcyAtPlxuICAgICAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBzIGkgKFN0cmluZy51bnNhZmVfZ2V0IHRyX21hcCAoQ2hhci50b19pbnQgKHVuc2FmZV9nZXQgcyBpKSkpXG4gICAgICAgIGRvbmUpKVxuOztcblxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxubGV0IGNvbnRhaW5zID9wb3MgP2xlbiB0IGNoYXIgPVxuICBsZXQgcG9zLCBsZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uZ2V0X3Bvc19sZW5fZXhuICgpID9wb3MgP2xlbiB+dG90YWxfbGVuZ3RoOihsZW5ndGggdClcbiAgaW5cbiAgbGV0IGxhc3QgPSBwb3MgKyBsZW4gaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgaSBsYXN0XG4gICAgJiYgKENoYXIuZXF1YWwgKGdldCB0IGkpIGNoYXIgfHwgbG9vcCAoaSArIDEpKVxuICBpblxuICBsb29wIHBvc1xuOztcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEJ5dGVzX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwiIyAxIFwic3JjL2hleF9sZXhlci5tbGxcIlxuIFxudHlwZSByZXN1bHQgPVxufCBOZWcgb2Ygc3RyaW5nXG58IFBvcyBvZiBzdHJpbmdcblxuIyA4IFwic3JjL2hleF9sZXhlci5tbFwiXG5sZXQgX19vY2FtbF9sZXhfdGFibGVzID0ge1xuICBMZXhpbmcubGV4X2Jhc2UgPVxuICAgXCJcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAxXFwwMDBcXDAwMVxcMDAwXFwwMDJcXDAwMFxcMDI3XFwwMDBcXDA4MlxcMDAwXFwxMDVcXDAwMFxcXG4gICAgXCI7XG4gIExleGluZy5sZXhfYmFja3RyayA9XG4gICBcIlxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDBcXDAwMFxcMjU1XFwyNTVcXDAwMVxcMDAwXFxcbiAgICBcIjtcbiAgTGV4aW5nLmxleF9kZWZhdWx0ID1cbiAgIFwiXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFwiO1xuICBMZXhpbmcubGV4X3RyYW5zID1cbiAgIFwiXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAyXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDFcXDAwMFxcMDAzXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwNlxcMDAwXFwwMDRcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDZcXDAwMFxcMDA0XFwwMDBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwMFxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcIjtcbiAgTGV4aW5nLmxleF9jaGVjayA9XG4gICBcIlxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwMFxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMDAwXFwwMDBcXDAwMlxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFxcbiAgICBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXFxuICAgIFxcMDA0XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwwMDFcXDAwMFxcMDAzXFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwyNTVcXDI1NVxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFxcbiAgICBcXDAwNFxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMDAxXFwwMDBcXDAwM1xcMDAwXFwwMDVcXDAwMFxcMjU1XFwyNTVcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcXG4gICAgXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFxcbiAgICBcXDAwNlxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcXG4gICAgXFwwMDZcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDAwN1xcMDAwXFwyNTVcXDI1NVxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XCI7XG4gIExleGluZy5sZXhfYmFzZV9jb2RlID1cbiAgIFwiXCI7XG4gIExleGluZy5sZXhfYmFja3Rya19jb2RlID1cbiAgIFwiXCI7XG4gIExleGluZy5sZXhfZGVmYXVsdF9jb2RlID1cbiAgIFwiXCI7XG4gIExleGluZy5sZXhfdHJhbnNfY29kZSA9XG4gICBcIlwiO1xuICBMZXhpbmcubGV4X2NoZWNrX2NvZGUgPVxuICAgXCJcIjtcbiAgTGV4aW5nLmxleF9jb2RlID1cbiAgIFwiXCI7XG59XG5cbmxldCByZWMgcGFyc2VfaGV4IGxleGJ1ZiA9XG4gICBfX29jYW1sX2xleF9wYXJzZV9oZXhfcmVjIGxleGJ1ZiAwXG5hbmQgX19vY2FtbF9sZXhfcGFyc2VfaGV4X3JlYyBsZXhidWYgX19vY2FtbF9sZXhfc3RhdGUgPVxuICBtYXRjaCBMZXhpbmcuZW5naW5lIF9fb2NhbWxfbGV4X3RhYmxlcyBfX29jYW1sX2xleF9zdGF0ZSBsZXhidWYgd2l0aFxuICAgICAgfCAwIC0+XG5sZXRcbiMgOCBcInNyYy9oZXhfbGV4ZXIubWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlcbiMgMTM1IFwic3JjL2hleF9sZXhlci5tbFwiXG49IExleGluZy5zdWJfbGV4ZW1lIGxleGJ1ZiAobGV4YnVmLkxleGluZy5sZXhfc3RhcnRfcG9zICsgMykgbGV4YnVmLkxleGluZy5sZXhfY3Vycl9wb3MgaW5cbiMgMTQgXCJzcmMvaGV4X2xleGVyLm1sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICggTmVnIGJvZHkgKVxuIyAxMzkgXCJzcmMvaGV4X2xleGVyLm1sXCJcblxuICB8IDEgLT5cbmxldFxuIyA4IFwic3JjL2hleF9sZXhlci5tbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVxuIyAxNDUgXCJzcmMvaGV4X2xleGVyLm1sXCJcbj0gTGV4aW5nLnN1Yl9sZXhlbWUgbGV4YnVmIChsZXhidWYuTGV4aW5nLmxleF9zdGFydF9wb3MgKyAyKSBsZXhidWYuTGV4aW5nLmxleF9jdXJyX3BvcyBpblxuIyAxNSBcInNyYy9oZXhfbGV4ZXIubWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCBQb3MgYm9keSApXG4jIDE0OSBcInNyYy9oZXhfbGV4ZXIubWxcIlxuXG4gIHwgX19vY2FtbF9sZXhfc3RhdGUgLT4gbGV4YnVmLkxleGluZy5yZWZpbGxfYnVmZiBsZXhidWY7XG4gICAgICBfX29jYW1sX2xleF9wYXJzZV9oZXhfcmVjIGxleGJ1ZiBfX29jYW1sX2xleF9zdGF0ZVxuXG47O1xuXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBJbnQgPSBJbnQwXG5tb2R1bGUgU3lzID0gU3lzMFxuXG5sZXQgY29udmVydF9mYWlsdXJlIHggYSBiIHRvX3N0cmluZyA9XG4gIFByaW50Zi5mYWlsd2l0aGZcbiAgICBcImNvbnZlcnNpb24gZnJvbSAlcyB0byAlcyBmYWlsZWQ6ICVzIGlzIG91dCBvZiByYW5nZVwiXG4gICAgYVxuICAgIGJcbiAgICAodG9fc3RyaW5nIHgpXG4gICAgKClcbltAQGNvbGRdIFtAQGlubGluZSBuZXZlcl0gW0BAbG9jYWwgbmV2ZXJdIFtAQHNwZWNpYWxpc2UgbmV2ZXJdXG47O1xuXG5sZXQgbnVtX2JpdHNfaW50ID0gU3lzLmludF9zaXplX2luX2JpdHNcbmxldCBudW1fYml0c19pbnQzMiA9IDMyXG5sZXQgbnVtX2JpdHNfaW50NjQgPSA2NFxubGV0IG51bV9iaXRzX25hdGl2ZWludCA9IFdvcmRfc2l6ZS5udW1fYml0cyBXb3JkX3NpemUud29yZF9zaXplXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludCA9IDYzIHx8IG51bV9iaXRzX2ludCA9IDMxIHx8IG51bV9iaXRzX2ludCA9IDMyKVxubGV0IG1pbl9pbnQzMiA9IENhbWwuSW50MzIubWluX2ludFxubGV0IG1heF9pbnQzMiA9IENhbWwuSW50MzIubWF4X2ludFxubGV0IG1pbl9pbnQ2NCA9IENhbWwuSW50NjQubWluX2ludFxubGV0IG1heF9pbnQ2NCA9IENhbWwuSW50NjQubWF4X2ludFxubGV0IG1pbl9uYXRpdmVpbnQgPSBDYW1sLk5hdGl2ZWludC5taW5faW50XG5sZXQgbWF4X25hdGl2ZWludCA9IENhbWwuTmF0aXZlaW50Lm1heF9pbnRcbmxldCBpbnRfdG9fc3RyaW5nID0gQ2FtbC5zdHJpbmdfb2ZfaW50XG5sZXQgaW50MzJfdG9fc3RyaW5nID0gQ2FtbC5JbnQzMi50b19zdHJpbmdcbmxldCBpbnQ2NF90b19zdHJpbmcgPSBDYW1sLkludDY0LnRvX3N0cmluZ1xubGV0IG5hdGl2ZWludF90b19zdHJpbmcgPSBDYW1sLk5hdGl2ZWludC50b19zdHJpbmdcblxuKCogaW50IDwtPiBpbnQzMiAqKVxuXG5sZXQgaW50X3RvX2ludDMyX2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50XCIgXCJpbnQzMlwiIGludF90b19zdHJpbmdcbmxldCBpbnQzMl90b19pbnRfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnQzMlwiIFwiaW50XCIgaW50MzJfdG9fc3RyaW5nXG5sZXQgaW50MzJfdG9faW50X3RydW5jID0gQ2FtbC5JbnQzMi50b19pbnRcbmxldCBpbnRfdG9faW50MzJfdHJ1bmMgPSBDYW1sLkludDMyLm9mX2ludFxuXG5sZXQgaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgPVxuICBpZiBudW1fYml0c19pbnQgPD0gbnVtX2JpdHNfaW50MzJcbiAgdGhlbiBmdW4gXyAtPiB0cnVlXG4gIGVsc2UgKFxuICAgIGxldCBtaW4gPSBpbnQzMl90b19pbnRfdHJ1bmMgbWluX2ludDMyIGluXG4gICAgbGV0IG1heCA9IGludDMyX3RvX2ludF90cnVuYyBtYXhfaW50MzIgaW5cbiAgICBmdW4geCAtPiBjb21wYXJlX2ludCBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50IHggbWF4IDw9IDApXG47O1xuXG5sZXQgaW50MzJfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgPVxuICBpZiBudW1fYml0c19pbnQzMiA8PSBudW1fYml0c19pbnRcbiAgdGhlbiBmdW4gXyAtPiB0cnVlXG4gIGVsc2UgKFxuICAgIGxldCBtaW4gPSBpbnRfdG9faW50MzJfdHJ1bmMgSW50Lm1pbl92YWx1ZSBpblxuICAgIGxldCBtYXggPSBpbnRfdG9faW50MzJfdHJ1bmMgSW50Lm1heF92YWx1ZSBpblxuICAgIGZ1biB4IC0+IGNvbXBhcmVfaW50MzIgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludDMyIHggbWF4IDw9IDApXG47O1xuXG5sZXQgaW50X3RvX2ludDMyIHggPVxuICBpZiBpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4IHRoZW4gU29tZSAoaW50X3RvX2ludDMyX3RydW5jIHgpIGVsc2UgTm9uZVxuOztcblxubGV0IGludDMyX3RvX2ludCB4ID1cbiAgaWYgaW50MzJfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeCB0aGVuIFNvbWUgKGludDMyX3RvX2ludF90cnVuYyB4KSBlbHNlIE5vbmVcbjs7XG5cbmxldCBpbnRfdG9faW50MzJfZXhuIHggPVxuICBpZiBpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4IHRoZW4gaW50X3RvX2ludDMyX3RydW5jIHggZWxzZSBpbnRfdG9faW50MzJfZmFpbHVyZSB4XG47O1xuXG5sZXQgaW50MzJfdG9faW50X2V4biB4ID1cbiAgaWYgaW50MzJfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeCB0aGVuIGludDMyX3RvX2ludF90cnVuYyB4IGVsc2UgaW50MzJfdG9faW50X2ZhaWx1cmUgeFxuOztcblxuKCogaW50IDwtPiBpbnQ2NCAqKVxuXG5sZXQgaW50NjRfdG9faW50X2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50NjRcIiBcImludFwiIGludDY0X3RvX3N0cmluZ1xubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQgPCBudW1fYml0c19pbnQ2NClcbmxldCBpbnRfdG9faW50NjQgPSBDYW1sLkludDY0Lm9mX2ludFxubGV0IGludDY0X3RvX2ludF90cnVuYyA9IENhbWwuSW50NjQudG9faW50XG5cbmxldCBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCA9XG4gIGxldCBtaW4gPSBpbnRfdG9faW50NjQgSW50Lm1pbl92YWx1ZSBpblxuICBsZXQgbWF4ID0gaW50X3RvX2ludDY0IEludC5tYXhfdmFsdWUgaW5cbiAgZnVuIHggLT4gY29tcGFyZV9pbnQ2NCBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50NjQgeCBtYXggPD0gMFxuOztcblxubGV0IGludDY0X3RvX2ludCB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeCB0aGVuIFNvbWUgKGludDY0X3RvX2ludF90cnVuYyB4KSBlbHNlIE5vbmVcbjs7XG5cbmxldCBpbnQ2NF90b19pbnRfZXhuIHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4IHRoZW4gaW50NjRfdG9faW50X3RydW5jIHggZWxzZSBpbnQ2NF90b19pbnRfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQgPC0+IG5hdGl2ZWludCAqKVxuXG5sZXQgbmF0aXZlaW50X3RvX2ludF9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcIm5hdGl2ZWludFwiIFwiaW50XCIgbmF0aXZlaW50X3RvX3N0cmluZ1xubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQgPD0gbnVtX2JpdHNfbmF0aXZlaW50KVxubGV0IGludF90b19uYXRpdmVpbnQgPSBDYW1sLk5hdGl2ZWludC5vZl9pbnRcbmxldCBuYXRpdmVpbnRfdG9faW50X3RydW5jID0gQ2FtbC5OYXRpdmVpbnQudG9faW50XG5cbmxldCBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgPVxuICBpZiBudW1fYml0c19uYXRpdmVpbnQgPD0gbnVtX2JpdHNfaW50XG4gIHRoZW4gZnVuIF8gLT4gdHJ1ZVxuICBlbHNlIChcbiAgICBsZXQgbWluID0gaW50X3RvX25hdGl2ZWludCBJbnQubWluX3ZhbHVlIGluXG4gICAgbGV0IG1heCA9IGludF90b19uYXRpdmVpbnQgSW50Lm1heF92YWx1ZSBpblxuICAgIGZ1biB4IC0+IGNvbXBhcmVfbmF0aXZlaW50IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9uYXRpdmVpbnQgeCBtYXggPD0gMClcbjs7XG5cbmxldCBuYXRpdmVpbnRfdG9faW50IHggPVxuICBpZiBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeCB0aGVuIFNvbWUgKG5hdGl2ZWludF90b19pbnRfdHJ1bmMgeCkgZWxzZSBOb25lXG47O1xuXG5sZXQgbmF0aXZlaW50X3RvX2ludF9leG4geCA9XG4gIGlmIG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4XG4gIHRoZW4gbmF0aXZlaW50X3RvX2ludF90cnVuYyB4XG4gIGVsc2UgbmF0aXZlaW50X3RvX2ludF9mYWlsdXJlIHhcbjs7XG5cbigqIGludDMyIDwtPiBpbnQ2NCAqKVxuXG5sZXQgaW50NjRfdG9faW50MzJfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnQ2NFwiIFwiaW50MzJcIiBpbnQ2NF90b19zdHJpbmdcbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50MzIgPCBudW1fYml0c19pbnQ2NClcbmxldCBpbnQzMl90b19pbnQ2NCA9IENhbWwuSW50NjQub2ZfaW50MzJcbmxldCBpbnQ2NF90b19pbnQzMl90cnVuYyA9IENhbWwuSW50NjQudG9faW50MzJcblxubGV0IGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgPVxuICBsZXQgbWluID0gaW50MzJfdG9faW50NjQgbWluX2ludDMyIGluXG4gIGxldCBtYXggPSBpbnQzMl90b19pbnQ2NCBtYXhfaW50MzIgaW5cbiAgZnVuIHggLT4gY29tcGFyZV9pbnQ2NCBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50NjQgeCBtYXggPD0gMFxuOztcblxubGV0IGludDY0X3RvX2ludDMyIHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHggdGhlbiBTb21lIChpbnQ2NF90b19pbnQzMl90cnVuYyB4KSBlbHNlIE5vbmVcbjs7XG5cbmxldCBpbnQ2NF90b19pbnQzMl9leG4geCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeFxuICB0aGVuIGludDY0X3RvX2ludDMyX3RydW5jIHhcbiAgZWxzZSBpbnQ2NF90b19pbnQzMl9mYWlsdXJlIHhcbjs7XG5cbigqIGludDMyIDwtPiBuYXRpdmVpbnQgKilcblxubGV0IG5hdGl2ZWludF90b19pbnQzMl9mYWlsdXJlIHggPVxuICBjb252ZXJ0X2ZhaWx1cmUgeCBcIm5hdGl2ZWludFwiIFwiaW50MzJcIiBuYXRpdmVpbnRfdG9fc3RyaW5nXG47O1xuXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludDMyIDw9IG51bV9iaXRzX25hdGl2ZWludClcbmxldCBpbnQzMl90b19uYXRpdmVpbnQgPSBDYW1sLk5hdGl2ZWludC5vZl9pbnQzMlxubGV0IG5hdGl2ZWludF90b19pbnQzMl90cnVuYyA9IENhbWwuTmF0aXZlaW50LnRvX2ludDMyXG5cbmxldCBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiA9XG4gIGlmIG51bV9iaXRzX25hdGl2ZWludCA8PSBudW1fYml0c19pbnQzMlxuICB0aGVuIGZ1biBfIC0+IHRydWVcbiAgZWxzZSAoXG4gICAgbGV0IG1pbiA9IGludDMyX3RvX25hdGl2ZWludCBtaW5faW50MzIgaW5cbiAgICBsZXQgbWF4ID0gaW50MzJfdG9fbmF0aXZlaW50IG1heF9pbnQzMiBpblxuICAgIGZ1biB4IC0+IGNvbXBhcmVfbmF0aXZlaW50IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9uYXRpdmVpbnQgeCBtYXggPD0gMClcbjs7XG5cbmxldCBuYXRpdmVpbnRfdG9faW50MzIgeCA9XG4gIGlmIG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHhcbiAgdGhlbiBTb21lIChuYXRpdmVpbnRfdG9faW50MzJfdHJ1bmMgeClcbiAgZWxzZSBOb25lXG47O1xuXG5sZXQgbmF0aXZlaW50X3RvX2ludDMyX2V4biB4ID1cbiAgaWYgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeFxuICB0aGVuIG5hdGl2ZWludF90b19pbnQzMl90cnVuYyB4XG4gIGVsc2UgbmF0aXZlaW50X3RvX2ludDMyX2ZhaWx1cmUgeFxuOztcblxuKCogaW50NjQgPC0+IG5hdGl2ZWludCAqKVxuXG5sZXQgaW50NjRfdG9fbmF0aXZlaW50X2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50NjRcIiBcIm5hdGl2ZWludFwiIGludDY0X3RvX3N0cmluZ1xubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQ2NCA+PSBudW1fYml0c19uYXRpdmVpbnQpXG5sZXQgaW50NjRfdG9fbmF0aXZlaW50X3RydW5jID0gQ2FtbC5JbnQ2NC50b19uYXRpdmVpbnRcbmxldCBuYXRpdmVpbnRfdG9faW50NjQgPSBDYW1sLkludDY0Lm9mX25hdGl2ZWludFxuXG5sZXQgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19uYXRpdmVpbnQgPVxuICBpZiBudW1fYml0c19pbnQ2NCA8PSBudW1fYml0c19uYXRpdmVpbnRcbiAgdGhlbiBmdW4gXyAtPiB0cnVlXG4gIGVsc2UgKFxuICAgIGxldCBtaW4gPSBuYXRpdmVpbnRfdG9faW50NjQgbWluX25hdGl2ZWludCBpblxuICAgIGxldCBtYXggPSBuYXRpdmVpbnRfdG9faW50NjQgbWF4X25hdGl2ZWludCBpblxuICAgIGZ1biB4IC0+IGNvbXBhcmVfaW50NjQgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludDY0IHggbWF4IDw9IDApXG47O1xuXG5sZXQgaW50NjRfdG9fbmF0aXZlaW50IHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX25hdGl2ZWludCB4XG4gIHRoZW4gU29tZSAoaW50NjRfdG9fbmF0aXZlaW50X3RydW5jIHgpXG4gIGVsc2UgTm9uZVxuOztcblxubGV0IGludDY0X3RvX25hdGl2ZWludF9leG4geCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfbmF0aXZlaW50IHhcbiAgdGhlbiBpbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmMgeFxuICBlbHNlIGludDY0X3RvX25hdGl2ZWludF9mYWlsdXJlIHhcbjs7XG5cbigqIGludDY0IDwtPiBpbnQ2MyAqKVxuXG5sZXQgaW50NjRfdG9faW50NjNfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnQ2NFwiIFwiaW50NjNcIiBpbnQ2NF90b19zdHJpbmdcblxubGV0IGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50NjMgPVxuICBsZXQgbWluID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCBtaW5faW50NjQgMSBpblxuICBsZXQgbWF4ID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCBtYXhfaW50NjQgMSBpblxuICBmdW4geCAtPiBjb21wYXJlX2ludDY0IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQ2NCB4IG1heCA8PSAwXG47O1xuXG5sZXQgaW50NjRfZml0X29uX2ludDYzX2V4biB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQ2MyB4IHRoZW4gKCkgZWxzZSBpbnQ2NF90b19pbnQ2M19mYWlsdXJlIHhcbjs7XG5cbigqIHN0cmluZyBjb252ZXJzaW9ucyAqKVxuXG5sZXQgaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSBpbnB1dCB+ZGVsaW1pdGVyIH5jaGFyc19wZXJfZGVsaW1pdGVyID1cbiAgbGV0IGlucHV0X2xlbmd0aCA9IFN0cmluZy5sZW5ndGggaW5wdXQgaW5cbiAgaWYgaW5wdXRfbGVuZ3RoIDw9IGNoYXJzX3Blcl9kZWxpbWl0ZXJcbiAgdGhlbiBpbnB1dFxuICBlbHNlIChcbiAgICBsZXQgaGFzX3NpZ24gPVxuICAgICAgbWF0Y2ggaW5wdXQuWzBdIHdpdGhcbiAgICAgIHwgJysnIHwgJy0nIC0+IHRydWVcbiAgICAgIHwgXyAtPiBmYWxzZVxuICAgIGluXG4gICAgbGV0IG51bV9kaWdpdHMgPSBpZiBoYXNfc2lnbiB0aGVuIGlucHV0X2xlbmd0aCAtIDEgZWxzZSBpbnB1dF9sZW5ndGggaW5cbiAgICBsZXQgbnVtX2RlbGltaXRlcnMgPSAobnVtX2RpZ2l0cyAtIDEpIC8gY2hhcnNfcGVyX2RlbGltaXRlciBpblxuICAgIGxldCBvdXRwdXRfbGVuZ3RoID0gaW5wdXRfbGVuZ3RoICsgbnVtX2RlbGltaXRlcnMgaW5cbiAgICBsZXQgb3V0cHV0ID0gQnl0ZXMuY3JlYXRlIG91dHB1dF9sZW5ndGggaW5cbiAgICBsZXQgaW5wdXRfcG9zID0gcmVmIChpbnB1dF9sZW5ndGggLSAxKSBpblxuICAgIGxldCBvdXRwdXRfcG9zID0gcmVmIChvdXRwdXRfbGVuZ3RoIC0gMSkgaW5cbiAgICBsZXQgbnVtX2NoYXJzX3VudGlsX2RlbGltaXRlciA9IHJlZiBjaGFyc19wZXJfZGVsaW1pdGVyIGluXG4gICAgbGV0IGZpcnN0X2RpZ2l0X3BvcyA9IGlmIGhhc19zaWduIHRoZW4gMSBlbHNlIDAgaW5cbiAgICB3aGlsZSAhaW5wdXRfcG9zID49IGZpcnN0X2RpZ2l0X3BvcyBkb1xuICAgICAgaWYgIW51bV9jaGFyc191bnRpbF9kZWxpbWl0ZXIgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgQnl0ZXMuc2V0IG91dHB1dCAhb3V0cHV0X3BvcyBkZWxpbWl0ZXI7XG4gICAgICAgIGRlY3Igb3V0cHV0X3BvcztcbiAgICAgICAgbnVtX2NoYXJzX3VudGlsX2RlbGltaXRlciA6PSBjaGFyc19wZXJfZGVsaW1pdGVyKTtcbiAgICAgIEJ5dGVzLnNldCBvdXRwdXQgIW91dHB1dF9wb3MgaW5wdXQuWyFpbnB1dF9wb3NdO1xuICAgICAgZGVjciBpbnB1dF9wb3M7XG4gICAgICBkZWNyIG91dHB1dF9wb3M7XG4gICAgICBkZWNyIG51bV9jaGFyc191bnRpbF9kZWxpbWl0ZXJcbiAgICBkb25lO1xuICAgIGlmIGhhc19zaWduIHRoZW4gQnl0ZXMuc2V0IG91dHB1dCAwIGlucHV0LlswXTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOm91dHB1dClcbjs7XG5cbmxldCBpbnNlcnRfZGVsaW1pdGVyIGlucHV0IH5kZWxpbWl0ZXIgPVxuICBpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5IGlucHV0IH5kZWxpbWl0ZXIgfmNoYXJzX3Blcl9kZWxpbWl0ZXI6M1xuOztcblxubGV0IGluc2VydF91bmRlcnNjb3JlcyBpbnB1dCA9IGluc2VydF9kZWxpbWl0ZXIgaW5wdXQgfmRlbGltaXRlcjonXydcbmxldCBzZXhwX29mX2ludF9zdHlsZSA9IFNleHAub2ZfaW50X3N0eWxlXG5cbm1vZHVsZSBNYWtlIChJIDogc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmdcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgb3BlbiBJXG5cbiAgbGV0IGNoYXJzX3Blcl9kZWxpbWl0ZXIgPSAzXG5cbiAgbGV0IHRvX3N0cmluZ19odW0gPyhkZWxpbWl0ZXIgPSAnXycpIHQgPVxuICAgIGluc2VydF9kZWxpbWl0ZXJfZXZlcnkgKHRvX3N0cmluZyB0KSB+ZGVsaW1pdGVyIH5jaGFyc19wZXJfZGVsaW1pdGVyXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCB0ID1cbiAgICBsZXQgcyA9IHRvX3N0cmluZyB0IGluXG4gICAgU2V4cC5BdG9tXG4gICAgICAobWF0Y2ggIXNleHBfb2ZfaW50X3N0eWxlIHdpdGhcbiAgICAgICB8IGBVbmRlcnNjb3JlcyAtPiBpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5IHMgfmNoYXJzX3Blcl9kZWxpbWl0ZXIgfmRlbGltaXRlcjonXydcbiAgICAgICB8IGBOb191bmRlcnNjb3JlcyAtPiBzKVxuICA7O1xuZW5kXG5cbm1vZHVsZSBNYWtlX2hleCAoSSA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG4gICAgaW5jbHVkZSBQcHhfaGFzaF9saWIuSGFzaGFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgdmFsIHRvX3N0cmluZyA6IHQgLT4gc3RyaW5nXG4gICAgdmFsIG9mX3N0cmluZyA6IHN0cmluZyAtPiB0XG4gICAgdmFsIHplcm8gOiB0XG4gICAgdmFsICggPCApIDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgbmVnIDogdCAtPiB0XG4gICAgdmFsIG1vZHVsZV9uYW1lIDogc3RyaW5nXG4gIGVuZCkgPVxuc3RydWN0XG4gIG1vZHVsZSBUX2hleCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IEkudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKEkuY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBJLmhhc2hfZm9sZF90XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IEkuaGFzaCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgY2hhcnNfcGVyX2RlbGltaXRlciA9IDRcblxuICAgIGxldCB0b19zdHJpbmcnID9kZWxpbWl0ZXIgdCA9XG4gICAgICBsZXQgbWFrZV9zdWZmaXggPVxuICAgICAgICBtYXRjaCBkZWxpbWl0ZXIgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gSS50b19zdHJpbmdcbiAgICAgICAgfCBTb21lIGRlbGltaXRlciAtPlxuICAgICAgICAgIGZ1biB0IC0+IGluc2VydF9kZWxpbWl0ZXJfZXZlcnkgKEkudG9fc3RyaW5nIHQpIH5kZWxpbWl0ZXIgfmNoYXJzX3Blcl9kZWxpbWl0ZXJcbiAgICAgIGluXG4gICAgICBpZiBJLiggPCApIHQgSS56ZXJvIHRoZW4gXCItMHhcIiBeIG1ha2Vfc3VmZml4IChJLm5lZyB0KSBlbHNlIFwiMHhcIiBeIG1ha2Vfc3VmZml4IHRcbiAgICA7O1xuXG4gICAgbGV0IHRvX3N0cmluZyB0ID0gdG9fc3RyaW5nJyB0ID9kZWxpbWl0ZXI6Tm9uZVxuICAgIGxldCB0b19zdHJpbmdfaHVtID8oZGVsaW1pdGVyID0gJ18nKSB0ID0gdG9fc3RyaW5nJyB0IH5kZWxpbWl0ZXJcblxuICAgIGxldCBpbnZhbGlkIHN0ciA9XG4gICAgICBQcmludGYuZmFpbHdpdGhmIFwiJXMub2Zfc3RyaW5nOiBpbnZhbGlkIGlucHV0ICVTXCIgSS5tb2R1bGVfbmFtZSBzdHIgKClcbiAgICA7O1xuXG4gICAgbGV0IG9mX3N0cmluZ193aXRoX2RlbGltaXRlciBzdHIgPVxuICAgICAgSS5vZl9zdHJpbmcgKFN0cmluZy5maWx0ZXIgc3RyIH5mOihmdW4gYyAtPiBDaGFyLiggPD4gKSBjICdfJykpXG4gICAgOztcblxuICAgIGxldCBvZl9zdHJpbmcgc3RyID1cbiAgICAgIGxldCBtb2R1bGUgTCA9IEhleF9sZXhlciBpblxuICAgICAgbGV0IGxleCA9IENhbWwuTGV4aW5nLmZyb21fc3RyaW5nIHN0ciBpblxuICAgICAgbGV0IHJlc3VsdCA9IE9wdGlvbi50cnlfd2l0aCAoZnVuICgpIC0+IEwucGFyc2VfaGV4IGxleCkgaW5cbiAgICAgIGlmIGxleC5sZXhfY3Vycl9wb3MgPSBsZXgubGV4X2J1ZmZlcl9sZW5cbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCByZXN1bHQgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gaW52YWxpZCBzdHJcbiAgICAgICAgfCBTb21lIChOZWcgYm9keSkgLT4gSS5uZWcgKG9mX3N0cmluZ193aXRoX2RlbGltaXRlciBib2R5KVxuICAgICAgICB8IFNvbWUgKFBvcyBib2R5KSAtPiBvZl9zdHJpbmdfd2l0aF9kZWxpbWl0ZXIgYm9keSlcbiAgICAgIGVsc2UgaW52YWxpZCBzdHJcbiAgICA7O1xuXG4gICAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICAgIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgU3RyaW5nLnRfc2V4cF9ncmFtbWFyXG4gICAgOztcbiAgZW5kXG5cbiAgbW9kdWxlIEhleCA9IHN0cnVjdFxuICAgIGluY2x1ZGUgVF9oZXhcbiAgICBpbmNsdWRlIFNleHBhYmxlLk9mX3N0cmluZ2FibGUgKFRfaGV4KVxuICBlbmRcbmVuZFxuIiwiKCogVGhpcyBmaWxlIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5IC4uL2dlbmVyYXRlL2dlbmVyYXRlX3Bvd19vdmVyZmxvd19ib3VuZHMuZXhlICopXG5cbm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcblxuKCogV2UgaGF2ZSB0byB1c2UgSW50NjQudG9faW50X2V4biBpbnN0ZWFkIG9mIGludCBjb25zdGFudHMgdG8gbWFrZVxuICAgc3VyZSB0aGF0IGZpbGUgY2FuIGJlIHByZXByb2Nlc3NlZCBvbiAzMi1iaXQgbWFjaGluZXMuICopXG5cbmxldCBvdmVyZmxvd19ib3VuZF9tYXhfaW50MzJfdmFsdWUgOiBpbnQzMiA9XG4gIDIxNDc0ODM2NDdsXG5cbmxldCBpbnQzMl9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMgOiBpbnQzMiBhcnJheSA9XG4gIFt8IDIxNDc0ODM2NDdsXG4gIDsgIDIxNDc0ODM2NDdsXG4gIDsgIDQ2MzQwbFxuICA7ICAxMjkwbFxuICA7ICAyMTVsXG4gIDsgIDczbFxuICA7ICAzNWxcbiAgOyAgMjFsXG4gIDsgIDE0bFxuICA7ICAxMGxcbiAgOyAgOGxcbiAgOyAgN2xcbiAgOyAgNWxcbiAgOyAgNWxcbiAgOyAgNGxcbiAgOyAgNGxcbiAgOyAgM2xcbiAgOyAgM2xcbiAgOyAgM2xcbiAgOyAgM2xcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMmxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgOyAgMWxcbiAgfF1cblxubGV0IG92ZXJmbG93X2JvdW5kX21heF9pbnRfdmFsdWUgOiBpbnQgPVxuICAoLTEpIGxzciAxXG5cbmxldCBpbnRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIDogaW50IGFycmF5ID1cbiAgbWF0Y2ggSW50X2NvbnZlcnNpb25zLm51bV9iaXRzX2ludCB3aXRoXG4gIHwgMzIgLT4gQXJyYXkubWFwIGludDMyX3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyB+ZjpDYW1sLkludDMyLnRvX2ludFxuICB8IDYzIC0+XG4gICAgW3wgQ2FtbC5JbnQ2NC50b19pbnQgNDYxMTY4NjAxODQyNzM4NzkwM0xcbiAgICA7ICBDYW1sLkludDY0LnRvX2ludCA0NjExNjg2MDE4NDI3Mzg3OTAzTFxuICAgIDsgIENhbWwuSW50NjQudG9faW50IDIxNDc0ODM2NDdMXG4gICAgOyAgMTY2NDUxMFxuICAgIDsgIDQ2MzQwXG4gICAgOyAgNTQwNFxuICAgIDsgIDEyOTBcbiAgICA7ICA0NjNcbiAgICA7ICAyMTVcbiAgICA7ICAxMThcbiAgICA7ICA3M1xuICAgIDsgIDQ5XG4gICAgOyAgMzVcbiAgICA7ICAyN1xuICAgIDsgIDIxXG4gICAgOyAgMTdcbiAgICA7ICAxNFxuICAgIDsgIDEyXG4gICAgOyAgMTBcbiAgICA7ICA5XG4gICAgOyAgOFxuICAgIDsgIDdcbiAgICA7ICA3XG4gICAgOyAgNlxuICAgIDsgIDVcbiAgICA7ICA1XG4gICAgOyAgNVxuICAgIDsgIDRcbiAgICA7ICA0XG4gICAgOyAgNFxuICAgIDsgIDRcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICB8XVxuICB8IDMxIC0+XG4gICAgW3wgMTA3Mzc0MTgyM1xuICAgIDsgIDEwNzM3NDE4MjNcbiAgICA7ICAzMjc2N1xuICAgIDsgIDEwMjNcbiAgICA7ICAxODFcbiAgICA7ICA2M1xuICAgIDsgIDMxXG4gICAgOyAgMTlcbiAgICA7ICAxM1xuICAgIDsgIDEwXG4gICAgOyAgN1xuICAgIDsgIDZcbiAgICA7ICA1XG4gICAgOyAgNFxuICAgIDsgIDRcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgfF1cbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgb3ZlcmZsb3dfYm91bmRfbWF4X2ludDYzX29uX2ludDY0X3ZhbHVlIDogaW50NjQgPVxuICA0NjExNjg2MDE4NDI3Mzg3OTAzTFxuXG5sZXQgaW50NjNfb25faW50NjRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIDogaW50NjQgYXJyYXkgPVxuICBbfCA0NjExNjg2MDE4NDI3Mzg3OTAzTFxuICA7ICA0NjExNjg2MDE4NDI3Mzg3OTAzTFxuICA7ICAyMTQ3NDgzNjQ3TFxuICA7ICAxNjY0NTEwTFxuICA7ICA0NjM0MExcbiAgOyAgNTQwNExcbiAgOyAgMTI5MExcbiAgOyAgNDYzTFxuICA7ICAyMTVMXG4gIDsgIDExOExcbiAgOyAgNzNMXG4gIDsgIDQ5TFxuICA7ICAzNUxcbiAgOyAgMjdMXG4gIDsgIDIxTFxuICA7ICAxN0xcbiAgOyAgMTRMXG4gIDsgIDEyTFxuICA7ICAxMExcbiAgOyAgOUxcbiAgOyAgOExcbiAgOyAgN0xcbiAgOyAgN0xcbiAgOyAgNkxcbiAgOyAgNUxcbiAgOyAgNUxcbiAgOyAgNUxcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMUxcbiAgOyAgMUxcbiAgfF1cblxubGV0IG92ZXJmbG93X2JvdW5kX21heF9pbnQ2NF92YWx1ZSA6IGludDY0ID1cbiAgOTIyMzM3MjAzNjg1NDc3NTgwN0xcblxubGV0IGludDY0X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyA6IGludDY0IGFycmF5ID1cbiAgW3wgOTIyMzM3MjAzNjg1NDc3NTgwN0xcbiAgOyAgOTIyMzM3MjAzNjg1NDc3NTgwN0xcbiAgOyAgMzAzNzAwMDQ5OUxcbiAgOyAgMjA5NzE1MUxcbiAgOyAgNTUxMDhMXG4gIDsgIDYyMDhMXG4gIDsgIDE0NDhMXG4gIDsgIDUxMUxcbiAgOyAgMjM0TFxuICA7ICAxMjdMXG4gIDsgIDc4TFxuICA7ICA1MkxcbiAgOyAgMzhMXG4gIDsgIDI4TFxuICA7ICAyMkxcbiAgOyAgMThMXG4gIDsgIDE1TFxuICA7ICAxM0xcbiAgOyAgMTFMXG4gIDsgIDlMXG4gIDsgIDhMXG4gIDsgIDdMXG4gIDsgIDdMXG4gIDsgIDZMXG4gIDsgIDZMXG4gIDsgIDVMXG4gIDsgIDVMXG4gIDsgIDVMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDFMXG4gIHxdXG5cbmxldCBpbnQ2NF9uZWdhdGl2ZV9vdmVyZmxvd19ib3VuZHMgOiBpbnQ2NCBhcnJheSA9XG4gIFt8IC05MjIzMzcyMDM2ODU0Nzc1ODA3TFxuICA7ICAtOTIyMzM3MjAzNjg1NDc3NTgwN0xcbiAgOyAgLTMwMzcwMDA0OTlMXG4gIDsgIC0yMDk3MTUxTFxuICA7ICAtNTUxMDhMXG4gIDsgIC02MjA4TFxuICA7ICAtMTQ0OExcbiAgOyAgLTUxMUxcbiAgOyAgLTIzNExcbiAgOyAgLTEyN0xcbiAgOyAgLTc4TFxuICA7ICAtNTJMXG4gIDsgIC0zOExcbiAgOyAgLTI4TFxuICA7ICAtMjJMXG4gIDsgIC0xOExcbiAgOyAgLTE1TFxuICA7ICAtMTNMXG4gIDsgIC0xMUxcbiAgOyAgLTlMXG4gIDsgIC04TFxuICA7ICAtN0xcbiAgOyAgLTdMXG4gIDsgIC02TFxuICA7ICAtNkxcbiAgOyAgLTVMXG4gIDsgIC01TFxuICA7ICAtNUxcbiAgOyAgLTRMXG4gIDsgIC00TFxuICA7ICAtNExcbiAgOyAgLTRMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMUxcbiAgfF1cbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxubGV0IG5lZ2F0aXZlX2V4cG9uZW50ICgpID0gUHJpbnRmLmludmFsaWRfYXJnZiBcImV4cG9uZW50IGNhbiBub3QgYmUgbmVnYXRpdmVcIiAoKVxubGV0IG92ZXJmbG93ICgpID0gUHJpbnRmLmludmFsaWRfYXJnZiBcImludGVnZXIgb3ZlcmZsb3cgaW4gcG93XCIgKClcblxuKCogVG8gaW1wbGVtZW50IFtpbnQ2NF9wb3ddLCB3ZSB1c2UgQyBjb2RlIHJhdGhlciB0aGFuIE9DYW1sIHRvIGVsaW1pbmF0ZSBhbGxvY2F0aW9uLiAqKVxuZXh0ZXJuYWwgaW50X21hdGhfaW50X3BvdyA6IGludCAtPiBpbnQgLT4gaW50ID0gXCJCYXNlX2ludF9tYXRoX2ludF9wb3dfc3R1YlwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBpbnRfbWF0aF9pbnQ2NF9wb3cgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9wb3dfc3R1YlwiXG5cbmxldCBpbnRfcG93IGJhc2UgZXhwb25lbnQgPVxuICBpZiBleHBvbmVudCA8IDAgdGhlbiBuZWdhdGl2ZV9leHBvbmVudCAoKTtcbiAgaWYgYWJzIGJhc2UgPiAxXG4gICYmIChleHBvbmVudCA+IDYzXG4gICAgICB8fCBhYnMgYmFzZSA+IFBvd19vdmVyZmxvd19ib3VuZHMuaW50X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcy4oZXhwb25lbnQpKVxuICB0aGVuIG92ZXJmbG93ICgpO1xuICBpbnRfbWF0aF9pbnRfcG93IGJhc2UgZXhwb25lbnRcbjs7XG5cbm1vZHVsZSBJbnQ2NF93aXRoX2NvbXBhcmlzb25zID0gc3RydWN0XG4gIGluY2x1ZGUgQ2FtbC5JbnQ2NFxuXG4gIGV4dGVybmFsICggPCApIDogaW50NjQgLT4gaW50NjQgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbiAgZXh0ZXJuYWwgKCA+ICkgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuICBleHRlcm5hbCAoID49ICkgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcbmVuZFxuXG4oKiB3ZSBkb24ndCBkbyBbYWJzXSBpbiBpbnQ2NCBjYXNlIHRvIGF2b2lkIGFsbG9jYXRpb24gKilcbmxldCBpbnQ2NF9wb3cgYmFzZSBleHBvbmVudCA9XG4gIGxldCBvcGVuIEludDY0X3dpdGhfY29tcGFyaXNvbnMgaW5cbiAgaWYgZXhwb25lbnQgPCAwTCB0aGVuIG5lZ2F0aXZlX2V4cG9uZW50ICgpO1xuICBpZiAoYmFzZSA+IDFMIHx8IGJhc2UgPCAtMUwpXG4gICYmIChleHBvbmVudCA+IDYzTFxuICAgICAgfHwgKGJhc2UgPj0gMExcbiAgICAgICAgICAmJiBiYXNlID4gUG93X292ZXJmbG93X2JvdW5kcy5pbnQ2NF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMuKHRvX2ludCBleHBvbmVudClcbiAgICAgICAgIClcbiAgICAgIHx8IChiYXNlIDwgMExcbiAgICAgICAgICAmJiBiYXNlIDwgUG93X292ZXJmbG93X2JvdW5kcy5pbnQ2NF9uZWdhdGl2ZV9vdmVyZmxvd19ib3VuZHMuKHRvX2ludCBleHBvbmVudClcbiAgICAgICAgICkpXG4gIHRoZW4gb3ZlcmZsb3cgKCk7XG4gIGludF9tYXRoX2ludDY0X3BvdyBiYXNlIGV4cG9uZW50XG47O1xuXG5sZXQgaW50NjNfcG93X29uX2ludDY0IGJhc2UgZXhwb25lbnQgPVxuICBsZXQgb3BlbiBJbnQ2NF93aXRoX2NvbXBhcmlzb25zIGluXG4gIGlmIGV4cG9uZW50IDwgMEwgdGhlbiBuZWdhdGl2ZV9leHBvbmVudCAoKTtcbiAgaWYgYWJzIGJhc2UgPiAxTFxuICAmJiAoZXhwb25lbnQgPiA2M0xcbiAgICAgIHx8IGFicyBiYXNlXG4gICAgICAgICA+IFBvd19vdmVyZmxvd19ib3VuZHMuaW50NjNfb25faW50NjRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzLih0b19pbnQgZXhwb25lbnQpXG4gICAgIClcbiAgdGhlbiBvdmVyZmxvdyAoKTtcbiAgaW50X21hdGhfaW50NjRfcG93IGJhc2UgZXhwb25lbnRcbjs7XG5cbm1vZHVsZSB0eXBlIE1ha2VfYXJnID0gc2lnXG4gIHR5cGUgdFxuXG4gIGluY2x1ZGUgRmxvYXRhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuICBpbmNsdWRlIFN0cmluZ2FibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgdmFsICggKyApIDogdCAtPiB0IC0+IHRcbiAgdmFsICggLSApIDogdCAtPiB0IC0+IHRcbiAgdmFsICggKiApIDogdCAtPiB0IC0+IHRcbiAgdmFsICggLyApIDogdCAtPiB0IC0+IHRcbiAgdmFsICggfi0gKSA6IHQgLT4gdFxuXG4gIGluY2x1ZGUgQ29tcGFyaXNvbnMuSW5maXggd2l0aCB0eXBlIHQgOj0gdFxuXG4gIHZhbCBhYnMgOiB0IC0+IHRcbiAgdmFsIG5lZyA6IHQgLT4gdFxuICB2YWwgemVybyA6IHRcbiAgdmFsIG9mX2ludF9leG4gOiBpbnQgLT4gdFxuICB2YWwgcmVtIDogdCAtPiB0IC0+IHRcbmVuZFxuXG5tb2R1bGUgTWFrZSAoWCA6IE1ha2VfYXJnKSA9IHN0cnVjdFxuICBvcGVuIFhcblxuICBsZXQgKCAlICkgeCB5ID1cbiAgICBpZiB5IDw9IHplcm9cbiAgICB0aGVuXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCIlcyAlJSAlcyBpbiBjb3JlX2ludC5tbDogbW9kdWx1cyBzaG91bGQgYmUgcG9zaXRpdmVcIlxuICAgICAgICAodG9fc3RyaW5nIHgpXG4gICAgICAgICh0b19zdHJpbmcgeSlcbiAgICAgICAgKCk7XG4gICAgbGV0IHJ2YWwgPSBYLnJlbSB4IHkgaW5cbiAgICBpZiBydmFsIDwgemVybyB0aGVuIHJ2YWwgKyB5IGVsc2UgcnZhbFxuICA7O1xuXG4gIGxldCBvbmUgPSBvZl9pbnRfZXhuIDFcblxuICBsZXQgKCAvJSApIHggeSA9XG4gICAgaWYgeSA8PSB6ZXJvXG4gICAgdGhlblxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiJXMgLyUlICVzIGluIGNvcmVfaW50Lm1sOiBkaXZpc29yIHNob3VsZCBiZSBwb3NpdGl2ZVwiXG4gICAgICAgICh0b19zdHJpbmcgeClcbiAgICAgICAgKHRvX3N0cmluZyB5KVxuICAgICAgICAoKTtcbiAgICBpZiB4IDwgemVybyB0aGVuICgoeCArIG9uZSkgLyB5KSAtIG9uZSBlbHNlIHggLyB5XG4gIDs7XG5cbiAgKCoqIGZsb2F0IGRpdmlzaW9uIG9mIGludGVnZXJzICopXG4gIGxldCAoIC8vICkgeCB5ID0gdG9fZmxvYXQgeCAvLiB0b19mbG9hdCB5XG5cbiAgbGV0IHJvdW5kX2Rvd24gaSB+dG9fbXVsdGlwbGVfb2Y6bW9kdWx1cyA9IGkgLSAoaSAlIG1vZHVsdXMpXG5cbiAgbGV0IHJvdW5kX3VwIGkgfnRvX211bHRpcGxlX29mOm1vZHVsdXMgPVxuICAgIGxldCByZW1haW5kZXIgPSBpICUgbW9kdWx1cyBpblxuICAgIGlmIHJlbWFpbmRlciA9IHplcm8gdGhlbiBpIGVsc2UgaSArIG1vZHVsdXMgLSByZW1haW5kZXJcbiAgOztcblxuICBsZXQgcm91bmRfdG93YXJkc196ZXJvIGkgfnRvX211bHRpcGxlX29mID1cbiAgICBpZiBpID0gemVyb1xuICAgIHRoZW4gemVyb1xuICAgIGVsc2UgaWYgaSA+IHplcm9cbiAgICB0aGVuIHJvdW5kX2Rvd24gaSB+dG9fbXVsdGlwbGVfb2ZcbiAgICBlbHNlIHJvdW5kX3VwIGkgfnRvX211bHRpcGxlX29mXG4gIDs7XG5cbiAgbGV0IHJvdW5kX25lYXJlc3QgaSB+dG9fbXVsdGlwbGVfb2Y6bW9kdWx1cyA9XG4gICAgbGV0IHJlbWFpbmRlciA9IGkgJSBtb2R1bHVzIGluXG4gICAgbGV0IG1vZHVsdXNfbWludXNfcmVtYWluZGVyID0gbW9kdWx1cyAtIHJlbWFpbmRlciBpblxuICAgIGlmIG1vZHVsdXNfbWludXNfcmVtYWluZGVyIDw9IHJlbWFpbmRlclxuICAgIHRoZW4gaSArIG1vZHVsdXNfbWludXNfcmVtYWluZGVyXG4gICAgZWxzZSBpIC0gcmVtYWluZGVyXG4gIDs7XG5cbiAgbGV0IHJvdW5kID8oZGlyID0gYE5lYXJlc3QpIGkgfnRvX211bHRpcGxlX29mID1cbiAgICBtYXRjaCBkaXIgd2l0aFxuICAgIHwgYE5lYXJlc3QgLT4gcm91bmRfbmVhcmVzdCBpIH50b19tdWx0aXBsZV9vZlxuICAgIHwgYERvd24gLT4gcm91bmRfZG93biBpIH50b19tdWx0aXBsZV9vZlxuICAgIHwgYFVwIC0+IHJvdW5kX3VwIGkgfnRvX211bHRpcGxlX29mXG4gICAgfCBgWmVybyAtPiByb3VuZF90b3dhcmRzX3plcm8gaSB+dG9fbXVsdGlwbGVfb2ZcbiAgOztcbmVuZFxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBsZXQgaW50X3BvdyA9IGludF9wb3dcbiAgbGV0IGludDY0X3BvdyA9IGludDY0X3Bvd1xuICBsZXQgaW50NjNfcG93X29uX2ludDY0ID0gaW50NjNfcG93X29uX2ludDY0XG5cbiAgbW9kdWxlIFBvd19vdmVyZmxvd19ib3VuZHMgPSBQb3dfb3ZlcmZsb3dfYm91bmRzXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiBDIHN0dWIgZm9yIGludCBwb3Bjb3VudCB0byB1c2UgdGhlIFBPUENOVCBpbnN0cnVjdGlvbiB3aGVyZSBwb3NzaWJsZSAqKVxuZXh0ZXJuYWwgaW50X3BvcGNvdW50IDogaW50IC0+IGludCA9IFwiQmFzZV9pbnRfbWF0aF9pbnRfcG9wY291bnRcIiBbQEBub2FsbG9jXVxuXG4oKiBUbyBtYWludGFpbiBqYXZhc2NyaXB0IGNvbXBhdGliaWxpdHkgYW5kIGVuYWJsZSB1bmJveGluZywgd2UgaW1wbGVtZW50IHBvcGNvdW50IGluXG4gICBPQ2FtbCByYXRoZXIgdGhhbiB1c2UgQyBzdHVicy4gSW1wbGVtZW50YXRpb24gYWRhcHRlZCBmcm9tOlxuICAgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGFtbWluZ193ZWlnaHQjRWZmaWNpZW50X2ltcGxlbWVudGF0aW9uICopXG5sZXQgaW50NjRfcG9wY291bnQgPVxuICBsZXQgb3BlbiBDYW1sLkludDY0IGluXG4gIGxldCAoICsgKSA9IGFkZCBpblxuICBsZXQgKCAtICkgPSBzdWIgaW5cbiAgbGV0ICggKiApID0gbXVsIGluXG4gIGxldCAoIGxzciApID0gc2hpZnRfcmlnaHRfbG9naWNhbCBpblxuICBsZXQgKCBsYW5kICkgPSBsb2dhbmQgaW5cbiAgbGV0IG0xID0gMHg1NTU1NTU1NTU1NTU1NTU1TCBpblxuICAoKiAwYjAxMDEwMTAxLi4uICopXG4gIGxldCBtMiA9IDB4MzMzMzMzMzMzMzMzMzMzM0wgaW5cbiAgKCogMGIwMDExMDAxMS4uLiAqKVxuICBsZXQgbTQgPSAweDBmMGYwZjBmMGYwZjBmMGZMIGluXG4gICgqIDBiMDAwMDExMTEuLi4gKilcbiAgbGV0IGgwMSA9IDB4MDEwMTAxMDEwMTAxMDEwMUwgaW5cbiAgKCogMSBiaXQgc2V0IHBlciBieXRlICopXG4gIGZ1biBbQGlubGluZV0geCAtPlxuICAgICgqIGdhdGhlciB0aGUgYml0IGNvdW50IGZvciBldmVyeSBwYWlyIG9mIGJpdHMgKilcbiAgICBsZXQgeCA9IHggLSAoKHggbHNyIDEpIGxhbmQgbTEpIGluXG4gICAgKCogZ2F0aGVyIHRoZSBiaXQgY291bnQgZm9yIGV2ZXJ5IDQgYml0cyAqKVxuICAgIGxldCB4ID0gKHggbGFuZCBtMikgKyAoKHggbHNyIDIpIGxhbmQgbTIpIGluXG4gICAgKCogZ2F0aGVyIHRoZSBiaXQgY291bnQgZm9yIGV2ZXJ5IGJ5dGUgKilcbiAgICBsZXQgeCA9ICh4ICsgKHggbHNyIDQpKSBsYW5kIG00IGluXG4gICAgKCogc3VtIHRoZSBiaXQgY291bnRzIGluIHRoZSB0b3AgYnl0ZSBhbmQgc2hpZnQgaXQgZG93biAqKVxuICAgIHRvX2ludCAoKHggKiBoMDEpIGxzciA1Nilcbjs7XG5cbmxldCBpbnQzMl9wb3Bjb3VudCA9XG4gICgqIE9uIDY0LWJpdCBzeXN0ZW1zLCB0aGlzIGlzIGZhc3RlciB0aGFuIGltcGxlbWVudGluZyB1c2luZyBbaW50MzJdIGFyaXRobWV0aWMuICopXG4gIGxldCBtYXNrID0gMHhmZmZmX2ZmZmZMIGluXG4gIGZ1biBbQGlubGluZV0geCAtPiBpbnQ2NF9wb3Bjb3VudCAoQ2FtbC5JbnQ2NC5sb2dhbmQgKENhbWwuSW50NjQub2ZfaW50MzIgeCkgbWFzaylcbjs7XG5cbmxldCBuYXRpdmVpbnRfcG9wY291bnQgPVxuICBtYXRjaCBDYW1sLk5hdGl2ZWludC5zaXplIHdpdGhcbiAgfCAzMiAtPiBmdW4gW0BpbmxpbmVdIHggLT4gaW50MzJfcG9wY291bnQgKENhbWwuTmF0aXZlaW50LnRvX2ludDMyIHgpXG4gIHwgNjQgLT4gZnVuIFtAaW5saW5lXSB4IC0+IGludDY0X3BvcGNvdW50IChDYW1sLkludDY0Lm9mX25hdGl2ZWludCB4KVxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG47O1xuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIFNpZ24wXG5pbmNsdWRlIElkZW50aWZpYWJsZS5NYWtlIChTaWduMClcblxuKCogT3BlbiBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbnMgc29cbiAgIHRoZXkgZG8gbm90IHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9uc1xuICAgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCB0b19mbG9hdCA9IGZ1bmN0aW9uXG4gIHwgTmVnIC0+IC0xLlxuICB8IFplcm8gLT4gMC5cbiAgfCBQb3MgLT4gMS5cbjs7XG5cbmxldCBmbGlwID0gZnVuY3Rpb25cbiAgfCBOZWcgLT4gUG9zXG4gIHwgWmVybyAtPiBaZXJvXG4gIHwgUG9zIC0+IE5lZ1xuOztcblxubGV0ICggKiApIHQgdCcgPSBvZl9pbnQgKHRvX2ludCB0ICogdG9faW50IHQnKVxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhdCB0aGUgZW5kLCBhZnRlciBhbnlcbiAgIGZ1bmN0b3IgYXBwbGljYXRpb25zIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvXG4gICB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IHRoaXNcbiAgIG1vZHVsZS4gKilcbmluY2x1ZGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgSW50X2ludGZcbmluY2x1ZGUgSW50MFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnQgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2ludFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfaW50IGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChpbnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfaW50IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGludF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGNvbXBhcmUgeCB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5jb21wYXJlIHggeVxuXG4gIGxldCBvZl9zdHJpbmcgcyA9XG4gICAgdHJ5IG9mX3N0cmluZyBzIHdpdGhcbiAgICB8IF8gLT4gUHJpbnRmLmZhaWx3aXRoZiBcIkludC5vZl9zdHJpbmc6ICVTXCIgcyAoKVxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbmVuZFxuXG5sZXQgbnVtX2JpdHMgPSBJbnRfY29udmVyc2lvbnMubnVtX2JpdHNfaW50XG5sZXQgZmxvYXRfbG93ZXJfYm91bmQgPSBGbG9hdDAubG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X3VwcGVyX2JvdW5kID0gRmxvYXQwLnVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCB0b19mbG9hdCA9IENhbWwuZmxvYXRfb2ZfaW50XG5sZXQgb2ZfZmxvYXRfdW5jaGVja2VkID0gQ2FtbC5pbnRfb2ZfZmxvYXRcblxubGV0IG9mX2Zsb2F0IGYgPVxuICBpZiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIGYgZmxvYXRfbG93ZXJfYm91bmRcbiAgJiYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSBmIGZsb2F0X3VwcGVyX2JvdW5kXG4gIHRoZW4gQ2FtbC5pbnRfb2ZfZmxvYXQgZlxuICBlbHNlXG4gICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgXCJJbnQub2ZfZmxvYXQ6IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCBmKVxuICAgICAgKClcbjs7XG5cbmxldCB6ZXJvID0gMFxubGV0IG9uZSA9IDFcbmxldCBtaW51c19vbmUgPSAtMVxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbm1vZHVsZSBDb252ID0gSW50X2NvbnZlcnNpb25zXG5pbmNsdWRlIENvbnYuTWFrZSAoVClcblxuaW5jbHVkZSBDb252Lk1ha2VfaGV4IChzdHJ1Y3RcbiAgICBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICAgIHR5cGUgdCA9IGludCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKGNvbXBhcmVfaW50IDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIGhhc2hfZm9sZF9pbnRcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gaGFzaF9pbnQgaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gICAgbGV0IG5lZyA9ICggfi0gKVxuICAgIGxldCAoIDwgKSA9ICggPCApXG4gICAgbGV0IHRvX3N0cmluZyBpID0gUHJpbnRmLnNwcmludGYgXCIleFwiIGlcbiAgICBsZXQgb2Zfc3RyaW5nIHMgPSBDYW1sLlNjYW5mLnNzY2FuZiBzIFwiJXhcIiBGbi5pZFxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQuSGV4XCJcbiAgZW5kKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnRcIlxuICBlbmQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvXG4gICB0aGV5IGRvIG5vdCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnNcbiAgIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmV4dGVybmFsIHRvX2ludDMyX3RydW5jIDogdCAtPiBpbnQzMiA9IFwiJWludDMyX29mX2ludFwiXG5leHRlcm5hbCBvZl9pbnQzMl90cnVuYyA6IGludDMyIC0+IHQgPSBcIiVpbnQzMl90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfaW50NjRfdHJ1bmMgOiBpbnQ2NCAtPiB0ID0gXCIlaW50NjRfdG9faW50XCJcbmV4dGVybmFsIG9mX25hdGl2ZWludF90cnVuYyA6IG5hdGl2ZWludCAtPiB0ID0gXCIlbmF0aXZlaW50X3RvX2ludFwiXG5cbmxldCBwcmVkIGkgPSBpIC0gMVxubGV0IHN1Y2MgaSA9IGkgKyAxXG5sZXQgdG9faW50IGkgPSBpXG5sZXQgdG9faW50X2V4biA9IHRvX2ludFxubGV0IG9mX2ludCBpID0gaVxubGV0IG9mX2ludF9leG4gPSBvZl9pbnRcbmxldCBtYXhfdmFsdWUgPSBDYW1sLm1heF9pbnRcbmxldCBtaW5fdmFsdWUgPSBDYW1sLm1pbl9pbnRcbmxldCBtYXhfdmFsdWVfMzBfYml0cyA9IDB4M0ZGRl9GRkZGXG5sZXQgb2ZfaW50MzIgPSBDb252LmludDMyX3RvX2ludFxubGV0IG9mX2ludDMyX2V4biA9IENvbnYuaW50MzJfdG9faW50X2V4blxubGV0IHRvX2ludDMyID0gQ29udi5pbnRfdG9faW50MzJcbmxldCB0b19pbnQzMl9leG4gPSBDb252LmludF90b19pbnQzMl9leG5cbmxldCBvZl9pbnQ2NCA9IENvbnYuaW50NjRfdG9faW50XG5sZXQgb2ZfaW50NjRfZXhuID0gQ29udi5pbnQ2NF90b19pbnRfZXhuXG5sZXQgdG9faW50NjQgPSBDb252LmludF90b19pbnQ2NFxubGV0IG9mX25hdGl2ZWludCA9IENvbnYubmF0aXZlaW50X3RvX2ludFxubGV0IG9mX25hdGl2ZWludF9leG4gPSBDb252Lm5hdGl2ZWludF90b19pbnRfZXhuXG5sZXQgdG9fbmF0aXZlaW50ID0gQ29udi5pbnRfdG9fbmF0aXZlaW50XG5sZXQgdG9fbmF0aXZlaW50X2V4biA9IHRvX25hdGl2ZWludFxubGV0IGFicyB4ID0gYWJzIHhcblxuKCogbm90ZSB0aGF0IHJlbSBpcyBub3Qgc2FtZSBhcyAlICopXG5sZXQgcmVtIGEgYiA9IGEgbW9kIGJcbmxldCBpbmNyID0gQ2FtbC5pbmNyXG5sZXQgZGVjciA9IENhbWwuZGVjclxubGV0IHNoaWZ0X3JpZ2h0IGEgYiA9IGEgYXNyIGJcbmxldCBzaGlmdF9yaWdodF9sb2dpY2FsIGEgYiA9IGEgbHNyIGJcbmxldCBzaGlmdF9sZWZ0IGEgYiA9IGEgbHNsIGJcbmxldCBiaXRfbm90IGEgPSBsbm90IGFcbmxldCBiaXRfb3IgYSBiID0gYSBsb3IgYlxubGV0IGJpdF9hbmQgYSBiID0gYSBsYW5kIGJcbmxldCBiaXRfeG9yIGEgYiA9IGEgbHhvciBiXG5sZXQgcG93ID0gSW50X21hdGguUHJpdmF0ZS5pbnRfcG93XG5sZXQgKCAqKiApIGIgZSA9IHBvdyBiIGVcblxubW9kdWxlIFBvdzIgPSBzdHJ1Y3RcbiAgb3BlbiEgSW1wb3J0XG5cbiAgbGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbiAgbGV0IG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKSA9XG4gICAgUHJpbnRmLmludmFsaWRfYXJnZiBcImFyZ3VtZW50IG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmVcIiAoKVxuICA7O1xuXG5cbiAgKCoqIFwiY2VpbGluZyBwb3dlciBvZiAyXCIgLSBMZWFzdCBwb3dlciBvZiAyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgY2VpbF9wb3cyIHggPVxuICAgIGlmIHggPD0gMCB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IHggLSAxIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICAoKiBUaGUgbmV4dCBsaW5lIGlzIHN1cGVyZmx1b3VzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXRcbiAgICAgICBhbnl3YXkgdGhhbiB0byBicmFuY2ggKilcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICB4ICsgMVxuICA7O1xuXG4gICgqKiBcImZsb29yIHBvd2VyIG9mIDJcIiAtIExhcmdlc3QgcG93ZXIgb2YgMiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGZsb29yX3BvdzIgeCA9XG4gICAgaWYgeCA8PSAwIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgKCogVGhlIG5leHQgbGluZSBpcyBzdXBlcmZsdW91cyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgYnV0IGl0J3MgZmFzdGVyIHRvIGRvIGl0XG4gICAgICAgYW55d2F5IHRoYW4gdG8gYnJhbmNoICopXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgeCAtICh4IGxzciAxKVxuICA7O1xuXG4gIGxldCBpc19wb3cyIHggPVxuICAgIGlmIHggPD0gMCB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICB4IGxhbmQgKHggLSAxKSA9IDBcbiAgOztcblxuICAoKiBDIHN0dWJzIGZvciBpbnQgY2x6IGFuZCBjdHogdG8gdXNlIHRoZSBDTFovQlNSL0NUWi9CU0YgaW5zdHJ1Y3Rpb24gd2hlcmUgcG9zc2libGUgKilcbiAgZXh0ZXJuYWwgY2x6XG4gICAgOiAgKCogTm90ZSB0aGF0IHdlIHBhc3MgdGhlIHRhZ2dlZCBpbnQgaGVyZS4gU2VlIGludF9tYXRoX3N0dWJzLmMgZm9yIGRldGFpbHMgb24gd2h5XG4gICAgICAgICAgdGhpcyBpcyBjb3JyZWN0LiAqKVxuICAgIGludFxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnRfY2x6XCIgXCJCYXNlX2ludF9tYXRoX2ludF9jbHpfdW50YWdnZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGN0elxuICAgIDogIChpbnRbQHVudGFnZ2VkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50X2N0elwiIFwiQmFzZV9pbnRfbWF0aF9pbnRfY3R6X3VudGFnZ2VkXCJcbiAgW0BAbm9hbGxvY11cblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBmbG9vcl9sb2cyIGkgPVxuICAgIGlmIGkgPD0gMFxuICAgIHRoZW4gcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0ludC5mbG9vcl9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQgaSBdKTtcbiAgICBudW1fYml0cyAtIDEgLSBjbHogaVxuICA7O1xuXG4gIGxldCBjZWlsX2xvZzIgaSA9XG4gICAgaWYgaSA8PSAwXG4gICAgdGhlbiByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSW50LmNlaWxfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50IGkgXSk7XG4gICAgaWYgaSA9IDEgdGhlbiAwIGVsc2UgbnVtX2JpdHMgLSBjbHogKGkgLSAxKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgUG93MlxuXG5sZXQgc2lnbiA9IFNpZ24ub2ZfaW50XG5sZXQgcG9wY291bnQgPSBQb3Bjb3VudC5pbnRfcG9wY291bnRcblxubW9kdWxlIFByZV9PID0gc3RydWN0XG4gIGV4dGVybmFsICggKyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuICBleHRlcm5hbCAoIC0gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlc3ViaW50XCJcbiAgZXh0ZXJuYWwgKCAqICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG4gIGV4dGVybmFsICggLyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuICBleHRlcm5hbCAoIH4tICkgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcblxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IGFicyA9IGFic1xuXG4gIGV4dGVybmFsIG5lZyA6IHQgLT4gdCA9IFwiJW5lZ2ludFwiXG5cbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnRfZXhuID0gb2ZfaW50X2V4blxuZW5kXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGluY2x1ZGUgUHJlX09cblxuICBtb2R1bGUgRiA9IEludF9tYXRoLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgaW5jbHVkZSBQcmVfT1xuXG4gICAgICBsZXQgcmVtID0gcmVtXG4gICAgICBsZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxuICAgICAgbGV0IG9mX2Zsb2F0ID0gb2ZfZmxvYXRcbiAgICAgIGxldCBvZl9zdHJpbmcgPSBULm9mX3N0cmluZ1xuICAgICAgbGV0IHRvX3N0cmluZyA9IFQudG9fc3RyaW5nXG4gICAgZW5kKVxuXG4gIGluY2x1ZGUgRlxuXG4gIGV4dGVybmFsIGJzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5cbiAgKCogVGhlc2UgaW5saW5lZCB2ZXJzaW9ucyBvZiAoJSksICgvJSksIGFuZCAoLy8pIHBlcmZvcm0gYmV0dGVyIHRoYW4gdGhlaXIgZnVuY3Rvcml6ZWRcbiAgICAgY291bnRlcnBhcnRzIGluIFtGXSAoc2VlIGJlbmNobWFya3MgYmVsb3cpLlxuXG4gICAgIFRoZSByZWFzb24gdGhlc2UgZnVuY3Rpb25zIGFyZSBpbmxpbmVkIGluIFtJbnRdIGJ1dCBub3QgaW4gYW55IG9mIHRoZSBvdGhlciBpbnRlZ2VyXG4gICAgIG1vZHVsZXMgaXMgdGhhdCB0aGV5IGV4aXN0ZWQgaW4gW0ludF0gYW5kIFtJbnRdIGFsb25lIHByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2ZcbiAgICAgdGhlIFtJbnRfbWF0aC5NYWtlXSBmdW5jdG9yLCBhbmQgd2UgZGlkbid0IHdhbnQgdG8gZGVncmFkZSB0aGVpciBwZXJmb3JtYW5jZS5cblxuICAgICBXZSB3b24ndCBwcmUtZW1wdGl2ZWx5IGRvIHRoZSBzYW1lIGZvciBuZXcgZnVuY3Rpb25zLCB1bmxlc3Mgc29tZW9uZSBjYXJlcywgb24gYSBjYXNlXG4gICAgIGJ5IGNhc2UgZmFzaGlvbi4gICopXG5cbiAgbGV0ICggJSApIHggeSA9XG4gICAgaWYgeSA8PSB6ZXJvXG4gICAgdGhlblxuICAgICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgICBcIiVzICUlICVzIGluIGNvcmVfaW50Lm1sOiBtb2R1bHVzIHNob3VsZCBiZSBwb3NpdGl2ZVwiXG4gICAgICAgICh0b19zdHJpbmcgeClcbiAgICAgICAgKHRvX3N0cmluZyB5KVxuICAgICAgICAoKTtcbiAgICBsZXQgcnZhbCA9IHJlbSB4IHkgaW5cbiAgICBpZiBydmFsIDwgemVybyB0aGVuIHJ2YWwgKyB5IGVsc2UgcnZhbFxuICA7O1xuXG4gIGxldCAoIC8lICkgeCB5ID1cbiAgICBpZiB5IDw9IHplcm9cbiAgICB0aGVuXG4gICAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICAgIFwiJXMgLyUlICVzIGluIGNvcmVfaW50Lm1sOiBkaXZpc29yIHNob3VsZCBiZSBwb3NpdGl2ZVwiXG4gICAgICAgICh0b19zdHJpbmcgeClcbiAgICAgICAgKHRvX3N0cmluZyB5KVxuICAgICAgICAoKTtcbiAgICBpZiB4IDwgemVybyB0aGVuICgoeCArIG9uZSkgLyB5KSAtIG9uZSBlbHNlIHggLyB5XG4gIDs7XG5cbiAgbGV0ICggLy8gKSB4IHkgPSB0b19mbG9hdCB4IC8uIHRvX2Zsb2F0IHlcblxuICBleHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbiAgZXh0ZXJuYWwgKCBsb3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlb3JpbnRcIlxuICBleHRlcm5hbCAoIGx4b3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcblxuICBsZXQgbG5vdCA9IGxub3RcblxuICBleHRlcm5hbCAoIGxzbCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuICBleHRlcm5hbCAoIGxzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc3JpbnRcIlxuICBleHRlcm5hbCAoIGFzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuZW5kXG5cbmluY2x1ZGUgT1xuXG4oKiBbSW50XSBhbmQgW0ludC5PXSBhZ3JlZSB2YWx1ZS13aXNlICopXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIG1vZHVsZSBPX0YgPSBPLkZcbmVuZFxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3JcbiAgIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zXG4gICBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcblxubGV0IGZhaWx3aXRoZiA9IFByaW50Zi5mYWlsd2l0aGZcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBVY2hhcjBcblxuICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuVWNoYXJcIlxuICBsZXQgaGFzaF9mb2xkX3Qgc3RhdGUgdCA9IEhhc2guZm9sZF9pbnQgc3RhdGUgKHRvX2ludCB0KVxuICBsZXQgaGFzaCB0ID0gSGFzaC5ydW4gaGFzaF9mb2xkX3QgdFxuICBsZXQgdG9fc3RyaW5nIHQgPSBQcmludGYuc3ByaW50ZiBcIlUrJTA0WFwiICh0b19pbnQgdClcblxuICAoKiBEbyBub3QgYWN0dWFsbHkgZXhwb3J0IHRoaXMuIFNlZSBkaXNjdXNzaW9uIGluIHRoZSAubWxpICopXG5cbiAgbGV0IHNleHBfb2ZfdCB0ID0gU2V4cC5BdG9tICh0b19zdHJpbmcgdClcblxuICBsZXQgdF9vZl9zZXhwIHNleHAgPVxuICAgIG1hdGNoIHNleHAgd2l0aFxuICAgIHwgU2V4cC5MaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcIlVjaGFyLnRfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG4gICAgfCBTZXhwLkF0b20gcyAtPlxuICAgICAgKHRyeSBDYW1sLlNjYW5mLnNzY2FuZiBzIFwiVSslWFwiIChmdW4gaSAtPiBVY2hhcjAub2ZfaW50IGkpIHdpdGhcbiAgICAgICB8IF8gLT4gb2Zfc2V4cF9lcnJvciBcIlVjaGFyLnRfb2Zfc2V4cDogYXRvbSBvZiB0aGUgZm9ybSBVK1hYWFggbmVlZGVkXCIgc2V4cClcbiAgOztcblxuICBsZXQgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50ID1cbiAgICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIFN0cmluZy50X3NleHBfZ3JhbW1hclxuICA7O1xuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoVClcbmluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlIChUKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBVY2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBpbnRfaXNfc2NhbGFyID0gaXNfdmFsaWRcblxubGV0IHN1Y2NfZXhuIGMgPVxuICB0cnkgVWNoYXIwLnN1Y2MgYyB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBtc2cgLT4gZmFpbHdpdGhmIFwiVWNoYXIuc3VjY19leG46ICVzXCIgbXNnICgpXG47O1xuXG5sZXQgc3VjYyBjID1cbiAgdHJ5IFNvbWUgKFVjaGFyMC5zdWNjIGMpIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IF8gLT4gTm9uZVxuOztcblxubGV0IHByZWRfZXhuIGMgPVxuICB0cnkgVWNoYXIwLnByZWQgYyB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBtc2cgLT4gZmFpbHdpdGhmIFwiVWNoYXIucHJlZF9leG46ICVzXCIgbXNnICgpXG47O1xuXG5sZXQgcHJlZCBjID1cbiAgdHJ5IFNvbWUgKFVjaGFyMC5wcmVkIGMpIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IF8gLT4gTm9uZVxuOztcblxubGV0IG9mX3NjYWxhciBpID0gaWYgaW50X2lzX3NjYWxhciBpIHRoZW4gU29tZSAodW5zYWZlX29mX2ludCBpKSBlbHNlIE5vbmVcblxubGV0IG9mX3NjYWxhcl9leG4gaSA9XG4gIGlmIGludF9pc19zY2FsYXIgaVxuICB0aGVuIHVuc2FmZV9vZl9pbnQgaVxuICBlbHNlIGZhaWx3aXRoZiBcIlVjaGFyLm9mX2ludF9leG4gZ290IGEgaW52YWxpZCBVbmljb2RlIHNjYWxhciB2YWx1ZTogJTA0WFwiIGkgKClcbjs7XG5cbmxldCB0b19zY2FsYXIgdCA9IFVjaGFyMC50b19pbnQgdFxubGV0IHRvX2NoYXIgYyA9IGlmIGlzX2NoYXIgYyB0aGVuIFNvbWUgKHVuc2FmZV90b19jaGFyIGMpIGVsc2UgTm9uZVxuXG5sZXQgdG9fY2hhcl9leG4gYyA9XG4gIGlmIGlzX2NoYXIgY1xuICB0aGVuIHVuc2FmZV90b19jaGFyIGNcbiAgZWxzZSBmYWlsd2l0aGYgXCJVY2hhci50b19jaGFyX2V4biBnb3QgYSBub24gbGF0aW4tMSBjaGFyYWN0ZXI6IFUrJTA0WFwiICh0b19pbnQgYykgKClcbjs7XG5cbmxldCB1dGY4X2J5dGVfbGVuZ3RoIHVjaGFyID1cbiAgbGV0IGNvZGVwb2ludCA9IHRvX3NjYWxhciB1Y2hhciBpblxuICBpZiBJbnQuKCA8ICkgY29kZXBvaW50IDB4ODBcbiAgdGhlbiAxXG4gIGVsc2UgaWYgSW50LiggPCApIGNvZGVwb2ludCAweDgwMFxuICB0aGVuIDJcbiAgZWxzZSBpZiBJbnQuKCA8ICkgY29kZXBvaW50IDB4MTAwMDBcbiAgdGhlbiAzXG4gIGVsc2UgNFxuOztcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIFVjaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgKCdhLCAnYikgdCA9IFQgOiAoJ2EsICdhKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG5sZXQgc2V4cF9vZl90IDpcbiAgJ2EgJ2IuXG4gICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgnYiAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgnYSwgJ2IpIHQgLT4gU2V4cGxpYjAuU2V4cC50XG4gID1cbiAgZnVuICh0eXBlIGFfXzAwM18gYl9fMDA0XylcbiAgICAgIDogICgoYV9fMDAzXyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IChiX18wMDRfIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgICAtPiAoYV9fMDAzXywgYl9fMDA0XykgdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgZnVuIF9vZl9hX18wMDFfIF9vZl9iX18wMDJfIFQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVFwiXG47O1xuXG5bQEBAZW5kXVxuXG50eXBlICgnYSwgJ2IpIGVxdWFsID0gKCdhLCAnYikgdFxuXG5sZXQgcmVmbCA9IFRcbmxldCBzeW0gKHR5cGUgYSBiKSAoVCA6IChhLCBiKSB0KSA6IChiLCBhKSB0ID0gVFxubGV0IHRyYW5zICh0eXBlIGEgYiBjKSAoVCA6IChhLCBiKSB0KSAoVCA6IChiLCBjKSB0KSA6IChhLCBjKSB0ID0gVFxubGV0IGNvbnYgKHR5cGUgYSBiKSAoVCA6IChhLCBiKSB0KSAoYSA6IGEpIDogYiA9IGFcblxubW9kdWxlIExpZnQgKFggOiBzaWdcbiAgICB0eXBlICdhIHRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbGV0IGxpZnQgKHR5cGUgYSBiKSAoVCA6IChhLCBiKSB0KSA6IChhIFgudCwgYiBYLnQpIHQgPSBUXG5lbmRcblxubW9kdWxlIExpZnQyIChYIDogc2lnXG4gICAgdHlwZSAoJ2ExLCAnYTIpIHRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbGV0IGxpZnQgKHR5cGUgYTEgYjEgYTIgYjIpIChUIDogKGExLCBiMSkgdCkgKFQgOiAoYTIsIGIyKSB0KVxuICAgIDogKChhMSwgYTIpIFgudCwgKGIxLCBiMikgWC50KSB0XG4gICAgPVxuICAgIFRcbiAgOztcbmVuZFxuXG5tb2R1bGUgTGlmdDMgKFggOiBzaWdcbiAgICB0eXBlICgnYTEsICdhMiwgJ2EzKSB0XG4gIGVuZCkgPVxuc3RydWN0XG4gIGxldCBsaWZ0ICh0eXBlIGExIGIxIGEyIGIyIGEzIGIzKSAoVCA6IChhMSwgYjEpIHQpIChUIDogKGEyLCBiMikgdCkgKFQgOiAoYTMsIGIzKSB0KVxuICAgIDogKChhMSwgYTIsIGEzKSBYLnQsIChiMSwgYjIsIGIzKSBYLnQpIHRcbiAgICA9XG4gICAgVFxuICA7O1xuZW5kXG5cbmxldCBkZXR1cGxlMiAodHlwZSBhMSBhMiBiMSBiMikgKFQgOiAoYTEgKiBhMiwgYjEgKiBiMikgdCkgOiAoYTEsIGIxKSB0ICogKGEyLCBiMikgdCA9XG4gIFQsIFRcbjs7XG5cbmxldCB0dXBsZTIgKHR5cGUgYTEgYTIgYjEgYjIpIChUIDogKGExLCBiMSkgdCkgKFQgOiAoYTIsIGIyKSB0KSA6IChhMSAqIGEyLCBiMSAqIGIyKSB0ID0gVFxuXG5tb2R1bGUgdHlwZSBJbmplY3RpdmUgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIHN0cmlwIDogKCdhIHQsICdiIHQpIGVxdWFsIC0+ICgnYSwgJ2IpIGVxdWFsXG5lbmRcblxubW9kdWxlIHR5cGUgSW5qZWN0aXZlMiA9IHNpZ1xuICB0eXBlICgnYTEsICdhMikgdFxuXG4gIHZhbCBzdHJpcCA6ICgoJ2ExLCAnYTIpIHQsICgnYjEsICdiMikgdCkgZXF1YWwgLT4gKCdhMSwgJ2IxKSBlcXVhbCAqICgnYTIsICdiMikgZXF1YWxcbmVuZFxuXG5tb2R1bGUgQ29tcG9zaXRpb25fcHJlc2VydmVzX2luamVjdGl2aXR5IChNMSA6IEluamVjdGl2ZSkgKE0yIDogSW5qZWN0aXZlKSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBNMS50IE0yLnRcblxuICBsZXQgc3RyaXAgZSA9IE0xLnN0cmlwIChNMi5zdHJpcCBlKVxuZW5kXG5cbm1vZHVsZSBJZCA9IHN0cnVjdFxuICBtb2R1bGUgVWlkID0gSW50XG5cbiAgbW9kdWxlIFdpdG5lc3MgPSBzdHJ1Y3RcbiAgICBtb2R1bGUgS2V5ID0gc3RydWN0XG4gICAgICB0eXBlIF8gdCA9IC4uXG4gICAgICB0eXBlIHR5cGVfd2l0bmVzc19pbnQgPSBbIGB0eXBlX3dpdG5lc3Mgb2YgaW50IF0gW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICAgIGxldCBzZXhwX29mX3R5cGVfd2l0bmVzc19pbnQgPVxuICAgICAgICAoZnVuIChgdHlwZV93aXRuZXNzIHZfXzAwNV8pIC0+XG4gICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInR5cGVfd2l0bmVzc1wiOyBzZXhwX29mX2ludCB2X18wMDVfIF1cbiAgICAgICAgICAgOiB0eXBlX3dpdG5lc3NfaW50IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIDs7XG5cbiAgICAgIFtAQEBlbmRdXG5cbiAgICAgIGxldCBzZXhwX29mX3QgX3NleHBfb2ZfYSB0ID1cbiAgICAgICAgYHR5cGVfd2l0bmVzc1xuICAgICAgICAgIChDYW1sLk9iai5FeHRlbnNpb25fY29uc3RydWN0b3IuaWQgKENhbWwuT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5vZl92YWwgdCkpXG4gICAgICAgIHw+IHNleHBfb2ZfdHlwZV93aXRuZXNzX2ludFxuICAgICAgOztcbiAgICBlbmRcblxuICAgIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICAgIHR5cGUgdFxuICAgICAgdHlwZSBfIEtleS50ICs9IEtleSA6IHQgS2V5LnRcbiAgICBlbmRcblxuICAgIHR5cGUgJ2EgdCA9IChtb2R1bGUgUyB3aXRoIHR5cGUgdCA9ICdhKVxuXG4gICAgbGV0IHNleHBfb2ZfdCAodHlwZSBhKSBzZXhwX29mX2EgKG1vZHVsZSBNIDogUyB3aXRoIHR5cGUgdCA9IGEpID1cbiAgICAgIE0uS2V5IHw+IEtleS5zZXhwX29mX3Qgc2V4cF9vZl9hXG4gICAgOztcblxuICAgIGxldCBjcmVhdGUgKHR5cGUgdCkgKCkgPVxuICAgICAgbGV0IG1vZHVsZSBNID0gc3RydWN0XG4gICAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG4gICAgICAgIHR5cGUgXyBLZXkudCArPSBLZXkgOiB0IEtleS50XG4gICAgICBlbmRcbiAgICAgIGluXG4gICAgICAobW9kdWxlIE0gOiBTIHdpdGggdHlwZSB0ID0gdClcbiAgICA7O1xuXG4gICAgbGV0IHVpZCAodHlwZSBhKSAobW9kdWxlIE0gOiBTIHdpdGggdHlwZSB0ID0gYSkgPVxuICAgICAgQ2FtbC5PYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLmlkIChDYW1sLk9iai5FeHRlbnNpb25fY29uc3RydWN0b3Iub2ZfdmFsIE0uS2V5KVxuICAgIDs7XG5cbiAgICAoKiBXZSB3YW50IGEgY29uc3RhbnQgYWxsb2NhdGVkIG9uY2UgdGhhdCBbc2FtZV0gY2FuIHJldHVybiB3aGVuZXZlciBpdCBnZXRzIHRoZSBzYW1lXG4gICAgICAgd2l0bmVzc2VzLiAgSWYgd2Ugd3JpdGUgdGhlIGNvbnN0YW50IGluc2lkZSB0aGUgYm9keSBvZiBbc2FtZV0sIHRoZSBuYXRpdmUtY29kZVxuICAgICAgIGNvbXBpbGVyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGFuZCBsaWZ0IGl0IG91dC4gIEJ1dCBmb3IgY2xhcml0eSBhbmQgcm9idXN0bmVzcyxcbiAgICAgICB3ZSBkbyBpdCBvdXJzZWx2ZXMuICopXG4gICAgbGV0IHNvbWVfdCA9IFNvbWUgVFxuXG4gICAgbGV0IHNhbWUgKHR5cGUgYSBiKSAoYSA6IGEgdCkgKGIgOiBiIHQpIDogKGEsIGIpIGVxdWFsIG9wdGlvbiA9XG4gICAgICBsZXQgbW9kdWxlIEEgPSAodmFsIGEgOiBTIHdpdGggdHlwZSB0ID0gYSkgaW5cbiAgICAgIGxldCBtb2R1bGUgQiA9ICh2YWwgYiA6IFMgd2l0aCB0eXBlIHQgPSBiKSBpblxuICAgICAgbWF0Y2ggQS5LZXkgd2l0aFxuICAgICAgfCBCLktleSAtPiBzb21lX3RcbiAgICAgIHwgXyAtPiBOb25lXG4gICAgOztcbiAgZW5kXG5cblxuICB0eXBlICdhIHQgPVxuICAgIHsgd2l0bmVzcyA6ICdhIFdpdG5lc3MudFxuICAgIDsgbmFtZSA6IHN0cmluZ1xuICAgIDsgdG9fc2V4cCA6ICdhIC0+IFNleHAudFxuICAgIH1cblxuICBsZXQgc2V4cF9vZl90IF8geyB3aXRuZXNzOyBuYW1lOyB0b19zZXhwIH0gOiBTZXhwLnQgPVxuICAgIGlmIGFtX3Rlc3RpbmdcbiAgICB0aGVuIEF0b20gbmFtZVxuICAgIGVsc2VcbiAgICAgIExpc3RcbiAgICAgICAgWyBMaXN0IFsgQXRvbSBcIm5hbWVcIjsgQXRvbSBuYW1lIF1cbiAgICAgICAgOyBMaXN0IFsgQXRvbSBcIndpdG5lc3NcIjsgd2l0bmVzcyB8PiBXaXRuZXNzLnNleHBfb2ZfdCB0b19zZXhwIF1cbiAgICAgICAgXVxuICA7O1xuXG4gIGxldCB0b19zZXhwIHQgPSB0LnRvX3NleHBcbiAgbGV0IG5hbWUgdCA9IHQubmFtZVxuICBsZXQgY3JlYXRlIH5uYW1lIHRvX3NleHAgPSB7IHdpdG5lc3MgPSBXaXRuZXNzLmNyZWF0ZSAoKTsgbmFtZTsgdG9fc2V4cCB9XG4gIGxldCB1aWQgdCA9IFdpdG5lc3MudWlkIHQud2l0bmVzc1xuICBsZXQgaGFzaCB0ID0gdWlkIHRcbiAgbGV0IGhhc2hfZm9sZF90IHMgdCA9IGhhc2hfZm9sZF9pbnQgcyAodWlkIHQpXG4gIGxldCBzYW1lX3dpdG5lc3MgdDEgdDIgPSBXaXRuZXNzLnNhbWUgdDEud2l0bmVzcyB0Mi53aXRuZXNzXG4gIGxldCBzYW1lIHQxIHQyID0gT3B0aW9uLmlzX3NvbWUgKHNhbWVfd2l0bmVzcyB0MSB0MilcblxuICBsZXQgc2FtZV93aXRuZXNzX2V4biB0MSB0MiA9XG4gICAgbWF0Y2ggc2FtZV93aXRuZXNzIHQxIHQyIHdpdGhcbiAgICB8IFNvbWUgdyAtPiB3XG4gICAgfCBOb25lIC0+XG4gICAgICBFcnJvci5yYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJUeXBlX2VxdWFsLklkLnNhbWVfd2l0bmVzc19leG4gZ290IGRpZmZlcmVudCBpZHNcIlxuICAgICAgICAgICBbICggXCJcIlxuICAgICAgICAgICAgICwgc2V4cF9vZl9wYWlyIChzZXhwX29mX3Qgc2V4cF9vZl9vcGFxdWUpIChzZXhwX29mX3Qgc2V4cF9vZl9vcGFxdWUpICh0MSwgdDIpXG4gICAgICAgICAgICAgKVxuICAgICAgICAgICBdKVxuICA7O1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxuKCoqIFsnYSBDaGVhcF9vcHRpb24udF0gaXMgbGlrZSBbJ2Egb3B0aW9uXSwgYnV0IGl0IGRvZXNuJ3QgYm94IFtzb21lIF9dIHZhbHVlcy5cblxuICAgIFRoZXJlIGFyZSBzZXZlcmFsIHRoaW5ncyB0aGF0IGFyZSB1bnNhZmUgYWJvdXQgaXQ6XG5cbiAgICAtIFtmbG9hdCB0IGFycmF5XSAob3IgYW55IGFycmF5LWJhY2tlZCBjb250YWluZXIpIGlzIG5vdCBtZW1vcnktc2FmZVxuICAgICAgYmVjYXVzZSBmbG9hdCBhcnJheSBvcHRpbWl6YXRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdW5ib3hlZCBvcHRpb25cbiAgICAgIG9wdGltaXphdGlvbi4gWW91IGhhdmUgdG8gdXNlIFtVbmlmb3JtX2FycmF5LnRdIGluc3RlYWQgb2YgW2FycmF5XS5cblxuICAgIC0gTmVzdGVkIG9wdGlvbnMgKFsnYSB0IHRdKSBkb24ndCB3b3JrLiBUaGV5IGFyZSBiZWxpZXZlZCB0byBiZVxuICAgICAgbWVtb3J5LXNhZmUsIGJ1dCBub3QgcGFyYW1ldHJpYy5cblxuICAgIC0gQSByZWNvcmQgd2l0aCBbZmxvYXQgdF1zIGluIGl0IHNob3VsZCBiZSBzYWZlLCBidXQgaXQncyBvbmx5IFt0XSBiZWluZ1xuICAgICAgYWJzdHJhY3QgdGhhdCBnaXZlcyB5b3Ugc2FmZXR5LiBJZiB0aGUgY29tcGlsZXIgd2FzIHNtYXJ0IGVub3VnaCB0byBwZWVrXG4gICAgICB0aHJvdWdoIHRoZSBtb2R1bGUgc2lnbmF0dXJlIHRoZW4gaXQgY291bGQgZGVjaWRlIHRvIGNvbnN0cnVjdCBhIGZsb2F0XG4gICAgICBhcnJheSBpbnN0ZWFkLiAqKVxubW9kdWxlIENoZWFwX29wdGlvbiA9IHN0cnVjdFxuICAoKiBUaGlzIGlzIHRha2VuIGZyb20gY29yZS4gUmF0aGVyIHRoYW4gZXhwb3NlIGl0IGluIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIGJhc2UsIGp1c3RcbiAgICAga2VlcCBhIGNvcHkgYXJvdW5kIGhlcmUuICopXG4gIGxldCBwaHlzX3NhbWUgKHR5cGUgYSBiKSAoYSA6IGEpIChiIDogYikgPSBwaHlzX2VxdWFsIGEgKENhbWwuT2JqLm1hZ2ljIGIgOiBhKVxuXG4gIG1vZHVsZSBUMCA6IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIG5vbmUgOiBfIHRcbiAgICB2YWwgc29tZSA6ICdhIC0+ICdhIHRcbiAgICB2YWwgaXNfbm9uZSA6IF8gdCAtPiBib29sXG4gICAgdmFsIGlzX3NvbWUgOiBfIHQgLT4gYm9vbFxuICAgIHZhbCB2YWx1ZV9leG4gOiAnYSB0IC0+ICdhXG4gICAgdmFsIHZhbHVlX3Vuc2FmZSA6ICdhIHQgLT4gJ2FcbiAgICB2YWwgaXRlcl9zb21lIDogJ2EgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIGVuZCA9IHN0cnVjdFxuICAgIHR5cGUgKydhIHRcblxuICAgICgqIEJlaW5nIGEgcG9pbnRlciwgbm8gb25lIG91dHNpZGUgdGhpcyBtb2R1bGUgY2FuIGNvbnN0cnVjdCBhIHZhbHVlIHRoYXQgaXNcbiAgICAgICBbcGh5c19zYW1lXSBhcyB0aGlzIG9uZS5cblxuICAgICAgIEl0IHdvdWxkIGJlIHNpbXBsZXIgdG8gdXNlIHRoaXMgdmFsdWUgYXMgW25vbmVdLCBidXQgd2UgdXNlIGFuIGltbWVkaWF0ZSBpbnN0ZWFkXG4gICAgICAgYmVjYXVzZSBpdCBsZXRzIHVzIGF2b2lkIGNhbWxfbW9kaWZ5IHdoZW4gc2V0dGluZyB0byBbbm9uZV0sIG1ha2luZyBjZXJ0YWluXG4gICAgICAgYmVuY2htYXJrcyBzaWduaWZpY2FudGx5IGZhc3RlciAoZS5nLiAuLi9iZW5jaC9hcnJheV9xdWV1ZS5leGUpLlxuXG4gICAgICAgdGhpcyBjb2RlIGlzIGR1cGxpY2F0ZWQgaW4gTW9wdGlvbiwgYW5kIGlmIHdlIGZpbmQgeWV0IGFub3RoZXIgcGxhY2Ugd2hlcmUgd2Ugd2FudFxuICAgICAgIGl0IHdlIHNob3VsZCByZWNvbnNpZGVyIG1ha2luZyBpdCBzaGFyZWQuICopXG4gICAgbGV0IG5vbmVfc3Vic3RpdHV0ZSA6IF8gdCA9IENhbWwuT2JqLm9iaiAoQ2FtbC5PYmoubmV3X2Jsb2NrIENhbWwuT2JqLmFic3RyYWN0X3RhZyAxKVxuXG4gICAgbGV0IG5vbmUgOiBfIHQgPVxuICAgICAgKCogVGhlIG51bWJlciB3YXMgcHJvZHVjZWQgYnlcbiAgICAgICAgIFs8IC9kZXYvdXJhbmRvbSB0ciAtYyAtZCAnMTIzNDU2Nzg5MGFiY2RlZicgfCBoZWFkIC1jIDE2XS5cblxuICAgICAgICAgVGhlIGlkZWEgaXMgdGhhdCBhIHJhbmRvbSBudW1iZXIgd2lsbCBoYXZlIGxvd2VyIHByb2JhYmlsaXR5IHRvIGNvbGxpZGUgd2l0aFxuICAgICAgICAgYW55dGhpbmcgdGhhbiBhbnkgbnVtYmVyIHdlIGNhbiBjaG9vc2Ugb3Vyc2VsdmVzLlxuXG4gICAgICAgICBXZSBhcmUgdXNpbmcgYSBwb2x5bW9ycGhpYyB2YXJpYW50IGluc3RlYWQgb2YgYW4gaW50ZWdlciBjb25zdGFudCBiZWNhdXNlIHRoZXJlXG4gICAgICAgICBpcyBhIGNvbXBpbGVyIGJ1ZyB3aGVyZSBpdCB3cm9uZ2x5IGFzc3VtZXMgdGhhdCB0aGUgcmVzdWx0IG9mIFtpZiBfIHRoZW4gYyBlbHNlXG4gICAgICAgICB5XSBpcyBub3QgYSBwb2ludGVyIGlmIFtjXSBpcyBhbiBpbnRlZ2VyIGNvbXBpbGUtdGltZSBjb25zdGFudC4gIFRoaXMgaXMgYmVpbmdcbiAgICAgICAgIGZpeGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzU1NS4gIFRoZSBcIm1lbW9yeSBjb3JydXB0aW9uXCIgdGVzdFxuICAgICAgICAgYmVsb3cgZGVtb25zdHJhdGVzIHRoZSBpc3N1ZS4gICopXG4gICAgICBDYW1sLk9iai5tYWdpYyBgeDZlOGVlMzQ3OGUxZDc0NDlcbiAgICA7O1xuXG4gICAgbGV0IGlzX25vbmUgeCA9IHBoeXNfZXF1YWwgeCBub25lXG4gICAgbGV0IGlzX3NvbWUgeCA9IG5vdCAocGh5c19lcXVhbCB4IG5vbmUpXG5cbiAgICBsZXQgc29tZSAodHlwZSBhKSAoeCA6IGEpIDogYSB0ID1cbiAgICAgIGlmIHBoeXNfc2FtZSB4IG5vbmUgdGhlbiBub25lX3N1YnN0aXR1dGUgZWxzZSBDYW1sLk9iai5tYWdpYyB4XG4gICAgOztcblxuICAgIGxldCB2YWx1ZV91bnNhZmUgKHR5cGUgYSkgKHggOiBhIHQpIDogYSA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHggbm9uZV9zdWJzdGl0dXRlIHRoZW4gQ2FtbC5PYmoubWFnaWMgbm9uZSBlbHNlIENhbWwuT2JqLm1hZ2ljIHhcbiAgICA7O1xuXG4gICAgbGV0IHZhbHVlX2V4biB4ID1cbiAgICAgIGlmIGlzX3NvbWUgeFxuICAgICAgdGhlbiB2YWx1ZV91bnNhZmUgeFxuICAgICAgZWxzZSBmYWlsd2l0aCBcIk9wdGlvbl9hcnJheS5nZXRfc29tZV9leG46IHRoZSBlbGVtZW50IGlzIFtOb25lXVwiXG4gICAgOztcblxuICAgIGxldCBpdGVyX3NvbWUgdCB+ZiA9IGlmIGlzX3NvbWUgdCB0aGVuIGYgKHZhbHVlX3Vuc2FmZSB0KVxuICBlbmRcblxuICBtb2R1bGUgVDEgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFQwXG5cbiAgICBsZXQgb2Zfb3B0aW9uID0gZnVuY3Rpb25cbiAgICAgIHwgTm9uZSAtPiBub25lXG4gICAgICB8IFNvbWUgeCAtPiBzb21lIHhcbiAgICA7O1xuXG4gICAgbGV0W0BpbmxpbmVdIHRvX29wdGlvbiB4ID0gaWYgaXNfc29tZSB4IHRoZW4gU29tZSAodmFsdWVfdW5zYWZlIHgpIGVsc2UgTm9uZVxuICAgIGxldCB0b19zZXhwYWJsZSA9IHRvX29wdGlvblxuICAgIGxldCBvZl9zZXhwYWJsZSA9IG9mX29wdGlvblxuXG4gICAgbGV0IHRfc2V4cF9ncmFtbWFyICh0eXBlIGEpIChncmFtbWFyIDogYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICAgIDogYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICA9XG4gICAgICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChPcHRpb24udF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbiAgICA7O1xuICBlbmRcblxuICBpbmNsdWRlIFQxXG4gIGluY2x1ZGUgU2V4cGFibGUuT2Zfc2V4cGFibGUxIChPcHRpb24pIChUMSlcbmVuZFxuXG50eXBlICdhIHQgPSAnYSBDaGVhcF9vcHRpb24udCBVbmlmb3JtX2FycmF5LnQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9XG4gIGZ1biBfb2ZfYV9fMDAxXyB4X18wMDNfIC0+XG4gIFVuaWZvcm1fYXJyYXkudF9vZl9zZXhwIChDaGVhcF9vcHRpb24udF9vZl9zZXhwIF9vZl9hX18wMDFfKSB4X18wMDNfXG47O1xuXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgZnVuIF9vZl9hX18wMDRfIHhfXzAwNV8gLT5cbiAgVW5pZm9ybV9hcnJheS5zZXhwX29mX3QgKENoZWFwX29wdGlvbi5zZXhwX29mX3QgX29mX2FfXzAwNF8pIHhfXzAwNV9cbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+XG4gIFVuaWZvcm1fYXJyYXkudF9zZXhwX2dyYW1tYXIgKENoZWFwX29wdGlvbi50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyKVxuOztcblxuW0BAQGVuZF1cblxubGV0IGVtcHR5ID0gVW5pZm9ybV9hcnJheS5lbXB0eVxubGV0IGNyZWF0ZSB+bGVuID0gVW5pZm9ybV9hcnJheS5jcmVhdGUgfmxlbiBDaGVhcF9vcHRpb24ubm9uZVxubGV0IGluaXQgbiB+ZiA9IFVuaWZvcm1fYXJyYXkuaW5pdCBuIH5mOihmdW4gaSAtPiBDaGVhcF9vcHRpb24ub2Zfb3B0aW9uIChmIGkpKVxubGV0IGluaXRfc29tZSBuIH5mID0gVW5pZm9ybV9hcnJheS5pbml0IG4gfmY6KGZ1biBpIC0+IENoZWFwX29wdGlvbi5zb21lIChmIGkpKVxubGV0IGxlbmd0aCA9IFVuaWZvcm1fYXJyYXkubGVuZ3RoXG5sZXRbQGlubGluZV0gZ2V0IHQgaSA9IENoZWFwX29wdGlvbi50b19vcHRpb24gKFVuaWZvcm1fYXJyYXkuZ2V0IHQgaSlcbmxldCBnZXRfc29tZV9leG4gdCBpID0gQ2hlYXBfb3B0aW9uLnZhbHVlX2V4biAoVW5pZm9ybV9hcnJheS5nZXQgdCBpKVxubGV0IGlzX25vbmUgdCBpID0gQ2hlYXBfb3B0aW9uLmlzX25vbmUgKFVuaWZvcm1fYXJyYXkuZ2V0IHQgaSlcbmxldCBpc19zb21lIHQgaSA9IENoZWFwX29wdGlvbi5pc19zb21lIChVbmlmb3JtX2FycmF5LmdldCB0IGkpXG5sZXQgc2V0IHQgaSB4ID0gVW5pZm9ybV9hcnJheS5zZXQgdCBpIChDaGVhcF9vcHRpb24ub2Zfb3B0aW9uIHgpXG5sZXQgc2V0X3NvbWUgdCBpIHggPSBVbmlmb3JtX2FycmF5LnNldCB0IGkgKENoZWFwX29wdGlvbi5zb21lIHgpXG5sZXQgc2V0X25vbmUgdCBpID0gVW5pZm9ybV9hcnJheS5zZXQgdCBpIENoZWFwX29wdGlvbi5ub25lXG5sZXQgc3dhcCB0IGkgaiA9IFVuaWZvcm1fYXJyYXkuc3dhcCB0IGkgalxubGV0IHVuc2FmZV9nZXQgdCBpID0gQ2hlYXBfb3B0aW9uLnRvX29wdGlvbiAoVW5pZm9ybV9hcnJheS51bnNhZmVfZ2V0IHQgaSlcbmxldCB1bnNhZmVfZ2V0X3NvbWVfZXhuIHQgaSA9IENoZWFwX29wdGlvbi52YWx1ZV9leG4gKFVuaWZvcm1fYXJyYXkudW5zYWZlX2dldCB0IGkpXG5cbmxldCB1bnNhZmVfZ2V0X3NvbWVfYXNzdW1pbmdfc29tZSB0IGkgPVxuICBDaGVhcF9vcHRpb24udmFsdWVfdW5zYWZlIChVbmlmb3JtX2FycmF5LnVuc2FmZV9nZXQgdCBpKVxuOztcblxubGV0IHVuc2FmZV9pc19zb21lIHQgaSA9IENoZWFwX29wdGlvbi5pc19zb21lIChVbmlmb3JtX2FycmF5LnVuc2FmZV9nZXQgdCBpKVxubGV0IHVuc2FmZV9zZXQgdCBpIHggPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9zZXQgdCBpIChDaGVhcF9vcHRpb24ub2Zfb3B0aW9uIHgpXG5sZXQgdW5zYWZlX3NldF9zb21lIHQgaSB4ID0gVW5pZm9ybV9hcnJheS51bnNhZmVfc2V0IHQgaSAoQ2hlYXBfb3B0aW9uLnNvbWUgeClcbmxldCB1bnNhZmVfc2V0X25vbmUgdCBpID0gVW5pZm9ybV9hcnJheS51bnNhZmVfc2V0IHQgaSBDaGVhcF9vcHRpb24ubm9uZVxuXG5sZXQgY2xlYXIgdCA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICB1bnNhZmVfc2V0X25vbmUgdCBpXG4gIGRvbmVcbjs7XG5cbmxldCBpdGVyaSBpbnB1dCB+ZiA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggaW5wdXQgLSAxIGRvXG4gICAgZiBpICh1bnNhZmVfZ2V0IGlucHV0IGkpXG4gIGRvbmVcbjs7XG5cbmxldCBpdGVyIGlucHV0IH5mID0gaXRlcmkgaW5wdXQgfmY6KGZ1biAoXyA6IGludCkgeCAtPiBmIHgpXG5cbmxldCBmb2xkaSBpbnB1dCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBpdGVyaSBpbnB1dCB+ZjooZnVuIGkgZWxlbSAtPiBhY2MgOj0gZiBpICFhY2MgZWxlbSk7XG4gICFhY2Ncbjs7XG5cbmxldCBmb2xkIGlucHV0IH5pbml0IH5mID0gZm9sZGkgaW5wdXQgfmluaXQgfmY6KGZ1biAoXyA6IGludCkgYWNjIHggLT4gZiBhY2MgeClcblxuaW5jbHVkZSBJbmRleGVkX2NvbnRhaW5lci5NYWtlX2dlbiAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcbiAgICB0eXBlICdhIGVsdCA9ICdhIG9wdGlvblxuXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGZvbGRpID0gYEN1c3RvbSBmb2xkaVxuICAgIGxldCBpdGVyID0gYEN1c3RvbSBpdGVyXG4gICAgbGV0IGl0ZXJpID0gYEN1c3RvbSBpdGVyaVxuICAgIGxldCBsZW5ndGggPSBgQ3VzdG9tIGxlbmd0aFxuICBlbmQpXG5cbmxldCBtYXBpIGlucHV0IH5mID1cbiAgbGV0IG91dHB1dCA9IGNyZWF0ZSB+bGVuOihsZW5ndGggaW5wdXQpIGluXG4gIGl0ZXJpIGlucHV0IH5mOihmdW4gaSBlbGVtIC0+IHVuc2FmZV9zZXQgb3V0cHV0IGkgKGYgaSBlbGVtKSk7XG4gIG91dHB1dFxuOztcblxubGV0IG1hcCBpbnB1dCB+ZiA9IG1hcGkgaW5wdXQgfmY6KGZ1biAoXyA6IGludCkgZWxlbSAtPiBmIGVsZW0pXG5cbmxldCBtYXBfc29tZSBpbnB1dCB+ZiA9XG4gIGxldCBsZW4gPSBsZW5ndGggaW5wdXQgaW5cbiAgbGV0IG91dHB1dCA9IGNyZWF0ZSB+bGVuIGluXG4gIGxldCAoKSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBvcHQgPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9nZXQgaW5wdXQgaSBpblxuICAgICAgQ2hlYXBfb3B0aW9uLml0ZXJfc29tZSBvcHQgfmY6KGZ1biB4IC0+IHVuc2FmZV9zZXRfc29tZSBvdXRwdXQgaSAoZiB4KSlcbiAgICBkb25lXG4gIGluXG4gIG91dHB1dFxuOztcblxubGV0IG9mX2FycmF5IGFycmF5ID0gaW5pdCAoQXJyYXkubGVuZ3RoIGFycmF5KSB+ZjooZnVuIGkgLT4gQXJyYXkudW5zYWZlX2dldCBhcnJheSBpKVxuXG5sZXQgb2ZfYXJyYXlfc29tZSBhcnJheSA9XG4gIGluaXRfc29tZSAoQXJyYXkubGVuZ3RoIGFycmF5KSB+ZjooZnVuIGkgLT4gQXJyYXkudW5zYWZlX2dldCBhcnJheSBpKVxuOztcblxubGV0IHRvX2FycmF5IHQgPSBBcnJheS5pbml0IChsZW5ndGggdCkgfmY6KGZ1biBpIC0+IHVuc2FmZV9nZXQgdCBpKVxuXG5pbmNsdWRlIEJsaXQuTWFrZTFfZ2VuZXJpYyAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBsZXQgY3JlYXRlX2xpa2UgfmxlbiBfID0gY3JlYXRlIH5sZW5cbiAgICBsZXQgdW5zYWZlX2JsaXQgPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9ibGl0XG4gIGVuZClcblxubGV0IGNvcHkgPSBVbmlmb3JtX2FycmF5LmNvcHlcblxubW9kdWxlIEZvcl90ZXN0aW5nID0gc3RydWN0XG4gIG1vZHVsZSBVbnNhZmVfY2hlYXBfb3B0aW9uID0gQ2hlYXBfb3B0aW9uXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBTdGFja19pbnRmXG5cbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4oKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8gW0RlcXVlXSBpbiB0aGF0IGl0IHVzZXMgYW4gYXJyYXkgb2YgWydhXSBhbmRcbiAgIGEgbXV0YWJsZSBbaW50XSB0byBpbmRpY2F0ZSB3aGF0IGluIHRoZSBhcnJheSBpcyB1c2VkLiAgV2UgY2hvb3NlIHRvIGltcGxlbWVudCBbU3RhY2tdXG4gICBkaXJlY3RseSByYXRoZXIgdGhhbiBvbiB0b3Agb2YgW0RlcXVlXSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gIEUuZy4gYSBzaW1wbGVcbiAgIG1pY3JvYmVuY2htYXJrIHNob3dzIHRoYXQgcHVzaC9wb3AgaXMgYWJvdXQgMjAlIGZhc3Rlci4gKilcbnR5cGUgJ2EgdCA9XG4gIHsgbXV0YWJsZSBsZW5ndGggOiBpbnRcbiAgOyBtdXRhYmxlIGVsdHMgOiAnYSBPcHRpb25fYXJyYXkudFxuICB9XG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gIGZ1biBfb2ZfYV9fMDAxXyB7IGxlbmd0aCA9IGxlbmd0aF9fMDAzXzsgZWx0cyA9IGVsdHNfXzAwNV8gfSAtPlxuICBsZXQgYm5kc19fMDAyXyA9IFtdIGluXG4gIGxldCBibmRzX18wMDJfID1cbiAgICBsZXQgYXJnX18wMDZfID0gT3B0aW9uX2FycmF5LnNleHBfb2ZfdCBfb2ZfYV9fMDAxXyBlbHRzX18wMDVfIGluXG4gICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiZWx0c1wiOyBhcmdfXzAwNl8gXSA6OiBibmRzX18wMDJfXG4gIGluXG4gIGxldCBibmRzX18wMDJfID1cbiAgICBsZXQgYXJnX18wMDRfID0gc2V4cF9vZl9pbnQgbGVuZ3RoX18wMDNfIGluXG4gICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwibGVuZ3RoXCI7IGFyZ19fMDA0XyBdIDo6IGJuZHNfXzAwMl9cbiAgaW5cbiAgU2V4cGxpYjAuU2V4cC5MaXN0IGJuZHNfXzAwMl9cbjs7XG5cbltAQEBlbmRdXG5cbmxldCBzZXhwX29mX3RfaW50ZXJuYWwgPSBzZXhwX29mX3RcbmxldCBzZXhwX29mX3QgPSBgUmVib3VuZF9sYXRlclxubGV0IF8gPSBzZXhwX29mX3RcbmxldCBjYXBhY2l0eSB0ID0gT3B0aW9uX2FycmF5Lmxlbmd0aCB0LmVsdHNcblxubGV0IGludmFyaWFudCBpbnZhcmlhbnRfYSAoeyBsZW5ndGg7IGVsdHMgfSBhcyB0KSA6IHVuaXQgPVxuICB0cnlcbiAgICBhc3NlcnQgKDAgPD0gbGVuZ3RoICYmIGxlbmd0aCA8PSBPcHRpb25fYXJyYXkubGVuZ3RoIGVsdHMpO1xuICAgIGZvciBpID0gMCB0byBsZW5ndGggLSAxIGRvXG4gICAgICBpbnZhcmlhbnRfYSAoT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biBlbHRzIGkpXG4gICAgZG9uZTtcbiAgICAoKiBXZSBtYWludGFpbiB0aGUgaW52YXJpYW50IHRoYXQgdW51c2VkIGVsZW1lbnRzIGFyZSB1bnNldCB0byBhdm9pZCBhIHNwYWNlXG4gICAgICAgbGVhay4gKilcbiAgICBmb3IgaSA9IGxlbmd0aCB0byBPcHRpb25fYXJyYXkubGVuZ3RoIGVsdHMgLSAxIGRvXG4gICAgICBhc3NlcnQgKG5vdCAoT3B0aW9uX2FycmF5LmlzX3NvbWUgZWx0cyBpKSlcbiAgICBkb25lXG4gIHdpdGhcbiAgfCBleG4gLT5cbiAgICByYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcIlN0YWNrLmludmFyaWFudCBmYWlsZWRcIlxuICAgICAgICAgWyBcImV4blwiLCBleG4gfD4gRXhuLnNleHBfb2ZfdDsgXCJzdGFja1wiLCB0IHw+IHNleHBfb2ZfdF9pbnRlcm5hbCBzZXhwX29mX29wYXF1ZSBdKVxuOztcblxubGV0IGNyZWF0ZSAodHlwZSBhKSAoKSA6IGEgdCA9IHsgbGVuZ3RoID0gMDsgZWx0cyA9IE9wdGlvbl9hcnJheS5lbXB0eSB9XG5sZXQgbGVuZ3RoIHQgPSB0Lmxlbmd0aFxubGV0IGlzX2VtcHR5IHQgPSBsZW5ndGggdCA9IDBcblxuKCogVGhlIG9yZGVyIGluIHdoaWNoIGVsZW1lbnRzIGFyZSB2aXNpdGVkIGhhcyBiZWVuIGNob3NlbiBzbyBhcyB0byBiZSBiYWNrd2FyZHNcbiAgIGNvbXBhdGlibGUgd2l0aCBbQ2FtbC5TdGFja10gKilcbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBsZXQgciA9IHJlZiBpbml0IGluXG4gIGZvciBpID0gdC5sZW5ndGggLSAxIGRvd250byAwIGRvXG4gICAgciA6PSBmICFyIChPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIHQuZWx0cyBpKVxuICBkb25lO1xuICAhclxuOztcblxubGV0IGl0ZXIgdCB+ZiA9XG4gIGZvciBpID0gdC5sZW5ndGggLSAxIGRvd250byAwIGRvXG4gICAgZiAoT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biB0LmVsdHMgaSlcbiAgZG9uZVxuOztcblxubW9kdWxlIEMgPSBDb250YWluZXIuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBmb2xkID0gZm9sZFxuICAgIGxldCBpdGVyID0gYEN1c3RvbSBpdGVyXG4gICAgbGV0IGxlbmd0aCA9IGBDdXN0b20gbGVuZ3RoXG4gIGVuZClcblxubGV0IG1lbSA9IEMubWVtXG5sZXQgZXhpc3RzID0gQy5leGlzdHNcbmxldCBmb3JfYWxsID0gQy5mb3JfYWxsXG5sZXQgY291bnQgPSBDLmNvdW50XG5sZXQgc3VtID0gQy5zdW1cbmxldCBmaW5kID0gQy5maW5kXG5sZXQgZmluZF9tYXAgPSBDLmZpbmRfbWFwXG5sZXQgdG9fbGlzdCA9IEMudG9fbGlzdFxubGV0IHRvX2FycmF5ID0gQy50b19hcnJheVxubGV0IG1pbl9lbHQgPSBDLm1pbl9lbHRcbmxldCBtYXhfZWx0ID0gQy5tYXhfZWx0XG5sZXQgZm9sZF9yZXN1bHQgPSBDLmZvbGRfcmVzdWx0XG5sZXQgZm9sZF91bnRpbCA9IEMuZm9sZF91bnRpbFxuXG5sZXQgb2ZfbGlzdCAodHlwZSBhKSAobCA6IGEgbGlzdCkgPVxuICBpZiBMaXN0LmlzX2VtcHR5IGxcbiAgdGhlbiBjcmVhdGUgKClcbiAgZWxzZSAoXG4gICAgbGV0IGxlbmd0aCA9IExpc3QubGVuZ3RoIGwgaW5cbiAgICBsZXQgZWx0cyA9IE9wdGlvbl9hcnJheS5jcmVhdGUgfmxlbjooMiAqIGxlbmd0aCkgaW5cbiAgICBsZXQgciA9IHJlZiBsIGluXG4gICAgZm9yIGkgPSBsZW5ndGggLSAxIGRvd250byAwIGRvXG4gICAgICBtYXRjaCAhciB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBhIDo6IGwgLT5cbiAgICAgICAgT3B0aW9uX2FycmF5LnNldF9zb21lIGVsdHMgaSBhO1xuICAgICAgICByIDo9IGxcbiAgICBkb25lO1xuICAgIHsgbGVuZ3RoOyBlbHRzIH0pXG47O1xuXG5sZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID0gTGlzdC5zZXhwX29mX3Qgc2V4cF9vZl9hICh0b19saXN0IHQpXG5sZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwID0gb2ZfbGlzdCAoTGlzdC50X29mX3NleHAgYV9vZl9zZXhwIHNleHApXG5cbmxldCB0X3NleHBfZ3JhbW1hciAodHlwZSBhKSAoZ3JhbW1hciA6IGEgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoTGlzdC50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuOztcblxubGV0IHJlc2l6ZSB0IHNpemUgPVxuICBsZXQgYXJyID0gT3B0aW9uX2FycmF5LmNyZWF0ZSB+bGVuOnNpemUgaW5cbiAgT3B0aW9uX2FycmF5LmJsaXQgfnNyYzp0LmVsdHMgfmRzdDphcnIgfnNyY19wb3M6MCB+ZHN0X3BvczowIH5sZW46dC5sZW5ndGg7XG4gIHQuZWx0cyA8LSBhcnJcbjs7XG5cbmxldCBzZXRfY2FwYWNpdHkgdCBuZXdfY2FwYWNpdHkgPVxuICBsZXQgbmV3X2NhcGFjaXR5ID0gbWF4IG5ld19jYXBhY2l0eSAobGVuZ3RoIHQpIGluXG4gIGlmIG5ld19jYXBhY2l0eSA8PiBjYXBhY2l0eSB0IHRoZW4gcmVzaXplIHQgbmV3X2NhcGFjaXR5XG47O1xuXG5sZXQgcHVzaCB0IGEgPVxuICBpZiB0Lmxlbmd0aCA9IE9wdGlvbl9hcnJheS5sZW5ndGggdC5lbHRzIHRoZW4gcmVzaXplIHQgKDIgKiAodC5sZW5ndGggKyAxKSk7XG4gIE9wdGlvbl9hcnJheS5zZXRfc29tZSB0LmVsdHMgdC5sZW5ndGggYTtcbiAgdC5sZW5ndGggPC0gdC5sZW5ndGggKyAxXG47O1xuXG5sZXQgcG9wX25vbmVtcHR5IHQgPVxuICBsZXQgaSA9IHQubGVuZ3RoIC0gMSBpblxuICBsZXQgcmVzdWx0ID0gT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biB0LmVsdHMgaSBpblxuICBPcHRpb25fYXJyYXkuc2V0X25vbmUgdC5lbHRzIGk7XG4gIHQubGVuZ3RoIDwtIGk7XG4gIHJlc3VsdFxuOztcblxubGV0IHBvcF9lcnJvciA9IEVycm9yLm9mX3N0cmluZyBcIlN0YWNrLnBvcCBvZiBlbXB0eSBzdGFja1wiXG5sZXQgcG9wIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKHBvcF9ub25lbXB0eSB0KVxubGV0IHBvcF9leG4gdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBFcnJvci5yYWlzZSBwb3BfZXJyb3IgZWxzZSBwb3Bfbm9uZW1wdHkgdFxubGV0IHRvcF9ub25lbXB0eSB0ID0gT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biB0LmVsdHMgKHQubGVuZ3RoIC0gMSlcbmxldCB0b3BfZXJyb3IgPSBFcnJvci5vZl9zdHJpbmcgXCJTdGFjay50b3Agb2YgZW1wdHkgc3RhY2tcIlxubGV0IHRvcCB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lICh0b3Bfbm9uZW1wdHkgdClcbmxldCB0b3BfZXhuIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gRXJyb3IucmFpc2UgdG9wX2Vycm9yIGVsc2UgdG9wX25vbmVtcHR5IHRcbmxldCBjb3B5IHsgbGVuZ3RoOyBlbHRzIH0gPSB7IGxlbmd0aDsgZWx0cyA9IE9wdGlvbl9hcnJheS5jb3B5IGVsdHMgfVxuXG5sZXQgY2xlYXIgdCA9XG4gIGlmIHQubGVuZ3RoID4gMFxuICB0aGVuIChcbiAgICBmb3IgaSA9IDAgdG8gdC5sZW5ndGggLSAxIGRvXG4gICAgICBPcHRpb25fYXJyYXkuc2V0X25vbmUgdC5lbHRzIGlcbiAgICBkb25lO1xuICAgIHQubGVuZ3RoIDwtIDApXG47O1xuXG5sZXQgdW50aWxfZW1wdHkgdCBmID1cbiAgbGV0IHJlYyBsb29wICgpID1cbiAgICBpZiB0Lmxlbmd0aCA+IDBcbiAgICB0aGVuIChcbiAgICAgIGYgKHBvcF9ub25lbXB0eSB0KTtcbiAgICAgIGxvb3AgKCkpXG4gIGluXG4gIGxvb3AgKClcbjs7XG5cbmxldCBzaW5nbGV0b24geCA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIHB1c2ggdCB4O1xuICB0XG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbigqIFRoaXMgaXMgbGlmdGVkIG91dCBvZiBbTV0gYmVjYXVzZSBbU291cmNlX2NvZGVfcG9zaXRpb24wXSBleHBvcnRzIFtTdHJpbmcwXVxuICAgYXMgW1N0cmluZ10sIHdoaWNoIGRvZXMgbm90IGV4cG9ydCBhIGhhc2ggZnVuY3Rpb24uICopXG5sZXQgaGFzaF9vdmVycmlkZSB7IENhbWwuTGV4aW5nLnBvc19mbmFtZTsgcG9zX2xudW07IHBvc19ib2w7IHBvc19jbnVtIH0gPVxuICBTdHJpbmcuaGFzaCBwb3NfZm5hbWVcbiAgbHhvciBJbnQuaGFzaCBwb3NfbG51bVxuICBseG9yIEludC5oYXNoIHBvc19ib2xcbiAgbHhvciBJbnQuaGFzaCBwb3NfY251bVxuOztcblxubW9kdWxlIE0gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTb3VyY2VfY29kZV9wb3NpdGlvbjBcblxuICBsZXQgaGFzaCA9IGhhc2hfb3ZlcnJpZGVcbmVuZFxuXG5pbmNsdWRlIE1cbmluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlX3VzaW5nX2NvbXBhcmF0b3IgKE0pXG5cbmxldCBvZl9wb3MgKHBvc19mbmFtZSwgcG9zX2xudW0sIHBvc19jbnVtLCBfKSA9XG4gIHsgcG9zX2ZuYW1lOyBwb3NfbG51bTsgcG9zX2NudW07IHBvc19ib2wgPSAwIH1cbjs7XG4iLCJvcGVuISBJbXBvcnRcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IE5lZ1xuICAgIHwgWmVyb1xuICAgIHwgUG9zXG4gICAgfCBOYW5cbiAgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hciwgY29tcGFyZSwgaGFzaCwgZW51bWVyYXRlXVxuXG4gIGxldCB0X29mX3NleHAgPVxuICAgIChsZXQgZXJyb3Jfc291cmNlX18wMDNfID0gXCJzaWduX29yX25hbi5tbC5ULnRcIiBpblxuICAgICBmdW5jdGlvblxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJuZWdcIiB8IFwiTmVnXCIpIC0+IE5lZ1xuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgLT4gWmVyb1xuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJwb3NcIiB8IFwiUG9zXCIpIC0+IFBvc1xuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJuYW5cIiB8IFwiTmFuXCIpIC0+IE5hblxuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5lZ1wiIHwgXCJOZWdcIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJwb3NcIiB8IFwiUG9zXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibmFuXCIgfCBcIk5hblwiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDAyXyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDJfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgICAgfCBzZXhwX18wMDJfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgICAgIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA9XG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IE5lZyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJOZWdcIlxuICAgICAgfCBaZXJvIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlplcm9cIlxuICAgICAgfCBQb3MgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiUG9zXCJcbiAgICAgIHwgTmFuIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIk5hblwiXG4gICAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgeyB1bnR5cGVkID1cbiAgICAgICAgVmFyaWFudFxuICAgICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICBbIE5vX3RhZyB7IG5hbWUgPSBcIk5lZ1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJaZXJvXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlBvc1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJOYW5cIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgfVxuICA7O1xuXG4gIGxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgKGZ1biBoc3YgYXJnIC0+XG4gICAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgICB8IE5lZyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDBcbiAgICAgICB8IFplcm8gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxXG4gICAgICAgfCBQb3MgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAyXG4gICAgICAgfCBOYW4gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAzXG4gICAgICAgICAgICAgICAgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gIDs7XG5cbiAgbGV0IChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jIGFyZyA9XG4gICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgICBoYXNoX2ZvbGRfdCBoc3YgYXJnKVxuICAgIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGFsbCA9IChbIE5lZzsgWmVybzsgUG9zOyBOYW4gXSA6IHQgbGlzdClcblxuICBbQEBAZW5kXVxuXG4gIGxldCBvZl9zdHJpbmcgcyA9IHRfb2Zfc2V4cCAoc2V4cF9vZl9zdHJpbmcgcylcbiAgbGV0IHRvX3N0cmluZyB0ID0gc3RyaW5nX29mX3NleHAgKHNleHBfb2ZfdCB0KVxuICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuU2lnbl9vcl9uYW5cIlxuZW5kXG5cbm1vZHVsZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogVC50KSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogVC50KSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IFQudCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IFQudCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBULnQpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IFQudCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBULnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogVC50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgSWRlbnRpZmlhYmxlLk1ha2UgKFQpXG5cbigqIE9wZW4gW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgb2Zfc2lnbiA9IGZ1bmN0aW9uXG4gIHwgU2lnbi5OZWcgLT4gTmVnXG4gIHwgU2lnbi5aZXJvIC0+IFplcm9cbiAgfCBTaWduLlBvcyAtPiBQb3Ncbjs7XG5cbmxldCB0b19zaWduX2V4biA9IGZ1bmN0aW9uXG4gIHwgTmVnIC0+IFNpZ24uTmVnXG4gIHwgWmVybyAtPiBTaWduLlplcm9cbiAgfCBQb3MgLT4gU2lnbi5Qb3NcbiAgfCBOYW4gLT4gaW52YWxpZF9hcmcgXCJCYXNlLlNpZ25fb3JfbmFuLnRvX3NpZ25fZXhuOiBOYW5cIlxuOztcblxubGV0IG9mX2ludCBuID0gb2Zfc2lnbiAoU2lnbi5vZl9pbnQgbilcbmxldCB0b19pbnRfZXhuIHQgPSBTaWduLnRvX2ludCAodG9fc2lnbl9leG4gdClcblxubGV0IGZsaXAgPSBmdW5jdGlvblxuICB8IE5lZyAtPiBQb3NcbiAgfCBaZXJvIC0+IFplcm9cbiAgfCBQb3MgLT4gTmVnXG4gIHwgTmFuIC0+IE5hblxuOztcblxubGV0ICggKiApIHQgdCcgPVxuICBtYXRjaCB0LCB0JyB3aXRoXG4gIHwgTmFuLCBfIHwgXywgTmFuIC0+IE5hblxuICB8IF8gLT4gb2Zfc2lnbiAoU2lnbi4oICogKSAodG9fc2lnbl9leG4gdCkgKHRvX3NpZ25fZXhuIHQnKSlcbjs7XG5cbigqIEluY2x1ZGUgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXIgYW55IGZ1bmN0b3IgYXBwbGljYXRpb25zIHRoYXRcbiAgIGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSAnYSB0ID1cbiAgfCBJbmNsIG9mICdhXG4gIHwgRXhjbCBvZiAnYVxuICB8IFVuYm91bmRlZFxuW0BAZGVyaXZpbmdfaW5saW5lIGVudW1lcmF0ZSwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgYWxsIDogJ2EuICdhIGxpc3QgLT4gJ2EgdCBsaXN0ID1cbiAgZnVuIF9hbGxfb2ZfYSAtPlxuICBQcHhfZW51bWVyYXRlX2xpYi5MaXN0LmFwcGVuZFxuICAgIChsZXQgcmVjIG1hcCBsIGFjYyA9XG4gICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgfCBbXSAtPiBQcHhfZW51bWVyYXRlX2xpYi5MaXN0LnJldiBhY2NcbiAgICAgICB8IGVudW1lcmF0ZV9fMDAxXyA6OiBsIC0+IG1hcCBsIChJbmNsIGVudW1lcmF0ZV9fMDAxXyA6OiBhY2MpXG4gICAgIGluXG4gICAgIG1hcCBfYWxsX29mX2EgW10pXG4gICAgKFBweF9lbnVtZXJhdGVfbGliLkxpc3QuYXBwZW5kXG4gICAgICAgKGxldCByZWMgbWFwIGwgYWNjID1cbiAgICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICB8IFtdIC0+IFBweF9lbnVtZXJhdGVfbGliLkxpc3QucmV2IGFjY1xuICAgICAgICAgIHwgZW51bWVyYXRlX18wMDJfIDo6IGwgLT4gbWFwIGwgKEV4Y2wgZW51bWVyYXRlX18wMDJfIDo6IGFjYylcbiAgICAgICAgaW5cbiAgICAgICAgbWFwIF9hbGxfb2ZfYSBbXSlcbiAgICAgICBbIFVuYm91bmRlZCBdKVxuOztcblxubGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9XG4gIGZ1biAodHlwZSBhX18wMThfKSA6ICgoU2V4cGxpYjAuU2V4cC50IC0+IGFfXzAxOF8pIC0+IFNleHBsaWIwLlNleHAudCAtPiBhX18wMThfIHQpIC0+XG4gIGxldCBlcnJvcl9zb3VyY2VfXzAwNl8gPSBcIm1heWJlX2JvdW5kLm1sLnRcIiBpblxuICBmdW4gX29mX2FfXzAwM18gLT4gZnVuY3Rpb25cbiAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJpbmNsXCIgfCBcIkluY2xcIikgYXMgX3RhZ19fMDA5XykgOjogc2V4cF9hcmdzX18wMTBfKSBhc1xuICAgICAgX3NleHBfXzAwOF8gLT5cbiAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAxMF8gd2l0aFxuICAgICAgIHwgWyBhcmcwX18wMTFfIF0gLT5cbiAgICAgICAgIGxldCByZXMwX18wMTJfID0gX29mX2FfXzAwM18gYXJnMF9fMDExXyBpblxuICAgICAgICAgSW5jbCByZXMwX18wMTJfXG4gICAgICAgfCBfIC0+XG4gICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDA2X1xuICAgICAgICAgICBfdGFnX18wMDlfXG4gICAgICAgICAgIF9zZXhwX18wMDhfKVxuICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImV4Y2xcIiB8IFwiRXhjbFwiKSBhcyBfdGFnX18wMTRfKSA6OiBzZXhwX2FyZ3NfXzAxNV8pIGFzXG4gICAgICBfc2V4cF9fMDEzXyAtPlxuICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDE1XyB3aXRoXG4gICAgICAgfCBbIGFyZzBfXzAxNl8gXSAtPlxuICAgICAgICAgbGV0IHJlczBfXzAxN18gPSBfb2ZfYV9fMDAzXyBhcmcwX18wMTZfIGluXG4gICAgICAgICBFeGNsIHJlczBfXzAxN19cbiAgICAgICB8IF8gLT5cbiAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMDZfXG4gICAgICAgICAgIF90YWdfXzAxNF9cbiAgICAgICAgICAgX3NleHBfXzAxM18pXG4gICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwidW5ib3VuZGVkXCIgfCBcIlVuYm91bmRlZFwiKSAtPiBVbmJvdW5kZWRcbiAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJpbmNsXCIgfCBcIkluY2xcIikgYXMgc2V4cF9fMDA3XyAtPlxuICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImV4Y2xcIiB8IFwiRXhjbFwiKSBhcyBzZXhwX18wMDdfIC0+XG4gICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJ1bmJvdW5kZWRcIiB8IFwiVW5ib3VuZGVkXCIpIDo6IF8pIGFzXG4gICAgICBzZXhwX18wMDdfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDA1XyAtPlxuICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG4gICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDA1XyAtPlxuICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbiAgICB8IHNleHBfXzAwNV8gLT5cbiAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbjs7XG5cbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICBmdW4gKHR5cGUgYV9fMDI0XykgOiAoKGFfXzAyNF8gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiBhX18wMjRfIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICBmdW4gX29mX2FfXzAxOV8gLT4gZnVuY3Rpb25cbiAgICB8IEluY2wgYXJnMF9fMDIwXyAtPlxuICAgICAgbGV0IHJlczBfXzAyMV8gPSBfb2ZfYV9fMDE5XyBhcmcwX18wMjBfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJJbmNsXCI7IHJlczBfXzAyMV8gXVxuICAgIHwgRXhjbCBhcmcwX18wMjJfIC0+XG4gICAgICBsZXQgcmVzMF9fMDIzXyA9IF9vZl9hX18wMTlfIGFyZzBfXzAyMl8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkV4Y2xcIjsgcmVzMF9fMDIzXyBdXG4gICAgfCBVbmJvdW5kZWQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVW5ib3VuZGVkXCJcbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJJbmNsXCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydhX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJFeGNsXCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydhX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiVW5ib3VuZGVkXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbltAQEBlbmRdXG5cbnR5cGUgaW50ZXJ2YWxfY29tcGFyaXNvbiA9XG4gIHwgQmVsb3dfbG93ZXJfYm91bmRcbiAgfCBJbl9yYW5nZVxuICB8IEFib3ZlX3VwcGVyX2JvdW5kXG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyLCBjb21wYXJlLCBoYXNoXVxuXG5sZXQgaW50ZXJ2YWxfY29tcGFyaXNvbl9vZl9zZXhwID1cbiAgKGxldCBlcnJvcl9zb3VyY2VfXzAyN18gPSBcIm1heWJlX2JvdW5kLm1sLmludGVydmFsX2NvbXBhcmlzb25cIiBpblxuICAgZnVuY3Rpb25cbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImJlbG93X2xvd2VyX2JvdW5kXCIgfCBcIkJlbG93X2xvd2VyX2JvdW5kXCIpIC0+IEJlbG93X2xvd2VyX2JvdW5kXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJpbl9yYW5nZVwiIHwgXCJJbl9yYW5nZVwiKSAtPiBJbl9yYW5nZVxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiYWJvdmVfdXBwZXJfYm91bmRcIiB8IFwiQWJvdmVfdXBwZXJfYm91bmRcIikgLT4gQWJvdmVfdXBwZXJfYm91bmRcbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJiZWxvd19sb3dlcl9ib3VuZFwiIHwgXCJCZWxvd19sb3dlcl9ib3VuZFwiKSA6OiBfKSBhcyBzZXhwX18wMjhfXG4gICAgIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyOF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiaW5fcmFuZ2VcIiB8IFwiSW5fcmFuZ2VcIikgOjogXykgYXMgc2V4cF9fMDI4X1xuICAgICAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjhfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKFwiYWJvdmVfdXBwZXJfYm91bmRcIiB8IFwiQWJvdmVfdXBwZXJfYm91bmRcIikgOjogXykgYXMgc2V4cF9fMDI4X1xuICAgICAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjhfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDI2XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyNl9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAyNl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyNl9cbiAgIHwgc2V4cF9fMDI2XyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjZfXG4gICAgICAgICAgICAgICAgICAgOiBTZXhwbGliMC5TZXhwLnQgLT4gaW50ZXJ2YWxfY29tcGFyaXNvbilcbjs7XG5cbmxldCBzZXhwX29mX2ludGVydmFsX2NvbXBhcmlzb24gPVxuICAoZnVuY3Rpb25cbiAgICB8IEJlbG93X2xvd2VyX2JvdW5kIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkJlbG93X2xvd2VyX2JvdW5kXCJcbiAgICB8IEluX3JhbmdlIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkluX3JhbmdlXCJcbiAgICB8IEFib3ZlX3VwcGVyX2JvdW5kIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkFib3ZlX3VwcGVyX2JvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBTZXhwbGliMC5TZXhwLnQpXG47O1xuXG5sZXQgKGludGVydmFsX2NvbXBhcmlzb25fc2V4cF9ncmFtbWFyIDogaW50ZXJ2YWxfY29tcGFyaXNvbiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZyB7IG5hbWUgPSBcIkJlbG93X2xvd2VyX2JvdW5kXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJJbl9yYW5nZVwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiQWJvdmVfdXBwZXJfYm91bmRcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxubGV0IGNvbXBhcmVfaW50ZXJ2YWxfY29tcGFyaXNvbiA9XG4gIChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZVxuICAgOiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IGludGVydmFsX2NvbXBhcmlzb24gLT4gaW50KVxuOztcblxubGV0IChoYXNoX2ZvbGRfaW50ZXJ2YWxfY29tcGFyaXNvbiA6XG4gICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGludGVydmFsX2NvbXBhcmlzb24gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICA9XG4gIChmdW4gaHN2IGFyZyAtPlxuICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICB8IEJlbG93X2xvd2VyX2JvdW5kIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMFxuICAgICB8IEluX3JhbmdlIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMVxuICAgICB8IEFib3ZlX3VwcGVyX2JvdW5kIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGludGVydmFsX2NvbXBhcmlzb24gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuOztcblxubGV0IChoYXNoX2ludGVydmFsX2NvbXBhcmlzb24gOiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gIGxldCBmdW5jIGFyZyA9XG4gICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICBoYXNoX2ZvbGRfaW50ZXJ2YWxfY29tcGFyaXNvbiBoc3YgYXJnKVxuICBpblxuICBmdW4geCAtPiBmdW5jIHhcbjs7XG5cbltAQEBlbmRdXG5cbmxldCBtYXAgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEluY2wgaW5jbCAtPiBJbmNsIChmIGluY2wpXG4gIHwgRXhjbCBleGNsIC0+IEV4Y2wgKGYgZXhjbClcbiAgfCBVbmJvdW5kZWQgLT4gVW5ib3VuZGVkXG47O1xuXG5sZXQgaXNfbG93ZXJfYm91bmQgdCB+b2ZfOmEgfmNvbXBhcmUgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBJbmNsIGluY2wgLT4gY29tcGFyZSBpbmNsIGEgPD0gMFxuICB8IEV4Y2wgZXhjbCAtPiBjb21wYXJlIGV4Y2wgYSA8IDBcbiAgfCBVbmJvdW5kZWQgLT4gdHJ1ZVxuOztcblxubGV0IGlzX3VwcGVyX2JvdW5kIHQgfm9mXzphIH5jb21wYXJlID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgSW5jbCBpbmNsIC0+IGNvbXBhcmUgYSBpbmNsIDw9IDBcbiAgfCBFeGNsIGV4Y2wgLT4gY29tcGFyZSBhIGV4Y2wgPCAwXG4gIHwgVW5ib3VuZGVkIC0+IHRydWVcbjs7XG5cbmxldCBib3VuZHNfY3Jvc3NlZCB+bG93ZXIgfnVwcGVyIH5jb21wYXJlID1cbiAgbWF0Y2ggbG93ZXIgd2l0aFxuICB8IFVuYm91bmRlZCAtPiBmYWxzZVxuICB8IEluY2wgbG93ZXIgfCBFeGNsIGxvd2VyIC0+XG4gICAgKG1hdGNoIHVwcGVyIHdpdGhcbiAgICAgfCBVbmJvdW5kZWQgLT4gZmFsc2VcbiAgICAgfCBJbmNsIHVwcGVyIHwgRXhjbCB1cHBlciAtPiBjb21wYXJlIGxvd2VyIHVwcGVyID4gMClcbjs7XG5cbmxldCBjaGVja19pbnRlcnZhbF9leG4gfmxvd2VyIH51cHBlciB+Y29tcGFyZSA9XG4gIGlmIGJvdW5kc19jcm9zc2VkIH5sb3dlciB+dXBwZXIgfmNvbXBhcmVcbiAgdGhlbiBmYWlsd2l0aCBcIk1heWJlX2JvdW5kLmNvbXBhcmVfdG9faW50ZXJ2YWxfZXhuOiBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kXCJcbjs7XG5cbmxldCBjb21wYXJlX3RvX2ludGVydmFsX2V4biB+bG93ZXIgfnVwcGVyIGEgfmNvbXBhcmUgPVxuICBjaGVja19pbnRlcnZhbF9leG4gfmxvd2VyIH51cHBlciB+Y29tcGFyZTtcbiAgaWYgbm90IChpc19sb3dlcl9ib3VuZCBsb3dlciB+b2ZfOmEgfmNvbXBhcmUpXG4gIHRoZW4gQmVsb3dfbG93ZXJfYm91bmRcbiAgZWxzZSBpZiBub3QgKGlzX3VwcGVyX2JvdW5kIHVwcGVyIH5vZl86YSB+Y29tcGFyZSlcbiAgdGhlbiBBYm92ZV91cHBlcl9ib3VuZFxuICBlbHNlIEluX3JhbmdlXG47O1xuXG5sZXQgaW50ZXJ2YWxfY29udGFpbnNfZXhuIH5sb3dlciB+dXBwZXIgYSB+Y29tcGFyZSA9XG4gIG1hdGNoIGNvbXBhcmVfdG9faW50ZXJ2YWxfZXhuIH5sb3dlciB+dXBwZXIgYSB+Y29tcGFyZSB3aXRoXG4gIHwgSW5fcmFuZ2UgLT4gdHJ1ZVxuICB8IEJlbG93X2xvd2VyX2JvdW5kIHwgQWJvdmVfdXBwZXJfYm91bmQgLT4gZmFsc2Vcbjs7XG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIFRcblxubW9kdWxlIE9yX2R1cGxpY2F0ZSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPVxuICAgIFsgYE9rIG9mICdhXG4gICAgfCBgRHVwbGljYXRlXG4gICAgXVxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9XG4gICAgZnVuIF9jbXBfX2EgYV9fMDAxXyBiX18wMDJfIC0+XG4gICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDAxXyBiX18wMDJfXG4gICAgdGhlbiAwXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBhX18wMDFfLCBiX18wMDJfIHdpdGhcbiAgICAgIHwgYE9rIF9sZWZ0X18wMDNfLCBgT2sgX3JpZ2h0X18wMDRfIC0+IF9jbXBfX2EgX2xlZnRfXzAwM18gX3JpZ2h0X18wMDRfXG4gICAgICB8IGBEdXBsaWNhdGUsIGBEdXBsaWNhdGUgLT4gMFxuICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIHggeSlcbiAgOztcblxuICBsZXQgZXF1YWwgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sID1cbiAgICBmdW4gX2NtcF9fYSBhX18wMDVfIGJfXzAwNl8gLT5cbiAgICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwNV8gYl9fMDA2X1xuICAgICAgdGhlbiB0cnVlXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggYV9fMDA1XywgYl9fMDA2XyB3aXRoXG4gICAgICAgIHwgYE9rIF9sZWZ0X18wMDdfLCBgT2sgX3JpZ2h0X18wMDhfIC0+IF9jbXBfX2EgX2xlZnRfXzAwN18gX3JpZ2h0X18wMDhfXG4gICAgICAgIHwgYER1cGxpY2F0ZSwgYER1cGxpY2F0ZSAtPiB0cnVlXG4gICAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfZXF1YWwgeCB5KVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIGZ1biBfb2ZfYV9fMDA5XyAtPiBmdW5jdGlvblxuICAgICAgfCBgT2sgdl9fMDEwXyAtPiBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJPa1wiOyBfb2ZfYV9fMDA5XyB2X18wMTBfIF1cbiAgICAgIHwgYER1cGxpY2F0ZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJEdXBsaWNhdGVcIlxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIFdpdGhvdXRfY29tcGFyYXRvciA9IHN0cnVjdFxuICB0eXBlICgna2V5LCAnY21wLCAneikgdCA9ICd6XG5lbmRcblxubW9kdWxlIFdpdGhfY29tcGFyYXRvciA9IHN0cnVjdFxuICB0eXBlICgna2V5LCAnY21wLCAneikgdCA9IGNvbXBhcmF0b3I6KCdrZXksICdjbXApIENvbXBhcmF0b3IudCAtPiAnelxuZW5kXG5cbm1vZHVsZSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZSA9IHN0cnVjdFxuICB0eXBlICgna2V5LCAnY21wLCAneikgdCA9ICgna2V5LCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICd6XG5lbmRcblxubW9kdWxlIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2ssICd2KSB0ID0gJ2sgKiBbIGBMZWZ0IG9mICd2IHwgYFJpZ2h0IG9mICd2IHwgYFVuZXF1YWwgb2YgJ3YgKiAndiBdXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlIDpcbiAgICAnayAndi4gKCdrIC0+ICdrIC0+IGludCkgLT4gKCd2IC0+ICd2IC0+IGludCkgLT4gKCdrLCAndikgdCAtPiAoJ2ssICd2KSB0IC0+IGludFxuICAgID1cbiAgICBmdW4gX2NtcF9fayBfY21wX192IGFfXzAxMV8gYl9fMDEyXyAtPlxuICAgIGxldCB0X18wMTNfLCB0X18wMTRfID0gYV9fMDExXyBpblxuICAgIGxldCB0X18wMTVfLCB0X18wMTZfID0gYl9fMDEyXyBpblxuICAgIG1hdGNoIF9jbXBfX2sgdF9fMDEzXyB0X18wMTVfIHdpdGhcbiAgICB8IDAgLT5cbiAgICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIHRfXzAxNF8gdF9fMDE2X1xuICAgICAgdGhlbiAwXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggdF9fMDE0XywgdF9fMDE2XyB3aXRoXG4gICAgICAgIHwgYExlZnQgX2xlZnRfXzAxN18sIGBMZWZ0IF9yaWdodF9fMDE4XyAtPiBfY21wX192IF9sZWZ0X18wMTdfIF9yaWdodF9fMDE4X1xuICAgICAgICB8IGBSaWdodCBfbGVmdF9fMDE5XywgYFJpZ2h0IF9yaWdodF9fMDIwXyAtPiBfY21wX192IF9sZWZ0X18wMTlfIF9yaWdodF9fMDIwX1xuICAgICAgICB8IGBVbmVxdWFsIF9sZWZ0X18wMjFfLCBgVW5lcXVhbCBfcmlnaHRfXzAyMl8gLT5cbiAgICAgICAgICBsZXQgdF9fMDIzXywgdF9fMDI0XyA9IF9sZWZ0X18wMjFfIGluXG4gICAgICAgICAgbGV0IHRfXzAyNV8sIHRfXzAyNl8gPSBfcmlnaHRfXzAyMl8gaW5cbiAgICAgICAgICAobWF0Y2ggX2NtcF9fdiB0X18wMjNfIHRfXzAyNV8gd2l0aFxuICAgICAgICAgICB8IDAgLT4gX2NtcF9fdiB0X18wMjRfIHRfXzAyNl9cbiAgICAgICAgICAgfCBuIC0+IG4pXG4gICAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSB4IHkpXG4gICAgfCBuIC0+IG5cbiAgOztcblxuICBsZXQgZXF1YWwgOlxuICAgICdrICd2LlxuICAgICgnayAtPiAnayAtPiBib29sKSAtPiAoJ3YgLT4gJ3YgLT4gYm9vbCkgLT4gKCdrLCAndikgdCAtPiAoJ2ssICd2KSB0IC0+IGJvb2xcbiAgICA9XG4gICAgZnVuIF9jbXBfX2sgX2NtcF9fdiBhX18wMjdfIGJfXzAyOF8gLT5cbiAgICAgIGxldCB0X18wMjlfLCB0X18wMzBfID0gYV9fMDI3XyBpblxuICAgICAgbGV0IHRfXzAzMV8sIHRfXzAzMl8gPSBiX18wMjhfIGluXG4gICAgICBQcHhfY29tcGFyZV9saWIuKCAmJiApXG4gICAgICAgIChfY21wX19rIHRfXzAyOV8gdF9fMDMxXylcbiAgICAgICAgKGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIHRfXzAzMF8gdF9fMDMyX1xuICAgICAgICAgdGhlbiB0cnVlXG4gICAgICAgICBlbHNlIChcbiAgICAgICAgICAgbWF0Y2ggdF9fMDMwXywgdF9fMDMyXyB3aXRoXG4gICAgICAgICAgIHwgYExlZnQgX2xlZnRfXzAzM18sIGBMZWZ0IF9yaWdodF9fMDM0XyAtPiBfY21wX192IF9sZWZ0X18wMzNfIF9yaWdodF9fMDM0X1xuICAgICAgICAgICB8IGBSaWdodCBfbGVmdF9fMDM1XywgYFJpZ2h0IF9yaWdodF9fMDM2XyAtPiBfY21wX192IF9sZWZ0X18wMzVfIF9yaWdodF9fMDM2X1xuICAgICAgICAgICB8IGBVbmVxdWFsIF9sZWZ0X18wMzdfLCBgVW5lcXVhbCBfcmlnaHRfXzAzOF8gLT5cbiAgICAgICAgICAgICBsZXQgdF9fMDM5XywgdF9fMDQwXyA9IF9sZWZ0X18wMzdfIGluXG4gICAgICAgICAgICAgbGV0IHRfXzA0MV8sIHRfXzA0Ml8gPSBfcmlnaHRfXzAzOF8gaW5cbiAgICAgICAgICAgICBQcHhfY29tcGFyZV9saWIuKCAmJiApIChfY21wX192IHRfXzAzOV8gdF9fMDQxXykgKF9jbXBfX3YgdF9fMDQwXyB0X18wNDJfKVxuICAgICAgICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2VxdWFsIHggeSkpXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA6XG4gICAgJ2sgJ3YuXG4gICAgKFNleHBsaWIwLlNleHAudCAtPiAnaylcbiAgICAtPiAoU2V4cGxpYjAuU2V4cC50IC0+ICd2KVxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICA9XG4gICAgbGV0IGVycm9yX3NvdXJjZV9fMDU3XyA9IFwibWFwX2ludGYubWwuU3ltbWV0cmljX2RpZmZfZWxlbWVudC50XCIgaW5cbiAgICBmdW4gX29mX2tfXzA0M18gX29mX3ZfXzA0NF8gLT4gZnVuY3Rpb25cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFsgYXJnMF9fMDY3XzsgYXJnMV9fMDY4XyBdIC0+XG4gICAgICAgIGxldCByZXMwX18wNjlfID0gX29mX2tfXzA0M18gYXJnMF9fMDY3X1xuICAgICAgICBhbmQgcmVzMV9fMDcwXyA9XG4gICAgICAgICAgbGV0IHNleHBfXzA2Nl8gPSBhcmcxX18wNjhfIGluXG4gICAgICAgICAgdHJ5XG4gICAgICAgICAgICBtYXRjaCBzZXhwX18wNjZfIHdpdGhcbiAgICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIGF0b21fXzA0N18gYXMgX3NleHBfXzA0OV8gLT5cbiAgICAgICAgICAgICAgKG1hdGNoIGF0b21fXzA0N18gd2l0aFxuICAgICAgICAgICAgICAgfCBcIkxlZnRcIiAtPlxuICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDU3XyBfc2V4cF9fMDQ5X1xuICAgICAgICAgICAgICAgfCBcIlJpZ2h0XCIgLT5cbiAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzA1N18gX3NleHBfXzA0OV9cbiAgICAgICAgICAgICAgIHwgXCJVbmVxdWFsXCIgLT5cbiAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzA1N18gX3NleHBfXzA0OV9cbiAgICAgICAgICAgICAgIHwgXyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iubm9fdmFyaWFudF9tYXRjaCAoKSlcbiAgICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gYXRvbV9fMDQ3XyA6OiBzZXhwX2FyZ3NfXzA1MF8pIGFzXG4gICAgICAgICAgICAgIF9zZXhwX18wNDlfIC0+XG4gICAgICAgICAgICAgIChtYXRjaCBhdG9tX18wNDdfIHdpdGhcbiAgICAgICAgICAgICAgIHwgXCJMZWZ0XCIgYXMgX3RhZ19fMDYzXyAtPlxuICAgICAgICAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wNTBfIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgWyBhcmcwX18wNjRfIF0gLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlczBfXzA2NV8gPSBfb2Zfdl9fMDQ0XyBhcmcwX18wNjRfIGluXG4gICAgICAgICAgICAgICAgICAgIGBMZWZ0IHJlczBfXzA2NV9cbiAgICAgICAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgICAgICAgX3RhZ19fMDYzX1xuICAgICAgICAgICAgICAgICAgICAgIF9zZXhwX18wNDlfKVxuICAgICAgICAgICAgICAgfCBcIlJpZ2h0XCIgYXMgX3RhZ19fMDYwXyAtPlxuICAgICAgICAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wNTBfIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgWyBhcmcwX18wNjFfIF0gLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlczBfXzA2Ml8gPSBfb2Zfdl9fMDQ0XyBhcmcwX18wNjFfIGluXG4gICAgICAgICAgICAgICAgICAgIGBSaWdodCByZXMwX18wNjJfXG4gICAgICAgICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgICAgICAgIF90YWdfXzA2MF9cbiAgICAgICAgICAgICAgICAgICAgICBfc2V4cF9fMDQ5XylcbiAgICAgICAgICAgICAgIHwgXCJVbmVxdWFsXCIgYXMgX3RhZ19fMDUxXyAtPlxuICAgICAgICAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wNTBfIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgWyBhcmcwX18wNThfIF0gLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlczBfXzA1OV8gPVxuICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGFyZzBfXzA1OF8gd2l0aFxuICAgICAgICAgICAgICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFsgYXJnMF9fMDUyXzsgYXJnMV9fMDUzXyBdIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzMF9fMDU0XyA9IF9vZl92X18wNDRfIGFyZzBfXzA1Ml9cbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXMxX18wNTVfID0gX29mX3ZfXzA0NF8gYXJnMV9fMDUzXyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzMF9fMDU0XywgcmVzMV9fMDU1X1xuICAgICAgICAgICAgICAgICAgICAgIHwgc2V4cF9fMDU2XyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnR1cGxlX29mX3NpemVfbl9leHBlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXhwX18wNTZfXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIGBVbmVxdWFsIHJlczBfXzA1OV9cbiAgICAgICAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgICAgICAgX3RhZ19fMDUxX1xuICAgICAgICAgICAgICAgICAgICAgIF9zZXhwX18wNDlfKVxuICAgICAgICAgICAgICAgfCBfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5ub192YXJpYW50X21hdGNoICgpKVxuICAgICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzA0OF8gLT5cbiAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfcG9seV92YXJcbiAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICBzZXhwX18wNDhfXG4gICAgICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wNDhfIC0+XG4gICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfcG9seV92YXJcbiAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICBzZXhwX18wNDhfXG4gICAgICAgICAgd2l0aFxuICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLk5vX3ZhcmlhbnRfbWF0Y2ggLT5cbiAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5ub19tYXRjaGluZ192YXJpYW50X2ZvdW5kXG4gICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICBzZXhwX18wNjZfXG4gICAgICAgIGluXG4gICAgICAgIHJlczBfXzA2OV8sIHJlczFfXzA3MF9cbiAgICAgIHwgc2V4cF9fMDcxXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudHVwbGVfb2Zfc2l6ZV9uX2V4cGVjdGVkIGVycm9yX3NvdXJjZV9fMDU3XyAyIHNleHBfXzA3MV9cbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDpcbiAgICAnayAndi5cbiAgICAoJ2sgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgndiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdrLCAndikgdFxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgID1cbiAgICBmdW4gX29mX2tfXzA3Ml8gX29mX3ZfXzA3M18gKGFyZzBfXzA4MV8sIGFyZzFfXzA4Ml8pIC0+XG4gICAgICBsZXQgcmVzMF9fMDgzXyA9IF9vZl9rX18wNzJfIGFyZzBfXzA4MV9cbiAgICAgIGFuZCByZXMxX18wODRfID1cbiAgICAgICAgbWF0Y2ggYXJnMV9fMDgyXyB3aXRoXG4gICAgICAgIHwgYExlZnQgdl9fMDc0XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkxlZnRcIjsgX29mX3ZfXzA3M18gdl9fMDc0XyBdXG4gICAgICAgIHwgYFJpZ2h0IHZfXzA3NV8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJSaWdodFwiOyBfb2Zfdl9fMDczXyB2X18wNzVfIF1cbiAgICAgICAgfCBgVW5lcXVhbCB2X18wNzZfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlVuZXF1YWxcIlxuICAgICAgICAgICAgOyAobGV0IGFyZzBfXzA3N18sIGFyZzFfXzA3OF8gPSB2X18wNzZfIGluXG4gICAgICAgICAgICAgICBsZXQgcmVzMF9fMDc5XyA9IF9vZl92X18wNzNfIGFyZzBfXzA3N19cbiAgICAgICAgICAgICAgIGFuZCByZXMxX18wODBfID0gX29mX3ZfXzA3M18gYXJnMV9fMDc4XyBpblxuICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgcmVzMF9fMDc5XzsgcmVzMV9fMDgwXyBdKVxuICAgICAgICAgICAgXVxuICAgICAgaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIHJlczBfXzA4M187IHJlczFfXzA4NF8gXVxuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOlxuICAgICAgICAgJ2sgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAndiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICgnaywgJ3YpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgPVxuICAgIGZ1biBfJ2tfc2V4cF9ncmFtbWFyIF8ndl9zZXhwX2dyYW1tYXIgLT5cbiAgICAgIHsgdW50eXBlZCA9XG4gICAgICAgICAgTGlzdFxuICAgICAgICAgICAgKENvbnNcbiAgICAgICAgICAgICAgICggXydrX3NleHBfZ3JhbW1hci51bnR5cGVkXG4gICAgICAgICAgICAgICAsIENvbnNcbiAgICAgICAgICAgICAgICAgICAoIFZhcmlhbnRcbiAgICAgICAgICAgICAgICAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJMZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFyZ3MgPSBDb25zIChfJ3Zfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIlJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFyZ3MgPSBDb25zIChfJ3Zfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIlVuZXF1YWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXJncyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIExpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfJ3Zfc2V4cF9ncmFtbWFyLnVudHlwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBDb25zIChfJ3Zfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgRW1wdHkgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAsIEVtcHR5ICkgKSlcbiAgICAgIH1cbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSBNZXJnZV9lbGVtZW50ID0gc3RydWN0XG4gIHR5cGUgKCdsZWZ0LCAncmlnaHQpIHQgPVxuICAgIFsgYExlZnQgb2YgJ2xlZnRcbiAgICB8IGBSaWdodCBvZiAncmlnaHRcbiAgICB8IGBCb3RoIG9mICdsZWZ0ICogJ3JpZ2h0XG4gICAgXVxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgOlxuICAgICdsZWZ0ICdyaWdodC5cbiAgICAoJ2xlZnQgLT4gJ2xlZnQgLT4gaW50KVxuICAgIC0+ICgncmlnaHQgLT4gJ3JpZ2h0IC0+IGludClcbiAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgLT4gaW50XG4gICAgPVxuICAgIGZ1biBfY21wX19sZWZ0IF9jbXBfX3JpZ2h0IGFfXzA4NV8gYl9fMDg2XyAtPlxuICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzA4NV8gYl9fMDg2X1xuICAgIHRoZW4gMFxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggYV9fMDg1XywgYl9fMDg2XyB3aXRoXG4gICAgICB8IGBMZWZ0IF9sZWZ0X18wODdfLCBgTGVmdCBfcmlnaHRfXzA4OF8gLT4gX2NtcF9fbGVmdCBfbGVmdF9fMDg3XyBfcmlnaHRfXzA4OF9cbiAgICAgIHwgYFJpZ2h0IF9sZWZ0X18wODlfLCBgUmlnaHQgX3JpZ2h0X18wOTBfIC0+IF9jbXBfX3JpZ2h0IF9sZWZ0X18wODlfIF9yaWdodF9fMDkwX1xuICAgICAgfCBgQm90aCBfbGVmdF9fMDkxXywgYEJvdGggX3JpZ2h0X18wOTJfIC0+XG4gICAgICAgIGxldCB0X18wOTNfLCB0X18wOTRfID0gX2xlZnRfXzA5MV8gaW5cbiAgICAgICAgbGV0IHRfXzA5NV8sIHRfXzA5Nl8gPSBfcmlnaHRfXzA5Ml8gaW5cbiAgICAgICAgKG1hdGNoIF9jbXBfX2xlZnQgdF9fMDkzXyB0X18wOTVfIHdpdGhcbiAgICAgICAgIHwgMCAtPiBfY21wX19yaWdodCB0X18wOTRfIHRfXzA5Nl9cbiAgICAgICAgIHwgbiAtPiBuKVxuICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIHggeSlcbiAgOztcblxuICBsZXQgZXF1YWwgOlxuICAgICdsZWZ0ICdyaWdodC5cbiAgICAoJ2xlZnQgLT4gJ2xlZnQgLT4gYm9vbClcbiAgICAtPiAoJ3JpZ2h0IC0+ICdyaWdodCAtPiBib29sKVxuICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAtPiBib29sXG4gICAgPVxuICAgIGZ1biBfY21wX19sZWZ0IF9jbXBfX3JpZ2h0IGFfXzA5N18gYl9fMDk4XyAtPlxuICAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDk3XyBiX18wOThfXG4gICAgICB0aGVuIHRydWVcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBhX18wOTdfLCBiX18wOThfIHdpdGhcbiAgICAgICAgfCBgTGVmdCBfbGVmdF9fMDk5XywgYExlZnQgX3JpZ2h0X18xMDBfIC0+IF9jbXBfX2xlZnQgX2xlZnRfXzA5OV8gX3JpZ2h0X18xMDBfXG4gICAgICAgIHwgYFJpZ2h0IF9sZWZ0X18xMDFfLCBgUmlnaHQgX3JpZ2h0X18xMDJfIC0+IF9jbXBfX3JpZ2h0IF9sZWZ0X18xMDFfIF9yaWdodF9fMTAyX1xuICAgICAgICB8IGBCb3RoIF9sZWZ0X18xMDNfLCBgQm90aCBfcmlnaHRfXzEwNF8gLT5cbiAgICAgICAgICBsZXQgdF9fMTA1XywgdF9fMTA2XyA9IF9sZWZ0X18xMDNfIGluXG4gICAgICAgICAgbGV0IHRfXzEwN18sIHRfXzEwOF8gPSBfcmlnaHRfXzEwNF8gaW5cbiAgICAgICAgICBQcHhfY29tcGFyZV9saWIuKCAmJiApIChfY21wX19sZWZ0IHRfXzEwNV8gdF9fMTA3XykgKF9jbXBfX3JpZ2h0IHRfXzEwNl8gdF9fMTA4XylcbiAgICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19lcXVhbCB4IHkpXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6XG4gICAgJ2xlZnQgJ3JpZ2h0LlxuICAgICgnbGVmdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdyaWdodCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICA9XG4gICAgZnVuIF9vZl9sZWZ0X18xMDlfIF9vZl9yaWdodF9fMTEwXyAtPiBmdW5jdGlvblxuICAgICAgfCBgTGVmdCB2X18xMTFfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkxlZnRcIjsgX29mX2xlZnRfXzEwOV8gdl9fMTExXyBdXG4gICAgICB8IGBSaWdodCB2X18xMTJfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlJpZ2h0XCI7IF9vZl9yaWdodF9fMTEwXyB2X18xMTJfIF1cbiAgICAgIHwgYEJvdGggdl9fMTEzXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkJvdGhcIlxuICAgICAgICAgIDsgKGxldCBhcmcwX18xMTRfLCBhcmcxX18xMTVfID0gdl9fMTEzXyBpblxuICAgICAgICAgICAgIGxldCByZXMwX18xMTZfID0gX29mX2xlZnRfXzEwOV8gYXJnMF9fMTE0X1xuICAgICAgICAgICAgIGFuZCByZXMxX18xMTdfID0gX29mX3JpZ2h0X18xMTBfIGFyZzFfXzExNV8gaW5cbiAgICAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyByZXMwX18xMTZfOyByZXMxX18xMTdfIF0pXG4gICAgICAgICAgXVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5NYXAuQ29udGludWVfb3Jfc3RvcCAqKVxubW9kdWxlIENvbnRpbnVlX29yX3N0b3AgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IENvbnRpbnVlXG4gICAgfCBTdG9wXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlbnVtZXJhdGUsIGVxdWFsLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcbiAgbGV0IGFsbCA9IChbIENvbnRpbnVlOyBTdG9wIF0gOiB0IGxpc3QpXG4gIGxldCBlcXVhbCA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfZXF1YWwgOiB0IC0+IHQgLT4gYm9vbClcblxuICBsZXQgc2V4cF9vZl90ID1cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgQ29udGludWUgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiQ29udGludWVcIlxuICAgICAgfCBTdG9wIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlN0b3BcIlxuICAgICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLk1hcC5GaW5pc2hlZF9vcl91bmZpbmlzaGVkICopXG5tb2R1bGUgRmluaXNoZWRfb3JfdW5maW5pc2hlZCA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgRmluaXNoZWRcbiAgICB8IFVuZmluaXNoZWRcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVudW1lcmF0ZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuICBsZXQgYWxsID0gKFsgRmluaXNoZWQ7IFVuZmluaXNoZWQgXSA6IHQgbGlzdClcbiAgbGV0IGVxdWFsID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19lcXVhbCA6IHQgLT4gdCAtPiBib29sKVxuXG4gIGxldCBzZXhwX29mX3QgPVxuICAgIChmdW5jdGlvblxuICAgICAgfCBGaW5pc2hlZCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJGaW5pc2hlZFwiXG4gICAgICB8IFVuZmluaXNoZWQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVW5maW5pc2hlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yc19nZW5lcmljID0gc2lnXG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2IsICdjbXApIHRyZWVcbiAgdHlwZSAnYSBrZXlcbiAgdHlwZSAnY21wIGNtcFxuICB0eXBlICgnYSwgJ2NtcCwgJ3opIG9wdGlvbnNcblxuICB2YWwgaW52YXJpYW50cyA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiBib29sKSBvcHRpb25zXG4gIHZhbCBpc19lbXB0eSA6IChfLCBfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6IChfLCBfLCBfKSB0IC0+IGludFxuXG4gIHZhbCBhZGRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayBrZXkgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2R1cGxpY2F0ZS50IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBhZGRfZXhuXG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgc2V0XG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgYWRkX211bHRpXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+IGtleTonayBrZXkgLT4gZGF0YTondiAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHJlbW92ZV9tdWx0aVxuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4gJ2sga2V5IC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBmaW5kX211bHRpIDogKCdrLCAnY21wLCAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4gJ2sga2V5IC0+ICd2IGxpc3QpIG9wdGlvbnNcblxuICB2YWwgY2hhbmdlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gZjooJ3Ygb3B0aW9uIC0+ICd2IG9wdGlvbikgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgdXBkYXRlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gZjooJ3Ygb3B0aW9uIC0+ICd2KSAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmaW5kIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIGtleSAtPiAndiBvcHRpb24pIG9wdGlvbnNcbiAgdmFsIGZpbmRfZXhuIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIGtleSAtPiAndikgb3B0aW9uc1xuICB2YWwgcmVtb3ZlIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIGtleSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBtZW0gOiAoJ2ssICdjbXAsICgnaywgXywgJ2NtcCkgdCAtPiAnayBrZXkgLT4gYm9vbCkgb3B0aW9uc1xuICB2YWwgaXRlcl9rZXlzIDogKCdrLCBfLCBfKSB0IC0+IGY6KCdrIGtleSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICd2LCBfKSB0IC0+IGY6KCd2IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gIHZhbCBpdGVyMlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOigndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpXG4gICAgICAtPiB1bml0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBtYXAgOiAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOigndjEgLT4gJ3YyKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICB2YWwgbWFwaSA6ICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondjEgLT4gJ3YyKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICB2YWwgZm9sZCA6ICgnaywgJ3YsIF8pIHQgLT4gaW5pdDonYSAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpIC0+ICdhXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAnYSAtPiAoJ2EsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnaywgJ3YsIF8pIHQgLT4gaW5pdDonYSAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpIC0+ICdhXG5cbiAgdmFsIGZvbGQyXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgICAtPiBpbml0OidhXG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6KCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2EgLT4gJ2EpXG4gICAgICAtPiAnYSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyX2tleXNcbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiBmOignayBrZXkgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXIgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXJpXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyX21hcFxuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOigndjEgLT4gJ3YyIG9wdGlvbikgLT4gKCdrLCAndjIsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyX21hcGlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YxIC0+ICd2MiBvcHRpb24pIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgICApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2MSAtPiAoJ3YyLCAndjMpIEVpdGhlci50KVxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHQgKiAoJ2ssICd2MywgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcGFydGl0aW9uX21hcFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0XG4gICAgICAtPiBmOigndjEgLT4gKCd2MiwgJ3YzKSBFaXRoZXIudClcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0ICogKCdrLCAndjMsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gYm9vbClcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBjb21iaW5lX2Vycm9yc1xuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2IE9yX2Vycm9yLnQsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgdmFsIGNvbXBhcmVfZGlyZWN0XG4gICAgOiAoJ2ssICdjbXAsICgndiAtPiAndiAtPiBpbnQpIC0+ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiBpbnQpIG9wdGlvbnNcblxuICB2YWwgZXF1YWxcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ3YgLT4gJ3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IC0+IGJvb2wgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGtleXMgOiAoJ2ssIF8sIF8pIHQgLT4gJ2sga2V5IGxpc3RcbiAgdmFsIGRhdGEgOiAoXywgJ3YsIF8pIHQgLT4gJ3YgbGlzdFxuXG4gIHZhbCB0b19hbGlzdFxuICAgIDogID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiAoJ2ssICd2LCBfKSB0XG4gICAgLT4gKCdrIGtleSAqICd2KSBsaXN0XG5cbiAgdmFsIG1lcmdlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+ICgndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+ICd2MyBvcHRpb24pXG4gICAgICAtPiAoJ2ssICd2MywgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbWVyZ2Vfc2tld2VkXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gY29tYmluZTooa2V5OidrIGtleSAtPiAndiAtPiAndiAtPiAndilcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gZGF0YV9lcXVhbDooJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAgIC0+ICgnayBrZXksICd2KSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGRhdGFfZXF1YWw6KCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgICAtPiBpbml0OidhXG4gICAgICAtPiBmOignYSAtPiAoJ2sga2V5LCAndikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdhKVxuICAgICAgLT4gJ2EgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG1pbl9lbHQgOiAoJ2ssICd2LCBfKSB0IC0+ICgnayBrZXkgKiAndikgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnaywgJ3YsIF8pIHQgLT4gJ2sga2V5ICogJ3ZcbiAgdmFsIG1heF9lbHQgOiAoJ2ssICd2LCBfKSB0IC0+ICgnayBrZXkgKiAndikgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnaywgJ3YsIF8pIHQgLT4gJ2sga2V5ICogJ3ZcbiAgdmFsIGZvcl9hbGwgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gaW50XG5cbiAgdmFsIHNwbGl0XG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gJ2sga2V5XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrIGtleSAqICd2KSBvcHRpb24gKiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBhcHBlbmRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCBsb3dlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IHVwcGVyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF0gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gbG93ZXJfYm91bmQ6J2sga2V5IE1heWJlX2JvdW5kLnRcbiAgICAgIC0+IHVwcGVyX2JvdW5kOidrIGtleSBNYXliZV9ib3VuZC50XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IG1pbjonayBrZXlcbiAgICAgIC0+IG1heDonayBrZXlcbiAgICAgIC0+IGluaXQ6J2FcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAnYSAtPiAnYSlcbiAgICAgIC0+ICdhIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCByYW5nZV90b19hbGlzdFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4gbWluOidrIGtleSAtPiBtYXg6J2sga2V5IC0+ICgnayBrZXkgKiAndikgbGlzdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgICAtPiAnayBrZXlcbiAgICAgIC0+ICgnayBrZXkgKiAndikgb3B0aW9uIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBudGggOiAoJ2ssICd2LCAnY21wKSB0IC0+IGludCAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvblxuICB2YWwgbnRoX2V4biA6ICgnaywgJ3YsICdjbXApIHQgLT4gaW50IC0+ICdrIGtleSAqICd2XG4gIHZhbCByYW5rIDogKCdrLCAnY21wLCAoJ2ssIF8sICdjbXApIHQgLT4gJ2sga2V5IC0+IGludCBvcHRpb24pIG9wdGlvbnNcbiAgdmFsIHRvX3RyZWUgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnayBrZXksICd2LCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5IHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86J2sga2V5XG4gICAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOidrIGtleVxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gY29tcGFyZTooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdrZXkgLT4gaW50KVxuICAgICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgICAtPiAna2V5XG4gICAgICAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvbiApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBzZWdtZW50X29mOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgICAgLT4gKCdrIGtleSAqICd2KSBvcHRpb24gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBjb21wYXJlOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2JvdW5kIC0+IGludClcbiAgICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMxID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlICdhIHRyZWVcbiAgdHlwZSBrZXlcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgaW52YXJpYW50cyA6IF8gdCAtPiBib29sXG4gIHZhbCBpc19lbXB0eSA6IF8gdCAtPiBib29sXG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG4gIHZhbCBhZGQgOiAnYSB0IC0+IGtleTprZXkgLT4gZGF0YTonYSAtPiAnYSB0IE9yX2R1cGxpY2F0ZS50XG4gIHZhbCBhZGRfZXhuIDogJ2EgdCAtPiBrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2EgdFxuICB2YWwgc2V0IDogJ2EgdCAtPiBrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2EgdFxuICB2YWwgYWRkX211bHRpIDogJ2EgbGlzdCB0IC0+IGtleTprZXkgLT4gZGF0YTonYSAtPiAnYSBsaXN0IHRcbiAgdmFsIHJlbW92ZV9tdWx0aSA6ICdhIGxpc3QgdCAtPiBrZXkgLT4gJ2EgbGlzdCB0XG4gIHZhbCBmaW5kX211bHRpIDogJ2EgbGlzdCB0IC0+IGtleSAtPiAnYSBsaXN0XG4gIHZhbCBjaGFuZ2UgOiAnYSB0IC0+IGtleSAtPiBmOignYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAtPiAnYSB0XG4gIHZhbCB1cGRhdGUgOiAnYSB0IC0+IGtleSAtPiBmOignYSBvcHRpb24gLT4gJ2EpIC0+ICdhIHRcbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgdmFsIGZpbmRfZXhuIDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+ICdhIHRcbiAgdmFsIG1lbSA6IF8gdCAtPiBrZXkgLT4gYm9vbFxuICB2YWwgaXRlcl9rZXlzIDogXyB0IC0+IGY6KGtleSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogJ2EgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAnYSB0XG4gICAgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICB2YWwgaXRlcjIgOiAnYSB0IC0+ICdiIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOignYSwgJ2IpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBtYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAnYiB0XG4gIHZhbCBtYXBpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2IpIC0+ICdiIHRcbiAgdmFsIGZvbGQgOiAnYSB0IC0+IGluaXQ6J2IgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2FjY1xuICAgIC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYWNjIC0+ICgnYWNjLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICdhIHQgLT4gaW5pdDonYiAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGZvbGQyXG4gICAgOiAgJ2EgdFxuICAgIC0+ICdiIHRcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooa2V5OmtleSAtPiBkYXRhOignYSwgJ2IpIE1lcmdlX2VsZW1lbnQudCAtPiAnYyAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBmaWx0ZXJfa2V5cyA6ICdhIHQgLT4gZjooa2V5IC0+IGJvb2wpIC0+ICdhIHRcbiAgdmFsIGZpbHRlciA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2EgdFxuICB2YWwgZmlsdGVyaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IGJvb2wpIC0+ICdhIHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2IgdFxuICB2YWwgZmlsdGVyX21hcGkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYiBvcHRpb24pIC0+ICdiIHRcbiAgdmFsIHBhcnRpdGlvbl9tYXBpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gKCdiLCAnYykgRWl0aGVyLnQpIC0+ICdiIHQgKiAnYyB0XG4gIHZhbCBwYXJ0aXRpb25fbWFwIDogJ2EgdCAtPiBmOignYSAtPiAoJ2IsICdjKSBFaXRoZXIudCkgLT4gJ2IgdCAqICdjIHRcbiAgdmFsIHBhcnRpdGlvbmlfdGYgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBib29sKSAtPiAnYSB0ICogJ2EgdFxuICB2YWwgcGFydGl0aW9uX3RmIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSB0ICogJ2EgdFxuICB2YWwgY29tYmluZV9lcnJvcnMgOiAnYSBPcl9lcnJvci50IHQgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sXG4gIHZhbCBrZXlzIDogXyB0IC0+IGtleSBsaXN0XG4gIHZhbCBkYXRhIDogJ2EgdCAtPiAnYSBsaXN0XG4gIHZhbCB0b19hbGlzdCA6ID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF0gLT4gJ2EgdCAtPiAoa2V5ICogJ2EpIGxpc3RcbiAgdmFsIG1lcmdlIDogJ2EgdCAtPiAnYiB0IC0+IGY6KGtleTprZXkgLT4gKCdhLCAnYikgTWVyZ2VfZWxlbWVudC50IC0+ICdjIG9wdGlvbikgLT4gJ2MgdFxuICB2YWwgbWVyZ2Vfc2tld2VkIDogJ3YgdCAtPiAndiB0IC0+IGNvbWJpbmU6KGtleTprZXkgLT4gJ3YgLT4gJ3YgLT4gJ3YpIC0+ICd2IHRcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICAnYSB0XG4gICAgLT4gJ2EgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdhIC0+ICdhIC0+IGJvb2wpXG4gICAgLT4gKGtleSwgJ2EpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICAnYSB0XG4gICAgLT4gJ2EgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdhIC0+ICdhIC0+IGJvb2wpXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+IChrZXksICdhKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgbWluX2VsdCA6ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogJ2EgdCAtPiBrZXkgKiAnYVxuICB2YWwgbWF4X2VsdCA6ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogJ2EgdCAtPiBrZXkgKiAnYVxuICB2YWwgZm9yX2FsbCA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBib29sKSAtPiBpbnRcbiAgdmFsIHNwbGl0IDogJ2EgdCAtPiBrZXkgLT4gJ2EgdCAqIChrZXkgKiAnYSkgb3B0aW9uICogJ2EgdFxuXG4gIHZhbCBhcHBlbmRcbiAgICA6ICBsb3dlcl9wYXJ0OidhIHRcbiAgICAtPiB1cHBlcl9wYXJ0OidhIHRcbiAgICAtPiBbIGBPayBvZiAnYSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXVxuXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogICdhIHRcbiAgICAtPiBsb3dlcl9ib3VuZDprZXkgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOmtleSBNYXliZV9ib3VuZC50XG4gICAgLT4gJ2EgdFxuXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogICdhIHRcbiAgICAtPiBtaW46a2V5XG4gICAgLT4gbWF4OmtleVxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gJ2JcblxuICB2YWwgcmFuZ2VfdG9fYWxpc3QgOiAnYSB0IC0+IG1pbjprZXkgLT4gbWF4OmtleSAtPiAoa2V5ICogJ2EpIGxpc3RcblxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICAnYSB0XG4gICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgIC0+IGtleVxuICAgIC0+IChrZXkgKiAnYSkgb3B0aW9uXG5cbiAgdmFsIG50aCA6ICdhIHQgLT4gaW50IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gIHZhbCBudGhfZXhuIDogJ2EgdCAtPiBpbnQgLT4ga2V5ICogJ2FcbiAgdmFsIHJhbmsgOiBfIHQgLT4ga2V5IC0+IGludCBvcHRpb25cbiAgdmFsIHRvX3RyZWUgOiAnYSB0IC0+ICdhIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86a2V5XG4gICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzprZXlcbiAgICAtPiAnYSB0XG4gICAgLT4gKGtleSAqICdhKSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAnYSB0XG4gICAgLT4gY29tcGFyZTooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAoa2V5ICogJ2EpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICdhIHRcbiAgICAtPiBzZWdtZW50X29mOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAoa2V5ICogJ2EpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAgJ2EgdFxuICAgIC0+IGNvbXBhcmU6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYm91bmQgLT4gaW50KVxuICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiAnYSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMiA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAoJ2EsICdiKSB0cmVlXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGludmFyaWFudHMgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBpc19lbXB0eSA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6IChfLCBfKSB0IC0+IGludFxuICB2YWwgYWRkIDogKCdhLCAnYikgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiKSB0IE9yX2R1cGxpY2F0ZS50XG4gIHZhbCBhZGRfZXhuIDogKCdhLCAnYikgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiKSB0XG4gIHZhbCBzZXQgOiAoJ2EsICdiKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGFkZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCkgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiIGxpc3QpIHRcbiAgdmFsIHJlbW92ZV9tdWx0aSA6ICgnYSwgJ2IgbGlzdCkgdCAtPiAnYSAtPiAoJ2EsICdiIGxpc3QpIHRcbiAgdmFsIGZpbmRfbXVsdGkgOiAoJ2EsICdiIGxpc3QpIHQgLT4gJ2EgLT4gJ2IgbGlzdFxuICB2YWwgY2hhbmdlIDogKCdhLCAnYikgdCAtPiAnYSAtPiBmOignYiBvcHRpb24gLT4gJ2Igb3B0aW9uKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCB1cGRhdGUgOiAoJ2EsICdiKSB0IC0+ICdhIC0+IGY6KCdiIG9wdGlvbiAtPiAnYikgLT4gKCdhLCAnYikgdFxuICB2YWwgZmluZCA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gJ2Igb3B0aW9uXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gJ2JcbiAgdmFsIHJlbW92ZSA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gKCdhLCAnYikgdFxuICB2YWwgbWVtIDogKCdhLCAnYikgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAnYikgdCAtPiBmOignYiAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICgnYSwgJ2MpIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIG1hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gJ2MpIC0+ICgnYSwgJ2MpIHRcbiAgdmFsIG1hcGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjKSAtPiAoJ2EsICdjKSB0XG4gIHZhbCBmb2xkIDogKCdhLCAnYikgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdrLCAndikgdFxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAoJ2EsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgJ2IpIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZDJcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gKCdhLCAnYykgdFxuICAgIC0+IGluaXQ6J2RcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2QgLT4gJ2QpXG4gICAgLT4gJ2RcblxuICB2YWwgZmlsdGVyX2tleXMgOiAoJ2EsICdiKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuICB2YWwgZmlsdGVyaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gJ2Mgb3B0aW9uKSAtPiAoJ2EsICdjKSB0XG4gIHZhbCBmaWx0ZXJfbWFwaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2Mgb3B0aW9uKSAtPiAoJ2EsICdjKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MpIHQgKiAoJ2EsICdkKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICgnYywgJ2QpIEVpdGhlci50KSAtPiAoJ2EsICdjKSB0ICogKCdhLCAnZCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYikgdCAqICgnYSwgJ2IpIHRcblxuICB2YWwgcGFydGl0aW9uX3RmIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0ICogKCdhLCAnYikgdFxuICB2YWwgY29tYmluZV9lcnJvcnMgOiAoJ2EsICdiIE9yX2Vycm9yLnQpIHQgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYiAtPiAnYiAtPiBpbnQpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogKCdiIC0+ICdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBib29sXG4gIHZhbCBrZXlzIDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIGRhdGEgOiAoXywgJ2IpIHQgLT4gJ2IgbGlzdFxuICB2YWwgdG9fYWxpc3QgOiA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdIC0+ICgnYSwgJ2IpIHQgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgbWVyZ2VcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gKCdhLCAnYykgdFxuICAgIC0+IGY6KGtleTonYSAtPiAoJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2Qgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2QpIHRcblxuICB2YWwgbWVyZ2Vfc2tld2VkXG4gICAgOiAgKCdrLCAndikgdFxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICAtPiBjb21iaW5lOihrZXk6J2sgLT4gJ3YgLT4gJ3YgLT4gJ3YpXG4gICAgLT4gKCdrLCAndikgdFxuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgbWluX2VsdCA6ICgnYSwgJ2IpIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsICdiKSB0IC0+ICdhICogJ2JcbiAgdmFsIG1heF9lbHQgOiAoJ2EsICdiKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCAnYikgdCAtPiAnYSAqICdiXG4gIHZhbCBmb3JfYWxsIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgc3BsaXQgOiAoJ2EsICdiKSB0IC0+ICdhIC0+ICgnYSwgJ2IpIHQgKiAoJ2EgKiAnYikgb3B0aW9uICogKCdhLCAnYikgdFxuXG4gIHZhbCBhcHBlbmRcbiAgICA6ICBsb3dlcl9wYXJ0OignYSwgJ2IpIHRcbiAgICAtPiB1cHBlcl9wYXJ0OignYSwgJ2IpIHRcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXVxuXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBsb3dlcl9ib3VuZDonYSBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2EgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnYSwgJ2IpIHRcblxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gbWluOidhXG4gICAgLT4gbWF4OidhXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIHJhbmdlX3RvX2FsaXN0IDogKCdhLCAnYikgdCAtPiBtaW46J2EgLT4gbWF4OidhIC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAtPiAnYVxuICAgIC0+ICgnYSAqICdiKSBvcHRpb25cblxuICB2YWwgbnRoIDogKCdhLCAnYikgdCAtPiBpbnQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbnRoX2V4biA6ICgnYSwgJ2IpIHQgLT4gaW50IC0+ICdhICogJ2JcbiAgdmFsIHJhbmsgOiAoJ2EsIF8pIHQgLT4gJ2EgLT4gaW50IG9wdGlvblxuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICgnaywgJ3YpIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICgnaywgJ3YpIHRcbiAgICAtPiBzZWdtZW50X29mOihrZXk6J2sgLT4gZGF0YTondiAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogICgnaywgJ3YpIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYm91bmQgLT4gaW50KVxuICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2KSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0cmVlXG5cbiAgdmFsIGludmFyaWFudHMgOiAoXywgXywgXykgdCAtPiBib29sXG4gIHZhbCBpc19lbXB0eSA6IChfLCBfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6IChfLCBfLCBfKSB0IC0+IGludFxuICB2YWwgYWRkIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2R1cGxpY2F0ZS50XG4gIHZhbCBhZGRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBzZXQgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIGFkZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcbiAgdmFsIHJlbW92ZV9tdWx0aSA6ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcbiAgdmFsIGZpbmRfbXVsdGkgOiAoJ2EsICdiIGxpc3QsICdjbXApIHQgLT4gJ2EgLT4gJ2IgbGlzdFxuICB2YWwgY2hhbmdlIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiBmOignYiBvcHRpb24gLT4gJ2Igb3B0aW9uKSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCB1cGRhdGUgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+IGY6KCdiIG9wdGlvbiAtPiAnYikgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgZmluZCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gJ2Igb3B0aW9uXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gJ2JcbiAgdmFsIHJlbW92ZSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgbWVtIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2EsIF8sICdjbXApIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIG1hcCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gJ2MpIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgdmFsIG1hcGkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjKSAtPiAoJ2EsICdjLCAnY21wKSB0XG4gIHZhbCBmb2xkIDogKCdhLCAnYiwgXykgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAoJ2EsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgJ2IsIF8pIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZDJcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGluaXQ6J2RcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2QgLT4gJ2QpXG4gICAgLT4gJ2RcblxuICB2YWwgZmlsdGVyX2tleXMgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgZmlsdGVyaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gJ2Mgb3B0aW9uKSAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlcl9tYXBpXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIG9wdGlvbilcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHQgKiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdCAqICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgKiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgKiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGNvbWJpbmVfZXJyb3JzIDogKCdhLCAnYiBPcl9lcnJvci50LCAnY21wKSB0IC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2IgLT4gJ2IgLT4gaW50KSAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6ICgnYiAtPiAnYiAtPiBib29sKSAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gYm9vbFxuICB2YWwga2V5cyA6ICgnYSwgXywgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCBkYXRhIDogKF8sICdiLCBfKSB0IC0+ICdiIGxpc3RcblxuICB2YWwgdG9fYWxpc3RcbiAgICA6ICA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gKCdhLCAnYiwgXykgdFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIG1lcmdlXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gKCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIG9wdGlvbilcbiAgICAtPiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIG1lcmdlX3NrZXdlZFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tYmluZTooa2V5OidrIC0+ICd2IC0+ICd2IC0+ICd2KVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIG1pbl9lbHQgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAqICdiXG4gIHZhbCBtYXhfZWx0IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgKiAnYlxuICB2YWwgZm9yX2FsbCA6IChfLCAnYiwgXykgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnYSwgJ2IsIF8pIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKF8sICdiLCBfKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAoJ2EsICdiLCBfKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKF8sICdiLCBfKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogKCdhLCAnYiwgXykgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBpbnRcblxuICB2YWwgc3BsaXRcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gJ2tcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrICogJ3YpIG9wdGlvbiAqICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgYXBwZW5kXG4gICAgOiAgbG93ZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gdXBwZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF1cblxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gbG93ZXJfYm91bmQ6J2sgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidrIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAgKCdhLCAnYiwgXykgdFxuICAgIC0+IG1pbjonYVxuICAgIC0+IG1heDonYVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCByYW5nZV90b19hbGlzdCA6ICgnYSwgJ2IsIF8pIHQgLT4gbWluOidhIC0+IG1heDonYSAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogICgnYSwgJ2IsIF8pIHRcbiAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EgKiAnYikgb3B0aW9uXG5cbiAgdmFsIG50aCA6ICgnYSwgJ2IsIF8pIHQgLT4gaW50IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG50aF9leG4gOiAoJ2EsICdiLCBfKSB0IC0+IGludCAtPiAnYSAqICdiXG4gIHZhbCByYW5rIDogKCdhLCBfLCBfKSB0IC0+ICdhIC0+IGludCBvcHRpb25cbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSwgJ2IsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnYiwgXykgdFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gc2VnbWVudF9vZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2JvdW5kIC0+IGludClcbiAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2IsICdjbXApIHRyZWVcblxuICB2YWwgaW52YXJpYW50cyA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBpc19lbXB0eSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBpbnRcblxuICB2YWwgYWRkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBrZXk6J2FcbiAgICAtPiBkYXRhOidiXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9kdXBsaWNhdGUudFxuXG4gIHZhbCBhZGRfZXhuXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBrZXk6J2FcbiAgICAtPiBkYXRhOidiXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBzZXRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGtleTonYVxuICAgIC0+IGRhdGE6J2JcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGFkZF9tdWx0aVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcbiAgICAtPiBrZXk6J2FcbiAgICAtPiBkYXRhOidiXG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgdmFsIHJlbW92ZV9tdWx0aVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gIHZhbCBmaW5kX211bHRpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gJ2IgbGlzdFxuXG4gIHZhbCBjaGFuZ2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gZjooJ2Igb3B0aW9uIC0+ICdiIG9wdGlvbilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIHVwZGF0ZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiBmOignYiBvcHRpb24gLT4gJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmaW5kIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+ICdiIG9wdGlvblxuICB2YWwgZmluZF9leG4gOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gJ2JcblxuICB2YWwgcmVtb3ZlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgbWVtIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGl0ZXJfa2V5cyA6ICgnYSwgXywgJ2NtcCkgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICB2YWwgaXRlcjJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIG1hcCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gJ2MpIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgdmFsIG1hcGkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjKSAtPiAoJ2EsICdjLCAnY21wKSB0XG4gIHZhbCBmb2xkIDogKCdhLCAnYiwgXykgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAoJ2EsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgJ2IsIF8pIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZDJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBpbml0OidkXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIC0+ICdkKVxuICAgIC0+ICdkXG5cbiAgdmFsIGZpbHRlcl9rZXlzXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYSAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgZmlsdGVyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgZmlsdGVyaVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlcl9tYXBcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+ICdjIG9wdGlvbilcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlcl9tYXBpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyBvcHRpb24pXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdCAqICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX21hcFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdCAqICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0ICogKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCAqICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgY29tYmluZV9lcnJvcnNcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiBPcl9lcnJvci50LCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIGNvbXBhcmVfZGlyZWN0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYiAtPiAnYiAtPiBpbnQpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBpbnRcblxuICB2YWwgZXF1YWxcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBib29sXG5cbiAgdmFsIGtleXMgOiAoJ2EsIF8sIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgZGF0YSA6IChfLCAnYiwgXykgdCAtPiAnYiBsaXN0XG5cbiAgdmFsIHRvX2FsaXN0XG4gICAgOiAgP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ICgnYSwgJ2IsIF8pIHRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBtZXJnZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiAoJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2Qgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgbWVyZ2Vfc2tld2VkXG4gICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tYmluZTooa2V5OidrIC0+ICd2IC0+ICd2IC0+ICd2KVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgbWluX2VsdCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhICogJ2JcbiAgdmFsIG1heF9lbHQgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAqICdiXG4gIHZhbCBmb3JfYWxsIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGludFxuXG4gIHZhbCBzcGxpdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0ICogKCdhICogJ2IpIG9wdGlvbiAqICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgYXBwZW5kXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+IGxvd2VyX3BhcnQ6KCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IHVwcGVyX3BhcnQ6KCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdXG5cbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBsb3dlcl9ib3VuZDonYSBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2EgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IG1pbjonYVxuICAgIC0+IG1heDonYVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCByYW5nZV90b19hbGlzdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gbWluOidhXG4gICAgLT4gbWF4OidhXG4gICAgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAtPiAnYVxuICAgIC0+ICgnYSAqICdiKSBvcHRpb25cblxuICB2YWwgbnRoIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBpbnQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbnRoX2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gaW50IC0+ICdhICogJ2JcbiAgdmFsIHJhbmsgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gaW50IG9wdGlvblxuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhLCAnYiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBzZWdtZW50X29mOihrZXk6J2sgLT4gZGF0YTondiAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2JvdW5kIC0+IGludClcbiAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuZW5kXG5cbigqKiBDb25zaXN0ZW5jeSBjaGVja3MgKHNhbWUgYXMgaW4gW0NvbnRhaW5lcl0pLiAqKVxubW9kdWxlIENoZWNrX2FjY2Vzc29yc1xuICAgIChUIDogVDMpXG4gICAgKFRyZWUgOiBUMylcbiAgICAoS2V5IDogVDEpXG4gICAgKENtcCA6IFQxKVxuICAgIChPcHRpb25zIDogVDMpXG4gICAgKF8gOiBBY2Nlc3NvcnNfZ2VuZXJpY1xuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIE9wdGlvbnMudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIFQudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIFRyZWUudFxuICAgICB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIEtleS50XG4gICAgIHdpdGggdHlwZSAnY21wIGNtcCA6PSAnY21wIENtcC50KSA9XG5zdHJ1Y3QgZW5kXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMxIChNIDogQWNjZXNzb3JzMSkgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gJ2IgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAnYiBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5rZXlcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczIgKE0gOiBBY2Nlc3NvcnMyKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMyAoTSA6IEFjY2Vzc29yczMpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yIChNIDogQWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKFdpdGhfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IHNpZ1xuICB0eXBlICgnaywgJ3YsICdjbXApIHRcbiAgdHlwZSAoJ2ssICd2LCAnY21wKSB0cmVlXG4gIHR5cGUgJ2sga2V5XG4gIHR5cGUgKCdhLCAnY21wLCAneikgb3B0aW9uc1xuICB0eXBlICdjbXAgY21wXG5cbiAgdmFsIGVtcHR5IDogKCdrLCAnY21wLCAoJ2ssIF8sICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHNpbmdsZXRvbiA6ICgnaywgJ2NtcCwgJ2sga2V5IC0+ICd2IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgbWFwX2tleXNcbiAgICA6ICggJ2syXG4gICAgICAsICdjbXAyXG4gICAgICAsICgnazEsICd2LCAnY21wMSkgdFxuICAgICAgLT4gZjooJ2sxIGtleSAtPiAnazIga2V5KVxuICAgICAgLT4gWyBgT2sgb2YgKCdrMiwgJ3YsICdjbXAyKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2syIGtleSBdIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBtYXBfa2V5c19leG5cbiAgICA6ICggJ2syXG4gICAgICAsICdjbXAyXG4gICAgICAsICgnazEsICd2LCAnY21wMSkgdCAtPiBmOignazEga2V5IC0+ICdrMiBrZXkpIC0+ICgnazIsICd2LCAnY21wMikgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5XG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgYXJyYXkgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWRcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBhcnJheSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAoJ2ssICdjbXAsIGxlbjppbnQgLT4gZjooaW50IC0+ICdrIGtleSAqICd2KSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0XG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrIGtleSAqICd2KSBsaXN0IC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnayBrZXkgXSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3JcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBsaXN0IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9leG4gOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgbGlzdCAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBvZl9hbGlzdF9tdWx0aSA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBsaXN0IC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9mb2xkXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrIGtleSAqICd2MSkgbGlzdCAtPiBpbml0Oid2MiAtPiBmOigndjIgLT4gJ3YxIC0+ICd2MikgLT4gKCdrLCAndjIsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X3JlZHVjZVxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGxpc3QgLT4gZjooJ3YgLT4gJ3YgLT4gJ3YpIC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZVxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnayBrZXkgXVxuICAgICAgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlX29yX2Vycm9yXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2VfZXhuIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZV9tdWx0aVxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlX2ZvbGRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2sga2V5ICogJ3YxKSBTZXF1ZW5jZS50XG4gICAgICAtPiBpbml0Oid2MlxuICAgICAgLT4gZjooJ3YyIC0+ICd2MSAtPiAndjIpXG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2VfcmVkdWNlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+IGY6KCd2IC0+ICd2IC0+ICd2KSAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9pdGVyaVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsIGl0ZXJpOihmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAgIC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnayBrZXkgXSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2ZfaXRlcmlfZXhuXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgaXRlcmk6KGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0KSAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl90cmVlIDogKCdrLCAnY21wLCAoJ2sga2V5LCAndiwgJ2NtcCkgdHJlZSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMxID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlICdhIHRyZWVcbiAgdHlwZSBrZXlcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgZW1wdHkgOiBfIHRcbiAgdmFsIHNpbmdsZXRvbiA6IGtleSAtPiAnYSAtPiAnYSB0XG4gIHZhbCBtYXBfa2V5cyA6ICd2IHQgLT4gZjooa2V5IC0+IGtleSkgLT4gWyBgT2sgb2YgJ3YgdCB8IGBEdXBsaWNhdGVfa2V5IG9mIGtleSBdXG4gIHZhbCBtYXBfa2V5c19leG4gOiAndiB0IC0+IGY6KGtleSAtPiBrZXkpIC0+ICd2IHRcbiAgdmFsIG9mX2FsaXN0IDogKGtleSAqICdhKSBsaXN0IC0+IFsgYE9rIG9mICdhIHQgfCBgRHVwbGljYXRlX2tleSBvZiBrZXkgXVxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3IgOiAoa2V5ICogJ2EpIGxpc3QgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9hbGlzdF9leG4gOiAoa2V5ICogJ2EpIGxpc3QgLT4gJ2EgdFxuICB2YWwgb2ZfYWxpc3RfbXVsdGkgOiAoa2V5ICogJ2EpIGxpc3QgLT4gJ2EgbGlzdCB0XG4gIHZhbCBvZl9hbGlzdF9mb2xkIDogKGtleSAqICdhKSBsaXN0IC0+IGluaXQ6J2IgLT4gZjooJ2IgLT4gJ2EgLT4gJ2IpIC0+ICdiIHRcbiAgdmFsIG9mX2FsaXN0X3JlZHVjZSA6IChrZXkgKiAnYSkgbGlzdCAtPiBmOignYSAtPiAnYSAtPiAnYSkgLT4gJ2EgdFxuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogKGtleSAqICdhKSBhcnJheSAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiAoa2V5ICogJ2EpIGFycmF5IC0+ICdhIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIDogbGVuOmludCAtPiBmOihpbnQgLT4ga2V5ICogJ2EpIC0+ICdhIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfc2VxdWVuY2UgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zZXF1ZW5jZSA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiBbIGBPayBvZiAnYSB0IHwgYER1cGxpY2F0ZV9rZXkgb2Yga2V5IF1cbiAgdmFsIG9mX3NlcXVlbmNlX29yX2Vycm9yIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc2VxdWVuY2VfZXhuIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+ICdhIHRcbiAgdmFsIG9mX3NlcXVlbmNlX211bHRpIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+ICdhIGxpc3QgdFxuICB2YWwgb2Zfc2VxdWVuY2VfZm9sZCA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiBpbml0OidiIC0+IGY6KCdiIC0+ICdhIC0+ICdiKSAtPiAnYiB0XG4gIHZhbCBvZl9zZXF1ZW5jZV9yZWR1Y2UgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gZjooJ2EgLT4gJ2EgLT4gJ2EpIC0+ICdhIHRcblxuICB2YWwgb2ZfaXRlcmlcbiAgICA6ICBpdGVyaTooZjooa2V5OmtleSAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gWyBgT2sgb2YgJ3YgdCB8IGBEdXBsaWNhdGVfa2V5IG9mIGtleSBdXG5cbiAgdmFsIG9mX2l0ZXJpX2V4biA6IGl0ZXJpOihmOihrZXk6a2V5IC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdCkgLT4gJ3YgdFxuICB2YWwgb2ZfdHJlZSA6ICdhIHRyZWUgLT4gJ2EgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMiA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAoJ2EsICdiKSB0cmVlXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGVtcHR5IDogKF8sIF8pIHRcbiAgdmFsIHNpbmdsZXRvbiA6ICdhIC0+ICdiIC0+ICgnYSwgJ2IpIHRcblxuICB2YWwgbWFwX2tleXNcbiAgICA6ICAoJ2sxLCAndikgdFxuICAgIC0+IGY6KCdrMSAtPiAnazIpXG4gICAgLT4gWyBgT2sgb2YgKCdrMiwgJ3YpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnazIgXVxuXG4gIHZhbCBtYXBfa2V5c19leG4gOiAoJ2sxLCAndikgdCAtPiBmOignazEgLT4gJ2syKSAtPiAoJ2syLCAndikgdFxuICB2YWwgb2ZfYWxpc3QgOiAoJ2EgKiAnYikgbGlzdCAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3IgOiAoJ2EgKiAnYikgbGlzdCAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX2FsaXN0X2V4biA6ICgnYSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX2FsaXN0X211bHRpIDogKCdhICogJ2IpIGxpc3QgLT4gKCdhLCAnYiBsaXN0KSB0XG4gIHZhbCBvZl9hbGlzdF9mb2xkIDogKCdhICogJ2IpIGxpc3QgLT4gaW5pdDonYyAtPiBmOignYyAtPiAnYiAtPiAnYykgLT4gKCdhLCAnYykgdFxuICB2YWwgb2ZfYWxpc3RfcmVkdWNlIDogKCdhICogJ2IpIGxpc3QgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6ICgnYSAqICdiKSBhcnJheSAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiAoJ2EgKiAnYikgYXJyYXkgLT4gKCdhLCAnYikgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgOiBsZW46aW50IC0+IGY6KGludCAtPiAnYSAqICdiKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zZXF1ZW5jZSA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG4gIHZhbCBvZl9zZXF1ZW5jZV9vcl9lcnJvciA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc2VxdWVuY2VfZXhuIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gKCdhLCAnYikgdFxuICB2YWwgb2Zfc2VxdWVuY2VfbXVsdGkgOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiAoJ2EsICdiIGxpc3QpIHRcblxuICB2YWwgb2Zfc2VxdWVuY2VfZm9sZFxuICAgIDogICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICdiIC0+ICdjKVxuICAgIC0+ICgnYSwgJ2MpIHRcblxuICB2YWwgb2Zfc2VxdWVuY2VfcmVkdWNlIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpIC0+ICgnYSwgJ2IpIHRcblxuICB2YWwgb2ZfaXRlcmlcbiAgICA6ICBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gIHZhbCBvZl9pdGVyaV9leG4gOiBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdCkgLT4gKCdhLCAnYikgdFxuICB2YWwgb2ZfdHJlZSA6ICgnYSwgJ2IpIHRyZWUgLT4gKCdhLCAnYikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBlbXB0eSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCBfLCAnY21wKSB0XG4gIHZhbCBzaW5nbGV0b24gOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIC0+ICdiIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgbWFwX2tleXNcbiAgICA6ICBjb21wYXJhdG9yOignazIsICdjbXAyKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2sxLCAndiwgJ2NtcDEpIHRcbiAgICAtPiBmOignazEgLT4gJ2syKVxuICAgIC0+IFsgYE9rIG9mICgnazIsICd2LCAnY21wMikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrMiBdXG5cbiAgdmFsIG1hcF9rZXlzX2V4blxuICAgIDogIGNvbXBhcmF0b3I6KCdrMiwgJ2NtcDIpIENvbXBhcmF0b3IudFxuICAgIC0+ICgnazEsICd2LCAnY21wMSkgdFxuICAgIC0+IGY6KCdrMSAtPiAnazIpXG4gICAgLT4gKCdrMiwgJ3YsICdjbXAyKSB0XG5cbiAgdmFsIG9mX2FsaXN0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3JcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2ZfYWxpc3RfZXhuXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9hbGlzdF9tdWx0aVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9hbGlzdF9mb2xkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICdiIC0+ICdjKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgb2ZfYWxpc3RfcmVkdWNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGFycmF5XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGFycmF5XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gZjooaW50IC0+ICdhICogJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX3NlcXVlbmNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICB2YWwgb2Zfc2VxdWVuY2Vfb3JfZXJyb3JcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2Zfc2VxdWVuY2VfZXhuXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9tdWx0aVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9mb2xkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICdiIC0+ICdjKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgb2Zfc2VxdWVuY2VfcmVkdWNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9pdGVyaVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gIHZhbCBvZl9pdGVyaV9leG5cbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl90cmVlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRyZWVcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5lbmRcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzXG4gICAgKFQgOiBUMylcbiAgICAoVHJlZSA6IFQzKVxuICAgIChLZXkgOiBUMSlcbiAgICAoQ21wIDogVDEpXG4gICAgKE9wdGlvbnMgOiBUMylcbiAgICAoXyA6IENyZWF0b3JzX2dlbmVyaWNcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBPcHRpb25zLnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSBULnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSBUcmVlLnRcbiAgICAgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBLZXkudFxuICAgICB3aXRoIHR5cGUgJ2EgY21wIDo9ICdhIENtcC50KSA9XG5zdHJ1Y3QgZW5kXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczEgKE0gOiBDcmVhdG9yczEpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gJ2IgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAnYiBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5rZXlcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMiAoTSA6IENyZWF0b3JzMikgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvciAoTSA6IENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3IpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoV2l0aF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzX2dlbmVyaWMgPSBzaWdcbiAgaW5jbHVkZSBDcmVhdG9yc19nZW5lcmljXG5cbiAgaW5jbHVkZVxuICAgIEFjY2Vzc29yc19nZW5lcmljXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSB0cmVlXG4gICAgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBrZXlcbiAgICB3aXRoIHR5cGUgJ2EgY21wIDo9ICdhIGNtcFxuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxID0gc2lnXG4gIGluY2x1ZGUgQ3JlYXRvcnMxXG5cbiAgaW5jbHVkZVxuICAgIEFjY2Vzc29yczFcbiAgICB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gICAgd2l0aCB0eXBlICdhIHRyZWUgOj0gJ2EgdHJlZVxuICAgIHdpdGggdHlwZSBrZXkgOj0ga2V5XG4gICAgd2l0aCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA6PSBjb21wYXJhdG9yX3dpdG5lc3NcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMiA9IHNpZ1xuICBpbmNsdWRlIENyZWF0b3JzMlxuXG4gIGluY2x1ZGVcbiAgICBBY2Nlc3NvcnMyXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIHRyZWVcbiAgICB3aXRoIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzIDo9IGNvbXBhcmF0b3Jfd2l0bmVzc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICBpbmNsdWRlIENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3JcblxuICBpbmNsdWRlXG4gICAgQWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3JcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIHRyZWVcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX3BvbHkgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMlxuXG5tb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBzaWdcbiAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gIG1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gICAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgaW5jbHVkZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgOj0gdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gICAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgQ29tcGFyZV9tID0gc2lnIGVuZFxuICBtb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxuICBtb2R1bGUgdHlwZSBIYXNoX2ZvbGRfbSA9IEhhc2hlci5TXG5cbiAgdmFsIHNleHBfb2ZfbV9fdFxuICAgIDogIChtb2R1bGUgU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gKCd2IC0+IFNleHAudClcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gU2V4cC50XG5cbiAgdmFsIG1fX3Rfb2Zfc2V4cFxuICAgIDogIChtb2R1bGUgTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gJ2sgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gJ2NtcClcbiAgICAtPiAoU2V4cC50IC0+ICd2KVxuICAgIC0+IFNleHAudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgbV9fdF9zZXhwX2dyYW1tYXJcbiAgICA6ICAobW9kdWxlIE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gJ3YgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgdmFsIGNvbXBhcmVfbV9fdFxuICAgIDogIChtb2R1bGUgQ29tcGFyZV9tKVxuICAgIC0+ICgndiAtPiAndiAtPiBpbnQpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBpbnRcblxuICB2YWwgZXF1YWxfbV9fdFxuICAgIDogIChtb2R1bGUgRXF1YWxfbSlcbiAgICAtPiAoJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGJvb2xcblxuICB2YWwgaGFzaF9mb2xkX21fX3RcbiAgICA6ICAobW9kdWxlIEhhc2hfZm9sZF9tIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gKEhhc2guc3RhdGUgLT4gJ3YgLT4gSGFzaC5zdGF0ZSlcbiAgICAtPiBIYXNoLnN0YXRlXG4gICAgLT4gKCdrLCAndiwgXykgdFxuICAgIC0+IEhhc2guc3RhdGVcbmVuZFxuXG5tb2R1bGUgdHlwZSBNYXAgPSBzaWdcbiAgKCoqIFtNYXBdIGlzIGEgZnVuY3Rpb25hbCBkYXRhIHN0cnVjdHVyZSAoYmFsYW5jZWQgYmluYXJ5IHRyZWUpIGltcGxlbWVudGluZyBmaW5pdGUgbWFwc1xuICAgICAgb3ZlciBhIHRvdGFsbHktb3JkZXJlZCBkb21haW4sIGNhbGxlZCBhIFwia2V5XCIuICopXG5cbiAgdHlwZSAoJ2tleSwgKyd2YWx1ZSwgJ2NtcCkgdFxuXG4gIG1vZHVsZSBPcl9kdXBsaWNhdGUgPSBPcl9kdXBsaWNhdGVcbiAgbW9kdWxlIENvbnRpbnVlX29yX3N0b3AgPSBDb250aW51ZV9vcl9zdG9wXG5cbiAgbW9kdWxlIEZpbmlzaGVkX29yX3VuZmluaXNoZWQgOiBzaWdcbiAgICB0eXBlIHQgPSBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnQgPVxuICAgICAgfCBGaW5pc2hlZFxuICAgICAgfCBVbmZpbmlzaGVkXG4gICAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVudW1lcmF0ZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuICAgIGluY2x1ZGUgUHB4X2VudW1lcmF0ZV9saWIuRW51bWVyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5FcXVhbC5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgICgqKiBNYXBzIFtDb250aW51ZV0gdG8gW0ZpbmlzaGVkXSBhbmQgW1N0b3BdIHRvIFtVbmZpbmlzaGVkXS4gKilcbiAgICB2YWwgb2ZfY29udGludWVfb3Jfc3RvcCA6IENvbnRpbnVlX29yX3N0b3AudCAtPiB0XG5cbiAgICAoKiogTWFwcyBbRmluaXNoZWRdIHRvIFtDb250aW51ZV0gYW5kIFtVbmZpbmlzaGVkXSB0byBbU3RvcF0uICopXG4gICAgdmFsIHRvX2NvbnRpbnVlX29yX3N0b3AgOiB0IC0+IENvbnRpbnVlX29yX3N0b3AudFxuICBlbmRcblxuICBtb2R1bGUgTWVyZ2VfZWxlbWVudCA6IHNpZ1xuICAgIHR5cGUgKCdsZWZ0LCAncmlnaHQpIHQgPVxuICAgICAgWyBgTGVmdCBvZiAnbGVmdFxuICAgICAgfCBgUmlnaHQgb2YgJ3JpZ2h0XG4gICAgICB8IGBCb3RoIG9mICdsZWZ0ICogJ3JpZ2h0XG4gICAgICBdXG4gICAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwX29mXVxuXG4gICAgdmFsIGNvbXBhcmVcbiAgICAgIDogICgnbGVmdCAtPiAnbGVmdCAtPiBpbnQpXG4gICAgICAtPiAoJ3JpZ2h0IC0+ICdyaWdodCAtPiBpbnQpXG4gICAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+IGludFxuXG4gICAgdmFsIGVxdWFsXG4gICAgICA6ICAoJ2xlZnQgLT4gJ2xlZnQgLT4gYm9vbClcbiAgICAgIC0+ICgncmlnaHQgLT4gJ3JpZ2h0IC0+IGJvb2wpXG4gICAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+IGJvb2xcblxuICAgIHZhbCBzZXhwX29mX3RcbiAgICAgIDogICgnbGVmdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ3JpZ2h0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICB2YWwgbGVmdCA6ICgnbGVmdCwgXykgdCAtPiAnbGVmdCBvcHRpb25cbiAgICB2YWwgcmlnaHQgOiAoXywgJ3JpZ2h0KSB0IC0+ICdyaWdodCBvcHRpb25cbiAgICB2YWwgbGVmdF92YWx1ZSA6ICgnbGVmdCwgXykgdCAtPiBkZWZhdWx0OidsZWZ0IC0+ICdsZWZ0XG4gICAgdmFsIHJpZ2h0X3ZhbHVlIDogKF8sICdyaWdodCkgdCAtPiBkZWZhdWx0OidyaWdodCAtPiAncmlnaHRcblxuICAgIHZhbCB2YWx1ZXNcbiAgICAgIDogICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiBsZWZ0X2RlZmF1bHQ6J2xlZnRcbiAgICAgIC0+IHJpZ2h0X2RlZmF1bHQ6J3JpZ2h0XG4gICAgICAtPiAnbGVmdCAqICdyaWdodFxuICBlbmRcblxuICB0eXBlICgnaywgJ2NtcCkgY29tcGFyYXRvciA9ICgnaywgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICBbQEBkZXByZWNhdGVkIFwiW3NpbmNlIDIwMjEtMTJdIHVzZSBbQ29tcGFyYXRvci5Nb2R1bGUudF0gaW5zdGVhZFwiXVxuXG4gICgqKiBUZXN0IGlmIHRoZSBpbnZhcmlhbnRzIG9mIHRoZSBpbnRlcm5hbCBBVkwgc2VhcmNoIHRyZWUgaG9sZC4gKilcbiAgdmFsIGludmFyaWFudHMgOiAoXywgXywgXykgdCAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgYSBmaXJzdC1jbGFzcyBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBvdGhlciBtYXAvc2V0L2V0Yy5cbiAgICAgIHdpdGggdGhlIHNhbWUgbm90aW9uIG9mIGNvbXBhcmlzb24uICopXG4gIHZhbCBjb21wYXJhdG9yX3MgOiAoJ2EsIF8sICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG5cbiAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EsIF8sICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLnRcblxuICAoKiogVGhlIGVtcHR5IG1hcC4gKilcbiAgdmFsIGVtcHR5IDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogQSBtYXAgd2l0aCBvbmUgKGtleSwgZGF0YSkgcGFpci4gKilcbiAgdmFsIHNpbmdsZXRvbiA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSAtPiAnYiAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBsaXN0IHdpdGggdW5pcXVlIGtleXMuICopXG4gIHZhbCBvZl9hbGlzdFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIGxpc3Qgd2l0aCB1bmlxdWUga2V5cywgcmV0dXJuaW5nIGFuIGVycm9yIGlmXG4gICAgICBkdXBsaWNhdGUgWydhXSBrZXlzIGFyZSBmb3VuZC4gKilcbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIGxpc3Qgd2l0aCB1bmlxdWUga2V5cywgcmFpc2luZyBhbiBleGNlcHRpb24gaWZcbiAgICAgIGR1cGxpY2F0ZSBbJ2FdIGtleXMgYXJlIGZvdW5kLiAqKVxuICB2YWwgb2ZfYWxpc3RfZXhuIDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICgnYSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIGxpc3Qgd2l0aCBwb3NzaWJseSByZXBlYXRlZCBrZXlzLiBUaGUgdmFsdWVzIGluXG4gICAgICB0aGUgbWFwIGZvciBhIGdpdmVuIGtleSBhcHBlYXIgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBkaWQgaW4gdGhlIGFzc29jaWF0aW9uXG4gICAgICBsaXN0LiAqKVxuICB2YWwgb2ZfYWxpc3RfbXVsdGlcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gICgqKiBDb21iaW5lcyBhbiBhc3NvY2lhdGlvbiBsaXN0IGludG8gYSBtYXAsIGZvbGRpbmcgdG9nZXRoZXIgYm91bmQgdmFsdWVzIHdpdGggY29tbW9uXG4gICAgICBrZXlzLiBUaGUgYWNjdW11bGF0b3IgaXMgcGVyLWtleS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgIyBsZXQgbWFwID0gU3RyaW5nLk1hcC5vZl9hbGlzdF9mb2xkXG4gICAgICAgICAgICAgICAgICAgICAgWyBcImFcIiwgMTsgXCJhXCIsIDEwOyBcImJcIiwgMjsgXCJiXCIsIDIwOyBcImJcIiwgMjAwIF1cbiAgICAgICAgICAgICAgICAgICAgICB+aW5pdDpJbnQuU2V0LmVtcHR5XG4gICAgICAgICAgICAgICAgICAgICAgfmY6U2V0LmFkZFxuICAgICAgICAgIGluXG4gICAgICAgICAgcHJpbnRfcyBbJXNleHAgKG1hcCA6IEludC5TZXQudCBTdHJpbmcuTWFwLnQpXTs7XG4gICAgICAgICgoYSAoMSAxMCkpIChiICgyIDIwIDIwMCkpKVxuICAgICAgICAtIDogdW5pdCA9ICgpXG4gICAgICBdfVxuICAqKVxuICB2YWwgb2ZfYWxpc3RfZm9sZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICdiIC0+ICdjKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICAoKiogQ29tYmluZXMgYW4gYXNzb2NpYXRpb24gbGlzdCBpbnRvIGEgbWFwLCByZWR1Y2luZyB0b2dldGhlciBib3VuZCB2YWx1ZXMgd2l0aCBjb21tb25cbiAgICAgIGtleXMuICopXG4gIHZhbCBvZl9hbGlzdF9yZWR1Y2VcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IGY6KCdiIC0+ICdiIC0+ICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogW29mX2l0ZXJpIH5pdGVyaV0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF0sIGV4Y2VwdCB0aGF0IGluc3RlYWQgb2YgdGFraW5nIGEgY29uY3JldGVcbiAgICAgIGRhdGEgc3RydWN0dXJlLCBpdCB0YWtlcyBhbiBpdGVyYXRpb24gZnVuY3Rpb24uICBGb3IgaW5zdGFuY2UsIHRvIGNvbnZlcnQgYSBzdHJpbmcgdGFibGVcbiAgICAgIGludG8gYSBtYXA6IFtvZl9pdGVyaSAobW9kdWxlIFN0cmluZykgfmY6KEhhc2h0YmwuaXRlcmkgdGFibGUpXS4gIEl0IGlzIGZhc3RlciB0aGFuXG4gICAgICBhZGRpbmcgdGhlIGVsZW1lbnRzIG9uZSBieSBvbmUuICopXG4gIHZhbCBvZl9pdGVyaVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+IGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgKCoqIExpa2UgW29mX2l0ZXJpXSBleGNlcHQgdGhhdCBpdCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGR1cGxpY2F0ZSBbJ2FdIGtleXMgYXJlIGZvdW5kLiAqKVxuICB2YWwgb2ZfaXRlcmlfZXhuXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYSBzb3J0ZWQgYXJyYXkgb2Yga2V5LWRhdGEgcGFpcnMuIFRoZSBpbnB1dCBhcnJheSBtdXN0IGJlIHNvcnRlZFxuICAgICAgKGVpdGhlciBpbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlciksIGFzIGdpdmVuIGJ5IHRoZSByZWxldmFudCBjb21wYXJhdG9yLCBhbmRcbiAgICAgIG11c3Qgbm90IGNvbnRhaW4gZHVwbGljYXRlIGtleXMuIElmIGVpdGhlciBvZiB0aGVzZSBjb25kaXRpb25zIGRvZXMgbm90IGhvbGQsXG4gICAgICBhbiBlcnJvciBpcyByZXR1cm5lZC4gICopXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgYXJyYXlcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogTGlrZSBbb2Zfc29ydGVkX2FycmF5XSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGEgbWFwIHdpdGggYnJva2VuIGludmFyaWFudHMgd2hlbiBhblxuICAgICAgW0Vycm9yXSB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQuICopXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGFycmF5XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBbb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgYyB+bGVuIH5mXSBiZWhhdmVzIGxpa2UgW29mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgY1xuICAgICAgKEFycmF5LmluaXQgbGVuIH5mKV0sIHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhIGRlY3JlYXNpbmcgb3JkZXIgaXMgbm90XG4gICAgICBzdXBwb3J0ZWQuICBUaGUgYWR2YW50YWdlIGlzIG5vdCByZXF1aXJpbmcgeW91IHRvIGFsbG9jYXRlIGFuIGludGVybWVkaWF0ZSBhcnJheS4gIFtmXVxuICAgICAgd2lsbCBiZSBjYWxsZWQgd2l0aCAwLCAxLCAuLi4gW2xlbiAtIDFdLCBpbiBvcmRlci4gKilcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IGY6KGludCAtPiAnYSAqICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogW29mX2luY3JlYXNpbmdfc2VxdWVuY2UgYyBzZXFdIGJlaGF2ZXMgbGlrZSBbb2Zfc29ydGVkX2FycmF5IGMgKFNlcXVlbmNlLnRvX2FycmF5XG4gICAgICBzZXEpXSwgYnV0IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgYXJyYXkuXG5cbiAgICAgIFRoZSBzZXF1ZW5jZSB3aWxsIGJlIGZvbGRlZCBvdmVyIG9uY2UsIGFuZCB0aGUgYWRkaXRpb25hbCB0aW1lIGNvbXBsZXhpdHkgaXMge2UgTyhuKX0uXG4gICopXG4gIHZhbCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlXG4gICAgOiAgKCdrLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdrICogJ3YpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIHdpdGggdW5pcXVlIGtleXMuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZSBjIHNlcV0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdCBjIChTZXF1ZW5jZS50b19saXN0IHNlcSldIGJ1dFxuICAgICAgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LlxuXG4gICAgICBJZiB5b3VyIHNlcXVlbmNlIGlzIGluY3JlYXNpbmcsIHVzZSBbb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZV0uXG4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZVxuICAgIDogICgnaywgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnayAqICd2KSBTZXF1ZW5jZS50XG4gICAgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrIF1cblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIHdpdGggdW5pcXVlIGtleXMsIHJldHVybmluZyBhbiBlcnJvciBpZlxuICAgICAgZHVwbGljYXRlIFsnYV0ga2V5cyBhcmUgZm91bmQuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZV9vcl9lcnJvciBjIHNlcV0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF9vcl9lcnJvciBjIChTZXF1ZW5jZS50b19saXN0IHNlcSldXG4gICAgICBidXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LlxuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2Vfb3JfZXJyb3JcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gc2VxdWVuY2Ugd2l0aCB1bmlxdWUga2V5cywgcmFpc2luZyBhbiBleGNlcHRpb24gaWZcbiAgICAgIGR1cGxpY2F0ZSBbJ2FdIGtleXMgYXJlIGZvdW5kLlxuXG4gICAgICBbb2Zfc2VxdWVuY2VfZXhuIGMgc2VxXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0X2V4biBjIChTZXF1ZW5jZS50b19saXN0IHNlcSldIGJ1dFxuICAgICAgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LlxuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2VfZXhuXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSB3aXRoIHBvc3NpYmx5IHJlcGVhdGVkIGtleXMuIFRoZSB2YWx1ZXMgaW5cbiAgICAgIHRoZSBtYXAgZm9yIGEgZ2l2ZW4ga2V5IGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGRpZCBpbiB0aGUgYXNzb2NpYXRpb25cbiAgICAgIGxpc3QuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZV9tdWx0aSBjIHNlcV0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF9leG4gYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpXSBidXRcbiAgICAgIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC5cbiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlX211bHRpXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICAoKiogQ29tYmluZXMgYW4gYXNzb2NpYXRpb24gc2VxdWVuY2UgaW50byBhIG1hcCwgZm9sZGluZyB0b2dldGhlciBib3VuZCB2YWx1ZXMgd2l0aCBjb21tb25cbiAgICAgIGtleXMuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZV9mb2xkIGMgc2VxIH5pbml0IH5mXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0X2ZvbGQgYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpIH5pbml0IH5mXVxuICAgICAgYnV0IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC5cbiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlX2ZvbGRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAnYiAtPiAnYylcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgKCoqIENvbWJpbmVzIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIGludG8gYSBtYXAsIHJlZHVjaW5nIHRvZ2V0aGVyIGJvdW5kIHZhbHVlcyB3aXRoIGNvbW1vblxuICAgICAga2V5cy5cblxuICAgICAgW29mX3NlcXVlbmNlX3JlZHVjZSBjIHNlcSB+Zl0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF9yZWR1Y2UgYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpIH5mXVxuICAgICAgYnV0IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZV9yZWR1Y2VcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IGY6KCdiIC0+ICdiIC0+ICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogVGVzdHMgd2hldGhlciBhIG1hcCBpcyBlbXB0eS4gKilcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8sIF8pIHQgLT4gYm9vbFxuXG4gICgqKiBbbGVuZ3RoIG1hcF0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFttYXBdLiAgTygxKSwgYnV0IFtUcmVlLmxlbmd0aF0gaXNcbiAgICAgIE8obikuICopXG4gIHZhbCBsZW5ndGggOiAoXywgXywgXykgdCAtPiBpbnRcblxuICAoKiogUmV0dXJucyBhIG5ldyBtYXAgd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBiaW5kaW5nOyBpZiB0aGUga2V5IHdhcyBhbHJlYWR5IGJvdW5kLCBpdHNcbiAgICAgIHByZXZpb3VzIGJpbmRpbmcgZGlzYXBwZWFycy4gKilcbiAgdmFsIHNldCA6ICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbYWRkIHQgfmtleSB+ZGF0YV0gYWRkcyBhIG5ldyBlbnRyeSB0byBbdF0gbWFwcGluZyBba2V5XSB0byBbZGF0YV0gYW5kIHJldHVybnMgW2BPa11cbiAgICAgIHdpdGggdGhlIG5ldyBtYXAsIG9yIGlmIFtrZXldIGlzIGFscmVhZHkgcHJlc2VudCBpbiBbdF0sIHJldHVybnMgW2BEdXBsaWNhdGVdLiAqKVxuICB2YWwgYWRkIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2R1cGxpY2F0ZS50XG5cbiAgdmFsIGFkZF9leG4gOiAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogSWYgW2tleV0gaXMgbm90IHByZXNlbnQgdGhlbiBhZGQgYSBzaW5nbGV0b24gbGlzdCwgb3RoZXJ3aXNlLCBjb25zIGRhdGEgb250byB0aGVcbiAgICAgIGhlYWQgb2YgdGhlIGV4aXN0aW5nIGxpc3QuICopXG4gIHZhbCBhZGRfbXVsdGkgOiAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4ga2V5OidrIC0+IGRhdGE6J3YgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0XG5cbiAgKCoqIElmIHRoZSBrZXkgaXMgcHJlc2VudCwgdGhlbiByZW1vdmUgaXRzIGhlYWQgZWxlbWVudDsgaWYgdGhlIHJlc3VsdCBpcyBlbXB0eSwgcmVtb3ZlXG4gICAgICB0aGUga2V5LiAqKVxuICB2YWwgcmVtb3ZlX211bHRpIDogKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+ICdrIC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdFxuXG4gICgqKiBSZXR1cm5zIHRoZSB2YWx1ZSBib3VuZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciB0aGUgZW1wdHkgbGlzdCBpZiB0aGVyZSBpcyBub25lLiAqKVxuICB2YWwgZmluZF9tdWx0aSA6ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiAnayAtPiAndiBsaXN0XG5cbiAgKCoqIFtjaGFuZ2UgdCBrZXkgfmZdIHJldHVybnMgYSBuZXcgbWFwIFttXSB0aGF0IGlzIHRoZSBzYW1lIGFzIFt0XSBvbiBhbGwga2V5cyBleGNlcHRcbiAgICAgIGZvciBba2V5XSwgYW5kIHdob3NlIHZhbHVlIGZvciBba2V5XSBpcyBkZWZpbmVkIGJ5IFtmXSwgaS5lLiwgW2ZpbmQgbSBrZXkgPSBmIChmaW5kXG4gICAgICB0IGtleSldLiAqKVxuICB2YWwgY2hhbmdlIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiBmOigndiBvcHRpb24gLT4gJ3Ygb3B0aW9uKSAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFt1cGRhdGUgdCBrZXkgfmZdIGlzIFtjaGFuZ2UgdCBrZXkgfmY6KGZ1biBvIC0+IFNvbWUgKGYgbykpXS4gKilcbiAgdmFsIHVwZGF0ZSA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gZjooJ3Ygb3B0aW9uIC0+ICd2KSAtPiAoJ2ssICd2LCAnY21wKSB0XG5cblxuICAoKiogUmV0dXJucyBbU29tZSB2YWx1ZV0gYm91bmQgdG8gdGhlIGdpdmVuIGtleSwgb3IgW05vbmVdIGlmIG5vbmUgZXhpc3RzLiAqKVxuICB2YWwgZmluZCA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gJ3Ygb3B0aW9uXG5cbiAgKCoqIFJldHVybnMgdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBnaXZlbiBrZXksIHJhaXNpbmcgW0NhbWwuTm90X2ZvdW5kXSBvciBbTm90X2ZvdW5kX3NdXG4gICAgICBpZiBub25lIGV4aXN0cy4gKilcbiAgdmFsIGZpbmRfZXhuIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiAndlxuXG4gICgqKiBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGFueSBiaW5kaW5nIGZvciB0aGUga2V5IGluIHF1ZXN0aW9uIHJlbW92ZWQuICopXG4gIHZhbCByZW1vdmUgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW21lbSBtYXAga2V5XSB0ZXN0cyB3aGV0aGVyIFttYXBdIGNvbnRhaW5zIGEgYmluZGluZyBmb3IgW2tleV0uICopXG4gIHZhbCBtZW0gOiAoJ2ssIF8sICdjbXApIHQgLT4gJ2sgLT4gYm9vbFxuXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2ssIF8sIF8pIHQgLT4gZjooJ2sgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAndiwgXykgdCAtPiBmOigndiAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBJdGVyYXRlcyB1bnRpbCB0aGUgZmlyc3QgdGltZSBbZl0gcmV0dXJucyBbU3RvcF0uIElmIFtmXSByZXR1cm5zIFtTdG9wXSwgdGhlIGZpbmFsXG4gICAgICByZXN1bHQgaXMgW1VuZmluaXNoZWRdLiBPdGhlcndpc2UsIHRoZSBmaW5hbCByZXN1bHQgaXMgW0ZpbmlzaGVkXS4gKilcbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICAoKiogSXRlcmF0ZXMgdHdvIG1hcHMgc2lkZSBieSBzaWRlLiBUaGUgY29tcGxleGl0eSBvZiB0aGlzIGZ1bmN0aW9uIGlzIE8oTSArIE4pLiAgSWYgdHdvXG4gICAgICBpbnB1dHMgYXJlIFtbKDAsIGEpOyAoMSwgYSldXSBhbmQgW1soMSwgYik7ICgyLCBiKV1dLCBbZl0gd2lsbCBiZSBjYWxsZWQgd2l0aCBbWygwLFxuICAgICAgYExlZnQgYSk7ICgxLCBgQm90aCAoYSwgYikpOyAoMiwgYFJpZ2h0IGIpXV0uICopXG4gIHZhbCBpdGVyMlxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTooJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICAoKiogUmV0dXJucyBhIG5ldyBtYXAgd2l0aCBib3VuZCB2YWx1ZXMgcmVwbGFjZWQgYnkgW2ZdIGFwcGxpZWQgdG8gdGhlIGJvdW5kIHZhbHVlcy4qKVxuICB2YWwgbWFwIDogKCdrLCAndjEsICdjbXApIHQgLT4gZjooJ3YxIC0+ICd2MikgLT4gKCdrLCAndjIsICdjbXApIHRcblxuICAoKiogTGlrZSBbbWFwXSwgYnV0IHRoZSBwYXNzZWQgZnVuY3Rpb24gdGFrZXMgYm90aCBba2V5XSBhbmQgW2RhdGFdIGFzIGFyZ3VtZW50cy4gKilcbiAgdmFsIG1hcGkgOiAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondjEgLT4gJ3YyKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuXG4gICgqKiBDb252ZXJ0IG1hcCB3aXRoIGtleXMgb2YgdHlwZSBbJ2syXSB0byBhIG1hcCB3aXRoIGtleXMgb2YgdHlwZSBbJ2syXSB1c2luZyBbZl0uICopXG4gIHZhbCBtYXBfa2V5c1xuICAgIDogICgnazIsICdjbXAyKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdrMSwgJ3YsICdjbXAxKSB0XG4gICAgLT4gZjooJ2sxIC0+ICdrMilcbiAgICAtPiBbIGBPayBvZiAoJ2syLCAndiwgJ2NtcDIpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnazIgXVxuXG4gICgqKiBMaWtlIFttYXBfa2V5c10sIGJ1dCByYWlzZXMgb24gZHVwbGljYXRlIGtleS4gKilcbiAgdmFsIG1hcF9rZXlzX2V4blxuICAgIDogICgnazIsICdjbXAyKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdrMSwgJ3YsICdjbXAxKSB0XG4gICAgLT4gZjooJ2sxIC0+ICdrMilcbiAgICAtPiAoJ2syLCAndiwgJ2NtcDIpIHRcblxuICAoKiogRm9sZHMgb3ZlciBrZXlzIGFuZCBkYXRhIGluIHRoZSBtYXAgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBba2V5XS4gKilcbiAgdmFsIGZvbGQgOiAoJ2ssICd2LCBfKSB0IC0+IGluaXQ6J2EgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpIC0+ICdhXG5cbiAgKCoqIEZvbGRzIG92ZXIga2V5cyBhbmQgZGF0YSBpbiB0aGUgbWFwIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgW2tleV0sIHVudGlsIHRoZSBmaXJzdFxuICAgICAgdGltZSB0aGF0IFtmXSByZXR1cm5zIFtTdG9wIF9dLiBJZiBbZl0gcmV0dXJucyBbU3RvcCBmaW5hbF0sIHRoaXMgZnVuY3Rpb24gcmV0dXJuc1xuICAgICAgaW1tZWRpYXRlbHkgd2l0aCB0aGUgdmFsdWUgW2ZpbmFsXS4gSWYgW2ZdIG5ldmVyIHJldHVybnMgW1N0b3AgX10sIGFuZCB0aGUgZmluYWxcbiAgICAgIGNhbGwgdG8gW2ZdIHJldHVybnMgW0NvbnRpbnVlIGxhc3RdLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgW2ZpbmlzaCBsYXN0XS4gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gaW5pdDonYWNjXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2FjYyAtPiAoJ2FjYywgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjYyAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIEZvbGRzIG92ZXIga2V5cyBhbmQgZGF0YSBpbiB0aGUgbWFwIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgW2tleV0uICopXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdrLCAndiwgXykgdCAtPiBpbml0OidhIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKSAtPiAnYVxuXG4gICgqKiBGb2xkcyBvdmVyIHR3byBtYXBzIHNpZGUgYnkgc2lkZSwgbGlrZSBbaXRlcjJdLiAqKVxuICB2YWwgZm9sZDJcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOigndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+ICdhIC0+ICdhKVxuICAgIC0+ICdhXG5cbiAgKCoqIFtmaWx0ZXJdLCBbZmlsdGVyaV0sIFtmaWx0ZXJfa2V5c10sIFtmaWx0ZXJfbWFwXSwgYW5kIFtmaWx0ZXJfbWFwaV0gcnVuIGluIE8obiAqIGxnXG4gICAgICBuKSB0aW1lOyB0aGV5IHNpbXBseSBhY2N1bXVsYXRlIGVhY2gga2V5ICYgZGF0YSBwYWlyIHJldGFpbmVkIGJ5IFtmXSBpbnRvIGEgbmV3IG1hcFxuICAgICAgdXNpbmcgW2FkZF0uICopXG4gIHZhbCBmaWx0ZXJfa2V5cyA6ICgnaywgJ3YsICdjbXApIHQgLT4gZjooJ2sgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXIgOiAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgdmFsIGZpbHRlcmkgOiAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogUmV0dXJucyBhIG5ldyBtYXAgd2l0aCBib3VuZCB2YWx1ZXMgZmlsdGVyZWQgYnkgW2ZdIGFwcGxpZWQgdG8gdGhlIGJvdW5kIHZhbHVlcy4gKilcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOigndjEgLT4gJ3YyIG9wdGlvbikgLT4gKCdrLCAndjIsICdjbXApIHRcblxuICAoKiogTGlrZSBbZmlsdGVyX21hcF0sIGJ1dCB0aGUgcGFzc2VkIGZ1bmN0aW9uIHRha2VzIGJvdGggW2tleV0gYW5kIFtkYXRhXSBhc1xuICAgICAgYXJndW1lbnRzLiAqKVxuICB2YWwgZmlsdGVyX21hcGlcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2MSAtPiAndjIgb3B0aW9uKVxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG5cbiAgKCoqIFtwYXJ0aXRpb25fbWFwaSB0IH5mXSByZXR1cm5zIHR3byBuZXcgW3Rdcywgd2l0aCBlYWNoIGtleSBpbiBbdF0gYXBwZWFyaW5nIGluXG4gICAgICBleGFjdGx5IG9uZSBvZiB0aGUgcmVzdWx0aW5nIG1hcHMgZGVwZW5kaW5nIG9uIGl0cyBtYXBwaW5nIGluIFtmXS4gKilcbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondjEgLT4gKCd2MiwgJ3YzKSBFaXRoZXIudClcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdCAqICgnaywgJ3YzLCAnY21wKSB0XG5cbiAgKCoqIFtwYXJ0aXRpb25fbWFwIHQgfmYgPSBwYXJ0aXRpb25fbWFwaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSldICopXG4gIHZhbCBwYXJ0aXRpb25fbWFwXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiBmOigndjEgLT4gKCd2MiwgJ3YzKSBFaXRoZXIudClcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdCAqICgnaywgJ3YzLCAnY21wKSB0XG5cbiAgKCoqXG4gICAgIHtbXG4gICAgICAgcGFydGl0aW9uaV90ZiB0IH5mXG4gICAgICAgPVxuICAgICAgIHBhcnRpdGlvbl9tYXBpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgICAgICBpZiBmIH5rZXkgfmRhdGFcbiAgICAgICAgIHRoZW4gRmlyc3QgZGF0YVxuICAgICAgICAgZWxzZSBTZWNvbmQgZGF0YSlcbiAgICAgXX0gKilcbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gYm9vbClcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbcGFydGl0aW9uX3RmIHQgfmYgPSBwYXJ0aXRpb25pX3RmIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKV0gKilcbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBmOigndiAtPiBib29sKVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFByb2R1Y2VzIFtPa10gb2YgYSBtYXAgaW5jbHVkaW5nIGFsbCBrZXlzIGlmIGFsbCBkYXRhIGlzIFtPa10sIG9yIGFuIFtFcnJvcl1cbiAgICAgIGluY2x1ZGluZyBhbGwgZXJyb3JzIG90aGVyd2lzZS4gKilcbiAgdmFsIGNvbWJpbmVfZXJyb3JzIDogKCdrLCAndiBPcl9lcnJvci50LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBSZXR1cm5zIGEgdG90YWwgb3JkZXJpbmcgYmV0d2VlbiBtYXBzLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSB0b3RhbCBvcmRlcmluZyB1c2VkXG4gICAgICB0byBjb21wYXJlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVxdWFsIGtleXMgaW4gdGhlIHR3byBtYXBzLiAqKVxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ3YgLT4gJ3YgLT4gaW50KSAtPiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgLT4gaW50XG5cbiAgKCoqIEhhc2ggZnVuY3Rpb246IGEgYnVpbGRpbmcgYmxvY2sgdG8gdXNlIHdoZW4gaGFzaGluZyBkYXRhIHN0cnVjdHVyZXMgY29udGFpbmluZyBtYXBzIGluXG4gICAgICB0aGVtLiBbaGFzaF9mb2xkX2RpcmVjdCBoYXNoX2ZvbGRfa2V5XSBpcyBjb21wYXRpYmxlIHdpdGggW2NvbXBhcmVfZGlyZWN0XSBpZmZcbiAgICAgIFtoYXNoX2ZvbGRfa2V5XSBpcyBjb21wYXRpYmxlIHdpdGggWyhjb21wYXJhdG9yIG0pLmNvbXBhcmVdIG9mIHRoZSBtYXAgW21dIGJlaW5nXG4gICAgICBoYXNoZWQuICopXG4gIHZhbCBoYXNoX2ZvbGRfZGlyZWN0IDogJ2sgSGFzaC5mb2xkZXIgLT4gJ3YgSGFzaC5mb2xkZXIgLT4gKCdrLCAndiwgJ2NtcCkgdCBIYXNoLmZvbGRlclxuXG4gICgqKiBbZXF1YWwgY21wIG0xIG0yXSB0ZXN0cyB3aGV0aGVyIHRoZSBtYXBzIFttMV0gYW5kIFttMl0gYXJlIGVxdWFsLCB0aGF0IGlzLCBjb250YWluXG4gICAgICB0aGUgc2FtZSBrZXlzIGFuZCBhc3NvY2lhdGUgZWFjaCBrZXkgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gIFtjbXBdIGlzIHRoZSBlcXVhbGl0eVxuICAgICAgcHJlZGljYXRlIHVzZWQgdG8gY29tcGFyZSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5cy4gKilcbiAgdmFsIGVxdWFsIDogKCd2IC0+ICd2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBrZXlzIGluIHRoZSBnaXZlbiBtYXAuICopXG4gIHZhbCBrZXlzIDogKCdrLCBfLCBfKSB0IC0+ICdrIGxpc3RcblxuICAoKiogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGRhdGEgaW4gdGhlIGdpdmVuIG1hcC4gKilcbiAgdmFsIGRhdGEgOiAoXywgJ3YsIF8pIHQgLT4gJ3YgbGlzdFxuXG4gICgqKiBDcmVhdGVzIGFuIGFzc29jaWF0aW9uIGxpc3QgZnJvbSB0aGUgZ2l2ZW4gbWFwLiAqKVxuICB2YWwgdG9fYWxpc3RcbiAgICA6ICA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdICgqKiBkZWZhdWx0IGlzIFtgSW5jcmVhc2luZ10gKilcbiAgICAtPiAoJ2ssICd2LCBfKSB0XG4gICAgLT4gKCdrICogJ3YpIGxpc3RcblxuICAoKiogezIgQWRkaXRpb25hbCBvcGVyYXRpb25zIG9uIG1hcHN9ICopXG5cbiAgKCoqIE1lcmdlcyB0d28gbWFwcy4gVGhlIHJ1bnRpbWUgaXMgTyhsZW5ndGgodDEpICsgbGVuZ3RoKHQyKSkuIFlvdSBzaG91bGRuJ3QgdXNlIHRoaXNcbiAgICAgIGZ1bmN0aW9uIHRvIG1lcmdlIGEgbGlzdCBvZiBtYXBzOyBjb25zaWRlciB1c2luZyBbbWVyZ2Vfc2tld2VkXSBpbnN0ZWFkLiAqKVxuICB2YWwgbWVyZ2VcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidrIC0+ICgndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+ICd2MyBvcHRpb24pXG4gICAgLT4gKCdrLCAndjMsICdjbXApIHRcblxuICAoKiogQSBzcGVjaWFsIGNhc2Ugb2YgW21lcmdlXSwgW21lcmdlX3NrZXdlZCB0MSB0Ml0gaXMgYSBtYXAgY29udGFpbmluZyBhbGwgdGhlXG4gICAgICBiaW5kaW5ncyBvZiBbdDFdIGFuZCBbdDJdLiBCaW5kaW5ncyB0aGF0IGFwcGVhciBpbiBib3RoIFt0MV0gYW5kIFt0Ml0gYXJlXG4gICAgICBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHZhbHVlIHVzaW5nIHRoZSBbY29tYmluZV0gZnVuY3Rpb24uIEluIGEgY2FsbFxuICAgICAgW2NvbWJpbmUgfmtleSB2MSB2Ml0sIHRoZSB2YWx1ZSBbdjFdIGNvbWVzIGZyb20gW3QxXSBhbmQgW3YyXSBmcm9tIFt0Ml0uXG5cbiAgICAgIFRoZSBydW50aW1lIG9mIFttZXJnZV9za2V3ZWRdIGlzIFtPKG1pbihsMSwgbDIpICogbG9nKG1heChsMSwgbDIpKSldLCB3aGVyZSBbbDFdIGlzXG4gICAgICB0aGUgbGVuZ3RoIG9mIFt0MV0gYW5kIFtsMl0gdGhlIGxlbmd0aCBvZiBbdDJdLiBUaGlzIGlzIGxpa2VseSB0byBiZSBmYXN0ZXIgdGhhblxuICAgICAgW21lcmdlXSB3aGVuIG9uZSBvZiB0aGUgbWFwcyBpcyBhIGxvdCBzbWFsbGVyLCBvciB3aGVuIHlvdSBtZXJnZSBhIGxpc3Qgb2YgbWFwcy4gKilcbiAgdmFsIG1lcmdlX3NrZXdlZFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tYmluZTooa2V5OidrIC0+ICd2IC0+ICd2IC0+ICd2KVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICBtb2R1bGUgU3ltbWV0cmljX2RpZmZfZWxlbWVudCA6IHNpZ1xuICAgIHR5cGUgKCdrLCAndikgdCA9ICdrICogWyBgTGVmdCBvZiAndiB8IGBSaWdodCBvZiAndiB8IGBVbmVxdWFsIG9mICd2ICogJ3YgXVxuICAgIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMiB3aXRoIHR5cGUgKCdrLCAndikgdCA6PSAoJ2ssICd2KSB0XG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuRXF1YWwuUzIgd2l0aCB0eXBlICgnaywgJ3YpIHQgOj0gKCdrLCAndikgdFxuICAgIGluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGUuUzIgd2l0aCB0eXBlICgnaywgJ3YpIHQgOj0gKCdrLCAndikgdFxuXG4gICAgdmFsIHRfc2V4cF9ncmFtbWFyXG4gICAgICA6ICAnayBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgLT4gJ3YgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgIC0+ICgnaywgJ3YpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gICgqKiBbc3ltbWV0cmljX2RpZmYgdDEgdDIgfmRhdGFfZXF1YWxdIHJldHVybnMgYSBsaXN0IG9mIGNoYW5nZXMgYmV0d2VlbiBbdDFdIGFuZCBbdDJdLlxuICAgICAgSXQgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50IGluIHRoZSBjYXNlIHdoZXJlIFt0MV0gYW5kIFt0Ml0gc2hhcmUgYSBsYXJnZSBhbW91bnRcbiAgICAgIG9mIHN0cnVjdHVyZS4gVGhlIGtleXMgaW4gdGhlIG91dHB1dCBzZXF1ZW5jZSB3aWxsIGJlIGluIHNvcnRlZCBvcmRlci5cblxuICAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IFtkYXRhX2VxdWFsXSBpcyBhdCBsZWFzdCBhcyBlcXVhdGluZyBhcyBwaHlzaWNhbCBlcXVhbGl0eTogdGhhdFxuICAgICAgW3BoeXNfZXF1YWwgeCB5XSBpbXBsaWVzIFtkYXRhX2VxdWFsIHggeV0uIE90aGVyd2lzZSwgW3N5bW1ldHJpY19kaWZmXSBtYXkgYmVoYXZlIGluXG4gICAgICB1bmV4cGVjdGVkIHdheXMuIEZvciBleGFtcGxlLCB3aXRoIFt+ZGF0YV9lcXVhbDooZnVuIF8gXyAtPiBmYWxzZSldIGl0IGlzIE5PVFxuICAgICAgbmVjZXNzYXJpbHkgdGhlIGNhc2UgdGhlIHJlc3VsdGluZyBjaGFuZ2Ugc2VxdWVuY2Ugd2lsbCBjb250YWluIGFuIGVsZW1lbnRcbiAgICAgIFsoaywgYFVuZXF1YWwgXyldIGZvciBldmVyeSBrZXkgW2tdIHNoYXJlZCBieSBib3RoIG1hcHMuXG5cbiAgICAgIFdhcm5pbmc6IEZsb2F0IGVxdWFsaXR5IHZpb2xhdGVzIHRoaXMgcHJvcGVydHkhIFtwaHlzX2VxdWFsIEZsb2F0Lm5hbiBGbG9hdC5uYW5dIGlzXG4gICAgICB0cnVlLCBidXQgW0Zsb2F0Lig9KSBGbG9hdC5uYW4gRmxvYXQubmFuXSBpcyBmYWxzZS4gKilcbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOigndiAtPiAndiAtPiBib29sKVxuICAgIC0+ICgnaywgJ3YpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgKCoqIFtmb2xkX3N5bW1ldHJpY19kaWZmIHQxIHQyIH5kYXRhX2VxdWFsXSBmb2xkcyBhY3Jvc3MgYW4gaW1wbGljaXQgc2VxdWVuY2Ugb2YgY2hhbmdlc1xuICAgICAgYmV0d2VlbiBbdDFdIGFuZCBbdDJdLCBpbiBzb3J0ZWQgb3JkZXIgYnkga2V5cy4gRXF1aXZhbGVudCB0b1xuICAgICAgW1NlcXVlbmNlLmZvbGQgKHN5bW1ldHJpY19kaWZmIHQxIHQyIH5kYXRhX2VxdWFsKV0sIGFuZCBtb3JlIGVmZmljaWVudC4gKilcbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KCdhIC0+ICgnaywgJ3YpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYSlcbiAgICAtPiAnYVxuXG4gICgqKiBbbWluX2VsdCBtYXBdIHJldHVybnMgW1NvbWUgKGtleSwgZGF0YSldIHBhaXIgY29ycmVzcG9uZGluZyB0byB0aGUgbWluaW11bSBrZXkgaW5cbiAgICAgIFttYXBdLCBvciBbTm9uZV0gaWYgZW1wdHkuICopXG4gIHZhbCBtaW5fZWx0IDogKCdrLCAndiwgXykgdCAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdrLCAndiwgXykgdCAtPiAnayAqICd2XG5cbiAgKCoqIFttYXhfZWx0IG1hcF0gcmV0dXJucyBbU29tZSAoa2V5LCBkYXRhKV0gcGFpciBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXhpbXVtIGtleSBpblxuICAgICAgW21hcF0sIG9yIFtOb25lXSBpZiBbbWFwXSBpcyBlbXB0eS4gKilcbiAgdmFsIG1heF9lbHQgOiAoJ2ssICd2LCBfKSB0IC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2ssICd2LCBfKSB0IC0+ICdrICogJ3ZcblxuICAoKiogVGhlc2UgZnVuY3Rpb25zIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHNpbWlsYXIgZnVuY3Rpb25zIGluIFtMaXN0XS4gKilcblxuICB2YWwgZm9yX2FsbCA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBib29sKSAtPiBpbnRcblxuXG4gICgqKiBbc3BsaXQgdCBrZXldIHJldHVybnMgYSBtYXAgb2Yga2V5cyBzdHJpY3RseSBsZXNzIHRoYW4gW2tleV0sIHRoZSBtYXBwaW5nIG9mIFtrZXldIGlmXG4gICAgICBhbnksIGFuZCBhIG1hcCBvZiBrZXlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBba2V5XS5cblxuICAgICAgUnVudGltZSBpcyBPKG0gKyBsb2cgbiksIHdoZXJlIG4gaXMgdGhlIHNpemUgb2YgdGhlIGlucHV0IG1hcCBhbmQgbSBpcyB0aGUgc2l6ZSBvZlxuICAgICAgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBvdXRwdXQgbWFwcy4gIFRoZSBPKG0pIHRlcm0gaXMgZHVlIHRvIHRoZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0IG1hcHMuICopXG4gIHZhbCBzcGxpdFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAna1xuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2sgKiAndikgb3B0aW9uICogKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbYXBwZW5kIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0XSByZXR1cm5zIFtgT2sgbWFwXSB3aGVyZSBbbWFwXSBjb250YWlucyBhbGwgdGhlXG4gICAgICBbKGtleSwgdmFsdWUpXSBwYWlycyBmcm9tIHRoZSB0d28gaW5wdXQgbWFwcyBpZiBhbGwgdGhlIGtleXMgZnJvbSBbbG93ZXJfcGFydF0gYXJlXG4gICAgICBsZXNzIHRoYW4gYWxsIHRoZSBrZXlzIGZyb20gW3VwcGVyX3BhcnRdLiAgT3RoZXJ3aXNlIGl0IHJldHVybnNcbiAgICAgIFtgT3ZlcmxhcHBpbmdfa2V5X3Jhbmdlc10uXG5cbiAgICAgIFJ1bnRpbWUgaXMgTyhsb2cgbikgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VyIGlucHV0IG1hcC4gIFRoaXMgY2FuIGJlXG4gICAgICBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIFtNYXAubWVyZ2VdIG9yIHJlcGVhdGVkIFtNYXAuYWRkXS5cblxuICAgICAge1tcbiAgICAgICAgYXNzZXJ0IChtYXRjaCBNYXAuYXBwZW5kIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0IHdpdGhcbiAgICAgICAgICB8IGBPayB3aG9sZV9tYXAgLT5cbiAgICAgICAgICAgIE1hcC50b19hbGlzdCB3aG9sZV9tYXBcbiAgICAgICAgICAgID0gTGlzdC5hcHBlbmQgKHRvX2FsaXN0IGxvd2VyX3BhcnQpICh0b19hbGlzdCB1cHBlcl9wYXJ0KVxuICAgICAgICAgIHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgLT4gdHJ1ZSk7XG4gICAgICBdfSAqKVxuICB2YWwgYXBwZW5kXG4gICAgOiAgbG93ZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gdXBwZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF1cblxuICAoKiogW3N1YnJhbmdlIHQgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZF0gcmV0dXJucyBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUgZW50cmllcyBmcm9tXG4gICAgICBbdF0gd2hvc2Uga2V5cyBsaWUgaW5zaWRlIHRoZSBpbnRlcnZhbCBpbmRpY2F0ZWQgYnkgW35sb3dlcl9ib3VuZF0gYW5kXG4gICAgICBbfnVwcGVyX2JvdW5kXS4gIElmIHRoaXMgaW50ZXJ2YWwgaXMgZW1wdHksIGFuIGVtcHR5IG1hcCBpcyByZXR1cm5lZC5cblxuICAgICAgUnVudGltZSBpcyBPKG0gKyBsb2cgbiksIHdoZXJlIG4gaXMgdGhlIHNpemUgb2YgdGhlIGlucHV0IG1hcCBhbmQgbSBpcyB0aGUgc2l6ZSBvZlxuICAgICAgdGhlIG91dHB1dCBtYXAuICBUaGUgTyhtKSB0ZXJtIGlzIGR1ZSB0byB0aGUgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGVcbiAgICAgIG91dHB1dCBtYXAuICopXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBsb3dlcl9ib3VuZDonayBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2sgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW2ZvbGRfcmFuZ2VfaW5jbHVzaXZlIHQgfm1pbiB+bWF4IH5pbml0IH5mXSBmb2xkcyBbZl0gKHdpdGggaW5pdGlhbCB2YWx1ZSBbfmluaXRdKVxuICAgICAgb3ZlciBhbGwga2V5cyAoYW5kIHRoZWlyIGFzc29jaWF0ZWQgdmFsdWVzKSB0aGF0IGFyZSBpbiB0aGUgcmFuZ2UgW1ttaW4sIG1heF1dXG4gICAgICAoaW5jbHVzaXZlKS4gICopXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBtaW46J2tcbiAgICAtPiBtYXg6J2tcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpXG4gICAgLT4gJ2FcblxuICAoKiogW3JhbmdlX3RvX2FsaXN0IHQgfm1pbiB+bWF4XSByZXR1cm5zIGFuIGFzc29jaWF0aXZlIGxpc3Qgb2YgdGhlIGVsZW1lbnRzIHdob3NlIGtleXNcbiAgICAgIGxpZSBpbiBbW21pbiwgbWF4XV0gKGluY2x1c2l2ZSksIHdpdGggdGhlIHNtYWxsZXN0IGtleSBiZWluZyBhdCB0aGUgaGVhZCBvZiB0aGVcbiAgICAgIGxpc3QuICopXG4gIHZhbCByYW5nZV90b19hbGlzdCA6ICgnaywgJ3YsICdjbXApIHQgLT4gbWluOidrIC0+IG1heDonayAtPiAoJ2sgKiAndikgbGlzdFxuXG4gICgqKiBbY2xvc2VzdF9rZXkgdCBkaXIga10gcmV0dXJucyB0aGUgWyhrZXksIHZhbHVlKV0gcGFpciBpbiBbdF0gd2l0aCBba2V5XSBjbG9zZXN0IHRvXG4gICAgICBba10gdGhhdCBzYXRpc2ZpZXMgdGhlIGdpdmVuIGluZXF1YWxpdHkgYm91bmQuXG5cbiAgICAgIEZvciBleGFtcGxlLCBbY2xvc2VzdF9rZXkgdCBgTGVzc190aGFuIGtdIHdvdWxkIGJlIHRoZSBwYWlyIHdpdGggdGhlIGNsb3Nlc3Qga2V5IHRvXG4gICAgICBba10gd2hlcmUgW2tleSA8IGtdLlxuXG4gICAgICBbdG9fc2VxdWVuY2VdIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgc2FtZSByZXN1bHRzIGFzIFtjbG9zZXN0X2tleV0uICBJdCBpcyBsZXNzXG4gICAgICBlZmZpY2llbnQgZm9yIGluZGl2aWR1YWwgbG9va3VwcyBidXQgbW9yZSBlZmZpY2llbnQgZm9yIGZpbmRpbmcgbWFueSBlbGVtZW50cyBzdGFydGluZ1xuICAgICAgYXQgc29tZSB2YWx1ZS4gKilcbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAtPiAna1xuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICAoKiogW250aCB0IG5dIGZpbmRzIHRoZSAoa2V5LCB2YWx1ZSkgcGFpciBvZiByYW5rIG4gKGkuZS4sIHN1Y2ggdGhhdCB0aGVyZSBhcmUgZXhhY3RseSBuXG4gICAgICBrZXlzIHN0cmljdGx5IGxlc3MgdGhhbiB0aGUgZm91bmQga2V5KSwgaWYgb25lIGV4aXN0cy4gIE8obG9nKGxlbmd0aCB0KSArIG4pIHRpbWUuICopXG4gIHZhbCBudGggOiAoJ2ssICd2LCBfKSB0IC0+IGludCAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIG50aF9leG4gOiAoJ2ssICd2LCBfKSB0IC0+IGludCAtPiAnayAqICd2XG5cbiAgKCoqIFtyYW5rIHQga10gSWYgW2tdIGlzIGluIFt0XSwgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgc3RyaWN0bHkgbGVzcyB0aGFuIFtrXSBpblxuICAgICAgW3RdLCBhbmQgW05vbmVdIG90aGVyd2lzZS4gKilcbiAgdmFsIHJhbmsgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+IGludCBvcHRpb25cblxuXG5cbiAgKCoqIFt0b19zZXF1ZW5jZSA/b3JkZXIgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90byA/a2V5c19sZXNzX29yX2VxdWFsX3RvIHRdXG4gICAgICBnaXZlcyBhIHNlcXVlbmNlIG9mIGtleS12YWx1ZSBwYWlycyBiZXR3ZWVuIFtrZXlzX2xlc3Nfb3JfZXF1YWxfdG9dIGFuZFxuICAgICAgW2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90b10gaW5jbHVzaXZlLCBwcmVzZW50ZWQgaW4gW29yZGVyXS4gIElmXG4gICAgICBba2V5c19ncmVhdGVyX29yX2VxdWFsX3RvID4ga2V5c19sZXNzX29yX2VxdWFsX3RvXSwgdGhlIHNlcXVlbmNlIGlzXG4gICAgICBlbXB0eS5cblxuICAgICAgV2hlbiBuZWl0aGVyIFtrZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG9dIG5vciBba2V5c19sZXNzX29yX2VxdWFsX3RvXSBhcmVcbiAgICAgIHByb3ZpZGVkLCB0aGUgY29zdCBpcyBPKGxvZyBuKSB1cCBmcm9udCBhbmQgYW1vcnRpemVkIE8oMSkgdG8gcHJvZHVjZVxuICAgICAgZWFjaCBlbGVtZW50LiBJZiBlaXRoZXIgaXMgcHJvdmlkZWQgKGFuZCBpcyB1c2VkIGJ5IHRoZSBvcmRlciBwYXJhbWV0ZXJcbiAgICAgIHByb3ZpZGVkKSwgdGhlbiB0aGUgdGhlIGNvc3QgaXMgTyhuKSB1cCBmcm9udCwgYW5kIGFtb3J0aXplZCBPKDEpIHRvXG4gICAgICBwcm9kdWNlIGVhY2ggZWxlbWVudC4gKilcbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5ICgqKiBkZWZhdWx0ICopIHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOidrXG4gICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzona1xuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2sgKiAndikgU2VxdWVuY2UudFxuXG4gICgqKiBbYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIHdoaWNoIGVsdF0gcmV0dXJucyB0aGUgWyhrZXksIHZhbHVlKV0gcGFpciBpbiBbdF1cbiAgICAgIHNwZWNpZmllZCBieSBbY29tcGFyZV0gYW5kIFt3aGljaF0sIGlmIG9uZSBleGlzdHMuXG5cbiAgICAgIFt0XSBtdXN0IGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyIGFjY29yZGluZyB0byBbY29tcGFyZV0sIHdoZXJlIFtjb21wYXJlXSBhbmRcbiAgICAgIFtlbHRdIGRpdmlkZSBbdF0gaW50byB0aHJlZSAocG9zc2libHkgZW1wdHkpIHNlZ21lbnRzOlxuXG4gICAgICB7dlxuICAgICAgICB8ICA8IGVsdCAgfCAgPSBlbHQgIHwgID4gZWx0ICB8XG4gICAgICB2fVxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF0gcmV0dXJucyBhbiBlbGVtZW50IG9uIHRoZSBib3VuZGFyeSBvZiBzZWdtZW50cyBhcyBzcGVjaWZpZWQgYnlcbiAgICAgIFt3aGljaF0uICBTZWUgdGhlIGRpYWdyYW0gYmVsb3cgbmV4dCB0byB0aGUgW3doaWNoXSB2YXJpYW50cy5cblxuICAgICAgW2JpbmFyeV9zZWFyY2hdIGRvZXMgbm90IGNoZWNrIHRoYXQgW2NvbXBhcmVdIG9yZGVycyBbdF0sIGFuZCBiZWhhdmlvciBpc1xuICAgICAgdW5zcGVjaWZpZWQgaWYgW2NvbXBhcmVdIGRvZXNuJ3Qgb3JkZXIgW3RdLiAgQmVoYXZpb3IgaXMgYWxzbyB1bnNwZWNpZmllZCBpZlxuICAgICAgW2NvbXBhcmVdIG11dGF0ZXMgW3RdLiAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAna2V5IC0+IGludClcbiAgICAtPiBbIGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAoKiogICAgICAgIHt2IHwgPCBlbHQgWCB8ICAgICAgICAgICAgICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvICgqKiAgICAge3YgfCAgICAgIDw9IGVsdCAgICAgICBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgTGFzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCAgID0gZWx0IFggfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBGaXJzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8IFggPSBlbHQgICB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAoKioge3YgICAgICAgICAgIHwgWCAgICAgICA+PSBlbHQgICAgICB8IHZ9ICopXG4gICAgICAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuICgqKiAgICB7diAgICAgICAgICAgICAgICAgICAgICAgfCBYID4gZWx0IHwgdn0gKilcbiAgICAgICBdXG4gICAgLT4gJ2tleVxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICAoKiogW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2Ygd2hpY2hdIHRha2VzIGEgW3NlZ21lbnRfb2ZdIGZ1bmN0aW9uIHRoYXRcbiAgICAgIGRpdmlkZXMgW3RdIGludG8gdHdvIChwb3NzaWJseSBlbXB0eSkgc2VnbWVudHM6XG5cbiAgICAgIHt2XG4gICAgICAgIHwgc2VnbWVudF9vZiBlbHQgPSBgTGVmdCB8IHNlZ21lbnRfb2YgZWx0ID0gYFJpZ2h0IHxcbiAgICAgIHZ9XG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZF0gcmV0dXJucyB0aGUgWyhrZXksIHZhbHVlKV0gcGFpciBvbiB0aGUgYm91bmRhcnkgb2YgdGhlXG4gICAgICBzZWdtZW50cyBhcyBzcGVjaWZpZWQgYnkgW3doaWNoXTogW2BMYXN0X29uX2xlZnRdIHlpZWxkcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZVxuICAgICAgbGVmdCBzZWdtZW50LCB3aGlsZSBbYEZpcnN0X29uX3JpZ2h0XSB5aWVsZHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJpZ2h0IHNlZ21lbnQuXG4gICAgICBJdCByZXR1cm5zIFtOb25lXSBpZiB0aGUgc2VnbWVudCBpcyBlbXB0eS5cblxuICAgICAgW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkXSBkb2VzIG5vdCBjaGVjayB0aGF0IFtzZWdtZW50X29mXSBzZWdtZW50cyBbdF0gYXMgaW4gdGhlXG4gICAgICBkaWFncmFtLCBhbmQgYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQgaWYgW3NlZ21lbnRfb2ZdIGRvZXNuJ3Qgc2VnbWVudCBbdF0uICBCZWhhdmlvclxuICAgICAgaXMgYWxzbyB1bnNwZWNpZmllZCBpZiBbc2VnbWVudF9vZl0gbXV0YXRlcyBbdF0uICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBzZWdtZW50X29mOihrZXk6J2sgLT4gZGF0YTondiAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gWyBgTGFzdF9vbl9sZWZ0IHwgYEZpcnN0X29uX3JpZ2h0IF1cbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgKCoqIFtiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXSB0YWtlcyBhIFtjb21wYXJlXSBmdW5jdGlvbiB0aGF0IGRpdmlkZXMgW3RdIGludG8gdGhyZWVcbiAgICAgIChwb3NzaWJseSBlbXB0eSkgc2VnbWVudHMgd2l0aCByZXNwZWN0IHRvIFtsb3dlcl9ib3VuZF0gYW5kIFt1cHBlcl9ib3VuZF06XG5cbiAgICAgIHt2XG4gICAgICAgIHwgQmVsb3dfbG93ZXJfYm91bmQgfCBJbl9yYW5nZSB8IEFib3ZlX3VwcGVyX2JvdW5kIHxcbiAgICAgIHZ9XG5cbiAgICAgIGFuZCByZXR1cm5zIGEgbWFwIG9mIHRoZSBbSW5fcmFuZ2VdIHNlZ21lbnQuXG5cbiAgICAgIFJ1bnRpbWUgaXMgTyhsb2cgbSArIG4pIHdoZXJlIFttXSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBtYXAgYW5kIFtuXSBpcyB0aGVcbiAgICAgIGxlbmd0aCBvZiB0aGUgb3V0cHV0LiBUaGUgbGluZWFyIHRlcm0gaW4gW25dIGlzIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgb3V0cHV0LlxuXG4gICAgICBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgW2NvbXBhcmVdIGRvZXMgbm90IHNlZ21lbnQgW3RdIGFzIHNob3duIGFib3ZlLCBvciBpZlxuICAgICAgW2NvbXBhcmVdIG11dGF0ZXMgaXRzIGlucHV0cy4gKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2JvdW5kIC0+IGludClcbiAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbTV0gaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIE9DYW1sIGFwcGxpY2F0aXZlIGZ1bmN0b3IgdHlwZXM6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3RvX2ludF9tYXAgPSBpbnQgTWFwLk0oU3RyaW5nKS50XG4gICAgICBdfVxuXG4gICAgICB3aGljaCBzdGFuZHMgZm9yOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ190b19pbnRfbWFwID0gKFN0cmluZy50LCBpbnQsIFN0cmluZy5jb21wYXJhdG9yX3dpdG5lc3MpIE1hcC50XG4gICAgICBdfVxuXG4gICAgICBUaGUgcG9pbnQgaXMgdGhhdCBbaW50IE1hcC5NKFN0cmluZykudF0gc3VwcG9ydHMgZGVyaXZpbmcsIHdoZXJlYXMgdGhlIHNlY29uZCBzeW50YXhcbiAgICAgIGRvZXNuJ3QgKGJlY2F1c2UgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcywgc2F5LCBbU3RyaW5nLnNleHBfb2ZfY29tcGFyYXRvcl93aXRuZXNzXVxuICAgICAgLS0gaW5zdGVhZCB5b3Ugd291bGQgd2FudCB0byBwYXNzIHRoZSBjb21wYXJhdG9yIGRpcmVjdGx5KS5cblxuICAgICAgSW4gYWRkaXRpb24sIHdoZW4gdXNpbmcgW0BAZGVyaXZpbmddLCB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBrZXkgbW9kdWxlIGFyZSBvbmx5XG4gICAgICB0aG9zZSBuZWVkZWQgdG8gc2F0aXNmeSB3aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGRlcml2ZSBvbiB0aGUgbWFwIGl0c2VsZi4gU2F5IHlvdVxuICAgICAgd3JpdGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgdCA9IGludCBNYXAuTShYKS50IFtAQGRlcml2aW5nIGhhc2hdXG4gICAgICBdfVxuXG4gICAgICB0aGVuIHRoaXMgd2lsbCBiZSB3ZWxsIHR5cGVkIGV4YWN0bHkgaWYgW1hdIGNvbnRhaW5zIGF0IGxlYXN0OlxuICAgICAgLSBhIHR5cGUgW3RdIHdpdGggbm8gcGFyYW1ldGVyc1xuICAgICAgLSBhIGNvbXBhcmF0b3Igd2l0bmVzc1xuICAgICAgLSBhIFtoYXNoX2ZvbGRfdF0gZnVuY3Rpb24gd2l0aCB0aGUgcmlnaHQgdHlwZSAqKVxuICBtb2R1bGUgTSAoSyA6IHNpZ1xuICAgICAgdHlwZSB0XG4gICAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZCkgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyAndiB0ID0gKEsudCwgJ3YsIEsuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gIGVuZFxuXG4gIGluY2x1ZGUgRm9yX2Rlcml2aW5nIHdpdGggdHlwZSAoJ2tleSwgJ3ZhbHVlLCAnY21wKSB0IDo9ICgna2V5LCAndmFsdWUsICdjbXApIHRcblxuICAoKiogW1VzaW5nX2NvbXBhcmF0b3JdIGlzIGEgc2ltaWxhciBpbnRlcmZhY2UgYXMgdGhlIHRvcGxldmVsIG9mIFtNYXBdLCBleGNlcHQgdGhlXG4gICAgICBmdW5jdGlvbnMgdGFrZSBhIFt+Y29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudF0sIHdoZXJlYXMgdGhlIGZ1bmN0aW9ucyBhdCB0aGVcbiAgICAgIHRvcGxldmVsIG9mIFtNYXBdIHRha2UgYSBbKCdrLCAnY21wKSBjb21wYXJhdG9yXS4gKilcbiAgbW9kdWxlIFVzaW5nX2NvbXBhcmF0b3IgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyAoJ2ssICsndiwgJ2NtcCkgdCA9ICgnaywgJ3YsICdjbXApIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90XG4gICAgICA6ICAoJ2sgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCd2IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnY21wIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgIHZhbCB0X29mX3NleHBfZGlyZWN0XG4gICAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAtPiAoU2V4cC50IC0+ICdrKVxuICAgICAgLT4gKFNleHAudCAtPiAndilcbiAgICAgIC0+IFNleHAudFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICAgbW9kdWxlIFRyZWUgOiBzaWdcbiAgICAgIHR5cGUgKCsnaywgKyd2LCAnY21wKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgICB2YWwgc2V4cF9vZl90XG4gICAgICAgIDogICgnayAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgIC0+ICgndiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgIC0+ICgnY21wIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgICAgW0BAQGVuZF1cblxuICAgICAgdmFsIHRfb2Zfc2V4cF9kaXJlY3RcbiAgICAgICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgICAtPiAoU2V4cC50IC0+ICdrKVxuICAgICAgICAtPiAoU2V4cC50IC0+ICd2KVxuICAgICAgICAtPiBTZXhwLnRcbiAgICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICAgICBpbmNsdWRlXG4gICAgICAgIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvclxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSB0XG5cbiAgICAgIHZhbCBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIDogKF8sIF8sIF8pIHRcblxuICAgICAgKCoqIFtCdWlsZF9pbmNyZWFzaW5nXSBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBtYXAgaW5jcmVtZW50YWxseSBmcm9tIGFcbiAgICAgICAgICBzZXF1ZW5jZSB0aGF0IGlzIGtub3duIHRvIGJlIGluY3JlYXNpbmcuXG5cbiAgICAgICAgICBUaGUgdG90YWwgdGltZSBjb21wbGV4aXR5IG9mIGNvbnN0cnVjdGluZyBhIG1hcCB0aGlzIHdheSBpcyBPKG4pLCB3aGljaCBpcyBtb3JlXG4gICAgICAgICAgZWZmaWNpZW50IHRoYW4gdXNpbmcgW01hcC5hZGRdIGJ5IGEgbG9nYXJpdGhtaWMgZmFjdG9yLlxuXG4gICAgICAgICAgVGhpcyBpbnRlcmZhY2UgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBkdWFsIG9mIFt0b19zZXF1ZW5jZV0sIGJ1dCB3ZSBkb24ndCBoYXZlXG4gICAgICAgICAgYW4gZXF1YWxseSBuZWF0IGlkaW9tIGZvciB0aGUgZHVhbHMgb2Ygc2VxdWVuY2VzIChbb2Zfc2VxdWVuY2VdIGlzIG11Y2ggbGVzc1xuICAgICAgICAgIGdlbmVyYWwgYmVjYXVzZSBpdCBkb2VzIG5vdCBhbGxvdyB0aGUgc2VxdWVuY2UgdG8gYmUgcHJvZHVjZWQgYXN5bmNocm9ub3VzbHkpLiAqKVxuICAgICAgbW9kdWxlIEJ1aWxkX2luY3JlYXNpbmcgOiBzaWdcbiAgICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgdFxuICAgICAgICB0eXBlICgnaywgJ3YsICd3KSB0XG5cbiAgICAgICAgdmFsIGVtcHR5IDogKCdrLCAndiwgJ3cpIHRcblxuICAgICAgICAoKiogVGltZSBjb21wbGV4aXR5IG9mIFthZGRfZXhuXSBpcyBhbW9ydGl6ZWQgY29uc3RhbnQtdGltZSAoaWYgW3RdIGlzIHVzZWRcbiAgICAgICAgICAgIGxpbmVhcmx5KSwgd2l0aCBhIHdvcnN0LWNhc2UgTyhsb2cobikpIHRpbWUuICopXG4gICAgICAgIHZhbCBhZGRfZXhuXG4gICAgICAgICAgOiAgKCdrLCAndiwgJ3cpIHRcbiAgICAgICAgICAtPiBjb21wYXJhdG9yOignaywgJ3cpIENvbXBhcmF0b3IudFxuICAgICAgICAgIC0+IGtleTona1xuICAgICAgICAgIC0+IGRhdGE6J3ZcbiAgICAgICAgICAtPiAoJ2ssICd2LCAndykgdFxuXG4gICAgICAgICgqKiBUaW1lIGNvbXBsZXhpdHkgaXMgTyhsb2cobikpLiAqKVxuICAgICAgICB2YWwgdG9fdHJlZSA6ICgnaywgJ3YsICd3KSB0IC0+ICgnaywgJ3YsICd3KSB0cmVlXG4gICAgICBlbmRcbiAgICBlbmRcblxuICAgIGluY2x1ZGVcbiAgICAgIEFjY2Vzc29yczNcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgdFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSBUcmVlLnRcblxuICAgIGluY2x1ZGVcbiAgICAgIENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3JcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgdFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSBUcmVlLnRcblxuICAgIHZhbCBjb21wYXJhdG9yIDogKCdhLCBfLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci50XG5cbiAgICB2YWwgaGFzaF9mb2xkX2RpcmVjdFxuICAgICAgOiAgJ2sgSGFzaC5mb2xkZXJcbiAgICAgIC0+ICd2IEhhc2guZm9sZGVyXG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0IEhhc2guZm9sZGVyXG5cbiAgICAoKiogVG8gZ2V0IGFyb3VuZCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24sIGFwcGx5IHRoZSBmdW5jdG9yIGFuZCBpbmNsdWRlIGl0LiBZb3VcbiAgICAgICAgY2FuIHNlZSBhbiBleGFtcGxlIG9mIHRoaXMgaW4gdGhlIFtQb2x5XSBzdWJtb2R1bGUgYmVsb3cuICopXG4gICAgbW9kdWxlIEVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKEsgOiBDb21wYXJhdG9yLlMxKSA6IHNpZ1xuICAgICAgdmFsIGVtcHR5IDogKCdhIEsudCwgJ3YsIEsuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gICAgZW5kXG4gIGVuZFxuXG4gICgqKiBBIHBvbHltb3JwaGljIE1hcC4gKilcbiAgbW9kdWxlIFBvbHkgOlxuICAgIFNfcG9seVxuICAgIHdpdGggdHlwZSAoJ2tleSwgKyd2YWx1ZSkgdCA9ICgna2V5LCAndmFsdWUsIENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgICAgYW5kIHR5cGUgKCdrZXksICsndmFsdWUpIHRyZWUgPVxuICAgICAgICAgICAoJ2tleSwgJ3ZhbHVlLCBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzKSBVc2luZ19jb21wYXJhdG9yLlRyZWUudFxuICAgICBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgKCoqIENyZWF0ZSBhIG1hcCBmcm9tIGEgdHJlZSB1c2luZyB0aGUgZ2l2ZW4gY29tcGFyYXRvci4gKilcbiAgdmFsIG9mX3RyZWVcbiAgICA6ICAoJ2ssICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSBVc2luZ19jb21wYXJhdG9yLlRyZWUudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogRXh0cmFjdCBhIHRyZWUgZnJvbSBhIG1hcC4gKilcbiAgdmFsIHRvX3RyZWUgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIFVzaW5nX2NvbXBhcmF0b3IuVHJlZS50XG5cblxuICAoKiogezIgTW9kdWxlcyBhbmQgbW9kdWxlIHR5cGVzIGZvciBleHRlbmRpbmcgW01hcF19XG5cbiAgICAgIEZvciB1c2UgaW4gZXh0ZW5zaW9ucyBvZiBCYXNlLCBsaWtlIFtDb3JlXS4gKilcblxuICBtb2R1bGUgV2l0aF9jb21wYXJhdG9yID0gV2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZSA9IFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlXG4gIG1vZHVsZSBXaXRob3V0X2NvbXBhcmF0b3IgPSBXaXRob3V0X2NvbXBhcmF0b3JcblxuICBtb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBGb3JfZGVyaXZpbmdcbiAgbW9kdWxlIHR5cGUgU19wb2x5ID0gU19wb2x5XG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczEgPSBBY2Nlc3NvcnMxXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczIgPSBBY2Nlc3NvcnMyXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczMgPSBBY2Nlc3NvcnMzXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yID0gQWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzX2dlbmVyaWMgPSBBY2Nlc3NvcnNfZ2VuZXJpY1xuICBtb2R1bGUgdHlwZSBDcmVhdG9yczEgPSBDcmVhdG9yczFcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMyID0gQ3JlYXRvcnMyXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3IgPSBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczFcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczIgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMlxuXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvciA9XG4gICAgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yXG5cbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yc19nZW5lcmljID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yc19nZW5lcmljXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBDcmVhdG9yc19nZW5lcmljXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgVFxuXG5tb2R1bGUgdHlwZSBFbHRfcGxhaW4gPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgV2l0aG91dF9jb21wYXJhdG9yID0gTWFwX2ludGYuV2l0aG91dF9jb21wYXJhdG9yXG5tb2R1bGUgV2l0aF9jb21wYXJhdG9yID0gTWFwX2ludGYuV2l0aF9jb21wYXJhdG9yXG5tb2R1bGUgV2l0aF9maXJzdF9jbGFzc19tb2R1bGUgPSBNYXBfaW50Zi5XaXRoX2ZpcnN0X2NsYXNzX21vZHVsZVxubW9kdWxlIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQgPSBTZXF1ZW5jZS5NZXJnZV93aXRoX2R1cGxpY2F0ZXNfZWxlbWVudFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnNfZ2VuZXJpYyA9IHNpZ1xuICBpbmNsdWRlIENvbnRhaW5lci5HZW5lcmljX3BoYW50b21cblxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuXG4gICgqKiBUaGUgW29wdGlvbnNdIHR5cGUgaXMgdXNlZCB0byBtYWtlIFtBY2Nlc3NvcnNfZ2VuZXJpY10gZmxleGlibGUgYXMgdG8gd2hldGhlciBhXG4gICAgICBjb21wYXJhdG9yIGlzIHJlcXVpcmVkIHRvIGJlIHBhc3NlZCB0byBjZXJ0YWluIGZ1bmN0aW9ucy4gKilcbiAgdHlwZSAoJ2EsICdjbXAsICd6KSBvcHRpb25zXG5cbiAgdHlwZSAnY21wIGNtcFxuXG4gIHZhbCBpbnZhcmlhbnRzIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gYm9vbCkgb3B0aW9uc1xuXG4gICgqKiBvdmVycmlkZSBbQ29udGFpbmVyXSdzIFttZW1dICopXG4gIHZhbCBtZW0gOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAnYSBlbHQgLT4gYm9vbCkgb3B0aW9uc1xuXG4gIHZhbCBhZGQgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAnYSBlbHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCByZW1vdmUgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAnYSBlbHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCB1bmlvbiA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIGludGVyIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgZGlmZiA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSBlbHQsICdhIGVsdCkgRWl0aGVyLnQgU2VxdWVuY2UudCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gaW50KSBvcHRpb25zXG4gIHZhbCBlcXVhbCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sKSBvcHRpb25zXG4gIHZhbCBpc19zdWJzZXQgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiBvZl86KCdhLCAnY21wKSB0IC0+IGJvb2wpIG9wdGlvbnNcbiAgdmFsIGFyZV9kaXNqb2ludCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sKSBvcHRpb25zXG5cbiAgdHlwZSAoJ2EsICdjbXApIG5hbWVkXG5cbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdmFsIGlzX3N1YnNldFxuICAgICAgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgbmFtZWQgLT4gb2ZfOignYSwgJ2NtcCkgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgICB2YWwgZXF1YWxcbiAgICAgIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIG5hbWVkIC0+ICgnYSwgJ2NtcCkgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50KSBvcHRpb25zXG4gIGVuZFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+ICdhIGVsdCAtPiAoJ2IsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdiIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgXykgdCAtPiBpbml0OidiIC0+IGY6KCdhIGVsdCAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgaXRlcjJcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gZjooWyBgTGVmdCBvZiAnYSBlbHQgfCBgUmlnaHQgb2YgJ2EgZWx0IHwgYEJvdGggb2YgJ2EgZWx0ICogJ2EgZWx0IF0gLT4gdW5pdClcbiAgICAgIC0+IHVuaXQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgKiAoJ2EsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGVsZW1lbnRzIDogKCdhLCBfKSB0IC0+ICdhIGVsdCBsaXN0XG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhIGVsdFxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYSBlbHRcbiAgdmFsIGNob29zZSA6ICgnYSwgXykgdCAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogKCdhLCBfKSB0IC0+ICdhIGVsdFxuXG4gIHZhbCBzcGxpdFxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdCAtPiAnYSBlbHQgLT4gKCdhLCAnY21wKSB0ICogJ2EgZWx0IG9wdGlvbiAqICgnYSwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZ3JvdXBfYnlcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHQgLT4gZXF1aXY6KCdhIGVsdCAtPiAnYSBlbHQgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0IGxpc3QgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZpbmRfZXhuIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiAnYSBlbHRcbiAgdmFsIG50aCA6ICgnYSwgXykgdCAtPiBpbnQgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgcmVtb3ZlX2luZGV4IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gaW50IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EgZWx0LCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYSBlbHRcbiAgICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhIGVsdFxuICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAtPiAnYSBlbHQgU2VxdWVuY2UudCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gY29tcGFyZTooJ2EgZWx0IC0+ICdrZXkgLT4gaW50KVxuICAgICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgICAtPiAna2V5XG4gICAgICAtPiAnYSBlbHQgb3B0aW9uIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gc2VnbWVudF9vZjooJ2EgZWx0IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAgIC0+ICdhIGVsdCBvcHRpb24gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYSBlbHRcbiAgICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhIGVsdFxuICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgIC0+ICgnYSBlbHQsICdhIGVsdCkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnQgKVxuICAgICAgICBvcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMCA9IHNpZ1xuICBpbmNsdWRlIENvbnRhaW5lci5TMFxuXG4gIHR5cGUgdHJlZVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBpbnZhcmlhbnRzIDogdCAtPiBib29sXG4gIHZhbCBtZW0gOiB0IC0+IGVsdCAtPiBib29sXG4gIHZhbCBhZGQgOiB0IC0+IGVsdCAtPiB0XG4gIHZhbCByZW1vdmUgOiB0IC0+IGVsdCAtPiB0XG4gIHZhbCB1bmlvbiA6IHQgLT4gdCAtPiB0XG4gIHZhbCBpbnRlciA6IHQgLT4gdCAtPiB0XG4gIHZhbCBkaWZmIDogdCAtPiB0IC0+IHRcbiAgdmFsIHN5bW1ldHJpY19kaWZmIDogdCAtPiB0IC0+IChlbHQsIGVsdCkgRWl0aGVyLnQgU2VxdWVuY2UudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiB0IC0+IHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6IHQgLT4gdCAtPiBib29sXG4gIHZhbCBpc19zdWJzZXQgOiB0IC0+IG9mXzp0IC0+IGJvb2xcbiAgdmFsIGFyZV9kaXNqb2ludCA6IHQgLT4gdCAtPiBib29sXG5cbiAgdHlwZSBuYW1lZFxuXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHZhbCBpc19zdWJzZXQgOiBuYW1lZCAtPiBvZl86bmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gICAgdmFsIGVxdWFsIDogbmFtZWQgLT4gbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gIGVuZFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgdFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiBlbHQgLT4gKCdiLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYiAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiB0IC0+IGluaXQ6J2IgLT4gZjooZWx0IC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBpdGVyMlxuICAgIDogIHRcbiAgICAtPiB0XG4gICAgLT4gZjooWyBgTGVmdCBvZiBlbHQgfCBgUmlnaHQgb2YgZWx0IHwgYEJvdGggb2YgZWx0ICogZWx0IF0gLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIGZpbHRlciA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IHRcbiAgdmFsIHBhcnRpdGlvbl90ZiA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IHQgKiB0XG4gIHZhbCBlbGVtZW50cyA6IHQgLT4gZWx0IGxpc3RcbiAgdmFsIG1pbl9lbHQgOiB0IC0+IGVsdCBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogdCAtPiBlbHRcbiAgdmFsIG1heF9lbHQgOiB0IC0+IGVsdCBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogdCAtPiBlbHRcbiAgdmFsIGNob29zZSA6IHQgLT4gZWx0IG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6IHQgLT4gZWx0XG4gIHZhbCBzcGxpdCA6IHQgLT4gZWx0IC0+IHQgKiBlbHQgb3B0aW9uICogdFxuICB2YWwgZ3JvdXBfYnkgOiB0IC0+IGVxdWl2OihlbHQgLT4gZWx0IC0+IGJvb2wpIC0+IHQgbGlzdFxuICB2YWwgZmluZF9leG4gOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBlbHRcbiAgdmFsIG50aCA6IHQgLT4gaW50IC0+IGVsdCBvcHRpb25cbiAgdmFsIHJlbW92ZV9pbmRleCA6IHQgLT4gaW50IC0+IHRcbiAgdmFsIHRvX3RyZWUgOiB0IC0+IHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzplbHRcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzplbHRcbiAgICAtPiB0XG4gICAgLT4gZWx0IFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogIHRcbiAgICAtPiBjb21wYXJlOihlbHQgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+IGVsdCBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICB0XG4gICAgLT4gc2VnbWVudF9vZjooZWx0IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gZWx0IG9wdGlvblxuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOmVsdFxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOmVsdFxuICAgIC0+IHRcbiAgICAtPiB0XG4gICAgLT4gKGVsdCwgZWx0KSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczEgPSBzaWdcbiAgaW5jbHVkZSBDb250YWluZXIuUzFcblxuICB0eXBlICdhIHRyZWVcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgaW52YXJpYW50cyA6IF8gdCAtPiBib29sXG4gIHZhbCBtZW0gOiAnYSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGFkZCA6ICdhIHQgLT4gJ2EgLT4gJ2EgdFxuICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiAnYSAtPiAnYSB0XG4gIHZhbCB1bmlvbiA6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0XG4gIHZhbCBpbnRlciA6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0XG4gIHZhbCBkaWZmIDogJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbiAgdmFsIHN5bW1ldHJpY19kaWZmIDogJ2EgdCAtPiAnYSB0IC0+ICgnYSwgJ2EpIEVpdGhlci50IFNlcXVlbmNlLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogJ2EgdCAtPiAnYSB0IC0+IGludFxuICB2YWwgZXF1YWwgOiAnYSB0IC0+ICdhIHQgLT4gYm9vbFxuICB2YWwgaXNfc3Vic2V0IDogJ2EgdCAtPiBvZl86J2EgdCAtPiBib29sXG4gIHZhbCBhcmVfZGlzam9pbnQgOiAnYSB0IC0+ICdhIHQgLT4gYm9vbFxuXG4gIHR5cGUgJ2EgbmFtZWRcblxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB2YWwgaXNfc3Vic2V0IDogJ2EgbmFtZWQgLT4gb2ZfOidhIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICAgIHZhbCBlcXVhbCA6ICdhIG5hbWVkIC0+ICdhIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICBlbmRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gJ2EgLT4gKCdiLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYiAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAnYSB0IC0+IGluaXQ6J2IgLT4gZjooJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgJ2EgdFxuICAgIC0+ICdhIHRcbiAgICAtPiBmOihbIGBMZWZ0IG9mICdhIHwgYFJpZ2h0IG9mICdhIHwgYEJvdGggb2YgJ2EgKiAnYSBdIC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXIgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIHRcbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2EgdCAqICdhIHRcbiAgdmFsIGVsZW1lbnRzIDogJ2EgdCAtPiAnYSBsaXN0XG4gIHZhbCBtaW5fZWx0IDogJ2EgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogJ2EgdCAtPiAnYVxuICB2YWwgbWF4X2VsdCA6ICdhIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICdhIHQgLT4gJ2FcbiAgdmFsIGNob29zZSA6ICdhIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogJ2EgdCAtPiAnYVxuICB2YWwgc3BsaXQgOiAnYSB0IC0+ICdhIC0+ICdhIHQgKiAnYSBvcHRpb24gKiAnYSB0XG4gIHZhbCBncm91cF9ieSA6ICdhIHQgLT4gZXF1aXY6KCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgbGlzdFxuICB2YWwgZmluZF9leG4gOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhXG4gIHZhbCBudGggOiAnYSB0IC0+IGludCAtPiAnYSBvcHRpb25cbiAgdmFsIHJlbW92ZV9pbmRleCA6ICdhIHQgLT4gaW50IC0+ICdhIHRcbiAgdmFsIHRvX3RyZWUgOiAnYSB0IC0+ICdhIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gJ2EgdFxuICAgIC0+ICdhIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICdhIHRcbiAgICAtPiBjb21wYXJlOignYSAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgJ2EgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KCdhIC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICdhIHRcbiAgICAtPiAnYSB0XG4gICAgLT4gKCdhLCAnYSkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMyID0gc2lnXG4gIGluY2x1ZGUgQ29udGFpbmVyLlMxX3BoYW50b21faW52YXJpYW50XG5cbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgaW52YXJpYW50cyA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIG1lbSA6ICgnYSwgXykgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBhZGQgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCByZW1vdmUgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCB1bmlvbiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBpbnRlciA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBkaWZmIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHN5bW1ldHJpY19kaWZmIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdhKSBFaXRoZXIudCBTZXF1ZW5jZS50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuICB2YWwgaXNfc3Vic2V0IDogKCdhLCAnY21wKSB0IC0+IG9mXzooJ2EsICdjbXApIHQgLT4gYm9vbFxuICB2YWwgYXJlX2Rpc2pvaW50IDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG5cbiAgdHlwZSAoJ2EsICdjbXApIG5hbWVkXG5cbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdmFsIGlzX3N1YnNldCA6ICgnYSwgJ2NtcCkgbmFtZWQgLT4gb2ZfOignYSwgJ2NtcCkgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gICAgdmFsIGVxdWFsIDogKCdhLCAnY21wKSBuYW1lZCAtPiAoJ2EsICdjbXApIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICBlbmRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiAnYSAtPiAoJ2IsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdiIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgXykgdCAtPiBpbml0OidiIC0+IGY6KCdhIC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBpdGVyMlxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGY6KFsgYExlZnQgb2YgJ2EgfCBgUmlnaHQgb2YgJ2EgfCBgQm90aCBvZiAnYSAqICdhIF0gLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2NtcCkgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICgnYSwgJ2NtcCkgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgKiAoJ2EsICdjbXApIHRcbiAgdmFsIGVsZW1lbnRzIDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG4gIHZhbCBjaG9vc2UgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG4gIHZhbCBzcGxpdCA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHQgKiAnYSBvcHRpb24gKiAoJ2EsICdjbXApIHRcbiAgdmFsIGdyb3VwX2J5IDogKCdhLCAnY21wKSB0IC0+IGVxdWl2OignYSAtPiAnYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgbGlzdFxuICB2YWwgZmluZF9leG4gOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2FcbiAgdmFsIG50aCA6ICgnYSwgXykgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uXG4gIHZhbCByZW1vdmVfaW5kZXggOiAoJ2EsICdjbXApIHQgLT4gaW50IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gJ2EgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KCdhIC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2EpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgaW5jbHVkZSBDb250YWluZXIuUzFfcGhhbnRvbV9pbnZhcmlhbnRcblxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBpbnZhcmlhbnRzIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuICB2YWwgbWVtIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgYWRkIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCByZW1vdmUgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgdW5pb25cbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIGludGVyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBkaWZmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdhKSBFaXRoZXIudCBTZXF1ZW5jZS50XG5cbiAgdmFsIGNvbXBhcmVfZGlyZWN0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGludFxuXG4gIHZhbCBlcXVhbCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG5cbiAgdmFsIGlzX3N1YnNldFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBvZl86KCdhLCAnY21wKSB0XG4gICAgLT4gYm9vbFxuXG4gIHZhbCBhcmVfZGlzam9pbnRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gYm9vbFxuXG4gIHR5cGUgKCdhLCAnY21wKSBuYW1lZFxuXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHZhbCBpc19zdWJzZXRcbiAgICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgbmFtZWRcbiAgICAgIC0+IG9mXzooJ2EsICdjbXApIG5hbWVkXG4gICAgICAtPiB1bml0IE9yX2Vycm9yLnRcblxuICAgIHZhbCBlcXVhbFxuICAgICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgLT4gKCdhLCAnY21wKSBuYW1lZFxuICAgICAgLT4gKCdhLCAnY21wKSBuYW1lZFxuICAgICAgLT4gdW5pdCBPcl9lcnJvci50XG4gIGVuZFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgXykgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYSAtPiAnYWNjdW0gLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICB2YWwgaXRlcjJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZjooWyBgTGVmdCBvZiAnYSB8IGBSaWdodCBvZiAnYSB8IGBCb3RoIG9mICdhICogJ2EgXSAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGY6KCdhIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBmOignYSAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2NtcCkgdCAqICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBlbGVtZW50cyA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuICB2YWwgY2hvb3NlIDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6ICgnYSwgXykgdCAtPiAnYVxuXG4gIHZhbCBzcGxpdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+ICgnYSwgJ2NtcCkgdCAqICdhIG9wdGlvbiAqICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBncm91cF9ieVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBlcXVpdjooJ2EgLT4gJ2EgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdjbXApIHQgbGlzdFxuXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYVxuICB2YWwgbnRoIDogKCdhLCBfKSB0IC0+IGludCAtPiAnYSBvcHRpb25cblxuICB2YWwgcmVtb3ZlX2luZGV4XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGludFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCB0b190cmVlIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gJ2EgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gc2VnbWVudF9vZjooJ2EgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2EpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5lbmRcblxuKCoqIENvbnNpc3RlbmN5IGNoZWNrcyAoc2FtZSBhcyBpbiBbQ29udGFpbmVyXSkuICopXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKFQgOiBUMilcbiAgICAoVHJlZSA6IFQyKVxuICAgIChFbHQgOiBUMSlcbiAgICAoTmFtZWQgOiBUMilcbiAgICAoQ21wIDogVDEpXG4gICAgKE9wdGlvbnMgOiBUMylcbiAgICAoXyA6IEFjY2Vzc29yc19nZW5lcmljXG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgT3B0aW9ucy50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIFQudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSBUcmVlLnRcbiAgICAgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBFbHQudFxuICAgICB3aXRoIHR5cGUgJ2NtcCBjbXAgOj0gJ2NtcCBDbXAudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYikgbmFtZWQgOj0gKCdhLCAnYikgTmFtZWQudCkgPVxuc3RydWN0IGVuZFxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMCAoTSA6IEFjY2Vzc29yczApID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9IE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmVsdFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSBNLm5hbWVkXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMxIChNIDogQWNjZXNzb3JzMSkgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAnYSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gJ2EgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICdhIE0ubmFtZWRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczIgKE0gOiBBY2Nlc3NvcnMyKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS5uYW1lZFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IgKE0gOiBBY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvcikgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0ubmFtZWRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKFdpdGhfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IHNpZ1xuICB0eXBlICgnYSwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2NtcCkgc2V0XG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG4gIHR5cGUgJ2EgZWx0XG4gIHR5cGUgKCdhLCAnY21wLCAneikgb3B0aW9uc1xuICB0eXBlICdjbXAgY21wXG5cbiAgdmFsIGVtcHR5IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHNpbmdsZXRvbiA6ICgnYSwgJ2NtcCwgJ2EgZWx0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgdW5pb25fbGlzdCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IGxpc3QgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBvZl9saXN0IDogKCdhLCAnY21wLCAnYSBlbHQgbGlzdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG9mX3NlcXVlbmNlIDogKCdhLCAnY21wLCAnYSBlbHQgU2VxdWVuY2UudCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG9mX2FycmF5IDogKCdhLCAnY21wLCAnYSBlbHQgYXJyYXkgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiAoJ2EsICdjbXAsICdhIGVsdCBhcnJheSAtPiAoJ2EsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6ICgnYSwgJ2NtcCwgJ2EgZWx0IGFycmF5IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogKCdhLCAnY21wLCBsZW46aW50IC0+IGY6KGludCAtPiAnYSBlbHQpIC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6ICgnYSwgXywgJ2EgZWx0IGxpc3QgLT4gJ2EgZWx0IGxpc3QpIG9wdGlvbnNcblxuICAoKiogVGhlIHR5cGVzIG9mIFttYXBdIGFuZCBbZmlsdGVyX21hcF0gYXJlIHN1YnRsZS4gIFRoZSBpbnB1dCBzZXQsIFsoJ2EsIF8pIHNldF0sXG4gICAgICByZWZsZWN0cyB0aGUgZmFjdCB0aGF0IHRoZXNlIGZ1bmN0aW9ucyB0YWtlIGEgc2V0IG9mICphbnkqIHR5cGUsIHdpdGggYW55XG4gICAgICBjb21wYXJhdG9yLCB3aGlsZSB0aGUgb3V0cHV0IHNldCwgWygnYiwgJ2NtcCkgdF0sIHJlZmxlY3RzIHRoYXQgdGhlIG91dHB1dCBzZXQgaGFzXG4gICAgICB0aGUgcGFydGljdWxhciBbJ2NtcF0gb2YgdGhlIGNyZWF0aW9uIGZ1bmN0aW9uLiAgVGhlIGNvbXBhcmF0b3IgY2FuIGNvbWUgaW4gb25lIG9mXG4gICAgICB0aHJlZSB3YXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggc2V0IG1vZHVsZSBpcyB1c2VkXG5cbiAgICAgIC0gW1NldC5tYXBdIC0tIGNvbXBhcmF0b3IgY29tZXMgYXMgYW4gYXJndW1lbnRcbiAgICAgIC0gW1NldC5Qb2x5Lm1hcF0gLS0gY29tcGFyYXRvciBpcyBwb2x5bW9ycGhpYyBjb21wYXJpc29uXG4gICAgICAtIFtGb28uU2V0Lm1hcF0gLS0gY29tcGFyYXRvciBpcyBbRm9vLmNvbXBhcmF0b3JdICopXG4gIHZhbCBtYXAgOiAoJ2IsICdjbXAsICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiIGVsdCkgLT4gKCdiLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGZpbHRlcl9tYXBcbiAgICA6ICgnYiwgJ2NtcCwgKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2IgZWx0IG9wdGlvbikgLT4gKCdiLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX3RyZWUgOiAoJ2EsICdjbXAsICgnYSBlbHQsICdjbXApIHRyZWUgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMwID0gc2lnXG4gIHR5cGUgKCdhLCAnY21wKSBzZXRcbiAgdHlwZSB0XG4gIHR5cGUgdHJlZVxuICB0eXBlIGVsdFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBlbXB0eSA6IHRcbiAgdmFsIHNpbmdsZXRvbiA6IGVsdCAtPiB0XG4gIHZhbCB1bmlvbl9saXN0IDogdCBsaXN0IC0+IHRcbiAgdmFsIG9mX2xpc3QgOiBlbHQgbGlzdCAtPiB0XG4gIHZhbCBvZl9zZXF1ZW5jZSA6IGVsdCBTZXF1ZW5jZS50IC0+IHRcbiAgdmFsIG9mX2FycmF5IDogZWx0IGFycmF5IC0+IHRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6IGVsdCBhcnJheSAtPiB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiBlbHQgYXJyYXkgLT4gdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgOiBsZW46aW50IC0+IGY6KGludCAtPiBlbHQpIC0+IHRcbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogZWx0IGxpc3QgLT4gZWx0IGxpc3RcbiAgdmFsIG1hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+IGVsdCkgLT4gdFxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+IGVsdCBvcHRpb24pIC0+IHRcbiAgdmFsIG9mX3RyZWUgOiB0cmVlIC0+IHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczEgPSBzaWdcbiAgdHlwZSAoJ2EsICdjbXApIHNldFxuICB0eXBlICdhIHRcbiAgdHlwZSAnYSB0cmVlXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGVtcHR5IDogJ2EgdFxuICB2YWwgc2luZ2xldG9uIDogJ2EgLT4gJ2EgdFxuICB2YWwgdW5pb25fbGlzdCA6ICdhIHQgbGlzdCAtPiAnYSB0XG4gIHZhbCBvZl9saXN0IDogJ2EgbGlzdCAtPiAnYSB0XG4gIHZhbCBvZl9zZXF1ZW5jZSA6ICdhIFNlcXVlbmNlLnQgLT4gJ2EgdFxuICB2YWwgb2ZfYXJyYXkgOiAnYSBhcnJheSAtPiAnYSB0XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiAnYSBhcnJheSAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiAnYSBhcnJheSAtPiAnYSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCA6IGxlbjppbnQgLT4gZjooaW50IC0+ICdhKSAtPiAnYSB0XG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6ICdhIGxpc3QgLT4gJ2EgbGlzdFxuICB2YWwgbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2IpIC0+ICdiIHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIHRcbiAgdmFsIG9mX3RyZWUgOiAnYSB0cmVlIC0+ICdhIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczIgPSBzaWdcbiAgdHlwZSAoJ2EsICdjbXApIHNldFxuICB0eXBlICgnYSwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBlbXB0eSA6ICgnYSwgJ2NtcCkgdFxuICB2YWwgc2luZ2xldG9uIDogJ2EgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCB1bmlvbl9saXN0IDogKCdhLCAnY21wKSB0IGxpc3QgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9saXN0IDogJ2EgbGlzdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX3NlcXVlbmNlIDogJ2EgU2VxdWVuY2UudCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2FycmF5IDogJ2EgYXJyYXkgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiAnYSBhcnJheSAtPiAoJ2EsICdjbXApIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6ICdhIGFycmF5IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgOiBsZW46aW50IC0+IGY6KGludCAtPiAnYSkgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6ICdhIGxpc3QgLT4gJ2EgbGlzdFxuICB2YWwgbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2NtcCkgdFxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gKCdiLCAnY21wKSB0XG4gIHZhbCBvZl90cmVlIDogKCdhLCAnY21wKSB0cmVlIC0+ICgnYSwgJ2NtcCkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgdHlwZSAoJ2EsICdjbXApIHNldFxuICB0eXBlICgnYSwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBlbXB0eSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBzaW5nbGV0b24gOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgdW5pb25fbGlzdCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IGxpc3QgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9saXN0IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2Zfc2VxdWVuY2UgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIFNlcXVlbmNlLnQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9hcnJheSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgYXJyYXkgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAnYSBhcnJheVxuICAgIC0+ICgnYSwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gJ2EgYXJyYXlcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IGY6KGludCAtPiAnYSlcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIGxpc3QgLT4gJ2EgbGlzdFxuXG4gIHZhbCBtYXBcbiAgICA6ICBjb21wYXJhdG9yOignYiwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCBfKSBzZXRcbiAgICAtPiBmOignYSAtPiAnYilcbiAgICAtPiAoJ2IsICdjbXApIHRcblxuICB2YWwgZmlsdGVyX21hcFxuICAgIDogIGNvbXBhcmF0b3I6KCdiLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsIF8pIHNldFxuICAgIC0+IGY6KCdhIC0+ICdiIG9wdGlvbilcbiAgICAtPiAoJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfdHJlZSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0cmVlIC0+ICgnYSwgJ2NtcCkgdFxuZW5kXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yc1xuICAgIChUIDogVDIpXG4gICAgKFRyZWUgOiBUMilcbiAgICAoRWx0IDogVDEpXG4gICAgKENtcCA6IFQxKVxuICAgIChPcHRpb25zIDogVDMpXG4gICAgKF8gOiBDcmVhdG9yc19nZW5lcmljXG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgT3B0aW9ucy50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIFQudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSBUcmVlLnRcbiAgICAgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBFbHQudFxuICAgICB3aXRoIHR5cGUgJ2NtcCBjbXAgOj0gJ2NtcCBDbXAudCkgPVxuc3RydWN0IGVuZFxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMwIChNIDogQ3JlYXRvcnMwKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9IE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmVsdFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdjbXAgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczEgKE0gOiBDcmVhdG9yczEpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAnYSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gJ2EgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2NtcCB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMiAoTSA6IENyZWF0b3JzMikgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnY21wIHQgPSAnY21wXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yIChNIDogQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvcikgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnY21wIHQgPSAnY21wXG4gICAgZW5kKVxuICAgIChXaXRoX2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnNfZ2VuZXJpYyA9IHNpZ1xuICBpbmNsdWRlIEFjY2Vzc29yc19nZW5lcmljXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzX2dlbmVyaWNcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIG9wdGlvbnNcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgdHJlZVxuICAgIHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgZWx0XG4gICAgd2l0aCB0eXBlICdjbXAgY21wIDo9ICdjbXAgY21wXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczAgPSBzaWdcbiAgaW5jbHVkZSBBY2Nlc3NvcnMwXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzMFxuICAgIHdpdGggdHlwZSB0IDo9IHRcbiAgICB3aXRoIHR5cGUgdHJlZSA6PSB0cmVlXG4gICAgd2l0aCB0eXBlIGVsdCA6PSBlbHRcbiAgICB3aXRoIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzIDo9IGNvbXBhcmF0b3Jfd2l0bmVzc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxID0gc2lnXG4gIGluY2x1ZGUgQWNjZXNzb3JzMVxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yczFcbiAgICB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gICAgd2l0aCB0eXBlICdhIHRyZWUgOj0gJ2EgdHJlZVxuICAgIHdpdGggdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgOj0gY29tcGFyYXRvcl93aXRuZXNzXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczIgPSBzaWdcbiAgaW5jbHVkZSBBY2Nlc3NvcnMyXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0IHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIHRyZWVcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgaW5jbHVkZSBBY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvclxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIHRyZWVcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX3BvbHkgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMVxuXG5tb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgbW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICAgIFtAQEBlbmRdXG5cbiAgICBpbmNsdWRlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA6PSB0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBDb21wYXJlX20gPSBzaWcgZW5kXG4gIG1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG4gIG1vZHVsZSB0eXBlIEhhc2hfZm9sZF9tID0gSGFzaGVyLlNcblxuICB2YWwgc2V4cF9vZl9tX190IDogKG1vZHVsZSBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSAnZWx0KSAtPiAoJ2VsdCwgJ2NtcCkgdCAtPiBTZXhwLnRcblxuICB2YWwgbV9fdF9vZl9zZXhwXG4gICAgOiAgKG1vZHVsZSBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSAnZWx0IGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9ICdjbXApXG4gICAgLT4gU2V4cC50XG4gICAgLT4gKCdlbHQsICdjbXApIHRcblxuICB2YWwgbV9fdF9zZXhwX2dyYW1tYXJcbiAgICA6ICAobW9kdWxlIE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gJ2VsdClcbiAgICAtPiAoJ2VsdCwgJ2NtcCkgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIHZhbCBjb21wYXJlX21fX3QgOiAobW9kdWxlIENvbXBhcmVfbSkgLT4gKCdlbHQsICdjbXApIHQgLT4gKCdlbHQsICdjbXApIHQgLT4gaW50XG4gIHZhbCBlcXVhbF9tX190IDogKG1vZHVsZSBFcXVhbF9tKSAtPiAoJ2VsdCwgJ2NtcCkgdCAtPiAoJ2VsdCwgJ2NtcCkgdCAtPiBib29sXG5cbiAgdmFsIGhhc2hfZm9sZF9tX190XG4gICAgOiAgKG1vZHVsZSBIYXNoX2ZvbGRfbSB3aXRoIHR5cGUgdCA9ICdlbHQpXG4gICAgLT4gSGFzaC5zdGF0ZVxuICAgIC0+ICgnZWx0LCBfKSB0XG4gICAgLT4gSGFzaC5zdGF0ZVxuXG4gIHZhbCBoYXNoX21fX3QgOiAobW9kdWxlIEhhc2hfZm9sZF9tIHdpdGggdHlwZSB0ID0gJ2VsdCkgLT4gKCdlbHQsIF8pIHQgLT4gaW50XG5lbmRcblxubW9kdWxlIHR5cGUgU2V0ID0gc2lnXG4gICgqKiBTZXRzIGJhc2VkIG9uIHshQ29tcGFyYXRvci5TfS5cblxuICAgICAgQ3JlYXRvcnMgcmVxdWlyZSBhIGNvbXBhcmF0b3IgYXJndW1lbnQgdG8gYmUgcGFzc2VkIGluLCB3aGVyZWFzIGFjY2Vzc29ycyB1c2UgdGhlXG4gICAgICBjb21wYXJhdG9yIHByb3ZpZGVkIGJ5IHRoZSBpbnB1dCBzZXQuICopXG5cbiAgKCoqIFRoZSB0eXBlIG9mIGEgc2V0LiAgVGhlIGZpcnN0IHR5cGUgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnQsIGFuZFxuICAgICAgdGhlIHNlY29uZCBpZGVudGlmaWVzIHRoZSBjb21wYXJhdG9yLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHRoYXRcbiAgICAgIGlzIHVzZWQgZm9yIG9yZGVyaW5nIGVsZW1lbnRzIGluIHRoaXMgc2V0LiAgTWFueSBvcGVyYXRpb25zIChlLmcuLCB7IXVuaW9ufSksXG4gICAgICByZXF1aXJlIHRoYXQgdGhleSBiZSBwYXNzZWQgc2V0cyB3aXRoIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSBhbmQgdGhlIHNhbWUgY29tcGFyYXRvclxuICAgICAgdHlwZS4gKilcbiAgdHlwZSAoJ2VsdCwgJ2NtcCkgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZV1cblxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMyIHdpdGggdHlwZSAoJ2VsdCwgJ2NtcCkgdCA6PSAoJ2VsdCwgJ2NtcCkgdFxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSAoJ2ssICdjbXApIGNvbXBhcmF0b3IgPSAoJ2ssICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgW0BAZGVwcmVjYXRlZCBcIltzaW5jZSAyMDIxLTEyXSB1c2UgW0NvbXBhcmF0b3IuTW9kdWxlLnRdIGluc3RlYWRcIl1cblxuICAoKiogVGVzdHMgaW50ZXJuYWwgaW52YXJpYW50cyBvZiB0aGUgc2V0IGRhdGEgc3RydWN0dXJlLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuICopXG4gIHZhbCBpbnZhcmlhbnRzIDogKF8sIF8pIHQgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIGEgZmlyc3QtY2xhc3MgbW9kdWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgbWFwL3NldC9ldGNcbiAgICAgIHdpdGggdGhlIHNhbWUgbm90aW9uIG9mIGNvbXBhcmlzb24uICopXG4gIHZhbCBjb21wYXJhdG9yX3MgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG5cbiAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLnRcblxuICAoKiogQ3JlYXRlcyBhbiBlbXB0eSBzZXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbXBhcmF0b3IuICopXG4gIHZhbCBlbXB0eSA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogQ3JlYXRlcyBhIHNldCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29tcGFyYXRvciB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIHByb3ZpZGVkXG4gICAgICBlbGVtZW50LiAqKVxuICB2YWwgc2luZ2xldG9uIDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBSZXR1cm5zIHRoZSBjYXJkaW5hbGl0eSBvZiB0aGUgc2V0LiBbTygxKV0uICopXG4gIHZhbCBsZW5ndGggOiAoXywgXykgdCAtPiBpbnRcblxuICAoKiogW2lzX2VtcHR5IHRdIGlzIFt0cnVlXSBpZmYgW3RdIGlzIGVtcHR5LiAgW08oMSldLiAqKVxuICB2YWwgaXNfZW1wdHkgOiAoXywgXykgdCAtPiBib29sXG5cbiAgKCoqIFttZW0gdCBhXSByZXR1cm5zIFt0cnVlXSBpZmYgW2FdIGlzIGluIFt0XS4gIFtPKGxvZyBuKV0uICopXG4gIHZhbCBtZW0gOiAoJ2EsIF8pIHQgLT4gJ2EgLT4gYm9vbFxuXG4gICgqKiBbYWRkIHQgYV0gcmV0dXJucyBhIG5ldyBzZXQgd2l0aCBbYV0gYWRkZWQgdG8gW3RdLCBvciByZXR1cm5zIFt0XSBpZiBbbWVtIHQgYV0uXG4gICAgICBbTyhsb2cgbildLiAqKVxuICB2YWwgYWRkIDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbcmVtb3ZlIHQgYV0gcmV0dXJucyBhIG5ldyBzZXQgd2l0aCBbYV0gcmVtb3ZlZCBmcm9tIFt0XSBpZiBbbWVtIHQgYV0sIG9yIHJldHVybnMgW3RdXG4gICAgICBvdGhlcndpc2UuICBbTyhsb2cgbildLiAqKVxuICB2YWwgcmVtb3ZlIDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbdW5pb24gdDEgdDJdIHJldHVybnMgdGhlIHVuaW9uIG9mIHRoZSB0d28gc2V0cy4gIFtPKGxlbmd0aCB0MSArIGxlbmd0aCB0MildLiAqKVxuICB2YWwgdW5pb24gOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbdW5pb24gYyBsaXN0XSByZXR1cm5zIHRoZSB1bmlvbiBvZiBhbGwgdGhlIHNldHMgaW4gW2xpc3RdLiAgVGhlXG4gICAgICBbY29tcGFyYXRvcl0gYXJndW1lbnQgaXMgcmVxdWlyZWQgZm9yIHRoZSBjYXNlIHdoZXJlIFtsaXN0XSBpcyBlbXB0eS5cbiAgICAgIFtPKG1heChMaXN0Lmxlbmd0aCBsaXN0LCBuIGxvZyBuKSldLCB3aGVyZSBbbl0gaXMgdGhlIHN1bSBvZiBzaXplcyBvZiB0aGUgaW5wdXQgc2V0cy4gKilcbiAgdmFsIHVuaW9uX2xpc3QgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gKCdhLCAnY21wKSB0IGxpc3QgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtpbnRlciB0MSB0Ml0gY29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBvZiBzZXRzIFt0MV0gYW5kIFt0Ml0uICBbTyhsZW5ndGggdDEgK1xuICAgICAgbGVuZ3RoIHQyKV0uICopXG4gIHZhbCBpbnRlciA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtkaWZmIHQxIHQyXSBjb21wdXRlcyB0aGUgc2V0IGRpZmZlcmVuY2UgW3QxIC0gdDJdLCBpLmUuLCB0aGUgc2V0IGNvbnRhaW5pbmcgYWxsXG4gICAgICBlbGVtZW50cyBpbiBbdDFdIHRoYXQgYXJlIG5vdCBpbiBbdDJdLiAgW08obGVuZ3RoIHQxICsgbGVuZ3RoIHQyKV0uICopXG4gIHZhbCBkaWZmIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3N5bW1ldHJpY19kaWZmIHQxIHQyXSByZXR1cm5zIGEgc2VxdWVuY2Ugb2YgY2hhbmdlcyBiZXR3ZWVuIFt0MV0gYW5kIFt0Ml0uIEl0IGlzXG4gICAgICBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQgaW4gdGhlIGNhc2Ugd2hlcmUgW3QxXSBhbmQgW3QyXSBzaGFyZSBhIGxhcmdlIGFtb3VudCBvZlxuICAgICAgc3RydWN0dXJlLiAqKVxuICB2YWwgc3ltbWV0cmljX2RpZmYgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2EpIEVpdGhlci50IFNlcXVlbmNlLnRcblxuICAoKiogW2NvbXBhcmVfZGlyZWN0IHQxIHQyXSBjb21wYXJlcyB0aGUgc2V0cyBbdDFdIGFuZCBbdDJdLiAgSXQgcmV0dXJucyB0aGUgc2FtZSByZXN1bHRcbiAgICAgIGFzIFtjb21wYXJlXSwgYnV0IHVubGlrZSBjb21wYXJlLCBkb2Vzbid0IHJlcXVpcmUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCBpbiBmb3IgdGhlXG4gICAgICB0eXBlIHBhcmFtZXRlcnMgb2YgdGhlIHNldC4gIFtPKGxlbmd0aCB0MSArIGxlbmd0aCB0MildLiAqKVxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGludFxuXG4gICgqKiBIYXNoIGZ1bmN0aW9uOiBhIGJ1aWxkaW5nIGJsb2NrIHRvIHVzZSB3aGVuIGhhc2hpbmcgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgc2V0cyBpblxuICAgICAgdGhlbS4gW2hhc2hfZm9sZF9kaXJlY3QgaGFzaF9mb2xkX2tleV0gaXMgY29tcGF0aWJsZSB3aXRoIFtjb21wYXJlX2RpcmVjdF0gaWZmXG4gICAgICBbaGFzaF9mb2xkX2tleV0gaXMgY29tcGF0aWJsZSB3aXRoIFsoY29tcGFyYXRvciBzKS5jb21wYXJlXSBvZiB0aGUgc2V0IFtzXSBiZWluZ1xuICAgICAgaGFzaGVkLiAqKVxuICB2YWwgaGFzaF9mb2xkX2RpcmVjdCA6ICdhIEhhc2guZm9sZGVyIC0+ICgnYSwgJ2NtcCkgdCBIYXNoLmZvbGRlclxuXG4gICgqKiBbZXF1YWwgdDEgdDJdIHJldHVybnMgW3RydWVdIGlmZiB0aGUgdHdvIHNldHMgaGF2ZSB0aGUgc2FtZSBlbGVtZW50cy4gIFtPKGxlbmd0aCB0MSArXG4gICAgICBsZW5ndGggdDIpXSAqKVxuICB2YWwgZXF1YWwgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcblxuICAoKiogW2V4aXN0cyB0IH5mXSByZXR1cm5zIFt0cnVlXSBpZmYgdGhlcmUgZXhpc3RzIGFuIFthXSBpbiBbdF0gZm9yIHdoaWNoIFtmIGFdLiAgW08obildLFxuICAgICAgYnV0IHJldHVybnMgYXMgc29vbiBhcyBpdCBmaW5kcyBhbiBbYV0gZm9yIHdoaWNoIFtmIGFdLiAqKVxuICB2YWwgZXhpc3RzIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogW2Zvcl9hbGwgdCB+Zl0gcmV0dXJucyBbdHJ1ZV0gaWZmIGZvciBhbGwgW2FdIGluIFt0XSwgW2YgYV0uICBbTyhuKV0sIGJ1dCByZXR1cm5zIGFzXG4gICAgICBzb29uIGFzIGl0IGZpbmRzIGFuIFthXSBmb3Igd2hpY2ggW25vdCAoZiBhKV0uICopXG4gIHZhbCBmb3JfYWxsIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogW2NvdW50IHRdIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBbdF0gZm9yIHdoaWNoIFtmXSByZXR1cm5zIFt0cnVlXS5cbiAgICAgIFtPKG4pXS4gKilcbiAgdmFsIGNvdW50IDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGludFxuXG4gICgqKiBbc3VtIHRdIHJldHVybnMgdGhlIHN1bSBvZiBbZiB0XSBmb3IgZWFjaCBbdF0gaW4gdGhlIHNldC5cbiAgICAgIFtPKG4pXS4gKilcbiAgdmFsIHN1bVxuICAgIDogIChtb2R1bGUgQ29udGFpbmVyLlN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSlcbiAgICAtPiAoJ2EsIF8pIHRcbiAgICAtPiBmOignYSAtPiAnc3VtKVxuICAgIC0+ICdzdW1cblxuICAoKiogW2ZpbmQgdCBmXSByZXR1cm5zIGFuIGVsZW1lbnQgb2YgW3RdIGZvciB3aGljaCBbZl0gcmV0dXJucyB0cnVlLCB3aXRoIG5vIGd1YXJhbnRlZSBhc1xuICAgICAgdG8gd2hpY2ggZWxlbWVudCBpcyByZXR1cm5lZC4gIFtPKG4pXSwgYnV0IHJldHVybnMgYXMgc29vbiBhcyBhIHN1aXRhYmxlIGVsZW1lbnQgaXNcbiAgICAgIGZvdW5kLiAqKVxuICB2YWwgZmluZCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSBvcHRpb25cblxuICAoKiogW2ZpbmRfbWFwIHQgZl0gcmV0dXJucyBbYl0gZm9yIHNvbWUgW2FdIGluIFt0XSBmb3Igd2hpY2ggW2YgYSA9IFNvbWUgYl0uICBJZiBubyBzdWNoXG4gICAgICBbYV0gZXhpc3RzLCB0aGVuIFtmaW5kXSByZXR1cm5zIFtOb25lXS4gIFtPKG4pXSwgYnV0IHJldHVybnMgYXMgc29vbiBhcyBhIHN1aXRhYmxlXG4gICAgICBlbGVtZW50IGlzIGZvdW5kLiAqKVxuICB2YWwgZmluZF9tYXAgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cblxuICAoKiogTGlrZSBbZmluZF0sIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUuICopXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYVxuXG4gICgqKiBbbnRoIHQgaV0gcmV0dXJucyB0aGUgW2lddGggc21hbGxlc3QgZWxlbWVudCBvZiBbdF0sIGluIFtPKGxvZyBuKV0gdGltZS4gIFRoZVxuICAgICAgc21hbGxlc3QgZWxlbWVudCBoYXMgW2kgPSAwXS4gIFJldHVybnMgW05vbmVdIGlmIFtpIDwgMF0gb3IgW2kgPj0gbGVuZ3RoIHRdLiAqKVxuICB2YWwgbnRoIDogKCdhLCBfKSB0IC0+IGludCAtPiAnYSBvcHRpb25cblxuICAoKiogW3JlbW92ZV9pbmRleCB0IGldIHJldHVybnMgYSB2ZXJzaW9uIG9mIFt0XSB3aXRoIHRoZSBbaV10aCBzbWFsbGVzdCBlbGVtZW50IHJlbW92ZWQsXG4gICAgICBpbiBbTyhsb2cgbildIHRpbWUuICBUaGUgc21hbGxlc3QgZWxlbWVudCBoYXMgW2kgPSAwXS4gIFJldHVybnMgW3RdIGlmIFtpIDwgMF0gb3JcbiAgICAgIFtpID49IGxlbmd0aCB0XS4gKilcbiAgdmFsIHJlbW92ZV9pbmRleCA6ICgnYSwgJ2NtcCkgdCAtPiBpbnQgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtpc19zdWJzZXQgdDEgfm9mXzp0Ml0gcmV0dXJucyB0cnVlIGlmZiBbdDFdIGlzIGEgc3Vic2V0IG9mIFt0Ml0uICopXG4gIHZhbCBpc19zdWJzZXQgOiAoJ2EsICdjbXApIHQgLT4gb2ZfOignYSwgJ2NtcCkgdCAtPiBib29sXG5cbiAgKCoqIFthcmVfZGlzam9pbnQgdDEgdDJdIHJldHVybnMgW3RydWVdIGlmZiBbaXNfZW1wdHkgKGludGVyIHQxIHQyKV0sIGJ1dCBpcyBtb3JlXG4gICAgICBlZmZpY2llbnQuICopXG4gIHZhbCBhcmVfZGlzam9pbnQgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcblxuICAoKiogW05hbWVkXSBhbGxvd3MgdGhlIHZhbGlkYXRpb24gb2Ygc3Vic2V0IGFuZCBlcXVhbGl0eSByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2V0cy4gIEFcbiAgICAgIFtOYW1lZC50XSBpcyBhIHJlY29yZCBvZiBhIHNldCBhbmQgYSBuYW1lLCB3aGVyZSB0aGUgbmFtZSBpcyB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLFxuICAgICAgYW5kIFtOYW1lZC5pc19zdWJzZXRdIGFuZCBbTmFtZWQuZXF1YWxdIHZhbGlkYXRlIHN1YnNldCBhbmQgZXF1YWxpdHkgcmVsYXRpb25zaGlwc1xuICAgICAgcmVzcGVjdGl2ZWx5LlxuXG4gICAgICBUaGUgZXJyb3IgbWVzc2FnZSBmb3IsIGUuZy4sXG4gICAgICB7W1xuICAgICAgICBOYW1lZC5pc19zdWJzZXQgeyBzZXQgPSBzZXQxOyBuYW1lID0gXCJzZXQxXCIgfSB+b2ZfOntzZXQgPSBzZXQyOyBuYW1lID0gXCJzZXQyXCIgfVxuICAgICAgXX1cblxuICAgICAgbG9va3MgbGlrZVxuICAgICAge3ZcbiAgICAgICAgKFwic2V0MSBpcyBub3QgYSBzdWJzZXQgb2Ygc2V0MlwiIChpbnZhbGlkX2VsZW1lbnRzICguLi5lbGVtZW50cyBvZiBzZXQxIC0gc2V0Mi4uLikpKVxuICAgICB2fVxuXG4gICAgICBzbyBbbmFtZV0gc2hvdWxkIGJlIGEgbm91biBwaHJhc2UgdGhhdCBkb2Vzbid0IHNvdW5kIGF3a3dhcmQgaW4gdGhlIGFib3ZlIGVycm9yXG4gICAgICBtZXNzYWdlLiAgRXZlbiB0aG91Z2ggaXQgYWRkcyB2ZXJib3NpdHksIGNob29zaW5nIFtuYW1lXXMgdGhhdCBzdGFydCB3aXRoIHRoZSBwaHJhc2VcbiAgICAgIFwidGhlIHNldCBvZlwiIG9mdGVuIG1ha2VzIHRoZSBlcnJvciBtZXNzYWdlIHNvdW5kIG1vcmUgbmF0dXJhbC5cbiAgKilcbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdHlwZSBub25yZWMgKCdhLCAnY21wKSB0ID1cbiAgICAgIHsgc2V0IDogKCdhLCAnY21wKSB0XG4gICAgICA7IG5hbWUgOiBzdHJpbmdcbiAgICAgIH1cblxuICAgICgqKiBbaXNfc3Vic2V0IHQxIH5vZl86dDJdIHJldHVybnMgW09rICgpXSBpZiBbdDFdIGlzIGEgc3Vic2V0IG9mIFt0Ml0gYW5kIGFcbiAgICAgICAgaHVtYW4tcmVhZGFibGUgZXJyb3Igb3RoZXJ3aXNlLiAgKilcbiAgICB2YWwgaXNfc3Vic2V0IDogKCdhLCAnY21wKSB0IC0+IG9mXzooJ2EsICdjbXApIHQgLT4gdW5pdCBPcl9lcnJvci50XG5cbiAgICAoKiogW2VxdWFsIHQxIHQyXSByZXR1cm5zIFtPayAoKV0gaWYgW3QxXSBpcyBlcXVhbCB0byBbdDJdIGFuZCBhIGh1bWFuLXJlYWRhYmxlXG4gICAgICAgIGVycm9yIG90aGVyd2lzZS4gICopXG4gICAgdmFsIGVxdWFsIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgZW5kXG5cbiAgKCoqIFRoZSBsaXN0IG9yIGFycmF5IGdpdmVuIHRvIFtvZl9saXN0XSBhbmQgW29mX2FycmF5XSBuZWVkIG5vdCBiZSBzb3J0ZWQuICopXG4gIHZhbCBvZl9saXN0IDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIGxpc3QgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlIDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIFNlcXVlbmNlLnQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9hcnJheSA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSBhcnJheSAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3RvX2xpc3RdIGFuZCBbdG9fYXJyYXldIHByb2R1Y2Ugc2VxdWVuY2VzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAgY29tcGFyYXRvci4gKilcbiAgdmFsIHRvX2xpc3QgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuXG4gIHZhbCB0b19hcnJheSA6ICgnYSwgXykgdCAtPiAnYSBhcnJheVxuXG4gICgqKiBDcmVhdGUgc2V0IGZyb20gc29ydGVkIGFycmF5LiAgVGhlIGlucHV0IG11c3QgYmUgc29ydGVkIChlaXRoZXIgaW4gYXNjZW5kaW5nIG9yXG4gICAgICBkZXNjZW5kaW5nIG9yZGVyIGFzIGdpdmVuIGJ5IHRoZSBjb21wYXJhdG9yKSBhbmQgY29udGFpbiBubyBkdXBsaWNhdGVzLCBvdGhlcndpc2UgdGhlXG4gICAgICByZXN1bHQgaXMgYW4gZXJyb3IuICBUaGUgY29tcGxleGl0eSBvZiB0aGlzIGZ1bmN0aW9uIGlzIFtPKG4pXS4gKilcbiAgdmFsIG9mX3NvcnRlZF9hcnJheVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICdhIGFycmF5XG4gICAgLT4gKCdhLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogU2ltaWxhciB0byBbb2Zfc29ydGVkX2FycmF5XSwgYnV0IHdpdGhvdXQgY2hlY2tpbmcgdGhlIGlucHV0IGFycmF5LiAqKVxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICdhIGFycmF5XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCBjIH5sZW4gfmZdIGJlaGF2ZXMgbGlrZSBbb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBjXG4gICAgICAoQXJyYXkuaW5pdCBsZW4gfmYpXSwgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGEgZGVjcmVhc2luZyBvcmRlciBpcyBub3RcbiAgICAgIHN1cHBvcnRlZC4gIFRoZSBhZHZhbnRhZ2UgaXMgbm90IHJlcXVpcmluZyB5b3UgdG8gYWxsb2NhdGUgYW4gaW50ZXJtZWRpYXRlIGFycmF5LiAgW2ZdXG4gICAgICB3aWxsIGJlIGNhbGxlZCB3aXRoIDAsIDEsIC4uLiBbbGVuIC0gMV0sIGluIG9yZGVyLiAqKVxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gZjooaW50IC0+ICdhKVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbc3RhYmxlX2RlZHVwX2xpc3RdIGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIFtMaXN0XSBtb2R1bGUgYmVjYXVzZSB0aGVcbiAgICAgIGltcGxlbWVudGF0aW9uIHJlbGllcyBjcnVjaWFsbHkgb24gc2V0cywgYW5kIGJlY2F1c2UgZG9pbmcgc28gYWxsb3dzIG9uZSB0byBhdm9pZCB1c2VzXG4gICAgICBvZiBwb2x5bW9ycGhpYyBjb21wYXJpc29uIGJ5IGluc3RhbnRpYXRpbmcgdGhlIGZ1bmN0b3IgYXQgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25cbiAgICAgIG9mIFtDb21wYXJhdG9yXSBhbmQgdXNpbmcgdGhlIHJlc3VsdGluZyBbc3RhYmxlX2RlZHVwX2xpc3RdLiAqKVxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiAoJ2EsIF8pIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgbGlzdCAtPiAnYSBsaXN0XG5cbiAgKCoqIFttYXAgYyB0IH5mXSByZXR1cm5zIGEgbmV3IHNldCBjcmVhdGVkIGJ5IGFwcGx5aW5nIFtmXSB0byBldmVyeSBlbGVtZW50IGluXG4gICAgICBbdF0uICBUaGUgcmV0dXJuZWQgc2V0IGlzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBbY29tcGFyYXRvcl0uICBbTyhuIGxvZyBuKV0uICopXG4gIHZhbCBtYXAgOiAoJ2IsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gKCdhLCBfKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdjbXApIHRcblxuICAoKiogTGlrZSB7IW1hcH0sIGV4Y2VwdCBlbGVtZW50cyBmb3Igd2hpY2ggW2ZdIHJldHVybnMgW05vbmVdIHdpbGwgYmUgZHJvcHBlZC4gICopXG4gIHZhbCBmaWx0ZXJfbWFwXG4gICAgOiAgKCdiLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhLCBfKSB0XG4gICAgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKVxuICAgIC0+ICgnYiwgJ2NtcCkgdFxuXG4gICgqKiBbZmlsdGVyIHQgfmZdIHJldHVybnMgdGhlIHN1YnNldCBvZiBbdF0gZm9yIHdoaWNoIFtmXSBldmFsdWF0ZXMgdG8gdHJ1ZS4gIFtPKG4gbG9nXG4gICAgICBuKV0uICopXG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdjbXApIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtmb2xkIHQgfmluaXQgfmZdIGZvbGRzIG92ZXIgdGhlIGVsZW1lbnRzIG9mIHRoZSBzZXQgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0LiAqKVxuICB2YWwgZm9sZCA6ICgnYSwgXykgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2ZvbGRfcmVzdWx0IH5pbml0IH5mXSBmb2xkcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0IGZyb20gc21hbGxlc3QgdG9cbiAgICAgIGxhcmdlc3QsIHNob3J0IGNpcmN1aXRpbmcgdGhlIGZvbGQgaWYgW2YgYWNjdW0geF0gaXMgYW4gW0Vycm9yIF9dICopXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICAoKiogW2ZvbGRfdW50aWwgdCB+aW5pdCB+Zl0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdLiBJZiBbZl1cbiAgICAgIHJldHVybnMgW1N0b3AgX10gdGhlIGNvbXB1dGF0aW9uIGNlYXNlcyBhbmQgcmVzdWx0cyBpbiB0aGF0IHZhbHVlLiBJZiBbZl0gcmV0dXJuc1xuICAgICAgW0NvbnRpbnVlIF9dLCB0aGUgZm9sZCB3aWxsIHByb2NlZWQuICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuXG4gICgqKiBMaWtlIHshZm9sZH0sIGV4Y2VwdCB0aGF0IGl0IGdvZXMgZnJvbSB0aGUgbGFyZ2VzdCB0byB0aGUgc21hbGxlc3QgZWxlbWVudC4gKilcbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2EgLT4gJ2FjY3VtIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtpdGVyIHQgfmZdIGNhbGxzIFtmXSBvbiBldmVyeSBlbGVtZW50IG9mIFt0XSwgZ29pbmcgaW4gb3JkZXIgZnJvbSB0aGUgc21hbGxlc3QgdG9cbiAgICAgIGxhcmdlc3QuICAqKVxuICB2YWwgaXRlciA6ICgnYSwgXykgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIEl0ZXJhdGUgdHdvIHNldHMgc2lkZSBieSBzaWRlLiAgQ29tcGxleGl0eSBpcyBbTyhtK24pXSB3aGVyZSBbbV0gYW5kIFtuXSBhcmUgdGhlIHNpemVzXG4gICAgICBvZiB0aGUgdHdvIGlucHV0IHNldHMuICBBcyBhbiBleGFtcGxlLCB3aXRoIHRoZSBpbnB1dHMgWzA7IDFdIGFuZCBbMTsgMl0sIFtmXSB3aWxsIGJlXG4gICAgICBjYWxsZWQgd2l0aCBbYExlZnQgMF07IFtgQm90aCAoMSwgMSldOyBhbmQgW2BSaWdodCAyXS4gKilcbiAgdmFsIGl0ZXIyXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZjooWyBgTGVmdCBvZiAnYSB8IGBSaWdodCBvZiAnYSB8IGBCb3RoIG9mICdhICogJ2EgXSAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICAoKiogaWYgW2EsIGIgPSBwYXJ0aXRpb25fdGYgc2V0IH5mXSB0aGVuIFthXSBpcyB0aGUgZWxlbWVudHMgb24gd2hpY2ggW2ZdIHByb2R1Y2VkIFt0cnVlXSxcbiAgICAgIGFuZCBbYl0gaXMgdGhlIGVsZW1lbnRzIG9uIHdoaWNoIFtmXSBwcm9kdWNlcyBbZmFsc2VdLiAqKVxuICB2YWwgcGFydGl0aW9uX3RmIDogKCdhLCAnY21wKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCAqICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBTYW1lIGFzIHshdG9fbGlzdH0uICopXG4gIHZhbCBlbGVtZW50cyA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG5cbiAgKCoqIFJldHVybnMgdGhlIHNtYWxsZXN0IGVsZW1lbnQgb2YgdGhlIHNldC4gIFtPKGxvZyBuKV0uICopXG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuXG4gICgqKiBMaWtlIHshbWluX2VsdH0sIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYW4gZW1wdHkgc2V0LiAqKVxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcblxuICAoKiogUmV0dXJucyB0aGUgbGFyZ2VzdCBlbGVtZW50IG9mIHRoZSBzZXQuICBbTyhsb2cgbildLiAgKilcbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIExpa2UgeyFtYXhfZWx0fSwgYnV0IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBnaXZlbiBhbiBlbXB0eSBzZXQuICopXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuXG4gICgqKiByZXR1cm5zIGFuIGFyYml0cmFyeSBlbGVtZW50LCBvciBbTm9uZV0gaWYgdGhlIHNldCBpcyBlbXB0eS4gKilcbiAgdmFsIGNob29zZSA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cblxuICAoKiogTGlrZSB7IWNob29zZX0sIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIGFuIGVtcHR5IHNldC4gKilcbiAgdmFsIGNob29zZV9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcblxuICAoKiogW3NwbGl0IHQgeF0gcHJvZHVjZXMgYSB0cmlwbGUgWyh0MSwgbWF5YmVfeCwgdDIpXSB3aGVyZSBbdDFdIGlzIHRoZSBzZXQgb2YgZWxlbWVudHNcbiAgICAgIHN0cmljdGx5IGxlc3MgdGhhbiBbeF0sIFttYXliZV94XSBpcyB0aGUgbWVtYmVyIChpZiBhbnkpIG9mIFt0XSB3aGljaCBjb21wYXJlcyBlcXVhbFxuICAgICAgdG8gW3hdLCBhbmQgW3QyXSBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIHN0cmljdGx5IGxhcmdlciB0aGFuIFt4XS4gKilcbiAgdmFsIHNwbGl0IDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdCAqICdhIG9wdGlvbiAqICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBpZiBbZXF1aXZdIGlzIGFuIGVxdWl2YWxlbmNlIHByZWRpY2F0ZSwgdGhlbiBbZ3JvdXBfYnkgc2V0IH5lcXVpdl0gcHJvZHVjZXMgYSBsaXN0XG4gICAgICBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIChpLmUuLCBhIHNldC10aGVvcmV0aWMgcXVvdGllbnQpLiAgRS5nLixcblxuICAgICAge1tcbiAgICAgICAgbGV0IGNoYXJzID0gU2V0Lm9mX2xpc3QgWydBJzsgJ2EnOyAnYic7ICdjJ10gaW5cbiAgICAgICAgbGV0IGVxdWl2IGMgYycgPSBDaGFyLmVxdWFsIChDaGFyLnVwcGVyY2FzZSBjKSAoQ2hhci51cHBlcmNhc2UgYycpIGluXG4gICAgICAgIGdyb3VwX2J5IGNoYXJzIH5lcXVpdlxuICAgICAgXX1cblxuICAgICAgcHJvZHVjZXM6XG5cbiAgICAgIHtbXG4gICAgICAgIFtTZXQub2ZfbGlzdCBbJ0EnOydhJ107IFNldC5zaW5nbGV0b24gJ2InOyBTZXQuc2luZ2xldG9uICdjJ11cbiAgICAgIF19XG5cbiAgICAgIFtncm91cF9ieV0gcnVucyBpbiBPKG5eMikgdGltZSwgc28gaWYgeW91IGhhdmUgYSBjb21wYXJpc29uIGZ1bmN0aW9uLCBpdCdzIHVzdWFsbHlcbiAgICAgIG11Y2ggZmFzdGVyIHRvIHVzZSBbU2V0Lm9mX2xpc3RdLiAqKVxuICB2YWwgZ3JvdXBfYnkgOiAoJ2EsICdjbXApIHQgLT4gZXF1aXY6KCdhIC0+ICdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCBsaXN0XG5cbiAgKCoqIFt0b19zZXF1ZW5jZSB0XSBjb252ZXJ0cyB0aGUgc2V0IFt0XSB0byBhIHNlcXVlbmNlIG9mIHRoZSBlbGVtZW50cyBiZXR3ZWVuXG4gICAgICBbZ3JlYXRlcl9vcl9lcXVhbF90b10gYW5kIFtsZXNzX29yX2VxdWFsX3RvXSBpbmNsdXNpdmUgaW4gdGhlIG9yZGVyIGluZGljYXRlZCBieVxuICAgICAgW29yZGVyXS4gIElmIFtncmVhdGVyX29yX2VxdWFsX3RvID4gbGVzc19vcl9lcXVhbF90b10gdGhlIHNlcXVlbmNlIGlzIGVtcHR5LiAgQ29zdCBpc1xuICAgICAgTyhsb2cgbikgdXAgZnJvbnQgYW5kIGFtb3J0aXplZCBPKDEpIGZvciBlYWNoIGVsZW1lbnQgcHJvZHVjZWQuICopXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nICgqKiBkZWZhdWx0ICopIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAnYSBTZXF1ZW5jZS50XG5cbiAgKCoqIFtiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgd2hpY2ggZWx0XSByZXR1cm5zIHRoZSBlbGVtZW50IGluIFt0XSBzcGVjaWZpZWQgYnlcbiAgICAgIFtjb21wYXJlXSBhbmQgW3doaWNoXSwgaWYgb25lIGV4aXN0cy5cblxuICAgICAgW3RdIG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIFtjb21wYXJlXSwgd2hlcmUgW2NvbXBhcmVdIGFuZFxuICAgICAgW2VsdF0gZGl2aWRlIFt0XSBpbnRvIHRocmVlIChwb3NzaWJseSBlbXB0eSkgc2VnbWVudHM6XG5cbiAgICAgIHt2XG4gICAgICAgIHwgIDwgZWx0ICB8ICA9IGVsdCAgfCAgPiBlbHQgIHxcbiAgICAgIHZ9XG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoXSByZXR1cm5zIGFuIGVsZW1lbnQgb24gdGhlIGJvdW5kYXJ5IG9mIHNlZ21lbnRzIGFzIHNwZWNpZmllZCBieVxuICAgICAgW3doaWNoXS4gIFNlZSB0aGUgZGlhZ3JhbSBiZWxvdyBuZXh0IHRvIHRoZSBbd2hpY2hdIHZhcmlhbnRzLlxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF0gZG9lcyBub3QgY2hlY2sgdGhhdCBbY29tcGFyZV0gb3JkZXJzIFt0XSwgYW5kIGJlaGF2aW9yIGlzXG4gICAgICB1bnNwZWNpZmllZCBpZiBbY29tcGFyZV0gZG9lc24ndCBvcmRlciBbdF0uICBCZWhhdmlvciBpcyBhbHNvIHVuc3BlY2lmaWVkIGlmXG4gICAgICBbY29tcGFyZV0gbXV0YXRlcyBbdF0uICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gWyBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gKCoqICAgICAgICB7diB8IDwgZWx0IFggfCAgICAgICAgICAgICAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAoKiogICAgIHt2IHwgICAgICA8PSBlbHQgICAgICAgWCB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYExhc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgICA9IGVsdCBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgRmlyc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCBYID0gZWx0ICAgfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gKCoqIHt2ICAgICAgICAgICB8IFggICAgICAgPj0gZWx0ICAgICAgfCB2fSAqKVxuICAgICAgIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAoKiogICAge3YgICAgICAgICAgICAgICAgICAgICAgIHwgWCA+IGVsdCB8IHZ9ICopXG4gICAgICAgXVxuICAgIC0+ICdrZXlcbiAgICAtPiAnYSBvcHRpb25cblxuICAoKiogW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2Ygd2hpY2hdIHRha2VzIGEgW3NlZ21lbnRfb2ZdIGZ1bmN0aW9uIHRoYXRcbiAgICAgIGRpdmlkZXMgW3RdIGludG8gdHdvIChwb3NzaWJseSBlbXB0eSkgc2VnbWVudHM6XG5cbiAgICAgIHt2XG4gICAgICAgIHwgc2VnbWVudF9vZiBlbHQgPSBgTGVmdCB8IHNlZ21lbnRfb2YgZWx0ID0gYFJpZ2h0IHxcbiAgICAgIHZ9XG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZF0gcmV0dXJucyB0aGUgZWxlbWVudCBvbiB0aGUgYm91bmRhcnkgb2YgdGhlIHNlZ21lbnRzIGFzXG4gICAgICBzcGVjaWZpZWQgYnkgW3doaWNoXTogW2BMYXN0X29uX2xlZnRdIHlpZWxkcyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsZWZ0IHNlZ21lbnQsXG4gICAgICB3aGlsZSBbYEZpcnN0X29uX3JpZ2h0XSB5aWVsZHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJpZ2h0IHNlZ21lbnQuICBJdCByZXR1cm5zXG4gICAgICBbTm9uZV0gaWYgdGhlIHNlZ21lbnQgaXMgZW1wdHkuXG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZF0gZG9lcyBub3QgY2hlY2sgdGhhdCBbc2VnbWVudF9vZl0gc2VnbWVudHMgW3RdIGFzIGluIHRoZVxuICAgICAgZGlhZ3JhbSwgYW5kIGJlaGF2aW9yIGlzIHVuc3BlY2lmaWVkIGlmIFtzZWdtZW50X29mXSBkb2Vzbid0IHNlZ21lbnQgW3RdLiAgQmVoYXZpb3JcbiAgICAgIGlzIGFsc28gdW5zcGVjaWZpZWQgaWYgW3NlZ21lbnRfb2ZdIG11dGF0ZXMgW3RdLiAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiBzZWdtZW50X29mOignYSAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gWyBgTGFzdF9vbl9sZWZ0IHwgYEZpcnN0X29uX3JpZ2h0IF1cbiAgICAtPiAnYSBvcHRpb25cblxuICAoKiogUHJvZHVjZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSB0d28gc2V0cyBiZXR3ZWVuIFtncmVhdGVyX29yX2VxdWFsX3RvXSBhbmRcbiAgICAgIFtsZXNzX29yX2VxdWFsX3RvXSBpbiBbb3JkZXJdLCBub3Rpbmcgd2hldGhlciBlYWNoIGVsZW1lbnQgYXBwZWFycyBpbiB0aGUgbGVmdCBzZXQsXG4gICAgICB0aGUgcmlnaHQgc2V0LCBvciBib3RoLiAgSW4gdGhlIGJvdGggY2FzZSwgYm90aCBlbGVtZW50cyBhcmUgcmV0dXJuZWQsIGluIGNhc2UgdGhlXG4gICAgICBjYWxsZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gZWxlbWVudHMgdGhhdCBhcmUgZXF1YWwgdG8gdGhlIHNldHMnIGNvbXBhcmF0b3IuICBSdW5zXG4gICAgICBpbiBPKGxlbmd0aCB0ICsgbGVuZ3RoIHQnKS4gKilcbiAgbW9kdWxlIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQgOiBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBTZXF1ZW5jZS5NZXJnZV93aXRoX2R1cGxpY2F0ZXNfZWxlbWVudC50ID1cbiAgICAgIHwgTGVmdCBvZiAnYVxuICAgICAgfCBSaWdodCBvZiAnYlxuICAgICAgfCBCb3RoIG9mICdhICogJ2JcbiAgICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgIGluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGUuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgKCoqIGRlZmF1bHQgKikgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2EpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgKCoqIFtNXSBpcyBtZWFudCB0byBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggT0NhbWwgYXBwbGljYXRpdmUgZnVuY3RvciB0eXBlczpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfc2V0ID0gU2V0Lk0oU3RyaW5nKS50XG4gICAgICBdfVxuXG4gICAgICB3aGljaCBzdGFuZHMgZm9yOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ19zZXQgPSAoU3RyaW5nLnQsIFN0cmluZy5jb21wYXJhdG9yX3dpdG5lc3MpIFNldC50XG4gICAgICBdfVxuXG4gICAgICBUaGUgcG9pbnQgaXMgdGhhdCBbU2V0Lk0oU3RyaW5nKS50XSBzdXBwb3J0cyBkZXJpdmluZywgd2hlcmVhcyB0aGUgc2Vjb25kIHN5bnRheFxuICAgICAgZG9lc24ndCAoYmVjYXVzZSB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzLCBzYXksIFN0cmluZy5zZXhwX29mX2NvbXBhcmF0b3Jfd2l0bmVzcyxcbiAgICAgIGluc3RlYWQgeW91IHdvdWxkIHdhbnQgdG8gcGFzcyB0aGUgY29tcGFyYXRvciBkaXJlY3RseSkuICopXG4gIG1vZHVsZSBNIChFbHQgOiBzaWdcbiAgICAgIHR5cGUgdFxuICAgICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpIDogc2lnXG4gICAgdHlwZSBub25yZWMgdCA9IChFbHQudCwgRWx0LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICBlbmRcblxuICBpbmNsdWRlIEZvcl9kZXJpdmluZyB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgKCoqIEEgcG9seW1vcnBoaWMgU2V0LiAqKVxuICBtb2R1bGUgUG9seSA6IFNfcG9seSB3aXRoIHR5cGUgJ2VsdCB0ID0gKCdlbHQsIENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3MpIHRcblxuICAoKiogVXNpbmcgY29tcGFyYXRvciBpcyBhIHNpbWlsYXIgaW50ZXJmYWNlIGFzIHRoZSB0b3BsZXZlbCBvZiBbU2V0XSwgZXhjZXB0IHRoZSBmdW5jdGlvbnNcbiAgICAgIHRha2UgYSBbfmNvbXBhcmF0b3I6KCdlbHQsICdjbXApIENvbXBhcmF0b3IudF0gd2hlcmUgdGhlIGZ1bmN0aW9ucyBhdCB0aGUgdG9wbGV2ZWwgb2ZcbiAgICAgIFtTZXRdIHRha2VzIGEgWygnZWx0LCAnY21wKSBjb21wYXJhdG9yXS4gKilcbiAgbW9kdWxlIFVzaW5nX2NvbXBhcmF0b3IgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyAoJ2VsdCwgJ2NtcCkgdCA9ICgnZWx0LCAnY21wKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdFxuICAgICAgOiAgKCdlbHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdjbXAgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdlbHQsICdjbXApIHRcbiAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgIHZhbCB0X29mX3NleHBfZGlyZWN0XG4gICAgICA6ICBjb21wYXJhdG9yOignZWx0LCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgIC0+IChTZXhwLnQgLT4gJ2VsdClcbiAgICAgIC0+IFNleHAudFxuICAgICAgLT4gKCdlbHQsICdjbXApIHRcblxuICAgIG1vZHVsZSBUcmVlIDogc2lnXG4gICAgICAoKiogQSBbVHJlZS50XSBjb250YWlucyBqdXN0IHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlIHRoYXQgYSBzZXQgaXMgYmFzZWQgb24sIHdpdGhvdXRcbiAgICAgICAgICBpbmNsdWRpbmcgdGhlIGNvbXBhcmF0b3IuICBBY2NvcmRpbmdseSwgYW55IG9wZXJhdGlvbiBvbiBhIFtUcmVlLnRdIG11c3QgYWxzbyB0YWtlXG4gICAgICAgICAgYXMgYW4gYXJndW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyYXRvci4gKilcbiAgICAgIHR5cGUgKCdhLCAnY21wKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgICB2YWwgc2V4cF9vZl90XG4gICAgICAgIDogICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgIC0+ICgnY21wIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgICBbQEBAZW5kXVxuXG4gICAgICB2YWwgdF9vZl9zZXhwX2RpcmVjdFxuICAgICAgICA6ICBjb21wYXJhdG9yOignZWx0LCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgICAgLT4gKFNleHAudCAtPiAnZWx0KVxuICAgICAgICAtPiBTZXhwLnRcbiAgICAgICAgLT4gKCdlbHQsICdjbXApIHRcblxuICAgICAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgICAgIHR5cGUgbm9ucmVjICgnYSwgJ2NtcCkgdCA9XG4gICAgICAgICAgeyB0cmVlIDogKCdhLCAnY21wKSB0XG4gICAgICAgICAgOyBuYW1lIDogc3RyaW5nXG4gICAgICAgICAgfVxuXG4gICAgICAgIHZhbCBpc19zdWJzZXRcbiAgICAgICAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAgICAgLT4gb2ZfOignYSwgJ2NtcCkgdFxuICAgICAgICAgIC0+IHVuaXQgT3JfZXJyb3IudFxuXG4gICAgICAgIHZhbCBlcXVhbFxuICAgICAgICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgICAgICAtPiB1bml0IE9yX2Vycm9yLnRcbiAgICAgIGVuZFxuXG4gICAgICBpbmNsdWRlXG4gICAgICAgIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvclxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYikgc2V0IDo9ICgnYSwgJ2IpIHRcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSB0XG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSBuYW1lZCA6PSAoJ2EsICdiKSBOYW1lZC50XG4gICAgICAgIHdpdGggbW9kdWxlIE5hbWVkIDo9IE5hbWVkXG5cbiAgICAgIHZhbCBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIDogKF8sIF8pIHRcbiAgICBlbmRcblxuICAgIGluY2x1ZGVcbiAgICAgIEFjY2Vzc29yczJcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIFRyZWUudFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIG5hbWVkIDo9ICgnYSwgJ2IpIE5hbWVkLnRcblxuICAgIGluY2x1ZGVcbiAgICAgIENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3JcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIFRyZWUudFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHNldCA6PSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgY29tcGFyYXRvciA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIHZhbCBoYXNoX2ZvbGRfZGlyZWN0IDogJ2VsdCBIYXNoLmZvbGRlciAtPiAoJ2VsdCwgJ2NtcCkgdCBIYXNoLmZvbGRlclxuXG4gICAgbW9kdWxlIEVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKEVsdCA6IENvbXBhcmF0b3IuUzEpIDogc2lnXG4gICAgICB2YWwgZW1wdHkgOiAoJ2EgRWx0LnQsIEVsdC5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgICBlbmRcbiAgZW5kXG5cbiAgKCoqIHsyIE1vZHVsZXMgYW5kIG1vZHVsZSB0eXBlcyBmb3IgZXh0ZW5kaW5nIFtTZXRdfVxuXG4gICAgICBGb3IgdXNlIGluIGV4dGVuc2lvbnMgb2YgQmFzZSwgbGlrZSBbQ29yZV0uICopXG5cbiAgbW9kdWxlIFdpdGhfY29tcGFyYXRvciA9IFdpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgV2l0aF9maXJzdF9jbGFzc19tb2R1bGUgPSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZVxuICBtb2R1bGUgV2l0aG91dF9jb21wYXJhdG9yID0gV2l0aG91dF9jb21wYXJhdG9yXG5cbiAgbW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gRm9yX2Rlcml2aW5nXG4gIG1vZHVsZSB0eXBlIFNfcG9seSA9IFNfcG9seVxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMwID0gQWNjZXNzb3JzMFxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMxID0gQWNjZXNzb3JzMVxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMyID0gQWNjZXNzb3JzMlxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvciA9IEFjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yc19nZW5lcmljID0gQWNjZXNzb3JzX2dlbmVyaWNcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMwID0gQ3JlYXRvcnMwXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMSA9IENyZWF0b3JzMVxuICBtb2R1bGUgdHlwZSBDcmVhdG9yczIgPSBDcmVhdG9yczJcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvciA9IENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczAgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMFxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMSA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJcblxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IgPVxuICAgIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvclxuXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBDcmVhdG9yc19nZW5lcmljXG4gIG1vZHVsZSB0eXBlIEVsdF9wbGFpbiA9IEVsdF9wbGFpblxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICopXG4oKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICopXG4oKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIFNlZSAuLi9USElSRC1QQVJUWS50eHQgICopXG4oKiAgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFNldHMgb3ZlciBvcmRlcmVkIHR5cGVzICopXG5cbm9wZW4hIEltcG9ydFxuaW5jbHVkZSBTZXRfaW50ZlxuXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxuXG5cbm1vZHVsZSBUcmVlMCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPVxuICAgIHwgRW1wdHlcbiAgICAoKiAoTGVhZiB4KSBpcyB0aGUgc2FtZSBhcyAoTm9kZSAoRW1wdHksIHgsIEVtcHR5LCAxLCAxKSkgYnV0IHVzZXMgbGVzcyBzcGFjZS4gKilcbiAgICB8IExlYWYgb2YgJ2FcbiAgICAoKiBmaXJzdCBpbnQgaXMgaGVpZ2h0LCBzZWNvbmQgaXMgc3ViLXRyZWUgc2l6ZSAqKVxuICAgIHwgTm9kZSBvZiAnYSB0ICogJ2EgKiAnYSB0ICogaW50ICogaW50XG5cbiAgdHlwZSAnYSB0cmVlID0gJ2EgdFxuXG4gICgqIFNldHMgYXJlIHJlcHJlc2VudGVkIGJ5IGJhbGFuY2VkIGJpbmFyeSB0cmVlcyAodGhlIGhlaWdodHMgb2YgdGhlIGNoaWxkcmVuIGRpZmZlciBieVxuICAgICBhdCBtb3N0IDIuICopXG4gIGxldCBoZWlnaHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gMFxuICAgIHwgTGVhZiBfIC0+IDFcbiAgICB8IE5vZGUgKF8sIF8sIF8sIGgsIF8pIC0+IGhcbiAgOztcblxuICBsZXQgbGVuZ3RoID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IDBcbiAgICB8IExlYWYgXyAtPiAxXG4gICAgfCBOb2RlIChfLCBfLCBfLCBfLCBzKSAtPiBzXG4gIDs7XG5cbiAgbGV0IGludmFyaWFudHMgPVxuICAgIGxldCBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2VsdCB2ID1cbiAgICAgIChtYXRjaCBsb3dlciB3aXRoXG4gICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgICB8IFNvbWUgbG93ZXIgLT4gY29tcGFyZV9lbHQgbG93ZXIgdiA8IDApXG4gICAgICAmJlxuICAgICAgbWF0Y2ggdXBwZXIgd2l0aFxuICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgIHwgU29tZSB1cHBlciAtPiBjb21wYXJlX2VsdCB2IHVwcGVyIDwgMFxuICAgIGluXG4gICAgbGV0IHJlYyBsb29wIGxvd2VyIHVwcGVyIGNvbXBhcmVfZWx0IHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHRydWVcbiAgICAgIHwgTGVhZiB2IC0+IGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfZWx0IHZcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgaCwgbikgLT5cbiAgICAgICAgbGV0IGhsID0gaGVpZ2h0IGxcbiAgICAgICAgYW5kIGhyID0gaGVpZ2h0IHIgaW5cbiAgICAgICAgYWJzIChobCAtIGhyKSA8PSAyXG4gICAgICAgICYmIGggPSBtYXggaGwgaHIgKyAxXG4gICAgICAgICYmIG4gPSBsZW5ndGggbCArIGxlbmd0aCByICsgMVxuICAgICAgICAmJiBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2VsdCB2XG4gICAgICAgICYmIGxvb3AgbG93ZXIgKFNvbWUgdikgY29tcGFyZV9lbHQgbFxuICAgICAgICAmJiBsb29wIChTb21lIHYpIHVwcGVyIGNvbXBhcmVfZWx0IHJcbiAgICBpblxuICAgIGZ1biB0IH5jb21wYXJlX2VsdCAtPiBsb29wIE5vbmUgTm9uZSBjb21wYXJlX2VsdCB0XG4gIDs7XG5cbiAgbGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IHRydWVcbiAgICB8IExlYWYgXyB8IE5vZGUgXyAtPiBmYWxzZVxuICA7O1xuXG4gICgqIENyZWF0ZXMgYSBuZXcgbm9kZSB3aXRoIGxlZnQgc29uIGwsIHZhbHVlIHYgYW5kIHJpZ2h0IHNvbiByLlxuICAgICBXZSBtdXN0IGhhdmUgYWxsIGVsZW1lbnRzIG9mIGwgPCB2IDwgYWxsIGVsZW1lbnRzIG9mIHIuXG4gICAgIGwgYW5kIHIgbXVzdCBiZSBiYWxhbmNlZCBhbmQgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi5cbiAgICAgSW5saW5lIGV4cGFuc2lvbiBvZiBoZWlnaHQgZm9yIGJldHRlciBzcGVlZC4gKilcblxuICBsZXQgY3JlYXRlIGwgdiByID1cbiAgICBsZXQgaGwgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IDBcbiAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgIHwgTm9kZSAoXywgXywgXywgaCwgXykgLT4gaFxuICAgIGluXG4gICAgbGV0IGhyID1cbiAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICB8IExlYWYgXyAtPiAxXG4gICAgICB8IE5vZGUgKF8sIF8sIF8sIGgsIF8pIC0+IGhcbiAgICBpblxuICAgIGxldCBoID0gaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEgaW5cbiAgICBpZiBoID0gMVxuICAgIHRoZW4gTGVhZiB2XG4gICAgZWxzZSAoXG4gICAgICBsZXQgc2wgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgICAgfCBOb2RlIChfLCBfLCBfLCBfLCBzKSAtPiBzXG4gICAgICBpblxuICAgICAgbGV0IHNyID1cbiAgICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgICB8IExlYWYgXyAtPiAxXG4gICAgICAgIHwgTm9kZSAoXywgXywgXywgXywgcykgLT4gc1xuICAgICAgaW5cbiAgICAgIE5vZGUgKGwsIHYsIHIsIGgsIHNsICsgc3IgKyAxKSlcbiAgOztcblxuICAoKiBXZSBtdXN0IGNhbGwgW2ZdIHdpdGggaW5jcmVhc2luZyBpbmRleGVzLCBiZWNhdXNlIHRoZSBiaW5fcHJvdCByZWFkZXIgaW5cbiAgICAgQ29yZS5TZXQgbmVlZHMgaXQuICopXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mID1cbiAgICBsZXQgcmVjIGxvb3AgbiB+ZiBpID1cbiAgICAgIG1hdGNoIG4gd2l0aFxuICAgICAgfCAwIC0+IEVtcHR5XG4gICAgICB8IDEgLT5cbiAgICAgICAgbGV0IGsgPSBmIGkgaW5cbiAgICAgICAgTGVhZiBrXG4gICAgICB8IDIgLT5cbiAgICAgICAgbGV0IGtsID0gZiBpIGluXG4gICAgICAgIGxldCBrID0gZiAoaSArIDEpIGluXG4gICAgICAgIGNyZWF0ZSAoTGVhZiBrbCkgayBFbXB0eVxuICAgICAgfCAzIC0+XG4gICAgICAgIGxldCBrbCA9IGYgaSBpblxuICAgICAgICBsZXQgayA9IGYgKGkgKyAxKSBpblxuICAgICAgICBsZXQga3IgPSBmIChpICsgMikgaW5cbiAgICAgICAgY3JlYXRlIChMZWFmIGtsKSBrIChMZWFmIGtyKVxuICAgICAgfCBuIC0+XG4gICAgICAgIGxldCBsZWZ0X2xlbmd0aCA9IG4gbHNyIDEgaW5cbiAgICAgICAgbGV0IHJpZ2h0X2xlbmd0aCA9IG4gLSBsZWZ0X2xlbmd0aCAtIDEgaW5cbiAgICAgICAgbGV0IGxlZnQgPSBsb29wIGxlZnRfbGVuZ3RoIH5mIGkgaW5cbiAgICAgICAgbGV0IGsgPSBmIChpICsgbGVmdF9sZW5ndGgpIGluXG4gICAgICAgIGxldCByaWdodCA9IGxvb3AgcmlnaHRfbGVuZ3RoIH5mIChpICsgbGVmdF9sZW5ndGggKyAxKSBpblxuICAgICAgICBjcmVhdGUgbGVmdCBrIHJpZ2h0XG4gICAgaW5cbiAgICBsb29wIGxlbiB+ZiAwXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgYXJyYXlfbGVuZ3RoID0gQXJyYXkubGVuZ3RoIGFycmF5IGluXG4gICAgbGV0IG5leHQgPVxuICAgICAgKCogV2UgZG9uJ3QgY2hlY2sgaWYgdGhlIGFycmF5IGlzIHNvcnRlZCBvciBrZXlzIGFyZSBkdXBsaWNhdGVkLCBiZWNhdXNlIHRoYXRcbiAgICAgICAgIGNoZWNraW5nIGlzIHNsb3dlciB0aGFuIHRoZSB3aG9sZSBbb2Zfc29ydGVkX2FycmF5XSBmdW5jdGlvbiAqKVxuICAgICAgaWYgYXJyYXlfbGVuZ3RoIDwgMiB8fCBjb21wYXJlX2VsdCBhcnJheS4oMCkgYXJyYXkuKDEpIDwgMFxuICAgICAgdGhlbiBmdW4gaSAtPiBhcnJheS4oaSlcbiAgICAgIGVsc2UgZnVuIGkgLT4gYXJyYXkuKGFycmF5X2xlbmd0aCAtIDEgLSBpKVxuICAgIGluXG4gICAgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbjphcnJheV9sZW5ndGggfmY6bmV4dFxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgYXJyYXkgfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCBhcnJheSB3aXRoXG4gICAgfCBbfHxdIHwgW3wgXyB8XSAtPiBSZXN1bHQuT2sgKG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfZWx0KVxuICAgIHwgXyAtPlxuICAgICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICAgIGxldCBpbmNyZWFzaW5nID1cbiAgICAgICAgICBtYXRjaCBjb21wYXJlX2VsdCBhcnJheS4oMCkgYXJyYXkuKDEpIHdpdGhcbiAgICAgICAgICB8IDAgLT4gci5yZXR1cm4gKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZHVwbGljYXRlZCBlbGVtZW50c1wiKVxuICAgICAgICAgIHwgaSAtPiBpIDwgMFxuICAgICAgICBpblxuICAgICAgICBmb3IgaSA9IDEgdG8gQXJyYXkubGVuZ3RoIGFycmF5IC0gMiBkb1xuICAgICAgICAgIG1hdGNoIGNvbXBhcmVfZWx0IGFycmF5LihpKSBhcnJheS4oaSArIDEpIHdpdGhcbiAgICAgICAgICB8IDAgLT4gci5yZXR1cm4gKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZHVwbGljYXRlZCBlbGVtZW50c1wiKVxuICAgICAgICAgIHwgaSAtPlxuICAgICAgICAgICAgaWYgUG9seS4oIDw+ICkgKGkgPCAwKSBpbmNyZWFzaW5nXG4gICAgICAgICAgICB0aGVuXG4gICAgICAgICAgICAgIHIucmV0dXJuXG4gICAgICAgICAgICAgICAgKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZWxlbWVudHMgYXJlIG5vdCBvcmRlcmVkXCIpXG4gICAgICAgIGRvbmU7XG4gICAgICAgIFJlc3VsdC5PayAob2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9lbHQpKVxuICA7O1xuXG4gICgqIFNhbWUgYXMgY3JlYXRlLCBidXQgcGVyZm9ybXMgb25lIHN0ZXAgb2YgcmViYWxhbmNpbmcgaWYgbmVjZXNzYXJ5LlxuICAgICBBc3N1bWVzIGwgYW5kIHIgYmFsYW5jZWQgYW5kIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDMuXG4gICAgIElubGluZSBleHBhbnNpb24gb2YgY3JlYXRlIGZvciBiZXR0ZXIgc3BlZWQgaW4gdGhlIG1vc3QgZnJlcXVlbnQgY2FzZVxuICAgICB3aGVyZSBubyByZWJhbGFuY2luZyBpcyByZXF1aXJlZC4gKilcblxuICBsZXQgYmFsIGwgdiByID1cbiAgICBsZXQgaGwgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IDBcbiAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgIHwgTm9kZSAoXywgXywgXywgaCwgXykgLT4gaFxuICAgIGluXG4gICAgbGV0IGhyID1cbiAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICB8IExlYWYgXyAtPiAxXG4gICAgICB8IE5vZGUgKF8sIF8sIF8sIGgsIF8pIC0+IGhcbiAgICBpblxuICAgIGlmIGhsID4gaHIgKyAyXG4gICAgdGhlbiAoXG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2UgKCogYmVjYXVzZSBoKGwpPmgocikrMiBhbmQgaChsZWFmKT0xICopXG4gICAgICB8IE5vZGUgKGxsLCBsdiwgbHIsIF8sIF8pIC0+XG4gICAgICAgIGlmIGhlaWdodCBsbCA+PSBoZWlnaHQgbHJcbiAgICAgICAgdGhlbiBjcmVhdGUgbGwgbHYgKGNyZWF0ZSBsciB2IHIpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgTGVhZiBscnYgLT5cbiAgICAgICAgICAgIGFzc2VydCAoaXNfZW1wdHkgbGwpO1xuICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbGwgbHYgRW1wdHkpIGxydiAoY3JlYXRlIEVtcHR5IHYgcilcbiAgICAgICAgICB8IE5vZGUgKGxybCwgbHJ2LCBscnIsIF8sIF8pIC0+IGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxybCkgbHJ2IChjcmVhdGUgbHJyIHYgcikpKVxuICAgIGVsc2UgaWYgaHIgPiBobCArIDJcbiAgICB0aGVuIChcbiAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZSAoKiBiZWNhdXNlIGgocik+aChsKSsyIGFuZCBoKGxlYWYpPTEgKilcbiAgICAgIHwgTm9kZSAocmwsIHJ2LCByciwgXywgXykgLT5cbiAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybFxuICAgICAgICB0aGVuIGNyZWF0ZSAoY3JlYXRlIGwgdiBybCkgcnYgcnJcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgfCBMZWFmIHJsdiAtPlxuICAgICAgICAgICAgYXNzZXJ0IChpc19lbXB0eSBycik7XG4gICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHYgRW1wdHkpIHJsdiAoY3JlYXRlIEVtcHR5IHJ2IHJyKVxuICAgICAgICAgIHwgTm9kZSAocmxsLCBybHYsIHJsciwgXywgXykgLT4gY3JlYXRlIChjcmVhdGUgbCB2IHJsbCkgcmx2IChjcmVhdGUgcmxyIHJ2IHJyKSkpXG4gICAgZWxzZSAoXG4gICAgICBsZXQgaCA9IGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxIGluXG4gICAgICBsZXQgc2wgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgICAgfCBOb2RlIChfLCBfLCBfLCBfLCBzKSAtPiBzXG4gICAgICBpblxuICAgICAgbGV0IHNyID1cbiAgICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgICB8IExlYWYgXyAtPiAxXG4gICAgICAgIHwgTm9kZSAoXywgXywgXywgXywgcykgLT4gc1xuICAgICAgaW5cbiAgICAgIGlmIGggPSAxIHRoZW4gTGVhZiB2IGVsc2UgTm9kZSAobCwgdiwgciwgaCwgc2wgKyBzciArIDEpKVxuICA7O1xuXG4gICgqIEluc2VydGlvbiBvZiBvbmUgZWxlbWVudCAqKVxuXG4gIGV4Y2VwdGlvbiBTYW1lXG5cbiAgbGV0IGFkZCB0IHggfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGF1eCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IExlYWYgeFxuICAgICAgfCBMZWFmIHYgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiByYWlzZSBTYW1lXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiBjcmVhdGUgKExlYWYgeCkgdiBFbXB0eVxuICAgICAgICBlbHNlIGNyZWF0ZSBFbXB0eSB2IChMZWFmIHgpXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gcmFpc2UgU2FtZSBlbHNlIGlmIGMgPCAwIHRoZW4gYmFsIChhdXggbCkgdiByIGVsc2UgYmFsIGwgdiAoYXV4IHIpXG4gICAgaW5cbiAgICB0cnkgYXV4IHQgd2l0aFxuICAgIHwgU2FtZSAtPiB0XG4gIDs7XG5cbiAgKCogU2FtZSBhcyBjcmVhdGUgYW5kIGJhbCwgYnV0IG5vIGFzc3VtcHRpb25zIGFyZSBtYWRlIG9uIHRoZSByZWxhdGl2ZSBoZWlnaHRzIG9mIGwgYW5kXG4gICAgIHIuICopXG4gIGxldCByZWMgam9pbiBsIHYgciB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIGwsIHIgd2l0aFxuICAgIHwgRW1wdHksIF8gLT4gYWRkIHIgdiB+Y29tcGFyZV9lbHRcbiAgICB8IF8sIEVtcHR5IC0+IGFkZCBsIHYgfmNvbXBhcmVfZWx0XG4gICAgfCBMZWFmIGx2LCBfIC0+IGFkZCAoYWRkIHIgdiB+Y29tcGFyZV9lbHQpIGx2IH5jb21wYXJlX2VsdFxuICAgIHwgXywgTGVhZiBydiAtPiBhZGQgKGFkZCBsIHYgfmNvbXBhcmVfZWx0KSBydiB+Y29tcGFyZV9lbHRcbiAgICB8IE5vZGUgKGxsLCBsdiwgbHIsIGxoLCBfKSwgTm9kZSAocmwsIHJ2LCByciwgcmgsIF8pIC0+XG4gICAgICBpZiBsaCA+IHJoICsgMlxuICAgICAgdGhlbiBiYWwgbGwgbHYgKGpvaW4gbHIgdiByIH5jb21wYXJlX2VsdClcbiAgICAgIGVsc2UgaWYgcmggPiBsaCArIDJcbiAgICAgIHRoZW4gYmFsIChqb2luIGwgdiBybCB+Y29tcGFyZV9lbHQpIHJ2IHJyXG4gICAgICBlbHNlIGNyZWF0ZSBsIHYgclxuICA7O1xuXG4gICgqIFNtYWxsZXN0IGFuZCBncmVhdGVzdCBlbGVtZW50IG9mIGEgc2V0ICopXG4gIGxldCByZWMgbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgfCBOb2RlIChFbXB0eSwgdiwgXywgXywgXykgLT4gU29tZSB2XG4gICAgfCBOb2RlIChsLCBfLCBfLCBfLCBfKSAtPiBtaW5fZWx0IGxcbiAgOztcblxuICBleGNlcHRpb24gU2V0X21pbl9lbHRfZXhuX29mX2VtcHR5X3NldCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxuICBsZXQgKCkgPVxuICAgIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZFxuICAgICAgWyVleHRlbnNpb25fY29uc3RydWN0b3IgU2V0X21pbl9lbHRfZXhuX29mX2VtcHR5X3NldF1cbiAgICAgIChmdW5jdGlvblxuICAgICAgICB8IFNldF9taW5fZWx0X2V4bl9vZl9lbXB0eV9zZXQgLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkF0b20gXCJzZXQubWwuVHJlZTAuU2V0X21pbl9lbHRfZXhuX29mX2VtcHR5X3NldFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBleGNlcHRpb24gU2V0X21heF9lbHRfZXhuX29mX2VtcHR5X3NldCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxuICBsZXQgKCkgPVxuICAgIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZFxuICAgICAgWyVleHRlbnNpb25fY29uc3RydWN0b3IgU2V0X21heF9lbHRfZXhuX29mX2VtcHR5X3NldF1cbiAgICAgIChmdW5jdGlvblxuICAgICAgICB8IFNldF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9zZXQgLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkF0b20gXCJzZXQubWwuVHJlZTAuU2V0X21heF9lbHRfZXhuX29mX2VtcHR5X3NldFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBsZXQgbWluX2VsdF9leG4gdCA9XG4gICAgbWF0Y2ggbWluX2VsdCB0IHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2UgU2V0X21pbl9lbHRfZXhuX29mX2VtcHR5X3NldFxuICAgIHwgU29tZSB2IC0+IHZcbiAgOztcblxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2ggPVxuICAgIGxldCByZWMgZm9sZF91bnRpbF9oZWxwZXIgfmYgdCBhY2MgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLkNvbnRpbnVlIGFjY1xuICAgICAgfCBMZWFmIHZhbHVlIC0+IGYgYWNjIHZhbHVlXG4gICAgICB8IE5vZGUgKGxlZnQsIHZhbHVlLCByaWdodCwgXywgXykgLT5cbiAgICAgICAgKG1hdGNoIGZvbGRfdW50aWxfaGVscGVyIH5mIGxlZnQgYWNjIHdpdGhcbiAgICAgICAgIHwgU3RvcCBfYSBhcyB4IC0+IHhcbiAgICAgICAgIHwgQ29udGludWUgYWNjIC0+XG4gICAgICAgICAgIChtYXRjaCBmIGFjYyB2YWx1ZSB3aXRoXG4gICAgICAgICAgICB8IFN0b3AgX2EgYXMgeCAtPiB4XG4gICAgICAgICAgICB8IENvbnRpbnVlIGEgLT4gZm9sZF91bnRpbF9oZWxwZXIgfmYgcmlnaHQgYSkpXG4gICAgaW5cbiAgICBtYXRjaCBmb2xkX3VudGlsX2hlbHBlciB+ZiB0IGluaXQgd2l0aFxuICAgIHwgQ29udGludWUgeCAtPiBmaW5pc2ggeFxuICAgIHwgU3RvcCB4IC0+IHhcbiAgOztcblxuICBsZXQgcmVjIG1heF9lbHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IHwgTm9kZSAoXywgdiwgRW1wdHksIF8sIF8pIC0+IFNvbWUgdlxuICAgIHwgTm9kZSAoXywgXywgciwgXywgXykgLT4gbWF4X2VsdCByXG4gIDs7XG5cbiAgbGV0IG1heF9lbHRfZXhuIHQgPVxuICAgIG1hdGNoIG1heF9lbHQgdCB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIFNldF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9zZXRcbiAgICB8IFNvbWUgdiAtPiB2XG4gIDs7XG5cbiAgKCogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBzZXQgKilcblxuICBsZXQgcmVjIHJlbW92ZV9taW5fZWx0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LnJlbW92ZV9taW5fZWx0XCJcbiAgICB8IExlYWYgXyAtPiBFbXB0eVxuICAgIHwgTm9kZSAoRW1wdHksIF8sIHIsIF8sIF8pIC0+IHJcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGJhbCAocmVtb3ZlX21pbl9lbHQgbCkgdiByXG4gIDs7XG5cbiAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuICBBbGwgZWxlbWVudHMgb2YgbCBtdXN0IHByZWNlZGUgdGhlIGVsZW1lbnRzIG9mIHIuXG4gICAgIEFzc3VtZSB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAyLiAqKVxuICBsZXQgbWVyZ2UgdDEgdDIgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBFbXB0eSwgdCAtPiB0XG4gICAgfCB0LCBFbXB0eSAtPiB0XG4gICAgfCBfLCBfIC0+IGJhbCB0MSAobWluX2VsdF9leG4gdDIpIChyZW1vdmVfbWluX2VsdCB0MilcbiAgOztcblxuICAoKiBNZXJnZSB0d28gdHJlZXMgbCBhbmQgciBpbnRvIG9uZS4gIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgTm8gYXNzdW1wdGlvbiBvbiB0aGUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuICBsZXQgY29uY2F0IHQxIHQyIH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IEVtcHR5LCB0IHwgdCwgRW1wdHkgLT4gdFxuICAgIHwgXywgXyAtPiBqb2luIHQxIChtaW5fZWx0X2V4biB0MikgKHJlbW92ZV9taW5fZWx0IHQyKSB+Y29tcGFyZV9lbHRcbiAgOztcblxuICBsZXQgc3BsaXQgdCB4IH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBzcGxpdCB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBFbXB0eSwgTm9uZSwgRW1wdHlcbiAgICAgIHwgTGVhZiB2IC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gRW1wdHksIFNvbWUgdiwgRW1wdHlcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIEVtcHR5LCBOb25lLCBMZWFmIHZcbiAgICAgICAgZWxzZSBMZWFmIHYsIE5vbmUsIEVtcHR5XG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gbCwgU29tZSB2LCByXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGxsLCBtYXliZV9lbHQsIHJsID0gc3BsaXQgbCBpblxuICAgICAgICAgIGxsLCBtYXliZV9lbHQsIGpvaW4gcmwgdiByIH5jb21wYXJlX2VsdClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IGxyLCBtYXliZV9lbHQsIHJyID0gc3BsaXQgciBpblxuICAgICAgICAgIGpvaW4gbCB2IGxyIH5jb21wYXJlX2VsdCwgbWF5YmVfZWx0LCBycilcbiAgICBpblxuICAgIHNwbGl0IHRcbiAgOztcblxuICAoKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2V0IG9wZXJhdGlvbnMgKilcblxuICBsZXQgZW1wdHkgPSBFbXB0eVxuXG4gIGxldCByZWMgbWVtIHQgeCB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gZmFsc2VcbiAgICB8IExlYWYgdiAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgIGMgPSAwXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgIGMgPSAwIHx8IG1lbSAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcikgeCB+Y29tcGFyZV9lbHRcbiAgOztcblxuICBsZXQgc2luZ2xldG9uIHggPSBMZWFmIHhcblxuICBsZXQgcmVtb3ZlIHQgeCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgYXV4IHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIFNhbWVcbiAgICAgIHwgTGVhZiB2IC0+IGlmIGNvbXBhcmVfZWx0IHggdiA9IDAgdGhlbiBFbXB0eSBlbHNlIHJhaXNlIFNhbWVcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiBtZXJnZSBsIHIgZWxzZSBpZiBjIDwgMCB0aGVuIGJhbCAoYXV4IGwpIHYgciBlbHNlIGJhbCBsIHYgKGF1eCByKVxuICAgIGluXG4gICAgdHJ5IGF1eCB0IHdpdGhcbiAgICB8IFNhbWUgLT4gdFxuICA7O1xuXG4gIGxldCByZW1vdmVfaW5kZXggdCBpIH5jb21wYXJlX2VsdDpfID1cbiAgICBsZXQgcmVjIGF1eCB0IGkgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIFNhbWVcbiAgICAgIHwgTGVhZiBfIC0+IGlmIGkgPSAwIHRoZW4gRW1wdHkgZWxzZSByYWlzZSBTYW1lXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGxldCBsX3NpemUgPSBsZW5ndGggbCBpblxuICAgICAgICBsZXQgYyA9IFBvbHkuY29tcGFyZSBpIGxfc2l6ZSBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIG1lcmdlIGwgclxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gYmFsIChhdXggbCBpKSB2IHJcbiAgICAgICAgZWxzZSBiYWwgbCB2IChhdXggciAoaSAtIGxfc2l6ZSAtIDEpKVxuICAgIGluXG4gICAgdHJ5IGF1eCB0IGkgd2l0aFxuICAgIHwgU2FtZSAtPiB0XG4gIDs7XG5cbiAgbGV0IHVuaW9uIHMxIHMyIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyB1bmlvbiBzMSBzMiA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHMxIHMyXG4gICAgICB0aGVuIHMxXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgICAgICAgfCBFbXB0eSwgdCB8IHQsIEVtcHR5IC0+IHRcbiAgICAgICAgfCBMZWFmIHYxLCBfIC0+IHVuaW9uIChOb2RlIChFbXB0eSwgdjEsIEVtcHR5LCAxLCAxKSkgczJcbiAgICAgICAgfCBfLCBMZWFmIHYyIC0+IHVuaW9uIHMxIChOb2RlIChFbXB0eSwgdjIsIEVtcHR5LCAxLCAxKSlcbiAgICAgICAgfCBOb2RlIChsMSwgdjEsIHIxLCBoMSwgXyksIE5vZGUgKGwyLCB2MiwgcjIsIGgyLCBfKSAtPlxuICAgICAgICAgIGlmIGgxID49IGgyXG4gICAgICAgICAgdGhlblxuICAgICAgICAgICAgaWYgaDIgPSAxXG4gICAgICAgICAgICB0aGVuIGFkZCBzMSB2MiB+Y29tcGFyZV9lbHRcbiAgICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgICBsZXQgbDIsIF8sIHIyID0gc3BsaXQgczIgdjEgfmNvbXBhcmVfZWx0IGluXG4gICAgICAgICAgICAgIGpvaW4gKHVuaW9uIGwxIGwyKSB2MSAodW5pb24gcjEgcjIpIH5jb21wYXJlX2VsdClcbiAgICAgICAgICBlbHNlIGlmIGgxID0gMVxuICAgICAgICAgIHRoZW4gYWRkIHMyIHYxIH5jb21wYXJlX2VsdFxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IGwxLCBfLCByMSA9IHNwbGl0IHMxIHYyIH5jb21wYXJlX2VsdCBpblxuICAgICAgICAgICAgam9pbiAodW5pb24gbDEgbDIpIHYyICh1bmlvbiByMSByMikgfmNvbXBhcmVfZWx0KSlcbiAgICBpblxuICAgIHVuaW9uIHMxIHMyXG4gIDs7XG5cbiAgbGV0IHVuaW9uX2xpc3QgfmNvbXBhcmF0b3IgfnRvX3RyZWUgeHMgPVxuICAgIGxldCBjb21wYXJlX2VsdCA9IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIGluXG4gICAgTGlzdC5mb2xkIHhzIH5pbml0OmVtcHR5IH5mOihmdW4gYWMgeCAtPiB1bmlvbiBhYyAodG9fdHJlZSB4KSB+Y29tcGFyZV9lbHQpXG4gIDs7XG5cbiAgbGV0IGludGVyIHMxIHMyIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBpbnRlciBzMSBzMiA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHMxIHMyXG4gICAgICB0aGVuIHMxXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgICAgICAgfCBFbXB0eSwgXyB8IF8sIEVtcHR5IC0+IEVtcHR5XG4gICAgICAgIHwgKExlYWYgZWx0IGFzIHNpbmdsZXRvbiksIG90aGVyX3NldCB8IG90aGVyX3NldCwgKExlYWYgZWx0IGFzIHNpbmdsZXRvbikgLT5cbiAgICAgICAgICBpZiBtZW0gb3RoZXJfc2V0IGVsdCB+Y29tcGFyZV9lbHQgdGhlbiBzaW5nbGV0b24gZWxzZSBFbXB0eVxuICAgICAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIF8sIF8pLCB0MiAtPlxuICAgICAgICAgIChtYXRjaCBzcGxpdCB0MiB2MSB+Y29tcGFyZV9lbHQgd2l0aFxuICAgICAgICAgICB8IGwyLCBOb25lLCByMiAtPiBjb25jYXQgKGludGVyIGwxIGwyKSAoaW50ZXIgcjEgcjIpIH5jb21wYXJlX2VsdFxuICAgICAgICAgICB8IGwyLCBTb21lIHYxLCByMiAtPiBqb2luIChpbnRlciBsMSBsMikgdjEgKGludGVyIHIxIHIyKSB+Y29tcGFyZV9lbHQpKVxuICAgIGluXG4gICAgaW50ZXIgczEgczJcbiAgOztcblxuICBsZXQgZGlmZiBzMSBzMiB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgZGlmZiBzMSBzMiA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHMxIHMyXG4gICAgICB0aGVuIEVtcHR5XG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgICAgICAgfCBFbXB0eSwgXyAtPiBFbXB0eVxuICAgICAgICB8IHQxLCBFbXB0eSAtPiB0MVxuICAgICAgICB8IExlYWYgdjEsIHQyIC0+IGRpZmYgKE5vZGUgKEVtcHR5LCB2MSwgRW1wdHksIDEsIDEpKSB0MlxuICAgICAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIF8sIF8pLCB0MiAtPlxuICAgICAgICAgIChtYXRjaCBzcGxpdCB0MiB2MSB+Y29tcGFyZV9lbHQgd2l0aFxuICAgICAgICAgICB8IGwyLCBOb25lLCByMiAtPiBqb2luIChkaWZmIGwxIGwyKSB2MSAoZGlmZiByMSByMikgfmNvbXBhcmVfZWx0XG4gICAgICAgICAgIHwgbDIsIFNvbWUgXywgcjIgLT4gY29uY2F0IChkaWZmIGwxIGwyKSAoZGlmZiByMSByMikgfmNvbXBhcmVfZWx0KSlcbiAgICBpblxuICAgIGRpZmYgczEgczJcbiAgOztcblxuICBtb2R1bGUgRW51bSA9IHN0cnVjdFxuICAgIHR5cGUgaW5jcmVhc2luZ1xuICAgIHR5cGUgZGVjcmVhc2luZ1xuXG4gICAgdHlwZSAoJ2EsICdkaXJlY3Rpb24pIHQgPVxuICAgICAgfCBFbmRcbiAgICAgIHwgTW9yZSBvZiAnYSAqICdhIHRyZWUgKiAoJ2EsICdkaXJlY3Rpb24pIHRcblxuICAgIGxldCByZWMgY29ucyBzIChlIDogKF8sIGluY3JlYXNpbmcpIHQpIDogKF8sIGluY3JlYXNpbmcpIHQgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGVcbiAgICAgIHwgTGVhZiB2IC0+IE1vcmUgKHYsIEVtcHR5LCBlKVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBjb25zIGwgKE1vcmUgKHYsIHIsIGUpKVxuICAgIDs7XG5cbiAgICBsZXQgcmVjIGNvbnNfcmlnaHQgcyAoZSA6IChfLCBkZWNyZWFzaW5nKSB0KSA6IChfLCBkZWNyZWFzaW5nKSB0ID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICB8IExlYWYgdiAtPiBNb3JlICh2LCBFbXB0eSwgZSlcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gY29uc19yaWdodCByIChNb3JlICh2LCBsLCBlKSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX3NldCBzIDogKF8sIGluY3JlYXNpbmcpIHQgPSBjb25zIHMgRW5kXG4gICAgbGV0IG9mX3NldF9yaWdodCBzIDogKF8sIGRlY3JlYXNpbmcpIHQgPSBjb25zX3JpZ2h0IHMgRW5kXG5cbiAgICBsZXQgc3RhcnRpbmdfYXRfaW5jcmVhc2luZyB0IGtleSBjb21wYXJlIDogKF8sIGluY3JlYXNpbmcpIHQgPVxuICAgICAgbGV0IHJlYyBsb29wIHQgZSA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGVcbiAgICAgICAgfCBMZWFmIHYgLT4gbG9vcCAoTm9kZSAoRW1wdHksIHYsIEVtcHR5LCAxLCAxKSkgZVxuICAgICAgICB8IE5vZGUgKF8sIHYsIHIsIF8sIF8pIHdoZW4gY29tcGFyZSB2IGtleSA8IDAgLT4gbG9vcCByIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBsb29wIGwgKE1vcmUgKHYsIHIsIGUpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdCBFbmRcbiAgICA7O1xuXG4gICAgbGV0IHN0YXJ0aW5nX2F0X2RlY3JlYXNpbmcgdCBrZXkgY29tcGFyZSA6IChfLCBkZWNyZWFzaW5nKSB0ID1cbiAgICAgIGxldCByZWMgbG9vcCB0IGUgPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICAgIHwgTGVhZiB2IC0+IGxvb3AgKE5vZGUgKEVtcHR5LCB2LCBFbXB0eSwgMSwgMSkpIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCBfLCBfLCBfKSB3aGVuIGNvbXBhcmUgdiBrZXkgPiAwIC0+IGxvb3AgbCBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gbG9vcCByIChNb3JlICh2LCBsLCBlKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQgRW5kXG4gICAgOztcblxuICAgIGxldCBjb21wYXJlIGNvbXBhcmVfZWx0IGUxIGUyID1cbiAgICAgIGxldCByZWMgbG9vcCBlMSBlMiA9XG4gICAgICAgIG1hdGNoIGUxLCBlMiB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gMFxuICAgICAgICB8IEVuZCwgXyAtPiAtMVxuICAgICAgICB8IF8sIEVuZCAtPiAxXG4gICAgICAgIHwgTW9yZSAodjEsIHIxLCBlMSksIE1vcmUgKHYyLCByMiwgZTIpIC0+XG4gICAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB2MSB2MiBpblxuICAgICAgICAgIGlmIGMgPD4gMFxuICAgICAgICAgIHRoZW4gY1xuICAgICAgICAgIGVsc2UgaWYgcGh5c19lcXVhbCByMSByMlxuICAgICAgICAgIHRoZW4gbG9vcCBlMSBlMlxuICAgICAgICAgIGVsc2UgbG9vcCAoY29ucyByMSBlMSkgKGNvbnMgcjIgZTIpXG4gICAgICBpblxuICAgICAgbG9vcCBlMSBlMlxuICAgIDs7XG5cbiAgICBsZXQgcmVjIGl0ZXIgfmYgPSBmdW5jdGlvblxuICAgICAgfCBFbmQgLT4gKClcbiAgICAgIHwgTW9yZSAoYSwgdHJlZSwgZW51bSkgLT5cbiAgICAgICAgZiBhO1xuICAgICAgICBpdGVyIChjb25zIHRyZWUgZW51bSkgfmZcbiAgICA7O1xuXG4gICAgbGV0IGl0ZXIyIGNvbXBhcmVfZWx0IHQxIHQyIH5mID1cbiAgICAgIGxldCByZWMgbG9vcCB0MSB0MiA9XG4gICAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gKClcbiAgICAgICAgfCBFbmQsIF8gLT4gaXRlciB0MiB+ZjooZnVuIGEgLT4gZiAoYFJpZ2h0IGEpKVxuICAgICAgICB8IF8sIEVuZCAtPiBpdGVyIHQxIH5mOihmdW4gYSAtPiBmIChgTGVmdCBhKSlcbiAgICAgICAgfCBNb3JlIChhMSwgdHJlZTEsIGVudW0xKSwgTW9yZSAoYTIsIHRyZWUyLCBlbnVtMikgLT5cbiAgICAgICAgICBsZXQgY29tcGFyZV9yZXN1bHQgPSBjb21wYXJlX2VsdCBhMSBhMiBpblxuICAgICAgICAgIGlmIGNvbXBhcmVfcmVzdWx0ID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgZiAoYEJvdGggKGExLCBhMikpO1xuICAgICAgICAgICAgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgKGNvbnMgdHJlZTIgZW51bTIpKVxuICAgICAgICAgIGVsc2UgaWYgY29tcGFyZV9yZXN1bHQgPCAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBmIChgTGVmdCBhMSk7XG4gICAgICAgICAgICBsb29wIChjb25zIHRyZWUxIGVudW0xKSB0MilcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGYgKGBSaWdodCBhMik7XG4gICAgICAgICAgICBsb29wIHQxIChjb25zIHRyZWUyIGVudW0yKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQxIHQyXG4gICAgOztcblxuICAgIGxldCBzeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9lbHQgPVxuICAgICAgbGV0IHN0ZXAgc3RhdGUgOiAoKF8sIF8pIEVpdGhlci50LCBfKSBTZXF1ZW5jZS5TdGVwLnQgPVxuICAgICAgICBtYXRjaCBzdGF0ZSB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gRG9uZVxuICAgICAgICB8IEVuZCwgTW9yZSAoZWx0LCB0cmVlLCBlbnVtKSAtPiBZaWVsZCAoU2Vjb25kIGVsdCwgKEVuZCwgY29ucyB0cmVlIGVudW0pKVxuICAgICAgICB8IE1vcmUgKGVsdCwgdHJlZSwgZW51bSksIEVuZCAtPiBZaWVsZCAoRmlyc3QgZWx0LCAoY29ucyB0cmVlIGVudW0sIEVuZCkpXG4gICAgICAgIHwgKE1vcmUgKGExLCB0cmVlMSwgZW51bTEpIGFzIGxlZnQpLCAoTW9yZSAoYTIsIHRyZWUyLCBlbnVtMikgYXMgcmlnaHQpIC0+XG4gICAgICAgICAgbGV0IGNvbXBhcmVfcmVzdWx0ID0gY29tcGFyZV9lbHQgYTEgYTIgaW5cbiAgICAgICAgICBpZiBjb21wYXJlX3Jlc3VsdCA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBuZXh0X3N0YXRlID1cbiAgICAgICAgICAgICAgaWYgcGh5c19lcXVhbCB0cmVlMSB0cmVlMlxuICAgICAgICAgICAgICB0aGVuIGVudW0xLCBlbnVtMlxuICAgICAgICAgICAgICBlbHNlIGNvbnMgdHJlZTEgZW51bTEsIGNvbnMgdHJlZTIgZW51bTJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBTa2lwIG5leHRfc3RhdGUpXG4gICAgICAgICAgZWxzZSBpZiBjb21wYXJlX3Jlc3VsdCA8IDBcbiAgICAgICAgICB0aGVuIFlpZWxkIChGaXJzdCBhMSwgKGNvbnMgdHJlZTEgZW51bTEsIHJpZ2h0KSlcbiAgICAgICAgICBlbHNlIFlpZWxkIChTZWNvbmQgYTIsIChsZWZ0LCBjb25zIHRyZWUyIGVudW0yKSlcbiAgICAgIGluXG4gICAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdDoob2Zfc2V0IHQxLCBvZl9zZXQgdDIpIH5mOnN0ZXBcbiAgICA7O1xuICBlbmRcblxuICBsZXQgdG9fc2VxdWVuY2VfaW5jcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2VsdCB0ID1cbiAgICBsZXQgbmV4dCBlbnVtID1cbiAgICAgIG1hdGNoIGVudW0gd2l0aFxuICAgICAgfCBFbnVtLkVuZCAtPiBTZXF1ZW5jZS5TdGVwLkRvbmVcbiAgICAgIHwgRW51bS5Nb3JlIChrLCB0LCBlKSAtPiBTZXF1ZW5jZS5TdGVwLllpZWxkIChrLCBFbnVtLmNvbnMgdCBlKVxuICAgIGluXG4gICAgbGV0IGluaXQgPVxuICAgICAgbWF0Y2ggZnJvbV9lbHQgd2l0aFxuICAgICAgfCBOb25lIC0+IEVudW0ub2Zfc2V0IHRcbiAgICAgIHwgU29tZSBrZXkgLT4gRW51bS5zdGFydGluZ19hdF9pbmNyZWFzaW5nIHQga2V5IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdCB+ZjpuZXh0XG4gIDs7XG5cbiAgbGV0IHRvX3NlcXVlbmNlX2RlY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9lbHQgdCA9XG4gICAgbGV0IG5leHQgZW51bSA9XG4gICAgICBtYXRjaCBlbnVtIHdpdGhcbiAgICAgIHwgRW51bS5FbmQgLT4gU2VxdWVuY2UuU3RlcC5Eb25lXG4gICAgICB8IEVudW0uTW9yZSAoaywgdCwgZSkgLT4gU2VxdWVuY2UuU3RlcC5ZaWVsZCAoaywgRW51bS5jb25zX3JpZ2h0IHQgZSlcbiAgICBpblxuICAgIGxldCBpbml0ID1cbiAgICAgIG1hdGNoIGZyb21fZWx0IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBFbnVtLm9mX3NldF9yaWdodCB0XG4gICAgICB8IFNvbWUga2V5IC0+IEVudW0uc3RhcnRpbmdfYXRfZGVjcmVhc2luZyB0IGtleSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQgfmY6bmV4dFxuICA7O1xuXG4gIGxldCB0b19zZXF1ZW5jZVxuICAgICAgICBjb21wYXJhdG9yXG4gICAgICAgID8ob3JkZXIgPSBgSW5jcmVhc2luZylcbiAgICAgICAgP2dyZWF0ZXJfb3JfZXF1YWxfdG9cbiAgICAgICAgP2xlc3Nfb3JfZXF1YWxfdG9cbiAgICAgICAgdFxuICAgID1cbiAgICBsZXQgaW5jbHVzaXZlX2JvdW5kIHNpZGUgdCBib3VuZCA9XG4gICAgICBsZXQgY29tcGFyZV9lbHQgPSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBpblxuICAgICAgbGV0IGwsIG1heWJlLCByID0gc3BsaXQgdCBib3VuZCB+Y29tcGFyZV9lbHQgaW5cbiAgICAgIGxldCB0ID0gc2lkZSAobCwgcikgaW5cbiAgICAgIG1hdGNoIG1heWJlIHdpdGhcbiAgICAgIHwgTm9uZSAtPiB0XG4gICAgICB8IFNvbWUgZWx0IC0+IGFkZCB0IGVsdCB+Y29tcGFyZV9lbHRcbiAgICBpblxuICAgIG1hdGNoIG9yZGVyIHdpdGhcbiAgICB8IGBJbmNyZWFzaW5nIC0+XG4gICAgICBsZXQgdCA9IE9wdGlvbi5mb2xkIGxlc3Nfb3JfZXF1YWxfdG8gfmluaXQ6dCB+ZjooaW5jbHVzaXZlX2JvdW5kIGZzdCkgaW5cbiAgICAgIHRvX3NlcXVlbmNlX2luY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9lbHQ6Z3JlYXRlcl9vcl9lcXVhbF90byB0XG4gICAgfCBgRGVjcmVhc2luZyAtPlxuICAgICAgbGV0IHQgPSBPcHRpb24uZm9sZCBncmVhdGVyX29yX2VxdWFsX3RvIH5pbml0OnQgfmY6KGluY2x1c2l2ZV9ib3VuZCBzbmQpIGluXG4gICAgICB0b19zZXF1ZW5jZV9kZWNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fZWx0Omxlc3Nfb3JfZXF1YWxfdG8gdFxuICA7O1xuXG5cbiAgbGV0IHJlYyBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gaWYgZiB2IHRoZW4gU29tZSB2IGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgIGlmIGYgdlxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyBsIH5mIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IFNvbWUgdlxuICAgICAgICB8IFNvbWUgXyBhcyB4IC0+IHgpXG4gICAgICBlbHNlIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyByIH5mXG4gIDs7XG5cbiAgbGV0IHJlYyBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBpZiBmIHYgdGhlbiBTb21lIHYgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgaWYgZiB2XG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggZmluZF9sYXN0X3NhdGlzZnlpbmcgciB+ZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBTb21lIHZcbiAgICAgICAgfCBTb21lIF8gYXMgeCAtPiB4KVxuICAgICAgZWxzZSBmaW5kX2xhc3Rfc2F0aXNmeWluZyBsIH5mXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdiA9XG4gICAgbWF0Y2ggaG93IHdpdGhcbiAgICB8IGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAtPiBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA8IDApXG4gICAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gLT4gZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPD0gMClcbiAgICB8IGBGaXJzdF9lcXVhbF90byAtPlxuICAgICAgKG1hdGNoIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA+PSAwKSB3aXRoXG4gICAgICAgfCBTb21lIHggYXMgZWx0IHdoZW4gY29tcGFyZSB4IHYgPSAwIC0+IGVsdFxuICAgICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICAgIHwgYExhc3RfZXF1YWxfdG8gLT5cbiAgICAgIChtYXRjaCBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA8PSAwKSB3aXRoXG4gICAgICAgfCBTb21lIHggYXMgZWx0IHdoZW4gY29tcGFyZSB4IHYgPSAwIC0+IGVsdFxuICAgICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICAgIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAtPlxuICAgICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID49IDApXG4gICAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuIC0+XG4gICAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPiAwKVxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgbGV0IGlzX2xlZnQgeCA9XG4gICAgICBtYXRjaCBzZWdtZW50X29mIHggd2l0aFxuICAgICAgfCBgTGVmdCAtPiB0cnVlXG4gICAgICB8IGBSaWdodCAtPiBmYWxzZVxuICAgIGluXG4gICAgbGV0IGlzX3JpZ2h0IHggPSBub3QgKGlzX2xlZnQgeCkgaW5cbiAgICBtYXRjaCBob3cgd2l0aFxuICAgIHwgYExhc3Rfb25fbGVmdCAtPiBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOmlzX2xlZnRcbiAgICB8IGBGaXJzdF9vbl9yaWdodCAtPiBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Zjppc19yaWdodFxuICA7O1xuXG4gIGxldCBtZXJnZV90b19zZXF1ZW5jZVxuICAgICAgICBjb21wYXJhdG9yXG4gICAgICAgID8ob3JkZXIgPSBgSW5jcmVhc2luZylcbiAgICAgICAgP2dyZWF0ZXJfb3JfZXF1YWxfdG9cbiAgICAgICAgP2xlc3Nfb3JfZXF1YWxfdG9cbiAgICAgICAgdFxuICAgICAgICB0J1xuICAgID1cbiAgICBTZXF1ZW5jZS5tZXJnZV93aXRoX2R1cGxpY2F0ZXNcbiAgICAgICh0b19zZXF1ZW5jZSBjb21wYXJhdG9yIH5vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0KVxuICAgICAgKHRvX3NlcXVlbmNlIGNvbXBhcmF0b3Igfm9yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQnKVxuICAgICAgfmNvbXBhcmU6XG4gICAgICAgIChtYXRjaCBvcmRlciB3aXRoXG4gICAgICAgICB8IGBJbmNyZWFzaW5nIC0+IGNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgICAgfCBgRGVjcmVhc2luZyAtPiBGbi5mbGlwIGNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgY29tcGFyZSBjb21wYXJlX2VsdCBzMSBzMiA9XG4gICAgRW51bS5jb21wYXJlIGNvbXBhcmVfZWx0IChFbnVtLm9mX3NldCBzMSkgKEVudW0ub2Zfc2V0IHMyKVxuICA7O1xuXG4gIGxldCBpdGVyMiBzMSBzMiB+Y29tcGFyZV9lbHQgPSBFbnVtLml0ZXIyIGNvbXBhcmVfZWx0IChFbnVtLm9mX3NldCBzMSkgKEVudW0ub2Zfc2V0IHMyKVxuICBsZXQgZXF1YWwgczEgczIgfmNvbXBhcmVfZWx0ID0gY29tcGFyZSBjb21wYXJlX2VsdCBzMSBzMiA9IDBcblxuICBsZXQgaXNfc3Vic2V0IHMxIH5vZl86czIgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGlzX3N1YnNldCBzMSB+b2ZfOnMyID1cbiAgICAgIG1hdGNoIHMxLCBzMiB3aXRoXG4gICAgICB8IEVtcHR5LCBfIC0+IHRydWVcbiAgICAgIHwgXywgRW1wdHkgLT4gZmFsc2VcbiAgICAgIHwgTGVhZiB2MSwgdDIgLT4gbWVtIHQyIHYxIH5jb21wYXJlX2VsdFxuICAgICAgfCBOb2RlIChsMSwgdjEsIHIxLCBfLCBfKSwgTGVhZiB2MiAtPlxuICAgICAgICAobWF0Y2ggbDEsIHIxIHdpdGhcbiAgICAgICAgIHwgRW1wdHksIEVtcHR5IC0+XG4gICAgICAgICAgICgqIFRoaXMgY2FzZSBzaG91bGRuJ3Qgb2NjdXIgaW4gcHJhY3RpY2UgYmVjYXVzZSB3ZSBzaG91bGQgaGF2ZSBjb25zdHJ1Y3RlZFxuICAgICAgICAgICAgICBhIExlYWYgcmF0aGVyIHRoYW4gYSBOb2RlIHdpdGggdHdvIEVtcHR5IHN1YnRyZWVzICopXG4gICAgICAgICAgIGNvbXBhcmVfZWx0IHYxIHYyID0gMFxuICAgICAgICAgfCBfLCBfIC0+IGZhbHNlKVxuICAgICAgfCBOb2RlIChsMSwgdjEsIHIxLCBfLCBfKSwgKE5vZGUgKGwyLCB2MiwgcjIsIF8sIF8pIGFzIHQyKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHYxIHYyIGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW5cbiAgICAgICAgICBwaHlzX2VxdWFsIHMxIHMyIHx8IChpc19zdWJzZXQgbDEgfm9mXzpsMiAmJiBpc19zdWJzZXQgcjEgfm9mXzpyMilcbiAgICAgICAgICAoKiBOb3RlIHRoYXQgaGVpZ2h0IGFuZCBzaXplIGRvbid0IG1hdHRlciBoZXJlLiAqKVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gaXNfc3Vic2V0IChOb2RlIChsMSwgdjEsIEVtcHR5LCAwLCAwKSkgfm9mXzpsMiAmJiBpc19zdWJzZXQgcjEgfm9mXzp0MlxuICAgICAgICBlbHNlIGlzX3N1YnNldCAoTm9kZSAoRW1wdHksIHYxLCByMSwgMCwgMCkpIH5vZl86cjIgJiYgaXNfc3Vic2V0IGwxIH5vZl86dDJcbiAgICBpblxuICAgIGlzX3N1YnNldCBzMSB+b2ZfOnMyXG4gIDs7XG5cbiAgbGV0IHJlYyBhcmVfZGlzam9pbnQgczEgczIgfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCBzMSwgczIgd2l0aFxuICAgIHwgRW1wdHksIF8gfCBfLCBFbXB0eSAtPiB0cnVlXG4gICAgfCBMZWFmIGVsdCwgb3RoZXJfc2V0IHwgb3RoZXJfc2V0LCBMZWFmIGVsdCAtPiBub3QgKG1lbSBvdGhlcl9zZXQgZWx0IH5jb21wYXJlX2VsdClcbiAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIF8sIF8pLCB0MiAtPlxuICAgICAgaWYgcGh5c19lcXVhbCBzMSBzMlxuICAgICAgdGhlbiBmYWxzZVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHNwbGl0IHQyIHYxIH5jb21wYXJlX2VsdCB3aXRoXG4gICAgICAgIHwgbDIsIE5vbmUsIHIyIC0+XG4gICAgICAgICAgYXJlX2Rpc2pvaW50IGwxIGwyIH5jb21wYXJlX2VsdCAmJiBhcmVfZGlzam9pbnQgcjEgcjIgfmNvbXBhcmVfZWx0XG4gICAgICAgIHwgXywgU29tZSBfLCBfIC0+IGZhbHNlKVxuICA7O1xuXG4gIGxldCBpdGVyIHQgfmYgPVxuICAgIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICB8IExlYWYgdiAtPiBmIHZcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgaXRlciBsO1xuICAgICAgICBmIHY7XG4gICAgICAgIGl0ZXIgclxuICAgIGluXG4gICAgaXRlciB0XG4gIDs7XG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmID0gRW51bS5zeW1tZXRyaWNfZGlmZlxuXG4gIGxldCByZWMgZm9sZCBzIH5pbml0OmFjY3UgfmYgPVxuICAgIG1hdGNoIHMgd2l0aFxuICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgIHwgTGVhZiB2IC0+IGYgYWNjdSB2XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBmb2xkIH5mIHIgfmluaXQ6KGYgKGZvbGQgfmYgbCB+aW5pdDphY2N1KSB2KVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfdF9pZ25vcmluZ19zdHJ1Y3R1cmUgaGFzaF9mb2xkX2VsZW0gc3RhdGUgdCA9XG4gICAgZm9sZCB0IH5pbml0OihoYXNoX2ZvbGRfaW50IHN0YXRlIChsZW5ndGggdCkpIH5mOmhhc2hfZm9sZF9lbGVtXG4gIDs7XG5cbiAgbGV0IGNvdW50IHQgfmYgPSBDb250YWluZXIuY291bnQgfmZvbGQgdCB+ZlxuICBsZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG5cbiAgbGV0IHJlYyBmb2xkX3JpZ2h0IHMgfmluaXQ6YWNjdSB+ZiA9XG4gICAgbWF0Y2ggcyB3aXRoXG4gICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgfCBMZWFmIHYgLT4gZiB2IGFjY3VcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGZvbGRfcmlnaHQgfmYgbCB+aW5pdDooZiB2IChmb2xkX3JpZ2h0IH5mIHIgfmluaXQ6YWNjdSkpXG4gIDs7XG5cbiAgbGV0IHJlYyBmb3JfYWxsIHQgfmY6cCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiB0cnVlXG4gICAgfCBMZWFmIHYgLT4gcCB2XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBwIHYgJiYgZm9yX2FsbCB+ZjpwIGwgJiYgZm9yX2FsbCB+ZjpwIHJcbiAgOztcblxuICBsZXQgcmVjIGV4aXN0cyB0IH5mOnAgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gZmFsc2VcbiAgICB8IExlYWYgdiAtPiBwIHZcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IHAgdiB8fCBleGlzdHMgfmY6cCBsIHx8IGV4aXN0cyB+ZjpwIHJcbiAgOztcblxuICBsZXQgZmlsdGVyIHMgfmY6cCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgZmlsdCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBMZWFmIHYgLT4gaWYgcCB2IHRoZW4gYWRkIGFjY3UgdiB+Y29tcGFyZV9lbHQgZWxzZSBhY2N1XG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGZpbHQgKGZpbHQgKGlmIHAgdiB0aGVuIGFkZCBhY2N1IHYgfmNvbXBhcmVfZWx0IGVsc2UgYWNjdSkgbCkgclxuICAgIGluXG4gICAgZmlsdCBFbXB0eSBzXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXAgcyB+ZjpwIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBmaWx0IGFjY3UgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgICB8IExlYWYgdiAtPlxuICAgICAgICAobWF0Y2ggcCB2IHdpdGhcbiAgICAgICAgIHwgTm9uZSAtPiBhY2N1XG4gICAgICAgICB8IFNvbWUgdiAtPiBhZGQgYWNjdSB2IH5jb21wYXJlX2VsdClcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgZmlsdFxuICAgICAgICAgIChmaWx0XG4gICAgICAgICAgICAgKG1hdGNoIHAgdiB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBhY2N1XG4gICAgICAgICAgICAgIHwgU29tZSB2IC0+IGFkZCBhY2N1IHYgfmNvbXBhcmVfZWx0KVxuICAgICAgICAgICAgIGwpXG4gICAgICAgICAgclxuICAgIGluXG4gICAgZmlsdCBFbXB0eSBzXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl90ZiBzIH5mOnAgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIHBhcnQgKCh0LCBmKSBhcyBhY2N1KSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTGVhZiB2IC0+IGlmIHAgdiB0aGVuIGFkZCB0IHYgfmNvbXBhcmVfZWx0LCBmIGVsc2UgdCwgYWRkIGYgdiB+Y29tcGFyZV9lbHRcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgcGFydCAocGFydCAoaWYgcCB2IHRoZW4gYWRkIHQgdiB+Y29tcGFyZV9lbHQsIGYgZWxzZSB0LCBhZGQgZiB2IH5jb21wYXJlX2VsdCkgbCkgclxuICAgIGluXG4gICAgcGFydCAoRW1wdHksIEVtcHR5KSBzXG4gIDs7XG5cbiAgbGV0IHJlYyBlbGVtZW50c19hdXggYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgfCBMZWFmIHYgLT4gdiA6OiBhY2N1XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBlbGVtZW50c19hdXggKHYgOjogZWxlbWVudHNfYXV4IGFjY3UgcikgbFxuICA7O1xuXG4gIGxldCBlbGVtZW50cyBzID0gZWxlbWVudHNfYXV4IFtdIHNcblxuICBsZXQgY2hvb3NlIHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IFNvbWUgdlxuICAgIHwgTm9kZSAoXywgdiwgXywgXywgXykgLT4gU29tZSB2XG4gIDs7XG5cbiAgbGV0IGNob29zZV9leG4gPVxuICAgIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlNldC5jaG9vc2VfZXhuOiBlbXB0eSBzZXRcIikgaW5cbiAgICBsZXQgY2hvb3NlX2V4biB0ID1cbiAgICAgIG1hdGNoIGNob29zZSB0IHdpdGhcbiAgICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICAgIHwgU29tZSB2IC0+IHZcbiAgICBpblxuICAgICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgICBjaG9vc2VfZXhuXG4gIDs7XG5cbiAgbGV0IG9mX2xpc3QgbHN0IH5jb21wYXJlX2VsdCA9XG4gICAgTGlzdC5mb2xkIGxzdCB+aW5pdDplbXB0eSB+ZjooZnVuIHQgeCAtPiBhZGQgdCB4IH5jb21wYXJlX2VsdClcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2Ugc2VxdWVuY2UgfmNvbXBhcmVfZWx0ID1cbiAgICBTZXF1ZW5jZS5mb2xkIHNlcXVlbmNlIH5pbml0OmVtcHR5IH5mOihmdW4gdCB4IC0+IGFkZCB0IHggfmNvbXBhcmVfZWx0KVxuICA7O1xuXG4gIGxldCB0b19saXN0IHMgPSBlbGVtZW50cyBzXG5cbiAgbGV0IG9mX2FycmF5IGEgfmNvbXBhcmVfZWx0ID1cbiAgICBBcnJheS5mb2xkIGEgfmluaXQ6ZW1wdHkgfmY6KGZ1biB0IHggLT4gYWRkIHQgeCB+Y29tcGFyZV9lbHQpXG4gIDs7XG5cbiAgKCogZmFzdGVyIGJ1dCBlcXVpdmFsZW50IHRvIFtBcnJheS5vZl9saXN0ICh0b19saXN0IHQpXSAqKVxuICBsZXQgdG9fYXJyYXkgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gW3x8XVxuICAgIHwgTGVhZiB2IC0+IFt8IHYgfF1cbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIHMpIC0+XG4gICAgICBsZXQgcmVzID0gQXJyYXkuY3JlYXRlIH5sZW46cyB2IGluXG4gICAgICBsZXQgcG9zX3JlZiA9IHJlZiAwIGluXG4gICAgICBsZXQgcmVjIGxvb3AgPSBmdW5jdGlvblxuICAgICAgICAoKiBJbnZhcmlhbnQ6IG9uIGVudHJ5IGFuZCBvbiBleGl0IHRvIFtsb29wXSwgIXBvc19yZWYgaXMgdGhlIG5leHRcbiAgICAgICAgICAgYXZhaWxhYmxlIGNlbGwgaW4gdGhlIGFycmF5LiAqKVxuICAgICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICAgIHwgTGVhZiB2IC0+XG4gICAgICAgICAgcmVzLighcG9zX3JlZikgPC0gdjtcbiAgICAgICAgICBpbmNyIHBvc19yZWZcbiAgICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICAgIGxvb3AgbDtcbiAgICAgICAgICByZXMuKCFwb3NfcmVmKSA8LSB2O1xuICAgICAgICAgIGluY3IgcG9zX3JlZjtcbiAgICAgICAgICBsb29wIHJcbiAgICAgIGluXG4gICAgICBsb29wIGw7XG4gICAgICAoKiByZXMuKCFwb3NfcmVmKSBpcyBhbHJlYWR5IGluaXRpYWxpemVkIChieSBBcnJheS5jcmVhdGUgfmxlbjphYm92ZSkuICopXG4gICAgICBpbmNyIHBvc19yZWY7XG4gICAgICBsb29wIHI7XG4gICAgICByZXNcbiAgOztcblxuICBsZXQgbWFwIHQgfmYgfmNvbXBhcmVfZWx0ID0gZm9sZCB0IH5pbml0OmVtcHR5IH5mOihmdW4gdCB4IC0+IGFkZCB0IChmIHgpIH5jb21wYXJlX2VsdClcblxuICBsZXQgZ3JvdXBfYnkgc2V0IH5lcXVpdiB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgbG9vcCBzZXQgZXF1aXZfY2xhc3NlcyA9XG4gICAgICBpZiBpc19lbXB0eSBzZXRcbiAgICAgIHRoZW4gZXF1aXZfY2xhc3Nlc1xuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCB4ID0gY2hvb3NlX2V4biBzZXQgaW5cbiAgICAgICAgbGV0IGVxdWl2X3gsIG5vdF9lcXVpdl94ID1cbiAgICAgICAgICBwYXJ0aXRpb25fdGYgc2V0IH5mOihmdW4gZWx0IC0+IHBoeXNfZXF1YWwgeCBlbHQgfHwgZXF1aXYgeCBlbHQpIH5jb21wYXJlX2VsdFxuICAgICAgICBpblxuICAgICAgICBsb29wIG5vdF9lcXVpdl94IChlcXVpdl94IDo6IGVxdWl2X2NsYXNzZXMpKVxuICAgIGluXG4gICAgbG9vcCBzZXQgW11cbiAgOztcblxuICBsZXQgcmVjIGZpbmQgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gaWYgZiB2IHRoZW4gU29tZSB2IGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgIGlmIGYgdlxuICAgICAgdGhlbiBTb21lIHZcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBmaW5kIGwgfmYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gZmluZCByIH5mXG4gICAgICAgIHwgU29tZSBfIGFzIHIgLT4gcilcbiAgOztcblxuICBsZXQgcmVjIGZpbmRfbWFwIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IGYgdlxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgIChtYXRjaCBmIHYgd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHIgLT4gclxuICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgKG1hdGNoIGZpbmRfbWFwIGwgfmYgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCByIH5mXG4gICAgICAgICAgfCBTb21lIF8gYXMgciAtPiByKSlcbiAgOztcblxuICBsZXQgZmluZF9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZCB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gZmFpbHdpdGggXCJTZXQuZmluZF9leG4gZmFpbGVkIHRvIGZpbmQgYSBtYXRjaGluZyBlbGVtZW50XCJcbiAgICB8IFNvbWUgZSAtPiBlXG4gIDs7XG5cbiAgbGV0IHJlYyBudGggdCBpID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBpZiBpID0gMCB0aGVuIFNvbWUgdiBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIHMpIC0+XG4gICAgICBpZiBpID49IHNcbiAgICAgIHRoZW4gTm9uZVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBsX3NpemUgPSBsZW5ndGggbCBpblxuICAgICAgICBsZXQgYyA9IFBvbHkuY29tcGFyZSBpIGxfc2l6ZSBpblxuICAgICAgICBpZiBjIDwgMCB0aGVuIG50aCBsIGkgZWxzZSBpZiBjID0gMCB0aGVuIFNvbWUgdiBlbHNlIG50aCByIChpIC0gbF9zaXplIC0gMSkpXG4gIDs7XG5cbiAgbGV0IHN0YWJsZV9kZWR1cF9saXN0IHhzIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBsb29wIHhzIGxlZnRvdmVycyBhbHJlYWR5X3NlZW4gPVxuICAgICAgbWF0Y2ggeHMgd2l0aFxuICAgICAgfCBbXSAtPiBMaXN0LnJldiBsZWZ0b3ZlcnNcbiAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgaWYgbWVtIGFscmVhZHlfc2VlbiBoZCB+Y29tcGFyZV9lbHRcbiAgICAgICAgdGhlbiBsb29wIHRsIGxlZnRvdmVycyBhbHJlYWR5X3NlZW5cbiAgICAgICAgZWxzZSBsb29wIHRsIChoZCA6OiBsZWZ0b3ZlcnMpIChhZGQgYWxyZWFkeV9zZWVuIGhkIH5jb21wYXJlX2VsdClcbiAgICBpblxuICAgIGxvb3AgeHMgW10gZW1wdHlcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCBhX29mX3NleHAgc2V4cCB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIHNleHAgd2l0aFxuICAgIHwgU2V4cC5MaXN0IGxzdCAtPlxuICAgICAgbGV0IGVsdF9sc3QgPSBMaXN0Lm1hcCBsc3QgfmY6YV9vZl9zZXhwIGluXG4gICAgICBsZXQgc2V0ID0gb2ZfbGlzdCBlbHRfbHN0IH5jb21wYXJlX2VsdCBpblxuICAgICAgaWYgbGVuZ3RoIHNldCA9IExpc3QubGVuZ3RoIGxzdFxuICAgICAgdGhlbiBzZXRcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgc2V0ID0gcmVmIGVtcHR5IGluXG4gICAgICAgIExpc3QuaXRlcjJfZXhuIGxzdCBlbHRfbHN0IH5mOihmdW4gZWxfc2V4cCBlbCAtPlxuICAgICAgICAgIGlmIG1lbSAhc2V0IGVsIH5jb21wYXJlX2VsdFxuICAgICAgICAgIHRoZW4gb2Zfc2V4cF9lcnJvciBcIlNldC50X29mX3NleHA6IGR1cGxpY2F0ZSBlbGVtZW50IGluIHNldFwiIGVsX3NleHBcbiAgICAgICAgICBlbHNlIHNldCA6PSBhZGQgIXNldCBlbCB+Y29tcGFyZV9lbHQpO1xuICAgICAgICBhc3NlcnQgZmFsc2UpXG4gICAgfCBzZXhwIC0+IG9mX3NleHBfZXJyb3IgXCJTZXQudF9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID1cbiAgICBTZXhwLkxpc3QgKGZvbGRfcmlnaHQgdCB+aW5pdDpbXSB+ZjooZnVuIGVsIGFjYyAtPiBzZXhwX29mX2EgZWwgOjogYWNjKSlcbiAgOztcblxuICBtb2R1bGUgTmFtZWQgPSBzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdjbXApIHQgPVxuICAgICAgeyB0cmVlIDogJ2EgdFxuICAgICAgOyBuYW1lIDogc3RyaW5nXG4gICAgICB9XG5cbiAgICBsZXQgaXNfc3Vic2V0IChzdWJzZXQgOiBfIHQpIH5vZl86KHN1cGVyc2V0IDogXyB0KSB+c2V4cF9vZl9lbHQgfmNvbXBhcmVfZWx0ID1cbiAgICAgIGxldCBpbnZhbGlkX2VsZW1lbnRzID0gZGlmZiBzdWJzZXQudHJlZSBzdXBlcnNldC50cmVlIH5jb21wYXJlX2VsdCBpblxuICAgICAgaWYgaXNfZW1wdHkgaW52YWxpZF9lbGVtZW50c1xuICAgICAgdGhlbiBPayAoKVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBpbnZhbGlkX2VsZW1lbnRzX3NleHAgPSBzZXhwX29mX3Qgc2V4cF9vZl9lbHQgaW52YWxpZF9lbGVtZW50cyBpblxuICAgICAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICAgIChzdWJzZXQubmFtZSBeIFwiIGlzIG5vdCBhIHN1YnNldCBvZiBcIiBeIHN1cGVyc2V0Lm5hbWUpXG4gICAgICAgICAgICAgWyBcImludmFsaWRfZWxlbWVudHNcIiwgaW52YWxpZF9lbGVtZW50c19zZXhwIF0pKVxuICAgIDs7XG5cbiAgICBsZXQgZXF1YWwgczEgczIgfnNleHBfb2ZfZWx0IH5jb21wYXJlX2VsdCA9XG4gICAgICBPcl9lcnJvci5jb21iaW5lX2Vycm9yc191bml0XG4gICAgICAgIFsgaXNfc3Vic2V0IHMxIH5vZl86czIgfnNleHBfb2ZfZWx0IH5jb21wYXJlX2VsdFxuICAgICAgICA7IGlzX3N1YnNldCBzMiB+b2ZfOnMxIH5zZXhwX29mX2VsdCB+Y29tcGFyZV9lbHRcbiAgICAgICAgXVxuICAgIDs7XG4gIGVuZFxuZW5kXG5cbnR5cGUgKCdhLCAnY29tcGFyYXRvcikgdCA9XG4gIHsgKCogW2NvbXBhcmF0b3JdIGlzIHRoZSBmaXJzdCBmaWVsZCBzbyB0aGF0IHBvbHltb3JwaGljIGVxdWFsaXR5IGZhaWxzIG9uIGEgbWFwIGR1ZVxuICAgICAgIHRvIHRoZSBmdW5jdGlvbmFsIHZhbHVlIGluIHRoZSBjb21wYXJhdG9yLlxuICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFmZmVjdCBwb2x5bW9ycGhpYyBbY29tcGFyZV06IHRoYXQgc3RpbGwgcHJvZHVjZXNcbiAgICAgICBub25zZW5zZS4gKilcbiAgICBjb21wYXJhdG9yIDogKCdhLCAnY29tcGFyYXRvcikgQ29tcGFyYXRvci50XG4gIDsgdHJlZSA6ICdhIFRyZWUwLnRcbiAgfVxuXG50eXBlICgnYSwgJ2NvbXBhcmF0b3IpIHRyZWUgPSAnYSBUcmVlMC50XG5cbmxldCBsaWtlIHsgdHJlZSA9IF87IGNvbXBhcmF0b3IgfSB0cmVlID0geyB0cmVlOyBjb21wYXJhdG9yIH1cbmxldCBjb21wYXJlX2VsdCB0ID0gdC5jb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuXG5tb2R1bGUgQWNjZXNzb3JzID0gc3RydWN0XG4gIGxldCBjb21wYXJhdG9yIHQgPSB0LmNvbXBhcmF0b3JcbiAgbGV0IGludmFyaWFudHMgdCA9IFRyZWUwLmludmFyaWFudHMgdC50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdClcbiAgbGV0IGxlbmd0aCB0ID0gVHJlZTAubGVuZ3RoIHQudHJlZVxuICBsZXQgaXNfZW1wdHkgdCA9IFRyZWUwLmlzX2VtcHR5IHQudHJlZVxuICBsZXQgZWxlbWVudHMgdCA9IFRyZWUwLmVsZW1lbnRzIHQudHJlZVxuICBsZXQgbWluX2VsdCB0ID0gVHJlZTAubWluX2VsdCB0LnRyZWVcbiAgbGV0IG1pbl9lbHRfZXhuIHQgPSBUcmVlMC5taW5fZWx0X2V4biB0LnRyZWVcbiAgbGV0IG1heF9lbHQgdCA9IFRyZWUwLm1heF9lbHQgdC50cmVlXG4gIGxldCBtYXhfZWx0X2V4biB0ID0gVHJlZTAubWF4X2VsdF9leG4gdC50cmVlXG4gIGxldCBjaG9vc2UgdCA9IFRyZWUwLmNob29zZSB0LnRyZWVcbiAgbGV0IGNob29zZV9leG4gdCA9IFRyZWUwLmNob29zZV9leG4gdC50cmVlXG4gIGxldCB0b19saXN0IHQgPSBUcmVlMC50b19saXN0IHQudHJlZVxuICBsZXQgdG9fYXJyYXkgdCA9IFRyZWUwLnRvX2FycmF5IHQudHJlZVxuICBsZXQgZm9sZCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZCB0LnRyZWUgfmluaXQgfmZcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfdW50aWwgdC50cmVlIH5pbml0IH5mXG4gIGxldCBmb2xkX3JpZ2h0IHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3JpZ2h0IHQudHJlZSB+aW5pdCB+ZlxuICBsZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG4gIGxldCBpdGVyIHQgfmYgPSBUcmVlMC5pdGVyIHQudHJlZSB+ZlxuICBsZXQgaXRlcjIgYSBiIH5mID0gVHJlZTAuaXRlcjIgYS50cmVlIGIudHJlZSB+ZiB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IGEpXG4gIGxldCBleGlzdHMgdCB+ZiA9IFRyZWUwLmV4aXN0cyB0LnRyZWUgfmZcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IFRyZWUwLmZvcl9hbGwgdC50cmVlIH5mXG4gIGxldCBjb3VudCB0IH5mID0gVHJlZTAuY291bnQgdC50cmVlIH5mXG4gIGxldCBzdW0gbSB0IH5mID0gVHJlZTAuc3VtIG0gdC50cmVlIH5mXG4gIGxldCBmaW5kIHQgfmYgPSBUcmVlMC5maW5kIHQudHJlZSB+ZlxuICBsZXQgZmluZF9leG4gdCB+ZiA9IFRyZWUwLmZpbmRfZXhuIHQudHJlZSB+ZlxuICBsZXQgZmluZF9tYXAgdCB+ZiA9IFRyZWUwLmZpbmRfbWFwIHQudHJlZSB+ZlxuICBsZXQgbWVtIHQgYSA9IFRyZWUwLm1lbSB0LnRyZWUgYSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpXG4gIGxldCBmaWx0ZXIgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyIHQudHJlZSB+ZiB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpKVxuICBsZXQgYWRkIHQgYSA9IGxpa2UgdCAoVHJlZTAuYWRkIHQudHJlZSBhIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkpXG4gIGxldCByZW1vdmUgdCBhID0gbGlrZSB0IChUcmVlMC5yZW1vdmUgdC50cmVlIGEgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSlcbiAgbGV0IHVuaW9uIHQxIHQyID0gbGlrZSB0MSAoVHJlZTAudW5pb24gdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpKVxuICBsZXQgaW50ZXIgdDEgdDIgPSBsaWtlIHQxIChUcmVlMC5pbnRlciB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSkpXG4gIGxldCBkaWZmIHQxIHQyID0gbGlrZSB0MSAoVHJlZTAuZGlmZiB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSkpXG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmIHQxIHQyID1cbiAgICBUcmVlMC5zeW1tZXRyaWNfZGlmZiB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSlcbiAgOztcblxuICBsZXQgY29tcGFyZV9kaXJlY3QgdDEgdDIgPSBUcmVlMC5jb21wYXJlIChjb21wYXJlX2VsdCB0MSkgdDEudHJlZSB0Mi50cmVlXG4gIGxldCBlcXVhbCB0MSB0MiA9IFRyZWUwLmVxdWFsIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKVxuICBsZXQgaXNfc3Vic2V0IHQgfm9mXyA9IFRyZWUwLmlzX3N1YnNldCB0LnRyZWUgfm9mXzpvZl8udHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpXG5cbiAgbGV0IGFyZV9kaXNqb2ludCB0MSB0MiA9XG4gICAgVHJlZTAuYXJlX2Rpc2pvaW50IHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKVxuICA7O1xuXG4gIG1vZHVsZSBOYW1lZCA9IHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2NtcCkgdCA9XG4gICAgICB7IHNldCA6ICgnYSwgJ2NtcCkgdFxuICAgICAgOyBuYW1lIDogc3RyaW5nXG4gICAgICB9XG5cbiAgICBsZXQgdG9fbmFtZWRfdHJlZSB7IHNldDsgbmFtZSB9ID0geyBUcmVlMC5OYW1lZC50cmVlID0gc2V0LnRyZWU7IG5hbWUgfVxuXG4gICAgbGV0IGlzX3N1YnNldCAoc3Vic2V0IDogKF8sIF8pIHQpIH5vZl86KHN1cGVyc2V0IDogKF8sIF8pIHQpID1cbiAgICAgIFRyZWUwLk5hbWVkLmlzX3N1YnNldFxuICAgICAgICAodG9fbmFtZWRfdHJlZSBzdWJzZXQpXG4gICAgICAgIH5vZl86KHRvX25hbWVkX3RyZWUgc3VwZXJzZXQpXG4gICAgICAgIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgc3Vic2V0LnNldClcbiAgICAgICAgfnNleHBfb2ZfZWx0OnN1YnNldC5zZXQuY29tcGFyYXRvci5zZXhwX29mX3RcbiAgICA7O1xuXG4gICAgbGV0IGVxdWFsIHQxIHQyID1cbiAgICAgIE9yX2Vycm9yLmNvbWJpbmVfZXJyb3JzX3VuaXQgWyBpc19zdWJzZXQgdDEgfm9mXzp0MjsgaXNfc3Vic2V0IHQyIH5vZl86dDEgXVxuICAgIDs7XG4gIGVuZFxuXG4gIGxldCBwYXJ0aXRpb25fdGYgdCB+ZiA9XG4gICAgbGV0IHRyZWVfdCwgdHJlZV9mID0gVHJlZTAucGFydGl0aW9uX3RmIHQudHJlZSB+ZiB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpIGluXG4gICAgbGlrZSB0IHRyZWVfdCwgbGlrZSB0IHRyZWVfZlxuICA7O1xuXG4gIGxldCBzcGxpdCB0IGEgPVxuICAgIGxldCB0cmVlMSwgYiwgdHJlZTIgPSBUcmVlMC5zcGxpdCB0LnRyZWUgYSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpIGluXG4gICAgbGlrZSB0IHRyZWUxLCBiLCBsaWtlIHQgdHJlZTJcbiAgOztcblxuICBsZXQgZ3JvdXBfYnkgdCB+ZXF1aXYgPVxuICAgIExpc3QubWFwIChUcmVlMC5ncm91cF9ieSB0LnRyZWUgfmVxdWl2IH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkpIH5mOihsaWtlIHQpXG4gIDs7XG5cbiAgbGV0IG50aCB0IGkgPSBUcmVlMC5udGggdC50cmVlIGlcbiAgbGV0IHJlbW92ZV9pbmRleCB0IGkgPSBsaWtlIHQgKFRyZWUwLnJlbW92ZV9pbmRleCB0LnRyZWUgaSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpKVxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSBfIHQgPSBUcmVlMC5zZXhwX29mX3Qgc2V4cF9vZl9hIHQudHJlZVxuXG4gIGxldCB0b19zZXF1ZW5jZSA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCA9XG4gICAgVHJlZTAudG9fc2VxdWVuY2UgdC5jb21wYXJhdG9yID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0LnRyZWVcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2ID0gVHJlZTAuYmluYXJ5X3NlYXJjaCB0LnRyZWUgfmNvbXBhcmUgaG93IHZcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIFRyZWUwLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQudHJlZSB+c2VnbWVudF9vZiBob3dcbiAgOztcblxuICBsZXQgbWVyZ2VfdG9fc2VxdWVuY2UgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQgdCcgPVxuICAgIFRyZWUwLm1lcmdlX3RvX3NlcXVlbmNlXG4gICAgICB0LmNvbXBhcmF0b3JcbiAgICAgID9vcmRlclxuICAgICAgP2dyZWF0ZXJfb3JfZXF1YWxfdG9cbiAgICAgID9sZXNzX29yX2VxdWFsX3RvXG4gICAgICB0LnRyZWVcbiAgICAgIHQnLnRyZWVcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX2RpcmVjdCBoYXNoX2ZvbGRfa2V5IHN0YXRlIHQgPVxuICAgIFRyZWUwLmhhc2hfZm9sZF90X2lnbm9yaW5nX3N0cnVjdHVyZSBoYXNoX2ZvbGRfa2V5IHN0YXRlIHQudHJlZVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgQWNjZXNzb3JzXG5cbmxldCBjb21wYXJlIF8gXyB0MSB0MiA9IGNvbXBhcmVfZGlyZWN0IHQxIHQyXG5cbm1vZHVsZSBUcmVlID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnY29tcGFyYXRvcikgdCA9ICgnYSwgJ2NvbXBhcmF0b3IpIHRyZWVcblxuICBsZXQgY2UgY29tcGFyYXRvciA9IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3IgYV9vZl9zZXhwIHNleHAgPVxuICAgIFRyZWUwLnRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKSBhX29mX3NleHAgc2V4cFxuICA7O1xuXG4gIGxldCBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uID0gVHJlZTAuZW1wdHlcbiAgbGV0IGVtcHR5IH5jb21wYXJhdG9yOl8gPSBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uXG4gIGxldCBzaW5nbGV0b24gfmNvbXBhcmF0b3I6XyBlID0gVHJlZTAuc2luZ2xldG9uIGVcbiAgbGV0IGxlbmd0aCB0ID0gVHJlZTAubGVuZ3RoIHRcbiAgbGV0IGludmFyaWFudHMgfmNvbXBhcmF0b3IgdCA9IFRyZWUwLmludmFyaWFudHMgdCB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBpc19lbXB0eSB0ID0gVHJlZTAuaXNfZW1wdHkgdFxuICBsZXQgZWxlbWVudHMgdCA9IFRyZWUwLmVsZW1lbnRzIHRcbiAgbGV0IG1pbl9lbHQgdCA9IFRyZWUwLm1pbl9lbHQgdFxuICBsZXQgbWluX2VsdF9leG4gdCA9IFRyZWUwLm1pbl9lbHRfZXhuIHRcbiAgbGV0IG1heF9lbHQgdCA9IFRyZWUwLm1heF9lbHQgdFxuICBsZXQgbWF4X2VsdF9leG4gdCA9IFRyZWUwLm1heF9lbHRfZXhuIHRcbiAgbGV0IGNob29zZSB0ID0gVHJlZTAuY2hvb3NlIHRcbiAgbGV0IGNob29zZV9leG4gdCA9IFRyZWUwLmNob29zZV9leG4gdFxuICBsZXQgdG9fbGlzdCB0ID0gVHJlZTAudG9fbGlzdCB0XG4gIGxldCB0b19hcnJheSB0ID0gVHJlZTAudG9fYXJyYXkgdFxuICBsZXQgaXRlciB0IH5mID0gVHJlZTAuaXRlciB0IH5mXG4gIGxldCBleGlzdHMgdCB+ZiA9IFRyZWUwLmV4aXN0cyB0IH5mXG4gIGxldCBmb3JfYWxsIHQgfmYgPSBUcmVlMC5mb3JfYWxsIHQgfmZcbiAgbGV0IGNvdW50IHQgfmYgPSBUcmVlMC5jb3VudCB0IH5mXG4gIGxldCBzdW0gbSB0IH5mID0gVHJlZTAuc3VtIG0gdCB+ZlxuICBsZXQgZmluZCB0IH5mID0gVHJlZTAuZmluZCB0IH5mXG4gIGxldCBmaW5kX2V4biB0IH5mID0gVHJlZTAuZmluZF9leG4gdCB+ZlxuICBsZXQgZmluZF9tYXAgdCB+ZiA9IFRyZWUwLmZpbmRfbWFwIHQgfmZcbiAgbGV0IGZvbGQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGQgdCB+aW5pdCB+ZlxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF91bnRpbCB0IH5pbml0IH5mXG4gIGxldCBmb2xkX3JpZ2h0IHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3JpZ2h0IHQgfmluaXQgfmZcbiAgbGV0IG1hcCB+Y29tcGFyYXRvciB0IH5mID0gVHJlZTAubWFwIHQgfmYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgZmlsdGVyIH5jb21wYXJhdG9yIHQgfmYgPSBUcmVlMC5maWx0ZXIgdCB+ZiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBmaWx0ZXJfbWFwIH5jb21wYXJhdG9yIHQgfmYgPSBUcmVlMC5maWx0ZXJfbWFwIHQgfmYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgcGFydGl0aW9uX3RmIH5jb21wYXJhdG9yIHQgfmYgPSBUcmVlMC5wYXJ0aXRpb25fdGYgdCB+ZiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBpdGVyMiB+Y29tcGFyYXRvciBhIGIgfmYgPSBUcmVlMC5pdGVyMiBhIGIgfmYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgbWVtIH5jb21wYXJhdG9yIHQgYSA9IFRyZWUwLm1lbSB0IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgYWRkIH5jb21wYXJhdG9yIHQgYSA9IFRyZWUwLmFkZCB0IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgcmVtb3ZlIH5jb21wYXJhdG9yIHQgYSA9IFRyZWUwLnJlbW92ZSB0IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgdW5pb24gfmNvbXBhcmF0b3IgdDEgdDIgPSBUcmVlMC51bmlvbiB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBpbnRlciB+Y29tcGFyYXRvciB0MSB0MiA9IFRyZWUwLmludGVyIHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGRpZmYgfmNvbXBhcmF0b3IgdDEgdDIgPSBUcmVlMC5kaWZmIHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgfmNvbXBhcmF0b3IgdDEgdDIgPVxuICAgIFRyZWUwLnN5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgY29tcGFyZV9kaXJlY3QgfmNvbXBhcmF0b3IgdDEgdDIgPSBUcmVlMC5jb21wYXJlIChjZSBjb21wYXJhdG9yKSB0MSB0MlxuICBsZXQgZXF1YWwgfmNvbXBhcmF0b3IgdDEgdDIgPSBUcmVlMC5lcXVhbCB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBpc19zdWJzZXQgfmNvbXBhcmF0b3IgdCB+b2ZfID0gVHJlZTAuaXNfc3Vic2V0IHQgfm9mXyB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG5cbiAgbGV0IGFyZV9kaXNqb2ludCB+Y29tcGFyYXRvciB0MSB0MiA9XG4gICAgVHJlZTAuYXJlX2Rpc2pvaW50IHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgb2ZfbGlzdCB+Y29tcGFyYXRvciBsID0gVHJlZTAub2ZfbGlzdCBsIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IG9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIHMgPSBUcmVlMC5vZl9zZXF1ZW5jZSBzIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IG9mX2FycmF5IH5jb21wYXJhdG9yIGEgPSBUcmVlMC5vZl9hcnJheSBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhID1cbiAgICBUcmVlMC5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvcjpfIH5sZW4gfmYgPVxuICAgIFRyZWUwLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmZcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGEgPSBUcmVlMC5vZl9zb3J0ZWRfYXJyYXkgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCB1bmlvbl9saXN0IH5jb21wYXJhdG9yIGwgPSBUcmVlMC51bmlvbl9saXN0IGwgfnRvX3RyZWU6Rm4uaWQgfmNvbXBhcmF0b3JcblxuICBsZXQgc3RhYmxlX2RlZHVwX2xpc3QgfmNvbXBhcmF0b3IgeHMgPVxuICAgIFRyZWUwLnN0YWJsZV9kZWR1cF9saXN0IHhzIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgZ3JvdXBfYnkgfmNvbXBhcmF0b3IgdCB+ZXF1aXYgPSBUcmVlMC5ncm91cF9ieSB0IH5lcXVpdiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBzcGxpdCB+Y29tcGFyYXRvciB0IGEgPSBUcmVlMC5zcGxpdCB0IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgbnRoIHQgaSA9IFRyZWUwLm50aCB0IGlcbiAgbGV0IHJlbW92ZV9pbmRleCB+Y29tcGFyYXRvciB0IGkgPSBUcmVlMC5yZW1vdmVfaW5kZXggdCBpIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgXyB0ID0gVHJlZTAuc2V4cF9vZl90IHNleHBfb2ZfYSB0XG4gIGxldCB0b190cmVlIHQgPSB0XG4gIGxldCBvZl90cmVlIH5jb21wYXJhdG9yOl8gdCA9IHRcblxuICBsZXQgdG9fc2VxdWVuY2UgfmNvbXBhcmF0b3IgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQgPVxuICAgIFRyZWUwLnRvX3NlcXVlbmNlIGNvbXBhcmF0b3IgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHRcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB+Y29tcGFyYXRvcjpfIHQgfmNvbXBhcmUgaG93IHYgPSBUcmVlMC5iaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHZcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgfmNvbXBhcmF0b3I6XyB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgVHJlZTAuYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3dcbiAgOztcblxuICBsZXQgbWVyZ2VfdG9fc2VxdWVuY2UgfmNvbXBhcmF0b3IgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQgdCcgPVxuICAgIFRyZWUwLm1lcmdlX3RvX3NlcXVlbmNlIGNvbXBhcmF0b3IgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQgdCdcbiAgOztcblxuICBsZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG5cbiAgbW9kdWxlIE5hbWVkID0gc3RydWN0XG4gICAgaW5jbHVkZSBUcmVlMC5OYW1lZFxuXG4gICAgbGV0IGlzX3N1YnNldCB+Y29tcGFyYXRvciB0MSB+b2ZfOnQyID1cbiAgICAgIFRyZWUwLk5hbWVkLmlzX3N1YnNldFxuICAgICAgICB0MVxuICAgICAgICB+b2ZfOnQyXG4gICAgICAgIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgICAgICAgfnNleHBfb2ZfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5zZXhwX29mX3RcbiAgICA7O1xuXG4gICAgbGV0IGVxdWFsIH5jb21wYXJhdG9yIHQxIHQyID1cbiAgICAgIFRyZWUwLk5hbWVkLmVxdWFsXG4gICAgICAgIHQxXG4gICAgICAgIHQyXG4gICAgICAgIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgICAgICAgfnNleHBfb2ZfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5zZXhwX29mX3RcbiAgICA7O1xuICBlbmRcbmVuZFxuXG5tb2R1bGUgVXNpbmdfY29tcGFyYXRvciA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAoJ2VsdCwgJ2NtcCkgdCA9ICgnZWx0LCAnY21wKSB0XG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgdG9fdHJlZSB0ID0gdC50cmVlXG4gIGxldCBvZl90cmVlIH5jb21wYXJhdG9yIHRyZWUgPSB7IGNvbXBhcmF0b3I7IHRyZWUgfVxuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yIGFfb2Zfc2V4cCBzZXhwID1cbiAgICBvZl90cmVlXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLnRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuY29tcGFyZSBhX29mX3NleHAgc2V4cClcbiAgOztcblxuICBsZXQgZW1wdHkgfmNvbXBhcmF0b3IgPSB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5lbXB0eSB9XG5cbiAgbW9kdWxlIEVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKEVsdCA6IENvbXBhcmF0b3IuUzEpID0gc3RydWN0XG4gICAgbGV0IGVtcHR5ID0geyBjb21wYXJhdG9yID0gRWx0LmNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5lbXB0eSB9XG4gIGVuZFxuXG4gIGxldCBzaW5nbGV0b24gfmNvbXBhcmF0b3IgZSA9IHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLnNpbmdsZXRvbiBlIH1cblxuICBsZXQgdW5pb25fbGlzdCB+Y29tcGFyYXRvciBsID1cbiAgICBvZl90cmVlIH5jb21wYXJhdG9yIChUcmVlMC51bmlvbl9saXN0IH5jb21wYXJhdG9yIH50b190cmVlIGwpXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIGxldCB0cmVlID1cbiAgICAgIFRyZWUwLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICB7IGNvbXBhcmF0b3I7IHRyZWUgfVxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvciB+bGVuIH5mID1cbiAgICBvZl90cmVlIH5jb21wYXJhdG9yIChUcmVlMC5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mKVxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIE9yX2Vycm9yLk1vbmFkX2luZml4LihcbiAgICAgIFRyZWUwLm9mX3NvcnRlZF9hcnJheSBhcnJheSB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICAgID4+fCBmdW4gdHJlZSAtPiB7IGNvbXBhcmF0b3I7IHRyZWUgfSlcbiAgOztcblxuICBsZXQgb2ZfbGlzdCB+Y29tcGFyYXRvciBsID1cbiAgICB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5vZl9saXN0IGwgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH1cbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3IgcyA9XG4gICAgeyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAub2Zfc2VxdWVuY2UgcyB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfVxuICA7O1xuXG4gIGxldCBvZl9hcnJheSB+Y29tcGFyYXRvciBhID1cbiAgICB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5vZl9hcnJheSBhIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB9XG4gIDs7XG5cbiAgbGV0IHN0YWJsZV9kZWR1cF9saXN0IH5jb21wYXJhdG9yIHhzID1cbiAgICBUcmVlMC5zdGFibGVfZGVkdXBfbGlzdCB4cyB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgbWFwIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLm1hcCB0LnRyZWUgfmYgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH1cbiAgOztcblxuICBsZXQgZmlsdGVyX21hcCB+Y29tcGFyYXRvciB0IH5mID1cbiAgICB7IGNvbXBhcmF0b3JcbiAgICA7IHRyZWUgPSBUcmVlMC5maWx0ZXJfbWFwIHQudHJlZSB+ZiB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICB9XG4gIDs7XG5cbiAgbW9kdWxlIFRyZWUgPSBUcmVlXG5lbmRcblxudHlwZSAoJ2VsdCwgJ2NtcCkgY29tcGFyYXRvciA9XG4gIChtb2R1bGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0ID0gJ2VsdCBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSAnY21wKVxuXG5sZXQgY29tcGFyYXRvcl9zICh0eXBlIGsgY21wKSB0IDogKGssIGNtcCkgY29tcGFyYXRvciA9XG4gIChtb2R1bGUgc3RydWN0XG4gICAgdHlwZSB0ID0ga1xuICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gY21wXG5cbiAgICBsZXQgY29tcGFyYXRvciA9IHQuY29tcGFyYXRvclxuICBlbmQpXG47O1xuXG5sZXQgdG9fY29tcGFyYXRvciAodHlwZSBlbHQgY21wKSAoKG1vZHVsZSBNKSA6IChlbHQsIGNtcCkgY29tcGFyYXRvcikgPSBNLmNvbXBhcmF0b3JcbmxldCBlbXB0eSBtID0gVXNpbmdfY29tcGFyYXRvci5lbXB0eSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKVxubGV0IHNpbmdsZXRvbiBtIGEgPSBVc2luZ19jb21wYXJhdG9yLnNpbmdsZXRvbiB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgdW5pb25fbGlzdCBtIGEgPSBVc2luZ19jb21wYXJhdG9yLnVuaW9uX2xpc3QgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuXG5sZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBtIGEgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuOztcblxubGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIG0gfmxlbiB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgfmxlbiB+ZlxuOztcblxubGV0IG9mX3NvcnRlZF9hcnJheSBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2ZfbGlzdCBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2xpc3QgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX3NlcXVlbmNlIG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX2FycmF5IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYXJyYXkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuXG5sZXQgc3RhYmxlX2RlZHVwX2xpc3QgbSBhID1cbiAgVXNpbmdfY29tcGFyYXRvci5zdGFibGVfZGVkdXBfbGlzdCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG47O1xuXG5sZXQgbWFwIG0gYSB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGEgfmZcbmxldCBmaWx0ZXJfbWFwIG0gYSB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IuZmlsdGVyX21hcCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhIH5mXG5cbm1vZHVsZSBNIChFbHQgOiBzaWdcbiAgICB0eXBlIHRcbiAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlIG5vbnJlYyB0ID0gKEVsdC50LCBFbHQuY29tcGFyYXRvcl93aXRuZXNzKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgW0BAQGVuZF1cblxuICBpbmNsdWRlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA6PSB0XG5lbmRcblxubW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgQ29tcGFyZV9tID0gc2lnIGVuZFxubW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcbm1vZHVsZSB0eXBlIEhhc2hfZm9sZF9tID0gSGFzaGVyLlNcblxubGV0IHNleHBfb2ZfbV9fdCAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gZWx0KSB0ID1cbiAgc2V4cF9vZl90IEVsdC5zZXhwX29mX3QgKGZ1biBfIC0+IFNleHAuQXRvbSBcIl9cIikgdFxuOztcblxubGV0IG1fX3Rfb2Zfc2V4cFxuICAgICAgKHR5cGUgZWx0IGNtcClcbiAgICAgIChtb2R1bGUgRWx0IDogTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gZWx0IGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IGNtcClcbiAgICAgIHNleHBcbiAgPVxuICBVc2luZ19jb21wYXJhdG9yLnRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3I6RWx0LmNvbXBhcmF0b3IgRWx0LnRfb2Zfc2V4cCBzZXhwXG47O1xuXG5sZXQgbV9fdF9zZXhwX2dyYW1tYXIgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gZWx0KVxuICA6IChlbHQsIF8pIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChsaXN0X3NleHBfZ3JhbW1hciBFbHQudF9zZXhwX2dyYW1tYXIpXG47O1xuXG5sZXQgY29tcGFyZV9tX190IChtb2R1bGUgXyA6IENvbXBhcmVfbSkgdDEgdDIgPSBjb21wYXJlX2RpcmVjdCB0MSB0MlxubGV0IGVxdWFsX21fX3QgKG1vZHVsZSBfIDogRXF1YWxfbSkgdDEgdDIgPSBlcXVhbCB0MSB0MlxuXG5sZXQgaGFzaF9mb2xkX21fX3QgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IEhhc2hfZm9sZF9tIHdpdGggdHlwZSB0ID0gZWx0KSBzdGF0ZSA9XG4gIGhhc2hfZm9sZF9kaXJlY3QgRWx0Lmhhc2hfZm9sZF90IHN0YXRlXG47O1xuXG5sZXQgaGFzaF9tX190IGZvbGRlciB0ID1cbiAgbGV0IHN0YXRlID0gaGFzaF9mb2xkX21fX3QgZm9sZGVyIChIYXNoLmNyZWF0ZSAoKSkgdCBpblxuICBIYXNoLmdldF9oYXNoX3ZhbHVlIHN0YXRlXG47O1xuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgdHlwZSBub25yZWMgKCdlbHQsICdjbXApIHNldCA9ICgnZWx0LCBjb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgdHlwZSBub25yZWMgJ2VsdCB0ID0gKCdlbHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICB0eXBlIG5vbnJlYyAnZWx0IHRyZWUgPSAoJ2VsdCwgY29tcGFyYXRvcl93aXRuZXNzKSB0cmVlXG4gIHR5cGUgbm9ucmVjICdlbHQgbmFtZWQgPSAoJ2VsdCwgY29tcGFyYXRvcl93aXRuZXNzKSBOYW1lZC50XG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgY29tcGFyYXRvciA9IENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yXG5cbiAgaW5jbHVkZSBVc2luZ19jb21wYXJhdG9yLkVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKENvbXBhcmF0b3IuUG9seSlcblxuICBsZXQgc2luZ2xldG9uIGEgPSBVc2luZ19jb21wYXJhdG9yLnNpbmdsZXRvbiB+Y29tcGFyYXRvciBhXG4gIGxldCB1bmlvbl9saXN0IGEgPSBVc2luZ19jb21wYXJhdG9yLnVuaW9uX2xpc3QgfmNvbXBhcmF0b3IgYVxuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGEgPVxuICAgIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgPVxuICAgIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3IgfmxlbiB+ZlxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2xpc3QgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfbGlzdCB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9zZXF1ZW5jZSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hcnJheSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hcnJheSB+Y29tcGFyYXRvciBhXG4gIGxldCBzdGFibGVfZGVkdXBfbGlzdCBhID0gVXNpbmdfY29tcGFyYXRvci5zdGFibGVfZGVkdXBfbGlzdCB+Y29tcGFyYXRvciBhXG4gIGxldCBtYXAgYSB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwIH5jb21wYXJhdG9yIGEgfmZcbiAgbGV0IGZpbHRlcl9tYXAgYSB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IuZmlsdGVyX21hcCB+Y29tcGFyYXRvciBhIH5mXG4gIGxldCBvZl90cmVlIHRyZWUgPSB7IGNvbXBhcmF0b3I7IHRyZWUgfVxuICBsZXQgdG9fdHJlZSB0ID0gdC50cmVlXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG5pbmNsdWRlIChcbnN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSByZWYgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9IGNvbXBhcmVfcmVmXG4gIGxldCBlcXVhbCA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGJvb2wgPSBlcXVhbF9yZWZcbiAgbGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9IHJlZl9vZl9zZXhwXG4gIGxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPSBzZXhwX29mX3JlZlxuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gcmVmX3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZCA6XG5zaWdcbiAgdHlwZSAnYSB0ID0gJ2EgcmVmIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5FcXVhbC5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIGluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuZW5kKVxuXG4oKiBJbiB0aGUgZGVmaW5pdGlvbiBvZiBbdF0sIHdlIGRvIG5vdCBoYXZlIFtbQEBkZXJpdmluZyBjb21wYXJlLCBzZXhwXV0gYmVjYXVzZVxuICAgaW4gZ2VuZXJhbCwgc3ludGF4IGV4dGVuc2lvbnMgdGVuZCB0byB1c2UgdGhlIGltcGxlbWVudGF0aW9uIHdoZW4gYXZhaWxhYmxlIHJhdGhlciB0aGFuXG4gICB1c2luZyB0aGUgYWxpYXMuICBIZXJlIHRoYXQgd291bGQgbGVhZCB0byB1c2UgdGhlIHJlY29yZCByZXByZXNlbnRhdGlvbiBbIHsgbXV0YWJsZVxuICAgY29udGVudHMgOiAnYSB9IF0gd2hpY2ggd291bGQgcmVzdWx0IGluIGRpZmZlcmVudCAoYW5kIHVud2FudGVkKSBiZWhhdmlvci4gICopXG50eXBlICdhIHQgPSAnYSByZWYgPSB7IG11dGFibGUgY29udGVudHMgOiAnYSB9XG5cbmV4dGVybmFsIGNyZWF0ZSA6ICdhIC0+ICdhIHQgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCAoICEgKSA6ICdhIHQgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuZXh0ZXJuYWwgKCA6PSApIDogJ2EgdCAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcblxubGV0IHN3YXAgdDEgdDIgPVxuICBsZXQgdG1wID0gIXQxIGluXG4gIHQxIDo9ICF0MjtcbiAgdDIgOj0gdG1wXG47O1xuXG5sZXQgcmVwbGFjZSB0IGYgPSB0IDo9IGYgIXRcblxubGV0IHNldF90ZW1wb3JhcmlseSB0IGEgfmYgPVxuICBsZXQgcmVzdG9yZV90byA9ICF0IGluXG4gIHQgOj0gYTtcbiAgRXhuLnByb3RlY3QgfmYgfmZpbmFsbHk6KGZ1biAoKSAtPiB0IDo9IHJlc3RvcmVfdG8pXG47O1xuXG5tb2R1bGUgQW5kX3ZhbHVlID0gc3RydWN0XG4gIHR5cGUgdCA9IFQgOiAnYSByZWYgKiAnYSAtPiB0IFtAQGRlcml2aW5nIHNleHBfb2ZdXG5cbiAgbGV0IHNldCAoVCAociwgYSkpID0gciA6PSBhXG4gIGxldCBzZXRzIHRzID0gTGlzdC5pdGVyIHRzIH5mOnNldFxuICBsZXQgc25hcHNob3QgKFQgKHIsIF8pKSA9IFQgKHIsICFyKVxuICBsZXQgc25hcHNob3RzIHRzID0gTGlzdC5tYXAgdHMgfmY6c25hcHNob3RcbmVuZFxuXG5sZXQgc2V0c190ZW1wb3JhcmlseSBhbmRfdmFsdWVzIH5mID1cbiAgbGV0IHJlc3RvcmVfdG8gPSBBbmRfdmFsdWUuc25hcHNob3RzIGFuZF92YWx1ZXMgaW5cbiAgQW5kX3ZhbHVlLnNldHMgYW5kX3ZhbHVlcztcbiAgRXhuLnByb3RlY3QgfmYgfmZpbmFsbHk6KGZ1biAoKSAtPiBBbmRfdmFsdWUuc2V0cyByZXN0b3JlX3RvKVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5cbigqIFt0XSBzdG9yZXMgdGhlIFt0Lmxlbmd0aF0gcXVldWUgZWxlbWVudHMgYXQgY29uc2VjdXRpdmUgaW5jcmVhc2luZyBpbmRpY2VzIG9mIFt0LmVsdHNdLFxuICAgbW9kIHRoZSBjYXBhY2l0eSBvZiBbdF0sIHdoaWNoIGlzIFtPcHRpb25fYXJyYXkubGVuZ3RoIHQuZWx0c10uICBUaGUgY2FwYWNpdHkgaXNcbiAgIHJlcXVpcmVkIHRvIGJlIGEgcG93ZXIgb2YgdHdvICh1c2VyLXJlcXVlc3RlZCBjYXBhY2l0aWVzIGFyZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0XG4gICBwb3dlciksIHNvIHRoYXQgbW9kIGNhbiBxdWlja2x5IGJlIGNvbXB1dGVkIHVzaW5nIFtsYW5kIHQubWFza10sIHdoZXJlIFt0Lm1hc2sgPVxuICAgY2FwYWNpdHkgdCAtIDFdLiAgU28sIHF1ZXVlIGVsZW1lbnQgW2ldIGlzIGF0IFt0LmVsdHMuKCAodC5mcm9udCArIGkpIGxhbmQgdC5tYXNrICldLlxuXG4gICBbbnVtX211dGF0aW9uc10gaXMgdXNlZCB0byBkZXRlY3QgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uICopXG50eXBlICdhIHQgPVxuICB7IG11dGFibGUgbnVtX211dGF0aW9ucyA6IGludFxuICA7IG11dGFibGUgZnJvbnQgOiBpbnRcbiAgOyBtdXRhYmxlIG1hc2sgOiBpbnRcbiAgOyBtdXRhYmxlIGxlbmd0aCA6IGludFxuICA7IG11dGFibGUgZWx0cyA6ICdhIE9wdGlvbl9hcnJheS50XG4gIH1cbltAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgZnVuIF9vZl9hX18wMDFfXG4gICAgeyBudW1fbXV0YXRpb25zID0gbnVtX211dGF0aW9uc19fMDAzX1xuICAgIDsgZnJvbnQgPSBmcm9udF9fMDA1X1xuICAgIDsgbWFzayA9IG1hc2tfXzAwN19cbiAgICA7IGxlbmd0aCA9IGxlbmd0aF9fMDA5X1xuICAgIDsgZWx0cyA9IGVsdHNfXzAxMV9cbiAgICB9IC0+XG4gICAgbGV0IGJuZHNfXzAwMl8gPSBbXSBpblxuICAgIGxldCBibmRzX18wMDJfID1cbiAgICAgIGxldCBhcmdfXzAxMl8gPSBPcHRpb25fYXJyYXkuc2V4cF9vZl90IF9vZl9hX18wMDFfIGVsdHNfXzAxMV8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImVsdHNcIjsgYXJnX18wMTJfIF0gOjogYm5kc19fMDAyX1xuICAgIGluXG4gICAgbGV0IGJuZHNfXzAwMl8gPVxuICAgICAgbGV0IGFyZ19fMDEwXyA9IHNleHBfb2ZfaW50IGxlbmd0aF9fMDA5XyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwibGVuZ3RoXCI7IGFyZ19fMDEwXyBdIDo6IGJuZHNfXzAwMl9cbiAgICBpblxuICAgIGxldCBibmRzX18wMDJfID1cbiAgICAgIGxldCBhcmdfXzAwOF8gPSBzZXhwX29mX2ludCBtYXNrX18wMDdfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJtYXNrXCI7IGFyZ19fMDA4XyBdIDo6IGJuZHNfXzAwMl9cbiAgICBpblxuICAgIGxldCBibmRzX18wMDJfID1cbiAgICAgIGxldCBhcmdfXzAwNl8gPSBzZXhwX29mX2ludCBmcm9udF9fMDA1XyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiZnJvbnRcIjsgYXJnX18wMDZfIF0gOjogYm5kc19fMDAyX1xuICAgIGluXG4gICAgbGV0IGJuZHNfXzAwMl8gPVxuICAgICAgbGV0IGFyZ19fMDA0XyA9IHNleHBfb2ZfaW50IG51bV9tdXRhdGlvbnNfXzAwM18gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIm51bV9tdXRhdGlvbnNcIjsgYXJnX18wMDRfIF0gOjogYm5kc19fMDAyX1xuICAgIGluXG4gICAgU2V4cGxpYjAuU2V4cC5MaXN0IGJuZHNfXzAwMl9cbjs7XG5cbltAQEBlbmRdXG5cbm1vZHVsZSB0eXBlIFMgPSBRdWV1ZV9pbnRmLlNcblxubGV0IGluY19udW1fbXV0YXRpb25zIHQgPSB0Lm51bV9tdXRhdGlvbnMgPC0gdC5udW1fbXV0YXRpb25zICsgMVxubGV0IGNhcGFjaXR5IHQgPSB0Lm1hc2sgKyAxXG5sZXQgZWx0c19pbmRleCB0IGkgPSAodC5mcm9udCArIGkpIGxhbmQgdC5tYXNrXG5sZXQgdW5zYWZlX2dldCB0IGkgPSBPcHRpb25fYXJyYXkudW5zYWZlX2dldF9zb21lX2V4biB0LmVsdHMgKGVsdHNfaW5kZXggdCBpKVxubGV0IHVuc2FmZV9pc19zZXQgdCBpID0gT3B0aW9uX2FycmF5LnVuc2FmZV9pc19zb21lIHQuZWx0cyAoZWx0c19pbmRleCB0IGkpXG5sZXQgdW5zYWZlX3NldCB0IGkgYSA9IE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X3NvbWUgdC5lbHRzIChlbHRzX2luZGV4IHQgaSkgYVxubGV0IHVuc2FmZV91bnNldCB0IGkgPSBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9ub25lIHQuZWx0cyAoZWx0c19pbmRleCB0IGkpXG5cbmxldCBjaGVja19pbmRleF9leG4gdCBpID1cbiAgaWYgaSA8IDAgfHwgaSA+PSB0Lmxlbmd0aFxuICB0aGVuXG4gICAgRXJyb3IucmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJRdWV1ZSBpbmRleCBvdXQgb2YgYm91bmRzXCJcbiAgICAgICAgIFsgXCJpbmRleFwiLCBpIHw+IEludC5zZXhwX29mX3Q7IFwibGVuZ3RoXCIsIHQubGVuZ3RoIHw+IEludC5zZXhwX29mX3QgXSlcbjs7XG5cbmxldCBnZXQgdCBpID1cbiAgY2hlY2tfaW5kZXhfZXhuIHQgaTtcbiAgdW5zYWZlX2dldCB0IGlcbjs7XG5cbmxldCBzZXQgdCBpIGEgPVxuICBjaGVja19pbmRleF9leG4gdCBpO1xuICBpbmNfbnVtX211dGF0aW9ucyB0O1xuICB1bnNhZmVfc2V0IHQgaSBhXG47O1xuXG5sZXQgaXNfZW1wdHkgdCA9IHQubGVuZ3RoID0gMFxubGV0IGxlbmd0aCB7IGxlbmd0aDsgXyB9ID0gbGVuZ3RoXG5cbmxldCBlbnN1cmVfbm9fbXV0YXRpb24gdCBudW1fbXV0YXRpb25zID1cbiAgaWYgdC5udW1fbXV0YXRpb25zIDw+IG51bV9tdXRhdGlvbnNcbiAgdGhlblxuICAgIEVycm9yLnJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwibXV0YXRpb24gb2YgcXVldWUgZHVyaW5nIGl0ZXJhdGlvblwiXG4gICAgICAgICBbIFwiXCIsIHQgfD4gc2V4cF9vZl90IChmdW4gXyAtPiBTZXhwLkF0b20gXCJfXCIpIF0pXG47O1xuXG5sZXQgY29tcGFyZSA9XG4gIGxldCByZWMgdW5zYWZlX2NvbXBhcmVfZnJvbSBjb21wYXJlX2VsdCBwb3MgfnQxIH50MiB+bGVuMSB+bGVuMiB+bXV0MSB+bXV0MiA9XG4gICAgbWF0Y2ggcG9zID0gbGVuMSwgcG9zID0gbGVuMiB3aXRoXG4gICAgfCB0cnVlLCB0cnVlIC0+IDBcbiAgICB8IHRydWUsIGZhbHNlIC0+IC0xXG4gICAgfCBmYWxzZSwgdHJ1ZSAtPiAxXG4gICAgfCBmYWxzZSwgZmFsc2UgLT5cbiAgICAgIGxldCB4ID0gY29tcGFyZV9lbHQgKHVuc2FmZV9nZXQgdDEgcG9zKSAodW5zYWZlX2dldCB0MiBwb3MpIGluXG4gICAgICBlbnN1cmVfbm9fbXV0YXRpb24gdDEgbXV0MTtcbiAgICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0MiBtdXQyO1xuICAgICAgKG1hdGNoIHggd2l0aFxuICAgICAgIHwgMCAtPiB1bnNhZmVfY29tcGFyZV9mcm9tIGNvbXBhcmVfZWx0IChwb3MgKyAxKSB+dDEgfnQyIH5sZW4xIH5sZW4yIH5tdXQxIH5tdXQyXG4gICAgICAgfCBuIC0+IG4pXG4gIGluXG4gIGZ1biBjb21wYXJlX2VsdCB0MSB0MiAtPlxuICAgIGlmIHBoeXNfZXF1YWwgdDEgdDJcbiAgICB0aGVuIDBcbiAgICBlbHNlXG4gICAgICB1bnNhZmVfY29tcGFyZV9mcm9tXG4gICAgICAgIGNvbXBhcmVfZWx0XG4gICAgICAgIDBcbiAgICAgICAgfnQxXG4gICAgICAgIH50MlxuICAgICAgICB+bGVuMTp0MS5sZW5ndGhcbiAgICAgICAgfmxlbjI6dDIubGVuZ3RoXG4gICAgICAgIH5tdXQxOnQxLm51bV9tdXRhdGlvbnNcbiAgICAgICAgfm11dDI6dDIubnVtX211dGF0aW9uc1xuOztcblxubGV0IGVxdWFsID1cbiAgbGV0IHJlYyB1bnNhZmVfZXF1YWxfZnJvbSBlcXVhbF9lbHQgcG9zIH50MSB+dDIgfm11dDEgfm11dDIgfmxlbiA9XG4gICAgcG9zID0gbGVuXG4gICAgfHxcbiAgICBsZXQgYiA9IGVxdWFsX2VsdCAodW5zYWZlX2dldCB0MSBwb3MpICh1bnNhZmVfZ2V0IHQyIHBvcykgaW5cbiAgICBlbnN1cmVfbm9fbXV0YXRpb24gdDEgbXV0MTtcbiAgICBlbnN1cmVfbm9fbXV0YXRpb24gdDIgbXV0MjtcbiAgICBiICYmIHVuc2FmZV9lcXVhbF9mcm9tIGVxdWFsX2VsdCAocG9zICsgMSkgfnQxIH50MiB+bXV0MSB+bXV0MiB+bGVuXG4gIGluXG4gIGZ1biBlcXVhbF9lbHQgdDEgdDIgLT5cbiAgICBwaHlzX2VxdWFsIHQxIHQyXG4gICAgfHxcbiAgICBsZXQgbGVuMSA9IHQxLmxlbmd0aCBpblxuICAgIGxldCBsZW4yID0gdDIubGVuZ3RoIGluXG4gICAgbGVuMSA9IGxlbjJcbiAgICAmJiB1bnNhZmVfZXF1YWxfZnJvbVxuICAgICAgICAgZXF1YWxfZWx0XG4gICAgICAgICAwXG4gICAgICAgICB+dDFcbiAgICAgICAgIH50MlxuICAgICAgICAgfmxlbjpsZW4xXG4gICAgICAgICB+bXV0MTp0MS5udW1fbXV0YXRpb25zXG4gICAgICAgICB+bXV0Mjp0Mi5udW1fbXV0YXRpb25zXG47O1xuXG5sZXQgaW52YXJpYW50IGludmFyaWFudF9hIHQgPVxuICBsZXQgeyBudW1fbXV0YXRpb25zOyBtYXNrID0gXzsgZWx0czsgZnJvbnQ7IGxlbmd0aCB9ID0gdCBpblxuICBhc3NlcnQgKGZyb250ID49IDApO1xuICBhc3NlcnQgKGZyb250IDwgY2FwYWNpdHkgdCk7XG4gIGxldCBjYXBhY2l0eSA9IGNhcGFjaXR5IHQgaW5cbiAgYXNzZXJ0IChjYXBhY2l0eSA9IE9wdGlvbl9hcnJheS5sZW5ndGggZWx0cyk7XG4gIGFzc2VydCAoY2FwYWNpdHkgPj0gMSk7XG4gIGFzc2VydCAoSW50LmlzX3BvdzIgY2FwYWNpdHkpO1xuICBhc3NlcnQgKGxlbmd0aCA+PSAwKTtcbiAgYXNzZXJ0IChsZW5ndGggPD0gY2FwYWNpdHkpO1xuICBmb3IgaSA9IDAgdG8gY2FwYWNpdHkgLSAxIGRvXG4gICAgaWYgaSA8IHQubGVuZ3RoXG4gICAgdGhlbiAoXG4gICAgICBpbnZhcmlhbnRfYSAodW5zYWZlX2dldCB0IGkpO1xuICAgICAgZW5zdXJlX25vX211dGF0aW9uIHQgbnVtX211dGF0aW9ucylcbiAgICBlbHNlIGFzc2VydCAobm90ICh1bnNhZmVfaXNfc2V0IHQgaSkpXG4gIGRvbmVcbjs7XG5cbmxldCBjcmVhdGUgKHR5cGUgYSkgP2NhcGFjaXR5ICgpIDogYSB0ID1cbiAgbGV0IGNhcGFjaXR5ID1cbiAgICBtYXRjaCBjYXBhY2l0eSB3aXRoXG4gICAgfCBOb25lIC0+IDFcbiAgICB8IFNvbWUgY2FwYWNpdHkgLT5cbiAgICAgIGlmIGNhcGFjaXR5IDwgMFxuICAgICAgdGhlblxuICAgICAgICBFcnJvci5yYWlzZV9zXG4gICAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICAgIFwiY2Fubm90IGhhdmUgcXVldWUgd2l0aCBuZWdhdGl2ZSBjYXBhY2l0eVwiXG4gICAgICAgICAgICAgWyBcImNhcGFjaXR5XCIsIGNhcGFjaXR5IHw+IEludC5zZXhwX29mX3QgXSlcbiAgICAgIGVsc2UgaWYgY2FwYWNpdHkgPSAwXG4gICAgICB0aGVuIDFcbiAgICAgIGVsc2UgSW50LmNlaWxfcG93MiBjYXBhY2l0eVxuICBpblxuICB7IG51bV9tdXRhdGlvbnMgPSAwXG4gIDsgZnJvbnQgPSAwXG4gIDsgbWFzayA9IGNhcGFjaXR5IC0gMVxuICA7IGxlbmd0aCA9IDBcbiAgOyBlbHRzID0gT3B0aW9uX2FycmF5LmNyZWF0ZSB+bGVuOmNhcGFjaXR5XG4gIH1cbjs7XG5cbmxldCBibGl0X3RvX2FycmF5IH5zcmMgZHN0ID1cbiAgYXNzZXJ0IChzcmMubGVuZ3RoIDw9IE9wdGlvbl9hcnJheS5sZW5ndGggZHN0KTtcbiAgbGV0IGZyb250X2xlbiA9IEludC5taW4gc3JjLmxlbmd0aCAoY2FwYWNpdHkgc3JjIC0gc3JjLmZyb250KSBpblxuICBsZXQgcmVzdF9sZW4gPSBzcmMubGVuZ3RoIC0gZnJvbnRfbGVuIGluXG4gIE9wdGlvbl9hcnJheS5ibGl0IH5sZW46ZnJvbnRfbGVuIH5zcmM6c3JjLmVsdHMgfnNyY19wb3M6c3JjLmZyb250IH5kc3QgfmRzdF9wb3M6MDtcbiAgT3B0aW9uX2FycmF5LmJsaXQgfmxlbjpyZXN0X2xlbiB+c3JjOnNyYy5lbHRzIH5zcmNfcG9zOjAgfmRzdCB+ZHN0X3Bvczpmcm9udF9sZW5cbjs7XG5cbmxldCBzZXRfY2FwYWNpdHkgdCBkZXNpcmVkX2NhcGFjaXR5ID1cbiAgKCogV2UgYWxsb3cgYXJndW1lbnRzIGxlc3MgdGhhbiAxIHRvIFtzZXRfY2FwYWNpdHldLCBidXQgdHJhbnNsYXRlIHRoZW0gdG8gMSB0byBzaW1wbGlmeVxuICAgICB0aGUgY29kZSB0aGF0IHJlbGllcyBvbiB0aGUgYXJyYXkgbGVuZ3RoIGJlaW5nIGEgcG93ZXIgb2YgMi4gKilcbiAgaW5jX251bV9tdXRhdGlvbnMgdDtcbiAgbGV0IG5ld19jYXBhY2l0eSA9IEludC5jZWlsX3BvdzIgKG1heCAxIChtYXggZGVzaXJlZF9jYXBhY2l0eSB0Lmxlbmd0aCkpIGluXG4gIGlmIG5ld19jYXBhY2l0eSA8PiBjYXBhY2l0eSB0XG4gIHRoZW4gKFxuICAgIGxldCBkc3QgPSBPcHRpb25fYXJyYXkuY3JlYXRlIH5sZW46bmV3X2NhcGFjaXR5IGluXG4gICAgYmxpdF90b19hcnJheSB+c3JjOnQgZHN0O1xuICAgIHQuZnJvbnQgPC0gMDtcbiAgICB0Lm1hc2sgPC0gbmV3X2NhcGFjaXR5IC0gMTtcbiAgICB0LmVsdHMgPC0gZHN0KVxuOztcblxubGV0IGVucXVldWUgdCBhID1cbiAgaW5jX251bV9tdXRhdGlvbnMgdDtcbiAgaWYgdC5sZW5ndGggPSBjYXBhY2l0eSB0IHRoZW4gc2V0X2NhcGFjaXR5IHQgKDIgKiB0Lmxlbmd0aCk7XG4gIHVuc2FmZV9zZXQgdCB0Lmxlbmd0aCBhO1xuICB0Lmxlbmd0aCA8LSB0Lmxlbmd0aCArIDFcbjs7XG5cbmxldCBkZXF1ZXVlX25vbmVtcHR5IHQgPVxuICBpbmNfbnVtX211dGF0aW9ucyB0O1xuICBsZXQgZWx0cyA9IHQuZWx0cyBpblxuICBsZXQgZnJvbnQgPSB0LmZyb250IGluXG4gIGxldCByZXMgPSBPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIGVsdHMgZnJvbnQgaW5cbiAgT3B0aW9uX2FycmF5LnNldF9ub25lIGVsdHMgZnJvbnQ7XG4gIHQuZnJvbnQgPC0gZWx0c19pbmRleCB0IDE7XG4gIHQubGVuZ3RoIDwtIHQubGVuZ3RoIC0gMTtcbiAgcmVzXG47O1xuXG5sZXQgZGVxdWV1ZV9leG4gdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiByYWlzZSBDYW1sLlF1ZXVlLkVtcHR5IGVsc2UgZGVxdWV1ZV9ub25lbXB0eSB0XG5sZXQgZGVxdWV1ZSB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChkZXF1ZXVlX25vbmVtcHR5IHQpXG5sZXQgZnJvbnRfbm9uZW1wdHkgdCA9IE9wdGlvbl9hcnJheS51bnNhZmVfZ2V0X3NvbWVfZXhuIHQuZWx0cyB0LmZyb250XG5sZXQgbGFzdF9ub25lbXB0eSB0ID0gdW5zYWZlX2dldCB0ICh0Lmxlbmd0aCAtIDEpXG5sZXQgcGVlayB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChmcm9udF9ub25lbXB0eSB0KVxubGV0IHBlZWtfZXhuIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gcmFpc2UgQ2FtbC5RdWV1ZS5FbXB0eSBlbHNlIGZyb250X25vbmVtcHR5IHRcbmxldCBsYXN0IHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGxhc3Rfbm9uZW1wdHkgdClcbmxldCBsYXN0X2V4biB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIHJhaXNlIENhbWwuUXVldWUuRW1wdHkgZWxzZSBsYXN0X25vbmVtcHR5IHRcblxubGV0IGNsZWFyIHQgPVxuICBpbmNfbnVtX211dGF0aW9ucyB0O1xuICBpZiB0Lmxlbmd0aCA+IDBcbiAgdGhlbiAoXG4gICAgZm9yIGkgPSAwIHRvIHQubGVuZ3RoIC0gMSBkb1xuICAgICAgdW5zYWZlX3Vuc2V0IHQgaVxuICAgIGRvbmU7XG4gICAgdC5sZW5ndGggPC0gMDtcbiAgICB0LmZyb250IDwtIDApXG47O1xuXG5sZXQgYmxpdF90cmFuc2ZlciB+c3JjIH5kc3QgP2xlbiAoKSA9XG4gIGluY19udW1fbXV0YXRpb25zIHNyYztcbiAgaW5jX251bV9tdXRhdGlvbnMgZHN0O1xuICBsZXQgbGVuID1cbiAgICBtYXRjaCBsZW4gd2l0aFxuICAgIHwgTm9uZSAtPiBzcmMubGVuZ3RoXG4gICAgfCBTb21lIGxlbiAtPlxuICAgICAgaWYgbGVuIDwgMFxuICAgICAgdGhlblxuICAgICAgICBFcnJvci5yYWlzZV9zXG4gICAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICAgIFwiUXVldWUuYmxpdF90cmFuc2ZlcjogbmVnYXRpdmUgbGVuZ3RoXCJcbiAgICAgICAgICAgICBbIFwibGVuZ3RoXCIsIGxlbiB8PiBJbnQuc2V4cF9vZl90IF0pO1xuICAgICAgbWluIGxlbiBzcmMubGVuZ3RoXG4gIGluXG4gIGlmIGxlbiA+IDBcbiAgdGhlbiAoXG4gICAgc2V0X2NhcGFjaXR5IGRzdCAobWF4IChjYXBhY2l0eSBkc3QpIChkc3QubGVuZ3RoICsgbGVuKSk7XG4gICAgbGV0IGRzdF9zdGFydCA9IGRzdC5mcm9udCArIGRzdC5sZW5ndGggaW5cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgKCogVGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIHNpbXBseSBbZW5xdWV1ZSBkc3QgKGRlcXVldWVfbm9uZW1wdHkgc3JjKV0gKilcbiAgICAgIGxldCBzcmNfaSA9IChzcmMuZnJvbnQgKyBpKSBsYW5kIHNyYy5tYXNrIGluXG4gICAgICBsZXQgZHN0X2kgPSAoZHN0X3N0YXJ0ICsgaSkgbGFuZCBkc3QubWFzayBpblxuICAgICAgT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfc29tZVxuICAgICAgICBkc3QuZWx0c1xuICAgICAgICBkc3RfaVxuICAgICAgICAoT3B0aW9uX2FycmF5LnVuc2FmZV9nZXRfc29tZV9leG4gc3JjLmVsdHMgc3JjX2kpO1xuICAgICAgT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfbm9uZSBzcmMuZWx0cyBzcmNfaVxuICAgIGRvbmU7XG4gICAgZHN0Lmxlbmd0aCA8LSBkc3QubGVuZ3RoICsgbGVuO1xuICAgIHNyYy5mcm9udCA8LSAoc3JjLmZyb250ICsgbGVuKSBsYW5kIHNyYy5tYXNrO1xuICAgIHNyYy5sZW5ndGggPC0gc3JjLmxlbmd0aCAtIGxlbilcbjs7XG5cbmxldCBlbnF1ZXVlX2FsbCB0IGwgPVxuICAoKiBUcmF2ZXJzaW5nIHRoZSBsaXN0IHVwIGZyb250IHRvIGNvbXB1dGUgaXRzIGxlbmd0aCBpcyBwcm9iYWJseSAoYnV0IG5vdCBkZWZpbml0ZWx5KVxuICAgICBiZXR0ZXIgdGhhbiBkb3VibGluZyB0aGUgdW5kZXJseWluZyBhcnJheSBzaXplIHNldmVyYWwgdGltZXMgZm9yIGxhcmdlIHF1ZXVlcy4gKilcbiAgc2V0X2NhcGFjaXR5IHQgKEludC5tYXggKGNhcGFjaXR5IHQpICh0Lmxlbmd0aCArIExpc3QubGVuZ3RoIGwpKTtcbiAgTGlzdC5pdGVyIGwgfmY6KGZ1biB4IC0+IGVucXVldWUgdCB4KVxuOztcblxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIGlmIHQubGVuZ3RoID0gMFxuICB0aGVuIGluaXRcbiAgZWxzZSAoXG4gICAgbGV0IG51bV9tdXRhdGlvbnMgPSB0Lm51bV9tdXRhdGlvbnMgaW5cbiAgICBsZXQgciA9IHJlZiBpbml0IGluXG4gICAgZm9yIGkgPSAwIHRvIHQubGVuZ3RoIC0gMSBkb1xuICAgICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IHQgaSk7XG4gICAgICBlbnN1cmVfbm9fbXV0YXRpb24gdCBudW1fbXV0YXRpb25zXG4gICAgZG9uZTtcbiAgICAhcilcbjs7XG5cbmxldCBmb2xkaSB0IH5pbml0IH5mID1cbiAgbGV0IGkgPSByZWYgMCBpblxuICBmb2xkIHQgfmluaXQgfmY6KGZ1biBhY2MgYSAtPlxuICAgIGxldCBhY2MgPSBmICFpIGFjYyBhIGluXG4gICAgaSA6PSAhaSArIDE7XG4gICAgYWNjKVxuOztcblxuXG4oKiBbaXRlcl0gaXMgaW1wbGVtZW50ZWQgZGlyZWN0bHkgYmVjYXVzZSBpbXBsZW1lbnRpbmcgaXQgaW4gdGVybXMgb2YgW2ZvbGRdIGlzXG4gICBzbG93ZXIuICopXG5sZXQgaXRlciB0IH5mID1cbiAgbGV0IG51bV9tdXRhdGlvbnMgPSB0Lm51bV9tdXRhdGlvbnMgaW5cbiAgZm9yIGkgPSAwIHRvIHQubGVuZ3RoIC0gMSBkb1xuICAgIGYgKHVuc2FmZV9nZXQgdCBpKTtcbiAgICBlbnN1cmVfbm9fbXV0YXRpb24gdCBudW1fbXV0YXRpb25zXG4gIGRvbmVcbjs7XG5cbmxldCBpdGVyaSB0IH5mID1cbiAgbGV0IG51bV9tdXRhdGlvbnMgPSB0Lm51bV9tdXRhdGlvbnMgaW5cbiAgZm9yIGkgPSAwIHRvIHQubGVuZ3RoIC0gMSBkb1xuICAgIGYgaSAodW5zYWZlX2dldCB0IGkpO1xuICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0IG51bV9tdXRhdGlvbnNcbiAgZG9uZVxuOztcblxubGV0IHRvX2xpc3QgdCA9XG4gIGxldCByZXN1bHQgPSByZWYgW10gaW5cbiAgZm9yIGkgPSB0Lmxlbmd0aCAtIDEgZG93bnRvIDAgZG9cbiAgICByZXN1bHQgOj0gdW5zYWZlX2dldCB0IGkgOjogIXJlc3VsdFxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5tb2R1bGUgQyA9IEluZGV4ZWRfY29udGFpbmVyLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgZm9sZCA9IGZvbGRcbiAgICBsZXQgaXRlciA9IGBDdXN0b20gaXRlclxuICAgIGxldCBsZW5ndGggPSBgQ3VzdG9tIGxlbmd0aFxuICAgIGxldCBmb2xkaSA9IGBDdXN0b20gZm9sZGlcbiAgICBsZXQgaXRlcmkgPSBgQ3VzdG9tIGl0ZXJpXG4gIGVuZClcblxubGV0IGNvdW50ID0gQy5jb3VudFxubGV0IGV4aXN0cyA9IEMuZXhpc3RzXG5sZXQgZmluZCA9IEMuZmluZFxubGV0IGZpbmRfbWFwID0gQy5maW5kX21hcFxubGV0IGZvbGRfcmVzdWx0ID0gQy5mb2xkX3Jlc3VsdFxubGV0IGZvbGRfdW50aWwgPSBDLmZvbGRfdW50aWxcbmxldCBmb3JfYWxsID0gQy5mb3JfYWxsXG5sZXQgbWF4X2VsdCA9IEMubWF4X2VsdFxubGV0IG1lbSA9IEMubWVtXG5sZXQgbWluX2VsdCA9IEMubWluX2VsdFxubGV0IHN1bSA9IEMuc3VtXG5sZXQgY291bnRpID0gQy5jb3VudGlcbmxldCBleGlzdHNpID0gQy5leGlzdHNpXG5sZXQgZmluZF9tYXBpID0gQy5maW5kX21hcGlcbmxldCBmaW5kaSA9IEMuZmluZGlcbmxldCBmb3JfYWxsaSA9IEMuZm9yX2FsbGlcblxuXG4oKiBGb3IgW2NvbmNhdF9tYXBdLCBbZmlsdGVyX21hcF0sIGFuZCBbZmlsdGVyXSwgd2UgZG9uJ3QgY3JlYXRlIFt0X3Jlc3VsdF0gd2l0aCBbdF0nc1xuICAgY2FwYWNpdHkgYmVjYXVzZSB3ZSBoYXZlIG5vIGlkZWEgaG93IG1hbnkgZWxlbWVudHMgW3RfcmVzdWx0XSB3aWxsIHVsdGltYXRlbHkgaG9sZC4gKilcbmxldCBjb25jYXRfbWFwIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPiBMaXN0Lml0ZXIgKGYgYSkgfmY6KGZ1biBiIC0+IGVucXVldWUgdF9yZXN1bHQgYikpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGNvbmNhdF9tYXBpIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPiBMaXN0Lml0ZXIgKGYgaSBhKSB+ZjooZnVuIGIgLT4gZW5xdWV1ZSB0X3Jlc3VsdCBiKSk7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgZmlsdGVyX21hcCB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT5cbiAgICBtYXRjaCBmIGEgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBiIC0+IGVucXVldWUgdF9yZXN1bHQgYik7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgZmlsdGVyX21hcGkgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+XG4gICAgbWF0Y2ggZiBpIGEgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBiIC0+IGVucXVldWUgdF9yZXN1bHQgYik7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPiBpZiBmIGEgdGhlbiBlbnF1ZXVlIHRfcmVzdWx0IGEpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGZpbHRlcmkgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+IGlmIGYgaSBhIHRoZW4gZW5xdWV1ZSB0X3Jlc3VsdCBhKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBmaWx0ZXJfaW5wbGFjZSB0IH5mID1cbiAgbGV0IHQyID0gZmlsdGVyIHQgfmYgaW5cbiAgY2xlYXIgdDtcbiAgYmxpdF90cmFuc2ZlciB+c3JjOnQyIH5kc3Q6dCAoKVxuOztcblxubGV0IGZpbHRlcmlfaW5wbGFjZSB0IH5mID1cbiAgbGV0IHQyID0gZmlsdGVyaSB0IH5mIGluXG4gIGNsZWFyIHQ7XG4gIGJsaXRfdHJhbnNmZXIgfnNyYzp0MiB+ZHN0OnQgKClcbjs7XG5cbmxldCBjb3B5IHNyYyA9XG4gIGxldCBkc3QgPSBjcmVhdGUgfmNhcGFjaXR5OnNyYy5sZW5ndGggKCkgaW5cbiAgYmxpdF90b19hcnJheSB+c3JjIGRzdC5lbHRzO1xuICBkc3QubGVuZ3RoIDwtIHNyYy5sZW5ndGg7XG4gIGRzdFxuOztcblxubGV0IG9mX2xpc3QgbCA9XG4gICgqIFRyYXZlcnNpbmcgdGhlIGxpc3QgdXAgZnJvbnQgdG8gY29tcHV0ZSBpdHMgbGVuZ3RoIGlzIHByb2JhYmx5IChidXQgbm90IGRlZmluaXRlbHkpXG4gICAgIGJldHRlciB0aGFuIGRvdWJsaW5nIHRoZSB1bmRlcmx5aW5nIGFycmF5IHNpemUgc2V2ZXJhbCB0aW1lcyBmb3IgbGFyZ2UgcXVldWVzLiAqKVxuICBsZXQgdCA9IGNyZWF0ZSB+Y2FwYWNpdHk6KExpc3QubGVuZ3RoIGwpICgpIGluXG4gIExpc3QuaXRlciBsIH5mOihmdW4geCAtPiBlbnF1ZXVlIHQgeCk7XG4gIHRcbjs7XG5cbigqIFRoZSBxdWV1ZSBbdF0gcmV0dXJuZWQgYnkgW2NyZWF0ZV0gd2lsbCBoYXZlIFt0Lmxlbmd0aCA9IDBdLCBbdC5mcm9udCA9IDBdLCBhbmRcbiAgIFtjYXBhY2l0eSB0ID0gSW50LmNlaWxfcG93MiBsZW5dLiAgU28sIHdlIG9ubHkgaGF2ZSB0byBzZXQgW3QubGVuZ3RoXSB0byBbbGVuXSBhZnRlclxuICAgdGhlIGJsaXQgdG8gbWFpbnRhaW4gYWxsIHRoZSBpbnZhcmlhbnRzOiBbdC5sZW5ndGhdIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHNcbiAgIGluIHRoZSBxdWV1ZSwgW3QuZnJvbnRdIGlzIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcXVldWUsIGFuZFxuICAgW2NhcGFjaXR5IHQgPSBPcHRpb25fYXJyYXkubGVuZ3RoIHQuZWx0c10uICopXG5sZXQgaW5pdCBsZW4gfmYgPVxuICBpZiBsZW4gPCAwXG4gIHRoZW5cbiAgICBFcnJvci5yYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlIFwiUXVldWUuaW5pdDogbmVnYXRpdmUgbGVuZ3RoXCIgWyBcImxlbmd0aFwiLCBsZW4gfD4gSW50LnNleHBfb2ZfdCBdKTtcbiAgbGV0IHQgPSBjcmVhdGUgfmNhcGFjaXR5OmxlbiAoKSBpblxuICBhc3NlcnQgKE9wdGlvbl9hcnJheS5sZW5ndGggdC5lbHRzID49IGxlbik7XG4gIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfc29tZSB0LmVsdHMgaSAoZiBpKVxuICBkb25lO1xuICB0Lmxlbmd0aCA8LSBsZW47XG4gIHRcbjs7XG5cbmxldCBvZl9hcnJheSBhID0gaW5pdCAoQXJyYXkubGVuZ3RoIGEpIH5mOihBcnJheS51bnNhZmVfZ2V0IGEpXG5sZXQgdG9fYXJyYXkgdCA9IEFycmF5LmluaXQgdC5sZW5ndGggfmY6KGZ1biBpIC0+IHVuc2FmZV9nZXQgdCBpKVxuXG5sZXQgbWFwIHRhIH5mID1cbiAgbGV0IG51bV9tdXRhdGlvbnMgPSB0YS5udW1fbXV0YXRpb25zIGluXG4gIGxldCB0YiA9IGNyZWF0ZSB+Y2FwYWNpdHk6dGEubGVuZ3RoICgpIGluXG4gIHRiLmxlbmd0aCA8LSB0YS5sZW5ndGg7XG4gIGZvciBpID0gMCB0byB0YS5sZW5ndGggLSAxIGRvXG4gICAgbGV0IGIgPSBmICh1bnNhZmVfZ2V0IHRhIGkpIGluXG4gICAgZW5zdXJlX25vX211dGF0aW9uIHRhIG51bV9tdXRhdGlvbnM7XG4gICAgT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfc29tZSB0Yi5lbHRzIGkgYlxuICBkb25lO1xuICB0YlxuOztcblxubGV0IG1hcGkgdCB+ZiA9XG4gIGxldCBpID0gcmVmIDAgaW5cbiAgbWFwIHQgfmY6KGZ1biBhIC0+XG4gICAgbGV0IHJlc3VsdCA9IGYgIWkgYSBpblxuICAgIGkgOj0gIWkgKyAxO1xuICAgIHJlc3VsdClcbjs7XG5cbmxldCBzaW5nbGV0b24geCA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIGVucXVldWUgdCB4O1xuICB0XG47O1xuXG5sZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID0gdG9fbGlzdCB0IHw+IExpc3Quc2V4cF9vZl90IHNleHBfb2ZfYVxubGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCA9IExpc3QudF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwIHw+IG9mX2xpc3RcblxubGV0IHRfc2V4cF9ncmFtbWFyICh0eXBlIGEpIChncmFtbWFyIDogYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiBhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChMaXN0LnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IHxcblxuICBsZXQgdW5yZWFjaGFibGVfY29kZSA9IGZ1bmN0aW9uXG4gICAgfCAoXyA6IHQpIC0+IC5cbiAgOztcblxuICBsZXQgYWxsID0gW11cbiAgbGV0IGhhc2hfZm9sZF90IF8gdCA9IHVucmVhY2hhYmxlX2NvZGUgdFxuICBsZXQgaGFzaCA9IHVucmVhY2hhYmxlX2NvZGVcbiAgbGV0IGNvbXBhcmUgYSBfID0gdW5yZWFjaGFibGVfY29kZSBhXG4gIGxldCBzZXhwX29mX3QgPSB1bnJlYWNoYWJsZV9jb2RlXG4gIGxldCB0X29mX3NleHAgc2V4cCA9IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV90eXBlIFwiQmFzZS5Ob3RoaW5nLnRcIiBzZXhwXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IHsgdW50eXBlZCA9IFVuaW9uIFtdIH1cbiAgbGV0IHRvX3N0cmluZyA9IHVucmVhY2hhYmxlX2NvZGVcbiAgbGV0IG9mX3N0cmluZyAoXyA6IHN0cmluZykgPSBmYWlsd2l0aCBcIkJhc2UuTm90aGluZy5vZl9zdHJpbmc6IG5vdCBzdXBwb3J0ZWRcIlxuZW5kXG5cbmluY2x1ZGUgVFxuXG5pbmNsdWRlIElkZW50aWZpYWJsZS5NYWtlIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5Ob3RoaW5nXCJcbiAgZW5kKVxuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBDYW1sLk5hdGl2ZWludFxuaW5jbHVkZSBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IG5hdGl2ZWludCBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfbmF0aXZlaW50XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9uYXRpdmVpbnQgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKG5hdGl2ZWludF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9uYXRpdmVpbnQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gbmF0aXZlaW50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgY29tcGFyZSA9IE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuY29tcGFyZVxuICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gIGxldCBvZl9zdHJpbmcgPSBvZl9zdHJpbmdcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbm1vZHVsZSBDb252ID0gSW50X2NvbnZlcnNpb25zXG5pbmNsdWRlIENvbnYuTWFrZSAoVClcblxuaW5jbHVkZSBDb252Lk1ha2VfaGV4IChzdHJ1Y3RcbiAgICBvcGVuIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICAgIHR5cGUgdCA9IG5hdGl2ZWludCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKGNvbXBhcmVfbmF0aXZlaW50IDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIGhhc2hfZm9sZF9uYXRpdmVpbnRcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gaGFzaF9uYXRpdmVpbnQgaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gICAgbGV0IG5lZyA9IG5lZ1xuICAgIGxldCAoIDwgKSA9ICggPCApXG4gICAgbGV0IHRvX3N0cmluZyBpID0gUHJpbnRmLnNwcmludGYgXCIlbnhcIiBpXG4gICAgbGV0IG9mX3N0cmluZyBzID0gQ2FtbC5TY2FuZi5zc2NhbmYgcyBcIiVueFwiIEZuLmlkXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLk5hdGl2ZWludC5IZXhcIlxuICBlbmQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLk5hdGl2ZWludFwiXG4gIGVuZClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IG51bV9iaXRzID0gV29yZF9zaXplLm51bV9iaXRzIFdvcmRfc2l6ZS53b3JkX3NpemVcbmxldCBmbG9hdF9sb3dlcl9ib3VuZCA9IEZsb2F0MC5sb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfdXBwZXJfYm91bmQgPSBGbG9hdDAudXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5sZXQgc2hpZnRfcmlnaHQgPSBzaGlmdF9yaWdodFxubGV0IHNoaWZ0X2xlZnQgPSBzaGlmdF9sZWZ0XG5sZXQgYml0X25vdCA9IGxvZ25vdFxubGV0IGJpdF94b3IgPSBsb2d4b3JcbmxldCBiaXRfb3IgPSBsb2dvclxubGV0IGJpdF9hbmQgPSBsb2dhbmRcbmxldCBtaW5fdmFsdWUgPSBtaW5faW50XG5sZXQgbWF4X3ZhbHVlID0gbWF4X2ludFxubGV0IGFicyA9IGFic1xubGV0IHByZWQgPSBwcmVkXG5sZXQgc3VjYyA9IHN1Y2NcbmxldCByZW0gPSByZW1cbmxldCBuZWcgPSBuZWdcbmxldCBtaW51c19vbmUgPSBtaW51c19vbmVcbmxldCBvbmUgPSBvbmVcbmxldCB6ZXJvID0gemVyb1xubGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbmxldCBvZl9mbG9hdF91bmNoZWNrZWQgPSBvZl9mbG9hdFxuXG5sZXQgb2ZfZmxvYXQgZiA9XG4gIGlmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgZiBmbG9hdF9sb3dlcl9ib3VuZFxuICAmJiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIGYgZmxvYXRfdXBwZXJfYm91bmRcbiAgdGhlbiBvZl9mbG9hdCBmXG4gIGVsc2VcbiAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICBcIk5hdGl2ZWludC5vZl9mbG9hdDogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IGYpXG4gICAgICAoKVxuOztcblxubW9kdWxlIFBvdzIgPSBzdHJ1Y3RcbiAgb3BlbiEgSW1wb3J0XG4gIG9wZW4gTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4gIGxldCBub25fcG9zaXRpdmVfYXJndW1lbnQgKCkgPVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJhcmd1bWVudCBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlXCIgKClcbiAgOztcblxuICBsZXQgKCBsb3IgKSA9IENhbWwuTmF0aXZlaW50LmxvZ29yXG4gIGxldCAoIGxzciApID0gQ2FtbC5OYXRpdmVpbnQuc2hpZnRfcmlnaHRfbG9naWNhbFxuICBsZXQgKCBsYW5kICkgPSBDYW1sLk5hdGl2ZWludC5sb2dhbmRcblxuICAoKiogXCJjZWlsaW5nIHBvd2VyIG9mIDJcIiAtIExlYXN0IHBvd2VyIG9mIDIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBjZWlsX3BvdzIgKHggOiBuYXRpdmVpbnQpID1cbiAgICBpZiB4IDw9IDBuIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0gQ2FtbC5OYXRpdmVpbnQucHJlZCB4IGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICAoKiBUaGUgbmV4dCBsaW5lIGlzIHN1cGVyZmx1b3VzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXRcbiAgICAgICBhbnl3YXkgdGhhbiB0byBicmFuY2ggKilcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICBDYW1sLk5hdGl2ZWludC5zdWNjIHhcbiAgOztcblxuICAoKiogXCJmbG9vciBwb3dlciBvZiAyXCIgLSBMYXJnZXN0IHBvd2VyIG9mIDIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBmbG9vcl9wb3cyIHggPVxuICAgIGlmIHggPD0gMG4gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICBDYW1sLk5hdGl2ZWludC5zdWIgeCAoeCBsc3IgMSlcbiAgOztcblxuICBsZXQgaXNfcG93MiB4ID1cbiAgICBpZiB4IDw9IDBuIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIHggbGFuZCBDYW1sLk5hdGl2ZWludC5wcmVkIHggPSAwblxuICA7O1xuXG4gICgqIEMgc3R1YnMgZm9yIG5hdGl2ZWludCBjbHogYW5kIGN0eiB0byB1c2UgdGhlIENMWi9CU1IvQ1RaL0JTRiBpbnN0cnVjdGlvbiB3aGVyZSBwb3NzaWJsZSAqKVxuICBleHRlcm5hbCBjbHpcbiAgICA6ICAobmF0aXZlaW50W0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2NselwiIFwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY2x6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGN0elxuICAgIDogIChuYXRpdmVpbnRbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY3R6XCIgXCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jdHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgZmxvb3JfbG9nMiBpID1cbiAgICBpZiBQb2x5LiggPD0gKSBpIENhbWwuTmF0aXZlaW50Lnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJbTmF0aXZlaW50LmZsb29yX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCJcbiAgICAgICAgICAgWyBcIlwiLCBzZXhwX29mX25hdGl2ZWludCBpIF0pO1xuICAgIG51bV9iaXRzIC0gMSAtIGNseiBpXG4gIDs7XG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgY2VpbF9sb2cyIGkgPVxuICAgIGlmIFBvbHkuKCA8PSApIGkgQ2FtbC5OYXRpdmVpbnQuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIltOYXRpdmVpbnQuY2VpbF9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiXG4gICAgICAgICAgIFsgXCJcIiwgc2V4cF9vZl9uYXRpdmVpbnQgaSBdKTtcbiAgICBpZiBDYW1sLk5hdGl2ZWludC5lcXVhbCBpIENhbWwuTmF0aXZlaW50Lm9uZVxuICAgIHRoZW4gMFxuICAgIGVsc2UgbnVtX2JpdHMgLSBjbHogKENhbWwuTmF0aXZlaW50LnByZWQgaSlcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFBvdzJcblxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxubGV0ICggLyApID0gZGl2XG5sZXQgKCAqICkgPSBtdWxcbmxldCAoIC0gKSA9IHN1YlxubGV0ICggKyApID0gYWRkXG5sZXQgKCB+LSApID0gbmVnXG5sZXQgaW5jciByID0gciA6PSAhciArIG9uZVxubGV0IGRlY3IgciA9IHIgOj0gIXIgLSBvbmVcbmxldCBvZl9uYXRpdmVpbnQgdCA9IHRcbmxldCBvZl9uYXRpdmVpbnRfZXhuID0gb2ZfbmF0aXZlaW50XG5sZXQgdG9fbmF0aXZlaW50IHQgPSB0XG5sZXQgdG9fbmF0aXZlaW50X2V4biA9IHRvX25hdGl2ZWludFxubGV0IHBvcGNvdW50ID0gUG9wY291bnQubmF0aXZlaW50X3BvcGNvdW50XG5sZXQgb2ZfaW50ID0gQ29udi5pbnRfdG9fbmF0aXZlaW50XG5sZXQgb2ZfaW50X2V4biA9IG9mX2ludFxubGV0IHRvX2ludCA9IENvbnYubmF0aXZlaW50X3RvX2ludFxubGV0IHRvX2ludF9leG4gPSBDb252Lm5hdGl2ZWludF90b19pbnRfZXhuXG5sZXQgdG9faW50X3RydW5jID0gQ29udi5uYXRpdmVpbnRfdG9faW50X3RydW5jXG5sZXQgb2ZfaW50MzIgPSBDb252LmludDMyX3RvX25hdGl2ZWludFxubGV0IG9mX2ludDMyX2V4biA9IG9mX2ludDMyXG5sZXQgdG9faW50MzIgPSBDb252Lm5hdGl2ZWludF90b19pbnQzMlxubGV0IHRvX2ludDMyX2V4biA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyX2V4blxubGV0IHRvX2ludDMyX3RydW5jID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJfdHJ1bmNcbmxldCBvZl9pbnQ2NCA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50XG5sZXQgb2ZfaW50NjRfZXhuID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRfZXhuXG5sZXQgb2ZfaW50NjRfdHJ1bmMgPSBDb252LmludDY0X3RvX25hdGl2ZWludF90cnVuY1xubGV0IHRvX2ludDY0ID0gQ29udi5uYXRpdmVpbnRfdG9faW50NjRcbmxldCBwb3cgYiBlID0gb2ZfaW50X2V4biAoSW50X21hdGguUHJpdmF0ZS5pbnRfcG93ICh0b19pbnRfZXhuIGIpICh0b19pbnRfZXhuIGUpKVxubGV0ICggKiogKSBiIGUgPSBwb3cgYiBlXG5cbm1vZHVsZSBQcmVfTyA9IHN0cnVjdFxuICBsZXQgKCArICkgPSAoICsgKVxuICBsZXQgKCAtICkgPSAoIC0gKVxuICBsZXQgKCAqICkgPSAoICogKVxuICBsZXQgKCAvICkgPSAoIC8gKVxuICBsZXQgKCB+LSApID0gKCB+LSApXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIChOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIDogQ29tcGFyaXNvbnMuSW5maXggd2l0aCB0eXBlIHQgOj0gdClcblxuICBsZXQgYWJzID0gYWJzXG4gIGxldCBuZWcgPSBuZWdcbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnRfZXhuID0gb2ZfaW50X2V4blxuZW5kXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGluY2x1ZGUgUHJlX09cblxuICBpbmNsdWRlIEludF9tYXRoLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgaW5jbHVkZSBQcmVfT1xuXG4gICAgICBsZXQgcmVtID0gcmVtXG4gICAgICBsZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxuICAgICAgbGV0IG9mX2Zsb2F0ID0gb2ZfZmxvYXRcbiAgICAgIGxldCBvZl9zdHJpbmcgPSBULm9mX3N0cmluZ1xuICAgICAgbGV0IHRvX3N0cmluZyA9IFQudG9fc3RyaW5nXG4gICAgZW5kKVxuXG4gIGxldCAoIGxhbmQgKSA9IGJpdF9hbmRcbiAgbGV0ICggbG9yICkgPSBiaXRfb3JcbiAgbGV0ICggbHhvciApID0gYml0X3hvclxuICBsZXQgbG5vdCA9IGJpdF9ub3RcbiAgbGV0ICggbHNsICkgPSBzaGlmdF9sZWZ0XG4gIGxldCAoIGFzciApID0gc2hpZnRfcmlnaHRcbiAgbGV0ICggbHNyICkgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5lbmRcblxuaW5jbHVkZSBPXG5cbigqIFtOYXRpdmVpbnRdIGFuZCBbTmF0aXZlaW50Lk9dIGFncmVlIHZhbHVlLXdpc2UgKilcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuZXh0ZXJuYWwgYnN3YXAgOiB0IC0+IHQgPSBcIiVic3dhcF9uYXRpdmVcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUgQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAqKVxuKCogIGVuIEF1dG9tYXRpcXVlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCAgICAqKVxuKCogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBTZWUgLi4vVEhJUkQtUEFSVFkudHh0ICAqKVxuKCogIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuISBJbXBvcnRcbm1vZHVsZSBMaXN0ID0gTGlzdDBcbmluY2x1ZGUgTWFwX2ludGZcblxubW9kdWxlIEZpbmlzaGVkX29yX3VuZmluaXNoZWQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBNYXBfaW50Zi5GaW5pc2hlZF9vcl91bmZpbmlzaGVkXG5cbiAgKCogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdGVzdGVkIGluIFt0ZXN0X21hcC5tbF0gdG8gbWFrZSBzdXJlIG91ciB1c2Ugb2ZcbiAgICAgW0NhbWwuT2JqLm1hZ2ljXSBpcyBjb3JyZWN0IGFuZCBzYWZlLiAqKVxuICBsZXQgb2ZfY29udGludWVfb3Jfc3RvcCA6IENvbnRpbnVlX29yX3N0b3AudCAtPiB0ID0gQ2FtbC5PYmoubWFnaWNcbiAgbGV0IHRvX2NvbnRpbnVlX29yX3N0b3AgOiB0IC0+IENvbnRpbnVlX29yX3N0b3AudCA9IENhbWwuT2JqLm1hZ2ljXG5lbmRcblxubW9kdWxlIE1lcmdlX2VsZW1lbnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBNYXBfaW50Zi5NZXJnZV9lbGVtZW50XG5cbiAgbGV0IGxlZnQgPSBmdW5jdGlvblxuICAgIHwgYFJpZ2h0IF8gLT4gTm9uZVxuICAgIHwgYExlZnQgbGVmdCB8IGBCb3RoIChsZWZ0LCBfKSAtPiBTb21lIGxlZnRcbiAgOztcblxuICBsZXQgcmlnaHQgPSBmdW5jdGlvblxuICAgIHwgYExlZnQgXyAtPiBOb25lXG4gICAgfCBgUmlnaHQgcmlnaHQgfCBgQm90aCAoXywgcmlnaHQpIC0+IFNvbWUgcmlnaHRcbiAgOztcblxuICBsZXQgbGVmdF92YWx1ZSB0IH5kZWZhdWx0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IGBSaWdodCBfIC0+IGRlZmF1bHRcbiAgICB8IGBMZWZ0IGxlZnQgfCBgQm90aCAobGVmdCwgXykgLT4gbGVmdFxuICA7O1xuXG4gIGxldCByaWdodF92YWx1ZSB0IH5kZWZhdWx0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IGBMZWZ0IF8gLT4gZGVmYXVsdFxuICAgIHwgYFJpZ2h0IHJpZ2h0IHwgYEJvdGggKF8sIHJpZ2h0KSAtPiByaWdodFxuICA7O1xuXG4gIGxldCB2YWx1ZXMgdCB+bGVmdF9kZWZhdWx0IH5yaWdodF9kZWZhdWx0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IGBMZWZ0IGxlZnQgLT4gbGVmdCwgcmlnaHRfZGVmYXVsdFxuICAgIHwgYFJpZ2h0IHJpZ2h0IC0+IGxlZnRfZGVmYXVsdCwgcmlnaHRcbiAgICB8IGBCb3RoIChsZWZ0LCByaWdodCkgLT4gbGVmdCwgcmlnaHRcbiAgOztcbmVuZFxuXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxuXG5leGNlcHRpb24gRHVwbGljYXRlIFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG5sZXQgKCkgPVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGQgWyVleHRlbnNpb25fY29uc3RydWN0b3IgRHVwbGljYXRlXSAoZnVuY3Rpb25cbiAgICB8IER1cGxpY2F0ZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJtYXAubWwuRHVwbGljYXRlXCJcbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuOztcblxuW0BAQGVuZF1cblxubW9kdWxlIFRyZWUwID0gc3RydWN0XG4gIHR5cGUgKCdrLCAndikgdCA9XG4gICAgfCBFbXB0eVxuICAgIHwgTGVhZiBvZiAnayAqICd2XG4gICAgfCBOb2RlIG9mICgnaywgJ3YpIHQgKiAnayAqICd2ICogKCdrLCAndikgdCAqIGludFxuXG4gIHR5cGUgKCdrLCAndikgdHJlZSA9ICgnaywgJ3YpIHRcblxuICBsZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IDBcbiAgICB8IExlYWYgXyAtPiAxXG4gICAgfCBOb2RlIChfLCBfLCBfLCBfLCBoKSAtPiBoXG4gIDs7XG5cbiAgbGV0IGludmFyaWFudHMgPVxuICAgIGxldCBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2tleSBrID1cbiAgICAgIChtYXRjaCBsb3dlciB3aXRoXG4gICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgICB8IFNvbWUgbG93ZXIgLT4gY29tcGFyZV9rZXkgbG93ZXIgayA8IDApXG4gICAgICAmJlxuICAgICAgbWF0Y2ggdXBwZXIgd2l0aFxuICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgIHwgU29tZSB1cHBlciAtPiBjb21wYXJlX2tleSBrIHVwcGVyIDwgMFxuICAgIGluXG4gICAgbGV0IHJlYyBsb29wIGxvd2VyIHVwcGVyIGNvbXBhcmVfa2V5IHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHRydWVcbiAgICAgIHwgTGVhZiAoaywgXykgLT4gaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9rZXkga1xuICAgICAgfCBOb2RlIChsLCBrLCBfLCByLCBoKSAtPlxuICAgICAgICBsZXQgaGwgPSBoZWlnaHQgbFxuICAgICAgICBhbmQgaHIgPSBoZWlnaHQgciBpblxuICAgICAgICBhYnMgKGhsIC0gaHIpIDw9IDJcbiAgICAgICAgJiYgaCA9IG1heCBobCBociArIDFcbiAgICAgICAgJiYgaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9rZXkga1xuICAgICAgICAmJiBsb29wIGxvd2VyIChTb21lIGspIGNvbXBhcmVfa2V5IGxcbiAgICAgICAgJiYgbG9vcCAoU29tZSBrKSB1cHBlciBjb21wYXJlX2tleSByXG4gICAgaW5cbiAgICBmdW4gdCB+Y29tcGFyZV9rZXkgLT4gbG9vcCBOb25lIE5vbmUgY29tcGFyZV9rZXkgdFxuICA7O1xuXG4gICgqIHByZWNvbmRpdGlvbjogfGhlaWdodChsKSAtIGhlaWdodChyKXwgPD0gMiAqKVxuICBsZXQgY3JlYXRlIGwgeCBkIHIgPVxuICAgIGxldCBobCA9IGhlaWdodCBsXG4gICAgYW5kIGhyID0gaGVpZ2h0IHIgaW5cbiAgICBpZiBobCA9IDAgJiYgaHIgPSAwXG4gICAgdGhlbiBMZWFmICh4LCBkKVxuICAgIGVsc2UgTm9kZSAobCwgeCwgZCwgciwgaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpXG4gIDs7XG5cbiAgbGV0IHNpbmdsZXRvbiBrZXkgZGF0YSA9IExlYWYgKGtleSwgZGF0YSlcblxuICAoKiBXZSBtdXN0IGNhbGwgW2ZdIHdpdGggaW5jcmVhc2luZyBpbmRleGVzLCBiZWNhdXNlIHRoZSBiaW5fcHJvdCByZWFkZXIgaW5cbiAgICAgQ29yZS5NYXAgbmVlZHMgaXQuICopXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mID1cbiAgICBsZXQgcmVjIGxvb3AgbiB+ZiBpIDogKF8sIF8pIHQgPVxuICAgICAgbWF0Y2ggbiB3aXRoXG4gICAgICB8IDAgLT4gRW1wdHlcbiAgICAgIHwgMSAtPlxuICAgICAgICBsZXQgaywgdiA9IGYgaSBpblxuICAgICAgICBMZWFmIChrLCB2KVxuICAgICAgfCAyIC0+XG4gICAgICAgIGxldCBrbCwgdmwgPSBmIGkgaW5cbiAgICAgICAgbGV0IGssIHYgPSBmIChpICsgMSkgaW5cbiAgICAgICAgTm9kZSAoTGVhZiAoa2wsIHZsKSwgaywgdiwgRW1wdHksIDIpXG4gICAgICB8IDMgLT5cbiAgICAgICAgbGV0IGtsLCB2bCA9IGYgaSBpblxuICAgICAgICBsZXQgaywgdiA9IGYgKGkgKyAxKSBpblxuICAgICAgICBsZXQga3IsIHZyID0gZiAoaSArIDIpIGluXG4gICAgICAgIE5vZGUgKExlYWYgKGtsLCB2bCksIGssIHYsIExlYWYgKGtyLCB2ciksIDIpXG4gICAgICB8IG4gLT5cbiAgICAgICAgbGV0IGxlZnRfbGVuZ3RoID0gbiBsc3IgMSBpblxuICAgICAgICBsZXQgcmlnaHRfbGVuZ3RoID0gbiAtIGxlZnRfbGVuZ3RoIC0gMSBpblxuICAgICAgICBsZXQgbGVmdCA9IGxvb3AgbGVmdF9sZW5ndGggfmYgaSBpblxuICAgICAgICBsZXQgaywgdiA9IGYgKGkgKyBsZWZ0X2xlbmd0aCkgaW5cbiAgICAgICAgbGV0IHJpZ2h0ID0gbG9vcCByaWdodF9sZW5ndGggfmYgKGkgKyBsZWZ0X2xlbmd0aCArIDEpIGluXG4gICAgICAgIGNyZWF0ZSBsZWZ0IGsgdiByaWdodFxuICAgIGluXG4gICAgbG9vcCBsZW4gfmYgMFxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGFycmF5X2xlbmd0aCA9IEFycmF5Lmxlbmd0aCBhcnJheSBpblxuICAgIGxldCBuZXh0ID1cbiAgICAgIGlmIGFycmF5X2xlbmd0aCA8IDJcbiAgICAgICAgIHx8XG4gICAgICAgICBsZXQgazAsIF8gPSBhcnJheS4oMCkgaW5cbiAgICAgICAgIGxldCBrMSwgXyA9IGFycmF5LigxKSBpblxuICAgICAgICAgY29tcGFyZV9rZXkgazAgazEgPCAwXG4gICAgICB0aGVuIGZ1biBpIC0+IGFycmF5LihpKVxuICAgICAgZWxzZSBmdW4gaSAtPiBhcnJheS4oYXJyYXlfbGVuZ3RoIC0gMSAtIGkpXG4gICAgaW5cbiAgICBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuOmFycmF5X2xlbmd0aCB+ZjpuZXh0LCBhcnJheV9sZW5ndGhcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IGFycmF5IH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggYXJyYXkgd2l0aFxuICAgIHwgW3x8XSB8IFt8IF8gfF0gLT4gUmVzdWx0Lk9rIChvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2tleSlcbiAgICB8IF8gLT5cbiAgICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgICBsZXQgaW5jcmVhc2luZyA9XG4gICAgICAgICAgbWF0Y2ggY29tcGFyZV9rZXkgKGZzdCBhcnJheS4oMCkpIChmc3QgYXJyYXkuKDEpKSB3aXRoXG4gICAgICAgICAgfCAwIC0+IHIucmV0dXJuIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGR1cGxpY2F0ZWQgZWxlbWVudHNcIilcbiAgICAgICAgICB8IGkgLT4gaSA8IDBcbiAgICAgICAgaW5cbiAgICAgICAgZm9yIGkgPSAxIHRvIEFycmF5Lmxlbmd0aCBhcnJheSAtIDIgZG9cbiAgICAgICAgICBtYXRjaCBjb21wYXJlX2tleSAoZnN0IGFycmF5LihpKSkgKGZzdCBhcnJheS4oaSArIDEpKSB3aXRoXG4gICAgICAgICAgfCAwIC0+IHIucmV0dXJuIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGR1cGxpY2F0ZWQgZWxlbWVudHNcIilcbiAgICAgICAgICB8IGkgLT5cbiAgICAgICAgICAgIGlmIFBvbHkuKCA8PiApIChpIDwgMCkgaW5jcmVhc2luZ1xuICAgICAgICAgICAgdGhlblxuICAgICAgICAgICAgICByLnJldHVyblxuICAgICAgICAgICAgICAgIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGVsZW1lbnRzIGFyZSBub3Qgb3JkZXJlZFwiKVxuICAgICAgICBkb25lO1xuICAgICAgICBSZXN1bHQuT2sgKG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfa2V5KSlcbiAgOztcblxuICAoKiBwcmVjb25kaXRpb246IHxoZWlnaHQobCkgLSBoZWlnaHQocil8IDw9IDMgKilcbiAgbGV0IGJhbCBsIHggZCByID1cbiAgICBsZXQgaGwgPSBoZWlnaHQgbCBpblxuICAgIGxldCBociA9IGhlaWdodCByIGluXG4gICAgaWYgaGwgPiBociArIDJcbiAgICB0aGVuIChcbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlICgqIGhlaWdodChMZWFmKSA9IDEgJiYgMSBpcyBub3QgbGFyZ2VyIHRoYW4gaHIgKyAyICopXG4gICAgICB8IE5vZGUgKGxsLCBsdiwgbGQsIGxyLCBfKSAtPlxuICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVpZ2h0IGxyXG4gICAgICAgIHRoZW4gY3JlYXRlIGxsIGx2IGxkIChjcmVhdGUgbHIgeCBkIHIpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIGxyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgICAgfCBMZWFmIChscnYsIGxyZCkgLT4gY3JlYXRlIChjcmVhdGUgbGwgbHYgbGQgRW1wdHkpIGxydiBscmQgKGNyZWF0ZSBFbXB0eSB4IGQgcilcbiAgICAgICAgICB8IE5vZGUgKGxybCwgbHJ2LCBscmQsIGxyciwgXykgLT5cbiAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxkIGxybCkgbHJ2IGxyZCAoY3JlYXRlIGxyciB4IGQgcikpKVxuICAgIGVsc2UgaWYgaHIgPiBobCArIDJcbiAgICB0aGVuIChcbiAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlICgqIGhlaWdodChMZWFmKSA9IDEgJiYgMSBpcyBub3QgbGFyZ2VyIHRoYW4gaGwgKyAyICopXG4gICAgICB8IE5vZGUgKHJsLCBydiwgcmQsIHJyLCBfKSAtPlxuICAgICAgICBpZiBoZWlnaHQgcnIgPj0gaGVpZ2h0IHJsXG4gICAgICAgIHRoZW4gY3JlYXRlIChjcmVhdGUgbCB4IGQgcmwpIHJ2IHJkIHJyXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIHJsIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgICAgfCBMZWFmIChybHYsIHJsZCkgLT4gY3JlYXRlIChjcmVhdGUgbCB4IGQgRW1wdHkpIHJsdiBybGQgKGNyZWF0ZSBFbXB0eSBydiByZCBycilcbiAgICAgICAgICB8IE5vZGUgKHJsbCwgcmx2LCBybGQsIHJsciwgXykgLT5cbiAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgeCBkIHJsbCkgcmx2IHJsZCAoY3JlYXRlIHJsciBydiByZCBycikpKVxuICAgIGVsc2UgY3JlYXRlIGwgeCBkIHJcbiAgOztcblxuICBsZXQgZW1wdHkgPSBFbXB0eVxuXG4gIGxldCBpc19lbXB0eSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG4gIDs7XG5cbiAgbGV0IHJhaXNlX2tleV9hbHJlYWR5X3ByZXNlbnQgfmtleSB+c2V4cF9vZl9rZXkgPVxuICAgIEVycm9yLnJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2UgXCJbTWFwLmFkZF9leG5dIGdvdCBrZXkgYWxyZWFkeSBwcmVzZW50XCIgWyBcImtleVwiLCBrZXkgfD4gc2V4cF9vZl9rZXkgXSlcbiAgOztcblxuICBtb2R1bGUgQWRkX29yX3NldCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9XG4gICAgICB8IEFkZF9leG5faW50ZXJuYWxcbiAgICAgIHwgQWRkX2V4blxuICAgICAgfCBTZXRcbiAgZW5kXG5cblxuICBsZXQgcmVjIGZpbmRfYW5kX2FkZF9vcl9zZXRcbiAgICAgICAgICAgIHRcbiAgICAgICAgICAgIH5sZW5ndGhcbiAgICAgICAgICAgIH5rZXk6eFxuICAgICAgICAgICAgfmRhdGFcbiAgICAgICAgICAgIH5jb21wYXJlX2tleVxuICAgICAgICAgICAgfnNleHBfb2Zfa2V5XG4gICAgICAgICAgICB+KGFkZF9vcl9zZXQgOiBBZGRfb3Jfc2V0LnQpXG4gICAgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTGVhZiAoeCwgZGF0YSksIGxlbmd0aCArIDFcbiAgICB8IExlYWYgKHYsIGQpIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHggdiBpblxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBhZGRfb3Jfc2V0IHdpdGhcbiAgICAgICAgfCBBZGRfZXhuX2ludGVybmFsIC0+IEV4bi5yYWlzZV93aXRob3V0X2JhY2t0cmFjZSBEdXBsaWNhdGVcbiAgICAgICAgfCBBZGRfZXhuIC0+IHJhaXNlX2tleV9hbHJlYWR5X3ByZXNlbnQgfmtleTp4IH5zZXhwX29mX2tleVxuICAgICAgICB8IFNldCAtPiBMZWFmICh4LCBkYXRhKSwgbGVuZ3RoKVxuICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgdGhlbiBOb2RlIChMZWFmICh4LCBkYXRhKSwgdiwgZCwgRW1wdHksIDIpLCBsZW5ndGggKyAxXG4gICAgICBlbHNlIE5vZGUgKEVtcHR5LCB2LCBkLCBMZWFmICh4LCBkYXRhKSwgMiksIGxlbmd0aCArIDFcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIGgpIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHggdiBpblxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBhZGRfb3Jfc2V0IHdpdGhcbiAgICAgICAgfCBBZGRfZXhuX2ludGVybmFsIC0+IEV4bi5yYWlzZV93aXRob3V0X2JhY2t0cmFjZSBEdXBsaWNhdGVcbiAgICAgICAgfCBBZGRfZXhuIC0+IHJhaXNlX2tleV9hbHJlYWR5X3ByZXNlbnQgfmtleTp4IH5zZXhwX29mX2tleVxuICAgICAgICB8IFNldCAtPiBOb2RlIChsLCB4LCBkYXRhLCByLCBoKSwgbGVuZ3RoKVxuICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgdGhlbiAoXG4gICAgICAgIGxldCBsLCBsZW5ndGggPVxuICAgICAgICAgIGZpbmRfYW5kX2FkZF9vcl9zZXQgfmxlbmd0aCB+a2V5OnggfmRhdGEgbCB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5IH5hZGRfb3Jfc2V0XG4gICAgICAgIGluXG4gICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHIsIGxlbmd0aCA9XG4gICAgICAgICAgZmluZF9hbmRfYWRkX29yX3NldCB+bGVuZ3RoIH5rZXk6eCB+ZGF0YSByIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgfmFkZF9vcl9zZXRcbiAgICAgICAgaW5cbiAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgOztcblxuICBsZXQgYWRkX2V4biB0IH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5ID1cbiAgICBmaW5kX2FuZF9hZGRfb3Jfc2V0IHQgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgfmFkZF9vcl9zZXQ6QWRkX2V4blxuICA7O1xuXG4gIGxldCBhZGRfZXhuX2ludGVybmFsIHQgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgPVxuICAgIGZpbmRfYW5kX2FkZF9vcl9zZXRcbiAgICAgIHRcbiAgICAgIH5sZW5ndGhcbiAgICAgIH5rZXlcbiAgICAgIH5kYXRhXG4gICAgICB+Y29tcGFyZV9rZXlcbiAgICAgIH5zZXhwX29mX2tleVxuICAgICAgfmFkZF9vcl9zZXQ6QWRkX2V4bl9pbnRlcm5hbFxuICA7O1xuXG4gIGxldCBzZXQgdCB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5ID1cbiAgICBmaW5kX2FuZF9hZGRfb3Jfc2V0XG4gICAgICB0XG4gICAgICB+bGVuZ3RoXG4gICAgICB+a2V5XG4gICAgICB+ZGF0YVxuICAgICAgfmNvbXBhcmVfa2V5XG4gICAgICB+c2V4cF9vZl9rZXk6KGZ1biBfIC0+IExpc3QgW10pXG4gICAgICB+YWRkX29yX3NldDpTZXRcbiAgOztcblxuICBsZXQgc2V0JyB0IGtleSBkYXRhIH5jb21wYXJlX2tleSA9IGZzdCAoc2V0IHQgfmxlbmd0aDowIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5KVxuXG4gIG1vZHVsZSBCdWlsZF9pbmNyZWFzaW5nID0gc3RydWN0XG4gICAgbW9kdWxlIEZyYWdtZW50ID0gc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAoJ2ssICd2KSB0ID1cbiAgICAgICAgeyBsZWZ0X3N1YnRyZWUgOiAoJ2ssICd2KSB0XG4gICAgICAgIDsga2V5IDogJ2tcbiAgICAgICAgOyBkYXRhIDogJ3ZcbiAgICAgICAgfVxuXG4gICAgICBsZXQgc2luZ2xldG9uX3RvX3RyZWVfZXhuID0gZnVuY3Rpb25cbiAgICAgICAgfCB7IGxlZnRfc3VidHJlZSA9IEVtcHR5OyBrZXk7IGRhdGEgfSAtPiBzaW5nbGV0b24ga2V5IGRhdGFcbiAgICAgICAgfCBfIC0+IGZhaWx3aXRoIFwiTWFwLnNpbmdsZXRvbl90b190cmVlX2V4bjogbm90IGEgc2luZ2xldG9uXCJcbiAgICAgIDs7XG5cbiAgICAgIGxldCBzaW5nbGV0b24gfmtleSB+ZGF0YSA9IHsgbGVmdF9zdWJ0cmVlID0gRW1wdHk7IGtleTsgZGF0YSB9XG5cbiAgICAgICgqIHByZWNvbmRpdGlvbjogfGhlaWdodChsLmxlZnRfc3VidHJlZSkgLSBoZWlnaHQocil8IDw9IDIsXG4gICAgICAgICBtYXhfa2V5KGwpIDwgbWluX2tleShyKVxuICAgICAgKilcbiAgICAgIGxldCBjb2xsYXBzZSBsIHIgPSBjcmVhdGUgbC5sZWZ0X3N1YnRyZWUgbC5rZXkgbC5kYXRhIHJcblxuICAgICAgKCogcHJlY29uZGl0aW9uOiB8aGVpZ2h0KGwubGVmdF9zdWJ0cmVlKSAtIGhlaWdodChyLmxlZnRfc3VidHJlZSl8IDw9IDIsXG4gICAgICAgICBtYXhfa2V5KGwpIDwgbWluX2tleShyKVxuICAgICAgKilcbiAgICAgIGxldCBqb2luIGwgciA9IHsgciB3aXRoIGxlZnRfc3VidHJlZSA9IGNvbGxhcHNlIGwgci5sZWZ0X3N1YnRyZWUgfVxuICAgICAgbGV0IG1heF9rZXkgdCA9IHQua2V5XG4gICAgZW5kXG5cbiAgICAoKiogQnVpbGQgdHJlZXMgZnJvbSBzaW5nbGV0b25zIGluIGEgYmFsYW5jZWQgd2F5IGJ5IHVzaW5nIHNrZXcgYmluYXJ5IGVuY29kaW5nLlxuICAgICAgICBFYWNoIGxldmVsIGNvbnRhaW5zIHRyZWVzIG9mIHRoZSBzYW1lIGhlaWdodCwgY29uc2VjdXRpdmUgbGV2ZWxzIGhhdmUgY29uc2VjdXRpdmVcbiAgICAgICAgaGVpZ2h0cy4gVGhlcmUgYXJlIG5vIGdhcHMuIFRoZSBmaXJzdCBsZXZlbCBhcmUgc2luZ2xlIGtleXMuXG4gICAgKilcbiAgICB0eXBlICgnaywgJ3YpIHQgPVxuICAgICAgfCBaZXJvIG9mIHVuaXRcbiAgICAgICgqIFt1bml0XSB0byBtYWtlIHBhdHRlcm4gbWF0Y2hpbmcgZmFzdGVyICopXG4gICAgICB8IE9uZSBvZiAoJ2ssICd2KSB0ICogKCdrLCAndikgRnJhZ21lbnQudFxuICAgICAgfCBUd28gb2YgKCdrLCAndikgdCAqICgnaywgJ3YpIEZyYWdtZW50LnQgKiAoJ2ssICd2KSBGcmFnbWVudC50XG5cbiAgICBsZXQgZW1wdHkgPSBaZXJvICgpXG5cbiAgICBsZXQgYWRkX3VuY2hlY2tlZCA9XG4gICAgICBsZXQgcmVjIGdvIHQgeCA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IFplcm8gKCkgLT4gT25lICh0LCB4KVxuICAgICAgICB8IE9uZSAodCwgeSkgLT4gVHdvICh0LCB5LCB4KVxuICAgICAgICB8IFR3byAodCwgeiwgeSkgLT4gT25lIChnbyB0IChGcmFnbWVudC5qb2luIHogeSksIHgpXG4gICAgICBpblxuICAgICAgZnVuIHQgfmtleSB+ZGF0YSAtPiBnbyB0IChGcmFnbWVudC5zaW5nbGV0b24gfmtleSB+ZGF0YSlcbiAgICA7O1xuXG4gICAgbGV0IHRvX3RyZWVfdW5jaGVja2VkID1cbiAgICAgIGxldCByZWMgZ28gdCByID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgWmVybyAoKSAtPiByXG4gICAgICAgIHwgT25lICh0LCBsKSAtPiBnbyB0IChGcmFnbWVudC5jb2xsYXBzZSBsIHIpXG4gICAgICAgIHwgVHdvICh0LCBsbCwgbCkgLT4gZ28gdCAoRnJhZ21lbnQuY29sbGFwc2UgKEZyYWdtZW50LmpvaW4gbGwgbCkgcilcbiAgICAgIGluXG4gICAgICBmdW5jdGlvblxuICAgICAgfCBaZXJvICgpIC0+IEVtcHR5XG4gICAgICB8IE9uZSAodCwgcikgLT4gZ28gdCAoRnJhZ21lbnQuc2luZ2xldG9uX3RvX3RyZWVfZXhuIHIpXG4gICAgICB8IFR3byAodCwgbCwgcikgLT4gZ28gKE9uZSAodCwgbCkpIChGcmFnbWVudC5zaW5nbGV0b25fdG9fdHJlZV9leG4gcilcbiAgICA7O1xuXG4gICAgbGV0IG1heF9rZXkgPSBmdW5jdGlvblxuICAgICAgfCBaZXJvICgpIC0+IE5vbmVcbiAgICAgIHwgT25lIChfLCByKSB8IFR3byAoXywgXywgcikgLT4gU29tZSAoRnJhZ21lbnQubWF4X2tleSByKVxuICAgIDs7XG4gIGVuZFxuXG4gIGxldCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIHNlcSB+Y29tcGFyZV9rZXkgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4geyByZXR1cm4gfSAtPlxuICAgICAgbGV0IGJ1aWxkZXIsIGxlbmd0aCA9XG4gICAgICAgIFNlcXVlbmNlLmZvbGRcbiAgICAgICAgICBzZXFcbiAgICAgICAgICB+aW5pdDooQnVpbGRfaW5jcmVhc2luZy5lbXB0eSwgMClcbiAgICAgICAgICB+ZjooZnVuIChidWlsZGVyLCBsZW5ndGgpIChrZXksIGRhdGEpIC0+XG4gICAgICAgICAgICBtYXRjaCBCdWlsZF9pbmNyZWFzaW5nLm1heF9rZXkgYnVpbGRlciB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgcHJldl9rZXkgd2hlbiBjb21wYXJlX2tleSBwcmV2X2tleSBrZXkgPj0gMCAtPlxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZTogbm9uLWluY3JlYXNpbmcga2V5XCIpXG4gICAgICAgICAgICB8IF8gLT4gQnVpbGRfaW5jcmVhc2luZy5hZGRfdW5jaGVja2VkIGJ1aWxkZXIgfmtleSB+ZGF0YSwgbGVuZ3RoICsgMSlcbiAgICAgIGluXG4gICAgICBPayAoQnVpbGRfaW5jcmVhc2luZy50b190cmVlX3VuY2hlY2tlZCBidWlsZGVyLCBsZW5ndGgpKVxuICA7O1xuXG4gICgqIExpa2UgW2JhbF0gYnV0IGFsbG93cyBhbnkgZGlmZmVyZW5jZSBpbiBoZWlnaHQgYmV0d2VlbiBbbF0gYW5kIFtyXS5cblxuICAgICBPKHxoZWlnaHQgbCAtIGhlaWdodCByfCkgKilcbiAgbGV0IHJlYyBqb2luIGwgayBkIHIgfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCBsLCByIHdpdGhcbiAgICB8IEVtcHR5LCBfIC0+IHNldCcgciBrIGQgfmNvbXBhcmVfa2V5XG4gICAgfCBfLCBFbXB0eSAtPiBzZXQnIGwgayBkIH5jb21wYXJlX2tleVxuICAgIHwgTGVhZiAobGssIGxkKSwgXyAtPiBzZXQnIChzZXQnIHIgayBkIH5jb21wYXJlX2tleSkgbGsgbGQgfmNvbXBhcmVfa2V5XG4gICAgfCBfLCBMZWFmIChyaywgcmQpIC0+IHNldCcgKHNldCcgbCBrIGQgfmNvbXBhcmVfa2V5KSByayByZCB+Y29tcGFyZV9rZXlcbiAgICB8IE5vZGUgKGxsLCBsaywgbGQsIGxyLCBsaCksIE5vZGUgKHJsLCByaywgcmQsIHJyLCByaCkgLT5cbiAgICAgICgqIFtiYWxdIHJlcXVpcmVzIGhlaWdodCBkaWZmZXJlbmNlIDw9IDMuICopXG4gICAgICBpZiBsaCA+IHJoICsgM1xuICAgICAgKCogW2hlaWdodCBsciA+PSBoZWlnaHQgcl0sXG4gICAgICAgICB0aGVyZWZvcmUgW2hlaWdodCAoam9pbiBsciBrIGQgciAuLi4pXSBpcyBbaGVpZ2h0IHJsICsgMV0gb3IgW2hlaWdodCBybF1cbiAgICAgICAgIHRoZXJlZm9yZSB0aGUgaGVpZ2h0IGRpZmZlcmVuY2Ugd2l0aCBbbGxdIHdpbGwgYmUgPD0gMyAqKVxuICAgICAgdGhlbiBiYWwgbGwgbGsgbGQgKGpvaW4gbHIgayBkIHIgfmNvbXBhcmVfa2V5KVxuICAgICAgZWxzZSBpZiByaCA+IGxoICsgM1xuICAgICAgdGhlbiBiYWwgKGpvaW4gbCBrIGQgcmwgfmNvbXBhcmVfa2V5KSByayByZCByclxuICAgICAgZWxzZSBiYWwgbCBrIGQgclxuICA7O1xuXG4gIGxldCByZWMgc3BsaXQgdCB4IH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBFbXB0eSwgTm9uZSwgRW1wdHlcbiAgICB8IExlYWYgKGssIGQpIC0+XG4gICAgICBsZXQgY21wID0gY29tcGFyZV9rZXkgeCBrIGluXG4gICAgICBpZiBjbXAgPSAwXG4gICAgICB0aGVuIEVtcHR5LCBTb21lIChrLCBkKSwgRW1wdHlcbiAgICAgIGVsc2UgaWYgY21wIDwgMFxuICAgICAgdGhlbiBFbXB0eSwgTm9uZSwgdFxuICAgICAgZWxzZSB0LCBOb25lLCBFbXB0eVxuICAgIHwgTm9kZSAobCwgaywgZCwgciwgXykgLT5cbiAgICAgIGxldCBjbXAgPSBjb21wYXJlX2tleSB4IGsgaW5cbiAgICAgIGlmIGNtcCA9IDBcbiAgICAgIHRoZW4gbCwgU29tZSAoaywgZCksIHJcbiAgICAgIGVsc2UgaWYgY21wIDwgMFxuICAgICAgdGhlbiAoXG4gICAgICAgIGxldCBsbCwgbWF5YmUsIGxyID0gc3BsaXQgbCB4IH5jb21wYXJlX2tleSBpblxuICAgICAgICBsbCwgbWF5YmUsIGpvaW4gbHIgayBkIHIgfmNvbXBhcmVfa2V5KVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBybCwgbWF5YmUsIHJyID0gc3BsaXQgciB4IH5jb21wYXJlX2tleSBpblxuICAgICAgICBqb2luIGwgayBkIHJsIH5jb21wYXJlX2tleSwgbWF5YmUsIHJyKVxuICA7O1xuXG4gIGxldCBzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkgdCB+aW50byB4IH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGxlZnQsIGJvdW5kYXJ5X29wdCwgcmlnaHQgPSBzcGxpdCB0IHggfmNvbXBhcmVfa2V5IGluXG4gICAgbWF0Y2ggYm91bmRhcnlfb3B0IHdpdGhcbiAgICB8IE5vbmUgLT4gbGVmdCwgcmlnaHRcbiAgICB8IFNvbWUgKGtleSwgZGF0YSkgLT5cbiAgICAgIGxldCBpbnNlcnRfaW50byB0cmVlID0gZnN0IChzZXQgdHJlZSB+a2V5IH5kYXRhIH5sZW5ndGg6MCB+Y29tcGFyZV9rZXkpIGluXG4gICAgICAobWF0Y2ggaW50byB3aXRoXG4gICAgICAgfCBgTGVmdCAtPiBpbnNlcnRfaW50byBsZWZ0LCByaWdodFxuICAgICAgIHwgYFJpZ2h0IC0+IGxlZnQsIGluc2VydF9pbnRvIHJpZ2h0KVxuICA7O1xuXG4gIGxldCBzcGxpdF9yYW5nZVxuICAgICAgICB0XG4gICAgICAgIH4obG93ZXJfYm91bmQgOiAnYSBNYXliZV9ib3VuZC50KVxuICAgICAgICB+KHVwcGVyX2JvdW5kIDogJ2EgTWF5YmVfYm91bmQudClcbiAgICAgICAgfmNvbXBhcmVfa2V5XG4gICAgPVxuICAgIGlmIE1heWJlX2JvdW5kLmJvdW5kc19jcm9zc2VkXG4gICAgICAgICB+Y29tcGFyZTpjb21wYXJlX2tleVxuICAgICAgICAgfmxvd2VyOmxvd2VyX2JvdW5kXG4gICAgICAgICB+dXBwZXI6dXBwZXJfYm91bmRcbiAgICB0aGVuIGVtcHR5LCBlbXB0eSwgZW1wdHlcbiAgICBlbHNlIChcbiAgICAgIGxldCBsZWZ0LCBtaWRfYW5kX3JpZ2h0ID1cbiAgICAgICAgbWF0Y2ggbG93ZXJfYm91bmQgd2l0aFxuICAgICAgICB8IFVuYm91bmRlZCAtPiBlbXB0eSwgdFxuICAgICAgICB8IEluY2wgbGIgLT4gc3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IH5pbnRvOmBSaWdodCB0IGxiIH5jb21wYXJlX2tleVxuICAgICAgICB8IEV4Y2wgbGIgLT4gc3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IH5pbnRvOmBMZWZ0IHQgbGIgfmNvbXBhcmVfa2V5XG4gICAgICBpblxuICAgICAgbGV0IG1pZCwgcmlnaHQgPVxuICAgICAgICBtYXRjaCB1cHBlcl9ib3VuZCB3aXRoXG4gICAgICAgIHwgVW5ib3VuZGVkIC0+IG1pZF9hbmRfcmlnaHQsIGVtcHR5XG4gICAgICAgIHwgSW5jbCBsYiAtPiBzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkgfmludG86YExlZnQgbWlkX2FuZF9yaWdodCBsYiB+Y29tcGFyZV9rZXlcbiAgICAgICAgfCBFeGNsIGxiIC0+XG4gICAgICAgICAgc3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IH5pbnRvOmBSaWdodCBtaWRfYW5kX3JpZ2h0IGxiIH5jb21wYXJlX2tleVxuICAgICAgaW5cbiAgICAgIGxlZnQsIG1pZCwgcmlnaHQpXG4gIDs7XG5cbiAgbGV0IHJlYyBmaW5kIHQgeCB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAodiwgZCkgLT4gaWYgY29tcGFyZV9rZXkgeCB2ID0gMCB0aGVuIFNvbWUgZCBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHggdiBpblxuICAgICAgaWYgYyA9IDAgdGhlbiBTb21lIGQgZWxzZSBmaW5kIChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKSB4IH5jb21wYXJlX2tleVxuICA7O1xuXG4gIGxldCBhZGRfbXVsdGkgdCB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgZGF0YSA9IGRhdGEgOjogT3B0aW9uLnZhbHVlIChmaW5kIHQga2V5IH5jb21wYXJlX2tleSkgfmRlZmF1bHQ6W10gaW5cbiAgICBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIHQgfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbGV0IGZpbmRfbXVsdGkgdCB4IH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggZmluZCB0IHggfmNvbXBhcmVfa2V5IHdpdGhcbiAgICB8IE5vbmUgLT4gW11cbiAgICB8IFNvbWUgbCAtPiBsXG4gIDs7XG5cbiAgbGV0IGZpbmRfZXhuID1cbiAgICBsZXQgaWZfbm90X2ZvdW5kIGtleSB+c2V4cF9vZl9rZXkgPVxuICAgICAgcmFpc2UgKE5vdF9mb3VuZF9zIChMaXN0IFsgQXRvbSBcIk1hcC5maW5kX2V4bjogbm90IGZvdW5kXCI7IHNleHBfb2Zfa2V5IGtleSBdKSlcbiAgICBpblxuICAgIGxldCByZWMgZmluZF9leG4gdCB4IH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGlmX25vdF9mb3VuZCB4IH5zZXhwX29mX2tleVxuICAgICAgfCBMZWFmICh2LCBkKSAtPiBpZiBjb21wYXJlX2tleSB4IHYgPSAwIHRoZW4gZCBlbHNlIGlmX25vdF9mb3VuZCB4IH5zZXhwX29mX2tleVxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHggdiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIGQgZWxzZSBmaW5kX2V4biAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcikgeCB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5XG4gICAgaW5cbiAgICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gICAgZmluZF9leG5cbiAgOztcblxuICBsZXQgbWVtIHQgeCB+Y29tcGFyZV9rZXkgPSBPcHRpb24uaXNfc29tZSAoZmluZCB0IHggfmNvbXBhcmVfa2V5KVxuXG4gIGxldCByZWMgbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrLCBkKSAtPiBTb21lIChrLCBkKVxuICAgIHwgTm9kZSAoRW1wdHksIGssIGQsIF8sIF8pIC0+IFNvbWUgKGssIGQpXG4gICAgfCBOb2RlIChsLCBfLCBfLCBfLCBfKSAtPiBtaW5fZWx0IGxcbiAgOztcblxuICBleGNlcHRpb24gTWFwX21pbl9lbHRfZXhuX29mX2VtcHR5X21hcCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxuICBsZXQgKCkgPVxuICAgIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZFxuICAgICAgWyVleHRlbnNpb25fY29uc3RydWN0b3IgTWFwX21pbl9lbHRfZXhuX29mX2VtcHR5X21hcF1cbiAgICAgIChmdW5jdGlvblxuICAgICAgICB8IE1hcF9taW5fZWx0X2V4bl9vZl9lbXB0eV9tYXAgLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkF0b20gXCJtYXAubWwuVHJlZTAuTWFwX21pbl9lbHRfZXhuX29mX2VtcHR5X21hcFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBleGNlcHRpb24gTWFwX21heF9lbHRfZXhuX29mX2VtcHR5X21hcCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxuICBsZXQgKCkgPVxuICAgIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZFxuICAgICAgWyVleHRlbnNpb25fY29uc3RydWN0b3IgTWFwX21heF9lbHRfZXhuX29mX2VtcHR5X21hcF1cbiAgICAgIChmdW5jdGlvblxuICAgICAgICB8IE1hcF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9tYXAgLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkF0b20gXCJtYXAubWwuVHJlZTAuTWFwX21heF9lbHRfZXhuX29mX2VtcHR5X21hcFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBsZXQgbWluX2VsdF9leG4gdCA9XG4gICAgbWF0Y2ggbWluX2VsdCB0IHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2UgTWFwX21pbl9lbHRfZXhuX29mX2VtcHR5X21hcFxuICAgIHwgU29tZSB2IC0+IHZcbiAgOztcblxuICBsZXQgcmVjIG1heF9lbHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaywgZCkgLT4gU29tZSAoaywgZClcbiAgICB8IE5vZGUgKF8sIGssIGQsIEVtcHR5LCBfKSAtPiBTb21lIChrLCBkKVxuICAgIHwgTm9kZSAoXywgXywgXywgciwgXykgLT4gbWF4X2VsdCByXG4gIDs7XG5cbiAgbGV0IG1heF9lbHRfZXhuIHQgPVxuICAgIG1hdGNoIG1heF9lbHQgdCB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIE1hcF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9tYXBcbiAgICB8IFNvbWUgdiAtPiB2XG4gIDs7XG5cbiAgbGV0IHJlYyByZW1vdmVfbWluX2VsdCB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLnJlbW92ZV9taW5fZWx0XCJcbiAgICB8IExlYWYgXyAtPiBFbXB0eVxuICAgIHwgTm9kZSAoRW1wdHksIF8sIF8sIHIsIF8pIC0+IHJcbiAgICB8IE5vZGUgKGwsIHgsIGQsIHIsIF8pIC0+IGJhbCAocmVtb3ZlX21pbl9lbHQgbCkgeCBkIHJcbiAgOztcblxuICBsZXQgYXBwZW5kIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0IH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggbWF4X2VsdCBsb3dlcl9wYXJ0LCBtaW5fZWx0IHVwcGVyX3BhcnQgd2l0aFxuICAgIHwgTm9uZSwgXyAtPiBgT2sgdXBwZXJfcGFydFxuICAgIHwgXywgTm9uZSAtPiBgT2sgbG93ZXJfcGFydFxuICAgIHwgU29tZSAobWF4X2xvd2VyLCBfKSwgU29tZSAobWluX3VwcGVyLCB2KSB3aGVuIGNvbXBhcmVfa2V5IG1heF9sb3dlciBtaW5fdXBwZXIgPCAwIC0+XG4gICAgICBsZXQgdXBwZXJfcGFydF93aXRob3V0X21pbiA9IHJlbW92ZV9taW5fZWx0IHVwcGVyX3BhcnQgaW5cbiAgICAgIGBPayAoam9pbiB+Y29tcGFyZV9rZXkgbG93ZXJfcGFydCBtaW5fdXBwZXIgdiB1cHBlcl9wYXJ0X3dpdGhvdXRfbWluKVxuICAgIHwgXyAtPiBgT3ZlcmxhcHBpbmdfa2V5X3Jhbmdlc1xuICA7O1xuXG4gIGxldCBmb2xkX3JhbmdlX2luY2x1c2l2ZSA9XG4gICAgKCogVGhpcyBhc3N1bWVzIHRoYXQgbWluIDw9IG1heCwgd2hpY2ggaXMgY2hlY2tlZCBieSB0aGUgb3V0ZXIgZnVuY3Rpb24uICopXG4gICAgbGV0IHJlYyBnbyB0IH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGluaXRcbiAgICAgIHwgTGVhZiAoaywgZCkgLT5cbiAgICAgICAgaWYgY29tcGFyZV9rZXkgayBtaW4gPCAwIHx8IGNvbXBhcmVfa2V5IGsgbWF4ID4gMFxuICAgICAgICB0aGVuICgqIGsgPCBtaW4gfHwgayA+IG1heCAqKVxuICAgICAgICAgIGluaXRcbiAgICAgICAgZWxzZSBmIH5rZXk6ayB+ZGF0YTpkIGluaXRcbiAgICAgIHwgTm9kZSAobCwgaywgZCwgciwgXykgLT5cbiAgICAgICAgbGV0IGNfbWluID0gY29tcGFyZV9rZXkgayBtaW4gaW5cbiAgICAgICAgaWYgY19taW4gPCAwXG4gICAgICAgIHRoZW5cbiAgICAgICAgICAoKiBpZiBrIDwgbWluLCB0aGVuIHRoaXMgbm9kZSBhbmQgaXRzIGxlZnQgYnJhbmNoIGFyZSBvdXRzaWRlIG91ciByYW5nZSAqKVxuICAgICAgICAgIGdvIHIgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleVxuICAgICAgICBlbHNlIGlmIGNfbWluID0gMFxuICAgICAgICB0aGVuXG4gICAgICAgICAgKCogaWYgayA9IG1pbiwgdGhlbiB0aGlzIG5vZGUncyBsZWZ0IGJyYW5jaCBpcyBvdXRzaWRlIG91ciByYW5nZSAqKVxuICAgICAgICAgIGdvIHIgfm1pbiB+bWF4IH5pbml0OihmIH5rZXk6ayB+ZGF0YTpkIGluaXQpIH5mIH5jb21wYXJlX2tleVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICAoKiBrID4gbWluICopXG4gICAgICAgICAgbGV0IHogPSBnbyBsIH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgICBsZXQgY19tYXggPSBjb21wYXJlX2tleSBrIG1heCBpblxuICAgICAgICAgICgqIGlmIGsgPiBtYXgsIHdlJ3JlIGRvbmUgKilcbiAgICAgICAgICBpZiBjX21heCA+IDBcbiAgICAgICAgICB0aGVuIHpcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCB6ID0gZiB+a2V5OmsgfmRhdGE6ZCB6IGluXG4gICAgICAgICAgICAoKiBpZiBrID0gbWF4LCB0aGVuIHdlIGZvbGQgaW4gdGhpcyBvbmUgbGFzdCB2YWx1ZSBhbmQgd2UncmUgZG9uZSAqKVxuICAgICAgICAgICAgaWYgY19tYXggPSAwIHRoZW4geiBlbHNlIGdvIHIgfm1pbiB+bWF4IH5pbml0OnogfmYgfmNvbXBhcmVfa2V5KSlcbiAgICBpblxuICAgIGZ1biB0IH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgLT5cbiAgICAgIGlmIGNvbXBhcmVfa2V5IG1pbiBtYXggPD0gMCB0aGVuIGdvIHQgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleSBlbHNlIGluaXRcbiAgOztcblxuICBsZXQgcmFuZ2VfdG9fYWxpc3QgdCB+bWluIH5tYXggfmNvbXBhcmVfa2V5ID1cbiAgICBMaXN0LnJldlxuICAgICAgKGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgICAgICB0XG4gICAgICAgICB+bWluXG4gICAgICAgICB+bWF4XG4gICAgICAgICB+aW5pdDpbXVxuICAgICAgICAgfmY6KGZ1biB+a2V5IH5kYXRhIGwgLT4gKGtleSwgZGF0YSkgOjogbClcbiAgICAgICAgIH5jb21wYXJlX2tleSlcbiAgOztcblxuICBsZXQgY29uY2F0X3VuY2hlY2tlZCB0MSB0MiA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IEVtcHR5LCB0IC0+IHRcbiAgICB8IHQsIEVtcHR5IC0+IHRcbiAgICB8IF8sIF8gLT5cbiAgICAgIGxldCB4LCBkID0gbWluX2VsdF9leG4gdDIgaW5cbiAgICAgIGJhbCB0MSB4IGQgKHJlbW92ZV9taW5fZWx0IHQyKVxuICA7O1xuXG4gIGV4Y2VwdGlvbiBSZW1vdmVfbm9fb3BcblxuICBsZXQgcmVtb3ZlIHQgeCB+bGVuZ3RoIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IHJlYyByZW1vdmVfbG9vcCB0IHggfmxlbmd0aCB+Y29tcGFyZV9rZXkgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IEV4bi5yYWlzZV93aXRob3V0X2JhY2t0cmFjZSBSZW1vdmVfbm9fb3BcbiAgICAgIHwgTGVhZiAodiwgXykgLT5cbiAgICAgICAgaWYgY29tcGFyZV9rZXkgeCB2ID0gMFxuICAgICAgICB0aGVuIEVtcHR5LCBsZW5ndGggLSAxXG4gICAgICAgIGVsc2UgRXhuLnJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIFJlbW92ZV9ub19vcFxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHggdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIGNvbmNhdF91bmNoZWNrZWQgbCByLCBsZW5ndGggLSAxXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGwsIGxlbmd0aCA9IHJlbW92ZV9sb29wIGwgeCB+bGVuZ3RoIH5jb21wYXJlX2tleSBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCByLCBsZW5ndGggPSByZW1vdmVfbG9vcCByIHggfmxlbmd0aCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgIGluXG4gICAgdHJ5IHJlbW92ZV9sb29wIHQgeCB+bGVuZ3RoIH5jb21wYXJlX2tleSB3aXRoXG4gICAgfCBSZW1vdmVfbm9fb3AgLT4gdCwgbGVuZ3RoXG4gIDs7XG5cbiAgKCogVXNlIGV4Y2VwdGlvbiB0byBhdm9pZCB0cmVlLXJlYnVpbGQgaW4gbm8tb3AgY2FzZSAqKVxuICBleGNlcHRpb24gQ2hhbmdlX25vX29wXG5cbiAgbGV0IGNoYW5nZSB0IGtleSB+ZiB+bGVuZ3RoIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IHJlYyBjaGFuZ2VfY29yZSB0IGtleSBmID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAobWF0Y2ggZiBOb25lIHdpdGhcbiAgICAgICAgIHwgTm9uZSAtPiByYWlzZSBDaGFuZ2Vfbm9fb3AgKCogZXF1aXZhbGVudCB0byByZXR1cm5pbmc6IEVtcHR5ICopXG4gICAgICAgICB8IFNvbWUgZGF0YSAtPiBMZWFmIChrZXksIGRhdGEpLCBsZW5ndGggKyAxKVxuICAgICAgfCBMZWFmICh2LCBkKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGtleSB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIG1hdGNoIGYgKFNvbWUgZCkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBFbXB0eSwgbGVuZ3RoIC0gMVxuICAgICAgICAgIHwgU29tZSBkJyAtPiBMZWFmICh2LCBkJyksIGxlbmd0aClcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbCwgbGVuZ3RoID0gY2hhbmdlX2NvcmUgRW1wdHkga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgRW1wdHksIGxlbmd0aClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IHIsIGxlbmd0aCA9IGNoYW5nZV9jb3JlIEVtcHR5IGtleSBmIGluXG4gICAgICAgICAgYmFsIEVtcHR5IHYgZCByLCBsZW5ndGgpXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIGgpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkga2V5IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbWF0Y2ggZiAoU29tZSBkKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGNvbmNhdF91bmNoZWNrZWQgbCByLCBsZW5ndGggLSAxXG4gICAgICAgICAgfCBTb21lIGRhdGEgLT4gTm9kZSAobCwga2V5LCBkYXRhLCByLCBoKSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsLCBsZW5ndGggPSBjaGFuZ2VfY29yZSBsIGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IHIsIGxlbmd0aCA9IGNoYW5nZV9jb3JlIHIga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgIGluXG4gICAgdHJ5IGNoYW5nZV9jb3JlIHQga2V5IGYgd2l0aFxuICAgIHwgQ2hhbmdlX25vX29wIC0+IHQsIGxlbmd0aFxuICA7O1xuXG4gIGxldCB1cGRhdGUgdCBrZXkgfmYgfmxlbmd0aCB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCByZWMgdXBkYXRlX2NvcmUgdCBrZXkgZiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgbGV0IGRhdGEgPSBmIE5vbmUgaW5cbiAgICAgICAgTGVhZiAoa2V5LCBkYXRhKSwgbGVuZ3RoICsgMVxuICAgICAgfCBMZWFmICh2LCBkKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGtleSB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBkJyA9IGYgKFNvbWUgZCkgaW5cbiAgICAgICAgICBMZWFmICh2LCBkJyksIGxlbmd0aClcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbCwgbGVuZ3RoID0gdXBkYXRlX2NvcmUgRW1wdHkga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgRW1wdHksIGxlbmd0aClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IHIsIGxlbmd0aCA9IHVwZGF0ZV9jb3JlIEVtcHR5IGtleSBmIGluXG4gICAgICAgICAgYmFsIEVtcHR5IHYgZCByLCBsZW5ndGgpXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIGgpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkga2V5IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGRhdGEgPSBmIChTb21lIGQpIGluXG4gICAgICAgICAgTm9kZSAobCwga2V5LCBkYXRhLCByLCBoKSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsLCBsZW5ndGggPSB1cGRhdGVfY29yZSBsIGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IHIsIGxlbmd0aCA9IHVwZGF0ZV9jb3JlIHIga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgIGluXG4gICAgdXBkYXRlX2NvcmUgdCBrZXkgZlxuICA7O1xuXG4gIGxldCByZW1vdmVfbXVsdGkgdCBrZXkgfmxlbmd0aCB+Y29tcGFyZV9rZXkgPVxuICAgIGNoYW5nZSB0IGtleSB+bGVuZ3RoIH5jb21wYXJlX2tleSB+ZjooZnVuY3Rpb25cbiAgICAgIHwgTm9uZSB8IFNvbWUgKFtdIHwgWyBfIF0pIC0+IE5vbmVcbiAgICAgIHwgU29tZSAoXyA6OiAoXyA6OiBfIGFzIG5vbl9lbXB0eV90YWlsKSkgLT4gU29tZSBub25fZW1wdHlfdGFpbClcbiAgOztcblxuICBsZXQgcmVjIGl0ZXJfa2V5cyB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBMZWFmICh2LCBfKSAtPiBmIHZcbiAgICB8IE5vZGUgKGwsIHYsIF8sIHIsIF8pIC0+XG4gICAgICBpdGVyX2tleXMgfmYgbDtcbiAgICAgIGYgdjtcbiAgICAgIGl0ZXJfa2V5cyB+ZiByXG4gIDs7XG5cbiAgbGV0IHJlYyBpdGVyIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IExlYWYgKF8sIGQpIC0+IGYgZFxuICAgIHwgTm9kZSAobCwgXywgZCwgciwgXykgLT5cbiAgICAgIGl0ZXIgfmYgbDtcbiAgICAgIGYgZDtcbiAgICAgIGl0ZXIgfmYgclxuICA7O1xuXG4gIGxldCByZWMgaXRlcmkgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgTGVhZiAodiwgZCkgLT4gZiB+a2V5OnYgfmRhdGE6ZFxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgIGl0ZXJpIH5mIGw7XG4gICAgICBmIH5rZXk6diB+ZGF0YTpkO1xuICAgICAgaXRlcmkgfmYgclxuICA7O1xuXG4gIGxldCBpdGVyaV91bnRpbCA9XG4gICAgbGV0IHJlYyBpdGVyaV91bnRpbF9sb29wIHQgfmYgOiBDb250aW51ZV9vcl9zdG9wLnQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IENvbnRpbnVlXG4gICAgICB8IExlYWYgKHYsIGQpIC0+IGYgfmtleTp2IH5kYXRhOmRcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgICAgKG1hdGNoIGl0ZXJpX3VudGlsX2xvb3AgfmYgbCB3aXRoXG4gICAgICAgICB8IFN0b3AgLT4gU3RvcFxuICAgICAgICAgfCBDb250aW51ZSAtPlxuICAgICAgICAgICAobWF0Y2ggZiB+a2V5OnYgfmRhdGE6ZCB3aXRoXG4gICAgICAgICAgICB8IFN0b3AgLT4gU3RvcFxuICAgICAgICAgICAgfCBDb250aW51ZSAtPiBpdGVyaV91bnRpbF9sb29wIH5mIHIpKVxuICAgIGluXG4gICAgZnVuIHQgfmYgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC5vZl9jb250aW51ZV9vcl9zdG9wIChpdGVyaV91bnRpbF9sb29wIHQgfmYpXG4gIDs7XG5cbiAgbGV0IHJlYyBtYXAgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgIHwgTGVhZiAodiwgZCkgLT4gTGVhZiAodiwgZiBkKVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgaCkgLT5cbiAgICAgIGxldCBsJyA9IG1hcCB+ZiBsIGluXG4gICAgICBsZXQgZCcgPSBmIGQgaW5cbiAgICAgIGxldCByJyA9IG1hcCB+ZiByIGluXG4gICAgICBOb2RlIChsJywgdiwgZCcsIHInLCBoKVxuICA7O1xuXG4gIGxldCByZWMgbWFwaSB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgfCBMZWFmICh2LCBkKSAtPiBMZWFmICh2LCBmIH5rZXk6diB+ZGF0YTpkKVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgaCkgLT5cbiAgICAgIGxldCBsJyA9IG1hcGkgfmYgbCBpblxuICAgICAgbGV0IGQnID0gZiB+a2V5OnYgfmRhdGE6ZCBpblxuICAgICAgbGV0IHInID0gbWFwaSB+ZiByIGluXG4gICAgICBOb2RlIChsJywgdiwgZCcsIHInLCBoKVxuICA7O1xuXG4gIGxldCByZWMgZm9sZCB0IH5pbml0OmFjY3UgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgIHwgTGVhZiAodiwgZCkgLT4gZiB+a2V5OnYgfmRhdGE6ZCBhY2N1XG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPiBmb2xkIH5mIHIgfmluaXQ6KGYgfmtleTp2IH5kYXRhOmQgKGZvbGQgfmYgbCB+aW5pdDphY2N1KSlcbiAgOztcblxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2ggPVxuICAgIGxldCByZWMgZm9sZF91bnRpbF9sb29wIHQgfmFjYyB+ZiA6IChfLCBfKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBDb250aW51ZSBhY2NcbiAgICAgIHwgTGVhZiAodiwgZCkgLT4gZiB+a2V5OnYgfmRhdGE6ZCBhY2NcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgICAgKG1hdGNoIGZvbGRfdW50aWxfbG9vcCBsIH5hY2MgfmYgd2l0aFxuICAgICAgICAgfCBTdG9wIGZpbmFsIC0+IFN0b3AgZmluYWxcbiAgICAgICAgIHwgQ29udGludWUgYWNjIC0+XG4gICAgICAgICAgIChtYXRjaCBmIH5rZXk6diB+ZGF0YTpkIGFjYyB3aXRoXG4gICAgICAgICAgICB8IFN0b3AgZmluYWwgLT4gU3RvcCBmaW5hbFxuICAgICAgICAgICAgfCBDb250aW51ZSBhY2MgLT4gZm9sZF91bnRpbF9sb29wIHIgfmFjYyB+ZikpXG4gICAgaW5cbiAgICBtYXRjaCBmb2xkX3VudGlsX2xvb3AgdCB+YWNjOmluaXQgfmYgd2l0aFxuICAgIHwgQ29udGludWUgYWNjIC0+IGZpbmlzaCBhY2NcbiAgICB8IFN0b3Agc3RvcCAtPiBzdG9wXG4gIDs7XG5cbiAgbGV0IHJlYyBmb2xkX3JpZ2h0IHQgfmluaXQ6YWNjdSB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgfCBMZWFmICh2LCBkKSAtPiBmIH5rZXk6diB+ZGF0YTpkIGFjY3VcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICBmb2xkX3JpZ2h0IH5mIGwgfmluaXQ6KGYgfmtleTp2IH5kYXRhOmQgKGZvbGRfcmlnaHQgfmYgciB+aW5pdDphY2N1KSlcbiAgOztcblxuICBsZXQgZmlsdGVyX2tleXMgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGQgfmluaXQ6KEVtcHR5LCAwKSB0IH5mOihmdW4gfmtleSB+ZGF0YSAoYWNjdSwgbGVuZ3RoKSAtPlxuICAgICAgaWYgZiBrZXkgdGhlbiBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIGFjY3UgfmNvbXBhcmVfa2V5IGVsc2UgYWNjdSwgbGVuZ3RoKVxuICA7O1xuXG5cbiAgbGV0IGZpbHRlciB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZCB+aW5pdDooRW1wdHksIDApIHQgfmY6KGZ1biB+a2V5IH5kYXRhIChhY2N1LCBsZW5ndGgpIC0+XG4gICAgICBpZiBmIGRhdGEgdGhlbiBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIGFjY3UgfmNvbXBhcmVfa2V5IGVsc2UgYWNjdSwgbGVuZ3RoKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJpIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkIH5pbml0OihFbXB0eSwgMCkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgKGFjY3UsIGxlbmd0aCkgLT5cbiAgICAgIGlmIGYgfmtleSB+ZGF0YSB0aGVuIHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgYWNjdSB+Y29tcGFyZV9rZXkgZWxzZSBhY2N1LCBsZW5ndGgpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXAgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGQgfmluaXQ6KEVtcHR5LCAwKSB0IH5mOihmdW4gfmtleSB+ZGF0YSAoYWNjdSwgbGVuZ3RoKSAtPlxuICAgICAgbWF0Y2ggZiBkYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBhY2N1LCBsZW5ndGhcbiAgICAgIHwgU29tZSBiIC0+IHNldCB+bGVuZ3RoIH5rZXkgfmRhdGE6YiBhY2N1IH5jb21wYXJlX2tleSlcbiAgOztcblxuICBsZXQgZmlsdGVyX21hcGkgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGQgfmluaXQ6KEVtcHR5LCAwKSB0IH5mOihmdW4gfmtleSB+ZGF0YSAoYWNjdSwgbGVuZ3RoKSAtPlxuICAgICAgbWF0Y2ggZiB+a2V5IH5kYXRhIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBhY2N1LCBsZW5ndGhcbiAgICAgIHwgU29tZSBiIC0+IHNldCB+bGVuZ3RoIH5rZXkgfmRhdGE6YiBhY2N1IH5jb21wYXJlX2tleSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX21hcGkgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGRcbiAgICAgIHRcbiAgICAgIH5pbml0OigoRW1wdHksIDApLCAoRW1wdHksIDApKVxuICAgICAgfmY6KGZ1biB+a2V5IH5kYXRhIChwYWlyMSwgcGFpcjIpIC0+XG4gICAgICAgIG1hdGNoIChmIH5rZXkgfmRhdGEgOiBfIEVpdGhlci50KSB3aXRoXG4gICAgICAgIHwgRmlyc3QgeCAtPlxuICAgICAgICAgIGxldCB0LCBsZW5ndGggPSBwYWlyMSBpblxuICAgICAgICAgIHNldCB0IH5rZXkgfmRhdGE6eCB+Y29tcGFyZV9rZXkgfmxlbmd0aCwgcGFpcjJcbiAgICAgICAgfCBTZWNvbmQgeSAtPlxuICAgICAgICAgIGxldCB0LCBsZW5ndGggPSBwYWlyMiBpblxuICAgICAgICAgIHBhaXIxLCBzZXQgdCB+a2V5IH5kYXRhOnkgfmNvbXBhcmVfa2V5IH5sZW5ndGgpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl9tYXAgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIHBhcnRpdGlvbl9tYXBpIHQgfmNvbXBhcmVfa2V5IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uaV90ZiB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgcGFydGl0aW9uX21hcGkgdCB+Y29tcGFyZV9rZXkgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgICBpZiBmIH5rZXkgfmRhdGEgdGhlbiBGaXJzdCBkYXRhIGVsc2UgU2Vjb25kIGRhdGEpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl90ZiB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgcGFydGl0aW9uX21hcGkgdCB+Y29tcGFyZV9rZXkgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT5cbiAgICAgIGlmIGYgZGF0YSB0aGVuIEZpcnN0IGRhdGEgZWxzZSBTZWNvbmQgZGF0YSlcbiAgOztcblxuICBtb2R1bGUgRW51bSA9IHN0cnVjdFxuICAgIHR5cGUgaW5jcmVhc2luZ1xuICAgIHR5cGUgZGVjcmVhc2luZ1xuXG4gICAgdHlwZSAoJ2ssICd2LCAnZGlyZWN0aW9uKSB0ID1cbiAgICAgIHwgRW5kXG4gICAgICB8IE1vcmUgb2YgJ2sgKiAndiAqICgnaywgJ3YpIHRyZWUgKiAoJ2ssICd2LCAnZGlyZWN0aW9uKSB0XG5cbiAgICBsZXQgcmVjIGNvbnMgdCAoZSA6IChfLCBfLCBpbmNyZWFzaW5nKSB0KSA6IChfLCBfLCBpbmNyZWFzaW5nKSB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICB8IExlYWYgKHYsIGQpIC0+IE1vcmUgKHYsIGQsIEVtcHR5LCBlKVxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPiBjb25zIGwgKE1vcmUgKHYsIGQsIHIsIGUpKVxuICAgIDs7XG5cbiAgICBsZXQgcmVjIGNvbnNfcmlnaHQgdCAoZSA6IChfLCBfLCBkZWNyZWFzaW5nKSB0KSA6IChfLCBfLCBkZWNyZWFzaW5nKSB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICB8IExlYWYgKHYsIGQpIC0+IE1vcmUgKHYsIGQsIEVtcHR5LCBlKVxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPiBjb25zX3JpZ2h0IHIgKE1vcmUgKHYsIGQsIGwsIGUpKVxuICAgIDs7XG5cbiAgICBsZXQgb2ZfdHJlZSB0cmVlIDogKF8sIF8sIGluY3JlYXNpbmcpIHQgPSBjb25zIHRyZWUgRW5kXG4gICAgbGV0IG9mX3RyZWVfcmlnaHQgdHJlZSA6IChfLCBfLCBkZWNyZWFzaW5nKSB0ID0gY29uc19yaWdodCB0cmVlIEVuZFxuXG4gICAgbGV0IHN0YXJ0aW5nX2F0X2luY3JlYXNpbmcgdCBrZXkgY29tcGFyZSA6IChfLCBfLCBpbmNyZWFzaW5nKSB0ID1cbiAgICAgIGxldCByZWMgbG9vcCB0IGUgPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICAgIHwgTGVhZiAodiwgZCkgLT4gbG9vcCAoTm9kZSAoRW1wdHksIHYsIGQsIEVtcHR5LCAxKSkgZVxuICAgICAgICB8IE5vZGUgKF8sIHYsIF8sIHIsIF8pIHdoZW4gY29tcGFyZSB2IGtleSA8IDAgLT4gbG9vcCByIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPiBsb29wIGwgKE1vcmUgKHYsIGQsIHIsIGUpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdCBFbmRcbiAgICA7O1xuXG4gICAgbGV0IHN0YXJ0aW5nX2F0X2RlY3JlYXNpbmcgdCBrZXkgY29tcGFyZSA6IChfLCBfLCBkZWNyZWFzaW5nKSB0ID1cbiAgICAgIGxldCByZWMgbG9vcCB0IGUgPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICAgIHwgTGVhZiAodiwgZCkgLT4gbG9vcCAoTm9kZSAoRW1wdHksIHYsIGQsIEVtcHR5LCAxKSkgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIF8sIF8sIF8pIHdoZW4gY29tcGFyZSB2IGtleSA+IDAgLT4gbG9vcCBsIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPiBsb29wIHIgKE1vcmUgKHYsIGQsIGwsIGUpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdCBFbmRcbiAgICA7O1xuXG4gICAgbGV0IGNvbXBhcmUgY29tcGFyZV9rZXkgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICAgIGxldCByZWMgbG9vcCB0MSB0MiA9XG4gICAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gMFxuICAgICAgICB8IEVuZCwgXyAtPiAtMVxuICAgICAgICB8IF8sIEVuZCAtPiAxXG4gICAgICAgIHwgTW9yZSAodjEsIGQxLCByMSwgZTEpLCBNb3JlICh2MiwgZDIsIHIyLCBlMikgLT5cbiAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IHYxIHYyIGluXG4gICAgICAgICAgaWYgYyA8PiAwXG4gICAgICAgICAgdGhlbiBjXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZGF0YSBkMSBkMiBpblxuICAgICAgICAgICAgaWYgYyA8PiAwXG4gICAgICAgICAgICB0aGVuIGNcbiAgICAgICAgICAgIGVsc2UgaWYgcGh5c19lcXVhbCByMSByMlxuICAgICAgICAgICAgdGhlbiBsb29wIGUxIGUyXG4gICAgICAgICAgICBlbHNlIGxvb3AgKGNvbnMgcjEgZTEpIChjb25zIHIyIGUyKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQxIHQyXG4gICAgOztcblxuICAgIGxldCBlcXVhbCBjb21wYXJlX2tleSBkYXRhX2VxdWFsIHQxIHQyID1cbiAgICAgIGxldCByZWMgbG9vcCB0MSB0MiA9XG4gICAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gdHJ1ZVxuICAgICAgICB8IEVuZCwgXyB8IF8sIEVuZCAtPiBmYWxzZVxuICAgICAgICB8IE1vcmUgKHYxLCBkMSwgcjEsIGUxKSwgTW9yZSAodjIsIGQyLCByMiwgZTIpIC0+XG4gICAgICAgICAgY29tcGFyZV9rZXkgdjEgdjIgPSAwXG4gICAgICAgICAgJiYgZGF0YV9lcXVhbCBkMSBkMlxuICAgICAgICAgICYmIGlmIHBoeXNfZXF1YWwgcjEgcjIgdGhlbiBsb29wIGUxIGUyIGVsc2UgbG9vcCAoY29ucyByMSBlMSkgKGNvbnMgcjIgZTIpXG4gICAgICBpblxuICAgICAgbG9vcCB0MSB0MlxuICAgIDs7XG5cbiAgICBsZXQgcmVjIGZvbGQgfmluaXQgfmYgPSBmdW5jdGlvblxuICAgICAgfCBFbmQgLT4gaW5pdFxuICAgICAgfCBNb3JlIChrZXksIGRhdGEsIHRyZWUsIGVudW0pIC0+XG4gICAgICAgIGxldCBuZXh0ID0gZiB+a2V5IH5kYXRhIGluaXQgaW5cbiAgICAgICAgZm9sZCAoY29ucyB0cmVlIGVudW0pIH5pbml0Om5leHQgfmZcbiAgICA7O1xuXG4gICAgbGV0IGZvbGQyIGNvbXBhcmVfa2V5IHQxIHQyIH5pbml0IH5mID1cbiAgICAgIGxldCByZWMgbG9vcCB0MSB0MiBjdXJyID1cbiAgICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiBjdXJyXG4gICAgICAgIHwgRW5kLCBfIC0+XG4gICAgICAgICAgZm9sZCB0MiB+aW5pdDpjdXJyIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gZiB+a2V5IH5kYXRhOihgUmlnaHQgZGF0YSkgYWNjKVxuICAgICAgICB8IF8sIEVuZCAtPlxuICAgICAgICAgIGZvbGQgdDEgfmluaXQ6Y3VyciB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGYgfmtleSB+ZGF0YTooYExlZnQgZGF0YSkgYWNjKVxuICAgICAgICB8IE1vcmUgKGsxLCB2MSwgdHJlZTEsIGVudW0xKSwgTW9yZSAoazIsIHYyLCB0cmVlMiwgZW51bTIpIC0+XG4gICAgICAgICAgbGV0IGNvbXBhcmVfcmVzdWx0ID0gY29tcGFyZV9rZXkgazEgazIgaW5cbiAgICAgICAgICBpZiBjb21wYXJlX3Jlc3VsdCA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZiB+a2V5OmsxIH5kYXRhOihgQm90aCAodjEsIHYyKSkgY3VyciBpblxuICAgICAgICAgICAgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgKGNvbnMgdHJlZTIgZW51bTIpIG5leHQpXG4gICAgICAgICAgZWxzZSBpZiBjb21wYXJlX3Jlc3VsdCA8IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZiB+a2V5OmsxIH5kYXRhOihgTGVmdCB2MSkgY3VyciBpblxuICAgICAgICAgICAgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgdDIgbmV4dClcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZiB+a2V5OmsyIH5kYXRhOihgUmlnaHQgdjIpIGN1cnIgaW5cbiAgICAgICAgICAgIGxvb3AgdDEgKGNvbnMgdHJlZTIgZW51bTIpIG5leHQpXG4gICAgICBpblxuICAgICAgbG9vcCB0MSB0MiBpbml0XG4gICAgOztcblxuICAgIGxldCBzeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9rZXkgfmRhdGFfZXF1YWwgPVxuICAgICAgbGV0IHN0ZXAgc3RhdGUgPVxuICAgICAgICBtYXRjaCBzdGF0ZSB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gU2VxdWVuY2UuU3RlcC5Eb25lXG4gICAgICAgIHwgRW5kLCBNb3JlIChrZXksIGRhdGEsIHRyZWUsIGVudW0pIC0+XG4gICAgICAgICAgU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGtleSwgYFJpZ2h0IGRhdGEpLCAoRW5kLCBjb25zIHRyZWUgZW51bSkpXG4gICAgICAgIHwgTW9yZSAoa2V5LCBkYXRhLCB0cmVlLCBlbnVtKSwgRW5kIC0+XG4gICAgICAgICAgU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGtleSwgYExlZnQgZGF0YSksIChjb25zIHRyZWUgZW51bSwgRW5kKSlcbiAgICAgICAgfCAoTW9yZSAoazEsIHYxLCB0cmVlMSwgZW51bTEpIGFzIGxlZnQpLCAoTW9yZSAoazIsIHYyLCB0cmVlMiwgZW51bTIpIGFzIHJpZ2h0KSAtPlxuICAgICAgICAgIGxldCBjb21wYXJlX3Jlc3VsdCA9IGNvbXBhcmVfa2V5IGsxIGsyIGluXG4gICAgICAgICAgaWYgY29tcGFyZV9yZXN1bHQgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgbmV4dF9zdGF0ZSA9XG4gICAgICAgICAgICAgIGlmIHBoeXNfZXF1YWwgdHJlZTEgdHJlZTJcbiAgICAgICAgICAgICAgdGhlbiBlbnVtMSwgZW51bTJcbiAgICAgICAgICAgICAgZWxzZSBjb25zIHRyZWUxIGVudW0xLCBjb25zIHRyZWUyIGVudW0yXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgaWYgZGF0YV9lcXVhbCB2MSB2MlxuICAgICAgICAgICAgdGhlbiBTZXF1ZW5jZS5TdGVwLlNraXAgbmV4dF9zdGF0ZVxuICAgICAgICAgICAgZWxzZSBTZXF1ZW5jZS5TdGVwLllpZWxkICgoazEsIGBVbmVxdWFsICh2MSwgdjIpKSwgbmV4dF9zdGF0ZSkpXG4gICAgICAgICAgZWxzZSBpZiBjb21wYXJlX3Jlc3VsdCA8IDBcbiAgICAgICAgICB0aGVuIFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrMSwgYExlZnQgdjEpLCAoY29ucyB0cmVlMSBlbnVtMSwgcmlnaHQpKVxuICAgICAgICAgIGVsc2UgU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGsyLCBgUmlnaHQgdjIpLCAobGVmdCwgY29ucyB0cmVlMiBlbnVtMikpXG4gICAgICBpblxuICAgICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQ6KG9mX3RyZWUgdDEsIG9mX3RyZWUgdDIpIH5mOnN0ZXBcbiAgICA7O1xuXG4gICAgbGV0IGZvbGRfc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfa2V5IH5kYXRhX2VxdWFsIH5pbml0IH5mID1cbiAgICAgIGxldCBhZGQgYWNjIGsgdiA9IGYgYWNjIChrLCBgUmlnaHQgdikgaW5cbiAgICAgIGxldCByZW1vdmUgYWNjIGsgdiA9IGYgYWNjIChrLCBgTGVmdCB2KSBpblxuICAgICAgbGV0IHJlYyBsb29wIGxlZnQgcmlnaHQgYWNjID1cbiAgICAgICAgbWF0Y2ggbGVmdCwgcmlnaHQgd2l0aFxuICAgICAgICB8IEVuZCwgZW51bSAtPiBmb2xkIGVudW0gfmluaXQ6YWNjIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gYWRkIGFjYyBrZXkgZGF0YSlcbiAgICAgICAgfCBlbnVtLCBFbmQgLT4gZm9sZCBlbnVtIH5pbml0OmFjYyB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IHJlbW92ZSBhY2Mga2V5IGRhdGEpXG4gICAgICAgIHwgKE1vcmUgKGsxLCB2MSwgdHJlZTEsIGVudW0xKSBhcyBsZWZ0KSwgKE1vcmUgKGsyLCB2MiwgdHJlZTIsIGVudW0yKSBhcyByaWdodCkgLT5cbiAgICAgICAgICBsZXQgY29tcGFyZV9yZXN1bHQgPSBjb21wYXJlX2tleSBrMSBrMiBpblxuICAgICAgICAgIGlmIGNvbXBhcmVfcmVzdWx0ID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IGFjYyA9IGlmIGRhdGFfZXF1YWwgdjEgdjIgdGhlbiBhY2MgZWxzZSBmIGFjYyAoazEsIGBVbmVxdWFsICh2MSwgdjIpKSBpblxuICAgICAgICAgICAgaWYgcGh5c19lcXVhbCB0cmVlMSB0cmVlMlxuICAgICAgICAgICAgdGhlbiBsb29wIGVudW0xIGVudW0yIGFjY1xuICAgICAgICAgICAgZWxzZSBsb29wIChjb25zIHRyZWUxIGVudW0xKSAoY29ucyB0cmVlMiBlbnVtMikgYWNjKVxuICAgICAgICAgIGVsc2UgaWYgY29tcGFyZV9yZXN1bHQgPCAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgYWNjID0gcmVtb3ZlIGFjYyBrMSB2MSBpblxuICAgICAgICAgICAgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgcmlnaHQgYWNjKVxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IGFjYyA9IGFkZCBhY2MgazIgdjIgaW5cbiAgICAgICAgICAgIGxvb3AgbGVmdCAoY29ucyB0cmVlMiBlbnVtMikgYWNjKVxuICAgICAgaW5cbiAgICAgIGxvb3AgKG9mX3RyZWUgdDEpIChvZl90cmVlIHQyKSBpbml0XG4gICAgOztcbiAgZW5kXG5cbiAgbGV0IHRvX3NlcXVlbmNlX2luY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9rZXkgdCA9XG4gICAgbGV0IG5leHQgZW51bSA9XG4gICAgICBtYXRjaCBlbnVtIHdpdGhcbiAgICAgIHwgRW51bS5FbmQgLT4gU2VxdWVuY2UuU3RlcC5Eb25lXG4gICAgICB8IEVudW0uTW9yZSAoaywgdiwgdCwgZSkgLT4gU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGssIHYpLCBFbnVtLmNvbnMgdCBlKVxuICAgIGluXG4gICAgbGV0IGluaXQgPVxuICAgICAgbWF0Y2ggZnJvbV9rZXkgd2l0aFxuICAgICAgfCBOb25lIC0+IEVudW0ub2ZfdHJlZSB0XG4gICAgICB8IFNvbWUga2V5IC0+IEVudW0uc3RhcnRpbmdfYXRfaW5jcmVhc2luZyB0IGtleSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQgfmY6bmV4dFxuICA7O1xuXG4gIGxldCB0b19zZXF1ZW5jZV9kZWNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fa2V5IHQgPVxuICAgIGxldCBuZXh0IGVudW0gPVxuICAgICAgbWF0Y2ggZW51bSB3aXRoXG4gICAgICB8IEVudW0uRW5kIC0+IFNlcXVlbmNlLlN0ZXAuRG9uZVxuICAgICAgfCBFbnVtLk1vcmUgKGssIHYsIHQsIGUpIC0+IFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrLCB2KSwgRW51bS5jb25zX3JpZ2h0IHQgZSlcbiAgICBpblxuICAgIGxldCBpbml0ID1cbiAgICAgIG1hdGNoIGZyb21fa2V5IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBFbnVtLm9mX3RyZWVfcmlnaHQgdFxuICAgICAgfCBTb21lIGtleSAtPiBFbnVtLnN0YXJ0aW5nX2F0X2RlY3JlYXNpbmcgdCBrZXkgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0IH5mOm5leHRcbiAgOztcblxuICBsZXQgdG9fc2VxdWVuY2VcbiAgICAgICAgY29tcGFyYXRvclxuICAgICAgICA/KG9yZGVyID0gYEluY3JlYXNpbmdfa2V5KVxuICAgICAgICA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvXG4gICAgICAgID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG9cbiAgICAgICAgdFxuICAgID1cbiAgICBsZXQgaW5jbHVzaXZlX2JvdW5kIHNpZGUgdCBib3VuZCA9XG4gICAgICBsZXQgY29tcGFyZV9rZXkgPSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBpblxuICAgICAgbGV0IGwsIG1heWJlLCByID0gc3BsaXQgdCBib3VuZCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgIGxldCB0ID0gc2lkZSAobCwgcikgaW5cbiAgICAgIG1hdGNoIG1heWJlIHdpdGhcbiAgICAgIHwgTm9uZSAtPiB0XG4gICAgICB8IFNvbWUgKGtleSwgZGF0YSkgLT4gc2V0JyB0IGtleSBkYXRhIH5jb21wYXJlX2tleVxuICAgIGluXG4gICAgbWF0Y2ggb3JkZXIgd2l0aFxuICAgIHwgYEluY3JlYXNpbmdfa2V5IC0+XG4gICAgICBsZXQgdCA9IE9wdGlvbi5mb2xkIGtleXNfbGVzc19vcl9lcXVhbF90byB+aW5pdDp0IH5mOihpbmNsdXNpdmVfYm91bmQgZnN0KSBpblxuICAgICAgdG9fc2VxdWVuY2VfaW5jcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2tleTprZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gdFxuICAgIHwgYERlY3JlYXNpbmdfa2V5IC0+XG4gICAgICBsZXQgdCA9IE9wdGlvbi5mb2xkIGtleXNfZ3JlYXRlcl9vcl9lcXVhbF90byB+aW5pdDp0IH5mOihpbmNsdXNpdmVfYm91bmQgc25kKSBpblxuICAgICAgdG9fc2VxdWVuY2VfZGVjcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2tleTprZXlzX2xlc3Nfb3JfZXF1YWxfdG8gdFxuICA7O1xuXG4gIGxldCBjb21wYXJlIGNvbXBhcmVfa2V5IGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgRW51bS5jb21wYXJlIGNvbXBhcmVfa2V5IGNvbXBhcmVfZGF0YSAoRW51bS5vZl90cmVlIHQxKSAoRW51bS5vZl90cmVlIHQyKVxuICA7O1xuXG4gIGxldCBlcXVhbCBjb21wYXJlX2tleSBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgIEVudW0uZXF1YWwgY29tcGFyZV9rZXkgY29tcGFyZV9kYXRhIChFbnVtLm9mX3RyZWUgdDEpIChFbnVtLm9mX3RyZWUgdDIpXG4gIDs7XG5cbiAgbGV0IGl0ZXIyIHQxIHQyIH5mIH5jb21wYXJlX2tleSA9XG4gICAgRW51bS5mb2xkMlxuICAgICAgY29tcGFyZV9rZXlcbiAgICAgIChFbnVtLm9mX3RyZWUgdDEpXG4gICAgICAoRW51bS5vZl90cmVlIHQyKVxuICAgICAgfmluaXQ6KClcbiAgICAgIH5mOihmdW4gfmtleSB+ZGF0YSAoKSAtPiBmIH5rZXkgfmRhdGEpXG4gIDs7XG5cbiAgbGV0IGZvbGQyIHQxIHQyIH5pbml0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgRW51bS5mb2xkMiBjb21wYXJlX2tleSAoRW51bS5vZl90cmVlIHQxKSAoRW51bS5vZl90cmVlIHQyKSB+ZiB+aW5pdFxuICA7O1xuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiA9IEVudW0uc3ltbWV0cmljX2RpZmZcblxuICBsZXQgZm9sZF9zeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9rZXkgfmRhdGFfZXF1YWwgfmluaXQgfmYgPVxuICAgICgqIFtFbnVtLmZvbGRfZGlmZnNdIGlzIGEgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLCBidXQgaXMgY29uc2lkZXJhYmx5XG4gICAgICAgc2xvd2VyLCBhcyB3ZSBoYXZlIHRvIGFsbG9jYXRlIHF1aXRlIGEgbG90IG9mIHN0YXRlIHRvIHRyYWNrIGVudW1lcmF0aW9uIG9mIGEgdHJlZS5cbiAgICAgICBBdm9pZCBpZiB3ZSBjYW4uXG4gICAgKilcbiAgICBsZXQgc2xvdyB4IHkgfmluaXQgPSBFbnVtLmZvbGRfc3ltbWV0cmljX2RpZmYgeCB5IH5jb21wYXJlX2tleSB+ZGF0YV9lcXVhbCB+ZiB+aW5pdCBpblxuICAgIGxldCBhZGQgYWNjIGsgdiA9IGYgYWNjIChrLCBgUmlnaHQgdikgaW5cbiAgICBsZXQgcmVtb3ZlIGFjYyBrIHYgPSBmIGFjYyAoaywgYExlZnQgdikgaW5cbiAgICBsZXQgZGVsdGEgYWNjIGsgdiB2JyA9IGlmIGRhdGFfZXF1YWwgdiB2JyB0aGVuIGFjYyBlbHNlIGYgYWNjIChrLCBgVW5lcXVhbCAodiwgdicpKSBpblxuICAgICgqIElmIHR3byB0cmVlcyBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSBhdCB0aGUgcm9vdCAoYW5kIHRoZSBzYW1lIGtleSwgaWYgdGhleSdyZVxuICAgICAgIFtOb2RlXXMpIHdlIGNhbiB0cml2aWFsbHkgZGlmZiBlYWNoIHN1YnBhcnQgaW4gb2J2aW91cyB3YXlzLiAqKVxuICAgIGxldCByZWMgbG9vcCB0IHQnIGFjYyA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHQgdCdcbiAgICAgIHRoZW4gYWNjXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggdCwgdCcgd2l0aFxuICAgICAgICB8IEVtcHR5LCBuZXdfdmFscyAtPlxuICAgICAgICAgIGZvbGQgbmV3X3ZhbHMgfmluaXQ6YWNjIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gYWRkIGFjYyBrZXkgZGF0YSlcbiAgICAgICAgfCBvbGRfdmFscywgRW1wdHkgLT5cbiAgICAgICAgICBmb2xkIG9sZF92YWxzIH5pbml0OmFjYyB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IHJlbW92ZSBhY2Mga2V5IGRhdGEpXG4gICAgICAgIHwgTGVhZiAoaywgdiksIExlYWYgKGsnLCB2JykgLT5cbiAgICAgICAgICAobWF0Y2ggY29tcGFyZV9rZXkgayBrJyB3aXRoXG4gICAgICAgICAgIHwgeCB3aGVuIHggPSAwIC0+IGRlbHRhIGFjYyBrIHYgdidcbiAgICAgICAgICAgfCB4IHdoZW4geCA8IDAgLT5cbiAgICAgICAgICAgICBsZXQgYWNjID0gcmVtb3ZlIGFjYyBrIHYgaW5cbiAgICAgICAgICAgICBhZGQgYWNjIGsnIHYnXG4gICAgICAgICAgIHwgXyAoKiB3aGVuIHggPiAwICopIC0+XG4gICAgICAgICAgICAgbGV0IGFjYyA9IGFkZCBhY2MgaycgdicgaW5cbiAgICAgICAgICAgICByZW1vdmUgYWNjIGsgdilcbiAgICAgICAgfCBOb2RlIChsLCBrLCB2LCByLCBfKSwgTm9kZSAobCcsIGsnLCB2JywgcicsIF8pIHdoZW4gY29tcGFyZV9rZXkgayBrJyA9IDAgLT5cbiAgICAgICAgICBsZXQgYWNjID0gbG9vcCBsIGwnIGFjYyBpblxuICAgICAgICAgIGxldCBhY2MgPSBkZWx0YSBhY2MgayB2IHYnIGluXG4gICAgICAgICAgbG9vcCByIHInIGFjY1xuICAgICAgICAoKiBPdXIgcm9vdHMgYXJlbid0IHRoZSBzYW1lIGtleS4gRmFsbGJhY2sgdG8gdGhlIHNsb3cgbW9kZS4gVHJlZXMgd2l0aCBzbWFsbFxuICAgICAgICAgICBkaWZmcyB3aWxsIG9ubHkgZG8gdGhpcyBvbiB2ZXJ5IHNtYWxsIHBhcnRzIG9mIHRoZSB0cmVlIChob3BlZnVsbHkgLSBpZiB0aGVcbiAgICAgICAgICAgb3ZlcmFsbCByb290IGlzIHJlYmFsYW5jZWQsIHdlJ2xsIGVhdCB0aGUgd2hvbGUgY29zdCwgdW5mb3J0dW5hdGVseS4pICopXG4gICAgICAgIHwgTm9kZSBfLCBOb2RlIF8gfCBOb2RlIF8sIExlYWYgXyB8IExlYWYgXywgTm9kZSBfIC0+IHNsb3cgdCB0JyB+aW5pdDphY2MpXG4gICAgaW5cbiAgICBsb29wIHQxIHQyIGluaXRcbiAgOztcblxuICBsZXQgcmVjIGxlbmd0aCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAwXG4gICAgfCBMZWFmIF8gLT4gMVxuICAgIHwgTm9kZSAobCwgXywgXywgciwgXykgLT4gbGVuZ3RoIGwgKyBsZW5ndGggciArIDFcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX3RfaWdub3Jpbmdfc3RydWN0dXJlIGhhc2hfZm9sZF9rZXkgaGFzaF9mb2xkX2RhdGEgc3RhdGUgdCA9XG4gICAgZm9sZFxuICAgICAgdFxuICAgICAgfmluaXQ6KGhhc2hfZm9sZF9pbnQgc3RhdGUgKGxlbmd0aCB0KSlcbiAgICAgIH5mOihmdW4gfmtleSB+ZGF0YSBzdGF0ZSAtPiBoYXNoX2ZvbGRfZGF0YSAoaGFzaF9mb2xkX2tleSBzdGF0ZSBrZXkpIGRhdGEpXG4gIDs7XG5cbiAgbGV0IGtleXMgdCA9IGZvbGRfcmlnaHQgfmY6KGZ1biB+a2V5IH5kYXRhOl8gbGlzdCAtPiBrZXkgOjogbGlzdCkgdCB+aW5pdDpbXVxuICBsZXQgZGF0YSB0ID0gZm9sZF9yaWdodCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSBsaXN0IC0+IGRhdGEgOjogbGlzdCkgdCB+aW5pdDpbXVxuXG4gIG1vZHVsZSB0eXBlIEZvbGRhYmxlID0gc2lnXG4gICAgdmFsIG5hbWUgOiBzdHJpbmdcblxuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGZvbGQgOiAnYSB0IC0+IGluaXQ6J2IgLT4gZjooJ2IgLT4gJ2EgLT4gJ2IpIC0+ICdiXG4gIGVuZFxuXG4gIG1vZHVsZSBPZl9mb2xkYWJsZSAoTSA6IEZvbGRhYmxlKSA9IHN0cnVjdFxuICAgIGxldCBvZl9mb2xkYWJsZV9mb2xkIGZvbGRhYmxlIH5pbml0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgICBNLmZvbGQgZm9sZGFibGUgfmluaXQ6KGVtcHR5LCAwKSB+ZjooZnVuIChhY2N1bSwgbGVuZ3RoKSAoa2V5LCBkYXRhKSAtPlxuICAgICAgICBsZXQgcHJldl9kYXRhID1cbiAgICAgICAgICBtYXRjaCBmaW5kIGFjY3VtIGtleSB+Y29tcGFyZV9rZXkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBpbml0XG4gICAgICAgICAgfCBTb21lIHByZXYgLT4gcHJldlxuICAgICAgICBpblxuICAgICAgICBsZXQgZGF0YSA9IGYgcHJldl9kYXRhIGRhdGEgaW5cbiAgICAgICAgc2V0IGFjY3VtIH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkpXG4gICAgOztcblxuICAgIGxldCBvZl9mb2xkYWJsZV9yZWR1Y2UgZm9sZGFibGUgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICAgIE0uZm9sZCBmb2xkYWJsZSB+aW5pdDooZW1wdHksIDApIH5mOihmdW4gKGFjY3VtLCBsZW5ndGgpIChrZXksIGRhdGEpIC0+XG4gICAgICAgIGxldCBuZXdfZGF0YSA9XG4gICAgICAgICAgbWF0Y2ggZmluZCBhY2N1bSBrZXkgfmNvbXBhcmVfa2V5IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gZGF0YVxuICAgICAgICAgIHwgU29tZSBwcmV2IC0+IGYgcHJldiBkYXRhXG4gICAgICAgIGluXG4gICAgICAgIHNldCBhY2N1bSB+bGVuZ3RoIH5rZXkgfmRhdGE6bmV3X2RhdGEgfmNvbXBhcmVfa2V5KVxuICAgIDs7XG5cbiAgICBsZXQgb2ZfZm9sZGFibGUgZm9sZGFibGUgfmNvbXBhcmVfa2V5ID1cbiAgICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgICBsZXQgbWFwID1cbiAgICAgICAgICBNLmZvbGQgZm9sZGFibGUgfmluaXQ6KGVtcHR5LCAwKSB+ZjooZnVuICh0LCBsZW5ndGgpIChrZXksIGRhdGEpIC0+XG4gICAgICAgICAgICBsZXQgKChfLCBsZW5ndGgnKSBhcyBhY2MpID0gc2V0IH5sZW5ndGggfmtleSB+ZGF0YSB0IH5jb21wYXJlX2tleSBpblxuICAgICAgICAgICAgaWYgbGVuZ3RoID0gbGVuZ3RoJyB0aGVuIHIucmV0dXJuIChgRHVwbGljYXRlX2tleSBrZXkpIGVsc2UgYWNjKVxuICAgICAgICBpblxuICAgICAgICBgT2sgbWFwKVxuICAgIDs7XG5cbiAgICBsZXQgb2ZfZm9sZGFibGVfb3JfZXJyb3IgZm9sZGFibGUgfmNvbXBhcmF0b3IgPVxuICAgICAgbWF0Y2ggb2ZfZm9sZGFibGUgZm9sZGFibGUgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICAgIHwgYE9rIHggLT4gUmVzdWx0Lk9rIHhcbiAgICAgIHwgYER1cGxpY2F0ZV9rZXkga2V5IC0+XG4gICAgICAgIE9yX2Vycm9yLmVycm9yXG4gICAgICAgICAgKFwiTWFwLm9mX1wiIF4gTS5uYW1lIF4gXCJfb3JfZXJyb3I6IGR1cGxpY2F0ZSBrZXlcIilcbiAgICAgICAgICBrZXlcbiAgICAgICAgICBjb21wYXJhdG9yLnNleHBfb2ZfdFxuICAgIDs7XG5cbiAgICBsZXQgb2ZfZm9sZGFibGVfZXhuIGZvbGRhYmxlIH5jb21wYXJhdG9yID1cbiAgICAgIG1hdGNoIG9mX2ZvbGRhYmxlIGZvbGRhYmxlIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgICB8IGBPayB4IC0+IHhcbiAgICAgIHwgYER1cGxpY2F0ZV9rZXkga2V5IC0+XG4gICAgICAgIEVycm9yLmNyZWF0ZSAoXCJNYXAub2ZfXCIgXiBNLm5hbWUgXiBcIl9leG46IGR1cGxpY2F0ZSBrZXlcIikga2V5IGNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgICAgIHw+IEVycm9yLnJhaXNlXG4gICAgOztcbiAgZW5kXG5cbiAgbW9kdWxlIE9mX2FsaXN0ID0gT2ZfZm9sZGFibGUgKHN0cnVjdFxuICAgICAgbGV0IG5hbWUgPSBcImFsaXN0XCJcblxuICAgICAgdHlwZSAnYSB0ID0gJ2EgbGlzdFxuXG4gICAgICBsZXQgZm9sZCA9IExpc3QuZm9sZFxuICAgIGVuZClcblxuICBsZXQgb2ZfYWxpc3RfZm9sZCA9IE9mX2FsaXN0Lm9mX2ZvbGRhYmxlX2ZvbGRcbiAgbGV0IG9mX2FsaXN0X3JlZHVjZSA9IE9mX2FsaXN0Lm9mX2ZvbGRhYmxlX3JlZHVjZVxuICBsZXQgb2ZfYWxpc3QgPSBPZl9hbGlzdC5vZl9mb2xkYWJsZVxuICBsZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgPSBPZl9hbGlzdC5vZl9mb2xkYWJsZV9vcl9lcnJvclxuICBsZXQgb2ZfYWxpc3RfZXhuID0gT2ZfYWxpc3Qub2ZfZm9sZGFibGVfZXhuXG5cbiAgKCogUmV2ZXJzZSB0aGUgaW5wdXQsIHRoZW4gZm9sZCBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSByZXN1bHRpbmcgbWFwIHVzZXMgdGhlIGZpcnN0XG4gICAgIGluc3RhbmNlIG9mIGVhY2gga2V5IGZyb20gdGhlIGlucHV0IGxpc3QuIFRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBlbGVtZW50cyBpbiBlYWNoXG4gICAgIG91dHB1dCBsaXN0IGlzIHRoZSBzYW1lIGFzIGluIHRoZSBpbnB1dCBsaXN0LiAqKVxuICBsZXQgb2ZfZm9sZGFibGVfbXVsdGkgZm9sZGFibGUgfmZvbGQgfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgYWxpc3QgPSBmb2xkIGZvbGRhYmxlIH5pbml0OltdIH5mOihmdW4gbCB4IC0+IHggOjogbCkgaW5cbiAgICBvZl9hbGlzdF9mb2xkIGFsaXN0IH5pbml0OltdIH5mOihmdW4gbCB4IC0+IHggOjogbCkgfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X211bHRpIGFsaXN0IH5jb21wYXJlX2tleSA9XG4gICAgb2ZfZm9sZGFibGVfbXVsdGkgYWxpc3QgfmZvbGQ6TGlzdC5mb2xkIH5jb21wYXJlX2tleVxuICA7O1xuXG4gIG1vZHVsZSBPZl9zZXF1ZW5jZSA9IE9mX2ZvbGRhYmxlIChzdHJ1Y3RcbiAgICAgIGxldCBuYW1lID0gXCJzZXF1ZW5jZVwiXG5cbiAgICAgIHR5cGUgJ2EgdCA9ICdhIFNlcXVlbmNlLnRcblxuICAgICAgbGV0IGZvbGQgPSBTZXF1ZW5jZS5mb2xkXG4gICAgZW5kKVxuXG4gIGxldCBvZl9zZXF1ZW5jZV9mb2xkID0gT2Zfc2VxdWVuY2Uub2ZfZm9sZGFibGVfZm9sZFxuICBsZXQgb2Zfc2VxdWVuY2VfcmVkdWNlID0gT2Zfc2VxdWVuY2Uub2ZfZm9sZGFibGVfcmVkdWNlXG4gIGxldCBvZl9zZXF1ZW5jZSA9IE9mX3NlcXVlbmNlLm9mX2ZvbGRhYmxlXG4gIGxldCBvZl9zZXF1ZW5jZV9vcl9lcnJvciA9IE9mX3NlcXVlbmNlLm9mX2ZvbGRhYmxlX29yX2Vycm9yXG4gIGxldCBvZl9zZXF1ZW5jZV9leG4gPSBPZl9zZXF1ZW5jZS5vZl9mb2xkYWJsZV9leG5cblxuICBsZXQgb2Zfc2VxdWVuY2VfbXVsdGkgc2VxdWVuY2UgfmNvbXBhcmVfa2V5ID1cbiAgICBvZl9mb2xkYWJsZV9tdWx0aSBzZXF1ZW5jZSB+Zm9sZDpTZXF1ZW5jZS5mb2xkIH5jb21wYXJlX2tleVxuICA7O1xuXG4gIGxldCBmb3JfYWxsIHQgfmYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgaXRlciB0IH5mOihmdW4gZGF0YSAtPiBpZiBub3QgKGYgZGF0YSkgdGhlbiByLnJldHVybiBmYWxzZSk7XG4gICAgICB0cnVlKVxuICA7O1xuXG4gIGxldCBmb3JfYWxsaSB0IH5mID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGlmIG5vdCAoZiB+a2V5IH5kYXRhKSB0aGVuIHIucmV0dXJuIGZhbHNlKTtcbiAgICAgIHRydWUpXG4gIDs7XG5cbiAgbGV0IGV4aXN0cyB0IH5mID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgIGl0ZXIgdCB+ZjooZnVuIGRhdGEgLT4gaWYgZiBkYXRhIHRoZW4gci5yZXR1cm4gdHJ1ZSk7XG4gICAgICBmYWxzZSlcbiAgOztcblxuICBsZXQgZXhpc3RzaSB0IH5mID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIHIucmV0dXJuIHRydWUpO1xuICAgICAgZmFsc2UpXG4gIDs7XG5cbiAgbGV0IGNvdW50IHQgfmYgPVxuICAgIGZvbGQgdCB+aW5pdDowIH5mOihmdW4gfmtleTpfIH5kYXRhIGFjYyAtPiBpZiBmIGRhdGEgdGhlbiBhY2MgKyAxIGVsc2UgYWNjKVxuICA7O1xuXG4gIGxldCBjb3VudGkgdCB+ZiA9XG4gICAgZm9sZCB0IH5pbml0OjAgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiBhY2MgKyAxIGVsc2UgYWNjKVxuICA7O1xuXG4gIGxldCB0b19hbGlzdCA/KGtleV9vcmRlciA9IGBJbmNyZWFzaW5nKSB0ID1cbiAgICBtYXRjaCBrZXlfb3JkZXIgd2l0aFxuICAgIHwgYEluY3JlYXNpbmcgLT4gZm9sZF9yaWdodCB0IH5pbml0OltdIH5mOihmdW4gfmtleSB+ZGF0YSB4IC0+IChrZXksIGRhdGEpIDo6IHgpXG4gICAgfCBgRGVjcmVhc2luZyAtPiBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biB+a2V5IH5kYXRhIHggLT4gKGtleSwgZGF0YSkgOjogeClcbiAgOztcblxuICBsZXQgbWVyZ2UgdDEgdDIgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgZWx0cyA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIH5sZW46KGxlbmd0aCB0MSArIGxlbmd0aCB0MikgaW5cbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgaXRlcjIgdDEgdDIgfmNvbXBhcmVfa2V5IH5mOihmdW4gfmtleSB+ZGF0YTp2YWx1ZXMgLT5cbiAgICAgIG1hdGNoIGYgfmtleSB2YWx1ZXMgd2l0aFxuICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgIFVuaWZvcm1fYXJyYXkuc2V0IGVsdHMgIWkgKGtleSwgdmFsdWUpO1xuICAgICAgICBpbmNyIGlcbiAgICAgIHwgTm9uZSAtPiAoKSk7XG4gICAgbGV0IGxlbiA9ICFpIGluXG4gICAgbGV0IGdldCBpID0gVW5pZm9ybV9hcnJheS5nZXQgZWx0cyBpIGluXG4gICAgbGV0IHRyZWUgPSBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mOmdldCBpblxuICAgIHRyZWUsIGxlblxuICA7O1xuXG4gIGxldCBtZXJnZV9za2V3ZWQgPVxuICAgIGxldCBtZXJnZV9sYXJnZV9maXJzdCBsZW5ndGhfbGFyZ2UgdF9sYXJnZSB0X3NtYWxsIH5jYWxsIH5jb21iaW5lIH5jb21wYXJlX2tleSA9XG4gICAgICBmb2xkIHRfc21hbGwgfmluaXQ6KHRfbGFyZ2UsIGxlbmd0aF9sYXJnZSkgfmY6KGZ1biB+a2V5IH5kYXRhOmRhdGEnICh0LCBsZW5ndGgpIC0+XG4gICAgICAgIHVwZGF0ZSB0IGtleSB+bGVuZ3RoIH5jb21wYXJlX2tleSB+ZjooZnVuY3Rpb25cbiAgICAgICAgICB8IE5vbmUgLT4gZGF0YSdcbiAgICAgICAgICB8IFNvbWUgZGF0YSAtPiBjYWxsIGNvbWJpbmUgfmtleSBkYXRhIGRhdGEnKSlcbiAgICBpblxuICAgIGxldCBjYWxsIGYgfmtleSB4IHkgPSBmIH5rZXkgeCB5IGluXG4gICAgbGV0IHN3YXAgZiB+a2V5IHggeSA9IGYgfmtleSB5IHggaW5cbiAgICBmdW4gdDEgdDIgfmxlbmd0aDEgfmxlbmd0aDIgfmNvbWJpbmUgfmNvbXBhcmVfa2V5IC0+XG4gICAgICBpZiBsZW5ndGgyIDw9IGxlbmd0aDFcbiAgICAgIHRoZW4gbWVyZ2VfbGFyZ2VfZmlyc3QgbGVuZ3RoMSB0MSB0MiB+Y2FsbCB+Y29tYmluZSB+Y29tcGFyZV9rZXlcbiAgICAgIGVsc2UgbWVyZ2VfbGFyZ2VfZmlyc3QgbGVuZ3RoMiB0MiB0MSB+Y2FsbDpzd2FwIH5jb21iaW5lIH5jb21wYXJlX2tleVxuICA7O1xuXG4gIG1vZHVsZSBDbG9zZXN0X2tleV9pbXBsID0gc3RydWN0XG4gICAgKCogW21hcmtlcl0gYW5kIFtyZXBhY2thZ2VdIGFsbG93IHVzIHRvIGNyZWF0ZSBcImxvZ2ljYWxcIiBvcHRpb25zIHdpdGhvdXQgYWN0dWFsbHlcbiAgICAgICBhbGxvY2F0aW5nIGFueSBvcHRpb25zLiBQYXNzaW5nIFtGb3VuZCBrZXkgdmFsdWVdIHRvIGEgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0b1xuICAgICAgIHBhc3NpbmcgW1NvbWUgKGtleSwgdmFsdWUpXTsgcGFzc2luZyBbTWlzc2luZyAoKSAoKV0gaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nXG4gICAgICAgW05vbmVdLiAqKVxuICAgIHR5cGUgKCdrLCAndiwgJ2tfb3B0LCAndl9vcHQpIG1hcmtlciA9XG4gICAgICB8IE1pc3NpbmcgOiAoJ2ssICd2LCB1bml0LCB1bml0KSBtYXJrZXJcbiAgICAgIHwgRm91bmQgOiAoJ2ssICd2LCAnaywgJ3YpIG1hcmtlclxuXG4gICAgbGV0IHJlcGFja2FnZVxuICAgICAgICAgICh0eXBlIGsgdiBrX29wdCB2X29wdClcbiAgICAgICAgICAobWFya2VyIDogKGssIHYsIGtfb3B0LCB2X29wdCkgbWFya2VyKVxuICAgICAgICAgIChrIDoga19vcHQpXG4gICAgICAgICAgKHYgOiB2X29wdClcbiAgICAgIDogKGsgKiB2KSBvcHRpb25cbiAgICAgID1cbiAgICAgIG1hdGNoIG1hcmtlciB3aXRoXG4gICAgICB8IE1pc3NpbmcgLT4gTm9uZVxuICAgICAgfCBGb3VuZCAtPiBTb21lIChrLCB2KVxuICAgIDs7XG5cbiAgICAoKiBUaGUgdHlwZSBzaWduYXR1cmUgaXMgZXhwbGljaXQgaGVyZSB0byBhbGxvdyBwb2x5bW9ycGhpYyByZWN1cnNpb24uICopXG4gICAgbGV0IHJlYyBsb29wIDpcbiAgICAgICdrICd2ICdrX29wdCAndl9vcHQuXG4gICAgICAoJ2ssICd2KSB0cmVlXG4gICAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgICAtPiAna1xuICAgICAgLT4gY29tcGFyZV9rZXk6KCdrIC0+ICdrIC0+IGludClcbiAgICAgIC0+ICgnaywgJ3YsICdrX29wdCwgJ3Zfb3B0KSBtYXJrZXJcbiAgICAgIC0+ICdrX29wdFxuICAgICAgLT4gJ3Zfb3B0XG4gICAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG4gICAgICA9XG4gICAgICBmdW4gdCBkaXIgayB+Y29tcGFyZV9rZXkgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZSAtPlxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiByZXBhY2thZ2UgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZVxuICAgICAgICB8IExlYWYgKGsnLCB2JykgLT5cbiAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGsnIGsgaW5cbiAgICAgICAgICBpZiBtYXRjaCBkaXIgd2l0aFxuICAgICAgICAgICAgfCBgR3JlYXRlcl9vcl9lcXVhbF90byAtPiBjID49IDBcbiAgICAgICAgICAgIHwgYEdyZWF0ZXJfdGhhbiAtPiBjID4gMFxuICAgICAgICAgICAgfCBgTGVzc19vcl9lcXVhbF90byAtPiBjIDw9IDBcbiAgICAgICAgICAgIHwgYExlc3NfdGhhbiAtPiBjIDwgMFxuICAgICAgICAgIHRoZW4gU29tZSAoaycsIHYnKVxuICAgICAgICAgIGVsc2UgcmVwYWNrYWdlIGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWVcbiAgICAgICAgfCBOb2RlIChsLCBrJywgdicsIHIsIF8pIC0+XG4gICAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrJyBrIGluXG4gICAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgICgqIFRoaXMgaXMgYSBiYXNlIGNhc2UgKG5vIHJlY3Vyc2l2ZSBjYWxsKS4gKilcbiAgICAgICAgICAgIG1hdGNoIGRpciB3aXRoXG4gICAgICAgICAgICB8IGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYExlc3Nfb3JfZXF1YWxfdG8gLT4gU29tZSAoaycsIHYnKVxuICAgICAgICAgICAgfCBgR3JlYXRlcl90aGFuIC0+XG4gICAgICAgICAgICAgIGlmIGlzX2VtcHR5IHIgdGhlbiByZXBhY2thZ2UgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZSBlbHNlIG1pbl9lbHQgclxuICAgICAgICAgICAgfCBgTGVzc190aGFuIC0+XG4gICAgICAgICAgICAgIGlmIGlzX2VtcHR5IGwgdGhlbiByZXBhY2thZ2UgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZSBlbHNlIG1heF9lbHQgbClcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgICgqIFdlIGFyZSBndWFyYW50ZWVkIGhlcmUgdGhhdCBrJyA8PiBrLiAqKVxuICAgICAgICAgICAgKCogVGhpcyBpcyB0aGUgb25seSByZWN1cnNpdmUgY2FzZS4gKilcbiAgICAgICAgICAgIG1hdGNoIGRpciB3aXRoXG4gICAgICAgICAgICB8IGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiAtPlxuICAgICAgICAgICAgICBpZiBjID4gMFxuICAgICAgICAgICAgICB0aGVuIGxvb3AgbCBkaXIgayB+Y29tcGFyZV9rZXkgRm91bmQgaycgdidcbiAgICAgICAgICAgICAgZWxzZSBsb29wIHIgZGlyIGsgfmNvbXBhcmVfa2V5IGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWVcbiAgICAgICAgICAgIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIC0+XG4gICAgICAgICAgICAgIGlmIGMgPCAwXG4gICAgICAgICAgICAgIHRoZW4gbG9vcCByIGRpciBrIH5jb21wYXJlX2tleSBGb3VuZCBrJyB2J1xuICAgICAgICAgICAgICBlbHNlIGxvb3AgbCBkaXIgayB+Y29tcGFyZV9rZXkgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZSlcbiAgICA7O1xuXG4gICAgbGV0IGNsb3Nlc3Rfa2V5IHQgZGlyIGsgfmNvbXBhcmVfa2V5ID0gbG9vcCB0IGRpciBrIH5jb21wYXJlX2tleSBNaXNzaW5nICgpICgpXG4gIGVuZFxuXG4gIGxldCBjbG9zZXN0X2tleSA9IENsb3Nlc3Rfa2V5X2ltcGwuY2xvc2VzdF9rZXlcblxuICBsZXQgcmVjIHJhbmsgdCBrIH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrJywgXykgLT4gaWYgY29tcGFyZV9rZXkgaycgayA9IDAgdGhlbiBTb21lIDAgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCBrJywgXywgciwgXykgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgaycgayBpblxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gU29tZSAobGVuZ3RoIGwpXG4gICAgICBlbHNlIGlmIGMgPiAwXG4gICAgICB0aGVuIHJhbmsgbCBrIH5jb21wYXJlX2tleVxuICAgICAgZWxzZSBPcHRpb24ubWFwIChyYW5rIHIgayB+Y29tcGFyZV9rZXkpIH5mOihmdW4gcmFuayAtPiByYW5rICsgMSArIGxlbmd0aCBsKVxuICA7O1xuXG4gICgqIHRoaXMgY291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgW1NlcXVlbmNlXSBpbnRlcmZhY2UgYnV0IHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25cbiAgICAgYWxsb2NhdGVzIG9ubHkgMiB3b3JkcyBhbmQgZG9lc24ndCByZXF1aXJlIHdyaXRlLWJhcnJpZXIgKilcbiAgbGV0IHJlYyBudGgnIG51bV90b19zZWFyY2ggPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaywgdikgLT5cbiAgICAgIGlmICFudW1fdG9fc2VhcmNoID0gMFxuICAgICAgdGhlbiBTb21lIChrLCB2KVxuICAgICAgZWxzZSAoXG4gICAgICAgIGRlY3IgbnVtX3RvX3NlYXJjaDtcbiAgICAgICAgTm9uZSlcbiAgICB8IE5vZGUgKGwsIGssIHYsIHIsIF8pIC0+XG4gICAgICAobWF0Y2ggbnRoJyBudW1fdG9fc2VhcmNoIGwgd2l0aFxuICAgICAgIHwgU29tZSBfIGFzIHNvbWUgLT4gc29tZVxuICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgaWYgIW51bV90b19zZWFyY2ggPSAwXG4gICAgICAgICB0aGVuIFNvbWUgKGssIHYpXG4gICAgICAgICBlbHNlIChcbiAgICAgICAgICAgZGVjciBudW1fdG9fc2VhcmNoO1xuICAgICAgICAgICBudGgnIG51bV90b19zZWFyY2ggcikpXG4gIDs7XG5cbiAgbGV0IG50aCB0IG4gPSBudGgnIChyZWYgbikgdFxuXG5cbiAgbGV0IHJlYyBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrLCB2KSAtPiBpZiBmIH5rZXk6ayB+ZGF0YTp2IHRoZW4gU29tZSAoaywgdikgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCBrLCB2LCByLCBfKSAtPlxuICAgICAgaWYgZiB+a2V5OmsgfmRhdGE6dlxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyBsIH5mIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IFNvbWUgKGssIHYpXG4gICAgICAgIHwgU29tZSBfIGFzIHggLT4geClcbiAgICAgIGVsc2UgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHIgfmZcbiAgOztcblxuICBsZXQgcmVjIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaywgdikgLT4gaWYgZiB+a2V5OmsgfmRhdGE6diB0aGVuIFNvbWUgKGssIHYpIGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgaywgdiwgciwgXykgLT5cbiAgICAgIGlmIGYgfmtleTprIH5kYXRhOnZcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBmaW5kX2xhc3Rfc2F0aXNmeWluZyByIH5mIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IFNvbWUgKGssIHYpXG4gICAgICAgIHwgU29tZSBfIGFzIHggLT4geClcbiAgICAgIGVsc2UgZmluZF9sYXN0X3NhdGlzZnlpbmcgbCB+ZlxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHYgPVxuICAgIG1hdGNoIGhvdyB3aXRoXG4gICAgfCBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gLT5cbiAgICAgIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2IDwgMClcbiAgICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAtPlxuICAgICAgZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPD0gMClcbiAgICB8IGBGaXJzdF9lcXVhbF90byAtPlxuICAgICAgKG1hdGNoIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA+PSAwKSB3aXRoXG4gICAgICAgfCBTb21lIChrZXksIGRhdGEpIGFzIHBhaXIgd2hlbiBjb21wYXJlIH5rZXkgfmRhdGEgdiA9IDAgLT4gcGFpclxuICAgICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICAgIHwgYExhc3RfZXF1YWxfdG8gLT5cbiAgICAgIChtYXRjaCBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA8PSAwKSB3aXRoXG4gICAgICAgfCBTb21lIChrZXksIGRhdGEpIGFzIHBhaXIgd2hlbiBjb21wYXJlIH5rZXkgfmRhdGEgdiA9IDAgLT4gcGFpclxuICAgICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICAgIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAtPlxuICAgICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2ID49IDApXG4gICAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuIC0+XG4gICAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPiAwKVxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgbGV0IGlzX2xlZnQgfmtleSB+ZGF0YSA9XG4gICAgICBtYXRjaCBzZWdtZW50X29mIH5rZXkgfmRhdGEgd2l0aFxuICAgICAgfCBgTGVmdCAtPiB0cnVlXG4gICAgICB8IGBSaWdodCAtPiBmYWxzZVxuICAgIGluXG4gICAgbGV0IGlzX3JpZ2h0IH5rZXkgfmRhdGEgPSBub3QgKGlzX2xlZnQgfmtleSB+ZGF0YSkgaW5cbiAgICBtYXRjaCBob3cgd2l0aFxuICAgIHwgYExhc3Rfb25fbGVmdCAtPiBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOmlzX2xlZnRcbiAgICB8IGBGaXJzdF9vbl9yaWdodCAtPiBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Zjppc19yaWdodFxuICA7O1xuXG4gICgqIFtiaW5hcnlfc2VhcmNoX29uZV9zaWRlZF9ib3VuZF0gZmluZHMgdGhlIGtleSBpbiBbdF0gd2hpY2ggc2F0aXNmaWVzIFttYXliZV9ib3VuZF1cbiAgICAgYW5kIHRoZSByZWxldmFudCBvbmUgb2YgW2lmX2V4Y2x1c2l2ZV0gb3IgW2lmX2luY2x1c2l2ZV0sIGFzIGp1ZGdlZCBieSBbY29tcGFyZV0uICopXG4gIGxldCBiaW5hcnlfc2VhcmNoX29uZV9zaWRlZF9ib3VuZCB0IG1heWJlX2JvdW5kIH5jb21wYXJlIH5pZl9leGNsdXNpdmUgfmlmX2luY2x1c2l2ZSA9XG4gICAgbGV0IGZpbmRfYm91bmQgdCBob3cgYm91bmQgfmNvbXBhcmUgOiBfIE1heWJlX2JvdW5kLnQgb3B0aW9uID1cbiAgICAgIG1hdGNoIGJpbmFyeV9zZWFyY2ggdCBob3cgYm91bmQgfmNvbXBhcmUgd2l0aFxuICAgICAgfCBTb21lIChib3VuZCwgXykgLT4gU29tZSAoSW5jbCBib3VuZClcbiAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgaW5cbiAgICBtYXRjaCAobWF5YmVfYm91bmQgOiBfIE1heWJlX2JvdW5kLnQpIHdpdGhcbiAgICB8IEV4Y2wgYm91bmQgLT4gZmluZF9ib3VuZCB0IGlmX2V4Y2x1c2l2ZSBib3VuZCB+Y29tcGFyZVxuICAgIHwgSW5jbCBib3VuZCAtPiBmaW5kX2JvdW5kIHQgaWZfaW5jbHVzaXZlIGJvdW5kIH5jb21wYXJlXG4gICAgfCBVbmJvdW5kZWQgLT4gU29tZSBVbmJvdW5kZWRcbiAgOztcblxuICAoKiBbYmluYXJ5X3NlYXJjaF90d29fc2lkZWRfYm91bmRzXSBmaW5kcyB0aGUgKG5vdCBuZWNlc3NhcmlseSBkaXN0aW5jdCkga2V5cyBpbiBbdF1cbiAgICAgd2hpY2ggbW9zdCBjbG9zZWx5IGFwcHJvYWNoIChidXQgZG8gbm90IGNyb3NzKSBbbG93ZXJfYm91bmRdIGFuZCBbdXBwZXJfYm91bmRdLCBhc1xuICAgICBqdWRnZWQgYnkgW2NvbXBhcmVdLiBJdCByZXR1cm5zIFtOb25lXSBpZiBubyBrZXlzIGluIFt0XSBhcmUgd2l0aGluIHRoYXQgcmFuZ2UuICopXG4gIGxldCBiaW5hcnlfc2VhcmNoX3R3b19zaWRlZF9ib3VuZHMgdCB+Y29tcGFyZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kID1cbiAgICBsZXQgZmluZF9sb3dlcl9ib3VuZCB0IG1heWJlX2JvdW5kIH5jb21wYXJlID1cbiAgICAgIGJpbmFyeV9zZWFyY2hfb25lX3NpZGVkX2JvdW5kXG4gICAgICAgIHRcbiAgICAgICAgbWF5YmVfYm91bmRcbiAgICAgICAgfmNvbXBhcmVcbiAgICAgICAgfmlmX2V4Y2x1c2l2ZTpgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuXG4gICAgICAgIH5pZl9pbmNsdXNpdmU6YEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90b1xuICAgIGluXG4gICAgbGV0IGZpbmRfdXBwZXJfYm91bmQgdCBtYXliZV9ib3VuZCB+Y29tcGFyZSA9XG4gICAgICBiaW5hcnlfc2VhcmNoX29uZV9zaWRlZF9ib3VuZFxuICAgICAgICB0XG4gICAgICAgIG1heWJlX2JvdW5kXG4gICAgICAgIH5jb21wYXJlXG4gICAgICAgIH5pZl9leGNsdXNpdmU6YExhc3Rfc3RyaWN0bHlfbGVzc190aGFuXG4gICAgICAgIH5pZl9pbmNsdXNpdmU6YExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvXG4gICAgaW5cbiAgICBtYXRjaCBmaW5kX2xvd2VyX2JvdW5kIHQgbG93ZXJfYm91bmQgfmNvbXBhcmUgd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGxvd2VyX2JvdW5kIC0+XG4gICAgICAobWF0Y2ggZmluZF91cHBlcl9ib3VuZCB0IHVwcGVyX2JvdW5kIH5jb21wYXJlIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgIHwgU29tZSB1cHBlcl9ib3VuZCAtPiBTb21lIChsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQpKVxuICA7O1xuXG4gIHR5cGUgKCdrLCAndikgYWNjID1cbiAgICB7IG11dGFibGUgYmFkX2tleSA6ICdrIG9wdGlvblxuICAgIDsgbXV0YWJsZSBtYXBfbGVuZ3RoIDogKCdrLCAndikgdCAqIGludFxuICAgIH1cblxuICBsZXQgb2ZfaXRlcmkgfml0ZXJpIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGFjYyA9IHsgYmFkX2tleSA9IE5vbmU7IG1hcF9sZW5ndGggPSBlbXB0eSwgMCB9IGluXG4gICAgaXRlcmkgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgICBsZXQgbWFwLCBsZW5ndGggPSBhY2MubWFwX2xlbmd0aCBpblxuICAgICAgbGV0ICgoXywgbGVuZ3RoJykgYXMgcGFpcikgPSBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIG1hcCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgIGlmIGxlbmd0aCA9IGxlbmd0aCcgJiYgT3B0aW9uLmlzX25vbmUgYWNjLmJhZF9rZXlcbiAgICAgIHRoZW4gYWNjLmJhZF9rZXkgPC0gU29tZSBrZXlcbiAgICAgIGVsc2UgYWNjLm1hcF9sZW5ndGggPC0gcGFpcik7XG4gICAgbWF0Y2ggYWNjLmJhZF9rZXkgd2l0aFxuICAgIHwgTm9uZSAtPiBgT2sgYWNjLm1hcF9sZW5ndGhcbiAgICB8IFNvbWUga2V5IC0+IGBEdXBsaWNhdGVfa2V5IGtleVxuICA7O1xuXG4gIGxldCBvZl9pdGVyaV9leG4gfml0ZXJpIH4oY29tcGFyYXRvciA6IF8gQ29tcGFyYXRvci50KSA9XG4gICAgbWF0Y2ggb2ZfaXRlcmkgfml0ZXJpIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYE9rIHYgLT4gdlxuICAgIHwgYER1cGxpY2F0ZV9rZXkga2V5IC0+XG4gICAgICBFcnJvci5jcmVhdGUgXCJNYXAub2ZfaXRlcmlfZXhuOiBkdXBsaWNhdGUga2V5XCIga2V5IGNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgICB8PiBFcnJvci5yYWlzZVxuICA7O1xuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IGtleV9vZl9zZXhwIHZhbHVlX29mX3NleHAgc2V4cCB+KGNvbXBhcmF0b3IgOiBfIENvbXBhcmF0b3IudCkgPVxuICAgIGxldCBhbGlzdCA9IGxpc3Rfb2Zfc2V4cCAocGFpcl9vZl9zZXhwIGtleV9vZl9zZXhwIHZhbHVlX29mX3NleHApIHNleHAgaW5cbiAgICBsZXQgY29tcGFyZV9rZXkgPSBjb21wYXJhdG9yLmNvbXBhcmUgaW5cbiAgICBtYXRjaCBvZl9hbGlzdCBhbGlzdCB+Y29tcGFyZV9rZXkgd2l0aFxuICAgIHwgYE9rIHYgLT4gdlxuICAgIHwgYER1cGxpY2F0ZV9rZXkgayAtPlxuICAgICAgKCogZmluZCB0aGUgc2V4cCBvZiBhIGR1cGxpY2F0ZSBrZXksIHNvIHRoZSBlcnJvciBpcyBuYXJyb3dlZCB0byBhIGtleSBhbmQgbm90XG4gICAgICAgICB0aGUgd2hvbGUgbWFwICopXG4gICAgICBsZXQgYWxpc3Rfc2V4cHMgPSBsaXN0X29mX3NleHAgKHBhaXJfb2Zfc2V4cCBGbi5pZCBGbi5pZCkgc2V4cCBpblxuICAgICAgbGV0IGZvdW5kX2ZpcnN0X2sgPSByZWYgZmFsc2UgaW5cbiAgICAgIExpc3QuaXRlcjJfb2sgYWxpc3QgYWxpc3Rfc2V4cHMgfmY6KGZ1biAoazIsIF8pIChrMl9zZXhwLCBfKSAtPlxuICAgICAgICBpZiBjb21wYXJlX2tleSBrIGsyID0gMFxuICAgICAgICB0aGVuXG4gICAgICAgICAgaWYgIWZvdW5kX2ZpcnN0X2tcbiAgICAgICAgICB0aGVuIG9mX3NleHBfZXJyb3IgXCJNYXAudF9vZl9zZXhwX2RpcmVjdDogZHVwbGljYXRlIGtleVwiIGsyX3NleHBcbiAgICAgICAgICBlbHNlIGZvdW5kX2ZpcnN0X2sgOj0gdHJ1ZSk7XG4gICAgICBhc3NlcnQgZmFsc2VcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2Zfa2V5IHNleHBfb2ZfdmFsdWUgdCA9XG4gICAgbGV0IGYgfmtleSB+ZGF0YSBhY2MgPSBTZXhwLkxpc3QgWyBzZXhwX29mX2tleSBrZXk7IHNleHBfb2ZfdmFsdWUgZGF0YSBdIDo6IGFjYyBpblxuICAgIFNleHAuTGlzdCAoZm9sZF9yaWdodCB+ZiB0IH5pbml0OltdKVxuICA7O1xuXG4gIGxldCBjb21iaW5lX2Vycm9ycyB0IH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgPVxuICAgIGxldCBva3MsIChlcnJvcl90cmVlLCBfKSA9IHBhcnRpdGlvbl9tYXAgdCB+Y29tcGFyZV9rZXkgfmY6UmVzdWx0LnRvX2VpdGhlciBpblxuICAgIGlmIGlzX2VtcHR5IGVycm9yX3RyZWVcbiAgICB0aGVuIE9rIG9rc1xuICAgIGVsc2UgT3JfZXJyb3IuZXJyb3JfcyAoc2V4cF9vZl90IHNleHBfb2Zfa2V5IEVycm9yLnNleHBfb2ZfdCBlcnJvcl90cmVlKVxuICA7O1xuXG4gIGxldCBtYXBfa2V5c1xuICAgICAgICB0MVxuICAgICAgICB+ZlxuICAgICAgICB+Y29tcGFyYXRvcjooeyBjb21wYXJlID0gY29tcGFyZV9rZXk7IHNleHBfb2ZfdCA9IHNleHBfb2Zfa2V5IH0gOiBfIENvbXBhcmF0b3IudClcbiAgICA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biB7IHJldHVybiB9IC0+XG4gICAgICBgT2tcbiAgICAgICAgKGZvbGQgdDEgfmluaXQ6KGVtcHR5LCAwKSB+ZjooZnVuIH5rZXkgfmRhdGEgKHQyLCBsZW5ndGgpIC0+XG4gICAgICAgICAgIGxldCBrZXkgPSBmIGtleSBpblxuICAgICAgICAgICB0cnkgYWRkX2V4bl9pbnRlcm5hbCB0MiB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSB3aXRoXG4gICAgICAgICAgIHwgRHVwbGljYXRlIC0+IHJldHVybiAoYER1cGxpY2F0ZV9rZXkga2V5KSkpKVxuICA7O1xuXG4gIGxldCBtYXBfa2V5c19leG4gdCB+ZiB+Y29tcGFyYXRvciA9XG4gICAgbWF0Y2ggbWFwX2tleXMgdCB+ZiB+Y29tcGFyYXRvciB3aXRoXG4gICAgfCBgT2sgcmVzdWx0IC0+IHJlc3VsdFxuICAgIHwgYER1cGxpY2F0ZV9rZXkga2V5IC0+XG4gICAgICBsZXQgc2V4cF9vZl9rZXkgPSBjb21wYXJhdG9yLkNvbXBhcmF0b3Iuc2V4cF9vZl90IGluXG4gICAgICBFcnJvci5yYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2UgXCJNYXAubWFwX2tleXNfZXhuOiBkdXBsaWNhdGUga2V5XCIgWyBcImtleVwiLCBrZXkgfD4gc2V4cF9vZl9rZXkgXSlcbiAgOztcbmVuZFxuXG50eXBlICgnaywgJ3YsICdjb21wYXJhdG9yKSB0ID1cbiAgeyAoKiBbY29tcGFyYXRvcl0gaXMgdGhlIGZpcnN0IGZpZWxkIHNvIHRoYXQgcG9seW1vcnBoaWMgZXF1YWxpdHkgZmFpbHMgb24gYSBtYXAgZHVlXG4gICAgICAgdG8gdGhlIGZ1bmN0aW9uYWwgdmFsdWUgaW4gdGhlIGNvbXBhcmF0b3IuXG4gICAgICAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWZmZWN0IHBvbHltb3JwaGljIFtjb21wYXJlXTogdGhhdCBzdGlsbCBwcm9kdWNlc1xuICAgICAgIG5vbnNlbnNlLiAqKVxuICAgIGNvbXBhcmF0b3IgOiAoJ2ssICdjb21wYXJhdG9yKSBDb21wYXJhdG9yLnRcbiAgOyB0cmVlIDogKCdrLCAndikgVHJlZTAudFxuICA7IGxlbmd0aCA6IGludFxuICB9XG5cbnR5cGUgKCdrLCAndiwgJ2NvbXBhcmF0b3IpIHRyZWUgPSAoJ2ssICd2KSBUcmVlMC50XG5cbmxldCBjb21wYXJlX2tleSB0ID0gdC5jb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuXG5cbmxldCBsaWtlIHsgdHJlZSA9IF87IGxlbmd0aCA9IF87IGNvbXBhcmF0b3IgfSAodHJlZSwgbGVuZ3RoKSA9XG4gIHsgdHJlZTsgbGVuZ3RoOyBjb21wYXJhdG9yIH1cbjs7XG5cbmxldCBsaWtlMiB4ICh5LCB6KSA9IGxpa2UgeCB5LCBsaWtlIHggelxuXG5sZXQgbGlrZV9tYXliZV9ub19vcCAoeyB0cmVlID0gb2xkX3RyZWU7IGxlbmd0aCA9IF87IGNvbXBhcmF0b3IgfSBhcyBvbGRfdCkgKHRyZWUsIGxlbmd0aClcbiAgPVxuICBpZiBwaHlzX2VxdWFsIG9sZF90cmVlIHRyZWUgdGhlbiBvbGRfdCBlbHNlIHsgdHJlZTsgbGVuZ3RoOyBjb21wYXJhdG9yIH1cbjs7XG5cbmxldCB3aXRoX3NhbWVfbGVuZ3RoIHsgdHJlZSA9IF87IGNvbXBhcmF0b3I7IGxlbmd0aCB9IHRyZWUgPSB7IHRyZWU7IGNvbXBhcmF0b3I7IGxlbmd0aCB9XG5sZXQgb2ZfdHJlZSB+Y29tcGFyYXRvciB0cmVlID0geyB0cmVlOyBjb21wYXJhdG9yOyBsZW5ndGggPSBUcmVlMC5sZW5ndGggdHJlZSB9XG5cbigqIEV4cG9zaW5nIHRoaXMgZnVuY3Rpb24gd291bGQgbWFrZSBpdCB2ZXJ5IGVhc3kgZm9yIHRoZSBpbnZhcmlhbnRzXG4gICBvZiB0aGlzIG1vZHVsZSB0byBiZSBicm9rZW4uICopXG5sZXQgb2ZfdHJlZV91bnNhZmUgfmNvbXBhcmF0b3Igfmxlbmd0aCB0cmVlID0geyB0cmVlOyBjb21wYXJhdG9yOyBsZW5ndGggfVxuXG5tb2R1bGUgQWNjZXNzb3JzID0gc3RydWN0XG4gIGxldCBjb21wYXJhdG9yIHQgPSB0LmNvbXBhcmF0b3JcbiAgbGV0IHRvX3RyZWUgdCA9IHQudHJlZVxuXG4gIGxldCBpbnZhcmlhbnRzIHQgPVxuICAgIFRyZWUwLmludmFyaWFudHMgdC50cmVlIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkgJiYgVHJlZTAubGVuZ3RoIHQudHJlZSA9IHQubGVuZ3RoXG4gIDs7XG5cbiAgbGV0IGlzX2VtcHR5IHQgPSBUcmVlMC5pc19lbXB0eSB0LnRyZWVcbiAgbGV0IGxlbmd0aCB0ID0gdC5sZW5ndGhcblxuICBsZXQgc2V0IHQgfmtleSB+ZGF0YSA9XG4gICAgbGlrZSB0IChUcmVlMC5zZXQgdC50cmVlIH5sZW5ndGg6dC5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBhZGRfZXhuIHQgfmtleSB+ZGF0YSA9XG4gICAgbGlrZVxuICAgICAgdFxuICAgICAgKFRyZWUwLmFkZF9leG5cbiAgICAgICAgIHQudHJlZVxuICAgICAgICAgfmxlbmd0aDp0Lmxlbmd0aFxuICAgICAgICAgfmtleVxuICAgICAgICAgfmRhdGFcbiAgICAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgICAgICAgIH5zZXhwX29mX2tleTp0LmNvbXBhcmF0b3Iuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBhZGRfZXhuX2ludGVybmFsIHQgfmtleSB+ZGF0YSA9XG4gICAgbGlrZVxuICAgICAgdFxuICAgICAgKFRyZWUwLmFkZF9leG5faW50ZXJuYWxcbiAgICAgICAgIHQudHJlZVxuICAgICAgICAgfmxlbmd0aDp0Lmxlbmd0aFxuICAgICAgICAgfmtleVxuICAgICAgICAgfmRhdGFcbiAgICAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgICAgICAgIH5zZXhwX29mX2tleTp0LmNvbXBhcmF0b3Iuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBhZGQgdCB+a2V5IH5kYXRhID1cbiAgICBtYXRjaCBhZGRfZXhuX2ludGVybmFsIHQgfmtleSB+ZGF0YSB3aXRoXG4gICAgfCByZXN1bHQgLT4gYE9rIHJlc3VsdFxuICAgIHwgZXhjZXB0aW9uIER1cGxpY2F0ZSAtPiBgRHVwbGljYXRlXG4gIDs7XG5cbiAgbGV0IGFkZF9tdWx0aSB0IH5rZXkgfmRhdGEgPVxuICAgIGxpa2VcbiAgICAgIHRcbiAgICAgIChUcmVlMC5hZGRfbXVsdGkgdC50cmVlIH5sZW5ndGg6dC5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCByZW1vdmVfbXVsdGkgdCBrZXkgPVxuICAgIGxpa2UgdCAoVHJlZTAucmVtb3ZlX211bHRpIHQudHJlZSB+bGVuZ3RoOnQubGVuZ3RoIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBmaW5kX211bHRpIHQga2V5ID0gVHJlZTAuZmluZF9tdWx0aSB0LnRyZWUga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcblxuICBsZXQgY2hhbmdlIHQga2V5IH5mID1cbiAgICBsaWtlIHQgKFRyZWUwLmNoYW5nZSB0LnRyZWUga2V5IH5mIH5sZW5ndGg6dC5sZW5ndGggfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgdXBkYXRlIHQga2V5IH5mID1cbiAgICBsaWtlIHQgKFRyZWUwLnVwZGF0ZSB0LnRyZWUga2V5IH5mIH5sZW5ndGg6dC5sZW5ndGggfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgZmluZF9leG4gdCBrZXkgPVxuICAgIFRyZWUwLmZpbmRfZXhuXG4gICAgICB0LnRyZWVcbiAgICAgIGtleVxuICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICAgICAgfnNleHBfb2Zfa2V5OnQuY29tcGFyYXRvci5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgZmluZCB0IGtleSA9IFRyZWUwLmZpbmQgdC50cmVlIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG5cbiAgbGV0IHJlbW92ZSB0IGtleSA9XG4gICAgbGlrZV9tYXliZV9ub19vcFxuICAgICAgdFxuICAgICAgKFRyZWUwLnJlbW92ZSB0LnRyZWUga2V5IH5sZW5ndGg6dC5sZW5ndGggfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgbWVtIHQga2V5ID0gVHJlZTAubWVtIHQudHJlZSBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICBsZXQgaXRlcl9rZXlzIHQgfmYgPSBUcmVlMC5pdGVyX2tleXMgdC50cmVlIH5mXG4gIGxldCBpdGVyIHQgfmYgPSBUcmVlMC5pdGVyIHQudHJlZSB+ZlxuICBsZXQgaXRlcmkgdCB+ZiA9IFRyZWUwLml0ZXJpIHQudHJlZSB+ZlxuICBsZXQgaXRlcmlfdW50aWwgdCB+ZiA9IFRyZWUwLml0ZXJpX3VudGlsIHQudHJlZSB+ZlxuICBsZXQgaXRlcjIgdDEgdDIgfmYgPSBUcmVlMC5pdGVyMiB0MS50cmVlIHQyLnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSlcbiAgbGV0IG1hcCB0IH5mID0gd2l0aF9zYW1lX2xlbmd0aCB0IChUcmVlMC5tYXAgdC50cmVlIH5mKVxuICBsZXQgbWFwaSB0IH5mID0gd2l0aF9zYW1lX2xlbmd0aCB0IChUcmVlMC5tYXBpIHQudHJlZSB+ZilcbiAgbGV0IGZvbGQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGQgdC50cmVlIH5mIH5pbml0XG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3VudGlsIHQudHJlZSB+ZiB+aW5pdFxuICBsZXQgZm9sZF9yaWdodCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF9yaWdodCB0LnRyZWUgfmYgfmluaXRcblxuICBsZXQgZm9sZDIgdDEgdDIgfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGQyIHQxLnRyZWUgdDIudHJlZSB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfa2V5cyB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXJfa2V5cyB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgbGV0IGZpbHRlciB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXIgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIGxldCBmaWx0ZXJpIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlcmkgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIGxldCBmaWx0ZXJfbWFwIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlcl9tYXAgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIGxldCBmaWx0ZXJfbWFwaSB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXJfbWFwaSB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcblxuICBsZXQgcGFydGl0aW9uX21hcGkgdCB+ZiA9XG4gICAgbGlrZTIgdCAoVHJlZTAucGFydGl0aW9uX21hcGkgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl9tYXAgdCB+ZiA9XG4gICAgbGlrZTIgdCAoVHJlZTAucGFydGl0aW9uX21hcCB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uaV90ZiB0IH5mID1cbiAgICBsaWtlMiB0IChUcmVlMC5wYXJ0aXRpb25pX3RmIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fdGYgdCB+ZiA9XG4gICAgbGlrZTIgdCAoVHJlZTAucGFydGl0aW9uX3RmIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBjb21iaW5lX2Vycm9ycyB0ID1cbiAgICBPcl9lcnJvci5tYXBcbiAgICAgIH5mOihsaWtlIHQpXG4gICAgICAoVHJlZTAuY29tYmluZV9lcnJvcnNcbiAgICAgICAgIHQudHJlZVxuICAgICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICAgICAgICAgfnNleHBfb2Zfa2V5OnQuY29tcGFyYXRvci5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfZGlyZWN0IGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgVHJlZTAuY29tcGFyZSAoY29tcGFyZV9rZXkgdDEpIGNvbXBhcmVfZGF0YSB0MS50cmVlIHQyLnRyZWVcbiAgOztcblxuICBsZXQgZXF1YWwgY29tcGFyZV9kYXRhIHQxIHQyID0gVHJlZTAuZXF1YWwgKGNvbXBhcmVfa2V5IHQxKSBjb21wYXJlX2RhdGEgdDEudHJlZSB0Mi50cmVlXG4gIGxldCBrZXlzIHQgPSBUcmVlMC5rZXlzIHQudHJlZVxuICBsZXQgZGF0YSB0ID0gVHJlZTAuZGF0YSB0LnRyZWVcbiAgbGV0IHRvX2FsaXN0ID9rZXlfb3JkZXIgdCA9IFRyZWUwLnRvX2FsaXN0ID9rZXlfb3JkZXIgdC50cmVlXG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmIHQxIHQyIH5kYXRhX2VxdWFsID1cbiAgICBUcmVlMC5zeW1tZXRyaWNfZGlmZiB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSkgfmRhdGFfZXF1YWxcbiAgOztcblxuICBsZXQgZm9sZF9zeW1tZXRyaWNfZGlmZiB0MSB0MiB+ZGF0YV9lcXVhbCB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgICAgdDEudHJlZVxuICAgICAgdDIudHJlZVxuICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSlcbiAgICAgIH5kYXRhX2VxdWFsXG4gICAgICB+aW5pdFxuICAgICAgfmZcbiAgOztcblxuICBsZXQgbWVyZ2UgdDEgdDIgfmYgPVxuICAgIGxpa2UgdDEgKFRyZWUwLm1lcmdlIHQxLnRyZWUgdDIudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKSlcbiAgOztcblxuICBsZXQgbWVyZ2Vfc2tld2VkIHQxIHQyIH5jb21iaW5lID1cbiAgICAoKiBUaGlzIGlzIG9ubHkgYSBuby1vcCBpbiB0aGUgY2FzZSB3aGVyZSBhdCBsZWFzdCBvbmUgb2YgdGhlIG1hcHMgaXMgZW1wdHkuICopXG4gICAgbGlrZV9tYXliZV9ub19vcFxuICAgICAgKGlmIHQyLmxlbmd0aCA8PSB0MS5sZW5ndGggdGhlbiB0MSBlbHNlIHQyKVxuICAgICAgKFRyZWUwLm1lcmdlX3NrZXdlZFxuICAgICAgICAgdDEudHJlZVxuICAgICAgICAgdDIudHJlZVxuICAgICAgICAgfmxlbmd0aDE6dDEubGVuZ3RoXG4gICAgICAgICB+bGVuZ3RoMjp0Mi5sZW5ndGhcbiAgICAgICAgIH5jb21iaW5lXG4gICAgICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKSlcbiAgOztcblxuICBsZXQgbWluX2VsdCB0ID0gVHJlZTAubWluX2VsdCB0LnRyZWVcbiAgbGV0IG1pbl9lbHRfZXhuIHQgPSBUcmVlMC5taW5fZWx0X2V4biB0LnRyZWVcbiAgbGV0IG1heF9lbHQgdCA9IFRyZWUwLm1heF9lbHQgdC50cmVlXG4gIGxldCBtYXhfZWx0X2V4biB0ID0gVHJlZTAubWF4X2VsdF9leG4gdC50cmVlXG4gIGxldCBmb3JfYWxsIHQgfmYgPSBUcmVlMC5mb3JfYWxsIHQudHJlZSB+ZlxuICBsZXQgZm9yX2FsbGkgdCB+ZiA9IFRyZWUwLmZvcl9hbGxpIHQudHJlZSB+ZlxuICBsZXQgZXhpc3RzIHQgfmYgPSBUcmVlMC5leGlzdHMgdC50cmVlIH5mXG4gIGxldCBleGlzdHNpIHQgfmYgPSBUcmVlMC5leGlzdHNpIHQudHJlZSB+ZlxuICBsZXQgY291bnQgdCB+ZiA9IFRyZWUwLmNvdW50IHQudHJlZSB+ZlxuICBsZXQgY291bnRpIHQgfmYgPSBUcmVlMC5jb3VudGkgdC50cmVlIH5mXG5cbiAgbGV0IHNwbGl0IHQgayA9XG4gICAgbGV0IGwsIG1heWJlLCByID0gVHJlZTAuc3BsaXQgdC50cmVlIGsgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSBpblxuICAgIGxldCBjb21wYXJhdG9yID0gY29tcGFyYXRvciB0IGluXG4gICAgKCogVHJ5IHRvIHRyYXZlcnNlIHRoZSBsZWFzdCBhbW91bnQgcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGgsXG4gICAgICAgdXNpbmcgaGVpZ2h0IGFzIGEgaGV1cmlzdGljLiAqKVxuICAgIGxldCBib3RoX2xlbiA9IGlmIE9wdGlvbi5pc19zb21lIG1heWJlIHRoZW4gdC5sZW5ndGggLSAxIGVsc2UgdC5sZW5ndGggaW5cbiAgICBpZiBUcmVlMC5oZWlnaHQgbCA8IFRyZWUwLmhlaWdodCByXG4gICAgdGhlbiAoXG4gICAgICBsZXQgbCA9IG9mX3RyZWUgbCB+Y29tcGFyYXRvciBpblxuICAgICAgbCwgbWF5YmUsIG9mX3RyZWVfdW5zYWZlIHIgfmNvbXBhcmF0b3Igfmxlbmd0aDooYm90aF9sZW4gLSBsZW5ndGggbCkpXG4gICAgZWxzZSAoXG4gICAgICBsZXQgciA9IG9mX3RyZWUgciB+Y29tcGFyYXRvciBpblxuICAgICAgb2ZfdHJlZV91bnNhZmUgbCB+Y29tcGFyYXRvciB+bGVuZ3RoOihib3RoX2xlbiAtIGxlbmd0aCByKSwgbWF5YmUsIHIpXG4gIDs7XG5cbiAgbGV0IHN1YnJhbmdlIHQgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCA9XG4gICAgbGV0IGxlZnQsIG1pZCwgcmlnaHQgPVxuICAgICAgVHJlZTAuc3BsaXRfcmFuZ2UgdC50cmVlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICAgIGluXG4gICAgKCogVHJ5IHRvIHRyYXZlcnNlIHRoZSBsZWFzdCBhbW91bnQgcG9zc2libGUgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGgsXG4gICAgICAgdXNpbmcgaGVpZ2h0IGFzIGEgaGV1cmlzdGljLiAqKVxuICAgIGxldCBvdXRlcl9qb2luZWRfaGVpZ2h0ID1cbiAgICAgIGxldCBoX2wgPSBUcmVlMC5oZWlnaHQgbGVmdFxuICAgICAgYW5kIGhfciA9IFRyZWUwLmhlaWdodCByaWdodCBpblxuICAgICAgaWYgaF9sID0gaF9yIHRoZW4gaF9sICsgMSBlbHNlIG1heCBoX2wgaF9yXG4gICAgaW5cbiAgICBpZiBvdXRlcl9qb2luZWRfaGVpZ2h0IDwgVHJlZTAuaGVpZ2h0IG1pZFxuICAgIHRoZW4gKFxuICAgICAgbGV0IG1pZF9sZW5ndGggPSB0Lmxlbmd0aCAtIChUcmVlMC5sZW5ndGggbGVmdCArIFRyZWUwLmxlbmd0aCByaWdodCkgaW5cbiAgICAgIG9mX3RyZWVfdW5zYWZlIG1pZCB+Y29tcGFyYXRvcjooY29tcGFyYXRvciB0KSB+bGVuZ3RoOm1pZF9sZW5ndGgpXG4gICAgZWxzZSBvZl90cmVlIG1pZCB+Y29tcGFyYXRvcjooY29tcGFyYXRvciB0KVxuICA7O1xuXG4gIGxldCBhcHBlbmQgfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnQgPVxuICAgIG1hdGNoXG4gICAgICBUcmVlMC5hcHBlbmRcbiAgICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSBsb3dlcl9wYXJ0KVxuICAgICAgICB+bG93ZXJfcGFydDpsb3dlcl9wYXJ0LnRyZWVcbiAgICAgICAgfnVwcGVyX3BhcnQ6dXBwZXJfcGFydC50cmVlXG4gICAgd2l0aFxuICAgIHwgYE9rIHRyZWUgLT5cbiAgICAgIGBPa1xuICAgICAgICAob2ZfdHJlZV91bnNhZmVcbiAgICAgICAgICAgdHJlZVxuICAgICAgICAgICB+Y29tcGFyYXRvcjooY29tcGFyYXRvciBsb3dlcl9wYXJ0KVxuICAgICAgICAgICB+bGVuZ3RoOihsb3dlcl9wYXJ0Lmxlbmd0aCArIHVwcGVyX3BhcnQubGVuZ3RoKSlcbiAgICB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIC0+IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzXG4gIDs7XG5cbiAgbGV0IGZvbGRfcmFuZ2VfaW5jbHVzaXZlIHQgfm1pbiB+bWF4IH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkX3JhbmdlX2luY2x1c2l2ZSB0LnRyZWUgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgOztcblxuICBsZXQgcmFuZ2VfdG9fYWxpc3QgdCB+bWluIH5tYXggPVxuICAgIFRyZWUwLnJhbmdlX3RvX2FsaXN0IHQudHJlZSB+bWluIH5tYXggfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICA7O1xuXG4gIGxldCBjbG9zZXN0X2tleSB0IGRpciBrZXkgPVxuICAgIFRyZWUwLmNsb3Nlc3Rfa2V5IHQudHJlZSBkaXIga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgOztcblxuICBsZXQgbnRoIHQgbiA9IFRyZWUwLm50aCB0LnRyZWUgblxuICBsZXQgbnRoX2V4biB0IG4gPSBPcHRpb24udmFsdWVfZXhuIChudGggdCBuKVxuICBsZXQgcmFuayB0IGtleSA9IFRyZWUwLnJhbmsgdC50cmVlIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9rIHNleHBfb2ZfdiBfIHQgPSBUcmVlMC5zZXhwX29mX3Qgc2V4cF9vZl9rIHNleHBfb2ZfdiB0LnRyZWVcblxuICBsZXQgdG9fc2VxdWVuY2UgP29yZGVyID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2tleXNfbGVzc19vcl9lcXVhbF90byB0ID1cbiAgICBUcmVlMC50b19zZXF1ZW5jZVxuICAgICAgdC5jb21wYXJhdG9yXG4gICAgICA/b3JkZXJcbiAgICAgID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG9cbiAgICAgID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG9cbiAgICAgIHQudHJlZVxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHYgPSBUcmVlMC5iaW5hcnlfc2VhcmNoIHQudHJlZSB+Y29tcGFyZSBob3cgdlxuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgVHJlZTAuYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdC50cmVlIH5zZWdtZW50X29mIGhvd1xuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfZGlyZWN0IGhhc2hfZm9sZF9rZXkgaGFzaF9mb2xkX2RhdGEgc3RhdGUgdCA9XG4gICAgVHJlZTAuaGFzaF9mb2xkX3RfaWdub3Jpbmdfc3RydWN0dXJlIGhhc2hfZm9sZF9rZXkgaGFzaF9mb2xkX2RhdGEgc3RhdGUgdC50cmVlXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc3VicmFuZ2UgdCB+Y29tcGFyZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kID1cbiAgICBtYXRjaFxuICAgICAgVHJlZTAuYmluYXJ5X3NlYXJjaF90d29fc2lkZWRfYm91bmRzIHQudHJlZSB+Y29tcGFyZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kXG4gICAgd2l0aFxuICAgIHwgU29tZSAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kKSAtPiBzdWJyYW5nZSB0IH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmRcbiAgICB8IE5vbmUgLT4gbGlrZV9tYXliZV9ub19vcCB0IChFbXB0eSwgMClcbiAgOztcbmVuZFxuXG4oKiBbMF0gaXMgdXNlZCBhcyB0aGUgW2xlbmd0aF0gYXJndW1lbnQgZXZlcnl3aGVyZSBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdHJlZXMgZG8gbm90XG4gICBoYXZlIHRoZWlyIGxlbmd0aHMgc3RvcmVkIGF0IHRoZSByb290LCB1bmxpa2UgbWFwcy4gVGhlIHZhbHVlcyBhcmUgZGlzY2FyZGVkIGFsd2F5cy4gKilcbm1vZHVsZSBUcmVlID0gc3RydWN0XG4gIHR5cGUgKCdrLCAndiwgJ2NvbXBhcmF0b3IpIHQgPSAoJ2ssICd2LCAnY29tcGFyYXRvcikgdHJlZVxuXG4gIGxldCBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uID0gVHJlZTAuZW1wdHlcbiAgbGV0IGVtcHR5IH5jb21wYXJhdG9yOl8gPSBlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uXG4gIGxldCBvZl90cmVlIH5jb21wYXJhdG9yOl8gdHJlZSA9IHRyZWVcbiAgbGV0IHNpbmdsZXRvbiB+Y29tcGFyYXRvcjpfIGsgdiA9IFRyZWUwLnNpbmdsZXRvbiBrIHZcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgZnN0IChUcmVlMC5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBUcmVlMC5vZl9zb3J0ZWRfYXJyYXkgYXJyYXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgfD4gT3JfZXJyb3IubWFwIH5mOmZzdFxuICA7O1xuXG4gIGxldCBvZl9hbGlzdCB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgbWF0Y2ggVHJlZTAub2ZfYWxpc3QgYWxpc3QgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgZCAtPiBkXG4gICAgfCBgT2sgKHRyZWUsIF9zaXplKSAtPiBgT2sgdHJlZVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9vcl9lcnJvciB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgVHJlZTAub2ZfYWxpc3Rfb3JfZXJyb3IgYWxpc3QgfmNvbXBhcmF0b3IgfD4gT3JfZXJyb3IubWFwIH5mOmZzdFxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9leG4gfmNvbXBhcmF0b3IgYWxpc3QgPSBmc3QgKFRyZWUwLm9mX2FsaXN0X2V4biBhbGlzdCB+Y29tcGFyYXRvcilcblxuICBsZXQgb2ZfYWxpc3RfbXVsdGkgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIGZzdCAoVHJlZTAub2ZfYWxpc3RfbXVsdGkgYWxpc3QgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9mb2xkIH5jb21wYXJhdG9yIGFsaXN0IH5pbml0IH5mID1cbiAgICBmc3QgKFRyZWUwLm9mX2FsaXN0X2ZvbGQgYWxpc3QgfmluaXQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9yZWR1Y2UgfmNvbXBhcmF0b3IgYWxpc3QgfmYgPVxuICAgIGZzdCAoVHJlZTAub2ZfYWxpc3RfcmVkdWNlIGFsaXN0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfaXRlcmkgfmNvbXBhcmF0b3Igfml0ZXJpID1cbiAgICBtYXRjaCBUcmVlMC5vZl9pdGVyaSB+aXRlcmkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBPayAodHJlZSwgX3NpemUpIC0+IGBPayB0cmVlXG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIGQgLT4gZFxuICA7O1xuXG4gIGxldCBvZl9pdGVyaV9leG4gfmNvbXBhcmF0b3Igfml0ZXJpID0gZnN0IChUcmVlMC5vZl9pdGVyaV9leG4gfml0ZXJpIH5jb21wYXJhdG9yKVxuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvcjpfcmVxdWlyZWRfYnlfaW50ZiB+bGVuIH5mID1cbiAgICBUcmVlMC5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBPcl9lcnJvci5tYXBcbiAgICAgIH5mOmZzdFxuICAgICAgKFRyZWUwLm9mX2luY3JlYXNpbmdfc2VxdWVuY2Ugc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBtYXRjaCBUcmVlMC5vZl9zZXF1ZW5jZSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgZCAtPiBkXG4gICAgfCBgT2sgKHRyZWUsIF9zaXplKSAtPiBgT2sgdHJlZVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9vcl9lcnJvciB+Y29tcGFyYXRvciBzZXEgPVxuICAgIFRyZWUwLm9mX3NlcXVlbmNlX29yX2Vycm9yIHNlcSB+Y29tcGFyYXRvciB8PiBPcl9lcnJvci5tYXAgfmY6ZnN0XG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX2V4biB+Y29tcGFyYXRvciBzZXEgPSBmc3QgKFRyZWUwLm9mX3NlcXVlbmNlX2V4biBzZXEgfmNvbXBhcmF0b3IpXG5cbiAgbGV0IG9mX3NlcXVlbmNlX211bHRpIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgZnN0IChUcmVlMC5vZl9zZXF1ZW5jZV9tdWx0aSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9mb2xkIH5jb21wYXJhdG9yIHNlcSB+aW5pdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5vZl9zZXF1ZW5jZV9mb2xkIHNlcSB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX3JlZHVjZSB+Y29tcGFyYXRvciBzZXEgfmYgPVxuICAgIGZzdCAoVHJlZTAub2Zfc2VxdWVuY2VfcmVkdWNlIHNlcSB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IHRvX3RyZWUgdCA9IHRcblxuICBsZXQgaW52YXJpYW50cyB+Y29tcGFyYXRvciB0ID1cbiAgICBUcmVlMC5pbnZhcmlhbnRzIHQgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IGlzX2VtcHR5IHQgPSBUcmVlMC5pc19lbXB0eSB0XG4gIGxldCBsZW5ndGggdCA9IFRyZWUwLmxlbmd0aCB0XG5cbiAgbGV0IHNldCB+Y29tcGFyYXRvciB0IH5rZXkgfmRhdGEgPVxuICAgIGZzdCAoVHJlZTAuc2V0IHQgfmtleSB+ZGF0YSB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBhZGRfZXhuIH5jb21wYXJhdG9yIHQgfmtleSB+ZGF0YSA9XG4gICAgZnN0XG4gICAgICAoVHJlZTAuYWRkX2V4blxuICAgICAgICAgdFxuICAgICAgICAgfmtleVxuICAgICAgICAgfmRhdGFcbiAgICAgICAgIH5sZW5ndGg6MFxuICAgICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgICAgICB+c2V4cF9vZl9rZXk6Y29tcGFyYXRvci5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGFkZCB+Y29tcGFyYXRvciB0IH5rZXkgfmRhdGEgPVxuICAgIHRyeSBgT2sgKGFkZF9leG4gdCB+Y29tcGFyYXRvciB+a2V5IH5kYXRhKSB3aXRoXG4gICAgfCBfIC0+IGBEdXBsaWNhdGVcbiAgOztcblxuICBsZXQgYWRkX211bHRpIH5jb21wYXJhdG9yIHQgfmtleSB+ZGF0YSA9XG4gICAgVHJlZTAuYWRkX211bHRpIHQgfmtleSB+ZGF0YSB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgfD4gZnN0XG4gIDs7XG5cbiAgbGV0IHJlbW92ZV9tdWx0aSB+Y29tcGFyYXRvciB0IGtleSA9XG4gICAgVHJlZTAucmVtb3ZlX211bHRpIHQga2V5IH5sZW5ndGg6MCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfD4gZnN0XG4gIDs7XG5cbiAgbGV0IGZpbmRfbXVsdGkgfmNvbXBhcmF0b3IgdCBrZXkgPVxuICAgIFRyZWUwLmZpbmRfbXVsdGkgdCBrZXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IGNoYW5nZSB+Y29tcGFyYXRvciB0IGtleSB+ZiA9XG4gICAgZnN0IChUcmVlMC5jaGFuZ2UgdCBrZXkgfmYgfmxlbmd0aDowIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgdXBkYXRlIH5jb21wYXJhdG9yIHQga2V5IH5mID1cbiAgICBjaGFuZ2UgfmNvbXBhcmF0b3IgdCBrZXkgfmY6KGZ1biBkYXRhIC0+IFNvbWUgKGYgZGF0YSkpXG4gIDs7XG5cbiAgbGV0IGZpbmRfZXhuIH5jb21wYXJhdG9yIHQga2V5ID1cbiAgICBUcmVlMC5maW5kX2V4blxuICAgICAgdFxuICAgICAga2V5XG4gICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICAgIH5zZXhwX29mX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IGZpbmQgfmNvbXBhcmF0b3IgdCBrZXkgPSBUcmVlMC5maW5kIHQga2V5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuXG4gIGxldCByZW1vdmUgfmNvbXBhcmF0b3IgdCBrZXkgPVxuICAgIGZzdCAoVHJlZTAucmVtb3ZlIHQga2V5IH5sZW5ndGg6MCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG1lbSB+Y29tcGFyYXRvciB0IGtleSA9IFRyZWUwLm1lbSB0IGtleSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgbGV0IGl0ZXJfa2V5cyB0IH5mID0gVHJlZTAuaXRlcl9rZXlzIHQgfmZcbiAgbGV0IGl0ZXIgdCB+ZiA9IFRyZWUwLml0ZXIgdCB+ZlxuICBsZXQgaXRlcmkgdCB+ZiA9IFRyZWUwLml0ZXJpIHQgfmZcbiAgbGV0IGl0ZXJpX3VudGlsIHQgfmYgPSBUcmVlMC5pdGVyaV91bnRpbCB0IH5mXG5cbiAgbGV0IGl0ZXIyIH5jb21wYXJhdG9yIHQxIHQyIH5mID1cbiAgICBUcmVlMC5pdGVyMiB0MSB0MiB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgbWFwIHQgfmYgPSBUcmVlMC5tYXAgdCB+ZlxuICBsZXQgbWFwaSB0IH5mID0gVHJlZTAubWFwaSB0IH5mXG4gIGxldCBmb2xkIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkIHQgfmYgfmluaXRcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoID0gVHJlZTAuZm9sZF91bnRpbCB0IH5mIH5pbml0IH5maW5pc2hcbiAgbGV0IGZvbGRfcmlnaHQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfcmlnaHQgdCB+ZiB+aW5pdFxuXG4gIGxldCBmb2xkMiB+Y29tcGFyYXRvciB0MSB0MiB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZDIgdDEgdDIgfmluaXQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9rZXlzIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGZzdCAoVHJlZTAuZmlsdGVyX2tleXMgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGZpbHRlciB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBmc3QgKFRyZWUwLmZpbHRlciB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgZmlsdGVyaSB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBmc3QgKFRyZWUwLmZpbHRlcmkgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXAgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5maWx0ZXJfbWFwIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwaSB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBmc3QgKFRyZWUwLmZpbHRlcl9tYXBpIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fbWFwaSB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBsZXQgKGEsIF8pLCAoYiwgXykgPVxuICAgICAgVHJlZTAucGFydGl0aW9uX21hcGkgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIGEsIGJcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX21hcCB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBsZXQgKGEsIF8pLCAoYiwgXykgPVxuICAgICAgVHJlZTAucGFydGl0aW9uX21hcCB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgYSwgYlxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25pX3RmIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGxldCAoYSwgXyksIChiLCBfKSA9XG4gICAgICBUcmVlMC5wYXJ0aXRpb25pX3RmIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBhLCBiXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl90ZiB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBsZXQgKGEsIF8pLCAoYiwgXykgPVxuICAgICAgVHJlZTAucGFydGl0aW9uX3RmIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBhLCBiXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmVfZXJyb3JzIH5jb21wYXJhdG9yIHQgPVxuICAgIE9yX2Vycm9yLm1hcFxuICAgICAgfmY6ZnN0XG4gICAgICAoVHJlZTAuY29tYmluZV9lcnJvcnNcbiAgICAgICAgIHRcbiAgICAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgICAgfnNleHBfb2Zfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfZGlyZWN0IH5jb21wYXJhdG9yIGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgVHJlZTAuY29tcGFyZSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBjb21wYXJlX2RhdGEgdDEgdDJcbiAgOztcblxuICBsZXQgZXF1YWwgfmNvbXBhcmF0b3IgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICBUcmVlMC5lcXVhbCBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBjb21wYXJlX2RhdGEgdDEgdDJcbiAgOztcblxuICBsZXQga2V5cyB0ID0gVHJlZTAua2V5cyB0XG4gIGxldCBkYXRhIHQgPSBUcmVlMC5kYXRhIHRcbiAgbGV0IHRvX2FsaXN0ID9rZXlfb3JkZXIgdCA9IFRyZWUwLnRvX2FsaXN0ID9rZXlfb3JkZXIgdFxuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiB+Y29tcGFyYXRvciB0MSB0MiB+ZGF0YV9lcXVhbCA9XG4gICAgVHJlZTAuc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH5kYXRhX2VxdWFsXG4gIDs7XG5cbiAgbGV0IGZvbGRfc3ltbWV0cmljX2RpZmYgfmNvbXBhcmF0b3IgdDEgdDIgfmRhdGFfZXF1YWwgfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICAgIHQxXG4gICAgICB0MlxuICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgICB+ZGF0YV9lcXVhbFxuICAgICAgfmluaXRcbiAgICAgIH5mXG4gIDs7XG5cbiAgbGV0IG1lcmdlIH5jb21wYXJhdG9yIHQxIHQyIH5mID1cbiAgICBmc3QgKFRyZWUwLm1lcmdlIHQxIHQyIH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgbWVyZ2Vfc2tld2VkIH5jb21wYXJhdG9yIHQxIHQyIH5jb21iaW5lID1cbiAgICAoKiBMZW5ndGggY29tcHV0YXRpb24gbWFrZXMgdGhpcyBzaWduaWZpY2FudGx5IHNsb3dlciB0aGFuIFttZXJnZV9za2V3ZWRdIG9uIGEgbWFwXG4gICAgICAgd2l0aCBhIFtsZW5ndGhdIGZpZWxkLCBidXQgZG9lcyBwcmVzZXJ2ZSBhbW91bnQgb2YgYWxsb2NhdGlvbi4gKilcbiAgICBmc3RcbiAgICAgIChUcmVlMC5tZXJnZV9za2V3ZWRcbiAgICAgICAgIHQxXG4gICAgICAgICB0MlxuICAgICAgICAgfmxlbmd0aDE6KGxlbmd0aCB0MSlcbiAgICAgICAgIH5sZW5ndGgyOihsZW5ndGggdDIpXG4gICAgICAgICB+Y29tYmluZVxuICAgICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBtaW5fZWx0IHQgPSBUcmVlMC5taW5fZWx0IHRcbiAgbGV0IG1pbl9lbHRfZXhuIHQgPSBUcmVlMC5taW5fZWx0X2V4biB0XG4gIGxldCBtYXhfZWx0IHQgPSBUcmVlMC5tYXhfZWx0IHRcbiAgbGV0IG1heF9lbHRfZXhuIHQgPSBUcmVlMC5tYXhfZWx0X2V4biB0XG4gIGxldCBmb3JfYWxsIHQgfmYgPSBUcmVlMC5mb3JfYWxsIHQgfmZcbiAgbGV0IGZvcl9hbGxpIHQgfmYgPSBUcmVlMC5mb3JfYWxsaSB0IH5mXG4gIGxldCBleGlzdHMgdCB+ZiA9IFRyZWUwLmV4aXN0cyB0IH5mXG4gIGxldCBleGlzdHNpIHQgfmYgPSBUcmVlMC5leGlzdHNpIHQgfmZcbiAgbGV0IGNvdW50IHQgfmYgPSBUcmVlMC5jb3VudCB0IH5mXG4gIGxldCBjb3VudGkgdCB+ZiA9IFRyZWUwLmNvdW50aSB0IH5mXG4gIGxldCBzcGxpdCB+Y29tcGFyYXRvciB0IGsgPSBUcmVlMC5zcGxpdCB0IGsgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG5cbiAgbGV0IGFwcGVuZCB+Y29tcGFyYXRvciB+bG93ZXJfcGFydCB+dXBwZXJfcGFydCA9XG4gICAgVHJlZTAuYXBwZW5kIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBzdWJyYW5nZSB+Y29tcGFyYXRvciB0IH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgPVxuICAgIGxldCBfLCByZXQsIF8gPVxuICAgICAgVHJlZTAuc3BsaXRfcmFuZ2VcbiAgICAgICAgdFxuICAgICAgICB+bG93ZXJfYm91bmRcbiAgICAgICAgfnVwcGVyX2JvdW5kXG4gICAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgcmV0XG4gIDs7XG5cbiAgbGV0IGZvbGRfcmFuZ2VfaW5jbHVzaXZlIH5jb21wYXJhdG9yIHQgfm1pbiB+bWF4IH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgICAgdFxuICAgICAgfm1pblxuICAgICAgfm1heFxuICAgICAgfmluaXRcbiAgICAgIH5mXG4gICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgcmFuZ2VfdG9fYWxpc3QgfmNvbXBhcmF0b3IgdCB+bWluIH5tYXggPVxuICAgIFRyZWUwLnJhbmdlX3RvX2FsaXN0IHQgfm1pbiB+bWF4IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBjbG9zZXN0X2tleSB+Y29tcGFyYXRvciB0IGRpciBrZXkgPVxuICAgIFRyZWUwLmNsb3Nlc3Rfa2V5IHQgZGlyIGtleSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgbnRoIHQgbiA9IFRyZWUwLm50aCB0IG5cbiAgbGV0IG50aF9leG4gdCBuID0gT3B0aW9uLnZhbHVlX2V4biAobnRoIHQgbilcbiAgbGV0IHJhbmsgfmNvbXBhcmF0b3IgdCBrZXkgPSBUcmVlMC5yYW5rIHQga2V5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfayBzZXhwX29mX3YgXyB0ID0gVHJlZTAuc2V4cF9vZl90IHNleHBfb2ZfayBzZXhwX29mX3YgdFxuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yIGtfb2Zfc2V4cCB2X29mX3NleHAgc2V4cCA9XG4gICAgZnN0IChUcmVlMC50X29mX3NleHBfZGlyZWN0IGtfb2Zfc2V4cCB2X29mX3NleHAgc2V4cCB+Y29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgdG9fc2VxdWVuY2UgfmNvbXBhcmF0b3IgP29yZGVyID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2tleXNfbGVzc19vcl9lcXVhbF90byB0ID1cbiAgICBUcmVlMC50b19zZXF1ZW5jZSBjb21wYXJhdG9yID9vcmRlciA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG8gdFxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIH5jb21wYXJhdG9yOl8gdCB+Y29tcGFyZSBob3cgdiA9IFRyZWUwLmJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdlxuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB+Y29tcGFyYXRvcjpfIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBUcmVlMC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvd1xuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlIH5jb21wYXJhdG9yIHQgfmNvbXBhcmUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCA9XG4gICAgbWF0Y2ggVHJlZTAuYmluYXJ5X3NlYXJjaF90d29fc2lkZWRfYm91bmRzIHQgfmNvbXBhcmUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCB3aXRoXG4gICAgfCBTb21lIChsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQpIC0+IHN1YnJhbmdlIH5jb21wYXJhdG9yIHQgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZFxuICAgIHwgTm9uZSAtPiBFbXB0eVxuICA7O1xuXG4gIGxldCBtYXBfa2V5cyB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBtYXRjaCBUcmVlMC5tYXBfa2V5cyB+Y29tcGFyYXRvciB0IH5mIHdpdGhcbiAgICB8IGBPayAodCwgXykgLT4gYE9rIHRcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgZHVwIC0+IGR1cFxuICA7O1xuXG4gIGxldCBtYXBfa2V5c19leG4gfmNvbXBhcmF0b3IgdCB+ZiA9IGZzdCAoVHJlZTAubWFwX2tleXNfZXhuIH5jb21wYXJhdG9yIHQgfmYpXG5cbiAgbW9kdWxlIEJ1aWxkX2luY3JlYXNpbmcgPSBzdHJ1Y3RcbiAgICB0eXBlICgnaywgJ3YsICd3KSB0ID0gKCdrLCAndikgVHJlZTAuQnVpbGRfaW5jcmVhc2luZy50XG5cbiAgICBsZXQgZW1wdHkgPSBUcmVlMC5CdWlsZF9pbmNyZWFzaW5nLmVtcHR5XG5cbiAgICBsZXQgYWRkX2V4biB0IH5jb21wYXJhdG9yIH5rZXkgfmRhdGEgPVxuICAgICAgbWF0Y2ggVHJlZTAuQnVpbGRfaW5jcmVhc2luZy5tYXhfa2V5IHQgd2l0aFxuICAgICAgfCBTb21lIHByZXZfa2V5IHdoZW4gY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgcHJldl9rZXkga2V5ID49IDAgLT5cbiAgICAgICAgRXJyb3IucmFpc2VfcyAoU2V4cC5BdG9tIFwiTWFwLkJ1aWxkX2luY3JlYXNpbmcuYWRkOiBub24taW5jcmVhc2luZyBrZXlcIilcbiAgICAgIHwgXyAtPiBUcmVlMC5CdWlsZF9pbmNyZWFzaW5nLmFkZF91bmNoZWNrZWQgdCB+a2V5IH5kYXRhXG4gICAgOztcblxuICAgIGxldCB0b190cmVlIHQgPSBUcmVlMC5CdWlsZF9pbmNyZWFzaW5nLnRvX3RyZWVfdW5jaGVja2VkIHRcbiAgZW5kXG5lbmRcblxubW9kdWxlIFVzaW5nX2NvbXBhcmF0b3IgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgKCdrLCAndiwgJ2NtcCkgdCA9ICgnaywgJ3YsICdjbXApIHRcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCBlbXB0eSB+Y29tcGFyYXRvciA9IHsgdHJlZSA9IFRyZWUwLmVtcHR5OyBjb21wYXJhdG9yOyBsZW5ndGggPSAwIH1cbiAgbGV0IHNpbmdsZXRvbiB+Y29tcGFyYXRvciBrIHYgPSB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5zaW5nbGV0b24gayB2OyBsZW5ndGggPSAxIH1cbiAgbGV0IG9mX3RyZWUwIH5jb21wYXJhdG9yICh0cmVlLCBsZW5ndGgpID0geyBjb21wYXJhdG9yOyB0cmVlOyBsZW5ndGggfVxuICBsZXQgb2ZfdHJlZSB+Y29tcGFyYXRvciB0cmVlID0gb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKHRyZWUsIFRyZWUwLmxlbmd0aCB0cmVlKVxuICBsZXQgdG9fdHJlZSA9IHRvX3RyZWVcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgT3JfZXJyb3IubWFwXG4gICAgICAoVHJlZTAub2Zfc29ydGVkX2FycmF5IGFycmF5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgICAgIH5mOihmdW4gdHJlZSAtPiBvZl90cmVlMCB+Y29tcGFyYXRvciB0cmVlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdCB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgbWF0Y2ggVHJlZTAub2ZfYWxpc3QgYWxpc3QgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBPayAodHJlZSwgbGVuZ3RoKSAtPiBgT2sgeyBjb21wYXJhdG9yOyB0cmVlOyBsZW5ndGggfVxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyB6IC0+IHpcbiAgOztcblxuICBsZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIFJlc3VsdC5tYXAgKFRyZWUwLm9mX2FsaXN0X29yX2Vycm9yIGFsaXN0IH5jb21wYXJhdG9yKSB+ZjooZnVuIHRyZWUgLT5cbiAgICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIHRyZWUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X2V4biB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLm9mX2FsaXN0X2V4biBhbGlzdCB+Y29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfbXVsdGkgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX2FsaXN0X211bHRpIGFsaXN0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfZm9sZCB+Y29tcGFyYXRvciBhbGlzdCB+aW5pdCB+ZiA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2ZfYWxpc3RfZm9sZCBhbGlzdCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X3JlZHVjZSB+Y29tcGFyYXRvciBhbGlzdCB+ZiA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2ZfYWxpc3RfcmVkdWNlIGFsaXN0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfaXRlcmkgfmNvbXBhcmF0b3Igfml0ZXJpID1cbiAgICBtYXRjaCBUcmVlMC5vZl9pdGVyaSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfml0ZXJpIHdpdGhcbiAgICB8IGBPayB0cmVlX2xlbmd0aCAtPiBgT2sgKG9mX3RyZWUwIH5jb21wYXJhdG9yIHRyZWVfbGVuZ3RoKVxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyB6IC0+IHpcbiAgOztcblxuICBsZXQgb2ZfaXRlcmlfZXhuIH5jb21wYXJhdG9yIH5pdGVyaSA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLm9mX2l0ZXJpX2V4biB+Y29tcGFyYXRvciB+aXRlcmkpXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yIH5sZW4gfmYgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mLCBsZW4pXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBPcl9lcnJvci5tYXBcbiAgICAgIH5mOihvZl90cmVlMCB+Y29tcGFyYXRvcilcbiAgICAgIChUcmVlMC5vZl9pbmNyZWFzaW5nX3NlcXVlbmNlIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgbWF0Y2ggVHJlZTAub2Zfc2VxdWVuY2Ugc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgT2sgKHRyZWUsIGxlbmd0aCkgLT4gYE9rIHsgY29tcGFyYXRvcjsgdHJlZTsgbGVuZ3RoIH1cbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgeiAtPiB6XG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX29yX2Vycm9yIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgUmVzdWx0Lm1hcCAoVHJlZTAub2Zfc2VxdWVuY2Vfb3JfZXJyb3Igc2VxIH5jb21wYXJhdG9yKSB+ZjooZnVuIHRyZWUgLT5cbiAgICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIHRyZWUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX2V4biB+Y29tcGFyYXRvciBzZXEgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC5vZl9zZXF1ZW5jZV9leG4gc2VxIH5jb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9tdWx0aSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX3NlcXVlbmNlX211bHRpIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX2ZvbGQgfmNvbXBhcmF0b3Igc2VxIH5pbml0IH5mID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9zZXF1ZW5jZV9mb2xkIHNlcSB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX3JlZHVjZSB+Y29tcGFyYXRvciBzZXEgfmYgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX3NlcXVlbmNlX3JlZHVjZSBzZXEgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yIGtfb2Zfc2V4cCB2X29mX3NleHAgc2V4cCA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLnRfb2Zfc2V4cF9kaXJlY3Qga19vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwIH5jb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBtYXBfa2V5cyB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBtYXRjaCBUcmVlMC5tYXBfa2V5cyB0LnRyZWUgfmYgfmNvbXBhcmF0b3Igd2l0aFxuICAgIHwgYE9rIHBhaXIgLT4gYE9rIChvZl90cmVlMCB+Y29tcGFyYXRvciBwYWlyKVxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyBkdXAgLT4gZHVwXG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzX2V4biB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAubWFwX2tleXNfZXhuIHQudHJlZSB+ZiB+Y29tcGFyYXRvcilcbiAgOztcblxuICBtb2R1bGUgRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoSyA6IENvbXBhcmF0b3IuUzEpID0gc3RydWN0XG4gICAgbGV0IGVtcHR5ID0geyB0cmVlID0gVHJlZTAuZW1wdHk7IGNvbXBhcmF0b3IgPSBLLmNvbXBhcmF0b3I7IGxlbmd0aCA9IDAgfVxuICBlbmRcblxuICBtb2R1bGUgVHJlZSA9IFRyZWVcbmVuZFxuXG5pbmNsdWRlIEFjY2Vzc29yc1xuXG50eXBlICgnaywgJ2NtcCkgY29tcGFyYXRvciA9XG4gIChtb2R1bGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0ID0gJ2sgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gJ2NtcClcblxubGV0IGNvbXBhcmF0b3JfcyAodHlwZSBrIGNtcCkgdCA6IChrLCBjbXApIGNvbXBhcmF0b3IgPVxuICAobW9kdWxlIHN0cnVjdFxuICAgIHR5cGUgdCA9IGtcbiAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IGNtcFxuXG4gICAgbGV0IGNvbXBhcmF0b3IgPSB0LmNvbXBhcmF0b3JcbiAgZW5kKVxuOztcblxubGV0IHRvX2NvbXBhcmF0b3IgKHR5cGUgayBjbXApICgobW9kdWxlIE0pIDogKGssIGNtcCkgY29tcGFyYXRvcikgPSBNLmNvbXBhcmF0b3JcblxubGV0IG9mX3RyZWUgKHR5cGUgayBjbXApICgobW9kdWxlIE0pIDogKGssIGNtcCkgY29tcGFyYXRvcikgdHJlZSA9XG4gIG9mX3RyZWUgfmNvbXBhcmF0b3I6TS5jb21wYXJhdG9yIHRyZWVcbjs7XG5cbmxldCBlbXB0eSBtID0gVXNpbmdfY29tcGFyYXRvci5lbXB0eSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKVxubGV0IHNpbmdsZXRvbiBtIGEgPSBVc2luZ19jb21wYXJhdG9yLnNpbmdsZXRvbiB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2ZfYWxpc3QgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5cbmxldCBvZl9hbGlzdF9vcl9lcnJvciBtIGEgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X29yX2Vycm9yIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbjs7XG5cbmxldCBvZl9hbGlzdF9leG4gbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9leG4gfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX2FsaXN0X211bHRpIG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfbXVsdGkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuXG5sZXQgb2ZfYWxpc3RfZm9sZCBtIGEgfmluaXQgfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X2ZvbGQgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYSB+aW5pdCB+ZlxuOztcblxubGV0IG9mX2FsaXN0X3JlZHVjZSBtIGEgfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X3JlZHVjZSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhIH5mXG47O1xuXG5sZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBtIGEgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuOztcblxubGV0IG9mX3NvcnRlZF9hcnJheSBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2ZfaXRlcmkgbSB+aXRlcmkgPSBVc2luZ19jb21wYXJhdG9yLm9mX2l0ZXJpIH5pdGVyaSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKVxuXG5sZXQgb2ZfaXRlcmlfZXhuIG0gfml0ZXJpID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9pdGVyaV9leG4gfml0ZXJpIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pXG47O1xuXG5sZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgbSB+bGVuIH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pXG47O1xuXG5sZXQgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBtIHNlcSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzZXFcbjs7XG5cbmxldCBvZl9zZXF1ZW5jZSBtIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHNcblxubGV0IG9mX3NlcXVlbmNlX29yX2Vycm9yIG0gcyA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2Vfb3JfZXJyb3IgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgc1xuOztcblxubGV0IG9mX3NlcXVlbmNlX2V4biBtIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX2V4biB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzXG5cbmxldCBvZl9zZXF1ZW5jZV9tdWx0aSBtIHMgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX211bHRpIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHNcbjs7XG5cbmxldCBvZl9zZXF1ZW5jZV9mb2xkIG0gcyB+aW5pdCB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfZm9sZCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzIH5pbml0IH5mXG47O1xuXG5sZXQgb2Zfc2VxdWVuY2VfcmVkdWNlIG0gcyB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfcmVkdWNlIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHMgfmZcbjs7XG5cbmxldCBtYXBfa2V5cyBtIHQgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcF9rZXlzIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHQgfmZcbmxldCBtYXBfa2V5c19leG4gbSB0IH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXBfa2V5c19leG4gfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgdCB+ZlxuXG5tb2R1bGUgTSAoSyA6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgbm9ucmVjICd2IHQgPSAoSy50LCAndiwgSy5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICBbQEBAZW5kXVxuXG4gIGluY2x1ZGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0IDo9IHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBDb21wYXJlX20gPSBzaWcgZW5kXG5tb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxubW9kdWxlIHR5cGUgSGFzaF9mb2xkX20gPSBIYXNoZXIuU1xuXG5sZXQgc2V4cF9vZl9tX190ICh0eXBlIGspIChtb2R1bGUgSyA6IFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9IGspIHNleHBfb2ZfdiB0ID1cbiAgc2V4cF9vZl90IEsuc2V4cF9vZl90IHNleHBfb2ZfdiAoZnVuIF8gLT4gU2V4cC5BdG9tIFwiX1wiKSB0XG47O1xuXG5sZXQgbV9fdF9vZl9zZXhwXG4gICAgICAodHlwZSBrIGNtcClcbiAgICAgIChtb2R1bGUgSyA6IE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9IGsgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gY21wKVxuICAgICAgdl9vZl9zZXhwXG4gICAgICBzZXhwXG4gID1cbiAgVXNpbmdfY29tcGFyYXRvci50X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yOksuY29tcGFyYXRvciBLLnRfb2Zfc2V4cCB2X29mX3NleHAgc2V4cFxuOztcblxubGV0IG1fX3Rfc2V4cF9ncmFtbWFyXG4gICAgICAodHlwZSBrKVxuICAgICAgKG1vZHVsZSBLIDogTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSBrKVxuICAgICAgKHZfZ3JhbW1hciA6IF8gU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogXyBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIHsgdW50eXBlZCA9XG4gICAgICBMaXN0XG4gICAgICAgIChNYW55IChMaXN0IChDb25zIChLLnRfc2V4cF9ncmFtbWFyLnVudHlwZWQsIENvbnMgKHZfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkpKSkpXG4gIH1cbjs7XG5cbmxldCBjb21wYXJlX21fX3QgKG1vZHVsZSBfIDogQ29tcGFyZV9tKSBjb21wYXJlX3YgdDEgdDIgPSBjb21wYXJlX2RpcmVjdCBjb21wYXJlX3YgdDEgdDJcbmxldCBlcXVhbF9tX190IChtb2R1bGUgXyA6IEVxdWFsX20pIGVxdWFsX3YgdDEgdDIgPSBlcXVhbCBlcXVhbF92IHQxIHQyXG5cbmxldCBoYXNoX2ZvbGRfbV9fdCAodHlwZSBrKSAobW9kdWxlIEsgOiBIYXNoX2ZvbGRfbSB3aXRoIHR5cGUgdCA9IGspIGhhc2hfZm9sZF92IHN0YXRlID1cbiAgaGFzaF9mb2xkX2RpcmVjdCBLLmhhc2hfZm9sZF90IGhhc2hfZm9sZF92IHN0YXRlXG47O1xuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAoJ2ssICd2KSB0ID0gKCdrLCAndiwgQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICB0eXBlIG5vbnJlYyAoJ2ssICd2KSB0cmVlID0gKCdrLCAndikgVHJlZTAudFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3NcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCBjb21wYXJhdG9yID0gQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3JcbiAgbGV0IG9mX3RyZWUgdHJlZSA9IHsgdHJlZTsgY29tcGFyYXRvcjsgbGVuZ3RoID0gVHJlZTAubGVuZ3RoIHRyZWUgfVxuXG4gIGluY2x1ZGUgVXNpbmdfY29tcGFyYXRvci5FbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChDb21wYXJhdG9yLlBvbHkpXG5cbiAgbGV0IHNpbmdsZXRvbiBhID0gVXNpbmdfY29tcGFyYXRvci5zaW5nbGV0b24gfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYWxpc3QgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3QgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3Rfb3JfZXJyb3IgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYWxpc3RfZXhuIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X2V4biB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hbGlzdF9tdWx0aSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9tdWx0aSB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hbGlzdF9mb2xkIGEgfmluaXQgfmYgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X2ZvbGQgfmNvbXBhcmF0b3IgYSB+aW5pdCB+ZlxuICBsZXQgb2ZfYWxpc3RfcmVkdWNlIGEgfmYgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X3JlZHVjZSB+Y29tcGFyYXRvciBhIH5mXG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYSA9XG4gICAgVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGFcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9pdGVyaSB+aXRlcmkgPSBVc2luZ19jb21wYXJhdG9yLm9mX2l0ZXJpIH5pdGVyaSB+Y29tcGFyYXRvclxuICBsZXQgb2ZfaXRlcmlfZXhuIH5pdGVyaSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfaXRlcmlfZXhuIH5pdGVyaSB+Y29tcGFyYXRvclxuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mID1cbiAgICBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgfmNvbXBhcmF0b3JcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBzZXEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc2VxXG4gIGxldCBvZl9zZXF1ZW5jZSBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBzXG4gIGxldCBvZl9zZXF1ZW5jZV9vcl9lcnJvciBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9vcl9lcnJvciB+Y29tcGFyYXRvciBzXG4gIGxldCBvZl9zZXF1ZW5jZV9leG4gcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfZXhuIH5jb21wYXJhdG9yIHNcbiAgbGV0IG9mX3NlcXVlbmNlX211bHRpIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX211bHRpIH5jb21wYXJhdG9yIHNcblxuICBsZXQgb2Zfc2VxdWVuY2VfZm9sZCBzIH5pbml0IH5mID1cbiAgICBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX2ZvbGQgfmNvbXBhcmF0b3IgcyB+aW5pdCB+ZlxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9yZWR1Y2UgcyB+ZiA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfcmVkdWNlIH5jb21wYXJhdG9yIHMgfmZcbiAgbGV0IG1hcF9rZXlzIHQgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcF9rZXlzIH5jb21wYXJhdG9yIHQgfmZcbiAgbGV0IG1hcF9rZXlzX2V4biB0IH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXBfa2V5c19leG4gfmNvbXBhcmF0b3IgdCB+ZlxuZW5kXG4iLCJvcGVuISBJbXBvcnQwXG5cbnR5cGUgJ2EgdCA9ICdhIENhbWwuUXVldWUudFxuXG5sZXQgY3JlYXRlID0gQ2FtbC5RdWV1ZS5jcmVhdGVcbmxldCBjbGVhciA9IENhbWwuUXVldWUuY2xlYXJcbmxldCBjb3B5ID0gQ2FtbC5RdWV1ZS5jb3B5XG5sZXQgaXNfZW1wdHkgPSBDYW1sLlF1ZXVlLmlzX2VtcHR5XG5sZXQgbGVuZ3RoID0gQ2FtbC5RdWV1ZS5sZW5ndGhcbmxldCBwZWVrID0gQ2FtbC5RdWV1ZS5wZWVrXG5sZXQgcG9wID0gQ2FtbC5RdWV1ZS5wb3BcbmxldCBwdXNoID0gQ2FtbC5RdWV1ZS5wdXNoXG5sZXQgdHJhbnNmZXIgPSBDYW1sLlF1ZXVlLnRyYW5zZmVyXG5sZXQgaXRlciB0IH5mID0gQ2FtbC5RdWV1ZS5pdGVyIGYgdFxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9IENhbWwuUXVldWUuZm9sZCBmIGluaXQgdFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIExpbmtlZF9xdWV1ZTBcblxubGV0IGVucXVldWUgdCB4ID0gTGlua2VkX3F1ZXVlMC5wdXNoIHggdFxubGV0IGRlcXVldWUgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAoTGlua2VkX3F1ZXVlMC5wb3AgdClcbmxldCBkZXF1ZXVlX2V4biA9IExpbmtlZF9xdWV1ZTAucG9wXG5sZXQgcGVlayB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChMaW5rZWRfcXVldWUwLnBlZWsgdClcbmxldCBwZWVrX2V4biA9IExpbmtlZF9xdWV1ZTAucGVla1xuXG5tb2R1bGUgQyA9IEluZGV4ZWRfY29udGFpbmVyLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgZm9sZCA9IGZvbGRcbiAgICBsZXQgaXRlciA9IGBDdXN0b20gaXRlclxuICAgIGxldCBsZW5ndGggPSBgQ3VzdG9tIGxlbmd0aFxuICAgIGxldCBmb2xkaSA9IGBEZWZpbmVfdXNpbmdfZm9sZFxuICAgIGxldCBpdGVyaSA9IGBEZWZpbmVfdXNpbmdfZm9sZFxuICBlbmQpXG5cbmxldCBjb3VudCA9IEMuY291bnRcbmxldCBleGlzdHMgPSBDLmV4aXN0c1xubGV0IGZpbmQgPSBDLmZpbmRcbmxldCBmaW5kX21hcCA9IEMuZmluZF9tYXBcbmxldCBmb2xkX3Jlc3VsdCA9IEMuZm9sZF9yZXN1bHRcbmxldCBmb2xkX3VudGlsID0gQy5mb2xkX3VudGlsXG5sZXQgZm9yX2FsbCA9IEMuZm9yX2FsbFxubGV0IG1heF9lbHQgPSBDLm1heF9lbHRcbmxldCBtZW0gPSBDLm1lbVxubGV0IG1pbl9lbHQgPSBDLm1pbl9lbHRcbmxldCBzdW0gPSBDLnN1bVxubGV0IHRvX2xpc3QgPSBDLnRvX2xpc3RcbmxldCBjb3VudGkgPSBDLmNvdW50aVxubGV0IGV4aXN0c2kgPSBDLmV4aXN0c2lcbmxldCBmaW5kX21hcGkgPSBDLmZpbmRfbWFwaVxubGV0IGZpbmRpID0gQy5maW5kaVxubGV0IGZvbGRpID0gQy5mb2xkaVxubGV0IGZvcl9hbGxpID0gQy5mb3JfYWxsaVxubGV0IGl0ZXJpID0gQy5pdGVyaVxubGV0IHRyYW5zZmVyIH5zcmMgfmRzdCA9IExpbmtlZF9xdWV1ZTAudHJhbnNmZXIgc3JjIGRzdFxuXG5sZXQgY29uY2F0X21hcCB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+IExpc3QuaXRlciAoZiBhKSB+ZjooZnVuIGIgLT4gZW5xdWV1ZSByZXMgYikpO1xuICByZXNcbjs7XG5cbmxldCBjb25jYXRfbWFwaSB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+IExpc3QuaXRlciAoZiBpIGEpIH5mOihmdW4gYiAtPiBlbnF1ZXVlIHJlcyBiKSk7XG4gIHJlc1xuOztcblxubGV0IGZpbHRlcl9tYXAgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPlxuICAgIG1hdGNoIGYgYSB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIGIgLT4gZW5xdWV1ZSByZXMgYik7XG4gIHJlc1xuOztcblxubGV0IGZpbHRlcl9tYXBpIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT5cbiAgICBtYXRjaCBmIGkgYSB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIGIgLT4gZW5xdWV1ZSByZXMgYik7XG4gIHJlc1xuOztcblxubGV0IGZpbHRlciB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+IGlmIGYgYSB0aGVuIGVucXVldWUgcmVzIGEpO1xuICByZXNcbjs7XG5cbmxldCBmaWx0ZXJpIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT4gaWYgZiBpIGEgdGhlbiBlbnF1ZXVlIHJlcyBhKTtcbiAgcmVzXG47O1xuXG5sZXQgbWFwIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT4gZW5xdWV1ZSByZXMgKGYgYSkpO1xuICByZXNcbjs7XG5cbmxldCBtYXBpIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT4gZW5xdWV1ZSByZXMgKGYgaSBhKSk7XG4gIHJlc1xuOztcblxubGV0IGZpbHRlcl9pbnBsYWNlIHEgfmYgPVxuICBsZXQgcScgPSBmaWx0ZXIgcSB+ZiBpblxuICBjbGVhciBxO1xuICB0cmFuc2ZlciB+c3JjOnEnIH5kc3Q6cVxuOztcblxubGV0IGZpbHRlcmlfaW5wbGFjZSBxIH5mID1cbiAgbGV0IHEnID0gZmlsdGVyaSBxIH5mIGluXG4gIGNsZWFyIHE7XG4gIHRyYW5zZmVyIH5zcmM6cScgfmRzdDpxXG47O1xuXG5sZXQgZW5xdWV1ZV9hbGwgdCBsaXN0ID0gTGlzdC5pdGVyIGxpc3QgfmY6KGZ1biB4IC0+IGVucXVldWUgdCB4KVxuXG5sZXQgb2ZfbGlzdCBsaXN0ID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgTGlzdC5pdGVyIGxpc3QgfmY6KGZ1biB4IC0+IGVucXVldWUgdCB4KTtcbiAgdFxuOztcblxubGV0IG9mX2FycmF5IGFycmF5ID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgQXJyYXkuaXRlciBhcnJheSB+ZjooZnVuIHggLT4gZW5xdWV1ZSB0IHgpO1xuICB0XG47O1xuXG5sZXQgaW5pdCBsZW4gfmYgPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgIGVucXVldWUgdCAoZiBpKVxuICBkb25lO1xuICB0XG47O1xuXG5sZXQgdG9fYXJyYXkgdCA9XG4gIG1hdGNoIGxlbmd0aCB0IHdpdGhcbiAgfCAwIC0+IFt8fF1cbiAgfCBsZW4gLT5cbiAgICBsZXQgYXJyID0gQXJyYXkuY3JlYXRlIH5sZW4gKHBlZWtfZXhuIHQpIGluXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGl0ZXIgdCB+ZjooZnVuIHYgLT5cbiAgICAgIGFyci4oIWkpIDwtIHY7XG4gICAgICBpbmNyIGkpO1xuICAgIGFyclxuOztcblxubGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCA9IG9mX2xpc3QgKGxpc3Rfb2Zfc2V4cCBhX29mX3NleHAgc2V4cClcbmxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPSBzZXhwX29mX2xpc3Qgc2V4cF9vZl9hICh0b19saXN0IHQpXG5cbmxldCB0X3NleHBfZ3JhbW1hciAodHlwZSBhKSAoZ3JhbW1hciA6IGEgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoTGlzdC50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuOztcblxubGV0IHNpbmdsZXRvbiBhID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgZW5xdWV1ZSB0IGE7XG4gIHRcbjs7XG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIENhbWwuSW50NjRcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50NjQgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2ludDY0XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9pbnQ2NCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoaW50NjRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfaW50NjQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gaW50NjRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5cbiAgbGV0IGNvbXBhcmUgPSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuY29tcGFyZVxuICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gIGxldCBvZl9zdHJpbmcgPSBvZl9zdHJpbmdcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG5sZXQgbnVtX2JpdHMgPSA2NFxubGV0IGZsb2F0X2xvd2VyX2JvdW5kID0gRmxvYXQwLmxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF91cHBlcl9ib3VuZCA9IEZsb2F0MC51cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfb2ZfYml0cyA9IGZsb2F0X29mX2JpdHNcbmxldCBiaXRzX29mX2Zsb2F0ID0gYml0c19vZl9mbG9hdFxubGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5sZXQgc2hpZnRfcmlnaHQgPSBzaGlmdF9yaWdodFxubGV0IHNoaWZ0X2xlZnQgPSBzaGlmdF9sZWZ0XG5sZXQgYml0X25vdCA9IGxvZ25vdFxubGV0IGJpdF94b3IgPSBsb2d4b3JcbmxldCBiaXRfb3IgPSBsb2dvclxubGV0IGJpdF9hbmQgPSBsb2dhbmRcbmxldCBtaW5fdmFsdWUgPSBtaW5faW50XG5sZXQgbWF4X3ZhbHVlID0gbWF4X2ludFxubGV0IGFicyA9IGFic1xubGV0IHByZWQgPSBwcmVkXG5sZXQgc3VjYyA9IHN1Y2NcbmxldCBwb3cgPSBJbnRfbWF0aC5Qcml2YXRlLmludDY0X3Bvd1xubGV0IHJlbSA9IHJlbVxubGV0IG5lZyA9IG5lZ1xubGV0IG1pbnVzX29uZSA9IG1pbnVzX29uZVxubGV0IG9uZSA9IG9uZVxubGV0IHplcm8gPSB6ZXJvXG5sZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxubGV0IG9mX2Zsb2F0X3VuY2hlY2tlZCA9IENhbWwuSW50NjQub2ZfZmxvYXRcblxubGV0IG9mX2Zsb2F0IGYgPVxuICBpZiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIGYgZmxvYXRfbG93ZXJfYm91bmRcbiAgJiYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSBmIGZsb2F0X3VwcGVyX2JvdW5kXG4gIHRoZW4gQ2FtbC5JbnQ2NC5vZl9mbG9hdCBmXG4gIGVsc2VcbiAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICBcIkludDY0Lm9mX2Zsb2F0OiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggZilcbiAgICAgICgpXG47O1xuXG5sZXQgKCAqKiApIGIgZSA9IHBvdyBiIGVcblxuZXh0ZXJuYWwgYnN3YXA2NCA6IHQgLT4gdCA9IFwiJWJzd2FwX2ludDY0XCJcblxubGV0W0BpbmxpbmUgYWx3YXlzXSBic3dhcDE2IHggPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJzd2FwNjQgeCkgNDhcblxubGV0W0BpbmxpbmUgYWx3YXlzXSBic3dhcDMyIHggPVxuICAoKiBUaGlzIGlzIHN0cmljdGx5IGJldHRlciB0aGFuIGNvZXJjaW5nIHRvIGFuIGludDMyIHRvIHBlcmZvcm0gYnl0ZXN3YXAuIENvZXJjaW5nXG4gICAgIGZyb20gYW4gaW50MzIgd2lsbCBhZGQgdW5uZWNlc3Nhcnkgc2hpZnQgb3BlcmF0aW9ucyB0byBzaWduIGV4dGVuZCB0aGUgbnVtYmVyXG4gICAgIGFwcHJvcHJpYXRlbHkuXG4gICopXG4gIENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCAoYnN3YXA2NCB4KSAzMlxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSBic3dhcDQ4IHggPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJzd2FwNjQgeCkgMTZcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxubGV0IGluY3IgciA9IHIgOj0gYWRkICFyIG9uZVxubGV0IGRlY3IgciA9IHIgOj0gc3ViICFyIG9uZVxuXG5leHRlcm5hbCBvZl9pbnQ2NCA6IHQgLT4gdCA9IFwiJWlkZW50aXR5XCJcblxubGV0IG9mX2ludDY0X2V4biA9IG9mX2ludDY0XG5sZXQgdG9faW50NjQgdCA9IHRcbmxldCBwb3Bjb3VudCA9IFBvcGNvdW50LmludDY0X3BvcGNvdW50XG5cbm1vZHVsZSBDb252ID0gSW50X2NvbnZlcnNpb25zXG5cbmV4dGVybmFsIHRvX2ludF90cnVuYyA6IHQgLT4gaW50ID0gXCIlaW50NjRfdG9faW50XCJcbmV4dGVybmFsIHRvX2ludDMyX3RydW5jIDogaW50NjQgLT4gaW50MzIgPSBcIiVpbnQ2NF90b19pbnQzMlwiXG5leHRlcm5hbCB0b19uYXRpdmVpbnRfdHJ1bmMgOiBpbnQ2NCAtPiBuYXRpdmVpbnQgPSBcIiVpbnQ2NF90b19uYXRpdmVpbnRcIlxuZXh0ZXJuYWwgb2ZfaW50IDogaW50IC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50XCJcbmV4dGVybmFsIG9mX2ludDMyIDogaW50MzIgLT4gaW50NjQgPSBcIiVpbnQ2NF9vZl9pbnQzMlwiXG5cbmxldCBvZl9pbnRfZXhuID0gb2ZfaW50XG5sZXQgdG9faW50ID0gQ29udi5pbnQ2NF90b19pbnRcbmxldCB0b19pbnRfZXhuID0gQ29udi5pbnQ2NF90b19pbnRfZXhuXG5sZXQgb2ZfaW50MzJfZXhuID0gb2ZfaW50MzJcbmxldCB0b19pbnQzMiA9IENvbnYuaW50NjRfdG9faW50MzJcbmxldCB0b19pbnQzMl9leG4gPSBDb252LmludDY0X3RvX2ludDMyX2V4blxubGV0IG9mX25hdGl2ZWludCA9IENvbnYubmF0aXZlaW50X3RvX2ludDY0XG5sZXQgb2ZfbmF0aXZlaW50X2V4biA9IG9mX25hdGl2ZWludFxubGV0IHRvX25hdGl2ZWludCA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50XG5sZXQgdG9fbmF0aXZlaW50X2V4biA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50X2V4blxuXG5tb2R1bGUgUG93MiA9IHN0cnVjdFxuICBvcGVuISBJbXBvcnRcbiAgb3BlbiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuICBsZXQgbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpID1cbiAgICBQcmludGYuaW52YWxpZF9hcmdmIFwiYXJndW1lbnQgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZVwiICgpXG4gIDs7XG5cbiAgbGV0ICggbG9yICkgPSBDYW1sLkludDY0LmxvZ29yXG4gIGxldCAoIGxzciApID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsXG4gIGxldCAoIGxhbmQgKSA9IENhbWwuSW50NjQubG9nYW5kXG5cbiAgKCoqIFwiY2VpbGluZyBwb3dlciBvZiAyXCIgLSBMZWFzdCBwb3dlciBvZiAyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgY2VpbF9wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQ2NC56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0gQ2FtbC5JbnQ2NC5wcmVkIHggaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIENhbWwuSW50NjQuc3VjYyB4XG4gIDs7XG5cbiAgKCoqIFwiZmxvb3IgcG93ZXIgb2YgMlwiIC0gTGFyZ2VzdCBwb3dlciBvZiAyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgZmxvb3JfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50NjQuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIENhbWwuSW50NjQuc3ViIHggKHggbHNyIDEpXG4gIDs7XG5cbiAgbGV0IGlzX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDY0Lnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgeCBsYW5kIENhbWwuSW50NjQucHJlZCB4ID0gQ2FtbC5JbnQ2NC56ZXJvXG4gIDs7XG5cbiAgKCogQyBzdHVicyBmb3IgaW50IGNseiBhbmQgY3R6IHRvIHVzZSB0aGUgQ0xaL0JTUi9DVFovQlNGIGluc3RydWN0aW9uIHdoZXJlIHBvc3NpYmxlICopXG4gIGV4dGVybmFsIGNselxuICAgIDogIChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludDY0X2NselwiIFwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jbHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY3R6XG4gICAgOiAgKGludDY0W0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50NjRfY3R6XCIgXCJCYXNlX2ludF9tYXRoX2ludDY0X2N0el91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBmbG9vcl9sb2cyIGkgPVxuICAgIGlmIGkgPD0gQ2FtbC5JbnQ2NC56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlIFwiW0ludDY0LmZsb29yX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludDY0IGkgXSk7XG4gICAgbnVtX2JpdHMgLSAxIC0gY2x6IGlcbiAgOztcblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBjZWlsX2xvZzIgaSA9XG4gICAgaWYgUG9seS4oIDw9ICkgaSBDYW1sLkludDY0Lnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSW50NjQuY2VpbF9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQ2NCBpIF0pO1xuICAgIGlmIENhbWwuSW50NjQuZXF1YWwgaSBDYW1sLkludDY0Lm9uZSB0aGVuIDAgZWxzZSBudW1fYml0cyAtIGNseiAoQ2FtbC5JbnQ2NC5wcmVkIGkpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBQb3cyXG5pbmNsdWRlIENvbnYuTWFrZSAoVClcblxuaW5jbHVkZSBDb252Lk1ha2VfaGV4IChzdHJ1Y3RcbiAgICB0eXBlIHQgPSBpbnQ2NCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKGNvbXBhcmVfaW50NjQgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgaGFzaF9mb2xkX2ludDY0XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IGhhc2hfaW50NjQgaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gICAgbGV0IG5lZyA9IG5lZ1xuICAgIGxldCAoIDwgKSA9ICggPCApXG4gICAgbGV0IHRvX3N0cmluZyBpID0gUHJpbnRmLnNwcmludGYgXCIlTHhcIiBpXG4gICAgbGV0IG9mX3N0cmluZyBzID0gQ2FtbC5TY2FuZi5zc2NhbmYgcyBcIiVMeFwiIEZuLmlkXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDY0LkhleFwiXG4gIGVuZClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50NjRcIlxuICBlbmQpXG5cbm1vZHVsZSBQcmVfTyA9IHN0cnVjdFxuICBleHRlcm5hbCAoICsgKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfYWRkXCJcbiAgZXh0ZXJuYWwgKCAtICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X3N1YlwiXG4gIGV4dGVybmFsICggKiApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9tdWxcIlxuICBleHRlcm5hbCAoIC8gKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfZGl2XCJcbiAgZXh0ZXJuYWwgKCB+LSApIDogdCAtPiB0ID0gXCIlaW50NjRfbmVnXCJcblxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgYWJzID0gYWJzXG5cbiAgZXh0ZXJuYWwgbmVnIDogdCAtPiB0ID0gXCIlaW50NjRfbmVnXCJcblxuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludF9leG4gPSBvZl9pbnRfZXhuXG5lbmRcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmVfT1xuXG4gIGluY2x1ZGUgSW50X21hdGguTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBpbmNsdWRlIFByZV9PXG5cbiAgICAgIGxldCByZW0gPSByZW1cbiAgICAgIGxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG4gICAgICBsZXQgb2ZfZmxvYXQgPSBvZl9mbG9hdFxuICAgICAgbGV0IG9mX3N0cmluZyA9IFQub2Zfc3RyaW5nXG4gICAgICBsZXQgdG9fc3RyaW5nID0gVC50b19zdHJpbmdcbiAgICBlbmQpXG5cbiAgZXh0ZXJuYWwgKCBsYW5kICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X2FuZFwiXG4gIGV4dGVybmFsICggbG9yICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X29yXCJcbiAgZXh0ZXJuYWwgKCBseG9yICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X3hvclwiXG5cbiAgbGV0IGxub3QgPSBiaXRfbm90XG5cbiAgZXh0ZXJuYWwgKCBsc2wgKSA6IHQgLT4gaW50IC0+IHQgPSBcIiVpbnQ2NF9sc2xcIlxuICBleHRlcm5hbCAoIGFzciApIDogdCAtPiBpbnQgLT4gdCA9IFwiJWludDY0X2FzclwiXG4gIGV4dGVybmFsICggbHNyICkgOiB0IC0+IGludCAtPiB0ID0gXCIlaW50NjRfbHNyXCJcbmVuZFxuXG5pbmNsdWRlIE9cblxuKCogW0ludDY0XSBhbmQgW0ludDY0Lk9dIGFncmVlIHZhbHVlLXdpc2UgKilcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwiKCogQSA2M2JpdCBpbnRlZ2VyIGlzIGEgNjRiaXQgaW50ZWdlciB3aXRoIGl0cyBiaXRzIHNoaWZ0ZWQgdG8gdGhlIGxlZnRcbiAgIGFuZCBpdHMgbG93ZXN0IGJpdCBzZXQgdG8gMC5cbiAgIFRoaXMgaXMgdGhlIHNhbWUga2luZCBvZiBlbmNvZGluZyBhcyBPQ2FtbCBpbnQgb24gNjRiaXQgYXJjaGl0ZWN0dXJlLlxuICAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZWluZyB0aGUgbG93ZXN0IGJpdCAoaW1tZWRpYXRlIGJpdCkgc2V0IHRvIDEuICopXG5cbm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuXG5tb2R1bGUgVDAgPSBzdHJ1Y3RcbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBpbnQ2NCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9pbnQ2NCA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBoYXNoX2ZvbGRfaW50NjRcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gaGFzaF9pbnQ2NCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIGxldCB0X29mX3NleHAgPSAoaW50NjRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICAgIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9pbnQ2NCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGludDY0X3NleHBfZ3JhbW1hclxuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgZW5kXG5cbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuZW5kXG5cbm1vZHVsZSBDb252ID0gSW50X2NvbnZlcnNpb25zXG5cbm1vZHVsZSBXIDogc2lnXG5cbiAgaW5jbHVkZSBtb2R1bGUgdHlwZSBvZiBzdHJ1Y3RcbiAgICBpbmNsdWRlIFQwXG4gIGVuZFxuXG4gIHR5cGUgdCA9IGludDY0XG5cbiAgdmFsIHdyYXBfZXhuIDogQ2FtbC5JbnQ2NC50IC0+IHRcbiAgdmFsIHdyYXBfbW9kdWxvIDogQ2FtbC5JbnQ2NC50IC0+IHRcbiAgdmFsIHVud3JhcCA6IHQgLT4gQ2FtbC5JbnQ2NC50XG5cbiAgKCoqIFJldHVybnMgYSBub24tbmVnYXRpdmUgaW50NjQgdGhhdCBpcyBlcXVhbCB0byB0aGUgaW5wdXQgaW50NjMgbW9kdWxvIDJeNjMuICopXG4gIHZhbCB1bndyYXBfdW5zaWduZWQgOiB0IC0+IENhbWwuSW50NjQudFxuXG4gIHZhbCBpbnZhcmlhbnQgOiB0IC0+IHVuaXRcbiAgdmFsIGFkZCA6IHQgLT4gdCAtPiB0XG4gIHZhbCBzdWIgOiB0IC0+IHQgLT4gdFxuICB2YWwgbmVnIDogdCAtPiB0XG4gIHZhbCBhYnMgOiB0IC0+IHRcbiAgdmFsIHN1Y2MgOiB0IC0+IHRcbiAgdmFsIHByZWQgOiB0IC0+IHRcbiAgdmFsIG11bCA6IHQgLT4gdCAtPiB0XG4gIHZhbCBwb3cgOiB0IC0+IHQgLT4gdFxuICB2YWwgZGl2IDogdCAtPiB0IC0+IHRcbiAgdmFsIHJlbSA6IHQgLT4gdCAtPiB0XG4gIHZhbCBwb3Bjb3VudCA6IHQgLT4gaW50XG4gIHZhbCBiaXRfbm90IDogdCAtPiB0XG4gIHZhbCBiaXRfeG9yIDogdCAtPiB0IC0+IHRcbiAgdmFsIGJpdF9vciA6IHQgLT4gdCAtPiB0XG4gIHZhbCBiaXRfYW5kIDogdCAtPiB0IC0+IHRcbiAgdmFsIHNoaWZ0X2xlZnQgOiB0IC0+IGludCAtPiB0XG4gIHZhbCBzaGlmdF9yaWdodCA6IHQgLT4gaW50IC0+IHRcbiAgdmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiB0IC0+IGludCAtPiB0XG4gIHZhbCBtaW5fdmFsdWUgOiB0XG4gIHZhbCBtYXhfdmFsdWUgOiB0XG4gIHZhbCB0b19pbnQ2NCA6IHQgLT4gQ2FtbC5JbnQ2NC50XG4gIHZhbCBvZl9pbnQ2NCA6IENhbWwuSW50NjQudCAtPiB0IG9wdGlvblxuICB2YWwgb2ZfaW50NjRfZXhuIDogQ2FtbC5JbnQ2NC50IC0+IHRcbiAgdmFsIG9mX2ludDY0X3RydW5jIDogQ2FtbC5JbnQ2NC50IC0+IHRcbiAgdmFsIGNvbXBhcmUgOiB0IC0+IHQgLT4gaW50XG4gIHZhbCBjZWlsX3BvdzIgOiB0IC0+IHRcbiAgdmFsIGZsb29yX3BvdzIgOiB0IC0+IHRcbiAgdmFsIGNlaWxfbG9nMiA6IHQgLT4gaW50XG4gIHZhbCBmbG9vcl9sb2cyIDogdCAtPiBpbnRcbiAgdmFsIGlzX3BvdzIgOiB0IC0+IGJvb2xcbiAgdmFsIGNseiA6IHQgLT4gaW50XG4gIHZhbCBjdHogOiB0IC0+IGludFxuZW5kID0gc3RydWN0XG4gIGluY2x1ZGUgVDBcblxuICB0eXBlIHQgPSBpbnQ2NFxuXG4gIGxldCB3cmFwX2V4biB4ID1cbiAgICAoKiBSYWlzZXMgaWYgdGhlIGludDY0IHZhbHVlIGRvZXMgbm90IGZpdCBvbiBpbnQ2My4gKilcbiAgICBDb252LmludDY0X2ZpdF9vbl9pbnQ2M19leG4geDtcbiAgICBDYW1sLkludDY0Lm11bCB4IDJMXG4gIDs7XG5cbiAgbGV0IHdyYXAgeCA9XG4gICAgaWYgQ29udi5pbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDYzIHggdGhlbiBTb21lIChDYW1sLkludDY0Lm11bCB4IDJMKSBlbHNlIE5vbmVcbiAgOztcblxuICBsZXQgd3JhcF9tb2R1bG8geCA9IENhbWwuSW50NjQubXVsIHggMkxcbiAgbGV0IHVud3JhcCB4ID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCB4IDFcbiAgbGV0IHVud3JhcF91bnNpZ25lZCB4ID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIHggMVxuXG4gICgqIFRoaXMgZG9lcyBub3QgdXNlIHdyYXAgb3IgdW53cmFwIHRvIGF2b2lkIGdlbmVyYXRpbmcgZXhjZXB0aW9ucyBpbiB0aGUgY2FzZSBvZlxuICAgICBvdmVyZmxvd3MuIFRoaXMgaXMgdG8gcHJlc2VydmUgdGhlIHNlbWFudGljcyBvZiBpbnQgdHlwZSBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlLiAqKVxuICBsZXQgZjIgZiBhIGIgPVxuICAgIENhbWwuSW50NjQubXVsIChmIChDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IGEgMSkgKENhbWwuSW50NjQuc2hpZnRfcmlnaHQgYiAxKSkgMkxcbiAgOztcblxuICBsZXQgbWFzayA9IDB4ZmZmZl9mZmZmX2ZmZmZfZmZmZUxcbiAgbGV0IG0geCA9IENhbWwuSW50NjQubG9nYW5kIHggbWFza1xuICBsZXQgaW52YXJpYW50IHQgPSBhc3NlcnQgKG0gdCA9IHQpXG4gIGxldCBhZGQgeCB5ID0gQ2FtbC5JbnQ2NC5hZGQgeCB5XG4gIGxldCBzdWIgeCB5ID0gQ2FtbC5JbnQ2NC5zdWIgeCB5XG4gIGxldCBuZWcgeCA9IENhbWwuSW50NjQubmVnIHhcbiAgbGV0IGFicyB4ID0gQ2FtbC5JbnQ2NC5hYnMgeFxuICBsZXQgb25lID0gd3JhcF9leG4gMUxcbiAgbGV0IHN1Y2MgYSA9IGFkZCBhIG9uZVxuICBsZXQgcHJlZCBhID0gc3ViIGEgb25lXG4gIGxldCBtaW5fdmFsdWUgPSBtIENhbWwuSW50NjQubWluX2ludFxuICBsZXQgbWF4X3ZhbHVlID0gbSBDYW1sLkludDY0Lm1heF9pbnRcbiAgbGV0IGJpdF9ub3QgeCA9IG0gKENhbWwuSW50NjQubG9nbm90IHgpXG4gIGxldCBiaXRfYW5kID0gQ2FtbC5JbnQ2NC5sb2dhbmRcbiAgbGV0IGJpdF94b3IgPSBDYW1sLkludDY0LmxvZ3hvclxuICBsZXQgYml0X29yID0gQ2FtbC5JbnQ2NC5sb2dvclxuICBsZXQgc2hpZnRfbGVmdCB4IGkgPSBDYW1sLkludDY0LnNoaWZ0X2xlZnQgeCBpXG4gIGxldCBzaGlmdF9yaWdodCB4IGkgPSBtIChDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IHggaSlcbiAgbGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCBpID0gbSAoQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIHggaSlcbiAgbGV0IHBvdyA9IGYyIEludF9tYXRoLlByaXZhdGUuaW50NjNfcG93X29uX2ludDY0XG4gIGxldCBtdWwgYSBiID0gQ2FtbC5JbnQ2NC5tdWwgYSAoQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCBiIDEpXG4gIGxldCBkaXYgYSBiID0gd3JhcF9tb2R1bG8gKENhbWwuSW50NjQuZGl2IGEgYilcbiAgbGV0IHJlbSBhIGIgPSBDYW1sLkludDY0LnJlbSBhIGJcbiAgbGV0IHBvcGNvdW50IHggPSBQb3Bjb3VudC5pbnQ2NF9wb3Bjb3VudCB4XG4gIGxldCB0b19pbnQ2NCB0ID0gdW53cmFwIHRcbiAgbGV0IG9mX2ludDY0IHQgPSB3cmFwIHRcbiAgbGV0IG9mX2ludDY0X2V4biB0ID0gd3JhcF9leG4gdFxuICBsZXQgb2ZfaW50NjRfdHJ1bmMgdCA9IHdyYXBfbW9kdWxvIHRcbiAgbGV0IHRfb2Zfc2V4cCB4ID0gd3JhcF9leG4gKGludDY0X29mX3NleHAgeClcbiAgbGV0IHNleHBfb2ZfdCB4ID0gc2V4cF9vZl9pbnQ2NCAodW53cmFwIHgpXG4gIGxldCBjb21wYXJlICh4IDogdCkgeSA9IGNvbXBhcmUgeCB5XG4gIGxldCBpc19wb3cyIHggPSBJbnQ2NC5pc19wb3cyICh1bndyYXAgeClcblxuICBsZXQgY2x6IHggPVxuICAgICgqIFdlIHJ1biBJbnQ2NC5jbHogZGlyZWN0bHkgb24gdGhlIHdyYXBwZWQgaW50NjMgdmFsdWUuIFRoaXMgaXMgY29ycmVjdCBiZWNhdXNlIHRoZVxuICAgICAgIGJpdHMgb2YgdGhlIGludDYzX2VtdWwgYXJlIGxlZnQtYWxpZ25lZCBpbiB0aGUgSW50NjQuICopXG4gICAgSW50NjQuY2x6IHhcbiAgOztcblxuICBsZXQgY3R6IHggPSBJbnQ2NC5jdHogKHVud3JhcCB4KVxuICBsZXQgZmxvb3JfcG93MiB4ID0gSW50NjQuZmxvb3JfcG93MiAodW53cmFwIHgpIHw+IHdyYXBfZXhuXG4gIGxldCBjZWlsX3BvdzIgeCA9IEludDY0LmZsb29yX3BvdzIgKHVud3JhcCB4KSB8PiB3cmFwX2V4blxuICBsZXQgZmxvb3JfbG9nMiB4ID0gSW50NjQuZmxvb3JfbG9nMiAodW53cmFwIHgpXG4gIGxldCBjZWlsX2xvZzIgeCA9IEludDY0LmNlaWxfbG9nMiAodW53cmFwIHgpXG5lbmRcblxub3BlbiBXXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IFcudCBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBXLmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gVy5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChXLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKFcuc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IFcudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gVy5jb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciA9IFcuY29tcGFyYXRvclxuICBsZXQgY29tcGFyZSA9IFcuY29tcGFyZVxuICBsZXQgaW52YXJpYW50ID0gVy5pbnZhcmlhbnRcblxuICAoKiBXZSBkb24ndCBleHBlY3QgW2hhc2hdIHRvIGZvbGxvdyB0aGUgYmVoYXZpb3Igb2YgaW50IGluIDY0Yml0IGFyY2hpdGVjdHVyZSAqKVxuICBsZXQgXyA9IGhhc2hcbiAgbGV0IGhhc2ggKHggOiB0KSA9IENhbWwuSGFzaHRibC5oYXNoIHhcbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgaW52YWxpZF9zdHIgeCA9IFByaW50Zi5mYWlsd2l0aGYgXCJJbnQ2My5vZl9zdHJpbmc6IGludmFsaWQgaW5wdXQgJVNcIiB4ICgpXG5cbiAgKCpcbiAgICAgXCJzaWduXCIgcmVmZXJzIHRvIHdoZXRoZXIgdGhlIG51bWJlciBzdGFydHMgd2l0aCBhICctJ1xuICAgICBcInNpZ25lZG5lc3MgPSBmYWxzZVwiIG1lYW5zIHRoZSByZXN0IG9mIHRoZSBudW1iZXIgaXMgcGFyc2VkIGFzIHVuc2lnbmVkIGFuZCB0aGVuIGNhc3RcbiAgICAgdG8gc2lnbmVkIHdpdGggd3JhcC1hcm91bmQgbW9kdWxvIDJeaVxuICAgICBcInNpZ25lZG5lc3MgPSB0cnVlXCIgbWVhbnMgbm8gc3VjaCBjcmF6aW5lc3MgaGFwcGVuc1xuXG4gICAgIFRoZSB0ZXJtaW5vbG9neSBhbmQgdGhlIGxvZ2ljIGlzIGR1ZSB0byB0aGUgY29kZSBpbiBieXRlcnVuL2ludHMuYyBpbiBvY2FtbCA0LjAzXG4gICAgIChbcGFyc2Vfc2lnbl9hbmRfYmFzZV0gZnVuY3Rpb24pLlxuXG4gICAgIFNpZ25lZG5lc3MgZXF1YWxzIHRydWUgZm9yIHBsYWluIGRlY2ltYWwgbnVtYmVyIChlLmcuIDEyMzUsIC02Nzg5KVxuXG4gICAgIFNpZ25lZG5lc3MgZXF1YWxzIGZhbHNlIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAgIC0gWzB4ZmZmZl0sIFstMHhmZmZmXSAoaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24pXG4gICAgIC0gWzBiMDEwMV0sIFstMGIwMTAxXSAoYmluYXJ5IHJlcHJlc2VudGF0aW9uKVxuICAgICAtIFswbzEyMzddLCBbLTBvMTIzN10gKG9jdGFsIHJlcHJlc2VudGF0aW9uKVxuICAgICAtIFswdTk4MTJdLCBbLTB1OTgxMl0gKHVuc2lnbmVkIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gLSBhdmFpbGFibGUgZnJvbSBPQ2FtbCA0LjAzKSAqKVxuICBsZXQgc2lnbl9hbmRfc2lnbmVkbmVzcyB4ID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCB4IGluXG4gICAgbGV0IG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGxldCBwb3MsIHNpZ24gPVxuICAgICAgaWYgMCA8IGxlblxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIHguWzBdIHdpdGhcbiAgICAgICAgfCAnLScgLT4gMSwgYE5lZ1xuICAgICAgICB8ICcrJyAtPiAxLCBgUG9zXG4gICAgICAgIHwgXyAtPiAwLCBgUG9zKVxuICAgICAgZWxzZSAwLCBgUG9zXG4gICAgaW5cbiAgICBpZiBwb3MgKyAyIDwgbGVuXG4gICAgdGhlbiAoXG4gICAgICBsZXQgYzEgPSB4Lltwb3NdIGluXG4gICAgICBsZXQgYzIgPSB4Lltwb3MgKyAxXSBpblxuICAgICAgbWF0Y2ggYzEsIGMyIHdpdGhcbiAgICAgIHwgJzAnLCAnMCcgLi4gJzknIC0+IHNpZ24sIHRydWVcbiAgICAgIHwgJzAnLCBfIC0+IHNpZ24sIGZhbHNlXG4gICAgICB8IF8gLT4gc2lnbiwgdHJ1ZSlcbiAgICBlbHNlIHNpZ24sIHRydWVcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nIHggPSBDYW1sLkludDY0LnRvX3N0cmluZyAodW53cmFwIHgpXG5cbiAgbGV0IG9mX3N0cmluZyBzdHIgPVxuICAgIHRyeVxuICAgICAgbGV0IHNpZ24sIHNpZ25lZG5lc3MgPSBzaWduX2FuZF9zaWduZWRuZXNzIHN0ciBpblxuICAgICAgaWYgc2lnbmVkbmVzc1xuICAgICAgdGhlbiBvZl9pbnQ2NF9leG4gKENhbWwuSW50NjQub2Zfc3RyaW5nIHN0cilcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgcG9zX3N0ciA9XG4gICAgICAgICAgbWF0Y2ggc2lnbiB3aXRoXG4gICAgICAgICAgfCBgTmVnIC0+IFN0cmluZy5zdWIgc3RyIH5wb3M6MSB+bGVuOihTdHJpbmcubGVuZ3RoIHN0ciAtIDEpXG4gICAgICAgICAgfCBgUG9zIC0+IHN0clxuICAgICAgICBpblxuICAgICAgICBsZXQgaW50NjQgPSBDYW1sLkludDY0Lm9mX3N0cmluZyBwb3Nfc3RyIGluXG4gICAgICAgICgqIHVuc2lnbmVkIDYzLWJpdCBpbnQgbXVzdCBwYXJzZSBhcyBhIHBvc2l0aXZlIHNpZ25lZCA2NC1iaXQgaW50ICopXG4gICAgICAgIGlmIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSBpbnQ2NCAwTCB0aGVuIGludmFsaWRfc3RyIHN0cjtcbiAgICAgICAgbGV0IGludDYzID0gd3JhcF9tb2R1bG8gaW50NjQgaW5cbiAgICAgICAgbWF0Y2ggc2lnbiB3aXRoXG4gICAgICAgIHwgYE5lZyAtPiBuZWcgaW50NjNcbiAgICAgICAgfCBgUG9zIC0+IGludDYzKVxuICAgIHdpdGhcbiAgICB8IF8gLT4gaW52YWxpZF9zdHIgc3RyXG4gIDs7XG5cbiAgbGV0IGJzd2FwMTYgdCA9IHdyYXBfbW9kdWxvIChJbnQ2NC5ic3dhcDE2ICh1bndyYXAgdCkpXG4gIGxldCBic3dhcDMyIHQgPSB3cmFwX21vZHVsbyAoSW50NjQuYnN3YXAzMiAodW53cmFwIHQpKVxuICBsZXQgYnN3YXA0OCB0ID0gd3JhcF9tb2R1bG8gKEludDY0LmJzd2FwNDggKHVud3JhcCB0KSlcbmVuZFxuXG5pbmNsdWRlIFRcblxubGV0IG51bV9iaXRzID0gNjNcbmxldCBmbG9hdF9sb3dlcl9ib3VuZCA9IEZsb2F0MC5sb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfdXBwZXJfYm91bmQgPSBGbG9hdDAudXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5sZXQgc2hpZnRfcmlnaHQgPSBzaGlmdF9yaWdodFxubGV0IHNoaWZ0X2xlZnQgPSBzaGlmdF9sZWZ0XG5sZXQgYml0X25vdCA9IGJpdF9ub3RcbmxldCBiaXRfeG9yID0gYml0X3hvclxubGV0IGJpdF9vciA9IGJpdF9vclxubGV0IGJpdF9hbmQgPSBiaXRfYW5kXG5sZXQgcG9wY291bnQgPSBwb3Bjb3VudFxubGV0IGFicyA9IGFic1xubGV0IHByZWQgPSBwcmVkXG5sZXQgc3VjYyA9IHN1Y2NcbmxldCBwb3cgPSBwb3dcbmxldCByZW0gPSByZW1cbmxldCBuZWcgPSBuZWdcbmxldCBtYXhfdmFsdWUgPSBtYXhfdmFsdWVcbmxldCBtaW5fdmFsdWUgPSBtaW5fdmFsdWVcbmxldCBtaW51c19vbmUgPSB3cmFwX2V4biBDYW1sLkludDY0Lm1pbnVzX29uZVxubGV0IG9uZSA9IHdyYXBfZXhuIENhbWwuSW50NjQub25lXG5sZXQgemVybyA9IHdyYXBfZXhuIENhbWwuSW50NjQuemVyb1xubGV0IGlzX3BvdzIgPSBpc19wb3cyXG5sZXQgZmxvb3JfcG93MiA9IGZsb29yX3BvdzJcbmxldCBjZWlsX3BvdzIgPSBjZWlsX3BvdzJcbmxldCBmbG9vcl9sb2cyID0gZmxvb3JfbG9nMlxubGV0IGNlaWxfbG9nMiA9IGNlaWxfbG9nMlxubGV0IGNseiA9IGNselxubGV0IGN0eiA9IGN0elxubGV0IHRvX2Zsb2F0IHggPSBDYW1sLkludDY0LnRvX2Zsb2F0ICh1bndyYXAgeClcbmxldCBvZl9mbG9hdF91bmNoZWNrZWQgeCA9IHdyYXBfbW9kdWxvIChDYW1sLkludDY0Lm9mX2Zsb2F0IHgpXG5cbmxldCBvZl9mbG9hdCB0ID1cbiAgbGV0IG9wZW4gRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gIGlmIHQgPj0gZmxvYXRfbG93ZXJfYm91bmQgJiYgdCA8PSBmbG9hdF91cHBlcl9ib3VuZFxuICB0aGVuIHdyYXBfbW9kdWxvIChDYW1sLkludDY0Lm9mX2Zsb2F0IHQpXG4gIGVsc2VcbiAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICBcIkludDYzLm9mX2Zsb2F0OiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggdClcbiAgICAgICgpXG47O1xuXG5sZXQgb2ZfaW50NjQgPSBvZl9pbnQ2NFxubGV0IG9mX2ludDY0X2V4biA9IG9mX2ludDY0X2V4blxubGV0IG9mX2ludDY0X3RydW5jID0gb2ZfaW50NjRfdHJ1bmNcbmxldCB0b19pbnQ2NCA9IHRvX2ludDY0XG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxubGV0ICggLyApID0gZGl2XG5sZXQgKCAqICkgPSBtdWxcbmxldCAoIC0gKSA9IHN1YlxubGV0ICggKyApID0gYWRkXG5sZXQgKCB+LSApID0gbmVnXG5sZXQgKCAqKiApIGIgZSA9IHBvdyBiIGVcbmxldCBpbmNyIHIgPSByIDo9ICFyICsgb25lXG5sZXQgZGVjciByID0gciA6PSAhciAtIG9uZVxuXG4oKiBXZSBjYW4gcmV1c2UgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tL3RvIGludDY0IGhlcmUuICopXG5sZXQgb2ZfaW50IHggPSB3cmFwX2V4biAoQ29udi5pbnRfdG9faW50NjQgeClcbmxldCBvZl9pbnRfZXhuIHggPSBvZl9pbnQgeFxubGV0IHRvX2ludCB4ID0gQ29udi5pbnQ2NF90b19pbnQgKHVud3JhcCB4KVxubGV0IHRvX2ludF9leG4geCA9IENvbnYuaW50NjRfdG9faW50X2V4biAodW53cmFwIHgpXG5sZXQgdG9faW50X3RydW5jIHggPSBDb252LmludDY0X3RvX2ludF90cnVuYyAodW53cmFwIHgpXG5sZXQgb2ZfaW50MzIgeCA9IHdyYXBfZXhuIChDb252LmludDMyX3RvX2ludDY0IHgpXG5sZXQgb2ZfaW50MzJfZXhuIHggPSBvZl9pbnQzMiB4XG5sZXQgdG9faW50MzIgeCA9IENvbnYuaW50NjRfdG9faW50MzIgKHVud3JhcCB4KVxubGV0IHRvX2ludDMyX2V4biB4ID0gQ29udi5pbnQ2NF90b19pbnQzMl9leG4gKHVud3JhcCB4KVxubGV0IHRvX2ludDMyX3RydW5jIHggPSBDb252LmludDY0X3RvX2ludDMyX3RydW5jICh1bndyYXAgeClcbmxldCBvZl9uYXRpdmVpbnQgeCA9IG9mX2ludDY0IChDb252Lm5hdGl2ZWludF90b19pbnQ2NCB4KVxubGV0IG9mX25hdGl2ZWludF9leG4geCA9IHdyYXBfZXhuIChDb252Lm5hdGl2ZWludF90b19pbnQ2NCB4KVxubGV0IG9mX25hdGl2ZWludF90cnVuYyB4ID0gb2ZfaW50NjRfdHJ1bmMgKENvbnYubmF0aXZlaW50X3RvX2ludDY0IHgpXG5sZXQgdG9fbmF0aXZlaW50IHggPSBDb252LmludDY0X3RvX25hdGl2ZWludCAodW53cmFwIHgpXG5sZXQgdG9fbmF0aXZlaW50X2V4biB4ID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRfZXhuICh1bndyYXAgeClcbmxldCB0b19uYXRpdmVpbnRfdHJ1bmMgeCA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50X3RydW5jICh1bndyYXAgeClcblxuaW5jbHVkZSBDb252Lk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29udi5NYWtlX2hleCAoc3RydWN0XG4gICAgdHlwZSB0ID0gVC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoVC5jb21wYXJlIDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIFQuaGFzaF9mb2xkX3RcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gVC5oYXNoIGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCB6ZXJvID0gemVyb1xuICAgIGxldCBuZWcgPSAoIH4tIClcbiAgICBsZXQgKCA8ICkgPSAoIDwgKVxuXG4gICAgbGV0IHRvX3N0cmluZyBpID1cbiAgICAgICgqIHRoZSB1c2Ugb2YgW3Vud3JhcF91bnNpZ25lZF0gaGVyZSBpcyBpbXBvcnRhbnQgZm9yIHRoZSBjYXNlIG9mIFttaW5fdmFsdWVdICopXG4gICAgICBQcmludGYuc3ByaW50ZiBcIiVMeFwiICh1bndyYXBfdW5zaWduZWQgaSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX3N0cmluZyBzID0gb2Zfc3RyaW5nIChcIjB4XCIgXiBzKVxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQ2My5IZXhcIlxuICBlbmQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nIHggPSB0b19zdHJpbmcgeFxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQ2M1wiXG4gIGVuZClcblxubW9kdWxlIFByZV9PID0gc3RydWN0XG4gIGxldCAoICsgKSA9ICggKyApXG4gIGxldCAoIC0gKSA9ICggLSApXG4gIGxldCAoICogKSA9ICggKiApXG4gIGxldCAoIC8gKSA9ICggLyApXG4gIGxldCAoIH4tICkgPSAoIH4tIClcbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgKEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA6IENvbXBhcmlzb25zLkluZml4IHdpdGggdHlwZSB0IDo9IHQpXG5cbiAgbGV0IGFicyA9IGFic1xuICBsZXQgbmVnID0gbmVnXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50X2V4biA9IG9mX2ludF9leG5cbmVuZFxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBpbmNsdWRlIFByZV9PXG5cbiAgaW5jbHVkZSBJbnRfbWF0aC5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGluY2x1ZGUgUHJlX09cblxuICAgICAgbGV0IHJlbSA9IHJlbVxuICAgICAgbGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbiAgICAgIGxldCBvZl9mbG9hdCA9IG9mX2Zsb2F0XG4gICAgICBsZXQgb2Zfc3RyaW5nID0gVC5vZl9zdHJpbmdcbiAgICAgIGxldCB0b19zdHJpbmcgPSBULnRvX3N0cmluZ1xuICAgIGVuZClcblxuICBsZXQgKCBsYW5kICkgPSBiaXRfYW5kXG4gIGxldCAoIGxvciApID0gYml0X29yXG4gIGxldCAoIGx4b3IgKSA9IGJpdF94b3JcbiAgbGV0IGxub3QgPSBiaXRfbm90XG4gIGxldCAoIGxzbCApID0gc2hpZnRfbGVmdFxuICBsZXQgKCBhc3IgKSA9IHNoaWZ0X3JpZ2h0XG4gIGxldCAoIGxzciApID0gc2hpZnRfcmlnaHRfbG9naWNhbFxuZW5kXG5cbmluY2x1ZGUgT1xuXG4oKiBbSW50NjNdIGFuZCBbSW50NjMuT10gYWdyZWUgdmFsdWUtd2lzZSAqKVxuXG5tb2R1bGUgUmVwciA9IHN0cnVjdFxuICB0eXBlIGVtdWxhdGVkID0gdFxuXG4gIHR5cGUgKCd1bmRlcmx5aW5nX3R5cGUsICdpbnRlcm1lZGlhdGVfdHlwZSkgdCA9XG4gICAgfCBJbnQgOiAoaW50LCBpbnQpIHRcbiAgICB8IEludDY0IDogKGludDY0LCBlbXVsYXRlZCkgdFxuZW5kXG5cbmxldCByZXByID0gUmVwci5JbnQ2NFxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gYm9vbCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZW51bWVyYXRlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9ib29sIDogdCAtPiB0IC0+IGludClcbiAgbGV0IGFsbCA9IChbIGZhbHNlOyB0cnVlIF0gOiB0IGxpc3QpXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9ib29sXG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9ib29sIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChib29sX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2Jvb2wgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gYm9vbF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cblxuICBsZXQgb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgICB8IFwidHJ1ZVwiIC0+IHRydWVcbiAgICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICAgIHwgcyAtPiBpbnZhbGlkX2FyZ2YgXCJCb29sLm9mX3N0cmluZzogZXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZSBidXQgZ290ICVzXCIgcyAoKVxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgPSBDYW1sLnN0cmluZ19vZl9ib29sXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuQm9vbFwiXG4gIGVuZClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgQm9vbF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmxldCB0b19pbnQgeCA9IGJvb2xfdG9faW50IHhcblxubW9kdWxlIE5vbl9zaG9ydF9jaXJjdWl0aW5nID0gc3RydWN0XG4gICgqIFdlIGRvbid0IGV4cG9zZSB0aGlzLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIHRoZSBpbnZhcmlhbnQgbWVudGlvbmVkIGJlbG93IG9mXG4gICAgICh0b19pbnQgdHJ1ZSA9IDEpIGFuZCAodG9faW50IGZhbHNlID0gMCkuICopXG4gIGxldCB1bnNhZmVfb2ZfaW50ICh4IDogaW50KSA6IGJvb2wgPSBDYW1sLk9iai5tYWdpYyB4XG4gIGxldCAoIHx8ICkgYSBiID0gdW5zYWZlX29mX2ludCAodG9faW50IGEgbG9yIHRvX2ludCBiKVxuICBsZXQgKCAmJiApIGEgYiA9IHVuc2FmZV9vZl9pbnQgKHRvX2ludCBhIGxhbmQgdG9faW50IGIpXG5lbmRcblxuKCogV2UgZG8gdGhpcyBhcyBhIGRpcmVjdCBhc3NlcnQgb24gdGhlIHRoZW9yeSB0aGF0IGl0J3MgYSBjaGVhcCB0aGluZyB0byB0ZXN0IGFuZCBhXG4gICByZWFsbHkgY29yZSBpbnZhcmlhbnQgdGhhdCB3ZSBuZXZlciBleHBlY3QgdG8gYnJlYWssIGFuZCB3ZSBzaG91bGQgYmUgaGFwcHkgZm9yIGFcbiAgIHByb2dyYW0gdG8gZmFpbCBpbW1lZGlhdGVseSBpZiB0aGlzIGlzIHZpb2xhdGVkLiAqKVxubGV0ICgpID0gYXNzZXJ0IChQb2x5LiggPSApICh0b19pbnQgdHJ1ZSkgMSAmJiBQb2x5LiggPSApICh0b19pbnQgZmFsc2UpIDApXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBCb29sX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBDYW1sLkludDMyXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGludDMyIFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9pbnQzMlxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfaW50MzIgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGludDMyX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2ludDMyIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGludDMyX3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgY29tcGFyZSAoeCA6IHQpIHkgPSBjb21wYXJlIHggeVxuICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gIGxldCBvZl9zdHJpbmcgPSBvZl9zdHJpbmdcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG5sZXQgbnVtX2JpdHMgPSAzMlxubGV0IGZsb2F0X2xvd2VyX2JvdW5kID0gRmxvYXQwLmxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF91cHBlcl9ib3VuZCA9IEZsb2F0MC51cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfb2ZfYml0cyA9IGZsb2F0X29mX2JpdHNcbmxldCBiaXRzX29mX2Zsb2F0ID0gYml0c19vZl9mbG9hdFxubGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5sZXQgc2hpZnRfcmlnaHQgPSBzaGlmdF9yaWdodFxubGV0IHNoaWZ0X2xlZnQgPSBzaGlmdF9sZWZ0XG5sZXQgYml0X25vdCA9IGxvZ25vdFxubGV0IGJpdF94b3IgPSBsb2d4b3JcbmxldCBiaXRfb3IgPSBsb2dvclxubGV0IGJpdF9hbmQgPSBsb2dhbmRcbmxldCBtaW5fdmFsdWUgPSBtaW5faW50XG5sZXQgbWF4X3ZhbHVlID0gbWF4X2ludFxubGV0IGFicyA9IGFic1xubGV0IHByZWQgPSBwcmVkXG5sZXQgc3VjYyA9IHN1Y2NcbmxldCByZW0gPSByZW1cbmxldCBuZWcgPSBuZWdcbmxldCBtaW51c19vbmUgPSBtaW51c19vbmVcbmxldCBvbmUgPSBvbmVcbmxldCB6ZXJvID0gemVyb1xubGV0IGNvbXBhcmUgPSBjb21wYXJlXG5sZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxubGV0IG9mX2Zsb2F0X3VuY2hlY2tlZCA9IG9mX2Zsb2F0XG5cbmxldCBvZl9mbG9hdCBmID1cbiAgaWYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSBmIGZsb2F0X2xvd2VyX2JvdW5kXG4gICYmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgZiBmbG9hdF91cHBlcl9ib3VuZFxuICB0aGVuIG9mX2Zsb2F0IGZcbiAgZWxzZVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgIFwiSW50MzIub2ZfZmxvYXQ6IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCBmKVxuICAgICAgKClcbjs7XG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxubW9kdWxlIEluZml4X2NvbXBhcmUgPSBzdHJ1Y3RcbiAgb3BlbiBQb2x5XG5cbiAgbGV0ICggPj0gKSAoeCA6IHQpIHkgPSB4ID49IHlcbiAgbGV0ICggPD0gKSAoeCA6IHQpIHkgPSB4IDw9IHlcbiAgbGV0ICggPSApICh4IDogdCkgeSA9IHggPSB5XG4gIGxldCAoID4gKSAoeCA6IHQpIHkgPSB4ID4geVxuICBsZXQgKCA8ICkgKHggOiB0KSB5ID0geCA8IHlcbiAgbGV0ICggPD4gKSAoeCA6IHQpIHkgPSB4IDw+IHlcbmVuZFxuXG5tb2R1bGUgQ29tcGFyZSA9IHN0cnVjdFxuICBpbmNsdWRlIEluZml4X2NvbXBhcmVcblxuICBsZXQgY29tcGFyZSA9IGNvbXBhcmVcbiAgbGV0IGFzY2VuZGluZyA9IGNvbXBhcmVcbiAgbGV0IGRlc2NlbmRpbmcgeCB5ID0gY29tcGFyZSB5IHhcbiAgbGV0IG1pbiAoeCA6IHQpIHkgPSBpZiB4IDwgeSB0aGVuIHggZWxzZSB5XG4gIGxldCBtYXggKHggOiB0KSB5ID0gaWYgeCA+IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgZXF1YWwgKHggOiB0KSB5ID0geCA9IHlcbiAgbGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG4gIGxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbiAgbGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gICAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbiAgOztcblxuICBsZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICAgIGlmIG1pbiA+IG1heFxuICAgIHRoZW5cbiAgICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBDb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgKCAvICkgPSBkaXZcbmxldCAoICogKSA9IG11bFxubGV0ICggLSApID0gc3ViXG5sZXQgKCArICkgPSBhZGRcbmxldCAoIH4tICkgPSBuZWdcbmxldCBpbmNyIHIgPSByIDo9ICFyICsgb25lXG5sZXQgZGVjciByID0gciA6PSAhciAtIG9uZVxubGV0IG9mX2ludDMyIHQgPSB0XG5sZXQgb2ZfaW50MzJfZXhuID0gb2ZfaW50MzJcbmxldCB0b19pbnQzMiB0ID0gdFxubGV0IHRvX2ludDMyX2V4biA9IHRvX2ludDMyXG5sZXQgcG9wY291bnQgPSBQb3Bjb3VudC5pbnQzMl9wb3Bjb3VudFxuXG5tb2R1bGUgQ29udiA9IEludF9jb252ZXJzaW9uc1xuXG5sZXQgb2ZfaW50ID0gQ29udi5pbnRfdG9faW50MzJcbmxldCBvZl9pbnRfZXhuID0gQ29udi5pbnRfdG9faW50MzJfZXhuXG5sZXQgb2ZfaW50X3RydW5jID0gQ29udi5pbnRfdG9faW50MzJfdHJ1bmNcbmxldCB0b19pbnQgPSBDb252LmludDMyX3RvX2ludFxubGV0IHRvX2ludF9leG4gPSBDb252LmludDMyX3RvX2ludF9leG5cbmxldCB0b19pbnRfdHJ1bmMgPSBDb252LmludDMyX3RvX2ludF90cnVuY1xubGV0IG9mX2ludDY0ID0gQ29udi5pbnQ2NF90b19pbnQzMlxubGV0IG9mX2ludDY0X2V4biA9IENvbnYuaW50NjRfdG9faW50MzJfZXhuXG5sZXQgb2ZfaW50NjRfdHJ1bmMgPSBDb252LmludDY0X3RvX2ludDMyX3RydW5jXG5sZXQgdG9faW50NjQgPSBDb252LmludDMyX3RvX2ludDY0XG5sZXQgb2ZfbmF0aXZlaW50ID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJcbmxldCBvZl9uYXRpdmVpbnRfZXhuID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJfZXhuXG5sZXQgb2ZfbmF0aXZlaW50X3RydW5jID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJfdHJ1bmNcbmxldCB0b19uYXRpdmVpbnQgPSBDb252LmludDMyX3RvX25hdGl2ZWludFxubGV0IHRvX25hdGl2ZWludF9leG4gPSB0b19uYXRpdmVpbnRcbmxldCBwb3cgYiBlID0gb2ZfaW50X2V4biAoSW50X21hdGguUHJpdmF0ZS5pbnRfcG93ICh0b19pbnRfZXhuIGIpICh0b19pbnRfZXhuIGUpKVxubGV0ICggKiogKSBiIGUgPSBwb3cgYiBlXG5cbmV4dGVybmFsIGJzd2FwMzIgOiB0IC0+IHQgPSBcIiVic3dhcF9pbnQzMlwiXG5cbmxldCBic3dhcDE2IHggPSBDYW1sLkludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJzd2FwMzIgeCkgMTZcblxubW9kdWxlIFBvdzIgPSBzdHJ1Y3RcbiAgb3BlbiEgSW1wb3J0XG4gIG9wZW4gSW50MzJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbiAgbGV0IG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKSA9XG4gICAgUHJpbnRmLmludmFsaWRfYXJnZiBcImFyZ3VtZW50IG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmVcIiAoKVxuICA7O1xuXG4gIGxldCAoIGxvciApID0gQ2FtbC5JbnQzMi5sb2dvclxuICBsZXQgKCBsc3IgKSA9IENhbWwuSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbFxuICBsZXQgKCBsYW5kICkgPSBDYW1sLkludDMyLmxvZ2FuZFxuXG4gICgqKiBcImNlaWxpbmcgcG93ZXIgb2YgMlwiIC0gTGVhc3QgcG93ZXIgb2YgMiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGNlaWxfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50MzIuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IENhbWwuSW50MzIucHJlZCB4IGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICBDYW1sLkludDMyLnN1Y2MgeFxuICA7O1xuXG4gICgqKiBcImZsb29yIHBvd2VyIG9mIDJcIiAtIExhcmdlc3QgcG93ZXIgb2YgMiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGZsb29yX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDMyLnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICBDYW1sLkludDMyLnN1YiB4ICh4IGxzciAxKVxuICA7O1xuXG4gIGxldCBpc19wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQzMi56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIHggbGFuZCBDYW1sLkludDMyLnByZWQgeCA9IENhbWwuSW50MzIuemVyb1xuICA7O1xuXG4gICgqIEMgc3R1YnMgZm9yIGludDMyIGNseiBhbmQgY3R6IHRvIHVzZSB0aGUgQ0xaL0JTUi9DVFovQlNGIGluc3RydWN0aW9uIHdoZXJlIHBvc3NpYmxlICopXG4gIGV4dGVybmFsIGNselxuICAgIDogIChpbnQzMltAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludDMyX2NselwiIFwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY3R6XG4gICAgOiAgKGludDMyW0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50MzJfY3R6XCIgXCJCYXNlX2ludF9tYXRoX2ludDMyX2N0el91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBmbG9vcl9sb2cyIGkgPVxuICAgIGlmIGkgPD0gQ2FtbC5JbnQzMi56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlIFwiW0ludDMyLmZsb29yX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludDMyIGkgXSk7XG4gICAgbnVtX2JpdHMgLSAxIC0gY2x6IGlcbiAgOztcblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBjZWlsX2xvZzIgaSA9XG4gICAgaWYgaSA8PSBDYW1sLkludDMyLnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSW50MzIuY2VpbF9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQzMiBpIF0pO1xuICAgICgqIFRoZSBbaSA9IDFdIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIGNseigwKSBpcyB1bmRlZmluZWQgKilcbiAgICBpZiBDYW1sLkludDMyLmVxdWFsIGkgQ2FtbC5JbnQzMi5vbmUgdGhlbiAwIGVsc2UgbnVtX2JpdHMgLSBjbHogKENhbWwuSW50MzIucHJlZCBpKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgUG93MlxuaW5jbHVkZSBDb252Lk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29udi5NYWtlX2hleCAoc3RydWN0XG4gICAgdHlwZSB0ID0gaW50MzIgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2ludDMyIDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIGhhc2hfZm9sZF9pbnQzMlxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBoYXNoX2ludDMyIGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCB6ZXJvID0gemVyb1xuICAgIGxldCBuZWcgPSAoIH4tIClcbiAgICBsZXQgKCA8ICkgPSAoIDwgKVxuICAgIGxldCB0b19zdHJpbmcgaSA9IFByaW50Zi5zcHJpbnRmIFwiJWx4XCIgaVxuICAgIGxldCBvZl9zdHJpbmcgcyA9IENhbWwuU2NhbmYuc3NjYW5mIHMgXCIlbHhcIiBGbi5pZFxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQzMi5IZXhcIlxuICBlbmQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDMyXCJcbiAgZW5kKVxuXG5tb2R1bGUgUHJlX08gPSBzdHJ1Y3RcbiAgbGV0ICggKyApID0gKCArIClcbiAgbGV0ICggLSApID0gKCAtIClcbiAgbGV0ICggKiApID0gKCAqIClcbiAgbGV0ICggLyApID0gKCAvIClcbiAgbGV0ICggfi0gKSA9ICggfi0gKVxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSAoQ29tcGFyZSA6IENvbXBhcmlzb25zLkluZml4IHdpdGggdHlwZSB0IDo9IHQpXG5cbiAgbGV0IGFicyA9IGFic1xuICBsZXQgbmVnID0gbmVnXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50X2V4biA9IG9mX2ludF9leG5cbmVuZFxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBpbmNsdWRlIFByZV9PXG5cbiAgaW5jbHVkZSBJbnRfbWF0aC5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGluY2x1ZGUgUHJlX09cblxuICAgICAgbGV0IHJlbSA9IHJlbVxuICAgICAgbGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbiAgICAgIGxldCBvZl9mbG9hdCA9IG9mX2Zsb2F0XG4gICAgICBsZXQgb2Zfc3RyaW5nID0gVC5vZl9zdHJpbmdcbiAgICAgIGxldCB0b19zdHJpbmcgPSBULnRvX3N0cmluZ1xuICAgIGVuZClcblxuICBsZXQgKCBsYW5kICkgPSBiaXRfYW5kXG4gIGxldCAoIGxvciApID0gYml0X29yXG4gIGxldCAoIGx4b3IgKSA9IGJpdF94b3JcbiAgbGV0IGxub3QgPSBiaXRfbm90XG4gIGxldCAoIGxzbCApID0gc2hpZnRfbGVmdFxuICBsZXQgKCBhc3IgKSA9IHNoaWZ0X3JpZ2h0XG4gIGxldCAoIGxzciApID0gc2hpZnRfcmlnaHRfbG9naWNhbFxuZW5kXG5cbmluY2x1ZGUgT1xuXG4oKiBbSW50MzJdIGFuZCBbSW50MzIuT10gYWdyZWUgdmFsdWUtd2lzZSAqKVxuIiwib3BlbiEgSW1wb3J0XG5cbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG5tb2R1bGUgUmVwciA9IEludDYzX2VtdWwuUmVwclxuXG4oKiBJbiBhIHdvcmxkIHdoZXJlIHRoZSBjb21waWxlciB3b3VsZCB1bmRlcnN0YW5kIFtAQGltbWVkaWF0ZTY0XSBhdHRyaWJ1dGVzIG9uIHR5cGVcbiAgIGRlY2xhcmF0aW9ucywgdGhpcyBtb2R1bGUgaXMgaG93IG9uZSB3b3VsZCBwcm9kdWNlIGEgW3R5cGUgdF0gd2l0aCB0aGlzIGF0dHJpYnV0ZS4gKilcbm1vZHVsZSBJbW1lZGlhdGU2NCA6IHNpZ1xuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIEltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGVdXG4gIGVuZFxuXG4gIG1vZHVsZSBNYWtlIChJbW1lZGlhdGUgOiBJbW1lZGlhdGUpIChOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZSkgOiBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlNjRdXG5cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuXG4gICAgdmFsIHJlcHIgOiB0IHJlcHJcbiAgZW5kXG5lbmQgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgTm9uX2ltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZSAoSW1tZWRpYXRlIDogSW1tZWRpYXRlKSAoTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUpID0gc3RydWN0XG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZTY0XVxuXG4gICAgdHlwZSAnYSByZXByID1cbiAgICAgIHwgSW1tZWRpYXRlIDogSW1tZWRpYXRlLnQgcmVwclxuICAgICAgfCBOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZS50IHJlcHJcblxuICAgIGxldCByZXByID1cbiAgICAgIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICAgICAgfCBXNjQgLT4gKENhbWwuT2JqLm1hZ2ljIEltbWVkaWF0ZSA6IHQgcmVwcilcbiAgICAgIHwgVzMyIC0+IChDYW1sLk9iai5tYWdpYyBOb25faW1tZWRpYXRlIDogdCByZXByKVxuICAgIDs7XG4gIGVuZFxuZW5kXG5cbmluY2x1ZGUgSW1tZWRpYXRlNjQuTWFrZSAoSW50KSAoSW50NjNfZW11bClcblxubW9kdWxlIEJhY2tlbmQgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgaW5jbHVkZSBJbnRfaW50Zi5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIHZhbCBvZl9pbnQgOiBpbnQgLT4gdFxuICAgIHZhbCB0b19pbnQgOiB0IC0+IGludCBvcHRpb25cbiAgICB2YWwgdG9faW50X3RydW5jIDogdCAtPiBpbnRcbiAgICB2YWwgb2ZfaW50MzIgOiBpbnQzMiAtPiB0XG4gICAgdmFsIHRvX2ludDMyIDogdCAtPiBJbnQzMi50IG9wdGlvblxuICAgIHZhbCB0b19pbnQzMl90cnVuYyA6IHQgLT4gSW50MzIudFxuICAgIHZhbCBvZl9pbnQ2NCA6IEludDY0LnQgLT4gdCBvcHRpb25cbiAgICB2YWwgb2ZfaW50NjRfdHJ1bmMgOiBJbnQ2NC50IC0+IHRcbiAgICB2YWwgb2ZfbmF0aXZlaW50IDogbmF0aXZlaW50IC0+IHQgb3B0aW9uXG4gICAgdmFsIHRvX25hdGl2ZWludCA6IHQgLT4gbmF0aXZlaW50IG9wdGlvblxuICAgIHZhbCBvZl9uYXRpdmVpbnRfdHJ1bmMgOiBuYXRpdmVpbnQgLT4gdFxuICAgIHZhbCB0b19uYXRpdmVpbnRfdHJ1bmMgOiB0IC0+IG5hdGl2ZWludFxuICAgIHZhbCBvZl9mbG9hdF91bmNoZWNrZWQgOiBmbG9hdCAtPiB0XG4gICAgdmFsIHJlcHIgOiAodCwgdCkgSW50NjNfZW11bC5SZXByLnRcbiAgICB2YWwgYnN3YXAxNiA6IHQgLT4gdFxuICAgIHZhbCBic3dhcDMyIDogdCAtPiB0XG4gICAgdmFsIGJzd2FwNDggOiB0IC0+IHRcbiAgZW5kXG4gIHdpdGggdHlwZSB0IDo9IHRcblxuICBtb2R1bGUgTmF0aXZlID0gc3RydWN0XG4gICAgaW5jbHVkZSBJbnRcblxuICAgIGxldCB0b19pbnQgeCA9IFNvbWUgeFxuICAgIGxldCB0b19pbnRfdHJ1bmMgeCA9IHhcblxuICAgICgqIFtvZl9pbnQzMl9leG5dIGlzIGEgc2FmZSBvcGVyYXRpb24gb24gcGxhdGZvcm1zIHdpdGggNjQtYml0IHdvcmQgc2l6ZXMuICopXG4gICAgbGV0IG9mX2ludDMyID0gb2ZfaW50MzJfZXhuXG4gICAgbGV0IHRvX25hdGl2ZWludF90cnVuYyB4ID0gdG9fbmF0aXZlaW50IHhcbiAgICBsZXQgdG9fbmF0aXZlaW50IHggPSBTb21lICh0b19uYXRpdmVpbnQgeClcbiAgICBsZXQgcmVwciA9IEludDYzX2VtdWwuUmVwci5JbnRcbiAgICBsZXQgYnN3YXAzMiB0ID0gSW50NjQudG9faW50X3RydW5jIChJbnQ2NC5ic3dhcDMyIChJbnQ2NC5vZl9pbnQgdCkpXG4gICAgbGV0IGJzd2FwNDggdCA9IEludDY0LnRvX2ludF90cnVuYyAoSW50NjQuYnN3YXA0OCAoSW50NjQub2ZfaW50IHQpKVxuICBlbmRcblxuICBsZXQgaW1wbCA6IChtb2R1bGUgUykgPVxuICAgIG1hdGNoIHJlcHIgd2l0aFxuICAgIHwgSW1tZWRpYXRlIC0+IChtb2R1bGUgTmF0aXZlIDogUylcbiAgICB8IE5vbl9pbW1lZGlhdGUgLT4gKG1vZHVsZSBJbnQ2M19lbXVsIDogUylcbiAgOztcbmVuZFxuXG5pbmNsdWRlICh2YWwgQmFja2VuZC5pbXBsIDogQmFja2VuZC5TKVxuXG5tb2R1bGUgT3ZlcmZsb3dfZXhuID0gc3RydWN0XG4gIGxldCAoICsgKSB0IHUgPVxuICAgIGxldCBzdW0gPSB0ICsgdSBpblxuICAgIGlmIGJpdF9vciAoYml0X3hvciB0IHUpIChiaXRfeG9yIHQgKGJpdF9ub3Qgc3VtKSkgPCB6ZXJvXG4gICAgdGhlbiBzdW1cbiAgICBlbHNlXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCIoICsgKSBvdmVyZmxvd1wiXG4gICAgICAgICAgIFsgXCJ0XCIsIHNleHBfb2ZfdCB0OyBcInVcIiwgc2V4cF9vZl90IHU7IFwic3VtXCIsIHNleHBfb2ZfdCBzdW0gXSlcbiAgOztcblxuICBsZXQgKCAtICkgdCB1ID1cbiAgICBsZXQgZGlmZiA9IHQgLSB1IGluXG4gICAgbGV0IHBvc19kaWZmID0gdCA+IHUgaW5cbiAgICBpZiB0IDw+IHUgJiYgQm9vbC4oIDw+ICkgcG9zX2RpZmYgKGlzX3Bvc2l0aXZlIGRpZmYpXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiKCAtICkgb3ZlcmZsb3dcIlxuICAgICAgICAgICBbIFwidFwiLCBzZXhwX29mX3QgdDsgXCJ1XCIsIHNleHBfb2ZfdCB1OyBcImRpZmZcIiwgc2V4cF9vZl90IGRpZmYgXSlcbiAgICBlbHNlIGRpZmZcbiAgOztcblxuICBsZXQgbmVnYXRpdmVfb25lID0gb2ZfaW50ICgtMSlcbiAgbGV0IGRpdl93b3VsZF9vdmVyZmxvdyB0IHUgPSB0ID0gbWluX3ZhbHVlICYmIHUgPSBuZWdhdGl2ZV9vbmVcblxuICBsZXQgKCAqICkgdCB1ID1cbiAgICBsZXQgcHJvZHVjdCA9IHQgKiB1IGluXG4gICAgaWYgdSA8PiB6ZXJvICYmIChkaXZfd291bGRfb3ZlcmZsb3cgcHJvZHVjdCB1IHx8IHByb2R1Y3QgLyB1IDw+IHQpXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiKCAqICkgb3ZlcmZsb3dcIlxuICAgICAgICAgICBbIFwidFwiLCBzZXhwX29mX3QgdDsgXCJ1XCIsIHNleHBfb2ZfdCB1OyBcInByb2R1Y3RcIiwgc2V4cF9vZl90IHByb2R1Y3QgXSlcbiAgICBlbHNlIHByb2R1Y3RcbiAgOztcblxuICBsZXQgKCAvICkgdCB1ID1cbiAgICBpZiBkaXZfd291bGRfb3ZlcmZsb3cgdCB1XG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiKCAvICkgb3ZlcmZsb3dcIlxuICAgICAgICAgICBbIFwidFwiLCBzZXhwX29mX3QgdDsgXCJ1XCIsIHNleHBfb2ZfdCB1OyBcInByb2R1Y3RcIiwgc2V4cF9vZl90ICh0IC8gdSkgXSlcbiAgICBlbHNlIHQgLyB1XG4gIDs7XG5cbiAgbGV0IGFicyB0ID0gaWYgdCA9IG1pbl92YWx1ZSB0aGVuIGZhaWx3aXRoIFwiYWJzIG92ZXJmbG93XCIgZWxzZSBhYnMgdFxuICBsZXQgbmVnIHQgPSBpZiB0ID0gbWluX3ZhbHVlIHRoZW4gZmFpbHdpdGggXCJuZWcgb3ZlcmZsb3dcIiBlbHNlIG5lZyB0XG5lbmRcblxubGV0ICgpID0gYXNzZXJ0IChJbnQuKCA9ICkgbnVtX2JpdHMgNjMpXG5cbmxldCByYW5kb21fb2ZfaW50ID8oc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgYm91bmQgPVxuICBvZl9pbnQgKFJhbmRvbS5TdGF0ZS5pbnQgc3RhdGUgKHRvX2ludF9leG4gYm91bmQpKVxuOztcblxubGV0IHJhbmRvbV9vZl9pbnQ2NCA/KHN0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGJvdW5kID1cbiAgb2ZfaW50NjRfZXhuIChSYW5kb20uU3RhdGUuaW50NjQgc3RhdGUgKHRvX2ludDY0IGJvdW5kKSlcbjs7XG5cbmxldCByYW5kb20gPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gcmFuZG9tX29mX2ludFxuICB8IFczMiAtPiByYW5kb21fb2ZfaW50NjRcbjs7XG5cbmxldCByYW5kb21faW5jbF9vZl9pbnQgPyhzdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBsbyBoaSA9XG4gIG9mX2ludCAoUmFuZG9tLlN0YXRlLmludF9pbmNsIHN0YXRlICh0b19pbnRfZXhuIGxvKSAodG9faW50X2V4biBoaSkpXG47O1xuXG5sZXQgcmFuZG9tX2luY2xfb2ZfaW50NjQgPyhzdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBsbyBoaSA9XG4gIG9mX2ludDY0X2V4biAoUmFuZG9tLlN0YXRlLmludDY0X2luY2wgc3RhdGUgKHRvX2ludDY0IGxvKSAodG9faW50NjQgaGkpKVxuOztcblxubGV0IHJhbmRvbV9pbmNsID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IHJhbmRvbV9pbmNsX29mX2ludFxuICB8IFczMiAtPiByYW5kb21faW5jbF9vZl9pbnQ2NFxuOztcblxubGV0IGZsb29yX2xvZzIgdCA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiB0IHw+IHRvX2ludF9leG4gfD4gSW50LmZsb29yX2xvZzJcbiAgfCBXMzIgLT5cbiAgICBpZiB0IDw9IHplcm9cbiAgICB0aGVuIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltJbnQuZmxvb3JfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfdCB0IF0pO1xuICAgIGxldCBmbG9vcl9sb2cyID0gcmVmIChJbnQuKCAtICkgbnVtX2JpdHMgMikgaW5cbiAgICB3aGlsZSBlcXVhbCB6ZXJvIChiaXRfYW5kIHQgKHNoaWZ0X2xlZnQgb25lICFmbG9vcl9sb2cyKSkgZG9cbiAgICAgIGZsb29yX2xvZzIgOj0gSW50LiggLSApICFmbG9vcl9sb2cyIDFcbiAgICBkb25lO1xuICAgICFmbG9vcl9sb2cyXG47O1xuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBtb2R1bGUgUmVwciA9IFJlcHJcblxuICBsZXQgcmVwciA9IHJlcHJcblxuICBtb2R1bGUgRW11bCA9IEludDYzX2VtdWxcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbigqKiBAY2Fub25pY2FsIEJhc2UuSGFzaHRibC5LZXkgKilcbm1vZHVsZSBLZXkgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICAoKiogVHdvIFt0XXMgdGhhdCBbY29tcGFyZV0gZXF1YWwgbXVzdCBoYXZlIGVxdWFsIGhhc2hlcyBmb3IgdGhlIGhhc2h0YWJsZVxuICAgICAgICB0byBiZWhhdmUgcHJvcGVybHkuICopXG4gICAgdmFsIGhhc2ggOiB0IC0+IGludFxuICBlbmRcblxuICB0eXBlICdhIHQgPSAobW9kdWxlIFMgd2l0aCB0eXBlIHQgPSAnYSlcbmVuZFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLkhhc2h0YmwuTWVyZ2VfaW50b19hY3Rpb24gKilcbm1vZHVsZSBNZXJnZV9pbnRvX2FjdGlvbiA9IHN0cnVjdFxuICB0eXBlICdhIHQgPVxuICAgIHwgUmVtb3ZlXG4gICAgfCBTZXRfdG8gb2YgJ2FcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMgPSBzaWdcbiAgKCoqIHsyIEFjY2Vzc29yc30gKilcblxuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAnYSBrZXlcblxuICB2YWwgc2V4cF9vZl9rZXkgOiAoJ2EsIF8pIHQgLT4gJ2Ega2V5IC0+IFNleHAudFxuICB2YWwgY2xlYXIgOiAoXywgXykgdCAtPiB1bml0XG4gIHZhbCBjb3B5IDogKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0XG5cbiAgKCoqIEF0dGVtcHRpbmcgdG8gbW9kaWZ5IChbc2V0XSwgW3JlbW92ZV0sIGV0Yy4pIHRoZSBoYXNodGFibGUgZHVyaW5nIGl0ZXJhdGlvbiAoW2ZvbGRdLFxuICAgICAgW2l0ZXJdLCBbaXRlcl9rZXlzXSwgW2l0ZXJpXSkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uICopXG4gIHZhbCBmb2xkIDogKCdhLCAnYikgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgaXRlcl9rZXlzIDogKCdhLCBfKSB0IC0+IGY6KCdhIGtleSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogSXRlcmF0ZXMgb3ZlciBib3RoIGtleXMgYW5kIHZhbHVlcy5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgNCk7ICg1LCA2KV0gaW5cbiAgICAgIEhhc2h0YmwuaXRlcmkgaCB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICAgICAgcHJpbnRfZW5kbGluZSAoUHJpbnRmLnNwcmludGYgXCIlZC0lZFwiIGtleSBkYXRhKSk7O1xuICAgICAgMS00XG4gICAgICA1LTZcbiAgICAgIC0gOiB1bml0ID0gKClcbiAgICAgIHZ9ICopXG4gIHZhbCBpdGVyaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgZXhpc3RzaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGwgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnRpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudCA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGxlbmd0aCA6IChfLCBfKSB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBtZW0gOiAoJ2EsIF8pIHQgLT4gJ2Ega2V5IC0+IGJvb2xcbiAgdmFsIHJlbW92ZSA6ICgnYSwgXykgdCAtPiAnYSBrZXkgLT4gdW5pdFxuICB2YWwgY2hvb3NlIDogKCdhLCAnYikgdCAtPiAoJ2Ega2V5ICogJ2IpIG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5ICogJ2JcblxuICAoKiogU2V0cyB0aGUgZ2l2ZW4gW2tleV0gdG8gW2RhdGFdLiAqKVxuICB2YWwgc2V0IDogKCdhLCAnYikgdCAtPiBrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gdW5pdFxuXG4gICgqKiBbYWRkXSBhbmQgW2FkZF9leG5dIGxlYXZlIHRoZSB0YWJsZSB1bmNoYW5nZWQgaWYgdGhlIGtleSB3YXMgYWxyZWFkeSBwcmVzZW50LiAqKVxuICB2YWwgYWRkIDogKCdhLCAnYikgdCAtPiBrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gWyBgT2sgfCBgRHVwbGljYXRlIF1cblxuICB2YWwgYWRkX2V4biA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIGtleSAtPiBkYXRhOidiIC0+IHVuaXRcblxuICAoKiogW2NoYW5nZSB0IGtleSB+Zl0gY2hhbmdlcyBbdF0ncyB2YWx1ZSBmb3IgW2tleV0gdG8gYmUgW2YgKGZpbmQgdCBrZXkpXS4gKilcbiAgdmFsIGNoYW5nZSA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+IGY6KCdiIG9wdGlvbiAtPiAnYiBvcHRpb24pIC0+IHVuaXRcblxuICAoKiogW3VwZGF0ZSB0IGtleSB+Zl0gaXMgW2NoYW5nZSB0IGtleSB+ZjooZnVuIG8gLT4gU29tZSAoZiBvKSldLiAqKVxuICB2YWwgdXBkYXRlIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gZjooJ2Igb3B0aW9uIC0+ICdiKSAtPiB1bml0XG5cbiAgKCoqIFt1cGRhdGVfYW5kX3JldHVybiB0IGtleSB+Zl0gaXMgW3VwZGF0ZV0sIGJ1dCByZXR1cm5zIHRoZSByZXN1bHQgb2YgW2Ygb10uICopXG4gIHZhbCB1cGRhdGVfYW5kX3JldHVybiA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+IGY6KCdiIG9wdGlvbiAtPiAnYikgLT4gJ2JcblxuICAoKiogW21hcCB0IGZdIHJldHVybnMgYSBuZXcgdGFibGUgd2l0aCB2YWx1ZXMgcmVwbGFjZWQgYnkgdGhlIHJlc3VsdCBvZiBhcHBseWluZyBbZl1cbiAgICAgIHRvIHRoZSBjdXJyZW50IHZhbHVlcy5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgNCk7ICg1LCA2KV0gaW5cbiAgICAgIGxldCBoJyA9IEhhc2h0YmwubWFwIGggfmY6KGZ1biB4IC0+IHggKiAyKSBpblxuICAgICAgSGFzaHRibC50b19hbGlzdCBoJzs7XG4gICAgICAtIDogKGludCAqIGludCkgbGlzdCA9IFsoNSwgMTIpOyAoMSwgOCldXG4gICAgICB2fSAqKVxuICB2YWwgbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAnYykgLT4gKCdhLCAnYykgdFxuXG4gICgqKiBMaWtlIFttYXBdLCBidXQgdGhlIGZ1bmN0aW9uIFtmXSB0YWtlcyBib3RoIGtleSBhbmQgZGF0YSBhcyBhcmd1bWVudHMuICopXG4gIHZhbCBtYXBpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2MpIC0+ICgnYSwgJ2MpIHRcblxuICAoKiogUmV0dXJucyBhIG5ldyB0YWJsZSBieSBmaWx0ZXJpbmcgdGhlIGdpdmVuIHRhYmxlJ3MgdmFsdWVzIGJ5IFtmXTogdGhlIGtleXMgZm9yIHdoaWNoXG4gICAgICBbZl0gYXBwbGllZCB0byB0aGUgY3VycmVudCB2YWx1ZSByZXR1cm5zIFtTb21lXSBhcmUga2VwdCwgYW5kIHRob3NlIGZvciB3aGljaCBpdFxuICAgICAgcmV0dXJucyBbTm9uZV0gYXJlIGRpc2NhcmRlZC5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgNCk7ICg1LCA2KV0gaW5cbiAgICAgIEhhc2h0YmwuZmlsdGVyX21hcCBoIH5mOihmdW4geCAtPiBpZiB4ID4gNSB0aGVuIFNvbWUgeCBlbHNlIE5vbmUpXG4gICAgICB8PiBIYXNodGJsLnRvX2FsaXN0OztcbiAgICAgIC0gOiAoaW50ICogaW50KSBsaXN0ID0gWyg1LCA2KV1cbiAgICAgIHZ9ICopXG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAnYyBvcHRpb24pIC0+ICgnYSwgJ2MpIHRcblxuICAoKiogTGlrZSBbZmlsdGVyX21hcF0sIGJ1dCB0aGUgZnVuY3Rpb24gW2ZdIHRha2VzIGJvdGgga2V5IGFuZCBkYXRhIGFzIGFyZ3VtZW50cy4gKilcbiAgdmFsIGZpbHRlcl9tYXBpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2Mgb3B0aW9uKSAtPiAoJ2EsICdjKSB0XG5cbiAgdmFsIGZpbHRlcl9rZXlzIDogKCdhLCAnYikgdCAtPiBmOignYSBrZXkgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuICB2YWwgZmlsdGVyIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaWx0ZXJpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuXG4gICgqKiBSZXR1cm5zIG5ldyB0YWJsZXMgd2l0aCBib3VuZCB2YWx1ZXMgcGFydGl0aW9uZWQgYnkgW2ZdIGFwcGxpZWQgdG8gdGhlIGJvdW5kXG4gICAgICB2YWx1ZXMuICopXG4gIHZhbCBwYXJ0aXRpb25fbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAoJ2MsICdkKSBFaXRoZXIudCkgLT4gKCdhLCAnYykgdCAqICgnYSwgJ2QpIHRcblxuICAoKiogTGlrZSBbcGFydGl0aW9uX21hcF0sIGJ1dCB0aGUgZnVuY3Rpb24gW2ZdIHRha2VzIGJvdGgga2V5IGFuZCBkYXRhIGFzIGFyZ3VtZW50cy4gKilcbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjKSB0ICogKCdhLCAnZCkgdFxuXG4gICgqKiBSZXR1cm5zIGEgcGFpciBvZiB0YWJsZXMgWyh0MSwgdDIpXSwgd2hlcmUgW3QxXSBjb250YWlucyBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZVxuICAgICAgaW5pdGlhbCB0YWJsZSB3aGljaCBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgW2ZdLCBhbmQgW3QyXSBjb250YWlucyB0aGUgcmVzdC4gKilcbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdCAqICgnYSwgJ2IpIHRcblxuICAoKiogTGlrZSBbcGFydGl0aW9uX3RmXSwgYnV0IHRoZSBmdW5jdGlvbiBbZl0gdGFrZXMgYm90aCBrZXkgYW5kIGRhdGEgYXMgYXJndW1lbnRzLiAqKVxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiKSB0ICogKCdhLCAnYikgdFxuXG4gICgqKiBbZmluZF9vcl9hZGQgdCBrIH5kZWZhdWx0XSByZXR1cm5zIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBrZXkgW2tdIGlmIGl0IGlzIGluIHRoZVxuICAgICAgdGFibGUgW3RdLCBhbmQgb3RoZXJ3aXNlIGFzc2lnbnMgW2tdIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBbZGVmYXVsdCAoKV0uICopXG4gIHZhbCBmaW5kX29yX2FkZCA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+IGRlZmF1bHQ6KHVuaXQgLT4gJ2IpIC0+ICdiXG5cbiAgKCoqIExpa2UgW2ZpbmRfb3JfYWRkXSBidXQgW2RlZmF1bHRdIHRha2VzIHRoZSBrZXkgYXMgYW4gYXJndW1lbnQuICopXG4gIHZhbCBmaW5kaV9vcl9hZGQgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiBkZWZhdWx0OignYSBrZXkgLT4gJ2IpIC0+ICdiXG5cbiAgKCoqIFtmaW5kIHQga10gcmV0dXJucyBbU29tZV0gKHRoZSBjdXJyZW50IGJpbmRpbmcpIG9mIFtrXSBpbiBbdF0sIG9yIFtOb25lXSBpZiBubyBzdWNoXG4gICAgICBiaW5kaW5nIGV4aXN0cy4gKilcbiAgdmFsIGZpbmQgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiAnYiBvcHRpb25cblxuICAoKiogW2ZpbmRfZXhuIHQga10gcmV0dXJucyB0aGUgY3VycmVudCBiaW5kaW5nIG9mIFtrXSBpbiBbdF0sIG9yIHJhaXNlcyBbQ2FtbC5Ob3RfZm91bmRdXG4gICAgICBvciBbTm90X2ZvdW5kX3NdIGlmIG5vIHN1Y2ggYmluZGluZyBleGlzdHMuICopXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+ICdiXG5cbiAgKCoqIFtmaW5kX2FuZF9jYWxsIHQgayB+aWZfZm91bmQgfmlmX25vdF9mb3VuZF1cblxuICAgICAgaXMgZXF1aXZhbGVudCB0bzpcblxuICAgICAgW21hdGNoIGZpbmQgdCBrIHdpdGggU29tZSB2IC0+IGlmX2ZvdW5kIHYgfCBOb25lIC0+IGlmX25vdF9mb3VuZCBrXVxuXG4gICAgICBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFsbG9jYXRlIHRoZSBvcHRpb24uICopXG4gIHZhbCBmaW5kX2FuZF9jYWxsXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGlmX2ZvdW5kOignYiAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnYylcbiAgICAtPiAnY1xuXG4gICgqKiBKdXN0IGxpa2UgW2ZpbmRfYW5kX2NhbGxdLCBidXQgdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQgd2hpY2ggaXMgcGFzc2VkIHRvIFtpZl9mb3VuZF1cbiAgICAgIGFuZCBbaWZfbm90X2ZvdW5kXSwgc28gdGhhdCB0aGUgY2xpZW50IGNvZGUgY2FuIGF2b2lkIGFsbG9jYXRpbmcgY2xvc3VyZXMgb3IgdXNpbmdcbiAgICAgIHJlZnMgdG8gcGFzcyB0aGlzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZnVsIGluIGNvZGVcbiAgICAgIHdoaWNoIHRyaWVzIHRvIG1pbmltaXplIGhlYXAgYWxsb2NhdGlvbi4gKilcbiAgdmFsIGZpbmRfYW5kX2NhbGwxXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGE6J2RcbiAgICAtPiBpZl9mb3VuZDooJ2IgLT4gJ2QgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2QgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgZmluZF9hbmRfY2FsbDJcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gYTonZFxuICAgIC0+IGI6J2VcbiAgICAtPiBpZl9mb3VuZDooJ2IgLT4gJ2QgLT4gJ2UgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2QgLT4gJ2UgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgZmluZGlfYW5kX2NhbGxcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gaWZfZm91bmQ6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBmaW5kaV9hbmRfY2FsbDFcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gYTonZFxuICAgIC0+IGlmX2ZvdW5kOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2QgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2QgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgZmluZGlfYW5kX2NhbGwyXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGE6J2RcbiAgICAtPiBiOidlXG4gICAgLT4gaWZfZm91bmQ6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnZCAtPiAnZSAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnZCAtPiAnZSAtPiAnYylcbiAgICAtPiAnY1xuXG4gICgqKiBbZmluZF9hbmRfcmVtb3ZlIHQga10gcmV0dXJucyBTb21lICh0aGUgY3VycmVudCBiaW5kaW5nKSBvZiBrIGluIHQgYW5kIHJlbW92ZXMgaXQsXG4gICAgICBvciBOb25lIGlzIG5vIHN1Y2ggYmluZGluZyBleGlzdHMuICopXG4gIHZhbCBmaW5kX2FuZF9yZW1vdmUgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiAnYiBvcHRpb25cblxuICAoKiogTWVyZ2VzIHR3byBoYXNodGFibGVzLlxuXG4gICAgICBUaGUgcmVzdWx0IG9mIFttZXJnZSBmIGgxIGgyXSBoYXMgYXMga2V5cyB0aGUgc2V0IG9mIGFsbCBba10gaW4gdGhlIHVuaW9uIG9mIHRoZVxuICAgICAgc2V0cyBvZiBrZXlzIG9mIFtoMV0gYW5kIFtoMl0gZm9yIHdoaWNoIFtkKGspXSBpcyBub3QgTm9uZSwgd2hlcmU6XG5cbiAgICAgIGQoaykgPVxuICAgICAgLSBbZiB+a2V5OmsgKGBMZWZ0IGQxKV1cbiAgICAgICAgaWYgW2tdIGluIFtoMV0gbWFwcyB0byBkMSwgYW5kIFtoMl0gZG9lcyBub3QgaGF2ZSBkYXRhIGZvciBba107XG5cbiAgICAgIC0gW2YgfmtleTprIChgUmlnaHQgZDIpXVxuICAgICAgICBpZiBba10gaW4gW2gyXSBtYXBzIHRvIGQyLCBhbmQgW2gxXSBkb2VzIG5vdCBoYXZlIGRhdGEgZm9yIFtrXTtcblxuICAgICAgLSBbZiB+a2V5OmsgKGBCb3RoIChkMSwgZDIpKV1cbiAgICAgICAgb3RoZXJ3aXNlLCB3aGVyZSBba10gaW4gW2gxXSBtYXBzIHRvIFtkMV0gYW5kIFtrXSBpbiBbaDJdIG1hcHMgdG8gW2QyXS5cblxuICAgICAgRWFjaCBrZXkgW2tdIGlzIG1hcHBlZCB0byBhIHNpbmdsZSBwaWVjZSBvZiBkYXRhIFt4XSwgd2hlcmUgW2QoaykgPSBTb21lIHhdLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgbGV0IGgxID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgNSk7ICgyLCAzMjMyKV0gaW5cbiAgICAgIGxldCBoMiA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDMpXSBpblxuICAgICAgSGFzaHRibC5tZXJnZSBoMSBoMiB+ZjooZnVuIH5rZXk6XyAtPiBmdW5jdGlvblxuICAgICAgICB8IGBMZWZ0IHggLT4gU29tZSAoYExlZnQgeClcbiAgICAgICAgfCBgUmlnaHQgeCAtPiBTb21lIChgUmlnaHQgeClcbiAgICAgICAgfCBgQm90aCAoeCwgeSkgLT4gaWYgeD15IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGBCb3RoICh4LHkpKVxuICAgICAgKSB8PiBIYXNodGJsLnRvX2FsaXN0OztcbiAgICAgIC0gOiAoaW50ICogWz4gYEJvdGggb2YgaW50ICogaW50IHwgYExlZnQgb2YgaW50IHwgYFJpZ2h0IG9mIGludCBdKSBsaXN0ID1cbiAgICAgIFsoMiwgYExlZnQgMzIzMik7ICgxLCBgQm90aCAoNSwgMykpXVxuICAgICAgdn0gKilcbiAgdmFsIG1lcmdlXG4gICAgOiAgKCdrLCAnYSkgdFxuICAgIC0+ICgnaywgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2sga2V5IC0+IFsgYExlZnQgb2YgJ2EgfCBgUmlnaHQgb2YgJ2IgfCBgQm90aCBvZiAnYSAqICdiIF0gLT4gJ2Mgb3B0aW9uKVxuICAgIC0+ICgnaywgJ2MpIHRcblxuXG4gICgqKiBFdmVyeSBba2V5XSBpbiBbc3JjXSB3aWxsIGJlIHJlbW92ZWQgb3Igc2V0IGluIFtkc3RdIGFjY29yZGluZyB0byB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICBvZiBbZl0uICopXG4gIHZhbCBtZXJnZV9pbnRvXG4gICAgOiAgc3JjOignaywgJ2EpIHRcbiAgICAtPiBkc3Q6KCdrLCAnYikgdFxuICAgIC0+IGY6KGtleTonayBrZXkgLT4gJ2EgLT4gJ2Igb3B0aW9uIC0+ICdiIE1lcmdlX2ludG9fYWN0aW9uLnQpXG4gICAgLT4gdW5pdFxuXG4gICgqKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBrZXlzIGZvciBnaXZlbiBoYXNodGFibGUuICopXG4gIHZhbCBrZXlzIDogKCdhLCBfKSB0IC0+ICdhIGtleSBsaXN0XG5cbiAgKCoqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGRhdGEgZm9yIGdpdmVuIGhhc2h0YWJsZS4gKilcbiAgdmFsIGRhdGEgOiAoXywgJ2IpIHQgLT4gJ2IgbGlzdFxuXG4gICgqKiBbZmlsdGVyX2lucGxhY2UgdCB+Zl0gcmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gW3RdIHRoYXQgZG9uJ3Qgc2F0aXNmeSBbZl0uICopXG4gIHZhbCBmaWx0ZXJfa2V5c19pbnBsYWNlIDogKCdhLCBfKSB0IC0+IGY6KCdhIGtleSAtPiBib29sKSAtPiB1bml0XG5cbiAgdmFsIGZpbHRlcl9pbnBsYWNlIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IHVuaXRcbiAgdmFsIGZpbHRlcmlfaW5wbGFjZSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IHVuaXRcblxuICAoKiogW21hcF9pbnBsYWNlIHQgfmZdIGFwcGxpZXMgW2ZdIHRvIGFsbCBlbGVtZW50cyBpbiBbdF0sIHRyYW5zZm9ybWluZyB0aGVtIGluXG4gICAgICBwbGFjZS4gKilcbiAgdmFsIG1hcF9pbnBsYWNlIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+ICdiKSAtPiB1bml0XG5cbiAgdmFsIG1hcGlfaW5wbGFjZSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdiKSAtPiB1bml0XG5cbiAgKCoqIFtmaWx0ZXJfbWFwX2lucGxhY2VdIGNvbWJpbmVzIHRoZSBlZmZlY3RzIG9mIFttYXBfaW5wbGFjZV0gYW5kIFtmaWx0ZXJfaW5wbGFjZV0uICopXG4gIHZhbCBmaWx0ZXJfbWFwX2lucGxhY2UgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gJ2Igb3B0aW9uKSAtPiB1bml0XG5cbiAgdmFsIGZpbHRlcl9tYXBpX2lucGxhY2UgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYiBvcHRpb24pIC0+IHVuaXRcblxuICAoKiogW2VxdWFsIGYgdDEgdDJdIGFuZCBbc2ltaWxhciBmIHQxIHQyXSBib3RoIHJldHVybiB0cnVlIGlmZiBbdDFdIGFuZCBbdDJdIGhhdmUgdGhlXG4gICAgICBzYW1lIGtleXMgYW5kIGZvciBhbGwga2V5cyBba10sIFtmIChmaW5kX2V4biB0MSBrKSAoZmluZF9leG4gdDIgayldLiAgW2VxdWFsXSBhbmRcbiAgICAgIFtzaW1pbGFyXSBvbmx5IGRpZmZlciBpbiB0aGVpciB0eXBlcy4gKilcbiAgdmFsIGVxdWFsIDogKCdiIC0+ICdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBib29sXG5cbiAgdmFsIHNpbWlsYXIgOiAoJ2IxIC0+ICdiMiAtPiBib29sKSAtPiAoJ2EsICdiMSkgdCAtPiAoJ2EsICdiMikgdCAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIChrZXksIGRhdGEpIHBhaXJzIGZvciBnaXZlbiBoYXNodGFibGUuICopXG4gIHZhbCB0b19hbGlzdCA6ICgnYSwgJ2IpIHQgLT4gKCdhIGtleSAqICdiKSBsaXN0XG5cblxuICAoKiogW3JlbW92ZV9pZl96ZXJvXSdzIGRlZmF1bHQgaXMgW2ZhbHNlXS4gKilcbiAgdmFsIGluY3IgOiA/Ynk6aW50IC0+ID9yZW1vdmVfaWZfemVybzpib29sIC0+ICgnYSwgaW50KSB0IC0+ICdhIGtleSAtPiB1bml0XG5cbiAgdmFsIGRlY3IgOiA/Ynk6aW50IC0+ID9yZW1vdmVfaWZfemVybzpib29sIC0+ICgnYSwgaW50KSB0IC0+ICdhIGtleSAtPiB1bml0XG5lbmRcblxubW9kdWxlIHR5cGUgTXVsdGkgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgJ2Ega2V5XG5cbiAgKCoqIFthZGRfbXVsdGkgdCB+a2V5IH5kYXRhXSBpZiBba2V5XSBpcyBwcmVzZW50IGluIHRoZSB0YWJsZSB0aGVuIGNvbnNcbiAgICAgIFtkYXRhXSBvbiB0aGUgbGlzdCwgb3RoZXJ3aXNlIGFkZCBba2V5XSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgbGlzdC4gKilcbiAgdmFsIGFkZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCkgdCAtPiBrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gdW5pdFxuXG4gICgqKiBbcmVtb3ZlX211bHRpIHQga2V5XSB1cGRhdGVzIHRoZSB0YWJsZSwgcmVtb3ZpbmcgdGhlIGhlYWQgb2YgdGhlIGxpc3QgYm91bmQgdG9cbiAgICAgIFtrZXldLiBJZiB0aGUgbGlzdCBoYXMgb25seSBvbmUgZWxlbWVudCAob3IgaXMgZW1wdHkpIHRoZW4gdGhlIGJpbmRpbmcgaXNcbiAgICAgIHJlbW92ZWQuICopXG4gIHZhbCByZW1vdmVfbXVsdGkgOiAoJ2EsIF8gbGlzdCkgdCAtPiAnYSBrZXkgLT4gdW5pdFxuXG4gICgqKiBbZmluZF9tdWx0aSB0IGtleV0gcmV0dXJucyB0aGUgZW1wdHkgbGlzdCBpZiBba2V5XSBpcyBub3QgcHJlc2VudCBpbiB0aGUgdGFibGUsXG4gICAgICByZXR1cm5zIFt0XSdzIHZhbHVlcyBmb3IgW2tleV0gb3RoZXJ3aXNlLiAqKVxuICB2YWwgZmluZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCkgdCAtPiAnYSBrZXkgLT4gJ2IgbGlzdFxuZW5kXG5cbnR5cGUgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnMgPVxuICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAtPiAna2V5IEtleS50XG4gIC0+ICd6XG5cbnR5cGUgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGUgPVxuICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAtPiAnelxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICdhIGtleVxuICB0eXBlICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIGNyZWF0ZSA6ICgnYSBrZXksICdiLCB1bml0IC0+ICgnYSwgJ2IpIHQpIGNyZWF0ZV9vcHRpb25zXG5cblxuICB2YWwgb2ZfYWxpc3RcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdiXG4gICAgICAsICgnYSBrZXkgKiAnYikgbGlzdCAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2Ega2V5IF0gKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHNcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdiXG4gICAgICAsICgnYSBrZXkgKiAnYikgbGlzdCAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGtleSBsaXN0IF0gKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvclxuICAgIDogKCdhIGtleSwgJ2IsICgnYSBrZXkgKiAnYikgbGlzdCAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnQpIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X2V4biA6ICgnYSBrZXksICdiLCAoJ2Ega2V5ICogJ2IpIGxpc3QgLT4gKCdhLCAnYikgdCkgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfbXVsdGlcbiAgICA6ICgnYSBrZXksICdiIGxpc3QsICgnYSBrZXkgKiAnYikgbGlzdCAtPiAoJ2EsICdiIGxpc3QpIHQpIGNyZWF0ZV9vcHRpb25zXG5cblxuICAoKioge1sgY3JlYXRlX21hcHBlZCBnZXRfa2V5IGdldF9kYXRhIFt4MSwuLi4seG5dXG4gICAgICAgICA9IG9mX2FsaXN0IFtnZXRfa2V5IHgxLCBnZXRfZGF0YSB4MTsgLi4uOyBnZXRfa2V5IHhuLCBnZXRfZGF0YSB4bl0gXX0gKilcbiAgdmFsIGNyZWF0ZV9tYXBwZWRcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdiXG4gICAgICAsIGdldF9rZXk6KCdyIC0+ICdhIGtleSlcbiAgICAgICAgLT4gZ2V0X2RhdGE6KCdyIC0+ICdiKVxuICAgICAgICAtPiAnciBsaXN0XG4gICAgICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2Ega2V5IGxpc3QgXSApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5cblxuICAoKioge1sgY3JlYXRlX3dpdGhfa2V5IH5nZXRfa2V5IFt4MSwuLi4seG5dXG4gICAgICAgICA9IG9mX2FsaXN0IFtnZXRfa2V5IHgxLCB4MTsgLi4uOyBnZXRfa2V5IHhuLCB4bl0gXX0gKilcbiAgdmFsIGNyZWF0ZV93aXRoX2tleVxuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ3JcbiAgICAgICwgZ2V0X2tleTooJ3IgLT4gJ2Ega2V5KVxuICAgICAgICAtPiAnciBsaXN0XG4gICAgICAgIC0+IFsgYE9rIG9mICgnYSwgJ3IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2Ega2V5IGxpc3QgXSApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvclxuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ3JcbiAgICAgICwgZ2V0X2tleTooJ3IgLT4gJ2Ega2V5KSAtPiAnciBsaXN0IC0+ICgnYSwgJ3IpIHQgT3JfZXJyb3IudCApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIGNyZWF0ZV93aXRoX2tleV9leG5cbiAgICA6ICgnYSBrZXksICdyLCBnZXRfa2V5OignciAtPiAnYSBrZXkpIC0+ICdyIGxpc3QgLT4gKCdhLCAncikgdCkgY3JlYXRlX29wdGlvbnNcblxuXG4gIHZhbCBncm91cFxuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ2JcbiAgICAgICwgZ2V0X2tleTooJ3IgLT4gJ2Ega2V5KVxuICAgICAgICAtPiBnZXRfZGF0YTooJ3IgLT4gJ2IpXG4gICAgICAgIC0+IGNvbWJpbmU6KCdiIC0+ICdiIC0+ICdiKVxuICAgICAgICAtPiAnciBsaXN0XG4gICAgICAgIC0+ICgnYSwgJ2IpIHQgKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuXG4gICgqKiB7MiBDcmVhdG9yc30gKilcblxuICAoKiogVGhlIG1vZHVsZSB5b3UgcGFzcyB0byBbY3JlYXRlXSBtdXN0IGhhdmUgYSB0eXBlIHRoYXQgaXMgaGFzaGFibGUsIHNleHBhYmxlLCBhbmRcbiAgICAgIGNvbXBhcmFibGUuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICAgIEhhc2h0YmwuY3JlYXRlIChtb2R1bGUgSW50KTs7XG4gICAgICAgIC0gOiAoaW50LCAnX2EpIEhhc2h0YmwudCA9IDxhYnN0cj47O1xuICAgICAgdn0gKilcbiAgdmFsIGNyZWF0ZVxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSwgJ2IpIHRcblxuICAoKiogRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgICAgIEhhc2h0Ymwub2ZfYWxpc3QgKG1vZHVsZSBJbnQpIFsoMywgXCJzb21ldGhpbmdcIik7ICgyLCBcIndoYXRldmVyXCIpXVxuICAgICAgICAgLSA6IFsgYER1cGxpY2F0ZV9rZXkgb2YgaW50IHwgYE9rIG9mIChpbnQsIHN0cmluZykgSGFzaHRibC50IF0gPSBgT2sgPGFic3RyPlxuICAgICAgdn0gKilcbiAgdmFsIG9mX2FsaXN0XG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gICgqKiBXaGVyZWFzIFtvZl9hbGlzdF0gd2lsbCByZXBvcnQgW0R1cGxpY2F0ZV9rZXldIG5vIG1hdHRlciBob3cgbWFueSBkdXBzIHRoZXJlIGFyZSBpblxuICAgICAgeW91ciBsaXN0LCBbb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzXSB3aWxsIHJlcG9ydCBlYWNoIGFuZCBldmVyeSBkdXBsaWNhdGUgZW50cnkuXG5cbiAgICAgIEZvciBleGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgICBIYXNodGJsLm9mX2FsaXN0IChtb2R1bGUgSW50KSBbKDEsIFwiZm9vXCIpOyAoMSwgXCJiYXJcIik7ICgyLCBcImZvb1wiKTsgKDIsIFwiYmFyXCIpXTs7XG4gICAgICAgIC0gOiBbIGBEdXBsaWNhdGVfa2V5IG9mIGludCB8IGBPayBvZiAoaW50LCBzdHJpbmcpIEhhc2h0YmwudCBdID0gYER1cGxpY2F0ZV9rZXkgMVxuXG4gICAgICAgIEhhc2h0Ymwub2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzIChtb2R1bGUgSW50KSBbKDEsIFwiZm9vXCIpOyAoMSwgXCJiYXJcIik7ICgyLCBcImZvb1wiKTsgKDIsIFwiYmFyXCIpXTs7XG4gICAgICAgIC0gOiBbIGBEdXBsaWNhdGVfa2V5cyBvZiBpbnQgbGlzdCB8IGBPayBvZiAoaW50LCBzdHJpbmcpIEhhc2h0YmwudCBdID0gYER1cGxpY2F0ZV9rZXlzIFsxOyAyXVxuICAgICAgdn0gKilcbiAgdmFsIG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwc1xuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBsaXN0IF1cblxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3JcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9hbGlzdF9leG5cbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IpIHRcblxuICAoKiogQ3JlYXRlcyBhIHt7IU11bHRpfSBcIm11bHRpXCJ9IGhhc2h0YWJsZSwgaS5lLiwgYSBoYXNodGFibGUgd2hlcmUgZWFjaCBrZXkgcG9pbnRzIHRvIGFcbiAgICAgIGxpc3QgcG90ZW50aWFsbHkgY29udGFpbmluZyBtdWx0aXBsZSB2YWx1ZXMuIFNvIGluc3RlYWQgb2Ygc2hvcnQtY2lyY3VpdGluZyB3aXRoIGFcbiAgICAgIFtgRHVwbGljYXRlX2tleV0gdmFyaWFudCBvbiBkdXBsaWNhdGVzLCBhcyBpbiBbb2ZfYWxpc3RdLCBbb2ZfYWxpc3RfbXVsdGldIGZvbGRzXG4gICAgICB0aG9zZSB2YWx1ZXMgaW50byBhIGxpc3QgZm9yIHRoZSBnaXZlbiBrZXk6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaCA9IEhhc2h0Ymwub2ZfYWxpc3RfbXVsdGkgKG1vZHVsZSBJbnQpIFsoMSwgXCJhXCIpOyAoMSwgXCJiXCIpOyAoMiwgXCJjXCIpOyAoMiwgXCJkXCIpXTs7XG4gICAgICB2YWwgaCA6IChpbnQsIHN0cmluZyBsaXN0KSBIYXNodGJsLnQgPSA8YWJzdHI+XG5cbiAgICAgIEhhc2h0YmwuZmluZF9leG4gaCAxOztcbiAgICAgIC0gOiBzdHJpbmcgbGlzdCA9IFtcImJcIjsgXCJhXCJdXG4gICAgICB2fSAqKVxuICB2YWwgb2ZfYWxpc3RfbXVsdGlcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IgbGlzdCkgdFxuXG4gICgqKiBBcHBsaWVzIHRoZSBbZ2V0X2tleV0gYW5kIFtnZXRfZGF0YV0gZnVuY3Rpb25zIHRvIHRoZSBbJ3IgbGlzdF0gdG8gY3JlYXRlIHRoZVxuICAgICAgaW5pdGlhbCBrZXlzIGFuZCB2YWx1ZXMsIHJlc3BlY3RpdmVseSwgZm9yIHRoZSBuZXcgaGFzaHRhYmxlLlxuXG4gICAgICB7WyBjcmVhdGVfbWFwcGVkIGdldF9rZXkgZ2V0X2RhdGEgW3gxOy4uLjt4bl1cbiAgICAgICAgID0gb2ZfYWxpc3QgW2dldF9rZXkgeDEsIGdldF9kYXRhIHgxOyAuLi47IGdldF9rZXkgeG4sIGdldF9kYXRhIHhuXVxuICAgICAgXX1cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgICAgbGV0IGggPVxuICAgICAgICAgIEhhc2h0YmwuY3JlYXRlX21hcHBlZCAobW9kdWxlIEludClcbiAgICAgICAgICAgIH5nZXRfa2V5OihmdW4geCAtPiB4KVxuICAgICAgICAgICAgfmdldF9kYXRhOihmdW4geCAtPiB4ICsgMSlcbiAgICAgICAgICAgWzE7IDI7IDNdOztcbiAgICAgICAgdmFsIGggOiBbIGBEdXBsaWNhdGVfa2V5cyBvZiBpbnQgbGlzdCB8IGBPayBvZiAoaW50LCBpbnQpIEhhc2h0YmwudCBdID0gYE9rIDxhYnN0cj5cblxuICAgICAgICBsZXQgaCA9XG4gICAgICAgICAgbWF0Y2ggaCB3aXRoXG4gICAgICAgICAgfCBgT2sgeCAtPiB4XG4gICAgICAgICAgfCBgRHVwbGljYXRlX2tleXMgXyAtPiBmYWlsd2l0aCBcIlwiXG4gICAgICAgIGluXG4gICAgICAgIEhhc2h0YmwuZmluZF9leG4gaCAxOztcbiAgICAgICAgLSA6IGludCA9IDJcbiAgICAgIHZ9ICopXG4gIHZhbCBjcmVhdGVfbWFwcGVkXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gZ2V0X2tleTooJ3IgLT4gJ2EpXG4gICAgLT4gZ2V0X2RhdGE6KCdyIC0+ICdiKVxuICAgIC0+ICdyIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGxpc3QgXVxuXG4gICgqKiB7WyBjcmVhdGVfd2l0aF9rZXkgfmdldF9rZXkgW3gxOy4uLjt4bl1cbiAgICAgICAgID0gb2ZfYWxpc3QgW2dldF9rZXkgeDEsIHgxOyAuLi47IGdldF9rZXkgeG4sIHhuXSBdfSAqKVxuICB2YWwgY3JlYXRlX3dpdGhfa2V5XG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gZ2V0X2tleTooJ3IgLT4gJ2EpXG4gICAgLT4gJ3IgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ3IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2EgbGlzdCBdXG5cbiAgdmFsIGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvclxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+IGdldF9rZXk6KCdyIC0+ICdhKVxuICAgIC0+ICdyIGxpc3RcbiAgICAtPiAoJ2EsICdyKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgY3JlYXRlX3dpdGhfa2V5X2V4blxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+IGdldF9rZXk6KCdyIC0+ICdhKVxuICAgIC0+ICdyIGxpc3RcbiAgICAtPiAoJ2EsICdyKSB0XG5cbiAgKCoqIExpa2UgW2NyZWF0ZV9tYXBwZWRdLCBhcHBsaWVzIHRoZSBbZ2V0X2tleV0gYW5kIFtnZXRfZGF0YV0gZnVuY3Rpb25zIHRvIHRoZSBbJ3JcbiAgICAgIGxpc3RdIHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBrZXlzIGFuZCB2YWx1ZXMsIHJlc3BlY3RpdmVseSwgZm9yIHRoZSBuZXcgaGFzaHRhYmxlIC0tXG4gICAgICBhbmQgdGhlbiwgbGlrZSBbYWRkX211bHRpXSwgZm9sZHMgdG9nZXRoZXIgdmFsdWVzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBrZXlzLiBIZXJlLFxuICAgICAgdGhvdWdoLCB0aGUgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIGZvbGRpbmcgaXMgZ2l2ZW4gYnkgW2NvbWJpbmVdIChpbnN0ZWFkIG9mIGp1c3RcbiAgICAgIGJlaW5nIGEgW2NvbnNdKS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgICAgIEhhc2h0YmwuZ3JvdXAgKG1vZHVsZSBJbnQpXG4gICAgICAgICAgIH5nZXRfa2V5OihmdW4geCAtPiB4IC8gMilcbiAgICAgICAgICAgfmdldF9kYXRhOihmdW4geCAtPiB4KVxuICAgICAgICAgICB+Y29tYmluZTooZnVuIHggeSAtPiB4ICogeSlcbiAgICAgICAgICAgIFsgMTsgMjsgMzsgNF1cbiAgICAgICAgIHw+IEhhc2h0YmwudG9fYWxpc3Q7O1xuICAgICAgICAgLSA6IChpbnQgKiBpbnQpIGxpc3QgPSBbKDIsIDQpOyAoMSwgNik7ICgwLCAxKV1cbiAgICAgICB2fSAqKVxuICB2YWwgZ3JvdXBcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiBnZXRfa2V5OignciAtPiAnYSlcbiAgICAtPiBnZXRfZGF0YTooJ3IgLT4gJ2IpXG4gICAgLT4gY29tYmluZTooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gJ3IgbGlzdFxuICAgIC0+ICgnYSwgJ2IpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX3dpdGhvdXRfc3VibW9kdWxlcyA9IHNpZ1xuICB2YWwgaGFzaCA6ICdhIC0+IGludFxuICB2YWwgaGFzaF9wYXJhbSA6IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50XG5cbiAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgKCoqIFdlIHByb3ZpZGUgYSBbc2V4cF9vZl90XSBidXQgbm90IGEgW3Rfb2Zfc2V4cF0gZm9yIHRoaXMgdHlwZSBiZWNhdXNlIG9uZSBuZWVkcyB0byBiZVxuICAgICAgZXhwbGljaXQgYWJvdXQgdGhlIGhhc2ggYW5kIGNvbXBhcmlzb24gZnVuY3Rpb25zIHVzZWQgd2hlbiBjcmVhdGluZyBhIGhhc2h0YWJsZS5cbiAgICAgIE5vdGUgdGhhdCBbSGFzaHRibC5Qb2x5LnRdIGRvZXMgaGF2ZSBbW0BAZGVyaXZpbmcgc2V4cF1dLCBhbmQgdXNlcyBPQ2FtbCdzIGJ1aWx0LWluXG4gICAgICBwb2x5bW9ycGhpYyBjb21wYXJpc29uIGFuZCBhbmQgcG9seW1vcnBoaWMgaGFzaGluZy4gKilcbiAgdmFsIHNleHBfb2ZfdCA6ICgnYSAtPiBTZXhwLnQpIC0+ICgnYiAtPiBTZXhwLnQpIC0+ICgnYSwgJ2IpIHQgLT4gU2V4cC50XG5cbiAgaW5jbHVkZSBDcmVhdG9ycyB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0ICgqKiBAaW5saW5lICopXG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnMgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCB3aXRoIHR5cGUgJ2Ega2V5ID0gJ2FcbiAgKCoqIEBpbmxpbmUgKilcblxuXG4gIGluY2x1ZGUgTXVsdGkgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIGtleVxuICAoKiogQGlubGluZSAqKVxuXG4gIHZhbCBoYXNoYWJsZV9zIDogKCdrZXksIF8pIHQgLT4gJ2tleSBLZXkudFxuXG4gIGluY2x1ZGUgSW52YXJpYW50LlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX3BvbHkgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZS5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyXG4gICAgOiAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAtPiAnYiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgIC0+ICgnYSwgJ2IpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuXG4gIHZhbCBoYXNoYWJsZSA6ICdhIEhhc2hhYmxlLnRcblxuICBpbmNsdWRlIEludmFyaWFudC5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzX2dlbmVyaWNcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgd2l0aCB0eXBlICdhIGtleSA9ICdhXG4gICAgd2l0aCB0eXBlICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zIDo9XG4gICAgICAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBrZXlcbiAgaW5jbHVkZSBNdWx0aSB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0IHdpdGggdHlwZSAnYSBrZXkgOj0gJ2Ega2V5XG5lbmRcblxubW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gc2lnXG4gIHR5cGUgKCdrLCAndikgdFxuXG4gIG1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gICAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgaW5jbHVkZSBLZXkuUyB3aXRoIHR5cGUgdCA6PSB0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxuXG4gIHZhbCBzZXhwX29mX21fX3RcbiAgICA6ICAobW9kdWxlIFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+ICgndiAtPiBTZXhwLnQpXG4gICAgLT4gKCdrLCAndikgdFxuICAgIC0+IFNleHAudFxuXG4gIHZhbCBtX190X29mX3NleHBcbiAgICA6ICAobW9kdWxlIE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+IChTZXhwLnQgLT4gJ3YpXG4gICAgLT4gU2V4cC50XG4gICAgLT4gKCdrLCAndikgdFxuXG4gIHZhbCBtX190X3NleHBfZ3JhbW1hclxuICAgIDogIChtb2R1bGUgTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAndiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgIC0+ICgnaywgJ3YpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICB2YWwgZXF1YWxfbV9fdFxuICAgIDogIChtb2R1bGUgRXF1YWxfbSlcbiAgICAtPiAoJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgLT4gKCdrLCAndikgdFxuICAgIC0+IGJvb2xcbmVuZFxuXG5tb2R1bGUgdHlwZSBIYXNodGJsID0gc2lnXG4gICgqKiBBIGhhc2ggdGFibGUgaXMgYSBtdXRhYmxlIGRhdGEgc3RydWN0dXJlIGltcGxlbWVudGluZyBhIG1hcCBiZXR3ZWVuIGtleXMgYW5kIHZhbHVlcy5cbiAgICAgIEl0IHN1cHBvcnRzIGNvbnN0YW50LXRpbWUgbG9va3VwIGFuZCBpbi1wbGFjZSBtb2RpZmljYXRpb24uXG5cbiAgICAgIHsxIFVzYWdlfVxuXG4gICAgICBBcyBhIHNpbXBsZSBleGFtcGxlLCB3ZSdsbCBjcmVhdGUgYSBoYXNoIHRhYmxlIHdpdGggc3RyaW5nIGtleXMgdXNpbmcgdGhlXG4gICAgICB7eyFjcmVhdGV9W2NyZWF0ZV19IGNvbnN0cnVjdG9yLCB3aGljaCBleHBlY3RzIGEgbW9kdWxlIGRlZmluaW5nIHRoZSBrZXkncyB0eXBlOlxuXG4gICAgICB7W1xuICAgICAgICBsZXQgaCA9IEhhc2h0YmwuY3JlYXRlIChtb2R1bGUgU3RyaW5nKTs7XG4gICAgICAgIHZhbCBoIDogKHN0cmluZywgJ19hKSBIYXNodGJsLnQgPSA8YWJzdHI+XG4gICAgICBdfVxuXG4gICAgICBXZSBjYW4gc2V0IHRoZSB2YWx1ZXMgb2YgaW5kaXZpZHVhbCBrZXlzIHdpdGgge3shc2V0fVtzZXRdfS4gSWYgdGhlIGtleSBhbHJlYWR5IGhhc1xuICAgICAgYSB2YWx1ZSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi5cblxuICAgICAge3ZcbiAgICAgIEhhc2h0Ymwuc2V0IGggfmtleTpcImZvb1wiIH5kYXRhOjU7O1xuICAgICAgLSA6IHVuaXQgPSAoKVxuXG4gICAgICBIYXNodGJsLnNldCBoIH5rZXk6XCJmb29cIiB+ZGF0YTo2OztcbiAgICAgIC0gOiB1bml0ID0gKClcblxuICAgICAgSGFzaHRibC5zZXQgaCB+a2V5OlwiYmFyXCIgfmRhdGE6Njs7XG4gICAgICAtIDogdW5pdCA9ICgpXG4gICAgICB2fVxuXG4gICAgICBXZSBjYW4gYWNjZXNzIHZhbHVlcyBieSBrZXksIG9yIGR1bXAgYWxsIG9mIHRoZSBoYXNoIHRhYmxlJ3MgZGF0YTpcblxuICAgICAge3ZcbiAgICAgIEhhc2h0YmwuZmluZCBoIFwiZm9vXCI7O1xuICAgICAgLSA6IGludCBvcHRpb24gPSBTb21lIDZcblxuICAgICAgSGFzaHRibC5maW5kX2V4biBoIFwiZm9vXCI7O1xuICAgICAgLSA6IGludCA9IDZcblxuICAgICAgSGFzaHRibC50b19hbGlzdCBoOztcbiAgICAgIC0gOiAoc3RyaW5nICogaW50KSBsaXN0ID0gWyhcImZvb1wiLCA2KTsgKFwiYmFyXCIsIDYpXVxuICAgICAgdn1cblxuICAgICAge3shY2hhbmdlfVtjaGFuZ2VdfSBsZXRzIHVzIGNoYW5nZSBhIGtleSdzIHZhbHVlIGJ5IGFwcGx5aW5nIHRoZSBnaXZlbiBmdW5jdGlvbjpcblxuICAgICAge3ZcbiAgICAgIEhhc2h0YmwuY2hhbmdlIGggXCJmb29cIiAoZnVuIHggLT5cbiAgICAgICBtYXRjaCB4IHdpdGhcbiAgICAgICB8IFNvbWUgeCAtPiBTb21lICh4ICogMilcbiAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgKTs7XG4gICAgICAtIDogdW5pdCA9ICgpXG5cbiAgICAgIEhhc2h0YmwudG9fYWxpc3QgaDs7XG4gICAgICAtIDogKHN0cmluZyAqIGludCkgbGlzdCA9IFsoXCJmb29cIiwgMTIpOyAoXCJiYXJcIiwgNildXG4gICAgICB2fVxuXG5cbiAgICAgIFdlIGNhbiB1c2Uge3shbWVyZ2V9W21lcmdlXX0gdG8gbWVyZ2UgdHdvIGhhc2h0YWJsZXMgd2l0aCBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyXG4gICAgICBob3cgd2UgY2hvb3NlIHZhbHVlcyB3aGVuIGEga2V5IGlzIHByZXNlbnQgaW4gdGhlIGZpcnN0IChcImxlZnRcIikgaGFzaHRhYmxlLCB0aGVcbiAgICAgIHNlY29uZCAoXCJyaWdodFwiKSwgb3IgYm90aC4gSGVyZSwgd2UnbGwgY29ucyB0aGUgdmFsdWVzIHdoZW4gYm90aCBoYXNodGFibGVzIGhhdmUgYVxuICAgICAga2V5OlxuXG4gICAgICB7dlxuICAgICAgbGV0IGgxID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgNSk7ICgyLCAzMjMyKV0gaW5cbiAgICAgIGxldCBoMiA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDMpXSBpblxuICAgICAgSGFzaHRibC5tZXJnZSBoMSBoMiB+ZjooZnVuIH5rZXk6XyAtPiBmdW5jdGlvblxuICAgICAgICB8IGBMZWZ0IHggLT4gU29tZSAoYExlZnQgeClcbiAgICAgICAgfCBgUmlnaHQgeCAtPiBTb21lIChgUmlnaHQgeClcbiAgICAgICAgfCBgQm90aCAoeCwgeSkgLT4gaWYgeD15IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGBCb3RoICh4LHkpKVxuICAgICAgKSB8PiBIYXNodGJsLnRvX2FsaXN0OztcbiAgICAgIC0gOiAoaW50ICogWz4gYEJvdGggb2YgaW50ICogaW50IHwgYExlZnQgb2YgaW50IHwgYFJpZ2h0IG9mIGludCBdKSBsaXN0ID1cbiAgICAgIFsoMiwgYExlZnQgMzIzMik7ICgxLCBgQm90aCAoNSwgMykpXVxuICAgICAgdn1cblxuICAgICAgezEgSW50ZXJmYWNlfSAqKVxuXG4gIGluY2x1ZGUgU193aXRob3V0X3N1Ym1vZHVsZXMgKCoqIEBpbmxpbmUgKilcblxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMgPSBBY2Nlc3NvcnNcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMgPSBDcmVhdG9yc1xuICBtb2R1bGUgdHlwZSBNdWx0aSA9IE11bHRpXG4gIG1vZHVsZSB0eXBlIFNfcG9seSA9IFNfcG9seVxuICBtb2R1bGUgdHlwZSBTX3dpdGhvdXRfc3VibW9kdWxlcyA9IFNfd2l0aG91dF9zdWJtb2R1bGVzXG4gIG1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IEZvcl9kZXJpdmluZ1xuXG4gIG1vZHVsZSBLZXkgPSBLZXlcbiAgbW9kdWxlIE1lcmdlX2ludG9fYWN0aW9uID0gTWVyZ2VfaW50b19hY3Rpb25cblxuICB0eXBlIG5vbnJlYyAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9ucyA9ICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zXG5cbiAgbW9kdWxlIENyZWF0b3JzIChLZXkgOiBzaWdcbiAgICAgIHR5cGUgJ2EgdFxuXG4gICAgICB2YWwgaGFzaGFibGUgOiAnYSB0IEhhc2hhYmxlLnRcbiAgICBlbmQpIDogc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XyA9ICgnYSBLZXkudCwgJ2IpIHRcblxuICAgIHZhbCB0X29mX3NleHAgOiAoU2V4cC50IC0+ICdhIEtleS50KSAtPiAoU2V4cC50IC0+ICdiKSAtPiBTZXhwLnQgLT4gKCdhLCAnYikgdF9cblxuICAgIGluY2x1ZGVcbiAgICAgIENyZWF0b3JzX2dlbmVyaWNcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRfXG4gICAgICB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIEtleS50XG4gICAgICB3aXRoIHR5cGUgKCdrZXksICdkYXRhLCAnYSkgY3JlYXRlX29wdGlvbnMgOj1cbiAgICAgICAgKCdrZXksICdkYXRhLCAnYSkgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcbiAgZW5kXG5cbiAgbW9kdWxlIFBvbHkgOiBTX3BvbHkgd2l0aCB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG5cbiAgKCoqIFtNXSBpcyBtZWFudCB0byBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggT0NhbWwgYXBwbGljYXRpdmUgZnVuY3RvciB0eXBlczpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfdG9faW50X3RhYmxlID0gaW50IEhhc2h0YmwuTShTdHJpbmcpLnRcbiAgICAgIF19XG5cbiAgICAgIHdoaWNoIHN0YW5kcyBmb3I6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3RvX2ludF90YWJsZSA9IChTdHJpbmcudCwgaW50KSBIYXNodGJsLnRcbiAgICAgIF19XG5cbiAgICAgIFRoZSBwb2ludCBpcyB0aGF0IFtpbnQgSGFzaHRibC5NKFN0cmluZykudF0gc3VwcG9ydHMgZGVyaXZpbmcsIHdoZXJlYXMgdGhlIHNlY29uZFxuICAgICAgc3ludGF4IGRvZXNuJ3QgKGJlY2F1c2UgW3Rfb2Zfc2V4cF0gZG9lc24ndCBrbm93IHdoYXQgY29tcGFyaXNvbi9oYXNoIGZ1bmN0aW9uIHRvXG4gICAgICB1c2UpLiAqKVxuICBtb2R1bGUgTSAoSyA6IFQuVCkgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyAndiB0ID0gKEsudCwgJ3YpIHRcbiAgZW5kXG5cbiAgaW5jbHVkZSBGb3JfZGVyaXZpbmcgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gICgqKi8qKilcblxuICAoKl8gU2VlIHRoZSBKYW5lIFN0cmVldCBTdHlsZSBHdWlkZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgW1ByaXZhdGVdIHN1Ym1vZHVsZXM6XG5cbiAgICBodHRwczovL29wZW5zb3VyY2UuamFuZXN0cmVldC5jb20vc3RhbmRhcmRzLyNwcml2YXRlLXN1Ym1vZHVsZXMgKilcbiAgbW9kdWxlIFByaXZhdGUgOiBzaWdcbiAgICBtb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gQ3JlYXRvcnNfZ2VuZXJpY1xuXG4gICAgdHlwZSBub25yZWMgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGUgPVxuICAgICAgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcblxuICAgIHZhbCBoYXNoYWJsZSA6ICgna2V5LCBfKSB0IC0+ICdrZXkgSGFzaGFibGUudFxuICBlbmRcbmVuZFxuIiwiKCogQSBmZXcgc21hbGwgdGhpbmdzIGNvcGllZCBmcm9tIG90aGVyIHBhcnRzIG9mIEJhc2UgYmVjYXVzZSB0aGV5IGRlcGVuZCBvbiB1cywgc28gd2VcbiAgIGNhbid0IHVzZSB0aGVtLiAqKVxuXG5vcGVuISBJbXBvcnRcblxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbm1vZHVsZSBJbnQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50XG5cbiAgbGV0IG1heCAoeCA6IHQpIHkgPSBpZiB4ID4geSB0aGVuIHggZWxzZSB5XG5lbmRcblxuKCogSXRzIGltcG9ydGFudCB0aGF0IEVtcHR5IGhhdmUgbm8gYXJncy4gSXQncyB0ZW1wdGluZyB0byBtYWtlIHRoaXMgdHlwZSBhIHJlY29yZFxuICAgKGUuZy4gdG8gaG9sZCB0aGUgY29tcGFyZSBmdW5jdGlvbiksIGJ1dCBhIGxvdCBvZiBtZW1vcnkgaXMgc2F2ZWQgYnkgRW1wdHkgYmVpbmcgYW5cbiAgIGltbWVkaWF0ZSwgc2luY2UgYWxsIHVudXNlZCBidWNrZXRzIGluIHRoZSBoYXNodGJsIGRvbid0IHVzZSBhbnkgbWVtb3J5IChiZXNpZGVzIHRoZVxuICAgYXJyYXkgY2VsbCkgKilcbnR5cGUgKCdrLCAndikgdCA9XG4gIHwgRW1wdHlcbiAgfCBOb2RlIG9mXG4gICAgICB7IG11dGFibGUgbGVmdCA6ICgnaywgJ3YpIHRcbiAgICAgIDsga2V5IDogJ2tcbiAgICAgIDsgbXV0YWJsZSB2YWx1ZSA6ICd2XG4gICAgICA7IG11dGFibGUgaGVpZ2h0IDogaW50XG4gICAgICA7IG11dGFibGUgcmlnaHQgOiAoJ2ssICd2KSB0XG4gICAgICB9XG4gIHwgTGVhZiBvZlxuICAgICAgeyBrZXkgOiAna1xuICAgICAgOyBtdXRhYmxlIHZhbHVlIDogJ3ZcbiAgICAgIH1cblxubGV0IGVtcHR5ID0gRW1wdHlcblxubGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiB0cnVlXG4gIHwgTGVhZiBfIHwgTm9kZSBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiAwXG4gIHwgTGVhZiBfIC0+IDFcbiAgfCBOb2RlIHsgbGVmdCA9IF87IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0OyByaWdodCA9IF8gfSAtPiBoZWlnaHRcbjs7XG5cbmxldCBpbnZhcmlhbnQgY29tcGFyZSA9XG4gIGxldCBsZWdhbF9sZWZ0X2tleSBrZXkgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IExlYWYgeyBrZXkgPSBsZWZ0X2tleTsgdmFsdWUgPSBfIH1cbiAgICB8IE5vZGUgeyBsZWZ0ID0gXzsga2V5ID0gbGVmdF9rZXk7IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT5cbiAgICAgIGFzc2VydCAoY29tcGFyZSBsZWZ0X2tleSBrZXkgPCAwKVxuICBpblxuICBsZXQgbGVnYWxfcmlnaHRfa2V5IGtleSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgTGVhZiB7IGtleSA9IHJpZ2h0X2tleTsgdmFsdWUgPSBfIH1cbiAgICB8IE5vZGUgeyBsZWZ0ID0gXzsga2V5ID0gcmlnaHRfa2V5OyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+XG4gICAgICBhc3NlcnQgKGNvbXBhcmUgcmlnaHRfa2V5IGtleSA+IDApXG4gIGluXG4gIGxldCByZWMgaW52ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IHwgTGVhZiBfIC0+ICgpXG4gICAgfCBOb2RlIHsgbGVmdDsga2V5ID0gazsgdmFsdWUgPSBfOyBoZWlnaHQgPSBoOyByaWdodCB9IC0+XG4gICAgICBsZXQgaGwsIGhyID0gaGVpZ2h0IGxlZnQsIGhlaWdodCByaWdodCBpblxuICAgICAgaW52IGxlZnQ7XG4gICAgICBpbnYgcmlnaHQ7XG4gICAgICBsZWdhbF9sZWZ0X2tleSBrIGxlZnQ7XG4gICAgICBsZWdhbF9yaWdodF9rZXkgayByaWdodDtcbiAgICAgIGFzc2VydCAoaCA9IEludC5tYXggaGwgaHIgKyAxKTtcbiAgICAgIGFzc2VydCAoYWJzIChobCAtIGhyKSA8PSAyKVxuICBpblxuICBpbnZcbjs7XG5cbmxldCBpbnZhcmlhbnQgdCB+Y29tcGFyZSA9IGludmFyaWFudCBjb21wYXJlIHRcblxuKCogSW4gdGhlIGZvbGxvd2luZyBjb21tZW50cyxcbiAgICd0IGlzIGJhbGFuY2VkJyBtZWFucyB0aGF0ICdpbnZhcmlhbnQgdCcgZG9lcyBub3RcbiAgIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoaXMgaW1wbGllcyBvZiBjb3Vyc2UgdGhhdCBlYWNoIG5vZGUncyBoZWlnaHQgZmllbGQgaXNcbiAgIGNvcnJlY3QuXG4gICAndCBpcyBiYWxhbmNlYWJsZScgbWVhbnMgdGhhdCBoZWlnaHQgb2YgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWVzIG9mIHRcbiAgIGRpZmZlciBieSBhdCBtb3N0IDMuICopXG5cbigqIEBwcmU6IGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWVzIGhhdmUgY29ycmVjdCBoZWlnaHRzXG4gICBAcG9zdDogb3V0cHV0IGhhcyB0aGUgY29ycmVjdCBoZWlnaHQgKilcbmxldCB1cGRhdGVfaGVpZ2h0ID0gZnVuY3Rpb25cbiAgfCBOb2RlICh7IGxlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gb2xkX2hlaWdodDsgcmlnaHQgfSBhcyB4KSAtPlxuICAgIGxldCBuZXdfaGVpZ2h0ID0gSW50Lm1heCAoaGVpZ2h0IGxlZnQpIChoZWlnaHQgcmlnaHQpICsgMSBpblxuICAgIGlmIG5ld19oZWlnaHQgPD4gb2xkX2hlaWdodCB0aGVuIHguaGVpZ2h0IDwtIG5ld19oZWlnaHRcbiAgfCBFbXB0eSB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2Vcbjs7XG5cbigqIEBwcmU6IGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWVzIGFyZSBiYWxhbmNlZFxuICAgQHByZTogdHJlZSBpcyBiYWxhbmNlYWJsZVxuICAgQHBvc3Q6IG91dHB1dCBpcyBiYWxhbmNlZCAoaW4gcGFydGljdWxhciwgaGVpZ2h0IGlzIGNvcnJlY3QpICopXG5sZXQgYmFsYW5jZSB0cmVlID1cbiAgbWF0Y2ggdHJlZSB3aXRoXG4gIHwgRW1wdHkgfCBMZWFmIF8gLT4gdHJlZVxuICB8IE5vZGUgKHsgbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCB9IGFzIHJvb3Rfbm9kZSkgLT5cbiAgICBsZXQgaGwgPSBoZWlnaHQgbGVmdFxuICAgIGFuZCBociA9IGhlaWdodCByaWdodCBpblxuICAgICgqICsgMiBpcyBjcml0aWNhbGx5IGltcG9ydGFudCwgbG93ZXJpbmcgaXQgdG8gMSB3aWxsIGJyZWFrIHRoZSBMZWFmXG4gICAgICAgYXNzdW1wdGlvbnMgaW4gdGhlIGNvZGUgYmVsb3csIGFuZCB3aWxsIGZvcmNlIHVzIHRvIHByb21vdGUgbGVhZiBub2RlcyBpblxuICAgICAgIHRoZSBiYWxhbmNlIHJvdXRpbmUuIEl0J3MgYWxzbyBmYXN0ZXIsIHNpbmNlIGl0IHdpbGwgYmFsYW5jZSBsZXNzIG9mdGVuLlxuICAgICAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgaXMgZGVsaWNhdGUuICBUaGUgdXBkYXRlX2hlaWdodCBjYWxscyBtdXN0XG4gICAgICAgb2NjdXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIHNpbmNlIHVwZGF0ZV9oZWlnaHQgYXNzdW1lcyBpdHMgY2hpbGRyZW4gaGF2ZVxuICAgICAgIHRoZSBjb3JyZWN0IGhlaWdodHMuICAqKVxuICAgIGlmIGhsID4gaHIgKyAyXG4gICAgdGhlbiAoXG4gICAgICBtYXRjaCBsZWZ0IHdpdGhcbiAgICAgICgqIEl0IGNhbm5vdCBiZSBhIGxlYWYsIGJlY2F1c2UgZXZlbiBpZiByaWdodCBpcyBlbXB0eSwgYSBsZWFmXG4gICAgICAgICBpcyBvbmx5IGhlaWdodCAxICopXG4gICAgICB8IEVtcHR5IHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBOb2RlXG4gICAgICAgICAgKHsgbGVmdCA9IGxlZnRfbm9kZV9sZWZ0XG4gICAgICAgICAgIDsga2V5ID0gX1xuICAgICAgICAgICA7IHZhbHVlID0gX1xuICAgICAgICAgICA7IGhlaWdodCA9IF9cbiAgICAgICAgICAgOyByaWdodCA9IGxlZnRfbm9kZV9yaWdodFxuICAgICAgICAgICB9IGFzIGxlZnRfbm9kZSkgLT5cbiAgICAgICAgaWYgaGVpZ2h0IGxlZnRfbm9kZV9sZWZ0ID49IGhlaWdodCBsZWZ0X25vZGVfcmlnaHRcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgcm9vdF9ub2RlLmxlZnQgPC0gbGVmdF9ub2RlX3JpZ2h0O1xuICAgICAgICAgIGxlZnRfbm9kZS5yaWdodCA8LSB0cmVlO1xuICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgdHJlZTtcbiAgICAgICAgICB1cGRhdGVfaGVpZ2h0IGxlZnQ7XG4gICAgICAgICAgbGVmdClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgKCogaWYgcmlnaHQgaXMgYSBsZWFmLCB0aGVuIGxlZnQgbXVzdCBiZSBlbXB0eS4gVGhhdCBtZWFuc1xuICAgICAgICAgICAgIGhlaWdodCBpcyAyLiBFdmVuIGlmIGhyIGlzIGVtcHR5IHdlIHN0aWxsIGNhbid0IGdldCBoZXJlLiAqKVxuICAgICAgICAgIG1hdGNoIGxlZnRfbm9kZV9yaWdodCB3aXRoXG4gICAgICAgICAgfCBFbXB0eSB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICB8IE5vZGVcbiAgICAgICAgICAgICAgKHsgbGVmdCA9IGxyX2xlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBscl9yaWdodCB9IGFzXG4gICAgICAgICAgICAgICBscl9ub2RlKSAtPlxuICAgICAgICAgICAgbGVmdF9ub2RlLnJpZ2h0IDwtIGxyX2xlZnQ7XG4gICAgICAgICAgICByb290X25vZGUubGVmdCA8LSBscl9yaWdodDtcbiAgICAgICAgICAgIGxyX25vZGUucmlnaHQgPC0gdHJlZTtcbiAgICAgICAgICAgIGxyX25vZGUubGVmdCA8LSBsZWZ0O1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCBsZWZ0O1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCB0cmVlO1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCBsZWZ0X25vZGVfcmlnaHQ7XG4gICAgICAgICAgICBsZWZ0X25vZGVfcmlnaHQpKVxuICAgIGVsc2UgaWYgaHIgPiBobCArIDJcbiAgICB0aGVuIChcbiAgICAgICgqIHNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHJpZ2h0IGNhbm5vdCBiZSBhIGxlYWYgKilcbiAgICAgIG1hdGNoIHJpZ2h0IHdpdGhcbiAgICAgIHwgRW1wdHkgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IE5vZGVcbiAgICAgICAgICAoeyBsZWZ0ID0gcmlnaHRfbm9kZV9sZWZ0XG4gICAgICAgICAgIDsga2V5ID0gX1xuICAgICAgICAgICA7IHZhbHVlID0gX1xuICAgICAgICAgICA7IGhlaWdodCA9IF9cbiAgICAgICAgICAgOyByaWdodCA9IHJpZ2h0X25vZGVfcmlnaHRcbiAgICAgICAgICAgfSBhcyByaWdodF9ub2RlKSAtPlxuICAgICAgICBpZiBoZWlnaHQgcmlnaHRfbm9kZV9yaWdodCA+PSBoZWlnaHQgcmlnaHRfbm9kZV9sZWZ0XG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIHJvb3Rfbm9kZS5yaWdodCA8LSByaWdodF9ub2RlX2xlZnQ7XG4gICAgICAgICAgcmlnaHRfbm9kZS5sZWZ0IDwtIHRyZWU7XG4gICAgICAgICAgdXBkYXRlX2hlaWdodCB0cmVlO1xuICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgcmlnaHQ7XG4gICAgICAgICAgcmlnaHQpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgICgqIHNlZSBhYm92ZSBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHRoaXMgY2Fubm90IGJlIGEgbGVhZiAqKVxuICAgICAgICAgIG1hdGNoIHJpZ2h0X25vZGVfbGVmdCB3aXRoXG4gICAgICAgICAgfCBFbXB0eSB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICB8IE5vZGVcbiAgICAgICAgICAgICAgKHsgbGVmdCA9IHJsX2xlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBybF9yaWdodCB9IGFzXG4gICAgICAgICAgICAgICBybF9ub2RlKSAtPlxuICAgICAgICAgICAgcmlnaHRfbm9kZS5sZWZ0IDwtIHJsX3JpZ2h0O1xuICAgICAgICAgICAgcm9vdF9ub2RlLnJpZ2h0IDwtIHJsX2xlZnQ7XG4gICAgICAgICAgICBybF9ub2RlLmxlZnQgPC0gdHJlZTtcbiAgICAgICAgICAgIHJsX25vZGUucmlnaHQgPC0gcmlnaHQ7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHJpZ2h0O1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCB0cmVlO1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCByaWdodF9ub2RlX2xlZnQ7XG4gICAgICAgICAgICByaWdodF9ub2RlX2xlZnQpKVxuICAgIGVsc2UgKFxuICAgICAgdXBkYXRlX2hlaWdodCB0cmVlO1xuICAgICAgdHJlZSlcbjs7XG5cbigqIEBwcmU6IHRyZWUgaXMgYmFsYW5jZWFibGVcbiAgIEBwcmU6IGFicyAoaGVpZ2h0IChyaWdodCBub2RlKSAtIGhlaWdodCAoYmFsYW5jZSB0cmVlKSkgPD0gM1xuICAgQHBvc3Q6IHJlc3VsdCBpcyBiYWxhbmNlYWJsZSAqKVxuXG4oKiBAcHJlOiB0cmVlIGlzIGJhbGFuY2VhYmxlXG4gICBAcHJlOiBhYnMgKGhlaWdodCAocmlnaHQgbm9kZSkgLSBoZWlnaHQgKGJhbGFuY2UgdHJlZSkpIDw9IDNcbiAgIEBwb3N0OiByZXN1bHQgaXMgYmFsYW5jZWFibGUgKilcbmxldCBzZXRfbGVmdCBub2RlIHRyZWUgPVxuICBsZXQgdHJlZSA9IGJhbGFuY2UgdHJlZSBpblxuICBtYXRjaCBub2RlIHdpdGhcbiAgfCBOb2RlICh7IGxlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gYXMgcikgLT5cbiAgICBpZiBwaHlzX2VxdWFsIGxlZnQgdHJlZSB0aGVuICgpIGVsc2Ugci5sZWZ0IDwtIHRyZWU7XG4gICAgdXBkYXRlX2hlaWdodCBub2RlXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2Vcbjs7XG5cbigqIEBwcmU6IHRyZWUgaXMgYmFsYW5jZWFibGVcbiAgIEBwcmU6IGFicyAoaGVpZ2h0IChsZWZ0IG5vZGUpIC0gaGVpZ2h0IChiYWxhbmNlIHRyZWUpKSA8PSAzXG4gICBAcG9zdDogcmVzdWx0IGlzIGJhbGFuY2VhYmxlICopXG5sZXQgc2V0X3JpZ2h0IG5vZGUgdHJlZSA9XG4gIGxldCB0cmVlID0gYmFsYW5jZSB0cmVlIGluXG4gIG1hdGNoIG5vZGUgd2l0aFxuICB8IE5vZGUgKHsgbGVmdCA9IF87IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgfSBhcyByKSAtPlxuICAgIGlmIHBoeXNfZXF1YWwgcmlnaHQgdHJlZSB0aGVuICgpIGVsc2Ugci5yaWdodCA8LSB0cmVlO1xuICAgIHVwZGF0ZV9oZWlnaHQgbm9kZVxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG47O1xuXG4oKiBAcHJlOiB0IGlzIGJhbGFuY2VkLlxuICAgQHBvc3Q6IHJlc3VsdCBpcyBiYWxhbmNlZCwgd2l0aCBuZXcgbm9kZSBpbnNlcnRlZFxuICAgQHBvc3Q6ICFhZGRlZCA9IHRydWUgaWZmIHRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgdHJlZSBjaGFuZ2VkLiAgKilcbmxldCBhZGQgPVxuICBsZXQgcmVjIGFkZCB0IHJlcGxhY2UgYWRkZWQgY29tcGFyZSBrIHYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgIGFkZGVkIDo9IHRydWU7XG4gICAgICBMZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH1cbiAgICB8IExlYWYgKHsga2V5ID0gayc7IHZhbHVlID0gXyB9IGFzIHIpIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmUgaycgayBpblxuICAgICAgKCogVGhpcyBjb21wYXJlIGlzIHJldmVyc2VkIG9uIHB1cnBvc2UsIHdlIGFyZSBwcmV0ZW5kaW5nXG4gICAgICAgICB0aGF0IHRoZSBsZWFmIHdhcyBqdXN0IGluc2VydGVkIGluc3RlYWQgb2YgdGhlIG90aGVyIHdheVxuICAgICAgICAgcm91bmQsIHRoYXQgd2F5IHdlIG9ubHkgYWxsb2NhdGUgb25lIG5vZGUuICopXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIGFkZGVkIDo9IGZhbHNlO1xuICAgICAgICBpZiByZXBsYWNlIHRoZW4gci52YWx1ZSA8LSB2O1xuICAgICAgICB0KVxuICAgICAgZWxzZSAoXG4gICAgICAgIGFkZGVkIDo9IHRydWU7XG4gICAgICAgIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gTm9kZSB7IGxlZnQgPSB0OyBrZXkgPSBrOyB2YWx1ZSA9IHY7IGhlaWdodCA9IDI7IHJpZ2h0ID0gRW1wdHkgfVxuICAgICAgICBlbHNlIE5vZGUgeyBsZWZ0ID0gRW1wdHk7IGtleSA9IGs7IHZhbHVlID0gdjsgaGVpZ2h0ID0gMjsgcmlnaHQgPSB0IH0pXG4gICAgfCBOb2RlICh7IGxlZnQ7IGtleSA9IGsnOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0IH0gYXMgcikgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZSBrIGsnIGluXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIGFkZGVkIDo9IGZhbHNlO1xuICAgICAgICBpZiByZXBsYWNlIHRoZW4gci52YWx1ZSA8LSB2KVxuICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgdGhlbiBzZXRfbGVmdCB0IChhZGQgbGVmdCByZXBsYWNlIGFkZGVkIGNvbXBhcmUgayB2KVxuICAgICAgZWxzZSBzZXRfcmlnaHQgdCAoYWRkIHJpZ2h0IHJlcGxhY2UgYWRkZWQgY29tcGFyZSBrIHYpO1xuICAgICAgdFxuICBpblxuICBmdW4gdCB+cmVwbGFjZSB+Y29tcGFyZSB+YWRkZWQgfmtleSB+ZGF0YSAtPlxuICAgIGxldCB0ID0gYWRkIHQgcmVwbGFjZSBhZGRlZCBjb21wYXJlIGtleSBkYXRhIGluXG4gICAgaWYgIWFkZGVkIHRoZW4gYmFsYW5jZSB0IGVsc2UgdFxuOztcblxubGV0IHJlYyBmaXJzdCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gTm9uZVxuICB8IExlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfVxuICB8IE5vZGUgeyBsZWZ0ID0gRW1wdHk7IGtleSA9IGs7IHZhbHVlID0gdjsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT4gU29tZSAoaywgdilcbiAgfCBOb2RlIHsgbGVmdCA9IGw7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT4gZmlyc3QgbFxuOztcblxubGV0IHJlYyBsYXN0IHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiBOb25lXG4gIHwgTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9XG4gIHwgTm9kZSB7IGxlZnQgPSBfOyBrZXkgPSBrOyB2YWx1ZSA9IHY7IGhlaWdodCA9IF87IHJpZ2h0ID0gRW1wdHkgfSAtPiBTb21lIChrLCB2KVxuICB8IE5vZGUgeyBsZWZ0ID0gXzsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IHIgfSAtPiBsYXN0IHJcbjs7XG5cblxubGV0W0BpbmxpbmUgYWx3YXlzXSByZWMgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH5jb21wYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB+aWZfZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfmlmX25vdF9mb3VuZFxuICA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQgayBhcmcxIGFyZzJcbiAgfCBMZWFmIHsga2V5ID0gayc7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZSBrIGsnID0gMFxuICAgIHRoZW4gY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleTprJyB+ZGF0YTp2IGFyZzEgYXJnMlxuICAgIGVsc2UgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrIGFyZzEgYXJnMlxuICB8IE5vZGUgeyBsZWZ0OyBrZXkgPSBrJzsgdmFsdWUgPSB2OyBoZWlnaHQgPSBfOyByaWdodCB9IC0+XG4gICAgbGV0IGMgPSBjb21wYXJlIGsgaycgaW5cbiAgICBpZiBjID0gMFxuICAgIHRoZW4gY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleTprJyB+ZGF0YTp2IGFyZzEgYXJnMlxuICAgIGVsc2VcbiAgICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgICAgKGlmIGMgPCAwIHRoZW4gbGVmdCBlbHNlIHJpZ2h0KVxuICAgICAgICB+Y29tcGFyZVxuICAgICAgICBrXG4gICAgICAgIGFyZzFcbiAgICAgICAgYXJnMlxuICAgICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgICAgfmlmX2ZvdW5kXG4gICAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXk6XyB+ZGF0YSAoKSAoKSA9IGlmX2ZvdW5kIGRhdGEgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5ICgpICgpID0gaWZfbm90X2ZvdW5kIGtleSBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgICgpXG4gICAgICAoKVxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleSB+ZGF0YSAoKSAoKSA9IGlmX2ZvdW5kIH5rZXkgfmRhdGEgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5ICgpICgpID0gaWZfbm90X2ZvdW5kIGtleSBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgICgpXG4gICAgICAoKVxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbDEgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleTpfIH5kYXRhIGFyZyAoKSA9IGlmX2ZvdW5kIGRhdGEgYXJnIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSBhcmcgKCkgPSBpZl9ub3RfZm91bmQga2V5IGFyZyBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgIGFcbiAgICAgICgpXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbDEgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleSB+ZGF0YSBhcmcgKCkgPSBpZl9mb3VuZCB+a2V5IH5kYXRhIGFyZyBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgYXJnICgpID0gaWZfbm90X2ZvdW5kIGtleSBhcmcgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICBhXG4gICAgICAoKVxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbDIgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleTpfIH5kYXRhIGFyZzEgYXJnMiA9IGlmX2ZvdW5kIGRhdGEgYXJnMSBhcmcyIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSBhcmcxIGFyZzIgPSBpZl9ub3RfZm91bmQga2V5IGFyZzEgYXJnMiBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5hIH5iIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgIGFcbiAgICAgIGJcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsMiA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5IH5kYXRhIGFyZzEgYXJnMiA9IGlmX2ZvdW5kIH5rZXkgfmRhdGEgYXJnMSBhcmcyIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSBhcmcxIGFyZzIgPSBpZl9ub3RfZm91bmQga2V5IGFyZzEgYXJnMiBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5hIH5iIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgIGFcbiAgICAgIGJcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmQgPVxuICBsZXQgaWZfZm91bmQgdiA9IFNvbWUgdiBpblxuICBsZXQgaWZfbm90X2ZvdW5kIF8gPSBOb25lIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgLT4gZmluZF9hbmRfY2FsbCB0IH5jb21wYXJlIGsgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBtZW0gPVxuICBsZXQgaWZfZm91bmQgXyA9IHRydWUgaW5cbiAgbGV0IGlmX25vdF9mb3VuZCBfID0gZmFsc2UgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayAtPiBmaW5kX2FuZF9jYWxsIHQgfmNvbXBhcmUgayB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IHJlbW92ZSA9XG4gIGxldCByZWMgbWluX2VsdCB0cmVlID1cbiAgICBtYXRjaCB0cmVlIHdpdGhcbiAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgfCBMZWFmIF8gLT4gdHJlZVxuICAgIHwgTm9kZSB7IGxlZnQgPSBFbXB0eTsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPiB0cmVlXG4gICAgfCBOb2RlIHsgbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPiBtaW5fZWx0IGxlZnRcbiAgaW5cbiAgbGV0IHJlYyByZW1vdmVfbWluX2VsdCB0cmVlID1cbiAgICBtYXRjaCB0cmVlIHdpdGhcbiAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgIHwgTGVhZiBfIC0+IEVtcHR5ICgqIFRoaXMgbXVzdCBiZSB0aGUgcm9vdCAqKVxuICAgIHwgTm9kZSB7IGxlZnQgPSBFbXB0eTsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCB9IC0+IHJpZ2h0XG4gICAgfCBOb2RlIHsgbGVmdCA9IExlYWYgXzsga2V5ID0gazsgdmFsdWUgPSB2OyBoZWlnaHQgPSBfOyByaWdodCA9IEVtcHR5IH0gLT5cbiAgICAgIExlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfVxuICAgIHwgTm9kZSB7IGxlZnQgPSBMZWFmIF87IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gYXMgbm9kZSAtPlxuICAgICAgc2V0X2xlZnQgbm9kZSBFbXB0eTtcbiAgICAgIHRyZWVcbiAgICB8IE5vZGUgeyBsZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IGFzIG5vZGUgLT5cbiAgICAgIHNldF9sZWZ0IG5vZGUgKHJlbW92ZV9taW5fZWx0IGxlZnQpO1xuICAgICAgdHJlZVxuICBpblxuICBsZXQgbWVyZ2UgdDEgdDIgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBFbXB0eSwgdCAtPiB0XG4gICAgfCB0LCBFbXB0eSAtPiB0XG4gICAgfCBfLCBfIC0+XG4gICAgICBsZXQgdHJlZSA9IG1pbl9lbHQgdDIgaW5cbiAgICAgIChtYXRjaCB0cmVlIHdpdGhcbiAgICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgIHwgTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgICAgICBsZXQgdDIgPSBiYWxhbmNlIChyZW1vdmVfbWluX2VsdCB0MikgaW5cbiAgICAgICAgIE5vZGVcbiAgICAgICAgICAgeyBsZWZ0ID0gdDFcbiAgICAgICAgICAgOyBrZXkgPSBrXG4gICAgICAgICAgIDsgdmFsdWUgPSB2XG4gICAgICAgICAgIDsgaGVpZ2h0ID0gSW50Lm1heCAoaGVpZ2h0IHQxKSAoaGVpZ2h0IHQyKSArIDFcbiAgICAgICAgICAgOyByaWdodCA9IHQyXG4gICAgICAgICAgIH1cbiAgICAgICB8IE5vZGUgXyBhcyBub2RlIC0+XG4gICAgICAgICBzZXRfcmlnaHQgbm9kZSAocmVtb3ZlX21pbl9lbHQgdDIpO1xuICAgICAgICAgc2V0X2xlZnQgbm9kZSB0MTtcbiAgICAgICAgIG5vZGUpXG4gIGluXG4gIGxldCByZWMgcmVtb3ZlIHQgcmVtb3ZlZCBjb21wYXJlIGsgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgIHJlbW92ZWQgOj0gZmFsc2U7XG4gICAgICBFbXB0eVxuICAgIHwgTGVhZiB7IGtleSA9IGsnOyB2YWx1ZSA9IF8gfSAtPlxuICAgICAgaWYgY29tcGFyZSBrIGsnID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIHJlbW92ZWQgOj0gdHJ1ZTtcbiAgICAgICAgRW1wdHkpXG4gICAgICBlbHNlIChcbiAgICAgICAgcmVtb3ZlZCA6PSBmYWxzZTtcbiAgICAgICAgdClcbiAgICB8IE5vZGUgeyBsZWZ0OyBrZXkgPSBrJzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCB9IC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmUgayBrJyBpblxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICByZW1vdmVkIDo9IHRydWU7XG4gICAgICAgIG1lcmdlIGxlZnQgcmlnaHQpXG4gICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICB0aGVuIChcbiAgICAgICAgc2V0X2xlZnQgdCAocmVtb3ZlIGxlZnQgcmVtb3ZlZCBjb21wYXJlIGspO1xuICAgICAgICB0KVxuICAgICAgZWxzZSAoXG4gICAgICAgIHNldF9yaWdodCB0IChyZW1vdmUgcmlnaHQgcmVtb3ZlZCBjb21wYXJlIGspO1xuICAgICAgICB0KVxuICBpblxuICBmdW4gdCB+cmVtb3ZlZCB+Y29tcGFyZSBrIC0+IGJhbGFuY2UgKHJlbW92ZSB0IHJlbW92ZWQgY29tcGFyZSBrKVxuOztcblxubGV0IHJlYyBmb2xkIHQgfmluaXQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiBpbml0XG4gIHwgTGVhZiB7IGtleTsgdmFsdWUgPSBkYXRhIH0gLT4gZiB+a2V5IH5kYXRhIGluaXRcbiAgfCBOb2RlXG4gICAgICB7IGxlZnQgPSBMZWFmIHsga2V5ID0gbGtleTsgdmFsdWUgPSBsZGF0YSB9XG4gICAgICA7IGtleVxuICAgICAgOyB2YWx1ZSA9IGRhdGFcbiAgICAgIDsgaGVpZ2h0ID0gX1xuICAgICAgOyByaWdodCA9IExlYWYgeyBrZXkgPSBya2V5OyB2YWx1ZSA9IHJkYXRhIH1cbiAgICAgIH0gLT4gZiB+a2V5OnJrZXkgfmRhdGE6cmRhdGEgKGYgfmtleSB+ZGF0YSAoZiB+a2V5OmxrZXkgfmRhdGE6bGRhdGEgaW5pdCkpXG4gIHwgTm9kZVxuICAgICAgeyBsZWZ0ID0gTGVhZiB7IGtleSA9IGxrZXk7IHZhbHVlID0gbGRhdGEgfVxuICAgICAgOyBrZXlcbiAgICAgIDsgdmFsdWUgPSBkYXRhXG4gICAgICA7IGhlaWdodCA9IF9cbiAgICAgIDsgcmlnaHQgPSBFbXB0eVxuICAgICAgfSAtPiBmIH5rZXkgfmRhdGEgKGYgfmtleTpsa2V5IH5kYXRhOmxkYXRhIGluaXQpXG4gIHwgTm9kZVxuICAgICAgeyBsZWZ0ID0gRW1wdHlcbiAgICAgIDsga2V5XG4gICAgICA7IHZhbHVlID0gZGF0YVxuICAgICAgOyBoZWlnaHQgPSBfXG4gICAgICA7IHJpZ2h0ID0gTGVhZiB7IGtleSA9IHJrZXk7IHZhbHVlID0gcmRhdGEgfVxuICAgICAgfSAtPiBmIH5rZXk6cmtleSB+ZGF0YTpyZGF0YSAoZiB+a2V5IH5kYXRhIGluaXQpXG4gIHwgTm9kZVxuICAgICAgeyBsZWZ0OyBrZXk7IHZhbHVlID0gZGF0YTsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBMZWFmIHsga2V5ID0gcmtleTsgdmFsdWUgPSByZGF0YSB9IH1cbiAgICAtPiBmIH5rZXk6cmtleSB+ZGF0YTpyZGF0YSAoZiB+a2V5IH5kYXRhIChmb2xkIGxlZnQgfmluaXQgfmYpKVxuICB8IE5vZGVcbiAgICAgIHsgbGVmdCA9IExlYWYgeyBrZXkgPSBsa2V5OyB2YWx1ZSA9IGxkYXRhIH07IGtleTsgdmFsdWUgPSBkYXRhOyBoZWlnaHQgPSBfOyByaWdodCB9XG4gICAgLT4gZm9sZCByaWdodCB+aW5pdDooZiB+a2V5IH5kYXRhIChmIH5rZXk6bGtleSB+ZGF0YTpsZGF0YSBpbml0KSkgfmZcbiAgfCBOb2RlIHsgbGVmdDsga2V5OyB2YWx1ZSA9IGRhdGE7IGhlaWdodCA9IF87IHJpZ2h0IH0gLT5cbiAgICBmb2xkIHJpZ2h0IH5pbml0OihmIH5rZXkgfmRhdGEgKGZvbGQgbGVmdCB+aW5pdCB+ZikpIH5mXG47O1xuXG5sZXQgcmVjIGl0ZXIgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+ICgpXG4gIHwgTGVhZiB7IGtleTsgdmFsdWUgPSBkYXRhIH0gLT4gZiB+a2V5IH5kYXRhXG4gIHwgTm9kZSB7IGxlZnQ7IGtleTsgdmFsdWUgPSBkYXRhOyBoZWlnaHQgPSBfOyByaWdodCB9IC0+XG4gICAgaXRlciBsZWZ0IH5mO1xuICAgIGYgfmtleSB+ZGF0YTtcbiAgICBpdGVyIHJpZ2h0IH5mXG47O1xuXG5sZXQgcmVjIG1hcGlfaW5wbGFjZSB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gKClcbiAgfCBMZWFmICh7IGtleTsgdmFsdWUgfSBhcyB0KSAtPiB0LnZhbHVlIDwtIGYgfmtleSB+ZGF0YTp2YWx1ZVxuICB8IE5vZGUgKHsgbGVmdDsga2V5OyB2YWx1ZTsgaGVpZ2h0ID0gXzsgcmlnaHQgfSBhcyB0KSAtPlxuICAgIG1hcGlfaW5wbGFjZSB+ZiBsZWZ0O1xuICAgIHQudmFsdWUgPC0gZiB+a2V5IH5kYXRhOnZhbHVlO1xuICAgIG1hcGlfaW5wbGFjZSB+ZiByaWdodFxuOztcblxubGV0IGNob29zZV9leG4gPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltBdmx0cmVlLmNob29zZV9leG5dIG9mIGVtcHR5IGhhc2h0YmxcIiBbXSlcbiAgfCBMZWFmIHsga2V5OyB2YWx1ZTsgXyB9IHwgTm9kZSB7IGtleTsgdmFsdWU7IF8gfSAtPiBrZXksIHZhbHVlXG47O1xuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEhhc2h0YmxfaW50ZlxuXG5tb2R1bGUgdHlwZSBLZXkgPSBLZXkuU1xuXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxubGV0IGhhc2hfcGFyYW0gPSBIYXNoYWJsZS5oYXNoX3BhcmFtXG5sZXQgaGFzaCA9IEhhc2hhYmxlLmhhc2hcbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG50eXBlICgnaywgJ3YpIHQgPVxuICB7IG11dGFibGUgdGFibGUgOiAoJ2ssICd2KSBBdmx0cmVlLnQgYXJyYXlcbiAgOyBtdXRhYmxlIGxlbmd0aCA6IGludFxuICAoKiBbcmVjZW50bHlfYWRkZWRdIGlzIHRoZSByZWZlcmVuY2UgcGFzc2VkIHRvIFtBdmx0cmVlLmFkZF0uIFdlIHB1dCBpdCBpbiB0aGUgaGFzaFxuICAgICB0YWJsZSB0byBhdm9pZCBhbGxvY2F0aW5nIGl0IGF0IGV2ZXJ5IFtzZXRdLiAqKVxuICA7IHJlY2VudGx5X2FkZGVkIDogYm9vbCByZWZcbiAgOyBncm93dGhfYWxsb3dlZCA6IGJvb2xcbiAgOyBoYXNoYWJsZSA6ICdrIEhhc2hhYmxlLnRcbiAgOyBtdXRhYmxlIG11dGF0aW9uX2FsbG93ZWQgOiBib29sICgqIFNldCBkdXJpbmcgYWxsIGl0ZXJhdGlvbiBvcGVyYXRpb25zICopXG4gIH1cblxudHlwZSAnYSBrZXkgPSAnYVxuXG5sZXQgc2V4cF9vZl9rZXkgdCA9IHQuaGFzaGFibGUuSGFzaGFibGUuc2V4cF9vZl90XG5sZXQgY29tcGFyZV9rZXkgdCA9IHQuaGFzaGFibGUuSGFzaGFibGUuY29tcGFyZVxuXG5sZXQgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdCA9XG4gIGlmIG5vdCB0Lm11dGF0aW9uX2FsbG93ZWQgdGhlbiBmYWlsd2l0aCBcIkhhc2h0Ymw6IG11dGF0aW9uIG5vdCBhbGxvd2VkIGR1cmluZyBpdGVyYXRpb25cIlxuOztcblxubGV0IHdpdGhvdXRfbXV0YXRpbmcgdCBmID1cbiAgaWYgdC5tdXRhdGlvbl9hbGxvd2VkXG4gIHRoZW4gKFxuICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBmYWxzZTtcbiAgICBtYXRjaCBmICgpIHdpdGhcbiAgICB8IHggLT5cbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSB0cnVlO1xuICAgICAgeFxuICAgIHwgZXhjZXB0aW9uIGV4biAtPlxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIHRydWU7XG4gICAgICByYWlzZSBleG4pXG4gIGVsc2UgZiAoKVxuOztcblxuKCoqIEludGVybmFsbHkgdXNlIGEgbWF4aW11bSBzaXplIHRoYXQgaXMgYSBwb3dlciBvZiAyLiBSZXZlcnNlcyB0aGUgYWJvdmUgdG8gZmluZCB0aGVcbiAgICBmbG9vciBwb3dlciBvZiAyIGJlbG93IHRoZSBzeXN0ZW0gbWF4IGFycmF5IGxlbmd0aCAqKVxubGV0IG1heF90YWJsZV9sZW5ndGggPSBJbnQuZmxvb3JfcG93MiBBcnJheS5tYXhfbGVuZ3RoXG5cbigqIFRoZSBkZWZhdWx0IHNpemUgaXMgY2hvc2VuIHRvIGJlIDAgKGFzIG9wcG9zZWQgdG8gMTI4IGFzIGl0IHdhcyBiZWZvcmUpIGJlY2F1c2U6XG4gICAtIDEyOCBjYW4gY3JlYXRlIHN1YnN0YW50aWFsIG1lbW9yeSBvdmVyaGVhZCAoeDEwKSB3aGVuIGNyZWF0aW5nIG1hbnkgdGFibGVzLCBtb3N0XG4gICAgIG9mIHdoaWNoIGFyZSBub3QgYmlnIChzYXksIGlmIHlvdSBoYXZlIGEgaGFzaHRibCBvZiBoYXNodGJsKS4gQW5kIG1lbW9yeSBvdmVyaGVhZCBpc1xuICAgICBub3QgdGhhdCBlYXN5IHRvIHByb2ZpbGUuXG4gICAtIGlmIGEgaGFzaHRibCBpcyBnb2luZyB0byBncm93LCBpdCdzIG5vdCBjbGVhciB3aHkgMTI4IGlzIG1hcmtlZGx5IGJldHRlciB0aGFuIG90aGVyXG4gICAgIHNpemVzIChpZiB5b3UgZ29pbmcgdG8gc3RpY2sgMTAwMCBlbGVtZW50cywgeW91J3JlIGdvaW5nIHRvIGdyb3cgdGhlIGhhc2h0YWJsZSBvbmNlXG4gICAgIG9yIHR3aWNlIGFueXdheSlcbiAgIC0gaW4gb3RoZXIgbGFuZ3VhZ2VzIChsaWtlIHJ1c3QsIHB5dGhvbiwgYW5kIGFwcGFyZW50bHkgZ28pLCB0aGUgZGVmYXVsdCBpcyBhbHNvIGFcbiAgICAgc21hbGwgc2l6ZS4gKilcbmxldCBjcmVhdGUgPyhncm93dGhfYWxsb3dlZCA9IHRydWUpID8oc2l6ZSA9IDApIH5oYXNoYWJsZSAoKSA9XG4gIGxldCBzaXplID0gSW50Lm1pbiAoSW50Lm1heCAxIHNpemUpIG1heF90YWJsZV9sZW5ndGggaW5cbiAgbGV0IHNpemUgPSBJbnQuY2VpbF9wb3cyIHNpemUgaW5cbiAgeyB0YWJsZSA9IEFycmF5LmNyZWF0ZSB+bGVuOnNpemUgQXZsdHJlZS5lbXB0eVxuICA7IGxlbmd0aCA9IDBcbiAgOyBncm93dGhfYWxsb3dlZFxuICA7IHJlY2VudGx5X2FkZGVkID0gcmVmIGZhbHNlXG4gIDsgaGFzaGFibGVcbiAgOyBtdXRhdGlvbl9hbGxvd2VkID0gdHJ1ZVxuICB9XG47O1xuXG4oKiogU3VwcGxlbWVudGFsIGhhc2guIFRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnksIGl0IGlzIGludGVuZGVkIGFzIGEgZGVmZW5zZSBhZ2FpbnN0IHBvb3JcbiAgICBoYXNoIGZ1bmN0aW9ucywgZm9yIHdoaWNoIHRoZSBwb3dlciBvZiAyIHNpemVkIHRhYmxlIHdpbGwgYmUgZXNwZWNpYWxseSBzZW5zaXRpdmUuXG4gICAgV2l0aCBzb21lIHRlc3Rpbmcgd2UgbWF5IGNob29zZSB0byBhZGQgaXQsIGJ1dCB0aGlzIHRhYmxlIGlzIGRlc2lnbmVkIHRvIGJlIHJvYnVzdCB0b1xuICAgIGNvbGxpc2lvbnMsIGFuZCBpbiBtb3N0IG9mIG15IHRlc3RpbmcgdGhpcyBkZWdyYWRlcyBwZXJmb3JtYW5jZS4gKilcbmxldCBfc3VwcGxlbWVudGFsX2hhc2ggaCA9XG4gIGxldCBoID0gaCBseG9yICgoaCBsc3IgMjApIGx4b3IgKGggbHNyIDEyKSkgaW5cbiAgaCBseG9yIChoIGxzciA3KSBseG9yIChoIGxzciA0KVxuOztcblxubGV0IHNsb3QgdCBrZXkgPVxuICBsZXQgaGFzaCA9IHQuaGFzaGFibGUuSGFzaGFibGUuaGFzaCBrZXkgaW5cbiAgKCogdGhpcyBpcyBhbHdheXMgbm9uLW5lZ2F0aXZlIGJlY2F1c2Ugd2UgZG8gW2xhbmRdIHdpdGggbm9uLW5lZ2F0aXZlIG51bWJlciAqKVxuICBoYXNoIGxhbmQgKEFycmF5Lmxlbmd0aCB0LnRhYmxlIC0gMSlcbjs7XG5cbmxldCBhZGRfd29ya2VyIHQgfnJlcGxhY2UgfmtleSB+ZGF0YSA9XG4gIGxldCBpID0gc2xvdCB0IGtleSBpblxuICBsZXQgcm9vdCA9IHQudGFibGUuKGkpIGluXG4gIGxldCBhZGRlZCA9IHQucmVjZW50bHlfYWRkZWQgaW5cbiAgYWRkZWQgOj0gZmFsc2U7XG4gIGxldCBuZXdfcm9vdCA9XG4gICAgKCogVGhlIGF2bCB0cmVlIG1pZ2h0IHJlcGxhY2UgdGhlIHZhbHVlIFtyZXBsYWNlPXRydWVdIG9yIGRvIG5vdGhpbmcgW3JlcGxhY2U9ZmFsc2VdXG4gICAgICAgdG8gdGhlIGVudHJ5LCBpbiB0aGF0IGNhc2UgdGhlIHRhYmxlIGRpZCBub3QgZ2V0IGJpZ2dlciwgc28gd2Ugc2hvdWxkIG5vdFxuICAgICAgIGluY3JlbWVudCBsZW5ndGgsIHdlIHBhc3MgaW4gdGhlIGJvb2wgcmVmIHQuYWRkZWQgc28gdGhhdCBpdCBjYW4gdGVsbCB1cyB3aGV0aGVyXG4gICAgICAgaXQgYWRkZWQgb3IgcmVwbGFjZWQuIFdlIGRvIGl0IHRoaXMgd2F5IHRvIGF2b2lkIGV4dHJhIGFsbG9jYXRpb24uIFNpbmNlIHRoZSBib29sXG4gICAgICAgaXMgYW4gaW1tZWRpYXRlIGl0IGRvZXMgbm90IGdvIHRocm91Z2ggdGhlIHdyaXRlIGJhcnJpZXIuICopXG4gICAgQXZsdHJlZS5hZGQgfnJlcGxhY2Ugcm9vdCB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkgfmFkZGVkIH5rZXkgfmRhdGFcbiAgaW5cbiAgaWYgIWFkZGVkIHRoZW4gdC5sZW5ndGggPC0gdC5sZW5ndGggKyAxO1xuICAoKiBUaGlzIGxpdHRsZSBvcHRpbWl6YXRpb24gc2F2ZXMgYSBjYW1sX21vZGlmeSB3aGVuIHRoZSB0cmVlXG4gICAgIGhhc24ndCBiZWVuIHJlYmFsYW5jZWQuICopXG4gIGlmIG5vdCAocGh5c19lcXVhbCBuZXdfcm9vdCByb290KSB0aGVuIHQudGFibGUuKGkpIDwtIG5ld19yb290XG47O1xuXG5sZXQgbWF5YmVfcmVzaXplX3RhYmxlIHQgPVxuICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHQudGFibGUgaW5cbiAgbGV0IHNob3VsZF9ncm93ID0gdC5sZW5ndGggPiBsZW4gaW5cbiAgaWYgc2hvdWxkX2dyb3cgJiYgdC5ncm93dGhfYWxsb3dlZFxuICB0aGVuIChcbiAgICBsZXQgbmV3X2FycmF5X2xlbmd0aCA9IEludC5taW4gKGxlbiAqIDIpIG1heF90YWJsZV9sZW5ndGggaW5cbiAgICBpZiBuZXdfYXJyYXlfbGVuZ3RoID4gbGVuXG4gICAgdGhlbiAoXG4gICAgICBsZXQgbmV3X3RhYmxlID0gQXJyYXkuY3JlYXRlIH5sZW46bmV3X2FycmF5X2xlbmd0aCBBdmx0cmVlLmVtcHR5IGluXG4gICAgICBsZXQgb2xkX3RhYmxlID0gdC50YWJsZSBpblxuICAgICAgdC50YWJsZSA8LSBuZXdfdGFibGU7XG4gICAgICB0Lmxlbmd0aCA8LSAwO1xuICAgICAgbGV0IGYgfmtleSB+ZGF0YSA9IGFkZF93b3JrZXIgfnJlcGxhY2U6dHJ1ZSB0IH5rZXkgfmRhdGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggb2xkX3RhYmxlIC0gMSBkb1xuICAgICAgICBBdmx0cmVlLml0ZXIgb2xkX3RhYmxlLihpKSB+ZlxuICAgICAgZG9uZSkpXG47O1xuXG5sZXQgc2V0IHQgfmtleSB+ZGF0YSA9XG4gIGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQ7XG4gIGFkZF93b3JrZXIgfnJlcGxhY2U6dHJ1ZSB0IH5rZXkgfmRhdGE7XG4gIG1heWJlX3Jlc2l6ZV90YWJsZSB0XG47O1xuXG5sZXQgYWRkIHQgfmtleSB+ZGF0YSA9XG4gIGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQ7XG4gIGFkZF93b3JrZXIgfnJlcGxhY2U6ZmFsc2UgdCB+a2V5IH5kYXRhO1xuICBpZiAhKHQucmVjZW50bHlfYWRkZWQpXG4gIHRoZW4gKFxuICAgIG1heWJlX3Jlc2l6ZV90YWJsZSB0O1xuICAgIGBPaylcbiAgZWxzZSBgRHVwbGljYXRlXG47O1xuXG5sZXQgYWRkX2V4biB0IH5rZXkgfmRhdGEgPVxuICBtYXRjaCBhZGQgdCB+a2V5IH5kYXRhIHdpdGhcbiAgfCBgT2sgLT4gKClcbiAgfCBgRHVwbGljYXRlIC0+XG4gICAgbGV0IHNleHBfb2Zfa2V5ID0gc2V4cF9vZl9rZXkgdCBpblxuICAgIGxldCBlcnJvciA9IEVycm9yLmNyZWF0ZSBcIkhhc2h0YmwuYWRkX2V4biBnb3Qga2V5IGFscmVhZHkgcHJlc2VudFwiIGtleSBzZXhwX29mX2tleSBpblxuICAgIEVycm9yLnJhaXNlIGVycm9yXG47O1xuXG5sZXQgY2xlYXIgdCA9XG4gIGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQ7XG4gIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggdC50YWJsZSAtIDEgZG9cbiAgICB0LnRhYmxlLihpKSA8LSBBdmx0cmVlLmVtcHR5XG4gIGRvbmU7XG4gIHQubGVuZ3RoIDwtIDBcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsIHQga2V5IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgKCogd2l0aCBhIGdvb2QgaGFzaCBmdW5jdGlvbiB0aGVzZSBmaXJzdCB0d28gY2FzZXMgd2lsbCBiZSB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5LFxuICAgICBhbmQgQXZsdHJlZS5maW5kIGlzIHJlY3Vyc2l2ZSwgc28gaXQgY2FuJ3QgYmUgaW5saW5lZCwgc28gZG9pbmcgdGhpcyBhdm9pZHMgYVxuICAgICBmdW5jdGlvbiBjYWxsIGluIG1vc3QgY2FzZXMuICopXG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXlcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgdiBlbHNlIGlmX25vdF9mb3VuZCBrZXlcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kX2FuZF9jYWxsIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwxIHQga2V5IH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleSBhXG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIHYgYSBlbHNlIGlmX25vdF9mb3VuZCBrZXkgYVxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRfYW5kX2NhbGwxIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleSB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwyIHQga2V5IH5hIH5iIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleSBhIGJcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgdiBhIGIgZWxzZSBpZl9ub3RfZm91bmQga2V5IGEgYlxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRfYW5kX2NhbGwyIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleSB+YSB+YiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsIHQga2V5IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgKCogd2l0aCBhIGdvb2QgaGFzaCBmdW5jdGlvbiB0aGVzZSBmaXJzdCB0d28gY2FzZXMgd2lsbCBiZSB0aGUgb3ZlcndoZWxtaW5nIG1ham9yaXR5LFxuICAgICBhbmQgQXZsdHJlZS5maW5kIGlzIHJlY3Vyc2l2ZSwgc28gaXQgY2FuJ3QgYmUgaW5saW5lZCwgc28gZG9pbmcgdGhpcyBhdm9pZHMgYVxuICAgICBmdW5jdGlvbiBjYWxsIGluIG1vc3QgY2FzZXMuICopXG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXlcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgfmtleTprIH5kYXRhOnYgZWxzZSBpZl9ub3RfZm91bmQga2V5XG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZGlfYW5kX2NhbGwgdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwxIHQga2V5IH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleSBhXG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIH5rZXk6ayB+ZGF0YTp2IGEgZWxzZSBpZl9ub3RfZm91bmQga2V5IGFcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kaV9hbmRfY2FsbDEgdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5IH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwyIHQga2V5IH5hIH5iIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleSBhIGJcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgfmtleTprIH5kYXRhOnYgYSBiIGVsc2UgaWZfbm90X2ZvdW5kIGtleSBhIGJcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kaV9hbmRfY2FsbDJcbiAgICAgIHRyZWVcbiAgICAgIH5jb21wYXJlOihjb21wYXJlX2tleSB0KVxuICAgICAga2V5XG4gICAgICB+YVxuICAgICAgfmJcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmQgPVxuICBsZXQgaWZfZm91bmQgdiA9IFNvbWUgdiBpblxuICBsZXQgaWZfbm90X2ZvdW5kIF8gPSBOb25lIGluXG4gIGZ1biB0IGtleSAtPiBmaW5kX2FuZF9jYWxsIHQga2V5IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgbWVtIHQga2V5ID1cbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gZmFsc2VcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IF8gfSAtPiBjb21wYXJlX2tleSB0IGsga2V5ID0gMFxuICB8IHRyZWUgLT4gQXZsdHJlZS5tZW0gdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5XG47O1xuXG5sZXQgcmVtb3ZlIHQga2V5ID1cbiAgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdDtcbiAgbGV0IGkgPSBzbG90IHQga2V5IGluXG4gIGxldCByb290ID0gdC50YWJsZS4oaSkgaW5cbiAgbGV0IGFkZGVkX29yX3JlbW92ZWQgPSB0LnJlY2VudGx5X2FkZGVkIGluXG4gIGFkZGVkX29yX3JlbW92ZWQgOj0gZmFsc2U7XG4gIGxldCBuZXdfcm9vdCA9XG4gICAgQXZsdHJlZS5yZW1vdmUgcm9vdCB+cmVtb3ZlZDphZGRlZF9vcl9yZW1vdmVkIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXlcbiAgaW5cbiAgaWYgbm90IChwaHlzX2VxdWFsIHJvb3QgbmV3X3Jvb3QpIHRoZW4gdC50YWJsZS4oaSkgPC0gbmV3X3Jvb3Q7XG4gIGlmICFhZGRlZF9vcl9yZW1vdmVkIHRoZW4gdC5sZW5ndGggPC0gdC5sZW5ndGggLSAxXG47O1xuXG5sZXQgbGVuZ3RoIHQgPSB0Lmxlbmd0aFxubGV0IGlzX2VtcHR5IHQgPSBsZW5ndGggdCA9IDBcblxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIGlmIGxlbmd0aCB0ID0gMFxuICB0aGVuIGluaXRcbiAgZWxzZSAoXG4gICAgbGV0IG4gPSBBcnJheS5sZW5ndGggdC50YWJsZSBpblxuICAgIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICAgIGxldCBtID0gdC5tdXRhdGlvbl9hbGxvd2VkIGluXG4gICAgbWF0Y2hcbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBmYWxzZTtcbiAgICAgIGZvciBpID0gMCB0byBuIC0gMSBkb1xuICAgICAgICBtYXRjaCBBcnJheS51bnNhZmVfZ2V0IHQudGFibGUgaSB3aXRoXG4gICAgICAgIHwgQXZsdHJlZS5FbXB0eSAtPiAoKVxuICAgICAgICB8IEF2bHRyZWUuTGVhZiB7IGtleTsgdmFsdWUgPSBkYXRhIH0gLT4gYWNjIDo9IGYgfmtleSB+ZGF0YSAhYWNjXG4gICAgICAgIHwgYnVja2V0IC0+IGFjYyA6PSBBdmx0cmVlLmZvbGQgYnVja2V0IH5pbml0OiFhY2MgfmZcbiAgICAgIGRvbmVcbiAgICB3aXRoXG4gICAgfCAoKSAtPlxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIG07XG4gICAgICAhYWNjXG4gICAgfCBleGNlcHRpb24gZXhuIC0+XG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gbTtcbiAgICAgIHJhaXNlIGV4bilcbjs7XG5cbmxldCBpdGVyaSB0IH5mID1cbiAgaWYgdC5sZW5ndGggPSAwXG4gIHRoZW4gKClcbiAgZWxzZSAoXG4gICAgbGV0IG4gPSBBcnJheS5sZW5ndGggdC50YWJsZSBpblxuICAgIGxldCBtID0gdC5tdXRhdGlvbl9hbGxvd2VkIGluXG4gICAgbWF0Y2hcbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBmYWxzZTtcbiAgICAgIGZvciBpID0gMCB0byBuIC0gMSBkb1xuICAgICAgICBtYXRjaCBBcnJheS51bnNhZmVfZ2V0IHQudGFibGUgaSB3aXRoXG4gICAgICAgIHwgQXZsdHJlZS5FbXB0eSAtPiAoKVxuICAgICAgICB8IEF2bHRyZWUuTGVhZiB7IGtleTsgdmFsdWUgPSBkYXRhIH0gLT4gZiB+a2V5IH5kYXRhXG4gICAgICAgIHwgYnVja2V0IC0+IEF2bHRyZWUuaXRlciBidWNrZXQgfmZcbiAgICAgIGRvbmVcbiAgICB3aXRoXG4gICAgfCAoKSAtPiB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gbVxuICAgIHwgZXhjZXB0aW9uIGV4biAtPlxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIG07XG4gICAgICByYWlzZSBleG4pXG47O1xuXG5sZXQgaXRlciB0IH5mID0gaXRlcmkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5sZXQgaXRlcl9rZXlzIHQgfmYgPSBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YTpfIC0+IGYga2V5KVxuXG5sZXQgcmVjIGNob29zZV9ub25lbXB0eSB0YWJsZSBpID1cbiAgbGV0IGF2bHRyZWUgPSB0YWJsZS4oaSkgaW5cbiAgaWYgQXZsdHJlZS5pc19lbXB0eSBhdmx0cmVlXG4gIHRoZW4gY2hvb3NlX25vbmVtcHR5IHRhYmxlIChpICsgMSlcbiAgZWxzZSBBdmx0cmVlLmNob29zZV9leG4gYXZsdHJlZVxuOztcblxubGV0IGNob29zZV9leG4gdCA9XG4gIGlmIHQubGVuZ3RoID0gMCB0aGVuIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltIYXNodGJsLmNob29zZV9leG5dIG9mIGVtcHR5IGhhc2h0YmxcIiBbXSk7XG4gIGNob29zZV9ub25lbXB0eSB0LnRhYmxlIDBcbjs7XG5cbmxldCBjaG9vc2UgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAoY2hvb3NlX25vbmVtcHR5IHQudGFibGUgMClcblxubGV0IGludmFyaWFudCBpbnZhcmlhbnRfa2V5IGludmFyaWFudF9kYXRhIHQgPVxuICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIHQudGFibGUgLSAxIGRvXG4gICAgQXZsdHJlZS5pbnZhcmlhbnQgdC50YWJsZS4oaSkgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpXG4gIGRvbmU7XG4gIGxldCByZWFsX2xlbiA9XG4gICAgZm9sZCB0IH5pbml0OjAgfmY6KGZ1biB+a2V5IH5kYXRhIGkgLT5cbiAgICAgIGludmFyaWFudF9rZXkga2V5O1xuICAgICAgaW52YXJpYW50X2RhdGEgZGF0YTtcbiAgICAgIGkgKyAxKVxuICBpblxuICBhc3NlcnQgKHJlYWxfbGVuID0gdC5sZW5ndGgpXG47O1xuXG5sZXQgZmluZF9leG4gPVxuICBsZXQgaWZfZm91bmQgdiBfID0gdiBpblxuICBsZXQgaWZfbm90X2ZvdW5kIGsgdCA9XG4gICAgcmFpc2VcbiAgICAgIChOb3RfZm91bmRfcyAoTGlzdCBbIEF0b20gXCJIYXNodGJsLmZpbmRfZXhuOiBub3QgZm91bmRcIjsgdC5oYXNoYWJsZS5zZXhwX29mX3QgayBdKSlcbiAgaW5cbiAgbGV0IGZpbmRfZXhuIHQga2V5ID0gZmluZF9hbmRfY2FsbDEgdCBrZXkgfmE6dCB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfZXhuXG47O1xuXG5sZXQgZXhpc3RzaSB0IH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gci5yZXR1cm4gdHJ1ZSk7XG4gICAgZmFsc2UpXG47O1xuXG5sZXQgZXhpc3RzIHQgfmYgPSBleGlzdHNpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxubGV0IGZvcl9hbGxpIHQgfmYgPSBub3QgKGV4aXN0c2kgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gbm90IChmIH5rZXkgfmRhdGEpKSlcbmxldCBmb3JfYWxsIHQgfmYgPSBub3QgKGV4aXN0c2kgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBub3QgKGYgZGF0YSkpKVxuXG5sZXQgY291bnRpIHQgfmYgPVxuICBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIGFjYyArIDEgZWxzZSBhY2MpXG47O1xuXG5sZXQgY291bnQgdCB+ZiA9XG4gIGZvbGQgdCB+aW5pdDowIH5mOihmdW4gfmtleTpfIH5kYXRhIGFjYyAtPiBpZiBmIGRhdGEgdGhlbiBhY2MgKyAxIGVsc2UgYWNjKVxuOztcblxubGV0IG1hcGkgdCB+ZiA9XG4gIGxldCBuZXdfdCA9XG4gICAgY3JlYXRlIH5ncm93dGhfYWxsb3dlZDp0Lmdyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZTp0Lmhhc2hhYmxlIH5zaXplOnQubGVuZ3RoICgpXG4gIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IHNldCBuZXdfdCB+a2V5IH5kYXRhOihmIH5rZXkgfmRhdGEpKTtcbiAgbmV3X3Rcbjs7XG5cbmxldCBtYXAgdCB+ZiA9IG1hcGkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5sZXQgY29weSB0ID0gbWFwIHQgfmY6Rm4uaWRcblxubGV0IGZpbHRlcl9tYXBpIHQgfmYgPVxuICBsZXQgbmV3X3QgPVxuICAgIGNyZWF0ZSB+Z3Jvd3RoX2FsbG93ZWQ6dC5ncm93dGhfYWxsb3dlZCB+aGFzaGFibGU6dC5oYXNoYWJsZSB+c2l6ZTp0Lmxlbmd0aCAoKVxuICBpblxuICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgIG1hdGNoIGYgfmtleSB+ZGF0YSB3aXRoXG4gICAgfCBTb21lIG5ld19kYXRhIC0+IHNldCBuZXdfdCB+a2V5IH5kYXRhOm5ld19kYXRhXG4gICAgfCBOb25lIC0+ICgpKTtcbiAgbmV3X3Rcbjs7XG5cbmxldCBmaWx0ZXJfbWFwIHQgfmYgPSBmaWx0ZXJfbWFwaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcblxubGV0IGZpbHRlcmkgdCB+ZiA9XG4gIGZpbHRlcl9tYXBpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIFNvbWUgZGF0YSBlbHNlIE5vbmUpXG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPSBmaWx0ZXJpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxubGV0IGZpbHRlcl9rZXlzIHQgfmYgPSBmaWx0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOl8gLT4gZiBrZXkpXG5cbmxldCBwYXJ0aXRpb25fbWFwaSB0IH5mID1cbiAgbGV0IHQwID1cbiAgICBjcmVhdGUgfmdyb3d0aF9hbGxvd2VkOnQuZ3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlOnQuaGFzaGFibGUgfnNpemU6dC5sZW5ndGggKClcbiAgaW5cbiAgbGV0IHQxID1cbiAgICBjcmVhdGUgfmdyb3d0aF9hbGxvd2VkOnQuZ3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlOnQuaGFzaGFibGUgfnNpemU6dC5sZW5ndGggKClcbiAgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICBtYXRjaCAoZiB+a2V5IH5kYXRhIDogXyBFaXRoZXIudCkgd2l0aFxuICAgIHwgRmlyc3QgbmV3X2RhdGEgLT4gc2V0IHQwIH5rZXkgfmRhdGE6bmV3X2RhdGFcbiAgICB8IFNlY29uZCBuZXdfZGF0YSAtPiBzZXQgdDEgfmtleSB+ZGF0YTpuZXdfZGF0YSk7XG4gIHQwLCB0MVxuOztcblxubGV0IHBhcnRpdGlvbl9tYXAgdCB+ZiA9IHBhcnRpdGlvbl9tYXBpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuXG5sZXQgcGFydGl0aW9uaV90ZiB0IH5mID1cbiAgcGFydGl0aW9uX21hcGkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gRmlyc3QgZGF0YSBlbHNlIFNlY29uZCBkYXRhKVxuOztcblxubGV0IHBhcnRpdGlvbl90ZiB0IH5mID0gcGFydGl0aW9uaV90ZiB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcblxubGV0IGZpbmRfb3JfYWRkIHQgaWQgfmRlZmF1bHQgPVxuICBmaW5kX2FuZF9jYWxsMlxuICAgIHRcbiAgICBpZFxuICAgIH5hOnRcbiAgICB+YjpkZWZhdWx0XG4gICAgfmlmX2ZvdW5kOihmdW4gZGF0YSBfIF8gLT4gZGF0YSlcbiAgICB+aWZfbm90X2ZvdW5kOihmdW4ga2V5IHQgZGVmYXVsdCAtPlxuICAgICAgbGV0IGRlZmF1bHQgPSBkZWZhdWx0ICgpIGluXG4gICAgICBzZXQgdCB+a2V5IH5kYXRhOmRlZmF1bHQ7XG4gICAgICBkZWZhdWx0KVxuOztcblxubGV0IGZpbmRpX29yX2FkZCB0IGlkIH5kZWZhdWx0ID1cbiAgZmluZF9hbmRfY2FsbDJcbiAgICB0XG4gICAgaWRcbiAgICB+YTp0XG4gICAgfmI6ZGVmYXVsdFxuICAgIH5pZl9mb3VuZDooZnVuIGRhdGEgXyBfIC0+IGRhdGEpXG4gICAgfmlmX25vdF9mb3VuZDooZnVuIGtleSB0IGRlZmF1bHQgLT5cbiAgICAgIGxldCBkZWZhdWx0ID0gZGVmYXVsdCBrZXkgaW5cbiAgICAgIHNldCB0IH5rZXkgfmRhdGE6ZGVmYXVsdDtcbiAgICAgIGRlZmF1bHQpXG47O1xuXG4oKiBTb21lIGhhc2h0YmwgaW1wbGVtZW50YXRpb25zIG1heSBiZSBhYmxlIHRvIHBlcmZvcm0gdGhpcyBtb3JlIGVmZmljaWVudGx5IHRoYW4gdHdvXG4gICBzZXBhcmF0ZSBsb29rdXBzICopXG5sZXQgZmluZF9hbmRfcmVtb3ZlIHQgaWQgPVxuICBsZXQgcmVzdWx0ID0gZmluZCB0IGlkIGluXG4gIGlmIE9wdGlvbi5pc19zb21lIHJlc3VsdCB0aGVuIHJlbW92ZSB0IGlkO1xuICByZXN1bHRcbjs7XG5cblxubGV0IGNoYW5nZSB0IGlkIH5mID1cbiAgbWF0Y2ggZiAoZmluZCB0IGlkKSB3aXRoXG4gIHwgTm9uZSAtPiByZW1vdmUgdCBpZFxuICB8IFNvbWUgZGF0YSAtPiBzZXQgdCB+a2V5OmlkIH5kYXRhXG47O1xuXG5sZXQgdXBkYXRlX2FuZF9yZXR1cm4gdCBpZCB+ZiA9XG4gIGxldCBkYXRhID0gZiAoZmluZCB0IGlkKSBpblxuICBzZXQgdCB+a2V5OmlkIH5kYXRhO1xuICBkYXRhXG47O1xuXG5sZXQgdXBkYXRlIHQgaWQgfmYgPSBpZ25vcmUgKHVwZGF0ZV9hbmRfcmV0dXJuIHQgaWQgfmYgOiBfKVxuXG5sZXQgaW5jcl9ieSB+cmVtb3ZlX2lmX3plcm8gdCBrZXkgYnkgPVxuICBpZiByZW1vdmVfaWZfemVyb1xuICB0aGVuXG4gICAgY2hhbmdlIHQga2V5IH5mOihmdW4gb3B0IC0+XG4gICAgICBtYXRjaCBieSArIE9wdGlvbi52YWx1ZSBvcHQgfmRlZmF1bHQ6MCB3aXRoXG4gICAgICB8IDAgLT4gTm9uZVxuICAgICAgfCBuIC0+IFNvbWUgbilcbiAgZWxzZVxuICAgIHVwZGF0ZSB0IGtleSB+ZjooZnVuY3Rpb25cbiAgICAgIHwgTm9uZSAtPiBieVxuICAgICAgfCBTb21lIGkgLT4gYnkgKyBpKVxuOztcblxubGV0IGluY3IgPyhieSA9IDEpID8ocmVtb3ZlX2lmX3plcm8gPSBmYWxzZSkgdCBrZXkgPSBpbmNyX2J5IH5yZW1vdmVfaWZfemVybyB0IGtleSBieVxubGV0IGRlY3IgPyhieSA9IDEpID8ocmVtb3ZlX2lmX3plcm8gPSBmYWxzZSkgdCBrZXkgPSBpbmNyX2J5IH5yZW1vdmVfaWZfemVybyB0IGtleSAoLWJ5KVxuXG5sZXQgYWRkX211bHRpIHQgfmtleSB+ZGF0YSA9XG4gIHVwZGF0ZSB0IGtleSB+ZjooZnVuY3Rpb25cbiAgICB8IE5vbmUgLT4gWyBkYXRhIF1cbiAgICB8IFNvbWUgbCAtPiBkYXRhIDo6IGwpXG47O1xuXG5sZXQgcmVtb3ZlX211bHRpIHQga2V5ID1cbiAgbWF0Y2ggZmluZCB0IGtleSB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgW10gfCBTb21lIFsgXyBdIC0+IHJlbW92ZSB0IGtleVxuICB8IFNvbWUgKF8gOjogdGwpIC0+IHNldCB0IH5rZXkgfmRhdGE6dGxcbjs7XG5cbmxldCBmaW5kX211bHRpIHQga2V5ID1cbiAgbWF0Y2ggZmluZCB0IGtleSB3aXRoXG4gIHwgTm9uZSAtPiBbXVxuICB8IFNvbWUgbCAtPiBsXG47O1xuXG5sZXQgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IH5nZXRfZGF0YSByb3dzID1cbiAgbGV0IHNpemUgPVxuICAgIG1hdGNoIHNpemUgd2l0aFxuICAgIHwgU29tZSBzIC0+IHNcbiAgICB8IE5vbmUgLT4gTGlzdC5sZW5ndGggcm93c1xuICBpblxuICBsZXQgcmVzID0gY3JlYXRlID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgfnNpemUgKCkgaW5cbiAgbGV0IGR1cGVzID0gcmVmIFtdIGluXG4gIExpc3QuaXRlciByb3dzIH5mOihmdW4gciAtPlxuICAgIGxldCBrZXkgPSBnZXRfa2V5IHIgaW5cbiAgICBsZXQgZGF0YSA9IGdldF9kYXRhIHIgaW5cbiAgICBpZiBtZW0gcmVzIGtleSB0aGVuIGR1cGVzIDo9IGtleSA6OiAhZHVwZXMgZWxzZSBzZXQgcmVzIH5rZXkgfmRhdGEpO1xuICBtYXRjaCAhZHVwZXMgd2l0aFxuICB8IFtdIC0+IGBPayByZXNcbiAgfCBrZXlzIC0+IGBEdXBsaWNhdGVfa2V5cyAoTGlzdC5kZWR1cF9hbmRfc29ydCB+Y29tcGFyZTpoYXNoYWJsZS5IYXNoYWJsZS5jb21wYXJlIGtleXMpXG47O1xuXG5sZXQgY3JlYXRlX21hcHBlZF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IH5nZXRfZGF0YSByb3dzID1cbiAgbGV0IHNpemUgPVxuICAgIG1hdGNoIHNpemUgd2l0aFxuICAgIHwgU29tZSBzIC0+IHNcbiAgICB8IE5vbmUgLT4gTGlzdC5sZW5ndGggcm93c1xuICBpblxuICBsZXQgcmVzID0gY3JlYXRlID9ncm93dGhfYWxsb3dlZCB+c2l6ZSB+aGFzaGFibGUgKCkgaW5cbiAgTGlzdC5pdGVyIHJvd3MgfmY6KGZ1biByIC0+XG4gICAgbGV0IGtleSA9IGdldF9rZXkgciBpblxuICAgIGxldCBkYXRhID0gZ2V0X2RhdGEgciBpblxuICAgIGFkZF9tdWx0aSByZXMgfmtleSB+ZGF0YSk7XG4gIHJlc1xuOztcblxubGV0IG9mX2FsaXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0ID1cbiAgbWF0Y2ggY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5OmZzdCB+Z2V0X2RhdGE6c25kIGxzdCB3aXRoXG4gIHwgYE9rIHQgLT4gYE9rIHRcbiAgfCBgRHVwbGljYXRlX2tleXMgayAtPiBgRHVwbGljYXRlX2tleSAoTGlzdC5oZF9leG4gaylcbjs7XG5cbmxldCBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3QgPVxuICBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXk6ZnN0IH5nZXRfZGF0YTpzbmQgbHN0XG47O1xuXG5sZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3QgPVxuICBtYXRjaCBvZl9hbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCB3aXRoXG4gIHwgYE9rIHYgLT4gUmVzdWx0Lk9rIHZcbiAgfCBgRHVwbGljYXRlX2tleSBrZXkgLT5cbiAgICBsZXQgc2V4cF9vZl9rZXkgPSBoYXNoYWJsZS5IYXNoYWJsZS5zZXhwX29mX3QgaW5cbiAgICBPcl9lcnJvci5lcnJvciBcIkhhc2h0Ymwub2ZfYWxpc3RfZXhuOiBkdXBsaWNhdGUga2V5XCIga2V5IHNleHBfb2Zfa2V5XG47O1xuXG5sZXQgb2ZfYWxpc3RfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0ID1cbiAgbWF0Y2ggb2ZfYWxpc3Rfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3Qgd2l0aFxuICB8IFJlc3VsdC5PayB2IC0+IHZcbiAgfCBSZXN1bHQuRXJyb3IgZSAtPiBFcnJvci5yYWlzZSBlXG47O1xuXG5sZXQgb2ZfYWxpc3RfbXVsdGkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3QgPVxuICBjcmVhdGVfbWFwcGVkX211bHRpID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXk6ZnN0IH5nZXRfZGF0YTpzbmQgbHN0XG47O1xuXG5sZXQgdG9fYWxpc3QgdCA9IGZvbGQgfmY6KGZ1biB+a2V5IH5kYXRhIGxpc3QgLT4gKGtleSwgZGF0YSkgOjogbGlzdCkgfmluaXQ6W10gdFxuXG5sZXQgc2V4cF9vZl90IHNleHBfb2Zfa2V5IHNleHBfb2ZfZGF0YSB0ID1cbiAgdFxuICB8PiB0b19hbGlzdFxuICB8PiBMaXN0LnNvcnQgfmNvbXBhcmU6KGZ1biAoazEsIF8pIChrMiwgXykgLT4gdC5oYXNoYWJsZS5jb21wYXJlIGsxIGsyKVxuICB8PiBzZXhwX29mX2xpc3QgKHNleHBfb2ZfcGFpciBzZXhwX29mX2tleSBzZXhwX29mX2RhdGEpXG47O1xuXG5sZXQgdF9vZl9zZXhwIH5oYXNoYWJsZSBrX29mX3NleHAgZF9vZl9zZXhwIHNleHAgPVxuICBsZXQgYWxpc3QgPSBsaXN0X29mX3NleHAgKHBhaXJfb2Zfc2V4cCBrX29mX3NleHAgZF9vZl9zZXhwKSBzZXhwIGluXG4gIG1hdGNoIG9mX2FsaXN0IH5oYXNoYWJsZSBhbGlzdCB+c2l6ZTooTGlzdC5sZW5ndGggYWxpc3QpIHdpdGhcbiAgfCBgT2sgdiAtPiB2XG4gIHwgYER1cGxpY2F0ZV9rZXkgayAtPlxuICAgICgqIGZpbmQgdGhlIHNleHAgb2YgYSBkdXBsaWNhdGUga2V5LCBzbyB0aGUgZXJyb3IgaXMgbmFycm93ZWQgdG8gYSBrZXkgYW5kIG5vdFxuICAgICAgIHRoZSB3aG9sZSBtYXAgKilcbiAgICBsZXQgYWxpc3Rfc2V4cHMgPSBsaXN0X29mX3NleHAgKHBhaXJfb2Zfc2V4cCBGbi5pZCBGbi5pZCkgc2V4cCBpblxuICAgIGxldCBmb3VuZF9maXJzdF9rID0gcmVmIGZhbHNlIGluXG4gICAgTGlzdC5pdGVyMl9leG4gYWxpc3QgYWxpc3Rfc2V4cHMgfmY6KGZ1biAoazIsIF8pIChrMl9zZXhwLCBfKSAtPlxuICAgICAgaWYgaGFzaGFibGUuY29tcGFyZSBrIGsyID0gMFxuICAgICAgdGhlblxuICAgICAgICBpZiAhZm91bmRfZmlyc3Rfa1xuICAgICAgICB0aGVuIG9mX3NleHBfZXJyb3IgXCJIYXNodGJsLnRfb2Zfc2V4cDogZHVwbGljYXRlIGtleVwiIGsyX3NleHBcbiAgICAgICAgZWxzZSBmb3VuZF9maXJzdF9rIDo9IHRydWUpO1xuICAgIGFzc2VydCBmYWxzZVxuOztcblxubGV0IHRfc2V4cF9ncmFtbWFyXG4gICAgICAodHlwZSBrIHYpXG4gICAgICAoa19ncmFtbWFyIDogayBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICAgICh2X2dyYW1tYXIgOiB2IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IChrLCB2KSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoTGlzdC5Bc3NvYy50X3NleHBfZ3JhbW1hciBrX2dyYW1tYXIgdl9ncmFtbWFyKVxuOztcblxubGV0IGtleXMgdCA9IGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIH5rZXkgfmRhdGE6XyBhY2MgLT4ga2V5IDo6IGFjYylcbmxldCBkYXRhIHQgPSBmb2xkIH5mOihmdW4gfmtleTpfIH5kYXRhIGxpc3QgLT4gZGF0YSA6OiBsaXN0KSB+aW5pdDpbXSB0XG5cbmxldCBhZGRfdG9fZ3JvdXBzIGdyb3VwcyB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgfnJvd3MgPVxuICBMaXN0Lml0ZXIgcm93cyB+ZjooZnVuIHJvdyAtPlxuICAgIGxldCBrZXkgPSBnZXRfa2V5IHJvdyBpblxuICAgIGxldCBkYXRhID0gZ2V0X2RhdGEgcm93IGluXG4gICAgbGV0IGRhdGEgPVxuICAgICAgbWF0Y2ggZmluZCBncm91cHMga2V5IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBkYXRhXG4gICAgICB8IFNvbWUgb2xkIC0+IGNvbWJpbmUgb2xkIGRhdGFcbiAgICBpblxuICAgIHNldCBncm91cHMgfmtleSB+ZGF0YSlcbjs7XG5cbmxldCBncm91cCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSByb3dzID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlICgpIGluXG4gIGFkZF90b19ncm91cHMgcmVzIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSB+cm93cztcbiAgcmVzXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgcm93cyA9XG4gIGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSB+Z2V0X2RhdGE6Rm4uaWQgcm93c1xuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IHJvd3MgPVxuICBtYXRjaCBjcmVhdGVfd2l0aF9rZXkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSByb3dzIHdpdGhcbiAgfCBgT2sgdCAtPiBSZXN1bHQuT2sgdFxuICB8IGBEdXBsaWNhdGVfa2V5cyBrZXlzIC0+XG4gICAgbGV0IHNleHBfb2Zfa2V5ID0gaGFzaGFibGUuSGFzaGFibGUuc2V4cF9vZl90IGluXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJIYXNodGJsLmNyZWF0ZV93aXRoX2tleTogZHVwbGljYXRlIGtleXNcIlxuICAgICAgICAgWyBcImtleXNcIiwgc2V4cF9vZl9saXN0IHNleHBfb2Zfa2V5IGtleXMgXSlcbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXlfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgcm93cyA9XG4gIE9yX2Vycm9yLm9rX2V4biAoY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgcm93cylcbjs7XG5cbmxldCBtZXJnZSA9XG4gIGxldCBtYXliZV9zZXQgdCB+a2V5IH5mIGQgPVxuICAgIG1hdGNoIGYgfmtleSBkIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgdiAtPiBzZXQgdCB+a2V5IH5kYXRhOnZcbiAgaW5cbiAgZnVuIHRfbGVmdCB0X3JpZ2h0IH5mIC0+XG4gICAgaWYgbm90IChIYXNoYWJsZS5lcXVhbCB0X2xlZnQuaGFzaGFibGUgdF9yaWdodC5oYXNoYWJsZSlcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiSGFzaHRibC5tZXJnZTogZGlmZmVyZW50ICdoYXNoYWJsZScgdmFsdWVzXCI7XG4gICAgbGV0IG5ld190ID1cbiAgICAgIGNyZWF0ZVxuICAgICAgICB+Z3Jvd3RoX2FsbG93ZWQ6dF9sZWZ0Lmdyb3d0aF9hbGxvd2VkXG4gICAgICAgIH5oYXNoYWJsZTp0X2xlZnQuaGFzaGFibGVcbiAgICAgICAgfnNpemU6dF9sZWZ0Lmxlbmd0aFxuICAgICAgICAoKVxuICAgIGluXG4gICAgd2l0aG91dF9tdXRhdGluZyB0X2xlZnQgKGZ1biAoKSAtPlxuICAgICAgd2l0aG91dF9tdXRhdGluZyB0X3JpZ2h0IChmdW4gKCkgLT5cbiAgICAgICAgaXRlcmkgdF9sZWZ0IH5mOihmdW4gfmtleSB+ZGF0YTpsZWZ0IC0+XG4gICAgICAgICAgbWF0Y2ggZmluZCB0X3JpZ2h0IGtleSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IG1heWJlX3NldCBuZXdfdCB+a2V5IH5mIChgTGVmdCBsZWZ0KVxuICAgICAgICAgIHwgU29tZSByaWdodCAtPiBtYXliZV9zZXQgbmV3X3QgfmtleSB+ZiAoYEJvdGggKGxlZnQsIHJpZ2h0KSkpO1xuICAgICAgICBpdGVyaSB0X3JpZ2h0IH5mOihmdW4gfmtleSB+ZGF0YTpyaWdodCAtPlxuICAgICAgICAgIG1hdGNoIGZpbmQgdF9sZWZ0IGtleSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IG1heWJlX3NldCBuZXdfdCB+a2V5IH5mIChgUmlnaHQgcmlnaHQpXG4gICAgICAgICAgfCBTb21lIF8gLT4gKClcbiAgICAgICAgICAoKiBhbHJlYWR5IGRvbmUgYWJvdmUgKikpKSk7XG4gICAgbmV3X3Rcbjs7XG5cbmxldCBtZXJnZV9pbnRvIH5zcmMgfmRzdCB+ZiA9XG4gIGl0ZXJpIHNyYyB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICBsZXQgZHN0X2RhdGEgPSBmaW5kIGRzdCBrZXkgaW5cbiAgICBsZXQgYWN0aW9uID0gd2l0aG91dF9tdXRhdGluZyBkc3QgKGZ1biAoKSAtPiBmIH5rZXkgZGF0YSBkc3RfZGF0YSkgaW5cbiAgICBtYXRjaCAoYWN0aW9uIDogXyBNZXJnZV9pbnRvX2FjdGlvbi50KSB3aXRoXG4gICAgfCBSZW1vdmUgLT4gcmVtb3ZlIGRzdCBrZXlcbiAgICB8IFNldF90byBkYXRhIC0+XG4gICAgICAobWF0Y2ggZHN0X2RhdGEgd2l0aFxuICAgICAgIHwgTm9uZSAtPiBzZXQgZHN0IH5rZXkgfmRhdGFcbiAgICAgICB8IFNvbWUgZHN0X2RhdGEgLT4gaWYgbm90IChwaHlzX2VxdWFsIGRzdF9kYXRhIGRhdGEpIHRoZW4gc2V0IGRzdCB+a2V5IH5kYXRhKSlcbjs7XG5cbmxldCBmaWx0ZXJpX2lucGxhY2UgdCB+ZiA9XG4gIGxldCB0b19yZW1vdmUgPVxuICAgIGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIH5rZXkgfmRhdGEgYWMgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gYWMgZWxzZSBrZXkgOjogYWMpXG4gIGluXG4gIExpc3QuaXRlciB0b19yZW1vdmUgfmY6KGZ1biBrZXkgLT4gcmVtb3ZlIHQga2V5KVxuOztcblxubGV0IGZpbHRlcl9pbnBsYWNlIHQgfmYgPSBmaWx0ZXJpX2lucGxhY2UgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5sZXQgZmlsdGVyX2tleXNfaW5wbGFjZSB0IH5mID0gZmlsdGVyaV9pbnBsYWNlIHQgfmY6KGZ1biB+a2V5IH5kYXRhOl8gLT4gZiBrZXkpXG5cbmxldCBmaWx0ZXJfbWFwaV9pbnBsYWNlIHQgfmYgPVxuICBsZXQgbWFwX3Jlc3VsdHMgPSBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biB+a2V5IH5kYXRhIGFjIC0+IChrZXksIGYgfmtleSB+ZGF0YSkgOjogYWMpIGluXG4gIExpc3QuaXRlciBtYXBfcmVzdWx0cyB+ZjooZnVuIChrZXksIHJlc3VsdCkgLT5cbiAgICBtYXRjaCByZXN1bHQgd2l0aFxuICAgIHwgTm9uZSAtPiByZW1vdmUgdCBrZXlcbiAgICB8IFNvbWUgZGF0YSAtPiBzZXQgdCB+a2V5IH5kYXRhKVxuOztcblxubGV0IGZpbHRlcl9tYXBfaW5wbGFjZSB0IH5mID0gZmlsdGVyX21hcGlfaW5wbGFjZSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcblxubGV0IG1hcGlfaW5wbGFjZSB0IH5mID1cbiAgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdDtcbiAgd2l0aG91dF9tdXRhdGluZyB0IChmdW4gKCkgLT4gQXJyYXkuaXRlciB0LnRhYmxlIH5mOihBdmx0cmVlLm1hcGlfaW5wbGFjZSB+ZikpXG47O1xuXG5sZXQgbWFwX2lucGxhY2UgdCB+ZiA9IG1hcGlfaW5wbGFjZSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcblxubGV0IGVxdWFsIGVxdWFsIHQgdCcgPVxuICBsZW5ndGggdCA9IGxlbmd0aCB0J1xuICAmJiB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICB3aXRob3V0X211dGF0aW5nIHQnIChmdW4gKCkgLT5cbiAgICAgIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgICAgIG1hdGNoIGZpbmQgdCcga2V5IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHIucmV0dXJuIGZhbHNlXG4gICAgICAgIHwgU29tZSBkYXRhJyAtPiBpZiBub3QgKGVxdWFsIGRhdGEgZGF0YScpIHRoZW4gci5yZXR1cm4gZmFsc2UpKTtcbiAgICB0cnVlKVxuOztcblxubGV0IHNpbWlsYXIgPSBlcXVhbFxuXG5tb2R1bGUgQWNjZXNzb3JzID0gc3RydWN0XG4gIGxldCBpbnZhcmlhbnQgPSBpbnZhcmlhbnRcbiAgbGV0IGNob29zZSA9IGNob29zZVxuICBsZXQgY2hvb3NlX2V4biA9IGNob29zZV9leG5cbiAgbGV0IGNsZWFyID0gY2xlYXJcbiAgbGV0IGNvcHkgPSBjb3B5XG4gIGxldCByZW1vdmUgPSByZW1vdmVcbiAgbGV0IHNldCA9IHNldFxuICBsZXQgYWRkID0gYWRkXG4gIGxldCBhZGRfZXhuID0gYWRkX2V4blxuICBsZXQgY2hhbmdlID0gY2hhbmdlXG4gIGxldCB1cGRhdGUgPSB1cGRhdGVcbiAgbGV0IHVwZGF0ZV9hbmRfcmV0dXJuID0gdXBkYXRlX2FuZF9yZXR1cm5cbiAgbGV0IGFkZF9tdWx0aSA9IGFkZF9tdWx0aVxuICBsZXQgcmVtb3ZlX211bHRpID0gcmVtb3ZlX211bHRpXG4gIGxldCBmaW5kX211bHRpID0gZmluZF9tdWx0aVxuICBsZXQgbWVtID0gbWVtXG4gIGxldCBpdGVyX2tleXMgPSBpdGVyX2tleXNcbiAgbGV0IGl0ZXIgPSBpdGVyXG4gIGxldCBpdGVyaSA9IGl0ZXJpXG4gIGxldCBleGlzdHMgPSBleGlzdHNcbiAgbGV0IGV4aXN0c2kgPSBleGlzdHNpXG4gIGxldCBmb3JfYWxsID0gZm9yX2FsbFxuICBsZXQgZm9yX2FsbGkgPSBmb3JfYWxsaVxuICBsZXQgY291bnQgPSBjb3VudFxuICBsZXQgY291bnRpID0gY291bnRpXG4gIGxldCBmb2xkID0gZm9sZFxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gIGxldCBpc19lbXB0eSA9IGlzX2VtcHR5XG4gIGxldCBtYXAgPSBtYXBcbiAgbGV0IG1hcGkgPSBtYXBpXG4gIGxldCBmaWx0ZXJfbWFwID0gZmlsdGVyX21hcFxuICBsZXQgZmlsdGVyX21hcGkgPSBmaWx0ZXJfbWFwaVxuICBsZXQgZmlsdGVyX2tleXMgPSBmaWx0ZXJfa2V5c1xuICBsZXQgZmlsdGVyID0gZmlsdGVyXG4gIGxldCBmaWx0ZXJpID0gZmlsdGVyaVxuICBsZXQgcGFydGl0aW9uX21hcCA9IHBhcnRpdGlvbl9tYXBcbiAgbGV0IHBhcnRpdGlvbl9tYXBpID0gcGFydGl0aW9uX21hcGlcbiAgbGV0IHBhcnRpdGlvbl90ZiA9IHBhcnRpdGlvbl90ZlxuICBsZXQgcGFydGl0aW9uaV90ZiA9IHBhcnRpdGlvbmlfdGZcbiAgbGV0IGZpbmRfb3JfYWRkID0gZmluZF9vcl9hZGRcbiAgbGV0IGZpbmRpX29yX2FkZCA9IGZpbmRpX29yX2FkZFxuICBsZXQgZmluZCA9IGZpbmRcbiAgbGV0IGZpbmRfZXhuID0gZmluZF9leG5cbiAgbGV0IGZpbmRfYW5kX2NhbGwgPSBmaW5kX2FuZF9jYWxsXG4gIGxldCBmaW5kX2FuZF9jYWxsMSA9IGZpbmRfYW5kX2NhbGwxXG4gIGxldCBmaW5kX2FuZF9jYWxsMiA9IGZpbmRfYW5kX2NhbGwyXG4gIGxldCBmaW5kaV9hbmRfY2FsbCA9IGZpbmRpX2FuZF9jYWxsXG4gIGxldCBmaW5kaV9hbmRfY2FsbDEgPSBmaW5kaV9hbmRfY2FsbDFcbiAgbGV0IGZpbmRpX2FuZF9jYWxsMiA9IGZpbmRpX2FuZF9jYWxsMlxuICBsZXQgZmluZF9hbmRfcmVtb3ZlID0gZmluZF9hbmRfcmVtb3ZlXG4gIGxldCB0b19hbGlzdCA9IHRvX2FsaXN0XG4gIGxldCBtZXJnZSA9IG1lcmdlXG4gIGxldCBtZXJnZV9pbnRvID0gbWVyZ2VfaW50b1xuICBsZXQga2V5cyA9IGtleXNcbiAgbGV0IGRhdGEgPSBkYXRhXG4gIGxldCBmaWx0ZXJfa2V5c19pbnBsYWNlID0gZmlsdGVyX2tleXNfaW5wbGFjZVxuICBsZXQgZmlsdGVyX2lucGxhY2UgPSBmaWx0ZXJfaW5wbGFjZVxuICBsZXQgZmlsdGVyaV9pbnBsYWNlID0gZmlsdGVyaV9pbnBsYWNlXG4gIGxldCBtYXBfaW5wbGFjZSA9IG1hcF9pbnBsYWNlXG4gIGxldCBtYXBpX2lucGxhY2UgPSBtYXBpX2lucGxhY2VcbiAgbGV0IGZpbHRlcl9tYXBfaW5wbGFjZSA9IGZpbHRlcl9tYXBfaW5wbGFjZVxuICBsZXQgZmlsdGVyX21hcGlfaW5wbGFjZSA9IGZpbHRlcl9tYXBpX2lucGxhY2VcbiAgbGV0IGVxdWFsID0gZXF1YWxcbiAgbGV0IHNpbWlsYXIgPSBzaW1pbGFyXG4gIGxldCBpbmNyID0gaW5jclxuICBsZXQgZGVjciA9IGRlY3JcbiAgbGV0IHNleHBfb2Zfa2V5ID0gc2V4cF9vZl9rZXlcbmVuZFxuXG5tb2R1bGUgQ3JlYXRvcnMgKEtleSA6IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGhhc2hhYmxlIDogJ2EgdCBIYXNoYWJsZS50XG4gIGVuZCkgOiBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XyA9ICgnYSBLZXkudCwgJ2IpIHRcblxuICB2YWwgdF9vZl9zZXhwIDogKFNleHAudCAtPiAnYSBLZXkudCkgLT4gKFNleHAudCAtPiAnYikgLT4gU2V4cC50IC0+ICgnYSwgJ2IpIHRfXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzX2dlbmVyaWNcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0X1xuICAgIHdpdGggdHlwZSAnYSBrZXkgOj0gJ2EgS2V5LnRcbiAgICB3aXRoIHR5cGUgKCdrZXksICdkYXRhLCAnYSkgY3JlYXRlX29wdGlvbnMgOj1cbiAgICAgICgna2V5LCAnZGF0YSwgJ2EpIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG5lbmQgPSBzdHJ1Y3RcbiAgbGV0IGhhc2hhYmxlID0gS2V5Lmhhc2hhYmxlXG5cbiAgdHlwZSAoJ2EsICdiKSB0XyA9ICgnYSBLZXkudCwgJ2IpIHRcblxuICBsZXQgY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSAoKSA9IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlICgpXG4gIGxldCBvZl9hbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9IG9mX2FsaXN0ID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgbFxuXG4gIGxldCBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPVxuICAgIG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIGxcbiAgOztcblxuICBsZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPVxuICAgIG9mX2FsaXN0X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgbFxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPVxuICAgIG9mX2FsaXN0X2V4biA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIGxcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwIGtfb2Zfc2V4cCBkX29mX3NleHAgc2V4cCA9IHRfb2Zfc2V4cCB+aGFzaGFibGUga19vZl9zZXhwIGRfb2Zfc2V4cCBzZXhwXG5cbiAgbGV0IG9mX2FsaXN0X211bHRpID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID1cbiAgICBvZl9hbGlzdF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIGxcbiAgOztcblxuICBsZXQgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIGwgPVxuICAgIGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgbFxuICA7O1xuXG4gIGxldCBjcmVhdGVfd2l0aF9rZXkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGwgPVxuICAgIGNyZWF0ZV93aXRoX2tleSA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIH5nZXRfa2V5IGxcbiAgOztcblxuICBsZXQgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsID1cbiAgICBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSB+Z2V0X2tleSBsXG4gIDs7XG5cbiAgbGV0IGNyZWF0ZV93aXRoX2tleV9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGwgPVxuICAgIGNyZWF0ZV93aXRoX2tleV9leG4gP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSB+Z2V0X2tleSBsXG4gIDs7XG5cbiAgbGV0IGdyb3VwID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgbCA9XG4gICAgZ3JvdXAgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgbFxuICA7O1xuZW5kXG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG4gIHR5cGUgJ2Ega2V5ID0gJ2FcblxuICBsZXQgaGFzaGFibGUgPSBIYXNoYWJsZS5wb2x5XG5cbiAgaW5jbHVkZSBDcmVhdG9ycyAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuXG4gICAgICBsZXQgaGFzaGFibGUgPSBoYXNoYWJsZVxuICAgIGVuZClcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCBzZXhwX29mX3QgPSBzZXhwX29mX3RcbiAgbGV0IHRfc2V4cF9ncmFtbWFyID0gdF9zZXhwX2dyYW1tYXJcbmVuZFxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gQ3JlYXRvcnNfZ2VuZXJpY1xuICBtb2R1bGUgdHlwZSBIYXNoYWJsZSA9IEhhc2hhYmxlLkhhc2hhYmxlXG5cbiAgdHlwZSBub25yZWMgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGUgPVxuICAgICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG5cbiAgbGV0IGhhc2hhYmxlIHQgPSB0Lmhhc2hhYmxlXG5lbmRcblxubGV0IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSA9XG4gIGNyZWF0ZSB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgKClcbjs7XG5cbmxldCBvZl9hbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgb2ZfYWxpc3Qgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGxcbjs7XG5cbmxldCBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbFxuOztcblxubGV0IG9mX2FsaXN0X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBvZl9hbGlzdF9vcl9lcnJvciB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbFxuOztcblxubGV0IG9mX2FsaXN0X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgb2ZfYWxpc3RfZXhuIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsXG47O1xuXG5sZXQgb2ZfYWxpc3RfbXVsdGkgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIG9mX2FsaXN0X211bHRpIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsXG47O1xuXG5sZXQgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSB+Z2V0X2tleSB+Z2V0X2RhdGEgbCA9XG4gIGNyZWF0ZV9tYXBwZWQgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSBsXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIH5nZXRfa2V5IGwgPVxuICBjcmVhdGVfd2l0aF9rZXkgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGxcbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gfmdldF9rZXkgbCA9XG4gIGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbFxuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleV9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gfmdldF9rZXkgbCA9XG4gIGNyZWF0ZV93aXRoX2tleV9leG4gfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGxcbjs7XG5cbmxldCBncm91cCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgbCA9XG4gIGdyb3VwIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgbFxuOztcblxubGV0IGhhc2hhYmxlX3MgdCA9IEhhc2hhYmxlLnRvX2tleSB0Lmhhc2hhYmxlXG5cbm1vZHVsZSBNIChLIDogVC5UKSA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAndiB0ID0gKEsudCwgJ3YpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICBbQEBAZW5kXVxuXG4gIGluY2x1ZGUgS2V5LlMgd2l0aCB0eXBlIHQgOj0gdFxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG5cbmxldCBzZXhwX29mX21fX3QgKHR5cGUgaykgKG1vZHVsZSBLIDogU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gaykgc2V4cF9vZl92IHQgPVxuICBzZXhwX29mX3QgSy5zZXhwX29mX3Qgc2V4cF9vZl92IHRcbjs7XG5cbmxldCBtX190X29mX3NleHAgKHR5cGUgaykgKG1vZHVsZSBLIDogTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gaykgdl9vZl9zZXhwIHNleHAgPVxuICB0X29mX3NleHAgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgKG1vZHVsZSBLKSkgSy50X29mX3NleHAgdl9vZl9zZXhwIHNleHBcbjs7XG5cbmxldCBtX190X3NleHBfZ3JhbW1hciAodHlwZSBrKSAobW9kdWxlIEsgOiBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9IGspIHZfZ3JhbW1hciA9XG4gIHRfc2V4cF9ncmFtbWFyIEsudF9zZXhwX2dyYW1tYXIgdl9ncmFtbWFyXG47O1xuXG5sZXQgZXF1YWxfbV9fdCAobW9kdWxlIF8gOiBFcXVhbF9tKSBlcXVhbF92IHQxIHQyID0gZXF1YWwgZXF1YWxfdiB0MSB0MlxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEhhc2hfc2V0X2ludGZcblxubGV0IGhhc2hhYmxlX3MgPSBIYXNodGJsLmhhc2hhYmxlX3NcbmxldCBoYXNoYWJsZSA9IEhhc2h0YmwuUHJpdmF0ZS5oYXNoYWJsZVxubGV0IHBvbHlfaGFzaGFibGUgPSBIYXNodGJsLlBvbHkuaGFzaGFibGVcbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5cbnR5cGUgJ2EgdCA9ICgnYSwgdW5pdCkgSGFzaHRibC50XG50eXBlICdhIGhhc2hfc2V0ID0gJ2EgdFxudHlwZSAnYSBlbHQgPSAnYVxuXG5tb2R1bGUgQWNjZXNzb3JzID0gc3RydWN0XG4gIGxldCBoYXNoYWJsZSA9IGhhc2hhYmxlXG4gIGxldCBjbGVhciA9IEhhc2h0YmwuY2xlYXJcbiAgbGV0IGxlbmd0aCA9IEhhc2h0YmwubGVuZ3RoXG4gIGxldCBtZW0gPSBIYXNodGJsLm1lbVxuICBsZXQgaXNfZW1wdHkgdCA9IEhhc2h0YmwuaXNfZW1wdHkgdFxuXG4gIGxldCBmaW5kX21hcCB0IH5mID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgIEhhc2h0YmwuaXRlcl9rZXlzIHQgfmY6KGZ1biBlbHQgLT5cbiAgICAgICAgbWF0Y2ggZiBlbHQgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgfCBTb21lIF8gYXMgbyAtPiByLnJldHVybiBvKTtcbiAgICAgIE5vbmUpXG4gIDs7XG5cbiAgbGV0IGZpbmQgdCB+ZiA9IGZpbmRfbWFwIHQgfmY6KGZ1biBhIC0+IGlmIGYgYSB0aGVuIFNvbWUgYSBlbHNlIE5vbmUpXG4gIGxldCBhZGQgdCBrID0gSGFzaHRibC5zZXQgdCB+a2V5OmsgfmRhdGE6KClcblxuICBsZXQgc3RyaWN0X2FkZCB0IGsgPVxuICAgIGlmIG1lbSB0IGtcbiAgICB0aGVuIE9yX2Vycm9yLmVycm9yX3N0cmluZyBcImVsZW1lbnQgYWxyZWFkeSBleGlzdHNcIlxuICAgIGVsc2UgKFxuICAgICAgSGFzaHRibC5zZXQgdCB+a2V5OmsgfmRhdGE6KCk7XG4gICAgICBSZXN1bHQuT2sgKCkpXG4gIDs7XG5cbiAgbGV0IHN0cmljdF9hZGRfZXhuIHQgayA9IE9yX2Vycm9yLm9rX2V4biAoc3RyaWN0X2FkZCB0IGspXG4gIGxldCByZW1vdmUgPSBIYXNodGJsLnJlbW92ZVxuXG4gIGxldCBzdHJpY3RfcmVtb3ZlIHQgayA9XG4gICAgaWYgbWVtIHQga1xuICAgIHRoZW4gKFxuICAgICAgcmVtb3ZlIHQgaztcbiAgICAgIFJlc3VsdC5PayAoKSlcbiAgICBlbHNlIE9yX2Vycm9yLmVycm9yIFwiZWxlbWVudCBub3QgaW4gc2V0XCIgayAoSGFzaHRibC5zZXhwX29mX2tleSB0KVxuICA7O1xuXG4gIGxldCBzdHJpY3RfcmVtb3ZlX2V4biB0IGsgPSBPcl9lcnJvci5va19leG4gKHN0cmljdF9yZW1vdmUgdCBrKVxuICBsZXQgZm9sZCB0IH5pbml0IH5mID0gSGFzaHRibC5mb2xkIHQgfmluaXQgfmY6KGZ1biB+a2V5IH5kYXRhOigpIGFjYyAtPiBmIGFjYyBrZXkpXG4gIGxldCBpdGVyIHQgfmYgPSBIYXNodGJsLml0ZXJfa2V5cyB0IH5mXG4gIGxldCBjb3VudCB0IH5mID0gQ29udGFpbmVyLmNvdW50IH5mb2xkIHQgfmZcbiAgbGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxuICBsZXQgbWluX2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuICBsZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuICBsZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB0XG4gIGxldCB0b19saXN0ID0gSGFzaHRibC5rZXlzXG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2UgdCA9XG4gICAgc2V4cF9vZl9saXN0IHNleHBfb2ZfZSAodG9fbGlzdCB0IHw+IExpc3Quc29ydCB+Y29tcGFyZTooaGFzaGFibGUgdCkuY29tcGFyZSlcbiAgOztcblxuICBsZXQgdG9fYXJyYXkgdCA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gICAgbGV0IGluZGV4ID0gcmVmIChsZW4gLSAxKSBpblxuICAgIGZvbGQgdCB+aW5pdDpbfHxdIH5mOihmdW4gYWNjIGtleSAtPlxuICAgICAgaWYgQXJyYXkubGVuZ3RoIGFjYyA9IDBcbiAgICAgIHRoZW4gQXJyYXkuY3JlYXRlIH5sZW4ga2V5XG4gICAgICBlbHNlIChcbiAgICAgICAgaW5kZXggOj0gIWluZGV4IC0gMTtcbiAgICAgICAgYWNjLighaW5kZXgpIDwtIGtleTtcbiAgICAgICAgYWNjKSlcbiAgOztcblxuICBsZXQgZXhpc3RzIHQgfmYgPSBIYXNodGJsLmV4aXN0c2kgdCB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgLT4gZiBrZXkpXG4gIGxldCBmb3JfYWxsIHQgfmYgPSBub3QgKEhhc2h0YmwuZXhpc3RzaSB0IH5mOihmdW4gfmtleSB+ZGF0YTooKSAtPiBub3QgKGYga2V5KSkpXG4gIGxldCBlcXVhbCB0MSB0MiA9IEhhc2h0YmwuZXF1YWwgKGZ1biAoKSAoKSAtPiB0cnVlKSB0MSB0MlxuICBsZXQgY29weSB0ID0gSGFzaHRibC5jb3B5IHRcbiAgbGV0IGZpbHRlciB0IH5mID0gSGFzaHRibC5maWx0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOigpIC0+IGYga2V5KVxuICBsZXQgdW5pb24gdDEgdDIgPSBIYXNodGJsLm1lcmdlIHQxIHQyIH5mOihmdW4gfmtleTpfIF8gLT4gU29tZSAoKSlcbiAgbGV0IGRpZmYgdDEgdDIgPSBmaWx0ZXIgdDEgfmY6KGZ1biBrZXkgLT4gbm90IChIYXNodGJsLm1lbSB0MiBrZXkpKVxuXG4gIGxldCBpbnRlciB0MSB0MiA9XG4gICAgbGV0IHNtYWxsZXIsIGxhcmdlciA9IGlmIGxlbmd0aCB0MSA+IGxlbmd0aCB0MiB0aGVuIHQyLCB0MSBlbHNlIHQxLCB0MiBpblxuICAgIEhhc2h0YmwuZmlsdGVyaSBzbWFsbGVyIH5mOihmdW4gfmtleSB+ZGF0YTooKSAtPiBIYXNodGJsLm1lbSBsYXJnZXIga2V5KVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfaW5wbGFjZSB0IH5mID1cbiAgICBsZXQgdG9fcmVtb3ZlID0gZm9sZCB0IH5pbml0OltdIH5mOihmdW4gYWMgeCAtPiBpZiBmIHggdGhlbiBhYyBlbHNlIHggOjogYWMpIGluXG4gICAgTGlzdC5pdGVyIHRvX3JlbW92ZSB+ZjooZnVuIHggLT4gcmVtb3ZlIHQgeClcbiAgOztcblxuICBsZXQgb2ZfaGFzaHRibF9rZXlzIGhhc2h0YmwgPSBIYXNodGJsLm1hcCBoYXNodGJsIH5mOmlnbm9yZVxuICBsZXQgdG9faGFzaHRibCB0IH5mID0gSGFzaHRibC5tYXBpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOigpIC0+IGYga2V5KVxuZW5kXG5cbmluY2x1ZGUgQWNjZXNzb3JzXG5cbmxldCBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gPSBIYXNodGJsLmNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbVxuXG5sZXQgb2ZfbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgbGV0IHNpemUgPVxuICAgIG1hdGNoIHNpemUgd2l0aFxuICAgIHwgU29tZSB4IC0+IHhcbiAgICB8IE5vbmUgLT4gTGlzdC5sZW5ndGggbFxuICBpblxuICBsZXQgdCA9IEhhc2h0YmwuY3JlYXRlID9ncm93dGhfYWxsb3dlZCB+c2l6ZSBtIGluXG4gIExpc3QuaXRlciBsIH5mOihmdW4gayAtPiBhZGQgdCBrKTtcbiAgdFxuOztcblxubGV0IHRfb2Zfc2V4cCBtIGVfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgU2V4cC5BdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcIkhhc2hfc2V0LnRfb2Zfc2V4cCByZXF1aXJlcyBhIGxpc3RcIiBzZXhwXG4gIHwgU2V4cC5MaXN0IGxpc3QgLT5cbiAgICBsZXQgdCA9IGNyZWF0ZSBtIH5zaXplOihMaXN0Lmxlbmd0aCBsaXN0KSBpblxuICAgIExpc3QuaXRlciBsaXN0IH5mOihmdW4gc2V4cCAtPlxuICAgICAgbGV0IGUgPSBlX29mX3NleHAgc2V4cCBpblxuICAgICAgbWF0Y2ggc3RyaWN0X2FkZCB0IGUgd2l0aFxuICAgICAgfCBPayAoKSAtPiAoKVxuICAgICAgfCBFcnJvciBfIC0+IG9mX3NleHBfZXJyb3IgXCJIYXNoX3NldC50X29mX3NleHAgZ290IGEgZHVwbGljYXRlIGVsZW1lbnRcIiBzZXhwKTtcbiAgICB0XG47O1xuXG5tb2R1bGUgQ3JlYXRvcnMgKEVsdCA6IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGhhc2hhYmxlIDogJ2EgdCBIYXNoYWJsZS50XG4gIGVuZCkgOiBzaWdcbiAgdmFsIHRfb2Zfc2V4cCA6IChTZXhwLnQgLT4gJ2EgRWx0LnQpIC0+IFNleHAudCAtPiAnYSBFbHQudCB0XG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzX2dlbmVyaWNcbiAgICB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBFbHQudCB0XG4gICAgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBFbHQudFxuICAgIHdpdGggdHlwZSAoJ2VsdCwgJ3opIGNyZWF0ZV9vcHRpb25zIDo9XG4gICAgICAoJ2VsdCwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG5lbmQgPSBzdHJ1Y3RcbiAgbGV0IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgKCkgPVxuICAgIGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgKEhhc2hhYmxlLnRvX2tleSBFbHQuaGFzaGFibGUpXG4gIDs7XG5cbiAgbGV0IG9mX2xpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPVxuICAgIG9mX2xpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIChIYXNoYWJsZS50b19rZXkgRWx0Lmhhc2hhYmxlKSBsXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCBlX29mX3NleHAgc2V4cCA9IHRfb2Zfc2V4cCAoSGFzaGFibGUudG9fa2V5IEVsdC5oYXNoYWJsZSkgZV9vZl9zZXhwIHNleHBcbmVuZFxuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBoYXNoX3NldFxuICB0eXBlICdhIGVsdCA9ICdhXG5cbiAgbGV0IGhhc2hhYmxlID0gcG9seV9oYXNoYWJsZVxuXG4gIGluY2x1ZGUgQ3JlYXRvcnMgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcblxuICAgICAgbGV0IGhhc2hhYmxlID0gaGFzaGFibGVcbiAgICBlbmQpXG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgc2V4cF9vZl90ID0gc2V4cF9vZl90XG4gIGxldCB0X3NleHBfZ3JhbW1hciBncmFtbWFyID0gU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoTGlzdC50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuZW5kXG5cbm1vZHVsZSBNIChFbHQgOiBULlQpID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjIHQgPSBFbHQudCB0XG5lbmRcblxubGV0IHNleHBfb2ZfbV9fdCAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gZWx0KSB0ID1cbiAgc2V4cF9vZl90IEVsdC5zZXhwX29mX3QgdFxuOztcblxubGV0IG1fX3Rfb2Zfc2V4cCAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gZWx0KSBzZXhwID1cbiAgdF9vZl9zZXhwIChtb2R1bGUgRWx0KSBFbHQudF9vZl9zZXhwIHNleHBcbjs7XG5cbmxldCBtX190X3NleHBfZ3JhbW1hciAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSBlbHQpID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAobGlzdF9zZXhwX2dyYW1tYXIgRWx0LnRfc2V4cF9ncmFtbWFyKVxuOztcblxubGV0IGVxdWFsX21fX3QgKG1vZHVsZSBfIDogRXF1YWxfbSkgdDEgdDIgPSBlcXVhbCB0MSB0MlxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBsZXQgaGFzaGFibGUgPSBIYXNodGJsLlByaXZhdGUuaGFzaGFibGVcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBQcmludGZcbm1vZHVsZSBCeXRlcyA9IEJ5dGVzMFxuaW5jbHVkZSBGbG9hdDBcblxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGZsb2F0IFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9mbG9hdFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfZmxvYXQgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGZsb2F0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2Zsb2F0IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGZsb2F0X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgY29tcGFyZSA9IEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5jb21wYXJlXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCB0b19mbG9hdCB4ID0geFxubGV0IG9mX2Zsb2F0IHggPSB4XG5cbmxldCBvZl9zdHJpbmcgcyA9XG4gIHRyeSBmbG9hdF9vZl9zdHJpbmcgcyB3aXRoXG4gIHwgXyAtPiBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5vZl9zdHJpbmcgJXNcIiBzICgpXG47O1xuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQgOiBzdHJpbmcgLT4gZmxvYXQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9mbG9hdFwiXG5cbigqIFN0b2xlbiBmcm9tIFtwZXJ2YXNpdmVzLm1sXS4gIEFkZHMgYSBcIi5cIiBhdCB0aGUgZW5kIGlmIG5lZWRlZC4gIEl0IGlzIGluXG4gICBbcGVydmFzaXZlcy5tbGldLCBidXQgaXQgYWxzbyBzYXlzIG5vdCB0byB1c2UgaXQgZGlyZWN0bHksIHNvIHdlIGNvcHkgYW5kIHBhc3RlIHRoZVxuICAgY29kZS4gSXQgbWFrZXMgdGhlIGFzc3VtcHRpb24gb24gdGhlIHN0cmluZyBwYXNzZWQgaW4gYXJndW1lbnQgdGhhdCBpdCB3YXMgcmV0dXJuZWQgYnlcbiAgIFtmb3JtYXRfZmxvYXRdLiAqKVxubGV0IHZhbGlkX2Zsb2F0X2xleGVtIHMgPVxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgaSBsXG4gICAgdGhlbiBzIF4gXCIuXCJcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPiBsb29wIChpICsgMSlcbiAgICAgIHwgXyAtPiBzKVxuICBpblxuICBsb29wIDBcbjs7XG5cbigqIExldCBbeV0gYmUgYSBwb3dlciBvZiAyLiAgVGhlbiB0aGUgbmV4dCByZXByZXNlbnRhYmxlIGZsb2F0IGlzOlxuICAgW3ogPSB5ICogKDEgKyAyICoqIC01MildXG4gICBhbmQgdGhlIHByZXZpb3VzIG9uZSBpc1xuICAgW3ggPSB5ICogKDEgLSAyICoqIC01MyldXG5cbiAgIEluIGdlbmVyYWwsIGV2ZXJ5IHR3byBhZGphY2VudCBmbG9hdHMgYXJlIHdpdGhpbiBhIGZhY3RvciBvZiBiZXR3ZWVuIFsxICsgMioqLTUzXVxuICAgYW5kIFsxICsgMioqLTUyXSBmcm9tIGVhY2ggb3RoZXIsIHRoYXQgaXMgd2l0aGluIFsxICsgMS4xZS0xNl0gYW5kIFsxICsgMi4zZS0xNl0uXG5cbiAgIFNvIGlmIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZmxvYXQgc3RhcnRzIHdpdGggXCIxXCIsIHRoZW4gaXRzIGFkamFjZW50IGZsb2F0c1xuICAgd2lsbCB1c3VhbGx5IGRpZmZlciBmcm9tIGl0IGJ5IDEsIGFuZCBzb21ldGltZXMgYnkgMiwgYXQgdGhlIDE3dGggc2lnbmlmaWNhbnQgZGlnaXRcbiAgIChjb3VudGluZyBmcm9tIDEpLlxuXG4gICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gc3RhcnRzIHdpdGggXCI5XCIsIHRoZW4gdGhlIGFkamFjZW50XG4gICBmbG9hdHMgd2lsbCBiZSBvZmYgYnkgbm8gbW9yZSB0aGFuIDIzIGF0IHRoZSAxNnRoIGFuZCAxN3RoIHNpZ25pZmljYW50IGRpZ2l0cy5cblxuICAgRS5nLjpcblxuICAge3ZcbiAgICAgIyBzcHJpbnRmIFwiJS4xN2dcIiAoMTAyNC4gKi4gKDEuIC0uIDIuKiogKC01My4pKSk7O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMVxuICAgICAgICAgICAgICAgICAgIDEyMzQgNTY3ODkwMTIzNDU2N1xuICAgICAtIDogc3RyaW5nID0gXCIxMDIzLjk5OTk5OTk5OTk5OTlcIlxuICAgdn1cbiAgIFByaW50aW5nIGEgY291cGxlIG9mIGV4dHJhIGRpZ2l0cyByZXZlYWxzIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW5kZWVkIGlzIHJvdWdobHkgMTEgYXRcbiAgIGRpZ2l0cyAxN3RoIGFuZCAxOHRoICh0aGF0IGlzLCAxM3RoIGFuZCAxNHRoIGFmdGVyIFwiLlwiKTpcblxuICAge3ZcbiAgICAgIyBzcHJpbnRmIFwiJS4xOWdcIiAoMTAyNC4gKi4gKDEuIC0uIDIuKiogKC01My4pKSk7O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMTExXG4gICAgICAgICAgICAgICAgICAgMTIzNCA1Njc4OTAxMjM0NTY3ODlcbiAgICAgLSA6IHN0cmluZyA9IFwiMTAyMy45OTk5OTk5OTk5OTk4ODZcIlxuICAgdn1cblxuICAgVGhlIHVscCAodGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhZGphY2VudCBmbG9hdHMpIGlzIHR3aWNlIGFzIGJpZyBvbiB0aGUgb3RoZXIgc2lkZSBvZlxuICAgMTAyNC46XG5cbiAgIHt2XG4gICAgICMgc3ByaW50ZiBcIiUuMTlnXCIgKDEwMjQuICouICgxLiArLiAyLioqICgtNTIuKSkpOztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExMTExMTExMVxuICAgICAgICAgICAgICAgICAgIDEyMzQgNTY3ODkwMTIzNDU2Nzg5XG4gICAgIC0gOiBzdHJpbmcgPSBcIjEwMjQuMDAwMDAwMDAwMDAwMjI3XCJcbiAgIHZ9XG5cbiAgIE5vdyB0YWtlIGEgcG93ZXIgb2YgMiB3aGljaCBzdGFydHMgd2l0aCA5OTpcblxuICAge3ZcbiAgICAgIyAyLioqOTMuIDs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDExMTExMTExMTFcbiAgICAgICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTY3OFxuICAgICAtIDogZmxvYXQgPSA5LjkwMzUyMDMxNDI4MzA0MjJlKzI3XG5cbiAgICAgIyAyLioqOTMuICouICgxLiArLiAyLioqICgtNTIuKSk7O1xuICAgICAtIDogZmxvYXQgPSA5LjkwMzUyMDMxNDI4MzA0NDRlKzI3XG5cbiAgICAgIyAyLioqOTMuICouICgxLiAtLiAyLioqICgtNTMuKSk7O1xuICAgICAtIDogZmxvYXQgPSA5LjkwMzUyMDMxNDI4MzA0MTFlKzI3XG4gICB2fVxuXG4gICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIqKjkzIGFuZCBpdHMgdHdvIG5laWdoYm9ycyBpcyBzbGlnaHRseSBtb3JlIHRoYW4sIHJlc3BlY3RpdmVseSxcbiAgIDEgYW5kIDIgYXQgc2lnbmlmaWNhbnQgZGlnaXQgMTYuXG5cbiAgIFRob3NlIGV4YW1wbGVzIHNob3cgdGhhdDpcbiAgIC0gMTcgc2lnbmlmaWNhbnQgZGlnaXRzIGlzIGFsd2F5cyBzdWZmaWNpZW50IHRvIHJlcHJlc2VudCBhIGZsb2F0IHdpdGhvdXQgYW1iaWd1aXR5XG4gICAtIDE1dGggc2lnbmlmaWNhbnQgZGlnaXQgY2FuIGFsd2F5cyBiZSByZXByZXNlbnRlZCBhY2N1cmF0ZWx5XG4gICAtIGNvbnZlcnRpbmcgYSBkZWNpbWFsIG51bWJlciB3aXRoIDE2IHNpZ25pZmljYW50IGRpZ2l0cyB0byBpdHMgbmVhcmVzdCBmbG9hdCBhbmQgYmFja1xuICAgICBjYW4gY2hhbmdlIHRoZSBsYXN0IGRlY2ltYWwgZGlnaXQgYnkgbm8gbW9yZSB0aGFuIDFcblxuICAgVG8gbWFrZSBzdXJlIHRoYXQgZmxvYXRzIG9idGFpbmVkIGJ5IGNvbnZlcnNpb24gZnJvbSBkZWNpbWFsIGZyYWN0aW9ucyAoZS5nLiBcIjMuMTRcIilcbiAgIGFyZSBwcmludGVkIHdpdGhvdXQgdHJhaWxpbmcgbm9uLXplcm8gZGlnaXRzLCBvbmUgc2hvdWxkIGNob29zZSB0aGUgZmlyc3QgYW1vbmcgdGhlXG4gICAnJS4xNWcnLCAnJS4xNmcnLCBhbmQgJyUuMTdnJyByZXByZXNlbnRhdGlvbnMgd2hpY2ggZG9lcyByb3VuZC10cmlwOlxuXG4gICB7dlxuICAgICAjIHNwcmludGYgXCIlLjE1Z1wiIDMuMTQ7O1xuICAgICAtIDogc3RyaW5nID0gXCIzLjE0XCIgICAgICAgICAgICAgICAgICAgICAoKiBwaWNrIHRoaXMgb25lICopXG4gICAgICMgc3ByaW50ZiBcIiUuMTZnXCIgMy4xNDs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjMuMTRcIlxuICAgICAjIHNwcmludGYgXCIlLjE3Z1wiIDMuMTQ7O1xuICAgICAtIDogc3RyaW5nID0gXCIzLjE0MDAwMDAwMDAwMDAwMDFcIiAgICAgICAoKiBkbyBub3QgcGljayB0aGlzIG9uZSAqKVxuXG4gICAgICMgc3ByaW50ZiBcIiUuMTVnXCIgOC4wMDAwMDAwMDAwMDAwMDI7O1xuICAgICAtIDogc3RyaW5nID0gXCI4XCIgICAgICAgICAgICAgICAgICAgICAgICAoKiBkbyBub3QgcGljayB0aGlzIG9uZS0tZG9lcyBub3Qgcm91bmQtdHJpcCAqKVxuICAgICAjIHNwcmludGYgXCIlLjE2Z1wiIDguMDAwMDAwMDAwMDAwMDAyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOC4wMDAwMDAwMDAwMDAwMDJcIiAgICAgICAgKCogcHJlZmVyIHRoaXMgb25lICopXG4gICAgICMgc3ByaW50ZiBcIiUuMTdnXCIgOC4wMDAwMDAwMDAwMDAwMDI7O1xuICAgICAtIDogc3RyaW5nID0gXCI4LjAwMDAwMDAwMDAwMDAwMThcIiAgICAgICAoKiB0aGlzIG9uZSBoYXMgb25lIGRpZ2l0IG9mIGp1bmsgYXQgdGhlIGVuZCAqKVxuICAgdn1cblxuICAgU2tpcHBpbmcgdGhlICclLjE2ZycgaW4gdGhlIGFib3ZlIHByb2NlZHVyZSBzYXZlcyB1cyBzb21lIHRpbWUsIGJ1dCBpdCBtZWFucyB0aGF0LCBhc1xuICAgc2VlbiBpbiB0aGUgc2Vjb25kIGV4YW1wbGUgYWJvdmUsIG9jY2FzaW9uYWxseSBudW1iZXJzIHdpdGggZXhhY3RseSAxNiBzaWduaWZpY2FudFxuICAgZGlnaXRzIHdpbGwgaGF2ZSBhbiBlcnJvciBpbnRyb2R1Y2VkIGF0IHRoZSAxN3RoIGRpZ2l0LiAgVGhhdCBpcyBwcm9iYWJseSBPSyBmb3JcbiAgIHR5cGljYWwgdXNlLCBiZWNhdXNlIGEgbnVtYmVyIHdpdGggMTYgc2lnbmlmaWNhbnQgZGlnaXRzIGlzIFwidWdseVwiIGFscmVhZHkuICBBZGRpbmcgb25lXG4gICBtb3JlIGRvZXNuJ3QgbWFrZSBpdCBtdWNoIHdvcnNlIGZvciBhIGh1bWFuIHJlYWRlci5cblxuICAgT24gdGhlIG90aGVyIGhhbmQsIHdlIGNhbm5vdCBza2lwICclLjE1ZycgYW5kIG9ubHkgbG9vayBhdCAnJS4xNmcnIGFuZCAnJS4xN2cnLCBzaW5jZVxuICAgdGhlIGluYWNjdXJhY3kgYXQgdGhlIDE2dGggZGlnaXQgbWlnaHQgaW50cm9kdWNlIHRoZSBub2lzZSB3ZSB3YW50IHRvIGF2b2lkOlxuXG4gICB7dlxuICAgICAjIHNwcmludGYgXCIlLjE1Z1wiIDkuOTkyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOS45OTJcIiAgICAgICAgICAgICAgICAgICAgKCogcGljayB0aGlzIG9uZSAqKVxuICAgICAjIHNwcmludGYgXCIlLjE2Z1wiIDkuOTkyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOS45OTIwMDAwMDAwMDAwMDFcIiAgICAgICAgKCogZG8gbm90IHBpY2sgdGhpcyBvbmUtLWp1bmsgYXQgdGhlIGVuZCAqKVxuICAgICAjIHNwcmludGYgXCIlLjE3Z1wiIDkuOTkyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOS45OTIwMDAwMDAwMDAwMDA5XCJcbiAgIHZ9XG4qKVxubGV0IHRvX3N0cmluZyB4ID1cbiAgdmFsaWRfZmxvYXRfbGV4ZW1cbiAgICAobGV0IHkgPSBmb3JtYXRfZmxvYXQgXCIlLjE1Z1wiIHggaW5cbiAgICAgaWYgZmxvYXRfb2Zfc3RyaW5nIHkgPSB4IHRoZW4geSBlbHNlIGZvcm1hdF9mbG9hdCBcIiUuMTdnXCIgeClcbjs7XG5cbmxldCBtYXhfdmFsdWUgPSBpbmZpbml0eVxubGV0IG1pbl92YWx1ZSA9IG5lZ19pbmZpbml0eVxubGV0IG1pbl9wb3NpdGl2ZV9zdWJub3JtYWxfdmFsdWUgPSAyLiAqKiAtMTA3NC5cbmxldCBtaW5fcG9zaXRpdmVfbm9ybWFsX3ZhbHVlID0gMi4gKiogLTEwMjIuXG5sZXQgemVybyA9IDAuXG5sZXQgb25lID0gMS5cbmxldCBtaW51c19vbmUgPSAtMS5cbmxldCBwaSA9IDB4My4yNDNGNkE4ODg1QTMwOEQzMTMxOThBMkUwMzcwNzNcbmxldCBzcXJ0X3BpID0gMHgxLkM1QkY4OTFCNEVGNkFBNzlDM0IwNTIwRDVEQjkzOFxubGV0IHNxcnRfMnBpID0gMHgyLjgxQjI2M0ZFQzRFMEIyQ0FGOTQ4M0Y1Q0U0NTlEQ1xubGV0IGV1bGVyID0gMHgwLjkzQzQ2N0UzN0RCMEM3QTREMUJFM0Y4MTAxNTJDQlxubGV0IG9mX2ludCA9IEludC50b19mbG9hdFxubGV0IHRvX2ludCA9IEludC5vZl9mbG9hdFxubGV0IG9mX2ludDYzIGkgPSBJbnQ2My50b19mbG9hdCBpXG5sZXQgb2ZfaW50NjQgaSA9IENhbWwuSW50NjQudG9fZmxvYXQgaVxubGV0IHRvX2ludDY0ID0gQ2FtbC5JbnQ2NC5vZl9mbG9hdFxubGV0IGlyb3VuZF9sYm91bmQgPSBsb3dlcl9ib3VuZF9mb3JfaW50IEludC5udW1fYml0c1xubGV0IGlyb3VuZF91Ym91bmQgPSB1cHBlcl9ib3VuZF9mb3JfaW50IEludC5udW1fYml0c1xuXG4oKiBUaGUgcGVyZm9ybWFuY2Ugb2YgdGhlIFwiZXhuXCIgcm91bmRpbmcgZnVuY3Rpb25zIGlzIGltcG9ydGFudCwgc28gdGhleSBhcmUgd3JpdHRlblxuICAgb3V0IHNlcGFyYXRlbHksIGFuZCB0dW5lZCBpbmRpdmlkdWFsbHkuICAoV2UgY291bGQgaGF2ZSB0aGUgb3B0aW9uIHZlcnNpb25zIGNhbGxcbiAgIHRoZSBcImV4blwiIHZlcnNpb25zLCBidXQgdGhhdCBpbXBvc2VzIGFyZ3VhYmx5IGdyYXR1aXRvdXMgb3ZlcmhlYWQtLS1lc3BlY2lhbGx5XG4gICBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBvZiBiYWNrdHJhY2VzIGlzIGVuYWJsZWQgdXBvbiBcIndpdGhcIi0tLWFuZCB0aGF0IHNlZW1zXG4gICBub3Qgd29ydGggaXQgd2hlbiBjb21wYXJlZCB0byB0aGUgcmVsYXRpdmVseSBzbWFsbCBhbW91bnQgb2YgY29kZSBkdXBsaWNhdGlvbi4pICopXG5cbigqIEVycm9yIHJlcG9ydGluZyBiZWxvdyBpcyB2ZXJ5IGNhcmVmdWxseSBhcnJhbmdlZCBzbyB0aGF0LCBlLmcuLCBbaXJvdW5kX25lYXJlc3RfZXhuXVxuICAgaXRzZWxmIGNhbiBiZSBpbmxpbmVkIGludG8gY2FsbGVycyBzdWNoIHRoYXQgdGhleSBkb24ndCBuZWVkIHRvIGFsbG9jYXRlIGEgYm94IGZvciB0aGVcbiAgIFtmbG9hdF0gYXJndW1lbnQuICBUaGlzIGlzIGRvbmUgd2l0aCBhIGJveCBbYm94XSBmdW5jdGlvbiBjYXJlZnVsbHkgY2hvc2VuIHRvIGFsbG93IHRoZVxuICAgY29tcGlsZXIgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYm94IGZvciB0aGUgZmxvYXQgb25seSBpbiBlcnJvciBjYXNlcy4gIFNlZSwgZS5nLixcbiAgIFsuLi8uLi96ZXJvL3Rlc3QvcHJpY2VfdGVzdC5tbF0gZm9yIGEgbWVjaGFuaWNhbCB0ZXN0IG9mIHRoaXMgcHJvcGVydHkgd2hlbiBidWlsZGluZ1xuICAgd2l0aCBbWF9MSUJSQVJZX0lOTElOSU5HPXRydWVdLiAqKVxuXG5sZXQgaXJvdW5kX3VwIHQgPVxuICBpZiB0ID4gMC4wXG4gIHRoZW4gKFxuICAgIGxldCB0JyA9IGNlaWwgdCBpblxuICAgIGlmIHQnIDw9IGlyb3VuZF91Ym91bmQgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnKSBlbHNlIE5vbmUpXG4gIGVsc2UgaWYgdCA+PSBpcm91bmRfbGJvdW5kXG4gIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0KVxuICBlbHNlIE5vbmVcbjs7XG5cbmxldFtAb2NhbWwuaW5saW5lIGFsd2F5c10gaXJvdW5kX3VwX2V4biB0ID1cbiAgaWYgdCA+IDAuMFxuICB0aGVuIChcbiAgICBsZXQgdCcgPSBjZWlsIHQgaW5cbiAgICBpZiB0JyA8PSBpcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfdXBfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiIChib3ggdCkgKCkpXG4gIGVsc2UgaWYgdCA+PSBpcm91bmRfbGJvdW5kXG4gIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX3VwX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCIgKGJveCB0KSAoKVxuOztcblxubGV0IGlyb3VuZF9kb3duIHQgPVxuICBpZiB0ID49IDAuMFxuICB0aGVuIGlmIHQgPD0gaXJvdW5kX3Vib3VuZCB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCkgZWxzZSBOb25lXG4gIGVsc2UgKFxuICAgIGxldCB0JyA9IGZsb29yIHQgaW5cbiAgICBpZiB0JyA+PSBpcm91bmRfbGJvdW5kIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0JykgZWxzZSBOb25lKVxuOztcblxubGV0W0BvY2FtbC5pbmxpbmUgYWx3YXlzXSBpcm91bmRfZG93bl9leG4gdCA9XG4gIGlmIHQgPj0gMC4wXG4gIHRoZW5cbiAgICBpZiB0IDw9IGlyb3VuZF91Ym91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICAgIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX2Rvd25fZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiIChib3ggdCkgKClcbiAgZWxzZSAoXG4gICAgbGV0IHQnID0gZmxvb3IgdCBpblxuICAgIGlmIHQnID49IGlyb3VuZF9sYm91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlXG4gICAgICBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfZG93bl9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiIChib3ggdCkgKCkpXG47O1xuXG5sZXQgaXJvdW5kX3Rvd2FyZHNfemVybyB0ID1cbiAgaWYgdCA+PSBpcm91bmRfbGJvdW5kICYmIHQgPD0gaXJvdW5kX3Vib3VuZFxuICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdClcbiAgZWxzZSBOb25lXG47O1xuXG5sZXRbQG9jYW1sLmlubGluZSBhbHdheXNdIGlyb3VuZF90b3dhcmRzX3plcm9fZXhuIHQgPVxuICBpZiB0ID49IGlyb3VuZF9sYm91bmQgJiYgdCA8PSBpcm91bmRfdWJvdW5kXG4gIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gIGVsc2VcbiAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgIFwiRmxvYXQuaXJvdW5kX3Rvd2FyZHNfemVyb19leG46IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoYm94IHQpXG4gICAgICAoKVxuOztcblxuKCogT3V0c2lkZSBvZiB0aGUgcmFuZ2UgKHJvdW5kX25lYXJlc3RfbGIuLnJvdW5kX25lYXJlc3RfdWIpLCBhbGwgcmVwcmVzZW50YWJsZSBkb3VibGVzXG4gICBhcmUgaW50ZWdlcnMgaW4gdGhlIG1hdGhlbWF0aWNhbCBzZW5zZSwgYW5kIFtyb3VuZF9uZWFyZXN0XSBzaG91bGQgYmUgaWRlbnRpdHkuXG5cbiAgIEhvd2V2ZXIsIGZvciBvZGQgbnVtYmVycyB3aXRoIHRoZSBhYnNvbHV0ZSB2YWx1ZSBiZXR3ZWVuIDIqKjUyIGFuZCAyKio1MywgdGhlIGZvcm11bGFcbiAgIFtyb3VuZF9uZWFyZXN0IHggPSBmbG9vciAoeCArIDAuNSldIGRvZXMgbm90IGhvbGQ6XG5cbiAgIHt2XG4gICAgICMgbGV0IG5haXZlX3JvdW5kX25lYXJlc3QgeCA9IGZsb29yICh4ICsuIDAuNSk7O1xuICAgICAjIGxldCB4ID0gMi4gKiogNTIuICsuIDEuOztcbiAgICAgdmFsIHggOiBmbG9hdCA9IDQ1MDM1OTk2MjczNzA0OTcuXG4gICAgICMgbmFpdmVfcm91bmRfbmVhcmVzdCB4OztcbiAgICAgLSA6ICAgICBmbG9hdCA9IDQ1MDM1OTk2MjczNzA0OTguXG4gICB2fVxuKilcblxubGV0IHJvdW5kX25lYXJlc3RfbGIgPSAtLigyLiAqKiA1Mi4pXG5sZXQgcm91bmRfbmVhcmVzdF91YiA9IDIuICoqIDUyLlxuXG4oKiBGb3IgW3ggPSBvbmVfdWxwIGBEb3duIDAuNV0sIHRoZSBmb3JtdWxhIFtmbG9vciAoeCArLiAwLjUpXSBmb3Igcm91bmRpbmcgdG8gbmVhcmVzdFxuICAgZG9lcyBub3Qgd29yaywgYmVjYXVzZSB0aGUgZXhhY3QgcmVzdWx0IGlzIGhhbGZ3YXkgYmV0d2VlbiBbb25lX3VscCBgRG93biAxLl0gYW5kIFsxLl0sXG4gICBhbmQgaXQgZ2V0cyByb3VuZGVkIHVwIHRvIFsxLl0gZHVlIHRvIHRoZSByb3VuZC10aWVzLXRvLWV2ZW4gcnVsZS4gKilcbmxldCBvbmVfdWxwX2xlc3NfdGhhbl9oYWxmID0gb25lX3VscCBgRG93biAwLjVcblxubGV0W0BvY2FtbC5pbmxpbmUgYWx3YXlzXSBhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0ID1cbiAgdFxuICArLlxuICBpZiB0ID0gb25lX3VscF9sZXNzX3RoYW5faGFsZlxuICB0aGVuIG9uZV91bHBfbGVzc190aGFuX2hhbGYgKCogc2luY2UgdCA8IDAuNSwgbWFrZSBzdXJlIHRoZSByZXN1bHQgaXMgPCAxLjAgKilcbiAgZWxzZSAwLjVcbjs7XG5cbmxldCBpcm91bmRfbmVhcmVzdF8zMiB0ID1cbiAgaWYgdCA+PSAwLlxuICB0aGVuIChcbiAgICBsZXQgdCcgPSBhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0IGluXG4gICAgaWYgdCcgPD0gaXJvdW5kX3Vib3VuZCB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCcpIGVsc2UgTm9uZSlcbiAgZWxzZSAoXG4gICAgbGV0IHQnID0gZmxvb3IgKHQgKy4gMC41KSBpblxuICAgIGlmIHQnID49IGlyb3VuZF9sYm91bmQgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnKSBlbHNlIE5vbmUpXG47O1xuXG5sZXQgaXJvdW5kX25lYXJlc3RfNjQgdCA9XG4gIGlmIHQgPj0gMC5cbiAgdGhlblxuICAgIGlmIHQgPCByb3VuZF9uZWFyZXN0X3ViXG4gICAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIChhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0KSlcbiAgICBlbHNlIGlmIHQgPD0gaXJvdW5kX3Vib3VuZFxuICAgIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0KVxuICAgIGVsc2UgTm9uZVxuICBlbHNlIGlmIHQgPiByb3VuZF9uZWFyZXN0X2xiXG4gIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCAoZmxvb3IgKHQgKy4gMC41KSkpXG4gIGVsc2UgaWYgdCA+PSBpcm91bmRfbGJvdW5kXG4gIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0KVxuICBlbHNlIE5vbmVcbjs7XG5cbmxldCBpcm91bmRfbmVhcmVzdCA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiBpcm91bmRfbmVhcmVzdF82NFxuICB8IFczMiAtPiBpcm91bmRfbmVhcmVzdF8zMlxuOztcblxubGV0IGlyb3VuZF9uZWFyZXN0X2V4bl8zMiB0ID1cbiAgaWYgdCA+PSAwLlxuICB0aGVuIChcbiAgICBsZXQgdCcgPSBhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0IGluXG4gICAgaWYgdCcgPD0gaXJvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX25lYXJlc3RfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiIChib3ggdCkgKCkpXG4gIGVsc2UgKFxuICAgIGxldCB0JyA9IGZsb29yICh0ICsuIDAuNSkgaW5cbiAgICBpZiB0JyA+PSBpcm91bmRfbGJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfbmVhcmVzdF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsXCIgKGJveCB0KSAoKSlcbjs7XG5cbmxldFtAb2NhbWwuaW5saW5lIGFsd2F5c10gaXJvdW5kX25lYXJlc3RfZXhuXzY0IHQgPVxuICBpZiB0ID49IDAuXG4gIHRoZW5cbiAgICBpZiB0IDwgcm91bmRfbmVhcmVzdF91YlxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCAoYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdClcbiAgICBlbHNlIGlmIHQgPD0gaXJvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gICAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfbmVhcmVzdF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCIgKGJveCB0KSAoKVxuICBlbHNlIGlmIHQgPiByb3VuZF9uZWFyZXN0X2xiXG4gIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCAoZmxvb3IgKHQgKy4gMC41KSlcbiAgZWxzZSBpZiB0ID49IGlyb3VuZF9sYm91bmRcbiAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgZWxzZVxuICAgIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9uZWFyZXN0X2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCIgKGJveCB0KSAoKVxuOztcblxubGV0IGlyb3VuZF9uZWFyZXN0X2V4biA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiBpcm91bmRfbmVhcmVzdF9leG5fNjRcbiAgfCBXMzIgLT4gaXJvdW5kX25lYXJlc3RfZXhuXzMyXG47O1xuXG4oKiBUaGUgZm9sbG93aW5nIFtpcm91bmRfZXhuXSBhbmQgW2lyb3VuZF0gZnVuY3Rpb25zIGFyZSBzbG93ZXIgdGhhbiB0aGUgb25lcyBhYm92ZS5cbiAgIFRoZWlyIGVxdWl2YWxlbmNlIHRvIHRob3NlIGZ1bmN0aW9ucyBpcyB0ZXN0ZWQgaW4gdGhlIHVuaXQgdGVzdHMgYmVsb3cuICopXG5cbmxldFtAaW5saW5lXSBpcm91bmRfZXhuID8oZGlyID0gYE5lYXJlc3QpIHQgPVxuICBtYXRjaCBkaXIgd2l0aFxuICB8IGBaZXJvIC0+IGlyb3VuZF90b3dhcmRzX3plcm9fZXhuIHRcbiAgfCBgTmVhcmVzdCAtPiBpcm91bmRfbmVhcmVzdF9leG4gdFxuICB8IGBVcCAtPiBpcm91bmRfdXBfZXhuIHRcbiAgfCBgRG93biAtPiBpcm91bmRfZG93bl9leG4gdFxuOztcblxubGV0IGlyb3VuZCA/KGRpciA9IGBOZWFyZXN0KSB0ID1cbiAgdHJ5IFNvbWUgKGlyb3VuZF9leG4gfmRpciB0KSB3aXRoXG4gIHwgXyAtPiBOb25lXG47O1xuXG5sZXQgaXNfaW5mIHQgPSAxLiAvLiB0ID0gMC5cbmxldCBpc19maW5pdGUgdCA9IHQgLS4gdCA9IDAuXG5cbmxldCBtaW5faW5hbiAoeCA6IHQpIHkgPVxuICBpZiBpc19uYW4geSB0aGVuIHggZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSBpZiB4IDwgeSB0aGVuIHggZWxzZSB5XG47O1xuXG5sZXQgbWF4X2luYW4gKHggOiB0KSB5ID1cbiAgaWYgaXNfbmFuIHkgdGhlbiB4IGVsc2UgaWYgaXNfbmFuIHggdGhlbiB5IGVsc2UgaWYgeCA+IHkgdGhlbiB4IGVsc2UgeVxuOztcblxubGV0IGFkZCA9ICggKy4gKVxubGV0IHN1YiA9ICggLS4gKVxubGV0IG5lZyA9ICggfi0uIClcbmxldCBhYnMgPSBhYnNfZmxvYXRcbmxldCBzY2FsZSA9ICggKi4gKVxubGV0IHNxdWFyZSB4ID0geCAqLiB4XG5cbm1vZHVsZSBQYXJ0cyA6IHNpZ1xuICB0eXBlIHRcblxuICB2YWwgZnJhY3Rpb25hbCA6IHQgLT4gZmxvYXRcbiAgdmFsIGludGVncmFsIDogdCAtPiBmbG9hdFxuICB2YWwgbW9kZiA6IGZsb2F0IC0+IHRcbmVuZCA9IHN0cnVjdFxuICB0eXBlIHQgPSBmbG9hdCAqIGZsb2F0XG5cbiAgbGV0IGZyYWN0aW9uYWwgdCA9IGZzdCB0XG4gIGxldCBpbnRlZ3JhbCB0ID0gc25kIHRcbiAgbGV0IG1vZGYgPSBtb2RmXG5lbmRcblxubGV0IG1vZGYgPSBQYXJ0cy5tb2RmXG5sZXQgcm91bmRfZG93biA9IGZsb29yXG5sZXQgcm91bmRfdXAgPSBjZWlsXG5sZXQgcm91bmRfdG93YXJkc196ZXJvIHQgPSBpZiB0ID49IDAuIHRoZW4gcm91bmRfZG93biB0IGVsc2Ugcm91bmRfdXAgdFxuXG4oKiBzZWUgdGhlIGNvbW1lbnQgYWJvdmUgW3JvdW5kX25lYXJlc3RfbGJdIGFuZCBbcm91bmRfbmVhcmVzdF91Yl0gZm9yIGFuIGV4cGxhbmF0aW9uICopXG5sZXRbQG9jYW1sLmlubGluZV0gcm91bmRfbmVhcmVzdF9pbmxpbmUgdCA9XG4gIGlmIHQgPiByb3VuZF9uZWFyZXN0X2xiICYmIHQgPCByb3VuZF9uZWFyZXN0X3ViXG4gIHRoZW4gZmxvb3IgKGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQpXG4gIGVsc2UgdCArLiAwLlxuOztcblxubGV0IHJvdW5kX25lYXJlc3QgdCA9IChyb3VuZF9uZWFyZXN0X2lubGluZSBbQG9jYW1sLmlubGluZWQgYWx3YXlzXSkgdFxuXG5sZXQgcm91bmRfbmVhcmVzdF9oYWxmX3RvX2V2ZW4gdCA9XG4gIGlmIHQgPD0gcm91bmRfbmVhcmVzdF9sYiB8fCB0ID49IHJvdW5kX25lYXJlc3RfdWJcbiAgdGhlbiB0ICsuIDAuXG4gIGVsc2UgKFxuICAgIGxldCBmbG9vciA9IGZsb29yIHQgaW5cbiAgICAoKiBbY2VpbF9vcl9zdWNjID0gaWYgdCBpcyBhbiBpbnRlZ2VyIHRoZW4gdCArLiAxLiBlbHNlIGNlaWwgdF0uICBGYXN0ZXIgdGhhbiBbY2VpbF0uICopXG4gICAgbGV0IGNlaWxfb3Jfc3VjYyA9IGZsb29yICsuIDEuIGluXG4gICAgbGV0IGRpZmZfZmxvb3IgPSB0IC0uIGZsb29yIGluXG4gICAgbGV0IGRpZmZfY2VpbCA9IGNlaWxfb3Jfc3VjYyAtLiB0IGluXG4gICAgaWYgZGlmZl9mbG9vciA8IGRpZmZfY2VpbFxuICAgIHRoZW4gZmxvb3JcbiAgICBlbHNlIGlmIGRpZmZfZmxvb3IgPiBkaWZmX2NlaWxcbiAgICB0aGVuIGNlaWxfb3Jfc3VjY1xuICAgIGVsc2UgaWYgKCogZXhhY3QgdGllLCBwaWNrIHRoZSBldmVuICopXG4gICAgICBtb2RfZmxvYXQgZmxvb3IgMi4gPSAwLlxuICAgIHRoZW4gZmxvb3JcbiAgICBlbHNlIGNlaWxfb3Jfc3VjYylcbjs7XG5cbmxldCBpbnQ2M19yb3VuZF9sYm91bmQgPSBsb3dlcl9ib3VuZF9mb3JfaW50IEludDYzLm51bV9iaXRzXG5sZXQgaW50NjNfcm91bmRfdWJvdW5kID0gdXBwZXJfYm91bmRfZm9yX2ludCBJbnQ2My5udW1fYml0c1xuXG5sZXQgaW50NjNfcm91bmRfdXBfZXhuIHQgPVxuICBpZiB0ID4gMC4wXG4gIHRoZW4gKFxuICAgIGxldCB0JyA9IGNlaWwgdCBpblxuICAgIGlmIHQnIDw9IGludDYzX3JvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZVxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfdXBfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiXG4gICAgICAgIChGbG9hdDAuYm94IHQpXG4gICAgICAgICgpKVxuICBlbHNlIGlmIHQgPj0gaW50NjNfcm91bmRfbGJvdW5kXG4gIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgZWxzZVxuICAgIGludmFsaWRfYXJnZlxuICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF91cF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCB0KVxuICAgICAgKClcbjs7XG5cbmxldCBpbnQ2M19yb3VuZF9kb3duX2V4biB0ID1cbiAgaWYgdCA+PSAwLjBcbiAgdGhlblxuICAgIGlmIHQgPD0gaW50NjNfcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICAgIGVsc2VcbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIkZsb2F0LmludDYzX3JvdW5kX2Rvd25fZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiXG4gICAgICAgIChGbG9hdDAuYm94IHQpXG4gICAgICAgICgpXG4gIGVsc2UgKFxuICAgIGxldCB0JyA9IGZsb29yIHQgaW5cbiAgICBpZiB0JyA+PSBpbnQ2M19yb3VuZF9sYm91bmRcbiAgICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2VcbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIkZsb2F0LmludDYzX3JvdW5kX2Rvd25fZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIlxuICAgICAgICAoRmxvYXQwLmJveCB0KVxuICAgICAgICAoKSlcbjs7XG5cbmxldCBpbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4biB0MCA9XG4gIGxldCB0ID0gKHJvdW5kX25lYXJlc3RfaW5saW5lIFtAb2NhbWwuaW5saW5lZCBhbHdheXNdKSB0MCBpblxuICBpZiB0ID4gMC5cbiAgdGhlblxuICAgIGlmIHQgPD0gaW50NjNfcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICAgIGVsc2VcbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIkZsb2F0LmludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiXG4gICAgICAgIChib3ggdDApXG4gICAgICAgICgpXG4gIGVsc2UgaWYgdCA+PSBpbnQ2M19yb3VuZF9sYm91bmRcbiAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICBlbHNlXG4gICAgaW52YWxpZF9hcmdmXG4gICAgICBcIkZsb2F0LmludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIlxuICAgICAgKGJveCB0MClcbiAgICAgICgpXG47O1xuXG5sZXQgaW50NjNfcm91bmRfbmVhcmVzdF9hcmNoNjRfbm9hbGxvY19leG4gZiA9IEludDYzLm9mX2ludCAoaXJvdW5kX25lYXJlc3RfZXhuIGYpXG5cbmxldCBpbnQ2M19yb3VuZF9uZWFyZXN0X2V4biA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiBpbnQ2M19yb3VuZF9uZWFyZXN0X2FyY2g2NF9ub2FsbG9jX2V4blxuICB8IFczMiAtPiBpbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4blxuOztcblxubGV0IHJvdW5kID8oZGlyID0gYE5lYXJlc3QpIHQgPVxuICBtYXRjaCBkaXIgd2l0aFxuICB8IGBOZWFyZXN0IC0+IHJvdW5kX25lYXJlc3QgdFxuICB8IGBEb3duIC0+IHJvdW5kX2Rvd24gdFxuICB8IGBVcCAtPiByb3VuZF91cCB0XG4gIHwgYFplcm8gLT4gcm91bmRfdG93YXJkc196ZXJvIHRcbjs7XG5cbm1vZHVsZSBDbGFzcyA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgSW5maW5pdGVcbiAgICB8IE5hblxuICAgIHwgTm9ybWFsXG4gICAgfCBTdWJub3JtYWxcbiAgICB8IFplcm9cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVudW1lcmF0ZSwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcbiAgbGV0IGFsbCA9IChbIEluZmluaXRlOyBOYW47IE5vcm1hbDsgU3Vibm9ybWFsOyBaZXJvIF0gOiB0IGxpc3QpXG5cbiAgbGV0IHRfb2Zfc2V4cCA9XG4gICAgKGxldCBlcnJvcl9zb3VyY2VfXzAwNl8gPSBcImZsb2F0Lm1sLkNsYXNzLnRcIiBpblxuICAgICBmdW5jdGlvblxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJpbmZpbml0ZVwiIHwgXCJJbmZpbml0ZVwiKSAtPiBJbmZpbml0ZVxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJuYW5cIiB8IFwiTmFuXCIpIC0+IE5hblxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJub3JtYWxcIiB8IFwiTm9ybWFsXCIpIC0+IE5vcm1hbFxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJzdWJub3JtYWxcIiB8IFwiU3Vibm9ybWFsXCIpIC0+IFN1Ym5vcm1hbFxuICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgLT4gWmVyb1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImluZmluaXRlXCIgfCBcIkluZmluaXRlXCIpIDo6IF8pIGFzXG4gICAgICAgc2V4cF9fMDA3XyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibmFuXCIgfCBcIk5hblwiKSA6OiBfKSBhcyBzZXhwX18wMDdfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5vcm1hbFwiIHwgXCJOb3JtYWxcIikgOjogXykgYXMgc2V4cF9fMDA3XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJzdWJub3JtYWxcIiB8IFwiU3Vibm9ybWFsXCIpIDo6IF8pIGFzXG4gICAgICAgc2V4cF9fMDA3XyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIDo6IF8pIGFzIHNleHBfXzAwN18gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDVfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwNV8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuICAgICB8IHNleHBfXzAwNV8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG4gICAgICAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgOztcblxuICBsZXQgc2V4cF9vZl90ID1cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgSW5maW5pdGUgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiSW5maW5pdGVcIlxuICAgICAgfCBOYW4gLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTmFuXCJcbiAgICAgIHwgTm9ybWFsIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIk5vcm1hbFwiXG4gICAgICB8IFN1Ym5vcm1hbCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJTdWJub3JtYWxcIlxuICAgICAgfCBaZXJvIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlplcm9cIlxuICAgICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICB7IHVudHlwZWQgPVxuICAgICAgICBWYXJpYW50XG4gICAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgIFsgTm9fdGFnIHsgbmFtZSA9IFwiSW5maW5pdGVcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiTmFuXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIk5vcm1hbFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJTdWJub3JtYWxcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiWmVyb1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICB9XG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBsZXQgdG9fc3RyaW5nIHQgPSBzdHJpbmdfb2Zfc2V4cCAoc2V4cF9vZl90IHQpXG4gIGxldCBvZl9zdHJpbmcgcyA9IHRfb2Zfc2V4cCAoc2V4cF9vZl9zdHJpbmcgcylcbmVuZFxuXG5sZXQgY2xhc3NpZnkgdCA9XG4gIGxldCBtb2R1bGUgQyA9IENsYXNzIGluXG4gIG1hdGNoIGNsYXNzaWZ5X2Zsb2F0IHQgd2l0aFxuICB8IEZQX25vcm1hbCAtPiBDLk5vcm1hbFxuICB8IEZQX3N1Ym5vcm1hbCAtPiBDLlN1Ym5vcm1hbFxuICB8IEZQX3plcm8gLT4gQy5aZXJvXG4gIHwgRlBfaW5maW5pdGUgLT4gQy5JbmZpbml0ZVxuICB8IEZQX25hbiAtPiBDLk5hblxuOztcblxubGV0IGluc2VydF91bmRlcnNjb3JlcyA/KGRlbGltaXRlciA9ICdfJykgPyhzdHJpcF96ZXJvID0gZmFsc2UpIHN0cmluZyA9XG4gIG1hdGNoIFN0cmluZy5sc3BsaXQyIHN0cmluZyB+b246Jy4nIHdpdGhcbiAgfCBOb25lIC0+IEludF9jb252ZXJzaW9ucy5pbnNlcnRfZGVsaW1pdGVyIHN0cmluZyB+ZGVsaW1pdGVyXG4gIHwgU29tZSAobGVmdCwgcmlnaHQpIC0+XG4gICAgbGV0IGxlZnQgPSBJbnRfY29udmVyc2lvbnMuaW5zZXJ0X2RlbGltaXRlciBsZWZ0IH5kZWxpbWl0ZXIgaW5cbiAgICBsZXQgcmlnaHQgPVxuICAgICAgaWYgc3RyaXBfemVybyB0aGVuIFN0cmluZy5yc3RyaXAgcmlnaHQgfmRyb3A6KGZ1biBjIC0+IENoYXIuKCA9ICkgYyAnMCcpIGVsc2UgcmlnaHRcbiAgICBpblxuICAgIChtYXRjaCByaWdodCB3aXRoXG4gICAgIHwgXCJcIiAtPiBsZWZ0XG4gICAgIHwgXyAtPiBsZWZ0IF4gXCIuXCIgXiByaWdodClcbjs7XG5cbmxldCB0b19zdHJpbmdfaHVtID9kZWxpbWl0ZXIgPyhkZWNpbWFscyA9IDMpID9zdHJpcF96ZXJvID8oZXhwbGljaXRfcGx1cyA9IGZhbHNlKSBmID1cbiAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSBkZWNpbWFscyAwXG4gIHRoZW4gaW52YWxpZF9hcmdmIFwidG9fc3RyaW5nX2h1bTogaW52YWxpZCBhcmd1bWVudCB+ZGVjaW1hbHM9JWRcIiBkZWNpbWFscyAoKTtcbiAgbWF0Y2ggY2xhc3NpZnkgZiB3aXRoXG4gIHwgQ2xhc3MuSW5maW5pdGUgLT4gaWYgZiA+IDAuIHRoZW4gXCJpbmZcIiBlbHNlIFwiLWluZlwiXG4gIHwgQ2xhc3MuTmFuIC0+IFwibmFuXCJcbiAgfCBDbGFzcy5Ob3JtYWwgfCBDbGFzcy5TdWJub3JtYWwgfCBDbGFzcy5aZXJvIC0+XG4gICAgbGV0IHMgPVxuICAgICAgaWYgZXhwbGljaXRfcGx1cyB0aGVuIHNwcmludGYgXCIlKy4qZlwiIGRlY2ltYWxzIGYgZWxzZSBzcHJpbnRmIFwiJS4qZlwiIGRlY2ltYWxzIGZcbiAgICBpblxuICAgIGluc2VydF91bmRlcnNjb3JlcyBzID9kZWxpbWl0ZXIgP3N0cmlwX3plcm9cbjs7XG5cbmxldCBzZXhwX29mX3QgdCA9XG4gIGxldCBzZXhwID0gc2V4cF9vZl90IHQgaW5cbiAgbWF0Y2ggIVNleHAub2ZfZmxvYXRfc3R5bGUgd2l0aFxuICB8IGBOb191bmRlcnNjb3JlcyAtPiBzZXhwXG4gIHwgYFVuZGVyc2NvcmVzIC0+XG4gICAgKG1hdGNoIHNleHAgd2l0aFxuICAgICB8IExpc3QgXyAtPlxuICAgICAgIHJhaXNlX3NcbiAgICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgIFwiW3NleHBfb2ZfZmxvYXRdIHByb2R1Y2VkIHN0cmFuZ2Ugc2V4cFwiXG4gICAgICAgICAgICBbIFwic2V4cFwiLCBTZXhwLnNleHBfb2ZfdCBzZXhwIF0pXG4gICAgIHwgQXRvbSBzdHJpbmcgLT5cbiAgICAgICBpZiBTdHJpbmcuY29udGFpbnMgc3RyaW5nICdFJyB0aGVuIHNleHAgZWxzZSBBdG9tIChpbnNlcnRfdW5kZXJzY29yZXMgc3RyaW5nKSlcbjs7XG5cbmxldCB0b19wYWRkZWRfY29tcGFjdF9zdHJpbmdfY3VzdG9tIHQgPyhwcmVmaXggPSBcIlwiKSB+a2lsbyB+bWVnYSB+Z2lnYSB+dGVyYSA/cGV0YSAoKSA9XG4gICgqIFJvdW5kIGEgcmF0aW8gdG93YXJkIHRoZSBuZWFyZXN0IGludGVnZXIsIHJlc29sdmluZyB0aWVzIHRvd2FyZCB0aGUgbmVhcmVzdCBldmVuXG4gICAgIG51bWJlci4gIEZvciBzYW5lIGlucHV0cyAoaW4gcGFydGljdWxhciwgd2hlbiBbZGVub21pbmF0b3JdIGlzIGFuIGludGVnZXIgYW5kXG4gICAgIFthYnMgbnVtZXJhdG9yIDwgMmU1Ml0pIHRoaXMgc2hvdWxkIGJlIGFjY3VyYXRlLiAgT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG1pZ2h0IGJlIGFcbiAgICAgbGl0dGxlIGJpdCBvZmYsIGJ1dCB3ZSBkb24ndCByZWFsbHkgdXNlIHRoYXQgY2FzZS4gKilcbiAgbGV0IGlyb3VuZF9yYXRpb19leG4gfm51bWVyYXRvciB+ZGVub21pbmF0b3IgPVxuICAgIGxldCBrID0gZmxvb3IgKG51bWVyYXRvciAvLiBkZW5vbWluYXRvcikgaW5cbiAgICAoKiBpZiBbYWJzIGsgPCAyZTUzXSwgdGhlbiBib3RoIFtrXSBhbmQgW2sgKy4gMS5dIGFyZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkLCBhbmQgaW5cbiAgICAgICBwYXJ0aWN1bGFyIFtrICsuIDEuID4ga10uICBJZiBbZGVub21pbmF0b3JdIGlzIGFsc28gYW4gaW50ZWdlciwgYW5kXG4gICAgICAgW2FicyAoZGVub21pbmF0b3IgKi4gKGsgKy4gMSkpIDwgMmU1M10gKGFuZCBpbiBzb21lIG90aGVyIGNhc2VzLCB0b28pLCB0aGVuIFtsb3dlcl1cbiAgICAgICBhbmQgW2hpZ2hlcl0gYXJlIGFjdHVhbGx5IGJvdGggYWNjdXJhdGUuICBTaW5jZSAocm91Z2hseSlcbiAgICAgICBbbnVtZXJhdG9yID0gZGVub21pbmF0b3IgKi4ga10gdGhlbiBmb3IgW2FicyBudW1lcmF0b3IgPCAyZTUyXSB3ZSBzaG91bGQgYmVcbiAgICAgICBmaW5lLiAqKVxuICAgIGxldCBsb3dlciA9IGRlbm9taW5hdG9yICouIGsgaW5cbiAgICBsZXQgaGlnaGVyID0gZGVub21pbmF0b3IgKi4gKGsgKy4gMS4pIGluXG4gICAgKCogU3VidHJhY3RpbmcgbnVtYmVycyB3aXRoaW4gYSBmYWN0b3Igb2YgdHdvIGZyb20gZWFjaCBvdGhlciBpcyBhY2N1cmF0ZS5cbiAgICAgICBTbyBlaXRoZXIgdGhlIHR3byBzdWJ0cmFjdGlvbnMgYmVsb3cgYXJlIGFjY3VyYXRlLCBvciBrID0gMCwgb3IgayA9IC0xLlxuICAgICAgIEluIGNhc2Ugb2YgYSB0aWUsIHJvdW5kIHRvIGV2ZW4uICopXG4gICAgbGV0IGRpZmZfcmlnaHQgPSBoaWdoZXIgLS4gbnVtZXJhdG9yIGluXG4gICAgbGV0IGRpZmZfbGVmdCA9IG51bWVyYXRvciAtLiBsb3dlciBpblxuICAgIGxldCBrID0gaXJvdW5kX25lYXJlc3RfZXhuIGsgaW5cbiAgICBpZiBkaWZmX3JpZ2h0IDwgZGlmZl9sZWZ0XG4gICAgdGhlbiBrICsgMVxuICAgIGVsc2UgaWYgZGlmZl9yaWdodCA+IGRpZmZfbGVmdFxuICAgIHRoZW4ga1xuICAgIGVsc2UgaWYgKCogYSB0aWUgKilcbiAgICAgIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA9ICkgKGsgbW9kIDIpIDBcbiAgICB0aGVuIGtcbiAgICBlbHNlIGsgKyAxXG4gIGluXG4gIG1hdGNoIGNsYXNzaWZ5IHQgd2l0aFxuICB8IENsYXNzLkluZmluaXRlIC0+IGlmIHQgPCAwLjAgdGhlbiBcIi1pbmYgIFwiIGVsc2UgXCJpbmYgIFwiXG4gIHwgQ2xhc3MuTmFuIC0+IFwibmFuICBcIlxuICB8IENsYXNzLlN1Ym5vcm1hbCB8IENsYXNzLk5vcm1hbCB8IENsYXNzLlplcm8gLT5cbiAgICBsZXQgZ28gdCA9XG4gICAgICBsZXQgY29udl9vbmUgdCA9XG4gICAgICAgIGFzc2VydCAoMC4gPD0gdCAmJiB0IDwgOTk5Ljk1KTtcbiAgICAgICAgbGV0IHggPSBwcmVmaXggXiBmb3JtYXRfZmxvYXQgXCIlLjFmXCIgdCBpblxuICAgICAgICAoKiBGaXggdGhlIFwiLjBcIiBzdWZmaXggKilcbiAgICAgICAgaWYgU3RyaW5nLmlzX3N1ZmZpeCB4IH5zdWZmaXg6XCIuMFwiXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCB4ID0gQnl0ZXMub2Zfc3RyaW5nIHggaW5cbiAgICAgICAgICBsZXQgbiA9IEJ5dGVzLmxlbmd0aCB4IGluXG4gICAgICAgICAgQnl0ZXMuc2V0IHggKG4gLSAxKSAnICc7XG4gICAgICAgICAgQnl0ZXMuc2V0IHggKG4gLSAyKSAnICc7XG4gICAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp4KVxuICAgICAgICBlbHNlIHhcbiAgICAgIGluXG4gICAgICBsZXQgY29udiBtYWcgdCBkZW5vbWluYXRvciA9XG4gICAgICAgIGFzc2VydCAoXG4gICAgICAgICAgKGRlbm9taW5hdG9yID0gMTAwLiAmJiB0ID49IDk5OS45NSlcbiAgICAgICAgICB8fCAoZGVub21pbmF0b3IgPj0gMTAwXzAwMC4gJiYgdCA+PSByb3VuZF9uZWFyZXN0IChkZW5vbWluYXRvciAqLiA5Ljk5OV81KSkpO1xuICAgICAgICBhc3NlcnQgKHQgPCByb3VuZF9uZWFyZXN0IChkZW5vbWluYXRvciAqLiA5Xzk5OS41KSk7XG4gICAgICAgIGxldCBpLCBkID1cbiAgICAgICAgICBsZXQgayA9IGlyb3VuZF9yYXRpb19leG4gfm51bWVyYXRvcjp0IH5kZW5vbWluYXRvciBpblxuICAgICAgICAgICgqIFttb2RdIGlzIG9rYXkgaGVyZSBiZWNhdXNlIHdlIGtub3cgaSA+PSAwLiAqKVxuICAgICAgICAgIGsgLyAxMCwgayBtb2QgMTBcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgICAgICBhc3NlcnQgKDAgPD0gaSAmJiBpIDwgMTAwMCk7XG4gICAgICAgIGFzc2VydCAoMCA8PSBkICYmIGQgPCAxMCk7XG4gICAgICAgIGlmIGQgPSAwXG4gICAgICAgIHRoZW4gc3ByaW50ZiBcIiVzJWQlcyBcIiBwcmVmaXggaSBtYWdcbiAgICAgICAgZWxzZSBzcHJpbnRmIFwiJXMlZCVzJWRcIiBwcmVmaXggaSBtYWcgZFxuICAgICAgaW5cbiAgICAgICgqIFdoaWxlIHRoZSBzdGFuZGFyZCBtZXRyaWMgcHJlZml4ZXMgKGUuZy4gY2FwaXRhbCBcIk1cIiByYXRoZXIgdGhhbiBcIm1cIiwgWzFdKSBhcmVcbiAgICAgICAgIG5vbWluYWxseSBtb3JlIGNvcnJlY3QsIHRoaXMgaGluZGVycyByZWFkYWJpbGl0eSBpbiBvdXIgY2FzZS4gIEUuZy4sIDEwRzYgYW5kXG4gICAgICAgICAxMDY2IGxvb2sgdG9vIHNpbWlsYXIuICBUaGF0J3MgYW4gZXh0cmVtZSBleGFtcGxlLCBidXQgaW4gZ2VuZXJhbCBrLG0sZyx0LHBcbiAgICAgICAgIHByb2JhYmx5IHN0YW5kIG91dCBiZXR0ZXIgdGhhbiBLLE0sRyxULFAgd2hlbiBpbnRlcnNwZXJzZWQgd2l0aCBkaWdpdHMuXG5cbiAgICAgICAgIFsxXSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01ldHJpY19wcmVmaXggKilcbiAgICAgICgqIFRoZSB0cmljayBoZXJlIGlzIHRoYXQ6XG4gICAgICAgICAtIHRoZSBmaXJzdCBib3VuZGFyeSAoOTk5Ljk1KSBhcyBhIGZsb2F0IGlzIHNsaWdodGx5IG92ZXItcmVwcmVzZW50ZWQgKHNvIGl0IGlzXG4gICAgICAgICAgIGJldHRlciBhcHByb3hpbWF0ZWQgYXMgXCIxa1wiIHRoYW4gYXMgXCI5OTkuOVwiKSxcbiAgICAgICAgIC0gdGhlIG90aGVyIGJvdW5kYXJpZXMgYXJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQsIGJlY2F1c2UgdGhleSBhcmUgaW50ZWdlcnMuXG4gICAgICAgICAgIFRoYXQncyB3aHkgdGhlIHN0cmljdCBlcXVhbGl0aWVzIGJlbG93IGRvIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiAqKVxuICAgICAgaWYgdCA8IDk5OS45NUUwXG4gICAgICB0aGVuIGNvbnZfb25lIHRcbiAgICAgIGVsc2UgaWYgdCA8IDk5OS45NUUzXG4gICAgICB0aGVuIGNvbnYga2lsbyB0IDEwMC5cbiAgICAgIGVsc2UgaWYgdCA8IDk5OS45NUU2XG4gICAgICB0aGVuIGNvbnYgbWVnYSB0IDEwMF8wMDAuXG4gICAgICBlbHNlIGlmIHQgPCA5OTkuOTVFOVxuICAgICAgdGhlbiBjb252IGdpZ2EgdCAxMDBfMDAwXzAwMC5cbiAgICAgIGVsc2UgaWYgdCA8IDk5OS45NUUxMlxuICAgICAgdGhlbiBjb252IHRlcmEgdCAxMDBfMDAwXzAwMF8wMDAuXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggcGV0YSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBzcHJpbnRmIFwiJXMlLjFlXCIgcHJlZml4IHRcbiAgICAgICAgfCBTb21lIHBldGEgLT5cbiAgICAgICAgICBpZiB0IDwgOTk5Ljk1RTE1XG4gICAgICAgICAgdGhlbiBjb252IHBldGEgdCAxMDBfMDAwXzAwMF8wMDBfMDAwLlxuICAgICAgICAgIGVsc2Ugc3ByaW50ZiBcIiVzJS4xZVwiIHByZWZpeCB0KVxuICAgIGluXG4gICAgaWYgdCA+PSAwLiB0aGVuIGdvIHQgZWxzZSBcIi1cIiBeIGdvIH4tLnRcbjs7XG5cbmxldCB0b19wYWRkZWRfY29tcGFjdF9zdHJpbmcgdCA9XG4gIHRvX3BhZGRlZF9jb21wYWN0X3N0cmluZ19jdXN0b20gdCB+a2lsbzpcImtcIiB+bWVnYTpcIm1cIiB+Z2lnYTpcImdcIiB+dGVyYTpcInRcIiB+cGV0YTpcInBcIiAoKVxuOztcblxuKCogUGVyZm9ybWFuY2Ugbm90ZTogSW5pdGlhbGl6aW5nIHRoZSBhY2N1bXVsYXRvciB0byAxIHJlc3VsdHMgaW4gb25lIGV4dHJhXG4gICBtdWx0aXBseTsgZS5nLiwgdG8gY29tcHV0ZSB4ICoqIDQsIHdlIGluIHByaW5jaXBsZSBvbmx5IG5lZWQgMiBtdWx0aXBsaWVzLFxuICAgYnV0IHRoaXMgZnVuY3Rpb24gd2lsbCBoYXZlIDMgbXVsdGlwbGllcy4gIEhvd2V2ZXIsIGF0dGVtcHRzIHRvIGF2b2lkIHRoaXNcbiAgIChsaWtlIGRlY3JlbWVudGluZyBuIGFuZCBpbml0aWFsaXppbmcgYWNjdW0gdG8gYmUgeCwgb3IgaGFuZGxpbmcgc21hbGxcbiAgIGV4cG9uZW50cyBhcyBhIHNwZWNpYWwgY2FzZSkgaGF2ZSBub3QgeWllbGRlZCBhbnl0aGluZyB0aGF0IGlzIGEgbmV0XG4gICBpbXByb3ZlbWVudC5cbiopXG5sZXQgaW50X3BvdyB4IG4gPVxuICBsZXQgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gMS5cbiAgZWxzZSAoXG4gICAgKCogVXNpbmcgW3ggKy4gKC0wLildIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBjb252aW5jZXMgdGhlIGNvbXBpbGVyIHRvIGF2b2lkIGEgY2VydGFpblxuICAgICAgIGJveGluZyAodGhhdCB3b3VsZCByZXN1bHQgaW4gYWxsb2NhdGlvbiBpbiBlYWNoIGl0ZXJhdGlvbikuICBTb29uLCB0aGUgY29tcGlsZXJcbiAgICAgICBzaG91bGRuJ3QgbmVlZCB0aGlzIFwiaGludFwiIHRvIGF2b2lkIHRoZSBib3hpbmcuICBUaGUgcmVhc29uIHdlIGFkZCAtMCByYXRoZXIgdGhhbiAwXG4gICAgICAgaXMgdGhhdCBbeCArLiAoLTAuKV0gaXMgYXBwYXJlbnRseSBhbHdheXMgdGhlIHNhbWUgYXMgW3hdLCB3aGVyZWFzIFt4ICsuIDAuXSBpc1xuICAgICAgIG5vdCwgaW4gdGhhdCBpdCBzZW5kcyBbLTAuXSB0byBbMC5dLiAgVGhpcyBtYWtlcyBhIGRpZmZlcmVuY2UgYmVjYXVzZSB3ZSB3YW50XG4gICAgICAgW2ludF9wb3cgKC0wLikgKC0xKV0gdG8gcmV0dXJuIG5lZ19pbmZpbml0eSBqdXN0IGxpa2UgWy0wLiAqKiAtMS5dIHdvdWxkLiAgKilcbiAgICBsZXQgeCA9IHJlZiAoeCArLiAtMC4pIGluXG4gICAgbGV0IG4gPSByZWYgbiBpblxuICAgIGxldCBhY2N1bSA9IHJlZiAxLiBpblxuICAgIGlmICFuIDwgMFxuICAgIHRoZW4gKFxuICAgICAgKCogeCAqKiBuID0gKDEveCkgKiogLW4gKilcbiAgICAgIHggOj0gMS4gLy4gIXg7XG4gICAgICBuIDo9IH4tICghbik7XG4gICAgICBpZiAhbiA8IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICAoKiBuIG11c3QgaGF2ZSBiZWVuIG1pbl9pbnQsIHNvIGl0IGlzIG5vdyBzbyBiaWcgdGhhdCBpdCBoYXMgd3JhcHBlZCBhcm91bmQuXG4gICAgICAgICAgIFdlIGRlY3JlbWVudCBpdCBzbyB0aGF0IGl0IGxvb2tzIHBvc2l0aXZlIGFnYWluLCBidXQgYWNjb3JkaW5nbHkgaGF2ZVxuICAgICAgICAgICB0byBwdXQgYW4gZXh0cmEgZmFjdG9yIG9mIHggaW4gdGhlIGFjY3VtdWxhdG9yLlxuICAgICAgICAqKVxuICAgICAgICBhY2N1bSA6PSAheDtcbiAgICAgICAgZGVjciBuKSk7XG4gICAgKCogTGV0dGluZyBbYV0gZGVub3RlICh0aGUgb3JpZ2luYWwgdmFsdWUgb2YpIFt4ICoqIG5dLCB3ZSBtYWludGFpblxuICAgICAgIHRoZSBpbnZhcmlhbnQgdGhhdCBbKHggKiogbikgKi4gYWNjdW0gPSBhXS4gKilcbiAgICB3aGlsZSAhbiA+IDEgZG9cbiAgICAgIGlmICFuIGxhbmQgMSA8PiAwIHRoZW4gYWNjdW0gOj0gIXggKi4gIWFjY3VtO1xuICAgICAgeCA6PSAheCAqLiAheDtcbiAgICAgIG4gOj0gIW4gbHNyIDFcbiAgICBkb25lO1xuICAgICgqIG4gaXMgbmVjZXNzYXJpbHkgMSBhdCB0aGlzIHBvaW50LCBzbyB0aGVyZSBpcyBvbmUgYWRkaXRpb25hbFxuICAgICAgIG11bHRpcGxpY2F0aW9uIGJ5IHguICopXG4gICAgIXggKi4gIWFjY3VtKVxuOztcblxubGV0IHJvdW5kX2dlbiB4IH5ob3cgPVxuICBpZiB4ID0gMC5cbiAgdGhlbiAwLlxuICBlbHNlIGlmIG5vdCAoaXNfZmluaXRlIHgpXG4gIHRoZW4geFxuICBlbHNlIChcbiAgICAoKiBTaWduaWZpY2FudCBkaWdpdHMgYW5kIGRlY2ltYWwgZGlnaXRzLiAqKVxuICAgIGxldCBzZCwgZGQgPVxuICAgICAgbWF0Y2ggaG93IHdpdGhcbiAgICAgIHwgYHNpZ25pZmljYW50X2RpZ2l0cyBzZCAtPlxuICAgICAgICBsZXQgZGQgPSBzZCAtIHRvX2ludCAocm91bmRfdXAgKGxvZzEwIChhYnMgeCkpKSBpblxuICAgICAgICBzZCwgZGRcbiAgICAgIHwgYGRlY2ltYWxfZGlnaXRzIGRkIC0+XG4gICAgICAgIGxldCBzZCA9IGRkICsgdG9faW50IChyb3VuZF91cCAobG9nMTAgKGFicyB4KSkpIGluXG4gICAgICAgIHNkLCBkZFxuICAgIGluXG4gICAgbGV0IG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGlmIHNkIDwgMFxuICAgIHRoZW4gMC5cbiAgICBlbHNlIGlmIHNkID49IDE3XG4gICAgdGhlbiB4XG4gICAgZWxzZSAoXG4gICAgICAoKiBDaG9vc2UgdGhlIG9yZGVyIHRoYXQgaXMgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQuIFNtYWxsIHBvc2l0aXZlXG4gICAgICAgICBpbnRlZ2VycyBhcmUsIGJ1dCB0aGVpciBpbnZlcnNlcyBpbiBtb3N0IGNhc2VzIGFyZSBub3QuICopXG4gICAgICBsZXQgYWJzX2RkID0gSW50LmFicyBkZCBpblxuICAgICAgaWYgYWJzX2RkID4gMjIgfHwgc2QgPj0gMTZcbiAgICAgICgqIDEwKioyMiBpcyBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBmbG9hdCwgYnV0IDEwKioyMyBpcyBub3QsIHNvIHVzZSB0aGUgc2xvd1xuICAgICAgICAgcGF0aC4gIFNpbWlsYXJseSwgaWYgd2UgbmVlZCAxNiBzaWduaWZpY2FudCBkaWdpdHMgaW4gdGhlIHJlc3VsdCwgdGhlbiB0aGUgaW50ZWdlclxuICAgICAgICAgW3JvdW5kX25lYXJlc3QgKHggPG9wPiBvcmRlcildIG1pZ2h0IG5vdCBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBmbG9hdCwgc2luY2VcbiAgICAgICAgIGZvciBzb21lIHJhbmdlcyB3ZSBvbmx5IGhhdmUgMTUgZGlnaXRzIG9mIHByZWNpc2lvbiBndWFyYW50ZWVkLlxuXG4gICAgICAgICBUaGF0IHNhaWQsIHdlIGFyZSBzdGlsbCByb3VuZGluZyB0d2ljZSBoZXJlOlxuXG4gICAgICAgICAxKSBmaXJzdCB0aW1lIHdoZW4gcm91bmRpbmcgW3ggKi4gb3JkZXJdIG9yIFt4IC8uIG9yZGVyXSB0byB0aGUgbmVhcmVzdCBmbG9hdFxuICAgICAgICAgKGp1c3QgdGhlIG5vcm1hbCB3YXkgZmxvYXRpbmctcG9pbnQgbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24gd29ya3MpLFxuXG4gICAgICAgICAyKSBzZWNvbmQgdGltZSB3aGVuIGFwcGx5aW5nIFtyb3VuZF9uZWFyZXN0X2hhbGZfdG9fZXZlbl0gdG8gdGhlIHJlc3VsdCBvZiB0aGVcbiAgICAgICAgIGFib3ZlIG9wZXJhdGlvblxuXG4gICAgICAgICBTbyBmb3IgYXJndW1lbnRzIHdpdGhpbiBhbiB1bHAgZnJvbSBhIHRpZSB3ZSBtaWdodCBzdGlsbCBwcm9kdWNlIGFuIG9mZi1ieS1vbmVcbiAgICAgICAgIHJlc3VsdC4gKilcbiAgICAgIHRoZW4gb2Zfc3RyaW5nIChzcHJpbnRmIFwiJS4qZ1wiIHNkIHgpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IG9yZGVyID0gaW50X3BvdyAxMC4gYWJzX2RkIGluXG4gICAgICAgIGlmIGRkID49IDBcbiAgICAgICAgdGhlbiByb3VuZF9uZWFyZXN0X2hhbGZfdG9fZXZlbiAoeCAqLiBvcmRlcikgLy4gb3JkZXJcbiAgICAgICAgZWxzZSByb3VuZF9uZWFyZXN0X2hhbGZfdG9fZXZlbiAoeCAvLiBvcmRlcikgKi4gb3JkZXIpKSlcbjs7XG5cbmxldCByb3VuZF9zaWduaWZpY2FudCB4IH5zaWduaWZpY2FudF9kaWdpdHMgPVxuICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSBzaWduaWZpY2FudF9kaWdpdHMgMFxuICB0aGVuXG4gICAgaW52YWxpZF9hcmdmXG4gICAgICBcIkZsb2F0LnJvdW5kX3NpZ25pZmljYW50OiBpbnZhbGlkIGFyZ3VtZW50IHNpZ25pZmljYW50X2RpZ2l0czolZFwiXG4gICAgICBzaWduaWZpY2FudF9kaWdpdHNcbiAgICAgICgpXG4gIGVsc2Ugcm91bmRfZ2VuIHggfmhvdzooYHNpZ25pZmljYW50X2RpZ2l0cyBzaWduaWZpY2FudF9kaWdpdHMpXG47O1xuXG5sZXQgcm91bmRfZGVjaW1hbCB4IH5kZWNpbWFsX2RpZ2l0cyA9IHJvdW5kX2dlbiB4IH5ob3c6KGBkZWNpbWFsX2RpZ2l0cyBkZWNpbWFsX2RpZ2l0cylcbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgKCogQWxzbyBmYWlscyBpZiBbbWluXSBvciBbbWF4XSBpcyBuYW4gKilcbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgKCogY2xhbXBfdW5jaGVja2VkIGlzIGluIGZsb2F0MC5tbCAqKVxuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gICgqIEFsc28gZmFpbHMgaWYgW21pbl0gb3IgW21heF0gaXMgbmFuICopXG4gIGlmIG1pbiA8PSBtYXhcbiAgdGhlbiBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuICBlbHNlXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuOztcblxubGV0ICggKyApID0gKCArLiApXG5sZXQgKCAtICkgPSAoIC0uIClcbmxldCAoICogKSA9ICggKi4gKVxubGV0ICggKiogKSA9ICggKiogKVxubGV0ICggLyApID0gKCAvLiApXG5sZXQgKCAlICkgPSAoICUuIClcbmxldCAoIH4tICkgPSAoIH4tLiApXG5cbmxldCBzaWduX2V4biB0IDogU2lnbi50ID1cbiAgaWYgdCA+IDAuXG4gIHRoZW4gUG9zXG4gIGVsc2UgaWYgdCA8IDAuXG4gIHRoZW4gTmVnXG4gIGVsc2UgaWYgdCA9IDAuXG4gIHRoZW4gWmVyb1xuICBlbHNlIEVycm9yLnJhaXNlX3MgKFNleHAubWVzc2FnZSBcIkZsb2F0LnNpZ25fZXhuIG9mIE5BTlwiIFsgXCJcIiwgc2V4cF9vZl90IHQgXSlcbjs7XG5cbmxldCBzaWduX29yX25hbiB0IDogU2lnbl9vcl9uYW4udCA9XG4gIGlmIHQgPiAwLiB0aGVuIFBvcyBlbHNlIGlmIHQgPCAwLiB0aGVuIE5lZyBlbHNlIGlmIHQgPSAwLiB0aGVuIFplcm8gZWxzZSBOYW5cbjs7XG5cbmxldCBpZWVlX25lZ2F0aXZlIHQgPVxuICBsZXQgYml0cyA9IENhbWwuSW50NjQuYml0c19vZl9mbG9hdCB0IGluXG4gIFBvbHkuKGJpdHMgPCBDYW1sLkludDY0Lnplcm8pXG47O1xuXG5sZXQgZXhwb25lbnRfYml0cyA9IDExXG5sZXQgbWFudGlzc2FfYml0cyA9IDUyXG5sZXQgZXhwb25lbnRfbWFzazY0ID0gSW50NjQuKHNoaWZ0X2xlZnQgb25lIGV4cG9uZW50X2JpdHMgLSBvbmUpXG5sZXQgZXhwb25lbnRfbWFzayA9IEludDY0LnRvX2ludF9leG4gZXhwb25lbnRfbWFzazY0XG5sZXQgbWFudGlzc2FfbWFzayA9IEludDYzLihzaGlmdF9sZWZ0IG9uZSBtYW50aXNzYV9iaXRzIC0gb25lKVxubGV0IG1hbnRpc3NhX21hc2s2NCA9IEludDYzLnRvX2ludDY0IG1hbnRpc3NhX21hc2tcblxubGV0IGllZWVfZXhwb25lbnQgdCA9XG4gIGxldCBiaXRzID0gQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0IHQgaW5cbiAgSW50NjQuKGJpdF9hbmQgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgYml0cyBtYW50aXNzYV9iaXRzKSBleHBvbmVudF9tYXNrNjQpXG4gIHw+IENhbWwuSW50NjQudG9faW50XG47O1xuXG5sZXQgaWVlZV9tYW50aXNzYSB0ID1cbiAgbGV0IGJpdHMgPSBDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgdCBpblxuICBJbnQ2My5vZl9pbnQ2NF9leG4gQ2FtbC5JbnQ2NC4obG9nYW5kIGJpdHMgbWFudGlzc2FfbWFzazY0KVxuOztcblxubGV0IGNyZWF0ZV9pZWVlX2V4biB+bmVnYXRpdmUgfmV4cG9uZW50IH5tYW50aXNzYSA9XG4gIGlmIEludC4oYml0X2FuZCBleHBvbmVudCBleHBvbmVudF9tYXNrIDw+IGV4cG9uZW50KVxuICB0aGVuIGZhaWx3aXRoZiBcImV4cG9uZW50ICVkIG91dCBvZiByYW5nZSBbMCwgJWRdXCIgZXhwb25lbnQgZXhwb25lbnRfbWFzayAoKVxuICBlbHNlIGlmIEludDYzLihiaXRfYW5kIG1hbnRpc3NhIG1hbnRpc3NhX21hc2sgPD4gbWFudGlzc2EpXG4gIHRoZW5cbiAgICBmYWlsd2l0aGZcbiAgICAgIFwibWFudGlzc2EgJXMgb3V0IG9mIHJhbmdlIFswLCAlc11cIlxuICAgICAgKEludDYzLnRvX3N0cmluZyBtYW50aXNzYSlcbiAgICAgIChJbnQ2My50b19zdHJpbmcgbWFudGlzc2FfbWFzaylcbiAgICAgICgpXG4gIGVsc2UgKFxuICAgIGxldCBzaWduX2JpdHMgPSBpZiBuZWdhdGl2ZSB0aGVuIENhbWwuSW50NjQubWluX2ludCBlbHNlIENhbWwuSW50NjQuemVybyBpblxuICAgIGxldCBleHB0X2JpdHMgPSBDYW1sLkludDY0LnNoaWZ0X2xlZnQgKENhbWwuSW50NjQub2ZfaW50IGV4cG9uZW50KSBtYW50aXNzYV9iaXRzIGluXG4gICAgbGV0IG1hbnRfYml0cyA9IEludDYzLnRvX2ludDY0IG1hbnRpc3NhIGluXG4gICAgbGV0IGJpdHMgPSBDYW1sLkludDY0Lihsb2dvciBzaWduX2JpdHMgKGxvZ29yIGV4cHRfYml0cyBtYW50X2JpdHMpKSBpblxuICAgIENhbWwuSW50NjQuZmxvYXRfb2ZfYml0cyBiaXRzKVxuOztcblxubGV0IGNyZWF0ZV9pZWVlIH5uZWdhdGl2ZSB+ZXhwb25lbnQgfm1hbnRpc3NhID1cbiAgT3JfZXJyb3IudHJ5X3dpdGggKGZ1biAoKSAtPiBjcmVhdGVfaWVlZV9leG4gfm5lZ2F0aXZlIH5leHBvbmVudCB+bWFudGlzc2EpXG47O1xuXG5tb2R1bGUgVGVyc2UgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgdCA9IHRcblxuICBsZXQgdF9vZl9zZXhwID0gdF9vZl9zZXhwXG4gIGxldCB0b19zdHJpbmcgeCA9IFByaW50Zi5zcHJpbnRmIFwiJS44R1wiIHhcbiAgbGV0IHNleHBfb2ZfdCB4ID0gU2V4cC5BdG9tICh0b19zdHJpbmcgeClcbiAgbGV0IG9mX3N0cmluZyB4ID0gb2Zfc3RyaW5nIHhcbiAgbGV0IHRfc2V4cF9ncmFtbWFyID0gdF9zZXhwX2dyYW1tYXJcbmVuZFxuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbigqIFRoZXNlIGFyZSBwYXJ0bHkgaGVyZSBhcyBhIHBlcmZvcm1hbmNlIGhhY2sgdG8gYXZvaWQgc29tZSBib3hpbmcgd2UncmUgZ2V0dGluZyB3aXRoXG4gICB0aGUgdmVyc2lvbnMgd2UgZ2V0IGZyb20gW1dpdGhfemVyb10uICBUaGV5IGFsc28gbWFrZSBbRmxvYXQuaXNfbmVnYXRpdmUgbmFuXSBhbmRcbiAgIFtGbG9hdC5pc19ub25fcG9zaXRpdmUgbmFuXSByZXR1cm4gW2ZhbHNlXTsgdGhlIHZlcnNpb25zIHdlIGdldCBmcm9tIFtXaXRoX3plcm9dIHJldHVyblxuICAgW3RydWVdLiAqKVxubGV0IGlzX3Bvc2l0aXZlIHQgPSB0ID4gMC5cbmxldCBpc19ub25fbmVnYXRpdmUgdCA9IHQgPj0gMC5cbmxldCBpc19uZWdhdGl2ZSB0ID0gdCA8IDAuXG5sZXQgaXNfbm9uX3Bvc2l0aXZlIHQgPSB0IDw9IDAuXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkZsb2F0XCJcbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gIGVuZClcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgbGV0ICggKyApID0gKCArIClcbiAgbGV0ICggLSApID0gKCAtIClcbiAgbGV0ICggKiApID0gKCAqIClcbiAgbGV0ICggLyApID0gKCAvIClcbiAgbGV0ICggJSApID0gKCAlIClcbiAgbGV0ICggfi0gKSA9ICggfi0gKVxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSAoRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIDogQ29tcGFyaXNvbnMuSW5maXggd2l0aCB0eXBlIHQgOj0gdClcblxuICBsZXQgYWJzID0gYWJzXG4gIGxldCBuZWcgPSBuZWdcbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnQgPSBvZl9pbnRcbiAgbGV0IG9mX2Zsb2F0IHggPSB4XG5lbmRcblxubW9kdWxlIE9fZG90ID0gc3RydWN0XG4gIGxldCAoICouICkgPSAoICogKVxuICBsZXQgKCArLiApID0gKCArIClcbiAgbGV0ICggLS4gKSA9ICggLSApXG4gIGxldCAoIC8uICkgPSAoIC8gKVxuICBsZXQgKCAlLiApID0gKCAlIClcbiAgbGV0ICggfi0uICkgPSAoIH4tIClcbiAgbGV0ICggKiouICkgPSAoICoqIClcbmVuZFxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBsZXQgYm94ID0gYm94XG4gIGxldCBjbGFtcF91bmNoZWNrZWQgPSBjbGFtcF91bmNoZWNrZWRcbiAgbGV0IGxvd2VyX2JvdW5kX2Zvcl9pbnQgPSBsb3dlcl9ib3VuZF9mb3JfaW50XG4gIGxldCB1cHBlcl9ib3VuZF9mb3JfaW50ID0gdXBwZXJfYm91bmRfZm9yX2ludFxuICBsZXQgc3BlY2lhbGl6ZWRfaGFzaCA9IGhhc2hfZmxvYXRcbiAgbGV0IG9uZV91bHBfbGVzc190aGFuX2hhbGYgPSBvbmVfdWxwX2xlc3NfdGhhbl9oYWxmXG4gIGxldCBpbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4biA9IGludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuXG4gIGxldCBpbnQ2M19yb3VuZF9uZWFyZXN0X2FyY2g2NF9ub2FsbG9jX2V4biA9IGludDYzX3JvdW5kX25lYXJlc3RfYXJjaDY0X25vYWxsb2NfZXhuXG4gIGxldCBpcm91bmRfbmVhcmVzdF9leG5fNjQgPSBpcm91bmRfbmVhcmVzdF9leG5fNjRcbmVuZFxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbigqIFRoZXNlIGZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkgcmVwbGFjZSBkZWZhdWx0cyBpbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuXG5cbiAgIFRoZSBkZXNpcmVkIGJlaGF2aW9yIGhlcmUgaXMgdG8gcHJvcGFnYXRlIGEgbmFuIGlmIGVpdGhlciBhcmd1bWVudCBpcyBuYW4uIEJlY2F1c2UgdGhlXG4gICBmaXJzdCBjb21wYXJpc29uIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSBpZiBlaXRoZXIgYXJndW1lbnQgaXMgbmFuLCBpdCBzdWZmaWNlcyB0b1xuICAgY2hlY2sgaWYgeCBpcyBuYW4uIFRoZW4sIHdoZW4geCBpcyBuYW4gb3IgYm90aCB4IGFuZCB5IGFyZSBuYW4sIHdlIHJldHVybiB4ID0gbmFuOyBhbmRcbiAgIHdoZW4geSBpcyBuYW4gYnV0IG5vdCB4LCB3ZSByZXR1cm4geSA9IG5hbi5cblxuICAgVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBpbXBsZW1lbnQgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIGJlbmNobWFyayBiZWxvdyBzaG93cyBhIGZld1xuICAgZGlmZmVyZW50IHZlcnNpb25zLiAgVGhpcyBiZW5jaG1hcmsgd2FzIHJ1biBvdmVyIGFuIGFycmF5IG9mIHJhbmRvbSBmbG9hdHMgKG5vbmUgb2ZcbiAgIHdoaWNoIGFyZSBuYW4pLlxuXG4gICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgIOKUgiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiBUaW1lL1J1biDilIJcbiAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAg4pSCIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIGlmIHggPCB5IHRoZW4geCBlbHNlIHkg4pSCICAgMi40MnVzIOKUglxuICAg4pSCIGlmIGlzX25hbiB4IHx8IHggPCB5IHRoZW4geCBlbHNlIHkgICAgICAgICAgICAg4pSCICAgMi4wMnVzIOKUglxuICAg4pSCIGlmIHggPCB5IHx8IGlzX25hbiB4IHRoZW4geCBlbHNlIHkgICAgICAgICAgICAg4pSCICAgMS44OHVzIOKUglxuICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cbiAgIFRoZSBiZW5jaG1hcmsgYmVsb3cgd2FzIHJ1biB3aGVuIHggPiB5IGlzIGFsd2F5cyB0cnVlIChhZ2Fpbiwgbm8gbmFuIHZhbHVlcykuXG5cbiAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAg4pSCIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCIFRpbWUvUnVuIOKUglxuICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICDilIIgaWYgaXNfbmFuIHggdGhlbiB4IGVsc2UgaWYgeCA8IHkgdGhlbiB4IGVsc2UgeSDilIIgICAyLjgzdXMg4pSCXG4gICDilIIgaWYgaXNfbmFuIHggfHwgeCA8IHkgdGhlbiB4IGVsc2UgeSAgICAgICAgICAgICDilIIgICAxLjk3dXMg4pSCXG4gICDilIIgaWYgeCA8IHkgfHwgaXNfbmFuIHggdGhlbiB4IGVsc2UgeSAgICAgICAgICAgICDilIIgICAxLjU2dXMg4pSCXG4gICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiopXG5sZXQgbWluICh4IDogdCkgeSA9IGlmIHggPCB5IHx8IGlzX25hbiB4IHRoZW4geCBlbHNlIHlcbmxldCBtYXggKHggOiB0KSB5ID0gaWYgeCA+IHkgfHwgaXNfbmFuIHggdGhlbiB4IGVsc2UgeVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEJ1ZmZlcl9pbnRmXG5pbmNsdWRlIENhbWwuQnVmZmVyXG5cbmxldCBjb250ZW50c19ieXRlcyA9IHRvX2J5dGVzXG5sZXQgYWRkX3N1YnN0cmluZyB0IHMgfnBvcyB+bGVuID0gYWRkX3N1YnN0cmluZyB0IHMgcG9zIGxlblxubGV0IGFkZF9zdWJieXRlcyB0IHMgfnBvcyB+bGVuID0gYWRkX3N1YmJ5dGVzIHQgcyBwb3MgbGVuXG5sZXQgc2V4cF9vZl90IHQgPSBzZXhwX29mX3N0cmluZyAoY29udGVudHMgdClcblxubW9kdWxlIFRvX2J5dGVzID1cbiAgQmxpdC5NYWtlX2Rpc3RpbmN0XG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlIHQgPSBCeXRlcy50XG5cbiAgICAgIGxldCBjcmVhdGUgfmxlbiA9IEJ5dGVzLmNyZWF0ZSBsZW5cbiAgICAgIGxldCBsZW5ndGggPSBCeXRlcy5sZW5ndGhcblxuICAgICAgbGV0IHVuc2FmZV9ibGl0IH5zcmMgfnNyY19wb3MgfmRzdCB+ZHN0X3BvcyB+bGVuID1cbiAgICAgICAgQ2FtbC5CdWZmZXIuYmxpdCBzcmMgc3JjX3BvcyBkc3QgZHN0X3BvcyBsZW5cbiAgICAgIDs7XG4gICAgZW5kKVxuXG5pbmNsdWRlIFRvX2J5dGVzXG5tb2R1bGUgVG9fc3RyaW5nID0gQmxpdC5NYWtlX3RvX3N0cmluZyAoQ2FtbC5CdWZmZXIpIChUb19ieXRlcylcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIFN5cyA9IFN5czBcblxudHlwZSB0ID0gQ2FtbC5QcmludGV4Yy5yYXdfYmFja3RyYWNlXG5cbmxldCBlbGlkZSA9IHJlZiBmYWxzZVxubGV0IGVsaWRlZF9tZXNzYWdlID0gXCI8YmFja3RyYWNlIGVsaWRlZCBpbiB0ZXN0PlwiXG5cbmxldCBnZXQgPyhhdF9tb3N0X251bV9mcmFtZXMgPSBJbnQubWF4X3ZhbHVlKSAoKSA9XG4gIENhbWwuUHJpbnRleGMuZ2V0X2NhbGxzdGFjayBhdF9tb3N0X251bV9mcmFtZXNcbjs7XG5cbmxldCB0b19zdHJpbmcgdCA9XG4gIGlmICFlbGlkZSB0aGVuIGVsaWRlZF9tZXNzYWdlIGVsc2UgQ2FtbC5QcmludGV4Yy5yYXdfYmFja3RyYWNlX3RvX3N0cmluZyB0XG47O1xuXG5sZXQgdG9fc3RyaW5nX2xpc3QgdCA9IFN0cmluZy5zcGxpdF9saW5lcyAodG9fc3RyaW5nIHQpXG5sZXQgc2V4cF9vZl90IHQgPSBTZXhwLkxpc3QgKExpc3QubWFwICh0b19zdHJpbmdfbGlzdCB0KSB+ZjooZnVuIHggLT4gU2V4cC5BdG9tIHgpKVxuXG5tb2R1bGUgRXhuID0gc3RydWN0XG4gIGxldCBzZXRfcmVjb3JkaW5nID0gQ2FtbC5QcmludGV4Yy5yZWNvcmRfYmFja3RyYWNlXG4gIGxldCBhbV9yZWNvcmRpbmcgPSBDYW1sLlByaW50ZXhjLmJhY2t0cmFjZV9zdGF0dXNcbiAgbGV0IG1vc3RfcmVjZW50ICgpID0gQ2FtbC5QcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKVxuXG4gIGxldCBtb3N0X3JlY2VudF9mb3JfZXhuIGV4biA9XG4gICAgaWYgRXhuLmlzX3BoeXNfZXF1YWxfbW9zdF9yZWNlbnQgZXhuIHRoZW4gU29tZSAobW9zdF9yZWNlbnQgKCkpIGVsc2UgTm9uZVxuICA7O1xuXG4gICgqIFdlIHR1cm4gb24gYmFja3RyYWNlcyBieSBkZWZhdWx0IGlmIE9DQU1MUlVOUEFSQU0gZG9lc24ndCBleHBsaWNpdGx5IG1lbnRpb24gdGhlbS4gKilcbiAgbGV0IG1heWJlX3NldF9yZWNvcmRpbmcgKCkgPVxuICAgIGxldCBvY2FtbHJ1bnBhcmFtX21lbnRpb25zX2JhY2t0cmFjZXMgPVxuICAgICAgbWF0Y2ggU3lzLmdldGVudiBcIk9DQU1MUlVOUEFSQU1cIiB3aXRoXG4gICAgICB8IE5vbmUgLT4gZmFsc2VcbiAgICAgIHwgU29tZSB4IC0+IExpc3QuZXhpc3RzIChTdHJpbmcuc3BsaXQgeCB+b246JywnKSB+ZjooU3RyaW5nLmlzX3ByZWZpeCB+cHJlZml4OlwiYlwiKVxuICAgIGluXG4gICAgaWYgbm90IG9jYW1scnVucGFyYW1fbWVudGlvbnNfYmFja3RyYWNlcyB0aGVuIHNldF9yZWNvcmRpbmcgdHJ1ZVxuICA7O1xuXG4gICgqIHRoZSBjYWxsZXIgc2V0IHNvbWV0aGluZywgdGhleSBhcmUgcmVzcG9uc2libGUgKilcblxuICBsZXQgd2l0aF9yZWNvcmRpbmcgYiB+ZiA9XG4gICAgbGV0IHNhdmVkID0gYW1fcmVjb3JkaW5nICgpIGluXG4gICAgc2V0X3JlY29yZGluZyBiO1xuICAgIEV4bi5wcm90ZWN0IH5mIH5maW5hbGx5OihmdW4gKCkgLT4gc2V0X3JlY29yZGluZyBzYXZlZClcbiAgOztcbmVuZFxuXG5sZXQgaW5pdGlhbGl6ZV9tb2R1bGUgKCkgPSBFeG4ubWF5YmVfc2V0X3JlY29yZGluZyAoKVxuIiwiKCoqIFRoaXMgbW9kdWxlIGlzIHRoZSB0b3BsZXZlbCBvZiB0aGUgQmFzZSBsaWJyYXJ5OyBpdCdzIHdoYXQgeW91IGdldCB3aGVuIHlvdSB3cml0ZVxuICAgIFtvcGVuIEJhc2VdLlxuXG4gICAgVGhlIGdvYWwgb2YgQmFzZSBpcyBib3RoIHRvIGJlIGEgbW9yZSBjb21wbGV0ZSBzdGFuZGFyZCBsaWJyYXJ5LCB3aXRoIHJpY2hlciBBUElzLFxuICAgIGFuZCB0byBiZSBtb3JlIGNvbnNpc3RlbnQgaW4gaXRzIGRlc2lnbi4gRm9yIGluc3RhbmNlLCBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeVxuICAgIHNvbWUgdGhpbmdzIGhhdmUgbW9kdWxlcyBhbmQgb3RoZXJzIGRvbid0OyBpbiBCYXNlLCBldmVyeXRoaW5nIGlzIGEgbW9kdWxlLlxuXG4gICAgQmFzZSBleHRlbmRzIHNvbWUgbW9kdWxlcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnksIGxpa2UgW0FycmF5XSxcbiAgICBbQnVmZmVyXSwgW0J5dGVzXSwgW0NoYXJdLCBbSGFzaHRibF0sIFtJbnQzMl0sIFtJbnQ2NF0sIFtMYXp5XSwgW0xpc3RdLCBbTWFwXSxcbiAgICBbTmF0aXZlaW50XSwgW1ByaW50Zl0sIFtSYW5kb21dLCBbU2V0XSwgW1N0cmluZ10sIFtTeXNdLCBhbmQgW1VjaGFyXS4gT25lIGtleVxuICAgIGRpZmZlcmVuY2UgaXMgdGhhdCBCYXNlIGRvZXNuJ3QgdXNlIGV4Y2VwdGlvbnMgYXMgbXVjaCBhcyB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbmRcbiAgICBpbnN0ZWFkIG1ha2VzIGhlYXZ5IHVzZSBvZiB0aGUgW1Jlc3VsdF0gdHlwZSwgYXMgaW46XG5cbiAgICB7WyB0eXBlICgnYSwnYikgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnYiBdfVxuXG4gICAgQmFzZSBhbHNvIGFkZHMgZW50aXJlbHkgbmV3IG1vZHVsZXMsIG1vc3Qgbm90YWJseTpcblxuICAgIC0gW0NvbXBhcmFibGVdLCBbQ29tcGFyYXRvcl0sIGFuZCBbQ29tcGFyaXNvbnNdIGluIGxpZXUgb2YgcG9seW1vcnBoaWMgY29tcGFyZS5cbiAgICAtIFtDb250YWluZXJdLCB3aGljaCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGFjcm9zcyBjb250YWluZXItbGlrZSBkYXRhXG4gICAgICBzdHJ1Y3R1cmVzIChhcnJheXMsIGxpc3RzLCBzdHJpbmdzKS5cbiAgICAtIFtSZXN1bHRdLCBbRXJyb3JdLCBhbmQgW09yX2Vycm9yXSwgc3VwcG9ydGluZyB0aGUgb3ItZXJyb3IgcGF0dGVybi5cbiopXG5cbigqXyBXZSBoaWRlIHRoaXMgZnJvbSB0aGUgd2ViIGRvY3MgYmVjYXVzZSB0aGUgbGluZSB3cmFwcGluZyBpcyBiYWQsIG1ha2luZyBpdFxuICBwcmV0dHkgbXVjaCBpbnNjcnV0YWJsZS4gKilcbigqKi8qKilcblxuKCogVGhlIGludGVudCBpcyB0byBzaGFkb3cgYWxsIG9mIElOUklBJ3Mgc3RhbmRhcmQgbGlicmFyeS4gIE1vZHVsZXMgYmVsb3cgd291bGQgY2F1c2VcbiAgIGNvbXBpbGF0aW9uIGVycm9ycyB3aXRob3V0IGJlaW5nIHJlbW92ZWQgZnJvbSBbU2hhZG93X3N0ZGxpYl0gYmVmb3JlIGluY2x1c2lvbi4gKilcblxuaW5jbHVkZSAoXG4gIFNoYWRvd19zdGRsaWIgOlxuICAgIG1vZHVsZSB0eXBlIG9mIHN0cnVjdFxuICAgIGluY2x1ZGUgU2hhZG93X3N0ZGxpYlxuICBlbmRcbiAgKCogTW9kdWxlcyBkZWZpbmVkIGluIEJhc2UgKilcbiAgd2l0aCBtb2R1bGUgQXJyYXkgOj0gU2hhZG93X3N0ZGxpYi5BcnJheVxuICB3aXRoIG1vZHVsZSBBdG9taWMgOj0gU2hhZG93X3N0ZGxpYi5BdG9taWNcbiAgd2l0aCBtb2R1bGUgQm9vbCA6PSBTaGFkb3dfc3RkbGliLkJvb2xcbiAgd2l0aCBtb2R1bGUgQnVmZmVyIDo9IFNoYWRvd19zdGRsaWIuQnVmZmVyXG4gIHdpdGggbW9kdWxlIEJ5dGVzIDo9IFNoYWRvd19zdGRsaWIuQnl0ZXNcbiAgd2l0aCBtb2R1bGUgQ2hhciA6PSBTaGFkb3dfc3RkbGliLkNoYXJcbiAgd2l0aCBtb2R1bGUgRWl0aGVyIDo9IFNoYWRvd19zdGRsaWIuRWl0aGVyXG4gIHdpdGggbW9kdWxlIEZsb2F0IDo9IFNoYWRvd19zdGRsaWIuRmxvYXRcbiAgd2l0aCBtb2R1bGUgSGFzaHRibCA6PSBTaGFkb3dfc3RkbGliLkhhc2h0YmxcbiAgd2l0aCBtb2R1bGUgSW5fY2hhbm5lbCA6PSBTaGFkb3dfc3RkbGliLkluX2NoYW5uZWxcbiAgd2l0aCBtb2R1bGUgSW50IDo9IFNoYWRvd19zdGRsaWIuSW50XG4gIHdpdGggbW9kdWxlIEludDMyIDo9IFNoYWRvd19zdGRsaWIuSW50MzJcbiAgd2l0aCBtb2R1bGUgSW50NjQgOj0gU2hhZG93X3N0ZGxpYi5JbnQ2NFxuICB3aXRoIG1vZHVsZSBMYXp5IDo9IFNoYWRvd19zdGRsaWIuTGF6eVxuICB3aXRoIG1vZHVsZSBMaXN0IDo9IFNoYWRvd19zdGRsaWIuTGlzdFxuICB3aXRoIG1vZHVsZSBNYXAgOj0gU2hhZG93X3N0ZGxpYi5NYXBcbiAgd2l0aCBtb2R1bGUgTmF0aXZlaW50IDo9IFNoYWRvd19zdGRsaWIuTmF0aXZlaW50XG4gIHdpdGggbW9kdWxlIE9wdGlvbiA6PSBTaGFkb3dfc3RkbGliLk9wdGlvblxuICB3aXRoIG1vZHVsZSBPdXRfY2hhbm5lbCA6PSBTaGFkb3dfc3RkbGliLk91dF9jaGFubmVsXG4gIHdpdGggbW9kdWxlIFByaW50ZiA6PSBTaGFkb3dfc3RkbGliLlByaW50ZlxuICB3aXRoIG1vZHVsZSBRdWV1ZSA6PSBTaGFkb3dfc3RkbGliLlF1ZXVlXG4gIHdpdGggbW9kdWxlIFJhbmRvbSA6PSBTaGFkb3dfc3RkbGliLlJhbmRvbVxuICB3aXRoIG1vZHVsZSBSZXN1bHQgOj0gU2hhZG93X3N0ZGxpYi5SZXN1bHRcbiAgd2l0aCBtb2R1bGUgU2V0IDo9IFNoYWRvd19zdGRsaWIuU2V0XG4gIHdpdGggbW9kdWxlIFN0YWNrIDo9IFNoYWRvd19zdGRsaWIuU3RhY2tcbiAgd2l0aCBtb2R1bGUgU3RyaW5nIDo9IFNoYWRvd19zdGRsaWIuU3RyaW5nXG4gIHdpdGggbW9kdWxlIFN5cyA6PSBTaGFkb3dfc3RkbGliLlN5c1xuICB3aXRoIG1vZHVsZSBVY2hhciA6PSBTaGFkb3dfc3RkbGliLlVjaGFyXG4gIHdpdGggbW9kdWxlIFVuaXQgOj0gU2hhZG93X3N0ZGxpYi5Vbml0XG4gICgqIFN1cHBvcnQgZm9yIGdlbmVyYXRlZCBsZXhlcnMgKilcbiAgd2l0aCBtb2R1bGUgTGV4aW5nIDo9IFNoYWRvd19zdGRsaWIuTGV4aW5nXG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0IDo9ICgnYSwgJ2IsICdjKSBmb3JtYXRcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NCA6PSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDRcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IDo9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gIHdpdGggdHlwZSAnYSByZWYgOj0gJ2EgcmVmKSBbQG9jYW1sLndhcm5pbmcgXCItM1wiXVxuXG4oKiovKiopXG5cbm9wZW4hIEltcG9ydFxubW9kdWxlIEFwcGxpY2F0aXZlID0gQXBwbGljYXRpdmVcbm1vZHVsZSBBcnJheSA9IEFycmF5XG5tb2R1bGUgQXZsdHJlZSA9IEF2bHRyZWVcbm1vZHVsZSBCYWNrdHJhY2UgPSBCYWNrdHJhY2Vcbm1vZHVsZSBCaW5hcnlfc2VhcmNoID0gQmluYXJ5X3NlYXJjaFxubW9kdWxlIEJpbmFyeV9zZWFyY2hhYmxlID0gQmluYXJ5X3NlYXJjaGFibGVcbm1vZHVsZSBCbGl0ID0gQmxpdFxubW9kdWxlIEJvb2wgPSBCb29sXG5tb2R1bGUgQnVmZmVyID0gQnVmZmVyXG5tb2R1bGUgQnl0ZXMgPSBCeXRlc1xubW9kdWxlIENoYXIgPSBDaGFyXG5tb2R1bGUgQ29tcGFyYWJsZSA9IENvbXBhcmFibGVcbm1vZHVsZSBDb21wYXJhdG9yID0gQ29tcGFyYXRvclxubW9kdWxlIENvbXBhcmlzb25zID0gQ29tcGFyaXNvbnNcbm1vZHVsZSBDb250YWluZXIgPSBDb250YWluZXJcbm1vZHVsZSBFaXRoZXIgPSBFaXRoZXJcbm1vZHVsZSBFcXVhbCA9IEVxdWFsXG5tb2R1bGUgRXJyb3IgPSBFcnJvclxubW9kdWxlIEV4biA9IEV4blxubW9kdWxlIEZpZWxkID0gRmllbGRcbm1vZHVsZSBGbG9hdCA9IEZsb2F0XG5tb2R1bGUgRmxvYXRhYmxlID0gRmxvYXRhYmxlXG5tb2R1bGUgRm4gPSBGblxubW9kdWxlIEZvcm1hdHRlciA9IEZvcm1hdHRlclxubW9kdWxlIEhhc2ggPSBIYXNoXG5tb2R1bGUgSGFzaF9zZXQgPSBIYXNoX3NldFxubW9kdWxlIEhhc2hhYmxlID0gSGFzaGFibGVcbm1vZHVsZSBIYXNoZXIgPSBIYXNoZXJcbm1vZHVsZSBIYXNodGJsID0gSGFzaHRibFxubW9kdWxlIElkZW50aWZpYWJsZSA9IElkZW50aWZpYWJsZVxubW9kdWxlIEluZGV4ZWRfY29udGFpbmVyID0gSW5kZXhlZF9jb250YWluZXJcbm1vZHVsZSBJbmZvID0gSW5mb1xubW9kdWxlIEludCA9IEludFxubW9kdWxlIEludF9jb252ZXJzaW9ucyA9IEludF9jb252ZXJzaW9uc1xubW9kdWxlIEludDMyID0gSW50MzJcbm1vZHVsZSBJbnQ2MyA9IEludDYzXG5tb2R1bGUgSW50NjQgPSBJbnQ2NFxubW9kdWxlIEludGFibGUgPSBJbnRhYmxlXG5tb2R1bGUgSW50X21hdGggPSBJbnRfbWF0aFxubW9kdWxlIEludmFyaWFudCA9IEludmFyaWFudFxubW9kdWxlIExhenkgPSBMYXp5XG5tb2R1bGUgTGlzdCA9IExpc3Rcbm1vZHVsZSBNYXAgPSBNYXBcbm1vZHVsZSBNYXliZV9ib3VuZCA9IE1heWJlX2JvdW5kXG5tb2R1bGUgTW9uYWQgPSBNb25hZFxubW9kdWxlIE5hdGl2ZWludCA9IE5hdGl2ZWludFxubW9kdWxlIE5vdGhpbmcgPSBOb3RoaW5nXG5tb2R1bGUgT3B0aW9uID0gT3B0aW9uXG5tb2R1bGUgT3B0aW9uX2FycmF5ID0gT3B0aW9uX2FycmF5XG5tb2R1bGUgT3JfZXJyb3IgPSBPcl9lcnJvclxubW9kdWxlIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24gPSBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uXG5tb2R1bGUgT3JkZXJpbmcgPSBPcmRlcmluZ1xubW9kdWxlIFBvbHkgPSBQb2x5XG5tb2R1bGUgUG9seW1vcnBoaWNfY29tcGFyZSA9IFBvbHkgW0BAZGVwcmVjYXRlZCBcIltzaW5jZSAyMDE4LTExXSB1c2UgW1BvbHldIGluc3RlYWRcIl1cblxubW9kdWxlIFBvcGNvdW50ID0gUG9wY291bnRcbltAQGRlcHJlY2F0ZWQgXCJbc2luY2UgMjAxOC0xMF0gdXNlIFtwb3Bjb3VudF0gZnVuY3Rpb25zIGluIHRoZSBpbmRpdmlkdWFsIGludCBtb2R1bGVzXCJdXG5cbm1vZHVsZSBQcmV0dHlfcHJpbnRlciA9IFByZXR0eV9wcmludGVyXG5tb2R1bGUgUHJpbnRmID0gUHJpbnRmXG5tb2R1bGUgTGlua2VkX3F1ZXVlID0gTGlua2VkX3F1ZXVlXG5tb2R1bGUgUXVldWUgPSBRdWV1ZVxubW9kdWxlIFJhbmRvbSA9IFJhbmRvbVxubW9kdWxlIFJlZiA9IFJlZlxubW9kdWxlIFJlc3VsdCA9IFJlc3VsdFxubW9kdWxlIFNlcXVlbmNlID0gU2VxdWVuY2Vcbm1vZHVsZSBTZXQgPSBTZXRcbm1vZHVsZSBTZXhwYWJsZSA9IFNleHBhYmxlXG5tb2R1bGUgU2lnbiA9IFNpZ25cbm1vZHVsZSBTaWduX29yX25hbiA9IFNpZ25fb3JfbmFuXG5tb2R1bGUgU291cmNlX2NvZGVfcG9zaXRpb24gPSBTb3VyY2VfY29kZV9wb3NpdGlvblxubW9kdWxlIFN0YWNrID0gU3RhY2tcbm1vZHVsZSBTdGFnZWQgPSBTdGFnZWRcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmdcbm1vZHVsZSBTdHJpbmdhYmxlID0gU3RyaW5nYWJsZVxubW9kdWxlIFN5cyA9IFN5c1xubW9kdWxlIFQgPSBUXG5tb2R1bGUgVHlwZV9lcXVhbCA9IFR5cGVfZXF1YWxcbm1vZHVsZSBVbmlmb3JtX2FycmF5ID0gVW5pZm9ybV9hcnJheVxubW9kdWxlIFVuaXQgPSBVbml0XG5tb2R1bGUgVWNoYXIgPSBVY2hhclxubW9kdWxlIFZhcmlhbnQgPSBWYXJpYW50XG5tb2R1bGUgV2l0aF9yZXR1cm4gPSBXaXRoX3JldHVyblxubW9kdWxlIFdvcmRfc2l6ZSA9IFdvcmRfc2l6ZVxuXG4oKiBBdm9pZCBhIGxldmVsIG9mIGluZGlyZWN0aW9uIGZvciB1c2VzIG9mIHRoZSBzaWduYXR1cmVzIGRlZmluZWQgaW4gW1RdLiAqKVxuaW5jbHVkZSBUXG5cbigqIFRoaXMgaXMgYSBoYWNrIHNvIHRoYXQgb2RvYyBjcmVhdGVzIGJldHRlciBkb2N1bWVudGF0aW9uLiAqKVxubW9kdWxlIFNleHAgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTZXhwX3dpdGhfY29tcGFyYWJsZSAoKiogQGlubGluZSAqKVxuZW5kXG5cbigqKi8qKilcblxubW9kdWxlIEV4cG9ydGVkX2Zvcl9zcGVjaWZpY191c2VzID0gc3RydWN0XG4gIG1vZHVsZSBGaWVsZHNsaWIgPSBGaWVsZHNsaWJcbiAgbW9kdWxlIFBweF9oYXNoX2xpYiA9IFBweF9oYXNoX2xpYlxuICBtb2R1bGUgVmFyaWFudHNsaWIgPSBWYXJpYW50c2xpYlxuICBtb2R1bGUgUHB4X2NvbXBhcmVfbGliID0gUHB4X2NvbXBhcmVfbGliXG4gIG1vZHVsZSBQcHhfZW51bWVyYXRlX2xpYiA9IFBweF9lbnVtZXJhdGVfbGliXG5cbiAgbGV0IGFtX3Rlc3RpbmcgPSBhbV90ZXN0aW5nXG5lbmRcblxuKCoqLyoqKVxuXG5tb2R1bGUgRXhwb3J0ID0gc3RydWN0XG4gICgqIFtkZXJpdmluZyBoYXNoXSBpcyBtaXNzaW5nIGZvciBbYXJyYXldIGFuZCBbcmVmXSBzaW5jZSB0aGVzZSB0eXBlcyBhcmUgbXV0YWJsZS4gKilcbiAgdHlwZSAnYSBhcnJheSA9ICdhIEFycmF5LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfYXJyYXkgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gaW50ID0gQXJyYXkuY29tcGFyZVxuICBsZXQgZXF1YWxfYXJyYXkgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIGFycmF5IC0+ICdhIGFycmF5IC0+IGJvb2wgPSBBcnJheS5lcXVhbFxuXG4gIGxldCBhcnJheV9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSBhcnJheSA9XG4gICAgQXJyYXkudF9vZl9zZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfYXJyYXkgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgYXJyYXkgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBBcnJheS5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgKGFycmF5X3NleHBfZ3JhbW1hciA6XG4gICAgICAgICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSBhcnJheSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gQXJyYXkudF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBib29sID0gQm9vbC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2Jvb2wgPSAoQm9vbC5jb21wYXJlIDogYm9vbCAtPiBib29sIC0+IGludClcbiAgbGV0IGVxdWFsX2Jvb2wgPSAoQm9vbC5lcXVhbCA6IGJvb2wgLT4gYm9vbCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2Jvb2wgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGJvb2wgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBCb29sLmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2Jvb2wgOiBib29sIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBCb29sLmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgYm9vbF9vZl9zZXhwID0gKEJvb2wudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGJvb2wpXG4gIGxldCBzZXhwX29mX2Jvb2wgPSAoQm9vbC5zZXhwX29mX3QgOiBib29sIC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChib29sX3NleHBfZ3JhbW1hciA6IGJvb2wgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gQm9vbC50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBjaGFyID0gQ2hhci50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2NoYXIgPSAoQ2hhci5jb21wYXJlIDogY2hhciAtPiBjaGFyIC0+IGludClcbiAgbGV0IGVxdWFsX2NoYXIgPSAoQ2hhci5lcXVhbCA6IGNoYXIgLT4gY2hhciAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2NoYXIgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGNoYXIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBDaGFyLmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2NoYXIgOiBjaGFyIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBDaGFyLmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgY2hhcl9vZl9zZXhwID0gKENoYXIudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGNoYXIpXG4gIGxldCBzZXhwX29mX2NoYXIgPSAoQ2hhci5zZXhwX29mX3QgOiBjaGFyIC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChjaGFyX3NleHBfZ3JhbW1hciA6IGNoYXIgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gQ2hhci50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBleG4gPSBFeG4udCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICBsZXQgc2V4cF9vZl9leG4gPSAoRXhuLnNleHBfb2ZfdCA6IGV4biAtPiBTZXhwbGliMC5TZXhwLnQpXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGZsb2F0ID0gRmxvYXQudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9mbG9hdCA9IChGbG9hdC5jb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50KVxuICBsZXQgZXF1YWxfZmxvYXQgPSAoRmxvYXQuZXF1YWwgOiBmbG9hdCAtPiBmbG9hdCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2Zsb2F0IDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBmbG9hdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIEZsb2F0Lmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2Zsb2F0IDogZmxvYXQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IEZsb2F0Lmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgZmxvYXRfb2Zfc2V4cCA9IChGbG9hdC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gZmxvYXQpXG4gIGxldCBzZXhwX29mX2Zsb2F0ID0gKEZsb2F0LnNleHBfb2ZfdCA6IGZsb2F0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChmbG9hdF9zZXhwX2dyYW1tYXIgOiBmbG9hdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBGbG9hdC50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBpbnQgPSBJbnQudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9pbnQgPSAoSW50LmNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludClcbiAgbGV0IGVxdWFsX2ludCA9IChJbnQuZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfaW50IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGludCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBJbnQuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfaW50IDogaW50IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBJbnQuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBpbnRfb2Zfc2V4cCA9IChJbnQudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGludClcbiAgbGV0IHNleHBfb2ZfaW50ID0gKEludC5zZXhwX29mX3QgOiBpbnQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGludF9zZXhwX2dyYW1tYXIgOiBpbnQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gSW50LnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGludDMyID0gSW50MzIudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9pbnQzMiA9IChJbnQzMi5jb21wYXJlIDogaW50MzIgLT4gaW50MzIgLT4gaW50KVxuICBsZXQgZXF1YWxfaW50MzIgPSAoSW50MzIuZXF1YWwgOiBpbnQzMiAtPiBpbnQzMiAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2ludDMyIDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBpbnQzMiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIEludDMyLmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2ludDMyIDogaW50MzIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IEludDMyLmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgaW50MzJfb2Zfc2V4cCA9IChJbnQzMi50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gaW50MzIpXG4gIGxldCBzZXhwX29mX2ludDMyID0gKEludDMyLnNleHBfb2ZfdCA6IGludDMyIC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChpbnQzMl9zZXhwX2dyYW1tYXIgOiBpbnQzMiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBJbnQzMi50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBpbnQ2NCA9IEludDY0LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfaW50NjQgPSAoSW50NjQuY29tcGFyZSA6IGludDY0IC0+IGludDY0IC0+IGludClcbiAgbGV0IGVxdWFsX2ludDY0ID0gKEludDY0LmVxdWFsIDogaW50NjQgLT4gaW50NjQgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9pbnQ2NCA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gaW50NjQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBJbnQ2NC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9pbnQ2NCA6IGludDY0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBJbnQ2NC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGludDY0X29mX3NleHAgPSAoSW50NjQudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGludDY0KVxuICBsZXQgc2V4cF9vZl9pbnQ2NCA9IChJbnQ2NC5zZXhwX29mX3QgOiBpbnQ2NCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoaW50NjRfc2V4cF9ncmFtbWFyIDogaW50NjQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gSW50NjQudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgJ2EgbGlzdCA9ICdhIExpc3QudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9saXN0IDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIGxpc3QgLT4gJ2EgbGlzdCAtPiBpbnQgPSBMaXN0LmNvbXBhcmVcbiAgbGV0IGVxdWFsX2xpc3QgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIGxpc3QgLT4gJ2EgbGlzdCAtPiBib29sID0gTGlzdC5lcXVhbFxuXG4gIGxldCBoYXNoX2ZvbGRfbGlzdCA6XG4gICAgJ2EuXG4gICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiAnYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgLT4gJ2EgbGlzdFxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgID1cbiAgICBMaXN0Lmhhc2hfZm9sZF90XG4gIDs7XG5cbiAgbGV0IGxpc3Rfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgbGlzdCA9XG4gICAgTGlzdC50X29mX3NleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl9saXN0IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIGxpc3QgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBMaXN0LnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCAobGlzdF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSBsaXN0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gTGlzdC50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIG5hdGl2ZWludCA9IE5hdGl2ZWludC50XG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX25hdGl2ZWludCA9IChOYXRpdmVpbnQuY29tcGFyZSA6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gaW50KVxuICBsZXQgZXF1YWxfbmF0aXZlaW50ID0gKE5hdGl2ZWludC5lcXVhbCA6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9uYXRpdmVpbnQgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IG5hdGl2ZWludCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIE5hdGl2ZWludC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IE5hdGl2ZWludC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IG5hdGl2ZWludF9vZl9zZXhwID0gKE5hdGl2ZWludC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gbmF0aXZlaW50KVxuICBsZXQgc2V4cF9vZl9uYXRpdmVpbnQgPSAoTmF0aXZlaW50LnNleHBfb2ZfdCA6IG5hdGl2ZWludCAtPiBTZXhwbGliMC5TZXhwLnQpXG5cbiAgbGV0IChuYXRpdmVpbnRfc2V4cF9ncmFtbWFyIDogbmF0aXZlaW50IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgTmF0aXZlaW50LnRfc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlICdhIG9wdGlvbiA9ICdhIE9wdGlvbi50XG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX29wdGlvbiA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uIC0+IGludCA9XG4gICAgT3B0aW9uLmNvbXBhcmVcbiAgOztcblxuICBsZXQgZXF1YWxfb3B0aW9uIDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uIC0+IGJvb2wgPVxuICAgIE9wdGlvbi5lcXVhbFxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfb3B0aW9uIDpcbiAgICAnYS5cbiAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+ICdhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAtPiAnYSBvcHRpb25cbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICA9XG4gICAgT3B0aW9uLmhhc2hfZm9sZF90XG4gIDs7XG5cbiAgbGV0IG9wdGlvbl9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSBvcHRpb24gPVxuICAgIE9wdGlvbi50X29mX3NleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl9vcHRpb24gOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2Egb3B0aW9uIC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgT3B0aW9uLnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCAob3B0aW9uX3NleHBfZ3JhbW1hciA6XG4gICAgICAgICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSBvcHRpb24gU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IE9wdGlvbi50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlICdhIHJlZiA9ICdhIFJlZi50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX3JlZiA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSByZWYgLT4gJ2EgcmVmIC0+IGludCA9IFJlZi5jb21wYXJlXG4gIGxldCBlcXVhbF9yZWYgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHJlZiAtPiAnYSByZWYgLT4gYm9vbCA9IFJlZi5lcXVhbFxuXG4gIGxldCByZWZfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgcmVmID1cbiAgICBSZWYudF9vZl9zZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfcmVmIDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHJlZiAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIFJlZi5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgKHJlZl9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSByZWYgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBSZWYudF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBzdHJpbmcgPSBTdHJpbmcudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9zdHJpbmcgPSAoU3RyaW5nLmNvbXBhcmUgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGludClcbiAgbGV0IGVxdWFsX3N0cmluZyA9IChTdHJpbmcuZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfc3RyaW5nIDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBzdHJpbmcgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBTdHJpbmcuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfc3RyaW5nIDogc3RyaW5nIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBTdHJpbmcuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBzdHJpbmdfb2Zfc2V4cCA9IChTdHJpbmcudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHN0cmluZylcbiAgbGV0IHNleHBfb2Zfc3RyaW5nID0gKFN0cmluZy5zZXhwX29mX3QgOiBzdHJpbmcgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHN0cmluZ19zZXhwX2dyYW1tYXIgOiBzdHJpbmcgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gU3RyaW5nLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGJ5dGVzID0gQnl0ZXMudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9ieXRlcyA9IChCeXRlcy5jb21wYXJlIDogYnl0ZXMgLT4gYnl0ZXMgLT4gaW50KVxuICBsZXQgZXF1YWxfYnl0ZXMgPSAoQnl0ZXMuZXF1YWwgOiBieXRlcyAtPiBieXRlcyAtPiBib29sKVxuICBsZXQgYnl0ZXNfb2Zfc2V4cCA9IChCeXRlcy50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gYnl0ZXMpXG4gIGxldCBzZXhwX29mX2J5dGVzID0gKEJ5dGVzLnNleHBfb2ZfdCA6IGJ5dGVzIC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChieXRlc19zZXhwX2dyYW1tYXIgOiBieXRlcyBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBCeXRlcy50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSB1bml0ID0gVW5pdC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX3VuaXQgPSAoVW5pdC5jb21wYXJlIDogdW5pdCAtPiB1bml0IC0+IGludClcbiAgbGV0IGVxdWFsX3VuaXQgPSAoVW5pdC5lcXVhbCA6IHVuaXQgLT4gdW5pdCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX3VuaXQgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHVuaXQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBVbml0Lmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX3VuaXQgOiB1bml0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBVbml0Lmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdW5pdF9vZl9zZXhwID0gKFVuaXQudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHVuaXQpXG4gIGxldCBzZXhwX29mX3VuaXQgPSAoVW5pdC5zZXhwX29mX3QgOiB1bml0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh1bml0X3NleHBfZ3JhbW1hciA6IHVuaXQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gVW5pdC50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgKCoqIEZvcm1hdCBzdHVmZiAqKVxuXG4gIHR5cGUgbm9ucmVjICgnYSwgJ2IsICdjKSBmb3JtYXQgPSAoJ2EsICdiLCAnYykgZm9ybWF0XG4gIHR5cGUgbm9ucmVjICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NCA9ICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NFxuICB0eXBlIG5vbnJlYyAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG5cbiAgKCoqIExpc3Qgb3BlcmF0b3JzICopXG5cbiAgaW5jbHVkZSBMaXN0LkluZml4XG5cbiAgKCoqIEludCBvcGVyYXRvcnMgYW5kIGNvbXBhcmlzb25zICopXG5cbiAgaW5jbHVkZSBJbnQuT1xuICBpbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICAoKiogRmxvYXQgb3BlcmF0b3JzICopXG5cbiAgaW5jbHVkZSBGbG9hdC5PX2RvdFxuXG4gICgqIFRoaXMgaXMgZGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgdG8gYmUgb3B0aW1pemVkIGF3YXkgaW4gbW9yZSBjb250ZXh0cy4gKilcblxuICAoKiogUmV2ZXJzZSBhcHBsaWNhdGlvbiBvcGVyYXRvci4gW3ggfD4gZyB8PiBmXSBpcyBlcXVpdmFsZW50IHRvIFtmIChnICh4KSldLiAqKVxuICBleHRlcm5hbCAoIHw+ICkgOiAnYSAtPiAoJ2EgLT4gJ2IpIC0+ICdiID0gXCIlcmV2YXBwbHlcIlxuXG4gICgqKiBBcHBsaWNhdGlvbiBvcGVyYXRvci4gW2cgQEAgZiBAQCB4XSBpcyBlcXVpdmFsZW50IHRvIFtnIChmICh4KSldLiAqKVxuICBleHRlcm5hbCAoIEBAICkgOiAoJ2EgLT4gJ2IpIC0+ICdhIC0+ICdiID0gXCIlYXBwbHlcIlxuXG4gICgqKiBCb29sZWFuIG9wZXJhdGlvbnMgKilcblxuICAoKiBUaGVzZSBuZWVkIHRvIGJlIGRlY2xhcmVkIGFzIGFuIGV4dGVybmFsIHRvIGdldCB0aGUgbGF6eSBiZWhhdmlvciAqKVxuICBleHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuICBleHRlcm5hbCAoIHx8ICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG4gIGV4dGVybmFsIG5vdCA6IGJvb2wgLT4gYm9vbCA9IFwiJWJvb2xub3RcIlxuXG4gICgqIFRoaXMgbXVzdCBiZSBkZWNsYXJlZCBhcyBhbiBleHRlcm5hbCBmb3IgdGhlIHdhcm5pbmdzIHRvIHdvcmsgcHJvcGVybHkuICopXG4gIGV4dGVybmFsIGlnbm9yZSA6IF8gLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbiAgKCoqIENvbW1vbiBzdHJpbmcgb3BlcmF0aW9ucyAqKVxuICBsZXQgKCBeICkgPSBTdHJpbmcuKCBeIClcblxuICAoKiogUmVmZXJlbmNlIG9wZXJhdGlvbnMgKilcblxuICAoKiBEZWNsYXJlZCBhcyBhbiBleHRlcm5hbHMgc28gdGhhdCB0aGUgY29tcGlsZXIgc2tpcHMgdGhlIGNhbWxfbW9kaWZ5IHdoZW4gcG9zc2libGUgYW5kXG4gICAgIHRvIGtlZXAgcmVmZXJlbmNlIHVuYm94aW5nIHdvcmtpbmcgKilcbiAgZXh0ZXJuYWwgKCAhICkgOiAnYSByZWYgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuICBleHRlcm5hbCByZWYgOiAnYSAtPiAnYSByZWYgPSBcIiVtYWtlbXV0YWJsZVwiXG4gIGV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcblxuICAoKiogUGFpciBvcGVyYXRpb25zICopXG5cbiAgbGV0IGZzdCA9IGZzdFxuICBsZXQgc25kID0gc25kXG5cbiAgKCoqIEV4Y2VwdGlvbnMgc3R1ZmYgKilcblxuICAoKiBEZWNsYXJlZCBhcyBhbiBleHRlcm5hbCBzbyB0aGF0IHRoZSBjb21waWxlciBtYXkgcmV3cml0ZSAnJXJhaXNlJyBhcyAnJXJlcmFpc2UnLiAqKVxuICBleHRlcm5hbCByYWlzZSA6IGV4biAtPiBfID0gXCIlcmFpc2VcIlxuXG4gIGxldCBmYWlsd2l0aCA9IGZhaWx3aXRoXG4gIGxldCBpbnZhbGlkX2FyZyA9IGludmFsaWRfYXJnXG4gIGxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4gICgqKiBNaXNjICopXG5cbiAgbGV0IHBoeXNfZXF1YWwgPSBwaHlzX2VxdWFsXG5cbiAgZXh0ZXJuYWwgZm9yY2UgOiAnYSBMYXp5LnQgLT4gJ2EgPSBcIiVsYXp5X2ZvcmNlXCJcbmVuZFxuXG5pbmNsdWRlIEV4cG9ydFxuXG5pbmNsdWRlIENvbnRhaW5lcl9pbnRmLkV4cG9ydCAoKiogQGlubGluZSAqKVxuXG5leGNlcHRpb24gTm90X2ZvdW5kX3MgPSBOb3RfZm91bmRfc1xuXG4oKiBXZSBwZXJmb3JtIHRoZXNlIHNpZGUgZWZmZWN0cyBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGVtIHRvIHJ1biBmb3IgYW55IGNvZGUgdGhhdCB1c2VzXG4gICBbQmFzZV0uICBJZiB0aGlzIHdlcmUgaW4gYW5vdGhlciBtb2R1bGUgaW4gW0Jhc2VdIHRoYXQgd2FzIG5vdCB1c2VkIGluIHNvbWUgcHJvZ3JhbSxcbiAgIHRoZW4gdGhlIHNpZGUgZWZmZWN0cyBtaWdodCBub3QgYmUgcnVuIGluIHRoYXQgcHJvZ3JhbS4gIFRoaXMgd2lsbCBydW4gYXMgbG9uZyBhcyB0aGVcbiAgIHByb2dyYW0gcmVmZXJzIHRvIGF0IGxlYXN0IG9uZSB2YWx1ZSBkaXJlY3RseSBpbiBbQmFzZV07IHJlZmVycmluZyB0byB2YWx1ZXMgaW5cbiAgIFtCYXNlLkJvb2xdLCBmb3IgZXhhbXBsZSwgaXMgbm90IHN1ZmZpY2llbnQuICopXG5sZXQgKCkgPSBCYWNrdHJhY2UuaW5pdGlhbGl6ZV9tb2R1bGUgKClcbiIsIm1vZHVsZSBDb252ID0gU2V4cGxpYjAuU2V4cF9jb252XG5tb2R1bGUgQ29udl9lcnJvciA9IFNleHBsaWIwLlNleHBfY29udl9lcnJvclxubW9kdWxlIFNleHBfZ3JhbW1hciA9IFNleHBsaWIwLlNleHBfZ3JhbW1hclxuXG5tb2R1bGUgU2V4cCA9IHN0cnVjdFxuICBpbmNsdWRlIFNleHBsaWIwLlNleHBcblxuICBsZXQgdF9zZXhwX2dyYW1tYXIgPSBDb252LnNleHBfdF9zZXhwX2dyYW1tYXJcbmVuZFxuXG5tb2R1bGUgU2V4cGFibGUgPSBTZXhwbGliMC5TZXhwYWJsZVxuIiwibW9kdWxlIExpc3QgPSBMaXN0XG5cbm1vZHVsZSBFbnVtZXJhYmxlID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBhbGwgOiB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdhIHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2IgbGlzdCAtPiAoJ2EsICdiKSB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYiBsaXN0IC0+ICdjIGxpc3QgLT4gKCdhLCAnYiwgJ2MpIHQgbGlzdFxuICBlbmRcbmVuZFxuIiwiWyUlaW1wb3J0IFwiY29uZmlnLmhcIl1cblxub3BlbiEgQmFzZVxuXG5bJSVpZmRlZiBKU0NfQVJDSF9TSVhUWUZPVVJdXG5cbmV4dGVybmFsIG5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVyb1xuICA6ICB1bml0XG4gIC0+IEludDYzLnRcbiAgPSBcInRpbWVfbm93X25hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVyb1wiXG5bQEBub2FsbG9jXVxuXG5bJSVlbHNlXVxuXG5leHRlcm5hbCBuYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm9cbiAgOiAgdW5pdFxuICAtPiBJbnQ2My50XG4gID0gXCJ0aW1lX25vd19uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm9cIlxuXG5bJSVlbmRpZl1cblslJWlmZGVmIEpTQ19QT1NJWF9USU1FUlNdXG5cbmxldFtAY29sZF0gZ2V0dGltZV9mYWlsZWQgKCkgPSBmYWlsd2l0aCBcImNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUpIGZhaWxlZFwiXG5cblslJWVsc2VdXG5cbmxldFtAY29sZF0gZ2V0dGltZV9mYWlsZWQgKCkgPSBmYWlsd2l0aCBcImdldHRpbWVvZmRheSBmYWlsZWRcIlxuXG5bJSVlbmRpZl1cblxubGV0IG5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2ggKCkgPVxuICBsZXQgdCA9IG5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVybyAoKSBpblxuICBpZiBJbnQ2My4oIDw+ICkgdCBJbnQ2My56ZXJvIHRoZW4gdCBlbHNlIGdldHRpbWVfZmFpbGVkICgpXG47O1xuIiwibW9kdWxlIFRlc3RfcmVzdWx0ID0gc3RydWN0XG4gIHR5cGUgdCA9IFN1Y2Nlc3MgfCBGYWlsdXJlIHwgRXJyb3JcblxuICBsZXQgdG9fZXhpdF9jb2RlID0gZnVuY3Rpb25cbiAgICB8IFN1Y2Nlc3MgLT4gMFxuICAgIHwgRmFpbHVyZSAtPiAyXG4gICAgfCBFcnJvciAgIC0+IDFcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nID0gZnVuY3Rpb25cbiAgICB8IFN1Y2Nlc3MgLT4gXCJzdWNjZXNzXCJcbiAgICB8IEZhaWx1cmUgLT4gXCJmYWlsdXJlXCJcbiAgICB8IEVycm9yICAgLT4gXCJlcnJvclwiXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmUgdDEgdDIgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBTdWNjZXNzLCBTdWNjZXNzICAgICAgICAtPiBTdWNjZXNzXG4gICAgfCBFcnJvciAgLCBfIHwgXywgRXJyb3IgICAtPiBFcnJvclxuICAgIHwgRmFpbHVyZSwgXyB8IF8sIEZhaWx1cmUgLT4gRmFpbHVyZVxuICA7O1xuXG4gIGxldCBjb21iaW5lX2FsbCB0cyA9IExpc3QuZm9sZF9sZWZ0IGNvbWJpbmUgU3VjY2VzcyB0c1xuZW5kXG5cbmxldCBwYXJzZV9hcmd2IGFyZ3YgbCBmIG1zZyA9XG4gIHRyeVxuICAgIEFyZy5wYXJzZV9hcmd2IGFyZ3YgbCBmIG1zZ1xuICB3aXRoXG4gIHwgQXJnLkJhZCBtc2cgLT4gUHJpbnRmLmVwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAxXG4gIHwgQXJnLkhlbHAgbXNnIC0+IFByaW50Zi5wcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG47O1xuXG50eXBlIGRlc2NyID0gc3RyaW5nXG5sZXQgdGVzdF9tb2R1bGVzX3JhbiA9IHJlZiAwXG5sZXQgdGVzdF9tb2R1bGVzX2ZhaWxlZCA9IHJlZiAwXG5sZXQgdGVzdHNfcmFuID0gcmVmIDBcbmxldCB0ZXN0c19mYWlsZWQgPSByZWYgMFxubGV0IGR5bmFtaWNfbGliIDogc3RyaW5nIG9wdGlvbiByZWYgPSByZWYgTm9uZVxudHlwZSBmaWxlbmFtZSA9IHN0cmluZ1xudHlwZSBsaW5lX251bWJlciA9IGludFxudHlwZSBzdGFydF9wb3MgPSBpbnRcbnR5cGUgZW5kX3BvcyA9IGludFxudHlwZSBjb25maWcgPSAobW9kdWxlIElubGluZV90ZXN0X2NvbmZpZy5TKVxudHlwZSAnYSB0ZXN0X2Z1bmN0aW9uX2FyZ3NcbiAgPSBjb25maWc6Y29uZmlnXG4gIC0+IGRlc2NyOmRlc2NyIExhenkudFxuICAtPiB0YWdzOnN0cmluZyBsaXN0XG4gIC0+IGZpbGVuYW1lOmZpbGVuYW1lXG4gIC0+IGxpbmVfbnVtYmVyOmxpbmVfbnVtYmVyXG4gIC0+IHN0YXJ0X3BvczpzdGFydF9wb3NcbiAgLT4gZW5kX3BvczplbmRfcG9zXG4gIC0+ICdhXG5cbm1vZHVsZSBUYWdfcHJlZGljYXRlID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgeyByZXF1aXJlZF90YWdzICA6IHN0cmluZyBsaXN0XG4gICAgOyBkcm9wcGVkX3RhZ3MgOiBzdHJpbmcgbGlzdFxuICAgIH1cblxuICBsZXQgZW5hYmxlX2V2ZXJ5dGhpbmcgPSB7IHJlcXVpcmVkX3RhZ3MgPSBbXTsgZHJvcHBlZF90YWdzID0gW10gfVxuXG4gIGxldCBkcm9wIHQgdGFnID1cbiAgICB7IGRyb3BwZWRfdGFncyA9IHRhZyA6OiB0LmRyb3BwZWRfdGFnc1xuICAgIDsgcmVxdWlyZWRfdGFncyA9IExpc3QuZmlsdGVyICgoPD4pIHRhZykgdC5yZXF1aXJlZF90YWdzXG4gICAgfVxuXG4gIGxldCByZXF1aXJlIHQgdGFnID1cbiAgICB7IGRyb3BwZWRfdGFncyA9IExpc3QuZmlsdGVyICgoPD4pIHRhZykgdC5kcm9wcGVkX3RhZ3NcbiAgICA7IHJlcXVpcmVkX3RhZ3MgPSB0YWcgOjogdC5yZXF1aXJlZF90YWdzXG4gICAgfVxuXG4gIGxldCBlbnRpcmVfbW9kdWxlX2Rpc2FibGVkIHQgfnBhcnRpYWxfdGFnczp0YWdzID1cbiAgICBMaXN0LmV4aXN0cyAoZnVuIGRyb3BwZWQgLT4gTGlzdC5tZW0gZHJvcHBlZCB0YWdzKSB0LmRyb3BwZWRfdGFnc1xuXG4gIGxldCBkaXNhYmxlZCB0IH5jb21wbGV0ZV90YWdzOnRhZ3MgPVxuICAgIExpc3QuZXhpc3RzIChmdW4gcmVxIC0+IG5vdCAoTGlzdC5tZW0gcmVxIHRhZ3MpKSB0LnJlcXVpcmVkX3RhZ3NcbiAgICB8fCBMaXN0LmV4aXN0cyAoZnVuIGRyb3BwZWQgLT4gTGlzdC5tZW0gZHJvcHBlZCB0YWdzKSB0LmRyb3BwZWRfdGFnc1xuZW5kXG5cblxudHlwZSB3aGljaF90ZXN0cyA9XG4gIHsgbGlibmFtZSA6IHN0cmluZ1xuICA7IG9ubHlfdGVzdF9sb2NhdGlvbiA6IChmaWxlbmFtZSAqIGxpbmVfbnVtYmVyIG9wdGlvbiAqIGJvb2wgcmVmKSBsaXN0XG4gIDsgbmFtZV9maWx0ZXIgOiBzdHJpbmcgbGlzdFxuICA7IHdoaWNoX3RhZ3MgOiBUYWdfcHJlZGljYXRlLnRcbiAgfVxudHlwZSB0ZXN0X21vZGUgPVxuICB7IHdoaWNoX3Rlc3RzIDogd2hpY2hfdGVzdHNcbiAgOyB3aGF0X3RvX2RvIDpcbiAgICAgIFsgYFJ1bl9wYXJ0aXRpb24gb2Ygc3RyaW5nIG9wdGlvblxuICAgICAgfCBgTGlzdF9wYXJ0aXRpb25zXG4gICAgICBdXG4gIH1cblxubW9kdWxlIEFjdGlvbiA6IHNpZ1xuICB0eXBlIHQgPSBbXG4gICAgfCBgSWdub3JlXG4gICAgfCBgVGVzdF9tb2RlIG9mIHRlc3RfbW9kZVxuICBdXG4gIHZhbCBnZXQgOiB1bml0IC0+IHRcbiAgdmFsIHNldCA6IHQgLT4gdW5pdFxuZW5kID0gc3RydWN0XG4gIHR5cGUgdCA9IFtcbiAgICB8IGBJZ25vcmVcbiAgICB8IGBUZXN0X21vZGUgb2YgdGVzdF9tb2RlXG4gIF1cbiAgbGV0IGFjdGlvbiA6IHQgcmVmID0gcmVmIGBJZ25vcmVcbiAgbGV0IGZvcmNlX2Ryb3AgPVxuICAgIHRyeSBpZ25vcmUgKFN5cy5nZXRlbnYgXCJGT1JDRV9EUk9QX0lOTElORV9URVNUXCIgOiBzdHJpbmcpOyB0cnVlXG4gICAgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcbiAgbGV0IGdldCAoKSA9XG4gICAgKCogVGhpcyBpcyB1c2VmdWwgd2hlbiBjb21waWxpbmcgdG8gamF2YXNjcmlwdC5cbiAgICAgICBKc19vZl9vY2FtbCBjYW4gc3RhdGljYWxseSBldmFsdWF0ZSBbU3lzLmdldGVudiBcIkZPUkNFX0RST1BfSU5MSU5FX1RFU1RcIl1cbiAgICAgICBhbmQgaW5saW5lIHRoZSByZXN1bHQgKFtgSWdub3JlXSkgd2hlbmV2ZXIgW2dldCAoKV0gaXMgY2FsbGVkLlxuICAgICAgIFVuaXQgdGVzdHMgY2FuIHRoZW4gYmUgdHJlYXRlZCBhcyBkZWFkY29kZSBzaW5jZSB0aGUgYXJndW1lbnQgW2ZdIG9mIHRoZSBbdGVzdF1cbiAgICAgICBmdW5jdGlvbiBiZWxvdyBpcyBuZXZlciB1c2VkLiAqKVxuICAgIGlmIGZvcmNlX2Ryb3BcbiAgICB0aGVuIGBJZ25vcmVcbiAgICBlbHNlICFhY3Rpb25cblxuICBsZXQgc2V0IHYgPSBhY3Rpb24gOj0gdlxuZW5kXG5cbm1vZHVsZSBQYXJ0aXRpb24gOiBzaWdcbiAgdmFsIGZvdW5kX3Rlc3QgOiB1bml0IC0+IHVuaXRcbiAgdmFsIHNldF9jdXJyZW50IDogc3RyaW5nIC0+IHVuaXRcbiAgdmFsIGlzX2N1cnJlbnQgOiBzdHJpbmcgb3B0aW9uIC0+IGJvb2xcbiAgdmFsIGFsbCA6IHVuaXQgLT4gc3RyaW5nIGxpc3RcbmVuZCA9IHN0cnVjdFxuICBsZXQgYWxsID0gSGFzaHRibC5jcmVhdGUgMjNcbiAgbGV0IGN1cnJlbnQgPSByZWYgXCJcIiAgbGV0IHNldF9jdXJyZW50IHggPSBjdXJyZW50IDo9IHhcbiAgbGV0IGZvdW5kX3Rlc3QgKCkgPVxuICAgIGlmICFjdXJyZW50IDw+IFwiXCIgJiYgbm90IChIYXNodGJsLm1lbSBhbGwgIWN1cnJlbnQpIHRoZW5cbiAgICAgIEhhc2h0YmwuYWRkIGFsbCAhY3VycmVudCAoKVxuICA7O1xuICBsZXQgaXNfY3VycmVudCA9IGZ1bmN0aW9uXG4gICAgfCBOb25lIC0+IHRydWVcbiAgICB8IFNvbWUgcCAtPiBwID0gIWN1cnJlbnRcbiAgOztcbiAgbGV0IGFsbCAoKSA9XG4gICAgTGlzdC5zb3J0IFN0cmluZy5jb21wYXJlXG4gICAgICAoSGFzaHRibC5mb2xkIChmdW4gayAoKSBhY2MgLT4gayA6OiBhY2MpIGFsbCBbXSlcbiAgOztcbmVuZFxuXG5tb2R1bGUgTW9kdWxlX2NvbnRleHQgPSBzdHJ1Y3RcbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICB0eXBlIG9uZV9tb2R1bGUgPVxuICAgICAgeyBkZXNjciA6IHN0cmluZ1xuICAgICAgOyB0YWdzIDogc3RyaW5nIGxpc3RcbiAgICAgIH1cblxuICAgIHR5cGUgdCA9IG9uZV9tb2R1bGUgbGlzdFxuXG4gICAgbGV0IGRlc2NyIHQgPSBMaXN0Lm1hcCAoZnVuIG0gLT4gbS5kZXNjcikgdFxuICAgIGxldCB0YWdzIHQgPSBMaXN0LmNvbmNhdCAoTGlzdC5tYXAgKGZ1biBtIC0+IG0udGFncykgdClcbiAgZW5kXG5cbiAgbGV0IGN1cnJlbnQgOiBULnQgcmVmID0gcmVmIFtdXG5cbiAgbGV0IHdpdGhfIH5kZXNjciB+dGFncyBmID1cbiAgICBsZXQgcHJldiA9ICFjdXJyZW50IGluXG4gICAgY3VycmVudCA6PSB7IFQuIGRlc2NyOyB0YWdzIH0gOjogcHJldjtcbiAgICB0cnlcbiAgICAgIGxldCB4ID0gZiAoKSBpblxuICAgICAgY3VycmVudCA6PSBwcmV2O1xuICAgICAgeFxuICAgIHdpdGggZSAtPlxuICAgICAgY3VycmVudCA6PSBwcmV2O1xuICAgICAgcmFpc2UgZVxuXG4gIGxldCBjdXJyZW50X2Rlc2NyICgpID0gVC5kZXNjciAhY3VycmVudFxuICBsZXQgY3VycmVudF90YWdzICAoKSA9IFQudGFncyAgIWN1cnJlbnRcbmVuZFxuXG5sZXQgdmVyYm9zZSA9IHJlZiBmYWxzZVxubGV0IHN0cmljdCA9IHJlZiBmYWxzZVxubGV0IHNob3dfY291bnRzID0gcmVmIGZhbHNlXG5sZXQgbGlzdF90ZXN0X25hbWVzID0gcmVmIGZhbHNlXG5sZXQgZGVsYXllZF9lcnJvcnMgPSByZWYgW11cbmxldCBzdG9wX29uX2Vycm9yID0gcmVmIGZhbHNlXG5cbmxldCBsb2cgPSByZWYgTm9uZVxuXG5sZXQgdGltZV9zZWMgPSByZWYgMC5cblxubGV0IHVzZV9jb2xvciA9IHJlZiB0cnVlXG5sZXQgaW5fcGxhY2UgID0gcmVmIGZhbHNlXG5sZXQgZGlmZl9jb21tYW5kID0gcmVmIE5vbmVcbmxldCBzb3VyY2VfdHJlZV9yb290ID0gcmVmIE5vbmVcbmxldCBhbGxvd19vdXRwdXRfcGF0dGVybnMgPSByZWYgZmFsc2VcblxubGV0IGRpc3BsYXllZF9kZXNjciAobGF6eSBkZXNjcikgZmlsZW5hbWUgbGluZSBzdGFydF9wb3MgZW5kX3BvcyA9XG4gIFByaW50Zi5zcHJpbnRmIFwiRmlsZSAlUywgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZCVzXCJcbiAgICBmaWxlbmFtZSBsaW5lIHN0YXJ0X3BvcyBlbmRfcG9zXG4gICAgKGlmIGRlc2NyID0gXCJcIiB0aGVuIFwiXCIgZWxzZSBcIjogXCIgXiBkZXNjcilcbmxldCBwYXJzZV9kZXNjciBzdHIgPVxuICB0cnkgU29tZSAoU2NhbmYuc3NjYW5mIHN0ciBcIiBGaWxlICVTICwgbGluZSAlZCAsIGNoYXJhY3RlcnMgJWQgLSAlZCAlIVwiXG4gICAgICAgICAgICAgIChmdW4gZmlsZSBsaW5lIF9zdGFydF9wb3MgX2VuZF9wb3MgLT4gZmlsZSwgU29tZSBsaW5lKSlcbiAgd2l0aCBfIC0+XG4gIHRyeSBTb21lIChTY2FuZi5zc2NhbmYgc3RyIFwiIEZpbGUgJVMgLCBsaW5lICVkICUhXCIgKGZ1biBmaWxlIGxpbmUgLT4gZmlsZSwgU29tZSBsaW5lKSlcbiAgd2l0aCBfIC0+XG4gIHRyeSBTb21lIChTY2FuZi5zc2NhbmYgc3RyIFwiIEZpbGUgJVMgJSFcIiAoZnVuIGZpbGUgLT4gZmlsZSwgTm9uZSkpXG4gIHdpdGggXyAtPiBOb25lXG5cbmxldCAoKSA9XG4gIG1hdGNoIEFycmF5LnRvX2xpc3QgU3lzLmFyZ3Ygd2l0aFxuICB8IG5hbWUgOjogXCJpbmxpbmUtdGVzdC1ydW5uZXJcIiA6OiBsaWIgOjogcmVzdFxuICAgIHdoZW4gQmFzZS5FeHBvcnRlZF9mb3Jfc3BlY2lmaWNfdXNlcy5hbV90ZXN0aW5nIC0+IGJlZ2luXG4gICAgICAoKiB3aGVuIHdlIHNlZSB0aGlzIGFyZ3VtZW50LCB3ZSBzd2l0Y2ggdG8gdGVzdCBtb2RlICopXG4gICAgICBsZXQgdGVzdHMgPSByZWYgW10gaW5cbiAgICAgIGxldCBsaXN0X3BhcnRpdGlvbnMgPSByZWYgZmFsc2UgaW5cbiAgICAgIGxldCBwYXJ0aXRpb24gPSByZWYgTm9uZSBpblxuICAgICAgbGV0IHRhZ19wcmVkaWNhdGUgPSByZWYgVGFnX3ByZWRpY2F0ZS5lbmFibGVfZXZlcnl0aGluZyBpblxuICAgICAgbGV0IG5hbWVfZmlsdGVyID0gcmVmIFtdIGluXG4gICAgICBwYXJzZV9hcmd2IChBcnJheS5vZl9saXN0IChuYW1lIDo6IHJlc3QpKSAoQXJnLmFsaWduIFtcbiAgICAgICAgXCItbGlzdC10ZXN0LW5hbWVzXCIsIEFyZy5Vbml0IChmdW4gKCkgLT4gbGlzdF90ZXN0X25hbWVzIDo9IHRydWU7IHZlcmJvc2UgOj0gdHJ1ZSksXG4gICAgICAgIFwiIERvIG5vdCBydW4gdGVzdHMgYnV0IHNob3cgd2hhdCB3b3VsZCBoYXZlIGJlZW4gcnVuXCI7XG4gICAgICAgIFwiLWxpc3QtcGFydGl0aW9uc1wiLCBBcmcuVW5pdCAoZnVuICgpIC0+IGxpc3RfcGFydGl0aW9ucyA6PSB0cnVlKSxcbiAgICAgICAgXCIgTGlzdHMgYWxsIHRoZSBwYXJ0aXRpb25zIHRoYXQgY29udGFpbiBhdCBsZWFzdCBvbmUgdGVzdCBvciB0ZXN0X21vZHVsZVwiO1xuICAgICAgICBcIi1wYXJ0aXRpb25cIiwgQXJnLlN0cmluZyAoZnVuIGkgLT4gcGFydGl0aW9uIDo9IFNvbWUgaSksXG4gICAgICAgIFwiIE9ubHkgcnVuIHRoZSB0ZXN0cyBpbiB0aGUgZ2l2ZW4gcGFydGl0aW9uXCI7XG4gICAgICAgIFwiLXZlcmJvc2VcIiwgQXJnLlNldCB2ZXJib3NlLCBcIiBTaG93IHRoZSB0ZXN0cyBhcyB0aGV5IHJ1blwiO1xuICAgICAgICBcIi1zdG9wLW9uLWVycm9yXCIsIEFyZy5TZXQgc3RvcF9vbl9lcnJvciwgXCIgUnVuIHRlc3RzIG9ubHkgdXAgdG8gdGhlIGZpcnN0IGVycm9yIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2Vzbid0IHdvcmsgZm9yIGV4cGVjdCB0ZXN0cylcIjtcbiAgICAgICAgXCItc3RyaWN0XCIsIEFyZy5TZXQgc3RyaWN0LCBcIiBFbmQgd2l0aCBhbiBlcnJvciBpZiBubyB0ZXN0cyB3ZXJlIHJ1blwiO1xuICAgICAgICBcIi1zaG93LWNvdW50c1wiLCBBcmcuU2V0IHNob3dfY291bnRzLCBcIiBTaG93IHRoZSBudW1iZXIgb2YgdGVzdHMgcmFuXCI7XG4gICAgICAgIFwiLWxvZ1wiLCBBcmcuVW5pdCAoZnVuICgpIC0+XG4gICAgICAgICAgKHRyeSBTeXMucmVtb3ZlIFwiaW5saW5lX3Rlc3RzLmxvZ1wiIHdpdGggXyAtPiAoKSk7XG4gICAgICAgICAgbG9nIDo9IFNvbWUgKG9wZW5fb3V0IFwiaW5saW5lX3Rlc3RzLmxvZ1wiKVxuICAgICAgICApLCBcIiBMb2cgdGhlIHRlc3RzIHJ1biBpbiBpbmxpbmVfdGVzdHMubG9nXCI7XG4gICAgICAgIFwiLWRyb3AtdGFnXCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+XG4gICAgICAgICAgdGFnX3ByZWRpY2F0ZSA6PSBUYWdfcHJlZGljYXRlLmRyb3AgIXRhZ19wcmVkaWNhdGUgc1xuICAgICAgICApLCBcInRhZyBPbmx5IHJ1biB0ZXN0cyBub3QgdGFnZ2VkIHdpdGggW3RhZ10gKG92ZXJyaWRlcyBwcmV2aW91cyAtcmVxdWlyZS10YWcpXCI7XG4gICAgICAgIFwiLXJlcXVpcmUtdGFnXCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+XG4gICAgICAgICAgdGFnX3ByZWRpY2F0ZSA6PSBUYWdfcHJlZGljYXRlLnJlcXVpcmUgIXRhZ19wcmVkaWNhdGUgc1xuICAgICAgICApLCBcInRhZyBPbmx5IHJ1biB0ZXN0cyB0YWdnZWQgd2l0aCBbdGFnXSAob3ZlcnJpZGVzIHByZXZpb3VzIC1kcm9wLXRhZylcIjtcbiAgICAgICAgXCItbWF0Y2hpbmdcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT4gbmFtZV9maWx0ZXIgOj0gcyA6OiAhbmFtZV9maWx0ZXIpLFxuICAgICAgICBcInN1YnN0cmluZyBPbmx5IHJ1biB0ZXN0cyB3aG9zZSBuYW1lcyBjb250YWluIHRoZSBnaXZlbiBzdWJzdHJpbmdcIjtcbiAgICAgICAgXCItb25seS10ZXN0XCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+XG4gICAgICAgICAgbGV0IGZpbGVuYW1lLCBpbmRleCA9XG4gICAgICAgICAgICBtYXRjaCBwYXJzZV9kZXNjciBzIHdpdGhcbiAgICAgICAgICAgIHwgU29tZSAoZmlsZSwgaW5kZXgpIC0+IGZpbGUsIGluZGV4XG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgaWYgU3RyaW5nLmNvbnRhaW5zIHMgJzonIHRoZW5cbiAgICAgICAgICAgICAgICBsZXQgaSA9IFN0cmluZy5pbmRleCBzICc6JyBpblxuICAgICAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IFN0cmluZy5zdWIgcyAwIGkgaW5cbiAgICAgICAgICAgICAgICBsZXQgaW5kZXhfc3RyaW5nID0gU3RyaW5nLnN1YiBzIChpICsgMSkgKFN0cmluZy5sZW5ndGggcyAtIGkgLSAxKSBpblxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9XG4gICAgICAgICAgICAgICAgICB0cnkgaW50X29mX3N0cmluZyBpbmRleF9zdHJpbmdcbiAgICAgICAgICAgICAgICAgIHdpdGggRmFpbHVyZSBfIC0+XG4gICAgICAgICAgICAgICAgICAgIFByaW50Zi5lcHJpbnRmXG4gICAgICAgICAgICAgICAgICAgICAgXCJBcmd1bWVudCAlcyBkb2Vzbid0IGZpdCB0aGUgZm9ybWF0IGZpbGVuYW1lWzpsaW5lX251bWJlcl1cXG4lIVwiIHM7XG4gICAgICAgICAgICAgICAgICAgIGV4aXQgMVxuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgZmlsZW5hbWUsIFNvbWUgaW5kZXhcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHMsIE5vbmVcbiAgICAgICAgICBpblxuICAgICAgICAgIHRlc3RzIDo9IChmaWxlbmFtZSwgaW5kZXgsIHJlZiBmYWxzZSkgOjogIXRlc3RzXG4gICAgICAgICksIFwibG9jYXRpb24gUnVuIG9ubHkgdGhlIHRlc3RzIHNwZWNpZmllZCBieSBhbGwgdGhlIC1vbmx5LXRlc3Qgb3B0aW9ucy5cbiAgICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbnMgY2FuIGJlIG9uZSBvZiB0aGVzZSBmb3JtczpcbiAgICAgICAgICAgICAgICAgICAgICAtIGZpbGUubWxcbiAgICAgICAgICAgICAgICAgICAgICAtIGZpbGUubWw6bGluZV9udW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAtIEZpbGUgXFxcImZpbGUubWxcXFwiXG4gICAgICAgICAgICAgICAgICAgICAgLSBGaWxlIFxcXCJmaWxlLm1sXFxcIiwgbGluZSAyM1xuICAgICAgICAgICAgICAgICAgICAgIC0gRmlsZSBcXFwiZmlsZS5tbFxcXCIsIGxpbmUgMjMsIGNoYXJhY3RlcnMgMi0zXCI7XG4gICAgICAgIFwiLW5vLWNvbG9yXCIsIEFyZy5DbGVhciB1c2VfY29sb3IsIFwiIFN1bW1hcml6ZSB0ZXN0cyB3aXRob3V0IHVzaW5nIGNvbG9yXCI7XG4gICAgICAgIFwiLWluLXBsYWNlXCIsIEFyZy5TZXQgaW5fcGxhY2UsIFwiIFVwZGF0ZSBleHBlY3QgdGVzdHMgaW4gcGxhY2VcIjtcbiAgICAgICAgXCItZGlmZi1jbWRcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT4gZGlmZl9jb21tYW5kIDo9IFNvbWUgcyksXG4gICAgICAgIFwiIERpZmYgY29tbWFuZCBmb3IgdGVzdHMgdGhhdCByZXF1aXJlIGRpZmZpbmcgKHVzZSAtIHRvIGRpc2FibGUgZGlmZmluZylcIjtcbiAgICAgICAgXCItYWxsb3ctb3V0cHV0LXBhdHRlcm5zXCIsIEFyZy5TZXQgYWxsb3dfb3V0cHV0X3BhdHRlcm5zLFxuICAgICAgICBcIiBBbGxvdyBvdXRwdXQgcGF0dGVybnMgaW4gdGVzdHMgZXhwZWN0YXRpb25zXCI7XG4gICAgICAgIFwiLXNvdXJjZS10cmVlLXJvb3RcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT4gc291cmNlX3RyZWVfcm9vdCA6PSBTb21lIHMpLFxuICAgICAgICBcIiBQYXRoIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZVwiXG4gICAgICBdKSAoZnVuIGFub24gLT5cbiAgICAgICAgUHJpbnRmLmVwcmludGYgXCIlczogdW5leHBlY3RlZCBhbm9ueW1vdXMgYXJndW1lbnQgJXNcXG4lIVwiIG5hbWUgYW5vbjtcbiAgICAgICAgZXhpdCAxXG4gICAgICApIChQcmludGYuc3ByaW50ZiBcIiVzICVzICVzIFthcmdzXVwiIG5hbWUgXCJpbmxpbmUtdGVzdC1ydW5uZXJcIiBsaWIpO1xuICAgICAgQWN0aW9uLnNldCAoXG4gICAgICAgIGBUZXN0X21vZGVcbiAgICAgICAgICB7IHdoaWNoX3Rlc3RzID1cbiAgICAgICAgICAgICAgeyBsaWJuYW1lID0gbGliXG4gICAgICAgICAgICAgIDsgb25seV90ZXN0X2xvY2F0aW9uID0gIXRlc3RzO1xuICAgICAgICAgICAgICAgIHdoaWNoX3RhZ3MgPSAhdGFnX3ByZWRpY2F0ZTtcbiAgICAgICAgICAgICAgICBuYW1lX2ZpbHRlciA9ICFuYW1lX2ZpbHRlclxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgOyB3aGF0X3RvX2RvID1cbiAgICAgICAgICAgICAgaWYgIWxpc3RfcGFydGl0aW9uc1xuICAgICAgICAgICAgICB0aGVuIGBMaXN0X3BhcnRpdGlvbnNcbiAgICAgICAgICAgICAgZWxzZSBgUnVuX3BhcnRpdGlvbiAhcGFydGl0aW9uXG4gICAgICAgICAgfSlcbiAgICBlbmRcbiAgfCBfIC0+XG4gICAgKClcblxubGV0IGFtX3Rlc3RfcnVubmVyID1cbiAgbWF0Y2ggQWN0aW9uLmdldCAoKSB3aXRoXG4gIHwgYFRlc3RfbW9kZSBfIC0+IHRydWVcbiAgfCBgSWdub3JlIC0+IGZhbHNlXG5cbmxldCBhbV9ydW5uaW5nX2lubGluZV90ZXN0X2Vudl92YXIgPVxuICAoKiBmb3IgYXBwcm94aW1hdGUgY29tcGF0aWJpbGl0eSwgZ2l2ZW4gdGhhdCB0aGUgdmFyaWFibGUgaXMgbm90IGV4YWN0bHkgZXF1aXZhbGVudFxuICAgICB0byB3aGF0IFBQWF9JTkxJTkVfVEVTVF9MSUJfQU1fUlVOTklOR19JTkxJTkVfVEVTVCB1c2VkIHRvIGJlICopXG4gIFwiVEVTVElOR19GUkFNRVdPUktcIlxuXG4oKiBUaGlzIHZhbHVlIGlzIGRlcHJlY2F0ZWQgaW4gcHJpbmNpcGxlLCBpbiBmYXZvciBvZiBDb3JlLmFtX3J1bm5pbmdfdGVzdCwgc29cbiAgIHdlJ3JlIGdvaW5nIHRvIGxpdmUgd2l0aCB0aGUgdWdseSBwYXR0ZXJuIG1hdGNoLiAqKVxubGV0IGFtX3J1bm5pbmdfaW5saW5lX3Rlc3QgPVxuICBtYXRjaCBTeXMuZ2V0ZW52IFwiUFBYX0lOTElORV9URVNUX0xJQl9BTV9SVU5OSU5HX0lOTElORV9URVNUXCIgd2l0aFxuICB8IChfIDogc3RyaW5nKSAtPiB0cnVlICgqIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcGVvcGxlIHNldHRpbmcgdGhpcyB2YXJpYWJsZSBkaXJlY3RseSAqKVxuICB8IGV4Y2VwdGlvbiBOb3RfZm91bmQgLT5cbiAgICBtYXRjaCBTeXMuZ2V0ZW52IGFtX3J1bm5pbmdfaW5saW5lX3Rlc3RfZW52X3ZhciB3aXRoXG4gICAgfCBcImlubGluZS10ZXN0XCIgLT4gdHJ1ZVxuICAgIHwgZXhjZXB0aW9uIE5vdF9mb3VuZCAtPiBmYWxzZVxuICAgIHwgXyAtPiBmYWxzZVxuXG5sZXQgdGVzdGluZyA9XG4gIGlmIGFtX3Rlc3RfcnVubmVyXG4gIHRoZW4gYFRlc3RpbmcgYEFtX3Rlc3RfcnVubmVyXG4gIGVsc2VcbiAgICAoaWYgYW1fcnVubmluZ19pbmxpbmVfdGVzdFxuICAgICB0aGVuIGBUZXN0aW5nIGBBbV9jaGlsZF9vZl90ZXN0X3J1bm5lclxuICAgICBlbHNlIGBOb3RfdGVzdGluZylcblxubGV0IHdhbGxfdGltZV9jbG9ja19ucyAoKSA9XG4gIFRpbWVfbm93Lm5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2ggKClcblxuXG5sZXQgd2hlcmVfdG9fY3V0X2JhY2t0cmFjZSA9IGxhenkgKFxuICBCYXNlLlN0cmluZy5TZWFyY2hfcGF0dGVybi5jcmVhdGUgKF9fTU9EVUxFX18gXiBcIi5cIiBeIFwidGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fc2VlZHNcIikpXG5cbmxldCB0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV9zZWVkcyBmID1cbiAgbGV0IGJlZm9yZV9ucyA9IHdhbGxfdGltZV9jbG9ja19ucyAoKSBpblxuICBsZXQgcmVzID1cbiAgICAoKiBUbyBhdm9pZCBub2lzZSBpbiBiYWNrdHJhY2VzLCB3ZSBkbyB0d28gdGhpbmdzLlxuXG4gICAgICAgV2UgdXNlIFt3aGVyZV90b19jdXRfYmFja3RyYWNlXSBhYm92ZSB0byByZW1vdmUgdGhlIHN0YWNrIGZyYW1lcyBmb3IgdGhlIGN1cnJlbnRcbiAgICAgICBmdW5jdGlvbiBhbmQgYW55IGZ1bmN0aW9uIGl0IGdldHMgaW5saW5lZCBpbnRvLCBhcyBpdCdzIG5vdCBvZiBhbnkgaW50ZXJlc3QgdG8gdGhlXG4gICAgICAgdXNlciwgc2luY2UgaXQncyBub3QgdGFsa2luZyBhYm91dCB0aGVpciB0ZXN0IGJ1dCBpbnN0ZWFkIHRhbGtpbmcgYWJvdXQgdGhlXG4gICAgICAgcHB4X2lubGluZV90ZXN0IG1hY2hpbmVyeS5cblxuICAgICAgIFdlIGFsc28gYXZvaWQgaW5zZXJ0aW5nIGFueSBjb2RlIGJldHdlZW4gdGhlIFtmXSB0aGF0IGNvbWVzIGZyb20gdGhlIHVzZXIncyBmaWxlXG4gICAgICAgYW5kIGdyYWJiaW5nIHRoZSBiYWNrdHJhY2UgZnJvbSBpdHMgZXhjZXB0aW9ucyAobm8gd3JhcHBpbmcgb2YgW2ZdIHdpdGggaGlnaCBvcmRlclxuICAgICAgIGZ1bmN0aW9ucyBsaWtlIEV4bi5wcm90ZWN0LCBvciAoZnVuICgpIC0+IGYgKCk7IHRydWUpKS4gKilcbiAgICB0cnkgT2sgKGYgKCkpXG4gICAgd2l0aCBleG4gLT4gRXJyb3IgKGV4biwgUHJpbnRleGMuZ2V0X2JhY2t0cmFjZSAoKSlcbiAgaW5cbiAgdGltZV9zZWMgOj0gQmFzZS5JbnQ2My4od2FsbF90aW1lX2Nsb2NrX25zICgpIC0gYmVmb3JlX25zIHw+IHRvX2Zsb2F0KSAgLy4gMWU5O1xuICByZXNcblxuXG5sZXQgc2F2ZWRfY2FtbF9yYW5kb21fc3RhdGUgPSBsYXp5IChTdGRsaWIuUmFuZG9tLlN0YXRlLm1ha2UgW3wgMTAwOyAyMDA7IDMwMCB8XSlcbmxldCBzYXZlZF9iYXNlX3JhbmRvbV9zdGF0ZSA9IGxhenkgKEJhc2UuUmFuZG9tLlN0YXRlLm1ha2UgW3wgMTExOyAyMjI7IDMzMyB8XSlcblxubGV0IHRpbWVfYW5kX3Jlc2V0X3JhbmRvbV9zZWVkcyBmID1cbiAgbGV0IGNhbWxfcmFuZG9tX3N0YXRlID0gU3RkbGliLlJhbmRvbS5nZXRfc3RhdGUgKCkgaW5cbiAgbGV0IGJhc2VfcmFuZG9tX3N0YXRlID0gQmFzZS5SYW5kb20uU3RhdGUuY29weSBCYXNlLlJhbmRvbS5TdGF0ZS5kZWZhdWx0IGluXG4gIFN0ZGxpYi5SYW5kb20uc2V0X3N0YXRlIChMYXp5LmZvcmNlIHNhdmVkX2NhbWxfcmFuZG9tX3N0YXRlKTtcbiAgQmFzZS5SYW5kb20uc2V0X3N0YXRlIChMYXp5LmZvcmNlIHNhdmVkX2Jhc2VfcmFuZG9tX3N0YXRlKTtcbiAgbGV0IHJlc3VsdCA9IHRpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tX3NlZWRzIGYgaW5cbiAgU3RkbGliLlJhbmRvbS5zZXRfc3RhdGUgY2FtbF9yYW5kb21fc3RhdGU7XG4gIEJhc2UuUmFuZG9tLnNldF9zdGF0ZSBiYXNlX3JhbmRvbV9zdGF0ZTtcbiAgcmVzdWx0XG5cbmxldCBzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyICgpID1cbiAgU3RyaW5nLmNvbmNhdCBcIlwiIChcbiAgICBMaXN0Lm1hcCAoZnVuIHMgLT4gXCIgIGluIFRFU1wiIF4gXCJUX01PRFVMRSBhdCBcIiBeIFN0cmluZy51bmNhcGl0YWxpemVfYXNjaWkgcyBeIFwiXFxuXCIpXG4gICAgICAoTW9kdWxlX2NvbnRleHQuY3VycmVudF9kZXNjciAoKSlcbiAgKVxuXG5sZXQgcG9zaXRpb25fbWF0Y2ggZGVmX2ZpbGVuYW1lIGRlZl9saW5lX251bWJlciBsID1cbiAgTGlzdC5leGlzdHMgKGZ1biAoZmlsZW5hbWUsIGxpbmVfbnVtYmVyX29wdCwgdXNlZCkgLT5cbiAgICBsZXQgcG9zaXRpb25fc3RhcnQgPVxuICAgICAgU3RyaW5nLmxlbmd0aCBkZWZfZmlsZW5hbWUgLSBTdHJpbmcubGVuZ3RoIGZpbGVuYW1lIGluXG4gICAgbGV0IGZvdW5kID1cbiAgICAgIHBvc2l0aW9uX3N0YXJ0ID49IDAgJiZcbiAgICAgIGxldCBlbmRfb2ZfZGVmX2ZpbGVuYW1lID1cbiAgICAgICAgU3RyaW5nLnN1YiBkZWZfZmlsZW5hbWVcbiAgICAgICAgICBwb3NpdGlvbl9zdGFydFxuICAgICAgICAgIChTdHJpbmcubGVuZ3RoIGZpbGVuYW1lKSBpblxuICAgICAgZW5kX29mX2RlZl9maWxlbmFtZSA9IGZpbGVuYW1lXG4gICAgICAmJiAocG9zaXRpb25fc3RhcnQgPSAwIHx8IGRlZl9maWxlbmFtZS5bcG9zaXRpb25fc3RhcnQgLSAxXSA9ICcvJylcbiAgICAgICYmIChtYXRjaCBsaW5lX251bWJlcl9vcHQgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgICB8IFNvbWUgbGluZV9udW1iZXIgLT4gZGVmX2xpbmVfbnVtYmVyID0gbGluZV9udW1iZXIpXG4gICAgaW5cbiAgICBpZiBmb3VuZCB0aGVuIHVzZWQgOj0gdHJ1ZTtcbiAgICBmb3VuZFxuICApIGxcblxubGV0IG5hbWVfZmlsdGVyX21hdGNoIH5uYW1lX2ZpbHRlciBkZXNjciA9XG4gIG1hdGNoIG5hbWVfZmlsdGVyIHdpdGhcbiAgfCBbXSAtPiB0cnVlXG4gIHwgXyA6OiBfIC0+XG4gICAgTGlzdC5leGlzdHMgKGZ1biBzdWJzdHJpbmcgLT4gQmFzZS5TdHJpbmcuaXNfc3Vic3RyaW5nIH5zdWJzdHJpbmcgZGVzY3IpIG5hbWVfZmlsdGVyXG5cbmxldCBwcmludF9kZWxheWVkX2Vycm9ycyAoKSA9XG4gIG1hdGNoIExpc3QucmV2ICFkZWxheWVkX2Vycm9ycyB3aXRoXG4gIHwgW10gLT4gKClcbiAgfCBfIDo6IF8gYXMgZGVsYXllZF9lcnJvcnMgLT5cbiAgICBQcmludGYuZXByaW50ZiBcIlxcbiVzXFxuJSFcIiAoU3RyaW5nLm1ha2UgNzAgJz0nKTtcbiAgICBMaXN0Lml0ZXIgKGZ1biBtZXNzYWdlIC0+XG4gICAgICBQcmludGYuZXByaW50ZiBcIiVzJSFcIiBtZXNzYWdlXG4gICAgKSBkZWxheWVkX2Vycm9yc1xuXG5sZXQgZXByaW50Zl9vcl9kZWxheSBmbXQgPVxuICBQcmludGYua3NwcmludGYgKGZ1biBzIC0+XG4gICAgaWYgIXZlcmJvc2UgdGhlbiBkZWxheWVkX2Vycm9ycyA6PSBzIDo6ICFkZWxheWVkX2Vycm9yc1xuICAgIGVsc2UgUHJpbnRmLmVwcmludGYgXCIlcyUhXCIgcztcbiAgICBpZiAhc3RvcF9vbl9lcnJvciB0aGVuIGJlZ2luXG4gICAgICBwcmludF9kZWxheWVkX2Vycm9ycyAoKTtcbiAgICAgIGV4aXQgMlxuICAgIGVuZFxuICApIGZtdFxuXG5sZXQgYWRkX2hvb2tzICgobW9kdWxlIEMpIDogY29uZmlnKSBmID1cbiAgZnVuICgpIC0+IEMucHJlX3Rlc3RfaG9vayAoKTsgZiAoKVxuXG5sZXQgaHVtX2JhY2t0cmFjZSBiYWNrdHJhY2UgPVxuICBsZXQgb3BlbiBCYXNlIGluXG4gIGJhY2t0cmFjZVxuICB8PiBTdHJpbmcuc3BsaXRfbGluZXNcbiAgfD4gTGlzdC50YWtlX3doaWxlIH5mOihmdW4gc3RyIC0+XG4gICAgbm90IChTdHJpbmcuU2VhcmNoX3BhdHRlcm4ubWF0Y2hlcyAoZm9yY2Ugd2hlcmVfdG9fY3V0X2JhY2t0cmFjZSkgc3RyKSlcbiAgfD4gTGlzdC5tYXAgfmY6KGZ1biBzdHIgLT4gXCIgIFwiIF4gc3RyIF4gXCJcXG5cIilcbiAgfD4gU3RyaW5nLmNvbmNhdFxuXG5sZXRbQGlubGluZSBuZXZlcl0gdGVzdF9pbm5lciB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWU6ZGVmX2ZpbGVuYW1lIH5saW5lX251bWJlcjpkZWZfbGluZV9udW1iZXJcbiAgICAgICAgICAgICAgICAgICAgIH5zdGFydF9wb3MgfmVuZF9wb3MgZiBib29sX29mX2YgPVxuICBtYXRjaCBBY3Rpb24uZ2V0ICgpIHdpdGhcbiAgfCBgSWdub3JlIC0+ICgpXG4gIHwgYFRlc3RfbW9kZSB7IHdoaWNoX3Rlc3RzID0geyBsaWJuYW1lOyBvbmx5X3Rlc3RfbG9jYXRpb247IHdoaWNoX3RhZ3M7IG5hbWVfZmlsdGVyIH07IHdoYXRfdG9fZG8gfSAtPlxuICAgIGxldCBmID0gYWRkX2hvb2tzIGNvbmZpZyBmIGluXG4gICAgbGV0IGRlc2NyID0gbGF6eSAoZGlzcGxheWVkX2Rlc2NyIGRlc2NyIGRlZl9maWxlbmFtZSBkZWZfbGluZV9udW1iZXIgc3RhcnRfcG9zIGVuZF9wb3MpIGluXG4gICAgbGV0IGNvbXBsZXRlX3RhZ3MgPSB0YWdzIEAgTW9kdWxlX2NvbnRleHQuY3VycmVudF90YWdzICgpIGluXG4gICAgbGV0IHNob3VsZF9ydW4gPVxuICAgICAgU29tZSBsaWJuYW1lID0gIWR5bmFtaWNfbGliXG4gICAgICAmJiBiZWdpbiBtYXRjaCBvbmx5X3Rlc3RfbG9jYXRpb24gd2l0aFxuICAgICAgICB8IFtdIC0+IHRydWVcbiAgICAgICAgfCBfIDo6IF8gLT4gcG9zaXRpb25fbWF0Y2ggZGVmX2ZpbGVuYW1lIGRlZl9saW5lX251bWJlciBvbmx5X3Rlc3RfbG9jYXRpb25cbiAgICAgIGVuZFxuICAgICAgJiYgbm90IChUYWdfcHJlZGljYXRlLmRpc2FibGVkIHdoaWNoX3RhZ3MgfmNvbXBsZXRlX3RhZ3MpXG4gICAgICAmJiBuYW1lX2ZpbHRlcl9tYXRjaCB+bmFtZV9maWx0ZXIgKExhenkuZm9yY2UgZGVzY3IpXG4gICAgaW5cbiAgICBpZiBzaG91bGRfcnVuIHRoZW4gYmVnaW5cbiAgICAgIG1hdGNoIHdoYXRfdG9fZG8gd2l0aFxuICAgICAgfCBgTGlzdF9wYXJ0aXRpb25zIC0+IFBhcnRpdGlvbi5mb3VuZF90ZXN0ICgpXG4gICAgICB8IGBSdW5fcGFydGl0aW9uIHBhcnRpdGlvbiAtPlxuICAgICAgICBpZiBQYXJ0aXRpb24uaXNfY3VycmVudCBwYXJ0aXRpb24gdGhlbiBiZWdpblxuICAgICAgICAgIGxldCBkZXNjciA9IExhenkuZm9yY2UgZGVzY3IgaW5cbiAgICAgICAgICBpbmNyIHRlc3RzX3JhbjtcbiAgICAgICAgICBiZWdpbiBtYXRjaCAhbG9nIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgY2ggLT4gUHJpbnRmLmZwcmludGYgY2ggXCIlc1xcbiVzXCIgZGVzY3IgKHN0cmluZ19vZl9tb2R1bGVfZGVzY3IgKCkpXG4gICAgICAgICAgZW5kO1xuICAgICAgICAgIGlmICF2ZXJib3NlIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIFByaW50Zi5wcmludGYgXCIlcyUhXCIgZGVzY3JcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgbGV0IHJlc3VsdCA9XG4gICAgICAgICAgICBpZiAhbGlzdF90ZXN0X25hbWVzXG4gICAgICAgICAgICB0aGVuIE9rIHRydWVcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgKCogU2VlIFt0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV9zZWVkc10gZm9yIHdoeSB3ZSB1c2UgW2Jvb2xfb2ZfZl1cbiAgICAgICAgICAgICAgICAgcmF0aGVyIGhhdmUgdGhlIGNhbGxlciB3cmFwIFtmXSB0byBhZGp1c3QgaXRzIHJldHVybiB2YWx1ZS4gKilcbiAgICAgICAgICAgICAgUmVzdWx0Lm1hcCBib29sX29mX2YgKHRpbWVfYW5kX3Jlc2V0X3JhbmRvbV9zZWVkcyBmKVxuICAgICAgICAgIGluXG4gICAgICAgICAgKCogSWYgIWxpc3RfdGVzdF9uYW1lcywgdGhpcyBpcyBpcyBhIGhhcm1sZXNzIHplcm8uICopXG4gICAgICAgICAgaWYgIXZlcmJvc2UgdGhlbiBQcmludGYucHJpbnRmIFwiICglLjNmIHNlYylcXG4lIVwiICF0aW1lX3NlYztcbiAgICAgICAgICBtYXRjaCByZXN1bHQgd2l0aFxuICAgICAgICAgIHwgT2sgdHJ1ZSAtPiAoKVxuICAgICAgICAgIHwgT2sgZmFsc2UgLT5cbiAgICAgICAgICAgIGluY3IgdGVzdHNfZmFpbGVkO1xuICAgICAgICAgICAgZXByaW50Zl9vcl9kZWxheSBcIiVzIGlzIGZhbHNlLlxcbiVzXFxuJSFcIiBkZXNjclxuICAgICAgICAgICAgICAoc3RyaW5nX29mX21vZHVsZV9kZXNjciAoKSlcbiAgICAgICAgICB8IEVycm9yIChleG4sIGJhY2t0cmFjZSkgLT5cbiAgICAgICAgICAgIGluY3IgdGVzdHNfZmFpbGVkO1xuICAgICAgICAgICAgbGV0IGJhY2t0cmFjZSA9IGh1bV9iYWNrdHJhY2UgYmFja3RyYWNlIGluXG4gICAgICAgICAgICBsZXQgZXhuX3N0ciA9IFNleHBsaWIwLlNleHBfY29udi5wcmludGV4Y19wcmVmZXJfc2V4cCBleG4gaW5cbiAgICAgICAgICAgIGxldCBzZXAgPSBpZiBTdHJpbmcuY29udGFpbnMgZXhuX3N0ciAnXFxuJyB0aGVuIFwiXFxuXCIgZWxzZSBcIiBcIiBpblxuICAgICAgICAgICAgZXByaW50Zl9vcl9kZWxheSBcIiVzIHRocmV3JXMlcy5cXG4lcyVzXFxuJSFcIiBkZXNjciBzZXAgZXhuX3N0clxuICAgICAgICAgICAgICBiYWNrdHJhY2UgKHN0cmluZ19vZl9tb2R1bGVfZGVzY3IgKCkpXG4gICAgICAgIGVuZFxuICAgIGVuZFxuXG5sZXQgc2V0X2xpYl9hbmRfcGFydGl0aW9uIHN0YXRpY19saWIgcGFydGl0aW9uID1cbiAgbWF0Y2ggIWR5bmFtaWNfbGliIHdpdGhcbiAgfCBTb21lIF8gLT5cbiAgICAoKiBwb3NzaWJsZSBpZiB0aGUgaW50ZXJmYWNlIGlzIHVzZWQgZXhwbGljaXRseSBvciBpZiB3ZSBoYXBwZW4gdG8gZHlubGluayBzb21ldGhpbmdcbiAgICAgICB0aGF0IGNvbnRhaW4gdGVzdHMgKilcbiAgICAoKVxuICB8IE5vbmUgLT5cbiAgICBkeW5hbWljX2xpYiA6PSBTb21lIHN0YXRpY19saWI7XG4gICAgbWF0Y2ggQWN0aW9uLmdldCAoKSB3aXRoXG4gICAgfCBgSWdub3JlIC0+ICgpXG4gICAgfCBgVGVzdF9tb2RlIHsgd2hpY2hfdGVzdHM7IHdoYXRfdG9fZG8gfSAtPlxuICAgICAgaWYgd2hpY2hfdGVzdHMubGlibmFtZSA9IHN0YXRpY19saWIgdGhlbiBiZWdpblxuICAgICAgICBsZXQgcmVxdWlyZXNfcGFydGl0aW9uID1cbiAgICAgICAgICBtYXRjaCB3aGF0X3RvX2RvIHdpdGhcbiAgICAgICAgICB8IGBMaXN0X3BhcnRpdGlvbnMgfCBgUnVuX3BhcnRpdGlvbiAoU29tZSBfKSAtPiB0cnVlXG4gICAgICAgICAgfCBgUnVuX3BhcnRpdGlvbiBOb25lIC0+IGZhbHNlXG4gICAgICAgIGluXG4gICAgICAgIGlmIHBhcnRpdGlvbiA9IFwiXCIgJiYgcmVxdWlyZXNfcGFydGl0aW9uXG4gICAgICAgIHRoZW4gZmFpbHdpdGggXCJwcHhfaW5saW5lX3Rlc3Q6IGNhbm5vdCB1c2UgLWxpc3QtcGFydGl0aW9uIG9yIC1wYXJ0aXRpb24gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBzcGVjaWZ5aW5nIGEgcGFydGl0aW9uIGF0IHByZXByb2Nlc3NpbmcgdGltZVwiXG4gICAgICAgIGVsc2UgUGFydGl0aW9uLnNldF9jdXJyZW50IHBhcnRpdGlvblxuICAgICAgZW5kXG5cbmxldCB1bnNldF9saWIgc3RhdGljX2xpYiA9XG4gIG1hdGNoICFkeW5hbWljX2xpYiB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICgqIG5vdCBnaXZpbmcgYW4gZXJyb3IsIGJlY2F1c2Ugd2hlbiBzb21lIGFubm95aW5nIHBlb3BsZSBwdXQgcGFfb3VuaXQgaW4gdGhlaXIgbGlzdFxuICAgICAgIG9mIHByZXByb2Nlc3NvcnMsIHBhX291bml0IGlzIHNldCB1cCB0d2ljZSBhbmQgd2UgaGF2ZSB0d28gY2FsbHMgdG8gdW5zZXRfbGliIGF0XG4gICAgICAgdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIHRoZSBzZWNvbmQgb25lIGNvbWVzIGluIHRoaXMgYnJhbmNoICopXG4gICAgKClcbiAgfCBTb21lIGxpYiAtPlxuICAgIGlmIGxpYiA9IHN0YXRpY19saWIgdGhlbiBkeW5hbWljX2xpYiA6PSBOb25lXG5cbmxldCB0ZXN0IH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZSB+bGluZV9udW1iZXIgfnN0YXJ0X3BvcyB+ZW5kX3BvcyBmID1cbiAgdGVzdF9pbm5lciB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWUgfmxpbmVfbnVtYmVyIH5zdGFydF9wb3MgfmVuZF9wb3NcbiAgICBmIChmdW4gYiAtPiBiKVxuXG5sZXQgdGVzdF91bml0IH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZSB+bGluZV9udW1iZXIgfnN0YXJ0X3BvcyB+ZW5kX3BvcyBmID1cbiAgdGVzdF9pbm5lciB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWUgfmxpbmVfbnVtYmVyIH5zdGFydF9wb3MgfmVuZF9wb3NcbiAgICBmIChmdW4gKCkgLT4gdHJ1ZSlcblxubGV0W0BpbmxpbmUgbmV2ZXJdIHRlc3RfbW9kdWxlIH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZTpkZWZfZmlsZW5hbWUgfmxpbmVfbnVtYmVyOmRlZl9saW5lX251bWJlclxuICAgICAgICAgICAgICAgICAgICAgfnN0YXJ0X3BvcyB+ZW5kX3BvcyBmID1cbiAgbWF0Y2ggQWN0aW9uLmdldCAoKSB3aXRoXG4gIHwgYElnbm9yZSAtPiAoKVxuICB8IGBUZXN0X21vZGUgeyB3aGljaF90ZXN0cyA9IHsgbGlibmFtZTsgb25seV90ZXN0X2xvY2F0aW9uID0gXzsgbmFtZV9maWx0ZXIgPSBfOyB3aGljaF90YWdzIH07IHdoYXRfdG9fZG8gfSAtPlxuICAgIGxldCBmID0gYWRkX2hvb2tzIGNvbmZpZyBmIGluXG4gICAgbGV0IGRlc2NyICgpID0gZGlzcGxheWVkX2Rlc2NyIGRlc2NyIGRlZl9maWxlbmFtZSBkZWZfbGluZV9udW1iZXIgc3RhcnRfcG9zIGVuZF9wb3MgaW5cbiAgICBsZXQgcGFydGlhbF90YWdzID0gdGFncyBAIE1vZHVsZV9jb250ZXh0LmN1cnJlbnRfdGFncyAoKSBpblxuICAgIGxldCBzaG91bGRfcnVuID1cbiAgICAgIFNvbWUgbGlibmFtZSA9ICFkeW5hbWljX2xpYlxuICAgICAgKCogSWYsIG5vIG1hdHRlciB3aGF0IHRhZ3MgYSB0ZXN0IGRlZmluZXMsIHdlIGNlcnRhaW5seSB3aWxsIGRyb3AgYWxsIHRlc3RzIHdpdGhpblxuICAgICAgICAgdGhpcyBtb2R1bGUsIHRoZW4gZG9uJ3QgcnVuIHRoZSBtb2R1bGUgYXQgYWxsLiBUaGlzIG1lYW5zIHBlb3BsZSBjYW4gd3JpdGVcbiAgICAgICAgIHRoaW5ncyBsaWtlIHRoZSBmb2xsb3dpbmcgd2l0aG91dCBicmVha2luZyB0aGUgMzItYml0IGJ1aWxkOlxuICAgICAgICAgbGV0JXRlc3RfbW9kdWxlIFtAdGFncyBcIjY0LWJpdHMtb25seVwiXSA9IChtb2R1bGUgc3RydWN0XG4gICAgICAgICBsZXQgaSA9IEludDY0LnRvX2ludF9leG4gLi4uLlxuICAgICAgICAgZW5kKVxuICAgICAgICAgV2UgZG9uJ3Qgc2hvcnRjdXQgYmFzZWQgb24gcG9zaXRpb24sIGFzIHdlIGNhbid0IHRlbGwgd2hhdCBwb3NpdGlvbnMgdGhlXG4gICAgICAgICBpbm5lciB0ZXN0cyB3aWxsIGhhdmUuICopXG4gICAgICAmJiBub3QgKFRhZ19wcmVkaWNhdGUuZW50aXJlX21vZHVsZV9kaXNhYmxlZCB3aGljaF90YWdzIH5wYXJ0aWFsX3RhZ3MpXG4gICAgaW5cbiAgICBpZiBzaG91bGRfcnVuIHRoZW4gYmVnaW5cbiAgICAgIG1hdGNoIHdoYXRfdG9fZG8gd2l0aFxuICAgICAgfCBgTGlzdF9wYXJ0aXRpb25zIC0+IFBhcnRpdGlvbi5mb3VuZF90ZXN0ICgpXG4gICAgICB8IGBSdW5fcGFydGl0aW9uIHBhcnRpdGlvbiAtPlxuICAgICAgICBpZiBQYXJ0aXRpb24uaXNfY3VycmVudCBwYXJ0aXRpb24gdGhlbiBiZWdpblxuICAgICAgICAgIGluY3IgdGVzdF9tb2R1bGVzX3JhbjtcbiAgICAgICAgICBsZXQgZGVzY3IgPSBkZXNjciAoKSBpblxuICAgICAgICAgIG1hdGNoXG4gICAgICAgICAgICBNb2R1bGVfY29udGV4dC53aXRoXyB+ZGVzY3IgfnRhZ3MgKGZ1biAoKSAtPlxuICAgICAgICAgICAgICAoKiBXZSBkbyBub3QgcmVzZXQgcmFuZG9tIHN0YXRlcyB1cG9uIGVudGVyaW5nIFtsZXQldGVzdF9tb2R1bGVdLlxuXG4gICAgICAgICAgICAgICAgIENvbjogQ29kZSBpbiB0ZXN0IG1vZHVsZXMgY2FuIGFjY2lkZW50YWxseSBkZXBlbmQgb24gdG9wLWxldmVsIHJhbmRvbVxuICAgICAgICAgICAgICAgICBzdGF0ZSBlZmZlY3RzLlxuXG4gICAgICAgICAgICAgICAgIFByb3M6ICgxKSBXZSBkb24ndCByZXNldCB0byB0aGUgc2FtZSBzZWVkIG9uIGVudGVyaW5nIGEgW2xldCV0ZXN0X21vZHVsZV1cbiAgICAgICAgICAgICAgICAgYW5kIHRoZW4gYSBbbGV0JXRlc3RdIGluc2lkZSB0aGF0IG1vZHVsZSwgd2hpY2ggY291bGQgbGVhZCB0b1xuICAgICAgICAgICAgICAgICBhY2NpZGVudGFsbHkgcmFuZG9tbHkgZ2VuZXJhdGluZyB0aGUgc2FtZSB2YWx1ZXMgaW4gc29tZSB0ZXN0LiAoMikgTW92aW5nXG4gICAgICAgICAgICAgICAgIGNvZGUgaW50byBhbmQgb3V0IG9mIFtsZXQldGVzdF9tb2R1bGVdIGRvZXMgbm90IGNoYW5nZSBpdHMgcmFuZG9tIHNlZWQuXG4gICAgICAgICAgICAgICopXG4gICAgICAgICAgICAgIHRpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tX3NlZWRzIGYpXG4gICAgICAgICAgd2l0aFxuICAgICAgICAgIHwgT2sgKCkgLT4gKClcbiAgICAgICAgICB8IEVycm9yIChleG4sIGJhY2t0cmFjZSkgLT5cbiAgICAgICAgICAgIGluY3IgdGVzdF9tb2R1bGVzX2ZhaWxlZDtcbiAgICAgICAgICAgIGxldCBiYWNrdHJhY2UgPSBodW1fYmFja3RyYWNlIGJhY2t0cmFjZSBpblxuICAgICAgICAgICAgbGV0IGV4bl9zdHIgPSBTZXhwbGliMC5TZXhwX2NvbnYucHJpbnRleGNfcHJlZmVyX3NleHAgZXhuIGluXG4gICAgICAgICAgICBsZXQgc2VwID0gaWYgU3RyaW5nLmNvbnRhaW5zIGV4bl9zdHIgJ1xcbicgdGhlbiBcIlxcblwiIGVsc2UgXCIgXCIgaW5cbiAgICAgICAgICAgIGVwcmludGZfb3JfZGVsYXkgKFwiVEVTXCIgXl4gXCJUX01PRFVMRSBhdCAlcyB0aHJldyVzJXMuXFxuJXMlc1xcbiUhXCIpXG4gICAgICAgICAgICAgIChTdHJpbmcudW5jYXBpdGFsaXplX2FzY2lpIGRlc2NyKSBzZXAgZXhuX3N0ciBiYWNrdHJhY2UgKHN0cmluZ19vZl9tb2R1bGVfZGVzY3IgKCkpXG4gICAgICAgIGVuZFxuICAgIGVuZFxuXG5sZXQgc3VtbWFyaXplICgpID1cbiAgbWF0Y2ggQWN0aW9uLmdldCAoKSB3aXRoXG4gIHwgYElnbm9yZSAtPlxuICAgIGlmIFN5cy5hcmd2IDw+IFt8fF0gJiYgRmlsZW5hbWUuYmFzZW5hbWUgU3lzLmFyZ3YuKDApID0gXCJpbmxpbmVfdGVzdHNfcnVubmVyLmV4ZVwiIHRoZW5cbiAgICAgIFByaW50Zi5lcHJpbnRmIFwiaW5saW5lX3Rlc3RzX3J1bm5lci5leGUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJ1biBieSBoYW5kLCB5b3UgXFxuXFxcbiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcnVuIHRoZSBpbmxpbmVfdGVzdHNfcnVubmVyIHNjcmlwdCBpbnN0ZWFkLlxcbiUhXCJcbiAgICBlbHNlXG4gICAgICBQcmludGYuZXByaW50ZiBcIllvdSBhcmUgZG9pbmcgc29tZXRoaW5nIHVuZXhwZWN0ZWQgd2l0aCB0aGUgdGVzdHMuIE5vIHRlc3RzIGhhdmUgXFxuXFxcbiAgICAgICAgICAgICAgICAgICAgICBiZWVuIHJ1bi4gWW91IHNob3VsZCB1c2UgdGhlIGlubGluZV90ZXN0c19ydW5uZXIgc2NyaXB0IHRvIHJ1biBcXG5cXFxuICAgICAgICAgICAgICAgICAgICAgIHRlc3RzLlxcbiUhXCI7XG4gICAgVGVzdF9yZXN1bHQuRXJyb3JcbiAgfCBgVGVzdF9tb2RlIHsgd2hpY2hfdGVzdHMgPSBfOyB3aGF0X3RvX2RvID0gYExpc3RfcGFydGl0aW9ucyB9IC0+XG4gICAgTGlzdC5pdGVyIChQcmludGYucHJpbnRmIFwiJXNcXG5cIikgKFBhcnRpdGlvbi5hbGwgKCkpO1xuICAgIFRlc3RfcmVzdWx0LlN1Y2Nlc3NcbiAgfCBgVGVzdF9tb2RlIHsgd2hhdF90b19kbyA9IGBSdW5fcGFydGl0aW9uIF87IHdoaWNoX3Rlc3RzIH0gLT4gYmVnaW5cbiAgICAgIGJlZ2luIG1hdGNoICFsb2cgd2l0aFxuICAgICAgfCBOb25lIC0+ICgpXG4gICAgICB8IFNvbWUgY2ggLT4gY2xvc2Vfb3V0IGNoXG4gICAgICBlbmQ7XG4gICAgICBwcmludF9kZWxheWVkX2Vycm9ycyAoKTtcbiAgICAgIG1hdGNoICF0ZXN0c19mYWlsZWQsICF0ZXN0X21vZHVsZXNfZmFpbGVkIHdpdGhcbiAgICAgIHwgMCwgMCAtPiBiZWdpblxuICAgICAgICAgIGlmICFzaG93X2NvdW50cyB0aGVuIGJlZ2luXG4gICAgICAgICAgICBQcmludGYuZXByaW50ZiBcIiVkIHRlc3RzIHJhbiwgJWQgdGVzdF9tb2R1bGVzIHJhblxcbiUhXCIgIXRlc3RzX3JhbiAhdGVzdF9tb2R1bGVzX3JhblxuICAgICAgICAgIGVuZDtcbiAgICAgICAgICBsZXQgZXJyb3JzID1cbiAgICAgICAgICAgIGxldCB1bnVzZWRfdGVzdHMgPVxuICAgICAgICAgICAgICBMaXN0LmZpbHRlciAoZnVuIChfLCBfLCB1c2VkKSAtPiBub3QgIXVzZWQpIHdoaWNoX3Rlc3RzLm9ubHlfdGVzdF9sb2NhdGlvblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIG1hdGNoIHVudXNlZF90ZXN0cyB3aXRoXG4gICAgICAgICAgICB8IFtdIC0+IE5vbmVcbiAgICAgICAgICAgIHwgXyA6OiBfIC0+IFNvbWUgdW51c2VkX3Rlc3RzXG4gICAgICAgICAgaW5cbiAgICAgICAgICBtYXRjaCBlcnJvcnMgd2l0aFxuICAgICAgICAgIHwgU29tZSB0ZXN0cyAtPlxuICAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJwcHhfaW5saW5lX3Rlc3QgZXJyb3I6IHRoZSBmb2xsb3dpbmcgLW9ubHktdGVzdCBmbGFncyBtYXRjaGVkIG5vdGhpbmc6XCI7XG4gICAgICAgICAgICBMaXN0Lml0ZXIgKGZ1biAoZmlsZW5hbWUsIGxpbmVfbnVtYmVyX29wdCwgXykgLT5cbiAgICAgICAgICAgICAgbWF0Y2ggbGluZV9udW1iZXJfb3B0IHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+IFByaW50Zi5lcHJpbnRmIFwiICVzXCIgZmlsZW5hbWVcbiAgICAgICAgICAgICAgfCBTb21lIGxpbmVfbnVtYmVyIC0+IFByaW50Zi5lcHJpbnRmIFwiICVzOiVkXCIgZmlsZW5hbWUgbGluZV9udW1iZXJcbiAgICAgICAgICAgICkgdGVzdHM7XG4gICAgICAgICAgICBQcmludGYuZXByaW50ZiBcIi5cXG4lIVwiO1xuICAgICAgICAgICAgVGVzdF9yZXN1bHQuRXJyb3JcbiAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGlmICF0ZXN0c19yYW4gPSAwICYmICFzdHJpY3QgdGhlbiBiZWdpblxuICAgICAgICAgICAgICBQcmludGYuZXByaW50ZiBcInBweF9pbmxpbmVfdGVzdCBlcnJvcjogbm8gdGVzdHMgaGF2ZSBiZWVuIHJ1bi5cXG4lIVwiO1xuICAgICAgICAgICAgICBUZXN0X3Jlc3VsdC5FcnJvclxuICAgICAgICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgVGVzdF9yZXN1bHQuU3VjY2Vzc1xuICAgICAgICAgICAgZW5kXG4gICAgICAgIGVuZFxuICAgICAgfCBjb3VudCwgY291bnRfdGVzdF9tb2R1bGVzIC0+XG4gICAgICAgIFByaW50Zi5lcHJpbnRmIFwiRkFJTEVEICVkIC8gJWQgdGVzdHMlc1xcbiUhXCIgY291bnQgIXRlc3RzX3JhblxuICAgICAgICAgIChpZiBjb3VudF90ZXN0X21vZHVsZXMgPSAwIHRoZW4gXCJcIiBlbHNlIFByaW50Zi5zcHJpbnRmIChcIiwgJWQgVEVTXCIgXl4gXCJUX01PRFVMRVNcIikgY291bnRfdGVzdF9tb2R1bGVzKTtcbiAgICAgICAgVGVzdF9yZXN1bHQuRmFpbHVyZVxuICAgIGVuZFxuXG5sZXQgdXNlX2NvbG9yID0gIXVzZV9jb2xvclxubGV0IGluX3BsYWNlICA9ICFpbl9wbGFjZVxubGV0IGRpZmZfY29tbWFuZCA9ICFkaWZmX2NvbW1hbmRcbmxldCBzb3VyY2VfdHJlZV9yb290ID0gIXNvdXJjZV90cmVlX3Jvb3RcbmxldCBhbGxvd19vdXRwdXRfcGF0dGVybnMgPSAhYWxsb3dfb3V0cHV0X3BhdHRlcm5zXG5cbmxldCBldmFsdWF0b3JzID0gcmVmIFtzdW1tYXJpemVdXG5sZXQgYWRkX2V2YWx1YXRvciB+ZiA9IGV2YWx1YXRvcnMgOj0gZiA6OiAhZXZhbHVhdG9yc1xubGV0IGV4aXQgKCkgPVxuICBMaXN0Lm1hcCAoZnVuIGYgLT4gZiAoKSkgKExpc3QucmV2ICFldmFsdWF0b3JzKVxuICB8PiBUZXN0X3Jlc3VsdC5jb21iaW5lX2FsbFxuICB8PiBUZXN0X3Jlc3VsdC50b19leGl0X2NvZGVcbiAgfD4gZXhpdFxuIiwidHlwZSB0XG5cbmxldCBhYnN1cmQgKF86IHQpOiAnYSA9XG4gICAgYXNzZXJ0IGZhbHNlXG4iLCJpbmNsdWRlIFN0ZGxpYi5TdHJpbmdcblxubGV0IG9uZSAoYzpjaGFyKTogc3RyaW5nID1cbiAgICBtYWtlIDEgY1xuXG5cblxuXG5sZXQgaXNfcHJlZml4IChhOiBzdHJpbmcpIChiOnN0cmluZyk6IGJvb2wgPVxuICAgIGxldCBsZW5fYSA9IGxlbmd0aCBhIGluXG4gICAgbGVuX2EgPD0gbGVuZ3RoIGIgJiYgYSA9IHN1YiBiIDAgbGVuX2FcblxuXG5cbmxldCBpc19zdWZmaXggKGE6IHN0cmluZykgKGI6c3RyaW5nKTogYm9vbCA9XG4gICAgbGV0IGxlbl9hID0gbGVuZ3RoIGFcbiAgICBhbmQgbGVuX2IgPSBsZW5ndGggYlxuICAgIGluXG4gICAgbGVuX2EgPD0gbGVuX2JcbiAgICAmJiBhID0gc3ViIGIgIChsZW5fYiAtIGxlbl9hKSBsZW5fYVxuXG5cblxuXG5cbmxldCBmaW5kIChmOmNoYXIgLT4gYm9vbCkgKHN0YXJ0OmludCkgKHM6c3RyaW5nKTogaW50ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgICBsZXQgcmVjIGZpbmQgaSA9XG4gICAgICAgIGlmIGkgPSBsZW4gfHwgZiAoZ2V0IHMgaSkgdGhlblxuICAgICAgICAgICAgaVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kIChpKzEpXG4gICAgaW5cbiAgICBmaW5kIHN0YXJ0XG5cblxubGV0IGhhcyAoZjogY2hhciAtPiBib29sKSAoc3RhcnQ6IGludCkgKHM6IHN0cmluZyk6IGJvb2wgPVxuICAgIGZpbmQgZiBzdGFydCBzXG4gICAgPFxuICAgIGxlbmd0aCBzXG5cblxubGV0IGZpbmRfYndkIChmOiBjaGFyIC0+IGJvb2wpIChiZXlvbmQ6IGludCkgKHM6IHN0cmluZyk6IGludCA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCBzXG4gICAgaW5cbiAgICBsZXQgYmV5b25kID1cbiAgICAgICAgaWYgYmV5b25kIDwgMCB8fCBsZW4gPCBiZXlvbmQgdGhlblxuICAgICAgICAgICAgbGVuXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJleW9uZFxuICAgIGluXG4gICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpID0gMCB8fCBmIChnZXQgcyAoaSAtIDEpKSB0aGVuXG4gICAgICAgICAgICBpIC0gMVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kIChpIC0gMSlcbiAgICBpblxuICAgIGZpbmQgYmV5b25kXG5cblxuXG5sZXQgbGlzdCAoczpzdHJpbmcpOiBjaGFyIGxpc3QgPVxuICAgIGxldCByZWMgbGlzdCBjcyBpID1cbiAgICAgICAgaWYgaSA9IDAgdGhlblxuICAgICAgICAgICAgY3NcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IGogPSBpIC0gMSBpblxuICAgICAgICAgICAgbGlzdCAoZ2V0IHMgaiA6OiBjcykgalxuICAgIGluXG4gICAgbGlzdCBbXSAobGVuZ3RoIHMpXG5cblxubGV0IG9mX2xpc3QgKGNzOmNoYXIgbGlzdCk6IHN0cmluZyA9XG4gICAgbGV0IHJlYyBzdHIgY3MgaSA9XG4gICAgICAgIG1hdGNoIGNzIHdpdGhcbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgQnl0ZXMuY3JlYXRlIGlcbiAgICAgICAgfCBjOjpjcyAtPlxuICAgICAgICAgICAgbGV0IGJzID0gc3RyIGNzIChpKzEpIGluXG4gICAgICAgICAgICBCeXRlcy5zZXQgYnMgaSBjO1xuICAgICAgICAgICAgYnNcbiAgICBpblxuICAgIGxldCBicyA9IHN0ciBjcyAwIGluXG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBic1xuXG5cblxubGV0IHJldmVyc2UgKHM6IHN0cmluZyk6IHN0cmluZyA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gICAgaW5pdCBsZW4gKGZ1biBpIC0+IGdldCBzIChsZW4gLSAxIC0gaSkpXG5cblxubW9kdWxlIFRvX3NvdXJjZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIGl0ZW0gPSBjaGFyXG5cbiAgICB0eXBlIHQgPSBpbnQgKiBzdHJpbmdcblxuICAgIGxldCBoYXNfbW9yZSAoKGkscyk6IHQpOiBib29sID1cbiAgICAgICAgaSA8IGxlbmd0aCBzXG5cbiAgICBsZXQgcGVlayAoKGkscyk6IHQpOiBjaGFyID1cbiAgICAgICAgYXNzZXJ0IChoYXNfbW9yZSAoaSxzKSk7XG4gICAgICAgIGdldCBzIGlcblxuICAgIGxldCBhZHZhbmNlICgoaSxzKSk6IHQgPVxuICAgICAgICBhc3NlcnQgKGhhc19tb3JlIChpLCBzKSk7XG4gICAgICAgIChpICsgMSwgcylcblxuICAgIGxldCBtYWtlIChzOiBzdHJpbmcpOiB0ID1cbiAgICAgICAgKDAsIHMpXG5lbmRcblxuXG5cbm1vZHVsZSBGcm9tX3NvdXJjZSAoUjogSW50ZXJmYWNlcy5TT1VSQ0Ugd2l0aCB0eXBlIGl0ZW0gPSBjaGFyKSA9XG5zdHJ1Y3RcbiAgICBsZXQgbWFrZV93aXRoX3NpemUgKGVzdGltYXRlOiBpbnQpIChyOiBSLnQpOiB0ID1cbiAgICAgICAgbGV0IGVzdGltYXRlID1cbiAgICAgICAgICAgIGlmIGVzdGltYXRlIDw9IDAgdGhlblxuICAgICAgICAgICAgICAgIDgwXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXN0aW1hdGVcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGJ1ZmZlciAgID0gcmVmIChCeXRlcy5jcmVhdGUgZXN0aW1hdGUpXG4gICAgICAgIGFuZCBsZW4gICAgICA9IHJlZiAwXG4gICAgICAgIGFuZCBjYXBhY2l0eSA9IHJlZiBlc3RpbWF0ZVxuICAgICAgICBpblxuICAgICAgICBsZXQgbWFrZV9yb29tICgpID1cbiAgICAgICAgICAgIGlmICFsZW4gPSAhY2FwYWNpdHkgdGhlblxuICAgICAgICAgICAgICAgIGxldCBibmV3ID0gQnl0ZXMuY3JlYXRlICgyICogIWNhcGFjaXR5KSBpblxuICAgICAgICAgICAgICAgIGJlZ2luXG4gICAgICAgICAgICAgICAgICAgIEJ5dGVzLmJsaXQgIWJ1ZmZlciAwIGJuZXcgMCAhbGVuO1xuICAgICAgICAgICAgICAgICAgICBidWZmZXIgOj0gYm5ldztcbiAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkgOj0gMiAqICFjYXBhY2l0eVxuICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICBpblxuICAgICAgICBsZXQgcHVzaCBjID1cbiAgICAgICAgICAgIG1ha2Vfcm9vbSAoKTtcbiAgICAgICAgICAgIEJ5dGVzLnNldCAhYnVmZmVyICFsZW4gYztcbiAgICAgICAgICAgIGxlbiA6PSAhbGVuICsgMTtcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHJlYyByZWN1cnNlIHIgPVxuICAgICAgICAgICAgaWYgUi5oYXNfbW9yZSByIHRoZW5cbiAgICAgICAgICAgICAgICBiZWdpblxuICAgICAgICAgICAgICAgICAgICBwdXNoIChSLnBlZWsgcik7XG4gICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UgKFIuYWR2YW5jZSByKVxuICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIEJ5dGVzLnN1Yl9zdHJpbmcgIWJ1ZmZlciAwICFsZW5cbiAgICAgICAgaW5cbiAgICAgICAgcmVjdXJzZSByXG5cbiAgICBsZXQgbWFrZSAocjogUi50KTogdCA9XG4gICAgICAgIG1ha2Vfd2l0aF9zaXplIDEwMCByXG5lbmRcblxuXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc3RyID0gXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMlwiIGluXG4gICAgbGV0IG1vZHVsZSBGcm9tID0gRnJvbV9zb3VyY2UgKFRvX3NvdXJjZSkgaW5cbiAgICBzdHIgPSBGcm9tLm1ha2Vfd2l0aF9zaXplIDIgKFRvX3NvdXJjZS5tYWtlIHN0cilcbiIsIigqKiBBIHNtYWxsIHdyYXBwZXIgYXJvdW5kIFtTdGRsaWIuU3RyaW5nXSB3aXRoIHNvbWUgZXh0cmEgZnVuY3Rpb25zLlxuXG4gICAgVXNlIFtTdGRsaWIuU3RyaW5nXSBpZiB5b3UgbmVlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb2NhbWwgc3RhbmRhcmQgbGlicmFyeVxuICAgIHdoaWNoIGFyZSBub3QgaW4gdGhpcyBtb2R1bGUuXG4qKVxuXG5cblxuXG50eXBlIHQgPSBzdHJpbmdcbigqKiBBIHN0YW5kYXJkIG9jYW1sIHN0cmluZy4gKilcblxuXG52YWwgaXNfcHJlZml4OiB0IC0+IHQgLT4gYm9vbFxuKCoqIFtpc19wcmVmaXggYSBiXSBJcyBbYV0gYSBwcmVmaXggb2YgW2JdPyAqKVxuXG52YWwgaXNfc3VmZml4OiB0IC0+IHQgLT4gYm9vbFxuKCoqIFtpc19zdWZmaXggYSBiXSBJcyBbYV0gYSBzdWZmaXggb2YgW2JdPyAqKVxuXG5cbnZhbCByZXZlcnNlOiB0IC0+IHRcbigqKiBbcmV2ZXJzZSBzXSByZXZlcnNlcyB0aGUgc3RyaW5nIFtzXS4gKilcblxuXG52YWwgY29tcGFyZTogdCAtPiB0IC0+IGludFxuKCoqIFtjb21wYXJlIHMxIHMyXSBDb21wYXJlIHRoZSBzdHJpbmdzIFtzMV0gYW5kIFtzMl0uXG5cbiAgICBSZXR1cm4gWy0xXSwgaWYgW3MxXSBpcyBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVyIHRoYW4gW3MyXVxuICAgIFJldHVybiBbMF0sICBpZiBib3RoIHN0cmluZyBhcmUgZXF1YWxcbiAgICBSZXR1cm4gWysxXSwgaWYgW3MxXSBpcyBsZXhpY29ncmFwaGljYWxseSBncmVhdGVyIHRoYW4gW3MyXVxuKilcblxuXG52YWwgb25lOiBjaGFyIC0+IHRcbigqKiBbb25lIGNdIEEgc3RyaW5nIHdpdGggdGhlIGNoYXJhY3RlciBbY10gYXMgdGhlIG9ubHkgY2hhcmFjdGVyLiAqKVxuXG5cblxudmFsIGZpbmQ6IChjaGFyIC0+IGJvb2wpIC0+IGludCAtPiB0IC0+IGludFxuKCoqIFtmaW5kIHAgc3RhcnQgc3RyXSBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHN0YXJ0aW5nIGZyb21cbiAgICBbc3RhcnRdIGluIHRoZSBzdHJpbmcgW3N0cl0gd2hpY2ggc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUgW3BdLiBJZiBub1xuICAgIGNoYXJhY3RlciBjYW4gYmUgZm91bmQgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiopXG5cblxudmFsIGhhczogIChjaGFyIC0+IGJvb2wpIC0+IGludCAtPiB0IC0+IGJvb2xcbigqKiBbaGFzIHAgc3RhcnQgc3RyXSBEb2VzIHRoZSBzdHJpbmcgW3N0cl0gc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiBbc3RhcnRdIGhhdmVcbiAgICBhIGNoYXJhY3RlciBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUgW3BdPyAqKVxuXG5cbnZhbCBmaW5kX2J3ZDogKGNoYXIgLT4gYm9vbCkgLT4gaW50IC0+IHQgLT4gaW50XG4oKiogW2ZpbmRfYndkIHAgYmV5b25kIHN0cl0gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBiZWZvcmVcbiAgICBbYmV5b25kXSBpbiB0aGUgc3RyaW5nIFtzdHJdIHdoaWNoIHNhdGlzZmllcyB0aGUgcHJlZGljYXRlIFtwXS4gUmV0dXJuIFstMV0sXG4gICAgaWYgbm8gY2hhcmFjdGVyIGNhbiBiZSBmb3VuZC4gKilcblxuXG52YWwgbGlzdDogdCAtPiBjaGFyIGxpc3RcbigqKiBbbGlzdCBzdHJdIENvbnZlcnQgdGhlIHN0cmluZyBbc3RyXSB0byBhIGxpc3Qgb2YgY2hhcmFjdGVycy4gKilcblxudmFsIG9mX2xpc3Q6IGNoYXIgbGlzdCAtPiB0XG4oKiogW29mX2xpc3QgbF0gQ29udmVydCB0aGUgbGlzdCBbbF0gb2YgY2hhcmFjdGVycyB0byBhIHN0cmluZy4gKilcblxuXG52YWwgbGVuZ3RoOiB0IC0+IGludFxuKCoqIFtsZW5ndGggc3RyXSBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgW3N0cl0uICopXG5cblxudmFsIGdldDogdCAtPiBpbnQgLT4gY2hhclxuKCoqIFtnZXQgc3RyIGldIFRoZSBbaV10aCBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBbc3RyXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDwgbGVuZ3RoIHN0cl1cbiopXG5cblxudmFsIHN1YjogdCAtPiBpbnQgLT4gaW50IC0+IHRcbigqKiBbc3ViIHN0ciBzdGFydCBsZW5dIFRoZSBzdWJzdHJpbmcgb2YgW3N0cl0gc3RhcnRpbmcgYXQgW3N0YXJ0XSB3aXRoIGxlbmd0aFxuICAgIFtsZW5dLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBzdGFydCA8PSBzdGFydCArIGxlbiA8PSBsZW5ndGggc3RyXVxuKilcblxuXG52YWwgY29uY2F0OiBzdHJpbmcgLT4gc3RyaW5nIGxpc3QgLT4gc3RyaW5nXG4oKiogW2NvbmNhdCBzZXAgc3RyX2xpc3RdIENvbmNhdGVuYXRlIHRoZSBzdHJpbmdzIGluIHRoZSBzdHJpbmcgbGlzdCBbc3RyX2xpc3RdXG4gICAgYW5kIHB1dCB0aGUgc2VwYXJhdG9yIFtzZXBdIGJldHdlZW4gdGhlbS5cbiopXG5cblxudmFsIHNwbGl0X29uX2NoYXI6IGNoYXIgLT4gc3RyaW5nIC0+IHN0cmluZyBsaXN0XG4oKiogW3NwbGl0X29uX2NoYXIgYyBzdHJdIFNwbGl0IHRoZSBzdHJpbmcgW3N0cl0gb24gZWFjaCBvY2N1cnJlbmNlIG9mIHRoZVxuICAgIGNoYXJhY3RlciBbY10gaW50byBhIGxpc3Qgb2Ygc3RyaW5ncy5cbiopXG5cblxudmFsIG1ha2U6IGludCAtPiBjaGFyIC0+IHRcbigqKiBbbWFrZSBuIGNdIE1ha2UgYSBzdHJpbmcgd2l0aCBbbl0gY29waWVzIG9mIHRoZSBjaGFyYWN0ZXIgW2NdLiAqKVxuXG5cbnZhbCBpbml0OiBpbnQgLT4gKGludCAtPiBjaGFyKSAtPiB0XG4oKiogW2luaXQgbiBmXSBNYWtlIGEgc3RyaW5nIG9mIGxlbmd0aCBbbl0gd2hlcmUgdGhlIFtpXXRoIGNoYXJhY3RlciBpcyBbZiBpXS5cbiopXG5cblxuXG5cblxuKCoqIENvbnZlcnNpb24gb2YgYSBzdHJpbmcgdG8gYSBzb3VyY2Ugb2YgY2hhcmFjdGVycy4gKilcbm1vZHVsZSBUb19zb3VyY2U6XG5zaWdcbiAgICBpbmNsdWRlIEludGVyZmFjZXMuU09VUkNFIHdpdGggdHlwZSBpdGVtID0gY2hhclxuXG4gICAgdmFsIG1ha2U6IHN0cmluZyAtPiB0XG4gICAgKCoqIFttYWtlIHN0cl0gQSBjaGFyYWN0ZXIgc3RyZWFtIGdlbmVyYXRlZCBmcm9tIHRoZSBzdHJpbmcgW3N0cl0uICopXG5lbmRcblxuXG5cbigqKiBDb252ZXJzaW9uIG9mIGEgc291cmNlIG9mIGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcuICopXG5tb2R1bGUgRnJvbV9zb3VyY2UgKFM6IEludGVyZmFjZXMuU09VUkNFIHdpdGggdHlwZSBpdGVtID0gY2hhcik6XG5zaWdcbiAgICB2YWwgbWFrZTogUy50IC0+IHRcbiAgICAoKiogW21ha2Ugc10gQ29udmVydCB0aGUgc3RyZWFtIFtzXSBvZiBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nLiAqKVxuXG5cbiAgICB2YWwgbWFrZV93aXRoX3NpemU6IGludCAtPiBTLnQgLT4gdFxuICAgICgqKiBbbWFrZV93aXRoX3NpemUgbiBzXSBDb252ZXJ0IHRoZSBzdHJlYW0gW3NdIG9mIGNoYXJhY3RlcnMgdG8gYSBzdHJpbmdcbiAgICAgICAgd2hlcmUgW25dIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cblxuICAgICAgICBUaGUgZnVuY3Rpb24gd29ya3MgaW50ZXJuYWxseSB3aXRoIGEgYnVmZmVyLiBbbl0gaXMgdXNlZCB0byBndWlkZSB0aGVcbiAgICAgICAgYnVmZmVyIGFsbG9jYXRpb24gYW5kIHRoZSByZXNpemluZyBvZiB0aGUgYnVmZmVyLiBUaGUgYmV0dGVyIHRoZVxuICAgICAgICBlc3RpbWF0ZSwgdGhlIGZld2VyIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgcmVzaXplcyBhcmUgbmVjZXNzYXJ5LlxuICAgICopXG5lbmRcbiIsInR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UpIHJlc3VsdFxuXG5cbmxldCByZXR1cm4gKGE6ICdhKTogKCdhLCAnZSkgdCA9XG4gICAgT2sgYVxuXG5cbmxldCBmYWlsIChlOiAnZSk6ICgnYSwgJ2UpIHQgPVxuICAgIEVycm9yIGVcblxuXG5cbmxldCB0b19vcHRpb24gKHI6ICgnYSwgXykgdCk6ICdhIG9wdGlvbiA9XG4gICAgbWF0Y2ggciB3aXRoXG4gICAgfCBPayBhIC0+XG4gICAgICAgIFNvbWUgYVxuICAgIHwgRXJyb3IgXyAtPlxuICAgICAgICBOb25lXG5cblxubGV0ICg+Pj0pIChtOiAoJ2EsICdlKSB0KSAoZjogJ2EgLT4gKCdiLCAnZSkgdCk6ICgnYiwgJ2UpIHQgPVxuICAgIG1hdGNoIG0gd2l0aFxuICAgIHwgT2sgYSAtPlxuICAgICAgICBmIGFcbiAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgRXJyb3IgZVxuXG5sZXQgKCBsZXQqICkgPSAoPj49KVxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKTogKCdhLCAnZSkgdCAtPiAoJ2IsICdlKSB0ID0gZnVuY3Rpb25cbiAgICB8IE9rIGEgLT5cbiAgICAgICAgT2sgKGYgYSlcblxuICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICBFcnJvciBlXG5cblxuXG5sZXQgbWFwX2Vycm9yIChmOiAnZSAtPiAnZik6ICgnYSwgJ2UpIHQgLT4gKCdhLCAnZikgdCA9IGZ1bmN0aW9uXG4gICAgfCBPayBhIC0+XG4gICAgICAgIE9rIGFcblxuICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICBFcnJvciAoZiBlKVxuXG5cbmxldCBnZXQ6ICgnYSwgVm9pZC50KSB0IC0+ICdhID0gZnVuY3Rpb25cbiAgICB8IE9rIGEgLT5cbiAgICAgICAgYVxuXG4gICAgfCBFcnJvciBlIC0+XG4gICAgICAgIFZvaWQuYWJzdXJkIGVcblxuXG5cblxuXG5tb2R1bGUgTW9uYWQgKEU6IEludGVyZmFjZXMuQU5ZKSA9XG5zdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSAoJ2EsIEUudCkgcmVzdWx0XG5cbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG5cbiAgICBsZXQgZmFpbCA9IGZhaWxcblxuICAgIGxldCB0b19vcHRpb24gPSB0b19vcHRpb25cblxuICAgIGxldCAoPj49KSAgPSAoPj49KVxuXG4gICAgbGV0ICggbGV0KiApID0gKD4+PSlcbmVuZFxuXG5cblxuKCogVW5pdCB0ZXN0cyAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHIgPSAoJ2EsIHN0cmluZykgcmVzdWx0XG5cbmxldCBhZGQgKGE6IGludCByKSAoYjogaW50IHIpOiBpbnQgciA9XG4gICAgbGV0KiB4ID0gYSBpblxuICAgIGxldCogeSA9IGIgaW5cbiAgICBPayAoeCArIHkpXG5cbmxldCBkaXZpZGUgKGE6IGludCByKSAoYjogaW50IHIpOiBpbnQgciA9XG4gICAgbGV0KiB4ID0gYSBpblxuICAgIGxldCogeSA9IGIgaW5cbiAgICBpZiB5ID0gMCB0aGVuXG4gICAgICAgIEVycm9yIFwiRGl2aXNpb24gYnkgWmVyb1wiXG4gICAgZWxzZVxuICAgICAgICBPayAoeCAvIHkpXG5cbmxldCV0ZXN0IF8gPVxuICAgIGFkZCAoT2sgMSkgKGRpdmlkZSAoT2sgMikgKE9rIDApKVxuICAgID1cbiAgICBFcnJvciBcIkRpdmlzaW9uIGJ5IFplcm9cIlxuXG5sZXQldGVzdCBfID1cbiAgICBhZGQgKE9rIDEpIChkaXZpZGUgKE9rIDEwKSAoT2sgMikpXG4gICAgPVxuICAgIE9rIDZcbiIsImluY2x1ZGUgU3RkbGliLkludFxuXG5cbmxldCBpdGVyYXRlIChuOiB0KSAoZjogJ2EgLT4gJ2EpIChzdGFydDogJ2EpOiAnYSA9XG4gICAgbGV0IHJlYyBpdGVyIG4gdiA9XG4gICAgICAgIGlmIG4gPSAwIHRoZW5cbiAgICAgICAgICAgIHZcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaXRlciAobiAtIDEpIChmIHYpXG4gICAgaW5cbiAgICBpdGVyIG4gc3RhcnRcbiIsInR5cGUgJ2EgdCA9ICdhIG9wdGlvblxuXG5sZXQgcmV0dXJuIChhOiAnYSk6ICdhIHQgPVxuICAgIFNvbWUgYVxuXG5sZXQgZmFpbDogJ2EgdCA9XG4gICAgTm9uZVxuXG5cbmxldCAobGV0KiApIChtOiAnYSB0KSAoZjogJ2EgLT4gJ2IgdCk6ICdiIHQgPVxuICAgIG1hdGNoIG0gd2l0aFxuICAgIHwgU29tZSBhIC0+XG4gICAgICAgIGYgYVxuICAgIHwgTm9uZSAtPlxuICAgICAgICBOb25lXG5cblxubGV0ICg+Pj0pID0gKGxldCogKVxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKSAobTogJ2EgdCk6ICdiIHQgPVxuICAgIGxldCogYSA9IG0gaW5cbiAgICByZXR1cm4gKGYgYSlcblxuXG5cbmxldCB0b19saXN0IChtOiAnYSB0KTogJ2EgbGlzdCA9XG4gICAgbWF0Y2ggbSB3aXRoXG4gICAgfCBTb21lIGEgLT5cbiAgICAgICAgW2FdXG4gICAgfCBOb25lIC0+XG4gICAgICAgIFtdXG4iLCIoKiogQSB0aGluIHdyYXBwZXIgYXJvdW5kIFtTdGRsaWIuQXJyYXldIHdpdGggYWRkaXRpb25hbCBmdW5jdGlvbnMgYW5kIHNldHMgYW5kXG4gICAgbWFwcyBiYXNlZCBvbiBhcnJheXNcblxuICAgIFVzZSBbU3RkbGliLkFycmF5XSBpbiBjYXNlIHlvdSBuZWVkIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGNvbnRhaW5lZCBpblxuICAgIHRoaXMgbW9kdWxlLiBUaGVyZSBhcmUgbm8gcHJvYmxlbXMgdXNpbmcgW0ZtbGliX3N0ZC5BcnJheV0gYW5kXG4gICAgW1N0ZGxpYi5BcnJheV0sIGJlY2F1c2UgYm90aCBkYXRhdHlwZXMgYXJlIGlkZW50aWNhbC5cblxuICAgIEZ1dGhlcm1vcmUgdGhlcmUgYXJlIHRoZSBtb2R1bGVzIFtTZXRdIGFuZCBbTWFwXSB3aGljaCBpbXBsZW1lbnQgZmluaXRlIHNldHNcbiAgICBhbmQgZmluaXRlIG1hcHMgYmFzZWQgb24gc29ydGVkIGFycmF5cy4gRm9yIHNtYWxsIHNldHMgYW5kIG1hcHMsIHRoZSBhcnJheVxuICAgIGJhc2VkIGltcGxlbWVudGF0aW9ucyBhcmUgc3VwZXJpb3IgdG8gdHJlZSBiYXNlZCBpbXBsZW1lbnRhdGlvbnMgbGlrZSBhdmxcbiAgICB0cmVlcyBvciByZWQgYmxhY2sgdHJlZXMsIGJlY2F1c2UgdGhleSBoYXZlIGEgYmV0dGVyIGNhY2hlIGJlaGF2aW91ci5cbiopXG5cblxuXG4oKiogezEgQmFzaWMgQXJyYXkgRnVuY3Rpb25zfSAqKVxuXG50eXBlICdhIHQgPSAnYSBhcnJheVxuXG52YWwgbGVuZ3RoOiAnYSB0IC0+IGludFxuKCoqIFtsZW5ndGggYXJyXSBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBbYXJyXS4gKilcblxuXG52YWwgdmFsaWRfaW5kZXg6IGludCAtPiAnYSB0IC0+IGJvb2xcbigqKiBbdmFsaWRfaW5kZXggaSBhcnJdIElzIFtpXSBhIHZhbGlkIGluZGV4IGludG8gdGhlIGFycmF5IFthcnJdPyAqKVxuXG5cbnZhbCBpc19lbXB0eTogJ2EgdCAtPiBib29sXG4oKiogSXMgdGhlIGFycmF5IGVtcHR5PyAqKVxuXG5cbnZhbCBoYXNfc29tZTogJ2EgdCAtPiBib29sXG4oKiogRG9lcyB0aGUgYXJyYXkgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudD8gKilcblxuXG52YWwgZ2V0OiAnYSB0IC0+IGludCAtPiAnYVxuKCoqIFtnZXQgYXJyIGldIFRoZSBbaV10aCBlbGVtZW50IG9mIHRoZSBhcnJheSBbYXJyXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDwgbGVuZ3RoIFthcnJdXVxuKilcblxuXG52YWwgZmlyc3Q6ICdhIHQgLT4gJ2FcbigqKiBbZmlyc3QgeHNdIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbaGFzX3NvbWUgeHNdXG4qKVxuXG5cbnZhbCBsYXN0OiAnYSB0IC0+ICdhXG4oKiogW2xhc3QgeHNdIFRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IFt4c10uXG5cbiAgICBQcmVjb25kaXRpb246IFtoYXNfc29tZSB4c11cbiopXG5cblxuXG5cbnZhbCBzZXQ6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbigqKiBbc2V0IGFyciBpIHZhbHVlXSBTZXQgdGhlIFtpXXRoIGVsZW1lbnQgb2YgdGhlIGFycmF5IFthcnJdIHRvIFt2YWx1ZV0uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8IGxlbmd0aCBbYXJyXV1cbiopXG5cblxudmFsIG1ha2U6IGludCAtPiAnYSAtPiAnYSB0XG4oKiogU2FtZSBhcyBTdGRsaWIuQXJyYXkubWFrZSAqKVxuXG5cbnZhbCBpbml0OiBpbnQgLT4gKGludCAtPiAnYSkgLT4gJ2EgdFxuKCoqIFNhbWUgYXMgU3RkbGliLkFycmF5LmluaXQgKilcblxuXG5cbnZhbCBhcHBlbmQ6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW2FwcGVuZCB4cyB5c10gQ29uY2F0ZW5hdGUgdGhlIHR3byBhcnJheXMgW3hzXSBhbmQgW3lzXS4gKilcblxuXG5cbnZhbCBpbnNlcnQ6IGludCAtPiAnYSAtPiAnYSB0IC0+ICdhIHRcbigqKiBbaW5zZXJ0IGkgeCB4c10gSW5zZXJ0IHRoZSBlbGVtZW50IFt4XSBhdCBwb3NpdGlvbiBbaV0gaW50byB0aGUgYXJyYXkgW3hzXS5cblxuICAgIE1ha2UgcGxhY2UgYnkgcHVzaGluZyB1cCB0aGUgZWxlbWVudHMgW2ldLCBbaSArIDFdLCAuLi4gb25lIHBvc2l0aW9uLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPD0gbGVuZ3RoIHhzXS5cbiopXG5cblxuXG52YWwgcmVwbGFjZTogaW50IC0+ICdhIC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFtyZXBsYWNlIGkgeCB4c10gUmVwbGFjZSB0aGUgW2lddGggZWxlbWVudCBvZiBbeHNdIGJ5IFt4XS5cblxuICAgIFByZWNvbmRpdGlvbi4gWzAgPD0gaSAmJiBpIDwgbGVuZ3RoIHhzXVxuKilcblxuXG5cbnZhbCByZW1vdmU6IGludCAtPiAnYSB0IC0+ICdhIHRcbigqKiBbcmVtb3ZlIGkgeHNdIFJlbW92ZSB0aGUgW2lddGggZWxlbWVudCBmcm9tIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPCBsZW5ndGggeHNdLlxuKilcblxuXG5cbnZhbCByZW1vdmVfZmlyc3Q6ICdhIHQgLT4gJ2EgdFxuKCoqIFtyZW1vdmVfZmlyc3QgeHNdIFJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbaGFzX3NvbWUgeHNdXG4qKVxuXG5cblxudmFsIHJlbW92ZV9sYXN0OiAnYSB0IC0+ICdhIHRcbigqKiBbcmVtb3ZlX2xhc3QgeHNdIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gdGhlIGFycmF5IFt4c10uXG5cbiAgICBQcmVjb25kaXRpb246IFtoYXNfc29tZSB4c11cbiopXG5cblxuXG52YWwgbWFwOiAoJ2EgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgdFxuKCoqIFttYXAgZiBhcnJdIENyZWF0ZSBhIG5ldyBhcnJheSBieSBtYXBwaW5nIGFsbCBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgYXJyYXlcbiAgICBieSB0aGUgZnVuY3Rpb24gW2ZdLlxuKilcblxuXG5cbnZhbCBmb2xkX2xlZnQ6ICgnYSAtPiAnYiAtPiAnYSkgLT4gJ2EgLT4gJ2IgdCAtPiAnYVxuKCoqIFtmb2xkX2xlZnQgZiBzdGFydCBhcnJdXG5cbiAgICBGb2xkIHRoZSBmb2xkaW5nIGZ1bmN0aW9uIFtmXSB3aXRoIHN0YXJ0IHZhbHVlIFtzdGFydF0gb3ZlciB0aGUgYXJyYXkgW2Fycl0uXG5cbiAgICBDb21wdXRlXG4gICAge1tcbiAgICAgICAgKGYgKC4uLiAoZiAoZiBzdGFydCBhcnIuKDApKSBhcnIuKDEpKSAuLi4pIGFyci4obiAtIDEpXG4gICAgXX1cblxuICAgIHdoZXJlIFtuID0gbGVuZ3RoIGFycl0uXG4qKVxuXG5cbnZhbCBmb2xkaV9sZWZ0OiAoJ2EgLT4gaW50IC0+ICdiIC0+ICdhKSAtPiAnYSAtPiAnYiB0IC0+ICdhXG4oKiogW2ZvbGRpX2xlZnQgZiBzdGFydCBhcnJdXG5cbiAgICBMaWtlIFtmb2xkX2xlZnRdIHdpdGggdGhlIGN1cnJlbnQgaW5kZXggYXMgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byB0aGVcbiAgICBmb2xkaW5nIGZ1bmN0aW9uLlxuKilcblxuXG52YWwgZm9sZF9yaWdodDogKCdiIC0+ICdhIC0+ICdhKSAtPiAnYiBhcnJheSAtPiAnYSAtPiAnYVxuKCoqIFtmb2xkX3JpZ2h0IGYgYXJyIHN0YXJ0XVxuXG4gICAgQ29tcHV0ZVxuICAgIHtbXG4gICAgICAgIGYgYXJyLigwKSAoZiBhcnIuKDEpICggLi4uIChmIGFyci4obiAtIDEpIHN0YXJ0KSAuLi4gKSlcbiAgICBdfVxuICAgIHdoZXJlIFtuID0gbGVuZ3RoIGFycl1cbiopXG5cblxudmFsIGNvcHk6ICdhIHQgLT4gJ2EgdFxuKCoqIE1ha2UgYSBjb3B5IG9mIHRoZSBhcnJheS4gKilcblxuXG5cbnZhbCBzdWI6ICdhIHQgLT4gaW50IC0+IGludCAtPiAnYSB0XG4oKiogW3N1YiBhcnIgc3RhcnQgbGVuXSBUaGUgc3ViYXJyYXkgb2YgW2Fycl0gc3RhcnRpbmcgYXQgW3N0YXJ0XSB3aXRoIGxlbmdodFxuICAgIFtsZW5dLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBzdGFydCAmJiBzdGFydCArIGxlbiA8PSBsZW5ndGggYXJyXVxuKilcblxuXG5cbnZhbCBibGl0OiAnYSB0IC0+IGludCAtPiAnYSB0IC0+IGludCAtPiBpbnQgLT4gdW5pdFxuKCoqIFtibGl0IHNyYyBzcmNfcG9zIGRzdCBkc3RfcG9zIGxlbl1cblxuICAgIENvcHkgW2xlbl0gdmFsdWVzIGZyb20gYXJyYXkgW3NyY10gc3RhcnRpbmcgYXQgW3NyY19wb3NdIHRvIGFycmF5IFtkc3RdXG4gICAgc3RhcnRpbmcgYXQgW2RzdF9wb3NdLlxuKilcblxuXG52YWwgZmluZDogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gaW50IG9wdGlvblxuKCoqIFtmaW5kIHAgYXJyXVxuXG4gICAgRmluZCB0aGUgZWxlbWVudCBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUgW3BdIGluIHRoZSBhcnJheSBbYXJyXS4gUmV0dXJuXG4gICAgW05vbmVdIGlmIG5vIHN1Y2ggZWxlbWVudCBleGlzdHMuXG4qKVxuXG5cbnZhbCBmb3JfYWxsOiAoJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiBib29sXG4oKiogW2Zvcl9hbGwgcCBhcnJdXG5cbiAgICBEbyBhbGwgZWxlbWVudHMgb2YgdGhlIGFycmF5IFthcnJdIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBbcF0/XG4qKVxuXG5cblxudmFsIGV4aXN0czogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbFxuKCoqIFtleGlzdHMgcCBhcnJdXG5cbiAgICBFeGlzdHMgYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkgW2Fycl0gd2hpY2ggc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUgW3BdP1xuKilcblxuXG5cblxudmFsIHB1c2g6ICdhIC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFtwdXNoIGEgYXJyXSBQdXNoIGVsZW1lbnQgW2FdIHRvIHRoZSByZWFyIGVuZCBvZiB0aGUgYXJyYXkgW2Fycl0uICopXG5cblxudmFsIHB1c2hfZnJvbnQ6ICdhIC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFtwdXNoX2Zyb250IGEgYXJyXSBQdXNoIGVsZW1lbnQgW2FdIHRvIHRoZSBmcm9udCBlbmQgb2YgdGhlIGFycmF5IFthcnJdLiAqKVxuXG5cbnZhbCB0b19saXN0OiAnYSB0IC0+ICdhIGxpc3RcbigqKiBbdG9fbGlzdCBhcnJdIENvbnZlcnQgdGhlIGFycmF5IFthcnJdIHRvIGEgbGlzdCB3aXRoIHRoZSBzYW1lIGNvbnRlbnQuICopXG5cblxudmFsIG9mX2xpc3Q6ICdhIGxpc3QgLT4gJ2EgYXJyYXlcbigqKiBbb2ZfbGlzdCBsc3RdIENvbnZlcnQgdGhlIGxpc3QgW2xzdF0gdG8gYW4gYXJyYXkgd2l0aCB0aGUgc2FtZSBjb250ZW50LiAqKVxuXG5cblxuXG5cbigqKiB7MSBCaW5hcnkgU2VhcmNofSAqKVxuXG5cbnZhbCBiaW5zZWFyY2g6ICgna2V5IC0+ICdrZXkgLT4gaW50KSAtPiAoJ2EgLT4gJ2tleSkgLT4gJ2tleSAtPiAnYSB0IC0+IGludCAqIGJvb2xcbigqKiBbYmluc2VhcmNoIGNvbXBhcmUga2V5X29mIGtleSBhcnJdXG5cbiAgICBTZWFyY2ggdGhlIHBvc2l0aW9uIG9mIFtrZXldIGluIFthcnJdLiBBc3N1bWUgdGhhdCB0aGUgYXJyYXkgW2Fycl0gaXMgc29ydGVkXG4gICAgd2l0aG91dCBkdXBsaWNhdGVzLiBJdCByZXR1cm5zIHRoZSBwYWlyIFtwb3NpdGlvbiwgZXhhY3RfZmxhZ10gd2l0aCB0aGUgbWVhbmluZ1xuXG4gICAge1tcbiAgICAgICAgZXhhY3RfZmxhZyAgICAgICAgICA9PiAgICAgIGtleSA9IGtleV9vZiBhcnIuKHBvc2l0aW9uKVxuXG4gICAgICAgIG5vdCBleGFjdF9mbGFnICAgICAgPT4gICAgICBrZXkgPCBrZXlfb2YgYXJyLihwb3NpdGlvbilcbiAgICBdfVxuXG4gICAgQ29ybmVyIGNhc2U6IFtwb3NpdGlvbiA9IGxlbmd0aCBhcnIsIGV4YWN0X2ZsZyA9IGZhbHNlXS4gVGhpcyBjb3JyZXNwb25kcyB0b1xuICAgIGEgZmljdGl0aW91cyBrZXkgb2YgWytpbmZpbml0eV0gYXQgdGhlIGlsbGVnYWwgcG9zaXRpb24gW2xlbmd0aCBhcnJdLlxuXG4gICAgVGhlIGFycmF5IFthcnJdIGNvbnNpc3RzIG9mIGVsZW1lbnRzIG9mIHR5cGUgWydhXS4gVGhlIGZ1bmN0aW9uIFtrZXlfb2ZdXG4gICAgZXh0cmFjdHMgYSBrZXkgZnJvbSBhbiBlbGVtZW50IG9mIHRoZSBhcnJheS4gVGhlIGtleXMgYXJlIGNvbXBhcmVkIHVzaW5nIHRoZVxuICAgIGNvbXBhcmlzb24gZnVuY3Rpb24gW2NvbXBhcmVdIHdpdGggdGhlIHVzdWFsIG1lYW5pbmc6XG5cbiAgICBbY29tcGFyZSBhIGIgPCAwXSAgICAgICAgICAgICAgIGlmIGFuZCBvbmx5IGlmIFthIDwgYl1cblxuICAgIFtjb21wYXJlIGEgYiA9IDBdICAgICAgICAgICAgICAgaWYgYW5kIG9ubHkgaWYgW2EgPSBiXVxuXG4gICAgW2NvbXBhcmUgYSBiID4gMF0gICAgICAgICAgICAgICBpZiBhbmQgb25seSBpZiBbYSA+IGJdXG4qKVxuXG5cblxuXG5cblxuXG4oKiogezEgU2V0cyBhbmQgTWFwcyBiYXNlZCBvbiBhcnJheXN9ICopXG5cblxuXG4oKiogQSBzZXQgYmFzZWQgb24gYXJyYXlzICopXG5tb2R1bGUgU2V0IChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpOlxuc2lnXG4gICAgaW5jbHVkZSBJbnRlcmZhY2VzLlNFVCB3aXRoIHR5cGUgaXRlbSA9IEtleS50XG5cbiAgICB2YWwgZWxlbWVudDogaW50IC0+IHQgLT4gS2V5LnRcbiAgICAoKiogW2VsZW1lbnQgaSBzZXRdIFRoZSBbaV10aCBlbGVtZW50IG9mIHRoZSBzZXQuICopXG5cblxuICAgIHZhbCBpbmRleF9vZjogS2V5LnQgLT4gdCAtPiBpbnQgb3B0aW9uXG4gICAgKCoqIFtpbmRleF9vZiBlIHNldF0gQ29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgW2VdIHdpdGhpbiB0aGUgc2V0XG4gICAgICAgIFtzZXRdLCBpZiBbZV0gaXMgaW4gdGhlIHNldC4gKilcblxuXG4gICAgdmFsIHNpbmdsZXRvbjogS2V5LnQgLT4gdFxuICAgICgqKiBbc2luZ2xldG9uIGVdIFRoZSBzaW5nbGV0b24gc2V0IHdpdGggdGhlIG9ubHkgZWxlbWVudCBbZV0uICopXG5lbmRcblxuXG5cblxuXG5cbigqKiBBIG1hcCBiYXNlZCBvbiBhcnJheXMgKilcbm1vZHVsZSBNYXAgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSk6XG5zaWdcbiAgICBpbmNsdWRlIEludGVyZmFjZXMuTUFQIHdpdGggdHlwZSBrZXkgPSBLZXkudFxuXG5cbiAgICAoKiogW3BhaXIgaSBtYXBdIFRoZSBbaV10aCBrZXkgdmFsdWUgcGFpciBvZiBbbWFwXS5cblxuICAgICAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8IGNhcmRpbmFsIG1hcF1cbiAgICAqKVxuICAgIHZhbCBwYWlyOiBpbnQgLT4gJ2EgdCAtPiBLZXkudCAqICdhXG5cblxuICAgICgqKiBbc2luZ2xldG9uIGtleSB2YWx1ZV0gVGhlIG1hcCB3aXRoIHRoZSBvbmx5IGtleSB2YWx1ZSBwYWlyXG4gICAgICAgIFsoa2V5LHZhbHVlKV0uICopXG4gICAgdmFsIHNpbmdsZXRvbjogS2V5LnQgLT4gJ2EgLT4gJ2EgdFxuZW5kXG4iLCJpbmNsdWRlIFN0ZGxpYi5BcnJheVxuXG5cbnR5cGUgJ2EgdCA9ICdhIGFycmF5XG5cbmxldCBpc19lbXB0eSAoeHM6ICdhIHQpOiBib29sID1cbiAgICBsZW5ndGggeHMgPSAwXG5cblxubGV0IHZhbGlkX2luZGV4IChpOiBpbnQpICh4czogJ2EgdCk6IGJvb2wgPVxuICAgIDAgPD0gaSAmJiBpIDwgbGVuZ3RoIHhzXG5cblxubGV0IGhhc19zb21lICh4czogJ2EgdCk6IGJvb2wgPVxuICAgIDAgPCBsZW5ndGggeHNcblxuXG5sZXQgZmlyc3QgKHhzOiAnYSB0KTogJ2EgPVxuICAgIGFzc2VydCAoaGFzX3NvbWUgeHMpO1xuICAgIGdldCB4cyAwXG5cblxubGV0IGxhc3QgKHhzOiAnYSB0KTogJ3QgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBhc3NlcnQgKDAgPCBsZW4pO1xuICAgIGdldCB4cyAobGVuIC0gMSlcblxuXG5cbmxldCBmb2xkaV9sZWZ0IChmOiAnYSAtPiBpbnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpICh4czogJ2IgdCk6ICdhID1cbiAgICBmb2xkX2xlZnRcbiAgICAgICAgKGZ1biAoc3RhcnQsIGlkeCkgZSAtPiBmIHN0YXJ0IGlkeCBlLCBpZHggKyAxKVxuICAgICAgICAoc3RhcnQsIDApXG4gICAgICAgIHhzXG4gICAgfD5cbiAgICBmc3RcblxuXG5sZXQgcHVzaCAoeDogJ2EpICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGxldCB4c19uZXcgPSBtYWtlIChsZW4gKyAxKSB4IGluXG4gICAgYmxpdCB4cyAwIHhzX25ldyAwIGxlbjtcbiAgICB4c19uZXdcblxuXG5sZXQgcHVzaF9mcm9udCAoeDogJ2EpICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGxldCB4c19uZXcgPSBtYWtlIChsZW4gKyAxKSB4IGluXG4gICAgYmxpdCB4cyAwIHhzX25ldyAxIGxlbjtcbiAgICB4c19uZXdcblxuXG5sZXQgaW5zZXJ0IChpOiBpbnQpICh4OiAnYSkgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgYXNzZXJ0IChpIDw9IGxlbmd0aCB4cyk7XG4gICAgKCogMCAxIC4uLiAoaS0xKSAgIGkgLi4uIChsZW4tMSlcbiAgICAgICAgICAgICAgICAgICAgIF4gaW5zZXJ0IGhlcmVcbiAgICAqKVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBsZXQgYXJyID0gbWFrZSAobGVuICsgMSkgeCBpblxuICAgIGJsaXQgeHMgMCBhcnIgMCBpO1xuICAgIGJsaXQgeHMgaSBhcnIgKGkgKyAxKSAobGVuIC0gaSk7XG4gICAgYXJyXG5cblxubGV0IHJlcGxhY2UgKGk6IGludCkgKHg6ICdhKSAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICBhc3NlcnQgKGkgPCBsZW5ndGggeHMpO1xuICAgICgqIDAgMSAuLi4gaSAuLi4gKGxlbi0xKVxuICAgICAgICAgICAgICAgXiByZXBsYWNlXG4gICAgKilcbiAgICBsZXQgYXJyID0gY29weSB4cyBpblxuICAgIHNldCBhcnIgaSB4O1xuICAgIGFyclxuXG5cblxubGV0IHJlbW92ZSAoaTogaW50KSAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICBhc3NlcnQgKGkgPCBsZW5ndGggeHMpO1xuICAgICgqIDAgMSAuLi4gaSAgKGkgKyAxKSAuLi4gKGxlbi0xKVxuICAgICAgICAgICAgICAgXiByZW1vdmVcbiAgICAqKVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBhc3NlcnQgKDAgPCBsZW4pO1xuICAgIGxldCBhcnIgPSBtYWtlIChsZW4gLSAxKSAoZ2V0IHhzIDApIGluXG4gICAgYmxpdCB4cyAwIGFyciAwIGk7XG4gICAgYmxpdCB4cyAoaSArIDEpIGFyciBpIChsZW4gLSAoaSArIDEpKTtcbiAgICBhcnJcblxuXG5sZXQgcmVtb3ZlX2ZpcnN0ICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGFzc2VydCAoMCA8IGxlbik7XG4gICAgc3ViIHhzIDEgKGxlbiAtIDEpXG5cblxuXG5sZXQgcmVtb3ZlX2xhc3QgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgYXNzZXJ0ICgwIDwgbGVuKTtcbiAgICBzdWIgeHMgMCAobGVuIC0gMSlcblxuXG5cbmxldCBmaW5kIChwOiAnYSAtPiBib29sKSAoYXJyOiAnYSBhcnJheSk6IGludCBvcHRpb24gPVxuICAgIGxldCBsZW4gPSBsZW5ndGggYXJyXG4gICAgaW5cbiAgICBsZXQgcmVjIGZpbmRfZnJvbSBpID1cbiAgICAgICAgaWYgaSA9IGxlbiB0aGVuXG4gICAgICAgICAgICBOb25lXG4gICAgICAgIGVsc2UgaWYgcCAoZ2V0IGFyciBpKSB0aGVuXG4gICAgICAgICAgICBTb21lIGlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9mcm9tIChpICsgMSlcbiAgICBpblxuICAgIGZpbmRfZnJvbSAwXG5cblxubGV0IGJpbnNlYXJjaFxuICAgICAgICAoY29tcGFyZTogJ2tleSAtPiAna2V5IC0+IGludClcbiAgICAgICAgKGtleV9vZjogJ2EgLT4gJ2tleSlcbiAgICAgICAgKGtleTogJ2tleSlcbiAgICAgICAgKGFycjogJ2EgYXJyYXkpXG4gICAgOiBpbnQgKiBib29sID1cbiAgICAoKiBTZWFyY2ggdGhlIHBvc2l0aW9uIG9mIFtrZXldIGluIFthcnJdIHdoaWNoIGlzIHNvcnRlZCB3aXRob3V0XG4gICAgICAgZHVwbGljYXRlcy5cblxuICAgICAgICBSZXN1bHQ6IGksIGV4YWN0X2ZsYWcgd2l0aCBba2V5IDw9IHByb2plY3QgYXJyLihpKV1cblxuICAgICAgICBJZiBbZXhhY3RfZmxhZ10gaXMgc2V0LCB0aGUga2V5IGluIHBvc2l0aW9uIFtpXSBpcyBleGFjdGx5IFtrZXldLFxuICAgICAgICBvdGhlcndpc2UgdGhlIGtleSBpbiBwb3NpdGlvbiBbaV0gaXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIFtrZXldLlxuXG4gICAgICAgIENvcm5lciBjYXNlOiBbaSA9IGxlbmd0aCBhcnIsIGV4YWN0X2ZsYWcgPSBmYWxzZV0uIFRoaXMgY29ycmVzcG9uZHMgdG8gYVxuICAgICAgICBmaWN0aXRpb3VzIGtleSBvZiBbKyBpbmZpbml0eV0gYXQgcG9zaXRpb24gW2xlbmd0aCBhcnJdLlxuXG4gICAgICAgIFByZWNvbmRpdGlvbjpcbiAgICAgICAgICAgIFRoZSBhcnJheSBtdXN0IGJlIHNvcnRlZCBhbmQgZG9lcyBub3QgY29udGFpbiBkdXBsaWNhdGVzLlxuICAgICopXG4gICAgbGV0IGxlbiA9IGxlbmd0aCBhcnJcbiAgICBpblxuICAgIGlmIGxlbiA9IDAgdGhlblxuICAgICAgICBsZW4sIGZhbHNlXG4gICAgZWxzZSBpZiBsZW4gPSAxIHRoZW5cbiAgICAgICAgbGV0IGNtcCA9IGNvbXBhcmUga2V5IChnZXQgYXJyIDAgfD4ga2V5X29mKSBpblxuICAgICAgICBpZiBjbXAgPD0gMCB0aGVuXG4gICAgICAgICAgICAwLCBjbXAgPSAwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxlbiwgZmFsc2VcbiAgICBlbHNlXG4gICAgICAgIGxldCByZWMgc2VhcmNoIGxvd2VyIHVwcGVyID1cbiAgICAgICAgICAgICgqIEludmFyaWFudDpcblxuICAgICAgICAgICAgICAgIDAgPD0gbG93ZXIgPCB1cHBlciA8IGxlblxuICAgICAgICAgICAgICAgIGFyci4obG93ZXIpIDwga2V5IDwgYXJyLih1cHBlcilcbiAgICAgICAgICAgICopXG4gICAgICAgICAgICBpZiBsb3dlciArIDEgPSB1cHBlciB0aGVuXG4gICAgICAgICAgICAgICAgdXBwZXIsIGZhbHNlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbGV0IG1pZCA9IGxvd2VyICsgKHVwcGVyIC0gbG93ZXIpIC8gMiBpblxuICAgICAgICAgICAgICAgIGFzc2VydCAobG93ZXIgPCBtaWQpO1xuICAgICAgICAgICAgICAgIGFzc2VydCAobWlkIDwgdXBwZXIpO1xuICAgICAgICAgICAgICAgIGxldCBjbXAgPSBjb21wYXJlIGtleSAoZ2V0IGFyciBtaWQgfD4ga2V5X29mKSBpblxuICAgICAgICAgICAgICAgIGlmIGNtcCA9IDAgdGhlblxuICAgICAgICAgICAgICAgICAgICBtaWQsIHRydWVcbiAgICAgICAgICAgICAgICBlbHNlIGlmIGNtcCA8IDAgdGhlblxuICAgICAgICAgICAgICAgICAgICBzZWFyY2ggbG93ZXIgbWlkXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBzZWFyY2ggbWlkIHVwcGVyXG4gICAgICAgIGluXG4gICAgICAgIGxldCBsb3dlciwgdXBwZXIgPSAwLCBsZW4gLSAxIGluXG4gICAgICAgIGxldCBjbXAgPSBjb21wYXJlIGtleSAoZ2V0IGFyciBsb3dlciB8PiBrZXlfb2YpIGluXG4gICAgICAgIGlmIGNtcCA8PSAwIHRoZW5cbiAgICAgICAgICAgICgqIGtleSBpcyBsZXNzIG9yIGVxdWFsIHRoZSBmaXJzdCBlbGVtZW50ICopXG4gICAgICAgICAgICBsb3dlciwgY21wID0gMFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICAoKiBrZXkgaXMgZ3JlYXRlciB0aGFuIHRoZSBmaXJzdCBlbGVtZW50ICopXG4gICAgICAgICAgICBsZXQgY21wID0gY29tcGFyZSBrZXkgKGdldCBhcnIgdXBwZXIgfD4ga2V5X29mKSBpblxuICAgICAgICAgICAgaWYgY21wIDwgMCB0aGVuXG4gICAgICAgICAgICAgICAgKCogaW52YXJpYW50IGZvciBbc2VhcmNoXSBzYXRpc2ZpZWQuICopXG4gICAgICAgICAgICAgICAgc2VhcmNoIGxvd2VyIHVwcGVyXG4gICAgICAgICAgICBlbHNlIGlmIGNtcCA9IDAgdGhlblxuICAgICAgICAgICAgICAgICgqIGV4YWN0IG1hdGNoIHdpdGggdGhlIGxhc3QgZWxlbWVudCAqKVxuICAgICAgICAgICAgICAgIHVwcGVyLCB0cnVlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgKCoga2V5IGlzIGdyZWF0ZXIgdGhhbiBhbGwgZWxlbWVudHMgKilcbiAgICAgICAgICAgICAgICBsZW4sIGZhbHNlXG5cblxuXG5cblxuXG5tb2R1bGUgTWFwIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIHR5cGUga2V5ID0gS2V5LnRcblxuICAgIHR5cGUgJ2EgdCA9IChLZXkudCAqICdhKSBhcnJheVxuXG5cbiAgICBsZXQgY2FyZGluYWwgKG1hcDogJ2EgdCk6IGludCA9XG4gICAgICAgIGxlbmd0aCBtYXBcblxuXG4gICAgbGV0IGlzX2VtcHR5IChtYXA6ICdhIHQpOiBib29sID1cbiAgICAgICAgY2FyZGluYWwgbWFwID0gMFxuXG5cbiAgICBsZXQgYmluZGluZ3MgKG1hcDogJ2EgdCk6IChLZXkudCAqICdhKSBsaXN0ID1cbiAgICAgICAgdG9fbGlzdCBtYXBcblxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpIChtYXA6ICdiIHQpOiAnYSA9XG4gICAgICAgIFN0ZGxpYi5BcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gYSAoa2V5LCB2YWx1ZSkgLT4gZiBhIGtleSB2YWx1ZSlcbiAgICAgICAgICAgIHN0YXJ0XG4gICAgICAgICAgICBtYXBcblxuICAgIGxldCBmb2xkX3JpZ2h0IChmOiAnYSAtPiBLZXkudCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKG1hcDogJ2IgdCkgPVxuICAgICAgICBTdGRsaWIuQXJyYXkuZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biAoa2V5LCB2YWx1ZSkgcmVzdWx0IC0+IGYgcmVzdWx0IGtleSB2YWx1ZSlcbiAgICAgICAgICAgIG1hcFxuICAgICAgICAgICAgc3RhcnRcblxuXG4gICAgbGV0IGluZGV4X29mIChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogaW50IG9wdGlvbiA9XG4gICAgICAgIGxldCBsZW4gPSBsZW5ndGggbWFwIGluXG4gICAgICAgIGxldCBpLCBleGFjdCA9IGJpbnNlYXJjaCBLZXkuY29tcGFyZSBmc3Qga2V5IG1hcCBpblxuICAgICAgICBpZiBpID0gbGVuIHx8IG5vdCBleGFjdCB0aGVuXG4gICAgICAgICAgICBOb25lXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIFNvbWUgaVxuXG4gICAgbGV0IHBhaXIgKGk6IGludCkgKG1hcDogJ2EgdCk6IEtleS50ICogJ2EgPVxuICAgICAgICBhc3NlcnQgKGkgPCBjYXJkaW5hbCBtYXApO1xuICAgICAgICBnZXQgbWFwIGlcblxuXG4gICAgbGV0IGZpbmRfb3B0IChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogJ2Egb3B0aW9uID1cbiAgICAgICAgT3B0aW9uLm1hcFxuICAgICAgICAgICAgKGZ1biBpIC0+IHNuZCAoZ2V0IG1hcCBpKSlcbiAgICAgICAgICAgIChpbmRleF9vZiBrZXkgbWFwKVxuXG5cbiAgICBsZXQgbWVtIChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogYm9vbCA9XG4gICAgICAgIGluZGV4X29mIGtleSBtYXAgPD4gTm9uZVxuXG5cbiAgICBsZXQgZW1wdHk6ICdhIHQgPVxuICAgICAgICBbfHxdXG5cblxuICAgIGxldCBzaW5nbGV0b24gKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpOiAnYSB0ID1cbiAgICAgICAgW3wga2V5LCB2YWx1ZSB8XVxuXG5cblxuICAgIGxldCBhZGQgKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbGV0IGksZXhhY3QgPSBiaW5zZWFyY2ggS2V5LmNvbXBhcmUgZnN0IGtleSBtYXAgaW5cbiAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgcmVwbGFjZSBpIChrZXksIHZhbHVlKSBtYXBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaW5zZXJ0IGkgKGtleSwgdmFsdWUpIG1hcFxuXG5cblxuICAgIGxldCB1cGRhdGUgKGtleTogS2V5LnQpIChmOiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGxldCBpLCBleGFjdCA9IGJpbnNlYXJjaCBLZXkuY29tcGFyZSBmc3Qga2V5IG1hcCBpblxuICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICBtYXRjaCBmIChTb21lIChnZXQgbWFwIGkgfD4gc25kKSkgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgcmVtb3ZlIGkgbWFwXG4gICAgICAgICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICByZXBsYWNlIGkgKGtleSwgdmFsdWUpIG1hcFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXRjaCBmIE5vbmUgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICBpbnNlcnQgaSAoa2V5LCB2YWx1ZSkgbWFwXG5cblxuICAgIGxldCByZW1vdmUgKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbGV0IGksIGV4YWN0ID0gYmluc2VhcmNoIEtleS5jb21wYXJlIGZzdCBrZXkgbWFwIGluXG4gICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgIHJlbW92ZSBpIG1hcFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXBcbmVuZFxuXG5cblxuXG5cbm1vZHVsZSBTZXQgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgbW9kdWxlIE0gPSAgTWFwIChLZXkpXG5cbiAgICB0eXBlIGl0ZW0gPSBLZXkudFxuXG4gICAgdHlwZSB0ID0gdW5pdCBNLnRcblxuICAgIGxldCBjYXJkaW5hbCAoc2V0OiB0KTogaW50ID1cbiAgICAgICAgTS5jYXJkaW5hbCBzZXRcblxuXG4gICAgbGV0IGlzX2VtcHR5ID0gTS5pc19lbXB0eVxuXG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOiAnYSAtPiBLZXkudCAtPiAnYSkgKHN0YXJ0OiAnYSkgKHNldDogdCk6ICdhID1cbiAgICAgICAgTS5mb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gcmVzIGtleSBfIC0+IGYgcmVzIGtleSlcbiAgICAgICAgICAgIHN0YXJ0XG4gICAgICAgICAgICBzZXRcblxuXG4gICAgbGV0IGZvbGRfcmlnaHQgKGY6ICdhIC0+IEtleS50IC0+ICdhKSAoc3RhcnQ6ICdhKSAoc2V0OiB0KTogJ2EgPVxuICAgICAgICBNLmZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gcmVzIGtleSBfIC0+IGYgcmVzIGtleSlcbiAgICAgICAgICAgIHN0YXJ0XG4gICAgICAgICAgICBzZXRcblxuXG4gICAgbGV0IGVsZW1lbnRzIChzZXQ6IHQpOiBLZXkudCBsaXN0ID1cbiAgICAgICAgZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biBsc3Qga2V5IC0+IGtleSA6OiBsc3QpXG4gICAgICAgICAgICBbXVxuICAgICAgICAgICAgc2V0XG5cblxuICAgIGxldCBlbGVtZW50IChpOiBpbnQpIChzZXQ6IHQpOiBLZXkudCA9XG4gICAgICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICAgICAgYXNzZXJ0IChpIDwgY2FyZGluYWwgc2V0KTtcbiAgICAgICAgTS5wYWlyIGkgc2V0IHw+IGZzdFxuXG5cbiAgICBsZXQgaW5kZXhfb2YgPSBNLmluZGV4X29mXG5cblxuICAgIGxldCBlbXB0eSA9IE0uZW1wdHlcblxuXG4gICAgbGV0IHNpbmdsZXRvbiAoZTogS2V5LnQpOiB0ID1cbiAgICAgICAgTS5zaW5nbGV0b24gZSAoKVxuXG5cbiAgICBsZXQgbWVtID0gTS5tZW1cblxuXG4gICAgbGV0IGFkZCAoZTogS2V5LnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgTS5hZGQgZSAoKSBzZXRcblxuXG4gICAgbGV0IHJlbW92ZSA9IE0ucmVtb3ZlXG5lbmRcblxuXG5cblxuXG5cblxuXG5cblxuKCogVW5pdCBUZXN0c1xuICogPT09PT09PT09PVxuICopXG5cblxuKCogQmluYXJ5IHNlYXJjaCAqKVxubGV0JXRlc3QgXyA9XG4gICAgYmluc2VhcmNoIEludC5jb21wYXJlIEZ1bi5pZCAxMDAgW3x8XSA9ICgwLCBmYWxzZSlcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGJpbnNlYXJjaCBJbnQuY29tcGFyZSBGdW4uaWQgOTkgW3wxMDB8XSA9ICgwLCBmYWxzZSlcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGJpbnNlYXJjaCBJbnQuY29tcGFyZSBGdW4uaWQgMTAwIFt8MTAwfF0gPSAoMCwgdHJ1ZSlcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGJpbnNlYXJjaCBJbnQuY29tcGFyZSBGdW4uaWQgMTAxIFt8MTAwfF0gPSAoMSwgZmFsc2UpXG5cblxuXG5cblxuKCogU2V0ICopXG5tb2R1bGUgU2V0SW50ID0gU2V0IChJbnQpXG5cbmxldCBpbnNlcnRfZG93bndhcmQgKGxvd2VyOiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogU2V0SW50LnQpOiBTZXRJbnQudCA9XG4gICAgbGV0IHJlYyBpbnNlcnQgaSBzZXQgPVxuICAgICAgICBpZiBpID0gbG93ZXIgdGhlblxuICAgICAgICAgICAgc2V0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBpID0gaSAtIDEgaW5cbiAgICAgICAgICAgIGluc2VydCBpIChTZXRJbnQuYWRkIGkgc2V0KVxuICAgIGluXG4gICAgaW5zZXJ0IGJleW9uZCBzZXRcblxubGV0IGluc2VydF91cHdhcmQgKGxvd2VyOiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogU2V0SW50LnQpOiBTZXRJbnQudCA9XG4gICAgbGV0IHJlYyBpbnNlcnQgaSBzZXQgPVxuICAgICAgICBpZiBpID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgIHNldFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpbnNlcnQgKGkgKyAxKSAoU2V0SW50LmFkZCBpIHNldClcbiAgICBpblxuICAgIGluc2VydCBsb3dlciBzZXRcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGluc2VydF91cHdhcmQgMCAzIFNldEludC5lbXB0eSA9IFt8MCwoKTsgMSwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgPSBbfDAsKCk7IDEsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5IHw+IFNldEludC5yZW1vdmUgMSA9IFt8MCwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgIHw+IFNldEludC5yZW1vdmUgNCA9IFt8MCwoKTsgMSwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgKGluc2VydF91cHdhcmQgMCAzIFNldEludC5lbXB0eSB8PiBpbnNlcnRfZG93bndhcmQgMCAzKVxuICAgID1cbiAgICBbfDAsKCk7IDEsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIChpbnNlcnRfdXB3YXJkIDAgMyBTZXRJbnQuZW1wdHkgfD4gaW5zZXJ0X2Rvd253YXJkIDMgNilcbiAgICA9XG4gICAgW3wwLCgpOyAxLCgpOyAyLCgpOyAzLCgpOyA0LCgpOyA1LCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICAoaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgfD4gU2V0SW50LnJlbW92ZSAwKVxuICAgID1cbiAgICBbfDEsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSBpblxuICAgIFNldEludC5pbmRleF9vZiAzIHNldCA9IE5vbmVcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgaW5cbiAgICBTZXRJbnQuaW5kZXhfb2YgMCBzZXQgPSBTb21lIDBcbiIsIm1vZHVsZSB0eXBlIEJJVFNJWkUgPVxuc2lnXG4gICAgdmFsIGJpdHNpemU6IGludFxuZW5kXG5cblxuXG5cbm1vZHVsZSBNYWtlIChCaXRzaXplOiBCSVRTSVpFKSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIEJpdHNpemVcblxuICAgIGxldCBicmFuY2hpbmc6IGludCA9XG4gICAgICAgIGFzc2VydCAoMCA8IGJpdHNpemUpO1xuICAgICAgICAxIGxzbCBiaXRzaXplXG5cblxuICAgIGxldCBzbG90IChpOiBpbnQpIChsOiBpbnQpOiBpbnQgPVxuICAgICAgICAoKiBUaGUgc2xvdCBvZiBpbmRleCBbaV0gYXQgbGV2ZWwgW2xdLlxuXG4gICAgICAgICAgICBpLyAyXihsICogYml0c2l6ZSlcbiAgICAgICAgICopXG4gICAgICAgIGkgbHNyIChsICogYml0c2l6ZSlcblxuXG4gICAgbGV0IG9mZnNldCAoaTogaW50KSAoczogaW50KSAobDogaW50KTogaW50ID1cbiAgICAgICAgKCogVGhlIG9mZnNldCBvZiBpbmRleCBbaV0gaW4gc2xvdCBbc10gaW4gYSB0cmVlIGF0IGxldmVsIFtsXS5cblxuICAgICAgICAgICAgaS0gcyAqIDJeKGwgKiBiaXRzaXplKVxuICAgICAgICAgKilcbiAgICAgICAgaSAtIHMgbHNsIChsICogYml0c2l6ZSlcblxuXG4gICAgbGV0IGZ1bGxfc2l6ZSAobDogaW50KTogaW50ID1cbiAgICAgICAgKCogVGhlIHNpemUgb2YgYSBmdWxsIHJhZGl4IGJhbGFuY2VkIGFycmF5IGF0IGxldmVsIFtsXS4gKilcbiAgICAgICAgYXNzZXJ0ICgwIDw9IGwpO1xuICAgICAgICAxIGxzbCAoKGwgKyAxKSAqIGJpdHNpemUpXG5cblxuICAgIHR5cGUgJ2EgdCA9XG4gICAgICAgIHwgTGVhZiBvZlxuICAgICAgICAgICAgJ2EgYXJyYXlcbiAgICAgICAgfCBOb2RlIG9mIHtcbiAgICAgICAgICAgIHNpemU6ICBpbnQ7XG4gICAgICAgICAgICBsZXZlbDogaW50O1xuICAgICAgICAgICAgbm9kZXM6ICdhIHQgYXJyYXl9XG5cblxuICAgIGxldCBsZXZlbDogJ2EgdCAtPiBpbnQgPSBmdW5jdGlvblxuICAgICAgICB8IExlYWYgXyAtPlxuICAgICAgICAgICAgMFxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbm9kZS5sZXZlbFxuXG5cbiAgICBsZXQgaXNfZnVsbDogJ2EgdCAtPiBib29sID0gZnVuY3Rpb25cbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgQXJyYXkubGVuZ3RoIGFyciA9IGZ1bGxfc2l6ZSAwXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBub2RlLnNpemUgPSBmdWxsX3NpemUgbm9kZS5sZXZlbFxuXG5cbiAgICBsZXQgbGVuZ3RoOiAnYSB0IC0+IGludCA9XG4gICAgICAgICgqIFRoZSBsZW5ndGggb2YgdGhlIHJhZGl4IGJhbGFuY2VkIGFycmF5LiAqKVxuICAgICAgICBmdW5jdGlvblxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBBcnJheS5sZW5ndGggYXJyXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBub2RlLnNpemVcblxuXG4gICAgbGV0IGhhc19zb21lICh0OiAnYSB0KTogYm9vbCA9XG4gICAgICAgIDAgPCBsZW5ndGggdFxuXG5cbiAgICBsZXQgaXNfZW1wdHkgKHQ6ICdhIHQpOiBib29sID1cbiAgICAgICAgMCA9IGxlbmd0aCB0XG5cblxuXG4gICAgbGV0IGNoZWNrX2ludmFyaWFudCAodDogJ2EgdCk6ICBib29sID1cbiAgICAgICAgbGV0IHJlYyBjaGVjayBpc19yb290ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIGFyciBpblxuICAgICAgICAgICAgICAgIGxlbiA8PSBicmFuY2hpbmdcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIChpc19yb290IHx8IDAgPCBsZW4pXG4gICAgICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgICAgIGxldCBuY2hpbGRyZW4gPSBBcnJheS5sZW5ndGggbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgQXJyYXkuZm9yX2FsbCAoY2hlY2sgZmFsc2UpIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmZvcl9hbGxcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBjaGlsZCAtPiBsZXZlbCBjaGlsZCArIDEgPSBub2RlLmxldmVsKVxuICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICBuY2hpbGRyZW4gPD0gYnJhbmNoaW5nXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICAxIDw9IG5jaGlsZHJlblxuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgKG5vdCBpc19yb290IHx8IDIgPD0gbmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBub2RlLnNpemVcbiAgICAgICAgICAgICAgICAgICAgPVxuICAgICAgICAgICAgICAgICAgICBBcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gc2l6ZSBjaGlsZCAtPiBzaXplICsgbGVuZ3RoIGNoaWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgaW5cbiAgICAgICAgY2hlY2sgdHJ1ZSB0XG5cblxuICAgIGxldCBlbXB0eTogJ2EgdCA9XG4gICAgICAgIExlYWYgW3wgfF1cblxuXG5cbiAgICAoKiBGb2xkaW5nXG4gICAgICopXG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOiAnYSAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKHQ6ICdiIHQpOiAnYSA9XG4gICAgICAgIGxldCByZWMgZm9sZCBzdGFydCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZm9sZF9sZWZ0IGYgc3RhcnQgYXJyXG4gICAgICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgICAgIEFycmF5LmZvbGRfbGVmdCBmb2xkIHN0YXJ0IG5vZGUubm9kZXNcbiAgICAgICAgaW5cbiAgICAgICAgZm9sZCBzdGFydCB0XG5cblxuXG4gICAgbGV0IGZvbGRpX2xlZnQgKGY6ICdhIC0+IGludCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKHQ6ICdiIHQpOiAnYSA9XG4gICAgICAgIGZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biAoc3RhcnQsaWR4KSBlIC0+IGYgc3RhcnQgaWR4IGUsIChpZHggKyAxKSlcbiAgICAgICAgICAgIChzdGFydCwgMClcbiAgICAgICAgICAgIHRcbiAgICAgICAgfD5cbiAgICAgICAgZnN0XG5cblxuXG4gICAgKCogRWxlbWVudCBSZXRyaWV2YWxcbiAgICAgKilcblxuICAgIGxldCByZWMgZWxlbWVudCAoaTogaW50KSAodDogJ2EgdCk6ICdhID1cbiAgICAgICAgKCogVGhlIGVsZW1lbnQgYXQgaW5kZXggW2ldIGluIHRoZSByYWRpeCBiYWxhbmNlZCBhcnJheSBbdF0uICopXG4gICAgICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICAgICAgYXNzZXJ0IChpIDwgbGVuZ3RoIHQpO1xuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgYXJyLihpKVxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbGV0IHMgPSBzbG90IGkgbm9kZS5sZXZlbCBpblxuICAgICAgICAgICAgbGV0IG8gPSBvZmZzZXQgaSBzIG5vZGUubGV2ZWwgaW5cbiAgICAgICAgICAgIGVsZW1lbnQgbyBub2RlLm5vZGVzLihzKVxuXG5cbiAgICBsZXQgZmlyc3QgKHQ6ICdhIHQpOiAnYSA9XG4gICAgICAgICgqIFRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBub24gZW1wdHkgcmFkaXggYmFsYW5jZWQgYXJyYXkgW3RdLiAqKVxuICAgICAgICBhc3NlcnQgKGhhc19zb21lIHQpO1xuICAgICAgICBsZXQgcmVjIGZzdCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZmlyc3QgYXJyXG4gICAgICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgICAgIGZzdCAoQXJyYXkuZmlyc3Qgbm9kZS5ub2RlcylcbiAgICAgICAgaW5cbiAgICAgICAgZnN0IHRcblxuXG4gICAgbGV0IGxhc3QgKHQ6ICdhIHQpOiAnYSA9XG4gICAgICAgICgqIFRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIG5vbiBlbXB0eSByYWRpeCBiYWxhbmNlZCBhcnJheSBbdF0uICopXG4gICAgICAgIGFzc2VydCAoaGFzX3NvbWUgdCk7XG4gICAgICAgIGxldCByZWMgZnN0ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5sYXN0IGFyclxuICAgICAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgICAgICBmc3QgKEFycmF5Lmxhc3Qgbm9kZS5ub2RlcylcbiAgICAgICAgaW5cbiAgICAgICAgZnN0IHRcblxuXG5cbiAgICAoKiBFbGVtZW50IFJlcGxhY2VtZW50XG4gICAgICopXG5cblxuICAgIGxldCByZWMgcmVwbGFjZSAoaTogaW50KSAoZTogJ2EpICh0OiAnYSB0KTogJ2EgdCA9XG4gICAgICAgICgqIFJlcGxhY2UgdGhlIGVsZW1lbnQgYXQgaW5kZXggW2ldIGJ5IHRoZSBlbGVtZW50IFtlXSB3aXRoaW4gdGhlIHJhZGl4XG4gICAgICAgICAgIGJhbGFuY2VkIGFycmF5IFt0XS4gKilcbiAgICAgICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgICAgICBhc3NlcnQgKGkgPCBsZW5ndGggdCk7XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBMZWFmIChBcnJheS5yZXBsYWNlIGkgZSBhcnIpXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBsZXQgcyA9IHNsb3QgaSBub2RlLmxldmVsIGluXG4gICAgICAgICAgICBsZXQgbyA9IG9mZnNldCBpIHMgbm9kZS5sZXZlbCBpblxuICAgICAgICAgICAgTm9kZVxuICAgICAgICAgICAgICAgIHtub2RlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgbm9kZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwbGFjZSBvIGUgbm9kZS5ub2Rlcy4ocykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAoKiBFbGVtZW50IEluc2VydGlvbiBhdCB0aGUgUmVhciBFbmRcbiAgICAgKilcblxuICAgIGxldCByZWMgc2luZ2xldG9uX3RyZWUgKGxldjogaW50KSAoZTogJ2EpOiAnYSB0ID1cbiAgICAgICAgKCogQ29uc3RydWN0IHRyZWUgYXQgbGV2ZWwgW2xldl0gd2l0aCB0aGUgZWxlbWVudCBbZV0uICopXG4gICAgICAgIGlmIGxldiA9IDAgdGhlblxuICAgICAgICAgICAgTGVhZiBbfCBlIHxdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vZGUge1xuICAgICAgICAgICAgICAgIHNpemUgPSAxO1xuICAgICAgICAgICAgICAgIGxldmVsID0gbGV2O1xuICAgICAgICAgICAgICAgIG5vZGVzID0gW3wgc2luZ2xldG9uX3RyZWUgKGxldiAtIDEpIGUgfF1cbiAgICAgICAgICAgIH1cblxuXG4gICAgbGV0IHJlYyBwdXNoX25vdF9mdWxsIChlOiAnYSkgKHQ6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgKCogQXBwZW5kIHRoZSBlbGVtZW50IFtlXSBhdCB0aGUgcmVhciBlbmQgb2YgdGhlIHJhZGl4IGJhbGFuY2VkIGFycmF5XG4gICAgICAgICAgIFt0XSB3aGljaCBpcyBub3QgZnVsbC4gKilcbiAgICAgICAgYXNzZXJ0IChub3QgKGlzX2Z1bGwgdCkpO1xuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgTGVhZiAoQXJyYXkucHVzaCBlIGFycilcblxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbGV0IHNsb3QgPSBBcnJheS5sZW5ndGggbm9kZS5ub2RlcyAtIDEgaW5cbiAgICAgICAgICAgIGFzc2VydCAoMCA8PSBzbG90KTtcbiAgICAgICAgICAgIGxldCBub2RlcyA9XG4gICAgICAgICAgICAgICAgaWYgaXNfZnVsbCBub2RlLm5vZGVzLihzbG90KSB0aGVuXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LnB1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgIChzaW5nbGV0b25fdHJlZSAobm9kZS5sZXZlbCAtIDEpIGUpXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBBcnJheS5yZXBsYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICBzbG90XG4gICAgICAgICAgICAgICAgICAgICAgICAocHVzaF9ub3RfZnVsbCBlIG5vZGUubm9kZXMuKHNsb3QpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIE5vZGVcbiAgICAgICAgICAgICAgICB7bm9kZSB3aXRoIG5vZGVzOyBzaXplID0gbm9kZS5zaXplICsgMX1cblxuXG4gICAgbGV0IHB1c2ggKGU6ICdhKSAodDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICAoKiBBcHBlbmQgdGhlIGVsZW1lbnQgW2VdIGF0IHRoZSByZWFyIGVuZCBvZiB0aGUgcmFkaXggYmFsYW5jZWQgYXJyYXlcbiAgICAgICAgICAgW3RdLiAqKVxuICAgICAgICBsZXQgbGV2ID0gbGV2ZWwgdFxuICAgICAgICBhbmQgbGVuID0gbGVuZ3RoIHRcbiAgICAgICAgaW5cbiAgICAgICAgaWYgbGVuID0gZnVsbF9zaXplIGxldiB0aGVuXG4gICAgICAgICAgICBOb2RlIHtcbiAgICAgICAgICAgICAgICBzaXplICA9IGxlbiArIDE7XG4gICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXYgKyAxO1xuICAgICAgICAgICAgICAgIG5vZGVzID0gW3wgdDsgc2luZ2xldG9uX3RyZWUgbGV2IGV8XVxuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwdXNoX25vdF9mdWxsIGUgdFxuXG5cblxuXG5cblxuXG4gICAgKCogRWxlbWVudCBSZW1vdmFsIGZyb20gdGhlIFJlYXIgRW5kXG4gICAgICopXG5cblxuICAgIGxldCByZWMgcG9wX2F1eCAoaXNfcm9vdDogYm9vbCkgKHQ6ICdhIHQpOiAnYSAqICdhIHQgPVxuICAgICAgICAoKiBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIGEgbm9uZW1wdHkgdHJlZS4gKilcbiAgICAgICAgYXNzZXJ0IChoYXNfc29tZSB0KTtcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIEFycmF5LihsYXN0IGFyciwgTGVhZiAocmVtb3ZlX2xhc3QgYXJyKSlcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIGxldCBqID0gQXJyYXkubGVuZ3RoIG5vZGUubm9kZXMgLSAxIGluXG4gICAgICAgICAgICBhc3NlcnQgKDAgPD0gaik7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBub2RlLm5vZGVzLihqKSBpblxuICAgICAgICAgICAgbGV0IGxlbiAgID0gbGVuZ3RoIGNoaWxkIGluXG4gICAgICAgICAgICBpZiBpc19yb290ICYmIGogPSAxICYmIGxlbiA9IDEgdGhlblxuICAgICAgICAgICAgICAgICgqIExhc3QgY2hpbGQgb2YgdGhlIHJvb3Qgbm9kZSBoYXMgb25seSBvbmUgZWxlbWVudC4gKilcbiAgICAgICAgICAgICAgICBsYXN0IGNoaWxkLFxuICAgICAgICAgICAgICAgIG5vZGUubm9kZXMuKDApXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbGV0IGUsIG5vZGVzID1cbiAgICAgICAgICAgICAgICAgICAgaWYgbGVuID0gMSB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAoKiBMYXN0IGNoaWxkIGhhcyBvbmx5IG9uZSBlbGVtZW50LiAqKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBjaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnJlbW92ZV9sYXN0IG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogTm9ybWFsIGNhc2UuICopXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSwgY2hpbGQgPSBwb3BfYXV4IGZhbHNlIGNoaWxkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVwbGFjZSBqIGNoaWxkIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgTm9kZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUgd2l0aFxuICAgICAgICAgICAgICAgICAgICBzaXplID0gbm9kZS5zaXplIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZXNcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgIGxldCBwb3AgKHQ6ICdhIHQpOiAnYSAqICdhIHQgPVxuICAgICAgICBhc3NlcnQgKGhhc19zb21lIHQpO1xuICAgICAgICBwb3BfYXV4IHRydWUgdFxuXG5cbiAgICBsZXQgcG9wX29wdCAodDogJ2EgdCk6ICgnYSAqICdhIHQpIG9wdGlvbiA9XG4gICAgICAgIGlmIGlzX2VtcHR5IHQgdGhlblxuICAgICAgICAgICAgTm9uZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBTb21lIChwb3BfYXV4IHRydWUgdClcbmVuZFxuXG5cblxuXG5tb2R1bGUgQnJhbmNoaW5nMjogQklUU0laRSA9XG5zdHJ1Y3RcbiAgICBsZXQgYml0c2l6ZTogaW50ID0gMVxuZW5kXG5cblxubW9kdWxlIEJyYW5jaGluZzMyOiBCSVRTSVpFID1cbnN0cnVjdFxuICAgIGxldCBiaXRzaXplOiBpbnQgPSA1XG5lbmRcblxuXG5cbmluY2x1ZGUgTWFrZSAoQnJhbmNoaW5nMzIpXG5cblxuXG5cblxuXG5cbigqIFVuaXQgVGVzdHNcbiAqICoqKioqKioqKipcbiAqKVxubW9kdWxlIFJiID0gTWFrZSAoQnJhbmNoaW5nMilcblxuXG5sZXQgZmlsbCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KTogaW50IFJiLnQgPVxuICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICBsZXQgcmVjIGZsIHN0YXJ0IHQgPVxuICAgICAgICBpZiBzdGFydCA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICB0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZsIChzdGFydCArIDEpIChSYi5wdXNoIHN0YXJ0IHQpXG4gICAgaW5cbiAgICBmbCBzdGFydCBSYi5lbXB0eVxuXG5cbmxldCBjaGVja19maWxsIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpOiBib29sID1cbiAgICBsZXQgcmVjIGNoZWNrIHN0YXJ0IHQgPVxuICAgICAgICBpZiBzdGFydCA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICBSYi5jaGVja19pbnZhcmlhbnQgdFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBSYi5jaGVja19pbnZhcmlhbnQgdFxuICAgICAgICAgICAgJiZcbiAgICAgICAgICAgIGNoZWNrIChzdGFydCArIDEpIChSYi5wdXNoIHN0YXJ0IHQpXG4gICAgaW5cbiAgICBjaGVjayBzdGFydCBSYi5lbXB0eVxuXG5cbmxldCBjaGVja19mb2xkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpICh0OiBpbnQgUmIudCk6IGJvb2wgPVxuICAgIHN0YXJ0ICsgUmIubGVuZ3RoIHQgPSBiZXlvbmRcbiAgICAmJlxuICAgIFJiLmZvbGRpX2xlZnRcbiAgICAgICAgKGZ1biBvayBpZHggZSAtPlxuICAgICAgICAgICAgIG9rICYmIGUgPSBzdGFydCArIGlkeClcbiAgICAgICAgdHJ1ZVxuICAgICAgICB0XG5cblxubGV0IGNoZWNrX2VsZW1lbnQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHQ6IGludCBSYi50KTogYm9vbCA9XG4gICAgbGV0IHJlYyBjaGVja19mcm9tIGkgc3RhcnQgPVxuICAgICAgICBpZiBzdGFydCA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN0YXJ0ID0gUmIuZWxlbWVudCBpIHRcbiAgICAgICAgICAgICYmXG4gICAgICAgICAgICBjaGVja19mcm9tIChpICsgMSkgKHN0YXJ0ICsgMSlcbiAgICBpblxuICAgIGNoZWNrX2Zyb20gMCBzdGFydFxuXG5cblxubGV0IGNoZWNrX3BvcCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAodDogaW50IFJiLnQpOiBib29sID1cbiAgICBsZXQgcmVjIGNoZWNrIGJleW9uZCB0ID1cbiAgICAgICAgUmIuY2hlY2tfaW52YXJpYW50IHRcbiAgICAgICAgJiZcbiAgICAgICAgKFxuICAgICAgICAgICAgaWYgYmV5b25kID0gc3RhcnQgdGhlblxuICAgICAgICAgICAgICAgIFJiLmlzX2VtcHR5IHRcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBSYi5oYXNfc29tZSB0XG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICBsZXQgZSwgdCA9IFJiLnBvcCB0IGluXG4gICAgICAgICAgICAgICAgZSArIDEgPSBiZXlvbmRcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIGNoZWNrIChiZXlvbmQgLSAxKSB0XG4gICAgICAgIClcbiAgICBpblxuICAgIGNoZWNrIGJleW9uZCB0XG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc3RhcnQgPSAxMFxuICAgIGFuZCBiZXlvbmQgPSAxMDBcbiAgICBpblxuICAgIGNoZWNrX2ZpbGwgc3RhcnQgYmV5b25kXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHN0YXJ0ID0gMTBcbiAgICBhbmQgYmV5b25kID0gMTAwXG4gICAgaW5cbiAgICBjaGVja19mb2xkIHN0YXJ0IGJleW9uZCAoZmlsbCBzdGFydCBiZXlvbmQpXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHN0YXJ0ID0gMTBcbiAgICBhbmQgYmV5b25kID0gMTAwXG4gICAgaW5cbiAgICBjaGVja19wb3Agc3RhcnQgYmV5b25kIChmaWxsIHN0YXJ0IGJleW9uZClcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzdGFydCA9IDEwXG4gICAgYW5kIGJleW9uZCA9IDEwMFxuICAgIGluXG4gICAgY2hlY2tfZWxlbWVudCBzdGFydCBiZXlvbmQgKGZpbGwgc3RhcnQgYmV5b25kKVxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgUmIuKGNoZWNrX2ludmFyaWFudCBlbXB0eSlcblxuXG5sZXQldGVzdCBfID1cbiAgICBSYi5jaGVja19pbnZhcmlhbnQgKGZpbGwgMCAyNSlcbiIsImluY2x1ZGUgU3RkbGliLkxpc3RcbmluY2x1ZGUgSW50ZXJmYWNlc1xuXG50eXBlICdhIHQgPSAnYSBsaXN0XG5cbmxldCByZXR1cm4gKGE6J2EpOiAnYSB0ID0gW2FdXG5cbmxldCByZWMgKD4+PSkgKGw6J2EgdCkgKGY6J2EgLT4gJ2IgdCk6ICdiIHQgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPlxuICAgICBbXVxuICB8IGhkIDo6IHRsIC0+XG4gICAgIGYgaGQgQCAodGwgPj49IGYpXG5cbmxldCAoIGxldCogKSA9ICg+Pj0pXG5cblxubGV0ICg+PT4pIChmOidhIC0+ICdiIHQpIChnOidiIC0+ICdjIHQpIChhOidhKTogJ2MgdCA9XG4gIGYgYSA+Pj0gZ1xuXG5cbmxldCAoPCo+KSAoZmxzdDogKCdhIC0+ICdiKSB0KSAobHN0OidhIHQpOiAnYiB0ID1cbiAgZmxzdCA+Pj0gZnVuIGYgLT4gbWFwIGYgbHN0XG5cbmxldCBqb2luID0gY29uY2F0XG5cbmxldCBmaW5kIChwOidhIC0+IGJvb2wpIChsOidhIHQpOiAnYSBvcHRpb24gPVxuICB0cnlcbiAgICBTb21lIChmaW5kIHAgbClcbiAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICBOb25lXG5cblxuXG5cbmxldCBzcGxpdF9oZWFkX3RhaWwgKGxzdDogJ2EgdCk6ICdhICogJ2EgdCA9XG4gICAgYXNzZXJ0IChsc3QgPD4gW10pO1xuICAgIG1hdGNoIGxzdCB3aXRoXG4gICAgfCBbXSAtPlxuICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsISAqKVxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgaGQsIHRsXG5cblxuXG5cblxubGV0IG1hcF9hbmRfZmlsdGVyIChmOidhIC0+ICdiIG9wdGlvbikgKGw6J2EgbGlzdCk6ICdiIGxpc3QgPVxuICBsZXQgcmVjIG1hcCA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPlxuICAgICAgIFtdXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgIG1hdGNoIGYgaGQgd2l0aFxuICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIG1hcCB0bFxuICAgICAgIHwgU29tZSBiIC0+XG4gICAgICAgICAgYiA6OiBtYXAgdGxcbiAgaW5cbiAgbWFwIGxcblxuXG5cbmxldCBzcGxpdF9hdCAocDonYSAtPiBib29sKSAobDogJ2EgdCk6ICdhIHQgKiAnYSB0ID1cbiAgbGV0IHJlYyBzcGxpdCBwcmVmaXggcmVzdCA9XG4gICAgbWF0Y2ggcmVzdCB3aXRoXG4gICAgfCBbXSAtPlxuICAgICAgIHJldiBwcmVmaXgsIHJlc3RcbiAgICB8IGhkIDo6IHRsICAtPlxuICAgICAgIGlmIHAgaGQgdGhlblxuICAgICAgICAgcmV2IHByZWZpeCwgcmVzdFxuICAgICAgIGVsc2VcbiAgICAgICAgIHNwbGl0IChoZCA6OiBwcmVmaXgpIHRsXG4gIGluXG4gIHNwbGl0IFtdIGxcblxuXG5cbmxldCB0cmFuc3Bvc2UgKHJvd19saXN0OiAnYSBsaXN0IGxpc3QpOiAnYSBsaXN0IGxpc3QgPVxuICAgIGFzc2VydCAocm93X2xpc3QgPD4gW10pO1xuICAgIGxldCBmaXJzdF9jb2x1bW4gcm93X2xpc3QgPVxuICAgICAgICAoKiBFeHRyYWN0IHRoZSBmaXJzdCBjb2x1bW4gb2YgW3Jvd19saXN0XS4gKilcbiAgICAgICAgZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biByb3cgKGNvbHVtbiwgcm93X2xpc3QpLT5cbiAgICAgICAgICAgICAgICBtYXRjaCByb3cgd2l0aFxuICAgICAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgICAgICAgfCBlbCA6OiByZXN0X3JvdyAtPlxuICAgICAgICAgICAgICAgICAgICBlbCA6OiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgIHJlc3Rfcm93IDo6IHJvd19saXN0XG4gICAgICAgICAgICApXG4gICAgICAgICAgICByb3dfbGlzdFxuICAgICAgICAgICAgKFtdLCBbXSlcbiAgICBpblxuICAgIGxldCByZWMgZ2V0X2NvbHVtbnMgY29sdW1ucyByb3dfbGlzdCA9XG4gICAgICAgIG1hdGNoIHJvd19saXN0IHdpdGhcbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIE5vIHJvd3MgaXMgbm90IGFsbG93ZWQuICopXG5cbiAgICAgICAgfCBbXSA6OiBfIC0+XG4gICAgICAgICAgICBjb2x1bW5zXG5cbiAgICAgICAgfCAoXyA6OiBfKSA6OiBfIC0+XG4gICAgICAgICAgICBsZXQgY29sdW1uLCByb3dfbGlzdCA9IGZpcnN0X2NvbHVtbiByb3dfbGlzdCBpblxuICAgICAgICAgICAgZ2V0X2NvbHVtbnMgKGNvbHVtbiA6OiBjb2x1bW5zKSByb3dfbGlzdFxuICAgIGluXG4gICAgcmV2IChnZXRfY29sdW1ucyBbXSByb3dfbGlzdClcblxuXG5cblxuXG5tb2R1bGUgTW9uYWRpYyAoTTogTU9OQUQpID1cbiAgc3RydWN0XG4gICAgbGV0IGZvbGRpX2xlZnQgKGY6aW50IC0+ICdhIC0+ICdiIC0+ICdiIE0udCkgKGw6J2EgdCkgKHN0YXJ0OidiKVxuICAgICAgICA6ICdiIE0udCA9XG4gICAgICBsZXQgcmVjIGZvbGRpIGkgbCBzdGFydCA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgIE0ucmV0dXJuIHN0YXJ0XG4gICAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgICAgTS4oZiBpIGhkIHN0YXJ0ID4+PSBmb2xkaSAoaSsxKSB0bClcbiAgICAgIGluXG4gICAgICBmb2xkaSAwIGwgc3RhcnRcblxuICAgIGxldCBmb2xkX2xlZnQgKGY6J2EgLT4gJ2IgLT4gJ2IgTS50KSAobDonYSB0KSAoc3RhcnQ6J2IpOiAnYiBNLnQgPVxuICAgICAgZm9sZGlfbGVmdCAoZnVuIF8gLT4gZikgbCBzdGFydFxuXG4gICAgbGV0IGZvbGRfcmlnaHQgKGY6J2EgLT4gJ2IgLT4gJ2IgTS50KSAobDonYSB0KSAoc3RhcnQ6J2IpOiAnYiBNLnQgPVxuICAgICAgZm9sZF9sZWZ0IGYgKHJldiBsKSBzdGFydFxuICBlbmRcblxuXG5cblxuKCogVW5pdCBUZXN0cyAqKVxuXG5sZXQldGVzdCBfID1cbiAgICB0cmFuc3Bvc2UgWyBbMV0gXSA9IFsgWzFdIF1cblxuXG5sZXQldGVzdCBfID1cbiAgICB0cmFuc3Bvc2VcbiAgICAgICAgWyBbMTsyOzNdIF0gPSBbIFsxXTsgWzJdOyBbM10gXVxuXG5sZXQldGVzdCBfID1cbiAgICB0cmFuc3Bvc2VcbiAgICAgICAgWyBbMTsyOzNdOyBbNDs1OzZdIF0gPSBbIFsxOzRdOyBbMjs1XTsgWzM7Nl0gXVxuIiwibW9kdWxlIEJhc2ljID1cbnN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9IHtcbiAgICAgICAgZnJvbnQ6ICdhIGxpc3Q7XG4gICAgICAgIHJlYXI6ICAnYSBsaXN0O1xuICAgIH1cblxuXG4gICAgbGV0IGVtcHR5OiAnYSB0ID1cbiAgICAgICAge2Zyb250ID0gW107IHJlYXIgPSBbXTt9XG5cblxuICAgIGxldCBwdXNoX2Zyb250IChlOiAnYSkgKGZpZm86ICdhIHQpOiAnYSB0ID1cbiAgICAgICAge2ZpZm8gd2l0aCBmcm9udCA9IGUgOjogZmlmby5mcm9udH1cblxuXG4gICAgbGV0IHB1c2hfcmVhciAoZTogJ2EpIChmaWZvOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIHtmaWZvIHdpdGggcmVhciA9IGUgOjogZmlmby5yZWFyfVxuXG5cbiAgICBsZXQgcG9wX2Zyb250IChmaWZvOiAnYSB0KTogKCdhICogJ2EgdCkgb3B0aW9uID1cbiAgICAgICAgbWF0Y2ggZmlmby5mcm9udCB3aXRoXG4gICAgICAgIHwgaGQgOjogZnJvbnQgLT5cbiAgICAgICAgICAgIFNvbWUgKGhkLCB7ZmlmbyB3aXRoIGZyb250fSlcblxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICBtYXRjaCBMaXN0LnJldiBmaWZvLnJlYXIgd2l0aFxuICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgIE5vbmVcblxuICAgICAgICAgICAgfCBoZCA6OiBmcm9udCAtPlxuICAgICAgICAgICAgICAgIFNvbWUgKGhkLCB7ZnJvbnQ7IHJlYXIgPSBbXX0pXG5cbiAgICBsZXQgcHJlcGVuZCAoZmlmbzogJ2EgdCkgKGxzdDogJ2EgbGlzdCk6ICdhIGxpc3QgPVxuICAgICAgICBmaWZvLmZyb250IEAgTGlzdC5yZXZfYXBwZW5kIGZpZm8ucmVhciBsc3RcbmVuZFxuXG5cblxuXG50eXBlICdhIHQgPVxuICAgIHwgRW1wdHlcbiAgICB8IE5vbmVtcHR5IG9mICdhIEJhc2ljLnQgKiAnYVxuXG5cbmxldCBpc19lbXB0eSAoZjogJ2EgdCk6IGJvb2wgPVxuICAgIG1hdGNoIGYgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgdHJ1ZVxuICAgIHwgXyAtPlxuICAgICAgICBmYWxzZVxuXG5cbmxldCBoYXNfc29tZSAoZjogJ2EgdCk6IGJvb2wgPVxuICAgIG5vdCAoaXNfZW1wdHkgZilcblxuXG5sZXQgZW1wdHk6ICdhIHQgPVxuICAgIEVtcHR5XG5cblxubGV0IHB1c2hfZnJvbnQgKGU6ICdhKSAoZjogJ2EgdCk6ICdhIHQgPVxuICAgIG1hdGNoIGYgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgTm9uZW1wdHkgKEJhc2ljLmVtcHR5LCBlKVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBOb25lbXB0eSAoQmFzaWMucHVzaF9mcm9udCBlIGxmLCBsYXN0KVxuXG5cbmxldCBwdXNoX3JlYXIgKGU6ICdhKSAoZjogJ2EgdCk6ICdhIHQgPVxuICAgIG1hdGNoIGYgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgTm9uZW1wdHkgKEJhc2ljLmVtcHR5LCBlKVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBOb25lbXB0eSAoQmFzaWMucHVzaF9yZWFyIGxhc3QgbGYsIGUpXG5cblxubGV0IHBvcF9mcm9udCAoZjogJ2EgdCk6ICgnYSAqICdhIHQpIG9wdGlvbiA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBOb25lXG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIG1hdGNoIEJhc2ljLnBvcF9mcm9udCBsZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgU29tZSAobGFzdCwgZW1wdHkpXG4gICAgICAgIHwgU29tZSAoZmlyc3QsIGxmKSAtPlxuICAgICAgICAgICAgU29tZSAoZmlyc3QsIE5vbmVtcHR5IChsZiwgbGFzdCkpXG5cblxubGV0IHVwZGF0ZV9maXJzdCAoZjogJ2EgLT4gJ2EpIChmaWZvOiAnYSB0KTogJ2EgdCA9XG4gICAgbWF0Y2ggZmlmbyB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBFbXB0eVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBtYXRjaCBCYXNpYy5wb3BfZnJvbnQgbGYgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIE5vbmVtcHR5IChsZiwgZiBsYXN0KVxuICAgICAgICB8IFNvbWUgKGZpcnN0LCBsZikgLT5cbiAgICAgICAgICAgIE5vbmVtcHR5IChCYXNpYy5wdXNoX2Zyb250IChmIGZpcnN0KSBsZiwgbGFzdClcblxuXG5sZXQgdXBkYXRlX2xhc3QgKGY6ICdhIC0+ICdhKSAoZmlmbzogJ2EgdCk6ICdhIHQgPVxuICAgIG1hdGNoIGZpZm8gd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgRW1wdHlcbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgTm9uZW1wdHkgKGxmLCBmIGxhc3QpXG5cblxuXG5sZXQgdG9fbGlzdCAoZmlmbzogJ2EgdCk6ICdhIGxpc3QgPVxuICAgIG1hdGNoIGZpZm8gd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgW11cbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgQmFzaWMucHJlcGVuZCBsZiBbbGFzdF1cblxuXG5cblxuXG5cblxuXG5cblxuKCogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKVxuKCogVW5pdCBUZXN0cyAqKVxuKCogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqKVxuXG5sZXQldGVzdCBfID1cbiAgICB0b19saXN0XG4gICAgICAgIChlbXB0eSB8PiBwdXNoX3JlYXIgMCB8PiBwdXNoX3JlYXIgMSB8PiBwdXNoX3JlYXIgMilcbiAgICA9XG4gICAgWzA7IDE7IDJdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgZW1wdHkgfD4gcHVzaF9yZWFyIDAgfD4gcG9wX2Zyb250XG4gICAgPVxuICAgIFNvbWUgKDAsIGVtcHR5KVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIG1hdGNoXG4gICAgICAgIGVtcHR5XG4gICAgICAgIHw+IHB1c2hfcmVhciAwIHw+IHB1c2hfcmVhciAxXG4gICAgICAgIHw+IHVwZGF0ZV9maXJzdCAoZnVuIF8gLT4gMTApIHw+IHBvcF9mcm9udFxuICAgIHdpdGhcbiAgICB8IFNvbWUgKDEwLCBmaWZvICkgLT5cbiAgICAgICAgcG9wX2Zyb250IGZpZm8gPSBTb21lICgxLCBlbXB0eSlcbiAgICB8IF8gLT5cbiAgICAgICAgZmFsc2VcblxuXG5sZXQldGVzdCBfID1cbiAgICBtYXRjaFxuICAgICAgICBlbXB0eVxuICAgICAgICB8PiBwdXNoX3JlYXIgMCB8PiBwdXNoX3JlYXIgMVxuICAgICAgICB8PiB1cGRhdGVfbGFzdCAoZnVuIF8gLT4gMTApIHw+IHBvcF9mcm9udFxuICAgIHdpdGhcbiAgICB8IFNvbWUgKDAsIGZpZm8gKSAtPlxuICAgICAgICBwb3BfZnJvbnQgZmlmbyA9IFNvbWUgKDEwLCBlbXB0eSlcbiAgICB8IF8gLT5cbiAgICAgICAgZmFsc2VcbiIsIm1vZHVsZSB0eXBlIE9SREVSID1cbnNpZ1xuICAgIHZhbCBvcmRlcjogaW50XG5lbmRcblxuXG5tb2R1bGUgTzMyOiBPUkRFUiA9XG5zdHJ1Y3RcbiAgICBsZXQgb3JkZXIgPSAzMlxuZW5kXG5cblxuXG5cbm1vZHVsZSBNYXAwIChPcmRlcjogT1JERVIpIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpICA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIE9yZGVyXG5cbiAgICBsZXQgb2RkX29yZGVyOiBib29sID1cbiAgICAgICAgYXNzZXJ0ICgzIDw9IG9yZGVyKTtcbiAgICAgICAgb3JkZXIgLyAyICogMiA8IG9yZGVyXG5cbiAgICBsZXQgbWF4X2tleXM6IGludCA9IG9yZGVyIC0gMVxuXG4gICAgbGV0IG1pbl9rZXlzOiBpbnQgPVxuICAgICAgICBpZiBvZGRfb3JkZXIgdGhlblxuICAgICAgICAgICAgKG9yZGVyIC0gMSkgLyAyXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG9yZGVyIC8gMiAtIDFcblxuXG4gICAgdHlwZSBrZXkgPSBLZXkudFxuXG4gICAgdHlwZSAnYSBwYWlycyA9IChLZXkudCAqICdhKSBhcnJheVxuXG4gICAgdHlwZSAnYSB0ID1cbiAgICAgICAgfCBMZWFmIG9mICdhIHBhaXJzXG4gICAgICAgIHwgTm9kZSBvZiAnYSBwYWlycyAqICdhIHQgYXJyYXlcblxuXG5cblxuXG4gICAgKCogR2VuZXJhbCBmdW5jdGlvbnMuICopXG5cblxuICAgIGxldCBpc19lbXB0eSAobWFwOiAnYSB0KTogYm9vbCA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBrZXlzIC0+XG4gICAgICAgICAgICBBcnJheS5sZW5ndGgga2V5cyA9IDBcbiAgICAgICAgfCBOb2RlIF8gLT5cbiAgICAgICAgICAgIGZhbHNlXG5cblxuICAgIGxldCByZWMgY2FyZGluYWwgKG1hcDogJ2EgdCk6IGludCA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBrZXlzIC0+XG4gICAgICAgICAgICBBcnJheS5sZW5ndGgga2V5c1xuICAgICAgICB8IE5vZGUgKGtleXMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgKGZ1biBuIGNoaWxkIC0+IG4gKyBjYXJkaW5hbCBjaGlsZClcbiAgICAgICAgICAgICAgICAoQXJyYXkubGVuZ3RoIGtleXMpXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5cblxuICAgIGxldCBlbXB0eTogJ2EgdCA9XG4gICAgICAgIExlYWYgW3x8XVxuXG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOiAnYSAtPiBLZXkudCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKG1hcDogJ2IgdCk6ICdhID1cbiAgICAgICAgbGV0IHJlYyBmb2xkIGFjY3UgbWFwID1cbiAgICAgICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBhIChrZXksdmFsdWUpIC0+IGYgYSBrZXkgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIGFjY3VcbiAgICAgICAgICAgICAgICAgICAgcGFpcnNcbiAgICAgICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgYXNzZXJ0IChuICsgMSA9IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgbGV0IHJlYyBmb2xkX2ludGVyaW9yIGFjY3UgaSA9XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoaSA8IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIGkgPSBuIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGQgYWNjdSBjaGlsZHJlbi4oaSlcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZF9pbnRlcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sZCBhY2N1IGNoaWxkcmVuLihpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmc3QgcGFpcnMuKGkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNuZCBwYWlycy4oaSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgMSlcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIGZvbGRfaW50ZXJpb3IgYWNjdSAwXG4gICAgICAgIGluXG4gICAgICAgIGZvbGQgc3RhcnQgbWFwXG5cblxuICAgIGxldCBmb2xkX3JpZ2h0IChmOiAnYSAtPiBLZXkudCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKG1hcDogJ2IgdCk6ICdhID1cbiAgICAgICAgbGV0IHJlYyBmb2xkIGFjY3UgbWFwID1cbiAgICAgICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5mb2xkX3JpZ2h0XG4gICAgICAgICAgICAgICAgICAgIChmdW4gKGtleSx2YWx1ZSkgYSAtPiBmIGEga2V5IHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBwYWlyc1xuICAgICAgICAgICAgICAgICAgICBhY2N1XG4gICAgICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgICAgIGFzc2VydCAobiArIDEgPSBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGxldCByZWMgZm9sZF9pbnRlcmlvciBhY2N1IGkgPVxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIGkgPSAwIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSBpIC0gMSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChpIDwgQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRfaW50ZXJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGYgYWNjdSAoZnN0IHBhaXJzLihpKSkgKHNuZCBwYWlycy4oaSkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uKGkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIGZvbGRfaW50ZXJpb3IgKGZvbGQgYWNjdSBjaGlsZHJlbi4obikpIG5cbiAgICAgICAgaW5cbiAgICAgICAgZm9sZCBzdGFydCBtYXBcblxuXG5cbiAgICBsZXQgYmluZGluZ3MgKG1hcDogJ2EgdCk6IChLZXkudCAqICdhKSBsaXN0ID1cbiAgICAgICAgZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biBsc3Qga2V5IHZhbHVlIC0+IChrZXksdmFsdWUpIDo6IGxzdClcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgICBtYXBcblxuXG4gICAgbGV0IGtleXMgKG1hcDogJ2EgdCk6IEtleS50IGxpc3QgPVxuICAgICAgICBmb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIGxzdCBrZXkgXyAtPiBrZXkgOjogbHN0KVxuICAgICAgICAgICAgW11cbiAgICAgICAgICAgIG1hcFxuXG5cblxuXG5cblxuXG5cbiAgICAoKiBTZWFyY2hpbmcgKilcblxuXG4gICAgbGV0IGJzZWFyY2ggKGtleTogS2V5LnQpIChhcnI6ICdhIHBhaXJzKTogaW50ICogYm9vbCA9XG4gICAgICAgIEFycmF5LmJpbnNlYXJjaCBLZXkuY29tcGFyZSBmc3Qga2V5IGFyclxuXG5cblxuICAgIGxldCByZWMgZmluZF9vcHQgKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiAnYSBvcHRpb24gPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgU29tZSAoc25kIHBhaXJzLihpKSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBOb25lXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBTb21lIChzbmQgcGFpcnMuKGkpKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZpbmRfb3B0IGtleSBjaGlsZHJlbi4oaSlcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAoKiBJbnNlcnRpb25cbiAgICAgKiA9PT09PT09PT1cbiAgICAgKilcblxuICAgIHR5cGUgJ2EgaW5zZXJ0ID1cbiAgICAgICAgfCBOb3JtYWxfaW5zZXJ0IG9mICdhIHRcbiAgICAgICAgfCBTcGxpdF9pbnNlcnQgb2YgJ2EgdCAqIChLZXkudCAqICdhKSAqICdhIHRcblxuXG4gICAgbGV0IHN1YmFycmF5IChhcnI6ICdhIGFycmF5KSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KTogJ2EgYXJyYXkgPVxuICAgICAgICAoKiBUaGUgc3ViYXJyYXkgb2YgW2Fycl0gc3RhcnRpbmcgYXQgW3N0YXJ0XSBhbmQgZW5kaW5nIG9uZSBiZWZvcmUgW2JleW9uZF0uICopXG4gICAgICAgIGFzc2VydCAoMCA8PSBzdGFydCk7XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICAgICAgYXNzZXJ0IChiZXlvbmQgPD0gQXJyYXkubGVuZ3RoIGFycik7XG4gICAgICAgIEFycmF5LnN1YiBhcnIgc3RhcnQgKGJleW9uZCAtIHN0YXJ0KVxuXG5cbiAgICBsZXQgaW5zZXJ0X3N1YmFycmF5XG4gICAgICAgICAgICAoYXJyOiAnYSBhcnJheSkgKGk6IGludCkgKHg6ICdhKSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KVxuICAgICAgICA6ICdhIGFycmF5XG4gICAgICAgID1cbiAgICAgICAgKCogVGhlIHN1YmFycmF5IG9mIFthcnJdIHN0YXJ0aW5nIGF0IFtzdGFydF0gYW5kIGVuZGluZyBvbmUgYmVmb3JlIFtiZXlvbmRdXG4gICAgICAgICAgIHdpdGggW3hdIGluc2VydGVkIGF0IHBvc2l0aW9uIFtpXS4gKilcbiAgICAgICAgYXNzZXJ0ICgwIDw9IHN0YXJ0KTtcbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBpKTtcbiAgICAgICAgYXNzZXJ0IChpIDw9IGJleW9uZCk7XG4gICAgICAgIGFzc2VydCAoYmV5b25kIDw9IEFycmF5Lmxlbmd0aCBhcnIpO1xuICAgICAgICBsZXQgYXJyMiA9IEFycmF5Lm1ha2UgKGJleW9uZCAtIHN0YXJ0ICsgMSkgeCBpblxuICAgICAgICBBcnJheS5ibGl0IGFyciBzdGFydCBhcnIyIDAgKGkgLSBzdGFydCk7XG4gICAgICAgIEFycmF5LmJsaXQgYXJyIGkgYXJyMiAoaSAtIHN0YXJ0ICsgMSkgKGJleW9uZCAtIGkpO1xuICAgICAgICBhcnIyXG5cblxuXG4gICAgbGV0IHNwbGl0X3N1YmFycmF5XG4gICAgICAgICAgICAoYXJyOiAnYSBhcnJheSkgKGk6IGludCkgKHg6ICdhKSAoeTogJ2EpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpXG4gICAgICAgIDogJ2EgYXJyYXlcbiAgICAgICAgPVxuICAgICAgICAoKiBUaGUgc3ViYXJyYXkgb2YgW2Fycl0gc3RhcnRpbmcgYXQgW3N0YXJ0XSBhbmQgZW5kaW5nIG9uZSBiZWZvcmUgW2JleW9uZF1cbiAgICAgICAgICAgd2l0aCBbeF0gaW5zZXJ0ZWQgYXQgcG9zaXRpb24gW2ldIGFuZCB0aGUgb3JpZ2luYWwgdmFsdWUgYXQgcG9zaXRpb25cbiAgICAgICAgICAgW2ldIHJlcGxhY2VkIGJ5IFt5XS4gKilcbiAgICAgICAgYXNzZXJ0IChpIDwgYmV5b25kKTtcbiAgICAgICAgbGV0IGFyciA9IGluc2VydF9zdWJhcnJheSBhcnIgaSB4IHN0YXJ0IGJleW9uZCBpblxuICAgICAgICBhcnIuKGkgLSBzdGFydCArIDEpIDwtIHk7XG4gICAgICAgIGFyclxuXG5cblxuXG4gICAgbGV0IGFkZF9pbl9sZWFmIChrZXk6IEtleS50KSAodmFsdWU6ICdhKSAocGFpcnM6ICdhIHBhaXJzKTogJ2EgaW5zZXJ0ID1cbiAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICBOb3JtYWxfaW5zZXJ0IChMZWFmIChBcnJheS5yZXBsYWNlIGkgKGtleSwgdmFsdWUpIHBhaXJzKSlcblxuICAgICAgICBlbHNlIGlmIGxlbiA8IG1heF9rZXlzIHRoZW5cbiAgICAgICAgICAgICgqIExlYWYgaXMgbm90IGZ1bGwuICopXG4gICAgICAgICAgICBOb3JtYWxfaW5zZXJ0IChMZWFmIChBcnJheS5pbnNlcnQgaSAoa2V5LCB2YWx1ZSkgcGFpcnMpKVxuXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgICgqIExlYWYgaXMgZnVsbCAqKVxuICAgICAgICAgICAgbGV0IGluc2VydF9zdWJhcnJheSA9IGluc2VydF9zdWJhcnJheSBwYWlycyBpIChrZXksIHZhbHVlKVxuICAgICAgICAgICAgYW5kIGsgPSBvcmRlciAvIDJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBpZiBvZGRfb3JkZXIgdGhlblxuICAgICAgICAgICAgICAgIGlmIGkgPSBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgID0gc3ViYXJyYXkgcGFpcnMgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodCA9IHN1YmFycmF5IHBhaXJzIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoTGVhZiBsZWZ0LCAoa2V5LCB2YWx1ZSksIExlYWYgcmlnaHQpXG4gICAgICAgICAgICAgICAgZWxzZSBpZiBpIDwgayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ICA9IGluc2VydF9zdWJhcnJheSAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0ID0gc3ViYXJyYXkgcGFpcnMgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChMZWFmIGxlZnQsIHBhaXJzLihrIC0gMSksIExlYWYgcmlnaHQpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCAgPSBzdWJhcnJheSBwYWlycyAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0ID0gaW5zZXJ0X3N1YmFycmF5IChrICsgMSkgbGVuXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoTGVhZiBsZWZ0LCBwYWlycy4oayksIExlYWYgcmlnaHQpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgICAgKCogZXZlbiBvcmRlciAqKVxuICAgICAgICAgICAgICAgIGlmIGkgPCBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgID0gaW5zZXJ0X3N1YmFycmF5IDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHQgPSBzdWJhcnJheSBwYWlycyBrIGxlblxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKExlYWYgbGVmdCwgcGFpcnMuKGsgLSAxKSwgTGVhZiByaWdodClcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ICA9IHN1YmFycmF5IHBhaXJzIDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHQgPSBpbnNlcnRfc3ViYXJyYXkgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChMZWFmIGxlZnQsIHBhaXJzLihrIC0gMSksIExlYWYgcmlnaHQpXG4gICAgICAgICAgICBlbmRcblxuXG5cblxuICAgIGxldCBhZGRfaW5fbm9kZVxuICAgICAgICAgICAgKGk6IGludClcbiAgICAgICAgICAgIChsZWZ0OiAnYSB0KVxuICAgICAgICAgICAgKHBhaXI6IEtleS50ICogJ2EpXG4gICAgICAgICAgICAocmlnaHQ6ICdhIHQpXG4gICAgICAgICAgICAocGFpcnM6ICdhIHBhaXJzKVxuICAgICAgICAgICAgKGNoaWxkcmVuOiAnYSB0IGFycmF5KVxuICAgICAgICA6ICdhIGluc2VydFxuICAgICAgICA9XG4gICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgaWYgbGVuIDwgbWF4X2tleXMgdGhlblxuICAgICAgICAgICAgbGV0IHBhaXJzID0gQXJyYXkuaW5zZXJ0IGkgcGFpciBwYWlyc1xuICAgICAgICAgICAgYW5kIGNoaWxkcmVuID0gQXJyYXkuaW5zZXJ0IGkgbGVmdCBjaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggKGkgKyAxKSBjaGlsZHJlbik7XG4gICAgICAgICAgICBjaGlsZHJlbi4oaSArIDEpIDwtIHJpZ2h0O1xuICAgICAgICAgICAgTm9ybWFsX2luc2VydCAoTm9kZSAocGFpcnMsIGNoaWxkcmVuKSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgKCogTm9kZSBpcyBmdWxsLiAqKVxuICAgICAgICAgICAgbGV0IGsgPSBvcmRlciAvIDJcbiAgICAgICAgICAgIGFuZCBpbnNlcnRfc3ViYXJyYXkgPSBpbnNlcnRfc3ViYXJyYXkgcGFpcnMgaSBwYWlyXG4gICAgICAgICAgICBhbmQgc3BsaXRfc3ViYXJyYXkgc3RhcnQgYmV5b25kID1cbiAgICAgICAgICAgICAgICBzcGxpdF9zdWJhcnJheSBjaGlsZHJlbiBpIGxlZnQgcmlnaHQgc3RhcnQgYmV5b25kXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgaWYgb2RkX29yZGVyIHRoZW5cbiAgICAgICAgICAgICAgICBpZiBpID0gayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0X3BhaXJzICAgICA9IHN1YmFycmF5IHBhaXJzICAgIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgbGVmdF9jaGlsZHJlbiAgPSBzdWJhcnJheSBjaGlsZHJlbiAwIChrICsgMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X3BhaXJzICAgID0gc3ViYXJyYXkgcGFpcnMgICAgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X2NoaWxkcmVuID0gc3ViYXJyYXkgY2hpbGRyZW4gayAobGVuICsgMSlcbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCBrIGxlZnRfY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IDAgcmlnaHRfY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0X2NoaWxkcmVuLihrKSAgPC0gbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRfY2hpbGRyZW4uKDApIDwtIHJpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAobGVmdF9wYWlycywgbGVmdF9jaGlsZHJlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlyLFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAocmlnaHRfcGFpcnMsIHJpZ2h0X2NoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICBlbHNlIGlmIGkgPCBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRfcGFpcnMgICAgID0gaW5zZXJ0X3N1YmFycmF5IDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgbGVmdF9jaGlsZHJlbiAgPSBzcGxpdF9zdWJhcnJheSAgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9wYWlycyAgICA9IHN1YmFycmF5IHBhaXJzICAgIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9jaGlsZHJlbiA9IHN1YmFycmF5IGNoaWxkcmVuIGsgKGxlbiArIDEpXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggKGsgLSAxKSBwYWlycyk7XG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChsZWZ0X3BhaXJzLCBsZWZ0X2NoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLihrIC0gMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChyaWdodF9wYWlycywgcmlnaHRfY2hpbGRyZW4pKVxuICAgICAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRfcGFpcnMgICAgID0gc3ViYXJyYXkgcGFpcnMgICAgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCBsZWZ0X2NoaWxkcmVuICA9IHN1YmFycmF5IGNoaWxkcmVuIDAgKGsgKyAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfcGFpcnMgICAgPSBpbnNlcnRfc3ViYXJyYXkgKGsgKyAxKSBsZW5cbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X2NoaWxkcmVuID0gc3BsaXRfc3ViYXJyYXkgIChrICsgMSkgKGxlbiArIDEpIGluXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggayBwYWlycyk7XG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChsZWZ0X3BhaXJzLCBsZWZ0X2NoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLihrKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKHJpZ2h0X3BhaXJzLCByaWdodF9jaGlsZHJlbikpXG4gICAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgICAgKCogZXZlbiBvcmRlciAqKVxuICAgICAgICAgICAgICAgIGlmIGkgPCBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRfcGFpcnMgICAgID0gaW5zZXJ0X3N1YmFycmF5IDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgbGVmdF9jaGlsZHJlbiAgPSBzcGxpdF9zdWJhcnJheSAgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9wYWlycyAgICA9IHN1YmFycmF5IHBhaXJzICAgIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9jaGlsZHJlbiA9IHN1YmFycmF5IGNoaWxkcmVuIGsgKGxlbiArIDEpXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggKGsgLSAxKSBwYWlycyk7XG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChsZWZ0X3BhaXJzLCBsZWZ0X2NoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLihrIC0gMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChyaWdodF9wYWlycywgcmlnaHRfY2hpbGRyZW4pKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRfcGFpcnMgICAgID0gc3ViYXJyYXkgcGFpcnMgICAgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCBsZWZ0X2NoaWxkcmVuICA9IHN1YmFycmF5IGNoaWxkcmVuIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfcGFpcnMgICAgPSBpbnNlcnRfc3ViYXJyYXkgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X2NoaWxkcmVuID0gc3BsaXRfc3ViYXJyYXkgIGsgKGxlbiArIDEpXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggKGsgLSAxKSBwYWlycyk7XG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChsZWZ0X3BhaXJzLCBsZWZ0X2NoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLihrIC0gMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChyaWdodF9wYWlycywgcmlnaHRfY2hpbGRyZW4pKVxuICAgICAgICAgICAgZW5kXG5cblxuXG4gICAgbGV0IHJlYyBhZGRfYXV4IChrZXk6IEtleS50KSAodmFsdWU6ICdhKSAobWFwOiAnYSB0KTogJ2EgaW5zZXJ0ID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICBhZGRfaW5fbGVhZiBrZXkgdmFsdWUgcGFpcnNcblxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgKCogQW4gZXhhY3QgbWF0Y2ggaGFzIGJlZW4gZm91bmQuIFRoZXJlZm9yZSB1cGRhdGUgdGhlIHZhbHVlLiAqKVxuICAgICAgICAgICAgICAgIGxldCBwYWlycyA9IEFycmF5LnJlcGxhY2UgaSAoa2V5LHZhbHVlKSBwYWlycyBpblxuICAgICAgICAgICAgICAgIE5vcm1hbF9pbnNlcnQgKE5vZGUgKHBhaXJzLCBjaGlsZHJlbikpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgICAgKCoqIEFkZCB0aGUga2V5IHZhbHVlIHBhaXIgaW50byB0aGUgW2lddGggY2hpbGQuICopXG4gICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCBpIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBtYXRjaCBhZGRfYXV4IGtleSB2YWx1ZSBjaGlsZHJlbi4oaSkgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9ybWFsX2luc2VydCBjaGlsZCAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBBcnJheS5yZXBsYWNlIGkgY2hpbGQgY2hpbGRyZW4gaW5cbiAgICAgICAgICAgICAgICAgICAgTm9ybWFsX2luc2VydCAoTm9kZSAocGFpcnMsIGNoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICB8IFNwbGl0X2luc2VydCAodSwgeSwgdikgLT5cbiAgICAgICAgICAgICAgICAgICAgYWRkX2luX25vZGUgaSB1IHkgdiBwYWlycyBjaGlsZHJlblxuICAgICAgICAgICAgZW5kXG5cblxuXG4gICAgbGV0IGFkZCAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBtYXRjaCBhZGRfYXV4IGtleSB2YWx1ZSBtYXAgd2l0aFxuICAgICAgICB8IE5vcm1hbF9pbnNlcnQgbWFwIC0+XG4gICAgICAgICAgICBtYXBcbiAgICAgICAgfCBTcGxpdF9pbnNlcnQgKGxlZnQsIHBhaXIsIHJpZ2h0KSAtPlxuICAgICAgICAgICAgKCogdHJlZSBncm93cyBhdCB0aGUgcm9vdCAqKVxuICAgICAgICAgICAgTm9kZSAoW3xwYWlyfF0sIFt8bGVmdDsgcmlnaHR8XSlcblxuXG5cblxuICAgICgqIERlbGV0aW9uXG4gICAgICogPT09PT09PT1cbiAgICAgKilcblxuICAgIHR5cGUgJ2EgZGVsZXRlID0ge1xuICAgICAgICB0cmVlOiAgJ2EgdDsgICAgICAgICgqIFRoZSB0cmVlIHdpdGggdGhlIGRlbGV0ZWQga2V5IHZhbHVlIHBhaXIuICopXG4gICAgICAgIHBhaXI6ICAgS2V5LnQgKiAnYTsgKCogVGhlIGRlbGV0ZWQga2V5IHZhbHVlIHBhaXIuICopXG4gICAgICAgIHVuZGVyZmxvdzogYm9vbDsgICAgKCogb25lIGtleSBsZXNzIHRoYW4gdGhlIG1pbmltYWwgbnVtYmVyICopXG4gICAgfVxuXG5cbiAgICBsZXQgbm90X21pbmltYWwgKHBhaXJzOiAnYSBwYWlycyk6IGJvb2wgPVxuICAgICAgICBtaW5fa2V5cyA8IEFycmF5Lmxlbmd0aCBwYWlyc1xuXG5cbiAgICBsZXQgcmVwbGFjZTJcbiAgICAgICAgICAgIChpOiBpbnQpIChsZWZ0OiAnYSB0KSAocmlnaHQ6ICdhIHQpIChjaGlsZHJlbjogJ2EgdCBhcnJheSlcbiAgICAgICAgOiAnYSB0IGFycmF5XG4gICAgICAgID1cbiAgICAgICAgbGV0IGNoaWxkcmVuID0gQXJyYXkuY29weSBjaGlsZHJlbiBpblxuICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IGkgY2hpbGRyZW4pO1xuICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IChpICsgMSkgY2hpbGRyZW4pO1xuICAgICAgICBjaGlsZHJlbi4oaSkgICAgIDwtIGxlZnQ7XG4gICAgICAgIGNoaWxkcmVuLihpICsgMSkgPC0gcmlnaHQ7XG4gICAgICAgIGNoaWxkcmVuXG5cblxuICAgIGxldCByb3RhdGVfa2V5c1xuICAgICAgICAgICAgKHRvX2xlZnQ6IGJvb2wpXG4gICAgICAgICAgICAoaTogaW50KSAobGVmdDogJ2EgcGFpcnMpIChwYXJlbnQ6ICdhIHBhaXJzKSAocmlnaHQ6ICdhIHBhaXJzKVxuICAgICAgICA6ICdhIHBhaXJzICogJ2EgcGFpcnMgKiAnYSBwYWlyc1xuICAgICAgICA9XG4gICAgICAgIGxldCBvcGVuIEFycmF5IGluXG4gICAgICAgIGFzc2VydCAodmFsaWRfaW5kZXggaSBwYXJlbnQpO1xuICAgICAgICBpZiB0b19sZWZ0IHRoZW5cbiAgICAgICAgICAgIHB1c2ggcGFyZW50LihpKSBsZWZ0LFxuICAgICAgICAgICAgcmVwbGFjZSBpIChmaXJzdCByaWdodCkgcGFyZW50LFxuICAgICAgICAgICAgcmVtb3ZlX2ZpcnN0IHJpZ2h0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlbW92ZV9sYXN0IGxlZnQsXG4gICAgICAgICAgICByZXBsYWNlIGkgKGxhc3QgbGVmdCkgcGFyZW50LFxuICAgICAgICAgICAgcHVzaF9mcm9udCBwYXJlbnQuKGkpIHJpZ2h0XG5cblxuICAgIGxldCByb3RhdGVfY2hpbGRyZW5cbiAgICAgICAgICAgICh0b19sZWZ0OiBib29sKVxuICAgICAgICAgICAgKGxlZnQ6ICdhIHQgYXJyYXkpIChyaWdodDogJ2EgdCBhcnJheSlcbiAgICAgICAgOiAnYSB0IGFycmF5ICogJ2EgdCBhcnJheVxuICAgICAgICA9XG4gICAgICAgIGxldCBvcGVuIEFycmF5IGluXG4gICAgICAgIGlmIHRvX2xlZnQgdGhlblxuICAgICAgICAgICAgcHVzaCAoZmlyc3QgcmlnaHQpIGxlZnQsXG4gICAgICAgICAgICByZW1vdmVfZmlyc3QgcmlnaHRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVtb3ZlX2xhc3QgbGVmdCxcbiAgICAgICAgICAgIHB1c2hfZnJvbnQgKGxhc3QgbGVmdCkgcmlnaHRcblxuXG5cbiAgICBsZXQgbWVyZ2Vfa2V5c1xuICAgICAgICAgICAgKGk6IGludCkgKGxlZnQ6ICdhIHBhaXJzKSAocGFyZW50OiAnYSBwYWlycykgKHJpZ2h0OiAnYSBwYWlycylcbiAgICAgICAgOiAnYSBwYWlycyAqICdhIHBhaXJzXG4gICAgICAgID1cbiAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCBpIHBhcmVudCk7XG4gICAgICAgIGxldCBsZW5fbGVmdCAgPSBBcnJheS5sZW5ndGggbGVmdFxuICAgICAgICBhbmQgbGVuX3JpZ2h0ID0gQXJyYXkubGVuZ3RoIHJpZ2h0XG4gICAgICAgIGluXG4gICAgICAgIGxldCBtZXJnZWQgPSBBcnJheS5tYWtlIChsZW5fbGVmdCArIDEgKyBsZW5fcmlnaHQpIHBhcmVudC4oaSlcbiAgICAgICAgYW5kIHBhcmVudCA9IEFycmF5LnJlbW92ZSBpIHBhcmVudFxuICAgICAgICBpblxuICAgICAgICBBcnJheS5ibGl0IGxlZnQgIDAgbWVyZ2VkIDAgbGVuX2xlZnQ7XG4gICAgICAgIEFycmF5LmJsaXQgcmlnaHQgMCBtZXJnZWQgKGxlbl9sZWZ0ICsgMSkgbGVuX3JpZ2h0O1xuICAgICAgICBtZXJnZWQsIHBhcmVudFxuXG5cbiAgICBsZXQgbWVyZ2VfbGVhdmVzXG4gICAgICAgICAgICAoaTogaW50KVxuICAgICAgICAgICAgKHBhaXI6IEtleS50ICogJ2EpXG4gICAgICAgICAgICAocGFpcnMxOiAnYSBwYWlycykgKHBhaXJzMjogJ2EgcGFpcnMpXG4gICAgICAgICAgICAocGFpcnM6ICdhIHBhaXJzKSAoY2hpbGRyZW46ICdhIHQgYXJyYXkpXG4gICAgICAgIDogJ2EgZGVsZXRlXG4gICAgICAgID1cbiAgICAgICAgYXNzZXJ0IChpICsgMSA8IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgIGxldCBtZXJnZWQsIHBhaXJzID0gbWVyZ2Vfa2V5cyBpIHBhaXJzMSBwYWlycyBwYWlyczJcbiAgICAgICAgYW5kIGNoaWxkcmVuICAgICAgPSBBcnJheS5yZW1vdmUgaSBjaGlsZHJlblxuICAgICAgICBhbmQgdW5kZXJmbG93ICAgICA9IEFycmF5Lmxlbmd0aCBwYWlycyA8PSBtaW5fa2V5c1xuICAgICAgICBpblxuICAgICAgICBjaGlsZHJlbi4oaSkgPC0gTGVhZiBtZXJnZWQ7XG4gICAgICAgIHt0cmVlID0gTm9kZSAocGFpcnMsIGNoaWxkcmVuKTsgcGFpcjsgdW5kZXJmbG93fVxuXG5cblxuICAgIGxldCBtZXJnZV9ub2Rlc1xuICAgICAgICAgICAgKGk6IGludClcbiAgICAgICAgICAgIChwYWlyOiBLZXkudCAqICdhKVxuICAgICAgICAgICAgKHBhaXJzMTogJ2EgcGFpcnMpIChjaGlsZHJlbjE6ICdhIHQgYXJyYXkpXG4gICAgICAgICAgICAocGFpcnMyOiAnYSBwYWlycykgKGNoaWxkcmVuMjogJ2EgdCBhcnJheSlcbiAgICAgICAgICAgIChwYWlyczogJ2EgcGFpcnMpIChjaGlsZHJlbjogJ2EgdCBhcnJheSlcbiAgICAgICAgOiAnYSBkZWxldGVcbiAgICAgICAgPVxuICAgICAgICBhc3NlcnQgKGkgKyAxIDwgQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgbGV0IHBhaXJzX25ldywgcGFpcnMgPSBtZXJnZV9rZXlzIGkgcGFpcnMxIHBhaXJzIHBhaXJzMlxuICAgICAgICBhbmQgY2hpbGRyZW4gICAgICA9IEFycmF5LnJlbW92ZSBpIGNoaWxkcmVuXG4gICAgICAgIGFuZCB1bmRlcmZsb3cgICAgID0gQXJyYXkubGVuZ3RoIHBhaXJzIDw9IG1pbl9rZXlzXG4gICAgICAgIGFuZCBjaGlsZHJlbl9uZXcgID0gQXJyYXkuYXBwZW5kIGNoaWxkcmVuMSBjaGlsZHJlbjJcbiAgICAgICAgaW5cbiAgICAgICAgY2hpbGRyZW4uKGkpIDwtIE5vZGUgKHBhaXJzX25ldywgY2hpbGRyZW5fbmV3KTtcbiAgICAgICAge3RyZWUgPSBOb2RlIChwYWlycywgY2hpbGRyZW4pOyBwYWlyOyB1bmRlcmZsb3d9XG5cblxuXG4gICAgbGV0IGhhbmRsZV91bmRlcmZsb3dcbiAgICAgICAgICAgIChpOiBpbnQpICAgICAgICAgICAgICAgICgqIEluZGV4IG9mIHRoZSBjaGlsZCB3aGVyZSB0aGUgZGVsZXRpb24gb2NjdXJyZWQuICopXG4gICAgICAgICAgICAodW5kZXJmbG93X2xlZnQ6IGJvb2wpICAoKiBVbmRlcmZsb3cgaGFwcGVuZCBpbiB0aGUgbGVmdCBjaGlsZD8gKilcbiAgICAgICAgICAgIChsZWZ0X2NoaWxkOiAnYSB0KVxuICAgICAgICAgICAgKHJpZ2h0X2NoaWxkOiAnYSB0KVxuICAgICAgICAgICAgKHBhaXI6IEtleS50ICogJ2EpICAgICAgKCogVGhlIGRlbGV0ZWQga2V5IHZhbHVlIHBhaXIuICopXG4gICAgICAgICAgICAocGFpcnM6ICdhIHBhaXJzKSAgICAgICAoKiBUaGUga2V5IHZhbHVlIHBhaXJzIG9mIHRoZSBwYXJlbnQuICopXG4gICAgICAgICAgICAoY2hpbGRyZW46ICdhIHQgYXJyYXkpICAoKiBUaGUgY2hpbGRyZW4gb2YgdGhlIHBhcmVudC4gKilcbiAgICAgICAgOiAnYSBkZWxldGVcbiAgICAgICAgPVxuICAgICAgICBsZXQgbm90X21pbmltYWwgcGFpcnMxIHBhaXJzMiA9XG4gICAgICAgICAgICBpZiB1bmRlcmZsb3dfbGVmdCB0aGVuXG4gICAgICAgICAgICAgICAgbm90X21pbmltYWwgcGFpcnMyXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbm90X21pbmltYWwgcGFpcnMxXG4gICAgICAgIGluXG4gICAgICAgIG1hdGNoIGxlZnRfY2hpbGQsIHJpZ2h0X2NoaWxkIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzMSwgTGVhZiBwYWlyczIgd2hlbiBub3RfbWluaW1hbCBwYWlyczEgcGFpcnMyIC0+XG4gICAgICAgICAgICAoKiBSaWdodCBzaWJsaW5nIGlzIG5vdCBtaW5pbWFsLCByb3RhdGUgKilcbiAgICAgICAgICAgIGxldCBwYWlyczEsIHBhaXJzLCBwYWlyczIgPVxuICAgICAgICAgICAgICAgIHJvdGF0ZV9rZXlzIHVuZGVyZmxvd19sZWZ0IGkgcGFpcnMxIHBhaXJzIHBhaXJzMlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgcmVwbGFjZTIgaSAoTGVhZiBwYWlyczEpIChMZWFmIHBhaXJzMikgY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICB7dHJlZSA9IE5vZGUgKHBhaXJzLCBjaGlsZHJlbik7IHBhaXI7IHVuZGVyZmxvdyA9IGZhbHNlfVxuXG4gICAgICAgIHwgTGVhZiBwYWlyczEsIExlYWYgcGFpcnMyIC0+XG4gICAgICAgICAgICAoKiBTaWJsaW5nIGlzIG1pbmltYWwsIG1lcmdlICopXG4gICAgICAgICAgICBtZXJnZV9sZWF2ZXMgaSBwYWlyIHBhaXJzMSBwYWlyczIgcGFpcnMgY2hpbGRyZW5cblxuICAgICAgICB8IE5vZGUgKHBhaXJzMSwgY2hpbGRyZW4xKSwgTm9kZSAocGFpcnMyLCBjaGlsZHJlbjIpXG4gICAgICAgICAgICB3aGVuIG5vdF9taW5pbWFsIHBhaXJzMSBwYWlyczJcbiAgICAgICAgICAgIC0+XG4gICAgICAgICAgICAoKiBTaWJsaW5nIGlzIG5vdCBtaW5pbWFsLCByb3RhdGUgKilcbiAgICAgICAgICAgIGxldCBwYWlyczEsIHBhaXJzLCBwYWlyczIgPVxuICAgICAgICAgICAgICAgIHJvdGF0ZV9rZXlzIHVuZGVyZmxvd19sZWZ0IGkgcGFpcnMxIHBhaXJzIHBhaXJzMlxuICAgICAgICAgICAgYW5kIGNoaWxkcmVuMSwgY2hpbGRyZW4yID1cbiAgICAgICAgICAgICAgICByb3RhdGVfY2hpbGRyZW4gdW5kZXJmbG93X2xlZnQgY2hpbGRyZW4xIGNoaWxkcmVuMlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgcmVwbGFjZTJcbiAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgICAgICAoTm9kZSAocGFpcnMxLCBjaGlsZHJlbjEpKVxuICAgICAgICAgICAgICAgICAgICAoTm9kZSAocGFpcnMyLCBjaGlsZHJlbjIpKVxuICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIHt0cmVlID0gTm9kZSAocGFpcnMsIGNoaWxkcmVuKTsgcGFpcjsgdW5kZXJmbG93ID0gZmFsc2V9XG5cbiAgICAgICAgfCBOb2RlIChwYWlyczEsIGNoaWxkcmVuMSksIE5vZGUgKHBhaXJzMiwgY2hpbGRyZW4yKSAtPlxuICAgICAgICAgICAgKCogU2libGluZyBpcyBtaW5pbWFsLCBtZXJnZSAqKVxuICAgICAgICAgICAgbWVyZ2Vfbm9kZXNcbiAgICAgICAgICAgICAgICBpIHBhaXJcbiAgICAgICAgICAgICAgICBwYWlyczEgY2hpbGRyZW4xXG4gICAgICAgICAgICAgICAgcGFpcnMyIGNoaWxkcmVuMlxuICAgICAgICAgICAgICAgIHBhaXJzIGNoaWxkcmVuXG5cbiAgICAgICAgfCBfLCBfIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogQ2Fubm90IGhhcHBlbiwgdHJlZSBpcyBiYWxhbmNlZC4gKilcblxuXG5cbiAgICBsZXQgaGFuZGxlX2RlbGV0ZVxuICAgICAgICAgICAgKGk6IGludCkgICAgICAgICAgICAgICAgKCogSW5kZXggb2YgdGhlIGNoaWxkIHdoZXJlIHRoZSBkZWxldGlvbiBvY2N1cnJlZC4gKilcbiAgICAgICAgICAgIChwYWlyOiBLZXkudCAqICdhKSAgICAgICgqIFRoZSBkZWxldGVkIGtleSB2YWx1ZSBwYWlyLiAqKVxuICAgICAgICAgICAgKGQ6ICdhIGRlbGV0ZSkgICAgICAgICAgKCogVGhlIG5ldyB0cmVlIHdpdGggdGhlIGtleSB2YWx1ZSBwYWlyIGRlbGV0ZWQuICopXG4gICAgICAgICAgICAocGFpcnM6ICdhIHBhaXJzKSAgICAgICAoKiBUaGUga2V5IHZhbHVlIHBhaXJzIG9mIHRoZSBwYXJlbnQuICopXG4gICAgICAgICAgICAoY2hpbGRyZW46ICdhIHQgYXJyYXkpICAoKiBUaGUgY2hpbGRyZW4gb2YgdGhlIHBhcmVudC4gKilcbiAgICAgICAgOiAnYSBkZWxldGVcbiAgICAgICAgPVxuICAgICAgICBpZiBub3QgZC51bmRlcmZsb3cgdGhlblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyZWUgPSBOb2RlIChwYWlycywgQXJyYXkucmVwbGFjZSBpIGQudHJlZSBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgcGFpcjtcbiAgICAgICAgICAgICAgICB1bmRlcmZsb3cgPSBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICBpZiBpIDwgbGVuIHRoZW5cbiAgICAgICAgICAgICAgICBoYW5kbGVfdW5kZXJmbG93IGkgdHJ1ZSBkLnRyZWUgY2hpbGRyZW4uKGkgKyAxKSBwYWlyIHBhaXJzIGNoaWxkcmVuXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpIC0gMSBpblxuICAgICAgICAgICAgICAgIGhhbmRsZV91bmRlcmZsb3cgaSBmYWxzZSBjaGlsZHJlbi4oaSkgZC50cmVlIHBhaXIgcGFpcnMgY2hpbGRyZW5cblxuXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9sYXN0IChtYXA6ICdhIHQpOiAnYSBkZWxldGUgPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgIGFzc2VydCAoMCA8IGxlbik7XG4gICAgICAgICAgICBsZXQgcGFpciAgPSBBcnJheS5sYXN0IHBhaXJzXG4gICAgICAgICAgICBhbmQgcGFpcnMgPSBBcnJheS5yZW1vdmVfbGFzdCBwYWlyc1xuICAgICAgICAgICAgYW5kIHVuZGVyZmxvdyA9IEFycmF5Lmxlbmd0aCBwYWlycyA8PSBtaW5fa2V5c1xuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmVlID0gTGVhZiBwYWlycztcbiAgICAgICAgICAgICAgICBwYWlyO1xuICAgICAgICAgICAgICAgIHVuZGVyZmxvd1xuICAgICAgICAgICAgfVxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgIGFzc2VydCAobGVuICsgMSA9IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgICAgICBsZXQgZCA9IHJlbW92ZV9sYXN0IGNoaWxkcmVuLihsZW4pIGluXG4gICAgICAgICAgICBoYW5kbGVfZGVsZXRlIGxlbiBkLnBhaXIgZCBwYWlycyBjaGlsZHJlblxuXG5cblxuXG4gICAgbGV0IHJlYyByZW1vdmVfYXV4IChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogJ2EgZGVsZXRlIG9wdGlvbiA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9ICBwYWlycy4oaSlcbiAgICAgICAgICAgICAgICBhbmQgcGFpcnMgPSBBcnJheS5yZW1vdmUgaSBwYWlyc1xuICAgICAgICAgICAgICAgIGFuZCB1bmRlcmZsb3cgPSBBcnJheS5sZW5ndGggcGFpcnMgPD0gbWluX2tleXNcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIFNvbWUge1xuICAgICAgICAgICAgICAgICAgICB0cmVlID0gTGVhZiBwYWlycztcbiAgICAgICAgICAgICAgICAgICAgcGFpcjtcbiAgICAgICAgICAgICAgICAgICAgdW5kZXJmbG93XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIE5vbmVcblxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgbGV0IGQgPSByZW1vdmVfbGFzdCBjaGlsZHJlbi4oaSkgaW5cbiAgICAgICAgICAgICAgICBsZXQgcGFpciAgPSBwYWlycy4oaSlcbiAgICAgICAgICAgICAgICBhbmQgcGFpcnMgPSBBcnJheS5yZXBsYWNlIGkgZC5wYWlyIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgU29tZSAoaGFuZGxlX2RlbGV0ZSBpIHBhaXIgZCBwYWlycyBjaGlsZHJlbilcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBPcHRpb24ubWFwXG4gICAgICAgICAgICAgICAgICAgIChmdW4gZCAtPiBoYW5kbGVfZGVsZXRlIGkgZC5wYWlyIGQgcGFpcnMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgIChyZW1vdmVfYXV4IGtleSBjaGlsZHJlbi4oaSkpXG5cblxuXG4gICAgbGV0IHJlbW92ZSAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBtYXRjaCByZW1vdmVfYXV4IGtleSBtYXAgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIG1hcFxuICAgICAgICB8IFNvbWUgZCAtPlxuICAgICAgICAgICAgbWF0Y2ggZC50cmVlIHdpdGhcbiAgICAgICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSB3aGVuIEFycmF5LmlzX2VtcHR5IHBhaXJzIC0+XG4gICAgICAgICAgICAgICAgKCogdHJlZSBzaHJpbmtzIGF0IHRoZSByb290ICopXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uKDApXG4gICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICBkLnRyZWVcblxuXG5cblxuICAgICgqIFVwZGF0ZVxuICAgICAqID09PT09PVxuICAgICAqKVxuXG4gICAgdHlwZSAnYSB1cGRhdGUgPVxuICAgICAgICB8IEluc2VydCBvZiAnYSBpbnNlcnRcbiAgICAgICAgfCBEZWxldGUgb2YgJ2EgZGVsZXRlXG5cblxuICAgIGxldCByZWMgdXBkYXRlX2F1eFxuICAgICAgICAgICAgKGtleTogS2V5LnQpIChmOiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAobWFwOiAnYSB0KVxuICAgICAgICA6ICdhIHVwZGF0ZVxuICAgICAgICA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBtYXRjaCBmIChTb21lIChzbmQgcGFpcnMuKGkpKSkgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFpcnMgPSBBcnJheS5yZW1vdmUgaSBwYWlyc1xuICAgICAgICAgICAgICAgICAgICBhbmQgcGFpciAgPSBwYWlycy4oaSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHVuZGVyZmxvdyA9IG1pbl9rZXlzID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmVlID0gTGVhZiBwYWlycztcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3d9XG4gICAgICAgICAgICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoTm9ybWFsX2luc2VydCAoTGVhZiAoQXJyYXkucmVwbGFjZSBpIChrZXksdmFsdWUpIHBhaXJzKSkpXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgICAgbWF0Y2ggZiBOb25lIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IG1hcClcbiAgICAgICAgICAgICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChhZGRfaW5fbGVhZiBrZXkgdmFsdWUgcGFpcnMpXG4gICAgICAgICAgICBlbmRcblxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgbWF0Y2ggZiAoU29tZSAoc25kIHBhaXJzLihpKSkpIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZW1vdmVfbGFzdCBjaGlsZHJlbi4oaSkgaW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgID0gcGFpcnMuKGkpXG4gICAgICAgICAgICAgICAgICAgIGFuZCBwYWlycyA9IEFycmF5LnJlcGxhY2UgaSBkLnBhaXIgcGFpcnMgaW5cbiAgICAgICAgICAgICAgICAgICAgRGVsZXRlIChoYW5kbGVfZGVsZXRlIGkgcGFpciBkIHBhaXJzIGNoaWxkcmVuKVxuXG4gICAgICAgICAgICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoTm9ybWFsX2luc2VydCAoTm9kZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5yZXBsYWNlIGkgKGtleSwgdmFsdWUpIHBhaXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgKSkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWF0Y2ggdXBkYXRlX2F1eCBrZXkgZiBjaGlsZHJlbi4oaSkgd2l0aFxuICAgICAgICAgICAgICAgIHwgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IGNoaWxkKSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgKE5vZGUgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5yZXBsYWNlIGkgY2hpbGQgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgKSkpXG5cbiAgICAgICAgICAgICAgICB8IEluc2VydCAoU3BsaXRfaW5zZXJ0ICh1LCB5LCB2KSkgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChhZGRfaW5fbm9kZSBpIHUgeSB2IHBhaXJzIGNoaWxkcmVuKVxuXG4gICAgICAgICAgICAgICAgfCBEZWxldGUgZCAtPlxuICAgICAgICAgICAgICAgICAgICBEZWxldGUgKGhhbmRsZV9kZWxldGUgaSBkLnBhaXIgZCBwYWlycyBjaGlsZHJlbilcblxuXG5cblxuICAgIGxldCB1cGRhdGUgKGtleTogS2V5LnQpIChmOiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIG1hdGNoIHVwZGF0ZV9hdXgga2V5IGYgbWFwIHdpdGhcbiAgICAgICAgfCBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgbWFwKSAtPlxuICAgICAgICAgICAgbWFwXG5cbiAgICAgICAgfCBJbnNlcnQgKFNwbGl0X2luc2VydCAodSwgeSwgdikpIC0+XG4gICAgICAgICAgICBOb2RlICggW3wgeSB8XSwgW3wgdTsgdiB8XSApXG5cbiAgICAgICAgfCBEZWxldGUgZCAtPlxuICAgICAgICAgICAgbWF0Y2ggZC50cmVlIHdpdGhcbiAgICAgICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSB3aGVuIEFycmF5Lmxlbmd0aCBwYWlycyA9IDAgLT5cbiAgICAgICAgICAgICAgICAoKiB0cmVlIHNocmlua3MgYXQgdGhlIHJvb3QgKilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi4oMClcbiAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgIGQudHJlZVxuXG5cblxuXG5cblxuXG5cbiAgICAoKiBTdHJlYW0gb2Yga2V5IHZhbHVlIHBhaXJzXG4gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAqKVxuXG4gICAgdHlwZSAnYSBlbnRyeVxuICAgICAgICA9XG4gICAgICAgICdhIHBhaXJzXG4gICAgICAgICogJ2EgdCBhcnJheVxuICAgICAgICAqIGludFxuXG4gICAgdHlwZSAnYSBzb3VyY2UgPSB7XG4gICAgICAgIHRvcDpcbiAgICAgICAgICAgICdhIHQgKiBpbnQ7ICAgICAgICAgKCogbm9kZS9sZWFmIGFuZCBwb3NpdGlvbiB3aXRoaW4gdGhlIG5vZGUvbGVhZiAqKVxuXG4gICAgICAgIHN0YWNrOiAnYSBlbnRyeSBsaXN0O1xuICAgIH1cblxuXG4gICAgbGV0IGhhc19tb3JlIChzb3VyY2U6ICdhIHNvdXJjZSk6IGJvb2wgPVxuICAgICAgICBtYXRjaCBzb3VyY2UudG9wIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzLCBpIC0+XG4gICAgICAgICAgICBpIDwgQXJyYXkubGVuZ3RoIHBhaXJzXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIF8gKSwgaSAtPlxuICAgICAgICAgICAgaSA8IEFycmF5Lmxlbmd0aCBwYWlyc1xuXG5cbiAgICBsZXQgcGVlayAoc291cmNlOiAnYSBzb3VyY2UpOiBLZXkudCAqICdhID1cbiAgICAgICAgYXNzZXJ0IChoYXNfbW9yZSBzb3VyY2UpO1xuICAgICAgICBtYXRjaCBzb3VyY2UudG9wIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzLCBpIC0+XG4gICAgICAgICAgICBwYWlycy4oaSlcbiAgICAgICAgfCBOb2RlIChwYWlycywgXyApLCBpIC0+XG4gICAgICAgICAgICBwYWlycy4oaSlcblxuXG5cbiAgICBsZXQgcmVjIGRvd24gKHRyZWU6ICdhIHQpIChzdGFjazogJ2EgZW50cnkgbGlzdCk6ICdhIHNvdXJjZSA9XG4gICAgICAgICgqIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGtleSB2YWx1ZSBwYWlyIG9mIFt0cmVlXS4gKilcbiAgICAgICAgbWF0Y2ggdHJlZSB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgKCogV2UgYXJlIGFscmVhZHkgb24gYSBsZWFmLiBUaGUgbmV4dCBpdGVtIGlzIHRoZSBmaXJzdCBrZXkgdmFsdWVcbiAgICAgICAgICAgICAqIHBhaXIuICopXG4gICAgICAgICAgICB7dG9wID0gTGVhZiBwYWlycywgMDsgc3RhY2t9XG5cbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICAoKiBTZWFyY2ggdGhlIGZpcnN0IGtleSB2YWx1ZSBwYWlyIGluIHRoZSBmaXJzdCBjaGlsZC4gUHVzaCB0aGVcbiAgICAgICAgICAgICAqIGZpcnN0IGtleSB2YWx1ZSBwYWlyIG9mIHRoZSBub2RlIG9udG8gdGhlIHN0YWNrLiAqKVxuICAgICAgICAgICAgZG93biBjaGlsZHJlbi4oMCkgKChwYWlycywgY2hpbGRyZW4sIDApIDo6IHN0YWNrKVxuXG5cblxuICAgIGxldCByZWMgdXAgKHN0YWNrOiAnYSBlbnRyeSBsaXN0KTogJ2Egc291cmNlID1cbiAgICAgICAgKCogU2VhcmNoIHRoZSBzdGFjayBmb3IgYSBub2RlIHdoaWNoIGlzIHBvc2l0aW9uZWQgb24gYSBrZXkgdmFsdWUgcGFpci5cbiAgICAgICAgICogKilcbiAgICAgICAgbWF0Y2ggc3RhY2sgd2l0aFxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICB7dG9wID0gZW1wdHksIDA7IHN0YWNrID0gW119XG4gICAgICAgIHwgKHBhaXJzLCBjaGlsZHJlbiwgaSkgOjogc3RhY2sgLT5cbiAgICAgICAgICAgIGlmIGkgPCBBcnJheS5sZW5ndGggcGFpcnMgdGhlblxuICAgICAgICAgICAgICAgIHt0b3AgPSBOb2RlIChwYWlycywgY2hpbGRyZW4pLCBpOyBzdGFja31cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB1cCBzdGFja1xuXG5cbiAgICBsZXQgYWR2YW5jZSAoc291cmNlOiAnYSBzb3VyY2UpOiAnYSBzb3VyY2UgPVxuICAgICAgICBhc3NlcnQgKGhhc19tb3JlIHNvdXJjZSk7XG4gICAgICAgIG1hdGNoIHNvdXJjZS50b3Agd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMsIGkgLT5cbiAgICAgICAgICAgIGlmIGkgKyAxIDwgQXJyYXkubGVuZ3RoIHBhaXJzIHRoZW5cbiAgICAgICAgICAgICAgICB7c291cmNlIHdpdGggdG9wID0gTGVhZiBwYWlycywgaSArIDF9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdXAgc291cmNlLnN0YWNrXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSwgaSAtPlxuICAgICAgICAgICAgYXNzZXJ0IChpIDwgQXJyYXkubGVuZ3RoIHBhaXJzKTtcbiAgICAgICAgICAgIGRvd25cbiAgICAgICAgICAgICAgICBjaGlsZHJlbi4oaSArIDEpXG4gICAgICAgICAgICAgICAgKChwYWlycywgY2hpbGRyZW4sIGkgKyAxKSA6OiBzb3VyY2Uuc3RhY2spXG5cblxuICAgIGxldCBtYWtlX3NvdXJjZSAodHJlZTogICdhIHQpOiAnYSBzb3VyY2UgPVxuICAgICAgICBkb3duIHRyZWUgW11cblxuXG5cblxuXG5cbiAgICBtb2R1bGUgU291cmNlIChWYWx1ZTogSW50ZXJmYWNlcy5BTlkpID0gc3RydWN0XG4gICAgICAgIHR5cGUgJ2EgbWFwID0gJ2EgdFxuICAgICAgICB0eXBlIGl0ZW0gICA9IEtleS50ICogVmFsdWUudFxuXG4gICAgICAgIHR5cGUgdCA9IFZhbHVlLnQgc291cmNlXG5cbiAgICAgICAgbGV0IGhhc19tb3JlID0gaGFzX21vcmVcbiAgICAgICAgbGV0IHBlZWsgICAgID0gcGVla1xuICAgICAgICBsZXQgYWR2YW5jZSAgPSBhZHZhbmNlXG4gICAgICAgIGxldCBtYWtlICAgICA9IG1ha2Vfc291cmNlXG4gICAgZW5kXG5lbmRcblxuXG5cblxuXG5cblxuXG5tb2R1bGUgU2V0MCAoT3JkZXI6IE9SREVSKSAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9IHN0cnVjdFxuICAgIG1vZHVsZSBNYXAgPSBNYXAwIChPcmRlcikgKEtleSlcblxuICAgIHR5cGUgaXRlbSA9IEtleS50XG5cbiAgICB0eXBlIHQgPSB1bml0IE1hcC50XG5cblxuICAgIGxldCBpc19lbXB0eSA9IE1hcC5pc19lbXB0eVxuXG5cbiAgICBsZXQgY2FyZGluYWwgPSBNYXAuY2FyZGluYWxcblxuXG4gICAgbGV0IGVtcHR5ID0gTWFwLmVtcHR5XG5cblxuICAgIGxldCBmb2xkX2xlZnQgKGY6ICdhIC0+IEtleS50IC0+ICdhKSAoc3RhcnQ6ICdhKSAoc2V0OiB0KTogJ2EgPVxuICAgICAgICBNYXAuZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIGEga2V5IF8gLT4gZiBhIGtleSlcbiAgICAgICAgICAgIHN0YXJ0XG4gICAgICAgICAgICBzZXRcblxuXG4gICAgbGV0IGZvbGRfcmlnaHQgKGY6ICdhIC0+IEtleS50IC0+ICdhKSAoc3RhcnQ6ICdhKSAoc2V0OiB0KTogJ2EgPVxuICAgICAgICBNYXAuZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biBhIGtleSBfIC0+IGYgYSBrZXkpXG4gICAgICAgICAgICBzdGFydFxuICAgICAgICAgICAgc2V0XG5cblxuICAgIGxldCBtZW0gKGtleTogS2V5LnQpIChzZXQ6IHQpOiBib29sID1cbiAgICAgICAgbWF0Y2ggTWFwLmZpbmRfb3B0IGtleSBzZXQgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGZhbHNlXG4gICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICB0cnVlXG5cblxuICAgIGxldCBhZGQgKGtleTogS2V5LnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgTWFwLmFkZCBrZXkgKCkgc2V0XG5cblxuICAgIGxldCByZW1vdmUgKGtleTogS2V5LnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgTWFwLnJlbW92ZSBrZXkgc2V0XG5cblxuICAgIGxldCBlbGVtZW50cyAoc2V0OiB0KTogS2V5LnQgbGlzdCA9XG4gICAgICAgIE1hcC5rZXlzIHNldFxuXG5cblxuICAgIG1vZHVsZSBTb3VyY2UgPSBzdHJ1Y3RcbiAgICAgICAgdHlwZSBzZXQgPSB0XG5cbiAgICAgICAgbW9kdWxlIE0gPSAgTWFwLlNvdXJjZSAoVW5pdClcblxuICAgICAgICB0eXBlIGl0ZW0gPSBLZXkudFxuICAgICAgICB0eXBlIHQgPSBNLnRcblxuICAgICAgICBsZXQgaGFzX21vcmUgPSBNLmhhc19tb3JlXG5cbiAgICAgICAgbGV0IHBlZWsgKHNvdXJjZTogdCk6IEtleS50ID0gTS5wZWVrIHNvdXJjZSB8PiBmc3RcblxuICAgICAgICBsZXQgYWR2YW5jZSA9IE0uYWR2YW5jZVxuXG4gICAgICAgIGxldCBtYWtlID0gTS5tYWtlXG4gICAgZW5kXG5lbmRcblxuXG5cblxuXG5cblxuXG5cbm1vZHVsZSBNYXAgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBNYXAwIChPMzIpIChLZXkpXG5lbmRcblxuXG5cblxuXG5cblxuXG5tb2R1bGUgU2V0IChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgU2V0MCAoTzMyKSAoS2V5KVxuZW5kXG5cblxuXG5cblxuXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVW5pdCBUZXN0c1xuICpcbiAqIHdpdGggc2V0c1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbm1vZHVsZSBTZXRfb3JkZXIgKE9yZGVyOiBPUkRFUikgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFNldDAgKE9yZGVyKSAoSW50KVxuXG4gICAgbGV0IGRvX3Vwd2FyZCAoZjogaW50IC0+IHQgLT4gdCkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgICAgIGxldCByZWMgYWN0aW9uIGkgc2V0ID1cbiAgICAgICAgICAgIGlmIGkgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgICAgIHNldFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFjdGlvbiAoaSArIDEpIChmIGkgc2V0KVxuICAgICAgICBpblxuICAgICAgICBhY3Rpb24gc3RhcnQgc2V0XG5cbiAgICBsZXQgZG9fZG93bndhcmQgKGY6IGludCAtPiB0IC0+IHQpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgICAgICBsZXQgcmVjIGFjdGlvbiBpIHNldCA9XG4gICAgICAgICAgICBpZiBpID0gc3RhcnQgdGhlblxuICAgICAgICAgICAgICAgIHNldFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxldCBpID0gaSAtIDEgaW5cbiAgICAgICAgICAgICAgICBhY3Rpb24gaSAoZiBpIHNldClcbiAgICAgICAgaW5cbiAgICAgICAgYWN0aW9uIGJleW9uZCBzZXRcblxuXG4gICAgbGV0IGFkZF91cHdhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBkb191cHdhcmQgYWRkIHN0YXJ0IGJleW9uZCBzZXRcblxuXG4gICAgbGV0IGFkZF9kb3dud2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGRvX2Rvd253YXJkIGFkZCBzdGFydCBiZXlvbmQgc2V0XG5cbiAgICBsZXQgcmVtb3ZlX3Vwd2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGRvX3Vwd2FyZCByZW1vdmUgc3RhcnQgYmV5b25kIHNldFxuXG4gICAgbGV0IHJlbW92ZV9kb3dud2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGRvX2Rvd253YXJkIHJlbW92ZSBzdGFydCBiZXlvbmQgc2V0XG5cbiAgICBsZXQgY2hlY2tfcmFuZ2UgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IGJvb2wgPVxuICAgICAgICBsZXQgbiwgb2sgPVxuICAgICAgICAgICAgZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgKGZ1biAoaSwgb2spIGtleSAtPiBpICsgMSwgb2sgJiYga2V5ID0gaSlcbiAgICAgICAgICAgICAgICAoc3RhcnQsIHRydWUpXG4gICAgICAgICAgICAgICAgc2V0XG4gICAgICAgIGluXG4gICAgICAgIG4gPSBiZXlvbmQgJiYgb2tcblxuICAgIG1vZHVsZSBTb3VyY2UgPSBzdHJ1Y3RcbiAgICAgICAgaW5jbHVkZSBTb3VyY2VcblxuICAgICAgICBsZXQgdG9fbGlzdCAoc291cmNlOiB0KTogaW50IGxpc3QgPVxuICAgICAgICAgICAgbGV0IHJlYyB0b19saXN0IHNvdXJjZSBhY2N1ID1cbiAgICAgICAgICAgICAgICBpZiBoYXNfbW9yZSBzb3VyY2UgdGhlblxuICAgICAgICAgICAgICAgICAgICB0b19saXN0IChhZHZhbmNlIHNvdXJjZSkgKHBlZWsgc291cmNlIDo6IGFjY3UpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBMaXN0LnJldiBhY2N1XG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgdG9fbGlzdCBzb3VyY2UgW11cbiAgICBlbmRcbmVuZFxuXG5cbm1vZHVsZSBTZXQzID0gU2V0X29yZGVyIChzdHJ1Y3QgbGV0IG9yZGVyID0gMyBlbmQpXG5tb2R1bGUgU2V0NCA9IFNldF9vcmRlciAoc3RydWN0IGxldCBvcmRlciA9IDQgZW5kKVxuXG5sZXQgc3RyaW5nX29mIChsc3Q6IGludCBsaXN0KTogc3RyaW5nID1cbiAgICBcIltcIlxuICAgIF5cbiAgICBTdHJpbmcuY29uY2F0XG4gICAgICAgIFwiLCBcIlxuICAgICAgICAoTGlzdC5tYXAgc3RyaW5nX29mX2ludCBsc3QpXG4gICAgXlxuICAgIFwiXVwiXG5sZXQgXyA9IHN0cmluZ19vZlxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBtb2R1bGUgTWFwID0gTWFwIChJbnQpIGluXG4gICAgTWFwLihjYXJkaW5hbCBlbXB0eSkgPSAwXG5cblxuKCogSW5zZXJ0aW9uICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQ0LihhZGRfdXB3YXJkIDEwMCAyMDAgZW1wdHkpIGluXG4gICAgU2V0NC5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0NC4oYWRkX2Rvd253YXJkIDAgMTAwIGVtcHR5KSBpblxuICAgIFNldDQuY2hlY2tfcmFuZ2UgMCAxMDAgc2V0XG5cblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQzLihhZGRfdXB3YXJkIDEwMCAyMDAgZW1wdHkpIGluXG4gICAgU2V0My5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0My4oYWRkX2Rvd253YXJkIDAgMTAwIGVtcHR5KSBpblxuICAgIFNldDMuY2hlY2tfcmFuZ2UgMCAxMDAgc2V0XG5cblxuXG5cblxuKCogRGVsZXRpb24gKilcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0My4oYWRkX3Vwd2FyZCAwIDIwMCBlbXB0eSB8PiByZW1vdmVfdXB3YXJkIDAgMTAwKSBpblxuICAgIFNldDMuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0My4oYWRkX3Vwd2FyZCAwIDIwMCBlbXB0eSB8PiByZW1vdmVfZG93bndhcmQgMCAxMDApIGluXG4gICAgU2V0My5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQ0LihhZGRfdXB3YXJkIDAgMjAwIGVtcHR5IHw+IHJlbW92ZV91cHdhcmQgMCAxMDApIGluXG4gICAgU2V0NC5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQ0LihhZGRfdXB3YXJkIDAgMjAwIGVtcHR5IHw+IHJlbW92ZV9kb3dud2FyZCAwIDEwMCkgaW5cbiAgICBTZXQ0LmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxuXG5cblxuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFVuaXQgVGVzdHNcbiAqXG4gKiB3aXRoIG1hcHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5tb2R1bGUgTWFwX29yZGVyIChPcmRlcjogT1JERVIpID0gc3RydWN0XG4gICAgaW5jbHVkZSBNYXAwIChPcmRlcikgKEludClcblxuICAgIGxldCBkb191cHdhcmRcbiAgICAgICAgICAgIChmOiBpbnQgLT4gJ2EgdCAtPiAnYSB0KSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAobWFwOiAnYSB0KVxuICAgICAgICA6ICdhIHRcbiAgICAgICAgPVxuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgICAgIGxldCByZWMgYWN0aW9uIGkgbWFwID1cbiAgICAgICAgICAgIGlmIGkgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgICAgIG1hcFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGFjdGlvbiAoaSArIDEpIChmIGkgbWFwKVxuICAgICAgICBpblxuICAgICAgICBhY3Rpb24gc3RhcnQgbWFwXG5cbiAgICBsZXQgZG9fZG93bndhcmRcbiAgICAgICAgICAgIChmOiBpbnQgLT4gJ2EgdCAtPiAnYSB0KSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAobWFwOiAnYSB0KVxuICAgICAgICA6ICdhIHRcbiAgICAgICAgPVxuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgICAgIGxldCByZWMgYWN0aW9uIGkgbWFwID1cbiAgICAgICAgICAgIGlmIGkgPSBzdGFydCB0aGVuXG4gICAgICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpIC0gMSBpblxuICAgICAgICAgICAgICAgIGFjdGlvbiBpIChmIGkgbWFwKVxuICAgICAgICBpblxuICAgICAgICBhY3Rpb24gYmV5b25kIG1hcFxuXG5cbiAgICBsZXQgYWRkX3Vwd2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoZjogaW50IC0+ICdhKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGRvX3Vwd2FyZCAoZnVuIGkgbWFwIC0+IGFkZCBpIChmIGkpIG1hcCkgc3RhcnQgYmV5b25kIG1hcFxuXG5cbiAgICBsZXQgYWRkX2Rvd253YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChmOiBpbnQgLT4gJ2EpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgZG9fZG93bndhcmQgKGZ1biBpIG1hcCAtPiBhZGQgaSAoZiBpKSBtYXApIHN0YXJ0IGJleW9uZCBtYXBcblxuXG4gICAgbGV0IHVwZGF0ZV91cHdhcmRcbiAgICAgICAgICAgIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChmOiBpbnQgLT4gJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgKG1hcDogJ2EgdClcbiAgICAgICAgOiAnYSB0XG4gICAgICAgID1cbiAgICAgICAgZG9fdXB3YXJkIChmdW4gaSBtYXAgLT4gdXBkYXRlIGkgKGYgaSkgbWFwKSBzdGFydCBiZXlvbmQgbWFwXG5cblxuICAgIGxldCBjaGVja19yYW5nZSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoZjogaW50IC0+ICdhKSAobWFwOiAnYSB0KTogYm9vbCA9XG4gICAgICAgIGxldCBuLCBvayA9XG4gICAgICAgICAgICBmb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAoZnVuIChpLCBvaykga2V5IHZhbHVlIC0+IGkgKyAxLCBvayAmJiBmIGtleSA9IHZhbHVlKVxuICAgICAgICAgICAgICAgIChzdGFydCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICBtYXBcbiAgICAgICAgaW5cbiAgICAgICAgbiA9IGJleW9uZCAmJiBva1xuZW5kXG5cblxubW9kdWxlIE1hcDMgPSBNYXBfb3JkZXIgKHN0cnVjdCBsZXQgb3JkZXIgPSAzIGVuZClcblxuXG4oKiBJbnNlcnRpb24gKilcblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBtYXAgPSBhZGRfdXB3YXJkIDAgMTAwIEZ1bi5pZCBlbXB0eSBpblxuICAgIGNoZWNrX3JhbmdlIDAgMTAwIEZ1bi5pZCBtYXBcblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBtYXAgPSBhZGRfZG93bndhcmQgMCAxMDAgRnVuLmlkIGVtcHR5IGluXG4gICAgY2hlY2tfcmFuZ2UgMCAxMDAgRnVuLmlkIG1hcFxuXG5cblxuKCogVXBkYXRlICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgbWFwID0gdXBkYXRlX3Vwd2FyZCAwIDEwMCAoZnVuIGkgXyAtPiBTb21lIGkpIGVtcHR5IGluXG4gICAgY2hlY2tfcmFuZ2UgMCAxMDAgRnVuLmlkIG1hcFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgbWFwID1cbiAgICAgICAgYWRkX3Vwd2FyZCAwIDEwMCBGdW4uaWQgZW1wdHlcbiAgICAgICAgfD5cbiAgICAgICAgdXBkYXRlX3Vwd2FyZCAwIDEwMCAoZnVuIF8gLT4gT3B0aW9uLm1hcCAoZnVuIGkgLT4gMiAqIGkpKVxuICAgIGluXG4gICAgY2hlY2tfcmFuZ2UgMCAxMDAgKGZ1biBpIC0+IDIgKiBpKSBtYXBcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IG1hcCA9XG4gICAgICAgIGFkZF91cHdhcmQgMCAxMDAgRnVuLmlkIGVtcHR5XG4gICAgICAgIHw+XG4gICAgICAgIHVwZGF0ZV91cHdhcmQgMCAxMDAgKGZ1biBfIF8gLT4gTm9uZSlcbiAgICBpblxuICAgIGlzX2VtcHR5IG1hcFxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBmIGkgPSBpZiBpIC8gMiAqIDIgPSBpIHRoZW4gaSBlbHNlIDIgKiBpXG4gICAgaW5cbiAgICBsZXQgbWFwID1cbiAgICAgICAgYWRkX3Vwd2FyZCAwIDEwMCBGdW4uaWQgZW1wdHlcbiAgICAgICAgfD5cbiAgICAgICAgYWRkX3Vwd2FyZCAyMDAgMzAwIEZ1bi5pZFxuICAgICAgICB8PlxuICAgICAgICB1cGRhdGVfdXB3YXJkIDAgMTAwIChmdW4gXyAtPiBPcHRpb24ubWFwIGYpXG4gICAgICAgIHw+XG4gICAgICAgIHVwZGF0ZV91cHdhcmQgMTAwIDIwMCAoZnVuIGkgXyAtPiBTb21lIChmIGkpKVxuICAgICAgICB8PlxuICAgICAgICB1cGRhdGVfdXB3YXJkIDAgMzAwXG4gICAgICAgICAgICAoZnVuIGkgLT5cbiAgICAgICAgICAgICAgICAgaWYgaSA8IDIwMCB0aGVuXG4gICAgICAgICAgICAgICAgICAgICBPcHRpb24ubWFwIEZ1bi5pZFxuICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICBmdW4gXyAtPiBOb25lKVxuICAgIGluXG4gICAgY2hlY2tfcmFuZ2UgMCAyMDAgZiBtYXBcblxuXG5cblxuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFVuaXQgVGVzdHNcbiAqXG4gKiB3aXRoIHN0cmVhbXNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBTZXQzIGluXG4gICAgbGV0IG1vZHVsZSBTb3VyY2UgPSBTZXQzLlNvdXJjZSBpblxuICAgIGxldCBzZXQgPSBhZGRfdXB3YXJkIDAgMjAgZW1wdHkgaW5cbiAgICBTb3VyY2UuKG1ha2Ugc2V0IHw+IHRvX2xpc3QpID0gWzA7IDE7IDI7IDM7IDQ7IDU7IDY7IDc7IDg7IDk7IDEwOyAxMTsgMTI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzsgMTQ7IDE1OyAxNjsgMTc7IDE4OyAxOV1cbiIsIm9wZW4gSnNfb2Zfb2NhbWxcbm9wZW4gRm1saWJfc3RkXG5cblxubW9kdWxlIFZhbHVlID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IEpzLlVuc2FmZS5hbnlcblxuICAgIGxldCBudWxsOiB0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5pbmplY3QgbnVsbClcblxuICAgIGxldCB1bmRlZmluZWQ6IHQgPVxuICAgICAgICBKcy4oVW5zYWZlLmluamVjdCB1bmRlZmluZWQpXG5cbiAgICBsZXQgaW50IChpOiBpbnQpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCBpXG5cbiAgICBsZXQgZmxvYXQgKHY6IGZsb2F0KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgdlxuXG4gICAgbGV0IGJvb2wgKGI6IGJvb2wpOiB0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5jb2VyY2UgKGJvb2wgYikpXG5cbiAgICBsZXQgc3RyaW5nIChzOiBzdHJpbmcpOiB0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5jb2VyY2UgKHN0cmluZyBzKSlcblxuICAgIGxldCBfb2JqZWN0IChhcnI6IChzdHJpbmcgKiB0KSBhcnJheSk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUub2JqIGFyclxuXG4gICAgbGV0IGFycmF5IChhcnI6IHQgYXJyYXkpOiB0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5jb2VyY2UgKGFycmF5IGFycikpXG5cbiAgICBsZXQgZnVuY3Rpb24xIChmOiB0IC0+IHQpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCBmXG5cbiAgICBsZXQgZnVuY3Rpb24yIChmOiB0IC0+IHQgLT4gdCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuaW5qZWN0IGZcblxuICAgIGxldCBmdW5jdGlvbjMgKGY6IHQgLT4gdCAtPiB0IC0+IHQpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCBmXG5cblxuICAgIGxldCBzdHJpbmdpZnkgKHY6IHQpOiB0IG9wdGlvbiA9XG4gICAgICAgIHRyeVxuICAgICAgICAgICAgU29tZSBKcy4oVW5zYWZlLmNvZXJjZSAoX0pTT04jI3N0cmluZ2lmeSB2KSlcbiAgICAgICAgd2l0aCBfIC0+XG4gICAgICAgICAgICBOb25lXG5cbiAgICBsZXQgcGFyc2UgKHY6IHQpOiB0IG9wdGlvbiA9XG4gICAgICAgIHRyeVxuICAgICAgICAgICAgU29tZSBKcy4oX0pTT04jI3BhcnNlIChVbnNhZmUuY29lcmNlIHYpKVxuICAgICAgICB3aXRoIF8gLT5cbiAgICAgICAgICAgIE5vbmVcbmVuZFxuXG5cblxuXG5tb2R1bGUgRGVjb2RlID1cbnN0cnVjdFxuICAgIGxldCBzdHJfYm9vbGVhbjogSnMuanNfc3RyaW5nIEpzLnQgPVxuICAgICAgICBKcy5zdHJpbmcgXCJib29sZWFuXCJcblxuICAgIGxldCBzdHJfZnVuY3Rpb246IEpzLmpzX3N0cmluZyBKcy50ID1cbiAgICAgICAgSnMuc3RyaW5nIFwiZnVuY3Rpb25cIlxuXG4gICAgbGV0IHN0cl9zdHJpbmc6IEpzLmpzX3N0cmluZyBKcy50ID1cbiAgICAgICAgSnMuc3RyaW5nIFwic3RyaW5nXCJcblxuICAgIGxldCBzdHJfbnVtYmVyOiBKcy5qc19zdHJpbmcgSnMudCA9XG4gICAgICAgIEpzLnN0cmluZyBcIm51bWJlclwiXG5cbiAgICBsZXQgaXNfZnVuY3Rpb24gKHY6IFZhbHVlLnQpOiBib29sID1cbiAgICAgICAgSnMuKHR5cGVvZiB2ID09IHN0cl9mdW5jdGlvbilcblxuICAgIGxldCBpc19ib29sZWFuICh2OiBWYWx1ZS50KTogYm9vbCA9XG4gICAgICAgIEpzLih0eXBlb2YgdiA9PSBzdHJfYm9vbGVhbilcblxuICAgIGxldCBpc19zdHJpbmcgKHY6IFZhbHVlLnQpOiBib29sID1cbiAgICAgICAgSnMuKHR5cGVvZiB2ID09IHN0cl9zdHJpbmcpXG5cbiAgICBsZXQgaXNfbnVtYmVyICh2OiBWYWx1ZS50KTogYm9vbCA9XG4gICAgICAgIEpzLih0eXBlb2YgdiA9PSBzdHJfbnVtYmVyKVxuXG5cbiAgICB0eXBlICdhIHQgPSBWYWx1ZS50IC0+ICdhIG9wdGlvblxuXG5cbiAgICBsZXQgcmV0dXJuIChhOiAnYSk6ICdhIHQgPVxuICAgICAgICBmdW4gXyAtPiBTb21lIGFcblxuXG4gICAgbGV0IGZhaWw6ICdhIHQgPVxuICAgICAgICBmdW4gXyAtPiBOb25lXG5cblxuICAgIGxldCB2YWx1ZTogVmFsdWUudCB0ID1cbiAgICAgICAgZnVuIHYgLT4gU29tZSB2XG5cblxuICAgIGxldCAobGV0KiApIChtOiAnYSB0KSAoZjogJ2EgLT4gJ2IgdCk6ICdiIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBPcHRpb24uKFxuICAgICAgICAgICAgbGV0KiBhID0gbSB2IGluXG4gICAgICAgICAgICBmIGEgdlxuICAgICAgICApXG5cblxuICAgIGxldCAoPj49KSA9IChsZXQqIClcblxuXG4gICAgbGV0ICg8Lz4pIChwOiAnYSB0KSAocTogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBtYXRjaCBwIHYgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHEgdlxuICAgICAgICB8IFNvbWUgXyBhcyByIC0+XG4gICAgICAgICAgICByXG5cblxuICAgIGxldCBtYXAgKGY6ICdhIC0+ICdiKSAobTogJ2EgdCk6ICdiIHQgPVxuICAgICAgICBsZXQqIGEgPSBtIGluXG4gICAgICAgIHJldHVybiAoZiBhKVxuXG4gICAgbGV0IG51bGwgKGE6ICdhKTogJ2EgdCA9XG4gICAgICAgIGZ1biBvYmogLT5cbiAgICAgICAgaWYgb2JqID09IFZhbHVlLm51bGwgdGhlblxuICAgICAgICAgICAgU29tZSBhXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IHVuZGVmaW5lZCAoYTogJ2EpOiAnYSB0ID1cbiAgICAgICAgZnVuIG9iaiAtPlxuICAgICAgICBpZiBvYmogPT0gVmFsdWUudW5kZWZpbmVkIHRoZW5cbiAgICAgICAgICAgIFNvbWUgYVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBmbG9hdDogZmxvYXQgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIGlmIGlzX251bWJlciB2IHRoZW5cbiAgICAgICAgICAgIFNvbWUgKEpzLihVbnNhZmUuY29lcmNlIHYpIyN2YWx1ZU9mICgpKVxuICAgICAgICAgICAgKCogW3ZhbHVlT2ZdIHJldHVybnMgYSBwcmltaXRpdmUgdmFsdWUuICopXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IGludDogaW50IHQgPVxuICAgICAgICBsZXQqIHYgPSBmbG9hdCBpblxuICAgICAgICBsZXQgb3BlbiBGbG9hdCBpblxuICAgICAgICBsZXQgaSA9IHRvX2ludCB2IGluXG4gICAgICAgIGlmIGVxdWFsIHYgKG9mX2ludCBpKSB0aGVuXG4gICAgICAgICAgICByZXR1cm4gaVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmYWlsXG5cblxuICAgIGxldCBib29sOiBib29sIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBpZiBpc19ib29sZWFuIHYgdGhlblxuICAgICAgICAgICAgU29tZSBKcy4oVW5zYWZlLmNvZXJjZSB2IHw+IHRvX2Jvb2wpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IHN0cmluZzogc3RyaW5nIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBpZiBpc19zdHJpbmcgdiB0aGVuXG4gICAgICAgICAgICBTb21lIEpzLihVbnNhZmUuY29lcmNlIHYgfD4gdG9fc3RyaW5nKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBfZnVuY3Rpb246IChWYWx1ZS50IGFycmF5IC0+IFZhbHVlLnQpIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBpZiBpc19mdW5jdGlvbiB2IHRoZW5cbiAgICAgICAgICAgIFNvbWUgKGZ1biBhcmdzIC0+IEpzLlVuc2FmZS5mdW5fY2FsbCB2IGFyZ3MpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IF9tZXRob2Q6IChWYWx1ZS50IC0+IFZhbHVlLnQgYXJyYXkgLT4gVmFsdWUudCkgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIGlmIGlzX2Z1bmN0aW9uIHYgdGhlblxuICAgICAgICAgICAgU29tZSAoZnVuIG9iaiBhcmdzIC0+IEpzLlVuc2FmZS5jYWxsIHYgb2JqIGFyZ3MpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IGZpZWxkIChuYW1lOiBzdHJpbmcpIChkZWNvZGU6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgZnVuIG9iaiAtPlxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBPcHRpb24uKFxuICAgICAgICAgICAgbGV0KiB2ID0gT3B0ZGVmLnRvX29wdGlvbiAoVW5zYWZlLmdldCBvYmogKHN0cmluZyBuYW1lKSkgaW5cbiAgICAgICAgICAgIGRlY29kZSB2XG4gICAgICAgIClcblxuXG4gICAgbGV0IGFycmF5IChkZWNvZGU6ICdhIHQpOiAnYSBhcnJheSB0ID1cbiAgICAgICAgZnVuIG9iaiAtPlxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBpZiBVbnNhZmUuZ2xvYmFsIyMuX0FycmF5IyNpc0FycmF5IG9iaiB0aGVuXG4gICAgICAgICAgICBsZXQganNfYXJyID0gKFVuc2FmZS5jb2VyY2Ugb2JqKSBpblxuICAgICAgICAgICAgbGV0IGxlbiA9IGpzX2FyciMjLmxlbmd0aCBpblxuICAgICAgICAgICAgbGV0IHJlYyBleHRyYWN0IGkgbHN0ID1cbiAgICAgICAgICAgICAgICBpZiBpID0gbGVuIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgU29tZSAoQXJyYXkub2ZfbGlzdCAoTGlzdC5yZXYgbHN0KSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGxldCBvcGVuIE9wdGlvbiBpblxuICAgICAgICAgICAgICAgICAgICBsZXQqIGUgPSBhcnJheV9nZXQganNfYXJyIGkgfD4gT3B0ZGVmLnRvX29wdGlvbiBpblxuICAgICAgICAgICAgICAgICAgICBsZXQqIGEgPSBkZWNvZGUgZSBpblxuICAgICAgICAgICAgICAgICAgICBleHRyYWN0IChpICsgMSkgKGEgOjogbHN0KVxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGV4dHJhY3QgMCBbXVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBvcHRpb24gKGRlY29kZTogJ2EgdCk6ICdhIG9wdGlvbiB0ID1cbiAgICAgICAgbWFwIE9wdGlvbi5yZXR1cm4gZGVjb2RlXG4gICAgICAgIDwvPlxuICAgICAgICBudWxsIE5vbmVcblxuZW5kXG5cblxuXG5tb2R1bGUgTWFpbiA9XG5zdHJ1Y3RcblxuICAgICgqIEdlbmVyYWwgZnVuY3Rpb25zXG4gICAgICogPT09PT09PT09PT09PT09PT1cbiAgICAgKilcblxuICAgIHR5cGUganNfZXJyb3IgPSBKcy5Kc19lcnJvci50XG5cblxuICAgIGxldCBvZl9leGNlcHRpb24gKGV4bjogZXhuKToganNfZXJyb3Igb3B0aW9uID1cbiAgICAgICAgSnMuSnNfZXJyb3Iub2ZfZXhuIGV4blxuXG5cbiAgICBsZXQgcmFpc2VfanNfZXJyb3IgKGpzX2Vycm9yOiBqc19lcnJvcik6ICdhID1cbiAgICAgICAgSnMuSnNfZXJyb3IucmFpc2VfIGpzX2Vycm9yXG5cblxuICAgIGxldCByYWlzZV9qcyAobWVzc2FnZTogc3RyaW5nKTogJ2EgPVxuICAgICAgICBsZXQganNfbXNnID0gSnMuc3RyaW5nIG1lc3NhZ2UgaW5cbiAgICAgICAgSnMuKFxuICAgICAgICAgICAgbmV3JWpzXG4gICAgICAgICAgICAgICAgZXJyb3JfY29uc3RyXG4gICAgICAgICAgICAgICAganNfbXNnXG4gICAgICAgICAgICB8PiBKc19lcnJvci5vZl9lcnJvclxuICAgICAgICAgICAgfD4gSnNfZXJyb3IucmFpc2VfXG4gICAgICAgIClcblxuXG5cbiAgICBsZXQgbG9nX3N0cmluZyAoc3RyOiBzdHJpbmcpOiB1bml0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5nbG9iYWwjIy5jb25zb2xlIyNsb2cgKHN0cmluZyBzdHIpKVxuXG5cbiAgICBsZXQgbG9nX3ZhbHVlICh2YWx1ZTogVmFsdWUudCk6IHVuaXQgPVxuICAgICAgICBKcy4oVW5zYWZlLmdsb2JhbCMjLmNvbnNvbGUjI2xvZyB2YWx1ZSlcblxuXG4gICAgbGV0IGV4cG9ydCAob2JqOiAoc3RyaW5nICogVmFsdWUudCkgYXJyYXkpOiB1bml0ID1cbiAgICAgICAgSnMuZXhwb3J0X2FsbCAoVmFsdWUuX29iamVjdCBvYmopXG5cblxuICAgIGxldCBtYWtlX2dsb2JhbCAobmFtZTogc3RyaW5nKSAodjogVmFsdWUudCk6IHVuaXQgPVxuICAgICAgICBKcy4oVW5zYWZlLihzZXQgZ2xvYmFsIChKcy5zdHJpbmcgbmFtZSkgdikpXG5cbiAgICBsZXQgZ2V0X2dsb2JhbCAobmFtZTogc3RyaW5nKTogVmFsdWUudCBvcHRpb24gPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBVbnNhZmUuKGdldCBnbG9iYWwgKEpzLnN0cmluZyBuYW1lKSkgfD4gT3B0LnRvX29wdGlvblxuXG5cbiAgICBsZXQgbmV3X2dsb2JhbCAoY25hbWU6IHN0cmluZykgKGFyZ3M6IFZhbHVlLnQgYXJyYXkpOiBWYWx1ZS50ID1cbiAgICAgICAgbWF0Y2ggZ2V0X2dsb2JhbCBjbmFtZSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlXG4gICAgICAgIHwgU29tZSBjb25zdHIgLT5cbiAgICAgICAgICAgIEpzLlVuc2FmZS5uZXdfb2JqIGNvbnN0ciBhcmdzXG5cblxuXG4gICAgKCogSGVscGVyIGZ1bmN0aW9ucyBmb3IgTm9kZSBtb2R1bGUgYW5kIGJyb3dzZXIgYXBwbGljYXRpb25cbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAqKVxuXG5cbiAgICBsZXQgZGVjb2RlX2NhbGxiYWNrIChjYjogVmFsdWUudCkgKGVycjogc3RyaW5nKTogVmFsdWUudCAtPiB1bml0ID1cbiAgICAgICAgbWF0Y2ggRGVjb2RlLl9mdW5jdGlvbiBjYiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcmFpc2VfanMgZXJyXG4gICAgICAgIHwgU29tZSBjYiAtPlxuICAgICAgICAgICAgZnVuIHYgLT4gY2IgW3x2fF0gfD4gaWdub3JlXG5cblxuICAgIGxldCBkZWNvZGVfZGF0YVxuICAgICAgICAgICAgKGRlYzogJ2EgRGVjb2RlLnQpIChkYXRhOiBWYWx1ZS50KSAoZXJyOiBzdHJpbmcpXG4gICAgICAgIDogJ2FcbiAgICAgICAgPVxuICAgICAgICBtYXRjaCBkZWMgZGF0YSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcmFpc2VfanMgZXJyXG4gICAgICAgIHwgU29tZSBzdGF0ZSAtPlxuICAgICAgICAgICAgc3RhdGVcblxuXG5cblxuICAgICgqIE5vZGUgbW9kdWxlXG4gICAgICogPT09PT09PT09PT1cbiAgICAgKilcblxuXG4gICAgdHlwZSAoJ3N0YXRlLCdtc2cpIG5vZGVfZnVuY3Rpb24gPVxuICAgICAgICAnc3RhdGUgLT4gKFZhbHVlLnQgLT4gdW5pdCkgLT4gJ21zZyAtPiB1bml0XG5cblxuICAgIGxldCBub2RlX21vZHVsZVxuICAgICAgICAgICAgKGRlY29kZTogJ3N0YXRlIERlY29kZS50KVxuICAgICAgICAgICAgKG1zZ19kZWNvZGU6ICdtc2cgRGVjb2RlLnQpXG4gICAgICAgICAgICAobm9kZV9mdW5jdGlvbjogKCdzdGF0ZSwgJ21zZykgbm9kZV9mdW5jdGlvbilcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgbGV0IGpzX2Z1bmN0aW9uIGRhdGEgY2FsbGJhY2sgPVxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID1cbiAgICAgICAgICAgICAgICBkZWNvZGVfY2FsbGJhY2sgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXCJwcm92aWRlZCBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiXG4gICAgICAgICAgICBhbmQgZGF0YSA9XG4gICAgICAgICAgICAgICAgZGVjb2RlX2RhdGEgZGVjb2RlIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgXCJjYW5ub3QgZGVjb2RlIGlucHV0IGRhdGFcIlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBmID1cbiAgICAgICAgICAgICAgICBub2RlX2Z1bmN0aW9uIGRhdGEgY2FsbGJhY2tcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBWYWx1ZS5mdW5jdGlvbjFcbiAgICAgICAgICAgICAgICAoZnVuIG1zZyAtPlxuICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggbXNnX2RlY29kZSBtc2cgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgbG9nX3N0cmluZyBcImNhbm5vdCBkZWNvZGUgbWVzc2FnZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ192YWx1ZSBtc2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbXNnIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgZiBtc2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkKVxuICAgICAgICBpblxuICAgICAgICBleHBvcnQgW3wgXCJpbml0XCIsIFZhbHVlLmZ1bmN0aW9uMiBqc19mdW5jdGlvbiB8XVxuXG5cblxuXG5cblxuXG4gICAgKCogQnJvd3NlciBBcHBsaWNhdGlvblxuICAgICAqID09PT09PT09PT09PT09PT09PT1cbiAgICAgKilcblxuXG4gICAgdHlwZSAoJ3N0YXRlLCAnbXNnKSBicm93c2VyX2Z1bmN0aW9uID1cbiAgICAgICAgJ3N0YXRlIC0+IHN0cmluZyBvcHRpb24gLT4gKFZhbHVlLnQgLT4gdW5pdCkgLT4gJ21zZyAtPiB1bml0XG5cblxuICAgIGxldCBicm93c2VyX2FwcGxpY2F0aW9uXG4gICAgICAgICAgICAoYXBwX25hbWU6IHN0cmluZylcbiAgICAgICAgICAgIChzdGF0ZV9kZWNvZGU6ICdzdGF0ZSBEZWNvZGUudClcbiAgICAgICAgICAgIChtc2dfZGVjb2RlOiAnbXNnIERlY29kZS50KVxuICAgICAgICAgICAgKGJyb3dzZXJfZnVuY3Rpb246ICgnc3RhdGUsICdtc2cpIGJyb3dzZXJfZnVuY3Rpb24pXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIGxldCBqc19mdW5jdGlvbiBzdGF0ZSBlbGVtZW50IGNhbGxiYWNrID1cbiAgICAgICAgICAgIGxldCBjYWxsYmFjayA9XG4gICAgICAgICAgICAgICAgZGVjb2RlX2NhbGxiYWNrIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdmlkZWQgY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAgICAgICAgICAgYW5kIHN0YXRlID1cbiAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YSBzdGF0ZV9kZWNvZGUgc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgXCJjYW5ub3QgZGVjb2RlIHN0YXRlXCJcbiAgICAgICAgICAgIGFuZCBlbGVtZW50ID1cbiAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YSBEZWNvZGUuKG9wdGlvbiBzdHJpbmcpIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgXCJjYW5ub3QgZGVjb2RlIGEgbnVsbGFibGUgZWxlbWVudCBpZFwiXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IGYgPVxuICAgICAgICAgICAgICAgIGJyb3dzZXJfZnVuY3Rpb24gc3RhdGUgZWxlbWVudCBjYWxsYmFja1xuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIFZhbHVlLmZ1bmN0aW9uMVxuICAgICAgICAgICAgICAgIChmdW4gbXNnIC0+XG4gICAgICAgICAgICAgICAgICAgICBtYXRjaCBtc2dfZGVjb2RlIG1zZyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfc3RyaW5nIFwiY2Fubm90IGRlY29kZSBtZXNzYWdlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbG9nX3ZhbHVlIG1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBtc2cgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBmIG1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWQpXG4gICAgICAgIGluXG4gICAgICAgIG1ha2VfZ2xvYmFsXG4gICAgICAgICAgICBhcHBfbmFtZVxuICAgICAgICAgICAgKFZhbHVlLmZ1bmN0aW9uMyBqc19mdW5jdGlvbilcbmVuZFxuIiwib3BlbiBKc19vZl9vY2FtbFxuXG5cbmNsYXNzIHR5cGUgZXZlbnQgPVxub2JqZWN0XG4gICAgbWV0aG9kIHN0b3BQcm9wYWdhdGlvbjogdW5pdCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcHJldmVudERlZmF1bHQ6ICB1bml0IC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cbnR5cGUgdCA9IGV2ZW50IEpzLnRcblxubGV0IHZhbHVlIChlOiB0KTogQmFzZS5WYWx1ZS50ID1cbiAgICBPYmoubWFnaWMgZVxuXG5sZXQgc3RvcF9wcm9wYWdhdGlvbiAoZTogdCk6IHVuaXQgPVxuICAgIGUjI3N0b3BQcm9wYWdhdGlvbiAoKVxuXG5sZXQgcHJldmVudF9kZWZhdWx0IChlOiB0KTogdW5pdCA9XG4gICAgZSMjcHJldmVudERlZmF1bHQgKClcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcblxudHlwZSBqc19zdHJpbmcgPSBKcy5qc19zdHJpbmcgSnMudFxuXG5jbGFzcyB0eXBlIGV2ZW50X3RhcmdldCA9XG5vYmplY3RcbiAgICBtZXRob2QgYWRkRXZlbnRMaXN0ZW5lcjogICAganNfc3RyaW5nIC0+ICgnYSAtPiB1bml0KSAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVtb3ZlRXZlbnRMaXN0ZW5lcjoganNfc3RyaW5nIC0+ICgnYSAtPiB1bml0KSAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cbnR5cGUgdCA9IGV2ZW50X3RhcmdldCBKcy50XG5cbmxldCBhZGQgKG5hbWU6IHN0cmluZykgKGhhbmRsZXI6IEV2ZW50LnQgLT4gdW5pdCkgKHRndDogdCk6IHVuaXQgPVxuICAgIHRndCMjYWRkRXZlbnRMaXN0ZW5lciAoSnMuc3RyaW5nIG5hbWUpIGhhbmRsZXJcblxubGV0IHJlbW92ZSAobmFtZTogc3RyaW5nKSAoaGFuZGxlcjogRXZlbnQudCAtPiB1bml0KSAodGd0OiB0KTogdW5pdCA9XG4gICAgdGd0IyNyZW1vdmVFdmVudExpc3RlbmVyIChKcy5zdHJpbmcgbmFtZSkgaGFuZGxlclxuIiwib3BlbiBKc19vZl9vY2FtbFxuXG50eXBlIHRpbWVyXG50eXBlIGludGVydmFsXG5cbmxldCBzZXQgKGY6IHVuaXQgLT4gdW5pdCkgKG1zOiBpbnQpOiB0aW1lciA9XG4gICAgSnMuVW5zYWZlLmdsb2JhbCMjc2V0VGltZW91dCBmIG1zXG5cbmxldCBjbGVhciAodDogdGltZXIpOiB1bml0ID1cbiAgICBKcy5VbnNhZmUuZ2xvYmFsIyNjbGVhclRpbWVvdXQgdFxuXG5cbmxldCBzZXRfaW50ZXJ2YWwgKGY6IHVuaXQgLT4gdW5pdCkgKG1zOiBpbnQpOiBpbnRlcnZhbCA9XG4gICAgSnMuVW5zYWZlLmdsb2JhbCMjc2V0SW50ZXJ2YWwgZiBtc1xuXG5cbmxldCBjbGVhcl9pbnRlcnZhbCAodDogaW50ZXJ2YWwpOiB1bml0ID1cbiAgICBKcy5VbnNhZmUuZ2xvYmFsIyNjbGVhckludGVydmFsIHRcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcbm9wZW4gQmFzZVxuXG5cbigqIEhlbHBlciBmdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT1cbiAqKVxuXG5cbmxldCBkZWNvZGVfY2FsbGJhY2sgKGVycjogdW5pdCAtPiBzdHJpbmcpIChjYjogVmFsdWUudCk6IFZhbHVlLnQgLT4gdW5pdCA9XG4gICAgbWF0Y2ggRGVjb2RlLl9mdW5jdGlvbiBjYiB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICAgIE1haW4ucmFpc2VfanMgKGVyciAoKSlcbiAgICB8IFNvbWUgY2IgLT5cbiAgICAgICAgZnVuIHYgLT4gY2IgW3x2fF0gfD4gaWdub3JlXG5cblxubGV0IHNlbmRfbWVzc2FnZVxuICAgICAgICAoZXJyOiB1bml0IC0+IHN0cmluZylcbiAgICAgICAgKG1zZzogVmFsdWUudCkgKGRlYzogJ21zZyBEZWNvZGUudClcbiAgICAgICAgKGNiOiAnbXNnIC0+IHVuaXQpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIG1hdGNoIGRlYyBtc2cgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBsZXQgb3BlbiBNYWluIGluXG4gICAgICAgIGxvZ19zdHJpbmcgKGVyciAoKSk7XG4gICAgICAgIGxvZ192YWx1ZSBtc2dcbiAgICB8IFNvbWUgbXNnIC0+XG4gICAgICAgIGNiIG1zZ1xuXG5cbmxldCBkb19hc3luYyAoZjogdW5pdCAtPiB1bml0KTogdW5pdCA9XG4gICAgVGltZXIuc2V0IGYgMCB8PiBpZ25vcmVcblxuXG5cbigqIENyZWF0b3IgQ29kZVxuICAgPT09PT09PT09PT09XG4qKVxuXG5cblxuY2xhc3MgdHlwZSB3b3JrZXIgPVxub2JqZWN0XG4gICAgbWV0aG9kIHBvc3RNZXNzYWdlOiAnbXNnIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCB0ZXJtaW5hdGU6IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG50eXBlIHQgPSB3b3JrZXIgSnMudFxuXG5cbmxldCBzdGFydCAodXJsOiBzdHJpbmcpIChkZWM6ICdtc2cgRGVjb2RlLnQpIChjYjogJ21zZyAtPiB1bml0KTogdCA9XG4gICAgbGV0IG9wZW4gTWFpbiBpblxuICAgIGxldCB3ID1cbiAgICAgICAgbmV3X2dsb2JhbCBcIldvcmtlclwiIFt8VmFsdWUuc3RyaW5nIHVybHxdXG4gICAgYW5kIGNiIGV2ZW50ID1cbiAgICAgICAgc2VuZF9tZXNzYWdlXG4gICAgICAgICAgICAoZnVuIF8gLT4gXCJjYW5ub3QgZGVjb2RlIG1lc3NhZ2UgZnJvbSBcIiBeIHVybCBeIFwiXFxcIlwiKVxuICAgICAgICAgICAgKEV2ZW50LnZhbHVlIGV2ZW50KVxuICAgICAgICAgICAgZGVjXG4gICAgICAgICAgICBjYlxuICAgIGluXG4gICAgRXZlbnRfdGFyZ2V0LmFkZCBcIm1lc3NhZ2VcIiBjYiAoT2JqLm1hZ2ljIHcpOyAoKiBbd10gaXMgYW4gZXZlbnQgdGFyZ2V0LiAqKVxuICAgIE9iai5tYWdpYyB3ICgqIFt3XSBpcyBhIHdvcmtlciwgYmVjYXVzZSBpdCBoYXMgYmVlbiBjb25zdHJ1Y2VkXG4gICAgICAgICAgICAgICAgICAgYnkgW1dvcmtlcl0uICopXG5cblxuXG5cbmxldCBwb3N0X21lc3NhZ2UgKG1zZzogVmFsdWUudCkgKHc6IHQpOiB1bml0ID1cbiAgICB3IyNwb3N0TWVzc2FnZSBtc2dcblxuXG5cbmxldCB0ZXJtaW5hdGUgKHc6IHQpOiB1bml0ID1cbiAgICB3IyN0ZXJtaW5hdGVcblxuXG5cblxuKCogSW1wbGVtZW50YXRpb24gQ29kZVxuICAgPT09PT09PT09PT09PT09PT09PVxuKilcblxuXG50eXBlICdtc2cgd29ya2VyX2Z1bmN0aW9uID0gKFZhbHVlLnQgLT4gdW5pdCkgLT4gJ21zZyAtPiB1bml0XG5cbmxldCBtYWtlIChkZWNvZGU6ICdtc2cgRGVjb2RlLnQpIChmOiAnbXNnIHdvcmtlcl9mdW5jdGlvbik6IHVuaXQgPVxuICAgIGxldCBvcGVuIE1haW4gaW5cbiAgICBsZXQgcG9zdCA9XG4gICAgICAgIG1hdGNoIGdldF9nbG9iYWwgXCJwb3N0TWVzc2FnZVwiIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICByYWlzZV9qcyBcIndlYndvcmtlcjogPHBvc3RNZXNzYWdlPiBmdW5jdGlvbiBub3QgYXZhaWxhYmxlXCJcbiAgICAgICAgfCBTb21lIHBvc3QgLT5cbiAgICAgICAgICAgIHBvc3RcbiAgICBpblxuICAgIGxldCBwb3N0ID1cbiAgICAgICAgZGVjb2RlX2NhbGxiYWNrXG4gICAgICAgICAgICAoZnVuIF8gLT4gXCJ3ZWJ3b3JrZXI6IDxwb3N0TWVzc2FnZT4gaXMgbm90IGEgZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHBvc3RcbiAgICBpblxuICAgIGxldCBmID0gZiBwb3N0XG4gICAgaW5cbiAgICBtYWtlX2dsb2JhbFxuICAgICAgICBcIm9ubWVzc2FnZVwiXG4gICAgICAgIChWYWx1ZS5mdW5jdGlvbjFcbiAgICAgICAgICAgICAoZnVuIG1zZyAtPlxuICAgICAgICAgICAgICAgICAgc2VuZF9tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgKGZ1biBfIC0+IFwid2Vid29ya2VyOiBjYW5ub3QgZGVjb2RlIG1lc3NhZ2VcIilcbiAgICAgICAgICAgICAgICAgICAgICBtc2dcbiAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVcbiAgICAgICAgICAgICAgICAgICAgICBmO1xuICAgICAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkKSlcblxuXG5cblxuXG5cbigqIFNpbXVsYXRpb25cbiAqID09PT09PT09PT1cbiAqKVxuXG5cbm1vZHVsZSBTaW11bGF0ZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSAoVmFsdWUudCAtPiB1bml0KSBvcHRpb24gcmVmXG5cblxuICAgIGxldCBzdGFydFxuICAgICAgICAgICAgKGRlYzogJ3JjdiBEZWNvZGUudCkgKGNiOiAncmN2IC0+IHVuaXQpXG4gICAgICAgICAgICAod29ya2VyX2RlY29kZTogJ21zZyBEZWNvZGUudCkgKHdvcmtlcjogJ21zZyB3b3JrZXJfZnVuY3Rpb24pXG4gICAgICAgIDogdFxuICAgICAgICA9XG4gICAgICAgIGxldCBwb3N0X3RvX2NyZWF0b3IgdiA9XG4gICAgICAgICAgICBzZW5kX21lc3NhZ2VcbiAgICAgICAgICAgICAgICAoZnVuIF8gLT4gXCJtYWluOiBjYW5ub3QgZGVjb2RlIG1lc3NhZ2UgZnJvbSB3b3JrZXJcIilcbiAgICAgICAgICAgICAgICB2IGRlYyBjYlxuICAgICAgICBpblxuICAgICAgICBsZXQgcG9zdF90b19jcmVhdG9yIHYgPVxuICAgICAgICAgICAgZG9fYXN5bmMgKGZ1biBfIC0+IHBvc3RfdG9fY3JlYXRvciB2KVxuICAgICAgICBpblxuICAgICAgICBsZXQgZiA9IHdvcmtlciBwb3N0X3RvX2NyZWF0b3JcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHBvc3RfdG9fd29ya2VyIHYgPVxuICAgICAgICAgICAgZG9fYXN5bmNcbiAgICAgICAgICAgICAgICAoZnVuIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gXyAtPiBcIndlYndvcmtlcjogY2Fubm90IGRlY29kZSBtZXNzYWdlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgdiB3b3JrZXJfZGVjb2RlIGYpXG4gICAgICAgIGluXG4gICAgICAgIHJlZiAoU29tZSBwb3N0X3RvX3dvcmtlcilcblxuXG4gICAgbGV0IHBvc3RfbWVzc2FnZSAobXNnOiBWYWx1ZS50KSAodzogdCk6IHVuaXQgPVxuICAgICAgICBtYXRjaCAhdyB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwid29ya2VyIGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZFwiXG4gICAgICAgIHwgU29tZSBwb3N0IC0+XG4gICAgICAgICAgICBwb3N0IG1zZ1xuXG5cbiAgICBsZXQgdGVybWluYXRlICh3OiB0KTogdW5pdCA9XG4gICAgICAgIHcgOj0gTm9uZVxuZW5kXG5cblxuXG5cblxubGV0IHNpbXVsYXRlX2pzXG4gICAgICAgIChuYW1lOiBzdHJpbmcpXG4gICAgICAgIChkZWNvZGU6ICdtc2cgRGVjb2RlLnQpXG4gICAgICAgICh3ZnVuOiAnbXNnIHdvcmtlcl9mdW5jdGlvbilcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbGV0IG9wZW4gTWFpbiBpblxuICAgIChmdW4gcG9zdCAtPlxuICAgICAgICAgbGV0IHBvc3RfdG9fY3JlYXRvciA9XG4gICAgICAgICAgICAgZGVjb2RlX2NhbGxiYWNrXG4gICAgICAgICAgICAgICAgIChmdW4gXyAtPiBcIndlYndvcmtlcjogPHBvc3RNZXNzYWdlPiBpcyBub3QgYSBmdW50aW9uXCIpXG4gICAgICAgICAgICAgICAgIHBvc3RcbiAgICAgICAgIGluXG4gICAgICAgICBsZXQgdyA9XG4gICAgICAgICAgICAgU2ltdWxhdGUuc3RhcnRcbiAgICAgICAgICAgICAgICAgKGZ1biB2IC0+IERlY29kZS5yZXR1cm4gdiB2KVxuICAgICAgICAgICAgICAgICBwb3N0X3RvX2NyZWF0b3JcbiAgICAgICAgICAgICAgICAgZGVjb2RlXG4gICAgICAgICAgICAgICAgIHdmdW5cbiAgICAgICAgIGluXG4gICAgICAgICBsZXQgcG9zdF90b193b3JrZXIgbXNnID1cbiAgICAgICAgICAgICAgU2ltdWxhdGUucG9zdF9tZXNzYWdlIG1zZyB3O1xuICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWRcbiAgICAgICAgIGFuZCB0ZXJtaW5hdGUgXyA9XG4gICAgICAgICAgICAgU2ltdWxhdGUudGVybWluYXRlIHc7XG4gICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkXG4gICAgICAgICBpblxuICAgICAgICAgVmFsdWUuX29iamVjdCBbfFxuICAgICAgICAgICAgIFwicG9zdE1lc3NhZ2VcIiwgVmFsdWUuZnVuY3Rpb24xIHBvc3RfdG9fd29ya2VyO1xuICAgICAgICAgICAgIFwidGVybWluYXRlXCIsICAgVmFsdWUuZnVuY3Rpb24xIHRlcm1pbmF0ZVxuICAgICAgICAgfF1cbiAgICApXG4gICAgfD4gVmFsdWUuZnVuY3Rpb24xXG4gICAgfD4gbWFrZV9nbG9iYWwgbmFtZVxuIiwib3BlbiBKc19vZl9vY2FtbFxuXG50eXBlIGpzX3N0cmluZyA9IEpzLmpzX3N0cmluZyBKcy50XG5cbmNsYXNzIHR5cGUgeG1sSHR0cFJlcXVlc3QgPVxub2JqZWN0XG4gICAgbWV0aG9kIG9wZW5fOiBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHNldFJlcXVlc3RIZWFkZXI6IGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9zdHJpbmc6IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgICgqXG4gICAgICAgIDA6IHJlcXVlc3Qgbm90IGluaXRpYWxpemVkXG4gICAgICAgIDE6IG9wZW4gaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgIDI6IHNlbmQgaGFzIGJlZW4gY2FsbGVkXG4gICAgICAgIDM6IGxvYWRpbmdcbiAgICAgICAgNDogY29tcGxldGVcbiAgICAqKVxuXG4gICAgbWV0aG9kIHN0YXR1czogaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICAoKiAyMDA6IE9rLCA0MDM6IGZvcmJpZGRlbiwgNDA0OiBub3QgZm91bmQuICopXG5cbiAgICBtZXRob2Qgc3RhdHVzVGV4dDoganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXNwb25zZVRleHQ6IGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG5lbmRcblxuXG50eXBlIHQgPSB4bWxIdHRwUmVxdWVzdCBKcy50XG5cblxubGV0IGV2ZW50X3RhcmdldCAocmVxOiB0KTogRXZlbnRfdGFyZ2V0LnQgPVxuICAgIE9iai5tYWdpYyByZXFcblxuXG5sZXQgbWFrZVxuICAgICAgICAoX21ldGhvZDogc3RyaW5nKVxuICAgICAgICAodXJsOiBzdHJpbmcpXG4gICAgICAgIChoZWFkZXJzOiAoc3RyaW5nICogc3RyaW5nKSBsaXN0KVxuICAgICAgICAoYm9keTogc3RyaW5nKVxuICAgIDogdFxuICAgID1cbiAgICBsZXQgcmVxOiB4bWxIdHRwUmVxdWVzdCBKcy50ID1cbiAgICAgICAgbGV0IHJlcXVlc3QgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1hNTEh0dHBSZXF1ZXN0XG4gICAgICAgIGluXG4gICAgICAgIG5ldyVqcyByZXF1ZXN0XG4gICAgaW5cbiAgICByZXEjI29wZW5fIChKcy5zdHJpbmcgX21ldGhvZCkgKEpzLnN0cmluZyB1cmwpO1xuICAgIExpc3QuaXRlclxuICAgICAgICAoZnVuIChuYW1lLCB2YWx1ZSkgLT5cbiAgICAgICAgICAgICByZXEjI3NldFJlcXVlc3RIZWFkZXIgKEpzLnN0cmluZyBuYW1lKSAoSnMuc3RyaW5nIHZhbHVlKVxuICAgICAgICApXG4gICAgICAgIGhlYWRlcnM7XG4gICAgcmVxIyNzZW5kX3N0cmluZyAoSnMuc3RyaW5nIGJvZHkpO1xuICAgIHJlcVxuXG5cbmxldCByZWFkeV9zdGF0ZSAocmVxOiB0KTogaW50ID1cbiAgICByZXEjIy5yZWFkeVN0YXRlXG5cblxubGV0IHN0YXR1cyAocmVxOiB0KTogaW50ID1cbiAgICByZXEjIy5zdGF0dXNcblxuXG5sZXQgcmVzcG9uc2VfdGV4dF92YWx1ZSAocmVxOiB0KTogQmFzZS5WYWx1ZS50ID1cbiAgICBPYmoubWFnaWMgcmVxIyMucmVzcG9uc2VUZXh0XG5cblxubGV0IHJlc3BvbnNlX3RleHRfc3RyaW5nIChyZXE6IHQpOiBzdHJpbmcgPVxuICAgIEpzLnRvX3N0cmluZyByZXEjIy5yZXNwb25zZVRleHRcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcbm9wZW4gQmFzZVxuXG50eXBlIGpzX3N0cmluZyA9IEpzLmpzX3N0cmluZyBKcy50XG5cblxuXG5jbGFzcyB0eXBlIHN0eWxlID1cbm9iamVjdFxuICAgIG1ldGhvZCBzZXRQcm9wZXJ0eTogICAganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVtb3ZlUHJvcGVydHk6IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5jbGFzcyB0eXBlIG5vZGUgPVxub2JqZWN0XG4gICAgbWV0aG9kIHBhcmVudE5vZGU6ICBub2RlIEpzLnQgSnMuT3B0LnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBmaXJzdENoaWxkOiAgbm9kZSBKcy50IEpzLk9wdC50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgbmV4dFNpYmxpbmc6IG5vZGUgSnMudCBKcy5PcHQudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXBwZW5kQ2hpbGQ6ICBub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlbW92ZUNoaWxkOiAgbm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZXBsYWNlQ2hpbGQ6IG5vZGUgSnMudCAtPiBub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIG5vZGVWYWx1ZTogICAganNfc3RyaW5nIEpzLnByb3BcbmVuZFxuXG5cblxuXG5cblxuXG5jbGFzcyB0eXBlIGVsZW1lbnQgPVxub2JqZWN0XG4gICAgbWV0aG9kIHNjcm9sbFdpZHRoOiAgICAgaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2Qgc2Nyb2xsSGVpZ2h0OiAgICBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBjbGllbnRXaWR0aDogICAgIGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGNsaWVudEhlaWdodDogICAgaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2Qgc2Nyb2xsTGVmdDogICAgICBpbnQgSnMucHJvcFxuICAgIG1ldGhvZCBzY3JvbGxUb3A6ICAgICAgIGludCBKcy5wcm9wXG5cbiAgICBtZXRob2Qgc3R5bGU6ICAgICAgICAgICBzdHlsZSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2Qgc2V0QXR0cmlidXRlOiAgICBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZW1vdmVBdHRyaWJ1dGU6IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBmb2N1czogdW5pdCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgYmx1cjogIHVuaXQgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxuXG5cbmNsYXNzIHR5cGUgZG9jdW1lbnQgPVxub2JqZWN0XG4gICAgbWV0aG9kIHRpdGxlOiAgICAgICAgICBqc19zdHJpbmcgSnMucHJvcFxuICAgIG1ldGhvZCBib2R5OiAgICAgICAgICAgZWxlbWVudCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgZ2V0RWxlbWVudEJ5SWQ6IGpzX3N0cmluZyAtPiBlbGVtZW50IEpzLnQgSnMuT3B0LnQgSnMubWV0aFxuICAgIG1ldGhvZCBjcmVhdGVUZXh0Tm9kZToganNfc3RyaW5nIC0+IG5vZGUgSnMudCBKcy5tZXRoXG4gICAgbWV0aG9kIGNyZWF0ZUVsZW1lbnQ6ICBqc19zdHJpbmcgLT4gZWxlbWVudCBKcy50IEpzLm1ldGhcbiAgICBtZXRob2QgY3JlYXRlRWxlbWVudE5TOiAganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiBlbGVtZW50IEpzLnQgSnMubWV0aFxuICAgIG1ldGhvZCBjcmVhdGVEb2N1bWVudEZyYWdtZW50OiAgdW5pdCAtPiBub2RlIEpzLnQgSnMubWV0aFxuZW5kXG5cblxuXG5cblxuY2xhc3MgdHlwZSBoaXN0b3J5ID1cbm9iamVjdFxuICAgIG1ldGhvZCBnbzogaW50IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCBwdXNoU3RhdGU6ICAgIEJhc2UuVmFsdWUudCAtPiBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZXBsYWNlU3RhdGU6IEJhc2UuVmFsdWUudCAtPiBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cbmNsYXNzIHR5cGUgbG9jYXRpb24gPVxub2JqZWN0XG4gICAgbWV0aG9kIGhyZWY6ICAgICAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBwcm90b2NvbDogICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgaG9zdDogICAgICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHBvcnQ6ICAgICAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBwYXRobmFtZTogICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2Qgc2VhcmNoOiAgICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGhhc2g6ICAgICAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFzc2lnbjoganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZWxvYWQ6IHVuaXQgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxuXG5jbGFzcyB0eXBlIHdpbmRvdyA9XG5vYmplY3RcbiAgICBtZXRob2QgaGlzdG9yeTogIGhpc3RvcnkgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGxvY2F0aW9uOiBsb2NhdGlvbiBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgZG9jdW1lbnQ6IGRvY3VtZW50IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IChmbG9hdCAtPiB1bml0KSAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5cblxubW9kdWxlIFN0eWxlID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IHN0eWxlIEpzLnRcblxuICAgIGxldCBzZXQgKG5hbWU6IHN0cmluZykgKHZhbHVlOiBzdHJpbmcpIChzOiB0KTogdW5pdCA9XG4gICAgICAgIHMjI3NldFByb3BlcnR5IChKcy5zdHJpbmcgbmFtZSkgKEpzLnN0cmluZyB2YWx1ZSlcblxuICAgIGxldCByZW1vdmUgKG5hbWU6IHN0cmluZykgKHM6IHQpOiB1bml0ID1cbiAgICAgICAgcyMjcmVtb3ZlUHJvcGVydHkgKEpzLnN0cmluZyBuYW1lKVxuZW5kXG5cblxuXG5cbm1vZHVsZSBOb2RlID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IG5vZGUgSnMudFxuXG4gICAgbGV0IGV2ZW50X3RhcmdldCAobm9kZTogdCk6IEV2ZW50X3RhcmdldC50ID1cbiAgICAgICAgT2JqLm1hZ2ljIG5vZGVcblxuICAgIGxldCBwYXJlbnQgKG5vZGU6IHQpOiB0IG9wdGlvbiA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIE9wdC50b19vcHRpb24gbm9kZSMjLnBhcmVudE5vZGVcblxuICAgIGxldCBmaXJzdCAobm9kZTogdCk6IHQgb3B0aW9uID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgT3B0LnRvX29wdGlvbiBub2RlIyMuZmlyc3RDaGlsZFxuXG4gICAgbGV0IG5leHQgKG5vZGU6IHQpOiB0IG9wdGlvbiA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIE9wdC50b19vcHRpb24gbm9kZSMjLm5leHRTaWJsaW5nXG5cbiAgICBsZXQgYXBwZW5kIChjaGlsZDogdCkgKG5vZGU6IHQpOiB1bml0ID1cbiAgICAgICAgYXNzZXJ0IChub3QgKG5vZGUgPT0gT2JqLm1hZ2ljIFZhbHVlLm51bGwpKTtcbiAgICAgICAgbm9kZSMjYXBwZW5kQ2hpbGQgY2hpbGRcblxuICAgIGxldCByZW1vdmUgKGNoaWxkOiB0KSAobm9kZTogdCk6IHVuaXQgPVxuICAgICAgICBub2RlIyNyZW1vdmVDaGlsZCBjaGlsZFxuXG4gICAgbGV0IHJlcGxhY2UgKG5ld19jaGlsZDogdCkgKG9sZF9jaGlsZDogdCkgKG5vZGU6IHQpOiB1bml0ID1cbiAgICAgICAgbm9kZSMjcmVwbGFjZUNoaWxkIG5ld19jaGlsZCBvbGRfY2hpbGRcblxuICAgIGxldCByZWMgcmVtb3ZlX2NoaWxkcmVuIChwYXJlbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgbWF0Y2ggZmlyc3QgcGFyZW50IHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAoKVxuICAgICAgICB8IFNvbWUgY2hpbGQgLT5cbiAgICAgICAgICAgIHJlbW92ZSBjaGlsZCBwYXJlbnQ7XG4gICAgICAgICAgICByZW1vdmVfY2hpbGRyZW4gcGFyZW50ICgqIHRhaWwgcmVjdXJzaW9uLCBjb21waWxlZCB0byBqYXZhc2NyaXB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AuICopXG5cbiAgICBsZXQgbm9kZV92YWx1ZSAobm9kZTogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBub2RlIyMubm9kZVZhbHVlXG5cbiAgICBsZXQgc2V0X25vZGVfdmFsdWUgKHZhbHVlOiBzdHJpbmcpIChub2RlOiB0KTogdW5pdCA9XG4gICAgICAgIG5vZGUjIy5ub2RlVmFsdWUgOj0gKEpzLnN0cmluZyB2YWx1ZSlcbmVuZFxuXG5cblxuXG5cblxuXG5tb2R1bGUgRWxlbWVudCA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBlbGVtZW50IEpzLnRcblxuICAgIGxldCBub2RlIChlbGVtZW50OiB0KTogTm9kZS50ID1cbiAgICAgICAgSnMuVW5zYWZlLmNvZXJjZSBlbGVtZW50XG5cbiAgICBsZXQgc2Nyb2xsX3dpZHRoIChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbFdpZHRoXG5cbiAgICBsZXQgc2Nyb2xsX2hlaWdodCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxIZWlnaHRcblxuICAgIGxldCBjbGllbnRfd2lkdGggKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuY2xpZW50V2lkdGhcblxuICAgIGxldCBjbGllbnRfaGVpZ2h0IChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLmNsaWVudEhlaWdodFxuXG4gICAgbGV0IHNjcm9sbF9sZWZ0IChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbExlZnRcblxuICAgIGxldCBzY3JvbGxfdG9wIChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbFRvcFxuXG5cbiAgICBsZXQgc2V0X3Njcm9sbF9sZWZ0ICh2OiBpbnQpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxMZWZ0IDo9IHZcblxuICAgIGxldCBzZXRfc2Nyb2xsX3RvcCAodjogaW50KSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsVG9wIDo9IHZcblxuXG5cblxuICAgIGxldCBzdHlsZSAoZWxlbWVudDogdCk6IFN0eWxlLnQgPVxuICAgICAgICBlbGVtZW50IyMuc3R5bGVcblxuICAgIGxldCBzZXRfYXR0cmlidXRlIChuYW1lOiBzdHJpbmcpICh2YWx1ZTogc3RyaW5nKSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyNzZXRBdHRyaWJ1dGUgKEpzLnN0cmluZyBuYW1lKSAoSnMuc3RyaW5nIHZhbHVlKVxuXG4gICAgbGV0IHJlbW92ZV9hdHRyaWJ1dGUgKG5hbWU6IHN0cmluZykgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjcmVtb3ZlQXR0cmlidXRlIChKcy5zdHJpbmcgbmFtZSlcblxuXG4gICAgbGV0IHNldF9wcm9wZXJ0eSAobmFtZTogc3RyaW5nKSAodmFsdWU6IFZhbHVlLnQpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIEpzLlVuc2FmZS5zZXQgZWxlbWVudCAoSnMuc3RyaW5nIG5hbWUpIHZhbHVlXG5cbiAgICBsZXQgZGVsZXRlX3Byb3BlcnR5IChuYW1lOiBzdHJpbmcpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIEpzLlVuc2FmZS5kZWxldGUgZWxlbWVudCAoSnMuc3RyaW5nIG5hbWUpXG5cblxuICAgIGxldCBmb2N1cyAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyNmb2N1cyAoKVxuXG4gICAgbGV0IGJsdXIgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjYmx1ciAoKVxuZW5kXG5cblxuXG5cblxuXG5cbm1vZHVsZSBEb2N1bWVudCA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBkb2N1bWVudCBKcy50XG5cblxuICAgIGxldCB0aXRsZSAoZG9jOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGRvYyMjLnRpdGxlXG5cblxuICAgIGxldCBzZXRfdGl0bGUgKHRpdGxlOiBzdHJpbmcpIChkb2M6IHQpOiB1bml0ID1cbiAgICAgICAgZG9jIyMudGl0bGUgOj0gSnMuc3RyaW5nIHRpdGxlXG5cblxuICAgIGxldCBib2R5IChkb2M6IHQpOiBFbGVtZW50LnQgPVxuICAgICAgICBhc3NlcnQgKGRvYyMjLmJvZHkgIT0gSnMuVW5zYWZlLmpzX2V4cHIgXCJudWxsXCIpO1xuICAgICAgICBkb2MjIy5ib2R5XG5cbiAgICBsZXQgZmluZCAobmFtZTogc3RyaW5nKSAoZG9jOiB0KTogRWxlbWVudC50IG9wdGlvbiA9XG4gICAgICAgIEpzLk9wdC50b19vcHRpb24gKGRvYyMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBuYW1lKSlcblxuICAgIGxldCBjcmVhdGVfZWxlbWVudCAodGFnOiBzdHJpbmcpIChkb2M6IHQpOiBFbGVtZW50LnQgPVxuICAgICAgICBkb2MjI2NyZWF0ZUVsZW1lbnQgKEpzLnN0cmluZyB0YWcpXG5cbiAgICBsZXQgY3JlYXRlX3RleHRfbm9kZSAodGV4dDogc3RyaW5nKSAoZG9jOiB0KTogTm9kZS50ID1cbiAgICAgICAgZG9jIyNjcmVhdGVUZXh0Tm9kZSAoSnMuc3RyaW5nIHRleHQpXG5cbiAgICBsZXQgY3JlYXRlX2VsZW1lbnRfbnMgKG5hbWVzcGFjZTogc3RyaW5nKSAodGFnOiBzdHJpbmcpIChkb2M6IHQpOiBFbGVtZW50LnQgPVxuICAgICAgICBkb2MjI2NyZWF0ZUVsZW1lbnROUyAoSnMuc3RyaW5nIG5hbWVzcGFjZSkgKEpzLnN0cmluZyB0YWcpXG5cbiAgICBsZXQgY3JlYXRlX2RvY3VtZW50X2ZyYWdtZW50IChkb2M6IHQpOiBOb2RlLnQgPVxuICAgICAgICBkb2MjI2NyZWF0ZURvY3VtZW50RnJhZ21lbnQgKClcbmVuZFxuXG5cblxubW9kdWxlIEhpc3RvcnkgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gaGlzdG9yeSBKcy50XG5cblxuICAgIGxldCBnbyAoaTogaW50KSAoaGlzdG9yeTogdCk6IHVuaXQgPVxuICAgICAgICBoaXN0b3J5IyNnbyBpXG5cblxuICAgIGxldCBwdXNoX3N0YXRlXG4gICAgICAgICAgICAoc3RhdGU6IFZhbHVlLnQpXG4gICAgICAgICAgICAodGl0bGU6IHN0cmluZylcbiAgICAgICAgICAgICh1cmw6IHN0cmluZylcbiAgICAgICAgICAgIChoaXN0b3J5OiB0KVxuICAgICAgICA6IHVuaXQgPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBoaXN0b3J5IyNwdXNoU3RhdGUgc3RhdGUgKHN0cmluZyB0aXRsZSkgKHN0cmluZyB1cmwpXG5cblxuICAgIGxldCByZXBsYWNlX3N0YXRlXG4gICAgICAgICAgICAoc3RhdGU6IFZhbHVlLnQpXG4gICAgICAgICAgICAodGl0bGU6IHN0cmluZylcbiAgICAgICAgICAgICh1cmw6IHN0cmluZylcbiAgICAgICAgICAgIChoaXN0b3J5OiB0KVxuICAgICAgICA6IHVuaXQgPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBoaXN0b3J5IyNyZXBsYWNlU3RhdGUgc3RhdGUgKHN0cmluZyB0aXRsZSkgKHN0cmluZyB1cmwpXG5lbmRcblxuXG5cblxuXG5tb2R1bGUgTG9jYXRpb24gPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gbG9jYXRpb24gSnMudFxuXG4gICAgbGV0IGhyZWYgKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMuaHJlZlxuXG4gICAgbGV0IHByb3RvY29sIChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLnByb3RvY29sXG5cbiAgICBsZXQgaG9zdCAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5ob3N0XG5cbiAgICBsZXQgcG9ydCAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5wb3J0XG5cbiAgICBsZXQgcGF0aG5hbWUgKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMucGF0aG5hbWVcblxuICAgIGxldCBzZWFyY2ggKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMuc2VhcmNoXG5cbiAgICBsZXQgaGFzaCAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5oYXNoXG5cbiAgICBsZXQgYXNzaWduICh1cmw6IHN0cmluZykgKGxvY2F0aW9uOiB0KTogdW5pdCA9XG4gICAgICAgIGxvY2F0aW9uIyNhc3NpZ24gKEpzLnN0cmluZyB1cmwpXG5cblxuICAgIGxldCByZWxvYWQgKGxvY2F0aW9uOiB0KTogdW5pdCA9XG4gICAgICAgIGxvY2F0aW9uIyNyZWxvYWQgKClcbmVuZFxuXG5cblxuXG5tb2R1bGUgV2luZG93ID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IHdpbmRvdyBKcy50XG5cblxuICAgIGxldCBnZXQgKCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuZ2xvYmFsXG5cbiAgICBsZXQgZXZlbnRfdGFyZ2V0ICh3OiB0KTogRXZlbnRfdGFyZ2V0LnQgPVxuICAgICAgICBPYmoubWFnaWMgd1xuXG5cbiAgICBsZXQgZG9jdW1lbnQgKHc6IHQpOiBEb2N1bWVudC50ID1cbiAgICAgICAgdyMjLmRvY3VtZW50XG5cblxuICAgIGxldCBoaXN0b3J5ICh3OiB0KTogSGlzdG9yeS50ID1cbiAgICAgICAgdyMjLmhpc3RvcnlcblxuXG4gICAgbGV0IGxvY2F0aW9uICh3OiB0KTogTG9jYXRpb24udCA9XG4gICAgICAgIHcjIy5sb2NhdGlvblxuXG5cbiAgICBsZXQgb25fbmV4dF9hbmltYXRpb24gKGNhbGxiYWNrOiBmbG9hdCAtPiB1bml0KSAodzogdCk6IHVuaXQgPVxuICAgICAgICB3IyNyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgY2FsbGJhY2tcbmVuZFxuIiwib3BlbiBKc19vZl9vY2FtbFxuXG50eXBlIHQgPSBKcy5kYXRlIEpzLnRcblxuXG5sZXQgbm93ICgpOiB0ID1cbiAgICBuZXclanMgSnMuZGF0ZV9ub3dcblxuXG5sZXQgbWFrZVxuICAgICAgICAoeWVhcjogaW50KVxuICAgICAgICAobW9udGg6IGludClcbiAgICAgICAgKGRheTogaW50KVxuICAgICAgICAoaG91cjogaW50KVxuICAgICAgICAobWludXRlOiBpbnQpXG4gICAgICAgIChzZWNvbmQ6IGludClcbiAgICAgICAgKG1pbGxpOiBpbnQpXG4gICAgOiB0XG4gICAgPVxuICAgIG5ldyVqcyBKcy5kYXRlX21zIHllYXIgbW9udGggZGF5IGhvdXIgbWludXRlIHNlY29uZCBtaWxsaVxuXG5cbmxldCBvZl92YWx1ZSAodjogZmxvYXQpOiB0ID1cbiAgICBuZXclanMgSnMuZGF0ZV9mcm9tVGltZVZhbHVlIHZcblxuXG5sZXQgdmFsdWUgKGQ6IHQpOiBmbG9hdCA9XG4gICAgZCMjdmFsdWVPZlxuXG5cbmxldCB6b25lX29mZnNldCAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0VGltZXpvbmVPZmZzZXRcblxuXG5sZXQgYWRkIChtczogZmxvYXQpIChkOiB0KTogdCA9XG4gICAgb2ZfdmFsdWUgKHZhbHVlIGQgKy4gbXMpXG5cblxubGV0IGRheSAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0RGF5XG5cblxubGV0IGRhdGUgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldERhdGVcblxuXG5sZXQgbW9udGggKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldE1vbnRoXG5cblxubGV0IHllYXIgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldEZ1bGxZZWFyXG5cblxubGV0IGhvdXJzIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRIb3Vyc1xuXG5cbmxldCBtaW51dGVzIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRNaW51dGVzXG5cblxubGV0IHNlY29uZHMgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldFNlY29uZHNcblxuXG5sZXQgbWlsbGlzZWNvbmRzIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRNaWxsaXNlY29uZHNcbiIsIm9wZW4gRm1saWJfc3RkXG5cbm1vZHVsZSB0eXBlIERJQ1QgPVxuc2lnXG4gICAgdHlwZSBrZXlcblxuICAgIHR5cGUgXyB0XG5cbiAgICB2YWwgZW1wdHk6ICdhIHRcblxuICAgIHZhbCBmaW5kX29wdDoga2V5IC0+ICdhIHQgLT4gJ2Egb3B0aW9uXG5cbiAgICB2YWwgYWRkOiBrZXkgLT4gJ2EgLT4gJ2EgdCAtPiAnYSB0XG5cbiAgICB2YWwgc2V0OiBrZXkgLT4gKCdhIG9wdGlvbiAtPiAnYSkgLT4gJ2EgdCAtPiAnYSB0XG5cbiAgICB2YWwgb2ZfbGlzdDogKGtleSAqICdhKSBsaXN0IC0+ICdhIHRcblxuICAgIHZhbCBmb2xkOiAoJ2FjY3UgLT4ga2V5IC0+ICdhIC0+ICdhY2N1KSAtPiAnYWNjdSAtPiAnYSB0IC0+ICdhY2N1XG5cbiAgICB2YWwgaXRlcjogKGtleSAtPiAnYSAtPiB1bml0KSAtPiAnYSB0IC0+IHVuaXRcblxuICAgIHZhbCBkaWZmOlxuICAgICAgICAoa2V5IC0+ICdhIC0+IHVuaXQpXG4gICAgICAgIC0+IChrZXkgLT4gJ2EgLT4gdW5pdClcbiAgICAgICAgLT4gKGtleSAtPiB1bml0KVxuICAgICAgICAtPiAnYSB0XG4gICAgICAgIC0+ICdhIHRcbiAgICAgICAgLT4gdW5pdFxuZW5kXG5cblxubW9kdWxlIE1ha2UgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgbW9kdWxlIE1hcCAgID0gRm1saWJfc3RkLkJ0cmVlLk1hcCAoS2V5KVxuXG4gICAgdHlwZSAnYSB0ID0ge1xuICAgICAgICBhcnI6IChLZXkudCAqICdhICkgQXJyYXkudDtcbiAgICAgICAgbWFwOiBpbnQgTWFwLnQ7XG4gICAgfVxuXG4gICAgbGV0IGVtcHR5OiAnYSB0ID0ge1xuICAgICAgICBhcnIgPSBbfHxdO1xuICAgICAgICBtYXAgPSBNYXAuZW1wdHk7XG4gICAgfVxuXG5cbiAgICBsZXQgZmluZF9vcHQgKGtleTogS2V5LnQpIChkOiAnYSB0KTogJ2Egb3B0aW9uID1cbiAgICAgICAgT3B0aW9uLm1hcFxuICAgICAgICAgICAgKGZ1biBpIC0+XG4gICAgICAgICAgICAgICAgIGFzc2VydCAoaSA8IEFycmF5Lmxlbmd0aCBkLmFycik7XG4gICAgICAgICAgICAgICAgIGxldCBrLCB2ID0gZC5hcnIuKGkpIGluXG4gICAgICAgICAgICAgICAgIGFzc2VydCAoayA9IGtleSk7XG4gICAgICAgICAgICAgICAgIHYpXG4gICAgICAgICAgICAoTWFwLmZpbmRfb3B0IGtleSBkLm1hcClcblxuXG4gICAgbGV0IGFkZCAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSkgKGQ6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbWF0Y2ggTWFwLmZpbmRfb3B0IGtleSBkLm1hcCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgbGV0IG4gPSBBcnJheS5sZW5ndGggZC5hcnIgaW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXAgPSBNYXAuYWRkIGtleSBuIGQubWFwO1xuICAgICAgICAgICAgICAgIGFyciA9IEFycmF5LnB1c2ggKGtleSwgdmFsdWUpIGQuYXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgZFxuXG5cblxuICAgIGxldCBzZXQgKGtleTogS2V5LnQpIChmOiAnYSBvcHRpb24gLT4gJ2EpIChkOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIG1hdGNoIE1hcC5maW5kX29wdCBrZXkgZC5tYXAgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGFkZCBrZXkgKGYgTm9uZSkgZFxuICAgICAgICB8IFNvbWUgaWR4IC0+XG4gICAgICAgICAgICBsZXQgKGssIHYpID0gZC5hcnIuKGlkeCkgaW5cbiAgICAgICAgICAgIGFzc2VydCAoayA9IGtleSk7XG4gICAgICAgICAgICB7ZCB3aXRoXG4gICAgICAgICAgICAgYXJyID0gQXJyYXkucmVwbGFjZSBpZHggKGtleSwgZiAoU29tZSB2KSkgZC5hcnJ9XG5cblxuXG4gICAgbGV0IG9mX2xpc3QgKGxzdDogKEtleS50ICogJ2EpIGxpc3QpOiAnYSB0ID1cbiAgICAgICAgbGV0IHJlYyBvZl9saXN0IGQgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgIGRcbiAgICAgICAgICAgIHwgKGtleSwgdmFsdWUpIDo6IHRsIC0+XG4gICAgICAgICAgICAgICAgb2ZfbGlzdCAoYWRkIGtleSB2YWx1ZSBkKSB0bFxuICAgICAgICBpblxuICAgICAgICBvZl9saXN0IGVtcHR5IGxzdFxuXG5cblxuXG4gICAgbGV0IGZvbGQgKGY6ICdhY2N1IC0+IEtleS50IC0+ICdhIC0+ICdhY2N1KSAoYWNjdTogJ2FjY3UpIChkOiAnYSB0KTogJ2FjY3UgPVxuICAgICAgICBBcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gYWNjdSAoa2V5LCB2YWx1ZSkgLT4gZiBhY2N1IGtleSB2YWx1ZSlcbiAgICAgICAgICAgIGFjY3VcbiAgICAgICAgICAgIGQuYXJyXG5cblxuICAgIGxldCBpdGVyIChmOiBLZXkudCAtPiAnYSAtPiB1bml0KSAoZGljdDogJ2EgdCk6IHVuaXQgPVxuICAgICAgICBTdGRsaWIuQXJyYXkuaXRlclxuICAgICAgICAgICAgKGZ1biAoa2V5LCB2YWx1ZSkgLT4gZiBrZXkgdmFsdWUpXG4gICAgICAgICAgICBkaWN0LmFyclxuXG5cbiAgICBsZXQgZGlmZlxuICAgICAgICAgICAgKGFkZDogS2V5LnQgLT4gJ2EgLT4gdW5pdClcbiAgICAgICAgICAgIChzZXQ6IEtleS50IC0+ICdhIC0+IHVuaXQpXG4gICAgICAgICAgICAocmVtb3ZlOiBLZXkudCAtPiB1bml0KVxuICAgICAgICAgICAgKGQxOiAnYSB0KVxuICAgICAgICAgICAgKGQyOiAnYSB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBpdGVyXG4gICAgICAgICAgICAoZnVuIGtleSBfIC0+XG4gICAgICAgICAgICAgICAgIG1hdGNoIGZpbmRfb3B0IGtleSBkMSB3aXRoXG4gICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAoKVxuICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSBrZXkpXG4gICAgICAgICAgICBkMjtcbiAgICAgICAgaXRlclxuICAgICAgICAgICAgKGZ1biBrZXkgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgbWF0Y2ggZmluZF9vcHQga2V5IGQyIHdpdGhcbiAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICBhZGQga2V5IHZhbHVlXG5cbiAgICAgICAgICAgICAgICAgfCBTb21lIHZhbHVlMiAtPlxuICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPT0gdmFsdWUyIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAoKVxuICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBrZXkgdmFsdWUpXG4gICAgICAgICAgICBkMVxuZW5kXG5cblxuXG5pbmNsdWRlIE1ha2UgKFN0cmluZylcbiIsIm9wZW4gRm1saWJfanNcblxuXG5tb2R1bGUgWm9uZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBpbnQgKCogb2Zmc2V0IGluIG1pbnV0ZXMgZnJvbSB1dGMsIHdlc3R3YXJkIHBvc2l0aXZlLCBlYXN0d2FyZFxuICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSAqKVxuXG4gICAgbGV0IHV0YzogdCA9IDBcblxuICAgIGxldCBtYWtlIChtaW51dGVzOiBpbnQpOiB0ID1cbiAgICAgICAgbWludXRlc1xuXG4gICAgbGV0IG9mZnNldCAoem9uZTogdCk6IGludCA9XG4gICAgICAgIHpvbmVcbmVuZFxuXG5cbnR5cGUgdCA9IERhdGUudFxuXG5sZXQgemVybzogdCA9XG4gICAgRGF0ZS5vZl92YWx1ZSAoMC4wKVxuXG5sZXQgYWRhcHQgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiB0ID1cbiAgICBEYXRlLihhZGQgKDYwMDAwLiAqLiBmbG9hdF9vZl9pbnQgKHpvbmVfb2Zmc2V0IHRpbWUgLSB6b25lKSkgdGltZSlcbiAgICAgICAgKCogbW9yZSB3ZXN0d2FyZCBpcyBub3QgeWV0IHRoYXQgbGF0ZSAqKVxuXG5cbmxldCB5ZWFyICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLnllYXIgKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgbW9udGggKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUubW9udGggKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgZGF5X29mX21vbnRoICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLmRhdGUgKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgaG91ciAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5ob3VycyAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBtaW51dGUgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUubWludXRlcyAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBzZWNvbmQgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUuc2Vjb25kcyAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBtaWxsaV9zZWNvbmQgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUubWlsbGlzZWNvbmRzIChhZGFwdCB0aW1lIHpvbmUpXG4iLCJtb2R1bGUgTG9jYWwgPVxuc3RydWN0XG4gICAgdHlwZSB0XG5cbiAgICBsZXQgc3RyaW5nIChfOiB0KTogc3RyaW5nID1cbiAgICAgICAgYXNzZXJ0IGZhbHNlICgqIG55aSAqKVxuZW5kXG5cblxudHlwZSB0ID1cbiAgICB8IFJhdyBvZiBzdHJpbmdcbiAgICB8IExvY2FsIG9mIExvY2FsLnRcblxuXG5sZXQgcGFyc2UgKHN0cjogc3RyaW5nKTogdCBvcHRpb24gPVxuICAgIFNvbWUgKFJhdyBzdHIpXG5cblxubGV0IHN0cmluZzogdCAtPiBzdHJpbmcgPVxuICAgIGZ1bmN0aW9uXG4gICAgfCBSYXcgc3RyIC0+XG4gICAgICAgIHN0clxuICAgIHwgTG9jYWwgbG9jIC0+XG4gICAgICAgIExvY2FsLnN0cmluZyBsb2NcblxubGV0IGlzX3BhZ2U6IHQgLT4gYm9vbCA9IGZ1bmN0aW9uXG4gICAgfCBSYXcgXyAtPlxuICAgICAgICB0cnVlICgqIE1JU1NJTkchISEgYXNzZXJ0IGZhbHNlICopXG4gICAgfCBMb2NhbCBfIC0+XG4gICAgICAgIHRydWVcbiIsIm9wZW4gRm1saWJfanNcblxuXG5cbm1vZHVsZSBBY3R1YWwgPVxuc3RydWN0XG4gICAgKCogU2VlIE5vdGUgW0Z1bmN0aW9ucyB3aXRoIHJlZmVyZW5jZXNdICopXG4gICAgdHlwZSAnZSB0ID0ge1xuICAgICAgICByZWY6ICgnZSAtPiB1bml0KSByZWY7XG4gICAgICAgIHJlYWw6ICdlIC0+IHVuaXQ7XG4gICAgfVxuXG4gICAgbGV0IG1ha2UgKGhhbmRsZXI6ICdlIC0+IHVuaXQpOiAnZSB0ID1cbiAgICAgICAgbGV0IHJlZiA9IHJlZiBoYW5kbGVyIGluXG4gICAgICAgIGxldCBmIHJlZiA9XG4gICAgICAgICAgICBmdW4gZSAtPiAoISByZWYpIGVcbiAgICAgICAgaW5cbiAgICAgICAgeyByZWY7IHJlYWwgPSBmIHJlZiB9XG5cblxuICAgIGxldCB1cGRhdGUgKGhhbmRsZXI6ICdlIC0+IHVuaXQpIChhY3R1YWw6ICdlIHQpOiB1bml0ID1cbiAgICAgICAgYWN0dWFsLnJlZiA6PSBoYW5kbGVyXG5cbiAgICBsZXQgZmlyZSAoYWN0dWFsOiAnZSB0KTogJ2UgLT4gdW5pdCA9XG4gICAgICAgIGFjdHVhbC5yZWFsXG5lbmRcblxuXG5cbm1vZHVsZSBBY3R1YWxzIChLZXk6IEZtbGliX3N0ZC5JbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICBtb2R1bGUgTWFwICA9IEZtbGliX3N0ZC5CdHJlZS5NYXAgKEtleSlcbiAgICBtb2R1bGUgRGljdCA9IERpY3Rpb25hcnkuTWFrZSAoS2V5KVxuXG4gICAgdHlwZSAoJ2UsICdhKSB0ID0gKCdlIEFjdHVhbC50ICogJ2EpIE1hcC50IHJlZlxuXG4gICAgbGV0IGVtcHR5ICgpOiAoJ2UsICdhKSB0ID0gcmVmIE1hcC5lbXB0eVxuXG4gICAgbGV0IHNldFxuICAgICAgICAgICAgKG1ha2U6ICd2IC0+ICdlIC0+IHVuaXQpXG4gICAgICAgICAgICAoYWRkOiAgS2V5LnQgLT4gKCdlIC0+IHVuaXQpIC0+ICdhKVxuICAgICAgICAgICAgKGRpY3Q6ICd2IERpY3QudClcbiAgICAgICAgICAgIChtYXA6ICgnZSwgJ2EpIHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIERpY3QuaXRlclxuICAgICAgICAgICAgKGZ1biBrZXkgdiAtPlxuICAgICAgICAgICAgICAgICBhc3NlcnQgKE1hcC5maW5kX29wdCBrZXkgIW1hcCA9IE5vbmUpO1xuICAgICAgICAgICAgICAgICBsZXQgYWN0dWFsID0gQWN0dWFsLm1ha2UgKG1ha2UgdilcbiAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgbGV0IGEgPSBhZGQga2V5IChBY3R1YWwuZmlyZSBhY3R1YWwpIGluXG4gICAgICAgICAgICAgICAgIG1hcCA6PSBNYXAuYWRkIGtleSAoYWN0dWFsLCBhKSAhbWFwXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBkaWN0XG5cbiAgICBsZXQgdXBkYXRlXG4gICAgICAgICAgICAobWFrZTogJ3YgLT4gJ2UgLT4gdW5pdClcbiAgICAgICAgICAgIChhZGQ6ICBLZXkudCAtPiAoJ2UgLT4gdW5pdCkgLT4gJ2EpXG4gICAgICAgICAgICAocmVtb3ZlOiBLZXkudCAtPiAoJ2UgLT4gdW5pdCkgLT4gJ2EgLT4gdW5pdClcbiAgICAgICAgICAgIChkMTogJ3YgRGljdC50KVxuICAgICAgICAgICAgKGQyOiAndiBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiAoJ2UsICdhKSB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBEaWN0LmRpZmZcbiAgICAgICAgICAgIChmdW4ga2V5IHYgLT5cbiAgICAgICAgICAgICAgICAgKCogSGFuZGxlciBmb3IgW2tleV3CoG5ldyBpbiBbZDFdLiAqKVxuICAgICAgICAgICAgICAgICBtYXAgOj1cbiAgICAgICAgICAgICAgICAgICAgIE1hcC51cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWN0dWFsID0gQWN0dWFsLm1ha2UgKG1ha2UgdilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYSA9IGFkZCBrZXkgKEFjdHVhbC5maXJlIGFjdHVhbCkgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgKGFjdHVhbCwgYSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwsIGhhbmRsZXIgaXMgbmV3IGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2QxXS4gKilcbiAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIW1hcFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgKGZ1biBrZXkgdiAtPlxuICAgICAgICAgICAgICAgICAoKiBIYW5kbGVyIGZvciBba2V5XSBuZWVkcyB1cGRhdGUuIEl0IGlzIHByZXNlbnQgaW4gW2QxXSBhbmRcbiAgICAgICAgICAgICAgICAgICAgW2QyXSAqKVxuICAgICAgICAgICAgICAgICBtYXRjaCBNYXAuZmluZF9vcHQga2V5ICFtYXAgd2l0aFxuICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwuIEhhbmRsZXIgaXMgcHJlc2VudCBpbiBbZDFdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFtkMl0uICopXG4gICAgICAgICAgICAgICAgIHwgU29tZSAoYWN0dWFsLCBfKSAtPlxuICAgICAgICAgICAgICAgICAgICAgQWN0dWFsLnVwZGF0ZSAobWFrZSB2KSBhY3R1YWxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIChmdW4ga2V5IC0+XG4gICAgICAgICAgICAgICAgICgqIEhhbmRsZXIgZm9yIFtrZXldIGlzIG5vdCBpbiBbZDFdIGJ1dCBpbiBbZDJdLiBJdCBoYXMgdG8gYmVcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZC4gKilcbiAgICAgICAgICAgICAgICAgbWFwIDo9XG4gICAgICAgICAgICAgICAgICAgICBNYXAudXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbC4gSXQgaXMgaW4gW2QyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZWZvcmUgaXQgaGFzIHRvIGJlIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hcF0uICopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSAoYWN0dWFsLCBhKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGtleSAoQWN0dWFsLmZpcmUgYWN0dWFsKSBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAhbWFwXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBkMVxuICAgICAgICAgICAgZDJcbmVuZFxuXG5cblxuXG5cblxuKCogQSB2aXJ0dWFsIGhhbmRsZXIgaXMgYSBkZWNvZGVyIHdpdGggZmxhZ3MgdG8gc3RvcCBwcm9wYWdhdGlvbiBhbmQgcHJldmVudFxuICAgZGVmYXVsdCBoYW5kbGluZy5cbiopXG5tb2R1bGUgVmlydHVhbCA9XG5zdHJ1Y3RcbiAgICB0eXBlICdtIHQgPSBFdmVudF9mbGFnLnN0b3AgKiBFdmVudF9mbGFnLnByZXZlbnQgKiAnbSBCYXNlLkRlY29kZS50XG5cbiAgICBsZXQgbWFrZV9vbmVcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgICgoRXZlbnRfZmxhZy5TdG9wIHN0b3AsIEV2ZW50X2ZsYWcuUHJldmVudCBwcmV2ZW50LCBkZWNvZGUpOiAnbSB0KVxuICAgICAgICA6IEV2ZW50LnQgLT4gdW5pdFxuICAgICAgICA9XG4gICAgICAgIGZ1biBldmVudCAtPlxuXG4gICAgICAgIGlmIHN0b3AgdGhlblxuICAgICAgICAgICAgRXZlbnQuc3RvcF9wcm9wYWdhdGlvbiBldmVudDtcblxuICAgICAgICBpZiBwcmV2ZW50IHRoZW5cbiAgICAgICAgICAgIEV2ZW50LnByZXZlbnRfZGVmYXVsdCBldmVudDtcblxuICAgICAgICBtYXRjaCBkZWNvZGUgRXZlbnQuKHZhbHVlIGV2ZW50KSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgbGV0IG9wZW4gQmFzZS5NYWluIGluXG4gICAgICAgICAgICBsb2dfc3RyaW5nIFwiQ2Fubm90IGRlY29kZSBldmVudFwiO1xuICAgICAgICAgICAgbG9nX3ZhbHVlIChFdmVudC52YWx1ZSBldmVudClcbiAgICAgICAgfCBTb21lIG0gLT5cbiAgICAgICAgICAgIGRpc3BhdGNoIG1cblxuICAgIGxldCBtYWtlX2xpc3QgKGRpc3BhdGNoOiAnbSAtPiB1bml0KSAobHN0OiAnbSB0IGxpc3QpOiBFdmVudC50IC0+IHVuaXQgPVxuICAgICAgICBmdW4gZXZlbnQgLT5cbiAgICAgICAgTGlzdC4oaXRlclxuICAgICAgICAgICAgICAgICAgKGZ1biB2IC0+IG1ha2Vfb25lIGRpc3BhdGNoIHYgZXZlbnQpXG4gICAgICAgICAgICAgICAgICAocmV2IGxzdCkpXG5cbiAgICBsZXQgbWFwIChmOiAnYSAtPiAnYikgKChzdG9wLCBwcmV2ZW50LCBkZWNvZGUpOiAnYSB0KTogJ2IgdCA9XG4gICAgICAgIHN0b3AsXG4gICAgICAgIHByZXZlbnQsXG4gICAgICAgIEJhc2UuRGVjb2RlLm1hcCBmIGRlY29kZVxuZW5kXG5cblxuXG5cblxuXG5cbigqIFNldCBvZiByZWFsIGhhbmRsZXJzIGhhbmRsaW5nIGphdmFzY3JpcHQgZXZlbnRzIGZpcmVkIG9uIGV2ZW50IHRhcmdldHMuICopXG5tb2R1bGUgRXZlbnRIcyA9XG5zdHJ1Y3RcbiAgICBtb2R1bGUgQWN0dWFscyA9IEFjdHVhbHMgKFN0cmluZylcbiAgICBtb2R1bGUgRGljdCAgICA9IERpY3Rpb25hcnkuTWFrZSAoU3RyaW5nKVxuXG4gICAgdHlwZSB0ID0gKEV2ZW50LnQsIHVuaXQpIEFjdHVhbHMudFxuXG4gICAgbGV0IGVtcHR5ID0gQWN0dWFscy5lbXB0eVxuXG4gICAgbGV0IGFkZCB0YXJnZXQgZXZlbnRfdHlwZSBoYW5kbGVyID1cbiAgICAgICAgRXZlbnRfdGFyZ2V0LmFkZCBldmVudF90eXBlIGhhbmRsZXIgdGFyZ2V0XG5cbiAgICBsZXQgc2V0XG4gICAgICAgICAgICAodGFyZ2V0OiAgIEV2ZW50X3RhcmdldC50KVxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKGRpY3Q6ICAgICAnbSBWaXJ0dWFsLnQgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiAgICAgIHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIEFjdHVhbHMuc2V0XG4gICAgICAgICAgICAoVmlydHVhbC5tYWtlX2xpc3QgZGlzcGF0Y2gpXG4gICAgICAgICAgICAoYWRkIHRhcmdldClcbiAgICAgICAgICAgIGRpY3RcbiAgICAgICAgICAgIG1hcFxuXG4gICAgbGV0IHVwZGF0ZVxuICAgICAgICAgICAgKHRhcmdldDogICBFdmVudF90YXJnZXQudClcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgIChkMTogICAgICAgJ20gVmlydHVhbC50IGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKGQyOiAgICAgICAnbSBWaXJ0dWFsLnQgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiAgICAgIHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIEFjdHVhbHMudXBkYXRlXG4gICAgICAgICAgICAoVmlydHVhbC5tYWtlX2xpc3QgZGlzcGF0Y2gpXG4gICAgICAgICAgICAoYWRkIHRhcmdldClcbiAgICAgICAgICAgIChmdW4gZXZlbnRfdHlwZSBoYW5kbGVyIF8gLT5cbiAgICAgICAgICAgICAgICBFdmVudF90YXJnZXQucmVtb3ZlIGV2ZW50X3R5cGUgaGFuZGxlciB0YXJnZXQpXG4gICAgICAgICAgICBkMVxuICAgICAgICAgICAgZDJcbiAgICAgICAgICAgIG1hcFxuZW5kXG5cblxuXG5cblxuXG5cbm1vZHVsZSBUaW1lcnMgPVxuc3RydWN0XG4gICAgbW9kdWxlIEFjdHVhbHMgPSBBY3R1YWxzIChJbnQpXG4gICAgbW9kdWxlIERpY3QgICAgPSBEaWN0aW9uYXJ5Lk1ha2UgKEludClcblxuICAgIHR5cGUgdCA9IChUaW1lLnQsIFRpbWVyLmludGVydmFsKSBBY3R1YWxzLnRcblxuICAgIGxldCBlbXB0eSA9IEFjdHVhbHMuZW1wdHlcblxuICAgIGxldCBvZl9saXN0XG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAobHN0OiAoVGltZS50IC0+ICdtKSBsaXN0KVxuICAgICAgICA6IFRpbWUudCAtPiB1bml0XG4gICAgICAgID1cbiAgICAgICAgZnVuIHRpbWUgLT5cbiAgICAgICAgTGlzdC4oaXRlciAoZnVuIGYgLT4gZGlzcGF0Y2ggKGYgdGltZSkpIChyZXYgbHN0KSlcblxuICAgIGxldCBtYWtlX3RpbWVyIChtaWxsaXM6IGludCkgKGg6IFRpbWUudCAtPiB1bml0KTogVGltZXIuaW50ZXJ2YWwgPVxuICAgICAgICBUaW1lci5zZXRfaW50ZXJ2YWxcbiAgICAgICAgICAgIChmdW4gKCkgLT4gaCAoRGF0ZS5ub3cgKCkpKVxuICAgICAgICAgICAgbWlsbGlzXG5cbiAgICBsZXQgcmVtb3ZlX3RpbWVyXG4gICAgICAgICAgICAoXzogaW50KSAoXzogVGltZS50IC0+IHVuaXQpICh0aW1lcjogVGltZXIuaW50ZXJ2YWwpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIFRpbWVyLmNsZWFyX2ludGVydmFsIHRpbWVyXG5cbiAgICBsZXQgc2V0XG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAoZGljdDogKFRpbWUudCAtPiAnbSkgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBBY3R1YWxzLnNldFxuICAgICAgICAgICAgKG9mX2xpc3QgZGlzcGF0Y2gpXG4gICAgICAgICAgICBtYWtlX3RpbWVyXG4gICAgICAgICAgICBkaWN0XG4gICAgICAgICAgICBtYXBcblxuXG4gICAgbGV0IHVwZGF0ZVxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKGQxOiAoVGltZS50IC0+ICdtKSBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChkMjogKFRpbWUudCAtPiAnbSkgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBBY3R1YWxzLnVwZGF0ZVxuICAgICAgICAgICAgKG9mX2xpc3QgZGlzcGF0Y2gpXG4gICAgICAgICAgICBtYWtlX3RpbWVyXG4gICAgICAgICAgICByZW1vdmVfdGltZXJcbiAgICAgICAgICAgIGQxXG4gICAgICAgICAgICBkMlxuICAgICAgICAgICAgbWFwXG5lbmRcblxuXG5cbm1vZHVsZSBVcmxfcmVxdWVzdCA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBFdmVudC50IEFjdHVhbC50IG9wdGlvbiByZWZcblxuICAgIGxldCBlbXB0eSAoKTogdCA9XG4gICAgICAgIHJlZiBOb25lXG5cblxuICAgIGxldCB0YXJnZXQgKCk6IEV2ZW50X3RhcmdldC50ID1cbiAgICAgICAgRG9tLldpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKVxuXG4gICAgbGV0IGFkZCAoaDogRXZlbnQudCAtPiB1bml0KTogdW5pdCA9XG4gICAgICAgIEV2ZW50X3RhcmdldC5hZGQgXCJjbGlja1wiIGggKHRhcmdldCAoKSlcblxuICAgIGxldCByZW1vdmUgKGg6IEV2ZW50LnQgLT4gdW5pdCk6IHVuaXQgPVxuICAgICAgICBFdmVudF90YXJnZXQucmVtb3ZlIFwiY2xpY2tcIiBoICh0YXJnZXQgKCkpXG5cblxuICAgIGxldCBkZWNvZGU6IFVybC50IEJhc2UuRGVjb2RlLnQgPVxuICAgICAgICBsZXQgb3BlbiBCYXNlLkRlY29kZSBpblxuICAgICAgICBsZXQqIHRhZyAgPSBmaWVsZCBcInRhcmdldFwiIChmaWVsZCBcInRhZ05hbWVcIiBzdHJpbmcpIGluXG4gICAgICAgIGxldCogaHJlZiA9IGZpZWxkIFwidGFyZ2V0XCIgKGZpZWxkIFwiaHJlZlwiICAgIHN0cmluZykgaW5cbiAgICAgICAgbWF0Y2ggVXJsLnBhcnNlIGhyZWYgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGZhaWxcbiAgICAgICAgfCBTb21lIHVybCAtPlxuICAgICAgICAgICAgaWYgdGFnIDw+IFwiQVwiIHx8IHRhZyA8PiBcImFcIiB8fCBub3QgKFVybC5pc19wYWdlIHVybCkgdGhlblxuICAgICAgICAgICAgICAgIGZhaWxcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsXG5cblxuICAgIGxldCBtYWtlIChkaXNwYXRjaDogJ20gLT4gdW5pdCkgKGY6IFVybC50IC0+ICdtKSAoZXZlbnQ6IEV2ZW50LnQpOiB1bml0ID1cbiAgICAgICAgbWF0Y2ggZGVjb2RlIChFdmVudC52YWx1ZSBldmVudCkgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICgpXG4gICAgICAgIHwgU29tZSB1cmwgLT5cbiAgICAgICAgICAgIEV2ZW50LnByZXZlbnRfZGVmYXVsdCBldmVudDtcbiAgICAgICAgICAgIGRpc3BhdGNoIChmIHVybClcblxuXG4gICAgbGV0IHNldFxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKHZpcnQ6IChVcmwudCAtPiAnbSkgb3B0aW9uKVxuICAgICAgICAgICAgKHJlcTogdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgbWF0Y2ggdmlydCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcmVxIDo9IE5vbmVcbiAgICAgICAgfCBTb21lIGYgLT5cbiAgICAgICAgICAgIGxldCBhY3R1YWwgPSBBY3R1YWwubWFrZSAobWFrZSBkaXNwYXRjaCBmKSBpblxuICAgICAgICAgICAgYWRkIChBY3R1YWwuZmlyZSBhY3R1YWwpO1xuICAgICAgICAgICAgcmVxIDo9IFNvbWUgYWN0dWFsXG5cblxuICAgIGxldCB1cGRhdGVcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgICh2aXJ0MTogKFVybC50IC0+ICdtKSBvcHRpb24pXG4gICAgICAgICAgICAodmlydDI6IChVcmwudCAtPiAnbSkgb3B0aW9uKVxuICAgICAgICAgICAgKHJlcTogdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgbWF0Y2ggdmlydDEsIHZpcnQyLCAhcmVxIHdpdGhcbiAgICAgICAgfCBOb25lLCBOb25lLCBOb25lIC0+XG4gICAgICAgICAgICAoKVxuXG4gICAgICAgIHwgU29tZSBmMSwgTm9uZSwgTm9uZSAtPlxuICAgICAgICAgICAgKCogW2YxXSBpcyBuZXcgaGFuZGxlciwgbm90IHlldCBhIGN1cnJlbnQgaGFuZGxlciAqKVxuICAgICAgICAgICAgbGV0IGFjdHVhbCA9IEFjdHVhbC5tYWtlIChtYWtlIGRpc3BhdGNoIGYxKSBpblxuICAgICAgICAgICAgYWRkIChBY3R1YWwuZmlyZSBhY3R1YWwpO1xuICAgICAgICAgICAgcmVxIDo9IFNvbWUgYWN0dWFsXG5cbiAgICAgICAgfCBTb21lIGYxLCBTb21lIF8sIFNvbWUgYWN0dWFsIC0+XG4gICAgICAgICAgICAoKiBbZjFdIGlzIGhhbmRsZXIgd2hpY2ggaGFzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCBoYW5kbGVyLiAqKVxuICAgICAgICAgICAgbGV0IGhhbmRsZXIgPSBtYWtlIGRpc3BhdGNoIGYxIGluXG4gICAgICAgICAgICBBY3R1YWwudXBkYXRlIGhhbmRsZXIgYWN0dWFsXG5cbiAgICAgICAgfCBOb25lLCBTb21lIF8sIFNvbWUgYWN0dWFsIC0+XG4gICAgICAgICAgICAoKiBObyBuZXcgaGFuZGxlciwgY3VycmVudCBoYW5kbGVyIGhhcyB0byBiZSByZW1vdmVkLiAqKVxuICAgICAgICAgICAgcmVtb3ZlIChBY3R1YWwuZmlyZSBhY3R1YWwpXG5cbiAgICAgICAgfCBfLCBOb25lLCBTb21lIF8gfCBfLCBTb21lIF8sIE5vbmUgLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwsIFt2aXJ0Ml0gYW5kIFshcmVxXSBhcmUgZWl0aGVyIGJvdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBvciBib3RoIHByZXNlbnQuICopXG5lbmRcblxuXG5cblxuXG5cblxuKCpcbiAgICBOb3RlIFtGdW5jdGlvbnMgd2l0aCByZWZlcmVuY2VzXVxuICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG5cbiAgICBUaGUgY29kZSBoYXMgYmVlbiB1bml0IHRlc3RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlLlxuXG4gICAgdHlwZSB0ID0ge1xuICAgICAgICByZWY6ICh1bml0IC0+IGludCkgcmVmO1xuICAgICAgICBiYXNlOiB1bml0IC0+IGludDtcbiAgICB9XG5cbiAgICBsZXQgZjEgKCk6IGludCA9IDFcbiAgICBsZXQgZjIgKCk6IGludCA9IDJcblxuICAgIGxldCBtYWtlIChmOiB1bml0IC0+IGludCk6IHQgPVxuICAgICAgICBsZXQgcmVmID0gcmVmIGYgaW5cbiAgICAgICAgbGV0IGcgcmVmID1cbiAgICAgICAgICAgIGZ1biAoKSAtPiAoISByZWYpICgpXG4gICAgICAgIGluXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZjtcbiAgICAgICAgICAgIGJhc2UgPSBnIHJlZjtcbiAgICAgICAgfVxuXG4gICAgbGV0IHVwZGF0ZSAoZjogdW5pdCAtPiBpbnQpIChoOiB0KTogdW5pdCA9XG4gICAgICAgIGgucmVmIDo9IGZcblxuICAgIGxldCV0ZXN0IF8gPVxuICAgICAgICBsZXQgaCA9IG1ha2UgZjEgaW5cbiAgICAgICAgaC5iYXNlICgpID0gMVxuXG5cbiAgICBsZXQldGVzdCBfID1cbiAgICAgICAgbGV0IGggPSBtYWtlIGYxIGluXG4gICAgICAgIHVwZGF0ZSBmMiBoO1xuICAgICAgICBQcmludGYucHJpbnRmIFwiaC5iYXNlICgpID0gJWRcXG5cIiAoaC5iYXNlICgpKTtcbiAgICAgICAgaC5iYXNlICgpID0gMlxuICAgICopXG4iLCJvcGVuIEZtbGliX2pzLkJhc2VcblxudHlwZSAnbXNnIGhhbmRsZXIgPSAnbXNnIEhhbmRsZXIuVmlydHVhbC50XG5cbnR5cGUgJ21zZyB0ID1cbiAgICB8IFN0eWxlIG9mIHN0cmluZyAqIHN0cmluZ1xuICAgIHwgUHJvcGVydHkgb2Ygc3RyaW5nICogVmFsdWUudFxuICAgIHwgQXR0cmlidXRlIG9mIHN0cmluZyAqIHN0cmluZ1xuICAgIHwgSGFuZGxlciBvZiBzdHJpbmcgKiAnbXNnIGhhbmRsZXJcblxuXG5sZXQgc3R5bGUgKGtleTogc3RyaW5nKSAodmFsdWU6IHN0cmluZyk6ICdhIHQgPVxuICAgIFN0eWxlIChrZXksIHZhbHVlKVxuXG5sZXQgcHJvcGVydHkgKGtleTogc3RyaW5nKSAodmFsdWU6IFZhbHVlLnQpOiAnYSB0ID1cbiAgICBQcm9wZXJ0eSAoa2V5LCB2YWx1ZSlcblxubGV0IGF0dHJpYnV0ZSAoa2V5OiBzdHJpbmcpICh2YWx1ZTogc3RyaW5nKTogJ2EgdCA9XG4gICAgQXR0cmlidXRlIChrZXksIHZhbHVlKVxuXG5sZXQgaGFuZGxlclxuICAgICAgICAoa2V5OiBzdHJpbmcpXG4gICAgICAgIChzdG9wOiBFdmVudF9mbGFnLnN0b3ApXG4gICAgICAgIChwcmV2ZW50OiBFdmVudF9mbGFnLnByZXZlbnQpXG4gICAgICAgIChkZWNvZGU6ICdtc2cgRGVjb2RlLnQpXG4gICAgOiAnYSB0XG4gICAgPVxuICAgIEhhbmRsZXIgKGtleSwgKHN0b3AsIHByZXZlbnQsIGRlY29kZSkpXG4iLCJvcGVuIEZtbGliX2pzLkJhc2VcblxubW9kdWxlIERpY3Rpb25hcnkgPSBEaWN0aW9uYXJ5Lk1ha2UgKFN0cmluZylcblxudHlwZSAnbXNnIGhhbmRsZXJzID0gJ21zZyBIYW5kbGVyLlZpcnR1YWwudCBsaXN0IERpY3Rpb25hcnkudFxuXG5tb2R1bGUgQXR0cmlidXRlcyA9XG5zdHJ1Y3RcbiAgICB0eXBlICdtc2cgdCA9IHtcbiAgICAgICAgc3R5bGVzOiAgIHN0cmluZyBEaWN0aW9uYXJ5LnQ7XG4gICAgICAgIHByb3BzOiAgICBWYWx1ZS50IERpY3Rpb25hcnkudDtcbiAgICAgICAgYXR0cnM6ICAgIHN0cmluZyAgRGljdGlvbmFyeS50O1xuICAgICAgICBoYW5kbGVyczogJ21zZyBoYW5kbGVyc1xuICAgIH1cblxuICAgIGxldCBvZl9saXN0IChsc3Q6ICdtc2cgQXR0cmlidXRlLnQgbGlzdCk6ICdtc2cgdCA9XG4gICAgICAgIGxldCBvcGVuIEF0dHJpYnV0ZSBpblxuICAgICAgICBMaXN0LmZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biBhdHRycyAtPiBmdW5jdGlvblxuICAgICAgICAgICAgICAgICB8IFN0eWxlIChuYW1lLCB2YWx1ZSkgLT5cbiAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzID0gRGljdGlvbmFyeS5hZGQgbmFtZSB2YWx1ZSBhdHRycy5zdHlsZXNcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfCBQcm9wZXJ0eSAobmFtZSwgdmFsdWUpIC0+XG4gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzID0gRGljdGlvbmFyeS5hZGQgbmFtZSB2YWx1ZSBhdHRycy5wcm9wc1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB8IEF0dHJpYnV0ZSAobmFtZSwgdmFsdWUpIC0+XG4gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gRGljdGlvbmFyeS5hZGQgbmFtZSB2YWx1ZSBhdHRycy5hdHRyc1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB8IEhhbmRsZXIgKG5hbWUsIGhhbmRsZXIpIC0+XG4gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeS5zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBbaGFuZGxlcl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbHN0IC0+IGhhbmRsZXIgOjogbHN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuaGFuZGxlcnNcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdHlsZXMgICA9IERpY3Rpb25hcnkuZW1wdHk7XG4gICAgICAgICAgICAgICAgcHJvcHMgICAgPSBEaWN0aW9uYXJ5LmVtcHR5O1xuICAgICAgICAgICAgICAgIGF0dHJzICAgID0gRGljdGlvbmFyeS5lbXB0eTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycyA9IERpY3Rpb25hcnkuZW1wdHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsc3RcbmVuZFxuXG5cblxuXG5cblxuXG5cblxuXG50eXBlICgnbXNnLCAnZWwpIHQwID1cbiAgICAoKiBQdXJlIHZpcnR1YWwgZG9tIGVsZW1lbnQgd2hlcmUgYWxsIGNoaWxkcmVuIGNvbnNpc3Qgb2YgcGFpcnMgb2YgYSB2aXJ0dWFsXG4gICAgICAgZG9tIGFuZCByZWFsIGRvbSBub2RlLlxuICAgICAqKVxuICAgIHwgVGV4dCBvZiBzdHJpbmdcbiAgICB8IE5vZGUgb2Ygc3RyaW5nICAqICdtc2cgQXR0cmlidXRlcy50ICogKCdtc2csICdlbCkgdDEgbGlzdFxuICAgIHwgTm9kZV9ucyBvZiBzdHJpbmcgICogc3RyaW5nICogJ21zZyBBdHRyaWJ1dGVzLnQgKiAoJ21zZywgJ2VsKSB0MSBsaXN0XG4gICAgfCBLZXllZCBvZiBzdHJpbmcgKiAnbXNnIEF0dHJpYnV0ZXMudCAqICgnbXNnLCAnZWwpIHQxIERpY3Rpb25hcnkudFxuXG5cbmFuZCAoJ21zZywgJ2VsKSB0MSA9XG4gICAgKCogUGFpciBvZiBhIHZpcnR1YWwgZG9tIGFuZCBhIGNvcnJlc3BvbmRpbmcgcmVhbCBkb20gKilcbiAgICAoJ21zZywgJ2VsKSB0MCAqICdlbFxuXG5cblxudHlwZSAnbXNnIHQgPVxuICAgICgqIFB1cmUgdmlydHVhbCBkb20gd2l0aG91dCBhbnkgcmVhbCBkb20gYXR0YWNoZWQgdG8gaXQuICopXG4gICAgKCdtc2csIHVuaXQpIHQxXG5cblxuXG5cbigqIENyZWF0ZSBwdXJlIHZpcnR1YWwgZG9tIGVsZW1lbnRzICopXG5cbmxldCB0ZXh0IChzOiBzdHJpbmcpOiAnbXNnIHQgPVxuICAgIFRleHQgcywgKClcblxuXG5sZXQgbm9kZVxuICAgICAgICAodGFnOiBzdHJpbmcpXG4gICAgICAgIChhdHRyczogJ21zZyBBdHRyaWJ1dGUudCBsaXN0KVxuICAgICAgICAobHN0OiAnbXNnIHQgbGlzdClcbiAgICA6ICdtc2cgdFxuICAgID1cbiAgICBOb2RlICh0YWcsIEF0dHJpYnV0ZXMub2ZfbGlzdCBhdHRycywgbHN0KSwgKClcblxuXG5sZXQgbm9kZV9uc1xuICAgICAgICAobmFtZXNwYWNlOiBzdHJpbmcpXG4gICAgICAgICh0YWc6IHN0cmluZylcbiAgICAgICAgKGF0dHJzOiAnbXNnIEF0dHJpYnV0ZS50IGxpc3QpXG4gICAgICAgIChsc3Q6ICdtc2cgdCBsaXN0KVxuICAgIDogJ21zZyB0XG4gICAgPVxuICAgIE5vZGVfbnMgKG5hbWVzcGFjZSwgdGFnLCBBdHRyaWJ1dGVzLm9mX2xpc3QgYXR0cnMsIGxzdCksICgpXG5cblxuXG5sZXQga2V5ZWRcbiAgICAgICAgKHRhZzogc3RyaW5nKVxuICAgICAgICAoYXR0cnM6ICdtc2cgQXR0cmlidXRlLnQgbGlzdClcbiAgICAgICAgKGxzdDogKHN0cmluZyAqICdtc2cgdCkgbGlzdClcbiAgICA6ICdtc2cgdFxuICAgID1cbiAgICBLZXllZCAodGFnLCBBdHRyaWJ1dGVzLm9mX2xpc3QgYXR0cnMsIERpY3Rpb25hcnkub2ZfbGlzdCBsc3QpLCAoKVxuXG5cblxuXG4oKlxuICAgIE1ha2UgYW5kIHVwZGF0ZSByZWFsIGRvbSBmcm9tIGEgdmlydHVhbCBkb21cbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4qKVxuXG5cbmxldCBlbGVtZW50OiAoJ21zZywgJ2VsKSB0MSAtPiAnZWwgPVxuICAgIHNuZFxuXG5cbnR5cGUgKCdtc2csICdlbCkgb3BlcmF0aW9ucyA9IHtcbiAgICBtYWtlX3RleHQ6ICAgICBzdHJpbmcgLT4gJ2VsO1xuICAgIG1ha2VfZWxlbWVudDogIHN0cmluZyAtPiAnZWwgbGlzdCAtPiAnZWw7XG4gICAgbWFrZV9lbGVtZW50X25zOiAgc3RyaW5nIC0+IHN0cmluZyAtPiAnZWwgbGlzdCAtPiAnZWw7XG5cbiAgICBhZGRfY2hpbGQ6ICAgICAnZWwgLT4gJ2VsIC0+IHVuaXQ7XG4gICAgcmVtb3ZlX2NoaWxkOiAgJ2VsIC0+ICdlbCAtPiB1bml0O1xuICAgIHJlcGxhY2VfY2hpbGQ6ICdlbCAtPiAnZWwgLT4gJ2VsIC0+IHVuaXQ7XG4gICAgcmVtb3ZlX2NoaWxkcmVuOiAnZWwgLT4gdW5pdDtcblxuICAgIHNldF90ZXh0OiAnZWwgLT4gc3RyaW5nIC0+IHVuaXQ7XG5cbiAgICBzZXRfc3R5bGU6ICAgICAnZWwgLT4gc3RyaW5nIC0+IHN0cmluZyAtPiB1bml0O1xuICAgIHNldF9hdHRyaWJ1dGU6ICdlbCAtPiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQ7XG4gICAgc2V0X3Byb3BlcnR5OiAgJ2VsIC0+IHN0cmluZyAtPiBWYWx1ZS50IC0+IHVuaXQ7XG5cbiAgICByZW1vdmVfc3R5bGU6ICAgICAnZWwgLT4gc3RyaW5nIC0+IHVuaXQ7XG4gICAgcmVtb3ZlX2F0dHJpYnV0ZTogJ2VsIC0+IHN0cmluZyAtPiB1bml0O1xuICAgIHJlbW92ZV9wcm9wZXJ0eTogICdlbCAtPiBzdHJpbmcgLT4gdW5pdDtcblxuICAgIHNldF9oYW5kbGVyczogICdlbCAtPiAnbXNnIGhhbmRsZXJzIC0+IHVuaXQ7XG4gICAgdXBkYXRlX2hhbmRsZXJzOiAgJ2VsIC0+ICdtc2cgaGFuZGxlcnMgLT4gJ21zZyBoYW5kbGVycyAtPiB1bml0O1xufVxuXG5cbmxldCBhZGRfYXR0cmlidXRlc1xuICAgICAgICAob3BzOiAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAoYXR0cnM6ICdtc2cgQXR0cmlidXRlcy50KVxuICAgICAgICAoZWw6ICdlbClcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgRGljdGlvbmFyeS4oXG4gICAgICAgIGl0ZXIgKG9wcy5zZXRfc3R5bGUgZWwpICAgICBhdHRycy5zdHlsZXM7XG4gICAgICAgIGl0ZXIgKG9wcy5zZXRfYXR0cmlidXRlIGVsKSBhdHRycy5hdHRycztcbiAgICAgICAgaXRlciAob3BzLnNldF9wcm9wZXJ0eSBlbCkgIGF0dHJzLnByb3BzKTtcbiAgICBvcHMuc2V0X2hhbmRsZXJzIGVsIGF0dHJzLmhhbmRsZXJzXG5cblxuXG5cbmxldCBtYWtlXG4gICAgICAgIChvcHM6ICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgICh2ZG9tOiAnbXNnIHQpXG4gICAgOiAoJ21zZywgJ2VsKSB0MVxuICAgID1cbiAgICBsZXQgcmVjIG1ha2UgdmRvbSA9XG4gICAgICAgIG1hdGNoIHZkb20gd2l0aFxuICAgICAgICB8IFRleHQgcywgKCkgLT5cbiAgICAgICAgICAgIFRleHQgcywgb3BzLm1ha2VfdGV4dCBzXG5cbiAgICAgICAgfCBOb2RlICh0YWcsIGF0dHJzLCBsc3QpLCAoKSAtPlxuICAgICAgICAgICAgbGV0IGNvbWJpbmVkX2NoaWxkcmVuLCByZWFsX2NoaWxkcmVuID1cbiAgICAgICAgICAgICAgICBtYWtlX2NoaWxkcmVuIGxzdFxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBvcHMubWFrZV9lbGVtZW50IHRhZyByZWFsX2NoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgYWRkX2F0dHJpYnV0ZXMgb3BzIGF0dHJzIHBhcmVudDtcbiAgICAgICAgICAgIE5vZGUgKHRhZywgYXR0cnMsIGNvbWJpbmVkX2NoaWxkcmVuKSwgcGFyZW50XG5cbiAgICAgICAgfCBOb2RlX25zIChuYW1lc3BhY2UsIHRhZywgYXR0cnMsIGxzdCksICgpIC0+XG4gICAgICAgICAgICBsZXQgY29tYmluZWRfY2hpbGRyZW4sIHJlYWxfY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgIG1ha2VfY2hpbGRyZW4gbHN0XG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG9wcy5tYWtlX2VsZW1lbnRfbnMgbmFtZXNwYWNlIHRhZyByZWFsX2NoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgYWRkX2F0dHJpYnV0ZXMgb3BzIGF0dHJzIHBhcmVudDtcbiAgICAgICAgICAgIE5vZGVfbnMgKG5hbWVzcGFjZSwgdGFnLCBhdHRycywgY29tYmluZWRfY2hpbGRyZW4pLCBwYXJlbnRcblxuICAgICAgICB8IEtleWVkICh0YWcsIGF0dHJzLCBfKSwgKCkgLT5cbiAgICAgICAgICAgIGxldCBjb21iaW5lZF9jaGlsZHJlbiwgcmVhbF9jaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG9wcy5tYWtlX2VsZW1lbnQgdGFnIHJlYWxfY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBhZGRfYXR0cmlidXRlcyBvcHMgYXR0cnMgcGFyZW50O1xuICAgICAgICAgICAgS2V5ZWQgKHRhZywgYXR0cnMsIGNvbWJpbmVkX2NoaWxkcmVuKSwgcGFyZW50XG5cblxuICAgIGFuZCBtYWtlX2NoaWxkcmVuIChsc3Q6ICdtc2cgdCBsaXN0KTogKCdtc2csICdlbCkgdDEgbGlzdCAqICdlbCBsaXN0ID1cbiAgICAgICAgbWF0Y2ggbHN0IHdpdGhcbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgW10sIFtdXG4gICAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgICAgIGxldCBfLCBoZDIgYXMgaGQgPSBtYWtlIGhkXG4gICAgICAgICAgICBhbmQgdGwxLCB0bDIgPSBtYWtlX2NoaWxkcmVuIHRsIGluXG4gICAgICAgICAgICBoZCA6OiB0bDEsIGhkMiA6OiB0bDJcbiAgICBpblxuICAgIG1ha2UgdmRvbVxuXG5cblxuXG5sZXQgdXBkYXRlX2F0dHJpYnV0ZXNcbiAgICAgICAgKG9wczogICAgKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKHBhcjogICAgJ2VsKVxuICAgICAgICAoYXR0cnMxOiAnbXNnIEF0dHJpYnV0ZXMudClcbiAgICAgICAgKGF0dHJzMjogJ21zZyBBdHRyaWJ1dGVzLnQpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIGxldCBvcGVuIERpY3Rpb25hcnkgaW5cbiAgICBsZXQgc2V0ID0gb3BzLnNldF9zdHlsZSBwYXIgaW5cbiAgICBkaWZmXG4gICAgICAgIHNldCBzZXQgKG9wcy5yZW1vdmVfc3R5bGUgcGFyKVxuICAgICAgICBhdHRyczEuc3R5bGVzIGF0dHJzMi5zdHlsZXM7XG5cbiAgICBsZXQgc2V0ID0gb3BzLnNldF9hdHRyaWJ1dGUgcGFyIGluXG4gICAgZGlmZlxuICAgICAgICBzZXQgc2V0IChvcHMucmVtb3ZlX2F0dHJpYnV0ZSBwYXIpXG4gICAgICAgIGF0dHJzMS5hdHRycyBhdHRyczIuYXR0cnM7XG5cbiAgICBsZXQgc2V0ID0gb3BzLnNldF9wcm9wZXJ0eSBwYXIgaW5cbiAgICBkaWZmXG4gICAgICAgIHNldCBzZXQgKG9wcy5yZW1vdmVfcHJvcGVydHkgcGFyKVxuICAgICAgICBhdHRyczEucHJvcHMgYXR0cnMyLnByb3BzO1xuXG4gICAgb3BzLnVwZGF0ZV9oYW5kbGVycyBwYXIgYXR0cnMxLmhhbmRsZXJzIGF0dHJzMi5oYW5kbGVyc1xuXG5cblxubGV0IHJlYyB1cGRhdGVcbiAgICAgICAgKG9wczogKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKHZkb206ICdtc2cgdClcbiAgICAgICAgKGRvbTogKCdtc2csICdlbCkgdDEpXG4gICAgOiAoJ21zZywgJ2VsKSB0MSAqIGJvb2xcbiAgICA9XG4gICAgbWF0Y2ggdmRvbSwgZG9tIHdpdGhcbiAgICB8IChUZXh0IHMxLCAoKSksIChUZXh0IHMyLCBlbCkgLT5cblxuICAgICAgICBpZiBzMSA9IHMyIHRoZW5cbiAgICAgICAgICAgIGRvbSwgZmFsc2VcbiAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgb3BzLnNldF90ZXh0IGVsIHMxO1xuICAgICAgICAgICAgKFRleHQgczEsIGVsKSwgZmFsc2VcbiAgICAgICAgZW5kXG5cbiAgICB8IChOb2RlICh0YWcxLCBhdHRyczEsIGxzdDEpLCAoKSksXG4gICAgICAoTm9kZSAodGFnMiwgYXR0cnMyLCBsc3QyKSwgcGFyKSB3aGVuIHRhZzEgPSB0YWcyIC0+XG5cbiAgICAgICAgdXBkYXRlX2F0dHJpYnV0ZXMgb3BzIHBhciBhdHRyczEgYXR0cnMyO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBMaXN0LnJldiAodXBkYXRlX2NoaWxkcmVuIG9wcyBwYXIgbHN0MSBsc3QyIFtdKVxuICAgICAgICBpblxuICAgICAgICAoTm9kZSAodGFnMiwgYXR0cnMxLCBjaGlsZHJlbiksIHBhciksIGZhbHNlXG5cbiAgICB8IChOb2RlX25zIChuczEsIHRhZzEsIGF0dHJzMSwgbHN0MSksICgpKSxcbiAgICAgIChOb2RlX25zIChuczIsIHRhZzIsIGF0dHJzMiwgbHN0MiksIHBhcikgd2hlbiB0YWcxID0gdGFnMiAmJiBuczEgPSBuczIgLT5cblxuICAgICAgICB1cGRhdGVfYXR0cmlidXRlcyBvcHMgcGFyIGF0dHJzMSBhdHRyczI7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IExpc3QucmV2ICh1cGRhdGVfY2hpbGRyZW4gb3BzIHBhciBsc3QxIGxzdDIgW10pXG4gICAgICAgIGluXG4gICAgICAgIChOb2RlX25zIChuczIsIHRhZzIsIGF0dHJzMSwgY2hpbGRyZW4pLCBwYXIpLCBmYWxzZVxuXG4gICAgfCAoS2V5ZWQgKHRhZzEsIGF0dHJzMSwgZDEpLCAoKSksXG4gICAgICAoS2V5ZWQgKHRhZzIsIGF0dHJzMiwgZDIpLCBwYXIpIHdoZW4gdGFnMSA9IHRhZzIgLT5cblxuICAgICAgICB1cGRhdGVfYXR0cmlidXRlcyBvcHMgcGFyIGF0dHJzMSBhdHRyczI7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHVwZGF0ZV9rZXllZCBvcHMgcGFyIGQxIGQyXG4gICAgICAgIGluXG4gICAgICAgIChLZXllZCAodGFnMiwgYXR0cnMxLCBjaGlsZHJlbiksIHBhciksIGZhbHNlXG5cbiAgICB8IF8sIF8gLT5cblxuICAgICAgICBtYWtlIG9wcyB2ZG9tLCB0cnVlXG5cblxuYW5kIHVwZGF0ZV9rZXllZFxuICAgICAgICAob3BzOiAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAocGFyOiAnZWwpXG4gICAgICAgIChkMTogJ21zZyB0IERpY3Rpb25hcnkudClcbiAgICAgICAgKGQyOiAoJ21zZywgJ2VsKSB0MSBEaWN0aW9uYXJ5LnQpXG4gICAgOiAoJ21zZywgJ2VsKSB0MSBEaWN0aW9uYXJ5LnRcbiAgICA9XG4gICAgb3BzLnJlbW92ZV9jaGlsZHJlbiBwYXI7XG4gICAgbGV0IGQgPSByZWYgRGljdGlvbmFyeS5lbXB0eVxuICAgIGluXG4gICAgRGljdGlvbmFyeS5pdGVyXG4gICAgICAgIChmdW4ga2V5IHZkb20gLT5cbiAgICAgICAgICAgICBtYXRjaCBEaWN0aW9uYXJ5LmZpbmRfb3B0IGtleSBkMiB3aXRoXG4gICAgICAgICAgICAgfCBOb25lIC0+XG5cbiAgICAgICAgICAgICAgICAgbGV0IChfLCBlbCkgYXMgZG9tID0gbWFrZSBvcHMgdmRvbSBpblxuICAgICAgICAgICAgICAgICBvcHMuYWRkX2NoaWxkIGVsIHBhcjtcbiAgICAgICAgICAgICAgICAgZCA6PSBEaWN0aW9uYXJ5LmFkZCBrZXkgZG9tICFkO1xuXG4gICAgICAgICAgICAgfCBTb21lIGRvbSAtPlxuXG4gICAgICAgICAgICAgICAgIGxldCAoKF8sIGVsKSBhcyBkb20pLCBfID0gdXBkYXRlIG9wcyB2ZG9tIGRvbSBpblxuICAgICAgICAgICAgICAgICBvcHMuYWRkX2NoaWxkIGVsIHBhcjtcbiAgICAgICAgICAgICAgICAgZCA6PSBEaWN0aW9uYXJ5LmFkZCBrZXkgZG9tICFkO1xuICAgICAgICApXG4gICAgICAgIGQxO1xuICAgICFkXG5cblxuXG5hbmQgdXBkYXRlX2NoaWxkcmVuXG4gICAgICAgIChvcHM6ICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgIChwYXI6ICdlbClcbiAgICAgICAgKGxzdDE6ICdtc2cgdCBsaXN0KVxuICAgICAgICAobHN0MjogKCdtc2csICdlbCkgdDEgbGlzdClcbiAgICAgICAgKG5sc3QyOiAoJ21zZywgJ2VsKSB0MSBsaXN0KVxuICAgIDogKCdtc2csICdlbCkgdDEgbGlzdFxuICAgID1cbiAgICBtYXRjaCBsc3QxLCBsc3QyIHdpdGhcbiAgICB8IFtdLCBbXSAtPlxuICAgICAgICBubHN0MlxuXG4gICAgfCBbXSwgKF8sIGhkKSA6OiB0bCAtPlxuICAgICAgICAoKiBPbGQgZG9tIGhhcyB0b28gbWFueSBjaGlsZHJlbiAqKVxuICAgICAgICBvcHMucmVtb3ZlX2NoaWxkIGhkIHBhcjtcbiAgICAgICAgdXBkYXRlX2NoaWxkcmVuIG9wcyBwYXIgW10gdGwgbmxzdDJcblxuICAgIHwgaGQxIDo6IHRsMSwgW10gLT5cbiAgICAgICAgKCogTmV3IHZkb20gaGFzIG1vcmUgY2hpbGRyZW4gdGhhbiB0aGUgb2xkIGRvbSAqKVxuICAgICAgICBsZXQgKF8sIGhkMTEpIGFzIGhkMSA9IG1ha2Ugb3BzIGhkMSBpblxuICAgICAgICBvcHMuYWRkX2NoaWxkIGhkMTEgcGFyO1xuICAgICAgICB1cGRhdGVfY2hpbGRyZW4gb3BzIHBhciB0bDEgW10gKGhkMSA6OiBubHN0MilcblxuICAgIHwgaGQxIDo6IHRsMSwgICAoKF8sIG9sZF9lbCkgYXMgaGQyKSA6OiB0bDIgLT5cbiAgICAgICAgbGV0IChfLCBuZXdfZWwpIGFzIGhkMiAsIGNyZWF0ZWQgPSB1cGRhdGUgb3BzIGhkMSBoZDIgaW5cbiAgICAgICAgaWYgY3JlYXRlZCB0aGVuXG4gICAgICAgICAgICBvcHMucmVwbGFjZV9jaGlsZCBvbGRfZWwgbmV3X2VsIHBhcjtcbiAgICAgICAgdXBkYXRlX2NoaWxkcmVuIG9wcyBwYXIgdGwxIHRsMiAoaGQyIDo6IG5sc3QyKVxuIiwib3BlbiBGbWxpYl9qcy5CYXNlLk1haW5cblxubGV0IGF0dGVtcHQgKHN0cjogc3RyaW5nKSAoZjogdW5pdCAtPiAnYSkgKGNsZWFudXA6IHVuaXQgLT4gdW5pdCk6ICdhID1cbiAgICB0cnlcbiAgICAgICAgZiAoKVxuICAgIHdpdGhcbiAgICB8IEFzc2VydF9mYWlsdXJlIChmaWxlLCBsaW5lLCBjb2wpIC0+XG4gICAgICAgIGxldCBtc2cgPVxuICAgICAgICAgICAgU3RyaW5nLmNvbmNhdFxuICAgICAgICAgICAgICAgIFwiXCJcbiAgICAgICAgICAgICAgICBbXCJhc3NlcnRpb24gZmFpbGVkIGZpbGU6IFwiXG4gICAgICAgICAgICAgICAgOyBmaWxlXG4gICAgICAgICAgICAgICAgOyBcIiBsaW5lOiBcIjsgc3RyaW5nX29mX2ludCBsaW5lXG4gICAgICAgICAgICAgICAgOyBcIiBjb2w6IFwiOyAgIHN0cmluZ19vZl9pbnQgY29sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICBpblxuICAgICAgICBjbGVhbnVwICgpO1xuICAgICAgICBsb2dfc3RyaW5nIHN0cjtcbiAgICAgICAgbG9nX3N0cmluZyBtc2c7XG4gICAgICAgIHJhaXNlX2pzIHN0clxuXG4gICAgfCBleG4gLT5cbiAgICAgICAgY2xlYW51cCAoKTtcbiAgICAgICAgbG9nX3N0cmluZyBzdHI7XG4gICAgICAgIG1hdGNoIG9mX2V4Y2VwdGlvbiBleG4gd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGxvZ19zdHJpbmcgXCJVbmNhdWdodCBvY2FtbCBleGNlcHRpb25cIjtcbiAgICAgICAgICAgIHJhaXNlIGV4blxuICAgICAgICB8IFNvbWUganNfZXJyb3IgLT5cbiAgICAgICAgICAgIGxvZ19zdHJpbmcgXCJVbmNhdWdodCBqYXZhc2NyaXB0IGV4Y2VwdGlvblwiO1xuICAgICAgICAgICAgcmFpc2VfanNfZXJyb3IganNfZXJyb3JcbiIsIm1vZHVsZSBSID0gU3RkbGliLlJhbmRvbVxuXG50eXBlICdhIHQgPSBSLlN0YXRlLnQgLT4gJ2FcblxuXG5sZXQgcnVuIChyYW5kb206ICdhIHQpOiAnYSA9XG4gICAgcmFuZG9tIChSLlN0YXRlLm1ha2Vfc2VsZl9pbml0ICgpKVxuXG5cbmxldCBjb25zdGFudCAoYTogJ2EpOiAnYSB0ID1cbiAgICBmdW4gXyAtPiBhXG5cbmxldCAoPj49KSAobTogJ2EgdCkgKGY6ICdhIC0+ICdiIHQpOiAnYiB0ID1cbiAgICBmdW4gc3RhdGUgLT4gZiAobSBzdGF0ZSkgc3RhdGUgKCogc3RhdGUgaXMgbXV0YWJsZS4gKilcblxubGV0ICggbGV0KiApID0gKD4+PSlcblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYikgKG06ICdhIHQpOiAnYiB0ID1cbiAgICBsZXQqIGEgPSBtIGluXG4gICAgY29uc3RhbnQgKGYgYSlcblxuXG5sZXQgaW50IChib3VuZDogaW50KTogaW50IHQgPVxuICAgIGZ1biBzdGF0ZSAtPlxuICAgIGFzc2VydCAoMCA8IGJvdW5kKTtcbiAgICBSLlN0YXRlLmludCBzdGF0ZSBib3VuZFxuXG5cbmxldCBmbG9hdCAoYm91bmQ6IGZsb2F0KTogZmxvYXQgdCA9XG4gICAgZnVuIHN0YXRlIC0+XG4gICAgYXNzZXJ0ICgwLjAgPD0gYm91bmQpO1xuICAgIFIuU3RhdGUuZmxvYXQgc3RhdGUgYm91bmRcblxuXG5sZXQgYm9vbDogYm9vbCB0ID1cbiAgICBSLlN0YXRlLmJvb2xcblxuXG5sZXQgY2hvb3NlIChsc3Q6ICdhIGxpc3QpOiAnYSB0ID1cbiAgICBsZXQgYXJyID0gQXJyYXkub2ZfbGlzdCBsc3QgaW5cbiAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIGFyciBpblxuICAgIGxldCogaSA9IGludCBsZW4gaW5cbiAgICBhc3NlcnQgKGkgPCBsZW4pO1xuICAgIGNvbnN0YW50IGFyci4oaSlcbiIsIm9wZW4gRm1saWJfanNcblxuXG50eXBlIGVtcHR5ID0gW11cblxudHlwZSBodHRwX2Vycm9yID0gW2BIdHRwX3N0YXR1cyBvZiBpbnQgfCBgSHR0cF9ub19qc29uIHwgYEh0dHBfZGVjb2RlXVxuXG50eXBlIG5vdF9mb3VuZCAgPSBbYE5vdF9mb3VuZF1cblxubGV0IGFic3VyZCAoXzogZW1wdHkpOiAnYSA9XG4gICAgYXNzZXJ0IGZhbHNlICgqIE9rISBXaWxsIG5ldmVyIGJlIGNhbGxlZCwgYmVjYXVzZSBhbiBvYmplY3Qgb2YgdHlwZSBbZW1wdHldXG4gICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4gKilcblxuXG5cblxuXG50eXBlICgnYSwgKydlKSB0ID1cbiAgICAoQmFzZS5WYWx1ZS50IC0+IHVuaXQpIC0+ICgoJ2EsICdlKSByZXN1bHQgLT4gdW5pdCkgLT4gdW5pdFxuXG5cblxubGV0IGNvbnRpbnVlIChrOiAnYSAtPiB1bml0KSAoYTogJ2EpOiB1bml0ID1cbiAgICBBc3NlcnRfZmFpbHVyZS5hdHRlbXB0XG4gICAgICAgIFwiRXhjZXB0aW9uIGluIHRhc2sgZXhlY3V0aW9uXCJcbiAgICAgICAgKGZ1biAoKSAtPiBrIGEpXG4gICAgICAgIChmdW4gKCkgLT4gKCkpXG5cblxubGV0IHJ1biAodGFzazogKCdhLCBlbXB0eSkgdCkgKHBvc3Q6IEJhc2UuVmFsdWUudCAtPiB1bml0KSAoazogJ2EgLT4gdW5pdCk6IHVuaXQgPVxuICAgIHRhc2tcbiAgICAgICAgcG9zdFxuICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgIHwgT2sgYSAtPiBjb250aW51ZSBrIGFcbiAgICAgICAgICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICAgICAgICAgIGFic3VyZCBlXG4gICAgICAgIClcblxuXG5sZXQgc3VjY2VlZCAoYTogJ2EpOiAoJ2EsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayAoT2sgYSlcblxuXG5sZXQgcmV0dXJuOiAnYSAtPiAoJ2EsICdlKSB0ID1cbiAgICBzdWNjZWVkXG5cblxubGV0IGZhaWwgKGU6ICdlKTogKCdhLCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgKEVycm9yIGUpXG5cblxuXG5sZXQgcmVzdWx0IChyOiAoJ2EsICdlKSByZXN1bHQpOiAoJ2EsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayByXG5cblxuXG5sZXQgKD4+PSkgKG06ICgnYSwgJ2UpIHQpIChmOiAnYSAtPiAoJ2IsICdlKSB0KTogKCdiLCAnZSkgdCA9XG4gICAgZnVuIHBvc3QgayAtPlxuICAgIG1cbiAgICAgICAgcG9zdFxuICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgIHwgT2sgYSAtPlxuICAgICAgICAgICAgICAgIGYgYSBwb3N0IGtcbiAgICAgICAgICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIGUpKVxuXG5sZXQgKCBsZXQqICkgPSAoPj49KVxuXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChtOiAoJ2EsICdlKSB0KTogKCdiLCAnZSkgdCA9XG4gICAgbGV0KiBhID0gbSBpblxuICAgIHJldHVybiAoZiBhKVxuXG5cbmxldCBtYWtlX3N1Y2NlZWQgKGY6ICgnYSwgJ2UpIHJlc3VsdCAtPiAnYikgKG06ICgnYSwgJ2UpIHQpOiAoJ2IsIGVtcHR5KSB0ID1cbiAgICBmdW4gcG9zdCBrIC0+XG4gICAgbSBwb3N0IChmdW4gcmVzIC0+IGNvbnRpbnVlIGsgKE9rIChmIHJlcykpKVxuXG5cblxubGV0IGxvZ19zdHJpbmcgKHM6IHN0cmluZyk6ICh1bml0LCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIEJhc2UuTWFpbi5sb2dfc3RyaW5nIHM7XG4gICAgY29udGludWUgayAoT2sgKCkpXG5cblxuXG5sZXQgbG9nX3ZhbHVlICh2OiBCYXNlLlZhbHVlLnQpOiAodW5pdCwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBCYXNlLk1haW4ubG9nX3ZhbHVlIHY7XG4gICAgY29udGludWUgayAoT2sgKCkpXG5cblxuXG5sZXQgc2xlZXAgKG1zOiBpbnQpIChhOiAnYSkgOiAoJ2EsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgaWdub3JlIChcbiAgICAgICAgVGltZXIuc2V0XG4gICAgICAgICAgICAoZnVuICgpIC0+IGNvbnRpbnVlIGsgKE9rIGEpKVxuICAgICAgICAgICAgbXNcbiAgICApXG5cblxubGV0IG5leHRfdGljayAoYTogJ2EpOiAoJ2EsICdlKSB0ID1cbiAgICBzbGVlcCAwIGFcblxuXG5cbmxldCBzZW5kX3RvX2phdmFzY3JpcHQgKHY6IEJhc2UuVmFsdWUudCk6ICh1bml0LCAnZSkgdCA9XG4gICAgZnVuIHBvc3QgayAtPlxuICAgIHBvc3QgdjtcbiAgICBjb250aW51ZSBrIChPayAoKSlcblxuXG5cbmxldCBmb2N1cyAoaWQ6IHN0cmluZyk6ICh1bml0LCBub3RfZm91bmQpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBtYXRjaCBEb20uKERvY3VtZW50LmZpbmQgaWQgV2luZG93Lihkb2N1bWVudCAoZ2V0ICgpKSkpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgayAoRXJyb3IgYE5vdF9mb3VuZClcbiAgICB8IFNvbWUgZWwgLT5cbiAgICAgICAgRG9tLkVsZW1lbnQuZm9jdXMgZWw7XG4gICAgICAgIGNvbnRpbnVlIGsgKE9rICgpKVxuXG5cbmxldCBibHVyIChpZDogc3RyaW5nKTogKHVuaXQsIG5vdF9mb3VuZCkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIG1hdGNoIERvbS4oRG9jdW1lbnQuZmluZCBpZCBXaW5kb3cuKGRvY3VtZW50IChnZXQgKCkpKSkgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBjb250aW51ZSBrIChFcnJvciBgTm90X2ZvdW5kKVxuICAgIHwgU29tZSBlbCAtPlxuICAgICAgICBEb20uRWxlbWVudC5ibHVyIGVsO1xuICAgICAgICBjb250aW51ZSBrIChPayAoKSlcblxuXG5cblxubGV0IHJhbmRvbSAocmFuZDogJ2EgUmFuZG9tLnQpOiAoJ2EsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayAoT2sgKFJhbmRvbS5ydW4gcmFuZCkpXG5cblxuXG5sZXQgaHR0cF90ZXh0XG4gICAgICAgIChtZXRoOiBzdHJpbmcpXG4gICAgICAgICh1cmw6IHN0cmluZylcbiAgICAgICAgKGhlYWRlcnM6IChzdHJpbmcgKiBzdHJpbmcpIGxpc3QpXG4gICAgICAgIChib2R5OiBzdHJpbmcpXG4gICAgOiAoc3RyaW5nLCBodHRwX2Vycm9yKSB0XG4gICAgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBsZXQgcmVxID0gSHR0cF9yZXF1ZXN0Lm1ha2UgbWV0aCB1cmwgaGVhZGVycyBib2R5IGluXG4gICAgbGV0IGhhbmRsZXIgXyA9XG4gICAgICAgIGFzc2VydCAoSHR0cF9yZXF1ZXN0LnJlYWR5X3N0YXRlIHJlcSA9IDQpO1xuICAgICAgICBsZXQgc3RhdHVzID0gSHR0cF9yZXF1ZXN0LnN0YXR1cyByZXEgaW5cbiAgICAgICAgaWYgc3RhdHVzIDw+IDIwMCB0aGVuICgqIG5vdCBvayAqKVxuICAgICAgICAgICAgY29udGludWUgayAoRXJyb3IgKGBIdHRwX3N0YXR1cyBzdGF0dXMpKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb250aW51ZSBrIChPayAoSHR0cF9yZXF1ZXN0LnJlc3BvbnNlX3RleHRfc3RyaW5nIHJlcSkpXG4gICAgaW5cbiAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgIFwibG9hZGVuZFwiXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICAgKEh0dHBfcmVxdWVzdC5ldmVudF90YXJnZXQgcmVxKVxuXG5cbmxldCBodHRwX2pzb25cbiAgICAgICAgKG1ldGg6IHN0cmluZylcbiAgICAgICAgKHVybDogc3RyaW5nKVxuICAgICAgICAoaGVhZGVyczogKHN0cmluZyAqIHN0cmluZykgbGlzdClcbiAgICAgICAgKGJvZHk6IHN0cmluZylcbiAgICAgICAgKGRlY29kZTogJ2EgQmFzZS5EZWNvZGUudClcbiAgICA6ICgnYSwgaHR0cF9lcnJvcikgdFxuICAgID1cbiAgICBmdW4gXyBrIC0+XG4gICAgbGV0IHJlcSA9IEh0dHBfcmVxdWVzdC5tYWtlIG1ldGggdXJsIGhlYWRlcnMgYm9keSBpblxuICAgIGxldCBoYW5kbGVyIF8gPVxuICAgICAgICBhc3NlcnQgKEh0dHBfcmVxdWVzdC5yZWFkeV9zdGF0ZSByZXEgPSA0KTtcbiAgICAgICAgbGV0IHN0YXR1cyA9IEh0dHBfcmVxdWVzdC5zdGF0dXMgcmVxIGluXG4gICAgICAgIGlmIHN0YXR1cyA8PiAyMDAgdGhlbiAoKiBub3Qgb2sgKilcbiAgICAgICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIChgSHR0cF9zdGF0dXMgc3RhdHVzKSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF0Y2hcbiAgICAgICAgICAgICAgICBCYXNlLlZhbHVlLnBhcnNlIChIdHRwX3JlcXVlc3QucmVzcG9uc2VfdGV4dF92YWx1ZSByZXEpXG4gICAgICAgICAgICB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBjb250aW51ZSBrIChFcnJvciBgSHR0cF9ub19qc29uKVxuICAgICAgICAgICAgfCBTb21lIHYgLT5cbiAgICAgICAgICAgICAgICBtYXRjaCBkZWNvZGUgdiB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIGBIdHRwX2RlY29kZSlcbiAgICAgICAgICAgICAgICB8IFNvbWUgYSAtPlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBrIChPayBhKVxuICAgIGluXG4gICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICBcImxvYWRlbmRcIlxuICAgICAgICBoYW5kbGVyXG4gICAgICAgIChIdHRwX3JlcXVlc3QuZXZlbnRfdGFyZ2V0IHJlcSlcblxuXG5sZXQgbm93OiAoVGltZS50LCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgKE9rIChEYXRlLm5vdyAoKSkpXG5cblxubGV0IHRpbWVfem9uZTogKFRpbWUuWm9uZS50LCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgKE9rIChEYXRlLih6b25lX29mZnNldCAobm93ICgpKSkpKVxuIiwib3BlbiBGbWxpYl9qc1xuXG50eXBlICdtIHQgPVxuICAgIHwgTm9uZVxuICAgIHwgV2luZG93IG9mIHN0cmluZyAqICdtIEhhbmRsZXIuVmlydHVhbC50XG4gICAgfCBJbnRlcnZhbF90aW1lciAgb2YgaW50ICogKFRpbWUudCAtPiAnbSlcbiAgICB8IE1lc3NhZ2Ugb2YgJ20gQmFzZS5EZWNvZGUudFxuICAgIHwgVXJsX3JlcXVlc3Qgb2YgKFVybC50IC0+ICdtKVxuICAgIHwgQmF0Y2ggIG9mICdtIHQgbGlzdFxuXG5cbmxldCBub25lOiAnbSB0ID1cbiAgICBOb25lXG5cblxubGV0IGJhdGNoIChsc3Q6ICdtIHQgbGlzdCk6ICdtIHQgPVxuICAgIEJhdGNoIGxzdFxuXG5cblxubGV0IG9uX3dpbmRvdyAoZXZlbnRfdHlwZTogc3RyaW5nKSAoZGVjb2RlOiAnbSBCYXNlLkRlY29kZS50KVxuICAgIDogJ20gdFxuICAgID1cbiAgICBXaW5kb3cgKGV2ZW50X3R5cGUsIEV2ZW50X2ZsYWcuKG5vX3N0b3AsIG5vX3ByZXZlbnQsIGRlY29kZSkpXG5cblxuXG5sZXQgZXZlcnkgKG1zOiBpbnQpIChjYWxsYmFjazogVGltZS50IC0+ICdtKTogJ20gdCA9XG4gICAgSW50ZXJ2YWxfdGltZXIgKG1zLCBjYWxsYmFjaylcblxuXG5sZXQgb25fbWVzc2FnZSAoZGVjb2RlOiAnbSBCYXNlLkRlY29kZS50KTogJ20gdCA9XG4gICAgTWVzc2FnZSBkZWNvZGVcblxuXG5sZXQgb25fdXJsX3JlcXVlc3QgKGY6IFVybC50IC0+ICdtKTogJ20gdCA9XG4gICAgVXJsX3JlcXVlc3QgZlxuXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChzdWI6J2EgdCk6ICdiIHQgPVxuICAgIGxldCByZWMgbWFwID1cbiAgICAgICAgZnVuY3Rpb25cbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBOb25lXG5cbiAgICAgICAgfCBCYXRjaCBsc3QgLT5cbiAgICAgICAgICAgIEJhdGNoIChMaXN0Lm1hcCBtYXAgbHN0KVxuXG4gICAgICAgIHwgV2luZG93IChldmVudF90eXBlLCBkZWNvZGUpIC0+XG4gICAgICAgICAgICBXaW5kb3cgKGV2ZW50X3R5cGUsIEhhbmRsZXIuVmlydHVhbC5tYXAgZiBkZWNvZGUpXG5cbiAgICAgICAgfCBJbnRlcnZhbF90aW1lciAobWlsbGlzLCBnKSAtPlxuICAgICAgICAgICAgSW50ZXJ2YWxfdGltZXIgKG1pbGxpcywgZnVuIHRpbWUgLT4gZiAoZyB0aW1lKSlcblxuICAgICAgICB8IE1lc3NhZ2UgZGVjb2RlIC0+XG4gICAgICAgICAgICBNZXNzYWdlIEJhc2UuRGVjb2RlLihtYXAgZiBkZWNvZGUpXG5cbiAgICAgICAgfCBVcmxfcmVxdWVzdCBnIC0+XG4gICAgICAgICAgICBVcmxfcmVxdWVzdCAoZnVuIHVybCAtPiBmIChnIHVybCkpXG4gICAgaW5cbiAgICBtYXAgc3ViXG5cblxuXG5sZXQgZGVjb2RlX2tleV9ldmVudCAoZjogc3RyaW5nIC0+ICdtKTogJ20gQmFzZS5EZWNvZGUudCA9XG4gICAgQmFzZS5EZWNvZGUuKG1hcCBmIChmaWVsZCBcImtleVwiIHN0cmluZykpXG5cbmxldCBkZWNvZGVfbW91c2VfZXZlbnQgKGY6IGludCAtPiBpbnQgLT4gJ20pOiAnbSBCYXNlLkRlY29kZS50ID1cbiAgICBCYXNlLkRlY29kZS4oXG4gICAgICAgIGxldCogeCA9IGZpZWxkIFwiY2xpZW50WFwiIGludCBpblxuICAgICAgICBsZXQqIHkgPSBmaWVsZCBcImNsaWVudFlcIiBpbnQgaW5cbiAgICAgICAgcmV0dXJuIChmIHggeSlcbiAgICApXG5cblxubGV0IG9uX2tleWRvd24gKGY6IHN0cmluZyAtPiAnbSk6ICdtIHQgPVxuICAgIG9uX3dpbmRvdyBcImtleWRvd25cIiAoZGVjb2RlX2tleV9ldmVudCBmKVxuXG5sZXQgb25fa2V5dXAgKGY6IHN0cmluZyAtPiAnbSk6ICdtIHQgPVxuICAgIG9uX3dpbmRvdyBcImtleXVwXCIgKGRlY29kZV9rZXlfZXZlbnQgZilcblxubGV0IG9uX21vdXNlX2Rvd24gKGY6IGludCAtPiBpbnQgLT4gJ20pOiAnbSB0ID1cbiAgICBvbl93aW5kb3cgXCJtb3VzZWRvd25cIiAoZGVjb2RlX21vdXNlX2V2ZW50IGYpXG5cbmxldCBvbl9tb3VzZV9tb3ZlIChmOiBpbnQgLT4gaW50IC0+ICdtKTogJ20gdCA9XG4gICAgb25fd2luZG93IFwibW91c2Vtb3ZlXCIgKGRlY29kZV9tb3VzZV9ldmVudCBmKVxuXG5sZXQgb25fbW91c2VfdXAgKGY6IGludCAtPiBpbnQgLT4gJ20pOiAnbSB0ID1cbiAgICBvbl93aW5kb3cgXCJtb3VzZXVwXCIgKGRlY29kZV9tb3VzZV9ldmVudCBmKVxuXG5cblxubGV0IG9uX3Jlc2l6ZSAoZjogaW50IC0+IGludCAtPiAnbSk6ICdtIHQgPVxuICAgIGxldCBkZWNvZGUgPSBCYXNlLkRlY29kZS4oXG4gICAgICAgIGxldCogXyA9IHJldHVybiAoKSBpblxuICAgICAgICBmaWVsZCBcImN1cnJlbnRUYXJnZXRcIiAoXG4gICAgICAgICAgICBsZXQqIHdpZHRoICA9IGZpZWxkIFwiaW5uZXJXaWR0aFwiIGludCBpblxuICAgICAgICAgICAgbGV0KiBoZWlnaHQgPSBmaWVsZCBcImlubmVySGVpZ2h0XCIgaW50IGluXG4gICAgICAgICAgICByZXR1cm4gKGYgd2lkdGggaGVpZ2h0KVxuICAgICAgICApXG4gICAgKVxuICAgIGluXG4gICAgb25fd2luZG93IFwicmVzaXplXCIgZGVjb2RlXG5cblxubGV0IG9uX3Zpc2liaWxpdHlfY2hhbmdlIChmOiBzdHJpbmcgLT4gJ20pOiAnbSB0ID1cbiAgICBsZXQgZGVjb2RlID0gQmFzZS5EZWNvZGUuKFxuICAgICAgICBmaWVsZCBcInRhcmdldFwiIChcbiAgICAgICAgICAgICgqIFRoZSB0YXJnZXQgb2YgdGhlIHZpc2liaWxpdHkgY2hhbmdlIGV2ZW50IGlzIFwiZG9jdW1lbnRcIiBhbmRcbiAgICAgICAgICAgICAgIFwiZG9jdW1lbnRcIiBoYXMgdGhlIFwidmlzaWJpbGl0eVN0YXRlXCIgcHJvcGVydHkuICopXG4gICAgICAgICAgICBsZXQqIHN0YXRlID0gZmllbGQgXCJ2aXNpYmlsaXR5U3RhdGVcIiBzdHJpbmcgaW5cbiAgICAgICAgICAgIHJldHVybiAoZiBzdGF0ZSlcbiAgICAgICAgKVxuICAgIClcbiAgICBpblxuICAgIG9uX3dpbmRvdyBcInZpc2liaWxpdHljaGFuZ2VcIiBkZWNvZGVcbiIsIm9wZW4gRm1saWJfanNcblxubW9kdWxlIFN0cmluZ19tYXAgPSBGbWxpYl9zdGQuQnRyZWUuTWFwIChTdHJpbmcpXG5tb2R1bGUgSW50X21hcCAgPSBGbWxpYl9zdGQuQnRyZWUuTWFwIChJbnQpXG5cbm1vZHVsZSBJbnRpb25hcnkgID0gRGljdGlvbmFyeS5NYWtlIChJbnQpXG5tb2R1bGUgRGljdGlvbmFyeSA9IERpY3Rpb25hcnkuTWFrZSAoU3RyaW5nKVxuXG5tb2R1bGUgU3VicyA9XG5zdHJ1Y3RcbiAgICB0eXBlICdtIGhhbmRsZXIgPSAnbSBIYW5kbGVyLlZpcnR1YWwudFxuXG4gICAgdHlwZSAnbSB0ID0ge1xuXG4gICAgICAgIHdpbmRvdzogJ20gaGFuZGxlciBsaXN0IERpY3Rpb25hcnkudDtcblxuICAgICAgICB0aW1lcnM6IChUaW1lLnQgLT4gJ20pIGxpc3QgSW50aW9uYXJ5LnQ7XG5cbiAgICAgICAgbWVzc2FnZTogJ20gQmFzZS5EZWNvZGUudCBvcHRpb247XG5cbiAgICAgICAgdXJsX3JlcXVlc3Q6IChVcmwudCAtPiAnbSkgb3B0aW9uXG4gICAgfVxuXG5cbiAgICBsZXQgZW1wdHk6ICdtIHQgPSB7XG4gICAgICAgIHdpbmRvdyAgICAgID0gRGljdGlvbmFyeS5lbXB0eTtcbiAgICAgICAgdGltZXJzICAgICAgPSBJbnRpb25hcnkuZW1wdHk7XG4gICAgICAgIG1lc3NhZ2UgICAgID0gTm9uZTtcbiAgICAgICAgdXJsX3JlcXVlc3QgPSBOb25lO1xuICAgIH1cblxuXG4gICAgbGV0IG1ha2UgKHN1YjogJ20gU3Vic2NyaXB0aW9uLnQpOiAnbSB0ID1cbiAgICAgICAgbGV0IG9wZW4gU3Vic2NyaXB0aW9uIGluXG4gICAgICAgIGxldCByZWMgbWFrZSBzdWJzID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIHN1YnNcblxuICAgICAgICAgICAgfCBCYXRjaCBsc3QgLT5cbiAgICAgICAgICAgICAgICBMaXN0LmZvbGRfbGVmdFxuICAgICAgICAgICAgICAgICAgICBtYWtlXG4gICAgICAgICAgICAgICAgICAgIHN1YnNcbiAgICAgICAgICAgICAgICAgICAgbHN0XG4gICAgICAgICAgICB8IFdpbmRvdyAoZXZlbnRfdHlwZSwgaGFuZGxlcikgLT5cbiAgICAgICAgICAgICAgICB7c3VicyB3aXRoXG4gICAgICAgICAgICAgICAgIHdpbmRvdyA9XG4gICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5LnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFuZGxlcl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIGxzdCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA6OiBsc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3Vicy53aW5kb3d9XG5cbiAgICAgICAgICAgIHwgSW50ZXJ2YWxfdGltZXIgKG1pbGxpcywgY2FsbGJhY2spIC0+XG4gICAgICAgICAgICAgICAge3N1YnMgd2l0aFxuICAgICAgICAgICAgICAgICB0aW1lcnMgPVxuICAgICAgICAgICAgICAgICAgICAgSW50aW9uYXJ5LnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc1xuICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxsYmFja11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIGxzdCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgOjogbHN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMudGltZXJzfVxuXG4gICAgICAgICAgICB8IE1lc3NhZ2UgZGVjb2RlIC0+XG4gICAgICAgICAgICAgICAge3N1YnMgd2l0aFxuICAgICAgICAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHN1YnMubWVzc2FnZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBTb21lIGRlY29kZVxuICAgICAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzLm1lc3NhZ2V9XG5cbiAgICAgICAgICAgIHwgVXJsX3JlcXVlc3QgZiAtPlxuICAgICAgICAgICAgICAgIHtzdWJzIHdpdGhcbiAgICAgICAgICAgICAgICAgdXJsX3JlcXVlc3QgPVxuICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggc3Vicy51cmxfcmVxdWVzdCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBTb21lIGZcbiAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3Vicy51cmxfcmVxdWVzdH1cbiAgICAgICAgaW5cbiAgICAgICAgbWFrZSBlbXB0eSBzdWJcbmVuZFxuXG5cblxuXG5cblxuXG5cbnR5cGUgJ20gdCA9IHtcbiAgICBzdWJzOiAgICdtIFN1YnMudDtcbiAgICB3aW5kb3c6IEhhbmRsZXIuRXZlbnRIcy50O1xuICAgIHRpbWVyczogSGFuZGxlci5UaW1lcnMudDtcbiAgICB1cmxfcmVxdWVzdDogSGFuZGxlci5VcmxfcmVxdWVzdC50XG59XG5cblxuXG5cbmxldCBtYWtlIChkaXNwYXRjaDogJ20gLT4gdW5pdCkgKHN1YjogJ20gU3Vic2NyaXB0aW9uLnQpOiAnbSB0ID1cbiAgICBsZXQgc3VicyAgID0gU3Vicy5tYWtlIHN1YiBpblxuICAgIGxldCBvcGVuIEhhbmRsZXIgaW5cblxuICAgIGxldCB3aW5kb3cgPSBFdmVudEhzLmVtcHR5ICgpIGluXG4gICAgRXZlbnRIcy5zZXRcbiAgICAgICAgRm1saWJfanMuRG9tLldpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKVxuICAgICAgICBkaXNwYXRjaFxuICAgICAgICBzdWJzLndpbmRvd1xuICAgICAgICB3aW5kb3c7XG5cbiAgICBsZXQgdGltZXJzID0gVGltZXJzLmVtcHR5ICgpIGluXG4gICAgVGltZXJzLnNldCBkaXNwYXRjaCBzdWJzLnRpbWVycyB0aW1lcnM7XG5cbiAgICBsZXQgdXJsX3JlcXVlc3QgPSBVcmxfcmVxdWVzdC5lbXB0eSAoKSBpblxuICAgIFVybF9yZXF1ZXN0LnNldCBkaXNwYXRjaCBzdWJzLnVybF9yZXF1ZXN0IHVybF9yZXF1ZXN0O1xuICAgIHsgc3Viczsgd2luZG93OyB0aW1lcnM7IHVybF9yZXF1ZXN0IH1cblxuXG5cbmxldCB1cGRhdGUgKGRpc3BhdGNoOiAnbSAtPiB1bml0KSAoc3ViOiAnbSBTdWJzY3JpcHRpb24udCkgKHM6ICdtIHQpOiAnbSB0ID1cbiAgICBsZXQgc3VicyAgID0gU3Vicy5tYWtlIHN1YiBpblxuICAgIGxldCBvcGVuIEhhbmRsZXIgaW5cbiAgICBFdmVudEhzLnVwZGF0ZVxuICAgICAgICBGbWxpYl9qcy5Eb20uV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpXG4gICAgICAgIGRpc3BhdGNoXG4gICAgICAgIHN1YnMud2luZG93XG4gICAgICAgIHMuc3Vicy53aW5kb3dcbiAgICAgICAgcy53aW5kb3c7XG4gICAgVGltZXJzLnVwZGF0ZSBkaXNwYXRjaCBzdWJzLnRpbWVycyBzLnN1YnMudGltZXJzIHMudGltZXJzO1xuICAgIFVybF9yZXF1ZXN0LnVwZGF0ZVxuICAgICAgICBkaXNwYXRjaFxuICAgICAgICBzdWJzLnVybF9yZXF1ZXN0XG4gICAgICAgIHMuc3Vicy51cmxfcmVxdWVzdFxuICAgICAgICBzLnVybF9yZXF1ZXN0O1xuICAgIHsgcyB3aXRoIHN1YnMgfVxuIiwib3BlbiBGbWxpYl9qc1xuXG50eXBlICdtIHQgPVxuICAgIHwgTm9uZVxuICAgIHwgVGFzayBvZiAoJ20sIFRhc2suZW1wdHkpIFRhc2sudFxuICAgIHwgVGFza193b19tZXNzYWdlIG9mICh1bml0LCBUYXNrLmVtcHR5KSBUYXNrLnRcbiAgICB8IEJhdGNoIG9mICdtIHQgbGlzdFxuXG5cbmxldCBub25lOiAnbSB0ID1cbiAgICBOb25lXG5cblxuXG5sZXQgYmF0Y2ggKGxzdDogJ20gdCBsaXN0KTogJ20gdCA9XG4gICAgQmF0Y2ggbHN0XG5cblxuXG5sZXQgcGVyZm9ybSAodGFzazogKCdhLCBUYXNrLmVtcHR5KSBUYXNrLnQpOiAnbSB0ID1cbiAgICBUYXNrIHRhc2tcblxuXG5sZXQganVzdF9kbyAodGFzazogKHVuaXQsIFRhc2suZW1wdHkpIFRhc2sudCk6ICdtIHQgPVxuICAgIFRhc2tfd29fbWVzc2FnZSB0YXNrXG5cblxuXG5sZXQgYXR0ZW1wdCAoZjogKCdhLCAnZSkgcmVzdWx0IC0+ICdtKSAodGFzazogKCdhLCAnZSkgVGFzay50KTogJ20gdCA9XG4gICAgVGFzayAoVGFzay5tYWtlX3N1Y2NlZWQgZiB0YXNrKVxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKSAoY21kOiAnYSB0KTogJ2IgdCA9XG4gICAgbGV0IHJlYyBtYXAgPSBmdW5jdGlvblxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIE5vbmVcbiAgICAgICAgfCBUYXNrIHRhc2sgLT5cbiAgICAgICAgICAgIFRhc2sgKFRhc2subWFwIGYgdGFzaylcbiAgICAgICAgfCBUYXNrX3dvX21lc3NhZ2UgXyBhcyBjbWQgLT5cbiAgICAgICAgICAgIGNtZFxuICAgICAgICB8IEJhdGNoIGxzdCAtPlxuICAgICAgICAgICAgQmF0Y2ggKExpc3QubWFwIG1hcCBsc3QpXG4gICAgaW5cbiAgICBtYXAgY21kXG5cblxuXG5cbmxldCBleGVjdXRlIChwb3N0OiBCYXNlLlZhbHVlLnQgLT4gdW5pdCkgKGRpc3BhdGNoOiAnbSAtPiB1bml0KSAoY21kOiAnbSB0KTogdW5pdCA9XG4gICAgbGV0IHJlYyBleGUgPSBmdW5jdGlvblxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICgpXG5cbiAgICAgICAgfCBUYXNrIHRhc2sgLT5cbiAgICAgICAgICAgIFRhc2sucnVuIHRhc2sgcG9zdCBkaXNwYXRjaFxuXG4gICAgICAgIHwgVGFza193b19tZXNzYWdlIHRhc2sgLT5cbiAgICAgICAgICAgIFRhc2sucnVuIHRhc2sgcG9zdCAoZnVuIF8gLT4gKCkpXG5cbiAgICAgICAgfCBCYXRjaCBsc3QgLT5cbiAgICAgICAgICAgIExpc3QuaXRlciBleGUgbHN0XG4gICAgaW5cbiAgICBleGUgY21kXG4iLCIoKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGFsbCBjYWxscyB0byBqYXZhc2NyaXB0XG5cbiopXG5cbm9wZW4gRm1saWJfanNcbm9wZW4gRm1saWJfanMuRG9tXG5cblxuXG5cbigqIEJhc2ljIGRlZmluaXRpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiopXG5cblxuXG50eXBlIGVsZW1lbnQgICAgICAgICAgICAgPSBFbGVtZW50LnQgKiBIYW5kbGVyLkV2ZW50SHMudFxuXG50eXBlIG5vZGUgICAgICAgICAgICAgICAgPSBOb2RlLnQgKiBlbGVtZW50IG9wdGlvblxuXG50eXBlICdtc2cgZG9tICAgICAgICAgICAgPSAoJ21zZywgbm9kZSkgVmRvbS50MVxuXG50eXBlICdtc2cgZG9tX29wZXJhdGlvbnMgPSAoJ21zZywgbm9kZSkgVmRvbS5vcGVyYXRpb25zXG5cblxubGV0IGRvY3VtZW50ICgpOiBEb2N1bWVudC50ID0gV2luZG93LihnZXQgKCkgfD4gZG9jdW1lbnQpXG5cbnR5cGUgKCdzdGF0ZSwgJ21zZykgdmlldzEgPSAnc3RhdGUgLT4gJ21zZyBWZG9tLnRcbnR5cGUgKCdzdGF0ZSwgJ21zZykgdmlldzIgPSAnc3RhdGUgLT4gJ21zZyBWZG9tLnQgKiBzdHJpbmdcblxudHlwZSAoJ3N0YXRlLCAnbXNnKSB1cGRhdGUxID0gJ3N0YXRlIC0+ICdtc2cgLT4gJ3N0YXRlXG50eXBlICgnc3RhdGUsICdtc2cpIHVwZGF0ZTIgPSAnc3RhdGUgLT4gJ21zZyAtPiAnc3RhdGUgKiAnbXNnIENvbW1hbmQudFxuXG5cblxudHlwZSAoJ3MsICdtKSBvcGVyYXRpb25zID1cbiAgICB8IFNhbmRib3ggb2ZcbiAgICAgICAgICAoJ3MsICdtKSB2aWV3MVxuICAgICAgICAgICogKCdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAgICogKCdzLCAnbSkgdXBkYXRlMVxuICAgIHwgRWxlbWVudCBvZlxuICAgICAgICAgICgncywgJ20pIHZpZXcxXG4gICAgICAgICAgKiAoJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICAgKiAoJ3MsICdtKSB1cGRhdGUyXG4gICAgICAgICAgKiAoQmFzZS5WYWx1ZS50IC0+IHVuaXQpXG4gICAgfCBBcHAgICAgIG9mXG4gICAgICAgICAgKCdzLCAnbSkgdmlldzJcbiAgICAgICAgICAqICgncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgICAqICgncywgJ20pIHVwZGF0ZTJcbiAgICAgICAgICAqIChCYXNlLlZhbHVlLnQgLT4gdW5pdClcblxuXG5cbnR5cGUgKCdzdGF0ZSwgJ21zZykgZGF0YSA9XG4gICAge1xuICAgICAgICBtdXRhYmxlIHN0YXRlOiAnc3RhdGU7XG4gICAgICAgIG11dGFibGUgZGlydHk6IGJvb2w7XG4gICAgICAgIG11dGFibGUgZG9tOiAgICdtc2cgZG9tIG9wdGlvbjtcbiAgICAgICAgbXV0YWJsZSBzdWJzOiAgJ21zZyBTdWJzY3JpcHRpb25zLnQgb3B0aW9uO1xuICAgICAgICByb290OiAgICAgICAgICBFbGVtZW50LnQ7XG4gICAgICAgIG9wZXJhdGlvbnM6ICAgICgnc3RhdGUsICdtc2cpIG9wZXJhdGlvbnM7XG4gICAgfVxuXG5cblxuXG5cbigqIERvbSBvcGVyYXRpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgQWNjZXNzaW5nIHRoZSByZWFsIGRvbS5cblxuICAgT3BlcmF0aW9ucyBhcmUgbmVlZGVkIGZvciB0aGUgbW9kdWxlIFtWZG9tXS5cbiopXG5cblxubGV0IGRvbV9vcGVyYXRpb25zIChkaXNwYXRjaDogJ21zZyAtPiB1bml0KTogJ21zZyBkb21fb3BlcmF0aW9ucyA9XG4gICAgbGV0IGdldF9ib3RoOlxuICAgICAgICBub2RlIC0+IGVsZW1lbnRcbiAgICAgICAgPVxuICAgICAgICBmdW5jdGlvblxuICAgICAgICB8IChfLCBTb21lIGVsKSAtPlxuICAgICAgICAgIGVsXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbCAqKVxuICAgIGluXG4gICAgbGV0IGdldF9lbGVtZW50OlxuICAgICAgICBOb2RlLnQgKiBlbGVtZW50IG9wdGlvbiAtPiBFbGVtZW50LnRcbiAgICAgICAgPVxuICAgICAgICBmdW5jdGlvblxuICAgICAgICB8IChfLCBTb21lIChlbCwgXykpIC0+XG4gICAgICAgICAgZWxcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsICopXG4gICAgaW5cbiAgICB7XG4gICAgICAgIG1ha2VfdGV4dCA9XG4gICAgICAgICAgICAoZnVuIHMgLT4gRG9jdW1lbnQuY3JlYXRlX3RleHRfbm9kZSBzIChkb2N1bWVudCAoKSksIE5vbmUpO1xuXG4gICAgICAgIG1ha2VfZWxlbWVudCA9XG4gICAgICAgICAgICAoZnVuIHRhZyAobHN0OiBub2RlIGxpc3QpIC0+XG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIERvY3VtZW50IGluXG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIEVsZW1lbnQgaW5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gTm9kZSBpblxuICAgICAgICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnQgKCkgaW5cbiAgICAgICAgICAgICAgICAgbGV0IGVsICA9IGNyZWF0ZV9lbGVtZW50IHRhZyBkb2MgaW5cbiAgICAgICAgICAgICAgICAgTGlzdC5pdGVyXG4gICAgICAgICAgICAgICAgICAgICAoZnVuIChjaGlsZCwgXykgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNoaWxkIChub2RlIGVsKSlcbiAgICAgICAgICAgICAgICAgICAgIGxzdDtcbiAgICAgICAgICAgICAgICAgbm9kZSBlbCwgU29tZSAoZWwsIEhhbmRsZXIuRXZlbnRIcy5lbXB0eSAoKSkpO1xuXG4gICAgICAgIG1ha2VfZWxlbWVudF9ucyA9XG4gICAgICAgICAgICAoZnVuIG5hbWVzcGFjZSB0YWcgKGxzdDogbm9kZSBsaXN0KSAtPlxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBEb2N1bWVudCBpblxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBFbGVtZW50IGluXG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIE5vZGUgaW5cbiAgICAgICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50ICgpIGluXG4gICAgICAgICAgICAgICAgIGxldCBlbCAgPSBjcmVhdGVfZWxlbWVudF9ucyBuYW1lc3BhY2UgdGFnIGRvYyBpblxuICAgICAgICAgICAgICAgICBMaXN0Lml0ZXJcbiAgICAgICAgICAgICAgICAgICAgIChmdW4gKGNoaWxkLCBfKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2hpbGQgKG5vZGUgZWwpKVxuICAgICAgICAgICAgICAgICAgICAgbHN0O1xuICAgICAgICAgICAgICAgICBub2RlIGVsLCBTb21lIChlbCwgSGFuZGxlci5FdmVudEhzLmVtcHR5ICgpKSk7XG5cbiAgICAgICAgYWRkX2NoaWxkID1cbiAgICAgICAgICAgIChmdW4gKGNoaWxkLCBfKSAocGFyLCBfKSAtPlxuICAgICAgICAgICAgICAgICBOb2RlLmFwcGVuZCBjaGlsZCBwYXIpO1xuXG4gICAgICAgIHJlbW92ZV9jaGlsZCA9XG4gICAgICAgICAgICAoZnVuIChjaGlsZCwgXykgKHBhciwgXykgLT5cbiAgICAgICAgICAgICAgICAgTm9kZS5yZW1vdmUgY2hpbGQgcGFyKTtcblxuICAgICAgICByZW1vdmVfY2hpbGRyZW4gPVxuICAgICAgICAgICAgKGZ1biAocGFyLCBfKSAtPlxuICAgICAgICAgICAgICAgICBOb2RlLnJlbW92ZV9jaGlsZHJlbiBwYXIpO1xuXG4gICAgICAgIHJlcGxhY2VfY2hpbGQgPVxuICAgICAgICAgICAgKGZ1biAob2xkX2NoaWxkLCBfKSAobmV3X2NoaWxkLCBfKSAocGFyLCBfKSAtPlxuICAgICAgICAgICAgICAgICBOb2RlLnJlcGxhY2UgbmV3X2NoaWxkIG9sZF9jaGlsZCBwYXIpO1xuXG4gICAgICAgIHNldF90ZXh0ID1cbiAgICAgICAgICAgIChmdW4gKG5vZGUsIF8pIHRleHQgLT4gTm9kZS5zZXRfbm9kZV92YWx1ZSB0ZXh0IG5vZGUpO1xuXG5cbiAgICAgICAgc2V0X3N0eWxlID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgU3R5bGUuc2V0IGtleSB2YWx1ZSAoRWxlbWVudC5zdHlsZSAoZ2V0X2VsZW1lbnQgZWwpKSk7XG5cbiAgICAgICAgc2V0X2F0dHJpYnV0ZSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICBFbGVtZW50LnNldF9hdHRyaWJ1dGUga2V5IHZhbHVlIChnZXRfZWxlbWVudCBlbCkpO1xuXG4gICAgICAgIHNldF9wcm9wZXJ0eSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICBFbGVtZW50LnNldF9wcm9wZXJ0eSBrZXkgdmFsdWUgKGdldF9lbGVtZW50IGVsKSk7XG5cblxuICAgICAgICByZW1vdmVfc3R5bGUgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgLT5cbiAgICAgICAgICAgICAgICAgU3R5bGUucmVtb3ZlXG4gICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50LnN0eWxlIChnZXRfZWxlbWVudCBlbCkpKTtcblxuXG4gICAgICAgIHJlbW92ZV9hdHRyaWJ1dGUgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgLT5cbiAgICAgICAgICAgICAgICAgRWxlbWVudC5yZW1vdmVfYXR0cmlidXRlIGtleSAoZ2V0X2VsZW1lbnQgZWwpKTtcblxuXG4gICAgICAgIHJlbW92ZV9wcm9wZXJ0eSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSAtPlxuICAgICAgICAgICAgICAgICBFbGVtZW50LmRlbGV0ZV9wcm9wZXJ0eSBrZXkgKGdldF9lbGVtZW50IGVsKSk7XG5cblxuICAgICAgICBzZXRfaGFuZGxlcnMgPVxuICAgICAgICAgICAgKGZ1biBlbCBkaWN0IC0+XG4gICAgICAgICAgICAgICAgIGxldCBlbCwgcmVhbHMgPSBnZXRfYm90aCBlbCBpblxuICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gTm9kZS5ldmVudF90YXJnZXQgKEVsZW1lbnQubm9kZSBlbCkgaW5cbiAgICAgICAgICAgICAgICAgSGFuZGxlci5FdmVudEhzLnNldCB0YXJnZXQgZGlzcGF0Y2ggZGljdCByZWFsc1xuICAgICAgICAgICAgKTtcblxuICAgICAgICB1cGRhdGVfaGFuZGxlcnMgPVxuICAgICAgICAgICAgKGZ1biBlbCBkaWN0MSBkaWN0MiAtPlxuICAgICAgICAgICAgICAgICBsZXQgZWwsIHJlYWxzID0gZ2V0X2JvdGggZWwgaW5cbiAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IE5vZGUuZXZlbnRfdGFyZ2V0IChFbGVtZW50Lm5vZGUgZWwpIGluXG4gICAgICAgICAgICAgICAgIEhhbmRsZXIuRXZlbnRIcy51cGRhdGUgdGFyZ2V0IGRpc3BhdGNoIGRpY3QxIGRpY3QyIHJlYWxzKTtcbiAgICB9XG5cblxuXG5cblxuKCogRGlzcGF0Y2hpbmcgbWVzc2FnZXMgdG8gdGhlIGFwcGxpY2F0aW9uXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgLSBjYWxsIHRoZSB1cGRhdGUgZnVuY3Rpb25cblxuICAgICAgICBzdGF0ZSAtPiBtc2cgLT4gc3RhdGUgKiBjbWRcblxuICAgLSB1cGRhdGUgdGhlIHN1YnNjcmlwdGlvbnNcblxuICAgICAgICBzdGF0ZSBtaWdodCBoYXZlIGNoYW5nZWQsIHRoZXJlZm9yZSBzdWJzY3JpcHRpb25zIG1pZ2h0IGhhdmUgY2hhbmdlZC5cblxuICAgLSBleGVjdXRlIGNvbW1hbmRzXG5cbiopXG5cbmxldCByZWMgZGlzcGF0Y2ggKGRhdGE6ICgnc3RhdGUsICdtc2cpIGRhdGEpIChtc2c6ICdtc2cpOiB1bml0ID1cbiAgICBsZXQgdXBkYXRlX2RhdGEgc3RhdGUgPVxuICAgICAgICBsZXQgc3RhdGVfZGlmZmVyZW50ID0gbm90IChzdGF0ZSA9PSBkYXRhLnN0YXRlKVxuICAgICAgICBpblxuICAgICAgICBkYXRhLmRpcnR5IDwtIGRhdGEuZGlydHkgfHwgc3RhdGVfZGlmZmVyZW50O1xuICAgICAgICBpZiBzdGF0ZV9kaWZmZXJlbnQgdGhlbiBiZWdpblxuICAgICAgICAgICAgZGF0YS5zdGF0ZSA8LSBzdGF0ZTtcbiAgICAgICAgICAgIHVwZGF0ZV9zdWJzY3JpcHRpb25zIGRhdGFcbiAgICAgICAgZW5kXG4gICAgaW5cbiAgICBtYXRjaCBkYXRhLm9wZXJhdGlvbnMgd2l0aFxuICAgIHwgU2FuZGJveCAoXywgXywgdXBkYXRlKSAtPlxuICAgICAgICB1cGRhdGVfZGF0YSAodXBkYXRlIGRhdGEuc3RhdGUgbXNnKTtcblxuICAgIHwgRWxlbWVudCAoXywgXywgdXBkYXRlLCBwb3N0KSAtPlxuICAgICAgICBsZXQgc3RhdGUsIGNtZCA9IHVwZGF0ZSBkYXRhLnN0YXRlIG1zZyBpblxuICAgICAgICB1cGRhdGVfZGF0YSBzdGF0ZTtcbiAgICAgICAgQ29tbWFuZC5leGVjdXRlIHBvc3QgKGRpc3BhdGNoX25leHQgZGF0YSkgY21kXG5cbiAgICB8IEFwcCAoXywgXywgdXBkYXRlLCBwb3N0KSAtPlxuICAgICAgICBsZXQgc3RhdGUsIGNtZCA9IHVwZGF0ZSBkYXRhLnN0YXRlIG1zZyBpblxuICAgICAgICB1cGRhdGVfZGF0YSBzdGF0ZTtcbiAgICAgICAgQ29tbWFuZC5leGVjdXRlIHBvc3QgKGRpc3BhdGNoX25leHQgZGF0YSkgY21kXG5cblxuYW5kIGRpc3BhdGNoX25leHQgKGRhdGE6ICgnc3RhdGUsICdtc2cpIGRhdGEpIChtc2c6ICdtc2cpOiB1bml0ID1cbiAgICBpZ25vcmUgKCBUaW1lci5zZXQgKGZ1biAoKSAtPiBkaXNwYXRjaCBkYXRhIG1zZykgMCApXG5cblxuYW5kIHVwZGF0ZV9zdWJzY3JpcHRpb25zIChkYXRhOiAoJ3MsICdtKSBkYXRhKTogdW5pdCA9XG4gICAgKCogY3JlYXRlIG9yIHVwZGF0ZSB0aGUgc3Vic2NyaXB0aW9ucywgaS5lLiBpbnN0YWxsIGFsbCBuZWNlc3NhcnkgaGFuZGxlcnMuICopXG4gICAgbGV0IHVwZGF0ZSAoKSA9XG4gICAgICAgIG1hdGNoIGRhdGEub3BlcmF0aW9ucywgZGF0YS5zdWJzIHdpdGhcbiAgICAgICAgfCBTYW5kYm94IChfLCBzdWIsIF8pLCAgICBOb25lXG4gICAgICAgIHwgQXBwIChfLCBzdWIsIF8sIF8pLCAgICAgTm9uZVxuICAgICAgICB8IEVsZW1lbnQgKF8sIHN1YiwgXywgXyksIE5vbmUgLT5cbiAgICAgICAgICAgIGRhdGEuc3VicyA8LVxuICAgICAgICAgICAgICAgIFNvbWUgKFN1YnNjcmlwdGlvbnMubWFrZSAoZGlzcGF0Y2ggZGF0YSkgKHN1YiBkYXRhLnN0YXRlKSlcblxuICAgICAgICB8IFNhbmRib3ggKF8sIHN1YiwgXyksICAgIFNvbWUgc3Vic1xuICAgICAgICB8IEFwcCAoXywgc3ViLCBfLCBfKSwgICAgIFNvbWUgc3Vic1xuICAgICAgICB8IEVsZW1lbnQgKF8sIHN1YiwgXywgXyksIFNvbWUgc3Vic1xuICAgICAgICAgICAgd2hlbiBkYXRhLmRpcnR5IC0+XG4gICAgICAgICAgICBkYXRhLnN1YnMgPC1cbiAgICAgICAgICAgICAgICBTb21lIChTdWJzY3JpcHRpb25zLnVwZGF0ZSAoZGlzcGF0Y2ggZGF0YSkgKHN1YiBkYXRhLnN0YXRlKSBzdWJzKVxuXG4gICAgICAgIHwgXywgXyAtPlxuICAgICAgICAgICAgKClcbiAgICBpblxuICAgIEFzc2VydF9mYWlsdXJlLmF0dGVtcHRcbiAgICAgICAgXCJFeGNlcHRpb24gaW4gJ3VwZGF0ZV9zdWJzY3JpcHRpb25zJyBvZiBGbWxpYl9icm93c2VyXCJcbiAgICAgICAgdXBkYXRlXG4gICAgICAgIChmdW4gKCkgLT4gKCkpXG5cblxuXG5cblxuXG5cblxuXG5cbigqIFByb2R1Y2UgdGhlIHJlYWwgZG9tIGkuZS4gcmVuZGVyIHRoZSBkb21cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICBUaGlzIGlzIHRoZXJlIHRoZSBhY2Nlc3MgdG8gdGhlIHJlYWwgZG9tIG9mIHRoZSBicm93c2VyIGhhcHBlbnMuXG4qKVxuXG5cbmxldCBwdXRfYmVsb3dfcm9vdCAoZGF0YTogKCdzdGF0ZSwgJ21zZykgZGF0YSkgKGRvbTogJ21zZyBkb20pOiB1bml0ID1cbiAgICBsZXQgcm9vdF9ub2RlID0gRWxlbWVudC5ub2RlIGRhdGEucm9vdCBpblxuICAgIE5vZGUucmVtb3ZlX2NoaWxkcmVuIHJvb3Rfbm9kZTtcbiAgICBOb2RlLmFwcGVuZCAoVmRvbS5lbGVtZW50IGRvbSB8PiBmc3QpIHJvb3Rfbm9kZVxuXG5cblxuXG5cbmxldCB2ZG9tIChkYXRhOiAoJ3MsICdtKSBkYXRhKTogJ20gVmRvbS50ICogKHVuaXQgLT4gdW5pdCkgPVxuICAgICgqIEdldCB0aGUgdmlydHVhbCBkb20gZnJvbSB0aGUgc3RhdGUgYW5kIHRoZSB0aXRsZSB1cGRhdGUgZnVuY3Rpb24uICopXG4gICAgbWF0Y2ggZGF0YS5vcGVyYXRpb25zIHdpdGhcbiAgICB8IFNhbmRib3ggKHZpZXcsIF8sIF8pIC0+XG4gICAgICAgIHZpZXcgZGF0YS5zdGF0ZSwgKGZ1biAoKSAtPiAoKSlcbiAgICB8IEVsZW1lbnQgKHZpZXcsIF8sIF8sIF8pIC0+XG4gICAgICAgIHZpZXcgZGF0YS5zdGF0ZSwgKGZ1biAoKSAtPiAoKSlcbiAgICB8IEFwcCAodmlldywgXywgXywgXykgLT5cbiAgICAgICAgbGV0IHZkb20sIHRpdGxlID0gdmlldyBkYXRhLnN0YXRlIGluXG4gICAgICAgIHZkb20sIChmdW4gKCkgLT4gRG9jdW1lbnQuc2V0X3RpdGxlIHRpdGxlIChkb2N1bWVudCAoKSkpXG5cblxuXG5cbmxldCB1cGRhdGVfZG9tIChkYXRhOiAoJ3N0YXRlLCAnbXNnKSBkYXRhKTogdW5pdCA9XG4gICAgKCogQ3JlYXRlIG9yIHVwZGF0ZSB0aGUgcmVhbCBkb20gYmFzZWQgb24gdGhlIHN0YXRlLiBGaXJzdCBjcmVhdGUgYSB2aXJ0dWFsXG4gICAgICAgZG9tIGZyb20gdGhlIHN0YXRlIGFuZCB0aGVuIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHJlYWwgZG9tLiAqKVxuICAgIGxldCB1cGRhdGUgKCkgPVxuICAgICAgICBsZXQgdmRvbSBkYXRhID1cbiAgICAgICAgICAgIGxldCB2ZG9tLCBzZXRfdGl0bGUgPSB2ZG9tIGRhdGEgaW5cbiAgICAgICAgICAgIHNldF90aXRsZSAoKTtcbiAgICAgICAgICAgIHZkb21cbiAgICAgICAgaW5cbiAgICAgICAgbWF0Y2ggZGF0YS5kb20gd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGxldCBkb20gPVxuICAgICAgICAgICAgICAgIFZkb20ubWFrZVxuICAgICAgICAgICAgICAgICAgICAoZG9tX29wZXJhdGlvbnMgKGRpc3BhdGNoIGRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAodmRvbSBkYXRhKVxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGRhdGEuZG9tIDwtIFNvbWUgZG9tO1xuICAgICAgICAgICAgcHV0X2JlbG93X3Jvb3QgZGF0YSBkb207XG5cbiAgICAgICAgfCBTb21lIGRvbSAtPlxuICAgICAgICAgICAgaWYgZGF0YS5kaXJ0eSB0aGVuIGJlZ2luXG4gICAgICAgICAgICAgICAgbGV0IGRvbSwgY3JlYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgIFZkb20udXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAoZG9tX29wZXJhdGlvbnMgKGRpc3BhdGNoIGRhdGEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHZkb20gZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbVxuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgaWYgY3JlYXRlZCB0aGVuXG4gICAgICAgICAgICAgICAgICAgIHB1dF9iZWxvd19yb290IGRhdGEgZG9tO1xuICAgICAgICAgICAgICAgIGRhdGEuZG9tIDwtIFNvbWUgZG9tO1xuICAgICAgICAgICAgZW5kXG4gICAgYW5kIGNsZWFudXAgKCkgPVxuICAgICAgICBkYXRhLmRpcnR5IDwtIGZhbHNlXG4gICAgaW5cbiAgICBBc3NlcnRfZmFpbHVyZS5hdHRlbXB0XG4gICAgICAgIFwiRXhjZXB0aW9uIGluICd1cGRhdGVfZG9tJyBvZiBGbWxpYl9icm93c2VyXCJcbiAgICAgICAgdXBkYXRlXG4gICAgICAgIGNsZWFudXA7XG4gICAgY2xlYW51cCAoKTtcbiAgICBhc3NlcnQgKG5vdCBkYXRhLmRpcnR5KVxuXG5cbmxldCBvbl9uZXh0X2FuaW1hdGlvbiAoZjogZmxvYXQgLT4gdW5pdCk6IHVuaXQgPVxuICAgICgqIENhbGwgJ2YnIG9uIG5leHQgYW5pbWF0aW9uIGZyYW1lLiAqKVxuICAgIFdpbmRvdy4ob25fbmV4dF9hbmltYXRpb24gZiAoZ2V0ICgpKSlcblxuXG5cbmxldCByZWMgYW5pbWF0ZSAoZGF0YTogKCdzdGF0ZSwgJ21zZykgZGF0YSk6IGZsb2F0IC0+IHVuaXQgPVxuICAgIGZ1biBfIC0+XG4gICAgdXBkYXRlX2RvbSBkYXRhO1xuICAgIGFzc2VydCAobm90IGRhdGEuZGlydHkpO1xuICAgIG9uX25leHRfYW5pbWF0aW9uIChhbmltYXRlIGRhdGEpXG5cblxuXG5cblxuKCogSGVscGVyIGZ1bmN0aW9uIHRvIHdyYXAgdXNlciBzdXBwbGllZCBmdW5jdGlvbnNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbmxldCB3cmFwX3N0YXRlX2Z1biAoc3RyOiBzdHJpbmcpIChmOiAncyAtPiAnYSkgKHN0YXRlOiAncyk6ICdhID1cbiAgICBBc3NlcnRfZmFpbHVyZS5hdHRlbXB0XG4gICAgICAgIChcIkV4Y2VwdGlvbiBpbiAnXCIgXiBzdHIgXiBcIidcIilcbiAgICAgICAgKGZ1biAoKSAtPiBmIHN0YXRlKVxuICAgICAgICAoZnVuICgpIC0+ICgpKVxuXG5cbmxldCB3cmFwX3ZpZXcgKHZpZXc6ICdzIC0+ICdhKSAoc3RhdGU6ICdzKTogJ2EgPVxuICAgIHdyYXBfc3RhdGVfZnVuIFwidmlld1wiIHZpZXcgc3RhdGVcblxuXG5sZXQgd3JhcF9zdWJzY3JpcHRpb24gKHZpZXc6ICdzIC0+ICdhKSAoc3RhdGU6ICdzKTogJ2EgPVxuICAgIHdyYXBfc3RhdGVfZnVuIFwic3Vic2NyaXB0aW9pblwiIHZpZXcgc3RhdGVcblxuXG5sZXQgd3JhcF91cGRhdGUgKHVwZGF0ZTogJ3MgLT4gJ20gLT4gJ2EpIChzdGF0ZTogJ3MpIChtZXNzYWdlOiAnbSk6ICdhID1cbiAgICBBc3NlcnRfZmFpbHVyZS5hdHRlbXB0XG4gICAgICAgIFwiRXhjZXB0aW9uIGluICd1cGRhdGUnXCJcbiAgICAgICAgKGZ1biAoKSAtPiB1cGRhdGUgc3RhdGUgbWVzc2FnZSlcbiAgICAgICAgKGZ1biAoKSAtPiAoKSlcblxuXG5cblxuXG5cblxuKCogSGVscGVyIGZ1bmN0aW9uIHRvIHJlY2VpdmUgbWVzc2FnZXMgZnJvbSBqYXZhc2NyaXB0XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5sZXQgcmVjZWl2ZV9tZXNzYWdlXG4gICAgICAgIChkYXRhOiAoJ3MsICdtKSBkYXRhIG9wdGlvbiByZWYpXG4gICAgOiBCYXNlLlZhbHVlLnRcbiAgICA9XG4gICAgKCogSGFuZGxlciBmb3IgaW5jb21pbmcgbWVzc2FnZXMgZnJvbSBqYXZhc2NyaXB0LiAqKVxuICAgIGxldCBvcGVuIEJhc2VcbiAgICBpblxuICAgIGxldCBwb3N0ICh2OiBWYWx1ZS50KTogVmFsdWUudCA9XG4gICAgICAgIG1hdGNoICFkYXRhIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJyZWNlaXZlX21lc3NhZ2U6IGFwcGxpY2F0aW9uIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcIjtcbiAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgfCBTb21lIGRhdGEgLT5cbiAgICAgICAgICAgIG1hdGNoIGRhdGEuc3VicyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgXCJyZWNlaXZlX21lc3NhZ2U6IHN1YnNjcmlwdGlvbnMgbm90IHlldCBpbml0aWFsaXplZFwiO1xuICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgICAgIHwgU29tZSBzdWJzIC0+XG4gICAgICAgICAgICAgICAgbWF0Y2ggc3Vicy5zdWJzLm1lc3NhZ2Ugd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicmVjZWl2ZV9tZXNzYWdlOiBldmVudCBub3Qgc3Vic2NyaWJlZFwiO1xuICAgICAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgICAgICAgICAgfCBTb21lIGRlY29kZSAtPlxuICAgICAgICAgICAgICAgICAgICBtYXRjaCBkZWNvZGUgdiB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWNlaXZlX21lc3NhZ2U6IGNhbm5vdCBkZWNvZGUgbWVzc2FnZSBmcm9tIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1haW4ubG9nX3ZhbHVlIHY7XG4gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgICAgICAgICAgICAgIHwgU29tZSBtIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaCBkYXRhIG07XG4gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgaW5cbiAgICBWYWx1ZS5mdW5jdGlvbjEgcG9zdFxuXG5cblxuXG5cblxuKCogSGVscGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IGFuIGFwcGxpY2F0aW9uIChlbGVtZW50IG9yIHNpbmdsZSBwYWdlIGFwcClcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxuXG5cbmxldCBzdGFydF9hcHBsaWNhdGlvblxuICAgICAgICAoZGF0YTogKCdzLCAnbSkgZGF0YSlcbiAgICAgICAgKGNvbW1hbmQ6ICdtIENvbW1hbmQudClcbiAgICAgICAgKHBvc3Q6IEJhc2UuVmFsdWUudCAtPiB1bml0KTogdW5pdCA9XG4gICAgdXBkYXRlX3N1YnNjcmlwdGlvbnMgZGF0YTtcbiAgICB1cGRhdGVfZG9tIGRhdGE7XG4gICAgQ29tbWFuZC5leGVjdXRlIHBvc3QgKGRpc3BhdGNoX25leHQgZGF0YSkgY29tbWFuZDtcbiAgICBvbl9uZXh0X2FuaW1hdGlvbiAoYW5pbWF0ZSBkYXRhKVxuXG5cblxuXG5cblxuXG5cbigqIFNhbmRib3ggYXBwbGljYXRpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbmxldCBtYWtlX3NhbmRib3hcbiAgICAgICAgKHN0YXRlOiAncylcbiAgICAgICAgKHZpZXc6ICAgKCdzLCAnbSkgdmlldzEpXG4gICAgICAgIChzdWI6ICAgICdzdGF0ZSAtPiAnbXNnIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAoJ3MsICdtKSB1cGRhdGUxKVxuICAgICAgICAoXzogJ2EpXG4gICAgOiB1bml0XG4gICAgPVxuICAgICgqIFRoaXMgZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIHdpdGhpbiB0aGUgb25sb2FkIGV2ZW50IG9mIHRoZSBicm93c2VyXG4gICAgICAgd2luZG93LlxuICAgICAqKVxuXG4gICAgKCogTWFrZSB0aGUgZGF0YSBmb3IgdGhlIGFwcGxpY2F0aW9uLiAqKVxuICAgIGxldCBkYXRhID0ge1xuICAgICAgICBzdGF0ZTtcbiAgICAgICAgZGlydHkgICAgICA9IGZhbHNlO1xuICAgICAgICByb290ICAgICAgID0gRG9jdW1lbnQuYm9keSAoZG9jdW1lbnQgKCkpO1xuICAgICAgICBkb20gICAgICAgID0gTm9uZTtcbiAgICAgICAgc3VicyAgICAgICA9IE5vbmU7XG4gICAgICAgIG9wZXJhdGlvbnMgPVxuICAgICAgICAgICAgU2FuZGJveCAod3JhcF92aWV3IHZpZXcsIHdyYXBfc3Vic2NyaXB0aW9uIHN1Yiwgd3JhcF91cGRhdGUgdXBkYXRlKVxuICAgIH1cbiAgICBpblxuICAgIHVwZGF0ZV9zdWJzY3JpcHRpb25zIGRhdGE7ICgqIEluaXRpYWwgc3Vic2NyaXB0aW9ucyAqKVxuICAgIHVwZGF0ZV9kb20gZGF0YTsgICAgICAgICAgICgqIEluaXRpYWwgZG9tLiAqKVxuXG4gICAgKCogUHJvY2Vzc2luZyBmb3IgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICopXG4gICAgb25fbmV4dF9hbmltYXRpb24gKGFuaW1hdGUgZGF0YSlcblxuXG5cbmxldCBzYW5kYm94XG4gICAgICAgIChzdGF0ZTogJ3N0YXRlKVxuICAgICAgICAodmlldzogKCdzdGF0ZSwgJ21zZykgdmlldzEpXG4gICAgICAgICh1cGRhdGU6ICgnc3RhdGUsICdtc2cpIHVwZGF0ZTEpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgXCJsb2FkXCJcbiAgICAgICAgKG1ha2Vfc2FuZGJveCBzdGF0ZSB2aWV3IChmdW4gXyAtPiBTdWJzY3JpcHRpb24ubm9uZSkgdXBkYXRlKVxuICAgICAgICBXaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSlcblxuXG5cbmxldCBzYW5kYm94X3BsdXNcbiAgICAgICAgKHN0YXRlOiAgJ3N0YXRlKVxuICAgICAgICAodmlldzogICAoJ3N0YXRlLCAnbXNnKSB2aWV3MSlcbiAgICAgICAgKHN1YjogICAgJ3N0YXRlIC0+ICdtc2cgU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICgnc3RhdGUsICdtc2cpIHVwZGF0ZTEpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgXCJsb2FkXCJcbiAgICAgICAgKG1ha2Vfc2FuZGJveCBzdGF0ZSB2aWV3IHN1YiB1cGRhdGUpXG4gICAgICAgIFdpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKVxuXG5cblxuXG5cblxuXG5cblxuXG4oKiBFbGVtZW50IGFwcGxpY2F0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5cblxubGV0IGluaXRfZWxlbWVudFxuICAgICAgICAoZGF0YXJlZjogKCdzLCAnbSkgZGF0YSBvcHRpb24gcmVmKVxuICAgICAgICAoZGVjb2RlOiAgKCdzICogJ20gQ29tbWFuZC50KSBCYXNlLkRlY29kZS50KVxuICAgICAgICAodmlldzogICAgKCdzLCAnbSkgdmlldzEpXG4gICAgICAgIChzdWI6ICAgICAncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogICgncywgJ20pIHVwZGF0ZTIpXG4gICAgOiBCYXNlLlZhbHVlLnRcbiAgICA9XG4gICAgbGV0IG9wZW4gQmFzZSBpblxuICAgIGxldCBkZWNvZGUgPVxuICAgICAgICBsZXQgb3BlbiBEZWNvZGUgaW5cbiAgICAgICAgbGV0KiBwb3N0ICAgICAgID0gZmllbGQgXCJvbk1lc3NhZ2VcIiBfZnVuY3Rpb24gaW5cbiAgICAgICAgbGV0KiBzdGF0ZSwgY21kID0gZmllbGQgXCJkYXRhXCIgZGVjb2RlIGluXG4gICAgICAgIGxldCogZWxlbWVudF9pZCA9IGZpZWxkIFwiZWxlbWVudF9pZFwiIHN0cmluZyBpblxuICAgICAgICByZXR1cm4gKGVsZW1lbnRfaWQsIHN0YXRlLCBjbWQsIGZ1biB2IC0+IGlnbm9yZSAocG9zdCBbfHZ8XSkpXG4gICAgaW5cbiAgICBsZXQgaW5pdCAodjogVmFsdWUudCk6IFZhbHVlLnQgPVxuICAgICAgICBtYXRjaCAhZGF0YXJlZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBiZWdpblxuICAgICAgICAgICAgbWF0Y2ggZGVjb2RlIHYgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwiY2Fubm90IGRlY29kZSBpbml0aWFsaXNhdGlvbiBkYXRhXCI7XG4gICAgICAgICAgICAgICAgTWFpbi5sb2dfdmFsdWUgdjtcbiAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgICAgICB8IFNvbWUgKGVsZW1lbnRfaWQsIHN0YXRlLCBjb21tYW5kLCBwb3N0KSAtPlxuICAgICAgICAgICAgICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgICAgICAgICAgICAgXCJsb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggRG9tLkRvY3VtZW50LmZpbmQgZWxlbWVudF9pZCAoZG9jdW1lbnQgKCkpIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCJDYW5ub3QgZmluZCBlbGVtZW50IFwiIF4gZWxlbWVudF9pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgcm9vdCAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGVtZW50IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF92aWV3IHZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfc3Vic2NyaXB0aW9uIHN1YixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF91cGRhdGUgdXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcmVmIDo9IFNvbWUgZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYXBwbGljYXRpb24gZGF0YSBjb21tYW5kIHBvc3RcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBXaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSk7XG4gICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICBlbmRcbiAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcImFwcGxpY2F0aW9uIGFscmVhZHkgaW5pdGlhbGl6ZWRcIjtcbiAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICBpblxuICAgIFZhbHVlLmZ1bmN0aW9uMSBpbml0XG5cblxuXG5cbmxldCBlbGVtZW50XG4gICAgICAgIChuYW1lOiBzdHJpbmcpXG4gICAgICAgIChkZWNvZGU6ICgncyAqICdtIENvbW1hbmQudCkgQmFzZS5EZWNvZGUudClcbiAgICAgICAgKHZpZXc6ICAgKCdzLCAnbSkgdmlldzEpXG4gICAgICAgIChzdWJzOiAgICdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAoJ3MsICdtKSB1cGRhdGUyKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBsZXQgXyA9IGRlY29kZSwgdmlldywgc3VicywgdXBkYXRlIGluXG4gICAgbGV0IGFwcCA9IHJlZiBOb25lIGluXG4gICAgQmFzZS5NYWluLm1ha2VfZ2xvYmFsXG4gICAgICAgIG5hbWVcbiAgICAgICAgQmFzZS5WYWx1ZS4oXG4gICAgICAgICAgICBfb2JqZWN0XG4gICAgICAgICAgICAgICAgW3wgXCJpbml0XCIsIGluaXRfZWxlbWVudCBhcHAgZGVjb2RlIHZpZXcgc3VicyB1cGRhdGVcbiAgICAgICAgICAgICAgICAgOyBcInBvc3RcIiwgcmVjZWl2ZV9tZXNzYWdlIGFwcFxuICAgICAgICAgICAgICAgIHxdXG4gICAgICAgIClcblxuXG5cblxuXG5cblxuKCogU2luZ2xlIFBhZ2UgQXBwbGljYXRpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cblxuXG5cblxubGV0IGluaXRfYXBwbGljYXRpb25cbiAgICAgICAgKGRhdGFyZWY6ICgncywgJ20pIGRhdGEgb3B0aW9uIHJlZilcbiAgICAgICAgKGRlY29kZTogICgncyAqICdtIENvbW1hbmQudCkgQmFzZS5EZWNvZGUudClcbiAgICAgICAgKHZpZXc6ICAgICgncywgJ20pIHZpZXcyKVxuICAgICAgICAoc3ViOiAgICAgJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICAoJ3MsICdtKSB1cGRhdGUyKVxuICAgIDogQmFzZS5WYWx1ZS50XG4gICAgPVxuICAgIGxldCBvcGVuIEJhc2UgaW5cbiAgICBsZXQgZGVjb2RlID1cbiAgICAgICAgbGV0IG9wZW4gRGVjb2RlIGluXG4gICAgICAgIGxldCogcG9zdCAgICAgICA9IGZpZWxkIFwib25NZXNzYWdlXCIgX2Z1bmN0aW9uIGluXG4gICAgICAgIGxldCogc3RhdGUsIGNtZCA9IGZpZWxkIFwiZGF0YVwiIGRlY29kZSBpblxuICAgICAgICByZXR1cm4gKHN0YXRlLCBjbWQsIGZ1biB2IC0+IGlnbm9yZSAocG9zdCBbfHZ8XSkpXG4gICAgaW5cbiAgICBsZXQgaW5pdCAodjogVmFsdWUudCk6IFZhbHVlLnQgPVxuICAgICAgICBtYXRjaCAhZGF0YXJlZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBiZWdpblxuICAgICAgICAgICAgbWF0Y2ggZGVjb2RlIHYgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwiY2Fubm90IGRlY29kZSBpbml0aWFsaXNhdGlvbiBkYXRhXCI7XG4gICAgICAgICAgICAgICAgTWFpbi5sb2dfdmFsdWUgdjtcbiAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgICAgICB8IFNvbWUgKHN0YXRlLCBjb21tYW5kLCBwb3N0KSAtPlxuICAgICAgICAgICAgICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgICAgICAgICAgICAgXCJsb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ICA9IERvY3VtZW50LmJvZHkgKGRvY3VtZW50ICgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tICAgPSBOb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3ZpZXcgdmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3N1YnNjcmlwdGlvbiBzdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF91cGRhdGUgdXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFyZWYgOj0gU29tZSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FwcGxpY2F0aW9uIGRhdGEgY29tbWFuZCBwb3N0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpO1xuICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgZW5kXG4gICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJhcHBsaWNhdGlvbiBhbHJlYWR5IGluaXRpYWxpemVkXCI7XG4gICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgaW5cbiAgICBWYWx1ZS5mdW5jdGlvbjEgaW5pdFxuXG5cblxuXG5cblxubGV0IGFwcGxpY2F0aW9uXG4gICAgICAgIChuYW1lOiBzdHJpbmcpXG4gICAgICAgIChkZWNvZGU6ICgncyAqICdtIENvbW1hbmQudCkgQmFzZS5EZWNvZGUudClcbiAgICAgICAgKHZpZXc6ICAgKCdzLCAnbSkgdmlldzIpXG4gICAgICAgIChzdWJzOiAgICdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAoJ3MsICdtKSB1cGRhdGUyKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBsZXQgYXBwID0gcmVmIE5vbmUgaW5cbiAgICBCYXNlLk1haW4ubWFrZV9nbG9iYWxcbiAgICAgICAgbmFtZVxuICAgICAgICBCYXNlLlZhbHVlLihcbiAgICAgICAgICAgIF9vYmplY3RcbiAgICAgICAgICAgICAgICBbfCBcImluaXRcIiwgaW5pdF9hcHBsaWNhdGlvbiBhcHAgZGVjb2RlIHZpZXcgc3VicyB1cGRhdGVcbiAgICAgICAgICAgICAgICAgOyBcInBvc3RcIiwgcmVjZWl2ZV9tZXNzYWdlIGFwcFxuICAgICAgICAgICAgICAgIHxdXG4gICAgICAgIClcblxuXG5cblxuXG5cbmxldCBiYXNpY19hcHBsaWNhdGlvblxuICAgICAgICAoc3RhdGU6ICAgJ3MpXG4gICAgICAgIChjb21tYW5kOiAnbSBDb21tYW5kLnQpXG4gICAgICAgICh2aWV3OiAgICAoJ3MsICdtKSB2aWV3MilcbiAgICAgICAgKHN1YjogICAgICdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAgKCdzLCAnbSkgdXBkYXRlMilcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbGV0IHBvc3QgXyA9ICgpXG4gICAgaW5cbiAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgIFwibG9hZFwiXG4gICAgICAgIChmdW4gXyAtPlxuICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgcm9vdCAgPSBEb2N1bWVudC5ib2R5IChkb2N1bWVudCAoKSk7XG4gICAgICAgICAgICAgICAgIGRvbSAgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgc3VicyAgPSBOb25lO1xuICAgICAgICAgICAgICAgICBvcGVyYXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgIEFwcCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF92aWV3IHZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9zdWJzY3JpcHRpb24gc3ViLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdXBkYXRlIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICBzdGFydF9hcHBsaWNhdGlvbiBkYXRhIGNvbW1hbmQgcG9zdFxuICAgICAgICApXG4gICAgICAgIFdpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKTtcbiIsIm1vZHVsZSBSYW5kb20gPVxuc3RydWN0XG4gICAgaW5jbHVkZSBSYW5kb21cbmVuZFxuXG5cblxuXG5cblxubW9kdWxlIFRpbWUgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBUaW1lXG5lbmRcblxuXG5cblxuXG5cblxubW9kdWxlIFRhc2sgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBUYXNrXG5lbmRcblxuXG5cblxuXG5tb2R1bGUgVmFsdWUgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBGbWxpYl9qcy5CYXNlLlZhbHVlXG5cbiAgICBsZXQgcmVjb3JkID0gX29iamVjdFxuZW5kXG5cblxuXG5cbm1vZHVsZSBFdmVudF9mbGFnID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgRXZlbnRfZmxhZ1xuZW5kXG5cblxuXG5cblxuXG5tb2R1bGUgRGVjb2RlciA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIEZtbGliX2pzLkJhc2UuRGVjb2RlXG5cblxuICAgIGxldCBydW4gKGRlY29kZTogJ2EgdCkgKHY6IFZhbHVlLnQpOiAnYSBvcHRpb24gPVxuICAgICAgICBkZWNvZGUgdlxuZW5kXG5cblxuXG5cblxuXG5tb2R1bGUgQ29tbWFuZCA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIENvbW1hbmRcbmVuZFxuXG5cblxuXG5cblxubW9kdWxlIFN1YnNjcmlwdGlvbiA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFN1YnNjcmlwdGlvblxuZW5kXG5cblxuXG5sZXQgZGVidWcgKHN0cjogc3RyaW5nKTogdW5pdCA9XG4gICAgbGV0IG9wZW4gRm1saWJfanMuQmFzZS5NYWluIGluXG4gICAgbG9nX3N0cmluZyBzdHJcblxuXG5cbmxldCBkZWJ1Z192YWx1ZSAodjogVmFsdWUudCk6IHVuaXQgPVxuICAgIGxldCBvcGVuIEZtbGliX2pzLkJhc2UuTWFpbiBpblxuICAgIGxvZ192YWx1ZSB2XG5cblxuXG5cbm1vZHVsZSBBdHRyaWJ1dGUgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBBdHRyaWJ1dGVcblxuICAgIGxldCBvbiAoa2V5OiBzdHJpbmcpIChkZWNvZGU6ICdtc2cgRGVjb2Rlci50KTogJ21zZyB0ID1cbiAgICAgICAgaGFuZGxlclxuICAgICAgICAgICAga2V5XG4gICAgICAgICAgICBFdmVudF9mbGFnLm5vX3N0b3BcbiAgICAgICAgICAgIEV2ZW50X2ZsYWcubm9fcHJldmVudFxuICAgICAgICAgICAgZGVjb2RlXG5cbiAgICBsZXQgb25fY2xpY2sgKG1zZzogJ21zZyk6ICdtc2cgdCA9XG4gICAgICAgIG9uIFwiY2xpY2tcIiAoRGVjb2Rlci5yZXR1cm4gbXNnKVxuXG5cbiAgICAoKiBTdHlsZXMgKilcblxuICAgIGxldCBmb250X3NpemUgKHNpemU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImZvbnQtc2l6ZVwiIHNpemVcblxuICAgIGxldCBjb2xvciAoY29sb3I6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImNvbG9yXCIgY29sb3JcblxuICAgIGxldCBiYWNrZ3JvdW5kX2NvbG9yIChjb2xvcjogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiYmFja2dyb3VuZC1jb2xvclwiIGNvbG9yXG5cbiAgICBsZXQgaGVpZ2h0ICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiaGVpZ2h0XCIgdmFsdWVcblxuICAgIGxldCB3aWR0aCAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcIndpZHRoXCIgdmFsdWVcblxuICAgIGxldCBtYXJnaW4gKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJtYXJnaW5cIiB2YWx1ZVxuXG4gICAgbGV0IHBhZGRpbmcgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJwYWRkaW5nXCIgdmFsdWVcblxuICAgIGxldCBib3JkZXJfc3R5bGUgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJib3JkZXItc3R5bGVcIiB2YWx1ZVxuXG4gICAgbGV0IGJvcmRlcl93aWR0aCAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImJvcmRlci13aWR0aFwiIHZhbHVlXG5cbiAgICBsZXQgYm9yZGVyX2NvbG9yICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiYm9yZGVyLWNvbG9yXCIgdmFsdWVcblxuXG4gICAgKCogQXR0cmlidXRlcyAqKVxuXG4gICAgbGV0IGlkICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcImlkXCIgdmFsdWVcblxuICAgIGxldCBjbGFzc18gKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwiY2xhc3NcIiB2YWx1ZVxuXG4gICAgbGV0IGhyZWYgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwiaHJlZlwiIHZhbHVlXG5cbiAgICBsZXQgc3JjICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcInNyY1wiIHZhbHVlXG5cbiAgICBsZXQgdGl0bGUgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwidGl0bGVcIiB2YWx1ZVxuXG4gICAgbGV0IHZhbHVlICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHByb3BlcnR5IFwidmFsdWVcIiBWYWx1ZS4oc3RyaW5nIHZhbHVlKVxuXG4gICAgbGV0IHBsYWNlaG9sZGVyICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCIgdmFsdWVcblxuXG4gICAgbGV0IG9uX2lucHV0IChmOiBzdHJpbmcgLT4gJ21zZyk6ICdtc2cgdCA9XG4gICAgICAgIGxldCBkZWNvZGUgPVxuICAgICAgICAgICAgbGV0IG9wZW4gRGVjb2RlciBpblxuICAgICAgICAgICAgZmllbGQgXCJ0YXJnZXRcIiAoZmllbGQgXCJ2YWx1ZVwiIChtYXAgZiBzdHJpbmcpKVxuICAgICAgICBpblxuICAgICAgICBoYW5kbGVyXG4gICAgICAgICAgICBcImlucHV0XCJcbiAgICAgICAgICAgIEV2ZW50X2ZsYWcuc3RvcFxuICAgICAgICAgICAgRXZlbnRfZmxhZy5ub19wcmV2ZW50XG4gICAgICAgICAgICBkZWNvZGVcbmVuZFxuXG5cblxuXG5cblxuXG5tb2R1bGUgSHRtbCA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFZkb21cblxuXG4gICAgbGV0IGgxIGF0dHJzIG5vZGVzID0gbm9kZSBcImgxXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaDIgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDJcIiBhdHRycyBub2Rlc1xuICAgIGxldCBoMyBhdHRycyBub2RlcyA9IG5vZGUgXCJoM1wiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGg0IGF0dHJzIG5vZGVzID0gbm9kZSBcImg0XCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaDUgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDVcIiBhdHRycyBub2Rlc1xuICAgIGxldCBoNiBhdHRycyBub2RlcyA9IG5vZGUgXCJoNlwiIGF0dHJzIG5vZGVzXG5cbiAgICBsZXQgZGl2IGF0dHJzIG5vZGVzICA9IG5vZGUgXCJkaXZcIiBhdHRycyBub2Rlc1xuICAgIGxldCBzcGFuIGF0dHJzIG5vZGVzID0gbm9kZSBcInNwYW5cIiBhdHRycyBub2Rlc1xuICAgIGxldCBwcmUgYXR0cnMgbm9kZXMgID0gbm9kZSBcInByZVwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHAgYXR0cnMgbm9kZXMgICAgPSBub2RlIFwicFwiIGF0dHJzIG5vZGVzXG5cbiAgICBsZXQgYnV0dG9uIGF0dHJzIG5vZGVzICAgPSBub2RlIFwiYnV0dG9uXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaW5wdXQgYXR0cnMgbm9kZXMgICAgPSBub2RlIFwiaW5wdXRcIiBhdHRycyBub2Rlc1xuICAgIGxldCBsYWJlbCBhdHRycyBub2RlcyAgICA9IG5vZGUgXCJsYWJlbFwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHRleHRhcmVhIGF0dHJzIG5vZGVzID0gbm9kZSBcInRleHRhcmVhXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgc2VsZWN0IGF0dHJzIG5vZGVzICAgPSBub2RlIFwic2VsZWN0XCIgYXR0cnMgbm9kZXNcblxuICAgIGxldCBvbCBhdHRycyBub2RlcyAgPSBub2RlIFwib2xcIiBhdHRycyBub2Rlc1xuICAgIGxldCB1bCBhdHRycyBub2RlcyAgPSBub2RlIFwidWxcIiBhdHRycyBub2Rlc1xuICAgIGxldCBsaSBhdHRycyBub2RlcyAgPSBub2RlIFwibGlcIiBhdHRycyBub2Rlc1xuXG4gICAgbGV0IHN2Z19ub2RlIHRhZyBhdHRycyBub2RlcyA9XG4gICAgICAgIG5vZGVfbnMgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHRhZyBhdHRycyBub2Rlc1xuZW5kXG5cblxuaW5jbHVkZSBCcm93c2VyXG4iLCJvcGVuIEZtbGliX2Jyb3dzZXJcbm9wZW4gRm1saWJfc3RkXG5cbnR5cGUgdW5kbyA9IFtcbiAgICB8IGBEcmF3XG4gICAgfCBgUmVzaXplIG9mIGludCAqIGludCAgKCogY2lyY2xlIGlkLCBvbGQgcmFkaXVzICopXG5dXG5cbnR5cGUgcmVkbyA9IFtcbiAgICB8IGBSZWRyYXcgb2YgaW50ICogaW50ICAoKiB4LCB5ICopXG4gICAgfCBgUmVzaXplIG9mIGludCAqIGludCAgKCogY2lyY2xlIGlkLCBuZXcgcmFkaXVzICopXG5dXG5cblxudHlwZSBjaXJjbGUgPSB7XG4gICAgY2VudGVyX3g6IGludDtcbiAgICBjZW50ZXJfeTogaW50O1xuICAgIHJhZGl1czogaW50O1xuICAgIHNlbGVjdGVkOiBib29sO1xufVxuXG5cbnR5cGUgc3RhdGUgPSB7XG4gICAgcmVzaXppbmc6IChpbnQgKiBpbnQpIG9wdGlvbjsgICAoKiBjaXJjbGUgaWQsIG9sZCByYWRpdXMgKilcbiAgICB1bmRvOiB1bmRvIGxpc3Q7XG4gICAgcmVkbzogcmVkbyBsaXN0O1xuICAgIGNpcmNsZXM6IGNpcmNsZSBhcnJheTtcbn1cblxudHlwZSBtc2cgPVxuICAgIHwgSWdub3JlXG4gICAgfCBFbnRlciBvZiBpbnRcbiAgICB8IExlYXZlIG9mIGludFxuICAgIHwgRHJhdyBvZiBpbnQgKiBpbnQgICAgICAgICAoKiB4LCB5IHBvc2l0aW9uIG9mIG5ldyBjaXJjbGUgKilcbiAgICB8IFRyeV9yZXNpemUgb2YgaW50ICAgICAgICAgKCogbmV3IHJhZGl1cyAqKVxuICAgIHwgUmVzaXplXG4gICAgfCBSZXNpemluZyBvZiBpbnQgKiBpbnQgICAgICgqIGNpcmNsZSBpZCwgb2xkIHJhZGl1cyopXG4gICAgfCBVbmRvXG4gICAgfCBSZWRvXG5cblxubGV0IGRlZmF1bHRfY2lyY2xlIChjZW50ZXJfeDogaW50KSAoY2VudGVyX3k6IGludCk6IGNpcmNsZSA9XG4gICAge2NlbnRlcl94OyBjZW50ZXJfeTsgc2VsZWN0ZWQgPSBmYWxzZTsgcmFkaXVzID0gMjB9XG5cblxubGV0IGluaXQ6IHN0YXRlID0ge1xuICAgIHJlc2l6aW5nID0gTm9uZTtcbiAgICB1bmRvID0gW107XG4gICAgcmVkbyA9IFtdO1xuICAgIGNpcmNsZXMgPSBbfHxdO1xufVxuXG5cbmxldCB1cGRhdGUgKHN0YXRlOiBzdGF0ZSk6IG1zZyAtPiBzdGF0ZSA9XG4gICAgZnVuY3Rpb25cbiAgICB8IElnbm9yZSAtPlxuICAgICAgICBzdGF0ZVxuXG4gICAgfCBFbnRlciBpZCAtPlxuICAgICAgICBsZXQgY2lyY2xlID0gc3RhdGUuY2lyY2xlcy4oaWQpIGluXG4gICAgICAgIHtzdGF0ZSB3aXRoXG4gICAgICAgICBjaXJjbGVzID1cbiAgICAgICAgICAgICBBcnJheS5yZXBsYWNlXG4gICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgIHtjaXJjbGUgd2l0aCBzZWxlY3RlZCA9IHRydWV9XG4gICAgICAgICAgICAgICAgIHN0YXRlLmNpcmNsZXNcbiAgICAgICAgfVxuXG4gICAgfCBMZWF2ZSBpZCAtPlxuICAgICAgICBsZXQgY2lyY2xlID0gc3RhdGUuY2lyY2xlcy4oaWQpIGluXG4gICAgICAgIHtzdGF0ZSB3aXRoXG4gICAgICAgICBjaXJjbGVzID1cbiAgICAgICAgICAgICBBcnJheS5yZXBsYWNlXG4gICAgICAgICAgICAgICAgIGlkXG4gICAgICAgICAgICAgICAgIHtjaXJjbGUgd2l0aCBzZWxlY3RlZCA9IGZhbHNlfVxuICAgICAgICAgICAgICAgICBzdGF0ZS5jaXJjbGVzXG4gICAgICAgIH1cblxuICAgIHwgRHJhdyAoY2VudGVyX3gsIGNlbnRlcl95KSAtPlxuICAgICAgICB7c3RhdGUgd2l0aFxuICAgICAgICAgY2lyY2xlcyA9IEFycmF5LnB1c2ggKGRlZmF1bHRfY2lyY2xlIGNlbnRlcl94IGNlbnRlcl95KSBzdGF0ZS5jaXJjbGVzO1xuICAgICAgICAgdW5kbyAgICA9IGBEcmF3IDo6IHN0YXRlLnVuZG87XG4gICAgICAgICByZWRvICAgID0gW107XG4gICAgICAgIH1cblxuICAgIHwgVHJ5X3Jlc2l6ZSByYWRpdXMgLT5cbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RhdGUucmVzaXppbmcgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBjYW5ub3QgaGFwcGVuICopXG4gICAgICAgIHwgU29tZSAoaWQsIF8pIC0+XG4gICAgICAgICAgICBsZXQgY2lyY2xlID0gc3RhdGUuY2lyY2xlcy4oaWQpIGluXG4gICAgICAgICAgICB7c3RhdGUgd2l0aFxuICAgICAgICAgICAgIGNpcmNsZXMgPSBBcnJheS5yZXBsYWNlIGlkIHtjaXJjbGUgd2l0aCByYWRpdXN9IHN0YXRlLmNpcmNsZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVuZFxuXG4gICAgfCBSZXNpemUgLT5cbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RhdGUucmVzaXppbmcgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBjYW5ub3QgaGFwcGVuICopXG4gICAgICAgIHwgU29tZSAoaSwgb2xkX3JhZGl1cykgLT5cbiAgICAgICAgICAgIHtzdGF0ZSB3aXRoXG4gICAgICAgICAgICAgcmVzaXppbmcgPSBOb25lO1xuICAgICAgICAgICAgIHVuZG8gPSBgUmVzaXplIChpLCBvbGRfcmFkaXVzKSA6OiBzdGF0ZS51bmRvO1xuICAgICAgICAgICAgIHJlZG8gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZW5kXG5cbiAgICB8IFJlc2l6aW5nIChpZCwgb2xkX3JhZGl1cykgLT5cbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RhdGUucmVzaXppbmcgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHtzdGF0ZSB3aXRoIHJlc2l6aW5nID0gU29tZSAoaWQsIG9sZF9yYWRpdXMpfVxuICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgc3RhdGUgICAoKiBJZ25vcmUgZXZlbnQsIGFscmVhZHkgcmVzaXppbmcgYW5vdGhlciBjaXJjbGUgKilcbiAgICAgICAgZW5kXG5cbiAgICB8IFVuZG8gLT5cbiAgICAgICAgYmVnaW5cbiAgICAgICAgICAgIG1hdGNoIHN0YXRlLnVuZG8gd2l0aFxuICAgICAgICAgICAgfCBgRHJhdyA6OiB1bmRvIC0+XG4gICAgICAgICAgICAgICAgYXNzZXJ0IChzdGF0ZS5yZXNpemluZyA9IE5vbmUpO1xuICAgICAgICAgICAgICAgIGFzc2VydCAoMCA8IEFycmF5Lmxlbmd0aCBzdGF0ZS5jaXJjbGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY2lyY2xlID0gQXJyYXkubGFzdCBzdGF0ZS5jaXJjbGVzIGluXG4gICAgICAgICAgICAgICAge3N0YXRlIHdpdGhcbiAgICAgICAgICAgICAgICAgY2lyY2xlcyA9IEFycmF5LnJlbW92ZV9sYXN0IHN0YXRlLmNpcmNsZXM7XG4gICAgICAgICAgICAgICAgIHVuZG87XG4gICAgICAgICAgICAgICAgIHJlZG8gPSBgUmVkcmF3IChjaXJjbGUuY2VudGVyX3gsIGNpcmNsZS5jZW50ZXJfeSkgOjogc3RhdGUucmVkbztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IGBSZXNpemUgKGlkLCByYWRpdXMpIDo6IHVuZG8gLT5cbiAgICAgICAgICAgICAgICBhc3NlcnQgKHN0YXRlLnJlc2l6aW5nID0gTm9uZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0IChpZCA8IEFycmF5Lmxlbmd0aCBzdGF0ZS5jaXJjbGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY2lyY2xlID0gc3RhdGUuY2lyY2xlcy4oaWQpIGluXG4gICAgICAgICAgICAgICAge3N0YXRlIHdpdGhcbiAgICAgICAgICAgICAgICAgY2lyY2xlcyA9IEFycmF5LnJlcGxhY2UgaWQge2NpcmNsZSB3aXRoIHJhZGl1c30gc3RhdGUuY2lyY2xlcztcbiAgICAgICAgICAgICAgICAgdW5kbztcbiAgICAgICAgICAgICAgICAgcmVkbyA9IGBSZXNpemUgKGlkLCBjaXJjbGUucmFkaXVzKSA6OiBzdGF0ZS5yZWRvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogY2Fubm90IGhhcHBlbiAqKVxuICAgICAgICBlbmRcblxuICAgIHwgUmVkbyAtPlxuICAgICAgICBiZWdpblxuICAgICAgICAgICAgbWF0Y2ggc3RhdGUucmVkbyB3aXRoXG4gICAgICAgICAgICB8IGBSZWRyYXcgKGNlbnRlcl94LCBjZW50ZXJfeSkgOjogcmVkbyAtPlxuICAgICAgICAgICAgICAgIHtzdGF0ZSB3aXRoXG4gICAgICAgICAgICAgICAgIGNpcmNsZXMgPVxuICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHVzaCAoZGVmYXVsdF9jaXJjbGUgY2VudGVyX3ggY2VudGVyX3kpIHN0YXRlLmNpcmNsZXM7XG4gICAgICAgICAgICAgICAgIHVuZG8gPSBgRHJhdyA6OiBzdGF0ZS51bmRvO1xuICAgICAgICAgICAgICAgICByZWRvXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB8IGBSZXNpemUgKGlkLCByYWRpdXMpIDo6IHJlZG8gLT5cbiAgICAgICAgICAgICAgICBhc3NlcnQgKHN0YXRlLnJlc2l6aW5nID0gTm9uZSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0IChpZCA8IEFycmF5Lmxlbmd0aCBzdGF0ZS5jaXJjbGVzKTtcbiAgICAgICAgICAgICAgICBsZXQgY2lyY2xlID0gc3RhdGUuY2lyY2xlcy4oaWQpIGluXG4gICAgICAgICAgICAgICAge3N0YXRlIHdpdGhcbiAgICAgICAgICAgICAgICAgY2lyY2xlcyA9IEFycmF5LnJlcGxhY2UgaWQge2NpcmNsZSB3aXRoIHJhZGl1c30gc3RhdGUuY2lyY2xlcztcbiAgICAgICAgICAgICAgICAgdW5kbyA9IGBSZXNpemUgKGlkLCBjaXJjbGUucmFkaXVzKSA6OiBzdGF0ZS51bmRvO1xuICAgICAgICAgICAgICAgICByZWRvO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBjYW5ub3QgaGFwcGVuICopXG4gICAgICAgIGVuZFxuXG5cblxubGV0IHZpZXdfY2lyY2xlIChpOiBpbnQpIChjaXJjbGU6IGNpcmNsZSk6IG1zZyBIdG1sLnQgPVxuICAgIGxldCBvcGVuIEh0bWwgaW5cbiAgICBsZXQgb3BlbiBBdHRyaWJ1dGUgaW5cbiAgICBsZXQgaW50X2F0dHIga2V5IGkgPVxuICAgICAgICBhdHRyaWJ1dGUga2V5IChzdHJpbmdfb2ZfaW50IGkpXG4gICAgaW5cbiAgICBzdmdfbm9kZVxuICAgICAgICBcImNpcmNsZVwiXG4gICAgICAgIFsgaW50X2F0dHIgXCJjeFwiIGNpcmNsZS5jZW50ZXJfeFxuICAgICAgICA7IGludF9hdHRyIFwiY3lcIiBjaXJjbGUuY2VudGVyX3lcbiAgICAgICAgOyBpbnRfYXR0ciBcInJcIiAgY2lyY2xlLnJhZGl1c1xuICAgICAgICA7IG9uIFwibW91c2VlbnRlclwiIERlY29kZXIuKHJldHVybiAoRW50ZXIgaSkpXG4gICAgICAgIDsgb24gXCJtb3VzZWxlYXZlXCIgRGVjb2Rlci4ocmV0dXJuIChMZWF2ZSBpKSlcbiAgICAgICAgOyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgXCJjbGlja1wiXG4gICAgICAgICAgICAgICAgRXZlbnRfZmxhZy5zdG9wICgqIHN0b3AsIG90aGVyd2lzZSBidWJibGVzIHRvIHN2ZyB3aGljaCBtYWtlcyBhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBjaXJjbGUgKilcbiAgICAgICAgICAgICAgICBFdmVudF9mbGFnLm5vX3ByZXZlbnRcbiAgICAgICAgICAgICAgICBEZWNvZGVyLihyZXR1cm4gKFJlc2l6aW5nIChpLCBjaXJjbGUucmFkaXVzKSkpXG4gICAgICAgIDsgc3R5bGUgXCJzdHJva2VcIiBcImJsYWNrXCJcbiAgICAgICAgOyBzdHlsZSBcInN0cm9rZS13aWR0aFwiIFwiMlwiXG4gICAgICAgIDsgc3R5bGVcbiAgICAgICAgICAgICAgICBcImZpbGxcIlxuICAgICAgICAgICAgICAgIChpZiBjaXJjbGUuc2VsZWN0ZWQgdGhlbiBcImJsdWVcIiBlbHNlIFwiZ3JheVwiKVxuICAgICAgICBdIFtdXG5cblxubGV0IHZpZXdfY2lyY2xlcyAoc3RhdGU6IHN0YXRlKTogbXNnIEh0bWwudCBsaXN0ID1cbiAgICBMaXN0LnJldlxuICAgICAgICAoQXJyYXkuZm9sZGlfbGVmdFxuICAgICAgICAgICAgIChmdW4gbHN0IGkgY2lyY2xlIC0+IHZpZXdfY2lyY2xlIGkgY2lyY2xlIDo6IGxzdClcbiAgICAgICAgICAgICBbXVxuICAgICAgICAgICAgIHN0YXRlLmNpcmNsZXMpXG5cblxuXG5cbmxldCB2aWV3X3Jlc2l6ZSAoc3RhdGU6IHN0YXRlKTogbXNnIEh0bWwudCBsaXN0ID1cbiAgICBsZXQgb3BlbiBIdG1sIGluXG4gICAgbGV0IG9wZW4gQXR0cmlidXRlIGluXG4gICAgbWF0Y2ggc3RhdGUucmVzaXppbmcgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBbXVxuICAgIHwgU29tZSAoaSwgXykgLT5cbiAgICAgICAgbGV0IGNpcmNsZSA9IHN0YXRlLmNpcmNsZXMuKGkpIGluXG4gICAgICAgIFsgaW5wdXQgW1xuICAgICAgICAgICAgICBhdHRyaWJ1dGUgXCJ0eXBlXCIgXCJyYW5nZVwiXG4gICAgICAgICAgICA7IGF0dHJpYnV0ZSBcIm1pblwiIFwiMTBcIlxuICAgICAgICAgICAgOyBhdHRyaWJ1dGUgXCJtYXhcIiBcIjEwMFwiXG4gICAgICAgICAgICA7IGF0dHJpYnV0ZSBcInN0ZXBcIiBcIjFcIlxuICAgICAgICAgICAgOyBhdHRyaWJ1dGUgXCJkaXNwbGF5XCIgXCJibG9ja1wiXG4gICAgICAgICAgICA7IG9uX2lucHV0XG4gICAgICAgICAgICAgICAgICAoZnVuIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IHZhbHVlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogY2Fubm90IGhhcHBlbiAqKVxuICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgcmFkaXVzIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBUcnlfcmVzaXplIHJhZGl1cylcbiAgICAgICAgICAgIDsgdmFsdWUgKHN0cmluZ19vZl9pbnQgY2lyY2xlLnJhZGl1cylcbiAgICAgICAgICBdIFtdXG4gICAgICAgIDsgYnV0dG9uIFtvbl9jbGljayBSZXNpemVdIFt0ZXh0IFwiT2tcIl1cbiAgICAgICAgXVxuXG5cbmxldCB2aWV3IChzdGF0ZTogc3RhdGUpOiBtc2cgSHRtbC50ID1cbiAgICBsZXQgb3BlbiBIdG1sIGluXG4gICAgbGV0IG9wZW4gQXR0cmlidXRlIGluXG4gICAgbGV0IGRpc2FibGVkIGIgPVxuICAgICAgICBwcm9wZXJ0eSBcImRpc2FibGVkXCIgVmFsdWUuKGJvb2wgYilcbiAgICBpblxuICAgIGxldCBkaXNhYmxlZF91bmRvID1cbiAgICAgICAgZGlzYWJsZWQgKHN0YXRlLnJlc2l6aW5nIDw+IE5vbmUgfHwgc3RhdGUudW5kbyA9IFtdKVxuICAgIGFuZCBkaXNhYmxlZF9yZWRvID1cbiAgICAgICAgZGlzYWJsZWQgKHN0YXRlLnJlc2l6aW5nIDw+IE5vbmUgfHwgc3RhdGUucmVkbyA9IFtdKVxuICAgIGluXG4gICAgZGl2IFtdIChcbiAgICAgICAgaDEgW10gW3RleHQgXCJEcmF3IENpcmNsZXNcIl1cbiAgICAgICAgOjogZGl2IFtdIFtcbiAgICAgICAgICAgIGJ1dHRvbiBbb25fY2xpY2sgVW5kbzsgZGlzYWJsZWRfdW5kb10gW3RleHQgXCJVbmRvXCJdXG4gICAgICAgICAgOyBidXR0b24gW29uX2NsaWNrIFJlZG87IGRpc2FibGVkX3JlZG9dIFt0ZXh0IFwiUmVkb1wiXVxuXG4gICAgICAgIF1cbiAgICAgICAgOjogc3ZnX25vZGVcbiAgICAgICAgICAgIFwic3ZnXCJcbiAgICAgICAgICAgIFsgYXR0cmlidXRlIFwid2lkdGhcIiBcIjYwMFwiXG4gICAgICAgICAgICA7IGF0dHJpYnV0ZSBcImhlaWdodFwiIFwiNDAwXCJcbiAgICAgICAgICAgIDsgYXR0cmlidXRlIFwiZGlzcGxheVwiIFwiYmxvY2tcIlxuICAgICAgICAgICAgOyBib3JkZXJfc3R5bGUgXCJzb2xpZFwiXG4gICAgICAgICAgICA7IG9uIFwiY2xpY2tcIiAoXG4gICAgICAgICAgICAgICAgICBsZXQgb3BlbiBEZWNvZGVyIGluXG4gICAgICAgICAgICAgICAgICBsZXQqIHggPSBmaWVsZCBcIm9mZnNldFhcIiBpbnQgaW5cbiAgICAgICAgICAgICAgICAgIGxldCogeSA9IGZpZWxkIFwib2Zmc2V0WVwiIGludCBpblxuICAgICAgICAgICAgICAgICAgbGV0KiBpID0gZmllbGQgXCJidXR0b25cIiAgaW50IGluXG4gICAgICAgICAgICAgICAgICBpZiBpIDw+IDIgJiYgc3RhdGUucmVzaXppbmcgPSBOb25lIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKERyYXcgKHgsIHkpKVxuICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJZ25vcmVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgKHZpZXdfY2lyY2xlcyBzdGF0ZSlcbiAgICAgICAgOjogdmlld19yZXNpemUgc3RhdGVcbiAgICApXG5cblxubGV0IF8gPVxuICAgIHNhbmRib3ggaW5pdCB2aWV3IHVwZGF0ZVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFbnN1cmUgdGhhdCBbYXRfZXhpdF0gZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBwcm9ncmFtICopXG5cbmxldCBfID0gZG9fYXRfZXhpdCgpXG4iXX0= diff --git a/webapp/data.json b/webapp/data.json new file mode 100644 index 00000000..6d78a200 --- /dev/null +++ b/webapp/data.json @@ -0,0 +1,5 @@ +{ + "first_name": "John", + "last_name": "Doe", + "age": 45 +} diff --git a/webapp/flight.html b/webapp/flight.html new file mode 100644 index 00000000..b9d1f630 --- /dev/null +++ b/webapp/flight.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/webapp/flight.js b/webapp/flight.js new file mode 100644 index 00000000..6cd3671d --- /dev/null +++ b/webapp/flight.js @@ -0,0 +1,66684 @@ +//# 1 ".flight.eobjs/jsoo/flight.bc.runtime.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=runtime, use-js-string=true, version=5.1.1 + +//# 7 ".flight.eobjs/jsoo/flight.bc.runtime.js" +(function + (Object){ + typeof globalThis !== "object" + && + (this + ? get() + : (Object.defineProperty + (Object.prototype, "_T_", {configurable: true, get: get}), + _T_)); + function get(){ + var global = this || self; + global.globalThis = global; + delete Object.prototype._T_; + } + } + (Object)); +(function(globalThis){ + "use strict"; + function caml_int64_is_zero(x){return + x.isZero();} + function caml_str_repeat(n, s){ + if(n == 0) return ""; + if(s.repeat) return s.repeat(n); + var r = "", l = 0; + for(;;){ + if(n & 1) r += s; + n >>= 1; + if(n == 0) return r; + s += s; + l++; + if(l == 9) s.slice(0, 1); + } + } + var caml_int64_offset = Math.pow(2, - 24); + function caml_raise_constant(tag){throw tag;} + var caml_global_data = [0]; + function caml_raise_zero_divide(){ + caml_raise_constant(caml_global_data.Division_by_zero); + } + function MlInt64(lo, mi, hi){ + this.lo = lo & 0xffffff; + this.mi = mi & 0xffffff; + this.hi = hi & 0xffff; + } + MlInt64.prototype.caml_custom = "_j"; + MlInt64.prototype.copy = + function(){return new MlInt64(this.lo, this.mi, this.hi);}; + MlInt64.prototype.ucompare = + function(x){ + if(this.hi > x.hi) return 1; + if(this.hi < x.hi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.compare = + function(x){ + var hi = this.hi << 16, xhi = x.hi << 16; + if(hi > xhi) return 1; + if(hi < xhi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.neg = + function(){ + var + lo = - this.lo, + mi = - this.mi + (lo >> 24), + hi = - this.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.add = + function(x){ + var + lo = this.lo + x.lo, + mi = this.mi + x.mi + (lo >> 24), + hi = this.hi + x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.sub = + function(x){ + var + lo = this.lo - x.lo, + mi = this.mi - x.mi + (lo >> 24), + hi = this.hi - x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.mul = + function(x){ + var + lo = this.lo * x.lo, + mi = (lo * caml_int64_offset | 0) + this.mi * x.lo + this.lo * x.mi, + hi = + (mi * caml_int64_offset | 0) + this.hi * x.lo + this.mi * x.mi + + this.lo * x.hi; + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.isZero = + function(){return (this.lo | this.mi | this.hi) == 0;}; + MlInt64.prototype.isNeg = function(){return this.hi << 16 < 0;}; + MlInt64.prototype.and = + function(x){ + return new MlInt64(this.lo & x.lo, this.mi & x.mi, this.hi & x.hi); + }; + MlInt64.prototype.or = + function(x){ + return new MlInt64(this.lo | x.lo, this.mi | x.mi, this.hi | x.hi); + }; + MlInt64.prototype.xor = + function(x){ + return new MlInt64(this.lo ^ x.lo, this.mi ^ x.mi, this.hi ^ x.hi); + }; + MlInt64.prototype.shift_left = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo << s, + this.mi << s | this.lo >> 24 - s, + this.hi << s | this.mi >> 24 - s); + if(s < 48) + return new + MlInt64 + (0, this.lo << s - 24, this.mi << s - 24 | this.lo >> 48 - s); + return new MlInt64(0, 0, this.lo << s - 48); + }; + MlInt64.prototype.shift_right_unsigned = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | this.hi << 24 - s, + this.hi >> s); + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, this.hi >> s - 24, 0); + return new MlInt64(this.hi >> s - 48, 0, 0); + }; + MlInt64.prototype.shift_right = + function(s){ + s = s & 63; + if(s == 0) return this; + var h = this.hi << 16 >> 16; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | h << 24 - s, + this.hi << 16 >> s >>> 16); + var sign = this.hi << 16 >> 31; + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, + this.hi << 16 >> s - 24 >> 16, + sign & 0xffff); + return new MlInt64(this.hi << 16 >> s - 32, sign, sign); + }; + MlInt64.prototype.lsl1 = + function(){ + this.hi = this.hi << 1 | this.mi >> 23; + this.mi = (this.mi << 1 | this.lo >> 23) & 0xffffff; + this.lo = this.lo << 1 & 0xffffff; + }; + MlInt64.prototype.lsr1 = + function(){ + this.lo = (this.lo >>> 1 | this.mi << 23) & 0xffffff; + this.mi = (this.mi >>> 1 | this.hi << 23) & 0xffffff; + this.hi = this.hi >>> 1; + }; + MlInt64.prototype.udivmod = + function(x){ + var + offset = 0, + modulus = this.copy(), + divisor = x.copy(), + quotient = new MlInt64(0, 0, 0); + while(modulus.ucompare(divisor) > 0){offset++; divisor.lsl1();} + while(offset >= 0){ + offset--; + quotient.lsl1(); + if(modulus.ucompare(divisor) >= 0){ + quotient.lo++; + modulus = modulus.sub(divisor); + } + divisor.lsr1(); + } + return {quotient: quotient, modulus: modulus}; + }; + MlInt64.prototype.div = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi ^ y.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var q = x.udivmod(y).quotient; + if(sign & 0x8000) q = q.neg(); + return q; + }; + MlInt64.prototype.mod = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var r = x.udivmod(y).modulus; + if(sign & 0x8000) r = r.neg(); + return r; + }; + MlInt64.prototype.toInt = function(){return this.lo | this.mi << 24;}; + MlInt64.prototype.toFloat = + function(){ + return (this.hi << 16) * Math.pow(2, 32) + this.mi * Math.pow(2, 24) + + this.lo; + }; + MlInt64.prototype.toArray = + function(){ + return [this.hi >> 8, + this.hi & 0xff, + this.mi >> 16, + this.mi >> 8 & 0xff, + this.mi & 0xff, + this.lo >> 16, + this.lo >> 8 & 0xff, + this.lo & 0xff]; + }; + MlInt64.prototype.lo32 = + function(){return this.lo | (this.mi & 0xff) << 24;}; + MlInt64.prototype.hi32 = + function(){return this.mi >>> 8 & 0xffff | this.hi << 16;}; + function caml_int64_of_int32(x){ + return new MlInt64(x & 0xffffff, x >> 24 & 0xffffff, x >> 31 & 0xffff); + } + function caml_int64_to_int32(x){return x.toInt();} + function caml_int64_is_negative(x){return + x.isNeg();} + function caml_int64_neg(x){return x.neg();} + function caml_jsbytes_of_string(x){return x;} + function jsoo_sys_getenv(n){ + var process = globalThis.process; + if(process && process.env && process.env[n] != undefined) + return process.env[n]; + if(globalThis.jsoo_static_env && globalThis.jsoo_static_env[n]) + return globalThis.jsoo_static_env[n]; + } + var caml_record_backtrace_flag = 0; + (function(){ + var r = jsoo_sys_getenv("OCAMLRUNPARAM"); + if(r !== undefined){ + var l = r.split(","); + for(var i = 0; i < l.length; i++) + if(l[i] == "b"){ + caml_record_backtrace_flag = 1; + break; + } + else if(l[i].startsWith("b=")) + caml_record_backtrace_flag = + l[i].slice(2); + else + continue; + } + } + ()); + function caml_exn_with_js_backtrace(exn, force){ + if(! exn.js_error || force || exn[0] == 248) + exn.js_error = new globalThis.Error("Js exception containing backtrace"); + return exn; + } + function caml_maybe_attach_backtrace(exn, force){ + return caml_record_backtrace_flag + ? caml_exn_with_js_backtrace(exn, force) + : exn; + } + function caml_raise_with_arg(tag, arg){ + throw caml_maybe_attach_backtrace([0, tag, arg]); + } + function caml_string_of_jsbytes(x){return x;} + function caml_raise_with_string(tag, msg){ + caml_raise_with_arg(tag, caml_string_of_jsbytes(msg)); + } + function caml_invalid_argument(msg){ + caml_raise_with_string(caml_global_data.Invalid_argument, msg); + } + function caml_parse_format(fmt){ + fmt = caml_jsbytes_of_string(fmt); + var len = fmt.length; + if(len > 31) caml_invalid_argument("format_int: format too long"); + var + f = + {justify: "+", + signstyle: "-", + filler: " ", + alternate: false, + base: 0, + signedconv: false, + width: 0, + uppercase: false, + sign: 1, + prec: - 1, + conv: "f"}; + for(var i = 0; i < len; i++){ + var c = fmt.charAt(i); + switch(c){ + case "-": + f.justify = "-"; break; + case "+": + case " ": + f.signstyle = c; break; + case "0": + f.filler = "0"; break; + case "#": + f.alternate = true; break; + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + f.width = 0; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.width = f.width * 10 + c; i++;} + i--; + break; + case ".": + f.prec = 0; + i++; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.prec = f.prec * 10 + c; i++;} + i--; + case "d": + case "i": + f.signedconv = true; + case "u": + f.base = 10; break; + case "x": + f.base = 16; break; + case "X": + f.base = 16; f.uppercase = true; break; + case "o": + f.base = 8; break; + case "e": + case "f": + case "g": + f.signedconv = true; f.conv = c; break; + case "E": + case "F": + case "G": + f.signedconv = true; + f.uppercase = true; + f.conv = c.toLowerCase(); + break; + } + } + return f; + } + function caml_finish_formatting(f, rawbuffer){ + if(f.uppercase) rawbuffer = rawbuffer.toUpperCase(); + var len = rawbuffer.length; + if(f.signedconv && (f.sign < 0 || f.signstyle != "-")) len++; + if(f.alternate){if(f.base == 8) len += 1; if(f.base == 16) len += 2;} + var buffer = ""; + if(f.justify == "+" && f.filler == " ") + for(var i = len; i < f.width; i++) buffer += " "; + if(f.signedconv) + if(f.sign < 0) + buffer += "-"; + else if(f.signstyle != "-") buffer += f.signstyle; + if(f.alternate && f.base == 8) buffer += "0"; + if(f.alternate && f.base == 16) buffer += f.uppercase ? "0X" : "0x"; + if(f.justify == "+" && f.filler == "0") + for(var i = len; i < f.width; i++) buffer += "0"; + buffer += rawbuffer; + if(f.justify == "-") for(var i = len; i < f.width; i++) buffer += " "; + return caml_string_of_jsbytes(buffer); + } + function caml_int64_format(fmt, x){ + var f = caml_parse_format(fmt); + if(f.signedconv && caml_int64_is_negative(x)){f.sign = - 1; x = caml_int64_neg(x);} + var + buffer = "", + wbase = caml_int64_of_int32(f.base), + cvtbl = "0123456789abcdef"; + do{ + var p = x.udivmod(wbase); + x = p.quotient; + buffer = cvtbl.charAt(caml_int64_to_int32(p.modulus)) + buffer; + } + while + (! caml_int64_is_zero(x)); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - buffer.length; + if(n > 0) buffer = caml_str_repeat(n, "0") + buffer; + } + return caml_finish_formatting(f, buffer); + } + function caml_expm1_float(x){return Math.expm1(x);} + function caml_ml_condition_broadcast(t){return 0;} + function jsoo_is_ascii(s){ + if(s.length < 24){ + for(var i = 0; i < s.length; i++) if(s.charCodeAt(i) > 127) return false; + return true; + } + else + return ! /[^\x00-\x7f]/.test(s); + } + function caml_utf16_of_utf8(s){ + for(var b = "", t = "", c, c1, c2, v, i = 0, l = s.length; i < l; i++){ + c1 = s.charCodeAt(i); + if(c1 < 0x80){ + for(var j = i + 1; j < l && (c1 = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + v = 1; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c1 << 6); + if(c1 < 0xe0){ + v = c - 0x3080; + if(v < 0x80) v = 1; + } + else{ + v = 2; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c << 6); + if(c1 < 0xf0){ + v = c - 0xe2080; + if(v < 0x800 || v >= 0xd7ff && v < 0xe000) v = 2; + } + else{ + v = 3; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128 && c1 < 0xf5){ + v = c2 - 0x3c82080 + (c << 6); + if(v < 0x10000 || v > 0x10ffff) v = 3; + } + } + } + } + } + if(v < 4){ + i -= v; + t += "\ufffd"; + } + else if(v > 0xffff) + t += String.fromCharCode(0xd7c0 + (v >> 10), 0xdc00 + (v & 0x3FF)); + else + t += String.fromCharCode(v); + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_jsstring_of_string(s){ + if(jsoo_is_ascii(s)) return s; + return caml_utf16_of_utf8(s); + } + function fs_node_supported(){ + return typeof globalThis.process !== "undefined" + && typeof globalThis.process.versions !== "undefined" + && typeof globalThis.process.versions.node !== "undefined"; + } + function make_path_is_absolute(){ + function posix(path){ + if(path.charAt(0) === "/") return ["", path.substring(1)]; + return; + } + function win32(path){ + var + splitDeviceRe = + /^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/, + result = splitDeviceRe.exec(path), + device = result[1] || "", + isUnc = Boolean(device && device.charAt(1) !== ":"); + if(Boolean(result[2] || isUnc)){ + var root = result[1] || "", sep = result[2] || ""; + return [root, path.substring(root.length + sep.length)]; + } + return; + } + return fs_node_supported() && globalThis.process + && globalThis.process.platform + ? globalThis.process.platform === "win32" ? win32 : posix + : posix; + } + var path_is_absolute = make_path_is_absolute(); + function caml_trailing_slash(name){ + return name.slice(- 1) !== "/" ? name + "/" : name; + } + if(fs_node_supported() && globalThis.process && globalThis.process.cwd) + var caml_current_dir = globalThis.process.cwd().replace(/\\/g, "/"); + else + var caml_current_dir = "/static"; + caml_current_dir = caml_trailing_slash(caml_current_dir); + function caml_make_path(name){ + name = caml_jsstring_of_string(name); + if(! path_is_absolute(name)) name = caml_current_dir + name; + var + comp0 = path_is_absolute(name), + comp = comp0[1].split("/"), + ncomp = []; + for(var i = 0; i < comp.length; i++) + switch(comp[i]){ + case "..": + if(ncomp.length > 1) ncomp.pop(); break; + case ".": break; + case "": break; + default: ncomp.push(comp[i]); break; + } + ncomp.unshift(comp0[0]); + ncomp.orig = name; + return ncomp; + } + function caml_utf8_of_utf16(s){ + for(var b = "", t = b, c, d, i = 0, l = s.length; i < l; i++){ + c = s.charCodeAt(i); + if(c < 0x80){ + for(var j = i + 1; j < l && (c = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + if(c < 0x800){ + t += String.fromCharCode(0xc0 | c >> 6); + t += String.fromCharCode(0x80 | c & 0x3f); + } + else if(c < 0xd800 || c >= 0xdfff) + t += + String.fromCharCode + (0xe0 | c >> 12, 0x80 | c >> 6 & 0x3f, 0x80 | c & 0x3f); + else if + (c >= 0xdbff || i + 1 == l || (d = s.charCodeAt(i + 1)) < 0xdc00 + || d > 0xdfff) + t += "\xef\xbf\xbd"; + else{ + i++; + c = (c << 10) + d - 0x35fdc00; + t += + String.fromCharCode + (0xf0 | c >> 18, + 0x80 | c >> 12 & 0x3f, + 0x80 | c >> 6 & 0x3f, + 0x80 | c & 0x3f); + } + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_string_of_jsstring(s){ + return jsoo_is_ascii(s) + ? caml_string_of_jsbytes(s) + : caml_string_of_jsbytes(caml_utf8_of_utf16(s)); + } + var + unix_error = + ["E2BIG", + "EACCES", + "EAGAIN", + "EBADF", + "EBUSY", + "ECHILD", + "EDEADLK", + "EDOM", + "EEXIST", + "EFAULT", + "EFBIG", + "EINTR", + "EINVAL", + "EIO", + "EISDIR", + "EMFILE", + "EMLINK", + "ENAMETOOLONG", + "ENFILE", + "ENODEV", + "ENOENT", + "ENOEXEC", + "ENOLCK", + "ENOMEM", + "ENOSPC", + "ENOSYS", + "ENOTDIR", + "ENOTEMPTY", + "ENOTTY", + "ENXIO", + "EPERM", + "EPIPE", + "ERANGE", + "EROFS", + "ESPIPE", + "ESRCH", + "EXDEV", + "EWOULDBLOCK", + "EINPROGRESS", + "EALREADY", + "ENOTSOCK", + "EDESTADDRREQ", + "EMSGSIZE", + "EPROTOTYPE", + "ENOPROTOOPT", + "EPROTONOSUPPORT", + "ESOCKTNOSUPPORT", + "EOPNOTSUPP", + "EPFNOSUPPORT", + "EAFNOSUPPORT", + "EADDRINUSE", + "EADDRNOTAVAIL", + "ENETDOWN", + "ENETUNREACH", + "ENETRESET", + "ECONNABORTED", + "ECONNRESET", + "ENOBUFS", + "EISCONN", + "ENOTCONN", + "ESHUTDOWN", + "ETOOMANYREFS", + "ETIMEDOUT", + "ECONNREFUSED", + "EHOSTDOWN", + "EHOSTUNREACH", + "ELOOP", + "EOVERFLOW"]; + function make_unix_err_args(code, syscall, path, errno){ + var variant = unix_error.indexOf(code); + if(variant < 0){if(errno == null) errno = - 9999; variant = [0, errno];} + var + args = + [variant, + caml_string_of_jsstring(syscall || ""), + caml_string_of_jsstring(path || "")]; + return args; + } + var caml_named_values = {}; + function caml_named_value(nm){return caml_named_values[nm];} + function caml_raise_with_args(tag, args){ + throw caml_maybe_attach_backtrace([0, tag].concat(args)); + } + function caml_subarray_to_jsbytes(a, i, len){ + var f = String.fromCharCode; + if(i == 0 && len <= 4096 && len == a.length) return f.apply(null, a); + var s = ""; + for(; 0 < len; i += 1024, len -= 1024) + s += f.apply(null, a.slice(i, i + Math.min(len, 1024))); + return s; + } + function caml_convert_string_to_bytes(s){ + if(s.t == 2) + s.c += caml_str_repeat(s.l - s.c.length, "\0"); + else + s.c = caml_subarray_to_jsbytes(s.c, 0, s.c.length); + s.t = 0; + } + function MlBytes(tag, contents, length){ + this.t = tag; + this.c = contents; + this.l = length; + } + MlBytes.prototype.toString = + function(){ + switch(this.t){ + case 9: + return this.c; + default: caml_convert_string_to_bytes(this); + case 0: + if(jsoo_is_ascii(this.c)){this.t = 9; return this.c;} this.t = 8; + case 8: + return this.c; + } + }; + MlBytes.prototype.toUtf16 = + function(){ + var r = this.toString(); + if(this.t == 9) return r; + return caml_utf16_of_utf8(r); + }; + MlBytes.prototype.slice = + function(){ + var content = this.t == 4 ? this.c.slice() : this.c; + return new MlBytes(this.t, content, this.l); + }; + function caml_is_ml_bytes(s){return s instanceof MlBytes;} + function caml_is_ml_string(s){ + return typeof s === "string" && ! /[^\x00-\xff]/.test(s); + } + function caml_bytes_of_array(a){ + if(! (a instanceof Uint8Array)) a = new Uint8Array(a); + return new MlBytes(4, a, a.length); + } + function caml_bytes_of_jsbytes(s){return new MlBytes(0, s, s.length);} + function caml_bytes_of_string(s){ + return caml_bytes_of_jsbytes(caml_jsbytes_of_string(s)); + } + function caml_raise_sys_error(msg){ + caml_raise_with_string(caml_global_data.Sys_error, msg); + } + function caml_raise_no_such_file(name){ + caml_raise_sys_error(name + ": No such file or directory"); + } + function caml_convert_bytes_to_array(s){ + var a = new Uint8Array(s.l), b = s.c, l = b.length, i = 0; + for(; i < l; i++) a[i] = b.charCodeAt(i); + for(l = s.l; i < l; i++) a[i] = 0; + s.c = a; + s.t = 4; + return a; + } + function caml_uint8_array_of_bytes(s){ + if(s.t != 4) caml_convert_bytes_to_array(s); + return s.c; + } + function caml_create_bytes(len){ + if(len < 0) caml_invalid_argument("Bytes.create"); + return new MlBytes(len ? 2 : 9, "", len); + } + function caml_ml_bytes_length(s){return s.l;} + function caml_blit_bytes(s1, i1, s2, i2, len){ + if(len == 0) return 0; + if(i2 == 0 && (len >= s2.l || s2.t == 2 && len >= s2.c.length)){ + s2.c = + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else if(s2.t == 2 && i2 == s2.c.length){ + s2.c += + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else{ + if(s2.t != 4) caml_convert_bytes_to_array(s2); + var c1 = s1.c, c2 = s2.c; + if(s1.t == 4) + if(i2 <= i1) + for(var i = 0; i < len; i++) c2[i2 + i] = c1[i1 + i]; + else + for(var i = len - 1; i >= 0; i--) c2[i2 + i] = c1[i1 + i]; + else{ + var l = Math.min(len, c1.length - i1); + for(var i = 0; i < l; i++) c2[i2 + i] = c1.charCodeAt(i1 + i); + for(; i < len; i++) c2[i2 + i] = 0; + } + } + return 0; + } + function MlFile(){} + function MlFakeFile(content){this.data = content;} + MlFakeFile.prototype = new MlFile(); + MlFakeFile.prototype.constructor = MlFakeFile; + MlFakeFile.prototype.truncate = + function(len){ + var old = this.data; + this.data = caml_create_bytes(len | 0); + caml_blit_bytes(old, 0, this.data, 0, len); + }; + MlFakeFile.prototype.length = + function(){return caml_ml_bytes_length(this.data);}; + MlFakeFile.prototype.write = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen){ + var new_str = caml_create_bytes(offset + len), old_data = this.data; + this.data = new_str; + caml_blit_bytes(old_data, 0, this.data, 0, clen); + } + caml_blit_bytes(caml_bytes_of_array(buf), pos, this.data, offset, len); + return 0; + }; + MlFakeFile.prototype.read = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen) len = clen - offset; + if(len){ + var data = caml_create_bytes(len | 0); + caml_blit_bytes(this.data, offset, data, 0, len); + buf.set(caml_uint8_array_of_bytes(data), pos); + } + return len; + }; + function MlFakeFd(name, file, flags){ + this.file = file; + this.name = name; + this.flags = flags; + } + MlFakeFd.prototype.err_closed = + function(){ + caml_raise_sys_error(this.name + ": file descriptor already closed"); + }; + MlFakeFd.prototype.length = + function(){if(this.file) return this.file.length(); this.err_closed();}; + MlFakeFd.prototype.write = + function(offset, buf, pos, len){ + if(this.file) return this.file.write(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.read = + function(offset, buf, pos, len){ + if(this.file) return this.file.read(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.close = function(){this.file = undefined;}; + function MlFakeDevice(root, f){ + this.content = {}; + this.root = root; + this.lookupFun = f; + } + MlFakeDevice.prototype.nm = function(name){return this.root + name;}; + MlFakeDevice.prototype.create_dir_if_needed = + function(name){ + var comp = name.split("/"), res = ""; + for(var i = 0; i < comp.length - 1; i++){ + res += comp[i] + "/"; + if(this.content[res]) continue; + this.content[res] = Symbol("directory"); + } + }; + MlFakeDevice.prototype.slash = + function(name){return /\/$/.test(name) ? name : name + "/";}; + MlFakeDevice.prototype.lookup = + function(name){ + if(! this.content[name] && this.lookupFun){ + var + res = + this.lookupFun + (caml_string_of_jsbytes(this.root), caml_string_of_jsbytes(name)); + if(res !== 0){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_bytes_of_string(res[1])); + } + } + }; + MlFakeDevice.prototype.exists = + function(name){ + if(name == "") return 1; + var name_slash = this.slash(name); + if(this.content[name_slash]) return 1; + this.lookup(name); + return this.content[name] ? 1 : 0; + }; + MlFakeDevice.prototype.isFile = + function(name){return this.exists(name) && ! this.is_dir(name) ? 1 : 0;}; + MlFakeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + var unix_error = raise_unix && caml_named_value("Unix.Unix_error"); + if(this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("EEXIST", "mkdir", this.nm(name))); + else + caml_raise_sys_error(name + ": File exists"); + var parent = /^(.*)\/[^/]+/.exec(name); + parent = parent && parent[1] || ""; + if(! this.exists(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": No such file or directory"); + if(! this.is_dir(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": Not a directory"); + this.create_dir_if_needed(this.slash(name)); + }; + MlFakeDevice.prototype.rmdir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + name_slash = name == "" ? "" : this.slash(name), + r = new RegExp("^" + name_slash + "([^/]+)"); + if(! this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": Not a directory"); + for(var n in this.content) + if(n.match(r)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTEMPTY", "rmdir", this.nm(name))); + else + caml_raise_sys_error(this.nm(name) + ": Directory not empty"); + delete this.content[name_slash]; + }; + MlFakeDevice.prototype.readdir = + function(name){ + var name_slash = name == "" ? "" : this.slash(name); + if(! this.exists(name)) + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) caml_raise_sys_error(name + ": Not a directory"); + var r = new RegExp("^" + name_slash + "([^/]+)"), seen = {}, a = []; + for(var n in this.content){ + var m = n.match(r); + if(m && ! seen[m[1]]){seen[m[1]] = true; a.push(m[1]);} + } + return a; + }; + MlFakeDevice.prototype.opendir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + a = this.readdir(name), + c = false, + i = 0; + return {readSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + if(i == a.length) return null; + var entry = a[i]; + i++; + return {name: entry}; + }, + closeSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + c = true; + a = []; + }}; + }; + MlFakeDevice.prototype.is_dir = + function(name){ + if(name == "") return true; + var name_slash = this.slash(name); + return this.content[name_slash] ? 1 : 0; + }; + MlFakeDevice.prototype.unlink = + function(name){ + var ok = this.content[name] ? true : false; + delete this.content[name]; + return ok; + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.register = + function(name, content){ + var file; + if(this.content[name]) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + if(caml_is_ml_bytes(content)) file = new MlFakeFile(content); + if(caml_is_ml_string(content)) + file = new MlFakeFile(caml_bytes_of_string(content)); + else if(content instanceof Array) + file = new MlFakeFile(caml_bytes_of_array(content)); + else if(typeof content === "string") + file = new MlFakeFile(caml_bytes_of_jsbytes(content)); + else if(content.toString){ + var + bytes = + caml_bytes_of_string(caml_string_of_jsstring(content.toString())); + file = new MlFakeFile(bytes); + } + if(file){ + this.create_dir_if_needed(name); + this.content[name] = file; + } + else + caml_raise_sys_error + (this.nm(name) + " : registering file with invalid content type"); + }; + MlFakeDevice.prototype.constructor = MlFakeDevice; + function caml_ml_string_length(s){return s.length;} + function caml_string_unsafe_get(s, i){return s.charCodeAt(i);} + function caml_uint8_array_of_string(s){ + var l = caml_ml_string_length(s), a = new Array(l), i = 0; + for(; i < l; i++) a[i] = caml_string_unsafe_get(s, i); + return a; + } + function caml_bytes_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_bytes_unsafe_set(s, i, c){ + c &= 0xff; + if(s.t != 4){ + if(i == s.c.length){ + s.c += String.fromCharCode(c); + if(i + 1 == s.l) s.t = 0; + return 0; + } + caml_convert_bytes_to_array(s); + } + s.c[i] = c; + return 0; + } + function caml_bytes_set(s, i, c){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_set(s, i, c); + } + function MlNodeFd(fd, flags){ + this.fs = require("fs"); + this.fd = fd; + this.flags = flags; + } + MlNodeFd.prototype = new MlFile(); + MlNodeFd.prototype.constructor = MlNodeFd; + MlNodeFd.prototype.truncate = + function(len){ + try{this.fs.ftruncateSync(this.fd, len | 0);} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.length = + function(){ + try{return this.fs.fstatSync(this.fd).size;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.write = + function(offset, buf, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + this.fs.writeSync(this.fd, buf, buf_offset, len); + else + this.fs.writeSync(this.fd, buf, buf_offset, len, offset); + } + catch(err){caml_raise_sys_error(err.toString());} + return 0; + }; + MlNodeFd.prototype.read = + function(offset, a, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + var read = this.fs.readSync(this.fd, a, buf_offset, len); + else + var read = this.fs.readSync(this.fd, a, buf_offset, len, offset); + return read; + } + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.close = + function(){ + try{this.fs.closeSync(this.fd); return 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + function MlNodeDevice(root){this.fs = require("fs"); this.root = root;} + MlNodeDevice.prototype.nm = function(name){return this.root + name;}; + MlNodeDevice.prototype.exists = + function(name){ + try{return this.fs.existsSync(this.nm(name)) ? 1 : 0;} + catch(err){return 0;} + }; + MlNodeDevice.prototype.isFile = + function(name){ + try{return this.fs.statSync(this.nm(name)).isFile() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + try{this.fs.mkdirSync(this.nm(name), {mode: mode}); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rmdir = + function(name, raise_unix){ + try{this.fs.rmdirSync(this.nm(name)); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readdir = + function(name, raise_unix){ + try{return this.fs.readdirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.is_dir = + function(name){ + try{return this.fs.statSync(this.nm(name)).isDirectory() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.unlink = + function(name, raise_unix){ + try{ + var b = this.fs.existsSync(this.nm(name)) ? 1 : 0; + this.fs.unlinkSync(this.nm(name)); + return b; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.open = + function(name, f, raise_unix){ + var consts = require("constants"), res = 0; + for(var key in f) + switch(key){ + case "rdonly": + res |= consts.O_RDONLY; break; + case "wronly": + res |= consts.O_WRONLY; break; + case "append": + res |= consts.O_WRONLY | consts.O_APPEND; break; + case "create": + res |= consts.O_CREAT; break; + case "truncate": + res |= consts.O_TRUNC; break; + case "excl": + res |= consts.O_EXCL; break; + case "binary": + res |= consts.O_BINARY; break; + case "text": + res |= consts.O_TEXT; break; + case "nonblock": + res |= consts.O_NONBLOCK; break; + } + try{ + var + fd = this.fs.openSync(this.nm(name), res), + isCharacterDevice = + this.fs.lstatSync(this.nm(name)).isCharacterDevice(); + f.isCharacterDevice = isCharacterDevice; + return new MlNodeFd(fd, f); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rename = + function(o, n, raise_unix){ + try{this.fs.renameSync(this.nm(o), this.nm(n));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.stat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.statSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.lstat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.lstatSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.symlink = + function(to_dir, target, path, raise_unix){ + try{ + this.fs.symlinkSync + (this.nm(target), this.nm(path), to_dir ? "dir" : "file"); + return 0; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readlink = + function(name, raise_unix){ + try{ + var link = this.fs.readlinkSync(this.nm(name), "utf8"); + return caml_string_of_jsstring(link); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.opendir = + function(name, raise_unix){ + try{return this.fs.opendirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.raise_nodejs_error = + function(err, raise_unix){ + var unix_error = caml_named_value("Unix.Unix_error"); + if(raise_unix && unix_error){ + var + args = make_unix_err_args(err.code, err.syscall, err.path, err.errno); + caml_raise_with_args(unix_error, args); + } + else + caml_raise_sys_error(err.toString()); + }; + MlNodeDevice.prototype.stats_from_js = + function(js_stats){ + var file_kind; + if(js_stats.isFile()) + file_kind = 0; + else if(js_stats.isDirectory()) + file_kind = 1; + else if(js_stats.isCharacterDevice()) + file_kind = 2; + else if(js_stats.isBlockDevice()) + file_kind = 3; + else if(js_stats.isSymbolicLink()) + file_kind = 4; + else if(js_stats.isFIFO()) + file_kind = 5; + else if(js_stats.isSocket()) file_kind = 6; + return [0, + js_stats.dev, + js_stats.ino, + file_kind, + js_stats.mode, + js_stats.nlink, + js_stats.uid, + js_stats.gid, + js_stats.rdev, + js_stats.size, + js_stats.atimeMs, + js_stats.mtimeMs, + js_stats.ctimeMs]; + }; + MlNodeDevice.prototype.constructor = MlNodeDevice; + function caml_get_root(path){ + var x = path_is_absolute(path); + if(! x) return; + return x[0] + "/"; + } + function caml_failwith(msg){ + if(! caml_global_data.Failure) + caml_global_data.Failure = [248, caml_string_of_jsbytes("Failure"), - 3]; + caml_raise_with_string(caml_global_data.Failure, msg); + } + var + caml_root = + caml_get_root(caml_current_dir) + || caml_failwith("unable to compute caml_root"), + jsoo_mount_point = []; + if(fs_node_supported()) + jsoo_mount_point.push + ({path: caml_root, device: new MlNodeDevice(caml_root)}); + else + jsoo_mount_point.push + ({path: caml_root, device: new MlFakeDevice(caml_root)}); + jsoo_mount_point.push + ({path: "/static/", device: new MlFakeDevice("/static/")}); + function resolve_fs_device(name){ + var + path = caml_make_path(name), + name = path.join("/"), + name_slash = caml_trailing_slash(name), + res; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var m = jsoo_mount_point[i]; + if + (name_slash.search(m.path) == 0 + && (! res || res.path.length < m.path.length)) + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + if(! res && fs_node_supported()){ + var root = caml_get_root(name); + if(root && root.match(/^[a-zA-Z]:\/$/)){ + var m = {path: root, device: new MlNodeDevice(root)}; + jsoo_mount_point.push(m); + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + } + if(res) return res; + caml_raise_sys_error("no device found for " + name_slash); + } + function caml_sys_is_directory(name){ + var root = resolve_fs_device(name), a = root.device.is_dir(root.rest); + return a ? 1 : 0; + } + function caml_raise_not_found(){ + caml_raise_constant(caml_global_data.Not_found); + } + function caml_sys_getenv(name){ + var r = jsoo_sys_getenv(caml_jsstring_of_string(name)); + if(r === undefined) caml_raise_not_found(); + return caml_string_of_jsstring(r); + } + function shift_right_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = len1 - 1; i >= 0; i--){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a >>> nbits | wrap; + wrap = a << 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + var caml_gr_state; + function caml_gr_state_get(){ + if(caml_gr_state) return caml_gr_state; + throw caml_maybe_attach_backtrace + ([0, + caml_named_value("Graphics.Graphic_failure"), + caml_string_of_jsbytes("Not initialized")]); + } + function caml_gr_point_color(x, y){ + var + s = caml_gr_state_get(), + im = s.context.getImageData(x, s.height - y, 1, 1), + d = im.data; + return (d[0] << 16) + (d[1] << 8) + d[2]; + } + function caml_runtime_events_user_resolve(){return 0;} + var MlObjectTable; + if(typeof globalThis.WeakMap === "undefined") + MlObjectTable = + function(){ + function NaiveLookup(objs){this.objs = objs;} + NaiveLookup.prototype.get = + function(v){ + for(var i = 0; i < this.objs.length; i++) + if(this.objs[i] === v) return i; + }; + NaiveLookup.prototype.set = function(){}; + return function(){ + this.objs = []; + this.lookup = new NaiveLookup(this.objs);}; + } + (); + else + MlObjectTable = + function(){this.objs = []; this.lookup = new globalThis.WeakMap();}; + MlObjectTable.prototype.store = + function(v){this.lookup.set(v, this.objs.length); this.objs.push(v);}; + MlObjectTable.prototype.recall = + function(v){ + var i = this.lookup.get(v); + return i === undefined ? undefined : this.objs.length - i; + }; + function caml_sys_rename(o, n){ + var o_root = resolve_fs_device(o), n_root = resolve_fs_device(n); + if(o_root.device != n_root.device) + caml_failwith("caml_sys_rename: cannot move file between two filesystem"); + if(! o_root.device.rename) + caml_failwith("caml_sys_rename: no implemented"); + o_root.device.rename(o_root.rest, n_root.rest); + } + function caml_log10_float(x){return Math.log10(x);} + var caml_runtime_warnings = 0; + function caml_ml_enable_runtime_warnings(bool){caml_runtime_warnings = bool; return 0; + } + function caml_classify_float(x){ + if(isFinite(x)){ + if(Math.abs(x) >= 2.2250738585072014e-308) return 0; + if(x != 0) return 1; + return 2; + } + return isNaN(x) ? 4 : 3; + } + var caml_ml_channels = new Array(); + function caml_refill(chan){ + if(chan.refill != null){ + var str = chan.refill(), str_a = caml_uint8_array_of_string(str); + if(str_a.length == 0) + chan.refill = null; + else{ + if(chan.buffer.length < chan.buffer_max + str_a.length){ + var b = new Uint8Array(chan.buffer_max + str_a.length); + b.set(chan.buffer); + chan.buffer = b; + } + chan.buffer.set(str_a, chan.buffer_max); + chan.offset += str_a.length; + chan.buffer_max += str_a.length; + } + } + else{ + var + nread = + chan.file.read + (chan.offset, + chan.buffer, + chan.buffer_max, + chan.buffer.length - chan.buffer_max); + chan.offset += nread; + chan.buffer_max += nread; + } + } + function caml_array_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_ml_input_scan_line(chanid){ + var chan = caml_ml_channels[chanid], p = chan.buffer_curr; + do + if(p >= chan.buffer_max){ + if(chan.buffer_curr > 0){ + chan.buffer.set(chan.buffer.subarray(chan.buffer_curr), 0); + p -= chan.buffer_curr; + chan.buffer_max -= chan.buffer_curr; + chan.buffer_curr = 0; + } + if(chan.buffer_max >= chan.buffer.length) return - chan.buffer_max | 0; + var prev_max = chan.buffer_max; + caml_refill(chan); + if(prev_max == chan.buffer_max) return - chan.buffer_max | 0; + } + while + (chan.buffer[p++] != 10); + return p - chan.buffer_curr | 0; + } + function caml_gc_minor(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(true); + return 0; + } + function caml_ml_condition_new(unit){return {condition: 1};} + function caml_int64_of_bytes(a){ + return new + MlInt64 + (a[7] << 0 | a[6] << 8 | a[5] << 16, + a[4] << 0 | a[3] << 8 | a[2] << 16, + a[1] << 0 | a[0] << 8); + } + function caml_ba_uint8_get64(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3), + b5 = ba.get(ofs + 4), + b6 = ba.get(ofs + 5), + b7 = ba.get(ofs + 6), + b8 = ba.get(ofs + 7); + return caml_int64_of_bytes([b8, b7, b6, b5, b4, b3, b2, b1]); + } + function caml_int64_to_bytes(x){return x.toArray();} + function caml_int64_marshal(writer, v, sizes){ + var b = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) writer.write(8, b[i]); + sizes[0] = 8; + sizes[1] = 8; + } + function caml_ba_num_dims(ba){return ba.dims.length;} + function caml_wrap_exception(e){ + { + if(e instanceof Array) return e; + var exn; + if + (globalThis.RangeError && e instanceof globalThis.RangeError + && e.message + && e.message.match(/maximum call stack/i)) + exn = caml_global_data.Stack_overflow; + else if + (globalThis.InternalError && e instanceof globalThis.InternalError + && e.message + && e.message.match(/too much recursion/i)) + exn = caml_global_data.Stack_overflow; + else if(e instanceof globalThis.Error && caml_named_value("jsError")) + exn = [0, caml_named_value("jsError"), e]; + else + exn = [0, caml_global_data.Failure, caml_string_of_jsstring(String(e))]; + if(e instanceof globalThis.Error) exn.js_error = e; + return exn; + } + } + function caml_create_file(name, content){ + var root = resolve_fs_device(name); + if(! root.device.register) caml_failwith("cannot register file"); + root.device.register(root.rest, content); + return 0; + } + function jsoo_create_file(name, content){ + var + name = caml_string_of_jsbytes(name), + content = caml_string_of_jsbytes(content); + return caml_create_file(name, content); + } + function caml_fs_init(){ + var tmp = globalThis.caml_fs_tmp; + if(tmp) + for(var i = 0; i < tmp.length; i++) + jsoo_create_file(tmp[i].name, tmp[i].content); + globalThis.jsoo_create_file = jsoo_create_file; + globalThis.caml_fs_tmp = []; + return 0; + } + function caml_mul(a, b){return Math.imul(a, b);} + function caml_hash_mix_int(h, d){ + d = caml_mul(d, 0xcc9e2d51 | 0); + d = d << 15 | d >>> 32 - 15; + d = caml_mul(d, 0x1b873593); + h ^= d; + h = h << 13 | h >>> 32 - 13; + return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0; + } + function caml_hash_mix_jsbytes(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = + s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16 + | s.charCodeAt(i + 3) << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s.charCodeAt(i + 2) << 16; + case 2: + w |= s.charCodeAt(i + 1) << 8; + case 1: + w |= s.charCodeAt(i); h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_hash_mix_string(h, v){ + return caml_hash_mix_jsbytes(h, caml_jsbytes_of_string(v)); + } + var Base_internalhash_fold_string = caml_hash_mix_string; + function caml_get_continuation_callstack(){return [0];} + var caml_parser_trace = 0; + function caml_set_parser_trace(bool){ + var oldflag = caml_parser_trace; + caml_parser_trace = bool; + return oldflag; + } + function caml_list_of_js_array(a){ + var l = 0; + for(var i = a.length - 1; i >= 0; i--){var e = a[i]; l = [0, e, l];} + return l; + } + function num_digits_nat(nat, ofs, len){ + for(var i = len - 1; i >= 0; i--) if(nat.data[ofs + i] != 0) return i + 1; + return 1; + } + function caml_hash_nat(x){ + var len = num_digits_nat(x, 0, x.data.length), h = 0; + for(var i = 0; i < len; i++) h = caml_hash_mix_int(h, x.data[i]); + return h; + } + function caml_call_gen(f, args){ + var + n = f.l >= 0 ? f.l : f.l = f.length, + argsLen = args.length, + d = n - argsLen; + if(d == 0) + return f.apply(null, args); + else if(d < 0){ + var g = f.apply(null, args.slice(0, n)); + if(typeof g !== "function") return g; + return caml_call_gen(g, args.slice(n)); + } + else{ + switch(d){ + case 1: + { + var + g = + function(x){ + var nargs = new Array(argsLen + 1); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + return f.apply(null, nargs); + }; + break; + } + case 2: + { + var + g = + function(x, y){ + var nargs = new Array(argsLen + 2); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + nargs[argsLen + 1] = y; + return f.apply(null, nargs); + }; + break; + } + default: + var + g = + function(){ + var + extra_args = arguments.length == 0 ? 1 : arguments.length, + nargs = new Array(args.length + extra_args); + for(var i = 0; i < args.length; i++) nargs[i] = args[i]; + for(var i = 0; i < arguments.length; i++) + nargs[args.length + i] = arguments[i]; + return caml_call_gen(f, nargs); + }; + } + g.l = d; + return g; + } + } + var caml_callback = caml_call_gen; + function caml_js_wrap_callback_arguments(f){ + return function(){ + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, [args]);}; + } + function caml_sys_chdir(dir){ + var root = resolve_fs_device(dir); + if(root.device.exists(root.rest)){ + if(root.rest) + caml_current_dir = caml_trailing_slash(root.path + root.rest); + else + caml_current_dir = root.path; + return 0; + } + else + caml_raise_no_such_file(caml_jsbytes_of_string(dir)); + } + function caml_obj_tag(x){ + if(x instanceof Array && x[0] == x[0] >>> 0) + return x[0]; + else if(caml_is_ml_bytes(x)) + return 252; + else if(caml_is_ml_string(x)) + return 252; + else if(x instanceof Function || typeof x == "function") + return 247; + else if(x && x.caml_custom) return 255; else return 1000; + } + function caml_obj_update_tag(b, o, n){ + if(b[0] == o){b[0] = n; return 1;} + return 0; + } + var caml_ml_domain_unique_token_ = [0]; + function caml_ml_domain_unique_token(unit){return caml_ml_domain_unique_token_; + } + function caml_lazy_update_to_forcing(o){ + var t = caml_obj_tag(o); + if(t != 246 && t != 250 && t != 244) return 4; + if(caml_obj_update_tag(o, 246, 244)) + return 0; + else{ + var field0 = o[1]; + t = o[0]; + if(t == 244) + return field0 == caml_ml_domain_unique_token(0) ? 1 : 2; + else if(t == 250) return 3; else return 2; + } + } + function caml_gc_counters(){return [254, 0, 0, 0];} + function caml_gr_synchronize(){ + caml_failwith("caml_gr_synchronize not Implemented"); + } + function caml_unix_closedir(dir_handle){ + try{dir_handle.pointer.closeSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "closedir", dir_handle.path)); + } + } + function caml_unix_opendir(path){ + var root = resolve_fs_device(path); + if(! root.device.opendir) + caml_failwith("caml_unix_opendir: not implemented"); + var dir_handle = root.device.opendir(root.rest, true); + return {pointer: dir_handle, path: path}; + } + function caml_unix_rewinddir(dir_handle){ + caml_unix_closedir(dir_handle); + var new_dir_handle = caml_unix_opendir(dir_handle.path); + dir_handle.pointer = new_dir_handle.pointer; + return 0; + } + function caml_raise_end_of_file(){ + caml_raise_constant(caml_global_data.End_of_file); + } + function caml_unix_readdir(dir_handle){ + var entry; + try{entry = dir_handle.pointer.readSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "readdir", dir_handle.path)); + } + if(entry === null) + caml_raise_end_of_file(); + else + return caml_string_of_jsstring(entry.name); + } + function caml_unix_findfirst(path){ + var path_js = caml_jsstring_of_string(path); + path_js = path_js.replace(/(^|[\\\/])\*\.\*$/, ""); + path = caml_string_of_jsstring(path_js); + var + dir_handle = caml_unix_opendir(path), + first_entry = caml_unix_readdir(dir_handle); + return [0, first_entry, dir_handle]; + } + function caml_is_continuation_tag(t){return t == 245 ? 1 : 0;} + var log2_ok = Math.log2 && Math.log2(1.1235582092889474E+307) == 1020; + function jsoo_floor_log2(x){ + if(log2_ok) return Math.floor(Math.log2(x)); + var i = 0; + if(x == 0) return - Infinity; + if(x >= 1) while(x >= 2){x /= 2; i++;} else while(x < 1){x *= 2; i--;} + return i; + } + function caml_int32_bits_of_float(x){ + var float32a = new Float32Array(1); + float32a[0] = x; + var int32a = new Int32Array(float32a.buffer); + return int32a[0] | 0; + } + function caml_int64_create_lo_mi_hi(lo, mi, hi){return new MlInt64(lo, mi, hi); + } + function caml_int64_bits_of_float(x){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_int64_create_lo_mi_hi(1, 0, 0x7ff0); + return x > 0 + ? caml_int64_create_lo_mi_hi(0, 0, 0x7ff0) + : caml_int64_create_lo_mi_hi(0, 0, 0xfff0); + } + var sign = x == 0 && 1 / x == - Infinity ? 0x8000 : x >= 0 ? 0 : 0x8000; + if(sign) x = - x; + var exp = jsoo_floor_log2(x) + 1023; + if(exp <= 0){ + exp = 0; + x /= Math.pow(2, - 1026); + } + else{ + x /= Math.pow(2, exp - 1027); + if(x < 16){x *= 2; exp -= 1;} + if(exp == 0) x /= 2; + } + var k = Math.pow(2, 24), r3 = x | 0; + x = (x - r3) * k; + var r2 = x | 0; + x = (x - r2) * k; + var r1 = x | 0; + r3 = r3 & 0xf | sign | exp << 4; + return caml_int64_create_lo_mi_hi(r1, r2, r3); + } + function caml_ba_serialize(writer, ba, sz){ + writer.write(32, ba.dims.length); + writer.write(32, ba.kind | ba.layout << 8); + if(ba.caml_custom == "_bigarr02") + for(var i = 0; i < ba.dims.length; i++) + if(ba.dims[i] < 0xffff) + writer.write(16, ba.dims[i]); + else{ + writer.write(16, 0xffff); + writer.write(32, 0); + writer.write(32, ba.dims[i]); + } + else + for(var i = 0; i < ba.dims.length; i++) writer.write(32, ba.dims[i]); + switch(ba.kind){ + case 2: + case 3: + case 12: + for(var i = 0; i < ba.data.length; i++) writer.write(8, ba.data[i]); + break; + case 4: + case 5: + for(var i = 0; i < ba.data.length; i++) writer.write(16, ba.data[i]); + break; + case 6: + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 8: + case 9: + writer.write(8, 0); + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 7: + for(var i = 0; i < ba.data.length / 2; i++){ + var b = caml_int64_to_bytes(ba.get(i)); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 1: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i))); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 0: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int32_bits_of_float(ba.get(i)); + writer.write(32, b); + } + break; + case 10: + for(var i = 0; i < ba.data.length / 2; i++){ + var j = ba.get(i); + writer.write(32, caml_int32_bits_of_float(j[1])); + writer.write(32, caml_int32_bits_of_float(j[2])); + } + break; + case 11: + for(var i = 0; i < ba.data.length / 2; i++){ + var + complex = ba.get(i), + b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[1])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[2])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + } + sz[0] = (4 + ba.dims.length) * 4; + sz[1] = (4 + ba.dims.length) * 8; + } + function caml_ba_get_size_per_element(kind){ + switch(kind){case 7:case 10:case 11: return 2;default: return 1; + } + } + function caml_ba_create_buffer(kind, size){ + var view; + switch(kind){ + case 0: + view = Float32Array; break; + case 1: + view = Float64Array; break; + case 2: + view = Int8Array; break; + case 3: + view = Uint8Array; break; + case 4: + view = Int16Array; break; + case 5: + view = Uint16Array; break; + case 6: + view = Int32Array; break; + case 7: + view = Int32Array; break; + case 8: + view = Int32Array; break; + case 9: + view = Int32Array; break; + case 10: + view = Float32Array; break; + case 11: + view = Float64Array; break; + case 12: + view = Uint8Array; break; + } + if(! view) caml_invalid_argument("Bigarray.create: unsupported kind"); + var data = new view(size * caml_ba_get_size_per_element(kind)); + return data; + } + function caml_int32_float_of_bits(x){ + var int32a = new Int32Array(1); + int32a[0] = x; + var float32a = new Float32Array(int32a.buffer); + return float32a[0]; + } + function caml_int64_float_of_bits(x){ + var lo = x.lo, mi = x.mi, hi = x.hi, exp = (hi & 0x7fff) >> 4; + if(exp == 2047) + return (lo | mi | hi & 0xf) == 0 + ? hi & 0x8000 ? - Infinity : Infinity + : NaN; + var k = Math.pow(2, - 24), res = (lo * k + mi) * k + (hi & 0xf); + if(exp > 0){ + res += 16; + res *= Math.pow(2, exp - 1027); + } + else + res *= Math.pow(2, - 1026); + if(hi & 0x8000) res = - res; + return res; + } + function caml_ba_get_size(dims){ + var n_dims = dims.length, size = 1; + for(var i = 0; i < n_dims; i++){ + if(dims[i] < 0) + caml_invalid_argument("Bigarray.create: negative dimension"); + size = size * dims[i]; + } + return size; + } + function caml_int64_create_lo_hi(lo, hi){ + return new + MlInt64 + (lo & 0xffffff, + lo >>> 24 & 0xff | (hi & 0xffff) << 8, + hi >>> 16 & 0xffff); + } + function caml_int64_hi32(v){return v.hi32();} + function caml_int64_lo32(v){return v.lo32();} + var caml_ba_custom_name = "_bigarr02"; + function Ml_Bigarray(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray.prototype.caml_custom = caml_ba_custom_name; + Ml_Bigarray.prototype.offset = + function(arg){ + var ofs = 0; + if(typeof arg === "number") arg = [arg]; + if(! (arg instanceof Array)) + caml_invalid_argument("bigarray.js: invalid offset"); + if(this.dims.length != arg.length) + caml_invalid_argument("Bigarray.get/set: bad number of dimensions"); + if(this.layout == 0) + for(var i = 0; i < this.dims.length; i++){ + if(arg[i] < 0 || arg[i] >= this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + arg[i]; + } + else + for(var i = this.dims.length - 1; i >= 0; i--){ + if(arg[i] < 1 || arg[i] > this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + (arg[i] - 1); + } + return ofs; + }; + Ml_Bigarray.prototype.get = + function(ofs){ + switch(this.kind){ + case 7: + var l = this.data[ofs * 2 + 0], h = this.data[ofs * 2 + 1]; + return caml_int64_create_lo_hi(l, h); + case 10: + case 11: + var r = this.data[ofs * 2 + 0], i = this.data[ofs * 2 + 1]; + return [254, r, i]; + default: return this.data[ofs]; + } + }; + Ml_Bigarray.prototype.set = + function(ofs, v){ + switch(this.kind){ + case 7: + this.data[ofs * 2 + 0] = caml_int64_lo32(v); + this.data[ofs * 2 + 1] = caml_int64_hi32(v); + break; + case 10: + case 11: + this.data[ofs * 2 + 0] = v[1]; this.data[ofs * 2 + 1] = v[2]; break; + default: this.data[ofs] = v; break; + } + return 0; + }; + Ml_Bigarray.prototype.fill = + function(v){ + switch(this.kind){ + case 7: + var a = caml_int64_lo32(v), b = caml_int64_hi32(v); + if(a == b) + this.data.fill(a); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? a : b; + break; + case 10: + case 11: + var im = v[1], re = v[2]; + if(im == re) + this.data.fill(im); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? im : re; + break; + default: this.data.fill(v); break; + } + }; + Ml_Bigarray.prototype.compare = + function(b, total){ + if(this.layout != b.layout || this.kind != b.kind){ + var k1 = this.kind | this.layout << 8, k2 = b.kind | b.layout << 8; + return k2 - k1; + } + if(this.dims.length != b.dims.length) + return b.dims.length - this.dims.length; + for(var i = 0; i < this.dims.length; i++) + if(this.dims[i] != b.dims[i]) return this.dims[i] < b.dims[i] ? - 1 : 1; + switch(this.kind){ + case 0: + case 1: + case 10: + case 11: + var x, y; + for(var i = 0; i < this.data.length; i++){ + x = this.data[i]; + y = b.data[i]; + if(x < y) return - 1; + if(x > y) return 1; + if(x != y){ + if(! total) return NaN; + if(x == x) return 1; + if(y == y) return - 1; + } + } + break; + case 7: + for(var i = 0; i < this.data.length; i += 2){ + if(this.data[i + 1] < b.data[i + 1]) return - 1; + if(this.data[i + 1] > b.data[i + 1]) return 1; + if(this.data[i] >>> 0 < b.data[i] >>> 0) return - 1; + if(this.data[i] >>> 0 > b.data[i] >>> 0) return 1; + } + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 8: + case 9: + case 12: + for(var i = 0; i < this.data.length; i++){ + if(this.data[i] < b.data[i]) return - 1; + if(this.data[i] > b.data[i]) return 1; + } + break; + } + return 0; + }; + function Ml_Bigarray_c_1_1(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray_c_1_1.prototype = new Ml_Bigarray(); + Ml_Bigarray_c_1_1.prototype.offset = + function(arg){ + if(typeof arg !== "number") + if(arg instanceof Array && arg.length == 1) + arg = arg[0]; + else + caml_invalid_argument("Ml_Bigarray_c_1_1.offset"); + if(arg < 0 || arg >= this.dims[0]) caml_array_bound_error(); + return arg; + }; + Ml_Bigarray_c_1_1.prototype.get = function(ofs){return this.data[ofs];}; + Ml_Bigarray_c_1_1.prototype.set = + function(ofs, v){this.data[ofs] = v; return 0;}; + Ml_Bigarray_c_1_1.prototype.fill = + function(v){this.data.fill(v); return 0;}; + function caml_ba_create_unsafe(kind, layout, dims, data){ + var size_per_element = caml_ba_get_size_per_element(kind); + if(caml_ba_get_size(dims) * size_per_element != data.length) + caml_invalid_argument("length doesn't match dims"); + if(layout == 0 && dims.length == 1 && size_per_element == 1) + return new Ml_Bigarray_c_1_1(kind, layout, dims, data); + return new Ml_Bigarray(kind, layout, dims, data); + } + function caml_ba_deserialize(reader, sz, name){ + var num_dims = reader.read32s(); + if(num_dims < 0 || num_dims > 16) + caml_failwith("input_value: wrong number of bigarray dimensions"); + var + tag = reader.read32s(), + kind = tag & 0xff, + layout = tag >> 8 & 1, + dims = []; + if(name == "_bigarr02") + for(var i = 0; i < num_dims; i++){ + var size_dim = reader.read16u(); + if(size_dim == 0xffff){ + var size_dim_hi = reader.read32u(), size_dim_lo = reader.read32u(); + if(size_dim_hi != 0) + caml_failwith("input_value: bigarray dimension overflow in 32bit"); + size_dim = size_dim_lo; + } + dims.push(size_dim); + } + else + for(var i = 0; i < num_dims; i++) dims.push(reader.read32u()); + var + size = caml_ba_get_size(dims), + data = caml_ba_create_buffer(kind, size), + ba = caml_ba_create_unsafe(kind, layout, dims, data); + switch(kind){ + case 2: + for(var i = 0; i < size; i++) data[i] = reader.read8s(); break; + case 3: + case 12: + for(var i = 0; i < size; i++) data[i] = reader.read8u(); break; + case 4: + for(var i = 0; i < size; i++) data[i] = reader.read16s(); break; + case 5: + for(var i = 0; i < size; i++) data[i] = reader.read16u(); break; + case 6: + for(var i = 0; i < size; i++) data[i] = reader.read32s(); break; + case 8: + case 9: + var sixty = reader.read8u(); + if(sixty) + caml_failwith + ("input_value: cannot read bigarray with 64-bit OCaml ints"); + for(var i = 0; i < size; i++) data[i] = reader.read32s(); + break; + case 7: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var int64 = caml_int64_of_bytes(t); + ba.set(i, int64); + } + break; + case 1: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var f = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, f); + } + break; + case 0: + for(var i = 0; i < size; i++){ + var f = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, f); + } + break; + case 10: + for(var i = 0; i < size; i++){ + var + re = caml_int32_float_of_bits(reader.read32s()), + im = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, [254, re, im]); + } + break; + case 11: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var re = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var im = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, [254, re, im]); + } + break; + } + sz[0] = (4 + num_dims) * 4; + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_ba_compare(a, b, total){return a.compare(b, total);} + function caml_hash_mix_int64(h, v){ + h = caml_hash_mix_int(h, caml_int64_lo32(v)); + h = caml_hash_mix_int(h, caml_int64_hi32(v)); + return h; + } + function caml_hash_mix_float(h, v0){ + return caml_hash_mix_int64(h, caml_int64_bits_of_float(v0)); + } + function caml_ba_hash(ba){ + var num_elts = caml_ba_get_size(ba.dims), h = 0; + switch(ba.kind){ + case 2: + case 3: + case 12: + if(num_elts > 256) num_elts = 256; + var w = 0, i = 0; + for(i = 0; i + 4 <= ba.data.length; i += 4){ + w = + ba.data[i + 0] | ba.data[i + 1] << 8 | ba.data[i + 2] << 16 + | ba.data[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(num_elts & 3){ + case 3: + w = ba.data[i + 2] << 16; + case 2: + w |= ba.data[i + 1] << 8; + case 1: + w |= ba.data[i + 0]; h = caml_hash_mix_int(h, w); + } + break; + case 4: + case 5: + if(num_elts > 128) num_elts = 128; + var w = 0, i = 0; + for(i = 0; i + 2 <= ba.data.length; i += 2){ + w = ba.data[i + 0] | ba.data[i + 1] << 16; + h = caml_hash_mix_int(h, w); + } + if((num_elts & 1) != 0) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 6: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 8: + case 9: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 7: + if(num_elts > 32) num_elts = 32; + num_elts *= 2; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 10: + num_elts *= 2; + case 0: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + case 11: + num_elts *= 2; + case 1: + if(num_elts > 32) num_elts = 32; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + } + return h; + } + function caml_int32_unmarshal(reader, size){size[0] = 4; return reader.read32s(); + } + function caml_nativeint_unmarshal(reader, size){ + switch(reader.read8u()){ + case 1: + size[0] = 4; return reader.read32s(); + case 2: + caml_failwith("input_value: native integer value too large"); + default: caml_failwith("input_value: ill-formed native integer"); + } + } + function caml_int64_unmarshal(reader, size){ + var t = new Array(8); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + size[0] = 8; + return caml_int64_of_bytes(t); + } + function caml_int64_compare(x, y, total){return x.compare(y);} + function caml_int64_hash(v){return v.lo32() ^ v.hi32();} + var + caml_custom_ops = + {"_j": + {deserialize: caml_int64_unmarshal, + serialize: caml_int64_marshal, + fixed_length: 8, + compare: caml_int64_compare, + hash: caml_int64_hash}, + "_i": {deserialize: caml_int32_unmarshal, fixed_length: 4}, + "_n": {deserialize: caml_nativeint_unmarshal, fixed_length: 4}, + "_bigarray": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarray"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}, + "_bigarr02": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarr02"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}}; + function caml_compare_val_get_custom(a){ + return caml_custom_ops[a.caml_custom] + && caml_custom_ops[a.caml_custom].compare; + } + function caml_compare_val_number_custom(num, custom, swap, total){ + var comp = caml_compare_val_get_custom(custom); + if(comp){ + var x = swap > 0 ? comp(custom, num, total) : comp(num, custom, total); + if(total && x != x) return swap; + if(+ x != + x) return + x; + if((x | 0) != 0) return x | 0; + } + return swap; + } + function caml_compare_val_tag(a){ + if(typeof a === "number") + return 1000; + else if(caml_is_ml_bytes(a)) + return 252; + else if(caml_is_ml_string(a)) + return 1252; + else if(a instanceof Array && a[0] === a[0] >>> 0 && a[0] <= 255){var tag = a[0] | 0; return tag == 254 ? 0 : tag;} + else if(a instanceof String) + return 12520; + else if(typeof a == "string") + return 12520; + else if(a instanceof Number) + return 1000; + else if(a && a.caml_custom) + return 1255; + else if(a && a.compare) + return 1256; + else if(typeof a == "function") + return 1247; + else if(typeof a == "symbol") return 1251; + return 1001; + } + function caml_int_compare(a, b){ + if(a < b) return - 1; + if(a == b) return 0; + return 1; + } + function caml_string_compare(s1, s2){ + return s1 < s2 ? - 1 : s1 > s2 ? 1 : 0; + } + function caml_bytes_compare(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? - 1 : s1.c > s2.c ? 1 : 0; + } + function caml_compare_val(a, b, total){ + var stack = []; + for(;;){ + if(! (total && a === b)){ + var tag_a = caml_compare_val_tag(a); + if(tag_a == 250){a = a[1]; continue;} + var tag_b = caml_compare_val_tag(b); + if(tag_b == 250){b = b[1]; continue;} + if(tag_a !== tag_b){ + if(tag_a == 1000){ + if(tag_b == 1255) + return caml_compare_val_number_custom(a, b, - 1, total); + return - 1; + } + if(tag_b == 1000){ + if(tag_a == 1255) + return caml_compare_val_number_custom(b, a, 1, total); + return 1; + } + return tag_a < tag_b ? - 1 : 1; + } + switch(tag_a){ + case 247: + caml_invalid_argument("compare: functional value"); break; + case 248: + var x = caml_int_compare(a[2], b[2]); if(x != 0) return x | 0; break; + case 249: + caml_invalid_argument("compare: functional value"); break; + case 250: + caml_invalid_argument("equal: got Forward_tag, should not happen"); + break; + case 251: + caml_invalid_argument("equal: abstract value"); break; + case 252: + if(a !== b){ + var x = caml_bytes_compare(a, b); + if(x != 0) return x | 0; + } + break; + case 253: + caml_invalid_argument("equal: got Double_tag, should not happen"); + break; + case 254: + caml_invalid_argument + ("equal: got Double_array_tag, should not happen"); + break; + case 255: + caml_invalid_argument("equal: got Custom_tag, should not happen"); + break; + case 1247: + caml_invalid_argument("compare: functional value"); break; + case 1255: + var comp = caml_compare_val_get_custom(a); + if(comp != caml_compare_val_get_custom(b)) + return a.caml_custom < b.caml_custom ? - 1 : 1; + if(! comp) caml_invalid_argument("compare: abstract value"); + var x = comp(a, b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1256: + var x = a.compare(b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1000: + a = + a; + b = + b; + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1001: + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1251: + if(a !== b){if(! total) return NaN; return 1;} break; + case 1252: + var a = caml_jsbytes_of_string(a), b = caml_jsbytes_of_string(b); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 12520: + var a = a.toString(), b = b.toString(); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 246: + case 254: + default: + if(caml_is_continuation_tag(tag_a)){ + caml_invalid_argument("compare: continuation value"); + break; + } + if(a.length != b.length) return a.length < b.length ? - 1 : 1; + if(a.length > 1) stack.push(a, b, 1); + break; + } + } + if(stack.length == 0) return 0; + var i = stack.pop(); + b = stack.pop(); + a = stack.pop(); + if(i + 1 < a.length) stack.push(a, b, i + 1); + a = a[i]; + b = b[i]; + } + } + function caml_greaterthan(x, y){ + return + (caml_compare_val(x, y, false) > 0); + } + function div_helper(a, b, c){ + var + x = a * 65536 + (b >>> 16), + y = Math.floor(x / c) * 65536, + z = x % c * 65536, + w = z + (b & 0x0000FFFF); + return [y + Math.floor(w / c), w % c]; + } + function div_digit_nat(natq, ofsq, natr, ofsr, nat1, ofs1, len, nat2, ofs2){ + var rem = nat1.data[ofs1 + len - 1] >>> 0; + for(var i = len - 2; i >= 0; i--){ + var + x = div_helper(rem, nat1.data[ofs1 + i] >>> 0, nat2.data[ofs2] >>> 0); + natq.data[ofsq + i] = x[0]; + rem = x[1]; + } + natr.data[ofsr] = rem; + return 0; + } + function num_leading_zero_bits_in_digit(nat, ofs){ + var a = nat.data[ofs], b = 0; + if(a & 0xFFFF0000){b += 16; a >>>= 16;} + if(a & 0xFF00){b += 8; a >>>= 8;} + if(a & 0xF0){b += 4; a >>>= 4;} + if(a & 12){b += 2; a >>>= 2;} + if(a & 2){b += 1; a >>>= 1;} + if(a & 1) b += 1; + return 32 - b; + } + function shift_left_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = 0; i < len1; i++){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a << nbits | wrap; + wrap = a >>> 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + function MlNat(x){ + this.data = new Int32Array(x); + this.length = this.data.length + 2; + } + MlNat.prototype.caml_custom = "_nat"; + function create_nat(size){ + var arr = new MlNat(size); + for(var i = 0; i < size; i++) arr.data[i] = - 1; + return arr; + } + function set_to_zero_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) nat.data[ofs + i] = 0; + return 0; + } + function incr_nat(nat, ofs, len, carry_in){ + var carry = carry_in; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) + carry; + nat.data[ofs + i] = x | 0; + if(x == x >>> 0){carry = 0; break;} else carry = 1; + } + return carry; + } + function add_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var carry = carry_in; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry; + nat1.data[ofs1 + i] = x; + if(x == x >>> 0) carry = 0; else carry = 1; + } + return incr_nat(nat1, ofs1 + len2, len1 - len2, carry); + } + function nat_of_array(l){return new MlNat(l);} + function mult_digit_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3){ + var carry = 0, a = nat3.data[ofs3] >>> 0; + for(var i = 0; i < len2; i++){ + var + x1 = + (nat1.data[ofs1 + i] >>> 0) + + (nat2.data[ofs2 + i] >>> 0) * (a & 0x0000FFFF) + + carry, + x2 = (nat2.data[ofs2 + i] >>> 0) * (a >>> 16); + carry = Math.floor(x2 / 65536); + var x3 = x1 + x2 % 65536 * 65536; + nat1.data[ofs1 + i] = x3; + carry += Math.floor(x3 / 4294967296); + } + return len2 < len1 && carry + ? add_nat + (nat1, ofs1 + len2, len1 - len2, nat_of_array([carry]), 0, 1, 0) + : carry; + } + function decr_nat(nat, ofs, len, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) - borrow; + nat.data[ofs + i] = x; + if(x >= 0){borrow = 0; break;} else borrow = 1; + } + return borrow == 1 ? 0 : 1; + } + function sub_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow; + nat1.data[ofs1 + i] = x; + if(x >= 0) borrow = 0; else borrow = 1; + } + return decr_nat(nat1, ofs1 + len2, len1 - len2, borrow == 1 ? 0 : 1); + } + function compare_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var + a = num_digits_nat(nat1, ofs1, len1), + b = num_digits_nat(nat2, ofs2, len2); + if(a > b) return 1; + if(a < b) return - 1; + for(var i = len1 - 1; i >= 0; i--){ + if(nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0) return 1; + if(nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0) return - 1; + } + return 0; + } + function div_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + if(len2 == 1){ + div_digit_nat(nat1, ofs1 + 1, nat1, ofs1, nat1, ofs1, len1, nat2, ofs2); + return 0; + } + var s = num_leading_zero_bits_in_digit(nat2, ofs2 + len2 - 1); + shift_left_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + shift_left_nat(nat1, ofs1, len1, nat_of_array([0]), 0, s); + var d = (nat2.data[ofs2 + len2 - 1] >>> 0) + 1, a = create_nat(len2 + 1); + for(var i = len1 - 1; i >= len2; i--){ + var + quo = + d == 4294967296 + ? nat1.data[ofs1 + i] >>> 0 + : div_helper + (nat1.data[ofs1 + i] >>> 0, nat1.data[ofs1 + i - 1] >>> 0, d) + [0]; + set_to_zero_nat(a, 0, len2 + 1); + mult_digit_nat(a, 0, len2 + 1, nat2, ofs2, len2, nat_of_array([quo]), 0); + sub_nat(nat1, ofs1 + i - len2, len2 + 1, a, 0, len2 + 1, 1); + while + (nat1.data[ofs1 + i] != 0 + || compare_nat(nat1, ofs1 + i - len2, len2, nat2, ofs2, len2) >= 0){ + quo = quo + 1; + sub_nat(nat1, ofs1 + i - len2, len2 + 1, nat2, ofs2, len2, 1); + } + nat1.data[ofs1 + i] = quo; + } + shift_right_nat(nat1, ofs1, len2, nat_of_array([0]), 0, s); + shift_right_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + return 0; + } + function caml_ba_blit(src, dst){ + if(dst.dims.length != src.dims.length) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + for(var i = 0; i < dst.dims.length; i++) + if(dst.dims[i] != src.dims[i]) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + dst.data.set(src.data); + return 0; + } + function is_digit_int(nat, ofs){if(nat.data[ofs] >= 0) return 1; return 0;} + function caml_int64_div(x, y){return x.div(y);} + function caml_js_html_entities(s){ + var entity = /^&#?[0-9a-zA-Z]+;$/; + if(s.match(entity)){ + var str, temp = document.createElement("p"); + temp.innerHTML = s; + str = temp.textContent || temp.innerText; + temp = null; + return str; + } + else + caml_failwith("Invalid entity " + s); + } + function caml_string_unsafe_set(s, i, c){ + caml_failwith("caml_string_unsafe_set"); + } + function caml_int64_of_float(x){ + if(x < 0) x = Math.ceil(x); + return new + MlInt64 + (x & 0xffffff, + Math.floor(x * caml_int64_offset) & 0xffffff, + Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff); + } + function caml_ml_channel_size_64(chanid){ + var chan = caml_ml_channels[chanid]; + return caml_int64_of_float(chan.file.length()); + } + function caml_ba_set_2(ba, i0, i1, v){ + ba.set(ba.offset([i0, i1]), v); + return 0; + } + var + caml_argv = + function(){ + var process = globalThis.process, main = "a.out", args = []; + if(process && process.argv && process.argv.length > 1){ + var argv = process.argv; + main = argv[1]; + args = argv.slice(2); + } + var p = caml_string_of_jsstring(main), args2 = [0, p]; + for(var i = 0; i < args.length; i++) + args2.push(caml_string_of_jsstring(args[i])); + return args2; + } + (), + caml_executable_name = caml_argv[1]; + function caml_js_eval_string(s){return eval(caml_jsstring_of_string(s));} + function serialize_nat(writer, nat, sz){ + var len = nat.data.length; + writer.write(32, len); + for(var i = 0; i < len; i++) writer.write(32, nat.data[i]); + sz[0] = len * 4; + sz[1] = len * 8; + } + function caml_memprof_set(_control){return 0;} + function caml_sys_exit(code){ + if(globalThis.quit) globalThis.quit(code); + if(globalThis.process && globalThis.process.exit) + globalThis.process.exit(code); + caml_invalid_argument("Function 'exit' not implemented"); + } + function caml_channel_descriptor(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.fd; + } + function caml_js_from_array(a){return a.slice(1);} + function caml_ba_reshape(ba, vind){ + vind = caml_js_from_array(vind); + var new_dim = [], num_dims = vind.length; + if(num_dims < 0 || num_dims > 16) + caml_invalid_argument("Bigarray.reshape: bad number of dimensions"); + var num_elts = 1; + for(var i = 0; i < num_dims; i++){ + new_dim[i] = vind[i]; + if(new_dim[i] < 0) + caml_invalid_argument("Bigarray.reshape: negative dimension"); + num_elts = num_elts * new_dim[i]; + } + var size = caml_ba_get_size(ba.dims); + if(num_elts != size) + caml_invalid_argument("Bigarray.reshape: size mismatch"); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dim, ba.data); + } + var caml_oo_last_id = 0; + function caml_set_oo_id(b){b[2] = caml_oo_last_id++; return b;} + function caml_gr_fill_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.fillRect(x, s.height - y, w, - h); + return 0; + } + function caml_bigstring_blit_string_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_string_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_string(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + function caml_gr_set_window_title(name){ + var s = caml_gr_state_get(); + s.title = name; + var jsname = caml_jsstring_of_string(name); + if(s.set_title) s.set_title(jsname); + return 0; + } + function caml_get_global_data(){return caml_global_data;} + function caml_int64_shift_right_unsigned(x, s){return x.shift_right_unsigned(s); + } + function caml_ba_uint8_get16(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + var b1 = ba.get(ofs), b2 = ba.get(ofs + 1); + return b1 | b2 << 8; + } + function caml_compare(a, b){return caml_compare_val(a, b, true);} + var + caml_MD5Transform = + function(){ + function add(x, y){return x + y | 0;} + function xx(q, a, b, x, s, t){ + a = add(add(a, q), add(x, t)); + return add(a << s | a >>> 32 - s, b); + } + function ff(a, b, c, d, x, s, t){ + return xx(b & c | ~ b & d, a, b, x, s, t); + } + function gg(a, b, c, d, x, s, t){ + return xx(b & d | c & ~ d, a, b, x, s, t); + } + function hh(a, b, c, d, x, s, t){return xx(b ^ c ^ d, a, b, x, s, t);} + function ii(a, b, c, d, x, s, t){ + return xx(c ^ (b | ~ d), a, b, x, s, t); + } + return function(w, buffer){ + var a = w[0], b = w[1], c = w[2], d = w[3]; + a = ff(a, b, c, d, buffer[0], 7, 0xD76AA478); + d = ff(d, a, b, c, buffer[1], 12, 0xE8C7B756); + c = ff(c, d, a, b, buffer[2], 17, 0x242070DB); + b = ff(b, c, d, a, buffer[3], 22, 0xC1BDCEEE); + a = ff(a, b, c, d, buffer[4], 7, 0xF57C0FAF); + d = ff(d, a, b, c, buffer[5], 12, 0x4787C62A); + c = ff(c, d, a, b, buffer[6], 17, 0xA8304613); + b = ff(b, c, d, a, buffer[7], 22, 0xFD469501); + a = ff(a, b, c, d, buffer[8], 7, 0x698098D8); + d = ff(d, a, b, c, buffer[9], 12, 0x8B44F7AF); + c = ff(c, d, a, b, buffer[10], 17, 0xFFFF5BB1); + b = ff(b, c, d, a, buffer[11], 22, 0x895CD7BE); + a = ff(a, b, c, d, buffer[12], 7, 0x6B901122); + d = ff(d, a, b, c, buffer[13], 12, 0xFD987193); + c = ff(c, d, a, b, buffer[14], 17, 0xA679438E); + b = ff(b, c, d, a, buffer[15], 22, 0x49B40821); + a = gg(a, b, c, d, buffer[1], 5, 0xF61E2562); + d = gg(d, a, b, c, buffer[6], 9, 0xC040B340); + c = gg(c, d, a, b, buffer[11], 14, 0x265E5A51); + b = gg(b, c, d, a, buffer[0], 20, 0xE9B6C7AA); + a = gg(a, b, c, d, buffer[5], 5, 0xD62F105D); + d = gg(d, a, b, c, buffer[10], 9, 0x02441453); + c = gg(c, d, a, b, buffer[15], 14, 0xD8A1E681); + b = gg(b, c, d, a, buffer[4], 20, 0xE7D3FBC8); + a = gg(a, b, c, d, buffer[9], 5, 0x21E1CDE6); + d = gg(d, a, b, c, buffer[14], 9, 0xC33707D6); + c = gg(c, d, a, b, buffer[3], 14, 0xF4D50D87); + b = gg(b, c, d, a, buffer[8], 20, 0x455A14ED); + a = gg(a, b, c, d, buffer[13], 5, 0xA9E3E905); + d = gg(d, a, b, c, buffer[2], 9, 0xFCEFA3F8); + c = gg(c, d, a, b, buffer[7], 14, 0x676F02D9); + b = gg(b, c, d, a, buffer[12], 20, 0x8D2A4C8A); + a = hh(a, b, c, d, buffer[5], 4, 0xFFFA3942); + d = hh(d, a, b, c, buffer[8], 11, 0x8771F681); + c = hh(c, d, a, b, buffer[11], 16, 0x6D9D6122); + b = hh(b, c, d, a, buffer[14], 23, 0xFDE5380C); + a = hh(a, b, c, d, buffer[1], 4, 0xA4BEEA44); + d = hh(d, a, b, c, buffer[4], 11, 0x4BDECFA9); + c = hh(c, d, a, b, buffer[7], 16, 0xF6BB4B60); + b = hh(b, c, d, a, buffer[10], 23, 0xBEBFBC70); + a = hh(a, b, c, d, buffer[13], 4, 0x289B7EC6); + d = hh(d, a, b, c, buffer[0], 11, 0xEAA127FA); + c = hh(c, d, a, b, buffer[3], 16, 0xD4EF3085); + b = hh(b, c, d, a, buffer[6], 23, 0x04881D05); + a = hh(a, b, c, d, buffer[9], 4, 0xD9D4D039); + d = hh(d, a, b, c, buffer[12], 11, 0xE6DB99E5); + c = hh(c, d, a, b, buffer[15], 16, 0x1FA27CF8); + b = hh(b, c, d, a, buffer[2], 23, 0xC4AC5665); + a = ii(a, b, c, d, buffer[0], 6, 0xF4292244); + d = ii(d, a, b, c, buffer[7], 10, 0x432AFF97); + c = ii(c, d, a, b, buffer[14], 15, 0xAB9423A7); + b = ii(b, c, d, a, buffer[5], 21, 0xFC93A039); + a = ii(a, b, c, d, buffer[12], 6, 0x655B59C3); + d = ii(d, a, b, c, buffer[3], 10, 0x8F0CCC92); + c = ii(c, d, a, b, buffer[10], 15, 0xFFEFF47D); + b = ii(b, c, d, a, buffer[1], 21, 0x85845DD1); + a = ii(a, b, c, d, buffer[8], 6, 0x6FA87E4F); + d = ii(d, a, b, c, buffer[15], 10, 0xFE2CE6E0); + c = ii(c, d, a, b, buffer[6], 15, 0xA3014314); + b = ii(b, c, d, a, buffer[13], 21, 0x4E0811A1); + a = ii(a, b, c, d, buffer[4], 6, 0xF7537E82); + d = ii(d, a, b, c, buffer[11], 10, 0xBD3AF235); + c = ii(c, d, a, b, buffer[2], 15, 0x2AD7D2BB); + b = ii(b, c, d, a, buffer[9], 21, 0xEB86D391); + w[0] = add(a, w[0]); + w[1] = add(b, w[1]); + w[2] = add(c, w[2]); + w[3] = add(d, w[3]);}; + } + (); + function caml_MD5Update(ctx, input, input_len){ + var in_buf = ctx.len & 0x3f, input_pos = 0; + ctx.len += input_len; + if(in_buf){ + var missing = 64 - in_buf; + if(input_len < missing){ + ctx.b8.set(input.subarray(0, input_len), in_buf); + return; + } + ctx.b8.set(input.subarray(0, missing), in_buf); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= missing; + input_pos += missing; + } + while(input_len >= 64){ + ctx.b8.set(input.subarray(input_pos, input_pos + 64), 0); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= 64; + input_pos += 64; + } + if(input_len) + ctx.b8.set(input.subarray(input_pos, input_pos + input_len), 0); + } + function caml_runtime_events_read_poll(cursor, callbacks, num){return 0;} + function caml_fresh_oo_id(){return caml_oo_last_id++;} + function caml_int64_to_float(x){return x.toFloat();} + function caml_ba_get_1(ba, i0){return ba.get(ba.offset(i0));} + function caml_bigstring_memcmp(s1, pos1, s2, pos2, len){ + for(var i = 0; i < len; i++){ + var a = caml_ba_get_1(s1, pos1 + i), b = caml_ba_get_1(s2, pos2 + i); + if(a < b) return - 1; + if(a > b) return 1; + } + return 0; + } + function caml_new_string(s){return caml_string_of_jsbytes(s);} + function caml_erf_float(x){ + var + a1 = 0.254829592, + a2 = - 0.284496736, + a3 = 1.421413741, + a4 = - 1.453152027, + a5 = 1.061405429, + p = 0.3275911, + sign = 1; + if(x < 0) sign = - 1; + x = Math.abs(x); + var + t = 1.0 / (1.0 + p * x), + y = + 1.0 + - + ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + * Math.exp(- (x * x)); + return sign * y; + } + function caml_ba_uint8_get32(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3); + return b1 << 0 | b2 << 8 | b3 << 16 | b4 << 24; + } + function caml_raw_backtrace_length(){return 0;} + function caml_str_initialize(unit){return 0;} + function caml_obj_block(tag, size){ + var o = new Array(size + 1); + o[0] = tag; + for(var i = 1; i <= size; i++) o[i] = 0; + return o; + } + function caml_gr_clear_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = s.width; + s.canvas.height = s.height; + return 0; + } + function bigstring_to_array_buffer(bs){return bs.data.buffer;} + function caml_sys_const_naked_pointers_checked(_unit){return 0;} + function lxor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] ^= nat2.data[ofs2]; return 0; + } + function caml_obj_add_offset(v, offset){ + caml_failwith("Obj.add_offset is not supported"); + } + function caml_final_release(){return 0;} + var caml_marshal_header_size = 20; + function caml_js_to_array(a){ + var len = a.length, b = new Array(len + 1); + b[0] = 0; + for(var i = 0; i < len; i++) b[i + 1] = a[i]; + return b; + } + function caml_sys_is_regular_file(name){ + var root = resolve_fs_device(name); + return root.device.isFile(root.rest); + } + function caml_gr_plot(x, y){ + var + s = caml_gr_state_get(), + im = s.context.createImageData(1, 1), + d = im.data, + color = s.color; + d[0] = color >> 16 & 0xff; + d[1] = color >> 8 & 0xff, d[2] = color >> 0 & 0xff; + d[3] = 0xFF; + s.x = x; + s.y = y; + s.context.putImageData(im, x, s.height - y); + return 0; + } + function caml_bytes_set64(s, i, i64){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = caml_int64_to_bytes(i64); + for(var j = 0; j < 8; j++) caml_bytes_unsafe_set(s, i + 7 - j, a[j]); + return 0; + } + function caml_string_set16(s, i, i16){caml_failwith("caml_string_set16");} + function caml_int64_bswap(x){ + var y = caml_int64_to_bytes(x); + return caml_int64_of_bytes + ([y[7], y[6], y[5], y[4], y[3], y[2], y[1], y[0]]); + } + function caml_gc_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_lex_array(s){ + s = caml_jsbytes_of_string(s); + var l = s.length / 2, a = new Array(l); + for(var i = 0; i < l; i++) + a[i] = (s.charCodeAt(2 * i) | s.charCodeAt(2 * i + 1) << 8) << 16 >> 16; + return a; + } + function caml_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0) return - base - 1; + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + function caml_sys_file_exists(name){ + var root = resolve_fs_device(name); + return root.device.exists(root.rest); + } + function caml_convert_raw_backtrace_slot(){ + caml_failwith("caml_convert_raw_backtrace_slot"); + } + function caml_array_sub(a, i, len){ + var a2 = new Array(len + 1); + a2[0] = 0; + for(var i2 = 1, i1 = i + 1; i2 <= len; i2++, i1++) a2[i2] = a[i1]; + return a2; + } + function caml_bytes_equal(s1, s2){ + if(s1 === s2) return 1; + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c == s2.c ? 1 : 0; + } + function caml_gr_size_x(){var s = caml_gr_state_get(); return s.width;} + function Base_int_math_int32_clz(x){ + var n = 32, y; + y = x >> 16; + if(y != 0){n = n - 16; x = y;} + y = x >> 8; + if(y != 0){n = n - 8; x = y;} + y = x >> 4; + if(y != 0){n = n - 4; x = y;} + y = x >> 2; + if(y != 0){n = n - 2; x = y;} + y = x >> 1; + if(y != 0) return n - 2; + return n - x; + } + function caml_ml_debug_info_status(){return 0;} + function caml_atomic_fetch_add(ref, i){ + var old = ref[1]; + ref[1] += i; + return old; + } + var + os_type = + globalThis.process && globalThis.process.platform + && globalThis.process.platform == "win32" + ? "Cygwin" + : "Unix"; + function caml_sys_const_ostype_cygwin(){return os_type == "Cygwin" ? 1 : 0; + } + function caml_cosh_float(x){return Math.cosh(x);} + function MlMutex(){this.locked = false;} + function caml_ml_mutex_new(unit){return new MlMutex();} + var caml_ephe_key_offset = 3; + function caml_ephe_check_key(x, i){ + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : 1; + } + function caml_hash_mix_final(h){ + h ^= h >>> 16; + h = caml_mul(h, 0x85ebca6b | 0); + h ^= h >>> 13; + h = caml_mul(h, 0xc2b2ae35 | 0); + h ^= h >>> 16; + return h; + } + function caml_gr_text_size(txt){ + var + s = caml_gr_state_get(), + w = s.context.measureText(caml_jsstring_of_string(txt)).width; + return [0, w, s.text_size]; + } + function caml_lex_run_mem(s, i, mem, curr_pos){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) + mem[dst + 1] = curr_pos; + else + mem[dst + 1] = mem[src + 1]; + } + } + function caml_lex_run_tag(s, i, mem){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) mem[dst + 1] = - 1; else mem[dst + 1] = mem[src + 1]; + } + } + function caml_new_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_mem = 10, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5, + lex_base_code = 6, + lex_backtrk_code = 7, + lex_default_code = 8, + lex_trans_code = 9, + lex_check_code = 10, + lex_code = 11; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + if(! tbl.lex_default_code){ + tbl.lex_base_code = caml_lex_array(tbl[lex_base_code]); + tbl.lex_backtrk_code = caml_lex_array(tbl[lex_backtrk_code]); + tbl.lex_check_code = caml_lex_array(tbl[lex_check_code]); + tbl.lex_trans_code = caml_lex_array(tbl[lex_trans_code]); + tbl.lex_default_code = caml_lex_array(tbl[lex_default_code]); + } + if(tbl.lex_code == null) + tbl.lex_code = caml_jsbytes_of_string(tbl[lex_code]); + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0){ + var pc_off = tbl.lex_base_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + return - base - 1; + } + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + var pc_off = tbl.lex_backtrk_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + var pstate = state; + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else{ + var base_code = tbl.lex_base_code[pstate], pc_off; + if(tbl.lex_check_code[base_code + c] == pstate) + pc_off = tbl.lex_trans_code[base_code + c]; + else + pc_off = tbl.lex_default_code[pstate]; + if(pc_off > 0) + caml_lex_run_mem + (tbl.lex_code, pc_off, lexbuf[lex_mem], lexbuf[lex_curr_pos]); + if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + } + function caml_ba_uint8_set64(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var v = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) ba.set(ofs + i, v[7 - i]); + return 0; + } + function caml_sys_executable_name(a){return caml_executable_name;} + function caml_lessequal(x, y){ + return + (caml_compare_val(x, y, false) <= 0); + } + function caml_acosh_float(x){return Math.acosh(x);} + function caml_MD5Init(){ + var + buffer = new ArrayBuffer(64), + b32 = new Uint32Array(buffer), + b8 = new Uint8Array(buffer); + return {len: 0, + w: + new Uint32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476]), + b32: b32, + b8: b8}; + } + function caml_ml_flush(chanid){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) caml_raise_sys_error("Cannot flush a closed channel"); + if(! chan.buffer || chan.buffer_curr == 0) return 0; + if(chan.output) + chan.output(caml_subarray_to_jsbytes(chan.buffer, 0, chan.buffer_curr)); + else + chan.file.write(chan.offset, chan.buffer, 0, chan.buffer_curr); + chan.offset += chan.buffer_curr; + chan.buffer_curr = 0; + return 0; + } + function caml_seek_out(chanid, pos){ + caml_ml_flush(chanid); + var chan = caml_ml_channels[chanid]; + chan.offset = pos; + return 0; + } + function caml_ml_seek_out_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_out(chanid, pos); + } + function compare_nat_real(nat1, nat2){ + return compare_nat(nat1, 0, nat1.data.length, nat2, 0, nat2.data.length); + } + function caml_gc_set(_control){return 0;} + function caml_js_get(o, f){return o[f];} + function caml_unix_isatty(fileDescriptor){ + if(fs_node_supported()){ + var tty = require("tty"); + return tty.isatty(fileDescriptor) ? 1 : 0; + } + else + return 0; + } + function caml_ml_set_buffered(chanid, v){ + caml_ml_channels[chanid].buffered = v; + if(! v) caml_ml_flush(chanid); + return 0; + } + function caml_hash_mix_bytes_arr(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = s[i] | s[i + 1] << 8 | s[i + 2] << 16 | s[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s[i + 2] << 16; + case 2: + w |= s[i + 1] << 8; + case 1: + w |= s[i]; h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_ml_bytes_content(s){ + switch(s.t & 6){ + default: caml_convert_string_to_bytes(s); + case 0: + return s.c; + case 4: + return s.c; + } + } + function caml_hash_mix_bytes(h, v){ + var content = caml_ml_bytes_content(v); + return typeof content === "string" + ? caml_hash_mix_jsbytes(h, content) + : caml_hash_mix_bytes_arr(h, content); + } + function caml_hash(count, limit, seed, obj){ + var queue, rd, wr, sz, num, h, v, i, len; + sz = limit; + if(sz < 0 || sz > 256) sz = 256; + num = count; + h = seed; + queue = [obj]; + rd = 0; + wr = 1; + while(rd < wr && num > 0){ + v = queue[rd++]; + if(v && v.caml_custom){ + if + (caml_custom_ops[v.caml_custom] && caml_custom_ops[v.caml_custom].hash){ + var hh = caml_custom_ops[v.caml_custom].hash(v); + h = caml_hash_mix_int(h, hh); + num--; + } + } + else if(v instanceof Array && v[0] === (v[0] | 0)) + switch(v[0]){ + case 248: + h = caml_hash_mix_int(h, v[2]); num--; break; + case 250: + queue[--rd] = v[1]; break; + default: + if(caml_is_continuation_tag(v[0])) break; + var tag = v.length - 1 << 10 | v[0]; + h = caml_hash_mix_int(h, tag); + for(i = 1, len = v.length; i < len; i++){if(wr >= sz) break; queue[wr++] = v[i]; + } + break; + } + else if(caml_is_ml_bytes(v)){ + h = caml_hash_mix_bytes(h, v); + num--; + } + else if(caml_is_ml_string(v)){ + h = caml_hash_mix_string(h, v); + num--; + } + else if(typeof v === "string"){ + h = caml_hash_mix_jsbytes(h, v); + num--; + } + else if(v === (v | 0)){ + h = caml_hash_mix_int(h, v + v + 1); + num--; + } + else if(v === + v){h = caml_hash_mix_float(h, v); num--;} + } + h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function Base_hash_string(s){return caml_hash(1, 1, 0, s);} + function caml_gc_compaction(){return 0;} + function caml_ephe_get_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_key"); + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : [0, weak]; + } + function caml_unix_localtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(d.getFullYear(), 0, 1).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000), + jan = new Date(d.getFullYear(), 0, 1), + jul = new Date(d.getFullYear(), 6, 1), + stdTimezoneOffset = + Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + return [0, + d.getSeconds(), + d.getMinutes(), + d.getHours(), + d.getDate(), + d.getMonth(), + d.getFullYear() - 1900, + d.getDay(), + doy, + d.getTimezoneOffset() < stdTimezoneOffset | 0]; + } + function caml_unix_mktime(tm){ + var + d = new Date(tm[6] + 1900, tm[5], tm[4], tm[3], tm[2], tm[1]).getTime(), + t = Math.floor(d / 1000), + tm2 = caml_unix_localtime(t); + return [0, t, tm2]; + } + function caml_bigstring_blit_bytes_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_bytes_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_bytes(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + var caml_sys_fds = new Array(3); + function caml_sys_close(fd){ + var file = caml_sys_fds[fd]; + if(file) file.close(); + delete caml_sys_fds[fd]; + return 0; + } + function caml_ml_close_channel(chanid){ + var chan = caml_ml_channels[chanid]; + chan.opened = false; + caml_sys_close(chan.fd); + return 0; + } + function Base_int_math_int_pow_stub(base, exponent){ + var one = 1, mul = [one, base, one, one], res = one; + while(! exponent == 0){ + mul[1] = mul[1] * mul[3] | 0; + mul[2] = mul[1] * mul[1] | 0; + mul[3] = mul[2] * mul[1] | 0; + res = res * mul[exponent & 3] | 0; + exponent = exponent >> 2; + } + return res; + } + function caml_atomic_exchange(ref, v){ + var r = ref[1]; + ref[1] = v; + return r; + } + function caml_sys_isatty(_chan){return 0;} + function is_digit_zero(nat, ofs){ + if(nat.data[ofs] == 0) return 1; + return 0; + } + function caml_unix_lstat(name){ + var root = resolve_fs_device(name); + if(! root.device.lstat) caml_failwith("caml_unix_lstat: not implemented"); + return root.device.lstat(root.rest, true); + } + function caml_unix_lstat_64(name){ + var r = caml_unix_lstat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_js_set(o, f, v){o[f] = v; return 0;} + function caml_array_get(array, index){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + return array[index + 1]; + } + function caml_continuation_use_noexc(cont){ + var stack = cont[1]; + cont[1] = 0; + return stack; + } + function caml_unix_rmdir(name){ + var root = resolve_fs_device(name); + if(! root.device.rmdir) caml_failwith("caml_unix_rmdir: not implemented"); + return root.device.rmdir(root.rest, true); + } + function caml_log2_float(x){return Math.log2(x);} + function caml_gc_huge_fallback_count(unit){return 0;} + function caml_runtime_events_resume(){return 0;} + function caml_spacetime_only_works_for_native_code(){ + caml_failwith("Spacetime profiling only works for native code"); + } + function caml_int64_sub(x, y){return x.sub(y);} + function caml_seek_in(chanid, pos){ + var chan = caml_ml_channels[chanid]; + if(chan.refill != null) caml_raise_sys_error("Illegal seek"); + if + (pos >= chan.offset - chan.buffer_max && pos <= chan.offset + && chan.file.flags.binary) + chan.buffer_curr = chan.buffer_max - (chan.offset - pos); + else{chan.offset = pos; chan.buffer_curr = 0; chan.buffer_max = 0;} + return 0; + } + function caml_ml_seek_in_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_in(chanid, pos); + } + var caml_domain_id = 0; + function caml_ml_mutex_unlock(t){t.locked = false; return 0;} + var caml_domain_latest_idx = 1; + function caml_domain_spawn(f, mutex){ + var id = caml_domain_latest_idx++, old = caml_domain_id; + caml_domain_id = id; + caml_callback(f, [0]); + caml_domain_id = old; + caml_ml_mutex_unlock(mutex); + return id; + } + function caml_unix_mkdir(name, perm){ + var root = resolve_fs_device(name); + if(! root.device.mkdir) caml_failwith("caml_unix_mkdir: not implemented"); + return root.device.mkdir(root.rest, perm, true); + } + function caml_int64_shift_left(x, s){return x.shift_left(s);} + function caml_notequal(x, y){ + return + (caml_compare_val(x, y, false) != 0); + } + function caml_sys_const_int_size(){return 32;} + function caml_js_wrap_callback(f){ + return function(){ + var len = arguments.length; + if(len > 0){ + var args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + } + else + args = [undefined]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_js_wrap_meth_callback(f){ + return function(){ + var len = arguments.length, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_is_js(){return 1;} + var Base_internalhash_fold_float = caml_hash_mix_float; + function caml_lazy_update_to_forward(o){ + caml_obj_update_tag(o, 244, 250); + return 0; + } + function caml_ba_dim(ba, i){ + if(i < 0 || i >= ba.dims.length) caml_invalid_argument("Bigarray.dim"); + return ba.dims[i]; + } + function caml_ba_dim_1(ba){return caml_ba_dim(ba, 0);} + function caml_js_meth_call(o, f, args){ + return o[caml_jsstring_of_string(f)].apply(o, caml_js_from_array(args)); + } + var caml_ephe_data_offset = 2; + function caml_weak_create(n){ + if(n < 0) caml_invalid_argument("Weak.create"); + var x = [251, "caml_ephe_list_head"]; + x.length = caml_ephe_key_offset + n; + return x; + } + function caml_ephe_create(n){var x = caml_weak_create(n); return x;} + function caml_js_to_byte_string(s){return caml_string_of_jsbytes(s);} + function caml_trampoline(res){ + var c = 1; + while(res && res.joo_tramp){ + res = res.joo_tramp.apply(null, res.joo_args); + c++; + } + return res; + } + function caml_maybe_print_stats(unit){return 0;} + function caml_bytes_unsafe_get(s, i){ + switch(s.t & 6){ + default: if(i >= s.c.length) return 0; + case 0: + return s.c.charCodeAt(i); + case 4: + return s.c[i]; + } + } + function caml_bytes_get64(s, i){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_bytes_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + var caml_custom_event_index = 0; + function caml_runtime_events_user_register + (event_name, event_tag, event_type){ + caml_custom_event_index += 1; + return [0, caml_custom_event_index, event_name, event_type, event_tag]; + } + function caml_unix_has_symlink(unit){return fs_node_supported() ? 1 : 0;} + function caml_ephe_set_key(x, i, v){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if(v instanceof Object && globalThis.WeakRef){ + if(x[1].register) x[1].register(v, undefined, v); + x[caml_ephe_key_offset + i] = new globalThis.WeakRef(v); + } + else + x[caml_ephe_key_offset + i] = v; + return 0; + } + function caml_ephe_unset_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if + (globalThis.WeakRef + && x[caml_ephe_key_offset + i] instanceof globalThis.WeakRef + && x[1].unregister){ + var old = x[caml_ephe_key_offset + i].deref(); + if(old !== undefined){ + var count = 0; + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key === old) count++; + } + } + if(count == 1) x[1].unregister(old); + } + } + x[caml_ephe_key_offset + i] = undefined; + return 0; + } + function caml_weak_set(x, i, v){ + if(v == 0) caml_ephe_unset_key(x, i); else caml_ephe_set_key(x, i, v[1]); + return 0; + } + function caml_sys_remove(name){ + var root = resolve_fs_device(name), ok = root.device.unlink(root.rest); + if(ok == 0) caml_raise_no_such_file(caml_jsbytes_of_string(name)); + return 0; + } + function caml_string_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_string_get32(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 3) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1), + b3 = caml_string_unsafe_get(s, i + 2), + b4 = caml_string_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_bytes_get(s, i){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_get(s, i); + } + function caml_hypot_float(x, y){return Math.hypot(x, y);} + function caml_js_call(f, o, args){ + return f.apply(o, caml_js_from_array(args)); + } + function caml_sys_const_max_wosize(){return 0x7FFFFFFF / 4 | 0;} + function caml_unix_inet_addr_of_string(){return 0;} + function Base_am_testing(x){return 0;} + function caml_bytes_lessthan(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? 1 : 0; + } + function caml_erfc_float(x){return 1 - caml_erf_float(x);} + function caml_gr_fill_poly(ar){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(ar[1][1], s.height - ar[1][2]); + for(var i = 2; i < ar.length; i++) + s.context.lineTo(ar[i][1], s.height - ar[i][2]); + s.context.lineTo(ar[1][1], s.height - ar[1][2]); + s.context.fill(); + return 0; + } + function caml_gc_quick_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_ml_input_char(chanid){ + var chan = caml_ml_channels[chanid]; + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) caml_raise_end_of_file(); + var res = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + return res; + } + function caml_ml_input_int(chanid){ + var chan = caml_ml_channels[chanid], res = 0; + for(var i = 0; i < 4; i++) + res = (res << 8) + caml_ml_input_char(chanid) | 0; + return res | 0; + } + function caml_gr_display_mode(){ + caml_failwith("caml_gr_display_mode not Implemented"); + } + function caml_obj_reachable_words(o){return 0;} + function nth_digit_nat(nat, ofs){return nat.data[ofs];} + function caml_array_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_float_of_string(s){ + var res; + s = caml_jsbytes_of_string(s); + res = + s; + if(s.length > 0 && res === res) return res; + s = s.replace(/_/g, ""); + res = + s; + if(s.length > 0 && res === res || /^[+-]?nan$/i.test(s)) return res; + var m = /^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?/i.exec(s); + if(m){ + var + m3 = m[3].replace(/0+$/, ""), + mantissa = parseInt(m[1] + m[2] + m3, 16), + exponent = (m[5] | 0) - 4 * m3.length; + res = mantissa * Math.pow(2, exponent); + return res; + } + if(/^\+?inf(inity)?$/i.test(s)) return Infinity; + if(/^-inf(inity)?$/i.test(s)) return - Infinity; + caml_failwith("float_of_string"); + } + function caml_sys_getcwd(){ + return caml_string_of_jsbytes(caml_current_dir); + } + function caml_int64_add(x, y){return x.add(y);} + function caml_int64_mul(x, y){return x.mul(y);} + function caml_int64_ult(x, y){return x.ucompare(y) < 0;} + function caml_parse_sign_and_base(s){ + var i = 0, len = caml_ml_string_length(s), base = 10, sign = 1; + if(len > 0) + switch(caml_string_unsafe_get(s, i)){ + case 45: + i++; sign = - 1; break; + case 43: + i++; sign = 1; break; + } + if(i + 1 < len && caml_string_unsafe_get(s, i) == 48) + switch(caml_string_unsafe_get(s, i + 1)){ + case 120: + case 88: + base = 16; i += 2; break; + case 111: + case 79: + base = 8; i += 2; break; + case 98: + case 66: + base = 2; i += 2; break; + case 117: + case 85: + i += 2; break; + } + return [i, sign, base]; + } + function caml_parse_digit(c){ + if(c >= 48 && c <= 57) return c - 48; + if(c >= 65 && c <= 90) return c - 55; + if(c >= 97 && c <= 122) return c - 87; + return - 1; + } + function caml_int64_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + base64 = caml_int64_of_int32(base), + threshold = + new MlInt64(0xffffff, 0xfffffff, 0xffff).udivmod(base64).quotient, + c = caml_string_unsafe_get(s, i), + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = caml_int64_of_int32(d); + for(;;){ + i++; + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + if(caml_int64_ult(threshold, res)) caml_failwith("int_of_string"); + d = caml_int64_of_int32(d); + res = caml_int64_add(caml_int64_mul(base64, res), d); + if(caml_int64_ult(res, d)) caml_failwith("int_of_string"); + } + if(i != caml_ml_string_length(s)) caml_failwith("int_of_string"); + if(base == 10 && caml_int64_ult(new MlInt64(0, 0, 0x8000), res)) + caml_failwith("int_of_string"); + if(sign < 0) res = caml_int64_neg(res); + return res; + } + function caml_ba_set_1(ba, i0, v){ba.set(ba.offset(i0), v); return 0;} + function caml_int64_xor(x, y){return x.xor(y);} + function caml_int64_or(x, y){return x.or(y);} + function caml_lxm_next(v){ + function shift_l(x, k){return caml_int64_shift_left(x, k);} + function shift_r(x, k){return caml_int64_shift_right_unsigned(x, k);} + function or(a, b){return caml_int64_or(a, b);} + function xor(a, b){return caml_int64_xor(a, b);} + function add(a, b){return caml_int64_add(a, b);} + function mul(a, b){return caml_int64_mul(a, b);} + function rotl(x, k){return or(shift_l(x, k), shift_r(x, 64 - k));} + function get(a, i){return caml_ba_get_1(a, i);} + function set(a, i, x){return caml_ba_set_1(a, i, x);} + var + M = caml_int64_of_string(caml_new_string("0xd1342543de82ef95")), + daba = caml_int64_of_string(caml_new_string("0xdaba0b6eb09322e3")), + z, + q0, + q1, + st = v, + a = get(st, 0), + s = get(st, 1), + x0 = get(st, 2), + x1 = get(st, 3); + z = add(s, x0); + z = mul(xor(z, shift_r(z, 32)), daba); + z = mul(xor(z, shift_r(z, 32)), daba); + z = xor(z, shift_r(z, 32)); + set(st, 1, add(mul(s, M), a)); + var q0 = x0, q1 = x1; + q1 = xor(q1, q0); + q0 = rotl(q0, 24); + q0 = xor(xor(q0, q1), shift_l(q1, 16)); + q1 = rotl(q1, 37); + set(st, 2, q0); + set(st, 3, q1); + return z; + } + function caml_sys_const_big_endian(){return 0;} + function caml_list_to_js_array(l){ + var a = []; + for(; l !== 0; l = l[2]) a.push(l[1]); + return a; + } + var + caml_output_val = + function(){ + function Writer(){this.chunk = [];} + Writer.prototype = + {chunk_idx: 20, + block_len: 0, + obj_counter: 0, + size_32: 0, + size_64: 0, + write: + function(size, value){ + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_at: + function(pos, size, value){ + var pos = pos; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[pos++] = value >> i & 0xFF; + }, + write_code: + function(size, code, value){ + this.chunk[this.chunk_idx++] = code; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_shared: + function(offset){ + if(offset < 1 << 8) + this.write_code(8, 0x04, offset); + else if(offset < 1 << 16) + this.write_code(16, 0x05, offset); + else + this.write_code(32, 0x06, offset); + }, + pos: function(){return this.chunk_idx;}, + finalize: + function(){ + this.block_len = this.chunk_idx - 20; + this.chunk_idx = 0; + this.write(32, 0x8495A6BE); + this.write(32, this.block_len); + this.write(32, this.obj_counter); + this.write(32, this.size_32); + this.write(32, this.size_64); + return this.chunk; + }}; + return function(v, flags){ + flags = caml_list_to_js_array(flags); + var + no_sharing = flags.indexOf(0) !== - 1, + closures = flags.indexOf(1) !== - 1; + if(closures) + console.warn + ("in caml_output_val: flag Marshal.Closures is not supported."); + var + writer = new Writer(), + stack = [], + intern_obj_table = no_sharing ? null : new MlObjectTable(); + function memo(v){ + if(no_sharing) return false; + var existing_offset = intern_obj_table.recall(v); + if(existing_offset){ + writer.write_shared(existing_offset); + return true; + } + else{intern_obj_table.store(v); return false;} + } + function extern_rec(v){ + if(v.caml_custom){ + if(memo(v)) return; + var + name = v.caml_custom, + ops = caml_custom_ops[name], + sz_32_64 = [0, 0]; + if(! ops.serialize) + caml_invalid_argument("output_value: abstract value (Custom)"); + if(ops.fixed_length == undefined){ + writer.write(8, 0x18); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var header_pos = writer.pos(); + for(var i = 0; i < 12; i++) writer.write(8, 0); + ops.serialize(writer, v, sz_32_64); + writer.write_at(header_pos, 32, sz_32_64[0]); + writer.write_at(header_pos + 4, 32, 0); + writer.write_at(header_pos + 8, 32, sz_32_64[1]); + } + else{ + writer.write(8, 0x19); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var old_pos = writer.pos(); + ops.serialize(writer, v, sz_32_64); + if(ops.fixed_length != writer.pos() - old_pos) + caml_failwith + ("output_value: incorrect fixed sizes specified by " + name); + } + writer.size_32 += 2 + (sz_32_64[0] + 3 >> 2); + writer.size_64 += 2 + (sz_32_64[1] + 7 >> 3); + } + else if(v instanceof Array && v[0] === (v[0] | 0)){ + if(v[0] == 251) + caml_failwith("output_value: abstract value (Abstract)"); + if(caml_is_continuation_tag(v[0])) + caml_invalid_argument("output_value: continuation value"); + if(v.length > 1 && memo(v)) return; + if(v[0] < 16 && v.length - 1 < 8) + writer.write(8, 0x80 + v[0] + (v.length - 1 << 4)); + else + writer.write_code(32, 0x08, v.length - 1 << 10 | v[0]); + writer.size_32 += v.length; + writer.size_64 += v.length; + if(v.length > 1) stack.push(v, 1); + } + else if(caml_is_ml_bytes(v)){ + if(! caml_is_ml_bytes(caml_string_of_jsbytes(""))) + caml_failwith + ("output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]"); + if(memo(v)) return; + var len = caml_ml_bytes_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_bytes_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(caml_is_ml_string(v)){ + var len = caml_ml_string_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_string_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(v != (v | 0)){ + var type_of_v = typeof v; + caml_failwith("output_value: abstract value (" + type_of_v + ")"); + } + else if(v >= 0 && v < 0x40) + writer.write(8, 0X40 + v); + else if(v >= - (1 << 7) && v < 1 << 7) + writer.write_code(8, 0x00, v); + else if(v >= - (1 << 15) && v < 1 << 15) + writer.write_code(16, 0x01, v); + else + writer.write_code(32, 0x02, v); + } + extern_rec(v); + while(stack.length > 0){ + var i = stack.pop(), v = stack.pop(); + if(i + 1 < v.length) stack.push(v, i + 1); + extern_rec(v[i]); + } + if(intern_obj_table) + writer.obj_counter = intern_obj_table.objs.length; + writer.finalize(); + return writer.chunk;}; + } + (); + function caml_string_of_array(a){ + return caml_string_of_jsbytes(caml_subarray_to_jsbytes(a, 0, a.length)); + } + function caml_output_value_to_string(v, flags){ + return caml_string_of_array(caml_output_val(v, flags)); + } + function caml_raise_not_a_dir(name){ + caml_raise_sys_error(name + ": Not a directory"); + } + function caml_sys_system_command(cmd){ + var cmd = caml_jsstring_of_string(cmd); + if(typeof require != "undefined"){ + var child_process = require("child_process"); + if(child_process && child_process.execSync) + try{child_process.execSync(cmd, {stdio: "inherit"}); return 0;} + catch(e){return 1;} + } + else + return 127; + } + function caml_js_error_of_exception(exn){ + if(exn.js_error) return exn.js_error; + return null; + } + function caml_unix_getuid(unit){ + if(globalThis.process && globalThis.process.getuid) + return globalThis.process.getuid(); + caml_raise_not_found(); + } + function deserialize_nat(reader, sz){ + var len = reader.read32s(), nat = new MlNat(len); + for(var i = 0; i < len; i++) nat.data[i] = reader.read32s(); + sz[0] = len * 4; + return nat; + } + function initialize_nat(){ + caml_custom_ops["_nat"] = + {deserialize: deserialize_nat, + serialize: serialize_nat, + hash: caml_hash_nat}; + } + function caml_bytes_of_utf16_jsstring(s){ + var tag = 9; + if(! jsoo_is_ascii(s)) tag = 8, s = caml_utf8_of_utf16(s); + return new MlBytes(tag, s, s.length); + } + function caml_gr_open_subwindow(a, b, c, d){ + caml_failwith("caml_gr_open_subwindow not Implemented"); + } + function UInt8ArrayReader(s, i){this.s = s; this.i = i;} + UInt8ArrayReader.prototype = + {read8u: function(){return this.s[this.i++];}, + read8s: function(){return this.s[this.i++] << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 8 | s[i + 1]; + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 24 >> 16 | s[i + 1]; + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]) >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]; + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_array(this.s.subarray(i, i + len)); + }, + readuint8array: + function(len){ + var i = this.i; + this.i = i + len; + return this.s.subarray(i, i + len); + }}; + function caml_marshal_data_size(s, ofs){ + var r = new UInt8ArrayReader(caml_uint8_array_of_bytes(s), ofs); + function readvlq(overflow){ + var c = r.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = r.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + switch(r.read32u()){ + case 0x8495A6BE: + var header_len = 20, data_len = r.read32u(); break; + case 0x8495A6BD: + var + header_len = r.read8u() & 0x3F, + overflow = [false], + data_len = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("Marshal.data_size: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + default: caml_failwith("Marshal.data_size: bad object"); break; + } + return header_len - caml_marshal_header_size + data_len; + } + function MlStringReader(s, i){ + this.s = caml_jsbytes_of_string(s); + this.i = i; + } + MlStringReader.prototype = + {read8u: function(){return this.s.charCodeAt(this.i++);}, + read8s: function(){return this.s.charCodeAt(this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 8 | s.charCodeAt(i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 24 >> 16 | s.charCodeAt(i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3); + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_jsbytes(this.s.substring(i, i + len)); + }, + readuint8array: + function(len){ + var b = new Uint8Array(len), s = this.s, i = this.i; + for(var j = 0; j < len; j++) b[j] = s.charCodeAt(i + j); + this.i = i + len; + return b; + }}; + var + zstd_decompress = + function(){ + "use strict"; + var + ab = ArrayBuffer, + u8 = Uint8Array, + u16 = Uint16Array, + i16 = Int16Array, + u32 = Uint32Array, + i32 = Int32Array; + function slc(v, s, e){ + if(u8.prototype.slice) return u8.prototype.slice.call(v, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + var n = new u8(e - s); + n.set(v.subarray(s, e)); + return n; + } + function fill(v, n, s, e){ + if(u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + for(; s < e; ++s) v[s] = n; + return v; + } + function cpw(v, t, s, e){ + if(u8.prototype.copyWithin) + return u8.prototype.copyWithin.call(v, t, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + while(s < e) v[t++] = v[s++]; + } + var + ec = + ["invalid zstd data", + "window size too large (>2046MB)", + "invalid block type", + "FSE accuracy too high", + "match distance too far back", + "unexpected EOF"]; + function err(ind, msg, nt){ + var e = new Error(msg || ec[ind]); + e.code = ind; + if(! nt) throw e; + return e; + } + function rb(d, b, n){ + var i = 0, o = 0; + for(; i < n; ++i) o |= d[b++] << (i << 3); + return o; + } + function b4(d, b){ + return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; + } + function rzfh(dat, w){ + var n3 = dat[0] | dat[1] << 8 | dat[2] << 16; + if(n3 == 0x2FB528 && dat[3] == 253){ + var + flg = dat[4], + ss = flg >> 5 & 1, + cc = flg >> 2 & 1, + df = flg & 3, + fcf = flg >> 6; + if(flg & 8) err(0); + var bt = 6 - ss, db = df == 3 ? 4 : df, di = rb(dat, bt, db); + bt += db; + var + fsb = fcf ? 1 << fcf : ss, + fss = rb(dat, bt, fsb) + (fcf == 1 && 256), + ws = fss; + if(! ss){ + var wb = 1 << 10 + (dat[5] >> 3); + ws = wb + (wb >> 3) * (dat[5] & 7); + } + if(ws > 2145386496) err(1); + var buf = new u8((w == 1 ? fss || ws : w ? 0 : ws) + 12); + buf[0] = 1, buf[4] = 4, buf[8] = 8; + return {b: bt + fsb, + y: 0, + l: 0, + d: di, + w: w && w != 1 ? w : buf.subarray(12), + e: ws, + o: new i32(buf.buffer, 0, 3), + u: fss, + c: cc, + m: Math.min(131072, ws)}; + } + else if((n3 >> 4 | dat[3] << 20) == 0x184D2A5) return b4(dat, 4) + 8; + err(0); + } + function msb(val){ + var bits = 0; + for(; 1 << bits <= val; ++bits) ; + return bits - 1; + } + function rfse(dat, bt, mal){ + var tpos = (bt << 3) + 4, al = (dat[bt] & 15) + 5; + if(al > mal) err(3); + var + sz = 1 << al, + probs = sz, + sym = - 1, + re = - 1, + i = - 1, + ht = sz, + buf = new ab(512 + (sz << 2)), + freq = new i16(buf, 0, 256), + dstate = new u16(buf, 0, 256), + nstate = new u16(buf, 512, sz), + bb1 = 512 + (sz << 1), + syms = new u8(buf, bb1, sz), + nbits = new u8(buf, bb1 + sz); + while(sym < 255 && probs > 0){ + var + bits = msb(probs + 1), + cbt = tpos >> 3, + msk = (1 << bits + 1) - 1, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7) + & msk, + msk1fb = (1 << bits) - 1, + msv = msk - probs - 1, + sval = val & msk1fb; + if(sval < msv) + tpos += bits, val = sval; + else{tpos += bits + 1; if(val > msk1fb) val -= msv;} + freq[++sym] = --val; + if(val == - 1){probs += val; syms[--ht] = sym;} else probs -= val; + if(! val) + do{ + var rbt = tpos >> 3; + re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3; + tpos += 2; + sym += re; + } + while + (re == 3); + } + if(sym > 255 || probs) err(0); + var sympos = 0, sstep = (sz >> 1) + (sz >> 3) + 3, smask = sz - 1; + for(var s = 0; s <= sym; ++s){ + var sf = freq[s]; + if(sf < 1){dstate[s] = - sf; continue;} + for(i = 0; i < sf; ++i){ + syms[sympos] = s; + do sympos = sympos + sstep & smask;while(sympos >= ht); + } + } + if(sympos) err(0); + for(i = 0; i < sz; ++i){ + var ns = dstate[syms[i]]++, nb = nbits[i] = al - msb(ns); + nstate[i] = (ns << nb) - sz; + } + return [tpos + 7 >> 3, {b: al, s: syms, n: nbits, t: nstate}]; + } + function rhu(dat, bt){ + var + i = 0, + wc = - 1, + buf = new u8(292), + hb = dat[bt], + hw = buf.subarray(0, 256), + rc = buf.subarray(256, 268), + ri = new u16(buf.buffer, 268); + if(hb < 128){ + var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1]; + bt += hb; + var epos = ebt << 3, lb = dat[bt]; + if(! lb) err(0); + var + st1 = 0, + st2 = 0, + btr1 = fdt.b, + btr2 = btr1, + fpos = (++bt << 3) - 8 + msb(lb); + for(;;){ + fpos -= btr1; + if(fpos < epos) break; + var cbt = fpos >> 3; + st1 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1; + hw[++wc] = fdt.s[st1]; + fpos -= btr2; + if(fpos < epos) break; + cbt = fpos >> 3; + st2 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1; + hw[++wc] = fdt.s[st2]; + btr1 = fdt.n[st1]; + st1 = fdt.t[st1]; + btr2 = fdt.n[st2]; + st2 = fdt.t[st2]; + } + if(++wc > 255) err(0); + } + else{ + wc = hb - 127; + for(; i < wc; i += 2){ + var byte = dat[++bt]; + hw[i] = byte >> 4; + hw[i + 1] = byte & 15; + } + ++bt; + } + var wes = 0; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + if(wt > 11) err(0); + wes += wt && 1 << wt - 1; + } + var mb = msb(wes) + 1, ts = 1 << mb, rem = ts - wes; + if(rem & rem - 1) err(0); + hw[wc++] = msb(rem) + 1; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + ++rc[hw[i] = wt && mb + 1 - wt]; + } + var + hbuf = new u8(ts << 1), + syms = hbuf.subarray(0, ts), + nb = hbuf.subarray(ts); + ri[mb] = 0; + for(i = mb; i > 0; --i){ + var pv = ri[i]; + fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i)); + } + if(ri[0] != ts) err(0); + for(i = 0; i < wc; ++i){ + var bits = hw[i]; + if(bits){ + var code = ri[bits]; + fill(syms, i, code, ri[bits] = code + (1 << mb - bits)); + } + } + return [bt, {n: nb, b: mb, s: syms}]; + } + var + dllt = + rfse + (new + u8 + ([81, + 16, + 99, + 140, + 49, + 198, + 24, + 99, + 12, + 33, + 196, + 24, + 99, + 102, + 102, + 134, + 70, + 146, + 4]), + 0, + 6) + [1], + dmlt = + rfse + (new + u8 + ([33, + 20, + 196, + 24, + 99, + 140, + 33, + 132, + 16, + 66, + 8, + 33, + 132, + 16, + 66, + 8, + 33, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 36, + 9]), + 0, + 6) + [1], + doct = + rfse + (new u8([32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2]), + 0, + 5) + [1]; + function b2bl(b, s){ + var len = b.length, bl = new i32(len); + for(var i = 0; i < len; ++i){bl[i] = s; s += 1 << b[i];} + return bl; + } + var + llb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 16843009, + 50528770, + 134678020, + 202050057, + 269422093]).buffer, + 0, + 36), + llbl = b2bl(llb, 0), + mlb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16843009, + 50528770, + 117769220, + 185207048, + 252579084, + 16]).buffer, + 0, + 53), + mlbl = b2bl(mlb, 3); + function dhu(dat, out, hu){ + var + len = dat.length, + ss = out.length, + lb = dat[len - 1], + msk = (1 << hu.b) - 1, + eb = - hu.b; + if(! lb) err(0); + var + st = 0, + btr = hu.b, + pos = (len << 3) - 8 + msb(lb) - btr, + i = - 1; + for(; pos > eb && i < ss;){ + var + cbt = pos >> 3, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7); + st = (st << btr | val) & msk; + out[++i] = hu.s[st]; + pos -= btr = hu.n[st]; + } + if(pos != eb || i + 1 != ss) err(0); + } + function dhu4(dat, out, hu){ + var + bt = 6, + ss = out.length, + sz1 = ss + 3 >> 2, + sz2 = sz1 << 1, + sz3 = sz1 + sz2; + dhu + (dat.subarray(bt, bt += dat[0] | dat[1] << 8), + out.subarray(0, sz1), + hu); + dhu + (dat.subarray(bt, bt += dat[2] | dat[3] << 8), + out.subarray(sz1, sz2), + hu); + dhu + (dat.subarray(bt, bt += dat[4] | dat[5] << 8), + out.subarray(sz2, sz3), + hu); + dhu(dat.subarray(bt), out.subarray(sz3), hu); + } + function rzb(dat, st, out){ + var _a, bt = st.b, b0 = dat[bt], btype = b0 >> 1 & 3; + st.l = b0 & 1; + var + sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13, + ebt = (bt += 3) + sz; + if(btype == 1){ + if(bt >= dat.length) return; + st.b = bt + 1; + if(out){fill(out, dat[bt], st.y, st.y += sz); return out;} + return fill(new u8(sz), dat[bt]); + } + if(ebt > dat.length) return; + if(btype == 0){ + st.b = ebt; + if(out){ + out.set(dat.subarray(bt, ebt), st.y); + st.y += sz; + return out; + } + return slc(dat, bt, ebt); + } + if(btype == 2){ + var + b3 = dat[bt], + lbt = b3 & 3, + sf = b3 >> 2 & 3, + lss = b3 >> 4, + lcs = 0, + s4 = 0; + if(lbt < 2) + if(sf & 1) + lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12); + else + lss = b3 >> 3; + else{ + s4 = sf; + if(sf < 2) + lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2; + else if(sf == 2) + lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12, + lcs = dat[bt] >> 2 | dat[++bt] << 6; + else + lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12, + lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10; + } + ++bt; + var + buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m), + spl = buf.length - lss; + if(lbt == 0) + buf.set(dat.subarray(bt, bt += lss), spl); + else if(lbt == 1) + fill(buf, dat[bt++], spl); + else{ + var hu = st.h; + if(lbt == 2){ + var hud = rhu(dat, bt); + lcs += bt - (bt = hud[0]); + st.h = hu = hud[1]; + } + else if(! hu) err(0); + (s4 ? dhu4 : dhu) + (dat.subarray(bt, bt += lcs), buf.subarray(spl), hu); + } + var ns = dat[bt++]; + if(ns){ + if(ns == 255) + ns = (dat[bt++] | dat[bt++] << 8) + 0x7F00; + else if(ns > 127) ns = ns - 128 << 8 | dat[bt++]; + var scm = dat[bt++]; + if(scm & 3) err(0); + var dts = [dmlt, doct, dllt]; + for(var i = 2; i > - 1; --i){ + var md = scm >> (i << 1) + 2 & 3; + if(md == 1){ + var rbuf = new u8([0, 0, dat[bt++]]); + dts[i] = + {s: rbuf.subarray(2, 3), + n: rbuf.subarray(0, 1), + t: new u16(rbuf.buffer, 0, 1), + b: 0}; + } + else if(md == 2) + _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1]; + else if(md == 3){if(! st.t) err(0); dts[i] = st.t[i];} + } + var + _b = st.t = dts, + mlt = _b[0], + oct = _b[1], + llt = _b[2], + lb = dat[ebt - 1]; + if(! lb) err(0); + var + spos = (ebt << 3) - 8 + msb(lb) - llt.b, + cbt = spos >> 3, + oubt = 0, + lst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1; + cbt = (spos -= oct.b) >> 3; + var + ost = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1; + cbt = (spos -= mlt.b) >> 3; + var + mst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1; + for(++ns; --ns;){ + var + llc = llt.s[lst], + lbtr = llt.n[lst], + mlc = mlt.s[mst], + mbtr = mlt.n[mst], + ofc = oct.s[ost], + obtr = oct.n[ost]; + cbt = (spos -= ofc) >> 3; + var + ofp = 1 << ofc, + off = + ofp + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16 + | dat[cbt + 3] << 24) + >>> (spos & 7) + & ofp - 1); + cbt = (spos -= mlb[mlc]) >> 3; + var + ml = + mlbl[mlc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << mlb[mlc]) - 1); + cbt = (spos -= llb[llc]) >> 3; + var + ll = + llbl[llc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << llb[llc]) - 1); + cbt = (spos -= lbtr) >> 3; + lst = + llt.t[lst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1); + cbt = (spos -= mbtr) >> 3; + mst = + mlt.t[mst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1); + cbt = (spos -= obtr) >> 3; + ost = + oct.t[ost] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1); + if(off > 3){ + st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off -= 3; + } + else{ + var idx = off - (ll != 0); + if(idx){ + off = idx == 3 ? st.o[0] - 1 : st.o[idx]; + if(idx > 1) st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off; + } + else + off = st.o[0]; + } + for(var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i]; + oubt += ll, spl += ll; + var stin = oubt - off; + if(stin < 0){ + var len = - stin, bs = st.e + stin; + if(len > ml) len = ml; + for(var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i]; + oubt += len, ml -= len, stin = 0; + } + for(var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i]; + oubt += ml; + } + if(oubt != spl) + while(spl < buf.length) buf[oubt++] = buf[spl++]; + else + oubt = buf.length; + if(out) st.y += oubt; else buf = slc(buf, 0, oubt); + } + else if(out){ + st.y += lss; + if(spl) for(var i = 0; i < lss; ++i) buf[i] = buf[spl + i]; + } + else if(spl) buf = slc(buf, spl); + st.b = ebt; + return buf; + } + err(2); + } + function cct(bufs, ol){ + if(bufs.length == 1) return bufs[0]; + var buf = new u8(ol); + for(var i = 0, b = 0; i < bufs.length; ++i){ + var chk = bufs[i]; + buf.set(chk, b); + b += chk.length; + } + return buf; + } + return function(dat, buf){ + var bt = 0, bufs = [], nb = + ! buf, ol = 0; + for(; dat.length;){ + var st = rzfh(dat, nb || buf); + if(typeof st == "object"){ + if(nb){ + buf = null; + if(st.w.length == st.u){bufs.push(buf = st.w); ol += st.u;} + } + else{bufs.push(buf); st.e = 0;} + for(; ! st.l;){ + var blk = rzb(dat, st, buf); + if(! blk) err(5); + if(buf) + st.e = st.y; + else{ + bufs.push(blk); + ol += blk.length; + cpw(st.w, 0, blk.length); + st.w.set(blk, st.w.length - blk.length); + } + } + bt = st.b + st.c * 4; + } + else + bt = st; + dat = dat.subarray(bt); + } + return cct(bufs, ol);}; + } + (); + function caml_float_of_bytes(a){ + return caml_int64_float_of_bits(caml_int64_of_bytes(a)); + } + function caml_input_value_from_reader(reader, ofs){ + function readvlq(overflow){ + var c = reader.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = reader.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + var magic = reader.read32u(); + switch(magic){ + case 0x8495A6BE: + var + header_len = 20, + compressed = 0, + data_len = reader.read32u(), + uncompressed_data_len = data_len, + num_objects = reader.read32u(), + _size_32 = reader.read32u(), + _size_64 = reader.read32u(); + break; + case 0x8495A6BD: + var + header_len = reader.read8u() & 0x3F, + compressed = 1, + overflow = [false], + data_len = readvlq(overflow), + uncompressed_data_len = readvlq(overflow), + num_objects = readvlq(overflow), + _size_32 = readvlq(overflow), + _size_64 = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on a 32-bit platform"); + break; + default: + caml_failwith("caml_input_value_from_reader: bad object"); break; + } + var + stack = [], + intern_obj_table = num_objects > 0 ? [] : null, + obj_counter = 0; + function intern_rec(reader){ + var code = reader.read8u(); + if(code >= 0x40) + if(code >= 0x80){ + var tag = code & 0xF, size = code >> 4 & 0x7, v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + } + else + return code & 0x3F; + else if(code >= 0x20){ + var len = code & 0x1F, v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + } + else + switch(code){ + case 0x00: + return reader.read8s(); + case 0x01: + return reader.read16s(); + case 0x02: + return reader.read32s(); + case 0x03: + caml_failwith("input_value: integer too large"); break; + case 0x04: + var offset = reader.read8u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x05: + var offset = reader.read16u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x06: + var offset = reader.read32u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x08: + var + header = reader.read32u(), + tag = header & 0xFF, + size = header >> 10, + v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + case 0x13: + caml_failwith("input_value: data block too large"); break; + case 0x09: + var len = reader.read8u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0A: + var len = reader.read32u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0C: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[7 - i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0B: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0E: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0D: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x07: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0F: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x10: + case 0x11: + caml_failwith("input_value: code pointer"); break; + case 0x12: + case 0x18: + case 0x19: + var c, s = ""; + while((c = reader.read8u()) != 0) s += String.fromCharCode(c); + var ops = caml_custom_ops[s], expected_size; + if(! ops) + caml_failwith("input_value: unknown custom block identifier"); + switch(code){ + case 0x12: break; + case 0x19: + if(! ops.fixed_length) + caml_failwith("input_value: expected a fixed-size custom block"); + expected_size = ops.fixed_length; + break; + case 0x18: + expected_size = reader.read32u(); + reader.read32s(); + reader.read32s(); + break; + } + var + old_pos = reader.i, + size = [0], + v = ops.deserialize(reader, size); + if(expected_size != undefined) + if(expected_size != size[0]) + caml_failwith + ("input_value: incorrect length of serialized custom block"); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + default: caml_failwith("input_value: ill-formed message"); + } + } + if(compressed) + var + data = reader.readuint8array(data_len), + res = new Uint8Array(uncompressed_data_len), + res = zstd_decompress(data, res), + reader = new UInt8ArrayReader(res, 0); + var res = intern_rec(reader); + while(stack.length > 0){ + var size = stack.pop(), v = stack.pop(), d = v.length; + if(d < size) stack.push(v, size); + v[d] = intern_rec(reader); + } + if(typeof ofs != "number") ofs[0] = reader.i; + return res; + } + function caml_string_of_bytes(s){ + s.t & 6 && caml_convert_string_to_bytes(s); + return caml_string_of_jsbytes(s.c); + } + function caml_input_value_from_bytes(s, ofs){ + var + reader = + new + MlStringReader + (caml_string_of_bytes(s), typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_input_value(chanid){ + var + chan = caml_ml_channels[chanid], + header = new Uint8Array(caml_marshal_header_size); + function block(buffer, offset, n){ + var r = 0; + while(r < n){ + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) break; + buffer[offset + r] = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + r++; + } + return r; + } + var r = block(header, 0, caml_marshal_header_size); + if(r == 0) + caml_raise_end_of_file(); + else if(r < caml_marshal_header_size) + caml_failwith("input_value: truncated object"); + var + len = caml_marshal_data_size(caml_bytes_of_array(header), 0), + buf = new Uint8Array(len + caml_marshal_header_size); + buf.set(header, 0); + var r = block(buf, caml_marshal_header_size, len); + if(r < len) + caml_failwith("input_value: truncated object " + r + " " + len); + var + offset = [0], + res = caml_input_value_from_bytes(caml_bytes_of_array(buf), offset); + chan.offset = chan.offset + offset[0]; + return res; + } + function caml_input_value_to_outside_heap(c){return caml_input_value(c);} + function caml_atomic_cas(ref, o, n){ + if(ref[1] === o){ref[1] = n; return 1;} + return 0; + } + function caml_copysign_float(x, y){ + if(y == 0) y = 1 / y; + x = Math.abs(x); + return y < 0 ? - x : x; + } + function caml_gr_set_text_size(size){ + var s = caml_gr_state_get(); + s.text_size = size; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_atomic_load(ref){return ref[1];} + function caml_MD5Final(ctx){ + var in_buf = ctx.len & 0x3f; + ctx.b8[in_buf] = 0x80; + in_buf++; + if(in_buf > 56){ + for(var j = in_buf; j < 64; j++) ctx.b8[j] = 0; + caml_MD5Transform(ctx.w, ctx.b32); + for(var j = 0; j < 56; j++) ctx.b8[j] = 0; + } + else + for(var j = in_buf; j < 56; j++) ctx.b8[j] = 0; + ctx.b32[14] = ctx.len << 3; + ctx.b32[15] = ctx.len >> 29 & 0x1FFFFFFF; + caml_MD5Transform(ctx.w, ctx.b32); + var t = new Uint8Array(16); + for(var i = 0; i < 4; i++) + for(var j = 0; j < 4; j++) t[i * 4 + j] = ctx.w[i] >> 8 * j & 0xFF; + return t; + } + function caml_md5_bytes(s, ofs, len){ + var ctx = caml_MD5Init(), a = caml_uint8_array_of_bytes(s); + caml_MD5Update(ctx, a.subarray(ofs, ofs + len), len); + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_ba_set_generic(ba, i, v){ + ba.set(ba.offset(caml_js_from_array(i)), v); + return 0; + } + function caml_ml_condition_wait(t, mutext){return 0;} + function caml_string_lessequal(s1, s2){return s1 <= s2 ? 1 : 0;} + function caml_string_greaterequal(s1, s2){return caml_string_lessequal(s2, s1); + } + function caml_nextafter_float(x, y){ + if(isNaN(x) || isNaN(y)) return NaN; + if(x == y) return y; + if(x == 0) return y < 0 ? - Math.pow(2, - 1074) : Math.pow(2, - 1074); + var bits = caml_int64_bits_of_float(x), one = caml_int64_of_int32(1); + if(x < y == x > 0) + bits = caml_int64_add(bits, one); + else + bits = caml_int64_sub(bits, one); + return caml_int64_float_of_bits(bits); + } + function caml_gr_size_y(){var s = caml_gr_state_get(); return s.height;} + function caml_pos_in(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset - (chan.buffer_max - chan.buffer_curr) | 0; + } + function caml_ml_pos_in(chanid){return caml_pos_in(chanid);} + function caml_int64_and(x, y){return x.and(y);} + function Base_int_math_int64_pow_stub(base, exponent){ + var + one = caml_int64_create_lo_hi(1, 0), + mul = [one, base, one, one], + res = one; + while(! caml_int64_is_zero(exponent)){ + mul[1] = caml_int64_mul(mul[1], mul[3]); + mul[2] = caml_int64_mul(mul[1], mul[1]); + mul[3] = caml_int64_mul(mul[2], mul[1]); + res = caml_int64_mul(res, mul[caml_int64_lo32(exponent) & 3]); + exponent = caml_int64_shift_right_unsigned(exponent, 2); + } + return res; + } + function caml_sys_const_word_size(){return 32;} + function caml_runtime_events_pause(){return 0;} + function caml_unix_unlink(name){ + var root = resolve_fs_device(name); + if(! root.device.unlink) + caml_failwith("caml_unix_unlink: not implemented"); + return root.device.unlink(root.rest, true); + } + function caml_sys_open_for_node(fd, flags){ + if(flags.name) + try{ + var fs = require("fs"), fd2 = fs.openSync(flags.name, "rs"); + return new MlNodeFd(fd2, flags); + } + catch(e){} + return new MlNodeFd(fd, flags); + } + function MlFakeFd_out(fd, flags){ + MlFakeFile.call(this, caml_create_bytes(0)); + this.log = function(s){return 0;}; + if(fd == 1 && typeof console.log == "function") + this.log = console.log; + else if(fd == 2 && typeof console.error == "function") + this.log = console.error; + else if(typeof console.log == "function") this.log = console.log; + this.flags = flags; + } + MlFakeFd_out.prototype.length = function(){return 0;}; + MlFakeFd_out.prototype.write = + function(offset, buf, pos, len){ + if(this.log){ + if + (len > 0 && pos >= 0 && pos + len <= buf.length + && buf[pos + len - 1] == 10) + len--; + var src = caml_create_bytes(len); + caml_blit_bytes(caml_bytes_of_array(buf), pos, src, 0, len); + this.log(src.toUtf16()); + return 0; + } + caml_raise_sys_error(this.fd + ": file descriptor already closed"); + }; + MlFakeFd_out.prototype.read = + function(offset, buf, pos, len){ + caml_raise_sys_error(this.fd + ": file descriptor is write only"); + }; + MlFakeFd_out.prototype.close = function(){this.log = undefined;}; + function caml_sys_open_internal(file, idx){ + if(idx == undefined) idx = caml_sys_fds.length; + caml_sys_fds[idx] = file; + return idx | 0; + } + function caml_sys_open(name, flags, _perms){ + var f = {}; + while(flags){ + switch(flags[1]){ + case 0: + f.rdonly = 1; break; + case 1: + f.wronly = 1; break; + case 2: + f.append = 1; break; + case 3: + f.create = 1; break; + case 4: + f.truncate = 1; break; + case 5: + f.excl = 1; break; + case 6: + f.binary = 1; break; + case 7: + f.text = 1; break; + case 8: + f.nonblock = 1; break; + } + flags = flags[2]; + } + if(f.rdonly && f.wronly) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_text and Open_binary are not compatible"); + var root = resolve_fs_device(name), file = root.device.open(root.rest, f); + return caml_sys_open_internal(file, undefined); + } + (function(){ + function file(fd, flags){ + return fs_node_supported() + ? caml_sys_open_for_node(fd, flags) + : new MlFakeFd_out(fd, flags); + } + caml_sys_open_internal + (file(0, {rdonly: 1, altname: "/dev/stdin", isCharacterDevice: true}), + 0); + caml_sys_open_internal + (file(1, {buffered: 2, wronly: 1, isCharacterDevice: true}), 1); + caml_sys_open_internal + (file(2, {buffered: 2, wronly: 1, isCharacterDevice: true}), 2); + } + ()); + function caml_string_get(s, i){ + if(i >>> 0 >= caml_ml_string_length(s)) caml_string_bound_error(); + return caml_string_unsafe_get(s, i); + } + var + re_match = + function(){ + var + re_word_letters = + [0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0x03, + 0xFE, + 0xFF, + 0xFF, + 0x87, + 0xFE, + 0xFF, + 0xFF, + 0x07, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0xFF, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0x7F, + 0xFF], + opcodes = + {CHAR: 0, + CHARNORM: 1, + STRING: 2, + STRINGNORM: 3, + CHARCLASS: 4, + BOL: 5, + EOL: 6, + WORDBOUNDARY: 7, + BEGGROUP: 8, + ENDGROUP: 9, + REFGROUP: 10, + ACCEPT: 11, + SIMPLEOPT: 12, + SIMPLESTAR: 13, + SIMPLEPLUS: 14, + GOTO: 15, + PUSHBACK: 16, + SETMARK: 17, + CHECKPROGRESS: 18}; + function is_word_letter(c){ + return re_word_letters[c >> 3] >> (c & 7) & 1; + } + function in_bitset(s, i){ + return caml_string_get(s, i >> 3) >> (i & 7) & 1; + } + function re_match_impl(re, s, pos, partial){ + var + prog = caml_js_from_array(re[1]), + cpool = caml_js_from_array(re[2]), + normtable = caml_jsbytes_of_string(re[3]), + numgroups = re[4] | 0, + numregisters = re[5] | 0, + startchars = re[6] | 0, + s = caml_uint8_array_of_string(s), + pc = 0, + quit = false, + stack = [], + groups = new Array(numgroups), + re_register = new Array(numregisters); + for(var i = 0; i < groups.length; i++) + groups[i] = {start: - 1, end: - 1}; + groups[0].start = pos; + function backtrack(){ + while(stack.length){ + var item = stack.pop(); + if(item.undo) + item.undo.obj[item.undo.prop] = item.undo.value; + else if(item.pos){pc = item.pos.pc; pos = item.pos.txt; return;} + } + quit = true; + } + function push(item){stack.push(item);} + function accept(){ + groups[0].end = pos; + var result = new Array(1 + groups.length * 2); + result[0] = 0; + for(var i = 0; i < groups.length; i++){ + var g = groups[i]; + if(g.start < 0 || g.end < 0) g.start = g.end = - 1; + result[2 * i + 1] = g.start; + result[2 * i + 1 + 1] = g.end; + } + return result; + } + function prefix_match(){ + if(partial) return accept(); else backtrack(); + } + while(! quit){ + var + op = prog[pc] & 0xff, + sarg = prog[pc] >> 8, + uarg = sarg & 0xff, + c = s[pos], + group; + pc++; + switch(op){ + case opcodes.CHAR: + if(pos === s.length){prefix_match(); break;} + if(c === uarg) pos++; else backtrack(); + break; + case opcodes.CHARNORM: + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === uarg) pos++; else backtrack(); + break; + case opcodes.STRING: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(c === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.STRINGNORM: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.CHARCLASS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) pos++; else backtrack(); + break; + case opcodes.BOL: + if(pos > 0 && s[pos - 1] != 10) backtrack(); break; + case opcodes.EOL: + if(pos < s.length && s[pos] != 10) backtrack(); break; + case opcodes.WORDBOUNDARY: + if(pos == 0){ + if(pos === s.length){prefix_match(); break;} + if(is_word_letter(s[0])) break; + backtrack(); + } + else if(pos === s.length){ + if(is_word_letter(s[pos - 1])) break; + backtrack(); + } + else{ + if(is_word_letter(s[pos - 1]) != is_word_letter(s[pos])) break; + backtrack(); + } + break; + case opcodes.BEGGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "start", value: group.start}}); + group.start = pos; + break; + case opcodes.ENDGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "end", value: group.end}}); + group.end = pos; + break; + case opcodes.REFGROUP: + group = groups[uarg]; + if(group.start < 0 || group.end < 0){backtrack(); break;} + for(var i = group.start; i < group.end; i++){ + if(pos === s.length){prefix_match(); break;} + if(s[i] != s[pos]){backtrack(); break;} + pos++; + } + break; + case opcodes.SIMPLEOPT: + if(in_bitset(cpool[uarg], c)) pos++; break; + case opcodes.SIMPLESTAR: + while(in_bitset(cpool[uarg], c)) c = s[++pos]; break; + case opcodes.SIMPLEPLUS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) + do c = s[++pos];while(in_bitset(cpool[uarg], c)); + else + backtrack(); + break; + case opcodes.ACCEPT: return accept(); + case opcodes.GOTO: + pc = pc + sarg; break; + case opcodes.PUSHBACK: + push({pos: {pc: pc + sarg, txt: pos}}); break; + case opcodes.SETMARK: + push + ({undo: {obj: re_register, prop: uarg, value: re_register[uarg]}}); + re_register[uarg] = pos; + break; + case opcodes.CHECKPROGRESS: + if(re_register[uarg] === pos) backtrack(); break; + default: throw new Error("Invalid bytecode"); + } + } + return 0; + } + return re_match_impl; + } + (); + function re_search_backward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_backward"); + while(pos >= 0){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos--; + } + return [0]; + } + function caml_js_from_string(s){return caml_jsstring_of_string(s);} + function caml_ba_sub(ba, ofs, len){ + var changed_dim, mul = 1; + if(ba.layout == 0){ + for(var i = 1; i < ba.dims.length; i++) mul = mul * ba.dims[i]; + changed_dim = 0; + } + else{ + for(var i = 0; i < ba.dims.length - 1; i++) mul = mul * ba.dims[i]; + changed_dim = ba.dims.length - 1; + ofs = ofs - 1; + } + if(ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim]) + caml_invalid_argument("Bigarray.sub: bad sub-array"); + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) new_dims[i] = ba.dims[i]; + new_dims[changed_dim] = len; + mul *= caml_ba_get_size_per_element(ba.kind); + var new_data = ba.data.subarray(ofs * mul, (ofs + len) * mul); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dims, new_data); + } + function caml_gc_full_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_ml_mutex_try_lock(t){ + if(! t.locked){t.locked = true; return 1;} + return 0; + } + function caml_bytes_set32(s, i, i32){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b4 = 0xFF & i32 >> 24, + b3 = 0xFF & i32 >> 16, + b2 = 0xFF & i32 >> 8, + b1 = 0xFF & i32; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + caml_bytes_unsafe_set(s, i + 2, b3); + caml_bytes_unsafe_set(s, i + 3, b4); + return 0; + } + function caml_gr_sigio_signal(){return 0;} + function caml_ba_uint8_set32(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + ba.set(ofs + 2, v >>> 16 & 0xff); + ba.set(ofs + 3, v >>> 24 & 0xff); + return 0; + } + function caml_sys_const_ostype_unix(){return os_type == "Unix" ? 1 : 0;} + function caml_unix_gmtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000); + return [0, + d.getUTCSeconds(), + d.getUTCMinutes(), + d.getUTCHours(), + d.getUTCDate(), + d.getUTCMonth(), + d.getUTCFullYear() - 1900, + d.getUTCDay(), + doy, + false | 0]; + } + function caml_signbit_float(x){if(x == 0) x = 1 / x; return x < 0 ? 1 : 0;} + function caml_gr_current_x(){var s = caml_gr_state_get(); return s.x;} + function caml_gr_set_line_width(w){ + var s = caml_gr_state_get(); + s.line_width = w; + s.context.lineWidth = w; + return 0; + } + function caml_gr_set_font(f){ + var s = caml_gr_state_get(); + s.font = f; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_gr_set_color(color){ + var s = caml_gr_state_get(); + function convert(number){ + var str = "" + number.toString(16); + while(str.length < 2) str = "0" + str; + return str; + } + var r = color >> 16 & 0xff, g = color >> 8 & 0xff, b = color >> 0 & 0xff; + s.color = color; + var c_str = "#" + convert(r) + convert(g) + convert(b); + s.context.fillStyle = c_str; + s.context.strokeStyle = c_str; + return 0; + } + function caml_gr_moveto(x, y){ + var s = caml_gr_state_get(); + s.x = x; + s.y = y; + return 0; + } + function caml_gr_resize_window(w, h){ + var s = caml_gr_state_get(); + s.width = w; + s.height = h; + s.canvas.width = w; + s.canvas.height = h; + return 0; + } + function caml_gr_state_init(){ + caml_gr_moveto(caml_gr_state.x, caml_gr_state.y); + caml_gr_resize_window(caml_gr_state.width, caml_gr_state.height); + caml_gr_set_line_width(caml_gr_state.line_width); + caml_gr_set_text_size(caml_gr_state.text_size); + caml_gr_set_font(caml_gr_state.font); + caml_gr_set_color(caml_gr_state.color); + caml_gr_set_window_title(caml_gr_state.title); + caml_gr_state.context.textBaseline = "bottom"; + } + function caml_ba_kind_of_typed_array(ta){ + var kind; + if(ta instanceof Float32Array) + kind = 0; + else if(ta instanceof Float64Array) + kind = 1; + else if(ta instanceof Int8Array) + kind = 2; + else if(ta instanceof Uint8Array) + kind = 3; + else if(ta instanceof Int16Array) + kind = 4; + else if(ta instanceof Uint16Array) + kind = 5; + else if(ta instanceof Int32Array) + kind = 6; + else if(ta instanceof Uint32Array) + kind = 6; + else + caml_invalid_argument("caml_ba_kind_of_typed_array: unsupported kind"); + return kind; + } + function caml_ba_from_typed_array(ta){ + var kind = caml_ba_kind_of_typed_array(ta); + return caml_ba_create_unsafe(kind, 0, [ta.length], ta); + } + function caml_ml_seek_out(chanid, pos){return caml_seek_out(chanid, pos);} + function caml_js_typeof(o){return typeof o;} + function caml_string_hash(h, v){ + var h = caml_hash_mix_string(h, v), h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function caml_restore_raw_backtrace(exn, bt){return 0;} + function Base_int_math_int32_ctz(x){ + if(x === 0) return 32; + var n = 1; + if((x & 0x0000FFFF) === 0){n = n + 16; x = x >> 16;} + if((x & 0x000000FF) === 0){n = n + 8; x = x >> 8;} + if((x & 0x0000000F) === 0){n = n + 4; x = x >> 4;} + if((x & 0x00000003) === 0){n = n + 2; x = x >> 2;} + return n - (x & 1); + } + function Base_int_math_nativeint_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_gr_lineto(x, y){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(s.x, s.height - s.y); + s.context.lineTo(x, s.height - y); + s.context.stroke(); + s.x = x; + s.y = y; + return 0; + } + function caml_js_function_arity(f){return f.l >= 0 ? f.l : f.l = f.length;} + function caml_js_wrap_meth_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f) - 1, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_dim_3(ba){return caml_ba_dim(ba, 2);} + function caml_is_special_exception(exn){ + switch(exn[2]){case - 8:case - 11:case - 12: return 1;default: return 0; + } + } + function caml_format_exception(exn){ + var r = ""; + if(exn[0] == 0){ + r += exn[1][1]; + if + (exn.length == 3 && exn[2][0] == 0 && caml_is_special_exception(exn[1])) + var bucket = exn[2], start = 1; + else + var start = 2, bucket = exn; + r += "("; + for(var i = start; i < bucket.length; i++){ + if(i > start) r += ", "; + var v = bucket[i]; + if(typeof v == "number") + r += v.toString(); + else if(v instanceof MlBytes) + r += '"' + v.toString() + '"'; + else if(typeof v == "string") + r += '"' + v.toString() + '"'; + else + r += "_"; + } + r += ")"; + } + else if(exn[0] == 248) r += exn[1]; + return r; + } + function caml_fatal_uncaught_exception(err){ + if(err instanceof Array && (err[0] == 0 || err[0] == 248)){ + var handler = caml_named_value("Printexc.handle_uncaught_exception"); + if(handler) + caml_callback(handler, [err, false]); + else{ + var + msg = caml_format_exception(err), + at_exit = caml_named_value("Pervasives.do_at_exit"); + if(at_exit) caml_callback(at_exit, [0]); + console.error("Fatal error: exception " + msg + "\n"); + if(err.js_error) throw err.js_error; + } + } + else + throw err; + } + function caml_ephe_check_data(x){ + return x[caml_ephe_data_offset] === undefined ? 0 : 1; + } + function caml_bytes_get16(s, i){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_obj_make_forward(b, v){b[0] = 250; b[1] = v; return 0;} + function caml_js_from_bool(x){return ! ! x;} + function caml_ml_set_channel_name(chanid, name){ + var chan = caml_ml_channels[chanid]; + chan.name = name; + return 0; + } + function caml_exp2_float(x){return Math.pow(2, x);} + function caml_gr_close_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = 0; + s.canvas.height = 0; + return 0; + } + var Base_internalhash_fold_int = caml_hash_mix_int; + function caml_ml_domain_cpu_relax(unit){return 0;} + function caml_create_string(len){caml_invalid_argument("String.create");} + function Base_int_math_nativeint_clz(x){return Base_int_math_int32_clz(x);} + function caml_ml_input_block(chanid, ba, i, l){ + var + chan = caml_ml_channels[chanid], + n = l, + avail = chan.buffer_max - chan.buffer_curr; + if(l <= avail){ + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + l), i); + chan.buffer_curr += l; + } + else if(avail > 0){ + ba.set + (chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + avail), i); + chan.buffer_curr += avail; + n = avail; + } + else{ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + var avail = chan.buffer_max - chan.buffer_curr; + if(n > avail) n = avail; + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + n), i); + chan.buffer_curr += n; + } + return n | 0; + } + function caml_md5_chan(chanid, toread){ + var ctx = caml_MD5Init(), buffer = new Uint8Array(4096); + if(toread < 0) + while(true){ + var read = caml_ml_input_block(chanid, buffer, 0, buffer.length); + if(read == 0) break; + caml_MD5Update(ctx, buffer.subarray(0, read), read); + } + else + while(toread > 0){ + var + read = + caml_ml_input_block + (chanid, buffer, 0, toread > buffer.length ? buffer.length : toread); + if(read == 0) caml_raise_end_of_file(); + caml_MD5Update(ctx, buffer.subarray(0, read), read); + toread -= read; + } + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_atanh_float(x){return Math.atanh(x);} + function caml_ml_condition_signal(t){return 0;} + function caml_unix_findnext(dir_handle){return caml_unix_readdir(dir_handle); + } + function caml_ml_output_bytes(chanid, buffer, offset, len){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) + caml_raise_sys_error("Cannot output to a closed channel"); + var buffer = caml_uint8_array_of_bytes(buffer); + buffer = buffer.subarray(offset, offset + len); + if(chan.buffer_curr + buffer.length > chan.buffer.length){ + var b = new Uint8Array(chan.buffer_curr + buffer.length); + b.set(chan.buffer); + chan.buffer = b; + } + switch(chan.buffered){ + case 0: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + caml_ml_flush(chanid); + break; + case 1: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + break; + case 2: + var id = buffer.lastIndexOf(10); + if(id < 0){ + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + } + else{ + chan.buffer.set(buffer.subarray(0, id + 1), chan.buffer_curr); + chan.buffer_curr += id + 1; + caml_ml_flush(chanid); + chan.buffer.set(buffer.subarray(id + 1), chan.buffer_curr); + chan.buffer_curr += buffer.length - id - 1; + } + break; + } + return 0; + } + function caml_ml_output(chanid, buffer, offset, len){ + return caml_ml_output_bytes + (chanid, caml_bytes_of_string(buffer), offset, len); + } + function caml_ml_domain_id(unit){return caml_domain_id;} + function caml_ephe_get_data(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, x[caml_ephe_data_offset]]; + } + function caml_xmlhttprequest_create(unit){ + if(typeof globalThis.XMLHttpRequest !== "undefined") + try{return new globalThis.XMLHttpRequest();}catch(e){} + if(typeof globalThis.activeXObject !== "undefined"){ + try{return new globalThis.activeXObject("Msxml2.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Msxml3.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Microsoft.XMLHTTP");}catch(e){} + } + caml_failwith("Cannot create a XMLHttpRequest"); + } + function caml_trampoline_return(f, args){return {joo_tramp: f, joo_args: args}; + } + function caml_ml_is_buffered(chanid){ + return caml_ml_channels[chanid].buffered ? 1 : 0; + } + function Base_int_math_int64_clz(x){ + var n = 64, y; + y = caml_int64_shift_right_unsigned(x, 32); + if(! caml_int64_is_zero(y)){n = n - 32; x = y;} + y = caml_int64_shift_right_unsigned(x, 16); + if(! caml_int64_is_zero(y)){n = n - 16; x = y;} + y = caml_int64_shift_right_unsigned(x, 8); + if(! caml_int64_is_zero(y)){n = n - 8; x = y;} + y = caml_int64_shift_right_unsigned(x, 4); + if(! caml_int64_is_zero(y)){n = n - 4; x = y;} + y = caml_int64_shift_right_unsigned(x, 2); + if(! caml_int64_is_zero(y)){n = n - 2; x = y;} + y = caml_int64_shift_right_unsigned(x, 1); + if(! caml_int64_is_zero(y)) return n - 2; + return n - caml_int64_to_int32(x); + } + function caml_array_append(a1, a2){ + var l1 = a1.length, l2 = a2.length, l = l1 + l2 - 1, a = new Array(l); + a[0] = 0; + var i = 1, j = 1; + for(; i < l1; i++) a[i] = a1[i]; + for(; i < l; i++, j++) a[i] = a2[j]; + return a; + } + function caml_unix_gettimeofday(){return new Date().getTime() / 1000;} + function caml_unix_time(){return Math.floor(caml_unix_gettimeofday());} + function caml_ml_set_channel_refill(chanid, f){ + caml_ml_channels[chanid].refill = f; + return 0; + } + function caml_runtime_events_create_cursor(target){return {};} + function caml_fill_bytes(s, i, l, c){ + if(l > 0) + if(i == 0 && (l >= s.l || s.t == 2 && l >= s.c.length)) + if(c == 0){ + s.c = ""; + s.t = 2; + } + else{ + s.c = caml_str_repeat(l, String.fromCharCode(c)); + s.t = l == s.l ? 0 : 2; + } + else{ + if(s.t != 4) caml_convert_bytes_to_array(s); + for(l += i; i < l; i++) s.c[i] = c; + } + return 0; + } + function caml_js_expr(s){ + console.error("caml_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_ml_runtime_warnings_enabled(_unit){return caml_runtime_warnings; + } + function caml_output_value_to_bytes(v, flags){ + return caml_bytes_of_array(caml_output_val(v, flags)); + } + function caml_eventlog_resume(unit){return 0;} + function caml_md5_string(s, ofs, len){ + return caml_md5_bytes(caml_bytes_of_string(s), ofs, len); + } + function caml_array_of_string(x){return caml_uint8_array_of_string(x);} + function caml_string_equal(s1, s2){if(s1 === s2) return 1; return 0;} + function caml_jsoo_flags_use_js_string(unit){return 1;} + function caml_output_value_to_buffer(s, ofs, len, v, flags){ + var t = caml_output_val(v, flags); + if(t.length > len) caml_failwith("Marshal.to_buffer: buffer overflow"); + caml_blit_bytes(t, 0, s, ofs, t.length); + return 0; + } + function re_replacement_text(repl, groups, orig){ + var + repl = caml_jsbytes_of_string(repl), + len = repl.length, + orig = caml_jsbytes_of_string(orig), + res = "", + n = 0, + cur, + start, + end, + c; + while(n < len){ + cur = repl.charAt(n++); + if(cur != "\\") + res += cur; + else{ + if(n == len) caml_failwith("Str.replace: illegal backslash sequence"); + cur = repl.charAt(n++); + switch(cur){ + case "\\": + res += cur; break; + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + c = + cur; + if(c * 2 >= groups.length - 1) + caml_failwith("Str.replace: reference to unmatched group"); + start = caml_array_get(groups, c * 2); + end = caml_array_get(groups, c * 2 + 1); + if(start == - 1) + caml_failwith("Str.replace: reference to unmatched group"); + res += orig.slice(start, end); + break; + default: res += "\\" + cur; + } + } + } + return caml_string_of_jsbytes(res); + } + function caml_pure_js_expr(s){ + console.error("caml_pure_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_blit_string(a, b, c, d, e){ + caml_blit_bytes(caml_bytes_of_string(a), b, c, d, e); + return 0; + } + function blit_nat(nat1, ofs1, nat2, ofs2, len){ + for(var i = 0; i < len; i++) nat1.data[ofs1 + i] = nat2.data[ofs2 + i]; + return 0; + } + function caml_bigstring_blit_ba_to_bytes(ba1, pos1, bytes2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(pos2 + len > caml_ml_bytes_length(bytes2)) caml_array_bound_error(); + var slice = ba1.data.slice(ofs1, ofs1 + len); + caml_blit_bytes(caml_bytes_of_array(slice), 0, bytes2, pos2, len); + return 0; + } + function caml_unix_stat(name){ + var root = resolve_fs_device(name); + if(! root.device.stat) caml_failwith("caml_unix_stat: not implemented"); + return root.device.stat(root.rest, true); + } + function caml_register_named_value(nm, v){ + caml_named_values[caml_jsbytes_of_string(nm)] = v; + return 0; + } + function jsoo_create_file_extern(name, content){ + if(globalThis.jsoo_create_file) + globalThis.jsoo_create_file(name, content); + else{ + if(! globalThis.caml_fs_tmp) globalThis.caml_fs_tmp = []; + globalThis.caml_fs_tmp.push({name: name, content: content}); + } + return 0; + } + function caml_unix_stat_64(name){ + var r = caml_unix_stat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_to_js_string(s){return caml_jsstring_of_string(s);} + function caml_ml_mutex_lock(t){ + if(t.locked) + caml_failwith("Mutex.lock: mutex already locked. Cannot wait."); + else + t.locked = true; + return 0; + } + function re_search_forward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_forward"); + while(pos <= caml_ml_string_length(s)){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos++; + } + return [0]; + } + function caml_make_vect(len, init){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 0; + for(var i = 1; i < len; i++) b[i] = init; + return b; + } + function caml_ml_seek_in(chanid, pos){return caml_seek_in(chanid, pos);} + function caml_sys_read_directory(name){ + var + root = resolve_fs_device(name), + a = root.device.readdir(root.rest), + l = new Array(a.length + 1); + l[0] = 0; + for(var i = 0; i < a.length; i++) l[i + 1] = caml_string_of_jsbytes(a[i]); + return l; + } + function caml_ml_output_char(chanid, c){ + var s = caml_string_of_jsbytes(String.fromCharCode(c)); + caml_ml_output(chanid, s, 0, 1); + return 0; + } + function caml_sys_const_ostype_win32(){return os_type == "Win32" ? 1 : 0;} + function caml_obj_is_block(x){return + (x instanceof Array);} + function caml_obj_set_raw_field(o, i, v){return o[i + 1] = v;} + function caml_js_var(x){ + var x = caml_jsstring_of_string(x); + if(! x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/)) + console.error + ('caml_js_var: "' + x + + '" is not a valid JavaScript variable. continuing ..'); + return eval(x); + } + function caml_trunc_float(x){return Math.trunc(x);} + function caml_ephe_unset_data(x){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(x[1] instanceof globalThis.FinalizationRegistry) + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].unregister(key); + } + } + x[caml_ephe_data_offset] = undefined; + return 0; + } + function caml_ephe_set_data(x, data){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(! (x[1] instanceof globalThis.FinalizationRegistry)){ + x[1] = + new + globalThis.FinalizationRegistry + (function(){caml_ephe_unset_data(x);}); + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].register(key, undefined, key); + } + } + } + x[caml_ephe_data_offset] = data; + return 0; + } + function caml_ephe_blit_data(src, dst){ + var n = src[caml_ephe_data_offset]; + if(n === undefined) + caml_ephe_unset_data(dst); + else + caml_ephe_set_data(dst, n); + return 0; + } + var Base_internalhash_fold_int64 = caml_hash_mix_int64; + function caml_is_printable(c){return + (c > 31 && c < 127);} + function caml_bytes_lessequal(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c <= s2.c ? 1 : 0; + } + function caml_array_of_bytes(x){return caml_uint8_array_of_bytes(x);} + function caml_equal(x, y){return + (caml_compare_val(x, y, false) == 0);} + function re_partial_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.partial_match"); + var res = re_match(re, s, pos, 1); + return res ? res : [0]; + } + function caml_sys_random_seed(){ + if(globalThis.crypto) + if(typeof globalThis.crypto.getRandomValues === "function"){ + var a = new Uint32Array(1); + globalThis.crypto.getRandomValues(a); + return [0, a[0]]; + } + else if(globalThis.crypto.randomBytes === "function"){ + var buff = globalThis.crypto.randomBytes(4), a = new Uint32Array(buff); + return [0, a[0]]; + } + var now = new Date().getTime(), x = now ^ 0xffffffff * Math.random(); + return [0, x]; + } + var all_finalizers = new globalThis.Set(); + function caml_final_register_called_without_value(cb, a){ + if(globalThis.FinalizationRegistry && a instanceof Object){ + var + x = + new + globalThis.FinalizationRegistry + (function(x){all_finalizers.delete(x); cb(0); return;}); + x.register(a, x); + all_finalizers.add(x); + } + return 0; + } + function caml_ba_get_2(ba, i0, i1){return ba.get(ba.offset([i0, i1]));} + function caml_ba_uint8_set16(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + return 0; + } + function caml_lazy_reset_to_lazy(o){ + caml_obj_update_tag(o, 244, 246); + return 0; + } + function caml_js_delete(o, f){delete o[f]; return 0;} + function caml_int_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + len = caml_ml_string_length(s), + threshold = - 1 >>> 0, + c = i < len ? caml_string_unsafe_get(s, i) : 0, + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = d; + for(i++; i < len; i++){ + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + res = base * res + d; + if(res > threshold) caml_failwith("int_of_string"); + } + if(i != len) caml_failwith("int_of_string"); + res = sign * res; + if(base == 10 && (res | 0) != res) caml_failwith("int_of_string"); + return res | 0; + } + function caml_list_mount_point(){ + var prev = 0; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var old = prev; + prev = [0, caml_string_of_jsbytes(jsoo_mount_point[i].path), old]; + } + return prev; + } + var + caml_marshal_constants = + {PREFIX_SMALL_BLOCK: 0x80, + PREFIX_SMALL_INT: 0x40, + PREFIX_SMALL_STRING: 0x20, + CODE_INT8: 0x00, + CODE_INT16: 0x01, + CODE_INT32: 0x02, + CODE_INT64: 0x03, + CODE_SHARED8: 0x04, + CODE_SHARED16: 0x05, + CODE_SHARED32: 0x06, + CODE_BLOCK32: 0x08, + CODE_BLOCK64: 0x13, + CODE_STRING8: 0x09, + CODE_STRING32: 0x0A, + CODE_DOUBLE_BIG: 0x0B, + CODE_DOUBLE_LITTLE: 0x0C, + CODE_DOUBLE_ARRAY8_BIG: 0x0D, + CODE_DOUBLE_ARRAY8_LITTLE: 0x0E, + CODE_DOUBLE_ARRAY32_BIG: 0x0F, + CODE_DOUBLE_ARRAY32_LITTLE: 0x07, + CODE_CODEPOINTER: 0x10, + CODE_INFIXPOINTER: 0x11, + CODE_CUSTOM: 0x12, + CODE_CUSTOM_LEN: 0x18, + CODE_CUSTOM_FIXED: 0x19}; + function caml_obj_raw_field(o, i){return o[i + 1];} + function caml_js_equals(x, y){return + (x == y);} + function caml_obj_compare_and_swap(x, i, old, n){ + if(x[i + 1] == old){x[i + 1] = n; return 1;} + return 0; + } + function bigstring_to_typed_array(bs){return bs.data;} + function caml_gr_arc_aux(ctx, cx, cy, ry, rx, a1, a2){ + while(a1 > a2) a2 += 360; + a1 /= 180; + a2 /= 180; + var + rot = 0, + xPos, + yPos, + xPos_prev, + yPos_prev, + space = 2, + num = (a2 - a1) * Math.PI * ((rx + ry) / 2) / space | 0, + delta = (a2 - a1) * Math.PI / num, + i = a1 * Math.PI; + for(var j = 0; j <= num; j++){ + xPos = + cx - rx * Math.sin(i) * Math.sin(rot * Math.PI) + + ry * Math.cos(i) * Math.cos(rot * Math.PI); + xPos = xPos.toFixed(2); + yPos = + cy + ry * Math.cos(i) * Math.sin(rot * Math.PI) + + rx * Math.sin(i) * Math.cos(rot * Math.PI); + yPos = yPos.toFixed(2); + if(j == 0) + ctx.moveTo(xPos, yPos); + else if(xPos_prev != xPos || yPos_prev != yPos) ctx.lineTo(xPos, yPos); + xPos_prev = xPos; + yPos_prev = yPos; + i -= delta; + } + return 0; + } + function caml_gr_fill_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.fill(); + return 0; + } + function caml_ba_slice(ba, vind){ + vind = caml_js_from_array(vind); + var num_inds = vind.length, index = [], sub_dims = [], ofs; + if(num_inds > ba.dims.length) + caml_invalid_argument("Bigarray.slice: too many indices"); + if(ba.layout == 0){ + for(var i = 0; i < num_inds; i++) index[i] = vind[i]; + for(; i < ba.dims.length; i++) index[i] = 0; + sub_dims = ba.dims.slice(num_inds); + } + else{ + for(var i = 0; i < num_inds; i++) + index[ba.dims.length - num_inds + i] = vind[i]; + for(var i = 0; i < ba.dims.length - num_inds; i++) index[i] = 1; + sub_dims = ba.dims.slice(0, ba.dims.length - num_inds); + } + ofs = ba.offset(index); + var + size = caml_ba_get_size(sub_dims), + size_per_element = caml_ba_get_size_per_element(ba.kind), + new_data = + ba.data.subarray + (ofs * size_per_element, (ofs + size) * size_per_element); + return caml_ba_create_unsafe(ba.kind, ba.layout, sub_dims, new_data); + } + function caml_js_wrap_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f), args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_kind(ba){return ba.kind;} + function caml_alloc_dummy_infix(){ + return function f(x){return caml_call_gen(f.fun, [x]);}; + } + function caml_js_fun_call(f, a){ + switch(a.length){ + case 1: + return f(); + case 2: + return f(a[1]); + case 3: + return f(a[1], a[2]); + case 4: + return f(a[1], a[2], a[3]); + case 5: + return f(a[1], a[2], a[3], a[4]); + case 6: + return f(a[1], a[2], a[3], a[4], a[5]); + case 7: + return f(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return f(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + return f.apply(null, caml_js_from_array(a)); + } + function caml_gc_major_slice(work){return 0;} + function caml_js_pure_expr(f){return caml_callback(f, [0]);} + function compare_digits_nat(nat1, ofs1, nat2, ofs2){ + if(nat1.data[ofs1] > nat2.data[ofs2]) return 1; + if(nat1.data[ofs1] < nat2.data[ofs2]) return - 1; + return 0; + } + function caml_ml_input(chanid, b, i, l){ + var ba = caml_uint8_array_of_bytes(b); + return caml_ml_input_block(chanid, ba, i, l); + } + function caml_gr_wait_event(_evl){ + caml_failwith + ("caml_gr_wait_event not Implemented: use Graphics_js instead"); + } + function caml_gr_sigio_handler(){return 0;} + function caml_hash_mix_bigstring(h, bs){ + return caml_hash_mix_bytes_arr(h, bs.data); + } + function caml_record_backtrace(b){ + caml_record_backtrace_flag = b; + return 0; + } + function caml_unix_cleanup(){} + function caml_sys_get_config(){ + return [0, caml_string_of_jsbytes(os_type), 32, 0]; + } + function caml_sys_const_backend_type(){ + return [0, caml_string_of_jsbytes("js_of_ocaml")]; + } + function caml_obj_is_shared(x){return 1;} + function caml_ml_out_channels_list(){ + var l = 0; + for(var c = 0; c < caml_ml_channels.length; c++) + if + (caml_ml_channels[c] && caml_ml_channels[c].opened + && caml_ml_channels[c].out) + l = [0, caml_ml_channels[c].fd, l]; + return l; + } + function caml_asinh_float(x){return Math.asinh(x);} + function caml_pos_out(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset + chan.buffer_curr; + } + function bigstring_of_array_buffer(ab){ + var ta = new Uint8Array(ab); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_mod(x, y){if(y == 0) caml_raise_zero_divide(); return x % y;} + function caml_ba_init(){return 0;} + function caml_unix_filedescr_of_fd(x){return x;} + function re_string_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.string_match"); + var res = re_match(re, s, pos, 0); + return res ? res : [0]; + } + function BigStringReader(bs, i){this.s = bs; this.i = i;} + BigStringReader.prototype = + {read8u: function(){return caml_ba_get_1(this.s, this.i++);}, + read8s: function(){return caml_ba_get_1(this.s, this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 8 | caml_ba_get_1(s, i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 24 >> 16 | caml_ba_get_1(s, i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3); + }, + readstr: + function(len){ + var i = this.i, arr = new Array(len); + for(var j = 0; j < len; j++) arr[j] = caml_ba_get_1(this.s, i + j); + this.i = i + len; + return caml_string_of_array(arr); + }, + readuint8array: + function(len){ + var i = this.i, offset = this.offset(i); + this.i = i + len; + return this.s.data.subarray(offset, offset + len); + }}; + function caml_gr_dump_image(im){ + var data = [0]; + for(var i = 0; i < im.height; i++){ + data[i + 1] = [0]; + for(var j = 0; j < im.width; j++){ + var + o = i * (im.width * 4) + j * 4, + r = im.data[o + 0], + g = im.data[o + 1], + b = im.data[o + 2]; + data[i + 1][j + 1] = (r << 16) + (g << 8) + b; + } + } + return data; + } + function caml_ba_get_generic(ba, i){ + var ofs = ba.offset(caml_js_from_array(i)); + return ba.get(ofs); + } + function caml_unix_startup(){} + function caml_get_exception_backtrace(){return 0;} + function caml_format_float(fmt, x){ + function toFixed(x, dp){ + if(Math.abs(x) < 1.0) + return x.toFixed(dp); + else{ + var e = parseInt(x.toString().split("+")[1]); + if(e > 20){ + e -= 20; + x /= Math.pow(10, e); + x += new Array(e + 1).join("0"); + if(dp > 0) x = x + "." + new Array(dp + 1).join("0"); + return x; + } + else + return x.toFixed(dp); + } + } + var s, f = caml_parse_format(fmt), prec = f.prec < 0 ? 6 : f.prec; + if(x < 0 || x == 0 && 1 / x == - Infinity){f.sign = - 1; x = - x;} + if(isNaN(x)){ + s = "nan"; + f.filler = " "; + } + else if(! isFinite(x)){ + s = "inf"; + f.filler = " "; + } + else + switch(f.conv){ + case "e": + var s = x.toExponential(prec), i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + case "f": + s = toFixed(x, prec); break; + case "g": + prec = prec ? prec : 1; + s = x.toExponential(prec - 1); + var j = s.indexOf("e"), exp = + s.slice(j + 1); + if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec){ + var i = j - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1) + s.slice(j); + i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + } + else{ + var p = prec; + if(exp < 0){ + p -= exp + 1; + s = x.toFixed(p); + } + else + while(s = x.toFixed(p), s.length > prec + 1) p--; + if(p){ + var i = s.length - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1); + } + } + break; + } + return caml_finish_formatting(f, s); + } + function caml_mount_autoload(name, f){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")); + jsoo_mount_point.push({path: name, device: new MlFakeDevice(name, f)}); + return 0; + } + function Base_int_math_int_clz(x){return Base_int_math_int32_clz(x);} + function caml_string_lessthan(s1, s2){return s1 < s2 ? 1 : 0;} + function caml_string_greaterthan(s1, s2){return caml_string_lessthan(s2, s1); + } + function caml_div(x, y){ + if(y == 0) caml_raise_zero_divide(); + return x / y | 0; + } + function caml_obj_dup(x){ + var l = x.length, a = new Array(l); + for(var i = 0; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ephe_get_data_copy(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, caml_obj_dup(x[caml_ephe_data_offset])]; + } + function caml_memprof_start(rate, stack_size, tracker){return 0;} + function caml_sys_get_argv(a){return [0, caml_argv[1], caml_argv];} + function caml_ml_domain_set_name(_name){return 0;} + function caml_js_to_bool(x){return + x;} + function caml_gr_create_image(x, y){ + var s = caml_gr_state_get(); + return s.context.createImageData(x, y); + } + function caml_ephe_get_key_copy(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_copy"); + var y = caml_ephe_get_key(x, i); + if(y === 0) return y; + var z = y[1]; + if(z instanceof Array) return [0, caml_obj_dup(z)]; + return y; + } + function caml_lessthan(x, y){return + (caml_compare_val(x, y, false) < 0);} + function caml_raw_backtrace_next_slot(){return 0;} + function caml_build_symbols(toc){ + var symb; + while(toc) + if(caml_jsstring_of_string(toc[1][1]) == "SYJS"){symb = toc[1][2]; break;} + else + toc = toc[2]; + var r = {}; + if(symb) + for(var i = 1; i < symb.length; i++) + r[caml_jsstring_of_string(symb[i][1])] = symb[i][2]; + return r; + } + function caml_register_global(n, v, name_opt){ + if(name_opt){ + var name = name_opt; + if(globalThis.toplevelReloc) + n = caml_callback(globalThis.toplevelReloc, [name]); + else if(caml_global_data.toc){ + if(! caml_global_data.symbols) + caml_global_data.symbols = caml_build_symbols(caml_global_data.toc); + var nid = caml_global_data.symbols[name]; + if(nid >= 0) + n = nid; + else + caml_failwith("caml_register_global: cannot locate " + name); + } + } + caml_global_data[n + 1] = v; + if(name_opt) caml_global_data[name_opt] = v; + } + function mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3){ + var carry = 0; + for(var i = 0; i < len3; i++) + carry += + mult_digit_nat + (nat1, ofs1 + i, len1 - i, nat2, ofs2, len2, nat3, ofs3 + i); + return carry; + } + function square_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var carry = 0; + carry += add_nat(nat1, ofs1, len1, nat1, ofs1, len1, 0); + carry += mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat2, ofs2, len2); + return carry; + } + function caml_js_from_float(x){return x;} + function caml_floatarray_create(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_gc_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_get_major_credit(n){return 0;} + function caml_sys_modify_argv(arg){caml_argv = arg; return 0;} + var caml_method_cache = []; + function caml_get_public_method(obj, tag, cacheid){ + var meths = obj[1], ofs = caml_method_cache[cacheid]; + if(ofs === undefined) + for(var i = caml_method_cache.length; i < cacheid; i++) + caml_method_cache[i] = 0; + else if(meths[ofs] === tag) return meths[ofs - 1]; + var li = 3, hi = meths[1] * 2 + 1, mi; + while(li < hi){ + mi = li + hi >> 1 | 1; + if(tag < meths[mi + 1]) hi = mi - 2; else li = mi; + } + caml_method_cache[cacheid] = li + 1; + return tag == meths[li + 1] ? meths[li] : 0; + } + function caml_js_get_console(){ + var + c = console, + m = + ["log", + "debug", + "info", + "warn", + "error", + "assert", + "dir", + "dirxml", + "trace", + "group", + "groupCollapsed", + "groupEnd", + "time", + "timeEnd"]; + function f(){} + for(var i = 0; i < m.length; i++) if(! c[m[i]]) c[m[i]] = f; + return c; + } + function caml_sys_unsafe_getenv(name){return caml_sys_getenv(name);} + function caml_ml_open_descriptor_in(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.wronly) caml_raise_sys_error("fd " + fd + " is writeonly"); + var + refill = null, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: false, + buffer_curr: 0, + buffer_max: 0, + buffer: new Uint8Array(65536), + refill: refill}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function bigstring_of_typed_array(ba){ + var + ta = + new + Uint8Array + (ba.buffer, ba.byteOffset, ba.length * ba.BYTES_PER_ELEMENT); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_round_float(x){return Math.round(x);} + function caml_ojs_new_arr(c, a){ + switch(a.length){ + case 0: + return new c(); + case 1: + return new c(a[0]); + case 2: + return new c(a[0], a[1]); + case 3: + return new c(a[0], a[1], a[2]); + case 4: + return new c(a[0], a[1], a[2], a[3]); + case 5: + return new c(a[0], a[1], a[2], a[3], a[4]); + case 6: + return new c(a[0], a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); + } + function F(){return c.apply(this, a);} + F.prototype = c.prototype; + return new F(); + } + function complement_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) + nat.data[ofs + i] = (- 1 >>> 0) - (nat.data[ofs + i] >>> 0); + } + var caml_domain_dls = [0]; + function caml_domain_dls_set(a){caml_domain_dls = a;} + function caml_lazy_read_result(o){ + return caml_obj_tag(o) == 250 ? o[1] : o; + } + var caml_js_regexps = {amp: /&/g, lt: / 1023){ + exp -= 1023; + x *= Math.pow(2, 1023); + if(exp > 1023){exp -= 1023; x *= Math.pow(2, 1023);} + } + if(exp < - 1023){exp += 1023; x *= Math.pow(2, - 1023);} + x *= Math.pow(2, exp); + return x; + } + function caml_gr_state_set(ctx){ + caml_gr_state = ctx; + caml_gr_state_init(); + return 0; + } + function caml_js_wrap_callback_strict(arity, f){ + return function(){ + var + n = arguments.length, + args = new Array(arity), + len = Math.min(arguments.length, arity); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_gc_minor_words(unit){return 0;} + function caml_get_current_callstack(){return [0];} + function land_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] &= nat2.data[ofs2]; return 0; + } + function caml_int64_mod(x, y){return x.mod(y);} + function caml_obj_set_tag(x, tag){x[0] = tag; return 0;} + function caml_int32_bswap(x){ + return (x & 0x000000FF) << 24 | (x & 0x0000FF00) << 8 + | (x & 0x00FF0000) >>> 8 + | (x & 0xFF000000) >>> 24; + } + function caml_ba_set_3(ba, i0, i1, i2, v){ + ba.set(ba.offset([i0, i1, i2]), v); + return 0; + } + function caml_js_instanceof(o, c){return o instanceof c ? 1 : 0;} + function caml_get_major_bucket(n){return 0;} + function nth_digit_nat_native(nat, ofs){return nat.data[ofs];} + function set_digit_nat_native(nat, ofs, digit){nat.data[ofs] = digit; return 0; + } + function caml_string_set64(s, i, i64){caml_failwith("caml_string_set64");} + function caml_gr_state_create(canvas, w, h){ + var context = canvas.getContext("2d"); + return {context: context, + canvas: canvas, + x: 0, + y: 0, + width: w, + height: h, + line_width: 1, + font: caml_string_of_jsbytes("fixed"), + text_size: 26, + color: 0x000000, + title: caml_string_of_jsbytes("")}; + } + function caml_gr_draw_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.stroke(); + return 0; + } + function caml_ba_map_file(vfd, kind, layout, shared, dims, pos){caml_failwith("caml_ba_map_file not implemented"); + } + function caml_ba_map_file_bytecode(argv, argn){ + return caml_ba_map_file + (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); + } + function caml_ba_create_from(data1, data2, jstyp, kind, layout, dims){ + if(data2 || caml_ba_get_size_per_element(kind) == 2) + caml_invalid_argument + ("caml_ba_create_from: use return caml_ba_create_unsafe"); + return caml_ba_create_unsafe(kind, layout, dims, data1); + } + function caml_tanh_float(x){return Math.tanh(x);} + function Base_int_math_int_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_runtime_events_start(){return 0;} + function caml_gr_draw_str(str){ + var s = caml_gr_state_get(), m = s.context.measureText(str), dx = m.width; + s.context.fillText(str, s.x, s.height - s.y); + s.x += dx | 0; + return 0; + } + function caml_gr_draw_string(str){ + caml_gr_draw_str(caml_jsstring_of_string(str)); + return 0; + } + function caml_gr_draw_char(c){ + caml_gr_draw_str(String.fromCharCode(c)); + return 0; + } + function caml_unmount(name){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")), + idx = - 1; + for(var i = 0; i < jsoo_mount_point.length; i++) + if(jsoo_mount_point[i].path == name) idx = i; + if(idx > - 1) jsoo_mount_point.splice(idx, 1); + return 0; + } + function caml_bigstring_blit_ba_to_ba(ba1, pos1, ba2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1), ofs2 = ba2.offset(pos2); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = ba1.data.subarray(ofs1, ofs1 + len); + ba2.data.set(slice, pos2); + return 0; + } + function caml_input_value_from_string(s, ofs){ + var reader = new MlStringReader(s, typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_ml_pos_in_64(chanid){ + return caml_int64_of_float(caml_pos_in(chanid)); + } + function caml_gr_draw_image(im, x, y){ + var s = caml_gr_state_get(); + if(! im.image){ + var canvas = document.createElement("canvas"); + canvas.width = s.width; + canvas.height = s.height; + canvas.getContext("2d").putImageData(im, 0, 0); + var image = new globalThis.Image(); + image.onload = + function(){ + s.context.drawImage(image, x, s.height - im.height - y); + im.image = image; + }; + image.src = canvas.toDataURL("image/png"); + } + else + s.context.drawImage(im.image, x, s.height - im.height - y); + return 0; + } + function caml_register_channel_for_spacetime(_channel){return 0;} + function caml_string_set(s, i, c){caml_failwith("caml_string_set");} + function caml_sys_rmdir(name){ + var root = resolve_fs_device(name); + root.device.rmdir(root.rest); + return 0; + } + function caml_unix_symlink(to_dir, src, dst){ + var src_root = resolve_fs_device(src), dst_root = resolve_fs_device(dst); + if(src_root.device != dst_root.device) + caml_failwith + ("caml_unix_symlink: cannot symlink between two filesystems"); + if(! src_root.device.symlink) + caml_failwith("caml_unix_symlink: not implemented"); + return src_root.device.symlink(to_dir, src_root.rest, dst_root.rest, true); + } + function Base_int_math_int64_ctz(x){ + if(caml_int64_is_zero(x)) return 64; + var n = 1; + function is_zero(x){return caml_int64_is_zero(x);} + function land(x, y){return caml_int64_and(x, y);} + function small_int64(x){return caml_int64_create_lo_mi_hi(x, 0, 0);} + if + (is_zero(land(x, caml_int64_create_lo_mi_hi(0xFFFFFF, 0x0000FF, 0x0000)))){n = n + 32; x = caml_int64_shift_right_unsigned(x, 32);} + if(is_zero(land(x, small_int64(0x00FFFF)))){ + n = n + 16; + x = caml_int64_shift_right_unsigned(x, 16); + } + if(is_zero(land(x, small_int64(0x0000FF)))){ + n = n + 8; + x = caml_int64_shift_right_unsigned(x, 8); + } + if(is_zero(land(x, small_int64(0x00000F)))){ + n = n + 4; + x = caml_int64_shift_right_unsigned(x, 4); + } + if(is_zero(land(x, small_int64(0x000003)))){ + n = n + 2; + x = caml_int64_shift_right_unsigned(x, 2); + } + return n - caml_int64_to_int32(caml_int64_and(x, small_int64(0x000001))); + } + function caml_ml_pos_out(chanid){return caml_pos_out(chanid);} + function Base_caml_exn_is_most_recent_exn(x){return 1;} + function caml_spacetime_enabled(_unit){return 0;} + function caml_bytes_notequal(s1, s2){return 1 - caml_bytes_equal(s1, s2);} + function caml_runtime_parameters(_unit){return caml_string_of_jsbytes("");} + function caml_js_object(a){ + var o = {}; + for(var i = 1; i < a.length; i++){ + var p = a[i]; + o[caml_jsstring_of_string(p[1])] = p[2]; + } + return o; + } + function caml_ba_create(kind, layout, dims_ml){ + var + dims = caml_js_from_array(dims_ml), + data = caml_ba_create_buffer(kind, caml_ba_get_size(dims)); + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_gr_remember_mode(){ + caml_failwith("caml_gr_remember_mode not Implemented"); + } + function Base_internalhash_get_hash_value(seed){ + var h = caml_hash_mix_final(seed); + return h & 0x3FFFFFFF; + } + function caml_fma_float(x, y, z){ + var + SPLIT = Math.pow(2, 27) + 1, + MIN_VALUE = Math.pow(2, - 1022), + EPSILON = Math.pow(2, - 52), + C = 416, + A = Math.pow(2, + C), + B = Math.pow(2, - C); + function multiply(a, b){ + var + at = SPLIT * a, + ahi = at - (at - a), + alo = a - ahi, + bt = SPLIT * b, + bhi = bt - (bt - b), + blo = b - bhi, + p = a * b, + e = ahi * bhi - p + ahi * blo + alo * bhi + alo * blo; + return {p: p, e: e}; + } + function add(a, b){ + var s = a + b, v = s - a, e = a - (s - v) + (b - v); + return {s: s, e: e}; + } + function adjust(x, y){ + return x !== 0 && y !== 0 && SPLIT * x - (SPLIT * x - x) === x + ? x * (1 + (x < 0 ? - 1 : + 1) * (y < 0 ? - 1 : + 1) * EPSILON) + : x; + } + if + (x === 0 || x !== x || x === + (1 / 0) || x === - (1 / 0) || y === 0 + || y !== y + || y === + (1 / 0) + || y === - (1 / 0)) + return x * y + z; + if(z === 0) return x * y; + if(z !== z || z === + (1 / 0) || z === - (1 / 0)) return z; + var scale = 1; + while(Math.abs(x) > A){scale *= A; x *= B;} + while(Math.abs(y) > A){scale *= A; y *= B;} + if(scale === 1 / 0) return x * y * scale; + while(Math.abs(x) < B){scale *= B; x *= A;} + while(Math.abs(y) < B){scale *= B; y *= A;} + if(scale === 0) return z; + var xs = x, ys = y, zs = z / scale; + if(Math.abs(zs) > Math.abs(xs * ys) * 4 / EPSILON) return z; + if(Math.abs(zs) < Math.abs(xs * ys) * EPSILON / 4 * EPSILON / 4) + zs = (z < 0 ? - 1 : + 1) * MIN_VALUE; + var + xy = multiply(xs, ys), + s = add(xy.p, zs), + u = add(xy.e, s.e), + i = add(s.s, u.s), + f = i.s + adjust(i.e, u.e); + if(f === 0) return f; + var fs = f * scale; + if(Math.abs(fs) > MIN_VALUE) return fs; + return fs + adjust(f - fs / scale, i.e) * scale; + } + function caml_recommended_domain_count(unit){return 1;} + function caml_bswap16(x){return (x & 0x00FF) << 8 | (x & 0xFF00) >> 8;} + function caml_ml_set_binary_mode(chanid, mode){ + var chan = caml_ml_channels[chanid]; + chan.file.flags.text = ! mode; + chan.file.flags.binary = mode; + return 0; + } + function caml_final_register(){return 0;} + function caml_gr_draw_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.strokeRect(x, s.height - y, w, - h); + return 0; + } + function caml_string_get16(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 1) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_output_value(chanid, v, flags){ + var s = caml_output_value_to_string(v, flags); + caml_ml_output(chanid, s, 0, caml_ml_string_length(s)); + return 0; + } + function caml_ba_get_3(ba, i0, i1, i2){ + return ba.get(ba.offset([i0, i1, i2])); + } + function caml_ephe_blit_key(a1, i1, a2, i2, len){ + caml_array_blit + (a1, + caml_ephe_key_offset + i1 - 1, + a2, + caml_ephe_key_offset + i2 - 1, + len); + return 0; + } + var caml_initial_time = new Date().getTime() * 0.001; + function caml_sys_time(){ + var now = new Date().getTime(); + return now * 0.001 - caml_initial_time; + } + function caml_sys_time_include_children(b){return caml_sys_time();} + function Base_clear_caml_backtrace_pos(x){return 0;} + function caml_check_bound(array, index){ + if(index >>> 0 >= array.length - 1) caml_array_bound_error(); + return array; + } + function caml_unix_getpwuid(unit){caml_raise_not_found();} + function caml_ba_to_typed_array(ba){return ba.data;} + function caml_domain_dls_get(unit){return caml_domain_dls;} + function caml_bytes_get32(s, i){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1), + b3 = caml_bytes_unsafe_get(s, i + 2), + b4 = caml_bytes_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_frexp_float(x){ + if(x == 0 || ! isFinite(x)) return [0, x, 0]; + var neg = x < 0; + if(neg) x = - x; + var exp = Math.max(- 1023, jsoo_floor_log2(x) + 1); + x *= Math.pow(2, - exp); + while(x < 0.5){x *= 2; exp--;} + while(x >= 1){x *= 0.5; exp++;} + if(neg) x = - x; + return [0, x, exp]; + } + function caml_string_get64(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 7) caml_string_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_string_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + function caml_js_error_option_of_exception(exn){ + if(exn.js_error) return [0, exn.js_error]; + return 0; + } + function caml_ml_pos_out_64(chanid){ + return caml_int64_of_float(caml_pos_out(chanid)); + } + function caml_unix_findclose(dir_handle){return caml_unix_closedir(dir_handle); + } + function caml_gr_close_subwindow(a){ + caml_failwith("caml_gr_close_subwindow not Implemented"); + } + function caml_floatarray_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_get_minor_free(unit){return 0;} + function caml_set_static_env(k, v){ + if(! globalThis.jsoo_static_env) globalThis.jsoo_static_env = {}; + globalThis.jsoo_static_env[k] = v; + return 0; + } + function caml_ba_change_layout(ba, layout){ + if(ba.layout == layout) return ba; + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) + new_dims[i] = ba.dims[ba.dims.length - i - 1]; + return caml_ba_create_unsafe(ba.kind, layout, new_dims, ba.data); + } + function Base_hash_double(d){return caml_hash(1, 1, 0, d);} + function caml_js_new(c, a){ + switch(a.length){ + case 1: + return new c(); + case 2: + return new c(a[1]); + case 3: + return new c(a[1], a[2]); + case 4: + return new c(a[1], a[2], a[3]); + case 5: + return new c(a[1], a[2], a[3], a[4]); + case 6: + return new c(a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return new c(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + function F(){return c.apply(this, caml_js_from_array(a));} + F.prototype = c.prototype; + return new F(); + } + function caml_gr_current_y(){var s = caml_gr_state_get(); return s.y;} + function caml_format_int(fmt, i){ + if(caml_jsbytes_of_string(fmt) == "%d") + return caml_string_of_jsbytes("" + i); + var f = caml_parse_format(fmt); + if(i < 0) if(f.signedconv){f.sign = - 1; i = - i;} else i >>>= 0; + var s = i.toString(f.base); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - s.length; + if(n > 0) s = caml_str_repeat(n, "0") + s; + } + return caml_finish_formatting(f, s); + } + function jsoo_effect_not_supported(){ + caml_failwith("Effect handlers are not supported"); + } + function caml_continuation_use_and_update_handler_noexc + (cont, hval, hexn, heff){ + var stack = caml_continuation_use_noexc(cont); + stack[3] = [0, hval, hexn, heff]; + return stack; + } + function caml_obj_truncate(x, s){ + if(s <= 0 || s + 1 > x.length) caml_invalid_argument("Obj.truncate"); + if(x.length != s + 1) x.length = s + 1; + return 0; + } + function caml_js_to_string(s){return caml_string_of_jsstring(s);} + function is_digit_odd(nat, ofs){if(nat.data[ofs] & 1) return 1; return 0;} + function caml_runtime_variant(_unit){return caml_string_of_jsbytes("");} + function caml_ml_open_descriptor_out(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.rdonly) caml_raise_sys_error("fd " + fd + " is readonly"); + var + buffered = file.flags.buffered !== undefined ? file.flags.buffered : 1, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: true, + buffer_curr: 0, + buffer: new Uint8Array(65536), + buffered: buffered}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function caml_array_concat(l){ + var a = [0]; + while(l !== 0){ + var b = l[1]; + for(var i = 1; i < b.length; i++) a.push(b[i]); + l = l[2]; + } + return a; + } + function caml_gr_open_graph(info){ + var info = caml_jsstring_of_string(info); + function get(name){ + var res = info.match("(^|,) *" + name + " *= *([a-zA-Z0-9_]+) *(,|$)"); + if(res) return res[2]; + } + var specs = []; + if(! (info == "")) specs.push(info); + var target = get("target"); + if(! target) target = ""; + var status = get("status"); + if(! status) specs.push("status=1"); + var w = get("width"); + w = w ? parseInt(w) : 200; + specs.push("width=" + w); + var h = get("height"); + h = h ? parseInt(h) : 200; + specs.push("height=" + h); + var win = globalThis.open("about:blank", target, specs.join(",")); + if(! win) caml_failwith("Graphics.open_graph: cannot open the window"); + var doc = win.document, canvas = doc.createElement("canvas"); + canvas.width = w; + canvas.height = h; + var ctx = caml_gr_state_create(canvas, w, h); + ctx.set_title = function(title){doc.title = title;}; + caml_gr_state_set(ctx); + var body = doc.body; + body.style.margin = "0px"; + body.appendChild(canvas); + return 0; + } + function caml_make_float_vect(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_cbrt_float(x){return Math.cbrt(x);} + function caml_eventlog_pause(unit){return 0;} + function caml_memprof_stop(unit){return 0;} + function caml_greaterequal(x, y){ + return + (caml_compare_val(x, y, false) >= 0); + } + function caml_get_exception_raw_backtrace(){return [0];} + function caml_log1p_float(x){return Math.log1p(x);} + var ms_to_nano = caml_int64_of_int32(1000 * 1000); + function time_now_nanoseconds_since_unix_epoch_or_zero(){ + var ms = Date.now(), ms_i63 = caml_int64_of_float(ms * 2); + return caml_int64_mul(ms_i63, ms_to_nano); + } + function caml_runtime_events_free_cursor(cursor){return 0;} + function caml_lazy_make_forward(v){return [250, v];} + function lor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] |= nat2.data[ofs2]; return 0; + } + function caml_gr_blit_image(im, x, y){ + var + s = caml_gr_state_get(), + im2 = + s.context.getImageData + (x, s.height - im.height - y, im.width, im.height); + for(var i = 0; i < im2.data.length; i += 4){ + im.data[i] = im2.data[i]; + im.data[i + 1] = im2.data[i + 1]; + im.data[i + 2] = im2.data[i + 2]; + im.data[i + 3] = im2.data[i + 3]; + } + return 0; + } + function caml_gr_window_id(a){ + caml_failwith("caml_gr_window_id not Implemented"); + } + function caml_js_on_ie(){ + var ua = globalThis.navigator ? globalThis.navigator.userAgent : ""; + return ua.indexOf("MSIE") != - 1 && ua.indexOf("Opera") != 0; + } + function caml_int64_shift_right(x, s){return x.shift_right(s);} + function caml_ba_layout(ba){return ba.layout;} + function caml_convert_raw_backtrace(){return [0];} + function caml_array_set(array, index, newval){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + array[index + 1] = newval; + return 0; + } + function caml_alloc_stack(hv, hx, hf){return 0;} + function caml_bytes_greaterequal(s1, s2){return caml_bytes_lessequal(s2, s1); + } + function set_digit_nat(nat, ofs, digit){nat.data[ofs] = digit; return 0;} + function caml_bytes_set16(s, i, i16){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var b2 = 0xFF & i16 >> 8, b1 = 0xFF & i16; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + return 0; + } + function caml_gr_doc_of_state(state){ + if(state.canvas.ownerDocument) return state.canvas.ownerDocument; + } + function caml_ml_output_int(chanid, i){ + var + arr = [i >> 24 & 0xFF, i >> 16 & 0xFF, i >> 8 & 0xFF, i & 0xFF], + s = caml_string_of_array(arr); + caml_ml_output(chanid, s, 0, 4); + return 0; + } + function caml_obj_with_tag(tag, x){ + var l = x.length, a = new Array(l); + a[0] = tag; + for(var i = 1; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ml_channel_size(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.file.length(); + } + function caml_raw_backtrace_slot(){ + caml_invalid_argument + ("Printexc.get_raw_backtrace_slot: index out of bounds"); + } + function caml_hexstring_of_float(x, prec, style){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_string_of_jsstring("nan"); + return caml_string_of_jsstring(x > 0 ? "infinity" : "-infinity"); + } + var sign = x == 0 && 1 / x == - Infinity ? 1 : x >= 0 ? 0 : 1; + if(sign) x = - x; + var exp = 0; + if(x == 0) + ; + else if(x < 1) + while(x < 1 && exp > - 1022){x *= 2; exp--;} + else + while(x >= 2){x /= 2; exp++;} + var exp_sign = exp < 0 ? "" : "+", sign_str = ""; + if(sign) + sign_str = "-"; + else + switch(style){ + case 43: + sign_str = "+"; break; + case 32: + sign_str = " "; break; + default: break; + } + if(prec >= 0 && prec < 13){ + var cst = Math.pow(2, prec * 4); + x = Math.round(x * cst) / cst; + } + var x_str = x.toString(16); + if(prec >= 0){ + var idx = x_str.indexOf("."); + if(idx < 0) + x_str += "." + caml_str_repeat(prec, "0"); + else{ + var size = idx + 1 + prec; + if(x_str.length < size) + x_str += caml_str_repeat(size - x_str.length, "0"); + else + x_str = x_str.substr(0, size); + } + } + return caml_string_of_jsstring + (sign_str + "0x" + x_str + "p" + exp_sign + exp.toString(10)); + } + function caml_runtime_events_user_write(event, event_content){return 0;} + function caml_js_wrap_meth_callback_strict(arity, f){ + return function(){ + var args = new Array(arity + 1), len = Math.min(arguments.length, arity); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_unix_readlink(name){ + var root = resolve_fs_device(name); + if(! root.device.readlink) + caml_failwith("caml_unix_readlink: not implemented"); + return root.device.readlink(root.rest, true); + } + function caml_backtrace_status(_unit){ + return caml_record_backtrace_flag ? 1 : 0; + } + function caml_install_signal_handler(){return 0;} + function caml_sys_argv(a){return caml_argv;} + function caml_ba_fill(ba, v){ba.fill(v); return 0;} + function caml_modf_float(x){ + if(isFinite(x)){ + var neg = 1 / x < 0; + x = Math.abs(x); + var i = Math.floor(x), f = x - i; + if(neg){i = - i; f = - f;} + return [0, f, i]; + } + if(isNaN(x)) return [0, NaN, NaN]; + return [0, 1 / x, x]; + } + function caml_gc_get(){return [0, 0, 0, 0, 0, 0, 0, 0, 0];} + function caml_float_compare(x, y){ + if(x === y) return 0; + if(x < y) return - 1; + if(x > y) return 1; + if(x === x) return 1; + if(y === y) return - 1; + return 0; + } + function caml_string_set32(s, i, i32){caml_failwith("caml_string_set32");} + function caml_parse_engine(tables, env, cmd, arg){ + var + ERRCODE = 256, + loop = 6, + testshift = 7, + shift = 8, + shift_recover = 9, + reduce = 10, + READ_TOKEN = 0, + RAISE_PARSE_ERROR = 1, + GROW_STACKS_1 = 2, + GROW_STACKS_2 = 3, + COMPUTE_SEMANTIC_ACTION = 4, + CALL_ERROR_FUNCTION = 5, + env_s_stack = 1, + env_v_stack = 2, + env_symb_start_stack = 3, + env_symb_end_stack = 4, + env_stacksize = 5, + env_stackbase = 6, + env_curr_char = 7, + env_lval = 8, + env_symb_start = 9, + env_symb_end = 10, + env_asp = 11, + env_rule_len = 12, + env_rule_number = 13, + env_sp = 14, + env_state = 15, + env_errflag = 16, + tbl_transl_const = 2, + tbl_transl_block = 3, + tbl_lhs = 4, + tbl_len = 5, + tbl_defred = 6, + tbl_dgoto = 7, + tbl_sindex = 8, + tbl_rindex = 9, + tbl_gindex = 10, + tbl_tablesize = 11, + tbl_table = 12, + tbl_check = 13, + tbl_names_const = 15, + tbl_names_block = 16; + function log(x){ + var s = caml_string_of_jsbytes(x + "\n"); + caml_ml_output(2, s, 0, caml_ml_string_length(s)); + } + function token_name(names, number){ + var str = caml_jsstring_of_string(names); + if(str[0] == "\x00") return ""; + return str.split("\x00")[number]; + } + function print_token(state, tok){ + var token, kind; + if(tok instanceof Array){ + token = token_name(tables[tbl_names_block], tok[0]); + if(typeof tok[1] == "number") + kind = "" + tok[1]; + else if(typeof tok[1] == "string") + kind = tok[1]; + else if(tok[1] instanceof MlBytes) + kind = caml_jsbytes_of_string(tok[1]); + else + kind = "_"; + log("State " + state + ": read token " + token + "(" + kind + ")"); + } + else{ + token = token_name(tables[tbl_names_const], tok); + log("State " + state + ": read token " + token); + } + } + if(! tables.dgoto){ + tables.defred = caml_lex_array(tables[tbl_defred]); + tables.sindex = caml_lex_array(tables[tbl_sindex]); + tables.check = caml_lex_array(tables[tbl_check]); + tables.rindex = caml_lex_array(tables[tbl_rindex]); + tables.table = caml_lex_array(tables[tbl_table]); + tables.len = caml_lex_array(tables[tbl_len]); + tables.lhs = caml_lex_array(tables[tbl_lhs]); + tables.gindex = caml_lex_array(tables[tbl_gindex]); + tables.dgoto = caml_lex_array(tables[tbl_dgoto]); + } + var + res = 0, + n, + n1, + n2, + state1, + sp = env[env_sp], + state = env[env_state], + errflag = env[env_errflag]; + exit: + for(;;) + next: + switch(cmd){ + case 0: + state = 0; errflag = 0; + case 6: + n = tables.defred[state]; + if(n != 0){cmd = reduce; break;} + if(env[env_curr_char] >= 0){cmd = testshift; break;} + res = READ_TOKEN; + break exit; + case 1: + if(arg instanceof Array){ + env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1]; + env[env_lval] = arg[1]; + } + else{ + env[env_curr_char] = tables[tbl_transl_const][arg + 1]; + env[env_lval] = 0; + } + if(caml_parser_trace) print_token(state, arg); + case 7: + n1 = tables.sindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){cmd = shift; break;} + n1 = tables.rindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){ + n = tables.table[n2]; + cmd = reduce; + break; + } + if(errflag <= 0){res = CALL_ERROR_FUNCTION; break exit;} + case 5: + if(errflag < 3){ + errflag = 3; + for(;;){ + state1 = env[env_s_stack][sp + 1]; + n1 = tables.sindex[state1]; + n2 = n1 + ERRCODE; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == ERRCODE){ + if(caml_parser_trace) log("Recovering in state " + state1); + cmd = shift_recover; + break next; + } + else{ + if(caml_parser_trace) log("Discarding state " + state1); + if(sp <= env[env_stackbase]){ + if(caml_parser_trace) log("No more states to discard"); + return RAISE_PARSE_ERROR; + } + sp--; + } + } + } + else{ + if(env[env_curr_char] == 0) return RAISE_PARSE_ERROR; + if(caml_parser_trace) log("Discarding last token read"); + env[env_curr_char] = - 1; + cmd = loop; + break; + } + case 8: + env[env_curr_char] = - 1; if(errflag > 0) errflag--; + case 9: + if(caml_parser_trace) + log("State " + state + ": shift to state " + tables.table[n2]); + state = tables.table[n2]; + sp++; + if(sp >= env[env_stacksize]){res = GROW_STACKS_1; break exit;} + case 2: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = env[env_lval]; + env[env_symb_start_stack][sp + 1] = env[env_symb_start]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end]; + cmd = loop; + break; + case 10: + if(caml_parser_trace) log("State " + state + ": reduce by rule " + n); + var m = tables.len[n]; + env[env_asp] = sp; + env[env_rule_number] = n; + env[env_rule_len] = m; + sp = sp - m + 1; + m = tables.lhs[n]; + state1 = env[env_s_stack][sp]; + n1 = tables.gindex[m]; + n2 = n1 + state1; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == state1) + state = tables.table[n2]; + else + state = tables.dgoto[m]; + if(sp >= env[env_stacksize]){res = GROW_STACKS_2; break exit;} + case 3: + res = COMPUTE_SEMANTIC_ACTION; break exit; + case 4: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = arg; + var asp = env[env_asp]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + if(sp > asp) + env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + cmd = loop; + break; + default: return RAISE_PARSE_ERROR; + } + env[env_sp] = sp; + env[env_state] = state; + env[env_errflag] = errflag; + return res; + } + function caml_jsoo_flags_effects(unit){return 0;} + function caml_update_dummy(x, y){ + if(typeof y === "function"){x.fun = y; return 0;} + if(y.fun){x.fun = y.fun; return 0;} + var i = y.length; + while(i--) x[i] = y[i]; + return 0; + } + function caml_array_fill(array, ofs, len, v){ + for(var i = 0; i < len; i++) array[ofs + i + 1] = v; + return 0; + } + function caml_sys_mkdir(name, perm){ + var root = resolve_fs_device(name); + root.device.mkdir(root.rest, perm); + return 0; + } + function caml_string_notequal(s1, s2){ + return 1 - caml_string_equal(s1, s2); + } + function caml_bytes_greaterthan(s1, s2){return caml_bytes_lessthan(s2, s1); + } + function caml_gr_make_image(arr){ + var + s = caml_gr_state_get(), + h = arr.length - 1, + w = arr[1].length - 1, + im = s.context.createImageData(w, h); + for(var i = 0; i < h; i++) + for(var j = 0; j < w; j++){ + var c = arr[i + 1][j + 1], o = i * (w * 4) + j * 4; + if(c == - 1){ + im.data[o + 0] = 0; + im.data[o + 1] = 0; + im.data[o + 2] = 0; + im.data[o + 3] = 0; + } + else{ + im.data[o + 0] = c >> 16 & 0xff; + im.data[o + 1] = c >> 8 & 0xff; + im.data[o + 2] = c >> 0 & 0Xff; + im.data[o + 3] = 0xff; + } + } + return im; + } + function Base_int_math_int_popcount(v){ + v = v - (v >>> 1 & 0x55555555); + v = (v & 0x33333333) + (v >>> 2 & 0x33333333); + return (v + (v >>> 4) & 0xF0F0F0F) * 0x1010101 >>> 24; + } + function caml_ml_set_channel_output(chanid, f){ + var chan = caml_ml_channels[chanid]; + chan.output = function(s){f(s);}; + return 0; + } + function caml_read_file_content(name){ + var + name = typeof name == "string" ? caml_string_of_jsbytes(name) : name, + root = resolve_fs_device(name); + if(root.device.exists(root.rest)){ + var + file = root.device.open(root.rest, {rdonly: 1}), + len = file.length(), + buf = new Uint8Array(len); + file.read(0, buf, 0, len); + return caml_string_of_array(buf); + } + caml_raise_no_such_file(caml_jsbytes_of_string(name)); + } + function caml_js_to_float(x){return x;} + function caml_setup_uncaught_exception_handler(){ + var process = globalThis.process; + if(process && process.on) + process.on + ("uncaughtException", + function(err, origin){ + caml_fatal_uncaught_exception(err); + process.exit(2); + }); + else if(globalThis.addEventListener) + globalThis.addEventListener + ("error", + function(event){ + if(event.error) caml_fatal_uncaught_exception(event.error); + }); + } + caml_setup_uncaught_exception_handler(); + globalThis.jsoo_runtime = + {time_now_nanoseconds_since_unix_epoch_or_zero: + time_now_nanoseconds_since_unix_epoch_or_zero, + Base_am_testing: Base_am_testing, + Base_hash_double: Base_hash_double, + Base_hash_string: Base_hash_string, + Base_int_math_int64_pow_stub: Base_int_math_int64_pow_stub, + Base_int_math_int_pow_stub: Base_int_math_int_pow_stub, + Base_int_math_int64_ctz: Base_int_math_int64_ctz, + Base_int_math_nativeint_ctz: Base_int_math_nativeint_ctz, + Base_int_math_int_ctz: Base_int_math_int_ctz, + Base_int_math_int32_ctz: Base_int_math_int32_ctz, + Base_int_math_int64_clz: Base_int_math_int64_clz, + Base_int_math_nativeint_clz: Base_int_math_nativeint_clz, + Base_int_math_int_clz: Base_int_math_int_clz, + Base_int_math_int32_clz: Base_int_math_int32_clz, + Base_caml_exn_is_most_recent_exn: Base_caml_exn_is_most_recent_exn, + Base_clear_caml_backtrace_pos: Base_clear_caml_backtrace_pos, + Base_int_math_int_popcount: Base_int_math_int_popcount, + Base_internalhash_get_hash_value: Base_internalhash_get_hash_value, + Base_internalhash_fold_string: Base_internalhash_fold_string, + Base_internalhash_fold_float: Base_internalhash_fold_float, + Base_internalhash_fold_int: Base_internalhash_fold_int, + Base_internalhash_fold_int64: Base_internalhash_fold_int64, + caml_runtime_events_read_poll: caml_runtime_events_read_poll, + caml_runtime_events_free_cursor: caml_runtime_events_free_cursor, + caml_runtime_events_create_cursor: caml_runtime_events_create_cursor, + caml_runtime_events_resume: caml_runtime_events_resume, + caml_runtime_events_pause: caml_runtime_events_pause, + caml_runtime_events_start: caml_runtime_events_start, + caml_runtime_events_user_resolve: caml_runtime_events_user_resolve, + caml_runtime_events_user_write: caml_runtime_events_user_write, + caml_runtime_events_user_register: caml_runtime_events_user_register, + caml_custom_event_index: caml_custom_event_index, + zstd_decompress: zstd_decompress, + jsoo_effect_not_supported: jsoo_effect_not_supported, + caml_ml_condition_signal: caml_ml_condition_signal, + caml_ml_condition_broadcast: caml_ml_condition_broadcast, + caml_ml_condition_wait: caml_ml_condition_wait, + caml_ml_condition_new: caml_ml_condition_new, + caml_get_continuation_callstack: caml_get_continuation_callstack, + caml_continuation_use_and_update_handler_noexc: + caml_continuation_use_and_update_handler_noexc, + caml_continuation_use_noexc: caml_continuation_use_noexc, + caml_alloc_stack: caml_alloc_stack, + caml_ml_mutex_unlock: caml_ml_mutex_unlock, + caml_ml_mutex_try_lock: caml_ml_mutex_try_lock, + caml_ml_mutex_lock: caml_ml_mutex_lock, + caml_ml_mutex_new: caml_ml_mutex_new, + MlMutex: MlMutex, + caml_lxm_next: caml_lxm_next, + caml_ml_domain_cpu_relax: caml_ml_domain_cpu_relax, + caml_ml_domain_id: caml_ml_domain_id, + caml_domain_spawn: caml_domain_spawn, + caml_domain_id: caml_domain_id, + caml_recommended_domain_count: caml_recommended_domain_count, + caml_ml_domain_set_name: caml_ml_domain_set_name, + caml_ml_domain_unique_token: caml_ml_domain_unique_token, + caml_atomic_exchange: caml_atomic_exchange, + caml_atomic_fetch_add: caml_atomic_fetch_add, + caml_atomic_cas: caml_atomic_cas, + caml_atomic_load: caml_atomic_load, + caml_domain_dls_get: caml_domain_dls_get, + caml_domain_dls_set: caml_domain_dls_set, + caml_domain_dls: caml_domain_dls, + caml_ephe_check_data: caml_ephe_check_data, + caml_ephe_unset_data: caml_ephe_unset_data, + caml_ephe_set_data: caml_ephe_set_data, + caml_ephe_get_data_copy: caml_ephe_get_data_copy, + caml_ephe_get_data: caml_ephe_get_data, + caml_ephe_blit_data: caml_ephe_blit_data, + caml_ephe_blit_key: caml_ephe_blit_key, + caml_ephe_check_key: caml_ephe_check_key, + caml_ephe_get_key_copy: caml_ephe_get_key_copy, + caml_ephe_get_key: caml_ephe_get_key, + caml_weak_set: caml_weak_set, + caml_weak_create: caml_weak_create, + caml_ephe_create: caml_ephe_create, + caml_ephe_unset_key: caml_ephe_unset_key, + caml_ephe_set_key: caml_ephe_set_key, + caml_ephe_data_offset: caml_ephe_data_offset, + caml_ephe_key_offset: caml_ephe_key_offset, + caml_unix_inet_addr_of_string: caml_unix_inet_addr_of_string, + caml_unix_findclose: caml_unix_findclose, + caml_unix_findnext: caml_unix_findnext, + caml_unix_findfirst: caml_unix_findfirst, + caml_unix_rewinddir: caml_unix_rewinddir, + caml_unix_closedir: caml_unix_closedir, + caml_unix_readdir: caml_unix_readdir, + caml_unix_opendir: caml_unix_opendir, + caml_unix_has_symlink: caml_unix_has_symlink, + caml_unix_getpwuid: caml_unix_getpwuid, + caml_unix_getuid: caml_unix_getuid, + caml_unix_unlink: caml_unix_unlink, + caml_unix_readlink: caml_unix_readlink, + caml_unix_symlink: caml_unix_symlink, + caml_unix_rmdir: caml_unix_rmdir, + caml_unix_mkdir: caml_unix_mkdir, + caml_unix_lstat_64: caml_unix_lstat_64, + caml_unix_lstat: caml_unix_lstat, + caml_unix_stat_64: caml_unix_stat_64, + caml_unix_stat: caml_unix_stat, + make_unix_err_args: make_unix_err_args, + caml_unix_isatty: caml_unix_isatty, + caml_unix_filedescr_of_fd: caml_unix_filedescr_of_fd, + caml_unix_cleanup: caml_unix_cleanup, + caml_unix_startup: caml_unix_startup, + caml_unix_mktime: caml_unix_mktime, + caml_unix_localtime: caml_unix_localtime, + caml_unix_gmtime: caml_unix_gmtime, + caml_unix_time: caml_unix_time, + caml_unix_gettimeofday: caml_unix_gettimeofday, + caml_str_initialize: caml_str_initialize, + re_replacement_text: re_replacement_text, + re_partial_match: re_partial_match, + re_string_match: re_string_match, + re_search_backward: re_search_backward, + re_search_forward: re_search_forward, + re_match: re_match, + caml_sys_is_regular_file: caml_sys_is_regular_file, + caml_spacetime_only_works_for_native_code: + caml_spacetime_only_works_for_native_code, + caml_register_channel_for_spacetime: caml_register_channel_for_spacetime, + caml_sys_const_naked_pointers_checked: + caml_sys_const_naked_pointers_checked, + caml_spacetime_enabled: caml_spacetime_enabled, + caml_ml_runtime_warnings_enabled: caml_ml_runtime_warnings_enabled, + caml_ml_enable_runtime_warnings: caml_ml_enable_runtime_warnings, + caml_runtime_warnings: caml_runtime_warnings, + caml_install_signal_handler: caml_install_signal_handler, + caml_runtime_parameters: caml_runtime_parameters, + caml_runtime_variant: caml_runtime_variant, + caml_sys_isatty: caml_sys_isatty, + caml_sys_get_config: caml_sys_get_config, + os_type: os_type, + caml_sys_const_backend_type: caml_sys_const_backend_type, + caml_sys_const_ostype_cygwin: caml_sys_const_ostype_cygwin, + caml_sys_const_ostype_win32: caml_sys_const_ostype_win32, + caml_sys_const_ostype_unix: caml_sys_const_ostype_unix, + caml_sys_const_max_wosize: caml_sys_const_max_wosize, + caml_sys_const_int_size: caml_sys_const_int_size, + caml_sys_const_word_size: caml_sys_const_word_size, + caml_sys_const_big_endian: caml_sys_const_big_endian, + caml_sys_random_seed: caml_sys_random_seed, + caml_sys_time_include_children: caml_sys_time_include_children, + caml_sys_time: caml_sys_time, + caml_sys_system_command: caml_sys_system_command, + caml_sys_executable_name: caml_sys_executable_name, + caml_sys_modify_argv: caml_sys_modify_argv, + caml_sys_argv: caml_sys_argv, + caml_sys_get_argv: caml_sys_get_argv, + caml_executable_name: caml_executable_name, + caml_argv: caml_argv, + caml_sys_unsafe_getenv: caml_sys_unsafe_getenv, + caml_sys_getenv: caml_sys_getenv, + jsoo_sys_getenv: jsoo_sys_getenv, + caml_set_static_env: caml_set_static_env, + caml_fatal_uncaught_exception: caml_fatal_uncaught_exception, + caml_format_exception: caml_format_exception, + caml_is_special_exception: caml_is_special_exception, + caml_sys_exit: caml_sys_exit, + caml_raise_sys_error: caml_raise_sys_error, + caml_maybe_print_stats: caml_maybe_print_stats, + caml_is_printable: caml_is_printable, + caml_get_global_data: caml_get_global_data, + caml_register_global: caml_register_global, + caml_build_symbols: caml_build_symbols, + caml_global_data: caml_global_data, + caml_named_value: caml_named_value, + caml_register_named_value: caml_register_named_value, + caml_named_values: caml_named_values, + caml_call_gen: caml_call_gen, + caml_set_parser_trace: caml_set_parser_trace, + caml_parse_engine: caml_parse_engine, + caml_parser_trace: caml_parser_trace, + caml_is_continuation_tag: caml_is_continuation_tag, + caml_lazy_read_result: caml_lazy_read_result, + caml_lazy_reset_to_lazy: caml_lazy_reset_to_lazy, + caml_lazy_update_to_forward: caml_lazy_update_to_forward, + caml_lazy_update_to_forcing: caml_lazy_update_to_forcing, + caml_obj_update_tag: caml_obj_update_tag, + caml_obj_add_offset: caml_obj_add_offset, + caml_obj_reachable_words: caml_obj_reachable_words, + caml_obj_set_raw_field: caml_obj_set_raw_field, + caml_obj_raw_field: caml_obj_raw_field, + caml_fresh_oo_id: caml_fresh_oo_id, + caml_set_oo_id: caml_set_oo_id, + caml_oo_last_id: caml_oo_last_id, + caml_get_public_method: caml_get_public_method, + caml_lazy_make_forward: caml_lazy_make_forward, + caml_obj_is_shared: caml_obj_is_shared, + caml_obj_compare_and_swap: caml_obj_compare_and_swap, + caml_obj_make_forward: caml_obj_make_forward, + caml_obj_truncate: caml_obj_truncate, + caml_obj_dup: caml_obj_dup, + caml_obj_with_tag: caml_obj_with_tag, + caml_obj_block: caml_obj_block, + caml_obj_set_tag: caml_obj_set_tag, + caml_obj_tag: caml_obj_tag, + caml_obj_is_block: caml_obj_is_block, + caml_alloc_dummy_infix: caml_alloc_dummy_infix, + caml_update_dummy: caml_update_dummy, + deserialize_nat: deserialize_nat, + serialize_nat: serialize_nat, + lxor_digit_nat: lxor_digit_nat, + lor_digit_nat: lor_digit_nat, + land_digit_nat: land_digit_nat, + compare_nat_real: compare_nat_real, + compare_nat: compare_nat, + compare_digits_nat: compare_digits_nat, + shift_right_nat: shift_right_nat, + div_nat: div_nat, + div_digit_nat: div_digit_nat, + div_helper: div_helper, + shift_left_nat: shift_left_nat, + square_nat: square_nat, + mult_nat: mult_nat, + mult_digit_nat: mult_digit_nat, + sub_nat: sub_nat, + decr_nat: decr_nat, + complement_nat: complement_nat, + add_nat: add_nat, + incr_nat: incr_nat, + is_digit_odd: is_digit_odd, + is_digit_zero: is_digit_zero, + is_digit_int: is_digit_int, + num_leading_zero_bits_in_digit: num_leading_zero_bits_in_digit, + num_digits_nat: num_digits_nat, + nth_digit_nat_native: nth_digit_nat_native, + set_digit_nat_native: set_digit_nat_native, + nth_digit_nat: nth_digit_nat, + set_digit_nat: set_digit_nat, + blit_nat: blit_nat, + set_to_zero_nat: set_to_zero_nat, + create_nat: create_nat, + nat_of_array: nat_of_array, + caml_hash_nat: caml_hash_nat, + MlNat: MlNat, + initialize_nat: initialize_nat, + caml_array_of_bytes: caml_array_of_bytes, + caml_array_of_string: caml_array_of_string, + caml_js_to_string: caml_js_to_string, + caml_to_js_string: caml_to_js_string, + caml_js_from_string: caml_js_from_string, + caml_new_string: caml_new_string, + caml_js_to_byte_string: caml_js_to_byte_string, + caml_is_ml_string: caml_is_ml_string, + caml_ml_bytes_content: caml_ml_bytes_content, + caml_is_ml_bytes: caml_is_ml_bytes, + caml_bytes_of_jsbytes: caml_bytes_of_jsbytes, + caml_string_of_jsstring: caml_string_of_jsstring, + caml_jsstring_of_string: caml_jsstring_of_string, + caml_jsbytes_of_string: caml_jsbytes_of_string, + caml_string_of_jsbytes: caml_string_of_jsbytes, + caml_bytes_of_string: caml_bytes_of_string, + caml_string_of_bytes: caml_string_of_bytes, + caml_string_lessthan: caml_string_lessthan, + caml_string_lessequal: caml_string_lessequal, + caml_string_equal: caml_string_equal, + caml_string_compare: caml_string_compare, + caml_ml_string_length: caml_ml_string_length, + caml_string_unsafe_set: caml_string_unsafe_set, + caml_string_unsafe_get: caml_string_unsafe_get, + caml_ml_bytes_length: caml_ml_bytes_length, + caml_blit_string: caml_blit_string, + caml_blit_bytes: caml_blit_bytes, + caml_fill_bytes: caml_fill_bytes, + caml_bytes_greaterthan: caml_bytes_greaterthan, + caml_string_greaterthan: caml_string_greaterthan, + caml_bytes_greaterequal: caml_bytes_greaterequal, + caml_string_greaterequal: caml_string_greaterequal, + caml_bytes_lessthan: caml_bytes_lessthan, + caml_bytes_lessequal: caml_bytes_lessequal, + caml_bytes_notequal: caml_bytes_notequal, + caml_string_notequal: caml_string_notequal, + caml_bytes_equal: caml_bytes_equal, + caml_bytes_compare: caml_bytes_compare, + caml_bytes_of_array: caml_bytes_of_array, + caml_string_of_array: caml_string_of_array, + caml_create_bytes: caml_create_bytes, + caml_create_string: caml_create_string, + caml_uint8_array_of_string: caml_uint8_array_of_string, + caml_uint8_array_of_bytes: caml_uint8_array_of_bytes, + caml_convert_bytes_to_array: caml_convert_bytes_to_array, + caml_convert_string_to_bytes: caml_convert_string_to_bytes, + MlBytes: MlBytes, + caml_bytes_of_utf16_jsstring: caml_bytes_of_utf16_jsstring, + caml_bytes_set: caml_bytes_set, + caml_string_set64: caml_string_set64, + caml_bytes_set64: caml_bytes_set64, + caml_string_set32: caml_string_set32, + caml_bytes_set32: caml_bytes_set32, + caml_string_set16: caml_string_set16, + caml_bytes_set16: caml_bytes_set16, + caml_string_set: caml_string_set, + caml_bytes_get: caml_bytes_get, + caml_bytes_get64: caml_bytes_get64, + caml_string_get64: caml_string_get64, + caml_bytes_get32: caml_bytes_get32, + caml_string_get32: caml_string_get32, + caml_bytes_get16: caml_bytes_get16, + caml_string_get16: caml_string_get16, + caml_string_get: caml_string_get, + caml_bytes_bound_error: caml_bytes_bound_error, + caml_string_bound_error: caml_string_bound_error, + caml_bytes_unsafe_set: caml_bytes_unsafe_set, + caml_bytes_unsafe_get: caml_bytes_unsafe_get, + jsoo_is_ascii: jsoo_is_ascii, + caml_utf16_of_utf8: caml_utf16_of_utf8, + caml_utf8_of_utf16: caml_utf8_of_utf16, + caml_subarray_to_jsbytes: caml_subarray_to_jsbytes, + caml_str_repeat: caml_str_repeat, + caml_md5_bytes: caml_md5_bytes, + caml_MD5Final: caml_MD5Final, + caml_MD5Update: caml_MD5Update, + caml_MD5Init: caml_MD5Init, + caml_MD5Transform: caml_MD5Transform, + caml_md5_string: caml_md5_string, + caml_md5_chan: caml_md5_chan, + caml_output_value_to_buffer: caml_output_value_to_buffer, + caml_output_value_to_bytes: caml_output_value_to_bytes, + caml_output_value_to_string: caml_output_value_to_string, + caml_output_val: caml_output_val, + MlObjectTable: MlObjectTable, + caml_marshal_data_size: caml_marshal_data_size, + caml_marshal_header_size: caml_marshal_header_size, + caml_input_value_from_reader: caml_input_value_from_reader, + caml_custom_ops: caml_custom_ops, + caml_nativeint_unmarshal: caml_nativeint_unmarshal, + caml_int32_unmarshal: caml_int32_unmarshal, + caml_int64_marshal: caml_int64_marshal, + caml_int64_unmarshal: caml_int64_unmarshal, + caml_input_value_from_bytes: caml_input_value_from_bytes, + caml_input_value_from_string: caml_input_value_from_string, + caml_float_of_bytes: caml_float_of_bytes, + BigStringReader: BigStringReader, + MlStringReader: MlStringReader, + UInt8ArrayReader: UInt8ArrayReader, + caml_marshal_constants: caml_marshal_constants, + caml_new_lex_engine: caml_new_lex_engine, + caml_lex_engine: caml_lex_engine, + caml_lex_array: caml_lex_array, + caml_js_error_of_exception: caml_js_error_of_exception, + caml_xmlhttprequest_create: caml_xmlhttprequest_create, + caml_js_get_console: caml_js_get_console, + caml_js_html_entities: caml_js_html_entities, + caml_js_html_escape: caml_js_html_escape, + caml_js_on_ie: caml_js_on_ie, + caml_js_object: caml_js_object, + caml_pure_js_expr: caml_pure_js_expr, + caml_js_expr: caml_js_expr, + caml_js_eval_string: caml_js_eval_string, + caml_js_equals: caml_js_equals, + caml_js_function_arity: caml_js_function_arity, + caml_js_wrap_meth_callback_unsafe: caml_js_wrap_meth_callback_unsafe, + caml_js_wrap_meth_callback_strict: caml_js_wrap_meth_callback_strict, + caml_js_wrap_meth_callback_arguments: + caml_js_wrap_meth_callback_arguments, + caml_js_wrap_meth_callback: caml_js_wrap_meth_callback, + caml_js_wrap_callback_unsafe: caml_js_wrap_callback_unsafe, + caml_js_wrap_callback_strict: caml_js_wrap_callback_strict, + caml_js_wrap_callback_arguments: caml_js_wrap_callback_arguments, + caml_js_wrap_callback: caml_js_wrap_callback, + caml_ojs_new_arr: caml_ojs_new_arr, + caml_js_new: caml_js_new, + caml_js_meth_call: caml_js_meth_call, + caml_js_fun_call: caml_js_fun_call, + caml_js_call: caml_js_call, + caml_js_var: caml_js_var, + caml_list_to_js_array: caml_list_to_js_array, + caml_list_of_js_array: caml_list_of_js_array, + caml_js_to_array: caml_js_to_array, + caml_js_from_array: caml_js_from_array, + caml_js_to_float: caml_js_to_float, + caml_js_from_float: caml_js_from_float, + caml_js_to_bool: caml_js_to_bool, + caml_js_from_bool: caml_js_from_bool, + caml_js_error_option_of_exception: caml_js_error_option_of_exception, + caml_exn_with_js_backtrace: caml_exn_with_js_backtrace, + caml_maybe_attach_backtrace: caml_maybe_attach_backtrace, + caml_wrap_exception: caml_wrap_exception, + caml_jsoo_flags_effects: caml_jsoo_flags_effects, + caml_jsoo_flags_use_js_string: caml_jsoo_flags_use_js_string, + caml_is_js: caml_is_js, + caml_callback: caml_callback, + caml_trampoline_return: caml_trampoline_return, + caml_trampoline: caml_trampoline, + caml_js_typeof: caml_js_typeof, + caml_js_instanceof: caml_js_instanceof, + caml_js_delete: caml_js_delete, + caml_js_get: caml_js_get, + caml_js_set: caml_js_set, + caml_js_pure_expr: caml_js_pure_expr, + caml_ml_set_buffered: caml_ml_set_buffered, + caml_ml_is_buffered: caml_ml_is_buffered, + caml_ml_output_int: caml_ml_output_int, + caml_ml_pos_out_64: caml_ml_pos_out_64, + caml_ml_pos_out: caml_ml_pos_out, + caml_pos_out: caml_pos_out, + caml_ml_seek_out_64: caml_ml_seek_out_64, + caml_ml_seek_out: caml_ml_seek_out, + caml_seek_out: caml_seek_out, + caml_output_value: caml_output_value, + caml_ml_output_char: caml_ml_output_char, + caml_ml_output: caml_ml_output, + caml_ml_output_bytes: caml_ml_output_bytes, + caml_ml_flush: caml_ml_flush, + caml_ml_input_scan_line: caml_ml_input_scan_line, + caml_ml_pos_in_64: caml_ml_pos_in_64, + caml_ml_pos_in: caml_ml_pos_in, + caml_pos_in: caml_pos_in, + caml_ml_seek_in_64: caml_ml_seek_in_64, + caml_ml_seek_in: caml_ml_seek_in, + caml_seek_in: caml_seek_in, + caml_ml_input_int: caml_ml_input_int, + caml_ml_input_char: caml_ml_input_char, + caml_input_value_to_outside_heap: caml_input_value_to_outside_heap, + caml_input_value: caml_input_value, + caml_ml_input_block: caml_ml_input_block, + caml_ml_input: caml_ml_input, + caml_refill: caml_refill, + caml_ml_set_channel_refill: caml_ml_set_channel_refill, + caml_ml_set_channel_output: caml_ml_set_channel_output, + caml_ml_channel_size_64: caml_ml_channel_size_64, + caml_ml_channel_size: caml_ml_channel_size, + caml_ml_close_channel: caml_ml_close_channel, + caml_ml_set_binary_mode: caml_ml_set_binary_mode, + caml_channel_descriptor: caml_channel_descriptor, + caml_ml_open_descriptor_in: caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out: caml_ml_open_descriptor_out, + caml_ml_out_channels_list: caml_ml_out_channels_list, + caml_ml_channels: caml_ml_channels, + caml_ml_set_channel_name: caml_ml_set_channel_name, + caml_sys_open: caml_sys_open, + caml_sys_close: caml_sys_close, + caml_sys_fds: caml_sys_fds, + caml_int64_bswap: caml_int64_bswap, + caml_int32_bswap: caml_int32_bswap, + caml_bswap16: caml_bswap16, + caml_mod: caml_mod, + caml_div: caml_div, + caml_mul: caml_mul, + caml_int_of_string: caml_int_of_string, + caml_parse_digit: caml_parse_digit, + caml_parse_sign_and_base: caml_parse_sign_and_base, + caml_format_int: caml_format_int, + caml_int64_hash: caml_int64_hash, + caml_int64_to_bytes: caml_int64_to_bytes, + caml_int64_of_bytes: caml_int64_of_bytes, + caml_int64_hi32: caml_int64_hi32, + caml_int64_lo32: caml_int64_lo32, + caml_int64_create_lo_hi: caml_int64_create_lo_hi, + caml_int64_create_lo_mi_hi: caml_int64_create_lo_mi_hi, + caml_int64_of_string: caml_int64_of_string, + caml_int64_format: caml_int64_format, + caml_int64_of_float: caml_int64_of_float, + caml_int64_to_float: caml_int64_to_float, + caml_int64_to_int32: caml_int64_to_int32, + caml_int64_of_int32: caml_int64_of_int32, + caml_int64_mod: caml_int64_mod, + caml_int64_div: caml_int64_div, + caml_int64_shift_right: caml_int64_shift_right, + caml_int64_shift_right_unsigned: caml_int64_shift_right_unsigned, + caml_int64_shift_left: caml_int64_shift_left, + caml_int64_xor: caml_int64_xor, + caml_int64_or: caml_int64_or, + caml_int64_and: caml_int64_and, + caml_int64_is_negative: caml_int64_is_negative, + caml_int64_is_zero: caml_int64_is_zero, + caml_int64_mul: caml_int64_mul, + caml_int64_sub: caml_int64_sub, + caml_int64_add: caml_int64_add, + caml_int64_neg: caml_int64_neg, + caml_int64_compare: caml_int64_compare, + caml_int64_ult: caml_int64_ult, + MlInt64: MlInt64, + caml_int64_offset: caml_int64_offset, + caml_float_of_string: caml_float_of_string, + caml_format_float: caml_format_float, + caml_fma_float: caml_fma_float, + caml_erfc_float: caml_erfc_float, + caml_erf_float: caml_erf_float, + caml_cbrt_float: caml_cbrt_float, + caml_round_float: caml_round_float, + caml_atanh_float: caml_atanh_float, + caml_tanh_float: caml_tanh_float, + caml_asinh_float: caml_asinh_float, + caml_sinh_float: caml_sinh_float, + caml_acosh_float: caml_acosh_float, + caml_cosh_float: caml_cosh_float, + caml_log10_float: caml_log10_float, + caml_hypot_float: caml_hypot_float, + caml_log2_float: caml_log2_float, + caml_log1p_float: caml_log1p_float, + caml_exp2_float: caml_exp2_float, + caml_expm1_float: caml_expm1_float, + caml_signbit_float: caml_signbit_float, + caml_copysign_float: caml_copysign_float, + caml_float_compare: caml_float_compare, + caml_frexp_float: caml_frexp_float, + caml_ldexp_float: caml_ldexp_float, + caml_modf_float: caml_modf_float, + caml_classify_float: caml_classify_float, + caml_int32_float_of_bits: caml_int32_float_of_bits, + caml_trunc_float: caml_trunc_float, + caml_nextafter_float: caml_nextafter_float, + caml_int64_float_of_bits: caml_int64_float_of_bits, + caml_hexstring_of_float: caml_hexstring_of_float, + caml_int32_bits_of_float: caml_int32_bits_of_float, + caml_int64_bits_of_float: caml_int64_bits_of_float, + jsoo_floor_log2: jsoo_floor_log2, + caml_string_hash: caml_string_hash, + caml_hash: caml_hash, + caml_hash_mix_string: caml_hash_mix_string, + caml_hash_mix_bytes: caml_hash_mix_bytes, + caml_hash_mix_bytes_arr: caml_hash_mix_bytes_arr, + caml_hash_mix_jsbytes: caml_hash_mix_jsbytes, + caml_hash_mix_int64: caml_hash_mix_int64, + caml_hash_mix_float: caml_hash_mix_float, + caml_hash_mix_final: caml_hash_mix_final, + caml_hash_mix_int: caml_hash_mix_int, + caml_gr_close_subwindow: caml_gr_close_subwindow, + caml_gr_open_subwindow: caml_gr_open_subwindow, + caml_gr_window_id: caml_gr_window_id, + caml_gr_display_mode: caml_gr_display_mode, + caml_gr_remember_mode: caml_gr_remember_mode, + caml_gr_synchronize: caml_gr_synchronize, + caml_gr_wait_event: caml_gr_wait_event, + caml_gr_sigio_signal: caml_gr_sigio_signal, + caml_gr_sigio_handler: caml_gr_sigio_handler, + caml_gr_blit_image: caml_gr_blit_image, + caml_gr_create_image: caml_gr_create_image, + caml_gr_draw_image: caml_gr_draw_image, + caml_gr_dump_image: caml_gr_dump_image, + caml_gr_make_image: caml_gr_make_image, + caml_gr_text_size: caml_gr_text_size, + caml_gr_set_text_size: caml_gr_set_text_size, + caml_gr_set_font: caml_gr_set_font, + caml_gr_draw_string: caml_gr_draw_string, + caml_gr_draw_char: caml_gr_draw_char, + caml_gr_draw_str: caml_gr_draw_str, + caml_gr_fill_arc: caml_gr_fill_arc, + caml_gr_fill_poly: caml_gr_fill_poly, + caml_gr_fill_rect: caml_gr_fill_rect, + caml_gr_set_line_width: caml_gr_set_line_width, + caml_gr_draw_arc: caml_gr_draw_arc, + caml_gr_arc_aux: caml_gr_arc_aux, + caml_gr_draw_rect: caml_gr_draw_rect, + caml_gr_lineto: caml_gr_lineto, + caml_gr_current_y: caml_gr_current_y, + caml_gr_current_x: caml_gr_current_x, + caml_gr_moveto: caml_gr_moveto, + caml_gr_point_color: caml_gr_point_color, + caml_gr_plot: caml_gr_plot, + caml_gr_set_color: caml_gr_set_color, + caml_gr_size_y: caml_gr_size_y, + caml_gr_size_x: caml_gr_size_x, + caml_gr_clear_graph: caml_gr_clear_graph, + caml_gr_resize_window: caml_gr_resize_window, + caml_gr_set_window_title: caml_gr_set_window_title, + caml_gr_close_graph: caml_gr_close_graph, + caml_gr_doc_of_state: caml_gr_doc_of_state, + caml_gr_state_create: caml_gr_state_create, + caml_gr_state_init: caml_gr_state_init, + caml_gr_open_graph: caml_gr_open_graph, + caml_gr_state_set: caml_gr_state_set, + caml_gr_state_get: caml_gr_state_get, + caml_gr_state: caml_gr_state, + caml_get_major_credit: caml_get_major_credit, + caml_get_major_bucket: caml_get_major_bucket, + caml_get_minor_free: caml_get_minor_free, + caml_gc_minor_words: caml_gc_minor_words, + caml_gc_major_slice: caml_gc_major_slice, + caml_gc_huge_fallback_count: caml_gc_huge_fallback_count, + caml_eventlog_pause: caml_eventlog_pause, + caml_eventlog_resume: caml_eventlog_resume, + caml_memprof_stop: caml_memprof_stop, + caml_memprof_start: caml_memprof_start, + caml_final_release: caml_final_release, + caml_final_register_called_without_value: + caml_final_register_called_without_value, + caml_final_register: caml_final_register, + caml_memprof_set: caml_memprof_set, + caml_gc_get: caml_gc_get, + caml_gc_set: caml_gc_set, + caml_gc_stat: caml_gc_stat, + caml_gc_quick_stat: caml_gc_quick_stat, + caml_gc_counters: caml_gc_counters, + caml_gc_compaction: caml_gc_compaction, + caml_gc_full_major: caml_gc_full_major, + caml_gc_major: caml_gc_major, + caml_gc_minor: caml_gc_minor, + caml_sys_open_for_node: caml_sys_open_for_node, + MlNodeFd: MlNodeFd, + MlNodeDevice: MlNodeDevice, + fs_node_supported: fs_node_supported, + MlFakeFd: MlFakeFd, + MlFakeFd_out: MlFakeFd_out, + MlFakeFile: MlFakeFile, + MlFakeDevice: MlFakeDevice, + caml_read_file_content: caml_read_file_content, + jsoo_create_file: jsoo_create_file, + caml_create_file: caml_create_file, + caml_fs_init: caml_fs_init, + jsoo_create_file_extern: jsoo_create_file_extern, + caml_ba_map_file_bytecode: caml_ba_map_file_bytecode, + caml_ba_map_file: caml_ba_map_file, + caml_sys_rmdir: caml_sys_rmdir, + caml_sys_mkdir: caml_sys_mkdir, + caml_sys_rename: caml_sys_rename, + caml_sys_is_directory: caml_sys_is_directory, + caml_sys_remove: caml_sys_remove, + caml_sys_read_directory: caml_sys_read_directory, + caml_sys_file_exists: caml_sys_file_exists, + caml_raise_not_a_dir: caml_raise_not_a_dir, + caml_raise_no_such_file: caml_raise_no_such_file, + caml_sys_chdir: caml_sys_chdir, + caml_sys_getcwd: caml_sys_getcwd, + caml_unmount: caml_unmount, + caml_mount_autoload: caml_mount_autoload, + resolve_fs_device: resolve_fs_device, + caml_list_mount_point: caml_list_mount_point, + jsoo_mount_point: jsoo_mount_point, + caml_make_path: caml_make_path, + path_is_absolute: path_is_absolute, + MlFile: MlFile, + caml_root: caml_root, + caml_get_root: caml_get_root, + caml_current_dir: caml_current_dir, + caml_trailing_slash: caml_trailing_slash, + caml_finish_formatting: caml_finish_formatting, + caml_parse_format: caml_parse_format, + caml_array_bound_error: caml_array_bound_error, + caml_raise_not_found: caml_raise_not_found, + caml_raise_zero_divide: caml_raise_zero_divide, + caml_raise_end_of_file: caml_raise_end_of_file, + caml_invalid_argument: caml_invalid_argument, + caml_failwith: caml_failwith, + caml_raise_with_string: caml_raise_with_string, + caml_raise_with_args: caml_raise_with_args, + caml_raise_with_arg: caml_raise_with_arg, + caml_raise_constant: caml_raise_constant, + caml_lessthan: caml_lessthan, + caml_lessequal: caml_lessequal, + caml_greaterthan: caml_greaterthan, + caml_greaterequal: caml_greaterequal, + caml_notequal: caml_notequal, + caml_equal: caml_equal, + caml_int_compare: caml_int_compare, + caml_compare: caml_compare, + caml_compare_val: caml_compare_val, + caml_compare_val_number_custom: caml_compare_val_number_custom, + caml_compare_val_get_custom: caml_compare_val_get_custom, + caml_compare_val_tag: caml_compare_val_tag, + caml_bigstring_blit_ba_to_bytes: caml_bigstring_blit_ba_to_bytes, + caml_bigstring_blit_bytes_to_ba: caml_bigstring_blit_bytes_to_ba, + caml_bigstring_blit_string_to_ba: caml_bigstring_blit_string_to_ba, + caml_bigstring_blit_ba_to_ba: caml_bigstring_blit_ba_to_ba, + caml_bigstring_memcmp: caml_bigstring_memcmp, + bigstring_of_typed_array: bigstring_of_typed_array, + bigstring_of_array_buffer: bigstring_of_array_buffer, + bigstring_to_typed_array: bigstring_to_typed_array, + bigstring_to_array_buffer: bigstring_to_array_buffer, + caml_hash_mix_bigstring: caml_hash_mix_bigstring, + caml_ba_from_typed_array: caml_ba_from_typed_array, + caml_ba_kind_of_typed_array: caml_ba_kind_of_typed_array, + caml_ba_to_typed_array: caml_ba_to_typed_array, + caml_ba_hash: caml_ba_hash, + caml_ba_create_from: caml_ba_create_from, + caml_ba_deserialize: caml_ba_deserialize, + caml_ba_serialize: caml_ba_serialize, + caml_ba_reshape: caml_ba_reshape, + caml_ba_slice: caml_ba_slice, + caml_ba_sub: caml_ba_sub, + caml_ba_blit: caml_ba_blit, + caml_ba_fill: caml_ba_fill, + caml_ba_set_3: caml_ba_set_3, + caml_ba_set_2: caml_ba_set_2, + caml_ba_set_1: caml_ba_set_1, + caml_ba_uint8_set64: caml_ba_uint8_set64, + caml_ba_uint8_set32: caml_ba_uint8_set32, + caml_ba_uint8_set16: caml_ba_uint8_set16, + caml_ba_set_generic: caml_ba_set_generic, + caml_ba_get_3: caml_ba_get_3, + caml_ba_get_2: caml_ba_get_2, + caml_ba_get_1: caml_ba_get_1, + caml_ba_uint8_get64: caml_ba_uint8_get64, + caml_ba_uint8_get32: caml_ba_uint8_get32, + caml_ba_uint8_get16: caml_ba_uint8_get16, + caml_ba_get_generic: caml_ba_get_generic, + caml_ba_dim_3: caml_ba_dim_3, + caml_ba_dim_2: caml_ba_dim_2, + caml_ba_dim_1: caml_ba_dim_1, + caml_ba_dim: caml_ba_dim, + caml_ba_num_dims: caml_ba_num_dims, + caml_ba_layout: caml_ba_layout, + caml_ba_kind: caml_ba_kind, + caml_ba_change_layout: caml_ba_change_layout, + caml_ba_create: caml_ba_create, + caml_ba_create_unsafe: caml_ba_create_unsafe, + caml_ba_compare: caml_ba_compare, + Ml_Bigarray_c_1_1: Ml_Bigarray_c_1_1, + Ml_Bigarray: Ml_Bigarray, + caml_ba_custom_name: caml_ba_custom_name, + caml_ba_create_buffer: caml_ba_create_buffer, + caml_ba_get_size_per_element: caml_ba_get_size_per_element, + caml_ba_get_size: caml_ba_get_size, + caml_ba_init: caml_ba_init, + caml_convert_raw_backtrace_slot: caml_convert_raw_backtrace_slot, + caml_get_current_callstack: caml_get_current_callstack, + caml_restore_raw_backtrace: caml_restore_raw_backtrace, + caml_raw_backtrace_slot: caml_raw_backtrace_slot, + caml_raw_backtrace_next_slot: caml_raw_backtrace_next_slot, + caml_raw_backtrace_length: caml_raw_backtrace_length, + caml_convert_raw_backtrace: caml_convert_raw_backtrace, + caml_record_backtrace: caml_record_backtrace, + caml_get_exception_raw_backtrace: caml_get_exception_raw_backtrace, + caml_get_exception_backtrace: caml_get_exception_backtrace, + caml_backtrace_status: caml_backtrace_status, + caml_ml_debug_info_status: caml_ml_debug_info_status, + caml_record_backtrace_flag: caml_record_backtrace_flag, + caml_floatarray_create: caml_floatarray_create, + caml_make_float_vect: caml_make_float_vect, + caml_make_vect: caml_make_vect, + caml_check_bound: caml_check_bound, + caml_array_fill: caml_array_fill, + caml_array_get: caml_array_get, + caml_array_set: caml_array_set, + caml_floatarray_blit: caml_floatarray_blit, + caml_array_blit: caml_array_blit, + caml_array_concat: caml_array_concat, + caml_array_append: caml_array_append, + caml_array_sub: caml_array_sub}; + var + cst_Assert_failure = "Assert_failure", + cst_Division_by_zero = "Division_by_zero", + cst_End_of_file = "End_of_file", + cst_Failure = "Failure", + cst_Invalid_argument = "Invalid_argument", + cst_Match_failure = "Match_failure", + cst_Not_found = "Not_found", + cst_Out_of_memory = "Out_of_memory", + cst_Stack_overflow = "Stack_overflow", + cst_Sys_blocked_io = "Sys_blocked_io", + cst_Sys_error = "Sys_error", + cst_Undefined_recursive_module = "Undefined_recursive_module"; + caml_fs_init(); + caml_register_global(0, [248, cst_Out_of_memory, -1], cst_Out_of_memory); + caml_register_global(1, [248, cst_Sys_error, -2], cst_Sys_error); + caml_register_global(2, [248, cst_Failure, -3], cst_Failure); + caml_register_global + (3, [248, cst_Invalid_argument, -4], cst_Invalid_argument); + caml_register_global(4, [248, cst_End_of_file, -5], cst_End_of_file); + caml_register_global + (5, [248, cst_Division_by_zero, -6], cst_Division_by_zero); + caml_register_global(6, [248, cst_Not_found, -7], cst_Not_found); + caml_register_global(7, [248, cst_Match_failure, -8], cst_Match_failure); + caml_register_global(8, [248, cst_Stack_overflow, -9], cst_Stack_overflow); + caml_register_global(9, [248, cst_Sys_blocked_io, -10], cst_Sys_blocked_io); + caml_register_global + (10, [248, cst_Assert_failure, -11], cst_Assert_failure); + caml_register_global + (11, + [248, cst_Undefined_recursive_module, -12], + cst_Undefined_recursive_module); + return; + } + (globalThis)); + + +(function(a){"use strict";var +dC="Fmlib_browser__Attribute",dB="Js_of_ocaml__EventSource",hf=271,hg="Base__String0",dz="Sexplib0",dA="Fmlib_browser__Task",hd=151,he=273,dy="Stdlib__Seq",dv="Base__Container_intf",dw="Js_of_ocaml__Url",dx="Base__List1",hc="Base__Blit_intf",dt=158,du=272,hb="Base__Binary_searchable",dr="Base__Map_intf",ds="Base__Int32",dq="Base__Hashable",dp="Stdlib__BytesLabels",dn=115,dm="Base__Equal",ha="Sexplib0__Sexp_conv",dl="Base__Int_intf",g9="Fmlib_std__Array",g_="Ppx_compare_lib",g$=239,g8=221,dk="Fmlib_std__Void",di="Stdlib__Printf",dj=299,g4=261,g5=241,g6=105,g7="Base__Comparable",dg="Ppx_inline_test_lib__Runtime",dh=102,g2="CamlinternalLazy",g3="Js_of_ocaml__Dom_svg",de="Stdlib__String",df=152,gZ="Sexplib0__Sexp",g0=213,g1=150,dd="Stdlib__Result",gX="Base__Linked_queue",gY=212,gV="Fmlib_std__Btree",gW=179,da=266,db="Base__Invariant_intf",dc="Base__Pretty_printer",c_="Js_of_ocaml__Import",c$=287,gU=247,c8="Base__Monad_intf",c9=167,gS="Stdlib__Random",gT="Base__Int63_emul",gQ=116,gR=161,c7="Base__Word_size",gO="Fmlib_browser__Time",gP=126,c6="Failure",gM="Stdlib__Oo",gN="Base__Sexp_with_comparable",gL=121,gJ="Base__Applicative_intf",gK="Base__Nothing",c3="CamlinternalOO",c4=214,c5=195,cZ="Stdlib__Array",c0=256,c1="Fmlib_browser__Event_flag",c2="Base__Uchar",gI="Base__Linked_queue0",cY="Fmlib_js__Event_target",cX="Base__Int64",gH=111,cV=293,cW="Flight",gF=201,gG="Base__Comparable_intf",cU="Base__Import",gE=270,cT="Fmlib_std__Option",gC="Stdlib__Lazy",gD="Inline_test_config",cQ="Stdlib__Map",cR="Stdlib__Char",cS=148,cO=193,cP="Stdlib__Ephemeron",gA=252,gB="Base__Buffer_intf",cN="Base__List0",cM=259,gz="Fmlib_browser__Subscription",cK="Stdlib__In_channel",cL="Base__Int_math",gx="Stdlib",gy="Base__Map",gw="Base__Floatable",cJ="Base__Sign",gv=125,cI=211,gu="Base__Intable",cH=219,gt="Js_of_ocaml__Geolocation",cG=240,gq="Stdlib__Bytes",gr="Base__Ordered_collection_common0",gs=103,cF=178,gn="Stdlib__Unit",go="Stdlib__Option",gp="Js_of_ocaml__IntersectionObserver",cE="Base__Stringable",gl="Base__Unit",gm="Base__Set",cB=297,cC=301,cD=202,gj="Base__Or_error",gk=170,cz="Stdlib__Complex",cA="Stdlib__StdLabels",gi="Stdlib__Float",cy=295,gf="Js_of_ocaml__WebGL",gg="Base__Ordered_collection_common",gh="Base__Bytes",ge="Assert_failure",cx="Base__Info",gc="Base__Variant",gd="Base__Char",cw="Base__Hashable_intf",ga="Base__Stack_intf",gb=224,cv=145,ct=260,cu=204,cs="Js_of_ocaml__Worker",f$=222,co=257,cp="Base__Result",cq="Std_exit",cr="Base__Sexpable",f8=123,f9=191,f_="Stdlib__MoreLabels",f7="Base__Ppx_enumerate_lib",f6="Fmlib_std__Deque",f5=281,f4="Base__Bytes_tr",f3="Stdlib__Obj",f2=249,cn="Js_of_ocaml__Json",f1=248,fY="Sexplib0__",fZ=231,f0="Base",cj="Jsoo_runtime__",ck="CamlinternalMod",cl="Base__Error",cm="Base__Array_permute",ci="Base__Formatter",fX=133,ch=138,fU=277,fV="Js_of_ocaml__Js",fW=187,cg="Base__Hex_lexer",ce="Stdlib__Bigarray",cf=104,fT=253,cd=128,ca="Invalid_argument",cb="Fmlib_browser__Dictionary",cc="Fmlib_browser__Subscriptions",fS=122,b$=113,fR=106,fQ="Base__Uniform_array",b9=278,b_="Stdlib__Scanf",fP=119,b7="Base__Ppx_compare_lib",b8="Fmlib_browser__Random",fO="Fmlib_std__Interfaces",fN="Js_of_ocaml__Dom_html",fM="Base__Float",fL="Js_of_ocaml__",b3="Stdlib__Bool",b4="Division_by_zero",b5=292,b6="Base__Hash_set_intf",fJ=258,fK=101,b2=185,fI=199,b1="Base__Uchar0",fH=274,b0=140,fG=169,bY=223,bZ=208,fF="Stdlib__Domain",fD=175,fE="Base__Char0",bW=130,bX=242,fA="Stdlib__Mutex",fB=117,fC="Base__Sys0",fz="Fmlib_js__Dom",bV=107,fy=127,bT="Stdlib__StringLabels",bU="Base__Ordering",fw=114,fx="CamlinternalFormatBasics",bR="Js_of_ocaml__XmlHttpRequest",bS=244,bQ=229,fu="Stdlib__Uchar",fv="Base__Queue",bP=184,ft=153,bO=124,fr=109,fs=283,bK="Sys_error",bL=302,bM="Fmlib_browser__Command",bN="Base__Identifiable_intf",fq="Base__Binary_searchable_intf",bJ="Ppx_hash_lib",fn="Stdlib__Lexing",fo="CamlinternalFormat",fp=171,bI="Base__Blit",bH="Stdlib__Int",bF="Js_of_ocaml__Jstable",bG="Base__Field",fl=188,fm="End_of_file",bC="Base__Either0",bD=263,bE="Base__Hash_intf",fi=286,fj="Base__Hash_set",fk=251,bA=142,bB="Base__String",fh="Base__Avltree",bz="Fmlib_browser__Vdom",ff="Stack_overflow",fg="Base__Poly0",by="Stdlib__Nativeint",bx="Base__Monad",fe="Base__Pow_overflow_bounds",bw="Base__Int0",fc=118,fd="Base__Hashtbl",bv=216,bu="Js_of_ocaml__File",fb="Fmlib_browser",bt=282,fa="Stdlib__Fun",br=159,bs=289,e_="Base__Sys",e$=149,e8=269,e9="Stdlib__Weak",e7="Fmlib_std__List",bp=238,bq=132,e6=197,bo=176,e5="Base__Maybe_bound",bm="Stdlib__ArrayLabels",bn="Base__Binary_search",e4="Stdlib__Buffer",bk=144,bl="Js_of_ocaml__ResizeObserver",bi="Fmlib_std__String",bj="Base__Set_intf",bh="Base__Ppx_hash_lib",e3=290,bf="Stdlib__Out_channel",bg="Base__T",e2="Base__Fieldslib",be="Base__",ba="Stdlib__Either",bb=183,bc=129,bd=165,a_=215,a$=146,eZ="Fmlib_browser__Browser",e0=225,e1=182,a9="Base__Indexed_container",eY="Base__Bytes0",a8="Base__Sexp",eX="Stdlib__Sys",a6="Base__Queue_intf",a7="Base__Obj_array",eW=255,eV="Ppx_sexp_conv_lib",a4="Fmlib_js__Base",a5=235,eU=228,a3=163,eT="Base__Array0",eS=220,a2=168,a1=164,aX="Js_of_ocaml__Dom",aY=218,aZ="Fmlib_browser__Url",a0=205,eR="Fmlib_browser__Handler",aV="Fmlib_std__Int",aW=139,aT="Not_found",aU="Base__Lazy",eP="Sexplib0__Sexp_conv_grammar",eQ=254,aQ="Js_of_ocaml__PerformanceObserver",aR="Base__Source_code_position",aS=246,aP="Base__Int63",aO="Base__Option",eO="Stdlib__Digest",aN=233,eN="Stdlib__Callback",aM="Js_of_ocaml__Form",eM=294,aL=262,aK=276,aI="Base__Random_repr",aJ="Base__List",eL=134,aG="Stdlib__Printexc",aH=296,eK=131,eJ=196,aF=206,eI="Fmlib_js__Event",eG="Js_of_ocaml__CSS",eH=190,aC="Js_of_ocaml__Lib_version",aD=288,aE="Base__Container",eD="Js_of_ocaml__Typed_array",eE=194,eF="Base__Hash",aA="Base__Option_array",aB=236,az=298,eC="Base__Applicative",aw="Out_of_memory",ax=268,ay="Base__Identifiable",eB=177,at="Shadow_stdlib",au="Js_of_ocaml__Intl",av="Base__Sign0",aq="Js_of_ocaml__Sys_js",ar=267,as="Base__Int_conversions",eA=173,an="Base__With_return",ao=203,ap="Base__Bool",al="Stdlib__Filename",am="Base__Info_intf",ez="Stdlib__Semaphore",ai=156,aj="Js_of_ocaml__MutationObserver",ak="Base__Popcount",ey="Stdlib__Marshal",ag=280,ah="Base__Staged",ex="Js_of_ocaml__Regexp",ew="Stdlib__Set",af="Base__Exn",ae="Js_of_ocaml__Dom_events",ad="Sys_blocked_io",et="Base__Comparator",eu=275,ev="Base__Stack",es=110,er=217,eq="Fmlib_js__Date",ac="Base__Source_code_position0",eo="Stdlib__Queue",ep=143,$="Stdlib__Parsing",aa=198,ab="Fmlib_browser__",_="Fmlib_std__Rb_array",Y=210,Z=285,em=112,en="Base__Array",X=227,el="Base__Hasher",ek="Js_of_ocaml",W="Base__Int",U="Stdlib__Condition",V="Fmlib_browser__Assert_failure",ei="Ppx_enumerate_lib",ej=209,eh="Fmlib_js__Timer",eg=291,T=174,R=230,S="Sexplib0__Sexp_conv_error",ee="Caml",ef=237,Q="Fmlib_std__",ed="Fmlib_std__Result",O="Stdlib__Format",P="Base__Fn",eb="Match_failure",ec="Fmlib_js__Web_worker",d9=147,d_=192,d$="Base__Float0",ea="Base__Either",N=166,M="Sexplib0__Sexp_grammar",d8="Base__Invariant",d7=154,L="Base__Either_intf",J="Jsoo_runtime",K=172,H="Stdlib__Effect",I="Fmlib_js__Http_request",d6=186,G="Ppx_inline_test_lib",F=245,d3="Js_of_ocaml__Firebug",d4="Base__Buffer",d5="Base__Backtrace",D="Base__Variantslib",E=226,d2="Base__Nativeint",C="Base__Sign_or_nan",d1=120,B="Stdlib__Arg",dZ="Base__Import0",d0="Base__Indexed_container_intf",A=207,w=135,x=155,y="Jsoo_runtime__Runtime_version",z=136,dX="Stdlib__List",dY="Base__Sequence",dW="Stdlib__Atomic",v=100,dV=157,u=232,dU="Sexplib0__Sexpable",t=162,dT="Stdlib__Int64",dR="Base__Comparisons",dS=300,r=180,s=284,dQ="Fmlib_js__",q=189,dP="Stdlib__Gc",p=250,m="Base__Printf",n="Stdlib__ListLabels",o="Stdlib__Hashtbl",k="Base_internalhash_types",l="Base__Hashtbl_intf",dN="Stdlib__Int32",dO="Base__Random",dM=137,i="Base__Type_equal",j=234,dK=264,dL="Stdlib__Stack",g=279,h=141,dF="Js_of_ocaml__WebSockets",dG=108,dH="Jane_street_headers",dI="Base__Ref",dJ=243,e=160,f=200,dD="Undefined_recursive_module",dE=265,c="Time_now",d=181,hh=a.jsoo_runtime,b=hh.caml_get_global_data();b.prim_count=867;var +hi=[2,f0],hj=[2,eC],hk=[2,en],hl=[0,0,[2,fh],aS,[0,0,[2,d5],eQ,0,1],2],hm=[2,cm],hn=[0,0,[2,bI],q,0,1],ho=[2,fq],hp=[0,0,[2,hb],fW,0,1],hq=[0,0,[2,gh],bZ,0,1],hr=[2,gB],hs=[0,0,[2,ap],bX,[0,0,[2,d4],fT,0,1],2],ht=[2,gd],hu=[0,0,[2,f4],a0,0,1],hv=[2,gG],hw=[0,0,[2,g7],eB,0,1],hx=[2,aE],hy=[2,ea],hz=[0,0,[2,cl],K,0,1],hA=[2,dm],hB=[0,0,[2,L],eH,0,1],hC=[0,0,[2,P],c9,0,1],hD=[2,gw],hE=[0,[0,0,[2,bG],df,[0,0,[2,e2],fk,0,1],2],[2,fM],p,[0,0,[2,d$],cD,0,1],3],hF=[0,[0,[0,0,[2,fj],f2,0,1],[2,b6],f1,0,2],[2,dq],gW,0,3],hG=[2,bE],hH=[0,0,[2,eF],bq,0,1],hI=[0,[0,0,[2,ay],e1,0,1],[2,bN],d,[0,0,[2,cU],z,0,1],2],hJ=[2,cg],hK=[0,0,[2,el],X,[0,[0,0,[2,fd],gU,0,1],[2,l],F,0,2],3],hL=[2,d0],hM=[0,0,[2,a9],c5,0,1],hN=[0,0,[2,W],er,0,1],hO=[2,am],hP=[0,0,[2,cX],cG,0,1],hQ=[2,gT],hR=[0,0,[2,ds],dJ,[0,0,[2,aP],bS,0,1],2],hS=[0,0,[2,d8],eA,0,1],hT=[2,gu],hU=[0,0,[2,dl],gY,[0,0,[2,cL],c4,0,1],2],hV=[0,0,[2,gX],g$,0,1],hW=[2,aU],hX=[2,aJ],hY=[0,[0,0,[2,gy],ef,0,1],[2,dr],bQ,0,2],hZ=[2,dx],h0=[2,bx],h1=[2,a7],h2=[0,[0,0,[2,d2],aB,0,1],[2,gK],a5,0,2],h3=[2,aA],h4=[2,gg],h5=[2,bU],h6=[2,ak],h7=[2,f7],h8=[2,dc],h9=[2,dO],h_=[0,[0,0,[2,fv],j,0,1],[2,a6],aN,0,2],h$=[2,dI],ia=[2,bj],ib=[0,0,[2,gm],fZ,0,1],ic=[0,[0,0,[2,C],e0,0,1],[2,aR],gb,0,2],id=[2,av],ie=[0,[0,0,[2,gN],E,0,1],[2,cr],d_,[0,0,[2,cJ],bv,0,1],2],ig=[0,0,[2,bB],A,0,1],ih=[2,ah],ii=[0,[0,0,[2,ev],bY,0,1],[2,ga],g8,0,2],ij=[2,cE],ik=[0,0,[2,b1],f,0,1],il=[2,c2],im=[0,[0,0,[2,bg],eS,0,1],[2,i],cH,0,2],io=[2,gl],ip=[2,D],iq=[2,c7],ir=[2,ee],is=[2,fx],it=[2,c3],iu=[0,0,[2,ck],64,0,1],iv=[2,fm],iw=[0,[0,0,[2,eZ],dj,0,1],[2,bM],az,0,2],ix=[2,dC],iy=[0,[0,[0,0,[2,cW],cC,0,1],[2,fb],dS,0,2],[2,ab],Z,[0,0,[2,V],cV,0,1],3],iz=[0,[0,0,[2,b8],eM,0,1],[2,gz],aH,[0,[0,0,[2,cc],cB,0,1],[2,dA],cy,0,2],3],iA=[2,eR],iB=[0,0,[2,c1],c$,0,1],iC=[2,dQ],iD=[0,0,[2,aZ],bs,[0,0,[2,bz],b5,0,1],2],iE=[2,eI],iF=[0,[0,0,[2,eq],s,0,1],[2,fz],fs,0,2],iG=[0,0,[2,ec],f5,0,1],iH=[2,eh],iI=[0,0,[2,I],bt,0,1],iJ=[2,f6],iK=[0,0,[2,gV],eu,0,1],iL=[0,0,[2,dk],dE,[0,0,[2,gD],es,0,1],2],iM=[2,bi],iN=[0,[0,[0,0,[2,e7],he,0,1],[2,cT],gE,[0,0,[2,_],du,0,1],2],[2,ed],ax,0,3],iO=[0,0,[2,eG],fK,0,1],iP=[2,fL],iQ=[0,[0,0,[2,dH],c0,0,1],[2,ek],fr,0,2],iR=[0,0,[2,g3],gs,[0,0,[2,dB],cf,0,1],2],iS=[2,fN],iT=[0,0,[2,ae],dh,0,1],iU=[0,0,[2,gt],fR,0,1],iV=[2,aM],iW=[0,0,[2,d3],g6,0,1],iX=[0,[0,0,[2,cn],v,0,1],[2,bF],99,0,2],iY=[2,fV],iZ=[0,0,[2,gp],bV,[0,0,[2,au],dG,0,1],2],i0=[2,aQ],i1=[0,0,[2,aj],98,0,1],i2=[2,bl],i3=[2,gf],i4=[0,0,[2,dw],93,0,1],i5=[2,y],i6=[2,g_],i7=[0,0,[2,G],aL,[0,0,[2,dg],bD,0,1],2],i8=[2,bJ],i9=[2,fY],i_=[0,0,[2,S],fc,0,1],i$=[2,ha],ja=[0,0,[2,at],gL,0,1],jb=[2,dU],jc=[2,cq],jd=[2,dp],je=[2,eO],jf=[2,H],jg=[0,0,[2,al],66,0,1],jh=[2,cP],ji=[2,O],jj=[0,0,[2,cK],74,0,1],jk=[2,o],jl=[2,n],jm=[2,f_],jn=[0,0,[2,bf],75,0,1],jo=[2,go],jp=[0,0,[2,gM],63,0,1],jq=[2,di],jr=[0,0,[2,aG],51,0,1],js=[2,gS],jt=[2,ez],ju=[0,0,[2,b_],60,0,1],jv=[0,0,[2,cA],73,0,1],jw=[2,dL],jx=[2,e9],jy=[2,c];b.toc=[0,[0,"SYMB",[0,303,[0,[0,[0,[0,[0,[0,[0,0,[2,ge],0,[0,0,hi,eW,0,1],2],[2,be],fS,[0,[0,0,hj,d9,0,1],[2,gJ],a$,[0,0,hk,e6,0,1],2],3],[2,eT],fy,[0,[0,[0,0,hm,bd,hl,3],[2,bn],b2,[0,hp,ho,d6,hn,2],4],[2,hc],fl,[0,[0,hs,hr,gA,hq,3],[2,eY],cS,[0,hu,ht,ao,0,2],4],5],6],[2,fE],cd,[0,[0,[0,[0,hw,hv,bo,0,2],[2,et],e$,0,3],[2,dR],g1,[0,[0,0,hx,br,0,1],[2,dv],dt,[0,0,hy,cO,0,1],2],4],[2,bC],hd,[0,[0,[0,hB,hA,N,hz,2],[2,af],b0,[0,hE,hD,gF,hC,4],5],[2,ci],ch,[0,[0,hH,hG,bc,hF,4],[2,cw],cF,[0,hK,hJ,ej,hI,4],5],6],7],8],[2,dZ],bO,[0,[0,[0,[0,[0,hM,hL,eE,0,2],[2,cx],fp,[0,0,hO,gR,hN,2],3],[2,bw],bW,[0,[0,hR,hQ,g5,hP,3],[2,as],Y,[0,hU,hT,cI,hS,3],4],5],[2,db],x,[0,[0,[0,0,hW,e,hV,2],[2,gI],bp,[0,0,hX,gk,0,1],3],[2,cN],eK,[0,[0,0,hZ,ai,hY,3],[2,e5],eU,[0,0,h0,cv,0,1],4],5],6],[2,c8],bk,[0,[0,[0,[0,h2,h1,aa,0,3],[2,aO],f9,[0,0,h3,f$,0,1],4],[2,gj],T,[0,[0,0,h4,bP,0,1],[2,gr],t,[0,0,h5,a2,0,1],2],5],[2,fg],f8,[0,[0,[0,0,h6,a_,0,1],[2,fe],g0,0,2],[2,b7],fX,[0,[0,0,h7,cu,0,1],[2,bh],eL,[0,0,h8,aW,0,1],2],3],6],7],9],[2,m],gv,[0,[0,[0,[0,[0,[0,h_,h9,a1,0,3],[2,aI],a3,[0,0,h$,u,0,1],4],[2,cp],dV,[0,0,[2,dY],eJ,[0,ib,ia,R,0,2],3],5],[2,a8],w,[0,[0,[0,ie,id,fD,ic,3],[2,ac],d7,[0,ii,ih,aF,ig,3],4],[2,hg],ft,[0,[0,0,ij,r,0,1],[2,e_],fG,0,2],5],6],[2,fC],gP,[0,[0,[0,[0,im,il,aY,ik,3],[2,fQ],fI,[0,0,io,bb,0,1],4],[2,gc],bA,[0,[0,0,ip,ep,0,1],[2,an],h,[0,0,iq,dM,0,1],2],5],[2,k],gH,[0,[0,[0,0,ir,em,0,1],[2,fo],48,[0,0,is,12,0,1],2],[2,g2],18,[0,[0,iu,it,62,0,2],[2,b4],1,[0,0,iv,2,0,1],3],4],6],7],[2,c6],3,[0,[0,[0,[0,[0,iy,ix,eg,iw,4],[2,cb],fi,[0,iB,iA,e3,iz,4],5],[2,gO],aD,[0,[0,iD,iC,aK,0,3],[2,a4],fU,[0,iF,iE,b9,0,3],4],6],[2,cY],g,[0,[0,[0,iI,iH,ag,iG,2],[2,Q],dK,0,3],[2,g9],hf,[0,[0,iK,iJ,fH,0,2],[2,aV],e8,0,3],4],7],[2,fO],da,[0,[0,[0,[0,iN,iM,ar,iL,4],[2,ca],4,[0,iQ,iP,80,iO,3],5],[2,aX],83,[0,[0,iT,iS,86,iR,3],[2,bu],85,[0,iW,iV,87,iU,2],4],6],[2,c_],81,[0,[0,[0,iZ,iY,82,iX,3],[2,aC],94,[0,i1,i0,97,0,2],4],[2,ex],92,[0,[0,0,i2,96,0,1],[2,aq],95,0,2],5],7],8],9],10],[2,eD],84,[0,[0,[0,[0,[0,[0,[0,i4,i3,91,0,2],[2,dF],90,0,3],[2,cs],89,[0,0,[2,bR],88,0,1],4],[2,J],79,[0,[0,0,[2,cj],77,[0,0,i5,78,0,1],2],[2,eb],5,[0,0,[2,aT],6,0,1],3],5],[2,aw],7,[0,[0,[0,[0,0,i6,fJ,0,1],[2,ei],cM,[0,0,i8,ct,i7,3],4],[2,eV],co,[0,0,[2,dz],d1,[0,0,i9,b$,0,1],2],5],[2,gZ],fw,[0,[0,[0,0,i$,fB,i_,2],[2,eP],gQ,0,3],[2,M],dn,[0,[0,0,jb,fP,ja,2],[2,ff],8,[0,0,jc,bL,0,1],3],4],6],7],[2,gx],13,[0,[0,[0,[0,0,[2,B],50,0,1],[2,cZ],32,[0,0,[2,bm],68,0,1],2],[2,dW],17,[0,0,[2,ce],55,0,1],3],[2,b3],23,[0,[0,[0,0,[2,e4],43,0,1],[2,gq],28,[0,[0,0,jd,70,0,1],[2,eN],61,0,2],3],[2,cR],24,[0,[0,0,[2,cz],67,0,1],[2,U],45,[0,[0,0,je,54,0,1],[2,fF],47,[0,0,jf,76,0,1],2],3],4],5],8],[2,ba],14,[0,[0,[0,[0,[0,[0,0,jh,65,jg,2],[2,gi],33,[0,0,ji,59,0,1],3],[2,fa],52,[0,0,[2,dP],53,[0,0,jk,57,jj,2],3],4],[2,bH],27,[0,0,[2,dN],34,[0,0,[2,dT],35,0,1],2],5],[2,gC],19,[0,[0,[0,0,[2,fn],37,0,1],[2,dX],26,[0,[0,0,jl,69,0,1],[2,cQ],40,0,2],3],[2,ey],31,[0,[0,[0,0,jm,72,0,1],[2,fA],44,0,2],[2,by],36,0,3],4],6],[2,f3],16,[0,[0,[0,[0,[0,jp,jo,21,jn,2],[2,$],38,[0,jr,jq,49,0,2],3],[2,eo],42,[0,[0,0,js,56,0,1],[2,dd],22,[0,ju,jt,46,0,2],3],4],[2,dy],20,[0,[0,0,[2,ew],39,[0,0,jw,41,jv,2],3],[2,de],29,[0,0,[2,bT],71,0,1],4],5],[2,eX],15,[0,[0,0,[2,fu],25,[0,0,[2,gn],30,[0,0,jx,58,0,1],2],3],[2,ad],9,[0,0,[2,bK],10,[0,[0,0,jy,g4,0,1],[2,dD],11,0,2],3],4],6],7],9],11]]],[0,[0,"SYJS",[0,[0,dD,11],[0,c,g4],[0,bK,10],[0,ad,9],[0,e9,58],[0,gn,30],[0,fu,25],[0,eX,15],[0,bT,71],[0,de,29],[0,cA,73],[0,dL,41],[0,ew,39],[0,dy,20],[0,ez,46],[0,b_,60],[0,dd,22],[0,gS,56],[0,eo,42],[0,di,49],[0,aG,51],[0,$,38],[0,bf,75],[0,go,21],[0,gM,63],[0,f3,16],[0,by,36],[0,fA,44],[0,f_,72],[0,ey,31],[0,cQ,40],[0,n,69],[0,dX,26],[0,fn,37],[0,gC,19],[0,dT,35],[0,dN,34],[0,bH,27],[0,cK,74],[0,o,57],[0,dP,53],[0,fa,52],[0,O,59],[0,gi,33],[0,al,66],[0,cP,65],[0,ba,14],[0,H,76],[0,fF,47],[0,eO,54],[0,U,45],[0,cz,67],[0,cR,24],[0,eN,61],[0,dp,70],[0,gq,28],[0,e4,43],[0,b3,23],[0,ce,55],[0,dW,17],[0,bm,68],[0,cZ,32],[0,B,50],[0,gx,13],[0,cq,bL],[0,ff,8],[0,at,gL],[0,dU,fP],[0,M,dn],[0,eP,gQ],[0,S,fc],[0,ha,fB],[0,gZ,fw],[0,fY,b$],[0,dz,d1],[0,eV,co],[0,dg,bD],[0,G,aL],[0,bJ,ct],[0,ei,cM],[0,g_,fJ],[0,aw,7],[0,aT,6],[0,eb,5],[0,y,78],[0,cj,77],[0,J,79],[0,bR,88],[0,cs,89],[0,dF,90],[0,gf,91],[0,dw,93],[0,eD,84],[0,aq,95],[0,bl,96],[0,ex,92],[0,aQ,97],[0,aj,98],[0,aC,94],[0,bF,99],[0,cn,v],[0,fV,82],[0,au,dG],[0,gp,bV],[0,c_,81],[0,gt,fR],[0,aM,87],[0,d3,g6],[0,bu,85],[0,dB,cf],[0,g3,gs],[0,fN,86],[0,ae,dh],[0,aX,83],[0,eG,fK],[0,fL,80],[0,ek,fr],[0,dH,c0],[0,ca,4],[0,gD,es],[0,dk,dE],[0,bi,ar],[0,ed,ax],[0,_,du],[0,cT,gE],[0,e7,he],[0,fO,da],[0,aV,e8],[0,f6,fH],[0,gV,eu],[0,g9,hf],[0,Q,dK],[0,ec,f5],[0,eh,ag],[0,I,bt],[0,cY,g],[0,eI,b9],[0,fz,fs],[0,eq,s],[0,a4,fU],[0,dQ,aK],[0,bz,b5],[0,aZ,bs],[0,gO,aD],[0,dA,cy],[0,cc,cB],[0,gz,aH],[0,b8,eM],[0,eR,e3],[0,c1,c$],[0,cb,fi],[0,bM,az],[0,eZ,dj],[0,dC,eg],[0,V,cV],[0,ab,Z],[0,fb,dS],[0,cW,cC],[0,c6,3],[0,fm,2],[0,b4,1],[0,c3,62],[0,ck,64],[0,g2,18],[0,fx,12],[0,fo,48],[0,ee,em],[0,k,gH],[0,c7,dM],[0,an,h],[0,D,ep],[0,gc,bA],[0,gl,bb],[0,fQ,fI],[0,b1,f],[0,c2,aY],[0,i,cH],[0,bg,eS],[0,fC,gP],[0,e_,fG],[0,cE,r],[0,hg,ft],[0,bB,A],[0,ah,aF],[0,ga,g8],[0,ev,bY],[0,ac,d7],[0,aR,gb],[0,C,e0],[0,av,fD],[0,cJ,bv],[0,cr,d_],[0,gN,E],[0,a8,w],[0,bj,R],[0,gm,fZ],[0,dY,eJ],[0,cp,dV],[0,dI,u],[0,aI,a3],[0,dO,a1],[0,a6,aN],[0,fv,j],[0,m,gv],[0,dc,aW],[0,bh,eL],[0,f7,cu],[0,b7,fX],[0,fe,g0],[0,ak,a_],[0,fg,f8],[0,bU,a2],[0,gr,t],[0,gg,bP],[0,gj,T],[0,aA,f$],[0,aO,f9],[0,a7,aa],[0,gK,a5],[0,d2,aB],[0,c8,bk],[0,bx,cv],[0,e5,eU],[0,dr,bQ],[0,gy,ef],[0,dx,ai],[0,cN,eK],[0,aJ,gk],[0,gI,bp],[0,gX,g$],[0,aU,e],[0,db,x],[0,d8,eA],[0,gu,cI],[0,cL,c4],[0,dl,gY],[0,as,Y],[0,cX,cG],[0,gT,g5],[0,aP,bS],[0,ds,dJ],[0,bw,bW],[0,W,er],[0,am,gR],[0,cx,fp],[0,d0,eE],[0,a9,c5],[0,dZ,bO],[0,cU,z],[0,bN,d],[0,ay,e1],[0,cg,ej],[0,l,F],[0,fd,gU],[0,el,X],[0,cw,cF],[0,dq,gW],[0,b6,f1],[0,fj,f2],[0,bE,bc],[0,eF,bq],[0,ci,ch],[0,P,c9],[0,gw,gF],[0,d$,cD],[0,fM,p],[0,e2,fk],[0,bG,df],[0,af,b0],[0,cl,K],[0,dm,N],[0,L,eH],[0,bC,hd],[0,ea,cO],[0,dv,dt],[0,aE,br],[0,dR,g1],[0,et,e$],[0,gG,bo],[0,g7,eB],[0,fE,cd],[0,gd,ao],[0,f4,a0],[0,eY,cS],[0,gh,bZ],[0,gB,gA],[0,d4,fT],[0,ap,bX],[0,hc,fl],[0,bI,q],[0,fq,d6],[0,hb,fW],[0,bn,b2],[0,d5,eQ],[0,fh,aS],[0,cm,bd],[0,eT,fy],[0,en,e6],[0,gJ,a$],[0,eC,d9],[0,be,fS],[0,f0,eW],[0,ge,0]]],[0,[0,"CRCS",0],[0,[0,"PRIM","%caml_format_int_special\0%direct_int_div\0%direct_int_mod\0%direct_int_mul\0%identity\0%int_add\0%int_and\0%int_asr\0%int_div\0%int_lsl\0%int_lsr\0%int_mod\0%int_mul\0%int_neg\0%int_or\0%int_sub\0%int_xor\0Base_am_testing\0Base_caml_exn_is_most_recent_exn\0Base_clear_caml_backtrace_pos\0Base_hash_double\0Base_hash_string\0Base_int_math_int32_clz\0Base_int_math_int32_ctz\0Base_int_math_int64_clz\0Base_int_math_int64_ctz\0Base_int_math_int64_pow_stub\0Base_int_math_int_clz\0Base_int_math_int_ctz\0Base_int_math_int_popcount\0Base_int_math_int_pow_stub\0Base_int_math_nativeint_clz\0Base_int_math_nativeint_ctz\0Base_internalhash_fold_float\0Base_internalhash_fold_int\0Base_internalhash_fold_int64\0Base_internalhash_fold_string\0Base_internalhash_get_hash_value\0BigStringReader\0MlBytes\0MlFakeDevice\0MlFakeFd\0MlFakeFd_out\0MlFakeFile\0MlFile\0MlInt64\0MlMutex\0MlNat\0MlNodeDevice\0MlNodeFd\0MlObjectTable\0MlStringReader\0Ml_Bigarray\0Ml_Bigarray_c_1_1\0UInt8ArrayReader\0add_nat\0bigstring_of_array_buffer\0bigstring_of_typed_array\0bigstring_to_array_buffer\0bigstring_to_typed_array\0blit_nat\0caml_MD5Final\0caml_MD5Init\0caml_MD5Transform\0caml_MD5Update\0caml_abs_float\0caml_acos_float\0caml_acosh_float\0caml_add_float\0caml_alloc_dummy\0caml_alloc_dummy_float\0caml_alloc_dummy_infix\0caml_alloc_stack\0caml_argv\0caml_array_append\0caml_array_blit\0caml_array_bound_error\0caml_array_concat\0caml_array_fill\0caml_array_get\0caml_array_get_addr\0caml_array_get_float\0caml_array_of_bytes\0caml_array_of_string\0caml_array_set\0caml_array_set_addr\0caml_array_set_float\0caml_array_sub\0caml_array_unsafe_get\0caml_array_unsafe_get_float\0caml_array_unsafe_set\0caml_array_unsafe_set_float\0caml_asin_float\0caml_asinh_float\0caml_atan2_float\0caml_atan_float\0caml_atanh_float\0caml_atomic_cas\0caml_atomic_exchange\0caml_atomic_fetch_add\0caml_atomic_load\0caml_ba_blit\0caml_ba_change_layout\0caml_ba_compare\0caml_ba_create\0caml_ba_create_buffer\0caml_ba_create_from\0caml_ba_create_unsafe\0caml_ba_custom_name\0caml_ba_deserialize\0caml_ba_dim\0caml_ba_dim_1\0caml_ba_dim_2\0caml_ba_dim_3\0caml_ba_fill\0caml_ba_from_typed_array\0caml_ba_get_1\0caml_ba_get_2\0caml_ba_get_3\0caml_ba_get_generic\0caml_ba_get_size\0caml_ba_get_size_per_element\0caml_ba_hash\0caml_ba_init\0caml_ba_kind\0caml_ba_kind_of_typed_array\0caml_ba_layout\0caml_ba_map_file\0caml_ba_map_file_bytecode\0caml_ba_num_dims\0caml_ba_reshape\0caml_ba_serialize\0caml_ba_set_1\0caml_ba_set_2\0caml_ba_set_3\0caml_ba_set_generic\0caml_ba_slice\0caml_ba_sub\0caml_ba_to_typed_array\0caml_ba_uint8_get16\0caml_ba_uint8_get32\0caml_ba_uint8_get64\0caml_ba_uint8_set16\0caml_ba_uint8_set32\0caml_ba_uint8_set64\0caml_backtrace_status\0caml_bigstring_blit_ba_to_ba\0caml_bigstring_blit_ba_to_bytes\0caml_bigstring_blit_bytes_to_ba\0caml_bigstring_blit_string_to_ba\0caml_bigstring_memcmp\0caml_blit_bytes\0caml_blit_string\0caml_bswap16\0caml_build_symbols\0caml_bytes_bound_error\0caml_bytes_compare\0caml_bytes_equal\0caml_bytes_get\0caml_bytes_get16\0caml_bytes_get32\0caml_bytes_get64\0caml_bytes_greaterequal\0caml_bytes_greaterthan\0caml_bytes_lessequal\0caml_bytes_lessthan\0caml_bytes_notequal\0caml_bytes_of_array\0caml_bytes_of_jsbytes\0caml_bytes_of_string\0caml_bytes_of_utf16_jsstring\0caml_bytes_set\0caml_bytes_set16\0caml_bytes_set32\0caml_bytes_set64\0caml_bytes_unsafe_get\0caml_bytes_unsafe_set\0caml_call_gen\0caml_callback\0caml_cbrt_float\0caml_ceil_float\0caml_channel_descriptor\0caml_check_bound\0caml_classify_float\0caml_compare\0caml_compare_val\0caml_compare_val_get_custom\0caml_compare_val_number_custom\0caml_compare_val_tag\0caml_continuation_use_and_update_handler_noexc\0caml_continuation_use_noexc\0caml_convert_bytes_to_array\0caml_convert_raw_backtrace\0caml_convert_raw_backtrace_slot\0caml_convert_string_to_bytes\0caml_copysign_float\0caml_cos_float\0caml_cosh_float\0caml_create_bytes\0caml_create_file\0caml_create_string\0caml_current_dir\0caml_custom_event_index\0caml_custom_ops\0caml_div\0caml_div_float\0caml_domain_dls\0caml_domain_dls_get\0caml_domain_dls_set\0caml_domain_id\0caml_domain_spawn\0caml_ensure_stack_capacity\0caml_ephe_blit_data\0caml_ephe_blit_key\0caml_ephe_check_data\0caml_ephe_check_key\0caml_ephe_create\0caml_ephe_data_offset\0caml_ephe_get_data\0caml_ephe_get_data_copy\0caml_ephe_get_key\0caml_ephe_get_key_copy\0caml_ephe_key_offset\0caml_ephe_set_data\0caml_ephe_set_key\0caml_ephe_unset_data\0caml_ephe_unset_key\0caml_eq_float\0caml_equal\0caml_erf_float\0caml_erfc_float\0caml_eventlog_pause\0caml_eventlog_resume\0caml_executable_name\0caml_exn_with_js_backtrace\0caml_exp2_float\0caml_exp_float\0caml_expm1_float\0caml_failwith\0caml_fatal_uncaught_exception\0caml_fill_bytes\0caml_fill_string\0caml_final_register\0caml_final_register_called_without_value\0caml_final_release\0caml_finish_formatting\0caml_float_compare\0caml_float_of_bytes\0caml_float_of_int\0caml_float_of_string\0caml_floatarray_blit\0caml_floatarray_create\0caml_floatarray_get\0caml_floatarray_set\0caml_floatarray_unsafe_get\0caml_floatarray_unsafe_set\0caml_floor_float\0caml_fma_float\0caml_fmod_float\0caml_format_exception\0caml_format_float\0caml_format_int\0caml_fresh_oo_id\0caml_frexp_float\0caml_fs_init\0caml_gc_compaction\0caml_gc_counters\0caml_gc_full_major\0caml_gc_get\0caml_gc_huge_fallback_count\0caml_gc_major\0caml_gc_major_slice\0caml_gc_minor\0caml_gc_minor_words\0caml_gc_quick_stat\0caml_gc_set\0caml_gc_stat\0caml_ge_float\0caml_get_continuation_callstack\0caml_get_current_callstack\0caml_get_exception_backtrace\0caml_get_exception_raw_backtrace\0caml_get_global_data\0caml_get_major_bucket\0caml_get_major_credit\0caml_get_minor_free\0caml_get_public_method\0caml_get_root\0caml_global_data\0caml_gr_arc_aux\0caml_gr_blit_image\0caml_gr_clear_graph\0caml_gr_close_graph\0caml_gr_close_subwindow\0caml_gr_create_image\0caml_gr_current_x\0caml_gr_current_y\0caml_gr_display_mode\0caml_gr_doc_of_state\0caml_gr_draw_arc\0caml_gr_draw_char\0caml_gr_draw_image\0caml_gr_draw_rect\0caml_gr_draw_str\0caml_gr_draw_string\0caml_gr_dump_image\0caml_gr_fill_arc\0caml_gr_fill_poly\0caml_gr_fill_rect\0caml_gr_lineto\0caml_gr_make_image\0caml_gr_moveto\0caml_gr_open_graph\0caml_gr_open_subwindow\0caml_gr_plot\0caml_gr_point_color\0caml_gr_remember_mode\0caml_gr_resize_window\0caml_gr_set_color\0caml_gr_set_font\0caml_gr_set_line_width\0caml_gr_set_text_size\0caml_gr_set_window_title\0caml_gr_sigio_handler\0caml_gr_sigio_signal\0caml_gr_size_x\0caml_gr_size_y\0caml_gr_state\0caml_gr_state_create\0caml_gr_state_get\0caml_gr_state_init\0caml_gr_state_set\0caml_gr_synchronize\0caml_gr_text_size\0caml_gr_wait_event\0caml_gr_window_id\0caml_greaterequal\0caml_greaterthan\0caml_gt_float\0caml_hash\0caml_hash_mix_bigstring\0caml_hash_mix_bytes\0caml_hash_mix_bytes_arr\0caml_hash_mix_final\0caml_hash_mix_float\0caml_hash_mix_int\0caml_hash_mix_int64\0caml_hash_mix_jsbytes\0caml_hash_mix_string\0caml_hash_nat\0caml_hexstring_of_float\0caml_hypot_float\0caml_input_value\0caml_input_value_from_bytes\0caml_input_value_from_reader\0caml_input_value_from_string\0caml_input_value_to_outside_heap\0caml_install_signal_handler\0caml_int32_add\0caml_int32_and\0caml_int32_bits_of_float\0caml_int32_bswap\0caml_int32_compare\0caml_int32_div\0caml_int32_float_of_bits\0caml_int32_format\0caml_int32_mod\0caml_int32_mul\0caml_int32_neg\0caml_int32_of_float\0caml_int32_of_int\0caml_int32_of_string\0caml_int32_or\0caml_int32_shift_left\0caml_int32_shift_right\0caml_int32_shift_right_unsigned\0caml_int32_sub\0caml_int32_to_float\0caml_int32_to_int\0caml_int32_unmarshal\0caml_int32_xor\0caml_int64_add\0caml_int64_and\0caml_int64_bits_of_float\0caml_int64_bswap\0caml_int64_compare\0caml_int64_create_lo_hi\0caml_int64_create_lo_mi_hi\0caml_int64_div\0caml_int64_float_of_bits\0caml_int64_format\0caml_int64_hash\0caml_int64_hi32\0caml_int64_is_negative\0caml_int64_is_zero\0caml_int64_lo32\0caml_int64_marshal\0caml_int64_mod\0caml_int64_mul\0caml_int64_neg\0caml_int64_of_bytes\0caml_int64_of_float\0caml_int64_of_int\0caml_int64_of_int32\0caml_int64_of_nativeint\0caml_int64_of_string\0caml_int64_offset\0caml_int64_or\0caml_int64_shift_left\0caml_int64_shift_right\0caml_int64_shift_right_unsigned\0caml_int64_sub\0caml_int64_to_bytes\0caml_int64_to_float\0caml_int64_to_int\0caml_int64_to_int32\0caml_int64_to_nativeint\0caml_int64_ult\0caml_int64_unmarshal\0caml_int64_xor\0caml_int_compare\0caml_int_of_float\0caml_int_of_string\0caml_invalid_argument\0caml_is_continuation_tag\0caml_is_js\0caml_is_ml_bytes\0caml_is_ml_string\0caml_is_printable\0caml_is_special_exception\0caml_js_call\0caml_js_delete\0caml_js_equals\0caml_js_error_of_exception\0caml_js_error_option_of_exception\0caml_js_eval_string\0caml_js_expr\0caml_js_from_array\0caml_js_from_bool\0caml_js_from_float\0caml_js_from_string\0caml_js_fun_call\0caml_js_function_arity\0caml_js_get\0caml_js_get_console\0caml_js_html_entities\0caml_js_html_escape\0caml_js_instanceof\0caml_js_meth_call\0caml_js_new\0caml_js_object\0caml_js_on_ie\0caml_js_pure_expr\0caml_js_set\0caml_js_to_array\0caml_js_to_bool\0caml_js_to_byte_string\0caml_js_to_float\0caml_js_to_string\0caml_js_typeof\0caml_js_var\0caml_js_wrap_callback\0caml_js_wrap_callback_arguments\0caml_js_wrap_callback_strict\0caml_js_wrap_callback_unsafe\0caml_js_wrap_meth_callback\0caml_js_wrap_meth_callback_arguments\0caml_js_wrap_meth_callback_strict\0caml_js_wrap_meth_callback_unsafe\0caml_jsbytes_of_string\0caml_jsoo_flags_effects\0caml_jsoo_flags_use_js_string\0caml_jsstring_of_string\0caml_lazy_make_forward\0caml_lazy_read_result\0caml_lazy_reset_to_lazy\0caml_lazy_update_to_forcing\0caml_lazy_update_to_forward\0caml_ldexp_float\0caml_le_float\0caml_lessequal\0caml_lessthan\0caml_lex_array\0caml_lex_engine\0caml_list_mount_point\0caml_list_of_js_array\0caml_list_to_js_array\0caml_log10_float\0caml_log1p_float\0caml_log2_float\0caml_log_float\0caml_lt_float\0caml_lxm_next\0caml_make_array\0caml_make_float_vect\0caml_make_path\0caml_make_vect\0caml_marshal_constants\0caml_marshal_data_size\0caml_marshal_header_size\0caml_maybe_attach_backtrace\0caml_maybe_print_stats\0caml_md5_bytes\0caml_md5_chan\0caml_md5_string\0caml_memprof_set\0caml_memprof_start\0caml_memprof_stop\0caml_ml_bytes_content\0caml_ml_bytes_length\0caml_ml_channel_size\0caml_ml_channel_size_64\0caml_ml_channels\0caml_ml_close_channel\0caml_ml_condition_broadcast\0caml_ml_condition_new\0caml_ml_condition_signal\0caml_ml_condition_wait\0caml_ml_debug_info_status\0caml_ml_domain_cpu_relax\0caml_ml_domain_id\0caml_ml_domain_set_name\0caml_ml_domain_unique_token\0caml_ml_enable_runtime_warnings\0caml_ml_flush\0caml_ml_input\0caml_ml_input_block\0caml_ml_input_char\0caml_ml_input_int\0caml_ml_input_scan_line\0caml_ml_is_buffered\0caml_ml_mutex_lock\0caml_ml_mutex_new\0caml_ml_mutex_try_lock\0caml_ml_mutex_unlock\0caml_ml_open_descriptor_in\0caml_ml_open_descriptor_out\0caml_ml_out_channels_list\0caml_ml_output\0caml_ml_output_bytes\0caml_ml_output_char\0caml_ml_output_int\0caml_ml_pos_in\0caml_ml_pos_in_64\0caml_ml_pos_out\0caml_ml_pos_out_64\0caml_ml_runtime_warnings_enabled\0caml_ml_seek_in\0caml_ml_seek_in_64\0caml_ml_seek_out\0caml_ml_seek_out_64\0caml_ml_set_binary_mode\0caml_ml_set_buffered\0caml_ml_set_channel_name\0caml_ml_set_channel_output\0caml_ml_set_channel_refill\0caml_ml_string_length\0caml_mod\0caml_modf_float\0caml_mount_autoload\0caml_mul\0caml_mul_float\0caml_named_value\0caml_named_values\0caml_nativeint_add\0caml_nativeint_and\0caml_nativeint_bswap\0caml_nativeint_compare\0caml_nativeint_div\0caml_nativeint_format\0caml_nativeint_mod\0caml_nativeint_mul\0caml_nativeint_neg\0caml_nativeint_of_float\0caml_nativeint_of_int\0caml_nativeint_of_int32\0caml_nativeint_of_string\0caml_nativeint_or\0caml_nativeint_shift_left\0caml_nativeint_shift_right\0caml_nativeint_shift_right_unsigned\0caml_nativeint_sub\0caml_nativeint_to_float\0caml_nativeint_to_int\0caml_nativeint_to_int32\0caml_nativeint_unmarshal\0caml_nativeint_xor\0caml_neg_float\0caml_neq_float\0caml_new_lex_engine\0caml_new_string\0caml_nextafter_float\0caml_notequal\0caml_obj_add_offset\0caml_obj_block\0caml_obj_compare_and_swap\0caml_obj_dup\0caml_obj_is_block\0caml_obj_is_shared\0caml_obj_make_forward\0caml_obj_raw_field\0caml_obj_reachable_words\0caml_obj_set_raw_field\0caml_obj_set_tag\0caml_obj_tag\0caml_obj_truncate\0caml_obj_update_tag\0caml_obj_with_tag\0caml_ojs_new_arr\0caml_oo_last_id\0caml_output_val\0caml_output_value\0caml_output_value_to_buffer\0caml_output_value_to_bytes\0caml_output_value_to_string\0caml_parse_digit\0caml_parse_engine\0caml_parse_format\0caml_parse_sign_and_base\0caml_parser_trace\0caml_pos_in\0caml_pos_out\0caml_power_float\0caml_pure_js_expr\0caml_raise_constant\0caml_raise_end_of_file\0caml_raise_no_such_file\0caml_raise_not_a_dir\0caml_raise_not_found\0caml_raise_sys_error\0caml_raise_with_arg\0caml_raise_with_args\0caml_raise_with_string\0caml_raise_zero_divide\0caml_raw_backtrace_length\0caml_raw_backtrace_next_slot\0caml_raw_backtrace_slot\0caml_read_file_content\0caml_recommended_domain_count\0caml_record_backtrace\0caml_record_backtrace_flag\0caml_refill\0caml_register_channel_for_spacetime\0caml_register_global\0caml_register_named_value\0caml_restore_raw_backtrace\0caml_root\0caml_round_float\0caml_runtime_events_create_cursor\0caml_runtime_events_free_cursor\0caml_runtime_events_pause\0caml_runtime_events_read_poll\0caml_runtime_events_resume\0caml_runtime_events_start\0caml_runtime_events_user_register\0caml_runtime_events_user_resolve\0caml_runtime_events_user_write\0caml_runtime_parameters\0caml_runtime_variant\0caml_runtime_warnings\0caml_seek_in\0caml_seek_out\0caml_set_oo_id\0caml_set_parser_trace\0caml_set_static_env\0caml_signbit_float\0caml_sin_float\0caml_sinh_float\0caml_spacetime_enabled\0caml_spacetime_only_works_for_native_code\0caml_sqrt_float\0caml_str_initialize\0caml_str_repeat\0caml_string_bound_error\0caml_string_compare\0caml_string_equal\0caml_string_get\0caml_string_get16\0caml_string_get32\0caml_string_get64\0caml_string_greaterequal\0caml_string_greaterthan\0caml_string_hash\0caml_string_lessequal\0caml_string_lessthan\0caml_string_notequal\0caml_string_of_array\0caml_string_of_bytes\0caml_string_of_jsbytes\0caml_string_of_jsstring\0caml_string_set\0caml_string_set16\0caml_string_set32\0caml_string_set64\0caml_string_unsafe_get\0caml_string_unsafe_set\0caml_sub_float\0caml_subarray_to_jsbytes\0caml_sys_argv\0caml_sys_chdir\0caml_sys_close\0caml_sys_const_backend_type\0caml_sys_const_big_endian\0caml_sys_const_int_size\0caml_sys_const_max_wosize\0caml_sys_const_naked_pointers_checked\0caml_sys_const_ostype_cygwin\0caml_sys_const_ostype_unix\0caml_sys_const_ostype_win32\0caml_sys_const_word_size\0caml_sys_executable_name\0caml_sys_exit\0caml_sys_fds\0caml_sys_file_exists\0caml_sys_get_argv\0caml_sys_get_config\0caml_sys_getcwd\0caml_sys_getenv\0caml_sys_is_directory\0caml_sys_is_regular_file\0caml_sys_isatty\0caml_sys_mkdir\0caml_sys_modify_argv\0caml_sys_open\0caml_sys_open_for_node\0caml_sys_random_seed\0caml_sys_read_directory\0caml_sys_remove\0caml_sys_rename\0caml_sys_rmdir\0caml_sys_system_command\0caml_sys_time\0caml_sys_time_include_children\0caml_sys_unsafe_getenv\0caml_tan_float\0caml_tanh_float\0caml_to_js_string\0caml_trailing_slash\0caml_trampoline\0caml_trampoline_return\0caml_trunc_float\0caml_uint8_array_of_bytes\0caml_uint8_array_of_string\0caml_unix_cleanup\0caml_unix_closedir\0caml_unix_filedescr_of_fd\0caml_unix_findclose\0caml_unix_findfirst\0caml_unix_findnext\0caml_unix_getpwuid\0caml_unix_gettimeofday\0caml_unix_getuid\0caml_unix_gmtime\0caml_unix_has_symlink\0caml_unix_inet_addr_of_string\0caml_unix_isatty\0caml_unix_localtime\0caml_unix_lstat\0caml_unix_lstat_64\0caml_unix_mkdir\0caml_unix_mktime\0caml_unix_opendir\0caml_unix_readdir\0caml_unix_readlink\0caml_unix_rewinddir\0caml_unix_rmdir\0caml_unix_startup\0caml_unix_stat\0caml_unix_stat_64\0caml_unix_symlink\0caml_unix_time\0caml_unix_unlink\0caml_unmount\0caml_update_dummy\0caml_utf16_of_utf8\0caml_utf8_of_utf16\0caml_weak_blit\0caml_weak_check\0caml_weak_create\0caml_weak_get\0caml_weak_get_copy\0caml_weak_set\0caml_wrap_exception\0caml_xmlhttprequest_create\0compare_digits_nat\0compare_nat\0compare_nat_real\0complement_nat\0create_nat\0decr_nat\0deserialize_nat\0div_digit_nat\0div_helper\0div_nat\0fs_node_supported\0incr_nat\0initialize_nat\0is_digit_int\0is_digit_odd\0is_digit_zero\0jsoo_create_file\0jsoo_create_file_extern\0jsoo_effect_not_supported\0jsoo_floor_log2\0jsoo_is_ascii\0jsoo_mount_point\0jsoo_sys_getenv\0land_digit_nat\0lor_digit_nat\0lxor_digit_nat\0make_unix_err_args\0mult_digit_nat\0mult_nat\0nat_of_array\0nth_digit_nat\0nth_digit_nat_native\0num_digits_nat\0num_leading_zero_bits_in_digit\0os_type\0path_is_absolute\0re_match\0re_partial_match\0re_replacement_text\0re_search_backward\0re_search_forward\0re_string_match\0resolve_fs_device\0serialize_nat\0set_digit_nat\0set_digit_nat_native\0set_to_zero_nat\0shift_left_nat\0shift_right_nat\0square_nat\0sub_nat\0time_now_nanoseconds_since_unix_epoch_or_zero\0unix_closedir\0unix_getpwuid\0unix_gettimeofday\0unix_getuid\0unix_gmtime\0unix_has_symlink\0unix_inet_addr_of_string\0unix_isatty\0unix_localtime\0unix_lstat\0unix_lstat_64\0unix_mkdir\0unix_mktime\0unix_opendir\0unix_readdir\0unix_readlink\0unix_rewinddir\0unix_rmdir\0unix_stat\0unix_stat_64\0unix_symlink\0unix_time\0unix_unlink\0win_cleanup\0win_filedescr_of_channel\0win_findclose\0win_findfirst\0win_findnext\0win_handle_fd\0win_startup\0zstd_decompress\0"],0]]]];return}(globalThis)); + +//# 1 "../../../.js/default/stdlib/stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function erase_rel(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, erase_rel(rest)]; + case 1: + var rest$0 = param[1]; return [1, erase_rel(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, erase_rel(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, erase_rel(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, erase_rel(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, erase_rel(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, erase_rel(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, erase_rel(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; + return [8, ty, erase_rel(rest$7)]; + case 9: + var rest$8 = param[3], ty1 = param[1]; + return [9, ty1, ty1, erase_rel(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, erase_rel(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, erase_rel(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, erase_rel(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, erase_rel(rest$12)]; + default: var rest$13 = param[1]; return [14, erase_rel(rest$13)]; + } + } + function concat_fmtty(fmtty1, fmtty2){ + if(typeof fmtty1 === "number") return fmtty2; + switch(fmtty1[0]){ + case 0: + var rest = fmtty1[1]; return [0, concat_fmtty(rest, fmtty2)]; + case 1: + var rest$0 = fmtty1[1]; return [1, concat_fmtty(rest$0, fmtty2)]; + case 2: + var rest$1 = fmtty1[1]; return [2, concat_fmtty(rest$1, fmtty2)]; + case 3: + var rest$2 = fmtty1[1]; return [3, concat_fmtty(rest$2, fmtty2)]; + case 4: + var rest$3 = fmtty1[1]; return [4, concat_fmtty(rest$3, fmtty2)]; + case 5: + var rest$4 = fmtty1[1]; return [5, concat_fmtty(rest$4, fmtty2)]; + case 6: + var rest$5 = fmtty1[1]; return [6, concat_fmtty(rest$5, fmtty2)]; + case 7: + var rest$6 = fmtty1[1]; return [7, concat_fmtty(rest$6, fmtty2)]; + case 8: + var rest$7 = fmtty1[2], ty = fmtty1[1]; + return [8, ty, concat_fmtty(rest$7, fmtty2)]; + case 9: + var rest$8 = fmtty1[3], ty2 = fmtty1[2], ty1 = fmtty1[1]; + return [9, ty1, ty2, concat_fmtty(rest$8, fmtty2)]; + case 10: + var rest$9 = fmtty1[1]; return [10, concat_fmtty(rest$9, fmtty2)]; + case 11: + var rest$10 = fmtty1[1]; return [11, concat_fmtty(rest$10, fmtty2)]; + case 12: + var rest$11 = fmtty1[1]; return [12, concat_fmtty(rest$11, fmtty2)]; + case 13: + var rest$12 = fmtty1[1]; return [13, concat_fmtty(rest$12, fmtty2)]; + default: + var rest$13 = fmtty1[1]; return [14, concat_fmtty(rest$13, fmtty2)]; + } + } + function concat_fmt(fmt1, fmt2){ + if(typeof fmt1 === "number") return fmt2; + switch(fmt1[0]){ + case 0: + var rest = fmt1[1]; return [0, concat_fmt(rest, fmt2)]; + case 1: + var rest$0 = fmt1[1]; return [1, concat_fmt(rest$0, fmt2)]; + case 2: + var rest$1 = fmt1[2], pad = fmt1[1]; + return [2, pad, concat_fmt(rest$1, fmt2)]; + case 3: + var rest$2 = fmt1[2], pad$0 = fmt1[1]; + return [3, pad$0, concat_fmt(rest$2, fmt2)]; + case 4: + var rest$3 = fmt1[4], prec = fmt1[3], pad$1 = fmt1[2], iconv = fmt1[1]; + return [4, iconv, pad$1, prec, concat_fmt(rest$3, fmt2)]; + case 5: + var + rest$4 = fmt1[4], + prec$0 = fmt1[3], + pad$2 = fmt1[2], + iconv$0 = fmt1[1]; + return [5, iconv$0, pad$2, prec$0, concat_fmt(rest$4, fmt2)]; + case 6: + var + rest$5 = fmt1[4], + prec$1 = fmt1[3], + pad$3 = fmt1[2], + iconv$1 = fmt1[1]; + return [6, iconv$1, pad$3, prec$1, concat_fmt(rest$5, fmt2)]; + case 7: + var + rest$6 = fmt1[4], + prec$2 = fmt1[3], + pad$4 = fmt1[2], + iconv$2 = fmt1[1]; + return [7, iconv$2, pad$4, prec$2, concat_fmt(rest$6, fmt2)]; + case 8: + var + rest$7 = fmt1[4], + prec$3 = fmt1[3], + pad$5 = fmt1[2], + fconv = fmt1[1]; + return [8, fconv, pad$5, prec$3, concat_fmt(rest$7, fmt2)]; + case 9: + var rest$8 = fmt1[2], pad$6 = fmt1[1]; + return [9, pad$6, concat_fmt(rest$8, fmt2)]; + case 10: + var rest$9 = fmt1[1]; return [10, concat_fmt(rest$9, fmt2)]; + case 11: + var rest$10 = fmt1[2], str = fmt1[1]; + return [11, str, concat_fmt(rest$10, fmt2)]; + case 12: + var rest$11 = fmt1[2], chr = fmt1[1]; + return [12, chr, concat_fmt(rest$11, fmt2)]; + case 13: + var rest$12 = fmt1[3], fmtty = fmt1[2], pad$7 = fmt1[1]; + return [13, pad$7, fmtty, concat_fmt(rest$12, fmt2)]; + case 14: + var rest$13 = fmt1[3], fmtty$0 = fmt1[2], pad$8 = fmt1[1]; + return [14, pad$8, fmtty$0, concat_fmt(rest$13, fmt2)]; + case 15: + var rest$14 = fmt1[1]; return [15, concat_fmt(rest$14, fmt2)]; + case 16: + var rest$15 = fmt1[1]; return [16, concat_fmt(rest$15, fmt2)]; + case 17: + var rest$16 = fmt1[2], fmting_lit = fmt1[1]; + return [17, fmting_lit, concat_fmt(rest$16, fmt2)]; + case 18: + var rest$17 = fmt1[2], fmting_gen = fmt1[1]; + return [18, fmting_gen, concat_fmt(rest$17, fmt2)]; + case 19: + var rest$18 = fmt1[1]; return [19, concat_fmt(rest$18, fmt2)]; + case 20: + var rest$19 = fmt1[3], char_set = fmt1[2], width_opt = fmt1[1]; + return [20, width_opt, char_set, concat_fmt(rest$19, fmt2)]; + case 21: + var rest$20 = fmt1[2], counter = fmt1[1]; + return [21, counter, concat_fmt(rest$20, fmt2)]; + case 22: + var rest$21 = fmt1[1]; return [22, concat_fmt(rest$21, fmt2)]; + case 23: + var rest$22 = fmt1[2], ign = fmt1[1]; + return [23, ign, concat_fmt(rest$22, fmt2)]; + default: + var rest$23 = fmt1[3], f = fmt1[2], arity = fmt1[1]; + return [24, arity, f, concat_fmt(rest$23, fmt2)]; + } + } + var CamlinternalFormatBasics = [0, concat_fmtty, erase_rel, concat_fmt]; + runtime.caml_register_global + (0, CamlinternalFormatBasics, "CamlinternalFormatBasics"); + return; + } + (globalThis)); + +//# 180 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_false$0 = "false", + cst_true$0 = "true", + caml_atomic_cas = runtime.caml_atomic_cas, + caml_atomic_load = runtime.caml_atomic_load, + caml_blit_string = runtime.caml_blit_string, + caml_create_bytes = runtime.caml_create_bytes, + caml_float_of_string = runtime.caml_float_of_string, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_channel_size = runtime.caml_ml_channel_size, + caml_ml_channel_size_64 = runtime.caml_ml_channel_size_64, + caml_ml_close_channel = runtime.caml_ml_close_channel, + caml_ml_flush = runtime.caml_ml_flush, + caml_ml_input = runtime.caml_ml_input, + caml_ml_input_char = runtime.caml_ml_input_char, + caml_ml_open_descriptor_in = runtime.caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out = runtime.caml_ml_open_descriptor_out, + caml_ml_output = runtime.caml_ml_output, + caml_ml_output_bytes = runtime.caml_ml_output_bytes, + caml_ml_output_char = runtime.caml_ml_output_char, + caml_ml_set_binary_mode = runtime.caml_ml_set_binary_mode, + caml_ml_set_channel_name = runtime.caml_ml_set_channel_name, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_sys_open = runtime.caml_sys_open, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = "%,", + cst = ".", + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Invalid_argument = global_data.Invalid_argument, + Failure = global_data.Failure, + Match_failure = global_data.Match_failure, + Assert_failure = global_data.Assert_failure, + Not_found = global_data.Not_found, + Out_of_memory = global_data.Out_of_memory, + Stack_overflow = global_data.Stack_overflow, + Sys_error = global_data.Sys_error, + End_of_file = global_data.End_of_file, + Division_by_zero = global_data.Division_by_zero, + Sys_blocked_io = global_data.Sys_blocked_io, + Undefined_recursive_module = global_data.Undefined_recursive_module, + cst_really_input = "really_input", + cst_input = "input", + _l_ = [0, 0, [0, 6, 0]], + _k_ = [0, 0, [0, 7, 0]], + cst_output_substring = "output_substring", + cst_output = "output", + _j_ = [0, 1, [0, 3, [0, 4, [0, 6, 0]]]], + _i_ = [0, 1, [0, 3, [0, 4, [0, 7, 0]]]], + _g_ = [0, 1], + _h_ = [0, 0], + cst_bool_of_string = "bool_of_string", + cst_true = cst_true$0, + cst_false = cst_false$0, + cst_char_of_int = "char_of_int", + cst_Stdlib_Exit = "Stdlib.Exit", + _a_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 32752), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 65520), + _c_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 32752), + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32751), + _e_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 16), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 15536); + function failwith(s){ + throw caml_maybe_attach_backtrace([0, Failure, s], 1); + } + function invalid_arg(s){ + throw caml_maybe_attach_backtrace([0, Invalid_argument, s], 1); + } + var Exit = [248, cst_Stdlib_Exit, runtime.caml_fresh_oo_id(0)]; + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return runtime.caml_greaterequal(x, y) ? x : y;} + function abs(x){return 0 <= x ? x : - x | 0;} + function lnot(x){return x ^ -1;} + var + infinity = caml_int64_float_of_bits(_a_), + neg_infinity = caml_int64_float_of_bits(_b_), + nan = caml_int64_float_of_bits(_c_), + max_float = caml_int64_float_of_bits(_d_), + min_float = caml_int64_float_of_bits(_e_), + epsilon_float = caml_int64_float_of_bits(_f_), + max_int = 2147483647, + min_int = -2147483648; + function symbol(s1, s2){ + var + l1 = caml_ml_string_length(s1), + l2 = caml_ml_string_length(s2), + s = caml_create_bytes(l1 + l2 | 0); + caml_blit_string(s1, 0, s, 0, l1); + caml_blit_string(s2, 0, s, l1, l2); + return caml_string_of_bytes(s); + } + function char_of_int(n){ + if(0 <= n && 255 >= n) return n; + return invalid_arg(cst_char_of_int); + } + function string_of_bool(b){return b ? cst_true : cst_false;} + function bool_of_string(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal + (param, cst_true$0) + ? invalid_arg(cst_bool_of_string) + : 1 + : 0; + } + function bool_of_string_opt(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal(param, cst_true$0) ? 0 : _g_ + : _h_; + } + function string_of_int(n){return "" + n;} + function int_of_string_opt(s){ + try{var _B_ = [0, caml_int_of_string(s)]; return _B_;} + catch(_C_){ + var _A_ = caml_wrap_exception(_C_); + if(_A_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_A_, 0); + } + } + function valid_float_lexem(s){ + var l = caml_ml_string_length(s), i = 0; + for(;;){ + if(l <= i) return symbol(s, cst); + var match = runtime.caml_string_get(s, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return s; + var i$0 = i + 1 | 0, i = i$0; + } + } + function string_of_float(f){ + return valid_float_lexem(runtime.caml_format_float("%.12g", f)); + } + function float_of_string_opt(s){ + try{var _y_ = [0, caml_float_of_string(s)]; return _y_;} + catch(_z_){ + var _x_ = caml_wrap_exception(_z_); + if(_x_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_x_, 0); + } + } + function symbol$0(l1, l2){ + if(! l1) return l2; + var tl = l1[2], hd = l1[1]; + return [0, hd, symbol$0(tl, l2)]; + } + var + stdin = caml_ml_open_descriptor_in(0), + stdout = caml_ml_open_descriptor_out(1), + stderr = caml_ml_open_descriptor_out(2); + function open_out_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_out(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_out(name){return open_out_gen(_i_, 438, name);} + function open_out_bin(name){return open_out_gen(_j_, 438, name);} + function flush_all(param){ + var param$0 = runtime.caml_ml_out_channels_list(0); + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + try{caml_ml_flush(a);} + catch(_w_){ + var _v_ = caml_wrap_exception(_w_); + if(_v_[1] !== Sys_error) throw caml_maybe_attach_backtrace(_v_, 0); + } + var param$0 = l; + } + } + function output_bytes(oc, s){ + return caml_ml_output_bytes(oc, s, 0, caml_ml_bytes_length(s)); + } + function output_string(oc, s){ + return caml_ml_output(oc, s, 0, caml_ml_string_length(s)); + } + function output(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_output_bytes(oc, s, ofs, len); + return invalid_arg(cst_output); + } + function output_substring(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(s) - len | 0) >= ofs) + return caml_ml_output(oc, s, ofs, len); + return invalid_arg(cst_output_substring); + } + function output_value(chan, v){ + return runtime.caml_output_value(chan, v, 0); + } + function close_out(oc){ + caml_ml_flush(oc); + return caml_ml_close_channel(oc); + } + function close_out_noerr(oc){ + try{caml_ml_flush(oc);}catch(_u_){} + try{var _s_ = caml_ml_close_channel(oc); return _s_;}catch(_t_){return 0;} + } + function open_in_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_in(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_in(name){return open_in_gen(_k_, 0, name);} + function open_in_bin(name){return open_in_gen(_l_, 0, name);} + function input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_input(ic, s, ofs, len); + return invalid_arg(cst_input); + } + function unsafe_really_input(ic, s, ofs, len){ + var ofs$0 = ofs, len$0 = len; + for(;;){ + if(0 >= len$0) return 0; + var r = caml_ml_input(ic, s, ofs$0, len$0); + if(0 === r) throw caml_maybe_attach_backtrace(End_of_file, 1); + var + len$1 = len$0 - r | 0, + ofs$1 = ofs$0 + r | 0, + ofs$0 = ofs$1, + len$0 = len$1; + } + } + function really_input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return unsafe_really_input(ic, s, ofs, len); + return invalid_arg(cst_really_input); + } + function really_input_string(ic, len){ + var s = caml_create_bytes(len); + really_input(ic, s, 0, len); + return caml_string_of_bytes(s); + } + function input_line(chan){ + function build_result(buf, pos, param){ + var pos$0 = pos, param$0 = param; + for(;;){ + if(! param$0) return buf; + var tl = param$0[2], hd = param$0[1], len = caml_ml_bytes_length(hd); + runtime.caml_blit_bytes(hd, 0, buf, pos$0 - len | 0, len); + var pos$1 = pos$0 - len | 0, pos$0 = pos$1, param$0 = tl; + } + } + var accu = 0, len = 0; + for(;;){ + var n = runtime.caml_ml_input_scan_line(chan); + if(0 === n){ + if(! accu) throw caml_maybe_attach_backtrace(End_of_file, 1); + var _r_ = build_result(caml_create_bytes(len), len, accu); + } + else{ + if(0 >= n){ + var beg = caml_create_bytes(- n | 0); + caml_ml_input(chan, beg, 0, - n | 0); + var + len$1 = len - n | 0, + accu$0 = [0, beg, accu], + accu = accu$0, + len = len$1; + continue; + } + var res = caml_create_bytes(n - 1 | 0); + caml_ml_input(chan, res, 0, n - 1 | 0); + caml_ml_input_char(chan); + if(accu) + var + len$0 = (len + n | 0) - 1 | 0, + _r_ = build_result(caml_create_bytes(len$0), len$0, [0, res, accu]); + else + var _r_ = res; + } + return caml_string_of_bytes(_r_); + } + } + function close_in_noerr(ic){ + try{var _p_ = caml_ml_close_channel(ic); return _p_;}catch(_q_){return 0;} + } + function print_char(c){return caml_ml_output_char(stdout, c);} + function print_string(s){return output_string(stdout, s);} + function print_bytes(s){return output_bytes(stdout, s);} + function print_int(i){return output_string(stdout, "" + i);} + function print_float(f){return output_string(stdout, string_of_float(f));} + function print_endline(s){ + output_string(stdout, s); + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function print_newline(param){ + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function prerr_char(c){return caml_ml_output_char(stderr, c);} + function prerr_string(s){return output_string(stderr, s);} + function prerr_bytes(s){return output_bytes(stderr, s);} + function prerr_int(i){return output_string(stderr, "" + i);} + function prerr_float(f){return output_string(stderr, string_of_float(f));} + function prerr_endline(s){ + output_string(stderr, s); + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function prerr_newline(param){ + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function read_line(param){caml_ml_flush(stdout); return input_line(stdin);} + function read_int(param){return caml_int_of_string(read_line(0));} + function read_int_opt(param){return int_of_string_opt(read_line(0));} + function read_float(param){return caml_float_of_string(read_line(0));} + function read_float_opt(param){return float_of_string_opt(read_line(0));} + function string_of_format(param){var str = param[2]; return str;} + function symbol$1(param, _n_){ + var + str2 = _n_[2], + fmt2 = _n_[1], + str1 = param[2], + fmt1 = param[1], + _o_ = symbol(str1, symbol(cst$0, str2)); + return [0, caml_call2(CamlinternalFormatBasics[3], fmt1, fmt2), _o_]; + } + var exit_function = [0, flush_all]; + function at_exit(f){ + for(;;){ + var + f_yet_to_run = [0, 1], + old_exit = caml_atomic_load(exit_function), + new_exit$0 = + function(f_yet_to_run, old_exit){ + function new_exit(param){ + if(caml_atomic_cas(f_yet_to_run, 1, 0)) caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return new_exit; + }, + new_exit = new_exit$0(f_yet_to_run, old_exit), + success = caml_atomic_cas(exit_function, old_exit, new_exit), + _m_ = 1 - success; + if(_m_) continue; + return _m_; + } + } + var do_domain_local_at_exit = [0, function(param){return 0;}]; + function do_at_exit(param){ + caml_call1(do_domain_local_at_exit[1], 0); + return caml_call1(caml_atomic_load(exit_function), 0); + } + function exit(retcode){ + do_at_exit(0); + return runtime.caml_sys_exit(retcode); + } + runtime.caml_register_named_value("Pervasives.do_at_exit", do_at_exit); + var + Stdlib = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + caml_ml_flush, + flush_all, + caml_ml_output_char, + output_string, + output_bytes, + output, + output_substring, + caml_ml_output_char, + runtime.caml_ml_output_int, + output_value, + runtime.caml_ml_seek_out, + runtime.caml_ml_pos_out, + caml_ml_channel_size, + close_out, + close_out_noerr, + caml_ml_set_binary_mode, + open_in, + open_in_bin, + open_in_gen, + caml_ml_input_char, + input_line, + input, + really_input, + really_input_string, + caml_ml_input_char, + runtime.caml_ml_input_int, + runtime.caml_input_value, + runtime.caml_ml_seek_in, + runtime.caml_ml_pos_in, + caml_ml_channel_size, + caml_ml_close_channel, + close_in_noerr, + caml_ml_set_binary_mode, + [0, + runtime.caml_ml_seek_out_64, + runtime.caml_ml_pos_out_64, + caml_ml_channel_size_64, + runtime.caml_ml_seek_in_64, + runtime.caml_ml_pos_in_64, + caml_ml_channel_size_64], + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(45, Stdlib, "Stdlib"); + return; + } + (globalThis)); + +//# 764 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + ocaml_version = "5.0.0", + ocaml_release = [0, 5, 0, 0, 0], + Stdlib = global_data.Stdlib, + executable_name = runtime.caml_sys_executable_name(0), + os_type = runtime.caml_sys_get_config(0)[1], + backend_type = [0, "js_of_ocaml"], + unix = runtime.caml_sys_const_ostype_unix(0), + win32 = runtime.caml_sys_const_ostype_win32(0), + cygwin = runtime.caml_sys_const_ostype_cygwin(0), + max_array_length = runtime.caml_sys_const_max_wosize(0), + max_floatarray_length = max_array_length / 2 | 0, + max_string_length = (4 * max_array_length | 0) - 1 | 0, + cst_Stdlib_Sys_Break = "Stdlib.Sys.Break", + big_endian = 0, + word_size = 32, + int_size = 32; + function getenv_opt(s){ + try{var _d_ = [0, runtime.caml_sys_getenv(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var interactive = [0, 0]; + function set_signal(sig_num, sig_beh){return 0;} + var + Break = [248, cst_Stdlib_Sys_Break, runtime.caml_fresh_oo_id(0)], + sigabrt = -1, + sigalrm = -2, + sigfpe = -3, + sighup = -4, + sigill = -5, + sigint = -6, + sigkill = -7, + sigpipe = -8, + sigquit = -9, + sigsegv = -10, + sigterm = -11, + sigusr1 = -12, + sigusr2 = -13, + sigchld = -14, + sigcont = -15, + sigstop = -16, + sigtstp = -17, + sigttin = -18, + sigttou = -19, + sigvtalrm = -20, + sigprof = -21, + sigbus = -22, + sigpoll = -23, + sigsys = -24, + sigtrap = -25, + sigurg = -26, + sigxcpu = -27, + sigxfsz = -28; + function catch_break(on){return on ? 0 : 0;} + var development_version = 0; + function Make(_b_, _a_){return [0, 1];} + var + Immediate64 = [0, Make], + Stdlib_Sys = + [0, + executable_name, + getenv_opt, + interactive, + os_type, + backend_type, + unix, + win32, + cygwin, + word_size, + int_size, + big_endian, + max_string_length, + max_array_length, + max_floatarray_length, + set_signal, + sigabrt, + sigalrm, + sigfpe, + sighup, + sigill, + sigint, + sigkill, + sigpipe, + sigquit, + sigsegv, + sigterm, + sigusr1, + sigusr2, + sigchld, + sigcont, + sigstop, + sigtstp, + sigttin, + sigttou, + sigvtalrm, + sigprof, + sigbus, + sigpoll, + sigsys, + sigtrap, + sigurg, + sigxcpu, + sigxfsz, + Break, + catch_break, + ocaml_version, + development_version, + ocaml_release, + runtime.caml_ml_enable_runtime_warnings, + runtime.caml_ml_runtime_warnings_enabled, + Immediate64]; + runtime.caml_register_global(4, Stdlib_Sys, "Stdlib__Sys"); + return; + } + (globalThis)); + +//# 893 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Obj_extension_constructor$1 = "Obj.extension_constructor", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Obj_Ephemeron_blit_key = "Obj.Ephemeron.blit_key", + cst_Obj_Ephemeron_check_key = "Obj.Ephemeron.check_key", + cst_Obj_Ephemeron_unset_key = "Obj.Ephemeron.unset_key", + cst_Obj_Ephemeron_set_key = "Obj.Ephemeron.set_key", + cst_Obj_Ephemeron_get_key_copy = "Obj.Ephemeron.get_key_copy", + cst_Obj_Ephemeron_get_key = "Obj.Ephemeron.get_key", + cst_Obj_Ephemeron_create = "Obj.Ephemeron.create", + cst_Obj_extension_constructor$0 = cst_Obj_extension_constructor$1, + cst_Obj_extension_constructor = cst_Obj_extension_constructor$1, + _a_ = [0, "obj.ml", 97, 4]; + function is_block(a){return 1 - (typeof a === "number" ? 1 : 0);} + var + double_field = runtime.caml_array_get, + set_double_field = runtime.caml_array_set, + first_non_constant_constructor = 0, + last_non_constant_constructor_ = 243, + forcing_tag = 244, + cont_tag = 245, + lazy_tag = 246, + closure_tag = 247, + object_tag = 248, + infix_tag = 249, + forward_tag = 250, + no_scan_tag = 251, + abstract_tag = 251, + string_tag = 252, + double_tag = 253, + double_array_tag = 254, + custom_tag = 255, + int_tag = 1000, + out_of_heap_tag = 1001, + unaligned_tag = 1002; + function info(obj){ + if(caml_obj_tag(obj) !== 247) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + info = runtime.caml_obj_raw_field(obj, 1), + arity = 64 === Stdlib_Sys[9] ? info >> 56 : info >> 24, + start_env = info << 8 >>> 9 | 0; + return [0, arity, start_env]; + } + function of_val(x){ + var switch$0 = 0; + if(is_block(x) && caml_obj_tag(x) !== 248 && 1 <= x.length - 1){var slot = x[1]; switch$0 = 1;} + if(! switch$0) var slot = x; + var switch$1 = 0; + if(is_block(slot) && caml_obj_tag(slot) === 248){var name = slot[1]; switch$1 = 1;} + if(! switch$1) + var name = caml_call1(Stdlib[1], cst_Obj_extension_constructor$0); + return caml_obj_tag(name) === 252 + ? slot + : caml_call1(Stdlib[1], cst_Obj_extension_constructor); + } + function name(slot){return slot[1];} + function id(slot){return slot[2];} + var + Extension_constructor = [0, of_val, name, id], + max_ephe_length = Stdlib_Sys[13] - 2 | 0; + function create(l){ + var _g_ = 0 <= l ? 1 : 0, _h_ = _g_ ? l <= max_ephe_length ? 1 : 0 : _g_; + if(1 - _h_) caml_call1(Stdlib[1], cst_Obj_Ephemeron_create); + return runtime.caml_ephe_create(l); + } + function length(x){return x.length - 1 - 2 | 0;} + function raise_if_invalid_offset(e, o, msg){ + var + _d_ = 0 <= o ? 1 : 0, + _e_ = _d_ ? o < length(e) ? 1 : 0 : _d_, + _f_ = 1 - _e_; + return _f_ ? caml_call1(Stdlib[1], msg) : _f_; + } + function get_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key); + return runtime.caml_ephe_get_key(e, o); + } + function get_key_copy(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key_copy); + return runtime.caml_ephe_get_key_copy(e, o); + } + function set_key(e, o, x){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_set_key); + return runtime.caml_ephe_set_key(e, o, x); + } + function unset_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_unset_key); + return runtime.caml_ephe_unset_key(e, o); + } + function check_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_check_key); + return runtime.caml_ephe_check_key(e, o); + } + function blit_key(e1, o1, e2, o2, l){ + if + (0 <= l + && + 0 <= o1 + && (length(e1) - l | 0) >= o1 && 0 <= o2 && (length(e2) - l | 0) >= o2){ + var + _b_ = 0 !== l ? 1 : 0, + _c_ = _b_ ? runtime.caml_ephe_blit_key(e1, o1, e2, o2, l) : _b_; + return _c_; + } + return caml_call1(Stdlib[1], cst_Obj_Ephemeron_blit_key); + } + var + Stdlib_Obj = + [0, + is_block, + double_field, + set_double_field, + first_non_constant_constructor, + last_non_constant_constructor_, + forcing_tag, + cont_tag, + lazy_tag, + closure_tag, + object_tag, + infix_tag, + forward_tag, + no_scan_tag, + abstract_tag, + string_tag, + double_tag, + double_array_tag, + custom_tag, + int_tag, + out_of_heap_tag, + unaligned_tag, + [0, info], + Extension_constructor, + [0, + create, + length, + get_key, + get_key_copy, + set_key, + unset_key, + check_key, + blit_key, + runtime.caml_ephe_get_data, + runtime.caml_ephe_get_data_copy, + runtime.caml_ephe_set_data, + runtime.caml_ephe_unset_data, + runtime.caml_ephe_check_data, + runtime.caml_ephe_blit_data, + max_ephe_length]]; + runtime.caml_register_global(13, Stdlib_Obj, "Stdlib__Obj"); + return; + } + (globalThis)); + +//# 1063 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_atomic_exchange = runtime.caml_atomic_exchange, + caml_atomic_fetch_add = runtime.caml_atomic_fetch_add; + function set(r, x){caml_atomic_exchange(r, x); return 0;} + function incr(r){caml_atomic_fetch_add(r, 1); return 0;} + function decr(r){caml_atomic_fetch_add(r, -1); return 0;} + var + _a_ = caml_atomic_fetch_add, + _b_ = runtime.caml_atomic_cas, + _c_ = caml_atomic_exchange, + _d_ = runtime.caml_atomic_load, + Stdlib_Atomic = + [0, + function(_e_){return [0, _e_];}, + _d_, + set, + _c_, + _b_, + _a_, + incr, + decr]; + runtime.caml_register_global(0, Stdlib_Atomic, "Stdlib__Atomic"); + return; + } + (globalThis)); + +//# 1094 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_lazy_update_to_forward = runtime.caml_lazy_update_to_forward, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = + [248, "CamlinternalLazy.Undefined", runtime.caml_fresh_oo_id(0)]; + function force_gen_lazy_block(only_val, blk){ + if(0 !== runtime.caml_lazy_update_to_forcing(blk)) + throw caml_maybe_attach_backtrace(Undefined, 1); + if(only_val){ + var closure$0 = blk[1]; + blk[1] = 0; + var result$0 = caml_call1(closure$0, 0); + blk[1] = result$0; + caml_lazy_update_to_forward(blk); + return result$0; + } + var closure = blk[1]; + blk[1] = 0; + try{ + var result = caml_call1(closure, 0); + blk[1] = result; + caml_lazy_update_to_forward(blk); + return result; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + blk[1] = function(param){throw caml_maybe_attach_backtrace(e, 0);}; + runtime.caml_lazy_reset_to_lazy(blk); + throw caml_maybe_attach_backtrace(e, 0); + } + } + function force_lazy_block(blk){return force_gen_lazy_block(0, blk);} + function force_gen(only_val, lzv){ + var t = runtime.caml_obj_tag(lzv); + if(t === Stdlib_Obj[12]) return lzv[1]; + if(t === Stdlib_Obj[6]) throw caml_maybe_attach_backtrace(Undefined, 1); + return t !== Stdlib_Obj[8] ? lzv : force_gen_lazy_block(only_val, lzv); + } + var CamlinternalLazy = [0, Undefined, force_lazy_block, force_gen]; + runtime.caml_register_global(2, CamlinternalLazy, "CamlinternalLazy"); + return; + } + (globalThis)); + +//# 1153 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = CamlinternalLazy[1]; + function force_val(l){return caml_call2(CamlinternalLazy[3], 1, l);} + function from_fun(f){ + var x = runtime.caml_obj_block(Stdlib_Obj[8], 1); + x[1] = f; + return x; + } + function from_val(v){ + var t = caml_obj_tag(v); + if + (t !== Stdlib_Obj[12] + && t !== Stdlib_Obj[8] && t !== Stdlib_Obj[6] && t !== Stdlib_Obj[16]) + return v; + return runtime.caml_lazy_make_forward(v); + } + function is_val(l){ + var _i_ = Stdlib_Obj[8]; + return caml_obj_tag(l) !== _i_ ? 1 : 0; + } + function map(f, x){ + return [246, + function(_f_){ + var _g_ = caml_obj_tag(x); + if(250 === _g_) + var _h_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _g_ && 244 !== _g_){var _h_ = x; switch$0 = 1;} + if(! switch$0) var _h_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _h_); + }]; + } + function map_val(f, x){ + if(! is_val(x)) + return [246, + function(_c_){ + var _d_ = caml_obj_tag(x); + if(250 === _d_) + var _e_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = x; switch$0 = 1;} + if(! switch$0) var _e_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _e_); + }]; + var _a_ = caml_obj_tag(x); + if(250 === _a_) + var _b_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _a_ && 244 !== _a_){var _b_ = x; switch$0 = 1;} + if(! switch$0) var _b_ = caml_call1(CamlinternalLazy[2], x); + } + return from_val(caml_call1(f, _b_)); + } + var + Stdlib_Lazy = + [0, Undefined, map, is_val, from_val, map_val, from_fun, force_val]; + runtime.caml_register_global(2, Stdlib_Lazy, "Stdlib__Lazy"); + return; + } + (globalThis)); + +//# 1238 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Atomic = global_data.Stdlib__Atomic, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib = global_data.Stdlib, + Stdlib_Lazy = global_data.Stdlib__Lazy, + _a_ = [0, "seq.ml", 596, 4], + cst_Seq_drop = "Seq.drop", + cst_Seq_take = "Seq.take", + cst_Seq_init = "Seq.init", + cst_Stdlib_Seq_Forced_twice = "Stdlib.Seq.Forced_twice"; + function empty(param){return 0;} + function return$0(x, param){return [0, x, empty];} + function cons(x, next, param){return [0, x, next];} + function append(seq1, seq2, param){ + var match = caml_call1(seq1, 0); + if(! match) return caml_call1(seq2, 0); + var next = match[2], x = match[1]; + return [0, x, function(_aM_){return append(next, seq2, _aM_);}]; + } + function map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + function _aK_(_aL_){return map(f, next, _aL_);} + return [0, caml_call1(f, x), _aK_]; + } + function filter_map(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1], match$0 = caml_call1(f, x); + if(match$0){ + var y = match$0[1]; + return [0, y, function(_aJ_){return filter_map(f, next, _aJ_);}]; + } + var seq$0 = next; + } + } + function filter(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + if(caml_call1(f, x)) + return [0, x, function(_aI_){return filter(f, next, _aI_);}]; + var seq$0 = next; + } + } + function concat(seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aG_ = 0; + return append(x, function(_aH_){return concat(next, _aH_);}, _aG_); + } + function flat_map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aD_ = 0; + function _aE_(_aF_){return flat_map(f, next, _aF_);} + return append(caml_call1(f, x), _aE_, _aD_); + } + function fold_left(f, acc, seq){ + var acc$0 = acc, seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return acc$0; + var + next = match[2], + x = match[1], + acc$1 = caml_call2(f, acc$0, x), + acc$0 = acc$1, + seq$0 = next; + } + } + function iter(f, seq){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + caml_call1(f, x); + var seq$0 = next; + } + } + function unfold(f, u, param){ + var match = caml_call1(f, u); + if(! match) return 0; + var match$0 = match[1], u$0 = match$0[2], x = match$0[1]; + return [0, x, function(_aC_){return unfold(f, u$0, _aC_);}]; + } + function is_empty(xs){return caml_call1(xs, 0) ? 0 : 1;} + function uncons(xs){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, [0, x, xs$0]]; + } + function length(xs$1){ + var accu = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var xs$0 = match[2], accu$0 = accu + 1 | 0, accu = accu$0, xs = xs$0; + } + } + function iteri(f, xs$1){ + var i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + caml_call2(f, i, x); + var i$0 = i + 1 | 0, i = i$0, xs = xs$0; + } + } + function fold_lefti(f, accu$1, xs$1){ + var accu = accu$1, i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var + xs$0 = match[2], + x = match[1], + accu$0 = caml_call3(f, accu, i, x), + i$0 = i + 1 | 0, + accu = accu$0, + i = i$0, + xs = xs$0; + } + } + function for_all(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], _aB_ = caml_call1(p, x); + if(! _aB_) return _aB_; + var xs$0 = xs$1; + } + } + function exists(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], _aA_ = caml_call1(p, x); + if(_aA_) return _aA_; + var xs$0 = xs$1; + } + } + function find(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1]; + if(caml_call1(p, x)) return [0, x]; + var xs$0 = xs$1; + } + } + function find_map(f, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], result = caml_call1(f, x); + if(result) return result; + var xs$0 = xs$1; + } + } + function iter2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1]; + caml_call2(f, x, y); + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function fold_left2(f, accu, xs, ys){ + var accu$0 = accu, xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return accu$0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return accu$0; + var + ys$1 = match$0[2], + y = match$0[1], + accu$1 = caml_call3(f, accu$0, x, y), + accu$0 = accu$1, + xs$0 = xs$1, + ys$0 = ys$1; + } + } + function for_all2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], _az_ = caml_call2(f, x, y); + if(! _az_) return _az_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function exists2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1], _ay_ = caml_call2(f, x, y); + if(_ay_) return _ay_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function equal(eq, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(match){ + if(match$0){ + var + ys$1 = match$0[2], + y = match$0[1], + xs$1 = match[2], + x = match[1], + _ax_ = caml_call2(eq, x, y); + if(! _ax_) return _ax_; + var xs$0 = xs$1, ys$0 = ys$1; + continue; + } + } + else if(! match$0) return 1; + return 0; + } + } + function compare(cmp, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(! match) return match$0 ? -1 : 0; + var xs$1 = match[2], x = match[1]; + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], c = caml_call2(cmp, x, y); + if(0 !== c) return c; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function init_aux(f, i, j, param){ + if(i >= j) return 0; + var _au_ = i + 1 | 0; + function _av_(_aw_){return init_aux(f, _au_, j, _aw_);} + return [0, caml_call1(f, i), _av_]; + } + function init(n, f){ + if(0 > n) return caml_call1(Stdlib[1], cst_Seq_init); + var _as_ = 0; + return function(_at_){return init_aux(f, _as_, n, _at_);}; + } + function repeat(x, param){ + return [0, x, function(_ar_){return repeat(x, _ar_);}]; + } + function forever(f, param){ + function _ap_(_aq_){return forever(f, _aq_);} + return [0, caml_call1(f, 0), _ap_]; + } + function cycle_nonempty(xs, param){ + var _an_ = 0; + return append(xs, function(_ao_){return cycle_nonempty(xs, _ao_);}, _an_); + } + function cycle(xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + function _ak_(_am_){return cycle_nonempty(xs, _am_);} + return [0, x, function(_al_){return append(xs$0, _ak_, _al_);}]; + } + function iterate1(f, x, param){ + var y = caml_call1(f, x); + return [0, y, function(_aj_){return iterate1(f, y, _aj_);}]; + } + function iterate(f, x){ + function _ag_(_ai_){return iterate1(f, x, _ai_);} + return function(_ah_){return [0, x, _ag_];}; + } + function mapi_aux(f, i, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _ad_ = i + 1 | 0; + function _ae_(_af_){return mapi_aux(f, _ad_, xs$0, _af_);} + return [0, caml_call2(f, i, x), _ae_]; + } + function mapi(f, xs){ + var _ab_ = 0; + return function(_ac_){return mapi_aux(f, _ab_, xs, _ac_);}; + } + function tail_scan(f, s, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], s$0 = caml_call2(f, s, x); + return [0, s$0, function(_aa_){return tail_scan(f, s$0, xs$0, _aa_);}]; + } + function scan(f, s, xs){ + function _Z_(_$_){return tail_scan(f, s, xs, _$_);} + return function(___){return [0, s, _Z_];}; + } + function take_aux(n, xs){ + return 0 === n + ? empty + : function + (param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, take_aux(n - 1 | 0, xs$0)]; + }; + } + function take(n, xs){ + if(n < 0) caml_call1(Stdlib[1], cst_Seq_take); + return take_aux(n, xs); + } + function drop(n, xs){ + return 0 <= n + ? 0 + === n + ? xs + : function + (param){ + var n$0 = n, xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], n$1 = n$0 - 1 | 0; + if(0 === n$1) return caml_call1(xs$1, 0); + var n$0 = n$1, xs$0 = xs$1; + } + } + : caml_call1(Stdlib[1], cst_Seq_drop); + } + function take_while(p, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return caml_call1(p, x) + ? [0, x, function(_Y_){return take_while(p, xs$0, _Y_);}] + : 0; + } + function drop_while(p, xs, param){ + var xs$0 = xs; + for(;;){ + var node = caml_call1(xs$0, 0); + if(! node) return 0; + var xs$1 = node[2], x = node[1]; + if(! caml_call1(p, x)) return node; + var xs$0 = xs$1; + } + } + function group(eq, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _P_ = caml_call1(eq, x); + function _Q_(_X_){return drop_while(_P_, xs$0, _X_);} + function _R_(_W_){return group(eq, _Q_, _W_);} + var _S_ = caml_call1(eq, x); + function _T_(_V_){return take_while(_S_, xs$0, _V_);} + return [0, function(_U_){return [0, x, _T_];}, _R_]; + } + var + Forced_twice = + [248, cst_Stdlib_Seq_Forced_twice, runtime.caml_fresh_oo_id(0)], + to_lazy = Stdlib_Lazy[6]; + function failure(param){ + throw caml_maybe_attach_backtrace(Forced_twice, 1); + } + function memoize(xs){ + function s$0(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, memoize(xs$0)]; + } + var s = caml_call1(to_lazy, s$0); + return function(_O_){ + var _N_ = runtime.caml_obj_tag(s); + if(250 === _N_) return s[1]; + if(246 !== _N_ && 244 !== _N_) return s; + return caml_call1(CamlinternalLazy[2], s);}; + } + function once(xs){ + function f(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, once(xs$0)]; + } + var action = caml_call1(Stdlib_Atomic[1], f); + return function(param){ + var f = caml_call2(Stdlib_Atomic[4], action, failure); + return caml_call1(f, 0);}; + } + function zip(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + return [0, [0, x, y], function(_M_){return zip(xs$0, ys$0, _M_);}]; + } + function map2(f, xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + function _K_(_L_){return map2(f, xs$0, ys$0, _L_);} + return [0, caml_call2(f, x, y), _K_]; + } + function interleave(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return caml_call1(ys, 0); + var xs$0 = match[2], x = match[1]; + return [0, x, function(_J_){return interleave(ys, xs$0, _J_);}]; + } + function sorted_merge1(cmp, x, xs, y, ys){ + return 0 < caml_call2(cmp, x, y) + ? [0, + y, + function(_H_){ + var match = caml_call1(ys, 0); + if(! match) return [0, x, xs]; + var ys$0 = match[2], y = match[1]; + return sorted_merge1(cmp, x, xs, y, ys$0); + }] + : [0, + x, + function(_I_){ + var match = caml_call1(xs, 0); + if(! match) return [0, y, ys]; + var xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys); + }]; + } + function sorted_merge(cmp, xs, ys, param){ + var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0); + if(match){ + if(match$0){ + var ys$0 = match$0[2], y = match$0[1], xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys$0); + } + var c = match; + } + else{if(! match$0) return 0; var c = match$0;} + return c; + } + function map_fst(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], x = match[1][1]; + return [0, x, function(_G_){return map_fst(xys$0, _G_);}]; + } + function map_snd(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], y = match[1][2]; + return [0, y, function(_F_){return map_snd(xys$0, _F_);}]; + } + function unzip(xys){ + function _C_(_E_){return map_snd(xys, _E_);} + return [0, function(_D_){return map_fst(xys, _D_);}, _C_]; + } + function filter_map_find_left_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){ + var y = match$0[1]; + return [0, + y, + function(_B_){return filter_map_find_left_map(f, xs$1, _B_);}]; + } + var xs$0 = xs$1; + } + } + function filter_map_find_right_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){var xs$0 = xs$1; continue;} + var z = match$0[1]; + return [0, + z, + function(_A_){return filter_map_find_right_map(f, xs$1, _A_);}]; + } + } + function partition_map(f, xs){ + function _x_(_z_){return filter_map_find_right_map(f, xs, _z_);} + return [0, + function(_y_){return filter_map_find_left_map(f, xs, _y_);}, + _x_]; + } + function partition(p, xs){ + function _t_(x){return 1 - caml_call1(p, x);} + function _u_(_w_){return filter(_t_, xs, _w_);} + return [0, function(_v_){return filter(p, xs, _v_);}, _u_]; + } + function peel(xss){ + return unzip(function(_s_){return filter_map(uncons, xss, _s_);}); + } + function transpose(xss, param){ + var match = peel(xss), tails = match[2], heads = match[1]; + if(! is_empty(heads)) + return [0, heads, function(_r_){return transpose(tails, _r_);}]; + if(is_empty(tails)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function _b_(remainders, xss, param){ + var match = caml_call1(xss, 0); + if(! match) return transpose(remainders, 0); + var xss$0 = match[2], xs = match[1], match$0 = caml_call1(xs, 0); + if(match$0){ + var + xs$0 = match$0[2], + x = match$0[1], + match$1 = peel(remainders), + tails = match$1[2], + heads = match$1[1], + _l_ = function(_q_){return [0, xs$0, tails];}, + _m_ = function(_p_){return _b_(_l_, xss$0, _p_);}; + return [0, function(_o_){return [0, x, heads];}, _m_]; + } + var + match$2 = peel(remainders), + tails$0 = match$2[2], + heads$0 = match$2[1]; + return [0, heads$0, function(_n_){return _b_(tails$0, xss$0, _n_);}]; + } + function map_product(f, xs, ys){ + function _f_(x){ + function _j_(y){return caml_call2(f, x, y);} + return function(_k_){return map(_j_, ys, _k_);}; + } + function xss(_i_){return map(_f_, xs, _i_);} + function _e_(_h_){return _b_(empty, xss, _h_);} + return function(_g_){return concat(_e_, _g_);}; + } + function product(xs, ys){ + return map_product(function(x, y){return [0, x, y];}, xs, ys); + } + function of_dispenser(it){ + function c(param){ + var match = caml_call1(it, 0); + if(! match) return 0; + var x = match[1]; + return [0, x, c]; + } + return c; + } + function to_dispenser(xs){ + var s = [0, xs]; + return function(param){ + var match = caml_call1(s[1], 0); + if(! match) return 0; + var xs = match[2], x = match[1]; + s[1] = xs; + return [0, x];}; + } + function ints(i, param){ + var _c_ = i + 1 | 0; + return [0, i, function(_d_){return ints(_c_, _d_);}]; + } + var + Stdlib_Seq = + [0, + is_empty, + uncons, + length, + iter, + fold_left, + iteri, + fold_lefti, + for_all, + exists, + find, + find_map, + iter2, + fold_left2, + for_all2, + exists2, + equal, + compare, + empty, + return$0, + cons, + init, + unfold, + repeat, + forever, + cycle, + iterate, + map, + mapi, + filter, + filter_map, + scan, + take, + drop, + take_while, + drop_while, + group, + memoize, + Forced_twice, + once, + transpose, + append, + concat, + flat_map, + flat_map, + zip, + map2, + interleave, + sorted_merge, + product, + map_product, + unzip, + unzip, + partition_map, + partition, + of_dispenser, + to_dispenser, + ints]; + runtime.caml_register_global(10, Stdlib_Seq, "Stdlib__Seq"); + return; + } + (globalThis)); + +//# 2020 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + cst_result_is_Ok = "result is Ok _", + cst_result_is_Error = "result is Error _"; + function ok(v){return [0, v];} + function error(e){return [1, e];} + function value(r, default$0){ + if(0 !== r[0]) return default$0; + var v = r[1]; + return v; + } + function get_ok(param){ + if(0 !== param[0]) return caml_call1(Stdlib[1], cst_result_is_Error); + var v = param[1]; + return v; + } + function get_error(param){ + if(0 === param[0]) return caml_call1(Stdlib[1], cst_result_is_Ok); + var e = param[1]; + return e; + } + function bind(r, f){ + if(0 !== r[0]) return r; + var v = r[1]; + return caml_call1(f, v); + } + function join(e){if(0 !== e[0]) return e; var r = e[1]; return r;} + function map(f, e){ + if(0 !== e[0]) return e; + var v = e[1]; + return [0, caml_call1(f, v)]; + } + function map_error(f, v){ + if(0 === v[0]) return v; + var e = v[1]; + return [1, caml_call1(f, e)]; + } + function fold(ok, error, param){ + if(0 === param[0]){var v = param[1]; return caml_call1(ok, v);} + var e = param[1]; + return caml_call1(error, e); + } + function iter(f, param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return caml_call1(f, v); + } + function iter_error(f, param){ + if(0 === param[0]) return 0; + var e = param[1]; + return caml_call1(f, e); + } + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function equal(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 === r1[0]){var v1 = r1[1]; return caml_call2(ok, v0, v1);} + } + else{ + var e0 = r0[1]; + if(0 !== r1[0]){var e1 = r1[1]; return caml_call2(error, e0, e1);} + } + return 0; + } + function compare(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 !== r1[0]) return -1; + var v1 = r1[1]; + return caml_call2(ok, v0, v1); + } + var e0 = r0[1]; + if(0 === r1[0]) return 1; + var e1 = r1[1]; + return caml_call2(error, e0, e1); + } + function to_option(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v]; + } + function to_list(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v, 0]; + } + function to_seq(param){ + if(0 !== param[0]) return Stdlib_Seq[18]; + var v = param[1]; + return caml_call1(Stdlib_Seq[19], v); + } + var + Stdlib_Result = + [0, + ok, + error, + value, + get_ok, + get_error, + bind, + join, + map, + map_error, + fold, + iter, + iter_error, + is_ok, + is_error, + equal, + compare, + to_option, + to_list, + to_seq]; + runtime.caml_register_global(4, Stdlib_Result, "Stdlib__Result"); + return; + } + (globalThis)); + +//# 2183 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_string_of_bytes = runtime.caml_string_of_bytes; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "\\\\", + cst$0 = "\\'", + Stdlib = global_data.Stdlib, + cst_b = "\\b", + cst_t = "\\t", + cst_n = "\\n", + cst_r = "\\r", + cst_Char_chr = "Char.chr"; + function chr(n){ + if(0 <= n && 255 >= n) return n; + return caml_call1(Stdlib[1], cst_Char_chr); + } + function escaped(c){ + var switch$0 = 0; + if(40 <= c){ + if(92 === c) return cst; + if(127 > c) switch$0 = 1; + } + else if(32 <= c){ + if(39 <= c) return cst$0; + switch$0 = 1; + } + else if(14 > c) + switch(c){ + case 8: + return cst_b; + case 9: + return cst_t; + case 10: + return cst_n; + case 13: + return cst_r; + } + if(switch$0){ + var s$0 = caml_create_bytes(1); + caml_bytes_unsafe_set(s$0, 0, c); + return caml_string_of_bytes(s$0); + } + var s = caml_create_bytes(4); + caml_bytes_unsafe_set(s, 0, 92); + caml_bytes_unsafe_set(s, 1, 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s, 2, 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s, 3, 48 + (c % 10 | 0) | 0); + return caml_string_of_bytes(s); + } + function lowercase_ascii(c){return 25 < c - 65 >>> 0 ? c : c + 32 | 0;} + function uppercase_ascii(c){return 25 < c - 97 >>> 0 ? c : c - 32 | 0;} + function compare(c1, c2){return c1 - c2 | 0;} + function equal(c1, c2){return 0 === (c1 - c2 | 0) ? 1 : 0;} + var + Stdlib_Char = + [0, chr, escaped, lowercase_ascii, uppercase_ascii, compare, equal]; + runtime.caml_register_global(8, Stdlib_Char, "Stdlib__Char"); + return; + } + (globalThis)); + +//# 2257 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_uchar_ml = "uchar.ml", + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + err_no_pred = "U+0000 has no predecessor", + err_no_succ = "U+10FFFF has no successor", + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + _d_ = [0, cst_uchar_ml, 88, 18], + _c_ = [0, cst_uchar_ml, 91, 7], + _b_ = [0, cst_uchar_ml, 80, 18], + _a_ = [0, cst_uchar_ml, 85, 7], + cst_is_not_a_latin1_character = " is not a latin1 character", + cst_U = "U+", + cst_is_not_an_Unicode_scalar_v = " is not an Unicode scalar value", + min = 0, + max = 1114111, + lo_bound = 55295, + hi_bound = 57344, + bom = 65279, + rep = 65533; + function succ(u){ + return u === 55295 + ? hi_bound + : u === 1114111 ? caml_call1(Stdlib[1], err_no_succ) : u + 1 | 0; + } + function pred(u){ + return u === 57344 + ? lo_bound + : u === 0 ? caml_call1(Stdlib[1], err_no_pred) : u - 1 | 0; + } + function is_valid(i){ + var _o_ = 0 <= i ? 1 : 0, _p_ = _o_ ? i <= 55295 ? 1 : 0 : _o_; + if(_p_) + var _q_ = _p_; + else + var _r_ = 57344 <= i ? 1 : 0, _q_ = _r_ ? i <= 1114111 ? 1 : 0 : _r_; + return _q_; + } + function of_int(i){ + if(is_valid(i)) return i; + var + _n_ = + caml_call2 + (Stdlib[28], caml_format_int("%X", i), cst_is_not_an_Unicode_scalar_v); + return caml_call1(Stdlib[1], _n_); + } + function is_char(u){return u < 256 ? 1 : 0;} + function of_char(c){return c;} + function to_char(u){ + if(255 >= u) return u; + var + _l_ = + caml_call2 + (Stdlib[28], + caml_format_int("%04X", u), + cst_is_not_a_latin1_character), + _m_ = caml_call2(Stdlib[28], cst_U, _l_); + return caml_call1(Stdlib[1], _m_); + } + function unsafe_to_char(_k_){return _k_;} + function equal(_j_, _i_){return _j_ === _i_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function hash(_h_){return _h_;} + function utf_decode_is_valid(d){return 1 === (d >>> 27 | 0) ? 1 : 0;} + function utf_decode_length(d){return (d >>> 24 | 0) & 7;} + function utf_decode_uchar(d){return d & 16777215;} + function utf_decode(n, u){return (8 | n) << 24 | u;} + function utf_decode_invalid(n){return n << 24 | 65533;} + function utf_8_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u) return 1; + if(2047 >= u) return 2; + if(65535 >= u) return 3; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return 4; + } + function utf_16_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u) return 2; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 4; + } + function _e_(_g_){return _g_;} + var + Stdlib_Uchar = + [0, + min, + max, + bom, + rep, + succ, + pred, + is_valid, + of_int, + function(_f_){return _f_;}, + _e_, + is_char, + of_char, + to_char, + unsafe_to_char, + equal, + compare, + hash, + utf_decode_is_valid, + utf_decode_uchar, + utf_decode_length, + utf_decode, + utf_decode_invalid, + utf_8_byte_length, + utf_16_byte_length]; + runtime.caml_register_global(13, Stdlib_Uchar, "Stdlib__Uchar"); + return; + } + (globalThis)); + +//# 2393 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_List_nth$1 = "List.nth", + caml_compare = runtime.caml_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_List_map2 = "List.map2", + cst_List_iter2 = "List.iter2", + cst_List_fold_left2 = "List.fold_left2", + cst_List_fold_right2 = "List.fold_right2", + cst_List_for_all2 = "List.for_all2", + cst_List_exists2 = "List.exists2", + _b_ = [0, 0, 0], + cst_List_combine = "List.combine", + cst_List_rev_map2 = "List.rev_map2", + cst_List_init = "List.init", + cst_List_nth$0 = cst_List_nth$1, + cst_nth = "nth", + cst_List_nth = cst_List_nth$1, + cst_tl = "tl", + cst_hd = "hd"; + function length(l$0){ + var len = 0, param = l$0; + for(;;){ + if(! param) return len; + var l = param[2], len$0 = len + 1 | 0, len = len$0, param = l; + } + } + function cons(a, l){return [0, a, l];} + function hd(param){ + if(! param) return caml_call1(Stdlib[2], cst_hd); + var a = param[1]; + return a; + } + function tl(param){ + if(! param) return caml_call1(Stdlib[2], cst_tl); + var l = param[2]; + return l; + } + function nth(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return caml_call1(Stdlib[2], cst_nth); + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return a; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function nth_opt(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth$0); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0; + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + var append = Stdlib[37]; + function rev_append(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + a = l1$0[1], + l2$1 = [0, a, l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function rev(l){return rev_append(l, 0);} + function init_aux(i, n, f){ + if(n <= i) return 0; + var r = caml_call1(f, i); + return [0, r, init_aux(i + 1 | 0, n, f)]; + } + var rev_init_threshold = typeof Stdlib_Sys[5] === "number" ? 10000 : 50; + function init(len, f){ + if(0 > len) return caml_call1(Stdlib[1], cst_List_init); + if(rev_init_threshold >= len) return init_aux(0, len, f); + var acc = 0, i = 0; + for(;;){ + if(len <= i) return rev(acc); + var + i$0 = i + 1 | 0, + acc$0 = [0, caml_call1(f, i), acc], + acc = acc$0, + i = i$0; + } + } + function flatten(param){ + if(! param) return 0; + var r = param[2], l = param[1], _J_ = flatten(r); + return caml_call2(Stdlib[37], l, _J_); + } + function map(f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call1(f, a); + return [0, r, map(f, l)]; + } + function _a_(i, f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call2(f, i, a); + return [0, r, _a_(i + 1 | 0, f, l)]; + } + function mapi(f, l){return _a_(0, f, l);} + function rev_map(f, l){ + var accu = 0, param = l; + for(;;){ + if(! param) return accu; + var + l$0 = param[2], + a = param[1], + accu$0 = [0, caml_call1(f, a), accu], + accu = accu$0, + param = l$0; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + caml_call1(f, a); + var param$0 = l; + } + } + function iteri(f, l$0){ + var i = 0, param = l$0; + for(;;){ + if(! param) return 0; + var l = param[2], a = param[1]; + caml_call2(f, i, a); + var i$0 = i + 1 | 0, i = i$0, param = l; + } + } + function fold_left(f, accu, l){ + var accu$0 = accu, l$0 = l; + for(;;){ + if(! l$0) return accu$0; + var + l$1 = l$0[2], + a = l$0[1], + accu$1 = caml_call2(f, accu$0, a), + accu$0 = accu$1, + l$0 = l$1; + } + } + function fold_right(f, l, accu){ + if(! l) return accu; + var l$0 = l[2], a = l[1]; + return caml_call2(f, a, fold_right(f, l$0, accu)); + } + function map2(f, l1, l2){ + if(l1){ + if(l2){ + var + l2$0 = l2[2], + a2 = l2[1], + l1$0 = l1[2], + a1 = l1[1], + r = caml_call2(f, a1, a2); + return [0, r, map2(f, l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_map2); + } + function rev_map2(f, l1, l2){ + var accu = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$0 = [0, caml_call2(f, a1, a2), accu], + accu = accu$0, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu; + return caml_call1(Stdlib[1], cst_List_rev_map2); + } + } + function iter2(f, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var l2$1 = l2$0[2], a2 = l2$0[1], l1$1 = l1$0[2], a1 = l1$0[1]; + caml_call2(f, a1, a2); + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_iter2); + } + } + function fold_left2(f, accu, l1, l2){ + var accu$0 = accu, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$1 = caml_call3(f, accu$0, a1, a2), + accu$0 = accu$1, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu$0; + return caml_call1(Stdlib[1], cst_List_fold_left2); + } + } + function fold_right2(f, l1, l2, accu){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return caml_call3(f, a1, a2, fold_right2(f, l1$0, l2$0, accu)); + } + } + else if(! l2) return accu; + return caml_call1(Stdlib[1], cst_List_fold_right2); + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var l = param$0[2], a = param$0[1], _I_ = caml_call1(p, a); + if(! _I_) return _I_; + var param$0 = l; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _H_ = caml_call1(p, a); + if(_H_) return _H_; + var param$0 = l; + } + } + function for_all2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _G_ = caml_call2(p, a1, a2); + if(! _G_) return _G_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return caml_call1(Stdlib[1], cst_List_for_all2); + } + } + function exists2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _F_ = caml_call2(p, a1, a2); + if(_F_) return _F_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_exists2); + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1], + _E_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_E_) return _E_; + var param$0 = l; + } + } + function memq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _D_ = a === x ? 1 : 0; + if(_D_) return _D_; + var param$0 = l; + } + } + function assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return b; + var param$0 = l; + } + } + function assoc_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return [0, b]; + var param$0 = l; + } + } + function assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return b; + var param$0 = l; + } + } + function assq_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return [0, b]; + var param$0 = l; + } + } + function mem_assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1][1], + _C_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_C_) return _C_; + var param$0 = l; + } + } + function mem_assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1][1], _B_ = a === x ? 1 : 0; + if(_B_) return _B_; + var param$0 = l; + } + } + function remove_assoc(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return 0 === caml_compare(a, x) ? l : [0, pair, remove_assoc(x, l)]; + } + function remove_assq(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return a === x ? l : [0, pair, remove_assq(x, l)]; + } + function find(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return x; + var param$0 = l; + } + } + function find_opt(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return [0, x]; + var param$0 = l; + } + } + function find_map(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1], result = caml_call1(f, x); + if(result) return result; + var param$0 = l; + } + } + function find_all(p){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1]; + if(caml_call1(p, x)){ + var accu$1 = [0, x, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function filteri(p, l){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + acc$0 = caml_call2(p, i, x) ? [0, x, acc] : acc, + i$0 = i + 1 | 0, + i = i$0, + acc = acc$0, + param = l$0; + } + } + function filter_map(f){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1], match = caml_call1(f, x); + if(match){ + var v = match[1], accu$1 = [0, v, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function concat_map(f, l){ + var acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + xs = caml_call1(f, x), + acc$0 = rev_append(xs, acc), + acc = acc$0, + param = l$0; + } + } + function fold_left_map(f, accu, l){ + var accu$0 = accu, l_accu = 0, param = l; + for(;;){ + if(! param) return [0, accu$0, rev(l_accu)]; + var + l$0 = param[2], + x = param[1], + match = caml_call2(f, accu$0, x), + x$0 = match[2], + accu$1 = match[1], + l_accu$0 = [0, x$0, l_accu], + accu$0 = accu$1, + l_accu = l_accu$0, + param = l$0; + } + } + function partition(p, l){ + var yes = 0, no = 0, param = l; + for(;;){ + if(! param){var _A_ = rev(no); return [0, rev(yes), _A_];} + var l$0 = param[2], x = param[1]; + if(caml_call1(p, x)){ + var yes$0 = [0, x, yes], yes = yes$0, param = l$0; + continue; + } + var no$0 = [0, x, no], no = no$0, param = l$0; + } + } + function partition_map(p, l){ + var left = 0, right = 0, param = l; + for(;;){ + if(! param){var _z_ = rev(right); return [0, rev(left), _z_];} + var l$0 = param[2], x = param[1], match = caml_call1(p, x); + if(0 === match[0]){ + var v = match[1], left$0 = [0, v, left], left = left$0, param = l$0; + continue; + } + var + v$0 = match[1], + right$0 = [0, v$0, right], + right = right$0, + param = l$0; + } + } + function split(param){ + if(! param) return _b_; + var + l = param[2], + match = param[1], + y = match[2], + x = match[1], + match$0 = split(l), + ry = match$0[2], + rx = match$0[1]; + return [0, [0, x, rx], [0, y, ry]]; + } + function combine(l1, l2){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return [0, [0, a1, a2], combine(l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_combine); + } + function merge(cmp, l1, l2){ + if(! l1) return l2; + if(! l2) return l1; + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + return 0 < caml_call2(cmp, h1, h2) + ? [0, h2, merge(cmp, l1, t2)] + : [0, h1, merge(cmp, t1, l2)]; + } + function stable_sort(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x2, [0, x1, 0]] + : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _y_ = l[2]; + if(_y_){ + var match$2 = _y_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _y_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x1$0, [0, x2$0, [0, x3, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h1, accu], l1 = t1, accu = accu$0; + continue; + } + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var _x_ = rev_append(l1, accu); + } + else + var _x_ = rev_append(l2, accu); + return [0, _x_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x1, [0, x2, 0]] + : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _w_ = l[2]; + if(_w_){ + var match$2 = _w_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _w_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x1$0, [0, x2$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h2, accu], l2 = t2, accu = accu$0; + continue; + } + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var _v_ = rev_append(l1, accu); + } + else + var _v_ = rev_append(l2, accu); + return [0, _v_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function sort_uniq(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 <= c$0 ? [0, x2, [0, x1, 0]] : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _p_ = l[2]; + if(_p_){ + var match$2 = _p_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _p_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _q_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 <= c$2 ? [0, x3, [0, x2$0, 0]] : [0, x2$0, [0, x3, 0]], + s$0 = _q_; + else if(0 <= c$1){ + var c$3 = caml_call2(cmp, x1$0, x3); + if(0 === c$3) + var _r_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 <= c$3) + var + c$4 = caml_call2(cmp, x2$0, x3), + _s_ = + 0 === c$4 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + <= c$4 + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]], + _r_ = _s_; + else + var _r_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + var s$0 = _r_; + } + else{ + var c$5 = caml_call2(cmp, x2$0, x3); + if(0 === c$5) + var _t_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 <= c$5) + var + c$6 = caml_call2(cmp, x1$0, x3), + _u_ = + 0 === c$6 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + <= c$6 + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]], + _t_ = _u_; + else + var _t_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + var s$0 = _t_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 < c){ + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var accu$2 = [0, h2, accu], l2 = t2, accu = accu$2; + continue; + } + var _o_ = rev_append(l1, accu); + } + else + var _o_ = rev_append(l2, accu); + return [0, _o_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 < c$0 ? [0, x1, [0, x2, 0]] : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _i_ = l[2]; + if(_i_){ + var match$2 = _i_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _i_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _j_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 < c$2 ? [0, x2$0, [0, x3, 0]] : [0, x3, [0, x2$0, 0]], + s$0 = _j_; + else if(0 < c$1){ + var c$3 = caml_call2(cmp, x2$0, x3); + if(0 === c$3) + var _k_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 < c$3) + var _k_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + else + var + c$4 = caml_call2(cmp, x1$0, x3), + _l_ = + 0 === c$4 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + < c$4 + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]], + _k_ = _l_; + var s$0 = _k_; + } + else{ + var c$5 = caml_call2(cmp, x1$0, x3); + if(0 === c$5) + var _m_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 < c$5) + var _m_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + else + var + c$6 = caml_call2(cmp, x2$0, x3), + _n_ = + 0 === c$6 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + < c$6 + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]], + _m_ = _n_; + var s$0 = _m_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 <= c){ + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var accu$2 = [0, h1, accu], l1 = t1, accu = accu$2; + continue; + } + var _h_ = rev_append(l1, accu); + } + else + var _h_ = rev_append(l2, accu); + return [0, _h_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function compare_lengths(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + if(! l2$0) return 1; + var l2$1 = l2$0[2], l1$1 = l1$0[2], l1$0 = l1$1, l2$0 = l2$1; + } + } + function compare_length_with(l, n){ + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0 === n$0 ? 0 : 0 < n$0 ? -1 : 1; + var l$1 = l$0[2]; + if(0 >= n$0) return 1; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function equal(eq, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _g_ = caml_call2(eq, a1, a2); + if(! _g_) return _g_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return 0; + } + } + function compare(cmp, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + var l1$1 = l1$0[2], a1 = l1$0[1]; + if(! l2$0) return 1; + var l2$1 = l2$0[2], a2 = l2$0[1], c = caml_call2(cmp, a1, a2); + if(0 !== c) return c; + var l1$0 = l1$1, l2$0 = l2$1; + } + } + function to_seq(l){ + function aux(l, param){ + if(! l) return 0; + var tail = l[2], x = l[1]; + return [0, x, function(_f_){return aux(tail, _f_);}]; + } + return function(_e_){return aux(l, _e_);}; + } + function of_seq(seq){ + function direct(depth, seq){ + if(0 === depth){ + var _c_ = 0, _d_ = function(acc, x){return [0, x, acc];}; + return rev(caml_call3(Stdlib_Seq[5], _d_, _c_, seq)); + } + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + return [0, x, direct(depth - 1 | 0, next)]; + } + return direct(500, seq); + } + var + Stdlib_List = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + flatten, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + find_all, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + stable_sort, + stable_sort, + stable_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(18, Stdlib_List, "Stdlib__List"); + return; + } + (globalThis)); + +//# 3492 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, zero = 0, one = 1, minus_one = -1; + function abs(x){return 0 <= x ? x : - x | 0;} + var max_int = 2147483647, min_int = -2147483648; + function lognot(x){return x ^ -1;} + function equal(_b_, _a_){return _b_ === _a_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function min(x, y){return x <= y ? x : y;} + function max(x, y){return y <= x ? x : y;} + function to_string(x){return "" + x;} + var + Stdlib_Int = + [0, + zero, + one, + minus_one, + abs, + max_int, + min_int, + lognot, + equal, + compare, + min, + max, + to_string]; + runtime.caml_register_global(1, Stdlib_Int, "Stdlib__Int"); + return; + } + (globalThis)); + +//# 3525 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_bytes_ml = "bytes.ml", + cst_index_out_of_bounds$3 = "index out of bounds", + caml_blit_bytes = runtime.caml_blit_bytes, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_get16 = runtime.caml_bytes_get16, + caml_bytes_get32 = runtime.caml_bytes_get32, + caml_bytes_get64 = runtime.caml_bytes_get64, + caml_bytes_of_string = runtime.caml_bytes_of_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fill_bytes = runtime.caml_fill_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Char = global_data.Stdlib__Char, + cst_index_out_of_bounds$2 = cst_index_out_of_bounds$3, + _f_ = [0, cst_bytes_ml, 820, 20], + _e_ = [0, cst_bytes_ml, 831, 9], + cst_index_out_of_bounds$1 = cst_index_out_of_bounds$3, + cst_index_out_of_bounds$0 = cst_index_out_of_bounds$3, + _d_ = [0, cst_bytes_ml, 766, 20], + _c_ = [0, cst_bytes_ml, 777, 9], + cst_index_out_of_bounds = cst_index_out_of_bounds$3, + _b_ = [0, cst_bytes_ml, 654, 20], + _a_ = [0, cst_bytes_ml, 679, 9], + cst_Bytes_of_seq_cannot_grow_b = "Bytes.of_seq: cannot grow bytes", + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_Bytes_concat = "Bytes.concat", + cst_String_blit_Bytes_blit_str = "String.blit / Bytes.blit_string", + cst_Bytes_blit = "Bytes.blit", + cst_String_fill_Bytes_fill = "String.fill / Bytes.fill", + cst_Bytes_extend = "Bytes.extend", + cst_String_sub_Bytes_sub = "String.sub / Bytes.sub"; + function make(n, c){ + var s = caml_create_bytes(n); + caml_fill_bytes(s, 0, n, c); + return s; + } + function init(n, f){ + var s = caml_create_bytes(n), _aq_ = n - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + caml_bytes_unsafe_set(s, i, caml_call1(f, i)); + var _ar_ = i + 1 | 0; + if(_aq_ !== i){var i = _ar_; continue;} + break; + } + } + return s; + } + var empty = caml_create_bytes(0); + function copy(s){ + var len = caml_ml_bytes_length(s), r = caml_create_bytes(len); + caml_blit_bytes(s, 0, r, 0, len); + return r; + } + function to_string(b){return caml_string_of_bytes(copy(b));} + function of_string(s){return copy(caml_bytes_of_string(s));} + function sub(s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs){ + var r = caml_create_bytes(len); + caml_blit_bytes(s, ofs, r, 0, len); + return r; + } + return caml_call1(Stdlib[1], cst_String_sub_Bytes_sub); + } + function sub_string(b, ofs, len){ + return caml_string_of_bytes(sub(b, ofs, len)); + } + function symbol(a, b){ + var + c = a + b | 0, + _ao_ = b < 0 ? 1 : 0, + match = c < 0 ? 1 : 0, + switch$0 = 0; + if(a < 0){ + if(_ao_ && ! match) switch$0 = 1; + } + else if(! _ao_ && match) switch$0 = 1; + return switch$0 ? caml_call1(Stdlib[1], cst_Bytes_extend) : c; + } + function extend(s, left, right){ + var + len = symbol(symbol(caml_ml_bytes_length(s), left), right), + r = caml_create_bytes(len); + if(0 <= left) + var dstoff = left, srcoff = 0; + else + var dstoff = 0, srcoff = - left | 0; + var + cpylen = + caml_call2 + (Stdlib_Int[10], + caml_ml_bytes_length(s) - srcoff | 0, + len - dstoff | 0); + if(0 < cpylen) caml_blit_bytes(s, srcoff, r, dstoff, cpylen); + return r; + } + function fill(s, ofs, len, c){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_fill_bytes(s, ofs, len, c); + return caml_call1(Stdlib[1], cst_String_fill_Bytes_fill); + } + function blit(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (caml_ml_bytes_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return caml_blit_bytes(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_Bytes_blit); + } + function blit_string(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (runtime.caml_ml_string_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return runtime.caml_blit_string(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_String_blit_Bytes_blit_str); + } + function iter(f, a){ + var _am_ = caml_ml_bytes_length(a) - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, caml_bytes_unsafe_get(a, i)); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iteri(f, a){ + var _aj_ = caml_ml_bytes_length(a) - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, i, caml_bytes_unsafe_get(a, i)); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function concat(sep, l){ + if(! l) return empty; + var seplen = caml_ml_bytes_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_bytes_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Bytes_concat), + acc = acc$0, + param = tl; + continue; + } + var _ah_ = caml_ml_bytes_length(hd) + acc | 0; + } + else + var _ah_ = acc; + var dst = caml_create_bytes(_ah_), pos = pos$1, param$0 = l; + for(;;){ + if(! param$0) return dst; + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + caml_blit_bytes + (sep, 0, dst, pos + caml_ml_bytes_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_bytes_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + return dst; + } + } + } + function cat(s1, s2){ + var + l1 = caml_ml_bytes_length(s1), + l2 = caml_ml_bytes_length(s2), + r = caml_create_bytes(l1 + l2 | 0); + caml_blit_bytes(s1, 0, r, 0, l1); + caml_blit_bytes(s2, 0, r, l1, l2); + return r; + } + function is_space(param){ + var _ag_ = param - 9 | 0, switch$0 = 0; + if(4 < _ag_ >>> 0){ + if(23 === _ag_) switch$0 = 1; + } + else if(2 !== _ag_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + var len = caml_ml_bytes_length(s), i = [0, 0]; + for(;;){ + if(i[1] < len && is_space(caml_bytes_unsafe_get(s, i[1]))){i[1]++; continue;} + var j = [0, len - 1 | 0]; + for(;;){ + if(i[1] <= j[1] && is_space(caml_bytes_unsafe_get(s, j[1]))){j[1] += -1; continue;} + return i[1] <= j[1] ? sub(s, i[1], (j[1] - i[1] | 0) + 1 | 0) : empty; + } + } + } + function unsafe_escape(s){ + var n = [0, 0], _$_ = caml_ml_bytes_length(s) - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i$0 = ___; + for(;;){ + var match = caml_bytes_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _ad_ = match - 34 | 0, switch$1 = 0; + if(58 < _ad_ >>> 0){ + if(93 > _ad_) switch$1 = 1; + } + else if(56 < _ad_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _ae_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){ + case 0: + var _ae_ = 4; break; + case 1: + var _ae_ = 2; break; + } + n[1] = n[1] + _ae_ | 0; + var _af_ = i$0 + 1 | 0; + if(_$_ !== i$0){var i$0 = _af_; continue;} + break; + } + } + if(n[1] === caml_ml_bytes_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _ab_ = caml_ml_bytes_length(s) - 1 | 0, _aa_ = 0; + if(_ab_ >= 0){ + var i = _aa_; + for(;;){ + var c = caml_bytes_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c / 100 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c % 10 | 0) | 0); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _ac_ = i + 1 | 0; + if(_ab_ !== i){var i = _ac_; continue;} + break; + } + } + return s$0; + } + function escaped(b){var b$0 = copy(b); return unsafe_escape(b$0);} + function map(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _Y_ = l - 1 | 0, _X_ = 0; + if(_Y_ >= 0){ + var i = _X_; + for(;;){ + caml_bytes_unsafe_set(r, i, caml_call1(f, caml_bytes_unsafe_get(s, i))); + var _Z_ = i + 1 | 0; + if(_Y_ !== i){var i = _Z_; continue;} + break; + } + } + return r; + } + function mapi(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _V_ = l - 1 | 0, _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + caml_bytes_unsafe_set + (r, i, caml_call2(f, i, caml_bytes_unsafe_get(s, i))); + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _S_ = caml_ml_bytes_length(a) - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + r[1] = caml_call2(f, r[1], caml_bytes_unsafe_get(a, i)); + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _P_ = caml_ml_bytes_length(a) - 1 | 0; + if(_P_ >= 0){ + var i = _P_; + for(;;){ + r[1] = caml_call2(f, caml_bytes_unsafe_get(a, i), r[1]); + var _Q_ = i - 1 | 0; + if(0 !== i){var i = _Q_; continue;} + break; + } + } + return r[1]; + } + function exists(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, caml_bytes_unsafe_get(s, i))) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, caml_bytes_unsafe_get(s, i))) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function uppercase_ascii(s){return map(Stdlib_Char[4], s);} + function lowercase_ascii(s){return map(Stdlib_Char[3], s);} + function apply1(f, s){ + if(0 === caml_ml_bytes_length(s)) return s; + var r = copy(s); + caml_bytes_unsafe_set(r, 0, caml_call1(f, caml_bytes_unsafe_get(s, 0))); + return r; + } + function capitalize_ascii(s){return apply1(Stdlib_Char[4], s);} + function uncapitalize_ascii(s){return apply1(Stdlib_Char[3], s);} + function starts_with(prefix, s){ + var + len_s = caml_ml_bytes_length(s), + len_pre = caml_ml_bytes_length(prefix), + _O_ = len_pre <= len_s ? 1 : 0; + if(! _O_) return _O_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_bytes_unsafe_get(s, i) !== caml_bytes_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_bytes_length(s), + len_suf = caml_ml_bytes_length(suffix), + diff = len_s - len_suf | 0, + _N_ = 0 <= diff ? 1 : 0; + if(! _N_) return _N_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_bytes_unsafe_get(s, diff + i | 0) + !== caml_bytes_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_bytes_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_bytes_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _L_ = 1; return _L_;} + catch(_M_){ + var _K_ = caml_wrap_exception(_M_); + if(_K_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_K_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_bytes_length(s) > i) + try{rindex_rec(s, i, c); var _I_ = 1; return _I_;} + catch(_J_){ + var _H_ = caml_wrap_exception(_J_); + if(_H_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_H_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + var compare = runtime.caml_bytes_compare; + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_bytes_length(s)], + _D_ = caml_ml_bytes_length(s) - 1 | 0; + if(_D_ >= 0){ + var i = _D_; + for(;;){ + if(caml_bytes_unsafe_get(s, i) === sep){ + var _F_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _F_]; + j[1] = i; + } + var _G_ = i - 1 | 0; + if(0 !== i){var i = _G_; continue;} + break; + } + } + var _E_ = r[1]; + return [0, sub(s, 0, j[1]), _E_]; + } + function to_seq(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _B_ = i + 1 | 0; + return [0, x, function(_C_){return aux(_B_, _C_);}]; + } + var _z_ = 0; + return function(_A_){return aux(_z_, _A_);}; + } + function to_seqi(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _x_ = i + 1 | 0; + return [0, [0, i, x], function(_y_){return aux(_x_, _y_);}]; + } + var _v_ = 0; + return function(_w_){return aux(_v_, _w_);}; + } + function of_seq(i){ + var n = [0, 0], buf = [0, make(256, 0)]; + function _u_(c){ + if(n[1] === caml_ml_bytes_length(buf[1])){ + var + new_len = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(buf[1]) | 0, + Stdlib_Sys[12]); + if(caml_ml_bytes_length(buf[1]) === new_len) + caml_call1(Stdlib[2], cst_Bytes_of_seq_cannot_grow_b); + var new_buf = make(new_len, 0); + blit(buf[1], 0, new_buf, 0, n[1]); + buf[1] = new_buf; + } + caml_bytes_set(buf[1], n[1], c); + n[1]++; + return 0; + } + caml_call2(Stdlib_Seq[4], _u_, i); + return sub(buf[1], 0, n[1]); + } + function unsafe_get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function unsafe_get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int8(b, i){ + var _s_ = Stdlib_Sys[10] - 8 | 0, _t_ = Stdlib_Sys[10] - 8 | 0; + return caml_bytes_get(b, i) << _t_ >> _s_; + } + function get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int16_ne(b, i){ + var _q_ = Stdlib_Sys[10] - 16 | 0, _r_ = Stdlib_Sys[10] - 16 | 0; + return caml_bytes_get16(b, i) << _r_ >> _q_; + } + function get_int16_le(b, i){ + var _o_ = Stdlib_Sys[10] - 16 | 0, _p_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_le(b, i) << _p_ >> _o_; + } + function get_int16_be(b, i){ + var _m_ = Stdlib_Sys[10] - 16 | 0, _n_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_be(b, i) << _n_ >> _m_; + } + function get_int32_le(b, i){ + return Stdlib_Sys[11] + ? caml_int32_bswap(caml_bytes_get32(b, i)) + : caml_bytes_get32(b, i); + } + function get_int32_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get32(b, i) + : caml_int32_bswap(caml_bytes_get32(b, i)); + } + function get_int64_le(b, i){ + return Stdlib_Sys[11] + ? caml_int64_bswap(caml_bytes_get64(b, i)) + : caml_bytes_get64(b, i); + } + function get_int64_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get64(b, i) + : caml_int64_bswap(caml_bytes_get64(b, i)); + } + function unsafe_set_uint16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function unsafe_set_uint16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function set_int16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int32_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, caml_int32_bswap(x)) + : caml_bytes_set32(b, i, x); + } + function set_int32_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, x) + : caml_bytes_set32(b, i, caml_int32_bswap(x)); + } + function set_int64_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, caml_int64_bswap(x)) + : caml_bytes_set64(b, i, x); + } + function set_int64_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, x) + : caml_bytes_set64(b, i, caml_int64_bswap(x)); + } + var + set_uint8 = caml_bytes_set, + set_uint16_ne = caml_bytes_set16, + dec_invalid = Stdlib_Uchar[22]; + function dec_ret(n, u){ + var _l_ = caml_call1(Stdlib_Uchar[9], u); + return caml_call2(Stdlib_Uchar[21], n, _l_); + } + function not_in_x80_to_xBF(b){return 2 !== (b >>> 6 | 0) ? 1 : 0;} + function not_in_xA0_to_xBF(b){return 5 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x80_to_x9F(b){return 4 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x90_to_xBF(b){ + var _j_ = b < 144 ? 1 : 0, _k_ = _j_ || (191 < b ? 1 : 0); + return _k_; + } + function not_in_x80_to_x8F(b){return 8 !== (b >>> 4 | 0) ? 1 : 0;} + function utf_8_uchar_3(b0, b1, b2){ + return (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; + } + function utf_8_uchar_4(b0, b1, b2, b3){ + return (b0 & 7) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; + } + function get_utf_8_uchar(b, i){ + var b0 = caml_bytes_get(b, i), max = caml_ml_bytes_length(b) - 1 | 0; + if(224 <= b0){ + var switch$0 = 0; + if(237 <= b0){ + if(245 > b0) + switch(b0 - 237 | 0){ + case 0: + var i$0 = i + 1 | 0; + if(max < i$0) return caml_call1(dec_invalid, 1); + var b1 = caml_bytes_unsafe_get(b, i$0); + if(not_in_x80_to_x9F(b1)) return caml_call1(dec_invalid, 1); + var i$1 = i$0 + 1 | 0; + if(max < i$1) return caml_call1(dec_invalid, 2); + var b2 = caml_bytes_unsafe_get(b, i$1); + return not_in_x80_to_xBF(b2) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1, b2)); + case 3: + var i$4 = i + 1 | 0; + if(max < i$4) return caml_call1(dec_invalid, 1); + var b1$1 = caml_bytes_unsafe_get(b, i$4); + if(not_in_x90_to_xBF(b1$1)) return caml_call1(dec_invalid, 1); + var i$5 = i$4 + 1 | 0; + if(max < i$5) return caml_call1(dec_invalid, 2); + var b2$1 = caml_bytes_unsafe_get(b, i$5); + if(not_in_x80_to_xBF(b2$1)) return caml_call1(dec_invalid, 2); + var i$6 = i$5 + 1 | 0; + if(max < i$6) return caml_call1(dec_invalid, 3); + var b3 = caml_bytes_unsafe_get(b, i$6); + return not_in_x80_to_xBF(b3) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$1, b2$1, b3)); + case 7: + var i$10 = i + 1 | 0; + if(max < i$10) return caml_call1(dec_invalid, 1); + var b1$3 = caml_bytes_unsafe_get(b, i$10); + if(not_in_x80_to_x8F(b1$3)) return caml_call1(dec_invalid, 1); + var i$11 = i$10 + 1 | 0; + if(max < i$11) return caml_call1(dec_invalid, 2); + var b2$3 = caml_bytes_unsafe_get(b, i$11); + if(not_in_x80_to_xBF(b2$3)) return caml_call1(dec_invalid, 2); + var i$12 = i$11 + 1 | 0; + if(max < i$12) return caml_call1(dec_invalid, 3); + var b3$1 = caml_bytes_unsafe_get(b, i$12); + return not_in_x80_to_xBF(b3$1) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$3, b2$3, b3$1)); + case 1: + case 2: + switch$0 = 1; break; + default: + var i$7 = i + 1 | 0; + if(max < i$7) return caml_call1(dec_invalid, 1); + var b1$2 = caml_bytes_unsafe_get(b, i$7); + if(not_in_x80_to_xBF(b1$2)) return caml_call1(dec_invalid, 1); + var i$8 = i$7 + 1 | 0; + if(max < i$8) return caml_call1(dec_invalid, 2); + var b2$2 = caml_bytes_unsafe_get(b, i$8); + if(not_in_x80_to_xBF(b2$2)) return caml_call1(dec_invalid, 2); + var i$9 = i$8 + 1 | 0; + if(max < i$9) return caml_call1(dec_invalid, 3); + var b3$0 = caml_bytes_unsafe_get(b, i$9); + return not_in_x80_to_xBF(b3$0) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$2, b2$2, b3$0)); + } + } + else{ + if(225 > b0){ + var i$13 = i + 1 | 0; + if(max < i$13) return caml_call1(dec_invalid, 1); + var b1$4 = caml_bytes_unsafe_get(b, i$13); + if(not_in_xA0_to_xBF(b1$4)) return caml_call1(dec_invalid, 1); + var i$14 = i$13 + 1 | 0; + if(max < i$14) return caml_call1(dec_invalid, 2); + var b2$4 = caml_bytes_unsafe_get(b, i$14); + return not_in_x80_to_xBF(b2$4) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$4, b2$4)); + } + switch$0 = 1; + } + if(switch$0){ + var i$2 = i + 1 | 0; + if(max < i$2) return caml_call1(dec_invalid, 1); + var b1$0 = caml_bytes_unsafe_get(b, i$2); + if(not_in_x80_to_xBF(b1$0)) return caml_call1(dec_invalid, 1); + var i$3 = i$2 + 1 | 0; + if(max < i$3) return caml_call1(dec_invalid, 2); + var b2$0 = caml_bytes_unsafe_get(b, i$3); + return not_in_x80_to_xBF(b2$0) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$0, b2$0)); + } + } + else{ + if(128 > b0) return dec_ret(1, b0); + if(194 <= b0){ + var i$15 = i + 1 | 0; + if(max < i$15) return caml_call1(dec_invalid, 1); + var b1$5 = caml_bytes_unsafe_get(b, i$15); + return not_in_x80_to_xBF(b1$5) + ? caml_call1(dec_invalid, 1) + : dec_ret(2, (b0 & 31) << 6 | b1$5 & 63); + } + } + return caml_call1(dec_invalid, 1); + } + function set_utf_8_uchar(b, i, u){ + function set(_i_, _h_, _g_){ + caml_bytes_unsafe_set(_i_, _h_, _g_); + return 0; + } + var + max = caml_ml_bytes_length(b) - 1 | 0, + u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u$0){caml_bytes_set(b, i, u$0); return 1;} + if(2047 >= u$0){ + var last$1 = i + 1 | 0; + return max < last$1 + ? 0 + : (caml_bytes_set + (b, i, 192 | u$0 >>> 6 | 0), + set(b, last$1, 128 | u$0 & 63), + 2); + } + if(65535 >= u$0){ + var last$0 = i + 2 | 0; + return max < last$0 + ? 0 + : (caml_bytes_set + (b, i, 224 | u$0 >>> 12 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last$0, 128 | u$0 & 63), + 3); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var last = i + 3 | 0; + return max < last + ? 0 + : (caml_bytes_set + (b, i, 240 | u$0 >>> 18 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 12 | 0) & 63), + set(b, i + 2 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last, 128 | u$0 & 63), + 4); + } + function is_valid_utf_8(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + var match = caml_bytes_unsafe_get(b, i); + if(224 <= match){ + var switch$0 = 0; + if(237 <= match){ + if(245 > match) + switch(match - 237 | 0){ + case 0: + var last = i + 2 | 0; + if + (max >= last + && + ! + not_in_x80_to_x9F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last))){var i$0 = last + 1 | 0, i = i$0; continue;} + return 0; + case 3: + var last$1 = i + 3 | 0; + if + (max >= last$1 + && + ! + not_in_x90_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$1))){var i$2 = last$1 + 1 | 0, i = i$2; continue;} + return 0; + case 7: + var last$3 = i + 3 | 0; + if + (max >= last$3 + && + ! + not_in_x80_to_x8F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$3))){var i$4 = last$3 + 1 | 0, i = i$4; continue;} + return 0; + case 1: + case 2: + switch$0 = 1; break; + default: + var last$2 = i + 3 | 0; + if + (max >= last$2 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$2))){var i$3 = last$2 + 1 | 0, i = i$3; continue;} + return 0; + } + } + else{ + if(225 > match){ + var last$4 = i + 2 | 0; + if + (max >= last$4 + && + ! + not_in_xA0_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$4))){var i$5 = last$4 + 1 | 0, i = i$5; continue;} + return 0; + } + switch$0 = 1; + } + if(switch$0){ + var last$0 = i + 2 | 0; + if + (max >= last$0 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$0))){var i$1 = last$0 + 1 | 0, i = i$1; continue;} + return 0; + } + } + else{ + if(128 > match){var i$7 = i + 1 | 0, i = i$7; continue;} + if(194 <= match){ + var last$5 = i + 1 | 0; + if + (max >= last$5 + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$5))){var i$6 = last$5 + 1 | 0, i = i$6; continue;} + return 0; + } + } + return 0; + } + } + function get_utf_16be_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_be(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds); + } + function set_utf_16be_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_be(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_be(b, i, hi); + unsafe_set_uint16_be(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$0); + } + function is_valid_utf_16be(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_be(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + function get_utf_16le_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_le(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$1); + } + function set_utf_16le_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_le(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_le(b, i, hi); + unsafe_set_uint16_le(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$2); + } + function is_valid_utf_16le(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_le(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + var + Stdlib_Bytes = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + runtime.caml_bytes_equal, + starts_with, + ends_with, + caml_string_of_bytes, + caml_bytes_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + caml_bytes_get, + get_int8, + caml_bytes_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + caml_bytes_get32, + get_int32_be, + get_int32_le, + caml_bytes_get64, + get_int64_be, + get_int64_le, + set_uint8, + caml_bytes_set, + set_uint16_ne, + set_int16_be, + set_int16_le, + caml_bytes_set16, + set_int16_be, + set_int16_le, + caml_bytes_set32, + set_int32_be, + set_int32_le, + caml_bytes_set64, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(30, Stdlib_Bytes, "Stdlib__Bytes"); + return; + } + (globalThis)); + +//# 4733 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$0 = "", + caml_blit_string = runtime.caml_blit_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_hash = runtime.caml_string_hash, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + empty = cst$0, + Stdlib = global_data.Stdlib, + Stdlib_Bytes = global_data.Stdlib__Bytes, + bts = Stdlib_Bytes[44], + bos = Stdlib_Bytes[45], + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_String_concat = "String.concat"; + function make(n, c){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[1], n, c)); + } + function init(n, f){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[2], n, f)); + } + var of_bytes = Stdlib_Bytes[6], to_bytes = Stdlib_Bytes[5]; + function sub(s, ofs, len){ + var _X_ = caml_call1(bos, s); + return caml_call1(bts, caml_call3(Stdlib_Bytes[7], _X_, ofs, len)); + } + var blit = Stdlib_Bytes[12]; + function concat(sep, l){ + if(! l) return cst; + var seplen = caml_ml_string_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_string_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_String_concat), + acc = acc$0, + param = tl; + continue; + } + var _W_ = caml_ml_string_length(hd) + acc | 0; + } + else + var _W_ = acc; + var dst = runtime.caml_create_bytes(_W_), pos = pos$1, param$0 = l; + for(;;){ + if(param$0){ + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + caml_blit_string + (sep, 0, dst, pos + caml_ml_string_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_string_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + } + return caml_call1(bts, dst); + } + } + } + var cat = Stdlib[28]; + function iter(f, s){ + var _U_ = caml_ml_string_length(s) - 1 | 0, _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_call1(f, caml_string_unsafe_get(s, i)); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return 0; + } + function iteri(f, s){ + var _R_ = caml_ml_string_length(s) - 1 | 0, _Q_ = 0; + if(_R_ >= 0){ + var i = _Q_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(s, i)); + var _S_ = i + 1 | 0; + if(_R_ !== i){var i = _S_; continue;} + break; + } + } + return 0; + } + function map(f, s){ + var _P_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[17], f, _P_)); + } + function mapi(f, s){ + var _O_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[18], f, _O_)); + } + function fold_right(f, x, a){ + var _N_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[20], f, _N_, a); + } + function fold_left(f, a, x){ + var _M_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[19], f, a, _M_); + } + function exists(f, s){ + var _L_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[22], f, _L_); + } + function for_all(f, s){ + var _K_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[21], f, _K_); + } + function is_space(param){ + var _J_ = param - 9 | 0, switch$0 = 0; + if(4 < _J_ >>> 0){ + if(23 === _J_) switch$0 = 1; + } + else if(2 !== _J_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + if(caml_string_equal(s, cst$0)) return s; + if + (! + is_space(caml_string_unsafe_get(s, 0)) + && + ! + is_space(caml_string_unsafe_get(s, caml_ml_string_length(s) - 1 | 0))) + return s; + var _I_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[23], _I_)); + } + function escaped(s){ + var b = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[87], b)); + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_string_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_string_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) + return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _G_ = 1; return _G_;} + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_F_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_string_length(s) > i) + try{rindex_rec(s, i, c); var _D_ = 1; return _D_;} + catch(_E_){ + var _C_ = caml_wrap_exception(_E_); + if(_C_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_C_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + function uppercase_ascii(s){ + var _B_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[36], _B_)); + } + function lowercase_ascii(s){ + var _A_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[37], _A_)); + } + function capitalize_ascii(s){ + var _z_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[38], _z_)); + } + function uncapitalize_ascii(s){ + var _y_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[39], _y_)); + } + function starts_with(prefix, s){ + var + len_s = caml_ml_string_length(s), + len_pre = caml_ml_string_length(prefix), + _x_ = len_pre <= len_s ? 1 : 0; + if(! _x_) return _x_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_string_unsafe_get(s, i) !== caml_string_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_string_length(s), + len_suf = caml_ml_string_length(suffix), + diff = len_s - len_suf | 0, + _w_ = 0 <= diff ? 1 : 0; + if(! _w_) return _w_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_string_unsafe_get(s, diff + i | 0) + !== caml_string_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function hash(x){return caml_string_hash(0, x);} + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_string_length(s)], + _s_ = caml_ml_string_length(s) - 1 | 0; + if(_s_ >= 0){ + var i = _s_; + for(;;){ + if(caml_string_unsafe_get(s, i) === sep){ + var _u_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _u_]; + j[1] = i; + } + var _v_ = i - 1 | 0; + if(0 !== i){var i = _v_; continue;} + break; + } + } + var _t_ = r[1]; + return [0, sub(s, 0, j[1]), _t_]; + } + var compare = runtime.caml_string_compare; + function to_seq(s){ + var _r_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[47], _r_); + } + function to_seqi(s){ + var _q_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[48], _q_); + } + function of_seq(g){ + return caml_call1(bts, caml_call1(Stdlib_Bytes[49], g)); + } + function get_utf_8_uchar(s, i){ + var _p_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[50], _p_, i); + } + function is_valid_utf_8(s){ + var _o_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[52], _o_); + } + function get_utf_16be_uchar(s, i){ + var _n_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[53], _n_, i); + } + function is_valid_utf_16be(s){ + var _m_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[55], _m_); + } + function get_utf_16le_uchar(s, i){ + var _l_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[56], _l_, i); + } + function is_valid_utf_16le(s){ + var _k_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[58], _k_); + } + function get_int8(s, i){ + var _j_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[60], _j_, i); + } + function get_uint16_le(s, i){ + var _i_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[63], _i_, i); + } + function get_uint16_be(s, i){ + var _h_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[62], _h_, i); + } + function get_int16_ne(s, i){ + var _g_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[64], _g_, i); + } + function get_int16_le(s, i){ + var _f_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[66], _f_, i); + } + function get_int16_be(s, i){ + var _e_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[65], _e_, i); + } + function get_int32_le(s, i){ + var _d_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[69], _d_, i); + } + function get_int32_be(s, i){ + var _c_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[68], _c_, i); + } + function get_int64_le(s, i){ + var _b_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[72], _b_, i); + } + function get_int64_be(s, i){ + var _a_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[71], _a_, i); + } + var + Stdlib_String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + caml_string_equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + runtime.caml_string_get, + get_int8, + runtime.caml_string_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + runtime.caml_string_get32, + hash, + caml_string_hash, + get_int32_be, + get_int32_le, + runtime.caml_string_get64, + get_int64_be, + get_int64_le]; + runtime.caml_register_global(12, Stdlib_String, "Stdlib__String"); + return; + } + (globalThis)); + +//# 5208 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = "()"; + function equal(param, _b_){return 1;} + function compare(param, _a_){return 0;} + function to_string(param){return cst;} + var Stdlib_Unit = [0, equal, compare, to_string]; + runtime.caml_register_global(1, Stdlib_Unit, "Stdlib__Unit"); + return; + } + (globalThis)); + +//# 5286 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_array_sub = runtime.caml_array_sub, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Floatarray = [0], + _a_ = [0, "array.ml", 319, 4], + cst_Array_combine = "Array.combine", + cst_Array_exists2 = "Array.exists2", + cst_Array_for_all2 = "Array.for_all2", + cst_Array_map2_arrays_must_hav = + "Array.map2: arrays must have the same length", + cst_Array_iter2_arrays_must_ha = + "Array.iter2: arrays must have the same length", + cst_Array_blit = "Array.blit", + cst_Array_fill = "Array.fill", + cst_Array_sub = "Array.sub", + cst_Array_init = "Array.init", + cst_Stdlib_Array_Bottom = "Stdlib.Array.Bottom"; + function init(l, f){ + if(0 === l) return [0]; + if(0 > l) return caml_call1(Stdlib[1], cst_Array_init); + var res = caml_make_vect(l, caml_call1(f, 0)), _as_ = l - 1 | 0, _ar_ = 1; + if(_as_ >= 1){ + var i = _ar_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _at_ = i + 1 | 0; + if(_as_ !== i){var i = _at_; continue;} + break; + } + } + return res; + } + function make_matrix(sx, sy, init){ + var res = caml_make_vect(sx, [0]), _ap_ = sx - 1 | 0, _ao_ = 0; + if(_ap_ >= 0){ + var x = _ao_; + for(;;){ + res[1 + x] = caml_make_vect(sy, init); + var _aq_ = x + 1 | 0; + if(_ap_ !== x){var x = _aq_; continue;} + break; + } + } + return res; + } + function copy(a){ + var l = a.length - 1; + return 0 === l ? [0] : caml_array_sub(a, 0, l); + } + function append(a1, a2){ + var l1 = a1.length - 1; + return 0 === l1 + ? copy(a2) + : 0 + === a2.length - 1 + ? caml_array_sub(a1, 0, l1) + : runtime.caml_array_append(a1, a2); + } + function sub(a, ofs, len){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return caml_array_sub(a, ofs, len); + return caml_call1(Stdlib[1], cst_Array_sub); + } + function fill(a, ofs, len, v){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return runtime.caml_array_fill(a, ofs, len, v); + return caml_call1(Stdlib[1], cst_Array_fill); + } + function blit(a1, ofs1, a2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (a1.length - 1 - len | 0) >= ofs1 + && 0 <= ofs2 && (a2.length - 1 - len | 0) >= ofs2) + return runtime.caml_array_blit(a1, ofs1, a2, ofs2, len); + return caml_call1(Stdlib[1], cst_Array_blit); + } + function iter(f, a){ + var _am_ = a.length - 1 - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, a[1 + i]); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Array_iter2_arrays_must_ha); + var _aj_ = a.length - 1 - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call1(f, a[1])), + _ag_ = l - 1 | 0, + _af_ = 1; + if(_ag_ >= 1){ + var i = _af_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _ah_ = i + 1 | 0; + if(_ag_ !== i){var i = _ah_; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Array_map2_arrays_must_hav); + if(0 === la) return [0]; + var + r = caml_make_vect(la, caml_call2(f, a[1], b[1])), + _ad_ = la - 1 | 0, + _ac_ = 1; + if(_ad_ >= 1){ + var i = _ac_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call2(f, 0, a[1])), + _Z_ = l - 1 | 0, + _Y_ = 1; + if(_Z_ >= 1){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function to_list(a){ + var i$1 = a.length - 1 - 1 | 0, i = i$1, res = 0; + for(;;){ + if(0 > i) return res; + var res$0 = [0, a[1 + i], res], i$0 = i - 1 | 0, i = i$0, res = res$0; + } + } + function list_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + t = param$0[2], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = t; + } + } + function of_list(l){ + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + a = caml_make_vect(list_length(0, l), hd), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i + 1 | 0, i = i$0, param = tl$0; + } + } + function fold_left(f, x, a){ + var r = [0, x], _W_ = a.length - 1 - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r[1]; + } + function fold_left_map(f, acc, input_array){ + var len = input_array.length - 1; + if(0 === len) return [0, acc, [0]]; + var + match = caml_call2(f, acc, input_array[1]), + elt = match[2], + acc$0 = match[1], + output_array = caml_make_vect(len, elt), + acc$1 = [0, acc$0], + _T_ = len - 1 | 0, + _S_ = 1; + if(_T_ >= 1){ + var i = _S_; + for(;;){ + var + match$0 = caml_call2(f, acc$1[1], input_array[1 + i]), + elt$0 = match$0[2], + acc$2 = match$0[1]; + acc$1[1] = acc$2; + output_array[1 + i] = elt$0; + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return [0, acc$1[1], output_array]; + } + function fold_right(f, a, x){ + var r = [0, x], _Q_ = a.length - 1 - 1 | 0; + if(_Q_ >= 0){ + var i = _Q_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _R_ = i - 1 | 0; + if(0 !== i){var i = _R_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_for_all2); + var i = 0; + for(;;){ + if(i === n1) return 1; + if(! caml_call2(p, l1[1 + i], l2[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function exists2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_exists2); + var i = 0; + for(;;){ + if(i === n1) return 0; + if(caml_call2(p, l1[1 + i], l2[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === runtime.caml_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function memq(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x === a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_opt(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var x = a[1 + i]; + if(caml_call1(p, x)) return [0, x]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_map(f, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var r = caml_call1(f, a[1 + i]); + if(r) return r; + var i$0 = i + 1 | 0, i = i$0; + } + } + function split(x){ + if(runtime.caml_equal(x, [0])) return [0, [0], [0]]; + var + match = x[1], + b0 = match[2], + a0 = match[1], + n = x.length - 1, + a = caml_make_vect(n, a0), + b = caml_make_vect(n, b0), + _O_ = n - 1 | 0, + _N_ = 1; + if(_O_ >= 1){ + var i = _N_; + for(;;){ + var match$0 = x[1 + i], bi = match$0[2], ai = match$0[1]; + a[1 + i] = ai; + b[1 + i] = bi; + var _P_ = i + 1 | 0; + if(_O_ !== i){var i = _P_; continue;} + break; + } + } + return [0, a, b]; + } + function combine(a, b){ + var na = a.length - 1, nb = b.length - 1; + if(na !== nb) caml_call1(Stdlib[1], cst_Array_combine); + if(0 === na) return [0]; + var x = caml_make_vect(na, [0, a[1], b[1]]), _L_ = na - 1 | 0, _K_ = 1; + if(_L_ >= 1){ + var i = _K_; + for(;;){ + x[1 + i] = [0, a[1 + i], b[1 + i]]; + var _M_ = i + 1 | 0; + if(_L_ !== i){var i = _M_; continue;} + break; + } + } + return x; + } + var Bottom = [248, cst_Stdlib_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + var _D_ = i31 + 1 | 0, _E_ = caml_check_bound(a, _D_)[1 + _D_]; + if(caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _E_) < 0) + x[1] = i31 + 1 | 0; + var + _F_ = i31 + 2 | 0, + _G_ = caml_check_bound(a, _F_)[1 + _F_], + _H_ = x[1]; + if(caml_call2(cmp, caml_check_bound(a, _H_)[1 + _H_], _G_) < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if((i31 + 1 | 0) < l){ + var _I_ = i31 + 1 | 0, _J_ = caml_check_bound(a, _I_)[1 + _I_]; + if(0 > caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _J_)) + return i31 + 1 | 0; + } + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _x_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_x_ >= 0){ + var i$6 = _x_; + for(;;){ + var e$1 = caml_check_bound(a, i$6)[1 + i$6]; + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_check_bound(a, j)[1 + j], e$1)){ + var _u_ = caml_check_bound(a, j)[1 + j]; + caml_check_bound(a, i)[1 + i] = _u_; + var i = j; + continue; + } + caml_check_bound(a, i)[1 + i] = e$1; + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_check_bound(a, i$0)[1 + i$0] = e$1; + } + var _C_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _C_; continue;} + break; + } + } + var _y_ = l - 1 | 0; + if(_y_ >= 2){ + var i$4 = _y_; + a: + for(;;){ + var e$0 = caml_check_bound(a, i$4)[1 + i$4]; + a[1 + i$4] = caml_check_bound(a, 0)[1]; + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1), _v_ = caml_check_bound(a, j$0)[1 + j$0]; + caml_check_bound(a, i$1)[1 + i$1] = _v_; + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(0 <= caml_call2(cmp, caml_check_bound(a, father)[1 + father], e$0)) + caml_check_bound(a, i$3)[1 + i$3] = e$0; + else{ + var _w_ = caml_check_bound(a, father)[1 + father]; + caml_check_bound(a, i$3)[1 + i$3] = _w_; + if(0 < father){var i$3 = father; continue;} + caml_check_bound(a, 0)[1] = e$0; + } + var _B_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _B_; continue a;} + break; + } + } + break; + } + } + var _z_ = 1 < l ? 1 : 0; + if(_z_){ + var e = caml_check_bound(a, 1)[2]; + a[2] = caml_check_bound(a, 0)[1]; + a[1] = e; + var _A_ = 0; + } + else + var _A_ = _z_; + return _A_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_check_bound(src2, src2ofs)[1 + src2ofs], + s1$1 = caml_check_bound(a, src1ofs)[1 + src1ofs], + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_check_bound(dst, d)[1 + d] = s2; + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_check_bound(src2, i2$0)[1 + i2$0], + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_check_bound(dst, d)[1 + d] = s1; + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_check_bound(a, i1$0)[1 + i1$0], + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _m_ = len - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + a: + for(;;){ + var + _n_ = srcofs + i | 0, + e = caml_check_bound(a, _n_)[1 + _n_], + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if(dstofs <= j[1]){ + var _o_ = j[1]; + if(0 < caml_call2(cmp, caml_check_bound(dst, _o_)[1 + _o_], e)){ + var + _p_ = j[1], + _q_ = caml_check_bound(dst, _p_)[1 + _p_], + _r_ = j[1] + 1 | 0; + caml_check_bound(dst, _r_)[1 + _r_] = _q_; + j[1] += -1; + continue; + } + } + var _s_ = j[1] + 1 | 0; + caml_check_bound(dst, _s_)[1 + _s_] = e; + var _t_ = i + 1 | 0; + if(_m_ !== i){var i = _t_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var + l1 = l / 2 | 0, + l2 = l - l1 | 0, + t = caml_make_vect(l2, caml_check_bound(a, 0)[1]); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _j_ = i + 1 | 0; + return [0, x, function(_k_){return aux(_j_, _k_);}]; + } + var _h_ = 0; + return function(_i_){return aux(_h_, _i_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _f_ = i + 1 | 0; + return [0, [0, i, x], function(_g_){return aux(_f_, _g_);}]; + } + var _d_ = 0; + return function(_e_){return aux(_d_, _e_);}; + } + function of_seq(i$2){ + var _b_ = 0; + function _c_(acc, x){return [0, x, acc];} + var l = caml_call3(Stdlib_Seq[5], _c_, _b_, i$2); + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + len = list_length(0, l), + a = caml_make_vect(len, hd), + i$1 = len - 2 | 0, + i = i$1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i - 1 | 0, i = i$0, param = tl$0; + } + } + var + Stdlib_Array = + [0, + init, + make_matrix, + append, + runtime.caml_array_concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(14, Stdlib_Array, "Stdlib__Array"); + return; + } + (globalThis)); + +//# 5961 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Float_array_blit$1 = "Float.array.blit", + cst_float_ml = "float.ml", + caml_array_get = runtime.caml_array_get, + caml_array_set = runtime.caml_array_set, + caml_float_compare = runtime.caml_float_compare, + caml_floatarray_blit = runtime.caml_floatarray_blit, + caml_floatarray_create = runtime.caml_floatarray_create, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_nextafter_float = runtime.caml_nextafter_float, + caml_signbit_float = runtime.caml_signbit_float, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + _b_ = [0, cst_float_ml, 395, 6], + cst_Float_Array_map2_arrays_mu = + "Float.Array.map2: arrays must have the same length", + cst_Float_Array_iter2_arrays_m = + "Float.Array.iter2: arrays must have the same length", + cst_Float_array_blit = cst_Float_array_blit$1, + cst_Float_array_blit$0 = cst_Float_array_blit$1, + cst_Float_Array_fill = "Float.Array.fill", + cst_Float_Array_sub = "Float.Array.sub", + _a_ = [0, cst_float_ml, 222, 14], + cst_Float_Array_concat = "Float.Array.concat", + cst_Float_Array_init = "Float.Array.init", + cst_Stdlib_Float_Array_Bottom = "Stdlib.Float.Array.Bottom", + zero = 0., + one = 1., + minus_one = -1.; + function is_finite(x){return x - x == 0. ? 1 : 0;} + function is_infinite(x){return 1. / x == 0. ? 1 : 0;} + function is_nan(x){return x != x ? 1 : 0;} + var + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon = Stdlib[27], + of_string_opt = Stdlib[36], + to_string = Stdlib[35], + pi = 3.141592653589793; + function is_integer(x){ + var _aq_ = x == runtime.caml_trunc_float(x) ? 1 : 0; + return _aq_ ? is_finite(x) : _aq_; + } + function succ(x){return caml_nextafter_float(x, infinity);} + function pred(x){return caml_nextafter_float(x, neg_infinity);} + function equal(x, y){return 0 === caml_float_compare(x, y) ? 1 : 0;} + function min(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? x : y; + } + return y != y ? y : x; + } + function max(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? y : x; + } + return x != x ? x : y; + } + function min_max(x, y){ + if(x == x && y == y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + return [0, nan, nan]; + } + function min_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? x : y; + } + return x != x ? y : x; + } + function max_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? y : x; + } + return y != y ? x : y; + } + function min_max_num(x, y){ + if(x != x) return [0, y, y]; + if(y != y) return [0, x, x]; + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + function hash(x){return runtime.caml_hash(10, 100, 0, x);} + function unsafe_fill(a, ofs, len, v){ + var _ao_ = (ofs + len | 0) - 1 | 0; + if(_ao_ >= ofs){ + var i = ofs; + for(;;){ + a[1 + i] = v; + var _ap_ = i + 1 | 0; + if(_ao_ !== i){var i = _ap_; continue;} + break; + } + } + return 0; + } + function check(a, ofs, len, msg){ + var _ak_ = ofs < 0 ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else{ + var _am_ = len < 0 ? 1 : 0; + if(_am_) + var _al_ = _am_; + else + var + _an_ = (ofs + len | 0) < 0 ? 1 : 0, + _al_ = _an_ || (a.length - 1 < (ofs + len | 0) ? 1 : 0); + } + return _al_ ? caml_call1(Stdlib[1], msg) : _al_; + } + function make(n, v){ + var result = caml_floatarray_create(n); + unsafe_fill(result, 0, n, v); + return result; + } + function init(l, f){ + if(0 > l) return caml_call1(Stdlib[1], cst_Float_Array_init); + var res = caml_floatarray_create(l), _ai_ = l - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _aj_ = i + 1 | 0; + if(_ai_ !== i){var i = _aj_; continue;} + break; + } + } + return res; + } + function append(a1, a2){ + var + l1 = a1.length - 1, + l2 = a2.length - 1, + result = caml_floatarray_create(l1 + l2 | 0); + caml_floatarray_blit(a1, 0, result, 0, l1); + caml_floatarray_blit(a2, 0, result, l1, l2); + return result; + } + function concat(l){ + var acc = 0, param = l; + for(;;){ + if(param){ + var + tl = param[2], + hd = param[1], + x = hd.length - 1 + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Float_Array_concat), + acc = acc$0, + param = tl; + continue; + } + var result = caml_floatarray_create(acc), l$0 = l, i = 0; + for(;;){ + if(l$0){ + var tl$0 = l$0[2], hd$0 = l$0[1], hlen = hd$0.length - 1; + caml_floatarray_blit(hd$0, 0, result, i, hlen); + var i$0 = i + hlen | 0, l$0 = tl$0, i = i$0; + continue; + } + if(i === acc) return result; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + } + function sub(a, ofs, len){ + check(a, ofs, len, cst_Float_Array_sub); + var result = caml_floatarray_create(len); + caml_floatarray_blit(a, ofs, result, 0, len); + return result; + } + function copy(a){ + var l = a.length - 1, result = caml_floatarray_create(l); + caml_floatarray_blit(a, 0, result, 0, l); + return result; + } + function fill(a, ofs, len, v){ + check(a, ofs, len, cst_Float_Array_fill); + return unsafe_fill(a, ofs, len, v); + } + function blit(src, sofs, dst, dofs, len){ + check(src, sofs, len, cst_Float_array_blit); + check(dst, dofs, len, cst_Float_array_blit$0); + return caml_floatarray_blit(src, sofs, dst, dofs, len); + } + function to_list(a){ + function _af_(_ag_){return a[1 + _ag_];} + return caml_call2(Stdlib_List[10], a.length - 1, _af_); + } + function of_list(l){ + var + result = caml_floatarray_create(caml_call1(Stdlib_List[1], l)), + i = 0, + l$0 = l; + for(;;){ + if(! l$0) return result; + var t = l$0[2], h = l$0[1]; + result[1 + i] = h; + var i$0 = i + 1 | 0, i = i$0, l$0 = t; + } + } + function iter(f, a){ + var _ad_ = a.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + caml_call1(f, a[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Float_Array_iter2_arrays_m); + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Z_ = l - 1 | 0, + _Y_ = 0; + if(_Z_ >= 0){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Float_Array_map2_arrays_mu); + var r = caml_floatarray_create(la), _W_ = la - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _T_ = a.length - 1 - 1 | 0, _S_ = 0; + if(_T_ >= 0){ + var i = _S_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Q_ = l - 1 | 0, + _P_ = 0; + if(_Q_ >= 0){ + var i = _P_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var _R_ = i + 1 | 0; + if(_Q_ !== i){var i = _R_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _N_ = a.length - 1 - 1 | 0, _M_ = 0; + if(_N_ >= 0){ + var i = _M_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _O_ = i + 1 | 0; + if(_N_ !== i){var i = _O_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _K_ = a.length - 1 - 1 | 0; + if(_K_ >= 0){ + var i = _K_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _L_ = i - 1 | 0; + if(0 !== i){var i = _L_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === caml_float_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem_ieee(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x == a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + var + Bottom = [248, cst_Stdlib_Float_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + if + (caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0)) + < 0) + x[1] = i31 + 1 | 0; + if + (caml_call2 + (cmp, caml_array_get(a, x[1]), caml_array_get(a, i31 + 2 | 0)) + < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if + ((i31 + 1 | 0) < l + && + 0 + > + caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0))) + return i31 + 1 | 0; + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _E_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_E_ >= 0){ + var i$6 = _E_; + for(;;){ + var e$1 = caml_array_get(a, i$6); + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_array_get(a, j), e$1)){ + caml_array_set(a, i, caml_array_get(a, j)); + var i = j; + continue; + } + caml_array_set(a, i, e$1); + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_array_set(a, i$0, e$1); + } + var _J_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _J_; continue;} + break; + } + } + var _F_ = l - 1 | 0; + if(_F_ >= 2){ + var i$4 = _F_; + a: + for(;;){ + var e$0 = caml_array_get(a, i$4); + caml_array_set(a, i$4, caml_array_get(a, 0)); + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1); + caml_array_set(a, i$1, caml_array_get(a, j$0)); + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(0 <= caml_call2(cmp, caml_array_get(a, father), e$0)) + caml_array_set(a, i$3, e$0); + else{ + caml_array_set(a, i$3, caml_array_get(a, father)); + if(0 < father){var i$3 = father; continue;} + caml_array_set(a, 0, e$0); + } + var _I_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _I_; continue a;} + break; + } + } + break; + } + } + var _G_ = 1 < l ? 1 : 0; + if(_G_){ + var e = caml_array_get(a, 1); + caml_array_set(a, 1, caml_array_get(a, 0)); + var _H_ = caml_array_set(a, 0, e); + } + else + var _H_ = _G_; + return _H_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_array_get(src2, src2ofs), + s1$1 = caml_array_get(a, src1ofs), + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_array_set(dst, d, s2); + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_array_get(src2, i2$0), + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_array_set(dst, d, s1); + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_array_get(a, i1$0), + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _C_ = len - 1 | 0, _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + a: + for(;;){ + var + e = caml_array_get(a, srcofs + i | 0), + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if + (dstofs <= j[1] && 0 < caml_call2(cmp, caml_array_get(dst, j[1]), e)){ + caml_array_set(dst, j[1] + 1 | 0, caml_array_get(dst, j[1])); + j[1] += -1; + continue; + } + caml_array_set(dst, j[1] + 1 | 0, e); + var _D_ = i + 1 | 0; + if(_C_ !== i){var i = _D_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var l1 = l / 2 | 0, l2 = l - l1 | 0, t = caml_floatarray_create(l2); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _z_ = i + 1 | 0; + return [0, x, function(_A_){return aux(_z_, _A_);}]; + } + var _x_ = 0; + return function(_y_){return aux(_x_, _y_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _v_ = i + 1 | 0; + return [0, [0, i, x], function(_w_){return aux(_v_, _w_);}]; + } + var _t_ = 0; + return function(_u_){return aux(_t_, _u_);}; + } + function of_seq(i$2){ + var _r_ = 0; + function _s_(acc, x){return [0, x, acc];} + var + l = caml_call3(Stdlib_Seq[5], _s_, _r_, i$2), + len = caml_call1(Stdlib_List[1], l), + a = caml_floatarray_create(len), + i$1 = len - 1 | 0, + i = i$1, + param = l; + for(;;){ + if(! param) return a; + var tl = param[2], hd = param[1]; + a[1 + i] = hd; + var i$0 = i - 1 | 0, i = i$0, param = tl; + } + } + function map_to_array(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = runtime.caml_make_vect(l, caml_call1(f, a[1])), + _p_ = l - 1 | 0, + _o_ = 1; + if(_p_ >= 1){ + var i = _o_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return r; + } + function map_from_array(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _m_ = l - 1 | 0, + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return r; + } + var + _c_ = caml_floatarray_create, + _d_ = caml_array_set, + _e_ = caml_array_get, + _f_ = + [0, + function(_k_){return _k_.length - 1;}, + _e_, + _d_, + make, + _c_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _g_ = caml_floatarray_create, + _h_ = caml_array_set, + _i_ = caml_array_get, + Stdlib_Float = + [0, + zero, + one, + minus_one, + succ, + pred, + infinity, + neg_infinity, + nan, + pi, + max_float, + min_float, + epsilon, + is_finite, + is_infinite, + is_nan, + is_integer, + of_string_opt, + to_string, + caml_float_compare, + equal, + min, + max, + min_max, + min_num, + max_num, + min_max_num, + hash, + [0, + function(_j_){return _j_.length - 1;}, + _i_, + _h_, + make, + _g_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _f_]; + runtime.caml_register_global(22, Stdlib_Float, "Stdlib__Float"); + return; + } + (globalThis)); + +//# 6723 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "int32.ml", 69, 6], + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var min_int = -2147483648, max_int = 2147483647; + function lognot(n){return n ^ -1;} + var _a_ = Stdlib_Sys[9]; + if(32 === _a_) + var + max_int$0 = Stdlib[19], + unsigned_to_int = + function(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + }; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var unsigned_to_int = function(n){return [0, n & -1];}; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _d_ = [0, runtime.caml_int_of_string(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n + 2147483648 | 0, m + 2147483648 | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Int32 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(14, Stdlib_Int32, "Stdlib__Int32"); + return; + } + (globalThis)); + +//# 6815 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_sub = runtime.caml_int64_sub, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + zero = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + one = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + minus_one = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + min_int = runtime.caml_int64_create_lo_mi_hi(0, 0, 32768), + max_int = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Stdlib = global_data.Stdlib, + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function succ(n){return runtime.caml_int64_add(n, _a_);} + function pred(n){return caml_int64_sub(n, _b_);} + function abs(n){ + return caml_greaterequal(n, _c_) ? n : runtime.caml_int64_neg(n); + } + function lognot(n){return runtime.caml_int64_xor(n, _d_);} + var max_int$0 = runtime.caml_int64_of_int32(Stdlib[19]); + function unsigned_to_int(n){ + if + (0 >= caml_int64_compare(zero, n) + && 0 >= caml_int64_compare(n, max_int$0)) + return [0, runtime.caml_int64_to_int32(n)]; + return 0; + } + function to_string(n){return runtime.caml_int64_format("%d", n);} + function of_string_opt(s){ + try{var _f_ = [0, runtime.caml_int64_of_string(s)]; return _f_;} + catch(_g_){ + var _e_ = caml_wrap_exception(_g_); + if(_e_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_e_, 0); + } + } + function compare(x, y){return caml_int64_compare(x, y);} + function equal(x, y){return 0 === caml_int64_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int64_compare + (caml_int64_sub(n, min_int), caml_int64_sub(m, min_int)); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, zero)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var + q = + runtime.caml_int64_shift_left + (runtime.caml_int64_div + (runtime.caml_int64_shift_right_unsigned(n, 1), d), + 1), + r = caml_int64_sub(n, caml_int64_mul(q, d)); + return 0 <= unsigned_compare(r, d) ? succ(q) : q; + } + function unsigned_rem(n, d){ + return caml_int64_sub(n, caml_int64_mul(unsigned_div(n, d), d)); + } + var + Stdlib_Int64 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(11, Stdlib_Int64, "Stdlib__Int64"); + return; + } + (globalThis)); + +//# 6912 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var + size = Stdlib_Sys[9], + min_int = 1 << (size - 1 | 0), + max_int = min_int - 1 | 0; + function lognot(n){return n ^ -1;} + var max_int$0 = Stdlib[19]; + function unsigned_to_int(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _b_ = [0, runtime.caml_int_of_string(s)]; return _b_;} + catch(_c_){ + var _a_ = caml_wrap_exception(_c_); + if(_a_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_a_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n - min_int | 0, m - min_int | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Nativeint = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + size, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(12, Stdlib_Nativeint, "Stdlib__Nativeint"); + return; + } + (globalThis)); + +//# 6997 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = "", + caml_bytes_get = runtime.caml_bytes_get, + caml_check_bound = runtime.caml_check_bound, + caml_create_bytes = runtime.caml_create_bytes, + caml_ml_bytes_length = runtime.caml_ml_bytes_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + dummy_pos = [0, cst, 0, 0, -1], + zero_pos = [0, cst, 1, 0, 0], + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + cst_Lexing_lex_refill_cannot_g = "Lexing.lex_refill: cannot grow buffer"; + function engine(tbl, state, buf){ + var + result = runtime.caml_lex_engine(tbl, state, buf), + _F_ = 0 <= result ? 1 : 0, + _G_ = _F_ ? buf[12] !== dummy_pos ? 1 : 0 : _F_; + if(_G_){ + buf[11] = buf[12]; + var _H_ = buf[12]; + buf[12] = [0, _H_[1], _H_[2], _H_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function new_engine(tbl, state, buf){ + var + result = runtime.caml_new_lex_engine(tbl, state, buf), + _C_ = 0 <= result ? 1 : 0, + _D_ = _C_ ? buf[12] !== dummy_pos ? 1 : 0 : _C_; + if(_D_){ + buf[11] = buf[12]; + var _E_ = buf[12]; + buf[12] = [0, _E_[1], _E_[2], _E_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function from_function(opt, read_fun){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _o_ = with_positions ? zero_pos : dummy_pos, + _p_ = with_positions ? zero_pos : dummy_pos, + aux_buffer = caml_create_bytes(512), + _q_ = [0], + _r_ = 0, + _s_ = 0, + _t_ = 0, + _u_ = 0, + _v_ = 0, + _w_ = 0, + _x_ = 0, + _y_ = caml_create_bytes(1024); + return [0, + function(lexbuf){ + var + read = + caml_call2 + (read_fun, aux_buffer, caml_ml_bytes_length(aux_buffer)), + n = 0 < read ? read : (lexbuf[9] = 1, 0); + if(caml_ml_bytes_length(lexbuf[2]) < (lexbuf[3] + n | 0)){ + if + (((lexbuf[3] - lexbuf[5] | 0) + n | 0) + <= caml_ml_bytes_length(lexbuf[2])) + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + lexbuf[2], + 0, + lexbuf[3] - lexbuf[5] | 0); + else{ + var + newlen = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(lexbuf[2]) | 0, + Stdlib_Sys[12]); + if(newlen < ((lexbuf[3] - lexbuf[5] | 0) + n | 0)) + caml_call1(Stdlib[2], cst_Lexing_lex_refill_cannot_g); + var newbuf = caml_create_bytes(newlen); + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + newbuf, + 0, + lexbuf[3] - lexbuf[5] | 0); + lexbuf[2] = newbuf; + } + var s = lexbuf[5]; + lexbuf[4] = lexbuf[4] + s | 0; + lexbuf[6] = lexbuf[6] - s | 0; + lexbuf[5] = 0; + lexbuf[7] = lexbuf[7] - s | 0; + lexbuf[3] = lexbuf[3] - s | 0; + var t = lexbuf[10], _A_ = t.length - 1 - 1 | 0, _z_ = 0; + if(_A_ >= 0){ + var i = _z_; + for(;;){ + var v = caml_check_bound(t, i)[1 + i]; + if(0 <= v) caml_check_bound(t, i)[1 + i] = v - s | 0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + } + caml_call5 + (Stdlib_Bytes[11], aux_buffer, 0, lexbuf[2], lexbuf[3], n); + lexbuf[3] = lexbuf[3] + n | 0; + return 0; + }, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_]; + } + function from_channel(with_positions, ic){ + return from_function + (with_positions, + function(buf, n){return caml_call4(Stdlib[84], ic, buf, 0, n);}); + } + function from_string(opt, s){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _d_ = with_positions ? zero_pos : dummy_pos, + _e_ = with_positions ? zero_pos : dummy_pos, + _f_ = [0], + _g_ = 1, + _h_ = 0, + _i_ = 0, + _j_ = 0, + _k_ = 0, + _l_ = 0, + _m_ = runtime.caml_ml_string_length(s), + _n_ = caml_call1(Stdlib_Bytes[5], s); + return [0, + function(lexbuf){lexbuf[9] = 1; return 0;}, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_, + _f_, + _e_, + _d_]; + } + function set_position(lexbuf, position){ + lexbuf[12] = [0, lexbuf[12][1], position[2], position[3], position[4]]; + lexbuf[4] = position[4]; + return 0; + } + function set_filename(lexbuf, fname){ + var _c_ = lexbuf[12]; + lexbuf[12] = [0, fname, _c_[2], _c_[3], _c_[4]]; + return 0; + } + function with_positions(lexbuf){return lexbuf[12] !== dummy_pos ? 1 : 0;} + function lexeme(lexbuf){ + var len = lexbuf[6] - lexbuf[5] | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], lexbuf[5], len); + } + function sub_lexeme(lexbuf, i1, i2){ + var len = i2 - i1 | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len); + } + function sub_lexeme_opt(lexbuf, i1, i2){ + if(0 > i1) return 0; + var len = i2 - i1 | 0; + return [0, caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len)]; + } + function sub_lexeme_char(lexbuf, i){return caml_bytes_get(lexbuf[2], i);} + function sub_lexeme_char_opt(lexbuf, i){ + return 0 <= i ? [0, caml_bytes_get(lexbuf[2], i)] : 0; + } + function lexeme_char(lexbuf, i){ + return caml_bytes_get(lexbuf[2], lexbuf[5] + i | 0); + } + function lexeme_start(lexbuf){return lexbuf[11][4];} + function lexeme_end(lexbuf){return lexbuf[12][4];} + function lexeme_start_p(lexbuf){return lexbuf[11];} + function lexeme_end_p(lexbuf){return lexbuf[12];} + function new_line(lexbuf){ + var + lcp = lexbuf[12], + _a_ = lcp !== dummy_pos ? 1 : 0, + _b_ = + _a_ + ? (lexbuf[12] = [0, lcp[1], lcp[2] + 1 | 0, lcp[4], lcp[4]], 0) + : _a_; + return _b_; + } + function flush_input(lb){ + lb[6] = 0; + lb[4] = 0; + var lcp = lb[12]; + if(lcp !== dummy_pos) + lb[12] = [0, lcp[1], zero_pos[2], zero_pos[3], zero_pos[4]]; + lb[3] = 0; + return 0; + } + var + Stdlib_Lexing = + [0, + dummy_pos, + from_channel, + from_string, + from_function, + set_position, + set_filename, + with_positions, + lexeme, + lexeme_char, + lexeme_start, + lexeme_end, + lexeme_start_p, + lexeme_end_p, + new_line, + flush_input, + sub_lexeme, + sub_lexeme_opt, + sub_lexeme_char, + sub_lexeme_char_opt, + engine, + new_engine]; + runtime.caml_register_global(7, Stdlib_Lexing, "Stdlib__Lexing"); + return; + } + (globalThis)); + +//# 7276 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Lexing = global_data.Stdlib__Lexing, + YYexit = [248, "Stdlib.Parsing.YYexit", caml_fresh_oo_id(0)], + Parse_error = [248, "Stdlib.Parsing.Parse_error", caml_fresh_oo_id(0)], + env = + [0, + caml_make_vect(100, 0), + caml_make_vect(100, 0), + caml_make_vect(100, Stdlib_Lexing[1]), + caml_make_vect(100, Stdlib_Lexing[1]), + 100, + 0, + 0, + 0, + Stdlib_Lexing[1], + Stdlib_Lexing[1], + 0, + 0, + 0, + 0, + 0, + 0], + cst_syntax_error = "syntax error"; + function grow_stacks(param){ + var + oldsize = env[5], + newsize = oldsize * 2 | 0, + new_s = caml_make_vect(newsize, 0), + new_v = caml_make_vect(newsize, 0), + new_start = caml_make_vect(newsize, Stdlib_Lexing[1]), + new_end = caml_make_vect(newsize, Stdlib_Lexing[1]); + caml_call5(Stdlib_Array[8], env[1], 0, new_s, 0, oldsize); + env[1] = new_s; + caml_call5(Stdlib_Array[8], env[2], 0, new_v, 0, oldsize); + env[2] = new_v; + caml_call5(Stdlib_Array[8], env[3], 0, new_start, 0, oldsize); + env[3] = new_start; + caml_call5(Stdlib_Array[8], env[4], 0, new_end, 0, oldsize); + env[4] = new_end; + env[5] = newsize; + return 0; + } + function clear_parser(param){ + caml_call4(Stdlib_Array[7], env[2], 0, env[5], 0); + env[8] = 0; + return 0; + } + var current_lookahead_fun = [0, function(param){return 0;}]; + function yyparse(tables, start, lexer, lexbuf){ + var + init_asp = env[11], + init_sp = env[14], + init_stackbase = env[6], + init_state = env[15], + init_curr_char = env[7], + init_lval = env[8], + init_errflag = env[16]; + env[6] = env[14] + 1 | 0; + env[7] = start; + env[10] = lexbuf[12]; + try{ + var cmd = 0, arg = 0; + for(;;) + switch(runtime.caml_parse_engine(tables, env, cmd, arg)){ + case 0: + var arg$0 = caml_call1(lexer, lexbuf); + env[9] = lexbuf[11]; + env[10] = lexbuf[12]; + var cmd = 1, arg = arg$0; + continue; + case 1: + throw caml_maybe_attach_backtrace(Parse_error, 1); + case 2: + grow_stacks(0); var cmd = 2, arg = 0; continue; + case 3: + grow_stacks(0); var cmd = 3, arg = 0; continue; + case 4: + try{ + var + _i_ = env[13], + _j_ = caml_call1(caml_check_bound(tables[1], _i_)[1 + _i_], env), + _k_ = 4, + value = _j_, + action = _k_; + } + catch(_m_){ + var _h_ = caml_wrap_exception(_m_); + if(_h_ !== Parse_error) throw caml_maybe_attach_backtrace(_h_, 0); + var value = 0, action = 5; + } + var cmd = action, arg = value; + continue; + default: + caml_call1(tables[14], cst_syntax_error); + var cmd = 5, arg = 0; + continue; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), curr_char = env[7]; + env[11] = init_asp; + env[14] = init_sp; + env[6] = init_stackbase; + env[15] = init_state; + env[7] = init_curr_char; + env[8] = init_lval; + env[16] = init_errflag; + if(exn[1] === YYexit){var v = exn[2]; return v;} + current_lookahead_fun[1] = + function(tok){ + if(! caml_call1(Stdlib_Obj[1], tok)) + return caml_check_bound(tables[2], tok)[1 + tok] === curr_char ? 1 : 0; + var _l_ = runtime.caml_obj_tag(tok); + return caml_check_bound(tables[3], _l_)[1 + _l_] === curr_char ? 1 : 0; + }; + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function peek_val(env, n){ + var _g_ = env[11] - n | 0; + return caml_check_bound(env[2], _g_)[1 + _g_]; + } + function symbol_start_pos(param){ + var i$1 = env[12], i = i$1; + for(;;){ + if(0 >= i){ + var _f_ = env[11]; + return caml_check_bound(env[4], _f_)[1 + _f_]; + } + var + _d_ = (env[11] - i | 0) + 1 | 0, + st = caml_check_bound(env[3], _d_)[1 + _d_], + _e_ = (env[11] - i | 0) + 1 | 0, + en = caml_check_bound(env[4], _e_)[1 + _e_]; + if(runtime.caml_notequal(st, en)) return st; + var i$0 = i - 1 | 0, i = i$0; + } + } + function symbol_end_pos(param){ + var _c_ = env[11]; + return caml_check_bound(env[4], _c_)[1 + _c_]; + } + function rhs_start_pos(n){ + var _b_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[3], _b_)[1 + _b_]; + } + function rhs_end_pos(n){ + var _a_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[4], _a_)[1 + _a_]; + } + function symbol_start(param){return symbol_start_pos(0)[4];} + function symbol_end(param){return symbol_end_pos(0)[4];} + function rhs_start(n){return rhs_start_pos(n)[4];} + function rhs_end(n){return rhs_end_pos(n)[4];} + function is_current_lookahead(tok){ + return caml_call1(current_lookahead_fun[1], tok); + } + function parse_error(param){return 0;} + var + Stdlib_Parsing = + [0, + symbol_start, + symbol_end, + rhs_start, + rhs_end, + symbol_start_pos, + symbol_end_pos, + rhs_start_pos, + rhs_end_pos, + clear_parser, + Parse_error, + runtime.caml_set_parser_trace, + YYexit, + yyparse, + peek_val, + is_current_lookahead, + parse_error]; + runtime.caml_register_global(7, Stdlib_Parsing, "Stdlib__Parsing"); + return; + } + (globalThis)); + +//# 7488 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set_bal$3 = "Set.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + cst_Set_remove_min_elt = "Set.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, 0, 0], + _c_ = [0, "set.ml", 570, 18], + cst_Set_bal = cst_Set_bal$3, + cst_Set_bal$0 = cst_Set_bal$3, + cst_Set_bal$1 = cst_Set_bal$3, + cst_Set_bal$2 = cst_Set_bal$3, + Stdlib_Set = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[4]; + return h; + } + function create(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + var _Z_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Z_]; + } + function bal(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Set_bal$0); + var lr = l[3], lv = l[2], ll = l[1], _U_ = height(lr); + if(_U_ <= height(ll)) return create(ll, lv, create(lr, v, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Set_bal); + var lrr = lr[3], lrv = lr[2], lrl = lr[1], _V_ = create(lrr, v, r); + return create(create(ll, lv, lrl), lrv, _V_); + } + if((hl + 2 | 0) >= hr){ + var _Y_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Y_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Set_bal$2); + var rr = r[3], rv = r[2], rl = r[1], _W_ = height(rl); + if(_W_ <= height(rr)) return create(create(l, v, rl), rv, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Set_bal$1); + var rlr = rl[3], rlv = rl[2], rll = rl[1], _X_ = create(rlr, rv, rr); + return create(create(l, v, rll), rlv, _X_); + } + function add(x, t){ + if(! t) return [0, 0, x, 0, 1]; + var r = t[3], v = t[2], l = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c) return t; + if(0 <= c){var rr = add(x, r); return r === rr ? t : bal(l, v, rr);} + var ll = add(x, l); + return l === ll ? t : bal(ll, v, r); + } + function singleton(x){return [0, 0, x, 0, 1];} + function add_min_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(add_min_element(x, l), v, r); + } + function add_max_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(l, v, add_max_element(x, r)); + } + function join(l, v, r){ + if(! l) return add_min_element(v, r); + if(! r) return add_max_element(v, l); + var + rh = r[4], + rr = r[3], + rv = r[2], + rl = r[1], + lh = l[4], + lr = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, join(lr, v, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, rl), rv, rr) + : create(l, v, r); + } + function min_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return v; + } + } + function min_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function max_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return v; + } + } + function max_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function remove_min_elt(param){ + if(! param) return caml_call1(Stdlib[1], cst_Set_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[3], v = param[2]; + return bal(remove_min_elt(l), v, r); + } + var r$0 = param[3]; + return r$0; + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var _T_ = remove_min_elt(t2); + return join(t1, min_elt(t2), _T_); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, 1, r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, r)]; + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _S_ = 0 === c ? 1 : 0; + if(_S_) return _S_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function remove(x, t){ + if(! t) return 0; + var t2 = t[3], v = t[2], t1 = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c){ + if(! t1) return t2; + if(! t2) return t1; + var _R_ = remove_min_elt(t2); + return bal(t1, min_elt(t2), _R_); + } + if(0 <= c){ + var rr = remove(x, t2); + return t2 === rr ? t : bal(t1, v, rr); + } + var ll = remove(x, t1); + return t1 === ll ? t : bal(ll, v, t2); + } + function union(s1, s2){ + if(! s1) return s2; + if(! s2) return s1; + var + h2 = s2[4], + r2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[4], + r1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + if(1 === h2) return add(v2, s1); + var + match = split(v1, s2), + r2$0 = match[3], + l2$0 = match[1], + _P_ = union(r1, r2$0); + return join(union(l1, l2$0), v1, _P_); + } + if(1 === h1) return add(v1, s2); + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + l1$0 = match$0[1], + _Q_ = union(r1$0, r2); + return join(union(l1$0, l2), v2, _Q_); + } + function inter(s1, s2){ + if(! s1) return 0; + if(! s2) return 0; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _M_ = split(v1, s2), + l2 = _M_[1]; + if(_M_[2]){ + var r2 = _M_[3], _N_ = inter(r1, r2); + return join(inter(l1, l2), v1, _N_); + } + var r2$0 = _M_[3], _O_ = inter(r1, r2$0); + return concat(inter(l1, l2), _O_); + } + function split_bis(x, param){ + if(! param) return [0, 0, function(param){return 0;}]; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return 0; + if(0 <= c){ + var match = split_bis(x, r); + if(! match) return 0; + var rr = match[2], lr = match[1]; + return [0, join(l, v, lr), rr]; + } + var match$0 = split_bis(x, l); + if(! match$0) return 0; + var rl = match$0[2], ll = match$0[1]; + return [0, + ll, + function(param){return join(caml_call1(rl, 0), v, r);}]; + } + function disjoint(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(s1$0 && s2$0){ + var r1 = s1$0[3], v1 = s1$0[2], l1 = s1$0[1]; + if(s1$0 === s2$0) return 0; + var match = split_bis(v1, s2$0); + if(! match) return 0; + var r2 = match[2], l2 = match[1], _L_ = disjoint(l1, l2); + if(! _L_) return _L_; + var s2$1 = caml_call1(r2, 0), s1$0 = r1, s2$0 = s2$1; + continue; + } + return 1; + } + } + function diff(s1, s2){ + if(! s1) return 0; + if(! s2) return s1; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _I_ = split(v1, s2), + l2 = _I_[1]; + if(_I_[2]){ + var r2 = _I_[3], _J_ = diff(r1, r2); + return concat(diff(l1, l2), _J_); + } + var r2$0 = _I_[3], _K_ = diff(r1, r2$0); + return join(diff(l1, l2), v1, _K_); + } + function cons_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, r, e$0], + s$0 = l, + e$0 = e$1; + } + } + function compare(s1, s2){ + var + e2$2 = cons_enum(s2, 0), + e1$2 = cons_enum(s1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[3], + r2 = e2[2], + v2 = e2[1], + e1$0 = e1[3], + r1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(s1, s2){return 0 === compare(s1, s2) ? 1 : 0;} + function subset(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(! s1$0) return 1; + if(! s2$0) return 0; + var + r2 = s2$0[3], + v2 = s2$0[2], + l2 = s2$0[1], + r1 = s1$0[3], + v1 = s1$0[2], + l1 = s1$0[1], + c = caml_call2(Ord[1], v1, v2); + if(0 === c){ + var _F_ = subset(l1, l2); + if(! _F_) return _F_; + var s1$0 = r1, s2$0 = r2; + continue; + } + if(0 <= c){ + var _G_ = subset([0, 0, v1, r1, 0], r2); + if(! _G_) return _G_; + var s1$0 = l1; + continue; + } + var _H_ = subset([0, l1, v1, 0, 0], l2); + if(! _H_) return _H_; + var s1$0 = r1; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call1(f, v); + var param$0 = r; + } + } + function fold(f, s, accu){ + var s$0 = s, accu$0 = accu; + for(;;){ + if(! s$0) return accu$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + accu$1 = caml_call2(f, v, fold(f, l, accu$0)), + s$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call1(p, v); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call1(p, v); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function filter(p, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = filter(p, l), + pv = caml_call1(p, v), + r$0 = filter(p, r); + if(! pv) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return t; + return join(l$0, v, r$0); + } + function partition(p, param){ + if(! param) return _b_; + var + r = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pv = caml_call1(p, v), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pv){var _x_ = concat(lf, rf); return [0, join(lt, v, rt), _x_];} + var _y_ = join(lf, v, rf); + return [0, concat(lt, rt), _y_]; + } + function cardinal(param){ + if(! param) return 0; + var r = param[3], l = param[1], _w_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _w_ | 0; + } + function elements_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, v, elements_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function elements(s){return elements_aux(0, s);} + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return v; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, v]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function try_join(l, v, r){ + var switch$0 = 0; + if(0 !== l){ + var _v_ = max_elt(l); + if(0 <= caml_call2(Ord[1], _v_, v)) switch$0 = 1; + } + if(! switch$0){ + var switch$1 = 0; + if(0 !== r){ + var _u_ = min_elt(r); + if(0 <= caml_call2(Ord[1], v, _u_)) switch$1 = 1; + } + if(! switch$1) return join(l, v, r); + } + return union(l, add(v, r)); + } + function map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = map(f, l), + v$0 = caml_call1(f, v), + r$0 = map(f, r); + if(l === l$0 && v === v$0 && r === r$0) return t; + return try_join(l$0, v$0, r$0); + } + function filter_map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + t1 = filter_map(f, l), + v$0 = caml_call1(f, v), + t2 = filter_map(f, r); + if(v$0){ + var v$1 = v$0[1]; + if(l === t1 && v === v$1 && r === t2) return t; + return try_join(t1, v$1, t2); + } + if(! t1) return t2; + if(! t2) return t1; + var _t_ = remove_min_elt(t2); + return try_join(t1, min_elt(t2), _t_); + } + function of_list(l){ + if(! l) return empty; + var _o_ = l[2], x0 = l[1]; + if(! _o_) return singleton(x0); + var _p_ = _o_[2], x1 = _o_[1]; + if(! _p_) return add(x1, singleton(x0)); + var _q_ = _p_[2], x2 = _p_[1]; + if(! _q_) return add(x2, add(x1, singleton(x0))); + var _r_ = _q_[2], x3 = _q_[1]; + if(! _r_) return add(x3, add(x2, add(x1, singleton(x0)))); + if(_r_[2]){ + var + l$0 = caml_call2(Stdlib_List[59], Ord[1], l), + sub = + function(n, l){ + if(3 >= n >>> 0) + switch(n){ + case 0: + return [0, 0, l]; + case 1: + if(l){ + var l$3 = l[2], x0 = l[1]; + return [0, [0, 0, x0, 0, 1], l$3]; + } + break; + case 2: + if(l){ + var match$1 = l[2]; + if(match$1){ + var l$4 = match$1[2], x1 = match$1[1], x0$0 = l[1]; + return [0, [0, [0, 0, x0$0, 0, 1], x1, 0, 2], l$4]; + } + } + break; + default: + if(l){ + var _s_ = l[2]; + if(_s_){ + var match$2 = _s_[2]; + if(match$2){ + var + l$5 = match$2[2], + x2 = match$2[1], + x1$0 = _s_[1], + x0$1 = l[1]; + return [0, + [0, [0, 0, x0$1, 0, 1], x1$0, [0, 0, x2, 0, 1], 2], + l$5]; + } + } + } + } + var + nl = n / 2 | 0, + match = sub(nl, l), + l$0 = match[2], + left = match[1]; + if(! l$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + l$1 = l$0[2], + mid = l$0[1], + match$0 = sub((n - nl | 0) - 1 | 0, l$1), + l$2 = match$0[2], + right = match$0[1]; + return [0, create(left, mid, right), l$2]; + }; + return sub(caml_call1(Stdlib_List[1], l$0), l$0)[1]; + } + var x4 = _r_[1]; + return add(x4, add(x3, add(x2, add(x1, singleton(x0))))); + } + function add_seq(i, m){ + function _n_(s, x){return add(x, s);} + return caml_call3(Stdlib_Seq[5], _n_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _l_ = cons_enum(t, rest); + return [0, x, function(_m_){return seq_of_enum(_l_, _m_);}]; + } + function to_seq(c){ + var _j_ = cons_enum(c, 0); + return function(_k_){return seq_of_enum(_j_, _k_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _h_ = snoc_enum(t, rest); + return [0, x, function(_i_){return rev_seq_of_enum(_h_, _i_);}]; + } + function to_rev_seq(c){ + var _f_ = snoc_enum(c, 0); + return function(_g_){return rev_seq_of_enum(_f_, _g_);}; + } + function to_seq_from(low, s){ + var s$0 = s, c = 0; + for(;;){ + if(s$0){ + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, r, c], s$0 = l, c = c$0; continue;} + var s$0 = r; + continue; + } + var _d_ = [0, v, r, c]; + } + else + var _d_ = c; + return function(_e_){return seq_of_enum(_d_, _e_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + singleton, + remove, + union, + inter, + disjoint, + diff, + compare, + equal, + subset, + iter, + map, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + elements, + min_elt, + min_elt_opt, + max_elt, + max_elt_opt, + min_elt, + min_elt_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + of_list, + to_seq_from, + to_seq, + to_rev_seq, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(12, Stdlib_Set, "Stdlib__Set"); + return; + } + (globalThis)); + +//# 8299 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Map_bal$3 = "Map.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Seq = global_data.Stdlib__Seq, + cst_Map_remove_min_elt = "Map.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, "map.ml", 400, 10], + _c_ = [0, 0, 0], + cst_Map_bal = cst_Map_bal$3, + cst_Map_bal$0 = cst_Map_bal$3, + cst_Map_bal$1 = cst_Map_bal$3, + cst_Map_bal$2 = cst_Map_bal$3, + Stdlib_Map = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[5]; + return h; + } + function create(l, x, d, r){ + var + hl = height(l), + hr = height(r), + _L_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _L_]; + } + function singleton(x, d){return [0, 0, x, d, 0, 1];} + function bal(l, x, d, r){ + if(l) var h = l[5], hl = h; else var hl = 0; + if(r) var h$0 = r[5], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Map_bal$0); + var lr = l[4], ld = l[3], lv = l[2], ll = l[1], _G_ = height(lr); + if(_G_ <= height(ll)) + return create(ll, lv, ld, create(lr, x, d, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Map_bal); + var + lrr = lr[4], + lrd = lr[3], + lrv = lr[2], + lrl = lr[1], + _H_ = create(lrr, x, d, r); + return create(create(ll, lv, ld, lrl), lrv, lrd, _H_); + } + if((hl + 2 | 0) >= hr){ + var _K_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _K_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Map_bal$2); + var rr = r[4], rd = r[3], rv = r[2], rl = r[1], _I_ = height(rl); + if(_I_ <= height(rr)) return create(create(l, x, d, rl), rv, rd, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Map_bal$1); + var + rlr = rl[4], + rld = rl[3], + rlv = rl[2], + rll = rl[1], + _J_ = create(rlr, rv, rd, rr); + return create(create(l, x, d, rll), rlv, rld, _J_); + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function add(x, data, m){ + if(! m) return [0, 0, x, data, 0, 1]; + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d === data ? m : [0, l, x, data, r, h]; + if(0 <= c){ + var rr = add(x, data, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = add(x, data, l); + return l === ll ? m : bal(ll, v, d, r); + } + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, d]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _F_ = 0 === c ? 1 : 0; + if(_F_) return _F_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function min_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function min_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function max_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function max_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function remove_min_binding(param){ + if(! param) return caml_call1(Stdlib[1], cst_Map_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[4], d = param[3], v = param[2]; + return bal(remove_min_binding(l), v, d, r); + } + var r$0 = param[4]; + return r$0; + } + function _d_(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return bal(t1, x, d, remove_min_binding(t2)); + } + function remove(x, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return _d_(l, r); + if(0 <= c){ + var rr = remove(x, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = remove(x, l); + return l === ll ? m : bal(ll, v, d, r); + } + function update(x, f, m){ + if(! m){ + var match$0 = caml_call1(f, 0); + if(! match$0) return 0; + var data$0 = match$0[1]; + return [0, 0, x, data$0, 0, 1]; + } + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c){ + var match = caml_call1(f, [0, d]); + if(! match) return _d_(l, r); + var data = match[1]; + return d === data ? m : [0, l, x, data, r, h]; + } + if(0 <= c){ + var rr = update(x, f, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = update(x, f, l); + return l === ll ? m : bal(ll, v, d, r); + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[4], d = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call2(f, v, d); + var param$0 = r; + } + } + function map(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = map(f, l), + d$0 = caml_call1(f, d), + r$0 = map(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function mapi(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = mapi(f, l), + d$0 = caml_call2(f, v, d), + r$0 = mapi(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function fold(f, m, accu){ + var m$0 = m, accu$0 = accu; + for(;;){ + if(! m$0) return accu$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + accu$1 = caml_call3(f, v, d, fold(f, l, accu$0)), + m$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call2(p, v, d); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call2(p, v, d); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function add_min_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(add_min_binding(k, x, l), v, d, r); + } + function add_max_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(l, v, d, add_max_binding(k, x, r)); + } + function join(l, v, d, r){ + if(! l) return add_min_binding(v, d, r); + if(! r) return add_max_binding(v, d, l); + var + rh = r[5], + rr = r[4], + rd = r[3], + rv = r[2], + rl = r[1], + lh = l[5], + lr = l[4], + ld = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, ld, join(lr, v, d, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, d, rl), rv, rd, rr) + : create(l, v, d, r); + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return join(t1, x, d, remove_min_binding(t2)); + } + function concat_or_join(t1, v, d, t2){ + if(! d) return concat(t1, t2); + var d$0 = d[1]; + return join(t1, v, d$0, t2); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, [0, d], r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, d, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, d, r)]; + } + function merge(f, s1, s2){ + if(s1){ + var h1 = s1[5], r1 = s1[4], d1 = s1[3], v1 = s1[2], l1 = s1[1]; + if(height(s2) <= h1){ + var + match = split(v1, s2), + r2 = match[3], + d2 = match[2], + l2 = match[1], + _v_ = merge(f, r1, r2), + _w_ = caml_call3(f, v1, [0, d1], d2); + return concat_or_join(merge(f, l1, l2), v1, _w_, _v_); + } + } + else if(! s2) return 0; + if(! s2) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + r2$0 = s2[4], + d2$0 = s2[3], + v2 = s2[2], + l2$0 = s2[1], + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + _x_ = merge(f, r1$0, r2$0), + _y_ = caml_call3(f, v2, d1$0, [0, d2$0]); + return concat_or_join(merge(f, l1$0, l2$0), v2, _y_, _x_); + } + function union(f, s1, s2){ + if(s1){ + if(s2){ + var + h2 = s2[5], + r2 = s2[4], + d2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[5], + r1 = s1[4], + d1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + var + match = split(v1, s2), + r2$0 = match[3], + d2$0 = match[2], + l2$0 = match[1], + l = union(f, l1, l2$0), + r = union(f, r1, r2$0); + if(! d2$0) return join(l, v1, d1, r); + var d2$1 = d2$0[1]; + return concat_or_join(l, v1, caml_call3(f, v1, d1, d2$1), r); + } + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + l$0 = union(f, l1$0, l2), + r$0 = union(f, r1$0, r2); + if(! d1$0) return join(l$0, v2, d2, r$0); + var d1$1 = d1$0[1]; + return concat_or_join(l$0, v2, caml_call3(f, v2, d1$1, d2), r$0); + } + var s = s1; + } + else + var s = s2; + return s; + } + function filter(p, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + l$0 = filter(p, l), + pvd = caml_call2(p, v, d), + r$0 = filter(p, r); + if(! pvd) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return m; + return join(l$0, v, d, r$0); + } + function filter_map(f, param){ + if(! param) return 0; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = filter_map(f, l), + fvd = caml_call2(f, v, d), + r$0 = filter_map(f, r); + if(! fvd) return concat(l$0, r$0); + var d$0 = fvd[1]; + return join(l$0, v, d$0, r$0); + } + function partition(p, param){ + if(! param) return _c_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pvd = caml_call2(p, v, d), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pvd){ + var _t_ = concat(lf, rf); + return [0, join(lt, v, d, rt), _t_]; + } + var _u_ = join(lf, v, d, rf); + return [0, concat(lt, rt), _u_]; + } + function cons_enum(m, e){ + var m$0 = m, e$0 = e; + for(;;){ + if(! m$0) return e$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + e$1 = [0, v, d, r, e$0], + m$0 = l, + e$0 = e$1; + } + } + function compare(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var c$0 = caml_call2(cmp, d1, d2); + if(0 !== c$0) return c$0; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? 0 : 1; + if(! e2) return 0; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + _q_ = 0 === caml_call2(Ord[1], v1, v2) ? 1 : 0; + if(_q_){ + var _r_ = caml_call2(cmp, d1, d2); + if(_r_){ + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + continue; + } + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function cardinal(param){ + if(! param) return 0; + var r = param[4], l = param[1], _p_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _p_ | 0; + } + function bindings_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, [0, v, d], bindings_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function bindings(s){return bindings_aux(0, s);} + function add_seq(i, m){ + function _o_(m, param){ + var v = param[2], k = param[1]; + return add(k, v, m); + } + return caml_call3(Stdlib_Seq[5], _o_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _m_ = cons_enum(t, rest); + return [0, [0, k, v], function(_n_){return seq_of_enum(_m_, _n_);}]; + } + function to_seq(m){ + var _k_ = cons_enum(m, 0); + return function(_l_){return seq_of_enum(_k_, _l_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[4], + d = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, d, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _i_ = snoc_enum(t, rest); + return [0, + [0, k, v], + function(_j_){return rev_seq_of_enum(_i_, _j_);}]; + } + function to_rev_seq(c){ + var _g_ = snoc_enum(c, 0); + return function(_h_){return rev_seq_of_enum(_g_, _h_);}; + } + function to_seq_from(low, m){ + var m$0 = m, c = 0; + for(;;){ + if(m$0){ + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, d, r, c], m$0 = l, c = c$0; continue;} + var m$0 = r; + continue; + } + var _e_ = [0, v, d, r, c]; + } + else + var _e_ = c; + return function(_f_){return seq_of_enum(_e_, _f_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + update, + singleton, + remove, + merge, + union, + compare, + equal, + iter, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + bindings, + min_binding, + min_binding_opt, + max_binding, + max_binding_opt, + min_binding, + min_binding_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + map, + mapi, + to_seq, + to_rev_seq, + to_seq_from, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(11, Stdlib_Map, "Stdlib__Map"); + return; + } + (globalThis)); + +//# 9131 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Empty = [248, "Stdlib.Stack.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0];} + function clear(s){s[1] = 0; s[2] = 0; return 0;} + function copy(s){return [0, s[1], s[2]];} + function push(x, s){s[1] = [0, x, s[1]]; s[2] = s[2] + 1 | 0; return 0;} + function pop(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return hd; + } + function pop_opt(s){ + var match = s[1]; + if(! match) return 0; + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return [0, hd]; + } + function top(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var hd = match[1]; + return hd; + } + function top_opt(s){ + var match = s[1]; + if(! match) return 0; + var hd = match[1]; + return [0, hd]; + } + function is_empty(s){return 0 === s[1] ? 1 : 0;} + function length(s){return s[2];} + function iter(f, s){return caml_call2(Stdlib_List[17], f, s[1]);} + function fold(f, acc, s){return caml_call3(Stdlib_List[25], f, acc, s[1]);} + function to_seq(s){return caml_call1(Stdlib_List[61], s[1]);} + function add_seq(q, i){ + function _a_(x){return push(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var s = create(0); add_seq(s, g); return s;} + var + Stdlib_Stack = + [0, + Empty, + create, + push, + pop, + pop_opt, + top, + top_opt, + clear, + copy, + is_empty, + length, + iter, + fold, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(3, Stdlib_Stack, "Stdlib__Stack"); + return; + } + (globalThis)); + +//# 9225 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Empty = [248, "Stdlib.Queue.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0, 0];} + function clear(q){q[1] = 0; q[2] = 0; q[3] = 0; return 0;} + function add(x, q){ + var cell = [0, x, 0], match = q[3]; + return match + ? (q[1] = q[1] + 1 | 0, match[2] = cell, q[3] = cell, 0) + : (q[1] = 1, q[2] = cell, q[3] = cell, 0); + } + function peek(q){ + var match = q[2]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var content = match[1]; + return content; + } + function peek_opt(q){ + var match = q[2]; + if(! match) return 0; + var content = match[1]; + return [0, content]; + } + function take(q){ + var _g_ = q[2]; + if(! _g_) throw caml_maybe_attach_backtrace(Empty, 1); + var content = _g_[1]; + if(_g_[2]){ + var next = _g_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return content; + } + clear(q); + return content; + } + function take_opt(q){ + var _f_ = q[2]; + if(! _f_) return 0; + var content = _f_[1]; + if(_f_[2]){ + var next = _f_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return [0, content]; + } + clear(q); + return [0, content]; + } + function copy(q){ + var cell$0 = q[2], q_res = [0, q[1], 0, 0], prev = 0, cell = cell$0; + for(;;){ + if(! cell){q_res[3] = prev; return q_res;} + var content = cell[1], next = cell[2], prev$0 = [0, content, 0]; + if(prev) prev[2] = prev$0; else q_res[2] = prev$0; + var prev = prev$0, cell = next; + } + } + function is_empty(q){return 0 === q[1] ? 1 : 0;} + function length(q){return q[1];} + function iter(f, q){ + var cell$0 = q[2], cell = cell$0; + for(;;){ + if(! cell) return 0; + var content = cell[1], next = cell[2]; + caml_call1(f, content); + var cell = next; + } + } + function fold(f, accu$1, q){ + var cell$0 = q[2], accu = accu$1, cell = cell$0; + for(;;){ + if(! cell) return accu; + var + content = cell[1], + next = cell[2], + accu$0 = caml_call2(f, accu, content), + accu = accu$0, + cell = next; + } + } + function transfer(q1, q2){ + var _e_ = 0 < q1[1] ? 1 : 0; + if(! _e_) return _e_; + var match = q2[3]; + return match + ? (q2 + [1] + = q2[1] + q1[1] | 0, + match[2] = q1[2], + q2[3] = q1[3], + clear(q1)) + : (q2[1] = q1[1], q2[2] = q1[2], q2[3] = q1[3], clear(q1)); + } + function to_seq(q){ + function aux(c, param){ + if(! c) return 0; + var x = c[1], next = c[2]; + return [0, x, function(_d_){return aux(next, _d_);}]; + } + var _b_ = q[2]; + return function(_c_){return aux(_b_, _c_);}; + } + function add_seq(q, i){ + function _a_(x){return add(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var q = create(0); add_seq(q, g); return q;} + var + Stdlib_Queue = + [0, + Empty, + create, + add, + add, + take, + take_opt, + take, + peek, + peek_opt, + peek, + clear, + copy, + is_empty, + length, + iter, + fold, + transfer, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(2, Stdlib_Queue, "Stdlib__Queue"); + return; + } + (globalThis)); + +//# 9380 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_blit_string = runtime.caml_blit_string, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Assert_failure = global_data.Assert_failure, + cst_Buffer_truncate = "Buffer.truncate", + _a_ = [0, "buffer.ml", 220, 9], + cst_Buffer_add_channel = "Buffer.add_channel", + cst_Buffer_add_substring_add_s = "Buffer.add_substring/add_subbytes", + cst_Buffer_add_cannot_grow_buf = "Buffer.add: cannot grow buffer", + cst_Buffer_nth = "Buffer.nth", + cst_Buffer_blit = "Buffer.blit", + cst_Buffer_sub = "Buffer.sub"; + function create(n){ + var + n$0 = 1 <= n ? n : 1, + n$1 = Stdlib_Sys[12] < n$0 ? Stdlib_Sys[12] : n$0, + s = caml_create_bytes(n$1); + return [0, [0, s, n$1], 0, s]; + } + function contents(b){return caml_call3(Stdlib_Bytes[8], b[1][1], 0, b[2]);} + function to_bytes(b){return caml_call3(Stdlib_Bytes[7], b[1][1], 0, b[2]);} + function sub(b, ofs, len){ + if(0 <= ofs && 0 <= len && (b[2] - len | 0) >= ofs) + return caml_call3(Stdlib_Bytes[8], b[1][1], ofs, len); + return caml_call1(Stdlib[1], cst_Buffer_sub); + } + function blit(src, srcoff, dst, dstoff, len){ + if + (0 <= len + && + 0 <= srcoff + && + (src[2] - len | 0) >= srcoff + && 0 <= dstoff && (caml_ml_bytes_length(dst) - len | 0) >= dstoff) + return caml_call5(Stdlib_Bytes[11], src[1][1], srcoff, dst, dstoff, len); + return caml_call1(Stdlib[1], cst_Buffer_blit); + } + function nth(b, ofs){ + var position = b[2], match = b[1], length = match[2], buffer = match[1]; + if(0 <= ofs && position > ofs && length >= position) + return runtime.caml_bytes_unsafe_get(buffer, ofs); + return caml_call1(Stdlib[1], cst_Buffer_nth); + } + function length(b){return b[2];} + function clear(b){b[2] = 0; return 0;} + function reset(b){ + b[2] = 0; + var inner = [0, b[3], caml_ml_bytes_length(b[3])]; + b[1] = inner; + return 0; + } + function resize(b, more){ + var old_pos = b[2], old_len = b[1][2], new_len = [0, old_len]; + for(;;){ + if(new_len[1] < (old_pos + more | 0)){ + new_len[1] = 2 * new_len[1] | 0; + continue; + } + if(Stdlib_Sys[12] < new_len[1]) + if((old_pos + more | 0) <= Stdlib_Sys[12]) + new_len[1] = Stdlib_Sys[12]; + else + caml_call1(Stdlib[2], cst_Buffer_add_cannot_grow_buf); + var new_buffer = caml_create_bytes(new_len[1]); + caml_call5(Stdlib_Bytes[11], b[1][1], 0, new_buffer, 0, b[2]); + b[1] = [0, new_buffer, new_len[1]]; + return 0; + } + } + function add_char(b, c){ + var pos = b[2], match = b[1], length = match[2], buffer = match[1]; + if(length <= pos){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], c); + } + else + caml_bytes_unsafe_set(buffer, pos, c); + b[2] = pos + 1 | 0; + return 0; + } + var uchar_utf_8_byte_length_max = 4, uchar_utf_16_byte_length_max = 4; + function add_utf_8_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_8_byte_length_max); + var n = caml_call3(Stdlib_Bytes[51], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_8_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16be_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[54], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16le_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[57], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_substring(b, s, offset, len){ + var _r_ = offset < 0 ? 1 : 0; + if(_r_) + var _s_ = _r_; + else + var + _t_ = len < 0 ? 1 : 0, + _s_ = _t_ || ((caml_ml_string_length(s) - len | 0) < offset ? 1 : 0); + if(_s_) caml_call1(Stdlib[1], cst_Buffer_add_substring_add_s); + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, offset, b[1][1], b[2], len); + } + else + caml_blit_string(s, offset, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_subbytes(b, s, offset, len){ + return add_substring(b, caml_call1(Stdlib_Bytes[44], s), offset, len); + } + function add_string(b, s){ + var + len = caml_ml_string_length(s), + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = b[2] + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, 0, b[1][1], b[2], len); + } + else + caml_blit_string(s, 0, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_bytes(b, s){ + return add_string(b, caml_call1(Stdlib_Bytes[44], s)); + } + function add_buffer(b, bs){return add_subbytes(b, bs[1][1], 0, bs[2]);} + function add_channel(b, ic, to_read$1){ + var + _p_ = to_read$1 < 0 ? 1 : 0, + _q_ = _p_ || (Stdlib_Sys[12] < to_read$1 ? 1 : 0); + if(_q_) caml_call1(Stdlib[1], cst_Buffer_add_channel); + if(b[1][2] < (b[2] + to_read$1 | 0)) resize(b, to_read$1); + var + ofs$1 = b[2], + buf = b[1][1], + already_read = 0, + ofs = ofs$1, + to_read = to_read$1; + for(;;){ + if(0 !== to_read){ + var r = caml_call4(Stdlib[84], ic, buf, ofs, to_read); + if(0 !== r){ + var + already_read$0 = already_read + r | 0, + ofs$0 = ofs + r | 0, + to_read$0 = to_read - r | 0, + already_read = already_read$0, + ofs = ofs$0, + to_read = to_read$0; + continue; + } + } + b[2] = b[2] + already_read | 0; + if(already_read < to_read$1) + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return 0; + } + } + function output_buffer(oc, b){ + return caml_call4(Stdlib[68], oc, b[1][1], 0, b[2]); + } + function add_substitute(b, f, s){ + var lim$1 = caml_ml_string_length(s), previous = 32, i$4 = 0; + for(;;){ + if(i$4 >= lim$1){ + var _o_ = 92 === previous ? 1 : 0; + return _o_ ? add_char(b, previous) : _o_; + } + var previous$0 = caml_string_get(s, i$4); + if(36 !== previous$0){ + if(92 === previous){ + add_char(b, 92); + add_char(b, previous$0); + var i$6 = i$4 + 1 | 0, previous = 32, i$4 = i$6; + continue; + } + if(92 === previous$0){ + var i$7 = i$4 + 1 | 0, previous = previous$0, i$4 = i$7; + continue; + } + add_char(b, previous$0); + var i$8 = i$4 + 1 | 0, previous = previous$0, i$4 = i$8; + continue; + } + if(92 === previous){ + add_char(b, previous$0); + var i$5 = i$4 + 1 | 0, previous = 32, i$4 = i$5; + continue; + } + var start$0 = i$4 + 1 | 0; + if(lim$1 <= start$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var opening = caml_string_get(s, start$0), switch$0 = 0; + if(40 !== opening && 123 !== opening){ + var + start = start$0 + 1 | 0, + lim$0 = caml_ml_string_length(s), + i$2 = start; + for(;;){ + if(lim$0 <= i$2) + var stop$0 = lim$0; + else{ + var match = caml_string_get(s, i$2), switch$1 = 0; + if(91 <= match){ + if(97 <= match){ + if(123 > match) switch$1 = 1; + } + else if(95 === match) switch$1 = 1; + } + else + if(58 <= match){ + if(65 <= match) switch$1 = 1; + } + else if(48 <= match) switch$1 = 1; + if(switch$1){var i$3 = i$2 + 1 | 0, i$2 = i$3; continue;} + var stop$0 = i$2; + } + var + match$0 = + [0, + caml_call3(Stdlib_String[15], s, start$0, stop$0 - start$0 | 0), + stop$0]; + switch$0 = 1; + break; + } + } + if(! switch$0){ + var new_start = start$0 + 1 | 0, k$2 = 0; + if(40 === opening) + var closing = 41; + else{ + if(123 !== opening) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var closing = 125; + } + var lim = caml_ml_string_length(s), k = k$2, stop = new_start; + for(;;){ + if(lim <= stop) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_get(s, stop) === opening){ + var i = stop + 1 | 0, k$0 = k + 1 | 0, k = k$0, stop = i; + continue; + } + if(caml_string_get(s, stop) !== closing){ + var i$1 = stop + 1 | 0, stop = i$1; + continue; + } + if(0 !== k){ + var i$0 = stop + 1 | 0, k$1 = k - 1 | 0, k = k$1, stop = i$0; + continue; + } + var + match$0 = + [0, + caml_call3 + (Stdlib_String[15], s, new_start, (stop - start$0 | 0) - 1 | 0), + stop + 1 | 0]; + break; + } + } + var next_i = match$0[2], ident = match$0[1]; + add_string(b, caml_call1(f, ident)); + var previous = 32, i$4 = next_i; + } + } + function truncate(b, len){ + if(0 <= len && b[2] >= len){b[2] = len; return 0;} + return caml_call1(Stdlib[1], cst_Buffer_truncate); + } + function to_seq(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _m_ = i + 1 | 0; + return [0, x, function(_n_){return aux(_m_, _n_);}]; + } + var _k_ = 0; + return function(_l_){return aux(_k_, _l_);}; + } + function to_seqi(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _i_ = i + 1 | 0; + return [0, [0, i, x], function(_j_){return aux(_i_, _j_);}]; + } + var _g_ = 0; + return function(_h_){return aux(_g_, _h_);}; + } + function add_seq(b, seq){ + function _e_(_f_){return add_char(b, _f_);} + return caml_call2(Stdlib_Seq[4], _e_, seq); + } + function of_seq(i){var b = create(32); add_seq(b, i); return b;} + function add_int8(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 1 | 0; + if(length < new_position){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], x); + } + else + caml_bytes_unsafe_set(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 2 | 0; + if(length < new_position){ + resize(b, 2); + caml_bytes_set16(b[1][1], b[2], x); + } + else + caml_bytes_set16(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int32_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 4 | 0; + if(length < new_position){ + resize(b, 4); + caml_bytes_set32(b[1][1], b[2], x); + } + else + caml_bytes_set32(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int64_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 8 | 0; + if(length < new_position){ + resize(b, 8); + caml_bytes_set64(b[1][1], b[2], x); + } + else + caml_bytes_set64(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_le(b, x){ + var _d_ = Stdlib_Sys[11] ? caml_bswap16(x) : x; + return add_int16_ne(b, _d_); + } + function add_int16_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_bswap16(x); + return add_int16_ne(b, x$0); + } + function add_int32_le(b, x){ + var _c_ = Stdlib_Sys[11] ? caml_int32_bswap(x) : x; + return add_int32_ne(b, _c_); + } + function add_int32_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int32_bswap(x); + return add_int32_ne(b, x$0); + } + function add_int64_le(b, x){ + var _b_ = Stdlib_Sys[11] ? caml_int64_bswap(x) : x; + return add_int64_ne(b, _b_); + } + function add_int64_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int64_bswap(x); + return add_int64_ne(b, x$0); + } + var + Stdlib_Buffer = + [0, + create, + contents, + to_bytes, + sub, + blit, + nth, + length, + clear, + reset, + output_buffer, + truncate, + add_char, + add_utf_8_uchar, + add_utf_16le_uchar, + add_utf_16be_uchar, + add_string, + add_bytes, + add_substring, + add_subbytes, + add_substitute, + add_buffer, + add_channel, + to_seq, + to_seqi, + add_seq, + of_seq, + add_int8, + add_int8, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int32_ne, + add_int32_be, + add_int32_le, + add_int64_ne, + add_int64_be, + add_int64_le]; + runtime.caml_register_global(14, Stdlib_Buffer, "Stdlib__Buffer"); + return; + } + (globalThis)); + +//# 9889 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Mutex = + [0, + runtime.caml_ml_mutex_new, + runtime.caml_ml_mutex_lock, + runtime.caml_ml_mutex_try_lock, + runtime.caml_ml_mutex_unlock]; + runtime.caml_register_global(0, Stdlib_Mutex, "Stdlib__Mutex"); + return; + } + (globalThis)); + +//# 9905 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Condition = + [0, + runtime.caml_ml_condition_new, + runtime.caml_ml_condition_wait, + runtime.caml_ml_condition_signal, + runtime.caml_ml_condition_broadcast]; + runtime.caml_register_global(0, Stdlib_Condition, "Stdlib__Condition"); + return; + } + (globalThis)); + +//# 10012 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_domain_dls_set = runtime.caml_domain_dls_set, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_domain_id = runtime.caml_ml_domain_id, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Mutex = global_data.Stdlib__Mutex, + Stdlib_Condition = global_data.Stdlib__Condition, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Array = global_data.Stdlib__Array, + cst_internal_error_Am_I_alread = "internal error: Am I already finished?", + cst_first_domain_already_spawn = "first domain already spawned"; + function cpu_relax(param){return runtime.caml_ml_domain_cpu_relax(0);} + var unique_value = [0, 0]; + function create_dls(param){ + var st = caml_make_vect(8, unique_value); + return caml_domain_dls_set(st); + } + create_dls(0); + var + key_counter = caml_call1(Stdlib_Atomic[1], 0), + parent_keys = caml_call1(Stdlib_Atomic[1], 0); + function new_key(split_from_parent, init_orphan){ + var + idx = caml_call2(Stdlib_Atomic[6], key_counter, 1), + k = [0, idx, init_orphan]; + if(split_from_parent){ + var split = split_from_parent[1], ki = [0, k, split]; + for(;;){ + var l = caml_call1(Stdlib_Atomic[2], parent_keys); + if(1 - caml_call3(Stdlib_Atomic[5], parent_keys, l, [0, ki, l])) + continue; + break; + } + } + return k; + } + function maybe_grow(idx){ + var st = runtime.caml_domain_dls_get(0), sz = st.length - 1; + if(idx < sz) return st; + var new_sz = sz; + for(;;){ + if(idx < new_sz){ + var new_st = caml_make_vect(new_sz, unique_value); + caml_call5(Stdlib_Array[8], st, 0, new_st, 0, sz); + caml_domain_dls_set(new_st); + return new_st; + } + var s = 2 * new_sz | 0, new_sz = s; + } + } + function set(param, x){ + var idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = x; + return 0; + } + function get(param){ + var + init = param[2], + idx = param[1], + st = maybe_grow(idx), + v = caml_check_bound(st, idx)[1 + idx]; + if(v !== unique_value) return v; + var v$0 = caml_call1(init, 0); + caml_check_bound(st, idx)[1 + idx] = v$0; + return v$0; + } + function get_id(param){var domain = param[1]; return domain;} + function self(param){return caml_ml_domain_id(0);} + function is_main_domain(param){return 0 === caml_ml_domain_id(0) ? 1 : 0;} + var + first_domain_spawned = caml_call1(Stdlib_Atomic[1], 0), + first_spawn_function = [0, function(param){return 0;}]; + function before_first_spawn(f){ + if(caml_call1(Stdlib_Atomic[2], first_domain_spawned)) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_first_domain_already_spawn], 1); + var old_f = first_spawn_function[1]; + function new_f(param){caml_call1(old_f, 0); return caml_call1(f, 0);} + first_spawn_function[1] = new_f; + return 0; + } + var at_exit_key = new_key(0, function(param, _e_){return 0;}); + function at_exit(f){ + var old_exit = get(at_exit_key); + function new_exit(param){ + caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return set(at_exit_key, new_exit); + } + function do_at_exit(param){ + var f = get(at_exit_key); + return caml_call1(f, 0); + } + Stdlib[104][1] = do_at_exit; + function spawn(f){ + if(1 - caml_call1(Stdlib_Atomic[2], first_domain_spawned)){ + caml_call2(Stdlib_Atomic[3], first_domain_spawned, 1); + caml_call1(first_spawn_function[1], 0); + first_spawn_function[1] = function(param){return 0;}; + } + var _a_ = caml_call1(Stdlib_Atomic[2], parent_keys); + function _b_(param){ + var split = param[2], k = param[1], idx = k[1]; + return [0, idx, caml_call1(split, get(k))]; + } + var + pk = caml_call2(Stdlib_List[19], _b_, _a_), + term_mutex = caml_call1(Stdlib_Mutex[1], 0), + term_condition = caml_call1(Stdlib_Condition[1], 0), + term_state = [0, 0]; + function body(param){ + var switch$0 = 0; + try{ + create_dls(0); + var + _c_ = + function(param){ + var v = param[2], idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = v; + return 0; + }; + caml_call2(Stdlib_List[17], _c_, pk); + var res = caml_call1(f, 0); + } + catch(ex$0){ + var ex = caml_wrap_exception(ex$0), result = [1, ex]; + switch$0 = 1; + } + if(! switch$0) var result = [0, res]; + try{do_at_exit(0); var result$0 = result;} + catch(ex){ + var + ex$0 = caml_wrap_exception(ex), + _d_ = 0 === result[0] ? [1, ex$0] : result, + result$0 = _d_; + } + caml_call1(Stdlib_Mutex[2], term_mutex); + return term_state[1] + ? caml_call1(Stdlib[2], cst_internal_error_Am_I_alread) + : (term_state + [1] + = [0, result$0], + caml_call1(Stdlib_Condition[4], term_condition)); + } + return [0, + runtime.caml_domain_spawn(body, term_mutex), + term_mutex, + term_condition, + term_state]; + } + function join(param){ + var + term_state = param[4], + term_condition = param[3], + term_mutex = param[2]; + caml_call1(Stdlib_Mutex[2], term_mutex); + for(;;){ + var match = term_state[1]; + if(! match){ + caml_call2(Stdlib_Condition[2], term_condition, term_mutex); + continue; + } + var res = match[1]; + caml_call1(Stdlib_Mutex[4], term_mutex); + if(0 === res[0]){var x = res[1]; return x;} + var ex = res[1]; + throw caml_maybe_attach_backtrace(ex, 1); + } + } + var + recommended_domain_count = runtime.caml_recommended_domain_count, + Stdlib_Domain = + [0, + spawn, + join, + get_id, + self, + before_first_spawn, + at_exit, + cpu_relax, + is_main_domain, + recommended_domain_count, + [0, new_key, get, set]]; + runtime.caml_register_global(8, Stdlib_Domain, "Stdlib__Domain"); + return; + } + (globalThis)); + +//# 10233 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$43 = "", + cst_and = " and ", + cst_Li$3 = "%Li", + cst_i$3 = "%i", + cst_li$3 = "%li", + cst_ni$3 = "%ni", + cst_u$0 = "%u", + cst$42 = "' '", + cst$41 = "'#'", + cst$39 = "'*'", + cst$40 = "'+'", + cst$44 = ", ", + cst_0$3 = "0", + cst_at_character_number = ": at character number ", + cst$38 = "@[", + cst$37 = "@{", + cst_bad_input_format_type_mism = + "bad input: format type mismatch between ", + cst_bad_input_format_type_mism$0 = + "bad input: format type mismatch between %S and %S", + cst_camlinternalFormat_ml = "camlinternalFormat.ml", + cst_invalid_format = "invalid format ", + cst_precision$3 = "precision", + caml_blit_string = runtime.caml_blit_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_format_float = runtime.caml_format_float, + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$9 = "%{", + cst$10 = "%}", + cst$11 = "%(", + cst$12 = "%)", + cst$13 = "%?", + cst$18 = cst$37, + cst$19 = cst$38, + cst$20 = cst$37, + cst$21 = cst$38, + cst$22 = cst$37, + cst$23 = cst$38, + cst$26 = cst$39, + cst$24 = "'-'", + cst$25 = cst$39, + cst$27 = cst$40, + cst$28 = cst$41, + cst$29 = cst$42, + cst$30 = cst$40, + cst$31 = "'_'", + sub_format = [0, 0, cst$43], + formatting_lit = [0, "@;", 1, 0], + cst$35 = cst$41, + cst$32 = cst$40, + cst$33 = cst$40, + cst$34 = cst$42, + cst$36 = cst$40, + cst$17 = ".", + cst$14 = "%!", + cst$15 = cst$37, + cst$16 = cst$38, + cst$8 = "%%", + cst$0 = "@]", + cst$1 = "@}", + cst$2 = "@?", + cst$3 = "@\n", + cst$4 = "@.", + cst$5 = "@@", + cst$6 = "@%", + cst$7 = "@", + cst = ".*", + Assert_failure = global_data.Assert_failure, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Int = global_data.Stdlib__Int, + cst_c = "%c", + cst_s = "%s", + cst_i = cst_i$3, + cst_li = cst_li$3, + cst_ni = cst_ni$3, + cst_Li = cst_Li$3, + cst_f = "%f", + cst_B = "%B", + cst_a = "%a", + cst_t = "%t", + cst_r = "%r", + cst_r$0 = "%_r", + _b_ = [0, cst_camlinternalFormat_ml, 850, 23], + _m_ = [0, cst_camlinternalFormat_ml, 814, 21], + _e_ = [0, cst_camlinternalFormat_ml, 815, 21], + _n_ = [0, cst_camlinternalFormat_ml, 818, 21], + _f_ = [0, cst_camlinternalFormat_ml, 819, 21], + _o_ = [0, cst_camlinternalFormat_ml, 822, 19], + _g_ = [0, cst_camlinternalFormat_ml, 823, 19], + _p_ = [0, cst_camlinternalFormat_ml, 826, 22], + _h_ = [0, cst_camlinternalFormat_ml, 827, 22], + _q_ = [0, cst_camlinternalFormat_ml, 831, 30], + _i_ = [0, cst_camlinternalFormat_ml, 832, 30], + _k_ = [0, cst_camlinternalFormat_ml, 836, 26], + _c_ = [0, cst_camlinternalFormat_ml, 837, 26], + _l_ = [0, cst_camlinternalFormat_ml, 846, 28], + _d_ = [0, cst_camlinternalFormat_ml, 847, 28], + _j_ = [0, cst_camlinternalFormat_ml, 851, 23], + _s_ = [0, cst_camlinternalFormat_ml, 1558, 4], + cst_Printf_bad_conversion = "Printf: bad conversion %[", + _t_ = [0, cst_camlinternalFormat_ml, 1626, 39], + _u_ = [0, cst_camlinternalFormat_ml, 1649, 31], + _v_ = [0, cst_camlinternalFormat_ml, 1650, 31], + cst_Printf_bad_conversion$0 = "Printf: bad conversion %_", + _w_ = [0, cst_camlinternalFormat_ml, 1830, 8], + ___ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _Z_ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _C_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", duplicate flag ", [1, 0]]]]]], + "invalid format %S: at character number %d, duplicate flag %C"], + cst_0 = cst_0$3, + cst_padding = "padding", + _D_ = [0, 1, 0], + _E_ = [0, 0], + cst_precision = cst_precision$3, + _F_ = [1, 0], + _G_ = [1, 1], + cst_0$2 = "'0'", + cst_0$0 = cst_0$3, + _I_ = [1, 1], + cst_0$1 = cst_0$3, + cst_precision$0 = cst_precision$3, + _H_ = [1, 1], + cst_precision$1 = cst_precision$3, + _M_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + ", flag ", + [1, + [11, + " is only allowed after the '", + [12, 37, [11, "', before padding and precision", 0]]]]]]]]], + "invalid format %S: at character number %d, flag %C is only allowed after the '%%', before padding and precision"], + _J_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, ', invalid conversion "', [12, 37, [0, [12, 34, 0]]]]]]]], + 'invalid format %S: at character number %d, invalid conversion "%%%c"'], + _K_ = [0, 0], + cst_padding$0 = "`padding'", + _L_ = [0, 0], + cst_precision$2 = "`precision'", + _N_ = [0, [12, 64, 0]], + _O_ = [0, "@ ", 1, 0], + _P_ = [0, "@,", 0, 0], + _Q_ = [2, 60], + _R_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": '", + [12, + 37, + [11, + "' alone is not accepted in character sets, use ", + [12, + 37, + [12, + 37, + [11, " instead at position ", [4, 0, 0, 0, [12, 46, 0]]]]]]]]]], + "invalid format %S: '%%' alone is not accepted in character sets, use %%%% instead at position %d."], + _S_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": integer ", + [4, 0, 0, 0, [11, " is greater than the limit ", [4, 0, 0, 0, 0]]]]]], + "invalid format %S: integer %d is greater than the limit %d"], + cst_digit = "digit", + _T_ = [0, cst_camlinternalFormat_ml, 2837, 11], + _U_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ': unclosed sub-format, expected "', + [12, 37, [0, [11, '" at character number ', [4, 0, 0, 0, 0]]]]]]], + 'invalid format %S: unclosed sub-format, expected "%%%c" at character number %d'], + cst_character = "character ')'", + cst_character$0 = "character '}'", + _V_ = [0, cst_camlinternalFormat_ml, 2899, 34], + _W_ = [0, cst_camlinternalFormat_ml, 2935, 28], + _X_ = [0, cst_camlinternalFormat_ml, 2957, 11], + _Y_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + cst$44, + [2, + 0, + [11, + " is incompatible with '", + [0, [11, "' in sub-format ", [3, 0, 0]]]]]]]]]], + "invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S"], + _B_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, cst$44, [2, 0, [11, " expected, read ", [1, 0]]]]]]]], + "invalid format %S: at character number %d, %s expected, read %C"], + _A_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", '", [0, [11, "' without ", [2, 0, 0]]]]]]]], + "invalid format %S: at character number %d, '%c' without %s"], + cst_non_zero_widths_are_unsupp = + "non-zero widths are unsupported for %c conversions", + cst_unexpected_end_of_format = "unexpected end of format", + _z_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, cst_at_character_number, [4, 0, 0, 0, [11, cst$44, [2, 0, 0]]]]]], + "invalid format %S: at character number %d, %s"], + _y_ = + [0, + [11, "invalid box description ", [3, 0, 0]], + "invalid box description %S"], + _x_ = [0, 0, 4], + cst_nan = "nan", + cst_neg_infinity = "neg_infinity", + cst_infinity = "infinity", + _r_ = [0, 103], + cst_nd$0 = "%+nd", + cst_nd$1 = "% nd", + cst_ni$1 = "%+ni", + cst_ni$2 = "% ni", + cst_nx = "%nx", + cst_nx$0 = "%#nx", + cst_nX = "%nX", + cst_nX$0 = "%#nX", + cst_no = "%no", + cst_no$0 = "%#no", + cst_nd = "%nd", + cst_ni$0 = cst_ni$3, + cst_nu = "%nu", + cst_ld$0 = "%+ld", + cst_ld$1 = "% ld", + cst_li$1 = "%+li", + cst_li$2 = "% li", + cst_lx = "%lx", + cst_lx$0 = "%#lx", + cst_lX = "%lX", + cst_lX$0 = "%#lX", + cst_lo = "%lo", + cst_lo$0 = "%#lo", + cst_ld = "%ld", + cst_li$0 = cst_li$3, + cst_lu = "%lu", + cst_Ld$0 = "%+Ld", + cst_Ld$1 = "% Ld", + cst_Li$1 = "%+Li", + cst_Li$2 = "% Li", + cst_Lx = "%Lx", + cst_Lx$0 = "%#Lx", + cst_LX = "%LX", + cst_LX$0 = "%#LX", + cst_Lo = "%Lo", + cst_Lo$0 = "%#Lo", + cst_Ld = "%Ld", + cst_Li$0 = cst_Li$3, + cst_Lu = "%Lu", + cst_d$0 = "%+d", + cst_d$1 = "% d", + cst_i$1 = "%+i", + cst_i$2 = "% i", + cst_x = "%x", + cst_x$0 = "%#x", + cst_X = "%X", + cst_X$0 = "%#X", + cst_o = "%o", + cst_o$0 = "%#o", + cst_d = "%d", + cst_i$0 = cst_i$3, + cst_u = cst_u$0, + cst_0c = "0c", + _a_ = [0, 0, 0], + cst_CamlinternalFormat_Type_mi = "CamlinternalFormat.Type_mismatch"; + function create_char_set(param){return caml_call2(Stdlib_Bytes[1], 32, 0);} + function add_in_char_set(char_set, c){ + var + str_ind = c >>> 3 | 0, + mask = 1 << (c & 7), + _dU_ = runtime.caml_bytes_get(char_set, str_ind) | mask; + return caml_bytes_set(char_set, str_ind, caml_call1(Stdlib[29], _dU_)); + } + function freeze_char_set(char_set){ + return caml_call1(Stdlib_Bytes[6], char_set); + } + function rev_char_set(char_set){ + var char_set$0 = create_char_set(0), i = 0; + for(;;){ + var _dS_ = caml_string_get(char_set, i) ^ 255; + caml_bytes_set(char_set$0, i, caml_call1(Stdlib[29], _dS_)); + var _dT_ = i + 1 | 0; + if(31 === i) return caml_call1(Stdlib_Bytes[44], char_set$0); + var i = _dT_; + } + } + function is_in_char_set(char_set, c){ + var str_ind = c >>> 3 | 0, mask = 1 << (c & 7); + return 0 !== (caml_string_get(char_set, str_ind) & mask) ? 1 : 0; + } + function pad_of_pad_opt(pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return [0, 1, width]; + } + function param_format_of_ignored_format(ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + return [0, [0, fmt]]; + case 1: + return [0, [1, fmt]]; + case 2: + return [0, [19, fmt]]; + default: return [0, [22, fmt]]; + } + switch(ign[0]){ + case 0: + var pad_opt = ign[1]; return [0, [2, pad_of_pad_opt(pad_opt), fmt]]; + case 1: + var pad_opt$0 = ign[1]; + return [0, [3, pad_of_pad_opt(pad_opt$0), fmt]]; + case 2: + var pad_opt$1 = ign[2], iconv = ign[1]; + return [0, [4, iconv, pad_of_pad_opt(pad_opt$1), 0, fmt]]; + case 3: + var pad_opt$2 = ign[2], iconv$0 = ign[1]; + return [0, [5, iconv$0, pad_of_pad_opt(pad_opt$2), 0, fmt]]; + case 4: + var pad_opt$3 = ign[2], iconv$1 = ign[1]; + return [0, [6, iconv$1, pad_of_pad_opt(pad_opt$3), 0, fmt]]; + case 5: + var pad_opt$4 = ign[2], iconv$2 = ign[1]; + return [0, [7, iconv$2, pad_of_pad_opt(pad_opt$4), 0, fmt]]; + case 6: + var prec_opt = ign[2], pad_opt$5 = ign[1]; + if(prec_opt) + var ndec = prec_opt[1], _dR_ = [0, ndec]; + else + var _dR_ = 0; + return [0, [8, _a_, pad_of_pad_opt(pad_opt$5), _dR_, fmt]]; + case 7: + var pad_opt$6 = ign[1]; + return [0, [9, pad_of_pad_opt(pad_opt$6), fmt]]; + case 8: + var fmtty = ign[2], pad_opt$7 = ign[1]; + return [0, [13, pad_opt$7, fmtty, fmt]]; + case 9: + var fmtty$0 = ign[2], pad_opt$8 = ign[1]; + return [0, [14, pad_opt$8, fmtty$0, fmt]]; + case 10: + var char_set = ign[2], width_opt = ign[1]; + return [0, [20, width_opt, char_set, fmt]]; + default: var counter = ign[1]; return [0, [21, counter, fmt]]; + } + } + function default_float_precision(fconv){return 5 === fconv[2] ? 12 : -6;} + function buffer_create(init_size){ + return [0, 0, caml_create_bytes(init_size)]; + } + function buffer_check_size(buf, overhead){ + var + len = runtime.caml_ml_bytes_length(buf[2]), + min_len = buf[1] + overhead | 0, + _dP_ = len < min_len ? 1 : 0; + if(_dP_){ + var + new_len = caml_call2(Stdlib_Int[11], len * 2 | 0, min_len), + new_str = caml_create_bytes(new_len); + caml_call5(Stdlib_Bytes[11], buf[2], 0, new_str, 0, len); + buf[2] = new_str; + var _dQ_ = 0; + } + else + var _dQ_ = _dP_; + return _dQ_; + } + function buffer_add_char(buf, c){ + buffer_check_size(buf, 1); + caml_bytes_set(buf[2], buf[1], c); + buf[1] = buf[1] + 1 | 0; + return 0; + } + function buffer_add_string(buf, s){ + var str_len = caml_ml_string_length(s); + buffer_check_size(buf, str_len); + caml_call5(Stdlib_String[48], s, 0, buf[2], buf[1], str_len); + buf[1] = buf[1] + str_len | 0; + return 0; + } + function buffer_contents(buf){ + return caml_call3(Stdlib_Bytes[8], buf[2], 0, buf[1]); + } + function char_of_iconv(iconv){ + switch(iconv){ + case 6: + case 7: + return 120; + case 8: + case 9: + return 88; + case 10: + case 11: + return 111; + case 12: + case 15: + return 117; + case 0: + case 1: + case 2: + case 13: + return 100; + default: return 105; + } + } + function char_of_fconv(opt, fconv){ + if(opt) var sth = opt[1], cF = sth; else var cF = 70; + switch(fconv[2]){ + case 0: + return 102; + case 1: + return 101; + case 2: + return 69; + case 3: + return 103; + case 4: + return 71; + case 5: + return cF; + case 6: + return 104; + case 7: + return 72; + default: return 70; + } + } + function bprint_padty(buf, padty){ + switch(padty){ + case 0: + return buffer_add_char(buf, 45); + case 1: + return 0; + default: return buffer_add_char(buf, 48); + } + } + function bprint_ignored_flag(buf, ign_flag){ + return ign_flag ? buffer_add_char(buf, 95) : ign_flag; + } + function bprint_pad_opt(buf, pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], width)); + } + function bprint_padding(buf, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]){ + var n = pad[2], padty = pad[1]; + bprint_padty(buf, padty); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + var padty$0 = pad[1]; + bprint_padty(buf, padty$0); + return buffer_add_char(buf, 42); + } + function bprint_precision(buf, prec){ + if(typeof prec === "number") + return prec ? buffer_add_string(buf, cst) : 0; + var n = prec[1]; + buffer_add_char(buf, 46); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + function bprint_iconv_flag(buf, iconv){ + switch(iconv){ + case 1: + case 4: + return buffer_add_char(buf, 43); + case 2: + case 5: + return buffer_add_char(buf, 32); + case 7: + case 9: + case 11: + case 13: + case 14: + case 15: + return buffer_add_char(buf, 35); + default: return 0; + } + } + function bprint_altint_fmt(buf, ign_flag, iconv, pad, prec, c){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad); + bprint_precision(buf, prec); + buffer_add_char(buf, c); + return buffer_add_char(buf, char_of_iconv(iconv)); + } + function bprint_fconv_flag(buf, fconv){ + switch(fconv[1]){ + case 0: break; + case 1: + buffer_add_char(buf, 43); break; + default: buffer_add_char(buf, 32); + } + return 8 <= fconv[2] ? buffer_add_char(buf, 35) : 0; + } + function string_of_formatting_lit(formatting_lit){ + if(typeof formatting_lit === "number") + switch(formatting_lit){ + case 0: + return cst$0; + case 1: + return cst$1; + case 2: + return cst$2; + case 3: + return cst$3; + case 4: + return cst$4; + case 5: + return cst$5; + default: return cst$6; + } + switch(formatting_lit[0]){ + case 0: + var str = formatting_lit[1]; return str; + case 1: + var str$0 = formatting_lit[1]; return str$0; + default: + var c = formatting_lit[1], _dO_ = caml_call2(Stdlib_String[1], 1, c); + return caml_call2(Stdlib[28], cst$7, _dO_); + } + } + function bprint_char_literal(buf, chr){ + return 37 === chr + ? buffer_add_string(buf, cst$8) + : buffer_add_char(buf, chr); + } + function bprint_string_literal(buf, str){ + var _dM_ = caml_ml_string_length(str) - 1 | 0, _dL_ = 0; + if(_dM_ >= 0){ + var i = _dL_; + for(;;){ + bprint_char_literal(buf, caml_string_get(str, i)); + var _dN_ = i + 1 | 0; + if(_dM_ !== i){var i = _dN_; continue;} + break; + } + } + return 0; + } + function bprint_fmtty(buf, fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1]; + buffer_add_string(buf, cst_c); + var fmtty$0 = fmtty$1; + continue; + case 1: + var fmtty$2 = fmtty$0[1]; + buffer_add_string(buf, cst_s); + var fmtty$0 = fmtty$2; + continue; + case 2: + var fmtty$3 = fmtty$0[1]; + buffer_add_string(buf, cst_i); + var fmtty$0 = fmtty$3; + continue; + case 3: + var fmtty$4 = fmtty$0[1]; + buffer_add_string(buf, cst_li); + var fmtty$0 = fmtty$4; + continue; + case 4: + var fmtty$5 = fmtty$0[1]; + buffer_add_string(buf, cst_ni); + var fmtty$0 = fmtty$5; + continue; + case 5: + var fmtty$6 = fmtty$0[1]; + buffer_add_string(buf, cst_Li); + var fmtty$0 = fmtty$6; + continue; + case 6: + var fmtty$7 = fmtty$0[1]; + buffer_add_string(buf, cst_f); + var fmtty$0 = fmtty$7; + continue; + case 7: + var fmtty$8 = fmtty$0[1]; + buffer_add_string(buf, cst_B); + var fmtty$0 = fmtty$8; + continue; + case 8: + var fmtty$9 = fmtty$0[2], sub_fmtty = fmtty$0[1]; + buffer_add_string(buf, cst$9); + bprint_fmtty(buf, sub_fmtty); + buffer_add_string(buf, cst$10); + var fmtty$0 = fmtty$9; + continue; + case 9: + var fmtty$10 = fmtty$0[3], sub_fmtty$0 = fmtty$0[1]; + buffer_add_string(buf, cst$11); + bprint_fmtty(buf, sub_fmtty$0); + buffer_add_string(buf, cst$12); + var fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1]; + buffer_add_string(buf, cst_a); + var fmtty$0 = fmtty$11; + continue; + case 11: + var fmtty$12 = fmtty$0[1]; + buffer_add_string(buf, cst_t); + var fmtty$0 = fmtty$12; + continue; + case 12: + var fmtty$13 = fmtty$0[1]; + buffer_add_string(buf, cst$13); + var fmtty$0 = fmtty$13; + continue; + case 13: + var fmtty$14 = fmtty$0[1]; + buffer_add_string(buf, cst_r); + var fmtty$0 = fmtty$14; + continue; + default: + var fmtty$15 = fmtty$0[1]; + buffer_add_string(buf, cst_r$0); + var fmtty$0 = fmtty$15; + continue; + } + } + } + function int_of_custom_arity(param){ + if(! param) return 0; + var x = param[1]; + return 1 + int_of_custom_arity(x) | 0; + } + function string_of_fmt(fmt){ + var buf = buffer_create(16); + function fmtiter(fmt, ign_flag){ + var fmt$0 = fmt, ign_flag$0 = ign_flag; + a: + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 99); + var fmt$0 = rest, ign_flag$0 = 0; + continue; + case 1: + var rest$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 67); + var fmt$0 = rest$0, ign_flag$0 = 0; + continue; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad); + buffer_add_char(buf, 115); + var fmt$0 = rest$1, ign_flag$0 = 0; + continue; + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$0); + buffer_add_char(buf, 83); + var fmt$0 = rest$2, ign_flag$0 = 0; + continue; + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad$1); + bprint_precision(buf, prec); + buffer_add_char(buf, char_of_iconv(iconv)); + var fmt$0 = rest$3, ign_flag$0 = 0; + continue; + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$0, pad$2, prec$0, 108); + var fmt$0 = rest$4, ign_flag$0 = 0; + continue; + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$1, pad$3, prec$1, 110); + var fmt$0 = rest$5, ign_flag$0 = 0; + continue; + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$2, pad$4, prec$2, 76); + var fmt$0 = rest$6, ign_flag$0 = 0; + continue; + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_fconv_flag(buf, fconv); + bprint_padding(buf, pad$5); + bprint_precision(buf, prec$3); + buffer_add_char(buf, char_of_fconv(0, fconv)); + var fmt$0 = rest$7, ign_flag$0 = 0; + continue; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$6); + buffer_add_char(buf, 66); + var fmt$0 = rest$8, ign_flag$0 = 0; + continue; + case 10: + var rest$9 = fmt$0[1]; + buffer_add_string(buf, cst$14); + var fmt$0 = rest$9; + continue; + case 11: + var rest$10 = fmt$0[2], str = fmt$0[1]; + bprint_string_literal(buf, str); + var fmt$0 = rest$10; + continue; + case 12: + var rest$11 = fmt$0[2], chr = fmt$0[1]; + bprint_char_literal(buf, chr); + var fmt$0 = rest$11; + continue; + case 13: + var rest$12 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt); + buffer_add_char(buf, 123); + bprint_fmtty(buf, fmtty); + buffer_add_char(buf, 37); + buffer_add_char(buf, 125); + var fmt$0 = rest$12, ign_flag$0 = 0; + continue; + case 14: + var rest$13 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt$0); + buffer_add_char(buf, 40); + bprint_fmtty(buf, fmtty$0); + buffer_add_char(buf, 37); + buffer_add_char(buf, 41); + var fmt$0 = rest$13, ign_flag$0 = 0; + continue; + case 15: + var rest$14 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 97); + var fmt$0 = rest$14, ign_flag$0 = 0; + continue; + case 16: + var rest$15 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 116); + var fmt$0 = rest$15, ign_flag$0 = 0; + continue; + case 17: + var rest$16 = fmt$0[2], fmting_lit = fmt$0[1]; + bprint_string_literal(buf, string_of_formatting_lit(fmting_lit)); + var fmt$0 = rest$16; + continue; + case 18: + var rest$17 = fmt$0[2], fmting_gen = fmt$0[1]; + if(0 === fmting_gen[0]){ + var str$0 = fmting_gen[1][2]; + buffer_add_string(buf, cst$15); + buffer_add_string(buf, str$0); + } + else{ + var str$1 = fmting_gen[1][2]; + buffer_add_string(buf, cst$16); + buffer_add_string(buf, str$1); + } + var fmt$0 = rest$17; + continue; + case 19: + var rest$18 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 114); + var fmt$0 = rest$18, ign_flag$0 = 0; + continue; + case 20: + var rest$19 = fmt$0[3], char_set = fmt$0[2], width_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, width_opt); + var + print_char = + function(buf, i){ + var c = caml_call1(Stdlib[29], i); + return 37 === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 37)) + : 64 + === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 64)) + : buffer_add_char(buf, c); + }; + buffer_add_char(buf, 91); + var + set = + is_in_char_set(char_set, 0) + ? (buffer_add_char(buf, 94), rev_char_set(char_set)) + : char_set, + is_alone$0 = + function(set){ + function is_alone(c){ + var + after = caml_call1(Stdlib_Char[1], c + 1 | 0), + before = caml_call1(Stdlib_Char[1], c - 1 | 0), + _dH_ = is_in_char_set(set, c); + if(_dH_) + var + _dI_ = is_in_char_set(set, before), + _dJ_ = _dI_ ? is_in_char_set(set, after) : _dI_, + _dK_ = 1 - _dJ_; + else + var _dK_ = _dH_; + return _dK_; + } + return is_alone; + }, + is_alone = is_alone$0(set); + if(is_alone(93)) buffer_add_char(buf, 93); + var i = 1; + b: + for(;;){ + if(i < 256){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i))){var i$0 = i + 1 | 0, i = i$0; continue;} + var switcher = caml_call1(Stdlib[29], i) - 45 | 0, switch$0 = 0; + if(48 < switcher >>> 0) + if(210 <= switcher) print_char(buf, 255); else switch$0 = 1; + else{ + if(46 < switcher - 1 >>> 0){ + var i$2 = i + 1 | 0, i = i$2; + continue; + } + switch$0 = 1; + } + if(switch$0){ + var i$1 = i + 1 | 0; + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1))){ + print_char(buf, i$1 - 1 | 0); + var i$6 = i$1 + 1 | 0, i = i$6; + continue; + } + var + switcher$0 = caml_call1(Stdlib[29], i$1) - 45 | 0, + switch$1 = 0; + if(48 < switcher$0 >>> 0){ + if(210 <= switcher$0){ + print_char(buf, 254); + print_char(buf, 255); + switch$1 = 1; + } + } + else if + (46 < switcher$0 - 1 >>> 0 + && ! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + var i$5 = i$1 + 1 | 0, i = i$5; + continue; + } + if(! switch$1){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + print_char(buf, i$1); + var i$4 = i$1 + 2 | 0, i = i$4; + continue; + } + var j = i$1 + 2 | 0, i$3 = i$1 - 1 | 0, j$0 = j; + for(;;){ + if + (256 !== j$0 + && is_in_char_set(set, caml_call1(Stdlib[29], j$0))){var j$1 = j$0 + 1 | 0, j$0 = j$1; continue;} + print_char(buf, i$3); + print_char(buf, 45); + print_char(buf, j$0 - 1 | 0); + if(j$0 < 256){var i$7 = j$0 + 1 | 0, i = i$7; continue b;} + break; + } + } + } + } + if(is_alone(45)) buffer_add_char(buf, 45); + buffer_add_char(buf, 93); + var fmt$0 = rest$19, ign_flag$0 = 0; + continue a; + } + case 21: + var rest$20 = fmt$0[2], counter = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + switch(counter){ + case 0: + var _dD_ = 108; break; + case 1: + var _dD_ = 110; break; + default: var _dD_ = 78; + } + buffer_add_char(buf, _dD_); + var fmt$0 = rest$20, ign_flag$0 = 0; + continue; + case 22: + var rest$21 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_string_literal(buf, cst_0c); + var fmt$0 = rest$21, ign_flag$0 = 0; + continue; + case 23: + var + rest$22 = fmt$0[2], + ign = fmt$0[1], + fmt$1 = param_format_of_ignored_format(ign, rest$22)[1], + fmt$0 = fmt$1, + ign_flag$0 = 1; + continue; + default: + var + rest$23 = fmt$0[3], + arity = fmt$0[1], + _dF_ = int_of_custom_arity(arity), + _dE_ = 1; + if(_dF_ >= 1){ + var i$8 = _dE_; + for(;;){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 63); + var _dG_ = i$8 + 1 | 0; + if(_dF_ !== i$8){var i$8 = _dG_; continue;} + break; + } + } + var fmt$0 = rest$23, ign_flag$0 = 0; + continue; + } + } + } + fmtiter(fmt, 0); + return buffer_contents(buf); + } + function symm(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, symm(rest)]; + case 1: + var rest$0 = param[1]; return [1, symm(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, symm(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, symm(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, symm(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, symm(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, symm(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, symm(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; return [8, ty, symm(rest$7)]; + case 9: + var rest$8 = param[3], ty2 = param[2], ty1 = param[1]; + return [9, ty2, ty1, symm(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, symm(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, symm(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, symm(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, symm(rest$12)]; + default: var rest$13 = param[1]; return [14, symm(rest$13)]; + } + } + function fmtty_rel_det(param){ + if(typeof param !== "number") + switch(param[0]){ + case 0: + var + rest = param[1], + match = fmtty_rel_det(rest), + de = match[4], + ed = match[3], + af = match[2], + fa = match[1], + _di_ = function(param){caml_call1(af, 0); return 0;}; + return [0, + function(param){caml_call1(fa, 0); return 0;}, + _di_, + ed, + de]; + case 1: + var + rest$0 = param[1], + match$0 = fmtty_rel_det(rest$0), + de$0 = match$0[4], + ed$0 = match$0[3], + af$0 = match$0[2], + fa$0 = match$0[1], + _dj_ = function(param){caml_call1(af$0, 0); return 0;}; + return [0, + function(param){caml_call1(fa$0, 0); return 0;}, + _dj_, + ed$0, + de$0]; + case 2: + var + rest$1 = param[1], + match$1 = fmtty_rel_det(rest$1), + de$1 = match$1[4], + ed$1 = match$1[3], + af$1 = match$1[2], + fa$1 = match$1[1], + _dk_ = function(param){caml_call1(af$1, 0); return 0;}; + return [0, + function(param){caml_call1(fa$1, 0); return 0;}, + _dk_, + ed$1, + de$1]; + case 3: + var + rest$2 = param[1], + match$2 = fmtty_rel_det(rest$2), + de$2 = match$2[4], + ed$2 = match$2[3], + af$2 = match$2[2], + fa$2 = match$2[1], + _dl_ = function(param){caml_call1(af$2, 0); return 0;}; + return [0, + function(param){caml_call1(fa$2, 0); return 0;}, + _dl_, + ed$2, + de$2]; + case 4: + var + rest$3 = param[1], + match$3 = fmtty_rel_det(rest$3), + de$3 = match$3[4], + ed$3 = match$3[3], + af$3 = match$3[2], + fa$3 = match$3[1], + _dm_ = function(param){caml_call1(af$3, 0); return 0;}; + return [0, + function(param){caml_call1(fa$3, 0); return 0;}, + _dm_, + ed$3, + de$3]; + case 5: + var + rest$4 = param[1], + match$4 = fmtty_rel_det(rest$4), + de$4 = match$4[4], + ed$4 = match$4[3], + af$4 = match$4[2], + fa$4 = match$4[1], + _dn_ = function(param){caml_call1(af$4, 0); return 0;}; + return [0, + function(param){caml_call1(fa$4, 0); return 0;}, + _dn_, + ed$4, + de$4]; + case 6: + var + rest$5 = param[1], + match$5 = fmtty_rel_det(rest$5), + de$5 = match$5[4], + ed$5 = match$5[3], + af$5 = match$5[2], + fa$5 = match$5[1], + _do_ = function(param){caml_call1(af$5, 0); return 0;}; + return [0, + function(param){caml_call1(fa$5, 0); return 0;}, + _do_, + ed$5, + de$5]; + case 7: + var + rest$6 = param[1], + match$6 = fmtty_rel_det(rest$6), + de$6 = match$6[4], + ed$6 = match$6[3], + af$6 = match$6[2], + fa$6 = match$6[1], + _dp_ = function(param){caml_call1(af$6, 0); return 0;}; + return [0, + function(param){caml_call1(fa$6, 0); return 0;}, + _dp_, + ed$6, + de$6]; + case 8: + var + rest$7 = param[2], + match$7 = fmtty_rel_det(rest$7), + de$7 = match$7[4], + ed$7 = match$7[3], + af$7 = match$7[2], + fa$7 = match$7[1], + _dq_ = function(param){caml_call1(af$7, 0); return 0;}; + return [0, + function(param){caml_call1(fa$7, 0); return 0;}, + _dq_, + ed$7, + de$7]; + case 9: + var + rest$8 = param[3], + ty2 = param[2], + ty1 = param[1], + match$8 = fmtty_rel_det(rest$8), + de$8 = match$8[4], + ed$8 = match$8[3], + af$8 = match$8[2], + fa$8 = match$8[1], + ty = trans(symm(ty1), ty2), + match$9 = fmtty_rel_det(ty), + jd = match$9[4], + dj = match$9[3], + ga = match$9[2], + ag = match$9[1], + _dr_ = + function(param){caml_call1(jd, 0); caml_call1(de$8, 0); return 0;}, + _ds_ = + function(param){caml_call1(ed$8, 0); caml_call1(dj, 0); return 0;}, + _dt_ = + function(param){caml_call1(ga, 0); caml_call1(af$8, 0); return 0;}; + return [0, + function(param){ + caml_call1(fa$8, 0); + caml_call1(ag, 0); + return 0; + }, + _dt_, + _ds_, + _dr_]; + case 10: + var + rest$9 = param[1], + match$10 = fmtty_rel_det(rest$9), + de$9 = match$10[4], + ed$9 = match$10[3], + af$9 = match$10[2], + fa$9 = match$10[1], + _du_ = function(param){caml_call1(af$9, 0); return 0;}; + return [0, + function(param){caml_call1(fa$9, 0); return 0;}, + _du_, + ed$9, + de$9]; + case 11: + var + rest$10 = param[1], + match$11 = fmtty_rel_det(rest$10), + de$10 = match$11[4], + ed$10 = match$11[3], + af$10 = match$11[2], + fa$10 = match$11[1], + _dv_ = function(param){caml_call1(af$10, 0); return 0;}; + return [0, + function(param){caml_call1(fa$10, 0); return 0;}, + _dv_, + ed$10, + de$10]; + case 12: + var + rest$11 = param[1], + match$12 = fmtty_rel_det(rest$11), + de$11 = match$12[4], + ed$11 = match$12[3], + af$11 = match$12[2], + fa$11 = match$12[1], + _dw_ = function(param){caml_call1(af$11, 0); return 0;}; + return [0, + function(param){caml_call1(fa$11, 0); return 0;}, + _dw_, + ed$11, + de$11]; + case 13: + var + rest$12 = param[1], + match$13 = fmtty_rel_det(rest$12), + de$12 = match$13[4], + ed$12 = match$13[3], + af$12 = match$13[2], + fa$12 = match$13[1], + _dx_ = function(param){caml_call1(de$12, 0); return 0;}, + _dy_ = function(param){caml_call1(ed$12, 0); return 0;}, + _dz_ = function(param){caml_call1(af$12, 0); return 0;}; + return [0, + function(param){caml_call1(fa$12, 0); return 0;}, + _dz_, + _dy_, + _dx_]; + default: + var + rest$13 = param[1], + match$14 = fmtty_rel_det(rest$13), + de$13 = match$14[4], + ed$13 = match$14[3], + af$13 = match$14[2], + fa$13 = match$14[1], + _dA_ = function(param){caml_call1(de$13, 0); return 0;}, + _dB_ = function(param){caml_call1(ed$13, 0); return 0;}, + _dC_ = function(param){caml_call1(af$13, 0); return 0;}; + return [0, + function(param){caml_call1(fa$13, 0); return 0;}, + _dC_, + _dB_, + _dA_]; + } + function _df_(param){return 0;} + function _dg_(param){return 0;} + function _dh_(param){return 0;} + return [0, function(param){return 0;}, _dh_, _dg_, _df_]; + } + function trans(ty1, ty2){ + var switch$0 = 0; + if(typeof ty1 === "number"){ + if(typeof ty2 === "number") return 0; + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + } + else + switch(ty1[0]){ + case 0: + var rest1 = ty1[1], switch$1 = 0; + if(typeof ty2 === "number") + switch$1 = 1; + else + switch(ty2[0]){ + case 0: + var rest2 = ty2[1]; return [0, trans(rest1, rest2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$1 = 1; + } + if(switch$1) switch$0 = 7; + break; + case 1: + var rest1$0 = ty1[1], switch$2 = 0; + if(typeof ty2 === "number") + switch$2 = 1; + else + switch(ty2[0]){ + case 1: + var rest2$0 = ty2[1]; return [1, trans(rest1$0, rest2$0)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$2 = 1; + } + if(switch$2) switch$0 = 7; + break; + case 2: + var rest1$1 = ty1[1], switch$3 = 0; + if(typeof ty2 === "number") + switch$3 = 1; + else + switch(ty2[0]){ + case 2: + var rest2$1 = ty2[1]; return [2, trans(rest1$1, rest2$1)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$3 = 1; + } + if(switch$3) switch$0 = 7; + break; + case 3: + var rest1$2 = ty1[1], switch$4 = 0; + if(typeof ty2 === "number") + switch$4 = 1; + else + switch(ty2[0]){ + case 3: + var rest2$2 = ty2[1]; return [3, trans(rest1$2, rest2$2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$4 = 1; + } + if(switch$4) switch$0 = 7; + break; + case 4: + var rest1$3 = ty1[1], switch$5 = 0; + if(typeof ty2 === "number") + switch$5 = 1; + else + switch(ty2[0]){ + case 4: + var rest2$3 = ty2[1]; return [4, trans(rest1$3, rest2$3)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$5 = 1; + } + if(switch$5) switch$0 = 7; + break; + case 5: + var rest1$4 = ty1[1], switch$6 = 0; + if(typeof ty2 === "number") + switch$6 = 1; + else + switch(ty2[0]){ + case 5: + var rest2$4 = ty2[1]; return [5, trans(rest1$4, rest2$4)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$6 = 1; + } + if(switch$6) switch$0 = 7; + break; + case 6: + var rest1$5 = ty1[1], switch$7 = 0; + if(typeof ty2 === "number") + switch$7 = 1; + else + switch(ty2[0]){ + case 6: + var rest2$5 = ty2[1]; return [6, trans(rest1$5, rest2$5)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$7 = 1; + } + if(switch$7) switch$0 = 7; + break; + case 7: + var rest1$6 = ty1[1], switch$8 = 0; + if(typeof ty2 === "number") + switch$8 = 1; + else + switch(ty2[0]){ + case 7: + var rest2$6 = ty2[1]; return [7, trans(rest1$6, rest2$6)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$8 = 1; + } + if(switch$8) switch$0 = 7; + break; + case 8: + var rest1$7 = ty1[2], ty1$0 = ty1[1], switch$9 = 0; + if(typeof ty2 === "number") + switch$9 = 1; + else + switch(ty2[0]){ + case 8: + var + rest2$7 = ty2[2], + ty2$0 = ty2[1], + _de_ = trans(rest1$7, rest2$7); + return [8, trans(ty1$0, ty2$0), _de_]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$9 = 1; + } + if(switch$9) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + break; + case 9: + var rest1$8 = ty1[3], ty12 = ty1[2], ty11 = ty1[1], switch$10 = 0; + if(typeof ty2 === "number") + switch$10 = 1; + else + switch(ty2[0]){ + case 8: + switch$0 = 5; break; + case 9: + var + rest2$8 = ty2[3], + ty22 = ty2[2], + ty21 = ty2[1], + ty = trans(symm(ty12), ty21), + match = fmtty_rel_det(ty), + f4 = match[4], + f2 = match[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + return [9, ty11, ty22, trans(rest1$8, rest2$8)]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$10 = 1; + } + if(switch$10) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + break; + case 10: + var rest1$9 = ty1[1]; + if(typeof ty2 !== "number" && 10 === ty2[0]){ + var rest2$9 = ty2[1]; + return [10, trans(rest1$9, rest2$9)]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + case 11: + var rest1$10 = ty1[1], switch$11 = 0; + if(typeof ty2 === "number") + switch$11 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + var rest2$10 = ty2[1]; return [11, trans(rest1$10, rest2$10)]; + default: switch$11 = 1; + } + if(switch$11) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + break; + case 12: + var rest1$11 = ty1[1], switch$12 = 0; + if(typeof ty2 === "number") + switch$12 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + var rest2$11 = ty2[1]; return [12, trans(rest1$11, rest2$11)]; + default: switch$12 = 1; + } + if(switch$12) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + break; + case 13: + var rest1$12 = ty1[1], switch$13 = 0; + if(typeof ty2 === "number") + switch$13 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + var rest2$12 = ty2[1]; return [13, trans(rest1$12, rest2$12)]; + default: switch$13 = 1; + } + if(switch$13) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + break; + default: + var rest1$13 = ty1[1], switch$14 = 0; + if(typeof ty2 === "number") + switch$14 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + var rest2$13 = ty2[1]; return [14, trans(rest1$13, rest2$13)]; + default: switch$14 = 1; + } + if(switch$14) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + } + switch(switch$0){ + case 0: + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + case 1: + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + case 3: + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + case 4: + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + case 5: + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + case 6: + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + default: throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function fmtty_of_padding_fmtty(pad, fmtty){ + return typeof pad === "number" ? fmtty : 0 === pad[0] ? fmtty : [2, fmtty]; + } + function fmtty_of_custom(arity, fmtty){ + if(! arity) return fmtty; + var arity$0 = arity[1]; + return [12, fmtty_of_custom(arity$0, fmtty)]; + } + function fmtty_of_fmt(fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var rest = fmtty$0[1]; return [0, fmtty_of_fmt(rest)]; + case 1: + var rest$0 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$0)]; + case 2: + var rest$1 = fmtty$0[2], pad = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad, [1, fmtty_of_fmt(rest$1)]); + case 3: + var rest$2 = fmtty$0[2], pad$0 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$0, [1, fmtty_of_fmt(rest$2)]); + case 4: + var + rest$3 = fmtty$0[4], + prec = fmtty$0[3], + pad$1 = fmtty$0[2], + ty_rest = fmtty_of_fmt(rest$3), + prec_ty = fmtty_of_precision_fmtty(prec, [2, ty_rest]); + return fmtty_of_padding_fmtty(pad$1, prec_ty); + case 5: + var + rest$4 = fmtty$0[4], + prec$0 = fmtty$0[3], + pad$2 = fmtty$0[2], + ty_rest$0 = fmtty_of_fmt(rest$4), + prec_ty$0 = fmtty_of_precision_fmtty(prec$0, [3, ty_rest$0]); + return fmtty_of_padding_fmtty(pad$2, prec_ty$0); + case 6: + var + rest$5 = fmtty$0[4], + prec$1 = fmtty$0[3], + pad$3 = fmtty$0[2], + ty_rest$1 = fmtty_of_fmt(rest$5), + prec_ty$1 = fmtty_of_precision_fmtty(prec$1, [4, ty_rest$1]); + return fmtty_of_padding_fmtty(pad$3, prec_ty$1); + case 7: + var + rest$6 = fmtty$0[4], + prec$2 = fmtty$0[3], + pad$4 = fmtty$0[2], + ty_rest$2 = fmtty_of_fmt(rest$6), + prec_ty$2 = fmtty_of_precision_fmtty(prec$2, [5, ty_rest$2]); + return fmtty_of_padding_fmtty(pad$4, prec_ty$2); + case 8: + var + rest$7 = fmtty$0[4], + prec$3 = fmtty$0[3], + pad$5 = fmtty$0[2], + ty_rest$3 = fmtty_of_fmt(rest$7), + prec_ty$3 = fmtty_of_precision_fmtty(prec$3, [6, ty_rest$3]); + return fmtty_of_padding_fmtty(pad$5, prec_ty$3); + case 9: + var rest$8 = fmtty$0[2], pad$6 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$6, [7, fmtty_of_fmt(rest$8)]); + case 10: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 11: + var fmtty$2 = fmtty$0[2], fmtty$0 = fmtty$2; continue; + case 12: + var fmtty$3 = fmtty$0[2], fmtty$0 = fmtty$3; continue; + case 13: + var rest$9 = fmtty$0[3], ty = fmtty$0[2]; + return [8, ty, fmtty_of_fmt(rest$9)]; + case 14: + var rest$10 = fmtty$0[3], ty$0 = fmtty$0[2]; + return [9, ty$0, ty$0, fmtty_of_fmt(rest$10)]; + case 15: + var rest$11 = fmtty$0[1]; return [10, fmtty_of_fmt(rest$11)]; + case 16: + var rest$12 = fmtty$0[1]; return [11, fmtty_of_fmt(rest$12)]; + case 17: + var fmtty$4 = fmtty$0[2], fmtty$0 = fmtty$4; continue; + case 18: + var + rest$13 = fmtty$0[2], + formatting_gen = fmtty$0[1], + _db_ = fmtty_of_fmt(rest$13); + if(0 === formatting_gen[0]) + var fmt = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt); + else + var fmt$0 = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt$0); + return caml_call2(CamlinternalFormatBasics[1], _dc_, _db_); + case 19: + var rest$14 = fmtty$0[1]; return [13, fmtty_of_fmt(rest$14)]; + case 20: + var rest$15 = fmtty$0[3]; return [1, fmtty_of_fmt(rest$15)]; + case 21: + var rest$16 = fmtty$0[2]; return [2, fmtty_of_fmt(rest$16)]; + case 22: + var rest$17 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$17)]; + case 23: + var fmtty$5 = fmtty$0[2], ign = fmtty$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + return [14, fmtty_of_fmt(fmtty$5)]; + default: var fmtty$0 = fmtty$5; continue; + } + switch(ign[0]){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + var fmtty$0 = fmtty$5; continue; + case 3: + var fmtty$0 = fmtty$5; continue; + case 4: + var fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$0 = fmtty$5; continue; + case 6: + var fmtty$0 = fmtty$5; continue; + case 7: + var fmtty$0 = fmtty$5; continue; + case 8: + var fmtty$0 = fmtty$5; continue; + case 9: + var fmtty$6 = ign[2], _dd_ = fmtty_of_fmt(fmtty$5); + return caml_call2(CamlinternalFormatBasics[1], fmtty$6, _dd_); + case 10: + var fmtty$0 = fmtty$5; continue; + default: var fmtty$0 = fmtty$5; continue; + } + default: + var rest$18 = fmtty$0[3], arity = fmtty$0[1]; + return fmtty_of_custom(arity, fmtty_of_fmt(rest$18)); + } + } + } + function fmtty_of_precision_fmtty(prec, fmtty){ + return typeof prec === "number" ? prec ? [2, fmtty] : fmtty : fmtty; + } + var + Type_mismatch = + [248, cst_CamlinternalFormat_Type_mi, runtime.caml_fresh_oo_id(0)]; + function type_padding(pad, fmtty){ + if(typeof pad === "number") return [0, 0, fmtty]; + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + return [0, [0, padty, w], fmtty]; + } + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var rest = fmtty[1], padty$0 = pad[1]; + return [0, [1, padty$0], rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_padprec(pad, prec, fmtty){ + var match = type_padding(pad, fmtty); + if(typeof prec !== "number"){ + var rest$1 = match[2], pad$2 = match[1], p = prec[1]; + return [0, pad$2, [0, p], rest$1]; + } + if(! prec){ + var rest$0 = match[2], pad$1 = match[1]; + return [0, pad$1, 0, rest$0]; + } + var match$0 = match[2]; + if(typeof match$0 !== "number" && 2 === match$0[0]){ + var rest = match$0[1], pad$0 = match[1]; + return [0, pad$0, 1, rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_format(fmt, fmtty){ + var _da_ = type_format_gen(fmt, fmtty); + if(typeof _da_[2] !== "number") + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var fmt$0 = _da_[1]; + return fmt$0; + } + function type_ignored_param_one(ign, fmt, fmtty){ + var + match = type_format_gen(fmt, fmtty), + fmtty$0 = match[2], + fmt$0 = match[1]; + return [0, [23, ign, fmt$0], fmtty$0]; + } + function type_format_gen(fmt, fmtty0){ + if(typeof fmt === "number") return [0, 0, fmtty0]; + switch(fmt[0]){ + case 0: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest = fmtty0[1], + fmt_rest = fmt[1], + match = type_format_gen(fmt_rest, fmtty_rest), + fmtty = match[2], + fmt$0 = match[1]; + return [0, [0, fmt$0], fmtty]; + } + break; + case 1: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest$0 = fmtty0[1], + fmt_rest$0 = fmt[1], + match$0 = type_format_gen(fmt_rest$0, fmtty_rest$0), + fmtty$0 = match$0[2], + fmt$1 = match$0[1]; + return [0, [1, fmt$1], fmtty$0]; + } + break; + case 2: + var + fmt_rest$1 = fmt[2], + pad = fmt[1], + match$1 = type_padding(pad, fmtty0), + pad$0 = match$1[1], + match$2 = match$1[2]; + if(typeof match$2 !== "number" && 1 === match$2[0]){ + var + fmtty_rest$1 = match$2[1], + match$3 = type_format_gen(fmt_rest$1, fmtty_rest$1), + fmtty$1 = match$3[2], + fmt$2 = match$3[1]; + return [0, [2, pad$0, fmt$2], fmtty$1]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 3: + var + fmt_rest$2 = fmt[2], + pad$1 = fmt[1], + match$4 = type_padding(pad$1, fmtty0), + pad$2 = match$4[1], + match$5 = match$4[2]; + if(typeof match$5 !== "number" && 1 === match$5[0]){ + var + fmtty_rest$2 = match$5[1], + match$6 = type_format_gen(fmt_rest$2, fmtty_rest$2), + fmtty$2 = match$6[2], + fmt$3 = match$6[1]; + return [0, [3, pad$2, fmt$3], fmtty$2]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 4: + var + fmt_rest$3 = fmt[4], + prec = fmt[3], + pad$3 = fmt[2], + iconv = fmt[1], + match$7 = type_padprec(pad$3, prec, fmtty0), + pad$4 = match$7[1], + match$8 = match$7[3]; + if(typeof match$8 !== "number" && 2 === match$8[0]){ + var + fmtty_rest$3 = match$8[1], + prec$0 = match$7[2], + match$9 = type_format_gen(fmt_rest$3, fmtty_rest$3), + fmtty$3 = match$9[2], + fmt$4 = match$9[1]; + return [0, [4, iconv, pad$4, prec$0, fmt$4], fmtty$3]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 5: + var + fmt_rest$4 = fmt[4], + prec$1 = fmt[3], + pad$5 = fmt[2], + iconv$0 = fmt[1], + match$10 = type_padprec(pad$5, prec$1, fmtty0), + pad$6 = match$10[1], + match$11 = match$10[3]; + if(typeof match$11 !== "number" && 3 === match$11[0]){ + var + fmtty_rest$4 = match$11[1], + prec$2 = match$10[2], + match$12 = type_format_gen(fmt_rest$4, fmtty_rest$4), + fmtty$4 = match$12[2], + fmt$5 = match$12[1]; + return [0, [5, iconv$0, pad$6, prec$2, fmt$5], fmtty$4]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 6: + var + fmt_rest$5 = fmt[4], + prec$3 = fmt[3], + pad$7 = fmt[2], + iconv$1 = fmt[1], + match$13 = type_padprec(pad$7, prec$3, fmtty0), + pad$8 = match$13[1], + match$14 = match$13[3]; + if(typeof match$14 !== "number" && 4 === match$14[0]){ + var + fmtty_rest$5 = match$14[1], + prec$4 = match$13[2], + match$15 = type_format_gen(fmt_rest$5, fmtty_rest$5), + fmtty$5 = match$15[2], + fmt$6 = match$15[1]; + return [0, [6, iconv$1, pad$8, prec$4, fmt$6], fmtty$5]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 7: + var + fmt_rest$6 = fmt[4], + prec$5 = fmt[3], + pad$9 = fmt[2], + iconv$2 = fmt[1], + match$16 = type_padprec(pad$9, prec$5, fmtty0), + pad$10 = match$16[1], + match$17 = match$16[3]; + if(typeof match$17 !== "number" && 5 === match$17[0]){ + var + fmtty_rest$6 = match$17[1], + prec$6 = match$16[2], + match$18 = type_format_gen(fmt_rest$6, fmtty_rest$6), + fmtty$6 = match$18[2], + fmt$7 = match$18[1]; + return [0, [7, iconv$2, pad$10, prec$6, fmt$7], fmtty$6]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 8: + var + fmt_rest$7 = fmt[4], + prec$7 = fmt[3], + pad$11 = fmt[2], + fconv = fmt[1], + match$19 = type_padprec(pad$11, prec$7, fmtty0), + pad$12 = match$19[1], + match$20 = match$19[3]; + if(typeof match$20 !== "number" && 6 === match$20[0]){ + var + fmtty_rest$7 = match$20[1], + prec$8 = match$19[2], + match$21 = type_format_gen(fmt_rest$7, fmtty_rest$7), + fmtty$7 = match$21[2], + fmt$8 = match$21[1]; + return [0, [8, fconv, pad$12, prec$8, fmt$8], fmtty$7]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 9: + var + fmt_rest$8 = fmt[2], + pad$13 = fmt[1], + match$22 = type_padding(pad$13, fmtty0), + pad$14 = match$22[1], + match$23 = match$22[2]; + if(typeof match$23 !== "number" && 7 === match$23[0]){ + var + fmtty_rest$8 = match$23[1], + match$24 = type_format_gen(fmt_rest$8, fmtty_rest$8), + fmtty$8 = match$24[2], + fmt$9 = match$24[1]; + return [0, [9, pad$14, fmt$9], fmtty$8]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 10: + var + fmt_rest$9 = fmt[1], + match$25 = type_format_gen(fmt_rest$9, fmtty0), + fmtty$9 = match$25[2], + fmt$10 = match$25[1]; + return [0, [10, fmt$10], fmtty$9]; + case 11: + var + fmt_rest$10 = fmt[2], + str = fmt[1], + match$26 = type_format_gen(fmt_rest$10, fmtty0), + fmtty$10 = match$26[2], + fmt$11 = match$26[1]; + return [0, [11, str, fmt$11], fmtty$10]; + case 12: + var + fmt_rest$11 = fmt[2], + chr = fmt[1], + match$27 = type_format_gen(fmt_rest$11, fmtty0), + fmtty$11 = match$27[2], + fmt$12 = match$27[1]; + return [0, [12, chr, fmt$12], fmtty$11]; + case 13: + if(typeof fmtty0 !== "number" && 8 === fmtty0[0]){ + var + fmtty_rest$9 = fmtty0[2], + sub_fmtty = fmtty0[1], + fmt_rest$12 = fmt[3], + sub_fmtty$0 = fmt[2], + pad_opt = fmt[1]; + if(caml_notequal([0, sub_fmtty$0], [0, sub_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$28 = type_format_gen(fmt_rest$12, fmtty_rest$9), + fmtty$12 = match$28[2], + fmt$13 = match$28[1]; + return [0, [13, pad_opt, sub_fmtty, fmt$13], fmtty$12]; + } + break; + case 14: + if(typeof fmtty0 !== "number" && 9 === fmtty0[0]){ + var + fmtty_rest$10 = fmtty0[3], + sub_fmtty1 = fmtty0[1], + fmt_rest$13 = fmt[3], + sub_fmtty$1 = fmt[2], + pad_opt$0 = fmt[1], + _c__ = [0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty$1)], _c__)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$29 = + type_format_gen + (fmt_rest$13, + caml_call1(CamlinternalFormatBasics[2], fmtty_rest$10)), + fmtty$13 = match$29[2], + fmt$14 = match$29[1]; + return [0, [14, pad_opt$0, sub_fmtty1, fmt$14], fmtty$13]; + } + break; + case 15: + if(typeof fmtty0 !== "number" && 10 === fmtty0[0]){ + var + fmtty_rest$11 = fmtty0[1], + fmt_rest$14 = fmt[1], + match$30 = type_format_gen(fmt_rest$14, fmtty_rest$11), + fmtty$14 = match$30[2], + fmt$15 = match$30[1]; + return [0, [15, fmt$15], fmtty$14]; + } + break; + case 16: + if(typeof fmtty0 !== "number" && 11 === fmtty0[0]){ + var + fmtty_rest$12 = fmtty0[1], + fmt_rest$15 = fmt[1], + match$31 = type_format_gen(fmt_rest$15, fmtty_rest$12), + fmtty$15 = match$31[2], + fmt$16 = match$31[1]; + return [0, [16, fmt$16], fmtty$15]; + } + break; + case 17: + var + fmt_rest$16 = fmt[2], + formatting_lit = fmt[1], + match$32 = type_format_gen(fmt_rest$16, fmtty0), + fmtty$16 = match$32[2], + fmt$17 = match$32[1]; + return [0, [17, formatting_lit, fmt$17], fmtty$16]; + case 18: + var fmt_rest$17 = fmt[2], formatting_gen = fmt[1]; + if(0 === formatting_gen[0]){ + var + match$36 = formatting_gen[1], + str$0 = match$36[2], + fmt1 = match$36[1], + match$37 = type_format_gen(fmt1, fmtty0), + fmtty2 = match$37[2], + fmt2 = match$37[1], + match$38 = type_format_gen(fmt_rest$17, fmtty2), + fmtty3 = match$38[2], + fmt3 = match$38[1]; + return [0, [18, [0, [0, fmt2, str$0]], fmt3], fmtty3]; + } + var + match$39 = formatting_gen[1], + str$1 = match$39[2], + fmt1$0 = match$39[1], + match$40 = type_format_gen(fmt1$0, fmtty0), + fmtty2$0 = match$40[2], + fmt2$0 = match$40[1], + match$41 = type_format_gen(fmt_rest$17, fmtty2$0), + fmtty3$0 = match$41[2], + fmt3$0 = match$41[1]; + return [0, [18, [1, [0, fmt2$0, str$1]], fmt3$0], fmtty3$0]; + case 19: + if(typeof fmtty0 !== "number" && 13 === fmtty0[0]){ + var + fmtty_rest$13 = fmtty0[1], + fmt_rest$18 = fmt[1], + match$33 = type_format_gen(fmt_rest$18, fmtty_rest$13), + fmtty$17 = match$33[2], + fmt$18 = match$33[1]; + return [0, [19, fmt$18], fmtty$17]; + } + break; + case 20: + if(typeof fmtty0 !== "number" && 1 === fmtty0[0]){ + var + fmtty_rest$14 = fmtty0[1], + fmt_rest$19 = fmt[3], + char_set = fmt[2], + width_opt = fmt[1], + match$34 = type_format_gen(fmt_rest$19, fmtty_rest$14), + fmtty$18 = match$34[2], + fmt$19 = match$34[1]; + return [0, [20, width_opt, char_set, fmt$19], fmtty$18]; + } + break; + case 21: + if(typeof fmtty0 !== "number" && 2 === fmtty0[0]){ + var + fmtty_rest$15 = fmtty0[1], + fmt_rest$20 = fmt[2], + counter = fmt[1], + match$35 = type_format_gen(fmt_rest$20, fmtty_rest$15), + fmtty$19 = match$35[2], + fmt$20 = match$35[1]; + return [0, [21, counter, fmt$20], fmtty$19]; + } + break; + case 23: + var rest = fmt[2], ign = fmt[1]; + if(typeof ign !== "number") + switch(ign[0]){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + return type_ignored_param_one(ign, rest, fmtty0); + case 3: + return type_ignored_param_one(ign, rest, fmtty0); + case 4: + return type_ignored_param_one(ign, rest, fmtty0); + case 5: + return type_ignored_param_one(ign, rest, fmtty0); + case 6: + return type_ignored_param_one(ign, rest, fmtty0); + case 7: + return type_ignored_param_one(ign, rest, fmtty0); + case 8: + var sub_fmtty$2 = ign[2], pad_opt$1 = ign[1]; + return type_ignored_param_one + ([8, pad_opt$1, sub_fmtty$2], rest, fmtty0); + case 9: + var + sub_fmtty$3 = ign[2], + pad_opt$2 = ign[1], + _c$_ = type_ignored_format_substituti(sub_fmtty$3, rest, fmtty0), + match$43 = _c$_[2], + fmtty$21 = match$43[2], + fmt$22 = match$43[1], + sub_fmtty$4 = _c$_[1]; + return [0, [23, [9, pad_opt$2, sub_fmtty$4], fmt$22], fmtty$21]; + case 10: + return type_ignored_param_one(ign, rest, fmtty0); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + switch(ign){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + if(typeof fmtty0 !== "number" && 14 === fmtty0[0]){ + var + fmtty_rest$16 = fmtty0[1], + match$42 = type_format_gen(rest, fmtty_rest$16), + fmtty$20 = match$42[2], + fmt$21 = match$42[1]; + return [0, [23, 2, fmt$21], fmtty$20]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_ignored_format_substituti(sub_fmtty, fmt, fmtty){ + if(typeof sub_fmtty === "number") + return [0, 0, type_format_gen(fmt, fmtty)]; + switch(sub_fmtty[0]){ + case 0: + if(typeof fmtty !== "number" && 0 === fmtty[0]){ + var + fmtty_rest = fmtty[1], + sub_fmtty_rest = sub_fmtty[1], + match = + type_ignored_format_substituti(sub_fmtty_rest, fmt, fmtty_rest), + fmt$0 = match[2], + sub_fmtty_rest$0 = match[1]; + return [0, [0, sub_fmtty_rest$0], fmt$0]; + } + break; + case 1: + if(typeof fmtty !== "number" && 1 === fmtty[0]){ + var + fmtty_rest$0 = fmtty[1], + sub_fmtty_rest$1 = sub_fmtty[1], + match$0 = + type_ignored_format_substituti(sub_fmtty_rest$1, fmt, fmtty_rest$0), + fmt$1 = match$0[2], + sub_fmtty_rest$2 = match$0[1]; + return [0, [1, sub_fmtty_rest$2], fmt$1]; + } + break; + case 2: + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var + fmtty_rest$1 = fmtty[1], + sub_fmtty_rest$3 = sub_fmtty[1], + match$1 = + type_ignored_format_substituti(sub_fmtty_rest$3, fmt, fmtty_rest$1), + fmt$2 = match$1[2], + sub_fmtty_rest$4 = match$1[1]; + return [0, [2, sub_fmtty_rest$4], fmt$2]; + } + break; + case 3: + if(typeof fmtty !== "number" && 3 === fmtty[0]){ + var + fmtty_rest$2 = fmtty[1], + sub_fmtty_rest$5 = sub_fmtty[1], + match$2 = + type_ignored_format_substituti(sub_fmtty_rest$5, fmt, fmtty_rest$2), + fmt$3 = match$2[2], + sub_fmtty_rest$6 = match$2[1]; + return [0, [3, sub_fmtty_rest$6], fmt$3]; + } + break; + case 4: + if(typeof fmtty !== "number" && 4 === fmtty[0]){ + var + fmtty_rest$3 = fmtty[1], + sub_fmtty_rest$7 = sub_fmtty[1], + match$3 = + type_ignored_format_substituti(sub_fmtty_rest$7, fmt, fmtty_rest$3), + fmt$4 = match$3[2], + sub_fmtty_rest$8 = match$3[1]; + return [0, [4, sub_fmtty_rest$8], fmt$4]; + } + break; + case 5: + if(typeof fmtty !== "number" && 5 === fmtty[0]){ + var + fmtty_rest$4 = fmtty[1], + sub_fmtty_rest$9 = sub_fmtty[1], + match$4 = + type_ignored_format_substituti(sub_fmtty_rest$9, fmt, fmtty_rest$4), + fmt$5 = match$4[2], + sub_fmtty_rest$10 = match$4[1]; + return [0, [5, sub_fmtty_rest$10], fmt$5]; + } + break; + case 6: + if(typeof fmtty !== "number" && 6 === fmtty[0]){ + var + fmtty_rest$5 = fmtty[1], + sub_fmtty_rest$11 = sub_fmtty[1], + match$5 = + type_ignored_format_substituti + (sub_fmtty_rest$11, fmt, fmtty_rest$5), + fmt$6 = match$5[2], + sub_fmtty_rest$12 = match$5[1]; + return [0, [6, sub_fmtty_rest$12], fmt$6]; + } + break; + case 7: + if(typeof fmtty !== "number" && 7 === fmtty[0]){ + var + fmtty_rest$6 = fmtty[1], + sub_fmtty_rest$13 = sub_fmtty[1], + match$6 = + type_ignored_format_substituti + (sub_fmtty_rest$13, fmt, fmtty_rest$6), + fmt$7 = match$6[2], + sub_fmtty_rest$14 = match$6[1]; + return [0, [7, sub_fmtty_rest$14], fmt$7]; + } + break; + case 8: + if(typeof fmtty !== "number" && 8 === fmtty[0]){ + var + fmtty_rest$7 = fmtty[2], + sub2_fmtty = fmtty[1], + sub_fmtty_rest$15 = sub_fmtty[2], + sub2_fmtty$0 = sub_fmtty[1]; + if(caml_notequal([0, sub2_fmtty$0], [0, sub2_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$7 = + type_ignored_format_substituti + (sub_fmtty_rest$15, fmt, fmtty_rest$7), + fmt$8 = match$7[2], + sub_fmtty_rest$16 = match$7[1]; + return [0, [8, sub2_fmtty, sub_fmtty_rest$16], fmt$8]; + } + break; + case 9: + if(typeof fmtty !== "number" && 9 === fmtty[0]){ + var + fmtty_rest$8 = fmtty[3], + sub2_fmtty$1 = fmtty[2], + sub1_fmtty = fmtty[1], + sub_fmtty_rest$17 = sub_fmtty[3], + sub2_fmtty$2 = sub_fmtty[2], + sub1_fmtty$0 = sub_fmtty[1], + _c8_ = [0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty$0)], _c8_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var _c9_ = [0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$2)], _c9_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + sub_fmtty$0 = trans(symm(sub1_fmtty), sub2_fmtty$1), + match$8 = fmtty_rel_det(sub_fmtty$0), + f4 = match$8[4], + f2 = match$8[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + var + match$9 = + type_ignored_format_substituti + (caml_call1(CamlinternalFormatBasics[2], sub_fmtty_rest$17), + fmt, + fmtty_rest$8), + fmt$9 = match$9[2], + sub_fmtty_rest$18 = match$9[1]; + return [0, + [9, sub1_fmtty, sub2_fmtty$1, symm(sub_fmtty_rest$18)], + fmt$9]; + } + break; + case 10: + if(typeof fmtty !== "number" && 10 === fmtty[0]){ + var + fmtty_rest$9 = fmtty[1], + sub_fmtty_rest$19 = sub_fmtty[1], + match$10 = + type_ignored_format_substituti + (sub_fmtty_rest$19, fmt, fmtty_rest$9), + fmt$10 = match$10[2], + sub_fmtty_rest$20 = match$10[1]; + return [0, [10, sub_fmtty_rest$20], fmt$10]; + } + break; + case 11: + if(typeof fmtty !== "number" && 11 === fmtty[0]){ + var + fmtty_rest$10 = fmtty[1], + sub_fmtty_rest$21 = sub_fmtty[1], + match$11 = + type_ignored_format_substituti + (sub_fmtty_rest$21, fmt, fmtty_rest$10), + fmt$11 = match$11[2], + sub_fmtty_rest$22 = match$11[1]; + return [0, [11, sub_fmtty_rest$22], fmt$11]; + } + break; + case 13: + if(typeof fmtty !== "number" && 13 === fmtty[0]){ + var + fmtty_rest$11 = fmtty[1], + sub_fmtty_rest$23 = sub_fmtty[1], + match$12 = + type_ignored_format_substituti + (sub_fmtty_rest$23, fmt, fmtty_rest$11), + fmt$12 = match$12[2], + sub_fmtty_rest$24 = match$12[1]; + return [0, [13, sub_fmtty_rest$24], fmt$12]; + } + break; + case 14: + if(typeof fmtty !== "number" && 14 === fmtty[0]){ + var + fmtty_rest$12 = fmtty[1], + sub_fmtty_rest$25 = sub_fmtty[1], + match$13 = + type_ignored_format_substituti + (sub_fmtty_rest$25, fmt, fmtty_rest$12), + fmt$13 = match$13[2], + sub_fmtty_rest$26 = match$13[1]; + return [0, [14, sub_fmtty_rest$26], fmt$13]; + } + break; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function recast(fmt, fmtty){ + var _c7_ = symm(fmtty); + return type_format(fmt, caml_call1(CamlinternalFormatBasics[2], _c7_)); + } + function fix_padding(padty, width, str){ + var + len = caml_ml_string_length(str), + padty$0 = 0 <= width ? padty : 0, + width$0 = caml_call1(Stdlib[18], width); + if(width$0 <= len) return str; + var + _c6_ = 2 === padty$0 ? 48 : 32, + res = caml_call2(Stdlib_Bytes[1], width$0, _c6_); + switch(padty$0){ + case 0: + caml_call5(Stdlib_String[48], str, 0, res, 0, len); break; + case 1: + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + break; + default: + var switch$0 = 0; + if(0 < len){ + var switch$1 = 0; + if + (43 !== caml_string_get(str, 0) + && 45 !== caml_string_get(str, 0) && 32 !== caml_string_get(str, 0)){switch$0 = 1; switch$1 = 1;} + if(! switch$1){ + caml_bytes_set(res, 0, caml_string_get(str, 0)); + caml_call5 + (Stdlib_String[48], + str, + 1, + res, + (width$0 - len | 0) + 1 | 0, + len - 1 | 0); + } + } + else + switch$0 = 1; + if(switch$0){ + var switch$2 = 0; + if(1 < len && 48 === caml_string_get(str, 0)){ + var switch$3 = 0; + if(120 === caml_string_get(str, 1) || 88 === caml_string_get(str, 1)) + switch$3 = 1; + if(switch$3){ + caml_bytes_set(res, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res, + (width$0 - len | 0) + 2 | 0, + len - 2 | 0); + switch$2 = 1; + } + } + if(! switch$2) + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + } + } + return caml_call1(Stdlib_Bytes[44], res); + } + function fix_int_precision(prec, str){ + var + prec$0 = caml_call1(Stdlib[18], prec), + len = caml_ml_string_length(str), + c = caml_string_get(str, 0), + switch$0 = 0; + if(58 <= c){ + if(71 <= c){ + if(5 >= c - 97 >>> 0) switch$0 = 1; + } + else if(65 <= c) switch$0 = 1; + } + else{ + var switch$1 = 0; + if(32 === c) + switch$1 = 1; + else if(43 <= c) + switch(c - 43 | 0){ + case 5: + if(len < (prec$0 + 2 | 0) && 1 < len){ + var switch$2 = 0; + if + (120 !== caml_string_get(str, 1) && 88 !== caml_string_get(str, 1)) + switch$2 = 1; + if(! switch$2){ + var res$1 = caml_call2(Stdlib_Bytes[1], prec$0 + 2 | 0, 48); + caml_bytes_set(res$1, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res$1, + (prec$0 - len | 0) + 4 | 0, + len - 2 | 0); + return caml_call1(Stdlib_Bytes[44], res$1); + } + } + switch$0 = 1; + break; + case 0: + case 2: + switch$1 = 1; break; + case 1: + case 3: + case 4: break; + default: switch$0 = 1; + } + if(switch$1 && len < (prec$0 + 1 | 0)){ + var res$0 = caml_call2(Stdlib_Bytes[1], prec$0 + 1 | 0, 48); + caml_bytes_set(res$0, 0, c); + caml_call5 + (Stdlib_String[48], + str, + 1, + res$0, + (prec$0 - len | 0) + 2 | 0, + len - 1 | 0); + return caml_call1(Stdlib_Bytes[44], res$0); + } + } + if(switch$0 && len < prec$0){ + var res = caml_call2(Stdlib_Bytes[1], prec$0, 48); + caml_call5(Stdlib_String[48], str, 0, res, prec$0 - len | 0, len); + return caml_call1(Stdlib_Bytes[44], res); + } + return str; + } + function string_to_caml_string(str){ + var + str$0 = caml_call1(Stdlib_String[24], str), + l = caml_ml_string_length(str$0), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 34); + caml_blit_string(str$0, 0, res, 1, l); + return caml_call1(Stdlib_Bytes[44], res); + } + function format_of_fconv(fconv, prec){ + var + prec$0 = caml_call1(Stdlib[18], prec), + symb = char_of_fconv(_r_, fconv), + buf = buffer_create(16); + buffer_add_char(buf, 37); + bprint_fconv_flag(buf, fconv); + buffer_add_char(buf, 46); + buffer_add_string(buf, caml_call1(Stdlib_Int[12], prec$0)); + buffer_add_char(buf, symb); + return buffer_contents(buf); + } + function transform_int_alt(iconv, s){ + if(13 > iconv) return s; + var n = [0, 0], _c1_ = caml_ml_string_length(s) - 1 | 0, _c0_ = 0; + if(_c1_ >= 0){ + var i$0 = _c0_; + for(;;){ + if(9 >= caml_string_unsafe_get(s, i$0) - 48 >>> 0) n[1]++; + var _c5_ = i$0 + 1 | 0; + if(_c1_ !== i$0){var i$0 = _c5_; continue;} + break; + } + } + var + digits = n[1], + buf = + caml_create_bytes + (caml_ml_string_length(s) + ((digits - 1 | 0) / 3 | 0) | 0), + pos = [0, 0]; + function put(c){caml_bytes_set(buf, pos[1], c); pos[1]++; return 0;} + var + left = [0, ((digits - 1 | 0) % 3 | 0) + 1 | 0], + _c3_ = caml_ml_string_length(s) - 1 | 0, + _c2_ = 0; + if(_c3_ >= 0){ + var i = _c2_; + for(;;){ + var c = caml_string_unsafe_get(s, i); + if(9 < c - 48 >>> 0) + put(c); + else{if(0 === left[1]){put(95); left[1] = 3;} left[1] += -1; put(c);} + var _c4_ = i + 1 | 0; + if(_c3_ !== i){var i = _c4_; continue;} + break; + } + } + return caml_call1(Stdlib_Bytes[44], buf); + } + function convert_int(iconv, n){ + switch(iconv){ + case 1: + var _cZ_ = cst_d$0; break; + case 2: + var _cZ_ = cst_d$1; break; + case 4: + var _cZ_ = cst_i$1; break; + case 5: + var _cZ_ = cst_i$2; break; + case 6: + var _cZ_ = cst_x; break; + case 7: + var _cZ_ = cst_x$0; break; + case 8: + var _cZ_ = cst_X; break; + case 9: + var _cZ_ = cst_X$0; break; + case 10: + var _cZ_ = cst_o; break; + case 11: + var _cZ_ = cst_o$0; break; + case 0: + case 13: + var _cZ_ = cst_d; break; + case 3: + case 14: + var _cZ_ = cst_i$0; break; + default: var _cZ_ = cst_u; + } + return transform_int_alt(iconv, caml_format_int(_cZ_, n)); + } + function convert_int32(iconv, n){ + switch(iconv){ + case 1: + var _cY_ = cst_ld$0; break; + case 2: + var _cY_ = cst_ld$1; break; + case 4: + var _cY_ = cst_li$1; break; + case 5: + var _cY_ = cst_li$2; break; + case 6: + var _cY_ = cst_lx; break; + case 7: + var _cY_ = cst_lx$0; break; + case 8: + var _cY_ = cst_lX; break; + case 9: + var _cY_ = cst_lX$0; break; + case 10: + var _cY_ = cst_lo; break; + case 11: + var _cY_ = cst_lo$0; break; + case 0: + case 13: + var _cY_ = cst_ld; break; + case 3: + case 14: + var _cY_ = cst_li$0; break; + default: var _cY_ = cst_lu; + } + return transform_int_alt(iconv, caml_format_int(_cY_, n)); + } + function convert_nativeint(iconv, n){ + switch(iconv){ + case 1: + var _cX_ = cst_nd$0; break; + case 2: + var _cX_ = cst_nd$1; break; + case 4: + var _cX_ = cst_ni$1; break; + case 5: + var _cX_ = cst_ni$2; break; + case 6: + var _cX_ = cst_nx; break; + case 7: + var _cX_ = cst_nx$0; break; + case 8: + var _cX_ = cst_nX; break; + case 9: + var _cX_ = cst_nX$0; break; + case 10: + var _cX_ = cst_no; break; + case 11: + var _cX_ = cst_no$0; break; + case 0: + case 13: + var _cX_ = cst_nd; break; + case 3: + case 14: + var _cX_ = cst_ni$0; break; + default: var _cX_ = cst_nu; + } + return transform_int_alt(iconv, caml_format_int(_cX_, n)); + } + function convert_int64(iconv, n){ + switch(iconv){ + case 1: + var _cW_ = cst_Ld$0; break; + case 2: + var _cW_ = cst_Ld$1; break; + case 4: + var _cW_ = cst_Li$1; break; + case 5: + var _cW_ = cst_Li$2; break; + case 6: + var _cW_ = cst_Lx; break; + case 7: + var _cW_ = cst_Lx$0; break; + case 8: + var _cW_ = cst_LX; break; + case 9: + var _cW_ = cst_LX$0; break; + case 10: + var _cW_ = cst_Lo; break; + case 11: + var _cW_ = cst_Lo$0; break; + case 0: + case 13: + var _cW_ = cst_Ld; break; + case 3: + case 14: + var _cW_ = cst_Li$0; break; + default: var _cW_ = cst_Lu; + } + return transform_int_alt(iconv, runtime.caml_int64_format(_cW_, n)); + } + function convert_float(fconv, prec, x){ + function hex(param){ + switch(fconv[1]){ + case 0: + var sign = 45; break; + case 1: + var sign = 43; break; + default: var sign = 32; + } + return runtime.caml_hexstring_of_float(x, prec, sign); + } + function caml_special_val(str){ + var match = runtime.caml_classify_float(x); + return 3 === match + ? x < 0. ? cst_neg_infinity : cst_infinity + : 4 <= match ? cst_nan : str; + } + switch(fconv[2]){ + case 5: + var + str = caml_format_float(format_of_fconv(fconv, prec), x), + len = caml_ml_string_length(str), + i = 0; + for(;;){ + if(i === len) + var _cT_ = 0; + else{ + var _cS_ = caml_string_get(str, i) - 46 | 0, switch$0 = 0; + if(23 < _cS_ >>> 0){ + if(55 === _cS_) switch$0 = 1; + } + else if(21 < _cS_ - 1 >>> 0) switch$0 = 1; + if(! switch$0){var i$0 = i + 1 | 0, i = i$0; continue;} + var _cT_ = 1; + } + var _cU_ = _cT_ ? str : caml_call2(Stdlib[28], str, cst$17); + return caml_special_val(_cU_); + } + case 6: + return hex(0); + case 7: + var _cV_ = hex(0); return caml_call1(Stdlib_String[25], _cV_); + case 8: + return caml_special_val(hex(0)); + default: return caml_format_float(format_of_fconv(fconv, prec), x); + } + } + function string_of_fmtty(fmtty){ + var buf = buffer_create(16); + bprint_fmtty(buf, fmtty); + return buffer_contents(buf); + } + function make_int_padding_precision(k, acc, fmt, pad, prec, trans, iconv){ + if(typeof pad === "number"){ + if(typeof prec === "number") + return prec + ? function + (p, x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = caml_call2(trans, iconv, x); + return make_printf(k, [4, acc, str], fmt); + }; + var p = prec[1]; + return function(x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt);}; + } + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + if(typeof prec === "number") + return prec + ? function + (p, x){ + var + str = + fix_padding + (padty, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = fix_padding(padty, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$0 = prec[1]; + return function(x){ + var + str = + fix_padding + (padty, w, fix_int_precision(p$0, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + var padty$0 = pad[1]; + if(typeof prec === "number") + return prec + ? function + (w, p, x){ + var + str = + fix_padding + (padty$0, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (w, x){ + var str = fix_padding(padty$0, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$1 = prec[1]; + return function(w, x){ + var + str = + fix_padding + (padty$0, w, fix_int_precision(p$1, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + function make_padding(k, acc, fmt, pad, trans){ + if(typeof pad === "number") + return function(x){ + var new_acc = [4, acc, caml_call1(trans, x)]; + return make_printf(k, new_acc, fmt);}; + if(0 === pad[0]){ + var width = pad[2], padty = pad[1]; + return function(x){ + var new_acc = [4, acc, fix_padding(padty, width, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + var padty$0 = pad[1]; + return function(w, x){ + var new_acc = [4, acc, fix_padding(padty$0, w, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + function make_printf$0(counter, k, acc, fmt){ + var k$0 = k, acc$0 = acc, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, acc$0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest);}; + case 1: + var rest$0 = fmt$0[1]; + return function(c){ + var + str = caml_call1(Stdlib_Char[2], c), + l = caml_ml_string_length(str), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 39); + caml_blit_string(str, 0, res, 1, l); + var new_acc = [4, acc$0, caml_call1(Stdlib_Bytes[44], res)]; + return make_printf(k$0, new_acc, rest$0);}; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + return make_padding + (k$0, acc$0, rest$1, pad, function(str){return str;}); + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$2, pad$0, string_to_caml_string); + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$3, pad$1, prec, convert_int, iconv); + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$4, pad$2, prec$0, convert_int32, iconv$0); + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + return make_int_padding_precision + (k$0, + acc$0, + rest$5, + pad$3, + prec$1, + convert_nativeint, + iconv$1); + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$6, pad$4, prec$2, convert_int64, iconv$2); + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + if(typeof pad$5 === "number"){ + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x); + return make_printf(k$0, [4, acc$0, str], rest$7); + }; + var p = prec$3[1]; + return function(x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + if(0 === pad$5[0]){ + var w = pad$5[2], padty = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = fix_padding(padty, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$0 = prec$3[1]; + return function(x){ + var str = fix_padding(padty, w, convert_float(fconv, p$0, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + var padty$0 = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (w, p, x){ + var + str = fix_padding(padty$0, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (w, x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty$0, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$1 = prec$3[1]; + return function(w, x){ + var str = fix_padding(padty$0, w, convert_float(fconv, p$1, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$8, pad$6, Stdlib[30]); + case 10: + var + rest$9 = fmt$0[1], + acc$1 = [7, acc$0], + acc$0 = acc$1, + fmt$0 = rest$9; + continue; + case 11: + var + rest$10 = fmt$0[2], + str = fmt$0[1], + acc$2 = [2, acc$0, str], + acc$0 = acc$2, + fmt$0 = rest$10; + continue; + case 12: + var + rest$11 = fmt$0[2], + chr = fmt$0[1], + acc$3 = [3, acc$0, chr], + acc$0 = acc$3, + fmt$0 = rest$11; + continue; + case 13: + var + rest$12 = fmt$0[3], + sub_fmtty = fmt$0[2], + ty = string_of_fmtty(sub_fmtty); + return function(str){ + return make_printf(k$0, [4, acc$0, ty], rest$12);}; + case 14: + var rest$13 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _cR_ = recast(fmt, fmtty); + return make_printf + (k$0, + acc$0, + caml_call2(CamlinternalFormatBasics[3], _cR_, rest$13));}; + case 15: + var rest$14 = fmt$0[1]; + return function(f, x){ + return make_printf + (k$0, + [6, acc$0, function(o){return caml_call2(f, o, x);}], + rest$14);}; + case 16: + var rest$15 = fmt$0[1]; + return function(f){return make_printf(k$0, [6, acc$0, f], rest$15);}; + case 17: + var + rest$16 = fmt$0[2], + fmting_lit = fmt$0[1], + acc$4 = [0, acc$0, fmting_lit], + acc$0 = acc$4, + fmt$0 = rest$16; + continue; + case 18: + var _cP_ = fmt$0[1]; + if(0 === _cP_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _cP_[1][1], + k$3 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [0, kacc]], rest); + } + return k$0; + }, + k$1 = k$3(acc$0, k$0, rest$17), + k$0 = k$1, + acc$0 = 0, + fmt$0 = fmt$1; + continue; + } + var + rest$18 = fmt$0[2], + fmt$2 = _cP_[1][1], + k$4 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [1, kacc]], rest); + } + return k$0; + }, + k$2 = k$4(acc$0, k$0, rest$18), + k$0 = k$2, + acc$0 = 0, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + case 20: + var + rest$19 = fmt$0[3], + new_acc = [8, acc$0, cst_Printf_bad_conversion]; + return function(param){return make_printf(k$0, new_acc, rest$19);}; + case 21: + var rest$20 = fmt$0[2]; + return function(n){ + var new_acc = [4, acc$0, caml_format_int(cst_u$0, n)]; + return make_printf(k$0, new_acc, rest$20);}; + case 22: + var rest$21 = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest$21);}; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (make_ignored_param$0, [0, k$0, acc$0, ign, rest$22]); + var counter$1 = counter + 1 | 0; + return make_ignored_param$0(counter$1, k$0, acc$0, ign, rest$22); + default: + var + rest$23 = fmt$0[3], + f = fmt$0[2], + arity = fmt$0[1], + _cQ_ = caml_call1(f, 0); + if(counter >= 50) + return caml_trampoline_return + (make_custom$0, [0, k$0, acc$0, rest$23, arity, _cQ_]); + var counter$0 = counter + 1 | 0; + return make_custom$0(counter$0, k$0, acc$0, rest$23, arity, _cQ_); + } + } + } + function make_ignored_param$0(counter, k, acc, ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$1 = counter + 1 | 0; + return make_invalid_arg(counter$1, k, acc, fmt); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$2 = counter + 1 | 0; + return make_invalid_arg(counter$2, k, acc, fmt); + } + switch(ign[0]){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$3 = counter + 1 | 0; + return make_invalid_arg(counter$3, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$4 = counter + 1 | 0; + return make_invalid_arg(counter$4, k, acc, fmt); + case 2: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$5 = counter + 1 | 0; + return make_invalid_arg(counter$5, k, acc, fmt); + case 3: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$6 = counter + 1 | 0; + return make_invalid_arg(counter$6, k, acc, fmt); + case 4: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$7 = counter + 1 | 0; + return make_invalid_arg(counter$7, k, acc, fmt); + case 5: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$8 = counter + 1 | 0; + return make_invalid_arg(counter$8, k, acc, fmt); + case 6: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$9 = counter + 1 | 0; + return make_invalid_arg(counter$9, k, acc, fmt); + case 7: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$10 = counter + 1 | 0; + return make_invalid_arg(counter$10, k, acc, fmt); + case 8: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$11 = counter + 1 | 0; + return make_invalid_arg(counter$11, k, acc, fmt); + case 9: + var fmtty = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (make_from_fmtty$0, [0, k, acc, fmtty, fmt]); + var counter$14 = counter + 1 | 0; + return make_from_fmtty$0(counter$14, k, acc, fmtty, fmt); + case 10: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$12 = counter + 1 | 0; + return make_invalid_arg(counter$12, k, acc, fmt); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$13 = counter + 1 | 0; + return make_invalid_arg(counter$13, k, acc, fmt); + } + } + function make_from_fmtty$0(counter, k, acc, fmtty, fmt){ + if(typeof fmtty !== "number") + switch(fmtty[0]){ + case 0: + var rest = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest, fmt);}; + case 1: + var rest$0 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$0, fmt);}; + case 2: + var rest$1 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$1, fmt);}; + case 3: + var rest$2 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$2, fmt);}; + case 4: + var rest$3 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$3, fmt);}; + case 5: + var rest$4 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$4, fmt);}; + case 6: + var rest$5 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$5, fmt);}; + case 7: + var rest$6 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$6, fmt);}; + case 8: + var rest$7 = fmtty[2]; + return function(param){return make_from_fmtty(k, acc, rest$7, fmt);}; + case 9: + var + rest$8 = fmtty[3], + ty2 = fmtty[2], + ty1 = fmtty[1], + ty = trans(symm(ty1), ty2); + return function(param){ + return make_from_fmtty + (k, + acc, + caml_call2(CamlinternalFormatBasics[1], ty, rest$8), + fmt);}; + case 10: + var rest$9 = fmtty[1]; + return function(param, _cO_){ + return make_from_fmtty(k, acc, rest$9, fmt);}; + case 11: + var rest$10 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$10, fmt);}; + case 12: + var rest$11 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$11, fmt);}; + case 13: + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + } + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + } + function make_invalid_arg(counter, k, acc, fmt){ + var _cN_ = [8, acc, cst_Printf_bad_conversion$0]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cN_, fmt]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cN_, fmt); + } + function make_custom$0(counter, k, acc, rest, arity, f){ + if(arity){ + var arity$0 = arity[1]; + return function(x){ + return make_custom(k, acc, rest, arity$0, caml_call1(f, x));}; + } + var _cM_ = [4, acc, f]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cM_, rest]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cM_, rest); + } + function make_printf(k, acc, fmt){ + return caml_trampoline(make_printf$0(0, k, acc, fmt)); + } + function make_ignored_param(k, acc, ign, fmt){ + return caml_trampoline(make_ignored_param$0(0, k, acc, ign, fmt)); + } + function make_from_fmtty(k, acc, fmtty, fmt){ + return caml_trampoline(make_from_fmtty$0(0, k, acc, fmtty, fmt)); + } + function make_custom(k, acc, rest, arity, f){ + return caml_trampoline(make_custom$0(0, k, acc, rest, arity, f)); + } + function fn_of_padding_precision(k, o, fmt, pad, prec){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var _cl_ = make_iprintf(k, o, fmt); + return function(_cL_){return _cl_;}; + } + if(prec){ + var _ci_ = make_iprintf(k, o, fmt), _cj_ = function(_cK_){return _ci_;}; + return function(_cJ_){return _cj_;}; + } + var _ck_ = make_iprintf(k, o, fmt); + return function(_cI_){return _ck_;}; + } + if(0 === pad[0]){ + if(typeof prec !== "number"){ + var _cp_ = make_iprintf(k, o, fmt); + return function(_cH_){return _cp_;}; + } + if(prec){ + var _cm_ = make_iprintf(k, o, fmt), _cn_ = function(_cG_){return _cm_;}; + return function(_cF_){return _cn_;}; + } + var _co_ = make_iprintf(k, o, fmt); + return function(_cE_){return _co_;}; + } + if(typeof prec !== "number"){ + var _cv_ = make_iprintf(k, o, fmt), _cw_ = function(_cD_){return _cv_;}; + return function(_cC_){return _cw_;}; + } + if(prec){ + var + _cq_ = make_iprintf(k, o, fmt), + _cr_ = function(_cB_){return _cq_;}, + _cs_ = function(_cA_){return _cr_;}; + return function(_cz_){return _cs_;}; + } + var _ct_ = make_iprintf(k, o, fmt); + function _cu_(_cy_){return _ct_;} + return function(_cx_){return _cu_;}; + } + function make_iprintf$0(counter, k, o, fmt){ + var k$0 = k, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, o); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], _by_ = make_iprintf(k$0, o, rest); + return function(_ch_){return _by_;}; + case 1: + var rest$0 = fmt$0[1], _bz_ = make_iprintf(k$0, o, rest$0); + return function(_cg_){return _bz_;}; + case 2: + var _bA_ = fmt$0[1]; + if(typeof _bA_ === "number"){ + var rest$1 = fmt$0[2], _bB_ = make_iprintf(k$0, o, rest$1); + return function(_cf_){return _bB_;}; + } + if(0 === _bA_[0]){ + var rest$2 = fmt$0[2], _bC_ = make_iprintf(k$0, o, rest$2); + return function(_ce_){return _bC_;}; + } + var + rest$3 = fmt$0[2], + _bD_ = make_iprintf(k$0, o, rest$3), + _bE_ = function(_cd_){return _bD_;}; + return function(_cc_){return _bE_;}; + case 3: + var _bF_ = fmt$0[1]; + if(typeof _bF_ === "number"){ + var rest$4 = fmt$0[2], _bG_ = make_iprintf(k$0, o, rest$4); + return function(_cb_){return _bG_;}; + } + if(0 === _bF_[0]){ + var rest$5 = fmt$0[2], _bH_ = make_iprintf(k$0, o, rest$5); + return function(_ca_){return _bH_;}; + } + var + rest$6 = fmt$0[2], + _bI_ = make_iprintf(k$0, o, rest$6), + _bJ_ = function(_b$_){return _bI_;}; + return function(_b__){return _bJ_;}; + case 4: + var rest$7 = fmt$0[4], prec = fmt$0[3], pad = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$7, pad, prec); + case 5: + var rest$8 = fmt$0[4], prec$0 = fmt$0[3], pad$0 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$8, pad$0, prec$0); + case 6: + var rest$9 = fmt$0[4], prec$1 = fmt$0[3], pad$1 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$9, pad$1, prec$1); + case 7: + var rest$10 = fmt$0[4], prec$2 = fmt$0[3], pad$2 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$10, pad$2, prec$2); + case 8: + var rest$11 = fmt$0[4], prec$3 = fmt$0[3], pad$3 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$11, pad$3, prec$3); + case 9: + var _bK_ = fmt$0[1]; + if(typeof _bK_ === "number"){ + var rest$12 = fmt$0[2], _bL_ = make_iprintf(k$0, o, rest$12); + return function(_b9_){return _bL_;}; + } + if(0 === _bK_[0]){ + var rest$13 = fmt$0[2], _bM_ = make_iprintf(k$0, o, rest$13); + return function(_b8_){return _bM_;}; + } + var + rest$14 = fmt$0[2], + _bN_ = make_iprintf(k$0, o, rest$14), + _bO_ = function(_b7_){return _bN_;}; + return function(_b6_){return _bO_;}; + case 10: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 11: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 12: + var rest$17 = fmt$0[2], fmt$0 = rest$17; continue; + case 13: + var rest$18 = fmt$0[3], _bP_ = make_iprintf(k$0, o, rest$18); + return function(_b5_){return _bP_;}; + case 14: + var rest$19 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _b4_ = recast(fmt, fmtty); + return make_iprintf + (k$0, + o, + caml_call2(CamlinternalFormatBasics[3], _b4_, rest$19));}; + case 15: + var + rest$20 = fmt$0[1], + _bQ_ = make_iprintf(k$0, o, rest$20), + _bR_ = function(_b3_){return _bQ_;}; + return function(_b2_){return _bR_;}; + case 16: + var rest$21 = fmt$0[1], _bS_ = make_iprintf(k$0, o, rest$21); + return function(_b1_){return _bS_;}; + case 17: + var rest$22 = fmt$0[2], fmt$0 = rest$22; continue; + case 18: + var _bT_ = fmt$0[1]; + if(0 === _bT_[0]){ + var + rest$23 = fmt$0[2], + fmt$1 = _bT_[1][1], + k$3 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$1 = k$3(k$0, rest$23), + k$0 = k$1, + fmt$0 = fmt$1; + continue; + } + var + rest$24 = fmt$0[2], + fmt$2 = _bT_[1][1], + k$4 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$2 = k$4(k$0, rest$24), + k$0 = k$2, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + case 20: + var rest$25 = fmt$0[3], _bU_ = make_iprintf(k$0, o, rest$25); + return function(_b0_){return _bU_;}; + case 21: + var rest$26 = fmt$0[2], _bV_ = make_iprintf(k$0, o, rest$26); + return function(_bZ_){return _bV_;}; + case 22: + var rest$27 = fmt$0[1], _bW_ = make_iprintf(k$0, o, rest$27); + return function(_bY_){return _bW_;}; + case 23: + var rest$28 = fmt$0[2], ign = fmt$0[1], _bX_ = 0; + return make_ignored_param + (function(param){return caml_call1(k$0, o);}, + _bX_, + ign, + rest$28); + default: + var rest$29 = fmt$0[3], arity = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (fn_of_custom_arity$0, [0, k$0, o, rest$29, arity]); + var counter$0 = counter + 1 | 0; + return fn_of_custom_arity$0(counter$0, k$0, o, rest$29, arity); + } + } + } + function fn_of_custom_arity$0(counter, k, o, fmt, param){ + if(param){ + var arity = param[1], _bw_ = fn_of_custom_arity(k, o, fmt, arity); + return function(_bx_){return _bw_;}; + } + if(counter >= 50) + return caml_trampoline_return(make_iprintf$0, [0, k, o, fmt]); + var counter$0 = counter + 1 | 0; + return make_iprintf$0(counter$0, k, o, fmt); + } + function make_iprintf(k, o, fmt){ + return caml_trampoline(make_iprintf$0(0, k, o, fmt)); + } + function fn_of_custom_arity(k, o, fmt, param){ + return caml_trampoline(fn_of_custom_arity$0(0, k, o, fmt, param)); + } + function output_acc(o, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + output_acc(o, p); + return caml_call2(Stdlib[66], o, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$18); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$19); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + output_acc(o, p$3); + return caml_call1(f, o); + case 7: + var p$4 = acc$0[1]; + output_acc(o, p$4); + return caml_call1(Stdlib[63], o); + case 8: + var msg = acc$0[2], p$5 = acc$0[1]; + output_acc(o, p$5); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + output_acc(o, p$1); + return caml_call2(Stdlib[66], o, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + output_acc(o, p$2); + return caml_call2(Stdlib[65], o, c); + } + } + } + function bufput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + bufput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$20); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$21); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + bufput_acc(b, p$3); + return caml_call1(f, b); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + bufput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + bufput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + bufput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function strput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + strput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$22); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$23); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + strput_acc(b, p$3); + var _bv_ = caml_call1(f, 0); + return caml_call2(Stdlib_Buffer[16], b, _bv_); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + strput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + strput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + strput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function failwith_message(param){ + var fmt = param[1], buf = caml_call1(Stdlib_Buffer[1], 256); + function k(acc){ + strput_acc(buf, acc); + var _bu_ = caml_call1(Stdlib_Buffer[2], buf); + return caml_call1(Stdlib[2], _bu_); + } + return make_printf(k, 0, fmt); + } + function open_box_of_string(str){ + if(runtime.caml_string_equal(str, cst$43)) return _x_; + var len = caml_ml_string_length(str); + function invalid_box(param){ + return caml_call1(failwith_message(_y_), str); + } + function parse_spaces(i){ + var i$0 = i; + for(;;){ + if(i$0 === len) return i$0; + var match = caml_string_get(str, i$0); + if(9 !== match && 32 !== match) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + var wstart = parse_spaces(0), wend = wstart; + for(;;){ + if(wend !== len && 25 >= caml_string_get(str, wend) - 97 >>> 0){var j = wend + 1 | 0, wend = j; continue;} + var + box_name = caml_call3(Stdlib_String[15], str, wstart, wend - wstart | 0), + nstart = parse_spaces(wend), + nend = nstart; + for(;;){ + if(nend !== len){ + var match = caml_string_get(str, nend), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(switch$0){var j$0 = nend + 1 | 0, nend = j$0; continue;} + } + if(nstart === nend) + var indent = 0; + else + try{ + var + _bs_ = + runtime.caml_int_of_string + (caml_call3(Stdlib_String[15], str, nstart, nend - nstart | 0)), + indent = _bs_; + } + catch(_bt_){ + var _br_ = caml_wrap_exception(_bt_); + if(_br_[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(_br_, 0); + var indent = invalid_box(0); + } + var exp_end = parse_spaces(nend); + if(exp_end !== len) invalid_box(0); + var switch$1 = 0; + if + (caml_string_notequal(box_name, cst$43) + && caml_string_notequal(box_name, "b")) + var + box_type = + caml_string_notequal(box_name, "h") + ? caml_string_notequal + (box_name, "hov") + ? caml_string_notequal + (box_name, "hv") + ? caml_string_notequal(box_name, "v") ? invalid_box(0) : 1 + : 2 + : 3 + : 0; + else + switch$1 = 1; + if(switch$1) var box_type = 4; + return [0, indent, box_type]; + } + } + } + function make_padding_fmt_ebb(pad, fmt){ + if(typeof pad === "number") return [0, 0, fmt]; + if(0 === pad[0]){var w = pad[2], s = pad[1]; return [0, [0, s, w], fmt];} + var s$0 = pad[1]; + return [0, [1, s$0], fmt]; + } + function make_padprec_fmt_ebb(pad, prec, fmt){ + if(typeof prec === "number") + var match = prec ? [0, 1, fmt] : [0, 0, fmt]; + else + var p = prec[1], match = [0, [0, p], fmt]; + var prec$0 = match[1]; + if(typeof pad === "number") return [0, 0, prec$0, fmt]; + if(0 === pad[0]){ + var w = pad[2], s = pad[1]; + return [0, [0, s, w], prec$0, fmt]; + } + var s$0 = pad[1]; + return [0, [1, s$0], prec$0, fmt]; + } + function fmt_ebb_of_string(legacy_behavior, str){ + if(legacy_behavior) + var flag = legacy_behavior[1], legacy_behavior$0 = flag; + else + var legacy_behavior$0 = 1; + function invalid_format_message(str_ind, msg){ + return caml_call3(failwith_message(_z_), str, str_ind, msg); + } + function unexpected_end_of_format(end_ind){ + return invalid_format_message(end_ind, cst_unexpected_end_of_format); + } + function invalid_format_without(str_ind, c, s){ + return caml_call4(failwith_message(_A_), str, str_ind, c, s); + } + function expected_character(str_ind, expected, read){ + return caml_call4(failwith_message(_B_), str, str_ind, expected, read); + } + function add_literal(lit_start, str_ind, fmt){ + var size = str_ind - lit_start | 0; + return 0 === size + ? [0, fmt] + : 1 + === size + ? [0, [12, caml_string_get(str, lit_start), fmt]] + : [0, + [11, + caml_call3(Stdlib_String[15], str, lit_start, size), + fmt]]; + } + function parse(lit_start, end_ind){ + var str_ind = lit_start; + for(;;){ + if(str_ind === end_ind) return add_literal(lit_start, str_ind, 0); + var match = caml_string_get(str, str_ind); + if(37 === match){ + var str_ind$2 = str_ind + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var + match$1 = + 95 === caml_string_get(str, str_ind$2) + ? parse_flags(str_ind, str_ind$2 + 1 | 0, end_ind, 1) + : parse_flags(str_ind, str_ind$2, end_ind, 0), + fmt_rest = match$1[1]; + return add_literal(lit_start, str_ind, fmt_rest); + } + if(64 !== match){ + var str_ind$1 = str_ind + 1 | 0, str_ind = str_ind$1; + continue; + } + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) + var match$0 = _N_; + else{ + var c = caml_string_get(str, str_ind$0), switch$0 = 0; + if(65 <= c) + if(94 <= c){ + var switcher = c - 123 | 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var match$0 = parse_tag(1, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$2 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 1, fmt_rest$2]]; + } + } + else if(91 <= c) + switch(c - 91 | 0){ + case 0: + var match$0 = parse_tag(0, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$3 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 0, fmt_rest$3]]; + } + else + switch$0 = 1; + else if(10 === c) + var + fmt_rest$4 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 3, fmt_rest$4]]; + else if(32 <= c) + switch(c - 32 | 0){ + case 0: + var + fmt_rest$5 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _O_, fmt_rest$5]]; + break; + case 5: + var switch$1 = 0; + if + ((str_ind$0 + 1 | 0) < end_ind + && 37 === caml_string_get(str, str_ind$0 + 1 | 0)) + var + fmt_rest$6 = parse(str_ind$0 + 2 | 0, end_ind)[1], + match$0 = [0, [17, 6, fmt_rest$6]]; + else + switch$1 = 1; + if(switch$1) + var + fmt_rest$7 = parse(str_ind$0, end_ind)[1], + match$0 = [0, [12, 64, fmt_rest$7]]; + break; + case 12: + var + fmt_rest$8 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _P_, fmt_rest$8]]; + break; + case 14: + var + fmt_rest$9 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 4, fmt_rest$9]]; + break; + case 27: + var str_ind$3 = str_ind$0 + 1 | 0; + try{ + var + _bg_ = str_ind$3 === end_ind ? 1 : 0, + _bh_ = _bg_ || (60 !== caml_string_get(str, str_ind$3) ? 1 : 0); + if(_bh_) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + str_ind_1 = parse_spaces(str_ind$3 + 1 | 0, end_ind), + match$2 = caml_string_get(str, str_ind_1), + switch$2 = 0; + if(48 <= match$2){ + if(58 > match$2) switch$2 = 1; + } + else if(45 === match$2) switch$2 = 1; + if(! switch$2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + match$3 = parse_integer(str_ind_1, end_ind), + width = match$3[2], + str_ind_2 = match$3[1], + str_ind_3 = parse_spaces(str_ind_2, end_ind), + switcher$0 = caml_string_get(str, str_ind_3) - 45 | 0, + switch$3 = 0; + if(12 < switcher$0 >>> 0) + if(17 === switcher$0) + var + s = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_3 - str_ind$3 | 0) + 3 | 0), + _bi_ = [0, s, width, 0], + _bj_ = str_ind_3 + 1 | 0, + formatting_lit$0 = _bi_, + next_ind = _bj_; + else + switch$3 = 1; + else if(1 < switcher$0 - 1 >>> 0){ + var + match$4 = parse_integer(str_ind_3, end_ind), + offset = match$4[2], + str_ind_4 = match$4[1], + str_ind_5 = parse_spaces(str_ind_4, end_ind); + if(62 !== caml_string_get(str, str_ind_5)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$0 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_5 - str_ind$3 | 0) + 3 | 0), + _bk_ = [0, s$0, width, offset], + _bl_ = str_ind_5 + 1 | 0, + formatting_lit$0 = _bk_, + next_ind = _bl_; + } + else + switch$3 = 1; + if(switch$3) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + } + catch(_bq_){ + var _bf_ = caml_wrap_exception(_bq_); + if(_bf_ !== Stdlib[8] && _bf_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bf_, 0); + var formatting_lit$0 = formatting_lit, next_ind = str_ind$3; + } + var + fmt_rest$12 = parse(next_ind, end_ind)[1], + match$0 = [0, [17, formatting_lit$0, fmt_rest$12]]; + break; + case 28: + var str_ind$4 = str_ind$0 + 1 | 0; + try{ + var + str_ind_1$0 = parse_spaces(str_ind$4, end_ind), + match$6 = caml_string_get(str, str_ind_1$0), + switch$4 = 0; + if(48 <= match$6){ + if(58 > match$6) switch$4 = 1; + } + else if(45 === match$6) switch$4 = 1; + if(switch$4){ + var + match$7 = parse_integer(str_ind_1$0, end_ind), + size = match$7[2], + str_ind_2$0 = match$7[1], + str_ind_3$0 = parse_spaces(str_ind_2$0, end_ind); + if(62 !== caml_string_get(str, str_ind_3$0)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$1 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$4 - 2 | 0, + (str_ind_3$0 - str_ind$4 | 0) + 3 | 0), + _bo_ = [0, [0, str_ind_3$0 + 1 | 0, [1, s$1, size]]]; + } + else + var _bo_ = 0; + var _bn_ = _bo_; + } + catch(_bp_){ + var _bm_ = caml_wrap_exception(_bp_); + if(_bm_ !== Stdlib[8] && _bm_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bm_, 0); + var _bn_ = 0; + } + if(_bn_) + var + match$5 = _bn_[1], + formatting_lit$1 = match$5[2], + next_ind$0 = match$5[1], + fmt_rest$13 = parse(next_ind$0, end_ind)[1], + _be_ = [0, [17, formatting_lit$1, fmt_rest$13]]; + else + var + fmt_rest$14 = parse(str_ind$4, end_ind)[1], + _be_ = [0, [17, _Q_, fmt_rest$14]]; + var match$0 = _be_; + break; + case 31: + var + fmt_rest$10 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 2, fmt_rest$10]]; + break; + case 32: + var + fmt_rest$11 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 5, fmt_rest$11]]; + break; + default: switch$0 = 1; + } + else + switch$0 = 1; + if(switch$0) + var + fmt_rest$1 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, [2, c], fmt_rest$1]]; + } + var fmt_rest$0 = match$0[1]; + return add_literal(lit_start, str_ind, fmt_rest$0); + } + } + function parse_conversion + (pct_ind, + str_ind, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + symb){ + var + plus_used = [0, 0], + hash_used = [0, 0], + space_used = [0, 0], + ign_used = [0, 0], + pad_used = [0, 0], + prec_used = [0, 0]; + function get_plus(param){plus_used[1] = 1; return plus;} + function get_hash(param){hash_used[1] = 1; return hash;} + function get_space(param){space_used[1] = 1; return space;} + function get_ign(param){ign_used[1] = 1; return ign;} + function get_pad(param){pad_used[1] = 1; return pad;} + function get_prec(param){prec_used[1] = 1; return prec;} + function get_padprec(param){pad_used[1] = 1; return padprec;} + function get_int_pad(param){ + var pad = get_pad(0), match = get_prec(0); + if(typeof match === "number" && ! match) return pad; + if(typeof pad === "number") return 0; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _H_ + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$1) + : pad; + if(2 > pad[1]) return pad; + var n = pad[2]; + return legacy_behavior$0 + ? [0, 1, n] + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$0); + } + function check_no_0(symb, pad){ + if(typeof pad === "number") return pad; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _I_ + : incompatible_flag(pct_ind, str_ind, symb, cst_0$1) + : pad; + if(2 > pad[1]) return pad; + var width = pad[2]; + return legacy_behavior$0 + ? [0, 1, width] + : incompatible_flag(pct_ind, str_ind, symb, cst_0$0); + } + function opt_of_pad(c, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]) + switch(pad[1]){ + case 0: + var width = pad[2]; + return legacy_behavior$0 + ? [0, width] + : incompatible_flag(pct_ind, str_ind, c, cst$24); + case 1: + var width$0 = pad[2]; return [0, width$0]; + default: + var width$1 = pad[2]; + return legacy_behavior$0 + ? [0, width$1] + : incompatible_flag(pct_ind, str_ind, c, cst_0$2); + } + return incompatible_flag(pct_ind, str_ind, c, cst$25); + } + function get_pad_opt(c){return opt_of_pad(c, get_pad(0));} + function get_padprec_opt(c){return opt_of_pad(c, get_padprec(0));} + var switch$0 = 0; + if(124 <= symb) + switch$0 = 1; + else + switch(symb){ + case 33: + var + fmt_rest$5 = parse(str_ind, end_ind)[1], + fmt_result = [0, [10, fmt_rest$5]]; + break; + case 40: + var + sub_end = search_subformat_end(str_ind, end_ind, 41), + fmt_rest$7 = parse(sub_end + 2 | 0, end_ind)[1], + sub_fmt = parse(str_ind, sub_end)[1], + sub_fmtty = fmtty_of_fmt(sub_fmt); + if(get_ign(0)) + var + ignored$2 = [9, get_pad_opt(95), sub_fmtty], + _aN_ = [0, [23, ignored$2, fmt_rest$7]]; + else + var _aN_ = [0, [14, get_pad_opt(40), sub_fmtty, fmt_rest$7]]; + var fmt_result = _aN_; + break; + case 44: + var fmt_result = parse(str_ind, end_ind); break; + case 67: + var + fmt_rest$10 = parse(str_ind, end_ind)[1], + _aP_ = + get_ign(0) ? [0, [23, 1, fmt_rest$10]] : [0, [1, fmt_rest$10]], + fmt_result = _aP_; + break; + case 78: + var fmt_rest$14 = parse(str_ind, end_ind)[1], counter$0 = 2; + if(get_ign(0)) + var + ignored$6 = [11, counter$0], + _aV_ = [0, [23, ignored$6, fmt_rest$14]]; + else + var _aV_ = [0, [21, counter$0, fmt_rest$14]]; + var fmt_result = _aV_; + break; + case 83: + var + pad$6 = check_no_0(symb, get_padprec(0)), + fmt_rest$15 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$7 = [1, get_padprec_opt(95)], + _aW_ = [0, [23, ignored$7, fmt_rest$15]]; + else + var + match$5 = make_padding_fmt_ebb(pad$6, fmt_rest$15), + fmt_rest$16 = match$5[2], + pad$7 = match$5[1], + _aW_ = [0, [3, pad$7, fmt_rest$16]]; + var fmt_result = _aW_; + break; + case 91: + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var + char_set = create_char_set(0), + add_char = function(c){return add_in_char_set(char_set, c);}, + add_range = + function(c$0, c){ + if(c >= c$0){ + var i = c$0; + for(;;){ + add_in_char_set(char_set, caml_call1(Stdlib[29], i)); + var _bd_ = i + 1 | 0; + if(c !== i){var i = _bd_; continue;} + break; + } + } + return 0; + }, + fail_single_percent = + function(str_ind){ + return caml_call2(failwith_message(_R_), str, str_ind); + }, + parse_char_set_content = + function(counter, str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(45 === c){ + add_char(45); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + } + if(93 === c) return str_ind$0 + 1 | 0; + var _bc_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_after_char$0, [0, _bc_, end_ind, c]); + var counter$0 = counter + 1 | 0; + return parse_char_set_after_char$0(counter$0, _bc_, end_ind, c); + } + }, + parse_char_set_after_char$0 = + function(counter, str_ind, end_ind, c){ + var str_ind$0 = str_ind, c$0 = c; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c$1 = caml_string_get(str, str_ind$0), switch$0 = 0; + if(46 <= c$1){ + if(64 === c$1) + switch$0 = 1; + else if(93 === c$1){add_char(c$0); return str_ind$0 + 1 | 0;} + } + else if(37 === c$1) + switch$0 = 1; + else if(45 <= c$1){ + var str_ind$2 = str_ind$0 + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var c$2 = caml_string_get(str, str_ind$2); + if(37 === c$2){ + if((str_ind$2 + 1 | 0) === end_ind) + unexpected_end_of_format(end_ind); + var c$3 = caml_string_get(str, str_ind$2 + 1 | 0); + if(37 !== c$3 && 64 !== c$3) + return fail_single_percent(str_ind$2); + add_range(c$0, c$3); + var _ba_ = str_ind$2 + 2 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _ba_, end_ind]); + var counter$2 = counter + 1 | 0; + return parse_char_set_content(counter$2, _ba_, end_ind); + } + if(93 === c$2){ + add_char(c$0); + add_char(45); + return str_ind$2 + 1 | 0; + } + add_range(c$0, c$2); + var _bb_ = str_ind$2 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _bb_, end_ind]); + var counter$1 = counter + 1 | 0; + return parse_char_set_content(counter$1, _bb_, end_ind); + } + if(switch$0 && 37 === c$0){ + add_char(c$1); + var _a$_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _a$_, end_ind]); + var counter$0 = counter + 1 | 0; + return parse_char_set_content(counter$0, _a$_, end_ind); + } + if(37 === c$0) fail_single_percent(str_ind$0); + add_char(c$0); + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + c$0 = c$1; + } + }, + parse_char_set_after_char = + function(str_ind, end_ind, c){ + return caml_trampoline + (parse_char_set_after_char$0(0, str_ind, end_ind, c)); + }; + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + if(94 === caml_string_get(str, str_ind)) + var str_ind$0 = str_ind + 1 | 0, reverse = 1, str_ind$1 = str_ind$0; + else + var reverse = 0, str_ind$1 = str_ind; + if(str_ind$1 === end_ind) unexpected_end_of_format(end_ind); + var + c = caml_string_get(str, str_ind$1), + next_ind = parse_char_set_after_char(str_ind$1 + 1 | 0, end_ind, c), + char_set$0 = freeze_char_set(char_set), + char_set$1 = reverse ? rev_char_set(char_set$0) : char_set$0, + fmt_rest$19 = parse(next_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$9 = [10, get_pad_opt(95), char_set$1], + _a1_ = [0, [23, ignored$9, fmt_rest$19]]; + else + var _a1_ = [0, [20, get_pad_opt(91), char_set$1, fmt_rest$19]]; + var fmt_result = _a1_; + break; + case 97: + var + fmt_rest$20 = parse(str_ind, end_ind)[1], + fmt_result = [0, [15, fmt_rest$20]]; + break; + case 99: + var + char_format = + function(fmt_rest){ + return get_ign(0) ? [0, [23, 0, fmt_rest]] : [0, [0, fmt_rest]]; + }, + fmt_rest$21 = parse(str_ind, end_ind)[1], + match$7 = get_pad_opt(99); + if(match$7){ + if(0 === match$7[1]) + var + _a2_ = + get_ign(0) ? [0, [23, 3, fmt_rest$21]] : [0, [22, fmt_rest$21]], + _a3_ = _a2_; + else + var + _a3_ = + legacy_behavior$0 + ? char_format(fmt_rest$21) + : invalid_format_message + (str_ind, cst_non_zero_widths_are_unsupp); + var _a4_ = _a3_; + } + else + var _a4_ = char_format(fmt_rest$21); + var fmt_result = _a4_; + break; + case 114: + var + fmt_rest$22 = parse(str_ind, end_ind)[1], + _a5_ = + get_ign(0) ? [0, [23, 2, fmt_rest$22]] : [0, [19, fmt_rest$22]], + fmt_result = _a5_; + break; + case 115: + var + pad$9 = check_no_0(symb, get_padprec(0)), + fmt_rest$23 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$10 = [0, get_padprec_opt(95)], + _a6_ = [0, [23, ignored$10, fmt_rest$23]]; + else + var + match$8 = make_padding_fmt_ebb(pad$9, fmt_rest$23), + fmt_rest$24 = match$8[2], + pad$10 = match$8[1], + _a6_ = [0, [2, pad$10, fmt_rest$24]]; + var fmt_result = _a6_; + break; + case 116: + var + fmt_rest$25 = parse(str_ind, end_ind)[1], + fmt_result = [0, [16, fmt_rest$25]]; + break; + case 123: + var + sub_end$0 = search_subformat_end(str_ind, end_ind, 125), + sub_fmt$0 = parse(str_ind, sub_end$0)[1], + fmt_rest$26 = parse(sub_end$0 + 2 | 0, end_ind)[1], + sub_fmtty$0 = fmtty_of_fmt(sub_fmt$0); + if(get_ign(0)) + var + ignored$11 = [8, get_pad_opt(95), sub_fmtty$0], + _a7_ = [0, [23, ignored$11, fmt_rest$26]]; + else + var _a7_ = [0, [13, get_pad_opt(123), sub_fmtty$0, fmt_rest$26]]; + var fmt_result = _a7_; + break; + case 66: + case 98: + var + pad$3 = check_no_0(symb, get_padprec(0)), + fmt_rest$8 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$3 = [7, get_padprec_opt(95)], + _aO_ = [0, [23, ignored$3, fmt_rest$8]]; + else + var + match$3 = make_padding_fmt_ebb(pad$3, fmt_rest$8), + fmt_rest$9 = match$3[2], + pad$4 = match$3[1], + _aO_ = [0, [9, pad$4, fmt_rest$9]]; + var fmt_result = _aO_; + break; + case 37: + case 64: + var + fmt_rest$6 = parse(str_ind, end_ind)[1], + fmt_result = [0, [12, symb, fmt_rest$6]]; + break; + case 76: + case 108: + case 110: + var switch$1 = 0; + if(str_ind === end_ind) + switch$1 = 1; + else{ + var + symb$0 = caml_string_get(str, str_ind), + _a8_ = symb$0 - 88 | 0, + switch$2 = 0; + if(32 >= _a8_ >>> 0) + switch(_a8_){ + case 0: + case 12: + case 17: + case 23: + case 29: + case 32: + var _aU_ = 1; switch$2 = 1; break; + } + if(! switch$2) var _aU_ = 0; + if(_aU_) switch$0 = 1; else switch$1 = 1; + } + if(switch$1){ + var fmt_rest$13 = parse(str_ind, end_ind)[1], switch$3 = 0; + if(108 <= symb){ + if(111 > symb) + switch(symb - 108 | 0){ + case 0: + var counter = 0; switch$3 = 1; break; + case 1: break; + default: var counter = 1; switch$3 = 1; + } + } + else if(76 === symb){var counter = 2; switch$3 = 1;} + if(! switch$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _V_], 1); + if(get_ign(0)) + var + ignored$5 = [11, counter], + _aT_ = [0, [23, ignored$5, fmt_rest$13]]; + else + var _aT_ = [0, [21, counter, fmt_rest$13]]; + var fmt_result = _aT_; + } + break; + case 32: + case 35: + case 43: + case 45: + case 95: + var + fmt_result = caml_call3(failwith_message(_M_), str, pct_ind, symb); + break; + case 88: + case 100: + case 105: + case 111: + case 117: + case 120: + var + _aX_ = get_space(0), + _aY_ = get_hash(0), + iconv$2 = + compute_int_conv(pct_ind, str_ind, get_plus(0), _aY_, _aX_, symb), + fmt_rest$17 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$8 = [2, iconv$2, get_pad_opt(95)], + _aZ_ = [0, [23, ignored$8, fmt_rest$17]]; + else + var + _a0_ = get_prec(0), + match$6 = make_padprec_fmt_ebb(get_int_pad(0), _a0_, fmt_rest$17), + fmt_rest$18 = match$6[3], + prec$4 = match$6[2], + pad$8 = match$6[1], + _aZ_ = [0, [4, iconv$2, pad$8, prec$4, fmt_rest$18]]; + var fmt_result = _aZ_; + break; + case 69: + case 70: + case 71: + case 72: + case 101: + case 102: + case 103: + case 104: + var + space$1 = get_space(0), + hash$1 = get_hash(0), + plus$2 = get_plus(0), + flag = + plus$2 + ? space$1 + ? legacy_behavior$0 + ? 1 + : incompatible_flag(pct_ind, str_ind, 32, cst$36) + : 1 + : space$1 ? 2 : 0, + switch$4 = 0; + if(73 <= symb){ + var switcher = symb - 101 | 0; + if(3 < switcher >>> 0) + switch$4 = 1; + else{ + switch(switcher){ + case 0: + var _a9_ = 1; break; + case 1: + var _a9_ = 0; break; + case 2: + var _a9_ = 3; break; + default: var _a9_ = 6; + } + var kind = _a9_; + } + } + else if(69 <= symb){ + var switch$5 = 0; + switch(symb - 69 | 0){ + case 0: + var _a__ = 2; break; + case 1: + switch$4 = 1; switch$5 = 1; break; + case 2: + var _a__ = 4; break; + default: var _a__ = 7; + } + if(! switch$5) var kind = _a__; + } + else + switch$4 = 1; + if(switch$4){ + var switch$6 = 0; + if(hash$1){ + if(70 === symb){var kind = 8; switch$6 = 1;} + } + else if(70 === symb){var kind = 5; switch$6 = 1;} + if(! switch$6) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + } + var + fconv = [0, flag, kind], + fmt_rest$11 = parse(str_ind, end_ind)[1]; + if(get_ign(0)){ + var match = get_prec(0); + if(typeof match === "number") + var + _aQ_ = match ? incompatible_flag(pct_ind, str_ind, 95, cst$26) : 0; + else + var ndec = match[1], _aQ_ = [0, ndec]; + var + ignored$4 = [6, get_pad_opt(95), _aQ_], + _aR_ = [0, [23, ignored$4, fmt_rest$11]]; + } + else + var + _aS_ = get_prec(0), + match$4 = make_padprec_fmt_ebb(get_pad(0), _aS_, fmt_rest$11), + fmt_rest$12 = match$4[3], + prec$3 = match$4[2], + pad$5 = match$4[1], + _aR_ = [0, [8, fconv, pad$5, prec$3, fmt_rest$12]]; + var fmt_result = _aR_; + break; + default: switch$0 = 1; + } + if(switch$0){ + var switch$7 = 0; + if(108 <= symb){ + if(111 > symb){ + var switch$8 = 0; + switch(symb - 108 | 0){ + case 0: + var + _ax_ = caml_string_get(str, str_ind), + _ay_ = get_space(0), + _az_ = get_hash(0), + iconv = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _az_, _ay_, _ax_), + fmt_rest = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored = [3, iconv, get_pad_opt(95)], + _aA_ = [0, [23, ignored, fmt_rest]]; + else + var + _aC_ = get_prec(0), + match$0 = make_padprec_fmt_ebb(get_int_pad(0), _aC_, fmt_rest), + fmt_rest$0 = match$0[3], + prec$0 = match$0[2], + pad$0 = match$0[1], + _aA_ = [0, [5, iconv, pad$0, prec$0, fmt_rest$0]]; + var _aB_ = _aA_; + switch$8 = 1; + break; + case 1: break; + default: + var + _aD_ = caml_string_get(str, str_ind), + _aE_ = get_space(0), + _aF_ = get_hash(0), + iconv$0 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aF_, _aE_, _aD_), + fmt_rest$1 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$0 = [4, iconv$0, get_pad_opt(95)], + _aG_ = [0, [23, ignored$0, fmt_rest$1]]; + else + var + _aH_ = get_prec(0), + match$1 = make_padprec_fmt_ebb(get_int_pad(0), _aH_, fmt_rest$1), + fmt_rest$2 = match$1[3], + prec$1 = match$1[2], + pad$1 = match$1[1], + _aG_ = [0, [6, iconv$0, pad$1, prec$1, fmt_rest$2]]; + var _aB_ = _aG_; + switch$8 = 1; + } + if(switch$8){var fmt_result = _aB_; switch$7 = 1;} + } + } + else if(76 === symb){ + var + _aI_ = caml_string_get(str, str_ind), + _aJ_ = get_space(0), + _aK_ = get_hash(0), + iconv$1 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aK_, _aJ_, _aI_), + fmt_rest$3 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$1 = [5, iconv$1, get_pad_opt(95)], + _aL_ = [0, [23, ignored$1, fmt_rest$3]]; + else + var + _aM_ = get_prec(0), + match$2 = make_padprec_fmt_ebb(get_int_pad(0), _aM_, fmt_rest$3), + fmt_rest$4 = match$2[3], + prec$2 = match$2[2], + pad$2 = match$2[1], + _aL_ = [0, [7, iconv$1, pad$2, prec$2, fmt_rest$4]]; + var fmt_result = _aL_; + switch$7 = 1; + } + if(! switch$7) + var + fmt_result = + caml_call3(failwith_message(_J_), str, str_ind - 1 | 0, symb); + } + if(1 - legacy_behavior$0){ + var _ao_ = 1 - plus_used[1], plus$0 = _ao_ ? plus : _ao_; + if(plus$0) incompatible_flag(pct_ind, str_ind, symb, cst$27); + var _ap_ = 1 - hash_used[1], hash$0 = _ap_ ? hash : _ap_; + if(hash$0) incompatible_flag(pct_ind, str_ind, symb, cst$28); + var _aq_ = 1 - space_used[1], space$0 = _aq_ ? space : _aq_; + if(space$0) incompatible_flag(pct_ind, str_ind, symb, cst$29); + var + _ar_ = 1 - pad_used[1], + _as_ = _ar_ ? caml_notequal([0, pad], _K_) : _ar_; + if(_as_) incompatible_flag(pct_ind, str_ind, symb, cst_padding$0); + var + _at_ = 1 - prec_used[1], + _au_ = _at_ ? caml_notequal([0, prec], _L_) : _at_; + if(_au_){ + var _av_ = ign ? 95 : symb; + incompatible_flag(pct_ind, str_ind, _av_, cst_precision$2); + } + var plus$1 = ign ? plus : ign; + if(plus$1) incompatible_flag(pct_ind, str_ind, 95, cst$30); + } + var _aw_ = 1 - ign_used[1], ign$0 = _aw_ ? ign : _aw_; + if(ign$0){ + var switch$9 = 0; + if(38 <= symb){ + if(44 !== symb && 64 !== symb) switch$9 = 1; + } + else if(33 !== symb && 37 > symb) switch$9 = 1; + var switch$10 = 0; + if(switch$9 || ! legacy_behavior$0) switch$10 = 1; + if(switch$10) incompatible_flag(pct_ind, str_ind, symb, cst$31); + } + return fmt_result; + } + function parse_after_precision + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad, prec){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + function parse_conv(padprec){ + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + caml_string_get(str, str_ind)); + } + if(typeof pad !== "number") return parse_conv(pad); + if(typeof prec === "number" && ! prec) return parse_conv(0); + if(minus){ + if(typeof prec === "number") return parse_conv(_F_); + var n = prec[1]; + return parse_conv([0, 0, n]); + } + if(typeof prec === "number") return parse_conv(_G_); + var n$0 = prec[1]; + return parse_conv([0, 1, n$0]); + } + function parse_after_padding + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var symb = caml_string_get(str, str_ind); + if(46 !== symb) + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + 0, + pad, + symb); + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + function parse_literal(minus, str_ind){ + var + match = parse_positive(str_ind, end_ind, 0), + prec = match[2], + new_ind = match[1]; + return parse_after_precision + (pct_ind, + new_ind, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + [0, prec]); + } + var symb$0 = caml_string_get(str, str_ind$0); + if(48 <= symb$0){ + if(58 > symb$0) return parse_literal(minus, str_ind$0); + } + else if(42 <= symb$0) + switch(symb$0 - 42 | 0){ + case 0: + return parse_after_precision + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + 1); + case 1: + case 3: + if(legacy_behavior$0){ + var + _an_ = str_ind$0 + 1 | 0, + minus$0 = minus || (45 === symb$0 ? 1 : 0); + return parse_literal(minus$0, _an_); + } + break; + } + return legacy_behavior$0 + ? parse_after_precision + (pct_ind, + str_ind$0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + _E_) + : invalid_format_without(str_ind$0 - 1 | 0, 46, cst_precision); + } + function parse_flags(pct_ind, str_ind, end_ind, ign){ + var + zero = [0, 0], + minus = [0, 0], + plus = [0, 0], + space = [0, 0], + hash = [0, 0]; + function set_flag(str_ind, flag){ + var _ak_ = flag[1], _al_ = _ak_ ? 1 - legacy_behavior$0 : _ak_; + if(_al_){ + var _am_ = caml_string_get(str, str_ind); + caml_call3(failwith_message(_C_), str, str_ind, _am_); + } + flag[1] = 1; + return 0; + } + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var switcher = caml_string_get(str, str_ind$0) - 32 | 0; + if(16 >= switcher >>> 0) + switch(switcher){ + case 0: + set_flag(str_ind$0, space); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + case 3: + set_flag(str_ind$0, hash); + var str_ind$2 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$2; + continue; + case 11: + set_flag(str_ind$0, plus); + var str_ind$3 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$3; + continue; + case 13: + set_flag(str_ind$0, minus); + var str_ind$4 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$4; + continue; + case 16: + set_flag(str_ind$0, zero); + var str_ind$5 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$5; + continue; + } + var + space$0 = space[1], + hash$0 = hash[1], + plus$0 = plus[1], + minus$0 = minus[1], + zero$0 = zero[1]; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var + padty = + zero$0 + ? minus$0 + ? legacy_behavior$0 + ? 0 + : incompatible_flag(pct_ind, str_ind$0, 45, cst_0) + : 2 + : minus$0 ? 0 : 1, + match = caml_string_get(str, str_ind$0); + if(48 <= match){ + if(58 > match){ + var + match$0 = parse_positive(str_ind$0, end_ind, 0), + width = match$0[2], + new_ind = match$0[1]; + return parse_after_padding + (pct_ind, + new_ind, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [0, padty, width]); + } + } + else if(42 === match) + return parse_after_padding + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [1, padty]); + switch(padty){ + case 0: + if(1 - legacy_behavior$0) + invalid_format_without(str_ind$0 - 1 | 0, 45, cst_padding); + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + case 1: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + default: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + _D_); + } + } + } + function parse_tag(is_open_tag, str_ind, end_ind){ + try{ + if(str_ind === end_ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(60 !== caml_string_get(str, str_ind)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var ind = caml_call3(Stdlib_String[31], str, str_ind + 1 | 0, 62); + if(end_ind <= ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + sub_str = + caml_call3 + (Stdlib_String[15], str, str_ind, (ind - str_ind | 0) + 1 | 0), + fmt_rest$0 = parse(ind + 1 | 0, end_ind)[1], + sub_fmt = parse(str_ind, ind + 1 | 0)[1], + sub_format$0 = [0, sub_fmt, sub_str], + formatting$0 = is_open_tag ? [0, sub_format$0] : [1, sub_format$0], + _ai_ = [0, [18, formatting$0, fmt_rest$0]]; + return _ai_; + } + catch(_aj_){ + var _ah_ = caml_wrap_exception(_aj_); + if(_ah_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ah_, 0); + var + fmt_rest = parse(str_ind, end_ind)[1], + formatting = is_open_tag ? [0, sub_format] : [1, sub_format]; + return [0, [18, formatting, fmt_rest]]; + } + } + function parse_spaces(str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + if(32 !== caml_string_get(str, str_ind$0)) return str_ind$0; + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + } + } + function parse_positive(str_ind, end_ind, acc){ + var str_ind$0 = str_ind, acc$0 = acc; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(9 < c - 48 >>> 0) return [0, str_ind$0, acc$0]; + var new_acc = (acc$0 * 10 | 0) + (c - 48 | 0) | 0; + if(Stdlib_Sys[12] < new_acc){ + var _ag_ = Stdlib_Sys[12]; + return caml_call3(failwith_message(_S_), str, new_acc, _ag_); + } + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + acc$0 = new_acc; + } + } + function parse_integer(str_ind, end_ind){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var match = caml_string_get(str, str_ind); + if(48 <= match){ + if(58 > match) return parse_positive(str_ind, end_ind, 0); + } + else if(45 === match){ + if((str_ind + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind + 1 | 0); + if(9 < c - 48 >>> 0) + return expected_character(str_ind + 1 | 0, cst_digit, c); + var + match$0 = parse_positive(str_ind + 1 | 0, end_ind, 0), + n = match$0[2], + next_ind = match$0[1]; + return [0, next_ind, - n | 0]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + } + function search_subformat_end(str_ind, end_ind, c){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) + caml_call3(failwith_message(_U_), str, c, end_ind); + if(37 !== caml_string_get(str, str_ind$0)){ + var str_ind$7 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$7; + continue; + } + if((str_ind$0 + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + if(caml_string_get(str, str_ind$0 + 1 | 0) === c) return str_ind$0; + var match = caml_string_get(str, str_ind$0 + 1 | 0); + if(95 <= match){ + if(123 <= match){ + if(126 > match) + switch(match - 123 | 0){ + case 0: + var + sub_end = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 125), + str_ind$2 = sub_end + 2 | 0, + str_ind$0 = str_ind$2; + continue; + case 1: break; + default: + return expected_character(str_ind$0 + 1 | 0, cst_character, 125); + } + } + else if(96 > match){ + if((str_ind$0 + 2 | 0) === end_ind) unexpected_end_of_format(end_ind); + var match$0 = caml_string_get(str, str_ind$0 + 2 | 0); + if(40 === match$0){ + var + sub_end$0 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 41), + str_ind$3 = sub_end$0 + 2 | 0, + str_ind$0 = str_ind$3; + continue; + } + if(123 === match$0){ + var + sub_end$1 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 125), + str_ind$4 = sub_end$1 + 2 | 0, + str_ind$0 = str_ind$4; + continue; + } + var str_ind$5 = str_ind$0 + 3 | 0, str_ind$0 = str_ind$5; + continue; + } + } + else{ + if(40 === match){ + var + sub_end$2 = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 41), + str_ind$6 = sub_end$2 + 2 | 0, + str_ind$0 = str_ind$6; + continue; + } + if(41 === match) + return expected_character(str_ind$0 + 1 | 0, cst_character$0, 41); + } + var str_ind$1 = str_ind$0 + 2 | 0, str_ind$0 = str_ind$1; + } + } + function incompatible_flag(pct_ind, str_ind, symb, option){ + var + subfmt = + caml_call3(Stdlib_String[15], str, pct_ind, str_ind - pct_ind | 0); + return caml_call5 + (failwith_message(_Y_), str, pct_ind, option, symb, subfmt); + } + function compute_int_conv(pct_ind, str_ind, plus, hash, space, symb){ + var plus$0 = plus, hash$0 = hash, space$0 = space; + for(;;){ + var switch$0 = 0; + if(plus$0){ + if(hash$0) + switch$0 = 1; + else if(! space$0){ + if(100 === symb) return 1; + if(105 === symb) return 4; + } + } + else if(hash$0) + if(space$0) + switch$0 = 1; + else{ + var switcher$0 = symb - 88 | 0; + if(32 < switcher$0 >>> 0) + switch$0 = 1; + else + switch(switcher$0){ + case 0: + return 9; + case 12: + return 13; + case 17: + return 14; + case 23: + return 11; + case 29: + return 15; + case 32: + return 7; + default: switch$0 = 1; + } + } + else if(space$0){ + if(100 === symb) return 2; + if(105 === symb) return 5; + } + else{ + var switcher$1 = symb - 88 | 0; + if(32 >= switcher$1 >>> 0) + switch(switcher$1){ + case 0: + return 8; + case 12: + return 0; + case 17: + return 3; + case 23: + return 10; + case 29: + return 12; + case 32: + return 6; + } + } + if(switch$0){ + var switcher = symb - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 0: + if(legacy_behavior$0) return 9; break; + case 23: + if(legacy_behavior$0) return 11; break; + case 32: + if(legacy_behavior$0) return 7; break; + case 12: + case 17: + case 29: + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$35); + var hash$0 = 0; + continue; + } + } + if(! plus$0){ + if(! space$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _W_], 1); + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$34); + var space$0 = 0; + continue; + } + if(space$0){ + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, 32, cst$32); + var space$0 = 0; + continue; + } + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$33); + var plus$0 = 0; + } + } + return parse(0, caml_ml_string_length(str)); + } + function format_of_string_fmtty(str, fmtty){ + var fmt = fmt_ebb_of_string(0, str)[1]; + try{var _ae_ = [0, type_format(fmt, fmtty), str]; return _ae_;} + catch(_af_){ + var _ac_ = caml_wrap_exception(_af_); + if(_ac_ !== Type_mismatch) throw caml_maybe_attach_backtrace(_ac_, 0); + var _ad_ = string_of_fmtty(fmtty); + return caml_call2(failwith_message(_Z_), str, _ad_); + } + } + function format_of_string_format(str, param){ + var + str$0 = param[2], + fmt = param[1], + fmt$0 = fmt_ebb_of_string(0, str)[1]; + try{ + var _aa_ = [0, type_format(fmt$0, fmtty_of_fmt(fmt)), str]; + return _aa_; + } + catch(_ab_){ + var _$_ = caml_wrap_exception(_ab_); + if(_$_ === Type_mismatch) + return caml_call2(failwith_message(___), str, str$0); + throw caml_maybe_attach_backtrace(_$_, 0); + } + } + var + CamlinternalFormat = + [0, + is_in_char_set, + rev_char_set, + create_char_set, + add_in_char_set, + freeze_char_set, + param_format_of_ignored_format, + make_printf, + make_iprintf, + output_acc, + bufput_acc, + strput_acc, + type_format, + fmt_ebb_of_string, + format_of_string_fmtty, + format_of_string_format, + char_of_iconv, + string_of_formatting_lit, + string_of_fmtty, + string_of_fmt, + open_box_of_string, + symm, + trans, + recast]; + runtime.caml_register_global(197, CamlinternalFormat, "CamlinternalFormat"); + return; + } + (globalThis)); + +//# 15574 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Buffer = global_data.Stdlib__Buffer, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib; + function kfprintf(k, o, param){ + var fmt = param[1], _g_ = 0; + function _h_(acc){ + caml_call2(CamlinternalFormat[9], o, acc); + return caml_call1(k, o); + } + return caml_call3(CamlinternalFormat[7], _h_, _g_, fmt); + } + function kbprintf(k, b, param){ + var fmt = param[1], _e_ = 0; + function _f_(acc){ + caml_call2(CamlinternalFormat[10], b, acc); + return caml_call1(k, b); + } + return caml_call3(CamlinternalFormat[7], _f_, _e_, fmt); + } + function ikfprintf(k, oc, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, oc, fmt); + } + function fprintf(oc, fmt){ + return kfprintf(function(_d_){return 0;}, oc, fmt); + } + function bprintf(b, fmt){ + return kbprintf(function(_c_){return 0;}, b, fmt); + } + function ifprintf(oc, fmt){ + return ikfprintf(function(_b_){return 0;}, oc, fmt); + } + function ibprintf(b, fmt){ + return ikfprintf(function(_a_){return 0;}, b, fmt); + } + function printf(fmt){return fprintf(Stdlib[39], fmt);} + function eprintf(fmt){return fprintf(Stdlib[40], fmt);} + function ksprintf(k, param){ + var fmt = param[1]; + function k$0(acc){ + var buf = caml_call1(Stdlib_Buffer[1], 64); + caml_call2(CamlinternalFormat[11], buf, acc); + return caml_call1(k, caml_call1(Stdlib_Buffer[2], buf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(function(s){return s;}, fmt);} + var + Stdlib_Printf = + [0, + fprintf, + printf, + eprintf, + sprintf, + bprintf, + ifprintf, + ibprintf, + kfprintf, + ikfprintf, + ksprintf, + kbprintf, + ikfprintf, + ksprintf]; + runtime.caml_register_global(3, Stdlib_Printf, "Stdlib__Printf"); + return; + } + (globalThis)); + +//# 15665 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$7 = "", + cst$9 = " ", + cst_Display_this_list_of_optio$1 = " Display this list of options", + cst_s = "%s", + cst_help$4 = "--help", + cst_help$3 = "-help", + cst$8 = ".\n", + cst_a_float$1 = "a float", + cst_an_integer$1 = "an integer", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$6 = "\n", + cst$3 = cst$7, + cst$4 = " ", + cst$5 = cst$7, + cst$2 = "(?)", + cst = "}", + cst$0 = "|", + cst$1 = "{", + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + Bad = [248, "Stdlib.Arg.Bad", caml_fresh_oo_id(0)], + Help = [248, "Stdlib.Arg.Help", caml_fresh_oo_id(0)], + Stop = [248, "Stdlib.Arg.Stop", caml_fresh_oo_id(0)], + _v_ = [0, [2, 0, [0, 0]], "%s%c"], + _p_ = [0, [2, 0, 0], cst_s], + _q_ = [0, [2, 0, 0], cst_s], + _n_ = [0, [2, 0, 0], cst_s], + _o_ = [0, [2, 0, 0], cst_s], + _l_ = [0, [2, 0, 0], cst_s], + _m_ = [0, [2, 0, 0], cst_s], + cst_a_boolean = "a boolean", + cst_an_integer = cst_an_integer$1, + cst_an_integer$0 = cst_an_integer$1, + cst_a_float = cst_a_float$1, + cst_a_float$0 = cst_a_float$1, + cst_one_of = "one of: ", + cst_Arg_Expand_is_is_only_allo = + "Arg.Expand is is only allowed with Arg.parse_and_expand_argv_dynamic", + cst_no_argument = "no argument", + _f_ = + [0, + [2, 0, [11, ": unknown option '", [2, 0, [11, "'.\n", 0]]]], + "%s: unknown option '%s'.\n"], + _i_ = + [0, + [2, + 0, + [11, + ": wrong argument '", + [2, + 0, + [11, + "'; option '", + [2, 0, [11, "' expects ", [2, 0, [11, cst$8, 0]]]]]]]], + "%s: wrong argument '%s'; option '%s' expects %s.\n"], + _j_ = + [0, + [2, 0, [11, ": option '", [2, 0, [11, "' needs an argument.\n", 0]]]], + "%s: option '%s' needs an argument.\n"], + _k_ = [0, [2, 0, [11, ": ", [2, 0, [11, cst$8, 0]]]], "%s: %s.\n"], + _g_ = [0, cst_help$3], + _h_ = [0, cst_help$4], + _e_ = [0, [2, 0, 0], cst_s], + _d_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + cst_help$2 = cst_help$3, + cst_Display_this_list_of_optio = cst_Display_this_list_of_optio$1, + cst_help = cst_help$3, + cst_help$1 = cst_help$4, + cst_Display_this_list_of_optio$0 = cst_Display_this_list_of_optio$1, + cst_help$0 = cst_help$4, + _c_ = [0, cst_help$3], + _a_ = [0, [11, cst$9, [2, 0, [12, 32, [2, 0, [12, 10, 0]]]]], " %s %s\n"], + _b_ = + [0, + [11, cst$9, [2, 0, [12, 32, [2, 0, [2, 0, [12, 10, 0]]]]]], + " %s %s%s\n"], + cst_none = ""; + function assoc3(x, l){ + var l$0 = l; + for(;;){ + if(! l$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var match = l$0[1], y2 = match[2], y1 = match[1]; + if(caml_equal(y1, x)) return y2; + var t = l$0[2], l$0 = t; + } + } + function make_symlist(prefix, sep, suffix, l){ + if(! l) return cst_none; + var t = l[2], h = l[1], _aD_ = caml_call2(Stdlib[28], prefix, h); + function _aE_(x, y){ + var _aG_ = caml_call2(Stdlib[28], sep, y); + return caml_call2(Stdlib[28], x, _aG_); + } + var _aF_ = caml_call3(Stdlib_List[25], _aE_, _aD_, t); + return caml_call2(Stdlib[28], _aF_, suffix); + } + function help_action(param){ + throw caml_maybe_attach_backtrace([0, Stop, _c_], 1); + } + function add_help(speclist){ + try{assoc3(cst_help$2, speclist); var _aA_ = 0, add1 = _aA_;} + catch(_aC_){ + var _aw_ = caml_wrap_exception(_aC_); + if(_aw_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_aw_, 0); + var + add1 = + [0, + [0, cst_help, [0, help_action], cst_Display_this_list_of_optio], + 0]; + } + try{assoc3(cst_help$1, speclist); var _az_ = 0, add2 = _az_;} + catch(_aB_){ + var _ax_ = caml_wrap_exception(_aB_); + if(_ax_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ax_, 0); + var + add2 = + [0, + [0, cst_help$0, [0, help_action], cst_Display_this_list_of_optio$0], + 0]; + } + var _ay_ = caml_call2(Stdlib[37], add1, add2); + return caml_call2(Stdlib[37], speclist, _ay_); + } + function usage_b(buf, speclist, errmsg){ + caml_call3(Stdlib_Printf[5], buf, _d_, errmsg); + var _as_ = add_help(speclist); + function _at_(param){ + var + doc = param[3], + spec = param[2], + key = param[1], + _au_ = 0 < caml_ml_string_length(doc) ? 1 : 0; + if(! _au_) return _au_; + if(11 !== spec[0]) + return caml_call4(Stdlib_Printf[5], buf, _a_, key, doc); + var l = spec[1], _av_ = make_symlist(cst$1, cst$0, cst, l); + return caml_call5(Stdlib_Printf[5], buf, _b_, key, _av_, doc); + } + return caml_call2(Stdlib_List[17], _at_, _as_); + } + function usage_string(speclist, errmsg){ + var b = caml_call1(Stdlib_Buffer[1], 200); + usage_b(b, speclist, errmsg); + return caml_call1(Stdlib_Buffer[2], b); + } + function usage(speclist, errmsg){ + var _ar_ = usage_string(speclist, errmsg); + return caml_call2(Stdlib_Printf[3], _e_, _ar_); + } + var current = [0, 0]; + function int_of_string_opt(x){ + try{var _ap_ = [0, runtime.caml_int_of_string(x)]; return _ap_;} + catch(_aq_){ + var _ao_ = caml_wrap_exception(_aq_); + if(_ao_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_ao_, 0); + } + } + function float_of_string_opt(x){ + try{var _am_ = [0, runtime.caml_float_of_string(x)]; return _am_;} + catch(_an_){ + var _al_ = caml_wrap_exception(_an_); + if(_al_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_al_, 0); + } + } + function parse_and_expand_argv_dynamic_ + (allow_expand, current, argv, speclist, anonfun, errmsg){ + var initpos = current[1]; + function convert_error(error){ + var + b = caml_call1(Stdlib_Buffer[1], 200), + progname = + initpos < argv[1].length - 1 + ? caml_check_bound(argv[1], initpos)[1 + initpos] + : cst$2; + switch(error[0]){ + case 0: + var s = error[1]; + if + (caml_string_notequal(s, cst_help$4) + && caml_string_notequal(s, cst_help$3)) + caml_call4(Stdlib_Printf[5], b, _f_, progname, s); + break; + case 1: + var expected = error[3], arg = error[2], opt = error[1]; + caml_call6(Stdlib_Printf[5], b, _i_, progname, arg, opt, expected); + break; + case 2: + var s$0 = error[1]; + caml_call4(Stdlib_Printf[5], b, _j_, progname, s$0); + break; + default: + var s$1 = error[1]; + caml_call4(Stdlib_Printf[5], b, _k_, progname, s$1); + } + usage_b(b, speclist[1], errmsg); + if(! caml_equal(error, _g_) && ! caml_equal(error, _h_)) + return [0, Bad, caml_call1(Stdlib_Buffer[2], b)]; + return [0, Help, caml_call1(Stdlib_Buffer[2], b)]; + } + current[1]++; + for(;;){ + if(current[1] >= argv[1].length - 1) return 0; + try{ + var + _Y_ = current[1], + s = caml_check_bound(argv[1], _Y_)[1 + _Y_], + switch$0 = 0; + if(1 <= caml_ml_string_length(s) && 45 === caml_string_get(s, 0)){ + try{ + var + follow$1 = 0, + _aa_ = assoc3(s, speclist[1]), + follow$0 = follow$1, + action = _aa_; + } + catch(_aj_){ + var _Z_ = caml_wrap_exception(_aj_); + if(_Z_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_Z_, 0); + try{ + var + i = caml_call2(Stdlib_String[35], s, 61), + len = caml_ml_string_length(s), + arg = + caml_call3(Stdlib_String[15], s, i + 1 | 0, len - (i + 1 | 0) | 0), + keyword = caml_call3(Stdlib_String[15], s, 0, i), + follow = [0, arg], + _$_ = assoc3(keyword, speclist[1]), + follow$0 = follow, + action = _$_; + } + catch(_ak_){ + var ___ = caml_wrap_exception(_ak_); + if(___ === Stdlib[8]) + throw caml_maybe_attach_backtrace([0, Stop, [0, s]], 1); + throw caml_maybe_attach_backtrace(___, 0); + } + } + var + no_arg$0 = + function(s, follow){ + function no_arg(param){ + if(! follow) return 0; + var arg = follow[1]; + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_no_argument]], 1); + } + return no_arg; + }, + no_arg = no_arg$0(s, follow$0), + get_arg$0 = + function(s, follow){ + function get_arg(param){ + if(follow){var arg = follow[1]; return arg;} + if((current[1] + 1 | 0) >= argv[1].length - 1) + throw caml_maybe_attach_backtrace([0, Stop, [2, s]], 1); + var _ai_ = current[1] + 1 | 0; + return caml_check_bound(argv[1], _ai_)[1 + _ai_]; + } + return get_arg; + }, + get_arg = get_arg$0(s, follow$0), + consume_arg$0 = + function(follow){ + function consume_arg(param){return follow ? 0 : (current[1]++, 0);} + return consume_arg; + }, + consume_arg = consume_arg$0(follow$0), + treat_action$0 = + function(s, no_arg, get_arg, consume_arg){ + function treat_action(param){ + switch(param[0]){ + case 0: + var f = param[1]; no_arg(0); return caml_call1(f, 0); + case 1: + var f$0 = param[1], arg = get_arg(0); + try{var _ac_ = [0, caml_call1(Stdlib[32], arg)], match = _ac_;} + catch(_ah_){ + var _ab_ = caml_wrap_exception(_ah_); + if(_ab_[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace(_ab_, 0); + var match = 0; + } + if(! match) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_a_boolean]], 1); + var s$0 = match[1]; + caml_call1(f$0, s$0); + return consume_arg(0); + case 2: + var r = param[1]; no_arg(0); r[1] = 1; return 0; + case 3: + var r$0 = param[1]; no_arg(0); r$0[1] = 0; return 0; + case 4: + var f$1 = param[1], arg$0 = get_arg(0); + caml_call1(f$1, arg$0); + return consume_arg(0); + case 5: + var r$1 = param[1]; r$1[1] = get_arg(0); return consume_arg(0); + case 6: + var + f$2 = param[1], + arg$1 = get_arg(0), + match$0 = int_of_string_opt(arg$1); + if(! match$0) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$1, cst_an_integer]], 1); + var x = match$0[1]; + caml_call1(f$2, x); + return consume_arg(0); + case 7: + var + r$2 = param[1], + arg$2 = get_arg(0), + match$1 = int_of_string_opt(arg$2); + if(! match$1) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$2, cst_an_integer$0]], 1); + var x$0 = match$1[1]; + r$2[1] = x$0; + return consume_arg(0); + case 8: + var + f$3 = param[1], + arg$3 = get_arg(0), + match$2 = float_of_string_opt(arg$3); + if(! match$2) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$3, cst_a_float]], 1); + var x$1 = match$2[1]; + caml_call1(f$3, x$1); + return consume_arg(0); + case 9: + var + r$3 = param[1], + arg$4 = get_arg(0), + match$3 = float_of_string_opt(arg$4); + if(! match$3) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$4, cst_a_float$0]], 1); + var x$2 = match$3[1]; + r$3[1] = x$2; + return consume_arg(0); + case 10: + var specs = param[1]; + no_arg(0); + return caml_call2(Stdlib_List[17], treat_action, specs); + case 11: + var f$4 = param[2], symb = param[1], arg$5 = get_arg(0); + if(caml_call2(Stdlib_List[36], arg$5, symb)){ + caml_call1(f$4, arg$5); + return consume_arg(0); + } + var _ad_ = make_symlist(cst$5, cst$4, cst$3, symb); + throw caml_maybe_attach_backtrace + ([0, + Stop, + [1, s, arg$5, caml_call2(Stdlib[28], cst_one_of, _ad_)]], + 1); + case 12: + var f$5 = param[1]; + no_arg(0); + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) return 0; + var _ae_ = current[1] + 1 | 0; + caml_call1(f$5, caml_check_bound(argv[1], _ae_)[1 + _ae_]); + consume_arg(0); + } + case 13: + var f$6 = param[1]; + no_arg(0); + var acc = [0, 0]; + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) + return caml_call1(f$6, caml_call1(Stdlib_List[9], acc[1])); + var _ag_ = current[1] + 1 | 0, _af_ = acc[1]; + acc[1] = [0, caml_check_bound(argv[1], _ag_)[1 + _ag_], _af_]; + consume_arg(0); + } + default: + var f$7 = param[1]; + if(1 - allow_expand) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Arg_Expand_is_is_only_allo], 1); + var arg$6 = get_arg(0), newarg = caml_call1(f$7, arg$6); + consume_arg(0); + var + before = + caml_call3(Stdlib_Array[5], argv[1], 0, current[1] + 1 | 0), + after = + caml_call3 + (Stdlib_Array[5], + argv[1], + current[1] + 1 | 0, + (argv[1].length - 1 - current[1] | 0) - 1 | 0); + argv[1] = + caml_call1 + (Stdlib_Array[4], [0, before, [0, newarg, [0, after, 0]]]); + return 0; + } + } + return treat_action; + }, + treat_action = treat_action$0(s, no_arg, get_arg, consume_arg); + treat_action(action); + switch$0 = 1; + } + if(! switch$0) caml_call1(anonfun, s); + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var m = exn[2]; + throw caml_maybe_attach_backtrace(convert_error([3, m]), 1); + } + if(exn[1] !== Stop) throw caml_maybe_attach_backtrace(exn, 0); + var e = exn[2]; + throw caml_maybe_attach_backtrace(convert_error(e), 1); + } + current[1]++; + } + } + function parse_and_expand_argv_dynamic + (current, argv, speclist, anonfun, errmsg){ + return parse_and_expand_argv_dynamic_ + (1, current, argv, speclist, anonfun, errmsg); + } + function parse_argv_dynamic(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_and_expand_argv_dynamic_ + (0, current$0, [0, argv], speclist, anonfun, errmsg); + } + function parse_argv(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_argv_dynamic + ([0, current$0], argv, [0, speclist], anonfun, errmsg); + } + function parse(l, f, msg){ + try{var _X_ = parse_argv(0, caml_sys_argv(0), l, f, msg); return _X_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _l_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _m_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_dynamic(l, f, msg){ + try{ + var _W_ = parse_argv_dynamic(0, caml_sys_argv(0), l, f, msg); + return _W_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _n_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _o_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_expand(l, f, msg){ + try{ + var + argv = [0, caml_sys_argv(0)], + spec = [0, l], + current$0 = [0, current[1]], + _V_ = parse_and_expand_argv_dynamic(current$0, argv, spec, f, msg); + return _V_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _p_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _q_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function second_word(s){ + var len = caml_ml_string_length(s); + function loop(n){ + var n$0 = n; + for(;;){ + if(len <= n$0) return len; + if(32 !== caml_string_get(s, n$0)) return n$0; + var n$1 = n$0 + 1 | 0, n$0 = n$1; + } + } + try{var n$0 = caml_call2(Stdlib_String[35], s, 9);} + catch(_T_){ + var _R_ = caml_wrap_exception(_T_); + if(_R_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_R_, 0); + try{var n = caml_call2(Stdlib_String[35], s, 32);} + catch(_U_){ + var _S_ = caml_wrap_exception(_U_); + if(_S_ === Stdlib[8]) return len; + throw caml_maybe_attach_backtrace(_S_, 0); + } + return loop(n + 1 | 0); + } + return loop(n$0 + 1 | 0); + } + function max_arg_len(cur, param){ + var doc = param[3], spec = param[2], kwd = param[1]; + if(11 === spec[0]) + return caml_call2(Stdlib_Int[11], cur, caml_ml_string_length(kwd)); + var _Q_ = caml_ml_string_length(kwd) + second_word(doc) | 0; + return caml_call2(Stdlib_Int[11], cur, _Q_); + } + function replace_leading_tab(s){ + var seen = [0, 0]; + function _P_(c){ + if(9 === c && ! seen[1]){seen[1] = 1; return 32;} + return c; + } + return caml_call2(Stdlib_String[17], _P_, s); + } + function align(opt, speclist){ + if(opt) var sth = opt[1], limit = sth; else var limit = Stdlib[19]; + var + completed = add_help(speclist), + len = caml_call3(Stdlib_List[25], max_arg_len, 0, completed), + len$0 = caml_call2(Stdlib_Int[10], len, limit); + function _J_(ksd){ + var kwd = ksd[1], spec = ksd[2]; + if(! caml_string_notequal(ksd[3], cst$7)) return ksd; + if(11 === spec[0]){ + var + msg$0 = ksd[3], + cutcol$0 = second_word(msg$0), + _M_ = caml_call2(Stdlib_Int[11], 0, len$0 - cutcol$0 | 0) + 3 | 0, + spaces$0 = caml_call2(Stdlib_String[1], _M_, 32), + _N_ = replace_leading_tab(msg$0), + _O_ = caml_call2(Stdlib[28], spaces$0, _N_); + return [0, kwd, spec, caml_call2(Stdlib[28], cst$6, _O_)]; + } + var + msg = ksd[3], + spec$0 = ksd[2], + cutcol = second_word(msg), + kwd_len = caml_ml_string_length(kwd), + diff = (len$0 - kwd_len | 0) - cutcol | 0; + if(0 >= diff) return [0, kwd, spec$0, replace_leading_tab(msg)]; + var + spaces = caml_call2(Stdlib_String[1], diff, 32), + _K_ = replace_leading_tab(msg), + prefix = caml_call3(Stdlib_String[15], _K_, 0, cutcol), + suffix = + caml_call3 + (Stdlib_String[15], + msg, + cutcol, + caml_ml_string_length(msg) - cutcol | 0), + _L_ = caml_call2(Stdlib[28], spaces, suffix); + return [0, kwd, spec$0, caml_call2(Stdlib[28], prefix, _L_)]; + } + return caml_call2(Stdlib_List[19], _J_, completed); + } + function read_aux(trim, sep, file){ + var + ic = caml_call1(Stdlib[80], file), + buf = caml_call1(Stdlib_Buffer[1], 200), + words = [0, 0]; + function stash(param){ + var word = caml_call1(Stdlib_Buffer[2], buf); + if(trim){ + var len = caml_ml_string_length(word), switch$0 = 0; + if(0 < len && 13 === caml_string_get(word, len - 1 | 0)){ + var _I_ = caml_call3(Stdlib_String[15], word, 0, len - 1 | 0); + switch$0 = 1; + } + if(! switch$0) var _I_ = word; + var word$0 = _I_; + } + else + var word$0 = word; + words[1] = [0, word$0, words[1]]; + return caml_call1(Stdlib_Buffer[8], buf); + } + try{ + for(;;){ + var c = caml_call1(Stdlib[82], ic); + if(c === sep) stash(0); else caml_call2(Stdlib_Buffer[12], buf, c); + } + } + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_F_, 0); + if(0 < caml_call1(Stdlib_Buffer[7], buf)) stash(0); + caml_call1(Stdlib[93], ic); + var _G_ = caml_call1(Stdlib_List[9], words[1]); + return caml_call1(Stdlib_Array[10], _G_); + } + } + var _r_ = 10, _s_ = 1; + function read_arg(_E_){return read_aux(_s_, _r_, _E_);} + var _t_ = 0, _u_ = 0; + function read_arg0(_D_){return read_aux(_u_, _t_, _D_);} + function write_aux(sep, file, args){ + var oc = caml_call1(Stdlib[61], file); + function _C_(s){return caml_call4(Stdlib_Printf[1], oc, _v_, s, sep);} + caml_call2(Stdlib_Array[11], _C_, args); + return caml_call1(Stdlib[76], oc); + } + var _w_ = 10; + function write_arg(_A_, _B_){return write_aux(_w_, _A_, _B_);} + var _x_ = 0; + function write_arg0(_y_, _z_){return write_aux(_x_, _y_, _z_);} + var + Stdlib_Arg = + [0, + parse, + parse_dynamic, + parse_argv, + parse_argv_dynamic, + parse_and_expand_argv_dynamic, + parse_expand, + Help, + Bad, + usage, + usage_string, + align, + current, + read_arg, + read_arg0, + write_arg, + write_arg0]; + runtime.caml_register_global(54, Stdlib_Arg, "Stdlib__Arg"); + return; + } + (globalThis)); + +//# 16364 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_s = "%s\n", + cst_Program_not_linked_with_g_$0 = + "(Program not linked with -g, cannot print stack backtrace)\n", + cst_characters = ", characters ", + cst_Fatal_error_exception = "Fatal error: exception ", + cst_Fatal_error_exception_s = "Fatal error: exception %s\n", + cst_Uncaught_exception = "Uncaught exception: ", + cst_Uncaught_exception_s = "Uncaught exception: %s\n", + caml_check_bound = runtime.caml_check_bound, + caml_get_exception_raw_backtra = runtime.caml_get_exception_raw_backtrace, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$4, + cst$3 = cst$4, + partial = [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, 0]]], + cst$1 = cst$4, + cst$2 = cst$4, + cst = "_", + locfmt = + [0, + [11, + 'File "', + [2, + 0, + [11, + '", line ', + [4, + 0, + 0, + 0, + [11, + cst_characters, + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [11, ": ", [2, 0, 0]]]]]]]]]], + 'File "%s", line %d, characters %d-%d: %s'], + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Obj = global_data.Stdlib__Obj, + printers = caml_call1(Stdlib_Atomic[1], 0), + _c_ = [0, [11, ", ", [2, 0, [2, 0, 0]]], ", %s%s"], + _o_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _p_ = + [0, + [11, + "Fatal error in uncaught exception handler: exception ", + [2, 0, [12, 10, 0]]], + "Fatal error in uncaught exception handler: exception %s\n"], + cst_Fatal_error_out_of_memory_ = + "Fatal error: out of memory in uncaught exception handler", + _n_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _l_ = [0, [2, 0, [12, 10, 0]], cst_s], + cst_Program_not_linked_with_g_ = cst_Program_not_linked_with_g_$0, + _j_ = [0, [2, 0, [12, 10, 0]], cst_s], + _k_ = + [0, + [11, cst_Program_not_linked_with_g_$0, 0], + cst_Program_not_linked_with_g_$0], + cst_Raised_at = "Raised at", + cst_Re_raised_at = "Re-raised at", + cst_Raised_by_primitive_operat = "Raised by primitive operation at", + cst_Called_from = "Called from", + cst_inlined = " (inlined)", + _h_ = + [0, + [2, + 0, + [12, + 32, + [2, + 0, + [11, + ' in file "', + [2, + 0, + [12, + 34, + [2, + 0, + [11, ", line ", [4, 0, 0, 0, [11, cst_characters, partial]]]]]]]]]], + '%s %s in file "%s"%s, line %d, characters %d-%d'], + _i_ = [0, [2, 0, [11, " unknown location", 0]], "%s unknown location"], + _g_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + _f_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + cst_Out_of_memory = "Out of memory", + cst_Stack_overflow = "Stack overflow", + cst_Pattern_matching_failed = "Pattern matching failed", + cst_Assertion_failed = "Assertion failed", + cst_Undefined_recursive_module = "Undefined recursive module", + _d_ = [0, [12, 40, [2, 0, [2, 0, [12, 41, 0]]]], "(%s%s)"], + _e_ = [0, [12, 40, [2, 0, [12, 41, 0]]], "(%s)"], + _b_ = [0, [4, 0, 0, 0, 0], "%d"], + _a_ = [0, [3, 0, 0], "%S"], + _m_ = + [0, + cst$4, + "(Cannot print locations:\n bytecode executable program file not found)", + "(Cannot print locations:\n bytecode executable program file appears to be corrupt)", + "(Cannot print locations:\n bytecode executable program file has wrong magic number)", + "(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"]; + function field(x, i){ + var f = x[1 + i]; + if(! caml_call1(Stdlib_Obj[1], f)) + return caml_call2(Stdlib_Printf[4], _b_, f); + var _al_ = Stdlib_Obj[15]; + if(caml_obj_tag(f) === _al_) return caml_call2(Stdlib_Printf[4], _a_, f); + var _am_ = Stdlib_Obj[16]; + return caml_obj_tag(f) === _am_ ? caml_call1(Stdlib[35], f) : cst; + } + function other_fields(x, i){ + if(x.length - 1 <= i) return cst$0; + var _aj_ = other_fields(x, i + 1 | 0), _ak_ = field(x, i); + return caml_call3(Stdlib_Printf[4], _c_, _ak_, _aj_); + } + function use_printers(x){ + var param = caml_call1(Stdlib_Atomic[2], printers); + for(;;){ + if(! param) return 0; + var tl = param[2], hd = param[1], switch$0 = 0; + try{var val = caml_call1(hd, x);}catch(_ai_){switch$0 = 1;} + if(! switch$0 && val){var s = val[1]; return [0, s];} + var param = tl; + } + } + function string_of_extension_constructo(t){ + if(0 === caml_obj_tag(t)){ + var constructor = t[1][1], match = t.length - 1; + if(2 < match >>> 0) + var + _ae_ = other_fields(t, 2), + _af_ = field(t, 1), + _ah_ = caml_call3(Stdlib_Printf[4], _d_, _af_, _ae_); + else + switch(match){ + case 0: + var _ah_ = cst$1; break; + case 1: + var _ah_ = cst$2; break; + default: + var + _ag_ = field(t, 1), + _ah_ = caml_call2(Stdlib_Printf[4], _e_, _ag_); + } + var match$0 = [0, constructor, [0, _ah_]]; + } + else + var match$0 = [0, t[1], 0]; + var fields_opt = match$0[2], constructor$0 = match$0[1]; + if(! fields_opt) return constructor$0; + var f = fields_opt[1]; + return caml_call2(Stdlib[28], constructor$0, f); + } + function to_string_default(x){ + if(x === Stdlib[9]) return cst_Out_of_memory; + if(x === Stdlib[10]) return cst_Stack_overflow; + if(x[1] === Stdlib[4]){ + var match = x[2], char$0 = match[3], line = match[2], file = match[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file, + line, + char$0, + char$0 + 5 | 0, + cst_Pattern_matching_failed); + } + if(x[1] === Stdlib[5]){ + var + match$0 = x[2], + char$1 = match$0[3], + line$0 = match$0[2], + file$0 = match$0[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$0, + line$0, + char$1, + char$1 + 6 | 0, + cst_Assertion_failed); + } + if(x[1] !== Stdlib[15]) return string_of_extension_constructo(x); + var + match$1 = x[2], + char$2 = match$1[3], + line$1 = match$1[2], + file$1 = match$1[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$1, + line$1, + char$2, + char$2 + 6 | 0, + cst_Undefined_recursive_module); + } + function to_string(e){ + var match = use_printers(e); + if(! match) return to_string_default(e); + var s = match[1]; + return s; + } + function print(fct, arg){ + try{var _ad_ = caml_call1(fct, arg); return _ad_;} + catch(x$0){ + var x = caml_wrap_exception(x$0), _ac_ = to_string(x); + caml_call2(Stdlib_Printf[3], _f_, _ac_); + caml_call1(Stdlib[63], Stdlib[40]); + throw caml_maybe_attach_backtrace(x, 0); + } + } + function catch$0(fct, arg){ + try{var _ab_ = caml_call1(fct, arg); return _ab_;} + catch(x$0){ + var x = caml_wrap_exception(x$0); + caml_call1(Stdlib[63], Stdlib[39]); + var _aa_ = to_string(x); + caml_call2(Stdlib_Printf[3], _g_, _aa_); + return caml_call1(Stdlib[99], 2); + } + } + function raw_backtrace_entries(bt){return bt;} + function convert_raw_backtrace(bt){ + return [0, runtime.caml_convert_raw_backtrace(bt)]; + } + function format_backtrace_slot(pos, slot){ + function info(is_raise){ + return is_raise + ? 0 === pos ? cst_Raised_at : cst_Re_raised_at + : 0 === pos ? cst_Raised_by_primitive_operat : cst_Called_from; + } + if(0 === slot[0]){ + var + _U_ = slot[5], + _V_ = slot[4], + _W_ = slot[3], + _X_ = slot[6] ? cst_inlined : cst$3, + _Y_ = slot[2], + _Z_ = slot[7], + ___ = info(slot[1]); + return [0, + caml_call8 + (Stdlib_Printf[4], _h_, ___, _Z_, _Y_, _X_, _W_, _V_, _U_)]; + } + if(slot[1]) return 0; + var _$_ = info(0); + return [0, caml_call2(Stdlib_Printf[4], _i_, _$_)]; + } + function print_raw_backtrace(outchan, raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return caml_call2(Stdlib_Printf[1], outchan, _k_); + var a = backtrace[1], _S_ = a.length - 1 - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[1], outchan, _j_, str); + } + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return 0; + } + function print_backtrace(outchan){ + return print_raw_backtrace(outchan, caml_get_exception_raw_backtra(0)); + } + function raw_backtrace_to_string(raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return cst_Program_not_linked_with_g_; + var + a = backtrace[1], + b = caml_call1(Stdlib_Buffer[1], 1024), + _P_ = a.length - 1 - 1 | 0, + _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[5], b, _l_, str); + } + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return caml_call1(Stdlib_Buffer[2], b); + } + function backtrace_slot_is_raise(param){ + return 0 === param[0] ? param[1] : param[1]; + } + function backtrace_slot_is_inline(param){return 0 === param[0] ? param[6] : 0; + } + function backtrace_slot_location(param){ + return 0 === param[0] + ? [0, [0, param[2], param[3], param[4], param[5]]] + : 0; + } + function backtrace_slot_defname(param){ + if(0 === param[0] && runtime.caml_string_notequal(param[7], cst$4)) + return [0, param[7]]; + return 0; + } + function backtrace_slots(raw_backtrace){ + var match = convert_raw_backtrace(raw_backtrace); + if(! match) return 0; + var backtrace = match[1], i$1 = backtrace.length - 1 - 1 | 0, i = i$1; + for(;;){ + if(-1 === i) + var _N_ = 0; + else{ + var _M_ = 0 === caml_check_bound(backtrace, i)[1 + i][0] ? 1 : 0; + if(! _M_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _N_ = _M_; + } + return _N_ ? [0, backtrace] : 0; + } + } + function backtrace_slots_of_raw_entry(entry){return backtrace_slots([0, entry]); + } + function raw_backtrace_length(bt){return bt.length - 1;} + function get_backtrace(param){ + return raw_backtrace_to_string(caml_get_exception_raw_backtra(0)); + } + function register_printer(fn){ + for(;;){ + var + old_printers = caml_call1(Stdlib_Atomic[2], printers), + new_printers = [0, fn, old_printers], + success = + caml_call3(Stdlib_Atomic[5], printers, old_printers, new_printers), + _L_ = 1 - success; + if(_L_) continue; + return _L_; + } + } + function exn_slot(x){return 0 === caml_obj_tag(x) ? x[1] : x;} + function exn_slot_id(x){var slot = exn_slot(x); return slot[2];} + function exn_slot_name(x){var slot = exn_slot(x); return slot[1];} + var errors = _m_.slice(); + function default_uncaught_exception_han(exn, raw_backtrace){ + var _I_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _n_, _I_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var status = runtime.caml_ml_debug_info_status(0); + if(status < 0){ + var + _J_ = caml_call1(Stdlib[18], status), + _K_ = caml_check_bound(errors, _J_)[1 + _J_]; + caml_call1(Stdlib[53], _K_); + } + return caml_call1(Stdlib[63], Stdlib[40]); + } + var uncaught_exception_handler = [0, default_uncaught_exception_han]; + function set_uncaught_exception_handler(fn){ + uncaught_exception_handler[1] = fn; + return 0; + } + var empty_backtrace = [0]; + function handle_uncaught_exception(exn$0, debugger_in_use){ + try{ + try{ + var + raw_backtrace = + debugger_in_use ? empty_backtrace : caml_get_exception_raw_backtra(0); + try{caml_call1(Stdlib[103], 0);}catch(_H_){} + try{ + var + _D_ = caml_call2(uncaught_exception_handler[1], exn$0, raw_backtrace), + _C_ = _D_; + } + catch(exn$1){ + var + exn = caml_wrap_exception(exn$1), + raw_backtrace$0 = caml_get_exception_raw_backtra(0), + _A_ = to_string(exn$0); + caml_call2(Stdlib_Printf[3], _o_, _A_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var _B_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _p_, _B_); + print_raw_backtrace(Stdlib[40], raw_backtrace$0); + var _C_ = caml_call1(Stdlib[63], Stdlib[40]); + } + var _E_ = _C_; + } + catch(_G_){ + var _z_ = caml_wrap_exception(_G_); + if(_z_ !== Stdlib[9]) throw caml_maybe_attach_backtrace(_z_, 0); + var _E_ = caml_call1(Stdlib[53], cst_Fatal_error_out_of_memory_); + } + return _E_; + } + catch(_F_){return 0;} + } + runtime.caml_register_named_value + ("Printexc.handle_uncaught_exception", handle_uncaught_exception); + function _q_(_y_){return runtime.caml_raw_backtrace_next_slot(_y_);} + function _r_(_x_){return runtime.caml_convert_raw_backtrace_slot(_x_);} + function _s_(_w_, _v_){return runtime.caml_raw_backtrace_slot(_w_, _v_);} + var + _t_ = + [0, + backtrace_slot_is_raise, + backtrace_slot_is_inline, + backtrace_slot_location, + backtrace_slot_defname, + format_backtrace_slot], + Stdlib_Printexc = + [0, + to_string, + to_string_default, + print, + catch$0, + print_backtrace, + get_backtrace, + runtime.caml_record_backtrace, + runtime.caml_backtrace_status, + register_printer, + use_printers, + raw_backtrace_entries, + function(_u_){return caml_get_exception_raw_backtra(_u_);}, + print_raw_backtrace, + raw_backtrace_to_string, + default_uncaught_exception_han, + set_uncaught_exception_handler, + backtrace_slots, + backtrace_slots_of_raw_entry, + _t_, + raw_backtrace_length, + _s_, + _r_, + _q_, + exn_slot_id, + exn_slot_name, + string_of_extension_constructo]; + runtime.caml_register_global(42, Stdlib_Printexc, "Stdlib__Printexc"); + return; + } + (globalThis)); + +//# 17098 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Digest_from_hex$1 = "Digest.from_hex", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_md5_string = runtime.caml_md5_string, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_String = global_data.Stdlib__String, + compare = Stdlib_String[9], + equal = Stdlib_String[8], + cst_Digest_from_hex$0 = cst_Digest_from_hex$1, + cst_Digest_from_hex = cst_Digest_from_hex$1, + cst_Digest_to_hex = "Digest.to_hex", + cst_Digest_substring = "Digest.substring"; + function string(str){ + return caml_md5_string(str, 0, caml_ml_string_length(str)); + } + function bytes(b){return string(caml_call1(Stdlib_Bytes[44], b));} + function substring(str, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(str) - len | 0) >= ofs) + return caml_md5_string(str, ofs, len); + return caml_call1(Stdlib[1], cst_Digest_substring); + } + function subbytes(b, ofs, len){ + return substring(caml_call1(Stdlib_Bytes[44], b), ofs, len); + } + function file(filename){ + var ic = caml_call1(Stdlib[80], filename); + try{var d = runtime.caml_md5_chan(ic, -1);} + catch(e$0){ + var e = caml_wrap_exception(e$0); + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(e, 0); + } + caml_call1(Stdlib[93], ic); + return d; + } + function output(chan, digest){return caml_call2(Stdlib[66], chan, digest);} + function input(chan){return caml_call2(Stdlib[86], chan, 16);} + function char_hex(n){var _e_ = 10 <= n ? 87 : 48; return n + _e_ | 0;} + function to_hex(d){ + if(16 !== caml_ml_string_length(d)) + caml_call1(Stdlib[1], cst_Digest_to_hex); + var result = caml_create_bytes(32), i = 0; + for(;;){ + var x = caml_string_get(d, i); + caml_bytes_unsafe_set(result, i * 2 | 0, char_hex(x >>> 4 | 0)); + caml_bytes_unsafe_set(result, (i * 2 | 0) + 1 | 0, char_hex(x & 15)); + var _d_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _d_; + } + } + function from_hex(s){ + if(32 !== caml_ml_string_length(s)) + caml_call1(Stdlib[1], cst_Digest_from_hex); + function digit(c){ + if(65 <= c){ + if(97 <= c){ + if(103 > c) return (c - 97 | 0) + 10 | 0; + } + else if(71 > c) return (c - 65 | 0) + 10 | 0; + } + else if(9 >= c - 48 >>> 0) return c - 48 | 0; + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Digest_from_hex$0], 1); + } + var result = caml_create_bytes(16), i = 0; + for(;;){ + var + i$0 = 2 * i | 0, + _a_ = digit(caml_string_get(s, i$0 + 1 | 0)), + _b_ = (digit(caml_string_get(s, i$0)) << 4) + _a_ | 0; + runtime.caml_bytes_set(result, i, caml_call1(Stdlib_Char[1], _b_)); + var _c_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _c_; + } + } + var + Stdlib_Digest = + [0, + compare, + equal, + string, + bytes, + substring, + subbytes, + file, + output, + input, + to_hex, + from_hex]; + runtime.caml_register_global(8, Stdlib_Digest, "Stdlib__Digest"); + return; + } + (globalThis)); + +//# 17219 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Bigarray_Array3_of_array_n$1 = + "Bigarray.Array3.of_array: non-cubic data", + caml_ba_change_layout = runtime.caml_ba_change_layout, + caml_ba_create = runtime.caml_ba_create, + caml_ba_dim_1 = runtime.caml_ba_dim_1, + caml_ba_dim_2 = runtime.caml_ba_dim_2, + caml_ba_kind = runtime.caml_ba_kind, + caml_ba_num_dims = runtime.caml_ba_num_dims, + caml_ba_reshape = runtime.caml_ba_reshape, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_ba_set_2 = runtime.caml_ba_set_2, + caml_ba_set_3 = runtime.caml_ba_set_3, + caml_ba_set_generic = runtime.caml_ba_set_generic, + caml_ba_slice = runtime.caml_ba_slice, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Bigarray_array3_of_genarra = "Bigarray.array3_of_genarray", + cst_Bigarray_array2_of_genarra = "Bigarray.array2_of_genarray", + cst_Bigarray_array1_of_genarra = "Bigarray.array1_of_genarray", + cst_Bigarray_array0_of_genarra = "Bigarray.array0_of_genarray", + cst_Bigarray_Array3_of_array_n = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array3_of_array_n$0 = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array2_of_array_n = + "Bigarray.Array2.of_array: non-rectangular data", + float32 = 0, + float64 = 1, + int8_signed = 2, + int8_unsigned = 3, + int16_signed = 4, + int16_unsigned = 5, + int32 = 6, + int64 = 7, + int$0 = 8, + nativeint = 9, + complex32 = 10, + complex64 = 11, + char$0 = 12; + function kind_size_in_bytes(param){ + switch(param){ + case 0: + return 4; + case 1: + return 8; + case 2: + return 1; + case 3: + return 1; + case 4: + return 2; + case 5: + return 2; + case 6: + return 4; + case 7: + return 8; + case 8: + return Stdlib_Sys[9] / 8 | 0; + case 9: + return Stdlib_Sys[9] / 8 | 0; + case 10: + return 8; + case 11: + return 16; + default: return 1; + } + } + var c_layout = 0, fortran_layout = 1; + function cloop(arr, idx, f, col, max){ + if(col === idx.length - 1) + return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _am_ = caml_check_bound(max, col)[1 + col] - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var j = _al_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + cloop(arr, idx, f, col + 1 | 0, max); + var _an_ = j + 1 | 0; + if(_am_ !== j){var j = _an_; continue;} + break; + } + } + return 0; + } + function floop(arr, idx, f, col, max){ + if(0 > col) return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _aj_ = caml_check_bound(max, col)[1 + col], _ai_ = 1; + if(_aj_ >= 1){ + var j = _ai_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + floop(arr, idx, f, col - 1 | 0, max); + var _ak_ = j + 1 | 0; + if(_aj_ !== j){var j = _ak_; continue;} + break; + } + } + return 0; + } + function init(kind, layout, dims, f){ + var arr = caml_ba_create(kind, layout, dims), dlen = dims.length - 1; + return layout + ? (floop + (arr, caml_make_vect(dlen, 1), f, dlen - 1 | 0, dims), + arr) + : (cloop(arr, caml_make_vect(dlen, 0), f, 0, dims), arr); + } + function dims(a){ + var + n = caml_ba_num_dims(a), + d = caml_make_vect(n, 0), + _af_ = n - 1 | 0, + _ae_ = 0; + if(_af_ >= 0){ + var i = _ae_; + for(;;){ + var _ag_ = runtime.caml_ba_dim(a, i); + caml_check_bound(d, i)[1 + i] = _ag_; + var _ah_ = i + 1 | 0; + if(_af_ !== i){var i = _ah_; continue;} + break; + } + } + return d; + } + function size_in_bytes(arr){ + var + _ac_ = dims(arr), + _ad_ = caml_call3(Stdlib_Array[15], caml_mul, 1, _ac_); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _ad_); + } + function create(kind, layout){return caml_ba_create(kind, layout, [0]);} + function get(arr){return runtime.caml_ba_get_generic(arr, [0]);} + function set(arr){ + var _aa_ = [0]; + return function(_ab_){return caml_ba_set_generic(arr, _aa_, _ab_);}; + } + function size_in_bytes$0(arr){ + return kind_size_in_bytes(caml_ba_kind(arr)); + } + function of_value(kind, layout, v){ + var a = create(kind, layout); + caml_call1(set(a), v); + return a; + } + function create$0(kind, layout, dim){ + return caml_ba_create(kind, layout, [0, dim]); + } + function size_in_bytes$1(arr){ + var _$_ = caml_ba_dim_1(arr); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _$_); + } + function slice(a, n){ + return runtime.caml_ba_layout(a) + ? caml_ba_slice(a, [0, n]) + : caml_ba_slice(a, [0, n]); + } + function init$0(kind, layout, dim, f){ + var arr = create$0(kind, layout, dim); + if(layout){ + var _Z_ = 1; + if(dim >= 1){ + var i$0 = _Z_; + for(;;){ + caml_ba_set_1(arr, i$0, caml_call1(f, i$0)); + var ___ = i$0 + 1 | 0; + if(dim !== i$0){var i$0 = ___; continue;} + break; + } + } + return arr; + } + var _X_ = dim - 1 | 0, _W_ = 0; + if(_X_ >= 0){ + var i = _W_; + for(;;){ + caml_ba_set_1(arr, i, caml_call1(f, i)); + var _Y_ = i + 1 | 0; + if(_X_ !== i){var i = _Y_; continue;} + break; + } + } + return arr; + } + function of_array(kind, layout, data){ + var + ba = create$0(kind, layout, data.length - 1), + ofs = layout ? 1 : 0, + _U_ = data.length - 1 - 1 | 0, + _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_ba_set_1(ba, i + ofs | 0, caml_check_bound(data, i)[1 + i]); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return ba; + } + function create$1(kind, layout, dim1, dim2){ + return caml_ba_create(kind, layout, [0, dim1, dim2]); + } + function size_in_bytes$2(arr){ + var _R_ = caml_ba_dim_2(arr), _S_ = caml_ba_dim_1(arr); + return caml_mul(caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _S_), _R_); + } + function slice_left(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right(a, n){return caml_ba_slice(a, [0, n]);} + function init$1(kind, layout, dim1, dim2, f){ + var arr = create$1(kind, layout, dim1, dim2); + if(layout){ + var _N_ = 1; + if(dim2 >= 1){ + var j$0 = _N_; + for(;;){ + var _O_ = 1; + if(dim1 >= 1){ + var i$0 = _O_; + for(;;){ + caml_ba_set_2(arr, i$0, j$0, caml_call2(f, i$0, j$0)); + var _Q_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _Q_; continue;} + break; + } + } + var _P_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _P_; continue;} + break; + } + } + return arr; + } + var _I_ = dim1 - 1 | 0, _H_ = 0; + if(_I_ >= 0){ + var i = _H_; + for(;;){ + var _K_ = dim2 - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var j = _J_; + for(;;){ + caml_ba_set_2(arr, i, j, caml_call2(f, i, j)); + var _M_ = j + 1 | 0; + if(_K_ !== j){var j = _M_; continue;} + break; + } + } + var _L_ = i + 1 | 0; + if(_I_ !== i){var i = _L_; continue;} + break; + } + } + return arr; + } + function of_array$0(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + ba = create$1(kind, layout, dim1, dim2), + ofs = layout ? 1 : 0, + _C_ = dim1 - 1 | 0, + _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array2_of_array_n); + var _E_ = dim2 - 1 | 0, _D_ = 0; + if(_E_ >= 0){ + var j = _D_; + for(;;){ + caml_ba_set_2 + (ba, i + ofs | 0, j + ofs | 0, caml_check_bound(row, j)[1 + j]); + var _G_ = j + 1 | 0; + if(_E_ !== j){var j = _G_; continue;} + break; + } + } + var _F_ = i + 1 | 0; + if(_C_ !== i){var i = _F_; continue;} + break; + } + } + return ba; + } + function create$2(kind, layout, dim1, dim2, dim3){ + return caml_ba_create(kind, layout, [0, dim1, dim2, dim3]); + } + function size_in_bytes$3(arr){ + var + _y_ = runtime.caml_ba_dim_3(arr), + _z_ = caml_ba_dim_2(arr), + _A_ = caml_ba_dim_1(arr); + return caml_mul + (caml_mul + (caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _A_), _z_), + _y_); + } + function slice_left_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_right_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_left_2(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right_2(a, n){return caml_ba_slice(a, [0, n]);} + function init$2(kind, layout, dim1, dim2, dim3, f){ + var arr = create$2(kind, layout, dim1, dim2, dim3); + if(layout){ + var _s_ = 1; + if(dim3 >= 1){ + var k$0 = _s_; + for(;;){ + var _t_ = 1; + if(dim2 >= 1){ + var j$0 = _t_; + for(;;){ + var _v_ = 1; + if(dim1 >= 1){ + var i$0 = _v_; + for(;;){ + caml_ba_set_3(arr, i$0, j$0, k$0, caml_call3(f, i$0, j$0, k$0)); + var _x_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _x_; continue;} + break; + } + } + var _w_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _w_; continue;} + break; + } + } + var _u_ = k$0 + 1 | 0; + if(dim3 !== k$0){var k$0 = _u_; continue;} + break; + } + } + return arr; + } + var _k_ = dim1 - 1 | 0, _j_ = 0; + if(_k_ >= 0){ + var i = _j_; + for(;;){ + var _m_ = dim2 - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var j = _l_; + for(;;){ + var _p_ = dim3 - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var k = _o_; + for(;;){ + caml_ba_set_3(arr, i, j, k, caml_call3(f, i, j, k)); + var _r_ = k + 1 | 0; + if(_p_ !== k){var k = _r_; continue;} + break; + } + } + var _q_ = j + 1 | 0; + if(_m_ !== j){var j = _q_; continue;} + break; + } + } + var _n_ = i + 1 | 0; + if(_k_ !== i){var i = _n_; continue;} + break; + } + } + return arr; + } + function of_array$1(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + dim3 = + 0 === dim2 + ? 0 + : caml_check_bound(caml_check_bound(data, 0)[1], 0)[1].length - 1, + ba = create$2(kind, layout, dim1, dim2, dim3), + ofs = layout ? 1 : 0, + _b_ = dim1 - 1 | 0, + _a_ = 0; + if(_b_ >= 0){ + var i = _a_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n); + var _d_ = dim2 - 1 | 0, _c_ = 0; + if(_d_ >= 0){ + var j = _c_; + for(;;){ + var col = caml_check_bound(row, j)[1 + j]; + if(col.length - 1 !== dim3) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n$0); + var _g_ = dim3 - 1 | 0, _f_ = 0; + if(_g_ >= 0){ + var k = _f_; + for(;;){ + caml_ba_set_3 + (ba, + i + ofs | 0, + j + ofs | 0, + k + ofs | 0, + caml_check_bound(col, k)[1 + k]); + var _i_ = k + 1 | 0; + if(_g_ !== k){var k = _i_; continue;} + break; + } + } + var _h_ = j + 1 | 0; + if(_d_ !== j){var j = _h_; continue;} + break; + } + } + var _e_ = i + 1 | 0; + if(_b_ !== i){var i = _e_; continue;} + break; + } + } + return ba; + } + function array0_of_genarray(a){ + return 0 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array0_of_genarra); + } + function array1_of_genarray(a){ + return 1 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array1_of_genarra); + } + function array2_of_genarray(a){ + return 2 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array2_of_genarra); + } + function array3_of_genarray(a){ + return 3 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array3_of_genarra); + } + function reshape_0(a){return caml_ba_reshape(a, [0]);} + function reshape_1(a, dim1){return caml_ba_reshape(a, [0, dim1]);} + function reshape_2(a, dim1, dim2){ + return caml_ba_reshape(a, [0, dim1, dim2]); + } + function reshape_3(a, dim1, dim2, dim3){ + return caml_ba_reshape(a, [0, dim1, dim2, dim3]); + } + var + Stdlib_Bigarray = + [0, + float32, + float64, + complex32, + complex64, + int8_signed, + int8_unsigned, + int16_signed, + int16_unsigned, + int$0, + int32, + int64, + nativeint, + char$0, + kind_size_in_bytes, + c_layout, + fortran_layout, + [0, init, dims, size_in_bytes], + [0, + create, + of_value, + caml_ba_change_layout, + size_in_bytes$0, + get, + set, + of_value], + [0, + create$0, + init$0, + caml_ba_change_layout, + size_in_bytes$1, + slice, + of_array], + [0, + create$1, + init$1, + caml_ba_change_layout, + size_in_bytes$2, + slice_left, + slice_right, + of_array$0], + [0, + create$2, + init$2, + caml_ba_change_layout, + size_in_bytes$3, + slice_left_1, + slice_right_1, + slice_left_2, + slice_right_2, + of_array$1], + array0_of_genarray, + array1_of_genarray, + array2_of_genarray, + array3_of_genarray, + caml_ba_reshape, + reshape_0, + reshape_1, + reshape_2, + reshape_3]; + runtime.caml_register_global(10, Stdlib_Bigarray, "Stdlib__Bigarray"); + return; + } + (globalThis)); + +//# 17760 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_ba_blit = runtime.caml_ba_blit, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_bytes_set = runtime.caml_bytes_set, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessequal = runtime.caml_lessequal, + caml_lxm_next = runtime.caml_lxm_next, + caml_mod = runtime.caml_mod, + caml_notequal = runtime.caml_notequal, + caml_sys_random_seed = runtime.caml_sys_random_seed; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib = global_data.Stdlib, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Digest = global_data.Stdlib__Digest, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Bigarray = global_data.Stdlib__Bigarray, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + _j_ = runtime.caml_int64_create_lo_mi_hi(14371852, 15349651, 22696), + _k_ = runtime.caml_int64_create_lo_mi_hi(12230193, 11438743, 35013), + _l_ = runtime.caml_int64_create_lo_mi_hi(1424933, 15549263, 2083), + _m_ = runtime.caml_int64_create_lo_mi_hi(9492471, 4696708, 43520), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_Random_int64 = "Random.int64", + cst_Random_int32 = "Random.int32", + cst_Random_full_int = "Random.full_int", + cst_Random_int = "Random.int", + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0); + function create(param){return caml_call3(Stdlib_Bigarray[19][1], 7, 0, 4);} + function set(s, i1, i2, i3, i4){ + caml_ba_set_1(s, 0, runtime.caml_int64_or(i1, _a_)); + caml_ba_set_1(s, 1, i2); + var i3$0 = caml_notequal(i3, _b_) ? i3 : _e_; + caml_ba_set_1(s, 2, i3$0); + var i4$0 = caml_notequal(i4, _c_) ? i4 : _d_; + return caml_ba_set_1(s, 3, i4$0); + } + function mk(i1, i2, i3, i4){ + var s = create(0); + set(s, i1, i2, i3, i4); + return s; + } + function copy(s){var s$0 = create(0); caml_ba_blit(s, s$0); return s$0;} + function reinit(s, seed){ + var + n = seed.length - 1, + b = runtime.caml_create_bytes((n * 8 | 0) + 1 | 0), + _p_ = n - 1 | 0, + _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var _t_ = caml_int64_of_int32(runtime.caml_check_bound(seed, i)[1 + i]); + caml_call3(Stdlib_Bytes[86], b, i * 8 | 0, _t_); + var _u_ = i + 1 | 0; + if(_p_ !== i){var i = _u_; continue;} + break; + } + } + caml_bytes_set(b, n * 8 | 0, 1); + var d1 = caml_call1(Stdlib_Digest[4], b); + caml_bytes_set(b, n * 8 | 0, 2); + var + d2 = caml_call1(Stdlib_Digest[4], b), + _q_ = caml_call2(Stdlib_String[64], d2, 8), + _r_ = caml_call2(Stdlib_String[64], d2, 0), + _s_ = caml_call2(Stdlib_String[64], d1, 8); + return set(s, caml_call2(Stdlib_String[64], d1, 0), _s_, _r_, _q_); + } + function make(seed){var s = create(0); reinit(s, seed); return s;} + function make_self_init(param){return make(caml_sys_random_seed(0));} + function bits(s){ + return caml_int64_to_int32(caml_lxm_next(s)) & 1073741823; + } + function intaux(s, n){ + for(;;){ + var r = bits(s), v = caml_mod(r, n); + if(((1073741823 - n | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function int$0(s, bound){ + if(1073741823 >= bound && 0 < bound) return intaux(s, bound); + return caml_call1(Stdlib[1], cst_Random_int); + } + function full_int(s, bound){ + if(0 >= bound) return caml_call1(Stdlib[1], cst_Random_full_int); + if(1073741823 >= bound) return intaux(s, bound); + for(;;){ + var + _n_ = Stdlib[19], + r = caml_int64_to_int32(caml_lxm_next(s)) & _n_, + v = caml_mod(r, bound); + if(((Stdlib[19] - bound | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function bits32(s){return caml_int64_to_int32(caml_lxm_next(s));} + function int32(s, bound){ + if(caml_lessequal(bound, 0)) + return caml_call1(Stdlib[1], cst_Random_int32); + for(;;){ + var r = bits32(s) >>> 1 | 0, v = caml_mod(r, bound); + if(caml_greaterthan(r - v | 0, (Stdlib_Int32[9] - bound | 0) + 1 | 0)) + continue; + return v; + } + } + var bits64 = caml_lxm_next; + function int64(s, bound){ + if(caml_lessequal(bound, _g_)) + return caml_call1(Stdlib[1], cst_Random_int64); + for(;;){ + var + r = caml_int64_shift_right_unsigne(caml_lxm_next(s), 1), + v = runtime.caml_int64_mod(r, bound); + if + (caml_greaterthan + (caml_int64_sub(r, v), + runtime.caml_int64_add(caml_int64_sub(Stdlib_Int64[9], bound), _f_))) + continue; + return v; + } + } + var + nativebits = + 32 === Stdlib_Nativeint[9] + ? function(s){return bits32(s);} + : function(s){return caml_int64_to_int32(caml_lxm_next(s));}, + nativeint = + 32 === Stdlib_Nativeint[9] + ? function(s, bound){return int32(s, bound);} + : function + (s, bound){ + return caml_int64_to_int32(int64(s, caml_int64_of_int32(bound))); + }; + function float$0(s, bound){ + for(;;){ + var b = caml_lxm_next(s), n = caml_int64_shift_right_unsigne(b, 11); + if(caml_notequal(n, _h_)) + return runtime.caml_int64_to_float(n) * 1.1102230246251565e-16 * bound; + } + } + function bool(s){return runtime.caml_lessthan(caml_lxm_next(s), _i_);} + function split(s){ + var + i1 = caml_lxm_next(s), + i2 = caml_lxm_next(s), + i3 = caml_lxm_next(s), + i4 = caml_lxm_next(s); + return mk(i1, i2, i3, i4); + } + function mk_default(param){return mk(_m_, _l_, _k_, _j_);} + var random_key = caml_call2(Stdlib_Domain[10][1], [0, split], mk_default); + function bits$0(param){ + return bits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function int$1(bound){ + return int$0(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function full_int$0(bound){ + return full_int(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int32$0(bound){ + return int32(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function nativeint$0(bound){ + return nativeint(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int64$0(bound){ + return int64(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function float$1(scale){ + return float$0(caml_call1(Stdlib_Domain[10][2], random_key), scale); + } + function bool$0(param){ + return bool(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits32$0(param){ + return bits32(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits64$0(param){ + return caml_lxm_next(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function nativebits$0(param){ + return nativebits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function full_init(seed){ + return reinit(caml_call1(Stdlib_Domain[10][2], random_key), seed); + } + function init(seed){return full_init([0, seed]);} + function self_init(param){return full_init(caml_sys_random_seed(0));} + function split$0(param){ + return split(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function get_state(param){ + return copy(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function set_state(s){ + return caml_ba_blit(s, caml_call1(Stdlib_Domain[10][2], random_key)); + } + var + Stdlib_Random = + [0, + init, + full_init, + self_init, + bits$0, + int$1, + full_int$0, + int32$0, + nativeint$0, + int64$0, + float$1, + bool$0, + bits32$0, + bits64$0, + nativebits$0, + [0, + make, + make_self_init, + copy, + bits, + int$0, + full_int, + int32, + nativeint, + int64, + float$0, + bool, + bits32, + bits64, + nativebits, + split], + get_state, + set_state, + split$0]; + runtime.caml_register_global(29, Stdlib_Random, "Stdlib__Random"); + return; + } + (globalThis)); + +//# 18037 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_compare = runtime.caml_compare, + caml_hash = runtime.caml_hash, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array; + global_data.Assert_failure; + var + Stdlib_String = global_data.Stdlib__String, + cst_Hashtbl_unsupported_hash_t = "Hashtbl: unsupported hash table format", + _d_ = [0, 0]; + function ongoing_traversal(h){ + var _aB_ = h.length - 1 < 4 ? 1 : 0, _aC_ = _aB_ || (h[4] < 0 ? 1 : 0); + return _aC_; + } + function flip_ongoing_traversal(h){h[4] = - h[4] | 0; return 0;} + try{var _f_ = caml_sys_getenv("OCAMLRUNPARAM"), params = _f_;} + catch(_az_){ + var _a_ = caml_wrap_exception(_az_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + try{var _e_ = caml_sys_getenv("CAMLRUNPARAM"), _c_ = _e_;} + catch(_aA_){ + var _b_ = caml_wrap_exception(_aA_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var _c_ = cst; + } + var params = _c_; + } + var + randomized_default = caml_call2(Stdlib_String[14], params, 82), + randomized = caml_call1(Stdlib_Atomic[1], randomized_default); + function randomize(param){ + return caml_call2(Stdlib_Atomic[3], randomized, 1); + } + function is_randomized(param){ + return caml_call1(Stdlib_Atomic[2], randomized); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function power_2_above(x, n){ + var x$0 = x; + for(;;){ + if(n <= x$0) return x$0; + if(Stdlib_Sys[13] < (x$0 * 2 | 0)) return x$0; + var x$1 = x$0 * 2 | 0, x$0 = x$1; + } + } + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, initial_size); + if(random) + var + _ay_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _ay_); + else + var seed = 0; + return [0, 0, caml_make_vect(s, 0), seed, s]; + } + function clear(h){ + var _ax_ = 0 < h[1] ? 1 : 0; + return _ax_ + ? (h + [1] + = 0, + caml_call4(Stdlib_Array[7], h[2], 0, h[2].length - 1, 0)) + : _ax_; + } + function reset(h){ + var len = h[2].length - 1; + if(4 <= h.length - 1 && len !== caml_call1(Stdlib[18], h[4])){ + h[1] = 0; + h[2] = caml_make_vect(caml_call1(Stdlib[18], h[4]), 0); + return 0; + } + return clear(h); + } + function copy_bucketlist(param){ + if(! param) return 0; + var + key = param[1], + data = param[2], + next = param[3], + prec$1 = [0, key, data, next], + prec = prec$1, + param$0 = next; + for(;;){ + if(! param$0) return prec$1; + var + key$0 = param$0[1], + data$0 = param$0[2], + next$0 = param$0[3], + prec$0 = [0, key$0, data$0, next$0]; + prec[3] = prec$0; + var prec = prec$0, param$0 = next$0; + } + } + function copy(h){ + var + _au_ = h[4], + _av_ = h[3], + _aw_ = caml_call2(Stdlib_Array[13], copy_bucketlist, h[2]); + return [0, h[1], _aw_, _av_, _au_]; + } + function length(h){return h[1];} + function insert_all_buckets(indexfun, inplace, odata, ndata){ + var + nsize = ndata.length - 1, + ndata_tail = caml_make_vect(nsize, 0), + _ao_ = odata.length - 1 - 1 | 0, + _an_ = 0; + if(_ao_ >= 0){ + var i$0 = _an_; + a: + for(;;){ + var cell$1 = caml_check_bound(odata, i$0)[1 + i$0], cell = cell$1; + for(;;){ + if(cell){ + var + key = cell[1], + data = cell[2], + next = cell[3], + cell$0 = inplace ? cell : [0, key, data, 0], + nidx = caml_call1(indexfun, key), + match = caml_check_bound(ndata_tail, nidx)[1 + nidx]; + if(match) + match[3] = cell$0; + else + caml_check_bound(ndata, nidx)[1 + nidx] = cell$0; + caml_check_bound(ndata_tail, nidx)[1 + nidx] = cell$0; + var cell = next; + continue; + } + var _at_ = i$0 + 1 | 0; + if(_ao_ !== i$0){var i$0 = _at_; continue a;} + break; + } + break; + } + } + if(inplace){ + var _aq_ = nsize - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + var match$0 = caml_check_bound(ndata_tail, i)[1 + i]; + if(match$0) match$0[3] = 0; + var _as_ = i + 1 | 0; + if(_aq_ !== i){var i = _as_; continue;} + break; + } + } + var _ar_ = 0; + } + else + var _ar_ = inplace; + return _ar_; + } + function resize(indexfun, h){ + var + odata = h[2], + osize = odata.length - 1, + nsize = osize * 2 | 0, + _am_ = nsize < Stdlib_Sys[13] ? 1 : 0; + if(! _am_) return _am_; + var ndata = caml_make_vect(nsize, 0), inplace = 1 - ongoing_traversal(h); + h[2] = ndata; + return insert_all_buckets(caml_call1(indexfun, h), inplace, odata, ndata); + } + function iter(f, h){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], _ai_ = d.length - 1 - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + a: + for(;;){ + var param = caml_check_bound(d, i)[1 + i]; + for(;;){ + if(param){ + var key = param[1], data = param[2], next = param[3]; + caml_call2(f, key, data); + var param = next; + continue; + } + var _al_ = i + 1 | 0; + if(_ai_ !== i){var i = _al_; continue a;} + break; + } + break; + } + } + var _aj_ = 1 - old_trav, _ak_ = _aj_ ? flip_ongoing_traversal(h) : _aj_; + return _ak_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function filter_map_inplace(f, h){ + var d = h[2], old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var _ad_ = d.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + a: + for(;;){ + var slot$0 = caml_check_bound(h[2], i)[1 + i], prec = 0, slot = slot$0; + for(;;){ + if(slot){ + var + key = slot[1], + data = slot[2], + next = slot[3], + match = caml_call2(f, key, data); + if(! match){h[1] = h[1] - 1 | 0; var slot = next; continue;} + var data$0 = match[1]; + if(prec) + prec[3] = slot; + else + caml_check_bound(h[2], i)[1 + i] = slot; + slot[2] = data$0; + var prec = slot, slot = next; + continue; + } + if(prec) prec[3] = 0; else caml_check_bound(h[2], i)[1 + i] = 0; + var _ag_ = i + 1 | 0; + if(_ad_ !== i){var i = _ag_; continue a;} + break; + } + break; + } + } + var _ae_ = 1 - old_trav, _af_ = _ae_ ? flip_ongoing_traversal(h) : _ae_; + return _af_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function fold(f, h, init){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], accu$1 = [0, init], _$_ = d.length - 1 - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i = ___; + a: + for(;;){ + var + accu$2 = accu$1[1], + b$0 = caml_check_bound(d, i)[1 + i], + b = b$0, + accu = accu$2; + for(;;){ + if(b){ + var + key = b[1], + data = b[2], + next = b[3], + accu$0 = caml_call3(f, key, data, accu), + b = next, + accu = accu$0; + continue; + } + accu$1[1] = accu; + var _ab_ = i + 1 | 0; + if(_$_ !== i){var i = _ab_; continue a;} + break; + } + break; + } + } + if(1 - old_trav) flip_ongoing_traversal(h); + var _aa_ = accu$1[1]; + return _aa_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + next = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = next; + } + } + function stats(h){ + var _U_ = h[2], _V_ = 0; + function _W_(m, b){ + var _Z_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _Z_); + } + var + mbl = caml_call3(Stdlib_Array[15], _W_, _V_, _U_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _X_ = h[2]; + function _Y_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _Y_, _X_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function to_seq(tbl){ + var tbl_data = tbl[2]; + function aux(i, buck, param){ + var i$0 = i, buck$0 = buck; + for(;;){ + if(buck$0){ + var key = buck$0[1], data = buck$0[2], next = buck$0[3]; + return [0, [0, key, data], function(_T_){return aux(i$0, next, _T_);}]; + } + if(i$0 === tbl_data.length - 1) return 0; + var + buck$1 = caml_check_bound(tbl_data, i$0)[1 + i$0], + i$1 = i$0 + 1 | 0, + i$0 = i$1, + buck$0 = buck$1; + } + } + var _Q_ = 0, _R_ = 0; + return function(_S_){return aux(_R_, _Q_, _S_);}; + } + function to_seq_keys(m){ + var _N_ = to_seq(m); + function _O_(_P_){return _P_[1];} + return caml_call2(Stdlib_Seq[27], _O_, _N_); + } + function to_seq_values(m){ + var _K_ = to_seq(m); + function _L_(_M_){return _M_[2];} + return caml_call2(Stdlib_Seq[27], _L_, _K_); + } + function MakeSeeded(H){ + function key_index(h, key){ + var _J_ = h[2].length - 1 - 1 | 0; + return caml_call2(H[2], h[3], key) & _J_; + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _I_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _I_ ? resize(key_index, h) : _I_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(caml_call2(H[1], k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var + _H_ = key_index(h, key), + match = caml_check_bound(h[2], _H_)[1 + _H_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var + _G_ = key_index(h, key), + match = caml_check_bound(h[2], _G_)[1 + _G_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], d = param$0[2], next = param$0[3]; + if(caml_call2(H[1], k, key)) return [0, d, find_in_bucket(next)]; + var param$0 = next; + } + } + var _F_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _F_)[1 + _F_]); + } + function replace(h, key, data){ + var + i = key_index(h, key), + l = caml_check_bound(h[2], i)[1 + i], + slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(! caml_call2(H[1], k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _C_ = 0; + } + else + var _C_ = 1; + if(_C_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _D_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_D_) return resize(key_index, h); + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function mem(h, key){ + var + _B_ = key_index(h, key), + param = caml_check_bound(h[2], _B_)[1 + _B_]; + for(;;){ + if(! param) return 0; + var k = param[1], next = param[3], _A_ = caml_call2(H[1], k, key); + if(_A_) return _A_; + var param = next; + } + } + function add_seq(tbl, i){ + function _z_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _z_, i); + } + function replace_seq(tbl, i){ + function _y_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _y_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + iter = include[12], + filter_map_inplace = include[13], + fold = include[14], + length = include[15], + stats = include[16], + to_seq = include[17], + to_seq_keys = include[18], + to_seq_values = include[19], + add_seq = include[20], + replace_seq = include[21], + _x_ = include[1]; + function create(sz){return caml_call2(_x_, _d_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function hash(x){return caml_hash(10, 100, 0, x);} + function hash_param(n1, n2, x){return caml_hash(n1, n2, 0, x);} + function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);} + function key_index(h, key){ + return 4 <= h.length - 1 + ? caml_hash(10, 100, h[3], key) & (h[2].length - 1 - 1 | 0) + : caml_call1(Stdlib[1], cst_Hashtbl_unsupported_hash_t); + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _w_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _w_ ? resize(key_index, h) : _w_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(0 === caml_compare(k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var _v_ = key_index(h, key), match = caml_check_bound(h[2], _v_)[1 + _v_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var _u_ = key_index(h, key), match = caml_check_bound(h[2], _u_)[1 + _u_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], data = param$0[2], next = param$0[3]; + if(0 === caml_compare(k, key)) return [0, data, find_in_bucket(next)]; + var param$0 = next; + } + } + var _t_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _t_)[1 + _t_]); + } + function replace(h, key, data){ + var i = key_index(h, key), l = caml_check_bound(h[2], i)[1 + i], slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(0 !== caml_compare(k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _q_ = 0; + } + else + var _q_ = 1; + if(_q_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _r_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_r_) return resize(key_index, h); + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function mem(h, key){ + var _p_ = key_index(h, key), param = caml_check_bound(h[2], _p_)[1 + _p_]; + for(;;){ + if(! param) return 0; + var + k = param[1], + next = param[3], + _o_ = 0 === caml_compare(k, key) ? 1 : 0; + if(_o_) return _o_; + var param = next; + } + } + function add_seq(tbl, i){ + function _n_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _n_, i); + } + function replace_seq(tbl, i){ + function _m_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _m_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + function rebuild(opt, h){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, h[2].length - 1); + if(random) + var + _g_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _g_); + else + var seed = 4 <= h.length - 1 ? h[3] : 0; + var + _h_ = 4 <= h.length - 1 ? h[4] : s, + h$0 = [0, h[1], caml_make_vect(s, 0), seed, _h_], + _i_ = h$0[2], + _j_ = h[2], + _k_ = 0; + insert_all_buckets + (function(_l_){return key_index(h$0, _l_);}, _k_, _j_, _i_); + return h$0; + } + var + Stdlib_Hashtbl = + [0, + create, + clear, + reset, + copy, + add, + find, + find_opt, + find_all, + mem, + remove, + replace, + iter, + filter_map_inplace, + fold, + length, + randomize, + is_randomized, + rebuild, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq, + Make, + MakeSeeded, + hash, + seeded_hash, + hash_param, + caml_hash]; + runtime.caml_register_global(16, Stdlib_Hashtbl, "Stdlib__Hashtbl"); + return; + } + (globalThis)); + +//# 19349 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$16 = "", + cst$15 = ">", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$14 = ".", + cst$11 = cst$15, + cst$12 = "<\/", + cst$13 = cst$16, + cst$8 = cst$15, + cst$9 = "<", + cst$10 = cst$16, + cst$7 = "\n", + cst$3 = cst$16, + cst$4 = cst$16, + cst$5 = cst$16, + cst$6 = cst$16, + cst = cst$16, + cst$0 = cst$16, + cst$1 = cst$16, + cst$2 = cst$16, + Stdlib_Queue = global_data.Stdlib__Queue, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _f_ = [3, 0, 3], + cst_Format_pp_set_geometry = "Format.pp_set_geometry: ", + _e_ = [1, "max_indent < 2"], + _c_ = [1, "margin <= max_indent"], + _d_ = [0, 0], + _b_ = [0, cst$16], + _a_ = [0, cst$16, 0, cst$16], + cst_Stdlib_Format_String_tag = "Stdlib.Format.String_tag"; + function id(x){return x;} + var + String_tag = + [248, cst_Stdlib_Format_String_tag, runtime.caml_fresh_oo_id(0)], + zero = 0, + unknown = -1; + function pp_enqueue(state, token){ + state[13] = state[13] + token[3] | 0; + return caml_call2(Stdlib_Queue[3], token, state[28]); + } + var pp_infinity = 1000000010; + function pp_output_string(state, s){ + return caml_call3(state[17], s, 0, caml_ml_string_length(s)); + } + function pp_output_newline(state){return caml_call1(state[19], 0);} + function format_pp_text(state, size, text){ + state[9] = state[9] - size | 0; + pp_output_string(state, text); + state[11] = 0; + return 0; + } + function format_string(state, s){ + var _bQ_ = runtime.caml_string_notequal(s, cst$16); + return _bQ_ ? format_pp_text(state, caml_ml_string_length(s), s) : _bQ_; + } + function break_new_line(state, param, width){ + var after = param[3], offset = param[2], before = param[1]; + format_string(state, before); + pp_output_newline(state); + state[11] = 1; + var + indent = (state[6] - width | 0) + offset | 0, + real_indent = caml_call2(Stdlib_Int[10], state[8], indent); + state[10] = real_indent; + state[9] = state[6] - state[10] | 0; + var n = state[10]; + caml_call1(state[21], n); + return format_string(state, after); + } + function break_line(state, width){ + return break_new_line(state, _a_, width); + } + function break_same_line(state, param){ + var after = param[3], width = param[2], before = param[1]; + format_string(state, before); + state[9] = state[9] - width | 0; + caml_call1(state[20], width); + return format_string(state, after); + } + function format_pp_token(state, size$0, param){ + if(typeof param === "number") + switch(param){ + case 0: + var match$3 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$3) return 0; + var + tabs = match$3[1][1], + add_tab = + function(n, ls){ + if(! ls) return [0, n, 0]; + var l = ls[2], x = ls[1]; + return runtime.caml_lessthan(n, x) + ? [0, n, ls] + : [0, x, add_tab(n, l)]; + }; + tabs[1] = add_tab(state[6] - state[9] | 0, tabs[1]); + return 0; + case 1: + caml_call1(Stdlib_Stack[5], state[2]); return 0; + case 2: + caml_call1(Stdlib_Stack[5], state[3]); return 0; + case 3: + var match$4 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$4) return pp_output_newline(state); + var width$0 = match$4[1][2]; + return break_line(state, width$0); + case 4: + var _bO_ = state[10] !== (state[6] - state[9] | 0) ? 1 : 0; + if(! _bO_) return _bO_; + var match$1 = caml_call1(Stdlib_Queue[6], state[28]); + if(! match$1) return 0; + var match$2 = match$1[1], size = match$2[1], length = match$2[3]; + state[12] = state[12] - length | 0; + state[9] = state[9] + size | 0; + return 0; + default: + var match$5 = caml_call1(Stdlib_Stack[5], state[5]); + if(! match$5) return 0; + var tag_name = match$5[1], marker = caml_call1(state[25], tag_name); + return pp_output_string(state, marker); + } + switch(param[0]){ + case 0: + var s = param[1]; return format_pp_text(state, size$0, s); + case 1: + var + breaks = param[2], + fits = param[1], + off = breaks[2], + before = breaks[1], + match$6 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$6) return 0; + var + match$7 = match$6[1], + width$1 = match$7[2], + box_type$0 = match$7[1]; + switch(box_type$0){ + case 0: + return break_same_line(state, fits); + case 1: + return break_new_line(state, breaks, width$1); + case 2: + return break_new_line(state, breaks, width$1); + case 3: + return state[9] < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + case 4: + return state[11] + ? break_same_line(state, fits) + : state + [9] + < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : ((state + [6] + - width$1 + | 0) + + off + | 0) + < state[10] + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + default: return break_same_line(state, fits); + } + case 2: + var + off$0 = param[2], + n = param[1], + insertion_point = state[6] - state[9] | 0, + match$8 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$8) return 0; + var tabs$0 = match$8[1][1], match$9 = tabs$0[1]; + if(match$9){ + var first = match$9[1], param$0 = tabs$0[1]; + for(;;){ + if(param$0){ + var tail = param$0[2], head = param$0[1]; + if(insertion_point > head){var param$0 = tail; continue;} + var _bP_ = head; + } + else + var _bP_ = first; + var tab = _bP_; + break; + } + } + else + var tab = insertion_point; + var offset = tab - insertion_point | 0; + return 0 <= offset + ? break_same_line(state, [0, cst$0, offset + n | 0, cst]) + : break_new_line + (state, [0, cst$2, tab + off$0 | 0, cst$1], state[6]); + case 3: + var + ty = param[2], + off$1 = param[1], + insertion_point$0 = state[6] - state[9] | 0; + if(state[8] < insertion_point$0){ + var match = caml_call1(Stdlib_Stack[7], state[2]); + if(match){ + var match$0 = match[1], width = match$0[2], box_type = match$0[1]; + if(state[9] < width && 3 >= box_type - 1 >>> 0) + break_line(state, width); + } + else + pp_output_newline(state); + } + var + width$2 = state[9] - off$1 | 0, + box_type$1 = 1 === ty ? 1 : state[9] < size$0 ? ty : 5; + return caml_call2(Stdlib_Stack[3], [0, box_type$1, width$2], state[2]); + case 4: + var tbox = param[1]; + return caml_call2(Stdlib_Stack[3], tbox, state[3]); + default: + var + tag_name$0 = param[1], + marker$0 = caml_call1(state[24], tag_name$0); + pp_output_string(state, marker$0); + return caml_call2(Stdlib_Stack[3], tag_name$0, state[5]); + } + } + function advance_left(state){ + for(;;){ + var match = caml_call1(Stdlib_Queue[9], state[28]); + if(! match) return 0; + var + match$0 = match[1], + size = match$0[1], + length = match$0[3], + token = match$0[2], + pending_count = state[13] - state[12] | 0, + _bM_ = 0 <= size ? 1 : 0, + _bN_ = _bM_ || (state[9] <= pending_count ? 1 : 0); + if(! _bN_) return _bN_; + caml_call1(Stdlib_Queue[5], state[28]); + var size$0 = 0 <= size ? size : pp_infinity; + format_pp_token(state, size$0, token); + state[12] = length + state[12] | 0; + } + } + function enqueue_advance(state, tok){ + pp_enqueue(state, tok); + return advance_left(state); + } + function enqueue_string_as(state, size, s){ + return enqueue_advance(state, [0, size, [0, s], size]); + } + function initialize_scan_stack(stack){ + caml_call1(Stdlib_Stack[8], stack); + var queue_elem = [0, unknown, _b_, 0]; + return caml_call2(Stdlib_Stack[3], [0, -1, queue_elem], stack); + } + function set_size(state, ty){ + var match = caml_call1(Stdlib_Stack[7], state[1]); + if(! match) return 0; + var + match$0 = match[1], + queue_elem = match$0[2], + left_total = match$0[1], + size = queue_elem[1]; + if(left_total < state[12]) return initialize_scan_stack(state[1]); + var _bI_ = queue_elem[2]; + if(typeof _bI_ !== "number") + switch(_bI_[0]){ + case 3: + var + _bK_ = 1 - ty, + _bL_ = + _bK_ + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : _bK_; + return _bL_; + case 1: + case 2: + var + _bJ_ = + ty + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : ty; + return _bJ_; + } + return 0; + } + function scan_push(state, b, token){ + pp_enqueue(state, token); + if(b) set_size(state, 1); + var elem = [0, state[13], token]; + return caml_call2(Stdlib_Stack[3], elem, state[1]); + } + function pp_open_box_gen(state, indent, br_ty){ + state[14] = state[14] + 1 | 0; + if(state[14] < state[15]){ + var size = - state[13] | 0, elem = [0, size, [3, indent, br_ty], 0]; + return scan_push(state, 0, elem); + } + var _bH_ = state[14] === state[15] ? 1 : 0; + if(! _bH_) return _bH_; + var s = state[16]; + return enqueue_string_as(state, caml_ml_string_length(s), s); + } + function pp_close_box(state, param){ + var _bF_ = 1 < state[14] ? 1 : 0; + if(_bF_){ + if(state[14] < state[15]){ + pp_enqueue(state, [0, zero, 1, 0]); + set_size(state, 1); + set_size(state, 0); + } + state[14] = state[14] - 1 | 0; + var _bG_ = 0; + } + else + var _bG_ = _bF_; + return _bG_; + } + function pp_open_stag(state, tag_name){ + if(state[22]){ + caml_call2(Stdlib_Stack[3], tag_name, state[4]); + caml_call1(state[26], tag_name); + } + var _bE_ = state[23]; + if(! _bE_) return _bE_; + var token = [5, tag_name]; + return pp_enqueue(state, [0, zero, token, 0]); + } + function pp_close_stag(state, param){ + if(state[23]) pp_enqueue(state, [0, zero, 5, 0]); + var _bC_ = state[22]; + if(_bC_){ + var match = caml_call1(Stdlib_Stack[5], state[4]); + if(match){ + var tag_name = match[1]; + return caml_call1(state[27], tag_name); + } + var _bD_ = 0; + } + else + var _bD_ = _bC_; + return _bD_; + } + function pp_set_print_tags(state, b){state[22] = b; return 0;} + function pp_set_mark_tags(state, b){state[23] = b; return 0;} + function pp_get_print_tags(state, param){return state[22];} + function pp_get_mark_tags(state, param){return state[23];} + function pp_set_tags(state, b){ + pp_set_print_tags(state, b); + return pp_set_mark_tags(state, b); + } + function pp_get_formatter_stag_function(state, param){ + return [0, state[24], state[25], state[26], state[27]]; + } + function pp_set_formatter_stag_function(state, param){ + var pct = param[4], pot = param[3], mct = param[2], mot = param[1]; + state[24] = mot; + state[25] = mct; + state[26] = pot; + state[27] = pct; + return 0; + } + function pp_rinit(state){ + state[12] = 1; + state[13] = 1; + caml_call1(Stdlib_Queue[11], state[28]); + initialize_scan_stack(state[1]); + caml_call1(Stdlib_Stack[8], state[2]); + caml_call1(Stdlib_Stack[8], state[3]); + caml_call1(Stdlib_Stack[8], state[4]); + caml_call1(Stdlib_Stack[8], state[5]); + state[10] = 0; + state[14] = 0; + state[9] = state[6]; + return pp_open_box_gen(state, 0, 3); + } + function pp_flush_queue(state, b){ + var _bA_ = state[4]; + function _bB_(param){return pp_close_stag(state, 0);} + caml_call2(Stdlib_Stack[12], _bB_, _bA_); + for(;;){ + if(1 < state[14]){pp_close_box(state, 0); continue;} + state[13] = pp_infinity; + advance_left(state); + if(b) pp_output_newline(state); + return pp_rinit(state); + } + } + function pp_print_as_size(state, size, s){ + var _bz_ = state[14] < state[15] ? 1 : 0; + return _bz_ ? enqueue_string_as(state, size, s) : _bz_; + } + function pp_print_as(state, isize, s){ + return pp_print_as_size(state, isize, s); + } + function pp_print_string(state, s){ + return pp_print_as(state, caml_ml_string_length(s), s); + } + function pp_print_bytes(state, s){ + return pp_print_as + (state, + runtime.caml_ml_bytes_length(s), + caml_call1(Stdlib_Bytes[6], s)); + } + function pp_print_int(state, i){ + return pp_print_string(state, caml_call1(Stdlib_Int[12], i)); + } + function pp_print_float(state, f){ + return pp_print_string(state, caml_call1(Stdlib[35], f)); + } + function pp_print_bool(state, b){ + return pp_print_string(state, caml_call1(Stdlib[30], b)); + } + function pp_print_char(state, c){ + return pp_print_as(state, 1, caml_call2(Stdlib_String[1], 1, c)); + } + function pp_open_hbox(state, param){return pp_open_box_gen(state, 0, 0);} + function pp_open_vbox(state, indent){ + return pp_open_box_gen(state, indent, 1); + } + function pp_open_hvbox(state, indent){ + return pp_open_box_gen(state, indent, 2); + } + function pp_open_hovbox(state, indent){ + return pp_open_box_gen(state, indent, 3); + } + function pp_open_box(state, indent){ + return pp_open_box_gen(state, indent, 4); + } + function pp_print_newline(state, param){ + pp_flush_queue(state, 1); + return caml_call1(state[18], 0); + } + function pp_print_flush(state, param){ + pp_flush_queue(state, 0); + return caml_call1(state[18], 0); + } + function pp_force_newline(state, param){ + var _by_ = state[14] < state[15] ? 1 : 0; + return _by_ ? enqueue_advance(state, [0, zero, 3, 0]) : _by_; + } + function pp_print_if_newline(state, param){ + var _bx_ = state[14] < state[15] ? 1 : 0; + return _bx_ ? enqueue_advance(state, [0, zero, 4, 0]) : _bx_; + } + function pp_print_custom_break(state, fits, breaks){ + var + after = fits[3], + width = fits[2], + before = fits[1], + _bw_ = state[14] < state[15] ? 1 : 0; + if(! _bw_) return _bw_; + var + size = - state[13] | 0, + token = [1, fits, breaks], + length = + (caml_ml_string_length(before) + width | 0) + + caml_ml_string_length(after) + | 0, + elem = [0, size, token, length]; + return scan_push(state, 1, elem); + } + function pp_print_break(state, width, offset){ + return pp_print_custom_break + (state, [0, cst$6, width, cst$5], [0, cst$4, offset, cst$3]); + } + function pp_print_space(state, param){return pp_print_break(state, 1, 0);} + function pp_print_cut(state, param){return pp_print_break(state, 0, 0);} + function pp_open_tbox(state, param){ + state[14] = state[14] + 1 | 0; + var _bv_ = state[14] < state[15] ? 1 : 0; + if(! _bv_) return _bv_; + var elem = [0, zero, [4, [0, [0, 0]]], 0]; + return enqueue_advance(state, elem); + } + function pp_close_tbox(state, param){ + var _bs_ = 1 < state[14] ? 1 : 0; + if(_bs_){ + var _bt_ = state[14] < state[15] ? 1 : 0; + if(_bt_){ + var elem = [0, zero, 2, 0]; + enqueue_advance(state, elem); + state[14] = state[14] - 1 | 0; + var _bu_ = 0; + } + else + var _bu_ = _bt_; + } + else + var _bu_ = _bs_; + return _bu_; + } + function pp_print_tbreak(state, width, offset){ + var _br_ = state[14] < state[15] ? 1 : 0; + if(! _br_) return _br_; + var size = - state[13] | 0, elem = [0, size, [2, width, offset], width]; + return scan_push(state, 1, elem); + } + function pp_print_tab(state, param){return pp_print_tbreak(state, 0, 0);} + function pp_set_tab(state, param){ + var _bq_ = state[14] < state[15] ? 1 : 0; + if(! _bq_) return _bq_; + var elem = [0, zero, 0, 0]; + return enqueue_advance(state, elem); + } + function pp_set_max_boxes(state, n){ + var _bo_ = 1 < n ? 1 : 0, _bp_ = _bo_ ? (state[15] = n, 0) : _bo_; + return _bp_; + } + function pp_get_max_boxes(state, param){return state[15];} + function pp_over_max_boxes(state, param){return state[14] === state[15] ? 1 : 0; + } + function pp_set_ellipsis_text(state, s){state[16] = s; return 0;} + function pp_get_ellipsis_text(state, param){return state[16];} + function pp_limit(n){return n < 1000000010 ? n : 1000000009;} + function pp_set_max_indent(state, n$0){ + var _bn_ = 1 < n$0 ? 1 : 0; + if(! _bn_) return _bn_; + var n$1 = state[6] - n$0 | 0, _bm_ = 1 <= n$1 ? 1 : 0; + if(! _bm_) return _bm_; + var n = pp_limit(n$1); + state[7] = n; + state[8] = state[6] - state[7] | 0; + return pp_rinit(state); + } + function pp_get_max_indent(state, param){return state[8];} + function pp_set_margin(state, n){ + var _bk_ = 1 <= n ? 1 : 0; + if(! _bk_) return _bk_; + var n$0 = pp_limit(n); + state[6] = n$0; + if(state[8] <= state[6]) + var new_max_indent = state[8]; + else + var + _bl_ = + caml_call2(Stdlib_Int[11], state[6] - state[7] | 0, state[6] / 2 | 0), + new_max_indent = caml_call2(Stdlib_Int[11], _bl_, 1); + return pp_set_max_indent(state, new_max_indent); + } + function validate_geometry(param){ + var margin = param[2], max_indent = param[1]; + return 2 <= max_indent ? margin <= max_indent ? _c_ : _d_ : _e_; + } + function check_geometry(geometry){ + return 0 === validate_geometry(geometry)[0] ? 1 : 0; + } + function pp_get_margin(state, param){return state[6];} + function pp_set_full_geometry(state, param){ + var margin = param[2], max_indent = param[1]; + pp_set_margin(state, margin); + pp_set_max_indent(state, max_indent); + return 0; + } + function pp_set_geometry(state, max_indent, margin){ + var + geometry = [0, max_indent, margin], + match = validate_geometry(geometry); + if(0 === match[0]) return pp_set_full_geometry(state, geometry); + var + msg = match[1], + _bj_ = caml_call2(Stdlib[28], cst_Format_pp_set_geometry, msg); + throw caml_maybe_attach_backtrace([0, Stdlib[6], _bj_], 1); + } + function pp_safe_set_geometry(state, max_indent, margin){ + var geometry = [0, max_indent, margin]; + return 0 === validate_geometry(geometry)[0] + ? pp_set_full_geometry(state, geometry) + : 0; + } + function pp_get_geometry(state, param){return [0, state[8], state[6]];} + function pp_update_geometry(state, update){ + var geometry = pp_get_geometry(state, 0); + return pp_set_full_geometry(state, caml_call1(update, geometry)); + } + function pp_set_formatter_out_functions(state, param){ + var j = param[5], i = param[4], h = param[3], g = param[2], f = param[1]; + state[17] = f; + state[18] = g; + state[19] = h; + state[20] = i; + state[21] = j; + return 0; + } + function pp_get_formatter_out_functions(state, param){ + return [0, state[17], state[18], state[19], state[20], state[21]]; + } + function pp_set_formatter_output_functi(state, f, g){state[17] = f; state[18] = g; return 0; + } + function pp_get_formatter_output_functi(state, param){return [0, state[17], state[18]]; + } + function display_newline(state, param){ + return caml_call3(state[17], cst$7, 0, 1); + } + var blank_line = caml_call2(Stdlib_String[1], 80, 32); + function display_blanks(state, n){ + var n$0 = n; + for(;;){ + var _bi_ = 0 < n$0 ? 1 : 0; + if(! _bi_) return _bi_; + if(80 >= n$0) return caml_call3(state[17], blank_line, 0, n$0); + caml_call3(state[17], blank_line, 0, 80); + var n$1 = n$0 - 80 | 0, n$0 = n$1; + } + } + function pp_set_formatter_out_channel(state, oc){ + state[17] = caml_call1(Stdlib[69], oc); + state[18] = function(param){return caml_call1(Stdlib[63], oc);}; + state[19] = function(_bh_){return display_newline(state, _bh_);}; + state[20] = function(_bg_){return display_blanks(state, _bg_);}; + state[21] = function(_bf_){return display_blanks(state, _bf_);}; + return 0; + } + function default_pp_mark_open_tag(param){ + if(param[1] !== String_tag) return cst$10; + var s = param[2], _be_ = caml_call2(Stdlib[28], s, cst$8); + return caml_call2(Stdlib[28], cst$9, _be_); + } + function default_pp_mark_close_tag(param){ + if(param[1] !== String_tag) return cst$13; + var s = param[2], _bd_ = caml_call2(Stdlib[28], s, cst$11); + return caml_call2(Stdlib[28], cst$12, _bd_); + } + function default_pp_print_open_tag(_bc_){return 0;} + function default_pp_print_close_tag(_bb_){return 0;} + function pp_make_formatter(f, g, h, i, j){ + var + pp_queue = caml_call1(Stdlib_Queue[2], 0), + sys_tok = [0, unknown, _f_, 0]; + caml_call2(Stdlib_Queue[3], sys_tok, pp_queue); + var scan_stack = caml_call1(Stdlib_Stack[2], 0); + initialize_scan_stack(scan_stack); + caml_call2(Stdlib_Stack[3], [0, 1, sys_tok], scan_stack); + var + _a9_ = Stdlib[19], + _a__ = caml_call1(Stdlib_Stack[2], 0), + _a$_ = caml_call1(Stdlib_Stack[2], 0), + _ba_ = caml_call1(Stdlib_Stack[2], 0); + return [0, + scan_stack, + caml_call1(Stdlib_Stack[2], 0), + _ba_, + _a$_, + _a__, + 78, + 10, + 68, + 78, + 0, + 1, + 1, + 1, + 1, + _a9_, + cst$14, + f, + g, + h, + i, + j, + 0, + 0, + default_pp_mark_open_tag, + default_pp_mark_close_tag, + default_pp_print_open_tag, + default_pp_print_close_tag, + pp_queue]; + } + function formatter_of_out_functions(out_funs){ + return pp_make_formatter + (out_funs[1], out_funs[2], out_funs[3], out_funs[4], out_funs[5]); + } + function make_formatter(output, flush){ + function _a1_(_a8_){return 0;} + function _a2_(_a7_){return 0;} + var + ppf = + pp_make_formatter(output, flush, function(_a6_){return 0;}, _a2_, _a1_); + ppf[19] = function(_a5_){return display_newline(ppf, _a5_);}; + ppf[20] = function(_a4_){return display_blanks(ppf, _a4_);}; + ppf[21] = function(_a3_){return display_blanks(ppf, _a3_);}; + return ppf; + } + function formatter_of_out_channel(oc){ + function _a0_(param){return caml_call1(Stdlib[63], oc);} + return make_formatter(caml_call1(Stdlib[69], oc), _a0_); + } + function formatter_of_buffer(b){ + function _aY_(_aZ_){return 0;} + return make_formatter(caml_call1(Stdlib_Buffer[18], b), _aY_); + } + var pp_buffer_size = 512; + function pp_make_buffer(param){ + return caml_call1(Stdlib_Buffer[1], pp_buffer_size); + } + var + stdbuf = pp_make_buffer(0), + std_formatter = formatter_of_out_channel(Stdlib[39]), + err_formatter = formatter_of_out_channel(Stdlib[40]), + str_formatter = formatter_of_buffer(stdbuf), + stdbuf_key = caml_call2(Stdlib_Domain[10][1], 0, pp_make_buffer); + caml_call2(Stdlib_Domain[10][3], stdbuf_key, stdbuf); + function _g_(param){ + return formatter_of_buffer(caml_call1(Stdlib_Domain[10][2], stdbuf_key)); + } + var str_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _g_); + caml_call2(Stdlib_Domain[10][3], str_formatter_key, str_formatter); + function buffered_out_string(key, str, ofs, len){ + var _aX_ = caml_call1(Stdlib_Domain[10][2], key); + return caml_call4(Stdlib_Buffer[18], _aX_, str, ofs, len); + } + function buffered_out_flush(oc, key, param){ + var + buf = caml_call1(Stdlib_Domain[10][2], key), + len = caml_call1(Stdlib_Buffer[7], buf), + str = caml_call1(Stdlib_Buffer[2], buf); + caml_call4(Stdlib[69], oc, str, 0, len); + caml_call1(Stdlib[63], oc); + return caml_call1(Stdlib_Buffer[8], buf); + } + function _h_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var std_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _h_); + function _i_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var err_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _i_); + function _j_(param){ + function _aG_(_aW_){return 0;} + function _aH_(_aV_){return 0;} + function _aI_(_aU_){return 0;} + var _aJ_ = Stdlib[39]; + function _aK_(_aT_){return buffered_out_flush(_aJ_, std_buf_key, _aT_);} + var + ppf = + pp_make_formatter + (function(_aQ_, _aR_, _aS_){ + return buffered_out_string(std_buf_key, _aQ_, _aR_, _aS_); + }, + _aK_, + _aI_, + _aH_, + _aG_); + ppf[19] = function(_aP_){return display_newline(ppf, _aP_);}; + ppf[20] = function(_aO_){return display_blanks(ppf, _aO_);}; + ppf[21] = function(_aN_){return display_blanks(ppf, _aN_);}; + function _aL_(_aM_){return pp_print_flush(ppf, _aM_);} + caml_call1(Stdlib_Domain[6], _aL_); + return ppf; + } + var std_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _j_); + caml_call2(Stdlib_Domain[10][3], std_formatter_key, std_formatter); + function _k_(param){ + function _ap_(_aF_){return 0;} + function _aq_(_aE_){return 0;} + function _ar_(_aD_){return 0;} + var _as_ = Stdlib[40]; + function _at_(_aC_){return buffered_out_flush(_as_, err_buf_key, _aC_);} + var + ppf = + pp_make_formatter + (function(_az_, _aA_, _aB_){ + return buffered_out_string(err_buf_key, _az_, _aA_, _aB_); + }, + _at_, + _ar_, + _aq_, + _ap_); + ppf[19] = function(_ay_){return display_newline(ppf, _ay_);}; + ppf[20] = function(_ax_){return display_blanks(ppf, _ax_);}; + ppf[21] = function(_aw_){return display_blanks(ppf, _aw_);}; + function _au_(_av_){return pp_print_flush(ppf, _av_);} + caml_call1(Stdlib_Domain[6], _au_); + return ppf; + } + var err_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _k_); + caml_call2(Stdlib_Domain[10][3], err_formatter_key, err_formatter); + function get_std_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key); + } + function get_err_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], err_formatter_key); + } + function get_str_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], str_formatter_key); + } + function get_stdbuf(param){ + return caml_call1(Stdlib_Domain[10][2], stdbuf_key); + } + function flush_buffer_formatter(buf, ppf){ + pp_flush_queue(ppf, 0); + var s = caml_call1(Stdlib_Buffer[2], buf); + caml_call1(Stdlib_Buffer[9], buf); + return s; + } + function flush_str_formatter(param){ + var + stdbuf = caml_call1(Stdlib_Domain[10][2], stdbuf_key), + str_formatter = caml_call1(Stdlib_Domain[10][2], str_formatter_key); + return flush_buffer_formatter(stdbuf, str_formatter); + } + function make_synchronized_formatter(output, flush){ + function _an_(param){ + var + buf = caml_call1(Stdlib_Buffer[1], pp_buffer_size), + output$0 = caml_call1(Stdlib_Buffer[18], buf); + function flush$0(param){ + var _ao_ = caml_call1(Stdlib_Buffer[7], buf); + caml_call3(output, caml_call1(Stdlib_Buffer[2], buf), 0, _ao_); + caml_call1(Stdlib_Buffer[8], buf); + return caml_call1(flush, 0); + } + return make_formatter(output$0, flush$0); + } + return caml_call2(Stdlib_Domain[10][1], 0, _an_); + } + function synchronized_formatter_of_out_(oc){ + function _am_(param){return caml_call1(Stdlib[63], oc);} + return make_synchronized_formatter(caml_call1(Stdlib[69], oc), _am_); + } + function make_symbolic_output_buffer(param){return [0, 0];} + function clear_symbolic_output_buffer(sob){sob[1] = 0; return 0;} + function get_symbolic_output_buffer(sob){ + return caml_call1(Stdlib_List[9], sob[1]); + } + function flush_symbolic_output_buffer(sob){ + var items = get_symbolic_output_buffer(sob); + clear_symbolic_output_buffer(sob); + return items; + } + function add_symbolic_output_item(sob, item){sob[1] = [0, item, sob[1]]; return 0; + } + function formatter_of_symbolic_output_b(sob){ + function f(s, i, n){ + return add_symbolic_output_item + (sob, [0, caml_call3(Stdlib_String[15], s, i, n)]); + } + function g(_al_){return add_symbolic_output_item(sob, 0);} + function h(_ak_){return add_symbolic_output_item(sob, 1);} + function i(n){return add_symbolic_output_item(sob, [1, n]);} + function j(n){return add_symbolic_output_item(sob, [2, n]);} + return pp_make_formatter(f, g, h, i, j); + } + function open_hbox(v){ + return pp_open_hbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_vbox(v){ + return pp_open_vbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hvbox(v){ + return pp_open_hvbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hovbox(v){ + return pp_open_hovbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_box(v){ + return pp_open_box(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_box(v){ + return pp_close_box + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_stag(v){ + return pp_open_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_stag(v){ + return pp_close_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_as(v, w){ + return pp_print_as + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_string(v){ + return pp_print_string + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bytes(v){ + return pp_print_bytes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_int(v){ + return pp_print_int + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_float(v){ + return pp_print_float + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_char(v){ + return pp_print_char + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bool(v){ + return pp_print_bool + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_break(v, w){ + return pp_print_break + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_cut(v){ + return pp_print_cut + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_space(v){ + return pp_print_space + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function force_newline(v){ + return pp_force_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_flush(v){ + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_newline(v){ + return pp_print_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_if_newline(v){ + return pp_print_if_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_tbox(v){ + return pp_open_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_tbox(v){ + return pp_close_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tbreak(v, w){ + return pp_print_tbreak + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function set_tab(v){ + return pp_set_tab(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tab(v){ + return pp_print_tab + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_margin(v){ + return pp_set_margin + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_margin(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[6]; + } + function set_max_indent(v){ + return pp_set_max_indent + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_indent(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[8]; + } + function set_geometry(max_indent, margin){ + return pp_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function safe_set_geometry(max_indent, margin){ + return pp_safe_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function get_geometry(v){ + return pp_get_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function update_geometry(v){ + return pp_update_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_max_boxes(v){ + return pp_set_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_boxes(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[15]; + } + function over_max_boxes(v){ + return pp_over_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_ellipsis_text(v){ + return pp_set_ellipsis_text + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_ellipsis_text(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[16]; + } + function set_formatter_out_channel(v){ + return pp_set_formatter_out_channel + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_out_functions(v){ + return pp_set_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_out_functions(v){ + return pp_get_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_output_functions(v, w){ + return pp_set_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function get_formatter_output_functions(v){ + return pp_get_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_stag_functions(v){ + return pp_set_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_stag_functions(v){ + return pp_get_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_print_tags(v){ + return pp_set_print_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_print_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[22]; + } + function set_mark_tags(v){ + return pp_set_mark_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_mark_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[23]; + } + function set_tags(v){ + return pp_set_tags(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function pp_print_list(opt, pp_v, ppf, param){ + var opt$0 = opt, param$0 = param; + for(;;){ + if(opt$0) + var sth = opt$0[1], pp_sep = sth; + else + var pp_sep = pp_print_cut; + if(! param$0) return 0; + var v = param$0[1]; + if(! param$0[2]) return caml_call2(pp_v, ppf, v); + var vs = param$0[2]; + caml_call2(pp_v, ppf, v); + caml_call2(pp_sep, ppf, 0); + var opt$1 = [0, pp_sep], opt$0 = opt$1, param$0 = vs; + } + } + function pp_print_seq(opt, pp_v, ppf, seq$1){ + if(opt) var sth = opt[1], pp_sep = sth; else var pp_sep = pp_print_cut; + var match$0 = caml_call1(seq$1, 0); + if(! match$0) return 0; + var seq$2 = match$0[2], v$0 = match$0[1]; + caml_call2(pp_v, ppf, v$0); + var seq = seq$2; + for(;;){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var seq$0 = match[2], v = match[1]; + caml_call2(pp_sep, ppf, 0); + caml_call2(pp_v, ppf, v); + var seq = seq$0; + } + } + function pp_print_text(ppf, s){ + var len = caml_ml_string_length(s), left = [0, 0], right = [0, 0]; + function flush(param){ + pp_print_string + (ppf, caml_call3(Stdlib_String[15], s, left[1], right[1] - left[1] | 0)); + right[1]++; + left[1] = right[1]; + return 0; + } + for(;;){ + if(right[1] === len){ + var _aj_ = left[1] !== len ? 1 : 0; + return _aj_ ? flush(0) : _aj_; + } + var match = runtime.caml_string_get(s, right[1]); + if(10 === match){ + flush(0); + pp_force_newline(ppf, 0); + } + else if(32 === match){flush(0); pp_print_space(ppf, 0);} else right[1]++; + } + } + function pp_print_option(opt, pp_v, ppf, param){ + if(opt) + var sth = opt[1], none = sth; + else + var none = function(param, _ai_){return 0;}; + if(! param) return caml_call2(none, ppf, 0); + var v = param[1]; + return caml_call2(pp_v, ppf, v); + } + function pp_print_result(ok, error, ppf, param){ + if(0 === param[0]){var v = param[1]; return caml_call2(ok, ppf, v);} + var e = param[1]; + return caml_call2(error, ppf, e); + } + function pp_print_either(left, right, ppf, param){ + if(0 === param[0]){var l = param[1]; return caml_call2(left, ppf, l);} + var r = param[1]; + return caml_call2(right, ppf, r); + } + function compute_tag(output, tag_acc){ + var + buf = caml_call1(Stdlib_Buffer[1], 16), + ppf = formatter_of_buffer(buf); + caml_call2(output, ppf, tag_acc); + pp_print_flush(ppf, 0); + var len = caml_call1(Stdlib_Buffer[7], buf); + return 2 <= len + ? caml_call3(Stdlib_Buffer[4], buf, 1, len - 2 | 0) + : caml_call1(Stdlib_Buffer[2], buf); + } + function output_formatting_lit(ppf, fmting_lit){ + if(typeof fmting_lit === "number") + switch(fmting_lit){ + case 0: + return pp_close_box(ppf, 0); + case 1: + return pp_close_stag(ppf, 0); + case 2: + return pp_print_flush(ppf, 0); + case 3: + return pp_force_newline(ppf, 0); + case 4: + return pp_print_newline(ppf, 0); + case 5: + return pp_print_char(ppf, 64); + default: return pp_print_char(ppf, 37); + } + switch(fmting_lit[0]){ + case 0: + var offset = fmting_lit[3], width = fmting_lit[2]; + return pp_print_break(ppf, width, offset); + case 1: + return 0; + default: + var c = fmting_lit[1]; + pp_print_char(ppf, 64); + return pp_print_char(ppf, c); + } + } + function output_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + output_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + output_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(output_acc, acc$0)]); + } + var acc$1 = match[1]; + output_acc(ppf, p$0); + var + _$_ = compute_tag(output_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _$_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _aa_ = acc[1], switch$1 = 0; + if(typeof _aa_ === "number" || ! (0 === _aa_[0])) + switch$1 = 1; + else{ + var _ab_ = _aa_[2], switch$2 = 0; + if(typeof _ab_ === "number" || ! (1 === _ab_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _ab_[2], p$2 = _aa_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _aa_; switch$0 = 2;} + break; + case 3: + var _ac_ = acc[1], switch$3 = 0; + if(typeof _ac_ === "number" || ! (0 === _ac_[0])) + switch$3 = 1; + else{ + var _ad_ = _ac_[2], switch$4 = 0; + if(typeof _ad_ === "number" || ! (1 === _ad_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _ad_[2], p$4 = _ac_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _ac_; switch$0 = 3;} + break; + case 4: + var _ae_ = acc[1], switch$5 = 0; + if(typeof _ae_ === "number" || ! (0 === _ae_[0])) + switch$5 = 1; + else{ + var _af_ = _ae_[2], switch$6 = 0; + if(typeof _af_ === "number" || ! (1 === _af_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _af_[2], p$2 = _ae_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _ae_; switch$0 = 2;} + break; + case 5: + var _ag_ = acc[1], switch$7 = 0; + if(typeof _ag_ === "number" || ! (0 === _ag_[0])) + switch$7 = 1; + else{ + var _ah_ = _ag_[2], switch$8 = 0; + if(typeof _ah_ === "number" || ! (1 === _ah_[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = _ah_[2], p$4 = _ag_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _ag_; switch$0 = 3;} + break; + case 6: + var f$0 = acc[2], p$5 = acc[1]; + output_acc(ppf, p$5); + return caml_call1(f$0, ppf); + case 7: + var p$6 = acc[1]; output_acc(ppf, p$6); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$7 = acc[1]; + output_acc(ppf, p$7); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + output_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + output_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + output_acc(ppf, p$1); return pp_print_string(ppf, s); + default: output_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function strput_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + strput_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + strput_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(strput_acc, acc$0)]); + } + var acc$1 = match[1]; + strput_acc(ppf, p$0); + var + _S_ = compute_tag(strput_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _S_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _T_ = acc[1], switch$1 = 0; + if(typeof _T_ === "number" || ! (0 === _T_[0])) + switch$1 = 1; + else{ + var _U_ = _T_[2], switch$2 = 0; + if(typeof _U_ === "number" || ! (1 === _U_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _U_[2], p$2 = _T_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _T_; switch$0 = 2;} + break; + case 3: + var _V_ = acc[1], switch$3 = 0; + if(typeof _V_ === "number" || ! (0 === _V_[0])) + switch$3 = 1; + else{ + var _W_ = _V_[2], switch$4 = 0; + if(typeof _W_ === "number" || ! (1 === _W_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _W_[2], p$4 = _V_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _V_; switch$0 = 3;} + break; + case 4: + var _X_ = acc[1], switch$5 = 0; + if(typeof _X_ === "number" || ! (0 === _X_[0])) + switch$5 = 1; + else{ + var _Y_ = _X_[2], switch$6 = 0; + if(typeof _Y_ === "number" || ! (1 === _Y_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _Y_[2], p$2 = _X_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _X_; switch$0 = 2;} + break; + case 5: + var _Z_ = acc[1], switch$7 = 0; + if(typeof _Z_ === "number" || ! (0 === _Z_[0])) + switch$7 = 1; + else{ + var ___ = _Z_[2], switch$8 = 0; + if(typeof ___ === "number" || ! (1 === ___[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = ___[2], p$4 = _Z_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _Z_; switch$0 = 3;} + break; + case 6: + var p$5 = acc[1]; + if(typeof p$5 !== "number" && 0 === p$5[0]){ + var match$1 = p$5[2]; + if(typeof match$1 !== "number" && 1 === match$1[0]){ + var f$1 = acc[2], size$1 = match$1[2], p$6 = p$5[1]; + strput_acc(ppf, p$6); + return pp_print_as_size(ppf, size$1, caml_call1(f$1, 0)); + } + } + var f$0 = acc[2]; + strput_acc(ppf, p$5); + return pp_print_string(ppf, caml_call1(f$0, 0)); + case 7: + var p$7 = acc[1]; strput_acc(ppf, p$7); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$8 = acc[1]; + strput_acc(ppf, p$8); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + strput_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + strput_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + strput_acc(ppf, p$1); return pp_print_string(ppf, s); + default: strput_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function kfprintf(k, ppf, param){ + var fmt = param[1], _Q_ = 0; + function _R_(acc){output_acc(ppf, acc); return caml_call1(k, ppf);} + return caml_call3(CamlinternalFormat[7], _R_, _Q_, fmt); + } + function ikfprintf(k, ppf, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, ppf, fmt); + } + function ifprintf(ppf, param){ + var fmt = param[1], _N_ = 0; + function _O_(_P_){return 0;} + return caml_call3(CamlinternalFormat[8], _O_, _N_, fmt); + } + function fprintf(ppf){ + function _K_(_M_){return 0;} + return function(_L_){return kfprintf(_K_, ppf, _L_);}; + } + function printf(param){ + var fmt = param[1], _I_ = 0; + function _J_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _J_, _I_, fmt); + } + function eprintf(param){ + var fmt = param[1], _G_ = 0; + function _H_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _H_, _G_, fmt); + } + function kdprintf(k, param){ + var fmt = param[1], _E_ = 0; + function _F_(acc){ + return caml_call1(k, function(ppf){return output_acc(ppf, acc);}); + } + return caml_call3(CamlinternalFormat[7], _F_, _E_, fmt); + } + function dprintf(fmt){return kdprintf(function(i){return i;}, fmt);} + function ksprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + strput_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(id, fmt);} + function kasprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + output_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function asprintf(fmt){return kasprintf(id, fmt);} + function flush_standard_formatters(param){ + pp_print_flush(caml_call1(Stdlib_Domain[10][2], std_formatter_key), 0); + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), 0); + } + caml_call1(Stdlib[100], flush_standard_formatters); + function _l_(param){ + flush_standard_formatters(0); + var + fs = pp_get_formatter_out_functions(std_formatter, 0), + _m_ = fs[5], + _n_ = fs[4], + _o_ = fs[3], + _p_ = Stdlib[39]; + function _q_(_D_){return buffered_out_flush(_p_, std_buf_key, _D_);} + pp_set_formatter_out_functions + (std_formatter, + [0, + function(_A_, _B_, _C_){ + return buffered_out_string(std_buf_key, _A_, _B_, _C_); + }, + _q_, + _o_, + _n_, + _m_]); + var + fs$0 = pp_get_formatter_out_functions(err_formatter, 0), + _r_ = fs$0[5], + _s_ = fs$0[4], + _t_ = fs$0[3], + _u_ = Stdlib[40]; + function _v_(_z_){return buffered_out_flush(_u_, err_buf_key, _z_);} + return pp_set_formatter_out_functions + (err_formatter, + [0, + function(_w_, _x_, _y_){ + return buffered_out_string(err_buf_key, _w_, _x_, _y_); + }, + _v_, + _t_, + _s_, + _r_]); + } + caml_call1(Stdlib_Domain[5], _l_); + var + Stdlib_Format = + [0, + pp_open_box, + open_box, + pp_close_box, + close_box, + pp_open_hbox, + open_hbox, + pp_open_vbox, + open_vbox, + pp_open_hvbox, + open_hvbox, + pp_open_hovbox, + open_hovbox, + pp_print_string, + print_string, + pp_print_bytes, + print_bytes, + pp_print_as, + print_as, + pp_print_int, + print_int, + pp_print_float, + print_float, + pp_print_char, + print_char, + pp_print_bool, + print_bool, + pp_print_space, + print_space, + pp_print_cut, + print_cut, + pp_print_break, + print_break, + pp_print_custom_break, + pp_force_newline, + force_newline, + pp_print_if_newline, + print_if_newline, + pp_print_flush, + print_flush, + pp_print_newline, + print_newline, + pp_set_margin, + set_margin, + pp_get_margin, + get_margin, + pp_set_max_indent, + set_max_indent, + pp_get_max_indent, + get_max_indent, + check_geometry, + pp_set_geometry, + set_geometry, + pp_safe_set_geometry, + safe_set_geometry, + pp_update_geometry, + update_geometry, + pp_get_geometry, + get_geometry, + pp_set_max_boxes, + set_max_boxes, + pp_get_max_boxes, + get_max_boxes, + pp_over_max_boxes, + over_max_boxes, + pp_open_tbox, + open_tbox, + pp_close_tbox, + close_tbox, + pp_set_tab, + set_tab, + pp_print_tab, + print_tab, + pp_print_tbreak, + print_tbreak, + pp_set_ellipsis_text, + set_ellipsis_text, + pp_get_ellipsis_text, + get_ellipsis_text, + String_tag, + pp_open_stag, + open_stag, + pp_close_stag, + close_stag, + pp_set_tags, + set_tags, + pp_set_print_tags, + set_print_tags, + pp_set_mark_tags, + set_mark_tags, + pp_get_print_tags, + get_print_tags, + pp_get_mark_tags, + get_mark_tags, + pp_set_formatter_out_channel, + set_formatter_out_channel, + pp_set_formatter_output_functi, + set_formatter_output_functions, + pp_get_formatter_output_functi, + get_formatter_output_functions, + pp_set_formatter_out_functions, + set_formatter_out_functions, + pp_get_formatter_out_functions, + get_formatter_out_functions, + pp_set_formatter_stag_function, + set_formatter_stag_functions, + pp_get_formatter_stag_function, + get_formatter_stag_functions, + formatter_of_out_channel, + synchronized_formatter_of_out_, + std_formatter, + get_std_formatter, + err_formatter, + get_err_formatter, + formatter_of_buffer, + stdbuf, + get_stdbuf, + str_formatter, + get_str_formatter, + flush_str_formatter, + make_formatter, + make_synchronized_formatter, + formatter_of_out_functions, + make_symbolic_output_buffer, + clear_symbolic_output_buffer, + get_symbolic_output_buffer, + flush_symbolic_output_buffer, + add_symbolic_output_item, + formatter_of_symbolic_output_b, + pp_print_list, + pp_print_seq, + pp_print_text, + pp_print_option, + pp_print_result, + pp_print_either, + fprintf, + printf, + eprintf, + sprintf, + asprintf, + dprintf, + ifprintf, + kfprintf, + kdprintf, + ikfprintf, + ksprintf, + kasprintf]; + runtime.caml_register_global(35, Stdlib_Format, "Stdlib__Format"); + return; + } + (globalThis)); + +//# 21019 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = '"', + cst$6 = "-", + cst_character = "character ", + cst_scanf_ml = "scanf.ml", + cst_scanf_bad_conversion$3 = 'scanf: bad conversion "%*"', + cst_scanning_of = "scanning of ", + caml_bytes_get = runtime.caml_bytes_get, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$5, + cst$4 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + cst$0 = cst$5, + cst = cst$6, + CamlinternalFormat = global_data.CamlinternalFormat, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib_String = global_data.Stdlib__String, + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Buffer = global_data.Stdlib__Buffer, + _r_ = [0, 91], + _q_ = [0, 123], + cst_end_of_input_not_found = "end of input not found", + cst_scanf_bad_conversion_a = 'scanf: bad conversion "%a"', + cst_scanf_bad_conversion_t = 'scanf: bad conversion "%t"', + cst_scanf_missing_reader = "scanf: missing reader", + _s_ = [0, cst_scanf_ml, 1414, 13], + cst_scanf_bad_conversion_custo = + 'scanf: bad conversion "%?" (custom converter)', + cst_scanf_bad_conversion = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$0 = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$1 = 'scanf: bad conversion "%-"', + cst_scanf_bad_conversion$2 = cst_scanf_bad_conversion$3, + _t_ = [0, [3, 0, [10, 0]], "%S%!"], + cst_in_format = ' in format "', + _p_ = [0, 37, ""], + _o_ = + [0, + [11, + "scanf: bad input at char number ", + [4, 3, 0, 0, [11, ": ", [2, 0, 0]]]], + "scanf: bad input at char number %i: %s"], + _n_ = + [0, + [11, "the character ", [1, [11, " cannot start a boolean", 0]]], + "the character %C cannot start a boolean"], + _m_ = + [0, + [11, "bad character hexadecimal encoding \\", [0, [0, 0]]], + "bad character hexadecimal encoding \\%c%c"], + _l_ = + [0, + [11, "bad character decimal encoding \\", [0, [0, [0, 0]]]], + "bad character decimal encoding \\%c%c%c"], + cst_an = "an", + cst_x = "x", + cst_nfinity = "nfinity", + cst_digits = "digits", + _k_ = + [0, + [11, + cst_character, + [1, [11, " is not a valid ", [2, 0, [11, " digit", 0]]]]], + "character %C is not a valid %s digit"], + cst_decimal_digits = "decimal digits", + _j_ = + [0, + [11, cst_character, [1, [11, " is not a decimal digit", 0]]], + "character %C is not a decimal digit"], + cst_0b = "0b", + cst_0o = "0o", + cst_0u = "0u", + cst_0x = "0x", + _i_ = [0, cst_scanf_ml, 516, 9], + _h_ = + [0, + [11, "invalid boolean '", [2, 0, [12, 39, 0]]], + "invalid boolean '%s'"], + _g_ = + [0, + [11, "looking for ", [1, [11, ", found ", [1, 0]]]], + "looking for %C, found %C"], + cst_not_a_valid_float_in_hexad = + "not a valid float in hexadecimal notation", + cst_no_dot_or_exponent_part_fo = + "no dot or exponent part found in float token", + _f_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, + " failed: premature end of file occurred before end of token", + 0]]], + "scanning of %s failed: premature end of file occurred before end of token"], + _e_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, " failed: the specified length was too short for token", 0]]], + "scanning of %s failed: the specified length was too short for token"], + _d_ = + [0, + [11, "illegal escape character ", [1, 0]], + "illegal escape character %C"], + cst_unnamed_function = "unnamed function", + cst_unnamed_character_string = "unnamed character string", + cst_unnamed_Stdlib_input_chann = "unnamed Stdlib input channel", + cst_Stdlib_Scanf_Scan_failure = "Stdlib.Scanf.Scan_failure", + cst_binary = "binary", + cst_octal = "octal", + cst_hexadecimal = "hexadecimal", + cst_a_Char = "a Char", + cst_a_String = "a String", + null_char = 0; + function next_char(ib){ + try{ + var c = caml_call1(ib[7], 0); + ib[2] = c; + ib[3] = 1; + ib[4] = ib[4] + 1 | 0; + if(10 === c) ib[5] = ib[5] + 1 | 0; + return c; + } + catch(_bb_){ + var _ba_ = caml_wrap_exception(_bb_); + if(_ba_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_ba_, 0); + ib[2] = null_char; + ib[3] = 0; + ib[1] = 1; + return null_char; + } + } + function peek_char(ib){return ib[3] ? ib[2] : next_char(ib);} + function checked_peek_char(ib){ + var c = peek_char(ib); + if(ib[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return c; + } + function end_of_input(ib){peek_char(ib); return ib[1];} + function beginning_of_input(ib){return 0 === ib[4] ? 1 : 0;} + function name_of_input(ib){ + var match = ib[9]; + if(typeof match === "number") + return 0 === match ? cst_unnamed_function : cst_unnamed_character_string; + if(0 === match[0]) return cst_unnamed_Stdlib_input_chann; + var fname = match[1]; + return fname; + } + function char_count(ib){return ib[3] ? ib[4] - 1 | 0 : ib[4];} + function invalidate_current_char(ib){ib[3] = 0; return 0;} + function token_string(ib){ + var + token_buffer = ib[8], + tok = caml_call1(Stdlib_Buffer[2], token_buffer); + caml_call1(Stdlib_Buffer[8], token_buffer); + ib[6] = ib[6] + 1 | 0; + return tok; + } + function skip_char(width, ib){invalidate_current_char(ib); return width;} + function ignore_char(width, ib){return skip_char(width - 1 | 0, ib);} + function store_char(width, ib, c){ + caml_call2(Stdlib_Buffer[12], ib[8], c); + return ignore_char(width, ib); + } + var default_token_buffer_size = 1024; + function create(iname, next){ + return [0, + 0, + null_char, + 0, + 0, + 0, + 0, + next, + caml_call1(Stdlib_Buffer[1], default_token_buffer_size), + iname]; + } + function from_string(s){ + var i = [0, 0], len = caml_ml_string_length(s); + function next(param){ + if(len <= i[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + var c = caml_string_get(s, i[1]); + i[1]++; + return c; + } + return create(1, next); + } + var _a_ = 0; + function from_function(_a$_){return create(_a_, _a$_);} + var len = 1024; + function scan_close_at_end(ic){ + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function scan_raise_at_end(ic){ + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function from_ic(scan_close_ic, iname, ic){ + var + buf = runtime.caml_create_bytes(1024), + i = [0, 0], + lim = [0, 0], + eof = [0, 0]; + function next(param){ + if(i[1] < lim[1]){var c = caml_bytes_get(buf, i[1]); i[1]++; return c;} + if(eof[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + lim[1] = caml_call4(Stdlib[84], ic, buf, 0, len); + return 0 === lim[1] + ? (eof[1] = 1, caml_call1(scan_close_ic, ic)) + : (i[1] = 1, caml_bytes_get(buf, 0)); + } + return create(iname, next); + } + var stdin = from_ic(scan_raise_at_end, [1, cst, Stdlib[38]], Stdlib[38]); + function open_in_file(open_in, fname){ + if(! caml_string_notequal(fname, cst$6)) return stdin; + var ic = caml_call1(open_in, fname); + return from_ic(scan_close_at_end, [1, fname, ic], ic); + } + var _b_ = Stdlib[79]; + function open_in(_a__){return open_in_file(_b_, _a__);} + var _c_ = Stdlib[80]; + function open_in_bin(_a9_){return open_in_file(_c_, _a9_);} + function from_channel(ic){return from_ic(scan_raise_at_end, [0, ic], ic);} + function close_in(ib){ + var match = ib[9]; + if(typeof match === "number") return 0; + if(0 === match[0]){var ic = match[1]; return caml_call1(Stdlib[93], ic);} + var ic$0 = match[2]; + return caml_call1(Stdlib[93], ic$0); + } + var + Scan_failure = + [248, cst_Stdlib_Scanf_Scan_failure, runtime.caml_fresh_oo_id(0)]; + function bad_input(s){ + throw caml_maybe_attach_backtrace([0, Scan_failure, s], 1); + } + function bad_input_escape(c){ + return bad_input(caml_call2(Stdlib_Printf[4], _d_, c)); + } + function bad_token_length(message){ + return bad_input(caml_call2(Stdlib_Printf[4], _e_, message)); + } + function bad_float(param){ + return bad_input(cst_no_dot_or_exponent_part_fo); + } + function bad_hex_float(param){ + return bad_input(cst_not_a_valid_float_in_hexad); + } + function character_mismatch(c, ci){ + return bad_input(caml_call3(Stdlib_Printf[4], _g_, c, ci)); + } + function check_this_char(ib, c){ + var ci = checked_peek_char(ib); + return ci === c ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function check_char(ib, c$0){ + if(10 === c$0){ + var ci = checked_peek_char(ib); + return 10 === ci + ? invalidate_current_char(ib) + : 13 + === ci + ? (invalidate_current_char(ib), check_this_char(ib, 10)) + : character_mismatch(10, ci); + } + if(32 !== c$0) return check_this_char(ib, c$0); + for(;;){ + var c = peek_char(ib), _a7_ = 1 - ib[1]; + if(! _a7_) return _a7_; + var _a8_ = c - 9 | 0, switch$0 = 0; + if(4 < _a8_ >>> 0){ + if(23 === _a8_) switch$0 = 1; + } + else if(1 < _a8_ - 2 >>> 0) switch$0 = 1; + if(! switch$0) return 0; + invalidate_current_char(ib); + } + } + function token_char(ib){return caml_string_get(token_string(ib), 0);} + function token_bool(ib){ + var s = token_string(ib); + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? bad_input(caml_call2(Stdlib_Printf[4], _h_, s)) + : 1 + : 0; + } + function integer_conversion_of_char(param){ + var switcher = param - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 10: + return 0; + case 12: + return 1; + case 17: + return 2; + case 23: + return 3; + case 29: + return 4; + case 0: + case 32: + return 5; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + } + function token_int_literal(conv, ib){ + switch(conv){ + case 0: + var + _a3_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0b, _a3_); + break; + case 3: + var + _a4_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0o, _a4_); + break; + case 4: + var + _a5_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0u, _a5_); + break; + case 5: + var + _a6_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0x, _a6_); + break; + default: var tok = token_string(ib); + } + var l = caml_ml_string_length(tok); + if(0 !== l && 43 === caml_string_get(tok, 0)) + return caml_call3(Stdlib_String[15], tok, 1, l - 1 | 0); + return tok; + } + function token_float(ib){ + return runtime.caml_float_of_string(token_string(ib)); + } + function scan_decimal_digit_star(width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(58 <= c){ + if(95 === c){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + } + else if(48 <= c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + return width$0; + } + } + function scan_decimal_digit_plus(width, ib){ + if(0 === width) return bad_token_length(cst_decimal_digits); + var c = checked_peek_char(ib); + if(9 < c - 48 >>> 0) + return bad_input(caml_call2(Stdlib_Printf[4], _j_, c)); + var width$0 = store_char(width, ib, c); + return scan_decimal_digit_star(width$0, ib); + } + function scan_digit_plus(basis, digitp, width$2, ib){ + if(0 === width$2) return bad_token_length(cst_digits); + var c$0 = checked_peek_char(ib); + if(! caml_call1(digitp, c$0)) + return bad_input(caml_call3(Stdlib_Printf[4], _k_, c$0, basis)); + var width$3 = store_char(width$2, ib, c$0), width = width$3; + for(;;){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(caml_call1(digitp, c)){ + var width$0 = store_char(width, ib, c), width = width$0; + continue; + } + if(95 !== c) return width; + var width$1 = ignore_char(width, ib), width = width$1; + } + } + function is_binary_digit(param){return 1 < param - 48 >>> 0 ? 0 : 1;} + function scan_binary_int(_a1_, _a2_){ + return scan_digit_plus(cst_binary, is_binary_digit, _a1_, _a2_); + } + function is_octal_digit(param){return 7 < param - 48 >>> 0 ? 0 : 1;} + function scan_octal_int(_aZ_, _a0_){ + return scan_digit_plus(cst_octal, is_octal_digit, _aZ_, _a0_); + } + function is_hexa_digit(param){ + var _aY_ = param - 48 | 0, switch$0 = 0; + if(22 < _aY_ >>> 0){ + if(5 >= _aY_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _aY_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function scan_hexadecimal_int(_aW_, _aX_){ + return scan_digit_plus(cst_hexadecimal, is_hexa_digit, _aW_, _aX_); + } + function scan_sign(width, ib){ + var c = checked_peek_char(ib), switcher = c - 43 | 0; + if(2 >= switcher >>> 0) + switch(switcher){ + case 0: + return store_char(width, ib, c); + case 1: break; + default: return store_char(width, ib, c); + } + return width; + } + function scan_optionally_signed_decimal(width, ib){ + var width$0 = scan_sign(width, ib); + return scan_decimal_digit_plus(width$0, ib); + } + function scan_int_conversion(conv, width$1, ib){ + switch(conv){ + case 0: + return scan_binary_int(width$1, ib); + case 1: + return scan_optionally_signed_decimal(width$1, ib); + case 2: + var width$0 = scan_sign(width$1, ib), c = checked_peek_char(ib); + if(48 !== c) return scan_decimal_digit_plus(width$0, ib); + var width = store_char(width$0, ib, c); + if(0 === width) return width; + var c$0 = peek_char(ib); + if(ib[1]) return width; + var switch$0 = 0; + if(99 <= c$0){ + if(111 === c$0) return scan_octal_int(store_char(width, ib, c$0), ib); + if(120 === c$0) switch$0 = 1; + } + else if(88 === c$0) + switch$0 = 1; + else if(98 <= c$0) + return scan_binary_int(store_char(width, ib, c$0), ib); + return switch$0 + ? scan_hexadecimal_int(store_char(width, ib, c$0), ib) + : scan_decimal_digit_star(width, ib); + case 3: + return scan_octal_int(width$1, ib); + case 4: + return scan_decimal_digit_plus(width$1, ib); + default: return scan_hexadecimal_int(width$1, ib); + } + } + function scan_fractional_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + return ib[1] + ? width + : 9 + < c - 48 >>> 0 + ? width + : scan_decimal_digit_star(store_char(width, ib, c), ib); + } + function scan_exponent_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(69 !== c && 101 !== c) return width; + return scan_optionally_signed_decimal(store_char(width, ib, c), ib); + } + function scan_float(width$1, precision, ib){ + var + width = scan_sign(width$1, ib), + width$0 = scan_decimal_digit_star(width, ib); + if(0 === width$0) return [0, width$0, precision]; + var c = peek_char(ib); + if(ib[1]) return [0, width$0, precision]; + if(46 !== c) return [0, scan_exponent_part(width$0, ib), precision]; + var + width$2 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$2, precision), + width$3 = + width$2 - (precision$0 - scan_fractional_part(precision$0, ib) | 0) | 0; + return [0, scan_exponent_part(width$3, ib), precision$0]; + } + function check_case_insensitive_string(width, ib, error, str){ + function lowercase(c){ + return 25 < c - 65 >>> 0 + ? c + : caml_call1(Stdlib[29], (c - 65 | 0) + 97 | 0); + } + var + len = caml_ml_string_length(str), + width$0 = [0, width], + _aT_ = len - 1 | 0, + _aS_ = 0; + if(_aT_ >= 0){ + var i = _aS_; + for(;;){ + var c = peek_char(ib), _aU_ = lowercase(caml_string_get(str, i)); + if(lowercase(c) !== _aU_) caml_call1(error, 0); + if(0 === width$0[1]) caml_call1(error, 0); + width$0[1] = store_char(width$0[1], ib, c); + var _aV_ = i + 1 | 0; + if(_aT_ !== i){var i = _aV_; continue;} + break; + } + } + return width$0[1]; + } + function scan_hex_float(width, precision, ib){ + var _aF_ = 0 === width ? 1 : 0, _aG_ = _aF_ || end_of_input(ib); + if(_aG_) bad_hex_float(0); + var + width$0 = scan_sign(width, ib), + _aH_ = 0 === width$0 ? 1 : 0, + _aI_ = _aH_ || end_of_input(ib); + if(_aI_) bad_hex_float(0); + var c = peek_char(ib), switch$0 = 0; + if(78 <= c){ + var switcher = c - 79 | 0; + if(30 < switcher >>> 0){ + if(32 > switcher){ + var + width$1 = store_char(width$0, ib, c), + _aJ_ = 0 === width$1 ? 1 : 0, + _aK_ = _aJ_ || end_of_input(ib); + if(_aK_) bad_hex_float(0); + return check_case_insensitive_string + (width$1, ib, bad_hex_float, cst_an); + } + } + else if(26 === switcher) switch$0 = 1; + } + else{ + if(48 === c){ + var + width$3 = store_char(width$0, ib, c), + _aN_ = 0 === width$3 ? 1 : 0, + _aO_ = _aN_ || end_of_input(ib); + if(_aO_) bad_hex_float(0); + var + width$4 = + check_case_insensitive_string(width$3, ib, bad_hex_float, cst_x); + if(0 !== width$4 && ! end_of_input(ib)){ + var _aP_ = peek_char(ib) - 46 | 0, switch$1 = 0; + if(34 < _aP_ >>> 0){ + if(66 === _aP_) switch$1 = 1; + } + else if(32 < _aP_ - 1 >>> 0) switch$1 = 1; + var width$5 = switch$1 ? width$4 : scan_hexadecimal_int(width$4, ib); + if(0 !== width$5 && ! end_of_input(ib)){ + var c$0 = peek_char(ib); + if(46 === c$0){ + var width$6 = store_char(width$5, ib, c$0), switch$2 = 0; + if(0 !== width$6 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$3 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$6, precision), + width$10 = + width$6 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$3 = 1; + } + if(! switch$3) var width$10 = width$6; + var width$7 = width$10; + switch$2 = 1; + } + if(! switch$2) var width$7 = width$6; + var width$8 = width$7; + } + else + var width$8 = width$5; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$1 = peek_char(ib); + if(80 !== c$1 && 112 !== c$1) return width$8; + var + width$9 = store_char(width$8, ib, c$1), + _aQ_ = 0 === width$9 ? 1 : 0, + _aR_ = _aQ_ || end_of_input(ib); + if(_aR_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return width$5; + } + return width$4; + } + if(73 === c) switch$0 = 1; + } + if(! switch$0) return bad_hex_float(0); + var + width$2 = store_char(width$0, ib, c), + _aL_ = 0 === width$2 ? 1 : 0, + _aM_ = _aL_ || end_of_input(ib); + if(_aM_) bad_hex_float(0); + return check_case_insensitive_string + (width$2, ib, bad_hex_float, cst_nfinity); + } + function scan_caml_float_rest(width, precision, ib){ + var _aB_ = 0 === width ? 1 : 0, _aC_ = _aB_ || end_of_input(ib); + if(_aC_) bad_float(0); + var + width$0 = scan_decimal_digit_star(width, ib), + _aD_ = 0 === width$0 ? 1 : 0, + _aE_ = _aD_ || end_of_input(ib); + if(_aE_) bad_float(0); + var c = peek_char(ib), switcher = c - 69 | 0; + if(32 < switcher >>> 0){ + if(-23 === switcher){ + var + width$1 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$1, precision), + width_precision = scan_fractional_part(precision$0, ib), + frac_width = precision$0 - width_precision | 0, + width$2 = width$1 - frac_width | 0; + return scan_exponent_part(width$2, ib); + } + } + else if(30 < switcher - 1 >>> 0) return scan_exponent_part(width$0, ib); + return bad_float(0); + } + function scan_caml_float(width, precision, ib){ + var _an_ = 0 === width ? 1 : 0, _ao_ = _an_ || end_of_input(ib); + if(_ao_) bad_float(0); + var + width$0 = scan_sign(width, ib), + _ap_ = 0 === width$0 ? 1 : 0, + _aq_ = _ap_ || end_of_input(ib); + if(_aq_) bad_float(0); + var c = peek_char(ib); + if(49 <= c){ + if(58 > c){ + var + width$1 = store_char(width$0, ib, c), + _ar_ = 0 === width$1 ? 1 : 0, + _as_ = _ar_ || end_of_input(ib); + if(_as_) bad_float(0); + return scan_caml_float_rest(width$1, precision, ib); + } + } + else if(48 <= c){ + var + width$2 = store_char(width$0, ib, c), + _at_ = 0 === width$2 ? 1 : 0, + _au_ = _at_ || end_of_input(ib); + if(_au_) bad_float(0); + var c$0 = peek_char(ib); + if(88 !== c$0 && 120 !== c$0) + return scan_caml_float_rest(width$2, precision, ib); + var + width$3 = store_char(width$2, ib, c$0), + _av_ = 0 === width$3 ? 1 : 0, + _aw_ = _av_ || end_of_input(ib); + if(_aw_) bad_float(0); + var + width$4 = scan_hexadecimal_int(width$3, ib), + _ax_ = 0 === width$4 ? 1 : 0, + _ay_ = _ax_ || end_of_input(ib); + if(_ay_) bad_float(0); + var c$1 = peek_char(ib), switcher = c$1 - 80 | 0, switch$0 = 0; + if(32 < switcher >>> 0) + if(-34 === switcher){ + var width$5 = store_char(width$4, ib, c$1), switch$1 = 0; + if(0 !== width$5 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$2 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$5, precision), + width$10 = + width$5 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$2 = 1; + } + if(! switch$2) var width$10 = width$5; + var width$6 = width$10; + switch$1 = 1; + } + if(! switch$1) var width$6 = width$5; + var width$7 = width$6; + } + else + switch$0 = 1; + else if(30 < switcher - 1 >>> 0) + var width$7 = width$4; + else + switch$0 = 1; + var width$8 = switch$0 ? bad_float(0) : width$7; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$2 = peek_char(ib); + if(80 !== c$2 && 112 !== c$2) return width$8; + var + width$9 = store_char(width$8, ib, c$2), + _az_ = 0 === width$9 ? 1 : 0, + _aA_ = _az_ || end_of_input(ib); + if(_aA_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return bad_float(0); + } + function scan_string(stp, width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(stp){ + var c$0 = stp[1]; + if(c === c$0) return skip_char(width$0, ib); + var width$1 = store_char(width$0, ib, c), width$0 = width$1; + continue; + } + var _am_ = c - 9 | 0, switch$0 = 0; + if(4 < _am_ >>> 0){ + if(23 === _am_) switch$0 = 1; + } + else if(1 < _am_ - 2 >>> 0) switch$0 = 1; + if(switch$0) return width$0; + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + } + } + function hexadecimal_value_of_char(c){ + return 97 <= c ? c - 87 | 0 : 65 <= c ? c - 55 | 0 : c - 48 | 0; + } + function check_next_char(message, width, ib){ + if(0 === width) return bad_token_length(message); + var c = peek_char(ib); + return ib[1] ? bad_input(caml_call2(Stdlib_Printf[4], _f_, message)) : c; + } + function check_next_char_for_char(_ak_, _al_){ + return check_next_char(cst_a_Char, _ak_, _al_); + } + function check_next_char_for_string(_ai_, _aj_){ + return check_next_char(cst_a_String, _ai_, _aj_); + } + function scan_backslash_char(width, ib){ + var c0 = check_next_char_for_char(width, ib), switch$0 = 0; + if(40 <= c0){ + if(58 <= c0){ + var switcher = c0 - 92 | 0; + if(28 >= switcher >>> 0) + switch(switcher){ + case 28: + var + get_digit = + function(param){ + var c = next_char(ib), _ah_ = c - 48 | 0, switch$0 = 0; + if(22 < _ah_ >>> 0){ + if(5 >= _ah_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _ah_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? c : bad_input_escape(c); + }, + c1 = get_digit(0), + c2 = get_digit(0), + _ad_ = hexadecimal_value_of_char(c2), + c$0 = (16 * hexadecimal_value_of_char(c1) | 0) + _ad_ | 0, + switch$1 = 0; + if(0 <= c$0 && 255 >= c$0){ + var _af_ = caml_call1(Stdlib[29], c$0); + switch$1 = 1; + } + if(! switch$1) + var _af_ = bad_input(caml_call3(Stdlib_Printf[4], _m_, c1, c2)); + return store_char(width - 2 | 0, ib, _af_); + case 0: + case 6: + case 18: + case 22: + case 24: + switch$0 = 1; break; + } + } + else if(48 <= c0){ + var + get_digit$0 = + function(param){ + var c = next_char(ib); + return 9 < c - 48 >>> 0 ? bad_input_escape(c) : c; + }, + c1$0 = get_digit$0(0), + c2$0 = get_digit$0(0), + c = + ((100 * (c0 - 48 | 0) | 0) + (10 * (c1$0 - 48 | 0) | 0) | 0) + + (c2$0 - 48 | 0) + | 0, + switch$2 = 0; + if(0 <= c && 255 >= c){ + var _ag_ = caml_call1(Stdlib[29], c); + switch$2 = 1; + } + if(! switch$2) + var + _ag_ = bad_input(caml_call4(Stdlib_Printf[4], _l_, c0, c1$0, c2$0)); + return store_char(width - 2 | 0, ib, _ag_); + } + } + else if(34 === c0 || 39 <= c0) switch$0 = 1; + if(! switch$0) return bad_input_escape(c0); + var switch$3 = 0; + if(110 <= c0) + if(117 <= c0) + switch$3 = 1; + else + switch(c0 - 110 | 0){ + case 0: + var _ae_ = 10; break; + case 4: + var _ae_ = 13; break; + case 6: + var _ae_ = 9; break; + default: switch$3 = 1; + } + else if(98 === c0) var _ae_ = 8; else switch$3 = 1; + if(switch$3) var _ae_ = c0; + return store_char(width, ib, _ae_); + } + function scan_caml_string(width, ib){ + function find_stop$0(counter, width){ + var width$0 = width; + for(;;){ + var c = check_next_char_for_string(width$0, ib); + if(34 === c) return ignore_char(width$0, ib); + if(92 !== c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + var + width$1 = ignore_char(width$0, ib), + match = check_next_char_for_string(width$1, ib); + if(10 === match){ + var _ab_ = ignore_char(width$1, ib); + if(counter >= 50) + return caml_trampoline_return(skip_spaces, [0, _ab_]); + var counter$0 = counter + 1 | 0; + return skip_spaces(counter$0, _ab_); + } + if(13 !== match){ + var width$4 = scan_backslash_char(width$1, ib), width$0 = width$4; + continue; + } + var width$3 = ignore_char(width$1, ib); + if(10 !== check_next_char_for_string(width$3, ib)){ + var width$5 = store_char(width$3, ib, 13), width$0 = width$5; + continue; + } + var _ac_ = ignore_char(width$3, ib); + if(counter >= 50) return caml_trampoline_return(skip_spaces, [0, _ac_]); + var counter$1 = counter + 1 | 0; + return skip_spaces(counter$1, _ac_); + } + } + function skip_spaces(counter, width){ + var width$0 = width; + for(;;){ + if(32 === check_next_char_for_string(width$0, ib)){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + if(counter >= 50) + return caml_trampoline_return(find_stop$0, [0, width$0]); + var counter$0 = counter + 1 | 0; + return find_stop$0(counter$0, width$0); + } + } + function find_stop(width){return caml_trampoline(find_stop$0(0, width));} + var c = checked_peek_char(ib); + return 34 === c + ? find_stop(ignore_char(width, ib)) + : character_mismatch(34, c); + } + function scan_chars_in_char_set(char_set, scan_indic, width, ib){ + function scan_chars(i, stp){ + var i$0 = i; + for(;;){ + var c = peek_char(ib), _Z_ = 0 < i$0 ? 1 : 0; + if(_Z_){ + var ___ = 1 - ib[1]; + if(___) + var + _$_ = caml_call2(CamlinternalFormat[1], char_set, c), + _aa_ = _$_ ? c !== stp ? 1 : 0 : _$_; + else + var _aa_ = ___; + } + else + var _aa_ = _Z_; + if(! _aa_) return _aa_; + store_char(Stdlib[19], ib, c); + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + if(! scan_indic) return scan_chars(width, -1); + var c = scan_indic[1]; + scan_chars(width, c); + var _Y_ = 1 - ib[1]; + if(! _Y_) return _Y_; + var ci = peek_char(ib); + return c === ci ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function scanf_bad_input(ib, x){ + if(x[1] === Scan_failure) + var s = x[2]; + else{ + if(x[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(x, 1); + var s = x[2]; + } + var i = char_count(ib); + return bad_input(caml_call3(Stdlib_Printf[4], _o_, i, s)); + } + function width_of_pad_opt(pad_opt){ + if(! pad_opt) return Stdlib[19]; + var width = pad_opt[1]; + return width; + } + function stopper_of_formatting_lit(fmting){ + if(6 === fmting) return _p_; + var + str = caml_call1(CamlinternalFormat[17], fmting), + stp = caml_string_get(str, 1), + sub_str = + caml_call3 + (Stdlib_String[15], str, 2, caml_ml_string_length(str) - 2 | 0); + return [0, stp, sub_str]; + } + function take_format_readers$0(counter, k, fmt){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k, 0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], fmt$0 = rest; continue; + case 1: + var rest$0 = fmt$0[1], fmt$0 = rest$0; continue; + case 2: + var rest$1 = fmt$0[2], fmt$0 = rest$1; continue; + case 3: + var rest$2 = fmt$0[2], fmt$0 = rest$2; continue; + case 4: + var rest$3 = fmt$0[4], fmt$0 = rest$3; continue; + case 5: + var rest$4 = fmt$0[4], fmt$0 = rest$4; continue; + case 6: + var rest$5 = fmt$0[4], fmt$0 = rest$5; continue; + case 7: + var rest$6 = fmt$0[4], fmt$0 = rest$6; continue; + case 8: + var rest$7 = fmt$0[4], fmt$0 = rest$7; continue; + case 9: + var rest$8 = fmt$0[2], fmt$0 = rest$8; continue; + case 10: + var rest$9 = fmt$0[1], fmt$0 = rest$9; continue; + case 11: + var rest$10 = fmt$0[2], fmt$0 = rest$10; continue; + case 12: + var rest$11 = fmt$0[2], fmt$0 = rest$11; continue; + case 13: + var rest$12 = fmt$0[3], fmt$0 = rest$12; continue; + case 14: + var + rest$13 = fmt$0[3], + fmtty = fmt$0[2], + _V_ = caml_call1(CamlinternalFormat[21], fmtty), + _W_ = caml_call1(CamlinternalFormatBasics[2], _V_); + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, _W_, rest$13]); + var counter$0 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$0, k, _W_, rest$13); + case 15: + var rest$14 = fmt$0[1], fmt$0 = rest$14; continue; + case 16: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 17: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 18: + var _X_ = fmt$0[1]; + if(0 === _X_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _X_[1][1], + fmt$2 = caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$17), + fmt$0 = fmt$2; + continue; + } + var + rest$18 = fmt$0[2], + fmt$3 = _X_[1][1], + fmt$4 = caml_call2(CamlinternalFormatBasics[3], fmt$3, rest$18), + fmt$0 = fmt$4; + continue; + case 19: + var fmt_rest = fmt$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, fmt_rest);}; + case 20: + var rest$19 = fmt$0[3], fmt$0 = rest$19; continue; + case 21: + var rest$20 = fmt$0[2], fmt$0 = rest$20; continue; + case 22: + var rest$21 = fmt$0[1], fmt$0 = rest$21; continue; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, rest$22);}; + default: var fmt$0 = rest$22; continue; + } + switch(ign[0]){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + var fmt$0 = rest$22; continue; + case 3: + var fmt$0 = rest$22; continue; + case 4: + var fmt$0 = rest$22; continue; + case 5: + var fmt$0 = rest$22; continue; + case 6: + var fmt$0 = rest$22; continue; + case 7: + var fmt$0 = rest$22; continue; + case 8: + var fmt$0 = rest$22; continue; + case 9: + var fmtty$0 = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, fmtty$0, rest$22]); + var counter$1 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$1, k, fmtty$0, rest$22); + case 10: + var fmt$0 = rest$22; continue; + default: var fmt$0 = rest$22; continue; + } + default: var rest$23 = fmt$0[3], fmt$0 = rest$23; continue; + } + } + } + function take_fmtty_format_readers$0(counter, k, fmtty, fmt){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 !== "number") + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 1: + var fmtty$2 = fmtty$0[1], fmtty$0 = fmtty$2; continue; + case 2: + var fmtty$3 = fmtty$0[1], fmtty$0 = fmtty$3; continue; + case 3: + var fmtty$4 = fmtty$0[1], fmtty$0 = fmtty$4; continue; + case 4: + var fmtty$5 = fmtty$0[1], fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$6 = fmtty$0[1], fmtty$0 = fmtty$6; continue; + case 6: + var fmtty$7 = fmtty$0[1], fmtty$0 = fmtty$7; continue; + case 7: + var fmtty$8 = fmtty$0[1], fmtty$0 = fmtty$8; continue; + case 8: + var fmtty$9 = fmtty$0[2], fmtty$0 = fmtty$9; continue; + case 9: + var + rest = fmtty$0[3], + ty2 = fmtty$0[2], + ty1 = fmtty$0[1], + _U_ = caml_call1(CamlinternalFormat[21], ty1), + ty = caml_call2(CamlinternalFormat[22], _U_, ty2), + fmtty$10 = caml_call2(CamlinternalFormatBasics[1], ty, rest), + fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1], fmtty$0 = fmtty$11; continue; + case 11: + var fmtty$12 = fmtty$0[1], fmtty$0 = fmtty$12; continue; + case 12: + var fmtty$13 = fmtty$0[1], fmtty$0 = fmtty$13; continue; + case 13: + var fmt_rest = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest, fmt);}; + default: + var fmt_rest$0 = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest$0, fmt);}; + } + if(counter >= 50) + return caml_trampoline_return(take_format_readers$0, [0, k, fmt]); + var counter$0 = counter + 1 | 0; + return take_format_readers$0(counter$0, k, fmt); + } + } + function take_format_readers(k, fmt){ + return caml_trampoline(take_format_readers$0(0, k, fmt)); + } + function take_fmtty_format_readers(k, fmtty, fmt){ + return caml_trampoline(take_fmtty_format_readers$0(0, k, fmtty, fmt)); + } + function pad_prec_scanf(ib, fmt, readers, pad, prec, scan, token){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var p = prec[1]; + caml_call3(scan, Stdlib[19], p, ib); + var x$0 = caml_call1(token, ib); + return [0, x$0, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion); + caml_call3(scan, Stdlib[19], Stdlib[19], ib); + var x = caml_call1(token, ib); + return [0, x, make_scanf(ib, fmt, readers)]; + } + if(0 !== pad[0]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$2); + if(! pad[1]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$1); + var w = pad[2]; + if(typeof prec !== "number"){ + var p$0 = prec[1]; + caml_call3(scan, w, p$0, ib); + var x$2 = caml_call1(token, ib); + return [0, x$2, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$0); + caml_call3(scan, w, Stdlib[19], ib); + var x$1 = caml_call1(token, ib); + return [0, x$1, make_scanf(ib, fmt, readers)]; + } + function make_scanf(ib, fmt, readers){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + store_char(0, ib, checked_peek_char(ib)); + var c$1 = token_char(ib); + return [0, c$1, make_scanf(ib, rest, readers)]; + case 1: + var + rest$0 = fmt$0[1], + width$0 = 0, + find_stop = + function(width){ + var c = check_next_char_for_char(width, ib); + return 39 === c + ? ignore_char(width, ib) + : character_mismatch(39, c); + }, + c = checked_peek_char(ib); + if(39 === c){ + var + width = ignore_char(width$0, ib), + c$0 = check_next_char_for_char(width, ib); + if(92 === c$0) + find_stop(scan_backslash_char(ignore_char(width, ib), ib)); + else + find_stop(store_char(width, ib, c$0)); + } + else + character_mismatch(39, c); + var c$2 = token_char(ib); + return [0, c$2, make_scanf(ib, rest$0, readers)]; + case 2: + var pad = fmt$0[1], match = fmt$0[2]; + if(typeof match !== "number") + switch(match[0]){ + case 17: + var + rest$2 = match[2], + fmting_lit = match[1], + match$0 = stopper_of_formatting_lit(fmting_lit), + str = match$0[2], + stp = match$0[1], + scan$0 = + function(width, param, ib){ + return scan_string([0, stp], width, ib); + }, + str_rest = [11, str, rest$2]; + return pad_prec_scanf + (ib, str_rest, readers, pad, 0, scan$0, token_string); + case 18: + var _G_ = match[1]; + if(0 === _G_[0]){ + var + rest$3 = match[2], + fmt$1 = _G_[1][1], + scan$1 = + function(width, param, ib){ + return scan_string(_q_, width, ib); + }; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$3), + readers, + pad, + 0, + scan$1, + token_string); + } + var + rest$4 = match[2], + fmt$2 = _G_[1][1], + scan$2 = + function(width, param, ib){return scan_string(_r_, width, ib);}; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$2, rest$4), + readers, + pad, + 0, + scan$2, + token_string); + } + var + rest$1 = fmt$0[2], + scan = function(width, param, ib){return scan_string(0, width, ib);}; + return pad_prec_scanf(ib, rest$1, readers, pad, 0, scan, token_string); + case 3: + var + rest$5 = fmt$0[2], + pad$0 = fmt$0[1], + scan$3 = + function(width, param, ib){return scan_caml_string(width, ib);}; + return pad_prec_scanf + (ib, rest$5, readers, pad$0, 0, scan$3, token_string); + case 4: + var + rest$6 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1], + conv = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv)), + scan$4 = + function(width, param, ib){ + return scan_int_conversion(conv, width, ib); + }; + return pad_prec_scanf + (ib, + rest$6, + readers, + pad$1, + prec, + scan$4, + function(ib){ + return caml_int_of_string(token_int_literal(conv, ib)); + }); + case 5: + var + rest$7 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1], + conv$0 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$0)), + scan$5 = + function(width, param, ib){ + return scan_int_conversion(conv$0, width, ib); + }; + return pad_prec_scanf + (ib, + rest$7, + readers, + pad$2, + prec$0, + scan$5, + function(ib){ + return caml_int_of_string(token_int_literal(conv$0, ib)); + }); + case 6: + var + rest$8 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1], + conv$1 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$1)), + scan$6 = + function(width, param, ib){ + return scan_int_conversion(conv$1, width, ib); + }; + return pad_prec_scanf + (ib, + rest$8, + readers, + pad$3, + prec$1, + scan$6, + function(ib){ + return caml_int_of_string(token_int_literal(conv$1, ib)); + }); + case 7: + var + rest$9 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1], + conv$2 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$2)), + scan$7 = + function(width, param, ib){ + return scan_int_conversion(conv$2, width, ib); + }; + return pad_prec_scanf + (ib, + rest$9, + readers, + pad$4, + prec$2, + scan$7, + function(ib){ + return runtime.caml_int64_of_string + (token_int_literal(conv$2, ib)); + }); + case 8: + switch(fmt$0[1][2]){ + case 5: + case 8: + var rest$11 = fmt$0[4], prec$4 = fmt$0[3], pad$6 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$11, + readers, + pad$6, + prec$4, + scan_caml_float, + token_float); + case 6: + case 7: + var rest$12 = fmt$0[4], prec$5 = fmt$0[3], pad$7 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$12, + readers, + pad$7, + prec$5, + scan_hex_float, + token_float); + default: + var rest$10 = fmt$0[4], prec$3 = fmt$0[3], pad$5 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$10, + readers, + pad$5, + prec$3, + scan_float, + token_float); + } + case 9: + var + rest$13 = fmt$0[2], + pad$8 = fmt$0[1], + scan$8 = + function(param, _T_, ib){ + var + c = checked_peek_char(ib), + m = + 102 === c + ? 5 + : 116 + === c + ? 4 + : bad_input(caml_call2(Stdlib_Printf[4], _n_, c)); + return scan_string(0, m, ib); + }; + return pad_prec_scanf + (ib, rest$13, readers, pad$8, 0, scan$8, token_bool); + case 10: + var rest$14 = fmt$0[1]; + if(! end_of_input(ib)) return bad_input(cst_end_of_input_not_found); + var fmt$0 = rest$14; + continue; + case 11: + var + rest$15 = fmt$0[2], + str$0 = fmt$0[1], + _H_ = function(_S_){return check_char(ib, _S_);}; + caml_call2(Stdlib_String[29], _H_, str$0); + var fmt$0 = rest$15; + continue; + case 12: + var rest$16 = fmt$0[2], chr = fmt$0[1]; + check_char(ib, chr); + var fmt$0 = rest$16; + continue; + case 13: + var rest$17 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt), ib); + var s = token_string(ib); + try{ + var _I_ = caml_call2(CamlinternalFormat[14], s, fmtty), fmt$3 = _I_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt$3 = bad_input(msg); + } + return [0, fmt$3, make_scanf(ib, rest$17, readers)]; + case 14: + var rest$18 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt$0), ib); + var s$0 = token_string(ib); + try{ + var + fmt$6 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + fmt$7 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + _K_ = caml_call1(CamlinternalFormat[21], fmtty$0), + _L_ = caml_call1(CamlinternalFormatBasics[2], _K_), + fmt$8 = caml_call2(CamlinternalFormat[12], fmt$7, _L_), + _M_ = caml_call1(CamlinternalFormatBasics[2], fmtty$0), + _N_ = caml_call2(CamlinternalFormat[12], fmt$6, _M_), + fmt$5 = fmt$8, + fmt$4 = _N_; + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(exn$0, 0); + var + msg$0 = exn$0[2], + _J_ = bad_input(msg$0), + fmt$5 = _J_[2], + fmt$4 = _J_[1]; + } + return [0, + [0, fmt$4, s$0], + make_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$5, rest$18), + readers)]; + case 15: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_a); + case 16: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_t); + case 17: + var + rest$19 = fmt$0[2], + formatting_lit = fmt$0[1], + _O_ = caml_call1(CamlinternalFormat[17], formatting_lit), + _P_ = function(_R_){return check_char(ib, _R_);}; + caml_call2(Stdlib_String[29], _P_, _O_); + var fmt$0 = rest$19; + continue; + case 18: + var _Q_ = fmt$0[1]; + if(0 === _Q_[0]){ + var rest$20 = fmt$0[2], fmt$9 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 123); + var + fmt$10 = caml_call2(CamlinternalFormatBasics[3], fmt$9, rest$20), + fmt$0 = fmt$10; + continue; + } + var rest$21 = fmt$0[2], fmt$11 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 91); + var + fmt$12 = caml_call2(CamlinternalFormatBasics[3], fmt$11, rest$21), + fmt$0 = fmt$12; + continue; + case 19: + var fmt_rest = fmt$0[1]; + if(! readers) return caml_call1(Stdlib[1], cst_scanf_missing_reader); + var + readers_rest = readers[2], + reader = readers[1], + x = caml_call1(reader, ib); + return [0, x, make_scanf(ib, fmt_rest, readers_rest)]; + case 20: + var width_opt = fmt$0[1], match$1 = fmt$0[3]; + if(typeof match$1 !== "number" && 17 === match$1[0]){ + var + rest$23 = match$1[2], + fmting_lit$0 = match$1[1], + char_set$0 = fmt$0[2], + match$2 = stopper_of_formatting_lit(fmting_lit$0), + str$1 = match$2[2], + stp$0 = match$2[1], + width$2 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set$0, [0, stp$0], width$2, ib); + var s$2 = token_string(ib), str_rest$0 = [11, str$1, rest$23]; + return [0, s$2, make_scanf(ib, str_rest$0, readers)]; + } + var + rest$22 = fmt$0[3], + char_set = fmt$0[2], + width$1 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set, 0, width$1, ib); + var s$1 = token_string(ib); + return [0, s$1, make_scanf(ib, rest$22, readers)]; + case 21: + var rest$24 = fmt$0[2], counter = fmt$0[1]; + switch(counter){ + case 0: + var count = ib[5]; break; + case 1: + var count = char_count(ib); break; + default: var count = ib[6]; + } + return [0, count, make_scanf(ib, rest$24, readers)]; + case 22: + var rest$25 = fmt$0[1], c$3 = checked_peek_char(ib); + return [0, c$3, make_scanf(ib, rest$25, readers)]; + case 23: + var + rest$26 = fmt$0[2], + ign = fmt$0[1], + fmt$13 = caml_call2(CamlinternalFormat[6], ign, rest$26)[1], + match$3 = make_scanf(ib, fmt$13, readers); + if(! match$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + var arg_rest = match$3[2]; + return arg_rest; + default: return caml_call1(Stdlib[1], cst_scanf_bad_conversion_custo); + } + } + } + function kscanf_gen(ib, ef, af, param){ + var str = param[2], fmt = param[1]; + function k(readers, f$1){ + caml_call1(Stdlib_Buffer[9], ib[8]); + try{var args$1 = make_scanf(ib, fmt, readers);} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0); + if + (exc[1] !== Scan_failure && exc[1] !== Stdlib[7] && exc !== Stdlib[12]){ + if(exc[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exc, 0); + var + msg = exc[2], + _C_ = caml_call1(Stdlib_String[24], str), + _D_ = caml_call2(Stdlib[28], _C_, cst$0), + _E_ = caml_call2(Stdlib[28], cst_in_format, _D_), + _F_ = caml_call2(Stdlib[28], msg, _E_); + return caml_call1(Stdlib[1], _F_); + } + return caml_call2(ef, ib, exc); + } + var f = f$1, args = args$1; + for(;;){ + if(! args) return caml_call1(af, f); + var + args$0 = args[2], + x = args[1], + f$0 = caml_call1(f, x), + f = f$0, + args = args$0; + } + } + return take_format_readers(k, fmt); + } + function kscanf(ib, ef, fmt){ + return kscanf_gen(ib, ef, function(x){return x;}, fmt); + } + function kscanf_opt(ib, fmt){ + function _A_(x){return [0, x];} + return kscanf_gen(ib, function(param, _B_){return 0;}, _A_, fmt); + } + function bscanf(ib, fmt){return kscanf(ib, scanf_bad_input, fmt);} + function bscanf_opt(ib, fmt){return kscanf_opt(ib, fmt);} + function ksscanf(s, ef, fmt){return kscanf(from_string(s), ef, fmt);} + function sscanf(s, fmt){ + return kscanf(from_string(s), scanf_bad_input, fmt); + } + function sscanf_opt(s, fmt){return kscanf_opt(from_string(s), fmt);} + function scanf(fmt){return kscanf(stdin, scanf_bad_input, fmt);} + function scanf_opt(fmt){return kscanf_opt(stdin, fmt);} + function bscanf_format(ib, format, f){ + scan_caml_string(Stdlib[19], ib); + var str = token_string(ib); + try{var _z_ = caml_call2(CamlinternalFormat[15], str, format), fmt = _z_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt = bad_input(msg); + } + return caml_call1(f, fmt); + } + function sscanf_format(s, format, f){ + return bscanf_format(from_string(s), format, f); + } + function format_from_string(s, fmt){ + function _w_(x){return x;} + var + _x_ = caml_call1(Stdlib_String[24], s), + _y_ = caml_call2(Stdlib[28], _x_, cst$1); + return sscanf_format(caml_call2(Stdlib[28], cst$2, _y_), fmt, _w_); + } + function unescaped(s){ + function _u_(x){return x;} + var _v_ = caml_call2(Stdlib[28], s, cst$3); + return caml_call1(sscanf(caml_call2(Stdlib[28], cst$4, _v_), _t_), _u_); + } + var + Stdlib_Scanf = + [0, + [0, + stdin, + open_in, + open_in_bin, + close_in, + open_in, + open_in_bin, + from_string, + from_function, + from_channel, + end_of_input, + beginning_of_input, + name_of_input], + Scan_failure, + bscanf, + bscanf_opt, + sscanf, + sscanf_opt, + scanf, + scanf_opt, + kscanf, + ksscanf, + bscanf_format, + sscanf_format, + format_from_string, + unescaped]; + runtime.caml_register_global(64, Stdlib_Scanf, "Stdlib__Scanf"); + return; + } + (globalThis)); + +//# 22718 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_register_named_value = runtime.caml_register_named_value, + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + register = caml_register_named_value; + function register_exception(name, exn){ + var + _a_ = Stdlib_Obj[10], + slot = runtime.caml_obj_tag(exn) === _a_ ? exn : exn[1]; + return caml_register_named_value(name, slot); + } + var Stdlib_Callback = [0, register, register_exception]; + runtime.caml_register_global(1, Stdlib_Callback, "Stdlib__Callback"); + return; + } + (globalThis)); + +//# 23686 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, 0], + _b_ = [0, 0], + _a_ = [0, 0]; + function MakeSeeded(H){ + var + prng = [246, function(_aM_){return caml_call1(Stdlib_Random[15][2], 0);}]; + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Hashtbl[17], 0); + var x = 16; + for(;;){ + if(initial_size > x && Stdlib_Sys[13] >= (x * 2 | 0)){var x$0 = x * 2 | 0, x = x$0; continue;} + if(random){ + var _aK_ = runtime.caml_obj_tag(prng); + if(250 === _aK_) + var _aL_ = prng[1]; + else{ + var switch$0 = 0; + if(246 !== _aK_ && 244 !== _aK_){var _aL_ = prng; switch$0 = 1;} + if(! switch$0) var _aL_ = caml_call1(CamlinternalLazy[2], prng); + } + var seed = caml_call1(Stdlib_Random[15][4], _aL_); + } + else + var seed = 0; + return [0, 0, caml_make_vect(x, 0), seed, x]; + } + } + function clear(h){ + h[1] = 0; + var len = h[2].length - 1, _aI_ = len - 1 | 0, _aH_ = 0; + if(_aI_ >= 0){ + var i = _aH_; + for(;;){ + caml_check_bound(h[2], i)[1 + i] = 0; + var _aJ_ = i + 1 | 0; + if(_aI_ !== i){var i = _aJ_; continue;} + break; + } + } + return 0; + } + function reset(h){ + var len = h[2].length - 1; + return len === h[4] + ? clear(h) + : (h[1] = 0, h[2] = caml_make_vect(h[4], 0), 0); + } + function copy(h){ + var _aE_ = h[4], _aF_ = h[3], _aG_ = caml_call1(Stdlib_Array[6], h[2]); + return [0, h[1], _aG_, _aF_, _aE_]; + } + function key_index(h, hkey){return hkey & (h[2].length - 1 - 1 | 0);} + function clean(h){ + function do_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hkey = param$0[1], rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var rest$0 = param$0[3], c$0 = param$0[2]; + return [0, hkey, c$0, do_bucket(rest$0)]; + } + h[1] = h[1] - 1 | 0; + var param$0 = rest; + } + } + var d = h[2], _aC_ = d.length - 1 - 1 | 0, _aB_ = 0; + if(_aC_ >= 0){ + var i = _aB_; + for(;;){ + d[1 + i] = do_bucket(caml_check_bound(d, i)[1 + i]); + var _aD_ = i + 1 | 0; + if(_aC_ !== i){var i = _aD_; continue;} + break; + } + } + return 0; + } + function resize(h){ + var odata = h[2], osize = odata.length - 1, nsize = osize * 2 | 0; + clean(h); + var + _av_ = nsize < Stdlib_Sys[13] ? 1 : 0, + _aw_ = _av_ ? (osize >>> 1 | 0) <= h[1] ? 1 : 0 : _av_; + if(_aw_){ + var ndata = caml_make_vect(nsize, 0); + h[2] = ndata; + var + insert_bucket = + function(param){ + if(! param) return 0; + var rest = param[3], data = param[2], hkey = param[1]; + insert_bucket(rest); + var nidx = key_index(h, hkey); + ndata[1 + nidx] = + [0, hkey, data, caml_check_bound(ndata, nidx)[1 + nidx]]; + return 0; + }, + _ay_ = osize - 1 | 0, + _ax_ = 0; + if(_ay_ >= 0){ + var i = _ax_; + for(;;){ + insert_bucket(caml_check_bound(odata, i)[1 + i]); + var _aA_ = i + 1 | 0; + if(_ay_ !== i){var i = _aA_; continue;} + break; + } + } + var _az_ = 0; + } + else + var _az_ = _aw_; + return _az_; + } + function add(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + container = caml_call2(H[1], key, info), + bucket = [0, hkey, container, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _au_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _au_ ? resize(h) : _au_; + } + function remove(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function remove_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], next = param$0[3], c = param$0[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + h[1] = h[1] - 1 | 0; return next; + case 1: + return [0, hk, c, remove_bucket(next)]; + default: h[1] = h[1] - 1 | 0; var param$0 = next; continue; + } + var next$0 = param$0[3], c$0 = param$0[2]; + return [0, hk, c$0, remove_bucket(next$0)]; + } + } + var + i = key_index(h, hkey), + _at_ = remove_bucket(caml_check_bound(h[2], i)[1 + i]); + caml_check_bound(h[2], i)[1 + i] = _at_; + return 0; + } + function find(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _as_ = key_index(h, hkey), + param = caml_check_bound(h[2], _as_)[1 + _as_]; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], rest = param[3], c = param[2]; + if(hkey !== hk){var rest$0 = param[3], param = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return d;} + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + } + } + function find_opt(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _ar_ = key_index(h, hkey), + param = caml_check_bound(h[2], _ar_)[1 + _ar_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + var d = caml_call1(H[4], c); + if(d) return d; + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + var rest$0 = param[3], param = rest$0; + } + } + function find_all(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], rest = param$0[3], c = param$0[2]; + if(hkey !== hk){var rest$0 = param$0[3], param$0 = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return [0, d, find_in_bucket(rest)];} + var param$0 = rest; + continue; + case 1: + var param$0 = rest; continue; + default: var param$0 = rest; continue; + } + } + } + var _aq_ = key_index(h, hkey); + return find_in_bucket(caml_check_bound(h[2], _aq_)[1 + _aq_]); + } + function replace(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + l = caml_check_bound(h[2], i)[1 + i]; + try{ + var param = l; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], next = param[3], c = param[2]; + if(hkey !== hk){var next$0 = param[3], param = next$0; continue;} + if(caml_call2(H[3], c, key)){var param = next; continue;} + var _am_ = caml_call3(H[5], c, key, info); + return _am_; + } + } + catch(_ap_){ + var _an_ = caml_wrap_exception(_ap_); + if(_an_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_an_, 0); + var container = caml_call2(H[1], key, info); + caml_check_bound(h[2], i)[1 + i] = [0, hkey, container, l]; + h[1] = h[1] + 1 | 0; + var _ao_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _ao_ ? resize(h) : _ao_; + } + } + function mem(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _al_ = key_index(h, hkey), + param = caml_check_bound(h[2], _al_)[1 + _al_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hk !== hkey){var rest$0 = param[3], param = rest$0; continue;} + if(! caml_call2(H[3], c, key)) return 1; + var param = rest; + } + } + function length(h){return h[1];} + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + rest = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = rest; + } + } + function stats(h){ + var _af_ = h[2], _ag_ = 0; + function _ah_(m, b){ + var _ak_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _ak_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ah_, _ag_, _af_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ai_ = h[2]; + function _aj_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _aj_, _ai_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function bucket_length_alive(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var accu$1 = accu$0 + 1 | 0, accu$0 = accu$1, param$0 = rest; + continue; + } + var rest$0 = param$0[3], param$0 = rest$0; + } + } + function stats_alive(h){ + var size = [0, 0], _$_ = h[2], _aa_ = 0; + function _ab_(m, b){ + var _ae_ = bucket_length_alive(0, b); + return caml_call2(Stdlib_Int[11], m, _ae_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ab_, _aa_, _$_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ac_ = h[2]; + function _ad_(b){ + var l = bucket_length_alive(0, b); + size[1] = size[1] + l | 0; + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _ad_, _ac_); + return [0, size[1], h[2].length - 1, mbl, histo]; + } + function add_seq(tbl, i){ + function ___(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], ___, i); + } + function replace_seq(tbl, i){ + function _Z_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _Z_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function create(param){return caml_call1(Stdlib_Obj[24][1], 1);} + function get_key(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function check_key(t){return caml_call2(Stdlib_Obj[24][7], t, 0);} + function get_data(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make(key, data){ + var eph = create(0); + set_data(eph, data); + set_key(eph, key); + return eph; + } + function query(eph, key){ + var match = get_key(eph); + if(! match) return 0; + var k = match[1]; + return k === key ? get_data(eph) : 0; + } + function MakeSeeded$0(H){ + function create$0(k, d){ + var c = create(0); + set_data(c, d); + set_key(c, k); + return c; + } + var seeded_hash = H[2]; + function equal(c, k){ + var match = get_key(c); + if(! match) return 2; + var k$0 = match[1]; + return caml_call2(H[1], k, k$0) ? 0 : 1; + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + set_key(c, k); + return set_data(c, d); + } + return MakeSeeded + ([0, + create$0, + seeded_hash, + equal, + get_data, + set_key_data, + check_key]); + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$0([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _Y_ = include[1]; + function create(sz){return caml_call2(_Y_, _a_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$0(param){return [0, 0];} + function add(b, k, d){ + var _X_ = b[1]; + b[1] = [0, make(k, d), _X_]; + return 0; + } + function test_key(k, e){ + var match = get_key(e); + if(match){var x = match[1]; if(x === k) return 1;} + return 0; + } + function remove(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_key(k, h)){b[1] = caml_call2(Stdlib_List[12], acc, t); return 0;} + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find(b, k){ + var _U_ = b[1]; + function _V_(_W_){return test_key(k, _W_);} + var match = caml_call2(Stdlib_List[39], _V_, _U_); + if(! match) return 0; + var e = match[1]; + return get_data(e); + } + function length(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear(b){b[1] = 0; return 0;} + function create$0(param){return caml_call1(Stdlib_Obj[24][1], 2);} + function get_key1(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key1(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function get_key2(t){return caml_call2(Stdlib_Obj[24][3], t, 1);} + function set_key2(t, k){return caml_call3(Stdlib_Obj[24][5], t, 1, k);} + function get_data$0(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$0(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$1(key1, key2, data){ + var eph = create$0(0); + set_data$0(eph, data); + set_key1(eph, key1); + set_key2(eph, key2); + return eph; + } + function query$0(eph, key1, key2){ + var match = get_key1(eph); + if(! match) return 0; + var k = match[1]; + if(k !== key1) return 0; + var match$0 = get_key2(eph); + if(! match$0) return 0; + var k$0 = match$0[1]; + return k$0 === key2 ? get_data$0(eph) : 0; + } + function MakeSeeded$1(H1, H2){ + function create(param, d){ + var k2 = param[2], k1 = param[1], c = create$0(0); + set_data$0(c, d); + set_key1(c, k1); + set_key2(c, k2); + return c; + } + function seeded_hash(seed, param){ + var + k2 = param[2], + k1 = param[1], + _T_ = caml_call2(H2[2], seed, k2) * 65599 | 0; + return caml_call2(H1[2], seed, k1) + _T_ | 0; + } + function equal(c, param){ + var + k2 = param[2], + k1 = param[1], + match = get_key1(c), + match$0 = get_key2(c); + if(match && match$0){ + var k2$0 = match$0[1], k1$0 = match[1]; + if(caml_call2(H1[1], k1, k1$0) && caml_call2(H2[1], k2, k2$0)) return 0; + return 1; + } + return 2; + } + function set_key_data(c, param, d){ + var k2 = param[2], k1 = param[1]; + caml_call1(Stdlib_Obj[24][12], c); + set_key1(c, k1); + set_key2(c, k2); + return set_data$0(c, d); + } + function check_key(c){ + var _S_ = caml_call2(Stdlib_Obj[24][7], c, 0); + return _S_ ? caml_call2(Stdlib_Obj[24][7], c, 1) : _S_; + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$0, + set_key_data, + check_key]); + } + function Make$0(H1, H2){ + var equal = H2[1]; + function seeded_hash(seed, x){return caml_call1(H2[2], x);} + var equal$0 = H1[1], _Q_ = [0, equal, seeded_hash]; + function seeded_hash$0(seed, x){return caml_call1(H1[2], x);} + var + include = MakeSeeded$1([0, equal$0, seeded_hash$0], _Q_), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _R_ = include[1]; + function create(sz){return caml_call2(_R_, _b_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$2(param){return [0, 0];} + function add$0(b, k1, k2, d){ + var _P_ = b[1]; + b[1] = [0, make$1(k1, k2, d), _P_]; + return 0; + } + function test_keys(k1, k2, e){ + var match = get_key1(e), match$0 = get_key2(e); + if(match && match$0){ + var x2 = match$0[1], x1 = match[1]; + if(x1 === k1 && x2 === k2) return 1; + } + return 0; + } + function remove$0(b, k1, k2){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys(k1, k2, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$0(b, k1, k2){ + var _M_ = b[1]; + function _N_(_O_){return test_keys(k1, k2, _O_);} + var match = caml_call2(Stdlib_List[39], _N_, _M_); + if(! match) return 0; + var e = match[1]; + return get_data$0(e); + } + function length$0(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$0(b){b[1] = 0; return 0;} + function create$1(n){return caml_call1(Stdlib_Obj[24][1], n);} + function length$1(k){return caml_call1(Stdlib_Obj[24][2], k);} + function get_key$0(t, n){return caml_call2(Stdlib_Obj[24][3], t, n);} + function set_key$0(t, n, k){return caml_call3(Stdlib_Obj[24][5], t, n, k);} + function get_data$1(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$1(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$3(keys, data){ + var l = keys.length - 1, eph = create$1(l); + set_data$1(eph, data); + var _K_ = l - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var i = _J_; + for(;;){ + set_key$0(eph, i, caml_check_bound(keys, i)[1 + i]); + var _L_ = i + 1 | 0; + if(_K_ !== i){var i = _L_; continue;} + break; + } + } + return eph; + } + function query$1(eph, keys){ + var l = length$1(eph); + try{ + if(l !== keys.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _F_ = l - 1 | 0, _E_ = 0; + if(_F_ >= 0){ + var i = _E_; + for(;;){ + var match = get_key$0(eph, i); + if(! match) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var k = match[1]; + if(k !== caml_check_bound(keys, i)[1 + i]) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _H_ = i + 1 | 0; + if(_F_ !== i){var i = _H_; continue;} + break; + } + } + var _G_ = get_data$1(eph); + return _G_; + } + catch(_I_){ + var _D_ = caml_wrap_exception(_I_); + if(_D_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_D_, 0); + } + } + function MakeSeeded$2(H){ + function create(k, d){ + var c = create$1(k.length - 1); + set_data$1(c, d); + var _B_ = k.length - 1 - 1 | 0, _A_ = 0; + if(_B_ >= 0){ + var i = _A_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _C_ = i + 1 | 0; + if(_B_ !== i){var i = _C_; continue;} + break; + } + } + return c; + } + function seeded_hash(seed, k){ + var h = [0, 0], _w_ = k.length - 1 - 1 | 0, _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + var _x_ = h[1], _y_ = caml_check_bound(k, i)[1 + i]; + h[1] = (caml_call2(H[2], seed, _y_) * 65599 | 0) + _x_ | 0; + var _z_ = i + 1 | 0; + if(_w_ !== i){var i = _z_; continue;} + break; + } + } + return h[1]; + } + function equal(c, k){ + var len = k.length - 1, len$0 = length$1(c); + if(len !== len$0) return 1; + var i$1 = len - 1 | 0, i = i$1; + for(;;){ + if(0 > i) return 0; + var match = get_key$0(c, i); + if(! match) return 2; + var ki = match[1], _u_ = caml_check_bound(k, i)[1 + i]; + if(! caml_call2(H[1], _u_, ki)) return 1; + var i$0 = i - 1 | 0, i = i$0; + } + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + var _s_ = k.length - 1 - 1 | 0, _r_ = 0; + if(_s_ >= 0){ + var i = _r_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _t_ = i + 1 | 0; + if(_s_ !== i){var i = _t_; continue;} + break; + } + } + return set_data$1(c, d); + } + function check_key(c){ + var i$1 = length$1(c) - 1 | 0, i = i$1; + for(;;){ + var _p_ = i < 0 ? 1 : 0; + if(_p_) + var _q_ = _p_; + else{ + var _o_ = caml_call2(Stdlib_Obj[24][7], c, i); + if(_o_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _q_ = _o_; + } + return _q_; + } + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$1, + set_key_data, + check_key]); + } + function Make$1(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$2([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _n_ = include[1]; + function create(sz){return caml_call2(_n_, _c_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$4(param){return [0, 0];} + function add$1(b, k, d){ + var _m_ = b[1]; + b[1] = [0, make$3(k, d), _m_]; + return 0; + } + function test_keys$0(k, e){ + try{ + if(length$1(e) !== k.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _i_ = k.length - 1 - 1 | 0, _h_ = 0; + if(_i_ >= 0){ + var i = _h_; + for(;;){ + var match = get_key$0(e, i), switch$0 = 0; + if(match){ + var x = match[1]; + if(x === caml_check_bound(k, i)[1 + i]){ + var _k_ = i + 1 | 0; + if(_i_ !== i){var i = _k_; continue;} + switch$0 = 1; + } + } + if(! switch$0) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + break; + } + } + var _j_ = 1; + return _j_; + } + catch(_l_){ + var _g_ = caml_wrap_exception(_l_); + if(_g_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_g_, 0); + } + } + function remove$1(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys$0(k, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$1(b, k){ + var _d_ = b[1]; + function _e_(_f_){return test_keys$0(k, _f_);} + var match = caml_call2(Stdlib_List[39], _e_, _d_); + if(! match) return 0; + var e = match[1]; + return get_data$1(e); + } + function length$2(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$1(b){b[1] = 0; return 0;} + var + Stdlib_Ephemeron = + [0, + [0, + make, + query, + Make, + MakeSeeded$0, + [0, make$0, add, remove, find, length, clear]], + [0, + make$1, + query$0, + Make$0, + MakeSeeded$1, + [0, make$2, add$0, remove$0, find$0, length$0, clear$0]], + [0, + make$3, + query$1, + Make$1, + MakeSeeded$2, + [0, make$4, add$1, remove$1, find$1, length$2, clear$1]]]; + runtime.caml_register_global(13, Stdlib_Ephemeron, "Stdlib__Ephemeron"); + return; + } + (globalThis)); + +//# 24626 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$19 = "", + cst$23 = " ", + cst_2$1 = " 2>", + cst_2_1$1 = " 2>&1", + cst$22 = " <", + cst$21 = " >", + cst$20 = '"', + cst$24 = ".", + cst$25 = "..", + cst$28 = "../", + cst$27 = "./", + cst$26 = "/", + cst_dev_null = "/dev/null", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$18 = cst$19, + cst$17 = cst$19, + cst$16 = cst$19, + cst$8 = cst$21, + cst$15 = cst$19, + cst$9 = cst$22, + cst$14 = cst$19, + cst$10 = cst$23, + cst$11 = cst$23, + cst$12 = cst$20, + cst$13 = cst$19, + cst$6 = cst$20, + cst$7 = cst$20, + cst$4 = cst$19, + cst = cst$21, + cst$3 = cst$19, + cst$0 = cst$22, + cst$2 = cst$19, + cst$1 = cst$23, + null$0 = cst_dev_null, + current_dir_name = cst$24, + parent_dir_name = cst$25, + dir_sep = cst$26, + quotequote = "'\\''", + null$1 = "NUL", + current_dir_name$0 = cst$24, + parent_dir_name$0 = cst$25, + dir_sep$0 = "\\", + cst$5 = cst$24, + null$2 = cst_dev_null, + current_dir_name$1 = cst$24, + parent_dir_name$1 = cst$25, + dir_sep$1 = cst$26, + Stdlib = global_data.Stdlib, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_String = global_data.Stdlib__String, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Sys = global_data.Stdlib__Sys, + _i_ = [0, 7, 0], + _h_ = [0, 1, [0, 3, [0, 5, 0]]], + _e_ = [0, [2, 0, [4, 6, [0, 2, 6], 0, [2, 0, 0]]], "%s%06x%s"], + cst_Filename_chop_extension = "Filename.chop_extension", + cst_Filename_chop_suffix = "Filename.chop_suffix", + _c_ = [0, cst$20, 0], + cst_2_1$0 = cst_2_1$1, + cst_2$0 = cst_2$1, + cst_Filename_quote_command_bad = "Filename.quote_command: bad file name ", + cst_2_1 = cst_2_1$1, + cst_2 = cst_2$1, + cst_tmp = "/tmp"; + function generic_basename(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$3 = caml_ml_string_length(name) - 1 | 0, n = n$3; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var p = n + 1 | 0, n$1 = n; + for(;;){ + if(0 > n$1) return caml_call3(Stdlib_String[15], name, 0, p); + if(caml_call2(is_dir_sep, name, n$1)) + return caml_call3 + (Stdlib_String[15], name, n$1 + 1 | 0, (p - n$1 | 0) - 1 | 0); + var n$2 = n$1 - 1 | 0, n$1 = n$2; + } + } + } + function generic_dirname(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$5 = caml_ml_string_length(name) - 1 | 0, n = n$5; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var n$1 = n; + for(;;){ + if(0 > n$1) return current_dir_name; + if(! caml_call2(is_dir_sep, name, n$1)){ + var n$2 = n$1 - 1 | 0, n$1 = n$2; + continue; + } + var n$3 = n$1; + for(;;){ + if(0 > n$3) return caml_call3(Stdlib_String[15], name, 0, 1); + if(! caml_call2(is_dir_sep, name, n$3)) + return caml_call3(Stdlib_String[15], name, 0, n$3 + 1 | 0); + var n$4 = n$3 - 1 | 0, n$3 = n$4; + } + } + } + } + function is_dir_sep(s, i){return 47 === caml_string_get(s, i) ? 1 : 0;} + function is_relative(n){ + var + _aK_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _aL_ = _aK_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + return _aL_; + } + function is_implicit(n){ + var _aF_ = is_relative(n); + if(_aF_){ + var + _aG_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aH_ = + _aG_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_aH_) + var + _aI_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _aJ_ = + _aI_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + else + var _aJ_ = _aH_; + } + else + var _aJ_ = _aF_; + return _aJ_; + } + function check_suffix(name, suff){ + return caml_call2(Stdlib_String[11], suff, name); + } + function chop_suffix_opt(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s); + return caml_string_equal(r, suffix) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _k_ = caml_sys_getenv("TMPDIR"), temp_dir_name = _k_;} + catch(_aE_){ + var _a_ = caml_wrap_exception(_aE_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + var temp_dir_name = cst_tmp; + } + function quote(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 39); + var _aB_ = l - 1 | 0, _aA_ = 0; + if(_aB_ >= 0){ + var i = _aA_; + for(;;){ + if(39 === caml_string_get(s, i)) + caml_call2(Stdlib_Buffer[16], b, quotequote); + else{ + var _aD_ = caml_string_get(s, i); + caml_call2(Stdlib_Buffer[12], b, _aD_); + } + var _aC_ = i + 1 | 0; + if(_aB_ !== i){var i = _aC_; continue;} + break; + } + } + caml_call2(Stdlib_Buffer[12], b, 39); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_command(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _ap_ = cst_2_1; + else + var _az_ = quote(f), _ap_ = caml_call2(Stdlib[28], cst_2, _az_); + var _aq_ = _ap_; + } + else + var _aq_ = cst$4; + if(stdout) + var + f$0 = stdout[1], + _ar_ = quote(f$0), + _as_ = caml_call2(Stdlib[28], cst, _ar_); + else + var _as_ = cst$3; + var _at_ = caml_call2(Stdlib[28], _as_, _aq_); + if(stdin) + var + f$1 = stdin[1], + _au_ = quote(f$1), + _av_ = caml_call2(Stdlib[28], cst$0, _au_); + else + var _av_ = cst$2; + var + _aw_ = caml_call2(Stdlib[28], _av_, _at_), + _ax_ = caml_call2(Stdlib_List[19], quote, [0, cmd, args]), + _ay_ = caml_call2(Stdlib_String[6], cst$1, _ax_); + return caml_call2(Stdlib[28], _ay_, _aw_); + } + function basename(_ao_){ + return generic_basename(is_dir_sep, current_dir_name, _ao_); + } + function dirname(_an_){ + return generic_dirname(is_dir_sep, current_dir_name, _an_); + } + var + Unix = + [0, + null$0, + current_dir_name, + parent_dir_name, + dir_sep, + is_dir_sep, + is_relative, + is_implicit, + check_suffix, + chop_suffix_opt, + temp_dir_name, + quote, + quote_command, + basename, + dirname]; + function is_dir_sep$0(s, i){ + var c = caml_string_get(s, i), _ak_ = 47 === c ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else + var _am_ = 92 === c ? 1 : 0, _al_ = _am_ || (58 === c ? 1 : 0); + return _al_; + } + function is_relative$0(n){ + var + _ae_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _af_ = _ae_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + if(_af_){ + var + _ag_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _ah_ = _ag_ || (92 !== caml_string_get(n, 0) ? 1 : 0); + if(_ah_) + var + _ai_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aj_ = _ai_ || (58 !== caml_string_get(n, 1) ? 1 : 0); + else + var _aj_ = _ah_; + } + else + var _aj_ = _af_; + return _aj_; + } + function is_implicit$0(n){ + var _X_ = is_relative$0(n); + if(_X_){ + var + _Y_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _Z_ = + _Y_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_Z_){ + var + ___ = caml_ml_string_length(n) < 2 ? 1 : 0, + _$_ = + ___ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), ".\\"); + if(_$_){ + var + _aa_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ab_ = + _aa_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + if(_ab_) + var + _ac_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ad_ = + _ac_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), "..\\"); + else + var _ad_ = _ab_; + } + else + var _ad_ = _$_; + } + else + var _ad_ = _Z_; + } + else + var _ad_ = _X_; + return _ad_; + } + function check_suffix$0(name, suff){ + var + _U_ = caml_ml_string_length(suff) <= caml_ml_string_length(name) ? 1 : 0; + if(_U_) + var + s = + caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0, + caml_ml_string_length(suff)), + _V_ = caml_call1(Stdlib_String[26], suff), + _W_ = caml_string_equal(caml_call1(Stdlib_String[26], s), _V_); + else + var _W_ = _U_; + return _W_; + } + function chop_suffix_opt$0(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var + r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s), + _T_ = caml_call1(Stdlib_String[26], suffix); + return caml_string_equal(caml_call1(Stdlib_String[26], r), _T_) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _j_ = caml_sys_getenv("TEMP"), temp_dir_name$0 = _j_;} + catch(_S_){ + var _b_ = caml_wrap_exception(_S_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var temp_dir_name$0 = cst$5; + } + function quote$0(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + function add_bs(n){ + var _Q_ = 1; + if(n >= 1){ + var j = _Q_; + for(;;){ + caml_call2(Stdlib_Buffer[12], b, 92); + var _R_ = j + 1 | 0; + if(n !== j){var j = _R_; continue;} + break; + } + } + return 0; + } + function loop$0(counter, i){ + var i$0 = i; + for(;;){ + if(i$0 === l) return caml_call2(Stdlib_Buffer[12], b, 34); + var c = caml_string_get(s, i$0); + if(34 === c){ + var _O_ = 0; + if(counter >= 50) + return caml_trampoline_return(loop_bs, [0, _O_, i$0]); + var counter$1 = counter + 1 | 0; + return loop_bs(counter$1, _O_, i$0); + } + if(92 !== c){ + caml_call2(Stdlib_Buffer[12], b, c); + var i$1 = i$0 + 1 | 0, i$0 = i$1; + continue; + } + var _P_ = 0; + if(counter >= 50) return caml_trampoline_return(loop_bs, [0, _P_, i$0]); + var counter$0 = counter + 1 | 0; + return loop_bs(counter$0, _P_, i$0); + } + } + function loop_bs(counter, n, i){ + var n$0 = n, i$0 = i; + for(;;){ + if(i$0 === l){caml_call2(Stdlib_Buffer[12], b, 34); return add_bs(n$0);} + var match = caml_string_get(s, i$0); + if(34 === match){ + add_bs((2 * n$0 | 0) + 1 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + var _N_ = i$0 + 1 | 0; + if(counter >= 50) return caml_trampoline_return(loop$0, [0, _N_]); + var counter$1 = counter + 1 | 0; + return loop$0(counter$1, _N_); + } + if(92 === match){ + var i$1 = i$0 + 1 | 0, n$1 = n$0 + 1 | 0, n$0 = n$1, i$0 = i$1; + continue; + } + add_bs(n$0); + if(counter >= 50) return caml_trampoline_return(loop$0, [0, i$0]); + var counter$0 = counter + 1 | 0; + return loop$0(counter$0, i$0); + } + } + function loop(i){return caml_trampoline(loop$0(0, i));} + loop(0); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_cmd_filename(f){ + if + (! + caml_call2(Stdlib_String[14], f, 34) + && ! caml_call2(Stdlib_String[14], f, 37)){ + if(! caml_call2(Stdlib_String[14], f, 32)) return f; + var _M_ = caml_call2(Stdlib[28], f, cst$6); + return caml_call2(Stdlib[28], cst$7, _M_); + } + var _L_ = caml_call2(Stdlib[28], cst_Filename_quote_command_bad, f); + return caml_call1(Stdlib[2], _L_); + } + function quote_command$0(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _x_ = cst_2_1$0; + else + var + _J_ = quote_cmd_filename(f), + _x_ = caml_call2(Stdlib[28], cst_2$0, _J_); + var _y_ = _x_; + } + else + var _y_ = cst$16; + var _z_ = [0, _y_, _c_]; + if(stdout) + var + f$0 = stdout[1], + _A_ = quote_cmd_filename(f$0), + _B_ = caml_call2(Stdlib[28], cst$8, _A_); + else + var _B_ = cst$15; + var _C_ = [0, _B_, _z_]; + if(stdin) + var + f$1 = stdin[1], + _D_ = quote_cmd_filename(f$1), + _E_ = caml_call2(Stdlib[28], cst$9, _D_); + else + var _E_ = cst$14; + var + _G_ = caml_call2(Stdlib_List[19], quote$0, args), + s = caml_call2(Stdlib_String[6], cst$10, _G_), + b = caml_call1(Stdlib_Buffer[1], caml_ml_string_length(s) + 20 | 0), + _F_ = [0, _E_, _C_]; + function _w_(c){ + var switch$0 = 0; + if(62 <= c){ + var _K_ = c - 63 | 0; + if(60 < _K_ >>> 0){ + if(62 > _K_) switch$0 = 1; + } + else if(31 === _K_) switch$0 = 1; + } + else + if(42 <= c){ + if(60 === c) switch$0 = 1; + } + else if(33 <= c) + switch(c - 33 | 0){case 2:case 3:case 6: break;default: switch$0 = 1;} + return switch$0 + ? (caml_call2 + (Stdlib_Buffer[12], b, 94), + caml_call2(Stdlib_Buffer[12], b, c)) + : caml_call2(Stdlib_Buffer[12], b, c); + } + caml_call2(Stdlib_String[29], _w_, s); + var + _H_ = [0, cst$11, [0, caml_call1(Stdlib_Buffer[2], b), _F_]], + _I_ = [0, cst$12, [0, quote_cmd_filename(cmd), _H_]]; + return caml_call2(Stdlib_String[6], cst$13, _I_); + } + function drive_and_path(s){ + var _s_ = 2 <= caml_ml_string_length(s) ? 1 : 0; + if(_s_){ + var param = caml_string_get(s, 0), switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + var + _t_ = switch$0 ? 1 : 0, + _u_ = _t_ ? 58 === caml_string_get(s, 1) ? 1 : 0 : _t_; + } + else + var _u_ = _s_; + if(! _u_) return [0, cst$17, s]; + var + _v_ = + caml_call3(Stdlib_String[15], s, 2, caml_ml_string_length(s) - 2 | 0); + return [0, caml_call3(Stdlib_String[15], s, 0, 2), _v_]; + } + function dirname$0(s){ + var + match = drive_and_path(s), + path = match[2], + drive = match[1], + dir = generic_dirname(is_dir_sep$0, current_dir_name$0, path); + return caml_call2(Stdlib[28], drive, dir); + } + function basename$0(s){ + var path = drive_and_path(s)[2]; + return generic_basename(is_dir_sep$0, current_dir_name$0, path); + } + var + Win32 = + [0, + null$1, + current_dir_name$0, + parent_dir_name$0, + dir_sep$0, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name$0, + quote$0, + quote_command$0, + basename$0, + dirname$0]; + function basename$1(_r_){ + return generic_basename(is_dir_sep$0, current_dir_name$1, _r_); + } + function dirname$1(_q_){ + return generic_dirname(is_dir_sep$0, current_dir_name$1, _q_); + } + var + Cygwin = + [0, + null$2, + current_dir_name$1, + parent_dir_name$1, + dir_sep$1, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name, + quote, + quote_command, + basename$1, + dirname$1], + _d_ = Stdlib_Sys[4], + Sysdeps = + caml_string_notequal(_d_, "Cygwin") + ? caml_string_notequal(_d_, "Win32") ? Unix : Win32 + : Cygwin, + null$3 = Sysdeps[1], + current_dir_name$2 = Sysdeps[2], + parent_dir_name$2 = Sysdeps[3], + dir_sep$2 = Sysdeps[4], + is_dir_sep$1 = Sysdeps[5], + is_relative$1 = Sysdeps[6], + is_implicit$1 = Sysdeps[7], + check_suffix$1 = Sysdeps[8], + chop_suffix_opt$1 = Sysdeps[9], + temp_dir_name$1 = Sysdeps[10], + quote$1 = Sysdeps[11], + quote_command$1 = Sysdeps[12], + basename$2 = Sysdeps[13], + dirname$2 = Sysdeps[14]; + function concat(dirname, filename){ + var l = caml_ml_string_length(dirname); + if(0 !== l && ! is_dir_sep$1(dirname, l - 1 | 0)){ + var _p_ = caml_call2(Stdlib[28], dir_sep$2, filename); + return caml_call2(Stdlib[28], dirname, _p_); + } + return caml_call2(Stdlib[28], dirname, filename); + } + function chop_suffix(name, suff){ + return check_suffix$1(name, suff) + ? caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0) + : caml_call1(Stdlib[1], cst_Filename_chop_suffix); + } + function extension_len(name){ + var i$3 = caml_ml_string_length(name) - 1 | 0, i0 = i$3; + for(;;){ + if(0 <= i0 && ! is_dir_sep$1(name, i0)){ + if(46 !== caml_string_get(name, i0)){ + var i$2 = i0 - 1 | 0, i0 = i$2; + continue; + } + var i$1 = i0 - 1 | 0, i = i$1; + for(;;){ + if(0 <= i && ! is_dir_sep$1(name, i)){ + if(46 !== caml_string_get(name, i)) + return caml_ml_string_length(name) - i0 | 0; + var i$0 = i - 1 | 0, i = i$0; + continue; + } + return 0; + } + } + return 0; + } + } + function extension(name){ + var l = extension_len(name); + return 0 === l + ? cst$18 + : caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - l | 0, + l); + } + function chop_extension(name){ + var l = extension_len(name); + return 0 === l + ? caml_call1(Stdlib[1], cst_Filename_chop_extension) + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + function remove_extension(name){ + var l = extension_len(name); + return 0 === l + ? name + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function temp_file_name(temp_dir, prefix, suffix){ + var + random_state = caml_call1(Stdlib_Domain[10][2], prng_key), + rnd = caml_call1(Stdlib_Random[15][4], random_state) & 16777215; + return concat + (temp_dir, caml_call4(Stdlib_Printf[4], _e_, prefix, rnd, suffix)); + } + function _f_(param){return temp_dir_name$1;} + var + _g_ = [0, function(_o_){return _o_;}], + current_temp_dir_name = caml_call2(Stdlib_Domain[10][1], _g_, _f_); + function set_temp_dir_name(s){ + return caml_call2(Stdlib_Domain[10][3], current_temp_dir_name, s); + } + function get_temp_dir_name(param){ + return caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + } + function temp_file(opt, prefix, suffix){ + if(opt) + var sth = opt[1], temp_dir = sth; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + runtime.caml_sys_close(runtime.caml_sys_open(name, _h_, 384)); + return name; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + function open_temp_file(opt, _m_, _l_, prefix, suffix){ + if(opt) var sth = opt[1], mode = sth; else var mode = _i_; + if(_m_) var sth$0 = _m_[1], perms = sth$0; else var perms = 384; + if(_l_) + var sth$1 = _l_[1], temp_dir = sth$1; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + var + _n_ = + [0, + name, + caml_call3(Stdlib[62], [0, 1, [0, 3, [0, 5, mode]]], perms, name)]; + return _n_; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + var + Stdlib_Filename = + [0, + current_dir_name$2, + parent_dir_name$2, + dir_sep$2, + concat, + is_relative$1, + is_implicit$1, + check_suffix$1, + chop_suffix, + chop_suffix_opt$1, + extension, + remove_extension, + chop_extension, + basename$2, + dirname$2, + null$3, + temp_file, + open_temp_file, + get_temp_dir_name, + set_temp_dir_name, + quote$1, + quote_command$1]; + runtime.caml_register_global(65, Stdlib_Filename, "Stdlib__Filename"); + return; + } + (globalThis)); + +//# 25489 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + init = Stdlib_Array[1], + make_matrix = Stdlib_Array[2], + append = Stdlib_Array[3], + concat = Stdlib_Array[4], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + fill = Stdlib_Array[7], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + iter = Stdlib_Array[11], + iteri = Stdlib_Array[12], + map = Stdlib_Array[13], + mapi = Stdlib_Array[14], + fold_left = Stdlib_Array[15], + fold_left_map = Stdlib_Array[16], + fold_right = Stdlib_Array[17], + iter2 = Stdlib_Array[18], + map2 = Stdlib_Array[19], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + for_all2 = Stdlib_Array[22], + exists2 = Stdlib_Array[23], + mem = Stdlib_Array[24], + memq = Stdlib_Array[25], + find_opt = Stdlib_Array[26], + find_map = Stdlib_Array[27], + split = Stdlib_Array[28], + combine = Stdlib_Array[29], + sort = Stdlib_Array[30], + stable_sort = Stdlib_Array[31], + fast_sort = Stdlib_Array[32], + to_seq = Stdlib_Array[33], + to_seqi = Stdlib_Array[34], + of_seq = Stdlib_Array[35], + Floatarray = Stdlib_Array[36], + Stdlib_ArrayLabels = + [0, + init, + make_matrix, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + fast_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(1, Stdlib_ArrayLabels, "Stdlib__ArrayLabels"); + return; + } + (globalThis)); + +//# 25577 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + length = Stdlib_List[1], + compare_lengths = Stdlib_List[2], + compare_length_with = Stdlib_List[3], + cons = Stdlib_List[4], + hd = Stdlib_List[5], + tl = Stdlib_List[6], + nth = Stdlib_List[7], + nth_opt = Stdlib_List[8], + rev = Stdlib_List[9], + init = Stdlib_List[10], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + flatten = Stdlib_List[14], + equal = Stdlib_List[15], + compare = Stdlib_List[16], + iter = Stdlib_List[17], + iteri = Stdlib_List[18], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + filter_map = Stdlib_List[22], + concat_map = Stdlib_List[23], + fold_left_map = Stdlib_List[24], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + iter2 = Stdlib_List[27], + map2 = Stdlib_List[28], + rev_map2 = Stdlib_List[29], + fold_left2 = Stdlib_List[30], + fold_right2 = Stdlib_List[31], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + for_all2 = Stdlib_List[34], + exists2 = Stdlib_List[35], + mem = Stdlib_List[36], + memq = Stdlib_List[37], + find = Stdlib_List[38], + find_opt = Stdlib_List[39], + find_map = Stdlib_List[40], + filter = Stdlib_List[41], + find_all = Stdlib_List[42], + filteri = Stdlib_List[43], + partition = Stdlib_List[44], + partition_map = Stdlib_List[45], + assoc = Stdlib_List[46], + assoc_opt = Stdlib_List[47], + assq = Stdlib_List[48], + assq_opt = Stdlib_List[49], + mem_assoc = Stdlib_List[50], + mem_assq = Stdlib_List[51], + remove_assoc = Stdlib_List[52], + remove_assq = Stdlib_List[53], + split = Stdlib_List[54], + combine = Stdlib_List[55], + sort = Stdlib_List[56], + stable_sort = Stdlib_List[57], + fast_sort = Stdlib_List[58], + sort_uniq = Stdlib_List[59], + merge = Stdlib_List[60], + to_seq = Stdlib_List[61], + of_seq = Stdlib_List[62], + Stdlib_ListLabels = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + concat, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + filter, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + sort, + stable_sort, + fast_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(1, Stdlib_ListLabels, "Stdlib__ListLabels"); + return; + } + (globalThis)); + +//# 25717 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + make = Stdlib_Bytes[1], + init = Stdlib_Bytes[2], + empty = Stdlib_Bytes[3], + copy = Stdlib_Bytes[4], + of_string = Stdlib_Bytes[5], + to_string = Stdlib_Bytes[6], + sub = Stdlib_Bytes[7], + sub_string = Stdlib_Bytes[8], + extend = Stdlib_Bytes[9], + fill = Stdlib_Bytes[10], + blit = Stdlib_Bytes[11], + blit_string = Stdlib_Bytes[12], + concat = Stdlib_Bytes[13], + cat = Stdlib_Bytes[14], + iter = Stdlib_Bytes[15], + iteri = Stdlib_Bytes[16], + map = Stdlib_Bytes[17], + mapi = Stdlib_Bytes[18], + fold_left = Stdlib_Bytes[19], + fold_right = Stdlib_Bytes[20], + for_all = Stdlib_Bytes[21], + exists = Stdlib_Bytes[22], + trim = Stdlib_Bytes[23], + escaped = Stdlib_Bytes[24], + index = Stdlib_Bytes[25], + index_opt = Stdlib_Bytes[26], + rindex = Stdlib_Bytes[27], + rindex_opt = Stdlib_Bytes[28], + index_from = Stdlib_Bytes[29], + index_from_opt = Stdlib_Bytes[30], + rindex_from = Stdlib_Bytes[31], + rindex_from_opt = Stdlib_Bytes[32], + contains = Stdlib_Bytes[33], + contains_from = Stdlib_Bytes[34], + rcontains_from = Stdlib_Bytes[35], + uppercase_ascii = Stdlib_Bytes[36], + lowercase_ascii = Stdlib_Bytes[37], + capitalize_ascii = Stdlib_Bytes[38], + uncapitalize_ascii = Stdlib_Bytes[39], + compare = Stdlib_Bytes[40], + equal = Stdlib_Bytes[41], + starts_with = Stdlib_Bytes[42], + ends_with = Stdlib_Bytes[43], + unsafe_to_string = Stdlib_Bytes[44], + unsafe_of_string = Stdlib_Bytes[45], + split_on_char = Stdlib_Bytes[46], + to_seq = Stdlib_Bytes[47], + to_seqi = Stdlib_Bytes[48], + of_seq = Stdlib_Bytes[49], + get_utf_8_uchar = Stdlib_Bytes[50], + set_utf_8_uchar = Stdlib_Bytes[51], + is_valid_utf_8 = Stdlib_Bytes[52], + get_utf_16be_uchar = Stdlib_Bytes[53], + set_utf_16be_uchar = Stdlib_Bytes[54], + is_valid_utf_16be = Stdlib_Bytes[55], + get_utf_16le_uchar = Stdlib_Bytes[56], + set_utf_16le_uchar = Stdlib_Bytes[57], + is_valid_utf_16le = Stdlib_Bytes[58], + get_uint8 = Stdlib_Bytes[59], + get_int8 = Stdlib_Bytes[60], + get_uint16_ne = Stdlib_Bytes[61], + get_uint16_be = Stdlib_Bytes[62], + get_uint16_le = Stdlib_Bytes[63], + get_int16_ne = Stdlib_Bytes[64], + get_int16_be = Stdlib_Bytes[65], + get_int16_le = Stdlib_Bytes[66], + get_int32_ne = Stdlib_Bytes[67], + get_int32_be = Stdlib_Bytes[68], + get_int32_le = Stdlib_Bytes[69], + get_int64_ne = Stdlib_Bytes[70], + get_int64_be = Stdlib_Bytes[71], + get_int64_le = Stdlib_Bytes[72], + set_uint8 = Stdlib_Bytes[73], + set_int8 = Stdlib_Bytes[74], + set_uint16_ne = Stdlib_Bytes[75], + set_uint16_be = Stdlib_Bytes[76], + set_uint16_le = Stdlib_Bytes[77], + set_int16_ne = Stdlib_Bytes[78], + set_int16_be = Stdlib_Bytes[79], + set_int16_le = Stdlib_Bytes[80], + set_int32_ne = Stdlib_Bytes[81], + set_int32_be = Stdlib_Bytes[82], + set_int32_le = Stdlib_Bytes[83], + set_int64_ne = Stdlib_Bytes[84], + set_int64_be = Stdlib_Bytes[85], + set_int64_le = Stdlib_Bytes[86], + unsafe_escape = Stdlib_Bytes[87], + Stdlib_BytesLabels = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + equal, + starts_with, + ends_with, + unsafe_to_string, + unsafe_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + set_uint8, + set_int8, + set_uint16_ne, + set_uint16_be, + set_uint16_le, + set_int16_ne, + set_int16_be, + set_int16_le, + set_int32_ne, + set_int32_be, + set_int32_le, + set_int64_ne, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(1, Stdlib_BytesLabels, "Stdlib__BytesLabels"); + return; + } + (globalThis)); + +//# 25907 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + equal = Stdlib_String[8], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + Stdlib_StringLabels = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le]; + runtime.caml_register_global + (1, Stdlib_StringLabels, "Stdlib__StringLabels"); + return; + } + (globalThis)); + +//# 26052 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Set = global_data.Stdlib__Set, + Stdlib_Map = global_data.Stdlib__Map, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_MoreLabels = [0, Stdlib_Hashtbl, Stdlib_Map, Stdlib_Set]; + runtime.caml_register_global(3, Stdlib_MoreLabels, "Stdlib__MoreLabels"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 18 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + s = "5.1.1", + git_version = "", + Jsoo_runtime_Runtime_version = [0, s, git_version]; + runtime.caml_register_global + (2, Jsoo_runtime_Runtime_version, "Jsoo_runtime__Runtime_version"); + return; + } + (globalThis)); + +//# 33 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Jsoo_runtime_Runtime_version = global_data.Jsoo_runtime__Runtime_version, + Stdlib_Callback = global_data.Stdlib__Callback, + Js = [0], + Config = [0], + version = Jsoo_runtime_Runtime_version[1], + git_version = Jsoo_runtime_Runtime_version[2], + Sys = [0, Config, version, git_version], + Exn = [248, "Jsoo_runtime.Error.Exn", runtime.caml_fresh_oo_id(0)]; + caml_call2(Stdlib_Callback[2], "jsError", [0, Exn, [0]]); + function raise(exn){throw exn;} + var + Error = + [0, + raise, + runtime.caml_exn_with_js_backtrace, + runtime.caml_js_error_option_of_exception, + Exn], + For_compatibility_only = [0], + Bigstring = [0], + Typed_array = [0, Bigstring], + Int64 = [0], + Jsoo_runtime = + [0, Js, Sys, Error, For_compatibility_only, Typed_array, Int64]; + runtime.caml_register_global(5, Jsoo_runtime, "Jsoo_runtime"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 19 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + Stdlib_Char = global_data.Stdlib__Char, + Poly = [0]; + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, max, min], + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + equal = runtime.caml_string_equal, + String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + equal], + chr = Stdlib_Char[1], + escaped$0 = Stdlib_Char[2], + lowercase_ascii$0 = Stdlib_Char[3], + uppercase_ascii$0 = Stdlib_Char[4], + compare$0 = Stdlib_Char[5]; + function equal$0(x, y){return x === y ? 1 : 0;} + var + Char = + [0, + chr, + escaped$0, + lowercase_ascii$0, + uppercase_ascii$0, + compare$0, + equal$0], + max$0 = Int_replace_polymorphic_compar[1], + min$0 = Int_replace_polymorphic_compar[2], + Js_of_ocaml_Import = + [0, Poly, Int_replace_polymorphic_compar, String, Char, max$0, min$0]; + runtime.caml_register_global(2, Js_of_ocaml_Import, "Js_of_ocaml__Import"); + return; + } + (globalThis)); + +//# 188 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + jsoo_exports = typeof module === "object" && module.exports || globalThis, + runtime = globalThis.jsoo_runtime, + cst_parseFloat$0 = "parseFloat", + cst_parseInt$0 = "parseInt", + caml_js_get = runtime.caml_js_get, + caml_js_set = runtime.caml_js_set, + caml_js_wrap_callback = runtime.caml_js_wrap_callback, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Import = global_data.Js_of_ocaml__Import, + Stdlib = global_data.Stdlib, + Jsoo_runtime = global_data.Jsoo_runtime, + Stdlib_Printexc = global_data.Stdlib__Printexc, + global = globalThis, + Unsafe = [0, global], + null$0 = null, + undefined$0 = undefined, + cst_function = "function", + cst_parseFloat = cst_parseFloat$0, + cst_parseInt = cst_parseInt$0; + function return$0(_z_){return _z_;} + function map(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function bind(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function test(x){return 1 - (x == null$0 ? 1 : 0);} + function iter(x, f){ + var _y_ = 1 - (x == null$0 ? 1 : 0); + return _y_ ? caml_call1(f, x) : _y_; + } + function case$0(x, f, g){ + return x == null$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get(x, f){return x == null$0 ? caml_call1(f, 0) : x;} + function option(x){if(! x) return null$0; var x$0 = x[1]; return x$0;} + function to_option(x){ + function _x_(x){return [0, x];} + return case$0(x, function(param){return 0;}, _x_); + } + var + Opt = + [0, + null$0, + return$0, + map, + bind, + test, + iter, + case$0, + get, + option, + to_option]; + function return$1(_w_){return _w_;} + function map$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function bind$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function test$0(x){return x !== undefined$0 ? 1 : 0;} + function iter$0(x, f){ + var _v_ = x !== undefined$0 ? 1 : 0; + return _v_ ? caml_call1(f, x) : _v_; + } + function case$1(x, f, g){ + return x === undefined$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get$0(x, f){return x === undefined$0 ? caml_call1(f, 0) : x;} + function option$0(x){ + if(! x) return undefined$0; + var x$0 = x[1]; + return x$0; + } + function to_option$0(x){ + function _u_(x){return [0, x];} + return case$1(x, function(param){return 0;}, _u_); + } + var + Optdef = + [0, + undefined$0, + return$1, + map$0, + bind$0, + test$0, + iter$0, + case$1, + get$0, + option$0, + to_option$0]; + function coerce(x, f, g){ + function _s_(param){return caml_call1(g, x);} + var _t_ = caml_call1(f, x); + return caml_call2(Opt[8], _t_, _s_); + } + function coerce_opt(x, f, g){ + function _q_(param){return caml_call1(g, x);} + var _r_ = caml_call2(Opt[4], x, f); + return caml_call2(Opt[8], _r_, _q_); + } + var + true$0 = true, + false$0 = false, + nfc = "NFC", + nfd = "NFD", + nfkc = "NFKC", + nfkd = "NFKD", + t0 = Unsafe[1], + string_constr = t0.String, + t1 = Unsafe[1], + regExp = t1.RegExp, + t2 = Unsafe[1], + object_constructor = t2.Object; + function object_keys(o){return object_constructor.keys(o);} + var + t5 = Unsafe[1], + array_constructor = t5.Array, + array_get = caml_js_get, + array_set = caml_js_set; + function array_map(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call1(f, x);})); + } + function array_mapi(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call2(f, idx, x);})); + } + function str_array(_p_){return _p_;} + function match_result(_o_){return _o_;} + var + t8 = Unsafe[1], + date_constr = t8.Date, + t9 = Unsafe[1], + math = t9.Math, + t10 = Unsafe[1], + error_constr = t10.Error, + include = Jsoo_runtime[3], + raise = include[1], + exn_with_js_backtrace = include[2], + of_exn = include[3], + Error = include[4]; + function name(t11){return caml_string_of_jsstring(t11.name);} + function message(t12){return caml_string_of_jsstring(t12.message);} + function stack(t13){ + var _n_ = caml_call2(Opt[3], t13.stack, caml_string_of_jsstring); + return caml_call1(Opt[10], _n_); + } + function to_string(e){return caml_string_of_jsstring(e.toString());} + function raise_js_error(e){return caml_call1(raise, e);} + function string_of_error(e){return to_string(e);} + var t15 = Unsafe[1], JSON = t15.JSON; + function decodeURI(s){var t16 = Unsafe[1]; return t16.decodeURI(s);} + function decodeURIComponent(s){ + var t17 = Unsafe[1]; + return t17.decodeURIComponent(s); + } + function encodeURI(s){var t18 = Unsafe[1]; return t18.encodeURI(s);} + function encodeURIComponent(s){ + var t19 = Unsafe[1]; + return t19.encodeURIComponent(s); + } + function escape(s){var t20 = Unsafe[1]; return t20.escape(s);} + function unescape(s){var t21 = Unsafe[1]; return t21.unescape(s);} + function isNaN(i){var t22 = Unsafe[1]; return t22.isNaN(i) | 0;} + function parseInt(s){ + var t23 = Unsafe[1], s$0 = t23.parseInt(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseInt) : s$0; + } + function parseFloat(s){ + var t24 = Unsafe[1], s$0 = t24.parseFloat(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseFloat) : s$0; + } + function _a_(param){ + if(param[1] !== Error) return 0; + var e = param[2]; + return [0, to_string(e)]; + } + caml_call1(Stdlib_Printexc[9], _a_); + function _b_(e){ + return e instanceof array_constructor + ? 0 + : [0, caml_string_of_jsstring(e.toString())]; + } + caml_call1(Stdlib_Printexc[9], _b_); + function export_js(field, x){ + var _l_ = caml_string_of_jsstring(typeof x), switch$0 = 0; + if + (caml_call2(Js_of_ocaml_Import[3][64], _l_, cst_function) && 0 < x.length){var _m_ = caml_js_wrap_callback(x); switch$0 = 1;} + if(! switch$0) var _m_ = x; + return jsoo_exports[field] = _m_; + } + function export$0(field, x){ + return export_js(runtime.caml_jsstring_of_string(field), x); + } + function export_all(obj){ + var keys = object_keys(obj); + return keys.forEach + (caml_js_wrap_callback + (function(key, param, _k_){return export_js(key, obj[key]);})); + } + var _c_ = runtime.caml_js_error_of_exception; + function _d_(_j_){return _j_;} + var + _e_ = + [0, + to_string, + name, + message, + stack, + raise, + exn_with_js_backtrace, + of_exn, + Error, + function(_i_){return _i_;}, + _d_]; + function _f_(_h_){return _h_;} + var + Js_of_ocaml_Js = + [0, + null$0, + function(_g_){return _g_;}, + undefined$0, + _f_, + Opt, + Optdef, + true$0, + false$0, + nfd, + nfc, + nfkd, + nfkc, + string_constr, + regExp, + regExp, + regExp, + object_keys, + array_constructor, + array_constructor, + array_get, + array_set, + array_map, + array_mapi, + str_array, + match_result, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + math, + error_constr, + _e_, + JSON, + decodeURI, + decodeURIComponent, + encodeURI, + encodeURIComponent, + escape, + unescape, + isNaN, + parseInt, + parseFloat, + coerce, + coerce_opt, + export$0, + export_all, + Unsafe, + string_of_error, + raise_js_error, + exn_with_js_backtrace, + _c_, + Error]; + runtime.caml_register_global(43, Js_of_ocaml_Js, "Js_of_ocaml__Js"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function pre_test_hook(_a_){return 0;} + var Inline_test_config = [0, pre_test_hook]; + runtime.caml_register_global(0, Inline_test_config, "Inline_test_config"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_internalhash_types = [0]; + runtime.caml_register_global + (0, Base_internalhash_types, "Base_internalhash_types"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.caml/caml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.caml/caml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + invalid_arg = Stdlib[1], + failwith = Stdlib[2], + Exit = Stdlib[3], + Match_failure = Stdlib[4], + Assert_failure = Stdlib[5], + Invalid_argument = Stdlib[6], + Failure = Stdlib[7], + Not_found = Stdlib[8], + Out_of_memory = Stdlib[9], + Stack_overflow = Stdlib[10], + Sys_error = Stdlib[11], + End_of_file = Stdlib[12], + Division_by_zero = Stdlib[13], + Sys_blocked_io = Stdlib[14], + Undefined_recursive_module = Stdlib[15], + min = Stdlib[16], + max = Stdlib[17], + abs = Stdlib[18], + max_int = Stdlib[19], + min_int = Stdlib[20], + lnot = Stdlib[21], + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon_float = Stdlib[27], + symbol = Stdlib[28], + char_of_int = Stdlib[29], + string_of_bool = Stdlib[30], + bool_of_string_opt = Stdlib[31], + bool_of_string = Stdlib[32], + string_of_int = Stdlib[33], + int_of_string_opt = Stdlib[34], + string_of_float = Stdlib[35], + float_of_string_opt = Stdlib[36], + symbol$0 = Stdlib[37], + stdin = Stdlib[38], + stdout = Stdlib[39], + stderr = Stdlib[40], + print_char = Stdlib[41], + print_string = Stdlib[42], + print_bytes = Stdlib[43], + print_int = Stdlib[44], + print_float = Stdlib[45], + print_endline = Stdlib[46], + print_newline = Stdlib[47], + prerr_char = Stdlib[48], + prerr_string = Stdlib[49], + prerr_bytes = Stdlib[50], + prerr_int = Stdlib[51], + prerr_float = Stdlib[52], + prerr_endline = Stdlib[53], + prerr_newline = Stdlib[54], + read_line = Stdlib[55], + read_int_opt = Stdlib[56], + read_int = Stdlib[57], + read_float_opt = Stdlib[58], + read_float = Stdlib[59], + open_out = Stdlib[60], + open_out_bin = Stdlib[61], + open_out_gen = Stdlib[62], + flush = Stdlib[63], + flush_all = Stdlib[64], + output_char = Stdlib[65], + output_string = Stdlib[66], + output_bytes = Stdlib[67], + output = Stdlib[68], + output_substring = Stdlib[69], + output_byte = Stdlib[70], + output_binary_int = Stdlib[71], + output_value = Stdlib[72], + seek_out = Stdlib[73], + pos_out = Stdlib[74], + out_channel_length = Stdlib[75], + close_out = Stdlib[76], + close_out_noerr = Stdlib[77], + set_binary_mode_out = Stdlib[78], + open_in = Stdlib[79], + open_in_bin = Stdlib[80], + open_in_gen = Stdlib[81], + input_char = Stdlib[82], + input_line = Stdlib[83], + input = Stdlib[84], + really_input = Stdlib[85], + really_input_string = Stdlib[86], + input_byte = Stdlib[87], + input_binary_int = Stdlib[88], + input_value = Stdlib[89], + seek_in = Stdlib[90], + pos_in = Stdlib[91], + in_channel_length = Stdlib[92], + close_in = Stdlib[93], + close_in_noerr = Stdlib[94], + set_binary_mode_in = Stdlib[95], + LargeFile = Stdlib[96], + string_of_format = Stdlib[97], + symbol$1 = Stdlib[98], + exit = Stdlib[99], + at_exit = Stdlib[100], + valid_float_lexem = Stdlib[101], + unsafe_really_input = Stdlib[102], + do_at_exit = Stdlib[103], + do_domain_local_at_exit = Stdlib[104], + Caml = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + LargeFile, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Caml, "Caml"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/sexplib0/sexplib0.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "(", + cst$12 = "()", + cst$13 = ")", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$2 = cst$11, + cst$3 = cst$12, + cst$4 = cst$13, + cst$5 = " ", + cst$6 = cst$11, + cst$7 = cst$12, + cst$8 = cst$13, + cst$10 = cst$12, + cst$9 = cst$12, + cst = "\\", + cst$0 = ' "', + cst$1 = '"', + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Format = global_data.Stdlib__Format, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib = global_data.Stdlib, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _b_ = [0, [15, [17, 2, 0]], "%a@?"], + _a_ = [0, 0, 0], + cst_n = "\\n", + cst_Sexplib0_Sexp_Not_found_s = "Sexplib0__Sexp.Not_found_s", + cst_Sexplib0_Sexp_Of_sexp_erro = "Sexplib0__Sexp.Of_sexp_error"; + function sexp_of_t(t){return t;} + function t_of_sexp(t){return t;} + function compare(a$0, b$0){ + if(a$0 === b$0) return 0; + if(0 === a$0[0]){ + var a$1 = a$0[1]; + if(0 !== b$0[0]) return -1; + var b$1 = b$0[1]; + return caml_call2(Stdlib_StringLabels[9], a$1, b$1); + } + var a$2 = a$0[1]; + if(0 === b$0[0]) return 1; + var b$2 = b$0[1], a = a$2, b = b$2; + for(;;){ + if(! a) return b ? -1 : 0; + if(! b) return 1; + var ys = b[2], y = b[1], xs = a[2], x = a[1], res = compare(x, y); + if(0 !== res) return res; + var a = xs, b = ys; + } + } + function equal(a, b){return 0 === compare(a, b) ? 1 : 0;} + var + Not_found_s = [248, cst_Sexplib0_Sexp_Not_found_s, caml_fresh_oo_id(0)], + Of_sexp_error = [248, cst_Sexplib0_Sexp_Of_sexp_erro, caml_fresh_oo_id(0)], + default_indent = [0, 1]; + function must_escape(str){ + var len = caml_ml_string_length(str), _x_ = 0 === len ? 1 : 0; + if(_x_) return _x_; + var ix$1 = len - 1 | 0, ix = ix$1; + for(;;){ + var match = caml_string_get(str, ix), switch$0 = 0; + if(92 <= match){ + var switcher = match - 93 | 0; + if(33 < switcher >>> 0) + if(0 <= switcher) switch$0 = 2; else switch$0 = 1; + else if(31 === switcher){ + var _y_ = 0 < ix ? 1 : 0; + if(_y_){ + var + next = ix - 1 | 0, + _z_ = caml_string_get(str, next), + _A_ = caml_call2(Stdlib_Char[6], _z_, 35); + if(! _A_){var ix = next; continue;} + var _B_ = _A_; + } + else + var _B_ = _y_; + return _B_; + } + } + else + if(42 <= match){ + if(59 === match) switch$0 = 1; + } + else if(33 <= match) + switch(match - 33 | 0){ + case 2: + var _D_ = 0 < ix ? 1 : 0; + if(_D_){ + var + next$0 = ix - 1 | 0, + _E_ = caml_string_get(str, next$0), + _F_ = caml_call2(Stdlib_Char[6], _E_, 124); + if(! _F_){var ix = next$0; continue;} + var _G_ = _F_; + } + else + var _G_ = _D_; + return _G_; + case 1: + case 7: + case 8: + switch$0 = 1; break; + } + else + switch$0 = 2; + switch(switch$0){ + case 0: + var _C_ = 0 < ix ? 1 : 0; + if(! _C_) return _C_; + var ix$0 = ix - 1 | 0, ix = ix$0; + continue; + case 1: + return 1; + default: return 1; + } + } + } + function escaped(s){ + var n = [0, 0], _n_ = caml_ml_string_length(s) - 1 | 0, _m_ = 0; + if(_n_ >= 0){ + var i$0 = _m_; + for(;;){ + var match = caml_string_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _u_ = match - 34 | 0, switch$1 = 0; + if(58 < _u_ >>> 0){ + if(93 > _u_) switch$1 = 1; + } + else if(56 < _u_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _v_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){case 0: var _v_ = 4; break;case 1: var _v_ = 2; break; + } + n[1] = n[1] + _v_ | 0; + var _w_ = i$0 + 1 | 0; + if(_n_ !== i$0){var i$0 = _w_; continue;} + break; + } + } + if(n[1] === caml_ml_string_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _p_ = caml_ml_string_length(s) - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var c = caml_string_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + var _r_ = caml_call1(Stdlib_Char[1], 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _r_); + n[1]++; + var + _s_ = caml_call1(Stdlib_Char[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _s_); + n[1]++; + var _t_ = caml_call1(Stdlib_Char[1], 48 + (c % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _t_); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return caml_call1(Stdlib_BytesLabels[44], s$0); + } + function esc_str(str){ + var + estr = escaped(str), + elen = caml_ml_string_length(estr), + res = caml_create_bytes(elen + 2 | 0); + caml_call5(Stdlib_Bytes[12], estr, 0, res, 1, elen); + caml_bytes_unsafe_set(res, 0, 34); + caml_bytes_unsafe_set(res, elen + 1 | 0, 34); + return caml_call1(Stdlib_BytesLabels[44], res); + } + function index_of_newline(str, start){ + try{ + var _k_ = [0, caml_call3(Stdlib_StringLabels[31], str, start, 10)]; + return _k_; + } + catch(_l_){ + var _j_ = caml_wrap_exception(_l_); + if(_j_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_j_, 0); + } + } + function mach_maybe_esc_str(str){ + return must_escape(str) ? esc_str(str) : str; + } + function pp_hum_indent(indent, ppf, param){ + if(0 === param[0]){ + var str = param[1]; + if(! must_escape(str)) return caml_call2(Stdlib_Format[13], ppf, str); + var match = index_of_newline(str, 0); + if(match) + var + index = match[1], + _g_ = (index + 1 | 0) === caml_ml_string_length(str) ? 1 : 0; + else + var _g_ = 1; + if(_g_){ + var _h_ = esc_str(str); + return caml_call2(Stdlib_Format[13], ppf, _h_); + } + caml_call2(Stdlib_Format[1], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst$0); + var index$0 = 0; + for(;;){ + var next_newline = index_of_newline(str, index$0); + if(next_newline) + var end_pos = next_newline[1], end_pos$0 = end_pos; + else + var end_pos$0 = caml_ml_string_length(str); + var + next_line = + caml_call3 + (Stdlib_StringLabels[15], str, index$0, end_pos$0 - index$0 | 0), + _i_ = escaped(next_line); + caml_call2(Stdlib_Format[13], ppf, _i_); + if(next_newline){ + var newline_index = next_newline[1]; + caml_call2(Stdlib_Format[13], ppf, cst); + caml_call2(Stdlib_Format[34], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst_n); + var index$1 = newline_index + 1 | 0, index$0 = index$1; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$1); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + var match$0 = param[1]; + if(! match$0) return caml_call2(Stdlib_Format[13], ppf, cst$3); + var t = match$0[2], h = match$0[1]; + caml_call2(Stdlib_Format[1], ppf, indent); + caml_call2(Stdlib_Format[13], ppf, cst$2); + pp_hum_indent(indent, ppf, h); + var param$0 = t; + for(;;){ + if(param$0){ + var t$0 = param$0[2], h$0 = param$0[1]; + caml_call2(Stdlib_Format[27], ppf, 0); + pp_hum_indent(indent, ppf, h$0); + var param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$4); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + function pp_mach_internal(may_need_space, ppf, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Format[13], ppf, cst$5); + caml_call2(Stdlib_Format[13], ppf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Format[13], ppf, cst$7); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Format[13], ppf, cst$6); + var + may_need_space$0 = pp_mach_internal(0, ppf, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = pp_mach_internal(may_need_space$1, ppf, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$8); + return 0; + } + } + function pp_hum(ppf, sexp){ + return pp_hum_indent(default_indent[1], ppf, sexp); + } + function pp_mach(ppf, sexp){pp_mach_internal(0, ppf, sexp); return 0;} + function size_loop(acc, param){ + var c = acc[2], v = acc[1]; + if(0 === param[0]){ + var str = param[1]; + return [0, v + 1 | 0, c + caml_ml_string_length(str) | 0]; + } + var lst = param[1]; + return caml_call3(Stdlib_ListLabels[25], size_loop, acc, lst); + } + function size(sexp){return size_loop(_a_, sexp);} + function to_buffer_hum(buf, opt, sexp){ + if(opt) + var sth = opt[1], indent = sth; + else + var indent = default_indent[1]; + var ppf = caml_call1(Stdlib_Format[114], buf); + function _d_(_e_, _f_){return pp_hum_indent(indent, _e_, _f_);} + return caml_call4(Stdlib_Format[135], ppf, _b_, _d_, sexp); + } + function to_buffer_mach(buf, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Buffer[12], buf, 32); + caml_call2(Stdlib_Buffer[16], buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Buffer[16], buf, cst$9); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Buffer[12], buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Buffer[12], buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function to_buffer_gen(buf, add_char, add_string, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(add_char, buf, 32); + caml_call2(add_string, buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(add_string, buf, cst$10); return 0;} + var t = match[2], h = match[1]; + caml_call2(add_char, buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(add_char, buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function buffer(param){return caml_call1(Stdlib_Buffer[1], 1024);} + function to_string_hum(indent, sexp){ + if(0 === sexp[0]){ + var str = sexp[1], _c_ = index_of_newline(str, 0) ? 0 : 1; + if(_c_) return mach_maybe_esc_str(str); + } + var buf = buffer(0); + to_buffer_hum(buf, indent, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + function to_string_mach(sexp){ + if(0 === sexp[0]){var str = sexp[1]; return mach_maybe_esc_str(str);} + var buf = buffer(0); + to_buffer_mach(buf, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + var of_float_style = [0, 1009018843], of_int_style = [0, 1009018843]; + function message(name, fields){ + function conv_fields(param){ + if(! param) return 0; + var + rest = param[2], + match = param[1], + fsexp = match[2], + fname = match[1]; + return runtime.caml_string_notequal(fname, "") + ? [0, [1, [0, [0, fname], [0, fsexp, 0]]], conv_fields(rest)] + : [0, fsexp, conv_fields(rest)]; + } + return [1, [0, [0, name], conv_fields(fields)]]; + } + var + Sexplib0_Sexp = + [0, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp_mach, + to_string_hum, + to_string_mach, + to_string_mach, + of_float_style, + of_int_style, + [0, + size, + buffer, + to_buffer_mach, + to_buffer_hum, + to_buffer_mach, + to_buffer_gen, + mach_maybe_esc_str, + must_escape, + esc_str]]; + runtime.caml_register_global(26, Sexplib0_Sexp, "Sexplib0__Sexp"); + return; + } + (globalThis)); + +//# 555 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + doc_comment_tag = "sexp_grammar.doc_comment"; + function coerce(t){return t;} + var Sexplib0_Sexp_grammar = [0, coerce, doc_comment_tag]; + runtime.caml_register_global + (1, Sexplib0_Sexp_grammar, "Sexplib0__Sexp_grammar"); + return; + } + (globalThis)); + +//# 570 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + unit_sexp_grammar = [2, 0], + sexp_t_sexp_grammar = [0, "Sexp.t"], + empty_sexp_grammar = [4, 0], + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + bool_sexp_grammar = 0, + string_sexp_grammar = 4, + bytes_sexp_grammar = 4, + char_sexp_grammar = 1, + int_sexp_grammar = 2, + float_sexp_grammar = 3, + int32_sexp_grammar = 2, + int64_sexp_grammar = 2, + nativeint_sexp_grammar = 2; + function ref_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function lazy_t_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function option_sexp_grammar(param){return [1, param];} + function list_sexp_grammar(param){return [2, [1, param]];} + function array_sexp_grammar(param){return [2, [1, param]];} + var + Sexplib0_Sexp_conv_grammar = + [0, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + empty_sexp_grammar, + empty_sexp_grammar]; + runtime.caml_register_global + (4, Sexplib0_Sexp_conv_grammar, "Sexplib0__Sexp_conv_grammar"); + return; + } + (globalThis)); + +//# 632 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Assert_failure$0 = "Assert_failure", + cst_None = "None", + cst_Some = "Some", + cst_none = "none", + cst_option_of_sexp_only_none_c$1 = "option_of_sexp: only none can be atom", + cst_some = "some", + cst_src_sexp_conv_ml = "src/sexp_conv.ml", + caml_check_bound = runtime.caml_check_bound, + caml_float_of_string = runtime.caml_float_of_string, + caml_format_float = runtime.caml_format_float, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Stdlib_Parsing = global_data.Stdlib__Parsing, + Stdlib_Queue = global_data.Stdlib__Queue, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Stdlib_Obj = global_data.Stdlib__Obj, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Ephemeron = global_data.Stdlib__Ephemeron, + Sexplib0_Sexp_conv_grammar = global_data.Sexplib0__Sexp_conv_grammar, + _aF_ = [0, 0], + _aG_ = [0, 1], + _aB_ = [0, "Sexplib.Conv.Of_sexp_error"], + _aC_ = [0, cst_src_sexp_conv_ml, 410, 15], + _ay_ = [0, 0], + _az_ = [0, 0], + cst_Assert_failure = cst_Assert_failure$0, + _av_ = [0, cst_src_sexp_conv_ml, 334, 15], + _ar_ = [0, "Exit"], + _as_ = [0, cst_src_sexp_conv_ml, 338, 15], + _an_ = [0, "End_of_file"], + _ao_ = [0, cst_src_sexp_conv_ml, 342, 15], + _aj_ = [0, "Failure"], + _ak_ = [0, cst_src_sexp_conv_ml, 346, 15], + _af_ = [0, "Not_found"], + _ag_ = [0, cst_src_sexp_conv_ml, 350, 15], + _ab_ = [0, "Invalid_argument"], + _ac_ = [0, cst_src_sexp_conv_ml, 354, 15], + cst_Match_failure = "Match_failure", + ___ = [0, cst_src_sexp_conv_ml, 358, 15], + _W_ = [0, "Not_found_s"], + _X_ = [0, cst_src_sexp_conv_ml, 362, 15], + _S_ = [0, "Sys_error"], + _T_ = [0, cst_src_sexp_conv_ml, 366, 15], + _O_ = [0, "Arg.Help"], + _P_ = [0, cst_src_sexp_conv_ml, 370, 15], + _K_ = [0, "Arg.Bad"], + _L_ = [0, cst_src_sexp_conv_ml, 374, 15], + _G_ = [0, "Lazy.Undefined"], + _H_ = [0, cst_src_sexp_conv_ml, 378, 15], + _C_ = [0, "Parsing.Parse_error"], + _D_ = [0, cst_src_sexp_conv_ml, 382, 15], + _y_ = [0, "Queue.Empty"], + _z_ = [0, cst_src_sexp_conv_ml, 386, 15], + _u_ = [0, "Scanf.Scan_failure"], + _v_ = [0, cst_src_sexp_conv_ml, 390, 15], + _q_ = [0, "Stack.Empty"], + _r_ = [0, cst_src_sexp_conv_ml, 394, 15], + _m_ = [0, "Sys.Break"], + _n_ = [0, cst_src_sexp_conv_ml, 398, 15], + _j_ = + [0, + [2, + 0, + [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, [12, 58, [4, 0, 0, 0, 0]]]]]]], + "%s %s:%d:%d"], + cst_fun_of_sexp_cannot_convert = + "fun_of_sexp: cannot convert function values", + cst_opaque_of_sexp_cannot_conv = + "opaque_of_sexp: cannot convert opaque values", + cst_hashtbl_of_sexp_tuple_list = "hashtbl_of_sexp: tuple list needed", + cst_hashtbl_of_sexp_list_neede = "hashtbl_of_sexp: list needed", + cst_array_of_sexp_list_needed = "array_of_sexp: list needed", + cst_list_of_sexp_list_needed = "list_of_sexp: list needed", + cst_triple_of_sexp_list_needed = "triple_of_sexp: list needed", + cst_triple_of_sexp_list_must_c = + "triple_of_sexp: list must contain exactly three elements only", + cst_pair_of_sexp_list_needed = "pair_of_sexp: list needed", + cst_pair_of_sexp_list_must_con = + "pair_of_sexp: list must contain exactly two elements only", + cst_option_of_sexp_only_none_c = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_r = + "option_of_sexp: list must represent optional value", + cst_option_of_sexp_only_none_c$0 = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_b = "option_of_sexp: list must be (some el)", + cst_nativeint_of_sexp = "nativeint_of_sexp: ", + cst_nativeint_of_sexp_atom_nee = "nativeint_of_sexp: atom needed", + cst_int64_of_sexp = "int64_of_sexp: ", + cst_int64_of_sexp_atom_needed = "int64_of_sexp: atom needed", + cst_int32_of_sexp = "int32_of_sexp: ", + cst_int32_of_sexp_atom_needed = "int32_of_sexp: atom needed", + cst_float_of_sexp = "float_of_sexp: ", + cst_float_of_sexp_atom_needed = "float_of_sexp: atom needed", + cst_int_of_sexp = "int_of_sexp: ", + cst_int_of_sexp_atom_needed = "int_of_sexp: atom needed", + cst_char_of_sexp_atom_string_m = + "char_of_sexp: atom string must contain one character only", + cst_char_of_sexp_atom_needed = "char_of_sexp: atom needed", + cst_bytes_of_sexp_atom_needed = "bytes_of_sexp: atom needed", + cst_string_of_sexp_atom_needed = "string_of_sexp: atom needed", + cst_bool_of_sexp_unknown_strin = "bool_of_sexp: unknown string", + cst_bool_of_sexp_atom_needed = "bool_of_sexp: atom needed", + cst_unit_of_sexp_empty_list_ne = "unit_of_sexp: empty list needed", + _i_ = [0, 2], + _h_ = [0, 2], + _f_ = [0, ""], + _e_ = [0, ""], + _b_ = [0, cst_some], + _c_ = [1, 0], + _d_ = [0, cst_none], + _a_ = [1, 0], + default_string_of_float = + [0, + function(x){ + var y = caml_format_float("%.15G", x); + return caml_float_of_string(y) == x + ? y + : caml_format_float("%.17G", x); + }], + read_old_option_format = [0, 1], + write_old_option_format = [0, 1]; + function list_map(f, l){ + var _bo_ = caml_call2(Stdlib_ListLabels[21], f, l); + return caml_call1(Stdlib_ListLabels[9], _bo_); + } + function sexp_of_unit(param){return _a_;} + function sexp_of_bool(b){return [0, caml_call1(Stdlib[30], b)];} + function sexp_of_string(str){return [0, str];} + function sexp_of_bytes(bytes){ + return [0, caml_call1(Stdlib_BytesLabels[6], bytes)]; + } + function sexp_of_char(c){ + return [0, caml_call2(Stdlib_StringLabels[1], 1, c)]; + } + function sexp_of_int(n){return [0, caml_call1(Stdlib[33], n)];} + function sexp_of_float(n){ + return [0, caml_call1(default_string_of_float[1], n)]; + } + function sexp_of_int32(n){return [0, caml_call1(Stdlib_Int32[14], n)];} + function sexp_of_int64(n){return [0, caml_call1(Stdlib_Int64[14], n)];} + function sexp_of_nativeint(n){ + return [0, caml_call1(Stdlib_Nativeint[15], n)]; + } + function sexp_of_ref(sexp_of_a, rf){return caml_call1(sexp_of_a, rf[1]);} + function sexp_of_lazy_t(sexp_of_a, lv){ + var _bm_ = runtime.caml_obj_tag(lv); + if(250 === _bm_) + var _bn_ = lv[1]; + else{ + var switch$0 = 0; + if(246 !== _bm_ && 244 !== _bm_){var _bn_ = lv; switch$0 = 1;} + if(! switch$0) var _bn_ = caml_call1(CamlinternalLazy[2], lv); + } + return caml_call1(sexp_of_a, _bn_); + } + function sexp_of_option(sexp_of_a, param){ + if(! param) return write_old_option_format[1] ? _c_ : _d_; + var x = param[1]; + return write_old_option_format[1] + ? [1, [0, caml_call1(sexp_of_a, x), 0]] + : [1, [0, _b_, [0, caml_call1(sexp_of_a, x), 0]]]; + } + function sexp_of_pair(sexp_of_a, sexp_of_b, param){ + var b = param[2], a = param[1], _bl_ = [0, caml_call1(sexp_of_b, b), 0]; + return [1, [0, caml_call1(sexp_of_a, a), _bl_]]; + } + function sexp_of_triple(sexp_of_a, sexp_of_b, sexp_of_c, param){ + var + c = param[3], + b = param[2], + a = param[1], + _bj_ = [0, caml_call1(sexp_of_c, c), 0], + _bk_ = [0, caml_call1(sexp_of_b, b), _bj_]; + return [1, [0, caml_call1(sexp_of_a, a), _bk_]]; + } + function sexp_of_list(sexp_of_a, lst){ + var _bi_ = caml_call2(Stdlib_ListLabels[21], sexp_of_a, lst); + return [1, caml_call1(Stdlib_ListLabels[9], _bi_)]; + } + function sexp_of_array(sexp_of_a, ar){ + var lst_ref = [0, 0], _bf_ = ar.length - 1 - 1 | 0; + if(_bf_ >= 0){ + var i = _bf_; + for(;;){ + var _bg_ = lst_ref[1]; + lst_ref[1] = + [0, caml_call1(sexp_of_a, caml_check_bound(ar, i)[1 + i]), _bg_]; + var _bh_ = i - 1 | 0; + if(0 !== i){var i = _bh_; continue;} + break; + } + } + return [1, lst_ref[1]]; + } + function sexp_of_hashtbl(sexp_of_key, sexp_of_val, htbl){ + function coll(k, v, acc){ + var _be_ = [0, caml_call1(sexp_of_val, v), 0]; + return [0, [1, [0, caml_call1(sexp_of_key, k), _be_]], acc]; + } + return [1, caml_call3(Stdlib_MoreLabels[1][14], coll, htbl, 0)]; + } + function sexp_of_opaque(param){return _e_;} + function sexp_of_fun(param){return _f_;} + function equal(_bd_, _bc_){return _bd_ === _bc_ ? 1 : 0;} + var + hash = Stdlib_Obj[23][3], + Exn_table = caml_call1(Stdlib_Ephemeron[1][3], [0, equal, hash]), + the_exn_table = caml_call1(Exn_table[1], 17); + function add(opt, param, extension_constructor, sexp_of_exn){ + if(opt) var sth = opt[1], printexc = sth; else var printexc = 1; + return caml_call3 + (Exn_table[5], + the_exn_table, + extension_constructor, + [0, sexp_of_exn, printexc]); + } + function find_auto(for_printexc, exn){ + var + extension_constructor = caml_call1(Stdlib_Obj[23][1], exn), + match = caml_call2(Exn_table[8], the_exn_table, extension_constructor); + if(! match) return 0; + var match$0 = match[1], printexc = match$0[2], sexp_of_exn = match$0[1]; + if(for_printexc && ! printexc) return 0; + return [0, caml_call1(sexp_of_exn, exn)]; + } + function size(param){return caml_call1(Exn_table[18], the_exn_table)[1];} + var For_unit_tests_only = [0, size]; + function sexp_of_exn_opt(exn){return find_auto(0, exn);} + function sexp_of_exn(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return [1, [0, [0, caml_call1(Stdlib_Printexc[1], exn)], 0]]; + var sexp = match[1]; + return sexp; + } + function exn_to_string(e){ + var _bb_ = sexp_of_exn(e); + return caml_call2(Sexplib0_Sexp[13], 0, _bb_); + } + function _g_(exn){ + var match = find_auto(1, exn); + if(! match) return 0; + var sexp = match[1]; + return [0, caml_call2(Sexplib0_Sexp[13], _h_, sexp)]; + } + caml_call1(Stdlib_Printexc[9], _g_); + function printexc_prefer_sexp(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return caml_call1(Stdlib_Printexc[1], exn); + var sexp = match[1]; + return caml_call2(Sexplib0_Sexp[13], _i_, sexp); + } + var Of_sexp_error = Sexplib0_Sexp[6], record_check_extra_fields = [0, 1]; + function of_sexp_error_exn(exc, sexp){ + throw caml_maybe_attach_backtrace([0, Of_sexp_error, exc, sexp], 1); + } + function of_sexp_error(what, sexp){ + throw caml_maybe_attach_backtrace + ([0, Of_sexp_error, [0, Stdlib[7], what], sexp], 1); + } + function unit_of_sexp(sexp){ + if(1 === sexp[0] && ! sexp[1]) return 0; + return of_sexp_error(cst_unit_of_sexp_empty_list_ne, sexp); + } + function bool_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bool_of_sexp_atom_needed, sexp); + var _ba_ = sexp[1]; + if(caml_string_notequal(_ba_, "False")){ + var switch$0 = 0; + if(caml_string_notequal(_ba_, "True")) + if(caml_string_notequal(_ba_, "false")){ + if(caml_string_notequal(_ba_, "true")) + return of_sexp_error(cst_bool_of_sexp_unknown_strin, sexp); + } + else + switch$0 = 1; + if(! switch$0) return 1; + } + return 0; + } + function string_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_string_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return str; + } + function bytes_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bytes_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return caml_call1(Stdlib_BytesLabels[5], str); + } + function char_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_char_of_sexp_atom_needed, sexp); + var str = sexp[1]; + if(1 !== runtime.caml_ml_string_length(str)) + of_sexp_error(cst_char_of_sexp_atom_string_m, sexp); + return runtime.caml_string_get(str, 0); + } + function int_of_sexp(sexp){ + if(0 !== sexp[0]) return of_sexp_error(cst_int_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a$_ = caml_int_of_string(str); return _a$_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a__ = exn_to_string(exc); + return of_sexp_error(caml_call2(Stdlib[28], cst_int_of_sexp, _a__), sexp); + } + } + function float_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_float_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a9_ = caml_float_of_string(str); return _a9_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a8_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_float_of_sexp, _a8_), sexp); + } + } + function int32_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int32_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a7_ = caml_int_of_string(str); return _a7_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a6_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int32_of_sexp, _a6_), sexp); + } + } + function int64_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int64_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a5_ = runtime.caml_int64_of_string(str); return _a5_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a4_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int64_of_sexp, _a4_), sexp); + } + } + function nativeint_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_nativeint_of_sexp_atom_nee, sexp); + var str = sexp[1]; + try{var _a3_ = caml_int_of_string(str); return _a3_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a2_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_nativeint_of_sexp, _a2_), sexp); + } + } + function ref_of_sexp(a_of_sexp, sexp){ + return [0, caml_call1(a_of_sexp, sexp)]; + } + function lazy_t_of_sexp(a_of_sexp, sexp){ + var _a1_ = caml_call1(a_of_sexp, sexp); + return caml_call1(Stdlib_Lazy[4], _a1_); + } + function option_of_sexp(a_of_sexp, sexp){ + if(! read_old_option_format[1]){ + if(0 === sexp[0]){ + var _aW_ = sexp[1]; + if + (caml_string_notequal(_aW_, cst_None) + && caml_string_notequal(_aW_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c$0, sexp); + return 0; + } + var _aX_ = sexp[1]; + if(_aX_){ + var _aY_ = _aX_[1]; + if(0 === _aY_[0]){ + var _aZ_ = _aY_[1], switch$2 = 0; + if + (! + caml_string_notequal(_aZ_, cst_Some) + || ! caml_string_notequal(_aZ_, cst_some)) + switch$2 = 1; + if(switch$2){ + var _a0_ = _aX_[2]; + if(_a0_ && ! _a0_[2]){ + var el$0 = _a0_[1]; + return [0, caml_call1(a_of_sexp, el$0)]; + } + } + } + } + return of_sexp_error(cst_option_of_sexp_list_must_b, sexp); + } + if(0 === sexp[0]){ + var _aR_ = sexp[1]; + if + (caml_string_notequal(_aR_, cst_None) + && caml_string_notequal(_aR_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c, sexp); + } + else{ + var _aS_ = sexp[1]; + if(_aS_){ + var _aT_ = _aS_[1]; + if(_aS_[2]){ + var switch$0 = 0; + if(0 === _aT_[0]){ + var _aU_ = _aT_[1], switch$1 = 0; + if + (! + caml_string_notequal(_aU_, cst_Some) + || ! caml_string_notequal(_aU_, cst_some)) + switch$1 = 1; + if(switch$1){ + var _aV_ = _aS_[2]; + if(! _aV_[2]){var el = _aV_[1]; switch$0 = 1;} + } + } + if(! switch$0) + return of_sexp_error(cst_option_of_sexp_list_must_r, sexp); + } + else + var el = _aT_; + return [0, caml_call1(a_of_sexp, el)]; + } + } + return 0; + } + function pair_of_sexp(a_of_sexp, b_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_pair_of_sexp_list_needed, sexp); + var _aP_ = sexp[1]; + if(_aP_){ + var _aQ_ = _aP_[2]; + if(_aQ_ && ! _aQ_[2]){ + var + b_sexp = _aQ_[1], + a_sexp = _aP_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp); + return [0, a, b]; + } + } + return of_sexp_error(cst_pair_of_sexp_list_must_con, sexp); + } + function triple_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_triple_of_sexp_list_needed, sexp); + var _aM_ = sexp[1]; + if(_aM_){ + var _aN_ = _aM_[2]; + if(_aN_){ + var _aO_ = _aN_[2]; + if(_aO_ && ! _aO_[2]){ + var + c_sexp = _aO_[1], + b_sexp = _aN_[1], + a_sexp = _aM_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp), + c = caml_call1(c_of_sexp, c_sexp); + return [0, a, b, c]; + } + } + } + return of_sexp_error(cst_triple_of_sexp_list_must_c, sexp); + } + function list_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_list_of_sexp_list_needed, sexp); + var + lst = sexp[1], + rev_lst = caml_call2(Stdlib_ListLabels[21], a_of_sexp, lst); + return caml_call1(Stdlib_ListLabels[9], rev_lst); + } + function array_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_array_of_sexp_list_needed, sexp); + var match = sexp[1]; + if(! match) return [0]; + var + t = match[2], + h = match[1], + len = caml_call1(Stdlib_ListLabels[1], t) + 1 | 0, + res = runtime.caml_make_vect(len, caml_call1(a_of_sexp, h)), + i = 1, + param = t; + for(;;){ + if(! param) return res; + var t$0 = param[2], h$0 = param[1], _aL_ = caml_call1(a_of_sexp, h$0); + caml_check_bound(res, i)[1 + i] = _aL_; + var i$0 = i + 1 | 0, i = i$0, param = t$0; + } + } + function hashtbl_of_sexp(key_of_sexp, val_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_hashtbl_of_sexp_list_neede, sexp); + var lst = sexp[1], htbl = caml_call2(Stdlib_MoreLabels[1][1], 0, 0); + function act(param){ + if(1 === param[0]){ + var _aH_ = param[1]; + if(_aH_){ + var _aI_ = _aH_[2]; + if(_aI_ && ! _aI_[2]){ + var + v_sexp = _aI_[1], + k_sexp = _aH_[1], + _aJ_ = caml_call1(val_of_sexp, v_sexp), + _aK_ = caml_call1(key_of_sexp, k_sexp); + return caml_call3(Stdlib_MoreLabels[1][5], htbl, _aK_, _aJ_); + } + } + } + return of_sexp_error(cst_hashtbl_of_sexp_tuple_list, sexp); + } + caml_call2(Stdlib_ListLabels[17], act, lst); + return htbl; + } + function opaque_of_sexp(sexp){ + return of_sexp_error(cst_opaque_of_sexp_cannot_conv, sexp); + } + function fun_of_sexp(sexp){ + return of_sexp_error(cst_fun_of_sexp_cannot_convert, sexp); + } + var + unit_sexp_grammar = Sexplib0_Sexp_conv_grammar[1], + bool_sexp_grammar = Sexplib0_Sexp_conv_grammar[2], + string_sexp_grammar = Sexplib0_Sexp_conv_grammar[3], + bytes_sexp_grammar = Sexplib0_Sexp_conv_grammar[4], + char_sexp_grammar = Sexplib0_Sexp_conv_grammar[5], + int_sexp_grammar = Sexplib0_Sexp_conv_grammar[6], + float_sexp_grammar = Sexplib0_Sexp_conv_grammar[7], + int32_sexp_grammar = Sexplib0_Sexp_conv_grammar[8], + int64_sexp_grammar = Sexplib0_Sexp_conv_grammar[9], + nativeint_sexp_grammar = Sexplib0_Sexp_conv_grammar[10], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[11], + ref_sexp_grammar = Sexplib0_Sexp_conv_grammar[12], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[13], + option_sexp_grammar = Sexplib0_Sexp_conv_grammar[14], + list_sexp_grammar = Sexplib0_Sexp_conv_grammar[15], + array_sexp_grammar = Sexplib0_Sexp_conv_grammar[16], + opaque_sexp_grammar = Sexplib0_Sexp_conv_grammar[17], + fun_sexp_grammar = Sexplib0_Sexp_conv_grammar[18]; + function get_flc_error(name, param){ + var chr = param[3], line = param[2], file = param[1]; + return [0, caml_call5(Stdlib_Printf[4], _j_, name, file, line, chr)]; + } + var _k_ = 0; + function _l_(param){ + if(param === Stdlib_Sys[44]) return _m_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + var _o_ = [0, [0, Stdlib_Sys[44], _l_], _k_]; + function _p_(param){ + if(param === Stdlib_Stack[1]) return _q_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var _s_ = [0, [0, Stdlib_Stack[1], _p_], _o_]; + function _t_(param){ + if(param[1] !== Stdlib_Scanf[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var arg = param[2]; + return [1, [0, _u_, [0, [0, arg], 0]]]; + } + var _w_ = [0, [0, Stdlib_Scanf[2], _t_], _s_]; + function _x_(param){ + if(param === Stdlib_Queue[1]) return _y_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + var _A_ = [0, [0, Stdlib_Queue[1], _x_], _w_]; + function _B_(param){ + if(param === Stdlib_Parsing[10]) return _C_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + } + var _E_ = [0, [0, Stdlib_Parsing[10], _B_], _A_]; + function _F_(param){ + if(param === Stdlib_Lazy[1]) return _G_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + } + var _I_ = [0, [0, Stdlib_Lazy[1], _F_], _E_]; + function _J_(param){ + if(param[1] !== Stdlib_Arg[8]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + var arg = param[2]; + return [1, [0, _K_, [0, [0, arg], 0]]]; + } + var _M_ = [0, [0, Stdlib_Arg[8], _J_], _I_]; + function _N_(param){ + if(param[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _P_], 1); + var arg = param[2]; + return [1, [0, _O_, [0, [0, arg], 0]]]; + } + var _Q_ = [0, [0, Stdlib_Arg[7], _N_], _M_]; + function _R_(param){ + if(param[1] !== Stdlib[11]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + var arg = param[2]; + return [1, [0, _S_, [0, [0, arg], 0]]]; + } + var _U_ = [0, [0, Stdlib[11], _R_], _Q_]; + function _V_(param){ + if(param[1] !== Sexplib0_Sexp[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + var arg = param[2]; + return [1, [0, _W_, [0, arg, 0]]]; + } + var _Y_ = [0, [0, Sexplib0_Sexp[5], _V_], _U_]; + function _Z_(param){ + if(param[1] !== Stdlib[4]) + throw caml_maybe_attach_backtrace([0, Assert_failure, ___], 1); + var arg = param[2]; + return get_flc_error(cst_Match_failure, arg); + } + var _$_ = [0, [0, Stdlib[4], _Z_], _Y_]; + function _aa_(param){ + if(param[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ac_], 1); + var arg = param[2]; + return [1, [0, _ab_, [0, [0, arg], 0]]]; + } + var _ad_ = [0, [0, Stdlib[6], _aa_], _$_]; + function _ae_(param){ + if(param === Stdlib[8]) return _af_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ag_], 1); + } + var _ah_ = [0, [0, Stdlib[8], _ae_], _ad_]; + function _ai_(param){ + if(param[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ak_], 1); + var arg = param[2]; + return [1, [0, _aj_, [0, [0, arg], 0]]]; + } + var _al_ = [0, [0, Stdlib[7], _ai_], _ah_]; + function _am_(param){ + if(param === Stdlib[12]) return _an_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ao_], 1); + } + var _ap_ = [0, [0, Stdlib[12], _am_], _al_]; + function _aq_(param){ + if(param === Stdlib[3]) return _ar_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _as_], 1); + } + var _at_ = [0, [0, Stdlib[3], _aq_], _ap_]; + function _au_(param){ + if(param[1] !== Stdlib[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _av_], 1); + var arg = param[2]; + return get_flc_error(cst_Assert_failure, arg); + } + var _aw_ = [0, [0, Stdlib[5], _au_], _at_]; + function _ax_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_az_, _ay_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _ax_, _aw_); + var + _aA_ = 0, + _aD_ = + [0, + [0, + Of_sexp_error, + function(param){ + if(param[1] !== Of_sexp_error) + throw caml_maybe_attach_backtrace([0, Assert_failure, _aC_], 1); + var sexp = param[3], exc = param[2]; + return [1, [0, _aB_, [0, sexp_of_exn(exc), [0, sexp, 0]]]]; + }], + _aA_]; + function _aE_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_aG_, _aF_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _aE_, _aD_); + var + Sexplib0_Sexp_conv = + [0, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + [0, add, For_unit_tests_only]]; + runtime.caml_register_global + (117, Sexplib0_Sexp_conv, "Sexplib0__Sexp_conv"); + return; + } + (globalThis)); + +//# 1429 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = " ", + cst_has_incorrect_number_of_ar = " has incorrect number of arguments", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_Printf = global_data.Stdlib__Printf, + Of_sexp_error = Sexplib0_Sexp_conv[25], + cst_of_sexp_trying_to_convert_ = + "_of_sexp: trying to convert an empty type", + cst_of_sexp_the_empty_list_is_ = + "_of_sexp: the empty list is an invalid polymorphic variant", + cst_of_sexp_a_nested_list_is_a = + "_of_sexp: a nested list is an invalid polymorphic variant", + cst_of_sexp_polymorphic_varian$0 = + "_of_sexp: polymorphic variant tag takes an argument", + _e_ = + [0, + [2, + 0, + [11, + "_of_sexp: polymorphic variant tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: polymorphic variant tag %S has incorrect number of arguments"], + cst_of_sexp_polymorphic_varian = + "_of_sexp: polymorphic variant does not take arguments", + cst_of_sexp_no_matching_varian = "_of_sexp: no matching variant found", + cst_of_sexp_cannot_convert_val = + "_of_sexp: cannot convert values of types resulting from polymorphic record fields", + cst_of_sexp_list_instead_of_at = + "_of_sexp: list instead of atom for record expected", + _d_ = + [0, + [2, + 0, + [11, + "_of_sexp: the following record elements were undefined: ", + [2, 0, 0]]], + "%s_of_sexp: the following record elements were undefined: %s"], + cst_extra_fields = "extra fields", + cst_duplicate_fields = "duplicate fields", + _c_ = + [0, + [2, 0, [11, "_of_sexp: ", [2, 0, [11, ": ", [2, 0, 0]]]]], + "%s_of_sexp: %s: %s"], + cst_of_sexp_record_conversion_$0 = + "_of_sexp: record conversion: only pairs expected, their first element must be an atom", + cst_of_sexp_record_conversion_ = + "_of_sexp: record conversion: a [sexp.bool] field was given a payload.", + cst_of_sexp_unexpected_variant = + "_of_sexp: unexpected variant constructor", + cst_of_sexp_expected_a_variant$0 = + "_of_sexp: expected a variant type, saw an empty list", + cst_of_sexp_expected_a_variant = + "_of_sexp: expected a variant type, saw a nested list", + cst_of_sexp_this_constructor_r = + "_of_sexp: this constructor requires arguments", + _b_ = + [0, + [2, + 0, + [11, + "_of_sexp: sum tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: sum tag %S has incorrect number of arguments"], + cst_of_sexp_this_constructor_d = + "_of_sexp: this constructor does not take arguments", + _a_ = + [0, + [2, + 0, + [11, "_of_sexp: tuple of size ", [4, 0, 0, 0, [11, " expected", 0]]]], + "%s_of_sexp: tuple of size %d expected"], + cst_Sexplib0_Sexp_conv_error_N = + "Sexplib0__Sexp_conv_error.No_variant_match"; + function tuple_of_size_n_expected(loc, n, sexp){ + var _t_ = caml_call3(Stdlib_Printf[4], _a_, loc, n); + return caml_call2(Sexplib0_Sexp_conv[27], _t_, sexp); + } + function stag_no_args(loc, sexp){ + var _s_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_d); + return caml_call2(Sexplib0_Sexp_conv[27], _s_, sexp); + } + function stag_incorrect_n_args(loc, tag, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _b_, loc, tag); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function stag_takes_args(loc, sexp){ + var _r_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_r); + return caml_call2(Sexplib0_Sexp_conv[27], _r_, sexp); + } + function nested_list_invalid_sum(loc, sexp){ + var _q_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _q_, sexp); + } + function empty_list_invalid_sum(loc, sexp){ + var _p_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant$0); + return caml_call2(Sexplib0_Sexp_conv[27], _p_, sexp); + } + function unexpected_stag(loc, sexp){ + var _o_ = caml_call2(Stdlib[28], loc, cst_of_sexp_unexpected_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _o_, sexp); + } + function record_sexp_bool_with_payload(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_only_pairs_expected(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_superfluous_fields(what, loc, rev_fld_names, sexp){ + var + _n_ = caml_call1(Stdlib_ListLabels[9], rev_fld_names), + fld_names_str = caml_call2(Stdlib_StringLabels[6], cst, _n_), + msg = caml_call4(Stdlib_Printf[4], _c_, loc, what, fld_names_str); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_duplicate_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_duplicate_fields, loc, rev_fld_names, sexp); + } + function record_extra_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_extra_fields, loc, rev_fld_names, sexp); + } + function record_get_undefined_loop(fields, param){ + var fields$0 = fields, param$0 = param; + for(;;){ + if(! param$0){ + var _m_ = caml_call1(Stdlib_ListLabels[9], fields$0); + return caml_call2(Stdlib_StringLabels[6], cst$0, _m_); + } + var _l_ = param$0[1]; + if(_l_[1]){ + var + rest = param$0[2], + field = _l_[2], + fields$1 = [0, field, fields$0], + fields$0 = fields$1, + param$0 = rest; + continue; + } + var rest$0 = param$0[2], param$0 = rest$0; + } + } + function record_undefined_elements(loc, sexp, lst){ + var + undefined$0 = record_get_undefined_loop(0, lst), + msg = caml_call3(Stdlib_Printf[4], _d_, loc, undefined$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_list_instead_atom(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_list_instead_of_at); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_poly_field_value(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_cannot_convert_val); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + var + No_variant_match = + [248, cst_Sexplib0_Sexp_conv_error_N, runtime.caml_fresh_oo_id(0)]; + function no_variant_match(param){ + throw caml_maybe_attach_backtrace(No_variant_match, 1); + } + function no_matching_variant_found(loc, sexp){ + var _k_ = caml_call2(Stdlib[28], loc, cst_of_sexp_no_matching_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _k_, sexp); + } + function ptag_no_args(loc, sexp){ + var _j_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _j_, sexp); + } + function ptag_incorrect_n_args(loc, cnstr, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _e_, loc, cnstr); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function ptag_takes_args(loc, sexp){ + var _i_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian$0); + return caml_call2(Sexplib0_Sexp_conv[27], _i_, sexp); + } + function nested_list_invalid_poly_var(loc, sexp){ + var _h_ = caml_call2(Stdlib[28], loc, cst_of_sexp_a_nested_list_is_a); + return caml_call2(Sexplib0_Sexp_conv[27], _h_, sexp); + } + function empty_list_invalid_poly_var(loc, sexp){ + var _g_ = caml_call2(Stdlib[28], loc, cst_of_sexp_the_empty_list_is_); + return caml_call2(Sexplib0_Sexp_conv[27], _g_, sexp); + } + function empty_type(loc, sexp){ + var _f_ = caml_call2(Stdlib[28], loc, cst_of_sexp_trying_to_convert_); + return caml_call2(Sexplib0_Sexp_conv[27], _f_, sexp); + } + var + Sexplib0_Sexp_conv_error = + [0, + Of_sexp_error, + tuple_of_size_n_expected, + stag_no_args, + stag_incorrect_n_args, + stag_takes_args, + nested_list_invalid_sum, + empty_list_invalid_sum, + unexpected_stag, + record_sexp_bool_with_payload, + record_only_pairs_expected, + record_superfluous_fields, + record_duplicate_fields, + record_extra_fields, + record_get_undefined_loop, + record_undefined_elements, + record_list_instead_atom, + record_poly_field_value, + No_variant_match, + no_variant_match, + no_matching_variant_found, + ptag_no_args, + ptag_incorrect_n_args, + ptag_takes_args, + nested_list_invalid_poly_var, + empty_list_invalid_poly_var, + empty_type]; + runtime.caml_register_global + (30, Sexplib0_Sexp_conv_error, "Sexplib0__Sexp_conv_error"); + return; + } + (globalThis)); + +//# 1689 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Sexplib0_Sexpable = [0]; + runtime.caml_register_global(0, Sexplib0_Sexpable, "Sexplib0__Sexpable"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + invalid_arg = Caml[1], + failwith = Caml[2], + Exit = Caml[3], + Not_found = Caml[8], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int = Caml[19], + min_int = Caml[20], + lnot = Caml[21], + infinity = Caml[22], + neg_infinity = Caml[23], + nan = Caml[24], + max_float = Caml[25], + min_float = Caml[26], + epsilon_float = Caml[27], + symbol = Caml[28], + char_of_int = Caml[29], + string_of_bool = Caml[30], + bool_of_string_opt = Caml[31], + bool_of_string = Caml[32], + string_of_int = Caml[33], + int_of_string_opt = Caml[34], + string_of_float = Caml[35], + float_of_string_opt = Caml[36], + symbol$0 = Caml[37], + stdin = Caml[38], + stdout = Caml[39], + stderr = Caml[40], + print_char = Caml[41], + print_string = Caml[42], + print_bytes = Caml[43], + print_int = Caml[44], + print_float = Caml[45], + print_endline = Caml[46], + print_newline = Caml[47], + prerr_char = Caml[48], + prerr_string = Caml[49], + prerr_bytes = Caml[50], + prerr_int = Caml[51], + prerr_float = Caml[52], + prerr_endline = Caml[53], + prerr_newline = Caml[54], + read_line = Caml[55], + read_int_opt = Caml[56], + read_int = Caml[57], + read_float_opt = Caml[58], + read_float = Caml[59], + open_out = Caml[60], + open_out_bin = Caml[61], + open_out_gen = Caml[62], + flush = Caml[63], + flush_all = Caml[64], + output_char = Caml[65], + output_string = Caml[66], + output_bytes = Caml[67], + output = Caml[68], + output_substring = Caml[69], + output_byte = Caml[70], + output_binary_int = Caml[71], + output_value = Caml[72], + seek_out = Caml[73], + pos_out = Caml[74], + out_channel_length = Caml[75], + close_out = Caml[76], + close_out_noerr = Caml[77], + set_binary_mode_out = Caml[78], + open_in = Caml[79], + open_in_bin = Caml[80], + open_in_gen = Caml[81], + input_char = Caml[82], + input_line = Caml[83], + input = Caml[84], + really_input = Caml[85], + really_input_string = Caml[86], + input_byte = Caml[87], + input_binary_int = Caml[88], + input_value = Caml[89], + seek_in = Caml[90], + pos_in = Caml[91], + in_channel_length = Caml[92], + close_in = Caml[93], + close_in_noerr = Caml[94], + set_binary_mode_in = Caml[95], + string_of_format = Caml[97], + symbol$1 = Caml[98], + exit = Caml[99], + at_exit = Caml[100], + valid_float_lexem = Caml[101], + unsafe_really_input = Caml[102], + do_at_exit = Caml[103], + do_domain_local_at_exit = Caml[104], + Shadow_stdlib = + [0, + invalid_arg, + failwith, + Exit, + Not_found, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Shadow_stdlib, "Shadow_stdlib"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base/base.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_compare = runtime.caml_compare, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml; + function descending(x, y){return caml_compare(y, x);} + var + max = Caml[17], + min = Caml[16], + Base_Poly0 = [0, caml_compare, descending, min, max]; + runtime.caml_register_global(1, Base_Poly0, "Base__Poly0"); + return; + } + (globalThis)); + +//# 36 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_equal = runtime.caml_bytes_equal, + caml_bytes_greaterequal = runtime.caml_bytes_greaterequal, + caml_bytes_lessequal = runtime.caml_bytes_lessequal, + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int_compare = runtime.caml_int_compare, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_notequal = runtime.caml_notequal, + caml_string_equal = runtime.caml_string_equal, + caml_string_greaterequal = runtime.caml_string_greaterequal, + caml_string_lessequal = runtime.caml_string_lessequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Poly0 = global_data.Base__Poly0, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Shadow_stdlib = global_data.Shadow_stdlib, + Caml = global_data.Caml, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + invalid_arg = Caml[1], + failwith = Caml[2], + Exit$0 = Caml[3], + Match_failure = Caml[4], + Assert_failure = Caml[5], + Invalid_argument = Caml[6], + Failure = Caml[7], + Out_of_memory = Caml[9], + Stack_overflow = Caml[10], + Sys_error = Caml[11], + End_of_file = Caml[12], + Division_by_zero = Caml[13], + Sys_blocked_io = Caml[14], + Undefined_recursive_module = Caml[15], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int$0 = Caml[19], + min_int$0 = Caml[20], + lnot = Caml[21], + infinity$0 = Caml[22], + neg_infinity$0 = Caml[23], + nan$0 = Caml[24], + max_float$0 = Caml[25], + min_float$0 = Caml[26], + epsilon_float$0 = Caml[27], + symbol$0 = Caml[28], + char_of_int$0 = Caml[29], + string_of_bool$0 = Caml[30], + bool_of_string_opt$0 = Caml[31], + bool_of_string$0 = Caml[32], + string_of_int$0 = Caml[33], + int_of_string_opt$0 = Caml[34], + string_of_float$0 = Caml[35], + float_of_string_opt$0 = Caml[36], + symbol$1 = Caml[37], + stdin$0 = Caml[38], + stdout$0 = Caml[39], + stderr$0 = Caml[40], + print_char$0 = Caml[41], + print_string$0 = Caml[42], + print_bytes$0 = Caml[43], + print_int$0 = Caml[44], + print_float$0 = Caml[45], + print_endline$0 = Caml[46], + print_newline$0 = Caml[47], + prerr_char$0 = Caml[48], + prerr_string$0 = Caml[49], + prerr_bytes$0 = Caml[50], + prerr_int$0 = Caml[51], + prerr_float$0 = Caml[52], + prerr_endline$0 = Caml[53], + prerr_newline$0 = Caml[54], + read_line$0 = Caml[55], + read_int_opt$0 = Caml[56], + read_int$0 = Caml[57], + read_float_opt$0 = Caml[58], + read_float$0 = Caml[59], + open_out$0 = Caml[60], + open_out_bin$0 = Caml[61], + open_out_gen$0 = Caml[62], + flush$0 = Caml[63], + flush_all$0 = Caml[64], + output_char$0 = Caml[65], + output_string$0 = Caml[66], + output_bytes$0 = Caml[67], + output$0 = Caml[68], + output_substring$0 = Caml[69], + output_byte$0 = Caml[70], + output_binary_int$0 = Caml[71], + output_value$0 = Caml[72], + seek_out$0 = Caml[73], + pos_out$0 = Caml[74], + out_channel_length$0 = Caml[75], + close_out$0 = Caml[76], + close_out_noerr$0 = Caml[77], + set_binary_mode_out$0 = Caml[78], + open_in$0 = Caml[79], + open_in_bin$0 = Caml[80], + open_in_gen$0 = Caml[81], + input_char$0 = Caml[82], + input_line$0 = Caml[83], + input$0 = Caml[84], + really_input$0 = Caml[85], + really_input_string$0 = Caml[86], + input_byte$0 = Caml[87], + input_binary_int$0 = Caml[88], + input_value$0 = Caml[89], + seek_in$0 = Caml[90], + pos_in$0 = Caml[91], + in_channel_length$0 = Caml[92], + close_in$0 = Caml[93], + close_in_noerr$0 = Caml[94], + set_binary_mode_in$0 = Caml[95], + LargeFile = Caml[96], + string_of_format$0 = Caml[97], + symbol$2 = Caml[98], + exit$0 = Caml[99], + at_exit$0 = Caml[100], + valid_float_lexem$0 = Caml[101], + unsafe_really_input$0 = Caml[102], + do_at_exit$0 = Caml[103], + do_domain_local_at_exit$0 = Caml[104], + Not_found$0 = Caml[8], + Caml$0 = + [0, + invalid_arg, + failwith, + Exit$0, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int$0, + min_int$0, + lnot, + infinity$0, + neg_infinity$0, + nan$0, + max_float$0, + min_float$0, + epsilon_float$0, + symbol$0, + char_of_int$0, + string_of_bool$0, + bool_of_string_opt$0, + bool_of_string$0, + string_of_int$0, + int_of_string_opt$0, + string_of_float$0, + float_of_string_opt$0, + symbol$1, + stdin$0, + stdout$0, + stderr$0, + print_char$0, + print_string$0, + print_bytes$0, + print_int$0, + print_float$0, + print_endline$0, + print_newline$0, + prerr_char$0, + prerr_string$0, + prerr_bytes$0, + prerr_int$0, + prerr_float$0, + prerr_endline$0, + prerr_newline$0, + read_line$0, + read_int_opt$0, + read_int$0, + read_float_opt$0, + read_float$0, + open_out$0, + open_out_bin$0, + open_out_gen$0, + flush$0, + flush_all$0, + output_char$0, + output_string$0, + output_bytes$0, + output$0, + output_substring$0, + output_byte$0, + output_binary_int$0, + output_value$0, + seek_out$0, + pos_out$0, + out_channel_length$0, + close_out$0, + close_out_noerr$0, + set_binary_mode_out$0, + open_in$0, + open_in_bin$0, + open_in_gen$0, + input_char$0, + input_line$0, + input$0, + really_input$0, + really_input_string$0, + input_byte$0, + input_binary_int$0, + input_value$0, + seek_in$0, + pos_in$0, + in_channel_length$0, + close_in$0, + close_in_noerr$0, + set_binary_mode_in$0, + LargeFile, + string_of_format$0, + symbol$2, + exit$0, + at_exit$0, + valid_float_lexem$0, + unsafe_really_input$0, + do_at_exit$0, + do_domain_local_at_exit$0, + Not_found$0]; + function bool_to_int(x){return x;} + function symbol$3(_V_, _U_){return _V_ !== _U_ ? 1 : 0;} + var symbol$4 = runtime.caml_mul; + function symbol$5(_T_, _S_){return Math.pow(_T_, _S_);} + function symbol$6(_R_, _Q_){return _R_ * _Q_;} + function symbol$7(_P_, _O_){return _P_ + _O_ | 0;} + function symbol$8(_N_, _M_){return _N_ + _M_;} + function symbol$9(_L_, _K_){return _L_ - _K_ | 0;} + function symbol$10(_J_, _I_){return _J_ - _I_;} + var symbol$11 = runtime.caml_div; + function symbol$12(_H_, _G_){return _H_ / _G_;} + var ascending = caml_int_compare; + function descending(x, y){return caml_int_compare(y, x);} + function max$0(x, y){return y <= x ? x : y;} + function min$0(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, ascending, descending, max$0, min$0], + ascending$0 = Int_replace_polymorphic_compar[1], + descending$0 = Int_replace_polymorphic_compar[2], + max$1 = Int_replace_polymorphic_compar[3], + min$1 = Int_replace_polymorphic_compar[4], + symbol$13 = caml_lessthan, + symbol$14 = caml_lessequal, + symbol$15 = caml_notequal, + symbol$16 = caml_equal, + symbol$17 = caml_greaterthan, + symbol$18 = caml_greaterequal; + function ascending$1(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$1(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare = caml_int_compare, equal = caml_equal; + function max$2(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$2(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int32_replace_polymorphic_comp = + [0, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + ascending$1, + descending$1, + compare, + equal, + max$2, + min$2]; + function ascending$2(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$2(x, y){return caml_call2(Base_Poly0[2], x, y);} + function max$3(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$3(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int64_replace_polymorphic_comp = + [0, ascending$2, descending$2, max$3, min$3], + symbol$19 = caml_lessthan, + symbol$20 = caml_lessequal, + symbol$21 = caml_notequal, + symbol$22 = caml_equal, + symbol$23 = caml_greaterthan, + symbol$24 = caml_greaterequal; + function ascending$3(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$3(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare, equal$0 = caml_equal; + function max$4(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$4(x, y){return caml_lessequal(x, y) ? x : y;} + var + Nativeint_replace_polymorphic_ = + [0, + symbol$19, + symbol$20, + symbol$21, + symbol$22, + symbol$23, + symbol$24, + ascending$3, + descending$3, + compare$0, + equal$0, + max$4, + min$4]; + function symbol$25(x, y){return x < y ? 1 : 0;} + function symbol$26(x, y){return x <= y ? 1 : 0;} + function symbol$27(x, y){return x !== y ? 1 : 0;} + function symbol$28(x, y){return x === y ? 1 : 0;} + function symbol$29(x, y){return y < x ? 1 : 0;} + function symbol$30(x, y){return y <= x ? 1 : 0;} + function ascending$4(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$4(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$1 = caml_int_compare; + function equal$1(x, y){return x === y ? 1 : 0;} + function max$5(x, y){return y <= x ? x : y;} + function min$5(x, y){return x <= y ? x : y;} + var + Bool_replace_polymorphic_compa = + [0, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + ascending$4, + descending$4, + compare$1, + equal$1, + max$5, + min$5]; + function symbol$31(x, y){return x < y ? 1 : 0;} + function symbol$32(x, y){return x <= y ? 1 : 0;} + function symbol$33(x, y){return x !== y ? 1 : 0;} + function symbol$34(x, y){return x === y ? 1 : 0;} + function symbol$35(x, y){return y < x ? 1 : 0;} + function symbol$36(x, y){return y <= x ? 1 : 0;} + function ascending$5(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$5(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$2 = caml_int_compare; + function equal$2(x, y){return x === y ? 1 : 0;} + function max$6(x, y){return y <= x ? x : y;} + function min$6(x, y){return x <= y ? x : y;} + var + Char_replace_polymorphic_compa = + [0, + symbol$31, + symbol$32, + symbol$33, + symbol$34, + symbol$35, + symbol$36, + ascending$5, + descending$5, + compare$2, + equal$2, + max$6, + min$6]; + function i(x){return caml_call1(Stdlib_Uchar[10], x);} + function symbol$37(x, y){var _F_ = i(y); return i(x) < _F_ ? 1 : 0;} + function symbol$38(x, y){var _E_ = i(y); return i(x) <= _E_ ? 1 : 0;} + function symbol$39(x, y){var _D_ = i(y); return i(x) !== _D_ ? 1 : 0;} + function symbol$40(x, y){var _C_ = i(y); return i(x) === _C_ ? 1 : 0;} + function symbol$41(x, y){var _B_ = i(y); return _B_ < i(x) ? 1 : 0;} + function symbol$42(x, y){var _A_ = i(y); return _A_ <= i(x) ? 1 : 0;} + function ascending$6(x, y){ + var _y_ = i(y), _z_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[1], _z_, _y_); + } + function descending$6(x, y){ + var _w_ = i(y), _x_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[2], _x_, _w_); + } + function compare$3(x, y){ + var _v_ = i(y); + return caml_int_compare(i(x), _v_); + } + function equal$3(x, y){var _u_ = i(y); return i(x) === _u_ ? 1 : 0;} + function max$7(x, y){return symbol$42(x, y) ? x : y;} + function min$7(x, y){return symbol$38(x, y) ? x : y;} + var + Uchar_replace_polymorphic_comp = + [0, + i, + symbol$37, + symbol$38, + symbol$39, + symbol$40, + symbol$41, + symbol$42, + ascending$6, + descending$6, + compare$3, + equal$3, + max$7, + min$7]; + function symbol$43(x, y){return x < y ? 1 : 0;} + function symbol$44(x, y){return x <= y ? 1 : 0;} + function symbol$45(x, y){return x != y ? 1 : 0;} + function symbol$46(x, y){return x == y ? 1 : 0;} + function symbol$47(x, y){return y < x ? 1 : 0;} + function symbol$48(x, y){return y <= x ? 1 : 0;} + function ascending$7(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$7(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$4 = runtime.caml_float_compare; + function equal$4(x, y){return x == y ? 1 : 0;} + function max$8(x, y){return y <= x ? x : y;} + function min$8(x, y){return x <= y ? x : y;} + var + Float_replace_polymorphic_comp = + [0, + symbol$43, + symbol$44, + symbol$45, + symbol$46, + symbol$47, + symbol$48, + ascending$7, + descending$7, + compare$4, + equal$4, + max$8, + min$8], + symbol$49 = runtime.caml_string_lessthan, + symbol$50 = caml_string_lessequal, + symbol$51 = runtime.caml_string_notequal, + symbol$52 = caml_string_equal, + symbol$53 = runtime.caml_string_greaterthan, + symbol$54 = caml_string_greaterequal; + function ascending$8(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$8(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$5 = runtime.caml_string_compare, equal$5 = caml_string_equal; + function max$9(x, y){return caml_string_greaterequal(x, y) ? x : y;} + function min$9(x, y){return caml_string_lessequal(x, y) ? x : y;} + var + String_replace_polymorphic_com = + [0, + symbol$49, + symbol$50, + symbol$51, + symbol$52, + symbol$53, + symbol$54, + ascending$8, + descending$8, + compare$5, + equal$5, + max$9, + min$9], + symbol$55 = runtime.caml_bytes_lessthan, + symbol$56 = caml_bytes_lessequal, + symbol$57 = runtime.caml_bytes_notequal, + symbol$58 = caml_bytes_equal, + symbol$59 = runtime.caml_bytes_greaterthan, + symbol$60 = caml_bytes_greaterequal; + function ascending$9(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$9(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$6 = runtime.caml_bytes_compare, equal$6 = caml_bytes_equal; + function max$10(x, y){return caml_bytes_greaterequal(x, y) ? x : y;} + function min$10(x, y){return caml_bytes_lessequal(x, y) ? x : y;} + var + Bytes_replace_polymorphic_comp = + [0, + symbol$55, + symbol$56, + symbol$57, + symbol$58, + symbol$59, + symbol$60, + ascending$9, + descending$9, + compare$6, + equal$6, + max$10, + min$10], + symbol$61 = Caml$0[36], + symbol$62 = Caml$0[27]; + function symbol$63(_t_){return - _t_ | 0;} + function symbol$64(_s_){return - _s_;} + function asr(_r_, _q_){return _r_ >> _q_;} + function land(_p_, _o_){return _p_ & _o_;} + var lnot$0 = Caml$0[20]; + function lor(_n_, _m_){return _n_ | _m_;} + function lsl(_l_, _k_){return _l_ << _k_;} + function lsr(_j_, _i_){return _j_ >>> _i_ | 0;} + function lxor(_h_, _g_){return _h_ ^ _g_;} + var mod = runtime.caml_mod, abs$0 = Caml$0[17], failwith$0 = Caml$0[2]; + function fst(_f_){return _f_[1];} + var invalid_arg$0 = Caml$0[1]; + function snd(_e_){return _e_[2];} + function phys_equal(_d_, _c_){return _d_ === _c_ ? 1 : 0;} + function decr(_b_){_b_[1] += -1; return 0;} + function incr(_a_){_a_[1]++; return 0;} + var + float_of_string = runtime.caml_float_of_string, + am_testing = runtime.Base_am_testing(0), + Base_Import0 = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml$0, + bool_to_int, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + Int_replace_polymorphic_compar, + ascending$0, + descending$0, + max$1, + min$1, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$61, + symbol$62, + symbol$63, + symbol$64, + asr, + land, + lnot$0, + lor, + lsl, + lsr, + lxor, + mod, + abs$0, + failwith$0, + fst, + invalid_arg$0, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing]; + runtime.caml_register_global(4, Base_Import0, "Base__Import0"); + return; + } + (globalThis)); + +//# 777 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Stdlib_Printf = global_data.Stdlib__Printf, + sprintf = Stdlib_Printf[4], + bprintf = Stdlib_Printf[5], + ifprintf = Stdlib_Printf[6], + ksprintf = Stdlib_Printf[10], + kbprintf = Stdlib_Printf[11]; + function failwithf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[124], s);}, + fmt); + } + function invalid_argf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[126], s);}, + fmt); + } + var + Base_Printf = + [0, + ifprintf, + sprintf, + bprintf, + ksprintf, + kbprintf, + failwithf, + invalid_argf]; + runtime.caml_register_global(2, Base_Printf, "Base__Printf"); + return; + } + (globalThis)); + +//# 829 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + Stdlib_Sys = global_data.Stdlib__Sys, + backend_type = Stdlib_Sys[5], + interactive = Stdlib_Sys[3], + os_type = Stdlib_Sys[4], + unix = Stdlib_Sys[6], + win32 = Stdlib_Sys[7], + cygwin = Stdlib_Sys[8], + word_size_in_bits = Stdlib_Sys[9], + int_size_in_bits = Stdlib_Sys[10], + big_endian = Stdlib_Sys[11], + max_string_length = Stdlib_Sys[12], + max_array_length = Stdlib_Sys[13], + runtime_variant = runtime.caml_runtime_variant, + runtime_parameters = runtime.caml_runtime_parameters, + argv = caml_sys_argv(0), + _a_ = + [0, + [11, + "Sys.getenv_exn: environment variable ", + [2, 0, [11, " is not set", 0]]], + "Sys.getenv_exn: environment variable %s is not set"]; + function get_argv(param){return caml_sys_argv(0);} + var + ocaml_version = Stdlib_Sys[46], + enable_runtime_warnings = Stdlib_Sys[49], + runtime_warnings_enabled = Stdlib_Sys[50]; + function getenv_exn(var$0){ + try{var _e_ = caml_sys_getenv(var$0); return _e_;} + catch(_f_){ + var _d_ = caml_wrap_exception(_f_); + if(_d_ === Base_Import0[85][104]) + return caml_call3(Base_Printf[6], _a_, var$0, 0); + throw caml_maybe_attach_backtrace(_d_, 0); + } + } + function getenv(var$0){ + try{var x = caml_sys_getenv(var$0);} + catch(_c_){ + var _b_ = caml_wrap_exception(_c_); + if(_b_ === Base_Import0[85][104]) return 0; + throw caml_maybe_attach_backtrace(_b_, 0); + } + return [0, x]; + } + var + Break = Stdlib_Sys[44], + Base_Sys0 = + [0, + backend_type, + interactive, + os_type, + unix, + win32, + cygwin, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + argv, + get_argv, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv_exn, + getenv, + Break]; + runtime.caml_register_global(4, Base_Sys0, "Base__Sys0"); + return; + } + (globalThis)); + +//# 923 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ArrayLabels = global_data.Stdlib__ArrayLabels; + global_data.Stdlib; + var + Base_Printf = global_data.Base__Printf, + Base_Sys0 = global_data.Base__Sys0, + invalid_argf = Base_Printf[7], + Array = [0], + max_length = Base_Sys0[11]; + function create(len, x){return runtime.caml_make_vect(len, x);} + function create_float_uninitialized(len){ + return runtime.caml_make_float_vect(len); + } + var + append = Stdlib_ArrayLabels[3], + blit = Stdlib_ArrayLabels[8], + concat = Stdlib_ArrayLabels[4], + copy = Stdlib_ArrayLabels[6], + fill = Stdlib_ArrayLabels[7], + init = Stdlib_ArrayLabels[1], + make_matrix = Stdlib_ArrayLabels[2], + of_list = Stdlib_ArrayLabels[10], + sub = Stdlib_ArrayLabels[5], + to_list = Stdlib_ArrayLabels[9]; + function fold(t, init, f){ + return caml_call3(Stdlib_ArrayLabels[15], f, init, t); + } + function fold_right(t, f, init){ + return caml_call3(Stdlib_ArrayLabels[17], f, t, init); + } + function iter(t, f){return caml_call2(Stdlib_ArrayLabels[11], f, t);} + function iteri(t, f){return caml_call2(Stdlib_ArrayLabels[12], f, t);} + function map(t, f){return caml_call2(Stdlib_ArrayLabels[13], f, t);} + function mapi(t, f){return caml_call2(Stdlib_ArrayLabels[14], f, t);} + function stable_sort(t, compare){ + return caml_call2(Stdlib_ArrayLabels[31], compare, t); + } + function swap(t, i, j){ + var + elt_i = caml_check_bound(t, i)[1 + i], + elt_j = caml_check_bound(t, j)[1 + j]; + t[1 + i] = elt_j; + t[1 + j] = elt_i; + return 0; + } + var + Base_Array0 = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap]; + runtime.caml_register_global(6, Base_Array0, "Base__Array0"); + return; + } + (globalThis)); + +//# 1018 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Printf = global_data.Base__Printf, + Stdlib_Char = global_data.Stdlib__Char, + failwithf = Base_Printf[6], + escaped = Stdlib_Char[2], + lowercase = Stdlib_Char[3], + _a_ = + [0, + [11, "Char.of_int_exn got integer out of range: ", [4, 0, 0, 0, 0]], + "Char.of_int_exn got integer out of range: %d"]; + function to_int(_e_){return _e_;} + function unsafe_of_int(_d_){return _d_;} + var uppercase = Stdlib_Char[4]; + function int_is_ok(i){ + var _b_ = 0 <= i ? 1 : 0, _c_ = _b_ ? i <= 255 ? 1 : 0 : _b_; + return _c_; + } + var min_value = 0, max_value = 255; + function of_int(i){return int_is_ok(i) ? [0, i] : 0;} + function of_int_exn(i){ + return int_is_ok(i) ? i : caml_call3(failwithf, _a_, i, 0); + } + function equal(t1, t2){return t1 === t2 ? 1 : 0;} + var + Base_Char0 = + [0, + failwithf, + escaped, + lowercase, + to_int, + unsafe_of_int, + uppercase, + int_is_ok, + min_value, + max_value, + of_int, + of_int_exn, + equal]; + runtime.caml_register_global(3, Base_Char0, "Base__Char0"); + return; + } + (globalThis)); + +//# 1072 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Hash_intf = [0]; + runtime.caml_register_global(0, Base_Hash_intf, "Base__Hash_intf"); + return; + } + (globalThis)); + +//# 1082 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + to_string = Caml[33], + of_string = runtime.caml_int_of_string; + function to_float(_c_){return _c_;} + function of_float(_b_){return _b_ | 0;} + var max_value = Caml[19], min_value = Caml[20]; + function succ(_a_){return _a_ + 1 | 0;} + var + Base_Int0 = + [0, + to_string, + of_string, + to_float, + of_float, + max_value, + min_value, + succ]; + runtime.caml_register_global(1, Base_Int0, "Base__Int0"); + return; + } + (globalThis)); + +//# 1112 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + hd_exn = Stdlib_ListLabels[5], + length = Stdlib_ListLabels[1], + rev_append = Stdlib_ListLabels[12], + tl_exn = Stdlib_ListLabels[6], + unzip = Stdlib_ListLabels[54]; + function exists(t, f){return caml_call2(Stdlib_ListLabels[33], f, t);} + function exists2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[35], f, l1, l2); + } + function fold(t, init, f){ + return caml_call3(Stdlib_ListLabels[25], f, init, t); + } + function fold2_ok(l1, l2, init, f){ + return caml_call4(Stdlib_ListLabels[30], f, init, l1, l2); + } + function for_all(t, f){return caml_call2(Stdlib_ListLabels[32], f, t);} + function for_all2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[34], f, l1, l2); + } + function iter(t, f){return caml_call2(Stdlib_ListLabels[17], f, t);} + function iter2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[27], f, l1, l2); + } + function nontail_map(t, f){return caml_call2(Stdlib_ListLabels[19], f, t);} + function nontail_mapi(t, f){ + return caml_call2(Stdlib_ListLabels[20], f, t); + } + function partition(t, f){return caml_call2(Stdlib_ListLabels[44], f, t);} + function rev_map(t, f){return caml_call2(Stdlib_ListLabels[21], f, t);} + function rev_map2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[29], f, l1, l2); + } + function sort(l, compare){ + return caml_call2(Stdlib_ListLabels[56], compare, l); + } + function stable_sort(l, compare){ + return caml_call2(Stdlib_ListLabels[57], compare, l); + } + function rev(res){ + if(res){ + var match = res[2]; + if(match){ + var rest = match[2], y = match[1], x = res[1]; + return caml_call2(rev_append, rest, [0, y, [0, x, 0]]); + } + } + return res; + } + function fold_right(l, f, init){ + if(! l) return init; + function _a_(a, b){return caml_call2(f, b, a);} + return fold(rev(l), init, _a_); + } + var + Base_List0 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right]; + runtime.caml_register_global(1, Base_List0, "Base__List0"); + return; + } + (globalThis)); + +//# 1219 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + description = "internalhash", + Base_Import0 = global_data.Base__Import0, + Base_Int0 = global_data.Base__Int0, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_List0 = global_data.Base__List0, + Base_Char0 = global_data.Base__Char0; + function Folding(Hash){ + function hash_fold_unit(s, param){return s;} + var + hash_fold_int = Hash[2], + hash_fold_int64 = Hash[3], + hash_fold_float = Hash[4], + hash_fold_string = Hash[5]; + function as_int(f, s, x){ + return caml_call2(hash_fold_int, s, caml_call1(f, x)); + } + function _Q_(_ar_){return _ar_;} + function hash_fold_int32(_ap_, _aq_){return as_int(_Q_, _ap_, _aq_);} + var _R_ = Base_Char0[4]; + function hash_fold_char(_an_, _ao_){return as_int(_R_, _an_, _ao_);} + function _S_(param){return param ? 1 : 0;} + function hash_fold_bool(_al_, _am_){return as_int(_S_, _al_, _am_);} + function hash_fold_nativeint(s, x){ + return caml_call2(hash_fold_int64, s, runtime.caml_int64_of_int32(x)); + } + function hash_fold_option(hash_fold_elem, s, param){ + if(! param) return caml_call2(hash_fold_int, s, 0); + var x = param[1]; + return caml_call2(hash_fold_elem, caml_call2(hash_fold_int, s, 1), x); + } + function hash_fold_list(hash_fold_elem, s$1, list$1){ + var + s$2 = caml_call2(hash_fold_int, s$1, caml_call1(Base_List0[2], list$1)), + s = s$2, + list = list$1; + for(;;){ + if(! list) return s; + var + list$0 = list[2], + x = list[1], + s$0 = caml_call2(hash_fold_elem, s, x), + s = s$0, + list = list$0; + } + } + function hash_fold_lazy_t(hash_fold_elem, s, x){ + var _aj_ = runtime.caml_obj_tag(x); + if(250 === _aj_) + var _ak_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _aj_ && 244 !== _aj_){var _ak_ = x; switch$0 = 1;} + if(! switch$0) var _ak_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call2(hash_fold_elem, s, _ak_); + } + function hash_fold_ref_frozen(hash_fold_elem, s, x){return caml_call2(hash_fold_elem, s, x[1]); + } + function hash_fold_array_frozen(hash_fold_elem, s$1, array){ + var + s$2 = caml_call2(hash_fold_int, s$1, array.length - 1), + s = s$2, + i = 0; + for(;;){ + if(i === array.length - 1) return s; + var + e = array[1 + i], + i$0 = caml_call2(Base_Import0[91], i, 1), + s$0 = caml_call2(hash_fold_elem, s, e), + s = s$0, + i = i$0; + } + } + function hash_nativeint(x){ + var + _ah_ = caml_call1(Hash[6], 0), + _ai_ = hash_fold_nativeint(caml_call2(Hash[7], 0, _ah_), x); + return caml_call1(Hash[8], _ai_); + } + function hash_int64(x){ + var + _af_ = caml_call1(Hash[6], 0), + _ag_ = caml_call2(hash_fold_int64, caml_call2(Hash[7], 0, _af_), x); + return caml_call1(Hash[8], _ag_); + } + function hash_int32(x){ + var + _ad_ = caml_call1(Hash[6], 0), + _ae_ = hash_fold_int32(caml_call2(Hash[7], 0, _ad_), x); + return caml_call1(Hash[8], _ae_); + } + function hash_char(x){ + var + _ab_ = caml_call1(Hash[6], 0), + _ac_ = hash_fold_char(caml_call2(Hash[7], 0, _ab_), x); + return caml_call1(Hash[8], _ac_); + } + function hash_int(x){ + var + _$_ = caml_call1(Hash[6], 0), + _aa_ = caml_call2(hash_fold_int, caml_call2(Hash[7], 0, _$_), x); + return caml_call1(Hash[8], _aa_); + } + function hash_bool(x){ + var + _Z_ = caml_call1(Hash[6], 0), + ___ = hash_fold_bool(caml_call2(Hash[7], 0, _Z_), x); + return caml_call1(Hash[8], ___); + } + function hash_string(x){ + var + _X_ = caml_call1(Hash[6], 0), + _Y_ = caml_call2(hash_fold_string, caml_call2(Hash[7], 0, _X_), x); + return caml_call1(Hash[8], _Y_); + } + function hash_float(x){ + var + _V_ = caml_call1(Hash[6], 0), + _W_ = caml_call2(hash_fold_float, caml_call2(Hash[7], 0, _V_), x); + return caml_call1(Hash[8], _W_); + } + function hash_unit(x){ + var _T_ = caml_call1(Hash[6], 0), _U_ = caml_call2(Hash[7], 0, _T_); + return caml_call1(Hash[8], _U_); + } + return [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit]; + } + function F(Hash){ + var + description = Hash[1], + fold_int = Hash[2], + fold_int64 = Hash[3], + fold_float = Hash[4], + fold_string = Hash[5], + alloc = Hash[6], + reset = Hash[7], + get_hash_value = Hash[8], + For_tests = Hash[9]; + function create(seed, param){ + return caml_call2(reset, seed, caml_call1(alloc, 0)); + } + function of_fold(hash_fold_t, t){ + return caml_call1 + (get_hash_value, caml_call2(hash_fold_t, create(0, 0), t)); + } + var Builtin = Folding(Hash); + function run(seed, folder, x){ + var + _O_ = caml_call1(Hash[6], 0), + _P_ = caml_call2(folder, caml_call2(Hash[7], seed, _O_), x); + return caml_call1(Hash[8], _P_); + } + return [0, + description, + fold_int, + fold_int64, + fold_float, + fold_string, + alloc, + reset, + get_hash_value, + For_tests, + create, + of_fold, + Builtin, + run]; + } + function alloc(param){return 0;} + function reset(opt, t){ + if(opt) var sth = opt[1], seed = sth; else var seed = 0; + return seed; + } + var compare_state = runtime.caml_int_compare; + function state_to_string(state){return caml_call1(Base_Int0[1], state);} + var For_tests = [0, compare_state, state_to_string]; + function create(seed, param){return reset(seed, 0);} + function run(seed, folder, x){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(folder, reset(seed, 0), x)); + } + function of_fold(hash_fold_t, t){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(hash_fold_t, create(0, 0), t)); + } + function _a_(_N_){return runtime.Base_internalhash_get_hash_value(_N_);} + function _b_(_M_, _L_){ + return runtime.Base_internalhash_fold_string(_M_, _L_); + } + function _c_(_K_, _J_){ + return runtime.Base_internalhash_fold_float(_K_, _J_); + } + function _d_(_I_, _H_){ + return runtime.Base_internalhash_fold_int64(_I_, _H_); + } + var + Folding$0 = + Folding + ([0, + description, + function(_G_, _F_){ + return runtime.Base_internalhash_fold_int(_G_, _F_); + }, + _d_, + _c_, + _b_, + alloc, + reset, + _a_, + For_tests]), + hash_fold_nativeint = Folding$0[1], + hash_fold_int64 = Folding$0[2], + hash_fold_int32 = Folding$0[3], + hash_fold_char = Folding$0[4], + hash_fold_int = Folding$0[5], + hash_fold_bool = Folding$0[6], + hash_fold_string = Folding$0[7], + hash_fold_float = Folding$0[8], + hash_fold_unit = Folding$0[9], + hash_fold_option = Folding$0[10], + hash_fold_list = Folding$0[11], + hash_fold_lazy_t = Folding$0[12], + hash_fold_ref_frozen = Folding$0[13], + hash_fold_array_frozen = Folding$0[14], + hash_nativeint = Folding$0[15], + hash_int64 = Folding$0[16], + hash_int32 = Folding$0[17], + hash_string = Folding$0[21], + hash_char = Base_Char0[4]; + function hash_int(t){ + var + _t_ = caml_call2(Base_Import0[119], t, 21), + _u_ = caml_call1(Base_Import0[117], t), + t$0 = caml_call2(Base_Import0[91], _u_, _t_), + _v_ = caml_call2(Base_Import0[120], t$0, 24), + t$1 = caml_call2(Base_Import0[121], t$0, _v_), + _w_ = caml_call2(Base_Import0[119], t$1, 8), + _x_ = caml_call2(Base_Import0[119], t$1, 3), + _y_ = caml_call2(Base_Import0[91], t$1, _x_), + t$2 = caml_call2(Base_Import0[91], _y_, _w_), + _z_ = caml_call2(Base_Import0[120], t$2, 14), + t$3 = caml_call2(Base_Import0[121], t$2, _z_), + _A_ = caml_call2(Base_Import0[119], t$3, 4), + _B_ = caml_call2(Base_Import0[119], t$3, 2), + _C_ = caml_call2(Base_Import0[91], t$3, _B_), + t$4 = caml_call2(Base_Import0[91], _C_, _A_), + _D_ = caml_call2(Base_Import0[120], t$4, 28), + t$5 = caml_call2(Base_Import0[121], t$4, _D_), + _E_ = caml_call2(Base_Import0[119], t$5, 31); + return caml_call2(Base_Import0[91], t$5, _E_); + } + function hash_bool(x){return x ? 1 : 0;} + function hash_unit(param){return 0;} + var + _e_ = + [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + function(_s_){return runtime.Base_hash_double(_s_);}, + hash_unit]; + function _f_(_r_){return runtime.Base_internalhash_get_hash_value(_r_);} + function _g_(_q_, _p_){ + return runtime.Base_internalhash_fold_string(_q_, _p_); + } + function _h_(_o_, _n_){ + return runtime.Base_internalhash_fold_float(_o_, _n_); + } + function _i_(_m_, _l_){ + return runtime.Base_internalhash_fold_int64(_m_, _l_); + } + var + Base_Hash = + [0, + F, + description, + function(_k_, _j_){ + return runtime.Base_internalhash_fold_int(_k_, _j_); + }, + _i_, + _h_, + _g_, + alloc, + reset, + _f_, + For_tests, + create, + of_fold, + _e_, + run]; + runtime.caml_register_global(6, Base_Hash, "Base__Hash"); + return; + } + (globalThis)); + +//# 1572 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_which_is_abstract_in_an_im = + ", which is abstract in an implementation.", + caml_equal = runtime.caml_equal, + caml_float_compare = runtime.caml_float_compare, + caml_int_compare = runtime.caml_int_compare; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + phys_equal = Base_Import0[128], + _b_ = + [0, + [11, + "Equal called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Equal called on the type %s, which is abstract in an implementation."], + _a_ = + [0, + [11, + "Compare called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Compare called on the type %s, which is abstract in an implementation."]; + function compare_abstract(type_name, param, _u_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _a_, type_name); + } + function equal_abstract(type_name, param, _t_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _b_, type_name); + } + var + Comparable = [0], + Equal = [0], + compare_bool = caml_int_compare, + compare_char = caml_int_compare, + compare_float = caml_float_compare, + compare_int = caml_int_compare, + compare_int32 = caml_int_compare; + function compare_int64(_s_, _r_){ + return runtime.caml_int64_compare(_s_, _r_); + } + var + compare_nativeint = caml_int_compare, + compare_string = runtime.caml_string_compare, + compare_unit = caml_int_compare; + function compare_array(compare_elt, a, b){ + if(caml_call2(phys_equal, a, b)) return 0; + var + len_a = a.length - 1, + len_b = b.length - 1, + ret = caml_int_compare(len_a, len_b); + if(0 !== ret) return ret; + var i = 0; + for(;;){ + if(i === len_a) return 0; + var l = a[1 + i], r = b[1 + i], res = caml_call2(compare_elt, l, r); + if(0 !== res) return res; + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + } + } + function compare_list(compare_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + res = caml_call2(compare_elt, x, y); + if(0 !== res) return res; + var a$0 = xs, b$0 = ys; + } + } + function compare_option(compare_elt, a, b){ + if(! a) return b ? -1 : 0; + var a$0 = a[1]; + if(! b) return 1; + var b$0 = b[1]; + return caml_call2(compare_elt, a$0, b$0); + } + function compare_ref(compare_elt, a, b){ + return caml_call2(compare_elt, a[1], b[1]); + } + function equal_bool(_q_, _p_){return _q_ === _p_ ? 1 : 0;} + function equal_char(_o_, _n_){return _o_ === _n_ ? 1 : 0;} + function equal_int(_m_, _l_){return _m_ === _l_ ? 1 : 0;} + var + equal_int32 = caml_equal, + equal_int64 = caml_equal, + equal_nativeint = caml_equal, + equal_string = runtime.caml_string_equal; + function equal_unit(_k_, _j_){return _k_ === _j_ ? 1 : 0;} + function equal_float(x, y){return caml_float_compare(x, y) === 0 ? 1 : 0;} + function equal_array(equal_elt, a, b){ + var _d_ = caml_call2(phys_equal, a, b); + if(_d_) + var _e_ = _d_; + else{ + var + len_a = a.length - 1, + len_b = b.length - 1, + _f_ = len_a === len_b ? 1 : 0; + if(_f_){ + var i = 0; + for(;;){ + var _g_ = i === len_a ? 1 : 0; + if(_g_) + var _h_ = _g_; + else{ + var l = a[1 + i], r = b[1 + i], _i_ = caml_call2(equal_elt, l, r); + if(_i_){ + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + continue; + } + var _h_ = _i_; + } + return _h_; + } + } + var _e_ = _f_; + } + return _e_; + } + function equal_list(equal_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(a$0){ + if(b$0){ + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + _c_ = caml_call2(equal_elt, x, y); + if(! _c_) return _c_; + var a$0 = xs, b$0 = ys; + continue; + } + } + else if(! b$0) return 1; + return 0; + } + } + function equal_option(equal_elt, a, b){ + if(a){ + if(b){ + var b$0 = b[1], a$0 = a[1]; + return caml_call2(equal_elt, a$0, b$0); + } + } + else if(! b) return 1; + return 0; + } + function equal_ref(equal_elt, a, b){ + return caml_call2(equal_elt, a[1], b[1]); + } + var + Base_Ppx_compare_lib = + [0, + phys_equal, + compare_abstract, + equal_abstract, + Comparable, + Equal, + [0, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref]]; + runtime.caml_register_global + (4, Base_Ppx_compare_lib, "Base__Ppx_compare_lib"); + return; + } + (globalThis)); + +//# 1799 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_update_dummy = runtime.caml_update_dummy; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + t_of_sexp = Sexplib0_Sexp[1], + sexp_of_t = Sexplib0_Sexp[2], + equal = Sexplib0_Sexp[3], + Not_found_s = Sexplib0_Sexp[5], + Of_sexp_error = Sexplib0_Sexp[6], + message = Sexplib0_Sexp[7], + default_indent = Sexplib0_Sexp[8], + pp_hum = Sexplib0_Sexp[9], + pp_hum_indent = Sexplib0_Sexp[10], + pp_mach = Sexplib0_Sexp[11], + pp = Sexplib0_Sexp[12], + to_string_hum = Sexplib0_Sexp[13], + to_string_mach = Sexplib0_Sexp[14], + to_string = Sexplib0_Sexp[15], + of_float_style = Sexplib0_Sexp[16], + of_int_style = Sexplib0_Sexp[17], + Private = Sexplib0_Sexp[18]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + if(0 === a_001[0]){ + var a_003 = a_001[1]; + if(0 !== b_002[0]) return -1; + var b_004 = b_002[1]; + return caml_call2(Base_Ppx_compare_lib[6][8], a_003, b_004); + } + var a_005 = a_001[1]; + if(0 === b_002[0]) return 1; + var b_006 = b_002[1]; + return caml_call3(Base_Ppx_compare_lib[6][11], compare, a_005, b_006); + } + var + hash_fold_t = function _f_(_d_, _e_){return _f_.fun(_d_, _e_);}, + hash = function _c_(_b_){return _c_.fun(_b_);}; + caml_update_dummy + (hash_fold_t, + function(hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(Base_Hash[13][7], hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call3(Base_Hash[13][11], hash_fold_t, hsv$1, a0$0); + }); + caml_update_dummy + (hash, + function(arg){ + var + hsv = caml_call2(Base_Hash[11], 0, 0), + _a_ = caml_call2(hash_fold_t, hsv, arg); + return caml_call1(Base_Hash[9], _a_); + }); + var t_sexp_grammar = Sexplib0_Sexp_conv[59], of_string = 0; + function invariant(param){return 0;} + var + Base_Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + Private, + t_sexp_grammar, + invariant, + of_string]; + runtime.caml_register_global(4, Base_Sexp, "Base__Sexp"); + return; + } + (globalThis)); + +//# 1912 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Sexp = global_data.Base__Sexp, + Exit = Base_Import0[1], + Not_found = Base_Import0[2], + max_int = Base_Import0[3], + min_int = Base_Import0[4], + infinity = Base_Import0[5], + neg_infinity = Base_Import0[6], + nan = Base_Import0[7], + max_float = Base_Import0[8], + min_float = Base_Import0[9], + epsilon_float = Base_Import0[10], + char_of_int = Base_Import0[11], + string_of_bool = Base_Import0[12], + bool_of_string_opt = Base_Import0[13], + bool_of_string = Base_Import0[14], + string_of_int = Base_Import0[15], + int_of_string_opt = Base_Import0[16], + string_of_float = Base_Import0[17], + float_of_string_opt = Base_Import0[18], + stdin = Base_Import0[19], + stdout = Base_Import0[20], + stderr = Base_Import0[21], + print_char = Base_Import0[22], + print_string = Base_Import0[23], + print_bytes = Base_Import0[24], + print_int = Base_Import0[25], + print_float = Base_Import0[26], + print_endline = Base_Import0[27], + print_newline = Base_Import0[28], + prerr_char = Base_Import0[29], + prerr_string = Base_Import0[30], + prerr_bytes = Base_Import0[31], + prerr_int = Base_Import0[32], + prerr_float = Base_Import0[33], + prerr_endline = Base_Import0[34], + prerr_newline = Base_Import0[35], + read_line = Base_Import0[36], + read_int_opt = Base_Import0[37], + read_int = Base_Import0[38], + read_float_opt = Base_Import0[39], + read_float = Base_Import0[40], + open_out = Base_Import0[41], + open_out_bin = Base_Import0[42], + open_out_gen = Base_Import0[43], + flush = Base_Import0[44], + flush_all = Base_Import0[45], + output_char = Base_Import0[46], + output_string = Base_Import0[47], + output_bytes = Base_Import0[48], + output = Base_Import0[49], + output_substring = Base_Import0[50], + output_byte = Base_Import0[51], + output_binary_int = Base_Import0[52], + output_value = Base_Import0[53], + seek_out = Base_Import0[54], + pos_out = Base_Import0[55], + out_channel_length = Base_Import0[56], + close_out = Base_Import0[57], + close_out_noerr = Base_Import0[58], + set_binary_mode_out = Base_Import0[59], + open_in = Base_Import0[60], + open_in_bin = Base_Import0[61], + open_in_gen = Base_Import0[62], + input_char = Base_Import0[63], + input_line = Base_Import0[64], + input = Base_Import0[65], + really_input = Base_Import0[66], + really_input_string = Base_Import0[67], + input_byte = Base_Import0[68], + input_binary_int = Base_Import0[69], + input_value = Base_Import0[70], + seek_in = Base_Import0[71], + pos_in = Base_Import0[72], + in_channel_length = Base_Import0[73], + close_in = Base_Import0[74], + close_in_noerr = Base_Import0[75], + set_binary_mode_in = Base_Import0[76], + string_of_format = Base_Import0[77], + symbol = Base_Import0[78], + exit = Base_Import0[79], + at_exit = Base_Import0[80], + valid_float_lexem = Base_Import0[81], + unsafe_really_input = Base_Import0[82], + do_at_exit = Base_Import0[83], + do_domain_local_at_exit = Base_Import0[84], + Caml = Base_Import0[85], + bool_to_int = Base_Import0[86], + symbol$0 = Base_Import0[87], + symbol$1 = Base_Import0[88], + symbol$2 = Base_Import0[89], + symbol$3 = Base_Import0[90], + symbol$4 = Base_Import0[91], + symbol$5 = Base_Import0[92], + symbol$6 = Base_Import0[93], + symbol$7 = Base_Import0[94], + symbol$8 = Base_Import0[95], + symbol$9 = Base_Import0[96], + Int_replace_polymorphic_compar = Base_Import0[97], + ascending = Base_Import0[98], + descending = Base_Import0[99], + max = Base_Import0[100], + min = Base_Import0[101], + Int32_replace_polymorphic_comp = Base_Import0[102], + Int64_replace_polymorphic_comp = Base_Import0[103], + Nativeint_replace_polymorphic_ = Base_Import0[104], + Bool_replace_polymorphic_compa = Base_Import0[105], + Char_replace_polymorphic_compa = Base_Import0[106], + Uchar_replace_polymorphic_comp = Base_Import0[107], + Float_replace_polymorphic_comp = Base_Import0[108], + String_replace_polymorphic_com = Base_Import0[109], + Bytes_replace_polymorphic_comp = Base_Import0[110], + symbol$10 = Base_Import0[111], + symbol$11 = Base_Import0[112], + symbol$12 = Base_Import0[113], + symbol$13 = Base_Import0[114], + asr = Base_Import0[115], + land = Base_Import0[116], + lnot = Base_Import0[117], + lor = Base_Import0[118], + lsl = Base_Import0[119], + lsr = Base_Import0[120], + lxor = Base_Import0[121], + mod = Base_Import0[122], + abs = Base_Import0[123], + failwith = Base_Import0[124], + fst = Base_Import0[125], + invalid_arg = Base_Import0[126], + snd = Base_Import0[127], + phys_equal = Base_Import0[128], + decr = Base_Import0[129], + incr = Base_Import0[130], + float_of_string = Base_Import0[131], + am_testing = Base_Import0[132], + default_string_of_float = Sexplib0_Sexp_conv[1], + write_old_option_format = Sexplib0_Sexp_conv[2], + read_old_option_format = Sexplib0_Sexp_conv[3], + list_map = Sexplib0_Sexp_conv[4], + sexp_of_unit = Sexplib0_Sexp_conv[5], + sexp_of_bool = Sexplib0_Sexp_conv[6], + sexp_of_string = Sexplib0_Sexp_conv[7], + sexp_of_bytes = Sexplib0_Sexp_conv[8], + sexp_of_char = Sexplib0_Sexp_conv[9], + sexp_of_int = Sexplib0_Sexp_conv[10], + sexp_of_float = Sexplib0_Sexp_conv[11], + sexp_of_int32 = Sexplib0_Sexp_conv[12], + sexp_of_int64 = Sexplib0_Sexp_conv[13], + sexp_of_nativeint = Sexplib0_Sexp_conv[14], + sexp_of_ref = Sexplib0_Sexp_conv[15], + sexp_of_lazy_t = Sexplib0_Sexp_conv[16], + sexp_of_option = Sexplib0_Sexp_conv[17], + sexp_of_pair = Sexplib0_Sexp_conv[18], + sexp_of_triple = Sexplib0_Sexp_conv[19], + sexp_of_list = Sexplib0_Sexp_conv[20], + sexp_of_array = Sexplib0_Sexp_conv[21], + sexp_of_hashtbl = Sexplib0_Sexp_conv[22], + sexp_of_opaque = Sexplib0_Sexp_conv[23], + sexp_of_fun = Sexplib0_Sexp_conv[24], + Of_sexp_error = Sexplib0_Sexp_conv[25], + record_check_extra_fields = Sexplib0_Sexp_conv[26], + of_sexp_error = Sexplib0_Sexp_conv[27], + of_sexp_error_exn = Sexplib0_Sexp_conv[28], + unit_of_sexp = Sexplib0_Sexp_conv[29], + bool_of_sexp = Sexplib0_Sexp_conv[30], + string_of_sexp = Sexplib0_Sexp_conv[31], + bytes_of_sexp = Sexplib0_Sexp_conv[32], + char_of_sexp = Sexplib0_Sexp_conv[33], + int_of_sexp = Sexplib0_Sexp_conv[34], + float_of_sexp = Sexplib0_Sexp_conv[35], + int32_of_sexp = Sexplib0_Sexp_conv[36], + int64_of_sexp = Sexplib0_Sexp_conv[37], + nativeint_of_sexp = Sexplib0_Sexp_conv[38], + ref_of_sexp = Sexplib0_Sexp_conv[39], + lazy_t_of_sexp = Sexplib0_Sexp_conv[40], + option_of_sexp = Sexplib0_Sexp_conv[41], + pair_of_sexp = Sexplib0_Sexp_conv[42], + triple_of_sexp = Sexplib0_Sexp_conv[43], + list_of_sexp = Sexplib0_Sexp_conv[44], + array_of_sexp = Sexplib0_Sexp_conv[45], + hashtbl_of_sexp = Sexplib0_Sexp_conv[46], + opaque_of_sexp = Sexplib0_Sexp_conv[47], + fun_of_sexp = Sexplib0_Sexp_conv[48], + unit_sexp_grammar = Sexplib0_Sexp_conv[49], + bool_sexp_grammar = Sexplib0_Sexp_conv[50], + string_sexp_grammar = Sexplib0_Sexp_conv[51], + bytes_sexp_grammar = Sexplib0_Sexp_conv[52], + char_sexp_grammar = Sexplib0_Sexp_conv[53], + int_sexp_grammar = Sexplib0_Sexp_conv[54], + float_sexp_grammar = Sexplib0_Sexp_conv[55], + int32_sexp_grammar = Sexplib0_Sexp_conv[56], + int64_sexp_grammar = Sexplib0_Sexp_conv[57], + nativeint_sexp_grammar = Sexplib0_Sexp_conv[58], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv[59], + ref_sexp_grammar = Sexplib0_Sexp_conv[60], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv[61], + option_sexp_grammar = Sexplib0_Sexp_conv[62], + list_sexp_grammar = Sexplib0_Sexp_conv[63], + array_sexp_grammar = Sexplib0_Sexp_conv[64], + opaque_sexp_grammar = Sexplib0_Sexp_conv[65], + fun_sexp_grammar = Sexplib0_Sexp_conv[66], + sexp_of_exn = Sexplib0_Sexp_conv[67], + printexc_prefer_sexp = Sexplib0_Sexp_conv[68], + sexp_of_exn_opt = Sexplib0_Sexp_conv[69], + Exn_converter = Sexplib0_Sexp_conv[70], + _a_ = Base_Hash[13], + hash_fold_nativeint = _a_[1], + hash_fold_int64 = _a_[2], + hash_fold_int32 = _a_[3], + hash_fold_char = _a_[4], + hash_fold_int = _a_[5], + hash_fold_bool = _a_[6], + hash_fold_string = _a_[7], + hash_fold_float = _a_[8], + hash_fold_unit = _a_[9], + hash_fold_option = _a_[10], + hash_fold_list = _a_[11], + hash_fold_lazy_t = _a_[12], + hash_fold_ref_frozen = _a_[13], + hash_fold_array_frozen = _a_[14], + hash_nativeint = _a_[15], + hash_int64 = _a_[16], + hash_int32 = _a_[17], + hash_char = _a_[18], + hash_int = _a_[19], + hash_bool = _a_[20], + hash_string = _a_[21], + hash_float = _a_[22], + hash_unit = _a_[23], + include = Base_Ppx_compare_lib[6], + compare_bool = include[1], + compare_char = include[2], + compare_float = include[3], + compare_int = include[4], + compare_int32 = include[5], + compare_int64 = include[6], + compare_nativeint = include[7], + compare_string = include[8], + compare_unit = include[9], + compare_array = include[10], + compare_list = include[11], + compare_option = include[12], + compare_ref = include[13], + equal_bool = include[14], + equal_char = include[15], + equal_float = include[16], + equal_int = include[17], + equal_int32 = include[18], + equal_int64 = include[19], + equal_nativeint = include[20], + equal_string = include[21], + equal_unit = include[22], + equal_array = include[23], + equal_list = include[24], + equal_option = include[25], + equal_ref = include[26], + Not_found_s = Base_Sexp[7], + Base_Import = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml, + bool_to_int, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + Int_replace_polymorphic_compar, + ascending, + descending, + max, + min, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$10, + symbol$11, + symbol$12, + symbol$13, + asr, + land, + lnot, + lor, + lsl, + lsr, + lxor, + mod, + abs, + failwith, + fst, + invalid_arg, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + Exn_converter, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref, + Not_found_s]; + runtime.caml_register_global(5, Base_Import, "Base__Import"); + return; + } + (globalThis)); + +//# 2438 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + Base_Import = global_data.Base__Import, + _a_ = [0, "W64"], + _b_ = [0, "W32"], + cst_unknown_word_size = "unknown word size"; + function sexp_of_t(param){return param ? _a_ : _b_;} + function num_bits(param){return param ? 64 : 32;} + var + _c_ = Base_Sys0[7], + word_size = + 32 === _c_ + ? 0 + : 64 === _c_ ? 1 : caml_call1(Base_Import[124], cst_unknown_word_size), + Base_Word_size = [0, sexp_of_t, num_bits, word_size]; + runtime.caml_register_global(5, Base_Word_size, "Base__Word_size"); + return; + } + (globalThis)); + +//# 2479 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Format = global_data.Stdlib__Format, + Base_Import = global_data.Base__Import, + r = [0, [0, "Base.Sexp.pp_hum", 0]], + cst_pp = ".pp"; + function all(param){return r[1];} + function register(p){r[1] = [0, p, r[1]]; return 0;} + function Register_pp(M){ + var pp = M[1], module_name = M[2]; + register(caml_call2(Base_Import[112], M[2], cst_pp)); + return [0, pp, module_name]; + } + function _a_(_c_){return [0, Register_pp(_c_)[1]];} + var + Base_Pretty_printer = + [0, + all, + function(M){ + var module_name = M[1]; + function pp(formatter, t){ + var _b_ = caml_call1(M[2], t); + return caml_call2(Stdlib_Format[13], formatter, _b_); + } + return [0, Register_pp([0, pp, module_name])[1]]; + }, + _a_, + register]; + runtime.caml_register_global + (4, Base_Pretty_printer, "Base__Pretty_printer"); + return; + } + (globalThis)); + +//# 2529 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_2 = "<2>", + cst_src_exn_ml = "src/exn.ml", + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Exn", + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Import = global_data.Base__Import, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Sexp = global_data.Base__Sexp, + Base_Printf = global_data.Base__Printf, + Assert_failure = global_data.Assert_failure, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + sexp_of_t = Base_Import[199], + exit = Base_Import[85][98], + Finally = [248, "Base__Exn.Finally", caml_fresh_oo_id(0)], + _k_ = + [0, + [11, "Exn.handle_uncaught could not print; exiting anyway\n", [10, 0]], + "Exn.handle_uncaught could not print; exiting anyway\n%!"], + _j_ = + [0, + [18, + [1, [0, [11, cst_2, 0], cst_2]], + [11, + "Uncaught exception:", + [17, + 3, + [17, + 3, + [18, [1, [0, 0, ""]], [15, [17, 0, [17, 0, [17, 3, [17, 4, 0]]]]]]]]]], + "@[<2>Uncaught exception:@\n@\n@[%a@]@]@\n@."], + _i_ = [0, 2], + _h_ = [0, cst_src_exn_ml, 54, 6], + _e_ = [0, "exn.ml.Reraised"], + _f_ = [0, cst_src_exn_ml, 33, 11], + _b_ = [0, "exn.ml.Finally"], + _c_ = [0, cst_src_exn_ml, 19, 11], + cst_Base_Exn_Reraised = "Base__Exn.Reraised", + cst_Base_Exn_Sexp = "Base__Exn.Sexp"; + function _a_(param){ + if(param[1] !== Finally) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + arg1_002 = param[3], + arg0_001 = param[2], + res0_003 = caml_call1(sexp_of_t, arg0_001), + res1_004 = caml_call1(sexp_of_t, arg1_002); + return [1, [0, _b_, [0, res0_003, [0, res1_004, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Finally, _a_); + var Reraised = [248, cst_Base_Exn_Reraised, caml_fresh_oo_id(0)]; + function _d_(param){ + if(param[1] !== Reraised) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + arg1_006 = param[3], + arg0_005 = param[2], + res0_007 = caml_call1(Base_Import[139], arg0_005), + res1_008 = caml_call1(sexp_of_t, arg1_006); + return [1, [0, _e_, [0, res0_007, [0, res1_008, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Reraised, _d_); + var Sexp = [248, cst_Base_Exn_Sexp, caml_fresh_oo_id(0)]; + function _g_(param){ + if(param[1] !== Sexp) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var t = param[2]; + return t; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Sexp, _g_); + function create_s(sexp){return [0, Sexp, sexp];} + function raise_with_original_backtrace(t, backtrace){ + runtime.caml_restore_raw_backtrace(t, backtrace); + throw caml_maybe_attach_backtrace(t, 0); + } + function reraise(exn, str){ + var exn$0 = [0, Reraised, str, exn]; + if(! runtime.Base_caml_exn_is_most_recent_exn(exn)) + throw caml_maybe_attach_backtrace(exn$0, 1); + var bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace(exn$0, bt); + } + function reraisef(exc, format){ + function _y_(str, param){return reraise(exc, str);} + return caml_call2(Base_Printf[4], _y_, format); + } + function to_string(exc){ + var _x_ = caml_call1(Base_Import[199], exc); + return caml_call2(Base_Sexp[15], _i_, _x_); + } + function to_string_mach(exc){ + var _w_ = caml_call1(Base_Import[199], exc); + return caml_call1(Base_Sexp[16], _w_); + } + var sexp_of_t$0 = Base_Import[199]; + function protectx(f, x, finally$0){ + try{var res = caml_call1(f, x);} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + try{caml_call1(finally$0, x);} + catch(final_exn$0){ + var final_exn = caml_wrap_exception(final_exn$0); + return raise_with_original_backtrace([0, Finally, exn, final_exn], bt); + } + return raise_with_original_backtrace(exn, bt); + } + caml_call1(finally$0, x); + return res; + } + function protect(f, finally$0){return protectx(f, 0, finally$0);} + function does_raise(f){ + try{caml_call1(f, 0); var _u_ = 0; return _u_;}catch(_v_){return 1;} + } + function pp(ppf, t){ + var match = caml_call1(Base_Import[201], t); + if(match){ + var sexp = match[1]; + return caml_call2(Base_Sexp[11], ppf, sexp); + } + var _t_ = caml_call1(Stdlib_Printexc[1], t); + return caml_call2(Stdlib_Format[13], ppf, _t_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1]; + function print_with_backtrace(exc, raw_backtrace){ + caml_call3(Stdlib_Format[137], _j_, pp$0, exc); + if(caml_call1(Stdlib_Printexc[8], 0)) + caml_call2(Stdlib_Printexc[13], Base_Import[85][39], raw_backtrace); + return caml_call1(Base_Import[85][62], Base_Import[85][39]); + } + function handle_uncaught_aux(do_at_exit, exit, f){ + try{var _p_ = caml_call1(f, 0); return _p_;} + catch(exc$0){ + var + exc = caml_wrap_exception(exc$0), + raw_backtrace = caml_call1(Stdlib_Printexc[12], 0); + if(do_at_exit) try{caml_call1(Base_Import[85][102], 0);}catch(_s_){} + try{print_with_backtrace(exc, raw_backtrace);} + catch(_q_){try{caml_call1(Stdlib_Printf[3], _k_);}catch(_r_){}} + return caml_call1(exit, 1); + } + } + function handle_uncaught_and_exit(f){ + return handle_uncaught_aux(1, exit, f); + } + function handle_uncaught(must_exit, f){ + var exit$0 = must_exit ? exit : function(_o_){return 0;}; + return handle_uncaught_aux(must_exit, exit$0, f); + } + function reraise_uncaught(str, func){ + try{var _n_ = caml_call1(func, 0); return _n_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace([0, Reraised, str, exn], bt); + } + } + function raise_without_backtrace(e){ + runtime.Base_clear_caml_backtrace_pos(0); + throw e; + } + function initialize_module(param){ + return caml_call1(Stdlib_Printexc[16], print_with_backtrace); + } + function clear_backtrace(_m_){ + return runtime.Base_clear_caml_backtrace_pos(_m_); + } + var + Private = [0, clear_backtrace], + Base_Exn = + [0, + sexp_of_t$0, + pp$0, + Finally, + Reraised, + create_s, + raise_without_backtrace, + raise_with_original_backtrace, + reraise, + reraisef, + to_string, + to_string_mach, + protectx, + protect, + handle_uncaught, + handle_uncaught_and_exit, + reraise_uncaught, + does_raise, + function(_l_){return runtime.Base_caml_exn_is_most_recent_exn(_l_);}, + initialize_module, + Private]; + runtime.caml_register_global(21, Base_Exn, "Base__Exn"); + return; + } + (globalThis)); + +//# 2761 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Exn = global_data.Base__Exn, + cst_use_of_return_from_a_with_ = + "use of [return] from a [with_return] that already returned", + cst_Return = "Return"; + function with_return(f){ + var + Return = [248, cst_Return, runtime.caml_fresh_oo_id(0)], + is_alive = [0, 1]; + function return$0(a){ + if(1 - is_alive[1]) + caml_call1(Base_Import[124], cst_use_of_return_from_a_with_); + return caml_call1(Base_Exn[6], [0, Return, a]); + } + try{var a$0 = caml_call1(f, return$0); is_alive[1] = 0; return a$0;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + is_alive[1] = 0; + if(exn[1] !== Return) throw caml_maybe_attach_backtrace(exn, 0); + var a = exn[2]; + return a; + } + } + function with_return_option(f){ + return with_return + (function(return$0){ + caml_call1(f, function(a){return caml_call1(return$0, [0, a]);}); + return 0; + }); + } + function prepend(param, f){ + return function(x){return caml_call1(param, caml_call1(f, x));}; + } + var Base_With_return = [0, with_return, with_return_option, prepend]; + runtime.caml_register_global(4, Base_With_return, "Base__With_return"); + return; + } + (globalThis)); + +//# 2833 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function S_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S3(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_to_S_indexed(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + } + function S3_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_indexed_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + var + Base_Monad_intf = + [0, + S_to_S2, + S2_to_S3, + S_to_S_indexed, + S2_to_S, + S3_to_S2, + S_indexed_to_S2]; + runtime.caml_register_global(0, Base_Monad_intf, "Base__Monad_intf"); + return; + } + (globalThis)); + +//# 3008 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0; + function Make_general(_s_){ + var bind = _s_[1], return$0 = _s_[3]; + function map_via_bind(ma, f){ + function _t_(a){ + var _u_ = caml_call1(f, a); + return caml_call1(_s_[3], _u_); + } + return caml_call2(_s_[1], ma, _t_); + } + var match = _s_[2]; + if(typeof match === "number") + var map = map_via_bind; + else + var x = match[2], map = x; + function symbol_bind(t, f){return caml_call2(bind, t, f);} + function symbol_map(t, f){return caml_call2(map, t, f);} + var + Monad_infix = [0, symbol_bind, symbol_map], + symbol_bind$0 = Monad_infix[1], + symbol_map$0 = Monad_infix[2], + symbol_bind$1 = Monad_infix[1], + symbol_map$1 = Monad_infix[2]; + function both(a, b){ + return caml_call2 + (symbol_bind$1, + a, + function(a){ + return caml_call2 + (symbol_map$1, b, function(b){return [0, a, b];}); + }); + } + var + Open_on_rhs = [0], + Let_syntax = [0, return$0, bind, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind$1, symbol_map$1, Let_syntax]; + function join(t){ + return caml_call2(symbol_bind$0, t, function(t){return t;}); + } + function ignore_m(t){ + return caml_call2(map, t, function(param){return 0;}); + } + function loop(vs, param){ + if(! param) return caml_call1(return$0, caml_call1(Base_List0[21], vs)); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(v){return loop([0, v, vs], ts);}); + } + function all(ts){return loop(0, ts);} + function all_unit(param){ + if(! param) return caml_call1(return$0, 0); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(param){return all_unit(ts);}); + } + return [0, + bind, + return$0, + map_via_bind, + map, + Monad_infix, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + join, + ignore_m, + all, + all_unit]; + } + function Make_indexed(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _r_ = Make_general([0, bind, map, return$0]); + return [0, + _r_[6], + _r_[7], + _r_[8], + _r_[5], + _r_[1], + _r_[2], + _r_[4], + _r_[9], + _r_[10], + _r_[11], + _r_[12]]; + } + function Make3(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _q_ = Make_general([0, bind, map, return$0]); + return [0, + _q_[6], + _q_[7], + _q_[8], + _q_[5], + _q_[1], + _q_[2], + _q_[4], + _q_[9], + _q_[10], + _q_[11], + _q_[12]]; + } + function Make2(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _p_ = Make_general([0, bind, map, return$0]); + return [0, + _p_[6], + _p_[7], + _p_[8], + _p_[5], + _p_[1], + _p_[2], + _p_[4], + _p_[9], + _p_[10], + _p_[11], + _p_[12]]; + } + function Make(M){ + var + bind = M[1], + return$0 = M[2], + map = M[3], + _o_ = Make_general([0, bind, map, return$0]); + return [0, + _o_[6], + _o_[7], + _o_[5], + _o_[1], + _o_[2], + _o_[4], + _o_[9], + _o_[10], + _o_[11], + _o_[12], + _o_[8]]; + } + function Of_monad_general(Monad, M){ + function return$0(a){ + var _n_ = caml_call1(Monad[3], a); + return caml_call1(M[2], _n_); + } + function bind(t, f){ + function _j_(a){ + var _m_ = caml_call1(f, a); + return caml_call1(M[1], _m_); + } + var _k_ = caml_call1(M[1], t), _l_ = caml_call2(Monad[1], _k_, _j_); + return caml_call1(M[2], _l_); + } + var + map = + [0, + -198771759, + function(t, f){ + var _h_ = caml_call1(M[1], t), _i_ = caml_call2(Monad[2], _h_, f); + return caml_call1(M[2], _i_); + }]; + return Make_general([0, bind, map, return$0]); + } + function bind(a, f){return caml_call1(f, a);} + function return$0(a){return a;} + var + map = [0, -198771759, function(a, f){return caml_call1(f, a);}], + include = Make([0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11], + Ident = + [0, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + function _a_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _g_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _g_[6], + _g_[7], + _g_[8], + _g_[5], + _g_[1], + _g_[2], + _g_[4], + _g_[9], + _g_[10], + _g_[11], + _g_[12]]; + } + function _b_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _f_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _f_[6], + _f_[7], + _f_[8], + _f_[5], + _f_[1], + _f_[2], + _f_[4], + _f_[9], + _f_[10], + _f_[11], + _f_[12]]; + } + function _c_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _e_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _e_[6], + _e_[7], + _e_[8], + _e_[5], + _e_[1], + _e_[2], + _e_[4], + _e_[9], + _e_[10], + _e_[11], + _e_[12]]; + } + var + Base_Monad = + [0, + Make, + Make2, + Make3, + Make_indexed, + function(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[4], + return$0 = Monad[5], + map = Monad[6], + _d_ = + Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _d_[6], + _d_[7], + _d_[5], + _d_[1], + _d_[2], + _d_[4], + _d_[9], + _d_[10], + _d_[11], + _d_[12], + _d_[8]]; + }, + _c_, + _b_, + _a_, + Ident]; + runtime.caml_register_global(1, Base_Monad, "Base__Monad"); + return; + } + (globalThis)); + +//# 3323 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Applicative_intf = [0]; + runtime.caml_register_global + (0, Base_Applicative_intf, "Base__Applicative_intf"); + return; + } + (globalThis)); + +//# 3334 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0; + function S_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S3(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S3_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Make3(_M_){ + var return$0 = _M_[1], symbol = _M_[2]; + function derived_map(t, f){ + return caml_call2(symbol, caml_call1(return$0, f), t); + } + var match = _M_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function map2(ta, tb, f){ + return caml_call2(symbol, caml_call2(map, ta, f), tb); + } + function map3(ta, tb, tc, f){ + return caml_call2 + (symbol, caml_call2(symbol, caml_call2(map, ta, f), tb), tc); + } + function all(ts){ + var _O_ = caml_call1(return$0, 0); + function _P_(x, xs){return [0, x, xs];} + function _Q_(_R_){return function(_S_){return map2(_R_, _S_, _P_);};} + return caml_call3(Base_List0[22], ts, _Q_, _O_); + } + function both(ta, tb){ + return map2(ta, tb, function(a, b){return [0, a, b];}); + } + function symbol$0(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(param, y){return y;}), + u), + v); + } + function symbol$1(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(x, param){return x;}), + u), + v); + } + function all_unit(ts){ + var _N_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _N_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make3([0, return$0, apply, map]); + } + function Make(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make2([0, return$0, apply, map]); + } + function Make_let_syntax3(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + return$1 = X[1], + map$0 = X[2], + both$0 = X[3], + symbol$2 = X[4], + symbol$3 = X[5], + symbol$4 = X[6], + symbol_map$0 = X[7], + Let_syntax = + [0, + return$1, + map$0, + both$0, + symbol$2, + symbol$3, + symbol$4, + symbol_map$0, + Impl], + Let_syntax$0 = + [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + Let_syntax]; + return [0, Let_syntax$0]; + } + function Make_let_syntax2(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7]; + return Make_let_syntax3 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl); + } + function Make3_using_map2(_D_){ + var return$0 = _D_[1], map2 = _D_[2]; + function symbol(tf, ta){ + return caml_call3(map2, tf, ta, function(f, a){return caml_call1(f, a);}); + } + function derived_map(t, f){return symbol(caml_call1(return$0, f), t);} + var match = _D_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function both(ta, tb){ + return caml_call3(map2, ta, tb, function(a, b){return [0, a, b];}); + } + function map3(ta, tb, tc, f){ + function _L_(fab, c){return caml_call1(fab, c);} + return caml_call3(map2, caml_call3(map2, ta, tb, f), tc, _L_); + } + function all(ts){ + var _F_ = caml_call1(return$0, 0); + function _G_(x, xs){return [0, x, xs];} + function _H_(_I_){ + var _J_ = caml_call1(map2, _I_); + return function(_K_){return caml_call2(_J_, _K_, _G_);}; + } + return caml_call3(Base_List0[22], ts, _H_, _F_); + } + function symbol$0(u, v){ + return caml_call3(map2, u, v, function(param, y){return y;}); + } + function symbol$1(u, v){ + return caml_call3(map2, u, v, function(x, param){return x;}); + } + function all_unit(ts){ + var _E_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _E_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make3_using_map2([0, return$0, map2, map]); + } + function Make_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make2_using_map2([0, return$0, map2, map]); + } + function Of_monad2(M){ + var return$0 = M[6]; + function apply(mf, mx){ + function _C_(f){return caml_call2(M[7], mx, f);} + return caml_call2(M[5], mf, _C_); + } + var map = [0, -198771759, M[7]]; + return Make2([0, return$0, apply, map]); + } + function Of_monad(M){ + var + symbol_bind = M[1], + symbol_map = M[2], + Monad_infix = M[3], + bind = M[4], + return$0 = M[5], + map = M[6], + join = M[7], + ignore_m = M[8], + all = M[9], + all_unit = M[10], + Let_syntax = M[11]; + return Of_monad2 + ([0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]); + } + function Compose(F, G){ + function return$0(a){ + var _B_ = caml_call1(F[1], a); + return caml_call1(G[1], _B_); + } + function apply(tf, tx){ + var _A_ = caml_call2(G[2], tf, F[8]); + return caml_call2(G[8], _A_, tx); + } + function custom_map(t, f){ + var _x_ = F[2]; + function _y_(_z_){return caml_call2(_x_, _z_, f);} + return caml_call2(G[2], t, _y_); + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Pair(F, G){ + function return$0(a){ + var _w_ = caml_call1(G[1], a); + return [0, caml_call1(F[1], a), _w_]; + } + function apply(tf, tx){ + var + _r_ = caml_call1(Base_Import[127], tx), + _s_ = caml_call1(Base_Import[127], tf), + _t_ = caml_call2(G[8], _s_, _r_), + _u_ = caml_call1(Base_Import[125], tx), + _v_ = caml_call1(Base_Import[125], tf); + return [0, caml_call2(F[8], _v_, _u_), _t_]; + } + function custom_map(t, f){ + var + _o_ = caml_call1(Base_Import[127], t), + _p_ = caml_call2(G[2], _o_, f), + _q_ = caml_call1(Base_Import[125], t); + return [0, caml_call2(F[2], _q_, f), _p_]; + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function _a_(_l_, _k_, _j_){ + var _m_ = Make_let_syntax3(_l_, _k_, _j_)[1], _n_ = _m_[8]; + return [0, + [0, + _m_[1], + _m_[4], + _m_[5], + _m_[6], + _m_[7], + [0, _n_[1], _n_[2], _n_[3], _n_[8]]]]; + } + function _b_(_g_, _f_, _e_){ + var _h_ = Make_let_syntax2(_g_, _f_, _e_)[1], _i_ = _h_[8]; + return [0, + [0, + _h_[1], + _h_[4], + _h_[5], + _h_[6], + _h_[7], + [0, _i_[1], _i_[2], _i_[3], _i_[8]]]]; + } + var + Base_Applicative = + [0, + S2_to_S, + S_to_S2, + S3_to_S2, + S2_to_S3, + Make, + Make2, + Make3, + function(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + _c_ = + Make_let_syntax2 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl) + [1], + _d_ = _c_[8]; + return [0, + [0, + _c_[1], + _c_[4], + _c_[5], + _c_[6], + _c_[7], + [0, _d_[1], _d_[2], _d_[3], _d_[8]]]]; + }, + _b_, + _a_, + Make_using_map2, + Make2_using_map2, + Make3_using_map2, + Of_monad, + Of_monad2, + Compose, + Pair]; + runtime.caml_register_global(2, Base_Applicative, "Base__Applicative"); + return; + } + (globalThis)); + +//# 3868 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Base_Sys0 = global_data.Base__Sys0, + Primitives = [0], + max_length = Base_Sys0[10], + blit = Stdlib_BytesLabels[11], + blit_string = Stdlib_BytesLabels[12], + compare = Stdlib_BytesLabels[40], + copy = Stdlib_BytesLabels[4], + create = runtime.caml_create_bytes, + fill = Stdlib_BytesLabels[10], + make = Stdlib_BytesLabels[1], + map = Stdlib_BytesLabels[17], + mapi = Stdlib_BytesLabels[18], + sub = Stdlib_BytesLabels[7], + unsafe_blit = runtime.caml_blit_bytes, + to_string = Stdlib_BytesLabels[6], + of_string = Stdlib_BytesLabels[5]; + function unsafe_to_string(s){return caml_call1(Stdlib_BytesLabels[44], s);} + var + unsafe_of_string_promise_no_mu = Stdlib_BytesLabels[45], + Base_Bytes0 = + [0, + Primitives, + max_length, + blit, + blit_string, + compare, + copy, + create, + fill, + make, + map, + mapi, + sub, + unsafe_blit, + to_string, + of_string, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(2, Base_Bytes0, "Base__Bytes0"); + return; + } + (globalThis)); + +//# 3924 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var Module = [0], _a_ = [0, "_"]; + function make(compare, sexp_of_t){ + var comparator = [0, compare, sexp_of_t]; + return [0, comparator]; + } + function S_to_S1(S){var comparator = S[1]; return [0, comparator];} + function Make1(M){ + var comparator = [0, M[1], M[2]]; + return [0, comparator]; + } + var compare = runtime.caml_compare; + function sexp_of_t(param){return _a_;} + var + include = Make1([0, compare, sexp_of_t]), + comparator = include[1], + Poly = [0, comparator]; + function Derived(M){ + function comparator(a){ + var _d_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _d_]; + } + return [0, comparator]; + } + function Derived2(M){ + function comparator(a, b){ + var _c_ = caml_call2(M[2], a[2], b[2]); + return [0, caml_call2(M[1], a[1], b[1]), _c_]; + } + return [0, comparator]; + } + function Derived_phantom(M){ + function comparator(a){ + var _b_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _b_]; + } + return [0, comparator]; + } + var + Base_Comparator = + [0, + make, + Poly, + Module, + S_to_S1, + function(M){var comparator = [0, M[1], M[2]]; return [0, comparator];}, + Make1, + Derived, + Derived2, + Derived_phantom]; + runtime.caml_register_global(1, Base_Comparator, "Base__Comparator"); + return; + } + (globalThis)); + +//# 4201 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Sys0 = global_data.Base__Sys0, + Base_Import0 = global_data.Base__Import0, + String = [0], + max_length = Base_Sys0[10], + symbol = Base_Import0[112], + capitalize = Stdlib_StringLabels[27], + compare = Stdlib_StringLabels[9]; + function copy(x){ + var _a_ = caml_call1(Base_Bytes0[15], x); + return caml_call1(Base_Bytes0[16], _a_); + } + var + escaped = Stdlib_StringLabels[24], + lowercase = Stdlib_StringLabels[26], + make = Stdlib_StringLabels[1], + sub = Stdlib_StringLabels[15], + uncapitalize = Stdlib_StringLabels[28], + unsafe_blit = runtime.caml_blit_string, + uppercase = Stdlib_StringLabels[25]; + function concat(opt, l){ + if(opt) var sth = opt[1], sep = sth; else var sep = cst$0; + if(! l) return cst; + if(l[2]) return caml_call2(Stdlib_StringLabels[6], sep, l); + var x = l[1]; + return x; + } + function iter(t, f){return caml_call2(Stdlib_StringLabels[29], f, t);} + var + Base_String0 = + [0, + String, + max_length, + symbol, + capitalize, + compare, + copy, + escaped, + lowercase, + make, + sub, + uncapitalize, + unsafe_blit, + uppercase, + concat, + iter]; + runtime.caml_register_global(6, Base_String0, "Base__String0"); + return; + } + (globalThis)); + +//# 4273 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ":"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$1, + cst$0 = cst$1, + Base_Import = global_data.Base__Import, + Base_Int0 = global_data.Base__Int0, + Base_String0 = global_data.Base__String0, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Comparator = global_data.Base__Comparator, + _a_ = [0, "pos_cnum"], + _b_ = [0, "pos_bol"], + _c_ = [0, "pos_lnum"], + _d_ = [0, "pos_fname"]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + var n = caml_call2(Base_Import[233], a_001[1], b_002[1]); + if(0 !== n) return n; + var n$0 = caml_call2(Base_Import[229], a_001[2], b_002[2]); + if(0 !== n$0) return n$0; + var n$1 = caml_call2(Base_Import[229], a_001[3], b_002[3]); + return 0 === n$1 ? caml_call2(Base_Import[229], a_001[4], b_002[4]) : n$1; + } + function hash_fold_t(hsv, arg){ + var + hsv$0 = caml_call2(Base_Import[209], hsv, arg[1]), + hsv$1 = caml_call2(Base_Import[207], hsv$0, arg[2]), + hsv$2 = caml_call2(Base_Import[207], hsv$1, arg[3]); + return caml_call2(Base_Import[207], hsv$2, arg[4]); + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function sexp_of_t(param){ + var + pos_cnum_010 = param[4], + pos_bol_008 = param[3], + pos_lnum_006 = param[2], + pos_fname_004 = param[1], + arg_011 = caml_call1(Base_Import[142], pos_cnum_010), + bnds_003 = [0, [1, [0, _a_, [0, arg_011, 0]]], 0], + arg_009 = caml_call1(Base_Import[142], pos_bol_008), + bnds_003$0 = [0, [1, [0, _b_, [0, arg_009, 0]]], bnds_003], + arg_007 = caml_call1(Base_Import[142], pos_lnum_006), + bnds_003$1 = [0, [1, [0, _c_, [0, arg_007, 0]]], bnds_003$0], + arg_005 = caml_call1(Base_Import[139], pos_fname_004), + bnds_003$2 = [0, [1, [0, _d_, [0, arg_005, 0]]], bnds_003$1]; + return [1, bnds_003$2]; + } + var + T = [0, compare, hash_fold_t, hash, sexp_of_t], + compare$0 = T[1], + hash_fold_t$0 = T[2], + hash$0 = T[3], + include = caml_call1(Base_Comparator[5], [0, T[1], T[4]]), + comparator = include[1]; + function make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol){ + var + _e_ = caml_call2(Base_Import[93], pos_cnum, pos_bol), + _f_ = [0, cst, [0, caml_call1(Base_Int0[1], _e_), 0]], + _g_ = + [0, + pos_fname, + [0, cst$0, [0, caml_call1(Base_Int0[1], pos_lnum), _f_]]]; + return caml_call2(Base_String0[14], 0, _g_); + } + function to_string(param){ + var + pos_cnum = param[4], + pos_bol = param[3], + pos_lnum = param[2], + pos_fname = param[1]; + return make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol); + } + function sexp_of_t$0(t){return [0, to_string(t)];} + var + Base_Source_code_position0 = + [0, + T, + compare$0, + hash_fold_t$0, + hash$0, + comparator, + make_location_string, + to_string, + sexp_of_t$0]; + runtime.caml_register_global + (12, Base_Source_code_position0, "Base__Source_code_position0"); + return; + } + (globalThis)); + +//# 4392 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0, + hd_exn = Base_List0[1], + length = Base_List0[2], + rev_append = Base_List0[3], + tl_exn = Base_List0[4], + unzip = Base_List0[5], + exists = Base_List0[6], + exists2_ok = Base_List0[7], + fold = Base_List0[8], + fold2_ok = Base_List0[9], + for_all = Base_List0[10], + for_all2_ok = Base_List0[11], + iter = Base_List0[12], + iter2_ok = Base_List0[13], + nontail_map = Base_List0[14], + nontail_mapi = Base_List0[15], + partition = Base_List0[16], + rev_map = Base_List0[17], + rev_map2_ok = Base_List0[18], + sort = Base_List0[19], + stable_sort = Base_List0[20], + rev = Base_List0[21], + fold_right = Base_List0[22]; + function is_empty(param){return param ? 0 : 1;} + function partition_map(t, f){ + var t$0 = t, fst = 0, snd = 0; + for(;;){ + if(! t$0){ + var _a_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _a_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x); + if(0 === match[0]){ + var y = match[1], fst$0 = [0, y, fst], t$0 = t$1, fst = fst$0; + continue; + } + var y$0 = match[1], snd$0 = [0, y$0, snd], t$0 = t$1, snd = snd$0; + } + } + var + Base_List1 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right, + is_empty, + partition_map]; + runtime.caml_register_global(1, Base_List1, "Base__List1"); + return; + } + (globalThis)); + +//# 4476 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Error$0 = "Error", + cst_Ok$0 = "Ok", + cst_error = "error", + cst_ok = "ok", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_005 = "result.ml.t", + Base_List1 = global_data.Base__List1, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Monad = global_data.Base__Monad, + _c_ = [0, 0], + cst_Error = cst_Error$0, + cst_Ok = cst_Ok$0, + _a_ = [0, cst_Ok$0], + _b_ = [0, cst_Error$0]; + function t_of_sexp(of_a_001, of_b_002, sexp_007){ + if(0 === sexp_007[0]){ + var _f_ = sexp_007[1], switch$0 = 0; + if(caml_string_notequal(_f_, cst_Error$0)){ + var switch$1 = 0; + if(caml_string_notequal(_f_, cst_Ok$0)){ + if(caml_string_notequal(_f_, cst_error)) + if(caml_string_notequal(_f_, cst_ok)) switch$0 = 1; else switch$1 = 1; + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + else{ + var _g_ = sexp_007[1]; + if(! _g_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_007); + var _h_ = _g_[1]; + if(0 !== _h_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_007); + var tag_008 = _h_[1], switch$2 = 0; + if(caml_string_notequal(tag_008, cst_Error$0)){ + var switch$3 = 0; + if(caml_string_notequal(tag_008, cst_Ok$0)){ + if(caml_string_notequal(tag_008, cst_error)) + if(caml_string_notequal(tag_008, cst_ok)) + switch$2 = 1; + else + switch$3 = 1; + } + else + switch$3 = 1; + if(switch$3){ + var sexp_args_009 = _g_[2]; + if(sexp_args_009 && ! sexp_args_009[2]){ + var + arg0_010 = sexp_args_009[1], + res0_011 = caml_call1(of_a_001, arg0_010); + return [0, res0_011]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + if(! switch$2){ + var sexp_args_014 = _g_[2]; + if(sexp_args_014 && ! sexp_args_014[2]){ + var + arg0_015 = sexp_args_014[1], + res0_016 = caml_call1(of_b_002, arg0_015); + return [1, res0_016]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_007); + } + function sexp_of_t(of_a_019, of_b_020, param){ + if(0 === param[0]){ + var arg0_021 = param[1], res0_022 = caml_call1(of_a_019, arg0_021); + return [1, [0, _a_, [0, res0_022, 0]]]; + } + var arg0_023 = param[1], res0_024 = caml_call1(of_b_020, arg0_023); + return [1, [0, _b_, [0, res0_024, 0]]]; + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Ok, [0, [0, a_sexp_grammar, 0]]]], + [0, [1, [0, cst_Error, [0, [0, b_sexp_grammar, 0]]]], 0]]]]; + } + function compare(cmp_a, cmp_b, a_027, b_028){ + if(caml_call2(Base_Ppx_compare_lib[1], a_027, b_028)) return 0; + if(0 === a_027[0]){ + var a_029 = a_027[1]; + if(0 !== b_028[0]) return -1; + var b_030 = b_028[1]; + return caml_call2(cmp_a, a_029, b_030); + } + var a_031 = a_027[1]; + if(0 === b_028[0]) return 1; + var b_032 = b_028[1]; + return caml_call2(cmp_b, a_031, b_032); + } + function equal(cmp_a, cmp_b, a_033, b_034){ + if(caml_call2(Base_Ppx_compare_lib[1], a_033, b_034)) return 1; + if(0 === a_033[0]){ + var a_035 = a_033[1]; + if(0 !== b_034[0]) return 0; + var b_036 = b_034[1]; + return caml_call2(cmp_a, a_035, b_036); + } + var a_037 = a_033[1]; + if(0 === b_034[0]) return 0; + var b_038 = b_034[1]; + return caml_call2(cmp_b, a_037, b_038); + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + } + function bind(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return caml_call1(f, x$0); + } + var + map = + [0, + -198771759, + function(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return [0, caml_call1(f, x$0)]; + }]; + function return$0(x){return [0, x];} + var + include = caml_call1(Base_Monad[2], [0, bind, map, return$0]), + symbol_bind = include[1], + symbol_map = include[2], + Let_syntax = include[3], + Monad_infix = include[4], + bind$0 = include[5], + return$1 = include[6], + map$0 = include[7], + join = include[8], + ignore_m = include[9], + all = include[10], + all_unit = include[11]; + function invariant(check_ok, check_error, t){ + if(0 === t[0]){var ok = t[1]; return caml_call1(check_ok, ok);} + var error = t[1]; + return caml_call1(check_error, error); + } + function fail(x){return [1, x];} + function failf(format){return caml_call2(Base_Printf[4], fail, format);} + function map_error(t, f){ + if(0 === t[0]) return t; + var x = t[1]; + return [1, caml_call1(f, x)]; + } + function bind$1(x, f){ + if(0 === x[0]) return x; + var e = x[1]; + return caml_call1(f, e); + } + var map$1 = [0, -198771759, map_error]; + function return$2(e){return [1, e];} + var Error = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]); + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function ok(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function error(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function of_option(opt, error){ + if(! opt) return [1, error]; + var x = opt[1]; + return [0, x]; + } + function iter(v, f){ + if(0 !== v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function iter_error(v, f){ + if(0 === v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function to_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function of_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function ok_if_true(bool, error){return bool ? _c_ : [1, error];} + function try_with(f){ + try{var _e_ = [0, caml_call1(f, 0)]; return _e_;} + catch(exn$0){var exn = caml_wrap_exception(exn$0); return [1, exn];} + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var exn = param[1]; + throw caml_maybe_attach_backtrace(exn, 1); + } + function ok_or_failwith(param){ + if(0 === param[0]){var x = param[1]; return x;} + var str = param[1]; + return caml_call1(Base_Import[124], str); + } + function combine(t1, t2, ok, err){ + if(0 === t1[0]){ + var ok1 = t1[1]; + if(0 === t2[0]){var ok2 = t2[1]; return [0, caml_call2(ok, ok1, ok2)];} + var e = t2[1]; + } + else{ + var err1 = t1[1]; + if(0 !== t2[0]){ + var err2 = t2[1]; + return [1, caml_call2(err, err1, err2)]; + } + var e = err1; + } + return [1, e]; + } + function combine_errors(l){ + var + match = caml_call2(Base_List1[24], l, to_either), + errs = match[2], + ok = match[1]; + return errs ? [1, errs] : [0, ok]; + } + function combine_errors_unit(l){ + function _d_(param){return 0;} + return caml_call2(map$0, combine_errors(l), _d_); + } + var + Base_Result = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + equal, + hash_fold_t, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind$0, + return$1, + join, + ignore_m, + all, + all_unit, + Error, + invariant, + fail, + failf, + is_ok, + is_error, + ok, + ok_exn, + ok_or_failwith, + error, + of_option, + iter, + iter_error, + map$0, + map_error, + combine, + combine_errors, + combine_errors_unit, + to_either, + of_either, + to_either, + ok_if_true, + try_with, + [0, is_ok, is_error]]; + runtime.caml_register_global(21, Base_Result, "Base__Result"); + return; + } + (globalThis)); + +//# 4816 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Continue_or_stop = [0], + Export = [0, Continue_or_stop], + Continue_or_stop$0 = Export[1], + Base_Container_intf = [0, Export, Continue_or_stop$0]; + runtime.caml_register_global + (0, Base_Container_intf, "Base__Container_intf"); + return; + } + (globalThis)); + +//# 4832 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Array0 = global_data.Base__Array0, + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iter(fold, t, f){ + return caml_call3 + (fold, t, 0, function(param, a){return caml_call1(f, a);}); + } + function count(fold, t, f){ + return caml_call3 + (fold, + t, + 0, + function(n, a){ + return caml_call1(f, a) ? caml_call2(Base_Import[91], n, 1) : n; + }); + } + function sum(fold, M){ + return function(t, f){ + function _h_(n, a){ + var _i_ = caml_call1(f, a); + return caml_call2(M[2], n, _i_); + } + return caml_call3(fold, t, M[1], _h_);}; + } + function fold_result(fold, init, f, t){ + return caml_call1 + (with_return, + function(param){ + return [0, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var e = caml_call2(f, acc, item); + if(0 !== e[0]) return caml_call1(param, e); + var x = e[1]; + return x; + })]; + }); + } + function fold_until(fold, init, f, finish, t){ + return caml_call1 + (with_return, + function(param){ + return caml_call1 + (finish, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var match = caml_call2(f, acc, item); + if(0 === match[0]){var x = match[1]; return x;} + var x$0 = match[1]; + return caml_call1(param, x$0); + })); + }); + } + function min_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var min = acc[1]; + return 0 < caml_call2(compare, min, elt) ? [0, elt] : acc; + }); + } + function max_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var max = acc[1]; + return 0 <= caml_call2(compare, max, elt) ? acc : [0, elt]; + }); + } + function length(fold, c){ + return caml_call3 + (fold, + c, + 0, + function(acc, param){return caml_call2(Base_Import[91], acc, 1);}); + } + function is_empty(iter, c){ + return caml_call1 + (with_return, + function(r){ + caml_call2(iter, c, function(param){return caml_call1(r, 0);}); + return 1; + }); + } + function exists(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _g_ = caml_call1(f, x); + return _g_ ? caml_call1(r, 1) : _g_; + }); + return 0; + }); + } + function for_all(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _f_ = 1 - caml_call1(f, x); + return _f_ ? caml_call1(r, 0) : _f_; + }); + return 1; + }); + } + function find_map(iter, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + t, + function(x){ + var res = caml_call1(f, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function find(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _e_ = caml_call1(f, x); + return _e_ ? caml_call1(r, [0, x]) : _e_; + }); + return 0; + }); + } + function to_list(fold, c){ + var _d_ = caml_call3(fold, c, 0, function(acc, x){return [0, x, acc];}); + return caml_call1(Base_List0[21], _d_); + } + function to_array(length, iter, c){ + var array = [0, [0]], i = [0, 0]; + caml_call2 + (iter, + c, + function(x){ + if(0 === i[1]){ + var _b_ = caml_call1(length, c); + array[1] = caml_call2(Base_Array0[4], _b_, x); + } + var _c_ = i[1]; + runtime.caml_check_bound(array[1], _c_)[1 + _c_] = x; + return caml_call1(Base_Import[130], i); + }); + return array[1]; + } + function Make_gen(T){ + var fold = T[1], match = T[2]; + if(typeof match === "number") + var iter$0 = function(t, f){return iter(fold, t, f);}; + else + var iter$1 = match[2], iter$0 = iter$1; + var match$0 = T[3]; + if(typeof match$0 === "number") + var length$0 = function(t){return length(fold, t);}; + else + var length$1 = match$0[2], length$0 = length$1; + function is_empty$0(t){return is_empty(iter$0, t);} + function sum$0(m, t){return caml_call1(sum(fold, m), t);} + function count$0(t, f){return count(fold, t, f);} + function exists$0(t, f){return exists(iter$0, t, f);} + function for_all$0(t, f){return for_all(iter$0, t, f);} + function find_map$0(t, f){return find_map(iter$0, t, f);} + function find$0(t, f){return find(iter$0, t, f);} + function to_list$0(t){return to_list(fold, t);} + function to_array$0(t){return to_array(length$0, iter$0, t);} + function min_elt$0(t, compare){return min_elt(fold, t, compare);} + function max_elt$0(t, compare){return max_elt(fold, t, compare);} + function fold_result$0(t, init, f){return fold_result(fold, init, f, t);} + function fold_until$0(t, init, f, finish){ + return fold_until(fold, init, f, finish, t); + } + return [0, + length$0, + is_empty$0, + iter$0, + fold, + fold_result$0, + fold_until$0, + exists$0, + for_all$0, + count$0, + sum$0, + find$0, + find_map$0, + to_list$0, + to_array$0, + min_elt$0, + max_elt$0]; + } + function _a_(T){ + var + fold = T[2], + iter = T[3], + length = T[4], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, elt){ + return caml_call2(exists, t, caml_call1(T[1][1], elt)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + } + var + Base_Container = + [0, + iter, + count, + min_elt, + max_elt, + length, + to_list, + sum, + fold_result, + fold_until, + is_empty, + exists, + for_all, + find, + find_map, + to_array, + function(T){ + var + fold = T[1], + iter = T[2], + length = T[3], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, a, equal){ + return caml_call2(exists, t, caml_call1(equal, a)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + }, + _a_, + Make_gen]; + runtime.caml_register_global(4, Base_Container, "Base__Container"); + return; + } + (globalThis)); + +//# 5186 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Import = global_data.Base__Import, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Base_Hash = global_data.Base__Hash, + Base_Monad = global_data.Base__Monad, + Undefined = Stdlib_Lazy[1], + is_val = Stdlib_Lazy[3], + from_val = Stdlib_Lazy[4], + from_fun = Stdlib_Lazy[6], + force_val = Stdlib_Lazy[7], + t_of_sexp = Base_Import[172], + sexp_of_t = Base_Import[148], + cst_unforced_lazy = ""; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[193], a_sexp_grammar); + } + function _a_(t, f){ + return [246, + function(_q_){ + var _r_ = caml_obj_tag(t); + if(250 === _r_) + var _s_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _r_ && 244 !== _r_){var _s_ = t; switch$0 = 1;} + if(! switch$0) var _s_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(f, _s_); + }]; + } + function compare(compare_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 0; + var _m_ = caml_obj_tag(t2); + if(250 === _m_) + var _n_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _m_ && 244 !== _m_){var _n_ = t2; switch$0 = 1;} + if(! switch$0) var _n_ = caml_call1(CamlinternalLazy[2], t2); + } + var _o_ = caml_obj_tag(t1); + if(250 === _o_) + var _p_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _o_ && 244 !== _o_){var _p_ = t1; switch$1 = 1;} + if(! switch$1) var _p_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(compare_a, _p_, _n_); + } + function equal(equal_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 1; + var _i_ = caml_obj_tag(t2); + if(250 === _i_) + var _j_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _i_ && 244 !== _i_){var _j_ = t2; switch$0 = 1;} + if(! switch$0) var _j_ = caml_call1(CamlinternalLazy[2], t2); + } + var _k_ = caml_obj_tag(t1); + if(250 === _k_) + var _l_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _k_ && 244 !== _k_){var _l_ = t1; switch$1 = 1;} + if(! switch$1) var _l_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(equal_a, _l_, _j_); + } + var hash_fold_t = Base_Hash[13][12]; + function return$0(x){return caml_call1(from_val, x);} + function bind(t, f){ + return [246, + function(_d_){ + var _e_ = caml_obj_tag(t); + if(250 === _e_) + var _f_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _e_ && 244 !== _e_){var _f_ = t; switch$0 = 1;} + if(! switch$0) var _f_ = caml_call1(CamlinternalLazy[2], t); + } + var _g_ = caml_call1(f, _f_), _h_ = caml_obj_tag(_g_); + if(250 === _h_) return _g_[1]; + if(246 !== _h_ && 244 !== _h_) return _g_; + return caml_call1(CamlinternalLazy[2], _g_); + }]; + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function sexp_of_t$0(sexp_of_a, t){ + if(! caml_call1(is_val, t)) + return caml_call1(Base_Import[139], cst_unforced_lazy); + var _b_ = caml_obj_tag(t); + if(250 === _b_) + var _c_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = t; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(sexp_of_a, _c_); + } + var + T_unforcing = [0, sexp_of_t$0], + Base_Lazy = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + Undefined, + force_val, + from_fun, + from_val, + is_val, + T_unforcing]; + runtime.caml_register_global(6, Base_Lazy, "Base__Lazy"); + return; + } + (globalThis)); + +//# 5351 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Info_intf = [0]; + runtime.caml_register_global(0, Base_Info_intf, "Base__Info_intf"); + return; + } + (globalThis)); + +//# 5361 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + invalid_argf = Base_Printf[7], + _a_ = + [0, + [11, "Negative position: ", [4, 0, 0, 0, 0]], + "Negative position: %d"], + _b_ = + [0, [11, "Negative length: ", [4, 0, 0, 0, 0]], "Negative length: %d"], + _c_ = + [0, + [11, + "pos + len past end: ", + [4, 0, 0, 0, [11, " + ", [4, 0, 0, 0, [11, " > ", [4, 0, 0, 0, 0]]]]]], + "pos + len past end: %d + %d > %d"]; + function slow_check_pos_len_exn(pos, len, total_length){ + if(pos < 0) caml_call3(invalid_argf, _a_, pos, 0); + if(len < 0) caml_call3(invalid_argf, _b_, len, 0); + var _h_ = caml_call2(Base_Import[93], total_length, len) < pos ? 1 : 0; + return _h_ + ? caml_call5(invalid_argf, _c_, pos, len, total_length, 0) + : _h_; + } + function check_pos_len_exn(pos, len, total_length){ + var + stop = caml_call2(Base_Import[91], pos, len), + _d_ = caml_call2(Base_Import[93], total_length, stop), + _e_ = caml_call2(Base_Import[118], pos, len), + _f_ = caml_call2(Base_Import[118], _e_, stop), + _g_ = caml_call2(Base_Import[118], _f_, _d_) < 0 ? 1 : 0; + return _g_ ? slow_check_pos_len_exn(pos, len, total_length) : _g_; + } + function get_pos_len_exn(opt, len, param, total_length){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], len$0 = i; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + check_pos_len_exn(pos, len$0, total_length); + return [0, pos, len$0]; + } + var + Private = [0, slow_check_pos_len_exn], + Base_Ordered_collection_common = + [0, get_pos_len_exn, check_pos_len_exn, Private]; + runtime.caml_register_global + (5, Base_Ordered_collection_common, "Base__Ordered_collection_common0"); + return; + } + (globalThis)); + +//# 5435 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Lazy = global_data.Stdlib__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy; + function of_state(_f_){return _f_;} + var Repr = [0, of_state]; + function assign(dst, src){ + var _b_ = caml_obj_tag(dst); + if(250 === _b_) + var _c_ = dst[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = dst; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], dst); + } + var dst$0 = caml_call1(Repr[1], _c_), _d_ = caml_obj_tag(src); + if(250 === _d_) + var _e_ = src[1]; + else{ + var switch$1 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = src; switch$1 = 1;} + if(! switch$1) var _e_ = caml_call1(CamlinternalLazy[2], src); + } + var src$0 = caml_call1(Repr[1], _e_); + return runtime.caml_ba_blit(src$0, dst$0); + } + function make_default(default$0){ + function split_from_parent(v){ + return caml_call2(Stdlib_Lazy[5], Stdlib_Random[15][15], v); + } + function _a_(param){return default$0;} + return caml_call2(Stdlib_Domain[10][1], [0, split_from_parent], _a_); + } + function get_state(random_key){ + return caml_call1(Stdlib_Domain[10][2], random_key); + } + var Base_Random_repr = [0, Repr, assign, make_default, get_state]; + runtime.caml_register_global(4, Base_Random_repr, "Base__Random_repr"); + return; + } + (globalThis)); + +//# 5495 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_add = runtime.caml_int64_add, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_left = runtime.caml_int64_shift_left, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_int64_xor = runtime.caml_int64_xor, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random_repr = global_data.Base__Random_repr, + Base_Import = global_data.Base__Import, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Int0 = global_data.Base__Int0, + Base_Printf = global_data.Base__Printf, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + Base_Lazy = global_data.Base__Lazy, + Base_Char0 = global_data.Base__Char0, + Base_Word_size = global_data.Base__Word_size, + cst_float = "float", + cst_int64 = "int64", + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_nativeint = "nativeint", + cst_int32 = "int32", + cst_int = "int", + _a_ = + [0, + [11, + "Random.", + [2, + 0, + [11, ": crossed bounds [", [2, 0, [11, " > ", [2, 0, [12, 93, 0]]]]]]], + "Random.%s: crossed bounds [%s > %s]"], + cst_initializing_Random_with_a = + "initializing Random with a nondeterministic seed is forbidden in inline tests"; + function forbid_nondeterminism_in_tests(allow_in_tests){ + var _M_ = Base_Import[132]; + if(! _M_) return _M_; + if(allow_in_tests && allow_in_tests[1]) return 0; + return caml_call1(Base_Import[124], cst_initializing_Random_with_a); + } + function bits(t){ + var _K_ = caml_obj_tag(t); + if(250 === _K_) + var _L_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _K_ && 244 !== _K_){var _L_ = t; switch$0 = 1;} + if(! switch$0) var _L_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][4], _L_); + } + function bool(t){ + var _I_ = caml_obj_tag(t); + if(250 === _I_) + var _J_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _I_ && 244 !== _I_){var _J_ = t; switch$0 = 1;} + if(! switch$0) var _J_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][11], _J_); + } + function int$0(t, x){ + var _G_ = caml_obj_tag(t); + if(250 === _G_) + var _H_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _G_ && 244 !== _G_){var _H_ = t; switch$0 = 1;} + if(! switch$0) var _H_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][5], _H_, x); + } + function int32(t, x){ + var _E_ = caml_obj_tag(t); + if(250 === _E_) + var _F_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _E_ && 244 !== _E_){var _F_ = t; switch$0 = 1;} + if(! switch$0) var _F_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][7], _F_, x); + } + function int64(t, x){ + var _C_ = caml_obj_tag(t); + if(250 === _C_) + var _D_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _C_ && 244 !== _C_){var _D_ = t; switch$0 = 1;} + if(! switch$0) var _D_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][9], _D_, x); + } + function nativeint(t, x){ + var _A_ = caml_obj_tag(t); + if(250 === _A_) + var _B_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _A_ && 244 !== _A_){var _B_ = t; switch$0 = 1;} + if(! switch$0) var _B_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][8], _B_, x); + } + function make(seed){ + var _z_ = caml_call1(Stdlib_Random[15][1], seed); + return caml_call1(Base_Lazy[21], _z_); + } + function copy(t){ + var _w_ = caml_obj_tag(t); + if(250 === _w_) + var _x_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _w_ && 244 !== _w_){var _x_ = t; switch$0 = 1;} + if(! switch$0) var _x_ = caml_call1(CamlinternalLazy[2], t); + } + var _y_ = caml_call1(Stdlib_Random[15][3], _x_); + return caml_call1(Base_Lazy[21], _y_); + } + function char$0(t){ + var _v_ = int$0(t, 256); + return caml_call1(Base_Char0[5], _v_); + } + function ascii(t){ + var _u_ = int$0(t, 128); + return caml_call1(Base_Char0[5], _u_); + } + function make_self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + var _t_ = caml_call1(Stdlib_Random[15][2], 0); + return caml_call1(Base_Lazy[21], _t_); + } + var assign = Base_Random_repr[2]; + if(Base_Import[132]){ + var t = caml_call1(Stdlib_Random[16], 0); + caml_call1(Stdlib_Random[1], 137); + var default$0 = caml_call1(Base_Lazy[21], t); + } + else + var + default$0 = + [246, + function(param){ + var _r_ = make_self_init(0, 0), _s_ = caml_obj_tag(_r_); + if(250 === _s_) return _r_[1]; + if(246 !== _s_ && 244 !== _s_) return _r_; + return caml_call1(CamlinternalLazy[2], _r_); + }]; + function int_on_64bits(t, bound){ + return 1073741823 < bound + ? caml_int64_to_int32(int64(t, caml_int64_of_int32(bound))) + : int$0(t, bound); + } + function int_on_32bits(t, bound){ + return 1073741823 < bound ? int32(t, bound) : int$0(t, bound); + } + var int$1 = Base_Word_size[3] ? int_on_64bits : int_on_32bits; + function bits$0(state){return caml_int64_of_int32(bits(state));} + function full_range_int64(state){ + var + _p_ = caml_int64_shift_left(bits$0(state), 60), + _q_ = caml_int64_xor(caml_int64_shift_left(bits$0(state), 30), _p_); + return caml_int64_xor(bits$0(state), _q_); + } + function bits$1(state){return bits(state);} + function full_range_int32(state){ + var _o_ = bits$1(state) << 30; + return bits$1(state) ^ _o_; + } + function full_range_int_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_int_on_32bits(state){return full_range_int32(state);} + var + full_range_int_on_64bits$0 = + Base_Word_size[3] ? full_range_int_on_64bits : full_range_int_on_32bits; + function full_range_nativeint_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_nativeint_on_32bits(state){return full_range_int32(state); + } + var + full_range_nativeint = + Base_Word_size[3] + ? full_range_nativeint_on_64bits + : full_range_nativeint_on_32bits; + function raise_crossed_bounds + (name, lower_bound, upper_bound, string_of_bound){ + var + _m_ = caml_call1(string_of_bound, upper_bound), + _n_ = caml_call1(string_of_bound, lower_bound); + return caml_call5(Base_Printf[6], _a_, name, _n_, _m_, 0); + } + function int_incl(state, lo, hi){ + if(hi < lo) raise_crossed_bounds(cst_int, lo, hi, Base_Int0[1]); + var diff = caml_call2(Base_Import[93], hi, lo); + if(diff === Base_Int0[5]){ + var + _i_ = Base_Int0[5], + _j_ = full_range_int_on_64bits$0(state), + _k_ = caml_call2(Base_Import[116], _j_, _i_); + return caml_call2(Base_Import[91], lo, _k_); + } + if(0 <= diff){ + var _l_ = int$1(state, caml_call1(Base_Int0[7], diff)); + return caml_call2(Base_Import[91], lo, _l_); + } + for(;;){ + var int$0 = full_range_int_on_64bits$0(state); + if(lo <= int$0 && int$0 <= hi) return int$0; + } + } + function int32_incl(state, lo, hi){ + if(caml_call2(Base_Import[102][5], lo, hi)) + raise_crossed_bounds(cst_int32, lo, hi, Stdlib_Int32[14]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[102][4], diff, Stdlib_Int32[9])){ + var _h_ = Stdlib_Int32[9]; + return lo + (full_range_int32(state) & _h_) | 0; + } + if(caml_call2(Base_Import[102][6], diff, 0)) + return lo + int32(state, caml_call1(Stdlib_Int32[6], diff)) | 0; + for(;;){ + var int$0 = full_range_int32(state); + if + (caml_call2(Base_Import[102][6], int$0, lo) + && caml_call2(Base_Import[102][2], int$0, hi)) + return int$0; + } + } + function nativeint_incl(state, lo, hi){ + if(caml_call2(Base_Import[104][5], lo, hi)) + raise_crossed_bounds(cst_nativeint, lo, hi, Stdlib_Nativeint[15]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[104][4], diff, Stdlib_Nativeint[10])){ + var _g_ = Stdlib_Nativeint[10]; + return lo + (full_range_nativeint(state) & _g_) | 0; + } + if(caml_call2(Base_Import[104][6], diff, 0)) + return lo + nativeint(state, caml_call1(Stdlib_Nativeint[6], diff)) | 0; + for(;;){ + var int$0 = full_range_nativeint(state); + if + (caml_call2(Base_Import[104][6], int$0, lo) + && caml_call2(Base_Import[104][2], int$0, hi)) + return int$0; + } + } + function int64_incl(state, lo, hi){ + if(runtime.caml_greaterthan(lo, hi)) + raise_crossed_bounds(cst_int64, lo, hi, Stdlib_Int64[14]); + var diff = runtime.caml_int64_sub(hi, lo); + if(runtime.caml_equal(diff, Stdlib_Int64[9])){ + var _f_ = Stdlib_Int64[9]; + return caml_int64_add + (lo, runtime.caml_int64_and(full_range_int64(state), _f_)); + } + if(caml_greaterequal(diff, _b_)) + return caml_int64_add + (lo, int64(state, caml_call1(Stdlib_Int64[6], diff))); + for(;;){ + var int$0 = full_range_int64(state); + if(caml_greaterequal(int$0, lo) && runtime.caml_lessequal(int$0, hi)) + return int$0; + } + } + function float$0(state, hi){ + for(;;){ + var + r1 = bits(state), + r2 = bits(state), + _d_ = caml_call2(Base_Import[90], r1, 9.313225746154785e-10), + _e_ = caml_call2(Base_Import[92], _d_, r2), + result = caml_call2(Base_Import[90], _e_, 9.313225746154785e-10); + if(caml_call2(Base_Import[108][1], result, 1.)) + return caml_call2(Base_Import[90], result, hi); + } + } + function float_range(state, lo, hi){ + if(caml_call2(Base_Import[108][5], lo, hi)) + raise_crossed_bounds(cst_float, lo, hi, Base_Import[85][34]); + var _c_ = float$0(state, caml_call2(Base_Import[94], hi, lo)); + return caml_call2(Base_Import[92], lo, _c_); + } + var default$1 = caml_call1(Base_Random_repr[3], default$0); + function bits$2(param){ + return bits(caml_call1(Base_Random_repr[4], default$1)); + } + function int$2(x){ + return int$1(caml_call1(Base_Random_repr[4], default$1), x); + } + function int32$0(x){ + return int32(caml_call1(Base_Random_repr[4], default$1), x); + } + function nativeint$0(x){ + return nativeint(caml_call1(Base_Random_repr[4], default$1), x); + } + function int64$0(x){ + return int64(caml_call1(Base_Random_repr[4], default$1), x); + } + function float$1(x){ + return float$0(caml_call1(Base_Random_repr[4], default$1), x); + } + function int_incl$0(x, y){ + return int_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int32_incl$0(x, y){ + return int32_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function nativeint_incl$0(x, y){ + return nativeint_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int64_incl$0(x, y){ + return int64_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function float_range$0(x, y){ + return float_range(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function bool$0(param){ + return bool(caml_call1(Base_Random_repr[4], default$1)); + } + function char$1(param){ + return char$0(caml_call1(Base_Random_repr[4], default$1)); + } + function ascii$0(param){ + return ascii(caml_call1(Base_Random_repr[4], default$1)); + } + function full_init(seed){ + var t = caml_call1(Base_Random_repr[4], default$1); + return caml_call2(assign, t, make(seed)); + } + function init(seed){return full_init([0, seed]);} + function self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + return full_init(runtime.caml_sys_random_seed(0)); + } + function set_state(s){ + return caml_call2(assign, caml_call1(Base_Random_repr[4], default$1), s); + } + var + Base_Random = + [0, + init, + full_init, + self_init, + bits$2, + int$2, + int32$0, + nativeint$0, + int64$0, + float$1, + int_incl$0, + int32_incl$0, + nativeint_incl$0, + int64_incl$0, + float_range$0, + bool$0, + char$1, + ascii$0, + [0, + default$0, + make, + make_self_init, + copy, + bits, + int$1, + int32, + nativeint, + int64, + float$0, + int_incl, + int32_incl, + nativeint_incl, + int64_incl, + float_range, + bool, + char$0, + ascii], + set_state]; + runtime.caml_register_global(24, Base_Random, "Base__Random"); + return; + } + (globalThis)); + +//# 5907 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + Base_Array0 = global_data.Base__Array0, + invalid_argf = Base_Array0[1], + Array = Base_Array0[2], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + blit = Base_Array0[7], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23]; + function permute(opt, _a_, len, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(_a_) var sth$0 = _a_[1], pos = sth$0; else var pos = 0; + var total_length = t.length - 1; + if(len) + var l = len[1], len$0 = l; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + caml_call3(Base_Ordered_collection_common[2], pos, len$0, total_length); + var num_swaps = caml_call2(Base_Import[93], len$0, 1); + if(num_swaps >= 1){ + var i = num_swaps; + for(;;){ + var + this_i = caml_call2(Base_Import[91], pos, i), + _b_ = caml_call2(Base_Import[91], i, 1), + _c_ = caml_call2(Base_Random[18][6], random_state, _b_), + random_i = caml_call2(Base_Import[91], pos, _c_); + caml_call3(swap, t, this_i, random_i); + var _d_ = i - 1 | 0; + if(1 !== i){var i = _d_; continue;} + break; + } + } + return 0; + } + var + Base_Array_permute = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap, + permute]; + runtime.caml_register_global(4, Base_Array_permute, "Base__Array_permute"); + return; + } + (globalThis)); + +//# 6023 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import; + function const$0(c, param){return c;} + function non(f, x){return 1 - caml_call1(f, x);} + function forever(f){ + try{for(;;) caml_call1(f, 0);} + catch(e$0){var e = caml_wrap_exception(e$0); return e;} + } + function compose(f, g, x){return caml_call1(f, caml_call1(g, x));} + function flip(f, x, y){return caml_call2(f, y, x);} + function apply_n_times(n, f, x){ + var n$0 = n, x$0 = x; + for(;;){ + if(0 >= n$0) return x$0; + var + x$1 = caml_call1(f, x$0), + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + x$0 = x$1; + } + } + var Base_Fn = [0, const$0, non, forever, apply_n_times, compose, flip]; + runtime.caml_register_global(1, Base_Fn, "Base__Fn"); + return; + } + (globalThis)); + +//# 6069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Equal = "Equal", + cst_Greater = "Greater", + cst_Less = "Less", + cst_equal = "equal", + cst_greater = "greater", + cst_less = "less", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, [0, 2, 0]]], + error_source_005 = "ordering.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Less, 0]], + [0, [1, [0, cst_Equal, 0]], [0, [1, [0, cst_Greater, 0]], 0]]]]], + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + compare = caml_int_compare, + _a_ = [0, cst_Less], + _b_ = [0, cst_Equal], + _c_ = [0, cst_Greater]; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function t_of_sexp(sexp_006){ + if(0 === sexp_006[0]){ + var _d_ = sexp_006[1], switch$0 = 0; + if(caml_string_notequal(_d_, cst_Equal)){ + var switch$1 = 0; + if(caml_string_notequal(_d_, cst_Greater)){ + var switch$2 = 0; + if(caml_string_notequal(_d_, cst_Less)){ + if(caml_string_notequal(_d_, cst_equal)) + if(caml_string_notequal(_d_, cst_greater)) + if(caml_string_notequal(_d_, cst_less)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 0; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 1; + } + else{ + var _e_ = sexp_006[1]; + if(! _e_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_006); + var _f_ = _e_[1]; + if(0 !== _f_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_006); + var _g_ = _f_[1], switch$3 = 0; + if(caml_string_notequal(_g_, cst_Equal)){ + var switch$4 = 0; + if(caml_string_notequal(_g_, cst_Greater)){ + var switch$5 = 0; + if(caml_string_notequal(_g_, cst_Less)){ + if(caml_string_notequal(_g_, cst_equal)) + if(caml_string_notequal(_g_, cst_greater)) + if(caml_string_notequal(_g_, cst_less)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_006); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + function equal(a, b){return 0 === caml_int_compare(a, b) ? 1 : 0;} + var Export = [0]; + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + var + Base_Ordering = + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + all, + equal, + of_int, + to_int, + Export]; + runtime.caml_register_global(20, Base_Ordering, "Base__Ordering"); + return; + } + (globalThis)); + +//# 6223 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + backend_type = Base_Sys0[1], + interactive = Base_Sys0[2], + os_type = Base_Sys0[3], + unix = Base_Sys0[4], + win32 = Base_Sys0[5], + cygwin = Base_Sys0[6], + word_size_in_bits = Base_Sys0[7], + int_size_in_bits = Base_Sys0[8], + big_endian = Base_Sys0[9], + max_string_length = Base_Sys0[10], + max_array_length = Base_Sys0[11], + runtime_variant = Base_Sys0[12], + runtime_parameters = Base_Sys0[13], + argv = Base_Sys0[14], + get_argv = Base_Sys0[15], + ocaml_version = Base_Sys0[16], + enable_runtime_warnings = Base_Sys0[17], + runtime_warnings_enabled = Base_Sys0[18], + getenv_exn = Base_Sys0[19], + getenv = Base_Sys0[20], + Base_Sys = + [0, + get_argv, + argv, + interactive, + os_type, + unix, + win32, + cygwin, + backend_type, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv, + getenv_exn]; + runtime.caml_register_global(1, Base_Sys, "Base__Sys"); + return; + } + (globalThis)); + +//# 6279 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = " <> ", + cst$0 = ": ", + cst_length_mismatch_in = "length mismatch in ", + cst_src_list_ml = "src/list.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_022 = "list.ml.Assoc.t", + Base_Import = global_data.Base__Import, + Base_Container = global_data.Base__Container, + Assert_failure = global_data.Assert_failure, + Base_Random = global_data.Base__Random, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Result = global_data.Base__Result, + Base_Ordering = global_data.Base__Ordering, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_List1 = global_data.Base__List1, + Base_Printf = global_data.Base__Printf, + Base_Sys = global_data.Base__Sys, + Base_Applicative = global_data.Base__Applicative, + Base_Monad = global_data.Base__Monad, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + hd_exn = Base_List1[1], + length = Base_List1[2], + rev_append = Base_List1[3], + tl_exn = Base_List1[4], + exists = Base_List1[6], + exists2_ok = Base_List1[7], + fold_left = Base_List1[8], + fold2_ok = Base_List1[9], + for_all = Base_List1[10], + for_all2_ok = Base_List1[11], + iter = Base_List1[12], + iter2_ok = Base_List1[13], + nontail_map = Base_List1[14], + rev_map = Base_List1[17], + rev_map2_ok = Base_List1[18], + sort = Base_List1[19], + stable_sort = Base_List1[20], + rev = Base_List1[21], + fold_right = Base_List1[22], + is_empty = Base_List1[23], + partition_map = Base_List1[24], + invalid_argf = Base_Printf[7], + t_of_sexp = Base_Import[176], + sexp_of_t = Base_Import[152], + cst_List_last = "List.last", + _s_ = [0, "list.ml.Transpose_got_lists_of_different_lengths"], + _t_ = [0, cst_src_list_ml, 1301, 13], + cst_List_random_element_exn_em = "List.random_element_exn: empty list", + cst_List_drop_last_exn_empty_l = "List.drop_last_exn: empty list", + _q_ = + [0, + [11, "List.chunks_of: Expected length > 0, got ", [4, 0, 0, 0, 0]], + "List.chunks_of: Expected length > 0, got %d"], + cst_List_sub = "List.sub", + _o_ = [0, cst_src_list_ml, 1045, 12], + _n_ = [0, cst_src_list_ml, 933, 4], + _m_ = [0, [11, "List.init ", [4, 0, 0, 0, 0]], "List.init %d"], + cst_List_reduce_balanced_exn = "List.reduce_balanced_exn", + _l_ = [0, cst_src_list_ml, 661, 14], + cst_List_reduce_exn = "List.reduce_exn", + _k_ = + [0, + [11, + "length mismatch in zip_exn: ", + [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]], + "length mismatch in zip_exn: %d <> %d"], + cst_map3_exn = "map3_exn", + cst_rev_map3_exn = "rev_map3_exn", + _j_ = [0, cst_src_list_ml, 528, 11], + cst_map2_exn = "map2_exn", + cst_exists2_exn = "exists2_exn", + cst_for_all2_exn = "for_all2_exn", + cst_fold2_exn = "fold2_exn", + cst_rev_map2_exn = "rev_map2_exn", + cst_iter2_exn = "iter2_exn", + _e_ = + [0, + [11, + cst_length_mismatch_in, + [2, + 0, + [11, + cst$0, + [4, + 0, + 0, + 0, + [11, + cst, + [4, + 0, + 0, + 0, + [11, " || ", [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]]]]]], + "length mismatch in %s: %d <> %d || %d <> %d"], + _d_ = + [0, + [11, + cst_length_mismatch_in, + [2, 0, [11, cst$0, [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _c_ = + [0, + [11, + "List.nth_exn ", + [4, 0, 0, 0, [11, " called on list of length ", [4, 0, 0, 0, 0]]]], + "List.nth_exn %d called on list of length %d"], + cst_List_range_stride_must_be_ = "List.range: stride must be non-zero", + cst_List_range_stride_function$0 = + "List.range': stride function cannot change direction", + cst_List_range_stride_function = + "List.range': stride function cannot return the same value", + _a_ = [0, "Ok"], + _b_ = [0, "Unequal_lengths"], + _f_ = [0, "List.find_map_exn: not found"], + _g_ = [0, "List.find_exn: not found"], + _h_ = [0, "List.findi_exn: not found"], + _i_ = [0, "List.find_mapi_exn: not found"], + _p_ = [0, "List.Assoc.find_exn: not found"], + cst_Base_List_Transpose_got_li = + "Base__List.Transpose_got_lists_of_different_lengths"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[195], a_sexp_grammar); + } + function compare(cmp_a, a_006, b_007){ + if(caml_call2(Base_Ppx_compare_lib[1], a_006, b_007)) return 0; + if(! a_006) return b_007 ? 1 : 0; + var a_008 = a_006[1]; + if(! b_007) return -1; + var b_009 = b_007[1]; + return caml_call2(cmp_a, a_008, b_009); + } + function sexp_of_t$0(of_a_010, param){ + if(! param) return _b_; + var arg0_011 = param[1], res0_012 = caml_call1(of_a_010, arg0_011); + return [1, [0, _a_, [0, res0_012, 0]]]; + } + var Or_unequal_lengths = [0, compare, sexp_of_t$0]; + function invariant(f, t){return caml_call2(iter, t, f);} + function of_list(t){return t;} + function range(compare, stride, opt, _a0_, start_i, stop_i){ + if(opt) var sth = opt[1], start = sth; else var start = 104758188; + if(_a0_) var sth$0 = _a0_[1], stop = sth$0; else var stop = -160346914; + var next_i = caml_call1(stride, start_i); + function order(x, y){ + var _a2_ = caml_call2(compare, x, y); + return caml_call1(Base_Ordering[9], _a2_); + } + function raise_stride_cannot_return_sam(param){ + return caml_call1(Base_Import[126], cst_List_range_stride_function); + } + switch(order(start_i, next_i)){ + case 0: + var initial_stride_order = 847855481; break; + case 1: + var initial_stride_order = raise_stride_cannot_return_sam(0); break; + default: var initial_stride_order = 85047514; + } + var + start_i$0 = 104758188 <= start ? start_i : next_i, + i = start_i$0, + accum = 0; + for(;;){ + var i_to_stop_order = order(i, stop_i), switch$0 = 0; + switch(i_to_stop_order){ + case 0: + switch$0 = 847855481 <= initial_stride_order ? 1 : 2; break; + case 1: + var _a1_ = 104758188 <= stop ? [0, i, accum] : accum; break; + default: switch$0 = 847855481 <= initial_stride_order ? 2 : 1; + } + switch(switch$0){ + case 1: + var next_i$0 = caml_call1(stride, i), switch$1 = 0; + switch(order(i, next_i$0)){ + case 0: + switch$1 = 847855481 <= initial_stride_order ? 2 : 1; break; + case 1: + var _a1_ = raise_stride_cannot_return_sam(0); break; + default: switch$1 = 847855481 <= initial_stride_order ? 1 : 2; + } + switch(switch$1){ + case 1: + var + _a1_ = + caml_call1(Base_Import[126], cst_List_range_stride_function$0); + break; + case 2: + var accum$0 = [0, i, accum], i = next_i$0, accum = accum$0; + continue; + } + break; + case 2: + var _a1_ = accum; break; + } + return caml_call1(rev, _a1_); + } + } + function range$0(opt, _aX_, _aW_, start_i, stop_i){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_aX_) var sth$0 = _aX_[1], start = sth$0; else var start = 104758188; + if(_aW_) var sth$1 = _aW_[1], stop = sth$1; else var stop = -160346914; + if(0 === stride) + caml_call1(Base_Import[126], cst_List_range_stride_must_be_); + var _aY_ = [0, stop], _aZ_ = [0, start]; + return range + (runtime.caml_int_compare, + function(x){return caml_call2(Base_Import[91], x, stride);}, + _aZ_, + _aY_, + start_i, + stop_i); + } + function hd(t){if(! t) return 0; var x = t[1]; return [0, x];} + function tl(t){if(! t) return 0; var t$0 = t[2]; return [0, t$0];} + function nth(t, n){ + if(0 > n) return 0; + var t$0 = t, n$0 = n; + for(;;){ + if(! t$0) return 0; + var t$1 = t$0[2], a = t$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = t$1, n$0 = n$1; + } + } + function nth_exn(t, n){ + var match = nth(t, n); + if(! match) + return caml_call4(invalid_argf, _c_, n, caml_call1(length, t), 0); + var a = match[1]; + return a; + } + function unordered_append(l1, l2){ + if(l1){ + if(l2) return caml_call2(rev_append, l1, l2); + var l = l1; + } + else + var l = l2; + return l; + } + function of_lists(l1, l2){ + var a = l1, b = l2, shared_length = 0; + for(;;){ + if(a){ + if(b){ + var + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b) return [0, shared_length]; + return [1, shared_length, a, b]; + } + } + function check_length2_exn(name, l1, l2){ + var match = of_lists(l1, l2); + if(0 === match[0]) return 0; + var + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aT_ = caml_call1(length, tail_of_b), + _aU_ = caml_call2(Base_Import[91], shared_length, _aT_), + _aV_ = caml_call1(length, tail_of_a); + return caml_call5 + (invalid_argf, + _d_, + name, + caml_call2(Base_Import[91], shared_length, _aV_), + _aU_, + 0); + } + function check_length2(l1, l2, f){ + return 0 === of_lists(l1, l2)[0] ? [0, caml_call2(f, l1, l2)] : 0; + } + function of_lists$0(l1, l2, l3){ + var a = l1, b = l2, c = l3, shared_length = 0; + for(;;){ + if(a){ + if(b && c){ + var + c$0 = c[2], + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + c = c$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b && ! c) return [0, shared_length]; + return [1, shared_length, a, b, c]; + } + } + function check_length3_exn(name, l1, l2, l3){ + var match = of_lists$0(l1, l2, l3); + if(0 === match[0]) return 0; + var + tail_of_c = match[4], + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aQ_ = caml_call1(length, tail_of_a), + n1 = caml_call2(Base_Import[91], shared_length, _aQ_), + _aR_ = caml_call1(length, tail_of_b), + n2 = caml_call2(Base_Import[91], shared_length, _aR_), + _aS_ = caml_call1(length, tail_of_c), + n3 = caml_call2(Base_Import[91], shared_length, _aS_); + return caml_call7(invalid_argf, _e_, name, n1, n2, n2, n3, 0); + } + function check_length3(l1, l2, l3, f){ + return 0 === of_lists$0(l1, l2, l3)[0] + ? [0, caml_call3(f, l1, l2, l3)] + : 0; + } + function iter2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aN_){ + var _aO_ = caml_call1(iter2_ok, _aN_); + return function(_aP_){return caml_call2(_aO_, _aP_, f);}; + }); + } + function iter2_exn(l1, l2, f){ + check_length2_exn(cst_iter2_exn, l1, l2); + return caml_call3(iter2_ok, l1, l2, f); + } + function rev_map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aK_){ + var _aL_ = caml_call1(rev_map2_ok, _aK_); + return function(_aM_){return caml_call2(_aL_, _aM_, f);}; + }); + } + function rev_map2_exn(l1, l2, f){ + check_length2_exn(cst_rev_map2_exn, l1, l2); + return caml_call3(rev_map2_ok, l1, l2, f); + } + function fold2(l1, l2, init, f){ + return check_length2 + (l1, + l2, + function(_aH_){ + var _aI_ = caml_call1(fold2_ok, _aH_); + return function(_aJ_){return caml_call3(_aI_, _aJ_, init, f);}; + }); + } + function fold2_exn(l1, l2, init, f){ + check_length2_exn(cst_fold2_exn, l1, l2); + return caml_call4(fold2_ok, l1, l2, init, f); + } + function for_all2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aE_){ + var _aF_ = caml_call1(for_all2_ok, _aE_); + return function(_aG_){return caml_call2(_aF_, _aG_, f);}; + }); + } + function for_all2_exn(l1, l2, f){ + check_length2_exn(cst_for_all2_exn, l1, l2); + return caml_call3(for_all2_ok, l1, l2, f); + } + function exists2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aB_){ + var _aC_ = caml_call1(exists2_ok, _aB_); + return function(_aD_){return caml_call2(_aC_, _aD_, f);}; + }); + } + function exists2_exn(l1, l2, f){ + check_length2_exn(cst_exists2_exn, l1, l2); + return caml_call3(exists2_ok, l1, l2, f); + } + function mem(t, a, equal){ + var param = t; + for(;;){ + if(! param) return 0; + var bs = param[2], b = param[1], _aA_ = caml_call2(equal, a, b); + if(_aA_) return _aA_; + var param = bs; + } + } + function rev_filter(t, f){ + var accu = 0, param = t; + for(;;){ + if(! param) return accu; + var l = param[2], x = param[1]; + if(caml_call1(f, x)){ + var accu$0 = [0, x, accu], accu = accu$0, param = l; + continue; + } + var param = l; + } + } + function filter(t, f){return caml_call1(rev, rev_filter(t, f));} + function find_map(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1], r = caml_call1(f, x); + if(r) return r; + var param = l; + } + } + var not_found = [0, Base_Import[252], _f_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1]; + if(caml_call1(f, x)) return [0, x]; + var param = l; + } + } + var not_found$0 = [0, Base_Import[252], _g_]; + function find_exn(t, f){ + var t$0 = t; + for(;;){ + if(! t$0) throw caml_maybe_attach_backtrace(not_found$0, 1); + var t$1 = t$0[2], x = t$0[1]; + if(caml_call1(f, x)) return x; + var t$0 = t$1; + } + } + function findi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1]; + if(caml_call2(f, i, x)) return [0, [0, i, x]]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$1 = [0, Base_Import[252], _h_]; + function findi_exn(t, f){ + var match = findi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$1, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1], result = caml_call2(f, i, x); + if(result) return result; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$2 = [0, Base_Import[252], _i_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$2, 1); + var x = match[1]; + return x; + } + function for_alli(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 1; + var tl = t$0[2], hd = t$0[1], _az_ = caml_call2(f, i, hd); + if(! _az_) return _az_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + function existsi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var tl = t$0[2], hd = t$0[1], _ay_ = caml_call2(f, i, hd); + if(_ay_) return _ay_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + var to_array = Base_Array0[13]; + function to_list(t){return t;} + var max_non_tailcall = typeof Base_Sys[8] === "number" ? 1000 : 50; + function count_append(l1, l2, count){ + if(! l2) return l1; + if(! l1) return l2; + var _au_ = l1[2], x1 = l1[1]; + if(! _au_) return [0, x1, l2]; + var _av_ = _au_[2], x2 = _au_[1]; + if(! _av_) return [0, x1, [0, x2, l2]]; + var _aw_ = _av_[2], x3 = _av_[1]; + if(! _aw_) return [0, x1, [0, x2, [0, x3, l2]]]; + var match = _aw_[2], x4 = _aw_[1]; + if(! match) return [0, x1, [0, x2, [0, x3, [0, x4, l2]]]]; + var + tl = match[2], + x5 = match[1], + _ax_ = + max_non_tailcall < count + ? caml_call2(rev_append, caml_call1(rev, tl), l2) + : count_append(tl, l2, caml_call2(Base_Import[91], count, 1)); + return [0, x1, [0, x2, [0, x3, [0, x4, [0, x5, _ax_]]]]]; + } + function append(l1, l2){return count_append(l1, l2, 0);} + function count_map(f, l, ctr){ + if(! l) return 0; + var _aq_ = l[2], x1$0 = l[1]; + if(! _aq_){var f1$3 = caml_call1(f, x1$0); return [0, f1$3, 0];} + var _ar_ = _aq_[2], x2$0 = _aq_[1]; + if(! _ar_){ + var f1$2 = caml_call1(f, x1$0), f2$2 = caml_call1(f, x2$0); + return [0, f1$2, [0, f2$2, 0]]; + } + var _as_ = _ar_[2], x3$0 = _ar_[1]; + if(! _as_){ + var + f1$1 = caml_call1(f, x1$0), + f2$1 = caml_call1(f, x2$0), + f3$1 = caml_call1(f, x3$0); + return [0, f1$1, [0, f2$1, [0, f3$1, 0]]]; + } + var match$1 = _as_[2], x4$0 = _as_[1]; + if(! match$1){ + var + f1$0 = caml_call1(f, x1$0), + f2$0 = caml_call1(f, x2$0), + f3$0 = caml_call1(f, x3$0), + f4$0 = caml_call1(f, x4$0); + return [0, f1$0, [0, f2$0, [0, f3$0, [0, f4$0, 0]]]]; + } + var + tl = match$1[2], + x5$0 = match$1[1], + f1 = caml_call1(f, x1$0), + f2 = caml_call1(f, x2$0), + f3 = caml_call1(f, x3$0), + f4 = caml_call1(f, x4$0), + f5 = caml_call1(f, x5$0); + if(max_non_tailcall < ctr){ + var bs$0 = 0, xs = tl; + for(;;){ + if(xs){ + var _aj_ = xs[2]; + if(_aj_){ + var _ak_ = _aj_[2]; + if(_ak_){ + var _al_ = _ak_[2]; + if(_al_){ + var _am_ = _al_[2]; + if(_am_){ + var _an_ = _am_[2]; + if(_an_){ + var _ao_ = _an_[2]; + if(_ao_){ + var _ap_ = _ao_[2]; + if(_ap_){ + var match$0 = _ap_[2]; + if(match$0){ + var + xs$0 = match$0[2], + x8 = match$0[1], + x7 = _ap_[1], + x6 = _ao_[1], + x5 = _an_[1], + x4 = _am_[1], + x3 = _al_[1], + x2 = _ak_[1], + x1 = _aj_[1], + x0 = xs[1], + y0$0 = caml_call1(f, x0), + y1$0 = caml_call1(f, x1), + y2$0 = caml_call1(f, x2), + y3$0 = caml_call1(f, x3), + y4$0 = caml_call1(f, x4), + y5$0 = caml_call1(f, x5), + y6$0 = caml_call1(f, x6), + y7$0 = caml_call1(f, x7), + y8$0 = caml_call1(f, x8), + bs$1 = + [0, + [0, y0$0, y1$0, y2$0, y3$0, y4$0, y5$0, y6$0, y7$0, y8$0], + bs$0], + bs$0 = bs$1, + xs = xs$0; + continue; + } + } + } + } + } + } + } + } + } + var ys$1 = caml_call2(nontail_map, xs, f), ys = ys$1, param = bs$0; + for(;;){ + if(param){ + var + bs = param[2], + match = param[1], + y8 = match[9], + y7 = match[8], + y6 = match[7], + y5 = match[6], + y4 = match[5], + y3 = match[4], + y2 = match[3], + y1 = match[2], + y0 = match[1], + ys$0 = + [0, + y0, + [0, + y1, + [0, y2, [0, y3, [0, y4, [0, y5, [0, y6, [0, y7, [0, y8, ys]]]]]]]]], + ys = ys$0, + param = bs; + continue; + } + var _at_ = ys; + break; + } + break; + } + } + else + var _at_ = count_map(f, tl, caml_call2(Base_Import[91], ctr, 1)); + return [0, f1, [0, f2, [0, f3, [0, f4, [0, f5, _at_]]]]]; + } + function map(l, f){return count_map(f, l, 0);} + function folding_map(t, init, f){ + var acc = [0, init]; + return map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function symbol_map(l, f){return map(l, f);} + function map2_ok(l1, l2, f){ + return caml_call1(rev, caml_call3(rev_map2_ok, l1, l2, f)); + } + function map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_ah_){ + return function(_ai_){return map2_ok(_ah_, _ai_, f);}; + }); + } + function map2_exn(l1, l2, f){ + check_length2_exn(cst_map2_exn, l1, l2); + return map2_ok(l1, l2, f); + } + function rev_map3_ok(l1, l2, l3, f){ + var l1$0 = l1, l2$0 = l2, l3$0 = l3, ac = 0; + for(;;){ + if(l1$0){ + if(l2$0 && l3$0){ + var + l3$1 = l3$0[2], + x3 = l3$0[1], + l2$1 = l2$0[2], + x2 = l2$0[1], + l1$1 = l1$0[2], + x1 = l1$0[1], + ac$0 = [0, caml_call3(f, x1, x2, x3), ac], + l1$0 = l1$1, + l2$0 = l2$1, + l3$0 = l3$1, + ac = ac$0; + continue; + } + } + else if(! l2$0 && ! l3$0) return ac; + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function rev_map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ae_){ + return function(_af_){ + return function(_ag_){ + return rev_map3_ok(_ae_, _af_, _ag_, f);};}; + }); + } + function rev_map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_rev_map3_exn, l1, l2, l3); + return rev_map3_ok(l1, l2, l3, f); + } + function map3_ok(l1, l2, l3, f){ + return caml_call1(rev, rev_map3_ok(l1, l2, l3, f)); + } + function map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ab_){ + return function(_ac_){ + return function(_ad_){return map3_ok(_ab_, _ac_, _ad_, f);};}; + }); + } + function map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_map3_exn, l1, l2, l3); + return map3_ok(l1, l2, l3, f); + } + function rev_map_append(l1, l2, f){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + h = l1$0[1], + l2$1 = [0, caml_call1(f, h), l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function unzip(list){ + var list$2 = caml_call1(rev, list), list$0 = list$2, l1 = 0, l2 = 0; + for(;;){ + if(! list$0) return [0, l1, l2]; + var + list$1 = list$0[2], + match = list$0[1], + y = match[2], + x = match[1], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0; + } + } + function unzip3(list){ + var + list$2 = caml_call1(rev, list), + list$0 = list$2, + l1 = 0, + l2 = 0, + l3 = 0; + for(;;){ + if(! list$0) return [0, l1, l2, l3]; + var + list$1 = list$0[2], + match = list$0[1], + z = match[3], + y = match[2], + x = match[1], + l3$0 = [0, z, l3], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0, + l3 = l3$0; + } + } + function zip_exn(l1, l2){ + try{ + var _$_ = map2_ok(l1, l2, function(a, b){return [0, a, b];}); + return _$_; + } + catch(_aa_){ + var ___ = caml_call1(length, l2); + return caml_call4(invalid_argf, _k_, caml_call1(length, l1), ___, 0); + } + } + function zip(l1, l2){ + return map2(l1, l2, function(a, b){return [0, a, b];}); + } + function rev_mapi(l, f){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return acc; + var + t = param[2], + h = param[1], + acc$0 = [0, caml_call2(f, i, h), acc], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + acc = acc$0, + param = t; + } + } + function mapi(l, f){return caml_call1(rev, rev_mapi(l, f));} + function folding_mapi(t, init, f){ + var acc = [0, init]; + return mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function iteri(l, f){ + caml_call3 + (fold_left, + l, + 0, + function(i, x){ + caml_call2(f, i, x); + return caml_call2(Base_Import[91], i, 1); + }); + return 0; + } + function foldi(t, init, f){ + var + _Y_ = + caml_call3 + (fold_left, + t, + [0, 0, init], + function(param, v){ + var acc = param[2], i = param[1], _Z_ = caml_call3(f, i, acc, v); + return [0, caml_call2(Base_Import[91], i, 1), _Z_]; + }); + return caml_call1(Base_Import[127], _Y_); + } + function filteri(l, f){ + return caml_call1 + (rev, + foldi + (l, + 0, + function(pos, acc, x){ + return caml_call2(f, pos, x) ? [0, x, acc] : acc; + })); + } + function reduce(l, f){ + if(! l) return 0; + var tl = l[2], hd = l[1]; + return [0, caml_call3(fold_left, tl, hd, f)]; + } + function reduce_exn(l, f){ + var match = reduce(l, f); + if(! match) return caml_call1(Base_Import[126], cst_List_reduce_exn); + var v = match[1]; + return v; + } + function reduce_balanced(l, f){ + function step_accum(num, acc, x){ + var num$0 = num, acc$0 = acc, x$0 = x; + for(;;){ + if(0 === caml_call2(Base_Import[116], num$0, 1)) return [0, x$0, acc$0]; + if(! acc$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + acc$1 = acc$0[2], + y = acc$0[1], + x$1 = caml_call2(f, y, x$0), + num$1 = caml_call2(Base_Import[115], num$0, 1), + num$0 = num$1, + acc$0 = acc$1, + x$0 = x$1; + } + } + var match = foldi(l, 0, step_accum); + if(! match) return 0; + var xs = match[2], x = match[1]; + return [0, + caml_call3 + (fold_left, xs, x, function(x, y){return caml_call2(f, y, x);})]; + } + function reduce_balanced_exn(l, f){ + var match = reduce_balanced(l, f); + if(! match) + return caml_call1(Base_Import[126], cst_List_reduce_balanced_exn); + var v = match[1]; + return v; + } + function groupi(l, break$0){ + var + groups = + foldi + (l, + 0, + function(i, acc, x){ + if(! acc) return [0, [0, x, 0], 0]; + var tl = acc[2], current_group = acc[1]; + return caml_call3(break$0, i, caml_call1(hd_exn, current_group), x) + ? [0, [0, x, 0], [0, current_group, tl]] + : [0, [0, x, current_group], tl]; + }); + return groups ? caml_call2(rev_map, groups, rev) : 0; + } + function group(l, break$0){ + return groupi(l, function(param, x, y){return caml_call2(break$0, x, y);}); + } + function sort_and_group(l, compare){ + var _X_ = caml_call2(stable_sort, l, compare); + return group + (_X_, + function(x, y){return 0 !== caml_call2(compare, x, y) ? 1 : 0;}); + } + function concat_map(l, f){ + var acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call1(f, hd), acc), + acc = acc$0, + param = tl; + } + } + function concat_mapi(l, f){ + var cont = 0, acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call2(f, cont, hd), acc), + cont$0 = caml_call2(Base_Import[91], cont, 1), + cont = cont$0, + acc = acc$0, + param = tl; + } + } + function merge(l1, l2, compare){ + var acc = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return caml_call2(rev_append, acc, l2$0); + if(! l2$0) return caml_call2(rev_append, acc, l1$0); + var t2 = l2$0[2], h2 = l2$0[1], t1 = l1$0[2], h1 = l1$0[1]; + if(0 < caml_call2(compare, h1, h2)){ + var acc$0 = [0, h2, acc], acc = acc$0, l2$0 = t2; + continue; + } + var acc$1 = [0, h1, acc], acc = acc$1, l1$0 = t1; + } + } + function map2$0(a, b, f){ + return concat_map + (a, + function(x){ + return map(b, function(y){return caml_call2(f, x, y);}); + }); + } + function return$0(x){return [0, x, 0];} + function symbol_bind(t, f){return concat_map(t, f);} + var + map$0 = [0, -198771759, map], + Applicative = + caml_call1(Base_Applicative[11], [0, return$0, map2$0, map$0]), + map$1 = [0, -198771759, map], + Monad = caml_call1(Base_Monad[1], [0, concat_map, return$0, map$1]), + all = Monad[9], + all_unit = Monad[10], + ignore_m = Monad[8], + join = Monad[7], + apply = Applicative[8], + both = Applicative[3], + map3$0 = Applicative[10], + symbol = Applicative[4], + symbol$0 = Applicative[6], + symbol$1 = Applicative[5], + symbol$2 = Applicative[4], + symbol$3 = Applicative[6], + symbol$4 = Applicative[5], + Open_on_rhs = [0], + Let_syntax = [0, return$0, concat_map, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind, symbol_map, Let_syntax], + Monad_infix = [0, symbol_bind, symbol_map]; + function last_exn(list){ + var list$0 = list; + for(;;){ + if(! list$0) return caml_call1(Base_Import[126], cst_List_last); + var x = list$0[1]; + if(! list$0[2]) return x; + var list$1 = list$0[2], list$0 = list$1; + } + } + function last(list){ + var list$0 = list; + for(;;){ + if(! list$0) return 0; + var x = list$0[1]; + if(! list$0[2]) return [0, x]; + var list$1 = list$0[2], list$0 = list$1; + } + } + function is_prefix(list, prefix, equal){ + var list$0 = list, prefix$0 = prefix; + for(;;){ + if(! prefix$0) return 1; + var prefix$1 = prefix$0[2], hd = prefix$0[1]; + if(! list$0) return 0; + var + list$1 = list$0[2], + hd$0 = list$0[1], + _W_ = caml_call2(equal, hd, hd$0); + if(! _W_) return _W_; + var list$0 = list$1, prefix$0 = prefix$1; + } + } + function find_consecutive_duplicate(t, equal){ + if(! t) return 0; + var t$0 = t[2], a1 = t[1], a1$0 = a1, t$1 = t$0; + for(;;){ + if(! t$1) return 0; + var t$2 = t$1[2], a2 = t$1[1]; + if(caml_call2(equal, a1$0, a2)) return [0, [0, a1$0, a2]]; + var a1$0 = a2, t$1 = t$2; + } + } + function remove_consecutive_duplicates(opt, list, equal){ + if(opt) + var sth = opt[1], which_to_keep = sth; + else + var which_to_keep = 847656566; + if(! list) return 0; + var + tl$0 = list[2], + to_keep$2 = list[1], + to_keep = to_keep$2, + accum = 0, + param = tl$0; + for(;;){ + if(! param) return caml_call1(rev, [0, to_keep, accum]); + var tl = param[2], to_keep$0 = param[1]; + if(caml_call2(equal, to_keep$0, to_keep)){ + var + to_keep$1 = 847656566 <= which_to_keep ? to_keep$0 : to_keep, + to_keep = to_keep$1, + param = tl; + continue; + } + var + accum$0 = [0, to_keep, accum], + to_keep = to_keep$0, + accum = accum$0, + param = tl; + } + } + function dedup_and_sort(list, compare){ + if(list && list[2]){ + var + equal = + function(x$0, x){return 0 === caml_call2(compare, x$0, x) ? 1 : 0;}, + sorted = caml_call2(sort, list, compare); + return remove_consecutive_duplicates(0, sorted, equal); + } + return list; + } + function find_a_dup(l, compare){ + var sorted = caml_call2(sort, l, compare), l$0 = sorted; + for(;;){ + if(l$0){ + var tl = l$0[2]; + if(tl){ + var hd2 = tl[1], hd1 = l$0[1]; + if(0 === caml_call2(compare, hd1, hd2)) return [0, hd1]; + var l$0 = tl; + continue; + } + } + return 0; + } + } + function contains_dup(lst, compare){ + return find_a_dup(lst, compare) ? 1 : 0; + } + function find_all_dups(l, compare){ + function compare$0(a, b){ + var _V_ = caml_call2(compare, a, b); + return caml_call2(Base_Import[88], -1, _V_); + } + var sorted = caml_call2(sort, l, compare$0); + if(! sorted) return 0; + var + sorted$2 = sorted[2], + prev$1 = sorted[1], + sorted$0 = sorted$2, + prev = prev$1, + already_recorded = 0, + acc = 0; + for(;;){ + if(! sorted$0) return acc; + var sorted$1 = sorted$0[2], prev$0 = sorted$0[1]; + if(0 !== compare$0(prev, prev$0)){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 0; + continue; + } + if(already_recorded){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 1; + continue; + } + var + acc$0 = [0, prev$0, acc], + sorted$0 = sorted$1, + prev = prev$0, + already_recorded = 1, + acc = acc$0; + } + } + function all_equal(t$0, equal){ + if(! t$0) return 0; + var xs$0 = t$0[2], x$0 = t$0[1], t = xs$0; + for(;;){ + if(t){ + var xs = t[2], x = t[1], _T_ = caml_call2(equal, x, x$0); + if(_T_){var t = xs; continue;} + var _U_ = _T_; + } + else + var _U_ = 1; + return _U_ ? [0, x$0] : 0; + } + } + function count(t, f){ + return caml_call3(Base_Container[2], fold_left, t, f); + } + function sum(m, t, f){ + return caml_call4(Base_Container[7], fold_left, m, t, f); + } + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold_left, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold_left, t, compare); + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _m_, n, 0); + var i = n, accum = 0; + for(;;){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + if(0 === i) return accum; + var + accum$0 = [0, caml_call1(f, caml_call2(Base_Import[93], i, 1)), accum], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + accum = accum$0; + } + } + function rev_filter_map(l, f){ + var l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call1(f, hd); + if(match){ + var x = match[1], accum$0 = [0, x, accum], l$0 = tl, accum = accum$0; + continue; + } + var l$0 = tl; + } + } + function filter_map(l, f){return caml_call1(rev, rev_filter_map(l, f));} + function rev_filter_mapi(l, f){ + var i = 0, l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call2(f, i, hd); + if(match){ + var + x = match[1], + accum$0 = [0, x, accum], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + l$0 = tl, + accum = accum$0; + continue; + } + var i$1 = caml_call2(Base_Import[91], i, 1), i = i$1, l$0 = tl; + } + } + function filter_mapi(l, f){return caml_call1(rev, rev_filter_mapi(l, f));} + function filter_opt(l){return filter_map(l, function(_S_){return _S_;});} + function partition3_map(t, f){ + var t$0 = t, fst = 0, snd = 0, trd = 0; + for(;;){ + if(! t$0){ + var _Q_ = caml_call1(rev, trd), _R_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _R_, _Q_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x), _P_ = match[1]; + if(4152137 === _P_){ + var y = match[2], snd$0 = [0, y, snd], t$0 = t$1, snd = snd$0; + continue; + } + if(4202758 <= _P_){ + var y$0 = match[2], trd$0 = [0, y$0, trd], t$0 = t$1, trd = trd$0; + continue; + } + var y$1 = match[2], fst$0 = [0, y$1, fst], t$0 = t$1, fst = fst$0; + } + } + function partition_tf(t, f){ + function f$0(x){return caml_call1(f, x) ? [0, x] : [1, x];} + return caml_call2(partition_map, t, f$0); + } + function partition_result(t){ + return caml_call2(partition_map, t, Base_Result[35]); + } + function t_of_sexp$0(of_a_014, of_b_015, x_023){ + function _M_(sexp_021){ + if(1 === sexp_021[0]){ + var _N_ = sexp_021[1]; + if(_N_){ + var _O_ = _N_[2]; + if(_O_ && ! _O_[2]){ + var + arg1_018 = _O_[1], + arg0_017 = _N_[1], + res0_019 = caml_call1(of_a_014, arg0_017), + res1_020 = caml_call1(of_b_015, arg1_018); + return [0, res0_019, res1_020]; + } + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[2], error_source_022, 2, sexp_021); + } + return caml_call2(Base_Import[176], _M_, x_023); + } + function sexp_of_t$1(of_a_024, of_b_025, x_030){ + function _L_(param){ + var + arg1_027 = param[2], + arg0_026 = param[1], + res0_028 = caml_call1(of_a_024, arg0_026), + res1_029 = caml_call1(of_b_025, arg1_027); + return [1, [0, res0_028, [0, res1_029, 0]]]; + } + return caml_call2(Base_Import[152], _L_, x_030); + } + function t_sexp_grammar$0(a_sexp_grammar, b_sexp_grammar){ + return caml_call1 + (Base_Import[195], + [2, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]); + } + function pair_of_group(list){ + if(! list) throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + var k = list[1][1]; + return [0, k, map(list, Base_Import[127])]; + } + function group$0(alist, equal){ + return map + (group + (alist, + function(param, _K_){ + var y = _K_[1], x = param[1]; + return 1 - caml_call2(equal, x, y); + }), + pair_of_group); + } + function sort_and_group$0(alist, compare){ + return map + (sort_and_group + (alist, + function(param, _J_){ + var y = _J_[1], x = param[1]; + return caml_call2(compare, x, y); + }), + pair_of_group); + } + function find$0(t, equal, key){ + var + match = + find + (t, + function(param){ + var key$0 = param[1]; + return caml_call2(equal, key, key$0); + }); + if(! match) return 0; + var x = match[1]; + return [0, caml_call1(Base_Import[127], x)]; + } + var not_found$3 = [0, Base_Import[252], _p_]; + function find_exn$0(t, equal, key){ + var match = find$0(t, equal, key); + if(! match) throw caml_maybe_attach_backtrace(not_found$3, 1); + var value = match[1]; + return value; + } + function mem$0(t, equal, key){return find$0(t, equal, key) ? 1 : 0;} + function remove(t, equal, key){ + return filter + (t, + function(param){ + var key$0 = param[1]; + return 1 - caml_call2(equal, key, key$0); + }); + } + function add(t, equal, key, value){ + return [0, [0, key, value], remove(t, equal, key)]; + } + function inverse(t){ + return map + (t, + function(param){ + var y = param[2], x = param[1]; + return [0, y, x]; + }); + } + function map$2(t, f){ + return map + (t, + function(param){ + var value = param[2], key = param[1]; + return [0, key, caml_call1(f, value)]; + }); + } + function sub(l, pos, len){ + var _F_ = pos < 0 ? 1 : 0; + if(_F_) + var _G_ = _F_; + else{ + var _H_ = len < 0 ? 1 : 0; + if(_H_) + var _G_ = _H_; + else + var + _I_ = caml_call1(length, l), + _G_ = caml_call2(Base_Import[93], _I_, len) < pos ? 1 : 0; + } + if(_G_) caml_call1(Base_Import[126], cst_List_sub); + return caml_call1 + (rev, + foldi + (l, + 0, + function(i, acc, el){ + if(pos <= i && i < caml_call2(Base_Import[91], pos, len)) + return [0, el, acc]; + return acc; + })); + } + function split_n(t_orig, n){ + if(0 >= n) return [0, 0, t_orig]; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return [0, caml_call1(rev, accum), t]; + if(! t) return [0, t_orig, 0]; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function take(t_orig, n){ + if(0 >= n) return 0; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return caml_call1(rev, accum); + if(! t) return t_orig; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function drop(t, n){ + var t$0 = t, n$0 = n; + for(;;){ + if(t$0){ + var tl = t$0[2]; + if(0 < n$0){ + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = tl, n$0 = n$1; + continue; + } + } + return t$0; + } + } + function chunks_of(l, length){ + if(length <= 0) caml_call3(invalid_argf, _q_, length, 0); + var acc = 0, l$0 = l; + for(;;){ + if(! l$0) return caml_call1(rev, acc); + var + match = split_n(l$0, length), + l$1 = match[2], + sublist = match[1], + acc$0 = [0, sublist, acc], + acc = acc$0, + l$0 = l$1; + } + } + function split_while(xs, f){ + var acc = 0, t = xs; + for(;;){ + if(t){ + var tl = t[2], hd = t[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, t = tl; + continue; + } + } + return [0, caml_call1(rev, acc), t]; + } + } + function take_while(xs, f){ + var acc = 0, param = xs; + for(;;){ + if(param){ + var tl = param[2], hd = param[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, param = tl; + continue; + } + } + return caml_call1(rev, acc); + } + } + function drop_while(t, f){ + var t$0 = t; + for(;;){ + if(t$0){ + var tl = t$0[2], hd = t$0[1]; + if(caml_call1(f, hd)){var t$0 = tl; continue;} + } + return t$0; + } + } + function drop_last(t){ + var match = caml_call1(rev, t); + if(! match) return 0; + var lst = match[2]; + return [0, caml_call1(rev, lst)]; + } + function drop_last_exn(t){ + var match = drop_last(t); + if(! match) + return caml_call1(Base_Import[124], cst_List_drop_last_exn_empty_l); + var lst = match[1]; + return lst; + } + function cartesian_product(list1, list2){ + if(caml_call1(is_empty, list2)) return 0; + var l1 = list1, accum = 0; + for(;;){ + if(! l1) return caml_call1(rev, accum); + var + tl = l1[2], + hd = l1[1], + accum$0 = + caml_call2 + (rev_append, + map + (list2, function(hd){return function(x){return [0, hd, x];};}(hd)), + accum), + l1 = tl, + accum = accum$0; + } + } + function concat(l){return caml_call3(fold_right, l, append, 0);} + function concat_no_order(l){ + return caml_call3 + (fold_left, + l, + 0, + function(acc, l){return caml_call2(rev_append, l, acc);}); + } + function cons(x, l){return [0, x, l];} + function is_sorted(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _E_ = caml_call2(compare, x1, x2) <= 0 ? 1 : 0; + if(! _E_) return _E_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + function is_sorted_strictly(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _D_ = caml_call2(compare, x1, x2) < 0 ? 1 : 0; + if(! _D_) return _D_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + var Infix = [0, append]; + function permute(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(list){ + var _C_ = list[2]; + if(_C_){ + if(_C_[2]){ + var arr = caml_call1(Base_Array0[13], list); + caml_call4(Base_Array_permute[24], [0, random_state], 0, 0, arr); + return caml_call1(Base_Array0[15], arr); + } + var y = _C_[1], x = list[1]; + return caml_call1(Base_Random[18][16], random_state) + ? [0, y, [0, x, 0]] + : list; + } + } + return list; + } + function random_element_exn(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(caml_call1(is_empty, list)) + return caml_call1(Base_Import[124], cst_List_random_element_exn_em); + var _B_ = caml_call1(length, list); + return nth_exn(list, caml_call2(Base_Random[18][6], random_state, _B_)); + } + function random_element(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{ + var _z_ = [0, random_element_exn([0, random_state], list)]; + return _z_; + } + catch(_A_){return 0;} + } + function compare$0(cmp, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + n = caml_call2(cmp, x, y); + if(0 !== n) return n; + var a$0 = xs, b$0 = ys; + } + } + var hash_fold_t = Base_Import[213]; + function equal(equal, t1, t2){ + var t1$0 = t1, t2$0 = t2; + for(;;){ + if(t1$0){ + if(t2$0){ + var + t2$1 = t2$0[2], + x2 = t2$0[1], + t1$1 = t1$0[2], + x1 = t1$0[1], + _y_ = caml_call2(equal, x1, x2); + if(! _y_) return _y_; + var t1$0 = t1$1, t2$0 = t2$1; + continue; + } + } + else if(! t2$0) return 1; + return 0; + } + } + function transpose(rows$0){ + var rows = rows$0, columns = 0, do_rev = 1; + a: + for(;;){ + var t = rows, column_acc = 0, trimmed_rows = 0, found_empty = 0; + for(;;){ + if(! t){ + if(! column_acc && ! trimmed_rows) + return [0, caml_call1(rev, columns)]; + if(found_empty) return 0; + var + column = do_rev ? caml_call1(rev, column_acc) : column_acc, + do_rev$0 = 1 - do_rev, + columns$0 = [0, column, columns], + rows = trimmed_rows, + columns = columns$0, + do_rev = do_rev$0; + continue a; + } + var match = t[1]; + if(match){ + var + tl = t[2], + xs = match[2], + x = match[1], + trimmed = [0, xs, trimmed_rows], + column_acc$0 = [0, x, column_acc], + t = tl, + column_acc = column_acc$0, + trimmed_rows = trimmed; + continue; + } + var tl$0 = t[2], t = tl$0, found_empty = 1; + } + } + } + var + Transpose_got_lists_of_differe = + [248, cst_Base_List_Transpose_got_li, runtime.caml_fresh_oo_id(0)]; + function _r_(param){ + if(param[1] !== Transpose_got_lists_of_differe) + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + var + arg0_031 = param[2], + res0_032 = caml_call2(Base_Import[152], Base_Import[142], arg0_031); + return [1, [0, _s_, [0, res0_032, 0]]]; + } + caml_call4 + (Sexplib0_Sexp_conv[70][1], 0, 0, Transpose_got_lists_of_differe, _r_); + function transpose_exn(l){ + var match = transpose(l); + if(! match) + throw caml_maybe_attach_backtrace + ([0, Transpose_got_lists_of_differe, map(l, length)], 1); + var l$0 = match[1]; + return l$0; + } + function intersperse(t, sep){ + if(! t) return 0; + var xs = t[2], x = t[1], _x_ = 0; + return [0, + x, + caml_call3 + (fold_right, + xs, + function(y, acc){return [0, sep, [0, y, acc]];}, + _x_)]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold_left, init, f, t); + } + function fold_until(t, init, f){ + var _v_ = caml_call3(Base_Container[9], fold_left, init, f); + return function(_w_){return caml_call2(_v_, _w_, t);}; + } + function is_suffix(list, suffix, equal_elt){ + var + list_len = caml_call1(length, list), + suffix_len = caml_call1(length, suffix), + _u_ = suffix_len <= list_len ? 1 : 0; + return _u_ + ? equal + (equal_elt, + drop(list, caml_call2(Base_Import[93], list_len, suffix_len)), + suffix) + : _u_; + } + var + Base_List = + [0, + compare$0, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + mem, + length, + is_empty, + iter, + fold_left, + fold_result, + fold_until, + exists, + for_all, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + [0, + both, + symbol, + symbol$1, + symbol$0, + apply, + map2$0, + map3$0, + [0, symbol$2, symbol$4, symbol$3, symbol_map], + symbol_bind, + symbol_map, + [0, symbol_bind, symbol_map], + concat_map, + return$0, + map, + join, + ignore_m, + all, + all_unit, + [0, return$0, symbol_bind, symbol_map, Let_syntax]], + symbol_bind, + symbol_map, + Monad_infix, + concat_map, + return$0, + join, + ignore_m, + all, + all_unit, + Let_syntax$0, + Or_unequal_lengths, + of_list, + nth, + nth_exn, + rev, + rev_append, + unordered_append, + rev_map, + iter2_exn, + iter2, + rev_map2_exn, + rev_map2, + fold2_exn, + fold2, + for_alli, + for_all2_exn, + for_all2, + existsi, + exists2_exn, + exists2, + filter, + rev_filter, + filteri, + partition_map, + partition3_map, + partition_tf, + partition_result, + split_n, + sort, + stable_sort, + merge, + hd, + tl, + hd_exn, + tl_exn, + findi, + findi_exn, + find_exn, + find_map_exn, + find_mapi, + find_mapi_exn, + append, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + concat_map, + concat_mapi, + map2_exn, + map2, + rev_map3_exn, + rev_map3, + map3_exn, + map3, + rev_map_append, + fold_right, + fold_left, + unzip, + unzip3, + zip, + zip_exn, + mapi, + rev_mapi, + iteri, + foldi, + reduce_exn, + reduce, + reduce_balanced, + reduce_balanced_exn, + group, + groupi, + sort_and_group, + chunks_of, + last, + last_exn, + is_prefix, + is_suffix, + find_consecutive_duplicate, + remove_consecutive_duplicates, + dedup_and_sort, + find_a_dup, + contains_dup, + find_all_dups, + all_equal, + count, + counti, + range$0, + range, + init, + rev_filter_map, + rev_filter_mapi, + filter_map, + filter_mapi, + filter_opt, + [0, + t_of_sexp$0, + sexp_of_t$1, + t_sexp_grammar$0, + add, + find$0, + find_exn$0, + mem$0, + remove, + map$2, + inverse, + group$0, + sort_and_group$0], + sub, + take, + drop, + take_while, + drop_while, + split_while, + drop_last, + drop_last_exn, + concat, + concat_no_order, + cons, + cartesian_product, + permute, + random_element, + random_element_exn, + is_sorted, + is_sorted_strictly, + equal, + Infix, + transpose, + transpose_exn, + intersperse]; + runtime.caml_register_global(54, Base_List, "Base__List"); + return; + } + (globalThis)); + +//# 8248 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = ": ", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$4 = "", + cst$3 = "; ", + cst = cst$5, + cst$0 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + t_sexp_grammar = [0, "Info.t"], + module_name = "Base.Info", + Stdlib_Format = global_data.Stdlib__Format, + Base_Exn = global_data.Base__Exn, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Lazy = global_data.Base__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy, + Assert_failure = global_data.Assert_failure, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_String0 = global_data.Base__String0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + _l_ = [0, "src/info.ml", 204, 6], + _a_ = [0, "Could_not_construct"], + _b_ = [0, "String"], + _c_ = [0, "Exn"], + _d_ = [0, "Sexp"], + _e_ = [0, "Tag_sexp"], + _f_ = [0, "Tag_t"], + _g_ = [0, "Tag_arg"], + _h_ = [0, "Of_list"], + _i_ = [0, "With_backtrace"], + cst_could_not_construct_info = "could not construct info: ", + _j_ = + [0, + [11, "and ", [4, 0, 0, 0, [11, " more info", 0]]], + "and %d more info"], + cst_Backtrace = "\nBacktrace:\n", + cst_Base_Info_Exn = "Base__Info.Exn"; + function sexp_of_t(param){ + switch(param[0]){ + case 0: + var arg0_001 = param[1], res0_002 = caml_call1(Base_Sexp[4], arg0_001); + return [1, [0, _a_, [0, res0_002, 0]]]; + case 1: + var + arg0_003 = param[1], + res0_004 = caml_call1(Base_Import[139], arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + case 2: + var + arg0_005 = param[1], + res0_006 = caml_call1(Base_Import[199], arg0_005); + return [1, [0, _c_, [0, res0_006, 0]]]; + case 3: + var arg0_007 = param[1], res0_008 = caml_call1(Base_Sexp[4], arg0_007); + return [1, [0, _d_, [0, res0_008, 0]]]; + case 4: + var + arg2_011 = param[3], + arg1_010 = param[2], + arg0_009 = param[1], + res0_012 = caml_call1(Base_Import[139], arg0_009), + res1_013 = caml_call1(Base_Sexp[4], arg1_010), + res2_014 = + caml_call2 + (Base_Import[149], Base_Source_code_position0[8], arg2_011); + return [1, [0, _e_, [0, res0_012, [0, res1_013, [0, res2_014, 0]]]]]; + case 5: + var + arg1_016 = param[2], + arg0_015 = param[1], + res0_017 = caml_call1(Base_Import[139], arg0_015), + res1_018 = sexp_of_t(arg1_016); + return [1, [0, _f_, [0, res0_017, [0, res1_018, 0]]]]; + case 6: + var + arg2_021 = param[3], + arg1_020 = param[2], + arg0_019 = param[1], + res0_022 = caml_call1(Base_Import[139], arg0_019), + res1_023 = caml_call1(Base_Sexp[4], arg1_020), + res2_024 = sexp_of_t(arg2_021); + return [1, [0, _g_, [0, res0_022, [0, res1_023, [0, res2_024, 0]]]]]; + case 7: + var + arg1_026 = param[2], + arg0_025 = param[1], + res0_027 = caml_call2(Base_Import[149], Base_Import[142], arg0_025), + res1_028 = caml_call2(Base_Import[152], sexp_of_t, arg1_026); + return [1, [0, _h_, [0, res0_027, [0, res1_028, 0]]]]; + default: + var + arg1_030 = param[2], + arg0_029 = param[1], + res0_031 = sexp_of_t(arg0_029), + res1_032 = caml_call1(Base_Import[139], arg1_030); + return [1, [0, _i_, [0, res0_031, [0, res1_032, 0]]]]; + } + } + function to_strings_hum(t, ac){ + var t$0 = t, ac$0 = ac; + for(;;) + switch(t$0[0]){ + case 0: + var sexp = t$0[1]; + return [0, + cst_could_not_construct_info, + [0, caml_call1(Base_Sexp[16], sexp), ac$0]]; + case 1: + var string = t$0[1]; return [0, string, ac$0]; + case 2: + var exn = t$0[1], _R_ = caml_call1(Base_Exn[1], exn); + return [0, caml_call1(Base_Sexp[16], _R_), ac$0]; + case 3: + var sexp$0 = t$0[1]; + return [0, caml_call1(Base_Sexp[16], sexp$0), ac$0]; + case 4: + var sexp$1 = t$0[2], tag = t$0[1]; + return [0, + tag, + [0, cst, [0, caml_call1(Base_Sexp[16], sexp$1), ac$0]]]; + case 5: + var t$1 = t$0[2], tag$0 = t$0[1]; + return [0, tag$0, [0, cst$0, to_strings_hum(t$1, ac$0)]]; + case 6: + var + t$2 = t$0[3], + sexp$2 = t$0[2], + tag$1 = t$0[1], + _S_ = [0, cst$1, to_strings_hum(t$2, ac$0)], + body = [0, caml_call1(Base_Sexp[16], sexp$2), _S_]; + return 0 === caml_ml_string_length(tag$1) + ? body + : [0, tag$1, [0, cst$2, body]]; + case 7: + var ts = t$0[2], trunc_after = t$0[1]; + if(trunc_after){ + var max = trunc_after[1], n = caml_call1(Base_List[7], ts); + if(n <= max) + var ts$0 = ts; + else + var + _V_ = caml_call2(Base_Import[93], n, max), + _W_ = [0, [1, caml_call2(Base_Printf[2], _j_, _V_)], 0], + _X_ = caml_call2(Base_List[131], ts, max), + ts$0 = caml_call2(Base_Import[111], _X_, _W_); + var ts$1 = ts$0; + } + else + var ts$1 = ts; + var + _T_ = + function(ac, t){ + var ac$0 = caml_call1(Base_List[8], ac) ? ac : [0, cst$3, ac]; + return to_strings_hum(t, ac$0); + }, + _U_ = caml_call1(Base_List[38], ts$1); + return caml_call3(Base_List[10], _U_, ac$0, _T_); + default: + var + backtrace = t$0[2], + t$3 = t$0[1], + ac$1 = [0, cst_Backtrace, [0, backtrace, ac$0]], + t$0 = t$3, + ac$0 = ac$1; + continue; + } + } + function to_sexps_hum(t, ac){ + switch(t[0]){ + case 0: + return [0, sexp_of_t(t), ac]; + case 1: + var string = t[1]; return [0, [0, string], ac]; + case 2: + var exn = t[1]; return [0, caml_call1(Base_Exn[1], exn), ac]; + case 3: + var sexp = t[1]; return [0, sexp, ac]; + case 4: + var here = t[3], sexp$0 = t[2], tag = t[1]; + if(here) + var + here$0 = here[1], + _O_ = [0, caml_call1(Base_Source_code_position0[8], here$0), 0]; + else + var _O_ = 0; + return [0, [1, [0, [0, tag], [0, sexp$0, _O_]]], ac]; + case 5: + var t$0 = t[2], tag$0 = t[1]; + return [0, [1, [0, [0, tag$0], to_sexps_hum(t$0, 0)]], ac]; + case 6: + var + t$1 = t[3], + sexp$1 = t[2], + tag$1 = t[1], + body = [0, sexp$1, to_sexps_hum(t$1, 0)]; + return 0 === caml_ml_string_length(tag$1) + ? [0, [1, body], ac] + : [0, [1, [0, [0, tag$1], body]], ac]; + case 7: + var + ts = t[2], + _P_ = function(ac, t){return to_sexps_hum(t, ac);}, + _Q_ = caml_call1(Base_List[38], ts); + return caml_call3(Base_List[10], _Q_, ac, _P_); + default: + var backtrace = t[2], t$2 = t[1]; + return [0, [1, [0, to_sexp_hum(t$2), [0, [0, backtrace], 0]]], ac]; + } + } + function to_sexp_hum(t){ + var sexps = to_sexps_hum(t, 0); + if(sexps && ! sexps[2]){var sexp = sexps[1]; return sexp;} + return [1, sexps]; + } + function protect(f){ + try{var _N_ = caml_call1(f, 0); return _N_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return [0, caml_call1(Base_Exn[1], exn)]; + } + } + function to_message(info){ + return protect + (function(param){ + var _M_ = caml_obj_tag(info); + if(250 === _M_) return info[1]; + if(246 !== _M_ && 244 !== _M_) return info; + return caml_call1(CamlinternalLazy[2], info); + }); + } + function of_message(t){return [250, t];} + function invariant(param){return 0;} + function sexp_of_t$0(t){return to_sexp_hum(to_message(t));} + function t_of_sexp(sexp){return [246, function(_L_){return [3, sexp];}];} + function compare(t1, t2){ + var _J_ = sexp_of_t$0(t2), _K_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[6], _K_, _J_); + } + function equal(t1, t2){ + var _H_ = sexp_of_t$0(t2), _I_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[5], _I_, _H_); + } + function hash_fold_t(state, t){ + var _G_ = sexp_of_t$0(t); + return caml_call2(Base_Sexp[1], state, _G_); + } + function hash(t){return caml_call3(Base_Hash[14], 0, hash_fold_t, t);} + function to_string_hum(t){ + var message = to_message(t); + if(1 === message[0]){var s = message[1]; return s;} + var _F_ = to_sexp_hum(message); + return caml_call2(Base_Sexp[15], 0, _F_); + } + function to_string_hum_deprecated(t){ + var t$0 = to_message(t), _E_ = to_strings_hum(t$0, 0); + return caml_call2(Base_String0[14], 0, _E_); + } + function to_string_mach(t){ + var _D_ = sexp_of_t$0(t); + return caml_call1(Base_Sexp[16], _D_); + } + function of_lazy(l){ + return [246, + function(_A_){ + return protect + (function(param){ + var _B_ = caml_obj_tag(l); + if(250 === _B_) + var _C_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _B_ && 244 !== _B_){var _C_ = l; switch$0 = 1;} + if(! switch$0) var _C_ = caml_call1(CamlinternalLazy[2], l); + } + return [1, _C_]; + }); + }]; + } + function of_lazy_sexp(l){ + return [246, + function(_x_){ + return protect + (function(param){ + var _y_ = caml_obj_tag(l); + if(250 === _y_) + var _z_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _y_ && 244 !== _y_){var _z_ = l; switch$0 = 1;} + if(! switch$0) var _z_ = caml_call1(CamlinternalLazy[2], l); + } + return [3, _z_]; + }); + }]; + } + function of_lazy_t(lazy_t){return caml_call1(Base_Lazy[13], lazy_t);} + function of_string(message){ + return caml_call1(Base_Lazy[21], [1, message]); + } + function createf(format){ + return caml_call2(Base_Printf[4], of_string, format); + } + function of_thunk(f){ + return [246, + function(_w_){ + return protect(function(param){return [1, caml_call1(f, 0)];}); + }]; + } + function create(here, strict, tag, x, sexp_of_x){ + return strict + ? [250, [4, tag, caml_call1(sexp_of_x, x), here]] + : [246, + function(_v_){ + return protect + (function(param){ + return [4, tag, caml_call1(sexp_of_x, x), here]; + }); + }]; + } + function create_s(sexp){return caml_call1(Base_Lazy[21], [3, sexp]);} + function tag(t, tag){ + return [246, function(param){return [5, tag, to_message(t)];}]; + } + function tag_s_lazy(t, tag){ + return [246, + function(_r_){ + return protect + (function(param){ + var _s_ = to_message(t), _t_ = caml_obj_tag(tag); + if(250 === _t_) + var _u_ = tag[1]; + else{ + var switch$0 = 0; + if(246 !== _t_ && 244 !== _t_){var _u_ = tag; switch$0 = 1;} + if(! switch$0) + var _u_ = caml_call1(CamlinternalLazy[2], tag); + } + return [6, cst$4, _u_, _s_]; + }); + }]; + } + function tag_s(t, tag){ + return tag_s_lazy(t, caml_call1(Base_Lazy[21], tag)); + } + function tag_arg(t, tag, x, sexp_of_x){ + return [246, + function(_p_){ + return protect + (function(param){ + var _q_ = to_message(t); + return [6, tag, caml_call1(sexp_of_x, x), _q_]; + }); + }]; + } + function of_list(trunc_after, ts){ + return [246, + function(param){ + return [7, + trunc_after, + caml_call2(Base_List[76], ts, to_message)]; + }]; + } + var Exn = [248, cst_Base_Info_Exn, runtime.caml_fresh_oo_id(0)]; + function _k_(param){ + if(param[1] !== Exn) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var t = param[2]; + return sexp_of_t$0(t); + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Exn, _k_); + function to_exn(t){ + if(! caml_call1(Base_Lazy[22], t)) return [0, Exn, t]; + var _o_ = caml_obj_tag(t); + if(250 === _o_) + var match = t[1]; + else{ + var switch$0 = 0; + if(246 !== _o_ && 244 !== _o_){var match = t; switch$0 = 1;} + if(! switch$0) var match = caml_call1(CamlinternalLazy[2], t); + } + if(2 !== match[0]) return [0, Exn, t]; + var exn = match[1]; + return exn; + } + function of_exn(backtrace, exn){ + if(backtrace){ + var match = backtrace[1]; + if(typeof match === "number") + var _n_ = [0, caml_call1(Stdlib_Printexc[6], 0)]; + else + var s = match[2], _n_ = [0, s]; + var backtrace$0 = _n_; + } + else + var backtrace$0 = 0; + if(exn[1] === Exn){ + var t = exn[2]; + if(! backtrace$0) return t; + var backtrace$1 = backtrace$0[1]; + return [246, function(param){return [8, to_message(t), backtrace$1];}]; + } + if(! backtrace$0) return caml_call1(Base_Lazy[21], [2, exn]); + var backtrace$2 = backtrace$0[1]; + return [246, + function(param){ + return [8, [3, caml_call1(Base_Exn[1], exn)], backtrace$2]; + }]; + } + function pp(ppf, t){ + var _m_ = to_string_hum(t); + return caml_call2(Stdlib_Format[13], ppf, _m_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Info = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + [0, sexp_of_t, to_message, of_message]]; + runtime.caml_register_global(37, Base_Info, "Base__Info"); + return; + } + (globalThis)); + +//# 8735 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + t_sexp_grammar = [0, "Error.t"], + module_name = "Base.Error", + Base_Info = global_data.Base__Info, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Info[1], + equal = Base_Info[2], + hash_fold_t = Base_Info[3], + hash = Base_Info[4], + t_of_sexp = Base_Info[5], + sexp_of_t = Base_Info[6], + invariant = Base_Info[8], + to_string_hum = Base_Info[9], + to_string_mach = Base_Info[10], + to_string_hum_deprecated = Base_Info[11], + of_string = Base_Info[12], + of_lazy = Base_Info[13], + of_lazy_sexp = Base_Info[14], + of_thunk = Base_Info[15], + of_lazy_t = Base_Info[16], + create = Base_Info[17], + create_s = Base_Info[18], + createf = Base_Info[19], + tag = Base_Info[20], + tag_s = Base_Info[21], + tag_s_lazy = Base_Info[22], + tag_arg = Base_Info[23], + of_list = Base_Info[24], + of_exn = Base_Info[25], + to_exn = Base_Info[26], + pp = Base_Info[27], + Internal_repr = Base_Info[28]; + function raise(t){ + throw caml_maybe_attach_backtrace(caml_call1(to_exn, t), 1); + } + function raise_s(sexp){return raise(caml_call1(create_s, sexp));} + function to_info(t){return t;} + function of_info(t){return t;} + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Error = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + Internal_repr, + raise, + raise_s, + to_info, + of_info]; + runtime.caml_register_global(4, Base_Error, "Base__Error"); + return; + } + (globalThis)); + +//# 8898 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List = global_data.Base__List, + Base_Error = global_data.Base__Error, + Base_With_return = global_data.Base__With_return, + Assert_failure = global_data.Assert_failure, + Base_Result = global_data.Base__Result, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Applicative = global_data.Base__Applicative, + ignore_m = Base_Result[14], + join = Base_Result[13], + return$0 = Base_Result[12], + bind = Base_Result[11], + symbol_bind = Base_Result[7], + _c_ = [0, "src/or_error.ml", 135, 22], + cst_unimplemented = "unimplemented", + _b_ = [0, 3553398], + _a_ = Base_Result[30]; + function compare(cmp_a, a_001, b_002){ + return caml_call4(Base_Result[4], cmp_a, Base_Error[1], a_001, b_002); + } + function equal(cmp_a, a_007, b_008){ + return caml_call4(Base_Result[5], cmp_a, Base_Error[2], a_007, b_008); + } + function hash_fold_t(hash_fold_a, hsv, arg){ + return caml_call4(Base_Result[6], hash_fold_a, Base_Error[3], hsv, arg); + } + function t_of_sexp(of_a_013, x_015){ + return caml_call3(Base_Result[1], of_a_013, Base_Error[5], x_015); + } + function sexp_of_t(of_a_016, x_017){ + return caml_call3(Base_Result[2], of_a_016, Base_Error[6], x_017); + } + function t_sexp_grammar(a_sexp_grammar){ + return caml_call2(Base_Result[3], a_sexp_grammar, Base_Error[7]); + } + function invariant(invariant_a, t){ + if(0 === t[0]){var a = t[1]; return caml_call1(invariant_a, a);} + var error = t[1]; + return caml_call1(Base_Error[8], error); + } + function apply(f, x){ + function _y_(e1, e2){ + return caml_call2(Base_Error[24], 0, [0, e1, [0, e2, 0]]); + } + function _z_(f, x){return caml_call1(f, x);} + return caml_call4(Base_Result[32], f, x, _z_, _y_); + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13], + include$0 = Base_Result[10], + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Open_on_rhs = [0], + ok = Base_Result[23], + is_ok = Base_Result[21], + is_error = Base_Result[22]; + function try_with(opt, f){ + if(opt) var sth = opt[1], backtrace = sth; else var backtrace = 0; + try{var _x_ = [0, caml_call1(f, 0)]; return _x_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), _w_ = backtrace ? _b_ : 0; + return [1, caml_call2(Base_Error[25], _w_, exn)]; + } + } + function try_with_join(backtrace, f){ + return caml_call1(join, try_with(backtrace, f)); + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var err = param[1]; + return caml_call1(Base_Error[29], err); + } + function of_exn(backtrace, exn){ + return [1, caml_call2(Base_Error[25], backtrace, exn)]; + } + function of_exn_result(backtrace, z){ + if(0 === z[0]) return z; + var exn = z[1]; + return of_exn(backtrace, exn); + } + function error(here, strict, message, a, sexp_of_a){ + return [1, + caml_call5(Base_Error[17], here, strict, message, a, sexp_of_a)]; + } + function error_s(sexp){return [1, caml_call1(Base_Error[18], sexp)];} + function error_string(message){ + return [1, caml_call1(Base_Error[12], message)]; + } + function errorf(format){ + return caml_call2(Base_Printf[4], error_string, format); + } + function tag(t, tag){ + var _t_ = Base_Error[20]; + function _u_(_v_){return caml_call2(_t_, _v_, tag);} + return caml_call2(Base_Result[31], t, _u_); + } + function tag_s(t, tag){ + var _q_ = Base_Error[21]; + function _r_(_s_){return caml_call2(_q_, _s_, tag);} + return caml_call2(Base_Result[31], t, _r_); + } + function tag_s_lazy(t, tag){ + var _n_ = Base_Error[22]; + function _o_(_p_){return caml_call2(_n_, _p_, tag);} + return caml_call2(Base_Result[31], t, _o_); + } + function tag_arg(t, message, a, sexp_of_a){ + function _m_(e){ + return caml_call4(Base_Error[23], e, message, a, sexp_of_a); + } + return caml_call2(Base_Result[31], t, _m_); + } + function unimplemented(s){ + return error(0, 0, cst_unimplemented, s, Base_Import[139]); + } + function combine_errors(l){ + var arg = Base_Error[24]; + function _k_(eta){return caml_call2(arg, 0, eta);} + var _l_ = caml_call1(Base_Result[33], l); + return caml_call2(Base_Result[31], _l_, _k_); + } + function combine_errors_unit(l){ + function _i_(param){return 0;} + var _j_ = combine_errors(l); + return caml_call2(Base_Result[30], _j_, _i_); + } + function filter_ok_at_least_one(l){ + var + match = caml_call2(Base_List[57], l, Base_Result[35]), + errs = match[2], + ok = match[1]; + return ok ? [0, ok] : [1, caml_call2(Base_Error[24], 0, errs)]; + } + function find_ok(l){ + var match = caml_call2(Base_List[17], l, Base_Result[23]); + if(match){var x = match[1]; return [0, x];} + function _g_(param){ + if(0 === param[0]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var err = param[1]; + return err; + } + var _h_ = caml_call2(Base_List[76], l, _g_); + return [1, caml_call2(Base_Error[24], 0, _h_)]; + } + function find_map_ok(l, f){ + function _d_(param){ + function _e_(elt){ + var x = caml_call1(f, elt); + if(0 === x[0]) return caml_call1(param, x); + var err = x[1]; + return err; + } + var _f_ = caml_call2(Base_List[76], l, _e_); + return [1, caml_call2(Base_Error[24], 0, _f_)]; + } + return caml_call1(Base_With_return[1], _d_); + } + var + map$1 = Base_Result[30], + iter = Base_Result[28], + iter_error = Base_Result[29], + Base_Or_error = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + invariant, + symbol_bind, + symbol_map, + Base_Result[10], + bind, + return$1, + join, + ignore_m, + all, + all_unit, + [0, + return$1, + symbol_bind$0, + symbol_map$0, + [0, return$1, bind, map$0, both, Open_on_rhs]], + is_ok, + is_error, + try_with, + try_with_join, + ok, + ok_exn, + of_exn, + of_exn_result, + error, + error_s, + error_string, + errorf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + unimplemented, + map$1, + iter, + iter_error, + combine_errors, + combine_errors_unit, + filter_ok_at_least_one, + find_ok, + find_map_ok]; + runtime.caml_register_global(11, Base_Or_error, "Base__Or_error"); + return; + } + (globalThis)); + +//# 9171 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Neg = "Neg", + cst_Pos = "Pos", + cst_Zero = "Zero", + cst_neg = "neg", + cst_pos = "pos", + cst_zero = "zero", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_003 = "sign0.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Neg, 0]], + [0, [1, [0, cst_Zero, 0]], [0, [1, [0, cst_Pos, 0]], 0]]]]], + all = [0, 0, [0, 1, [0, 2, 0]]], + module_name = "Base.Sign", + Base_Import = global_data.Base__Import, + Base_Poly0 = global_data.Base__Poly0, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + _a_ = [0, cst_Neg], + _b_ = [0, cst_Zero], + _c_ = [0, cst_Pos]; + function t_of_sexp(sexp_004){ + if(0 === sexp_004[0]){ + var _e_ = sexp_004[1], switch$0 = 0; + if(caml_string_notequal(_e_, cst_Neg)){ + var switch$1 = 0; + if(caml_string_notequal(_e_, cst_Pos)){ + var switch$2 = 0; + if(caml_string_notequal(_e_, cst_Zero)){ + if(caml_string_notequal(_e_, cst_neg)) + if(caml_string_notequal(_e_, cst_pos)) + if(caml_string_notequal(_e_, cst_zero)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 1; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 0; + } + else{ + var _f_ = sexp_004[1]; + if(! _f_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_003, sexp_004); + var _g_ = _f_[1]; + if(0 !== _g_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_003, sexp_004); + var _h_ = _g_[1], switch$3 = 0; + if(caml_string_notequal(_h_, cst_Neg)){ + var switch$4 = 0; + if(caml_string_notequal(_h_, cst_Pos)){ + var switch$5 = 0; + if(caml_string_notequal(_h_, cst_Zero)){ + if(caml_string_notequal(_h_, cst_neg)) + if(caml_string_notequal(_h_, cst_pos)) + if(caml_string_notequal(_h_, cst_zero)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_003, sexp_004); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + var compare = caml_int_compare; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function symbol(x, y){return x < y ? 1 : 0;} + function symbol$0(x, y){return x <= y ? 1 : 0;} + function symbol$1(x, y){return x !== y ? 1 : 0;} + function symbol$2(x, y){return x === y ? 1 : 0;} + function symbol$3(x, y){return y < x ? 1 : 0;} + function symbol$4(x, y){return y <= x ? 1 : 0;} + function ascending(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare; + function equal(x, y){return x === y ? 1 : 0;} + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Replace_polymorphic_compare = + [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + ascending, + descending, + compare$0, + equal, + max, + min]; + function of_string(s){return t_of_sexp(caml_call1(Base_Import[139], s));} + function to_string(t){ + var _d_ = sexp_of_t(t); + return caml_call1(Base_Import[163], _d_); + } + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + var + Base_Sign0 = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + all, + Replace_polymorphic_compare, + of_string, + to_string, + to_int, + to_int, + module_name, + of_int]; + runtime.caml_register_global(23, Base_Sign0, "Base__Sign0"); + return; + } + (globalThis)); + +//# 9355 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Comparable_intf = [0]; + runtime.caml_register_global + (0, Base_Comparable_intf, "Base__Comparable_intf"); + return; + } + (globalThis)); + +//# 9366 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_clamp_requires_min_max$1 = "clamp requires [min <= max]", + cst_max$1 = "max", + cst_min$1 = "min", + cst_src_comparable_ml = "src/comparable.ml", + caml_compare = runtime.caml_compare, + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparator = global_data.Base__Comparator, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Poly0 = global_data.Base__Poly0, + Base_Sign0 = global_data.Base__Sign0, + cst_max$0 = cst_max$1, + cst_min$0 = cst_min$1, + cst_clamp_requires_min_max$0 = cst_clamp_requires_min_max$1, + _b_ = [0, cst_src_comparable_ml, 133, 4], + cst_max = cst_max$1, + cst_min = cst_min$1, + cst_clamp_requires_min_max = cst_clamp_requires_min_max$1, + _a_ = [0, cst_src_comparable_ml, 47, 4]; + function geq(cmp, a, b){return 0 <= caml_call2(cmp, a, b) ? 1 : 0;} + function leq(cmp, a, b){return caml_call2(cmp, a, b) <= 0 ? 1 : 0;} + function equal(cmp, a, b){return 0 === caml_call2(cmp, a, b) ? 1 : 0;} + function min(cmp, t$0, t){return leq(cmp, t$0, t) ? t$0 : t;} + function max(cmp, t$0, t){return geq(cmp, t$0, t) ? t$0 : t;} + function Infix(T){ + function symbol(a, b){ + var cmp = T[1]; + return 0 < caml_call2(cmp, a, b) ? 1 : 0; + } + function symbol$0(a, b){ + var cmp = T[1]; + return caml_call2(cmp, a, b) < 0 ? 1 : 0; + } + function symbol$1(a, b){return geq(T[1], a, b);} + function symbol$2(a, b){return leq(T[1], a, b);} + function symbol$3(a, b){return equal(T[1], a, b);} + function symbol$4(a, b){ + var cmp = T[1]; + return 0 !== caml_call2(cmp, a, b) ? 1 : 0; + } + return [0, symbol$1, symbol$2, symbol$3, symbol, symbol$0, symbol$4]; + } + function Polymorphic_compare(T){ + var + include = Infix(T), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + compare = T[1]; + function min$0(t$0, t){return min(compare, t$0, t);} + function max$0(t$0, t){return max(compare, t$0, t);} + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$1, + compare, + min$0, + max$0]; + } + function Make_using_comparator(T){ + var + sexp_of_t = T[1], + comparator = T[2], + compare = comparator[1], + Replace_polymorphic_compare = Polymorphic_compare([0, compare]), + symbol = Replace_polymorphic_compare[1], + symbol$0 = Replace_polymorphic_compare[2], + symbol$1 = Replace_polymorphic_compare[3], + symbol$2 = Replace_polymorphic_compare[4], + symbol$3 = Replace_polymorphic_compare[5], + symbol$4 = Replace_polymorphic_compare[6], + equal = Replace_polymorphic_compare[7], + compare$0 = Replace_polymorphic_compare[8], + min = Replace_polymorphic_compare[9], + max = Replace_polymorphic_compare[10]; + function descending(t$0, t){return caml_call2(compare$0, t, t$0);} + function between(t, low, high){ + var _s_ = caml_call2(symbol$0, low, t); + return _s_ ? caml_call2(symbol$0, t, high) : _s_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(symbol$3, t, min) + ? min + : caml_call2(symbol$0, t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(symbol$0, min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(symbol$2, min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _p_ = [0, [0, cst_max$0, caml_call1(sexp_of_t, max)], 0], + _q_ = [0, [0, cst_min$0, caml_call1(sexp_of_t, min)], _p_], + _r_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max$0, _q_); + return caml_call1(Base_Or_error[35], _r_); + } + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + compare$0, + descending, + between, + clamp_exn, + clamp, + comparator]; + } + function Make(T){ + var + sexp_of_t = T[2], + include = caml_call1(Base_Comparator[5], T), + comparator = include[1]; + return Make_using_comparator([0, sexp_of_t, comparator]); + } + function Inherit(C, T){ + var sexp_of_t = T[1]; + function compare(t$0, t){ + var _n_ = caml_call1(T[2], t), _o_ = caml_call1(T[2], t$0); + return caml_call2(C[1], _o_, _n_); + } + return Make([0, compare, sexp_of_t]); + } + function lexicographic(cmps, x, y){ + var param = cmps; + for(;;){ + if(! param) return 0; + var cmps$0 = param[2], cmp = param[1], res = caml_call2(cmp, x, y); + if(0 !== res) return res; + var param = cmps$0; + } + } + function lift(cmp, f, x, y){ + var _m_ = caml_call1(f, y); + return caml_call2(cmp, caml_call1(f, x), _m_); + } + function reverse(cmp, x, y){return caml_call2(cmp, y, x);} + function _c_(_i_){ + var _j_ = _i_[3], _k_ = _i_[1]; + function is_positive(t){return 0 < caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_non_negative(t){return 0 <= caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_negative(t){return caml_call2(_k_, t, _j_) < 0 ? 1 : 0;} + function is_non_positive(t){return caml_call2(_k_, t, _j_) <= 0 ? 1 : 0;} + function sign(t){ + var _l_ = caml_call2(_k_, t, _j_); + return caml_call1(Base_Sign0[13], _l_); + } + return [0, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign]; + } + var + Base_Comparable = + [0, + lexicographic, + lift, + reverse, + equal, + max, + min, + Infix, + Polymorphic_compare, + Inherit, + Make, + Make_using_comparator, + function(T){ + var + sexp_of_t = T[1], + ascending = Base_Poly0[1], + descending = Base_Poly0[2], + min = Base_Poly0[3], + max = Base_Poly0[4]; + function between(t, low, high){ + var + _g_ = caml_lessequal(low, t), + _h_ = _g_ ? caml_lessequal(t, high) : _g_; + return _h_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _d_ = [0, [0, cst_max, caml_call1(T[1], max)], 0], + _e_ = [0, [0, cst_min, caml_call1(T[1], min)], _d_], + _f_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _e_); + return caml_call1(Base_Or_error[35], _f_); + } + var + include = + caml_call1(Base_Comparator[5], [0, caml_compare, sexp_of_t]), + comparator = include[1]; + return [0, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + caml_equal, + caml_compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + }, + _c_]; + runtime.caml_register_global(14, Base_Comparable, "Base__Comparable"); + return; + } + (globalThis)); + +//# 9715 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Identifiable_intf = [0]; + runtime.caml_register_global + (0, Base_Identifiable_intf, "Base__Identifiable_intf"); + return; + } + (globalThis)); + +//# 9726 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer; + function _a_(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _c_ = caml_call1(Base_Comparable[11], [0, T[5], T[9]]), + symbol = _c_[1], + symbol$0 = _c_[2], + symbol$1 = _c_[3], + symbol$2 = _c_[4], + symbol$3 = _c_[5], + symbol$4 = _c_[6], + equal = _c_[7], + compare = _c_[8], + min = _c_[9], + max = _c_[10], + ascending = _c_[11], + descending = _c_[12], + between = _c_[13], + clamp_exn = _c_[14], + clamp = _c_[15], + comparator = _c_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + } + var + Base_Identifiable = + [0, + function(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _b_ = caml_call1(Base_Comparable[10], [0, T[1], T[5]]), + symbol = _b_[1], + symbol$0 = _b_[2], + symbol$1 = _b_[3], + symbol$2 = _b_[4], + symbol$3 = _b_[5], + symbol$4 = _b_[6], + equal = _b_[7], + compare = _b_[8], + min = _b_[9], + max = _b_[10], + ascending = _b_[11], + descending = _b_[12], + between = _b_[13], + clamp_exn = _b_[14], + clamp = _b_[15], + comparator = _b_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + }, + _a_]; + runtime.caml_register_global(2, Base_Identifiable, "Base__Identifiable"); + return; + } + (globalThis)); + +//# 9858 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$0 = "()"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + all = [0, 0, 0], + module_name = "Base.Unit", + Base_Import = global_data.Base__Import, + Base_Identifiable = global_data.Base__Identifiable, + hash_fold_t = Base_Import[211], + func = Base_Import[225], + cst_Base_Unit_of_string_expect = "Base.Unit.of_string: () expected"; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[161], + sexp_of_t = Base_Import[137], + t_sexp_grammar = Base_Import[181]; + function compare(param, _a_){return 0;} + function of_string(param){ + return runtime.caml_string_notequal(param, cst$0) + ? caml_call1(Base_Import[124], cst_Base_Unit_of_string_expect) + : 0; + } + function to_string(param){return cst;} + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + symbol = include[7], + symbol$0 = include[8], + symbol$1 = include[9], + symbol$2 = include[10], + symbol$3 = include[11], + symbol$4 = include[12], + equal = include[13], + compare$0 = include[14], + min = include[15], + max = include[16], + ascending = include[17], + descending = include[18], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + pp = include[23], + hashable = include[24]; + function invariant(param){return 0;} + var + Base_Unit = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant]; + runtime.caml_register_global(7, Base_Unit, "Base__Unit"); + return; + } + (globalThis)); + +//# 9964 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Base_Or_error = global_data.Base__Or_error, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + get_pos_len_exn = Base_Ordered_collection_common[1], + check_pos_len_exn = Base_Ordered_collection_common[2], + Private = Base_Ordered_collection_common[3]; + function get_pos_len(pos, len, param, total_length){ + try{ + var _a_ = [0, caml_call4(get_pos_len_exn, pos, len, 0, total_length)]; + return _a_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exn, 0); + var s = exn[2]; + return caml_call1(Base_Or_error[36], s); + } + } + var + Base_Ordered_collection_common$0 = + [0, get_pos_len_exn, check_pos_len_exn, Private, get_pos_len]; + runtime.caml_register_global + (3, Base_Ordered_collection_common$0, "Base__Ordered_collection_common"); + return; + } + (globalThis)); + +//# 10013 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Fn = global_data.Base__Fn; + function find_first_satisfying(pos, len, t, get, length, pred){ + var + _e_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _e_), + len$0 = match[2], + pos$0 = match[1], + _f_ = caml_call2(Base_Import[91], pos$0, len$0), + hi$0 = caml_call2(Base_Import[93], _f_, 1), + lo$1 = pos$0, + hi = hi$0; + for(;;){ + if(8 < caml_call2(Base_Import[93], hi, lo$1)){ + var + _c_ = caml_call2(Base_Import[93], hi, lo$1), + _d_ = caml_call2(Base_Import[95], _c_, 2), + mid = caml_call2(Base_Import[91], lo$1, _d_); + if(caml_call1(pred, caml_call2(get, t, mid))){var hi = mid; continue;} + var lo$2 = caml_call2(Base_Import[91], mid, 1), lo$1 = lo$2; + continue; + } + var lo = lo$1; + for(;;){ + if(hi < lo) return 0; + if(caml_call1(pred, caml_call2(get, t, lo))) return [0, lo]; + var lo$0 = caml_call2(Base_Import[91], lo, 1), lo = lo$0; + } + } + } + function find_last_satisfying(pos, len, t, pred, get, length){ + var + _a_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _a_), + len$0 = match[2], + pos$0 = match[1]; + if(0 === len$0) return 0; + var + match$0 = + find_first_satisfying + ([0, pos$0], [0, len$0], t, get, length, caml_call1(Base_Fn[2], pred)); + if(match$0){ + var i = match$0[1]; + return i === pos$0 ? 0 : [0, caml_call2(Base_Import[93], i, 1)]; + } + var _b_ = caml_call2(Base_Import[91], pos$0, len$0); + return [0, caml_call2(Base_Import[93], _b_, 1)]; + } + function binary_search(pos, len, t, length, get, compare, how, v){ + if(-839473056 <= how) + return 200870407 <= how + ? 926943384 + <= how + ? find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}) + : find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) < 0 ? 1 : 0;}, + get, + length) + : -253007807 + <= how + ? find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length) + : find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 < caml_call2(compare, x, v) ? 1 : 0;}); + if(-1055410545 <= how){ + var + match = + find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length); + if(match){ + var x = match[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x), v)) return [0, x]; + } + return 0; + } + var + match$0 = + find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}); + if(match$0){ + var x$0 = match$0[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x$0), v)) + return [0, x$0]; + } + return 0; + } + function binary_search_segmented(pos, len, t, length, get, segment_of, how){ + function is_left(x){ + return 847852583 <= caml_call1(segment_of, x) ? 1 : 0; + } + function is_right(x){return 1 - is_left(x);} + return 125585502 <= how + ? find_last_satisfying(pos, len, t, is_left, get, length) + : find_first_satisfying(pos, len, t, get, length, is_right); + } + var Base_Binary_search = [0, binary_search, binary_search_segmented]; + runtime.caml_register_global(3, Base_Binary_search, "Base__Binary_search"); + return; + } + (globalThis)); + +//# 10167 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + all = + [0, + 200870407, + [0, + -253007807, + [0, -1055410545, [0, -1056898635, [0, 926943384, [0, -839473056, 0]]]]]], + all$0 = [0, 125585502, [0, -63348021, 0]], + Which_target_by_key = [0, all], + Which_target_by_segment = [0, all$0], + Base_Binary_searchable_intf = + [0, Which_target_by_key, Which_target_by_segment]; + runtime.caml_register_global + (2, Base_Binary_searchable_intf, "Base__Binary_searchable_intf"); + return; + } + (globalThis)); + +//# 10190 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Binary_search = global_data.Base__Binary_search; + function Make_gen(T){ + var get = T[1], length = T[2]; + function binary_search(pos, len, t, compare, how, v){ + return caml_call8 + (Base_Binary_search[1], + pos, + len, + t, + length, + get, + compare, + how, + v); + } + function binary_search_segmented(pos, len, t, segment_of, how){ + return caml_call7 + (Base_Binary_search[2], + pos, + len, + t, + length, + get, + segment_of, + how); + } + return [0, get, length, binary_search, binary_search_segmented]; + } + function _a_(T){ + var get = T[1], length = T[2], _c_ = Make_gen([0, get, length]); + return [0, _c_[3], _c_[4]]; + } + var + Base_Binary_searchable = + [0, + function(T){ + var get = T[1], length = T[2], _b_ = Make_gen([0, get, length]); + return [0, _b_[3], _b_[4]]; + }, + _a_]; + runtime.caml_register_global + (1, Base_Binary_searchable, "Base__Binary_searchable"); + return; + } + (globalThis)); + +//# 10253 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Blit_intf = [0]; + runtime.caml_register_global(0, Base_Blit_intf, "Base__Blit_intf"); + return; + } + (globalThis)); + +//# 10263 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common; + function Make_gen(Src, Dst){ + var unsafe_blit = Dst[3]; + function blit(src, src_pos, dst, dst_pos, len){ + var _q_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], src_pos, len, _q_); + var _r_ = caml_call1(Dst[1], dst); + caml_call3(Base_Ordered_collection_common[2], dst_pos, len, _r_); + var _s_ = 0 < len ? 1 : 0; + return _s_ + ? caml_call5(unsafe_blit, src, src_pos, dst, dst_pos, len) + : _s_; + } + function blito(src, opt, _o_, dst, _n_, param){ + if(opt) var sth = opt[1], src_pos = sth; else var src_pos = 0; + if(_o_) + var sth$0 = _o_[1], src_len = sth$0; + else + var + _p_ = caml_call1(Src[1], src), + src_len = caml_call2(Base_Import[93], _p_, src_pos); + if(_n_) var sth$1 = _n_[1], dst_pos = sth$1; else var dst_pos = 0; + return blit(src, src_pos, dst, dst_pos, src_len); + } + function sub(src, pos, len){ + var _m_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], pos, len, _m_); + var dst = caml_call2(Dst[2], len, src); + if(0 < len) caml_call5(unsafe_blit, src, pos, dst, 0, len); + return dst; + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var + _l_ = caml_call1(Src[1], src), + i$0 = caml_call2(Base_Import[93], _l_, pos); + return sub(src, pos, i$0); + } + return [0, unsafe_blit, blit, blito, sub, subo]; + } + function Make_to_string(T, To_bytes){ + function sub(src, pos, len){ + var _k_ = caml_call3(To_bytes[4], src, pos, len); + return caml_call1(Base_Bytes0[16], _k_); + } + function subo(pos, len, src){ + var _j_ = caml_call3(To_bytes[5], pos, len, src); + return caml_call1(Base_Bytes0[16], _j_); + } + return [0, sub, subo]; + } + function _a_(_h_){ + var _i_ = Make_gen([0, _h_[2]], [0, _h_[2], _h_[1], _h_[3]]); + return [0, _i_[2], _i_[3], _i_[1], _i_[4], _i_[5]]; + } + function _b_(_e_){ + var _f_ = [0, _e_[2], _e_[1], _e_[3]], _g_ = Make_gen([0, _f_[1]], _f_); + return [0, _g_[2], _g_[3], _g_[1], _g_[4], _g_[5]]; + } + function _c_(Src, Dst){ + var length = Dst[1]; + function create_like(len, param){return caml_call1(Dst[2], len);} + var + unsafe_blit = Dst[3], + length$0 = Src[1], + _d_ = Make_gen([0, length$0], [0, length, create_like, unsafe_blit]); + return [0, _d_[2], _d_[3], _d_[1], _d_[4], _d_[5]]; + } + var + Base_Blit = + [0, + function(Sequence){ + function create_like(len, param){return caml_call1(Sequence[2], len);} + var + length = Sequence[1], + unsafe_blit = Sequence[3], + include = + Make_gen([0, length], [0, length, create_like, unsafe_blit]), + unsafe_blit$0 = include[1], + blit = include[2], + blito = include[3], + sub = include[4], + subo = include[5]; + return [0, blit, blito, unsafe_blit$0, sub, subo]; + }, + _c_, + Make_to_string, + _b_, + _a_]; + runtime.caml_register_global(3, Base_Blit, "Base__Blit"); + return; + } + (globalThis)); + +//# 10400 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Container = global_data.Base__Container, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_Error = global_data.Base__Error, + Base_Import = global_data.Base__Import, + Base_Monad = global_data.Base__Monad, + Base_Applicative = global_data.Base__Applicative, + compare = Base_Import[237], + hash_fold_t = Base_Import[212], + t_of_sexp = Base_Import[173], + sexp_of_t = Base_Import[149], + cst_Option_value_exn = "Option.value_exn", + cst_Option_value_exn_None = "Option.value_exn None"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[194], a_sexp_grammar); + } + function is_none(param){return param ? 0 : 1;} + function is_some(param){return param ? 1 : 0;} + function value_map(o, default$0, f){ + if(! o) return default$0; + var x = o[1]; + return caml_call1(f, x); + } + function iter(o, f){ + if(! o) return 0; + var a = o[1]; + return caml_call1(f, a); + } + function invariant(f, t){return iter(t, f);} + function call(x, f){ + if(! f) return 0; + var f$0 = f[1]; + return caml_call1(f$0, x); + } + function value(t, default$0){ + if(! t) return default$0; + var x = t[1]; + return x; + } + function value_exn(here, error, message, t){ + if(t){var x = t[1]; return x;} + if(here){ + var p = here[1]; + if(error) + var + e = error[1], + _g_ = + caml_call2 + (Base_Import[150], Base_Error[6], Base_Source_code_position0[8]), + _h_ = value(message, cst), + _i_ = caml_call5(Base_Error[17], 0, 0, _h_, [0, e, p], _g_); + else if(message) + var + m = message[1], + _i_ = + caml_call5(Base_Error[17], 0, 0, m, p, Base_Source_code_position0[8]); + else + var + _i_ = + caml_call5 + (Base_Error[17], + 0, + 0, + cst_Option_value_exn, + p, + Base_Source_code_position0[8]); + var error$0 = _i_; + } + else if(error){ + var e$0 = error[1]; + if(message) + var m$0 = message[1], _j_ = caml_call2(Base_Error[20], e$0, m$0); + else + var _j_ = e$0; + var error$0 = _j_; + } + else if(message) + var m$1 = message[1], error$0 = caml_call1(Base_Error[12], m$1); + else + var error$0 = caml_call1(Base_Error[12], cst_Option_value_exn_None); + return caml_call1(Base_Error[29], error$0); + } + function value_or_thunk(o, default$0){ + if(! o) return caml_call1(default$0, 0); + var x = o[1]; + return x; + } + function to_array(t){if(! t) return [0]; var x = t[1]; return [0, x];} + function to_list(t){if(! t) return 0; var x = t[1]; return [0, x, 0];} + function min_elt(t, param){return t;} + function max_elt(t, param){return t;} + function sum(M){return function(t, f){return value_map(t, M[1], f);};} + function for_all(t, f){ + if(! t) return 1; + var x = t[1]; + return caml_call1(f, x); + } + function exists(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x); + } + function mem(t, a, equal){ + if(! t) return 0; + var a$0 = t[1]; + return caml_call2(equal, a, a$0); + } + function length(t){return t ? 1 : 0;} + function fold(t, init, f){ + if(! t) return init; + var x = t[1]; + return caml_call2(f, init, x); + } + function count(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a) ? 1 : 0; + } + function find(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x) ? t : 0; + } + function find_map(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a); + } + function equal(f, t$0, t){ + if(t$0){ + if(t){var x = t[1], x$0 = t$0[1]; return caml_call2(f, x$0, x);} + } + else if(! t) return 1; + return 0; + } + function some(x){return [0, x];} + function first_some(x, y){return x ? x : y;} + function some_if(cond, x){return cond ? [0, x] : 0;} + function merge(a, b, f){ + if(a){ + if(b){var b$0 = b[1], a$0 = a[1]; return [0, caml_call2(f, a$0, b$0)];} + var x = a; + } + else + var x = b; + return x; + } + function filter(t, f){ + if(t){var v = t[1]; if(caml_call1(f, v)) return t;} + return 0; + } + function try_with(f){ + try{var x = caml_call1(f, 0);}catch(_f_){return 0;} + return [0, x]; + } + function try_with_join(f){ + try{var x = caml_call1(f, 0); return x;}catch(_e_){return 0;} + } + function _a_(t, f){ + if(! t) return 0; + var a = t[1]; + return [0, caml_call1(f, a)]; + } + function apply(f, x){if(! f) return 0; var f$0 = f[1]; return _a_(x, f$0);} + function return$0(x){return [0, x];} + var map = [0, -198771759, _a_]; + function bind(o, f){ + if(! o) return 0; + var x = o[1]; + return caml_call1(f, x); + } + var + _b_ = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = _b_[1], + Monad_infix = _b_[3], + bind$0 = _b_[4], + join = _b_[7], + ignore_m = _b_[8], + Let_syntax = _b_[11], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _c_ = caml_call3(Base_Container[9], fold, init, f); + return function(_d_){return caml_call2(_c_, _d_, t);}; + } + var + Base_Option = + [0, + compare, + hash_fold_t, + t_sexp_grammar, + equal, + invariant, + t_of_sexp, + sexp_of_t, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + value, + value_exn, + value_map, + value_or_thunk, + fold, + mem, + length, + iter, + exists, + for_all, + find, + find_map, + to_list, + to_array, + call, + merge, + filter, + try_with, + try_with_join, + some, + first_some, + some_if, + is_none, + is_some, + is_none, + fold_result, + fold_until, + min_elt, + max_elt, + count, + sum]; + runtime.caml_register_global(9, Base_Option, "Base__Option"); + return; + } + (globalThis)); + +//# 10698 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + cst_Sexpable_Of_stringable_t_o = + "Sexpable.Of_stringable.t_of_sexp expected an atom, but got a list"; + function Of_sexpable(Sexpable, M){ + function t_of_sexp(sexp){ + var s = caml_call1(Sexpable[1], sexp); + try{var _i_ = caml_call1(M[2], s); return _i_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){ + var _h_ = caml_call1(M[1], t); + return caml_call1(Sexpable[2], _h_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable1(Sexpable, M){ + function t_of_sexp(a_of_sexp, sexp){ + var s = caml_call2(Sexpable[1], a_of_sexp, sexp); + try{var _g_ = caml_call1(M[2], s); return _g_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, t){ + var _f_ = caml_call1(M[1], t); + return caml_call2(Sexpable[2], sexp_of_a, _f_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable2(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, sexp){ + var s = caml_call3(Sexpable[1], a_of_sexp, b_of_sexp, sexp); + try{var _e_ = caml_call1(M[2], s); return _e_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, t){ + var _d_ = caml_call1(M[1], t); + return caml_call3(Sexpable[2], sexp_of_a, sexp_of_b, _d_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable3(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + var s = caml_call4(Sexpable[1], a_of_sexp, b_of_sexp, c_of_sexp, sexp); + try{var _c_ = caml_call1(M[2], s); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, sexp_of_c, t){ + var _b_ = caml_call1(M[1], t); + return caml_call4(Sexpable[2], sexp_of_a, sexp_of_b, sexp_of_c, _b_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_stringable(M){ + function t_of_sexp(sexp){ + if(0 !== sexp[0]) + return caml_call2 + (Base_Import[159], cst_Sexpable_Of_stringable_t_o, sexp); + var s = sexp[1]; + try{var _a_ = caml_call1(M[1], s); return _a_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){return [0, caml_call1(M[2], t)];} + return [0, t_of_sexp, sexp_of_t]; + } + var + Base_Sexpable = + [0, + Of_sexpable, + Of_sexpable1, + Of_sexpable2, + Of_sexpable3, + Of_stringable]; + runtime.caml_register_global(2, Base_Sexpable, "Base__Sexpable"); + return; + } + (globalThis)); + +//# 11151 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Indexed_container_intf = [0]; + runtime.caml_register_global + (0, Base_Indexed_container_intf, "Base__Indexed_container_intf"); + return; + } + (globalThis)); + +//# 11162 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Container = global_data.Base__Container, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iteri(fold, t, f){ + caml_call3 + (fold, t, 0, function(i, x){caml_call2(f, i, x); return i + 1 | 0;}); + return 0; + } + function foldi(fold, t, init, f){ + var i = [0, 0]; + return caml_call3 + (fold, + t, + init, + function(acc, v){ + var acc$0 = caml_call3(f, i[1], acc, v); + i[1] = i[1] + 1 | 0; + return acc$0; + }); + } + function counti(foldi, t, f){ + return caml_call3 + (foldi, + t, + 0, + function(i, n, a){return caml_call2(f, i, a) ? n + 1 | 0 : n;}); + } + function existsi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _d_ = caml_call2(f, i, x); + return _d_ ? caml_call1(r, 1) : _d_; + }); + return 0; + }); + } + function for_alli(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _c_ = 1 - caml_call2(f, i, x); + return _c_ ? caml_call1(r, 0) : _c_; + }); + return 1; + }); + } + function find_mapi(iteri, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + t, + function(i, x){ + var res = caml_call2(f, i, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function findi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _b_ = caml_call2(f, i, x); + return _b_ ? caml_call1(r, [0, [0, i, x]]) : _b_; + }); + return 0; + }); + } + function Make_gen(T){ + var + include = caml_call1(Base_Container[18], [0, T[1], T[2], T[3]]), + length = include[1], + is_empty = include[2], + iter = include[3], + fold = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + match = T[4]; + if(typeof match === "number") + var iteri$0 = function(t, f){return iteri(fold, t, f);}; + else + var iteri$1 = match[2], iteri$0 = iteri$1; + var match$0 = T[5]; + if(typeof match$0 === "number") + var foldi$0 = function(t, init, f){return foldi(fold, t, init, f);}; + else + var foldi$1 = match$0[2], foldi$0 = foldi$1; + function counti$0(t, f){return counti(foldi$0, t, f);} + function existsi$0(t, f){return existsi(iteri$0, t, f);} + function for_alli$0(t, f){return for_alli(iteri$0, t, f);} + function find_mapi$0(t, f){return find_mapi(iteri$0, t, f);} + function findi$0(t, f){return findi(iteri$0, t, f);} + return [0, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi$0, + for_alli$0, + counti$0, + findi$0, + find_mapi$0]; + } + function _a_(T){ + var + C = caml_call1(Base_Container[17], [0, T[1], T[2], T[3], T[4]]), + mem = C[1], + fold = T[2], + iter = T[3], + length = T[4], + iteri = T[5], + foldi = T[6], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + } + var + Base_Indexed_container = + [0, + foldi, + iteri, + counti, + existsi, + for_alli, + findi, + find_mapi, + function(T){ + var + C = caml_call1(Base_Container[16], [0, T[1], T[2], T[3]]), + mem = C[1], + fold = T[1], + iter = T[2], + length = T[3], + iteri = T[4], + foldi = T[5], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + }, + _a_, + Make_gen]; + runtime.caml_register_global + (2, Base_Indexed_container, "Base__Indexed_container"); + return; + } + (globalThis)); + +//# 11463 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Both$0 = "Both", + cst_Left$0 = "Left", + cst_Right$0 = "Right", + cst_Sequence_nth$1 = "Sequence.nth", + cst_both = "both", + cst_left = "left", + cst_right = "right", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_025 = "sequence.ml.Merge_with_duplicates_element.t", + Base_List1 = global_data.Base__List1, + Base_With_return = global_data.Base__With_return, + Base_Import = global_data.Base__Import, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Result = global_data.Base__Result, + Base_Container = global_data.Base__Container, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + Base_Monad = global_data.Base__Monad, + _j_ = [0, 0], + cst_Sequence_cycle_list_exn = "Sequence.cycle_list_exn", + cst_Sequence_drop = "Sequence.drop", + cst_Sequence_take = "Sequence.take", + cst_Sequence_sub = "Sequence.sub", + cst_Sequence_reduce_exn = "Sequence.reduce_exn", + cst_Sequence_find_exn = "Sequence.find_exn", + cst_Sequence_chunks_exn = "Sequence.chunks_exn", + cst_Sequence_tl_exn = "Sequence.tl_exn", + cst_hd_exn = "hd_exn", + cst_Both = cst_Both$0, + cst_Right = cst_Right$0, + cst_Left = cst_Left$0, + _g_ = [0, cst_Left$0], + _h_ = [0, cst_Right$0], + _i_ = [0, cst_Both$0], + cst_Sequence_nth$0 = cst_Sequence_nth$1, + cst_Sequence_nth = cst_Sequence_nth$1, + _f_ = [0, "src/sequence.ml", 259, 14], + _e_ = [0, 0, 0], + _a_ = [0, "Done"], + _b_ = [0, "Skip"], + _c_ = [0, "Yield"]; + function sexp_of_t(of_a_001, of_s_002, param){ + if(typeof param === "number") return _a_; + if(0 === param[0]){ + var arg0_003 = param[1], res0_004 = caml_call1(of_s_002, arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + } + var + arg1_006 = param[2], + arg0_005 = param[1], + res0_007 = caml_call1(of_a_001, arg0_005), + res1_008 = caml_call1(of_s_002, arg1_006); + return [1, [0, _c_, [0, res0_007, [0, res1_008, 0]]]]; + } + var Step = [0, sexp_of_t]; + function next_step(param){ + var f = param[2], s = param[1], match = caml_call1(f, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, s$0, f]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, s$1, f]]; + } + function delayed_fold_step(s, init, f, finish){ + function loop(s, next, finish, f, acc){ + var match = caml_call1(next, s); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){ + var s$0 = match[1]; + return caml_call3 + (f, + acc, + 0, + function(_Z_){return loop(s$0, next, finish, f, _Z_);}); + } + var s$1 = match[2], a = match[1]; + return caml_call3 + (f, + acc, + [0, a], + function(_Y_){return loop(s$1, next, finish, f, _Y_);}); + } + var next = s[2], s$0 = s[1]; + return loop(s$0, next, finish, f, init); + } + var Expert = [0, next_step, delayed_fold_step]; + function unfold_step(init, f){return [0, init, f];} + function unfold(init, f){ + return [0, + init, + function(s){ + var match = caml_call1(f, s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [1, a, s$0]; + }]; + } + function unfold_with(s, init, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, init, s$0], + function(param){ + var s = param[2], seed = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, seed, s$0]]; + } + var + s$1 = match[2], + a = match[1], + match$0 = caml_call2(f, seed, a); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var seed$0 = match$0[1]; + return [0, [0, seed$0, s$1]]; + } + var seed$1 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, seed$1, s$1]]; + }]; + } + function unfold_with_and_finish + (s, init, running_step, inner_finished, finishing_step){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -172306698, [0, init, s$0]], + function(state){ + if(301075099 <= state[1]){ + var + state$0 = state[2], + match = caml_call1(finishing_step, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var state$1 = match[1]; + return [0, [0, 301075099, state$1]]; + } + var state$2 = match[2], y = match[1]; + return [1, y, [0, 301075099, state$2]]; + } + var + match$0 = state[2], + inner_state = match$0[2], + state$3 = match$0[1], + match$1 = caml_call1(next, inner_state); + if(typeof match$1 === "number") + return [0, [0, 301075099, caml_call1(inner_finished, state$3)]]; + if(0 === match$1[0]){ + var inner_state$0 = match$1[1]; + return [0, [0, -172306698, [0, state$3, inner_state$0]]]; + } + var + inner_state$1 = match$1[2], + x = match$1[1], + match$2 = caml_call2(running_step, state$3, x); + if(typeof match$2 === "number") return 0; + if(0 === match$2[0]){ + var state$4 = match$2[1]; + return [0, [0, -172306698, [0, state$4, inner_state$1]]]; + } + var state$5 = match$2[2], y$0 = match$2[1]; + return [1, y$0, [0, -172306698, [0, state$5, inner_state$1]]]; + }]; + } + function of_list(l){ + return [0, + l, + function(param){ + if(! param) return 0; + var l = param[2], x = param[1]; + return [1, x, l]; + }]; + } + function fold(t, init, f){ + var next = t[2], seed$2 = t[1], seed = seed$2, v = init; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return v; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var + seed$1 = match[2], + a = match[1], + v$0 = caml_call2(f, v, a), + seed = seed$1, + v = v$0; + } + } + function to_list_rev(t){ + return fold(t, 0, function(l, x){return [0, x, l];}); + } + function to_list(param){ + var next = param[2], s = param[1]; + function to_list(s, next, i){ + var s$0 = s; + for(;;){ + if(0 === i){ + var t = [0, s$0, next], _X_ = to_list_rev(t); + return caml_call1(Base_List1[21], _X_); + } + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, a, to_list(s$2, next, caml_call2(Base_Import[93], i, 1))]; + } + } + return to_list(s, next, 500); + } + function sexp_of_t$0(sexp_of_a, t){ + var _W_ = to_list(t); + return caml_call2(Base_Import[152], sexp_of_a, _W_); + } + function range(opt, _V_, _U_, start_v, stop_v){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_V_) var sth$0 = _V_[1], start = sth$0; else var start = 104758188; + if(_U_) var sth$1 = _U_[1], stop = sth$1; else var stop = -160346914; + var + step = + 104758188 <= stop + ? 0 + <= stride + ? function + (i){ + return stop_v < i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i < stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : 0 + <= stride + ? function + (i){ + return stop_v <= i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i <= stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + }, + init = + 104758188 <= start + ? start_v + : caml_call2(Base_Import[91], start_v, stride); + return [0, init, step]; + } + function of_lazy(t_lazy){ + return [0, + t_lazy, + function(t_lazy){ + var _T_ = caml_obj_tag(t_lazy); + if(250 === _T_) + var match = t_lazy[1]; + else{ + var switch$0 = 0; + if(246 !== _T_ && 244 !== _T_){ + var match = t_lazy; + switch$0 = 1; + } + if(! switch$0) + var match = caml_call1(CamlinternalLazy[2], t_lazy); + } + var next = match[2], s = match[1], match$0 = caml_call1(next, s); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$0 = match$0[1], v = [0, s$0, next]; + return [0, v]; + } + var s$1 = match$0[2], x = match$0[1], v$0 = [0, s$1, next]; + return [1, x, v$0]; + }]; + } + function _d_(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var s$0 = match[2], a = match[1]; + return [1, caml_call1(f, a), s$0]; + }]; + } + function mapi(t, f){ + var next = t[2], s = t[1]; + return [0, + [0, 0, s], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var + s$1 = match[2], + a = match[1], + _S_ = [0, caml_call2(Base_Import[91], i, 1), s$1]; + return [1, caml_call2(f, i, a), _S_]; + }]; + } + function folding_map(t, init, f){ + return unfold_with + (t, + init, + function(acc, x){ + var + match = caml_call2(f, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, acc$0]; + }); + } + function folding_mapi(t, init, f){ + return unfold_with + (t, + [0, 0, init], + function(param, x){ + var + acc = param[2], + i = param[1], + match = caml_call3(f, i, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, [0, caml_call2(Base_Import[91], i, 1), acc$0]]; + }); + } + function filter(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var a = match[1], s$0 = match[2]; + if(caml_call1(f, a)) return [1, a, s$0]; + var s$1 = match[2]; + return [0, s$1]; + }]; + } + function filteri(t, f){ + var _Q_ = Base_Import[127]; + function _R_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return _d_(filter(mapi(t, function(i, s){return [0, i, s];}), _R_), _Q_); + } + function length(t){ + var next = t[2], seed = t[1], i = 0, s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return i; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s = s$1; + } + } + function to_array(t){ + var + match = + fold + (t, + _e_, + function(param, x){ + var i = param[2], l = param[1]; + return [0, [0, x, l], caml_call2(Base_Import[91], i, 1)]; + }), + len = match[2], + l = match[1]; + if(! l) return [0]; + var + l$0 = l[2], + x = l[1], + a = caml_call2(Base_Array0[4], len, x), + i$1 = caml_call2(Base_Import[93], len, 2), + i = i$1, + l$1 = l$0; + for(;;){ + if(l$1){ + var l$2 = l$1[2], x$0 = l$1[1]; + runtime.caml_check_bound(a, i)[1 + i] = x$0; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, l$1 = l$2; + continue; + } + if(-1 === i) return a; + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + } + function find(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(caml_call1(f, a)) return [0, a]; + var s$0 = match[2]; + } + var s = s$0; + } + } + function find_map(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call1(f, a); + if(some_b) return some_b; + var s = s$1; + } + } + function find_mapi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call2(f, i, a); + if(some_b) return some_b; + var i$0 = caml_call2(Base_Import[91], i, 1), s = s$1, i = i$0; + } + } + function for_all(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(! caml_call1(f, a)) return 0; + var s$0 = match[2]; + } + var s = s$0; + } + } + function for_alli(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(! caml_call2(f, i, a)) return 0; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function exists(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{var a = match[1]; if(caml_call1(f, a)) return 1; var s$0 = match[2]; + } + var s = s$0; + } + } + function existsi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(caml_call2(f, i, a)) return 1; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function iter(t, f){ + var next = t[2], seed$2 = t[1], seed = seed$2; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var seed$1 = match[2], a = match[1]; + caml_call1(f, a); + var seed = seed$1; + } + } + function is_empty(t){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 !== match[0]) return 0; + var s$0 = match[1], s = s$0; + } + } + function mem(t, a, equal){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var b = match[1]; + if(caml_call2(equal, a, b)) return 1; + var s$0 = match[2]; + } + var s = s$0; + } + } + var empty = [0, 0, function(param){return 0;}]; + function bind(t, f){ + return [0, + [0, empty, t], + function(param){ + var + rest = param[2], + match = param[1], + next = match[2], + seed = match[1], + match$0 = caml_call1(next, seed); + if(typeof match$0 === "number"){ + var + next$0 = rest[2], + seed$0 = rest[1], + match$1 = caml_call1(next$0, seed$0); + if(typeof match$1 === "number") return 0; + if(0 === match$1[0]){ + var s = match$1[1]; + return [0, [0, empty, [0, s, next$0]]]; + } + var s$0 = match$1[2], a = match$1[1]; + return [0, [0, caml_call1(f, a), [0, s$0, next$0]]]; + } + if(0 === match$0[0]){ + var s$1 = match$0[1]; + return [0, [0, [0, s$1, next], rest]]; + } + var s$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, [0, s$2, next], rest]]; + }]; + } + function return$0(x){ + return [0, + [0, x], + function(param){ + if(! param) return 0; + var x = param[1]; + return [1, x, 0]; + }]; + } + var + map = [0, -198771759, _d_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function nth(s, n){ + if(0 > n) return 0; + var next = s[2], s$3 = s[1], i = n, s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(caml_call2(Base_Import[128], i, 0)) return [0, a]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, s$0 = s$2; + } + } + function nth_exn(s, n){ + if(0 > n) return caml_call1(Base_Import[126], cst_Sequence_nth$0); + var match = nth(s, n); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_nth); + var x = match[1]; + return x; + } + function compare(cmp_a, cmp_b, a_011, b_012){ + if(caml_call2(Base_Ppx_compare_lib[1], a_011, b_012)) return 0; + switch(a_011[0]){ + case 0: + var a_013 = a_011[1]; + if(0 !== b_012[0]) return -1; + var b_014 = b_012[1]; + return caml_call2(cmp_a, a_013, b_014); + case 1: + var a_015 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + var b_016 = b_012[1]; return caml_call2(cmp_b, a_015, b_016); + default: return -1; + } + break; + default: + var a_019 = a_011[2], a_017 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + return 1; + default: + var + b_020 = b_012[2], + b_018 = b_012[1], + n = caml_call2(cmp_a, a_017, b_018); + return 0 === n ? caml_call2(cmp_b, a_019, b_020) : n; + } + } + return 1; + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + switch(arg[0]){ + case 0: + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + case 1: + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + default: + var + a1 = arg[2], + a0$1 = arg[1], + hsv$2 = caml_call2(Base_Hash[3], hsv, 2), + hsv$3 = caml_call2(hash_fold_a, hsv$2, a0$1); + return caml_call2(hash_fold_b, hsv$3, a1); + } + } + function t_of_sexp(of_a_021, of_b_022, sexp_027){ + if(0 === sexp_027[0]){ + var _M_ = sexp_027[1], switch$0 = 0; + if(caml_string_notequal(_M_, cst_Both$0)){ + var switch$1 = 0; + if(caml_string_notequal(_M_, cst_Left$0)){ + var switch$2 = 0; + if(caml_string_notequal(_M_, cst_Right$0)){ + if(caml_string_notequal(_M_, cst_both)) + if(caml_string_notequal(_M_, cst_left)) + if(caml_string_notequal(_M_, cst_right)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else{ + var _N_ = sexp_027[1]; + if(! _N_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_025, sexp_027); + var _O_ = _N_[1]; + if(0 !== _O_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_025, sexp_027); + var tag_028 = _O_[1], switch$3 = 0; + if(caml_string_notequal(tag_028, cst_Both$0)){ + var switch$4 = 0; + if(caml_string_notequal(tag_028, cst_Left$0)){ + var switch$5 = 0; + if(caml_string_notequal(tag_028, cst_Right$0)){ + if(caml_string_notequal(tag_028, cst_both)) + if(caml_string_notequal(tag_028, cst_left)) + if(caml_string_notequal(tag_028, cst_right)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5){ + var sexp_args_034 = _N_[2]; + if(sexp_args_034 && ! sexp_args_034[2]){ + var + arg0_035 = sexp_args_034[1], + res0_036 = caml_call1(of_b_022, arg0_035); + return [1, res0_036]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + else + switch$4 = 1; + if(switch$4){ + var sexp_args_029 = _N_[2]; + if(sexp_args_029 && ! sexp_args_029[2]){ + var + arg0_030 = sexp_args_029[1], + res0_031 = caml_call1(of_a_021, arg0_030); + return [0, res0_031]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + if(! switch$3){ + var sexp_args_039 = _N_[2]; + if(sexp_args_039){ + var _P_ = sexp_args_039[2]; + if(_P_ && ! _P_[2]){ + var + arg1_041 = _P_[1], + arg0_040 = sexp_args_039[1], + res0_042 = caml_call1(of_a_021, arg0_040), + res1_043 = caml_call1(of_b_022, arg1_041); + return [2, res0_042, res1_043]; + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_025, sexp_027); + } + function sexp_of_t$1(of_a_046, of_b_047, param){ + switch(param[0]){ + case 0: + var arg0_048 = param[1], res0_049 = caml_call1(of_a_046, arg0_048); + return [1, [0, _g_, [0, res0_049, 0]]]; + case 1: + var arg0_050 = param[1], res0_051 = caml_call1(of_b_047, arg0_050); + return [1, [0, _h_, [0, res0_051, 0]]]; + default: + var + arg1_053 = param[2], + arg0_052 = param[1], + res0_054 = caml_call1(of_a_046, arg0_052), + res1_055 = caml_call1(of_b_047, arg1_053); + return [1, [0, _i_, [0, res0_054, [0, res1_055, 0]]]]; + } + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Left, [0, [0, a_sexp_grammar, 0]]]], + [0, + [1, [0, cst_Right, [0, [0, b_sexp_grammar, 0]]]], + [0, + [1, + [0, + cst_Both, + [0, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]]], + 0]]]]]; + } + var + Merge_with_duplicates_element = + [0, compare, hash_fold_t, t_of_sexp, sexp_of_t$1, t_sexp_grammar]; + function merge_with_duplicates(param, _L_, compare){ + var next2 = _L_[2], s2 = _L_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [1, b], [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, [0, a], [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 <= comparison + ? 0 + === comparison + ? [1, [2, a, b$0], [0, [0, s1$1], [0, s2$3]]] + : [1, [1, b$0], [0, s1, [0, s2$3]]] + : [1, [0, a], [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function merge_deduped_and_sorted(s1, s2, compare){ + function _K_(param){var x = param[1]; return x;} + return caml_call2(map$0, merge_with_duplicates(s1, s2, compare), _K_); + } + function merge_sorted(param, _J_, compare){ + var next2 = _J_[2], s2 = _J_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, b, [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, a, [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 < comparison + ? [1, b$0, [0, s1, [0, s2$3]]] + : [1, a, [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function hd(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[1]; + return [0, a]; + } + } + function hd_exn(s){ + var match = hd(s); + if(! match) return caml_call1(Base_Import[124], cst_hd_exn); + var a = match[1]; + return a; + } + function tl(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") + var match$0 = 0; + else{ + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[2], match$0 = [0, a]; + } + if(! match$0) return 0; + var s$3 = match$0[1]; + return [0, [0, s$3, next]]; + } + } + function tl_eagerly_exn(s){ + var match = tl(s); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_tl_exn); + var s$0 = match[1]; + return s$0; + } + function lift_identity(next, s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, 316735838, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, 316735838, s$1]]; + } + function next(s){ + var next = s[2], s$3 = s[1], s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, [0, a, [0, s$2, next]]]; + } + } + function filter_opt(s){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var match$0 = match[1]; + if(match$0){ + var s$1 = match[2], a = match$0[1]; + return [1, a, s$1]; + } + var s$2 = match[2]; + return [0, s$2]; + }]; + } + function filter_map(s, f){return filter_opt(caml_call2(map$0, s, f));} + function filter_mapi(s, f){ + function _I_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return filter_map(mapi(s, function(i, s){return [0, i, s];}), _I_); + } + function split_n(s, n){ + var next = s[2], s$3 = s[1], s$0 = s$3, i = n, accum = 0; + for(;;){ + if(0 >= i) return [0, caml_call1(Base_List1[21], accum), [0, s$0, next]]; + var match = caml_call1(next, s$0); + if(typeof match === "number") + return [0, caml_call1(Base_List1[21], accum), empty]; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + a = match[1], + accum$0 = [0, a, accum], + i$0 = caml_call2(Base_Import[93], i, 1), + s$0 = s$2, + i = i$0, + accum = accum$0; + } + } + function chunks_exn(t, n){ + return 0 < n + ? [0, + t, + function(t){ + var match = split_n(t, n), xs = match[1]; + if(! xs) return 0; + var t$0 = match[2]; + return [1, xs, t$0]; + }] + : caml_call1(Base_Import[126], cst_Sequence_chunks_exn); + } + function findi(s, f){ + function _H_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return find(mapi(s, function(i, s){return [0, i, s];}), _H_); + } + function find_exn(s, f){ + var match = find(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_find_exn); + var x = match[1]; + return x; + } + function append(s1, s2){ + var next2 = s2[2], s2$0 = s2[1], next1 = s1[2], s1$0 = s1[1]; + return [0, + [0, 472258093, s1$0], + function(param){ + if(472258093 <= param[1]){ + var s1 = param[2], match = caml_call1(next1, s1); + if(typeof match === "number") return [0, [0, -630817751, s2$0]]; + if(0 === match[0]){ + var s1$0 = match[1]; + return [0, [0, 472258093, s1$0]]; + } + var s1$1 = match[2], a = match[1]; + return [1, a, [0, 472258093, s1$1]]; + } + var s2 = param[2], match$0 = caml_call1(next2, s2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s2$1 = match$0[1]; + return [0, [0, -630817751, s2$1]]; + } + var s2$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, -630817751, s2$2]]; + }]; + } + function concat_map(s, f){return caml_call2(bind$0, s, f);} + function concat(s){return concat_map(s, function(_G_){return _G_;});} + function concat_mapi(s, f){ + function _F_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return concat_map(mapi(s, function(i, s){return [0, i, s];}), _F_); + } + function zip(param, _D_){ + var next2 = _D_[2], s2 = _D_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var _E_ = param[1], switch$0 = 0; + if(typeof _E_ === "number") + switch$0 = 1; + else if(1 === _E_[0]){ + var match = param[2], s1$0 = _E_[2], a = _E_[1]; + if(typeof match !== "number"){ + if(0 === match[0]){ + var s2$0 = param[2][1]; + return [0, [0, _E_, caml_call1(next2, s2$0)]]; + } + var s2$1 = match[2], b = match[1]; + return [1, [0, a, b], [0, [0, s1$0], [0, s2$1]]]; + } + } + if(! switch$0 && typeof param[2] !== "number"){ + var s2 = param[2], s1 = _E_[1]; + return [0, [0, caml_call1(next1, s1), s2]]; + } + return 0; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function zip_full(param, _C_){ + var next2 = _C_[2], s2 = _C_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [0, -57574468, b], [0, 0, caml_call1(next2, s2$0)]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var match$0 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof match$0 === "number") + return [1, [0, 847852583, a], [0, caml_call1(next1, s1$1), 0]]; + if(0 !== match$0[0]){ + var s2$2 = match$0[2], b$0 = match$0[1]; + return [1, [0, 737457313, [0, a, b$0]], [0, [0, s1$1], [0, s2$2]]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function bounded_length(param, at_most){ + var next = param[2], seed = param[1], i = 0, seed$0 = seed; + for(;;){ + if(at_most < i) return 85047514; + var match = caml_call1(next, seed$0); + if(typeof match === "number") return [0, 16394, i]; + if(0 === match[0]){var seed$1 = match[1], seed$0 = seed$1; continue;} + var + seed$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + seed$0 = seed$2; + } + } + function length_is_bounded_by(opt, max, t){ + if(opt) var sth = opt[1], min = sth; else var min = -1; + if(max){ + var max$0 = max[1], match$0 = bounded_length(t, max$0); + if(typeof match$0 !== "number" && 16394 === match$0[1]){var len = match$0[2]; if(min <= len) return 1;} + return 0; + } + var next = t[2], s = t[1], s$0 = s, acc = 0; + for(;;){ + if(min <= acc) return 1; + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + acc$0 = caml_call2(Base_Import[91], acc, 1), + s$0 = s$2, + acc = acc$0; + } + } + function iteri(s, f){ + function _B_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return iter(mapi(s, function(i, s){return [0, i, s];}), _B_); + } + function foldi(s, init, f){ + function _A_(acc, param){ + var s = param[2], i = param[1]; + return caml_call3(f, i, acc, s); + } + return fold(mapi(s, function(i, s){return [0, i, s];}), init, _A_); + } + function reduce(s, f){ + var match = next(s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [0, fold(s$0, a, f)]; + } + function reduce_exn(s, f){ + var match = reduce(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_reduce_exn); + var res = match[1]; + return res; + } + function group(param, break$0){ + var next = param[2], s = param[1]; + return [0, + [0, [0, 0, s]], + function(param){ + if(! param) return 0; + var + match = param[1], + s = match[2], + acc = match[1], + match$0 = caml_call1(next, s); + if(typeof match$0 !== "number" && 0 === match$0[0]){ + var s$2 = match$0[1]; + return [0, [0, [0, acc, s$2]]]; + } + if(acc){ + if(typeof match$0 === "number") + return [1, caml_call1(Base_List1[21], acc), 0]; + var s$0 = match$0[2], cur = match$0[1], prev = acc[1]; + return caml_call2(break$0, prev, cur) + ? [1, + caml_call1(Base_List1[21], acc), + [0, [0, [0, cur, 0], s$0]]] + : [0, [0, [0, [0, cur, acc], s$0]]]; + } + if(typeof match$0 === "number") return 0; + var s$1 = match$0[2], cur$0 = match$0[1]; + return [0, [0, [0, [0, cur$0, 0], s$1]]]; + }]; + } + function find_consecutive_duplicate(param, equal){ + var next = param[2], s = param[1], last_elt = 0, s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(last_elt){ + var b = last_elt[1]; + if(caml_call2(equal, a, b)) return [0, [0, b, a]]; + } + var last_elt$0 = [0, a], last_elt = last_elt$0, s$0 = s$2; + } + } + function remove_consecutive_duplicates(s, equal){ + return unfold_with + (s, + 0, + function(prev, a){ + if(prev){ + var b = prev[1]; + if(caml_call2(equal, a, b)) return [0, [0, a]]; + } + return [1, a, [0, a]]; + }); + } + function count(s, f){return length(filter(s, f));} + function counti(t, f){return length(filteri(t, f));} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function init(n, f){ + return [0, + 0, + function(i){ + if(n <= i) return 0; + var _z_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_call1(f, i), _z_]; + }]; + } + function sub(s, pos, len){ + var _x_ = pos < 0 ? 1 : 0, _y_ = _x_ || (len < 0 ? 1 : 0); + if(_y_) caml_call1(Base_Import[124], cst_Sequence_sub); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= caml_call2(Base_Import[93], i, pos)) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(pos <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_take); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= i) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + }]; + } + function drop(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_drop); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(len <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var a = match[1], s$1 = match[2]; + return caml_call1(f, a) ? [1, a, s$1] : 0; + }]; + } + function drop_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -557110719, s$0], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var s$0 = param[2], match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$1 = match[1]; + return [0, [0, -557110719, s$1]]; + } + var a = match[1], s$2 = match[2]; + if(caml_call1(f, a)) return [0, [0, -557110719, s$2]]; + var s$3 = match[2]; + return [1, a, [0, 316735838, s$3]]; + }]; + } + function shift_right(s, x){ + var next = s[2], seed = s[1]; + return [0, + [0, -433944719, [0, seed, x]], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var match = param[2], x = match[2], seed = match[1]; + return [1, x, [0, 316735838, seed]]; + }]; + } + function shift_right_with_list(s, l){return append(of_list(l), s);} + var Infix = [0, append]; + function intersperse(s, sep){ + var next = s[2], s$0 = s[1]; + return [0, + [0, 815032112, s$0], + function(param){ + var _w_ = param[1]; + if(815032112 === _w_){ + var s = param[2], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, 815032112, s$0]]; + } + var s$1 = match[2], a = match[1]; + return [1, a, [0, 951752159, s$1]]; + } + if(951752159 > _w_){ + var match$1 = param[2], s$5 = match$1[2], a$1 = match$1[1]; + return [1, a$1, [0, 951752159, s$5]]; + } + var s$2 = param[2], match$0 = caml_call1(next, s$2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$3 = match$0[1]; + return [0, [0, 951752159, s$3]]; + } + var s$4 = match$0[2], a$0 = match$0[1]; + return [1, sep, [0, -571577571, [0, a$0, s$4]]]; + }]; + } + function repeat(x){return [0, x, function(x){return [1, x, x];}];} + function cycle_list_exn(xs){ + if(caml_call1(Base_List1[23], xs)) + caml_call1(Base_Import[126], cst_Sequence_cycle_list_exn); + var s = of_list(xs); + function _v_(param){return s;} + return concat_map(repeat(0), _v_); + } + function cartesian_product(sa, sb){ + return concat_map(sa, function(a){return zip(repeat(a), sb);}); + } + function singleton(x){return caml_call1(return$1, x);} + function delayed_fold(s, init, f, finish){ + function _u_(acc, option, k){ + if(! option) return caml_call1(k, acc); + var a = option[1]; + return caml_call3(f, acc, a, k); + } + return caml_call4(Expert[2], s, init, _u_, finish); + } + function fold_m(bind, return$0, t, init, f){ + function _t_(acc, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, acc), k); + var a = option[1]; + return caml_call2(bind, caml_call2(f, acc, a), k); + } + return caml_call4(Expert[2], t, init, _t_, return$0); + } + function iter_m(bind, return$0, t, f){ + function _s_(param, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, 0), k); + var a = option[1]; + return caml_call2(bind, caml_call1(f, a), k); + } + return caml_call4(Expert[2], t, 0, _s_, return$0); + } + function fold_until(s, init, f, finish){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], match$0 = caml_call2(f, acc, a); + if(0 === match$0[0]){ + var acc$0 = match$0[1], s$0 = s$2, acc = acc$0; + continue; + } + var x = match$0[1]; + return x; + } + } + function fold_result(s, init, f){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(Base_Result[12], acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], e = caml_call2(f, acc, a); + if(0 !== e[0]) return e; + var acc$0 = e[1], s$0 = s$2, acc = acc$0; + } + } + function force_eagerly(t){return of_list(to_list(t));} + function memoize(param){ + var next = param[2], s = param[1]; + function memoize(s){ + return [0, + [246, + function(_r_){ + var s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [1, a, memoize(s$2)]; + } + }]]; + } + function _p_(param){ + var l = param[1], _q_ = caml_obj_tag(l); + if(250 === _q_) return l[1]; + if(246 !== _q_ && 244 !== _q_) return l; + return caml_call1(CamlinternalLazy[2], l); + } + return [0, memoize(s), _p_]; + } + function drop_eagerly(s, len){ + var next = s[2], s$3 = s[1], i = 0, s$0 = s$3; + for(;;){ + if(len <= i) return [0, s$0, next]; + var match = caml_call1(next, s$0); + if(typeof match === "number") return empty; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s$0 = s$2; + } + } + function drop_while_option(param, f){ + var next = param[2], s = param[1], s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], x = match[1]; + if(! caml_call1(f, x)) return [0, [0, x, [0, s$2, next]]]; + var s$0 = s$2; + } + } + function compare$0(compare_a, t1, t2){ + function _l_(r){ + function _m_(param){ + var _n_ = param[1]; + if(737457313 !== _n_) + return 847852583 <= _n_ ? caml_call1(r, 1) : caml_call1(r, -1); + var + match = param[2], + v2 = match[2], + v1 = match[1], + c = caml_call2(compare_a, v1, v2), + _o_ = 0 !== c ? 1 : 0; + return _o_ ? caml_call1(r, c) : _o_; + } + iter(zip_full(t1, t2), _m_); + return 0; + } + return caml_call1(Base_With_return[1], _l_); + } + function equal(equal_a, t1, t2){ + function _k_(param){ + if(737457313 !== param[1]) return 0; + var match = param[2], a2 = match[2], a1 = match[1]; + return caml_call2(equal_a, a1, a2); + } + return for_all(zip_full(t1, t2), _k_); + } + function round_robin(list){ + function next(param){ + var done_stack = param[2], todo_stack = param[1]; + if(! todo_stack) + return caml_call1(Base_List1[23], done_stack) + ? 0 + : [0, [0, caml_call1(Base_List1[21], done_stack), 0]]; + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f = match[2], + s = match[1], + match$0 = caml_call1(f, s); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack]]; + if(0 === match$0[0]){ + var s$0 = match$0[1]; + return [0, [0, [0, [0, s$0, f], todo_stack$0], done_stack]]; + } + var s$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s$1, f], done_stack]]]; + } + var state = [0, list, 0]; + return [0, state, next]; + } + function interleave(param){ + var f1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[3], done_stack = param[2], todo_stack = param[1]; + if(todo_stack){ + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f2 = match[2], + s2 = match[1], + match$0 = caml_call1(f2, s2); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack, s1]]; + if(0 === match$0[0]){ + var s2$0 = match$0[1]; + return [0, [0, todo_stack$0, [0, [0, s2$0, f2], done_stack], s1]]; + } + var s2$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s2$1, f2], done_stack], s1]]; + } + var match$1 = caml_call1(f1, s1); + if(typeof match$1 === "number") + return done_stack + ? [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1]] + : 0; + if(0 === match$1[0]){ + var s1$0 = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1$0]]; + } + var s1$1 = match$1[2], t = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], [0, t, done_stack]), 0, s1$1]]; + } + var state = [0, 0, 0, s1]; + return [0, state, next]; + } + function interleaved_cartesian_product(s1, s2){ + return interleave + (caml_call2 + (map$0, + s1, + function(x1){ + return caml_call2 + (map$0, s2, function(x2){return [0, x1, x2];}); + })); + } + function of_seq(seq){ + return [0, + seq, + function(seq){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var tl = match[2], hd = match[1]; + return [1, hd, tl]; + }]; + } + function to_seq(param){ + var next = param[2], state = param[1]; + function loop(state){ + var state$0 = state; + for(;;){ + var match = caml_call1(next, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var state$1 = match[1], state$0 = state$1; continue;} + var state$2 = match[2], hd = match[1]; + return [0, hd, function(param){return loop(state$2);}]; + } + } + return function(param){return loop(state);}; + } + function return$2(x, k){return caml_call1(k, x);} + function bind$1(m, f, k){ + return caml_call1 + (m, + function(a){var m = caml_call1(f, a); return caml_call1(m, k);}); + } + var + map$1 = + [0, + -198771759, + function(m, f, k){ + return caml_call1 + (m, function(a){return caml_call1(k, caml_call1(f, a));}); + }], + include$0 = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]), + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Let_syntax$0 = include$0[3], + Monad_infix$0 = include$0[4], + bind$2 = include$0[5], + return$3 = include$0[6], + map$2 = include$0[7], + join$0 = include$0[8], + ignore_m$0 = include$0[9], + all$0 = include$0[10], + all_unit$0 = include$0[11]; + function yield$0(e, k){return [0, [1, e, k]];} + function of_sequence(sequence){ + return delayed_fold + (sequence, + 0, + function(param, x, k, f){ + return [0, [1, x, function(param){return caml_call2(k, 0, f);}]]; + }, + return$3); + } + function run(t){ + function init(param){return caml_call1(t, function(param){return _j_;});} + function f(thunk){return caml_call1(thunk, 0)[1];} + return [0, init, f]; + } + var + Base_Sequence = + [0, + sexp_of_t$0, + equal, + compare$0, + mem, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi, + iteri, + existsi, + counti, + findi, + find_mapi, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + empty, + next, + Step, + unfold_step, + unfold, + unfold_with, + unfold_with_and_finish, + nth, + nth_exn, + folding_map, + folding_mapi, + mapi, + filteri, + filter, + merge_deduped_and_sorted, + merge_deduped_and_sorted, + merge_sorted, + Merge_with_duplicates_element, + merge_with_duplicates, + hd, + hd_exn, + tl, + tl_eagerly_exn, + find_exn, + for_alli, + append, + concat, + concat_map, + concat_mapi, + interleave, + round_robin, + zip, + zip_full, + reduce_exn, + reduce, + group, + find_consecutive_duplicate, + remove_consecutive_duplicates, + range, + init, + filter_map, + filter_mapi, + filter_opt, + sub, + take, + drop, + drop_eagerly, + take_while, + drop_while, + drop_while_option, + split_n, + chunks_exn, + shift_right, + shift_right_with_list, + drop, + Infix, + cartesian_product, + interleaved_cartesian_product, + intersperse, + cycle_list_exn, + repeat, + singleton, + delayed_fold, + fold_m, + iter_m, + to_list_rev, + of_list, + of_lazy, + memoize, + force_eagerly, + bounded_length, + length_is_bounded_by, + of_seq, + to_seq, + [0, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + Monad_infix$0, + bind$2, + return$3, + map$2, + join$0, + ignore_m$0, + all$0, + all_unit$0, + yield$0, + of_sequence, + run], + Expert]; + runtime.caml_register_global(48, Base_Sequence, "Base__Sequence"); + return; + } + (globalThis)); + +//# 13251 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_array_ml = "src/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Base_Import = global_data.Base__Import, + Base_Sequence = global_data.Base__Sequence, + Base_Random = global_data.Base__Random, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Container = global_data.Base__Container, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Base_Binary_searchable = global_data.Base__Binary_searchable, + Base_Blit = global_data.Base__Blit, + invalid_argf = Base_Array0[1], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23], + compare = Base_Import[235], + t_of_sexp = Base_Import[177], + sexp_of_t = Base_Import[153], + _g_ = [0, cst_src_array_ml, 858, 8], + cst_Array_transpose_exn = "Array.transpose_exn", + cst_Array_zip_exn = "Array.zip_exn", + cst_Array_random_element_exn_e = "Array.random_element_exn: empty array", + cst_Array_reduce_exn = "Array.reduce_exn", + _d_ = [0, "Array.find_exn: not found"], + _c_ = [0, "Array.findi_exn: not found"], + cst_Array_for_all2_exn = "Array.for_all2_exn", + cst_Array_exists2_exn = "Array.exists2_exn", + cst_Array_fold2_exn = "Array.fold2_exn", + cst_Array_map2_exn = "Array.map2_exn", + cst_Array_iter2_exn = "Array.iter2_exn", + _b_ = + [0, + [11, + "length mismatch in ", + [2, 0, [11, ": ", [4, 0, 0, 0, [11, " <> ", [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _a_ = [0, cst_src_array_ml, 435, 14], + _e_ = [0, "Array.find_map_exn: not found"], + _f_ = [0, "Array.find_mapi_exn: not found"]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[196], a_sexp_grammar); + } + function get(_aL_, _aK_){return caml_check_bound(_aL_, _aK_)[1 + _aK_];} + function set(_aJ_, _aI_, _aH_){ + caml_check_bound(_aJ_, _aI_)[1 + _aI_] = _aH_; + return 0; + } + function swap$0(arr, i, j){ + var tmp = get(arr, i); + set(arr, i, get(arr, j)); + return set(arr, j, tmp); + } + function sort(arr, compare, left, right){ + var _aF_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aF_){ + var pos = _aF_; + a: + for(;;){ + var v = get(arr, pos), final_pos = pos; + for(;;){ + var i_next = caml_call2(Base_Import[93], final_pos, 1); + if(left <= i_next && 0 < caml_call2(compare, get(arr, i_next), v)){ + set(arr, final_pos, get(arr, i_next)); + var final_pos = i_next; + continue; + } + set(arr, final_pos, v); + var _aG_ = pos + 1 | 0; + if(right !== pos){var pos = _aG_; continue a;} + break; + } + break; + } + } + return 0; + } + var Insertion_sort = [0, sort]; + function heapify(arr, compare, root, left, right){ + var root$0 = root; + for(;;){ + var + relative_root = caml_call2(Base_Import[93], root$0, left), + _ay_ = caml_call2(Base_Import[88], 2, relative_root), + _az_ = caml_call2(Base_Import[91], _ay_, left), + left_child = caml_call2(Base_Import[91], _az_, 1), + _aA_ = caml_call2(Base_Import[88], 2, relative_root), + _aB_ = caml_call2(Base_Import[91], _aA_, left), + right_child = caml_call2(Base_Import[91], _aB_, 2), + switch$0 = 0; + if(left_child <= right){ + var _aC_ = get(arr, root$0); + if(0 < caml_call2(compare, get(arr, left_child), _aC_)){var largest = left_child; switch$0 = 1;} + } + if(! switch$0) var largest = root$0; + var switch$1 = 0; + if(right_child <= right){ + var _aD_ = get(arr, largest); + if(0 < caml_call2(compare, get(arr, right_child), _aD_)){var largest$0 = right_child; switch$1 = 1;} + } + if(! switch$1) var largest$0 = largest; + var _aE_ = largest$0 !== root$0 ? 1 : 0; + if(! _aE_) return _aE_; + swap$0(arr, root$0, largest$0); + var root$0 = largest$0; + } + } + function sort$0(arr, compare, left, right){ + var + _at_ = caml_call2(Base_Import[91], left, right), + _au_ = caml_call2(Base_Import[95], _at_, 2); + if(_au_ >= left){ + var i = _au_; + for(;;){ + heapify(arr, compare, i, left, right); + var _av_ = i - 1 | 0; + if(left !== i){var i = _av_; continue;} + break; + } + } + var _aw_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aw_){ + var i$0 = right; + for(;;){ + swap$0(arr, left, i$0); + heapify(arr, compare, left, left, caml_call2(Base_Import[93], i$0, 1)); + var _ax_ = i$0 - 1 | 0; + if(_aw_ !== i$0){var i$0 = _ax_; continue;} + break; + } + } + return 0; + } + var Heap_sort = [0, sort$0]; + function five_element_sort(arr, compare, m1, m2, m3, m4, m5){ + function compare_and_swap(i, j){ + var + _ar_ = get(arr, j), + _as_ = 0 < caml_call2(compare, get(arr, i), _ar_) ? 1 : 0; + return _as_ ? swap$0(arr, i, j) : _as_; + } + compare_and_swap(m1, m2); + compare_and_swap(m4, m5); + compare_and_swap(m1, m3); + compare_and_swap(m2, m3); + compare_and_swap(m1, m4); + compare_and_swap(m3, m4); + compare_and_swap(m2, m5); + compare_and_swap(m2, m3); + return compare_and_swap(m4, m5); + } + function intro_sort(arr, max_depth, compare, left, right){ + var max_depth$0 = max_depth, left$0 = left; + a: + for(;;){ + var + _aq_ = caml_call2(Base_Import[93], right, left$0), + len = caml_call2(Base_Import[91], _aq_, 1); + if(32 >= len) + return caml_call4(Insertion_sort[1], arr, compare, left$0, right); + if(0 > max_depth$0) + return caml_call4(Heap_sort[1], arr, compare, left$0, right); + var + max_depth$1 = caml_call2(Base_Import[93], max_depth$0, 1), + _ap_ = caml_call2(Base_Import[93], right, left$0), + sixth = caml_call2(Base_Import[95], _ap_, 6), + m1 = caml_call2(Base_Import[91], left$0, sixth), + m2 = caml_call2(Base_Import[91], m1, sixth), + m3 = caml_call2(Base_Import[91], m2, sixth), + m4 = caml_call2(Base_Import[91], m3, sixth), + m5 = caml_call2(Base_Import[91], m4, sixth); + five_element_sort(arr, compare, m1, m2, m3, m4, m5); + var + m2_val = get(arr, m2), + m3_val = get(arr, m3), + m4_val = get(arr, m4), + match = + 0 === caml_call2(compare, m2_val, m3_val) + ? [0, m2_val, m3_val, 1] + : 0 + === caml_call2(compare, m3_val, m4_val) + ? [0, m3_val, m4_val, 1] + : [0, m2_val, m4_val, 0], + middle_sorted = match[3], + pivot2 = match[2], + pivot1 = match[1], + l$0 = left$0, + p$1 = left$0, + r$2 = right; + b: + for(;;){ + if(r$2 < p$1){ + intro_sort + (arr, + max_depth$1, + compare, + left$0, + caml_call2(Base_Import[93], l$0, 1)); + if(1 - middle_sorted) intro_sort(arr, max_depth$1, compare, l$0, r$2); + var + left$1 = caml_call2(Base_Import[91], r$2, 1), + max_depth$0 = max_depth$1, + left$0 = left$1; + continue a; + } + var pv = get(arr, p$1); + if(0 > caml_call2(compare, pv, pivot1)){ + swap$0(arr, p$1, l$0); + var + p$0 = caml_call2(Base_Import[91], p$1, 1), + l = caml_call2(Base_Import[91], l$0, 1), + l$0 = l, + p$1 = p$0; + continue; + } + if(0 >= caml_call2(compare, pv, pivot2)){ + var p = caml_call2(Base_Import[91], p$1, 1), p$1 = p; + continue; + } + var r = r$2; + for(;;){ + if(p$1 < r && 0 < caml_call2(compare, get(arr, r), pivot2)){ + var r$0 = caml_call2(Base_Import[93], r, 1), r = r$0; + continue; + } + swap$0(arr, r, p$1); + var r$1 = caml_call2(Base_Import[93], r, 1), r$2 = r$1; + continue b; + } + } + } + } + function sort$1(arr, compare, left, right){ + return intro_sort(arr, 32, compare, left, right); + } + var Intro_sort = [0, sort$1, five_element_sort]; + function sort$2(pos, len, arr, compare){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], pos, len, 0, arr.length - 1), + len$0 = match[2], + pos$0 = match[1], + _an_ = caml_call2(Base_Import[91], pos$0, len$0), + _ao_ = caml_call2(Base_Import[93], _an_, 1); + return caml_call4(Intro_sort[1], arr, compare, pos$0, _ao_); + } + function to_array(t){return t;} + function is_empty(t){return 0 === t.length - 1 ? 1 : 0;} + function is_sorted(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 < caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function is_sorted_strictly(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 <= caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function merge(a1, a2, compare){ + var l1 = a1.length - 1, l2 = a2.length - 1; + if(0 === l1) return caml_call1(copy, a2); + if(0 === l2) return caml_call1(copy, a1); + var _ai_ = a1[1 + caml_call2(Base_Import[93], l1, 1)]; + if(0 <= caml_call2(compare, a2[1], _ai_)) + return caml_call2(append, a1, a2); + var _aj_ = a2[1 + caml_call2(Base_Import[93], l2, 1)]; + if(0 < caml_call2(compare, a1[1], _aj_)) + return caml_call2(append, a2, a1); + var + len = caml_call2(Base_Import[91], l1, l2), + merged = caml_call2(create, len, a1[1]), + a1_index = [0, 0], + a2_index = [0, 0], + _al_ = caml_call2(Base_Import[93], len, 1), + _ak_ = 0; + if(_al_ >= 0){ + var i = _ak_; + for(;;){ + var + use_a1 = + l1 === a1_index[1] + ? 0 + : l2 + === a2_index[1] + ? 1 + : caml_call2 + (compare, a1[1 + a1_index[1]], a2[1 + a2_index[1]]) + <= 0 + ? 1 + : 0; + if(use_a1){ + merged[1 + i] = a1[1 + a1_index[1]]; + a1_index[1] = caml_call2(Base_Import[91], a1_index[1], 1); + } + else{ + merged[1 + i] = a2[1 + a2_index[1]]; + a2_index[1] = caml_call2(Base_Import[91], a2_index[1], 1); + } + var _am_ = i + 1 | 0; + if(_al_ !== i){var i = _am_; continue;} + break; + } + } + return merged; + } + function copy_matrix(_ah_){return caml_call2(map, _ah_, copy);} + function folding_map(t, init, f){ + var acc = [0, init]; + return caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _af_ = caml_call3(Base_Container[9], fold, init, f); + return function(_ag_){return caml_call2(_af_, _ag_, t);}; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function foldi(t, init, f){ + var + acc = [0, init], + _ad_ = caml_call2(Base_Import[93], t.length - 1, 1), + _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + acc[1] = caml_call3(f, i, acc[1], t[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return acc[1]; + } + function folding_mapi(t, init, f){ + var acc = [0, init]; + return caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function concat_map(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(map, t, f))); + } + function concat_mapi(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(mapi, t, f))); + } + function rev_inplace(t){ + var i = [0, 0], j = [0, caml_call2(Base_Import[93], t.length - 1, 1)]; + for(;;){ + if(i[1] >= j[1]) return 0; + caml_call3(swap, t, i[1], j[1]); + caml_call1(Base_Import[130], i); + caml_call1(Base_Import[129], j); + } + } + function rev(t){ + var t$0 = caml_call1(copy, t); + rev_inplace(t$0); + return t$0; + } + function of_list_rev(l){ + if(! l) return [0]; + var + l$0 = l[2], + a = l[1], + _$_ = caml_call1(Base_List[7], l$0), + len = caml_call2(Base_Import[91], 1, _$_), + t = caml_call2(create, len, a), + r = [0, l$0], + _aa_ = caml_call2(Base_Import[93], len, 2); + if(_aa_ >= 0){ + var i = _aa_; + for(;;){ + var match = r[1]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var l$1 = match[2], a$0 = match[1]; + caml_check_bound(t, i)[1 + i] = a$0; + r[1] = l$1; + var _ab_ = i - 1 | 0; + if(0 !== i){var i = _ab_; continue;} + break; + } + } + return t; + } + function of_list_map(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _Z_ = caml_call1(f, hd), + ___ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, ___), _Z_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call1(f, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_mapi(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _X_ = caml_call2(f, 0, hd), + _Y_ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, _Y_), _X_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call2(f, i, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_rev_map(xs, f){ + var t = of_list_map(xs, f); + rev_inplace(t); + return t; + } + function of_list_rev_mapi(xs, f){ + var t = of_list_mapi(xs, f); + rev_inplace(t); + return t; + } + function filter_mapi(t, f){ + var + r = [0, [0]], + k = [0, 0], + _V_ = caml_call2(Base_Import[93], t.length - 1, 1), + _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + var match = caml_call2(f, i, t[1 + i]); + if(match){ + var a = match[1]; + if(0 === k[1]) r[1] = caml_call2(create, t.length - 1, a); + r[1][1 + k[1]] = a; + caml_call1(Base_Import[130], k); + } + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return k[1] === t.length - 1 + ? r[1] + : 0 < k[1] ? caml_call3(sub, r[1], 0, k[1]) : [0]; + } + function filter_map(t, f){ + return filter_mapi(t, function(i, a){return caml_call1(f, a);}); + } + function filter_opt(t){return filter_map(t, function(_T_){return _T_;});} + function check_length2_exn(name, t1, t2){ + var n1 = t1.length - 1, n2 = t2.length - 1, _S_ = n1 !== n2 ? 1 : 0; + return _S_ ? caml_call5(invalid_argf, _b_, name, n1, n2, 0) : _S_; + } + function iter2_exn(t1, t2, f){ + check_length2_exn(cst_Array_iter2_exn, t1, t2); + return caml_call2 + (iteri, t1, function(i, x1){return caml_call2(f, x1, t2[1 + i]);}); + } + function map2_exn(t1, t2, f){ + check_length2_exn(cst_Array_map2_exn, t1, t2); + return caml_call2 + (init, + t1.length - 1, + function(i){return caml_call2(f, t1[1 + i], t2[1 + i]);}); + } + function fold2_exn(t1, t2, init, f){ + check_length2_exn(cst_Array_fold2_exn, t1, t2); + return foldi + (t1, + init, + function(i, ac, x){return caml_call3(f, ac, x, t2[1 + i]);}); + } + function filter(t, f){ + return filter_map(t, function(x){return caml_call1(f, x) ? [0, x] : 0;}); + } + function filteri(t, f){ + return filter_mapi + (t, function(i, x){return caml_call2(f, i, x) ? [0, x] : 0;}); + } + function exists(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call1(f, t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function existsi(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function mem(t, a, equal){return exists(t, caml_call1(equal, a));} + function for_all(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call1(f, t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function for_alli(t, f){ + var + length = t.length - 1, + i = [0, caml_call2(Base_Import[93], length, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function exists2_exn(t1, t2, f){ + check_length2_exn(cst_Array_exists2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function for_all2_exn(t1, t2, f){ + check_length2_exn(cst_Array_for_all2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){caml_call1(Base_Import[129], i); continue;} + result[1] = 0; + continue; + } + return result[1]; + } + } + function equal(equal, t1, t2){ + var _R_ = t1.length - 1 === t2.length - 1 ? 1 : 0; + return _R_ ? for_all2_exn(t1, t2, equal) : _R_; + } + function map_inplace(t, f){ + var _P_ = caml_call2(Base_Import[93], t.length - 1, 1), _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + t[1 + i] = caml_call1(f, t[1 + i]); + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return 0; + } + function findi_internal(t, f, if_found, if_not_found){ + var length = t.length - 1; + if(0 === length) return caml_call1(if_not_found, 0); + var i = [0, 0], found = [0, 0], value_found = [0, t[1]]; + for(;;){ + if(! found[1] && i[1] < length){ + var value = t[1 + i[1]]; + if(caml_call2(f, i[1], value)){ + value_found[1] = value; + found[1] = 1; + } + else + caml_call1(Base_Import[130], i); + continue; + } + return found[1] + ? caml_call2(if_found, i[1], value_found[1]) + : caml_call1(if_not_found, 0); + } + } + function findi(t, f){ + function _N_(param){return 0;} + return findi_internal + (t, f, function(i, value){return [0, [0, i, value]];}, _N_); + } + function findi_exn(t, f){ + function _M_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _c_], 1); + } + return findi_internal + (t, f, function(i, value){return [0, i, value];}, _M_); + } + function find_exn(t, f){ + function _K_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _d_], 1); + } + function _L_(param, value){return value;} + return findi_internal + (t, function(i, x){return caml_call1(f, x);}, _L_, _K_); + } + function find(t, f){ + function _I_(param){var x = param[2]; return x;} + var _J_ = findi(t, function(i, x){return caml_call1(f, x);}); + return caml_call2(Base_Option[21], _J_, _I_); + } + function find_map(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call1(f, value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found = [0, Base_Import[252], _e_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call2(f, i[1], value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found$0 = [0, Base_Import[252], _f_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$0, 1); + var x = match[1]; + return x; + } + function find_consecutive_duplicate(t, equal){ + var n = t.length - 1; + if(1 >= n) return 0; + var result = [0, 0], i = [0, 1], prev = [0, t[1]]; + for(;;){ + if(i[1] >= n) return result[1]; + var cur = t[1 + i[1]]; + if(caml_call2(equal, cur, prev[1])){ + result[1] = [0, [0, prev[1], cur]]; + i[1] = n; + } + else{prev[1] = cur; caml_call1(Base_Import[130], i);} + } + } + function reduce(t, f){ + if(0 === t.length - 1) return 0; + var + r = [0, t[1]], + _G_ = caml_call2(Base_Import[93], t.length - 1, 1), + _F_ = 1; + if(_G_ >= 1){ + var i = _F_; + for(;;){ + r[1] = caml_call2(f, r[1], t[1 + i]); + var _H_ = i + 1 | 0; + if(_G_ !== i){var i = _H_; continue;} + break; + } + } + return [0, r[1]]; + } + function reduce_exn(t, f){ + var match = reduce(t, f); + if(! match) return caml_call1(Base_Import[126], cst_Array_reduce_exn); + var v = match[1]; + return v; + } + var permute = Base_Array_permute[24]; + function random_element_exn(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(is_empty(t)) + return caml_call1(Base_Import[124], cst_Array_random_element_exn_e); + var _E_ = caml_call2(Base_Random[18][6], random_state, t.length - 1); + return caml_check_bound(t, _E_)[1 + _E_]; + } + function random_element(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{var _C_ = [0, random_element_exn([0, random_state], t)]; return _C_;} + catch(_D_){return 0;} + } + function zip(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? 0 + : [0, map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];})]; + } + function zip_exn(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? caml_call1(Base_Import[124], cst_Array_zip_exn) + : map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];}); + } + function unzip(t){ + var n = t.length - 1; + if(0 === n) return [0, [0], [0]]; + var + match = caml_check_bound(t, 0)[1], + y = match[2], + x = match[1], + res1 = caml_call2(create, n, x), + res2 = caml_call2(create, n, y), + _A_ = caml_call2(Base_Import[93], n, 1), + _z_ = 1; + if(_A_ >= 1){ + var i = _z_; + for(;;){ + var + match$0 = caml_check_bound(t, i)[1 + i], + y$0 = match$0[2], + x$0 = match$0[1]; + caml_check_bound(res1, i)[1 + i] = x$0; + caml_check_bound(res2, i)[1 + i] = y$0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + return [0, res1, res2]; + } + function sorted_copy(t, compare){ + var t1 = caml_call1(copy, t); + sort$2(0, 0, t1, compare); + return t1; + } + function partitioni_tf(t, f){ + var + both = + caml_call2 + (mapi, + t, + function(i, x){return caml_call2(f, i, x) ? [0, x] : [1, x];}), + trues = + filter_map + (both, + function(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + }), + falses = + filter_map + (both, + function(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + }); + return [0, trues, falses]; + } + function partition_tf(t, f){ + return partitioni_tf(t, function(i, x){return caml_call1(f, x);}); + } + function last(t){ + var _y_ = caml_call2(Base_Import[93], t.length - 1, 1); + return caml_check_bound(t, _y_)[1 + _y_]; + } + function to_sequence_mutable(t){ + function _w_(i){ + if(t.length - 1 <= i) return 0; + var _x_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_check_bound(t, i)[1 + i], _x_]; + } + return caml_call2(Base_Sequence[41], 0, _w_); + } + function to_sequence(t){return to_sequence_mutable(caml_call1(copy, t));} + function cartesian_product(t1, t2){ + if(! is_empty(t1) && ! is_empty(t2)){ + var + n1 = t1.length - 1, + n2 = t2.length - 1, + _l_ = caml_check_bound(t2, 0)[1], + _m_ = [0, caml_check_bound(t1, 0)[1], _l_], + t = caml_call2(create, caml_call2(Base_Import[88], n1, n2), _m_), + r = [0, 0], + _o_ = caml_call2(Base_Import[93], n1, 1), + _n_ = 0; + if(_o_ >= 0){ + var i1 = _n_; + for(;;){ + var _q_ = caml_call2(Base_Import[93], n2, 1), _p_ = 0; + if(_q_ >= 0){ + var i2 = _p_; + for(;;){ + var + _s_ = caml_check_bound(t2, i2)[1 + i2], + _t_ = [0, caml_check_bound(t1, i1)[1 + i1], _s_], + _u_ = r[1]; + caml_check_bound(t, _u_)[1 + _u_] = _t_; + caml_call1(Base_Import[130], r); + var _v_ = i2 + 1 | 0; + if(_q_ !== i2){var i2 = _v_; continue;} + break; + } + } + var _r_ = i1 + 1 | 0; + if(_o_ !== i1){var i1 = _r_; continue;} + break; + } + } + return t; + } + return [0]; + } + function transpose(tt){ + if(0 === tt.length - 1) return [0, [0]]; + var width = tt.length - 1, depth = caml_check_bound(tt, 0)[1].length - 1; + return exists(tt, function(t){return t.length - 1 !== depth ? 1 : 0;}) + ? 0 + : [0, + caml_call2 + (init, + depth, + function(d){ + return caml_call2 + (init, + width, + function(w){ + return caml_check_bound(caml_check_bound(tt, w)[1 + w], d) + [1 + d]; + }); + })]; + } + function transpose_exn(tt){ + var match = transpose(tt); + if(! match) return caml_call1(Base_Import[126], cst_Array_transpose_exn); + var tt$0 = match[1]; + return tt$0; + } + function get$0(_k_, _j_){return caml_check_bound(_k_, _j_)[1 + _j_];} + function length(_i_){return _i_.length - 1;} + var + include = caml_call1(Base_Binary_searchable[2], [0, get$0, length]), + binary_search = include[1], + binary_search_segmented = include[2]; + function length$0(_h_){return _h_.length - 1;} + function create_like(len, t){ + if(0 === len) return [0]; + if(0 < t.length - 1) + return caml_call2(create, len, caml_check_bound(t, 0)[1]); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + var + unsafe_blit = runtime.caml_array_blit, + include$0 = + caml_call1(Base_Blit[4], [0, create_like, length$0, unsafe_blit]), + blit = include$0[1], + blito = include$0[2], + unsafe_blit$0 = include$0[3], + sub$0 = include$0[4], + subo = include$0[5]; + function invariant(invariant_a, t){ + return caml_call2(iter, t, invariant_a); + } + var + Base_Array = + [0, + compare, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + binary_search, + binary_search_segmented, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + max_length, + create, + create_float_uninitialized, + init, + make_matrix, + copy_matrix, + append, + concat, + copy, + fill, + blit, + blito, + unsafe_blit$0, + sub$0, + subo, + of_list, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + iteri, + mapi, + foldi, + fold_right, + sort$2, + stable_sort, + is_sorted, + is_sorted_strictly, + merge, + concat_map, + concat_mapi, + partition_tf, + partitioni_tf, + cartesian_product, + transpose, + transpose_exn, + filter_opt, + filter_map, + filter_mapi, + for_alli, + existsi, + counti, + iter2_exn, + map2_exn, + fold2_exn, + for_all2_exn, + exists2_exn, + filter, + filteri, + swap, + rev_inplace, + rev, + of_list_rev, + of_list_map, + of_list_mapi, + of_list_rev_map, + of_list_rev_mapi, + map_inplace, + find_exn, + find_map_exn, + findi, + findi_exn, + find_mapi, + find_mapi_exn, + find_consecutive_duplicate, + reduce, + reduce_exn, + permute, + random_element, + random_element_exn, + zip, + zip_exn, + unzip, + sorted_copy, + last, + equal, + to_sequence, + to_sequence_mutable, + [0, [0, Insertion_sort, Heap_sort, Intro_sort]]]; + runtime.caml_register_global(28, Base_Array, "Base__Array"); + return; + } + (globalThis)); + +//# 14994 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_float0_ml = "src/float0.ml", + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int64_neg = runtime.caml_int64_neg, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_Printf = global_data.Base__Printf, + Stdlib_Float = global_data.Stdlib__Float, + _g_ = [0, cst_src_float0_ml, 170, 4], + _f_ = [0, cst_src_float0_ml, 174, 4], + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = [0, runtime.caml_int64_create_lo_mi_hi(0, 0, 0)], + _a_ = + [0, + [8, + [0, 0, 0], + 0, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [8, + [0, 0, 0], + 0, + 0, + [11, " in float0.ml: modulus should be positive", 0]]]]]], + "%f %% %f in float0.ml: modulus should be positive"]; + function ceil(_p_){return Math.ceil(_p_);} + function floor(_o_){return Math.floor(_o_);} + function mod_float(_n_, _m_){return _n_ % _m_;} + var + modf = runtime.caml_modf_float, + float_of_string = runtime.caml_float_of_string, + nan = Base_Import[85][23], + infinity = Base_Import[85][21], + neg_infinity = Base_Import[85][22], + max_finite_value = Base_Import[85][24], + epsilon_float = Base_Import[85][26], + classify_float = runtime.caml_classify_float; + function abs_float(_l_){return Math.abs(_l_);} + var is_integer = Stdlib_Float[16]; + function symbol(_k_, _j_){return Math.pow(_k_, _j_);} + function symbol$0(a, b){ + if(caml_call2(Base_Import[108][1], b, 0.)) + caml_call4(Base_Printf[7], _a_, a, b, 0); + var m = a % b; + return caml_call2(Base_Import[108][1], m, 0.) + ? caml_call2(Base_Import[92], m, b) + : m; + } + var frexp = runtime.caml_frexp_float, ldexp = runtime.caml_ldexp_float; + function is_nan(x){return caml_call2(Base_Import[108][3], x, x);} + function to_int64_preserve_order(t){ + return is_nan(t) + ? 0 + : caml_call2 + (Base_Import[108][4], t, 0.) + ? _b_ + : caml_call2 + (Base_Import[108][5], t, 0.) + ? [0, caml_int64_bits_of_float(t)] + : [0, + caml_int64_neg + (caml_int64_bits_of_float(caml_call1(Base_Import[114], t)))]; + } + function to_int64_preserve_order_exn(x){ + var _i_ = to_int64_preserve_order(x); + return caml_call4(Base_Option[28], 0, 0, 0, _i_); + } + function of_int64_preserve_order(x){ + return runtime.caml_greaterequal(x, _c_) + ? caml_int64_float_of_bits(x) + : caml_call1 + (Base_Import[114], caml_int64_float_of_bits(caml_int64_neg(x))); + } + function one_ulp(dir, t){ + var match = to_int64_preserve_order(t); + if(! match) return Base_Import[85][23]; + var x = match[1], _h_ = 759637122 <= dir ? _d_ : _e_; + return of_int64_preserve_order(runtime.caml_int64_add(x, _h_)); + } + function upper_bound_for_int(num_bits){ + var exp = caml_call2(Base_Import[93], num_bits, 1); + return one_ulp(759637122, Math.pow(2., exp)); + } + function is_x_minus_one_exact(x){ + return 1 + - + runtime.caml_equal + (caml_int64_bits_of_float(x), + caml_int64_bits_of_float(caml_call2(Base_Import[94], x, 1.))); + } + function lower_bound_for_int(num_bits){ + var + exp = caml_call2(Base_Import[93], num_bits, 1), + min_int_as_float = caml_call1(Base_Import[114], Math.pow(2., exp)); + if(53 <= caml_call2(Base_Import[93], num_bits, 1)){ + if(is_x_minus_one_exact(min_int_as_float)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + return min_int_as_float; + } + if(is_x_minus_one_exact(min_int_as_float)) + return one_ulp(19067, caml_call2(Base_Import[94], min_int_as_float, 1.)); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[108][1], t, min) + ? min + : caml_call2(Base_Import[108][1], max, t) ? max : t; + } + var x = 0.; + function box(f){return caml_call2(Base_Import[92], f, x);} + var + include = Base_Import[108], + symbol$1 = include[1], + symbol$2 = include[2], + symbol$3 = include[3], + symbol$4 = include[4], + symbol$5 = include[5], + symbol$6 = include[6], + ascending = include[7], + descending = include[8], + compare = include[9], + equal = include[10], + max = include[11], + min = include[12], + Base_Float0 = + [0, + ceil, + floor, + mod_float, + modf, + float_of_string, + nan, + infinity, + neg_infinity, + max_finite_value, + epsilon_float, + classify_float, + abs_float, + is_integer, + symbol, + symbol$0, + frexp, + ldexp, + is_nan, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + upper_bound_for_int, + is_x_minus_one_exact, + lower_bound_for_int, + clamp_unchecked, + box, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + ascending, + descending, + compare, + equal, + max, + min]; + runtime.caml_register_global(21, Base_Float0, "Base__Float0"); + return; + } + (globalThis)); + +//# 15197 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Char", + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Stdlib_Format = global_data.Stdlib__Format, + Base_String0 = global_data.Base__String0, + Base_Char0 = global_data.Base__Char0, + Base_Identifiable = global_data.Base__Identifiable, + Base_Array0 = global_data.Base__Array0, + Base_Comparable = global_data.Base__Comparable, + failwithf = Base_Char0[1], + escaped = Base_Char0[2], + lowercase = Base_Char0[3], + to_int = Base_Char0[4], + unsafe_of_int = Base_Char0[5], + uppercase = Base_Char0[6], + min_value = Base_Char0[8], + max_value = Base_Char0[9], + of_int = Base_Char0[10], + of_int_exn = Base_Char0[11], + compare = Base_Import[227], + hash_fold_t = Base_Import[206], + func = Base_Import[220], + cst_char = "char", + cst_Char_get_hex_digit_exn_not = + "Char.get_hex_digit_exn: not a hexadecimal digit", + _d_ = + [0, + [11, "Char.get_digit_exn ", [1, [11, ": not a digit", 0]]], + "Char.get_digit_exn %C: not a digit"], + _b_ = [0, [1, 0], "%C"], + _a_ = [0, [11, "Char.of_string: ", [3, 0, 0]], "Char.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[165], + sexp_of_t = Base_Import[141], + t_sexp_grammar = Base_Import[185]; + function to_string(t){return caml_call2(Base_String0[9], 1, t);} + function of_string(s){ + return 1 === runtime.caml_ml_string_length(s) + ? runtime.caml_string_get(s, 0) + : caml_call3(failwithf, _a_, s, 0); + } + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + hashable = include[24]; + function pp(fmt, c){return caml_call3(Stdlib_Format[135], fmt, _b_, c);} + function invariant(param){return 0;} + var + _c_ = caml_call2(Base_Array0[11], 256, unsafe_of_int), + all = caml_call1(Base_Array0[15], _c_); + function is_lowercase(param){return 25 < param - 97 >>> 0 ? 0 : 1;} + function is_uppercase(param){return 25 < param - 65 >>> 0 ? 0 : 1;} + function is_print(param){return 94 < param - 32 >>> 0 ? 0 : 1;} + function is_whitespace(param){ + var switch$0 = 0; + if(14 <= param){ + if(32 === param) switch$0 = 1; + } + else if(9 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_digit(param){return 9 < param - 48 >>> 0 ? 0 : 1;} + function is_alpha(param){ + var switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_alphanum(param){ + var _u_ = param - 48 | 0, switch$0 = 0; + if(42 < _u_ >>> 0){ + if(25 >= _u_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _u_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_digit_unsafe(t){ + var _s_ = caml_call1(to_int, 48), _t_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _t_, _s_); + } + function get_digit_exn(t){ + return is_digit(t) + ? get_digit_unsafe(t) + : caml_call3(failwithf, _d_, t, 0); + } + function get_digit(t){return is_digit(t) ? [0, get_digit_unsafe(t)] : 0;} + function is_hex_digit(param){ + var _r_ = param - 48 | 0, switch$0 = 0; + if(22 < _r_ >>> 0){ + if(5 >= _r_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _r_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_lower(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 97 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_upper(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 65 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_hex_digit_exn(t){ + if(65 <= t){ + if(97 <= t){ + if(103 > t){ + var + _j_ = caml_call1(to_int, 97), + _k_ = caml_call1(to_int, t), + _l_ = caml_call2(Base_Import[93], _k_, _j_); + return caml_call2(Base_Import[91], _l_, 10); + } + } + else if(71 > t){ + var + _m_ = caml_call1(to_int, 65), + _n_ = caml_call1(to_int, t), + _o_ = caml_call2(Base_Import[93], _n_, _m_); + return caml_call2(Base_Import[91], _o_, 10); + } + } + else if(9 >= t - 48 >>> 0){ + var _p_ = caml_call1(to_int, 48), _q_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _q_, _p_); + } + var + _h_ = [0, [0, cst_char, caml_call1(sexp_of_t$0, t)], 0], + _i_ = caml_call2(Base_Sexp[9], cst_Char_get_hex_digit_exn_not, _h_); + return caml_call1(Base_Error[30], _i_); + } + function get_hex_digit(t){ + return is_hex_digit(t) ? [0, get_hex_digit_exn(t)] : 0; + } + var + symbol = Base_Import[106][6], + symbol$0 = Base_Import[106][2], + symbol$1 = Base_Import[106][4], + symbol$2 = Base_Import[106][5], + symbol$3 = Base_Import[106][1], + symbol$4 = Base_Import[106][3], + O = [0, symbol, symbol$0, symbol$1, symbol$2, symbol$3, symbol$4], + t_of_sexp$1 = Base_Import[165], + sexp_of_t$1 = Base_Import[141], + t_sexp_grammar$0 = Base_Import[185]; + function compare$0(c1, c2){ + var _f_ = caml_call1(lowercase, c2), _g_ = caml_call1(lowercase, c1); + return caml_call2(Base_Import[106][9], _g_, _f_); + } + function hash_fold_t$1(state, t){ + var _e_ = caml_call1(lowercase, t); + return caml_call2(Base_Import[206], state, _e_); + } + function hash$1(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$1, t);} + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$1]), + symbol$5 = include$0[1], + symbol$6 = include$0[2], + symbol$7 = include$0[3], + symbol$8 = include$0[4], + symbol$9 = include$0[5], + symbol$10 = include$0[6], + equal = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between$0 = include$0[13], + clamp_exn$0 = include$0[14], + clamp$0 = include$0[15], + comparator$0 = include$0[16], + include$1 = Base_Import[106], + symbol$11 = include$1[1], + symbol$12 = include$1[2], + symbol$13 = include$1[3], + symbol$14 = include$1[4], + symbol$15 = include$1[5], + symbol$16 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$0 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_Char = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$16, + symbol$12, + symbol$14, + symbol$15, + symbol$11, + symbol$13, + equal$0, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + O, + to_int, + of_int, + of_int_exn, + unsafe_of_int, + escaped, + lowercase, + uppercase, + is_digit, + is_lowercase, + is_uppercase, + is_alpha, + is_alphanum, + is_print, + is_whitespace, + get_digit, + get_digit_exn, + is_hex_digit, + is_hex_digit_lower, + is_hex_digit_upper, + get_hex_digit, + get_hex_digit_exn, + min_value, + max_value, + [0, + hash_fold_t$1, + hash$1, + t_of_sexp$1, + sexp_of_t$1, + t_sexp_grammar$0, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + equal, + compare$1, + min, + max, + ascending, + descending, + between$0, + clamp_exn$0, + clamp$0, + comparator$0]]; + runtime.caml_register_global(16, Base_Char, "Base__Char"); + return; + } + (globalThis)); + +//# 15530 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_unsafe_get = runtime.caml_string_unsafe_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Char = global_data.Base__Char, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import0 = global_data.Base__Import0; + function tr_create_map(target, replacement){ + var tr_map = caml_call1(Base_Bytes0[7], 256), i$3 = 0; + for(;;){ + caml_bytes_unsafe_set(tr_map, i$3, caml_call1(Base_Char[31], i$3)); + var _j_ = i$3 + 1 | 0; + if(255 !== i$3){var i$3 = _j_; continue;} + var + _b_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)) + - 1 + | 0, + _a_ = 0; + if(_b_ >= 0){ + var i$2 = _a_; + for(;;){ + var + index$0 = + caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$2)); + caml_bytes_unsafe_set + (tr_map, index$0, caml_string_unsafe_get(replacement, i$2)); + var _i_ = i$2 + 1 | 0; + if(_b_ !== i$2){var i$2 = _i_; continue;} + break; + } + } + var + last_replacement = + caml_string_unsafe_get + (replacement, caml_ml_string_length(replacement) - 1 | 0), + _c_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)), + _d_ = caml_ml_string_length(target) - 1 | 0; + if(_d_ >= _c_){ + var i$1 = _c_; + for(;;){ + var + index = caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$1)); + caml_bytes_unsafe_set(tr_map, index, last_replacement); + var _h_ = i$1 + 1 | 0; + if(_d_ !== i$1){var i$1 = _h_; continue;} + break; + } + } + var + first_target = runtime.caml_string_get(target, 0), + _f_ = + caml_bytes_unsafe_get(tr_map, caml_call1(Base_Char[29], first_target)); + if(! caml_call2(Base_Char[14], _f_, first_target)){ + var i = 0; + for(;;){ + if(256 === i) + var _g_ = 0; + else{ + var _e_ = caml_call1(Base_Char[31], i); + if(! caml_call2(Base_Char[14], caml_bytes_unsafe_get(tr_map, i), _e_)){var i$0 = i + 1 | 0, i = i$0; continue;} + var _g_ = 1; + } + if(! _g_) return 0; + break; + } + } + return [0, caml_call1(Base_Bytes0[16], tr_map)]; + } + } + var Base_Bytes_tr = [0, tr_create_map]; + runtime.caml_register_global(3, Base_Bytes_tr, "Base__Bytes_tr"); + return; + } + (globalThis)); + +//# 15631 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function stage(_b_){return _b_;} + function unstage(_a_){return _a_;} + var Base_Staged = [0, stage, unstage]; + runtime.caml_register_global(0, Base_Staged, "Base__Staged"); + return; + } + (globalThis)); + +//# 15644 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "", + cst_case_sensitive = "case_sensitive", + cst_char$1 = "char", + cst_escape_char$1 = "escape_char", + cst_pattern = "pattern", + cst_pos$1 = "pos", + cst_src_string_ml = "src/string.ml", + cst_str$1 = "str", + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$10 = cst$11, + cst$9 = cst$11, + cst$8 = cst$11, + cst$6 = cst$11, + cst$7 = cst$11, + cst$5 = cst$11, + cst$4 = cst$11, + cst$3 = cst$11, + cst$2 = cst$11, + cst$1 = cst$11, + cst$0 = cst$11, + cst = cst$11, + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Array0 = global_data.Base__Array0, + Stdlib_Format = global_data.Stdlib__Format, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Indexed_container = global_data.Base__Indexed_container, + Base_Container = global_data.Base__Container, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_String0 = global_data.Base__String0, + Base_Printf = global_data.Base__Printf, + Base_Error = global_data.Base__Error, + Base_Staged = global_data.Base__Staged, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + max_length = Base_String0[2], + symbol = Base_String0[3], + capitalize = Base_String0[4], + compare = Base_String0[5], + copy = Base_String0[6], + escaped = Base_String0[7], + lowercase = Base_String0[8], + make = Base_String0[9], + uncapitalize = Base_String0[11], + uppercase = Base_String0[13], + concat = Base_String0[14], + iter = Base_String0[15], + invalid_argf = Base_Printf[7], + raise_s = Base_Error[30], + stage = Base_Staged[1], + hash_fold_t = Base_Import[209], + func = Base_Import[223], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _G_ = [0, cst_src_string_ml, 1587, 2], + _F_ = [0, cst_src_string_ml, 1573, 19], + cst_char$0 = cst_char$1, + cst_pos$0 = cst_pos$1, + cst_escape_char$0 = cst_escape_char$1, + cst_str$0 = cst_str$1, + cst_rindex_from_exn_not_found = "rindex_from_exn: not found", + cst_rindex_from = "rindex_from", + cst_char = cst_char$1, + cst_pos = cst_pos$1, + cst_escape_char = cst_escape_char$1, + cst_str = cst_str$1, + cst_index_from_exn_not_found = "index_from_exn: not found", + cst_index_from = "index_from", + cst_is_char_literal = "is_char_literal", + cst_is_char_escaped = "is_char_escaped", + cst_is_char_escaping = "is_char_escaping", + _E_ = [0, [2, 0, [11, ": out of bounds", 0]], "%s: out of bounds"], + cst_escapeworthy_map = "escapeworthy_map", + cst_c_to = "c_to", + cst_c_from = "c_from", + cst_escapeworthy_map_not_one_t = "escapeworthy_map not one-to-one", + _D_ = [0, [3, 0, 0], "%S"], + _C_ = + [0, + [11, "String.chop_suffix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_suffix_exn %S %S"], + _B_ = + [0, + [11, "String.chop_prefix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_prefix_exn %S %S"], + cst_tr_multi_replacement_is_em = "tr_multi replacement is empty string", + _A_ = [0, cst_src_string_ml, 765, 17], + cst_suffix = "suffix", + cst_prefix = "prefix", + cst_drop_suffix = "drop_suffix", + cst_drop_prefix = "drop_prefix", + cst_expecting_nonnegative_argu = " expecting nonnegative argument", + _x_ = [0, [11, "String.init ", [4, 0, 0, 0, 0]], "String.init %d"], + _p_ = + [0, + [11, + "String.is_substring_at: invalid index ", + [4, 0, 0, 0, [11, " for string of length ", [4, 0, 0, 0, 0]]]], + "String.is_substring_at: invalid index %d for string of length %d"], + _g_ = [0, "kmp_array"], + _h_ = [0, cst_case_sensitive], + _i_ = [0, cst_pattern], + cst_substring = "substring", + cst_Substring_not_found = "Substring not found", + _e_ = [0, cst_case_sensitive], + _f_ = [0, cst_pattern], + cst_String_rindex_from_exn = "String.rindex_from_exn", + cst_String_index_from_exn = "String.index_from_exn", + _a_ = [0, "String.index_exn: not found"], + _b_ = [0, "String.index_from_exn: not found"], + _c_ = [0, "String.rindex_exn: not found"], + _d_ = [0, "String.rindex_from_exn: not found"], + _y_ = [0, "String.lsplit2_exn: not found"], + _z_ = [0, "String.rsplit2_exn: not found"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[163], + sexp_of_t = Base_Import[139], + t_sexp_grammar = Base_Import[183], + hashable = [0, hash, compare, sexp_of_t], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function sub(src, pos, len){ + if(0 === pos && len === caml_ml_string_length(src)) return src; + caml_call3 + (Base_Ordered_collection_common[2], pos, len, caml_ml_string_length(src)); + if(0 === len) return cst; + var dst = caml_call1(Base_Bytes0[7], len); + runtime.caml_blit_string(src, pos, dst, 0, len); + return caml_call1(Base_Bytes0[16], dst); + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var i$0 = caml_call2(Base_Import[93], caml_ml_string_length(src), pos); + return sub(src, pos, i$0); + } + function contains(opt, len, t, char$0){ + if(opt) var sth = opt[1], pos$1 = sth; else var pos$1 = 0; + var + total_length = caml_ml_string_length(t), + _dt_ = caml_call2(Base_Import[93], total_length, pos$1), + len$0 = caml_call2(Base_Option[27], len, _dt_); + caml_call3(Base_Ordered_collection_common[2], pos$1, len$0, total_length); + var end = caml_call2(Base_Import[91], pos$1, len$0), pos = pos$1; + for(;;){ + var _dq_ = pos < end ? 1 : 0; + if(_dq_){ + var + _dr_ = + caml_call2(Base_Char[15], caml_string_unsafe_get(t, pos), char$0); + if(! _dr_){ + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + continue; + } + var _ds_ = _dr_; + } + else + var _ds_ = _dq_; + return _ds_; + } + } + function is_empty(t){return 0 === caml_ml_string_length(t) ? 1 : 0;} + function index_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(len <= pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[91], pos$0, 1), pos$0 = pos$1; + } + } + function index_exn_internal(t, not_found, char$0){ + return index_from_exn_internal + (t, 0, caml_ml_string_length(t), not_found, char$0); + } + var not_found = [0, Base_Import[252], _a_]; + function index_exn(t, char$0){ + return index_exn_internal(t, not_found, char$0); + } + var not_found$0 = [0, Base_Import[252], _b_]; + function index_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(0 <= pos && len >= pos) + return index_from_exn_internal(t, pos, len, not_found$0, char$0); + return caml_call1(Base_Import[126], cst_String_index_from_exn); + } + function rindex_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(0 > pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[93], pos$0, 1), pos$0 = pos$1; + } + } + function rindex_exn_internal(t, not_found, char$0){ + var len = caml_ml_string_length(t); + return rindex_from_exn_internal + (t, caml_call2(Base_Import[93], len, 1), len, not_found, char$0); + } + var not_found$1 = [0, Base_Import[252], _c_]; + function rindex_exn(t, char$0){ + return rindex_exn_internal(t, not_found$1, char$0); + } + var not_found$2 = [0, Base_Import[252], _d_]; + function rindex_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(-1 <= pos && len > pos) + return rindex_from_exn_internal(t, pos, len, not_found$2, char$0); + return caml_call1(Base_Import[126], cst_String_rindex_from_exn); + } + function index(t, char$0){ + try{var _do_ = [0, index_exn(t, char$0)]; return _do_;} + catch(_dp_){ + var _dn_ = caml_wrap_exception(_dp_); + if(_dn_[1] !== Base_Import[252] && _dn_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dn_, 0); + return 0; + } + } + function rindex(t, char$0){ + try{var _dl_ = [0, rindex_exn(t, char$0)]; return _dl_;} + catch(_dm_){ + var _dk_ = caml_wrap_exception(_dm_); + if(_dk_[1] !== Base_Import[252] && _dk_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dk_, 0); + return 0; + } + } + function index_from(t, pos, char$0){ + try{var _di_ = [0, index_from_exn(t, pos, char$0)]; return _di_;} + catch(_dj_){ + var _dh_ = caml_wrap_exception(_dj_); + if(_dh_[1] !== Base_Import[252] && _dh_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dh_, 0); + return 0; + } + } + function rindex_from(t, pos, char$0){ + try{var _df_ = [0, rindex_from_exn(t, pos, char$0)]; return _df_;} + catch(_dg_){ + var _de_ = caml_wrap_exception(_dg_); + if(_de_[1] !== Base_Import[252] && _de_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_de_, 0); + return 0; + } + } + function sexp_of_t$0(param){ + var + case_sensitive = param[2], + pattern = param[1], + _dd_ = + [0, + [1, [0, _e_, [0, caml_call1(Base_Import[138], case_sensitive), 0]]], + 0]; + return [1, + [0, + [1, [0, _f_, [0, caml_call1(Base_Import[139], pattern), 0]]], + _dd_]]; + } + function pattern(t){return t[1];} + function case_sensitive(t){return t[2];} + function kmp_internal_loop + (matched_chars, next_text_char, pattern, kmp_array, char_equal){ + var matched_chars$0 = [0, matched_chars]; + for(;;){ + if + (0 < matched_chars$0[1] + && + ! + caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))){ + matched_chars$0[1] = + kmp_array[1 + caml_call2(Base_Import[93], matched_chars$0[1], 1)]; + continue; + } + if + (caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))) + matched_chars$0[1] = caml_call2(Base_Import[91], matched_chars$0[1], 1); + return matched_chars$0[1]; + } + } + function get_char_equal(case_sensitive){ + return case_sensitive ? Base_Char[15] : Base_Char[52][12]; + } + function create(pattern, case_sensitive){ + var + n = caml_ml_string_length(pattern), + kmp_array = caml_call2(Base_Array0[4], n, -1); + if(0 < n){ + var char_equal = get_char_equal(case_sensitive); + kmp_array[1] = 0; + var + matched_chars = [0, 0], + _db_ = caml_call2(Base_Import[93], n, 1), + _da_ = 1; + if(_db_ >= 1){ + var i = _da_; + for(;;){ + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], + caml_string_unsafe_get(pattern, i), + pattern, + kmp_array, + char_equal); + kmp_array[1 + i] = matched_chars[1]; + var _dc_ = i + 1 | 0; + if(_db_ !== i){var i = _dc_; continue;} + break; + } + } + } + return [0, pattern, case_sensitive, kmp_array]; + } + function index_internal(opt, param){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + return function(text){ + if + (0 <= pos + && + caml_call2 + (Base_Import[93], + caml_ml_string_length(text), + caml_ml_string_length(pattern)) + >= pos){ + var + char_equal = get_char_equal(case_sensitive), + j = [0, pos], + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text); + for(;;){ + if(j[1] < n && matched_chars[1] < k){ + var next_text_char = caml_string_unsafe_get(text, j[1]); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + j[1] = caml_call2(Base_Import[91], j[1], 1); + continue; + } + return matched_chars[1] === k + ? caml_call2(Base_Import[93], j[1], k) + : -1; + } + } + return -1;}; + } + function matches(t, str){ + return 0 <= caml_call1(index_internal(0, t), str) ? 1 : 0; + } + function index$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + return 0 <= p ? [0, p] : 0; + } + function index_exn$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + if(0 <= p) return p; + var _c$_ = [0, [0, cst_substring, caml_call1(Base_Import[139], t[1])], 0]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Substring_not_found, _c$_)); + } + function index_all(param, may_overlap, text){ + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + if(0 === caml_ml_string_length(pattern)){ + var + _c5_ = function(_c__){return _c__;}, + _c6_ = caml_call2(Base_Import[91], 1, caml_ml_string_length(text)); + return caml_call2(Base_List[123], _c6_, _c5_); + } + var + char_equal = get_char_equal(case_sensitive), + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text), + found = [0, 0], + _c7_ = 0; + if(n >= 0){ + var j = _c7_; + for(;;){ + if(matched_chars[1] === k){ + var _c8_ = found[1]; + found[1] = [0, caml_call2(Base_Import[93], j, k), _c8_]; + matched_chars[1] = + may_overlap ? kmp_array[1 + caml_call2(Base_Import[93], k, 1)] : 0; + } + if(j < n){ + var next_text_char = caml_string_unsafe_get(text, j); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + } + var _c9_ = j + 1 | 0; + if(n !== j){var j = _c9_; continue;} + break; + } + } + return caml_call1(Base_List[38], found[1]); + } + function replace_first(pos, t, s, with$0){ + var match = index$0(pos, t, s); + if(! match) return s; + var + i = match[1], + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + _cZ_ = caml_call2(Base_Import[91], len_s, len_with), + _c0_ = caml_call2(Base_Import[93], _cZ_, len_t), + dst = caml_call1(Base_Bytes0[7], _c0_); + caml_call5(Base_Bytes0[4], s, 0, dst, 0, i); + caml_call5(Base_Bytes0[4], with$0, 0, dst, i, len_with); + var + _c1_ = caml_call2(Base_Import[93], len_s, i), + _c2_ = caml_call2(Base_Import[93], _c1_, len_t), + _c3_ = caml_call2(Base_Import[91], i, len_with), + _c4_ = caml_call2(Base_Import[91], i, len_t); + caml_call5(Base_Bytes0[4], s, _c4_, dst, _c3_, _c2_); + return caml_call1(Base_Bytes0[16], dst); + } + function replace_all(t, s, with$0){ + var matches = index_all(t, 0, s); + if(! matches) return s; + var + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + num_matches = caml_call1(Base_List[7], matches), + _cR_ = caml_call2(Base_Import[93], len_with, len_t), + _cS_ = caml_call2(Base_Import[88], _cR_, num_matches), + _cT_ = caml_call2(Base_Import[91], len_s, _cS_), + dst = caml_call1(Base_Bytes0[7], _cT_), + next_dst_pos = [0, 0], + next_src_pos = [0, 0]; + function _cU_(i){ + var len = caml_call2(Base_Import[93], i, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], len); + var _cW_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + caml_call5(Base_Bytes0[4], with$0, 0, dst, _cW_, len_with); + var _cX_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + next_dst_pos[1] = caml_call2(Base_Import[91], _cX_, len_with); + var _cY_ = caml_call2(Base_Import[91], next_src_pos[1], len); + next_src_pos[1] = caml_call2(Base_Import[91], _cY_, len_t); + return 0; + } + caml_call2(Base_List[9], matches, _cU_); + var _cV_ = caml_call2(Base_Import[93], len_s, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], _cV_); + return caml_call1(Base_Bytes0[16], dst); + } + function split_on(t, s){ + var + pattern_len = caml_ml_string_length(t[1]), + matches = index_all(t, 0, s); + function _cM_(i, j){ + var + _cP_ = caml_call2(Base_Import[93], j, i), + _cQ_ = caml_call2(Base_Import[93], _cP_, pattern_len); + return sub(s, caml_call2(Base_Import[91], i, pattern_len), _cQ_); + } + var + _cN_ = + caml_call2(Base_Import[111], matches, [0, caml_ml_string_length(s), 0]), + _cO_ = [0, caml_call1(Base_Import[113], pattern_len), matches]; + return caml_call3(Base_List[83], _cO_, _cN_, _cM_); + } + function equal(a_002, b_003){ + if(caml_call2(Base_Ppx_compare_lib[1], a_002, b_003)) return 1; + var _cJ_ = caml_call2(Base_Import[246], a_002[1], b_003[1]); + if(_cJ_){ + var _cK_ = caml_call2(Base_Import[239], a_002[2], b_003[2]); + if(_cK_) + return caml_call3 + (Base_Import[248], Base_Import[242], a_002[3], b_003[3]); + var _cL_ = _cK_; + } + else + var _cL_ = _cJ_; + return _cL_; + } + function sexp_of_t$1(param){ + var + kmp_array_011 = param[3], + case_sensitive_009 = param[2], + pattern_007 = param[1], + arg_012 = caml_call2(Base_Import[153], Base_Import[142], kmp_array_011), + bnds_006 = [0, [1, [0, _g_, [0, arg_012, 0]]], 0], + arg_010 = caml_call1(Base_Import[138], case_sensitive_009), + bnds_006$0 = [0, [1, [0, _h_, [0, arg_010, 0]]], bnds_006], + arg_008 = caml_call1(Base_Import[139], pattern_007), + bnds_006$1 = [0, [1, [0, _i_, [0, arg_008, 0]]], bnds_006$0]; + return [1, bnds_006$1]; + } + function representation(_cI_){return _cI_;} + var Private = [0, equal, sexp_of_t$1, representation]; + function substr_index_gen(case_sensitive, pos, t, pattern){return index$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_exn_gen(case_sensitive, pos, t, pattern){return index_exn$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_all_gen(case_sensitive, t, may_overlap, pattern){return index_all(create(pattern, case_sensitive), may_overlap, t); + } + function substr_replace_first_gen(case_sensitive, pos, t, pattern){ + var _cG_ = create(pattern, case_sensitive); + return function(_cH_){return replace_first(pos, _cG_, t, _cH_);}; + } + function substr_replace_all_gen(case_sensitive, t, pattern){ + var _cE_ = create(pattern, case_sensitive); + return function(_cF_){return replace_all(_cE_, t, _cF_);}; + } + function is_substring_gen(case_sensitive, t, substring){ + var _cD_ = substr_index_gen(case_sensitive, 0, t, substring); + return caml_call1(Base_Option[50], _cD_); + } + var _j_ = 1; + function substr_index(_cA_, _cB_, _cC_){ + return substr_index_gen(_j_, _cA_, _cB_, _cC_); + } + var _k_ = 1; + function substr_index_exn(_cx_, _cy_, _cz_){ + return substr_index_exn_gen(_k_, _cx_, _cy_, _cz_); + } + var _l_ = 1; + function substr_index_all(_cu_, _cv_, _cw_){ + return substr_index_all_gen(_l_, _cu_, _cv_, _cw_); + } + var _m_ = 1; + function substr_replace_first(_cr_, _cs_, _ct_){ + return substr_replace_first_gen(_m_, _cr_, _cs_, _ct_); + } + var _n_ = 1; + function substr_replace_all(_cp_, _cq_){ + return substr_replace_all_gen(_n_, _cp_, _cq_); + } + var _o_ = 1; + function is_substring(_cn_, _co_){ + return is_substring_gen(_o_, _cn_, _co_); + } + function is_substring_at_gen(str, str_pos$1, sub, char_equal){ + var + str_len = caml_ml_string_length(str), + sub_len = caml_ml_string_length(sub), + _ck_ = str_pos$1 < 0 ? 1 : 0, + _cl_ = _ck_ || (str_len < str_pos$1 ? 1 : 0); + if(_cl_) caml_call4(invalid_argf, _p_, str_pos$1, str_len, 0); + var + _cm_ = caml_call2(Base_Import[91], str_pos$1, sub_len) <= str_len ? 1 : 0; + if(! _cm_) return _cm_; + var str_pos = str_pos$1, sub_pos = 0; + for(;;){ + if(sub_pos === sub_len) return 1; + if + (! + caml_call2 + (char_equal, + caml_string_unsafe_get(str, str_pos), + caml_string_unsafe_get(sub, sub_pos))) + return 0; + var + sub_pos$0 = caml_call2(Base_Import[91], sub_pos, 1), + str_pos$0 = caml_call2(Base_Import[91], str_pos, 1), + str_pos = str_pos$0, + sub_pos = sub_pos$0; + } + } + function is_suffix_gen(string, suffix, char_equal){ + var + string_len = caml_ml_string_length(string), + suffix_len = caml_ml_string_length(suffix), + _cj_ = suffix_len <= string_len ? 1 : 0; + return _cj_ + ? is_substring_at_gen + (string, + caml_call2(Base_Import[93], string_len, suffix_len), + suffix, + char_equal) + : _cj_; + } + function is_prefix_gen(string, prefix, char_equal){ + var + string_len = caml_ml_string_length(string), + prefix_len = caml_ml_string_length(prefix), + _ci_ = prefix_len <= string_len ? 1 : 0; + return _ci_ ? is_substring_at_gen(string, 0, prefix, char_equal) : _ci_; + } + var + t_of_sexp$0 = Base_Import[163], + sexp_of_t$2 = Base_Import[139], + t_sexp_grammar$0 = Base_Import[183]; + function compare$0(string1, string2){ + if(caml_call2(Base_Import[128], string1, string2)) return 0; + var + len2 = caml_ml_string_length(string2), + len1 = caml_ml_string_length(string1), + pos = 0; + for(;;){ + if(pos === len1) return pos === len2 ? 0 : -1; + if(pos === len2) return 1; + var + c2 = caml_string_unsafe_get(string2, pos), + c1 = caml_string_unsafe_get(string1, pos), + _cg_ = caml_call1(Base_Char[34], c2), + _ch_ = caml_call1(Base_Char[34], c1), + c = caml_call2(Base_Char[16], _ch_, _cg_); + if(0 !== c) return c; + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + } + } + function hash_fold_t$0(state, t){ + var + len = caml_ml_string_length(t), + state$0 = [0, caml_call2(Base_Import[207], state, len)], + _cd_ = caml_call2(Base_Import[93], len, 1), + _cc_ = 0; + if(_cd_ >= 0){ + var pos = _cc_; + for(;;){ + var _ce_ = caml_call1(Base_Char[34], caml_string_unsafe_get(t, pos)); + state$0[1] = caml_call2(Base_Import[206], state$0[1], _ce_); + var _cf_ = pos + 1 | 0; + if(_cd_ !== pos){var pos = _cf_; continue;} + break; + } + } + return state$0[1]; + } + function hash$0(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$0, t);} + function is_suffix(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[52][12]); + } + function is_prefix(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[52][12]); + } + var _q_ = 0; + function substr_index$0(_b$_, _ca_, _cb_){ + return substr_index_gen(_q_, _b$_, _ca_, _cb_); + } + var _r_ = 0; + function substr_index_exn$0(_b8_, _b9_, _b__){ + return substr_index_exn_gen(_r_, _b8_, _b9_, _b__); + } + var _s_ = 0; + function substr_index_all$0(_b5_, _b6_, _b7_){ + return substr_index_all_gen(_s_, _b5_, _b6_, _b7_); + } + var _t_ = 0; + function substr_replace_first$0(_b2_, _b3_, _b4_){ + return substr_replace_first_gen(_t_, _b2_, _b3_, _b4_); + } + var _u_ = 0; + function substr_replace_all$0(_b0_, _b1_){ + return substr_replace_all_gen(_u_, _b0_, _b1_); + } + var _v_ = 0; + function is_substring$0(_bY_, _bZ_){ + return is_substring_gen(_v_, _bY_, _bZ_); + } + var _w_ = Base_Char[52][12]; + function is_substring_at(_bV_){ + return function(_bW_){ + return function(_bX_){ + return is_substring_at_gen(_bV_, _bW_, _bX_, _w_);};}; + } + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$2]), + symbol$0 = include$0[1], + symbol$1 = include$0[2], + symbol$2 = include$0[3], + symbol$3 = include$0[4], + symbol$4 = include$0[5], + symbol$5 = include$0[6], + equal$0 = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between = include$0[13], + clamp_exn = include$0[14], + clamp = include$0[15], + comparator$0 = include$0[16]; + function of_string(_bU_){return _bU_;} + function to_string(_bT_){return _bT_;} + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _x_, n, 0); + var + t = caml_call1(Base_Bytes0[7], n), + _bR_ = caml_call2(Base_Import[93], n, 1), + _bQ_ = 0; + if(_bR_ >= 0){ + var i = _bQ_; + for(;;){ + caml_bytes_set(t, i, caml_call1(f, i)); + var _bS_ = i + 1 | 0; + if(_bR_ !== i){var i = _bS_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t); + } + function to_list(s){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_string_length(s), 1), + acc = 0, + i = i$1; + for(;;){ + if(0 > i) return acc; + var + i$0 = caml_call2(Base_Import[93], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function to_list_rev(s){ + var len = caml_ml_string_length(s), acc = 0, i = 0; + for(;;){ + if(i === len) return acc; + var + i$0 = caml_call2(Base_Import[91], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function rev(t){ + var + len = caml_ml_string_length(t), + res = caml_call1(Base_Bytes0[7], len), + _bN_ = caml_call2(Base_Import[93], len, 1), + _bM_ = 0; + if(_bN_ >= 0){ + var i = _bM_; + for(;;){ + var _bO_ = caml_call2(Base_Import[93], len, 1); + caml_bytes_unsafe_set + (res, + i, + caml_string_unsafe_get(t, caml_call2(Base_Import[93], _bO_, i))); + var _bP_ = i + 1 | 0; + if(_bN_ !== i){var i = _bP_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], res); + } + var not_found$3 = [0, Base_Import[252], _y_]; + function lsplit2_exn(line, delim){ + var + pos = index_exn_internal(line, not_found$3, delim), + _bJ_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bK_ = caml_call2(Base_Import[93], _bJ_, 1), + _bL_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bK_); + return [0, sub(line, 0, pos), _bL_]; + } + var not_found$4 = [0, Base_Import[252], _z_]; + function rsplit2_exn(line, delim){ + var + pos = rindex_exn_internal(line, not_found$4, delim), + _bG_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bH_ = caml_call2(Base_Import[93], _bG_, 1), + _bI_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bH_); + return [0, sub(line, 0, pos), _bI_]; + } + function lsplit2(line, on){ + try{var _bE_ = [0, lsplit2_exn(line, on)]; return _bE_;} + catch(_bF_){ + var _bD_ = caml_wrap_exception(_bF_); + if(_bD_[1] !== Base_Import[252] && _bD_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bD_, 0); + return 0; + } + } + function rsplit2(line, on){ + try{var _bB_ = [0, rsplit2_exn(line, on)]; return _bB_;} + catch(_bC_){ + var _bA_ = caml_wrap_exception(_bC_); + if(_bA_[1] !== Base_Import[252] && _bA_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bA_, 0); + return 0; + } + } + function char_list_mem(l, c){ + var l$0 = l; + for(;;){ + if(! l$0) return 0; + var tl = l$0[2], hd = l$0[1], _bz_ = caml_call2(Base_Char[15], hd, c); + if(_bz_) return _bz_; + var l$0 = tl; + } + } + function split_gen(str, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + last_pos = caml_ml_string_length(str), + pos$1 = caml_call2(Base_Import[93], last_pos, 1), + acc = 0, + last_pos$1 = last_pos, + last_pos$0 = pos$1; + for(;;){ + if(-1 === last_pos$0) return [0, sub(str, 0, last_pos$1), acc]; + if(is_delim(caml_string_get(str, last_pos$0))){ + var + pos1 = caml_call2(Base_Import[91], last_pos$0, 1), + sub_str = sub(str, pos1, caml_call2(Base_Import[93], last_pos$1, pos1)), + pos = caml_call2(Base_Import[93], last_pos$0, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + last_pos$1 = last_pos$0, + last_pos$0 = pos; + continue; + } + var + pos$0 = caml_call2(Base_Import[93], last_pos$0, 1), + last_pos$0 = pos$0; + } + } + function split(str, on){return split_gen(str, [0, -1044422954, on]);} + function split_on_chars(str, chars){ + return split_gen(str, [0, 552554919, chars]); + } + function back_up_at_newline(t, pos, eol){ + var switch$0 = 0; + if(0 < pos[1]){ + var _bx_ = caml_string_get(t, caml_call2(Base_Import[93], pos[1], 1)); + if(caml_call2(Base_Char[15], _bx_, 13)){var _by_ = 2; switch$0 = 1;} + } + if(! switch$0) var _by_ = 1; + pos[1] = caml_call2(Base_Import[93], pos[1], _by_); + eol[1] = caml_call2(Base_Import[91], pos[1], 1); + return 0; + } + function split_lines(t){ + var n = caml_ml_string_length(t); + if(0 === n) return 0; + var + pos = [0, caml_call2(Base_Import[93], n, 1)], + eol = [0, n], + ac = [0, 0], + _bt_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[15], _bt_, 10)) back_up_at_newline(t, pos, eol); + for(;;){ + if(0 > pos[1]){var _bw_ = ac[1]; return [0, sub(t, 0, eol[1]), _bw_];} + var _bu_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[14], _bu_, 10)){ + caml_call1(Base_Import[129], pos); + continue; + } + var start = caml_call2(Base_Import[91], pos[1], 1), _bv_ = ac[1]; + ac[1] = + [0, sub(t, start, caml_call2(Base_Import[93], eol[1], start)), _bv_]; + back_up_at_newline(t, pos, eol); + } + } + function is_suffix$0(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[15]); + } + function is_prefix$0(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[15]); + } + function is_substring_at$0(s, pos, substring){ + return is_substring_at_gen(s, pos, substring, Base_Char[15]); + } + function wrap_sub_n(t, n, name, pos, len, on_error){ + if(0 <= n) + try{var _bq_ = sub(t, pos, len); return _bq_;} + catch(_bs_){return on_error;} + var _br_ = caml_call2(symbol, name, cst_expecting_nonnegative_argu); + return caml_call1(Base_Import[126], _br_); + } + function drop_prefix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_prefix, + n, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$0); + } + function drop_suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_suffix, + 0, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$1); + } + function prefix(t, n){return wrap_sub_n(t, n, cst_prefix, 0, n, t);} + function suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_suffix, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + n, + t); + } + function lfindi(opt, t, f){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var n = caml_ml_string_length(t), i = pos; + for(;;){ + if(i === n) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function find(t, f){ + var match = lfindi(0, t, function(param, c){return caml_call1(f, c);}); + if(! match) return 0; + var i = match[1]; + return [0, caml_string_get(t, i)]; + } + function find_map(t, f){ + var n = caml_ml_string_length(t), i = 0; + for(;;){ + if(i === n) return 0; + var res = caml_call1(f, caml_string_get(t, i)); + if(res) return res; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function rfindi(pos, t, f){ + if(pos) + var pos$0 = pos[1], pos$1 = pos$0; + else + var pos$1 = caml_call2(Base_Import[93], caml_ml_string_length(t), 1); + var i = pos$1; + for(;;){ + if(0 > i) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0; + } + } + function last_non_drop(drop, t){ + return rfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function rstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop(drop, t); + if(! match) return cst$2; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function first_non_drop(drop, t){ + return lfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function lstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop(drop, t); + if(! match) return cst$3; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop(drop, t); + if(! match) return cst$4; + var first = match[1], match$0 = last_non_drop(drop, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var last = match$0[1], _bp_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _bp_, 1)); + } + } + return t; + } + function mapi(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bn_ = caml_call2(Base_Import[93], l, 1), + _bm_ = 0; + if(_bn_ >= 0){ + var i = _bm_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call2(f, i, caml_string_get(t, i))); + var _bo_ = i + 1 | 0; + if(_bn_ !== i){var i = _bo_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function map(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bk_ = caml_call2(Base_Import[93], l, 1), + _bj_ = 0; + if(_bk_ >= 0){ + var i = _bj_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call1(f, caml_string_get(t, i))); + var _bl_ = i + 1 | 0; + if(_bk_ !== i){var i = _bl_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function to_array(s){ + function _bi_(i){return caml_string_get(s, i);} + return caml_call2(Base_Array0[11], caml_ml_string_length(s), _bi_); + } + function exists(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bf_ = i < len ? 1 : 0; + if(_bf_){ + var _bg_ = caml_call1(f, caml_string_get(s, i)); + if(! _bg_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bh_ = _bg_; + } + else + var _bh_ = _bf_; + return _bh_; + } + } + function for_all(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bc_ = i === len ? 1 : 0; + if(_bc_) + var _bd_ = _bc_; + else{ + var _be_ = caml_call1(f, caml_string_get(s, i)); + if(_be_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bd_ = _be_; + } + return _bd_; + } + } + function fold(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call2(f, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call3(f, i, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function iteri(t, f){ + var + _ba_ = caml_call2(Base_Import[93], caml_ml_string_length(t), 1), + _a$_ = 0; + if(_ba_ >= 0){ + var i = _a$_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(t, i)); + var _bb_ = i + 1 | 0; + if(_ba_ !== i){var i = _bb_; continue;} + break; + } + } + return 0; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t){return caml_call2(Base_Container[3], fold, t);} + function max_elt(t){return caml_call2(Base_Container[4], fold, t);} + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _a9_ = caml_call3(Base_Container[9], fold, init, f); + return function(_a__){return caml_call2(_a9_, _a__, t);}; + } + function find_mapi(t, f){ + return caml_call3(Base_Indexed_container[7], iteri, t, f); + } + function findi(t, f){ + return caml_call3(Base_Indexed_container[6], iteri, t, f); + } + function counti(t, f){ + return caml_call3(Base_Indexed_container[3], foldi, t, f); + } + function for_alli(t, f){ + return caml_call3(Base_Indexed_container[5], iteri, t, f); + } + function existsi(t, f){ + return caml_call3(Base_Indexed_container[4], iteri, t, f); + } + function mem(t, c){ + var len = caml_ml_string_length(t), i = 0; + for(;;){ + var _a6_ = i < len ? 1 : 0; + if(_a6_){ + var _a7_ = caml_call2(Base_Char[15], c, caml_string_unsafe_get(t, i)); + if(! _a7_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _a8_ = _a7_; + } + else + var _a8_ = _a6_; + return _a8_; + } + } + function tr(target, replacement, s){ + return caml_call2(Base_Char[15], target, replacement) + ? s + : mem + (s, target) + ? map + (s, + function(c){ + return caml_call2(Base_Char[15], c, target) + ? replacement + : c; + }) + : s; + } + function tr_multi(target, replacement){ + if(is_empty(target)) + return caml_call1(stage, function(_a5_){return _a5_;}); + if(is_empty(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_em); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_a4_){return _a4_;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + return exists + (s, + function(c){ + var + _a3_ = + caml_string_unsafe_get(tr_map, caml_call1(Base_Char[29], c)); + return caml_call2(Base_Char[14], c, _a3_); + }) + ? map + (s, + function(c){ + return caml_string_unsafe_get + (tr_map, caml_call1(Base_Char[29], c)); + }) + : s; + }); + } + function concat_array(sep, ar){ + return caml_call2(concat, sep, caml_call1(Base_Array0[15], ar)); + } + function concat_map(sep, s, f){ + var _a2_ = to_array(s); + return concat_array(sep, caml_call2(Base_Array0[20], _a2_, f)); + } + function filter(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n && caml_call1(f, caml_string_get(t, i[1]))){caml_call1(Base_Import[130], i); continue;} + if(i[1] === n) return t; + var + _a0_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _a0_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _a1_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _a1_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call1(f, c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function filteri(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n){ + var _aX_ = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], _aX_)){ + caml_call1(Base_Import[130], i); + continue; + } + } + if(i[1] === n) return t; + var + _aY_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _aY_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _aZ_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _aZ_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function chop_prefix(s, prefix){ + return is_prefix$0(s, prefix) + ? [0, drop_prefix(s, caml_ml_string_length(prefix))] + : 0; + } + function chop_prefix_if_exists(s, prefix){ + return is_prefix$0(s, prefix) + ? drop_prefix(s, caml_ml_string_length(prefix)) + : s; + } + function chop_prefix_exn(s, prefix){ + var match = chop_prefix(s, prefix); + if(! match) return caml_call4(invalid_argf, _B_, s, prefix, 0); + var str = match[1]; + return str; + } + function chop_suffix(s, suffix){ + return is_suffix$0(s, suffix) + ? [0, drop_suffix(s, caml_ml_string_length(suffix))] + : 0; + } + function chop_suffix_if_exists(s, suffix){ + return is_suffix$0(s, suffix) + ? drop_suffix(s, caml_ml_string_length(suffix)) + : s; + } + function chop_suffix_exn(s, suffix){ + var match = chop_suffix(s, suffix); + if(! match) return caml_call4(invalid_argf, _C_, s, suffix, 0); + var str = match[1]; + return str; + } + function shorter(a, b){ + return caml_ml_string_length(a) <= caml_ml_string_length(b) ? a : b; + } + function shortest(list){ + if(! list) return cst$5; + var rest = list[2], first = list[1]; + return caml_call3(Base_List[10], rest, first, shorter); + } + function pos_from_left(param, i){return i;} + function pos_from_right(t, i){ + var _aW_ = caml_call2(Base_Import[93], caml_ml_string_length(t), i); + return caml_call2(Base_Import[93], _aW_, 1); + } + function common_generic2_length_loop(a, b, get_pos, max_len, len_so_far){ + var len_so_far$0 = len_so_far; + for(;;){ + if(max_len <= len_so_far$0) return max_len; + var + _aU_ = caml_string_unsafe_get(b, caml_call2(get_pos, b, len_so_far$0)), + _aV_ = caml_string_unsafe_get(a, caml_call2(get_pos, a, len_so_far$0)); + if(! caml_call2(Base_Char[15], _aV_, _aU_)) return len_so_far$0; + var + len_so_far$1 = caml_call2(Base_Import[91], len_so_far$0, 1), + len_so_far$0 = len_so_far$1; + } + } + function common_generic2_length(a, b, get_pos){ + var + max_len = + caml_call2 + (Base_Import[101], caml_ml_string_length(a), caml_ml_string_length(b)); + return common_generic2_length_loop(a, b, get_pos, max_len, 0); + } + function common_generic_length_loop(first, list, get_pos, max_len){ + var first$0 = first, list$0 = list, max_len$0 = max_len; + for(;;){ + if(! list$0) return max_len$0; + var + rest = list$0[2], + second = list$0[1], + max_len$1 = + common_generic2_length_loop(first$0, second, get_pos, max_len$0, 0), + first$0 = second, + list$0 = rest, + max_len$0 = max_len$1; + } + } + function common_generic_length(list, get_pos){ + if(! list) return 0; + var + rest = list[2], + first = list[1], + max_len = caml_ml_string_length(shortest(list)); + return common_generic_length_loop(first, rest, get_pos, max_len); + } + function common_generic2(a, b, get_pos, take){ + var len = common_generic2_length(a, b, get_pos); + return caml_call2(take, shorter(a, b), len); + } + function common_generic(list, get_pos, take){ + if(! list) return cst$7; + var + rest = list[2], + first = list[1], + s = shortest(list), + max_len = caml_ml_string_length(s); + if(0 === max_len) return cst$6; + var len = common_generic_length_loop(first, rest, get_pos, max_len); + return caml_call2(take, s, len); + } + function common_prefix(list){ + return common_generic(list, pos_from_left, prefix); + } + function common_suffix(list){ + return common_generic(list, pos_from_right, suffix); + } + function common_prefix2(a, b){ + return common_generic2(a, b, pos_from_left, prefix); + } + function common_suffix2(a, b){ + return common_generic2(a, b, pos_from_right, suffix); + } + function common_prefix_length(list){ + return common_generic_length(list, pos_from_left); + } + function common_suffix_length(list){ + return common_generic_length(list, pos_from_right); + } + function common_prefix2_length(a, b){ + return common_generic2_length(a, b, pos_from_left); + } + function common_suffix2_length(a, b){ + return common_generic2_length(a, b, pos_from_right); + } + function pp(ppf, string){ + return caml_call3(Stdlib_Format[135], ppf, _D_, string); + } + function of_char(c){return caml_call2(make, 1, c);} + function of_char_list(l){ + var + _aS_ = caml_call1(Base_List[7], l), + t = caml_call1(Base_Bytes0[7], _aS_); + function _aT_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _aT_); + return caml_call1(Base_Bytes0[16], t); + } + function build_and_validate_escapeworth + (escapeworthy_map, escape_char, func){ + var + escapeworthy_map$0 = + caml_call3 + (Base_List[129][7], escapeworthy_map, Base_Char[15], escape_char) + ? escapeworthy_map + : [0, [0, escape_char, escape_char], escapeworthy_map], + arr = caml_call2(Base_Array0[4], 256, -1), + vals = caml_call2(Base_Array0[4], 256, 0), + param = escapeworthy_map$0; + for(;;){ + if(! param) return [0, arr]; + var l = param[2], match = param[1], c_to = match[2], c_from = match[1]; + if(919809722 <= func) + var v = c_from, k = caml_call1(Base_Char[29], c_to); + else + var k$0 = caml_call1(Base_Char[29], c_from), v = c_to, k = k$0; + if(-1 === caml_check_bound(arr, k)[1 + k]){ + var _aK_ = caml_call1(Base_Char[29], v); + if(! caml_check_bound(vals, _aK_)[1 + _aK_]){ + var _aQ_ = caml_call1(Base_Char[29], v); + caml_check_bound(arr, k)[1 + k] = _aQ_; + var _aR_ = caml_call1(Base_Char[29], v); + caml_check_bound(vals, _aR_)[1 + _aR_] = 1; + var param = l; + continue; + } + } + var + _aL_ = caml_call2(Base_Import[150], Base_Import[141], Base_Import[141]), + _aM_ = + [0, + [0, + cst_escapeworthy_map, + caml_call2(Base_Import[152], _aL_, escapeworthy_map$0)], + 0], + _aN_ = [0, [0, cst_c_to, caml_call1(Base_Import[141], c_to)], _aM_], + _aO_ = [0, [0, cst_c_from, caml_call1(Base_Import[141], c_from)], _aN_], + _aP_ = caml_call2(Base_Sexp[9], cst_escapeworthy_map_not_one_t, _aO_); + return caml_call1(Base_Or_error[35], _aP_); + } + } + function escape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 258914209); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var + to_escape_len = [0, 0], + to_escape = + foldi + (src, + 0, + function(i, acc, c){ + var + _aJ_ = caml_call1(Base_Char[29], c), + n = caml_check_bound(escapeworthy, _aJ_)[1 + _aJ_]; + return -1 === n + ? acc + : (caml_call1 + (Base_Import[130], to_escape_len), + [0, [0, i, caml_call1(Base_Char[32], n)], acc]); + }); + if(! to_escape) return src; + var + last_idx = caml_ml_string_length(src), + last_dst_pos = + caml_call2(Base_Import[91], last_idx, to_escape_len[1]), + dst = caml_call1(Base_Bytes0[7], last_dst_pos), + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param = to_escape; + for(;;){ + if(param){ + var + to_escape$0 = param[2], + match = param[1], + escaped_char = match[2], + last_idx$1 = match[1], + _aH_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _aH_, 1), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aI_ = caml_call2(Base_Import[91], last_idx$1, 1); + caml_call5(Base_Bytes0[4], src, _aI_, dst, dst_pos, len); + var last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 2); + caml_bytes_set(dst, last_dst_pos$1, escape_char); + caml_bytes_set + (dst, + caml_call2(Base_Import[91], last_dst_pos$1, 1), + escaped_char); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param = to_escape$0; + continue; + } + caml_call5(Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + return caml_call1(Base_Bytes0[16], dst); + } + }]; + } + function escape_gen_exn(escapeworthy_map, escape_char){ + var _aG_ = escape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _aG_)); + } + function escape(escapeworthy, escape_char){ + var + _aE_ = caml_call2(Base_List[114], escapeworthy, Base_Char[16]), + _aF_ = Base_List[76], + escapeworthy_map = caml_call2(_aF_, _aE_, function(c){return [0, c, c];}); + return escape_gen_exn(escapeworthy_map, escape_char); + } + function unescape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 919809722); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var i = 0, status = -512962225, to_unescape = 0; + for(;;){ + if(caml_ml_string_length(src) <= i){ + if(! to_unescape) return src; + var + to_unescape$0 = to_unescape[2], + idx = to_unescape[1], + _ax_ = caml_call1(Base_List[7], to_unescape), + _ay_ = + caml_call2 + (Base_Import[93], caml_ml_string_length(src), _ax_), + dst = caml_call1(Base_Bytes0[7], _ay_), + loop = + function(last_idx, last_dst_pos, param){ + var + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param$0 = param; + for(;;){ + if(! param$0) + return caml_call5 + (Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + var + to_unescape = param$0[2], + last_idx$1 = param$0[1], + _az_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _az_, 2), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aA_ = caml_call2(Base_Import[91], last_idx$1, 2); + caml_call5(Base_Bytes0[4], src, _aA_, dst, dst_pos, len); + var + last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 1), + _aB_ = + caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)), + _aC_ = caml_call1(Base_Char[29], _aB_), + n = caml_check_bound(escapeworthy, _aC_)[1 + _aC_], + _aD_ = + -1 === n + ? caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)) + : caml_call1(Base_Char[32], n); + caml_bytes_set(dst, last_dst_pos$1, _aD_); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param$0 = to_unescape; + } + }; + if + (idx + < caml_call2(Base_Import[93], caml_ml_string_length(src), 1)) + loop + (caml_ml_string_length(src), + caml_ml_bytes_length(dst), + to_unescape); + else + loop + (caml_call2(Base_Import[93], caml_ml_string_length(src), 1), + caml_ml_bytes_length(dst), + to_unescape$0); + return caml_call1(Base_Bytes0[16], dst); + } + if(-512962225 <= status) + var + _aw_ = caml_string_get(src, i), + status$0 = + caml_call2(Base_Char[15], _aw_, escape_char) + ? -767030498 + : -512962225; + else + var status$0 = -244189789; + var + acc = + -512962225 <= status$0 ? to_unescape : [0, i, to_unescape], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + status = status$0, + to_unescape = acc; + } + }]; + } + function unescape_gen_exn(escapeworthy_map, escape_char){ + var _av_ = unescape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _av_)); + } + function unescape(escape_char){return unescape_gen_exn(0, escape_char);} + function preceding_escape_chars(str, escape_char, pos){ + var p$1 = caml_call2(Base_Import[93], pos, 1), p = p$1, cnt = 0; + for(;;){ + if(0 <= p){ + var _au_ = caml_string_get(str, p); + if(! caml_call2(Base_Char[14], _au_, escape_char)){ + var + cnt$0 = caml_call2(Base_Import[91], cnt, 1), + p$0 = caml_call2(Base_Import[93], p, 1), + p = p$0, + cnt = cnt$0; + continue; + } + } + return cnt; + } + } + function update_escape_status(str, escape_char, i, param){ + if(-512962225 > param) return -244189789; + var _at_ = caml_string_get(str, i); + return caml_call2(Base_Char[15], _at_, escape_char) + ? -767030498 + : -512962225; + } + function escape_status(str, escape_char, pos){ + var + _ar_ = preceding_escape_chars(str, escape_char, pos), + odd = 1 === caml_call2(Base_Import[122], _ar_, 2) ? 1 : 0, + _as_ = caml_string_get(str, pos), + match = caml_call2(Base_Char[15], _as_, escape_char); + return odd ? -244189789 : match ? -767030498 : -512962225; + } + function check_bound(str, pos, function_name){ + var + _ap_ = caml_ml_string_length(str) <= pos ? 1 : 0, + _aq_ = _ap_ || (pos < 0 ? 1 : 0); + return _aq_ ? caml_call3(invalid_argf, _E_, function_name, 0) : _aq_; + } + function is_char_escaping(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaping); + return -512962225 <= escape_status(str, escape_char, pos) ? 0 : 1; + } + function is_char_escaped(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaped); + return -244189789 <= escape_status(str, escape_char, pos) ? 1 : 0; + } + function is_char_literal(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_literal); + return -512962225 === escape_status(str, escape_char, pos) ? 1 : 0; + } + function index_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_index_from); + var + status$1 = escape_status(str, escape_char, pos), + i = pos, + status = status$1; + for(;;){ + if(pos <= i){ + var _an_ = -512962225 === status ? 1 : 0; + if(_an_){ + var _ao_ = caml_string_get(str, i); + if(caml_call2(Base_Char[15], _ao_, char$0)) return [0, i]; + } + } + var i$0 = caml_call2(Base_Import[91], i, 1); + if(caml_ml_string_length(str) <= i$0) return 0; + var + status$0 = update_escape_status(str, escape_char, i$0, status), + i = i$0, + status = status$0; + } + } + function index_from_exn$0(str, escape_char, pos, char$0){ + var match = index_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _aj_ = [0, [0, cst_char, caml_call1(Base_Import[141], char$0)], 0], + _ak_ = [0, [0, cst_pos, caml_call1(Base_Import[142], pos)], _aj_], + _al_ = + [0, + [0, cst_escape_char, caml_call1(Base_Import[141], escape_char)], + _ak_], + _am_ = [0, [0, cst_str, caml_call1(sexp_of_t, str)], _al_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_index_from_exn_not_found, _am_)); + } + function index$1(str, escape_char, char$0){ + return index_from$0(str, escape_char, 0, char$0); + } + function index_exn$1(str, escape_char, char$0){ + return index_from_exn$0(str, escape_char, 0, char$0); + } + function rindex_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_rindex_from); + if(caml_call2(Base_Char[15], char$0, escape_char)) return 0; + var pos$0 = pos; + for(;;){ + if(0 > pos$0) return 0; + var escape_chars = preceding_escape_chars(str, escape_char, pos$0); + if(0 === caml_call2(Base_Import[122], escape_chars, 2)){ + var _ah_ = caml_string_get(str, pos$0); + if(caml_call2(Base_Char[15], _ah_, char$0)) return [0, pos$0]; + } + var + _ai_ = caml_call2(Base_Import[93], pos$0, escape_chars), + pos$1 = caml_call2(Base_Import[93], _ai_, 1), + pos$0 = pos$1; + } + } + function rindex_from_exn$0(str, escape_char, pos, char$0){ + var match = rindex_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _ad_ = [0, [0, cst_char$0, caml_call1(Base_Import[141], char$0)], 0], + _ae_ = [0, [0, cst_pos$0, caml_call1(Base_Import[142], pos)], _ad_], + _af_ = + [0, + [0, cst_escape_char$0, caml_call1(Base_Import[141], escape_char)], + _ae_], + _ag_ = [0, [0, cst_str$0, caml_call1(sexp_of_t, str)], _af_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_rindex_from_exn_not_found, _ag_)); + } + function rindex$0(str, escape_char, char$0){ + return is_empty(str) + ? 0 + : rindex_from$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function rindex_exn$0(str, escape_char, char$0){ + return rindex_from_exn$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function split_gen$0(str, escape_char, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + len = caml_ml_string_length(str), + acc = 0, + status = -512962225, + last_pos = 0, + pos = 0; + for(;;){ + if(pos === len){ + var + _ab_ = + [0, + sub(str, last_pos, caml_call2(Base_Import[93], len, last_pos)), + acc]; + return caml_call1(Base_List[38], _ab_); + } + var + status$0 = update_escape_status(str, escape_char, pos, status), + _ac_ = -512962225 === status$0 ? 1 : 0; + if(_ac_ && is_delim(caml_string_get(str, pos))){ + var + sub_str = + sub(str, last_pos, caml_call2(Base_Import[93], pos, last_pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + last_pos$0 = caml_call2(Base_Import[91], pos, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + status = status$0, + last_pos = last_pos$0, + pos = pos$0; + continue; + } + var + pos$1 = caml_call2(Base_Import[91], pos, 1), + status = status$0, + pos = pos$1; + } + } + function split$0(str, on){ + var _$_ = [0, -1044422954, on]; + return function(_aa_){return split_gen$0(str, _aa_, _$_);}; + } + function split_on_chars$0(str, chars){ + var _Z_ = [0, 552554919, chars]; + return function(___){return split_gen$0(str, ___, _Z_);}; + } + function split_at(str, pos){ + var + _W_ = caml_call2(Base_Import[93], caml_ml_string_length(str), pos), + _X_ = caml_call2(Base_Import[93], _W_, 1), + _Y_ = sub(str, caml_call2(Base_Import[91], pos, 1), _X_); + return [0, sub(str, 0, pos), _Y_]; + } + function lsplit2$0(str, on, escape_char){ + function _U_(x){return split_at(str, x);} + var _V_ = index$1(str, escape_char, on); + return caml_call2(Base_Option[21], _V_, _U_); + } + function rsplit2$0(str, on, escape_char){ + function _S_(x){return split_at(str, x);} + var _T_ = rindex$0(str, escape_char, on); + return caml_call2(Base_Option[21], _T_, _S_); + } + function lsplit2_exn$0(str, on, escape_char){ + return split_at(str, index_exn$1(str, escape_char, on)); + } + function rsplit2_exn$0(str, on, escape_char){ + return split_at(str, rindex_exn$0(str, escape_char, on)); + } + function last_non_drop_literal(drop, escape_char, t){ + return rfindi + (0, + t, + function(i, c){ + var _P_ = 1 - caml_call1(drop, c); + if(_P_) + var _Q_ = _P_; + else{ + var _R_ = is_char_escaping(t, escape_char, i); + if(! _R_) return is_char_escaped(t, escape_char, i); + var _Q_ = _R_; + } + return _Q_; + }); + } + function first_non_drop_literal(drop, escape_char, t){ + return lfindi + (0, + t, + function(i, c){ + var _M_ = 1 - caml_call1(drop, c); + if(_M_) + var _N_ = _M_; + else{ + var _O_ = is_char_escaping(t, escape_char, i); + if(! _O_) return is_char_escaped(t, escape_char, i); + var _N_ = _O_; + } + return _N_; + }); + } + function rstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop_literal(drop, escape_char, t); + if(! match) return cst$8; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function lstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$9; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$10; + var + first = match[1], + match$0 = last_non_drop_literal(drop, escape_char, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var last = match$0[1], _L_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _L_, 1)); + } + } + return t; + } + function between$0(t, low, high){ + var _K_ = caml_call2(Base_Import[109][2], low, t); + return _K_ ? caml_call2(Base_Import[109][2], t, high) : _K_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[109][1], t, min) + ? min + : caml_call2(Base_Import[109][2], t, max) ? t : max; + } + function clamp_exn$0(t, min, max){ + if(caml_call2(Base_Import[109][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + } + function clamp$0(t, min, max){ + if(! caml_call2(Base_Import[109][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _H_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _I_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _H_], + _J_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _I_); + return caml_call1(Base_Or_error[35], _J_); + } + function create$0(opt, pattern){ + if(opt) + var sth = opt[1], case_sensitive = sth; + else + var case_sensitive = 1; + return create(pattern, case_sensitive); + } + var + include$1 = Base_Import[109], + symbol$6 = include$1[1], + symbol$7 = include$1[2], + symbol$8 = include$1[3], + symbol$9 = include$1[4], + symbol$10 = include$1[5], + symbol$11 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$1 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_String = + [0, + t_sexp_grammar, + sub, + subo, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + iteri, + existsi, + for_alli, + counti, + findi, + find_mapi, + hash_fold_t, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$11, + symbol$7, + symbol$9, + symbol$10, + symbol$6, + symbol$8, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator, + pp, + hashable, + invariant, + max_length, + make, + copy, + init, + symbol, + concat, + escaped, + contains, + uppercase, + lowercase, + capitalize, + uncapitalize, + [0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$2, + t_sexp_grammar$0, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal$0, + compare$1, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator$0, + is_suffix, + is_prefix, + is_substring$0, + is_substring_at, + substr_index$0, + substr_index_exn$0, + substr_index_all$0, + substr_replace_first$0, + substr_replace_all$0], + index, + index_exn, + index_from, + index_from_exn, + rindex, + rindex_exn, + rindex_from, + rindex_from_exn, + [0, + sexp_of_t$0, + create$0, + pattern, + case_sensitive, + matches, + index$0, + index_exn$0, + index_all, + replace_first, + replace_all, + split_on, + Private], + substr_index, + substr_index_exn, + substr_index_all, + substr_replace_first, + substr_replace_all, + is_substring, + is_substring_at$0, + to_list_rev, + rev, + is_suffix$0, + is_prefix$0, + lsplit2_exn, + rsplit2_exn, + lsplit2, + rsplit2, + split, + split_on_chars, + split_lines, + lfindi, + rfindi, + lstrip, + rstrip, + strip, + map, + mapi, + foldi, + concat_map, + filter, + filteri, + tr, + tr_multi, + chop_suffix_exn, + chop_prefix_exn, + chop_suffix, + chop_prefix, + chop_suffix_if_exists, + chop_prefix_if_exists, + suffix, + prefix, + drop_suffix, + drop_prefix, + common_suffix, + common_prefix, + common_suffix_length, + common_prefix_length, + common_suffix2, + common_prefix2, + common_suffix2_length, + common_prefix2_length, + concat_array, + equal$1, + of_char, + of_char_list, + [0, + escape_gen_exn, + escape_gen, + escape, + unescape_gen_exn, + unescape_gen, + unescape, + is_char_escaping, + is_char_escaped, + is_char_literal, + index$1, + index_exn$1, + rindex$0, + rindex_exn$0, + index_from$0, + index_from_exn$0, + rindex_from$0, + rindex_from_exn$0, + split$0, + split_on_chars$0, + lsplit2$0, + lsplit2_exn$0, + rsplit2$0, + rsplit2_exn$0, + lstrip_literal, + rstrip_literal, + strip_literal]]; + runtime.caml_register_global(86, Base_String, "Base__String"); + return; + } + (globalThis)); + +//# 17841 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Bytes", + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Array0 = global_data.Base__Array0, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Staged = global_data.Base__Staged, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Blit = global_data.Base__Blit, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + stage = Base_Staged[1], + t_of_sexp = Base_Import[164], + sexp_of_t = Base_Import[140], + t_sexp_grammar = Base_Import[184], + max_length = Base_Bytes0[2], + compare = Base_Bytes0[5], + copy = Base_Bytes0[6], + create = Base_Bytes0[7], + fill = Base_Bytes0[8], + make = Base_Bytes0[9], + map = Base_Bytes0[10], + mapi = Base_Bytes0[11], + unsafe_blit = Base_Bytes0[13], + to_string = Base_Bytes0[14], + of_string = Base_Bytes0[15], + unsafe_to_string = Base_Bytes0[16], + unsafe_of_string_promise_no_mu = Base_Bytes0[17], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _c_ = [0, "src/bytes.ml", 128, 2], + cst_tr_multi_replacement_is_th = + "tr_multi: replacement is the empty string", + _b_ = [0, [11, "Bytes.init ", [4, 0, 0, 0, 0]], "Bytes.init %d"], + _a_ = [0, [3, 0, 0], "%S"]; + function pp(fmt, t){ + var _y_ = caml_call1(to_string, t); + return caml_call3(Stdlib_Format[135], fmt, _a_, _y_); + } + function create$0(len){return caml_call1(create, len);} + var + To_bytes = + caml_call1 + (Base_Blit[1], [0, caml_ml_bytes_length, create$0, unsafe_blit]), + blit = To_bytes[1], + blito = To_bytes[2], + unsafe_blit$0 = To_bytes[3], + sub = To_bytes[4], + subo = To_bytes[5], + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + To_string = caml_call1(caml_call1(Base_Blit[3], [0]), To_bytes); + function create$1(len){return caml_call1(create, len);} + var + length = caml_ml_bytes_length, + unsafe_blit$1 = runtime.caml_blit_string, + length$0 = caml_ml_string_length, + From_string = + caml_call1 + (caml_call1(Base_Blit[2], [0, length$0]), + [0, length, create$1, unsafe_blit$1]); + function invariant(param){return 0;} + function init(n, f){ + if(n < 0) caml_call3(Base_Printf[7], _b_, n, 0); + var + t = caml_call1(create, n), + _w_ = caml_call2(Base_Import[93], n, 1), + _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + caml_bytes_unsafe_set(t, i, caml_call1(f, i)); + var _x_ = i + 1 | 0; + if(_w_ !== i){var i = _x_; continue;} + break; + } + } + return t; + } + function of_char_list(l){ + var t = caml_call1(create, caml_call1(Base_List[7], l)); + function _u_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _u_); + return t; + } + function to_list(t){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_bytes_length(t), 1), + i = i$1, + acc = 0; + for(;;){ + if(0 > i) return acc; + var + acc$0 = [0, caml_bytes_unsafe_get(t, i), acc], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + acc = acc$0; + } + } + function to_array(t){ + function _t_(i){return caml_bytes_unsafe_get(t, i);} + return caml_call2(Base_Array0[11], caml_ml_bytes_length(t), _t_); + } + function map$0(t, f){return caml_call2(map, f, t);} + function mapi$0(t, f){return caml_call2(mapi, f, t);} + function fold(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call2(f, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call3(f, pos, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function tr(target, replacement, s){ + var + _r_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _q_ = 0; + if(_r_ >= 0){ + var i = _q_; + for(;;){ + if(caml_call2(Base_Char[15], caml_bytes_unsafe_get(s, i), target)) + caml_bytes_unsafe_set(s, i, replacement); + var _s_ = i + 1 | 0; + if(_r_ !== i){var i = _s_; continue;} + break; + } + } + return 0; + } + function tr_multi(target, replacement){ + if(0 === caml_ml_string_length(target)) + return caml_call1(stage, function(_p_){return 0;}); + if(0 === caml_ml_string_length(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_th); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_o_){return 0;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + var + _m_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + caml_bytes_unsafe_set + (s, + i, + runtime.caml_string_unsafe_get + (tr_map, + caml_call1(Base_Char[29], caml_bytes_unsafe_get(s, i)))); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return 0; + }); + } + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[110][2], low, t); + return _k_ ? caml_call2(Base_Import[110][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[110][1], t, min) + ? min + : caml_call2(Base_Import[110][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[110][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[110][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function contains(pos, len, t, char$0){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], + pos, + len, + 0, + caml_ml_bytes_length(t)), + len$0 = match[2], + pos$0 = match[1], + last = caml_call2(Base_Import[91], pos$0, len$0), + i = pos$0; + for(;;){ + var _d_ = i < last ? 1 : 0; + if(_d_){ + var + _e_ = caml_bytes_get(t, i), + _f_ = caml_call2(Base_Char[15], _e_, char$0); + if(! _f_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _g_ = _f_; + } + else + var _g_ = _d_; + return _g_; + } + } + var + include$0 = Base_Import[110], + symbol = include$0[1], + symbol$0 = include$0[2], + symbol$1 = include$0[3], + symbol$2 = include$0[4], + symbol$3 = include$0[5], + symbol$4 = include$0[6], + ascending = include$0[7], + descending = include$0[8], + compare$0 = include$0[9], + equal = include$0[10], + max = include$0[11], + min = include$0[12], + Base_Bytes = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + blit, + blito, + unsafe_blit$0, + sub, + subo, + symbol$4, + symbol$0, + symbol$2, + symbol$3, + symbol, + symbol$1, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + of_string, + to_string, + pp$0, + invariant, + To_string, + From_string, + create, + make, + map$0, + mapi$0, + copy, + init, + of_char_list, + caml_bytes_get, + caml_bytes_set, + fill, + tr, + tr_multi, + to_list, + to_array, + fold, + foldi, + contains, + max_length, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(24, Base_Bytes, "Base__Bytes"); + return; + } + (globalThis)); + +//# 18184 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + ocaml_lex_tables = + [0, + "\0\0\0\0\x01\0\x01\0\x02\0\x1b\0R\0i\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\x01\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + "\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\x02\0\0\0\0\0\x01\0\x03\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\x06\0\x04\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\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\x06\0\x04\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\x07\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\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\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\0\0\x02\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\xff\xff\xff\xff\x01\0\x03\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\x03\0\x05\0\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + cst, + cst, + cst, + cst, + cst, + cst], + Stdlib_Lexing = global_data.Stdlib__Lexing; + function parse_hex(lexbuf){ + var ocaml_lex_state = 0; + for(;;){ + var + ocaml_lex_state$0 = + caml_call3 + (Stdlib_Lexing[20], ocaml_lex_tables, ocaml_lex_state, lexbuf); + if(0 === ocaml_lex_state$0){ + var + body = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 3 | 0, lexbuf[6]); + return [0, body]; + } + if(1 === ocaml_lex_state$0){ + var + body$0 = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 2 | 0, lexbuf[6]); + return [1, body$0]; + } + caml_call1(lexbuf[1], lexbuf); + var ocaml_lex_state = ocaml_lex_state$0; + } + } + var Base_Hex_lexer = [0, parse_hex]; + runtime.caml_register_global(2, Base_Hex_lexer, "Base__Hex_lexer"); + return; + } + (globalThis)); + +//# 18245 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_int$3 = "int", + cst_int32$3 = "int32", + cst_int64$3 = "int64", + cst_nativeint$2 = "nativeint", + cst_src_int_conversions_ml = "src/int_conversions.ml", + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Hex_lexer = global_data.Base__Hex_lexer, + Stdlib_Lexing = global_data.Stdlib__Lexing, + Base_Option = global_data.Base__Option, + Base_Char = global_data.Base__Char, + Base_String = global_data.Base__String, + Base_Printf = global_data.Base__Printf, + Base_Import = global_data.Base__Import, + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + Base_Sexpable = global_data.Base__Sexpable, + Base_Bytes = global_data.Base__Bytes, + Base_Sys0 = global_data.Base__Sys0, + Base_Word_size = global_data.Base__Word_size, + Assert_failure = global_data.Assert_failure, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Int0 = global_data.Base__Int0, + Base_Sexp = global_data.Base__Sexp, + _g_ = + [0, + [2, 0, [11, ".of_string: invalid input ", [3, 0, 0]]], + "%s.of_string: invalid input %S"], + cst_0x = "-0x", + cst_0x$0 = "0x", + cst_int63 = "int63", + cst_int64$2 = cst_int64$3, + cst_nativeint$1 = cst_nativeint$2, + cst_int64$1 = cst_int64$3, + cst_int32$2 = cst_int32$3, + cst_nativeint$0 = cst_nativeint$2, + cst_int32$1 = cst_int32$3, + cst_int64$0 = cst_int64$3, + cst_int$2 = cst_int$3, + cst_nativeint = cst_nativeint$2, + cst_int$1 = cst_int$3, + cst_int64 = cst_int64$3, + cst_int$0 = cst_int$3, + cst_int32$0 = cst_int32$3, + cst_int32 = cst_int32$3, + cst_int = cst_int$3, + _a_ = + [0, + [11, + "conversion from ", + [2, + 0, + [11, + " to ", + [2, 0, [11, " failed: ", [2, 0, [11, " is out of range", 0]]]]]]], + "conversion from %s to %s failed: %s is out of range"], + _m_ = [0, cst_src_int_conversions_ml, 19, 9], + _l_ = [0, cst_src_int_conversions_ml, 75, 9], + _k_ = [0, cst_src_int_conversions_ml, 96, 9], + _j_ = [0, cst_src_int_conversions_ml, 148, 9], + _i_ = [0, cst_src_int_conversions_ml, 176, 9]; + function convert_failure(x, a, b, to_string){ + var _S_ = caml_call1(to_string, x); + return caml_call5(Base_Printf[6], _a_, a, b, _S_, 0); + } + var + num_bits_int = Base_Sys0[8], + num_bits_nativeint = caml_call1(Base_Word_size[2], Base_Word_size[3]), + num_bits_int32 = 32, + num_bits_int64 = 64; + if(63 !== num_bits_int && 31 !== num_bits_int && 32 !== num_bits_int) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + var + min_int32 = Stdlib_Int32[10], + max_int32 = Stdlib_Int32[9], + min_int64 = Stdlib_Int64[10], + max_int64 = Stdlib_Int64[9], + min_nativeint = Stdlib_Nativeint[11], + max_nativeint = Stdlib_Nativeint[10], + int64_to_string = Stdlib_Int64[14], + nativeint_to_string = Stdlib_Nativeint[15], + _b_ = Base_Import[85][32], + _c_ = Stdlib_Int32[14]; + function int32_to_int_trunc(_R_){return _R_;} + function int_to_int32_trunc(_Q_){return _Q_;} + var + int_is_representable_as_int32 = + num_bits_int <= 32 + ? function(param){return 1;} + : function + (x){ + var + _O_ = caml_call2(Base_Import[229], min_int32, x) <= 0 ? 1 : 0, + _P_ = + _O_ + ? caml_call2(Base_Import[229], x, max_int32) <= 0 ? 1 : 0 + : _O_; + return _P_; + }; + if(32 <= num_bits_int) + var _d_ = function(param){return 1;}; + else + var + min$4 = Base_Int0[6], + max$4 = Base_Int0[5], + _d_ = + function(x){ + var + _M_ = caml_call2(Base_Import[230], min$4, x) <= 0 ? 1 : 0, + _N_ = _M_ ? caml_call2(Base_Import[230], x, max$4) <= 0 ? 1 : 0 : _M_; + return _N_; + }; + function int_to_int32(x){ + return int_is_representable_as_int32(x) ? [0, x] : 0; + } + function int32_to_int(x){return _d_(x) ? [0, x] : 0;} + function int_to_int32_exn(x){ + return int_is_representable_as_int32(x) + ? x + : convert_failure(x, cst_int, cst_int32, _b_); + } + function int32_to_int_exn(x){ + return _d_(x) ? x : convert_failure(x, cst_int32$0, cst_int$0, _c_); + } + if(num_bits_int >= 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + int_to_int64 = caml_int64_of_int32, + int64_to_int_trunc = caml_int64_to_int32, + min = caml_int64_of_int32(Base_Int0[6]), + max = caml_int64_of_int32(Base_Int0[5]); + function int64_is_representable_as_int(x){ + var + _K_ = caml_call2(Base_Import[231], min, x) <= 0 ? 1 : 0, + _L_ = _K_ ? caml_call2(Base_Import[231], x, max) <= 0 ? 1 : 0 : _K_; + return _L_; + } + function int64_to_int(x){ + return int64_is_representable_as_int(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int_exn(x){ + return int64_is_representable_as_int(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64, cst_int$1, int64_to_string); + } + if(num_bits_int > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + function int_to_nativeint(_J_){return _J_;} + function nativeint_to_int_trunc(_I_){return _I_;} + if(num_bits_nativeint <= num_bits_int) + var _e_ = function(param){return 1;}; + else + var + min$3 = Base_Int0[6], + max$3 = Base_Int0[5], + _e_ = + function(x){ + var + _G_ = caml_call2(Base_Import[232], min$3, x) <= 0 ? 1 : 0, + _H_ = _G_ ? caml_call2(Base_Import[232], x, max$3) <= 0 ? 1 : 0 : _G_; + return _H_; + }; + function nativeint_to_int(x){return _e_(x) ? [0, x] : 0;} + function nativeint_to_int_exn(x){ + return _e_(x) + ? x + : convert_failure + (x, cst_nativeint, cst_int$2, nativeint_to_string); + } + var + int32_to_int64 = caml_int64_of_int32, + int64_to_int32_trunc = caml_int64_to_int32, + min$0 = caml_int64_of_int32(min_int32), + max$0 = caml_int64_of_int32(max_int32); + function int64_is_representable_as_int3(x){ + var + _E_ = caml_call2(Base_Import[231], min$0, x) <= 0 ? 1 : 0, + _F_ = _E_ ? caml_call2(Base_Import[231], x, max$0) <= 0 ? 1 : 0 : _E_; + return _F_; + } + function int64_to_int32(x){ + return int64_is_representable_as_int3(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int32_exn(x){ + return int64_is_representable_as_int3(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64$0, cst_int32$1, int64_to_string); + } + if(32 > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + function int32_to_nativeint(_D_){return _D_;} + function nativeint_to_int32_trunc(_C_){return _C_;} + var + _f_ = + num_bits_nativeint <= 32 + ? function(param){return 1;} + : function + (x){ + var + _A_ = caml_call2(Base_Import[232], min_int32, x) <= 0 ? 1 : 0, + _B_ = + _A_ + ? caml_call2(Base_Import[232], x, max_int32) <= 0 ? 1 : 0 + : _A_; + return _B_; + }; + function nativeint_to_int32(x){return _f_(x) ? [0, x] : 0;} + function nativeint_to_int32_exn(x){ + return _f_(x) + ? x + : convert_failure + (x, cst_nativeint$0, cst_int32$2, nativeint_to_string); + } + if(num_bits_nativeint > 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var + int64_to_nativeint_trunc = caml_int64_to_int32, + nativeint_to_int64 = caml_int64_of_int32; + if(64 <= num_bits_nativeint) + var int64_is_representable_as_nati = function(param){return 1;}; + else + var + min$2 = caml_int64_of_int32(min_nativeint), + max$2 = caml_int64_of_int32(max_nativeint), + int64_is_representable_as_nati = + function(x){ + var + _y_ = caml_call2(Base_Import[231], min$2, x) <= 0 ? 1 : 0, + _z_ = _y_ ? caml_call2(Base_Import[231], x, max$2) <= 0 ? 1 : 0 : _y_; + return _z_; + }; + function int64_to_nativeint(x){ + return int64_is_representable_as_nati(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_nativeint_exn(x){ + return int64_is_representable_as_nati(x) + ? caml_int64_to_int32(x) + : convert_failure + (x, cst_int64$1, cst_nativeint$1, int64_to_string); + } + var + min$1 = caml_int64_shift_right(min_int64, 1), + max$1 = caml_int64_shift_right(max_int64, 1); + function int64_is_representable_as_int6(x){ + var + _w_ = caml_call2(Base_Import[231], min$1, x) <= 0 ? 1 : 0, + _x_ = _w_ ? caml_call2(Base_Import[231], x, max$1) <= 0 ? 1 : 0 : _w_; + return _x_; + } + function int64_fit_on_int63_exn(x){ + return int64_is_representable_as_int6(x) + ? 0 + : convert_failure(x, cst_int64$2, cst_int63, int64_to_string); + } + function insert_delimiter_every(input, delimiter, chars_per_delimiter){ + var input_length = runtime.caml_ml_string_length(input); + if(input_length <= chars_per_delimiter) return input; + var match = caml_string_get(input, 0), switch$0 = 0; + if(43 !== match && 45 !== match){var has_sign = 0; switch$0 = 1;} + if(! switch$0) var has_sign = 1; + var + num_digits = + has_sign ? caml_call2(Base_Import[93], input_length, 1) : input_length, + _t_ = caml_call2(Base_Import[93], num_digits, 1), + num_delimiters = caml_call2(Base_Import[95], _t_, chars_per_delimiter), + output_length = caml_call2(Base_Import[91], input_length, num_delimiters), + output = caml_call1(Base_Bytes[31], output_length), + input_pos = [0, caml_call2(Base_Import[93], input_length, 1)], + output_pos = [0, caml_call2(Base_Import[93], output_length, 1)], + num_chars_until_delimiter = [0, chars_per_delimiter], + first_digit_pos = has_sign ? 1 : 0; + for(;;){ + if(first_digit_pos <= input_pos[1]){ + if(0 === num_chars_until_delimiter[1]){ + caml_call3(Base_Bytes[39], output, output_pos[1], delimiter); + caml_call1(Base_Import[129], output_pos); + num_chars_until_delimiter[1] = chars_per_delimiter; + } + var _u_ = caml_string_get(input, input_pos[1]); + caml_call3(Base_Bytes[39], output, output_pos[1], _u_); + caml_call1(Base_Import[129], input_pos); + caml_call1(Base_Import[129], output_pos); + caml_call1(Base_Import[129], num_chars_until_delimiter); + continue; + } + if(has_sign){ + var _v_ = caml_string_get(input, 0); + caml_call3(Base_Bytes[39], output, 0, _v_); + } + return caml_call1(Base_Bytes[49], output); + } + } + function insert_delimiter(input, delimiter){ + return insert_delimiter_every(input, delimiter, 3); + } + function insert_underscores(input){return insert_delimiter(input, 95);} + var sexp_of_int_style = Base_Sexp[19]; + function _h_(I){ + var compare = I[1], hash_fold_t = I[2], func = I[3]; + function hash(x){return caml_call1(func, x);} + var chars_per_delimiter = 4; + function to_string(delimiter, t){ + if(delimiter) + var + delimiter$0 = delimiter[1], + make_suffix = + function(t){ + return insert_delimiter_every + (caml_call1(I[4], t), delimiter$0, chars_per_delimiter); + }; + else + var make_suffix = I[4]; + if(caml_call2(I[7], t, I[6])){ + var _r_ = caml_call1(make_suffix, caml_call1(I[8], t)); + return caml_call2(Base_Import[112], cst_0x, _r_); + } + var _s_ = caml_call1(make_suffix, t); + return caml_call2(Base_Import[112], cst_0x$0, _s_); + } + function to_string$0(t){return to_string(0, t);} + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return to_string([0, delimiter], t); + } + function invalid(str){ + return caml_call4(Base_Printf[6], _g_, I[9], str, 0); + } + function of_string_with_delimiter(str){ + function _p_(c){return caml_call2(Base_Char[14], c, 95);} + var _q_ = caml_call2(Base_String[98], str, _p_); + return caml_call1(I[5], _q_); + } + function of_string(str){ + var lex = caml_call2(Stdlib_Lexing[3], 0, str); + function _n_(param){return caml_call1(Base_Hex_lexer[1], lex);} + var result = caml_call1(Base_Option[44], _n_); + if(lex[6] !== lex[3]) return invalid(str); + if(! result) return invalid(str); + var match = result[1]; + if(0 === match[0]){ + var body = match[1], _o_ = of_string_with_delimiter(body); + return caml_call1(I[8], _o_); + } + var body$0 = match[1]; + return of_string_with_delimiter(body$0); + } + var + t_sexp_grammar = caml_call1(Sexplib0_Sexp_grammar[1], Base_String[1]), + include = caml_call1(Base_Sexpable[5], [0, of_string, to_string$0]), + t_of_sexp = include[1], + sexp_of_t = include[2]; + return [0, + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + hash, + of_string, + to_string$0, + to_string_hum]]; + } + var + Base_Int_conversions = + [0, + int_to_int32, + int_to_int32_exn, + int_to_int32_trunc, + int_to_int64, + int_to_nativeint, + int32_to_int, + int32_to_int_exn, + int32_to_int_trunc, + int32_to_int64, + int32_to_nativeint, + int64_to_int, + int64_to_int_exn, + int64_to_int_trunc, + int64_to_int32, + int64_to_int32_exn, + int64_to_int32_trunc, + int64_to_nativeint, + int64_to_nativeint_exn, + int64_to_nativeint_trunc, + int64_fit_on_int63_exn, + int64_is_representable_as_int6, + nativeint_to_int, + nativeint_to_int_exn, + nativeint_to_int_trunc, + nativeint_to_int32, + nativeint_to_int32_exn, + nativeint_to_int32_trunc, + nativeint_to_int64, + num_bits_int, + num_bits_int32, + num_bits_int64, + num_bits_nativeint, + function(I){ + var chars_per_delimiter = 3; + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return insert_delimiter_every + (caml_call1(I[1], t), delimiter, chars_per_delimiter); + } + function sexp_of_t(t){ + var + s = caml_call1(I[1], t), + s$0 = + 1009018843 <= sexp_of_int_style[1] + ? s + : insert_delimiter_every(s, 95, chars_per_delimiter); + return [0, s$0]; + } + return [0, to_string_hum, sexp_of_t]; + }, + _h_, + sexp_of_int_style, + insert_delimiter_every, + insert_delimiter, + insert_underscores]; + runtime.caml_register_global + (44, Base_Int_conversions, "Base__Int_conversions"); + return; + } + (globalThis)); + +//# 18718 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Int_intf = [0]; + runtime.caml_register_global(0, Base_Int_intf, "Base__Int_intf"); + return; + } + (globalThis)); + +//# 18728 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + overflow_bound_max_int63_on_in = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + overflow_bound_max_int64_value = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Base_Import = global_data.Base__Import, + Base_Int_conversions = global_data.Base__Int_conversions, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + int32_positive_overflow_bounds = + [0, + 2147483647, + 2147483647, + 46340, + 1290, + 215, + 73, + 35, + 21, + 14, + 10, + 8, + 7, + 5, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1].slice + (), + overflow_bound_max_int_value = caml_call2(Base_Import[120], -1, 1), + switcher = Base_Int_conversions[29] - 31 | 0, + _g_ = [0, "src/pow_overflow_bounds.ml", 218, 9], + _a_ = runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _c_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _i_ = + [0, + 1073741823, + 1073741823, + 32767, + 1023, + 181, + 63, + 31, + 19, + 13, + 10, + 7, + 6, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1], + _d_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + runtime.caml_int64_create_lo_mi_hi(1664510, 0, 0), + runtime.caml_int64_create_lo_mi_hi(46340, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5404, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1290, 0, 0), + runtime.caml_int64_create_lo_mi_hi(463, 0, 0), + runtime.caml_int64_create_lo_mi_hi(215, 0, 0), + runtime.caml_int64_create_lo_mi_hi(118, 0, 0), + runtime.caml_int64_create_lo_mi_hi(73, 0, 0), + runtime.caml_int64_create_lo_mi_hi(49, 0, 0), + runtime.caml_int64_create_lo_mi_hi(35, 0, 0), + runtime.caml_int64_create_lo_mi_hi(27, 0, 0), + runtime.caml_int64_create_lo_mi_hi(21, 0, 0), + runtime.caml_int64_create_lo_mi_hi(17, 0, 0), + runtime.caml_int64_create_lo_mi_hi(14, 0, 0), + runtime.caml_int64_create_lo_mi_hi(12, 0, 0), + runtime.caml_int64_create_lo_mi_hi(10, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _e_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(324403, 181, 0), + runtime.caml_int64_create_lo_mi_hi(2097151, 0, 0), + runtime.caml_int64_create_lo_mi_hi(55108, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6208, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1448, 0, 0), + runtime.caml_int64_create_lo_mi_hi(511, 0, 0), + runtime.caml_int64_create_lo_mi_hi(234, 0, 0), + runtime.caml_int64_create_lo_mi_hi(127, 0, 0), + runtime.caml_int64_create_lo_mi_hi(78, 0, 0), + runtime.caml_int64_create_lo_mi_hi(52, 0, 0), + runtime.caml_int64_create_lo_mi_hi(38, 0, 0), + runtime.caml_int64_create_lo_mi_hi(28, 0, 0), + runtime.caml_int64_create_lo_mi_hi(22, 0, 0), + runtime.caml_int64_create_lo_mi_hi(18, 0, 0), + runtime.caml_int64_create_lo_mi_hi(15, 0, 0), + runtime.caml_int64_create_lo_mi_hi(13, 0, 0), + runtime.caml_int64_create_lo_mi_hi(11, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _f_ = + [0, + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(16452813, 16777034, 65535), + runtime.caml_int64_create_lo_mi_hi(14680065, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16722108, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16771008, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16775768, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776705, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776982, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777089, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777138, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777164, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777178, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777188, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777194, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777198, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777201, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777203, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777205, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777207, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777208, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535)], + overflow_bound_max_int32_value = 2147483647; + if(1 < switcher >>> 0){ + if(32 !== switcher) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var + int_positive_overflow_bounds = + [0, + caml_int64_to_int32(_c_), + caml_int64_to_int32(_b_), + caml_int64_to_int32(_a_), + 1664510, + 46340, + 5404, + 1290, + 463, + 215, + 118, + 73, + 49, + 35, + 27, + 21, + 17, + 14, + 12, + 10, + 9, + 8, + 7, + 7, + 6, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1]; + } + else if(switcher) + var + _h_ = function(_j_){return _j_;}, + int_positive_overflow_bounds = + caml_call2(Base_Array0[20], int32_positive_overflow_bounds, _h_); + else + var int_positive_overflow_bounds = _i_.slice(); + var + int63_on_int64_positive_overfl = _d_.slice(), + int64_positive_overflow_bounds = _e_.slice(), + int64_negative_overflow_bounds = _f_.slice(), + Base_Pow_overflow_bounds = + [0, + overflow_bound_max_int32_value, + int32_positive_overflow_bounds, + overflow_bound_max_int_value, + int_positive_overflow_bounds, + overflow_bound_max_int63_on_in, + int63_on_int64_positive_overfl, + overflow_bound_max_int64_value, + int64_positive_overflow_bounds, + int64_negative_overflow_bounds]; + runtime.caml_register_global + (16, Base_Pow_overflow_bounds, "Base__Pow_overflow_bounds"); + return; + } + (globalThis)); + +//# 19189 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_exponent_can_not_be_negati = "exponent can not be negative", + cst_integer_overflow_in_pow = "integer overflow in pow", + caml_check_bound = runtime.caml_check_bound, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessthan = runtime.caml_lessthan; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Pow_overflow_bounds = global_data.Base__Pow_overflow_bounds, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + invalid_argf = Base_Printf[7], + _m_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _l_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _j_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _k_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = + [0, [11, cst_integer_overflow_in_pow, 0], cst_integer_overflow_in_pow], + _a_ = + [0, + [11, cst_exponent_can_not_be_negati, 0], + cst_exponent_can_not_be_negati]; + function negative_exponent(param){ + return caml_call2(Base_Printf[7], _a_, 0); + } + function overflow(param){return caml_call2(Base_Printf[7], _b_, 0);} + function int_pow(base, exponent){ + if(exponent < 0) negative_exponent(0); + var _J_ = 1 < caml_call1(Base_Import[123], base) ? 1 : 0; + if(_J_){ + var _K_ = 63 < exponent ? 1 : 0; + if(_K_) + var _L_ = _K_; + else + var + _M_ = + caml_check_bound(Base_Pow_overflow_bounds[4], exponent)[1 + exponent], + _L_ = _M_ < caml_call1(Base_Import[123], base) ? 1 : 0; + } + else + var _L_ = _J_; + if(_L_) overflow(0); + return runtime.Base_int_math_int_pow_stub(base, exponent); + } + var abs = Stdlib_Int64[8]; + function int64_pow(base, exponent){ + if(caml_lessthan(exponent, _c_)) negative_exponent(0); + var + _A_ = caml_greaterthan(base, _d_), + _B_ = _A_ || caml_lessthan(base, _h_); + if(_B_){ + var _C_ = caml_greaterthan(exponent, _e_); + if(_C_) + var _D_ = _C_; + else{ + var _E_ = runtime.caml_greaterequal(base, _f_); + if(_E_) + var + _F_ = caml_int64_to_int32(exponent), + _G_ = + caml_greaterthan + (base, caml_check_bound(Base_Pow_overflow_bounds[8], _F_)[1 + _F_]); + else + var _G_ = _E_; + if(_G_) + var _D_ = _G_; + else{ + var _H_ = caml_lessthan(base, _g_); + if(_H_) + var + _I_ = caml_int64_to_int32(exponent), + _D_ = + caml_lessthan + (base, + caml_check_bound(Base_Pow_overflow_bounds[9], _I_)[1 + _I_]); + else + var _D_ = _H_; + } + } + } + else + var _D_ = _B_; + if(_D_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + function int63_pow_on_int64(base, exponent){ + if(caml_lessthan(exponent, _i_)) negative_exponent(0); + var _v_ = caml_greaterthan(caml_call1(abs, base), _j_); + if(_v_){ + var _w_ = caml_greaterthan(exponent, _k_); + if(_w_) + var _x_ = _w_; + else + var + _y_ = caml_int64_to_int32(exponent), + _z_ = caml_check_bound(Base_Pow_overflow_bounds[6], _y_)[1 + _y_], + _x_ = caml_greaterthan(caml_call1(abs, base), _z_); + } + else + var _x_ = _v_; + if(_x_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + var + Private = [0, int_pow, int64_pow, int63_pow_on_int64], + Base_Int_math = + [0, + function(X){ + function symbol(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _u_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _l_, caml_call1(X[4], x), _u_, 0); + } + var rval = caml_call2(X[20], x, y); + return caml_call2(X[14], rval, X[18]) + ? caml_call2(X[5], rval, y) + : rval; + } + var one = caml_call1(X[19], 1); + function symbol$0(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _r_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _m_, caml_call1(X[4], x), _r_, 0); + } + if(! caml_call2(X[14], x, X[18])) return caml_call2(X[8], x, y); + var _s_ = caml_call2(X[5], x, one), _t_ = caml_call2(X[8], _s_, y); + return caml_call2(X[6], _t_, one); + } + function symbol$1(x, y){ + var _p_ = caml_call1(X[2], y), _q_ = caml_call1(X[2], x); + return caml_call2(Base_Import[96], _q_, _p_); + } + function round_down(i, modulus){ + var _o_ = symbol(i, modulus); + return caml_call2(X[6], i, _o_); + } + function round_up(i, modulus){ + var remainder = symbol(i, modulus); + if(caml_call2(X[12], remainder, X[18])) return i; + var _n_ = caml_call2(X[5], i, modulus); + return caml_call2(X[6], _n_, remainder); + } + function round_towards_zero(i, to_multiple_of){ + return caml_call2(X[12], i, X[18]) + ? X[18] + : caml_call2 + (X[13], i, X[18]) + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + function round_nearest(i, modulus){ + var + remainder = symbol(i, modulus), + modulus_minus_remainder = caml_call2(X[6], modulus, remainder); + return caml_call2(X[11], modulus_minus_remainder, remainder) + ? caml_call2(X[5], i, modulus_minus_remainder) + : caml_call2(X[6], i, remainder); + } + function round(opt, i, to_multiple_of){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? round_towards_zero(i, to_multiple_of) + : round_nearest(i, to_multiple_of) + : 759637122 + <= dir + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + return [0, + symbol, + symbol$0, + symbol$1, + round, + round_towards_zero, + round_down, + round_up, + round_nearest]; + }, + Private]; + runtime.caml_register_global(17, Base_Int_math, "Base__Int_math"); + return; + } + (globalThis)); + +//# 19427 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + global_data = runtime.caml_get_global_data(), + m1 = runtime.caml_int64_create_lo_mi_hi(5592405, 5592405, 21845), + m2 = runtime.caml_int64_create_lo_mi_hi(3355443, 3355443, 13107), + m4 = runtime.caml_int64_create_lo_mi_hi(986895, 986895, 3855), + h01 = runtime.caml_int64_create_lo_mi_hi(65793, 65793, 257), + mask = runtime.caml_int64_create_lo_mi_hi(16777215, 255, 0), + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "src/popcount.ml", 45, 9]; + function int64_popcount(x){ + var + x$0 = + runtime.caml_int64_sub + (x, caml_int64_and(caml_int64_shift_right_unsigne(x, 1), m1)), + x$1 = + caml_int64_add + (caml_int64_and(x$0, m2), + caml_int64_and(caml_int64_shift_right_unsigne(x$0, 2), m2)), + x$2 = + caml_int64_and + (caml_int64_add(x$1, caml_int64_shift_right_unsigne(x$1, 4)), m4); + return runtime.caml_int64_to_int32 + (caml_int64_shift_right_unsigne + (runtime.caml_int64_mul(x$2, h01), 56)); + } + function int32_popcount(x){ + return int64_popcount(caml_int64_and(caml_int64_of_int32(x), mask)); + } + var _a_ = Stdlib_Nativeint[9]; + if(32 === _a_) + var nativeint_popcount = function(x){return int32_popcount(x);}; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + nativeint_popcount = + function(x){return int64_popcount(caml_int64_of_int32(x));}; + } + var + Base_Popcount = + [0, + function(_c_){return runtime.Base_int_math_int_popcount(_c_);}, + int32_popcount, + int64_popcount, + nativeint_popcount]; + runtime.caml_register_global(8, Base_Popcount, "Base__Popcount"); + return; + } + (globalThis)); + +//# 19489 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Sign0 = global_data.Base__Sign0, + Base_Identifiable = global_data.Base__Identifiable, + t_sexp_grammar = Base_Sign0[3], + all = Base_Sign0[6], + Replace_polymorphic_compare = Base_Sign0[7], + to_int = Base_Sign0[10], + of_int = Base_Sign0[13], + _a_ = + caml_call1 + (Base_Identifiable[1], + [0, + Base_Sign0[4], + Base_Sign0[5], + Base_Sign0[11], + Base_Sign0[1], + Base_Sign0[2], + Base_Sign0[8], + Base_Sign0[9], + Base_Sign0[12]]), + hash_fold_t = _a_[1], + hash = _a_[2], + t_of_sexp = _a_[3], + sexp_of_t = _a_[4], + of_string = _a_[5], + to_string = _a_[6], + between = _a_[19], + clamp_exn = _a_[20], + clamp = _a_[21], + comparator = _a_[22], + pp = _a_[23], + hashable = _a_[24]; + function to_float(param){ + switch(param){case 0: return -1.;case 1: return 0.;default: return 1.; + } + } + function flip(param){ + switch(param){case 0: return 2;case 1: return 1;default: return 0; + } + } + function symbol(t$0, t){ + var _b_ = caml_call1(to_int, t), _c_ = caml_call1(to_int, t$0); + return caml_call1(of_int, caml_call2(Base_Import[88], _c_, _b_)); + } + var + symbol$0 = Replace_polymorphic_compare[1], + symbol$1 = Replace_polymorphic_compare[2], + symbol$2 = Replace_polymorphic_compare[3], + symbol$3 = Replace_polymorphic_compare[4], + symbol$4 = Replace_polymorphic_compare[5], + symbol$5 = Replace_polymorphic_compare[6], + ascending = Replace_polymorphic_compare[7], + descending = Replace_polymorphic_compare[8], + compare = Replace_polymorphic_compare[9], + equal = Replace_polymorphic_compare[10], + max = Replace_polymorphic_compare[11], + min = Replace_polymorphic_compare[12], + Base_Sign = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$5, + symbol$1, + symbol$3, + symbol$4, + symbol$0, + symbol$2, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + of_int, + to_int, + to_float, + flip, + symbol]; + runtime.caml_register_global(6, Base_Sign, "Base__Sign"); + return; + } + (globalThis)); + +//# 19602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_x = "%x", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_div = runtime.caml_div, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int.Hex", + module_name$0 = "Base.Int", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Float0 = global_data.Base__Float0, + Base_Int0 = global_data.Base__Int0, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Int_math = global_data.Base__Int_math, + Base_Error = global_data.Base__Error, + Base_Sign = global_data.Base__Sign, + Base_Popcount = global_data.Base__Popcount, + to_string = Base_Int0[1], + of_string = Base_Int0[2], + hash_fold_t = Base_Import[207], + func = Base_Import[221], + _u_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _t_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + cst_Int_ceil_log2_got_invalid_ = "[Int.ceil_log2] got invalid input", + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + _g_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/int.ml", 108, 2], + _e_ = [0, [4, 6, 0, 0, 0], cst_x], + _d_ = [0, [4, 6, 0, 0, 0], cst_x], + _b_ = + [0, + [11, + "Int.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int.of_float: argument (%f) is out of range or NaN"], + _a_ = [0, [11, "Int.of_string: ", [3, 0, 0]], "Int.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[166], + sexp_of_t = Base_Import[142], + t_sexp_grammar = Base_Import[186], + hashable = [0, hash, caml_int_compare, sexp_of_t], + compare = caml_int_compare; + function of_string$0(s){ + try{var _aF_ = caml_call1(of_string, s); return _aF_;} + catch(_aG_){return caml_call3(Base_Printf[6], _a_, s, 0);} + } + var + num_bits = Base_Int_conversions[29], + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function to_float(_aE_){return _aE_;} + function of_float_unchecked(_aD_){return _aD_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _aC_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _b_, _aC_, 0); + } + var + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + _c_ = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, 0]), + is_positive = _c_[1], + is_non_negative = _c_[2], + is_negative = _c_[3], + is_non_positive = _c_[4], + include = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include[1], + sexp_of_t$0 = include[2], + compare$0 = Base_Import[229], + hash_fold_t$0 = Base_Import[207], + func$0 = Base_Import[221], + zero = 0, + one = 1, + minus_one = -1; + function hash$0(x){return caml_call1(func$0, x);} + var neg = Base_Import[113]; + function symbol(_aB_, _aA_){return _aB_ < _aA_ ? 1 : 0;} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$1(s){ + function _ay_(_az_){return _az_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _ay_); + } + var + include$0 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$1, + zero, + symbol, + neg, + module_name]), + Hex = include$0[1], + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$1[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _aw_ = low <= t ? 1 : 0, _ax_ = _aw_ ? t <= high ? 1 : 0 : _aw_; + return _ax_; + } + function clamp_unchecked(t, min, max){ + return t < min ? min : t <= max ? t : max; + } + function clamp_exn(t, min, max){ + if(min <= max) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(max >= min) return [0, clamp_unchecked(t, min, max)]; + var + _at_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _au_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _at_], + _av_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _au_); + return caml_call1(Base_Or_error[35], _av_); + } + function pred(i){return caml_call2(Base_Import[93], i, 1);} + function succ(i){return caml_call2(Base_Import[91], i, 1);} + function to_int(i){return i;} + function of_int_exn(i){return i;} + var + max_value = Base_Import[85][18], + min_value = Base_Import[85][19], + of_int32 = Base_Int_conversions[6], + of_int32_exn = Base_Int_conversions[7], + to_int32 = Base_Int_conversions[1], + to_int32_exn = Base_Int_conversions[2], + of_int64 = Base_Int_conversions[11], + of_int64_exn = Base_Int_conversions[12], + to_int64 = Base_Int_conversions[4], + of_nativeint = Base_Int_conversions[22], + of_nativeint_exn = Base_Int_conversions[23], + to_nativeint = Base_Int_conversions[5], + max_value_30_bits = 1073741823; + function abs(x){return caml_call1(Base_Import[123], x);} + function rem(a, b){return caml_call2(Base_Import[122], a, b);} + function incr(_as_){_as_[1]++; return 0;} + function decr(_ar_){_ar_[1] += -1; return 0;} + function shift_right(a, b){return caml_call2(Base_Import[115], a, b);} + function shift_right_logical(a, b){ + return caml_call2(Base_Import[120], a, b); + } + function shift_left(a, b){return caml_call2(Base_Import[119], a, b);} + function bit_not(a){return caml_call1(Base_Import[117], a);} + function bit_or(a, b){return caml_call2(Base_Import[118], a, b);} + function bit_and(a, b){return caml_call2(Base_Import[116], a, b);} + function bit_xor(a, b){return caml_call2(Base_Import[121], a, b);} + var pow = Base_Int_math[2][1]; + function symbol$0(b, e){return caml_call2(pow, b, e);} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _g_, 0); + } + function ceil_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + x$0 = caml_call2(Base_Import[93], x, 1), + _al_ = caml_call2(Base_Import[120], x$0, 1), + x$1 = caml_call2(Base_Import[118], x$0, _al_), + _am_ = caml_call2(Base_Import[120], x$1, 2), + x$2 = caml_call2(Base_Import[118], x$1, _am_), + _an_ = caml_call2(Base_Import[120], x$2, 4), + x$3 = caml_call2(Base_Import[118], x$2, _an_), + _ao_ = caml_call2(Base_Import[120], x$3, 8), + x$4 = caml_call2(Base_Import[118], x$3, _ao_), + _ap_ = caml_call2(Base_Import[120], x$4, 16), + x$5 = caml_call2(Base_Import[118], x$4, _ap_), + _aq_ = caml_call2(Base_Import[120], x$5, 32), + x$6 = caml_call2(Base_Import[118], x$5, _aq_); + return caml_call2(Base_Import[91], x$6, 1); + } + function floor_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + _ae_ = caml_call2(Base_Import[120], x, 1), + x$0 = caml_call2(Base_Import[118], x, _ae_), + _af_ = caml_call2(Base_Import[120], x$0, 2), + x$1 = caml_call2(Base_Import[118], x$0, _af_), + _ag_ = caml_call2(Base_Import[120], x$1, 4), + x$2 = caml_call2(Base_Import[118], x$1, _ag_), + _ah_ = caml_call2(Base_Import[120], x$2, 8), + x$3 = caml_call2(Base_Import[118], x$2, _ah_), + _ai_ = caml_call2(Base_Import[120], x$3, 16), + x$4 = caml_call2(Base_Import[118], x$3, _ai_), + _aj_ = caml_call2(Base_Import[120], x$4, 32), + x$5 = caml_call2(Base_Import[118], x$4, _aj_), + _ak_ = caml_call2(Base_Import[120], x$5, 1); + return caml_call2(Base_Import[93], x$5, _ak_); + } + function is_pow2(x){ + if(x <= 0) non_positive_argument(0); + var _ad_ = caml_call2(Base_Import[93], x, 1); + return 0 === caml_call2(Base_Import[116], x, _ad_) ? 1 : 0; + } + function floor_log2(i){ + if(i <= 0){ + var _aa_ = [0, [0, cst, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _aa_)); + } + var + _ab_ = runtime.Base_int_math_int_clz(i), + _ac_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _ac_, _ab_); + } + function ceil_log2(i){ + if(i <= 0){ + var ___ = [0, [0, cst$0, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_ceil_log2_got_invalid_, ___)); + } + if(1 === i) return 0; + var + _$_ = runtime.Base_int_math_int_clz(caml_call2(Base_Import[93], i, 1)); + return caml_call2(Base_Import[93], num_bits, _$_); + } + var sign = Base_Sign[27], popcount = Base_Popcount[1]; + function _h_(_Z_){return - _Z_ | 0;} + function _i_(_Y_, _X_){return _Y_ !== _X_ ? 1 : 0;} + function _j_(_W_, _V_){return _W_ < _V_ ? 1 : 0;} + function _k_(_U_, _T_){return _T_ < _U_ ? 1 : 0;} + function _l_(_S_, _R_){return _S_ === _R_ ? 1 : 0;} + function _m_(_Q_, _P_){return _Q_ <= _P_ ? 1 : 0;} + function _n_(_O_, _N_){return _N_ <= _O_ ? 1 : 0;} + function _o_(_M_){return - _M_ | 0;} + var _p_ = caml_div, _q_ = runtime.caml_mul; + function _r_(_L_, _K_){return _L_ - _K_ | 0;} + var + _s_ = + [0, + of_float, + to_float, + of_string$0, + to_string, + function(_J_, _I_){return _J_ + _I_ | 0;}, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + abs, + _h_, + zero, + of_int_exn, + rem], + F = caml_call1(Base_Int_math[1], _s_), + round = F[4], + round_towards_zero = F[5], + round_down = F[6], + round_up = F[7], + round_nearest = F[8]; + function symbol$1(x, y){ + if(y <= 0){ + var _G_ = caml_call1(to_string, y), _H_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _t_, _H_, _G_, 0); + } + var rval = rem(x, y); + return rval < 0 ? rval + y | 0 : rval; + } + function symbol$2(x, y){ + if(y <= 0){ + var _E_ = caml_call1(to_string, y), _F_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _u_, _F_, _E_, 0); + } + return x < 0 ? caml_div(x + 1 | 0, y) - 1 | 0 : caml_div(x, y); + } + function symbol$3(x, y){return caml_call2(Base_Import[96], x, y);} + var + lnot = Base_Import[117], + include$2 = Base_Import[97], + ascending = include$2[1], + descending = include$2[2], + max = include$2[3], + min = include$2[4], + _v_ = [0, [0, F[1], F[2], F[3]]], + _w_ = [0, symbol$0, lnot, abs, zero, symbol$1, symbol$2, symbol$3]; + function _x_(_D_){return runtime.Base_int_math_int_ctz(_D_);} + function _y_(_C_){return runtime.Base_int_math_int_clz(_C_);} + var + _z_ = caml_int_compare, + Base_Int = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string$0, + to_string, + function(_B_, _A_){return _B_ === _A_ ? 1 : 0;}, + _z_, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _y_, + _x_, + _w_, + symbol$0, + lnot, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + max_value_30_bits, + of_int_exn, + to_int, + of_int32, + to_int32, + of_int64, + of_nativeint, + to_nativeint, + _v_]; + runtime.caml_register_global(33, Base_Int, "Base__Int"); + return; + } + (globalThis)); + +//# 20450 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_T = [0]; + runtime.caml_register_global(0, Base_T, "Base__T"); + return; + } + (globalThis)); + +//# 21496 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sexp = global_data.Base__Sexp, + Base_Comparable = global_data.Base__Comparable, + hash_fold_t = Base_Sexp[1], + hash = Base_Sexp[2], + t_of_sexp = Base_Sexp[3], + sexp_of_t = Base_Sexp[4], + Not_found_s = Base_Sexp[7], + Of_sexp_error = Base_Sexp[8], + message = Base_Sexp[9], + default_indent = Base_Sexp[10], + pp_hum = Base_Sexp[11], + pp_hum_indent = Base_Sexp[12], + pp_mach = Base_Sexp[13], + pp = Base_Sexp[14], + to_string_hum = Base_Sexp[15], + to_string_mach = Base_Sexp[16], + to_string = Base_Sexp[17], + of_float_style = Base_Sexp[18], + of_int_style = Base_Sexp[19], + t_sexp_grammar = Base_Sexp[21], + invariant = Base_Sexp[22], + of_string = Base_Sexp[23], + include = caml_call1(Base_Comparable[10], [0, Base_Sexp[6], Base_Sexp[4]]), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + equal = include[7], + compare = include[8], + min = include[9], + max = include[10], + ascending = include[11], + descending = include[12], + between = include[13], + clamp_exn = include[14], + clamp = include[15], + comparator = include[16], + Base_Sexp_with_comparable = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + runtime.caml_register_global + (2, Base_Sexp_with_comparable, "Base__Sexp_with_comparable"); + return; + } + (globalThis)); + +//# 24602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Exn = global_data.Base__Exn, + Base_List = global_data.Base__List, + Base_Import = global_data.Base__Import, + compare = Base_Import[238], + equal = Base_Import[251], + t_of_sexp = Base_Import[171], + sexp_of_t = Base_Import[147]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[192], a_sexp_grammar); + } + function swap(t1, t2){ + var tmp = t1[1]; + t1[1] = t2[1]; + t2[1] = tmp; + return 0; + } + function replace(t, f){t[1] = caml_call1(f, t[1]); return 0;} + function set_temporarily(t, a, f){ + var restore_to = t[1]; + t[1] = a; + function _b_(param){t[1] = restore_to; return 0;} + return caml_call2(Base_Exn[13], f, _b_); + } + function set(param){var a = param[2], r = param[1]; r[1] = a; return 0;} + function sets(ts){return caml_call2(Base_List[9], ts, set);} + function snapshot(param){var r = param[1]; return [0, r, r[1]];} + function sets_temporarily(and_values, f){ + var restore_to = caml_call2(Base_List[76], and_values, snapshot); + sets(and_values); + function _a_(param){return sets(restore_to);} + return caml_call2(Base_Exn[13], f, _a_); + } + var + Base_Ref = + [0, + compare, + equal, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + swap, + replace, + set_temporarily, + [0, set, sets, snapshot], + sets_temporarily]; + runtime.caml_register_global(3, Base_Ref, "Base__Ref"); + return; + } + (globalThis)); + +//# 25513 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_nx = "%nx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_lessequal = runtime.caml_lessequal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Nativeint.Hex", + module_name$0 = "Base.Nativeint", + Base_Int_math = global_data.Base__Int_math, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Printf = global_data.Base__Printf, + Base_Float0 = global_data.Base__Float0, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Word_size = global_data.Base__Word_size, + Base_Error = global_data.Base__Error, + Base_Popcount = global_data.Base__Popcount, + include = Base_Import[104], + compare = include[9], + hash_fold_t = Base_Import[203], + func = Base_Import[217], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/nativeint.ml", 202, 2], + cst_Nativeint_ceil_log2_got_in = "[Nativeint.ceil_log2] got invalid input", + cst_Nativeint_floor_log2_got_i = + "[Nativeint.floor_log2] got invalid input", + _e_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + _d_ = + [0, + [11, + "Nativeint.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Nativeint.of_float: argument (%f) is out of range or NaN"], + _c_ = [0, [6, 6, 0, 0, 0], cst_nx], + _b_ = [0, [6, 6, 0, 0, 0], cst_nx]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[170], + sexp_of_t = Base_Import[146], + t_sexp_grammar = Base_Import[190], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[104][9], + to_string = Stdlib_Nativeint[15], + of_string = runtime.caml_int_of_string, + comparator = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t])[1], + zero = Stdlib_Nativeint[1], + _a_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + is_positive = _a_[1], + is_non_negative = _a_[2], + is_negative = _a_[3], + is_non_positive = _a_[4], + sign = _a_[5], + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$0 = include$0[2], + compare$1 = Base_Import[232], + hash_fold_t$0 = Base_Import[203], + func$0 = Base_Import[217]; + function hash$0(x){return caml_call1(func$0, x);} + var zero$0 = Stdlib_Nativeint[1]; + function neg(_U_){return - _U_ | 0;} + var symbol = Base_Import[104][1]; + function to_string$0(i){return caml_call2(Base_Printf[2], _b_, i);} + function of_string$0(s){ + function _S_(_T_){return _T_;} + return caml_call3(Stdlib_Scanf[5], s, _c_, _S_); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$1, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero$0, + symbol, + neg, + module_name]), + Hex = include$1[1], + include$2 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$2[1]; + function invariant(param){return 0;} + var + num_bits = caml_call1(Base_Word_size[2], Base_Word_size[3]), + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function shift_right_logical(_R_, _Q_){return _R_ >>> _Q_ | 0;} + function shift_right(_P_, _O_){return _P_ >> _O_;} + function shift_left(_N_, _M_){return _N_ << _M_;} + var bit_not = Stdlib_Nativeint[12]; + function bit_xor(_L_, _K_){return _L_ ^ _K_;} + function bit_or(_J_, _I_){return _J_ | _I_;} + function bit_and(_H_, _G_){return _H_ & _G_;} + var + min_value = Stdlib_Nativeint[11], + max_value = Stdlib_Nativeint[10], + abs = Stdlib_Nativeint[8], + pred = Stdlib_Nativeint[7], + succ = Stdlib_Nativeint[6], + rem = runtime.caml_mod; + function symbol$0(_F_){return - _F_ | 0;} + var + minus_one = Stdlib_Nativeint[3], + one = Stdlib_Nativeint[2], + zero$1 = Stdlib_Nativeint[1]; + function to_float(_E_){return _E_;} + function of_float_unchecked(_D_){return _D_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _C_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _d_, _C_, 0); + } + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _e_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Nativeint[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0, + x$6 = x$5 | x$5 >>> 32 | 0; + return caml_call1(Stdlib_Nativeint[6], x$6); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0, + x$5 = x$4 | x$4 >>> 32 | 0; + return x$5 - (x$5 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var _B_ = x & caml_call1(Stdlib_Nativeint[7], x); + return caml_call2(Base_Import[104][4], _B_, 0); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _y_ = [0, [0, cst, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_floor_log2_got_i, _y_)); + } + var + _z_ = runtime.Base_int_math_nativeint_clz(i), + _A_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _A_, _z_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _w_ = [0, [0, cst$0, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_ceil_log2_got_in, _w_)); + } + if(caml_call2(Stdlib_Nativeint[18], i, Stdlib_Nativeint[2])) return 0; + var + _x_ = + runtime.Base_int_math_nativeint_clz(caml_call1(Stdlib_Nativeint[7], i)); + return caml_call2(Base_Import[93], num_bits, _x_); + } + function between(t, low, high){ + var _v_ = caml_call2(Base_Import[104][2], low, t); + return _v_ ? caml_call2(Base_Import[104][2], t, high) : _v_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[104][1], t, min) + ? min + : caml_call2(Base_Import[104][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[104][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[104][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _s_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _t_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _s_], + _u_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _t_); + return caml_call1(Base_Or_error[35], _u_); + } + var symbol$1 = runtime.caml_div, symbol$2 = runtime.caml_mul; + function symbol$3(_r_, _q_){return _r_ - _q_ | 0;} + function symbol$4(_p_, _o_){return _p_ + _o_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_nativeint(t){return t;} + function to_nativeint(t){return t;} + var + popcount = Base_Popcount[4], + of_int_exn = Base_Int_conversions[5], + to_int = Base_Int_conversions[22], + to_int_exn = Base_Int_conversions[23], + to_int_trunc = Base_Int_conversions[24], + of_int32 = Base_Int_conversions[10], + to_int32 = Base_Int_conversions[25], + to_int32_exn = Base_Int_conversions[26], + to_int32_trunc = Base_Int_conversions[27], + of_int64 = Base_Int_conversions[17], + of_int64_exn = Base_Int_conversions[18], + of_int64_trunc = Base_Int_conversions[19], + to_int64 = Base_Int_conversions[28]; + function pow(b, e){ + var _m_ = caml_call1(to_int_exn, e), _n_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _n_, _m_)); + } + function symbol$5(b, e){return pow(b, e);} + var + _g_ = Base_Import[104], + symbol$6 = _g_[3], + symbol$7 = _g_[1], + symbol$8 = _g_[5], + symbol$9 = _g_[4], + symbol$10 = _g_[2], + symbol$11 = _g_[6], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + of_int_exn, + rem]), + symbol$12 = include$3[1], + symbol$13 = include$3[2], + symbol$14 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[104], + symbol$15 = include$4[1], + symbol$16 = include$4[2], + symbol$17 = include$4[3], + symbol$18 = include$4[4], + symbol$19 = include$4[5], + symbol$20 = include$4[6], + ascending = include$4[7], + descending = include$4[8], + compare$2 = include$4[9], + equal = include$4[10], + max = include$4[11], + min = include$4[12], + _h_ = runtime.caml_int32_bswap, + _i_ = + [0, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _j_(_l_){return runtime.Base_int_math_nativeint_ctz(_l_);} + var + Base_Nativeint = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$20, + symbol$16, + symbol$18, + symbol$19, + symbol$15, + symbol$17, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero$1, + one, + minus_one, + symbol$4, + symbol$3, + symbol$2, + symbol$5, + symbol$0, + symbol$0, + symbol$13, + symbol$12, + symbol$1, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_k_){return runtime.Base_int_math_nativeint_clz(_k_);}, + _j_, + _i_, + of_int_exn, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + to_int_trunc, + to_int32_trunc, + of_int64_trunc, + _h_]; + runtime.caml_register_global(34, Base_Nativeint, "Base__Nativeint"); + return; + } + (globalThis)); + +//# 29983 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_Lx = "%Lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_or = runtime.caml_int64_or, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int64.Hex", + module_name$0 = "Base.Int64", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[204], + func = Base_Import[218], + _e_ = [0, [7, 6, 0, 0, 0], cst_Lx], + _d_ = [0, [7, 6, 0, 0, 0], cst_Lx], + cst_Int64_ceil_log2_got_invali = "[Int64.ceil_log2] got invalid input", + cst_Int64_floor_log2_got_inval = "[Int64.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int64.ml", 100, 2], + _a_ = + [0, + [11, + "Int64.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int64.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[169], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + hashable = [0, hash, Stdlib_Int64[15], sexp_of_t]; + function compare(_C_, _B_){return caml_int64_compare(_C_, _B_);} + var + to_string = Stdlib_Int64[14], + of_string = runtime.caml_int64_of_string, + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 64), + float_upper_bound = caml_call1(Base_Float0[23], 64), + float_of_bits = runtime.caml_int64_float_of_bits, + bits_of_float = runtime.caml_int64_bits_of_float, + shift_right_logical = caml_int64_shift_right_unsigne, + shift_right = runtime.caml_int64_shift_right, + shift_left = runtime.caml_int64_shift_left, + bit_not = Stdlib_Int64[11], + bit_xor = runtime.caml_int64_xor, + bit_or = caml_int64_or, + bit_and = caml_int64_and, + min_value = Stdlib_Int64[10], + max_value = Stdlib_Int64[9], + abs = Stdlib_Int64[8], + pred = Stdlib_Int64[7], + succ = Stdlib_Int64[6], + pow = Base_Int_math[2][2], + rem = runtime.caml_int64_mod, + neg = caml_int64_neg, + minus_one = Stdlib_Int64[3], + one = Stdlib_Int64[2], + zero = Stdlib_Int64[1], + to_float = runtime.caml_int64_to_float, + of_float_unchecked = caml_int64_of_float, + num_bits = 64; + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return caml_int64_of_float(f); + var _A_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _A_, 0); + } + function symbol(b, e){return caml_call2(pow, b, e);} + function bswap16(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 48); + } + function bswap32(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 32); + } + function bswap48(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 16); + } + var + include$0 = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5]; + function invariant(param){return 0;} + function between(t, low, high){ + var + _y_ = caml_lessequal(low, t), + _z_ = _y_ ? caml_lessequal(t, high) : _y_; + return _z_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _v_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _w_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _v_], + _x_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _w_); + return caml_call1(Base_Or_error[35], _x_); + } + function incr(r){r[1] = caml_int64_add(r[1], one); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one); return 0;} + function of_int64_exn(_u_){return _u_;} + function to_int64(t){return t;} + var + popcount = Base_Popcount[3], + of_int_exn = caml_int64_of_int32, + to_int = Base_Int_conversions[11], + to_int_exn = Base_Int_conversions[12], + of_int32_exn = caml_int64_of_int32, + to_int32 = Base_Int_conversions[14], + to_int32_exn = Base_Int_conversions[15], + of_nativeint = Base_Int_conversions[28], + to_nativeint = Base_Int_conversions[17], + to_nativeint_exn = Base_Int_conversions[18], + raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int64[7], x), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 1)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 2)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 4)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 8)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 16)), + x$6 = caml_int64_or(x$5, caml_int64_shift_right_unsigne(x$5, 32)); + return caml_call1(Stdlib_Int64[6], x$6); + } + function floor_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_int64_or(x, caml_int64_shift_right_unsigne(x, 1)), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 2)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 4)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 8)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 16)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 32)); + return caml_int64_sub(x$5, caml_int64_shift_right_unsigne(x$5, 1)); + } + function is_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var _t_ = Stdlib_Int64[1]; + return caml_equal(caml_int64_and(x, caml_call1(Stdlib_Int64[7], x)), _t_); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _q_ = [0, [0, cst, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_floor_log2_got_inval, _q_)); + } + var + _r_ = runtime.Base_int_math_int64_clz(i), + _s_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _s_, _r_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _o_ = [0, [0, cst$0, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_ceil_log2_got_invali, _o_)); + } + if(caml_call2(Stdlib_Int64[17], i, Stdlib_Int64[2])) return 0; + var _p_ = runtime.Base_int_math_int64_clz(caml_call1(Stdlib_Int64[7], i)); + return caml_call2(Base_Import[93], num_bits, _p_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare$0 = Base_Import[231], + hash_fold_t$0 = Base_Import[204], + func$0 = Base_Import[218]; + function hash$0(x){return caml_call1(func$0, x);} + var symbol$0 = caml_lessthan; + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _m_(_n_){return _n_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _m_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$0, + neg, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + caml_int64_add, + caml_int64_sub, + runtime.caml_int64_mul, + runtime.caml_int64_div, + caml_int64_neg, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + abs, + caml_int64_neg, + zero, + of_int_exn, + rem]), + symbol$1 = include$3[1], + symbol$2 = include$3[2], + symbol$3 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[103], + ascending = include$4[1], + descending = include$4[2], + max = include$4[3], + min = include$4[4], + _f_ = [0, symbol, bit_not, abs, zero, symbol$1, symbol$2, symbol$3]; + function _g_(_l_){return runtime.Base_int_math_int64_ctz(_l_);} + function _h_(_k_){return runtime.Base_int_math_int64_clz(_k_);} + var + Base_Int64 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + caml_equal, + function(_j_, _i_){return caml_int64_compare(_j_, _i_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _h_, + _g_, + _f_, + symbol, + bit_not, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + to_int, + to_int32, + of_nativeint, + to_nativeint, + bits_of_float, + float_of_bits, + bswap16, + bswap32, + bswap48]; + runtime.caml_register_global(29, Base_Int64, "Base__Int64"); + return; + } + (globalThis)); + +//# 30380 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_int63_emul_ml = "src/int63_emul.ml", + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_string = runtime.caml_int64_of_string, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + mask = runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + module_name = "Base.Int63.Hex", + module_name$0 = "Base.Int63", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Int64 = global_data.Base__Int64, + Base_String = global_data.Base__String, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Base_Popcount = global_data.Base__Popcount, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Import[231], + hash_fold_t = Base_Import[204], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + cst_0x = "0x", + _l_ = [0, [7, 6, 0, 0, 0], "%Lx"], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _k_ = [0, cst_src_int63_emul_ml, 317, 2], + _i_ = + [0, + [11, + "Int63.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int63.of_float: argument (%f) is out of range or NaN"], + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = + [0, + [11, "Int63.of_string: invalid input ", [3, 0, 0]], + "Int63.of_string: invalid input %S"], + _e_ = [0, cst_src_int63_emul_ml, 114, 20], + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function wrap_exn(x){ + caml_call1(Base_Int_conversions[20], x); + return caml_int64_mul(x, _a_); + } + function wrap_modulo(x){return caml_int64_mul(x, _c_);} + function unwrap(x){return caml_int64_shift_right(x, 1);} + function m(x){return caml_int64_and(x, mask);} + function invariant(t){ + if(caml_equal(m(t), t)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + } + var + symbol = caml_int64_add, + symbol$0 = caml_int64_sub, + symbol$1 = caml_int64_neg; + function abs(x){return caml_call1(Stdlib_Int64[8], x);} + var one = wrap_exn(_f_); + function succ(a){return caml_int64_add(a, one);} + function pred(a){return caml_int64_sub(a, one);} + var min_value = m(Stdlib_Int64[10]), max_value = m(Stdlib_Int64[9]); + function bit_not(x){return m(caml_call1(Stdlib_Int64[11], x));} + var + bit_and = caml_int64_and, + bit_xor = runtime.caml_int64_xor, + bit_or = runtime.caml_int64_or, + shift_left = runtime.caml_int64_shift_left; + function shift_right(x, i){return m(caml_int64_shift_right(x, i));} + function shift_right_logical(x, i){ + return m(caml_int64_shift_right_unsigne(x, i)); + } + var f = Base_Int_math[2][3]; + function pow(a, b){ + return caml_int64_mul + (caml_call2 + (f, caml_int64_shift_right(a, 1), caml_int64_shift_right(b, 1)), + _d_); + } + function symbol$2(a, b){ + return caml_int64_mul(a, caml_int64_shift_right(b, 1)); + } + function symbol$3(a, b){return wrap_modulo(runtime.caml_int64_div(a, b));} + var rem = runtime.caml_int64_mod; + function popcount(x){return caml_call1(Base_Popcount[3], x);} + function to_int64(t){return caml_int64_shift_right(t, 1);} + function of_int64(t){ + return caml_call1(Base_Int_conversions[21], t) + ? [0, caml_int64_mul(t, _b_)] + : 0; + } + function of_int64_exn(t){return wrap_exn(t);} + function of_int64_trunc(t){return wrap_modulo(t);} + function t_of_sexp(x){return wrap_exn(caml_call1(Base_Import[169], x));} + function sexp_of_t$0(x){ + return caml_call1(Base_Import[145], caml_int64_shift_right(x, 1)); + } + function compare$0(x, y){return caml_call2(compare, x, y);} + function is_pow2(x){ + return caml_call1(Base_Int64[67], caml_int64_shift_right(x, 1)); + } + function clz(x){return caml_call1(Base_Int64[68], x);} + function ctz(x){ + return caml_call1(Base_Int64[69], caml_int64_shift_right(x, 1)); + } + function floor_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function ceil_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function floor_log2(x){ + return caml_call1(Base_Int64[66], caml_int64_shift_right(x, 1)); + } + function ceil_log2(x){ + return caml_call1(Base_Int64[65], caml_int64_shift_right(x, 1)); + } + function hash(x){return caml_call1(Stdlib_MoreLabels[1][28], x);} + var hashable = [0, hash, compare$0, sexp_of_t$0]; + function invalid_str(x){return caml_call3(Base_Printf[6], _g_, x, 0);} + function to_string(x){ + return caml_call1(Stdlib_Int64[14], caml_int64_shift_right(x, 1)); + } + function of_string(str){ + try{ + var len = caml_ml_string_length(str); + if(0 < len){ + var switcher = caml_string_get(str, 0) - 43 | 0, switch$0 = 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var sign = 4003188, pos = 1; break; + case 1: + switch$0 = 1; break; + default: var sign = 3901488, pos = 1; + } + if(switch$0) var sign = 4003188, pos = 0; + } + else + var sign = 4003188, pos = 0; + if(caml_call2(Base_Import[91], pos, 2) < len) + var + c1 = caml_string_get(str, pos), + c2 = caml_string_get(str, caml_call2(Base_Import[91], pos, 1)), + match = + 48 === c1 + ? 9 < c2 - 48 >>> 0 ? [0, sign, 0] : [0, sign, 1] + : [0, sign, 1]; + else + var match = [0, sign, 1]; + var signedness = match[2]; + if(signedness) + var _w_ = of_int64_exn(caml_int64_of_string(str)); + else{ + if(4003188 <= sign) + var pos_str = str; + else + var + _x_ = caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + pos_str = caml_call3(Base_String[2], str, 1, _x_); + var int64 = caml_int64_of_string(pos_str); + if(caml_lessthan(int64, _h_)) invalid_str(str); + var + int63 = wrap_modulo(int64), + int63$0 = 4003188 <= sign ? int63 : caml_int64_neg(int63), + _w_ = int63$0; + } + return _w_; + } + catch(_y_){return invalid_str(str);} + } + function bswap16(t){ + return wrap_modulo + (caml_call1(Base_Int64[84], caml_int64_shift_right(t, 1))); + } + function bswap32(t){ + return wrap_modulo + (caml_call1(Base_Int64[85], caml_int64_shift_right(t, 1))); + } + function bswap48(t){ + return wrap_modulo + (caml_call1(Base_Int64[86], caml_int64_shift_right(t, 1))); + } + var + float_lower_bound = caml_call1(Base_Float0[25], 63), + float_upper_bound = caml_call1(Base_Float0[23], 63), + minus_one = wrap_exn(Stdlib_Int64[3]), + one$0 = wrap_exn(Stdlib_Int64[2]), + zero = wrap_exn(Stdlib_Int64[1]), + num_bits = 63; + function to_float(x){ + return runtime.caml_int64_to_float(caml_int64_shift_right(x, 1)); + } + function of_float_unchecked(x){return wrap_modulo(caml_int64_of_float(x));} + function of_float(t){ + if + (caml_call2(Base_Import[108][6], t, float_lower_bound) + && caml_call2(Base_Import[108][2], t, float_upper_bound)) + return wrap_modulo(caml_int64_of_float(t)); + var _v_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _i_, _v_, 0); + } + var + _j_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t$0, zero]), + is_positive = _j_[1], + is_non_negative = _j_[2], + is_negative = _j_[3], + is_non_positive = _j_[4], + sign = _j_[5]; + function between(t, low, high){ + var + _t_ = caml_lessequal(low, t), + _u_ = _t_ ? caml_lessequal(t, high) : _t_; + return _u_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _q_ = [0, [0, cst_max, sexp_of_t$0(max)], 0], + _r_ = [0, [0, cst_min, sexp_of_t$0(min)], _q_], + _s_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _r_); + return caml_call1(Base_Or_error[35], _s_); + } + function symbol$4(b, e){return pow(b, e);} + function incr(r){r[1] = caml_int64_add(r[1], one$0); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one$0); return 0;} + function of_int(x){ + return wrap_exn(caml_call1(Base_Int_conversions[4], x)); + } + function of_int_exn(x){return of_int(x);} + function to_int(x){ + return caml_call1(Base_Int_conversions[11], caml_int64_shift_right(x, 1)); + } + function to_int_exn(x){ + return caml_call1(Base_Int_conversions[12], caml_int64_shift_right(x, 1)); + } + function to_int_trunc(x){ + return caml_call1(Base_Int_conversions[13], caml_int64_shift_right(x, 1)); + } + function of_int32(x){ + return wrap_exn(caml_call1(Base_Int_conversions[9], x)); + } + function of_int32_exn(x){return of_int32(x);} + function to_int32(x){ + return caml_call1(Base_Int_conversions[14], caml_int64_shift_right(x, 1)); + } + function to_int32_exn(x){ + return caml_call1(Base_Int_conversions[15], caml_int64_shift_right(x, 1)); + } + function to_int32_trunc(x){ + return caml_call1(Base_Int_conversions[16], caml_int64_shift_right(x, 1)); + } + function of_nativeint(x){ + return of_int64(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_exn(x){ + return wrap_exn(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_trunc(x){ + return of_int64_trunc(caml_call1(Base_Int_conversions[28], x)); + } + function to_nativeint(x){ + return caml_call1(Base_Int_conversions[17], caml_int64_shift_right(x, 1)); + } + function to_nativeint_exn(x){ + return caml_call1(Base_Int_conversions[18], caml_int64_shift_right(x, 1)); + } + function to_nativeint_trunc(x){ + return caml_call1(Base_Int_conversions[19], caml_int64_shift_right(x, 1)); + } + var + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$1 = include$0[2]; + function hash$0(x){return hash(x);} + var symbol$5 = caml_lessthan; + function to_string$0(i){ + return caml_call2 + (Base_Printf[2], _l_, caml_int64_shift_right_unsigne(i, 1)); + } + function of_string$0(s){ + return of_string(caml_call2(Base_Import[112], cst_0x, s)); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$5, + symbol$1, + module_name]), + Hex = include$1[1]; + function to_string$1(x){return to_string(x);} + var + pp = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string$1])[1], + symbol$6 = caml_notequal, + symbol$7 = caml_lessthan, + symbol$8 = caml_greaterthan, + symbol$9 = caml_equal, + symbol$10 = caml_lessequal, + symbol$11 = caml_greaterequal, + include$2 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + of_int_exn, + rem]), + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + round = include$2[4], + round_towards_zero = include$2[5], + round_down = include$2[6], + round_up = include$2[7], + round_nearest = include$2[8], + Repr = [0], + include$3 = Base_Import[103], + ascending = include$3[1], + descending = include$3[2], + max = include$3[3], + min = include$3[4], + repr = 1, + _m_ = [0, wrap_exn, unwrap], + _n_ = + [0, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$4, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical], + Base_Int63_emul = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + to_string, + caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + caml_notequal, + caml_equal, + function(_p_, _o_){return runtime.caml_int64_compare(_p_, _o_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one$0, + minus_one, + symbol, + symbol$0, + symbol$2, + symbol$4, + symbol$1, + symbol$1, + symbol$13, + symbol$12, + symbol$3, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _n_, + of_int, + to_int, + to_int_trunc, + of_int32, + to_int32, + to_int32_trunc, + of_int64, + of_int64_trunc, + of_nativeint, + to_nativeint, + of_nativeint_trunc, + to_nativeint_trunc, + bswap16, + bswap32, + bswap48, + _m_, + Repr, + repr]; + runtime.caml_register_global(34, Base_Int63_emul, "Base__Int63_emul"); + return; + } + (globalThis)); + +//# 30933 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_bool_ml = "src/bool.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, 0]], + module_name = "Base.Bool", + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Printf = global_data.Base__Printf, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + invalid_argf = Base_Printf[7], + compare = Base_Import[226], + hash_fold_t = Base_Import[208], + func = Base_Import[222], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, cst_src_bool_ml, 56, 2], + _a_ = + [0, + [11, "Bool.of_string: expected true or false but got ", [2, 0, 0]], + "Bool.of_string: expected true or false but got %s"], + _c_ = [0, cst_src_bool_ml, 83, 9]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[162], + sexp_of_t = Base_Import[138], + t_sexp_grammar = Base_Import[182], + hashable = [0, hash, compare, sexp_of_t]; + function of_string(s){ + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? caml_call3(invalid_argf, _a_, s, 0) + : 1 + : 0; + } + var + to_string = Base_Import[85][29], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + include$0 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$0[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[105][2], low, t); + return _k_ ? caml_call2(Base_Import[105][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[105][1], t, min) + ? min + : caml_call2(Base_Import[105][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[105][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[105][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function to_int(x){return caml_call1(Base_Import[86], x);} + function symbol(a, b){ + var _f_ = to_int(b), _g_ = to_int(a); + return caml_call2(Base_Import[118], _g_, _f_); + } + function symbol$0(a, b){ + var _d_ = to_int(b), _e_ = to_int(a); + return caml_call2(Base_Import[116], _e_, _d_); + } + if(1 === to_int(1) && 0 === to_int(0)){ + var + include$1 = Base_Import[105], + symbol$1 = include$1[1], + symbol$2 = include$1[2], + symbol$3 = include$1[3], + symbol$4 = include$1[4], + symbol$5 = include$1[5], + symbol$6 = include$1[6], + ascending = include$1[7], + descending = include$1[8], + compare$0 = include$1[9], + equal = include$1[10], + max = include$1[11], + min = include$1[12], + Base_Bool = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$6, + symbol$2, + symbol$4, + symbol$5, + symbol$1, + symbol$3, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + to_int, + [0, symbol$0, symbol]]; + runtime.caml_register_global(17, Base_Bool, "Base__Bool"); + return; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + (globalThis)); + +//# 31089 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_lx = "%lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int32.Hex", + module_name$0 = "Base.Int32", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Int_math = global_data.Base__Int_math, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[205], + func = Base_Import[219], + _e_ = [0, [5, 6, 0, 0, 0], cst_lx], + _d_ = [0, [5, 6, 0, 0, 0], cst_lx], + cst_Int32_ceil_log2_got_invali = "[Int32.ceil_log2] got invalid input", + cst_Int32_floor_log2_got_inval = "[Int32.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int32.ml", 97, 4], + _a_ = + [0, + [11, + "Int32.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int32.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[168], + sexp_of_t = Base_Import[144], + t_sexp_grammar = Base_Import[188], + hashable = [0, hash, Stdlib_Int32[15], sexp_of_t]; + function ascending(x, y){return caml_call2(Stdlib_Int32[15], x, y);} + var + to_string = Stdlib_Int32[14], + of_string = runtime.caml_int_of_string, + include = caml_call1(Base_Comparator[5], [0, ascending, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 32), + float_upper_bound = caml_call1(Base_Float0[23], 32), + float_of_bits = runtime.caml_int32_float_of_bits, + bits_of_float = runtime.caml_int32_bits_of_float, + num_bits = 32; + function shift_right_logical(_S_, _R_){return _S_ >>> _R_ | 0;} + function shift_right(_Q_, _P_){return _Q_ >> _P_;} + function shift_left(_O_, _N_){return _O_ << _N_;} + var bit_not = Stdlib_Int32[11]; + function bit_xor(_M_, _L_){return _M_ ^ _L_;} + function bit_or(_K_, _J_){return _K_ | _J_;} + function bit_and(_I_, _H_){return _I_ & _H_;} + var + min_value = Stdlib_Int32[10], + max_value = Stdlib_Int32[9], + abs = Stdlib_Int32[8], + pred = Stdlib_Int32[7], + succ = Stdlib_Int32[6], + rem = runtime.caml_mod; + function symbol(_G_){return - _G_ | 0;} + var + minus_one = Stdlib_Int32[3], + one = Stdlib_Int32[2], + zero = Stdlib_Int32[1]; + function to_float(_F_){return _F_;} + function of_float_unchecked(_E_){return _E_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _D_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _D_, 0); + } + var + include$0 = + caml_call1(Base_Comparable[13], [0, ascending, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5], + symbol$0 = runtime.caml_greaterequal, + symbol$1 = caml_lessequal, + symbol$2 = caml_equal, + symbol$3 = caml_greaterthan, + symbol$4 = caml_lessthan, + symbol$5 = runtime.caml_notequal; + function descending(x, y){return ascending(y, x);} + function min(x, y){return caml_lessthan(x, y) ? x : y;} + function max(x, y){return caml_greaterthan(x, y) ? x : y;} + var equal = caml_equal; + function between(t, low, high){ + var _C_ = caml_lessequal(low, t); + return _C_ ? caml_lessequal(t, high) : _C_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _z_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _A_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _z_], + _B_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _A_); + return caml_call1(Base_Or_error[35], _B_); + } + function invariant(param){return 0;} + var symbol$6 = runtime.caml_div, symbol$7 = runtime.caml_mul; + function symbol$8(_y_, _x_){return _y_ - _x_ | 0;} + function symbol$9(_w_, _v_){return _w_ + _v_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_int32(t){return t;} + function to_int32(t){return t;} + var + popcount = Base_Popcount[2], + of_int = Base_Int_conversions[1], + of_int_exn = Base_Int_conversions[2], + of_int_trunc = Base_Int_conversions[3], + to_int = Base_Int_conversions[6], + to_int_exn = Base_Int_conversions[7], + to_int_trunc = Base_Int_conversions[8], + of_int64 = Base_Int_conversions[14], + of_int64_exn = Base_Int_conversions[15], + of_int64_trunc = Base_Int_conversions[16], + to_int64 = Base_Int_conversions[9], + of_nativeint = Base_Int_conversions[25], + of_nativeint_exn = Base_Int_conversions[26], + of_nativeint_trunc = Base_Int_conversions[27], + to_nativeint = Base_Int_conversions[10]; + function pow(b, e){ + var _t_ = caml_call1(to_int_exn, e), _u_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _u_, _t_)); + } + function symbol$10(b, e){return pow(b, e);} + function bswap16(x){return caml_int32_bswap(x) >>> 16 | 0;} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int32[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0; + return caml_call1(Stdlib_Int32[6], x$5); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0; + return x$4 - (x$4 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var _r_ = Stdlib_Int32[1], _s_ = x & caml_call1(Stdlib_Int32[7], x); + return caml_call2(Base_Import[102][4], _s_, _r_); + } + function floor_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _o_ = [0, [0, cst, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_floor_log2_got_inval, _o_)); + } + var + _p_ = runtime.Base_int_math_int32_clz(i), + _q_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _q_, _p_); + } + function ceil_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _m_ = [0, [0, cst$0, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_ceil_log2_got_invali, _m_)); + } + if(caml_call2(Stdlib_Int32[17], i, Stdlib_Int32[2])) return 0; + var _n_ = runtime.Base_int_math_int32_clz(caml_call1(Stdlib_Int32[7], i)); + return caml_call2(Base_Import[93], num_bits, _n_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare = Base_Import[230], + hash_fold_t$0 = Base_Import[205], + func$0 = Base_Import[219]; + function hash$0(x){return caml_call1(func$0, x);} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _k_(_l_){return _l_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _k_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$4, + symbol, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + of_int_exn, + rem]), + symbol$11 = include$3[1], + symbol$12 = include$3[2], + symbol$13 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + _f_ = caml_int32_bswap, + _g_ = + [0, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$10, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + symbol$11, + symbol$12, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _h_(_j_){return runtime.Base_int_math_int32_ctz(_j_);} + var + Base_Int32 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + ascending, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + symbol$9, + symbol$8, + symbol$7, + symbol$10, + symbol, + symbol, + symbol$12, + symbol$11, + symbol$6, + rem, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_i_){return runtime.Base_int_math_int32_clz(_i_);}, + _h_, + _g_, + of_int, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + of_int_trunc, + to_int_trunc, + of_nativeint_trunc, + of_int64_trunc, + bits_of_float, + float_of_bits, + bswap16, + _f_]; + runtime.caml_register_global(29, Base_Int32, "Base__Int32"); + return; + } + (globalThis)); + +//# 31536 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_product$1 = "product", + cst_t$3 = "t", + cst_u$3 = "u", + caml_div = runtime.caml_div, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Word_size = global_data.Base__Word_size, + Base_Int = global_data.Base__Int, + Base_Sexp = global_data.Base__Sexp, + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Int64 = global_data.Base__Int64, + Base_Error = global_data.Base__Error, + Base_Int63_emul = global_data.Base__Int63_emul, + Assert_failure = global_data.Assert_failure, + raise_s = Base_Error[30], + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + cst_neg_overflow = "neg overflow", + cst_abs_overflow = "abs overflow", + cst_product$0 = cst_product$1, + cst_u$2 = cst_u$3, + cst_t$2 = cst_t$3, + cst_overflow$2 = "( / ) overflow", + cst_product = cst_product$1, + cst_u$1 = cst_u$3, + cst_t$1 = cst_t$3, + cst_overflow$1 = "( * ) overflow", + cst_diff = "diff", + cst_u$0 = cst_u$3, + cst_t$0 = cst_t$3, + cst_overflow$0 = "( - ) overflow", + cst_sum = "sum", + cst_u = cst_u$3, + cst_t = cst_t$3, + cst_overflow = "( + ) overflow", + _b_ = [0, "src/int63.ml", 155, 9], + repr = Base_Word_size[3] ? 0 : 1, + t_sexp_grammar = Base_Int[1], + of_float = Base_Int[2], + to_float = Base_Int[3], + of_int_exn = Base_Int[4], + to_int_exn = Base_Int[5], + hash_fold_t = Base_Int[6], + hash = Base_Int[7], + t_of_sexp = Base_Int[8], + sexp_of_t = Base_Int[9], + of_string = Base_Int[10], + to_string = Base_Int[11], + equal = Base_Int[12], + compare = Base_Int[13], + min = Base_Int[14], + max = Base_Int[15], + ascending = Base_Int[16], + descending = Base_Int[17], + between = Base_Int[18], + clamp_exn = Base_Int[19], + clamp = Base_Int[20], + comparator = Base_Int[21], + pp = Base_Int[22], + hashable = Base_Int[23], + is_positive = Base_Int[24], + is_non_negative = Base_Int[25], + is_negative = Base_Int[26], + is_non_positive = Base_Int[27], + sign = Base_Int[28], + invariant = Base_Int[29], + Hex = Base_Int[30], + to_string_hum = Base_Int[31], + one = Base_Int[32], + minus_one = Base_Int[33], + rem = Base_Int[34], + round = Base_Int[35], + round_towards_zero = Base_Int[36], + round_down = Base_Int[37], + round_up = Base_Int[38], + round_nearest = Base_Int[39], + succ = Base_Int[40], + pred = Base_Int[41], + pow = Base_Int[42], + bit_and = Base_Int[43], + bit_or = Base_Int[44], + bit_xor = Base_Int[45], + bit_not = Base_Int[46], + popcount = Base_Int[47], + shift_left = Base_Int[48], + shift_right = Base_Int[49], + decr = Base_Int[50], + incr = Base_Int[51], + of_int32_exn = Base_Int[52], + to_int32_exn = Base_Int[53], + of_int64_exn = Base_Int[54], + to_int64 = Base_Int[55], + of_nativeint_exn = Base_Int[56], + to_nativeint_exn = Base_Int[57], + of_float_unchecked = Base_Int[58], + num_bits = Base_Int[59], + max_value = Base_Int[60], + min_value = Base_Int[61], + shift_right_logical = Base_Int[62], + ceil_pow2 = Base_Int[63], + floor_pow2 = Base_Int[64], + ceil_log2 = Base_Int[65], + floor_log2 = Base_Int[66], + is_pow2 = Base_Int[67], + clz = Base_Int[68], + ctz = Base_Int[69], + O = Base_Int[70], + symbol = Base_Int[71], + lnot = Base_Int[72], + abs = Base_Int[73], + zero = Base_Int[74], + symbol$0 = Base_Int[75], + symbol$1 = Base_Int[76], + symbol$2 = Base_Int[77], + of_int = Base_Int[79], + to_int32 = Base_Int[82], + of_int64 = Base_Int[83], + of_nativeint = Base_Int[84], + _a_ = Base_Int[85]; + function to_int(x){return [0, x];} + function to_int_trunc(x){return x;} + function to_nativeint_trunc(x){return caml_call1(_a_, x);} + function to_nativeint(x){return [0, caml_call1(_a_, x)];} + var repr$0 = 0; + function bswap32(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[85], caml_int64_of_int32(t))); + } + function bswap48(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[86], caml_int64_of_int32(t))); + } + if(repr) + var + include = + [0, + Base_Int63_emul[1], + Base_Int63_emul[2], + Base_Int63_emul[3], + Base_Int63_emul[4], + Base_Int63_emul[5], + Base_Int63_emul[6], + Base_Int63_emul[7], + Base_Int63_emul[8], + Base_Int63_emul[9], + Base_Int63_emul[10], + Base_Int63_emul[11], + Base_Int63_emul[12], + Base_Int63_emul[13], + Base_Int63_emul[14], + Base_Int63_emul[15], + Base_Int63_emul[16], + Base_Int63_emul[17], + Base_Int63_emul[18], + Base_Int63_emul[19], + Base_Int63_emul[20], + Base_Int63_emul[21], + Base_Int63_emul[22], + Base_Int63_emul[23], + Base_Int63_emul[24], + Base_Int63_emul[25], + Base_Int63_emul[26], + Base_Int63_emul[27], + Base_Int63_emul[28], + Base_Int63_emul[29], + Base_Int63_emul[30], + Base_Int63_emul[31], + Base_Int63_emul[32], + Base_Int63_emul[33], + Base_Int63_emul[34], + Base_Int63_emul[35], + Base_Int63_emul[36], + Base_Int63_emul[37], + Base_Int63_emul[38], + Base_Int63_emul[39], + Base_Int63_emul[40], + Base_Int63_emul[41], + Base_Int63_emul[42], + Base_Int63_emul[43], + Base_Int63_emul[44], + Base_Int63_emul[45], + Base_Int63_emul[46], + Base_Int63_emul[47], + Base_Int63_emul[48], + Base_Int63_emul[49], + Base_Int63_emul[50], + Base_Int63_emul[51], + Base_Int63_emul[52], + Base_Int63_emul[53], + Base_Int63_emul[54], + Base_Int63_emul[55], + Base_Int63_emul[56], + Base_Int63_emul[57], + Base_Int63_emul[58], + Base_Int63_emul[59], + Base_Int63_emul[60], + Base_Int63_emul[61], + Base_Int63_emul[62], + Base_Int63_emul[63], + Base_Int63_emul[64], + Base_Int63_emul[65], + Base_Int63_emul[66], + Base_Int63_emul[67], + Base_Int63_emul[68], + Base_Int63_emul[69], + Base_Int63_emul[70], + Base_Int63_emul[71], + Base_Int63_emul[72], + Base_Int63_emul[73], + Base_Int63_emul[74], + Base_Int63_emul[75], + Base_Int63_emul[76], + Base_Int63_emul[77], + Base_Int63_emul[78], + Base_Int63_emul[79], + Base_Int63_emul[80], + Base_Int63_emul[81], + Base_Int63_emul[83], + Base_Int63_emul[84], + Base_Int63_emul[85], + Base_Int63_emul[86], + Base_Int63_emul[87], + Base_Int63_emul[88], + Base_Int63_emul[89], + Base_Int63_emul[90], + Base_Int63_emul[91], + Base_Int63_emul[92], + Base_Int63_emul[93], + Base_Int63_emul[94], + Base_Int63_emul[95], + Base_Int63_emul[96], + Base_Int63_emul[97], + Base_Int63_emul[98], + Base_Int63_emul[99], + Base_Int63_emul[100], + Base_Int63_emul[101], + Base_Int63_emul[102], + Base_Int63_emul[103], + Base_Int63_emul[104], + Base_Int63_emul[105], + Base_Int63_emul[106], + Base_Int63_emul[107], + Base_Int63_emul[82], + Base_Int63_emul[113], + Base_Int63_emul[108], + Base_Int63_emul[109], + Base_Int63_emul[110]]; + else + var + _c_ = runtime.caml_bswap16, + _d_ = function(_bo_){return _bo_;}, + _e_ = caml_int64_to_int32, + _f_ = function(_bn_){return _bn_;}, + _g_ = function(_bm_, _bl_){return _bm_ >>> _bl_ | 0;}, + _h_ = function(_bk_, _bj_){return _bk_ >> _bj_;}, + _i_ = function(_bi_, _bh_){return _bi_ << _bh_;}, + _j_ = O[2], + _k_ = function(_bg_, _bf_){return _bg_ ^ _bf_;}, + _l_ = function(_be_, _bd_){return _be_ | _bd_;}, + _m_ = function(_bc_, _bb_){return _bc_ & _bb_;}, + _n_ = O[7], + _o_ = O[6], + _p_ = O[5], + _q_ = O[4], + _r_ = function(_ba_){return - _ba_ | 0;}, + _s_ = O[3], + _t_ = function(_a$_, _a__){return _a$_ !== _a__ ? 1 : 0;}, + _u_ = function(_a9_, _a8_){return _a9_ < _a8_ ? 1 : 0;}, + _v_ = function(_a7_, _a6_){return _a6_ < _a7_ ? 1 : 0;}, + _w_ = function(_a5_, _a4_){return _a5_ === _a4_ ? 1 : 0;}, + _x_ = function(_a3_, _a2_){return _a3_ <= _a2_ ? 1 : 0;}, + _y_ = function(_a1_, _a0_){return _a0_ <= _a1_ ? 1 : 0;}, + _z_ = O[1], + _A_ = function(_aZ_){return - _aZ_ | 0;}, + _B_ = caml_div, + _C_ = caml_mul, + _D_ = function(_aY_, _aX_){return _aY_ - _aX_ | 0;}, + _E_ = + [0, + function(_aW_, _aV_){return _aW_ + _aV_ | 0;}, + _D_, + _C_, + _B_, + _A_, + _z_, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_], + _F_ = function(_aU_, _aT_){return _aU_ >>> _aT_ | 0;}, + _G_ = function(_aS_, _aR_){return _aS_ >> _aR_;}, + _H_ = function(_aQ_, _aP_){return _aQ_ << _aP_;}, + _I_ = function(_aO_, _aN_){return _aO_ ^ _aN_;}, + _J_ = function(_aM_, _aL_){return _aM_ | _aL_;}, + _K_ = function(_aK_, _aJ_){return _aK_ & _aJ_;}, + _L_ = caml_div, + _M_ = function(_aI_){return - _aI_ | 0;}, + _N_ = function(_aH_){return - _aH_ | 0;}, + _O_ = caml_mul, + _P_ = function(_aG_, _aF_){return _aG_ - _aF_ | 0;}, + _Q_ = function(_aE_, _aD_){return _aE_ + _aD_ | 0;}, + _R_ = function(_aC_, _aB_){return _aC_ !== _aB_ ? 1 : 0;}, + _S_ = function(_aA_, _az_){return _aA_ < _az_ ? 1 : 0;}, + _T_ = function(_ay_, _ax_){return _ax_ < _ay_ ? 1 : 0;}, + _U_ = function(_aw_, _av_){return _aw_ === _av_ ? 1 : 0;}, + _V_ = function(_au_, _at_){return _au_ <= _at_ ? 1 : 0;}, + include = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + function(_as_, _ar_){return _ar_ <= _as_ ? 1 : 0;}, + _V_, + _U_, + _T_, + _S_, + _R_, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + _Q_, + _P_, + _O_, + symbol, + _N_, + _M_, + symbol$1, + symbol$0, + _L_, + rem, + symbol$2, + _K_, + _J_, + _I_, + lnot, + _H_, + _G_, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + num_bits, + max_value, + min_value, + _F_, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _E_, + of_int, + to_int, + to_int_trunc, + of_int32_exn, + to_int32, + _f_, + of_int64, + _e_, + of_nativeint, + to_nativeint, + _d_, + to_nativeint_trunc, + of_float_unchecked, + repr$0, + _c_, + bswap32, + bswap48]; + var + t_sexp_grammar$0 = include[1], + of_float$0 = include[2], + to_float$0 = include[3], + of_int_exn$0 = include[4], + to_int_exn$0 = include[5], + hash_fold_t$0 = include[6], + hash$0 = include[7], + t_of_sexp$0 = include[8], + sexp_of_t$0 = include[9], + of_string$0 = include[10], + to_string$0 = include[11], + symbol$3 = include[12], + symbol$4 = include[13], + symbol$5 = include[14], + symbol$6 = include[15], + symbol$7 = include[16], + symbol$8 = include[17], + equal$0 = include[18], + compare$0 = include[19], + min$0 = include[20], + max$0 = include[21], + ascending$0 = include[22], + descending$0 = include[23], + between$0 = include[24], + clamp_exn$0 = include[25], + clamp$0 = include[26], + comparator$0 = include[27], + pp$0 = include[28], + hashable$0 = include[29], + is_positive$0 = include[30], + is_non_negative$0 = include[31], + is_negative$0 = include[32], + is_non_positive$0 = include[33], + sign$0 = include[34], + invariant$0 = include[35], + Hex$0 = include[36], + to_string_hum$0 = include[37], + zero$0 = include[38], + one$0 = include[39], + minus_one$0 = include[40], + symbol$9 = include[41], + symbol$10 = include[42], + symbol$11 = include[43], + symbol$12 = include[44], + neg = include[45], + symbol$13 = include[46], + symbol$14 = include[47], + symbol$15 = include[48], + symbol$16 = include[49], + rem$0 = include[50], + symbol$17 = include[51], + land = include[52], + lor = include[53], + lxor = include[54], + lnot$0 = include[55], + lsl = include[56], + asr = include[57], + round$0 = include[58], + round_towards_zero$0 = include[59], + round_down$0 = include[60], + round_up$0 = include[61], + round_nearest$0 = include[62], + abs$0 = include[63], + succ$0 = include[64], + pred$0 = include[65], + pow$0 = include[66], + bit_and$0 = include[67], + bit_or$0 = include[68], + bit_xor$0 = include[69], + bit_not$0 = include[70], + popcount$0 = include[71], + shift_left$0 = include[72], + shift_right$0 = include[73], + decr$0 = include[74], + incr$0 = include[75], + of_int32_exn$0 = include[76], + to_int32_exn$0 = include[77], + of_int64_exn$0 = include[78], + to_int64$0 = include[79], + of_nativeint_exn$0 = include[80], + to_nativeint_exn$0 = include[81], + num_bits$0 = include[82], + max_value$0 = include[83], + min_value$0 = include[84], + lsr = include[85], + shift_right_logical$0 = include[86], + ceil_pow2$0 = include[87], + floor_pow2$0 = include[88], + ceil_log2$0 = include[89], + is_pow2$0 = include[91], + clz$0 = include[92], + ctz$0 = include[93], + O$0 = include[94], + of_int$0 = include[95], + to_int$0 = include[96], + to_int_trunc$0 = include[97], + of_int32 = include[98], + to_int32$0 = include[99], + to_int32_trunc = include[100], + of_int64$0 = include[101], + of_int64_trunc = include[102], + of_nativeint$0 = include[103], + to_nativeint$0 = include[104], + of_nativeint_trunc = include[105], + to_nativeint_trunc$0 = include[106], + of_float_unchecked$0 = include[107], + repr$1 = include[108], + bswap16 = include[109], + bswap32$0 = include[110], + bswap48$0 = include[111]; + function symbol$18(t, u){ + var + sum = caml_call2(symbol$9, t, u), + _an_ = caml_call2(bit_xor$0, t, caml_call1(bit_not$0, sum)); + if + (caml_call2 + (symbol$7, + caml_call2(bit_or$0, caml_call2(bit_xor$0, t, u), _an_), + zero$0)) + return sum; + var + _ao_ = [0, [0, cst_sum, caml_call1(sexp_of_t$0, sum)], 0], + _ap_ = [0, [0, cst_u, caml_call1(sexp_of_t$0, u)], _ao_], + _aq_ = [0, [0, cst_t, caml_call1(sexp_of_t$0, t)], _ap_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow, _aq_)); + } + function symbol$19(t, u){ + var + diff = caml_call2(symbol$10, t, u), + pos_diff = caml_call2(symbol$6, t, u); + if(caml_call2(symbol$8, t, u)){ + var _aj_ = caml_call1(is_positive$0, diff); + if(caml_call2(Base_Bool[14], pos_diff, _aj_)){ + var + _ak_ = [0, [0, cst_diff, caml_call1(sexp_of_t$0, diff)], 0], + _al_ = [0, [0, cst_u$0, caml_call1(sexp_of_t$0, u)], _ak_], + _am_ = [0, [0, cst_t$0, caml_call1(sexp_of_t$0, t)], _al_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$0, _am_)); + } + } + return diff; + } + var negative_one = caml_call1(of_int$0, -1); + function div_would_overflow(t, u){ + var _ai_ = caml_call2(symbol$5, t, min_value$0); + return _ai_ ? caml_call2(symbol$5, u, negative_one) : _ai_; + } + function symbol$20(t, u){ + var product = caml_call2(symbol$11, t, u); + if(caml_call2(symbol$8, u, zero$0)){ + var switch$0 = 0; + if + (! + div_would_overflow(product, u) + && ! caml_call2(symbol$8, caml_call2(symbol$16, product, u), t)) + switch$0 = 1; + if(! switch$0){ + var + _af_ = [0, [0, cst_product, caml_call1(sexp_of_t$0, product)], 0], + _ag_ = [0, [0, cst_u$1, caml_call1(sexp_of_t$0, u)], _af_], + _ah_ = [0, [0, cst_t$1, caml_call1(sexp_of_t$0, t)], _ag_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$1, _ah_)); + } + } + return product; + } + function symbol$21(t, u){ + if(! div_would_overflow(t, u)) return caml_call2(symbol$16, t, u); + var + _ac_ = + [0, + [0, + cst_product$0, + caml_call1(sexp_of_t$0, caml_call2(symbol$16, t, u))], + 0], + _ad_ = [0, [0, cst_u$2, caml_call1(sexp_of_t$0, u)], _ac_], + _ae_ = [0, [0, cst_t$2, caml_call1(sexp_of_t$0, t)], _ad_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow$2, _ae_)); + } + function abs$1(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_abs_overflow) + : caml_call1(abs$0, t); + } + function neg$0(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_neg_overflow) + : caml_call1(neg, t); + } + if(63 !== num_bits$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + function random_of_int(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _ab_ = caml_call1(to_int_exn$0, bound); + return caml_call1(of_int$0, caml_call2(Base_Random[18][6], state, _ab_)); + } + function random_of_int64(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _aa_ = caml_call1(to_int64$0, bound); + return caml_call1 + (of_int64_exn$0, caml_call2(Base_Random[18][9], state, _aa_)); + } + var random_of_int$0 = Base_Word_size[3] ? random_of_int : random_of_int64; + function random_incl_of_int(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var + ___ = caml_call1(to_int_exn$0, hi), + _$_ = caml_call1(to_int_exn$0, lo); + return caml_call1 + (of_int$0, caml_call3(Base_Random[18][11], state, _$_, ___)); + } + function random_incl_of_int64(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _Y_ = caml_call1(to_int64$0, hi), _Z_ = caml_call1(to_int64$0, lo); + return caml_call1 + (of_int64_exn$0, caml_call3(Base_Random[18][14], state, _Z_, _Y_)); + } + var + random_incl = + Base_Word_size[3] ? random_incl_of_int : random_incl_of_int64; + function floor_log2$0(t){ + if(Base_Word_size[3]){ + var _W_ = caml_call1(to_int_exn$0, t); + return caml_call1(Base_Int[66], _W_); + } + if(caml_call2(symbol$4, t, zero$0)){ + var _X_ = [0, [0, cst, caml_call1(sexp_of_t$0, t)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _X_)); + } + var floor_log2 = [0, num_bits$0 - 2 | 0]; + for(;;){ + if + (! + caml_call2 + (equal$0, + zero$0, + caml_call2 + (bit_and$0, t, caml_call2(shift_left$0, one$0, floor_log2[1])))) + return floor_log2[1]; + floor_log2[1] = floor_log2[1] - 1 | 0; + } + } + var + Base_Int63 = + [0, + t_sexp_grammar$0, + of_float$0, + to_float$0, + of_int_exn$0, + to_int_exn$0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + equal$0, + compare$0, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator$0, + pp$0, + hashable$0, + is_positive$0, + is_non_negative$0, + is_negative$0, + is_non_positive$0, + sign$0, + invariant$0, + Hex$0, + to_string_hum$0, + zero$0, + one$0, + minus_one$0, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + neg, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + rem$0, + symbol$17, + land, + lor, + lxor, + lnot$0, + lsl, + asr, + round$0, + round_towards_zero$0, + round_down$0, + round_up$0, + round_nearest$0, + abs$0, + succ$0, + pred$0, + pow$0, + bit_and$0, + bit_or$0, + bit_xor$0, + bit_not$0, + popcount$0, + shift_left$0, + shift_right$0, + decr$0, + incr$0, + of_int32_exn$0, + to_int32_exn$0, + of_int64_exn$0, + to_int64$0, + of_nativeint_exn$0, + to_nativeint_exn$0, + of_float_unchecked$0, + num_bits$0, + max_value$0, + min_value$0, + lsr, + shift_right_logical$0, + ceil_pow2$0, + floor_pow2$0, + ceil_log2$0, + is_pow2$0, + clz$0, + ctz$0, + O$0, + [0, symbol$18, symbol$19, symbol$20, symbol$21, abs$1, neg$0], + of_int$0, + to_int$0, + of_int32, + to_int32$0, + of_int64$0, + of_nativeint$0, + to_nativeint$0, + to_int_trunc$0, + to_int32_trunc, + of_int64_trunc, + of_nativeint_trunc, + to_nativeint_trunc$0, + bswap16, + bswap32$0, + bswap48$0, + random_of_int$0, + random_incl, + floor_log2$0, + [0, Base_Int63_emul[112], repr$1]]; + runtime.caml_register_global(31, Base_Int63, "Base__Int63"); + return; + } + (globalThis)); + +//# 34671 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_out_of_range_0 = " out of range [0, ", + cst_s_1e = "%s%.1e", + cst_is_too_large = ") is too large", + cst_is_too_small_or_NaN = ") is too small or NaN", + cst$5 = ".", + cst_Float_int63_round_down_exn = "Float.int63_round_down_exn: argument (", + cst_Float_int63_round_nearest_ = + "Float.int63_round_nearest_portable_alloc_exn: argument (", + cst_Float_int63_round_up_exn_a = "Float.int63_round_up_exn: argument (", + cst_Float_iround_down_exn_argu = "Float.iround_down_exn: argument (", + cst_Float_iround_nearest_exn_a = "Float.iround_nearest_exn: argument (", + cst_Float_iround_nearest_exn_a$0 = + "Float.iround_nearest_exn: argument (%f) is too large", + cst_Float_iround_up_exn_argume = "Float.iround_up_exn: argument (", + cst_Infinite = "Infinite", + cst_Nan = "Nan", + cst_Normal = "Normal", + cst_Subnormal = "Subnormal", + cst_Zero = "Zero", + cst_infinite = "infinite", + cst_nan$1 = "nan", + cst_normal = "normal", + cst_src_float_ml = "src/float.ml", + cst_subnormal = "subnormal", + cst_zero = "zero", + caml_bytes_set = runtime.caml_bytes_set, + caml_format_float = runtime.caml_format_float, + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_or = runtime.caml_int64_or, + caml_log10_float = runtime.caml_log10_float, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_compare = runtime.caml_string_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$4, + cst$2 = cst$4, + cst$1 = "-", + cst$0 = cst$5, + cst = cst$5, + all = [0, 0, [0, 1, [0, 2, [0, 3, [0, 4, 0]]]]], + error_source_006 = "float.ml.Class.t", + t_sexp_grammar$0 = + [3, + [0, + 2, + [0, + [1, [0, cst_Infinite, 0]], + [0, + [1, [0, cst_Nan, 0]], + [0, + [1, [0, cst_Normal, 0]], + [0, [1, [0, cst_Subnormal, 0]], [0, [1, [0, cst_Zero, 0]], 0]]]]]]], + module_name = "Base.Float", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Or_error = global_data.Base__Or_error, + Base_Int = global_data.Base__Int, + Base_Int63 = global_data.Base__Int63, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Int64 = global_data.Base__Int64, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Assert_failure = global_data.Assert_failure, + Base_String = global_data.Base__String, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Char = global_data.Base__Char, + Base_Int_conversions = global_data.Base__Int_conversions, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Word_size = global_data.Base__Word_size, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + round_up = Base_Float0[1], + round_down = Base_Float0[2], + mod_float = Base_Float0[3], + modf = Base_Float0[4], + float_of_string = Base_Float0[5], + nan = Base_Float0[6], + max_value = Base_Float0[7], + neg_infinity = Base_Float0[8], + max_finite_value = Base_Float0[9], + epsilon_float = Base_Float0[10], + classify_float = Base_Float0[11], + abs_float = Base_Float0[12], + is_integer = Base_Float0[13], + symbol = Base_Float0[14], + symbol$0 = Base_Float0[15], + frexp = Base_Float0[16], + ldexp = Base_Float0[17], + is_nan = Base_Float0[18], + to_int64_preserve_order = Base_Float0[19], + to_int64_preserve_order_exn = Base_Float0[20], + of_int64_preserve_order = Base_Float0[21], + one_ulp = Base_Float0[22], + upper_bound_for_int = Base_Float0[23], + lower_bound_for_int = Base_Float0[25], + clamp_unchecked = Base_Float0[26], + box = Base_Float0[27], + compare = Base_Float0[36], + raise_s = Base_Error[30], + hash_fold_t = Base_Import[210], + func = Base_Import[224], + _R_ = [0, [8, [0, 0, 4], 0, [0, 8], 0], "%.8G"], + _P_ = + [0, + [11, + "exponent ", + [4, 0, 0, 0, [11, cst_out_of_range_0, [4, 0, 0, 0, [12, 93, 0]]]]], + "exponent %d out of range [0, %d]"], + _Q_ = + [0, + [11, + "mantissa ", + [2, 0, [11, cst_out_of_range_0, [2, 0, [12, 93, 0]]]]], + "mantissa %s out of range [0, %s]"], + cst_Float_sign_exn_of_NAN = "Float.sign_exn of NAN", + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _L_ = [0, cst_src_float_ml, 859, 2], + _K_ = + [0, + [11, + "Float.round_significant: invalid argument significant_digits:", + [4, 0, 0, 0, 0]], + "Float.round_significant: invalid argument significant_digits:%d"], + _J_ = [0, [8, [0, 0, 3], 0, 1, 0], "%.*g"], + _I_ = [0, "p"], + cst_t = "t", + cst_g = "g", + cst_m = "m", + cst_k = "k", + _F_ = [0, cst_src_float_ml, 697, 8], + _E_ = [0, cst_src_float_ml, 700, 8], + _A_ = [0, cst_src_float_ml, 707, 8], + _B_ = [0, cst_src_float_ml, 708, 8], + _C_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [12, 32, 0]]]], "%s%d%s "], + _D_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [4, 0, 0, 0, 0]]]], "%s%d%s%d"], + _z_ = [0, cst_src_float_ml, 684, 8], + cst_0 = ".0", + _G_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + _H_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + cst_inf$1 = "-inf ", + cst_inf$2 = "inf ", + cst_nan$0 = "nan ", + cst_sexp = "sexp", + cst_sexp_of_float_produced_str = "[sexp_of_float] produced strange sexp", + _w_ = + [0, + [11, "to_string_hum: invalid argument ~decimals=", [4, 0, 0, 0, 0]], + "to_string_hum: invalid argument ~decimals=%d"], + _x_ = [0, [8, [0, 1, 0], 0, 1, 0], "%+.*f"], + _y_ = [0, [8, [0, 0, 0], 0, 1, 0], "%.*f"], + cst_inf = "inf", + cst_inf$0 = "-inf", + cst_nan = cst_nan$1, + _r_ = [0, cst_Infinite], + _s_ = [0, cst_Nan], + _t_ = [0, cst_Normal], + _u_ = [0, cst_Subnormal], + _v_ = [0, cst_Zero], + _p_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too large"], + _q_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too small or NaN"], + _n_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_down_exn: argument (%f) is too large"], + _o_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_down_exn: argument (%f) is too small or NaN"], + _l_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_up_exn: argument (%f) is too large"], + _m_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_up_exn: argument (%f) is too small or NaN"], + _j_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _k_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_nearest_exn: argument (%f) is too small or NaN"], + _h_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _i_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, ") is too small", 0]]], + "Float.iround_nearest_exn: argument (%f) is too small"], + _f_ = + [0, + [11, + "Float.iround_towards_zero_exn: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Float.iround_towards_zero_exn: argument (%f) is out of range or NaN"], + _d_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_down_exn: argument (%f) is too large"], + _e_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_down_exn: argument (%f) is too small or NaN"], + _b_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_up_exn: argument (%f) is too large"], + _c_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_up_exn: argument (%f) is too small or NaN"], + _a_ = [0, [11, "Float.of_string ", [2, 0, 0]], "Float.of_string %s"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[167], + sexp_of_t = Base_Import[143], + t_sexp_grammar = Base_Import[187], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[108][9], + include = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function to_float(x){return x;} + function of_float(x){return x;} + function of_string(s){ + try{var _aX_ = caml_call1(float_of_string, s); return _aX_;} + catch(_aY_){return caml_call3(Base_Printf[7], _a_, s, 0);} + } + function to_string(x){ + var + y = caml_format_float("%.15g", x), + _aW_ = caml_call1(float_of_string, y), + y$0 = + caml_call2(Base_Import[108][4], _aW_, x) + ? y + : caml_format_float("%.17g", x), + l = runtime.caml_ml_string_length(y$0), + i = 0; + for(;;){ + if(l <= i) return caml_call2(Base_Import[112], y$0, cst); + var match = runtime.caml_string_get(y$0, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return y$0; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + var + min_positive_subnormal_value = caml_call2(symbol, 2., -1074.), + min_positive_normal_value = caml_call2(symbol, 2., -1022.), + of_int = Base_Int[3], + to_int = Base_Int[2], + zero = 0., + one = 1., + minus_one = -1., + pi = 3.141592653589793, + sqrt_pi = 1.772453850905516, + sqrt_2pi = 2.5066282746310007, + euler = 0.5772156649015329; + function of_int63(i){return caml_call1(Base_Int63[3], i);} + var + of_int64 = runtime.caml_int64_to_float, + to_int64 = runtime.caml_int64_of_float, + iround_lbound = caml_call1(lower_bound_for_int, Base_Int[59]), + iround_ubound = caml_call1(upper_bound_for_int, Base_Int[59]); + function iround_up(t){ + if(! caml_call2(Base_Import[108][5], t, 0.)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_up, t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aU_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _b_, _aU_, 0); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aV_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _c_, _aV_, 0); + } + function iround_down(t){ + if(caml_call2(Base_Import[108][6], t, 0.)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_down, t); + return caml_call2(Base_Import[108][6], t$0, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aS_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _d_, _aS_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, iround_lbound)) + return caml_call1(Base_Int[58], t$0); + var _aT_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _e_, _aT_, 0); + } + function iround_towards_zero(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return [0, caml_call1(Base_Int[58], t)]; + return 0; + } + function iround_towards_zero_exn(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aR_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _f_, _aR_, 0); + } + var + _g_ = caml_call2(symbol, 2., 52.), + round_nearest_lb = caml_call1(Base_Import[114], _g_), + round_nearest_ub = caml_call2(symbol, 2., 52.), + one_ulp_less_than_half = caml_call2(one_ulp, 759637122, 0.5); + function add_half_for_round_nearest(t){ + var + _aQ_ = + caml_call2(Base_Import[108][4], t, one_ulp_less_than_half) + ? one_ulp_less_than_half + : 0.5; + return caml_call2(Base_Import[92], t, _aQ_); + } + function iround_nearest_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call2(Base_Import[108][6], t$1, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$1)] + : 0; + } + function iround_nearest_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(! caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aO_ = add_half_for_round_nearest(t); + return [0, caml_call1(Base_Int[58], _aO_)]; + } + if(! caml_call2(Base_Import[108][5], t, round_nearest_lb)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aP_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return [0, caml_call1(Base_Int[58], _aP_)]; + } + var + iround_nearest_64$0 = + Base_Word_size[3] ? iround_nearest_64 : iround_nearest_32; + function iround_nearest_exn_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aM_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _h_, _aM_, 0); + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + if(caml_call2(Base_Import[108][6], t$1, iround_lbound)) + return caml_call1(Base_Int[58], t$1); + var _aN_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _i_, _aN_, 0); + } + function iround_nearest_exn_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][1], t, round_nearest_ub)){ + var _aI_ = add_half_for_round_nearest(t); + return caml_call1(Base_Int[58], _aI_); + } + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aJ_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _j_, _aJ_, 0); + } + if(caml_call2(Base_Import[108][5], t, round_nearest_lb)){ + var _aK_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call1(Base_Int[58], _aK_); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aL_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _k_, _aL_, 0); + } + var + iround_nearest_exn = + Base_Word_size[3] ? iround_nearest_exn_64 : iround_nearest_exn_32; + function iround_exn(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? iround_towards_zero_exn(t) + : iround_nearest_exn(t) + : 759637122 <= dir ? iround_down_exn(t) : iround_up_exn(t); + } + function iround(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + try{var _aG_ = [0, iround_exn([0, dir], t)]; return _aG_;} + catch(_aH_){return 0;} + } + function is_inf(t){ + var _aF_ = caml_call2(Base_Import[96], 1., t); + return caml_call2(Base_Import[108][4], _aF_, 0.); + } + function is_finite(t){ + var _aE_ = caml_call2(Base_Import[94], t, t); + return caml_call2(Base_Import[108][4], _aE_, 0.); + } + function min_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][1], x, y) ? x : y; + } + function max_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][5], x, y) ? x : y; + } + var + add = Base_Import[92], + sub = Base_Import[94], + neg = Base_Import[114], + scale = Base_Import[90]; + function square(x){return caml_call2(Base_Import[90], x, x);} + function fractional(t){return caml_call1(Base_Import[125], t);} + function integral(t){return caml_call1(Base_Import[127], t);} + function round_towards_zero(t){ + return caml_call2(Base_Import[108][6], t, 0.) + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + function round_nearest_inline(t){ + if + (caml_call2(Base_Import[108][5], t, round_nearest_lb) + && caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call1(round_down, add_half_for_round_nearest(t)); + return caml_call2(Base_Import[92], t, 0.); + } + function round_nearest(t){return round_nearest_inline(t);} + function round_nearest_half_to_even(t){ + if + (! + caml_call2(Base_Import[108][2], t, round_nearest_lb) + && ! caml_call2(Base_Import[108][6], t, round_nearest_ub)){ + var + floor = caml_call1(round_down, t), + ceil_or_succ = caml_call2(Base_Import[92], floor, 1.), + diff_floor = caml_call2(Base_Import[94], t, floor), + diff_ceil = caml_call2(Base_Import[94], ceil_or_succ, t); + if(caml_call2(Base_Import[108][1], diff_floor, diff_ceil)) return floor; + if(caml_call2(Base_Import[108][5], diff_floor, diff_ceil)) + return ceil_or_succ; + var _aD_ = caml_call2(mod_float, floor, 2.); + return caml_call2(Base_Import[108][4], _aD_, 0.) ? floor : ceil_or_succ; + } + return caml_call2(Base_Import[92], t, 0.); + } + var + int63_round_lbound = caml_call1(lower_bound_for_int, Base_Int63[83]), + int63_round_ubound = caml_call1(upper_bound_for_int, Base_Int63[83]); + function int63_round_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, int63_round_ubound)) + return caml_call1(Base_Int63[82], t$0); + var _aB_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _l_, _aB_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _aC_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _m_, _aC_, 0); + } + function int63_round_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _az_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _n_, _az_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, int63_round_lbound)) + return caml_call1(Base_Int63[82], t$0); + var _aA_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _o_, _aA_, 0); + } + function int63_round_nearest_portable_a(t0){ + var t = round_nearest_inline(t0); + if(caml_call2(Base_Import[108][5], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _ax_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _p_, _ax_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _ay_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _q_, _ay_, 0); + } + function int63_round_nearest_arch64_noa(f){ + var _aw_ = iround_nearest_exn(f); + return caml_call1(Base_Int63[96], _aw_); + } + var + int63_round_nearest_exn = + Base_Word_size[3] + ? int63_round_nearest_arch64_noa + : int63_round_nearest_portable_a; + function round(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 <= dir ? round_towards_zero(t) : round_nearest(t) + : 759637122 + <= dir + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + var compare$1 = runtime.caml_int_compare; + function t_of_sexp$0(sexp_007){ + if(0 === sexp_007[0]){ + var + _aq_ = sexp_007[1], + _ar_ = caml_string_compare(_aq_, cst_infinite), + switch$0 = 0; + if(0 <= _ar_) + if(0 < _ar_) + if(caml_string_notequal(_aq_, cst_nan$1)) + if(caml_string_notequal(_aq_, cst_normal)) + if(caml_string_notequal(_aq_, cst_subnormal)){ + if(! caml_string_notequal(_aq_, cst_zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + else if(caml_string_notequal(_aq_, cst_Infinite)) + if(caml_string_notequal(_aq_, cst_Nan)) + if(caml_string_notequal(_aq_, cst_Normal)) + if(caml_string_notequal(_aq_, cst_Subnormal)){ + if(! caml_string_notequal(_aq_, cst_Zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + switch(switch$0){ + case 1: + return 0; + case 2: + return 1; + case 3: + return 2; + case 4: + return 3; + case 5: + return 4; + } + } + else{ + var _as_ = sexp_007[1]; + if(! _as_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_006, sexp_007); + var _at_ = _as_[1]; + if(0 !== _at_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_006, sexp_007); + var + _au_ = _at_[1], + _av_ = caml_string_compare(_au_, cst_infinite), + switch$1 = 0; + if(0 <= _av_){ + if(0 < _av_) + if(caml_string_notequal(_au_, cst_nan$1)) + if(caml_string_notequal(_au_, cst_normal)) + if(caml_string_notequal(_au_, cst_subnormal)) + if(caml_string_notequal(_au_, cst_zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + } + else if(caml_string_notequal(_au_, cst_Infinite)) + if(caml_string_notequal(_au_, cst_Nan)) + if(caml_string_notequal(_au_, cst_Normal)) + if(caml_string_notequal(_au_, cst_Subnormal)) + if(caml_string_notequal(_au_, cst_Zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + switch(switch$1){ + case 0: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 1: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 2: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 3: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 4: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_006, sexp_007); + } + function sexp_of_t$0(param){ + switch(param){ + case 0: + return _r_; + case 1: + return _s_; + case 2: + return _t_; + case 3: + return _u_; + default: return _v_; + } + } + function to_string$0(t){ + var _ap_ = sexp_of_t$0(t); + return caml_call1(Base_Import[163], _ap_); + } + function of_string$0(s){ + return t_of_sexp$0(caml_call1(Base_Import[139], s)); + } + function classify(t){ + switch(caml_call1(classify_float, t)){ + case 0: + return 2; + case 1: + return 3; + case 2: + return 4; + case 3: + return 0; + default: return 1; + } + } + function insert_underscores(opt, _am_, string){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + if(_am_) var sth$0 = _am_[1], strip_zero = sth$0; else var strip_zero = 0; + var match = caml_call2(Base_String[84], string, 46); + if(! match) + return caml_call2(Base_Int_conversions[37], string, delimiter); + var + match$0 = match[1], + right = match$0[2], + left = match$0[1], + left$0 = caml_call2(Base_Int_conversions[37], left, delimiter); + if(strip_zero) + var + _an_ = [0, function(c){return caml_call2(Base_Char[11], c, 48);}], + right$0 = caml_call2(Base_String[92], _an_, right); + else + var right$0 = right; + if(! caml_string_notequal(right$0, cst$4)) return left$0; + var _ao_ = caml_call2(Base_Import[112], cst$0, right$0); + return caml_call2(Base_Import[112], left$0, _ao_); + } + function to_string_hum(delimiter, opt, strip_zero, _al_, f){ + if(opt) var sth = opt[1], decimals = sth; else var decimals = 3; + if(_al_) + var sth$0 = _al_[1], explicit_plus = sth$0; + else + var explicit_plus = 0; + if(decimals < 0) caml_call3(Base_Printf[7], _w_, decimals, 0); + var match = classify(f); + if(1 === match) return cst_nan; + if(! match) + return caml_call2(Base_Import[108][5], f, 0.) ? cst_inf : cst_inf$0; + var + s = + explicit_plus + ? caml_call3(Base_Printf[2], _x_, decimals, f) + : caml_call3(Base_Printf[2], _y_, decimals, f); + return insert_underscores(delimiter, strip_zero, s); + } + function sexp_of_t$1(t){ + var sexp = caml_call1(sexp_of_t, t); + if(1009018843 <= Base_Sexp[18][1]) return sexp; + if(0 === sexp[0]){ + var string = sexp[1]; + return caml_call4(Base_String[56], 0, 0, string, 69) + ? sexp + : [0, insert_underscores(0, 0, string)]; + } + var _ak_ = [0, [0, cst_sexp, caml_call1(Base_Sexp[4], sexp)], 0]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_sexp_of_float_produced_str, _ak_)); + } + function to_padded_compact_string_custo + (t, opt, kilo, mega, giga, tera, peta, param){ + if(opt) var sth = opt[1], prefix = sth; else var prefix = cst$2; + var match = classify(t); + if(1 === match) return cst_nan$0; + if(! match) + return caml_call2(Base_Import[108][1], t, 0.) ? cst_inf$1 : cst_inf$2; + function go(t){ + function conv(mag, numerator, denominator){ + var switch$0 = 0; + if + (caml_call2(Base_Import[108][4], denominator, 100.) + && caml_call2(Base_Import[108][6], numerator, 999.95)) + switch$0 = 1; + if(! switch$0){ + var switch$1 = 0; + if(caml_call2(Base_Import[108][6], denominator, 100000.)){ + var + _aj_ = + round_nearest(caml_call2(Base_Import[90], denominator, 9.9995)); + if(caml_call2(Base_Import[108][6], numerator, _aj_)) switch$1 = 1; + } + if(! switch$1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + } + var + _ai_ = round_nearest(caml_call2(Base_Import[90], denominator, 9999.5)); + if(! caml_call2(Base_Import[108][1], numerator, _ai_)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var + k = + caml_call1 + (round_down, caml_call2(Base_Import[96], numerator, denominator)), + lower = caml_call2(Base_Import[90], denominator, k), + _ah_ = caml_call2(Base_Import[92], k, 1.), + higher = caml_call2(Base_Import[90], denominator, _ah_), + diff_right = caml_call2(Base_Import[94], higher, numerator), + diff_left = caml_call2(Base_Import[94], numerator, lower), + k$0 = iround_nearest_exn(k), + k$1 = + caml_call2(Base_Import[108][1], diff_right, diff_left) + ? caml_call2(Base_Import[91], k$0, 1) + : caml_call2 + (Base_Import[108][5], diff_right, diff_left) + ? k$0 + : 0 + === caml_call2(Base_Import[122], k$0, 2) + ? k$0 + : caml_call2(Base_Import[91], k$0, 1), + d = caml_call2(Base_Import[122], k$1, 10), + i = caml_call2(Base_Import[95], k$1, 10); + if(0 <= i && 1000 > i){ + if(0 <= d && 10 > d) + return 0 === d + ? caml_call4(Base_Printf[2], _C_, prefix, i, mag) + : caml_call5(Base_Printf[2], _D_, prefix, i, mag, d); + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + } + if(! caml_call2(Base_Import[108][1], t, 999.95)){ + if(caml_call2(Base_Import[108][1], t, 999950.)) + return conv(kilo, t, 100.); + if(caml_call2(Base_Import[108][1], t, 999950000.)) + return conv(mega, t, 100000.); + if(caml_call2(Base_Import[108][1], t, 999950000000.)) + return conv(giga, t, 100000000.); + if(caml_call2(Base_Import[108][1], t, 999950000000000.)) + return conv(tera, t, 100000000000.); + if(! peta) return caml_call3(Base_Printf[2], _H_, prefix, t); + var peta$0 = peta[1]; + return caml_call2(Base_Import[108][1], t, 999950000000000000.) + ? conv(peta$0, t, 100000000000000.) + : caml_call3(Base_Printf[2], _G_, prefix, t); + } + if + (caml_call2(Base_Import[108][2], 0., t) + && caml_call2(Base_Import[108][1], t, 999.95)){ + var + x = caml_call2(Base_Import[112], prefix, caml_format_float("%.1f", t)); + if(! caml_call2(Base_String[80], x, cst_0)) return x; + var + x$0 = caml_call1(Base_Bytes0[15], x), + n = runtime.caml_ml_bytes_length(x$0); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 1), 32); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 2), 32); + return caml_call1(Base_Bytes0[16], x$0); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + if(caml_call2(Base_Import[108][6], t, 0.)) return go(t); + var _ag_ = go(caml_call1(Base_Import[114], t)); + return caml_call2(Base_Import[112], cst$1, _ag_); + } + function to_padded_compact_string(t){ + return to_padded_compact_string_custo + (t, 0, cst_k, cst_m, cst_g, cst_t, _I_, 0); + } + function int_pow(x, n){ + if(0 === n) return 1.; + var + x$0 = [0, caml_call2(Base_Import[92], x, -0.)], + n$0 = [0, n], + accum = [0, 1.]; + if(n$0[1] < 0){ + x$0[1] = caml_call2(Base_Import[96], 1., x$0[1]); + n$0[1] = caml_call1(Base_Import[113], n$0[1]); + if(n$0[1] < 0){accum[1] = x$0[1]; caml_call1(Base_Import[129], n$0);} + } + for(;;){ + if(1 >= n$0[1]) return caml_call2(Base_Import[90], x$0[1], accum[1]); + if(0 !== caml_call2(Base_Import[116], n$0[1], 1)) + accum[1] = caml_call2(Base_Import[90], x$0[1], accum[1]); + x$0[1] = caml_call2(Base_Import[90], x$0[1], x$0[1]); + n$0[1] = caml_call2(Base_Import[120], n$0[1], 1); + } + } + function round_gen(x, how){ + if(caml_call2(Base_Import[108][4], x, 0.)) return 0.; + if(! is_finite(x)) return x; + if(555917426 <= how[1]) + var + sd = how[2], + _ac_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + dd = caml_call2(Base_Import[93], sd, _ac_), + dd$0 = dd, + sd$0 = sd; + else + var + dd$1 = how[2], + _af_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + sd$1 = caml_call2(Base_Import[91], dd$1, _af_), + dd$0 = dd$1, + sd$0 = sd$1; + if(0 > sd$0) return 0.; + if(17 <= sd$0) return x; + var abs_dd = caml_call1(Base_Int[73], dd$0); + if(22 >= abs_dd && 16 > sd$0){ + var order = int_pow(10., abs_dd); + if(0 <= dd$0){ + var + _ad_ = + round_nearest_half_to_even(caml_call2(Base_Import[90], x, order)); + return caml_call2(Base_Import[96], _ad_, order); + } + var + _ae_ = round_nearest_half_to_even(caml_call2(Base_Import[96], x, order)); + return caml_call2(Base_Import[90], _ae_, order); + } + return of_string(caml_call3(Base_Printf[2], _J_, sd$0, x)); + } + function round_significant(x, significant_digits){ + return 0 < significant_digits + ? round_gen(x, [0, 555917426, significant_digits]) + : caml_call3(Base_Printf[7], _K_, significant_digits, 0); + } + function round_decimal(x, decimal_digits){ + return round_gen(x, [0, -352548012, decimal_digits]); + } + function between(t, low, high){ + var _ab_ = caml_call2(Base_Import[108][2], low, t); + return _ab_ ? caml_call2(Base_Import[108][2], t, high) : _ab_; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return caml_call3(clamp_unchecked, t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + } + function clamp(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return [0, caml_call3(clamp_unchecked, t, min, max)]; + var + ___ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _$_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], ___], + _aa_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _$_); + return caml_call1(Base_Or_error[35], _aa_); + } + var + symbol$1 = Base_Import[92], + symbol$2 = Base_Import[94], + symbol$3 = Base_Import[90], + symbol$4 = Base_Import[96], + symbol$5 = Base_Import[114]; + function sign_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)) return 2; + if(caml_call2(Base_Import[108][1], t, 0.)) return 0; + if(caml_call2(Base_Import[108][4], t, 0.)) return 1; + var + _Y_ = [0, [0, cst$3, sexp_of_t$1(t)], 0], + _Z_ = caml_call2(Base_Sexp[9], cst_Float_sign_exn_of_NAN, _Y_); + return caml_call1(Base_Error[30], _Z_); + } + function sign_or_nan(t){ + return caml_call2(Base_Import[108][5], t, 0.) + ? 2 + : caml_call2 + (Base_Import[108][1], t, 0.) + ? 0 + : caml_call2(Base_Import[108][4], t, 0.) ? 1 : 3; + } + function ieee_negative(t){ + var bits = caml_int64_bits_of_float(t); + return runtime.caml_lessthan(bits, Stdlib_Int64[1]); + } + var + _M_ = Base_Int64[32], + exponent_mask64 = + runtime.caml_int64_sub + (caml_call2(Base_Int64[48], Base_Int64[32], 11), _M_), + exponent_mask = caml_call1(Base_Int64[5], exponent_mask64), + _N_ = Base_Int63[39], + _O_ = caml_call2(Base_Int63[72], Base_Int63[39], 52), + mantissa_mask = caml_call2(Base_Int63[42], _O_, _N_), + mantissa_mask64 = caml_call1(Base_Int63[79], mantissa_mask), + mantissa_bits = 52; + function ieee_exponent(t){ + var + bits = caml_int64_bits_of_float(t), + _X_ = caml_call2(Base_Int64[62], bits, mantissa_bits); + return runtime.caml_int64_to_int32 + (caml_call2(Base_Int64[43], _X_, exponent_mask64)); + } + function ieee_mantissa(t){ + var bits = caml_int64_bits_of_float(t); + return caml_call1 + (Base_Int63[78], runtime.caml_int64_and(bits, mantissa_mask64)); + } + function create_ieee_exn(negative, exponent, mantissa){ + if(caml_call2(Base_Int[43], exponent, exponent_mask) !== exponent) + return caml_call4(Base_Printf[6], _P_, exponent, exponent_mask, 0); + var _U_ = caml_call2(Base_Int63[67], mantissa, mantissa_mask); + if(caml_call2(Base_Int63[17], _U_, mantissa)){ + var + _V_ = caml_call1(Base_Int63[11], mantissa_mask), + _W_ = caml_call1(Base_Int63[11], mantissa); + return caml_call4(Base_Printf[6], _Q_, _W_, _V_, 0); + } + var + sign_bits = negative ? Stdlib_Int64[10] : Stdlib_Int64[1], + expt_bits = + runtime.caml_int64_shift_left + (runtime.caml_int64_of_int32(exponent), 52), + mant_bits = caml_call1(Base_Int63[79], mantissa), + bits = caml_int64_or(sign_bits, caml_int64_or(expt_bits, mant_bits)); + return runtime.caml_int64_float_of_bits(bits); + } + function create_ieee(negative, exponent, mantissa){ + function _T_(param){return create_ieee_exn(negative, exponent, mantissa);} + return caml_call2(Base_Or_error[28], 0, _T_); + } + function to_string$1(x){return caml_call2(Base_Printf[2], _R_, x);} + function sexp_of_t$2(x){return [0, to_string$1(x)];} + function of_string$1(x){return of_string(x);} + var + include$0 = + caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + sign = include$0[5]; + function is_positive(t){return caml_call2(Base_Import[108][5], t, 0.);} + function is_non_negative(t){return caml_call2(Base_Import[108][6], t, 0.);} + function is_negative(t){return caml_call2(Base_Import[108][1], t, 0.);} + function is_non_positive(t){return caml_call2(Base_Import[108][2], t, 0.);} + var + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$1[1], + _S_ = Base_Import[108], + symbol$6 = _S_[3], + symbol$7 = _S_[1], + symbol$8 = _S_[5], + symbol$9 = _S_[4], + symbol$10 = _S_[2], + symbol$11 = _S_[6]; + function of_float$0(x){return x;} + var + specialized_hash = Base_Import[224], + Private = + [0, + box, + clamp_unchecked, + lower_bound_for_int, + upper_bound_for_int, + specialized_hash, + one_ulp_less_than_half, + int63_round_nearest_portable_a, + int63_round_nearest_arch64_noa, + iround_nearest_exn_64], + include$2 = Base_Import[108], + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + symbol$15 = include$2[4], + symbol$16 = include$2[5], + symbol$17 = include$2[6], + ascending = include$2[7], + descending = include$2[8], + compare$2 = include$2[9], + equal = include$2[10]; + function min(x, y){ + if(! caml_call2(symbol$12, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + function max(x, y){ + if(! caml_call2(symbol$16, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + var + Base_Float = + [0, + t_sexp_grammar, + of_float, + to_float, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + symbol$17, + symbol$13, + symbol$15, + symbol$16, + symbol$12, + symbol$14, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + invariant, + nan, + max_value, + neg_infinity, + max_value, + neg_infinity, + zero, + one, + minus_one, + pi, + sqrt_pi, + sqrt_2pi, + euler, + epsilon_float, + max_finite_value, + min_positive_subnormal_value, + min_positive_normal_value, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + of_int, + to_int, + of_int63, + of_int64, + to_int64, + round, + iround, + iround_exn, + round_towards_zero, + round_down, + round_up, + round_nearest, + round_nearest_half_to_even, + iround_towards_zero, + iround_down, + iround_up, + iround_nearest_64$0, + iround_towards_zero_exn, + iround_down_exn, + iround_up_exn, + iround_nearest_exn, + int63_round_down_exn, + int63_round_up_exn, + int63_round_nearest_exn, + iround_lbound, + iround_ubound, + int63_round_lbound, + int63_round_ubound, + round_significant, + round_decimal, + is_nan, + is_inf, + is_finite, + is_integer, + min_inan, + max_inan, + symbol$1, + symbol$2, + symbol$4, + symbol$0, + symbol$3, + symbol, + symbol$5, + [0, fractional, integral], + modf, + mod_float, + add, + sub, + neg, + scale, + abs_float, + [0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$0, + symbol, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs_float, + neg, + zero, + of_int, + of_float$0], + [0, symbol$1, symbol$2, symbol$3, symbol$4, symbol$0, symbol, symbol$5], + to_string, + to_string_hum, + to_padded_compact_string, + to_padded_compact_string_custo, + int_pow, + square, + ldexp, + frexp, + [0, + compare$1, + all, + t_of_sexp$0, + sexp_of_t$0, + t_sexp_grammar$0, + of_string$0, + to_string$0], + classify, + sign, + sign_exn, + sign_or_nan, + create_ieee, + create_ieee_exn, + ieee_negative, + ieee_exponent, + ieee_mantissa, + [0, t_of_sexp, sexp_of_t$2, t_sexp_grammar, of_string$1, to_string$1], + Private]; + runtime.caml_register_global(191, Base_Float, "Base__Float"); + return; + } + (globalThis)); + +//# 36069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + elided_message = "", + Base_Exn = global_data.Base__Exn, + Base_Sys0 = global_data.Base__Sys0, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int = global_data.Base__Int, + elide = [0, 0], + cst_b = "b", + cst_OCAMLRUNPARAM = "OCAMLRUNPARAM"; + function get(opt, param){ + if(opt) + var sth = opt[1], at_most_num_frames = sth; + else + var at_most_num_frames = Base_Int[60]; + return runtime.caml_get_current_callstack(at_most_num_frames); + } + function to_string(t){ + return elide[1] ? elided_message : caml_call1(Stdlib_Printexc[14], t); + } + function to_string_list(t){ + var _i_ = to_string(t); + return caml_call1(Base_String[88], _i_); + } + function sexp_of_t(t){ + function _g_(x){return [0, x];} + var _h_ = to_string_list(t); + return [1, caml_call2(Base_List[76], _h_, _g_)]; + } + var set_recording = Stdlib_Printexc[7], am_recording = Stdlib_Printexc[8]; + function most_recent(param){return caml_call1(Stdlib_Printexc[12], 0);} + function most_recent_for_exn(exn){ + return caml_call1(Base_Exn[18], exn) ? [0, most_recent(0)] : 0; + } + function with_recording(b, f){ + var saved = caml_call1(am_recording, 0); + caml_call1(set_recording, b); + function _f_(param){return caml_call1(set_recording, saved);} + return caml_call2(Base_Exn[13], f, _f_); + } + function initialize_module(param){ + var match = caml_call1(Base_Sys0[20], cst_OCAMLRUNPARAM); + if(match) + var + x = match[1], + _a_ = Base_String[81], + _b_ = function(_e_){return caml_call2(_a_, _e_, cst_b);}, + _c_ = caml_call2(Base_String[86], x, 44), + ocamlrunparam_mentions_backtra = caml_call2(Base_List[13], _c_, _b_); + else + var ocamlrunparam_mentions_backtra = 0; + var _d_ = 1 - ocamlrunparam_mentions_backtra; + return _d_ ? caml_call1(set_recording, 1) : _d_; + } + var + Base_Backtrace = + [0, + sexp_of_t, + get, + to_string, + to_string_list, + elide, + [0, + am_recording, + set_recording, + with_recording, + most_recent, + most_recent_for_exn], + initialize_module]; + runtime.caml_register_global(9, Base_Backtrace, "Base__Backtrace"); + return; + } + (globalThis)); + +//# 36161 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ref = global_data.Base__Ref, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Array = global_data.Base__Array, + Shadow_stdlib = global_data.Shadow_stdlib, + Base_Sexp_with_comparable = global_data.Base__Sexp_with_comparable, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Char = global_data.Base__Char, + Base_Exn = global_data.Base__Exn, + Base_Float = global_data.Base__Float, + Base_Int = global_data.Base__Int, + Base_Int32 = global_data.Base__Int32, + Base_Int64 = global_data.Base__Int64, + Base_Nativeint = global_data.Base__Nativeint, + Base_String = global_data.Base__String, + Base_Bytes = global_data.Base__Bytes, + Base_Unit = global_data.Base__Unit, + Base_Error = global_data.Base__Error, + Base_Container_intf = global_data.Base__Container_intf, + Base_Backtrace = global_data.Base__Backtrace, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + hash_fold_t = Base_Sexp_with_comparable[1], + hash = Base_Sexp_with_comparable[2], + t_of_sexp = Base_Sexp_with_comparable[3], + sexp_of_t = Base_Sexp_with_comparable[4], + Not_found_s = Base_Sexp_with_comparable[5], + Of_sexp_error = Base_Sexp_with_comparable[6], + message = Base_Sexp_with_comparable[7], + default_indent = Base_Sexp_with_comparable[8], + pp_hum = Base_Sexp_with_comparable[9], + pp_hum_indent = Base_Sexp_with_comparable[10], + pp_mach = Base_Sexp_with_comparable[11], + pp = Base_Sexp_with_comparable[12], + to_string_hum = Base_Sexp_with_comparable[13], + to_string_mach = Base_Sexp_with_comparable[14], + to_string = Base_Sexp_with_comparable[15], + of_float_style = Base_Sexp_with_comparable[16], + of_int_style = Base_Sexp_with_comparable[17], + t_sexp_grammar = Base_Sexp_with_comparable[18], + invariant = Base_Sexp_with_comparable[19], + of_string = Base_Sexp_with_comparable[20], + symbol$0 = Base_Sexp_with_comparable[21], + symbol$1 = Base_Sexp_with_comparable[22], + symbol$2 = Base_Sexp_with_comparable[23], + symbol$3 = Base_Sexp_with_comparable[24], + symbol$4 = Base_Sexp_with_comparable[25], + symbol$5 = Base_Sexp_with_comparable[26], + equal = Base_Sexp_with_comparable[27], + compare = Base_Sexp_with_comparable[28], + min = Base_Sexp_with_comparable[29], + max = Base_Sexp_with_comparable[30], + ascending = Base_Sexp_with_comparable[31], + descending = Base_Sexp_with_comparable[32], + between = Base_Sexp_with_comparable[33], + clamp_exn = Base_Sexp_with_comparable[34], + clamp = Base_Sexp_with_comparable[35], + comparator = Base_Sexp_with_comparable[36], + Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator], + am_testing = Base_Import[132], + Exported_for_specific_uses = [0, am_testing], + compare_array = Base_Array[1], + equal_array = Base_Array[100], + array_of_sexp = Base_Array[2], + sexp_of_array = Base_Array[3]; + function array_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Array[4], a_sexp_grammar); + } + var + compare_bool = Base_Bool[16], + equal_bool = Base_Bool[15], + hash_fold_bool = Base_Bool[3], + func = Base_Bool[4]; + function hash_bool(x){return caml_call1(func, x);} + var + bool_of_sexp = Base_Bool[5], + sexp_of_bool = Base_Bool[6], + bool_sexp_grammar = Base_Bool[2], + compare_char = Base_Char[16], + equal_char = Base_Char[15], + hash_fold_char = Base_Char[3], + func$0 = Base_Char[4]; + function hash_char(x){return caml_call1(func$0, x);} + var + char_of_sexp = Base_Char[5], + sexp_of_char = Base_Char[6], + char_sexp_grammar = Base_Char[2], + sexp_of_exn = Base_Exn[1], + compare_float = Base_Float[16], + equal_float = Base_Float[15], + hash_fold_float = Base_Float[4], + func$1 = Base_Float[5]; + function hash_float(x){return caml_call1(func$1, x);} + var + float_of_sexp = Base_Float[6], + sexp_of_float = Base_Float[7], + float_sexp_grammar = Base_Float[1], + compare_int = Base_Int[13], + equal_int = Base_Int[12], + hash_fold_int = Base_Int[6], + func$2 = Base_Int[7]; + function hash_int(x){return caml_call1(func$2, x);} + var + int_of_sexp = Base_Int[8], + sexp_of_int = Base_Int[9], + int_sexp_grammar = Base_Int[1], + compare_int32 = Base_Int32[19], + equal_int32 = Base_Int32[18], + hash_fold_int32 = Base_Int32[6], + func$3 = Base_Int32[7]; + function hash_int32(x){return caml_call1(func$3, x);} + var + int32_of_sexp = Base_Int32[8], + sexp_of_int32 = Base_Int32[9], + int32_sexp_grammar = Base_Int32[1], + compare_int64 = Base_Int64[13], + equal_int64 = Base_Int64[12], + hash_fold_int64 = Base_Int64[6], + func$4 = Base_Int64[7]; + function hash_int64(x){return caml_call1(func$4, x);} + var + int64_of_sexp = Base_Int64[8], + sexp_of_int64 = Base_Int64[9], + int64_sexp_grammar = Base_Int64[1], + compare_list = Base_List[1], + equal_list = Base_List[147], + hash_fold_list = Base_List[2], + list_of_sexp = Base_List[3], + sexp_of_list = Base_List[4]; + function list_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_List[5], a_sexp_grammar); + } + var + compare_nativeint = Base_Nativeint[19], + equal_nativeint = Base_Nativeint[18], + hash_fold_nativeint = Base_Nativeint[6], + func$5 = Base_Nativeint[7]; + function hash_nativeint(x){return caml_call1(func$5, x);} + var + nativeint_of_sexp = Base_Nativeint[8], + sexp_of_nativeint = Base_Nativeint[9], + nativeint_sexp_grammar = Base_Nativeint[1], + compare_option = Base_Option[1], + equal_option = Base_Option[4], + hash_fold_option = Base_Option[2], + option_of_sexp = Base_Option[6], + sexp_of_option = Base_Option[7]; + function option_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Option[3], a_sexp_grammar); + } + var + compare_ref = Base_Ref[1], + equal_ref = Base_Ref[2], + ref_of_sexp = Base_Ref[3], + sexp_of_ref = Base_Ref[4]; + function ref_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Ref[5], a_sexp_grammar); + } + var + compare_string = Base_String[37], + equal_string = Base_String[121], + hash_fold_string = Base_String[26]; + function hash_string(x){return runtime.Base_hash_string(x);} + var + string_of_sexp = Base_String[27], + sexp_of_string = Base_String[28], + string_sexp_grammar = Base_String[1], + compare_bytes = Base_Bytes[16], + equal_bytes = Base_Bytes[15], + bytes_of_sexp = Base_Bytes[1], + sexp_of_bytes = Base_Bytes[2], + bytes_sexp_grammar = Base_Bytes[3], + compare_unit = Base_Unit[16], + equal_unit = Base_Unit[15], + hash_fold_unit = Base_Unit[3], + func$6 = Base_Unit[4]; + function hash_unit(x){return caml_call1(func$6, x);} + var + unit_of_sexp = Base_Unit[5], + sexp_of_unit = Base_Unit[6], + unit_sexp_grammar = Base_Unit[2], + symbol$6 = Base_List[148][1], + _a_ = Base_Int[70], + symbol$7 = _a_[1], + lnot = _a_[2], + abs = _a_[3], + zero = _a_[4], + symbol$8 = _a_[5], + symbol$9 = _a_[6], + symbol$10 = _a_[7], + _b_ = Base_Import[97], + ascending$0 = _b_[1], + descending$0 = _b_[2], + max$0 = _b_[3], + min$0 = _b_[4], + include = Base_Float[104], + symbol$11 = include[1], + symbol$12 = include[2], + symbol$13 = include[3], + symbol$14 = include[4], + symbol$15 = include[5], + symbol$16 = include[6], + symbol$17 = include[7], + symbol$18 = Base_String[53], + fst = Base_Import[125], + snd = Base_Import[127], + failwith = Base_Import[124], + invalid_arg = Base_Import[126], + raise_s = Base_Error[30], + phys_equal = Base_Import[128], + Export = + [0, + compare_array, + equal_array, + array_of_sexp, + sexp_of_array, + array_sexp_grammar, + compare_bool, + equal_bool, + hash_fold_bool, + hash_bool, + bool_of_sexp, + sexp_of_bool, + bool_sexp_grammar, + compare_char, + equal_char, + hash_fold_char, + hash_char, + char_of_sexp, + sexp_of_char, + char_sexp_grammar, + sexp_of_exn, + compare_float, + equal_float, + hash_fold_float, + hash_float, + float_of_sexp, + sexp_of_float, + float_sexp_grammar, + compare_int, + equal_int, + hash_fold_int, + hash_int, + int_of_sexp, + sexp_of_int, + int_sexp_grammar, + compare_int32, + equal_int32, + hash_fold_int32, + hash_int32, + int32_of_sexp, + sexp_of_int32, + int32_sexp_grammar, + compare_int64, + equal_int64, + hash_fold_int64, + hash_int64, + int64_of_sexp, + sexp_of_int64, + int64_sexp_grammar, + compare_list, + equal_list, + hash_fold_list, + list_of_sexp, + sexp_of_list, + list_sexp_grammar, + compare_nativeint, + equal_nativeint, + hash_fold_nativeint, + hash_nativeint, + nativeint_of_sexp, + sexp_of_nativeint, + nativeint_sexp_grammar, + compare_option, + equal_option, + hash_fold_option, + option_of_sexp, + sexp_of_option, + option_sexp_grammar, + compare_ref, + equal_ref, + ref_of_sexp, + sexp_of_ref, + ref_sexp_grammar, + compare_string, + equal_string, + hash_fold_string, + hash_string, + string_of_sexp, + sexp_of_string, + string_sexp_grammar, + compare_bytes, + equal_bytes, + bytes_of_sexp, + sexp_of_bytes, + bytes_sexp_grammar, + compare_unit, + equal_unit, + hash_fold_unit, + hash_unit, + unit_of_sexp, + sexp_of_unit, + unit_sexp_grammar, + symbol$6, + symbol$7, + lnot, + abs, + zero, + symbol$8, + symbol$9, + symbol$10, + ascending$0, + descending$0, + max$0, + min$0, + symbol$11, + symbol$12, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + fst, + snd, + failwith, + invalid_arg, + raise_s, + phys_equal], + compare_array$0 = Export[1], + equal_array$0 = Export[2], + array_of_sexp$0 = Export[3], + sexp_of_array$0 = Export[4], + array_sexp_grammar$0 = Export[5], + compare_bool$0 = Export[6], + equal_bool$0 = Export[7], + hash_fold_bool$0 = Export[8], + hash_bool$0 = Export[9], + bool_of_sexp$0 = Export[10], + sexp_of_bool$0 = Export[11], + bool_sexp_grammar$0 = Export[12], + compare_char$0 = Export[13], + equal_char$0 = Export[14], + hash_fold_char$0 = Export[15], + hash_char$0 = Export[16], + char_of_sexp$0 = Export[17], + sexp_of_char$0 = Export[18], + char_sexp_grammar$0 = Export[19], + sexp_of_exn$0 = Export[20], + compare_float$0 = Export[21], + equal_float$0 = Export[22], + hash_fold_float$0 = Export[23], + hash_float$0 = Export[24], + float_of_sexp$0 = Export[25], + sexp_of_float$0 = Export[26], + float_sexp_grammar$0 = Export[27], + compare_int$0 = Export[28], + equal_int$0 = Export[29], + hash_fold_int$0 = Export[30], + hash_int$0 = Export[31], + int_of_sexp$0 = Export[32], + sexp_of_int$0 = Export[33], + int_sexp_grammar$0 = Export[34], + compare_int32$0 = Export[35], + equal_int32$0 = Export[36], + hash_fold_int32$0 = Export[37], + hash_int32$0 = Export[38], + int32_of_sexp$0 = Export[39], + sexp_of_int32$0 = Export[40], + int32_sexp_grammar$0 = Export[41], + compare_int64$0 = Export[42], + equal_int64$0 = Export[43], + hash_fold_int64$0 = Export[44], + hash_int64$0 = Export[45], + int64_of_sexp$0 = Export[46], + sexp_of_int64$0 = Export[47], + int64_sexp_grammar$0 = Export[48], + compare_list$0 = Export[49], + equal_list$0 = Export[50], + hash_fold_list$0 = Export[51], + list_of_sexp$0 = Export[52], + sexp_of_list$0 = Export[53], + list_sexp_grammar$0 = Export[54], + compare_nativeint$0 = Export[55], + equal_nativeint$0 = Export[56], + hash_fold_nativeint$0 = Export[57], + hash_nativeint$0 = Export[58], + nativeint_of_sexp$0 = Export[59], + sexp_of_nativeint$0 = Export[60], + nativeint_sexp_grammar$0 = Export[61], + compare_option$0 = Export[62], + equal_option$0 = Export[63], + hash_fold_option$0 = Export[64], + option_of_sexp$0 = Export[65], + sexp_of_option$0 = Export[66], + option_sexp_grammar$0 = Export[67], + compare_ref$0 = Export[68], + equal_ref$0 = Export[69], + ref_of_sexp$0 = Export[70], + sexp_of_ref$0 = Export[71], + ref_sexp_grammar$0 = Export[72], + compare_string$0 = Export[73], + equal_string$0 = Export[74], + hash_fold_string$0 = Export[75], + hash_string$0 = Export[76], + string_of_sexp$0 = Export[77], + sexp_of_string$0 = Export[78], + string_sexp_grammar$0 = Export[79], + compare_bytes$0 = Export[80], + equal_bytes$0 = Export[81], + bytes_of_sexp$0 = Export[82], + sexp_of_bytes$0 = Export[83], + bytes_sexp_grammar$0 = Export[84], + compare_unit$0 = Export[85], + equal_unit$0 = Export[86], + hash_fold_unit$0 = Export[87], + hash_unit$0 = Export[88], + unit_of_sexp$0 = Export[89], + sexp_of_unit$0 = Export[90], + unit_sexp_grammar$0 = Export[91], + symbol$19 = Export[92], + symbol$20 = Export[93], + lnot$0 = Export[94], + abs$0 = Export[95], + zero$0 = Export[96], + symbol$21 = Export[97], + symbol$22 = Export[98], + symbol$23 = Export[99], + ascending$1 = Export[100], + descending$1 = Export[101], + max$1 = Export[102], + min$1 = Export[103], + symbol$24 = Export[104], + symbol$25 = Export[105], + symbol$26 = Export[106], + symbol$27 = Export[107], + symbol$28 = Export[108], + symbol$29 = Export[109], + symbol$30 = Export[110], + symbol$31 = Export[111], + fst$0 = Export[112], + snd$0 = Export[113], + failwith$0 = Export[114], + invalid_arg$0 = Export[115], + raise_s$0 = Export[116], + phys_equal$0 = Export[117], + include$0 = Base_Container_intf[1], + Continue_or_stop = include$0[1], + Not_found_s$0 = Base_Import[252]; + caml_call1(Base_Backtrace[7], 0); + var + Base = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Sexp, + Exported_for_specific_uses, + Export, + compare_array$0, + equal_array$0, + array_of_sexp$0, + sexp_of_array$0, + array_sexp_grammar$0, + compare_bool$0, + equal_bool$0, + hash_fold_bool$0, + hash_bool$0, + bool_of_sexp$0, + sexp_of_bool$0, + bool_sexp_grammar$0, + compare_char$0, + equal_char$0, + hash_fold_char$0, + hash_char$0, + char_of_sexp$0, + sexp_of_char$0, + char_sexp_grammar$0, + sexp_of_exn$0, + compare_float$0, + equal_float$0, + hash_fold_float$0, + hash_float$0, + float_of_sexp$0, + sexp_of_float$0, + float_sexp_grammar$0, + compare_int$0, + equal_int$0, + hash_fold_int$0, + hash_int$0, + int_of_sexp$0, + sexp_of_int$0, + int_sexp_grammar$0, + compare_int32$0, + equal_int32$0, + hash_fold_int32$0, + hash_int32$0, + int32_of_sexp$0, + sexp_of_int32$0, + int32_sexp_grammar$0, + compare_int64$0, + equal_int64$0, + hash_fold_int64$0, + hash_int64$0, + int64_of_sexp$0, + sexp_of_int64$0, + int64_sexp_grammar$0, + compare_list$0, + equal_list$0, + hash_fold_list$0, + list_of_sexp$0, + sexp_of_list$0, + list_sexp_grammar$0, + compare_nativeint$0, + equal_nativeint$0, + hash_fold_nativeint$0, + hash_nativeint$0, + nativeint_of_sexp$0, + sexp_of_nativeint$0, + nativeint_sexp_grammar$0, + compare_option$0, + equal_option$0, + hash_fold_option$0, + option_of_sexp$0, + sexp_of_option$0, + option_sexp_grammar$0, + compare_ref$0, + equal_ref$0, + ref_of_sexp$0, + sexp_of_ref$0, + ref_sexp_grammar$0, + compare_string$0, + equal_string$0, + hash_fold_string$0, + hash_string$0, + string_of_sexp$0, + sexp_of_string$0, + string_sexp_grammar$0, + compare_bytes$0, + equal_bytes$0, + bytes_of_sexp$0, + sexp_of_bytes$0, + bytes_sexp_grammar$0, + compare_unit$0, + equal_unit$0, + hash_fold_unit$0, + hash_unit$0, + unit_of_sexp$0, + sexp_of_unit$0, + unit_sexp_grammar$0, + symbol$19, + symbol$20, + lnot$0, + abs$0, + zero$0, + symbol$21, + symbol$22, + symbol$23, + ascending$1, + descending$1, + max$1, + min$1, + symbol$24, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + symbol$31, + fst$0, + snd$0, + failwith$0, + invalid_arg$0, + raise_s$0, + phys_equal$0, + Continue_or_stop, + Not_found_s$0]; + runtime.caml_register_global(21, Base, "Base"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/jane-street-headers/jane_street_headers.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_sexp_conv.runtime-lib/ppx_sexp_conv_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_compare.runtime-lib/ppx_compare_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_enumerate.runtime-lib/ppx_enumerate_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_hash.runtime-lib/ppx_hash_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/time_now/time_now.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/time_now/time_now.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Int63 = global_data.Base__Int63, + Base = global_data.Base, + cst_gettimeofday_failed = "gettimeofday failed"; + function nanoseconds_since_unix_epoch(param){ + var t = runtime.time_now_nanoseconds_since_unix_epoch_or_zero(0); + return caml_call2(Base_Int63[17], t, Base_Int63[38]) + ? t + : caml_call1(Base[201], cst_gettimeofday_failed); + } + var Time_now = [0, nanoseconds_since_unix_epoch]; + runtime.caml_register_global(3, Time_now, "Time_now"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$13 = "", + cst$14 = "\n", + cst$15 = " ", + cst_line = " , line ", + cst_File = " File ", + cst_threw = " threw", + cst_s$0 = "%s", + cst_s = "%s%!", + cst$12 = ".\n", + cst_Ppx_inline_test_lib_Runtim$0 = "Ppx_inline_test_lib__Runtime", + cst_TES = "TES", + cst_TESTING_FRAMEWORK = "TESTING_FRAMEWORK", + cst_T_MODULE_at$0 = "T_MODULE at ", + cst_T_MODULES = "T_MODULES", + cst_inline_test_runner$0 = "inline-test-runner", + cst_inline_tests_log$0 = "inline_tests.log", + cst_ppx_inline_test_error_the_ = + "ppx_inline_test error: the following -only-test flags matched nothing:", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_equal = runtime.caml_string_equal, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$11 = cst$13, + cst$9 = cst$14, + cst$10 = cst$15, + cst$7 = cst$14, + cst$8 = cst$15, + cst$5 = cst$14, + cst$6 = " ", + cst$3 = cst$14, + cst$4 = cst$13, + cst$2 = ".", + cst$0 = cst$13, + cst$1 = ": ", + enable_everything = [0, 0, 0], + cst = cst$13, + am_running_inline_test_env_var = cst_TESTING_FRAMEWORK, + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Filename = global_data.Stdlib__Filename, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_String = global_data.Stdlib__String, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Result = global_data.Stdlib__Result, + Base = global_data.Base, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Random = global_data.Stdlib__Random, + Base_Random = global_data.Base__Random, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int63 = global_data.Base__Int63, + Time_now = global_data.Time_now, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Array = global_data.Stdlib__Array, + _E_ = [0, [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, 0]]]], " %s:%d"], + _F_ = [0, [12, 32, [2, 0, 0]], " %s"], + _z_ = + [0, + [11, + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n", + [10, 0]], + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n%!"], + _A_ = + [0, + [11, + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n", + [10, 0]], + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n%!"], + _B_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + _C_ = + [0, + [4, + 0, + 0, + 0, + [11, + " tests ran, ", + [4, 0, 0, 0, [11, " test_modules ran\n", [10, 0]]]]], + "%d tests ran, %d test_modules ran\n%!"], + _D_ = + [0, + [11, cst_ppx_inline_test_error_the_, 0], + cst_ppx_inline_test_error_the_], + _G_ = [0, [11, cst$12, [10, 0]], ".\n%!"], + _H_ = + [0, + [11, "ppx_inline_test error: no tests have been run.\n", [10, 0]], + "ppx_inline_test error: no tests have been run.\n%!"], + _J_ = [0, [11, cst_T_MODULES, 0], cst_T_MODULES], + _K_ = [0, [11, ", ", [4, 0, 0, 0, [11, " TES", 0]]], ", %d TES"], + _I_ = + [0, + [11, + "FAILED ", + [4, + 0, + 0, + 0, + [11, " / ", [4, 0, 0, 0, [11, " tests", [2, 0, [12, 10, [10, 0]]]]]]]], + "FAILED %d / %d tests%s\n%!"], + _x_ = + [0, + [11, + cst_T_MODULE_at$0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]]], + "T_MODULE at %s threw%s%s.\n%s%s\n%!"], + _y_ = [0, [11, cst_TES, 0], cst_TES], + cst_ppx_inline_test_cannot_use = + "ppx_inline_test: cannot use -list-partition or -partition without specifying a partition at preprocessing time", + _r_ = [0, [2, 0, [12, 10, [2, 0, 0]]], "%s\n%s"], + _s_ = [0, [2, 0, [10, 0]], cst_s], + _t_ = [0, 1], + _u_ = + [0, + [11, " (", [8, [0, 0, 0], 0, [0, 3], [11, " sec)\n", [10, 0]]]], + " (%.3f sec)\n%!"], + _v_ = + [0, + [2, 0, [11, " is false.\n", [2, 0, [12, 10, [10, 0]]]]], + "%s is false.\n%s\n%!"], + _w_ = + [0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]], + "%s threw%s%s.\n%s%s\n%!"], + _q_ = [0, [2, 0, [10, 0]], cst_s], + _p_ = [0, [2, 0, [10, 0]], cst_s], + _o_ = [0, [12, 10, [2, 0, [12, 10, [10, 0]]]], "\n%s\n%!"], + cst_T_MODULE_at = cst_T_MODULE_at$0, + cst_in_TES = " in TES", + cst_time_without_resetting_ran = "time_without_resetting_random_seeds", + cst_Ppx_inline_test_lib_Runtim = cst_Ppx_inline_test_lib_Runtim$0, + cst_inline_tests_log = cst_inline_tests_log$0, + _S_ = + [0, + [11, + "Argument ", + [2, + 0, + [11, " doesn't fit the format filename[:line_number]\n", [10, 0]]]], + "Argument %s doesn't fit the format filename[:line_number]\n%!"], + _O_ = + [0, + [2, + 0, + [11, ": unexpected anonymous argument ", [2, 0, [12, 10, [10, 0]]]]], + "%s: unexpected anonymous argument %s\n%!"], + _h_ = + [0, + [11, + cst_File, + [3, + 0, + [11, + cst_line, + [4, + 0, + 0, + 0, + [11, + " , characters ", + [4, 0, 0, 0, [11, " - ", [4, 0, 0, 0, [12, 32, [10, 0]]]]]]]]]], + " File %S , line %d , characters %d - %d %!"], + _g_ = + [0, + [11, cst_File, [3, 0, [11, cst_line, [4, 0, 0, 0, [12, 32, [10, 0]]]]]], + " File %S , line %d %!"], + _f_ = [0, [11, cst_File, [3, 0, [12, 32, [10, 0]]]], " File %S %!"], + _e_ = + [0, + [11, + "File ", + [3, + 0, + [11, + ", line ", + [4, + 0, + 0, + 0, + [11, + ", characters ", + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [2, 0, 0]]]]]]]]], + "File %S, line %d, characters %d-%d%s"], + _a_ = [0, [2, 0, 0], cst_s$0], + _b_ = [0, [2, 0, 0], cst_s$0], + cst_success = "success", + cst_failure = "failure", + cst_error = "error", + cst_inline_test_runner = cst_inline_test_runner$0, + _N_ = + [0, + [2, 0, [12, 32, [2, 0, [12, 32, [2, 0, [11, " [args]", 0]]]]]], + "%s %s %s [args]"], + cst_Path_to_the_root_of_the_so = " Path to the root of the source tree", + cst_source_tree_root = "-source-tree-root", + cst_Allow_output_patterns_in_t = + " Allow output patterns in tests expectations", + cst_allow_output_patterns = "-allow-output-patterns", + cst_Diff_command_for_tests_tha = + " Diff command for tests that require diffing (use - to disable diffing)", + cst_diff_cmd = "-diff-cmd", + cst_Update_expect_tests_in_pla = " Update expect tests in place", + cst_in_place = "-in-place", + cst_Summarize_tests_without_us = " Summarize tests without using color", + cst_no_color = "-no-color", + cst_location_Run_only_the_test = + 'location Run only the tests specified by all the -only-test options.\n Locations can be one of these forms:\n - file.ml\n - file.ml:line_number\n - File "file.ml"\n - File "file.ml", line 23\n - File "file.ml", line 23, characters 2-3', + cst_only_test = "-only-test", + cst_substring_Only_run_tests_w = + "substring Only run tests whose names contain the given substring", + cst_matching = "-matching", + cst_tag_Only_run_tests_tagged_ = + "tag Only run tests tagged with [tag] (overrides previous -drop-tag)", + cst_require_tag = "-require-tag", + cst_tag_Only_run_tests_not_tag = + "tag Only run tests not tagged with [tag] (overrides previous -require-tag)", + cst_drop_tag = "-drop-tag", + cst_Log_the_tests_run_in_inlin = " Log the tests run in inline_tests.log", + cst_log = "-log", + cst_Show_the_number_of_tests_r = " Show the number of tests ran", + cst_show_counts = "-show-counts", + cst_End_with_an_error_if_no_te = " End with an error if no tests were run", + cst_strict = "-strict", + cst_Run_tests_only_up_to_the_f = + " Run tests only up to the first error (doesn't work for expect tests)", + cst_stop_on_error = "-stop-on-error", + cst_Show_the_tests_as_they_run = " Show the tests as they run", + cst_verbose = "-verbose", + cst_Only_run_the_tests_in_the_ = + " Only run the tests in the given partition", + cst_partition = "-partition", + cst_Lists_all_the_partitions_t = + " Lists all the partitions that contain at least one test or test_module", + cst_list_partitions = "-list-partitions", + cst_Do_not_run_tests_but_show_ = + " Do not run tests but show what would have been run", + cst_list_test_names = "-list-test-names", + _n_ = [0, 187165616, 545942154], + _L_ = [0, 187165616, -863538453]; + function to_string(param){ + switch(param){ + case 0: + return cst_success; + case 1: + return cst_failure; + default: return cst_error; + } + } + function combine(t1, t2){ + var switch$0 = 0; + switch(t1){ + case 0: + if(! t2) return 0; break; + case 1: break; + default: switch$0 = 1; + } + if(! switch$0 && 2 !== t2) return 1; + return 2; + } + function combine_all(ts){ + return caml_call3(Stdlib_List[25], combine, 0, ts); + } + var + test_modules_ran = [0, 0], + test_modules_failed = [0, 0], + tests_ran = [0, 0], + tests_failed = [0, 0], + dynamic_lib = [0, 0], + action = [0, -950194894]; + try{ + caml_sys_getenv("FORCE_DROP_INLINE_TEST"); + var _aa_ = 1, force_drop = _aa_; + } + catch(_bY_){ + var _c_ = caml_wrap_exception(_bY_); + if(_c_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_c_, 0); + var force_drop = 0; + } + function get(param){return force_drop ? -950194894 : action[1];} + var _d_ = caml_call2(Stdlib_Hashtbl[1], 0, 23), current = [0, cst]; + function found_test(param){ + var + _bW_ = caml_string_notequal(current[1], cst$13), + _bX_ = _bW_ ? 1 - caml_call2(Stdlib_Hashtbl[9], _d_, current[1]) : _bW_; + return _bX_ ? caml_call3(Stdlib_Hashtbl[5], _d_, current[1], 0) : _bX_; + } + function is_current(param){ + if(! param) return 1; + var p = param[1]; + return caml_string_equal(p, current[1]); + } + var current$0 = [0, 0]; + function current_tags(param){ + var t = current$0[1]; + function _bU_(m){return m[2];} + var _bV_ = caml_call2(Stdlib_List[19], _bU_, t); + return caml_call1(Stdlib_List[13], _bV_); + } + var + verbose = [0, 0], + strict = [0, 0], + show_counts = [0, 0], + list_test_names = [0, 0], + delayed_errors = [0, 0], + stop_on_error = [0, 0], + log = [0, 0], + time_sec = [0, 0.], + use_color = [0, 1], + in_place = [0, 0], + diff_command = [0, 0], + source_tree_root = [0, 0], + allow_output_patterns = [0, 0]; + function displayed_descr(param){ + var _bS_ = caml_obj_tag(param); + if(250 === _bS_) + var descr = param[1]; + else{ + var switch$0 = 0; + if(246 !== _bS_ && 244 !== _bS_){var descr = param; switch$0 = 1;} + if(! switch$0) var descr = caml_call1(CamlinternalLazy[2], param); + } + return function(filename, line, start_pos, end_pos){ + var + _bT_ = + caml_string_equal(descr, cst$13) + ? cst$0 + : caml_call2(Stdlib[28], cst$1, descr); + return caml_call6 + (Stdlib_Printf[4], _e_, filename, line, start_pos, end_pos, _bT_);}; + } + var + _i_ = caml_sys_argv(0), + match = caml_call1(Stdlib_Array[9], _i_), + switch$0 = 0; + if(match){ + var _j_ = match[2]; + if(_j_){ + var name = match[1]; + if(! caml_string_notequal(_j_[1], cst_inline_test_runner$0)){ + var match$0 = _j_[2]; + if(match$0){ + var rest = match$0[2], lib = match$0[1]; + if(Base[86][1]){ + var + tests = [0, 0], + list_partitions = [0, 0], + partition = [0, 0], + tag_predicate = [0, enable_everything], + name_filter = [0, 0], + msg$1 = + caml_call4 + (Stdlib_Printf[4], _N_, name, cst_inline_test_runner, lib), + f = + function(anon){ + caml_call3(Stdlib_Printf[3], _O_, name, anon); + return caml_call1(Stdlib[99], 1); + }, + _P_ = 0, + _Q_ = + [0, + [0, + cst_allow_output_patterns, + [2, allow_output_patterns], + cst_Allow_output_patterns_in_t], + [0, + [0, + cst_source_tree_root, + [4, function(s){source_tree_root[1] = [0, s]; return 0;}], + cst_Path_to_the_root_of_the_so], + _P_]], + _R_ = + [0, + [0, cst_no_color, [3, use_color], cst_Summarize_tests_without_us], + [0, + [0, cst_in_place, [2, in_place], cst_Update_expect_tests_in_pla], + [0, + [0, + cst_diff_cmd, + [4, function(s){diff_command[1] = [0, s]; return 0;}], + cst_Diff_command_for_tests_tha], + _Q_]]], + _T_ = + [0, + [0, + cst_only_test, + [4, + function(str){ + try{ + var + _bK_ = + function(file, line, start_pos, end_pos){return [0, file, [0, line]]; + }, + _bL_ = [0, caml_call3(Stdlib_Scanf[5], str, _h_, _bK_)], + match = _bL_; + } + catch(_bP_){ + try{ + var + _bI_ = function(file, line){return [0, file, [0, line]];}, + _bJ_ = [0, caml_call3(Stdlib_Scanf[5], str, _g_, _bI_)], + match = _bJ_; + } + catch(_bQ_){ + try{ + var + _bG_ = function(file){return [0, file, 0];}, + _bH_ = [0, caml_call3(Stdlib_Scanf[5], str, _f_, _bG_)], + match = _bH_; + } + catch(_bR_){var match = 0;} + } + } + if(match) + var + match$0 = match[1], + index = match$0[2], + file = match$0[1], + index$0 = index, + filename = file; + else if(caml_call2(Stdlib_String[14], str, 58)){ + var + i = caml_call2(Stdlib_String[35], str, 58), + filename$0 = caml_call3(Stdlib_String[15], str, 0, i), + index_string = + caml_call3 + (Stdlib_String[15], + str, + i + 1 | 0, + (caml_ml_string_length(str) - i | 0) - 1 | 0); + try{ + var + _bN_ = runtime.caml_int_of_string(index_string), + index$1 = _bN_; + } + catch(_bO_){ + var _bM_ = caml_wrap_exception(_bO_); + if(_bM_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bM_, 0); + caml_call2(Stdlib_Printf[3], _S_, str); + var index$1 = caml_call1(Stdlib[99], 1); + } + var index$0 = [0, index$1], filename = filename$0; + } + else + var index$0 = 0, filename = str; + tests[1] = [0, [0, filename, index$0, [0, 0]], tests[1]]; + return 0; + }], + cst_location_Run_only_the_test], + _R_], + _U_ = + [0, + [0, + cst_matching, + [4, + function(s){name_filter[1] = [0, s, name_filter[1]]; return 0;}], + cst_substring_Only_run_tests_w], + _T_], + _V_ = + [0, + [0, + cst_require_tag, + [4, + function(tag){ + var t = tag_predicate[1], _bC_ = t[2]; + function _bD_(_bF_){return caml_string_notequal(tag, _bF_);} + var _bE_ = caml_call2(Stdlib_List[41], _bD_, _bC_); + tag_predicate[1] = [0, [0, tag, t[1]], _bE_]; + return 0; + }], + cst_tag_Only_run_tests_tagged_], + _U_], + _W_ = + [0, + [0, + cst_drop_tag, + [4, + function(tag){ + var t = tag_predicate[1], _by_ = [0, tag, t[2]], _bz_ = t[1]; + function _bA_(_bB_){return caml_string_notequal(tag, _bB_);} + tag_predicate[1] = + [0, caml_call2(Stdlib_List[41], _bA_, _bz_), _by_]; + return 0; + }], + cst_tag_Only_run_tests_not_tag], + _V_], + _X_ = + [0, + [0, cst_verbose, [2, verbose], cst_Show_the_tests_as_they_run], + [0, + [0, + cst_stop_on_error, + [2, stop_on_error], + cst_Run_tests_only_up_to_the_f], + [0, + [0, cst_strict, [2, strict], cst_End_with_an_error_if_no_te], + [0, + [0, + cst_show_counts, + [2, show_counts], + cst_Show_the_number_of_tests_r], + [0, + [0, + cst_log, + [0, + function(param){ + try{runtime.caml_sys_remove(cst_inline_tests_log$0);} + catch(_bx_){} + log[1] = [0, caml_call1(Stdlib[60], cst_inline_tests_log)]; + return 0; + }], + cst_Log_the_tests_run_in_inlin], + _W_]]]]], + _Y_ = + [0, + [0, + cst_partition, + [4, function(i){partition[1] = [0, i]; return 0;}], + cst_Only_run_the_tests_in_the_], + _X_], + _Z_ = + [0, + [0, + cst_list_partitions, + [0, function(param){list_partitions[1] = 1; return 0;}], + cst_Lists_all_the_partitions_t], + _Y_], + ___ = + [0, + [0, + cst_list_test_names, + [0, + function(param){ + list_test_names[1] = 1; + verbose[1] = 1; + return 0; + }], + cst_Do_not_run_tests_but_show_], + _Z_], + l = caml_call2(Stdlib_Arg[11], 0, ___), + argv = caml_call1(Stdlib_Array[10], [0, name, rest]); + try{caml_call5(Stdlib_Arg[3], 0, argv, l, f, msg$1);} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib_Arg[8]){ + var msg = exn[2]; + caml_call2(Stdlib_Printf[3], _a_, msg); + caml_call1(Stdlib[99], 1); + } + else{ + if(exn[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace(exn, 0); + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[2], _b_, msg$0); + caml_call1(Stdlib[99], 0); + } + } + var + _$_ = list_partitions[1] ? -260537174 : [0, 1025081494, partition[1]], + v = + [0, + -753295984, + [0, [0, lib, tests[1], name_filter[1], tag_predicate[1]], _$_]]; + action[1] = v; + switch$0 = 1; + } + } + } + } + } + var am_test_runner = typeof get(0) === "number" ? 0 : 1, switch$1 = 0; + try{caml_sys_getenv("PPX_INLINE_TEST_LIB_AM_RUNNING_INLINE_TEST");} + catch(_bv_){ + var _k_ = caml_wrap_exception(_bv_); + if(_k_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_k_, 0); + var switch$2 = 0; + try{var val = caml_sys_getenv(cst_TESTING_FRAMEWORK);} + catch(_bw_){ + var _l_ = caml_wrap_exception(_bw_); + if(_l_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_l_, 0); + var _m_ = 0; + switch$2 = 1; + } + if(! switch$2) + var _M_ = caml_string_notequal(val, "inline-test") ? 0 : 1, _m_ = _M_; + var am_running_inline_test = _m_; + switch$1 = 1; + } + if(! switch$1) var am_running_inline_test = 1; + var + testing = am_test_runner ? _n_ : am_running_inline_test ? _L_ : 822171972; + function wall_time_clock_ns(param){return caml_call1(Time_now[1], 0);} + var + where_to_cut_backtrace = + [246, + function(param){ + var + _bt_ = caml_call2(Stdlib[28], cst$2, cst_time_without_resetting_ran), + _bu_ = caml_call2(Stdlib[28], cst_Ppx_inline_test_lib_Runtim, _bt_); + return caml_call2(Base_String[70][2], 0, _bu_); + }]; + function time_without_resetting_random_(f){ + var before_ns = wall_time_clock_ns(0); + try{var _bs_ = [0, caml_call1(f, 0)], res = _bs_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + res = [1, [0, exn, caml_call1(Stdlib_Printexc[6], 0)]]; + } + var + _bq_ = wall_time_clock_ns(0), + _br_ = caml_call2(Base_Int63[42], _bq_, before_ns); + time_sec[1] = caml_call1(Base_Int63[3], _br_) / 1000000000.; + return res; + } + var + saved_caml_random_state = + [246, + function(_bp_){ + return caml_call1(Stdlib_Random[15][1], [0, 100, 200, 300]); + }], + saved_base_random_state = + [246, + function(_bo_){ + return caml_call1(Base_Random[18][2], [0, 111, 222, 333]); + }]; + function string_of_module_descr(param){ + var t = current$0[1]; + function _bh_(m){return m[1];} + var _bi_ = caml_call2(Stdlib_List[19], _bh_, t); + function _bj_(s){ + var + _bl_ = caml_call1(Stdlib_String[28], s), + _bm_ = caml_call2(Stdlib[28], _bl_, cst$3), + _bn_ = caml_call2(Stdlib[28], cst_T_MODULE_at, _bm_); + return caml_call2(Stdlib[28], cst_in_TES, _bn_); + } + var _bk_ = caml_call2(Stdlib_List[19], _bj_, _bi_); + return caml_call2(Stdlib_String[6], cst$4, _bk_); + } + function print_delayed_errors(param){ + var delayed_errors$0 = caml_call1(Stdlib_List[9], delayed_errors[1]); + if(! delayed_errors$0) return 0; + var _bf_ = caml_call2(Stdlib_String[1], 70, 61); + caml_call2(Stdlib_Printf[3], _o_, _bf_); + function _bg_(message){return caml_call2(Stdlib_Printf[3], _p_, message);} + return caml_call2(Stdlib_List[17], _bg_, delayed_errors$0); + } + function eprintf_or_delay(fmt){ + function _bd_(s){ + if(verbose[1]) + delayed_errors[1] = [0, s, delayed_errors[1]]; + else + caml_call2(Stdlib_Printf[3], _q_, s); + var _be_ = stop_on_error[1]; + return _be_ ? (print_delayed_errors(0), caml_call1(Stdlib[99], 2)) : _be_; + } + return caml_call2(Stdlib_Printf[10], _bd_, fmt); + } + function add_hooks(C){ + return function(f, param){caml_call1(C[1], 0); return caml_call1(f, 0);}; + } + function hum_backtrace(backtrace){ + var + _a7_ = caml_call1(Base_String[88], backtrace), + _a8_ = Base_List[133], + _a9_ = + caml_call2 + (_a8_, + _a7_, + function(str){ + var _bb_ = caml_obj_tag(where_to_cut_backtrace); + if(250 === _bb_) + var _bc_ = where_to_cut_backtrace[1]; + else{ + var switch$0 = 0; + if(246 !== _bb_ && 244 !== _bb_){ + var _bc_ = where_to_cut_backtrace; + switch$0 = 1; + } + if(! switch$0) + var + _bc_ = caml_call1(CamlinternalLazy[2], where_to_cut_backtrace); + } + return 1 - caml_call2(Base_String[70][5], _bc_, str); + }), + _a__ = Base_List[76], + _a$_ = + caml_call2 + (_a__, + _a9_, + function(str){ + var _ba_ = caml_call2(Base[198], str, cst$5); + return caml_call2(Base[198], cst$6, _ba_); + }); + return caml_call2(Base_String[54], 0, _a$_); + } + function test_inner + (config, + descr, + tags, + def_filename, + def_line_number, + start_pos, + end_pos, + f, + bool_of_f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _aN_ = match[2], + what_to_do = _aN_[2], + match$0 = _aN_[1], + which_tags = match$0[4], + name_filter = match$0[3], + only_test_location = match$0[2], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + descr$0 = + [246, + function(_a6_){ + return caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos); + }], + _aO_ = current_tags(0), + complete_tags = caml_call2(Stdlib[37], tags, _aO_), + _aP_ = caml_equal([0, libname], dynamic_lib[1]); + if(_aP_){ + if(only_test_location) + var + _aL_ = + function(param){ + var + used = param[3], + line_number_opt = param[2], + filename = param[1], + position_start = + caml_ml_string_length(def_filename) + - caml_ml_string_length(filename) + | 0, + _a1_ = 0 <= position_start ? 1 : 0; + if(_a1_){ + var + end_of_def_filename = + caml_call3 + (Stdlib_String[15], + def_filename, + position_start, + caml_ml_string_length(filename)), + _a2_ = caml_string_equal(end_of_def_filename, filename); + if(_a2_){ + var + _a3_ = 0 === position_start ? 1 : 0, + _a4_ = + _a3_ + || + (47 + === + runtime.caml_string_get + (def_filename, position_start - 1 | 0) + ? 1 + : 0); + if(_a4_) + if(line_number_opt) + var + line_number = line_number_opt[1], + _a5_ = caml_equal(def_line_number, line_number); + else + var _a5_ = 1; + else + var _a5_ = _a4_; + } + else + var _a5_ = _a2_; + var found = _a5_; + } + else + var found = _a1_; + if(found) used[1] = 1; + return found; + }, + _aQ_ = caml_call2(Stdlib_List[33], _aL_, only_test_location); + else + var _aQ_ = 1; + if(_aQ_){ + var + _aC_ = which_tags[1], + _aD_ = + function(req){ + return 1 - caml_call2(Stdlib_List[36], req, complete_tags); + }, + _aE_ = caml_call2(Stdlib_List[33], _aD_, _aC_); + if(_aE_) + var _aR_ = _aE_; + else + var + _aF_ = which_tags[2], + _aG_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, complete_tags); + }, + _aR_ = caml_call2(Stdlib_List[33], _aG_, _aF_); + var _aS_ = 1 - _aR_; + if(_aS_){ + var _aT_ = caml_obj_tag(descr$0); + if(250 === _aT_) + var descr$1 = descr$0[1]; + else{ + var switch$0 = 0; + if(246 !== _aT_ && 244 !== _aT_){var descr$1 = descr$0; switch$0 = 1;} + if(! switch$0) var descr$1 = caml_call1(CamlinternalLazy[2], descr$0); + } + if(name_filter) + var + _aM_ = + function(substring){ + return caml_call2(Base_String[76], descr$1, substring); + }, + _aU_ = caml_call2(Stdlib_List[33], _aM_, name_filter); + else + var _aU_ = 1; + var should_run = _aU_; + } + else + var should_run = _aS_; + } + else + var should_run = _aQ_; + } + else + var should_run = _aP_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _aV_ = is_current(partition); + if(_aV_){ + var _aW_ = caml_obj_tag(descr$0); + if(250 === _aW_) + var descr$2 = descr$0[1]; + else{ + var switch$1 = 0; + if(246 !== _aW_ && 244 !== _aW_){var descr$2 = descr$0; switch$1 = 1;} + if(! switch$1) var descr$2 = caml_call1(CamlinternalLazy[2], descr$0); + } + tests_ran[1]++; + var match$1 = log[1]; + if(match$1){ + var ch = match$1[1], _aX_ = string_of_module_descr(0); + caml_call4(Stdlib_Printf[1], ch, _r_, descr$2, _aX_); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _s_, descr$2); + if(list_test_names[1]) + var result$0 = _t_; + else{ + var + caml_random_state = caml_call1(Stdlib_Random[16], 0), + base_random_state = caml_call1(Base_Random[18][4], Base_Random[18][1]), + _aH_ = caml_obj_tag(saved_caml_random_state); + if(250 === _aH_) + var _aI_ = saved_caml_random_state[1]; + else{ + var switch$2 = 0; + if(246 !== _aH_ && 244 !== _aH_){ + var _aI_ = saved_caml_random_state; + switch$2 = 1; + } + if(! switch$2) + var _aI_ = caml_call1(CamlinternalLazy[2], saved_caml_random_state); + } + caml_call1(Stdlib_Random[17], _aI_); + var _aJ_ = caml_obj_tag(saved_base_random_state); + if(250 === _aJ_) + var _aK_ = saved_base_random_state[1]; + else{ + var switch$3 = 0; + if(246 !== _aJ_ && 244 !== _aJ_){ + var _aK_ = saved_base_random_state; + switch$3 = 1; + } + if(! switch$3) + var _aK_ = caml_call1(CamlinternalLazy[2], saved_base_random_state); + } + caml_call1(Base_Random[19], _aK_); + var result = time_without_resetting_random_(f$0); + caml_call1(Stdlib_Random[17], caml_random_state); + caml_call1(Base_Random[19], base_random_state); + var result$0 = caml_call2(Stdlib_Result[8], bool_of_f, result); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _u_, time_sec[1]); + if(0 !== result$0[0]){ + var match$2 = result$0[1], backtrace = match$2[2], exn = match$2[1]; + tests_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$7 : cst$8, + _aZ_ = string_of_module_descr(0); + return caml_call5 + (eprintf_or_delay(_w_), + descr$2, + sep, + exn_str, + backtrace$0, + _aZ_); + } + if(result$0[1]) return 0; + tests_failed[1]++; + var _aY_ = string_of_module_descr(0); + return caml_call2(eprintf_or_delay(_v_), descr$2, _aY_); + } + var _a0_ = _aV_; + } + else + var _a0_ = should_run; + return _a0_; + } + function set_lib_and_partition(static_lib, partition){ + if(dynamic_lib[1]) return 0; + dynamic_lib[1] = [0, static_lib]; + var match = get(0); + if(typeof match === "number") return 0; + var + match$0 = match[2], + what_to_do = match$0[2], + which_tests = match$0[1], + _aB_ = caml_string_equal(which_tests[1], static_lib); + if(! _aB_) return _aB_; + var switch$0 = 0; + if(typeof what_to_do !== "number" && ! what_to_do[2]){var requires_partition = 0; switch$0 = 1;} + if(! switch$0) var requires_partition = 1; + if(caml_string_equal(partition, cst$13) && requires_partition) + return caml_call1(Stdlib[2], cst_ppx_inline_test_cannot_use); + current[1] = partition; + return 0; + } + function unset_lib(static_lib){ + var match = dynamic_lib[1]; + if(! match) return 0; + var + lib = match[1], + _az_ = caml_string_equal(lib, static_lib), + _aA_ = _az_ ? (dynamic_lib[1] = 0, 0) : _az_; + return _aA_; + } + function test + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(b){return b;}); + } + function test_unit + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(param){return 1;}); + } + function test_module + (config, descr, tags, def_filename, def_line_number, start_pos, end_pos, f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _as_ = match[2], + what_to_do = _as_[2], + match$0 = _as_[1], + which_tags = match$0[4], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + _at_ = current_tags(0), + partial_tags = caml_call2(Stdlib[37], tags, _at_), + _au_ = caml_equal([0, libname], dynamic_lib[1]); + if(_au_) + var + _aq_ = which_tags[2], + _ar_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, partial_tags); + }, + should_run = 1 - caml_call2(Stdlib_List[33], _ar_, _aq_); + else + var should_run = _au_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _av_ = is_current(partition); + if(_av_){ + test_modules_ran[1]++; + var + descr$0 = + caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos), + prev = current$0[1]; + current$0[1] = [0, [0, descr$0, tags], prev]; + try{var x = time_without_resetting_random_(f$0); current$0[1] = prev;} + catch(e$0){ + var e = caml_wrap_exception(e$0); + current$0[1] = prev; + throw caml_maybe_attach_backtrace(e, 0); + } + if(0 === x[0]) return 0; + var match$1 = x[1], backtrace = match$1[2], exn = match$1[1]; + test_modules_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$9 : cst$10, + _aw_ = string_of_module_descr(0), + _ax_ = caml_call1(Stdlib_String[28], descr$0); + return caml_call5 + (eprintf_or_delay(caml_call2(Stdlib[98], _y_, _x_)), + _ax_, + sep, + exn_str, + backtrace$0, + _aw_); + } + var _ay_ = _av_; + } + else + var _ay_ = should_run; + return _ay_; + } + function summarize(param){ + var match = get(0); + if(typeof match === "number"){ + var switch$0 = 0; + if(runtime.caml_notequal(caml_sys_argv(0), [0])){ + var _ai_ = runtime.caml_check_bound(caml_sys_argv(0), 0)[1]; + if + (caml_string_equal + (caml_call1(Stdlib_Filename[13], _ai_), "inline_tests_runner.exe")){caml_call1(Stdlib_Printf[3], _z_); switch$0 = 1;} + } + if(! switch$0) caml_call1(Stdlib_Printf[3], _A_); + return 2; + } + var _aj_ = match[2], which_tests = _aj_[1]; + if(typeof _aj_[2] === "number"){ + var + _ae_ = 0, + _af_ = function(k, param, acc){return [0, k, acc];}, + _ag_ = caml_call3(Stdlib_Hashtbl[14], _af_, _d_, _ae_), + _ah_ = caml_call2(Stdlib_List[56], Stdlib_String[9], _ag_), + _ak_ = caml_call1(Stdlib_Printf[2], _B_); + caml_call2(Stdlib_List[17], _ak_, _ah_); + return 0; + } + var match$0 = log[1]; + if(match$0){var ch = match$0[1]; caml_call1(Stdlib[76], ch);} + print_delayed_errors(0); + var count = tests_failed[1], count_test_modules = test_modules_failed[1]; + if(0 === count && 0 === count_test_modules){ + if(show_counts[1]) + caml_call3(Stdlib_Printf[3], _C_, tests_ran[1], test_modules_ran[1]); + var + _al_ = which_tests[2], + _am_ = function(param){var used = param[3]; return 1 - used[1];}, + unused_tests = caml_call2(Stdlib_List[41], _am_, _al_), + errors = unused_tests ? [0, unused_tests] : 0; + if(errors){ + var tests = errors[1]; + caml_call1(Stdlib_Printf[3], _D_); + var + _an_ = + function(param){ + var line_number_opt = param[2], filename = param[1]; + if(! line_number_opt) + return caml_call2(Stdlib_Printf[3], _F_, filename); + var line_number = line_number_opt[1]; + return caml_call3(Stdlib_Printf[3], _E_, filename, line_number); + }; + caml_call2(Stdlib_List[17], _an_, tests); + caml_call1(Stdlib_Printf[3], _G_); + return 2; + } + if(0 === tests_ran[1] && strict[1]){ + caml_call1(Stdlib_Printf[3], _H_); + return 2; + } + return 0; + } + if(0 === count_test_modules) + var _ao_ = cst$11; + else + var + _ap_ = caml_call2(Stdlib[98], _K_, _J_), + _ao_ = caml_call2(Stdlib_Printf[4], _ap_, count_test_modules); + caml_call4(Stdlib_Printf[3], _I_, count, tests_ran[1], _ao_); + return 1; + } + var + use_color$0 = use_color[1], + in_place$0 = in_place[1], + diff_command$0 = diff_command[1], + source_tree_root$0 = source_tree_root[1], + allow_output_patterns$0 = allow_output_patterns[1], + evaluators = [0, [0, summarize, 0]]; + function add_evaluator(f){evaluators[1] = [0, f, evaluators[1]]; return 0;} + function exit(param){ + var _ab_ = caml_call1(Stdlib_List[9], evaluators[1]); + function _ac_(f){return caml_call1(f, 0);} + switch(combine_all(caml_call2(Stdlib_List[19], _ac_, _ab_))){ + case 0: + var _ad_ = 0; break; + case 1: + var _ad_ = 2; break; + default: var _ad_ = 1; + } + return caml_call1(Stdlib[99], _ad_); + } + var + Ppx_inline_test_lib_Runtime = + [0, + [0, combine, combine_all, to_string], + set_lib_and_partition, + unset_lib, + test, + test_unit, + test_module, + testing, + use_color$0, + in_place$0, + diff_command$0, + source_tree_root$0, + allow_output_patterns$0, + am_running_inline_test, + am_running_inline_test_env_var, + add_evaluator, + exit]; + runtime.caml_register_global + (124, Ppx_inline_test_lib_Runtime, cst_Ppx_inline_test_lib_Runtim$0); + return; + } + (globalThis)); + + +//# 1 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 52 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std, cst); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Interfaces = [0]; + runtime.caml_register_global + (4, Fmlib_std_Interfaces, "Fmlib_std__Interfaces"); + return; + } + (globalThis)); + +//# 81 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_12345678901234567890123456 = "12345678901234567890123456789012", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_string_ml$0 = "src/std/string.ml", + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + str = cst_12345678901234567890123456, + cst = "", + Stdlib_Bytes = global_data.Stdlib__Bytes, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_String = global_data.Stdlib__String, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + make = Stdlib_String[1], + init = Stdlib_String[2], + concat = Stdlib_String[6], + compare = Stdlib_String[9], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + _b_ = [0, cst_src_std_string_ml$0, 107, 8], + _a_ = [0, cst_src_std_string_ml$0, 103, 8], + cst_src_std_string_ml = cst_src_std_string_ml$0, + cst_str_From_make_with_size_2_ = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function one(c){return caml_call2(make, 1, c);} + function is_prefix(a, b){ + var + len_a = caml_ml_string_length(a), + _i_ = len_a <= caml_ml_string_length(b) ? 1 : 0, + _j_ = _i_ ? caml_string_equal(a, caml_call3(sub, b, 0, len_a)) : _i_; + return _j_; + } + function is_suffix(a, b){ + var + len_a = caml_ml_string_length(a), + len_b = caml_ml_string_length(b), + _g_ = len_a <= len_b ? 1 : 0, + _h_ = + _g_ + ? caml_string_equal(a, caml_call3(sub, b, len_b - len_a | 0, len_a)) + : _g_; + return _h_; + } + function find(f, start, s){ + var len = caml_ml_string_length(s), i = start; + for(;;){ + if(i !== len && ! caml_call1(f, caml_string_get(s, i))){var i$0 = i + 1 | 0, i = i$0; continue;} + return i; + } + } + function has(f, start, s){ + return find(f, start, s) < caml_ml_string_length(s) ? 1 : 0; + } + function find_bwd(f, beyond, s){ + var len = caml_ml_string_length(s), switch$0 = 0; + if(0 <= beyond && len >= beyond){var beyond$0 = beyond; switch$0 = 1;} + if(! switch$0) var beyond$0 = len; + var i = beyond$0; + for(;;){ + if(0 !== i && ! caml_call1(f, caml_string_get(s, i - 1 | 0))){var i$0 = i - 1 | 0, i = i$0; continue;} + return i - 1 | 0; + } + } + function list(s){ + var i$0 = caml_ml_string_length(s), cs = 0, i = i$0; + for(;;){ + if(0 === i) return cs; + var + j = i - 1 | 0, + cs$0 = [0, caml_string_get(s, j), cs], + cs = cs$0, + i = j; + } + } + function of_list(cs){ + function str(cs, i){ + if(! cs) return caml_create_bytes(i); + var cs$0 = cs[2], c = cs[1], bs = str(cs$0, i + 1 | 0); + caml_bytes_set(bs, i, c); + return bs; + } + var bs = str(cs, 0); + return caml_call1(Stdlib_Bytes[44], bs); + } + function reverse(s){ + var len = caml_ml_string_length(s); + return caml_call2 + (init, + len, + function(i){return caml_string_get(s, (len - 1 | 0) - i | 0);}); + } + function has_more(param){ + var s = param[2], i = param[1]; + return i < caml_ml_string_length(s) ? 1 : 0; + } + function peek(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return caml_string_get(s, i); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function advance(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return [0, i + 1 | 0, s]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function make$0(s){return [0, 0, s];} + var To_source = [0, has_more, peek, advance, make$0]; + function From_source(R){ + function make_with_size(estimate, r){ + var + estimate$0 = 0 < estimate ? estimate : 80, + buffer = [0, caml_create_bytes(estimate$0)], + len = [0, 0], + capacity = [0, estimate$0], + r$0 = r; + for(;;){ + if(! caml_call1(R[1], r$0)) + return caml_call3(Stdlib_Bytes[8], buffer[1], 0, len[1]); + var c = caml_call1(R[2], r$0); + if(len[1] === capacity[1]){ + var bnew = caml_create_bytes(2 * capacity[1] | 0); + caml_call5(Stdlib_Bytes[11], buffer[1], 0, bnew, 0, len[1]); + buffer[1] = bnew; + capacity[1] = 2 * capacity[1] | 0; + } + caml_bytes_set(buffer[1], len[1], c); + len[1] = len[1] + 1 | 0; + var r$1 = caml_call1(R[3], r$0), r$0 = r$1; + } + } + function make(r){return make_with_size(100, r);} + return [0, make_with_size, make]; + } + function _c_(param){ + var + From = From_source([0, To_source[1], To_source[2], To_source[3]]), + _f_ = caml_call1(To_source[4], str); + return caml_string_equal + (cst_12345678901234567890123456, caml_call2(From[1], 2, _f_)); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_str_From_make_with_size_2_, + 0, + cst_src_std_string_ml, + 162, + 0, + 166, + _c_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_String = + [0, + is_prefix, + is_suffix, + reverse, + compare, + one, + find, + has, + find_bwd, + list, + of_list, + caml_ml_string_length, + caml_string_get, + sub, + concat, + split_on_char, + make, + init, + To_source, + function(_d_){var _e_ = From_source(_d_); return [0, _e_[2], _e_[1]];}]; + runtime.caml_register_global(13, Fmlib_std_String, "Fmlib_std__String"); + return; + } + (globalThis)); + +//# 437 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_Int = global_data.Stdlib__Int; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var compare = Stdlib_Int[9], cst_fmlib_std = cst_fmlib_std$0; + function iterate(n, f, start){ + var n$0 = n, v = start; + for(;;){ + if(0 === n$0) return v; + var v$0 = caml_call1(f, v), n$1 = n$0 - 1 | 0, n$0 = n$1, v = v$0; + } + } + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Int = [0, compare, iterate]; + runtime.caml_register_global(5, Fmlib_std_Int, "Fmlib_std__Int"); + return; + } + (globalThis)); + +//# 474 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var cst_fmlib_std = cst_fmlib_std$0; + function return$0(a){return [0, a];} + var fail = 0; + function let$0(m, f){ + if(! m) return 0; + var a = m[1]; + return caml_call1(f, a); + } + function map(f, m){ + return let$0(m, function(a){return [0, caml_call1(f, a)];}); + } + function to_list(m){if(! m) return 0; var a = m[1]; return [0, a, 0];} + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Option = [0, return$0, fail, let$0, let$0, map, to_list]; + runtime.caml_register_global(4, Fmlib_std_Option, "Fmlib_std__Option"); + return; + } + (globalThis)); + +//# 514 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_insert_downward_0_3_SetInt$3 = + "<<((insert_downward 0 3 SetInt.empty) |> (SetIn[...]>>", + cst_insert_upward_0_3_SetInt_e$2 = + "<<((insert_upward 0 3 SetInt.empty) |> (insert_[...]>>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_array_ml$12 = "src/std/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Int = global_data.Fmlib_std__Int, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Stdlib_Array = global_data.Stdlib__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + init = Stdlib_Array[1], + append = Stdlib_Array[3], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + map = Stdlib_Array[13], + fold_left = Stdlib_Array[15], + fold_right = Stdlib_Array[17], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + _Y_ = [0, 0], + _U_ = [0, 2, 0], + _V_ = [0, 1, 0], + _S_ = + [0, [0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0]], + _O_ = [0, 2, 0], + _P_ = [0, 1, 0], + _Q_ = [0, 0, 0], + _K_ = [0, 2, 0], + _L_ = [0, 1, 0], + _M_ = [0, 0, 0], + _H_ = [0, 2, 0], + _I_ = [0, 0, 0], + _D_ = [0, 2, 0], + _E_ = [0, 1, 0], + _F_ = [0, 0, 0], + _z_ = [0, 2, 0], + _A_ = [0, 1, 0], + _B_ = [0, 0, 0], + _x_ = [0, 1, 0], + _v_ = [0, 0, 1], + _t_ = [0, 0, 0], + _r_ = [0, 0, 0], + _p_ = [0, cst_src_std_array_ml$12, 332, 8], + _o_ = [0, cst_src_std_array_ml$12, 333, 8], + _n_ = [0, cst_src_std_array_ml$12, 235, 8], + _m_ = [0, cst_src_std_array_ml$12, 161, 16], + _l_ = [0, cst_src_std_array_ml$12, 162, 16], + _k_ = [0, cst_src_std_array_ml$12, 101, 4], + _j_ = [0, cst_src_std_array_ml$12, 94, 4], + _i_ = [0, cst_src_std_array_ml$12, 79, 4], + _h_ = [0, cst_src_std_array_ml$12, 80, 4], + _g_ = [0, cst_src_std_array_ml$12, 85, 4], + _f_ = [0, cst_src_std_array_ml$12, 67, 4], + _e_ = [0, cst_src_std_array_ml$12, 68, 4], + _d_ = [0, cst_src_std_array_ml$12, 54, 4], + _c_ = [0, cst_src_std_array_ml$12, 55, 4], + _b_ = [0, cst_src_std_array_ml$12, 25, 4], + _a_ = [0, cst_src_std_array_ml$12, 19, 4], + cst_src_std_array_ml = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_ = + "<<(binsearch Int.compare Fun.id 100 [||]) = (0,[...]>>", + cst_src_std_array_ml$0 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$0 = + "<<(binsearch Int.compare Fun.id 99 [|100|]) = ([...]>>", + cst_src_std_array_ml$1 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$1 = + "<<(binsearch Int.compare Fun.id 100 [|100|]) = [...]>>", + cst_src_std_array_ml$2 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$2 = + "<<(binsearch Int.compare Fun.id 101 [|100|]) = [...]>>", + cst_src_std_array_ml$3 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e = + "<<(insert_upward 0 3 SetInt.empty) = [|(0, ());[...]>>", + cst_src_std_array_ml$4 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt = + "<<(insert_downward 0 3 SetInt.empty) = [|(0, ()[...]>>", + cst_src_std_array_ml$5 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$0 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$6 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$1 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$7 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$0 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$8 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$1 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$9 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$2 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$10 = cst_src_std_array_ml$12, + cst_SetInt_index_of_3_set_None = "<<(SetInt.index_of 3 set) = None>>", + cst_src_std_array_ml$11 = cst_src_std_array_ml$12, + cst_SetInt_index_of_0_set_Some = "<<(SetInt.index_of 0 set) = (Some 0)>>", + cst_fmlib_std = cst_fmlib_std$0; + function is_empty(xs){return 0 === xs.length - 1 ? 1 : 0;} + function valid_index(i, xs){ + var _aX_ = 0 <= i ? 1 : 0, _aY_ = _aX_ ? i < xs.length - 1 ? 1 : 0 : _aX_; + return _aY_; + } + function has_some(xs){return 0 < xs.length - 1 ? 1 : 0;} + function first(xs){ + if(has_some(xs)) return caml_check_bound(xs, 0)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function last(xs){ + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var _aW_ = len - 1 | 0; + return caml_check_bound(xs, _aW_)[1 + _aW_]; + } + function foldi_left(f, start, xs){ + var _aV_ = [0, start, 0]; + return caml_call3 + (fold_left, + function(param, e){ + var idx = param[2], start = param[1]; + return [0, caml_call3(f, start, idx, e), idx + 1 | 0]; + }, + _aV_, + xs) + [1]; + } + function push(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 0, len); + return xs_new; + } + function push_front(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 1, len); + return xs_new; + } + function insert(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i > xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var len = xs.length - 1, arr = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i, arr, i + 1 | 0, len - i | 0); + return arr; + } + function replace(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var arr = caml_call1(copy, xs); + caml_check_bound(arr, i)[1 + i] = x; + return arr; + } + function remove(i, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var arr = caml_make_vect(len - 1 | 0, caml_check_bound(xs, 0)[1]); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i + 1 | 0, arr, i, len - (i + 1 | 0) | 0); + return arr; + } + function remove_first(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 1, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + function remove_last(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 0, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function find(p, arr){ + var len = arr.length - 1, i = 0; + for(;;){ + if(i === len) return 0; + if(caml_call1(p, caml_check_bound(arr, i)[1 + i])) return [0, i]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function binsearch(compare, key_of, key, arr){ + var len = arr.length - 1; + if(0 === len) return [0, len, 0]; + if(1 === len){ + var + cmp = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])); + return 0 < cmp ? [0, len, 0] : [0, 0, 0 === cmp ? 1 : 0]; + } + var + upper$0 = len - 1 | 0, + cmp$1 = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])), + lower$1 = 0; + if(0 >= cmp$1) return [0, lower$1, 0 === cmp$1 ? 1 : 0]; + var + cmp$2 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, upper$0)[1 + upper$0])); + if(0 <= cmp$2) return 0 === cmp$2 ? [0, upper$0, 1] : [0, len, 0]; + var lower = lower$1, upper = upper$0; + for(;;){ + if((lower + 1 | 0) === upper) return [0, upper, 0]; + var lower$0 = lower + ((upper - lower | 0) / 2 | 0) | 0; + if(lower >= lower$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(lower$0 >= upper) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + cmp$0 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, lower$0)[1 + lower$0])); + if(0 === cmp$0) return [0, lower$0, 1]; + if(0 <= cmp$0){var lower = lower$0; continue;} + var upper = lower$0; + } + } + function Map(Key){ + function cardinal(map){return map.length - 1;} + function is_empty(map){return 0 === map.length - 1 ? 1 : 0;} + function bindings(map){return caml_call1(to_list, map);} + function fold_left(f, start, map){ + function _aU_(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + } + return caml_call3(Stdlib_Array[15], _aU_, start, map); + } + function fold_right(f, start, map){ + function _aT_(param, result){ + var value = param[2], key = param[1]; + return caml_call3(f, result, key, value); + } + return caml_call3(Stdlib_Array[17], _aT_, map, start); + } + function index_of(key, map){ + var len = map.length - 1; + function _aR_(_aS_){return _aS_[1];} + var + match = binsearch(Key[1], _aR_, key, map), + exact = match[2], + i = match[1]; + if(i !== len && exact) return [0, i]; + return 0; + } + function pair(i, map){ + if(i < map.length - 1) return caml_check_bound(map, i)[1 + i]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + function find_opt(key, map){ + var _aP_ = index_of(key, map); + function _aQ_(i){return caml_check_bound(map, i)[1 + i][2];} + return caml_call2(Fmlib_std_Option[5], _aQ_, _aP_); + } + function mem(key, map){return 0 !== index_of(key, map) ? 1 : 0;} + var empty = [0]; + function singleton(key, value){return [0, [0, key, value]];} + function add(key, value, map){ + function _aN_(_aO_){return _aO_[1];} + var + match = binsearch(Key[1], _aN_, key, map), + exact = match[2], + i = match[1]; + return exact + ? replace(i, [0, key, value], map) + : insert(i, [0, key, value], map); + } + function update(key, f, map){ + function _aL_(_aM_){return _aM_[1];} + var + match = binsearch(Key[1], _aL_, key, map), + exact = match[2], + i = match[1]; + if(exact){ + var match$0 = caml_call1(f, [0, caml_check_bound(map, i)[1 + i][2]]); + if(! match$0) return remove(i, map); + var value = match$0[1]; + return replace(i, [0, key, value], map); + } + var match$1 = caml_call1(f, 0); + if(! match$1) return map; + var value$0 = match$1[1]; + return insert(i, [0, key, value$0], map); + } + function remove$0(key, map){ + function _aJ_(_aK_){return _aK_[1];} + var + match = binsearch(Key[1], _aJ_, key, map), + exact = match[2], + i = match[1]; + return exact ? remove(i, map) : map; + } + return [0, + cardinal, + is_empty, + bindings, + fold_left, + fold_right, + index_of, + pair, + find_opt, + mem, + empty, + singleton, + add, + update, + remove$0]; + } + function Set(Key){ + var M = Map(Key); + function cardinal(set){return caml_call1(M[1], set);} + var is_empty = M[2]; + function fold_left(f, start, set){ + function _aI_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[4], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[5], _aH_, start, set); + } + function elements(set){ + var _aG_ = 0; + return fold_right(function(lst, key){return [0, key, lst];}, _aG_, set); + } + function element(i, set){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + if(i < cardinal(set)) return caml_call2(M[7], i, set)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + } + var index_of = M[6], empty = M[10]; + function singleton(e){return caml_call2(M[11], e, 0);} + var mem = M[9]; + function add(e, set){return caml_call3(M[12], e, 0, set);} + var remove = M[14]; + return [0, + M, + cardinal, + is_empty, + fold_left, + fold_right, + elements, + element, + index_of, + empty, + singleton, + mem, + add, + remove]; + } + function _q_(param){ + var _aC_ = [0], _aD_ = 100; + function _aE_(_aF_){return _aF_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aE_, _aD_, _aC_), _r_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_, + 0, + cst_src_std_array_ml, + 372, + 0, + 67, + _q_); + function _s_(param){ + var _ay_ = [0, 100], _az_ = 99; + function _aA_(_aB_){return _aB_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aA_, _az_, _ay_), _t_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$0, + 0, + cst_src_std_array_ml$0, + 377, + 0, + 69, + _s_); + function _u_(param){ + var _au_ = [0, 100], _av_ = 100; + function _aw_(_ax_){return _ax_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aw_, _av_, _au_), _v_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$1, + 0, + cst_src_std_array_ml$1, + 382, + 0, + 69, + _u_); + function _w_(param){ + var _aq_ = [0, 100], _ar_ = 101; + function _as_(_at_){return _at_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _as_, _ar_, _aq_), _x_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$2, + 0, + cst_src_std_array_ml$2, + 387, + 0, + 70, + _w_); + var SetInt = Set([0, Fmlib_std_Int[1]]); + function insert_downward(lower, beyond, set){ + var i = beyond, set$0 = set; + for(;;){ + if(i === lower) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(SetInt[12], i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function insert_upward(lower, beyond, set){ + var i = lower, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(SetInt[12], i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function _y_(param){ + return caml_equal(insert_upward(0, 3, SetInt[9]), [0, _B_, _A_, _z_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e, + 0, + cst_src_std_array_ml$3, + 418, + 0, + 70, + _y_); + function _C_(param){ + return caml_equal(insert_downward(0, 3, SetInt[9]), [0, _F_, _E_, _D_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt, + 0, + cst_src_std_array_ml$4, + 422, + 0, + 72, + _C_); + function _G_(param){ + var _ap_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 1), _ap_), [0, _I_, _H_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$0, + 0, + cst_src_std_array_ml$5, + 426, + 0, + 85, + _G_); + function _J_(param){ + var _ao_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 4), _ao_), [0, _M_, _L_, _K_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$1, + 0, + cst_src_std_array_ml$6, + 430, + 0, + 92, + _J_); + function _N_(param){ + return caml_equal + (insert_downward(0, 3, insert_upward(0, 3, SetInt[9])), + [0, _Q_, _P_, _O_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$0, + 0, + cst_src_std_array_ml$7, + 434, + 0, + 103, + _N_); + function _R_(param){ + var _an_ = _S_.slice(); + return caml_equal + (insert_downward(3, 6, insert_upward(0, 3, SetInt[9])), _an_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$1, + 0, + cst_src_std_array_ml$8, + 440, + 0, + 121, + _R_); + function _T_(param){ + var _am_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 0), _am_), [0, _V_, _U_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$2, + 0, + cst_src_std_array_ml$9, + 446, + 0, + 95, + _T_); + function _W_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return 0 === caml_call2(SetInt[8], 3, set) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_3_set_None, + 0, + cst_src_std_array_ml$10, + 452, + 0, + 95, + _W_); + function _X_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return caml_equal(caml_call2(SetInt[8], 0, set), _Y_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_0_set_Some, + 0, + cst_src_std_array_ml$11, + 457, + 0, + 97, + _X_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _Z_(_ak_){ + var _al_ = Map(_ak_); + return [0, + _al_[2], + _al_[1], + _al_[4], + _al_[5], + _al_[3], + _al_[8], + _al_[10], + _al_[12], + _al_[14], + _al_[13], + _al_[7], + _al_[11]]; + } + function ___(_ai_){ + var _aj_ = Set(_ai_); + return [0, + _aj_[3], + _aj_[2], + _aj_[11], + _aj_[4], + _aj_[5], + _aj_[6], + _aj_[9], + _aj_[12], + _aj_[13], + _aj_[7], + _aj_[8], + _aj_[10]]; + } + var _$_ = caml_make_vect; + function _aa_(_ah_, _ag_, _af_){ + caml_check_bound(_ah_, _ag_)[1 + _ag_] = _af_; + return 0; + } + function _ab_(_ae_, _ad_){return caml_check_bound(_ae_, _ad_)[1 + _ad_];} + var + Fmlib_std_Array = + [0, + function(_ac_){return _ac_.length - 1;}, + valid_index, + is_empty, + has_some, + _ab_, + first, + last, + _aa_, + _$_, + init, + append, + insert, + replace, + remove, + remove_first, + remove_last, + map, + fold_left, + foldi_left, + fold_right, + copy, + sub, + blit, + find, + for_all, + exists, + push, + push_front, + to_list, + of_list, + binsearch, + ___, + _Z_]; + runtime.caml_register_global(73, Fmlib_std_Array, "Fmlib_std__Array"); + return; + } + (globalThis)); + +//# 1709 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_list_ml$2 = "src/std/list.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_List = global_data.Stdlib__List, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + length = Stdlib_List[1], + rev = Stdlib_List[9], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + filter = Stdlib_List[41], + split = Stdlib_List[54], + _o_ = + [0, + [0, 1, [0, 4, 0]], + [0, [0, 2, [0, 5, 0]], [0, [0, 3, [0, 6, 0]], 0]]], + _p_ = [0, [0, 1, [0, 2, [0, 3, 0]]], [0, [0, 4, [0, 5, [0, 6, 0]]], 0]], + _l_ = [0, [0, 1, 0], [0, [0, 2, 0], [0, [0, 3, 0], 0]]], + _m_ = [0, [0, 1, [0, 2, [0, 3, 0]]], 0], + _i_ = [0, [0, 1, 0], 0], + _j_ = [0, [0, 1, 0], 0], + _g_ = [0, cst_src_std_list_ml$2, 97, 12], + _f_ = [0, cst_src_std_list_ml$2, 86, 20], + _e_ = [0, 0, 0], + _d_ = [0, cst_src_std_list_ml$2, 79, 4], + _b_ = [0, cst_src_std_list_ml$2, 37, 4], + _c_ = [0, cst_src_std_list_ml$2, 40, 8], + cst_src_std_list_ml = cst_src_std_list_ml$2, + cst_transpose_1_1 = "<<(transpose [[1]]) = [[1]]>>", + cst_src_std_list_ml$0 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_1_2_3 = + "<<(transpose [[1; 2; 3]]) = [[1]; [2]; [3]]>>", + cst_src_std_list_ml$1 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_4_5_6_1_4 = + "<<(transpose [[1; 2; 3]; [4; 5; 6]]) = [[1; 4];[...]>>", + cst_fmlib_std = cst_fmlib_std$0, + _a_ = Stdlib_List[38]; + function return$0(a){return [0, a, 0];} + function symbol_bind(l, f){ + if(! l) return 0; + var + tl = l[2], + hd = l[1], + _x_ = symbol_bind(tl, f), + _y_ = caml_call1(f, hd); + return caml_call2(Stdlib[37], _y_, _x_); + } + function symbol(f, g, a){return symbol_bind(caml_call1(f, a), g);} + function symbol$0(flst, lst){ + return symbol_bind(flst, function(f){return caml_call2(map, f, lst);}); + } + function find(p, l){ + try{var _v_ = [0, caml_call2(_a_, p, l)]; return _v_;} + catch(_w_){ + var _u_ = caml_wrap_exception(_w_); + if(_u_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_u_, 0); + } + } + function split_head_tail(lst){ + if(0 === lst) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(! lst) throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var tl = lst[2], hd = lst[1]; + return [0, hd, tl]; + } + function map_and_filter(f, l){ + function map(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var tl = param$0[2], hd = param$0[1], match = caml_call1(f, hd); + if(match){var b = match[1]; return [0, b, map(tl)];} + var param$0 = tl; + } + } + return map(l); + } + function split_at(p, rest){ + var prefix = 0, rest$0 = rest; + for(;;){ + if(! rest$0) return [0, caml_call1(rev, prefix), rest$0]; + var rest$1 = rest$0[2], hd = rest$0[1]; + if(caml_call1(p, hd)) return [0, caml_call1(rev, prefix), rest$0]; + var prefix$0 = [0, hd, prefix], prefix = prefix$0, rest$0 = rest$1; + } + } + function transpose(row_list){ + if(0 === row_list) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var columns = 0, row_list$0 = row_list; + for(;;){ + if(! row_list$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + if(! row_list$0[1]) return caml_call1(rev, columns); + var + match = + caml_call3 + (fold_right, + function(row, param){ + var row_list = param[2], column = param[1]; + if(! row) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var rest_row = row[2], el = row[1]; + return [0, [0, el, column], [0, rest_row, row_list]]; + }, + row_list$0, + _e_), + row_list$1 = match[2], + column = match[1], + columns$0 = [0, column, columns], + columns = columns$0, + row_list$0 = row_list$1; + } + } + function _h_(param){return caml_equal(transpose(_j_), _i_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_1, + 0, + cst_src_std_list_ml, + 137, + 0, + 44, + _h_); + function _k_(param){return caml_equal(transpose(_m_), _l_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_1_2_3, + 0, + cst_src_std_list_ml$0, + 141, + 0, + 66, + _k_); + function _n_(param){return caml_equal(transpose(_p_), _o_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_4_5_6_1_4, + 0, + cst_src_std_list_ml$1, + 145, + 0, + 81, + _n_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_List = + [0, + return$0, + symbol_bind, + symbol_bind, + symbol, + symbol$0, + concat, + find, + append, + concat, + split, + rev, + rev_append, + length, + filter, + fold_left, + fold_right, + map, + mapi, + rev_map, + for_all, + exists, + split_head_tail, + map_and_filter, + split_at, + transpose, + function(M){ + function foldi_left(f, l, start){ + function foldi(i, l, start){ + if(! l) return caml_call1(M[1], start); + var tl = l[2], hd = l[1], _q_ = i + 1 | 0; + function _r_(_t_){return foldi(_q_, tl, _t_);} + var _s_ = caml_call3(f, i, hd, start); + return caml_call2(M[2], _s_, _r_); + } + return foldi(0, l, start); + } + function fold_left(f, l, start){ + return foldi_left(function(param){return f;}, l, start); + } + function fold_right(f, l, start){ + return fold_left(f, caml_call1(rev, l), start); + } + return [0, fold_left, fold_right, foldi_left]; + }]; + runtime.caml_register_global(26, Fmlib_std_List, "Fmlib_std__List"); + return; + } + (globalThis)); + +//# 2148 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set3_check_range_100_200_s$2 = "<>", + cst_Set4_check_range_100_200_s$2 = "<>", + cst_let_open_Map3_in_let_map_a$3 = + "<>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_btree_ml$15 = "src/std/btree.ml", + caml_equal = runtime.caml_equal, + caml_list_of_js_array = runtime.caml_list_of_js_array, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Option = global_data.Fmlib_std__Option, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Int = global_data.Fmlib_std__Int; + global_data.Stdlib; + var Fmlib_std_List = global_data.Fmlib_std__List; + global_data.Fmlib_std__String; + global_data.Stdlib__Unit; + var + Fmlib_std_Array = global_data.Fmlib_std__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + O32 = [0, 32], + _aa_ = + caml_list_of_js_array + ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]), + _U_ = [0, cst_src_std_btree_ml$15, 1130, 8], + _K_ = [0, cst_src_std_btree_ml$15, 990, 8], + _J_ = [0, cst_src_std_btree_ml$15, 980, 8], + _v_ = [0, cst_src_std_btree_ml$15, 381, 16], + _D_ = [0, cst_src_std_btree_ml$15, 604, 12], + _E_ = [0, cst_src_std_btree_ml$15, 616, 12], + _H_ = [0, cst_src_std_btree_ml$15, 825, 8], + _G_ = [0, cst_src_std_btree_ml$15, 833, 12], + _F_ = [0, cst_src_std_btree_ml$15, 787, 8], + _C_ = [0, cst_src_std_btree_ml$15, 572, 12], + _B_ = [0, cst_src_std_btree_ml$15, 503, 8], + _A_ = [0, cst_src_std_btree_ml$15, 485, 8], + _z_ = [0, cst_src_std_btree_ml$15, 466, 8], + _y_ = [0, cst_src_std_btree_ml$15, 436, 8], + _x_ = [0, cst_src_std_btree_ml$15, 423, 8], + _w_ = [0, cst_src_std_btree_ml$15, 424, 8], + _o_ = [0, cst_src_std_btree_ml$15, 293, 12], + _q_ = [0, cst_src_std_btree_ml$15, 310, 20], + _p_ = [0, cst_src_std_btree_ml$15, 311, 20], + _r_ = [0, cst_src_std_btree_ml$15, 324, 20], + _s_ = [0, cst_src_std_btree_ml$15, 334, 20], + _t_ = [0, cst_src_std_btree_ml$15, 348, 20], + _u_ = [0, cst_src_std_btree_ml$15, 359, 20], + _n_ = [0, cst_src_std_btree_ml$15, 223, 8], + _m_ = [0, cst_src_std_btree_ml$15, 205, 8], + _l_ = [0, cst_src_std_btree_ml$15, 206, 8], + _k_ = [0, cst_src_std_btree_ml$15, 207, 8], + _j_ = [0, cst_src_std_btree_ml$15, 208, 8], + _i_ = [0, cst_src_std_btree_ml$15, 193, 8], + _h_ = [0, cst_src_std_btree_ml$15, 194, 8], + _g_ = [0, cst_src_std_btree_ml$15, 195, 8], + _e_ = [0, cst_src_std_btree_ml$15, 109, 20], + _d_ = [0, cst_src_std_btree_ml$15, 114, 24], + _c_ = [0, cst_src_std_btree_ml$15, 115, 24], + _f_ = [0, cst_src_std_btree_ml$15, 107, 16], + _a_ = [0, cst_src_std_btree_ml$15, 81, 20], + _b_ = [0, cst_src_std_btree_ml$15, 79, 16], + _I_ = [0, cst_src_std_btree_ml$15, 20, 8], + cst_src_std_btree_ml = cst_src_std_btree_ml$15, + cst_let_open_Map_in_cardinal_e = + "<<(let open Map in cardinal empty) = 0>>", + cst_src_std_btree_ml$0 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$1 = cst_src_std_btree_ml$15, + cst_Set4_check_range_0_100_set = "<>", + cst_src_std_btree_ml$2 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$3 = cst_src_std_btree_ml$15, + cst_Set3_check_range_0_100_set = "<>", + cst_src_std_btree_ml$4 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$0 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$5 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$1 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$6 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$0 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$7 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$1 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$8 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a = + "<>", + cst_src_std_btree_ml$9 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$0 = + "<>", + cst_src_std_btree_ml$10 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_u = + "<>", + cst_src_std_btree_ml$11 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$1 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$12 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$2 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$13 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_f_i_i = + "<>", + cst_src_std_btree_ml$14 = cst_src_std_btree_ml$15, + cst_let_open_Set3_in_let_modul = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function Map0(_aJ_, Key){ + var order = _aJ_[1]; + if(3 > order) + throw caml_maybe_attach_backtrace([0, Assert_failure, _I_], 1); + var + odd_order = ((order / 2 | 0) * 2 | 0) < order ? 1 : 0, + max_keys = order - 1 | 0, + min_keys = odd_order ? (order - 1 | 0) / 2 | 0 : (order / 2 | 0) - 1 | 0; + function is_empty(map){ + if(0 !== map[0]) return 0; + var keys = map[1]; + return 0 === caml_call1(Fmlib_std_Array[1], keys) ? 1 : 0; + } + function cardinal(map){ + if(0 === map[0]){ + var keys = map[1]; + return caml_call1(Fmlib_std_Array[1], keys); + } + var + children = map[2], + keys$0 = map[1], + _bi_ = caml_call1(Fmlib_std_Array[1], keys$0); + function _bj_(n, child){return n + cardinal(child) | 0;} + return caml_call3(Fmlib_std_Array[18], _bj_, _bi_, children); + } + var empty = [0, [0]]; + function fold_left(f, start, map){ + function fold(accu, map){ + var accu$0 = accu, map$0 = map; + a: + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + _bf_ = + function(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[18], _bf_, accu$0, pairs); + } + var + children = map$0[2], + pairs$0 = map$0[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var accu$1 = accu$0, i = 0; + for(;;){ + if(i >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(i === n){ + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i), + accu$0 = accu$1, + map$0 = map$1; + continue a; + } + var + i$0 = i + 1 | 0, + _bg_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[2], + _bh_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[1], + accu$2 = + caml_call3 + (f, + fold(accu$1, caml_call2(Fmlib_std_Array[5], children, i)), + _bh_, + _bg_), + accu$1 = accu$2, + i = i$0; + } + } + } + return fold(start, map); + } + function fold_right(f, start, map){ + function fold(accu, map){ + if(0 === map[0]){ + var + pairs = map[1], + _bc_ = + function(param, a){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[20], _bc_, pairs, accu); + } + var + children = map[2], + pairs$0 = map[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + accu$2 = fold(accu, caml_call2(Fmlib_std_Array[5], children, n)), + accu$0 = accu$2, + i = n; + for(;;){ + if(0 > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + if(0 === i) return accu$0; + var i$0 = i - 1 | 0; + if(0 > i$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i$0 >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + _bd_ = caml_call2(Fmlib_std_Array[5], children, i$0), + _be_ = caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2], + accu$1 = + fold + (caml_call3 + (f, + accu$0, + caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[1], + _be_), + _bd_), + accu$0 = accu$1, + i = i$0; + } + } + return fold(start, map); + } + function bindings(map){ + var _bb_ = 0; + return fold_right + (function(lst, key, value){return [0, [0, key, value], lst];}, + _bb_, + map); + } + function keys(map){ + var _ba_ = 0; + return fold_right + (function(lst, key, param){return [0, key, lst];}, _ba_, map); + } + function bsearch(key, arr){ + function _a__(_a$_){return _a$_[1];} + return caml_call4(Fmlib_std_Array[31], Key[1], _a__, key, arr); + } + function find_opt(key, map){ + var map$0 = map; + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + return exact ? [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]] : 0; + } + var + children = map$0[2], + pairs$0 = map$0[1], + match$0 = bsearch(key, pairs$0), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0) return [0, caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2]]; + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i$0), + map$0 = map$1; + } + } + function subarray(arr, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + if(beyond <= caml_call1(Fmlib_std_Array[1], arr)) + return caml_call3(Fmlib_std_Array[22], arr, start, beyond - start | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function insert_subarray(arr, i, x, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(start > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + if(i > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + if(beyond > caml_call1(Fmlib_std_Array[1], arr)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + var + arr2 = caml_call2(Fmlib_std_Array[9], (beyond - start | 0) + 1 | 0, x); + caml_call5(Fmlib_std_Array[23], arr, start, arr2, 0, i - start | 0); + caml_call5 + (Fmlib_std_Array[23], + arr, + i, + arr2, + (i - start | 0) + 1 | 0, + beyond - i | 0); + return arr2; + } + function split_subarray(arr, i, x, y, start, beyond){ + if(i >= beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + var arr$0 = insert_subarray(arr, i, x, start, beyond); + caml_call3(Fmlib_std_Array[8], arr$0, (i - start | 0) + 1 | 0, y); + return arr$0; + } + function add_in_leaf(key, value, pairs){ + var + len = caml_call1(Fmlib_std_Array[1], pairs), + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(exact) + return [0, + [0, caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]; + if(len < max_keys) + return [0, + [0, caml_call3(Fmlib_std_Array[12], i, [0, key, value], pairs)]]; + var _a7_ = [0, key, value]; + function insert_subarray$0(_a8_, _a9_){ + return insert_subarray(pairs, i, _a7_, _a8_, _a9_); + } + var k = order / 2 | 0; + if(odd_order){ + if(i === k){ + var left = subarray(pairs, 0, k), right = subarray(pairs, k, len); + return [1, [0, left], [0, key, value], [0, right]]; + } + if(i < k){ + var + left$0 = insert_subarray$0(0, k - 1 | 0), + right$0 = subarray(pairs, k, len); + return [1, + [0, left$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$0]]; + } + var + left$1 = subarray(pairs, 0, k), + right$1 = insert_subarray$0(k + 1 | 0, len); + return [1, + [0, left$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [0, right$1]]; + } + if(i < k){ + var + left$2 = insert_subarray$0(0, k - 1 | 0), + right$2 = subarray(pairs, k, len); + return [1, + [0, left$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$2]]; + } + var + left$3 = subarray(pairs, 0, k - 1 | 0), + right$3 = insert_subarray$0(k, len); + return [1, + [0, left$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$3]]; + } + function add_in_node(i, left, pair, right, pairs, children){ + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(len < max_keys){ + var + pairs$0 = caml_call3(Fmlib_std_Array[12], i, pair, pairs), + children$0 = caml_call3(Fmlib_std_Array[12], i, left, children); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return [0, [1, pairs$0, children$0]]; + } + var k = order / 2 | 0; + function insert_subarray$0(_a5_, _a6_){ + return insert_subarray(pairs, i, pair, _a5_, _a6_); + } + function split_subarray$0(start, beyond){ + return split_subarray(children, i, left, right, start, beyond); + } + if(odd_order){ + if(i === k){ + var + left_pairs = subarray(pairs, 0, k), + left_children = subarray(children, 0, k + 1 | 0), + right_pairs = subarray(pairs, k, len), + right_children = subarray(children, k, len + 1 | 0); + if(! caml_call2(Fmlib_std_Array[2], k, left_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + if(! caml_call2(Fmlib_std_Array[2], 0, right_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + caml_call3(Fmlib_std_Array[8], left_children, k, left); + caml_call3(Fmlib_std_Array[8], right_children, 0, right); + return [1, + [1, left_pairs, left_children], + pair, + [1, right_pairs, right_children]]; + } + if(i < k){ + var + left_pairs$0 = insert_subarray$0(0, k - 1 | 0), + left_children$0 = split_subarray$0(0, k), + right_pairs$0 = subarray(pairs, k, len), + right_children$0 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$0, left_children$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$0, right_children$0]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var + left_pairs$1 = subarray(pairs, 0, k), + left_children$1 = subarray(children, 0, k + 1 | 0), + right_pairs$1 = insert_subarray$0(k + 1 | 0, len), + right_children$1 = split_subarray$0(k + 1 | 0, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k, pairs)) + return [1, + [1, left_pairs$1, left_children$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [1, right_pairs$1, right_children$1]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + } + if(i < k){ + var + left_pairs$2 = insert_subarray$0(0, k - 1 | 0), + left_children$2 = split_subarray$0(0, k), + right_pairs$2 = subarray(pairs, k, len), + right_children$2 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$2, left_children$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$2, right_children$2]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + } + var + left_pairs$3 = subarray(pairs, 0, k - 1 | 0), + left_children$3 = subarray(children, 0, k), + right_pairs$3 = insert_subarray$0(k, len), + right_children$3 = split_subarray$0(k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$3, left_children$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$3, right_children$3]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + } + function add_aux(key, value, map){ + if(0 === map[0]){ + var pairs = map[1]; + return add_in_leaf(key, value, pairs); + } + var + children = map[2], + pairs$0 = map[1], + match = bsearch(key, pairs$0), + exact = match[2], + i = match[1]; + if(exact){ + var + pairs$1 = caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs$0); + return [0, [1, pairs$1, children]]; + } + if(! caml_call2(Fmlib_std_Array[2], i, children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var + match$0 = + add_aux(key, value, caml_call2(Fmlib_std_Array[5], children, i)); + if(0 === match$0[0]){ + var + child = match$0[1], + children$0 = caml_call3(Fmlib_std_Array[13], i, child, children); + return [0, [1, pairs$0, children$0]]; + } + var v = match$0[3], y = match$0[2], u = match$0[1]; + return add_in_node(i, u, y, v, pairs$0, children); + } + function add(key, value, map){ + var match = add_aux(key, value, map); + if(0 === match[0]){var map$0 = match[1]; return map$0;} + var right = match[3], pair = match[2], left = match[1]; + return [1, [0, pair], [0, left, right]]; + } + function not_minimal(pairs){ + return min_keys < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + function replace2(i, left, right, children){ + var children$0 = caml_call1(Fmlib_std_Array[21], children); + if(! caml_call2(Fmlib_std_Array[2], i, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _x_], 1); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i, left); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return children$0; + } + function rotate_keys(to_left, i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _y_], 1); + if(to_left){ + var + _aX_ = caml_call1(Fmlib_std_Array[15], right), + _aY_ = caml_call1(Fmlib_std_Array[6], right), + _aZ_ = caml_call3(Fmlib_std_Array[13], i, _aY_, parent), + _a0_ = caml_call2(Fmlib_std_Array[5], parent, i); + return [0, caml_call2(Fmlib_std_Array[27], _a0_, left), _aZ_, _aX_]; + } + var + _a1_ = caml_call2(Fmlib_std_Array[5], parent, i), + _a2_ = caml_call2(Fmlib_std_Array[28], _a1_, right), + _a3_ = caml_call1(Fmlib_std_Array[7], left), + _a4_ = caml_call3(Fmlib_std_Array[13], i, _a3_, parent); + return [0, caml_call1(Fmlib_std_Array[16], left), _a4_, _a2_]; + } + function rotate_children(to_left, left, right){ + if(to_left){ + var + _aT_ = caml_call1(Fmlib_std_Array[15], right), + _aU_ = caml_call1(Fmlib_std_Array[6], right); + return [0, caml_call2(Fmlib_std_Array[27], _aU_, left), _aT_]; + } + var + _aV_ = caml_call1(Fmlib_std_Array[7], left), + _aW_ = caml_call2(Fmlib_std_Array[28], _aV_, right); + return [0, caml_call1(Fmlib_std_Array[16], left), _aW_]; + } + function merge_keys(i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + var + len_left = caml_call1(Fmlib_std_Array[1], left), + len_right = caml_call1(Fmlib_std_Array[1], right), + _aS_ = caml_call2(Fmlib_std_Array[5], parent, i), + merged = + caml_call2 + (Fmlib_std_Array[9], (len_left + 1 | 0) + len_right | 0, _aS_), + parent$0 = caml_call2(Fmlib_std_Array[14], i, parent); + caml_call5(Fmlib_std_Array[23], left, 0, merged, 0, len_left); + caml_call5 + (Fmlib_std_Array[23], right, 0, merged, len_left + 1 | 0, len_right); + return [0, merged, parent$0]; + } + function merge_leaves(i, pair, pairs1, pairs2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + merged = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + caml_call3(Fmlib_std_Array[8], children$0, i, [0, merged]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function merge_nodes + (i, pair, pairs1, children1, pairs2, children2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + pairs_new = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0, + children_new = caml_call2(Fmlib_std_Array[11], children1, children2); + caml_call3 + (Fmlib_std_Array[8], children$0, i, [1, pairs_new, children_new]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function handle_underflow + (i, underflow_left, left_child, right_child, pair, pairs, children){ + function not_minimal$0(pairs1, pairs2){ + return underflow_left ? not_minimal(pairs2) : not_minimal(pairs1); + } + if(0 === left_child[0]){ + var pairs1 = left_child[1]; + if(0 === right_child[0]){ + var pairs2 = right_child[1]; + if(! not_minimal$0(pairs1, pairs2)) + return merge_leaves(i, pair, pairs1, pairs2, pairs, children); + var + match = rotate_keys(underflow_left, i, pairs1, pairs, pairs2), + pairs2$0 = match[3], + pairs$0 = match[2], + pairs1$0 = match[1], + children$0 = replace2(i, [0, pairs1$0], [0, pairs2$0], children); + return [0, [1, pairs$0, children$0], pair, 0]; + } + } + else{ + var children1 = left_child[2], pairs1$1 = left_child[1]; + if(0 !== right_child[0]){ + var pairs2$1 = right_child[1], children2 = right_child[2]; + if(not_minimal$0(pairs1$1, pairs2$1)){ + var + match$0 = rotate_keys(underflow_left, i, pairs1$1, pairs, pairs2$1), + pairs2$2 = match$0[3], + pairs$1 = match$0[2], + pairs1$2 = match$0[1], + match$1 = rotate_children(underflow_left, children1, children2), + children2$0 = match$1[2], + children1$0 = match$1[1], + children$1 = + replace2 + (i, + [1, pairs1$2, children1$0], + [1, pairs2$2, children2$0], + children); + return [0, [1, pairs$1, children$1], pair, 0]; + } + var children2$1 = right_child[2]; + return merge_nodes + (i, + pair, + pairs1$1, + children1, + pairs2$1, + children2$1, + pairs, + children); + } + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _C_], 1); + } + function handle_delete(i, pair, d, pairs, children){ + if(! d[3]) + return [0, + [1, pairs, caml_call3(Fmlib_std_Array[13], i, d[1], children)], + pair, + 0]; + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(i < len){ + var _aQ_ = caml_call2(Fmlib_std_Array[5], children, i + 1 | 0); + return handle_underflow(i, 1, d[1], _aQ_, pair, pairs, children); + } + var i$0 = i - 1 | 0, _aR_ = d[1]; + return handle_underflow + (i$0, + 0, + caml_call2(Fmlib_std_Array[5], children, i$0), + _aR_, + pair, + pairs, + children); + } + function remove_last(map){ + if(0 === map[0]){ + var pairs = map[1], len = caml_call1(Fmlib_std_Array[1], pairs); + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + var + pair = caml_call1(Fmlib_std_Array[7], pairs), + pairs$0 = caml_call1(Fmlib_std_Array[16], pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, pairs$0], pair, underflow]; + } + var + children = map[2], + pairs$1 = map[1], + len$0 = caml_call1(Fmlib_std_Array[1], pairs$1); + if((len$0 + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var d = remove_last(caml_call2(Fmlib_std_Array[5], children, len$0)); + return handle_delete(len$0, d[2], d, pairs$1, children); + } + function remove_aux(key, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact) return 0; + var + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$0 = bsearch(key, pairs$1), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0){ + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [0, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + _aO_ = remove_aux(key, caml_call2(Fmlib_std_Array[5], children, i$0)); + function _aP_(d){return handle_delete(i$0, d[2], d, pairs$1, children);} + return caml_call2(Fmlib_std_Option[5], _aP_, _aO_); + } + function remove(key, map){ + var match = remove_aux(key, map); + if(! match) return map; + var d = match[1], match$0 = d[1]; + if(1 === match$0[0]){ + var children = match$0[2], pairs = match$0[1]; + if(caml_call1(Fmlib_std_Array[3], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function update_aux(key, f, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact){ + var match$1 = caml_call1(f, 0); + if(! match$1) return [0, [0, map]]; + var value$0 = match$1[1]; + return [0, add_in_leaf(key, value$0, pairs)]; + } + var + match$0 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]]); + if(match$0){ + var value = match$0[1]; + return [0, + [0, + [0, + caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]]; + } + var + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + underflow = min_keys === caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + return [1, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$2 = bsearch(key, pairs$1), + exact$0 = match$2[2], + i$0 = match$2[1]; + if(exact$0){ + var + match$3 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs$1, i$0)[2]]); + if(match$3){ + var value$1 = match$3[1]; + return [0, + [0, + [1, + caml_call3 + (Fmlib_std_Array[13], i$0, [0, key, value$1], pairs$1), + children]]]; + } + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [1, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + match$4 = + update_aux(key, f, caml_call2(Fmlib_std_Array[5], children, i$0)); + if(0 !== match$4[0]){ + var d$0 = match$4[1]; + return [1, handle_delete(i$0, d$0[2], d$0, pairs$1, children)]; + } + var match$5 = match$4[1]; + if(0 === match$5[0]){ + var child = match$5[1]; + return [0, + [0, + [1, + pairs$1, + caml_call3(Fmlib_std_Array[13], i$0, child, children)]]]; + } + var v = match$5[3], y = match$5[2], u = match$5[1]; + return [0, add_in_node(i$0, u, y, v, pairs$1, children)]; + } + function update(key, f, map){ + var match = update_aux(key, f, map); + if(0 === match[0]){ + var match$0 = match[1]; + if(0 === match$0[0]){var map$0 = match$0[1]; return map$0;} + var v = match$0[3], y = match$0[2], u = match$0[1]; + return [1, [0, y], [0, u, v]]; + } + var d = match[1], match$1 = d[1]; + if(1 === match$1[0]){ + var children = match$1[2], pairs = match$1[1]; + if(0 === caml_call1(Fmlib_std_Array[1], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function has_more(source){ + var _aN_ = source[1], match = _aN_[1]; + if(0 === match[0]){ + var i = _aN_[2], pairs = match[1]; + return i < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + var i$0 = _aN_[2], pairs$0 = match[1]; + return i$0 < caml_call1(Fmlib_std_Array[1], pairs$0) ? 1 : 0; + } + function peek(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var _aM_ = source[1], match = _aM_[1]; + if(0 === match[0]){ + var i = _aM_[2], pairs = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs, i); + } + var i$0 = _aM_[2], pairs$0 = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs$0, i$0); + } + function down(tree, stack){ + var tree$0 = tree, stack$0 = stack; + for(;;){ + if(0 === tree$0[0]){ + var pairs = tree$0[1]; + return [0, [0, [0, pairs], 0], stack$0]; + } + var + children = tree$0[2], + pairs$0 = tree$0[1], + stack$1 = [0, [0, pairs$0, children, 0], stack$0], + tree$1 = caml_call2(Fmlib_std_Array[5], children, 0), + tree$0 = tree$1, + stack$0 = stack$1; + } + } + function up(stack){ + var stack$0 = stack; + for(;;){ + if(! stack$0) return [0, [0, empty, 0], 0]; + var + stack$1 = stack$0[2], + match = stack$0[1], + i = match[3], + children = match[2], + pairs = match[1]; + if(i < caml_call1(Fmlib_std_Array[1], pairs)) + return [0, [0, [1, pairs, children], i], stack$1]; + var stack$0 = stack$1; + } + } + function advance(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + var _aK_ = source[1], match = _aK_[1]; + if(0 === match[0]){ + var i = _aK_[2], pairs = match[1]; + return (i + 1 | 0) < caml_call1(Fmlib_std_Array[1], pairs) + ? [0, [0, [0, pairs], i + 1 | 0], source[2]] + : up(source[2]); + } + var i$0 = _aK_[2], children = match[2], pairs$0 = match[1]; + if(i$0 >= caml_call1(Fmlib_std_Array[1], pairs$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + var _aL_ = [0, [0, pairs$0, children, i$0 + 1 | 0], source[2]]; + return down(caml_call2(Fmlib_std_Array[5], children, i$0 + 1 | 0), _aL_); + } + function make_source(tree){return down(tree, 0);} + function Source(Value){return [0, has_more, peek, advance, make_source];} + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set0(Order, Key){ + var + Map = Map0(Order, Key), + is_empty = Map[5], + cardinal = Map[6], + empty = Map[7]; + function fold_left(f, start, set){ + function _aI_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[8], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[9], _aH_, start, set); + } + function mem(key, set){return caml_call2(Map[13], key, set) ? 1 : 0;} + function add(key, set){return caml_call3(Map[20], key, 0, set);} + function remove(key, set){return caml_call2(Map[32], key, set);} + function elements(set){return caml_call1(Map[11], set);} + var M = caml_call1(Map[41], [0]), has_more = M[1]; + function peek(source){return caml_call1(M[2], source)[1];} + var + advance = M[3], + make = M[4], + Source = [0, M, has_more, peek, advance, make]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + Source]; + } + function Map(Key){ + var + include = Map0(O32, Key), + order = include[1], + odd_order = include[2], + max_keys = include[3], + min_keys = include[4], + is_empty = include[5], + cardinal = include[6], + empty = include[7], + fold_left = include[8], + fold_right = include[9], + bindings = include[10], + keys = include[11], + bsearch = include[12], + find_opt = include[13], + subarray = include[14], + insert_subarray = include[15], + split_subarray = include[16], + add_in_leaf = include[17], + add_in_node = include[18], + add_aux = include[19], + add = include[20], + not_minimal = include[21], + replace2 = include[22], + rotate_keys = include[23], + rotate_children = include[24], + merge_keys = include[25], + merge_leaves = include[26], + merge_nodes = include[27], + handle_underflow = include[28], + handle_delete = include[29], + remove_last = include[30], + remove_aux = include[31], + remove = include[32], + update_aux = include[33], + update = include[34], + has_more = include[35], + peek = include[36], + down = include[37], + up = include[38], + advance = include[39], + make_source = include[40], + Source = include[41]; + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set_order(Order){ + var + include = Set0(Order, [0, Fmlib_std_Int[1]]), + Map = include[1], + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + function do_upward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _J_], 1); + var i = start, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(f, i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function do_downward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _K_], 1); + var i = beyond, set$0 = set; + for(;;){ + if(i === start) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(f, i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function add_upward(start, beyond, set){ + return do_upward(add, start, beyond, set); + } + function add_downward(start, beyond, set){ + return do_downward(add, start, beyond, set); + } + function remove_upward(start, beyond, set){ + return do_upward(remove, start, beyond, set); + } + function remove_downward(start, beyond, set){ + return do_downward(remove, start, beyond, set); + } + function check_range(start, beyond, set){ + var + _aE_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key){ + var + ok = param[2], + i = param[1], + _aG_ = ok ? key === i ? 1 : 0 : ok; + return [0, i + 1 | 0, _aG_]; + }, + _aE_, + set), + ok = match[2], + n = match[1], + _aF_ = n === beyond ? 1 : 0, + ok$0 = _aF_ ? ok : _aF_; + return ok$0; + } + var + M = Source[1], + has_more = Source[2], + peek = Source[3], + advance = Source[4], + make = Source[5]; + function to_list(source){ + var source$0 = source, accu = 0; + for(;;){ + if(! caml_call1(has_more, source$0)) + return caml_call1(Fmlib_std_List[11], accu); + var + accu$0 = [0, caml_call1(peek, source$0), accu], + source$1 = caml_call1(advance, source$0), + source$0 = source$1, + accu = accu$0; + } + } + var Source$0 = [0, M, has_more, peek, advance, make, to_list]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + do_upward, + do_downward, + add_upward, + add_downward, + remove_upward, + remove_downward, + check_range, + Source$0]; + } + var Set3 = Set_order([0, 3]), Set4 = Set_order([0, 4]); + function _L_(param){ + var Map$0 = Map([0, Fmlib_std_Int[1]]); + return 0 === caml_call1(Map$0[6], Map$0[7]) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map_in_cardinal_e, + 0, + cst_src_std_btree_ml, + 1052, + 0, + 75, + _L_); + function _M_(param){ + var set = caml_call3(Set4[13], 100, 200, Set4[4]); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s, + 0, + cst_src_std_btree_ml$0, + 1059, + 0, + 94, + _M_); + function _N_(param){ + var set = caml_call3(Set4[14], 0, 100, Set4[4]); + return caml_call3(Set4[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_0_100_set, + 0, + cst_src_std_btree_ml$1, + 1066, + 0, + 92, + _N_); + function _O_(param){ + var set = caml_call3(Set3[13], 100, 200, Set3[4]); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s, + 0, + cst_src_std_btree_ml$2, + 1073, + 0, + 94, + _O_); + function _P_(param){ + var set = caml_call3(Set3[14], 0, 100, Set3[4]); + return caml_call3(Set3[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_0_100_set, + 0, + cst_src_std_btree_ml$3, + 1080, + 0, + 92, + _P_); + function _Q_(param){ + var + _aD_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[15], 0, 100), _aD_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$4, + 1091, + 0, + 115, + _Q_); + function _R_(param){ + var + _aC_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[16], 0, 100), _aC_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$5, + 1096, + 0, + 117, + _R_); + function _S_(param){ + var + _aB_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[15], 0, 100), _aB_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$6, + 1101, + 0, + 115, + _S_); + function _T_(param){ + var + _aA_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[16], 0, 100), _aA_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$7, + 1106, + 0, + 117, + _T_); + var + Order = [0, 3], + include = Map0(Order, [0, Fmlib_std_Int[1]]), + is_empty = include[5], + empty = include[7], + fold_left = include[8], + add = include[20], + update = include[34]; + function do_upward(f, start, beyond, map){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _U_], 1); + var i = start, map$0 = map; + for(;;){ + if(i === beyond) return map$0; + var + map$1 = caml_call2(f, i, map$0), + i$0 = i + 1 | 0, + i = i$0, + map$0 = map$1; + } + } + function add_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(add, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function update_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(update, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function check_range(start, beyond, f, map){ + var + _ax_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key, value){ + var + ok = param[2], + i = param[1], + _az_ = ok ? caml_equal(caml_call1(f, key), value) : ok; + return [0, i + 1 | 0, _az_]; + }, + _ax_, + map), + ok = match[2], + n = match[1], + _ay_ = n === beyond ? 1 : 0, + ok$0 = _ay_ ? ok : _ay_; + return ok$0; + } + function _V_(param){ + var map = add_upward(0, 100, function(_aw_){return _aw_;}, empty); + return check_range(0, 100, function(_av_){return _av_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a, + 0, + cst_src_std_btree_ml$8, + 1185, + 0, + 113, + _V_); + function _W_(param){ + var i = 100, map = empty; + for(;;){ + if(i === 0) + return check_range(0, 100, function(_au_){return _au_;}, map); + var + i$0 = i - 1 | 0, + map$0 = caml_call3(add, i$0, i$0, map), + i = i$0, + map = map$0; + } + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$0, + 0, + cst_src_std_btree_ml$9, + 1190, + 0, + 115, + _W_); + function _X_(param){ + var + map = update_upward(0, 100, function(i, param){return [0, i];}, empty); + return check_range(0, 100, function(_at_){return _at_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_u, + 0, + cst_src_std_btree_ml$10, + 1199, + 0, + 129, + _X_); + function _Y_(param){ + var + _aq_ = add_upward(0, 100, function(_as_){return _as_;}, empty), + map = + update_upward + (0, + 100, + function(param){ + function _ar_(i){return 2 * i | 0;} + return caml_call1(Fmlib_std_Option[5], _ar_); + }, + _aq_); + return check_range(0, 100, function(i){return 2 * i | 0;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$1, + 0, + cst_src_std_btree_ml$11, + 1205, + 0, + 213, + _Y_); + function _Z_(param){ + var + _an_ = add_upward(0, 100, function(_ap_){return _ap_;}, empty), + map = update_upward(0, 100, function(param, _ao_){return 0;}, _an_); + return caml_call1(is_empty, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$2, + 0, + cst_src_std_btree_ml$12, + 1215, + 0, + 166, + _Z_); + function ___(param){ + function f(i){return ((i / 2 | 0) * 2 | 0) === i ? i : 2 * i | 0;} + var + _af_ = add_upward(0, 100, function(_am_){return _am_;}, empty), + _ai_ = add_upward(200, 300, function(_al_){return _al_;}, _af_), + _ah_ = + update_upward + (0, + 100, + function(param){return caml_call1(Fmlib_std_Option[5], f);}, + _ai_), + _ag_ = + update_upward(100, 200, function(i, param){return [0, f(i)];}, _ah_), + map = + update_upward + (0, + 300, + function(i){ + if(200 <= i) return function(param){return 0;}; + function _aj_(_ak_){return _ak_;} + return caml_call1(Fmlib_std_Option[5], _aj_); + }, + _ag_); + return check_range(0, 200, f, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_f_i_i, + 0, + cst_src_std_btree_ml$13, + 1226, + 0, + 540, + ___); + function _$_(param){ + var + set = caml_call3(Set3[13], 0, 20, Set3[4]), + _ae_ = caml_call1(Set3[18][5], set); + return caml_equal(caml_call1(Set3[18][6], _ae_), _aa_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Set3_in_let_modul, + 0, + cst_src_std_btree_ml$14, + 1260, + 0, + 253, + _$_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _ab_(_ac_){ + var _ad_ = Map(_ac_); + return [0, + _ad_[5], + _ad_[6], + _ad_[8], + _ad_[9], + _ad_[10], + _ad_[13], + _ad_[7], + _ad_[20], + _ad_[32], + _ad_[34], + _ad_[40], + _ad_[35], + _ad_[36], + _ad_[39], + _ad_[41]]; + } + var + Fmlib_std_Btree = + [0, + function(Key){ + var + include = Set0(O32, Key), + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + return [0, + is_empty, + cardinal, + mem, + fold_left, + fold_right, + elements, + empty, + add, + remove, + [0, Source[2], Source[3], Source[4], Source[5]]]; + }, + _ab_]; + runtime.caml_register_global(88, Fmlib_std_Btree, "Fmlib_std__Btree"); + return; + } + (globalThis)); + + +//# 1 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_cannot_decode_message$1 = "cannot decode message", + cst_provided_callback_is_not_a$1 = "provided callback is not a function", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_List = global_data.Fmlib_std__List, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Stdlib_Float = global_data.Stdlib__Float, + null$0 = Js_of_ocaml_Js[1], + undefined$0 = Js_of_ocaml_Js[3], + cst_cannot_decode_message$0 = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a$0 = cst_provided_callback_is_not_a$1, + cst_cannot_decode_state = "cannot decode state", + cst_cannot_decode_a_nullable_e = "cannot decode a nullable element id", + cst_cannot_decode_message = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a = cst_provided_callback_is_not_a$1, + cst_cannot_decode_input_data = "cannot decode input data", + cst_init = "init", + _b_ = [0, "src/js/base.ml", 283, 12]; + function int$0(i){return i;} + function float$0(v){return v;} + var + bool = runtime.caml_js_from_bool, + string = caml_jsstring_of_string, + object = runtime.caml_js_object, + array = runtime.caml_js_from_array; + function function1(f){return f;} + function function2(f){return f;} + function function3(f){return f;} + function stringify(v){ + try{var _G_ = [0, Js_of_ocaml_Js[38].stringify(v)]; return _G_;} + catch(_H_){return 0;} + } + function parse(v){ + try{var _E_ = [0, Js_of_ocaml_Js[38].parse(v)]; return _E_;} + catch(_F_){return 0;} + } + var + Value = + [0, + null$0, + undefined$0, + int$0, + float$0, + bool, + string, + object, + array, + function1, + function2, + function3, + stringify, + parse]; + function is_function(v){return typeof v === "function" ? 1 : 0;} + function return$0(a, param){return [0, a];} + function fail(param){return 0;} + function value(v){return [0, v];} + function let$0(m, f, v){ + function _C_(a){return caml_call2(f, a, v);} + var _D_ = caml_call1(m, v); + return caml_call2(Fmlib_std_Option[3], _D_, _C_); + } + function symbol(p, q, v){ + var r = caml_call1(p, v); + return r ? r : caml_call1(q, v); + } + function map(f, m){ + function _y_(a){ + var _A_ = caml_call1(f, a); + return function(_B_){return [0, _A_];}; + } + return function(_z_){return let$0(m, _y_, _z_);}; + } + function null$1(a, obj){return obj === Value[1] ? [0, a] : 0;} + function undefined$1(a, obj){return obj === Value[2] ? [0, a] : 0;} + function float$1(v){return typeof v === "number" ? [0, v.valueOf(0)] : 0;} + function _a_(v){ + var i = v | 0; + return caml_call2(Stdlib_Float[20], v, i) + ? function(_x_){return [0, i];} + : fail; + } + function int$1(_w_){return let$0(float$1, _a_, _w_);} + function bool$0(v){return typeof v === "boolean" ? [0, v | 0] : 0;} + function string$0(v){ + return typeof v === "string" ? [0, runtime.caml_string_of_jsstring(v)] : 0; + } + function function$0(v){ + return is_function(v) + ? [0, function(args){return runtime.caml_js_fun_call(v, args);}] + : 0; + } + function method(v){ + return is_function(v) + ? [0, + function(obj, args){return runtime.caml_js_call(v, obj, args);}] + : 0; + } + function field(name, decode, obj){ + function _t_(v){return caml_call1(decode, v);} + var + _u_ = obj[caml_jsstring_of_string(name)], + _v_ = caml_call1(Js_of_ocaml_Js[6][10], _u_); + return caml_call2(Fmlib_std_Option[3], _v_, _t_); + } + function array$0(decode, obj){ + var t6 = Js_of_ocaml_Js[52][1]; + if(! t6.Array.isArray(obj)) return 0; + var len = obj.length; + function extract(i, lst){ + if(i === len){ + var _n_ = caml_call1(Fmlib_std_List[11], lst); + return [0, caml_call1(Fmlib_std_Array[30], _n_)]; + } + function _o_(e){ + function _r_(a){return extract(i + 1 | 0, [0, a, lst]);} + var _s_ = caml_call1(decode, e); + return caml_call2(Fmlib_std_Option[3], _s_, _r_); + } + var + _p_ = caml_call2(Js_of_ocaml_Js[20], obj, i), + _q_ = caml_call1(Js_of_ocaml_Js[6][10], _p_); + return caml_call2(Fmlib_std_Option[3], _q_, _o_); + } + return extract(0, 0); + } + function option(decode){ + var _i_ = 0; + function _j_(_m_){return null$1(_i_, _m_);} + var _k_ = map(Fmlib_std_Option[1], decode); + return function(_l_){return symbol(_k_, _j_, _l_);}; + } + function of_exception(exn){return caml_call1(Js_of_ocaml_Js[37][7], exn);} + function raise_js_error(js_error){ + return caml_call1(Js_of_ocaml_Js[37][5], js_error); + } + function raise_js(message){ + var + js_msg = caml_jsstring_of_string(message), + _g_ = new Js_of_ocaml_Js[36](js_msg), + _h_ = caml_call1(Js_of_ocaml_Js[37][9], _g_); + return caml_call1(Js_of_ocaml_Js[37][5], _h_); + } + function log_string(str){ + var t12 = Js_of_ocaml_Js[52][1]; + return t12.console.log(caml_jsstring_of_string(str)); + } + function log_value(value){ + var t15 = Js_of_ocaml_Js[52][1]; + return t15.console.log(value); + } + function export$0(obj){ + var _f_ = caml_call1(Value[7], obj); + return caml_call1(Js_of_ocaml_Js[51], _f_); + } + function make_global(name, v){ + return Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)] = v; + } + function get_global(name){ + var _e_ = Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)]; + return caml_call1(Js_of_ocaml_Js[5][10], _e_); + } + function new_global(cname, args){ + var match = get_global(cname); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var constr = match[1]; + return runtime.caml_js_new(constr, args); + } + function decode_callback(cb, err){ + var match = function$0(cb); + if(! match) return raise_js(err); + var cb$0 = match[1]; + return function(v){caml_call1(cb$0, [0, v]); return 0;}; + } + function decode_data(dec, data, err){ + var match = caml_call1(dec, data); + if(! match) return raise_js(err); + var state = match[1]; + return state; + } + function node_module(decode, msg_decode, node_function){ + function js_function(data, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a), + data$0 = decode_data(decode, data, cst_cannot_decode_input_data), + f = caml_call2(node_function, data$0, callback$0); + function _d_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _d_); + } + return export$0([0, [0, cst_init, caml_call1(Value[10], js_function)]]); + } + function browser_application + (app_name, state_decode, msg_decode, browser_function){ + function js_function(state, element, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a$0), + state$0 = decode_data(state_decode, state, cst_cannot_decode_state), + element$0 = + decode_data(option(string$0), element, cst_cannot_decode_a_nullable_e), + f = caml_call3(browser_function, state$0, element$0, callback$0); + function _c_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message$0); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _c_); + } + return make_global(app_name, caml_call1(Value[11], js_function)); + } + var + Fmlib_js_Base = + [0, + Value, + [0, + return$0, + fail, + value, + let$0, + let$0, + symbol, + map, + null$1, + undefined$1, + float$1, + int$1, + bool$0, + string$0, + function$0, + method, + field, + array$0, + option], + [0, + of_exception, + raise_js_error, + raise_js, + log_string, + log_value, + node_module, + browser_application, + make_global, + get_global, + new_global, + export$0]]; + runtime.caml_register_global(29, Fmlib_js_Base, "Fmlib_js__Base"); + return; + } + (globalThis)); + +//# 300 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function value(e){return e;} + function stop_propagation(e){return e.stopPropagation(0);} + function prevent_default(e){return e.preventDefault(0);} + var Fmlib_js_Event = [0, value, stop_propagation, prevent_default]; + runtime.caml_register_global(2, Fmlib_js_Event, "Fmlib_js__Event"); + return; + } + (globalThis)); + +//# 315 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function add(name, handler, tgt){ + return tgt.addEventListener(caml_jsstring_of_string(name), handler); + } + function remove(name, handler, tgt){ + return tgt.removeEventListener(caml_jsstring_of_string(name), handler); + } + var Fmlib_js_Event_target = [0, add, remove]; + runtime.caml_register_global + (2, Fmlib_js_Event_target, "Fmlib_js__Event_target"); + return; + } + (globalThis)); + +//# 336 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function set(f, ms){return Js_of_ocaml_Js[52][1].setTimeout(f, ms);} + function clear(t){return Js_of_ocaml_Js[52][1].clearTimeout(t);} + function set_interval(f, ms){ + return Js_of_ocaml_Js[52][1].setInterval(f, ms); + } + function clear_interval(t){return Js_of_ocaml_Js[52][1].clearInterval(t);} + var Fmlib_js_Timer = [0, set, clear, set_interval, clear_interval]; + runtime.caml_register_global(5, Fmlib_js_Timer, "Fmlib_js__Timer"); + return; + } + (globalThis)); + +//# 544 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Stdlib_List = global_data.Stdlib__List; + function event_target(req){return req;} + function make(method, url, headers, body){ + var + t0 = Js_of_ocaml_Js[52][1], + request = t0.XMLHttpRequest, + req = new request(); + req.open(caml_jsstring_of_string(method), caml_jsstring_of_string(url)); + function _a_(param){ + var value = param[2], name = param[1]; + return req.setRequestHeader + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + caml_call2(Stdlib_List[17], _a_, headers); + req.send(caml_jsstring_of_string(body)); + return req; + } + function ready_state(req){return req.readyState;} + function status(req){return req.status;} + function response_text_value(req){return req.responseText;} + function response_text_string(req){ + return runtime.caml_string_of_jsstring(req.responseText); + } + var + Fmlib_js_Http_request = + [0, + event_target, + make, + ready_state, + status, + response_text_value, + response_text_string]; + runtime.caml_register_global + (10, Fmlib_js_Http_request, "Fmlib_js__Http_request"); + return; + } + (globalThis)); + +//# 598 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_js_dom_ml = "src/js/dom.ml", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + _b_ = [0, cst_src_js_dom_ml, 257, 8], + _a_ = [0, cst_src_js_dom_ml, 147, 8]; + function set(name, value, s){ + return s.setProperty + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove(name, s){ + return s.removeProperty(caml_jsstring_of_string(name)); + } + var Style = [0, set, remove]; + function event_target(node){return node;} + function parent(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.parentNode); + } + function first(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.firstChild); + } + function next(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.nextSibling); + } + function append(child, node){ + if(node === Fmlib_js_Base[1][1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return node.appendChild(child); + } + function remove$0(child, node){return node.removeChild(child);} + function replace(new_child, old_child, node){ + return node.replaceChild(new_child, old_child); + } + function remove_children(parent){ + for(;;){ + var match = first(parent); + if(! match) return 0; + var child = match[1]; + parent.removeChild(child); + } + } + function node_value(node){return caml_string_of_jsstring(node.nodeValue);} + function set_node_value(value, node){ + var t16 = caml_jsstring_of_string(value); + return node.nodeValue = t16; + } + var + Node = + [0, + event_target, + parent, + first, + next, + append, + remove$0, + replace, + remove_children, + node_value, + set_node_value]; + function node(element){return element;} + function scroll_width(element){return element.scrollWidth;} + function scroll_height(element){return element.scrollHeight;} + function client_width(element){return element.clientWidth;} + function client_height(element){return element.clientHeight;} + function scroll_left(element){return element.scrollLeft;} + function scroll_top(element){return element.scrollTop;} + function set_scroll_left(t24, element){return element.scrollLeft = t24;} + function set_scroll_top(t26, element){return element.scrollTop = t26;} + function style(element){return element.style;} + function set_attribute(name, value, element){ + return element.setAttribute + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove_attribute(name, element){ + return element.removeAttribute(caml_jsstring_of_string(name)); + } + function set_property(name, value, element){ + return element[caml_jsstring_of_string(name)] = value; + } + function delete_property(name, element){ + return delete element[caml_jsstring_of_string(name)]; + } + function focus(element){return element.focus(0);} + function blur(element){return element.blur(0);} + var + Element = + [0, + node, + scroll_width, + scroll_height, + client_width, + client_height, + scroll_left, + scroll_top, + set_scroll_left, + set_scroll_top, + style, + set_attribute, + remove_attribute, + set_property, + delete_property, + focus, + blur]; + function title(doc){return caml_string_of_jsstring(doc.title);} + function set_title(title, doc){ + var t39 = caml_jsstring_of_string(title); + return doc.title = t39; + } + function body(doc){ + if(doc.body !== null) return doc.body; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function find(name, doc){ + var _c_ = doc.getElementById(caml_jsstring_of_string(name)); + return caml_call1(Js_of_ocaml_Js[5][10], _c_); + } + function create_element(tag, doc){ + return doc.createElement(caml_jsstring_of_string(tag)); + } + function create_text_node(text, doc){ + return doc.createTextNode(caml_jsstring_of_string(text)); + } + function create_element_ns(namespace, tag, doc){ + return doc.createElementNS + (caml_jsstring_of_string(namespace), caml_jsstring_of_string(tag)); + } + function create_document_fragment(doc){return doc.createDocumentFragment(0); + } + var + Document = + [0, + title, + set_title, + body, + find, + create_element, + create_text_node, + create_element_ns, + create_document_fragment]; + function go(i, history){return history.go(i);} + function push_state(state, title, url, history){ + return history.pushState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + function replace_state(state, title, url, history){ + return history.replaceState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + var History = [0, go, push_state, replace_state]; + function href(location){return caml_string_of_jsstring(location.href);} + function protocol(location){ + return caml_string_of_jsstring(location.protocol); + } + function host(location){return caml_string_of_jsstring(location.host);} + function port(location){return caml_string_of_jsstring(location.port);} + function pathname(location){ + return caml_string_of_jsstring(location.pathname); + } + function search(location){return caml_string_of_jsstring(location.search);} + function hash(location){return caml_string_of_jsstring(location.hash);} + function assign(url, location){ + return location.assign(caml_jsstring_of_string(url)); + } + function reload(location){return location.reload(0);} + var + Location = + [0, href, protocol, host, port, pathname, search, hash, assign, reload]; + function get(param){return Js_of_ocaml_Js[52][1];} + function event_target$0(w){return w;} + function document(t75){return t75.document;} + function history(t76){return t76.history;} + function location(t77){return t77.location;} + function on_next_animation(callback, w){ + return w.requestAnimationFrame(callback); + } + var + Window = + [0, get, event_target$0, document, history, location, on_next_animation], + Fmlib_js_Dom = + [0, Node, Style, Element, Document, Location, History, Window]; + runtime.caml_register_global(54, Fmlib_js_Dom, "Fmlib_js__Dom"); + return; + } + (globalThis)); + +//# 804 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function now(param){return new Js_of_ocaml_Js[26]();} + function make(year, month, day, hour, minute, second, milli){ + return new + Js_of_ocaml_Js[33] + (year, month, day, hour, minute, second, milli); + } + function of_value(v){return new Js_of_ocaml_Js[27](v);} + function value(d){return d.valueOf();} + function zone_offset(d){return d.getTimezoneOffset();} + function add(ms, d){return of_value(d.valueOf() + ms);} + function day(d){return d.getDay();} + function date(d){return d.getDate();} + function month(d){return d.getMonth();} + function year(d){return d.getFullYear();} + function hours(d){return d.getHours();} + function minutes(d){return d.getMinutes();} + function seconds(d){return d.getSeconds();} + function milliseconds(d){return d.getMilliseconds();} + var + Fmlib_js_Date = + [0, + now, + value, + of_value, + zone_offset, + add, + make, + day, + date, + month, + year, + hours, + minutes, + seconds, + milliseconds]; + runtime.caml_register_global(11, Fmlib_js_Date, "Fmlib_js__Date"); + return; + } + (globalThis)); + + +//# 1 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_dictionary_ml = "src/browser/dictionary.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_std_String = global_data.Fmlib_std__String, + _c_ = [0, cst_src_browser_dictionary_ml, 77, 12], + _b_ = [0, cst_src_browser_dictionary_ml, 51, 17], + _a_ = [0, cst_src_browser_dictionary_ml, 53, 17]; + function Make(Key){ + var Map = caml_call1(Fmlib_std_Btree[2], Key), empty = [0, [0], Map[7]]; + function find_opt(key, d){ + var _n_ = caml_call2(Map[6], key, d[2]); + function _o_(i){ + if(i >= caml_call1(Fmlib_std_Array[1], d[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + match = caml_call2(Fmlib_std_Array[5], d[1], i), + v = match[2], + k = match[1]; + if(caml_equal(k, key)) return v; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + return caml_call2(Fmlib_std_Option[5], _o_, _n_); + } + function add(key, value, d){ + if(caml_call2(Map[6], key, d[2])) return d; + var + n = caml_call1(Fmlib_std_Array[1], d[1]), + _m_ = caml_call3(Map[8], key, n, d[2]); + return [0, caml_call2(Fmlib_std_Array[27], [0, key, value], d[1]), _m_]; + } + function set(key, f, d){ + var match = caml_call2(Map[6], key, d[2]); + if(! match) return add(key, caml_call1(f, 0), d); + var + idx = match[1], + match$0 = caml_call2(Fmlib_std_Array[5], d[1], idx), + v = match$0[2], + k = match$0[1]; + if(! caml_equal(k, key)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _j_ = d[2], _k_ = d[1], _l_ = [0, key, caml_call1(f, [0, v])]; + return [0, caml_call3(Fmlib_std_Array[13], idx, _l_, _k_), _j_]; + } + function of_list(lst){ + var d = empty, param = lst; + for(;;){ + if(! param) return d; + var + tl = param[2], + match = param[1], + value = match[2], + key = match[1], + d$0 = add(key, value, d), + d = d$0, + param = tl; + } + } + function fold(f, accu, d){ + var _h_ = d[1]; + function _i_(accu, param){ + var value = param[2], key = param[1]; + return caml_call3(f, accu, key, value); + } + return caml_call3(Fmlib_std_Array[18], _i_, accu, _h_); + } + function iter(f, dict){ + var _f_ = dict[1]; + function _g_(param){ + var value = param[2], key = param[1]; + return caml_call2(f, key, value); + } + return caml_call2(Stdlib_Array[11], _g_, _f_); + } + function diff(add, set, remove, d1, d2){ + iter + (function(key, param){ + return find_opt(key, d1) ? 0 : caml_call1(remove, key); + }, + d2); + return iter + (function(key, value){ + var match = find_opt(key, d2); + if(! match) return caml_call2(add, key, value); + var value2 = match[1]; + return value === value2 ? 0 : caml_call2(set, key, value); + }, + d1); + } + return [0, Map, empty, find_opt, add, set, of_list, fold, iter, diff]; + } + var + include = Make([0, Fmlib_std_String[4]]), + empty = include[2], + find_opt = include[3], + add = include[4], + set = include[5], + of_list = include[6], + fold = include[7], + iter = include[8], + diff = include[9], + Fmlib_browser_Dictionary = + [0, + function(_d_){ + var _e_ = Make(_d_); + return [0, + _e_[2], + _e_[3], + _e_[4], + _e_[5], + _e_[6], + _e_[7], + _e_[8], + _e_[9]]; + }, + empty, + find_opt, + add, + set, + of_list, + fold, + iter, + diff]; + runtime.caml_register_global + (9, Fmlib_browser_Dictionary, "Fmlib_browser__Dictionary"); + return; + } + (globalThis)); + +//# 172 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + prevent = [0, 1], + no_prevent = [0, 0], + stop = [0, 1], + no_stop = [0, 0], + Fmlib_browser_Event_flag = [0, prevent, no_prevent, stop, no_stop]; + runtime.caml_register_global + (4, Fmlib_browser_Event_flag, "Fmlib_browser__Event_flag"); + return; + } + (globalThis)); + +//# 189 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + utc = 0; + function make(minutes){return minutes;} + function offset(zone){return zone;} + var Zone = [0, utc, make, offset], zero = caml_call1(Fmlib_js_Date[3], 0.); + function adapt(time, zone){ + var _h_ = 60000. * (caml_call1(Fmlib_js_Date[4], time) - zone | 0); + return caml_call2(Fmlib_js_Date[5], _h_, time); + } + function year(time, zone){ + var _g_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[10], _g_); + } + function month(time, zone){ + var _f_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[9], _f_); + } + function day_of_month(time, zone){ + var _e_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[8], _e_); + } + function hour(time, zone){ + var _d_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[11], _d_); + } + function minute(time, zone){ + var _c_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[12], _c_); + } + function second(time, zone){ + var _b_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[13], _b_); + } + function milli_second(time, zone){ + var _a_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[14], _a_); + } + var + Fmlib_browser_Time = + [0, + Zone, + zero, + adapt, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second]; + runtime.caml_register_global(3, Fmlib_browser_Time, "Fmlib_browser__Time"); + return; + } + (globalThis)); + +//# 262 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + _a_ = [0, "src/browser/url.ml", 6, 8]; + function string(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + var Local = [0, string]; + function parse(str){return [0, [0, str]];} + function string$0(param){ + if(0 === param[0]){var str = param[1]; return str;} + var loc = param[1]; + return caml_call1(Local[1], loc); + } + function is_page(param){return 0 === param[0] ? 1 : 1;} + var Fmlib_browser_Url = [0, Local, parse, string$0, is_page]; + runtime.caml_register_global(2, Fmlib_browser_Url, "Fmlib_browser__Url"); + return; + } + (globalThis)); + +//# 296 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_click$1 = "click", + cst_src_browser_handler_ml = "src/browser/handler.ml", + cst_target$1 = "target", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Fmlib_js_Event = global_data.Fmlib_js__Event, + Fmlib_browser_Url = global_data.Fmlib_browser__Url, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_js_Date = global_data.Fmlib_js__Date, + Stdlib_List = global_data.Stdlib__List, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + _h_ = [0, cst_src_browser_handler_ml, 356, 12], + cst_href = "href", + cst_target = cst_target$1, + cst_click$0 = cst_click$1, + cst_click = cst_click$1, + cst_Cannot_decode_event = "Cannot decode event", + _d_ = [0, cst_src_browser_handler_ml, 78, 33], + _c_ = [0, cst_src_browser_handler_ml, 88, 21], + _b_ = [0, cst_src_browser_handler_ml, 101, 33], + _a_ = [0, cst_src_browser_handler_ml, 48, 17], + cst_tagName = "tagName", + cst_target$0 = cst_target$1; + function make(handler){ + var ref = [0, handler]; + return [0, ref, function(e){return caml_call1(ref[1], e);}]; + } + function update(handler, actual){actual[1][1] = handler; return 0;} + function fire(actual){return actual[2];} + var Actual = [0, make, update, fire]; + function Actuals(Key){ + var + Map = caml_call1(Fmlib_std_Btree[2], Key), + Dict = caml_call1(Fmlib_browser_Dictionary[1], Key); + function empty(param){return [0, Map[7]];} + function set(make, add, dict, map){ + function _Y_(key, v){ + if(0 !== caml_call2(Map[6], key, map[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + _Z_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _Z_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + map[1] = caml_call3(Map[8], key, [0, actual, a], map[1]); + return 0; + } + return caml_call2(Dict[7], _Y_, dict); + } + function update(make, add, remove, d1, d2, map){ + function _P_(key){ + var _W_ = map[1]; + function _X_(param){ + if(! param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var match = param[1], a = match[2], actual = match[1]; + caml_call3(remove, key, caml_call1(Actual[3], actual), a); + return 0; + } + map[1] = caml_call3(Map[10], key, _X_, _W_); + return 0; + } + function _Q_(key, v){ + var match = caml_call2(Map[6], key, map[1]); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var actual = match[1][1], _V_ = caml_call1(make, v); + return caml_call2(Actual[2], _V_, actual); + } + function _R_(key, v){ + var _S_ = map[1]; + function _T_(param){ + if(param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var + _U_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _U_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + return [0, [0, actual, a]]; + } + map[1] = caml_call3(Map[10], key, _T_, _S_); + return 0; + } + return caml_call5(Dict[8], _R_, _Q_, _P_, d1, d2); + } + return [0, Map, Dict, empty, set, update]; + } + function make_one(dispatch, param, event){ + var decode = param[3], prevent = param[2][1], stop = param[1][1]; + if(stop) caml_call1(Fmlib_js_Event[2], event); + if(prevent) caml_call1(Fmlib_js_Event[3], event); + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(match){var m = match[1]; return caml_call1(dispatch, m);} + caml_call1(Fmlib_js_Base[3][4], cst_Cannot_decode_event); + var _O_ = caml_call1(Fmlib_js_Event[1], event); + return caml_call1(Fmlib_js_Base[3][5], _O_); + } + function make_list(dispatch, lst, event){ + var _M_ = caml_call1(Stdlib_List[9], lst); + function _N_(v){return make_one(dispatch, v, event);} + return caml_call2(Stdlib_List[17], _N_, _M_); + } + function map(f, param){ + var decode = param[3], prevent = param[2], stop = param[1]; + return [0, stop, prevent, caml_call2(Fmlib_js_Base[2][7], f, decode)]; + } + var + Virtual = [0, make_one, make_list, map], + Actuals$0 = Actuals([0, Stdlib_String[9]]), + Dict = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = Actuals$0[3]; + function add(target, event_type, handler){ + return caml_call3(Fmlib_js_Event_target[1], event_type, handler, target); + } + function set(target, dispatch, dict, map){ + function _I_(_K_, _L_){return add(target, _K_, _L_);} + var _J_ = caml_call1(Virtual[2], dispatch); + return caml_call4(Actuals$0[4], _J_, _I_, dict, map); + } + function update$0(target, dispatch, d1, d2, map){ + function _D_(event_type, handler, param){ + return caml_call3(Fmlib_js_Event_target[2], event_type, handler, target); + } + function _E_(_G_, _H_){return add(target, _G_, _H_);} + var _F_ = caml_call1(Virtual[2], dispatch); + return caml_call6(Actuals$0[5], _F_, _E_, _D_, d1, d2, map); + } + var + EventHs = [0, Actuals$0, Dict, empty, add, set, update$0], + Actuals$1 = Actuals([0, Stdlib_Int[9]]), + Dict$0 = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + empty$0 = Actuals$1[3]; + function of_list(dispatch, lst, time){ + var _B_ = caml_call1(Stdlib_List[9], lst); + function _C_(f){return caml_call1(dispatch, caml_call1(f, time));} + return caml_call2(Stdlib_List[17], _C_, _B_); + } + function make_timer(millis, h){ + function _A_(param){ + return caml_call1(h, caml_call1(Fmlib_js_Date[1], 0)); + } + return caml_call2(Fmlib_js_Timer[3], _A_, millis); + } + function remove_timer(param, _z_, timer){ + return caml_call1(Fmlib_js_Timer[4], timer); + } + function set$0(dispatch, dict, map){ + function _w_(_x_, _y_){return of_list(dispatch, _x_, _y_);} + return caml_call4(Actuals$1[4], _w_, make_timer, dict, map); + } + function update$1(dispatch, d1, d2, map){ + function _t_(_u_, _v_){return of_list(dispatch, _u_, _v_);} + return caml_call6 + (Actuals$1[5], _t_, make_timer, remove_timer, d1, d2, map); + } + var + Timers = + [0, + Actuals$1, + Dict$0, + empty$0, + of_list, + make_timer, + remove_timer, + set$0, + update$1]; + function empty$1(param){return [0, 0];} + function target(param){ + var _s_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][2], _s_); + } + function add$0(h){ + var _r_ = target(0); + return caml_call3(Fmlib_js_Event_target[1], cst_click, h, _r_); + } + function remove(h){ + var _q_ = target(0); + return caml_call3(Fmlib_js_Event_target[2], cst_click$0, h, _q_); + } + function _e_(tag){ + function _n_(href){ + var match = caml_call1(Fmlib_browser_Url[2], href); + if(! match) return Fmlib_js_Base[2][2]; + var url = match[1]; + if + (! + caml_string_notequal(tag, "A") + && + ! + caml_string_notequal(tag, "a") + && caml_call1(Fmlib_browser_Url[4], url)) + return caml_call1(Fmlib_js_Base[2][1], url); + return Fmlib_js_Base[2][2]; + } + var + _o_ = caml_call2(Fmlib_js_Base[2][16], cst_href, Fmlib_js_Base[2][13]), + _p_ = caml_call2(Fmlib_js_Base[2][16], cst_target, _o_); + return caml_call2(Fmlib_js_Base[2][4], _p_, _n_); + } + var + _f_ = caml_call2(Fmlib_js_Base[2][16], cst_tagName, Fmlib_js_Base[2][13]), + _g_ = caml_call2(Fmlib_js_Base[2][16], cst_target$0, _f_), + decode = caml_call2(Fmlib_js_Base[2][4], _g_, _e_); + function make$0(dispatch, f, event){ + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(! match) return 0; + var url = match[1]; + caml_call1(Fmlib_js_Event[3], event); + return caml_call1(dispatch, caml_call1(f, url)); + } + function set$1(dispatch, virt, req){ + if(virt){ + var + f = virt[1], + _l_ = function(_m_){return make$0(dispatch, f, _m_);}, + actual = caml_call1(Actual[1], _l_); + add$0(caml_call1(Actual[3], actual)); + req[1] = [0, actual]; + return 0; + } + req[1] = 0; + return 0; + } + function update$2(dispatch, virt1, virt2, req){ + var match = req[1]; + if(virt1){ + var f1 = virt1[1]; + if(virt2){ + if(match){ + var + actual = match[1], + handler = function(_j_){return make$0(dispatch, f1, _j_);}; + return caml_call2(Actual[2], handler, actual); + } + } + else if(! match){ + var + _i_ = function(_k_){return make$0(dispatch, f1, _k_);}, + actual$0 = caml_call1(Actual[1], _i_); + add$0(caml_call1(Actual[3], actual$0)); + req[1] = [0, actual$0]; + return 0; + } + } + else + if(virt2){ + if(match){ + var actual$1 = match[1]; + return remove(caml_call1(Actual[3], actual$1)); + } + } + else if(! match) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + } + var + Url_request = + [0, empty$1, target, add$0, remove, decode, make$0, set$1, update$2], + Fmlib_browser_Handler = + [0, Actual, Actuals, Virtual, EventHs, Timers, Url_request]; + runtime.caml_register_global + (27, Fmlib_browser_Handler, "Fmlib_browser__Handler"); + return; + } + (globalThis)); + +//# 605 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function style(key, value){return [0, key, value];} + function property(key, value){return [1, key, value];} + function attribute(key, value){return [2, key, value];} + function handler(key, stop, prevent, decode){ + return [3, key, [0, stop, prevent, decode]]; + } + var Fmlib_browser_Attribute = [0, style, property, attribute, handler]; + runtime.caml_register_global + (0, Fmlib_browser_Attribute, "Fmlib_browser__Attribute"); + return; + } + (globalThis)); + +//# 623 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_equal = runtime.caml_string_equal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib_String = global_data.Stdlib__String, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + _a_ = [0, "src/browser/vdom.ml", 205, 16], + _b_ = [0, 0, 0]; + function of_list(lst){ + var _x_ = [0, Dictionary[1], Dictionary[1], Dictionary[1], Dictionary[1]]; + function _y_(attrs, param){ + switch(param[0]){ + case 0: + var + value = param[2], + name = param[1], + _z_ = attrs[4], + _A_ = attrs[3], + _B_ = attrs[2]; + return [0, + caml_call3(Dictionary[3], name, value, attrs[1]), + _B_, + _A_, + _z_]; + case 1: + var + value$0 = param[2], + name$0 = param[1], + _C_ = attrs[4], + _D_ = attrs[3], + _E_ = caml_call3(Dictionary[3], name$0, value$0, attrs[2]); + return [0, attrs[1], _E_, _D_, _C_]; + case 2: + var + value$1 = param[2], + name$1 = param[1], + _F_ = attrs[4], + _G_ = caml_call3(Dictionary[3], name$1, value$1, attrs[3]); + return [0, attrs[1], attrs[2], _G_, _F_]; + default: + var + handler = param[2], + name$2 = param[1], + _H_ = attrs[4], + _I_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }, + _J_ = caml_call3(Dictionary[4], name$2, _I_, _H_); + return [0, attrs[1], attrs[2], attrs[3], _J_]; + } + } + return caml_call3(Stdlib_List[25], _y_, _x_, lst); + } + var Attributes = [0, of_list]; + function text(s){return [0, [0, s], 0];} + function node(tag, attrs, lst){ + return [0, [1, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function node_ns(namespace, tag, attrs, lst){ + return [0, [2, namespace, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function keyed(tag, attrs, lst){ + var _w_ = caml_call1(Dictionary[5], lst); + return [0, [3, tag, caml_call1(Attributes[1], attrs), _w_], 0]; + } + function element(_v_){return _v_[2];} + function add_attributes(ops, attrs, el){ + var _p_ = attrs[1], _q_ = caml_call1(ops[9], el); + caml_call2(Dictionary[7], _q_, _p_); + var _r_ = attrs[3], _s_ = caml_call1(ops[10], el); + caml_call2(Dictionary[7], _s_, _r_); + var _t_ = attrs[2], _u_ = caml_call1(ops[11], el); + caml_call2(Dictionary[7], _u_, _t_); + return caml_call2(ops[15], el, attrs[4]); + } + function make(ops, vdom){ + function make(vdom){ + var match = vdom[1]; + switch(match[0]){ + case 0: + var s = match[1]; return [0, [0, s], caml_call1(ops[1], s)]; + case 1: + var + lst = match[3], + attrs = match[2], + tag = match[1], + match$0 = make_children(lst), + real_children = match$0[2], + combined_children = match$0[1], + parent = caml_call2(ops[2], tag, real_children); + add_attributes(ops, attrs, parent); + return [0, [1, tag, attrs, combined_children], parent]; + case 2: + var + lst$0 = match[4], + attrs$0 = match[3], + tag$0 = match[2], + namespace = match[1], + match$1 = make_children(lst$0), + real_children$0 = match$1[2], + combined_children$0 = match$1[1], + parent$0 = caml_call3(ops[3], namespace, tag$0, real_children$0); + add_attributes(ops, attrs$0, parent$0); + return [0, + [2, namespace, tag$0, attrs$0, combined_children$0], + parent$0]; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + function make_children(lst){ + if(! lst) return _b_; + var + tl = lst[2], + hd = lst[1], + hd$0 = make(hd), + hd2 = hd$0[2], + match = make_children(tl), + tl2 = match[2], + tl1 = match[1]; + return [0, [0, hd$0, tl1], [0, hd2, tl2]]; + } + return make(vdom); + } + function update_attributes(ops, par, attrs1, attrs2){ + var + set = caml_call1(ops[9], par), + _g_ = attrs2[1], + _h_ = attrs1[1], + _i_ = caml_call1(ops[12], par); + caml_call5(Dictionary[8], set, set, _i_, _h_, _g_); + var + set$0 = caml_call1(ops[10], par), + _j_ = attrs2[3], + _k_ = attrs1[3], + _l_ = caml_call1(ops[13], par); + caml_call5(Dictionary[8], set$0, set$0, _l_, _k_, _j_); + var + set$1 = caml_call1(ops[11], par), + _m_ = attrs2[2], + _n_ = attrs1[2], + _o_ = caml_call1(ops[14], par); + caml_call5(Dictionary[8], set$1, set$1, _o_, _n_, _m_); + return caml_call3(ops[16], par, attrs1[4], attrs2[4]); + } + function update(ops, vdom, dom){ + var _d_ = vdom[1]; + switch(_d_[0]){ + case 0: + var match = dom[1]; + if(0 === match[0]){ + var el = dom[2], s2 = match[1], s1 = _d_[1]; + return caml_string_equal(s1, s2) + ? [0, dom, 0] + : (caml_call2(ops[8], el, s1), [0, [0, [0, s1], el], 0]); + } + break; + case 1: + var match$0 = dom[1]; + if(1 === match$0[0]){ + var + par = dom[2], + lst2 = match$0[3], + attrs2 = match$0[2], + tag2 = match$0[1], + lst1 = _d_[3], + attrs1 = _d_[2], + tag1 = _d_[1]; + if(caml_string_equal(tag1, tag2)){ + update_attributes(ops, par, attrs1, attrs2); + var + _e_ = update_children(ops, par, lst1, lst2, 0), + children = caml_call1(Stdlib_List[9], _e_); + return [0, [0, [1, tag2, attrs1, children], par], 0]; + } + } + break; + case 2: + var match$1 = dom[1]; + if(2 === match$1[0]){ + var + par$0 = dom[2], + lst2$0 = match$1[4], + attrs2$0 = match$1[3], + tag2$0 = match$1[2], + ns2 = match$1[1], + lst1$0 = _d_[4], + attrs1$0 = _d_[3], + tag1$0 = _d_[2], + ns1 = _d_[1]; + if(caml_string_equal(tag1$0, tag2$0) && caml_string_equal(ns1, ns2)){ + update_attributes(ops, par$0, attrs1$0, attrs2$0); + var + _f_ = update_children(ops, par$0, lst1$0, lst2$0, 0), + children$0 = caml_call1(Stdlib_List[9], _f_); + return [0, [0, [2, ns2, tag2$0, attrs1$0, children$0], par$0], 0]; + } + } + break; + default: + var match$2 = dom[1]; + if(3 === match$2[0]){ + var + par$1 = dom[2], + d2 = match$2[3], + attrs2$1 = match$2[2], + tag2$1 = match$2[1], + d1 = _d_[3], + attrs1$1 = _d_[2], + tag1$1 = _d_[1]; + if(caml_string_equal(tag1$1, tag2$1)){ + update_attributes(ops, par$1, attrs1$1, attrs2$1); + var children$1 = update_keyed(ops, par$1, d1, d2); + return [0, [0, [3, tag2$1, attrs1$1, children$1], par$1], 0]; + } + } + } + return [0, make(ops, vdom), 1]; + } + function update_keyed(ops, par, d1, d2){ + caml_call1(ops[7], par); + var d = [0, Dictionary[1]]; + function _c_(key, vdom){ + var match = caml_call2(Dictionary[2], key, d2); + if(match){ + var dom = match[1], dom$0 = update(ops, vdom, dom)[1], el = dom$0[2]; + caml_call2(ops[4], el, par); + d[1] = caml_call3(Dictionary[3], key, dom$0, d[1]); + return 0; + } + var dom$1 = make(ops, vdom), el$0 = dom$1[2]; + caml_call2(ops[4], el$0, par); + d[1] = caml_call3(Dictionary[3], key, dom$1, d[1]); + return 0; + } + caml_call2(Dictionary[7], _c_, d1); + return d[1]; + } + function update_children(ops, par, lst1, lst2, nlst2){ + var lst1$0 = lst1, lst2$0 = lst2, nlst2$0 = nlst2; + for(;;){ + if(! lst1$0){ + if(! lst2$0) return nlst2$0; + var lst2$2 = lst2$0[2], hd = lst2$0[1][2]; + caml_call2(ops[5], hd, par); + var lst1$0 = 0, lst2$0 = lst2$2; + continue; + } + var lst1$1 = lst1$0[2], hd1 = lst1$0[1]; + if(! lst2$0){ + var hd1$0 = make(ops, hd1), hd11 = hd1$0[2]; + caml_call2(ops[4], hd11, par); + var + nlst2$2 = [0, hd1$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = 0, + nlst2$0 = nlst2$2; + continue; + } + var + lst2$1 = lst2$0[2], + hd2 = lst2$0[1], + old_el = hd2[2], + match = update(ops, hd1, hd2), + created = match[2], + hd2$0 = match[1], + new_el = hd2$0[2]; + if(created) caml_call3(ops[6], old_el, new_el, par); + var + nlst2$1 = [0, hd2$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = lst2$1, + nlst2$0 = nlst2$1; + } + } + var + Fmlib_browser_Vdom = + [0, + Dictionary, + Attributes, + text, + node, + node_ns, + keyed, + element, + add_attributes, + make, + update_attributes, + update, + update_keyed, + update_children]; + runtime.caml_register_global(6, Fmlib_browser_Vdom, "Fmlib_browser__Vdom"); + return; + } + (globalThis)); + +//# 953 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Fmlib_js_Base = global_data.Fmlib_js__Base, + cst_col = " col: ", + cst_line = " line: ", + cst_assertion_failed_file = "assertion failed file: ", + cst_Uncaught_javascript_except = "Uncaught javascript exception", + cst_Uncaught_ocaml_exception = "Uncaught ocaml exception"; + function attempt(str, f, cleanup){ + try{var _c_ = caml_call1(f, 0); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib[5]){ + var + match = exn[2], + col = match[3], + line = match[2], + file = match[1], + _a_ = [0, cst_col, [0, caml_call1(Stdlib[33], col), 0]], + _b_ = + [0, + cst_assertion_failed_file, + [0, file, [0, cst_line, [0, caml_call1(Stdlib[33], line), _a_]]]], + msg = caml_call2(Stdlib_String[6], cst, _b_); + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + caml_call1(Fmlib_js_Base[3][4], msg); + return caml_call1(Fmlib_js_Base[3][3], str); + } + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + var match$0 = caml_call1(Fmlib_js_Base[3][1], exn); + if(match$0){ + var js_error = match$0[1]; + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_javascript_except); + return caml_call1(Fmlib_js_Base[3][2], js_error); + } + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_ocaml_exception); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + var Fmlib_browser_Assert_failure = [0, attempt]; + runtime.caml_register_global + (9, Fmlib_browser_Assert_failure, "Fmlib_browser__Assert_failure"); + return; + } + (globalThis)); + +//# 1023 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_random_ml = "src/browser/random.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, cst_src_browser_random_ml, 44, 4], + _b_ = [0, cst_src_browser_random_ml, 32, 4], + _a_ = [0, cst_src_browser_random_ml, 26, 4]; + function run(random){ + return caml_call1(random, caml_call1(Stdlib_Random[15][2], 0)); + } + function constant(a, param){return a;} + function symbol_bind(m, f, state){ + return caml_call2(f, caml_call1(m, state), state); + } + function map(f, m){ + function _j_(a){ + var _l_ = caml_call1(f, a); + return function(_m_){return _l_;}; + } + return function(_k_){return symbol_bind(m, _j_, _k_);}; + } + function int$0(bound, state){ + if(0 < bound) return caml_call2(Stdlib_Random[15][5], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function float$0(bound, state){ + if(0. <= bound) return caml_call2(Stdlib_Random[15][10], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + var bool = Stdlib_Random[15][11]; + function choose(lst){ + var arr = caml_call1(Stdlib_Array[10], lst), len = arr.length - 1; + function _d_(i){ + if(i >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _h_ = runtime.caml_check_bound(arr, i)[1 + i]; + return function(_i_){return _h_;}; + } + function _e_(_g_){return int$0(len, _g_);} + return function(_f_){return symbol_bind(_e_, _d_, _f_);}; + } + var + Fmlib_browser_Random = + [0, + run, + constant, + symbol_bind, + symbol_bind, + map, + int$0, + float$0, + bool, + choose]; + runtime.caml_register_global + (7, Fmlib_browser_Random, "Fmlib_browser__Random"); + return; + } + (globalThis)); + +//# 1102 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_loadend$1 = "loadend", + cst_src_browser_task_ml = "src/browser/task.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + Fmlib_js_Http_request = global_data.Fmlib_js__Http_request, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + _l_ = [0, cst_src_browser_task_ml, 183, 8], + _j_ = [1, -819565531], + _k_ = [1, -1056736433], + cst_loadend$0 = cst_loadend$1, + _i_ = [0, cst_src_browser_task_ml, 159, 8], + cst_loadend = cst_loadend$1, + _g_ = [0, 0], + _h_ = [1, -358247754], + _e_ = [0, 0], + _f_ = [1, -358247754], + _d_ = [0, 0], + _c_ = [0, 0], + _b_ = [0, 0], + cst_Exception_in_task_executio = "Exception in task execution", + _a_ = [0, cst_src_browser_task_ml, 11, 4]; + function absurd(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function continue$0(k, a){ + function _E_(param){return 0;} + function _F_(param){return caml_call1(k, a);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_task_executio, + _F_, + _E_); + } + function run(task, post, k){ + return caml_call2 + (task, + post, + function(param){ + if(0 === param[0]){var a = param[1]; return continue$0(k, a);} + var e = param[1]; + return absurd(e); + }); + } + function succeed(a, param, k){return continue$0(k, [0, a]);} + function fail(e, param, k){return continue$0(k, [1, e]);} + function result(r, param, k){return continue$0(k, r);} + function symbol_bind(m, f, post, k){ + return caml_call2 + (m, + post, + function(param){ + if(0 === param[0]){ + var a = param[1]; + return caml_call3(f, a, post, k); + } + var e = param[1]; + return continue$0(k, [1, e]); + }); + } + function map(f, m){ + function _y_(a){ + var _B_ = caml_call1(f, a); + return function(_C_, _D_){return succeed(_B_, _C_, _D_);}; + } + return function(_z_, _A_){return symbol_bind(m, _y_, _z_, _A_);}; + } + function make_succeed(f, m, post, k){ + return caml_call2 + (m, + post, + function(res){return continue$0(k, [0, caml_call1(f, res)]);}); + } + function log_string(s, param, k){ + caml_call1(Fmlib_js_Base[3][4], s); + return continue$0(k, _b_); + } + function log_value(v, param, k){ + caml_call1(Fmlib_js_Base[3][5], v); + return continue$0(k, _c_); + } + function sleep(ms, a, param, k){ + function _x_(param){return continue$0(k, [0, a]);} + caml_call2(Fmlib_js_Timer[1], _x_, ms); + return 0; + } + function next_tick(a){ + var _u_ = 0; + return function(_v_, _w_){return sleep(_u_, a, _v_, _w_);}; + } + function send_to_javascript(v, post, k){ + caml_call1(post, v); + return continue$0(k, _d_); + } + function focus(id, param, k){ + var + _s_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _t_ = caml_call1(Fmlib_js_Dom[7][3], _s_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _t_); + if(! match) return caml_call1(k, _f_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][15], el); + return continue$0(k, _e_); + } + function blur(id, param, k){ + var + _q_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _r_ = caml_call1(Fmlib_js_Dom[7][3], _q_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _r_); + if(! match) return continue$0(k, _h_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][16], el); + return continue$0(k, _g_); + } + function random(rand, param, k){ + return continue$0(k, [0, caml_call1(Fmlib_browser_Random[1], rand)]); + } + function http_text(meth, url, headers, body, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + return 200 === status + ? continue$0(k, [0, caml_call1(Fmlib_js_Http_request[6], req)]) + : continue$0(k, [1, [0, -264964567, status]]); + } + var _p_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend, handler, _p_); + } + function http_json(meth, url, headers, body, decode, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + if(200 !== status) return continue$0(k, [1, [0, -264964567, status]]); + var + _o_ = caml_call1(Fmlib_js_Http_request[5], req), + match = caml_call1(Fmlib_js_Base[1][13], _o_); + if(! match) return continue$0(k, _k_); + var v = match[1], match$0 = caml_call1(decode, v); + if(! match$0) return continue$0(k, _j_); + var a = match$0[1]; + return continue$0(k, [0, a]); + } + var _n_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend$0, handler, _n_); + } + function now(param, k){ + return continue$0(k, [0, caml_call1(Fmlib_js_Date[1], 0)]); + } + function time_zone(param, k){ + var _m_ = caml_call1(Fmlib_js_Date[1], 0); + return continue$0(k, [0, caml_call1(Fmlib_js_Date[4], _m_)]); + } + var + Fmlib_browser_Task = + [0, + absurd, + continue$0, + run, + succeed, + succeed, + fail, + result, + symbol_bind, + symbol_bind, + map, + make_succeed, + log_string, + log_value, + sleep, + next_tick, + send_to_javascript, + focus, + blur, + random, + http_text, + http_json, + now, + time_zone]; + runtime.caml_register_global(24, Fmlib_browser_Task, "Fmlib_browser__Task"); + return; + } + (globalThis)); + +//# 1323 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + cst_visibilityState = "visibilityState", + cst_target = "target", + cst_visibilitychange = "visibilitychange", + cst_innerHeight = "innerHeight", + cst_innerWidth = "innerWidth", + cst_currentTarget = "currentTarget", + cst_resize = "resize", + cst_mouseup = "mouseup", + cst_mousemove = "mousemove", + cst_mousedown = "mousedown", + cst_keyup = "keyup", + cst_keydown = "keydown", + cst_clientY = "clientY", + cst_clientX = "clientX", + cst_key = "key", + none = 0; + function batch(lst){return [4, lst];} + function on_window(event_type, decode){ + return [0, + event_type, + [0, + Fmlib_browser_Event_flag[4], + Fmlib_browser_Event_flag[2], + decode]]; + } + function every(ms, callback){return [1, ms, callback];} + function on_message(decode){return [2, decode];} + function on_url_request(f){return [3, f];} + function map(f, sub){ + function map(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var decode = param[2], event_type = param[1]; + return [0, + event_type, + caml_call2(Fmlib_browser_Handler[3][3], f, decode)]; + case 1: + var g = param[2], millis = param[1]; + return [1, + millis, + function(time){return caml_call1(f, caml_call1(g, time));}]; + case 2: + var decode$0 = param[1]; + return [2, caml_call2(Fmlib_js_Base[2][7], f, decode$0)]; + case 3: + var g$0 = param[1]; + return [3, function(url){return caml_call1(f, caml_call1(g$0, url));}]; + default: + var lst = param[1]; return [4, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(sub); + } + function decode_key_event(f){ + var _r_ = caml_call2(Fmlib_js_Base[2][16], cst_key, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][7], f, _r_); + } + function decode_mouse_event(f){ + function _m_(x){ + function _o_(y){ + var _q_ = caml_call2(f, x, y); + return caml_call1(Fmlib_js_Base[2][1], _q_); + } + var + _p_ = + caml_call2(Fmlib_js_Base[2][16], cst_clientY, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _p_, _o_); + } + var + _n_ = caml_call2(Fmlib_js_Base[2][16], cst_clientX, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _n_, _m_); + } + function on_keydown(f){return on_window(cst_keydown, decode_key_event(f));} + function on_keyup(f){return on_window(cst_keyup, decode_key_event(f));} + function on_mouse_down(f){ + return on_window(cst_mousedown, decode_mouse_event(f)); + } + function on_mouse_move(f){ + return on_window(cst_mousemove, decode_mouse_event(f)); + } + function on_mouse_up(f){ + return on_window(cst_mouseup, decode_mouse_event(f)); + } + function on_resize(f){ + function _e_(param){ + function _g_(width){ + function _j_(height){ + var _l_ = caml_call2(f, width, height); + return caml_call1(Fmlib_js_Base[2][1], _l_); + } + var + _k_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_innerHeight, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _k_, _j_); + } + var + _h_ = + caml_call2(Fmlib_js_Base[2][16], cst_innerWidth, Fmlib_js_Base[2][11]), + _i_ = caml_call2(Fmlib_js_Base[2][4], _h_, _g_); + return caml_call2(Fmlib_js_Base[2][16], cst_currentTarget, _i_); + } + var + _f_ = caml_call1(Fmlib_js_Base[2][1], 0), + decode = caml_call2(Fmlib_js_Base[2][4], _f_, _e_); + return on_window(cst_resize, decode); + } + function on_visibility_change(f){ + function _a_(state){ + var _d_ = caml_call1(f, state); + return caml_call1(Fmlib_js_Base[2][1], _d_); + } + var + _b_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_visibilityState, Fmlib_js_Base[2][13]), + _c_ = caml_call2(Fmlib_js_Base[2][4], _b_, _a_), + decode = caml_call2(Fmlib_js_Base[2][16], cst_target, _c_); + return on_window(cst_visibilitychange, decode); + } + var + Fmlib_browser_Subscription = + [0, + none, + batch, + on_window, + every, + on_message, + on_url_request, + map, + decode_key_event, + decode_mouse_event, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change]; + runtime.caml_register_global + (19, Fmlib_browser_Subscription, "Fmlib_browser__Subscription"); + return; + } + (globalThis)); + +//# 1491 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Stdlib_Int = global_data.Stdlib__Int, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + String_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_String[9]]), + Int_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_Int[9]]), + Intionary = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = [0, Dictionary[1], Intionary[1], 0, 0]; + function make(sub){ + function make(subs, param){ + if(typeof param === "number") return subs; + switch(param[0]){ + case 0: + var + handler = param[2], + event_type = param[1], + _i_ = subs[4], + _j_ = subs[3], + _k_ = subs[2], + _l_ = subs[1], + _m_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }; + return [0, + caml_call3(Dictionary[4], event_type, _m_, _l_), + _k_, + _j_, + _i_]; + case 1: + var + callback = param[2], + millis = param[1], + _n_ = subs[4], + _o_ = subs[3], + _p_ = subs[2], + _q_ = + function(param){ + if(! param) return [0, callback, 0]; + var lst = param[1]; + return [0, callback, lst]; + }, + _r_ = caml_call3(Intionary[4], millis, _q_, _p_); + return [0, subs[1], _r_, _o_, _n_]; + case 2: + var decode = param[1], _s_ = subs[4], _t_ = subs[3] || [0, decode]; + return [0, subs[1], subs[2], _t_, _s_]; + case 3: + var f = param[1], _u_ = subs[4] || [0, f]; + return [0, subs[1], subs[2], subs[3], _u_]; + default: + var lst = param[1]; + return caml_call3(Stdlib_List[25], make, subs, lst); + } + } + return make(empty, sub); + } + var Subs = [0, empty, make]; + function make$0(dispatch, sub){ + var + subs = caml_call1(Subs[2], sub), + window = caml_call1(Fmlib_browser_Handler[4][3], 0), + _f_ = subs[1], + _g_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _h_ = caml_call1(Fmlib_js_Dom[7][2], _g_); + caml_call4(Fmlib_browser_Handler[4][5], _h_, dispatch, _f_, window); + var timers = caml_call1(Fmlib_browser_Handler[5][3], 0); + caml_call3(Fmlib_browser_Handler[5][7], dispatch, subs[2], timers); + var url_request = caml_call1(Fmlib_browser_Handler[6][1], 0); + caml_call3(Fmlib_browser_Handler[6][7], dispatch, subs[4], url_request); + return [0, subs, window, timers, url_request]; + } + function update(dispatch, sub, s){ + var + subs = caml_call1(Subs[2], sub), + _a_ = s[2], + _b_ = s[1][1], + _c_ = subs[1], + _d_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _e_ = caml_call1(Fmlib_js_Dom[7][2], _d_); + caml_call5(Fmlib_browser_Handler[4][6], _e_, dispatch, _c_, _b_, _a_); + caml_call4(Fmlib_browser_Handler[5][8], dispatch, subs[2], s[1][2], s[3]); + caml_call4(Fmlib_browser_Handler[6][8], dispatch, subs[4], s[1][4], s[4]); + return [0, subs, s[2], s[3], s[4]]; + } + var + Fmlib_browser_Subscriptions = + [0, String_map, Int_map, Intionary, Dictionary, Subs, make$0, update]; + runtime.caml_register_global + (7, Fmlib_browser_Subscriptions, "Fmlib_browser__Subscriptions"); + return; + } + (globalThis)); + +//# 1620 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Stdlib_List = global_data.Stdlib__List, + none = 0; + function batch(lst){return [2, lst];} + function perform(task){return [0, task];} + function just_do(task){return [1, task];} + function attempt(f, task){ + return [0, caml_call2(Fmlib_browser_Task[11], f, task)]; + } + function map(f, cmd){ + function map(cmd){ + if(typeof cmd === "number") return 0; + switch(cmd[0]){ + case 0: + var task = cmd[1]; + return [0, caml_call2(Fmlib_browser_Task[10], f, task)]; + case 1: + return cmd; + default: + var lst = cmd[1]; return [2, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(cmd); + } + function execute(post, dispatch, cmd){ + function exe(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var task = param[1]; + return caml_call3(Fmlib_browser_Task[3], task, post, dispatch); + case 1: + var task$0 = param[1], _a_ = function(param){return 0;}; + return caml_call3(Fmlib_browser_Task[3], task$0, post, _a_); + default: + var lst = param[1]; return caml_call2(Stdlib_List[17], exe, lst); + } + } + return exe(cmd); + } + var + Fmlib_browser_Command = + [0, none, batch, perform, just_do, attempt, map, execute]; + runtime.caml_register_global + (2, Fmlib_browser_Command, "Fmlib_browser__Command"); + return; + } + (globalThis)); + +//# 1687 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_application_already_initia$1 = "application already initialized", + cst_cannot_decode_initialisati$1 = "cannot decode initialisation data", + cst_data$1 = "data", + cst_init$1 = "init", + cst_load$4 = "load", + cst_onMessage$1 = "onMessage", + cst_post$1 = "post", + cst_src_browser_browser_ml = "src/browser/browser.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "'", + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Subscriptions = global_data.Fmlib_browser__Subscriptions, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Stdlib = global_data.Stdlib, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + cst_Exception_in_update_subscr = + "Exception in 'update_subscriptions' of Fmlib_browser", + _d_ = [0, cst_src_browser_browser_ml, 353, 4], + cst_load$3 = cst_load$4, + cst_post$0 = cst_post$1, + cst_init$0 = cst_init$1, + cst_application_already_initia$0 = cst_application_already_initia$1, + cst_load$2 = cst_load$4, + cst_cannot_decode_initialisati$0 = cst_cannot_decode_initialisati$1, + cst_data$0 = cst_data$1, + cst_onMessage$0 = cst_onMessage$1, + cst_post = cst_post$1, + cst_init = cst_init$1, + cst_Cannot_find_element = "Cannot find element ", + cst_application_already_initia = cst_application_already_initia$1, + cst_load$1 = cst_load$4, + cst_cannot_decode_initialisati = cst_cannot_decode_initialisati$1, + cst_element_id = "element_id", + cst_data = cst_data$1, + cst_onMessage = cst_onMessage$1, + cst_load$0 = cst_load$4, + cst_load = cst_load$4, + cst_receive_message_cannot_dec = + "receive_message: cannot decode message from javascript", + cst_receive_message_event_not_ = "receive_message: event not subscribed", + cst_receive_message_subscripti = + "receive_message: subscriptions not yet initialized", + cst_receive_message_applicatio = + "receive_message: application not yet initialized", + cst_Exception_in_update = "Exception in 'update'", + cst_subscriptioin = "subscriptioin", + cst_view = "view", + cst_Exception_in = "Exception in '", + cst_Exception_in_update_dom_of = + "Exception in 'update_dom' of Fmlib_browser", + _c_ = [0, cst_src_browser_browser_ml, 341, 4], + _b_ = [0, cst_src_browser_browser_ml, 94, 12], + _a_ = [0, cst_src_browser_browser_ml, 85, 12]; + function document(param){ + var _bE_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][3], _bE_); + } + function dom_operations(dispatch){ + function get_both(param){ + var match = param[2]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var el = match[1]; + return el; + } + function get_element(param){ + var _bD_ = param[2]; + if(! _bD_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var el = _bD_[1][1]; + return el; + } + function _a5_(el, dict1, dict2){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bC_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bC_); + return caml_call5 + (Fmlib_browser_Handler[4][6], + target, + dispatch, + dict1, + dict2, + reals); + } + function _a6_(el, dict){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bB_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bB_); + return caml_call4 + (Fmlib_browser_Handler[4][5], target, dispatch, dict, reals); + } + function _a7_(el, key){ + var _bA_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][14], key, _bA_); + } + function _a8_(el, key){ + var _bz_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][12], key, _bz_); + } + function _a9_(el, key){ + var _bx_ = get_element(el), _by_ = caml_call1(Fmlib_js_Dom[3][10], _bx_); + return caml_call2(Fmlib_js_Dom[2][2], key, _by_); + } + function _a__(el, key, value){ + var _bw_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][13], key, value, _bw_); + } + function _a$_(el, key, value){ + var _bv_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][11], key, value, _bv_); + } + function _ba_(el, key, value){ + var _bt_ = get_element(el), _bu_ = caml_call1(Fmlib_js_Dom[3][10], _bt_); + return caml_call3(Fmlib_js_Dom[2][1], key, value, _bu_); + } + function _bb_(param, text){ + var node = param[1]; + return caml_call2(Fmlib_js_Dom[1][10], text, node); + } + function _bc_(param){ + var par = param[1]; + return caml_call1(Fmlib_js_Dom[1][8], par); + } + function _bd_(param, _bs_, _br_){ + var par = _br_[1], new_child = _bs_[1], old_child = param[1]; + return caml_call3(Fmlib_js_Dom[1][7], new_child, old_child, par); + } + function _be_(param, _bq_){ + var par = _bq_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][6], child, par); + } + function _bf_(param, _bp_){ + var par = _bp_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][5], child, par); + } + function _bg_(namespace, tag, lst){ + var + doc = document(0), + el = caml_call3(Fmlib_js_Dom[4][7], namespace, tag, doc); + function _bm_(param){ + var child = param[1], _bo_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bo_); + } + caml_call2(Stdlib_List[17], _bm_, lst); + var _bn_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bn_]; + } + function _bh_(tag, lst){ + var doc = document(0), el = caml_call2(Fmlib_js_Dom[4][5], tag, doc); + function _bj_(param){ + var child = param[1], _bl_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bl_); + } + caml_call2(Stdlib_List[17], _bj_, lst); + var _bk_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bk_]; + } + return [0, + function(s){ + var _bi_ = document(0); + return [0, caml_call2(Fmlib_js_Dom[4][6], s, _bi_), 0]; + }, + _bh_, + _bg_, + _bf_, + _be_, + _bd_, + _bc_, + _bb_, + _ba_, + _a$_, + _a__, + _a9_, + _a8_, + _a7_, + _a6_, + _a5_]; + } + function dispatch(data, msg){ + function update_data(state){ + var + state_different = 1 - (state === data[1] ? 1 : 0), + _a3_ = data[2], + _a4_ = _a3_ || state_different; + data[2] = _a4_; + return state_different + ? (data[1] = state, update_subscriptions(data)) + : state_different; + } + var match = data[6]; + switch(match[0]){ + case 0: + var update = match[3]; + return update_data(caml_call2(update, data[1], msg)); + case 1: + var + post = match[4], + update$0 = match[3], + match$0 = caml_call2(update$0, data[1], msg), + cmd = match$0[2], + state = match$0[1]; + update_data(state); + var _aZ_ = function(_a1_){return dispatch_next(data, _a1_);}; + return caml_call3(Fmlib_browser_Command[7], post, _aZ_, cmd); + default: + var + post$0 = match[4], + update$1 = match[3], + match$1 = caml_call2(update$1, data[1], msg), + cmd$0 = match$1[2], + state$0 = match$1[1]; + update_data(state$0); + var _a0_ = function(_a2_){return dispatch_next(data, _a2_);}; + return caml_call3(Fmlib_browser_Command[7], post$0, _a0_, cmd$0); + } + } + function dispatch_next(data, msg){ + var _aX_ = 0; + function _aY_(param){return dispatch(data, msg);} + caml_call2(Fmlib_js_Timer[1], _aY_, _aX_); + return 0; + } + function update_subscriptions(data){ + function update(param){ + var match = data[4], sub = data[6][2]; + if(! match){ + var + _aT_ = caml_call1(sub, data[1]), + _aU_ = function(_aW_){return dispatch(data, _aW_);}; + data[4] = [0, caml_call2(Fmlib_browser_Subscriptions[6], _aU_, _aT_)]; + return 0; + } + var subs = match[1]; + if(! data[2]) return 0; + var _aR_ = caml_call1(sub, data[1]); + function _aS_(_aV_){return dispatch(data, _aV_);} + data[4] = + [0, caml_call3(Fmlib_browser_Subscriptions[7], _aS_, _aR_, subs)]; + return 0; + } + function _aQ_(param){return 0;} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_subscr, + update, + _aQ_); + } + function put_below_root(data, dom){ + var root_node = caml_call1(Fmlib_js_Dom[3][1], data[5]); + caml_call1(Fmlib_js_Dom[1][8], root_node); + var _aP_ = caml_call1(Fmlib_browser_Vdom[7], dom)[1]; + return caml_call2(Fmlib_js_Dom[1][5], _aP_, root_node); + } + function update_dom(data){ + function update(param){ + function vdom(data){ + var match = data[6]; + switch(match[0]){ + case 0: + var + view = match[1], + _aM_ = function(param){return 0;}, + match$1 = [0, caml_call1(view, data[1]), _aM_]; + break; + case 1: + var + view$0 = match[1], + _aN_ = function(param){return 0;}, + match$1 = [0, caml_call1(view$0, data[1]), _aN_]; + break; + default: + var + view$1 = match[1], + match$0 = caml_call1(view$1, data[1]), + title = match$0[2], + vdom = match$0[1], + match$1 = + [0, + vdom, + function(param){ + var _aO_ = document(0); + return caml_call2(Fmlib_js_Dom[4][2], title, _aO_); + }]; + } + var set_title = match$1[2], vdom$0 = match$1[1]; + set_title(0); + return vdom$0; + } + var match = data[3]; + if(! match){ + var + _aI_ = vdom(data), + _aJ_ = dom_operations(function(_aL_){return dispatch(data, _aL_);}), + dom$1 = caml_call2(Fmlib_browser_Vdom[9], _aJ_, _aI_); + data[3] = [0, dom$1]; + return put_below_root(data, dom$1); + } + var dom = match[1], _aE_ = data[2]; + if(_aE_){ + var + _aF_ = vdom(data), + _aG_ = dom_operations(function(_aK_){return dispatch(data, _aK_);}), + match$0 = caml_call3(Fmlib_browser_Vdom[11], _aG_, _aF_, dom), + created = match$0[2], + dom$0 = match$0[1]; + if(created) put_below_root(data, dom$0); + data[3] = [0, dom$0]; + var _aH_ = 0; + } + else + var _aH_ = _aE_; + return _aH_; + } + function cleanup(param){data[2] = 0; return 0;} + caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_dom_of, + update, + cleanup); + cleanup(0); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 0; + } + function on_next_animation(f){ + var _aD_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call2(Fmlib_js_Dom[7][6], f, _aD_); + } + function animate(data, param){ + update_dom(data); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + return on_next_animation(function(_aC_){return animate(data, _aC_);}); + } + function wrap_state_fun(str, f, state){ + function _ay_(param){return 0;} + function _az_(param){return caml_call1(f, state);} + var + _aA_ = caml_call2(Stdlib[28], str, cst), + _aB_ = caml_call2(Stdlib[28], cst_Exception_in, _aA_); + return caml_call3(Fmlib_browser_Assert_failure[1], _aB_, _az_, _ay_); + } + function wrap_view(view, state){ + return wrap_state_fun(cst_view, view, state); + } + function wrap_subscription(view, state){ + return wrap_state_fun(cst_subscriptioin, view, state); + } + function wrap_update(update, state, message){ + function _aw_(param){return 0;} + function _ax_(param){return caml_call2(update, state, message);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update, + _ax_, + _aw_); + } + function receive_message(data){ + function post(v){ + var match = data[1]; + if(! match){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_applicatio); + return Fmlib_js_Base[1][1]; + } + var data$0 = match[1], match$0 = data$0[4]; + if(! match$0){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_subscripti); + return Fmlib_js_Base[1][1]; + } + var subs = match$0[1], match$1 = subs[1][3]; + if(! match$1){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_event_not_); + return Fmlib_js_Base[1][1]; + } + var decode = match$1[1], match$2 = caml_call1(decode, v); + if(match$2){ + var m = match$2[1]; + dispatch(data$0, m); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_cannot_dec); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + return caml_call1(Fmlib_js_Base[1][9], post); + } + function start_application(data, command, post){ + update_subscriptions(data); + update_dom(data); + function _at_(_av_){return dispatch_next(data, _av_);} + caml_call3(Fmlib_browser_Command[7], post, _at_, command); + return on_next_animation(function(_au_){return animate(data, _au_);}); + } + function make_sandbox(state, view, sub, update, param){ + function _ak_(_ar_, _as_){return wrap_update(update, _ar_, _as_);} + function _al_(_aq_){return wrap_subscription(sub, _aq_);} + var + _am_ = [0, function(_ap_){return wrap_view(view, _ap_);}, _al_, _ak_], + _an_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _an_), _am_]; + update_subscriptions(data); + update_dom(data); + return on_next_animation(function(_ao_){return animate(data, _ao_);}); + } + function sandbox(state, view, update){ + var + _af_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ag_ = caml_call1(Fmlib_js_Dom[7][2], _af_); + function _ah_(param){return Fmlib_browser_Subscription[1];} + function _ai_(_aj_){return make_sandbox(state, view, _ah_, update, _aj_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load, _ai_, _ag_); + } + function sandbox_plus(state, view, sub, update){ + var + _ab_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ac_ = caml_call1(Fmlib_js_Dom[7][2], _ab_); + function _ad_(_ae_){return make_sandbox(state, view, sub, update, _ae_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load$0, _ad_, _ac_); + } + function element(name, decode$0, view, subs, update){ + var dataref = [0, 0], _K_ = [0, cst_post, receive_message(dataref)]; + function _I_(post){ + function _Y_(param){ + var cmd = param[2], state = param[1]; + function ___(element_id){ + var + _aa_ = + [0, + element_id, + state, + cmd, + function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _aa_); + } + var + _$_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_element_id, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][4], _$_, ___); + } + var _Z_ = caml_call2(Fmlib_js_Base[2][16], cst_data, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _Z_, _Y_); + } + var + _J_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _J_, _I_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[4], + command = match$0[3], + state = match$0[2], + element_id = match$0[1], + _N_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _O_ = caml_call1(Fmlib_js_Dom[7][2], _N_), + _P_ = + function(param){ + var + _Q_ = document(0), + match = caml_call2(Fmlib_js_Dom[4][4], element_id, _Q_); + if(match){ + var + root = match[1], + _R_ = function(_W_, _X_){return wrap_update(update, _W_, _X_);}, + _S_ = function(_V_){return wrap_subscription(subs, _V_);}, + data = + [0, + state, + 0, + 0, + 0, + root, + [1, + function(_U_){return wrap_view(view, _U_);}, + _S_, + _R_, + post]]; + dataref[1] = [0, data]; + return start_application(data, command, post); + } + var + _T_ = caml_call2(Stdlib[28], cst_Cannot_find_element, element_id); + return caml_call1(Fmlib_js_Base[3][4], _T_); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$1, _P_, _O_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _L_ = [0, [0, cst_init, caml_call1(Fmlib_js_Base[1][9], init)], _K_], + _M_ = caml_call1(Fmlib_js_Base[1][7], _L_); + return caml_call2(Fmlib_js_Base[3][8], name, _M_); + } + function application(name, decode$0, view, subs, update){ + var dataref = [0, 0], _r_ = [0, cst_post$0, receive_message(dataref)]; + function _p_(post){ + function _F_(param){ + var + cmd = param[2], + state = param[1], + _H_ = [0, state, cmd, function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _H_); + } + var _G_ = caml_call2(Fmlib_js_Base[2][16], cst_data$0, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _G_, _F_); + } + var + _q_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage$0, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _q_, _p_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia$0); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[3], + command = match$0[2], + state = match$0[1], + _u_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _v_ = caml_call1(Fmlib_js_Dom[7][2], _u_), + _w_ = + function(param){ + function _x_(_D_, _E_){return wrap_update(update, _D_, _E_);} + function _y_(_C_){return wrap_subscription(subs, _C_);} + var + _z_ = + [2, function(_B_){return wrap_view(view, _B_);}, _y_, _x_, post], + _A_ = document(0), + data = + [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _A_), _z_]; + dataref[1] = [0, data]; + return start_application(data, command, post); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$2, _w_, _v_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati$0); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _s_ = [0, [0, cst_init$0, caml_call1(Fmlib_js_Base[1][9], init)], _r_], + _t_ = caml_call1(Fmlib_js_Base[1][7], _s_); + return caml_call2(Fmlib_js_Base[3][8], name, _t_); + } + function basic_application(state, command, view, sub, update){ + function post(param){return 0;} + var + _e_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _f_ = caml_call1(Fmlib_js_Dom[7][2], _e_); + function _g_(param){ + function _h_(_n_, _o_){return wrap_update(update, _n_, _o_);} + function _i_(_m_){return wrap_subscription(sub, _m_);} + var + _j_ = [2, function(_l_){return wrap_view(view, _l_);}, _i_, _h_, post], + _k_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _k_), _j_]; + return start_application(data, command, post); + } + return caml_call3(Fmlib_js_Event_target[1], cst_load$3, _g_, _f_); + } + var + Fmlib_browser_Browser = + [0, sandbox, sandbox_plus, element, basic_application, application]; + runtime.caml_register_global + (47, Fmlib_browser_Browser, "Fmlib_browser__Browser"); + return; + } + (globalThis)); + +//# 2319 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_input$1 = "input", + cst_value$1 = "value"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_browser_Time = global_data.Fmlib_browser__Time, + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Attribute = global_data.Fmlib_browser__Attribute, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Fmlib_browser_Browser = global_data.Fmlib_browser__Browser, + constant = Fmlib_browser_Random[2], + symbol_bind = Fmlib_browser_Random[3], + let$0 = Fmlib_browser_Random[4], + map = Fmlib_browser_Random[5], + int$0 = Fmlib_browser_Random[6], + float$0 = Fmlib_browser_Random[7], + bool = Fmlib_browser_Random[8], + choose = Fmlib_browser_Random[9], + Zone = Fmlib_browser_Time[1], + zero = Fmlib_browser_Time[2], + year = Fmlib_browser_Time[4], + month = Fmlib_browser_Time[5], + day_of_month = Fmlib_browser_Time[6], + hour = Fmlib_browser_Time[7], + minute = Fmlib_browser_Time[8], + second = Fmlib_browser_Time[9], + milli_second = Fmlib_browser_Time[10], + succeed = Fmlib_browser_Task[4], + return$0 = Fmlib_browser_Task[5], + fail = Fmlib_browser_Task[6], + result = Fmlib_browser_Task[7], + symbol_bind$0 = Fmlib_browser_Task[8], + let$1 = Fmlib_browser_Task[9], + map$0 = Fmlib_browser_Task[10], + log_string = Fmlib_browser_Task[12], + log_value = Fmlib_browser_Task[13], + sleep = Fmlib_browser_Task[14], + next_tick = Fmlib_browser_Task[15], + send_to_javascript = Fmlib_browser_Task[16], + focus = Fmlib_browser_Task[17], + blur = Fmlib_browser_Task[18], + random = Fmlib_browser_Task[19], + http_text = Fmlib_browser_Task[20], + http_json = Fmlib_browser_Task[21], + now = Fmlib_browser_Task[22], + time_zone = Fmlib_browser_Task[23], + include = Fmlib_js_Base[1], + null$0 = include[1], + int$1 = include[3], + float$1 = include[4], + bool$0 = include[5], + string = include[6], + object = include[7], + array = include[8], + prevent = Fmlib_browser_Event_flag[1], + no_prevent = Fmlib_browser_Event_flag[2], + stop = Fmlib_browser_Event_flag[3], + no_stop = Fmlib_browser_Event_flag[4], + Event_flag = [0, prevent, no_prevent, stop, no_stop], + include$0 = Fmlib_js_Base[2], + return$1 = include$0[1], + fail$0 = include$0[2], + let$2 = include$0[4], + symbol_bind$1 = include$0[5], + symbol = include$0[6], + map$1 = include$0[7], + null$1 = include$0[8], + undefined$0 = include$0[9], + float$2 = include$0[10], + int$2 = include$0[11], + bool$1 = include$0[12], + string$0 = include$0[13], + field = include$0[16], + array$0 = include$0[17], + option = include$0[18], + cst_http_www_w3_org_2000_svg = "http://www.w3.org/2000/svg", + cst_li = "li", + cst_ul = "ul", + cst_ol = "ol", + cst_select = "select", + cst_textarea = "textarea", + cst_label = "label", + cst_input$0 = cst_input$1, + cst_button = "button", + cst_p = "p", + cst_pre = "pre", + cst_span = "span", + cst_div = "div", + cst_h6 = "h6", + cst_h5 = "h5", + cst_h4 = "h4", + cst_h3 = "h3", + cst_h2 = "h2", + cst_h1 = "h1", + cst_value$0 = cst_value$1, + cst_target = "target", + cst_input = cst_input$1, + cst_placeholder = "placeholder", + cst_value = cst_value$1, + cst_title = "title", + cst_src = "src", + cst_href = "href", + cst_class = "class", + cst_id = "id", + cst_border_color = "border-color", + cst_border_width = "border-width", + cst_border_style = "border-style", + cst_padding = "padding", + cst_margin = "margin", + cst_width = "width", + cst_height = "height", + cst_background_color = "background-color", + cst_color = "color", + cst_font_size = "font-size", + cst_click = "click"; + function run(decode, v){return caml_call1(decode, v);} + var + none = Fmlib_browser_Command[1], + batch = Fmlib_browser_Command[2], + perform = Fmlib_browser_Command[3], + just_do = Fmlib_browser_Command[4], + attempt = Fmlib_browser_Command[5], + map$2 = Fmlib_browser_Command[6], + none$0 = Fmlib_browser_Subscription[1], + batch$0 = Fmlib_browser_Subscription[2], + on_window = Fmlib_browser_Subscription[3], + every = Fmlib_browser_Subscription[4], + on_message = Fmlib_browser_Subscription[5], + map$3 = Fmlib_browser_Subscription[7], + on_keydown = Fmlib_browser_Subscription[10], + on_keyup = Fmlib_browser_Subscription[11], + on_mouse_down = Fmlib_browser_Subscription[12], + on_mouse_move = Fmlib_browser_Subscription[13], + on_mouse_up = Fmlib_browser_Subscription[14], + on_resize = Fmlib_browser_Subscription[15], + on_visibility_change = Fmlib_browser_Subscription[16]; + function debug(str){return caml_call1(Fmlib_js_Base[3][4], str);} + function debug_value(v){return caml_call1(Fmlib_js_Base[3][5], v);} + var + style = Fmlib_browser_Attribute[1], + property = Fmlib_browser_Attribute[2], + attribute = Fmlib_browser_Attribute[3], + handler = Fmlib_browser_Attribute[4]; + function on(key, decode){ + return caml_call4(handler, key, Event_flag[4], Event_flag[2], decode); + } + function on_click(msg){return on(cst_click, caml_call1(return$1, msg));} + function font_size(size){return caml_call2(style, cst_font_size, size);} + function color(color){return caml_call2(style, cst_color, color);} + function background_color(color){ + return caml_call2(style, cst_background_color, color); + } + function height(value){return caml_call2(style, cst_height, value);} + function width(value){return caml_call2(style, cst_width, value);} + function margin(value){return caml_call2(style, cst_margin, value);} + function padding(value){return caml_call2(style, cst_padding, value);} + function border_style(value){ + return caml_call2(style, cst_border_style, value); + } + function border_width(value){ + return caml_call2(style, cst_border_width, value); + } + function border_color(value){ + return caml_call2(style, cst_border_color, value); + } + function id(value){return caml_call2(attribute, cst_id, value);} + function class$0(value){return caml_call2(attribute, cst_class, value);} + function href(value){return caml_call2(attribute, cst_href, value);} + function src(value){return caml_call2(attribute, cst_src, value);} + function title(value){return caml_call2(attribute, cst_title, value);} + function value(value){ + return caml_call2(property, cst_value, caml_call1(string, value)); + } + function placeholder(value){ + return caml_call2(attribute, cst_placeholder, value); + } + function on_input(f){ + var + decode = + caml_call2 + (field, + cst_target, + caml_call2(field, cst_value$0, caml_call2(map$1, f, string$0))); + return caml_call4 + (handler, cst_input, Event_flag[3], Event_flag[2], decode); + } + var + Attribute = + [0, + style, + property, + attribute, + handler, + on, + on_click, + font_size, + color, + background_color, + height, + width, + margin, + padding, + border_style, + border_width, + border_color, + id, + class$0, + href, + src, + title, + value, + placeholder, + on_input], + text = Fmlib_browser_Vdom[3], + node = Fmlib_browser_Vdom[4], + node_ns = Fmlib_browser_Vdom[5], + keyed = Fmlib_browser_Vdom[6]; + function h1(attrs, nodes){return caml_call3(node, cst_h1, attrs, nodes);} + function h2(attrs, nodes){return caml_call3(node, cst_h2, attrs, nodes);} + function h3(attrs, nodes){return caml_call3(node, cst_h3, attrs, nodes);} + function h4(attrs, nodes){return caml_call3(node, cst_h4, attrs, nodes);} + function h5(attrs, nodes){return caml_call3(node, cst_h5, attrs, nodes);} + function h6(attrs, nodes){return caml_call3(node, cst_h6, attrs, nodes);} + function div(attrs, nodes){return caml_call3(node, cst_div, attrs, nodes);} + function span(attrs, nodes){ + return caml_call3(node, cst_span, attrs, nodes); + } + function pre(attrs, nodes){return caml_call3(node, cst_pre, attrs, nodes);} + function p(attrs, nodes){return caml_call3(node, cst_p, attrs, nodes);} + function button(attrs, nodes){ + return caml_call3(node, cst_button, attrs, nodes); + } + function input(attrs, nodes){ + return caml_call3(node, cst_input$0, attrs, nodes); + } + function label(attrs, nodes){ + return caml_call3(node, cst_label, attrs, nodes); + } + function textarea(attrs, nodes){ + return caml_call3(node, cst_textarea, attrs, nodes); + } + function select(attrs, nodes){ + return caml_call3(node, cst_select, attrs, nodes); + } + function ol(attrs, nodes){return caml_call3(node, cst_ol, attrs, nodes);} + function ul(attrs, nodes){return caml_call3(node, cst_ul, attrs, nodes);} + function li(attrs, nodes){return caml_call3(node, cst_li, attrs, nodes);} + function svg_node(tag, attrs, nodes){ + return caml_call4 + (node_ns, cst_http_www_w3_org_2000_svg, tag, attrs, nodes); + } + var + sandbox = Fmlib_browser_Browser[1], + sandbox_plus = Fmlib_browser_Browser[2], + element = Fmlib_browser_Browser[3], + basic_application = Fmlib_browser_Browser[4], + application = Fmlib_browser_Browser[5], + Fmlib_browser = + [0, + [0, constant, symbol_bind, let$0, map, int$0, float$0, bool, choose], + [0, + Zone, + zero, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second], + Event_flag, + [0, null$0, string, int$1, bool$0, float$1, object, array], + [0, + run, + return$1, + fail$0, + symbol_bind$1, + let$2, + map$1, + symbol, + null$1, + undefined$0, + int$2, + bool$1, + float$2, + string$0, + field, + array$0, + option], + Attribute, + [0, + text, + node, + node_ns, + svg_node, + keyed, + h1, + h2, + h3, + h4, + h5, + h6, + div, + span, + pre, + p, + button, + input, + label, + textarea, + select, + ol, + ul, + li], + [0, + succeed, + return$0, + fail, + result, + symbol_bind$0, + let$1, + map$0, + log_string, + log_value, + send_to_javascript, + focus, + blur, + sleep, + next_tick, + now, + time_zone, + random, + http_text, + http_json], + [0, none, batch, perform, just_do, attempt, map$2], + [0, + none$0, + batch$0, + map$3, + on_window, + on_message, + every, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change], + debug, + debug_value, + sandbox, + sandbox_plus, + application, + basic_application, + element]; + runtime.caml_register_global(50, Fmlib_browser, "Fmlib_browser"); + return; + } + (globalThis)); + + +//# 1 ".flight.eobjs/jsoo/flight.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 ".flight.eobjs/jsoo/flight.cmo.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_flight$1 = " flight", + cst_return_flight$1 = " return flight", + cst_02d = "%02d", + cst$5 = "-", + cst_Book$1 = "Book", + cst_date$1 = "date", + cst_option$1 = "option", + cst_selected$1 = "selected", + cst_src_examples_browser_fligh = "src/examples/browser/flight.ml", + cst_target$1 = "target", + cst_type$1 = "type", + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$4, + cst$2 = cst$4, + cst$1 = cst$4, + cst = cst$5, + cst$0 = cst$5, + init = [0, 0, 0, 0], + Fmlib_browser = global_data.Fmlib_browser, + Stdlib = global_data.Stdlib, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Stdlib_String = global_data.Stdlib__String, + Assert_failure = global_data.Assert_failure, + Stdlib_Printf = global_data.Stdlib__Printf, + cst_readOnly = "readOnly", + cst_date$0 = cst_date$1, + cst_type$0 = cst_type$1, + cst_New_booking = "New booking", + cst_return_flight$0 = cst_return_flight$1, + cst_flight$0 = cst_flight$1, + cst_Booking_Confirmation = "Booking Confirmation", + cst_return_flight = cst_return_flight$1, + cst_flight = cst_flight$1, + cst_Book = cst_Book$1, + cst_return_flight_has_to_be_af = + "return flight has to be after the flight", + cst_red = "red", + cst_Book$0 = cst_Book$1, + cst_Return = "Return", + cst_selected = cst_selected$1, + cst_option = cst_option$1, + cst_One_way = "One way", + cst_selected$0 = cst_selected$1, + cst_option$0 = cst_option$1, + cst_change = "change", + cst_Book_your_flight = "Book your flight", + cst_input = "input", + cst_date = cst_date$1, + cst_type = cst_type$1, + _e_ = [0, cst_src_examples_browser_fligh, 110, 8], + _b_ = [0, [4, 0, [0, 2, 2], 0, 0], cst_02d], + _c_ = [0, [4, 0, [0, 2, 2], 0, 0], cst_02d], + _d_ = [0, [4, 0, [0, 2, 4], 0, 0], "%04d"], + _a_ = [0, cst_src_examples_browser_fligh, 54, 8], + cst_value = "value", + cst_target = cst_target$1, + cst_selectedIndex = "selectedIndex", + cst_target$0 = cst_target$1; + function update(state, msg){ + if(typeof msg === "number") + switch(msg){ + case 0: + if(0 === state[0]){var flight = state[2]; return [0, 0, flight, 0];} + break; + case 1: + if(0 === state[0]){ + var return$0 = state[3], flight$0 = state[2]; + return [0, 1, flight$0, return$0]; + } + break; + case 2: + if(0 === state[0]){ + var match = state[2]; + if(match){ + var return$1 = state[3], flight$1 = match[1]; + return [1, flight$1, return$1]; + } + } + break; + default: return init; + } + else if(0 === msg[0]){ + var flight$2 = msg[1]; + if(0 === state[0]){ + var return$2 = state[3], kind = state[1]; + return [0, kind, flight$2, return$2]; + } + } + else{ + var return$3 = msg[1]; + if(0 === state[0]){ + var flight$3 = state[2], kind$0 = state[1]; + return [0, kind$0, flight$3, return$3]; + } + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function compare(d1, d2){ + var cmp_year = caml_int_compare(d1[1], d2[1]); + if(0 !== cmp_year) return cmp_year; + var cmp_month = caml_int_compare(d1[2], d2[2]); + return 0 === cmp_month ? caml_int_compare(d1[3], d2[3]) : cmp_month; + } + function string_of_date(date){ + var + _ak_ = caml_call2(Stdlib_Printf[4], _b_, date[3]), + _al_ = caml_call2(Stdlib[28], cst, _ak_), + _am_ = caml_call2(Stdlib_Printf[4], _c_, date[2]), + _an_ = caml_call2(Stdlib[28], _am_, _al_), + _ao_ = caml_call2(Stdlib[28], cst$0, _an_), + _ap_ = + 1000 <= date[1] + ? caml_call1(Stdlib[33], date[1]) + : caml_call2(Stdlib_Printf[4], _d_, date[1]); + return caml_call2(Stdlib[28], _ap_, _ao_); + } + function string_of_date_opt(param){ + if(! param) return cst$1; + var date = param[1]; + return string_of_date(date); + } + function date_of_string(str){ + var match = caml_call2(Stdlib_String[16], 45, str); + if(match){ + var year = match[1]; + if(! runtime.caml_string_notequal(year, cst$4) && ! match[2]) return 0; + var _ac_ = match[2]; + if(_ac_){ + var _ad_ = _ac_[2]; + if(_ad_ && ! _ad_[2]){ + var + day = _ad_[1], + month = _ac_[1], + _ae_ = + function(year){ + function _ag_(month){ + function _ai_(day){ + return caml_call1(Fmlib_std_Option[1], [0, year, month, day]); + } + var _aj_ = caml_call1(Stdlib[34], day); + return caml_call2(Fmlib_std_Option[3], _aj_, _ai_); + } + var _ah_ = caml_call1(Stdlib[34], month); + return caml_call2(Fmlib_std_Option[3], _ah_, _ag_); + }, + _af_ = caml_call1(Stdlib[34], year); + return caml_call2(Fmlib_std_Option[3], _af_, _ae_); + } + } + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + } + var + _f_ = + caml_call2(Fmlib_browser[5][6], date_of_string, Fmlib_browser[5][13]), + _g_ = caml_call2(Fmlib_browser[5][14], cst_value, _f_), + decode_date = caml_call2(Fmlib_browser[5][14], cst_target, _g_), + _h_ = Fmlib_browser[5][10]; + function _i_(i){return 0 === i ? 0 : 1;} + var + _j_ = caml_call2(Fmlib_browser[5][6], _i_, _h_), + _k_ = caml_call2(Fmlib_browser[5][14], cst_selectedIndex, _j_), + decode_selection = caml_call2(Fmlib_browser[5][14], cst_target$0, _k_); + function view_date_opt(date, txt, decode){ + var + _X_ = [0, caml_call1(Fmlib_browser[7][1], txt), 0], + _Y_ = [0, caml_call2(Fmlib_browser[6][5], cst_input, decode), 0], + _Z_ = string_of_date_opt(date), + ___ = [0, caml_call1(Fmlib_browser[6][22], _Z_), _Y_], + _$_ = [0, caml_call2(Fmlib_browser[6][3], cst_type, cst_date), ___], + _aa_ = [0, caml_call2(Fmlib_browser[7][17], _$_, 0), _X_], + _ab_ = [0, caml_call2(Fmlib_browser[7][18], 0, _aa_), 0]; + return caml_call2(Fmlib_browser[7][15], 0, _ab_); + } + function view_booking(kind, flight, return$0){ + function date(d, lab, dec){return view_date_opt(d, lab, dec);} + function _y_(date){return [0, date];} + var decode_flight = caml_call2(Fmlib_browser[5][6], _y_, decode_date); + function _z_(date){return [1, date];} + var decode_return = caml_call2(Fmlib_browser[5][6], _z_, decode_date); + if(kind) + var + _A_ = [0, date(return$0, cst_return_flight, decode_return), 0], + dates = [0, date(flight, cst_flight, decode_flight), _A_]; + else + var dates = [0, date(flight, cst$2, decode_flight), 0]; + var switch$0 = 0; + if(kind){ + if(flight && return$0){ + var d2 = return$0[1], d1 = flight[1]; + if(0 <= compare(d1, d2)) + var + _B_ = + [0, + caml_call1(Fmlib_browser[7][1], cst_return_flight_has_to_be_af), + 0], + _C_ = [0, caml_call1(Fmlib_browser[6][8], cst_red), 0], + _D_ = [0, caml_call2(Fmlib_browser[7][15], _C_, _B_), 0]; + else + var + _R_ = [0, caml_call1(Fmlib_browser[7][1], cst_Book), 0], + _S_ = [0, caml_call1(Fmlib_browser[6][6], 2), 0], + _T_ = [0, caml_call2(Fmlib_browser[7][16], _S_, _R_), 0], + _D_ = [0, caml_call2(Fmlib_browser[7][15], 0, _T_), 0]; + var book_button = _D_; + switch$0 = 1; + } + } + else if(flight){ + var + _U_ = [0, caml_call1(Fmlib_browser[7][1], cst_Book$0), 0], + _V_ = [0, caml_call1(Fmlib_browser[6][6], 2), 0], + _W_ = [0, caml_call2(Fmlib_browser[7][16], _V_, _U_), 0], + book_button = [0, caml_call2(Fmlib_browser[7][15], 0, _W_), 0]; + switch$0 = 1; + } + if(! switch$0) var book_button = 0; + var + one_way = kind ? 0 : 1, + _E_ = caml_call2(Stdlib[37], dates, book_button), + _F_ = [0, caml_call1(Fmlib_browser[7][1], cst_Return), 0], + _G_ = caml_call1(Fmlib_browser[4][4], 1 - one_way), + _H_ = [0, caml_call2(Fmlib_browser[6][2], cst_selected, _G_), 0], + _I_ = [0, caml_call3(Fmlib_browser[7][2], cst_option, _H_, _F_), 0], + _J_ = [0, caml_call1(Fmlib_browser[7][1], cst_One_way), 0], + _K_ = caml_call1(Fmlib_browser[4][4], one_way), + _L_ = [0, caml_call2(Fmlib_browser[6][2], cst_selected$0, _K_), 0], + _M_ = [0, caml_call3(Fmlib_browser[7][2], cst_option$0, _L_, _J_), _I_], + _N_ = + [0, caml_call2(Fmlib_browser[6][5], cst_change, decode_selection), 0], + _O_ = [0, caml_call2(Fmlib_browser[7][20], _N_, _M_), _E_], + _P_ = [0, caml_call1(Fmlib_browser[7][1], cst_Book_your_flight), 0], + _Q_ = [0, caml_call2(Fmlib_browser[7][6], 0, _P_), _O_]; + return caml_call2(Fmlib_browser[7][12], 0, _Q_); + } + function view_booked(flight, return$0){ + function date_element(txt, date){ + var + _r_ = [0, caml_call1(Fmlib_browser[7][1], txt), 0], + _s_ = string_of_date(date), + _t_ = [0, caml_call1(Fmlib_browser[6][22], _s_), 0], + _u_ = [0, caml_call2(Fmlib_browser[6][3], cst_readOnly, cst$3), _t_], + _v_ = [0, caml_call2(Fmlib_browser[6][3], cst_type$0, cst_date$0), _u_], + _w_ = [0, caml_call2(Fmlib_browser[7][17], _v_, 0), _r_], + _x_ = [0, caml_call2(Fmlib_browser[7][18], 0, _w_), 0]; + return caml_call2(Fmlib_browser[7][15], 0, _x_); + } + var + _l_ = [0, caml_call1(Fmlib_browser[7][1], cst_New_booking), 0], + _m_ = [0, caml_call1(Fmlib_browser[6][6], 3), 0], + _n_ = [0, caml_call2(Fmlib_browser[7][16], _m_, _l_), 0], + reset = [0, caml_call2(Fmlib_browser[7][15], 0, _n_), 0]; + if(return$0) + var + return$1 = return$0[1], + lst = [0, date_element(cst_return_flight$0, return$1), reset]; + else + var lst = reset; + var + _o_ = [0, date_element(cst_flight$0, flight), lst], + _p_ = [0, caml_call1(Fmlib_browser[7][1], cst_Booking_Confirmation), 0], + _q_ = [0, caml_call2(Fmlib_browser[7][6], 0, _p_), _o_]; + return caml_call2(Fmlib_browser[7][12], 0, _q_); + } + function view(param){ + if(0 === param[0]){ + var return$0 = param[3], flight = param[2], kind = param[1]; + return view_booking(kind, flight, return$0); + } + var return$1 = param[2], flight$0 = param[1]; + return view_booked(flight$0, return$1); + } + caml_call3(Fmlib_browser[13], init, view, update); + var + Flight = + [0, + init, + update, + compare, + string_of_date, + string_of_date_opt, + date_of_string, + decode_date, + decode_selection, + view_date_opt, + view_booking, + view_booked, + view]; + runtime.caml_register_global(46, Flight, "Flight"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/stdlib/std_exit.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/stdlib/std_exit.cmo.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib; + caml_call1(Stdlib[103], 0); + var Std_exit = [0]; + runtime.caml_register_global(1, Std_exit, "Std_exit"); + return; + } + (globalThis)); + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiJmbGlnaHQuYmMuanMiLCJzb3VyY2VSb290IjoiIiwibmFtZXMiOlsiY2FtbF9pbnQ2NF9pc196ZXJvIiwieCIsImNhbWxfc3RyX3JlcGVhdCIsIm4iLCJzIiwiciIsImwiLCJjYW1sX2ludDY0X29mZnNldCIsIk1hdGgiLCJjYW1sX3JhaXNlX2NvbnN0YW50IiwidGFnIiwiY2FtbF9nbG9iYWxfZGF0YSIsImNhbWxfcmFpc2VfemVyb19kaXZpZGUiLCJNbEludDY0IiwibG8iLCJtaSIsImhpIiwidGhpcyIsInhoaSIsImgiLCJzaWduIiwib2Zmc2V0IiwibW9kdWx1cyIsImRpdmlzb3IiLCJxdW90aWVudCIsInkiLCJxIiwiY2FtbF9pbnQ2NF9vZl9pbnQzMiIsImNhbWxfaW50NjRfdG9faW50MzIiLCJjYW1sX2ludDY0X2lzX25lZ2F0aXZlIiwiY2FtbF9pbnQ2NF9uZWciLCJjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIiwianNvb19zeXNfZ2V0ZW52IiwicHJvY2VzcyIsImdsb2JhbFRoaXMiLCJ1bmRlZmluZWQiLCJjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyIsImkiLCJjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZSIsImV4biIsImZvcmNlIiwiY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlIiwiY2FtbF9yYWlzZV93aXRoX2FyZyIsImFyZyIsImNhbWxfc3RyaW5nX29mX2pzYnl0ZXMiLCJjYW1sX3JhaXNlX3dpdGhfc3RyaW5nIiwibXNnIiwiY2FtbF9pbnZhbGlkX2FyZ3VtZW50IiwiY2FtbF9wYXJzZV9mb3JtYXQiLCJmbXQiLCJsZW4iLCJmIiwiYyIsImNhbWxfZmluaXNoX2Zvcm1hdHRpbmciLCJyYXdidWZmZXIiLCJidWZmZXIiLCJjYW1sX2ludDY0X2Zvcm1hdCIsIndiYXNlIiwiY3Z0YmwiLCJwIiwiY2FtbF9leHBtMV9mbG9hdCIsImNhbWxfbWxfY29uZGl0aW9uX2Jyb2FkY2FzdCIsInQiLCJqc29vX2lzX2FzY2lpIiwiY2FtbF91dGYxNl9vZl91dGY4IiwiYiIsImMxIiwiYzIiLCJ2IiwiaiIsIlN0cmluZyIsImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nIiwiZnNfbm9kZV9zdXBwb3J0ZWQiLCJtYWtlX3BhdGhfaXNfYWJzb2x1dGUiLCJwb3NpeCIsInBhdGgiLCJ3aW4zMiIsInNwbGl0RGV2aWNlUmUiLCJyZXN1bHQiLCJkZXZpY2UiLCJpc1VuYyIsIkJvb2xlYW4iLCJyb290Iiwic2VwIiwicGF0aF9pc19hYnNvbHV0ZSIsImNhbWxfdHJhaWxpbmdfc2xhc2giLCJuYW1lIiwiY2FtbF9jdXJyZW50X2RpciIsImNhbWxfbWFrZV9wYXRoIiwiY29tcDAiLCJjb21wIiwibmNvbXAiLCJjYW1sX3V0Zjhfb2ZfdXRmMTYiLCJkIiwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmciLCJ1bml4X2Vycm9yIiwibWFrZV91bml4X2Vycl9hcmdzIiwiY29kZSIsInN5c2NhbGwiLCJlcnJubyIsInZhcmlhbnQiLCJudWxsIiwiYXJncyIsImNhbWxfbmFtZWRfdmFsdWVzIiwiY2FtbF9uYW1lZF92YWx1ZSIsIm5tIiwiY2FtbF9yYWlzZV93aXRoX2FyZ3MiLCJjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMiLCJhIiwiY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyIsIk1sQnl0ZXMiLCJjb250ZW50cyIsImxlbmd0aCIsImNvbnRlbnQiLCJjYW1sX2lzX21sX2J5dGVzIiwiY2FtbF9pc19tbF9zdHJpbmciLCJjYW1sX2J5dGVzX29mX2FycmF5IiwiVWludDhBcnJheSIsImNhbWxfYnl0ZXNfb2ZfanNieXRlcyIsImNhbWxfYnl0ZXNfb2Zfc3RyaW5nIiwiY2FtbF9yYWlzZV9zeXNfZXJyb3IiLCJjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSIsImNhbWxfY29udmVydF9ieXRlc190b19hcnJheSIsImNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMiLCJjYW1sX2NyZWF0ZV9ieXRlcyIsImNhbWxfbWxfYnl0ZXNfbGVuZ3RoIiwiY2FtbF9ibGl0X2J5dGVzIiwiczEiLCJpMSIsInMyIiwiaTIiLCJNbEZpbGUiLCJNbEZha2VGaWxlIiwib2xkIiwiYnVmIiwicG9zIiwiY2xlbiIsIm5ld19zdHIiLCJvbGRfZGF0YSIsImRhdGEiLCJNbEZha2VGZCIsImZpbGUiLCJmbGFncyIsIk1sRmFrZURldmljZSIsInJlcyIsIlN5bWJvbCIsIm5hbWVfc2xhc2giLCJtb2RlIiwicmFpc2VfdW5peCIsInBhcmVudCIsIlJlZ0V4cCIsInNlZW4iLCJtIiwiZW50cnkiLCJvayIsIkFycmF5IiwiYnl0ZXMiLCJjYW1sX21sX3N0cmluZ19sZW5ndGgiLCJjYW1sX3N0cmluZ191bnNhZmVfZ2V0IiwiY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmciLCJjYW1sX2J5dGVzX2JvdW5kX2Vycm9yIiwiY2FtbF9ieXRlc191bnNhZmVfc2V0IiwiY2FtbF9ieXRlc19zZXQiLCJNbE5vZGVGZCIsImZkIiwicmVxdWlyZSIsImVyciIsImJ1Zl9vZmZzZXQiLCJyZWFkIiwiTWxOb2RlRGV2aWNlIiwiY29uc3RzIiwia2V5IiwiaXNDaGFyYWN0ZXJEZXZpY2UiLCJvIiwianNfc3RhdHMiLCJ0b19kaXIiLCJ0YXJnZXQiLCJsaW5rIiwiZmlsZV9raW5kIiwiY2FtbF9nZXRfcm9vdCIsImNhbWxfZmFpbHdpdGgiLCJjYW1sX3Jvb3QiLCJqc29vX21vdW50X3BvaW50IiwicmVzb2x2ZV9mc19kZXZpY2UiLCJjYW1sX3N5c19pc19kaXJlY3RvcnkiLCJjYW1sX3JhaXNlX25vdF9mb3VuZCIsImNhbWxfc3lzX2dldGVudiIsInNoaWZ0X3JpZ2h0X25hdCIsIm5hdDEiLCJvZnMxIiwibGVuMSIsIm5hdDIiLCJvZnMyIiwibmJpdHMiLCJ3cmFwIiwiY2FtbF9ncl9zdGF0ZSIsImNhbWxfZ3Jfc3RhdGVfZ2V0IiwiY2FtbF9ncl9wb2ludF9jb2xvciIsImltIiwiY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmUiLCJNbE9iamVjdFRhYmxlIiwiTmFpdmVMb29rdXAiLCJvYmpzIiwiY2FtbF9zeXNfcmVuYW1lIiwib19yb290Iiwibl9yb290IiwiY2FtbF9sb2cxMF9mbG9hdCIsImNhbWxfcnVudGltZV93YXJuaW5ncyIsImNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3MiLCJib29sIiwiY2FtbF9jbGFzc2lmeV9mbG9hdCIsImlzRmluaXRlIiwiaXNOYU4iLCJjYW1sX21sX2NoYW5uZWxzIiwiY2FtbF9yZWZpbGwiLCJjaGFuIiwic3RyIiwic3RyX2EiLCJucmVhZCIsImNhbWxfYXJyYXlfYm91bmRfZXJyb3IiLCJjYW1sX21sX2lucHV0X3NjYW5fbGluZSIsImNoYW5pZCIsInByZXZfbWF4IiwiY2FtbF9nY19taW5vciIsInVuaXQiLCJjYW1sX21sX2NvbmRpdGlvbl9uZXciLCJjYW1sX2ludDY0X29mX2J5dGVzIiwiY2FtbF9iYV91aW50OF9nZXQ2NCIsImJhIiwiaTAiLCJvZnMiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiY2FtbF9pbnQ2NF90b19ieXRlcyIsImNhbWxfaW50NjRfbWFyc2hhbCIsIndyaXRlciIsInNpemVzIiwiY2FtbF9iYV9udW1fZGltcyIsImNhbWxfd3JhcF9leGNlcHRpb24iLCJlIiwiY2FtbF9jcmVhdGVfZmlsZSIsImpzb29fY3JlYXRlX2ZpbGUiLCJjYW1sX2ZzX2luaXQiLCJ0bXAiLCJjYW1sX211bCIsImNhbWxfaGFzaF9taXhfaW50IiwiY2FtbF9oYXNoX21peF9qc2J5dGVzIiwidyIsImNhbWxfaGFzaF9taXhfc3RyaW5nIiwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9zdHJpbmciLCJjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrIiwiY2FtbF9wYXJzZXJfdHJhY2UiLCJjYW1sX3NldF9wYXJzZXJfdHJhY2UiLCJvbGRmbGFnIiwiY2FtbF9saXN0X29mX2pzX2FycmF5IiwibnVtX2RpZ2l0c19uYXQiLCJuYXQiLCJjYW1sX2hhc2hfbmF0IiwiY2FtbF9jYWxsX2dlbiIsImFyZ3NMZW4iLCJnIiwibmFyZ3MiLCJleHRyYV9hcmdzIiwiYXJndW1lbnRzIiwiY2FtbF9jYWxsYmFjayIsImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHMiLCJjYW1sX3N5c19jaGRpciIsImRpciIsImNhbWxfb2JqX3RhZyIsIkZ1bmN0aW9uIiwiY2FtbF9vYmpfdXBkYXRlX3RhZyIsImNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbl8iLCJjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW4iLCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmciLCJmaWVsZDAiLCJjYW1sX2djX2NvdW50ZXJzIiwiY2FtbF9ncl9zeW5jaHJvbml6ZSIsImNhbWxfdW5peF9jbG9zZWRpciIsImRpcl9oYW5kbGUiLCJjYW1sX3VuaXhfb3BlbmRpciIsImNhbWxfdW5peF9yZXdpbmRkaXIiLCJuZXdfZGlyX2hhbmRsZSIsImNhbWxfcmFpc2VfZW5kX29mX2ZpbGUiLCJjYW1sX3VuaXhfcmVhZGRpciIsImNhbWxfdW5peF9maW5kZmlyc3QiLCJwYXRoX2pzIiwiZmlyc3RfZW50cnkiLCJjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWciLCJsb2cyX29rIiwianNvb19mbG9vcl9sb2cyIiwiSW5maW5pdHkiLCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQiLCJmbG9hdDMyYSIsIkZsb2F0MzJBcnJheSIsImludDMyYSIsIkludDMyQXJyYXkiLCJjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSIsImNhbWxfaW50NjRfYml0c19vZl9mbG9hdCIsImV4cCIsImsiLCJyMyIsInIyIiwicjEiLCJjYW1sX2JhX3NlcmlhbGl6ZSIsInN6IiwiY29tcGxleCIsImNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQiLCJraW5kIiwiY2FtbF9iYV9jcmVhdGVfYnVmZmVyIiwic2l6ZSIsInZpZXciLCJGbG9hdDY0QXJyYXkiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMiLCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMiLCJOYU4iLCJjYW1sX2JhX2dldF9zaXplIiwiZGltcyIsIm5fZGltcyIsImNhbWxfaW50NjRfY3JlYXRlX2xvX2hpIiwiY2FtbF9pbnQ2NF9oaTMyIiwiY2FtbF9pbnQ2NF9sbzMyIiwiY2FtbF9iYV9jdXN0b21fbmFtZSIsIk1sX0JpZ2FycmF5IiwibGF5b3V0IiwicmUiLCJ0b3RhbCIsImsxIiwiazIiLCJNbF9CaWdhcnJheV9jXzFfMSIsImNhbWxfYmFfY3JlYXRlX3Vuc2FmZSIsInNpemVfcGVyX2VsZW1lbnQiLCJjYW1sX2JhX2Rlc2VyaWFsaXplIiwicmVhZGVyIiwibnVtX2RpbXMiLCJzaXplX2RpbSIsInNpemVfZGltX2hpIiwic2l6ZV9kaW1fbG8iLCJzaXh0eSIsImludDY0IiwiY2FtbF9iYV9jb21wYXJlIiwiY2FtbF9oYXNoX21peF9pbnQ2NCIsImNhbWxfaGFzaF9taXhfZmxvYXQiLCJ2MCIsImNhbWxfYmFfaGFzaCIsIm51bV9lbHRzIiwiY2FtbF9pbnQzMl91bm1hcnNoYWwiLCJjYW1sX25hdGl2ZWludF91bm1hcnNoYWwiLCJjYW1sX2ludDY0X3VubWFyc2hhbCIsImNhbWxfaW50NjRfY29tcGFyZSIsImNhbWxfaW50NjRfaGFzaCIsImNhbWxfY3VzdG9tX29wcyIsImNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbSIsImNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbSIsIm51bSIsImN1c3RvbSIsInN3YXAiLCJjYW1sX2NvbXBhcmVfdmFsX3RhZyIsIk51bWJlciIsImNhbWxfaW50X2NvbXBhcmUiLCJjYW1sX3N0cmluZ19jb21wYXJlIiwiY2FtbF9ieXRlc19jb21wYXJlIiwiY2FtbF9jb21wYXJlX3ZhbCIsInN0YWNrIiwidGFnX2EiLCJ0YWdfYiIsImNhbWxfZ3JlYXRlcnRoYW4iLCJkaXZfaGVscGVyIiwieiIsImRpdl9kaWdpdF9uYXQiLCJuYXRxIiwib2ZzcSIsIm5hdHIiLCJvZnNyIiwicmVtIiwibnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0Iiwic2hpZnRfbGVmdF9uYXQiLCJNbE5hdCIsImNyZWF0ZV9uYXQiLCJhcnIiLCJzZXRfdG9femVyb19uYXQiLCJpbmNyX25hdCIsImNhcnJ5X2luIiwiY2FycnkiLCJhZGRfbmF0IiwibGVuMiIsIm5hdF9vZl9hcnJheSIsIm11bHRfZGlnaXRfbmF0IiwibmF0MyIsIm9mczMiLCJ4MSIsIngyIiwieDMiLCJkZWNyX25hdCIsImJvcnJvdyIsInN1Yl9uYXQiLCJjb21wYXJlX25hdCIsImRpdl9uYXQiLCJxdW8iLCJjYW1sX2JhX2JsaXQiLCJzcmMiLCJkc3QiLCJpc19kaWdpdF9pbnQiLCJjYW1sX2ludDY0X2RpdiIsImNhbWxfanNfaHRtbF9lbnRpdGllcyIsImVudGl0eSIsInRlbXAiLCJkb2N1bWVudCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQiLCJjYW1sX2ludDY0X29mX2Zsb2F0IiwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjQiLCJjYW1sX2JhX3NldF8yIiwiY2FtbF9hcmd2IiwibWFpbiIsImFyZ3YiLCJhcmdzMiIsImNhbWxfZXhlY3V0YWJsZV9uYW1lIiwiY2FtbF9qc19ldmFsX3N0cmluZyIsImV2YWwiLCJzZXJpYWxpemVfbmF0IiwiY2FtbF9tZW1wcm9mX3NldCIsIl9jb250cm9sIiwiY2FtbF9zeXNfZXhpdCIsImNhbWxfY2hhbm5lbF9kZXNjcmlwdG9yIiwiY2FtbF9qc19mcm9tX2FycmF5IiwiY2FtbF9iYV9yZXNoYXBlIiwidmluZCIsIm5ld19kaW0iLCJjYW1sX29vX2xhc3RfaWQiLCJjYW1sX3NldF9vb19pZCIsImNhbWxfZ3JfZmlsbF9yZWN0IiwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEiLCJzdHIxIiwicG9zMSIsImJhMiIsInBvczIiLCJzbGljZSIsImNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZSIsImpzbmFtZSIsImNhbWxfZ2V0X2dsb2JhbF9kYXRhIiwiY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCIsImNhbWxfYmFfdWludDhfZ2V0MTYiLCJjYW1sX2NvbXBhcmUiLCJjYW1sX01ENVRyYW5zZm9ybSIsImFkZCIsInh4IiwiZmYiLCJnZyIsImhoIiwiaWkiLCJjYW1sX01ENVVwZGF0ZSIsImN0eCIsImlucHV0IiwiaW5wdXRfbGVuIiwiaW5fYnVmIiwiaW5wdXRfcG9zIiwibWlzc2luZyIsImNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsIiwiY3Vyc29yIiwiY2FsbGJhY2tzIiwiY2FtbF9mcmVzaF9vb19pZCIsImNhbWxfaW50NjRfdG9fZmxvYXQiLCJjYW1sX2JhX2dldF8xIiwiY2FtbF9iaWdzdHJpbmdfbWVtY21wIiwiY2FtbF9uZXdfc3RyaW5nIiwiY2FtbF9lcmZfZmxvYXQiLCJhMSIsImEyIiwiYTMiLCJhNCIsImE1IiwiY2FtbF9iYV91aW50OF9nZXQzMiIsImNhbWxfcmF3X2JhY2t0cmFjZV9sZW5ndGgiLCJjYW1sX3N0cl9pbml0aWFsaXplIiwiY2FtbF9vYmpfYmxvY2siLCJjYW1sX2dyX2NsZWFyX2dyYXBoIiwiYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlciIsImJzIiwiY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZCIsIl91bml0IiwibHhvcl9kaWdpdF9uYXQiLCJjYW1sX29ial9hZGRfb2Zmc2V0IiwiY2FtbF9maW5hbF9yZWxlYXNlIiwiY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplIiwiY2FtbF9qc190b19hcnJheSIsImNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZSIsImNhbWxfZ3JfcGxvdCIsImNvbG9yIiwiY2FtbF9ieXRlc19zZXQ2NCIsImk2NCIsImNhbWxfc3RyaW5nX3NldDE2IiwiaTE2IiwiY2FtbF9pbnQ2NF9ic3dhcCIsImNhbWxfZ2NfbWFqb3IiLCJjYW1sX2xleF9hcnJheSIsImNhbWxfbGV4X2VuZ2luZSIsInRibCIsInN0YXJ0X3N0YXRlIiwibGV4YnVmIiwibGV4X2J1ZmZlciIsImxleF9idWZmZXJfbGVuIiwibGV4X3N0YXJ0X3BvcyIsImxleF9jdXJyX3BvcyIsImxleF9sYXN0X3BvcyIsImxleF9sYXN0X2FjdGlvbiIsImxleF9lb2ZfcmVhY2hlZCIsImxleF9iYXNlIiwibGV4X2JhY2t0cmsiLCJsZXhfZGVmYXVsdCIsImxleF90cmFucyIsImxleF9jaGVjayIsInN0YXRlIiwiYmFzZSIsImJhY2t0cmsiLCJjYW1sX3N5c19maWxlX2V4aXN0cyIsImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3QiLCJjYW1sX2FycmF5X3N1YiIsImNhbWxfYnl0ZXNfZXF1YWwiLCJjYW1sX2dyX3NpemVfeCIsIkJhc2VfaW50X21hdGhfaW50MzJfY2x6IiwiY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyIsImNhbWxfYXRvbWljX2ZldGNoX2FkZCIsInJlZiIsIm9zX3R5cGUiLCJjYW1sX3N5c19jb25zdF9vc3R5cGVfY3lnd2luIiwiY2FtbF9jb3NoX2Zsb2F0IiwiTWxNdXRleCIsImNhbWxfbWxfbXV0ZXhfbmV3IiwiY2FtbF9lcGhlX2tleV9vZmZzZXQiLCJjYW1sX2VwaGVfY2hlY2tfa2V5Iiwid2VhayIsImNhbWxfaGFzaF9taXhfZmluYWwiLCJjYW1sX2dyX3RleHRfc2l6ZSIsInR4dCIsImNhbWxfbGV4X3J1bl9tZW0iLCJtZW0iLCJjdXJyX3BvcyIsImNhbWxfbGV4X3J1bl90YWciLCJjYW1sX25ld19sZXhfZW5naW5lIiwibGV4X21lbSIsImxleF9iYXNlX2NvZGUiLCJsZXhfYmFja3Rya19jb2RlIiwibGV4X2RlZmF1bHRfY29kZSIsImxleF90cmFuc19jb2RlIiwibGV4X2NoZWNrX2NvZGUiLCJsZXhfY29kZSIsInBjX29mZiIsInBzdGF0ZSIsImJhc2VfY29kZSIsImNhbWxfYmFfdWludDhfc2V0NjQiLCJjYW1sX3N5c19leGVjdXRhYmxlX25hbWUiLCJjYW1sX2xlc3NlcXVhbCIsImNhbWxfYWNvc2hfZmxvYXQiLCJjYW1sX01ENUluaXQiLCJBcnJheUJ1ZmZlciIsImIzMiIsIlVpbnQzMkFycmF5IiwiY2FtbF9tbF9mbHVzaCIsImNhbWxfc2Vla19vdXQiLCJjYW1sX21sX3NlZWtfb3V0XzY0IiwiY29tcGFyZV9uYXRfcmVhbCIsImNhbWxfZ2Nfc2V0IiwiY2FtbF9qc19nZXQiLCJjYW1sX3VuaXhfaXNhdHR5IiwiZmlsZURlc2NyaXB0b3IiLCJ0dHkiLCJjYW1sX21sX3NldF9idWZmZXJlZCIsImNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyIiwiY2FtbF9tbF9ieXRlc19jb250ZW50IiwiY2FtbF9oYXNoX21peF9ieXRlcyIsImNhbWxfaGFzaCIsImNvdW50IiwibGltaXQiLCJzZWVkIiwib2JqIiwicXVldWUiLCJyZCIsIndyIiwiQmFzZV9oYXNoX3N0cmluZyIsImNhbWxfZ2NfY29tcGFjdGlvbiIsImNhbWxfZXBoZV9nZXRfa2V5IiwiY2FtbF91bml4X2xvY2FsdGltZSIsIkRhdGUiLCJkX251bSIsImphbnVhcnlmaXJzdCIsImRveSIsImphbiIsImp1bCIsInN0ZFRpbWV6b25lT2Zmc2V0IiwiY2FtbF91bml4X21rdGltZSIsInRtIiwidG0yIiwiY2FtbF9iaWdzdHJpbmdfYmxpdF9ieXRlc190b19iYSIsImNhbWxfc3lzX2ZkcyIsImNhbWxfc3lzX2Nsb3NlIiwiY2FtbF9tbF9jbG9zZV9jaGFubmVsIiwiQmFzZV9pbnRfbWF0aF9pbnRfcG93X3N0dWIiLCJleHBvbmVudCIsIm9uZSIsIm11bCIsImNhbWxfYXRvbWljX2V4Y2hhbmdlIiwiY2FtbF9zeXNfaXNhdHR5IiwiX2NoYW4iLCJpc19kaWdpdF96ZXJvIiwiY2FtbF91bml4X2xzdGF0IiwiY2FtbF91bml4X2xzdGF0XzY0IiwiY2FtbF9qc19zZXQiLCJjYW1sX2FycmF5X2dldCIsImFycmF5IiwiaW5kZXgiLCJjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGMiLCJjb250IiwiY2FtbF91bml4X3JtZGlyIiwiY2FtbF9sb2cyX2Zsb2F0IiwiY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50IiwiY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWUiLCJjYW1sX3NwYWNldGltZV9vbmx5X3dvcmtzX2Zvcl9uYXRpdmVfY29kZSIsImNhbWxfaW50NjRfc3ViIiwiY2FtbF9zZWVrX2luIiwiY2FtbF9tbF9zZWVrX2luXzY0IiwiY2FtbF9kb21haW5faWQiLCJjYW1sX21sX211dGV4X3VubG9jayIsImNhbWxfZG9tYWluX2xhdGVzdF9pZHgiLCJjYW1sX2RvbWFpbl9zcGF3biIsIm11dGV4IiwiaWQiLCJjYW1sX3VuaXhfbWtkaXIiLCJwZXJtIiwiY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0IiwiY2FtbF9ub3RlcXVhbCIsImNhbWxfc3lzX2NvbnN0X2ludF9zaXplIiwiY2FtbF9qc193cmFwX2NhbGxiYWNrIiwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2siLCJjYW1sX2lzX2pzIiwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9mbG9hdCIsImNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZCIsImNhbWxfYmFfZGltIiwiY2FtbF9iYV9kaW1fMSIsImNhbWxfanNfbWV0aF9jYWxsIiwiY2FtbF9lcGhlX2RhdGFfb2Zmc2V0IiwiY2FtbF93ZWFrX2NyZWF0ZSIsImNhbWxfZXBoZV9jcmVhdGUiLCJjYW1sX2pzX3RvX2J5dGVfc3RyaW5nIiwiY2FtbF90cmFtcG9saW5lIiwiY2FtbF9tYXliZV9wcmludF9zdGF0cyIsImNhbWxfYnl0ZXNfdW5zYWZlX2dldCIsImNhbWxfYnl0ZXNfZ2V0NjQiLCJjYW1sX2N1c3RvbV9ldmVudF9pbmRleCIsImNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlciIsImV2ZW50X25hbWUiLCJldmVudF90YWciLCJldmVudF90eXBlIiwiY2FtbF91bml4X2hhc19zeW1saW5rIiwiY2FtbF9lcGhlX3NldF9rZXkiLCJPYmplY3QiLCJjYW1sX2VwaGVfdW5zZXRfa2V5IiwiY2FtbF93ZWFrX3NldCIsImNhbWxfc3lzX3JlbW92ZSIsImNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yIiwiY2FtbF9zdHJpbmdfZ2V0MzIiLCJjYW1sX2J5dGVzX2dldCIsImNhbWxfaHlwb3RfZmxvYXQiLCJjYW1sX2pzX2NhbGwiLCJjYW1sX3N5c19jb25zdF9tYXhfd29zaXplIiwiY2FtbF91bml4X2luZXRfYWRkcl9vZl9zdHJpbmciLCJCYXNlX2FtX3Rlc3RpbmciLCJjYW1sX2J5dGVzX2xlc3N0aGFuIiwiY2FtbF9lcmZjX2Zsb2F0IiwiY2FtbF9ncl9maWxsX3BvbHkiLCJhciIsImNhbWxfZ2NfcXVpY2tfc3RhdCIsImNhbWxfbWxfaW5wdXRfY2hhciIsImNhbWxfbWxfaW5wdXRfaW50IiwiY2FtbF9ncl9kaXNwbGF5X21vZGUiLCJjYW1sX29ial9yZWFjaGFibGVfd29yZHMiLCJudGhfZGlnaXRfbmF0IiwiY2FtbF9hcnJheV9ibGl0IiwiY2FtbF9mbG9hdF9vZl9zdHJpbmciLCJtMyIsIm1hbnRpc3NhIiwicGFyc2VJbnQiLCJjYW1sX3N5c19nZXRjd2QiLCJjYW1sX2ludDY0X2FkZCIsImNhbWxfaW50NjRfbXVsIiwiY2FtbF9pbnQ2NF91bHQiLCJjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UiLCJjYW1sX3BhcnNlX2RpZ2l0IiwiY2FtbF9pbnQ2NF9vZl9zdHJpbmciLCJiYXNlNjQiLCJ0aHJlc2hvbGQiLCJjYW1sX2JhX3NldF8xIiwiY2FtbF9pbnQ2NF94b3IiLCJjYW1sX2ludDY0X29yIiwiY2FtbF9seG1fbmV4dCIsInNoaWZ0X2wiLCJzaGlmdF9yIiwib3IiLCJ4b3IiLCJyb3RsIiwiZ2V0Iiwic2V0IiwiTSIsImRhYmEiLCJxMCIsInExIiwic3QiLCJ4MCIsImNhbWxfc3lzX2NvbnN0X2JpZ19lbmRpYW4iLCJjYW1sX2xpc3RfdG9fanNfYXJyYXkiLCJjYW1sX291dHB1dF92YWwiLCJXcml0ZXIiLCJ2YWx1ZSIsIm5vX3NoYXJpbmciLCJjbG9zdXJlcyIsImNvbnNvbGUiLCJpbnRlcm5fb2JqX3RhYmxlIiwibWVtbyIsImV4aXN0aW5nX29mZnNldCIsImV4dGVybl9yZWMiLCJvcHMiLCJzel8zMl82NCIsImhlYWRlcl9wb3MiLCJvbGRfcG9zIiwidHlwZV9vZl92IiwiY2FtbF9zdHJpbmdfb2ZfYXJyYXkiLCJjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmciLCJjYW1sX3JhaXNlX25vdF9hX2RpciIsImNhbWxfc3lzX3N5c3RlbV9jb21tYW5kIiwiY21kIiwiY2hpbGRfcHJvY2VzcyIsImNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uIiwiY2FtbF91bml4X2dldHVpZCIsImRlc2VyaWFsaXplX25hdCIsImluaXRpYWxpemVfbmF0IiwiY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyIsImNhbWxfZ3Jfb3Blbl9zdWJ3aW5kb3ciLCJVSW50OEFycmF5UmVhZGVyIiwiY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSIsInJlYWR2bHEiLCJvdmVyZmxvdyIsIm43IiwiaGVhZGVyX2xlbiIsImRhdGFfbGVuIiwiTWxTdHJpbmdSZWFkZXIiLCJ6c3RkX2RlY29tcHJlc3MiLCJhYiIsInU4IiwidTE2IiwidTMyIiwiaTMyIiwic2xjIiwiZmlsbCIsImNwdyIsImVjIiwiaW5kIiwibnQiLCJFcnJvciIsInJiIiwicnpmaCIsImRhdCIsIm4zIiwiZmxnIiwic3MiLCJjYyIsImRmIiwiZmNmIiwiYnQiLCJkYiIsImRpIiwiZnNiIiwiZnNzIiwid3MiLCJ3YiIsIm1zYiIsInZhbCIsImJpdHMiLCJyZnNlIiwibWFsIiwidHBvcyIsImFsIiwicHJvYnMiLCJzeW0iLCJodCIsImZyZXEiLCJkc3RhdGUiLCJuc3RhdGUiLCJiYjEiLCJzeW1zIiwiY2J0IiwibXNrIiwibXNrMWZiIiwibXN2Iiwic3ZhbCIsInJidCIsInN5bXBvcyIsInNzdGVwIiwic21hc2siLCJzZiIsIm5zIiwibmIiLCJyaHUiLCJ3YyIsImhiIiwiaHciLCJyYyIsInJpIiwiX2EiLCJlYnQiLCJmZHQiLCJlcG9zIiwibGIiLCJzdDEiLCJzdDIiLCJidHIxIiwiYnRyMiIsImZwb3MiLCJieXRlIiwid2VzIiwid3QiLCJtYiIsInRzIiwiaGJ1ZiIsInB2IiwiZGxsdCIsImRtbHQiLCJkb2N0IiwiYjJibCIsImJsIiwibGxiIiwibGxibCIsIm1sYiIsIm1sYmwiLCJkaHUiLCJvdXQiLCJodSIsImViIiwiYnRyIiwiZGh1NCIsInN6MSIsInN6MiIsInN6MyIsInJ6YiIsImIwIiwiYnR5cGUiLCJsYnQiLCJsc3MiLCJsY3MiLCJzNCIsInNwbCIsImh1ZCIsInNjbSIsImR0cyIsIm1kIiwicmJ1ZiIsIl9iIiwibWx0Iiwib2N0IiwibGx0Iiwic3BvcyIsIm91YnQiLCJsc3QiLCJvc3QiLCJtc3QiLCJsbGMiLCJsYnRyIiwibWxjIiwibWJ0ciIsIm9mYyIsIm9idHIiLCJvZnAiLCJvZmYiLCJtbCIsImxsIiwiaWR4Iiwic3RpbiIsImNjdCIsImJ1ZnMiLCJvbCIsImNoayIsImJsayIsImNhbWxfZmxvYXRfb2ZfYnl0ZXMiLCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyIiwibWFnaWMiLCJjb21wcmVzc2VkIiwidW5jb21wcmVzc2VkX2RhdGFfbGVuIiwibnVtX29iamVjdHMiLCJfc2l6ZV8zMiIsIl9zaXplXzY0Iiwib2JqX2NvdW50ZXIiLCJpbnRlcm5fcmVjIiwiaGVhZGVyIiwiZXhwZWN0ZWRfc2l6ZSIsImNhbWxfc3RyaW5nX29mX2J5dGVzIiwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzIiwiY2FtbF9pbnB1dF92YWx1ZSIsImJsb2NrIiwiY2FtbF9pbnB1dF92YWx1ZV90b19vdXRzaWRlX2hlYXAiLCJjYW1sX2F0b21pY19jYXMiLCJjYW1sX2NvcHlzaWduX2Zsb2F0IiwiY2FtbF9ncl9zZXRfdGV4dF9zaXplIiwiY2FtbF9hdG9taWNfbG9hZCIsImNhbWxfTUQ1RmluYWwiLCJjYW1sX21kNV9ieXRlcyIsImNhbWxfYmFfc2V0X2dlbmVyaWMiLCJjYW1sX21sX2NvbmRpdGlvbl93YWl0IiwibXV0ZXh0IiwiY2FtbF9zdHJpbmdfbGVzc2VxdWFsIiwiY2FtbF9zdHJpbmdfZ3JlYXRlcmVxdWFsIiwiY2FtbF9uZXh0YWZ0ZXJfZmxvYXQiLCJjYW1sX2dyX3NpemVfeSIsImNhbWxfcG9zX2luIiwiY2FtbF9tbF9wb3NfaW4iLCJjYW1sX2ludDY0X2FuZCIsIkJhc2VfaW50X21hdGhfaW50NjRfcG93X3N0dWIiLCJjYW1sX3N5c19jb25zdF93b3JkX3NpemUiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlIiwiY2FtbF91bml4X3VubGluayIsImNhbWxfc3lzX29wZW5fZm9yX25vZGUiLCJmcyIsImZkMiIsIk1sRmFrZUZkX291dCIsImNhbWxfc3lzX29wZW5faW50ZXJuYWwiLCJjYW1sX3N5c19vcGVuIiwiX3Blcm1zIiwiY2FtbF9zdHJpbmdfZ2V0IiwicmVfbWF0Y2giLCJyZV93b3JkX2xldHRlcnMiLCJvcGNvZGVzIiwiaXNfd29yZF9sZXR0ZXIiLCJpbl9iaXRzZXQiLCJyZV9tYXRjaF9pbXBsIiwicGFydGlhbCIsInByb2ciLCJjcG9vbCIsIm5vcm10YWJsZSIsIm51bWdyb3VwcyIsIm51bXJlZ2lzdGVycyIsInN0YXJ0Y2hhcnMiLCJwYyIsInF1aXQiLCJncm91cHMiLCJyZV9yZWdpc3RlciIsImJhY2t0cmFjayIsIml0ZW0iLCJwdXNoIiwiYWNjZXB0IiwicHJlZml4X21hdGNoIiwib3AiLCJzYXJnIiwidWFyZyIsImdyb3VwIiwicmVfc2VhcmNoX2JhY2t3YXJkIiwiY2FtbF9qc19mcm9tX3N0cmluZyIsImNhbWxfYmFfc3ViIiwiY2hhbmdlZF9kaW0iLCJuZXdfZGltcyIsIm5ld19kYXRhIiwiY2FtbF9nY19mdWxsX21ham9yIiwiY2FtbF9tbF9tdXRleF90cnlfbG9jayIsImNhbWxfYnl0ZXNfc2V0MzIiLCJjYW1sX2dyX3NpZ2lvX3NpZ25hbCIsImNhbWxfYmFfdWludDhfc2V0MzIiLCJjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCIsImNhbWxfdW5peF9nbXRpbWUiLCJjYW1sX3NpZ25iaXRfZmxvYXQiLCJjYW1sX2dyX2N1cnJlbnRfeCIsImNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgiLCJjYW1sX2dyX3NldF9mb250IiwiY2FtbF9ncl9zZXRfY29sb3IiLCJjb252ZXJ0IiwibnVtYmVyIiwiY19zdHIiLCJjYW1sX2dyX21vdmV0byIsImNhbWxfZ3JfcmVzaXplX3dpbmRvdyIsImNhbWxfZ3Jfc3RhdGVfaW5pdCIsImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSIsInRhIiwiY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5IiwiY2FtbF9tbF9zZWVrX291dCIsImNhbWxfanNfdHlwZW9mIiwiY2FtbF9zdHJpbmdfaGFzaCIsImNhbWxfcmVzdG9yZV9yYXdfYmFja3RyYWNlIiwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHoiLCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jdHoiLCJjYW1sX2dyX2xpbmV0byIsImNhbWxfanNfZnVuY3Rpb25fYXJpdHkiLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmUiLCJjYW1sX2JhX2RpbV8zIiwiY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvbiIsImNhbWxfZm9ybWF0X2V4Y2VwdGlvbiIsImJ1Y2tldCIsInN0YXJ0IiwiY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24iLCJoYW5kbGVyIiwiYXRfZXhpdCIsImNhbWxfZXBoZV9jaGVja19kYXRhIiwiY2FtbF9ieXRlc19nZXQxNiIsImNhbWxfb2JqX21ha2VfZm9yd2FyZCIsImNhbWxfanNfZnJvbV9ib29sIiwiY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lIiwiY2FtbF9leHAyX2Zsb2F0IiwiY2FtbF9ncl9jbG9zZV9ncmFwaCIsIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50IiwiY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4IiwiY2FtbF9jcmVhdGVfc3RyaW5nIiwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY2x6IiwiY2FtbF9tbF9pbnB1dF9ibG9jayIsImF2YWlsIiwiY2FtbF9tZDVfY2hhbiIsInRvcmVhZCIsImNhbWxfYXRhbmhfZmxvYXQiLCJjYW1sX21sX2NvbmRpdGlvbl9zaWduYWwiLCJjYW1sX3VuaXhfZmluZG5leHQiLCJjYW1sX21sX291dHB1dF9ieXRlcyIsImNhbWxfbWxfb3V0cHV0IiwiY2FtbF9tbF9kb21haW5faWQiLCJjYW1sX2VwaGVfZ2V0X2RhdGEiLCJjYW1sX3htbGh0dHByZXF1ZXN0X2NyZWF0ZSIsImNhbWxfdHJhbXBvbGluZV9yZXR1cm4iLCJjYW1sX21sX2lzX2J1ZmZlcmVkIiwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jbHoiLCJjYW1sX2FycmF5X2FwcGVuZCIsImwxIiwibDIiLCJjYW1sX3VuaXhfZ2V0dGltZW9mZGF5IiwiY2FtbF91bml4X3RpbWUiLCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbCIsImNhbWxfcnVudGltZV9ldmVudHNfY3JlYXRlX2N1cnNvciIsImNhbWxfZmlsbF9ieXRlcyIsImNhbWxfanNfZXhwciIsImNhbWxfbWxfcnVudGltZV93YXJuaW5nc19lbmFibGVkIiwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXMiLCJjYW1sX2V2ZW50bG9nX3Jlc3VtZSIsImNhbWxfbWQ1X3N0cmluZyIsImNhbWxfYXJyYXlfb2Zfc3RyaW5nIiwiY2FtbF9zdHJpbmdfZXF1YWwiLCJjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZyIsImNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlciIsInJlX3JlcGxhY2VtZW50X3RleHQiLCJyZXBsIiwib3JpZyIsImN1ciIsImVuZCIsImNhbWxfcHVyZV9qc19leHByIiwiY2FtbF9ibGl0X3N0cmluZyIsImJsaXRfbmF0IiwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlcyIsImJhMSIsImJ5dGVzMiIsImNhbWxfdW5peF9zdGF0IiwiY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSIsImpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuIiwiY2FtbF91bml4X3N0YXRfNjQiLCJjYW1sX3RvX2pzX3N0cmluZyIsImNhbWxfbWxfbXV0ZXhfbG9jayIsInJlX3NlYXJjaF9mb3J3YXJkIiwiY2FtbF9tYWtlX3ZlY3QiLCJpbml0IiwiY2FtbF9tbF9zZWVrX2luIiwiY2FtbF9zeXNfcmVhZF9kaXJlY3RvcnkiLCJjYW1sX21sX291dHB1dF9jaGFyIiwiY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyIiwiY2FtbF9vYmpfaXNfYmxvY2siLCJjYW1sX29ial9zZXRfcmF3X2ZpZWxkIiwiY2FtbF9qc192YXIiLCJjYW1sX3RydW5jX2Zsb2F0IiwiY2FtbF9lcGhlX3Vuc2V0X2RhdGEiLCJjYW1sX2VwaGVfc2V0X2RhdGEiLCJjYW1sX2VwaGVfYmxpdF9kYXRhIiwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQ2NCIsImNhbWxfaXNfcHJpbnRhYmxlIiwiY2FtbF9ieXRlc19sZXNzZXF1YWwiLCJjYW1sX2FycmF5X29mX2J5dGVzIiwiY2FtbF9lcXVhbCIsInJlX3BhcnRpYWxfbWF0Y2giLCJjYW1sX3N5c19yYW5kb21fc2VlZCIsImJ1ZmYiLCJub3ciLCJhbGxfZmluYWxpemVycyIsImNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUiLCJjYiIsImNhbWxfYmFfZ2V0XzIiLCJjYW1sX2JhX3VpbnQ4X3NldDE2IiwiY2FtbF9sYXp5X3Jlc2V0X3RvX2xhenkiLCJjYW1sX2pzX2RlbGV0ZSIsImNhbWxfaW50X29mX3N0cmluZyIsImNhbWxfbGlzdF9tb3VudF9wb2ludCIsInByZXYiLCJjYW1sX21hcnNoYWxfY29uc3RhbnRzIiwiY2FtbF9vYmpfcmF3X2ZpZWxkIiwiY2FtbF9qc19lcXVhbHMiLCJjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwIiwiYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5IiwiY2FtbF9ncl9hcmNfYXV4IiwiY3giLCJjeSIsInJ5IiwicngiLCJyb3QiLCJ4UG9zIiwieVBvcyIsInhQb3NfcHJldiIsInlQb3NfcHJldiIsInNwYWNlIiwiZGVsdGEiLCJjYW1sX2dyX2ZpbGxfYXJjIiwiY2FtbF9iYV9zbGljZSIsIm51bV9pbmRzIiwic3ViX2RpbXMiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlIiwiY2FtbF9iYV9raW5kIiwiY2FtbF9hbGxvY19kdW1teV9pbmZpeCIsImNhbWxfanNfZnVuX2NhbGwiLCJjYW1sX2djX21ham9yX3NsaWNlIiwid29yayIsImNhbWxfanNfcHVyZV9leHByIiwiY29tcGFyZV9kaWdpdHNfbmF0IiwiY2FtbF9tbF9pbnB1dCIsImNhbWxfZ3Jfd2FpdF9ldmVudCIsIl9ldmwiLCJjYW1sX2dyX3NpZ2lvX2hhbmRsZXIiLCJjYW1sX2hhc2hfbWl4X2JpZ3N0cmluZyIsImNhbWxfcmVjb3JkX2JhY2t0cmFjZSIsImNhbWxfdW5peF9jbGVhbnVwIiwiY2FtbF9zeXNfZ2V0X2NvbmZpZyIsImNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSIsImNhbWxfb2JqX2lzX3NoYXJlZCIsImNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3QiLCJjYW1sX2FzaW5oX2Zsb2F0IiwiY2FtbF9wb3Nfb3V0IiwiYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlciIsImNhbWxfbW9kIiwiY2FtbF9iYV9pbml0IiwiY2FtbF91bml4X2ZpbGVkZXNjcl9vZl9mZCIsInJlX3N0cmluZ19tYXRjaCIsIkJpZ1N0cmluZ1JlYWRlciIsImNhbWxfZ3JfZHVtcF9pbWFnZSIsImNhbWxfYmFfZ2V0X2dlbmVyaWMiLCJjYW1sX3VuaXhfc3RhcnR1cCIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9iYWNrdHJhY2UiLCJjYW1sX2Zvcm1hdF9mbG9hdCIsInRvRml4ZWQiLCJkcCIsInByZWMiLCJjYW1sX21vdW50X2F1dG9sb2FkIiwiQmFzZV9pbnRfbWF0aF9pbnRfY2x6IiwiY2FtbF9zdHJpbmdfbGVzc3RoYW4iLCJjYW1sX3N0cmluZ19ncmVhdGVydGhhbiIsImNhbWxfZGl2IiwiY2FtbF9vYmpfZHVwIiwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkiLCJjYW1sX21lbXByb2Zfc3RhcnQiLCJyYXRlIiwic3RhY2tfc2l6ZSIsInRyYWNrZXIiLCJjYW1sX3N5c19nZXRfYXJndiIsImNhbWxfbWxfZG9tYWluX3NldF9uYW1lIiwiX25hbWUiLCJjYW1sX2pzX3RvX2Jvb2wiLCJjYW1sX2dyX2NyZWF0ZV9pbWFnZSIsImNhbWxfZXBoZV9nZXRfa2V5X2NvcHkiLCJjYW1sX2xlc3N0aGFuIiwiY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdCIsImNhbWxfYnVpbGRfc3ltYm9scyIsInRvYyIsInN5bWIiLCJjYW1sX3JlZ2lzdGVyX2dsb2JhbCIsIm5hbWVfb3B0IiwibmlkIiwibXVsdF9uYXQiLCJsZW4zIiwic3F1YXJlX25hdCIsImNhbWxfanNfZnJvbV9mbG9hdCIsImNhbWxfZmxvYXRhcnJheV9jcmVhdGUiLCJjYW1sX2djX3N0YXQiLCJjYW1sX2dldF9tYWpvcl9jcmVkaXQiLCJjYW1sX3N5c19tb2RpZnlfYXJndiIsImNhbWxfbWV0aG9kX2NhY2hlIiwiY2FtbF9nZXRfcHVibGljX21ldGhvZCIsImNhY2hlaWQiLCJtZXRocyIsImxpIiwiY2FtbF9qc19nZXRfY29uc29sZSIsImNhbWxfc3lzX3Vuc2FmZV9nZXRlbnYiLCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiIsInJlZmlsbCIsImNoYW5uZWwiLCJiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXkiLCJjYW1sX3JvdW5kX2Zsb2F0IiwiY2FtbF9vanNfbmV3X2FyciIsIkYiLCJjb21wbGVtZW50X25hdCIsImNhbWxfZG9tYWluX2RscyIsImNhbWxfZG9tYWluX2Rsc19zZXQiLCJjYW1sX2xhenlfcmVhZF9yZXN1bHQiLCJjYW1sX2pzX3JlZ2V4cHMiLCJjYW1sX2pzX2h0bWxfZXNjYXBlIiwiY2FtbF9iYV9kaW1fMiIsImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50cyIsImNhbWxfc2luaF9mbG9hdCIsImNhbWxfbGRleHBfZmxvYXQiLCJjYW1sX2dyX3N0YXRlX3NldCIsImNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3QiLCJhcml0eSIsImNhbWxfZ2NfbWlub3Jfd29yZHMiLCJjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFjayIsImxhbmRfZGlnaXRfbmF0IiwiY2FtbF9pbnQ2NF9tb2QiLCJjYW1sX29ial9zZXRfdGFnIiwiY2FtbF9pbnQzMl9ic3dhcCIsImNhbWxfYmFfc2V0XzMiLCJjYW1sX2pzX2luc3RhbmNlb2YiLCJjYW1sX2dldF9tYWpvcl9idWNrZXQiLCJudGhfZGlnaXRfbmF0X25hdGl2ZSIsInNldF9kaWdpdF9uYXRfbmF0aXZlIiwiZGlnaXQiLCJjYW1sX3N0cmluZ19zZXQ2NCIsImNhbWxfZ3Jfc3RhdGVfY3JlYXRlIiwiY2FudmFzIiwiY29udGV4dCIsImNhbWxfZ3JfZHJhd19hcmMiLCJjYW1sX2JhX21hcF9maWxlIiwidmZkIiwic2hhcmVkIiwiY2FtbF9iYV9tYXBfZmlsZV9ieXRlY29kZSIsImFyZ24iLCJjYW1sX2JhX2NyZWF0ZV9mcm9tIiwiZGF0YTEiLCJkYXRhMiIsImpzdHlwIiwiY2FtbF90YW5oX2Zsb2F0IiwiQmFzZV9pbnRfbWF0aF9pbnRfY3R6IiwiY2FtbF9ydW50aW1lX2V2ZW50c19zdGFydCIsImNhbWxfZ3JfZHJhd19zdHIiLCJkeCIsImNhbWxfZ3JfZHJhd19zdHJpbmciLCJjYW1sX2dyX2RyYXdfY2hhciIsImNhbWxfdW5tb3VudCIsImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmEiLCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fc3RyaW5nIiwiY2FtbF9tbF9wb3NfaW5fNjQiLCJjYW1sX2dyX2RyYXdfaW1hZ2UiLCJpbWFnZSIsImNhbWxfcmVnaXN0ZXJfY2hhbm5lbF9mb3Jfc3BhY2V0aW1lIiwiX2NoYW5uZWwiLCJjYW1sX3N0cmluZ19zZXQiLCJjYW1sX3N5c19ybWRpciIsImNhbWxfdW5peF9zeW1saW5rIiwic3JjX3Jvb3QiLCJkc3Rfcm9vdCIsIkJhc2VfaW50X21hdGhfaW50NjRfY3R6IiwiaXNfemVybyIsImxhbmQiLCJzbWFsbF9pbnQ2NCIsImNhbWxfbWxfcG9zX291dCIsIkJhc2VfY2FtbF9leG5faXNfbW9zdF9yZWNlbnRfZXhuIiwiY2FtbF9zcGFjZXRpbWVfZW5hYmxlZCIsImNhbWxfYnl0ZXNfbm90ZXF1YWwiLCJjYW1sX3J1bnRpbWVfcGFyYW1ldGVycyIsImNhbWxfanNfb2JqZWN0IiwiY2FtbF9iYV9jcmVhdGUiLCJkaW1zX21sIiwiY2FtbF9ncl9yZW1lbWJlcl9tb2RlIiwiQmFzZV9pbnRlcm5hbGhhc2hfZ2V0X2hhc2hfdmFsdWUiLCJjYW1sX2ZtYV9mbG9hdCIsIlNQTElUIiwiTUlOX1ZBTFVFIiwiRVBTSUxPTiIsIkMiLCJBIiwiQiIsIm11bHRpcGx5IiwiYXQiLCJhaGkiLCJhbG8iLCJiaGkiLCJibG8iLCJhZGp1c3QiLCJzY2FsZSIsInhzIiwieXMiLCJ6cyIsInh5IiwidSIsImNhbWxfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50IiwiY2FtbF9ic3dhcDE2IiwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGUiLCJjYW1sX2ZpbmFsX3JlZ2lzdGVyIiwiY2FtbF9ncl9kcmF3X3JlY3QiLCJjYW1sX3N0cmluZ19nZXQxNiIsImNhbWxfb3V0cHV0X3ZhbHVlIiwiY2FtbF9iYV9nZXRfMyIsImNhbWxfZXBoZV9ibGl0X2tleSIsImNhbWxfaW5pdGlhbF90aW1lIiwiY2FtbF9zeXNfdGltZSIsImNhbWxfc3lzX3RpbWVfaW5jbHVkZV9jaGlsZHJlbiIsIkJhc2VfY2xlYXJfY2FtbF9iYWNrdHJhY2VfcG9zIiwiY2FtbF9jaGVja19ib3VuZCIsImNhbWxfdW5peF9nZXRwd3VpZCIsImNhbWxfYmFfdG9fdHlwZWRfYXJyYXkiLCJjYW1sX2RvbWFpbl9kbHNfZ2V0IiwiY2FtbF9ieXRlc19nZXQzMiIsImNhbWxfZnJleHBfZmxvYXQiLCJuZWciLCJjYW1sX3N0cmluZ19nZXQ2NCIsImNhbWxfanNfZXJyb3Jfb3B0aW9uX29mX2V4Y2VwdGlvbiIsImNhbWxfbWxfcG9zX291dF82NCIsImNhbWxfdW5peF9maW5kY2xvc2UiLCJjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyIsImNhbWxfZmxvYXRhcnJheV9ibGl0IiwiY2FtbF9nZXRfbWlub3JfZnJlZSIsImNhbWxfc2V0X3N0YXRpY19lbnYiLCJjYW1sX2JhX2NoYW5nZV9sYXlvdXQiLCJCYXNlX2hhc2hfZG91YmxlIiwiY2FtbF9qc19uZXciLCJjYW1sX2dyX2N1cnJlbnRfeSIsImNhbWxfZm9ybWF0X2ludCIsImpzb29fZWZmZWN0X25vdF9zdXBwb3J0ZWQiLCJjYW1sX2NvbnRpbnVhdGlvbl91c2VfYW5kX3VwZGF0ZV9oYW5kbGVyX25vZXhjIiwiaHZhbCIsImhleG4iLCJoZWZmIiwiY2FtbF9vYmpfdHJ1bmNhdGUiLCJjYW1sX2pzX3RvX3N0cmluZyIsImlzX2RpZ2l0X29kZCIsImNhbWxfcnVudGltZV92YXJpYW50IiwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0IiwiYnVmZmVyZWQiLCJjYW1sX2FycmF5X2NvbmNhdCIsImNhbWxfZ3Jfb3Blbl9ncmFwaCIsImluZm8iLCJzcGVjcyIsInN0YXR1cyIsIndpbiIsImRvYyIsInRpdGxlIiwiYm9keSIsImNhbWxfbWFrZV9mbG9hdF92ZWN0IiwiY2FtbF9jYnJ0X2Zsb2F0IiwiY2FtbF9ldmVudGxvZ19wYXVzZSIsImNhbWxfbWVtcHJvZl9zdG9wIiwiY2FtbF9ncmVhdGVyZXF1YWwiLCJjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSIsImNhbWxfbG9nMXBfZmxvYXQiLCJtc190b19uYW5vIiwidGltZV9ub3dfbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvIiwibXMiLCJtc19pNjMiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX2ZyZWVfY3Vyc29yIiwiY2FtbF9sYXp5X21ha2VfZm9yd2FyZCIsImxvcl9kaWdpdF9uYXQiLCJjYW1sX2dyX2JsaXRfaW1hZ2UiLCJpbTIiLCJjYW1sX2dyX3dpbmRvd19pZCIsImNhbWxfanNfb25faWUiLCJ1YSIsImNhbWxfaW50NjRfc2hpZnRfcmlnaHQiLCJjYW1sX2JhX2xheW91dCIsImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlIiwiY2FtbF9hcnJheV9zZXQiLCJuZXd2YWwiLCJjYW1sX2FsbG9jX3N0YWNrIiwiaHYiLCJoeCIsImhmIiwiY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwiLCJzZXRfZGlnaXRfbmF0IiwiY2FtbF9ieXRlc19zZXQxNiIsImNhbWxfZ3JfZG9jX29mX3N0YXRlIiwiY2FtbF9tbF9vdXRwdXRfaW50IiwiY2FtbF9vYmpfd2l0aF90YWciLCJjYW1sX21sX2NoYW5uZWxfc2l6ZSIsImNhbWxfcmF3X2JhY2t0cmFjZV9zbG90IiwiY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQiLCJzdHlsZSIsImV4cF9zaWduIiwic2lnbl9zdHIiLCJjc3QiLCJ4X3N0ciIsImNhbWxfcnVudGltZV9ldmVudHNfdXNlcl93cml0ZSIsImV2ZW50IiwiZXZlbnRfY29udGVudCIsImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdCIsImNhbWxfdW5peF9yZWFkbGluayIsImNhbWxfYmFja3RyYWNlX3N0YXR1cyIsImNhbWxfaW5zdGFsbF9zaWduYWxfaGFuZGxlciIsImNhbWxfc3lzX2FyZ3YiLCJjYW1sX2JhX2ZpbGwiLCJjYW1sX21vZGZfZmxvYXQiLCJjYW1sX2djX2dldCIsImNhbWxfZmxvYXRfY29tcGFyZSIsImNhbWxfc3RyaW5nX3NldDMyIiwiY2FtbF9wYXJzZV9lbmdpbmUiLCJ0YWJsZXMiLCJlbnYiLCJFUlJDT0RFIiwibG9vcCIsInRlc3RzaGlmdCIsInNoaWZ0Iiwic2hpZnRfcmVjb3ZlciIsInJlZHVjZSIsIlJFQURfVE9LRU4iLCJSQUlTRV9QQVJTRV9FUlJPUiIsIkdST1dfU1RBQ0tTXzEiLCJHUk9XX1NUQUNLU18yIiwiQ09NUFVURV9TRU1BTlRJQ19BQ1RJT04iLCJDQUxMX0VSUk9SX0ZVTkNUSU9OIiwiZW52X3Nfc3RhY2siLCJlbnZfdl9zdGFjayIsImVudl9zeW1iX3N0YXJ0X3N0YWNrIiwiZW52X3N5bWJfZW5kX3N0YWNrIiwiZW52X3N0YWNrc2l6ZSIsImVudl9zdGFja2Jhc2UiLCJlbnZfY3Vycl9jaGFyIiwiZW52X2x2YWwiLCJlbnZfc3ltYl9zdGFydCIsImVudl9zeW1iX2VuZCIsImVudl9hc3AiLCJlbnZfcnVsZV9sZW4iLCJlbnZfcnVsZV9udW1iZXIiLCJlbnZfc3AiLCJlbnZfc3RhdGUiLCJlbnZfZXJyZmxhZyIsInRibF90cmFuc2xfY29uc3QiLCJ0YmxfdHJhbnNsX2Jsb2NrIiwidGJsX2xocyIsInRibF9sZW4iLCJ0YmxfZGVmcmVkIiwidGJsX2Rnb3RvIiwidGJsX3NpbmRleCIsInRibF9yaW5kZXgiLCJ0YmxfZ2luZGV4IiwidGJsX3RhYmxlc2l6ZSIsInRibF90YWJsZSIsInRibF9jaGVjayIsInRibF9uYW1lc19jb25zdCIsInRibF9uYW1lc19ibG9jayIsImxvZyIsInRva2VuX25hbWUiLCJuYW1lcyIsInByaW50X3Rva2VuIiwidG9rIiwidG9rZW4iLCJuMSIsIm4yIiwic3RhdGUxIiwic3AiLCJlcnJmbGFnIiwiYXNwIiwiY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHMiLCJjYW1sX3VwZGF0ZV9kdW1teSIsImNhbWxfYXJyYXlfZmlsbCIsImNhbWxfc3lzX21rZGlyIiwiY2FtbF9zdHJpbmdfbm90ZXF1YWwiLCJjYW1sX2J5dGVzX2dyZWF0ZXJ0aGFuIiwiY2FtbF9ncl9tYWtlX2ltYWdlIiwiQmFzZV9pbnRfbWF0aF9pbnRfcG9wY291bnQiLCJjYW1sX21sX3NldF9jaGFubmVsX291dHB1dCIsImNhbWxfcmVhZF9maWxlX2NvbnRlbnQiLCJjYW1sX2pzX3RvX2Zsb2F0IiwiY2FtbF9zZXR1cF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsIm9yaWdpbiIsImVyYXNlX3JlbCIsInJlc3QiLCJyZXN0JDAiLCJyZXN0JDEiLCJyZXN0JDIiLCJyZXN0JDMiLCJyZXN0JDQiLCJyZXN0JDUiLCJyZXN0JDYiLCJyZXN0JDciLCJ0eSIsInJlc3QkOCIsInR5MSIsInJlc3QkOSIsInJlc3QkMTAiLCJyZXN0JDExIiwicmVzdCQxMiIsInJlc3QkMTMiLCJjb25jYXRfZm10dHkiLCJmbXR0eTEiLCJmbXR0eTIiLCJ0eTIiLCJjb25jYXRfZm10IiwiZm10MSIsImZtdDIiLCJwYWQiLCJwYWQkMCIsInByZWMiLCJwYWQkMSIsImljb252IiwicHJlYyQwIiwicGFkJDIiLCJpY29udiQwIiwicHJlYyQxIiwicGFkJDMiLCJpY29udiQxIiwicHJlYyQyIiwicGFkJDQiLCJpY29udiQyIiwicHJlYyQzIiwicGFkJDUiLCJmY29udiIsInBhZCQ2Iiwic3RyIiwiY2hyIiwiZm10dHkiLCJwYWQkNyIsImZtdHR5JDAiLCJwYWQkOCIsInJlc3QkMTQiLCJyZXN0JDE1IiwicmVzdCQxNiIsImZtdGluZ19saXQiLCJyZXN0JDE3IiwiZm10aW5nX2dlbiIsInJlc3QkMTgiLCJyZXN0JDE5IiwiY2hhcl9zZXQiLCJ3aWR0aF9vcHQiLCJyZXN0JDIwIiwiY291bnRlciIsInJlc3QkMjEiLCJyZXN0JDIyIiwiaWduIiwicmVzdCQyMyIsImYiLCJhcml0eSIsImZhaWx3aXRoIiwicyIsImludmFsaWRfYXJnIiwibWluIiwieCIsInkiLCJtYXgiLCJhYnMiLCJsbm90IiwiaW5maW5pdHkiLCJuZWdfaW5maW5pdHkiLCJuYW4iLCJtYXhfZmxvYXQiLCJtaW5fZmxvYXQiLCJlcHNpbG9uX2Zsb2F0IiwibWF4X2ludCIsIm1pbl9pbnQiLCJzeW1ib2wiLCJzMSIsInMyIiwibDEiLCJsMiIsImNoYXJfb2ZfaW50IiwibiIsInN0cmluZ19vZl9ib29sIiwiYiIsImJvb2xfb2Zfc3RyaW5nIiwiYm9vbF9vZl9zdHJpbmdfb3B0Iiwic3RyaW5nX29mX2ludCIsImludF9vZl9zdHJpbmdfb3B0IiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJsIiwiaSIsImkkMCIsInN0cmluZ19vZl9mbG9hdCIsImZsb2F0X29mX3N0cmluZ19vcHQiLCJzeW1ib2wkMCIsInRsIiwiaGQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsIm9wZW5fb3V0X2dlbiIsIm1vZGUiLCJwZXJtIiwibmFtZSIsImMiLCJvcGVuX291dCIsIm9wZW5fb3V0X2JpbiIsImZsdXNoX2FsbCIsImEiLCJvdXRwdXRfYnl0ZXMiLCJvYyIsIm91dHB1dF9zdHJpbmciLCJvdXRwdXQiLCJvZnMiLCJsZW4iLCJvdXRwdXRfc3Vic3RyaW5nIiwib3V0cHV0X3ZhbHVlIiwiY2hhbiIsInYiLCJjbG9zZV9vdXQiLCJjbG9zZV9vdXRfbm9lcnIiLCJvcGVuX2luX2dlbiIsIm9wZW5faW4iLCJvcGVuX2luX2JpbiIsImlucHV0IiwiaWMiLCJ1bnNhZmVfcmVhbGx5X2lucHV0Iiwib2ZzJDAiLCJsZW4kMCIsInIiLCJsZW4kMSIsIm9mcyQxIiwicmVhbGx5X2lucHV0IiwicmVhbGx5X2lucHV0X3N0cmluZyIsImlucHV0X2xpbmUiLCJidWlsZF9yZXN1bHQiLCJidWYiLCJwb3MkMCIsImFjY3UiLCJiZWciLCJhY2N1JDAiLCJyZXMiLCJjbG9zZV9pbl9ub2VyciIsInByaW50X2NoYXIiLCJwcmludF9zdHJpbmciLCJwcmludF9ieXRlcyIsInByaW50X2ludCIsInByaW50X2Zsb2F0IiwicHJpbnRfZW5kbGluZSIsInByaW50X25ld2xpbmUiLCJwcmVycl9jaGFyIiwicHJlcnJfc3RyaW5nIiwicHJlcnJfYnl0ZXMiLCJwcmVycl9pbnQiLCJwcmVycl9mbG9hdCIsInByZXJyX2VuZGxpbmUiLCJwcmVycl9uZXdsaW5lIiwicmVhZF9saW5lIiwicmVhZF9pbnQiLCJyZWFkX2ludF9vcHQiLCJyZWFkX2Zsb2F0IiwicmVhZF9mbG9hdF9vcHQiLCJzdHJpbmdfb2ZfZm9ybWF0Iiwic3ltYm9sJDEiLCJzdHIyIiwic3RyMSIsImV4aXRfZnVuY3Rpb24iLCJhdF9leGl0IiwiZl95ZXRfdG9fcnVuIiwib2xkX2V4aXQiLCJuZXdfZXhpdCQwIiwibmV3X2V4aXQiLCJzdWNjZXNzIiwiZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQiLCJkb19hdF9leGl0IiwiZXhpdCIsInJldGNvZGUiLCJsZWZ0IiwicmlnaHQiLCJpc19sZWZ0IiwiaXNfcmlnaHQiLCJmaW5kX2xlZnQiLCJmaW5kX3JpZ2h0IiwibWFwX2xlZnQiLCJlIiwibWFwX3JpZ2h0IiwibWFwIiwidiQwIiwiZm9sZCIsImVxdWFsIiwiZTEiLCJlMiIsInYxIiwidjIiLCJ2MSQwIiwidjIkMCIsImNvbXBhcmUiLCJvY2FtbF92ZXJzaW9uIiwib2NhbWxfcmVsZWFzZSIsImV4ZWN1dGFibGVfbmFtZSIsIm9zX3R5cGUiLCJiYWNrZW5kX3R5cGUiLCJ1bml4Iiwid2luMzIiLCJjeWd3aW4iLCJtYXhfYXJyYXlfbGVuZ3RoIiwibWF4X2Zsb2F0YXJyYXlfbGVuZ3RoIiwibWF4X3N0cmluZ19sZW5ndGgiLCJiaWdfZW5kaWFuIiwid29yZF9zaXplIiwiaW50X3NpemUiLCJnZXRlbnZfb3B0IiwiaW50ZXJhY3RpdmUiLCJzZXRfc2lnbmFsIiwic2lnX251bSIsInNpZ19iZWgiLCJzaWdhYnJ0Iiwic2lnYWxybSIsInNpZ2ZwZSIsInNpZ2h1cCIsInNpZ2lsbCIsInNpZ2ludCIsInNpZ2tpbGwiLCJzaWdwaXBlIiwic2lncXVpdCIsInNpZ3NlZ3YiLCJzaWd0ZXJtIiwic2lndXNyMSIsInNpZ3VzcjIiLCJzaWdjaGxkIiwic2lnY29udCIsInNpZ3N0b3AiLCJzaWd0c3RwIiwic2lndHRpbiIsInNpZ3R0b3UiLCJzaWd2dGFscm0iLCJzaWdwcm9mIiwic2lnYnVzIiwic2lncG9sbCIsInNpZ3N5cyIsInNpZ3RyYXAiLCJzaWd1cmciLCJzaWd4Y3B1Iiwic2lneGZzeiIsImNhdGNoX2JyZWFrIiwib24iLCJkZXZlbG9wbWVudF92ZXJzaW9uIiwiaXNfYmxvY2siLCJkb3VibGVfZmllbGQiLCJzZXRfZG91YmxlX2ZpZWxkIiwiZmlyc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yIiwibGFzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfIiwiZm9yY2luZ190YWciLCJjb250X3RhZyIsImxhenlfdGFnIiwiY2xvc3VyZV90YWciLCJvYmplY3RfdGFnIiwiaW5maXhfdGFnIiwiZm9yd2FyZF90YWciLCJub19zY2FuX3RhZyIsImFic3RyYWN0X3RhZyIsInN0cmluZ190YWciLCJkb3VibGVfdGFnIiwiZG91YmxlX2FycmF5X3RhZyIsImN1c3RvbV90YWciLCJpbnRfdGFnIiwib3V0X29mX2hlYXBfdGFnIiwidW5hbGlnbmVkX3RhZyIsImluZm8iLCJvYmoiLCJzdGFydF9lbnYiLCJvZl92YWwiLCJzbG90IiwiaWQiLCJtYXhfZXBoZV9sZW5ndGgiLCJjcmVhdGUiLCJsZW5ndGgiLCJyYWlzZV9pZl9pbnZhbGlkX29mZnNldCIsIm8iLCJtc2ciLCJnZXRfa2V5IiwiZ2V0X2tleV9jb3B5Iiwic2V0X2tleSIsInVuc2V0X2tleSIsImNoZWNrX2tleSIsImJsaXRfa2V5IiwibzEiLCJvMiIsInNldCIsImluY3IiLCJkZWNyIiwiZm9yY2VfZ2VuX2xhenlfYmxvY2siLCJvbmx5X3ZhbCIsImJsayIsImNsb3N1cmUkMCIsInJlc3VsdCQwIiwiY2xvc3VyZSIsInJlc3VsdCIsImUkMCIsImZvcmNlX2xhenlfYmxvY2siLCJmb3JjZV9nZW4iLCJsenYiLCJ0IiwiZm9yY2VfdmFsIiwiZnJvbV9mdW4iLCJmcm9tX3ZhbCIsImlzX3ZhbCIsIm1hcF92YWwiLCJlbXB0eSIsInJldHVybiQwIiwiY29ucyIsIm5leHQiLCJhcHBlbmQiLCJzZXExIiwic2VxMiIsInNlcSIsImZpbHRlcl9tYXAiLCJzZXEkMCIsImZpbHRlciIsImNvbmNhdCIsImZsYXRfbWFwIiwiZm9sZF9sZWZ0IiwiYWNjIiwiYWNjJDAiLCJhY2MkMSIsIml0ZXIiLCJ1bmZvbGQiLCJ1IiwidSQwIiwiaXNfZW1wdHkiLCJ4cyIsInVuY29ucyIsInhzJDAiLCJ4cyQxIiwiaXRlcmkiLCJmb2xkX2xlZnRpIiwiYWNjdSQxIiwiZm9yX2FsbCIsInAiLCJleGlzdHMiLCJmaW5kIiwiZmluZF9tYXAiLCJpdGVyMiIsInlzIiwieXMkMCIsInlzJDEiLCJmb2xkX2xlZnQyIiwiZm9yX2FsbDIiLCJleGlzdHMyIiwiZXEiLCJjbXAiLCJpbml0X2F1eCIsImoiLCJpbml0IiwicmVwZWF0IiwiZm9yZXZlciIsImN5Y2xlX25vbmVtcHR5IiwiY3ljbGUiLCJpdGVyYXRlMSIsIml0ZXJhdGUiLCJtYXBpX2F1eCIsIm1hcGkiLCJ0YWlsX3NjYW4iLCJzJDAiLCJzY2FuIiwidGFrZV9hdXgiLCJ0YWtlIiwiZHJvcCIsIm4kMCIsIm4kMSIsInRha2Vfd2hpbGUiLCJkcm9wX3doaWxlIiwibm9kZSIsImdyb3VwIiwidG9fbGF6eSIsImZhaWx1cmUiLCJtZW1vaXplIiwib25jZSIsImFjdGlvbiIsInppcCIsIm1hcDIiLCJpbnRlcmxlYXZlIiwic29ydGVkX21lcmdlMSIsInNvcnRlZF9tZXJnZSIsIm1hcF9mc3QiLCJ4eXMiLCJ4eXMkMCIsIm1hcF9zbmQiLCJ1bnppcCIsImZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCIsImZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAiLCJ6IiwicGFydGl0aW9uX21hcCIsInBhcnRpdGlvbiIsInBlZWwiLCJ4c3MiLCJ0cmFuc3Bvc2UiLCJ0YWlscyIsImhlYWRzIiwicmVtYWluZGVycyIsInhzcyQwIiwidGFpbHMkMCIsImhlYWRzJDAiLCJtYXBfcHJvZHVjdCIsInByb2R1Y3QiLCJvZl9kaXNwZW5zZXIiLCJpdCIsInRvX2Rpc3BlbnNlciIsImludHMiLCJub25lIiwic29tZSIsInZhbHVlIiwiZGVmYXVsdCQwIiwiZ2V0IiwiYmluZCIsImpvaW4iLCJpc19ub25lIiwiaXNfc29tZSIsIm8wIiwidjAiLCJ0b19yZXN1bHQiLCJ0b19saXN0IiwidG9fc2VxIiwib2siLCJlcnJvciIsImdldF9vayIsImdldF9lcnJvciIsIm1hcF9lcnJvciIsIml0ZXJfZXJyb3IiLCJpc19vayIsImlzX2Vycm9yIiwicjAiLCJyMSIsImUwIiwidG9fb3B0aW9uIiwidG9fZmxvYXQiLCJ0b19zdHJpbmciLCJlc2NhcGVkIiwibG93ZXJjYXNlX2FzY2lpIiwidXBwZXJjYXNlX2FzY2lpIiwiYzEiLCJjMiIsImVycl9ub19wcmVkIiwiZXJyX25vX3N1Y2MiLCJsb19ib3VuZCIsImhpX2JvdW5kIiwiYm9tIiwicmVwIiwic3VjYyIsInByZWQiLCJpc192YWxpZCIsIm9mX2ludCIsImlzX2NoYXIiLCJvZl9jaGFyIiwidG9fY2hhciIsInVuc2FmZV90b19jaGFyIiwiaGFzaCIsInV0Zl9kZWNvZGVfaXNfdmFsaWQiLCJkIiwidXRmX2RlY29kZV9sZW5ndGgiLCJ1dGZfZGVjb2RlX3VjaGFyIiwidXRmX2RlY29kZSIsInV0Zl9kZWNvZGVfaW52YWxpZCIsInV0Zl84X2J5dGVfbGVuZ3RoIiwidXRmXzE2X2J5dGVfbGVuZ3RoIiwibCQwIiwibnRoIiwibCQxIiwibnRoX29wdCIsInJldl9hcHBlbmQiLCJsMSQwIiwibDIkMCIsImwxJDEiLCJsMiQxIiwicmV2IiwicmV2X2luaXRfdGhyZXNob2xkIiwiZmxhdHRlbiIsInJldl9tYXAiLCJmb2xkX3JpZ2h0IiwiYTIiLCJhMSIsInJldl9tYXAyIiwiZm9sZF9yaWdodDIiLCJtZW0iLCJtZW1xIiwiYXNzb2MiLCJhc3NvY19vcHQiLCJhc3NxIiwiYXNzcV9vcHQiLCJtZW1fYXNzb2MiLCJtZW1fYXNzcSIsInJlbW92ZV9hc3NvYyIsInBhaXIiLCJyZW1vdmVfYXNzcSIsImZpbmRfb3B0IiwiZmluZF9hbGwiLCJmaWx0ZXJpIiwiY29uY2F0X21hcCIsImZvbGRfbGVmdF9tYXAiLCJsX2FjY3UiLCJ4JDAiLCJ5ZXMiLCJubyIsInNwbGl0IiwicnkiLCJyeCIsImNvbWJpbmUiLCJtZXJnZSIsInQyIiwiaDIiLCJ0MSIsImgxIiwic3RhYmxlX3NvcnQiLCJzb3J0IiwieDIiLCJ4MSIsInRsJDEiLCJ4MyIsIngyJDAiLCJ4MSQwIiwibjEiLCJuMiIsInJldl9zb3J0IiwidGwkMCIsInNvcnRfdW5pcSIsImMkMCIsImMkMSIsImMkMiIsImMkMyIsImMkNCIsImMkNSIsImMkNiIsImFjY3UkMiIsImNvbXBhcmVfbGVuZ3RocyIsImNvbXBhcmVfbGVuZ3RoX3dpdGgiLCJhdXgiLCJ0YWlsIiwib2Zfc2VxIiwiZGlyZWN0IiwiZGVwdGgiLCJ6ZXJvIiwib25lIiwibWludXNfb25lIiwibG9nbm90IiwibWFrZSIsImNvcHkiLCJvZl9zdHJpbmciLCJzdWIiLCJzdWJfc3RyaW5nIiwiZXh0ZW5kIiwiZHN0b2ZmIiwic3Jjb2ZmIiwiY3B5bGVuIiwiZmlsbCIsImJsaXQiLCJvZnMxIiwib2ZzMiIsImJsaXRfc3RyaW5nIiwic2VwIiwic2VwbGVuIiwiZHN0IiwicG9zIiwiaGQkMCIsImNhdCIsImlzX3NwYWNlIiwidHJpbSIsInVuc2FmZV9lc2NhcGUiLCJiJDAiLCJhcHBseTEiLCJjYXBpdGFsaXplX2FzY2lpIiwidW5jYXBpdGFsaXplX2FzY2lpIiwic3RhcnRzX3dpdGgiLCJwcmVmaXgiLCJsZW5fcyIsImxlbl9wcmUiLCJlbmRzX3dpdGgiLCJzdWZmaXgiLCJsZW5fc3VmIiwiZGlmZiIsImluZGV4X3JlYyIsImxpbSIsImkkMSIsImluZGV4IiwiaW5kZXhfcmVjX29wdCIsImluZGV4X29wdCIsImluZGV4X2Zyb20iLCJpbmRleF9mcm9tX29wdCIsInJpbmRleF9yZWMiLCJyaW5kZXgiLCJyaW5kZXhfZnJvbSIsInJpbmRleF9yZWNfb3B0IiwicmluZGV4X29wdCIsInJpbmRleF9mcm9tX29wdCIsImNvbnRhaW5zX2Zyb20iLCJjb250YWlucyIsInJjb250YWluc19mcm9tIiwic3BsaXRfb25fY2hhciIsInRvX3NlcWkiLCJuZXdfbGVuIiwibmV3X2J1ZiIsInVuc2FmZV9nZXRfdWludDE2X2xlIiwidW5zYWZlX2dldF91aW50MTZfYmUiLCJnZXRfaW50OCIsImdldF91aW50MTZfbGUiLCJnZXRfdWludDE2X2JlIiwiZ2V0X2ludDE2X25lIiwiZ2V0X2ludDE2X2xlIiwiZ2V0X2ludDE2X2JlIiwiZ2V0X2ludDMyX2xlIiwiZ2V0X2ludDMyX2JlIiwiZ2V0X2ludDY0X2xlIiwiZ2V0X2ludDY0X2JlIiwidW5zYWZlX3NldF91aW50MTZfbGUiLCJ1bnNhZmVfc2V0X3VpbnQxNl9iZSIsInNldF9pbnQxNl9sZSIsInNldF9pbnQxNl9iZSIsInNldF9pbnQzMl9sZSIsInNldF9pbnQzMl9iZSIsInNldF9pbnQ2NF9sZSIsInNldF9pbnQ2NF9iZSIsInNldF91aW50OCIsInNldF91aW50MTZfbmUiLCJkZWNfaW52YWxpZCIsImRlY19yZXQiLCJub3RfaW5feDgwX3RvX3hCRiIsIm5vdF9pbl94QTBfdG9feEJGIiwibm90X2luX3g4MF90b194OUYiLCJub3RfaW5feDkwX3RvX3hCRiIsIm5vdF9pbl94ODBfdG9feDhGIiwidXRmXzhfdWNoYXJfMyIsImIwIiwiYjEiLCJiMiIsInV0Zl84X3VjaGFyXzQiLCJiMyIsImdldF91dGZfOF91Y2hhciIsImkkNCIsImIxJDEiLCJpJDUiLCJiMiQxIiwiaSQ2IiwiaSQxMCIsImIxJDMiLCJpJDExIiwiYjIkMyIsImkkMTIiLCJiMyQxIiwiaSQ3IiwiYjEkMiIsImkkOCIsImIyJDIiLCJpJDkiLCJiMyQwIiwiaSQxMyIsImIxJDQiLCJpJDE0IiwiYjIkNCIsImkkMiIsImIxJDAiLCJpJDMiLCJiMiQwIiwiaSQxNSIsImIxJDUiLCJzZXRfdXRmXzhfdWNoYXIiLCJsYXN0JDEiLCJsYXN0JDAiLCJsYXN0IiwiaXNfdmFsaWRfdXRmXzgiLCJsYXN0JDMiLCJsYXN0JDIiLCJsYXN0JDQiLCJsYXN0JDUiLCJnZXRfdXRmXzE2YmVfdWNoYXIiLCJoaSIsImxvIiwic2V0X3V0Zl8xNmJlX3VjaGFyIiwidSQxIiwiaXNfdmFsaWRfdXRmXzE2YmUiLCJnZXRfdXRmXzE2bGVfdWNoYXIiLCJzZXRfdXRmXzE2bGVfdWNoYXIiLCJpc192YWxpZF91dGZfMTZsZSIsImJ0cyIsImJvcyIsIm9mX2J5dGVzIiwidG9fYnl0ZXMiLCJnIiwidG9fYnVmZmVyIiwiYnVmZiIsImZsYWdzIiwiaGVhZGVyX3NpemUiLCJkYXRhX3NpemUiLCJ0b3RhbF9zaXplIiwiZnJvbV9ieXRlcyIsImZyb21fc3RyaW5nIiwibWFrZV9tYXRyaXgiLCJzeCIsInN5IiwibGEiLCJsYiIsInJlcyQwIiwibGlzdF9sZW5ndGgiLCJvZl9saXN0IiwiaW5wdXRfYXJyYXkiLCJlbHQiLCJvdXRwdXRfYXJyYXkiLCJlbHQkMCIsImFjYyQyIiwiYTAiLCJiaSIsImFpIiwibmEiLCJuYiIsIm1heHNvbiIsImkzMSIsImUkMSIsImokMCIsImZhdGhlciIsInNyYzFvZnMiLCJzcmMxbGVuIiwic3JjMiIsInNyYzJvZnMiLCJzcmMybGVuIiwiZHN0b2ZzIiwic3JjMXIiLCJzcmMyciIsInMyJDEiLCJzMSQxIiwiaTEiLCJpMiIsImkyJDAiLCJkJDAiLCJzMiQwIiwiaTEkMCIsImQkMSIsInMxJDAiLCJpc29ydHRvIiwic3Jjb2ZzIiwic29ydHRvIiwiaXNfZmluaXRlIiwiaXNfaW5maW5pdGUiLCJpc19uYW4iLCJlcHNpbG9uIiwib2Zfc3RyaW5nX29wdCIsInBpIiwiaXNfaW50ZWdlciIsIm1pbl9tYXgiLCJtaW5fbnVtIiwibWF4X251bSIsIm1pbl9tYXhfbnVtIiwidW5zYWZlX2ZpbGwiLCJjaGVjayIsImhsZW4iLCJzcmMiLCJzb2ZzIiwiZG9mcyIsImgiLCJtZW1faWVlZSIsIm1hcF90b19hcnJheSIsIm1hcF9mcm9tX2FycmF5IiwibWF4X2ludCQwIiwidW5zaWduZWRfdG9faW50IiwidW5zaWduZWRfY29tcGFyZSIsIm0iLCJ1bnNpZ25lZF9kaXYiLCJxIiwidW5zaWduZWRfcmVtIiwic2l6ZSIsImR1bW15X3BvcyIsInplcm9fcG9zIiwiZW5naW5lIiwidGJsIiwic3RhdGUiLCJuZXdfZW5naW5lIiwiZnJvbV9mdW5jdGlvbiIsIm9wdCIsInJlYWRfZnVuIiwic3RoIiwid2l0aF9wb3NpdGlvbnMiLCJhdXhfYnVmZmVyIiwibGV4YnVmIiwicmVhZCIsIm5ld2xlbiIsIm5ld2J1ZiIsImZyb21fY2hhbm5lbCIsInNldF9wb3NpdGlvbiIsInBvc2l0aW9uIiwic2V0X2ZpbGVuYW1lIiwiZm5hbWUiLCJsZXhlbWUiLCJzdWJfbGV4ZW1lIiwic3ViX2xleGVtZV9vcHQiLCJzdWJfbGV4ZW1lX2NoYXIiLCJzdWJfbGV4ZW1lX2NoYXJfb3B0IiwibGV4ZW1lX2NoYXIiLCJsZXhlbWVfc3RhcnQiLCJsZXhlbWVfZW5kIiwibGV4ZW1lX3N0YXJ0X3AiLCJsZXhlbWVfZW5kX3AiLCJuZXdfbGluZSIsImxjcCIsImZsdXNoX2lucHV0IiwiZW52IiwiZ3Jvd19zdGFja3MiLCJvbGRzaXplIiwibmV3c2l6ZSIsIm5ld19zIiwibmV3X3YiLCJuZXdfc3RhcnQiLCJuZXdfZW5kIiwiY2xlYXJfcGFyc2VyIiwiY3VycmVudF9sb29rYWhlYWRfZnVuIiwieXlwYXJzZSIsInRhYmxlcyIsInN0YXJ0IiwibGV4ZXIiLCJpbml0X2FzcCIsImluaXRfc3AiLCJpbml0X3N0YWNrYmFzZSIsImluaXRfc3RhdGUiLCJpbml0X2N1cnJfY2hhciIsImluaXRfbHZhbCIsImluaXRfZXJyZmxhZyIsImNtZCIsImFyZyIsImFyZyQwIiwiZXhuJDAiLCJleG4iLCJjdXJyX2NoYXIiLCJ0b2siLCJwZWVrX3ZhbCIsInN5bWJvbF9zdGFydF9wb3MiLCJzdCIsImVuIiwic3ltYm9sX2VuZF9wb3MiLCJyaHNfc3RhcnRfcG9zIiwicmhzX2VuZF9wb3MiLCJzeW1ib2xfc3RhcnQiLCJzeW1ib2xfZW5kIiwicmhzX3N0YXJ0IiwicmhzX2VuZCIsImlzX2N1cnJlbnRfbG9va2FoZWFkIiwicGFyc2VfZXJyb3IiLCJoZWlnaHQiLCJobCIsImgkMCIsImhyIiwiYmFsIiwibHIiLCJsdiIsImxsIiwibHJyIiwibHJ2IiwibHJsIiwicnIiLCJydiIsInJsIiwicmxyIiwicmx2IiwicmxsIiwiYWRkIiwic2luZ2xldG9uIiwiYWRkX21pbl9lbGVtZW50IiwiYWRkX21heF9lbGVtZW50IiwicmgiLCJsaCIsIm1pbl9lbHQiLCJtaW5fZWx0X29wdCIsIm1heF9lbHQiLCJtYXhfZWx0X29wdCIsInJlbW92ZV9taW5fZWx0IiwiciQwIiwicHJlcyIsInByZXMkMCIsInJlbW92ZSIsInVuaW9uIiwicjIiLCJyMiQwIiwicjEkMCIsImludGVyIiwic3BsaXRfYmlzIiwiZGlzam9pbnQiLCJjb25zX2VudW0iLCJlMiQyIiwiZTEkMiIsImUyJDAiLCJlMSQwIiwiZTIkMSIsImUxJDEiLCJzdWJzZXQiLCJwdiIsImxmIiwibHQiLCJyZiIsInJ0IiwiY2FyZGluYWwiLCJlbGVtZW50c19hdXgiLCJlbGVtZW50cyIsImZpbmRfZmlyc3QiLCJ2MCQxIiwidjAkMCIsImZpbmRfZmlyc3Rfb3B0IiwiZmluZF9sYXN0IiwiZmluZF9sYXN0X29wdCIsInRyeV9qb2luIiwidiQxIiwieDAiLCJsJDMiLCJsJDQiLCJ4MCQwIiwibCQ1IiwieDAkMSIsIm5sIiwibWlkIiwibCQyIiwieDQiLCJhZGRfc2VxIiwic2VxX29mX2VudW0iLCJzbm9jX2VudW0iLCJyZXZfc2VxX29mX2VudW0iLCJ0b19yZXZfc2VxIiwidG9fc2VxX2Zyb20iLCJsb3ciLCJsZCIsImxyZCIsInJkIiwicmxkIiwiZGF0YSIsImQwJDEiLCJkMCIsImQwJDAiLCJtaW5fYmluZGluZyIsIm1pbl9iaW5kaW5nX29wdCIsIm1heF9iaW5kaW5nIiwibWF4X2JpbmRpbmdfb3B0IiwicmVtb3ZlX21pbl9iaW5kaW5nIiwidXBkYXRlIiwiZGF0YSQwIiwibSQwIiwiYWRkX21pbl9iaW5kaW5nIiwiayIsImFkZF9tYXhfYmluZGluZyIsImNvbmNhdF9vcl9qb2luIiwiZDEiLCJkMiIsImQyJDAiLCJkMSQwIiwiZDIkMSIsImQxJDEiLCJwdmQiLCJmdmQiLCJtMSIsIm0yIiwiYmluZGluZ3NfYXV4IiwiYmluZGluZ3MiLCJjbGVhciIsInB1c2giLCJwb3AiLCJwb3Bfb3B0IiwidG9wIiwidG9wX29wdCIsImNlbGwiLCJtYXRjaCIsInBlZWsiLCJjb250ZW50IiwicGVla19vcHQiLCJ0YWtlX29wdCIsImNlbGwkMCIsInFfcmVzIiwicHJldiIsInByZXYkMCIsInRyYW5zZmVyIiwicTEiLCJxMiIsImNvbnRlbnRzIiwiYnVmZmVyIiwicmVzZXQiLCJpbm5lciIsInJlc2l6ZSIsIm1vcmUiLCJvbGRfcG9zIiwib2xkX2xlbiIsIm5ld19idWZmZXIiLCJhZGRfY2hhciIsInVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCIsInVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXgiLCJhZGRfdXRmXzhfdWNoYXIiLCJhZGRfdXRmXzE2YmVfdWNoYXIiLCJhZGRfdXRmXzE2bGVfdWNoYXIiLCJhZGRfc3Vic3RyaW5nIiwib2Zmc2V0IiwibmV3X3Bvc2l0aW9uIiwiYWRkX3N1YmJ5dGVzIiwiYWRkX3N0cmluZyIsImFkZF9ieXRlcyIsImFkZF9idWZmZXIiLCJicyIsImFkZF9jaGFubmVsIiwidG9fcmVhZCQxIiwiYWxyZWFkeV9yZWFkIiwidG9fcmVhZCIsImFscmVhZHlfcmVhZCQwIiwidG9fcmVhZCQwIiwib3V0cHV0X2J1ZmZlciIsImFkZF9zdWJzdGl0dXRlIiwibGltJDEiLCJwcmV2aW91cyIsInByZXZpb3VzJDAiLCJzdGFydCQwIiwib3BlbmluZyIsImxpbSQwIiwic3RvcCQwIiwiayQyIiwiY2xvc2luZyIsInN0b3AiLCJrJDAiLCJrJDEiLCJuZXh0X2kiLCJpZGVudCIsInRydW5jYXRlIiwiYWRkX2ludDgiLCJhZGRfaW50MTZfbmUiLCJhZGRfaW50MzJfbmUiLCJhZGRfaW50NjRfbmUiLCJhZGRfaW50MTZfbGUiLCJhZGRfaW50MTZfYmUiLCJhZGRfaW50MzJfbGUiLCJhZGRfaW50MzJfYmUiLCJhZGRfaW50NjRfbGUiLCJhZGRfaW50NjRfYmUiLCJyZWxlYXNlIiwiYWNxdWlyZSIsInRyeV9hY3F1aXJlIiwicmV0IiwiZ2V0X3ZhbHVlIiwibWFrZSQwIiwicmVsZWFzZSQwIiwiYWNxdWlyZSQwIiwidHJ5X2FjcXVpcmUkMCIsImNwdV9yZWxheCIsInVuaXF1ZV92YWx1ZSIsImNyZWF0ZV9kbHMiLCJrZXlfY291bnRlciIsInBhcmVudF9rZXlzIiwibmV3X2tleSIsInNwbGl0X2Zyb21fcGFyZW50IiwiaW5pdF9vcnBoYW4iLCJpZHgiLCJraSIsIm1heWJlX2dyb3ciLCJzeiIsIm5ld19zeiIsIm5ld19zdCIsImdldF9pZCIsImRvbWFpbiIsInNlbGYiLCJpc19tYWluX2RvbWFpbiIsImZpcnN0X2RvbWFpbl9zcGF3bmVkIiwiZmlyc3Rfc3Bhd25fZnVuY3Rpb24iLCJiZWZvcmVfZmlyc3Rfc3Bhd24iLCJvbGRfZiIsIm5ld19mIiwiYXRfZXhpdF9rZXkiLCJzcGF3biIsInBrIiwidGVybV9tdXRleCIsInRlcm1fY29uZGl0aW9uIiwidGVybV9zdGF0ZSIsImJvZHkiLCJleCQwIiwiZXgiLCJyZWNvbW1lbmRlZF9kb21haW5fY291bnQiLCJzdWJfZm9ybWF0IiwiZm9ybWF0dGluZ19saXQiLCJjcmVhdGVfY2hhcl9zZXQiLCJhZGRfaW5fY2hhcl9zZXQiLCJzdHJfaW5kIiwibWFzayIsImZyZWV6ZV9jaGFyX3NldCIsInJldl9jaGFyX3NldCIsImNoYXJfc2V0JDAiLCJpc19pbl9jaGFyX3NldCIsInBhZF9vZl9wYWRfb3B0IiwicGFkX29wdCIsIndpZHRoIiwicGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IiwiZm10IiwicGFkX29wdCQwIiwicGFkX29wdCQxIiwicGFkX29wdCQyIiwicGFkX29wdCQzIiwicGFkX29wdCQ0IiwicHJlY19vcHQiLCJwYWRfb3B0JDUiLCJuZGVjIiwicGFkX29wdCQ2IiwicGFkX29wdCQ3IiwicGFkX29wdCQ4IiwiZGVmYXVsdF9mbG9hdF9wcmVjaXNpb24iLCJidWZmZXJfY3JlYXRlIiwiaW5pdF9zaXplIiwiYnVmZmVyX2NoZWNrX3NpemUiLCJvdmVyaGVhZCIsIm1pbl9sZW4iLCJuZXdfc3RyIiwiYnVmZmVyX2FkZF9jaGFyIiwiYnVmZmVyX2FkZF9zdHJpbmciLCJzdHJfbGVuIiwiYnVmZmVyX2NvbnRlbnRzIiwiY2hhcl9vZl9pY29udiIsImNoYXJfb2ZfZmNvbnYiLCJjRiIsImJwcmludF9wYWR0eSIsInBhZHR5IiwiYnByaW50X2lnbm9yZWRfZmxhZyIsImlnbl9mbGFnIiwiYnByaW50X3BhZF9vcHQiLCJicHJpbnRfcGFkZGluZyIsInBhZHR5JDAiLCJicHJpbnRfcHJlY2lzaW9uIiwiYnByaW50X2ljb252X2ZsYWciLCJicHJpbnRfYWx0aW50X2ZtdCIsImJwcmludF9mY29udl9mbGFnIiwic3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0Iiwic3RyJDAiLCJicHJpbnRfY2hhcl9saXRlcmFsIiwiYnByaW50X3N0cmluZ19saXRlcmFsIiwiYnByaW50X2ZtdHR5IiwiZm10dHkkMSIsImZtdHR5JDIiLCJmbXR0eSQzIiwiZm10dHkkNCIsImZtdHR5JDUiLCJmbXR0eSQ2IiwiZm10dHkkNyIsImZtdHR5JDgiLCJmbXR0eSQ5Iiwic3ViX2ZtdHR5IiwiZm10dHkkMTAiLCJzdWJfZm10dHkkMCIsImZtdHR5JDExIiwiZm10dHkkMTIiLCJmbXR0eSQxMyIsImZtdHR5JDE0IiwiZm10dHkkMTUiLCJpbnRfb2ZfY3VzdG9tX2FyaXR5Iiwic3RyaW5nX29mX2ZtdCIsImZtdGl0ZXIiLCJmbXQkMCIsImlnbl9mbGFnJDAiLCJzdHIkMSIsImlzX2Fsb25lJDAiLCJpc19hbG9uZSIsImFmdGVyIiwiYmVmb3JlIiwiaiQxIiwiZm10JDEiLCJzeW1tIiwiZm10dHlfcmVsX2RldCIsImRlIiwiZWQiLCJhZiIsImZhIiwiZGUkMCIsImVkJDAiLCJhZiQwIiwiZmEkMCIsImRlJDEiLCJlZCQxIiwiYWYkMSIsImZhJDEiLCJkZSQyIiwiZWQkMiIsImFmJDIiLCJmYSQyIiwiZGUkMyIsImVkJDMiLCJhZiQzIiwiZmEkMyIsImRlJDQiLCJlZCQ0IiwiYWYkNCIsImZhJDQiLCJkZSQ1IiwiZWQkNSIsImFmJDUiLCJmYSQ1IiwiZGUkNiIsImVkJDYiLCJhZiQ2IiwiZmEkNiIsImRlJDciLCJlZCQ3IiwiYWYkNyIsImZhJDciLCJkZSQ4IiwiZWQkOCIsImFmJDgiLCJmYSQ4IiwidHJhbnMiLCJqZCIsImRqIiwiZ2EiLCJhZyIsImRlJDkiLCJlZCQ5IiwiYWYkOSIsImZhJDkiLCJkZSQxMCIsImVkJDEwIiwiYWYkMTAiLCJmYSQxMCIsImRlJDExIiwiZWQkMTEiLCJhZiQxMSIsImZhJDExIiwiZGUkMTIiLCJlZCQxMiIsImFmJDEyIiwiZmEkMTIiLCJkZSQxMyIsImVkJDEzIiwiYWYkMTMiLCJmYSQxMyIsInJlc3QxIiwicmVzdDIiLCJyZXN0MSQwIiwicmVzdDIkMCIsInJlc3QxJDEiLCJyZXN0MiQxIiwicmVzdDEkMiIsInJlc3QyJDIiLCJyZXN0MSQzIiwicmVzdDIkMyIsInJlc3QxJDQiLCJyZXN0MiQ0IiwicmVzdDEkNSIsInJlc3QyJDUiLCJyZXN0MSQ2IiwicmVzdDIkNiIsInJlc3QxJDciLCJ0eTEkMCIsInJlc3QyJDciLCJ0eTIkMCIsInJlc3QxJDgiLCJ0eTEyIiwidHkxMSIsInJlc3QyJDgiLCJ0eTIyIiwidHkyMSIsImY0IiwiZjIiLCJyZXN0MSQ5IiwicmVzdDIkOSIsInJlc3QxJDEwIiwicmVzdDIkMTAiLCJyZXN0MSQxMSIsInJlc3QyJDExIiwicmVzdDEkMTIiLCJyZXN0MiQxMiIsInJlc3QxJDEzIiwicmVzdDIkMTMiLCJmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IiwiZm10dHlfb2ZfY3VzdG9tIiwiYXJpdHkkMCIsImZtdHR5X29mX2ZtdCIsInR5X3Jlc3QiLCJwcmVjX3R5IiwiZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IiwidHlfcmVzdCQwIiwicHJlY190eSQwIiwidHlfcmVzdCQxIiwicHJlY190eSQxIiwidHlfcmVzdCQyIiwicHJlY190eSQyIiwidHlfcmVzdCQzIiwicHJlY190eSQzIiwidHkkMCIsImZvcm1hdHRpbmdfZ2VuIiwidHlwZV9wYWRkaW5nIiwidyIsInR5cGVfcGFkcHJlYyIsInR5cGVfZm9ybWF0IiwidHlwZV9mb3JtYXRfZ2VuIiwidHlwZV9pZ25vcmVkX3BhcmFtX29uZSIsImZtdHR5MCIsImZtdHR5X3Jlc3QiLCJmbXRfcmVzdCIsImZtdHR5X3Jlc3QkMCIsImZtdF9yZXN0JDAiLCJmbXRfcmVzdCQxIiwiZm10dHlfcmVzdCQxIiwiZm10JDIiLCJmbXRfcmVzdCQyIiwiZm10dHlfcmVzdCQyIiwiZm10JDMiLCJmbXRfcmVzdCQzIiwiZm10dHlfcmVzdCQzIiwiZm10JDQiLCJmbXRfcmVzdCQ0IiwiZm10dHlfcmVzdCQ0IiwiZm10JDUiLCJmbXRfcmVzdCQ1IiwiZm10dHlfcmVzdCQ1IiwicHJlYyQ0IiwiZm10JDYiLCJmbXRfcmVzdCQ2IiwicHJlYyQ1IiwicGFkJDkiLCJwYWQkMTAiLCJmbXR0eV9yZXN0JDYiLCJwcmVjJDYiLCJmbXQkNyIsImZtdF9yZXN0JDciLCJwcmVjJDciLCJwYWQkMTEiLCJwYWQkMTIiLCJmbXR0eV9yZXN0JDciLCJwcmVjJDgiLCJmbXQkOCIsImZtdF9yZXN0JDgiLCJwYWQkMTMiLCJwYWQkMTQiLCJmbXR0eV9yZXN0JDgiLCJmbXQkOSIsImZtdF9yZXN0JDkiLCJmbXQkMTAiLCJmbXRfcmVzdCQxMCIsImZtdCQxMSIsImZtdF9yZXN0JDExIiwiZm10JDEyIiwiZm10dHlfcmVzdCQ5IiwiZm10X3Jlc3QkMTIiLCJmbXQkMTMiLCJmbXR0eV9yZXN0JDEwIiwic3ViX2ZtdHR5MSIsImZtdF9yZXN0JDEzIiwic3ViX2ZtdHR5JDEiLCJmbXQkMTQiLCJmbXR0eV9yZXN0JDExIiwiZm10X3Jlc3QkMTQiLCJmbXQkMTUiLCJmbXR0eV9yZXN0JDEyIiwiZm10X3Jlc3QkMTUiLCJmbXQkMTYiLCJmbXRfcmVzdCQxNiIsImZtdHR5JDE2IiwiZm10JDE3IiwiZm10X3Jlc3QkMTciLCJmbXR0eTMiLCJmbXQzIiwiZm10MSQwIiwiZm10dHkyJDAiLCJmbXQyJDAiLCJmbXR0eTMkMCIsImZtdDMkMCIsImZtdHR5X3Jlc3QkMTMiLCJmbXRfcmVzdCQxOCIsImZtdHR5JDE3IiwiZm10JDE4IiwiZm10dHlfcmVzdCQxNCIsImZtdF9yZXN0JDE5IiwiZm10dHkkMTgiLCJmbXQkMTkiLCJmbXR0eV9yZXN0JDE1IiwiZm10X3Jlc3QkMjAiLCJmbXR0eSQxOSIsImZtdCQyMCIsInN1Yl9mbXR0eSQyIiwic3ViX2ZtdHR5JDMiLCJ0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGkiLCJmbXR0eSQyMSIsImZtdCQyMiIsInN1Yl9mbXR0eSQ0IiwiZm10dHlfcmVzdCQxNiIsImZtdHR5JDIwIiwiZm10JDIxIiwic3ViX2ZtdHR5X3Jlc3QiLCJzdWJfZm10dHlfcmVzdCQwIiwic3ViX2ZtdHR5X3Jlc3QkMSIsInN1Yl9mbXR0eV9yZXN0JDIiLCJzdWJfZm10dHlfcmVzdCQzIiwic3ViX2ZtdHR5X3Jlc3QkNCIsInN1Yl9mbXR0eV9yZXN0JDUiLCJzdWJfZm10dHlfcmVzdCQ2Iiwic3ViX2ZtdHR5X3Jlc3QkNyIsInN1Yl9mbXR0eV9yZXN0JDgiLCJzdWJfZm10dHlfcmVzdCQ5Iiwic3ViX2ZtdHR5X3Jlc3QkMTAiLCJzdWJfZm10dHlfcmVzdCQxMSIsInN1Yl9mbXR0eV9yZXN0JDEyIiwic3ViX2ZtdHR5X3Jlc3QkMTMiLCJzdWJfZm10dHlfcmVzdCQxNCIsInN1YjJfZm10dHkiLCJzdWJfZm10dHlfcmVzdCQxNSIsInN1YjJfZm10dHkkMCIsInN1Yl9mbXR0eV9yZXN0JDE2Iiwic3ViMl9mbXR0eSQxIiwic3ViMV9mbXR0eSIsInN1Yl9mbXR0eV9yZXN0JDE3Iiwic3ViMl9mbXR0eSQyIiwic3ViMV9mbXR0eSQwIiwic3ViX2ZtdHR5X3Jlc3QkMTgiLCJzdWJfZm10dHlfcmVzdCQxOSIsInN1Yl9mbXR0eV9yZXN0JDIwIiwic3ViX2ZtdHR5X3Jlc3QkMjEiLCJzdWJfZm10dHlfcmVzdCQyMiIsInN1Yl9mbXR0eV9yZXN0JDIzIiwic3ViX2ZtdHR5X3Jlc3QkMjQiLCJzdWJfZm10dHlfcmVzdCQyNSIsInN1Yl9mbXR0eV9yZXN0JDI2IiwicmVjYXN0IiwiZml4X3BhZGRpbmciLCJ3aWR0aCQwIiwiZml4X2ludF9wcmVjaXNpb24iLCJyZXMkMSIsInN0cmluZ190b19jYW1sX3N0cmluZyIsImZvcm1hdF9vZl9mY29udiIsInN5bWIiLCJ0cmFuc2Zvcm1faW50X2FsdCIsImRpZ2l0cyIsInB1dCIsImNvbnZlcnRfaW50IiwiY29udmVydF9pbnQzMiIsImNvbnZlcnRfbmF0aXZlaW50IiwiY29udmVydF9pbnQ2NCIsImNvbnZlcnRfZmxvYXQiLCJoZXgiLCJzaWduIiwiY2FtbF9zcGVjaWFsX3ZhbCIsInN0cmluZ19vZl9mbXR0eSIsIm1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIiwibWFrZV9wcmludGYiLCJwJDAiLCJwJDEiLCJtYWtlX3BhZGRpbmciLCJuZXdfYWNjIiwibWFrZV9wcmludGYkMCIsImFjYyQzIiwiYWNjJDQiLCJrJDMiLCJrYWNjIiwiayQ0IiwibWFrZV9pZ25vcmVkX3BhcmFtJDAiLCJtYWtlX2N1c3RvbSQwIiwibWFrZV9pbnZhbGlkX2FyZyIsIm1ha2VfZnJvbV9mbXR0eSQwIiwibWFrZV9mcm9tX2ZtdHR5IiwibWFrZV9jdXN0b20iLCJtYWtlX2lnbm9yZWRfcGFyYW0iLCJmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiIsIm1ha2VfaXByaW50ZiIsIm1ha2VfaXByaW50ZiQwIiwia29jIiwicmVzdCQyNCIsInJlc3QkMjUiLCJyZXN0JDI2IiwicmVzdCQyNyIsInJlc3QkMjgiLCJyZXN0JDI5IiwiZm5fb2ZfY3VzdG9tX2FyaXR5JDAiLCJmbl9vZl9jdXN0b21fYXJpdHkiLCJvdXRwdXRfYWNjIiwicCQzIiwicCQ0IiwicCQ1IiwicCQyIiwiYnVmcHV0X2FjYyIsInN0cnB1dF9hY2MiLCJmYWlsd2l0aF9tZXNzYWdlIiwib3Blbl9ib3hfb2Zfc3RyaW5nIiwiaW52YWxpZF9ib3giLCJwYXJzZV9zcGFjZXMiLCJ3c3RhcnQiLCJ3ZW5kIiwiYm94X25hbWUiLCJuc3RhcnQiLCJuZW5kIiwiaW5kZW50IiwiZXhwX2VuZCIsImJveF90eXBlIiwibWFrZV9wYWRkaW5nX2ZtdF9lYmIiLCJtYWtlX3BhZHByZWNfZm10X2ViYiIsImZtdF9lYmJfb2Zfc3RyaW5nIiwibGVnYWN5X2JlaGF2aW9yIiwiZmxhZyIsImxlZ2FjeV9iZWhhdmlvciQwIiwiaW52YWxpZF9mb3JtYXRfbWVzc2FnZSIsInVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCIsImVuZF9pbmQiLCJpbnZhbGlkX2Zvcm1hdF93aXRob3V0IiwiZXhwZWN0ZWRfY2hhcmFjdGVyIiwiZXhwZWN0ZWQiLCJhZGRfbGl0ZXJhbCIsImxpdF9zdGFydCIsInBhcnNlIiwic3RyX2luZCQyIiwicGFyc2VfZmxhZ3MiLCJzdHJfaW5kJDEiLCJzdHJfaW5kJDAiLCJwYXJzZV90YWciLCJzdHJfaW5kJDMiLCJzdHJfaW5kXzEiLCJwYXJzZV9pbnRlZ2VyIiwic3RyX2luZF8yIiwic3RyX2luZF8zIiwiZm9ybWF0dGluZ19saXQkMCIsIm5leHRfaW5kIiwic3RyX2luZF80Iiwic3RyX2luZF81Iiwic3RyX2luZCQ0Iiwic3RyX2luZF8xJDAiLCJzdHJfaW5kXzIkMCIsInN0cl9pbmRfMyQwIiwicyQxIiwiZm9ybWF0dGluZ19saXQkMSIsIm5leHRfaW5kJDAiLCJwYXJzZV9jb252ZXJzaW9uIiwicGN0X2luZCIsInBsdXMiLCJzcGFjZSIsInBhZHByZWMiLCJwbHVzX3VzZWQiLCJoYXNoX3VzZWQiLCJzcGFjZV91c2VkIiwiaWduX3VzZWQiLCJwYWRfdXNlZCIsInByZWNfdXNlZCIsImdldF9wbHVzIiwiZ2V0X2hhc2giLCJnZXRfc3BhY2UiLCJnZXRfaWduIiwiZ2V0X3BhZCIsImdldF9wcmVjIiwiZ2V0X3BhZHByZWMiLCJnZXRfaW50X3BhZCIsImluY29tcGF0aWJsZV9mbGFnIiwiY2hlY2tfbm9fMCIsIm9wdF9vZl9wYWQiLCJ3aWR0aCQxIiwiZ2V0X3BhZF9vcHQiLCJnZXRfcGFkcHJlY19vcHQiLCJmbXRfcmVzdWx0Iiwic3ViX2VuZCIsInNlYXJjaF9zdWJmb3JtYXRfZW5kIiwic3ViX2ZtdCIsImlnbm9yZWQkMiIsImNvdW50ZXIkMCIsImlnbm9yZWQkNiIsImlnbm9yZWQkNyIsImFkZF9yYW5nZSIsImZhaWxfc2luZ2xlX3BlcmNlbnQiLCJwYXJzZV9jaGFyX3NldF9jb250ZW50IiwicGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciQwIiwicGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciIsInJldmVyc2UiLCJjaGFyX3NldCQxIiwiaWdub3JlZCQ5IiwiY2hhcl9mb3JtYXQiLCJmbXRfcmVzdCQyMSIsImZtdF9yZXN0JDIyIiwiZm10X3Jlc3QkMjMiLCJpZ25vcmVkJDEwIiwiZm10X3Jlc3QkMjQiLCJmbXRfcmVzdCQyNSIsInN1Yl9lbmQkMCIsInN1Yl9mbXQkMCIsImZtdF9yZXN0JDI2IiwiaWdub3JlZCQxMSIsImlnbm9yZWQkMyIsInN5bWIkMCIsImlnbm9yZWQkNSIsImNvbXB1dGVfaW50X2NvbnYiLCJpZ25vcmVkJDgiLCJzcGFjZSQxIiwiaGFzaCQxIiwicGx1cyQyIiwia2luZCIsImlnbm9yZWQkNCIsImlnbm9yZWQiLCJpZ25vcmVkJDAiLCJpZ25vcmVkJDEiLCJwbHVzJDAiLCJoYXNoJDAiLCJzcGFjZSQwIiwicGx1cyQxIiwiaWduJDAiLCJwYXJzZV9hZnRlcl9wcmVjaXNpb24iLCJtaW51cyIsInBhcnNlX2NvbnYiLCJwYXJzZV9hZnRlcl9wYWRkaW5nIiwicGFyc2VfbGl0ZXJhbCIsInBhcnNlX3Bvc2l0aXZlIiwibmV3X2luZCIsIm1pbnVzJDAiLCJzZXRfZmxhZyIsInN0cl9pbmQkNSIsInplcm8kMCIsImlzX29wZW5fdGFnIiwiaW5kIiwic3ViX3N0ciIsInN1Yl9mb3JtYXQkMCIsImZvcm1hdHRpbmckMCIsImZvcm1hdHRpbmciLCJzdHJfaW5kJDciLCJzdWJfZW5kJDEiLCJzdWJfZW5kJDIiLCJzdHJfaW5kJDYiLCJvcHRpb24iLCJzdWJmbXQiLCJmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IiwiZm9ybWF0X29mX3N0cmluZ19mb3JtYXQiLCJrZnByaW50ZiIsImticHJpbnRmIiwiaWtmcHJpbnRmIiwiZnByaW50ZiIsImJwcmludGYiLCJpZnByaW50ZiIsImlicHJpbnRmIiwicHJpbnRmIiwiZXByaW50ZiIsImtzcHJpbnRmIiwic3ByaW50ZiIsImFzc29jMyIsInkyIiwieTEiLCJtYWtlX3N5bWxpc3QiLCJoZWxwX2FjdGlvbiIsImFkZF9oZWxwIiwic3BlY2xpc3QiLCJhZGQxIiwiYWRkMiIsInVzYWdlX2IiLCJlcnJtc2ciLCJkb2MiLCJzcGVjIiwia2V5IiwidXNhZ2Vfc3RyaW5nIiwidXNhZ2UiLCJjdXJyZW50IiwicGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNfIiwiYWxsb3dfZXhwYW5kIiwiYXJndiIsImFub25mdW4iLCJpbml0cG9zIiwiY29udmVydF9lcnJvciIsInByb2duYW1lIiwiZm9sbG93JDAiLCJrZXl3b3JkIiwibm9fYXJnJDAiLCJmb2xsb3ciLCJub19hcmciLCJnZXRfYXJnJDAiLCJnZXRfYXJnIiwiY29uc3VtZV9hcmckMCIsImNvbnN1bWVfYXJnIiwidHJlYXRfYWN0aW9uJDAiLCJ0cmVhdF9hY3Rpb24iLCJmJDAiLCJmJDEiLCJyJDEiLCJmJDIiLCJhcmckMSIsInIkMiIsImFyZyQyIiwiZiQzIiwiYXJnJDMiLCJ4JDEiLCJyJDMiLCJhcmckNCIsIngkMiIsInNwZWNzIiwiZiQ0IiwiYXJnJDUiLCJmJDUiLCJmJDYiLCJmJDciLCJhcmckNiIsIm5ld2FyZyIsInBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljIiwicGFyc2VfYXJndl9keW5hbWljIiwiY3VycmVudCQwIiwicGFyc2VfYXJndiIsIm1zZyQwIiwibXNnJDEiLCJwYXJzZV9keW5hbWljIiwicGFyc2VfZXhwYW5kIiwic2Vjb25kX3dvcmQiLCJsb29wIiwibWF4X2FyZ19sZW4iLCJjdXIiLCJrd2QiLCJyZXBsYWNlX2xlYWRpbmdfdGFiIiwic2VlbiIsImFsaWduIiwibGltaXQiLCJjb21wbGV0ZWQiLCJrc2QiLCJjdXRjb2wkMCIsInNwYWNlcyQwIiwic3BlYyQwIiwiY3V0Y29sIiwia3dkX2xlbiIsInNwYWNlcyIsInJlYWRfYXV4IiwiZmlsZSIsIndvcmRzIiwic3Rhc2giLCJ3b3JkIiwid29yZCQwIiwicmVhZF9hcmciLCJyZWFkX2FyZzAiLCJ3cml0ZV9hdXgiLCJhcmdzIiwid3JpdGVfYXJnIiwid3JpdGVfYXJnMCIsImxvY2ZtdCIsInByaW50ZXJzIiwiZmllbGQiLCJvdGhlcl9maWVsZHMiLCJ1c2VfcHJpbnRlcnMiLCJzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG8iLCJjb25zdHJ1Y3RvciIsImZpZWxkc19vcHQiLCJjb25zdHJ1Y3RvciQwIiwidG9fc3RyaW5nX2RlZmF1bHQiLCJjaGFyJDAiLCJsaW5lIiwiY2hhciQxIiwibGluZSQwIiwiZmlsZSQwIiwiY2hhciQyIiwibGluZSQxIiwiZmlsZSQxIiwicHJpbnQiLCJmY3QiLCJjYXRjaCQwIiwicmF3X2JhY2t0cmFjZV9lbnRyaWVzIiwiYnQiLCJjb252ZXJ0X3Jhd19iYWNrdHJhY2UiLCJmb3JtYXRfYmFja3RyYWNlX3Nsb3QiLCJpc19yYWlzZSIsInByaW50X3Jhd19iYWNrdHJhY2UiLCJvdXRjaGFuIiwicmF3X2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsInByaW50X2JhY2t0cmFjZSIsInJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIiwiYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2UiLCJwYXJhbSIsImJhY2t0cmFjZV9zbG90X2lzX2lubGluZSIsImJhY2t0cmFjZV9zbG90X2xvY2F0aW9uIiwiYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSIsImJhY2t0cmFjZV9zbG90cyIsImJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkiLCJlbnRyeSIsInJhd19iYWNrdHJhY2VfbGVuZ3RoIiwiZ2V0X2JhY2t0cmFjZSIsInJlZ2lzdGVyX3ByaW50ZXIiLCJmbiIsIm9sZF9wcmludGVycyIsIm5ld19wcmludGVycyIsImV4bl9zbG90IiwiZXhuX3Nsb3RfaWQiLCJleG5fc2xvdF9uYW1lIiwiZXJyb3JzIiwiZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuIiwic3RhdHVzIiwidW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIiLCJzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIiLCJlbXB0eV9iYWNrdHJhY2UiLCJoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uIiwiZGVidWdnZXJfaW5fdXNlIiwiZXhuJDEiLCJyYXdfYmFja3RyYWNlJDAiLCJjb25zdCQwIiwiZmxpcCIsIm5lZ2F0ZSIsInByb3RlY3QiLCJmaW5hbGx5JDAiLCJ3b3JrIiwiZmluYWxseV9ub19leG4iLCJ3b3JrX2V4biQwIiwid29ya19leG4iLCJ3b3JrX2J0IiwiZXZlbnRsb2dfcGF1c2UiLCJldmVudGxvZ19yZXN1bWUiLCJwcmludF9zdGF0IiwiYWxsb2NhdGVkX2J5dGVzIiwibWEiLCJwcm8iLCJtaSIsImNyZWF0ZV9hbGFybSIsImRlbGV0ZV9hbGFybSIsIm51bGxfdHJhY2tlciIsInNhbXBsaW5nX3JhdGUiLCJ0cmFja2VyIiwiY2FsbHN0YWNrX3NpemUiLCJzdHJpbmciLCJieXRlcyIsInN1YnN0cmluZyIsInN1YmJ5dGVzIiwiZmlsZW5hbWUiLCJkaWdlc3QiLCJjaGFyX2hleCIsInRvX2hleCIsImZyb21faGV4IiwiZGlnaXQiLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImludDhfc2lnbmVkIiwiaW50OF91bnNpZ25lZCIsImludDE2X3NpZ25lZCIsImludDE2X3Vuc2lnbmVkIiwiaW50MzIiLCJpbnQ2NCIsImludCQwIiwibmF0aXZlaW50IiwiY29tcGxleDMyIiwiY29tcGxleDY0Iiwia2luZF9zaXplX2luX2J5dGVzIiwiY19sYXlvdXQiLCJmb3J0cmFuX2xheW91dCIsImNsb29wIiwiYXJyIiwiY29sIiwiZmxvb3AiLCJsYXlvdXQiLCJkaW1zIiwiZGxlbiIsInNpemVfaW5fYnl0ZXMiLCJzaXplX2luX2J5dGVzJDAiLCJvZl92YWx1ZSIsImNyZWF0ZSQwIiwiZGltIiwic2l6ZV9pbl9ieXRlcyQxIiwic2xpY2UiLCJpbml0JDAiLCJvZl9hcnJheSIsImJhIiwiY3JlYXRlJDEiLCJkaW0xIiwiZGltMiIsInNpemVfaW5fYnl0ZXMkMiIsInNsaWNlX2xlZnQiLCJzbGljZV9yaWdodCIsImluaXQkMSIsIm9mX2FycmF5JDAiLCJyb3ciLCJjcmVhdGUkMiIsImRpbTMiLCJzaXplX2luX2J5dGVzJDMiLCJzbGljZV9sZWZ0XzEiLCJzbGljZV9yaWdodF8xIiwic2xpY2VfbGVmdF8yIiwic2xpY2VfcmlnaHRfMiIsImluaXQkMiIsIm9mX2FycmF5JDEiLCJhcnJheTBfb2ZfZ2VuYXJyYXkiLCJhcnJheTFfb2ZfZ2VuYXJyYXkiLCJhcnJheTJfb2ZfZ2VuYXJyYXkiLCJhcnJheTNfb2ZfZ2VuYXJyYXkiLCJyZXNoYXBlXzAiLCJyZXNoYXBlXzEiLCJyZXNoYXBlXzIiLCJyZXNoYXBlXzMiLCJpMyIsImk0IiwiaTMkMCIsImk0JDAiLCJtayIsInJlaW5pdCIsInNlZWQiLCJtYWtlX3NlbGZfaW5pdCIsImJpdHMiLCJpbnRhdXgiLCJib3VuZCIsImZ1bGxfaW50IiwiYml0czMyIiwiYml0czY0IiwibmF0aXZlYml0cyIsImZsb2F0JDAiLCJib29sIiwibWtfZGVmYXVsdCIsInJhbmRvbV9rZXkiLCJiaXRzJDAiLCJpbnQkMSIsImZ1bGxfaW50JDAiLCJpbnQzMiQwIiwibmF0aXZlaW50JDAiLCJpbnQ2NCQwIiwiZmxvYXQkMSIsInNjYWxlIiwiYm9vbCQwIiwiYml0czMyJDAiLCJiaXRzNjQkMCIsIm5hdGl2ZWJpdHMkMCIsImZ1bGxfaW5pdCIsInNlbGZfaW5pdCIsInNwbGl0JDAiLCJnZXRfc3RhdGUiLCJzZXRfc3RhdGUiLCJvbmdvaW5nX3RyYXZlcnNhbCIsImZsaXBfb25nb2luZ190cmF2ZXJzYWwiLCJwYXJhbXMiLCJyYW5kb21pemVkX2RlZmF1bHQiLCJyYW5kb21pemVkIiwicmFuZG9taXplIiwiaXNfcmFuZG9taXplZCIsInBybmdfa2V5IiwicG93ZXJfMl9hYm92ZSIsImluaXRpYWxfc2l6ZSIsInJhbmRvbSIsImNvcHlfYnVja2V0bGlzdCIsImtleSQwIiwibmV4dCQwIiwiaW5zZXJ0X2FsbF9idWNrZXRzIiwiaW5kZXhmdW4iLCJpbnBsYWNlIiwib2RhdGEiLCJuZGF0YSIsIm5zaXplIiwibmRhdGFfdGFpbCIsIm5pZHgiLCJtYXRjaCQwIiwib3NpemUiLCJvbGRfdHJhdiIsImZpbHRlcl9tYXBfaW5wbGFjZSIsImJ1Y2tldF9sZW5ndGgiLCJzdGF0cyIsIm1ibCIsImhpc3RvIiwidGJsX2RhdGEiLCJidWNrIiwiYnVjayQwIiwiYnVjayQxIiwidG9fc2VxX2tleXMiLCJ0b19zZXFfdmFsdWVzIiwia2V5X2luZGV4IiwiYnVja2V0IiwiazEiLCJuZXh0MSIsImsyIiwibmV4dDIiLCJrMyIsImQzIiwibmV4dDMiLCJmaW5kX2luX2J1Y2tldCIsInJlcGxhY2UiLCJyZXBsYWNlX3NlcSIsInNlZWRlZF9oYXNoIiwiaGFzaF9wYXJhbSIsInJlYnVpbGQiLCJnZXRfY29weSIsImFyIiwiZW1wdHlidWNrZXQiLCJnZXRfaW5kZXgiLCJzeiQwIiwic3okMSIsImNvdW50X2J1Y2tldCIsImNvdW50IiwiYWRkX2F1eCIsInNldHRlciIsImJ1Y2tldCQwIiwiaGFzaGVzIiwibmV3c3oiLCJuZXdidWNrZXQkMCIsIm5ld2hhc2hlcyIsImhidWNrZXQiLCJwcmV2X2xlbiIsImxpdmUiLCJqJDIiLCJuZXdidWNrZXQiLCJvbGRsZW4iLCJuZXd0Iiwib2IiLCJvaSIsIm9oIiwic2V0dGVyJDAiLCJuaSIsImZpbmRfb3IiLCJpZm5vdGZvdW5kIiwiZmluZF9zaGFkb3ciLCJpZmZvdW5kIiwibGVucyIsInRvdGxlbiIsInVua25vd24iLCJwcF9lbnF1ZXVlIiwidG9rZW4iLCJwcF9pbmZpbml0eSIsInBwX291dHB1dF9zdHJpbmciLCJwcF9vdXRwdXRfbmV3bGluZSIsImZvcm1hdF9wcF90ZXh0IiwidGV4dCIsImZvcm1hdF9zdHJpbmciLCJicmVha19uZXdfbGluZSIsInJlYWxfaW5kZW50IiwiYnJlYWtfbGluZSIsImJyZWFrX3NhbWVfbGluZSIsImZvcm1hdF9wcF90b2tlbiIsInNpemUkMCIsInRhYnMiLCJhZGRfdGFiIiwibHMiLCJ0YWdfbmFtZSIsIm1hcmtlciIsImJyZWFrcyIsImZpdHMiLCJvZmYiLCJib3hfdHlwZSQwIiwib2ZmJDAiLCJpbnNlcnRpb25fcG9pbnQiLCJ0YWJzJDAiLCJmaXJzdCIsImhlYWQiLCJ0YWIiLCJvZmYkMSIsImluc2VydGlvbl9wb2ludCQwIiwid2lkdGgkMiIsImJveF90eXBlJDEiLCJ0Ym94IiwidGFnX25hbWUkMCIsIm1hcmtlciQwIiwiYWR2YW5jZV9sZWZ0IiwicGVuZGluZ19jb3VudCIsImVucXVldWVfYWR2YW5jZSIsImVucXVldWVfc3RyaW5nX2FzIiwiaW5pdGlhbGl6ZV9zY2FuX3N0YWNrIiwic3RhY2siLCJxdWV1ZV9lbGVtIiwic2V0X3NpemUiLCJsZWZ0X3RvdGFsIiwic2Nhbl9wdXNoIiwiZWxlbSIsInBwX29wZW5fYm94X2dlbiIsImJyX3R5IiwicHBfY2xvc2VfYm94IiwicHBfb3Blbl9zdGFnIiwicHBfY2xvc2Vfc3RhZyIsInBwX3NldF9wcmludF90YWdzIiwicHBfc2V0X21hcmtfdGFncyIsInBwX2dldF9wcmludF90YWdzIiwicHBfZ2V0X21hcmtfdGFncyIsInBwX3NldF90YWdzIiwicHBfZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9uIiwicHBfc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9uIiwicGN0IiwicG90IiwibWN0IiwibW90IiwicHBfcmluaXQiLCJwcF9mbHVzaF9xdWV1ZSIsInBwX3ByaW50X2FzX3NpemUiLCJwcF9wcmludF9hcyIsImlzaXplIiwicHBfcHJpbnRfc3RyaW5nIiwicHBfcHJpbnRfYnl0ZXMiLCJwcF9wcmludF9pbnQiLCJwcF9wcmludF9mbG9hdCIsInBwX3ByaW50X2Jvb2wiLCJwcF9wcmludF9jaGFyIiwicHBfb3Blbl9oYm94IiwicHBfb3Blbl92Ym94IiwicHBfb3Blbl9odmJveCIsInBwX29wZW5faG92Ym94IiwicHBfb3Blbl9ib3giLCJwcF9wcmludF9uZXdsaW5lIiwicHBfcHJpbnRfZmx1c2giLCJwcF9mb3JjZV9uZXdsaW5lIiwicHBfcHJpbnRfaWZfbmV3bGluZSIsInBwX3ByaW50X2N1c3RvbV9icmVhayIsInBwX3ByaW50X2JyZWFrIiwicHBfcHJpbnRfc3BhY2UiLCJwcF9wcmludF9jdXQiLCJwcF9vcGVuX3Rib3giLCJwcF9jbG9zZV90Ym94IiwicHBfcHJpbnRfdGJyZWFrIiwicHBfcHJpbnRfdGFiIiwicHBfc2V0X3RhYiIsInBwX3NldF9tYXhfYm94ZXMiLCJwcF9nZXRfbWF4X2JveGVzIiwicHBfb3Zlcl9tYXhfYm94ZXMiLCJwcF9zZXRfZWxsaXBzaXNfdGV4dCIsInBwX2dldF9lbGxpcHNpc190ZXh0IiwicHBfbGltaXQiLCJwcF9zZXRfbWF4X2luZGVudCIsInBwX2dldF9tYXhfaW5kZW50IiwicHBfc2V0X21hcmdpbiIsIm5ld19tYXhfaW5kZW50IiwidmFsaWRhdGVfZ2VvbWV0cnkiLCJtYXJnaW4iLCJtYXhfaW5kZW50IiwiY2hlY2tfZ2VvbWV0cnkiLCJnZW9tZXRyeSIsInBwX2dldF9tYXJnaW4iLCJwcF9zZXRfZnVsbF9nZW9tZXRyeSIsInBwX3NldF9nZW9tZXRyeSIsInBwX3NhZmVfc2V0X2dlb21ldHJ5IiwicHBfZ2V0X2dlb21ldHJ5IiwicHBfdXBkYXRlX2dlb21ldHJ5IiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwicHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3RpIiwicHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3RpIiwiZGlzcGxheV9uZXdsaW5lIiwiYmxhbmtfbGluZSIsImRpc3BsYXlfYmxhbmtzIiwicHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCIsImRlZmF1bHRfcHBfbWFya19vcGVuX3RhZyIsImRlZmF1bHRfcHBfbWFya19jbG9zZV90YWciLCJkZWZhdWx0X3BwX3ByaW50X29wZW5fdGFnIiwiZGVmYXVsdF9wcF9wcmludF9jbG9zZV90YWciLCJwcF9tYWtlX2Zvcm1hdHRlciIsInBwX3F1ZXVlIiwic3lzX3RvayIsInNjYW5fc3RhY2siLCJmb3JtYXR0ZXJfb2Zfb3V0X2Z1bmN0aW9ucyIsIm91dF9mdW5zIiwibWFrZV9mb3JtYXR0ZXIiLCJmbHVzaCIsInBwZiIsImZvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCIsImZvcm1hdHRlcl9vZl9idWZmZXIiLCJwcF9idWZmZXJfc2l6ZSIsInBwX21ha2VfYnVmZmVyIiwic3RkYnVmIiwic3RkX2Zvcm1hdHRlciIsImVycl9mb3JtYXR0ZXIiLCJzdHJfZm9ybWF0dGVyIiwic3RkYnVmX2tleSIsInN0cl9mb3JtYXR0ZXJfa2V5IiwiYnVmZmVyZWRfb3V0X3N0cmluZyIsImJ1ZmZlcmVkX291dF9mbHVzaCIsInN0ZF9idWZfa2V5IiwiZXJyX2J1Zl9rZXkiLCJzdGRfZm9ybWF0dGVyX2tleSIsImVycl9mb3JtYXR0ZXJfa2V5IiwiZ2V0X3N0ZF9mb3JtYXR0ZXIiLCJnZXRfZXJyX2Zvcm1hdHRlciIsImdldF9zdHJfZm9ybWF0dGVyIiwiZ2V0X3N0ZGJ1ZiIsImZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIiLCJmbHVzaF9zdHJfZm9ybWF0dGVyIiwibWFrZV9zeW5jaHJvbml6ZWRfZm9ybWF0dGVyIiwib3V0cHV0JDAiLCJmbHVzaCQwIiwic3luY2hyb25pemVkX2Zvcm1hdHRlcl9vZl9vdXRfIiwibWFrZV9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwiY2xlYXJfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsInNvYiIsImdldF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwiZmx1c2hfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciIsIml0ZW1zIiwiYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIiwiaXRlbSIsImZvcm1hdHRlcl9vZl9zeW1ib2xpY19vdXRwdXRfYiIsIm9wZW5faGJveCIsIm9wZW5fdmJveCIsIm9wZW5faHZib3giLCJvcGVuX2hvdmJveCIsIm9wZW5fYm94IiwiY2xvc2VfYm94Iiwib3Blbl9zdGFnIiwiY2xvc2Vfc3RhZyIsInByaW50X2FzIiwicHJpbnRfYm9vbCIsInByaW50X2JyZWFrIiwicHJpbnRfY3V0IiwicHJpbnRfc3BhY2UiLCJmb3JjZV9uZXdsaW5lIiwicHJpbnRfZmx1c2giLCJwcmludF9pZl9uZXdsaW5lIiwib3Blbl90Ym94IiwiY2xvc2VfdGJveCIsInByaW50X3RicmVhayIsInNldF90YWIiLCJwcmludF90YWIiLCJzZXRfbWFyZ2luIiwiZ2V0X21hcmdpbiIsInNldF9tYXhfaW5kZW50IiwiZ2V0X21heF9pbmRlbnQiLCJzZXRfZ2VvbWV0cnkiLCJzYWZlX3NldF9nZW9tZXRyeSIsImdldF9nZW9tZXRyeSIsInVwZGF0ZV9nZW9tZXRyeSIsInNldF9tYXhfYm94ZXMiLCJnZXRfbWF4X2JveGVzIiwib3Zlcl9tYXhfYm94ZXMiLCJzZXRfZWxsaXBzaXNfdGV4dCIsImdldF9lbGxpcHNpc190ZXh0Iiwic2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCIsInNldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyIsImdldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyIsInNldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyIsImdldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyIsInNldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMiLCJnZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIiwic2V0X3ByaW50X3RhZ3MiLCJnZXRfcHJpbnRfdGFncyIsInNldF9tYXJrX3RhZ3MiLCJnZXRfbWFya190YWdzIiwic2V0X3RhZ3MiLCJwcF9wcmludF9saXN0IiwicHBfdiIsIm9wdCQwIiwicHBfc2VwIiwib3B0JDEiLCJwcF9wcmludF9zZXEiLCJzZXEkMSIsInNlcSQyIiwicHBfcHJpbnRfdGV4dCIsInBwX3ByaW50X29wdGlvbiIsInBwX3ByaW50X3Jlc3VsdCIsInBwX3ByaW50X2VpdGhlciIsImNvbXB1dGVfdGFnIiwidGFnX2FjYyIsIm91dHB1dF9mb3JtYXR0aW5nX2xpdCIsImJ0eSIsInAkNiIsInAkNyIsInNpemUkMSIsInAkOCIsImtkcHJpbnRmIiwiZHByaW50ZiIsImthc3ByaW50ZiIsImFzcHJpbnRmIiwiZmx1c2hfc3RhbmRhcmRfZm9ybWF0dGVycyIsImZzIiwiZnMkMCIsIm51bGxfY2hhciIsIm5leHRfY2hhciIsImliIiwicGVla19jaGFyIiwiY2hlY2tlZF9wZWVrX2NoYXIiLCJlbmRfb2ZfaW5wdXQiLCJiZWdpbm5pbmdfb2ZfaW5wdXQiLCJuYW1lX29mX2lucHV0IiwiY2hhcl9jb3VudCIsImludmFsaWRhdGVfY3VycmVudF9jaGFyIiwidG9rZW5fc3RyaW5nIiwidG9rZW5fYnVmZmVyIiwic2tpcF9jaGFyIiwiaWdub3JlX2NoYXIiLCJzdG9yZV9jaGFyIiwiZGVmYXVsdF90b2tlbl9idWZmZXJfc2l6ZSIsImluYW1lIiwic2Nhbl9jbG9zZV9hdF9lbmQiLCJzY2FuX3JhaXNlX2F0X2VuZCIsImZyb21faWMiLCJzY2FuX2Nsb3NlX2ljIiwiZW9mIiwib3Blbl9pbl9maWxlIiwiY2xvc2VfaW4iLCJpYyQwIiwiYmFkX2lucHV0IiwiYmFkX2lucHV0X2VzY2FwZSIsImJhZF90b2tlbl9sZW5ndGgiLCJtZXNzYWdlIiwiYmFkX2Zsb2F0IiwiYmFkX2hleF9mbG9hdCIsImNoYXJhY3Rlcl9taXNtYXRjaCIsImNpIiwiY2hlY2tfdGhpc19jaGFyIiwiY2hlY2tfY2hhciIsInRva2VuX2NoYXIiLCJ0b2tlbl9ib29sIiwiaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIiLCJ0b2tlbl9pbnRfbGl0ZXJhbCIsImNvbnYiLCJ0b2tlbl9mbG9hdCIsInNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIiwic2Nhbl9kZWNpbWFsX2RpZ2l0X3BsdXMiLCJzY2FuX2RpZ2l0X3BsdXMiLCJiYXNpcyIsImRpZ2l0cCIsIndpZHRoJDMiLCJpc19iaW5hcnlfZGlnaXQiLCJzY2FuX2JpbmFyeV9pbnQiLCJpc19vY3RhbF9kaWdpdCIsInNjYW5fb2N0YWxfaW50IiwiaXNfaGV4YV9kaWdpdCIsInNjYW5faGV4YWRlY2ltYWxfaW50Iiwic2Nhbl9zaWduIiwic2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsIiwic2Nhbl9pbnRfY29udmVyc2lvbiIsInNjYW5fZnJhY3Rpb25hbF9wYXJ0Iiwic2Nhbl9leHBvbmVudF9wYXJ0Iiwic2Nhbl9mbG9hdCIsInByZWNpc2lvbiIsInByZWNpc2lvbiQwIiwiY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmciLCJsb3dlcmNhc2UiLCJzY2FuX2hleF9mbG9hdCIsIndpZHRoJDQiLCJ3aWR0aCQ1Iiwid2lkdGgkNiIsIndpZHRoJDEwIiwid2lkdGgkNyIsIndpZHRoJDgiLCJ3aWR0aCQ5Iiwic2Nhbl9jYW1sX2Zsb2F0X3Jlc3QiLCJ3aWR0aF9wcmVjaXNpb24iLCJmcmFjX3dpZHRoIiwic2Nhbl9jYW1sX2Zsb2F0Iiwic2Nhbl9zdHJpbmciLCJzdHAiLCJoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIiwiY2hlY2tfbmV4dF9jaGFyIiwiY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIiwiY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmciLCJzY2FuX2JhY2tzbGFzaF9jaGFyIiwiYzAiLCJnZXRfZGlnaXQiLCJnZXRfZGlnaXQkMCIsImMxJDAiLCJjMiQwIiwic2Nhbl9jYW1sX3N0cmluZyIsImZpbmRfc3RvcCQwIiwic2tpcF9zcGFjZXMiLCJmaW5kX3N0b3AiLCJzY2FuX2NoYXJzX2luX2NoYXJfc2V0Iiwic2Nhbl9pbmRpYyIsInNjYW5fY2hhcnMiLCJzY2FuZl9iYWRfaW5wdXQiLCJ3aWR0aF9vZl9wYWRfb3B0Iiwic3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCIsImZtdGluZyIsInRha2VfZm9ybWF0X3JlYWRlcnMkMCIsInRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMkMCIsInJlYWRlciIsIm5ld19rIiwicmVhZGVyc19yZXN0IiwidGFrZV9mb3JtYXRfcmVhZGVycyIsInRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMiLCJwYWRfcHJlY19zY2FuZiIsInJlYWRlcnMiLCJtYWtlX3NjYW5mIiwic2NhbiQwIiwic3RyX3Jlc3QiLCJzY2FuJDEiLCJzY2FuJDIiLCJzY2FuJDMiLCJzY2FuJDQiLCJjb252JDAiLCJzY2FuJDUiLCJjb252JDEiLCJzY2FuJDYiLCJjb252JDIiLCJzY2FuJDciLCJzY2FuJDgiLCJmbXRpbmdfbGl0JDAiLCJzdHAkMCIsInMkMiIsInN0cl9yZXN0JDAiLCJhcmdfcmVzdCIsImtzY2FuZl9nZW4iLCJlZiIsImFyZ3MkMSIsImV4YyQwIiwiZXhjIiwiYXJncyQwIiwia3NjYW5mIiwia3NjYW5mX29wdCIsImJzY2FuZiIsImJzY2FuZl9vcHQiLCJrc3NjYW5mIiwic3NjYW5mIiwic3NjYW5mX29wdCIsInNjYW5mIiwic2NhbmZfb3B0IiwiYnNjYW5mX2Zvcm1hdCIsImZvcm1hdCIsInNzY2FuZl9mb3JtYXQiLCJmb3JtYXRfZnJvbV9zdHJpbmciLCJ1bmVzY2FwZWQiLCJyZWdpc3RlciIsInJlZ2lzdGVyX2V4Y2VwdGlvbiIsIm8kMCIsImluaXRpYWxfb2JqZWN0X3NpemUiLCJkdW1teV9pdGVtIiwicHVibGljX21ldGhvZF9sYWJlbCIsInRhZyIsImNvbXBhcmUkMCIsImNvbXBhcmUkMSIsImR1bW15X3RhYmxlIiwidGFibGVfY291bnQiLCJkdW1teV9tZXQiLCJmaXRfc2l6ZSIsIm5ld190YWJsZSIsInB1Yl9sYWJlbHMiLCJtZXRob2RzIiwiYXJyYXkiLCJuZXdfc2l6ZSIsIm9sZF9zaXplIiwibmV3X2J1Y2siLCJtZXRob2RfY291bnQiLCJpbnN0X3Zhcl9jb3VudCIsIm5ld19tZXRob2QiLCJ0YWJsZSIsImdldF9tZXRob2RfbGFiZWwiLCJsYWJlbCIsImdldF9tZXRob2RfbGFiZWxzIiwibmFtZXMiLCJzZXRfbWV0aG9kIiwiZWxlbWVudCIsImdldF9tZXRob2QiLCJuYXJyb3ciLCJ2YXJzIiwidmlydF9tZXRocyIsImNvbmNyX21ldGhzIiwidmFycyQwIiwidmlydF9tZXRocyQwIiwiY29uY3JfbWV0aHMkMCIsInZpcnRfbWV0aF9sYWJzIiwiY29uY3JfbWV0aF9sYWJzIiwibGFiIiwidHZhcnMiLCJieV9uYW1lIiwiYnlfbGFiZWwiLCJtZXQiLCJobSIsIndpZGVuIiwic2F2ZWRfdmFycyIsInNhdmVkX2hpZGRlbl9tZXRocyIsIm5ld192YXJpYWJsZSIsInRvX2FycmF5IiwibmV3X21ldGhvZHNfdmFyaWFibGVzIiwibWV0aHMiLCJ2YWxzIiwibWV0aHMkMCIsIm5tZXRocyIsIm52YWxzIiwiZ2V0X3ZhcmlhYmxlIiwiZ2V0X3ZhcmlhYmxlcyIsImFkZF9pbml0aWFsaXplciIsImNyZWF0ZV90YWJsZSIsInB1YmxpY19tZXRob2RzIiwidGFncyIsImluaXRfY2xhc3MiLCJpbmhlcml0cyIsImNsYSIsInN1cGVyJDAiLCJubSIsIm1ha2VfY2xhc3MiLCJwdWJfbWV0aHMiLCJjbGFzc19pbml0IiwiZW52X2luaXQiLCJtYWtlX2NsYXNzX3N0b3JlIiwiaW5pdF90YWJsZSIsImR1bW15X2NsYXNzIiwibG9jIiwidW5kZWYiLCJjcmVhdGVfb2JqZWN0IiwiY3JlYXRlX29iamVjdF9vcHQiLCJvYmpfMCIsIml0ZXJfZiIsInJ1bl9pbml0aWFsaXplcnMiLCJpbml0cyIsInJ1bl9pbml0aWFsaXplcnNfb3B0IiwiY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpIiwiZ2V0X2RhdGEiLCJidWlsZF9wYXRoIiwia2V5cyIsImxvb2t1cF90YWJsZXMiLCJyb290Iiwicm9vdF9kYXRhIiwidGFibGVzJDAiLCJ0YWJsZXMkMSIsInRhYmxlc19kYXRhIiwibmV3X2NhY2hlIiwic2V0X21ldGhvZHMiLCJjbG8iLCJjbG8kMCIsIm4kMiIsIm4kMyIsIm4kNCIsIm4kNSIsIm4kNiIsIngkMyIsIm4kNyIsIngkNCIsIm4kOCIsIm4kOSIsIngkNSIsImYkOCIsImUkMiIsIm4kMTAiLCJ4JDYiLCJmJDkiLCJuJDExIiwieCQ3IiwibiQxMiIsIngkOCIsIm4kMTMiLCJuJDE0IiwiZSQzIiwibiQxNSIsIm0kMSIsIm0kMiIsIngkOSIsIm0kMyIsIm4kMTYiLCJtJDQiLCJlJDQiLCJuJDE3IiwibSQ1IiwibiQxOCIsImluaXRfbW9kX2Jsb2NrIiwiY29tcHMkMCIsIm1vZHUiLCJzaGFwZSIsImZuJDAiLCJjb21wcyIsImluaXRfbW9kIiwidXBkYXRlX21vZF9ibG9jayIsImNsIiwidXBkYXRlX21vZCIsInBybmciLCJoa2V5IiwiY2xlYW4iLCJkb19idWNrZXQiLCJpbnNlcnRfYnVja2V0IiwiY29udGFpbmVyIiwicmVtb3ZlX2J1Y2tldCIsImhrIiwiYnVja2V0X2xlbmd0aF9hbGl2ZSIsInN0YXRzX2FsaXZlIiwic2V0X2RhdGEiLCJlcGgiLCJxdWVyeSIsInNldF9rZXlfZGF0YSIsInRlc3Rfa2V5IiwidCQwIiwiZ2V0X2tleTEiLCJzZXRfa2V5MSIsImdldF9rZXkyIiwic2V0X2tleTIiLCJnZXRfZGF0YSQwIiwic2V0X2RhdGEkMCIsIm1ha2UkMSIsImtleTEiLCJrZXkyIiwicXVlcnkkMCIsImsyJDAiLCJrMSQwIiwiZXF1YWwkMCIsInNlZWRlZF9oYXNoJDAiLCJtYWtlJDIiLCJhZGQkMCIsInRlc3Rfa2V5cyIsInJlbW92ZSQwIiwiZmluZCQwIiwibGVuZ3RoJDAiLCJjbGVhciQwIiwibGVuZ3RoJDEiLCJnZXRfa2V5JDAiLCJzZXRfa2V5JDAiLCJnZXRfZGF0YSQxIiwic2V0X2RhdGEkMSIsIm1ha2UkMyIsInF1ZXJ5JDEiLCJtYWtlJDQiLCJhZGQkMSIsInRlc3Rfa2V5cyQwIiwicmVtb3ZlJDEiLCJmaW5kJDEiLCJsZW5ndGgkMiIsImNsZWFyJDEiLCJudWxsJDAiLCJjdXJyZW50X2Rpcl9uYW1lIiwicGFyZW50X2Rpcl9uYW1lIiwiZGlyX3NlcCIsInF1b3RlcXVvdGUiLCJudWxsJDEiLCJjdXJyZW50X2Rpcl9uYW1lJDAiLCJwYXJlbnRfZGlyX25hbWUkMCIsImRpcl9zZXAkMCIsIm51bGwkMiIsImN1cnJlbnRfZGlyX25hbWUkMSIsInBhcmVudF9kaXJfbmFtZSQxIiwiZGlyX3NlcCQxIiwiZ2VuZXJpY19iYXNlbmFtZSIsImlzX2Rpcl9zZXAiLCJnZW5lcmljX2Rpcm5hbWUiLCJpc19yZWxhdGl2ZSIsImlzX2ltcGxpY2l0IiwiY2hlY2tfc3VmZml4Iiwic3VmZiIsImNob3Bfc3VmZml4X29wdCIsImxlbl9mIiwidGVtcF9kaXJfbmFtZSIsInF1b3RlIiwicXVvdGVfY29tbWFuZCIsImJhc2VuYW1lIiwiZGlybmFtZSIsImlzX2Rpcl9zZXAkMCIsImlzX3JlbGF0aXZlJDAiLCJpc19pbXBsaWNpdCQwIiwiY2hlY2tfc3VmZml4JDAiLCJjaG9wX3N1ZmZpeF9vcHQkMCIsInRlbXBfZGlyX25hbWUkMCIsInF1b3RlJDAiLCJhZGRfYnMiLCJsb29wJDAiLCJsb29wX2JzIiwicXVvdGVfY21kX2ZpbGVuYW1lIiwicXVvdGVfY29tbWFuZCQwIiwiZHJpdmVfYW5kX3BhdGgiLCJkaXJuYW1lJDAiLCJwYXRoIiwiZHJpdmUiLCJkaXIiLCJiYXNlbmFtZSQwIiwiYmFzZW5hbWUkMSIsImRpcm5hbWUkMSIsIm51bGwkMyIsImN1cnJlbnRfZGlyX25hbWUkMiIsInBhcmVudF9kaXJfbmFtZSQyIiwiZGlyX3NlcCQyIiwiaXNfZGlyX3NlcCQxIiwiaXNfcmVsYXRpdmUkMSIsImlzX2ltcGxpY2l0JDEiLCJjaGVja19zdWZmaXgkMSIsImNob3Bfc3VmZml4X29wdCQxIiwidGVtcF9kaXJfbmFtZSQxIiwicXVvdGUkMSIsInF1b3RlX2NvbW1hbmQkMSIsImJhc2VuYW1lJDIiLCJkaXJuYW1lJDIiLCJjaG9wX3N1ZmZpeCIsImV4dGVuc2lvbl9sZW4iLCJpMCIsImV4dGVuc2lvbiIsImNob3BfZXh0ZW5zaW9uIiwicmVtb3ZlX2V4dGVuc2lvbiIsInRlbXBfZmlsZV9uYW1lIiwidGVtcF9kaXIiLCJyYW5kb21fc3RhdGUiLCJybmQiLCJjdXJyZW50X3RlbXBfZGlyX25hbWUiLCJzZXRfdGVtcF9kaXJfbmFtZSIsImdldF90ZW1wX2Rpcl9uYW1lIiwidGVtcF9maWxlIiwib3Blbl90ZW1wX2ZpbGUiLCJzdGgkMCIsInBlcm1zIiwic3RoJDEiLCJuZWciLCJjb25qIiwibXVsIiwiZGl2IiwiaW52Iiwibm9ybTIiLCJub3JtIiwicG9sYXIiLCJzcXJ0IiwicSQwIiwidyQwIiwiZXhwIiwibG9nIiwicG93Iiwib3Blbl9iaW4iLCJvcGVuX3RleHQiLCJvcGVuX2dlbiIsIndpdGhfb3BlbiIsIm9wZW5mdW4iLCJ3aXRoX29wZW5fYmluIiwid2l0aF9vcGVuX3RleHQiLCJ3aXRoX29wZW5fZ2VuIiwic2VlayIsImNsb3NlIiwiY2xvc2Vfbm9lcnIiLCJpbnB1dF9jaGFyIiwiaW5wdXRfYnl0ZSIsInJlYWRfdXB0byIsImVuc3VyZSIsIm5ld19sZW4kMCIsIm5ld19sZW4kMSIsImlucHV0X2FsbCIsImNodW5rX3NpemUiLCJpbml0aWFsX3NpemUkMCIsImluaXRpYWxfc2l6ZSQxIiwibnJlYWQiLCJidWYkMiIsImJ1ZiQwIiwiYnVmJDEiLCJyZW0iLCJzZXRfYmluYXJ5X21vZGUiLCJvdXRwdXRfY2hhciIsIm91dHB1dF9ieXRlIiwicHJpbnRlciIsImNvbnRpbnVlJDAiLCJkaXNjb250aW51ZSIsImRpc2NvbnRpbnVlX3dpdGhfYmFja3RyYWNlIiwibWF0Y2hfd2l0aCIsImNvbXAiLCJoYW5kbGVyIiwiZWZmYyIsImVmZiIsImxhc3RfZmliZXIiLCJ0cnlfd2l0aCIsImZpYmVyIiwiY29udGludWVfZ2VuIiwicmVzdW1lX2Z1biIsImNvbnRpbnVlX3dpdGgiLCJkaXNjb250aW51ZV93aXRoIiwiZGlzY29udGludWVfd2l0aF9iYWNrdHJhY2UkMCIsInZlcnNpb24iLCJnaXRfdmVyc2lvbiIsInJhaXNlIiwibWF4IiwieCIsInkiLCJtaW4iLCJlcXVhbCIsImVxdWFsJDAiLCJtYXgkMCIsIm1pbiQwIiwiZ2xvYmFsIiwibnVsbCQwIiwidW5kZWZpbmVkJDAiLCJyZXR1cm4kMCIsIm1hcCIsImYiLCJiaW5kIiwidGVzdCIsIml0ZXIiLCJjYXNlJDAiLCJnIiwiZ2V0Iiwib3B0aW9uIiwieCQwIiwidG9fb3B0aW9uIiwicmV0dXJuJDEiLCJtYXAkMCIsImJpbmQkMCIsInRlc3QkMCIsIml0ZXIkMCIsImNhc2UkMSIsImdldCQwIiwib3B0aW9uJDAiLCJ0b19vcHRpb24kMCIsImNvZXJjZSIsImNvZXJjZV9vcHQiLCJ0cnVlJDAiLCJmYWxzZSQwIiwibmZjIiwibmZkIiwibmZrYyIsIm5ma2QiLCJzdHJpbmdfY29uc3RyIiwicmVnRXhwIiwib2JqZWN0X2NvbnN0cnVjdG9yIiwib2JqZWN0X2tleXMiLCJvIiwiYXJyYXlfY29uc3RydWN0b3IiLCJhcnJheV9nZXQiLCJhcnJheV9zZXQiLCJhcnJheV9tYXAiLCJhIiwiaWR4IiwiYXJyYXlfbWFwaSIsInN0cl9hcnJheSIsIm1hdGNoX3Jlc3VsdCIsImRhdGVfY29uc3RyIiwibWF0aCIsImVycm9yX2NvbnN0ciIsImV4bl93aXRoX2pzX2JhY2t0cmFjZSIsIm5hbWUiLCJtZXNzYWdlIiwic3RhY2siLCJ0b19zdHJpbmciLCJlIiwicmFpc2VfanNfZXJyb3IiLCJzdHJpbmdfb2ZfZXJyb3IiLCJKU09OIiwiZGVjb2RlVVJJIiwicyIsImRlY29kZVVSSUNvbXBvbmVudCIsImVuY29kZVVSSSIsImVuY29kZVVSSUNvbXBvbmVudCIsImVzY2FwZSIsInVuZXNjYXBlIiwiaXNOYU4iLCJpIiwicGFyc2VJbnQiLCJzJDAiLCJwYXJzZUZsb2F0IiwiZXhwb3J0X2pzIiwiZmllbGQiLCJleHBvcnQkMCIsImV4cG9ydF9hbGwiLCJvYmoiLCJrZXlzIiwia2V5IiwibGlzdF9vZl9ub2RlTGlzdCIsImxlbmd0aCIsImFjYyIsImkkMCIsImFjYyQwIiwiaSQxIiwiZGlzY29ubmVjdGVkIiwicHJlY2VkaW5nIiwiZm9sbG93aW5nIiwiY29udGFpbnMiLCJjb250YWluZWRfYnkiLCJpbXBsZW1lbnRhdGlvbl9zcGVjaWZpYyIsImhhcyIsInQiLCJtYXNrIiwiYWRkIiwiYXBwZW5kQ2hpbGQiLCJwIiwibiIsInJlbW92ZUNoaWxkIiwicmVwbGFjZUNoaWxkIiwiaW5zZXJ0QmVmb3JlIiwibm9kZVR5cGUiLCJ0MTMiLCJjYXN0IiwidDE0IiwiZWxlbWVudCIsInRleHQiLCJhdHRyIiwibm9faGFuZGxlciIsImhhbmRsZXIiLCJyZXMiLCJmdWxsX2hhbmRsZXIiLCJ0aGlzJDAiLCJpbnZva2VfaGFuZGxlciIsImV2ZW50IiwiZXZlbnRUYXJnZXQiLCJtYWtlIiwiYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zIiwidDI4IiwidHlwIiwiY2FwdHVyZSIsIm9uY2UiLCJwYXNzaXZlIiwiaCIsImV2IiwiY2FsbGJhY2siLCJiIiwiYWRkRXZlbnRMaXN0ZW5lciIsImNhcHQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaWQiLCJwcmV2ZW50RGVmYXVsdCIsImNyZWF0ZUN1c3RvbUV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJkZXRhaWwiLCJvcHRfaXRlciIsImNvbnN0ciIsImFycmF5QnVmZmVyIiwiaW50OEFycmF5IiwidWludDhBcnJheSIsImludDE2QXJyYXkiLCJ1aW50MTZBcnJheSIsImludDMyQXJyYXkiLCJ1aW50MzJBcnJheSIsImZsb2F0MzJBcnJheSIsImZsb2F0NjRBcnJheSIsInNldCIsInYiLCJ1bnNhZmVfZ2V0IiwiZGF0YVZpZXciLCJvZl9hcnJheUJ1ZmZlciIsImFiIiwidWludDgiLCJibG9iX2NvbnN0ciIsImZpbHRlcl9tYXAiLCJxIiwidiQwIiwiYmxvYl9yYXciLCJjb250ZW50VHlwZSIsImVuZGluZ3MiLCJvcHRpb25zIiwib3B0aW9ucyQwIiwiYmxvYl9mcm9tX3N0cmluZyIsImJsb2JfZnJvbV9hbnkiLCJsIiwiYSQwIiwibCQwIiwiZmlsZW5hbWUiLCJuYW1lJDAiLCJkb2NfY29uc3RyIiwiZG9jdW1lbnQiLCJibG9iIiwic3RyaW5nIiwibG9hZHN0YXJ0IiwicHJvZ3Jlc3MiLCJhYm9ydCIsImVycm9yIiwibG9hZCIsImxvYWRlbmQiLCJmaWxlUmVhZGVyIiwib25JRSIsImNsaWNrIiwiY29weSIsImN1dCIsInBhc3RlIiwiZGJsY2xpY2siLCJtb3VzZWRvd24iLCJtb3VzZXVwIiwibW91c2VvdmVyIiwibW91c2Vtb3ZlIiwibW91c2VvdXQiLCJrZXlwcmVzcyIsImtleWRvd24iLCJrZXl1cCIsIm1vdXNld2hlZWwiLCJ3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwidG91Y2hjYW5jZWwiLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiwiZHJhZ2VudGVyIiwiZHJhZ292ZXIiLCJkcmFnbGVhdmUiLCJkcmFnIiwiZHJvcCIsImhhc2hjaGFuZ2UiLCJjaGFuZ2UiLCJpbnB1dCIsInRpbWV1cGRhdGUiLCJzdWJtaXQiLCJzY3JvbGwiLCJmb2N1cyIsImJsdXIiLCJ1bmxvYWQiLCJiZWZvcmV1bmxvYWQiLCJyZXNpemUiLCJvcmllbnRhdGlvbmNoYW5nZSIsInBvcHN0YXRlIiwic2VsZWN0Iiwib25saW5lIiwib2ZmbGluZSIsImNoZWNraW5nIiwibm91cGRhdGUiLCJkb3dubG9hZGluZyIsInVwZGF0ZXJlYWR5IiwiY2FjaGVkIiwib2Jzb2xldGUiLCJkb21Db250ZW50TG9hZGVkIiwiYW5pbWF0aW9uc3RhcnQiLCJhbmltYXRpb25lbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJhbmltYXRpb25jYW5jZWwiLCJ0cmFuc2l0aW9ucnVuIiwidHJhbnNpdGlvbnN0YXJ0IiwidHJhbnNpdGlvbmVuZCIsInRyYW5zaXRpb25jYW5jZWwiLCJjYW5wbGF5IiwiY2FucGxheXRocm91Z2giLCJkdXJhdGlvbmNoYW5nZSIsImVtcHRpZWQiLCJlbmRlZCIsImdvdHBvaW50ZXJjYXB0dXJlIiwibG9hZGVkZGF0YSIsImxvYWRlZG1ldGFkYXRhIiwibG9zdHBvaW50ZXJjYXB0dXJlIiwicGF1c2UiLCJwbGF5IiwicGxheWluZyIsInBvaW50ZXJlbnRlciIsInBvaW50ZXJjYW5jZWwiLCJwb2ludGVyZG93biIsInBvaW50ZXJsZWF2ZSIsInBvaW50ZXJtb3ZlIiwicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIiwicG9pbnRlcnVwIiwicmF0ZWNoYW5nZSIsInNlZWtlZCIsInNlZWtpbmciLCJzdGFsbGVkIiwic3VzcGVuZCIsInZvbHVtZWNoYW5nZSIsIndhaXRpbmciLCJkIiwibG9jYXRpb25fb3JpZ2luIiwib3JpZ2luIiwid2luZG93IiwiZ2V0RWxlbWVudEJ5SWQiLCJwbm9kZSIsImdldEVsZW1lbnRCeUlkX2V4biIsImdldEVsZW1lbnRCeUlkX29wdCIsImdldEVsZW1lbnRCeUlkX2NvZXJjZSIsImNyZWF0ZUVsZW1lbnQiLCJkb2MiLCJ1bnNhZmVDcmVhdGVFbGVtZW50IiwiY3JlYXRlRWxlbWVudFN5bnRheCIsInVuc2FmZUNyZWF0ZUVsZW1lbnRFeCIsInR5cGUiLCJlbHQiLCJjcmVhdGVIdG1sIiwiY3JlYXRlSGVhZCIsImNyZWF0ZUxpbmsiLCJjcmVhdGVUaXRsZSIsImNyZWF0ZU1ldGEiLCJjcmVhdGVCYXNlIiwiY3JlYXRlU3R5bGUiLCJjcmVhdGVCb2R5IiwiY3JlYXRlRm9ybSIsImNyZWF0ZU9wdGdyb3VwIiwiY3JlYXRlT3B0aW9uIiwiY3JlYXRlU2VsZWN0IiwiY3JlYXRlSW5wdXQiLCJjcmVhdGVUZXh0YXJlYSIsImNyZWF0ZUJ1dHRvbiIsImNyZWF0ZUxhYmVsIiwiY3JlYXRlRmllbGRzZXQiLCJjcmVhdGVMZWdlbmQiLCJjcmVhdGVVbCIsImNyZWF0ZU9sIiwiY3JlYXRlRGwiLCJjcmVhdGVMaSIsImNyZWF0ZURpdiIsImNyZWF0ZUVtYmVkIiwiY3JlYXRlUCIsImNyZWF0ZUgxIiwiY3JlYXRlSDIiLCJjcmVhdGVIMyIsImNyZWF0ZUg0IiwiY3JlYXRlSDUiLCJjcmVhdGVINiIsImNyZWF0ZVEiLCJjcmVhdGVCbG9ja3F1b3RlIiwiY3JlYXRlUHJlIiwiY3JlYXRlQnIiLCJjcmVhdGVIciIsImNyZWF0ZUlucyIsImNyZWF0ZURlbCIsImNyZWF0ZUEiLCJjcmVhdGVJbWciLCJjcmVhdGVPYmplY3QiLCJjcmVhdGVQYXJhbSIsImNyZWF0ZU1hcCIsImNyZWF0ZUFyZWEiLCJjcmVhdGVTY3JpcHQiLCJjcmVhdGVUYWJsZSIsImNyZWF0ZUNhcHRpb24iLCJjcmVhdGVDb2wiLCJjcmVhdGVDb2xncm91cCIsImNyZWF0ZVRoZWFkIiwiY3JlYXRlVGZvb3QiLCJjcmVhdGVUYm9keSIsImNyZWF0ZVRyIiwiY3JlYXRlVGgiLCJjcmVhdGVUZCIsImNyZWF0ZVN1YiIsImNyZWF0ZVN1cCIsImNyZWF0ZVNwYW4iLCJjcmVhdGVUdCIsImNyZWF0ZUkiLCJjcmVhdGVCIiwiY3JlYXRlQmlnIiwiY3JlYXRlU21hbGwiLCJjcmVhdGVFbSIsImNyZWF0ZVN0cm9uZyIsImNyZWF0ZUNpdGUiLCJjcmVhdGVEZm4iLCJjcmVhdGVDb2RlIiwiY3JlYXRlU2FtcCIsImNyZWF0ZUtiZCIsImNyZWF0ZVZhciIsImNyZWF0ZUFiYnIiLCJjcmVhdGVEZCIsImNyZWF0ZUR0IiwiY3JlYXRlTm9zY3JpcHQiLCJjcmVhdGVBZGRyZXNzIiwiY3JlYXRlRnJhbWVzZXQiLCJjcmVhdGVGcmFtZSIsImNyZWF0ZUlmcmFtZSIsImNyZWF0ZUF1ZGlvIiwiY3JlYXRlVmlkZW8iLCJjcmVhdGVDYW52YXMiLCJodG1sX2VsZW1lbnQiLCJ0NTQiLCJ1bnNhZmVDb2VyY2UiLCJ0YWciLCJ0NTUiLCJhcmVhIiwiYmFzZSIsImJsb2NrcXVvdGUiLCJib2R5IiwiYnIiLCJidXR0b24iLCJjYW52YXMiLCJjYXB0aW9uIiwiY29sIiwiY29sZ3JvdXAiLCJkZWwiLCJkaXYiLCJkbCIsImZpZWxkc2V0IiwiZW1iZWQiLCJmb3JtIiwiZnJhbWVzZXQiLCJmcmFtZSIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWQiLCJociIsImh0bWwiLCJpZnJhbWUiLCJpbWciLCJpbnB1dCQwIiwiaW5zIiwibGFiZWwiLCJsZWdlbmQiLCJsaSIsImxpbmsiLCJtZXRhIiwib2JqZWN0Iiwib2wiLCJvcHRncm91cCIsInBhcmFtIiwicHJlIiwic2NyaXB0Iiwic2VsZWN0JDAiLCJzdHlsZSIsInRhYmxlIiwidGJvZHkiLCJ0ZCIsInRleHRhcmVhIiwidGZvb3QiLCJ0aCIsInRoZWFkIiwidGl0bGUiLCJ0ciIsInVsIiwiYXVkaW8iLCJ2aWRlbyIsInVuc2FmZUNvZXJjZUV2ZW50IiwibW91c2VFdmVudCIsImtleWJvYXJkRXZlbnQiLCJ3aGVlbEV2ZW50IiwibW91c2VTY3JvbGxFdmVudCIsInBvcFN0YXRlRXZlbnQiLCJtZXNzYWdlRXZlbnQiLCJldmVudFJlbGF0ZWRUYXJnZXQiLCJldmVudEFic29sdXRlUG9zaXRpb24iLCJldmVudEFic29sdXRlUG9zaXRpb24kMCIsImVsZW1lbnRDbGllbnRQb3NpdGlvbiIsImdldERvY3VtZW50U2Nyb2xsIiwiYnV0dG9uUHJlc3NlZCIsImFkZE1vdXNld2hlZWxFdmVudExpc3RlbmVyV2l0aCIsImR4IiwiZHkiLCJhZGRNb3VzZXdoZWVsRXZlbnRMaXN0ZW5lciIsInRyeV9jb2RlIiwidHJ5X2tleV9jb2RlX2xlZnQiLCJ0cnlfa2V5X2NvZGVfcmlnaHQiLCJ0cnlfa2V5X2NvZGVfbnVtcGFkIiwidHJ5X2tleV9jb2RlX25vcm1hbCIsIm1ha2VfdW5pZGVudGlmaWVkIiwicnVuX25leHQiLCJ2YWx1ZSIsInN5bWJvbCIsIm9mX2V2ZW50IiwiY2hhcl9vZl9pbnQiLCJlbXB0eV9zdHJpbmciLCJub25lIiwib2ZfZXZlbnQkMCIsImVsZW1lbnQkMCIsInRhZ2dlZCIsInQxMDUiLCJvcHRfdGFnZ2VkIiwidGFnZ2VkRXZlbnQiLCJvcHRfdGFnZ2VkRXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjIiwicmVxIiwibm93IiwibGFzdCIsImR0IiwiZHQkMCIsImhhc1B1c2hTdGF0ZSIsImhhc1BsYWNlaG9sZGVyIiwiaGFzUmVxdWlyZWQiLCJvdmVyZmxvd19saW1pdCIsInNldFRpbWVvdXQiLCJsb29wIiwicmVtYWluIiwic3RlcCIsImNiIiwiY2xlYXJUaW1lb3V0IiwianNfYXJyYXlfb2ZfY29sbGVjdGlvbiIsImZvcm1EYXRhIiwiZm9ybURhdGFfZm9ybSIsImhhdmVfY29udGVudCIsImZvcm1fZWxlbWVudHMiLCJpJDIiLCJzdGgiLCJuYW1lJDEiLCJsaXN0IiwiZmlsZSIsImFwcGVuZCIsImZvcm1fY29udGVudHMiLCJmb3JtX2VsdCIsImVtcHR5X2Zvcm1fY29udGVudHMiLCJwb3N0X2Zvcm1fY29udGVudHMiLCJjb250ZW50cyIsImdldF9mb3JtX2NvbnRlbnRzIiwicmVhZHlzdGF0ZWNoYW5nZSIsInRpbWVvdXQiLCJ3b3JrZXIiLCJjcmVhdGUiLCJpbXBvcnRfc2NyaXB0cyIsInNjcmlwdHMiLCJzZXRfb25tZXNzYWdlIiwianNfaGFuZGxlciIsInBvc3RfbWVzc2FnZSIsIm1zZyIsIndlYlNvY2tldCIsImlzX3N1cHBvcnRlZCIsImRlZmF1bHRDb250ZXh0QXR0cmlidXRlcyIsIndlYmdsY29udGV4dGxvc3QiLCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLCJnZXRDb250ZXh0IiwiY3R4IiwiZ2V0Q29udGV4dFdpdGhBdHRyaWJ1dGVzIiwiYXR0cmlicyIsInJlZ2V4cCIsInJlZ2V4cF9jYXNlX2ZvbGQiLCJyZWdleHBfd2l0aF9mbGFnIiwiYmx1bnRfc3RyX2FycmF5X2dldCIsInN0cmluZ19tYXRjaCIsInNlYXJjaCIsInJlc19wcmUiLCJtYXRjaGVkX3N0cmluZyIsInIiLCJtYXRjaGVkX2dyb3VwIiwicXVvdGVfcmVwbF9yZSIsInF1b3RlX3JlcGwiLCJnbG9iYWxfcmVwbGFjZSIsInNfYnkiLCJyZXBsYWNlX2ZpcnN0IiwidDI5IiwiZmxhZ3MiLCJsaXN0X29mX2pzX2FycmF5IiwiaWR4JDEiLCJhY2N1IiwiaWR4JDAiLCJhY2N1JDAiLCJzcGxpdCIsImJvdW5kZWRfc3BsaXQiLCJxdW90ZV9yZSIsInF1b3RlIiwicmVnZXhwX3N0cmluZyIsInJlZ2V4cF9zdHJpbmdfY2FzZV9mb2xkIiwiaW50ZXJydXB0IiwicGx1c19yZSIsInVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIiwidXJsZGVjb2RlIiwidXJsZW5jb2RlIiwib3B0Iiwid2l0aF9wbHVzIiwiZGVmYXVsdF9odHRwX3BvcnQiLCJkZWZhdWx0X2h0dHBzX3BvcnQiLCJwYXRoX29mX3BhdGhfc3RyaW5nIiwiYXV4IiwiaiIsIndvcmQiLCJlbmNvZGVfYXJndW1lbnRzIiwiZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmciLCJsZW4iLCJpbmRleCIsImRlY29kZV9hcmd1bWVudHMiLCJ1cmxfcmUiLCJmaWxlX3JlIiwidXJsX29mX2pzX3N0cmluZyIsImhhbmRsZSIsInByb3Rfc3RyaW5nIiwic3NsIiwicGF0aF9zdHIiLCJ1cmwiLCJ1cmxfb2Zfc3RyaW5nIiwic3RyaW5nX29mX3VybCIsImZyYWciLCJhcmdzIiwicGF0aCIsInBvcnQiLCJob3N0IiwiZnJhZyQwIiwiYXJncyQwIiwicGF0aCQwIiwicG9ydCQwIiwiaG9zdCQwIiwiZnJhZyQxIiwiYXJncyQxIiwicGF0aCQxIiwicHJvdG9jb2wiLCJwYXRoX3N0cmluZyIsImFyZ3VtZW50cyQwIiwiZ2V0X2ZyYWdtZW50IiwicmVzJDAiLCJzZXRfZnJhZ21lbnQiLCJ1IiwiYXNfc3RyaW5nIiwidXBkYXRlX2ZpbGUiLCJjb250ZW50Iiwib2MiLCJzZXRfY2hhbm5lbF9mbHVzaGVyIiwib3V0X2NoYW5uZWwiLCJmJDAiLCJzZXRfY2hhbm5lbF9maWxsZXIiLCJpbl9jaGFubmVsIiwibW91bnQiLCJwcmVmaXgiLCJ1bm1vdW50IiwianNfb2Zfb2NhbWxfdmVyc2lvbiIsImVtcHR5X3Jlc2l6ZV9vYnNlcnZlcl9vcHRpb25zIiwicmVzaXplT2JzZXJ2ZXIiLCJvYnNlcnZlIiwibm9kZSIsImJveCIsIm9icyIsInBlcmZvcm1hbmNlT2JzZXJ2ZXIiLCJlbnRyeV90eXBlcyIsImVtcHR5X211dGF0aW9uX29ic2VydmVyX2luaXQiLCJtdXRhdGlvbk9ic2VydmVyIiwiY2hpbGRfbGlzdCIsImF0dHJpYnV0ZXMiLCJjaGFyYWN0ZXJfZGF0YSIsInN1YnRyZWUiLCJhdHRyaWJ1dGVfb2xkX3ZhbHVlIiwiY2hhcmFjdGVyX2RhdGFfb2xkX3ZhbHVlIiwiYXR0cmlidXRlX2ZpbHRlciIsImsiLCJyZW1vdmUiLCJmaW5kIiwianNvbiIsInJldml2ZXIiLCJpbnB1dF9yZXZpdmVyIiwidW5zYWZlX2lucHV0IiwibWxJbnQ2NF9jb25zdHIiLCJvdXRwdXRfcmV2aXZlciIsIm91dHB1dCIsInN0cmluZ19vZl9uYW1lIiwibmFtZV9vZl9zdHJpbmciLCJyZ2Jfb2ZfbmFtZSIsInJnYiIsImhzbCIsInN0cmluZ19vZl90IiwiYiQwIiwiZyQwIiwiciQwIiwiYiQxIiwiZyQxIiwiciQxIiwiYiQyIiwiZyQyIiwiciQyIiwiYSQxIiwiaCQwIiwiaGV4X29mX3JnYiIsImJsdWUiLCJncmVlbiIsInJlZCIsImluX3JhbmdlIiwianNfdF9vZl9qc19zdHJpbmciLCJyZ2JfcmUiLCJyZ2JfcGN0X3JlIiwicmdiYV9yZSIsInJnYmFfcGN0X3JlIiwiaHNsX3JlIiwiaHNsYV9yZSIsImpzIiwiY24iLCJtbCIsImZhaWwiLCJyZV9yZ2IiLCJyZV9yZ2JfcGN0IiwicmVfaHNsIiwiaV9vZl9zX28iLCJmX29mX3MiLCJhbHBoYSIsInJlZCQwIiwiZ3JlZW4kMCIsImJsdWUkMCIsImFscGhhJDAiLCJyZWQkMSIsImdyZWVuJDEiLCJibHVlJDEiLCJhbHBoYSQxIiwic3RyaW5nX29mX3QkMCIsImYkMSIsImYkMiIsImYkMyIsImYkNCIsImYkNSIsImYkNiIsImYkNyIsImYkOCIsImYkOSIsImYkMTAiLCJmJDExIiwiZiQxMiIsImpzJDAiLCJtbCQwIiwicmUiLCJzdHJpbmdfb2ZfdCQxIiwianMkMSIsIm1sJDEiLCJsaXN0ZW4iLCJ0YXJnZXQiLCJzdG9wX2xpc3RlbiIsInhtbG5zIiwiY3JlYXRlQWx0R2x5cGgiLCJjcmVhdGVBbHRHbHlwaERlZiIsImNyZWF0ZUFsdEdseXBoSXRlbSIsImNyZWF0ZUFuaW1hdGUiLCJjcmVhdGVBbmltYXRlQ29sb3IiLCJjcmVhdGVBbmltYXRlTW90aW9uIiwiY3JlYXRlQW5pbWF0ZVRyYW5zZm9ybSIsImNyZWF0ZUNpcmNsZSIsImNyZWF0ZUNsaXBQYXRoIiwiY3JlYXRlQ3Vyc29yIiwiY3JlYXRlRGVmcyIsImNyZWF0ZURlc2MiLCJjcmVhdGVFbGxpcHNlIiwiY3JlYXRlRmlsdGVyIiwiY3JlYXRlRm9udCIsImNyZWF0ZUZvbnRGYWNlIiwiY3JlYXRlRm9udEZhY2VGb3JtYXQiLCJjcmVhdGVGb250RmFjZU5hbWUiLCJjcmVhdGVGb250RmFjZVNyYyIsImNyZWF0ZUZvbnRGYWNlVXJpIiwiY3JlYXRlRm9yZWlnbk9iamVjdCIsImNyZWF0ZUciLCJjcmVhdGVHbHlwaCIsImNyZWF0ZUdseXBoUmVmIiwiY3JlYXRlaGtlcm4iLCJjcmVhdGVJbWFnZSIsImNyZWF0ZUxpbmVFbGVtZW50IiwiY3JlYXRlTGluZWFyRWxlbWVudCIsImNyZWF0ZU1hc2siLCJjcmVhdGVNZXRhRGF0YSIsImNyZWF0ZU1pc3NpbmdHbHlwaCIsImNyZWF0ZU1QYXRoIiwiY3JlYXRlUGF0aCIsImNyZWF0ZVBhdHRlcm4iLCJjcmVhdGVQb2x5Z29uIiwiY3JlYXRlUG9seWxpbmUiLCJjcmVhdGVSYWRpYWxncmFkaWVudCIsImNyZWF0ZVJlY3QiLCJjcmVhdGVTZXQiLCJjcmVhdGVTdG9wIiwiY3JlYXRlU3ZnIiwiY3JlYXRlU3dpdGNoIiwiY3JlYXRlU3ltYm9sIiwiY3JlYXRlVGV4dEVsZW1lbnQiLCJjcmVhdGVUZXh0cGF0aCIsImNyZWF0ZVRyZWYiLCJjcmVhdGVUc3BhbiIsImNyZWF0ZVVzZSIsImNyZWF0ZVZpZXciLCJjcmVhdGV2a2VybiIsInN2Z19lbGVtZW50IiwidDgiLCJhbHRHbHlwaCIsImFsdEdseXBoRGVmIiwiYWx0R2x5cGhJdGVtIiwiYW5pbWF0ZSIsImFuaW1hdGVDb2xvciIsImFuaW1hdGVNb3Rpb24iLCJhbmltYXRlVHJhbnNmb3JtIiwiY2lyY2xlIiwiY2xpcFBhdGgiLCJjdXJzb3IiLCJkZWZzIiwiZGVzYyIsImVsbGlwc2UiLCJmaWx0ZXIiLCJmb250IiwiZm9udEZhY2UiLCJmb250RmFjZUZvcm1hdCIsImZvbnRGYWNlTmFtZSIsImZvbnRGYWNlU3JjIiwiZm9udEZhY2VVcmkiLCJmb3JlaWduT2JqZWN0IiwiZ2x5cGgiLCJnbHlwaFJlZiIsImhrZXJuIiwiaW1hZ2UiLCJsaW5lRWxlbWVudCIsImxpbmVhckVsZW1lbnQiLCJtZXRhRGF0YSIsIm1pc3NpbmdHbHlwaCIsIm1QYXRoIiwicGF0dGVybiIsInBvbHlnb24iLCJwb2x5bGluZSIsInJhZGlhbGdyYWRpZW50IiwicmVjdCIsInN0b3AiLCJzdmciLCJzd2l0Y2gkMCIsInRleHRFbGVtZW50IiwidGV4dHBhdGgiLCJ0cmVmIiwidHNwYW4iLCJ1c2UiLCJ2aWV3Iiwidmtlcm4iLCJ3aXRoQ3JlZGVudGlhbHMiLCJldmVudFNvdXJjZSIsImV2ZW50U291cmNlX29wdGlvbnMiLCJjb25zb2xlIiwiZW1wdHlfcG9zaXRpb25fb3B0aW9ucyIsImdlb2xvY2F0aW9uIiwiZW1wdHlfaW50ZXJzZWN0aW9uX29ic2VydmVyX29wIiwiaW50ZXJzZWN0aW9uT2JzZXJ2ZXJfdW5zYWZlIiwib2JqZWN0X29wdGlvbnMiLCJvcHRpb25zJDEiLCJvcHRpb25zJDIiLCJpbnRsIiwiY29sbGF0b3JfY29uc3RyIiwiZGF0ZVRpbWVGb3JtYXRfY29uc3RyIiwibnVtYmVyRm9ybWF0X2NvbnN0ciIsInBsdXJhbFJ1bGVzX2NvbnN0ciIsInByZV90ZXN0X2hvb2siLCJzZXhwX29mX3QiLCJ0IiwidF9vZl9zZXhwIiwiY29tcGFyZSIsImEkMCIsImIkMCIsImEkMSIsImIkMSIsImEkMiIsImIkMiIsImEiLCJiIiwieXMiLCJ5IiwieHMiLCJ4IiwicmVzIiwiZXF1YWwiLCJkZWZhdWx0X2luZGVudCIsIm11c3RfZXNjYXBlIiwic3RyIiwibGVuIiwiaXgkMSIsIml4IiwibmV4dCIsIm5leHQkMCIsIml4JDAiLCJlc2NhcGVkIiwicyIsIm4iLCJpJDAiLCJzJDAiLCJpIiwiYyIsImVzY19zdHIiLCJlc3RyIiwiZWxlbiIsImluZGV4X29mX25ld2xpbmUiLCJzdGFydCIsIm1hY2hfbWF5YmVfZXNjX3N0ciIsInBwX2h1bV9pbmRlbnQiLCJpbmRlbnQiLCJwcGYiLCJpbmRleCIsImluZGV4JDAiLCJuZXh0X25ld2xpbmUiLCJlbmRfcG9zIiwiZW5kX3BvcyQwIiwibmV4dF9saW5lIiwibmV3bGluZV9pbmRleCIsImluZGV4JDEiLCJoIiwidCQwIiwiaCQwIiwicHBfbWFjaF9pbnRlcm5hbCIsIm1heV9uZWVkX3NwYWNlIiwic3RyJDAiLCJuZXdfbWF5X25lZWRfc3BhY2UiLCJuZXdfbWF5X25lZWRfc3BhY2UkMCIsIm1heV9uZWVkX3NwYWNlJDAiLCJtYXlfbmVlZF9zcGFjZSQxIiwibWF5X25lZWRfc3BhY2UkMiIsInBwX2h1bSIsInNleHAiLCJwcF9tYWNoIiwic2l6ZV9sb29wIiwiYWNjIiwidiIsImxzdCIsInNpemUiLCJ0b19idWZmZXJfaHVtIiwiYnVmIiwib3B0Iiwic3RoIiwidG9fYnVmZmVyX21hY2giLCJsb29wIiwidG9fYnVmZmVyX2dlbiIsImFkZF9jaGFyIiwiYWRkX3N0cmluZyIsImJ1ZmZlciIsInRvX3N0cmluZ19odW0iLCJ0b19zdHJpbmdfbWFjaCIsIm9mX2Zsb2F0X3N0eWxlIiwib2ZfaW50X3N0eWxlIiwibWVzc2FnZSIsIm5hbWUiLCJmaWVsZHMiLCJjb252X2ZpZWxkcyIsInJlc3QiLCJmc2V4cCIsImZuYW1lIiwiZG9jX2NvbW1lbnRfdGFnIiwiY29lcmNlIiwidW5pdF9zZXhwX2dyYW1tYXIiLCJzZXhwX3Rfc2V4cF9ncmFtbWFyIiwiZW1wdHlfc2V4cF9ncmFtbWFyIiwiYm9vbF9zZXhwX2dyYW1tYXIiLCJzdHJpbmdfc2V4cF9ncmFtbWFyIiwiYnl0ZXNfc2V4cF9ncmFtbWFyIiwiY2hhcl9zZXhwX2dyYW1tYXIiLCJpbnRfc2V4cF9ncmFtbWFyIiwiZmxvYXRfc2V4cF9ncmFtbWFyIiwiaW50MzJfc2V4cF9ncmFtbWFyIiwiaW50NjRfc2V4cF9ncmFtbWFyIiwibmF0aXZlaW50X3NleHBfZ3JhbW1hciIsInJlZl9zZXhwX2dyYW1tYXIiLCJncmFtbWFyIiwibGF6eV90X3NleHBfZ3JhbW1hciIsIm9wdGlvbl9zZXhwX2dyYW1tYXIiLCJwYXJhbSIsImxpc3Rfc2V4cF9ncmFtbWFyIiwiYXJyYXlfc2V4cF9ncmFtbWFyIiwiZGVmYXVsdF9zdHJpbmdfb2ZfZmxvYXQiLCJyZWFkX29sZF9vcHRpb25fZm9ybWF0Iiwid3JpdGVfb2xkX29wdGlvbl9mb3JtYXQiLCJsaXN0X21hcCIsImYiLCJsIiwic2V4cF9vZl91bml0Iiwic2V4cF9vZl9ib29sIiwic2V4cF9vZl9zdHJpbmciLCJzZXhwX29mX2J5dGVzIiwiYnl0ZXMiLCJzZXhwX29mX2NoYXIiLCJzZXhwX29mX2ludCIsInNleHBfb2ZfZmxvYXQiLCJzZXhwX29mX2ludDMyIiwic2V4cF9vZl9pbnQ2NCIsInNleHBfb2ZfbmF0aXZlaW50Iiwic2V4cF9vZl9yZWYiLCJzZXhwX29mX2EiLCJyZiIsInNleHBfb2ZfbGF6eV90IiwibHYiLCJzZXhwX29mX29wdGlvbiIsInNleHBfb2ZfcGFpciIsInNleHBfb2ZfYiIsInNleHBfb2ZfdHJpcGxlIiwic2V4cF9vZl9jIiwic2V4cF9vZl9saXN0Iiwic2V4cF9vZl9hcnJheSIsImFyIiwibHN0X3JlZiIsInNleHBfb2ZfaGFzaHRibCIsInNleHBfb2Zfa2V5Iiwic2V4cF9vZl92YWwiLCJodGJsIiwiY29sbCIsImsiLCJzZXhwX29mX29wYXF1ZSIsInNleHBfb2ZfZnVuIiwiaGFzaCIsInRoZV9leG5fdGFibGUiLCJhZGQiLCJleHRlbnNpb25fY29uc3RydWN0b3IiLCJzZXhwX29mX2V4biIsInByaW50ZXhjIiwiZmluZF9hdXRvIiwiZm9yX3ByaW50ZXhjIiwiZXhuIiwic2V4cF9vZl9leG5fb3B0IiwiZXhuX3RvX3N0cmluZyIsImUiLCJwcmludGV4Y19wcmVmZXJfc2V4cCIsInJlY29yZF9jaGVja19leHRyYV9maWVsZHMiLCJvZl9zZXhwX2Vycm9yX2V4biIsImV4YyIsIm9mX3NleHBfZXJyb3IiLCJ3aGF0IiwidW5pdF9vZl9zZXhwIiwiYm9vbF9vZl9zZXhwIiwic3RyaW5nX29mX3NleHAiLCJieXRlc19vZl9zZXhwIiwiY2hhcl9vZl9zZXhwIiwiaW50X29mX3NleHAiLCJleGMkMCIsImZsb2F0X29mX3NleHAiLCJpbnQzMl9vZl9zZXhwIiwiaW50NjRfb2Zfc2V4cCIsIm5hdGl2ZWludF9vZl9zZXhwIiwicmVmX29mX3NleHAiLCJhX29mX3NleHAiLCJsYXp5X3Rfb2Zfc2V4cCIsIm9wdGlvbl9vZl9zZXhwIiwiZWwkMCIsImVsIiwicGFpcl9vZl9zZXhwIiwiYl9vZl9zZXhwIiwiYl9zZXhwIiwiYV9zZXhwIiwidHJpcGxlX29mX3NleHAiLCJjX29mX3NleHAiLCJjX3NleHAiLCJsaXN0X29mX3NleHAiLCJyZXZfbHN0IiwiYXJyYXlfb2Zfc2V4cCIsImhhc2h0Ymxfb2Zfc2V4cCIsImtleV9vZl9zZXhwIiwidmFsX29mX3NleHAiLCJhY3QiLCJ2X3NleHAiLCJrX3NleHAiLCJvcGFxdWVfb2Zfc2V4cCIsImZ1bl9vZl9zZXhwIiwiZ2V0X2ZsY19lcnJvciIsImNociIsImxpbmUiLCJmaWxlIiwiYXJnIiwiaGFuZGxlciIsInR1cGxlX29mX3NpemVfbl9leHBlY3RlZCIsImxvYyIsInN0YWdfbm9fYXJncyIsInN0YWdfaW5jb3JyZWN0X25fYXJncyIsInRhZyIsIm1zZyIsInN0YWdfdGFrZXNfYXJncyIsIm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIiwiZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSIsInVuZXhwZWN0ZWRfc3RhZyIsInJlY29yZF9zZXhwX2Jvb2xfd2l0aF9wYXlsb2FkIiwicmVjb3JkX29ubHlfcGFpcnNfZXhwZWN0ZWQiLCJyZWNvcmRfc3VwZXJmbHVvdXNfZmllbGRzIiwicmV2X2ZsZF9uYW1lcyIsImZsZF9uYW1lc19zdHIiLCJyZWNvcmRfZHVwbGljYXRlX2ZpZWxkcyIsInJlY29yZF9leHRyYV9maWVsZHMiLCJyZWNvcmRfZ2V0X3VuZGVmaW5lZF9sb29wIiwiZmllbGRzJDAiLCJmaWVsZCIsInJlc3QkMCIsInJlY29yZF91bmRlZmluZWRfZWxlbWVudHMiLCJ1bmRlZmluZWQkMCIsInJlY29yZF9saXN0X2luc3RlYWRfYXRvbSIsInJlY29yZF9wb2x5X2ZpZWxkX3ZhbHVlIiwibm9fdmFyaWFudF9tYXRjaCIsIm5vX21hdGNoaW5nX3ZhcmlhbnRfZm91bmQiLCJwdGFnX25vX2FyZ3MiLCJwdGFnX2luY29ycmVjdF9uX2FyZ3MiLCJjbnN0ciIsInB0YWdfdGFrZXNfYXJncyIsIm5lc3RlZF9saXN0X2ludmFsaWRfcG9seV92YXIiLCJlbXB0eV9saXN0X2ludmFsaWRfcG9seV92YXIiLCJlbXB0eV90eXBlIiwiZGVzY2VuZGluZyIsIngiLCJ5IiwibWF4IiwibWluIiwibWF4X2ludCIsIm1pbl9pbnQiLCJpbmZpbml0eSIsIm5lZ19pbmZpbml0eSIsIm5hbiIsIm1heF9mbG9hdCIsIm1pbl9mbG9hdCIsImVwc2lsb25fZmxvYXQiLCJjaGFyX29mX2ludCIsInN0cmluZ19vZl9ib29sIiwiYm9vbF9vZl9zdHJpbmdfb3B0IiwiYm9vbF9vZl9zdHJpbmciLCJzdHJpbmdfb2ZfaW50IiwiaW50X29mX3N0cmluZ19vcHQiLCJzdHJpbmdfb2ZfZmxvYXQiLCJmbG9hdF9vZl9zdHJpbmdfb3B0Iiwic3RkaW4iLCJzdGRvdXQiLCJzdGRlcnIiLCJwcmludF9jaGFyIiwicHJpbnRfc3RyaW5nIiwicHJpbnRfYnl0ZXMiLCJwcmludF9pbnQiLCJwcmludF9mbG9hdCIsInByaW50X2VuZGxpbmUiLCJwcmludF9uZXdsaW5lIiwicHJlcnJfY2hhciIsInByZXJyX3N0cmluZyIsInByZXJyX2J5dGVzIiwicHJlcnJfaW50IiwicHJlcnJfZmxvYXQiLCJwcmVycl9lbmRsaW5lIiwicHJlcnJfbmV3bGluZSIsInJlYWRfbGluZSIsInJlYWRfaW50X29wdCIsInJlYWRfaW50IiwicmVhZF9mbG9hdF9vcHQiLCJyZWFkX2Zsb2F0Iiwib3Blbl9vdXQiLCJvcGVuX291dF9iaW4iLCJvcGVuX291dF9nZW4iLCJmbHVzaCIsImZsdXNoX2FsbCIsIm91dHB1dF9jaGFyIiwib3V0cHV0X3N0cmluZyIsIm91dHB1dF9ieXRlcyIsIm91dHB1dCIsIm91dHB1dF9zdWJzdHJpbmciLCJvdXRwdXRfYnl0ZSIsIm91dHB1dF9iaW5hcnlfaW50Iiwib3V0cHV0X3ZhbHVlIiwic2Vla19vdXQiLCJwb3Nfb3V0Iiwib3V0X2NoYW5uZWxfbGVuZ3RoIiwiY2xvc2Vfb3V0IiwiY2xvc2Vfb3V0X25vZXJyIiwic2V0X2JpbmFyeV9tb2RlX291dCIsIm9wZW5faW4iLCJvcGVuX2luX2JpbiIsIm9wZW5faW5fZ2VuIiwiaW5wdXRfY2hhciIsImlucHV0X2xpbmUiLCJpbnB1dCIsInJlYWxseV9pbnB1dCIsInJlYWxseV9pbnB1dF9zdHJpbmciLCJpbnB1dF9ieXRlIiwiaW5wdXRfYmluYXJ5X2ludCIsImlucHV0X3ZhbHVlIiwic2Vla19pbiIsInBvc19pbiIsImluX2NoYW5uZWxfbGVuZ3RoIiwiY2xvc2VfaW4iLCJjbG9zZV9pbl9ub2VyciIsInNldF9iaW5hcnlfbW9kZV9pbiIsInN0cmluZ19vZl9mb3JtYXQiLCJzeW1ib2wiLCJleGl0IiwiYXRfZXhpdCIsInZhbGlkX2Zsb2F0X2xleGVtIiwidW5zYWZlX3JlYWxseV9pbnB1dCIsImRvX2F0X2V4aXQiLCJkb19kb21haW5fbG9jYWxfYXRfZXhpdCIsImJvb2xfdG9faW50Iiwic3ltYm9sJDMiLCJzeW1ib2wkNCIsInN5bWJvbCQ1Iiwic3ltYm9sJDYiLCJzeW1ib2wkNyIsInN5bWJvbCQ4Iiwic3ltYm9sJDkiLCJzeW1ib2wkMTAiLCJzeW1ib2wkMTEiLCJzeW1ib2wkMTIiLCJhc2NlbmRpbmciLCJtYXgkMCIsIm1pbiQwIiwiYXNjZW5kaW5nJDAiLCJkZXNjZW5kaW5nJDAiLCJtYXgkMSIsIm1pbiQxIiwic3ltYm9sJDEzIiwic3ltYm9sJDE0Iiwic3ltYm9sJDE1Iiwic3ltYm9sJDE2Iiwic3ltYm9sJDE3Iiwic3ltYm9sJDE4IiwiYXNjZW5kaW5nJDEiLCJkZXNjZW5kaW5nJDEiLCJjb21wYXJlIiwiZXF1YWwiLCJtYXgkMiIsIm1pbiQyIiwiYXNjZW5kaW5nJDIiLCJkZXNjZW5kaW5nJDIiLCJtYXgkMyIsIm1pbiQzIiwic3ltYm9sJDE5Iiwic3ltYm9sJDIwIiwic3ltYm9sJDIxIiwic3ltYm9sJDIyIiwic3ltYm9sJDIzIiwic3ltYm9sJDI0IiwiYXNjZW5kaW5nJDMiLCJkZXNjZW5kaW5nJDMiLCJjb21wYXJlJDAiLCJlcXVhbCQwIiwibWF4JDQiLCJtaW4kNCIsInN5bWJvbCQyNSIsInN5bWJvbCQyNiIsInN5bWJvbCQyNyIsInN5bWJvbCQyOCIsInN5bWJvbCQyOSIsInN5bWJvbCQzMCIsImFzY2VuZGluZyQ0IiwiZGVzY2VuZGluZyQ0IiwiY29tcGFyZSQxIiwiZXF1YWwkMSIsIm1heCQ1IiwibWluJDUiLCJzeW1ib2wkMzEiLCJzeW1ib2wkMzIiLCJzeW1ib2wkMzMiLCJzeW1ib2wkMzQiLCJzeW1ib2wkMzUiLCJzeW1ib2wkMzYiLCJhc2NlbmRpbmckNSIsImRlc2NlbmRpbmckNSIsImNvbXBhcmUkMiIsImVxdWFsJDIiLCJtYXgkNiIsIm1pbiQ2IiwiaSIsInN5bWJvbCQzNyIsInN5bWJvbCQzOCIsInN5bWJvbCQzOSIsInN5bWJvbCQ0MCIsInN5bWJvbCQ0MSIsInN5bWJvbCQ0MiIsImFzY2VuZGluZyQ2IiwiZGVzY2VuZGluZyQ2IiwiY29tcGFyZSQzIiwiZXF1YWwkMyIsIm1heCQ3IiwibWluJDciLCJzeW1ib2wkNDMiLCJzeW1ib2wkNDQiLCJzeW1ib2wkNDUiLCJzeW1ib2wkNDYiLCJzeW1ib2wkNDciLCJzeW1ib2wkNDgiLCJhc2NlbmRpbmckNyIsImRlc2NlbmRpbmckNyIsImNvbXBhcmUkNCIsImVxdWFsJDQiLCJtYXgkOCIsIm1pbiQ4Iiwic3ltYm9sJDQ5Iiwic3ltYm9sJDUwIiwic3ltYm9sJDUxIiwic3ltYm9sJDUyIiwic3ltYm9sJDUzIiwic3ltYm9sJDU0IiwiYXNjZW5kaW5nJDgiLCJkZXNjZW5kaW5nJDgiLCJjb21wYXJlJDUiLCJlcXVhbCQ1IiwibWF4JDkiLCJtaW4kOSIsInN5bWJvbCQ1NSIsInN5bWJvbCQ1NiIsInN5bWJvbCQ1NyIsInN5bWJvbCQ1OCIsInN5bWJvbCQ1OSIsInN5bWJvbCQ2MCIsImFzY2VuZGluZyQ5IiwiZGVzY2VuZGluZyQ5IiwiY29tcGFyZSQ2IiwiZXF1YWwkNiIsIm1heCQxMCIsIm1pbiQxMCIsInN5bWJvbCQ2MSIsInN5bWJvbCQ2MiIsInN5bWJvbCQ2MyIsInN5bWJvbCQ2NCIsImFzciIsImxhbmQiLCJsbm90JDAiLCJsb3IiLCJsc2wiLCJsc3IiLCJseG9yIiwibW9kIiwiYWJzJDAiLCJmYWlsd2l0aCQwIiwiZnN0IiwiaW52YWxpZF9hcmckMCIsInNuZCIsInBoeXNfZXF1YWwiLCJkZWNyIiwiaW5jciIsImZsb2F0X29mX3N0cmluZyIsImFtX3Rlc3RpbmciLCJmYWlsd2l0aGYiLCJmbXQiLCJzIiwiaW52YWxpZF9hcmdmIiwiYmFja2VuZF90eXBlIiwiaW50ZXJhY3RpdmUiLCJvc190eXBlIiwidW5peCIsIndpbjMyIiwiY3lnd2luIiwid29yZF9zaXplX2luX2JpdHMiLCJpbnRfc2l6ZV9pbl9iaXRzIiwiYmlnX2VuZGlhbiIsIm1heF9zdHJpbmdfbGVuZ3RoIiwibWF4X2FycmF5X2xlbmd0aCIsInJ1bnRpbWVfdmFyaWFudCIsInJ1bnRpbWVfcGFyYW1ldGVycyIsImFyZ3YiLCJnZXRfYXJndiIsIm9jYW1sX3ZlcnNpb24iLCJlbmFibGVfcnVudGltZV93YXJuaW5ncyIsInJ1bnRpbWVfd2FybmluZ3NfZW5hYmxlZCIsImdldGVudl9leG4iLCJ2YXIkMCIsImdldGVudiIsIm1heF9sZW5ndGgiLCJjcmVhdGUiLCJsZW4iLCJjcmVhdGVfZmxvYXRfdW5pbml0aWFsaXplZCIsImFwcGVuZCIsImJsaXQiLCJjb25jYXQiLCJjb3B5IiwiZmlsbCIsImluaXQiLCJtYWtlX21hdHJpeCIsIm9mX2xpc3QiLCJzdWIiLCJ0b19saXN0IiwiZm9sZCIsInQiLCJmIiwiZm9sZF9yaWdodCIsIml0ZXIiLCJpdGVyaSIsIm1hcCIsIm1hcGkiLCJzdGFibGVfc29ydCIsInN3YXAiLCJqIiwiZWx0X2kiLCJlbHRfaiIsImVzY2FwZWQiLCJsb3dlcmNhc2UiLCJ0b19pbnQiLCJ1bnNhZmVfb2ZfaW50IiwidXBwZXJjYXNlIiwiaW50X2lzX29rIiwibWluX3ZhbHVlIiwibWF4X3ZhbHVlIiwib2ZfaW50Iiwib2ZfaW50X2V4biIsInQxIiwidDIiLCJ0b19zdHJpbmciLCJvZl9zdHJpbmciLCJ0b19mbG9hdCIsIm9mX2Zsb2F0Iiwic3VjYyIsImhkX2V4biIsImxlbmd0aCIsInJldl9hcHBlbmQiLCJ0bF9leG4iLCJ1bnppcCIsImV4aXN0cyIsImV4aXN0czJfb2siLCJsMSIsImwyIiwiZm9sZDJfb2siLCJmb3JfYWxsIiwiZm9yX2FsbDJfb2siLCJpdGVyMl9vayIsIm5vbnRhaWxfbWFwIiwibm9udGFpbF9tYXBpIiwicGFydGl0aW9uIiwicmV2X21hcCIsInJldl9tYXAyX29rIiwic29ydCIsImwiLCJyZXYiLCJyZXMiLCJyZXN0IiwiYSIsImIiLCJoYXNoX2ZvbGRfdW5pdCIsImhhc2hfZm9sZF9pbnQiLCJoYXNoX2ZvbGRfaW50NjQiLCJoYXNoX2ZvbGRfZmxvYXQiLCJoYXNoX2ZvbGRfc3RyaW5nIiwiYXNfaW50IiwiaGFzaF9mb2xkX2ludDMyIiwiaGFzaF9mb2xkX2NoYXIiLCJoYXNoX2ZvbGRfYm9vbCIsImhhc2hfZm9sZF9uYXRpdmVpbnQiLCJoYXNoX2ZvbGRfb3B0aW9uIiwiaGFzaF9mb2xkX2VsZW0iLCJoYXNoX2ZvbGRfbGlzdCIsInMkMSIsImxpc3QkMSIsInMkMiIsImxpc3QiLCJsaXN0JDAiLCJzJDAiLCJoYXNoX2ZvbGRfbGF6eV90IiwiaGFzaF9mb2xkX3JlZl9mcm96ZW4iLCJoYXNoX2ZvbGRfYXJyYXlfZnJvemVuIiwiYXJyYXkiLCJlIiwiaSQwIiwiaGFzaF9uYXRpdmVpbnQiLCJoYXNoX2ludDY0IiwiaGFzaF9pbnQzMiIsImhhc2hfY2hhciIsImhhc2hfaW50IiwiaGFzaF9ib29sIiwiaGFzaF9zdHJpbmciLCJoYXNoX2Zsb2F0IiwiaGFzaF91bml0Iiwic2VlZCIsIm9mX2ZvbGQiLCJoYXNoX2ZvbGRfdCIsInJ1biIsImZvbGRlciIsIm9wdCIsInN0aCIsImNvbXBhcmVfc3RhdGUiLCJzdGF0ZV90b19zdHJpbmciLCJzdGF0ZSIsInQkMCIsInQkMSIsInQkMiIsInQkMyIsInQkNCIsInQkNSIsImNvbXBhcmVfYWJzdHJhY3QiLCJ0eXBlX25hbWUiLCJlcXVhbF9hYnN0cmFjdCIsImNvbXBhcmVfYm9vbCIsImNvbXBhcmVfY2hhciIsImNvbXBhcmVfZmxvYXQiLCJjb21wYXJlX2ludCIsImNvbXBhcmVfaW50MzIiLCJjb21wYXJlX2ludDY0IiwiY29tcGFyZV9uYXRpdmVpbnQiLCJjb21wYXJlX3N0cmluZyIsImNvbXBhcmVfdW5pdCIsImNvbXBhcmVfYXJyYXkiLCJjb21wYXJlX2VsdCIsImxlbl9hIiwibGVuX2IiLCJyZXQiLCJyIiwiY29tcGFyZV9saXN0IiwiYSQwIiwiYiQwIiwieXMiLCJ4cyIsImNvbXBhcmVfb3B0aW9uIiwiY29tcGFyZV9yZWYiLCJlcXVhbF9ib29sIiwiZXF1YWxfY2hhciIsImVxdWFsX2ludCIsImVxdWFsX2ludDMyIiwiZXF1YWxfaW50NjQiLCJlcXVhbF9uYXRpdmVpbnQiLCJlcXVhbF9zdHJpbmciLCJlcXVhbF91bml0IiwiZXF1YWxfZmxvYXQiLCJlcXVhbF9hcnJheSIsImVxdWFsX2VsdCIsImVxdWFsX2xpc3QiLCJlcXVhbF9vcHRpb24iLCJlcXVhbF9yZWYiLCJhXzAwMSIsImJfMDAyIiwiYV8wMDMiLCJiXzAwNCIsImFfMDA1IiwiYl8wMDYiLCJoYXNoIiwiaHN2IiwiYXJnIiwiYTAiLCJoc3YkMCIsImEwJDAiLCJoc3YkMSIsInRfc2V4cF9ncmFtbWFyIiwiaW52YXJpYW50Iiwic2V4cF9vZl90IiwibnVtX2JpdHMiLCJ3b3JkX3NpemUiLCJhbGwiLCJyZWdpc3RlciIsInAiLCJwcCIsIm1vZHVsZV9uYW1lIiwiZm9ybWF0dGVyIiwiYXJnMV8wMDIiLCJhcmcwXzAwMSIsInJlczBfMDAzIiwicmVzMV8wMDQiLCJhcmcxXzAwNiIsImFyZzBfMDA1IiwicmVzMF8wMDciLCJyZXMxXzAwOCIsImNyZWF0ZV9zIiwic2V4cCIsInJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIiwiYmFja3RyYWNlIiwicmVyYWlzZSIsImV4biIsInN0ciIsImV4biQwIiwiYnQiLCJyZXJhaXNlZiIsImV4YyIsImZvcm1hdCIsInRvX3N0cmluZ19tYWNoIiwic2V4cF9vZl90JDAiLCJwcm90ZWN0eCIsImZpbmFsbHkkMCIsImZpbmFsX2V4biQwIiwiZmluYWxfZXhuIiwicHJvdGVjdCIsImRvZXNfcmFpc2UiLCJwcGYiLCJwcmludF93aXRoX2JhY2t0cmFjZSIsInJhd19iYWNrdHJhY2UiLCJoYW5kbGVfdW5jYXVnaHRfYXV4IiwiZXhjJDAiLCJoYW5kbGVfdW5jYXVnaHRfYW5kX2V4aXQiLCJoYW5kbGVfdW5jYXVnaHQiLCJtdXN0X2V4aXQiLCJleGl0JDAiLCJyZXJhaXNlX3VuY2F1Z2h0IiwiZnVuYyIsInJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIiwiaW5pdGlhbGl6ZV9tb2R1bGUiLCJjbGVhcl9iYWNrdHJhY2UiLCJ3aXRoX3JldHVybiIsImlzX2FsaXZlIiwicmV0dXJuJDAiLCJ3aXRoX3JldHVybl9vcHRpb24iLCJwcmVwZW5kIiwicGFyYW0iLCJzeW1ib2xfYmluZCIsInN5bWJvbF9tYXAiLCJiaW5kIiwiam9pbiIsImlnbm9yZV9tIiwiYWxsX3VuaXQiLCJtYXBfdmlhX2JpbmQiLCJtYSIsInN5bWJvbF9iaW5kJDAiLCJzeW1ib2xfbWFwJDAiLCJzeW1ib2xfYmluZCQxIiwic3ltYm9sX21hcCQxIiwiYm90aCIsImxvb3AiLCJ2cyIsInRzIiwidiIsImJpbmQkMCIsInJldHVybiQxIiwibWFwJDAiLCJ0b19tb25hZCIsIm9mX21vbmFkIiwiZGVyaXZlZF9tYXAiLCJtYXAyIiwidGEiLCJ0YiIsIm1hcDMiLCJ0YyIsInN5bWJvbCQwIiwidSIsInN5bWJvbCQxIiwidGYiLCJmYWIiLCJjIiwiYXBwbHkiLCJtZiIsIm14IiwidHgiLCJjdXN0b21fbWFwIiwiYXBwbHkkMCIsImJsaXRfc3RyaW5nIiwibWFrZSIsInVuc2FmZV9ibGl0IiwidW5zYWZlX3RvX3N0cmluZyIsInVuc2FmZV9vZl9zdHJpbmdfcHJvbWlzZV9ub19tdSIsImNvbXBhcmF0b3IiLCJlcnJvcl9zb3VyY2VfMDExIiwiY21wX2YiLCJjbXBfcyIsImhhc2hfZm9sZF9mIiwiaGFzaF9mb2xkX3MiLCJ0X29mX3NleHAiLCJvZl9mXzAwNyIsIm9mX3NfMDA4Iiwic2V4cF8wMTMiLCJ0YWdfMDE0Iiwic2V4cF9hcmdzXzAyMCIsImFyZzBfMDIxIiwicmVzMF8wMjIiLCJzZXhwX2FyZ3NfMDE1IiwiYXJnMF8wMTYiLCJyZXMwXzAxNyIsIm9mX2ZfMDI1Iiwib2Zfc18wMjYiLCJhcmcwXzAyNyIsInJlczBfMDI4IiwiYXJnMF8wMjkiLCJyZXMwXzAzMCIsImZfc2V4cF9ncmFtbWFyIiwic19zZXhwX2dyYW1tYXIiLCJvcGFxdWVfaWRlbnRpdHkiLCJuYW1lIiwiZ2V0IiwiZnNldCIsInNldHRlciIsInVwZGF0ZXIiLCJmaWVsZCIsImNhcGl0YWxpemUiLCJ1bmNhcGl0YWxpemUiLCJzZXAiLCJuIiwibiQwIiwibiQxIiwiaHN2JDIiLCJwb3NfY251bV8wMTAiLCJwb3NfYm9sXzAwOCIsInBvc19sbnVtXzAwNiIsInBvc19mbmFtZV8wMDQiLCJhcmdfMDExIiwiYm5kc18wMDMiLCJhcmdfMDA5IiwiYm5kc18wMDMkMCIsImFyZ18wMDciLCJibmRzXzAwMyQxIiwiYXJnXzAwNSIsImJuZHNfMDAzJDIiLCJoYXNoX2ZvbGRfdCQwIiwiaGFzaCQwIiwibWFrZV9sb2NhdGlvbl9zdHJpbmciLCJwb3NfZm5hbWUiLCJwb3NfbG51bSIsInBvc19jbnVtIiwicG9zX2JvbCIsImlzX2VtcHR5IiwicGFydGl0aW9uX21hcCIsImZzdCQwIiwieSQwIiwic25kJDAiLCJlcnJvcl9zb3VyY2VfMDA1Iiwib2ZfYV8wMDEiLCJvZl9iXzAwMiIsInNleHBfMDA3IiwidGFnXzAwOCIsInNleHBfYXJnc18wMDkiLCJhcmcwXzAxMCIsInJlczBfMDExIiwic2V4cF9hcmdzXzAxNCIsImFyZzBfMDE1IiwicmVzMF8wMTYiLCJvZl9hXzAxOSIsIm9mX2JfMDIwIiwiYXJnMF8wMjMiLCJyZXMwXzAyNCIsImFfc2V4cF9ncmFtbWFyIiwiYl9zZXhwX2dyYW1tYXIiLCJjbXBfYSIsImNtcF9iIiwiYV8wMjciLCJiXzAyOCIsImFfMDI5IiwiYl8wMzAiLCJhXzAzMSIsImJfMDMyIiwiYV8wMzMiLCJiXzAzNCIsImFfMDM1IiwiYl8wMzYiLCJhXzAzNyIsImJfMDM4IiwiaGFzaF9mb2xkX2EiLCJoYXNoX2ZvbGRfYiIsIngkMCIsImNoZWNrX29rIiwiY2hlY2tfZXJyb3IiLCJvayIsImVycm9yIiwiZmFpbCIsImZhaWxmIiwibWFwX2Vycm9yIiwiYmluZCQxIiwibWFwJDEiLCJyZXR1cm4kMiIsImlzX29rIiwiaXNfZXJyb3IiLCJvZl9vcHRpb24iLCJpdGVyX2Vycm9yIiwidG9fZWl0aGVyIiwib2ZfZWl0aGVyIiwib2tfaWZfdHJ1ZSIsImJvb2wiLCJ0cnlfd2l0aCIsIm9rX2V4biIsIm9rX29yX2ZhaWx3aXRoIiwiY29tYmluZSIsImVyciIsIm9rMSIsIm9rMiIsImVycjEiLCJlcnIyIiwiY29tYmluZV9lcnJvcnMiLCJlcnJzIiwiY29tYmluZV9lcnJvcnNfdW5pdCIsImNvdW50Iiwic3VtIiwiTSIsImZvbGRfcmVzdWx0IiwiYWNjIiwiaXRlbSIsImZvbGRfdW50aWwiLCJmaW5pc2giLCJtaW5fZWx0IiwiZWx0IiwibWF4X2VsdCIsImZpbmRfbWFwIiwiZmluZCIsInRvX2FycmF5IiwiaXRlciQwIiwiaXRlciQxIiwibGVuZ3RoJDAiLCJsZW5ndGgkMSIsImlzX2VtcHR5JDAiLCJzdW0kMCIsIm0iLCJjb3VudCQwIiwiZXhpc3RzJDAiLCJmb3JfYWxsJDAiLCJmaW5kX21hcCQwIiwiZmluZCQwIiwidG9fbGlzdCQwIiwidG9fYXJyYXkkMCIsIm1pbl9lbHQkMCIsIm1heF9lbHQkMCIsImZvbGRfcmVzdWx0JDAiLCJmb2xkX3VudGlsJDAiLCJmb2xkJDAiLCJtZW0iLCJjb21wYXJlX2EiLCJlcXVhbF9hIiwic2V4cF9vZl9hIiwic2xvd19jaGVja19wb3NfbGVuX2V4biIsInBvcyIsInRvdGFsX2xlbmd0aCIsImNoZWNrX3Bvc19sZW5fZXhuIiwic3RvcCIsImdldF9wb3NfbGVuX2V4biIsImxlbiQwIiwib2Zfc3RhdGUiLCJhc3NpZ24iLCJkc3QiLCJzcmMiLCJkc3QkMCIsInNyYyQwIiwibWFrZV9kZWZhdWx0IiwiZGVmYXVsdCQwIiwic3BsaXRfZnJvbV9wYXJlbnQiLCJnZXRfc3RhdGUiLCJyYW5kb21fa2V5IiwiZm9yYmlkX25vbmRldGVybWluaXNtX2luX3Rlc3RzIiwiYWxsb3dfaW5fdGVzdHMiLCJiaXRzIiwiaW50JDAiLCJpbnQzMiIsImludDY0IiwibmF0aXZlaW50IiwiY2hhciQwIiwiYXNjaWkiLCJtYWtlX3NlbGZfaW5pdCIsImludF9vbl82NGJpdHMiLCJib3VuZCIsImludF9vbl8zMmJpdHMiLCJpbnQkMSIsImJpdHMkMCIsImZ1bGxfcmFuZ2VfaW50NjQiLCJiaXRzJDEiLCJmdWxsX3JhbmdlX2ludDMyIiwiZnVsbF9yYW5nZV9pbnRfb25fNjRiaXRzIiwiZnVsbF9yYW5nZV9pbnRfb25fMzJiaXRzIiwiZnVsbF9yYW5nZV9pbnRfb25fNjRiaXRzJDAiLCJmdWxsX3JhbmdlX25hdGl2ZWludF9vbl82NGJpdHMiLCJmdWxsX3JhbmdlX25hdGl2ZWludF9vbl8zMmJpdHMiLCJmdWxsX3JhbmdlX25hdGl2ZWludCIsInJhaXNlX2Nyb3NzZWRfYm91bmRzIiwibG93ZXJfYm91bmQiLCJ1cHBlcl9ib3VuZCIsInN0cmluZ19vZl9ib3VuZCIsImludF9pbmNsIiwibG8iLCJoaSIsImRpZmYiLCJpbnQzMl9pbmNsIiwibmF0aXZlaW50X2luY2wiLCJpbnQ2NF9pbmNsIiwiZmxvYXQkMCIsInIxIiwicjIiLCJyZXN1bHQiLCJmbG9hdF9yYW5nZSIsImRlZmF1bHQkMSIsImJpdHMkMiIsImludCQyIiwiaW50MzIkMCIsIm5hdGl2ZWludCQwIiwiaW50NjQkMCIsImZsb2F0JDEiLCJpbnRfaW5jbCQwIiwiaW50MzJfaW5jbCQwIiwibmF0aXZlaW50X2luY2wkMCIsImludDY0X2luY2wkMCIsImZsb2F0X3JhbmdlJDAiLCJib29sJDAiLCJjaGFyJDEiLCJhc2NpaSQwIiwiZnVsbF9pbml0Iiwic2VsZl9pbml0Iiwic2V0X3N0YXRlIiwicGVybXV0ZSIsInJhbmRvbV9zdGF0ZSIsInN0aCQwIiwibnVtX3N3YXBzIiwidGhpc19pIiwicmFuZG9tX2kiLCJjb25zdCQwIiwibm9uIiwiZm9yZXZlciIsImUkMCIsImNvbXBvc2UiLCJnIiwiZmxpcCIsImFwcGx5X25fdGltZXMiLCJ4JDEiLCJzZXhwXzAwNiIsImVycm9yX3NvdXJjZV8wMjIiLCJmb2xkX2xlZnQiLCJhXzAwNiIsImJfMDA3IiwiYV8wMDgiLCJiXzAwOSIsIm9mX2FfMDEwIiwiYXJnMF8wMTEiLCJyZXMwXzAxMiIsInJhbmdlIiwic3RyaWRlIiwic3RhcnRfaSIsInN0b3BfaSIsInN0YXJ0IiwibmV4dF9pIiwib3JkZXIiLCJyYWlzZV9zdHJpZGVfY2Fubm90X3JldHVybl9zYW0iLCJpbml0aWFsX3N0cmlkZV9vcmRlciIsInN0YXJ0X2kkMCIsImFjY3VtIiwiaV90b19zdG9wX29yZGVyIiwibmV4dF9pJDAiLCJhY2N1bSQwIiwicmFuZ2UkMCIsInN0aCQxIiwiaGQiLCJ0bCIsIm50aCIsIm50aF9leG4iLCJ1bm9yZGVyZWRfYXBwZW5kIiwib2ZfbGlzdHMiLCJzaGFyZWRfbGVuZ3RoIiwic2hhcmVkX2xlbmd0aCQwIiwiY2hlY2tfbGVuZ3RoMl9leG4iLCJ0YWlsX29mX2IiLCJ0YWlsX29mX2EiLCJjaGVja19sZW5ndGgyIiwib2ZfbGlzdHMkMCIsImwzIiwiYyQwIiwiY2hlY2tfbGVuZ3RoM19leG4iLCJ0YWlsX29mX2MiLCJuMSIsIm4yIiwibjMiLCJjaGVja19sZW5ndGgzIiwiaXRlcjIiLCJpdGVyMl9leG4iLCJyZXZfbWFwMiIsInJldl9tYXAyX2V4biIsImZvbGQyIiwiZm9sZDJfZXhuIiwiZm9yX2FsbDIiLCJmb3JfYWxsMl9leG4iLCJleGlzdHMyIiwiZXhpc3RzMl9leG4iLCJicyIsInJldl9maWx0ZXIiLCJhY2N1IiwiZmlsdGVyIiwibm90X2ZvdW5kIiwiZmluZF9tYXBfZXhuIiwibm90X2ZvdW5kJDAiLCJmaW5kX2V4biIsImZpbmRpIiwibm90X2ZvdW5kJDEiLCJmaW5kaV9leG4iLCJmaW5kX21hcGkiLCJub3RfZm91bmQkMiIsImZpbmRfbWFwaV9leG4iLCJmb3JfYWxsaSIsImV4aXN0c2kiLCJtYXhfbm9uX3RhaWxjYWxsIiwiY291bnRfYXBwZW5kIiwieDEiLCJ4MiIsIngzIiwieDQiLCJ4NSIsImNvdW50X21hcCIsImN0ciIsIngxJDAiLCJmMSQzIiwieDIkMCIsImYxJDIiLCJmMiQyIiwieDMkMCIsImYxJDEiLCJmMiQxIiwiZjMkMSIsIng0JDAiLCJmMSQwIiwiZjIkMCIsImYzJDAiLCJmNCQwIiwieDUkMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJicyQwIiwieHMkMCIsIng4IiwieDciLCJ4NiIsIngwIiwieTAkMCIsInkxJDAiLCJ5MiQwIiwieTMkMCIsInk0JDAiLCJ5NSQwIiwieTYkMCIsInk3JDAiLCJ5OCQwIiwieTgiLCJ5NyIsInk2IiwieTUiLCJ5NCIsInkzIiwieTIiLCJ5MSIsInkwIiwiZm9sZGluZ19tYXAiLCJuZXdfYWNjIiwiZm9sZF9tYXAiLCJtYXAyX29rIiwibWFwMl9leG4iLCJyZXZfbWFwM19vayIsImwxJDAiLCJsMiQwIiwibDMkMCIsImFjIiwibDMkMSIsImwyJDEiLCJsMSQxIiwiYWMkMCIsInJldl9tYXAzIiwicmV2X21hcDNfZXhuIiwibWFwM19vayIsIm1hcDNfZXhuIiwicmV2X21hcF9hcHBlbmQiLCJoIiwibGlzdCQyIiwidW56aXAzIiwieiIsInppcF9leG4iLCJ6aXAiLCJyZXZfbWFwaSIsImZvbGRpbmdfbWFwaSIsImZvbGRfbWFwaSIsImZvbGRpIiwiZmlsdGVyaSIsInJlZHVjZSIsInJlZHVjZV9leG4iLCJyZWR1Y2VfYmFsYW5jZWQiLCJzdGVwX2FjY3VtIiwibnVtIiwibnVtJDAiLCJhY2MkMCIsImFjYyQxIiwibnVtJDEiLCJyZWR1Y2VfYmFsYW5jZWRfZXhuIiwiZ3JvdXBpIiwiYnJlYWskMCIsImdyb3VwcyIsImN1cnJlbnRfZ3JvdXAiLCJncm91cCIsInNvcnRfYW5kX2dyb3VwIiwiY29uY2F0X21hcCIsImNvbmNhdF9tYXBpIiwiY29udCIsIm1lcmdlIiwiaDIiLCJoMSIsIm1hcDIkMCIsIm1hcDMkMCIsInN5bWJvbCQyIiwibGFzdF9leG4iLCJsYXN0IiwiaXNfcHJlZml4IiwicHJlZml4IiwicHJlZml4JDAiLCJwcmVmaXgkMSIsImhkJDAiLCJmaW5kX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZSIsImExIiwiYTEkMCIsImEyIiwicmVtb3ZlX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZXMiLCJ3aGljaF90b19rZWVwIiwidGwkMCIsInRvX2tlZXAkMiIsInRvX2tlZXAiLCJ0b19rZWVwJDAiLCJ0b19rZWVwJDEiLCJkZWR1cF9hbmRfc29ydCIsInNvcnRlZCIsImZpbmRfYV9kdXAiLCJsJDAiLCJoZDIiLCJoZDEiLCJjb250YWluc19kdXAiLCJsc3QiLCJmaW5kX2FsbF9kdXBzIiwic29ydGVkJDIiLCJwcmV2JDEiLCJzb3J0ZWQkMCIsInByZXYiLCJhbHJlYWR5X3JlY29yZGVkIiwic29ydGVkJDEiLCJwcmV2JDAiLCJhbGxfZXF1YWwiLCJjb3VudGkiLCJpZHgiLCJyZXZfZmlsdGVyX21hcCIsImZpbHRlcl9tYXAiLCJyZXZfZmlsdGVyX21hcGkiLCJpJDEiLCJmaWx0ZXJfbWFwaSIsImZpbHRlcl9vcHQiLCJwYXJ0aXRpb24zX21hcCIsInRyZCIsInRyZCQwIiwieSQxIiwicGFydGl0aW9uX3RmIiwiZiQwIiwicGFydGl0aW9uX3Jlc3VsdCIsInRfb2Zfc2V4cCQwIiwib2ZfYV8wMTQiLCJvZl9iXzAxNSIsInhfMDIzIiwic2V4cF8wMjEiLCJhcmcxXzAxOCIsImFyZzBfMDE3IiwicmVzMF8wMTkiLCJyZXMxXzAyMCIsInNleHBfb2ZfdCQxIiwib2ZfYV8wMjQiLCJvZl9iXzAyNSIsInhfMDMwIiwiYXJnMV8wMjciLCJhcmcwXzAyNiIsInJlczFfMDI5IiwidF9zZXhwX2dyYW1tYXIkMCIsInBhaXJfb2ZfZ3JvdXAiLCJrIiwiZ3JvdXAkMCIsImFsaXN0Iiwic29ydF9hbmRfZ3JvdXAkMCIsImtleSIsImtleSQwIiwibm90X2ZvdW5kJDMiLCJmaW5kX2V4biQwIiwidmFsdWUiLCJtZW0kMCIsInJlbW92ZSIsImFkZCIsImludmVyc2UiLCJtYXAkMiIsImVsIiwic3BsaXRfbiIsInRfb3JpZyIsInRha2UiLCJkcm9wIiwiY2h1bmtzX29mIiwibCQxIiwic3VibGlzdCIsInNwbGl0X3doaWxlIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJkcm9wX2xhc3QiLCJkcm9wX2xhc3RfZXhuIiwiY2FydGVzaWFuX3Byb2R1Y3QiLCJsaXN0MSIsImxpc3QyIiwiY29uY2F0X25vX29yZGVyIiwiY29ucyIsImlzX3NvcnRlZCIsImlzX3NvcnRlZF9zdHJpY3RseSIsImFyciIsInJhbmRvbV9lbGVtZW50X2V4biIsInJhbmRvbV9lbGVtZW50IiwiY21wIiwidDEkMCIsInQyJDAiLCJ0MiQxIiwidDEkMSIsInRyYW5zcG9zZSIsInJvd3MkMCIsInJvd3MiLCJjb2x1bW5zIiwiZG9fcmV2IiwiY29sdW1uX2FjYyIsInRyaW1tZWRfcm93cyIsImZvdW5kX2VtcHR5IiwiY29sdW1uIiwiZG9fcmV2JDAiLCJjb2x1bW5zJDAiLCJ0cmltbWVkIiwiY29sdW1uX2FjYyQwIiwiYXJnMF8wMzEiLCJyZXMwXzAzMiIsInRyYW5zcG9zZV9leG4iLCJpbnRlcnNwZXJzZSIsImlzX3N1ZmZpeCIsInN1ZmZpeCIsImxpc3RfbGVuIiwic3VmZml4X2xlbiIsInJlczBfMDAyIiwiYXJnMF8wMDMiLCJyZXMwXzAwNCIsInJlczBfMDA2IiwiYXJnMF8wMDciLCJyZXMwXzAwOCIsImFyZzJfMDExIiwiYXJnMV8wMTAiLCJhcmcwXzAwOSIsInJlczFfMDEzIiwicmVzMl8wMTQiLCJhcmcxXzAxNiIsInJlczFfMDE4IiwiYXJnMl8wMjEiLCJhcmcxXzAyMCIsImFyZzBfMDE5IiwicmVzMV8wMjMiLCJyZXMyXzAyNCIsImFyZzFfMDI2IiwiYXJnMF8wMjUiLCJyZXMwXzAyNyIsInJlczFfMDI4IiwiYXJnMV8wMzAiLCJyZXMwXzAzMSIsInJlczFfMDMyIiwidG9fc3RyaW5nc19odW0iLCJzdHJpbmciLCJzZXhwJDAiLCJzZXhwJDEiLCJ0YWciLCJ0YWckMCIsInNleHAkMiIsInRhZyQxIiwiYm9keSIsInRydW5jX2FmdGVyIiwidHMkMCIsInRzJDEiLCJhYyQxIiwidG9fc2V4cHNfaHVtIiwiaGVyZSIsImhlcmUkMCIsInRvX3NleHBfaHVtIiwic2V4cHMiLCJ0b19tZXNzYWdlIiwiaW5mbyIsIm9mX21lc3NhZ2UiLCJ0b19zdHJpbmdfaHVtIiwibWVzc2FnZSIsInRvX3N0cmluZ19odW1fZGVwcmVjYXRlZCIsIm9mX2xhenkiLCJvZl9sYXp5X3NleHAiLCJvZl9sYXp5X3QiLCJsYXp5X3QiLCJjcmVhdGVmIiwib2ZfdGh1bmsiLCJzdHJpY3QiLCJzZXhwX29mX3giLCJ0YWdfc19sYXp5IiwidGFnX3MiLCJ0YWdfYXJnIiwidG9fZXhuIiwib2ZfZXhuIiwiYmFja3RyYWNlJDAiLCJiYWNrdHJhY2UkMSIsImJhY2t0cmFjZSQyIiwicmFpc2UiLCJyYWlzZV9zIiwidG9faW5mbyIsIm9mX2luZm8iLCJjaGVja19maWVsZCIsImFfMDA3IiwiYl8wMDgiLCJvZl9hXzAxMyIsInhfMDE1Iiwib2ZfYV8wMTYiLCJ4XzAxNyIsImludmFyaWFudF9hIiwiZTEiLCJlMiIsInRyeV93aXRoX2pvaW4iLCJvZl9leG5fcmVzdWx0IiwiZXJyb3JfcyIsImVycm9yX3N0cmluZyIsImVycm9yZiIsInVuaW1wbGVtZW50ZWQiLCJmaWx0ZXJfb2tfYXRfbGVhc3Rfb25lIiwiZmluZF9vayIsImZpbmRfbWFwX29rIiwiZXJyb3Jfc291cmNlXzAwMyIsInNleHBfMDA0IiwiZ2VxIiwibGVxIiwiYmV0d2VlbiIsImxvdyIsImhpZ2giLCJjbGFtcF91bmNoZWNrZWQiLCJjbGFtcF9leG4iLCJjbGFtcCIsImxleGljb2dyYXBoaWMiLCJjbXBzIiwiY21wcyQwIiwibGlmdCIsInJldmVyc2UiLCJpc19wb3NpdGl2ZSIsImlzX25vbl9uZWdhdGl2ZSIsImlzX25lZ2F0aXZlIiwiaXNfbm9uX3Bvc2l0aXZlIiwic2lnbiIsImhhc2hfcGFyYW0iLCJwb2x5Iiwib2Zfa2V5IiwiS2V5IiwidG9fa2V5IiwiaGFzaF9wYXJhbSQwIiwicG9seSQwIiwib2Zfa2V5JDAiLCJ0b19rZXkkMCIsImhhc2hhYmxlIiwiZ2V0X3Bvc19sZW4iLCJmaW5kX2ZpcnN0X3NhdGlzZnlpbmciLCJwcmVkIiwicG9zJDAiLCJoaSQwIiwibG8kMSIsIm1pZCIsImxvJDIiLCJsbyQwIiwiZmluZF9sYXN0X3NhdGlzZnlpbmciLCJiaW5hcnlfc2VhcmNoIiwiaG93IiwiYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQiLCJzZWdtZW50X29mIiwiaXNfbGVmdCIsImlzX3JpZ2h0IiwiYWxsJDAiLCJzcmNfcG9zIiwiZHN0X3BvcyIsImJsaXRvIiwic3JjX2xlbiIsInN1Ym8iLCJjcmVhdGVfbGlrZSIsInVuc2FmZV9ibGl0JDAiLCJpc19ub25lIiwiaXNfc29tZSIsInZhbHVlX21hcCIsIm8iLCJjYWxsIiwidmFsdWVfZXhuIiwiZXJyb3IkMCIsIm0kMCIsIm0kMSIsInZhbHVlX29yX3RodW5rIiwic29tZSIsImZpcnN0X3NvbWUiLCJzb21lX2lmIiwiY29uZCIsImFfb2Zfc2V4cCIsImJfb2Zfc2V4cCIsInNleHBfb2ZfYiIsImNfb2Zfc2V4cCIsInNleHBfb2ZfYyIsImlzX2ZpcnN0IiwiaXNfc2Vjb25kIiwiZmlyc3QiLCJzZWNvbmQiLCJlcTEiLCJlcTIiLCJvdGhlciIsImVpdGhlciIsIm90aGVyX2xvb3AiLCJyZXR1cm5fbG9vcCIsImNvbWJpbmVfYWxsIiwib3RoZXJfbG9vcCQwIiwicmV0dXJuX2xvb3AkMCIsImNvbWJpbmVfYWxsX3VuaXQiLCJ0b19vcHRpb24iLCJlaXRoZXIkMCIsImNvbWJpbmUkMCIsIml0ZXJpJDAiLCJpdGVyaSQxIiwiZm9sZGkkMCIsImZvbGRpJDEiLCJjb3VudGkkMCIsImV4aXN0c2kkMCIsImZvcl9hbGxpJDAiLCJmaW5kX21hcGkkMCIsImZpbmRpJDAiLCJlcnJvcl9zb3VyY2VfMDI1Iiwib2Zfc18wMDIiLCJuZXh0X3N0ZXAiLCJkZWxheWVkX2ZvbGRfc3RlcCIsIm5leHQiLCJ1bmZvbGRfc3RlcCIsInVuZm9sZCIsInVuZm9sZF93aXRoIiwic2VlZCQwIiwic2VlZCQxIiwidW5mb2xkX3dpdGhfYW5kX2ZpbmlzaCIsInJ1bm5pbmdfc3RlcCIsImlubmVyX2ZpbmlzaGVkIiwiZmluaXNoaW5nX3N0ZXAiLCJzdGF0ZSQwIiwic3RhdGUkMSIsInN0YXRlJDIiLCJpbm5lcl9zdGF0ZSIsInN0YXRlJDMiLCJpbm5lcl9zdGF0ZSQwIiwiaW5uZXJfc3RhdGUkMSIsInN0YXRlJDQiLCJzdGF0ZSQ1Iiwic2VlZCQyIiwidiQwIiwidG9fbGlzdF9yZXYiLCJzdGFydF92Iiwic3RvcF92Iiwic3RlcCIsInRfbGF6eSIsImwkMiIsInNvbWVfYiIsImVtcHR5IiwibmV4dCQwIiwicyQzIiwiYV8wMTEiLCJiXzAxMiIsImFfMDEzIiwiYl8wMTQiLCJhXzAxNSIsImJfMDE2IiwiYV8wMTkiLCJhXzAxNyIsImJfMDIwIiwiYl8wMTgiLCJhMCQxIiwiaHN2JDMiLCJvZl9hXzAyMSIsIm9mX2JfMDIyIiwic2V4cF8wMjciLCJ0YWdfMDI4Iiwic2V4cF9hcmdzXzAzNCIsImFyZzBfMDM1IiwicmVzMF8wMzYiLCJzZXhwX2FyZ3NfMDI5IiwiYXJnMF8wMzAiLCJzZXhwX2FyZ3NfMDM5IiwiYXJnMV8wNDEiLCJhcmcwXzA0MCIsInJlczBfMDQyIiwicmVzMV8wNDMiLCJvZl9hXzA0NiIsIm9mX2JfMDQ3IiwiYXJnMF8wNDgiLCJyZXMwXzA0OSIsImFyZzBfMDUwIiwicmVzMF8wNTEiLCJhcmcxXzA1MyIsImFyZzBfMDUyIiwicmVzMF8wNTQiLCJyZXMxXzA1NSIsIm1lcmdlX3dpdGhfZHVwbGljYXRlcyIsIm5leHQyIiwiczIiLCJuZXh0MSIsInMxIiwiczIkMCIsInMyJDEiLCJzMSQwIiwiczIkMiIsInMxJDEiLCJzMiQzIiwiY29tcGFyaXNvbiIsIm1lcmdlX2RlZHVwZWRfYW5kX3NvcnRlZCIsIm1lcmdlX3NvcnRlZCIsInRsX2VhZ2VybHlfZXhuIiwibGlmdF9pZGVudGl0eSIsImNodW5rc19leG4iLCJ6aXBfZnVsbCIsImJvdW5kZWRfbGVuZ3RoIiwiYXRfbW9zdCIsImxlbmd0aF9pc19ib3VuZGVkX2J5IiwiY3VyIiwiY3VyJDAiLCJsYXN0X2VsdCIsImxhc3RfZWx0JDAiLCJzaGlmdF9yaWdodCIsInNoaWZ0X3JpZ2h0X3dpdGhfbGlzdCIsInMkNSIsImEkMSIsInMkNCIsInJlcGVhdCIsImN5Y2xlX2xpc3RfZXhuIiwic2EiLCJzYiIsInNpbmdsZXRvbiIsImRlbGF5ZWRfZm9sZCIsIm9wdGlvbiIsImZvbGRfbSIsIml0ZXJfbSIsImZvcmNlX2VhZ2VybHkiLCJtZW1vaXplIiwiZHJvcF9lYWdlcmx5IiwiZHJvcF93aGlsZV9vcHRpb24iLCJ2MiIsInYxIiwicm91bmRfcm9iaW4iLCJkb25lX3N0YWNrIiwidG9kb19zdGFjayIsInRvZG9fc3RhY2skMCIsImludGVybGVhdmUiLCJpbnRlcmxlYXZlZF9jYXJ0ZXNpYW5fcHJvZHVjdCIsIm9mX3NlcSIsInNlcSIsInRvX3NlcSIsInlpZWxkJDAiLCJvZl9zZXF1ZW5jZSIsInNlcXVlbmNlIiwidGh1bmsiLCJzZXQiLCJzd2FwJDAiLCJ0bXAiLCJsZWZ0IiwicmlnaHQiLCJmaW5hbF9wb3MiLCJpX25leHQiLCJoZWFwaWZ5Iiwicm9vdCIsInJvb3QkMCIsInJlbGF0aXZlX3Jvb3QiLCJsZWZ0X2NoaWxkIiwicmlnaHRfY2hpbGQiLCJsYXJnZXN0IiwibGFyZ2VzdCQwIiwic29ydCQwIiwiZml2ZV9lbGVtZW50X3NvcnQiLCJtMSIsIm0yIiwibTMiLCJtNCIsIm01IiwiY29tcGFyZV9hbmRfc3dhcCIsImludHJvX3NvcnQiLCJtYXhfZGVwdGgiLCJtYXhfZGVwdGgkMCIsImxlZnQkMCIsIm1heF9kZXB0aCQxIiwic2l4dGgiLCJtMl92YWwiLCJtM192YWwiLCJtNF92YWwiLCJtaWRkbGVfc29ydGVkIiwicGl2b3QyIiwicGl2b3QxIiwicCQxIiwiciQyIiwibGVmdCQxIiwicHYiLCJwJDAiLCJyJDAiLCJyJDEiLCJzb3J0JDEiLCJzb3J0JDIiLCJlbHRfaV9taW51c18xIiwibWVyZ2VkIiwiYTFfaW5kZXgiLCJhMl9pbmRleCIsInVzZV9hMSIsImNvcHlfbWF0cml4IiwicmV2X2lucGxhY2UiLCJvZl9saXN0X3JldiIsIm9mX2xpc3RfbWFwIiwib2ZfbGlzdF9tYXBpIiwib2ZfbGlzdF9yZXZfbWFwIiwib2ZfbGlzdF9yZXZfbWFwaSIsIm1hcF9pbnBsYWNlIiwiZmluZGlfaW50ZXJuYWwiLCJpZl9mb3VuZCIsImlmX25vdF9mb3VuZCIsImZvdW5kIiwidmFsdWVfZm91bmQiLCJyZXMxIiwicmVzMiIsInNvcnRlZF9jb3B5IiwicGFydGl0aW9uaV90ZiIsInRydWVzIiwiZmFsc2VzIiwidG9fc2VxdWVuY2VfbXV0YWJsZSIsInRvX3NlcXVlbmNlIiwiaTEiLCJpMiIsInR0Iiwid2lkdGgiLCJkZXB0aCIsImQiLCJ3IiwidHQkMCIsImdldCQwIiwiemVyb19vYmoiLCJjcmVhdGVfemVybyIsInVuc2FmZV9nZXQiLCJ1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkiLCJvYmoiLCJzZXRfd2l0aF9jYW1sX21vZGlmeSIsInVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbiIsIm9sZF9vYmoiLCJ1bnNhZmVfc2V0IiwidW5zYWZlX3NldF9vbWl0X3BoeXNfZXF1YWxfY2hlIiwidW5zYWZlX3NldF9hc3N1bWluZ19jdXJyZW50bHlfIiwidW5zYWZlX3NldF9pbnQiLCJ1bnNhZmVfY2xlYXJfaWZfcG9pbnRlciIsInVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCIsImNyZWF0ZV9vYmpfYXJyYXkiLCJvZl9hcnJheSIsImdyYW1tYXIiLCJjZWlsIiwiZmxvb3IiLCJtb2RfZmxvYXQiLCJtb2RmIiwibWF4X2Zpbml0ZV92YWx1ZSIsImNsYXNzaWZ5X2Zsb2F0IiwiYWJzX2Zsb2F0IiwiaXNfaW50ZWdlciIsImZyZXhwIiwibGRleHAiLCJpc19uYW4iLCJ0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlciIsInRvX2ludDY0X3ByZXNlcnZlX29yZGVyX2V4biIsIm9mX2ludDY0X3ByZXNlcnZlX29yZGVyIiwib25lX3VscCIsImRpciIsInVwcGVyX2JvdW5kX2Zvcl9pbnQiLCJleHAiLCJpc194X21pbnVzX29uZV9leGFjdCIsImxvd2VyX2JvdW5kX2Zvcl9pbnQiLCJtaW5faW50X2FzX2Zsb2F0IiwiYm94IiwiaXNfbG93ZXJjYXNlIiwiaXNfdXBwZXJjYXNlIiwiaXNfcHJpbnQiLCJpc193aGl0ZXNwYWNlIiwiaXNfZGlnaXQiLCJpc19hbHBoYSIsImlzX2FscGhhbnVtIiwiZ2V0X2RpZ2l0X3Vuc2FmZSIsImdldF9kaWdpdF9leG4iLCJnZXRfZGlnaXQiLCJpc19oZXhfZGlnaXQiLCJpc19oZXhfZGlnaXRfbG93ZXIiLCJpc19oZXhfZGlnaXRfdXBwZXIiLCJnZXRfaGV4X2RpZ2l0X2V4biIsImdldF9oZXhfZGlnaXQiLCJ0X29mX3NleHAkMSIsImMxIiwiYzIiLCJoYXNoX2ZvbGRfdCQxIiwiaGFzaCQxIiwidHJfY3JlYXRlX21hcCIsInRhcmdldCIsInJlcGxhY2VtZW50IiwidHJfbWFwIiwiaSQzIiwiaSQyIiwiaW5kZXgkMCIsImxhc3RfcmVwbGFjZW1lbnQiLCJpbmRleCIsImZpcnN0X3RhcmdldCIsInN0YWdlIiwidW5zdGFnZSIsImNvbnRhaW5zIiwicG9zJDEiLCJlbmQiLCJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCIsImluZGV4X2V4bl9pbnRlcm5hbCIsImluZGV4X2V4biIsImluZGV4X2Zyb21fZXhuIiwicmluZGV4X2Zyb21fZXhuX2ludGVybmFsIiwicmluZGV4X2V4bl9pbnRlcm5hbCIsInJpbmRleF9leG4iLCJyaW5kZXhfZnJvbV9leG4iLCJyaW5kZXgiLCJpbmRleF9mcm9tIiwicmluZGV4X2Zyb20iLCJjYXNlX3NlbnNpdGl2ZSIsInBhdHRlcm4iLCJrbXBfaW50ZXJuYWxfbG9vcCIsIm1hdGNoZWRfY2hhcnMiLCJuZXh0X3RleHRfY2hhciIsImttcF9hcnJheSIsImNoYXJfZXF1YWwiLCJtYXRjaGVkX2NoYXJzJDAiLCJnZXRfY2hhcl9lcXVhbCIsImluZGV4X2ludGVybmFsIiwidGV4dCIsIm1hdGNoZXMiLCJpbiQwIiwiaW5kZXhfZXhuJDAiLCJpbmRleF9hbGwiLCJtYXlfb3ZlcmxhcCIsInJlcGxhY2VfZmlyc3QiLCJ3aXRoJDAiLCJsZW5fcyIsImxlbl90IiwibGVuX3dpdGgiLCJyZXBsYWNlX2FsbCIsIm51bV9tYXRjaGVzIiwibmV4dF9kc3RfcG9zIiwibmV4dF9zcmNfcG9zIiwic3BsaXRfb24iLCJwYXR0ZXJuX2xlbiIsImFfMDAyIiwiYl8wMDMiLCJrbXBfYXJyYXlfMDExIiwiY2FzZV9zZW5zaXRpdmVfMDA5IiwicGF0dGVybl8wMDciLCJhcmdfMDEyIiwiYm5kc18wMDYiLCJhcmdfMDEwIiwiYm5kc18wMDYkMCIsImFyZ18wMDgiLCJibmRzXzAwNiQxIiwicmVwcmVzZW50YXRpb24iLCJzdWJzdHJfaW5kZXhfZ2VuIiwic3Vic3RyX2luZGV4X2V4bl9nZW4iLCJzdWJzdHJfaW5kZXhfYWxsX2dlbiIsInN1YnN0cl9yZXBsYWNlX2ZpcnN0X2dlbiIsInN1YnN0cl9yZXBsYWNlX2FsbF9nZW4iLCJpc19zdWJzdHJpbmdfZ2VuIiwic3Vic3RyaW5nIiwic3Vic3RyX2luZGV4Iiwic3Vic3RyX2luZGV4X2V4biIsInN1YnN0cl9pbmRleF9hbGwiLCJzdWJzdHJfcmVwbGFjZV9maXJzdCIsInN1YnN0cl9yZXBsYWNlX2FsbCIsImlzX3N1YnN0cmluZyIsImlzX3N1YnN0cmluZ19hdF9nZW4iLCJzdHJfcG9zJDEiLCJzdHJfbGVuIiwic3ViX2xlbiIsInN0cl9wb3MiLCJzdWJfcG9zIiwic3ViX3BvcyQwIiwic3RyX3BvcyQwIiwiaXNfc3VmZml4X2dlbiIsInN0cmluZ19sZW4iLCJpc19wcmVmaXhfZ2VuIiwicHJlZml4X2xlbiIsInNleHBfb2ZfdCQyIiwic3RyaW5nMSIsInN0cmluZzIiLCJsZW4yIiwibGVuMSIsInN1YnN0cl9pbmRleCQwIiwic3Vic3RyX2luZGV4X2V4biQwIiwic3Vic3RyX2luZGV4X2FsbCQwIiwic3Vic3RyX3JlcGxhY2VfZmlyc3QkMCIsInN1YnN0cl9yZXBsYWNlX2FsbCQwIiwiaXNfc3Vic3RyaW5nJDAiLCJpc19zdWJzdHJpbmdfYXQiLCJsc3BsaXQyX2V4biIsImxpbmUiLCJkZWxpbSIsIm5vdF9mb3VuZCQ0IiwicnNwbGl0Ml9leG4iLCJsc3BsaXQyIiwib24iLCJyc3BsaXQyIiwiY2hhcl9saXN0X21lbSIsInNwbGl0X2dlbiIsImlzX2RlbGltIiwibGFzdF9wb3MiLCJsYXN0X3BvcyQxIiwibGFzdF9wb3MkMCIsInBvczEiLCJzdWJfc3RyIiwic3BsaXQiLCJzcGxpdF9vbl9jaGFycyIsImNoYXJzIiwiYmFja191cF9hdF9uZXdsaW5lIiwiZW9sIiwic3BsaXRfbGluZXMiLCJpc19zdWZmaXgkMCIsImlzX3ByZWZpeCQwIiwiaXNfc3Vic3RyaW5nX2F0JDAiLCJ3cmFwX3N1Yl9uIiwib25fZXJyb3IiLCJkcm9wX3ByZWZpeCIsImRyb3Bfc3VmZml4IiwibGZpbmRpIiwicmZpbmRpIiwibGFzdF9ub25fZHJvcCIsInJzdHJpcCIsImZpcnN0X25vbl9kcm9wIiwibHN0cmlwIiwic3RyaXAiLCJ0ciIsInRyX211bHRpIiwiY29uY2F0X2FycmF5IiwiYXIiLCJvdXQiLCJvdXRfcG9zIiwib3V0JDAiLCJjaG9wX3ByZWZpeCIsImNob3BfcHJlZml4X2lmX2V4aXN0cyIsImNob3BfcHJlZml4X2V4biIsImNob3Bfc3VmZml4IiwiY2hvcF9zdWZmaXhfaWZfZXhpc3RzIiwiY2hvcF9zdWZmaXhfZXhuIiwic2hvcnRlciIsInNob3J0ZXN0IiwicG9zX2Zyb21fbGVmdCIsInBvc19mcm9tX3JpZ2h0IiwiY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wIiwiZ2V0X3BvcyIsIm1heF9sZW4iLCJsZW5fc29fZmFyIiwibGVuX3NvX2ZhciQwIiwibGVuX3NvX2ZhciQxIiwiY29tbW9uX2dlbmVyaWMyX2xlbmd0aCIsImNvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wIiwiZmlyc3QkMCIsIm1heF9sZW4kMCIsIm1heF9sZW4kMSIsImNvbW1vbl9nZW5lcmljX2xlbmd0aCIsImNvbW1vbl9nZW5lcmljMiIsImNvbW1vbl9nZW5lcmljIiwiY29tbW9uX3ByZWZpeCIsImNvbW1vbl9zdWZmaXgiLCJjb21tb25fcHJlZml4MiIsImNvbW1vbl9zdWZmaXgyIiwiY29tbW9uX3ByZWZpeF9sZW5ndGgiLCJjb21tb25fc3VmZml4X2xlbmd0aCIsImNvbW1vbl9wcmVmaXgyX2xlbmd0aCIsImNvbW1vbl9zdWZmaXgyX2xlbmd0aCIsIm9mX2NoYXIiLCJvZl9jaGFyX2xpc3QiLCJidWlsZF9hbmRfdmFsaWRhdGVfZXNjYXBld29ydGgiLCJlc2NhcGV3b3J0aHlfbWFwIiwiZXNjYXBlX2NoYXIiLCJlc2NhcGV3b3J0aHlfbWFwJDAiLCJ2YWxzIiwiY190byIsImNfZnJvbSIsImskMCIsImVzY2FwZV9nZW4iLCJlc2NhcGV3b3J0aHkiLCJ0b19lc2NhcGVfbGVuIiwidG9fZXNjYXBlIiwibGFzdF9pZHgiLCJsYXN0X2RzdF9wb3MiLCJsYXN0X2lkeCQwIiwibGFzdF9kc3RfcG9zJDAiLCJ0b19lc2NhcGUkMCIsImVzY2FwZWRfY2hhciIsImxhc3RfaWR4JDEiLCJsYXN0X2RzdF9wb3MkMSIsImVzY2FwZV9nZW5fZXhuIiwiZXNjYXBlIiwidW5lc2NhcGVfZ2VuIiwic3RhdHVzIiwidG9fdW5lc2NhcGUiLCJ0b191bmVzY2FwZSQwIiwic3RhdHVzJDAiLCJ1bmVzY2FwZV9nZW5fZXhuIiwidW5lc2NhcGUiLCJwcmVjZWRpbmdfZXNjYXBlX2NoYXJzIiwiY250IiwiY250JDAiLCJ1cGRhdGVfZXNjYXBlX3N0YXR1cyIsImVzY2FwZV9zdGF0dXMiLCJvZGQiLCJjaGVja19ib3VuZCIsImZ1bmN0aW9uX25hbWUiLCJpc19jaGFyX2VzY2FwaW5nIiwiaXNfY2hhcl9lc2NhcGVkIiwiaXNfY2hhcl9saXRlcmFsIiwiaW5kZXhfZnJvbSQwIiwic3RhdHVzJDEiLCJpbmRleF9mcm9tX2V4biQwIiwiaW5kZXgkMSIsImluZGV4X2V4biQxIiwicmluZGV4X2Zyb20kMCIsImVzY2FwZV9jaGFycyIsInJpbmRleF9mcm9tX2V4biQwIiwicmluZGV4JDAiLCJyaW5kZXhfZXhuJDAiLCJzcGxpdF9nZW4kMCIsInNwbGl0JDAiLCJzcGxpdF9vbl9jaGFycyQwIiwic3BsaXRfYXQiLCJsc3BsaXQyJDAiLCJyc3BsaXQyJDAiLCJsc3BsaXQyX2V4biQwIiwicnNwbGl0Ml9leG4kMCIsImxhc3Rfbm9uX2Ryb3BfbGl0ZXJhbCIsImZpcnN0X25vbl9kcm9wX2xpdGVyYWwiLCJyc3RyaXBfbGl0ZXJhbCIsImxzdHJpcF9saXRlcmFsIiwic3RyaXBfbGl0ZXJhbCIsImJldHdlZW4kMCIsImNsYW1wX2V4biQwIiwiY2xhbXAkMCIsImNyZWF0ZSQwIiwiY3JlYXRlJDEiLCJ1bnNhZmVfYmxpdCQxIiwibWFwaSQwIiwib2NhbWxfbGV4X3RhYmxlcyIsInBhcnNlX2hleCIsImxleGJ1ZiIsIm9jYW1sX2xleF9zdGF0ZSIsIm9jYW1sX2xleF9zdGF0ZSQwIiwiY29udmVydF9mYWlsdXJlIiwibnVtX2JpdHNfaW50IiwibnVtX2JpdHNfbmF0aXZlaW50IiwibnVtX2JpdHNfaW50MzIiLCJudW1fYml0c19pbnQ2NCIsIm1pbl9pbnQzMiIsIm1heF9pbnQzMiIsIm1pbl9pbnQ2NCIsIm1heF9pbnQ2NCIsIm1pbl9uYXRpdmVpbnQiLCJtYXhfbmF0aXZlaW50IiwiaW50NjRfdG9fc3RyaW5nIiwibmF0aXZlaW50X3RvX3N0cmluZyIsImludDMyX3RvX2ludF90cnVuYyIsImludF90b19pbnQzMl90cnVuYyIsImludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIiwiaW50X3RvX2ludDMyIiwiaW50MzJfdG9faW50IiwiaW50X3RvX2ludDMyX2V4biIsImludDMyX3RvX2ludF9leG4iLCJpbnRfdG9faW50NjQiLCJpbnQ2NF90b19pbnRfdHJ1bmMiLCJpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCIsImludDY0X3RvX2ludCIsImludDY0X3RvX2ludF9leG4iLCJpbnRfdG9fbmF0aXZlaW50IiwibmF0aXZlaW50X3RvX2ludF90cnVuYyIsIm5hdGl2ZWludF90b19pbnQiLCJuYXRpdmVpbnRfdG9faW50X2V4biIsImludDMyX3RvX2ludDY0IiwiaW50NjRfdG9faW50MzJfdHJ1bmMiLCJpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMiLCJpbnQ2NF90b19pbnQzMiIsImludDY0X3RvX2ludDMyX2V4biIsImludDMyX3RvX25hdGl2ZWludCIsIm5hdGl2ZWludF90b19pbnQzMl90cnVuYyIsIm5hdGl2ZWludF90b19pbnQzMiIsIm5hdGl2ZWludF90b19pbnQzMl9leG4iLCJpbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmMiLCJuYXRpdmVpbnRfdG9faW50NjQiLCJpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX25hdGkiLCJpbnQ2NF90b19uYXRpdmVpbnQiLCJpbnQ2NF90b19uYXRpdmVpbnRfZXhuIiwiaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQ2IiwiaW50NjRfZml0X29uX2ludDYzX2V4biIsImluc2VydF9kZWxpbWl0ZXJfZXZlcnkiLCJkZWxpbWl0ZXIiLCJjaGFyc19wZXJfZGVsaW1pdGVyIiwiaW5wdXRfbGVuZ3RoIiwiaGFzX3NpZ24iLCJudW1fZGlnaXRzIiwibnVtX2RlbGltaXRlcnMiLCJvdXRwdXRfbGVuZ3RoIiwiaW5wdXRfcG9zIiwib3V0cHV0X3BvcyIsIm51bV9jaGFyc191bnRpbF9kZWxpbWl0ZXIiLCJmaXJzdF9kaWdpdF9wb3MiLCJpbnNlcnRfZGVsaW1pdGVyIiwiaW5zZXJ0X3VuZGVyc2NvcmVzIiwic2V4cF9vZl9pbnRfc3R5bGUiLCJkZWxpbWl0ZXIkMCIsIm1ha2Vfc3VmZml4IiwidG9fc3RyaW5nJDAiLCJpbnZhbGlkIiwib2Zfc3RyaW5nX3dpdGhfZGVsaW1pdGVyIiwibGV4IiwiYm9keSQwIiwib3ZlcmZsb3dfYm91bmRfbWF4X2ludDYzX29uX2luIiwib3ZlcmZsb3dfYm91bmRfbWF4X2ludDY0X3ZhbHVlIiwiaW50MzJfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIiwib3ZlcmZsb3dfYm91bmRfbWF4X2ludF92YWx1ZSIsIm92ZXJmbG93X2JvdW5kX21heF9pbnQzMl92YWx1ZSIsImludF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMiLCJpbnQ2M19vbl9pbnQ2NF9wb3NpdGl2ZV9vdmVyZmwiLCJpbnQ2NF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMiLCJpbnQ2NF9uZWdhdGl2ZV9vdmVyZmxvd19ib3VuZHMiLCJuZWdhdGl2ZV9leHBvbmVudCIsIm92ZXJmbG93IiwiaW50X3BvdyIsImJhc2UiLCJleHBvbmVudCIsImludDY0X3BvdyIsImludDYzX3Bvd19vbl9pbnQ2NCIsInJ2YWwiLCJvbmUiLCJyb3VuZF9kb3duIiwibW9kdWx1cyIsInJvdW5kX3VwIiwicmVtYWluZGVyIiwicm91bmRfdG93YXJkc196ZXJvIiwidG9fbXVsdGlwbGVfb2YiLCJyb3VuZF9uZWFyZXN0IiwibW9kdWx1c19taW51c19yZW1haW5kZXIiLCJyb3VuZCIsImgwMSIsIm1hc2siLCJpbnQ2NF9wb3Bjb3VudCIsIngkMiIsImludDMyX3BvcGNvdW50IiwibmF0aXZlaW50X3BvcGNvdW50IiwibW9kdWxlX25hbWUkMCIsIm9mX3N0cmluZyQwIiwiZmxvYXRfbG93ZXJfYm91bmQiLCJmbG9hdF91cHBlcl9ib3VuZCIsIm9mX2Zsb2F0X3VuY2hlY2tlZCIsImZ1bmMkMCIsInplcm8iLCJtaW51c19vbmUiLCJuZWciLCJvZl9zdHJpbmckMSIsIm9mX2ludDMyIiwib2ZfaW50MzJfZXhuIiwidG9faW50MzIiLCJ0b19pbnQzMl9leG4iLCJvZl9pbnQ2NCIsIm9mX2ludDY0X2V4biIsInRvX2ludDY0Iiwib2ZfbmF0aXZlaW50Iiwib2ZfbmF0aXZlaW50X2V4biIsInRvX25hdGl2ZWludCIsIm1heF92YWx1ZV8zMF9iaXRzIiwiYWJzIiwicmVtIiwic2hpZnRfcmlnaHRfbG9naWNhbCIsInNoaWZ0X2xlZnQiLCJiaXRfbm90IiwiYml0X29yIiwiYml0X2FuZCIsImJpdF94b3IiLCJwb3ciLCJub25fcG9zaXRpdmVfYXJndW1lbnQiLCJjZWlsX3BvdzIiLCJ4JDMiLCJ4JDQiLCJ4JDUiLCJ4JDYiLCJmbG9vcl9wb3cyIiwiaXNfcG93MiIsImZsb29yX2xvZzIiLCJjZWlsX2xvZzIiLCJwb3Bjb3VudCIsImxub3QiLCJzdWNjX2V4biIsIm1zZyIsInByZWRfZXhuIiwib2Zfc2NhbGFyIiwib2Zfc2NhbGFyX2V4biIsInRvX3NjYWxhciIsInRvX2NoYXIiLCJ0b19jaGFyX2V4biIsInV0ZjhfYnl0ZV9sZW5ndGgiLCJ1Y2hhciIsImNvZGVwb2ludCIsInNvbWVfdCIsInJlZmwiLCJzeW0iLCJ0cmFucyIsImNvbnYiLCJkZXR1cGxlMiIsInR1cGxlMiIsIndpdG5lc3MiLCJ2XzAwNSIsInRvX3NleHAiLCJ1aWQiLCJzYW1lX3dpdG5lc3MiLCJzYW1lIiwic2FtZV93aXRuZXNzX2V4biIsIm5vbmVfc3Vic3RpdHV0ZSIsIm5vbmUiLCJ2YWx1ZV91bnNhZmUiLCJvZl9zZXhwYWJsZSIsInRvX3NleHBhYmxlIiwieF8wMDMiLCJvZl9hXzAwNCIsInhfMDA1IiwiaW5pdF9zb21lIiwiZ2V0X3NvbWVfZXhuIiwiaXNfbm9uZSQwIiwiaXNfc29tZSQwIiwic2V0X3NvbWUiLCJzZXRfbm9uZSIsInVuc2FmZV9nZXRfc29tZV9leG4iLCJ1bnNhZmVfZ2V0X3NvbWVfYXNzdW1pbmdfc29tZSIsInVuc2FmZV9pc19zb21lIiwidW5zYWZlX3NldF9zb21lIiwidW5zYWZlX3NldF9ub25lIiwiY2xlYXIiLCJlbGVtIiwibWFwX3NvbWUiLCJvZl9hcnJheV9zb21lIiwiY2FwYWNpdHkiLCJlbHRzIiwibGVuZ3RoXzAwMyIsImVsdHNfMDA1IiwiYXJnXzAwNiIsImJuZHNfMDAyIiwiYXJnXzAwNCIsImJuZHNfMDAyJDAiLCJyZXNpemUiLCJzaXplIiwic2V0X2NhcGFjaXR5IiwibmV3X2NhcGFjaXR5IiwibmV3X2NhcGFjaXR5JDAiLCJwdXNoIiwicG9wX25vbmVtcHR5IiwicG9wX2Vycm9yIiwicG9wIiwicG9wX2V4biIsInRvcF9ub25lbXB0eSIsInRvcF9lcnJvciIsInRvcCIsInRvcF9leG4iLCJ1bnRpbF9lbXB0eSIsImhhc2hfb3ZlcnJpZGUiLCJvZl9wb3MiLCJvZl9zaWduIiwidG9fc2lnbl9leG4iLCJ0b19pbnRfZXhuIiwiZXJyb3Jfc291cmNlXzAwNiIsImVycm9yX3NvdXJjZV8wMjciLCJpbnRlcnZhbF9jb21wYXJpc29uX3NleHBfZ3JhbW0iLCJhbGxfb2ZfYSIsImVudW1lcmF0ZV8wMDIiLCJlbnVtZXJhdGVfMDAxIiwiYWNjJDIiLCJvZl9hXzAwMyIsInNleHBfMDA4IiwidGFnXzAwOSIsInNleHBfYXJnc18wMTAiLCJhcmcwXzAyMCIsInJlczBfMDIxIiwiYXJnMF8wMjIiLCJyZXMwXzAyMyIsImludGVydmFsX2NvbXBhcmlzb25fb2Zfc2V4cCIsInNleHBfMDI4Iiwic2V4cF9vZl9pbnRlcnZhbF9jb21wYXJpc29uIiwiY29tcGFyZV9pbnRlcnZhbF9jb21wYXJpc29uIiwiaGFzaF9mb2xkX2ludGVydmFsX2NvbXBhcmlzb24iLCJoYXNoX2ludGVydmFsX2NvbXBhcmlzb24iLCJpbmNsIiwiZXhjbCIsImlzX2xvd2VyX2JvdW5kIiwiaXNfdXBwZXJfYm91bmQiLCJib3VuZHNfY3Jvc3NlZCIsImxvd2VyIiwidXBwZXIiLCJsb3dlciQwIiwidXBwZXIkMCIsImNvbXBhcmVfdG9faW50ZXJ2YWxfZXhuIiwiaW50ZXJ2YWxfY29udGFpbnNfZXhuIiwiZXJyb3Jfc291cmNlXzA1NyIsInJpZ2h0XzAwNCIsImxlZnRfMDAzIiwicmlnaHRfMDA4IiwibGVmdF8wMDciLCJvZl9hXzAwOSIsInZfMDEwIiwiY21wX2siLCJjbXBfdiIsInRfMDE0IiwidF8wMTMiLCJ0XzAxNiIsInRfMDE1IiwicmlnaHRfMDE4IiwibGVmdF8wMTciLCJyaWdodF8wMjIiLCJsZWZ0XzAyMSIsInRfMDI0IiwidF8wMjMiLCJ0XzAyNiIsInRfMDI1IiwicmlnaHRfMDIwIiwibGVmdF8wMTkiLCJ0XzAzMCIsInRfMDI5IiwidF8wMzIiLCJ0XzAzMSIsInJpZ2h0XzAzNCIsImxlZnRfMDMzIiwicmlnaHRfMDM4IiwibGVmdF8wMzciLCJ0XzA0MCIsInRfMDM5IiwidF8wNDIiLCJ0XzA0MSIsInJpZ2h0XzAzNiIsImxlZnRfMDM1Iiwib2Zfa18wNDMiLCJvZl92XzA0NCIsInNleHBfMDcxIiwiYXJnMV8wNjgiLCJhcmcwXzA2NyIsInJlczBfMDY5IiwiYXRvbV8wNDciLCJzZXhwX2FyZ3NfMDUwIiwiYXRvbV8wNDckMCIsImFyZzBfMDU4IiwicmVzMF8wNTkiLCJhcmcwXzA2MSIsInJlczBfMDYyIiwiYXJnMF8wNjQiLCJyZXMwXzA2NSIsInJlczFfMDcwIiwib2Zfa18wNzIiLCJvZl92XzA3MyIsImFyZzFfMDgyIiwiYXJnMF8wODEiLCJyZXMwXzA4MyIsInZfMDc0IiwicmVzMV8wODQiLCJ2XzA3NiIsImFyZzFfMDc4IiwiYXJnMF8wNzciLCJyZXMwXzA3OSIsInJlczFfMDgwIiwidl8wNzUiLCJrX3NleHBfZ3JhbW1hciIsInZfc2V4cF9ncmFtbWFyIiwiY21wX2xlZnQiLCJjbXBfcmlnaHQiLCJhXzA4NSIsImJfMDg2IiwicmlnaHRfMDkyIiwibGVmdF8wOTEiLCJ0XzA5NCIsInRfMDkzIiwidF8wOTYiLCJ0XzA5NSIsInJpZ2h0XzA4OCIsImxlZnRfMDg3IiwicmlnaHRfMDkwIiwibGVmdF8wODkiLCJhXzA5NyIsImJfMDk4IiwicmlnaHRfMTA0IiwibGVmdF8xMDMiLCJ0XzEwNiIsInRfMTA1IiwidF8xMDgiLCJ0XzEwNyIsInJpZ2h0XzEwMCIsImxlZnRfMDk5IiwicmlnaHRfMTAyIiwibGVmdF8xMDEiLCJvZl9sZWZ0XzEwOSIsIm9mX3JpZ2h0XzExMCIsInZfMTEzIiwiYXJnMV8xMTUiLCJhcmcwXzExNCIsInJlczBfMTE2IiwicmVzMV8xMTciLCJ2XzExMSIsInZfMTEyIiwic2V4cF9vZl90JDMiLCJoZWlnaHQiLCJpbl9yYW5nZSIsImhsIiwiaHIiLCJsb3dlciQxIiwiaW52YXJpYW50cyIsImgkMSIsImgkMCIsInNsIiwic3IiLCJvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2siLCJrbCIsImskMSIsImtsJDAiLCJrJDIiLCJrciIsImxlZnRfbGVuZ3RoIiwicmlnaHRfbGVuZ3RoIiwib2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCIsImFycmF5X2xlbmd0aCIsIm9mX3NvcnRlZF9hcnJheSIsImluY3JlYXNpbmciLCJiYWwiLCJsciIsImx2IiwibGwiLCJscnIiLCJscnYkMCIsImxybCIsImxydiIsInJyIiwicnYiLCJybCIsInJsciIsInJsdiQwIiwicmxsIiwicmx2IiwiYXV4IiwibGgiLCJsdiQwIiwicmgiLCJydiQwIiwibWluX2VsdF9leG4iLCJmb2xkX3VudGlsX2hlbHBlciIsInZhbHVlJDAiLCJtYXhfZWx0X2V4biIsInJlbW92ZV9taW5fZWx0IiwibWF5YmVfZWx0IiwibWF5YmVfZWx0JDAiLCJlbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW8iLCJyZW1vdmVfaW5kZXgiLCJsX3NpemUiLCJ1bmlvbiIsInYxJDAiLCJ2MiQwIiwicjIkMCIsInIxJDAiLCJ1bmlvbl9saXN0IiwidG9fdHJlZSIsImludGVyIiwib3RoZXJfc2V0IiwiZSQxIiwiY29uc19yaWdodCIsIm9mX3NldCIsImVudW0kMCIsInRyZWUiLCJzeW1tZXRyaWNfZGlmZiIsImVsdCQwIiwiZW51bTEiLCJ0cmVlMSIsImVudW0yIiwidHJlZTIiLCJjb21wYXJlX3Jlc3VsdCIsIm5leHRfc3RhdGUiLCJncmVhdGVyX29yX2VxdWFsX3RvIiwibGVzc19vcl9lcXVhbF90byIsImluY2x1c2l2ZV9ib3VuZCIsInNpZGUiLCJtYXliZSIsInYkMSIsInYkMiIsInYkMyIsInYkNCIsImUkMiIsImluaXQkMCIsIm1lcmdlX3RvX3NlcXVlbmNlIiwiZTIkMiIsImUxJDIiLCJlMiQwIiwiZTEkMCIsImUyJDEiLCJlMSQxIiwidDIkMiIsInQxJDIiLCJpc19zdWJzZXQiLCJhcmVfZGlzam9pbnQiLCJhY2N1JDAiLCJhY2N1JDEiLCJmaWx0IiwicGFydCIsImVsZW1lbnRzX2F1eCIsImVsZW1lbnRzIiwiY2hvb3NlIiwiY2hvb3NlX2V4biIsInBvc19yZWYiLCJncm91cF9ieSIsImVxdWl2Iiwic2V0JDAiLCJlcXVpdl9jbGFzc2VzIiwibm90X2VxdWl2X3giLCJlcXVpdl94IiwiZXF1aXZfY2xhc3NlcyQwIiwic3RhYmxlX2RlZHVwX2xpc3QiLCJsZWZ0b3ZlcnMiLCJhbHJlYWR5X3NlZW4iLCJhbHJlYWR5X3NlZW4kMCIsImxlZnRvdmVycyQwIiwidF9vZl9zZXhwX2RpcmVjdCIsImVsdF9sc3QiLCJlbF9zZXhwIiwiaXNfc3Vic2V0JDAiLCJzdWJzZXQiLCJzdXBlcnNldCIsInNleHBfb2ZfZWx0IiwiaW52YWxpZF9lbGVtZW50cyIsImludmFsaWRfZWxlbWVudHNfc2V4cCIsImxpa2UiLCJpbnZhcmlhbnRzJDAiLCJlbGVtZW50cyQwIiwibWluX2VsdF9leG4kMCIsIm1heF9lbHRfZXhuJDAiLCJjaG9vc2UkMCIsImNob29zZV9leG4kMCIsImZvbGRfcmlnaHQkMCIsIml0ZXIyJDAiLCJmaWx0ZXIkMCIsImFkZCQwIiwicmVtb3ZlJDAiLCJ1bmlvbiQwIiwiaW50ZXIkMCIsImRpZmYkMCIsInN5bW1ldHJpY19kaWZmJDAiLCJjb21wYXJlX2RpcmVjdCIsImlzX3N1YnNldCQxIiwib2YiLCJhcmVfZGlzam9pbnQkMCIsInRvX25hbWVkX3RyZWUiLCJpc19zdWJzZXQkMiIsInBhcnRpdGlvbl90ZiQwIiwidHJlZV9mIiwidHJlZV90IiwiZ3JvdXBfYnkkMCIsIm50aCQwIiwicmVtb3ZlX2luZGV4JDAiLCJ0b19zZXF1ZW5jZSQwIiwiYmluYXJ5X3NlYXJjaCQwIiwiYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQkMCIsIm1lcmdlX3RvX3NlcXVlbmNlJDAiLCJoYXNoX2ZvbGRfZGlyZWN0IiwidF9vZl9zZXhwX2RpcmVjdCQwIiwiaW52YXJpYW50cyQxIiwiaXNfZW1wdHkkMSIsImVsZW1lbnRzJDEiLCJtaW5fZWx0JDEiLCJtaW5fZWx0X2V4biQxIiwibWF4X2VsdCQxIiwibWF4X2VsdF9leG4kMSIsImNob29zZSQxIiwiY2hvb3NlX2V4biQxIiwidG9fbGlzdCQxIiwidG9fYXJyYXkkMSIsIml0ZXIkMiIsImV4aXN0cyQxIiwiZm9yX2FsbCQxIiwiY291bnQkMSIsInN1bSQxIiwiZmluZCQxIiwiZmluZF9leG4kMSIsImZpbmRfbWFwJDEiLCJmb2xkJDEiLCJmb2xkX3VudGlsJDEiLCJmb2xkX3JpZ2h0JDEiLCJmaWx0ZXIkMSIsImZpbHRlcl9tYXAkMCIsInBhcnRpdGlvbl90ZiQxIiwiaXRlcjIkMSIsIm1lbSQxIiwiYWRkJDEiLCJyZW1vdmUkMSIsInVuaW9uJDEiLCJpbnRlciQxIiwiZGlmZiQxIiwic3ltbWV0cmljX2RpZmYkMSIsImNvbXBhcmVfZGlyZWN0JDAiLCJpc19zdWJzZXQkMyIsImFyZV9kaXNqb2ludCQxIiwib2ZfbGlzdCQwIiwib2Zfc2VxdWVuY2UkMCIsIm9mX2FycmF5JDAiLCJvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkJDAiLCJvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2skMCIsIm9mX3NvcnRlZF9hcnJheSQwIiwidW5pb25fbGlzdCQwIiwic3RhYmxlX2RlZHVwX2xpc3QkMCIsImdyb3VwX2J5JDEiLCJzcGxpdCQxIiwibnRoJDEiLCJyZW1vdmVfaW5kZXgkMSIsIm9mX3RyZWUiLCJ0b19zZXF1ZW5jZSQxIiwiYmluYXJ5X3NlYXJjaCQxIiwiYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQkMSIsIm1lcmdlX3RvX3NlcXVlbmNlJDEiLCJpc19zdWJzZXQkNCIsInRvX3RyZWUkMCIsIm9mX3RyZWUkMCIsInRfb2Zfc2V4cF9kaXJlY3QkMSIsImVtcHR5JDAiLCJzaW5nbGV0b24kMCIsInVuaW9uX2xpc3QkMSIsIm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQkMSIsIm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVjayQxIiwib2Zfc29ydGVkX2FycmF5JDEiLCJvZl9saXN0JDEiLCJvZl9zZXF1ZW5jZSQxIiwib2ZfYXJyYXkkMSIsInN0YWJsZV9kZWR1cF9saXN0JDEiLCJmaWx0ZXJfbWFwJDEiLCJjb21wYXJhdG9yX3MiLCJlbXB0eSQxIiwic2luZ2xldG9uJDEiLCJ1bmlvbl9saXN0JDIiLCJvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkJDIiLCJvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2skMiIsIm9mX3NvcnRlZF9hcnJheSQyIiwib2ZfbGlzdCQyIiwib2Zfc2VxdWVuY2UkMiIsIm9mX2FycmF5JDIiLCJzdGFibGVfZGVkdXBfbGlzdCQyIiwiZmlsdGVyX21hcCQyIiwic2V4cF9vZl9tX3QiLCJFbHQiLCJtX3Rfb2Zfc2V4cCIsIm1fdF9zZXhwX2dyYW1tYXIiLCJjb21wYXJlX21fdCIsImVxdWFsX21fdCIsImhhc2hfZm9sZF9tX3QiLCJoYXNoX21fdCIsImNvbXBhcmF0b3IkMCIsImVtcHR5JDIiLCJzaW5nbGV0b24kMiIsInVuaW9uX2xpc3QkMyIsIm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQkMyIsIm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVjayQzIiwib2Zfc29ydGVkX2FycmF5JDMiLCJvZl9saXN0JDMiLCJvZl9zZXF1ZW5jZSQzIiwib2ZfYXJyYXkkMyIsInN0YWJsZV9kZWR1cF9saXN0JDMiLCJtYXAkMyIsImZpbHRlcl9tYXAkMyIsIm9mX3RyZWUkMSIsInRvX3RyZWUkMSIsInJlcGxhY2UiLCJzZXRfdGVtcG9yYXJpbHkiLCJyZXN0b3JlX3RvIiwic2V0cyIsInNuYXBzaG90Iiwic2V0c190ZW1wb3JhcmlseSIsImFuZF92YWx1ZXMiLCJpbmNfbnVtX211dGF0aW9ucyIsImVsdHNfaW5kZXgiLCJjaGVja19pbmRleF9leG4iLCJlbnN1cmVfbm9fbXV0YXRpb24iLCJudW1fbXV0YXRpb25zIiwibnVtX211dGF0aW9uc18wMDMiLCJmcm9udF8wMDUiLCJtYXNrXzAwNyIsImxlbmd0aF8wMDkiLCJlbHRzXzAxMSIsImJuZHNfMDAyJDEiLCJibmRzXzAwMiQyIiwiYm5kc18wMDIkMyIsIm11dDIiLCJtdXQxIiwiZnJvbnQiLCJjYXBhY2l0eSQwIiwiY2FwYWNpdHkkMSIsImJsaXRfdG9fYXJyYXkiLCJmcm9udF9sZW4iLCJyZXN0X2xlbiIsImRlc2lyZWRfY2FwYWNpdHkiLCJlbnF1ZXVlIiwiZGVxdWV1ZV9ub25lbXB0eSIsImRlcXVldWVfZXhuIiwiZGVxdWV1ZSIsImZyb250X25vbmVtcHR5IiwibGFzdF9ub25lbXB0eSIsInBlZWsiLCJwZWVrX2V4biIsImJsaXRfdHJhbnNmZXIiLCJsZW4kMSIsImRzdF9zdGFydCIsInNyY19pIiwiZHN0X2kiLCJlbnF1ZXVlX2FsbCIsInRfcmVzdWx0IiwiZmlsdGVyX2lucGxhY2UiLCJmaWx0ZXJpX2lucGxhY2UiLCJ1bnJlYWNoYWJsZV9jb2RlIiwiemVybyQwIiwiemVybyQxIiwidG9faW50X3RydW5jIiwidG9faW50MzJfdHJ1bmMiLCJvZl9pbnQ2NF90cnVuYyIsIm5hbWUkMCIsIm9mX2NvbnRpbnVlX29yX3N0b3AiLCJ0b19jb250aW51ZV9vcl9zdG9wIiwibGVmdF92YWx1ZSIsInJpZ2h0X3ZhbHVlIiwidmFsdWVzIiwibGVmdF9kZWZhdWx0IiwicmlnaHRfZGVmYXVsdCIsInJpZ2h0JDAiLCJjb21wYXJlX2tleSIsInZsIiwidmwkMCIsInZyIiwiazAiLCJrMSIsImxkIiwibHJkIiwibHJkJDAiLCJyZCIsInJsZCIsInJsZCQwIiwicmFpc2Vfa2V5X2FscmVhZHlfcHJlc2VudCIsInNleHBfb2Zfa2V5IiwiZmluZF9hbmRfYWRkX29yX3NldCIsImRhdGEiLCJhZGRfb3Jfc2V0IiwiZCQwIiwiYWRkX2V4biIsImFkZF9leG5faW50ZXJuYWwiLCJzaW5nbGV0b25fdG9fdHJlZV9leG4iLCJjb2xsYXBzZSIsImdvIiwiYWRkX3VuY2hlY2tlZCIsImdvJDAiLCJ0b190cmVlX3VuY2hlY2tlZCIsIm1heF9rZXkiLCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIiwiYnVpbGRlciIsInByZXZfa2V5Iiwiam9pbiQwIiwibGQkMCIsImxrJDAiLCJyayIsInJkJDAiLCJyayQwIiwibGsiLCJjbXAkMCIsIm1heWJlJDAiLCJzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkiLCJpbnRvIiwiYm91bmRhcnlfb3B0IiwiaW5zZXJ0X2ludG8iLCJzcGxpdF9yYW5nZSIsIm1pZF9hbmRfcmlnaHQiLCJsYiQxIiwibGIkMiIsIm1pZF9hbmRfcmlnaHQkMCIsImxiIiwibGIkMCIsIm1pZCQwIiwiYWRkX211bHRpIiwiZGF0YSQwIiwiZmluZF9tdWx0aSIsImxvd2VyX3BhcnQiLCJ1cHBlcl9wYXJ0IiwibWluX3VwcGVyIiwibWF4X2xvd2VyIiwidXBwZXJfcGFydF93aXRob3V0X21pbiIsImdvJDEiLCJjX21pbiIsImluaXQkMSIsImNfbWF4IiwiaW5pdCQyIiwiZm9sZF9yYW5nZV9pbmNsdXNpdmUiLCJyYW5nZV90b19hbGlzdCIsImNvbmNhdF91bmNoZWNrZWQiLCJyZW1vdmVfbG9vcCIsImNoYW5nZSIsImNoYW5nZV9jb3JlIiwiZCQxIiwibGVuZ3RoJDIiLCJsZW5ndGgkMyIsInVwZGF0ZSIsInVwZGF0ZV9jb3JlIiwicmVtb3ZlX211bHRpIiwibm9uX2VtcHR5X3RhaWwiLCJpdGVyX2tleXMiLCJpdGVyaV91bnRpbF9sb29wIiwiaXRlcmlfdW50aWwiLCJmb2xkX3VudGlsX2xvb3AiLCJmaW5hbCQxIiwiZmluYWwkMCIsImZpbHRlcl9rZXlzIiwicGFydGl0aW9uX21hcGkiLCJwYWlyMiIsInBhaXIxIiwiY3VyciIsImsyIiwibmV4dCQxIiwiZGF0YV9lcXVhbCIsImtleXNfZ3JlYXRlcl9vcl9lcXVhbF90byIsImtleXNfbGVzc19vcl9lcXVhbF90byIsImQkMiIsImNvbXBhcmVfZGF0YSIsImQyIiwiZDEiLCJmb2xkMiQwIiwiZm9sZF9zeW1tZXRyaWNfZGlmZiIsImRlbHRhIiwiYWNjJDMiLCJhY2MkNCIsImFjYyQ1IiwiYWNjJDYiLCJhY2MkNyIsInJpZ2h0JDIiLCJsZWZ0JDIiLCJyaWdodCQxIiwia2V5cyIsIm9mX2ZvbGRhYmxlX2ZvbGQiLCJmb2xkYWJsZSIsInByZXZfZGF0YSIsIm9mX2ZvbGRhYmxlX3JlZHVjZSIsIm5ld19kYXRhIiwib2ZfZm9sZGFibGUiLCJvZl9mb2xkYWJsZV9vcl9lcnJvciIsIm9mX2ZvbGRhYmxlX2V4biIsIm9mX2FsaXN0X2ZvbGQiLCJvZl9hbGlzdF9yZWR1Y2UiLCJvZl9hbGlzdCIsIm9mX2FsaXN0X29yX2Vycm9yIiwib2ZfYWxpc3RfZXhuIiwib2ZfZm9sZGFibGVfbXVsdGkiLCJvZl9hbGlzdF9tdWx0aSIsImZvbGQkMiIsIm9mX3NlcXVlbmNlX2ZvbGQiLCJvZl9zZXF1ZW5jZV9yZWR1Y2UiLCJvZl9zZXF1ZW5jZV9vcl9lcnJvciIsIm9mX3NlcXVlbmNlX2V4biIsIm9mX3NlcXVlbmNlX211bHRpIiwidG9fYWxpc3QiLCJrZXlfb3JkZXIiLCJtZXJnZV9sYXJnZV9maXJzdCIsImxlbmd0aF9sYXJnZSIsInRfbGFyZ2UiLCJ0X3NtYWxsIiwibWVyZ2Vfc2tld2VkIiwibGVuZ3RoMSIsImxlbmd0aDIiLCJyZXBhY2thZ2UiLCJtYXJrZXIiLCJjbG9zZXN0X2tleSIsImZvdW5kX21hcmtlciIsImZvdW5kX2tleSIsImZvdW5kX3ZhbHVlIiwiZm91bmRfdmFsdWUkMCIsImZvdW5kX2tleSQwIiwicmFuayIsIm51bV90b19zZWFyY2giLCJwYWlyIiwicGFpciQwIiwiYmluYXJ5X3NlYXJjaF9vbmVfc2lkZWRfYm91bmQiLCJtYXliZV9ib3VuZCIsImlmX2V4Y2x1c2l2ZSIsImlmX2luY2x1c2l2ZSIsImZpbmRfYm91bmQiLCJib3VuZCQwIiwiYmluYXJ5X3NlYXJjaF90d29fc2lkZWRfYm91bmRzIiwibG93ZXJfYm91bmQkMCIsInVwcGVyX2JvdW5kJDAiLCJvZl9pdGVyaSIsIm9mX2l0ZXJpX2V4biIsImtleV9vZl9zZXhwIiwidmFsdWVfb2Zfc2V4cCIsImFsaXN0X3NleHBzIiwiZm91bmRfZmlyc3RfayIsImsyX3NleHAiLCJzZXhwX29mX3ZhbHVlIiwiZXJyb3JfdHJlZSIsIm9rcyIsIm1hcF9rZXlzIiwibWFwX2tleXNfZXhuIiwibGlrZTIiLCJsaWtlX21heWJlX25vX29wIiwib2xkX3QiLCJvbGRfdHJlZSIsIndpdGhfc2FtZV9sZW5ndGgiLCJzZXQkMSIsImFkZF9leG4kMCIsImFkZF9tdWx0aSQwIiwicmVtb3ZlX211bHRpJDAiLCJmaW5kX211bHRpJDAiLCJjaGFuZ2UkMCIsInVwZGF0ZSQwIiwiaXRlcl9rZXlzJDAiLCJpdGVyaV91bnRpbCQwIiwiZm9sZCQzIiwiZm9sZDIkMSIsImZpbHRlcl9rZXlzJDAiLCJmaWx0ZXJpJDAiLCJmaWx0ZXJfbWFwaSQwIiwicGFydGl0aW9uX21hcGkkMCIsInBhcnRpdGlvbl9tYXAkMCIsInBhcnRpdGlvbmlfdGYkMCIsImNvbWJpbmVfZXJyb3JzJDAiLCJrZXlzJDAiLCJ0b19hbGlzdCQwIiwiZm9sZF9zeW1tZXRyaWNfZGlmZiQwIiwibWVyZ2UkMCIsIm1lcmdlX3NrZXdlZCQwIiwiYm90aF9sZW4iLCJzdWJyYW5nZSIsImhfbCIsImhfciIsIm91dGVyX2pvaW5lZF9oZWlnaHQiLCJtaWRfbGVuZ3RoIiwiYXBwZW5kJDAiLCJmb2xkX3JhbmdlX2luY2x1c2l2ZSQwIiwicmFuZ2VfdG9fYWxpc3QkMCIsImNsb3Nlc3Rfa2V5JDAiLCJyYW5rJDAiLCJzZXhwX29mX2siLCJzZXhwX29mX3YiLCJoYXNoX2ZvbGRfa2V5IiwiaGFzaF9mb2xkX2RhdGEiLCJiaW5hcnlfc2VhcmNoX3N1YnJhbmdlIiwib2ZfYWxpc3QkMCIsIm9mX2FsaXN0X29yX2Vycm9yJDAiLCJvZl9hbGlzdF9leG4kMCIsIm9mX2FsaXN0X211bHRpJDAiLCJvZl9hbGlzdF9mb2xkJDAiLCJvZl9hbGlzdF9yZWR1Y2UkMCIsIm9mX2l0ZXJpJDAiLCJvZl9pdGVyaV9leG4kMCIsInJlcXVpcmVkX2J5X2ludGYiLCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlJDAiLCJvZl9zZXF1ZW5jZV9vcl9lcnJvciQwIiwib2Zfc2VxdWVuY2VfZXhuJDAiLCJvZl9zZXF1ZW5jZV9tdWx0aSQwIiwib2Zfc2VxdWVuY2VfZm9sZCQwIiwib2Zfc2VxdWVuY2VfcmVkdWNlJDAiLCJzZXQkMiIsImFkZF9leG4kMSIsImFkZF9tdWx0aSQxIiwicmVtb3ZlX211bHRpJDEiLCJmaW5kX211bHRpJDEiLCJjaGFuZ2UkMSIsInVwZGF0ZSQxIiwiaXRlcl9rZXlzJDEiLCJpdGVyaV91bnRpbCQxIiwibWFwaSQxIiwiZm9sZCQ0IiwiZm9sZDIkMiIsImZpbHRlcl9rZXlzJDEiLCJmaWx0ZXJpJDEiLCJmaWx0ZXJfbWFwaSQxIiwicGFydGl0aW9uX21hcGkkMSIsInBhcnRpdGlvbl9tYXAkMSIsInBhcnRpdGlvbmlfdGYkMSIsImNvbWJpbmVfZXJyb3JzJDEiLCJrZXlzJDEiLCJkYXRhJDEiLCJ0b19hbGlzdCQxIiwiZm9sZF9zeW1tZXRyaWNfZGlmZiQxIiwibWVyZ2UkMSIsIm1lcmdlX3NrZXdlZCQxIiwiZm9yX2FsbGkkMSIsImV4aXN0c2kkMSIsImNvdW50aSQxIiwiYXBwZW5kJDEiLCJzdWJyYW5nZSQwIiwiZm9sZF9yYW5nZV9pbmNsdXNpdmUkMSIsInJhbmdlX3RvX2FsaXN0JDEiLCJjbG9zZXN0X2tleSQxIiwibnRoJDIiLCJudGhfZXhuJDAiLCJyYW5rJDEiLCJrX29mX3NleHAiLCJ2X29mX3NleHAiLCJiaW5hcnlfc2VhcmNoX3N1YnJhbmdlJDAiLCJtYXBfa2V5cyQwIiwiZHVwIiwibWFwX2tleXNfZXhuJDAiLCJhZGRfZXhuJDIiLCJvZl90cmVlMCIsIm9mX3RyZWUkMiIsIm9mX2FsaXN0JDEiLCJvZl9hbGlzdF9vcl9lcnJvciQxIiwib2ZfYWxpc3RfZXhuJDEiLCJvZl9hbGlzdF9tdWx0aSQxIiwib2ZfYWxpc3RfZm9sZCQxIiwib2ZfYWxpc3RfcmVkdWNlJDEiLCJvZl9pdGVyaSQxIiwidHJlZV9sZW5ndGgiLCJvZl9pdGVyaV9leG4kMSIsIm9mX2luY3JlYXNpbmdfc2VxdWVuY2UkMSIsIm9mX3NlcXVlbmNlX29yX2Vycm9yJDEiLCJvZl9zZXF1ZW5jZV9leG4kMSIsIm9mX3NlcXVlbmNlX211bHRpJDEiLCJvZl9zZXF1ZW5jZV9mb2xkJDEiLCJvZl9zZXF1ZW5jZV9yZWR1Y2UkMSIsIm1hcF9rZXlzJDEiLCJtYXBfa2V5c19leG4kMSIsIm9mX3RyZWUkMyIsIm9mX2FsaXN0JDIiLCJvZl9hbGlzdF9vcl9lcnJvciQyIiwib2ZfYWxpc3RfZXhuJDIiLCJvZl9hbGlzdF9tdWx0aSQyIiwib2ZfYWxpc3RfZm9sZCQyIiwib2ZfYWxpc3RfcmVkdWNlJDIiLCJvZl9pdGVyaSQyIiwib2ZfaXRlcmlfZXhuJDIiLCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlJDIiLCJvZl9zZXF1ZW5jZV9vcl9lcnJvciQyIiwib2Zfc2VxdWVuY2VfZXhuJDIiLCJvZl9zZXF1ZW5jZV9tdWx0aSQyIiwib2Zfc2VxdWVuY2VfZm9sZCQyIiwib2Zfc2VxdWVuY2VfcmVkdWNlJDIiLCJtYXBfa2V5cyQyIiwibWFwX2tleXNfZXhuJDIiLCJLIiwidl9ncmFtbWFyIiwiY29tcGFyZV92IiwiZXF1YWxfdiIsImhhc2hfZm9sZF92Iiwib2ZfdHJlZSQ0IiwiZW1wdHkkMyIsIm9mX2FsaXN0JDMiLCJvZl9hbGlzdF9vcl9lcnJvciQzIiwib2ZfYWxpc3RfZXhuJDMiLCJvZl9hbGlzdF9tdWx0aSQzIiwib2ZfYWxpc3RfZm9sZCQzIiwib2ZfYWxpc3RfcmVkdWNlJDMiLCJvZl9pdGVyaSQzIiwib2ZfaXRlcmlfZXhuJDMiLCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlJDMiLCJvZl9zZXF1ZW5jZV9vcl9lcnJvciQzIiwib2Zfc2VxdWVuY2VfZXhuJDMiLCJvZl9zZXF1ZW5jZV9tdWx0aSQzIiwib2Zfc2VxdWVuY2VfZm9sZCQzIiwib2Zfc2VxdWVuY2VfcmVkdWNlJDMiLCJtYXBfa2V5cyQzIiwibWFwX2tleXNfZXhuJDMiLCJ0cmFuc2ZlciIsInEiLCJxJDAiLCJmbG9hdF9vZl9iaXRzIiwiYml0c19vZl9mbG9hdCIsImJzd2FwMTYiLCJic3dhcDMyIiwiYnN3YXA0OCIsInRvX25hdGl2ZWludF9leG4iLCJ3cmFwX2V4biIsIndyYXBfbW9kdWxvIiwidW53cmFwIiwiY2x6IiwiY3R6IiwiaW52YWxpZF9zdHIiLCJzaWduZWRuZXNzIiwicG9zX3N0ciIsImludDYzIiwiaW50NjMkMCIsIm9uZSQwIiwib2ZfbmF0aXZlaW50X3RydW5jIiwidG9fbmF0aXZlaW50X3RydW5jIiwidG9fc3RyaW5nJDEiLCJyZXByIiwib2ZfaW50X3RydW5jIiwicmVwciQwIiwiaW5jbHVkZSIsIm9mX2Zsb2F0JDAiLCJ0b19mbG9hdCQwIiwib2ZfaW50X2V4biQwIiwidG9faW50X2V4biQwIiwicHAkMCIsImhhc2hhYmxlJDAiLCJpc19wb3NpdGl2ZSQwIiwiaXNfbm9uX25lZ2F0aXZlJDAiLCJpc19uZWdhdGl2ZSQwIiwiaXNfbm9uX3Bvc2l0aXZlJDAiLCJzaWduJDAiLCJpbnZhcmlhbnQkMCIsInRvX3N0cmluZ19odW0kMCIsIm1pbnVzX29uZSQwIiwicmVtJDAiLCJyb3VuZCQwIiwicm91bmRfdG93YXJkc196ZXJvJDAiLCJyb3VuZF9kb3duJDAiLCJyb3VuZF91cCQwIiwicm91bmRfbmVhcmVzdCQwIiwic3VjYyQwIiwicHJlZCQwIiwicG93JDAiLCJiaXRfYW5kJDAiLCJiaXRfb3IkMCIsImJpdF94b3IkMCIsImJpdF9ub3QkMCIsInBvcGNvdW50JDAiLCJzaGlmdF9sZWZ0JDAiLCJzaGlmdF9yaWdodCQwIiwiZGVjciQwIiwiaW5jciQwIiwib2ZfaW50MzJfZXhuJDAiLCJ0b19pbnQzMl9leG4kMCIsIm9mX2ludDY0X2V4biQwIiwidG9faW50NjQkMCIsIm9mX25hdGl2ZWludF9leG4kMCIsInRvX25hdGl2ZWludF9leG4kMCIsIm51bV9iaXRzJDAiLCJtYXhfdmFsdWUkMCIsIm1pbl92YWx1ZSQwIiwic2hpZnRfcmlnaHRfbG9naWNhbCQwIiwiY2VpbF9wb3cyJDAiLCJmbG9vcl9wb3cyJDAiLCJjZWlsX2xvZzIkMCIsImlzX3BvdzIkMCIsImNseiQwIiwiY3R6JDAiLCJvZl9pbnQkMCIsInRvX2ludCQwIiwidG9faW50X3RydW5jJDAiLCJ0b19pbnQzMiQwIiwib2ZfaW50NjQkMCIsIm9mX25hdGl2ZWludCQwIiwidG9fbmF0aXZlaW50JDAiLCJ0b19uYXRpdmVpbnRfdHJ1bmMkMCIsIm9mX2Zsb2F0X3VuY2hlY2tlZCQwIiwicmVwciQxIiwiYnN3YXAzMiQwIiwiYnN3YXA0OCQwIiwicG9zX2RpZmYiLCJuZWdhdGl2ZV9vbmUiLCJkaXZfd291bGRfb3ZlcmZsb3ciLCJwcm9kdWN0IiwiYWJzJDEiLCJuZWckMCIsInJhbmRvbV9vZl9pbnQiLCJyYW5kb21fb2ZfaW50NjQiLCJyYW5kb21fb2ZfaW50JDAiLCJyYW5kb21faW5jbF9vZl9pbnQiLCJyYW5kb21faW5jbF9vZl9pbnQ2NCIsInJhbmRvbV9pbmNsIiwiZmxvb3JfbG9nMiQwIiwiaW52IiwibGVmdF9rZXkiLCJyaWdodF9rZXkiLCJ1cGRhdGVfaGVpZ2h0Iiwib2xkX2hlaWdodCIsIm5ld19oZWlnaHQiLCJiYWxhbmNlIiwicm9vdF9ub2RlIiwibGVmdF9ub2RlIiwicmlnaHRfbm9kZSIsImxlZnRfbm9kZV9sZWZ0IiwibGVmdF9ub2RlX3JpZ2h0IiwibHJfbGVmdCIsImxyX3JpZ2h0IiwicmlnaHRfbm9kZV9sZWZ0IiwicmlnaHRfbm9kZV9yaWdodCIsInJsX2xlZnQiLCJybF9yaWdodCIsInNldF9sZWZ0Iiwibm9kZSIsInRyZWUkMCIsInNldF9yaWdodCIsImFkZGVkIiwiZmluZGlfYW5kX2NhbGxfaW1wbCIsImFyZzEiLCJhcmcyIiwiY2FsbF9pZl9mb3VuZCIsImNhbGxfaWZfbm90X2ZvdW5kIiwiZmluZF9hbmRfY2FsbCIsImNhbGxfaWZfZm91bmQkMCIsImNhbGxfaWZfbm90X2ZvdW5kJDAiLCJmaW5kaV9hbmRfY2FsbCIsImNhbGxfaWZfZm91bmQkMSIsImNhbGxfaWZfbm90X2ZvdW5kJDEiLCJmaW5kX2FuZF9jYWxsMSIsImNhbGxfaWZfZm91bmQkMiIsImNhbGxfaWZfbm90X2ZvdW5kJDIiLCJmaW5kaV9hbmRfY2FsbDEiLCJjYWxsX2lmX2ZvdW5kJDMiLCJjYWxsX2lmX25vdF9mb3VuZCQzIiwiZmluZF9hbmRfY2FsbDIiLCJjYWxsX2lmX2ZvdW5kJDQiLCJjYWxsX2lmX25vdF9mb3VuZCQ0IiwiZmluZGlfYW5kX2NhbGwyIiwiaWZfZm91bmQkMCIsImlmX25vdF9mb3VuZCQwIiwicmVtb3ZlZCIsImtleSQ0IiwiZGF0YSQ0IiwicmtleSIsInJkYXRhIiwia2V5JDEiLCJya2V5JDAiLCJyZGF0YSQwIiwibGtleSQwIiwibGRhdGEkMCIsImtleSQzIiwiZGF0YSQzIiwicmtleSQxIiwicmRhdGEkMSIsImxrZXkiLCJsZGF0YSIsImtleSQyIiwiZGF0YSQyIiwibWFwaV9pbnBsYWNlIiwiZW5zdXJlX211dGF0aW9uX2FsbG93ZWQiLCJ3aXRob3V0X211dGF0aW5nIiwibWF4X3RhYmxlX2xlbmd0aCIsImdyb3d0aF9hbGxvd2VkIiwic2l6ZSQwIiwic2l6ZSQxIiwic2xvdCIsImFkZF93b3JrZXIiLCJuZXdfcm9vdCIsIm1heWJlX3Jlc2l6ZV90YWJsZSIsInNob3VsZF9ncm93IiwibmV3X2FycmF5X2xlbmd0aCIsIm5ld190YWJsZSIsIm9sZF90YWJsZSIsInNleHBfb2Zfa2V5JDAiLCJhZGRlZF9vcl9yZW1vdmVkIiwiYnVja2V0IiwiY2hvb3NlX25vbmVtcHR5IiwidGFibGUiLCJhdmx0cmVlIiwiaW52YXJpYW50X2tleSIsImludmFyaWFudF9kYXRhIiwicmVhbF9sZW4iLCJuZXdfdCIsInQwIiwibmV3X2RhdGEkMCIsImZpbmRfb3JfYWRkIiwiaWQiLCJmaW5kaV9vcl9hZGQiLCJmaW5kX2FuZF9yZW1vdmUiLCJ1cGRhdGVfYW5kX3JldHVybiIsImluY3JfYnkiLCJyZW1vdmVfaWZfemVybyIsImJ5IiwiY3JlYXRlX21hcHBlZCIsImdldF9rZXkiLCJnZXRfZGF0YSIsImR1cGVzIiwib2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzIiwic2V4cF9vZl9kYXRhIiwiZF9vZl9zZXhwIiwia19ncmFtbWFyIiwicm93Iiwib2xkIiwiY3JlYXRlX3dpdGhfa2V5IiwiY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yIiwiY3JlYXRlX3dpdGhfa2V5X2V4biIsIm1heWJlX3NldCIsInRfbGVmdCIsInRfcmlnaHQiLCJtZXJnZV9pbnRvIiwiZHN0X2RhdGEiLCJhY3Rpb24iLCJkc3RfZGF0YSQwIiwidG9fcmVtb3ZlIiwiZmlsdGVyX2tleXNfaW5wbGFjZSIsImZpbHRlcl9tYXBpX2lucGxhY2UiLCJtYXBfcmVzdWx0cyIsImZpbHRlcl9tYXBfaW5wbGFjZSIsInNpbWlsYXIiLCJvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMkMCIsImNyZWF0ZV9tYXBwZWQkMCIsImNyZWF0ZV93aXRoX2tleSQwIiwiY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yJDAiLCJjcmVhdGVfd2l0aF9rZXlfZXhuJDAiLCJvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMkMSIsImNyZWF0ZV9tYXBwZWQkMSIsImNyZWF0ZV93aXRoX2tleSQxIiwiY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yJDEiLCJjcmVhdGVfd2l0aF9rZXlfZXhuJDEiLCJncm91cCQxIiwiaGFzaGFibGVfcyIsInBvbHlfaGFzaGFibGUiLCJzdHJpY3RfYWRkIiwic3RyaWN0X2FkZF9leG4iLCJzdHJpY3RfcmVtb3ZlIiwic3RyaWN0X3JlbW92ZV9leG4iLCJzZXhwX29mX2UiLCJsYXJnZXIiLCJzbWFsbGVyIiwib2ZfaGFzaHRibF9rZXlzIiwiaGFzaHRibCIsInRvX2hhc2h0YmwiLCJlX29mX3NleHAiLCJtaW5fcG9zaXRpdmVfc3Vibm9ybWFsX3ZhbHVlIiwibWluX3Bvc2l0aXZlX25vcm1hbF92YWx1ZSIsInBpIiwic3FydF9waSIsInNxcnRfMnBpIiwiZXVsZXIiLCJvZl9pbnQ2MyIsImlyb3VuZF9sYm91bmQiLCJpcm91bmRfdWJvdW5kIiwiaXJvdW5kX3VwIiwiaXJvdW5kX3VwX2V4biIsImlyb3VuZF9kb3duIiwiaXJvdW5kX2Rvd25fZXhuIiwiaXJvdW5kX3Rvd2FyZHNfemVybyIsImlyb3VuZF90b3dhcmRzX3plcm9fZXhuIiwicm91bmRfbmVhcmVzdF9sYiIsInJvdW5kX25lYXJlc3RfdWIiLCJvbmVfdWxwX2xlc3NfdGhhbl9oYWxmIiwiYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QiLCJpcm91bmRfbmVhcmVzdF8zMiIsImlyb3VuZF9uZWFyZXN0XzY0IiwiaXJvdW5kX25lYXJlc3RfNjQkMCIsImlyb3VuZF9uZWFyZXN0X2V4bl8zMiIsImlyb3VuZF9uZWFyZXN0X2V4bl82NCIsImlyb3VuZF9uZWFyZXN0X2V4biIsImlyb3VuZF9leG4iLCJpcm91bmQiLCJpc19pbmYiLCJpc19maW5pdGUiLCJtaW5faW5hbiIsIm1heF9pbmFuIiwic2NhbGUiLCJzcXVhcmUiLCJmcmFjdGlvbmFsIiwiaW50ZWdyYWwiLCJyb3VuZF9uZWFyZXN0X2lubGluZSIsInJvdW5kX25lYXJlc3RfaGFsZl90b19ldmVuIiwiY2VpbF9vcl9zdWNjIiwiZGlmZl9mbG9vciIsImRpZmZfY2VpbCIsImludDYzX3JvdW5kX2xib3VuZCIsImludDYzX3JvdW5kX3Vib3VuZCIsImludDYzX3JvdW5kX3VwX2V4biIsImludDYzX3JvdW5kX2Rvd25fZXhuIiwiaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hIiwiaW50NjNfcm91bmRfbmVhcmVzdF9hcmNoNjRfbm9hIiwiaW50NjNfcm91bmRfbmVhcmVzdF9leG4iLCJjbGFzc2lmeSIsInN0cmlwX3plcm8iLCJkZWNpbWFscyIsImV4cGxpY2l0X3BsdXMiLCJ0b19wYWRkZWRfY29tcGFjdF9zdHJpbmdfY3VzdG8iLCJraWxvIiwibWVnYSIsImdpZ2EiLCJ0ZXJhIiwicGV0YSIsIm1hZyIsIm51bWVyYXRvciIsImRlbm9taW5hdG9yIiwiaGlnaGVyIiwiZGlmZl9yaWdodCIsImRpZmZfbGVmdCIsInBldGEkMCIsInRvX3BhZGRlZF9jb21wYWN0X3N0cmluZyIsInJvdW5kX2dlbiIsInNkIiwiZGQiLCJkZCQwIiwic2QkMCIsImRkJDEiLCJzZCQxIiwiYWJzX2RkIiwicm91bmRfc2lnbmlmaWNhbnQiLCJzaWduaWZpY2FudF9kaWdpdHMiLCJyb3VuZF9kZWNpbWFsIiwiZGVjaW1hbF9kaWdpdHMiLCJzaWduX2V4biIsInNpZ25fb3JfbmFuIiwiaWVlZV9uZWdhdGl2ZSIsImV4cG9uZW50X21hc2s2NCIsImV4cG9uZW50X21hc2siLCJtYW50aXNzYV9tYXNrIiwibWFudGlzc2FfbWFzazY0IiwibWFudGlzc2FfYml0cyIsImllZWVfZXhwb25lbnQiLCJpZWVlX21hbnRpc3NhIiwiY3JlYXRlX2llZWVfZXhuIiwibmVnYXRpdmUiLCJtYW50aXNzYSIsInNpZ25fYml0cyIsImV4cHRfYml0cyIsIm1hbnRfYml0cyIsImNyZWF0ZV9pZWVlIiwic3BlY2lhbGl6ZWRfaGFzaCIsImFkZF9zdWJzdHJpbmciLCJhZGRfc3ViYnl0ZXMiLCJlbGlkZWRfbWVzc2FnZSIsImVsaWRlIiwiYXRfbW9zdF9udW1fZnJhbWVzIiwidG9fc3RyaW5nX2xpc3QiLCJzZXRfcmVjb3JkaW5nIiwiYW1fcmVjb3JkaW5nIiwibW9zdF9yZWNlbnQiLCJtb3N0X3JlY2VudF9mb3JfZXhuIiwid2l0aF9yZWNvcmRpbmciLCJzYXZlZCIsIm9jYW1scnVucGFyYW1fbWVudGlvbnNfYmFja3RyYSIsImFycmF5X29mX3NleHAiLCJzZXhwX29mX2FycmF5IiwiYXJyYXlfc2V4cF9ncmFtbWFyIiwiYm9vbF9vZl9zZXhwIiwic2V4cF9vZl9ib29sIiwiYm9vbF9zZXhwX2dyYW1tYXIiLCJjaGFyX29mX3NleHAiLCJzZXhwX29mX2NoYXIiLCJjaGFyX3NleHBfZ3JhbW1hciIsInNleHBfb2ZfZXhuIiwiZnVuYyQxIiwiZmxvYXRfb2Zfc2V4cCIsInNleHBfb2ZfZmxvYXQiLCJmbG9hdF9zZXhwX2dyYW1tYXIiLCJmdW5jJDIiLCJpbnRfb2Zfc2V4cCIsInNleHBfb2ZfaW50IiwiaW50X3NleHBfZ3JhbW1hciIsImZ1bmMkMyIsImludDMyX29mX3NleHAiLCJzZXhwX29mX2ludDMyIiwiaW50MzJfc2V4cF9ncmFtbWFyIiwiZnVuYyQ0IiwiaW50NjRfb2Zfc2V4cCIsInNleHBfb2ZfaW50NjQiLCJpbnQ2NF9zZXhwX2dyYW1tYXIiLCJsaXN0X29mX3NleHAiLCJzZXhwX29mX2xpc3QiLCJsaXN0X3NleHBfZ3JhbW1hciIsImZ1bmMkNSIsIm5hdGl2ZWludF9vZl9zZXhwIiwic2V4cF9vZl9uYXRpdmVpbnQiLCJuYXRpdmVpbnRfc2V4cF9ncmFtbWFyIiwib3B0aW9uX29mX3NleHAiLCJzZXhwX29mX29wdGlvbiIsIm9wdGlvbl9zZXhwX2dyYW1tYXIiLCJyZWZfb2Zfc2V4cCIsInNleHBfb2ZfcmVmIiwicmVmX3NleHBfZ3JhbW1hciIsInN0cmluZ19vZl9zZXhwIiwic2V4cF9vZl9zdHJpbmciLCJzdHJpbmdfc2V4cF9ncmFtbWFyIiwiY29tcGFyZV9ieXRlcyIsImVxdWFsX2J5dGVzIiwiYnl0ZXNfb2Zfc2V4cCIsInNleHBfb2ZfYnl0ZXMiLCJieXRlc19zZXhwX2dyYW1tYXIiLCJmdW5jJDYiLCJ1bml0X29mX3NleHAiLCJzZXhwX29mX3VuaXQiLCJ1bml0X3NleHBfZ3JhbW1hciIsImZhaWx3aXRoIiwiaW52YWxpZF9hcmciLCJjb21wYXJlX2FycmF5JDAiLCJlcXVhbF9hcnJheSQwIiwiYXJyYXlfb2Zfc2V4cCQwIiwic2V4cF9vZl9hcnJheSQwIiwiYXJyYXlfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2Jvb2wkMCIsImVxdWFsX2Jvb2wkMCIsImhhc2hfZm9sZF9ib29sJDAiLCJoYXNoX2Jvb2wkMCIsImJvb2xfb2Zfc2V4cCQwIiwic2V4cF9vZl9ib29sJDAiLCJib29sX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9jaGFyJDAiLCJlcXVhbF9jaGFyJDAiLCJoYXNoX2ZvbGRfY2hhciQwIiwiaGFzaF9jaGFyJDAiLCJjaGFyX29mX3NleHAkMCIsInNleHBfb2ZfY2hhciQwIiwiY2hhcl9zZXhwX2dyYW1tYXIkMCIsInNleHBfb2ZfZXhuJDAiLCJjb21wYXJlX2Zsb2F0JDAiLCJlcXVhbF9mbG9hdCQwIiwiaGFzaF9mb2xkX2Zsb2F0JDAiLCJoYXNoX2Zsb2F0JDAiLCJmbG9hdF9vZl9zZXhwJDAiLCJzZXhwX29mX2Zsb2F0JDAiLCJmbG9hdF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfaW50JDAiLCJlcXVhbF9pbnQkMCIsImhhc2hfZm9sZF9pbnQkMCIsImhhc2hfaW50JDAiLCJpbnRfb2Zfc2V4cCQwIiwic2V4cF9vZl9pbnQkMCIsImludF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfaW50MzIkMCIsImVxdWFsX2ludDMyJDAiLCJoYXNoX2ZvbGRfaW50MzIkMCIsImhhc2hfaW50MzIkMCIsImludDMyX29mX3NleHAkMCIsInNleHBfb2ZfaW50MzIkMCIsImludDMyX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9pbnQ2NCQwIiwiZXF1YWxfaW50NjQkMCIsImhhc2hfZm9sZF9pbnQ2NCQwIiwiaGFzaF9pbnQ2NCQwIiwiaW50NjRfb2Zfc2V4cCQwIiwic2V4cF9vZl9pbnQ2NCQwIiwiaW50NjRfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2xpc3QkMCIsImVxdWFsX2xpc3QkMCIsImhhc2hfZm9sZF9saXN0JDAiLCJsaXN0X29mX3NleHAkMCIsInNleHBfb2ZfbGlzdCQwIiwibGlzdF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfbmF0aXZlaW50JDAiLCJlcXVhbF9uYXRpdmVpbnQkMCIsImhhc2hfZm9sZF9uYXRpdmVpbnQkMCIsImhhc2hfbmF0aXZlaW50JDAiLCJuYXRpdmVpbnRfb2Zfc2V4cCQwIiwic2V4cF9vZl9uYXRpdmVpbnQkMCIsIm5hdGl2ZWludF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfb3B0aW9uJDAiLCJlcXVhbF9vcHRpb24kMCIsImhhc2hfZm9sZF9vcHRpb24kMCIsIm9wdGlvbl9vZl9zZXhwJDAiLCJzZXhwX29mX29wdGlvbiQwIiwib3B0aW9uX3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9yZWYkMCIsImVxdWFsX3JlZiQwIiwicmVmX29mX3NleHAkMCIsInNleHBfb2ZfcmVmJDAiLCJyZWZfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX3N0cmluZyQwIiwiZXF1YWxfc3RyaW5nJDAiLCJoYXNoX2ZvbGRfc3RyaW5nJDAiLCJoYXNoX3N0cmluZyQwIiwic3RyaW5nX29mX3NleHAkMCIsInNleHBfb2Zfc3RyaW5nJDAiLCJzdHJpbmdfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2J5dGVzJDAiLCJlcXVhbF9ieXRlcyQwIiwiYnl0ZXNfb2Zfc2V4cCQwIiwic2V4cF9vZl9ieXRlcyQwIiwiYnl0ZXNfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX3VuaXQkMCIsImVxdWFsX3VuaXQkMCIsImhhc2hfZm9sZF91bml0JDAiLCJoYXNoX3VuaXQkMCIsInVuaXRfb2Zfc2V4cCQwIiwic2V4cF9vZl91bml0JDAiLCJ1bml0X3NleHBfZ3JhbW1hciQwIiwicmFpc2VfcyQwIiwicGh5c19lcXVhbCQwIiwidF9zZXhwX2dyYW1tYXIiLCJuYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoIiwidCIsImVuYWJsZV9ldmVyeXRoaW5nIiwiYW1fcnVubmluZ19pbmxpbmVfdGVzdF9lbnZfdmFyIiwidG9fc3RyaW5nIiwiY29tYmluZSIsInQxIiwidDIiLCJjb21iaW5lX2FsbCIsInRzIiwidGVzdF9tb2R1bGVzX3JhbiIsInRlc3RfbW9kdWxlc19mYWlsZWQiLCJ0ZXN0c19yYW4iLCJ0ZXN0c19mYWlsZWQiLCJkeW5hbWljX2xpYiIsImFjdGlvbiIsImZvcmNlX2Ryb3AiLCJnZXQiLCJjdXJyZW50IiwiZm91bmRfdGVzdCIsImlzX2N1cnJlbnQiLCJwIiwiY3VycmVudCQwIiwiY3VycmVudF90YWdzIiwidCIsIm0iLCJ2ZXJib3NlIiwic3RyaWN0Iiwic2hvd19jb3VudHMiLCJsaXN0X3Rlc3RfbmFtZXMiLCJkZWxheWVkX2Vycm9ycyIsInN0b3Bfb25fZXJyb3IiLCJsb2ciLCJ0aW1lX3NlYyIsInVzZV9jb2xvciIsImluX3BsYWNlIiwiZGlmZl9jb21tYW5kIiwic291cmNlX3RyZWVfcm9vdCIsImFsbG93X291dHB1dF9wYXR0ZXJucyIsImRpc3BsYXllZF9kZXNjciIsImRlc2NyIiwiZmlsZW5hbWUiLCJsaW5lIiwic3RhcnRfcG9zIiwiZW5kX3BvcyIsIm5hbWUiLCJyZXN0IiwibGliIiwidGVzdHMiLCJsaXN0X3BhcnRpdGlvbnMiLCJwYXJ0aXRpb24iLCJ0YWdfcHJlZGljYXRlIiwibmFtZV9maWx0ZXIiLCJtc2ckMSIsImYiLCJhbm9uIiwicyIsInN0ciIsImZpbGUiLCJpbmRleCIsImluZGV4JDAiLCJpIiwiZmlsZW5hbWUkMCIsImluZGV4X3N0cmluZyIsImluZGV4JDEiLCJ0YWciLCJsIiwiYXJndiIsIm1zZyIsIm1zZyQwIiwidiIsImFtX3Rlc3RfcnVubmVyIiwiYW1fcnVubmluZ19pbmxpbmVfdGVzdCIsInRlc3RpbmciLCJ3YWxsX3RpbWVfY2xvY2tfbnMiLCJ3aGVyZV90b19jdXRfYmFja3RyYWNlIiwidGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fIiwiYmVmb3JlX25zIiwicmVzIiwiZXhuJDAiLCJleG4iLCJzYXZlZF9jYW1sX3JhbmRvbV9zdGF0ZSIsInNhdmVkX2Jhc2VfcmFuZG9tX3N0YXRlIiwic3RyaW5nX29mX21vZHVsZV9kZXNjciIsInByaW50X2RlbGF5ZWRfZXJyb3JzIiwiZGVsYXllZF9lcnJvcnMkMCIsIm1lc3NhZ2UiLCJlcHJpbnRmX29yX2RlbGF5IiwiZm10IiwiYWRkX2hvb2tzIiwiQyIsImh1bV9iYWNrdHJhY2UiLCJiYWNrdHJhY2UiLCJ0ZXN0X2lubmVyIiwiY29uZmlnIiwidGFncyIsImRlZl9maWxlbmFtZSIsImRlZl9saW5lX251bWJlciIsImJvb2xfb2ZfZiIsIndoYXRfdG9fZG8iLCJ3aGljaF90YWdzIiwib25seV90ZXN0X2xvY2F0aW9uIiwibGlibmFtZSIsImYkMCIsImRlc2NyJDAiLCJjb21wbGV0ZV90YWdzIiwidXNlZCIsImxpbmVfbnVtYmVyX29wdCIsInBvc2l0aW9uX3N0YXJ0IiwiZW5kX29mX2RlZl9maWxlbmFtZSIsImxpbmVfbnVtYmVyIiwiZm91bmQiLCJyZXEiLCJkcm9wcGVkIiwiZGVzY3IkMSIsInN1YnN0cmluZyIsInNob3VsZF9ydW4iLCJkZXNjciQyIiwiY2giLCJyZXN1bHQkMCIsImNhbWxfcmFuZG9tX3N0YXRlIiwiYmFzZV9yYW5kb21fc3RhdGUiLCJyZXN1bHQiLCJiYWNrdHJhY2UkMCIsImV4bl9zdHIiLCJzZXAiLCJzZXRfbGliX2FuZF9wYXJ0aXRpb24iLCJzdGF0aWNfbGliIiwid2hpY2hfdGVzdHMiLCJyZXF1aXJlc19wYXJ0aXRpb24iLCJ1bnNldF9saWIiLCJ0ZXN0IiwiYiIsInRlc3RfdW5pdCIsInRlc3RfbW9kdWxlIiwicGFydGlhbF90YWdzIiwicHJldiIsIngiLCJlJDAiLCJlIiwic3VtbWFyaXplIiwiayIsImFjYyIsImNvdW50IiwiY291bnRfdGVzdF9tb2R1bGVzIiwidW51c2VkX3Rlc3RzIiwiZXJyb3JzIiwidXNlX2NvbG9yJDAiLCJpbl9wbGFjZSQwIiwiZGlmZl9jb21tYW5kJDAiLCJzb3VyY2VfdHJlZV9yb290JDAiLCJhbGxvd19vdXRwdXRfcGF0dGVybnMkMCIsImV2YWx1YXRvcnMiLCJhZGRfZXZhbHVhdG9yIiwiZXhpdCIsImFic3VyZCIsInN0ciIsIm1ha2UiLCJpbml0IiwiY29uY2F0IiwiY29tcGFyZSIsInN1YiIsInNwbGl0X29uX2NoYXIiLCJvbmUiLCJjIiwiaXNfcHJlZml4IiwiYSIsImIiLCJsZW5fYSIsImlzX3N1ZmZpeCIsImxlbl9iIiwiZmluZCIsImYiLCJzdGFydCIsInMiLCJsZW4iLCJpIiwiaSQwIiwiaGFzIiwiZmluZF9id2QiLCJiZXlvbmQiLCJiZXlvbmQkMCIsImxpc3QiLCJjcyIsImoiLCJjcyQwIiwib2ZfbGlzdCIsImJzIiwicmV2ZXJzZSIsImhhc19tb3JlIiwicGVlayIsImFkdmFuY2UiLCJtYWtlJDAiLCJtYWtlX3dpdGhfc2l6ZSIsImVzdGltYXRlIiwiciIsImVzdGltYXRlJDAiLCJidWZmZXIiLCJjYXBhY2l0eSIsInIkMCIsImJuZXciLCJyJDEiLCJyZXR1cm4kMCIsImZhaWwiLCJlIiwidG9fb3B0aW9uIiwic3ltYm9sX2JpbmQiLCJtIiwibWFwIiwibWFwX2Vycm9yIiwiZ2V0IiwiYWRkIiwieCIsInkiLCJkaXZpZGUiLCJpdGVyYXRlIiwibiIsIm4kMCIsInYiLCJ2JDAiLCJuJDEiLCJsZXQkMCIsInRvX2xpc3QiLCJhcHBlbmQiLCJjb3B5IiwiYmxpdCIsImZvbGRfbGVmdCIsImZvbGRfcmlnaHQiLCJmb3JfYWxsIiwiZXhpc3RzIiwiaXNfZW1wdHkiLCJ4cyIsInZhbGlkX2luZGV4IiwiaGFzX3NvbWUiLCJmaXJzdCIsImxhc3QiLCJmb2xkaV9sZWZ0IiwiaWR4IiwicHVzaCIsInhzX25ldyIsInB1c2hfZnJvbnQiLCJpbnNlcnQiLCJhcnIiLCJyZXBsYWNlIiwicmVtb3ZlIiwicmVtb3ZlX2ZpcnN0IiwicmVtb3ZlX2xhc3QiLCJwIiwiYmluc2VhcmNoIiwia2V5X29mIiwia2V5IiwiY21wIiwidXBwZXIkMCIsImNtcCQxIiwibG93ZXIkMSIsImNtcCQyIiwibG93ZXIiLCJ1cHBlciIsImxvd2VyJDAiLCJjbXAkMCIsImNhcmRpbmFsIiwiYmluZGluZ3MiLCJ2YWx1ZSIsInJlc3VsdCIsImluZGV4X29mIiwiZXhhY3QiLCJwYWlyIiwiZmluZF9vcHQiLCJtZW0iLCJlbXB0eSIsInNpbmdsZXRvbiIsInVwZGF0ZSIsInZhbHVlJDAiLCJyZW1vdmUkMCIsInNldCIsInJlcyIsImVsZW1lbnRzIiwibHN0IiwiZWxlbWVudCIsImluc2VydF9kb3dud2FyZCIsInNldCQwIiwic2V0JDEiLCJpbnNlcnRfdXB3YXJkIiwiYml0c2l6ZSIsImJyYW5jaGluZyIsInNsb3QiLCJsIiwib2Zmc2V0IiwiZnVsbF9zaXplIiwibGV2ZWwiLCJwYXJhbSIsImlzX2Z1bGwiLCJsZW5ndGgiLCJ0IiwiY2hlY2tfaW52YXJpYW50IiwiY2hlY2siLCJpc19yb290Iiwibm9kZSIsImlzX3Jvb3QkMCIsIm5jaGlsZHJlbiIsImNoaWxkIiwic2l6ZSIsImZvbGQiLCJ0JDAiLCJvIiwidCQxIiwic2luZ2xldG9uX3RyZWUiLCJsZXYiLCJwdXNoX25vdF9mdWxsIiwibm9kZXMiLCJwb3BfYXV4Iiwibm9kZXMkMCIsImNoaWxkJDAiLCJlJDAiLCJub2RlcyQxIiwicG9wIiwicG9wX29wdCIsImZpbGwiLCJzdGFydCQwIiwic3RhcnQkMSIsIm9rIiwidGwiLCJoZCIsInN5bWJvbCIsImciLCJzeW1ib2wkMCIsImZsc3QiLCJzcGxpdF9oZWFkX3RhaWwiLCJtYXBfYW5kX2ZpbHRlciIsInNwbGl0X2F0IiwicmVzdCIsInByZWZpeCIsInJlc3QkMCIsInJlc3QkMSIsInByZWZpeCQwIiwidHJhbnNwb3NlIiwicm93X2xpc3QiLCJjb2x1bW5zIiwicm93X2xpc3QkMCIsInJvdyIsImNvbHVtbiIsInJlc3Rfcm93IiwiZWwiLCJyb3dfbGlzdCQxIiwiY29sdW1ucyQwIiwiZm9sZGkiLCJmaWZvIiwicG9wX2Zyb250IiwiZnJvbnQiLCJmcm9udCQwIiwiaGQkMCIsImVtcHR5JDAiLCJwdXNoX2Zyb250JDAiLCJsZiIsInB1c2hfcmVhciIsInBvcF9mcm9udCQwIiwibGYkMCIsInVwZGF0ZV9maXJzdCIsInVwZGF0ZV9sYXN0IiwiZmlmbyQwIiwib3JkZXIiLCJvZGRfb3JkZXIiLCJtYXhfa2V5cyIsIm1pbl9rZXlzIiwia2V5cyIsImNoaWxkcmVuIiwia2V5cyQwIiwiYWNjdSIsImFjY3UkMCIsIm1hcCQwIiwicGFpcnMiLCJwYWlycyQwIiwiYWNjdSQxIiwibWFwJDEiLCJhY2N1JDIiLCJic2VhcmNoIiwiZXhhY3QkMCIsInN1YmFycmF5IiwiaW5zZXJ0X3N1YmFycmF5IiwiYXJyMiIsInNwbGl0X3N1YmFycmF5IiwiYXJyJDAiLCJhZGRfaW5fbGVhZiIsImluc2VydF9zdWJhcnJheSQwIiwiayIsImxlZnQiLCJyaWdodCIsImxlZnQkMCIsInJpZ2h0JDAiLCJsZWZ0JDEiLCJyaWdodCQxIiwibGVmdCQyIiwicmlnaHQkMiIsImxlZnQkMyIsInJpZ2h0JDMiLCJhZGRfaW5fbm9kZSIsImNoaWxkcmVuJDAiLCJzcGxpdF9zdWJhcnJheSQwIiwibGVmdF9wYWlycyIsImxlZnRfY2hpbGRyZW4iLCJyaWdodF9wYWlycyIsInJpZ2h0X2NoaWxkcmVuIiwibGVmdF9wYWlycyQwIiwibGVmdF9jaGlsZHJlbiQwIiwicmlnaHRfcGFpcnMkMCIsInJpZ2h0X2NoaWxkcmVuJDAiLCJsZWZ0X3BhaXJzJDEiLCJsZWZ0X2NoaWxkcmVuJDEiLCJyaWdodF9wYWlycyQxIiwicmlnaHRfY2hpbGRyZW4kMSIsImxlZnRfcGFpcnMkMiIsImxlZnRfY2hpbGRyZW4kMiIsInJpZ2h0X3BhaXJzJDIiLCJyaWdodF9jaGlsZHJlbiQyIiwibGVmdF9wYWlycyQzIiwibGVmdF9jaGlsZHJlbiQzIiwicmlnaHRfcGFpcnMkMyIsInJpZ2h0X2NoaWxkcmVuJDMiLCJhZGRfYXV4IiwicGFpcnMkMSIsInUiLCJub3RfbWluaW1hbCIsInJlcGxhY2UyIiwicm90YXRlX2tleXMiLCJ0b19sZWZ0IiwicGFyZW50Iiwicm90YXRlX2NoaWxkcmVuIiwibWVyZ2Vfa2V5cyIsImxlbl9sZWZ0IiwibGVuX3JpZ2h0IiwibWVyZ2VkIiwicGFyZW50JDAiLCJtZXJnZV9sZWF2ZXMiLCJwYWlyczEiLCJwYWlyczIiLCJ1bmRlcmZsb3ciLCJtZXJnZV9ub2RlcyIsImNoaWxkcmVuMSIsImNoaWxkcmVuMiIsInBhaXJzX25ldyIsImNoaWxkcmVuX25ldyIsImhhbmRsZV91bmRlcmZsb3ciLCJ1bmRlcmZsb3dfbGVmdCIsImxlZnRfY2hpbGQiLCJyaWdodF9jaGlsZCIsIm5vdF9taW5pbWFsJDAiLCJwYWlyczIkMCIsInBhaXJzMSQwIiwicGFpcnMxJDEiLCJwYWlyczIkMSIsInBhaXJzMiQyIiwicGFpcnMxJDIiLCJjaGlsZHJlbjIkMCIsImNoaWxkcmVuMSQwIiwiY2hpbGRyZW4kMSIsImNoaWxkcmVuMiQxIiwiaGFuZGxlX2RlbGV0ZSIsImQiLCJsZW4kMCIsInJlbW92ZV9hdXgiLCJwYWlyJDAiLCJwYWlycyQyIiwidXBkYXRlX2F1eCIsInZhbHVlJDEiLCJkJDAiLCJzb3VyY2UiLCJkb3duIiwidHJlZSIsInN0YWNrIiwidHJlZSQwIiwic3RhY2skMCIsInN0YWNrJDEiLCJ0cmVlJDEiLCJ1cCIsIm1ha2Vfc291cmNlIiwiZG9fdXB3YXJkIiwiZG9fZG93bndhcmQiLCJhZGRfdXB3YXJkIiwiYWRkX2Rvd253YXJkIiwicmVtb3ZlX3Vwd2FyZCIsInJlbW92ZV9kb3dud2FyZCIsImNoZWNrX3JhbmdlIiwib2skMCIsInNvdXJjZSQwIiwic291cmNlJDEiLCJ1cGRhdGVfdXB3YXJkIiwibnVsbCQwIiwidW5kZWZpbmVkJDAiLCJpbnQkMCIsImkiLCJmbG9hdCQwIiwidiIsImJvb2wiLCJzdHJpbmciLCJvYmplY3QiLCJhcnJheSIsImZ1bmN0aW9uMSIsImYiLCJmdW5jdGlvbjIiLCJmdW5jdGlvbjMiLCJzdHJpbmdpZnkiLCJwYXJzZSIsImlzX2Z1bmN0aW9uIiwicmV0dXJuJDAiLCJhIiwiZmFpbCIsInZhbHVlIiwibGV0JDAiLCJtIiwic3ltYm9sIiwicCIsInEiLCJyIiwibWFwIiwibnVsbCQxIiwib2JqIiwidW5kZWZpbmVkJDEiLCJmbG9hdCQxIiwiaW50JDEiLCJib29sJDAiLCJzdHJpbmckMCIsImZ1bmN0aW9uJDAiLCJhcmdzIiwibWV0aG9kIiwiZmllbGQiLCJuYW1lIiwiZGVjb2RlIiwiYXJyYXkkMCIsImxlbiIsImV4dHJhY3QiLCJsc3QiLCJlIiwib3B0aW9uIiwib2ZfZXhjZXB0aW9uIiwiZXhuIiwicmFpc2VfanNfZXJyb3IiLCJqc19lcnJvciIsInJhaXNlX2pzIiwibWVzc2FnZSIsImpzX21zZyIsImxvZ19zdHJpbmciLCJzdHIiLCJsb2dfdmFsdWUiLCJleHBvcnQkMCIsIm1ha2VfZ2xvYmFsIiwiZ2V0X2dsb2JhbCIsIm5ld19nbG9iYWwiLCJjbmFtZSIsImNvbnN0ciIsImRlY29kZV9jYWxsYmFjayIsImNiIiwiZXJyIiwiY2IkMCIsImRlY29kZV9kYXRhIiwiZGVjIiwiZGF0YSIsInN0YXRlIiwibm9kZV9tb2R1bGUiLCJtc2dfZGVjb2RlIiwibm9kZV9mdW5jdGlvbiIsImpzX2Z1bmN0aW9uIiwiY2FsbGJhY2siLCJjYWxsYmFjayQwIiwiZGF0YSQwIiwibXNnIiwibXNnJDAiLCJicm93c2VyX2FwcGxpY2F0aW9uIiwiYXBwX25hbWUiLCJzdGF0ZV9kZWNvZGUiLCJicm93c2VyX2Z1bmN0aW9uIiwiZWxlbWVudCIsInN0YXRlJDAiLCJlbGVtZW50JDAiLCJzdG9wX3Byb3BhZ2F0aW9uIiwicHJldmVudF9kZWZhdWx0IiwiYWRkIiwiaGFuZGxlciIsInRndCIsInJlbW92ZSIsInNldCIsIm1zIiwiY2xlYXIiLCJ0Iiwic2V0X2ludGVydmFsIiwiY2xlYXJfaW50ZXJ2YWwiLCJzZW5kX21lc3NhZ2UiLCJkb19hc3luYyIsInN0YXJ0IiwidXJsIiwidyIsImV2ZW50IiwicG9zdF9tZXNzYWdlIiwidGVybWluYXRlIiwibWFrZSIsInBvc3QiLCJwb3N0JDAiLCJwb3N0JDEiLCJmJDAiLCJzdGFydCQwIiwid29ya2VyX2RlY29kZSIsIndvcmtlciIsInBvc3RfdG9fY3JlYXRvciIsInBvc3RfdG9fd29ya2VyIiwicG9zdF9tZXNzYWdlJDAiLCJ0ZXJtaW5hdGUkMCIsInNpbXVsYXRlX2pzIiwid2Z1biIsImV2ZW50X3RhcmdldCIsInJlcSIsImhlYWRlcnMiLCJib2R5IiwicmVxdWVzdCIsInJlYWR5X3N0YXRlIiwic3RhdHVzIiwicmVzcG9uc2VfdGV4dF92YWx1ZSIsInJlc3BvbnNlX3RleHRfc3RyaW5nIiwicyIsIm5vZGUiLCJwYXJlbnQiLCJmaXJzdCIsIm5leHQiLCJhcHBlbmQiLCJjaGlsZCIsInJlbW92ZSQwIiwicmVwbGFjZSIsIm5ld19jaGlsZCIsIm9sZF9jaGlsZCIsInJlbW92ZV9jaGlsZHJlbiIsIm5vZGVfdmFsdWUiLCJzZXRfbm9kZV92YWx1ZSIsInNjcm9sbF93aWR0aCIsInNjcm9sbF9oZWlnaHQiLCJjbGllbnRfd2lkdGgiLCJjbGllbnRfaGVpZ2h0Iiwic2Nyb2xsX2xlZnQiLCJzY3JvbGxfdG9wIiwic2V0X3Njcm9sbF9sZWZ0Iiwic2V0X3Njcm9sbF90b3AiLCJzdHlsZSIsInNldF9hdHRyaWJ1dGUiLCJyZW1vdmVfYXR0cmlidXRlIiwic2V0X3Byb3BlcnR5IiwiZGVsZXRlX3Byb3BlcnR5IiwiZm9jdXMiLCJibHVyIiwidGl0bGUiLCJzZXRfdGl0bGUiLCJmaW5kIiwiZG9jIiwiY3JlYXRlX2VsZW1lbnQiLCJ0YWciLCJjcmVhdGVfdGV4dF9ub2RlIiwidGV4dCIsImNyZWF0ZV9lbGVtZW50X25zIiwibmFtZXNwYWNlIiwiY3JlYXRlX2RvY3VtZW50X2ZyYWdtZW50IiwiZ28iLCJoaXN0b3J5IiwicHVzaF9zdGF0ZSIsInJlcGxhY2Vfc3RhdGUiLCJocmVmIiwicHJvdG9jb2wiLCJob3N0IiwicG9ydCIsInBhdGhuYW1lIiwic2VhcmNoIiwiaGFzaCIsImFzc2lnbiIsImxvY2F0aW9uIiwicmVsb2FkIiwiZ2V0IiwiZXZlbnRfdGFyZ2V0JDAiLCJkb2N1bWVudCIsIm9uX25leHRfYW5pbWF0aW9uIiwibm93IiwieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpIiwib2ZfdmFsdWUiLCJkIiwiem9uZV9vZmZzZXQiLCJkYXRlIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyIsImVtcHR5IiwiZmluZF9vcHQiLCJrZXkiLCJkIiwiaSIsInYiLCJrIiwiYWRkIiwidmFsdWUiLCJuIiwic2V0IiwiZiIsImlkeCIsIm9mX2xpc3QiLCJsc3QiLCJ0bCIsImZvbGQiLCJhY2N1IiwiaXRlciIsImRpY3QiLCJkaWZmIiwicmVtb3ZlIiwiZDEiLCJkMiIsInZhbHVlMiIsInV0YyIsIm1ha2UiLCJtaW51dGVzIiwib2Zmc2V0Iiwiem9uZSIsInplcm8iLCJhZGFwdCIsInRpbWUiLCJ5ZWFyIiwibW9udGgiLCJkYXlfb2ZfbW9udGgiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGlfc2Vjb25kIiwic3RyaW5nIiwicGFyc2UiLCJzdHIiLCJzdHJpbmckMCIsImxvYyIsImlzX3BhZ2UiLCJoYW5kbGVyIiwicmVmIiwiZSIsInVwZGF0ZSIsImFjdHVhbCIsImZpcmUiLCJtYXAiLCJhIiwibWFrZV9vbmUiLCJkaXNwYXRjaCIsImV2ZW50IiwiZGVjb2RlIiwicHJldmVudCIsInN0b3AiLCJtIiwibWFrZV9saXN0IiwidGFyZ2V0IiwiZXZlbnRfdHlwZSIsInVwZGF0ZSQwIiwiZW1wdHkkMCIsIm1ha2VfdGltZXIiLCJtaWxsaXMiLCJoIiwicmVtb3ZlX3RpbWVyIiwidGltZXIiLCJzZXQkMCIsInVwZGF0ZSQxIiwiZW1wdHkkMSIsImFkZCQwIiwidGFnIiwiaHJlZiIsInVybCIsIm1ha2UkMCIsInNldCQxIiwidmlydCIsInJlcSIsInVwZGF0ZSQyIiwidmlydDEiLCJ2aXJ0MiIsImYxIiwiYWN0dWFsJDAiLCJhY3R1YWwkMSIsInN0eWxlIiwicHJvcGVydHkiLCJhdHRyaWJ1dGUiLCJhdHRycyIsIm5hbWUiLCJ2YWx1ZSQwIiwibmFtZSQwIiwidmFsdWUkMSIsIm5hbWUkMSIsIm5hbWUkMiIsInRleHQiLCJzIiwibm9kZSIsIm5vZGVfbnMiLCJuYW1lc3BhY2UiLCJrZXllZCIsImVsZW1lbnQiLCJhZGRfYXR0cmlidXRlcyIsIm9wcyIsImVsIiwidmRvbSIsIm1ha2VfY2hpbGRyZW4iLCJyZWFsX2NoaWxkcmVuIiwiY29tYmluZWRfY2hpbGRyZW4iLCJwYXJlbnQiLCJsc3QkMCIsImF0dHJzJDAiLCJ0YWckMCIsInJlYWxfY2hpbGRyZW4kMCIsImNvbWJpbmVkX2NoaWxkcmVuJDAiLCJwYXJlbnQkMCIsImhkIiwiaGQkMCIsImhkMiIsInRsMiIsInRsMSIsInVwZGF0ZV9hdHRyaWJ1dGVzIiwicGFyIiwiYXR0cnMxIiwiYXR0cnMyIiwiZG9tIiwiczIiLCJzMSIsImxzdDIiLCJ0YWcyIiwibHN0MSIsInRhZzEiLCJ1cGRhdGVfY2hpbGRyZW4iLCJjaGlsZHJlbiIsInBhciQwIiwibHN0MiQwIiwiYXR0cnMyJDAiLCJ0YWcyJDAiLCJuczIiLCJsc3QxJDAiLCJhdHRyczEkMCIsInRhZzEkMCIsIm5zMSIsImNoaWxkcmVuJDAiLCJwYXIkMSIsImF0dHJzMiQxIiwidGFnMiQxIiwiYXR0cnMxJDEiLCJ0YWcxJDEiLCJjaGlsZHJlbiQxIiwidXBkYXRlX2tleWVkIiwiZG9tJDAiLCJkb20kMSIsImVsJDAiLCJubHN0MiIsIm5sc3QyJDAiLCJsc3QyJDIiLCJsc3QxJDEiLCJoZDEiLCJoZDEkMCIsImhkMTEiLCJubHN0MiQyIiwibHN0MiQxIiwib2xkX2VsIiwiY3JlYXRlZCIsImhkMiQwIiwibmV3X2VsIiwibmxzdDIkMSIsImF0dGVtcHQiLCJjbGVhbnVwIiwiZXhuJDAiLCJleG4iLCJjb2wiLCJsaW5lIiwiZmlsZSIsIm1zZyIsImpzX2Vycm9yIiwicnVuIiwicmFuZG9tIiwiY29uc3RhbnQiLCJzeW1ib2xfYmluZCIsInN0YXRlIiwiaW50JDAiLCJib3VuZCIsImZsb2F0JDAiLCJib29sIiwiY2hvb3NlIiwiYXJyIiwibGVuIiwiYWJzdXJkIiwiY29udGludWUkMCIsInRhc2siLCJwb3N0Iiwic3VjY2VlZCIsImZhaWwiLCJyZXN1bHQiLCJyIiwibWFrZV9zdWNjZWVkIiwicmVzIiwibG9nX3N0cmluZyIsImxvZ192YWx1ZSIsInNsZWVwIiwibXMiLCJuZXh0X3RpY2siLCJzZW5kX3RvX2phdmFzY3JpcHQiLCJmb2N1cyIsImlkIiwiYmx1ciIsInJhbmQiLCJodHRwX3RleHQiLCJtZXRoIiwiaGVhZGVycyIsImJvZHkiLCJzdGF0dXMiLCJodHRwX2pzb24iLCJub3ciLCJ0aW1lX3pvbmUiLCJub25lIiwiYmF0Y2giLCJvbl93aW5kb3ciLCJldmVyeSIsImNhbGxiYWNrIiwib25fbWVzc2FnZSIsIm9uX3VybF9yZXF1ZXN0Iiwic3ViIiwiZyIsImRlY29kZSQwIiwiZyQwIiwiZGVjb2RlX2tleV9ldmVudCIsImRlY29kZV9tb3VzZV9ldmVudCIsIngiLCJ5Iiwib25fa2V5ZG93biIsIm9uX2tleXVwIiwib25fbW91c2VfZG93biIsIm9uX21vdXNlX21vdmUiLCJvbl9tb3VzZV91cCIsIm9uX3Jlc2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwib25fdmlzaWJpbGl0eV9jaGFuZ2UiLCJzdWJzIiwid2luZG93IiwidGltZXJzIiwidXJsX3JlcXVlc3QiLCJwZXJmb3JtIiwianVzdF9kbyIsImNtZCIsImV4ZWN1dGUiLCJleGUiLCJ0YXNrJDAiLCJkb2N1bWVudCIsImRvbV9vcGVyYXRpb25zIiwiZ2V0X2JvdGgiLCJnZXRfZWxlbWVudCIsImRpY3QxIiwiZGljdDIiLCJyZWFscyIsIm5ld19jaGlsZCIsIm9sZF9jaGlsZCIsImNoaWxkIiwiZG9jIiwiZGF0YSIsInVwZGF0ZV9kYXRhIiwic3RhdGVfZGlmZmVyZW50IiwidXBkYXRlX3N1YnNjcmlwdGlvbnMiLCJkaXNwYXRjaF9uZXh0IiwicG9zdCQwIiwiY21kJDAiLCJzdGF0ZSQwIiwicHV0X2JlbG93X3Jvb3QiLCJyb290X25vZGUiLCJ1cGRhdGVfZG9tIiwidmlldyIsInZpZXckMCIsInZpZXckMSIsInRpdGxlIiwic2V0X3RpdGxlIiwidmRvbSQwIiwib25fbmV4dF9hbmltYXRpb24iLCJhbmltYXRlIiwid3JhcF9zdGF0ZV9mdW4iLCJ3cmFwX3ZpZXciLCJ3cmFwX3N1YnNjcmlwdGlvbiIsIndyYXBfdXBkYXRlIiwibWVzc2FnZSIsInJlY2VpdmVfbWVzc2FnZSIsImRhdGEkMCIsInN0YXJ0X2FwcGxpY2F0aW9uIiwiY29tbWFuZCIsIm1ha2Vfc2FuZGJveCIsInNhbmRib3giLCJzYW5kYm94X3BsdXMiLCJkYXRhcmVmIiwiZWxlbWVudF9pZCIsImluaXQiLCJyb290IiwiYXBwbGljYXRpb24iLCJiYXNpY19hcHBsaWNhdGlvbiIsImRlYnVnIiwiZGVidWdfdmFsdWUiLCJvbiIsIm9uX2NsaWNrIiwiZm9udF9zaXplIiwic2l6ZSIsImNvbG9yIiwiYmFja2dyb3VuZF9jb2xvciIsIm1hcmdpbiIsInBhZGRpbmciLCJib3JkZXJfc3R5bGUiLCJib3JkZXJfd2lkdGgiLCJib3JkZXJfY29sb3IiLCJjbGFzcyQwIiwic3JjIiwicGxhY2Vob2xkZXIiLCJvbl9pbnB1dCIsImgxIiwibm9kZXMiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiZGl2Iiwic3BhbiIsInByZSIsInAiLCJidXR0b24iLCJpbnB1dCIsImxhYmVsIiwidGV4dGFyZWEiLCJzZWxlY3QiLCJvbCIsInVsIiwibGkiLCJzdmdfbm9kZSIsImluaXQiLCJ1cGRhdGUiLCJzdGF0ZSIsIm1zZyIsImZsaWdodCIsInJldHVybiQwIiwiZmxpZ2h0JDAiLCJyZXR1cm4kMSIsImZsaWdodCQxIiwiZmxpZ2h0JDIiLCJyZXR1cm4kMiIsImtpbmQiLCJyZXR1cm4kMyIsImZsaWdodCQzIiwia2luZCQwIiwiY29tcGFyZSIsImQxIiwiZDIiLCJjbXBfeWVhciIsImNtcF9tb250aCIsInN0cmluZ19vZl9kYXRlIiwiZGF0ZSIsInN0cmluZ19vZl9kYXRlX29wdCIsImRhdGVfb2Zfc3RyaW5nIiwic3RyIiwieWVhciIsImRheSIsIm1vbnRoIiwiZGVjb2RlX2RhdGUiLCJpIiwiZGVjb2RlX3NlbGVjdGlvbiIsInZpZXdfZGF0ZV9vcHQiLCJ0eHQiLCJkZWNvZGUiLCJ2aWV3X2Jvb2tpbmciLCJkIiwibGFiIiwiZGVjIiwiZGVjb2RlX2ZsaWdodCIsImRlY29kZV9yZXR1cm4iLCJkYXRlcyIsImJvb2tfYnV0dG9uIiwib25lX3dheSIsInZpZXdfYm9va2VkIiwiZGF0ZV9lbGVtZW50IiwicmVzZXQiLCJsc3QiLCJ2aWV3Il0sInNvdXJjZXMiOlsiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK21sQnl0ZXMuanMiLCIvYnVpbHRpbi8rZmFpbC5qcyIsIi9idWlsdGluLytzdGRsaWIuanMiLCIvYnVpbHRpbi8rc3lzLmpzIiwiL2J1aWx0aW4vK2JhY2t0cmFjZS5qcyIsIi9idWlsdGluLytqc2xpYi5qcyIsIi9idWlsdGluLytmb3JtYXQuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rZWZmZWN0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rZnMuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK25hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytydW50aW1lX2V2ZW50cy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2JpZ2FycmF5LmpzIiwiL2J1aWx0aW4vK2ludHMuanMiLCIvYnVpbHRpbi8raGFzaC5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlX2ludGVybmFsaGFzaF90eXBlcy9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3BhcnNpbmcuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2RvbWFpbi5qcyIsIi9idWlsdGluLytjb21wYXJlLmpzIiwiL2J1aWx0aW4vK2pzbGliX2pzX29mX29jYW1sLmpzIiwiL2J1aWx0aW4vK2JpZ3N0cmluZy5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8rc3RyLmpzIiwiL2J1aWx0aW4vK2xleGluZy5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rd2Vhay5qcyIsIi9idWlsdGluLytwcm5nLmpzIiwiL2J1aWx0aW4vK3pzdGQuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3RpbWVfbm93L3J1bnRpbWUuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc3RkbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N5cy5tbC5pbiIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb2JqLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9hdG9taWMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbExhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3NlcS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb3B0aW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9yZXN1bHQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Jvb2wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VjaGFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2J5dGVzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zdHJpbmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VuaXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL21hcnNoYWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9mbG9hdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaW50MzIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2ludDY0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9uYXRpdmVpbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xleGluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcGFyc2luZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N0YWNrLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zZW1hcGhvcmUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RvbWFpbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9wcmludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FyZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcHJpbnRleGMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Z1bi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZ2MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RpZ2VzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYmlnYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3JhbmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaGFzaHRibC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvd2Vhay5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zY2FuZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FsbGJhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbE9PLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9jYW1saW50ZXJuYWxNb2QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2VwaGVtZXJvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZmlsZW5hbWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NvbXBsZXgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2luX2NoYW5uZWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL291dF9jaGFubmVsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9lZmZlY3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lX18ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc19vZl9vY2FtbF9fLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9pbXBvcnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2pzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3R5cGVkX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maWxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb21faHRtbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvZm9ybS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwveG1sSHR0cFJlcXVlc3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3dvcmtlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViU29ja2V0cy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViR0wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3JlZ2V4cC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvdXJsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9zeXNfanMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3Jlc2l6ZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9wZXJmb3JtYW5jZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9tdXRhdGlvbk9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc3RhYmxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc29uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9jU1MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9ldmVudHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9zdmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2V2ZW50U291cmNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maXJlYnVnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9nZW9sb2NhdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvaW50ZXJzZWN0aW9uT2JzZXJ2ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2ludGwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3BweF9pbmxpbmVfdGVzdC9jb25maWcvaW5saW5lX3Rlc3RfY29uZmlnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2dyYW1tYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9ncmFtbWFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2NvbnYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9lcnJvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wb2x5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbXBvcnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3ByaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zeXMwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2FycmF5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jaGFyMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2NvbXBhcmVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3BweF9oYXNoX2xpYi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3dvcmRfc2l6ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wcmV0dHlfcHJpbnRlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9leG4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvd2l0aF9yZXR1cm4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbW9uYWRfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tb25hZC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hcHBsaWNhdGl2ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlczAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvY29tcGFyYXRvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ZpZWxkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZzAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QxLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXJfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGF6eS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb21fcmVwci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXlfcGVybXV0ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9mbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2luZm8ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZXJyb3IubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW52YXJpYW50Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29yX2Vycm9yLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3NpZ24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NvbXBhcmFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pZGVudGlmaWFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdW5pdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JpbmFyeV9zZWFyY2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYmluYXJ5X3NlYXJjaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iaW5hcnlfc2VhcmNoYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ibGl0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW5kZXhlZF9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2VxdWVuY2UubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvb2JqX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3VuaWZvcm1fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2VudW1lcmF0ZV9saWIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnl0ZXNfdHIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhZ2VkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9oZXhfbGV4ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X2NvbnZlcnNpb25zLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Bvd19vdmVyZmxvd19ib3VuZHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X21hdGgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcG9wY291bnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdWNoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdHlwZV9lcXVhbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcHRpb25fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbl9vcl9uYW4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWF5YmVfYm91bmQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWFwX2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0X2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3JlZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ub3RoaW5nLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL25hdGl2ZWludC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGlua2VkX3F1ZXVlMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saW5rZWRfcXVldWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjNfZW11bC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ib29sLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDMyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDYzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmxfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hdmx0cmVlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaF9zZXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JhY2t0cmFjZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfc2V4cF9jb252L3J1bnRpbWUtbGliL3BweF9zZXhwX2NvbnZfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfZW51bWVyYXRlL3J1bnRpbWUtbGliL3BweF9lbnVtZXJhdGVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi90aW1lX25vdy90aW1lX25vdy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvcHB4X2lubGluZV90ZXN0L3J1bnRpbWUtbGliL3J1bnRpbWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC92b2lkLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2ludC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvcmJfYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvZGVxdWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9idHJlZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvYmFzZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZXZlbnQubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2V2ZW50X3RhcmdldC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvdGltZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL3dlYl93b3JrZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2h0dHBfcmVxdWVzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZG9tLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9qcy9kYXRlLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2RpY3Rpb25hcnkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGltZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci91cmwubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvaGFuZGxlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hdHRyaWJ1dGUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hc3NlcnRfZmFpbHVyZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGFzay5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9zdWJzY3JpcHRpb24ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvc3Vic2NyaXB0aW9ucy5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9jb21tYW5kLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2Jyb3dzZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvZm1saWJfYnJvd3Nlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvZXhhbXBsZXMvYnJvd3Nlci9mbGlnaHQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N0ZF9leGl0Lm1sIl0sIm1hcHBpbmdzIjoiOzs7OztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwT0EsU0FBU0EsbUJBQW1CQyxHQUFLLFNBQVFBLFdBQVk7R0N6THJELFNBQVNDLGdCQUFnQkMsR0FBR0M7SUFDMUIsR0FBR0QsUUFBUTtJQUNYLEdBQUlDLFVBQVUsT0FBUUEsU0FBU0Q7SUFDL0IsSUFBSUUsUUFBUUM7SUFDWixPQUFRO0tBQ04sR0FBSUgsT0FBT0UsS0FBS0Q7S0FDaEJEO0tBQ0EsR0FBSUEsUUFBUSxPQUFPRTtLQUNuQkQsS0FBS0E7S0FDTEU7S0FDQSxHQUFJQSxRQUNGRjs7R0FLTjtHRDdDc0IsSUFBbEJHLG9CQUFvQkM7R0VBeEIsU0FBU0Msb0JBQXFCQyxLQUFPLE1BQU1BLElBQUs7R0M0SDNCLElBQWpCQztHRHJGSixTQUFTQztJQUNQSCxvQkFBb0JFO0dBQ3RCO0dGckNBLFNBQVNFLFFBQVNDLElBQUdDLElBQUdDO0lBQ3RCQyxVQUFVSDtJQUNWRyxVQUFVRjtJQUNWRSxVQUFVRDtHQUNaO0dBQ0FIO0dBQ0FBO2VBQ0UsV0FBV0EsUUFBUUksU0FBUUEsU0FBUUEsU0FEWjtHQUl6Qko7YUFBdUNaO0tBQ3JDLEdBQUlnQixVQUFVaEIsTUFBTTtLQUNwQixHQUFJZ0IsVUFBVWhCLE1BQU07S0FDcEIsR0FBSWdCLFVBQVVoQixNQUFNO0tBQ3BCLEdBQUlnQixVQUFVaEIsTUFBTTtLQUNwQixHQUFJZ0IsVUFBVWhCLE1BQU07S0FDcEIsR0FBSWdCLFVBQVVoQixNQUFNO0tBQ3BCO0lBUDJC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REM7SUFDQUM7SUFFQUM7SUFVQUM7SUFJQUM7SUFJQ0M7SUFTREM7SUFDQUM7SUFFQ0M7SUFLQUM7SUFLREM7SUFDQUM7SUFFQ0M7SUFTREM7SUFJQUM7SUFJQUM7SUFVQUM7SUFJQUM7SUFJQ0M7SUFVREM7SUFDQUM7SUFFQUM7SUFJQUM7SUFJQ0M7SUFRREM7SUFDQUM7SUFFQ0M7SUFLQUM7SUFLREM7SUFDQUM7SUFDQ0M7SUFNREM7SUFDQUM7SUFDQUM7SUFDQUM7SUFDQ0M7SUFNREM7SUFDQUM7SUFFQ0M7SUFLQUM7SUFLREM7SUFDQUM7SUFDQ0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBMENEam1HO0lBWUEyYjtJQUNBRTtJQU9Bblg7SUFDQUU7SUFDQXNoRztJQUlBQzs7OztHQWdCRzs7Ozs7O09BamlCTC91Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBKRW1wRztPQUNBQztPQUVBQztPQUlBQztPQUlDQztPQVVEQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQU1BQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQUNBQztPQUVDQztPQUdBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUNDQztPQU1EQztPQUNBQztPQUVBQztPQVVBQztPQUlBQztPQUlDQztPQVNEQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNBQztPQUVDQztPQVNEQztPQUlBQztPQUlBQztPQVVBQztPQUlBQztPQUlDQztPQVVEQztPQUNBQztPQUVBQztPQUlBQztPQUlDQztPQVFEQztPQUNBQztPQUVDQztPQUtBQztPQUtEQztPQUNB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LDRDQW5GYlo7S0FrRlE7S0FGTSxVQUFDO0tBRFgsVUFDSTtJQURKO0dBZ0JDO1lBSUxhLFlBQ0t2QyxRQUNBQzthQUtEdUMsYUFBYVosS0FBSVg7S0FDakI7Z0JBTVEsZ0NBUEtXO01BS1MsTUF2SjFCWixlQWtKcUJDO2dCQUtEO2dCQURBO01BREYsVUFBRTtNQURILFVBQ0w7TUFGSCxVQUNEO0tBREM7SUFRSjtJQUc4QjtlQUFDO0tBQWxCLFVBQUM7S0FBVCxVQUFDO0tBRFB3QixZQUNDO0lBRUwsR0FuQkt4Qzs7TUF1Qk1FLFdBdkJORjtNQW1CRHlDLFVBZEFGLGtDQWtCT3JDLFdBUFBzQzs7U0FHQUMsTUFIQUQ7SUFjQTtlQXpCQUQsMkJBTkN4QyxTQW9CRDBDO0tBU00sVUFBQztLQURKLFVBQ0g7SUFERztHQU1OO1lBSURDO0lBQ0E7U0FDeUIxQyxxQkFBUkQsbUJBQU5PO0tBQ1AsT0F0R0p1QixhQXFHV3ZCLE1BQU1QLFFBQVFDOztRQUVQRSxxQkFBUkQ7SUFDTixPQTVDSnFDLFlBMkNVckMsVUFBUUM7R0FDVztHQUs3Qiw4QkFoUEFQLE1Bc09BK0MsTUFqT0E5Qzs7OztPQUxBRDtPQUtBQztPQW1DQWM7T0FZQUs7T0FXQUU7T0FRQUM7T0FlQUs7T0FNQUU7T0FtQkFDO09Bb0JBRztPQTREQVM7T0F1Q0FJOzs7RURsUUw7Ozs7Ozs7Ozs7Ozs7R0NBQTs7Ozs7Ozs7R0NrQlM7Ozs7RURsQlQiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZmZzZXRcbnZhciBjYW1sX2ludDY0X29mZnNldCA9IE1hdGgucG93KDIsIC0yNCk7XG5cbi8vUHJvdmlkZXM6IE1sSW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG5mdW5jdGlvbiBNbEludDY0IChsbyxtaSxoaSkge1xuICB0aGlzLmxvID0gbG8gJiAweGZmZmZmZjtcbiAgdGhpcy5taSA9IG1pICYgMHhmZmZmZmY7XG4gIHRoaXMuaGkgPSBoaSAmIDB4ZmZmZjtcbn1cbk1sSW50NjQucHJvdG90eXBlLmNhbWxfY3VzdG9tID0gXCJfalwiXG5NbEludDY0LnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sbyx0aGlzLm1pLHRoaXMuaGkpO1xufVxuXG5NbEludDY0LnByb3RvdHlwZS51Y29tcGFyZSA9IGZ1bmN0aW9uICh4KSB7XG4gIGlmICh0aGlzLmhpID4geC5oaSkgcmV0dXJuIDE7XG4gIGlmICh0aGlzLmhpIDwgeC5oaSkgcmV0dXJuIC0xO1xuICBpZiAodGhpcy5taSA+IHgubWkpIHJldHVybiAxO1xuICBpZiAodGhpcy5taSA8IHgubWkpIHJldHVybiAtMTtcbiAgaWYgKHRoaXMubG8gPiB4LmxvKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMubG8gPCB4LmxvKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBoaSA9IHRoaXMuaGkgPDwgMTY7XG4gIHZhciB4aGkgPSB4LmhpIDw8IDE2O1xuICBpZiAoaGkgPiB4aGkpIHJldHVybiAxO1xuICBpZiAoaGkgPCB4aGkpIHJldHVybiAtMTtcbiAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMubWkgPCB4Lm1pKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGxvID0gLSB0aGlzLmxvO1xuICB2YXIgbWkgPSAtIHRoaXMubWkgKyAobG8gPj4gMjQpO1xuICB2YXIgaGkgPSAtIHRoaXMuaGkgKyAobWkgPj4gMjQpO1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbG8gPSB0aGlzLmxvICsgeC5sbztcbiAgdmFyIG1pID0gdGhpcy5taSArIHgubWkgKyAobG8gPj4gMjQpO1xuICB2YXIgaGkgPSB0aGlzLmhpICsgeC5oaSArIChtaSA+PiAyNCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBsbyA9IHRoaXMubG8gLSB4LmxvO1xuICB2YXIgbWkgPSB0aGlzLm1pIC0geC5taSArIChsbyA+PiAyNCk7XG4gIHZhciBoaSA9IHRoaXMuaGkgLSB4LmhpICsgKG1pID4+IDI0KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIGxvID0gdGhpcy5sbyAqIHgubG87XG4gIHZhciBtaSA9ICgobG8gKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArIHRoaXMubWkgKiB4LmxvICsgdGhpcy5sbyAqIHgubWk7XG4gIHZhciBoaSA9ICgobWkgKiBjYW1sX2ludDY0X29mZnNldCkgfCAwKSArIHRoaXMuaGkgKiB4LmxvICsgdGhpcy5taSAqIHgubWkgKyB0aGlzLmxvICogeC5oaTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuaXNaZXJvID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMubG98dGhpcy5taXx0aGlzLmhpKSA9PSAwO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAodGhpcy5oaSA8PCAxNikgPCAwO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuYW5kID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8gJiB4LmxvLCB0aGlzLm1pICYgeC5taSwgdGhpcy5oaSAmIHguaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUub3IgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sb3x4LmxvLCB0aGlzLm1pfHgubWksIHRoaXMuaGl8eC5oaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiAoeCkge1xuICByZXR1cm4gbmV3IE1sSW50NjQodGhpcy5sb154LmxvLCB0aGlzLm1pXngubWksIHRoaXMuaGleeC5oaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5zaGlmdF9sZWZ0ID0gZnVuY3Rpb24gKHMpIHtcbiAgcyA9IHMgJiA2MztcbiAgaWYgKHMgPT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChzIDwgMjQpIHtcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKHRoaXMubG8gPDwgcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1pIDw8IHMpIHwgKHRoaXMubG8gPj4gKDI0IC0gcykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuaGkgPDwgcykgfCAodGhpcy5taSA+PiAoMjQgLSBzKSkpO1xuICB9XG4gIGlmIChzIDwgNDgpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0ICgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sbyA8PCAocyAtIDI0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1pIDw8IChzIC0gMjQpKSB8ICh0aGlzLmxvID4+ICg0OCAtIHMpKSk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCgwLCAwLCB0aGlzLmxvIDw8IChzIC0gNDgpKVxufVxuTWxJbnQ2NC5wcm90b3R5cGUuc2hpZnRfcmlnaHRfdW5zaWduZWQgPSBmdW5jdGlvbiAocykge1xuICBzID0gcyAmIDYzO1xuICBpZiAocyA9PSAwKSByZXR1cm4gdGhpcztcbiAgaWYgKHMgPCAyNClcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKFxuICAgICAgKHRoaXMubG8gPj4gcykgfCAodGhpcy5taSA8PCAoMjQgLSBzKSksXG4gICAgICAodGhpcy5taSA+PiBzKSB8ICh0aGlzLmhpIDw8ICgyNCAtIHMpKSxcbiAgICAgICh0aGlzLmhpID4+IHMpKTtcbiAgaWYgKHMgPCA0OClcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKFxuICAgICAgKHRoaXMubWkgPj4gKHMgLSAyNCkpIHwgKHRoaXMuaGkgPDwgKDQ4IC0gcykpLFxuICAgICAgKHRoaXMuaGkgPj4gKHMgLSAyNCkpLFxuICAgICAgMCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCAodGhpcy5oaSA+PiAocyAtIDQ4KSwgMCwgMCk7XG59XG5NbEludDY0LnByb3RvdHlwZS5zaGlmdF9yaWdodCA9IGZ1bmN0aW9uIChzKSB7XG4gIHMgPSBzICYgNjM7XG4gIGlmIChzID09IDApIHJldHVybiB0aGlzO1xuICB2YXIgaCA9ICh0aGlzLmhpIDw8IDE2KSA+PiAxNjtcbiAgaWYgKHMgPCAyNClcbiAgICByZXR1cm4gbmV3IE1sSW50NjQgKFxuICAgICAgKHRoaXMubG8gPj4gcykgfCAodGhpcy5taSA8PCAoMjQgLSBzKSksXG4gICAgICAodGhpcy5taSA+PiBzKSB8IChoIDw8ICgyNCAtIHMpKSxcbiAgICAgICgodGhpcy5oaSA8PCAxNikgPj4gcykgPj4+IDE2KTtcbiAgdmFyIHNpZ24gPSAodGhpcy5oaSA8PCAxNikgPj4gMzE7XG4gIGlmIChzIDwgNDgpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICh0aGlzLmhpIDw8IDE2KSA+PiAocyAtIDI0KSA+PiAxNixcbiAgICAgIHNpZ24gJiAweGZmZmYpO1xuICByZXR1cm4gbmV3IE1sSW50NjQgKCh0aGlzLmhpIDw8IDE2KSA+PiAocyAtIDMyKSwgc2lnbiwgc2lnbik7XG59XG5NbEludDY0LnByb3RvdHlwZS5sc2wxID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmhpID0gKHRoaXMuaGkgPDwgMSkgfCAodGhpcy5taSA+PiAyMyk7XG4gIHRoaXMubWkgPSAoKHRoaXMubWkgPDwgMSkgfCAodGhpcy5sbyA+PiAyMykpICYgMHhmZmZmZmY7XG4gIHRoaXMubG8gPSAodGhpcy5sbyA8PCAxKSAmIDB4ZmZmZmZmO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubHNyMSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5sbyA9ICgodGhpcy5sbyA+Pj4gMSkgfCAodGhpcy5taSA8PCAyMykpICYgMHhmZmZmZmY7XG4gIHRoaXMubWkgPSAoKHRoaXMubWkgPj4+IDEpIHwgKHRoaXMuaGkgPDwgMjMpKSAmIDB4ZmZmZmZmO1xuICB0aGlzLmhpID0gdGhpcy5oaSA+Pj4gMTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnVkaXZtb2QgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgdmFyIG1vZHVsdXMgPSB0aGlzLmNvcHkoKTtcbiAgdmFyIGRpdmlzb3IgPSB4LmNvcHkoKTtcbiAgdmFyIHF1b3RpZW50ID0gbmV3IE1sSW50NjQoMCwwLDApO1xuICB3aGlsZSAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+IDApIHtcbiAgICBvZmZzZXQrKztcbiAgICBkaXZpc29yLmxzbDEoKTtcbiAgfVxuICB3aGlsZSAob2Zmc2V0ID49IDApIHtcbiAgICBvZmZzZXQgLS07XG4gICAgcXVvdGllbnQubHNsMSgpO1xuICAgIGlmIChtb2R1bHVzLnVjb21wYXJlKGRpdmlzb3IpID49IDApIHtcbiAgICAgIHF1b3RpZW50LmxvICsrO1xuICAgICAgbW9kdWx1cyA9IG1vZHVsdXMuc3ViKGRpdmlzb3IpO1xuICAgIH1cbiAgICBkaXZpc29yLmxzcjEoKTtcbiAgfVxuICByZXR1cm4geyBxdW90aWVudCA6IHF1b3RpZW50LCBtb2R1bHVzIDogbW9kdWx1cyB9O1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gKHkpXG57XG4gIHZhciB4ID0gdGhpcztcbiAgaWYgKHkuaXNaZXJvKCkpIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCk7XG4gIHZhciBzaWduID0geC5oaSBeIHkuaGk7XG4gIGlmICh4LmhpICYgMHg4MDAwKSB4ID0geC5uZWcoKTtcbiAgaWYgKHkuaGkgJiAweDgwMDApIHkgPSB5Lm5lZygpO1xuICB2YXIgcSA9IHgudWRpdm1vZCh5KS5xdW90aWVudDtcbiAgaWYgKHNpZ24gJiAweDgwMDApIHEgPSBxLm5lZygpO1xuICByZXR1cm4gcTtcbn1cbk1sSW50NjQucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uICh5KVxue1xuICB2YXIgeCA9IHRoaXM7XG4gIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpO1xuICB2YXIgc2lnbiA9IHguaGk7XG4gIGlmICh4LmhpICYgMHg4MDAwKSB4ID0geC5uZWcoKTtcbiAgaWYgKHkuaGkgJiAweDgwMDApIHkgPSB5Lm5lZygpO1xuICB2YXIgciA9IHgudWRpdm1vZCh5KS5tb2R1bHVzO1xuICBpZiAoc2lnbiAmIDB4ODAwMCkgciA9IHIubmVnKCk7XG4gIHJldHVybiByO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUudG9JbnQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmxvIHwgKHRoaXMubWkgPDwgMjQpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUudG9GbG9hdCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICgodGhpcy5oaSA8PCAxNikgKiBNYXRoLnBvdygyLCAzMikgKyB0aGlzLm1pICogTWF0aC5wb3coMiwgMjQpKSArIHRoaXMubG87XG59XG5NbEludDY0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gW3RoaXMuaGkgPj4gOCxcbiAgICAgICAgICB0aGlzLmhpICYgMHhmZixcbiAgICAgICAgICB0aGlzLm1pID4+IDE2LFxuICAgICAgICAgICh0aGlzLm1pID4+IDgpICYgMHhmZixcbiAgICAgICAgICB0aGlzLm1pICYgMHhmZixcbiAgICAgICAgICB0aGlzLmxvID4+IDE2LFxuICAgICAgICAgICh0aGlzLmxvID4+IDgpICYgMHhmZixcbiAgICAgICAgICB0aGlzLmxvICYgMHhmZl07XG59XG5NbEludDY0LnByb3RvdHlwZS5sbzMyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sbyB8ICgodGhpcy5taSAmIDB4ZmYpIDw8IDI0KTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmhpMzIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoKHRoaXMubWkgPj4+IDgpICYgMHhmZmZmKSB8ICh0aGlzLmhpIDw8IDE2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF91bHQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdWx0KHgseSkgeyByZXR1cm4geC51Y29tcGFyZSh5KSA8IDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9jb21wYXJlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NvbXBhcmUoeCx5LCB0b3RhbCkgeyByZXR1cm4geC5jb21wYXJlKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9uZWcgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbmVnICh4KSB7IHJldHVybiB4Lm5lZygpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9hZGQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfYWRkICh4LCB5KSB7IHJldHVybiB4LmFkZCh5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc3ViIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3N1YiAoeCwgeSkgeyByZXR1cm4geC5zdWIoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X211bCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbXVsKHgseSkgeyByZXR1cm4geC5tdWwoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2lzX3plcm8gY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaXNfemVybyh4KSB7IHJldHVybiAreC5pc1plcm8oKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpIHsgcmV0dXJuICt4LmlzTmVnKCk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9hbmQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfYW5kICh4LCB5KSB7IHJldHVybiB4LmFuZCh5KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29yIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29yICh4LCB5KSB7IHJldHVybiB4Lm9yKHkpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfeG9yIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3hvciAoeCwgeSkgeyByZXR1cm4geC54b3IoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfbGVmdCAoeCwgcykgeyByZXR1cm4geC5zaGlmdF9sZWZ0KHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCAoeCwgcykgeyByZXR1cm4geC5zaGlmdF9yaWdodF91bnNpZ25lZChzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHQgKHgsIHMpIHsgcmV0dXJuIHguc2hpZnRfcmlnaHQocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2RpdiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9kaXYgKHgsIHkpIHsgcmV0dXJuIHguZGl2KHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9tb2QgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbW9kICh4LCB5KSB7IHJldHVybiB4Lm1vZCh5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIgY29uc3Rcbi8vUmVxdWlyZXM6IE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb2ZfaW50MzIgKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHggJiAweGZmZmZmZiwgKHggPj4gMjQpICYgMHhmZmZmZmYsICh4ID4+IDMxKSAmIDB4ZmZmZilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF90b19pbnQzMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19pbnQzMiAoeCkgeyByZXR1cm4geC50b0ludCgpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF90b19mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19mbG9hdCAoeCkgeyByZXR1cm4geC50b0Zsb2F0ICgpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZmZzZXQsIE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb2ZfZmxvYXQgKHgpIHtcbiAgaWYgKHggPCAwKSB4ID0gTWF0aC5jZWlsKHgpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoXG4gICAgeCAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZmZmLFxuICAgIE1hdGguZmxvb3IoeCAqIGNhbWxfaW50NjRfb2Zmc2V0ICogY2FtbF9pbnQ2NF9vZmZzZXQpICYgMHhmZmZmKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9mb3JtYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VfZm9ybWF0LCBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlLCBjYW1sX2ludDY0X25lZ1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiwgY2FtbF9pbnQ2NF90b19pbnQzMlxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9pc196ZXJvLCBjYW1sX3N0cl9yZXBlYXRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZm9ybWF0IChmbXQsIHgpIHtcbiAgdmFyIGYgPSBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpO1xuICBpZiAoZi5zaWduZWRjb252ICYmIGNhbWxfaW50NjRfaXNfbmVnYXRpdmUoeCkpIHtcbiAgICBmLnNpZ24gPSAtMTsgeCA9IGNhbWxfaW50NjRfbmVnKHgpO1xuICB9XG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICB2YXIgd2Jhc2UgPSBjYW1sX2ludDY0X29mX2ludDMyKGYuYmFzZSk7XG4gIHZhciBjdnRibCA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuICBkbyB7XG4gICAgdmFyIHAgPSB4LnVkaXZtb2Qod2Jhc2UpO1xuICAgIHggPSBwLnF1b3RpZW50O1xuICAgIGJ1ZmZlciA9IGN2dGJsLmNoYXJBdChjYW1sX2ludDY0X3RvX2ludDMyKHAubW9kdWx1cykpICsgYnVmZmVyO1xuICB9IHdoaWxlICghIGNhbWxfaW50NjRfaXNfemVybyh4KSk7XG4gIGlmIChmLnByZWMgPj0gMCkge1xuICAgIGYuZmlsbGVyID0gJyAnO1xuICAgIHZhciBuID0gZi5wcmVjIC0gYnVmZmVyLmxlbmd0aDtcbiAgICBpZiAobiA+IDApIGJ1ZmZlciA9IGNhbWxfc3RyX3JlcGVhdCAobiwgJzAnKSArIGJ1ZmZlcjtcbiAgfVxuICByZXR1cm4gY2FtbF9maW5pc2hfZm9ybWF0dGluZyhmLCBidWZmZXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX3BhcnNlX2RpZ2l0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X3VsdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9hZGQsIGNhbWxfaW50NjRfbXVsLCBjYW1sX2ludDY0X25lZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfb2Zfc3RyaW5nKHMpIHtcbiAgdmFyIHIgPSBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UgKHMpO1xuICB2YXIgaSA9IHJbMF0sIHNpZ24gPSByWzFdLCBiYXNlID0gclsyXTtcbiAgdmFyIGJhc2U2NCA9IGNhbWxfaW50NjRfb2ZfaW50MzIoYmFzZSk7XG4gIHZhciB0aHJlc2hvbGQgPVxuICAgICAgbmV3IE1sSW50NjQoMHhmZmZmZmYsIDB4ZmZmZmZmZiwgMHhmZmZmKS51ZGl2bW9kKGJhc2U2NCkucXVvdGllbnQ7XG4gIHZhciBjID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKTtcbiAgdmFyIGQgPSBjYW1sX3BhcnNlX2RpZ2l0KGMpO1xuICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgdmFyIHJlcyA9IGNhbWxfaW50NjRfb2ZfaW50MzIoZCk7XG4gIGZvciAoOzspIHtcbiAgICBpKys7XG4gICAgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gICAgaWYgKGMgPT0gOTUpIGNvbnRpbnVlO1xuICAgIGQgPSBjYW1sX3BhcnNlX2RpZ2l0KGMpO1xuICAgIGlmIChkIDwgMCB8fCBkID49IGJhc2UpIGJyZWFrO1xuICAgIC8qIERldGVjdCBvdmVyZmxvdyBpbiBtdWx0aXBsaWNhdGlvbiBiYXNlICogcmVzICovXG4gICAgaWYgKGNhbWxfaW50NjRfdWx0KHRocmVzaG9sZCwgcmVzKSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gICAgZCA9IGNhbWxfaW50NjRfb2ZfaW50MzIoZCk7XG4gICAgcmVzID0gY2FtbF9pbnQ2NF9hZGQoY2FtbF9pbnQ2NF9tdWwoYmFzZTY0LCByZXMpLCBkKTtcbiAgICAvKiBEZXRlY3Qgb3ZlcmZsb3cgaW4gYWRkaXRpb24gKGJhc2UgKiByZXMpICsgZCAqL1xuICAgIGlmIChjYW1sX2ludDY0X3VsdChyZXMsIGQpKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICBpZiAoYmFzZSA9PSAxMCAmJiBjYW1sX2ludDY0X3VsdChuZXcgTWxJbnQ2NCgwLCAwLCAweDgwMDApLCByZXMpKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICBpZiAoc2lnbiA8IDApIHJlcyA9IGNhbWxfaW50NjRfbmVnKHJlcyk7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaShsbywgbWksIGhpKXtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaSBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkobG8sIGhpKXtcbiAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICBsbyAmIDB4ZmZmZmZmLFxuICAgICgobG8gPj4+IDI0KSAmIDB4ZmYpIHwgKChoaSAmIDB4ZmZmZikgPDwgOCksXG4gICAgKGhpID4+PiAxNikgJiAweGZmZmYpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9sbzMyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2xvMzIodil7IHJldHVybiB2LmxvMzIoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGkzMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oaTMyKHYpeyByZXR1cm4gdi5oaTMyKCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mX2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2J5dGVzKGEpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGFbN10gPDwgMCB8IChhWzZdIDw8IDgpIHwgKGFbNV0gPDwgMTYpLFxuICAgICAgICAgICAgICAgICAgICAgYVs0XSA8PCAwIHwgKGFbM10gPDwgOCkgfCAoYVsyXSA8PCAxNiksXG4gICAgICAgICAgICAgICAgICAgICBhWzFdIDw8IDAgfCAoYVswXSA8PCA4KSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3RvX2J5dGVzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3RvX2J5dGVzKHgpIHsgcmV0dXJuIHgudG9BcnJheSgpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9oYXNoIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2hhc2godil7XG4gIHJldHVybiAodi5sbzMyKCkpIF4gKHYuaGkzMigpKVxufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8gQW4gT0NhbWwgc3RyaW5nIGlzIGFuIG9iamVjdCB3aXRoIHRocmVlIGZpZWxkczpcbi8vIC0gdGFnICd0J1xuLy8gLSBsZW5ndGggJ2wnXG4vLyAtIGNvbnRlbnRzICdjJ1xuLy9cbi8vIFRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYSBKYXZhU2NyaXB0IGFycmF5IG9yXG4vLyBhIEphdmFTY3JpcHQgc3RyaW5nLiBUaGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nIGNhbiBiZSBsZXNzIHRoYW4gdGhlXG4vLyBsZW5ndGggb2YgdGhlIE9DYW1sIHN0cmluZy4gSW4gdGhpcyBjYXNlLCByZW1haW5pbmcgYnl0ZXMgYXJlXG4vLyBhc3N1bWVkIHRvIGJlIHplcm9lcy4gQXJyYXlzIGFyZSBtdXRhYmxlIGJ1dCBjb25zdW1lcyBtb3JlIG1lbW9yeVxuLy8gdGhhbiBzdHJpbmdzLiBBIGNvbW1vbiBwYXR0ZXJuIGlzIHRvIHN0YXJ0IGZyb20gYW4gZW1wdHkgc3RyaW5nIGFuZFxuLy8gcHJvZ3Jlc3NpdmVseSBmaWxsIGl0IGZyb20gdGhlIHN0YXJ0LiBQYXJ0aWFsIHN0cmluZ3MgbWFrZXMgaXRcbi8vIHBvc3NpYmxlIHRvIGltcGxlbWVudCB0aGlzIGVmZmljaWVudGx5LlxuLy9cbi8vIFdoZW4gY29udmVydGluZyB0byBhbmQgZnJvbSBVVEYtMTYsIHdlIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGVcbi8vIHN0cmluZyBpcyBjb21wb3NlZCBvbmx5IG9mIEFTQ0lJIGNoYXJhY3RlcnMgKGluIHdoaWNoIGNhc2UsIG5vXG4vLyBjb252ZXJzaW9uIG5lZWRzIHRvIGJlIHBlcmZvcm1lZCkgb3Igbm90LlxuLy9cbi8vIFRoZSBzdHJpbmcgdGFnIGNhbiB0aHVzIHRha2UgdGhlIGZvbGxvd2luZyB2YWx1ZXM6XG4vLyAgIGZ1bGwgc3RyaW5nICAgICBCWVRFIHwgVU5LTk9XTjogICAgICAwXG4vLyAgICAgICAgICAgICAgICAgICBCWVRFIHwgQVNDSUk6ICAgICAgICA5XG4vLyAgICAgICAgICAgICAgICAgICBCWVRFIHwgTk9UX0FTQ0lJOiAgICA4XG4vLyAgIHN0cmluZyBwcmVmaXggICBQQVJUSUFMOiAgICAgICAgICAgICAyXG4vLyAgIGFycmF5ICAgICAgICAgICBBUlJBWTogICAgICAgICAgICAgICA0XG4vL1xuLy8gT25lIGNhbiB1c2UgYml0IG1hc2tpbmcgdG8gZGlzY3JpbWluYXRlIHRoZXNlIGRpZmZlcmVudCBjYXNlczpcbi8vICAga25vd25fZW5jb2RpbmcoeCkgPSB4Jjhcbi8vICAgaXNfYXNjaWkoeCkgPSAgICAgICB4JjFcbi8vICAga2luZCh4KSA9ICAgICAgICAgICB4JjZcblxuLy9Qcm92aWRlczogY2FtbF9zdHJfcmVwZWF0XG5mdW5jdGlvbiBjYW1sX3N0cl9yZXBlYXQobiwgcykge1xuICBpZihuID09IDApIHJldHVybiBcIlwiO1xuICBpZiAocy5yZXBlYXQpIHtyZXR1cm4gcy5yZXBlYXQobik7fSAvLyBFQ01Bc2NyaXB0IDYgYW5kIEZpcmVmb3ggMjQrXG4gIHZhciByID0gXCJcIiwgbCA9IDA7XG4gIGZvcig7Oykge1xuICAgIGlmIChuICYgMSkgciArPSBzO1xuICAgIG4gPj49IDE7XG4gICAgaWYgKG4gPT0gMCkgcmV0dXJuIHI7XG4gICAgcyArPSBzO1xuICAgIGwrKztcbiAgICBpZiAobCA9PSA5KSB7XG4gICAgICBzLnNsaWNlKDAsMSk7IC8vIGZsYXR0ZW4gdGhlIHN0cmluZ1xuICAgICAgLy8gdGhlbiwgdGhlIGZsYXR0ZW5pbmcgb2YgdGhlIHdob2xlIHN0cmluZyB3aWxsIGJlIGZhc3RlcixcbiAgICAgIC8vIGFzIGl0IHdpbGwgYmUgY29tcG9zZWQgb2YgbGFyZ2VyIHBpZWNlc1xuICAgIH1cbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXNcbi8vV2Vha2RlZlxuLy8gUHJlIEVDTUFTY3JpcHQgNSwgW2FwcGx5XSB3b3VsZCBub3Qgc3VwcG9ydCBhcnJheS1saWtlIG9iamVjdC5cbi8vIEluIHN1Y2ggc2V0dXAsIFR5cGVkX2FycmF5IHdvdWxkIGJlIGltcGxlbWVudGVkIGFzIHBvbHlmaWxsLCBhbmQgW2YuYXBwbHldIHdvdWxkXG4vLyBmYWlsIGhlcmUuIE1hcmsgdGhlIHByaW1pdGl2ZSBhcyBXZWFrZGVmLCBzbyB0aGF0IHBlb3BsZSBjYW4gb3ZlcnJpZGUgaXQgZWFzaWx5LlxuZnVuY3Rpb24gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzIChhLCBpLCBsZW4pIHtcbiAgdmFyIGYgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuICBpZiAoaSA9PSAwICYmIGxlbiA8PSA0MDk2ICYmIGxlbiA9PSBhLmxlbmd0aCkgcmV0dXJuIGYuYXBwbHkgKG51bGwsIGEpO1xuICB2YXIgcyA9IFwiXCI7XG4gIGZvciAoOyAwIDwgbGVuOyBpICs9IDEwMjQsbGVuLT0xMDI0KVxuICAgIHMgKz0gZi5hcHBseSAobnVsbCwgYS5zbGljZShpLGkgKyBNYXRoLm1pbihsZW4sIDEwMjQpKSk7XG4gIHJldHVybiBzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3V0Zjhfb2ZfdXRmMTZcbmZ1bmN0aW9uIGNhbWxfdXRmOF9vZl91dGYxNihzKSB7XG4gIGZvciAodmFyIGIgPSBcIlwiLCB0ID0gYiwgYywgZCwgaSA9IDAsIGwgPSBzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICBmb3IgKHZhciBqID0gaSArIDE7IChqIDwgbCkgJiYgKGMgPSBzLmNoYXJDb2RlQXQoaikpIDwgMHg4MDsgaisrKTtcbiAgICAgIGlmIChqIC0gaSA+IDUxMikgeyB0LnN1YnN0cigwLCAxKTsgYiArPSB0OyB0ID0gXCJcIjsgYiArPSBzLnNsaWNlKGksIGopIH1cbiAgICAgIGVsc2UgdCArPSBzLnNsaWNlKGksIGopO1xuICAgICAgaWYgKGogPT0gbCkgYnJlYWs7XG4gICAgICBpID0gajtcbiAgICB9XG4gICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4YzAgfCAoYyA+PiA2KSk7XG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHg4MCB8IChjICYgMHgzZikpO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ZDgwMCB8fCBjID49IDB4ZGZmZikge1xuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZTAgfCAoYyA+PiAxMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9IGVsc2UgaWYgKGMgPj0gMHhkYmZmIHx8IGkgKyAxID09IGwgfHxcbiAgICAgICAgICAgICAgIChkID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgZCA+IDB4ZGZmZikge1xuICAgICAgLy8gVW5tYXRjaGVkIHN1cnJvZ2F0ZSBwYWlyLCByZXBsYWNlZCBieSBcXHVmZmZkIChyZXBsYWNlbWVudCBjaGFyYWN0ZXIpXG4gICAgICB0ICs9IFwiXFx4ZWZcXHhiZlxceGJkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGkrKztcbiAgICAgIGMgPSAoYyA8PCAxMCkgKyBkIC0gMHgzNWZkYzAwO1xuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZjAgfCAoYyA+PiAxOCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8ICgoYyA+PiAxMikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKChjID4+IDYpICYgMHgzZiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8IChjICYgMHgzZikpO1xuICAgIH1cbiAgICBpZiAodC5sZW5ndGggPiAxMDI0KSB7dC5zdWJzdHIoMCwgMSk7IGIgKz0gdDsgdCA9IFwiXCI7fVxuICB9XG4gIHJldHVybiBiK3Q7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdXRmMTZfb2ZfdXRmOFxuZnVuY3Rpb24gY2FtbF91dGYxNl9vZl91dGY4KHMpIHtcbiAgZm9yICh2YXIgYiA9IFwiXCIsIHQgPSBcIlwiLCBjLCBjMSwgYzIsIHYsIGkgPSAwLCBsID0gcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjMSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYzEgPCAweDgwKSB7XG4gICAgICBmb3IgKHZhciBqID0gaSArIDE7IChqIDwgbCkgJiYgKGMxID0gcy5jaGFyQ29kZUF0KGopKSA8IDB4ODA7IGorKyk7XG4gICAgICBpZiAoaiAtIGkgPiA1MTIpIHsgdC5zdWJzdHIoMCwgMSk7IGIgKz0gdDsgdCA9IFwiXCI7IGIgKz0gcy5zbGljZShpLCBqKSB9XG4gICAgICBlbHNlIHQgKz0gcy5zbGljZShpLCBqKTtcbiAgICAgIGlmIChqID09IGwpIGJyZWFrO1xuICAgICAgaSA9IGo7XG4gICAgfVxuICAgIHYgPSAxO1xuICAgIGlmICgoKytpIDwgbCkgJiYgKCgoYzIgPSBzLmNoYXJDb2RlQXQoaSkpICYgLTY0KSA9PSAxMjgpKSB7XG4gICAgICBjID0gYzIgKyAoYzEgPDwgNik7XG4gICAgICBpZiAoYzEgPCAweGUwKSB7XG4gICAgICAgIHYgPSBjIC0gMHgzMDgwO1xuICAgICAgICBpZiAodiA8IDB4ODApIHYgPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdiA9IDI7XG4gICAgICAgIGlmICgoKytpIDwgbCkgJiYgKCgoYzIgPSBzLmNoYXJDb2RlQXQoaSkpICYgLTY0KSA9PSAxMjgpKSB7XG4gICAgICAgICAgYyA9IGMyICsgKGMgPDwgNik7XG4gICAgICAgICAgaWYgKGMxIDwgMHhmMCkge1xuICAgICAgICAgICAgdiA9IGMgLSAweGUyMDgwO1xuICAgICAgICAgICAgaWYgKCh2IDwgMHg4MDApIHx8ICgodiA+PSAweGQ3ZmYpICYmICh2IDwgMHhlMDAwKSkpIHYgPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2ID0gMztcbiAgICAgICAgICAgIGlmICgoKytpIDwgbCkgJiYgKCgoYzIgPSBzLmNoYXJDb2RlQXQoaSkpICYgLTY0KSA9PSAxMjgpICYmXG4gICAgICAgICAgICAgICAgKGMxIDwgMHhmNSkpIHtcbiAgICAgICAgICAgICAgdiA9IGMyIC0gMHgzYzgyMDgwICsgKGMgPDwgNik7XG4gICAgICAgICAgICAgIGlmICh2IDwgMHgxMDAwMCB8fCB2ID4gMHgxMGZmZmYpIHYgPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodiA8IDQpIHsgLy8gSW52YWxpZCBzZXF1ZW5jZVxuICAgICAgaSAtPSB2O1xuICAgICAgdCArPSBcIlxcdWZmZmRcIjtcbiAgICB9IGVsc2UgaWYgKHYgPiAweGZmZmYpXG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkN2MwICsgKHYgPj4gMTApLCAweGRjMDAgKyAodiAmIDB4M0ZGKSlcbiAgICBlbHNlXG4gICAgICB0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7XG4gICAgaWYgKHQubGVuZ3RoID4gMTAyNCkge3Quc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiO31cbiAgfVxuICByZXR1cm4gYit0O1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX2lzX2FzY2lpXG5mdW5jdGlvbiBqc29vX2lzX2FzY2lpIChzKSB7XG4gIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2V0cyBiZXR0ZXIgYXQgYXJvdW5kIHRoaXMgcG9pbnQgZm9yIGFsbCBicm93c2Vyc1xuICBpZiAocy5sZW5ndGggPCAyNCkge1xuICAgIC8vIFNwaWRlcm1vbmtleSBnZXRzIG11Y2ggc2xvd2VyIHdoZW4gcy5sZW5ndGggPj0gMjQgKG9uIDY0IGJpdCBhcmNocylcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIGlmIChzLmNoYXJDb2RlQXQoaSkgPiAxMjcpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlXG4gICAgcmV0dXJuICEvW15cXHgwMC1cXHg3Zl0vLnRlc3Qocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpIHtcbiAgc3dpdGNoIChzLnQgJiA2KSB7XG4gIGRlZmF1bHQ6IC8qIFBBUlRJQUwgKi9cbiAgICBpZiAoaSA+PSBzLmMubGVuZ3RoKSByZXR1cm4gMDtcbiAgY2FzZSAwOiAvKiBCWVRFUyAqL1xuICAgIHJldHVybiBzLmMuY2hhckNvZGVBdChpKTtcbiAgY2FzZSA0OiAvKiBBUlJBWSAqL1xuICAgIHJldHVybiBzLmNbaV1cbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpLCBjKSB7XG4gIC8vIFRoZSBPQ2FtbCBjb21waWxlciB1c2VzIENoYXIudW5zYWZlX2NociBvbiBpbnRlZ2VycyBsYXJnZXIgdGhhbiAyNTUhXG4gIGMgJj0gMHhmZjtcbiAgaWYgKHMudCAhPSA0IC8qIEFSUkFZICovKSB7XG4gICAgaWYgKGkgPT0gcy5jLmxlbmd0aCkge1xuICAgICAgcy5jICs9IFN0cmluZy5mcm9tQ2hhckNvZGUgKGMpO1xuICAgICAgaWYgKGkgKyAxID09IHMubCkgcy50ID0gMDsgLypCWVRFUyB8IFVOS09XTiovXG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5IChzKTtcbiAgfVxuICBzLmNbaV0gPSBjO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IgKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcImluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ2V0IChzLCBpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ2V0MTYocyxpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDEpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgMSk7XG4gIHJldHVybiAoYjIgPDwgOCB8IGIxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQxNlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDE2KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSksXG4gICAgICBiMiA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIDEpO1xuICByZXR1cm4gKGIyIDw8IDggfCBiMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dldDMyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19nZXQzMihzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIC0gMykgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSksXG4gICAgICBiMiA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyAxKSxcbiAgICAgIGIzID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDIpLFxuICAgICAgYjQgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgMyk7XG4gIHJldHVybiAoYjQgPDwgMjQgfCBiMyA8PCAxNiB8IGIyIDw8IDggfCBiMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQzMihzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAxKSxcbiAgICAgIGIzID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgMiksXG4gICAgICBiNCA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0IHwgYjMgPDwgMTYgfCBiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ2V0NjQocyxpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDcpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBhID0gbmV3IEFycmF5KDgpO1xuICBmb3IodmFyIGogPSAwOyBqIDwgODsgaisrKXtcbiAgICBhWzcgLSBqXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0LCBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldDY0KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSA3KSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBhID0gbmV3IEFycmF5KDgpO1xuICBmb3IodmFyIGogPSAwOyBqIDwgODsgaisrKXtcbiAgICBhWzcgLSBqXSA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIGopO1xuICB9XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dldCAocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQgKHMsIGksIGMpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3RyaW5nX3NldFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0LCBjYW1sX3N0cmluZ19ib3VuZF9lcnJvclxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0IChzLCBpLCBjKSB7XG4gIGlmIChpID4+PiAwID49IHMubCkgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQgKHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0MTYocyxpLGkxNil7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDEpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIyID0gMHhGRiAmIGkxNiA+PiA4LFxuICAgICAgYjEgPSAweEZGICYgaTE2O1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAwLCBiMSk7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDEsIGIyKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0MTYocyxpLGkxNil7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXQxNlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfc2V0MTZcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDE2KHMsaSxpMTYpe1xuICByZXR1cm4gY2FtbF9ieXRlc19zZXQxNihzLGksaTE2KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXQzMlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldDMyKHMsaSxpMzIpe1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAzKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiNCA9IDB4RkYgJiBpMzIgPj4gMjQsXG4gICAgICBiMyA9IDB4RkYgJiBpMzIgPj4gMTYsXG4gICAgICBiMiA9IDB4RkYgJiBpMzIgPj4gOCxcbiAgICAgIGIxID0gMHhGRiAmIGkzMjtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMCwgYjEpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAxLCBiMik7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDIsIGIzKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMywgYjQpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQzMlxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQzMihzLGksaTMyKXtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3RyaW5nX3NldDMyXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXQzMlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19zZXQzMlxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0MzIocyxpLGkzMil7XG4gIHJldHVybiBjYW1sX2J5dGVzX3NldDMyKHMsaSxpMzIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0NjQocyxpLGk2NCl7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDcpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGEgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGk2NCk7XG4gIGZvcih2YXIgaiA9IDA7IGogPCA4OyBqKyspIHtcbiAgICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyA3IC0gaiwgYVtqXSk7XG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0NjQocyxpLGk2NCl7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXQ2NFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfc2V0NjRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDY0KHMsaSxpNjQpe1xuICByZXR1cm4gY2FtbF9ieXRlc19zZXQ2NChzLGksaTY0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQgKHMsIGksIGMpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGksIGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3V0Zjhfb2ZfdXRmMTYsIE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmcgKHMpIHtcbiAgdmFyIHRhZyA9IDkgLyogQllURVMgfCBBU0NJSSAqLztcbiAgaWYgKCFqc29vX2lzX2FzY2lpKHMpKVxuICAgIHRhZyA9IDggLyogQllURVMgfCBOT1RfQVNDSUkgKi8sIHMgPSBjYW1sX3V0Zjhfb2ZfdXRmMTYocyk7XG4gIHJldHVybiBuZXcgTWxCeXRlcyh0YWcsIHMsIHMubGVuZ3RoKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBNbEJ5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzLCBqc29vX2lzX2FzY2lpLCBjYW1sX3V0ZjE2X29mX3V0ZjhcbmZ1bmN0aW9uIE1sQnl0ZXMgKHRhZywgY29udGVudHMsIGxlbmd0aCkge1xuICB0aGlzLnQ9dGFnOyB0aGlzLmM9Y29udGVudHM7IHRoaXMubD1sZW5ndGg7XG59XG5NbEJ5dGVzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCl7XG4gIHN3aXRjaCAodGhpcy50KSB7XG4gIGNhc2UgOTogLypCWVRFUyB8IEFTQ0lJKi9cbiAgICByZXR1cm4gdGhpcy5jO1xuICBkZWZhdWx0OlxuICAgIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXModGhpcyk7XG4gIGNhc2UgMDogLypCWVRFUyB8IFVOS09XTiovXG4gICAgaWYgKGpzb29faXNfYXNjaWkodGhpcy5jKSkge1xuICAgICAgdGhpcy50ID0gOTsgLypCWVRFUyB8IEFTQ0lJKi9cbiAgICAgIHJldHVybiB0aGlzLmM7XG4gICAgfVxuICAgIHRoaXMudCA9IDg7IC8qQllURVMgfCBOT1RfQVNDSUkqL1xuICBjYXNlIDg6IC8qQllURVMgfCBOT1RfQVNDSUkqL1xuICAgIHJldHVybiB0aGlzLmM7XG4gIH1cbn07XG5NbEJ5dGVzLnByb3RvdHlwZS50b1V0ZjE2ID0gZnVuY3Rpb24gKCl7XG4gIHZhciByID0gdGhpcy50b1N0cmluZygpO1xuICBpZih0aGlzLnQgPT0gOSkgcmV0dXJuIHJcbiAgcmV0dXJuIGNhbWxfdXRmMTZfb2ZfdXRmOChyKTtcbn1cbk1sQnl0ZXMucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gKCl7XG4gIHZhciBjb250ZW50ID0gdGhpcy50ID09IDQgPyB0aGlzLmMuc2xpY2UoKSA6IHRoaXMuYztcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKHRoaXMudCxjb250ZW50LHRoaXMubCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyX3JlcGVhdCwgY2FtbF9zdWJhcnJheV90b19qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzIChzKSB7XG4gIC8qIEFzc3VtZXMgbm90IEJZVEVTICovXG4gIGlmIChzLnQgPT0gMiAvKiBQQVJUSUFMICovKVxuICAgIHMuYyArPSBjYW1sX3N0cl9yZXBlYXQocy5sIC0gcy5jLmxlbmd0aCwgJ1xcMCcpXG4gIGVsc2VcbiAgICBzLmMgPSBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMgKHMuYywgMCwgcy5jLmxlbmd0aCk7XG4gIHMudCA9IDA7IC8qQllURVMgfCBVTktPV04qL1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheSAocykge1xuICAvKiBBc3N1bWVzIG5vdCBBUlJBWSAqL1xuICB2YXIgYSA9IG5ldyBVaW50OEFycmF5KHMubCk7XG4gIHZhciBiID0gcy5jLCBsID0gYi5sZW5ndGgsIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGIuY2hhckNvZGVBdChpKTtcbiAgZm9yIChsID0gcy5sOyBpIDwgbDsgaSsrKSBhW2ldID0gMDtcbiAgcy5jID0gYTtcbiAgcy50ID0gNDsgLyogQVJSQVkgKi9cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzIChzKSB7XG4gIGlmIChzLnQgIT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICByZXR1cm4gcy5jO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcgKHMpIHtcbiAgdmFyIGwgPSBjYW1sX21sX3N0cmluZ19sZW5ndGgocyk7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICB2YXIgaSA9IDA7XG4gIGZvciAoOyBpIDwgbDsgaSsrKSBhW2ldID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLGkpO1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX3N0cmluZyhsZW4pIHtcbiAgaWYobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyaW5nLmNyZWF0ZVwiKTtcbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKGxlbj8yOjksXCJcIixsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcobGVuKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0cmluZy5jcmVhdGVcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3JlYXRlX2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9jcmVhdGVfYnl0ZXMobGVuKSB7XG4gIGlmIChsZW4gPCAwKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCeXRlcy5jcmVhdGVcIik7XG4gIHJldHVybiBuZXcgTWxCeXRlcyhsZW4/Mjo5LFwiXCIsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfYXJyYXkgKGEpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKGEsMCxhLmxlbmd0aCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX2FycmF5IChhKSB7XG4gIGlmKCEgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIGEgPSBuZXcgVWludDhBcnJheShhKTtcbiAgfVxuICByZXR1cm4gbmV3IE1sQnl0ZXMoNCxhLGEubGVuZ3RoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19jb21wYXJlIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfY29tcGFyZShzMSwgczIpIHtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jIDwgczIuYyk/LTE6KHMxLmMgPiBzMi5jKT8xOjA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2VxdWFsKHMxLCBzMikge1xuICBpZihzMSA9PT0gczIpIHJldHVybiAxO1xuICAoczEudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICAoczIudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gKHMxLmMgPT0gczIuYyk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19lcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbm90ZXF1YWwoczEsIHMyKSB7IHJldHVybiAxLWNhbWxfc3RyaW5nX2VxdWFsKHMxLCBzMik7IH1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2VxdWFsXG5mdW5jdGlvbiBjYW1sX2J5dGVzX25vdGVxdWFsKHMxLCBzMikgeyByZXR1cm4gMS1jYW1sX2J5dGVzX2VxdWFsKHMxLCBzMik7IH1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19sZXNzZXF1YWwgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIChzMS50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIChzMi50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiAoczEuYyA8PSBzMi5jKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfbGVzc3RoYW4gbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19sZXNzdGhhbihzMSwgczIpIHtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jIDwgczIuYyk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWxcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ3JlYXRlcmVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMyLHMxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVyZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMixzMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ3JlYXRlcnRoYW4oczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dyZWF0ZXJ0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19sZXNzdGhhbihzMiwgczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbGxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3RyX3JlcGVhdCwgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG4vL0FsaWFzOiBjYW1sX2ZpbGxfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2ZpbGxfYnl0ZXMocywgaSwgbCwgYykge1xuICBpZiAobCA+IDApIHtcbiAgICBpZiAoaSA9PSAwICYmIChsID49IHMubCB8fCAocy50ID09IDIgLyogUEFSVElBTCAqLyAmJiBsID49IHMuYy5sZW5ndGgpKSkge1xuICAgICAgaWYgKGMgPT0gMCkge1xuICAgICAgICBzLmMgPSBcIlwiO1xuICAgICAgICBzLnQgPSAyOyAvKiBQQVJUSUFMICovXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzLmMgPSBjYW1sX3N0cl9yZXBlYXQgKGwsIFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICAgICAgICBzLnQgPSAobCA9PSBzLmwpPzAgLyogQllURVMgfCBVTktPV04gKi8gOjI7IC8qIFBBUlRJQUwgKi9cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHMudCAhPSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkocyk7XG4gICAgICBmb3IgKGwgKz0gaTsgaSA8IGw7IGkrKykgcy5jW2ldID0gYztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxpdF9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9zdWJhcnJheV90b19qc2J5dGVzLCBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYmxpdF9ieXRlcyhzMSwgaTEsIHMyLCBpMiwgbGVuKSB7XG4gIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIGlmICgoaTIgPT0gMCkgJiZcbiAgICAgIChsZW4gPj0gczIubCB8fCAoczIudCA9PSAyIC8qIFBBUlRJQUwgKi8gJiYgbGVuID49IHMyLmMubGVuZ3RoKSkpIHtcbiAgICBzMi5jID0gKHMxLnQgPT0gNCAvKiBBUlJBWSAqLyk/XG4gICAgICBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMoczEuYywgaTEsIGxlbik6XG4gICAgICAoaTEgPT0gMCAmJiBzMS5jLmxlbmd0aCA9PSBsZW4pP3MxLmM6czEuYy5zdWJzdHIoaTEsIGxlbik7XG4gICAgczIudCA9IChzMi5jLmxlbmd0aCA9PSBzMi5sKT8wIC8qIEJZVEVTIHwgVU5LT1dOICovIDoyOyAvKiBQQVJUSUFMICovXG4gIH0gZWxzZSBpZiAoczIudCA9PSAyIC8qIFBBUlRJQUwgKi8gJiYgaTIgPT0gczIuYy5sZW5ndGgpIHtcbiAgICBzMi5jICs9IChzMS50ID09IDQgLyogQVJSQVkgKi8pP1xuICAgICAgY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKHMxLmMsIGkxLCBsZW4pOlxuICAgICAgKGkxID09IDAgJiYgczEuYy5sZW5ndGggPT0gbGVuKT9zMS5jOnMxLmMuc3Vic3RyKGkxLCBsZW4pO1xuICAgIHMyLnQgPSAoczIuYy5sZW5ndGggPT0gczIubCk/MCAvKiBCWVRFUyB8IFVOS09XTiAqLyA6MjsgLyogUEFSVElBTCAqL1xuICB9IGVsc2Uge1xuICAgIGlmIChzMi50ICE9IDQgLyogQVJSQVkgKi8pIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheShzMik7XG4gICAgdmFyIGMxID0gczEuYywgYzIgPSBzMi5jO1xuICAgIGlmIChzMS50ID09IDQgLyogQVJSQVkgKi8pIHtcbiAgICAgIGlmIChpMiA8PSBpMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBjMiBbaTIgKyBpXSA9IGMxIFtpMSArIGldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSBjMiBbaTIgKyBpXSA9IGMxIFtpMSArIGldO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbCA9IE1hdGgubWluIChsZW4sIGMxLmxlbmd0aCAtIGkxKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSBjMiBbaTIgKyBpXSA9IGMxLmNoYXJDb2RlQXQoaTEgKyBpKTtcbiAgICAgIGZvciAoOyBpIDwgbGVuOyBpKyspIGMyIFtpMiArIGldID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmxpdF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYmxpdF9zdHJpbmcoYSxiLGMsZCxlKSB7XG4gIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX3N0cmluZyhhKSxiLGMsZCxlKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ieXRlc19sZW5ndGggY29uc3RcbmZ1bmN0aW9uIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHMpIHsgcmV0dXJuIHMubCB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSkge1xuICByZXR1cm4gcy5jaGFyQ29kZUF0KGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXQgKHMsIGksIGMpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3RyaW5nX3Vuc2FmZV9zZXRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykge1xuICByZXR1cm4gcy5sZW5ndGhcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfY29tcGFyZSBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19jb21wYXJlKHMxLCBzMikge1xuICByZXR1cm4gKHMxIDwgczIpPy0xOihzMSA+IHMyKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2VxdWFsIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2VxdWFsKHMxLCBzMikge1xuICBpZihzMSA9PT0gczIpIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIChzMSA8PSBzMik/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzdGhhbiBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIChzMSA8IHMyKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHtcbiAgKHMudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMuYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl9zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl9qc2J5dGVzKGNhbWxfanNieXRlc19vZl9zdHJpbmcocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoeCkgeyByZXR1cm4geCB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh4KSB7IHJldHVybiB4IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWksIGNhbWxfdXRmMTZfb2ZfdXRmOFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKSB7XG4gIGlmKGpzb29faXNfYXNjaWkocykpXG4gICAgcmV0dXJuIHM7XG4gIHJldHVybiBjYW1sX3V0ZjE2X29mX3V0Zjgocyk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWksIGNhbWxfdXRmOF9vZl91dGYxNiwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyAocykge1xuICBpZiAoanNvb19pc19hc2NpaShzKSlcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzKVxuICBlbHNlIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNhbWxfdXRmOF9vZl91dGYxNihzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfb2ZfanNieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl9qc2J5dGVzKHMpIHsgcmV0dXJuIG5ldyBNbEJ5dGVzKDAscyxzLmxlbmd0aCk7IH1cblxuXG4vLyBUaGUgc2VjdGlvbiBiZWxvdyBzaG91bGQgYmUgdXNlZCB3aGVuIHVzZS1qcy1zdHJpbmc9ZmFsc2VcblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQocyxpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfc2V0IChzLCBpLCBjKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQocyxpLGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGggY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgocylcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfY29tcGFyZVxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19jb21wYXJlXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19jb21wYXJlKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19jb21wYXJlKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19lcXVhbFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2VxdWFsKHMxLHMyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfbGVzc2VxdWFsXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX2xlc3NlcXVhbChzMSxzMilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc3RoYW5cbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfbGVzc3RoYW5cbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2xlc3N0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19sZXNzdGhhbihzMSxzMilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpIHsgcmV0dXJuIHMgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl9zdHJpbmcocykgeyByZXR1cm4gcyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfanNieXRlc1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzKSB7IHJldHVybiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMocyk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKSB7XG4gIChzLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gcy5jIH1cblxuLy9Qcm92aWRlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKXtcbiAgcmV0dXJuIHMudG9VdGYxNigpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyAocykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZyhzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9ieXRlc1xuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9pc19tbF9ieXRlcyhzKSB7XG4gIHJldHVybiAocyBpbnN0YW5jZW9mIE1sQnl0ZXMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IE1sQnl0ZXMsIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfYnl0ZXNfY29udGVudChzKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICBkZWZhdWx0OiAvKiBQQVJUSUFMICovXG4gICAgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzKTtcbiAgY2FzZSAwOiAvKiBCWVRFUyAqL1xuICAgIHJldHVybiBzLmM7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcy5jXG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9zdHJpbmdcbi8vUmVxdWlyZXM6IGpzb29faXNfYXNjaWlcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9pc19tbF9zdHJpbmcocykge1xuICByZXR1cm4gKHR5cGVvZiBzID09PSBcInN0cmluZ1wiICYmICEvW15cXHgwMC1cXHhmZl0vLnRlc3QocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX21sX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlc1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9pc19tbF9zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9pc19tbF9ieXRlcyhzKTtcbn1cblxuLy8gVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgZGVwcmVjYXRlZFxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2J5dGVfc3RyaW5nKHMpIHsgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbmV3X3N0cmluZyAocykgeyByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19mcm9tX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RvX2pzX3N0cmluZyBtdXRhYmxlIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3RvX2pzX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfdG9fc3RyaW5nIChzKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhzKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2Zfc3RyaW5nKHgpIHsgcmV0dXJuIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHgpIH1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9hcnJheV9vZl9ieXRlcyh4KSB7IHJldHVybiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHgpIH1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUmFpc2UgZXhjZXB0aW9uXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfY29uc3RhbnQgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9jb25zdGFudCAodGFnKSB7IHRocm93IHRhZzsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3dpdGhfYXJnIChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yYWlzZV93aXRoX2FyZyAodGFnLCBhcmcpIHsgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLCB0YWcsIGFyZ10pOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfd2l0aF9hcmdzIChjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9yYWlzZV93aXRoX2FyZ3MgKHRhZywgYXJncykgeyB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoWzAsIHRhZ10uY29uY2F0KGFyZ3MpKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfYXJnLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nICh0YWcsIG1zZykge1xuICBjYW1sX3JhaXNlX3dpdGhfYXJnICh0YWcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobXNnKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmFpbHdpdGggKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9mYWlsd2l0aCAobXNnKSB7XG4gIGlmKCFjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUpXG4gICAgY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlPVsyNDgsY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIkZhaWx1cmVcIiksLTNdO1xuICBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nKGNhbWxfZ2xvYmFsX2RhdGEuRmFpbHVyZSwgbXNnKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLkludmFsaWRfYXJndW1lbnQsIG1zZyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfY29uc3RhbnQsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUgKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuRW5kX29mX2ZpbGUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLkRpdmlzaW9uX2J5X3plcm8pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9jb25zdGFudCwgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub3RfZm91bmQgKCkge1xuICBjYW1sX3JhaXNlX2NvbnN0YW50KGNhbWxfZ2xvYmFsX2RhdGEuTm90X2ZvdW5kKTsgfVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ib3VuZF9lcnJvciAoKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsX2dlbiAoY29uc3QsIHNoYWxsb3cpXG4vL0lmOiAhZWZmZWN0c1xuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSAoZi5sID49IDApP2YubDooZi5sID0gZi5sZW5ndGgpO1xuICB2YXIgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgZCA9IG4gLSBhcmdzTGVuO1xuICBpZiAoZCA9PSAwKVxuICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICBlbHNlIGlmIChkIDwgMCkge1xuICAgIHZhciBnID0gZi5hcHBseShudWxsLGFyZ3Muc2xpY2UoMCxuKSk7XG4gICAgaWYodHlwZW9mIGcgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGc7XG4gICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZyxhcmdzLnNsaWNlKG4pKTtcbiAgfVxuICBlbHNlIHtcbiAgICBzd2l0Y2ggKGQpIHtcbiAgICBjYXNlIDE6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgpe1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDEpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIG5hcmdzKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIDI6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHkpe1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDIpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIG5hcmdzKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICgpe1xuICAgICAgICB2YXIgZXh0cmFfYXJncyA9IChhcmd1bWVudHMubGVuZ3RoID09IDApPzE6YXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3MubGVuZ3RoK2V4dHJhX2FyZ3MpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIG5hcmdzW2FyZ3MubGVuZ3RoK2ldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihmLCBuYXJncylcbiAgICAgIH07XG4gICAgfX1cbiAgICBnLmwgPSBkO1xuICAgIHJldHVybiBnO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbF9nZW4gKGNvbnN0LCBzaGFsbG93KVxuLy9JZjogZWZmZWN0c1xuLy9XZWFrZGVmXG5mdW5jdGlvbiBjYW1sX2NhbGxfZ2VuKGYsIGFyZ3MpIHtcbiAgdmFyIG4gPSAoZi5sID49IDApP2YubDooZi5sID0gZi5sZW5ndGgpO1xuICB2YXIgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgZCA9IG4gLSBhcmdzTGVuO1xuICBpZiAoZCA9PSAwKSB7XG4gICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gIH0gZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgcmVzdCA9IGFyZ3Muc2xpY2UobiAtIDEpO1xuICAgIHZhciBrID0gYXJncyBbYXJnc0xlbiAtIDFdO1xuICAgIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIG4pO1xuICAgIGFyZ3NbbiAtIDFdID0gZnVuY3Rpb24gKGcpIHtcbiAgICAgIGlmICh0eXBlb2YgZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gayhnKTtcbiAgICAgIHZhciBhcmdzID0gcmVzdC5zbGljZSgpO1xuICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdID0gaztcbiAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGcsIGFyZ3MpOyB9O1xuICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIGFyZ3NMZW4tLTtcbiAgICB2YXIgayA9IGFyZ3MgW2FyZ3NMZW5dO1xuICAgIHN3aXRjaCAoZCkge1xuICAgIGNhc2UgMToge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSl7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMik7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgbmFyZ3MpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgMjoge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoeCwgeSwgeil7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzTGVuICsgMyk7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzTGVuOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIG5hcmdzW2FyZ3NMZW5dID0geDtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDFdID0geTtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbiArIDJdID0gejtcbiAgICAgICAgcmV0dXJuIGYuYXBwbHkobnVsbCwgbmFyZ3MpXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKCl7XG4gICAgICAgIHZhciBleHRyYV9hcmdzID0gKGFyZ3VtZW50cy5sZW5ndGggPT0gMCk/MTphcmd1bWVudHMubGVuZ3RoO1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIGV4dHJhX2FyZ3MpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrIClcbiAgICAgICAgICBuYXJnc1thcmdzTGVuICsgaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGYsIG5hcmdzKVxuICAgICAgfTtcbiAgICB9fVxuICAgIGcubCA9IGQgKyAxO1xuICAgIHJldHVybiBrKGcpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG52YXIgY2FtbF9uYW1lZF92YWx1ZXMgPSB7fTtcblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZSAoY29uc3QsbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlKG5tLHYpIHtcbiAgY2FtbF9uYW1lZF92YWx1ZXNbY2FtbF9qc2J5dGVzX29mX3N0cmluZyhubSldID0gdjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmFtZWRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWVzXG5mdW5jdGlvbiBjYW1sX25hbWVkX3ZhbHVlKG5tKSB7XG4gIHJldHVybiBjYW1sX25hbWVkX3ZhbHVlc1tubV1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9nbG9iYWxfZGF0YVxudmFyIGNhbWxfZ2xvYmFsX2RhdGEgPSBbMF07XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnVpbGRfc3ltYm9sc1xuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnVpbGRfc3ltYm9scyh0b2MpIHtcbiAgdmFyIHN5bWI7XG4gIHdoaWxlKHRvYykge1xuICAgIGlmKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHRvY1sxXVsxXSkgPT0gXCJTWUpTXCIpIHtcbiAgICAgIHN5bWIgPSB0b2NbMV1bMl07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZWxzZSB0b2MgPSB0b2NbMl1cbiAgfVxuICB2YXIgciA9IHt9O1xuICBpZihzeW1iKSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8IHN5bWIubGVuZ3RoOyBpKyspe1xuICAgICAgcltjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzeW1iW2ldWzFdKV0gPSBzeW1iW2ldWzJdXG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlZ2lzdGVyX2dsb2JhbCAoY29uc3QsIHNoYWxsb3csIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YSwgY2FtbF9jYWxsYmFjaywgY2FtbF9idWlsZF9zeW1ib2xzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3JlZ2lzdGVyX2dsb2JhbCAobiwgdiwgbmFtZV9vcHQpIHtcbiAgaWYgKG5hbWVfb3B0KSB7XG4gICAgdmFyIG5hbWUgPSBuYW1lX29wdDtcbiAgICBpZihnbG9iYWxUaGlzLnRvcGxldmVsUmVsb2MpIHtcbiAgICAgIG4gPSBjYW1sX2NhbGxiYWNrKGdsb2JhbFRoaXMudG9wbGV2ZWxSZWxvYywgW25hbWVdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2FtbF9nbG9iYWxfZGF0YS50b2MpIHtcbiAgICAgIGlmKCFjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHMpIHtcbiAgICAgICAgY2FtbF9nbG9iYWxfZGF0YS5zeW1ib2xzID0gY2FtbF9idWlsZF9zeW1ib2xzKGNhbWxfZ2xvYmFsX2RhdGEudG9jKVxuICAgICAgfVxuICAgICAgdmFyIG5pZCA9IGNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9sc1tuYW1lXVxuICAgICAgaWYobmlkID49IDApXG4gICAgICAgIG4gPSBuaWRcbiAgICAgIGVsc2Uge1xuICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9yZWdpc3Rlcl9nbG9iYWw6IGNhbm5vdCBsb2NhdGUgXCIgKyBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2FtbF9nbG9iYWxfZGF0YVtuICsgMV0gPSB2O1xuICBpZihuYW1lX29wdCkgY2FtbF9nbG9iYWxfZGF0YVtuYW1lX29wdF0gPSB2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9nbG9iYWxfZGF0YSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2dldF9nbG9iYWxfZGF0YSAoKSB7IHJldHVybiBjYW1sX2dsb2JhbF9kYXRhOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfcHJpbnRhYmxlIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfaXNfcHJpbnRhYmxlKGMpIHsgcmV0dXJuICsoYyA+IDMxICYmIGMgPCAxMjcpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfcHJpbnRfc3RhdHNcbmZ1bmN0aW9uIGNhbWxfbWF5YmVfcHJpbnRfc3RhdHModW5pdCkgeyByZXR1cm4gMCB9XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIFN5c1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3N5c19lcnJvciAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nLCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX3N5c19lcnJvciAobXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5TeXNfZXJyb3IsIG1zZyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2V4aXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9zeXNfZXhpdCAoY29kZSkge1xuICBpZihnbG9iYWxUaGlzLnF1aXQpIGdsb2JhbFRoaXMucXVpdChjb2RlKTtcbiAgLy9ub2RlanNcbiAgaWYoZ2xvYmFsVGhpcy5wcm9jZXNzICYmIGdsb2JhbFRoaXMucHJvY2Vzcy5leGl0KVxuICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5leGl0KGNvZGUpO1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJGdW5jdGlvbiAnZXhpdCcgbm90IGltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uKGV4bil7XG4gIHN3aXRjaChleG5bMl0pIHtcbiAgY2FzZSAtODogLy8gTWF0Y2hfZmFpbHVyZVxuICBjYXNlIC0xMTogLy8gQXNzZXJ0X2ZhaWx1cmVcbiAgY2FzZSAtMTI6IC8vIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlXG4gICAgcmV0dXJuIDE7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfZXhjZXB0aW9uXG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9leGNlcHRpb24oZXhuKXtcbiAgdmFyIHIgPSBcIlwiO1xuICBpZihleG5bMF0gPT0gMCkge1xuICAgIHIgKz0gZXhuWzFdWzFdO1xuICAgIGlmKGV4bi5sZW5ndGggPT0gMyAmJiBleG5bMl1bMF0gPT0gMCAmJiBjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uKGV4blsxXSkpIHtcblxuICAgICAgdmFyIGJ1Y2tldCA9IGV4blsyXTtcbiAgICAgIHZhciBzdGFydCA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFydCA9IDJcbiAgICAgIHZhciBidWNrZXQgPSBleG47XG4gICAgfVxuICAgIHIgKz0gXCIoXCI7XG4gICAgZm9yKHZhciBpID0gc3RhcnQ7IGkgPCBidWNrZXQubGVuZ3RoOyBpICsrKXtcbiAgICAgIGlmKGkgPiBzdGFydCkgcis9XCIsIFwiO1xuICAgICAgdmFyIHYgPSBidWNrZXRbaV1cbiAgICAgIGlmKHR5cGVvZiB2ID09IFwibnVtYmVyXCIpXG4gICAgICAgIHIrPSB2LnRvU3RyaW5nKCk7XG4gICAgICBlbHNlIGlmKHYgaW5zdGFuY2VvZiBNbEJ5dGVzKXtcbiAgICAgICAgcis9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfVxuICAgICAgZWxzZSBpZih0eXBlb2YgdiA9PSBcInN0cmluZ1wiKXtcbiAgICAgICAgcis9ICdcIicgKyB2LnRvU3RyaW5nKCkgKyAnXCInO1xuICAgICAgfVxuICAgICAgZWxzZSByICs9IFwiX1wiO1xuICAgIH1cbiAgICByICs9IFwiKVwiXG4gIH0gZWxzZSBpZiAoZXhuWzBdID09IDI0OCl7XG4gICAgciArPSBleG5bMV1cbiAgfVxuICByZXR1cm4gclxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9mb3JtYXRfZXhjZXB0aW9uLCBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihlcnIpe1xuICBpZihlcnIgaW5zdGFuY2VvZiBBcnJheSAmJiAoZXJyWzBdID09IDAgfHwgZXJyWzBdID09IDI0OCkpIHtcbiAgICB2YXIgaGFuZGxlciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJQcmludGV4Yy5oYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uXCIpO1xuICAgIGlmKGhhbmRsZXIpIGNhbWxfY2FsbGJhY2soaGFuZGxlciwgW2VycixmYWxzZV0pO1xuICAgIGVsc2Uge1xuICAgICAgdmFyIG1zZyA9IGNhbWxfZm9ybWF0X2V4Y2VwdGlvbihlcnIpO1xuICAgICAgdmFyIGF0X2V4aXQgPSBjYW1sX25hbWVkX3ZhbHVlKFwiUGVydmFzaXZlcy5kb19hdF9leGl0XCIpO1xuICAgICAgaWYoYXRfZXhpdCkgY2FtbF9jYWxsYmFjayhhdF9leGl0LCBbMF0pO1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gXCIgKyBtc2cgKyBcIlxcblwiKTtcbiAgICAgIGlmKGVyci5qc19lcnJvcikgdGhyb3cgZXJyLmpzX2Vycm9yO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBlcnJcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NldF9zdGF0aWNfZW52XG5mdW5jdGlvbiBjYW1sX3NldF9zdGF0aWNfZW52KGssdil7XG4gIGlmKCFnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudilcbiAgICBnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudiA9IHt9XG4gIGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52W2tdID0gdjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fc3lzX2dldGVudiAoY29uc3QpXG5mdW5jdGlvbiBqc29vX3N5c19nZXRlbnYobikge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgLy9ub2RlanMgZW52XG4gIGlmKHByb2Nlc3NcbiAgICAgJiYgcHJvY2Vzcy5lbnZcbiAgICAgJiYgcHJvY2Vzcy5lbnZbbl0gIT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBwcm9jZXNzLmVudltuXTtcbiAgaWYoZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnZcbiAgICAgJiYgZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnZbbl0pXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52W25dXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldGVudiAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGVudiAobmFtZSkge1xuICB2YXIgciA9IGpzb29fc3lzX2dldGVudihjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lKSk7XG4gIGlmKHIgPT09IHVuZGVmaW5lZClcbiAgICBjYW1sX3JhaXNlX25vdF9mb3VuZCAoKTtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnZcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2dldGVudlxuZnVuY3Rpb24gY2FtbF9zeXNfdW5zYWZlX2dldGVudihuYW1lKXtcbiAgcmV0dXJuIGNhbWxfc3lzX2dldGVudiAobmFtZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJndlxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbnZhciBjYW1sX2FyZ3YgPSAoKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIHZhciBtYWluID0gXCJhLm91dFwiO1xuICB2YXIgYXJncyA9IFtdXG5cbiAgaWYocHJvY2Vzc1xuICAgICAmJiBwcm9jZXNzLmFyZ3ZcbiAgICAgJiYgcHJvY2Vzcy5hcmd2Lmxlbmd0aCA+IDEpIHtcbiAgICB2YXIgYXJndiA9IHByb2Nlc3MuYXJndlxuICAgIC8vbm9kZWpzXG4gICAgbWFpbiA9IGFyZ3ZbMV07XG4gICAgYXJncyA9IGFyZ3Yuc2xpY2UoMik7XG4gIH1cblxuICB2YXIgcCA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKG1haW4pO1xuICB2YXIgYXJnczIgPSBbMCwgcF07XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKVxuICAgIGFyZ3MyLnB1c2goY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoYXJnc1tpXSkpO1xuICByZXR1cm4gYXJnczI7XG59KSgpKVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG52YXIgY2FtbF9leGVjdXRhYmxlX25hbWUgPSBjYW1sX2FyZ3ZbMV1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfZ2V0X2FyZ3YgKGEpIHtcbiAgcmV0dXJuIFswLCBjYW1sX2FyZ3ZbMV0sIGNhbWxfYXJndl07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfYXJndiAoYSkge1xuICByZXR1cm4gY2FtbF9hcmd2O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19tb2RpZnlfYXJndlxuLy9SZXF1aXJlczogY2FtbF9hcmd2XG5mdW5jdGlvbiBjYW1sX3N5c19tb2RpZnlfYXJndihhcmcpe1xuICBjYW1sX2FyZ3YgPSBhcmc7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19leGVjdXRhYmxlX25hbWUgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfZXhlY3V0YWJsZV9uYW1lXG5mdW5jdGlvbiBjYW1sX3N5c19leGVjdXRhYmxlX25hbWUoYSl7XG4gIHJldHVybiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKGNtZCl7XG4gIHZhciBjbWQgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhjbWQpO1xuICBpZiAodHlwZW9mIHJlcXVpcmUgIT0gXCJ1bmRlZmluZWRcIil7XG4gICAgdmFyIGNoaWxkX3Byb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG4gICAgaWYoY2hpbGRfcHJvY2VzcyAmJiBjaGlsZF9wcm9jZXNzLmV4ZWNTeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjbWQse3N0ZGlvOiAnaW5oZXJpdCd9KTtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIH1cbiAgfVxuICBlbHNlIHJldHVybiAxMjc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQoY21kKXtcbiAgcmV0dXJuIDEyNztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZSBtdXRhYmxlXG52YXIgY2FtbF9pbml0aWFsX3RpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpICogMC4wMDE7XG5mdW5jdGlvbiBjYW1sX3N5c190aW1lICgpIHtcbiAgdmFyIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gIHJldHVybiBub3cgKiAwLjAwMSAtIGNhbWxfaW5pdGlhbF90aW1lO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW5cbi8vUmVxdWlyZXM6IGNhbWxfc3lzX3RpbWVcbmZ1bmN0aW9uIGNhbWxfc3lzX3RpbWVfaW5jbHVkZV9jaGlsZHJlbihiKSB7XG4gIHJldHVybiBjYW1sX3N5c190aW1lKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JhbmRvbV9zZWVkIG11dGFibGVcbi8vVGhlIGZ1bmN0aW9uIG5lZWRzIHRvIHJldHVybiBhbiBhcnJheSBzaW5jZSBPQ2FtbCA0LjAuLi5cbmZ1bmN0aW9uIGNhbWxfc3lzX3JhbmRvbV9zZWVkICgpIHtcbiAgaWYoZ2xvYmFsVGhpcy5jcnlwdG8pIHtcbiAgICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKXtcbiAgICAgIC8vIFdlYmJyb3dzZXJzXG4gICAgICB2YXIgYSA9IG5ldyBVaW50MzJBcnJheSgxKTtcbiAgICAgIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhKTtcbiAgICAgIHJldHVybiBbMCxhWzBdXTtcbiAgICB9IGVsc2UgaWYoZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpe1xuICAgICAgLy8gTm9kZWpzXG4gICAgICB2YXIgYnVmZiA9IGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbUJ5dGVzKDQpO1xuICAgICAgdmFyIGEgPSBuZXcgVWludDMyQXJyYXkoYnVmZik7XG4gICAgICByZXR1cm4gWzAsYVswXV07XG4gICAgfVxuICB9XG4gIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICB2YXIgeCA9IG5vd14weGZmZmZmZmZmKk1hdGgucmFuZG9tKCk7XG4gIHJldHVybiBbMCx4XTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfYmlnX2VuZGlhbiBjb25zdFxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfYmlnX2VuZGlhbiAoKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X3dvcmRfc2l6ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfd29yZF9zaXplICgpIHsgcmV0dXJuIDMyOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2ludF9zaXplIGNvbnN0XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9pbnRfc2l6ZSAoKSB7IHJldHVybiAzMjsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9tYXhfd29zaXplIGNvbnN0XG4vLyBtYXhfaW50IC8gNCBzbyB0aGF0IHRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgb3ZlcmZsb3dcbi8vbGV0IG1heF9zdHJpbmdfbGVuZ3RoID0gd29yZF9zaXplIC8gOCAqIG1heF9hcnJheV9sZW5ndGggLSAxOztcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X21heF93b3NpemUgKCkgeyByZXR1cm4gKDB4N0ZGRkZGRkYvNCkgfCAwO31cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3VuaXggY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV91bml4ICgpIHsgcmV0dXJuIG9zX3R5cGUgPT0gXCJVbml4XCIgPyAxIDogMDsgfVxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyIGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIgKCkgeyByZXR1cm4gb3NfdHlwZSA9PSBcIldpbjMyXCIgPyAxIDogMDsgfVxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3Rfb3N0eXBlX2N5Z3dpbiBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX2N5Z3dpbiAoKSB7IHJldHVybiBvc190eXBlID09IFwiQ3lnd2luXCIgPyAxIDogMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9iYWNrZW5kX3R5cGUgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2JhY2tlbmRfdHlwZSAoKSB7XG4gIHJldHVybiBbMCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcImpzX29mX29jYW1sXCIpXTtcbn1cblxuLy9Qcm92aWRlczogb3NfdHlwZVxudmFyIG9zX3R5cGUgPSAoZ2xvYmFsVGhpcy5wcm9jZXNzICYmXG4gICAgICAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MucGxhdGZvcm0gJiZcbiAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSA9PSBcIndpbjMyXCIpID8gXCJDeWd3aW5cIiA6IFwiVW5peFwiO1xuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldF9jb25maWcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldF9jb25maWcgKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMob3NfdHlwZSksIDMyLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNhdHR5XG5mdW5jdGlvbiBjYW1sX3N5c19pc2F0dHkoX2NoYW4pIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV92YXJpYW50XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfdmFyaWFudChfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9wYXJhbWV0ZXJzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfcGFyYW1ldGVycyhfdW5pdCkge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2luc3RhbGxfc2lnbmFsX2hhbmRsZXIoKXtyZXR1cm4gMH1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG52YXIgY2FtbF9ydW50aW1lX3dhcm5pbmdzID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1xuLy9SZXF1aXJlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG5mdW5jdGlvbiBjYW1sX21sX2VuYWJsZV9ydW50aW1lX3dhcm5pbmdzIChib29sKSB7XG4gIGNhbWxfcnVudGltZV93YXJuaW5ncyA9IGJvb2w7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZFxuLy9SZXF1aXJlczogY2FtbF9ydW50aW1lX3dhcm5pbmdzXG5mdW5jdGlvbiBjYW1sX21sX3J1bnRpbWVfd2FybmluZ3NfZW5hYmxlZCAoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfcnVudGltZV93YXJuaW5ncztcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NwYWNldGltZV9lbmFibGVkIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfc3BhY2V0aW1lX2VuYWJsZWQoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X25ha2VkX3BvaW50ZXJzX2NoZWNrZWQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfbmFrZWRfcG9pbnRlcnNfY2hlY2tlZChfdW5pdCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9jaGFubmVsX2Zvcl9zcGFjZXRpbWUgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9jaGFubmVsX2Zvcl9zcGFjZXRpbWUoX2NoYW5uZWwpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3BhY2V0aW1lX29ubHlfd29ya3NfZm9yX25hdGl2ZV9jb2RlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX3NwYWNldGltZV9vbmx5X3dvcmtzX2Zvcl9uYXRpdmVfY29kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcIlNwYWNldGltZSBwcm9maWxpbmcgb25seSB3b3JrcyBmb3IgbmF0aXZlIGNvZGVcIik7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmlzRmlsZShyb290LnJlc3QpO1xufVxuLy9BbHdheXNcbi8vUmVxdWlyZXM6IGNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyKCkge1xuICB2YXIgcHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcztcbiAgaWYocHJvY2VzcyAmJiBwcm9jZXNzLm9uKSB7XG4gICAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBmdW5jdGlvbiAoZXJyLCBvcmlnaW4pIHtcbiAgICAgIGNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uKGVycik7XG4gICAgICBwcm9jZXNzLmV4aXQgKDIpO1xuICAgIH0pXG4gIH1cbiAgZWxzZSBpZihnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbihldmVudCl7XG4gICAgICBpZihldmVudC5lcnJvcil7XG4gICAgICAgIGNhbWxfZmF0YWxfdW5jYXVnaHRfZXhjZXB0aW9uKGV2ZW50LmVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuY2FtbF9zZXR1cF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlcigpO1xuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG52YXIgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcgPSBGTEFHKFwid2l0aC1qcy1lcnJvclwiKTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHIgPSBqc29vX3N5c19nZXRlbnYoXCJPQ0FNTFJVTlBBUkFNXCIpXG4gIGlmKHIgIT09IHVuZGVmaW5lZCl7XG4gICAgdmFyIGwgPSByLnNwbGl0KFwiLFwiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbC5sZW5ndGg7IGkrKyl7XG4gICAgICBpZihsW2ldID09IFwiYlwiKSB7IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnID0gMTsgYnJlYWsgfVxuICAgICAgZWxzZSBpZiAobFtpXS5zdGFydHNXaXRoKFwiYj1cIikpIHtcbiAgICAgICAgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcgPSArKGxbaV0uc2xpY2UoMikpfVxuICAgICAgZWxzZSBjb250aW51ZTtcbiAgICB9XG4gIH1cbn0pICgpXG5cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyBjb25zdFxuZnVuY3Rpb24gY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1cyAoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2JhY2t0cmFjZV9zdGF0dXNcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnXG5mdW5jdGlvbiBjYW1sX2JhY2t0cmFjZV9zdGF0dXMgKF91bml0KSB7IHJldHVybiBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyA/IDEgOiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fYmFja3RyYWNlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2dldF9leGNlcHRpb25fYmFja3RyYWNlICgpIHsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYWNlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSAoKSB7IHJldHVybiBbMF07IH1cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWdcbmZ1bmN0aW9uIGNhbWxfcmVjb3JkX2JhY2t0cmFjZSAoYikgeyBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyA9IGI7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgKCkgeyByZXR1cm4gWzBdOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3Jhd19iYWNrdHJhY2VfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX3Jhd19iYWNrdHJhY2VfbGVuZ3RoKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdCgpIHsgcmV0dXJuIDAgfVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QgKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZV9zbG90OiBpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfcmVzdG9yZV9yYXdfYmFja3RyYWNlKGV4biwgYnQpIHsgcmV0dXJuIDAgfVxuLy9Qcm92aWRlczogY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2sgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrICgpIHsgcmV0dXJuIFswXTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90KCl7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2NvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90XCIpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgbGlicmFyeVxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEpzbGliXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfcHVyZV9leHByIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3B1cmVfZXhwciAoZikgeyByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBbMF0pOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfc2V0IChtdXRhYmxlLCBjb25zdCwgbXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfanNfc2V0KG8sZix2KSB7IG9bZl09djtyZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0IChtdXRhYmxlLCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0KG8sZikgeyByZXR1cm4gb1tmXTsgfVxuLy9Qcm92aWRlczogY2FtbF9qc19kZWxldGUgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19kZWxldGUobyxmKSB7IGRlbGV0ZSBvW2ZdOyByZXR1cm4gMH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19pbnN0YW5jZW9mIChjb25zdCwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2luc3RhbmNlb2YobyxjKSB7IHJldHVybiAobyBpbnN0YW5jZW9mIGMpID8gMSA6IDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc190eXBlb2YgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190eXBlb2YobykgeyByZXR1cm4gdHlwZW9mIG87IH1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVcbmZ1bmN0aW9uIGNhbWxfdHJhbXBvbGluZShyZXMpIHtcbiAgdmFyIGMgPSAxO1xuICB3aGlsZShyZXMgJiYgcmVzLmpvb190cmFtcCl7XG4gICAgcmVzID0gcmVzLmpvb190cmFtcC5hcHBseShudWxsLCByZXMuam9vX2FyZ3MpO1xuICAgIGMrKztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfdHJhbXBvbGluZV9yZXR1cm5cbmZ1bmN0aW9uIGNhbWxfdHJhbXBvbGluZV9yZXR1cm4oZixhcmdzKSB7XG4gIHJldHVybiB7am9vX3RyYW1wOmYsam9vX2FyZ3M6YXJnc307XG59XG5cbi8vUHJvdmlkZXM6Y2FtbF9zdGFja19kZXB0aFxuLy9JZjogZWZmZWN0c1xudmFyIGNhbWxfc3RhY2tfZGVwdGggPSAwO1xuXG4vL1Byb3ZpZGVzOmNhbWxfc3RhY2tfY2hlY2tfZGVwdGhcbi8vSWY6IGVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9zdGFja19kZXB0aFxuZnVuY3Rpb24gY2FtbF9zdGFja19jaGVja19kZXB0aCgpIHtcbiAgICByZXR1cm4gLS1jYW1sX3N0YWNrX2RlcHRoID4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jYWxsYmFja1xuLy9JZjogIWVmZmVjdHNcbi8vUmVxdWlyZXM6Y2FtbF9jYWxsX2dlblxudmFyIGNhbWxfY2FsbGJhY2sgPSBjYW1sX2NhbGxfZ2VuO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxiYWNrXG4vL0lmOiBlZmZlY3RzXG4vL1JlcXVpcmVzOmNhbWxfc3RhY2tfZGVwdGgsIGNhbWxfY2FsbF9nZW4sIGNhbWxfZXhuX3N0YWNrLCBjYW1sX2ZpYmVyX3N0YWNrLCBjYW1sX3dyYXBfZXhjZXB0aW9uLCBjYW1sX3Jlc3VtZV9zdGFjaywgY2FtbF9mcmVzaF9vb19pZCwgY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9yYWlzZV93aXRoX2FyZywgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9jb25zdGFudFxuZnVuY3Rpb24gY2FtbF9jYWxsYmFjayhmLGFyZ3MpIHtcbiAgZnVuY3Rpb24gdW5jYXVnaHRfZWZmZWN0X2hhbmRsZXIoZWZmLGssbXMpIHtcbiAgICAvLyBSZXN1bWVzIHRoZSBjb250aW51YXRpb24gayBieSByYWlzaW5nIGV4Y2VwdGlvbiBVbmhhbmRsZWQuXG4gICAgY2FtbF9yZXN1bWVfc3RhY2soa1sxXSxtcyk7XG4gICAgdmFyIGV4biA9IGNhbWxfbmFtZWRfdmFsdWUoXCJFZmZlY3QuVW5oYW5kbGVkXCIpO1xuICAgIGlmKGV4bikgY2FtbF9yYWlzZV93aXRoX2FyZyhleG4sIGVmZik7XG4gICAgZWxzZSB7XG4gICAgICBleG4gPSBbMjQ4LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJFZmZlY3QuVW5oYW5kbGVkXCIpLCBjYW1sX2ZyZXNoX29vX2lkKDApXTtcbiAgICAgIGNhbWxfcmFpc2VfY29uc3RhbnQoZXhuKTtcbiAgICB9XG4gIH1cbiAgdmFyIHNhdmVkX3N0YWNrX2RlcHRoID0gY2FtbF9zdGFja19kZXB0aDtcbiAgdmFyIHNhdmVkX2V4bl9zdGFjayA9IGNhbWxfZXhuX3N0YWNrO1xuICB2YXIgc2F2ZWRfZmliZXJfc3RhY2sgPSBjYW1sX2ZpYmVyX3N0YWNrO1xuICB0cnkge1xuICAgIGNhbWxfZXhuX3N0YWNrID0gMDtcbiAgICBjYW1sX2ZpYmVyX3N0YWNrID1cbiAgICAgIHtoOlswLCAwLCAwLCB1bmNhdWdodF9lZmZlY3RfaGFuZGxlcl0sIHI6e2s6MCwgeDowLCBlOjB9fTtcbiAgICB2YXIgcmVzID0ge2pvb190cmFtcDogZixcbiAgICAgICAgICAgICAgIGpvb19hcmdzOiBhcmdzLmNvbmNhdChmdW5jdGlvbiAoeCl7cmV0dXJuIHg7fSl9O1xuICAgIGRvIHtcbiAgICAgIGNhbWxfc3RhY2tfZGVwdGggPSA0MDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcyA9IGNhbWxfY2FsbF9nZW4ocmVzLmpvb190cmFtcCwgcmVzLmpvb19hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLyogSGFuZGxlIGV4Y2VwdGlvbiBjb21pbmcgZnJvbSBKYXZhU2NyaXB0IG9yIGZyb20gdGhlIHJ1bnRpbWUuICovXG4gICAgICAgIGlmICghY2FtbF9leG5fc3RhY2spIHRocm93IGU7XG4gICAgICAgIHZhciBoYW5kbGVyID0gY2FtbF9leG5fc3RhY2tbMV07XG4gICAgICAgIGNhbWxfZXhuX3N0YWNrID0gY2FtbF9leG5fc3RhY2tbMl07XG4gICAgICAgIHJlcyA9IHtqb29fdHJhbXA6IGhhbmRsZXIsXG4gICAgICAgICAgICAgICBqb29fYXJnczogW2NhbWxfd3JhcF9leGNlcHRpb24oZSldfTtcbiAgICAgIH1cbiAgICB9IHdoaWxlKHJlcyAmJiByZXMuam9vX2FyZ3MpXG4gIH0gZmluYWxseSB7XG4gICAgY2FtbF9zdGFja19kZXB0aCA9IHNhdmVkX3N0YWNrX2RlcHRoO1xuICAgIGNhbWxfZXhuX3N0YWNrID0gc2F2ZWRfZXhuX3N0YWNrO1xuICAgIGNhbWxfZmliZXJfc3RhY2sgPSBzYXZlZF9maWJlcl9zdGFjaztcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2pzXG5mdW5jdGlvbiBjYW1sX2lzX2pzKCkge1xuICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc29vX2ZsYWdzX3VzZV9qc19zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nKHVuaXQpe1xuICByZXR1cm4gRkxBRyhcInVzZS1qcy1zdHJpbmdcIilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc29vX2ZsYWdzX2VmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNvb19mbGFnc19lZmZlY3RzKHVuaXQpe1xuICByZXR1cm4gRkxBRyhcImVmZmVjdHNcIilcbn1cblxuLy9Qcm92aWRlczogY2FtbF93cmFwX2V4Y2VwdGlvbiBjb25zdCAobXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsY2FtbF9uYW1lZF92YWx1ZVxuZnVuY3Rpb24gY2FtbF93cmFwX2V4Y2VwdGlvbihlKSB7XG4gIGlmIChGTEFHKFwiZXhjd3JhcFwiKSkge1xuICAgIGlmKGUgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGU7XG4gICAgdmFyIGV4bjtcbiAgICAvL1N0YWNrX292ZXJmbG93OiBjaHJvbWUsIHNhZmFyaVxuICAgIGlmKGdsb2JhbFRoaXMuUmFuZ2VFcnJvclxuICAgICAgICYmIGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLlJhbmdlRXJyb3JcbiAgICAgICAmJiBlLm1lc3NhZ2VcbiAgICAgICAmJiBlLm1lc3NhZ2UubWF0Y2goL21heGltdW0gY2FsbCBzdGFjay9pKSlcbiAgICAgIGV4biA9IGNhbWxfZ2xvYmFsX2RhdGEuU3RhY2tfb3ZlcmZsb3c7XG4gICAgLy9TdGFja19vdmVyZmxvdzogZmlyZWZveFxuICAgIGVsc2UgaWYoZ2xvYmFsVGhpcy5JbnRlcm5hbEVycm9yXG4gICAgICAgJiYgZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvclxuICAgICAgICYmIGUubWVzc2FnZVxuICAgICAgICYmIGUubWVzc2FnZS5tYXRjaCgvdG9vIG11Y2ggcmVjdXJzaW9uL2kpKVxuICAgICAgZXhuID0gY2FtbF9nbG9iYWxfZGF0YS5TdGFja19vdmVyZmxvdztcbiAgICAvL1dyYXAgRXJyb3IgaW4gSnMuRXJyb3IgZXhjZXB0aW9uXG4gICAgZWxzZSBpZihlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvciAmJiBjYW1sX25hbWVkX3ZhbHVlKFwianNFcnJvclwiKSlcbiAgICAgIGV4biA9IFswLGNhbWxfbmFtZWRfdmFsdWUoXCJqc0Vycm9yXCIpLGVdO1xuICAgIGVsc2VcbiAgICAgIC8vZmFsbGJhY2s6IHdyYXBwZWQgaW4gRmFpbHVyZVxuICAgICAgZXhuID0gWzAsY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlLGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIChTdHJpbmcoZSkpXTtcbiAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYW4gZXJyb3IgYXQgaGFuZCwgbGV0J3MgdXNlIGl0LlxuICAgIGlmIChlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5FcnJvcilcbiAgICAgIGV4bi5qc19lcnJvciA9IGU7XG4gICAgcmV0dXJuIGV4bjtcbiAgfSBlbHNlXG4gICAgcmV0dXJuIGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnXG5mdW5jdGlvbiBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICBpZihjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZylcbiAgICByZXR1cm4gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSk7XG4gIGVsc2UgcmV0dXJuIGV4blxufVxuXG4vLyBFeHBlcmltZW50YWxcbi8vUHJvdmlkZXM6IGNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZShleG4sIGZvcmNlKSB7XG4gIC8vbmV2ZXIgcmVyYWlzZSBmb3IgY29uc3RhbnQgZXhuXG4gIGlmKCFleG4uanNfZXJyb3IgfHwgZm9yY2UgfHwgZXhuWzBdID09IDI0OCkgZXhuLmpzX2Vycm9yID0gbmV3IGdsb2JhbFRoaXMuRXJyb3IoXCJKcyBleGNlcHRpb24gY29udGFpbmluZyBiYWNrdHJhY2VcIik7XG4gIHJldHVybiBleG47XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uXG5mdW5jdGlvbiBjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmKGV4bi5qc19lcnJvcikgeyByZXR1cm4gWzAsIGV4bi5qc19lcnJvcl07IH1cbiAgcmV0dXJuIDA7XG59XG5cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fYm9vbCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fYm9vbCh4KSB7IHJldHVybiAhIXg7IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYm9vbCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2Jvb2woeCkgeyByZXR1cm4gK3g7IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9mbG9hdCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fZmxvYXQoeCkgeyByZXR1cm4geDsgfVxuLy9Qcm92aWRlczogY2FtbF9qc190b19mbG9hdCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2Zsb2F0KHgpIHsgcmV0dXJuIHg7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX2Zyb21fYXJyYXkoYSkge1xuICByZXR1cm4gYS5zbGljZSgxKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fYXJyYXkgbXV0YWJsZSAoc2hhbGxvdylcbmZ1bmN0aW9uIGNhbWxfanNfdG9fYXJyYXkoYSkge1xuICB2YXIgbGVuID0gYS5sZW5ndGg7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbisxKTtcbiAgYlswXSA9IDA7XG4gIGZvcih2YXIgaT0wO2k8bGVuO2krKykgYltpKzFdID0gYVtpXTtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGlzdF9vZl9qc19hcnJheSBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGlzdF9vZl9qc19hcnJheShhKXtcbiAgdmFyIGwgPSAwO1xuICBmb3IodmFyIGk9YS5sZW5ndGggLSAxOyBpPj0wOyBpLS0pe1xuICAgIHZhciBlID0gYVtpXTtcbiAgICBsID0gWzAsZSxsXTtcbiAgfVxuICByZXR1cm4gbFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xpc3RfdG9fanNfYXJyYXkgY29uc3QgKG11dGFibGUpXG5mdW5jdGlvbiBjYW1sX2xpc3RfdG9fanNfYXJyYXkobCl7XG4gIHZhciBhID0gW107XG4gIGZvcig7IGwgIT09IDA7IGwgPSBsWzJdKSB7XG4gICAgYS5wdXNoKGxbMV0pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3ZhciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc192YXIoeCkge1xuICB2YXIgeCA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHgpO1xuICAvL0NoZWNrcyB0aGF0IHggaGFzIHRoZSBmb3JtIGlkZW50Wy5pZGVudF0qXG4gIGlmKCF4Lm1hdGNoKC9eW2EtekEtWl8kXVthLXpBLVpfJDAtOV0qKFxcLlthLXpBLVpfJF1bYS16QS1aXyQwLTldKikqJC8pKXtcbiAgICBjb25zb2xlLmVycm9yKFwiY2FtbF9qc192YXI6IFxcXCJcIiArIHggKyBcIlxcXCIgaXMgbm90IGEgdmFsaWQgSmF2YVNjcmlwdCB2YXJpYWJsZS4gY29udGludWluZyAuLlwiKTtcbiAgICAvL2NvbnNvbGUuZXJyb3IoXCJKcy5VbnNhZmUuZXZhbF9zdHJpbmdcIilcbiAgfVxuICByZXR1cm4gZXZhbCh4KTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfY2FsbCAoY29uc3QsIG11dGFibGUsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfanNfY2FsbChmLCBvLCBhcmdzKSB7IHJldHVybiBmLmFwcGx5KG8sIGNhbWxfanNfZnJvbV9hcnJheShhcmdzKSk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnVuX2NhbGwgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX2Z1bl9jYWxsKGYsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICBjYXNlIDE6IHJldHVybiBmKCk7XG4gIGNhc2UgMjogcmV0dXJuIGYgKGFbMV0pO1xuICBjYXNlIDM6IHJldHVybiBmIChhWzFdLGFbMl0pO1xuICBjYXNlIDQ6IHJldHVybiBmIChhWzFdLGFbMl0sYVszXSk7XG4gIGNhc2UgNTogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0pO1xuICBjYXNlIDY6IHJldHVybiBmIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pO1xuICBjYXNlIDc6IHJldHVybiBmIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSk7XG4gIGNhc2UgODogcmV0dXJuIGYgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdLGFbN10pO1xuICB9XG4gIHJldHVybiBmLmFwcGx5KG51bGwsIGNhbWxfanNfZnJvbV9hcnJheShhKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX21ldGhfY2FsbCAobXV0YWJsZSwgY29uc3QsIHNoYWxsb3cpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX21ldGhfY2FsbChvLCBmLCBhcmdzKSB7XG4gIHJldHVybiBvW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGYpXS5hcHBseShvLCBjYW1sX2pzX2Zyb21fYXJyYXkoYXJncykpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19uZXcgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX25ldyhjLCBhKSB7XG4gIHN3aXRjaCAoYS5sZW5ndGgpIHtcbiAgY2FzZSAxOiByZXR1cm4gbmV3IGM7XG4gIGNhc2UgMjogcmV0dXJuIG5ldyBjIChhWzFdKTtcbiAgY2FzZSAzOiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSk7XG4gIGNhc2UgNDogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0sYVszXSk7XG4gIGNhc2UgNTogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0sYVszXSxhWzRdKTtcbiAgY2FzZSA2OiByZXR1cm4gbmV3IGMgKGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSk7XG4gIGNhc2UgNzogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSk7XG4gIGNhc2UgODogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSxhWzddKTtcbiAgfVxuICBmdW5jdGlvbiBGKCkgeyByZXR1cm4gYy5hcHBseSh0aGlzLCBjYW1sX2pzX2Zyb21fYXJyYXkoYSkpOyB9XG4gIEYucHJvdG90eXBlID0gYy5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgRjtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfb2pzX25ld19hcnIgKGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX29qc19uZXdfYXJyKGMsIGEpIHtcbiAgc3dpdGNoIChhLmxlbmd0aCkge1xuICBjYXNlIDA6IHJldHVybiBuZXcgYztcbiAgY2FzZSAxOiByZXR1cm4gbmV3IGMgKGFbMF0pO1xuICBjYXNlIDI6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdKTtcbiAgY2FzZSAzOiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSxhWzJdKTtcbiAgY2FzZSA0OiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSxhWzJdLGFbM10pO1xuICBjYXNlIDU6IHJldHVybiBuZXcgYyAoYVswXSxhWzFdLGFbMl0sYVszXSxhWzRdKTtcbiAgY2FzZSA2OiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKTtcbiAgY2FzZSA3OiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0pO1xuICB9XG4gIGZ1bmN0aW9uIEYoKSB7IHJldHVybiBjLmFwcGx5KHRoaXMsIGEpOyB9XG4gIEYucHJvdG90eXBlID0gYy5wcm90b3R5cGU7XG4gIHJldHVybiBuZXcgRjtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFjayBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2soZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmKGxlbiA+IDApe1xuICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MgPSBbdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gICAgcmV0dXJuIChyZXMgaW5zdGFuY2VvZiBGdW5jdGlvbik/Y2FtbF9qc193cmFwX2NhbGxiYWNrKHJlcyk6cmVzO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHMoZikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIFthcmdzXSk7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9jYWxsYmFja19zdHJpY3QoYXJpdHksIGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJpdHkpO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoLCBhcml0eSlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICB9O1xufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrLCBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKTtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7IH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2ssIGNhbWxfanNfd3JhcF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2soZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbiArIDEpO1xuICAgIGFyZ3NbMF0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaSsxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICB2YXIgcmVzID0gY2FtbF9jYWxsYmFjayhmLGFyZ3MpO1xuICAgIHJldHVybiAocmVzIGluc3RhbmNlb2YgRnVuY3Rpb24pP2NhbWxfanNfd3JhcF9jYWxsYmFjayhyZXMpOnJlcztcbiAgfVxufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50cyhmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsW3RoaXMsYXJnc10pO1xuICB9XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3QgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdChhcml0eSwgZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyaXR5ICsgMSk7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGgsIGFyaXR5KVxuICAgIGFyZ3NbMF0gPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIGFyZ3NbaSsxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrLCBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmUoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIC0gMTtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgICBhcmdzWzBdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2krMV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7IH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuLy9JZjogIWVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZikge1xuICByZXR1cm4gKGYubCA+PSAwKT9mLmw6KGYubCA9IGYubGVuZ3RoKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5XG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIHtcbiAgLy8gRnVuY3Rpb25zIGhhdmUgYW4gYWRkaXRpb25hbCBjb250aW51YXRpb24gcGFyYW1ldGVyLiBUaGlzIHNob3VsZFxuICAvLyBub3QgYmUgdmlzaWJsZSB3aGVuIGNhbGxpbmcgdGhlbSBmcm9tIEphdmFTY3JpcHRcbiAgcmV0dXJuICgoZi5sID49IDApP2YubDooZi5sID0gZi5sZW5ndGgpKSAtIDFcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcXVhbHMgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19lcXVhbHMgKHgsIHkpIHsgcmV0dXJuICsoeCA9PSB5KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2V2YWxfc3RyaW5nIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX2V2YWxfc3RyaW5nIChzKSB7cmV0dXJuIGV2YWwoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO31cblxuLy9Qcm92aWRlczogY2FtbF9qc19leHByIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX2V4cHIocykge1xuICBjb25zb2xlLmVycm9yKFwiY2FtbF9qc19leHByOiBmYWxsYmFjayB0byBydW50aW1lIGV2YWx1YXRpb25cXG5cIik7XG4gIHJldHVybiBldmFsKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpKTt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcHVyZV9qc19leHByIGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3B1cmVfanNfZXhwciAocyl7XG4gIGNvbnNvbGUuZXJyb3IoXCJjYW1sX3B1cmVfanNfZXhwcjogZmFsbGJhY2sgdG8gcnVudGltZSBldmFsdWF0aW9uXFxuXCIpO1xuICByZXR1cm4gZXZhbChjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKSk7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX29iamVjdCAob2JqZWN0X2xpdGVyYWwpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19vYmplY3QgKGEpIHtcbiAgdmFyIG8gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHAgPSBhW2ldO1xuICAgIG9bY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocFsxXSldID0gcFsyXTtcbiAgfVxuICByZXR1cm4gbztcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRm9ybWF0XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VfZm9ybWF0XG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfcGFyc2VfZm9ybWF0IChmbXQpIHtcbiAgZm10ID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhmbXQpO1xuICB2YXIgbGVuID0gZm10Lmxlbmd0aDtcbiAgaWYgKGxlbiA+IDMxKSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJmb3JtYXRfaW50OiBmb3JtYXQgdG9vIGxvbmdcIik7XG4gIHZhciBmID1cbiAgICAgIHsganVzdGlmeTonKycsIHNpZ25zdHlsZTonLScsIGZpbGxlcjonICcsIGFsdGVybmF0ZTpmYWxzZSxcbiAgICAgICAgYmFzZTowLCBzaWduZWRjb252OmZhbHNlLCB3aWR0aDowLCB1cHBlcmNhc2U6ZmFsc2UsXG4gICAgICAgIHNpZ246MSwgcHJlYzotMSwgY29udjonZicgfTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjID0gZm10LmNoYXJBdChpKTtcbiAgICBzd2l0Y2ggKGMpIHtcbiAgICBjYXNlICctJzpcbiAgICAgIGYuanVzdGlmeSA9ICctJzsgYnJlYWs7XG4gICAgY2FzZSAnKyc6IGNhc2UgJyAnOlxuICAgICAgZi5zaWduc3R5bGUgPSBjOyBicmVhaztcbiAgICBjYXNlICcwJzpcbiAgICAgIGYuZmlsbGVyID0gJzAnOyBicmVhaztcbiAgICBjYXNlICcjJzpcbiAgICAgIGYuYWx0ZXJuYXRlID0gdHJ1ZTsgYnJlYWs7XG4gICAgY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOlxuICAgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOlxuICAgICAgZi53aWR0aCA9IDA7XG4gICAgICB3aGlsZSAoYz1mbXQuY2hhckNvZGVBdChpKSAtIDQ4LCBjID49IDAgJiYgYyA8PSA5KSB7XG4gICAgICAgIGYud2lkdGggPSBmLndpZHRoICogMTAgKyBjOyBpKytcbiAgICAgIH1cbiAgICAgIGktLTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJy4nOlxuICAgICAgZi5wcmVjID0gMDtcbiAgICAgIGkrKztcbiAgICAgIHdoaWxlIChjPWZtdC5jaGFyQ29kZUF0KGkpIC0gNDgsIGMgPj0gMCAmJiBjIDw9IDkpIHtcbiAgICAgICAgZi5wcmVjID0gZi5wcmVjICogMTAgKyBjOyBpKytcbiAgICAgIH1cbiAgICAgIGktLTtcbiAgICBjYXNlICdkJzogY2FzZSAnaSc6XG4gICAgICBmLnNpZ25lZGNvbnYgPSB0cnVlOyAvKiBmYWxsdGhyb3VnaCAqL1xuICAgIGNhc2UgJ3UnOlxuICAgICAgZi5iYXNlID0gMTA7IGJyZWFrO1xuICAgIGNhc2UgJ3gnOlxuICAgICAgZi5iYXNlID0gMTY7IGJyZWFrO1xuICAgIGNhc2UgJ1gnOlxuICAgICAgZi5iYXNlID0gMTY7IGYudXBwZXJjYXNlID0gdHJ1ZTsgYnJlYWs7XG4gICAgY2FzZSAnbyc6XG4gICAgICBmLmJhc2UgPSA4OyBicmVhaztcbiAgICBjYXNlICdlJzogY2FzZSAnZic6IGNhc2UgJ2cnOlxuICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTsgZi5jb252ID0gYzsgYnJlYWs7XG4gICAgY2FzZSAnRSc6IGNhc2UgJ0YnOiBjYXNlICdHJzpcbiAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7IGYudXBwZXJjYXNlID0gdHJ1ZTtcbiAgICAgIGYuY29udiA9IGMudG9Mb3dlckNhc2UgKCk7IGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maW5pc2hfZm9ybWF0dGluZ1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9maW5pc2hfZm9ybWF0dGluZyhmLCByYXdidWZmZXIpIHtcbiAgaWYgKGYudXBwZXJjYXNlKSByYXdidWZmZXIgPSByYXdidWZmZXIudG9VcHBlckNhc2UoKTtcbiAgdmFyIGxlbiA9IHJhd2J1ZmZlci5sZW5ndGg7XG4gIC8qIEFkanVzdCBsZW4gdG8gcmVmbGVjdCBhZGRpdGlvbmFsIGNoYXJzIChzaWduLCBldGMpICovXG4gIGlmIChmLnNpZ25lZGNvbnYgJiYgKGYuc2lnbiA8IDAgfHwgZi5zaWduc3R5bGUgIT0gJy0nKSkgbGVuKys7XG4gIGlmIChmLmFsdGVybmF0ZSkge1xuICAgIGlmIChmLmJhc2UgPT0gOCkgbGVuICs9IDE7XG4gICAgaWYgKGYuYmFzZSA9PSAxNikgbGVuICs9IDI7XG4gIH1cbiAgLyogRG8gdGhlIGZvcm1hdHRpbmcgKi9cbiAgdmFyIGJ1ZmZlciA9IFwiXCI7XG4gIGlmIChmLmp1c3RpZnkgPT0gJysnICYmIGYuZmlsbGVyID09ICcgJylcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gJyAnO1xuICBpZiAoZi5zaWduZWRjb252KSB7XG4gICAgaWYgKGYuc2lnbiA8IDApIGJ1ZmZlciArPSAnLSc7XG4gICAgZWxzZSBpZiAoZi5zaWduc3R5bGUgIT0gJy0nKSBidWZmZXIgKz0gZi5zaWduc3R5bGU7XG4gIH1cbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PSA4KSBidWZmZXIgKz0gJzAnO1xuICBpZiAoZi5hbHRlcm5hdGUgJiYgZi5iYXNlID09IDE2KSBidWZmZXIgKz0gZi51cHBlcmNhc2U/XCIwWFwiOlwiMHhcIjtcbiAgaWYgKGYuanVzdGlmeSA9PSAnKycgJiYgZi5maWxsZXIgPT0gJzAnKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSAnMCc7XG4gIGJ1ZmZlciArPSByYXdidWZmZXI7XG4gIGlmIChmLmp1c3RpZnkgPT0gJy0nKVxuICAgIGZvciAodmFyIGkgPSBsZW47IGkgPCBmLndpZHRoOyBpKyspIGJ1ZmZlciArPSAnICc7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGJ1ZmZlcik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczoganNvb19mbG9vcl9sb2cyXG52YXIgbG9nMl9vayA9IE1hdGgubG9nMiAmJiBNYXRoLmxvZzIoMS4xMjM1NTgyMDkyODg5NDc0RSszMDcpID09IDEwMjBcbmZ1bmN0aW9uIGpzb29fZmxvb3JfbG9nMih4KSB7XG4gIGlmKGxvZzJfb2spIHJldHVybiBNYXRoLmZsb29yKE1hdGgubG9nMih4KSlcbiAgdmFyIGkgPSAwO1xuICBpZiAoeCA9PSAwKSByZXR1cm4gLUluZmluaXR5O1xuICBpZih4Pj0xKSB7d2hpbGUgKHg+PTIpIHt4Lz0yOyBpKyt9IH1cbiAgZWxzZSB7d2hpbGUgKHggPCAxKSB7eCo9MjsgaS0tfSB9O1xuICByZXR1cm4gaTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2Zsb29yX2xvZzIsIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXG5mdW5jdGlvbiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQgKHgpIHtcbiAgaWYgKCFpc0Zpbml0ZSh4KSkge1xuICAgIGlmIChpc05hTih4KSlcbiAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgxLCAwLCAweDdmZjApO1xuICAgIGlmICh4ID4gMClcbiAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgwLCAwLCAweDdmZjApXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKDAsIDAsIDB4ZmZmMClcbiAgfVxuICB2YXIgc2lnbiA9ICh4PT0wICYmIDEveCA9PSAtSW5maW5pdHkpPzB4ODAwMDooeD49MCk/MDoweDgwMDA7XG4gIGlmIChzaWduKSB4ID0gLXg7XG4gIC8vIEludDY0LmJpdHNfb2ZfZmxvYXQgMS4xMjM1NTgyMDkyODg5NDc0RSszMDcgPSAweDdmYjAwMDAwMDAwMDAwMDBMXG4gIC8vIHVzaW5nIE1hdGguTE9HMkUqTWF0aC5sb2coeCkgaW4gcGxhY2Ugb2YgTWF0aC5sb2cyIHJlc3VsdCBpbiBwcmVjaXNpb24gbG9zdFxuICB2YXIgZXhwID0ganNvb19mbG9vcl9sb2cyKHgpICsgMTAyMztcbiAgaWYgKGV4cCA8PSAwKSB7XG4gICAgZXhwID0gMDtcbiAgICB4IC89IE1hdGgucG93KDIsLTEwMjYpO1xuICB9IGVsc2Uge1xuICAgIHggLz0gTWF0aC5wb3coMixleHAtMTAyNyk7XG4gICAgaWYgKHggPCAxNikge1xuICAgICAgeCAqPSAyOyBleHAgLT0xOyB9XG4gICAgaWYgKGV4cCA9PSAwKSB7XG4gICAgICB4IC89IDI7IH1cbiAgfVxuICB2YXIgayA9IE1hdGgucG93KDIsMjQpO1xuICB2YXIgcjMgPSB4fDA7XG4gIHggPSAoeCAtIHIzKSAqIGs7XG4gIHZhciByMiA9IHh8MDtcbiAgeCA9ICh4IC0gcjIpICogaztcbiAgdmFyIHIxID0geHwwO1xuICByMyA9IChyMyAmMHhmKSB8IHNpZ24gfCBleHAgPDwgNDtcbiAgcmV0dXJuIGNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpKHIxLCByMiwgcjMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZmxvb3JfbG9nMlxuZnVuY3Rpb24gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0ICh4KSB7XG4gIHZhciBmbG9hdDMyYSA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7XG4gIGZsb2F0MzJhWzBdID0geDtcbiAgdmFyIGludDMyYSA9IG5ldyBJbnQzMkFycmF5KGZsb2F0MzJhLmJ1ZmZlcik7XG4gIHJldHVybiBpbnQzMmFbMF0gfCAwO1xufVxuXG4vL0ZQIGxpdGVyYWxzIGNhbiBiZSB3cml0dGVuIHVzaW5nIHRoZSBoZXhhZGVjaW1hbFxuLy9ub3RhdGlvbiAweDxtYW50aXNzYSBpbiBoZXg+cDxleHBvbmVudD4gZnJvbSBJU08gQzk5LlxuLy9odHRwczovL2dpdGh1Yi5jb20vZGFua29nYWkvanMtaGV4ZmxvYXQvYmxvYi9tYXN0ZXIvaGV4ZmxvYXQuanNcbi8vUHJvdmlkZXM6IGNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZywgY2FtbF9zdHJfcmVwZWF0XG5mdW5jdGlvbiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCAoeCwgcHJlYywgc3R5bGUpIHtcbiAgaWYgKCFpc0Zpbml0ZSh4KSkge1xuICAgIGlmIChpc05hTih4KSkgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKFwibmFuXCIpO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyAoKHggPiAwKT9cImluZmluaXR5XCI6XCItaW5maW5pdHlcIik7XG4gIH1cbiAgdmFyIHNpZ24gPSAoeD09MCAmJiAxL3ggPT0gLUluZmluaXR5KT8xOih4Pj0wKT8wOjE7XG4gIGlmKHNpZ24pIHggPSAteDtcbiAgdmFyIGV4cCA9IDA7XG4gIGlmICh4ID09IDApIHsgfVxuICBlbHNlIGlmICh4IDwgMSkge1xuICAgIHdoaWxlICh4IDwgMSAmJiBleHAgPiAtMTAyMikgIHsgeCAqPSAyOyBleHAtLSB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKHggPj0gMikgeyB4IC89IDI7IGV4cCsrIH1cbiAgfVxuICB2YXIgZXhwX3NpZ24gPSBleHAgPCAwID8gJycgOiAnKyc7XG4gIHZhciBzaWduX3N0ciA9ICcnO1xuICBpZiAoc2lnbikgc2lnbl9zdHIgPSAnLSdcbiAgZWxzZSB7XG4gICAgc3dpdGNoKHN0eWxlKXtcbiAgICBjYXNlIDQzIC8qICcrJyAqLzogc2lnbl9zdHIgPSAnKyc7IGJyZWFrO1xuICAgIGNhc2UgMzIgLyogJyAnICovOiBzaWduX3N0ciA9ICcgJzsgYnJlYWs7XG4gICAgZGVmYXVsdDogYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChwcmVjID49IDAgJiYgcHJlYyA8IDEzKSB7XG4gICAgLyogSWYgYSBwcmVjaXNpb24gaXMgZ2l2ZW4sIGFuZCBpcyBzbWFsbCwgcm91bmQgbWFudGlzc2EgYWNjb3JkaW5nbHkgKi9cbiAgICB2YXIgY3N0ID0gTWF0aC5wb3coMixwcmVjICogNCk7XG4gICAgeCA9IE1hdGgucm91bmQoeCAqIGNzdCkgLyBjc3Q7XG4gIH1cbiAgdmFyIHhfc3RyID0geC50b1N0cmluZygxNik7XG4gIGlmKHByZWMgPj0gMCl7XG4gICAgdmFyIGlkeCA9IHhfc3RyLmluZGV4T2YoJy4nKTtcbiAgICBpZihpZHg8MCkge1xuICAgICAgeF9zdHIgKz0gJy4nICsgY2FtbF9zdHJfcmVwZWF0KHByZWMsICcwJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHNpemUgPSBpZHgrMStwcmVjO1xuICAgICAgaWYoeF9zdHIubGVuZ3RoIDwgc2l6ZSlcbiAgICAgICAgeF9zdHIgKz0gY2FtbF9zdHJfcmVwZWF0KHNpemUgLSB4X3N0ci5sZW5ndGgsICcwJyk7XG4gICAgICBlbHNlXG4gICAgICAgIHhfc3RyID0geF9zdHIuc3Vic3RyKDAsc2l6ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyAoc2lnbl9zdHIgKyAnMHgnICsgeF9zdHIgKyAncCcgKyBleHBfc2lnbiArIGV4cC50b1N0cmluZygxMCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyAoeCkge1xuICB2YXIgbG8gPSB4LmxvO1xuICB2YXIgbWkgPSB4Lm1pO1xuICB2YXIgaGkgPSB4LmhpO1xuICB2YXIgZXhwID0gKGhpICYgMHg3ZmZmKSA+PiA0O1xuICBpZiAoZXhwID09IDIwNDcpIHtcbiAgICBpZiAoKGxvfG1pfChoaSYweGYpKSA9PSAwKVxuICAgICAgcmV0dXJuIChoaSAmIDB4ODAwMCk/KC1JbmZpbml0eSk6SW5maW5pdHk7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIE5hTjtcbiAgfVxuICB2YXIgayA9IE1hdGgucG93KDIsLTI0KTtcbiAgdmFyIHJlcyA9IChsbyprK21pKSprKyhoaSYweGYpO1xuICBpZiAoZXhwID4gMCkge1xuICAgIHJlcyArPSAxNjtcbiAgICByZXMgKj0gTWF0aC5wb3coMixleHAtMTAyNyk7XG4gIH0gZWxzZVxuICAgIHJlcyAqPSBNYXRoLnBvdygyLC0xMDI2KTtcbiAgaWYgKGhpICYgMHg4MDAwKSByZXMgPSAtIHJlcztcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9uZXh0YWZ0ZXJfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cywgY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2ludDY0X2FkZCwgY2FtbF9pbnQ2NF9zdWIsY2FtbF9pbnQ2NF9vZl9pbnQzMlxuZnVuY3Rpb24gY2FtbF9uZXh0YWZ0ZXJfZmxvYXQgKHgseSkge1xuICBpZihpc05hTih4KSB8fCBpc05hTih5KSkgcmV0dXJuIE5hTjtcbiAgaWYoeD09eSkgcmV0dXJuIHk7XG4gIGlmKHg9PTApe1xuICAgIGlmKHkgPCAwKVxuICAgICAgcmV0dXJuIC1NYXRoLnBvdygyLCAtMTA3NClcbiAgICBlbHNlXG4gICAgICByZXR1cm4gTWF0aC5wb3coMiwgLTEwNzQpXG4gIH1cbiAgdmFyIGJpdHMgPSBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoeCk7XG4gIHZhciBvbmUgPSBjYW1sX2ludDY0X29mX2ludDMyKDEpO1xuICBpZiAoKHg8eSkgPT0gKHg+MCkpXG4gICAgYml0cyA9IGNhbWxfaW50NjRfYWRkKGJpdHMsIG9uZSlcbiAgZWxzZVxuICAgIGJpdHMgPSBjYW1sX2ludDY0X3N1YihiaXRzLCBvbmUpXG4gIHJldHVybiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoYml0cyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdHJ1bmNfZmxvYXRcbmZ1bmN0aW9uIGNhbWxfdHJ1bmNfZmxvYXQoeCl7XG4gIHJldHVybiBNYXRoLnRydW5jKHgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyAoeCkge1xuICB2YXIgaW50MzJhID0gbmV3IEludDMyQXJyYXkoMSk7XG4gIGludDMyYVswXSA9IHg7XG4gIHZhciBmbG9hdDMyYSA9IG5ldyBGbG9hdDMyQXJyYXkoaW50MzJhLmJ1ZmZlcik7XG4gIHJldHVybiBmbG9hdDMyYVswXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jbGFzc2lmeV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jbGFzc2lmeV9mbG9hdCAoeCkge1xuICBpZiAoaXNGaW5pdGUgKHgpKSB7XG4gICAgaWYgKE1hdGguYWJzKHgpID49IDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KSByZXR1cm4gMDtcbiAgICBpZiAoeCAhPSAwKSByZXR1cm4gMTtcbiAgICByZXR1cm4gMjtcbiAgfVxuICByZXR1cm4gaXNOYU4oeCk/NDozO1xufVxuLy9Qcm92aWRlczogY2FtbF9tb2RmX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX21vZGZfZmxvYXQgKHgpIHtcbiAgaWYgKGlzRmluaXRlICh4KSkge1xuICAgIHZhciBuZWcgPSAoMS94KSA8IDA7XG4gICAgeCA9IE1hdGguYWJzKHgpO1xuICAgIHZhciBpID0gTWF0aC5mbG9vciAoeCk7XG4gICAgdmFyIGYgPSB4IC0gaTtcbiAgICBpZiAobmVnKSB7IGkgPSAtaTsgZiA9IC1mOyB9XG4gICAgcmV0dXJuIFswLCBmLCBpXTtcbiAgfVxuICBpZiAoaXNOYU4gKHgpKSByZXR1cm4gWzAsIE5hTiwgTmFOXTtcbiAgcmV0dXJuIFswLCAxL3gsIHhdO1xufVxuLy9Qcm92aWRlczogY2FtbF9sZGV4cF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9sZGV4cF9mbG9hdCAoeCxleHApIHtcbiAgZXhwIHw9IDA7XG4gIGlmIChleHAgPiAxMDIzKSB7XG4gICAgZXhwIC09IDEwMjM7XG4gICAgeCAqPSBNYXRoLnBvdygyLCAxMDIzKTtcbiAgICBpZiAoZXhwID4gMTAyMykgeyAgLy8gaW4gY2FzZSB4IGlzIHN1Ym5vcm1hbFxuICAgICAgZXhwIC09IDEwMjM7XG4gICAgICB4ICo9IE1hdGgucG93KDIsIDEwMjMpO1xuICAgIH1cbiAgfVxuICBpZiAoZXhwIDwgLTEwMjMpIHtcbiAgICBleHAgKz0gMTAyMztcbiAgICB4ICo9IE1hdGgucG93KDIsIC0xMDIzKTtcbiAgfVxuICB4ICo9IE1hdGgucG93KDIsIGV4cCk7XG4gIHJldHVybiB4O1xufVxuLy9Qcm92aWRlczogY2FtbF9mcmV4cF9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczoganNvb19mbG9vcl9sb2cyXG5mdW5jdGlvbiBjYW1sX2ZyZXhwX2Zsb2F0ICh4KSB7XG4gIGlmICgoeCA9PSAwKSB8fCAhaXNGaW5pdGUoeCkpIHJldHVybiBbMCwgeCwgMF07XG4gIHZhciBuZWcgPSB4IDwgMDtcbiAgaWYgKG5lZykgeCA9IC0geDtcbiAgdmFyIGV4cCA9IE1hdGgubWF4KC0xMDIzLCBqc29vX2Zsb29yX2xvZzIoeCkgKyAxKTtcbiAgeCAqPSBNYXRoLnBvdygyLC1leHApO1xuICB3aGlsZSAoeCA8IDAuNSkge1xuICAgIHggKj0gMjtcbiAgICBleHAtLTtcbiAgfVxuICB3aGlsZSAoeCA+PSAxKSB7XG4gICAgeCAqPSAwLjU7XG4gICAgZXhwKys7XG4gIH1cbiAgaWYgKG5lZykgeCA9IC0geDtcbiAgcmV0dXJuIFswLCB4LCBleHBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X2NvbXBhcmUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmxvYXRfY29tcGFyZSAoeCwgeSkge1xuICBpZiAoeCA9PT0geSkgcmV0dXJuIDA7XG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xO1xuICBpZiAoeCA+IHkpIHJldHVybiAxO1xuICBpZiAoeCA9PT0geCkgcmV0dXJuIDE7XG4gIGlmICh5ID09PSB5KSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvcHlzaWduX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NvcHlzaWduX2Zsb2F0ICh4LCB5KSB7XG4gIGlmICh5ID09IDApIHkgPSAxIC8geTtcbiAgeCA9IE1hdGguYWJzKHgpO1xuICByZXR1cm4gKHkgPCAwKT8oLXgpOng7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2lnbmJpdF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9zaWduYml0X2Zsb2F0KHgpIHtcbiAgaWYgKHggPT0gMCkgeCA9IDEgLyB4O1xuICByZXR1cm4gKHggPCAwKT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXhwbTFfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXhwbTFfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguZXhwbTEoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZXhwMl9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9leHAyX2Zsb2F0KHgpIHsgcmV0dXJuIE1hdGgucG93KDIsIHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzFwX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2xvZzFwX2Zsb2F0KHgpIHsgcmV0dXJuIE1hdGgubG9nMXAoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbG9nMl9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9sb2cyX2Zsb2F0KHgpIHsgcmV0dXJuIE1hdGgubG9nMih4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9oeXBvdF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9oeXBvdF9mbG9hdCAoeCwgeSkgeyByZXR1cm4gTWF0aC5oeXBvdCh4LCB5KTsgfVxuLy9Qcm92aWRlczogY2FtbF9sb2cxMF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9sb2cxMF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5sb2cxMCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9jb3NoX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Nvc2hfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguY29zaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9hY29zaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9hY29zaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5hY29zaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9zaW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3NpbmhfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguc2luaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9hc2luaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9hc2luaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5hc2luaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF90YW5oX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX3RhbmhfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGgudGFuaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9hdGFuaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9hdGFuaF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5hdGFuaCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9yb3VuZF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9yb3VuZF9mbG9hdCAoeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9jYnJ0X2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2NicnRfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguY2JydCh4KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VyZl9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9lcmZfZmxvYXQoeCkge1xuICB2YXIgYTEgPSAwLjI1NDgyOTU5MjtcbiAgdmFyIGEyID0gLTAuMjg0NDk2NzM2O1xuICB2YXIgYTMgPSAxLjQyMTQxMzc0MTtcbiAgdmFyIGE0ID0gLTEuNDUzMTUyMDI3O1xuICB2YXIgYTUgPSAxLjA2MTQwNTQyOTtcbiAgdmFyIHAgPSAwLjMyNzU5MTE7XG5cbiAgdmFyIHNpZ24gPSAxO1xuICBpZiAoeCA8IDApIHtcbiAgICBzaWduID0gLTE7XG4gIH1cbiAgeCA9IE1hdGguYWJzKHgpO1xuICB2YXIgdCA9IDEuMCAvICgxLjAgKyBwICogeCk7XG4gIHZhciB5ID0gMS4wIC0gKCgoKGE1ICogdCArIGE0KSAqIHQgKyBhMykgKiB0ICsgYTIpICogdCArIGExKSAqIHQgKiBNYXRoLmV4cCgteCAqIHgpO1xuXG4gIHJldHVybiBzaWduICogeTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZjX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2VyZl9mbG9hdFxuZnVuY3Rpb24gY2FtbF9lcmZjX2Zsb2F0KHgpIHtcbiAgcmV0dXJuIDEgLSBjYW1sX2VyZl9mbG9hdCh4KTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZtYV9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9mbWFfZmxvYXQoeCwgeSwgeikge1xuICB2YXIgU1BMSVQgPSBNYXRoLnBvdygyLCAyNykgKyAxO1xuICB2YXIgTUlOX1ZBTFVFID0gTWF0aC5wb3coMiwgLTEwMjIpO1xuICB2YXIgRVBTSUxPTiA9IE1hdGgucG93KDIsIC01Mik7XG4gIHZhciBDID0gNDE2O1xuICB2YXIgQSA9IE1hdGgucG93KDIsICtDKTtcbiAgdmFyIEIgPSBNYXRoLnBvdygyLCAtQyk7XG5cbiAgZnVuY3Rpb24gbXVsdGlwbHkgKGEsIGIpIHtcbiAgICB2YXIgYXQgPSBTUExJVCAqIGE7XG4gICAgdmFyIGFoaSA9IGF0IC0gKGF0IC0gYSk7XG4gICAgdmFyIGFsbyA9IGEgLSBhaGk7XG4gICAgdmFyIGJ0ID0gU1BMSVQgKiBiO1xuICAgIHZhciBiaGkgPSBidCAtIChidCAtIGIpO1xuICAgIHZhciBibG8gPSBiIC0gYmhpO1xuICAgIHZhciBwID0gYSAqIGI7XG4gICAgdmFyIGUgPSAoKGFoaSAqIGJoaSAtIHApICsgYWhpICogYmxvICsgYWxvICogYmhpKSArIGFsbyAqIGJsbztcbiAgICByZXR1cm4ge1xuICAgICAgcDogcCxcbiAgICAgIGU6IGVcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGFkZCAoYSwgYikge1xuICAgIHZhciBzID0gYSArIGI7XG4gICAgdmFyIHYgPSBzIC0gYTtcbiAgICB2YXIgZSA9IChhIC0gKHMgLSB2KSkgKyAoYiAtIHYpO1xuICAgIHJldHVybiB7XG4gICAgICBzOiBzLFxuICAgICAgZTogZVxuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gYWRqdXN0ICh4LCB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgJiYgeSAhPT0gMCAmJiBTUExJVCAqIHggLSAoU1BMSVQgKiB4IC0geCkgPT09IHggPyB4ICogKDEgKyAoeCA8IDAgPyAtMSA6ICsxKSAqICh5IDwgMCA/IC0xIDogKzEpICogRVBTSUxPTikgOiB4O1xuICB9O1xuXG4gIGlmICh4ID09PSAwIHx8IHggIT09IHggfHwgeCA9PT0gKzEgLyAwIHx8IHggPT09IC0xIC8gMCB8fFxuICAgICAgeSA9PT0gMCB8fCB5ICE9PSB5IHx8IHkgPT09ICsxIC8gMCB8fCB5ID09PSAtMSAvIDApIHtcbiAgICByZXR1cm4geCAqIHkgKyB6O1xuICB9XG4gIGlmICh6ID09PSAwKSB7XG4gICAgcmV0dXJuIHggKiB5O1xuICB9XG4gIGlmICh6ICE9PSB6IHx8IHogPT09ICsxIC8gMCB8fCB6ID09PSAtMSAvIDApIHtcbiAgICByZXR1cm4gejtcbiAgfVxuXG4gIHZhciBzY2FsZSA9IDE7XG4gIHdoaWxlIChNYXRoLmFicyh4KSA+IEEpIHtcbiAgICBzY2FsZSAqPSBBO1xuICAgIHggKj0gQjtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeSkgPiBBKSB7XG4gICAgc2NhbGUgKj0gQTtcbiAgICB5ICo9IEI7XG4gIH1cbiAgaWYgKHNjYWxlID09PSAxIC8gMCkge1xuICAgIHJldHVybiB4ICogeSAqIHNjYWxlO1xuICB9XG4gIHdoaWxlIChNYXRoLmFicyh4KSA8IEIpIHtcbiAgICBzY2FsZSAqPSBCO1xuICAgIHggKj0gQTtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeSkgPCBCKSB7XG4gICAgc2NhbGUgKj0gQjtcbiAgICB5ICo9IEE7XG4gIH1cbiAgaWYgKHNjYWxlID09PSAwKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cblxuICB2YXIgeHMgPSB4O1xuICB2YXIgeXMgPSB5O1xuICB2YXIgenMgPSB6IC8gc2NhbGU7XG5cbiAgaWYgKE1hdGguYWJzKHpzKSA+IE1hdGguYWJzKHhzICogeXMpICogNCAvIEVQU0lMT04pIHtcbiAgICByZXR1cm4gejtcbiAgfVxuICBpZiAoTWF0aC5hYnMoenMpIDwgTWF0aC5hYnMoeHMgKiB5cykgKiBFUFNJTE9OIC8gNCAqIEVQU0lMT04gLyA0KSB7XG4gICAgenMgPSAoeiA8IDAgPyAtMSA6ICsxKSAqIE1JTl9WQUxVRTtcbiAgfVxuXG4gIHZhciB4eSA9IG11bHRpcGx5KHhzLCB5cyk7XG4gIHZhciBzID0gYWRkKHh5LnAsIHpzKTtcbiAgdmFyIHUgPSBhZGQoeHkuZSwgcy5lKTtcbiAgdmFyIGkgPSBhZGQocy5zLCB1LnMpO1xuXG4gIHZhciBmID0gaS5zICsgYWRqdXN0KGkuZSwgdS5lKTtcbiAgaWYgKGYgPT09IDApIHtcbiAgICByZXR1cm4gZjtcbiAgfVxuXG4gIHZhciBmcyA9IGYgKiBzY2FsZTtcbiAgaWYgKE1hdGguYWJzKGZzKSA+IE1JTl9WQUxVRSkge1xuICAgIHJldHVybiBmcztcbiAgfVxuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlcmUgd2FzIGV4dHJhIHJvdW5kaW5nIGZvciBhIGRlbm9ybWFsaXplZCB2YWx1ZS5cbiAgcmV0dXJuIGZzICsgYWRqdXN0KGYgLSBmcyAvIHNjYWxlLCBpLmUpICogc2NhbGU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZ1xuZnVuY3Rpb24gY2FtbF9mb3JtYXRfZmxvYXQgKGZtdCwgeCkge1xuICBmdW5jdGlvbiB0b0ZpeGVkKHgsZHApIHtcbiAgICBpZiAoTWF0aC5hYnMoeCkgPCAxLjApIHtcbiAgICAgIHJldHVybiB4LnRvRml4ZWQoZHApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZSA9IHBhcnNlSW50KHgudG9TdHJpbmcoKS5zcGxpdCgnKycpWzFdKTtcbiAgICAgIGlmIChlID4gMjApIHtcbiAgICAgICAgZSAtPSAyMDtcbiAgICAgICAgeCAvPSBNYXRoLnBvdygxMCxlKTtcbiAgICAgICAgeCArPSAobmV3IEFycmF5KGUrMSkpLmpvaW4oJzAnKTtcbiAgICAgICAgaWYoZHAgPiAwKSB7XG4gICAgICAgICAgeCA9IHggKyAnLicgKyAobmV3IEFycmF5KGRwKzEpKS5qb2luKCcwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9XG4gICAgICBlbHNlIHJldHVybiB4LnRvRml4ZWQoZHApXG4gICAgfVxuICB9XG4gIHZhciBzLCBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgdmFyIHByZWMgPSAoZi5wcmVjIDwgMCk/NjpmLnByZWM7XG4gIGlmICh4IDwgMCB8fCAoeCA9PSAwICYmIDEveCA9PSAtSW5maW5pdHkpKSB7IGYuc2lnbiA9IC0xOyB4ID0gLXg7IH1cbiAgaWYgKGlzTmFOKHgpKSB7IHMgPSBcIm5hblwiOyBmLmZpbGxlciA9ICcgJzsgfVxuICBlbHNlIGlmICghaXNGaW5pdGUoeCkpIHsgcyA9IFwiaW5mXCI7IGYuZmlsbGVyID0gJyAnOyB9XG4gIGVsc2VcbiAgICBzd2l0Y2ggKGYuY29udikge1xuICAgIGNhc2UgJ2UnOlxuICAgICAgdmFyIHMgPSB4LnRvRXhwb25lbnRpYWwocHJlYyk7XG4gICAgICAvLyBleHBvbmVudCBzaG91bGQgYmUgYXQgbGVhc3QgdHdvIGRpZ2l0c1xuICAgICAgdmFyIGkgPSBzLmxlbmd0aDtcbiAgICAgIGlmIChzLmNoYXJBdChpIC0gMykgPT0gJ2UnKVxuICAgICAgICBzID0gcy5zbGljZSAoMCwgaSAtIDEpICsgJzAnICsgcy5zbGljZSAoaSAtIDEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZic6XG4gICAgICBzID0gdG9GaXhlZCh4LCBwcmVjKTsgYnJlYWs7XG4gICAgY2FzZSAnZyc6XG4gICAgICBwcmVjID0gcHJlYz9wcmVjOjE7XG4gICAgICBzID0geC50b0V4cG9uZW50aWFsKHByZWMgLSAxKTtcbiAgICAgIHZhciBqID0gcy5pbmRleE9mKCdlJyk7XG4gICAgICB2YXIgZXhwID0gK3Muc2xpY2UoaiArIDEpO1xuICAgICAgaWYgKGV4cCA8IC00IHx8IHggPj0gMWUyMSB8fCB4LnRvRml4ZWQoMCkubGVuZ3RoID4gcHJlYykge1xuICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgemVyb2VzXG4gICAgICAgIHZhciBpID0gaiAtIDE7IHdoaWxlIChzLmNoYXJBdChpKSA9PSAnMCcpIGktLTtcbiAgICAgICAgaWYgKHMuY2hhckF0KGkpID09ICcuJykgaS0tO1xuICAgICAgICBzID0gcy5zbGljZSgwLCBpICsgMSkgKyBzLnNsaWNlKGopO1xuICAgICAgICBpID0gcy5sZW5ndGg7XG4gICAgICAgIGlmIChzLmNoYXJBdChpIC0gMykgPT0gJ2UnKVxuICAgICAgICAgIHMgPSBzLnNsaWNlICgwLCBpIC0gMSkgKyAnMCcgKyBzLnNsaWNlIChpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHAgPSBwcmVjO1xuICAgICAgICBpZiAoZXhwIDwgMCkgeyBwIC09IGV4cCArIDE7IHMgPSB4LnRvRml4ZWQocCk7IH1cbiAgICAgICAgZWxzZSB3aGlsZSAocyA9IHgudG9GaXhlZChwKSwgcy5sZW5ndGggPiBwcmVjICsgMSkgcC0tO1xuICAgICAgICBpZiAocCkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyB6ZXJvZXNcbiAgICAgICAgICB2YXIgaSA9IHMubGVuZ3RoIC0gMTsgd2hpbGUgKHMuY2hhckF0KGkpID09ICcwJykgaS0tO1xuICAgICAgICAgIGlmIChzLmNoYXJBdChpKSA9PSAnLicpIGktLTtcbiAgICAgICAgICBzID0gcy5zbGljZSgwLCBpICsgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRfb2Zfc3RyaW5nIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZmxvYXRfb2Zfc3RyaW5nKHMpIHtcbiAgdmFyIHJlcztcbiAgcyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocylcbiAgcmVzID0gK3M7XG4gIGlmICgocy5sZW5ndGggPiAwKSAmJiAocmVzID09PSByZXMpKSByZXR1cm4gcmVzO1xuICBzID0gcy5yZXBsYWNlKC9fL2csXCJcIik7XG4gIHJlcyA9ICtzO1xuICBpZiAoKChzLmxlbmd0aCA+IDApICYmIChyZXMgPT09IHJlcykpIHx8IC9eWystXT9uYW4kL2kudGVzdChzKSkgcmV0dXJuIHJlcztcbiAgdmFyIG0gPSAvXiAqKFsrLV0/KTB4KFswLTlhLWZdKylcXC4/KFswLTlhLWZdKikocChbKy1dP1swLTldKykpPy9pLmV4ZWMocyk7XG4gIC8vICAgICAgICAgIDEgICAgICAgIDIgICAgICAgICAgICAgMyAgICAgICAgICAgNVxuICBpZihtKXtcbiAgICB2YXIgbTMgPSBtWzNdLnJlcGxhY2UoLzArJC8sJycpO1xuICAgIHZhciBtYW50aXNzYSA9IHBhcnNlSW50KG1bMV0gKyBtWzJdICsgbTMsIDE2KTtcbiAgICB2YXIgZXhwb25lbnQgPSAobVs1XXwwKSAtIDQqbTMubGVuZ3RoO1xuICAgIHJlcyA9IG1hbnRpc3NhICogTWF0aC5wb3coMiwgZXhwb25lbnQpO1xuICAgIHJldHVybiByZXM7XG4gIH1cbiAgaWYoL15cXCs/aW5mKGluaXR5KT8kL2kudGVzdChzKSkgcmV0dXJuIEluZmluaXR5O1xuICBpZigvXi1pbmYoaW5pdHkpPyQvaS50ZXN0KHMpKSByZXR1cm4gLUluZmluaXR5O1xuICBjYW1sX2ZhaWx3aXRoKFwiZmxvYXRfb2Zfc3RyaW5nXCIpO1xufVxuIiwiLypcblRvIGRlYWwgd2l0aCBlZmZlY3RzLCB0aGUgZXhlY3V0aW9uIGNvbnRleHQgaXMgaW50dWl0aXZlbHkgY29tcG9zZWQgb2ZcbmEgc3RhY2sgb2YgZmliZXJzLiBFYWNoIGZpYmVyIGhhcyBhIGN1cnJlbnQgbG93LWxldmVsIGNvbnRpbnVhdGlvblxuKG9uZS1hcmd1bWVudCBKYXZhU2NyaXB0IGZ1bmN0aW9uKSwgYSBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kXG5hIHRyaXBsZSBvZiBoYW5kbGVycywgd2hpY2ggYXJlIGludm9rZWQgd2hlbiB0aGUgZmliZXIgdGVybWluYXRlc1xuKGVpdGhlciB3aXRoIGEgdmFsdWUgb3IgYW4gZXhjZXB0aW9uKSBvciB3aGVuIGFuIGVmZmVjdCBpcyBwZXJmb3JtZWQuXG5UaGUgbG93LWxldmVsIGNvbnRpbnVhdGlvbiBvZiB0aGUgdG9wbW9zdCBmaWJlciAod2hpY2ggaXMgY3VycmVudGx5XG5leGVjdXRpbmcpIGlzIHBhc3NlZCBmcm9tIGZ1bmN0aW9uIHRvIGZ1bmN0aW9uIGFzIGFuIGFkZGl0aW9uYWxcbmFyZ3VtZW50LiBJdHMgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGlzIHN0b3JlZCBpblxuW2NhbWxfZXhuX3N0YWNrXS4gRXhjZXB0aW9uIGhhbmRsZXJzIGFyZSBwdXNoZWQgaW50byB0aGlzIHN0YWNrIHdoZW5cbmVudGVyaW5nIGEgW3RyeSAuLi4gd2l0aCAuLi5dIGFuZCBwb3BwZWQgb24gZXhpdC4gVGhlbiwgaGFuZGxlcnMgYW5kXG50aGUgcmVtYWluaW5nIGZpYmVycyBhcmUgc3RvcmVkIGluIFtjYW1sX2ZpYmVyX3N0YWNrXS4gVG8gaW5zdGFsbCBhblxuZWZmZWN0IGhhbmRsZXIsIHdlIHB1c2ggYSBuZXcgZmliZXIgaW50byB0aGUgZXhlY3V0aW9uIGNvbnRleHQuXG5cbldlIGhhdmUgYmFzaWNhbGx5IHRoZSBmb2xsb3dpbmcgdHlwZSBmb3IgcmVpZmllZCBjb250aW51YXRpb25zICh0eXBlXG5bY29udGludWF0aW9uXSBpbiBtb2R1bGUgW0VmZmVjdF0gb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkpOlxuXG4gIHR5cGUgKCdhLCAnYikgY29udGludWF0aW9uID0gKCdhLCAnYikgc3RhY2sgcmVmXG5cbiAgYW5kIChfLCBfKSBzdGFjayA9XG4gICAgICBDb25zIDogKCdiIC0+IHVuaXQpICogICAgICAgICAgICAgKCogbG93LWxldmVsIGNvbnRpbnVhdGlvbiAqKVxuICAgICAgICAgICAgIChleG4gLT4gdW5pdCkgbGlzdCAqICAgICAgICgqIGV4Y2VwdGlvbiBoYW5kbGVycyAqKVxuICAgICAgICAgICAgICgnYiwgJ2MpIGhhbmRsZXIgKlxuICAgICAgICAgICAgICgnYSwgJ2IpIHN0YWNrXG4gICAgICAgICAgICAgLT4gKCdhLCAnYykgc3RhY2tcbiAgICB8IEVtcHR5IDogKCdhLCAnYSkgc3RhY2tcblxuICBhbmQgKCdhLCdiKSBoYW5kbGVyID0gICAoKiBBcyBpbiBtb2R1bGUgRWZmZWN0IGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnkgKilcbiAgICB7IHJldGM6ICdhIC0+ICdiO1xuICAgICAgZXhuYzogZXhuIC0+ICdiO1xuICAgICAgZWZmYzogJ2MuJ2MgRWZmZWN0LnQgLT4gKCgnYywnYikgY29udGludWF0aW9uIC0+ICdiKSBvcHRpb24gfVxuXG5Db250aW51YXRpb25zIGFyZSBvbmUtc2hvdC4gQSBjb250aW51YXRpb24gW3JlZiBFbXB0eV0gaGFzIGFscmVhZHlcbmJlZW4gcmVzdW1lZC5cblxuQSBjb250aW51YXRpb24gaXMgYmFzaWNhbGx5IGNvbXBvc2VkIG9mIGEgbGlzdCBvZiBmaWJlcnMsIHdoaWNoIGVhY2hcbmhhcyBpdHMgbG93LWxldmVsIGNvbnRpbnVhdGlvbiwgaXRzIHN0YWNrIG9mIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQgYVxudHJpcGxlIG9mIGhhbmRsZXJzIHRvIGRlYWwgd2l0aCB3aGVuIHRoZSBmaWJlciB0ZXJtaW5hdGVzIG9yIGFuXG5lZmZlY3QgaXMgcGVyZm9ybWVkLiBXaGVuIHJlc3VtaW5nIGEgY29udGludWF0aW9uLCB0aGUgaW5uZXJtb3N0IGZpYmVyXG5pcyByZXN1bWVkIGZpcnN0LlxuXG5UaGUgaGFuZGxlcnMgYXJlIENQUy10cmFuc2Zvcm1lZCBmdW5jdGlvbnM6IHRoZXkgYWN0dWFsbHkgdGFrZSBhblxuYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIGN1cnJlbnQgbG93LWxldmVsIGNvbnRpbnVhdGlvbi5cbiovXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXhuX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG4vLyBUaGlzIGlzIGFuIE9DYW1sIGxpc3Qgb2YgZXhjZXB0aW9uIGhhbmRsZXJzXG52YXIgY2FtbF9leG5fc3RhY2sgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3B1c2hfdHJhcFxuLy9SZXF1aXJlczogY2FtbF9leG5fc3RhY2tcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfcHVzaF90cmFwKGhhbmRsZXIpIHtcbiAgY2FtbF9leG5fc3RhY2s9WzAsaGFuZGxlcixjYW1sX2V4bl9zdGFja107XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9wX3RyYXBcbi8vUmVxdWlyZXM6IGNhbWxfZXhuX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BvcF90cmFwKCkge1xuICBpZiAoIWNhbWxfZXhuX3N0YWNrKSByZXR1cm4gZnVuY3Rpb24oeCl7dGhyb3cgeDt9XG4gIHZhciBoID0gY2FtbF9leG5fc3RhY2tbMV07XG4gIGNhbWxfZXhuX3N0YWNrPWNhbWxfZXhuX3N0YWNrWzJdO1xuICByZXR1cm4gaFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpYmVyX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG4vLyBUaGlzIGhhcyB0aGUgc2hhcGUge2gsIHI6e2ssIHgsIGV9fSB3aGVyZSBoIGlzIGEgdHJpcGxlIG9mIGhhbmRsZXJzXG4vLyAoc2VlIGVmZmVjdC5qcykgYW5kIGssIHggYW5kIGUgYXJlIHRoZSBzYXZlZCBjb250aW51YXRpb24sXG4vLyBleGNlcHRpb24gc3RhY2sgYW5kIGZpYmVyIHN0YWNrIG9mIHRoZSBwYXJlbnQgZmliZXIuXG52YXIgY2FtbF9maWJlcl9zdGFjaztcblxuLy9Qcm92aWRlczpjYW1sX3Jlc3VtZV9zdGFja1xuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9yYWlzZV9jb25zdGFudCwgY2FtbF9leG5fc3RhY2ssIGNhbWxfZmliZXJfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfcmVzdW1lX3N0YWNrKHN0YWNrLCBrKSB7XG4gIGlmICghc3RhY2spIGNhbWxfcmFpc2VfY29uc3RhbnRcbiAgICAgICAgICAgICAgICAgKGNhbWxfbmFtZWRfdmFsdWUoXCJFZmZlY3QuQ29udGludWF0aW9uX2FscmVhZHlfcmVzdW1lZFwiKSk7XG4gIC8vIFVwZGF0ZSB0aGUgZXhlY3V0aW9uIGNvbnRleHQgd2l0aCB0aGUgc3RhY2sgb2YgZmliZXJzIGluIFtzdGFja10gaW5cbiAgLy8gb3JkZXIgdG8gcmVzdW1lIHRoZSBjb250aW51YXRpb25cbiAgZG8ge1xuICAgIGNhbWxfZmliZXJfc3RhY2sgPVxuICAgICAge2g6c3RhY2tbM10sIHI6e2s6aywgeDpjYW1sX2V4bl9zdGFjaywgZTpjYW1sX2ZpYmVyX3N0YWNrfX07XG4gICAgayA9IHN0YWNrWzFdO1xuICAgIGNhbWxfZXhuX3N0YWNrID0gc3RhY2tbMl07XG4gICAgc3RhY2sgPSBzdGFja1s0XTtcbiAgfSB3aGlsZSAoc3RhY2spXG4gIHJldHVybiBrO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BvcF9maWJlclxuLy9SZXF1aXJlczogY2FtbF9leG5fc3RhY2ssIGNhbWxfZmliZXJfc3RhY2tcbi8vSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfcG9wX2ZpYmVyKCkge1xuICAvLyBNb3ZlIHRvIHRoZSBwYXJlbnQgZmliZXIsIHJldHVybmluZyB0aGUgcGFyZW50J3MgbG93LWxldmVsIGNvbnRpbnVhdGlvblxuICB2YXIgcmVtID0gY2FtbF9maWJlcl9zdGFjay5yO1xuICBjYW1sX2V4bl9zdGFjayA9IHJlbS54O1xuICBjYW1sX2ZpYmVyX3N0YWNrID0gcmVtLmU7XG4gIHJldHVybiByZW0uaztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wZXJmb3JtX2VmZmVjdFxuLy9SZXF1aXJlczogY2FtbF9wb3BfZmliZXIsIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgsIGNhbWxfdHJhbXBvbGluZV9yZXR1cm4sIGNhbWxfZXhuX3N0YWNrLCBjYW1sX2ZpYmVyX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BlcmZvcm1fZWZmZWN0KGVmZiwgY29udCwgazApIHtcbiAgLy8gQWxsb2NhdGUgYSBjb250aW51YXRpb24gaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZVxuICBpZiAoIWNvbnQpIGNvbnQgPSBbMjQ1IC8qY29udGludWF0aW9uKi8sIDBdO1xuICAvLyBHZXQgY3VycmVudCBlZmZlY3QgaGFuZGxlclxuICB2YXIgaGFuZGxlciA9IGNhbWxfZmliZXJfc3RhY2suaFszXTtcbiAgLy8gQ29ucyB0aGUgY3VycmVudCBmaWJlciBvbnRvIHRoZSBjb250aW51YXRpb246XG4gIC8vICAgY29udCA6PSBDb25zIChrLCBleG5fc3RhY2ssIGhhbmRsZXJzLCAhY29udClcbiAgY29udFsxXSA9IFswLGswLGNhbWxfZXhuX3N0YWNrLGNhbWxfZmliZXJfc3RhY2suaCxjb250WzFdXTtcbiAgLy8gTW92ZSB0byBwYXJlbnQgZmliZXIgYW5kIGV4ZWN1dGUgdGhlIGVmZmVjdCBoYW5kbGVyIHRoZXJlXG4gIC8vIFRoZSBoYW5kbGVyIGlzIGRlZmluZWQgaW4gU3RkbGliLkVmZmVjdCwgc28gd2Uga25vdyB0aGF0IHRoZSBhcml0eSBtYXRjaGVzXG4gIHZhciBrMSA9IGNhbWxfcG9wX2ZpYmVyKCk7XG4gIHJldHVybiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCk/aGFuZGxlcihlZmYsY29udCxrMSxrMSlcbiAgICAgICAgIDpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGhhbmRsZXIsW2VmZixjb250LGsxLGsxXSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYWxsb2Nfc3RhY2tcbi8vUmVxdWlyZXM6IGNhbWxfcG9wX2ZpYmVyLCBjYW1sX2ZpYmVyX3N0YWNrLCBjYW1sX2NhbGxfZ2VuLCBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoLCBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX2FsbG9jX3N0YWNrKGh2LCBoeCwgaGYpIHtcbiAgZnVuY3Rpb24gY2FsbChpLCB4KSB7XG4gICAgdmFyIGY9Y2FtbF9maWJlcl9zdGFjay5oW2ldO1xuICAgIHZhciBhcmdzID0gW3gsIGNhbWxfcG9wX2ZpYmVyKCldO1xuICAgIHJldHVybiBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoKCk/Y2FtbF9jYWxsX2dlbihmLGFyZ3MpXG4gICAgICAgICAgIDpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGYsYXJncyk7XG4gIH1cbiAgZnVuY3Rpb24gaHZhbCh4KSB7XG4gICAgLy8gQ2FsbCBbaHZdIGluIHRoZSBwYXJlbnQgZmliZXJcbiAgICByZXR1cm4gY2FsbCgxLCB4KTtcbiAgfVxuICBmdW5jdGlvbiBoZXhuKGUpIHtcbiAgICAvLyBDYWxsIFtoeF0gaW4gdGhlIHBhcmVudCBmaWJlclxuICAgIHJldHVybiBjYWxsKDIsIGUpO1xuICB9XG4gIHJldHVybiBbMCwgaHZhbCwgWzAsIGhleG4sIDBdLCBbMCwgaHYsIGh4LCBoZl0sIDBdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX3N0YWNrXG4vL0lmOiAhZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9hbGxvY19zdGFjayhodiwgaHgsIGhmKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGNcbmZ1bmN0aW9uIGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KSB7XG4gIHZhciBzdGFjaz1jb250WzFdO1xuICBjb250WzFdPTA7XG4gIHJldHVybiBzdGFjaztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb250aW51YXRpb25fdXNlX2FuZF91cGRhdGVfaGFuZGxlcl9ub2V4Y1xuLy9SZXF1aXJlczogY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXG5mdW5jdGlvbiBjYW1sX2NvbnRpbnVhdGlvbl91c2VfYW5kX3VwZGF0ZV9oYW5kbGVyX25vZXhjKGNvbnQsIGh2YWwsIGhleG4sIGhlZmYpIHtcbiAgdmFyIHN0YWNrID0gY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjKGNvbnQpO1xuICBzdGFja1szXSA9IFswLCBodmFsLCBoZXhuLCBoZWZmXTtcbiAgcmV0dXJuIHN0YWNrO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrXG5mdW5jdGlvbiBjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrICgpIHsgcmV0dXJuIFswXTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9uZXdcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX25ldyh1bml0KXtcbiAgICByZXR1cm4ge2NvbmRpdGlvbjoxfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jb25kaXRpb25fd2FpdFxuZnVuY3Rpb24gY2FtbF9tbF9jb25kaXRpb25fd2FpdCh0LG11dGV4dCl7XG4gICAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX2Jyb2FkY2FzdFxuZnVuY3Rpb24gY2FtbF9tbF9jb25kaXRpb25fYnJvYWRjYXN0KHQpe1xuICAgIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9zaWduYWxcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbCh0KXtcbiAgICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczoganNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy8hSWY6IGVmZmVjdHNcbmZ1bmN0aW9uIGpzb29fZWZmZWN0X25vdF9zdXBwb3J0ZWQoKXtcbiAgY2FtbF9mYWlsd2l0aChcIkVmZmVjdCBoYW5kbGVycyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCAoKSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGdsb2JhbFRoaXMucHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICYmIHR5cGVvZiBnbG9iYWxUaGlzLnByb2Nlc3MudmVyc2lvbnMgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzLnZlcnNpb25zLm5vZGUgIT09ICd1bmRlZmluZWQnKVxufVxuLy9Qcm92aWRlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGZzX25vZGVfc3VwcG9ydGVkICgpIHtcbiAgcmV0dXJuIGZhbHNlXG59XG5cblxuLy9Qcm92aWRlczogTWxOb2RlRGV2aWNlXG4vL1JlcXVpcmVzOiBNbE5vZGVGZCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfcmFpc2Vfd2l0aF9hcmdzXG4vL1JlcXVpcmVzOiBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBNbE5vZGVEZXZpY2Uocm9vdCkge1xuICB0aGlzLmZzID0gcmVxdWlyZSgnZnMnKTtcbiAgdGhpcy5yb290ID0gcm9vdDtcbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUubm0gPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiAodGhpcy5yb290ICsgbmFtZSk7XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmV4aXN0cyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5leGlzdHNTeW5jKHRoaXMubm0obmFtZSkpPzE6MDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuaXNGaWxlID0gZnVuY3Rpb24obmFtZSkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzRmlsZSgpPzE6MDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLm1rZGlyID0gZnVuY3Rpb24obmFtZSwgbW9kZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHRoaXMuZnMubWtkaXJTeW5jKHRoaXMubm0obmFtZSkse21vZGU6bW9kZX0pO1xuICAgIHJldHVybiAwXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUucm1kaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5ybWRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgcmV0dXJuIDBcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5yZWFkZGlyID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLnJlYWRkaXJTeW5jKHRoaXMubm0obmFtZSkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmlzX2RpciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKS5pc0RpcmVjdG9yeSgpPzE6MDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYiA9IHRoaXMuZnMuZXhpc3RzU3luYyh0aGlzLm5tKG5hbWUpKT8xOjA7XG4gICAgdGhpcy5mcy51bmxpbmtTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiBiO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbihuYW1lLCBmLCByYWlzZV91bml4KSB7XG4gIHZhciBjb25zdHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvcih2YXIga2V5IGluIGYpe1xuICAgIHN3aXRjaChrZXkpe1xuICAgIGNhc2UgXCJyZG9ubHlcIiAgOiByZXMgfD0gY29uc3RzLk9fUkRPTkxZOyBicmVhaztcbiAgICBjYXNlIFwid3Jvbmx5XCIgIDogcmVzIHw9IGNvbnN0cy5PX1dST05MWTsgYnJlYWs7XG4gICAgY2FzZSBcImFwcGVuZFwiICA6XG4gICAgICByZXMgfD0gY29uc3RzLk9fV1JPTkxZIHwgY29uc3RzLk9fQVBQRU5EO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImNyZWF0ZVwiICAgOiByZXMgfD0gY29uc3RzLk9fQ1JFQVQ7ICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0cnVuY2F0ZVwiIDogcmVzIHw9IGNvbnN0cy5PX1RSVU5DOyAgICBicmVhaztcbiAgICBjYXNlIFwiZXhjbFwiICAgICA6IHJlcyB8PSBjb25zdHMuT19FWENMOyAgICAgYnJlYWs7XG4gICAgY2FzZSBcImJpbmFyeVwiICAgOiByZXMgfD0gY29uc3RzLk9fQklOQVJZOyAgIGJyZWFrO1xuICAgIGNhc2UgXCJ0ZXh0XCIgICAgIDogcmVzIHw9IGNvbnN0cy5PX1RFWFQ7ICAgICBicmVhaztcbiAgICBjYXNlIFwibm9uYmxvY2tcIiA6IHJlcyB8PSBjb25zdHMuT19OT05CTE9DSzsgYnJlYWs7XG4gICAgfVxuICB9XG4gIHRyeSB7XG4gICAgdmFyIGZkID0gdGhpcy5mcy5vcGVuU3luYyh0aGlzLm5tKG5hbWUpLCByZXMpO1xuICAgIHZhciBpc0NoYXJhY3RlckRldmljZSA9IHRoaXMuZnMubHN0YXRTeW5jKHRoaXMubm0obmFtZSkpLmlzQ2hhcmFjdGVyRGV2aWNlKCk7XG4gICAgZi5pc0NoYXJhY3RlckRldmljZSA9IGlzQ2hhcmFjdGVyRGV2aWNlO1xuICAgIHJldHVybiBuZXcgTWxOb2RlRmQoZmQsIGYpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5cbk1sTm9kZURldmljZS5wcm90b3R5cGUucmVuYW1lID0gZnVuY3Rpb24obywgbiwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHRoaXMuZnMucmVuYW1lU3luYyh0aGlzLm5tKG8pLCB0aGlzLm5tKG4pKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5zdGF0ID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMuc3RhdFN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHNfZnJvbV9qcyhqc19zdGF0cyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUubHN0YXQgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdmFyIGpzX3N0YXRzID0gdGhpcy5mcy5sc3RhdFN5bmModGhpcy5ubShuYW1lKSk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHNfZnJvbV9qcyhqc19zdGF0cyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuc3ltbGluayA9IGZ1bmN0aW9uKHRvX2RpciwgdGFyZ2V0LCBwYXRoLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5zeW1saW5rU3luYyh0aGlzLm5tKHRhcmdldCksIHRoaXMubm0ocGF0aCksIHRvX2RpciA/ICdkaXInIDogJ2ZpbGUnKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5yZWFkbGluayA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgbGluayA9IHRoaXMuZnMucmVhZGxpbmtTeW5jKHRoaXMubm0obmFtZSksICd1dGY4Jyk7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGxpbmspO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLm9wZW5kaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMub3BlbmRpclN5bmModGhpcy5ubShuYW1lKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUucmFpc2Vfbm9kZWpzX2Vycm9yID0gZnVuY3Rpb24oZXJyLCByYWlzZV91bml4KSB7XG4gIHZhciB1bml4X2Vycm9yID0gY2FtbF9uYW1lZF92YWx1ZShcIlVuaXguVW5peF9lcnJvclwiKTtcbiAgaWYgKHJhaXNlX3VuaXggJiYgdW5peF9lcnJvcikge1xuICAgIHZhciBhcmdzID0gbWFrZV91bml4X2Vycl9hcmdzKGVyci5jb2RlLCBlcnIuc3lzY2FsbCwgZXJyLnBhdGgsIGVyci5lcnJubyk7XG4gICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnN0YXRzX2Zyb21fanMgPSBmdW5jdGlvbihqc19zdGF0cykge1xuICAvKiA9PT1Vbml4LmZpbGVfa2luZD09PVxuICAgKiB0eXBlIGZpbGVfa2luZCA9XG4gICAqICAgICBTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgKCoqIFJlZ3VsYXIgZmlsZSAqKVxuICAgKiAgIHwgU19ESVIgICAgICAgICAgICAgICAgICAgICAgICgqKiBEaXJlY3RvcnkgKilcbiAgICogICB8IFNfQ0hSICAgICAgICAgICAgICAgICAgICAgICAoKiogQ2hhcmFjdGVyIGRldmljZSAqKVxuICAgKiAgIHwgU19CTEsgICAgICAgICAgICAgICAgICAgICAgICgqKiBCbG9jayBkZXZpY2UgKilcbiAgICogICB8IFNfTE5LICAgICAgICAgICAgICAgICAgICAgICAoKiogU3ltYm9saWMgbGluayAqKVxuICAgKiAgIHwgU19GSUZPICAgICAgICAgICAgICAgICAgICAgICgqKiBOYW1lZCBwaXBlICopXG4gICAqICAgfCBTX1NPQ0sgICAgICAgICAgICAgICAgICAgICAgKCoqIFNvY2tldCAqKVxuICAgKi9cbiAgdmFyIGZpbGVfa2luZDtcbiAgaWYgKGpzX3N0YXRzLmlzRmlsZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMDtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgZmlsZV9raW5kID0gMTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0NoYXJhY3RlckRldmljZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMjtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0Jsb2NrRGV2aWNlKCkpIHtcbiAgICBmaWxlX2tpbmQgPSAzO1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICBmaWxlX2tpbmQgPSA0O1xuICB9IGVsc2UgaWYgKGpzX3N0YXRzLmlzRklGTygpKSB7XG4gICAgZmlsZV9raW5kID0gNTtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc1NvY2tldCgpKSB7XG4gICAgZmlsZV9raW5kID0gNjtcbiAgfVxuICAvKiA9PT1Vbml4LnN0YXRzPT09XG4gICAqIHR5cGUgc3RhdHMgPVxuICAgKiAgeyBzdF9kZXYgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIERldmljZSBudW1iZXIgKilcbiAgICogICAgc3RfaW5vIDogaW50OyAgICAgICAgICAgICAgICgqKiBJbm9kZSBudW1iZXIgKilcbiAgICogICAgc3Rfa2luZCA6IGZpbGVfa2luZDsgICAgICAgICgqKiBLaW5kIG9mIHRoZSBmaWxlICopXG4gICAqICAgIHN0X3Blcm0gOiBmaWxlX3Blcm07ICAgICAgICAoKiogQWNjZXNzIHJpZ2h0cyAqKVxuICAgKiAgICBzdF9ubGluayA6IGludDsgICAgICAgICAgICAgKCoqIE51bWJlciBvZiBsaW5rcyAqKVxuICAgKiAgICBzdF91aWQgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIFVzZXIgaWQgb2YgdGhlIG93bmVyICopXG4gICAqICAgIHN0X2dpZCA6IGludDsgICAgICAgICAgICAgICAoKiogR3JvdXAgSUQgb2YgdGhlIGZpbGUncyBncm91cCAqKVxuICAgKiAgICBzdF9yZGV2IDogaW50OyAgICAgICAgICAgICAgKCoqIERldmljZSBJRCAoaWYgc3BlY2lhbCBmaWxlKSAqKVxuICAgKiAgICBzdF9zaXplIDogaW50OyAgICAgICAgICAgICAgKCoqIFNpemUgaW4gYnl0ZXMgKilcbiAgICogICAgc3RfYXRpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IGFjY2VzcyB0aW1lICopXG4gICAqICAgIHN0X210aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBtb2RpZmljYXRpb24gdGltZSAqKVxuICAgKiAgICBzdF9jdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3Qgc3RhdHVzIGNoYW5nZSB0aW1lICopXG4gICAqICB9XG4gICAqL1xuICByZXR1cm4gQkxPQ0soXG4gICAgMCxcbiAgICBqc19zdGF0cy5kZXYsXG4gICAganNfc3RhdHMuaW5vLFxuICAgIGZpbGVfa2luZCxcbiAgICBqc19zdGF0cy5tb2RlLFxuICAgIGpzX3N0YXRzLm5saW5rLFxuICAgIGpzX3N0YXRzLnVpZCxcbiAgICBqc19zdGF0cy5naWQsXG4gICAganNfc3RhdHMucmRldixcbiAgICBqc19zdGF0cy5zaXplLFxuICAgIGpzX3N0YXRzLmF0aW1lTXMsXG4gICAganNfc3RhdHMubXRpbWVNcyxcbiAgICBqc19zdGF0cy5jdGltZU1zXG4gICk7XG59XG5cbk1sTm9kZURldmljZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNbE5vZGVEZXZpY2VcblxuLy9Qcm92aWRlczogTWxOb2RlRGV2aWNlXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBNbE5vZGVEZXZpY2UoKSB7XG59XG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL1JlcXVpcmVzOiBNbEZpbGUsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nLCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX3NldCwgY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIE1sTm9kZUZkKGZkLCBmbGFncyl7XG4gIHRoaXMuZnMgPSByZXF1aXJlKCdmcycpO1xuICB0aGlzLmZkID0gZmQ7XG4gIHRoaXMuZmxhZ3MgPSBmbGFncztcbn1cbk1sTm9kZUZkLnByb3RvdHlwZSA9IG5ldyBNbEZpbGUgKCk7XG5NbE5vZGVGZC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNbE5vZGVGZDtcblxuTWxOb2RlRmQucHJvdG90eXBlLnRydW5jYXRlID0gZnVuY3Rpb24obGVuKXtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLmZ0cnVuY2F0ZVN5bmModGhpcy5mZCxsZW58MCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRmQucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5mc3RhdFN5bmModGhpcy5mZCkuc2l6ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVGZC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvZmZzZXQsYnVmLGJ1Zl9vZmZzZXQsbGVuKXtcbiAgdHJ5IHtcbiAgICBpZih0aGlzLmZsYWdzLmlzQ2hhcmFjdGVyRGV2aWNlKVxuICAgICAgdGhpcy5mcy53cml0ZVN5bmModGhpcy5mZCwgYnVmLCBidWZfb2Zmc2V0LCBsZW4pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuZnMud3JpdGVTeW5jKHRoaXMuZmQsIGJ1ZiwgYnVmX29mZnNldCwgbGVuLCBvZmZzZXQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5NbE5vZGVGZC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG9mZnNldCxhLGJ1Zl9vZmZzZXQsbGVuKXtcbiAgdHJ5IHtcbiAgICBpZih0aGlzLmZsYWdzLmlzQ2hhcmFjdGVyRGV2aWNlKVxuICAgICAgdmFyIHJlYWQgPSB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGEsIGJ1Zl9vZmZzZXQsIGxlbik7XG4gICAgZWxzZVxuICAgICAgdmFyIHJlYWQgPSB0aGlzLmZzLnJlYWRTeW5jKHRoaXMuZmQsIGEsIGJ1Zl9vZmZzZXQsIGxlbiwgb2Zmc2V0KTtcbiAgICByZXR1cm4gcmVhZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5NbE5vZGVGZC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpe1xuICB0cnkge1xuICAgIHRoaXMuZnMuY2xvc2VTeW5jKHRoaXMuZmQpO1xuICAgIHJldHVybiAwXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuXG5cbi8vUHJvdmlkZXM6IE1sTm9kZUZkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBNbE5vZGVGZCgpe1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbi8vUmVxdWlyZXM6IE1sTm9kZUZkXG5mdW5jdGlvbiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlKGZkLCBmbGFncyl7XG4gIGlmKGZsYWdzLm5hbWUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGZzID0gcmVxdWlyZShcImZzXCIpO1xuICAgICAgdmFyIGZkMiA9IGZzLm9wZW5TeW5jKGZsYWdzLm5hbWUsIFwicnNcIik7XG4gICAgICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkMiwgZmxhZ3MpO1xuICAgIH0gY2F0Y2goZSkgeyAgfVxuICB9XG4gIHJldHVybiBuZXcgTWxOb2RlRmQoZmQsIGZsYWdzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZVxuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3Mpe1xuICByZXR1cm4gbnVsbDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gRHVtbXkgZmlsZXN5c3RlbVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpe1xuICByZXR1cm4gKG5hbWUuc2xpY2UoLTEpICE9PSBcIi9cIikgPyAobmFtZSArIFwiL1wiKSA6IG5hbWU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfdHJhaWxpbmdfc2xhc2gsIGZzX25vZGVfc3VwcG9ydGVkXG5pZihmc19ub2RlX3N1cHBvcnRlZCAoKSAmJiBnbG9iYWxUaGlzLnByb2Nlc3MgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZClcbiAgdmFyIGNhbWxfY3VycmVudF9kaXIgPSBnbG9iYWxUaGlzLnByb2Nlc3MuY3dkKCkucmVwbGFjZSgvXFxcXC9nLCcvJyk7XG5lbHNlXG4gIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gIFwiL3N0YXRpY1wiO1xuY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2goY2FtbF9jdXJyZW50X2Rpcik7XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3Jvb3Rcbi8vUmVxdWlyZXM6IHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfZ2V0X3Jvb3QocGF0aCl7XG4gIHZhciB4ID0gcGF0aF9pc19hYnNvbHV0ZShwYXRoKTtcbiAgaWYgKCF4KSByZXR1cm47XG4gIHJldHVybiB4WzBdICsgXCIvXCJ9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcm9vdFxuLy9SZXF1aXJlczogY2FtbF9nZXRfcm9vdCwgY2FtbF9jdXJyZW50X2RpciwgY2FtbF9mYWlsd2l0aFxudmFyIGNhbWxfcm9vdCA9IGNhbWxfZ2V0X3Jvb3QoY2FtbF9jdXJyZW50X2RpcikgfHwgY2FtbF9mYWlsd2l0aChcInVuYWJsZSB0byBjb21wdXRlIGNhbWxfcm9vdFwiKTtcblxuXG4vL1Byb3ZpZGVzOiBNbEZpbGVcbmZ1bmN0aW9uIE1sRmlsZSgpeyAgfVxuXG4vL1Byb3ZpZGVzOiBwYXRoX2lzX2Fic29sdXRlXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gbWFrZV9wYXRoX2lzX2Fic29sdXRlKCkge1xuICBmdW5jdGlvbiBwb3NpeChwYXRoKSB7XG4gICAgaWYgKHBhdGguY2hhckF0KDApID09PSAnLycpIHJldHVybiBbXCJcIiwgcGF0aC5zdWJzdHJpbmcoMSldO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpbjMyKHBhdGgpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9iM2ZjYzI0NWZiMjU1Mzk5MDllZjFkNWVhYTAxZGJmOTJlMTY4NjMzL2xpYi9wYXRoLmpzI0w1NlxuICAgIHZhciBzcGxpdERldmljZVJlID0gL14oW2EtekEtWl06fFtcXFxcL117Mn1bXlxcXFwvXStbXFxcXC9dK1teXFxcXC9dKyk/KFtcXFxcL10pPyhbXFxzXFxTXSo/KSQvO1xuICAgIHZhciByZXN1bHQgPSBzcGxpdERldmljZVJlLmV4ZWMocGF0aCk7XG4gICAgdmFyIGRldmljZSA9IHJlc3VsdFsxXSB8fCAnJztcbiAgICB2YXIgaXNVbmMgPSBCb29sZWFuKGRldmljZSAmJiBkZXZpY2UuY2hhckF0KDEpICE9PSAnOicpO1xuXG4gICAgLy8gVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGVcbiAgICBpZiAoQm9vbGVhbihyZXN1bHRbMl0gfHwgaXNVbmMpKSB7XG4gICAgICB2YXIgcm9vdCA9IChyZXN1bHRbMV0gfHwgJycpO1xuICAgICAgdmFyIHNlcCA9IChyZXN1bHRbMl0gfHwgJycpO1xuICAgICAgcmV0dXJuIFtyb290LCBwYXRoLnN1YnN0cmluZyhyb290Lmxlbmd0aCArIHNlcC5sZW5ndGgpXVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgaWYoZnNfbm9kZV9zdXBwb3J0ZWQgKCkgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzICYmIGdsb2JhbFRoaXMucHJvY2Vzcy5wbGF0Zm9ybSkge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMiA6IHBvc2l4O1xuICB9XG4gIGVsc2UgcmV0dXJuIHBvc2l4XG59XG52YXIgcGF0aF9pc19hYnNvbHV0ZSA9IG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfcGF0aFxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpclxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIHBhdGhfaXNfYWJzb2x1dGVcbmZ1bmN0aW9uIGNhbWxfbWFrZV9wYXRoIChuYW1lKSB7XG4gIG5hbWU9Y2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmKCAhcGF0aF9pc19hYnNvbHV0ZShuYW1lKSApXG4gICAgbmFtZSA9IGNhbWxfY3VycmVudF9kaXIgKyBuYW1lO1xuICB2YXIgY29tcDAgPSBwYXRoX2lzX2Fic29sdXRlKG5hbWUpO1xuICB2YXIgY29tcCA9IGNvbXAwWzFdLnNwbGl0KFwiL1wiKTtcbiAgdmFyIG5jb21wID0gW11cbiAgZm9yKHZhciBpID0gMDsgaTxjb21wLmxlbmd0aDsgaSsrKXtcbiAgICBzd2l0Y2goY29tcFtpXSl7XG4gICAgY2FzZSBcIi4uXCI6IGlmKG5jb21wLmxlbmd0aD4xKSBuY29tcC5wb3AoKTsgYnJlYWs7XG4gICAgY2FzZSBcIi5cIjogYnJlYWs7XG4gICAgY2FzZSBcIlwiOiBicmVhaztcbiAgICBkZWZhdWx0OiBuY29tcC5wdXNoKGNvbXBbaV0pO2JyZWFrXG4gICAgfVxuICB9XG4gIG5jb21wLnVuc2hpZnQoY29tcDBbMF0pO1xuICBuY29tcC5vcmlnID0gbmFtZTtcbiAgcmV0dXJuIG5jb21wO1xufVxuXG4vL1Byb3ZpZGVzOmpzb29fbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IE1sRmFrZURldmljZSwgTWxOb2RlRGV2aWNlLCBjYW1sX3Jvb3QsIGZzX25vZGVfc3VwcG9ydGVkXG52YXIganNvb19tb3VudF9wb2ludCA9IFtdXG5pZiAoZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICBqc29vX21vdW50X3BvaW50LnB1c2goe3BhdGg6Y2FtbF9yb290LGRldmljZTpuZXcgTWxOb2RlRGV2aWNlKGNhbWxfcm9vdCl9KTtcbn0gZWxzZSB7XG4gIGpzb29fbW91bnRfcG9pbnQucHVzaCh7cGF0aDpjYW1sX3Jvb3QsZGV2aWNlOm5ldyBNbEZha2VEZXZpY2UoY2FtbF9yb290KX0pO1xufVxuanNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOlwiL3N0YXRpYy9cIiwgZGV2aWNlOm5ldyBNbEZha2VEZXZpY2UoXCIvc3RhdGljL1wiKX0pO1xuXG4vL1Byb3ZpZGVzOmNhbWxfbGlzdF9tb3VudF9wb2ludFxuLy9SZXF1aXJlczoganNvb19tb3VudF9wb2ludCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9saXN0X21vdW50X3BvaW50KCl7XG4gIHZhciBwcmV2ID0gMFxuICBmb3IodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKyl7XG4gICAgdmFyIG9sZCA9IHByZXY7XG4gICAgcHJldiA9IFswLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGpzb29fbW91bnRfcG9pbnRbaV0ucGF0aCksIG9sZF1cbiAgfVxuICByZXR1cm4gcHJldjtcbn1cblxuLy9Qcm92aWRlczogcmVzb2x2ZV9mc19kZXZpY2Vcbi8vUmVxdWlyZXM6IGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9nZXRfcm9vdCwgTWxOb2RlRGV2aWNlLCBjYW1sX3RyYWlsaW5nX3NsYXNoLCBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSl7XG4gIHZhciBwYXRoID0gY2FtbF9tYWtlX3BhdGgobmFtZSk7XG4gIHZhciBuYW1lID0gcGF0aC5qb2luKFwiL1wiKTtcbiAgdmFyIG5hbWVfc2xhc2ggPSBjYW1sX3RyYWlsaW5nX3NsYXNoKG5hbWUpO1xuICB2YXIgcmVzO1xuICBmb3IodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtID0ganNvb19tb3VudF9wb2ludFtpXTtcbiAgICBpZihuYW1lX3NsYXNoLnNlYXJjaChtLnBhdGgpID09IDBcbiAgICAgICAmJiAoIXJlcyB8fCByZXMucGF0aC5sZW5ndGggPCBtLnBhdGgubGVuZ3RoKSlcbiAgICAgIHJlcyA9IHtwYXRoOm0ucGF0aCxkZXZpY2U6bS5kZXZpY2UscmVzdDpuYW1lLnN1YnN0cmluZyhtLnBhdGgubGVuZ3RoLG5hbWUubGVuZ3RoKX07XG4gIH1cbiAgaWYoICFyZXMgJiYgZnNfbm9kZV9zdXBwb3J0ZWQoKSkge1xuICAgIHZhciByb290ID0gY2FtbF9nZXRfcm9vdChuYW1lKTtcbiAgICBpZiAocm9vdCAmJiByb290Lm1hdGNoKC9eW2EtekEtWl06XFwvJC8pKXtcbiAgICAgIHZhciBtID0ge3BhdGg6cm9vdCxkZXZpY2U6bmV3IE1sTm9kZURldmljZShyb290KX07XG4gICAgICBqc29vX21vdW50X3BvaW50LnB1c2gobSk7XG4gICAgICByZXMgPSB7cGF0aDptLnBhdGgsZGV2aWNlOm0uZGV2aWNlLHJlc3Q6bmFtZS5zdWJzdHJpbmcobS5wYXRoLmxlbmd0aCxuYW1lLmxlbmd0aCl9O1xuICAgIH1cbiAgfVxuICBpZiggcmVzICkgcmV0dXJuIHJlcztcbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJubyBkZXZpY2UgZm91bmQgZm9yIFwiICsgbmFtZV9zbGFzaCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbW91bnRfYXV0b2xvYWRcbi8vUmVxdWlyZXM6IE1sRmFrZURldmljZSwgY2FtbF9tYWtlX3BhdGgsIGpzb29fbW91bnRfcG9pbnQsIGNhbWxfdHJhaWxpbmdfc2xhc2hcbmZ1bmN0aW9uIGNhbWxfbW91bnRfYXV0b2xvYWQobmFtZSxmKXtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHBhdGguam9pbihcIi9cIikpO1xuICBqc29vX21vdW50X3BvaW50LnB1c2goe3BhdGg6bmFtZSxkZXZpY2U6bmV3IE1sRmFrZURldmljZShuYW1lLGYpfSlcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5tb3VudFxuLy9SZXF1aXJlczoganNvb19tb3VudF9wb2ludCwgY2FtbF9tYWtlX3BhdGgsIGNhbWxfdHJhaWxpbmdfc2xhc2hcbmZ1bmN0aW9uIGNhbWxfdW5tb3VudChuYW1lKXtcbiAgdmFyIHBhdGggPSBjYW1sX21ha2VfcGF0aChuYW1lKTtcbiAgdmFyIG5hbWUgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKHBhdGguam9pbihcIi9cIikpO1xuICB2YXIgaWR4ID0gLTE7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBqc29vX21vdW50X3BvaW50Lmxlbmd0aDsgaSsrKVxuICAgIGlmKGpzb29fbW91bnRfcG9pbnRbaV0ucGF0aCA9PSBuYW1lKSBpZHggPSBpO1xuICBpZihpZHggPiAtMSkganNvb19tb3VudF9wb2ludC5zcGxpY2UoaWR4LDEpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRjd2Rcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXIsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldGN3ZCgpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY2FtbF9jdXJyZW50X2Rpcik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NoZGlyXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfZGlyLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSwgcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfdHJhaWxpbmdfc2xhc2gsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX2NoZGlyKGRpcikge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKGRpcik7XG4gIGlmKHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpKSB7XG4gICAgaWYocm9vdC5yZXN0KSBjYW1sX2N1cnJlbnRfZGlyID0gY2FtbF90cmFpbGluZ19zbGFzaChyb290LnBhdGggKyByb290LnJlc3QpO1xuICAgIGVsc2UgY2FtbF9jdXJyZW50X2RpciA9IHJvb3QucGF0aDtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBlbHNlIHtcbiAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGRpcikpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUobmFtZSl7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmFpc2Vfbm90X2FfZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuZnVuY3Rpb24gY2FtbF9yYWlzZV9ub3RfYV9kaXIobmFtZSl7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yIChuYW1lICsgXCI6IE5vdCBhIGRpcmVjdG9yeVwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZmlsZV9leGlzdHNcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19maWxlX2V4aXN0cyAobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByZXR1cm4gcm9vdC5kZXZpY2UuZXhpc3RzKHJvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9hX2RpciwgcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5KG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLnJlYWRkaXIocm9vdC5yZXN0KTtcbiAgdmFyIGwgPSBuZXcgQXJyYXkoYS5sZW5ndGggKyAxKTtcbiAgbFswXSA9IDA7XG4gIGZvcih2YXIgaT0wO2k8YS5sZW5ndGg7aSsrKVxuICAgIGxbaSsxXSA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoYVtpXSk7XG4gIHJldHVybiBsO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZW1vdmVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zeXNfcmVtb3ZlKG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgb2sgPSByb290LmRldmljZS51bmxpbmsocm9vdC5yZXN0KTtcbiAgaWYob2sgPT0gMCkgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19pc19kaXJlY3Rvcnlcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19pc19kaXJlY3RvcnkobmFtZSl7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBhID0gcm9vdC5kZXZpY2UuaXNfZGlyKHJvb3QucmVzdCk7XG4gIHJldHVybiBhPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVuYW1lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfcmVuYW1lKG8sbil7XG4gIHZhciBvX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShvKTtcbiAgdmFyIG5fcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG4pO1xuICBpZihvX3Jvb3QuZGV2aWNlICE9IG5fcm9vdC5kZXZpY2UpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogY2Fubm90IG1vdmUgZmlsZSBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtXCIpO1xuICBpZighb19yb290LmRldmljZS5yZW5hbWUpXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfc3lzX3JlbmFtZTogbm8gaW1wbGVtZW50ZWRcIik7XG4gIG9fcm9vdC5kZXZpY2UucmVuYW1lKG9fcm9vdC5yZXN0LCBuX3Jvb3QucmVzdCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX21rZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfc3lzX21rZGlyKG5hbWUsIHBlcm0pe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ta2Rpcihyb290LnJlc3QscGVybSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19ybWRpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vdF9hX2RpclxuZnVuY3Rpb24gY2FtbF9zeXNfcm1kaXIobmFtZSl7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJvb3QuZGV2aWNlLnJtZGlyKHJvb3QucmVzdCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX21hcF9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2JhX21hcF9maWxlKHZmZCwga2luZCwgbGF5b3V0LCBzaGFyZWQsIGRpbXMsIHBvcykge1xuICAvLyB2YXIgZGF0YSA9IGNhbWxfc3lzX2Zkc1t2ZmRdO1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9iYV9tYXBfZmlsZSBub3QgaW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfbWFwX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfYmFfbWFwX2ZpbGVfYnl0ZWNvZGUoYXJndixhcmduKXtcbiAgcmV0dXJuIGNhbWxfYmFfbWFwX2ZpbGUoYXJndlswXSxhcmd2WzFdLGFyZ3ZbMl0sYXJndlszXSxhcmd2WzRdLGFyZ3ZbNV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX2NyZWF0ZV9maWxlX2V4dGVyblxuZnVuY3Rpb24ganNvb19jcmVhdGVfZmlsZV9leHRlcm4obmFtZSxjb250ZW50KXtcbiAgaWYoZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlKVxuICAgIGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZShuYW1lLGNvbnRlbnQpO1xuICBlbHNlIHtcbiAgICBpZighZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCkgZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCA9IFtdO1xuICAgIGdsb2JhbFRoaXMuY2FtbF9mc190bXAucHVzaCh7bmFtZTpuYW1lLGNvbnRlbnQ6Y29udGVudH0pO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZzX2luaXRcbi8vUmVxdWlyZXM6IGpzb29fY3JlYXRlX2ZpbGVcbmZ1bmN0aW9uIGNhbWxfZnNfaW5pdCAoKXtcbiAgdmFyIHRtcD1nbG9iYWxUaGlzLmNhbWxfZnNfdG1wXG4gIGlmKHRtcCl7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKyl7XG4gICAgICBqc29vX2NyZWF0ZV9maWxlKHRtcFtpXS5uYW1lLHRtcFtpXS5jb250ZW50KTtcbiAgICB9XG4gIH1cbiAgZ2xvYmFsVGhpcy5qc29vX2NyZWF0ZV9maWxlID0ganNvb19jcmVhdGVfZmlsZTtcbiAgZ2xvYmFsVGhpcy5jYW1sX2ZzX3RtcCA9IFtdO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2ZpbGUobmFtZSxjb250ZW50KSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmKCEgcm9vdC5kZXZpY2UucmVnaXN0ZXIpIGNhbWxfZmFpbHdpdGgoXCJjYW5ub3QgcmVnaXN0ZXIgZmlsZVwiKTtcbiAgcm9vdC5kZXZpY2UucmVnaXN0ZXIocm9vdC5yZXN0LGNvbnRlbnQpO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBqc29vX2NyZWF0ZV9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9maWxlLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBqc29vX2NyZWF0ZV9maWxlKG5hbWUsY29udGVudCkge1xuICB2YXIgbmFtZSA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMobmFtZSk7XG4gIHZhciBjb250ZW50ID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhjb250ZW50KTtcbiAgcmV0dXJuIGNhbWxfY3JlYXRlX2ZpbGUobmFtZSwgY29udGVudCk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9yZWFkX2ZpbGVfY29udGVudFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlLCBjYW1sX3N0cmluZ19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9yZWFkX2ZpbGVfY29udGVudCAobmFtZSkge1xuICB2YXIgbmFtZSA9ICh0eXBlb2YgbmFtZSA9PSBcInN0cmluZ1wiKT9jYW1sX3N0cmluZ19vZl9qc2J5dGVzKG5hbWUpOm5hbWU7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmKHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpKSB7XG4gICAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCx7cmRvbmx5OjF9KTtcbiAgICB2YXIgbGVuICA9IGZpbGUubGVuZ3RoKCk7XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgZmlsZS5yZWFkKDAsYnVmLDAsbGVuKTtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkoYnVmKVxuICB9XG4gIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKGNhbWxfanNieXRlc19vZl9zdHJpbmcobmFtZSkpO1xufVxuIiwiLy9Qcm92aWRlczogY2FtbF91bml4X2dldHRpbWVvZmRheVxuLy9BbGlhczogdW5peF9nZXR0aW1lb2ZkYXlcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXR0aW1lb2ZkYXkgKCkge1xuICByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF90aW1lXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5XG4vL0FsaWFzOiB1bml4X3RpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF90aW1lICgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoY2FtbF91bml4X2dldHRpbWVvZmRheSAoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nbXRpbWVcbi8vQWxpYXM6IHVuaXhfZ210aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ210aW1lICh0KSB7XG4gIHZhciBkID0gbmV3IERhdGUgKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSAobmV3IERhdGUoRGF0ZS5VVEMoZC5nZXRVVENGdWxsWWVhcigpLCAwLCAxKSkpLmdldFRpbWUoKTtcbiAgdmFyIGRveSA9IE1hdGguZmxvb3IoKGRfbnVtIC0gamFudWFyeWZpcnN0KSAvIDg2NDAwMDAwKTtcbiAgcmV0dXJuIEJMT0NLKDAsIGQuZ2V0VVRDU2Vjb25kcygpLCBkLmdldFVUQ01pbnV0ZXMoKSwgZC5nZXRVVENIb3VycygpLFxuICAgICAgICAgICAgICAgZC5nZXRVVENEYXRlKCksIGQuZ2V0VVRDTW9udGgoKSwgZC5nZXRVVENGdWxsWWVhcigpIC0gMTkwMCxcbiAgICAgICAgICAgICAgIGQuZ2V0VVRDRGF5KCksIGRveSxcbiAgICAgICAgICAgICAgIGZhbHNlIHwgMCAvKiBmb3IgVVRDIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpcyBmYWxzZSAqLylcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2xvY2FsdGltZVxuLy9BbGlhczogdW5peF9sb2NhbHRpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9sb2NhbHRpbWUgKHQpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSAodCAqIDEwMDApO1xuICB2YXIgZF9udW0gPSBkLmdldFRpbWUoKTtcbiAgdmFyIGphbnVhcnlmaXJzdCA9IChuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDAsIDEpKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHZhciBqYW4gPSBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIDAsIDEpO1xuICB2YXIganVsID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCA2LCAxKTtcbiAgdmFyIHN0ZFRpbWV6b25lT2Zmc2V0ID0gTWF0aC5tYXgoamFuLmdldFRpbWV6b25lT2Zmc2V0KCksIGp1bC5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgcmV0dXJuIEJMT0NLKDAsIGQuZ2V0U2Vjb25kcygpLCBkLmdldE1pbnV0ZXMoKSwgZC5nZXRIb3VycygpLFxuICAgICAgICAgICAgICAgZC5nZXREYXRlKCksIGQuZ2V0TW9udGgoKSwgZC5nZXRGdWxsWWVhcigpIC0gMTkwMCxcbiAgICAgICAgICAgICAgIGQuZ2V0RGF5KCksIGRveSxcbiAgICAgICAgICAgICAgIChkLmdldFRpbWV6b25lT2Zmc2V0KCkgPCBzdGRUaW1lem9uZU9mZnNldCkgfCAwIC8qIGRheWxpZ2h0IHNhdmluZ3MgdGltZSAgZmllbGQuICovKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbWt0aW1lXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfbG9jYWx0aW1lXG4vL0FsaWFzOiB1bml4X21rdGltZVxuZnVuY3Rpb24gY2FtbF91bml4X21rdGltZSh0bSl7XG4gIHZhciBkID0gKG5ldyBEYXRlKHRtWzZdKzE5MDAsdG1bNV0sdG1bNF0sdG1bM10sdG1bMl0sdG1bMV0pKS5nZXRUaW1lKCk7XG4gIHZhciB0ID0gTWF0aC5mbG9vcihkIC8gMTAwMCk7XG4gIHZhciB0bTIgPSBjYW1sX3VuaXhfbG9jYWx0aW1lKHQpO1xuICByZXR1cm4gQkxPQ0soMCx0LHRtMik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhcnR1cCBjb25zdFxuLy9BbGlhczogd2luX3N0YXJ0dXBcbmZ1bmN0aW9uIGNhbWxfdW5peF9zdGFydHVwKCkge31cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2NsZWFudXAgY29uc3Rcbi8vQWxpYXM6IHdpbl9jbGVhbnVwXG5mdW5jdGlvbiBjYW1sX3VuaXhfY2xlYW51cCgpIHt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maWxlZGVzY3Jfb2ZfZmQgY29uc3Rcbi8vQWxpYXM6IHdpbl9oYW5kbGVfZmRcbmZ1bmN0aW9uIGNhbWxfdW5peF9maWxlZGVzY3Jfb2ZfZmQoeCkge3JldHVybiB4O31cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2lzYXR0eVxuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vQWxpYXM6IHVuaXhfaXNhdHR5XG5mdW5jdGlvbiBjYW1sX3VuaXhfaXNhdHR5KGZpbGVEZXNjcmlwdG9yKSB7XG4gIGlmKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAgICB2YXIgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG4gICAgcmV0dXJuIHR0eS5pc2F0dHkoZmlsZURlc2NyaXB0b3IpPzE6MDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vQWxpYXM6IHVuaXhfaXNhdHR5XG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBjYW1sX3VuaXhfaXNhdHR5KGZpbGVEZXNjcmlwdG9yKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBtYWtlX3VuaXhfZXJyX2FyZ3Ncbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG52YXIgdW5peF9lcnJvciA9IFtcbiAgLyogPT09VW5peC5lcnJvcj09PVxuICAgKlxuICAgKiBUaGlzIGFycmF5IGlzIGluIG9yZGVyIG9mIHRoZSB2YXJpYW50IGluIE9DYW1sXG4gICAqL1xuICBcIkUyQklHXCIsIFwiRUFDQ0VTXCIsIFwiRUFHQUlOXCIsIFwiRUJBREZcIiwgXCJFQlVTWVwiLCBcIkVDSElMRFwiLCBcIkVERUFETEtcIiwgXCJFRE9NXCIsXG4gIFwiRUVYSVNUXCIsIFwiRUZBVUxUXCIsIFwiRUZCSUdcIiwgXCJFSU5UUlwiLCBcIkVJTlZBTFwiLCBcIkVJT1wiLCBcIkVJU0RJUlwiLCBcIkVNRklMRVwiLFxuICBcIkVNTElOS1wiLCBcIkVOQU1FVE9PTE9OR1wiLCBcIkVORklMRVwiLCBcIkVOT0RFVlwiLCBcIkVOT0VOVFwiLCBcIkVOT0VYRUNcIiwgXCJFTk9MQ0tcIixcbiAgXCJFTk9NRU1cIiwgXCJFTk9TUENcIiwgXCJFTk9TWVNcIiwgXCJFTk9URElSXCIsIFwiRU5PVEVNUFRZXCIsIFwiRU5PVFRZXCIsIFwiRU5YSU9cIixcbiAgXCJFUEVSTVwiLCBcIkVQSVBFXCIsIFwiRVJBTkdFXCIsIFwiRVJPRlNcIiwgXCJFU1BJUEVcIiwgXCJFU1JDSFwiLCBcIkVYREVWXCIsIFwiRVdPVUxEQkxPQ0tcIixcbiAgXCJFSU5QUk9HUkVTU1wiLCBcIkVBTFJFQURZXCIsIFwiRU5PVFNPQ0tcIiwgXCJFREVTVEFERFJSRVFcIiwgXCJFTVNHU0laRVwiLFxuICBcIkVQUk9UT1RZUEVcIiwgXCJFTk9QUk9UT09QVFwiLCBcIkVQUk9UT05PU1VQUE9SVFwiLCBcIkVTT0NLVE5PU1VQUE9SVFwiLFxuICBcIkVPUE5PVFNVUFBcIiwgXCJFUEZOT1NVUFBPUlRcIiwgXCJFQUZOT1NVUFBPUlRcIiwgXCJFQUREUklOVVNFXCIsIFwiRUFERFJOT1RBVkFJTFwiLFxuICBcIkVORVRET1dOXCIsIFwiRU5FVFVOUkVBQ0hcIiwgXCJFTkVUUkVTRVRcIiwgXCJFQ09OTkFCT1JURURcIiwgXCJFQ09OTlJFU0VUXCIsIFwiRU5PQlVGU1wiLFxuICBcIkVJU0NPTk5cIiwgXCJFTk9UQ09OTlwiLCBcIkVTSFVURE9XTlwiLCBcIkVUT09NQU5ZUkVGU1wiLCBcIkVUSU1FRE9VVFwiLCBcIkVDT05OUkVGVVNFRFwiLFxuICBcIkVIT1NURE9XTlwiLCBcIkVIT1NUVU5SRUFDSFwiLCBcIkVMT09QXCIsIFwiRU9WRVJGTE9XXCJcbl07XG5mdW5jdGlvbiBtYWtlX3VuaXhfZXJyX2FyZ3MoY29kZSwgc3lzY2FsbCwgcGF0aCwgZXJybm8pIHtcbiAgdmFyIHZhcmlhbnQgPSB1bml4X2Vycm9yLmluZGV4T2YoY29kZSk7XG4gIGlmICh2YXJpYW50IDwgMCkge1xuICAgIC8vIERlZmF1bHQgaWYgdW5kZWZpbmVkXG4gICAgaWYgKGVycm5vID09IG51bGwpIHtcbiAgICAgIGVycm5vID0gLTk5OTlcbiAgICB9XG4gICAgLy8gSWYgbm9uZSBvZiB0aGUgYWJvdmUgdmFyaWFudHMsIGZhbGxiYWNrIHRvIEVVTktOT1dORVJSKGludClcbiAgICB2YXJpYW50ID0gQkxPQ0soMCwgZXJybm8pO1xuICB9XG4gIHZhciBhcmdzID0gW1xuICAgIHZhcmlhbnQsXG4gICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoc3lzY2FsbCB8fCBcIlwiKSxcbiAgICBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhwYXRoIHx8IFwiXCIpXG4gIF07XG4gIHJldHVybiBhcmdzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3RhdFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnN0YXQpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uuc3RhdChyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9zdGF0XzY0XG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfc3RhdCwgY2FtbF9pbnQ2NF9vZl9pbnQzMlxuLy9BbGlhczogdW5peF9zdGF0XzY0XG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhdF82NChuYW1lKSB7XG4gIHZhciByID0gY2FtbF91bml4X3N0YXQobmFtZSk7XG4gIHJbOV0gPSBjYW1sX2ludDY0X29mX2ludDMyKHJbOV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbHN0YXRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X2xzdGF0XG5mdW5jdGlvbiBjYW1sX3VuaXhfbHN0YXQobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLmxzdGF0KSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9sc3RhdDogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5sc3RhdChyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sc3RhdF82NFxuLy9SZXF1aXJlczogY2FtbF91bml4X2xzdGF0LCBjYW1sX2ludDY0X29mX2ludDMyXG4vL0FsaWFzOiB1bml4X2xzdGF0XzY0XG5mdW5jdGlvbiBjYW1sX3VuaXhfbHN0YXRfNjQobmFtZSkge1xuICB2YXIgciA9IGNhbWxfdW5peF9sc3RhdChuYW1lKTtcbiAgcls5XSA9IGNhbWxfaW50NjRfb2ZfaW50MzIocls5XSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfbWtkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9ta2RpcihuYW1lLCBwZXJtKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UubWtkaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X21rZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLm1rZGlyKHJvb3QucmVzdCwgcGVybSwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JtZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9ybWRpclxuZnVuY3Rpb24gY2FtbF91bml4X3JtZGlyKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5ybWRpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfcm1kaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2Uucm1kaXIocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3ltbGlua1xuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfc3ltbGlua1xuZnVuY3Rpb24gY2FtbF91bml4X3N5bWxpbmsodG9fZGlyLCBzcmMsIGRzdCkge1xuICB2YXIgc3JjX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShzcmMpO1xuICB2YXIgZHN0X3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkc3QpO1xuICBpZihzcmNfcm9vdC5kZXZpY2UgIT0gZHN0X3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfc3ltbGluazogY2Fubm90IHN5bWxpbmsgYmV0d2VlbiB0d28gZmlsZXN5c3RlbXNcIik7XG4gIGlmICghc3JjX3Jvb3QuZGV2aWNlLnN5bWxpbmspIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N5bWxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gc3JjX3Jvb3QuZGV2aWNlLnN5bWxpbmsodG9fZGlyLCBzcmNfcm9vdC5yZXN0LCBkc3Rfcm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmVhZGxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3JlYWRsaW5rXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVhZGxpbmsobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnJlYWRsaW5rKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9yZWFkbGluazogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5yZWFkbGluayhyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF91bmxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3VubGlua1xuZnVuY3Rpb24gY2FtbF91bml4X3VubGluayhuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2UudW5saW5rKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF91bmxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UudW5saW5rKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldHVpZFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vQWxpYXM6IHVuaXhfZ2V0dWlkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0dWlkKHVuaXQpIHtcbiAgaWYoZ2xvYmFsVGhpcy5wcm9jZXNzICYmIGdsb2JhbFRoaXMucHJvY2Vzcy5nZXR1aWQpe1xuICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0dWlkKCk7XG4gIH1cbiAgY2FtbF9yYWlzZV9ub3RfZm91bmQoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2dldHB3dWlkXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vdF9mb3VuZFxuLy9BbGlhczogdW5peF9nZXRwd3VpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldHB3dWlkKHVuaXQpIHtcbiAgY2FtbF9yYWlzZV9ub3RfZm91bmQoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2hhc19zeW1saW5rXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9BbGlhczogdW5peF9oYXNfc3ltbGlua1xuZnVuY3Rpb24gY2FtbF91bml4X2hhc19zeW1saW5rKHVuaXQpIHtcbiAgcmV0dXJuIGZzX25vZGVfc3VwcG9ydGVkKCk/MTowXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9vcGVuZGlyXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9vcGVuZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfb3BlbmRpcihwYXRoKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UocGF0aCk7XG4gIGlmICghcm9vdC5kZXZpY2Uub3BlbmRpcikge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfb3BlbmRpcjogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHZhciBkaXJfaGFuZGxlID0gcm9vdC5kZXZpY2Uub3BlbmRpcihyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG4gIHJldHVybiB7IHBvaW50ZXIgOiBkaXJfaGFuZGxlLCBwYXRoOiBwYXRoIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRkaXJcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlXG4vL0FsaWFzOiB1bml4X3JlYWRkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpIHtcbiAgdmFyIGVudHJ5O1xuICB0cnkge1xuICAgICAgZW50cnkgPSBkaXJfaGFuZGxlLnBvaW50ZXIucmVhZFN5bmMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgICAgdmFyIHVuaXhfZXJyb3IgPSBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVCQURGXCIsIFwicmVhZGRpclwiLCBkaXJfaGFuZGxlLnBhdGgpKTtcbiAgfVxuICBpZiAoZW50cnkgPT09IG51bGwpIHtcbiAgICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhlbnRyeS5uYW1lKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfY2xvc2VkaXJcbi8vUmVxdWlyZXM6IG1ha2VfdW5peF9lcnJfYXJncywgY2FtbF9yYWlzZV93aXRoX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVcbi8vQWxpYXM6IHVuaXhfY2xvc2VkaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKSB7XG4gIHRyeSB7XG4gICAgICBkaXJfaGFuZGxlLnBvaW50ZXIuY2xvc2VTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhciB1bml4X2Vycm9yID0gY2FtbF9uYW1lZF92YWx1ZSgnVW5peC5Vbml4X2Vycm9yJyk7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFQkFERlwiLCBcImNsb3NlZGlyXCIsIGRpcl9oYW5kbGUucGF0aCkpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZXdpbmRkaXJcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9jbG9zZWRpciwgY2FtbF91bml4X29wZW5kaXJcbi8vQWxpYXM6IHVuaXhfcmV3aW5kZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmV3aW5kZGlyKGRpcl9oYW5kbGUpIHtcbiAgY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpO1xuICB2YXIgbmV3X2Rpcl9oYW5kbGUgPSBjYW1sX3VuaXhfb3BlbmRpcihkaXJfaGFuZGxlLnBhdGgpO1xuICBkaXJfaGFuZGxlLnBvaW50ZXIgPSBuZXdfZGlyX2hhbmRsZS5wb2ludGVyO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRmaXJzdFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfb3BlbmRpciwgY2FtbF91bml4X3JlYWRkaXJcbi8vQWxpYXM6IHdpbl9maW5kZmlyc3RcbmZ1bmN0aW9uIGNhbWxfdW5peF9maW5kZmlyc3QocGF0aCkge1xuICAvLyBUaGUgV2luZG93cyBjb2RlIGFkZHMgdGhpcyBnbG9iIHRvIHRoZSBwYXRoLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdFxuICB2YXIgcGF0aF9qcyA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHBhdGgpO1xuICBwYXRoX2pzID0gcGF0aF9qcy5yZXBsYWNlKC8oXnxbXFxcXFxcL10pXFwqXFwuXFwqJC8sIFwiXCIpO1xuICBwYXRoID0gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocGF0aF9qcyk7XG4gIC8vICouKiBpcyBub3cgc3RyaXBwZWRcbiAgdmFyIGRpcl9oYW5kbGUgPSBjYW1sX3VuaXhfb3BlbmRpcihwYXRoKTtcbiAgdmFyIGZpcnN0X2VudHJ5ID0gY2FtbF91bml4X3JlYWRkaXIoZGlyX2hhbmRsZSk7XG4gIC8vIFRoZSBXaW5kb3dzIGJpbmRpbmdzIHR5cGUgZGlyX2hhbmRsZSBhcyBhbiBgaW50YCBidXQgaXQncyBub3QgaW4gSlNcbiAgcmV0dXJuIFswLCBmaXJzdF9lbnRyeSwgZGlyX2hhbmRsZV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kbmV4dFxuLy9SZXF1aXJlczogY2FtbF91bml4X3JlYWRkaXJcbi8vQWxpYXM6IHdpbl9maW5kbmV4dFxuZnVuY3Rpb24gY2FtbF91bml4X2ZpbmRuZXh0KGRpcl9oYW5kbGUpIHtcbiAgcmV0dXJuIGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmluZGNsb3NlXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfY2xvc2VkaXJcbi8vQWxpYXM6IHdpbl9maW5kY2xvc2VcbmZ1bmN0aW9uIGNhbWxfdW5peF9maW5kY2xvc2UoZGlyX2hhbmRsZSkge1xuICByZXR1cm4gY2FtbF91bml4X2Nsb3NlZGlyKGRpcl9oYW5kbGUpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nXG4vL0FsaWFzOiB1bml4X2luZXRfYWRkcl9vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nICgpIHtyZXR1cm4gMDt9XG5cblxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogTWxGYWtlRGV2aWNlXG4vL1JlcXVpcmVzOiBNbEZha2VGaWxlLCBNbEZha2VGZCwgY2FtbF9jcmVhdGVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2ZfYXJyYXksIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3JhaXNlX3dpdGhfYXJncywgY2FtbF9uYW1lZF92YWx1ZXNcbi8vUmVxdWlyZXM6IG1ha2VfdW5peF9lcnJfYXJnc1xuZnVuY3Rpb24gTWxGYWtlRGV2aWNlIChyb290LCBmKSB7XG4gIHRoaXMuY29udGVudD17fTtcbiAgdGhpcy5yb290ID0gcm9vdDtcbiAgdGhpcy5sb29rdXBGdW4gPSBmO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5ubSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuICh0aGlzLnJvb3QgKyBuYW1lKTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUuY3JlYXRlX2Rpcl9pZl9uZWVkZWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjb21wID0gbmFtZS5zcGxpdChcIi9cIik7XG4gIHZhciByZXMgPSBcIlwiO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgY29tcC5sZW5ndGggLSAxOyBpKyspe1xuICAgIHJlcyArPSBjb21wW2ldICsgXCIvXCI7XG4gICAgaWYodGhpcy5jb250ZW50W3Jlc10pIGNvbnRpbnVlO1xuICAgIHRoaXMuY29udGVudFtyZXNdID0gU3ltYm9sKFwiZGlyZWN0b3J5XCIpO1xuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnNsYXNoID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiAvXFwvJC8udGVzdChuYW1lKT9uYW1lOihuYW1lICsgXCIvXCIpO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5sb29rdXAgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGlmKCF0aGlzLmNvbnRlbnRbbmFtZV0gJiYgdGhpcy5sb29rdXBGdW4pIHtcbiAgICB2YXIgcmVzID0gdGhpcy5sb29rdXBGdW4oY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh0aGlzLnJvb3QpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKG5hbWUpKTtcbiAgICBpZihyZXMgIT09IDApIHtcbiAgICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgICB0aGlzLmNvbnRlbnRbbmFtZV09bmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9zdHJpbmcocmVzWzFdKSk7XG4gICAgfVxuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmV4aXN0cyA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgLy8gVGhlIHJvb3Qgb2YgdGhlIGRldmljZSBleGlzdHNcbiAgaWYobmFtZSA9PSBcIlwiKSByZXR1cm4gMTtcbiAgLy8gQ2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzXG4gIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgaWYodGhpcy5jb250ZW50W25hbWVfc2xhc2hdKSByZXR1cm4gMTtcbiAgLy8gQ2hlY2sgaWYgYSBmaWxlIGV4aXN0c1xuICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lXT8xOjA7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmlzRmlsZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYodGhpcy5leGlzdHMobmFtZSkgJiYgIXRoaXMuaXNfZGlyKG5hbWUpKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gMFxuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm1rZGlyID0gZnVuY3Rpb24obmFtZSxtb2RlLCByYWlzZV91bml4KSB7XG4gIHZhciB1bml4X2Vycm9yID0gcmFpc2VfdW5peCAmJiBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcbiAgaWYodGhpcy5leGlzdHMobmFtZSkpIHtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUVYSVNUXCIsIFwibWtkaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogRmlsZSBleGlzdHNcIik7XG4gICAgfVxuICB9XG4gIHZhciBwYXJlbnQgPSAvXiguKilcXC9bXi9dKy8uZXhlYyhuYW1lKTtcbiAgcGFyZW50ID0gKHBhcmVudCAmJiBwYXJlbnRbMV0pIHx8ICcnO1xuICBpZighdGhpcy5leGlzdHMocGFyZW50KSl7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT0VOVFwiLCBcIm1rZGlyXCIsIHRoaXMubm0ocGFyZW50KSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHBhcmVudCArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICBpZighdGhpcy5pc19kaXIocGFyZW50KSl7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT1RESVJcIiwgXCJta2RpclwiLCB0aGlzLm5tKHBhcmVudCkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihwYXJlbnQgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKHRoaXMuc2xhc2gobmFtZSkpO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5ybWRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdmFyIHVuaXhfZXJyb3IgPSByYWlzZV91bml4ICYmIGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuICB2YXIgbmFtZV9zbGFzaCA9IChuYW1lID09IFwiXCIpP1wiXCI6KHRoaXMuc2xhc2gobmFtZSkpO1xuICB2YXIgciA9IG5ldyBSZWdFeHAoXCJeXCIgKyBuYW1lX3NsYXNoICsgXCIoW14vXSspXCIpO1xuICBpZighdGhpcy5leGlzdHMobmFtZSkpIHtcbiAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PRU5UXCIsIFwicm1kaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cbiAgaWYoIXRoaXMuaXNfZGlyKG5hbWUpKSB7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT1RESVJcIiwgXCJybWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG4gICAgfVxuICB9XG4gIGZvcih2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICBpZihuLm1hdGNoKHIpKSB7XG4gICAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9URU1QVFlcIiwgXCJybWRpclwiLCB0aGlzLm5tKG5hbWUpKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCI6IERpcmVjdG9yeSBub3QgZW1wdHlcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF07XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnJlYWRkaXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBuYW1lX3NsYXNoID0gKG5hbWUgPT0gXCJcIik/XCJcIjoodGhpcy5zbGFzaChuYW1lKSk7XG4gIGlmKCF0aGlzLmV4aXN0cyhuYW1lKSkge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbiAgfVxuICBpZighdGhpcy5pc19kaXIobmFtZSkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vdCBhIGRpcmVjdG9yeVwiKTtcbiAgfVxuICB2YXIgciA9IG5ldyBSZWdFeHAoXCJeXCIgKyBuYW1lX3NsYXNoICsgXCIoW14vXSspXCIpO1xuICB2YXIgc2VlbiA9IHt9XG4gIHZhciBhID0gW107XG4gIGZvcih2YXIgbiBpbiB0aGlzLmNvbnRlbnQpIHtcbiAgICB2YXIgbSA9IG4ubWF0Y2gocik7XG4gICAgaWYobSAmJiAhc2VlblttWzFdXSkge3NlZW5bbVsxXV0gPSB0cnVlOyBhLnB1c2gobVsxXSl9XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm9wZW5kaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHZhciB1bml4X2Vycm9yID0gcmFpc2VfdW5peCAmJiBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcblxuICB2YXIgYSA9IHRoaXMucmVhZGRpcihuYW1lKTtcbiAgdmFyIGMgPSBmYWxzZTtcbiAgdmFyIGkgPSAwO1xuICByZXR1cm4geyByZWFkU3luYyA6IChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGMpIHtcbiAgICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVCQURGXCIsIFwiY2xvc2VkaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogY2xvc2VkaXIgZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZihpID09IGEubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgZW50cnkgPSBhW2ldO1xuICAgIGkrKztcbiAgICByZXR1cm4geyBuYW1lOiBlbnRyeSB9XG4gIH0pXG4gICAgLCBjbG9zZVN5bmM6IChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoYykge1xuICAgICAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVCQURGXCIsIFwiY2xvc2VkaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogY2xvc2VkaXIgZmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjID0gdHJ1ZTtcbiAgICAgIGEgPSBbXTtcbiAgICB9KVxuICB9XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmlzX2RpciA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgaWYobmFtZSA9PSBcIlwiKSAgcmV0dXJuIHRydWU7XG4gIHZhciBuYW1lX3NsYXNoID0gdGhpcy5zbGFzaChuYW1lKTtcbiAgcmV0dXJuIHRoaXMuY29udGVudFtuYW1lX3NsYXNoXT8xOjA7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLnVubGluayA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIG9rID0gdGhpcy5jb250ZW50W25hbWVdP3RydWU6ZmFsc2U7XG4gIGRlbGV0ZSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gIHJldHVybiBvaztcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKG5hbWUsIGYpIHtcbiAgdmFyIGZpbGU7XG4gIGlmKGYucmRvbmx5ICYmIGYud3Jvbmx5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fcmRvbmx5IGFuZCBPcGVuX3dyb25seSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIGlmKGYudGV4dCAmJiBmLmJpbmFyeSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3RleHQgYW5kIE9wZW5fYmluYXJ5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgdGhpcy5sb29rdXAobmFtZSk7XG4gIGlmICh0aGlzLmNvbnRlbnRbbmFtZV0pIHtcbiAgICBpZiAodGhpcy5pc19kaXIobmFtZSkpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGlzIGEgZGlyZWN0b3J5XCIpO1xuICAgIGlmIChmLmNyZWF0ZSAmJiBmLmV4Y2wpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZpbGUgYWxyZWFkeSBleGlzdHNcIik7XG4gICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgICBpZihmLnRydW5jYXRlKSBmaWxlLnRydW5jYXRlKCk7XG4gIH0gZWxzZSBpZiAoZi5jcmVhdGUpIHtcbiAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgIHRoaXMuY29udGVudFtuYW1lXSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfY3JlYXRlX2J5dGVzKDApKTtcbiAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICB9IGVsc2Uge1xuICAgIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlICh0aGlzLm5tKG5hbWUpKTtcbiAgfVxuICByZXR1cm4gbmV3IE1sRmFrZUZkKHRoaXMubm0obmFtZSksIGZpbGUsIGYpO1xufVxuXG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbihuYW1lLCBmKSB7XG4gIHZhciBmaWxlO1xuICBpZihmLnJkb25seSAmJiBmLndyb25seSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3Jkb25seSBhbmQgT3Blbl93cm9ubHkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICBpZihmLnRleHQgJiYgZi5iaW5hcnkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl90ZXh0IGFuZCBPcGVuX2JpbmFyeSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIHRoaXMubG9va3VwKG5hbWUpO1xuICBpZiAodGhpcy5jb250ZW50W25hbWVdKSB7XG4gICAgaWYgKHRoaXMuaXNfZGlyKG5hbWUpKSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBpcyBhIGRpcmVjdG9yeVwiKTtcbiAgICBpZiAoZi5jcmVhdGUgJiYgZi5leGNsKSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICAgIGZpbGUgPSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gICAgaWYoZi50cnVuY2F0ZSkgZmlsZS50cnVuY2F0ZSgpO1xuICB9IGVsc2UgaWYgKGYuY3JlYXRlKSB7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuYW1lKTtcbiAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSAodGhpcy5ubShuYW1lKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBNbEZha2VGZCh0aGlzLm5tKG5hbWUpLCBmaWxlLCBmKTtcbn1cblxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5yZWdpc3Rlcj0gZnVuY3Rpb24gKG5hbWUsY29udGVudCl7XG4gIHZhciBmaWxlO1xuICBpZih0aGlzLmNvbnRlbnRbbmFtZV0pIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZpbGUgYWxyZWFkeSBleGlzdHNcIik7XG4gIGlmKGNhbWxfaXNfbWxfYnl0ZXMoY29udGVudCkpXG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNvbnRlbnQpO1xuICBpZihjYW1sX2lzX21sX3N0cmluZyhjb250ZW50KSlcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9zdHJpbmcoY29udGVudCkpO1xuICBlbHNlIGlmKGNvbnRlbnQgaW5zdGFuY2VvZiBBcnJheSlcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9ieXRlc19vZl9hcnJheShjb250ZW50KSk7XG4gIGVsc2UgaWYodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpXG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjb250ZW50KSk7XG4gIGVsc2UgaWYoY29udGVudC50b1N0cmluZykge1xuICAgIHZhciBieXRlcyA9IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGNvbnRlbnQudG9TdHJpbmcoKSkpO1xuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShieXRlcyk7XG4gIH1cbiAgaWYoZmlsZSl7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuYW1lKTtcbiAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBmaWxlO1xuICB9XG4gIGVsc2UgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogcmVnaXN0ZXJpbmcgZmlsZSB3aXRoIGludmFsaWQgY29udGVudCB0eXBlXCIpO1xufVxuXG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWxGYWtlRGV2aWNlXG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZpbGVcbi8vUmVxdWlyZXM6IE1sRmlsZVxuLy9SZXF1aXJlczogY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoLCBjYW1sX2JsaXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbmZ1bmN0aW9uIE1sRmFrZUZpbGUoY29udGVudCl7XG4gIHRoaXMuZGF0YSA9IGNvbnRlbnQ7XG59XG5NbEZha2VGaWxlLnByb3RvdHlwZSA9IG5ldyBNbEZpbGUgKCk7XG5NbEZha2VGaWxlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sRmFrZUZpbGVcbk1sRmFrZUZpbGUucHJvdG90eXBlLnRydW5jYXRlID0gZnVuY3Rpb24obGVuKXtcbiAgdmFyIG9sZCA9IHRoaXMuZGF0YTtcbiAgdGhpcy5kYXRhID0gY2FtbF9jcmVhdGVfYnl0ZXMobGVufDApO1xuICBjYW1sX2JsaXRfYnl0ZXMob2xkLCAwLCB0aGlzLmRhdGEsIDAsIGxlbik7XG59XG5NbEZha2VGaWxlLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjYW1sX21sX2J5dGVzX2xlbmd0aCh0aGlzLmRhdGEpO1xufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvZmZzZXQsYnVmLHBvcyxsZW4pe1xuICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gIGlmKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgdmFyIG5ld19zdHIgPSBjYW1sX2NyZWF0ZV9ieXRlcyhvZmZzZXQgKyBsZW4pO1xuICAgIHZhciBvbGRfZGF0YSA9IHRoaXMuZGF0YTtcbiAgICB0aGlzLmRhdGEgPSBuZXdfc3RyO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhvbGRfZGF0YSwgMCwgdGhpcy5kYXRhLCAwLCBjbGVuKTtcbiAgfVxuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl9hcnJheShidWYpLCBwb3MsIHRoaXMuZGF0YSwgb2Zmc2V0LCBsZW4pO1xuICByZXR1cm4gMFxufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKG9mZnNldCxidWYscG9zLGxlbil7XG4gIHZhciBjbGVuID0gdGhpcy5sZW5ndGgoKTtcbiAgaWYob2Zmc2V0ICsgbGVuID49IGNsZW4pIHtcbiAgICBsZW4gPSBjbGVuIC0gb2Zmc2V0O1xuICB9XG4gIGlmKGxlbikge1xuICAgIHZhciBkYXRhID0gY2FtbF9jcmVhdGVfYnl0ZXMobGVufDApO1xuICAgIGNhbWxfYmxpdF9ieXRlcyh0aGlzLmRhdGEsIG9mZnNldCwgZGF0YSwgMCwgbGVuKTtcbiAgICBidWYuc2V0KGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoZGF0YSksIHBvcyk7XG4gIH1cbiAgcmV0dXJuIGxlblxufVxuXG5cbi8vUHJvdmlkZXM6IE1sRmFrZUZkX291dFxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgY2FtbF9jcmVhdGVfYnl0ZXMsIGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIE1sRmFrZUZkX291dChmZCxmbGFncykge1xuICBNbEZha2VGaWxlLmNhbGwodGhpcywgY2FtbF9jcmVhdGVfYnl0ZXMoMCkpO1xuICB0aGlzLmxvZyA9IChmdW5jdGlvbiAocykgeyByZXR1cm4gMCB9KTtcbiAgaWYoZmQgPT0gMSAmJiB0eXBlb2YgY29uc29sZS5sb2cgPT0gXCJmdW5jdGlvblwiKVxuICAgIHRoaXMubG9nID0gY29uc29sZS5sb2c7XG4gIGVsc2UgaWYoZmQgPT0gMiAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PSBcImZ1bmN0aW9uXCIpXG4gICAgdGhpcy5sb2cgPSBjb25zb2xlLmVycm9yO1xuICBlbHNlIGlmKHR5cGVvZiBjb25zb2xlLmxvZyA9PSBcImZ1bmN0aW9uXCIpXG4gICAgdGhpcy5sb2cgPSBjb25zb2xlLmxvZ1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG59XG5NbEZha2VGZF9vdXQucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMCB9XG5NbEZha2VGZF9vdXQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG9mZnNldCxidWYscG9zLGxlbikge1xuICBpZih0aGlzLmxvZykge1xuICAgIGlmKGxlbiA+IDBcbiAgICAgICAmJiBwb3MgPj0gMFxuICAgICAgICYmIHBvcytsZW4gPD0gYnVmLmxlbmd0aFxuICAgICAgICYmIGJ1Zltwb3MrbGVuLTFdID09IDEwKVxuICAgICAgbGVuIC0tO1xuICAgIC8vIERvIG5vdCBvdXRwdXQgdGhlIGxhc3QgXFxuIGlmIHByZXNlbnRcbiAgICAvLyBhcyBjb25zb2xlIGxvZ2dpbmcgZGlzcGxheSBhIG5ld2xpbmUgYXQgdGhlIGVuZFxuICAgIHZhciBzcmMgPSBjYW1sX2NyZWF0ZV9ieXRlcyhsZW4pO1xuICAgIGNhbWxfYmxpdF9ieXRlcyhjYW1sX2J5dGVzX29mX2FycmF5KGJ1ZiksIHBvcywgc3JjLCAwLCBsZW4pO1xuICAgIHRoaXMubG9nKHNyYy50b1V0ZjE2KCkpO1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMuZmQgICsgXCI6IGZpbGUgZGVzY3JpcHRvciBhbHJlYWR5IGNsb3NlZFwiKTtcbn1cbk1sRmFrZUZkX291dC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pIHtcbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5mZCAgKyBcIjogZmlsZSBkZXNjcmlwdG9yIGlzIHdyaXRlIG9ubHlcIik7XG59XG5NbEZha2VGZF9vdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmxvZyA9IHVuZGVmaW5lZDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGZFxuLy9SZXF1aXJlczogTWxGYWtlRmlsZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIE1sRmFrZUZkKG5hbWUsIGZpbGUsZmxhZ3MpIHtcbiAgdGhpcy5maWxlID0gZmlsZTtcbiAgdGhpcy5uYW1lID0gbmFtZTtcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xufVxuXG5NbEZha2VGZC5wcm90b3R5cGUuZXJyX2Nsb3NlZCA9IGZ1bmN0aW9uICgpIHtcbiAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5uYW1lICArIFwiOiBmaWxlIGRlc2NyaXB0b3IgYWxyZWFkeSBjbG9zZWRcIik7XG59XG5NbEZha2VGZC5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIGlmKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS5sZW5ndGggKClcbiAgdGhpcy5lcnJfY2xvc2VkKCk7XG59XG5NbEZha2VGZC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAob2Zmc2V0LGJ1Zixwb3MsbGVuKSB7XG4gIGlmKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS53cml0ZShvZmZzZXQsYnVmLHBvcyxsZW4pXG4gIHRoaXMuZXJyX2Nsb3NlZCgpO1xufVxuTWxGYWtlRmQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAob2Zmc2V0LCBidWYsIHBvcywgbGVuKSB7XG4gIGlmKHRoaXMuZmlsZSkgcmV0dXJuIHRoaXMuZmlsZS5yZWFkKG9mZnNldCwgYnVmLCBwb3MsIGxlbilcbiAgdGhpcy5lcnJfY2xvc2VkKCk7XG59XG5NbEZha2VGZC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZmlsZSA9IHVuZGVmaW5lZDtcbn1cbiIsIi8vUHJvdmlkZXM6IGluaXRpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IHNlcmlhbGl6ZV9uYXQsIGRlc2VyaWFsaXplX25hdCwgY2FtbF9oYXNoX25hdFxuZnVuY3Rpb24gaW5pdGlhbGl6ZV9uYXQoKSB7XG4gIGNhbWxfY3VzdG9tX29wc1tcIl9uYXRcIl0gPVxuICAgIHsgZGVzZXJpYWxpemUgOiBkZXNlcmlhbGl6ZV9uYXQsXG4gICAgICBzZXJpYWxpemUgOiBzZXJpYWxpemVfbmF0LFxuICAgICAgaGFzaCA6IGNhbWxfaGFzaF9uYXRcbiAgICB9XG59XG5cbi8vUHJvdmlkZXM6IE1sTmF0XG5mdW5jdGlvbiBNbE5hdCh4KXtcbiAgdGhpcy5kYXRhID0gbmV3IEludDMyQXJyYXkoeCk7XG4gIC8vIGxlbmd0aF9uYXQgaXNuJ3QgZXh0ZXJuYWwsIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGUgT2JqLnNpemVcbiAgLy8gd29yayBvdXQgcmlnaHQuIFRoZSArMiB0byBhcnJheSBsZW5ndGggc2VlbXMgdG8gd29yay5cbiAgdGhpcy5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoICsgMlxufVxuXG5NbE5hdC5wcm90b3R5cGUuY2FtbF9jdXN0b20gPSBcIl9uYXRcIjtcblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX25hdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnQsIG51bV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBjYW1sX2hhc2hfbmF0KHgpIHtcbiAgdmFyIGxlbiA9IG51bV9kaWdpdHNfbmF0KHgsIDAsIHguZGF0YS5sZW5ndGgpO1xuICB2YXIgaCA9IDA7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgeC5kYXRhW2ldKTtcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBuYXRfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IE1sTmF0XG5mdW5jdGlvbiBuYXRfb2ZfYXJyYXkobCl7XG4gIHJldHVybiBuZXcgTWxOYXQobCk7XG59XG5cbi8vUHJvdmlkZXM6IGNyZWF0ZV9uYXRcbi8vUmVxdWlyZXM6IE1sTmF0XG5mdW5jdGlvbiBjcmVhdGVfbmF0KHNpemUpIHtcbiAgdmFyIGFyciA9IG5ldyBNbE5hdChzaXplKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIGFyci5kYXRhW2ldID0gLTE7XG4gIH1cbiAgcmV0dXJuIGFycjtcbn1cblxuLy9Qcm92aWRlczogc2V0X3RvX3plcm9fbmF0XG5mdW5jdGlvbiBzZXRfdG9femVyb19uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQuZGF0YVtvZnMraV0gPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBibGl0X25hdFxuZnVuY3Rpb24gYmxpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMiwgbGVuKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0gbmF0Mi5kYXRhW29mczIraV07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IHNldF9kaWdpdF9uYXRcbmZ1bmN0aW9uIHNldF9kaWdpdF9uYXQobmF0LCBvZnMsIGRpZ2l0KSB7XG4gIG5hdC5kYXRhW29mc10gPSBkaWdpdDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IG50aF9kaWdpdF9uYXRcbmZ1bmN0aW9uIG50aF9kaWdpdF9uYXQobmF0LCBvZnMpIHtcbiAgcmV0dXJuIG5hdC5kYXRhW29mc107XG59XG5cbi8vUHJvdmlkZXM6IHNldF9kaWdpdF9uYXRfbmF0aXZlXG5mdW5jdGlvbiBzZXRfZGlnaXRfbmF0X25hdGl2ZShuYXQsIG9mcywgZGlnaXQpIHtcbiAgbmF0LmRhdGFbb2ZzXSA9IGRpZ2l0O1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbnRoX2RpZ2l0X25hdF9uYXRpdmVcbmZ1bmN0aW9uIG50aF9kaWdpdF9uYXRfbmF0aXZlKG5hdCwgb2ZzKSB7XG4gIHJldHVybiBuYXQuZGF0YVtvZnNdO1xufVxuXG4vL1Byb3ZpZGVzOiBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gbnVtX2RpZ2l0c19uYXQobmF0LCBvZnMsIGxlbikge1xuICBmb3IodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmKG5hdC5kYXRhW29mcytpXSAhPSAwKSByZXR1cm4gaSsxO1xuICB9XG4gIHJldHVybiAxOyAvLyAwIGNvdW50cyBhcyAxIGRpZ2l0XG59XG5cbi8vUHJvdmlkZXM6IG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdFxuZnVuY3Rpb24gbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0KG5hdCwgb2ZzKSB7XG4gIHZhciBhID0gbmF0LmRhdGFbb2ZzXTtcbiAgdmFyIGIgPSAwO1xuICBpZihhICYgMHhGRkZGMDAwMCkgeyBiICs9MTY7IGEgPj4+PTE2OyB9XG4gIGlmKGEgJiAweEZGMDApICAgICB7IGIgKz0gODsgYSA+Pj49IDg7IH1cbiAgaWYoYSAmIDB4RjApICAgICAgIHsgYiArPSA0OyBhID4+Pj0gNDsgfVxuICBpZihhICYgMTIpICAgICAgICAgeyBiICs9IDI7IGEgPj4+PSAyOyB9XG4gIGlmKGEgJiAyKSAgICAgICAgICB7IGIgKz0gMTsgYSA+Pj49IDE7IH1cbiAgaWYoYSAmIDEpICAgICAgICAgIHsgYiArPSAxOyB9XG4gIHJldHVybiAzMiAtIGI7XG59XG5cbi8vUHJvdmlkZXM6IGlzX2RpZ2l0X2ludFxuZnVuY3Rpb24gaXNfZGlnaXRfaW50KG5hdCwgb2ZzKSB7XG4gIGlmIChuYXQuZGF0YVtvZnNdID49IDApIHJldHVybiAxXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF96ZXJvXG5mdW5jdGlvbiBpc19kaWdpdF96ZXJvKG5hdCwgb2ZzKSB7XG4gIGlmKG5hdC5kYXRhW29mc10gPT0gMCkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF9vZGRcbmZ1bmN0aW9uIGlzX2RpZ2l0X29kZChuYXQsIG9mcykge1xuICBpZihuYXQuZGF0YVtvZnNdICYgMSkgcmV0dXJuIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBpbmNyX25hdFxuZnVuY3Rpb24gaW5jcl9uYXQobmF0LCBvZnMsIGxlbiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciB4ID0gKG5hdC5kYXRhW29mcytpXSA+Pj4gMCkgKyBjYXJyeTtcbiAgICBuYXQuZGF0YVtvZnMraV0gPSAoeCB8IDApO1xuICAgIGlmKHggPT0gKHggPj4+IDApKSB7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2Uge1xuICAgICAgY2FycnkgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2Fycnk7XG59XG5cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogYWRkX25hdFxuLy9SZXF1aXJlczogaW5jcl9uYXRcbmZ1bmN0aW9uIGFkZF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgY2FycnlfaW4pIHtcbiAgdmFyIGNhcnJ5ID0gY2FycnlfaW47XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4yOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgKyAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApICsgY2Fycnk7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSB4XG4gICAgaWYoeCA9PSAoeCA+Pj4gMCkpIHtcbiAgICAgIGNhcnJ5ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FycnkgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5jcl9uYXQobmF0MSwgb2ZzMStsZW4yLCBsZW4xLWxlbjIsIGNhcnJ5KTtcbn1cblxuLy9Qcm92aWRlczogY29tcGxlbWVudF9uYXRcbmZ1bmN0aW9uIGNvbXBsZW1lbnRfbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0LmRhdGFbb2ZzK2ldID0gKC0xID4+PiAwKSAtIChuYXQuZGF0YVtvZnMraV0gPj4+IDApO1xuICB9XG59XG5cbi8vIG9jYW1sIGZsaXBzIGNhcnJ5X2luXG4vL1Byb3ZpZGVzOiBkZWNyX25hdFxuZnVuY3Rpb24gZGVjcl9uYXQobmF0LCBvZnMsIGxlbiwgY2FycnlfaW4pIHtcbiAgdmFyIGJvcnJvdyA9IChjYXJyeV9pbiA9PSAxKSA/IDAgOiAxO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQuZGF0YVtvZnMraV0gPj4+MCkgLSBib3Jyb3c7XG4gICAgbmF0LmRhdGFbb2ZzK2ldID0geDtcbiAgICBpZiAoeCA+PSAwKSB7XG4gICAgICBib3Jyb3cgPSAwO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvcnJvdyA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiAoYm9ycm93ID09IDEpID8gMCA6IDE7XG59XG5cbi8vIG9jYW1sIGZsaXBzIGNhcnJ5X2luXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IHN1Yl9uYXRcbi8vUmVxdWlyZXM6IGRlY3JfbmF0XG5mdW5jdGlvbiBzdWJfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIGNhcnJ5X2luKSB7XG4gIHZhciBib3Jyb3cgPSAoY2FycnlfaW4gPT0gMSkgPyAwIDogMTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjI7IGkrKykge1xuICAgIHZhciB4ID0gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSAtIChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgLSBib3Jyb3c7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSB4O1xuICAgIGlmICh4ID49IDApIHtcbiAgICAgIGJvcnJvdyA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvcnJvdyA9IDE7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWNyX25hdChuYXQxLCBvZnMxK2xlbjIsIGxlbjEtbGVuMiwgKGJvcnJvdz09MSk/MDoxKTtcbn1cblxuLy8gbmF0MSArPSBuYXQyICogbmF0M1tvZnMzXVxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBtdWx0X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogYWRkX25hdCwgbmF0X29mX2FycmF5XG5mdW5jdGlvbiBtdWx0X2RpZ2l0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBhID0gKG5hdDMuZGF0YVtvZnMzXSA+Pj4gMCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4yOyBpKyspIHtcbiAgICB2YXIgeDEgPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApICsgKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSAqIChhICYgMHgwMDAwRkZGRikgKyBjYXJyeTtcbiAgICB2YXIgeDIgPSAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApICogKGEgPj4+IDE2KTtcbiAgICBjYXJyeSA9IE1hdGguZmxvb3IoeDIvNjU1MzYpO1xuICAgIHZhciB4MyA9IHgxICsgKHgyICUgNjU1MzYpICogNjU1MzY7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSB4MztcbiAgICBjYXJyeSArPSBNYXRoLmZsb29yKHgzLzQyOTQ5NjcyOTYpO1xuICB9XG5cbiAgaWYobGVuMiA8IGxlbjEgJiYgY2FycnkpIHtcbiAgICByZXR1cm4gYWRkX25hdChuYXQxLCBvZnMxK2xlbjIsIGxlbjEtbGVuMiwgbmF0X29mX2FycmF5KFtjYXJyeV0pLCAwLCAxLCAwKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2Fycnk7XG4gIH1cbn1cblxuLy8gbmF0MSArPSBuYXQyICogbmF0M1xuLy8gbGVuMSA+PSBsZW4yICsgbGVuMy5cbi8vUHJvdmlkZXM6IG11bHRfbmF0XG4vL1JlcXVpcmVzOiBtdWx0X2RpZ2l0X25hdFxuZnVuY3Rpb24gbXVsdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0Mywgb2ZzMywgbGVuMykge1xuICB2YXIgY2FycnkgPSAwO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMzsgaSsrKSB7XG4gICAgY2FycnkgKz0gbXVsdF9kaWdpdF9uYXQobmF0MSwgb2ZzMStpLCBsZW4xLWksIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMraSk7XG4gIH1cbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyBuYXQxID0gMiAqIG5hdDEgKyBuYXQyICogbmF0MlxuLy8gbGVuMSA+PSAyICogbGVuMlxuLy9Qcm92aWRlczogc3F1YXJlX25hdFxuLy9SZXF1aXJlczogbXVsdF9uYXQsIGFkZF9uYXRcbmZ1bmN0aW9uIHNxdWFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgY2FycnkgPSAwO1xuICBjYXJyeSArPSBhZGRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDEsIG9mczEsIGxlbjEsIDApO1xuICBjYXJyeSArPSBtdWx0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQyLCBvZnMyLCBsZW4yKTtcbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG5cbi8vIDAgPD0gc2hpZnQgPCAzMlxuLy9Qcm92aWRlczogc2hpZnRfbGVmdF9uYXRcbmZ1bmN0aW9uIHNoaWZ0X2xlZnRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIG5iaXRzKSB7XG4gIGlmKG5iaXRzID09IDApIHtcbiAgICBuYXQyLmRhdGFbb2ZzMl0gPSAwO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciB3cmFwID0gMDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjE7IGkrKykge1xuICAgIHZhciBhID0gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKTtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IChhIDw8IG5iaXRzKSB8IHdyYXA7XG4gICAgd3JhcCA9IGEgPj4+ICgzMiAtIG5iaXRzKTtcbiAgfVxuICBuYXQyLmRhdGFbb2ZzMl0gPSB3cmFwO1xuICByZXR1cm4gMDtcbn1cblxuLy8gQXNzdW1pbmcgYyA+IGEsIHJldHVybnMgW3F1b3RpZW50LCByZW1haW5kZXJdIG9mIChhPDwzMiArIGIpL2Ncbi8vUHJvdmlkZXM6IGRpdl9oZWxwZXJcbmZ1bmN0aW9uIGRpdl9oZWxwZXIoYSwgYiwgYykge1xuICB2YXIgeCA9IGEgKiA2NTUzNiArIChiPj4+MTYpO1xuICB2YXIgeSA9IE1hdGguZmxvb3IoeC9jKSAqIDY1NTM2O1xuICB2YXIgeiA9ICh4ICUgYykgKiA2NTUzNjtcbiAgdmFyIHcgPSB6ICsgKGIgJiAweDAwMDBGRkZGKTtcbiAgcmV0dXJuIFt5ICsgTWF0aC5mbG9vcih3L2MpLCB3ICUgY107XG59XG5cbi8vIG5hdDFbb2ZzMStsZW5dIDwgbmF0MltvZnMyXVxuLy9Qcm92aWRlczogZGl2X2RpZ2l0X25hdFxuLy9SZXF1aXJlczogZGl2X2hlbHBlclxuZnVuY3Rpb24gZGl2X2RpZ2l0X25hdChuYXRxLCBvZnNxLCBuYXRyLCBvZnNyLCBuYXQxLCBvZnMxLCBsZW4sIG5hdDIsIG9mczIpIHtcbiAgdmFyIHJlbSA9IChuYXQxLmRhdGFbb2ZzMStsZW4tMV0gPj4+MCk7XG4gIC8vIG5hdHFbb2ZzcStsZW4tMV0gaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIChkdWUgdG8gdGhlIE1TRCByZXF1aXJlbWVudCksXG4gIC8vIGFuZCBzaG91bGQgbm90IGJlIHdyaXR0ZW4gdG8uXG4gIGZvcih2YXIgaSA9IGxlbi0yOyBpID49IDA7IGktLSkge1xuICAgIHZhciB4ID0gZGl2X2hlbHBlcihyZW0sIChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCksIChuYXQyLmRhdGFbb2ZzMl0gPj4+IDApKTtcbiAgICBuYXRxLmRhdGFbb2ZzcStpXSA9IHhbMF07XG4gICAgcmVtID0geFsxXTtcbiAgfVxuICBuYXRyLmRhdGFbb2Zzcl0gPSByZW07XG4gIHJldHVybiAwO1xufVxuXG4vLyBuYXQxW25hdDI6XSA6PSBuYXQxIC8gbmF0MlxuLy8gbmF0MVs6bmF0Ml0gOj0gbmF0MSAlIG5hdDJcbi8vIGxlbjEgPiBsZW4yLCBuYXQyW29mczIrbGVuMi0xXSA+IG5hdDFbb2ZzMStsZW4xLTFdXG4vL1Byb3ZpZGVzOiBkaXZfbmF0XG4vL1JlcXVpcmVzOiBkaXZfZGlnaXRfbmF0LCBkaXZfaGVscGVyLCBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQsIHNoaWZ0X2xlZnRfbmF0LCBzaGlmdF9yaWdodF9uYXQsIGNyZWF0ZV9uYXQsIHNldF90b196ZXJvX25hdCwgbXVsdF9kaWdpdF9uYXQsIHN1Yl9uYXQsIGNvbXBhcmVfbmF0LCBuYXRfb2ZfYXJyYXlcbmZ1bmN0aW9uIGRpdl9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICBpZihsZW4yID09IDEpIHtcbiAgICBkaXZfZGlnaXRfbmF0KG5hdDEsIG9mczErMSwgbmF0MSwgb2ZzMSwgbmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMik7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgcyA9IG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdChuYXQyLCBvZnMyK2xlbjItMSk7XG4gIHNoaWZ0X2xlZnRfbmF0KG5hdDIsIG9mczIsIGxlbjIsIG5hdF9vZl9hcnJheShbMF0pLCAwLCBzKTtcbiAgc2hpZnRfbGVmdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpO1xuXG4gIHZhciBkID0gKG5hdDIuZGF0YVtvZnMyK2xlbjItMV0gPj4+IDApICsgMTtcbiAgdmFyIGEgPSBjcmVhdGVfbmF0KGxlbjIrMSk7XG4gIGZvciAodmFyIGkgPSBsZW4xIC0gMTsgaSA+PSBsZW4yOyBpLS0pIHtcbiAgICAvLyBEZWNlbnQgbG93ZXIgYm91bmQgb24gcXVvXG4gICAgdmFyIHF1byA9IGQgPT0gNDI5NDk2NzI5NiA/IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgOiBkaXZfaGVscGVyKChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCksIChuYXQxLmRhdGFbb2ZzMStpLTFdID4+PjApLCBkKVswXTtcbiAgICBzZXRfdG9femVyb19uYXQoYSwgMCwgbGVuMisxKTtcbiAgICBtdWx0X2RpZ2l0X25hdChhLCAwLCBsZW4yKzEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdF9vZl9hcnJheShbcXVvXSksIDApO1xuICAgIHN1Yl9uYXQobmF0MSwgb2ZzMStpLWxlbjIsIGxlbjIrMSwgYSwgMCwgbGVuMisxLCAxKTtcblxuICAgIHdoaWxlIChuYXQxLmRhdGFbb2ZzMStpXSAhPSAwIHx8IGNvbXBhcmVfbmF0KG5hdDEsIG9mczEraS1sZW4yLCBsZW4yLCBuYXQyLCBvZnMyLCBsZW4yKSA+PSAwKSB7XG4gICAgICBxdW8gPSBxdW8gKyAxO1xuICAgICAgc3ViX25hdChuYXQxLCBvZnMxK2ktbGVuMiwgbGVuMisxLCBuYXQyLCBvZnMyLCBsZW4yLCAxKTtcbiAgICB9XG5cbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IHF1bztcbiAgfVxuXG4gIHNoaWZ0X3JpZ2h0X25hdChuYXQxLCBvZnMxLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7IC8vIHNoaWZ0IHJlbWFpbmRlclxuICBzaGlmdF9yaWdodF9uYXQobmF0Miwgb2ZzMiwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpOyAvLyByZXN0b3JlXG4gIHJldHVybiAwO1xufVxuXG5cbi8vIDAgPD0gc2hpZnQgPCAzMlxuLy9Qcm92aWRlczogc2hpZnRfcmlnaHRfbmF0XG5mdW5jdGlvbiBzaGlmdF9yaWdodF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbmJpdHMpIHtcbiAgaWYobmJpdHMgPT0gMCkge1xuICAgIG5hdDIuZGF0YVtvZnMyXSA9IDA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgdmFyIHdyYXAgPSAwO1xuICBmb3IodmFyIGkgPSBsZW4xLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIGEgPSBuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMDtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IChhID4+PiBuYml0cykgfCB3cmFwO1xuICAgIHdyYXAgPSBhIDw8ICgzMiAtIG5iaXRzKTtcbiAgfVxuICBuYXQyLmRhdGFbb2ZzMl0gPSB3cmFwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY29tcGFyZV9kaWdpdHNfbmF0XG5mdW5jdGlvbiBjb21wYXJlX2RpZ2l0c19uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMikge1xuICBpZihuYXQxLmRhdGFbb2ZzMV0gPiBuYXQyLmRhdGFbb2ZzMl0pIHJldHVybiAxO1xuICBpZihuYXQxLmRhdGFbb2ZzMV0gPCBuYXQyLmRhdGFbb2ZzMl0pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfbmF0XG4vL1JlcXVpcmVzOiBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMikge1xuICB2YXIgYSA9IG51bV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIGxlbjEpO1xuICB2YXIgYiA9IG51bV9kaWdpdHNfbmF0KG5hdDIsIG9mczIsIGxlbjIpO1xuICBpZihhID4gYikgcmV0dXJuIDE7XG4gIGlmKGEgPCBiKSByZXR1cm4gLTE7XG4gIGZvcih2YXIgaSA9IGxlbjEgLSAxOyBpID49IDA7IGktLSkge1xuICAgIGlmICgobmF0MS5kYXRhW29mczEraV0gPj4+IDApID4gKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSkgcmV0dXJuIDE7XG4gICAgaWYgKChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgPCAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApKSByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfbmF0X3JlYWxcbi8vUmVxdWlyZXM6IGNvbXBhcmVfbmF0XG5mdW5jdGlvbiBjb21wYXJlX25hdF9yZWFsKG5hdDEsbmF0Mil7XG4gIHJldHVybiBjb21wYXJlX25hdChuYXQxLDAsbmF0MS5kYXRhLmxlbmd0aCxuYXQyLDAsbmF0Mi5kYXRhLmxlbmd0aCk7XG59XG5cbi8vUHJvdmlkZXM6IGxhbmRfZGlnaXRfbmF0XG5mdW5jdGlvbiBsYW5kX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSAmPSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBsb3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBsb3JfZGlnaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgbmF0MS5kYXRhW29mczFdIHw9IG5hdDIuZGF0YVtvZnMyXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGx4b3JfZGlnaXRfbmF0XG5mdW5jdGlvbiBseG9yX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSBePSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG5cbi8vUHJvdmlkZXM6IHNlcmlhbGl6ZV9uYXRcbmZ1bmN0aW9uIHNlcmlhbGl6ZV9uYXQod3JpdGVyLCBuYXQsIHN6KXtcbiAgdmFyIGxlbiA9IG5hdC5kYXRhLmxlbmd0aDtcbiAgd3JpdGVyLndyaXRlKDMyLCBsZW4pO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspe1xuICAgIHdyaXRlci53cml0ZSgzMiwgbmF0LmRhdGFbaV0pO1xuICB9XG4gIHN6WzBdID0gbGVuICogNDtcbiAgc3pbMV0gPSBsZW4gKiA4O1xufVxuXG4vL1Byb3ZpZGVzOiBkZXNlcmlhbGl6ZV9uYXRcbi8vUmVxdWlyZXM6IE1sTmF0XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZV9uYXQocmVhZGVyLCBzeil7XG4gIHZhciBsZW4gPSByZWFkZXIucmVhZDMycygpO1xuICB2YXIgbmF0ID0gbmV3IE1sTmF0KGxlbik7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyl7XG4gICAgbmF0LmRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICB9XG4gIHN6WzBdID0gbGVuICogNDtcbiAgcmV0dXJuIG5hdDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcblxuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblxuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVcbnZhciBjYW1sX2dyX3N0YXRlO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZVxuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2dldCgpIHtcbiAgaWYoY2FtbF9ncl9zdGF0ZSkge1xuICAgIHJldHVybiBjYW1sX2dyX3N0YXRlO1xuICB9XG4gIHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCxjYW1sX25hbWVkX3ZhbHVlKFwiR3JhcGhpY3MuR3JhcGhpY19mYWlsdXJlXCIpLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiTm90IGluaXRpYWxpemVkXCIpXSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX3NldFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZSxjYW1sX2dyX3N0YXRlX2luaXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCkge1xuICBjYW1sX2dyX3N0YXRlPWN0eDtcbiAgY2FtbF9ncl9zdGF0ZV9pbml0KClcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfb3Blbl9ncmFwaFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9vcGVuX2dyYXBoKGluZm8pe1xuICB2YXIgaW5mbyA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKGluZm8pO1xuICBmdW5jdGlvbiBnZXQobmFtZSl7XG4gICAgdmFyIHJlcyA9IGluZm8ubWF0Y2goXCIoXnwsKSAqXCIrbmFtZStcIiAqPSAqKFthLXpBLVowLTlfXSspICooLHwkKVwiKTtcbiAgICBpZihyZXMpIHJldHVybiByZXNbMl07XG4gIH1cbiAgdmFyIHNwZWNzID0gW107XG4gIGlmKCEoaW5mbz09XCJcIikpIHNwZWNzLnB1c2goaW5mbyk7XG4gIHZhciB0YXJnZXQgPSBnZXQoXCJ0YXJnZXRcIik7XG4gIGlmKCF0YXJnZXQpIHRhcmdldD1cIlwiO1xuICB2YXIgc3RhdHVzID0gZ2V0KFwic3RhdHVzXCIpO1xuICBpZighc3RhdHVzKSBzcGVjcy5wdXNoKFwic3RhdHVzPTFcIilcblxuICB2YXIgdyA9IGdldChcIndpZHRoXCIpO1xuICB3ID0gdz9wYXJzZUludCh3KToyMDA7XG4gIHNwZWNzLnB1c2goXCJ3aWR0aD1cIit3KTtcblxuICB2YXIgaCA9IGdldChcImhlaWdodFwiKTtcbiAgaCA9IGg/cGFyc2VJbnQoaCk6MjAwO1xuICBzcGVjcy5wdXNoKFwiaGVpZ2h0PVwiK2gpO1xuXG4gIHZhciB3aW4gPSBnbG9iYWxUaGlzLm9wZW4oXCJhYm91dDpibGFua1wiLHRhcmdldCxzcGVjcy5qb2luKFwiLFwiKSk7XG4gIGlmKCF3aW4pIHtjYW1sX2ZhaWx3aXRoKFwiR3JhcGhpY3Mub3Blbl9ncmFwaDogY2Fubm90IG9wZW4gdGhlIHdpbmRvd1wiKX1cbiAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDtcbiAgdmFyIGNhbnZhcyA9IGRvYy5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjYW52YXMud2lkdGggPSB3O1xuICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgdmFyIGN0eCA9IGNhbWxfZ3Jfc3RhdGVfY3JlYXRlKGNhbnZhcyx3LGgpO1xuICBjdHguc2V0X3RpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgZG9jLnRpdGxlID0gdGl0bGU7XG4gIH07XG4gIGNhbWxfZ3Jfc3RhdGVfc2V0KGN0eCk7XG4gIHZhciBib2R5ID0gZG9jLmJvZHk7XG4gIGJvZHkuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcbiAgYm9keS5hcHBlbmRDaGlsZChjYW52YXMpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9pbml0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF9jb2xvcixjYW1sX2dyX21vdmV0byxjYW1sX2dyX3Jlc2l6ZV93aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgsY2FtbF9ncl9zZXRfdGV4dF9zaXplLGNhbWxfZ3Jfc2V0X2ZvbnRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZVxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9pbml0KCl7XG4gIGNhbWxfZ3JfbW92ZXRvKGNhbWxfZ3Jfc3RhdGUueCxjYW1sX2dyX3N0YXRlLnkpO1xuICBjYW1sX2dyX3Jlc2l6ZV93aW5kb3coY2FtbF9ncl9zdGF0ZS53aWR0aCxjYW1sX2dyX3N0YXRlLmhlaWdodCk7XG4gIGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgoY2FtbF9ncl9zdGF0ZS5saW5lX3dpZHRoKTtcbiAgY2FtbF9ncl9zZXRfdGV4dF9zaXplKGNhbWxfZ3Jfc3RhdGUudGV4dF9zaXplKTtcbiAgY2FtbF9ncl9zZXRfZm9udChjYW1sX2dyX3N0YXRlLmZvbnQpO1xuICBjYW1sX2dyX3NldF9jb2xvcihjYW1sX2dyX3N0YXRlLmNvbG9yKTtcbiAgY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlKGNhbWxfZ3Jfc3RhdGUudGl0bGUpO1xuICAvL2NhbWxfZ3JfcmVzaXplX3dpbmRvdyBtaWdodCByZXNldCBzb21lIGNhbnZhcycgcHJvcGVydGllc1xuICBjYW1sX2dyX3N0YXRlLmNvbnRleHQudGV4dEJhc2VsaW5lID0gJ2JvdHRvbSc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX2NyZWF0ZShjYW52YXMsdyxoKXtcbiAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICByZXR1cm4ge1xuICAgIGNvbnRleHQ6IGNvbnRleHQsXG4gICAgY2FudmFzIDogY2FudmFzLFxuICAgIHggOiAwLFxuICAgIHkgOiAwLFxuICAgIHdpZHRoIDogdyxcbiAgICBoZWlnaHQgOiBoLFxuICAgIGxpbmVfd2lkdGggOiAxLFxuICAgIGZvbnQgOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiZml4ZWRcIiksXG4gICAgdGV4dF9zaXplIDogMjYsXG4gICAgY29sb3IgOiAweDAwMDAwMCxcbiAgICB0aXRsZSA6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIilcbiAgfTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kb2Nfb2Zfc3RhdGVcbmZ1bmN0aW9uIGNhbWxfZ3JfZG9jX29mX3N0YXRlKHN0YXRlKSB7XG4gIGlmKHN0YXRlLmNhbnZhcy5vd25lckRvY3VtZW50KVxuICAgIHJldHVybiBzdGF0ZS5jYW52YXMub3duZXJEb2N1bWVudDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbG9zZV9ncmFwaFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xvc2VfZ3JhcGgoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNhbnZhcy53aWR0aCA9IDA7XG4gIHMuY2FudmFzLmhlaWdodCA9IDA7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlKG5hbWUpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMudGl0bGUgPSBuYW1lO1xuICB2YXIganNuYW1lID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSk7XG4gIGlmKHMuc2V0X3RpdGxlKSBzLnNldF90aXRsZShqc25hbWUpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9yZXNpemVfd2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9yZXNpemVfd2luZG93KHcsaCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKVxuICBzLndpZHRoID0gdztcbiAgcy5oZWlnaHQgPSBoO1xuICBzLmNhbnZhcy53aWR0aCA9IHc7XG4gIHMuY2FudmFzLmhlaWdodCA9IGg7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2NsZWFyX2dyYXBoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jbGVhcl9ncmFwaCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY2FudmFzLndpZHRoID0gcy53aWR0aDtcbiAgcy5jYW52YXMuaGVpZ2h0ID0gcy5oZWlnaHQ7XG4gIC8vICBzLmNvbnRleHQuc3Ryb2tlUmVjdCAoMC4sIDAuLCBzLndpZHRoLCBzLmhlaWdodCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NpemVfeFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2l6ZV94KCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMud2lkdGg7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NpemVfeVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2l6ZV95KCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMuaGVpZ2h0O1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2NvbG9yXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zZXRfY29sb3IoY29sb3Ipe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIGZ1bmN0aW9uIGNvbnZlcnQobnVtYmVyKSB7XG4gICAgdmFyIHN0ciA9ICcnICsgbnVtYmVyLnRvU3RyaW5nKDE2KTtcbiAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IDIpIHN0ciA9ICcwJyArIHN0cjtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHZhclxuICByID0gKGNvbG9yID4+IDE2KSAmIDB4ZmYsXG4gIGcgPSAoY29sb3IgPj4gOCkgICYgMHhmZixcbiAgYiA9IChjb2xvciA+PiAwKSAgJiAweGZmO1xuICBzLmNvbG9yPWNvbG9yO1xuICB2YXIgY19zdHIgPSAnIycgKyBjb252ZXJ0KHIpICsgY29udmVydChnKSArIGNvbnZlcnQoYik7XG4gIHMuY29udGV4dC5maWxsU3R5bGUgPSAgIGNfc3RyO1xuICBzLmNvbnRleHQuc3Ryb2tlU3R5bGUgPSBjX3N0cjtcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3Bsb3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3Bsb3QoeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW09cy5jb250ZXh0LmNyZWF0ZUltYWdlRGF0YSgxLDEpO1xuICB2YXIgZCA9IGltLmRhdGE7XG4gIHZhciBjb2xvciA9IHMuY29sb3I7XG4gIGRbMF0gPSAoY29sb3IgPj4gMTYpICYgMHhmZjsgLy9yXG4gIGRbMV0gPSAoY29sb3IgPj4gOCkgICYgMHhmZiwgLy9nXG4gIGRbMl0gPSAoY29sb3IgPj4gMCkgICYgMHhmZjsgLy9iXG4gIGRbM10gPSAweEZGOyAvL2FcbiAgcy54PXg7XG4gIHMueT15O1xuICBzLmNvbnRleHQucHV0SW1hZ2VEYXRhKGltLHgscy5oZWlnaHQgLSB5KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcG9pbnRfY29sb3Jcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3BvaW50X2NvbG9yKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltPXMuY29udGV4dC5nZXRJbWFnZURhdGEoeCxzLmhlaWdodCAtIHksMSwxKTtcbiAgdmFyIGQgPSBpbS5kYXRhO1xuICByZXR1cm4gKGRbMF0gPDwgMTYpICsgKGRbMV0gPDwgOCkgKyBkWzJdO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9tb3ZldG9cbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX21vdmV0byh4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMueD14O1xuICBzLnk9eTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY3VycmVudF94XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9jdXJyZW50X3goKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICByZXR1cm4gcy54XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2N1cnJlbnRfeVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfY3VycmVudF95KCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueVxufVxuLy9Qcm92aWRlczogY2FtbF9ncl9saW5ldG9cbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2xpbmV0byh4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgcy5jb250ZXh0Lm1vdmVUbyhzLngscy5oZWlnaHQgLSBzLnkpO1xuICBzLmNvbnRleHQubGluZVRvKHgscy5oZWlnaHQgLSB5KTtcbiAgcy5jb250ZXh0LnN0cm9rZSgpO1xuICBzLng9eDtcbiAgcy55PXk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3JlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfcmVjdCh4LHksdyxoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuc3Ryb2tlUmVjdCh4LHMuaGVpZ2h0IC0geSx3LC1oKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfYXJjX2F1eFxuZnVuY3Rpb24gY2FtbF9ncl9hcmNfYXV4KGN0eCxjeCxjeSxyeSxyeCxhMSxhMil7XG4gIHdoaWxlKGExPmEyKSBhMis9MzYwO1xuICBhMSAvPSAxODA7XG4gIGEyIC89IDE4MDtcbiAgdmFyIHJvdCA9IDAseFBvcyx5UG9zLHhQb3NfcHJldix5UG9zX3ByZXY7XG4gIHZhciBzcGFjZSA9IDI7XG4gIHZhciBudW0gPSAoKChhMiAtIGExKSAqIE1hdGguUEkgKiAoKHJ4K3J5KS8yKSkgLyBzcGFjZSkgfCAwO1xuICB2YXIgZGVsdGEgPSAoYTIgLSBhMSkgKiBNYXRoLlBJIC8gbnVtO1xuICB2YXIgaSA9IGExICogTWF0aC5QSTtcbiAgZm9yICh2YXIgaj0wO2o8PW51bTtqKyspe1xuICAgIHhQb3MgPSBjeCAtIChyeCAqIE1hdGguc2luKGkpKSAqIE1hdGguc2luKHJvdCAqIE1hdGguUEkpICsgKHJ5ICogTWF0aC5jb3MoaSkpICogTWF0aC5jb3Mocm90ICogTWF0aC5QSSk7XG4gICAgeFBvcyA9IHhQb3MudG9GaXhlZCgyKTtcbiAgICB5UG9zID0gY3kgKyAocnkgKiBNYXRoLmNvcyhpKSkgKiBNYXRoLnNpbihyb3QgKiBNYXRoLlBJKSArIChyeCAqIE1hdGguc2luKGkpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHlQb3MgPSB5UG9zLnRvRml4ZWQoMik7XG4gICAgaWYgKGo9PTApIHtcbiAgICAgIGN0eC5tb3ZlVG8oeFBvcywgeVBvcyk7XG4gICAgfSBlbHNlIGlmICh4UG9zX3ByZXYhPXhQb3MgfHwgeVBvc19wcmV2IT15UG9zKXtcbiAgICAgIGN0eC5saW5lVG8oeFBvcywgeVBvcyk7XG4gICAgfVxuICAgIHhQb3NfcHJldj14UG9zO1xuICAgIHlQb3NfcHJldj15UG9zO1xuICAgIGktPSBkZWx0YTsvL2Njd1xuICB9XG4gIHJldHVybiAwO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19hcmNcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0LCBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19hcmMoeCx5LHJ4LHJ5LGExLGEyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNhbWxfZ3JfYXJjX2F1eChzLmNvbnRleHQseCxzLmhlaWdodCAtIHkscngscnksYTEsYTIpO1xuICBzLmNvbnRleHQuc3Ryb2tlKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9saW5lX3dpZHRoXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9zZXRfbGluZV93aWR0aCh3KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmxpbmVfd2lkdGggPSB3O1xuICBzLmNvbnRleHQubGluZVdpZHRoID0gd1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9maWxsX3JlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfcmVjdCh4LHksdyxoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuZmlsbFJlY3QoeCxzLmhlaWdodCAtIHksdywtaCk7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9maWxsX3BvbHlcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfcG9seShhcil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBzLmNvbnRleHQubW92ZVRvKGFyWzFdWzFdLHMuaGVpZ2h0IC0gYXJbMV1bMl0pO1xuICBmb3IodmFyIGkgPSAyOyBpIDwgYXIubGVuZ3RoOyBpKyspXG4gICAgcy5jb250ZXh0LmxpbmVUbyhhcltpXVsxXSxzLmhlaWdodCAtIGFyW2ldWzJdKTtcbiAgcy5jb250ZXh0LmxpbmVUbyhhclsxXVsxXSxzLmhlaWdodCAtIGFyWzFdWzJdKTtcbiAgcy5jb250ZXh0LmZpbGwoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9hcmNcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0LCBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfZmlsbF9hcmMoeCx5LHJ4LHJ5LGExLGEyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNhbWxfZ3JfYXJjX2F1eChzLmNvbnRleHQseCxzLmhlaWdodCAtIHkscngscnksYTEsYTIpO1xuICBzLmNvbnRleHQuZmlsbCgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3N0clxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19zdHIoc3RyKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgbSA9IHMuY29udGV4dC5tZWFzdXJlVGV4dChzdHIpO1xuICB2YXIgZHggPSBtLndpZHRoO1xuICBzLmNvbnRleHQuZmlsbFRleHQoc3RyLHMueCxzLmhlaWdodCAtIHMueSk7XG4gIHMueCArPSBkeCB8IDA7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfY2hhclxuLy9SZXF1aXJlczogY2FtbF9ncl9kcmF3X3N0clxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X2NoYXIoYyl7XG4gIGNhbWxfZ3JfZHJhd19zdHIoU3RyaW5nLmZyb21DaGFyQ29kZShjKSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2dyX2RyYXdfc3RyXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X3N0cmluZyhzdHIpe1xuICBjYW1sX2dyX2RyYXdfc3RyKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHN0cikpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfZm9udFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF9mb250KGYpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuZm9udCA9IGY7XG4gIHMuY29udGV4dC5mb250ID0gcy50ZXh0X3NpemUgKyBcInB4IFwiICsgY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocy5mb250KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X3RleHRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3NldF90ZXh0X3NpemUoc2l6ZSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy50ZXh0X3NpemUgPSBzaXplO1xuICBzLmNvbnRleHQuZm9udCA9IHMudGV4dF9zaXplICsgXCJweCBcIiArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMuZm9udCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3RleHRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2dyX3RleHRfc2l6ZSh0eHQpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciB3ID0gcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHR4dCkpLndpZHRoO1xuICByZXR1cm4gWzAsdyxzLnRleHRfc2l6ZV07XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9ncl9tYWtlX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9tYWtlX2ltYWdlKGFycil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGggPSBhcnIubGVuZ3RoIC0gMSA7XG4gIHZhciB3ID0gYXJyWzFdLmxlbmd0aCAtIDE7XG4gIHZhciBpbSA9IHMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEodyxoKTtcbiAgZm9yKHZhciBpPTA7aTxoO2krKyl7XG4gICAgZm9yKHZhciBqPTA7ajx3O2orKyl7XG4gICAgICB2YXIgYyA9IGFycltpKzFdW2orMV07XG4gICAgICB2YXIgbyA9IGkqKHcqNCkgKyAoaiAqIDQpO1xuICAgICAgaWYoYyA9PSAtMSkge1xuICAgICAgICBpbS5kYXRhW28gKyAwXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDFdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgMl0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAzXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbS5kYXRhW28gKyAwXSA9IGMgPj4gMTYgJiAweGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IGMgPj4gIDggJiAweGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAyXSA9IGMgPj4gIDAgJiAwWGZmO1xuICAgICAgICBpbS5kYXRhW28gKyAzXSA9IDB4ZmY7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBpbVxufVxuLy9Qcm92aWRlczogY2FtbF9ncl9kdW1wX2ltYWdlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kdW1wX2ltYWdlKGltKXtcbiAgdmFyIGRhdGEgPSBbMF1cbiAgZm9yKHZhciBpPTA7IGk8aW0uaGVpZ2h0O2krKyl7XG4gICAgZGF0YVtpKzFdID0gWzBdXG4gICAgZm9yKHZhciBqPTA7IGo8aW0ud2lkdGg7aisrKXtcbiAgICAgIHZhciBvID0gaSooaW0ud2lkdGgqNCkgKyAoaiAqIDQpLFxuICAgICAgICAgIHIgPSBpbS5kYXRhW28rMF0sXG4gICAgICAgICAgZyA9IGltLmRhdGFbbysxXSxcbiAgICAgICAgICBiID0gaW0uZGF0YVtvKzJdO1xuICAgICAgZGF0YVtpKzFdW2orMV0gPSAociA8PCAxNikgKyAoZyA8PCA4KSArIGJcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19pbWFnZShpbSx4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIGlmKCFpbS5pbWFnZSkge1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHMud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHMuaGVpZ2h0O1xuICAgIGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikucHV0SW1hZ2VEYXRhKGltLDAsMCk7XG4gICAgdmFyIGltYWdlID0gbmV3IGdsb2JhbFRoaXMuSW1hZ2UoKTtcbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzLmNvbnRleHQuZHJhd0ltYWdlKGltYWdlLHgscy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5KTtcbiAgICAgIGltLmltYWdlID0gaW1hZ2U7XG4gICAgfVxuICAgIGltYWdlLnNyYyA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG4gIH0gZWxzZSB7XG4gICAgcy5jb250ZXh0LmRyYXdJbWFnZShpbS5pbWFnZSx4LHMuaGVpZ2h0IC0gaW0uaGVpZ2h0IC0geSk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2NyZWF0ZV9pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfY3JlYXRlX2ltYWdlKHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEoeCx5KTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfYmxpdF9pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfYmxpdF9pbWFnZShpbSx4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbTIgPSBzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKHgscy5oZWlnaHQgLSBpbS5oZWlnaHQgLSB5LGltLndpZHRoLGltLmhlaWdodCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW0yLmRhdGEubGVuZ3RoOyBpKz00KXtcbiAgICBpbS5kYXRhW2ldID0gaW0yLmRhdGFbaV07XG4gICAgaW0uZGF0YVtpKzFdID0gaW0yLmRhdGFbaSsxXTtcbiAgICBpbS5kYXRhW2krMl0gPSBpbTIuZGF0YVtpKzJdO1xuICAgIGltLmRhdGFbaSszXSA9IGltMi5kYXRhW2krM107XG4gIH1cbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NpZ2lvX2hhbmRsZXJcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2lnaW9faGFuZGxlcigpe3JldHVybiAwfVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19zaWduYWxcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2lnaW9fc2lnbmFsKCl7cmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3dhaXRfZXZlbnRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3Jfd2FpdF9ldmVudChfZXZsKXtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfd2FpdF9ldmVudCBub3QgSW1wbGVtZW50ZWQ6IHVzZSBHcmFwaGljc19qcyBpbnN0ZWFkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N5bmNocm9uaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3N5bmNocm9uaXplICgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfc3luY2hyb25pemUgbm90IEltcGxlbWVudGVkXCIpO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9yZW1lbWJlcl9tb2RlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3JlbWVtYmVyX21vZGUgKCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9yZW1lbWJlcl9tb2RlIG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZGlzcGxheV9tb2RlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX2Rpc3BsYXlfbW9kZSgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfZGlzcGxheV9tb2RlIG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl93aW5kb3dfaWRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3Jfd2luZG93X2lkKGEpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3Jfd2luZG93X2lkIG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9vcGVuX3N1YndpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9vcGVuX3N1YndpbmRvdyhhLGIsYyxkKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX29wZW5fc3Vid2luZG93IG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbG9zZV9zdWJ3aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93KGEpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93IG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cbiIsIlxuLy9Qcm92aWRlczogY2FtbF9jdXN0b21fZXZlbnRfaW5kZXhcbnZhciBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlclxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fZXZlbnRfaW5kZXhcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZWdpc3RlcihldmVudF9uYW1lLCBldmVudF90YWcsIGV2ZW50X3R5cGUpIHtcbiAgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXggKz0gMTtcbiAgcmV0dXJuIFswLCBjYW1sX2N1c3RvbV9ldmVudF9pbmRleCwgZXZlbnRfbmFtZSwgZXZlbnRfdHlwZSwgZXZlbnRfdGFnXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfd3JpdGUoZXZlbnQsIGV2ZW50X2NvbnRlbnQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl9yZXNvbHZlXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVzb2x2ZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfc3RhcnRcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfc3RhcnQoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3BhdXNlKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19yZXN1bWVcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfcmVzdW1lKCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19jcmVhdGVfY3Vyc29yXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX2NyZWF0ZV9jdXJzb3IodGFyZ2V0KSB7XG4gIHJldHVybiB7fTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19mcmVlX2N1cnNvclxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19mcmVlX2N1cnNvcihjdXJzb3IpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcmVhZF9wb2xsXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3JlYWRfcG9sbChjdXJzb3IsIGNhbGxiYWNrcywgbnVtKSB7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFyc2hhbF9jb25zdGFudHNcbnZhciBjYW1sX21hcnNoYWxfY29uc3RhbnRzID0ge1xuICBQUkVGSVhfU01BTExfQkxPQ0s6ICAgICAgICAgMHg4MCxcbiAgUFJFRklYX1NNQUxMX0lOVDogICAgICAgICAgIDB4NDAsXG4gIFBSRUZJWF9TTUFMTF9TVFJJTkc6ICAgICAgICAweDIwLFxuICBDT0RFX0lOVDg6ICAgICAgICAgICAgICAgICAgMHgwMCxcbiAgQ09ERV9JTlQxNjogICAgICAgICAgICAgICAgIDB4MDEsXG4gIENPREVfSU5UMzI6ICAgICAgICAgICAgICAgICAweDAyLFxuICBDT0RFX0lOVDY0OiAgICAgICAgICAgICAgICAgMHgwMyxcbiAgQ09ERV9TSEFSRUQ4OiAgICAgICAgICAgICAgIDB4MDQsXG4gIENPREVfU0hBUkVEMTY6ICAgICAgICAgICAgICAweDA1LFxuICBDT0RFX1NIQVJFRDMyOiAgICAgICAgICAgICAgMHgwNixcbiAgQ09ERV9CTE9DSzMyOiAgICAgICAgICAgICAgIDB4MDgsXG4gIENPREVfQkxPQ0s2NDogICAgICAgICAgICAgICAweDEzLFxuICBDT0RFX1NUUklORzg6ICAgICAgICAgICAgICAgMHgwOSxcbiAgQ09ERV9TVFJJTkczMjogICAgICAgICAgICAgIDB4MEEsXG4gIENPREVfRE9VQkxFX0JJRzogICAgICAgICAgICAweDBCLFxuICBDT0RFX0RPVUJMRV9MSVRUTEU6ICAgICAgICAgMHgwQyxcbiAgQ09ERV9ET1VCTEVfQVJSQVk4X0JJRzogICAgIDB4MEQsXG4gIENPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6ICAweDBFLFxuICBDT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzogICAgMHgwRixcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9MSVRUTEU6IDB4MDcsXG4gIENPREVfQ09ERVBPSU5URVI6ICAgICAgICAgICAweDEwLFxuICBDT0RFX0lORklYUE9JTlRFUjogICAgICAgICAgMHgxMSxcbiAgQ09ERV9DVVNUT006ICAgICAgICAgICAgICAgIDB4MTIsXG4gIENPREVfQ1VTVE9NX0xFTjogICAgICAgICAgICAweDE4LFxuICBDT0RFX0NVU1RPTV9GSVhFRDogICAgICAgICAgMHgxOVxufVxuXG5cbi8vUHJvdmlkZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5LCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBVSW50OEFycmF5UmVhZGVyIChzLCBpKSB7IHRoaXMucyA9IHM7IHRoaXMuaSA9IGk7IH1cblVJbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlID0ge1xuICByZWFkOHU6ZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zW3RoaXMuaSsrXTsgfSxcbiAgcmVhZDhzOmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc1t0aGlzLmkrK10gPDwgMjQgPj4gMjQ7IH0sXG4gIHJlYWQxNnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoc1tpXSA8PCA4KSB8IHNbaSArIDFdXG4gIH0sXG4gIHJlYWQxNnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoc1tpXSA8PCAyNCA+PiAxNikgfCBzW2kgKyAxXTtcbiAgfSxcbiAgcmVhZDMydTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuICgoc1tpXSA8PCAyNCkgfCAoc1tpKzFdIDw8IDE2KSB8XG4gICAgICAgICAgICAoc1tpKzJdIDw8IDgpIHwgc1tpKzNdKSA+Pj4gMDtcbiAgfSxcbiAgcmVhZDMyczpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuIChzW2ldIDw8IDI0KSB8IChzW2krMV0gPDwgMTYpIHxcbiAgICAgIChzW2krMl0gPDwgOCkgfCBzW2krM107XG4gIH0sXG4gIHJlYWRzdHI6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KHRoaXMucy5zdWJhcnJheShpLCBpICsgbGVuKSk7XG4gIH0sXG4gIHJlYWR1aW50OGFycmF5OmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiB0aGlzLnMuc3ViYXJyYXkoaSwgaSArIGxlbik7XG4gIH1cbn1cblxuXG4vL1Byb3ZpZGVzOiBNbFN0cmluZ1JlYWRlclxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gTWxTdHJpbmdSZWFkZXIgKHMsIGkpIHsgdGhpcy5zID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKTsgdGhpcy5pID0gaTsgfVxuTWxTdHJpbmdSZWFkZXIucHJvdG90eXBlID0ge1xuICByZWFkOHU6ZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspOyB9LFxuICByZWFkOHM6ZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5zLmNoYXJDb2RlQXQodGhpcy5pKyspIDw8IDI0ID4+IDI0OyB9LFxuICByZWFkMTZ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKHMuY2hhckNvZGVBdChpKSA8PCA4KSB8IHMuY2hhckNvZGVBdChpICsgMSlcbiAgfSxcbiAgcmVhZDE2czpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzLmNoYXJDb2RlQXQoaSkgPDwgMjQgPj4gMTYpIHwgcy5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgfSxcbiAgcmVhZDMydTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuICgocy5jaGFyQ29kZUF0KGkpIDw8IDI0KSB8IChzLmNoYXJDb2RlQXQoaSsxKSA8PCAxNikgfFxuICAgICAgICAgICAgKHMuY2hhckNvZGVBdChpKzIpIDw8IDgpIHwgcy5jaGFyQ29kZUF0KGkrMykpID4+PiAwO1xuICB9LFxuICByZWFkMzJzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfCAocy5jaGFyQ29kZUF0KGkrMSkgPDwgMTYpIHxcbiAgICAgIChzLmNoYXJDb2RlQXQoaSsyKSA8PCA4KSB8IHMuY2hhckNvZGVBdChpKzMpO1xuICB9LFxuICByZWFkc3RyOmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHRoaXMucy5zdWJzdHJpbmcoaSwgaSArIGxlbikpO1xuICB9LFxuICByZWFkdWludDhhcnJheTpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGIgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHZhciBzID0gdGhpcy5zO1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIGZvcih2YXIgaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgYltqXSA9IHMuY2hhckNvZGVBdChpICsgaik7XG4gICAgfVxuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIGI7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogQmlnU3RyaW5nUmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheSwgY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gQmlnU3RyaW5nUmVhZGVyIChicywgaSkgeyB0aGlzLnMgPSBiczsgdGhpcy5pID0gaTsgfVxuQmlnU3RyaW5nUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgcmVhZDh1OmZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbWxfYmFfZ2V0XzEodGhpcy5zLHRoaXMuaSsrKTsgfSxcbiAgcmVhZDhzOmZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhbWxfYmFfZ2V0XzEodGhpcy5zLHRoaXMuaSsrKSA8PCAyNCA+PiAyNDsgfSxcbiAgcmVhZDE2dTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChjYW1sX2JhX2dldF8xKHMsaSkgPDwgOCkgfCBjYW1sX2JhX2dldF8xKHMsaSArIDEpXG4gIH0sXG4gIHJlYWQxNnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoY2FtbF9iYV9nZXRfMShzLGkpIDw8IDI0ID4+IDE2KSB8IGNhbWxfYmFfZ2V0XzEocyxpICsgMSk7XG4gIH0sXG4gIHJlYWQzMnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKGNhbWxfYmFfZ2V0XzEocyxpKSAgIDw8IDI0KSB8IChjYW1sX2JhX2dldF8xKHMsaSsxKSA8PCAxNikgfFxuICAgICAgICAgICAgKGNhbWxfYmFfZ2V0XzEocyxpKzIpIDw8IDgpICB8IGNhbWxfYmFfZ2V0XzEocyxpKzMpICAgICAgICAgKSA+Pj4gMDtcbiAgfSxcbiAgcmVhZDMyczpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuIChjYW1sX2JhX2dldF8xKHMsaSkgICA8PCAyNCkgfCAoY2FtbF9iYV9nZXRfMShzLGkrMSkgPDwgMTYpIHxcbiAgICAgIChjYW1sX2JhX2dldF8xKHMsaSsyKSA8PCA4KSAgfCBjYW1sX2JhX2dldF8xKHMsaSszKTtcbiAgfSxcbiAgcmVhZHN0cjpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdmFyIGFyciA9IG5ldyBBcnJheShsZW4pXG4gICAgZm9yKHZhciBqID0gMDsgaiA8IGxlbjsgaisrKXtcbiAgICAgIGFycltqXSA9IGNhbWxfYmFfZ2V0XzEodGhpcy5zLCBpK2opO1xuICAgIH1cbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShhcnIpO1xuICB9LFxuICByZWFkdWludDhhcnJheTpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0KGkpO1xuICAgIHRoaXMuaSA9IGkgKyBsZW47XG4gICAgcmV0dXJuIHRoaXMucy5kYXRhLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuKTtcbiAgfVxufVxuXG5cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX2J5dGVzIChhKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgKGNhbWxfaW50NjRfb2ZfYnl0ZXMgKGEpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3N0cmluZyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBNbFN0cmluZ1JlYWRlciwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlclxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3N0cmluZyhzLG9mcykge1xuICB2YXIgcmVhZGVyID0gbmV3IE1sU3RyaW5nUmVhZGVyIChzLCB0eXBlb2Ygb2ZzPT1cIm51bWJlclwiP29mczpvZnNbMF0pO1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIsIG9mcylcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IE1sU3RyaW5nUmVhZGVyLCBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyLCBjYW1sX3N0cmluZ19vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzKHMsb2ZzKSB7XG4gIHZhciByZWFkZXIgPSBuZXcgTWxTdHJpbmdSZWFkZXIgKGNhbWxfc3RyaW5nX29mX2J5dGVzKHMpLCB0eXBlb2Ygb2ZzPT1cIm51bWJlclwiP29mczpvZnNbMF0pO1xuICByZXR1cm4gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcihyZWFkZXIsIG9mcylcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdW5tYXJzaGFsKHJlYWRlciwgc2l6ZSl7XG4gIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICBzaXplWzBdID0gODtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMgKHQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X21hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW50NjRfbWFyc2hhbCh3cml0ZXIsIHYsIHNpemVzKSB7XG4gIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyAodik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB3cml0ZXIud3JpdGUgKDgsIGJbaV0pO1xuICBzaXplc1swXSA9IDg7IHNpemVzWzFdID0gODtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl91bm1hcnNoYWxcbmZ1bmN0aW9uIGNhbWxfaW50MzJfdW5tYXJzaGFsKHJlYWRlciwgc2l6ZSl7XG4gIHNpemVbMF0gPSA0O1xuICByZXR1cm4gcmVhZGVyLnJlYWQzMnMgKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsKHJlYWRlciwgc2l6ZSl7XG4gIHN3aXRjaCAocmVhZGVyLnJlYWQ4dSAoKSkge1xuICBjYXNlIDE6XG4gICAgc2l6ZVswXSA9IDQ7XG4gICAgcmV0dXJuIHJlYWRlci5yZWFkMzJzICgpO1xuICBjYXNlIDI6XG4gICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBuYXRpdmUgaW50ZWdlciB2YWx1ZSB0b28gbGFyZ2VcIik7XG4gIGRlZmF1bHQ6IGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaWxsLWZvcm1lZCBuYXRpdmUgaW50ZWdlclwiKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdW5tYXJzaGFsLCBjYW1sX2ludDY0X21hcnNoYWwsIGNhbWxfaW50NjRfY29tcGFyZSwgY2FtbF9pbnQ2NF9oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX3VubWFyc2hhbCwgY2FtbF9uYXRpdmVpbnRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2JhX3NlcmlhbGl6ZSwgY2FtbF9iYV9kZXNlcmlhbGl6ZSwgY2FtbF9iYV9jb21wYXJlLCBjYW1sX2JhX2hhc2hcbnZhciBjYW1sX2N1c3RvbV9vcHMgPVxuICAgIHtcIl9qXCI6IHtcbiAgICAgIGRlc2VyaWFsaXplIDogY2FtbF9pbnQ2NF91bm1hcnNoYWwsXG4gICAgICBzZXJpYWxpemUgIDogY2FtbF9pbnQ2NF9tYXJzaGFsLFxuICAgICAgZml4ZWRfbGVuZ3RoIDogOCxcbiAgICAgIGNvbXBhcmUgOiBjYW1sX2ludDY0X2NvbXBhcmUsXG4gICAgICBoYXNoIDogY2FtbF9pbnQ2NF9oYXNoXG4gICAgfSxcbiAgICAgXCJfaVwiOiB7XG4gICAgICAgZGVzZXJpYWxpemUgOiBjYW1sX2ludDMyX3VubWFyc2hhbCxcbiAgICAgICBmaXhlZF9sZW5ndGggOiA0LFxuICAgICB9LFxuICAgICBcIl9uXCI6IHtcbiAgICAgICBkZXNlcmlhbGl6ZSA6IGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbCxcbiAgICAgICBmaXhlZF9sZW5ndGggOiA0LFxuICAgICB9LFxuICAgICBcIl9iaWdhcnJheVwiOntcbiAgICAgICBkZXNlcmlhbGl6ZSA6IChmdW5jdGlvbiAocmVhZGVyLCBzeikge3JldHVybiBjYW1sX2JhX2Rlc2VyaWFsaXplIChyZWFkZXIsc3osXCJfYmlnYXJyYXlcIil9KSxcbiAgICAgICBzZXJpYWxpemUgOiBjYW1sX2JhX3NlcmlhbGl6ZSxcbiAgICAgICBjb21wYXJlIDogY2FtbF9iYV9jb21wYXJlLFxuICAgICAgIGhhc2g6IGNhbWxfYmFfaGFzaCxcbiAgICAgfSxcbiAgICAgXCJfYmlnYXJyMDJcIjp7XG4gICAgICAgZGVzZXJpYWxpemUgOiAoZnVuY3Rpb24gKHJlYWRlciwgc3opIHtyZXR1cm4gY2FtbF9iYV9kZXNlcmlhbGl6ZSAocmVhZGVyLHN6LFwiX2JpZ2FycjAyXCIpfSksXG4gICAgICAgc2VyaWFsaXplIDogY2FtbF9iYV9zZXJpYWxpemUsXG4gICAgICAgY29tcGFyZSA6IGNhbWxfYmFfY29tcGFyZSxcbiAgICAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gICAgIH1cbiAgICB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9mbG9hdF9vZl9ieXRlcywgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiB6c3RkX2RlY29tcHJlc3Ncbi8vUmVxdWlyZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIocmVhZGVyLCBvZnMpIHtcbiAgZnVuY3Rpb24gcmVhZHZscShvdmVyZmxvdykge1xuICAgIHZhciBjID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N0Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT0gMCkge1xuICAgICAgYyA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBuNyA9IG4gPDwgNztcbiAgICAgIGlmIChuICE9IG43ID4+IDcpIG92ZXJmbG93WzBdID0gdHJ1ZTtcbiAgICAgIG4gPSBuNyB8IChjICYgMHg3Rik7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIHZhciBtYWdpYyA9IHJlYWRlci5yZWFkMzJ1ICgpXG4gIHN3aXRjaChtYWdpYyl7XG4gIGNhc2UgMHg4NDk1QTZCRTogLyogSW50ZXh0X21hZ2ljX251bWJlcl9zbWFsbCAqL1xuICAgIHZhciBoZWFkZXJfbGVuID0gMjA7XG4gICAgdmFyIGNvbXByZXNzZWQgPSAwO1xuICAgIHZhciBkYXRhX2xlbiA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgIHZhciB1bmNvbXByZXNzZWRfZGF0YV9sZW4gPSBkYXRhX2xlbjtcbiAgICB2YXIgbnVtX29iamVjdHMgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICB2YXIgX3NpemVfMzIgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICB2YXIgX3NpemVfNjQgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICBicmVha1xuICBjYXNlIDB4ODQ5NUE2QkQ6IC8qIEludGV4dF9tYWdpY19udW1iZXJfY29tcHJlc3NlZCAqL1xuICAgIHZhciBoZWFkZXJfbGVuID0gcmVhZGVyLnJlYWQ4dSgpICYgMHgzRjtcbiAgICB2YXIgY29tcHJlc3NlZCA9IDE7XG4gICAgdmFyIG92ZXJmbG93ID0gW2ZhbHNlXTtcbiAgICB2YXIgZGF0YV9sZW4gPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICB2YXIgdW5jb21wcmVzc2VkX2RhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgdmFyIG51bV9vYmplY3RzID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgdmFyIF9zaXplXzMyID0gcmVhZHZscSAob3ZlcmZsb3cpO1xuICAgIHZhciBfc2l6ZV82NCA9IHJlYWR2bHEgKG92ZXJmbG93KTtcbiAgICBpZihvdmVyZmxvd1swXSl7XG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiB0aGlzIHBsYXRmb3JtXCIpO1xuICAgIH1cbiAgICBicmVha1xuICBjYXNlIDB4ODQ5NUE2QkY6IC8qIEludGV4dF9tYWdpY19udW1iZXJfYmlnICovXG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIGEgMzItYml0IHBsYXRmb3JtXCIpO1xuICAgIGJyZWFrXG4gIGRlZmF1bHQ6XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXI6IGJhZCBvYmplY3RcIik7XG4gICAgYnJlYWs7XG4gIH1cbiAgdmFyIHN0YWNrID0gW107XG4gIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gKG51bV9vYmplY3RzID4gMCk/W106bnVsbDtcbiAgdmFyIG9ial9jb3VudGVyID0gMDtcbiAgZnVuY3Rpb24gaW50ZXJuX3JlYyAocmVhZGVyKSB7XG4gICAgdmFyIGNvZGUgPSByZWFkZXIucmVhZDh1ICgpO1xuICAgIGlmIChjb2RlID49IDB4NDAgLypjc3QuUFJFRklYX1NNQUxMX0lOVCovKSB7XG4gICAgICBpZiAoY29kZSA+PSAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovKSB7XG4gICAgICAgIHZhciB0YWcgPSBjb2RlICYgMHhGO1xuICAgICAgICB2YXIgc2l6ZSA9IChjb2RlID4+IDQpICYgMHg3O1xuICAgICAgICB2YXIgdiA9IFt0YWddO1xuICAgICAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gdjtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gKGNvZGUgJiAweDNGKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvZGUgPj0gMHgyMC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcgKi8pIHtcbiAgICAgICAgdmFyIGxlbiA9IGNvZGUgJiAweDFGO1xuICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyIChsZW4pO1xuICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgIHJldHVybiB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoKGNvZGUpIHtcbiAgICAgICAgY2FzZSAweDAwOiAvL2NzdC5DT0RFX0lOVDg6XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkOHMgKCk7XG4gICAgICAgIGNhc2UgMHgwMTogLy9jc3QuQ09ERV9JTlQxNjpcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQxNnMgKCk7XG4gICAgICAgIGNhc2UgMHgwMjogLy9jc3QuQ09ERV9JTlQzMjpcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWQzMnMgKCk7XG4gICAgICAgIGNhc2UgMHgwMzogLy9jc3QuQ09ERV9JTlQ2NDpcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGludGVnZXIgdG9vIGxhcmdlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MDQ6IC8vY3N0LkNPREVfU0hBUkVEODpcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICAgICAgICBpZihjb21wcmVzc2VkID09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgIGNhc2UgMHgwNTogLy9jc3QuQ09ERV9TSEFSRUQxNjpcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gcmVhZGVyLnJlYWQxNnUgKCk7XG4gICAgICAgICAgaWYoY29tcHJlc3NlZCA9PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICBjYXNlIDB4MDY6IC8vY3N0LkNPREVfU0hBUkVEMzI6XG4gICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgICAgICAgIGlmKGNvbXByZXNzZWQgPT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgY2FzZSAweDA4OiAvL2NzdC5DT0RFX0JMT0NLMzI6XG4gICAgICAgICAgdmFyIGhlYWRlciA9IHJlYWRlci5yZWFkMzJ1ICgpO1xuICAgICAgICAgIHZhciB0YWcgPSBoZWFkZXIgJiAweEZGO1xuICAgICAgICAgIHZhciBzaXplID0gaGVhZGVyID4+IDEwO1xuICAgICAgICAgIHZhciB2ID0gW3RhZ107XG4gICAgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIHY7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgxMzogLy9jc3QuQ09ERV9CTE9DSzY0OlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGRhdGEgYmxvY2sgdG9vIGxhcmdlXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDB4MDk6IC8vY3N0LkNPREVfU1RSSU5HODpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIgKGxlbik7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEE6IC8vY3N0LkNPREVfU1RSSU5HMzI6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgICAgdmFyIHYgPSByZWFkZXIucmVhZHN0ciAobGVuKTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwQzogLy9jc3QuQ09ERV9ET1VCTEVfTElUVExFOlxuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgODtpKyspIHRbNyAtIGldID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICAgICAgICB2YXIgdiA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBCOiAvL2NzdC5DT0RFX0RPVUJMRV9CSUc6XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCA4O2krKykgdFtpXSA9IHJlYWRlci5yZWFkOHUgKCk7XG4gICAgICAgICAgdmFyIHYgPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwRTogLy9jc3QuQ09ERV9ET1VCTEVfQVJSQVk4X0xJVFRMRTpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbNyAtIGpdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBEOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWThfQklHOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuKzEpO1xuICAgICAgICAgIHZbMF0gPSAyNTQ7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTtpIDw9IGxlbjtpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHYgW2ldID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MDc6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZMzJfTElUVExFOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbNyAtIGpdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdltpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBGOiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0JJRzpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICB2YXIgdiA9IG5ldyBBcnJheShsZW4rMSk7XG4gICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2IFtpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDEwOiAvL2NzdC5DT0RFX0NPREVQT0lOVEVSOlxuICAgICAgICBjYXNlIDB4MTE6IC8vY3N0LkNPREVfSU5GSVhQT0lOVEVSOlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGNvZGUgcG9pbnRlclwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDEyOiAvL2NzdC5DT0RFX0NVU1RPTTpcbiAgICAgICAgY2FzZSAweDE4OiAvL2NzdC5DT0RFX0NVU1RPTV9MRU46XG4gICAgICAgIGNhc2UgMHgxOTogLy9jc3QuQ09ERV9DVVNUT01fRklYRUQ6XG4gICAgICAgICAgdmFyIGMsIHMgPSBcIlwiO1xuICAgICAgICAgIHdoaWxlICgoYyA9IHJlYWRlci5yZWFkOHUgKCkpICE9IDApIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSAoYyk7XG4gICAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tzXTtcbiAgICAgICAgICB2YXIgZXhwZWN0ZWRfc2l6ZTtcbiAgICAgICAgICBpZighb3BzKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB1bmtub3duIGN1c3RvbSBibG9jayBpZGVudGlmaWVyXCIpO1xuICAgICAgICAgIHN3aXRjaChjb2RlKXtcbiAgICAgICAgICBjYXNlIDB4MTI6IC8vIGNzdC5DT0RFX0NVU1RPTSAoZGVwcmVjYXRlZClcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMHgxOTogLy8gY3N0LkNPREVfQ1VTVE9NX0ZJWEVEXG4gICAgICAgICAgICBpZighb3BzLmZpeGVkX2xlbmd0aClcbiAgICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBleHBlY3RlZCBhIGZpeGVkLXNpemUgY3VzdG9tIGJsb2NrXCIpO1xuICAgICAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IG9wcy5maXhlZF9sZW5ndGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MTg6IC8vIGNzdC5DT0RFX0NVU1RPTV9MRU5cbiAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICAgICAgICAgIC8vIFNraXAgc2l6ZTY0XG4gICAgICAgICAgICByZWFkZXIucmVhZDMycygpOyByZWFkZXIucmVhZDMycygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBvbGRfcG9zID0gcmVhZGVyLmk7XG4gICAgICAgICAgdmFyIHNpemUgPSBbMF07XG4gICAgICAgICAgdmFyIHYgPSBvcHMuZGVzZXJpYWxpemUocmVhZGVyLCBzaXplKTtcbiAgICAgICAgICBpZihleHBlY3RlZF9zaXplICE9IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICBpZihleHBlY3RlZF9zaXplICE9IHNpemVbMF0pXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogaW5jb3JyZWN0IGxlbmd0aCBvZiBzZXJpYWxpemVkIGN1c3RvbSBibG9ja1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNhbWxfZmFpbHdpdGggKFwiaW5wdXRfdmFsdWU6IGlsbC1mb3JtZWQgbWVzc2FnZVwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZihjb21wcmVzc2VkKSB7XG4gICAgdmFyIGRhdGEgPSByZWFkZXIucmVhZHVpbnQ4YXJyYXkoZGF0YV9sZW4pO1xuICAgIHZhciByZXMgPSBuZXcgVWludDhBcnJheSh1bmNvbXByZXNzZWRfZGF0YV9sZW4pO1xuICAgIHZhciByZXMgPSB6c3RkX2RlY29tcHJlc3MoZGF0YSwgcmVzKTtcbiAgICB2YXIgcmVhZGVyID0gbmV3IFVJbnQ4QXJyYXlSZWFkZXIocmVzLCAwKTtcbiAgfVxuICB2YXIgcmVzID0gaW50ZXJuX3JlYyAocmVhZGVyKTtcbiAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgc2l6ZSA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciB2ID0gc3RhY2sucG9wKCk7XG4gICAgdmFyIGQgPSB2Lmxlbmd0aDtcbiAgICBpZiAoZCA8IHNpemUpIHN0YWNrLnB1c2godiwgc2l6ZSk7XG4gICAgdltkXSA9IGludGVybl9yZWMgKHJlYWRlcik7XG4gIH1cbiAgaWYgKHR5cGVvZiBvZnMhPVwibnVtYmVyXCIpIG9mc1swXSA9IHJlYWRlci5pO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPCA1LjEuMFxudmFyIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSA9IDIwXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuLy9WZXJzaW9uOiA+PSA1LjEuMFxudmFyIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSA9IDE2XG5cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfZGF0YV9zaXplIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogVUludDhBcnJheVJlYWRlclxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplXG5mdW5jdGlvbiBjYW1sX21hcnNoYWxfZGF0YV9zaXplIChzLCBvZnMpIHtcbiAgdmFyIHIgPSBuZXcgVUludDhBcnJheVJlYWRlcihjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHMpLCBvZnMpO1xuICBmdW5jdGlvbiByZWFkdmxxKG92ZXJmbG93KSB7XG4gICAgdmFyIGMgPSByLnJlYWQ4dSgpO1xuICAgIHZhciBuID0gYyAmIDB4N0Y7XG4gICAgd2hpbGUgKChjICYgMHg4MCkgIT0gMCkge1xuICAgICAgYyA9IHIucmVhZDh1KCk7XG4gICAgICB2YXIgbjcgPSBuIDw8IDc7XG4gICAgICBpZiAobiAhPSBuNyA+PiA3KSBvdmVyZmxvd1swXSA9IHRydWU7XG4gICAgICBuID0gbjcgfCAoYyAmIDB4N0YpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuXG4gIHN3aXRjaChyLnJlYWQzMnUoKSl7XG4gIGNhc2UgMHg4NDk1QTZCRTogLyogSW50ZXh0X21hZ2ljX251bWJlcl9zbWFsbCAqL1xuICAgIHZhciBoZWFkZXJfbGVuID0gMjA7XG4gICAgdmFyIGRhdGFfbGVuID0gci5yZWFkMzJ1KCk7XG4gICAgYnJlYWs7XG4gIGNhc2UgMHg4NDk1QTZCRDogLyogSW50ZXh0X21hZ2ljX251bWJlcl9jb21wcmVzc2VkICovXG4gICAgdmFyIGhlYWRlcl9sZW4gPSByLnJlYWQ4dSgpICYgMHgzRjtcbiAgICB2YXIgb3ZlcmZsb3cgPSBbZmFsc2VdO1xuICAgIHZhciBkYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgIGlmKG92ZXJmbG93WzBdKXtcbiAgICAgIGNhbWxfZmFpbHdpdGgoXCJNYXJzaGFsLmRhdGFfc2l6ZTogb2JqZWN0IHRvbyBsYXJnZSB0byBiZSByZWFkIGJhY2sgb24gdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG4gICAgYnJlYWtcbiAgY2FzZSAweDg0OTVBNkJGOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX2JpZyAqL1xuICBkZWZhdWx0OlxuICAgIGNhbWxfZmFpbHdpdGgoXCJNYXJzaGFsLmRhdGFfc2l6ZTogYmFkIG9iamVjdFwiKTtcbiAgICBicmVha1xuICB9XG4gIHJldHVybiBoZWFkZXJfbGVuIC0gY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplICsgZGF0YV9sZW47XG59XG5cbi8vUHJvdmlkZXM6IE1sT2JqZWN0VGFibGVcbnZhciBNbE9iamVjdFRhYmxlO1xuaWYgKHR5cGVvZiBnbG9iYWxUaGlzLldlYWtNYXAgPT09ICd1bmRlZmluZWQnKSB7XG4gIE1sT2JqZWN0VGFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAvKiBwb2x5ZmlsbCAodXNpbmcgbGluZWFyIHNlYXJjaCkgKi9cbiAgICBmdW5jdGlvbiBOYWl2ZUxvb2t1cChvYmpzKSB7IHRoaXMub2JqcyA9IG9ianM7IH1cbiAgICBOYWl2ZUxvb2t1cC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24odikge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9ianMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRoaXMub2Jqc1tpXSA9PT0gdikgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfTtcbiAgICBOYWl2ZUxvb2t1cC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyBEbyBub3RoaW5nIGhlcmUuIFtNbE9iamVjdFRhYmxlLnN0b3JlXSB3aWxsIHB1c2ggdG8gW3RoaXMub2Jqc10gZGlyZWN0bHkuXG4gICAgfTtcblxuICAgIHJldHVybiBmdW5jdGlvbiBNbE9iamVjdFRhYmxlKCkge1xuICAgICAgdGhpcy5vYmpzID0gW107IHRoaXMubG9va3VwID0gbmV3IE5haXZlTG9va3VwKHRoaXMub2Jqcyk7XG4gICAgfTtcbiAgfSgpO1xufVxuZWxzZSB7XG4gIE1sT2JqZWN0VGFibGUgPSBmdW5jdGlvbiBNbE9iamVjdFRhYmxlKCkge1xuICAgIHRoaXMub2JqcyA9IFtdOyB0aGlzLmxvb2t1cCA9IG5ldyBnbG9iYWxUaGlzLldlYWtNYXAoKTtcbiAgfTtcbn1cblxuTWxPYmplY3RUYWJsZS5wcm90b3R5cGUuc3RvcmUgPSBmdW5jdGlvbih2KSB7XG4gIHRoaXMubG9va3VwLnNldCh2LCB0aGlzLm9ianMubGVuZ3RoKTtcbiAgdGhpcy5vYmpzLnB1c2godik7XG59XG5cbk1sT2JqZWN0VGFibGUucHJvdG90eXBlLnJlY2FsbCA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIGkgPSB0aGlzLmxvb2t1cC5nZXQodik7XG4gIHJldHVybiAoaSA9PT0gdW5kZWZpbmVkKVxuICAgID8gdW5kZWZpbmVkIDogdGhpcy5vYmpzLmxlbmd0aCAtIGk7ICAgLyogaW5kZXggaXMgcmVsYXRpdmUgKi9cbn1cblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfc3RyaW5nLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IE1sT2JqZWN0VGFibGUsIGNhbWxfbGlzdF90b19qc19hcnJheSwgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9pc19jb250aW51YXRpb25fdGFnXG52YXIgY2FtbF9vdXRwdXRfdmFsID0gZnVuY3Rpb24gKCl7XG4gIGZ1bmN0aW9uIFdyaXRlciAoKSB7IHRoaXMuY2h1bmsgPSBbXTsgfVxuICBXcml0ZXIucHJvdG90eXBlID0ge1xuICAgIGNodW5rX2lkeDoyMCwgYmxvY2tfbGVuOjAsIG9ial9jb3VudGVyOjAsIHNpemVfMzI6MCwgc2l6ZV82NDowLFxuICAgIHdyaXRlOmZ1bmN0aW9uIChzaXplLCB2YWx1ZSkge1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4O2kgPj0gMDtpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSAodmFsdWUgPj4gaSkgJiAweEZGO1xuICAgIH0sXG4gICAgd3JpdGVfYXQ6ZnVuY3Rpb24gKHBvcywgc2l6ZSwgdmFsdWUpIHtcbiAgICAgIHZhciBwb3MgPSBwb3M7XG4gICAgICBmb3IgKHZhciBpID0gc2l6ZSAtIDg7aSA+PSAwO2kgLT0gOClcbiAgICAgICAgdGhpcy5jaHVua1twb3MrK10gPSAodmFsdWUgPj4gaSkgJiAweEZGO1xuICAgIH0sXG4gICAgd3JpdGVfY29kZTpmdW5jdGlvbiAoc2l6ZSwgY29kZSwgdmFsdWUpIHtcbiAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSBjb2RlO1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4O2kgPj0gMDtpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbdGhpcy5jaHVua19pZHgrK10gPSAodmFsdWUgPj4gaSkgJiAweEZGO1xuICAgIH0sXG4gICAgd3JpdGVfc2hhcmVkOmZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgIGlmIChvZmZzZXQgPCAoMSA8PCA4KSkgdGhpcy53cml0ZV9jb2RlKDgsIDB4MDQgLypjc3QuQ09ERV9TSEFSRUQ4Ki8sIG9mZnNldCk7XG4gICAgICBlbHNlIGlmIChvZmZzZXQgPCAoMSA8PCAxNikpIHRoaXMud3JpdGVfY29kZSgxNiwgMHgwNSAvKmNzdC5DT0RFX1NIQVJFRDE2Ki8sIG9mZnNldCk7XG4gICAgICBlbHNlIHRoaXMud3JpdGVfY29kZSgzMiwgMHgwNiAvKmNzdC5DT0RFX1NIQVJFRDMyKi8sIG9mZnNldCk7XG4gICAgfSxcbiAgICBwb3M6ZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5jaHVua19pZHggfSxcbiAgICBmaW5hbGl6ZTpmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmJsb2NrX2xlbiA9IHRoaXMuY2h1bmtfaWR4IC0gMjA7XG4gICAgICB0aGlzLmNodW5rX2lkeCA9IDA7XG4gICAgICB0aGlzLndyaXRlICgzMiwgMHg4NDk1QTZCRSk7XG4gICAgICB0aGlzLndyaXRlICgzMiwgdGhpcy5ibG9ja19sZW4pO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMub2JqX2NvdW50ZXIpO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMuc2l6ZV8zMik7XG4gICAgICB0aGlzLndyaXRlICgzMiwgdGhpcy5zaXplXzY0KTtcbiAgICAgIHJldHVybiB0aGlzLmNodW5rO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKHYsIGZsYWdzKSB7XG4gICAgZmxhZ3MgPSBjYW1sX2xpc3RfdG9fanNfYXJyYXkoZmxhZ3MpO1xuXG4gICAgdmFyIG5vX3NoYXJpbmcgPSAoZmxhZ3MuaW5kZXhPZigwIC8qTWFyc2hhbC5Ob19zaGFyaW5nKi8pICE9PSAtMSksXG4gICAgICAgIGNsb3N1cmVzID0gIChmbGFncy5pbmRleE9mKDEgLypNYXJzaGFsLkNsb3N1cmVzKi8pICE9PSAtMSk7XG4gICAgLyogTWFyc2hhbC5Db21wYXRfMzIgaXMgcmVkdW5kYW50IHNpbmNlIGludGVnZXJzIGFyZSAzMi1iaXQgYW55d2F5ICovXG5cbiAgICBpZiAoY2xvc3VyZXMpXG4gICAgICBjb25zb2xlLndhcm4oXCJpbiBjYW1sX291dHB1dF92YWw6IGZsYWcgTWFyc2hhbC5DbG9zdXJlcyBpcyBub3Qgc3VwcG9ydGVkLlwiKTtcblxuICAgIHZhciB3cml0ZXIgPSBuZXcgV3JpdGVyICgpO1xuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIHZhciBpbnRlcm5fb2JqX3RhYmxlID0gbm9fc2hhcmluZyA/IG51bGwgOiBuZXcgTWxPYmplY3RUYWJsZSgpO1xuXG4gICAgZnVuY3Rpb24gbWVtbyh2KSB7XG4gICAgICBpZiAobm9fc2hhcmluZykgcmV0dXJuIGZhbHNlO1xuICAgICAgdmFyIGV4aXN0aW5nX29mZnNldCA9IGludGVybl9vYmpfdGFibGUucmVjYWxsKHYpO1xuICAgICAgaWYgKGV4aXN0aW5nX29mZnNldCkgeyB3cml0ZXIud3JpdGVfc2hhcmVkKGV4aXN0aW5nX29mZnNldCk7IHJldHVybiB0cnVlOyB9XG4gICAgICBlbHNlIHsgaW50ZXJuX29ial90YWJsZS5zdG9yZSh2KTsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXh0ZXJuX3JlYyAodikge1xuICAgICAgaWYgKHYuY2FtbF9jdXN0b20pIHtcbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIG5hbWUgPSB2LmNhbWxfY3VzdG9tO1xuICAgICAgICB2YXIgb3BzID0gY2FtbF9jdXN0b21fb3BzW25hbWVdO1xuICAgICAgICB2YXIgc3pfMzJfNjQgPSBbMCwwXTtcbiAgICAgICAgaWYoIW9wcy5zZXJpYWxpemUpXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwib3V0cHV0X3ZhbHVlOiBhYnN0cmFjdCB2YWx1ZSAoQ3VzdG9tKVwiKTtcbiAgICAgICAgaWYob3BzLmZpeGVkX2xlbmd0aCA9PSB1bmRlZmluZWQpe1xuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgxOCAvKmNzdC5DT0RFX0NVU1RPTV9MRU4qLyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgaGVhZGVyX3BvcyA9IHdyaXRlci5wb3MgKCk7XG4gICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcywgMzIsIHN6XzMyXzY0WzBdKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDQsIDMyLCAwKTsgLy8gemVyb1xuICAgICAgICAgIHdyaXRlci53cml0ZV9hdChoZWFkZXJfcG9zICsgOCwgMzIsIHN6XzMyXzY0WzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MTkgLypjc3QuQ09ERV9DVVNUT01fRklYRUQqLyk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBuYW1lLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgICAgIHdyaXRlci53cml0ZSg4LCAwKTtcbiAgICAgICAgICB2YXIgb2xkX3BvcyA9IHdyaXRlci5wb3MoKTtcbiAgICAgICAgICBvcHMuc2VyaWFsaXplKHdyaXRlciwgdiwgc3pfMzJfNjQpO1xuICAgICAgICAgIGlmIChvcHMuZml4ZWRfbGVuZ3RoICE9IHdyaXRlci5wb3MoKSAtIG9sZF9wb3MpXG4gICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBpbmNvcnJlY3QgZml4ZWQgc2l6ZXMgc3BlY2lmaWVkIGJ5IFwiICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLnNpemVfMzIgKz0gMiArICgoc3pfMzJfNjRbMF0gKyAzKSA+PiAyKTtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gMiArICgoc3pfMzJfNjRbMV0gKyA3KSA+PiAzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBBcnJheSAmJiB2WzBdID09PSAodlswXXwwKSkge1xuICAgICAgICBpZiAodlswXSA9PSAyNTEpIHtcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBhYnN0cmFjdCB2YWx1ZSAoQWJzdHJhY3QpXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodlswXSkpXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwib3V0cHV0X3ZhbHVlOiBjb250aW51YXRpb24gdmFsdWVcIik7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEgJiYgbWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICBpZiAodlswXSA8IDE2ICYmIHYubGVuZ3RoIC0gMSA8IDgpXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDgwIC8qY3N0LlBSRUZJWF9TTUFMTF9CTE9DSyovICsgdlswXSArICgodi5sZW5ndGggLSAxKTw8NCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDggLypjc3QuQ09ERV9CTE9DSzMyKi8sICgodi5sZW5ndGgtMSkgPDwgMTApIHwgdlswXSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IHYubGVuZ3RoO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSB2Lmxlbmd0aDtcbiAgICAgICAgaWYgKHYubGVuZ3RoID4gMSkgc3RhY2sucHVzaCAodiwgMSk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgICAgaWYoIShjYW1sX2lzX21sX2J5dGVzKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIikpKSkge1xuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IFtCeXRlcy50XSBjYW5ub3Qgc2FmZWx5IGJlIG1hcnNoYWxlZCB3aXRoIFstLWVuYWJsZSB1c2UtanMtc3RyaW5nXVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVtbyh2KSkgcmV0dXJuO1xuICAgICAgICB2YXIgbGVuID0gY2FtbF9tbF9ieXRlc19sZW5ndGgodik7XG4gICAgICAgIGlmIChsZW4gPCAweDIwKVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgyMCAvKmNzdC5QUkVGSVhfU01BTExfU1RSSU5HKi8gKyBsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPCAweDEwMClcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoOCwgMHgwOS8qY3N0LkNPREVfU1RSSU5HOCovLCBsZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUgKDMyLCAweDBBIC8qY3N0LkNPREVfU1RSSU5HMzIqLywgbGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGxlbjtpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQodixpKSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDEgKyAoKChsZW4gKyA0KSAvIDQpfDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KXwwKTtcbiAgICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcodikpIHtcbiAgICAgICAgdmFyIGxlbiA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCh2KTtcbiAgICAgICAgaWYgKGxlbiA8IDB4MjApXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDIwIC8qY3N0LlBSRUZJWF9TTUFMTF9TVFJJTkcqLyArIGxlbik7XG4gICAgICAgIGVsc2UgaWYgKGxlbiA8IDB4MTAwKVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlICg4LCAweDA5Lypjc3QuQ09ERV9TVFJJTkc4Ki8sIGxlbik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoMzIsIDB4MEEgLypjc3QuQ09ERV9TVFJJTkczMiovLCBsZW4pO1xuICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgbGVuO2krKylcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQodixpKSk7XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDEgKyAoKChsZW4gKyA0KSAvIDQpfDApO1xuICAgICAgICB3cml0ZXIuc2l6ZV82NCArPSAxICsgKCgobGVuICsgOCkgLyA4KXwwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2ICE9ICh2fDApKXtcbiAgICAgICAgICB2YXIgdHlwZV9vZl92ID0gdHlwZW9mIHY7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZiBhIGZsb2F0IGhhcHBlbnMgdG8gYmUgYW4gaW50ZWdlciBpdCBpcyBzZXJpYWxpemVkIGFzIGFuIGludGVnZXJcbiAgICAgICAgICAvLyAoSnNfb2Zfb2NhbWwgY2Fubm90IHRlbGwgd2hldGhlciB0aGUgdHlwZSBvZiBhbiBpbnRlZ2VyIG51bWJlciBpc1xuICAgICAgICAgIC8vIGZsb2F0IG9yIGludGVnZXIuKSBUaGlzIGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBjcmFzaGVzIHdoZW5cbiAgICAgICAgICAvLyB1bm1hcnNoYWxsaW5nIHVzaW5nIHRoZSBzdGFuZGFyZCBydW50aW1lLiBJdCBzZWVtcyBiZXR0ZXIgdG9cbiAgICAgICAgICAvLyBzeXN0ZW1hdGljYWxseSBmYWlsIG9uIG1hcnNoYWxsaW5nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gICAgICAgICAgaWYodHlwZV9vZl92ICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKFwiK3R5cGVfb2ZfditcIilcIik7XG4gICAgICAgICAgLy8gICAgICAgICAgdmFyIHQgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCh2KSk7XG4gICAgICAgICAgLy8gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDBCIC8qY3N0LkNPREVfRE9VQkxFX0JJRyovKTtcbiAgICAgICAgICAvLyAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpPDg7IGkrKyl7d3JpdGVyLndyaXRlKDgsdFtpXSl9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA+PSAwICYmIHYgPCAweDQwKSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAwWDQwIC8qY3N0LlBSRUZJWF9TTUFMTF9JTlQqLyArIHYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2ID49IC0oMSA8PCA3KSAmJiB2IDwgKDEgPDwgNykpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSg4LCAweDAwIC8qY3N0LkNPREVfSU5UOCovLCB2KTtcbiAgICAgICAgICBlbHNlIGlmICh2ID49IC0oMSA8PCAxNSkgJiYgdiA8ICgxIDw8IDE1KSlcbiAgICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDE2LCAweDAxIC8qY3N0LkNPREVfSU5UMTYqLywgdik7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoMzIsIDB4MDIgLypjc3QuQ09ERV9JTlQzMiovLCB2KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBleHRlcm5fcmVjICh2KTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGkgPSBzdGFjay5wb3AgKCk7XG4gICAgICB2YXIgdiA9IHN0YWNrLnBvcCAoKTtcbiAgICAgIGlmIChpICsgMSA8IHYubGVuZ3RoKSBzdGFjay5wdXNoICh2LCBpICsgMSk7XG4gICAgICBleHRlcm5fcmVjICh2W2ldKTtcbiAgICB9XG4gICAgaWYgKGludGVybl9vYmpfdGFibGUpIHdyaXRlci5vYmpfY291bnRlciA9IGludGVybl9vYmpfdGFibGUub2Jqcy5sZW5ndGg7XG4gICAgd3JpdGVyLmZpbmFsaXplKCk7XG4gICAgcmV0dXJuIHdyaXRlci5jaHVuaztcbiAgfVxufSAoKTtcblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyAodiwgZmxhZ3MpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5IChjYW1sX291dHB1dF92YWwgKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9ieXRlc19vZl9hcnJheVxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnl0ZXMgKHYsIGZsYWdzKSB7XG4gIHJldHVybiBjYW1sX2J5dGVzX29mX2FycmF5IChjYW1sX291dHB1dF92YWwgKHYsIGZsYWdzKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9vdXRwdXRfdmFsLCBjYW1sX2ZhaWx3aXRoLCBjYW1sX2JsaXRfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlciAocywgb2ZzLCBsZW4sIHYsIGZsYWdzKSB7XG4gIHZhciB0ID0gY2FtbF9vdXRwdXRfdmFsICh2LCBmbGFncyk7XG4gIGlmICh0Lmxlbmd0aCA+IGxlbikgY2FtbF9mYWlsd2l0aCAoXCJNYXJzaGFsLnRvX2J1ZmZlcjogYnVmZmVyIG92ZXJmbG93XCIpO1xuICBjYW1sX2JsaXRfYnl0ZXModCwgMCwgcywgb2ZzLCB0Lmxlbmd0aCk7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmRcbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBJb1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19mZHNcbnZhciBjYW1sX3N5c19mZHMgPSBuZXcgQXJyYXkoMyk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2Nsb3NlXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19mZHNcbmZ1bmN0aW9uIGNhbWxfc3lzX2Nsb3NlKGZkKSB7XG4gIHZhciBmaWxlID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYoZmlsZSkgZmlsZS5jbG9zZSgpO1xuICBkZWxldGUgY2FtbF9zeXNfZmRzW2ZkXTtcbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfb3BlblxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IE1sRmFrZUZkX291dFxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2Vcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5faW50ZXJuYWwoZmlsZSxpZHgpIHtcbiAgaWYoaWR4ID09IHVuZGVmaW5lZCl7XG4gICAgaWR4ID0gY2FtbF9zeXNfZmRzLmxlbmd0aDtcbiAgfVxuICBjYW1sX3N5c19mZHNbaWR4XSA9IGZpbGU7XG4gIHJldHVybiBpZHggfCAwO1xufVxuZnVuY3Rpb24gY2FtbF9zeXNfb3BlbiAobmFtZSwgZmxhZ3MsIF9wZXJtcykge1xuICB2YXIgZiA9IHt9O1xuICB3aGlsZShmbGFncyl7XG4gICAgc3dpdGNoKGZsYWdzWzFdKXtcbiAgICBjYXNlIDA6IGYucmRvbmx5ID0gMTticmVhaztcbiAgICBjYXNlIDE6IGYud3Jvbmx5ID0gMTticmVhaztcbiAgICBjYXNlIDI6IGYuYXBwZW5kID0gMTticmVhaztcbiAgICBjYXNlIDM6IGYuY3JlYXRlID0gMTticmVhaztcbiAgICBjYXNlIDQ6IGYudHJ1bmNhdGUgPSAxO2JyZWFrO1xuICAgIGNhc2UgNTogZi5leGNsID0gMTsgYnJlYWs7XG4gICAgY2FzZSA2OiBmLmJpbmFyeSA9IDE7YnJlYWs7XG4gICAgY2FzZSA3OiBmLnRleHQgPSAxO2JyZWFrO1xuICAgIGNhc2UgODogZi5ub25ibG9jayA9IDE7YnJlYWs7XG4gICAgfVxuICAgIGZsYWdzPWZsYWdzWzJdO1xuICB9XG4gIGlmKGYucmRvbmx5ICYmIGYud3Jvbmx5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGNhbWxfanNieXRlc19vZl9zdHJpbmcobmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fcmRvbmx5IGFuZCBPcGVuX3dyb25seSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIGlmKGYudGV4dCAmJiBmLmJpbmFyeSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3RleHQgYW5kIE9wZW5fYmluYXJ5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGZpbGUgPSByb290LmRldmljZS5vcGVuKHJvb3QucmVzdCxmKTtcbiAgcmV0dXJuIGNhbWxfc3lzX29wZW5faW50ZXJuYWwgKGZpbGUsIHVuZGVmaW5lZCk7XG59XG4oZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBmaWxlKGZkLCBmbGFncykge1xuICAgIGlmKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVybiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlKGZkLCBmbGFncyk7XG4gICAgfVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBuZXcgTWxGYWtlRmRfb3V0KGZkLCBmbGFncylcbiAgfVxuICBjYW1sX3N5c19vcGVuX2ludGVybmFsKGZpbGUoMCx7cmRvbmx5OjEsYWx0bmFtZTpcIi9kZXYvc3RkaW5cIixpc0NoYXJhY3RlckRldmljZTp0cnVlfSksIDApO1xuICBjYW1sX3N5c19vcGVuX2ludGVybmFsKGZpbGUoMSx7YnVmZmVyZWQ6Mix3cm9ubHk6MSxpc0NoYXJhY3RlckRldmljZTp0cnVlfSksIDEpO1xuICBjYW1sX3N5c19vcGVuX2ludGVybmFsKGZpbGUoMix7YnVmZmVyZWQ6Mix3cm9ubHk6MSxpc0NoYXJhY3RlckRldmljZTp0cnVlfSksIDIpO1xufSkoKVxuXG5cbi8vIG9jYW1sIENoYW5uZWxzXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZXRfY2hhbm5lbF9uYW1lKGNoYW5pZCwgbmFtZSkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2hhbi5uYW1lID0gbmFtZTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbHNcbnZhciBjYW1sX21sX2NoYW5uZWxzID0gbmV3IEFycmF5KCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3Rcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0X2NoYW5uZWxzX2xpc3QgKCkge1xuICB2YXIgbCA9IDA7XG4gIGZvcih2YXIgYyA9IDA7IGMgPCBjYW1sX21sX2NoYW5uZWxzLmxlbmd0aDsgYysrKXtcbiAgICBpZihjYW1sX21sX2NoYW5uZWxzW2NdICYmIGNhbWxfbWxfY2hhbm5lbHNbY10ub3BlbmVkICYmIGNhbWxfbWxfY2hhbm5lbHNbY10ub3V0KVxuICAgICAgbD1bMCxjYW1sX21sX2NoYW5uZWxzW2NdLmZkLGxdO1xuICB9XG4gIHJldHVybiBsO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvclxuLy9SZXF1aXJlczogY2FtbF9zeXNfb3BlblxuZnVuY3Rpb24gY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0IChmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmKGZpbGUuZmxhZ3MucmRvbmx5KSBjYW1sX3JhaXNlX3N5c19lcnJvcihcImZkIFwiKyBmZCArIFwiIGlzIHJlYWRvbmx5XCIpO1xuICB2YXIgYnVmZmVyZWQgPSAoZmlsZS5mbGFncy5idWZmZXJlZCAhPT0gdW5kZWZpbmVkKSA/IGZpbGUuZmxhZ3MuYnVmZmVyZWQgOiAxO1xuICB2YXIgY2hhbm5lbCA9IHtcbiAgICBmaWxlOmZpbGUsXG4gICAgb2Zmc2V0OmZpbGUuZmxhZ3MuYXBwZW5kP2ZpbGUubGVuZ3RoKCk6MCxcbiAgICBmZDpmZCxcbiAgICBvcGVuZWQ6dHJ1ZSxcbiAgICBvdXQ6dHJ1ZSxcbiAgICBidWZmZXJfY3VycjowLFxuICAgIGJ1ZmZlcjpuZXcgVWludDhBcnJheSg2NTUzNiksXG4gICAgYnVmZmVyZWQ6YnVmZmVyZWRcbiAgfTtcbiAgY2FtbF9tbF9jaGFubmVsc1tjaGFubmVsLmZkXT1jaGFubmVsO1xuICByZXR1cm4gY2hhbm5lbC5mZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5cbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX29wZW5cbmZ1bmN0aW9uIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luIChmZCkgIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3N5c19mZHNbZmRdO1xuICBpZihmaWxlLmZsYWdzLndyb25seSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIisgZmQgKyBcIiBpcyB3cml0ZW9ubHlcIik7XG4gIHZhciByZWZpbGwgPSBudWxsO1xuICB2YXIgY2hhbm5lbCA9IHtcbiAgICBmaWxlOmZpbGUsXG4gICAgb2Zmc2V0OmZpbGUuZmxhZ3MuYXBwZW5kP2ZpbGUubGVuZ3RoKCk6MCxcbiAgICBmZDpmZCxcbiAgICBvcGVuZWQ6dHJ1ZSxcbiAgICBvdXQ6IGZhbHNlLFxuICAgIGJ1ZmZlcl9jdXJyOjAsXG4gICAgYnVmZmVyX21heDowLFxuICAgIGJ1ZmZlcjpuZXcgVWludDhBcnJheSg2NTUzNiksXG4gICAgcmVmaWxsOnJlZmlsbFxuICB9O1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5uZWwuZmRdPWNoYW5uZWw7XG4gIHJldHVybiBjaGFubmVsLmZkO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY2hhbm5lbF9kZXNjcmlwdG9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG4vL0FsaWFzOiB3aW5fZmlsZWRlc2NyX29mX2NoYW5uZWxcbmZ1bmN0aW9uIGNhbWxfY2hhbm5lbF9kZXNjcmlwdG9yKGNoYW5pZCl7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICByZXR1cm4gY2hhbi5mZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfYmluYXJ5X21vZGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlKGNoYW5pZCxtb2RlKXtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNoYW4uZmlsZS5mbGFncy50ZXh0ID0gIW1vZGVcbiAgY2hhbi5maWxlLmZsYWdzLmJpbmFyeSA9IG1vZGVcbiAgcmV0dXJuIDA7XG59XG5cbi8vSW5wdXQgZnJvbSBpbl9jaGFubmVsXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2xvc2VfY2hhbm5lbFxuLy9SZXF1aXJlczogY2FtbF9tbF9mbHVzaCwgY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9zeXNfY2xvc2VcbmZ1bmN0aW9uIGNhbWxfbWxfY2xvc2VfY2hhbm5lbCAoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBjaGFuLm9wZW5lZCA9IGZhbHNlO1xuICBjYW1sX3N5c19jbG9zZShjaGFuLmZkKVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsX3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9zaXplKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNoYW4uZmlsZS5sZW5ndGgoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQsY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9jaGFubmVsX3NpemVfNjQoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9mbG9hdChjaGFuLmZpbGUubGVuZ3RoICgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0KGNoYW5pZCxmKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBjaGFuLm91dHB1dCA9IChmdW5jdGlvbiAocykge2Yocyl9KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbChjaGFuaWQsZikge1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF0ucmVmaWxsID0gZjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVmaWxsXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3JlZmlsbCAoY2hhbikge1xuICBpZihjaGFuLnJlZmlsbCAhPSBudWxsKXtcbiAgICB2YXIgc3RyID0gY2hhbi5yZWZpbGwoKTtcbiAgICB2YXIgc3RyX2EgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhzdHIpO1xuICAgIGlmIChzdHJfYS5sZW5ndGggPT0gMCkge1xuICAgICAgY2hhbi5yZWZpbGwgPSBudWxsXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYoY2hhbi5idWZmZXIubGVuZ3RoIDwgY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKXtcbiAgICAgICAgdmFyIGIgPSBuZXcgVWludDhBcnJheShjaGFuLmJ1ZmZlcl9tYXggKyBzdHJfYS5sZW5ndGgpO1xuICAgICAgICBiLnNldChjaGFuLmJ1ZmZlcik7XG4gICAgICAgIGNoYW4uYnVmZmVyID0gYjtcbiAgICAgIH1cbiAgICAgIGNoYW4uYnVmZmVyLnNldChzdHJfYSxjaGFuLmJ1ZmZlcl9tYXgpO1xuICAgICAgY2hhbi5vZmZzZXQgKz0gc3RyX2EubGVuZ3RoO1xuICAgICAgY2hhbi5idWZmZXJfbWF4ICs9IHN0cl9hLmxlbmd0aDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5yZWFkID0gY2hhbi5maWxlLnJlYWQoY2hhbi5vZmZzZXQsIGNoYW4uYnVmZmVyLCBjaGFuLmJ1ZmZlcl9tYXgsIGNoYW4uYnVmZmVyLmxlbmd0aCAtIGNoYW4uYnVmZmVyX21heCk7XG4gICAgY2hhbi5vZmZzZXQgKz0gbnJlYWQ7XG4gICAgY2hhbi5idWZmZXJfbWF4ICs9IG5yZWFkO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXQgKGNoYW5pZCwgYiwgaSwgbCkge1xuICB2YXIgYmEgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGIpO1xuICByZXR1cm4gY2FtbF9tbF9pbnB1dF9ibG9jayhjaGFuaWQsIGJhLCBpLCBsKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX3JlZmlsbCwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9ibG9jayAoY2hhbmlkLCBiYSwgaSwgbCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIG4gPSBsO1xuICB2YXIgYXZhaWwgPSBjaGFuLmJ1ZmZlcl9tYXggLSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICBpZihsIDw9IGF2YWlsKSB7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsY2hhbi5idWZmZXJfY3VyciArIGwpLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGw7XG4gIH1cbiAgZWxzZSBpZihhdmFpbCA+IDApIHtcbiAgICBiYS5zZXQoY2hhbi5idWZmZXIuc3ViYXJyYXkoY2hhbi5idWZmZXJfY3VycixjaGFuLmJ1ZmZlcl9jdXJyICsgYXZhaWwpLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGF2YWlsO1xuICAgIG4gPSBhdmFpbDtcbiAgfSBlbHNlIHtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICAgIGNhbWxfcmVmaWxsKGNoYW4pO1xuICAgIHZhciBhdmFpbCA9IGNoYW4uYnVmZmVyX21heCAtIGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgaWYobiA+IGF2YWlsKSBuID0gYXZhaWw7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsY2hhbi5idWZmZXJfY3VyciArIG4pLCBpKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IG47XG4gIH1cbiAgcmV0dXJuIG4gfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX21hcnNoYWxfZGF0YV9zaXplLCBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMsIGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX2J5dGVzX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3JlZmlsbCwgY2FtbF9mYWlsd2l0aCwgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlIChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHZhciBoZWFkZXIgPSBuZXcgVWludDhBcnJheShjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBmdW5jdGlvbiBibG9jayhidWZmZXIsIG9mZnNldCwgbikge1xuICAgIHZhciByID0gMDtcbiAgICB3aGlsZShyIDwgbil7XG4gICAgICBpZihjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCl7XG4gICAgICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICAgICAgICBjYW1sX3JlZmlsbChjaGFuKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heClcbiAgICAgICAgYnJlYWs7XG4gICAgICBidWZmZXJbb2Zmc2V0K3JdID0gY2hhbi5idWZmZXJbY2hhbi5idWZmZXJfY3Vycl07XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyKys7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHZhciByID0gYmxvY2soaGVhZGVyLCAwLCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBpZihyID09IDApXG4gICAgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICBlbHNlIGlmIChyIDwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdFwiKTtcbiAgdmFyIGxlbiA9IGNhbWxfbWFyc2hhbF9kYXRhX3NpemUgKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoaGVhZGVyKSwgMCk7XG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW4gKyBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUpO1xuICBidWYuc2V0KGhlYWRlciwwKTtcbiAgdmFyIHIgPSBibG9jayhidWYsIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSwgbGVuKVxuICBpZihyIDwgbGVuKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdHJ1bmNhdGVkIG9iamVjdCBcIiArIHIgKyBcIiAgXCIgKyBsZW4pO1xuICB2YXIgb2Zmc2V0ID0gWzBdO1xuICB2YXIgcmVzID0gY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoYnVmKSwgb2Zmc2V0KTtcbiAgY2hhbi5vZmZzZXQgPSBjaGFuLm9mZnNldCArIG9mZnNldFswXTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZV90b19vdXRzaWRlX2hlYXBcbi8vUmVxdWlyZXM6IGNhbWxfaW5wdXRfdmFsdWVcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwKGMpIHtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWUoYyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9yZWZpbGxcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfY2hhciAoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBpZihjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyX21heCl7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICBjYW1sX3JlZmlsbChjaGFuKTtcbiAgfVxuICBpZiAoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpXG4gICAgY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSgpO1xuICB2YXIgcmVzID0gY2hhbi5idWZmZXJbY2hhbi5idWZmZXJfY3Vycl07XG4gIGNoYW4uYnVmZmVyX2N1cnIrKztcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfaW5wdXRfY2hhciwgY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pbnB1dF9pbnQgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIHJlcyA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA0OyBpKyspe1xuICAgIHJlcyA9IChyZXMgPDwgOCkgKyBjYW1sX21sX2lucHV0X2NoYXIoY2hhbmlkKSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcyB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2Vla19pblxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfc2Vla19pbihjaGFuaWQsIHBvcykge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYgKGNoYW4ucmVmaWxsICE9IG51bGwpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiSWxsZWdhbCBzZWVrXCIpO1xuICBpZihwb3MgPj0gY2hhbi5vZmZzZXQgLSBjaGFuLmJ1ZmZlcl9tYXhcbiAgICAgJiYgcG9zIDw9IGNoYW4ub2Zmc2V0XG4gICAgICYmIGNoYW4uZmlsZS5mbGFncy5iaW5hcnkpIHtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gY2hhbi5idWZmZXJfbWF4IC0gKGNoYW4ub2Zmc2V0IC0gcG9zKTtcbiAgfSBlbHNlIHtcbiAgICBjaGFuLm9mZnNldCA9IHBvcztcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICBjaGFuLmJ1ZmZlcl9tYXggPSAwO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luKGNoYW5pZCxwb3Mpe1xuICByZXR1cm4gY2FtbF9zZWVrX2luKGNoYW5pZCxwb3MpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfaW5fNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19pblxuZnVuY3Rpb24gY2FtbF9tbF9zZWVrX2luXzY0KGNoYW5pZCxwb3Mpe1xuICB2YXIgcG9zID0gY2FtbF9pbnQ2NF90b19mbG9hdChwb3MpO1xuICByZXR1cm4gY2FtbF9zZWVrX2luKGNoYW5pZCwgcG9zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3NfaW5cbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfcG9zX2luKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNoYW4ub2Zmc2V0IC0gKGNoYW4uYnVmZmVyX21heCAtIGNoYW4uYnVmZmVyX2N1cnIpIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3NfaW5cbi8vUmVxdWlyZXM6IGNhbWxfcG9zX2luXG5mdW5jdGlvbiBjYW1sX21sX3Bvc19pbihjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfcG9zX2luKGNoYW5pZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2Zsb2F0LCBjYW1sX3Bvc19pblxuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW5fNjQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0KGNhbWxfcG9zX2luKGNoYW5pZCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X3NjYW5fbGluZVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9yZWZpbGxcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lKGNoYW5pZCl7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICB2YXIgcCA9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGRvIHtcbiAgICBpZihwID49IGNoYW4uYnVmZmVyX21heCkge1xuICAgICAgaWYoY2hhbi5idWZmZXJfY3VyciA+IDApIHtcbiAgICAgICAgY2hhbi5idWZmZXIuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIpLDApO1xuICAgICAgICBwIC09IGNoYW4uYnVmZmVyX2N1cnI7XG4gICAgICAgIGNoYW4uYnVmZmVyX21heCAtPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKGNoYW4uYnVmZmVyX21heCA+PSBjaGFuLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0oY2hhbi5idWZmZXJfbWF4KSB8IDA7XG4gICAgICB9XG4gICAgICB2YXIgcHJldl9tYXggPSBjaGFuLmJ1ZmZlcl9tYXg7XG4gICAgICBjYW1sX3JlZmlsbCAoY2hhbik7XG4gICAgICBpZihwcmV2X21heCA9PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgICAgcmV0dXJuIC0oY2hhbi5idWZmZXJfbWF4KSB8IDA7XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlIChjaGFuLmJ1ZmZlcltwKytdICE9IDEwKTtcbiAgcmV0dXJuIChwIC0gY2hhbi5idWZmZXJfY3VycikgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2ZsdXNoXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9tbF9jaGFubmVsc1xuLy9SZXF1aXJlczogY2FtbF9zdWJhcnJheV90b19qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2ZsdXNoIChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGlmKCEgY2hhbi5vcGVuZWQpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiQ2Fubm90IGZsdXNoIGEgY2xvc2VkIGNoYW5uZWxcIik7XG4gIGlmKCFjaGFuLmJ1ZmZlciB8fCBjaGFuLmJ1ZmZlcl9jdXJyID09IDApIHJldHVybiAwO1xuICBpZihjaGFuLm91dHB1dCkge1xuICAgIGNoYW4ub3V0cHV0KGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhjaGFuLmJ1ZmZlciwgMCwgY2hhbi5idWZmZXJfY3VycikpO1xuICB9IGVsc2Uge1xuICAgIGNoYW4uZmlsZS53cml0ZShjaGFuLm9mZnNldCwgY2hhbi5idWZmZXIsIDAsIGNoYW4uYnVmZmVyX2N1cnIpO1xuICB9XG4gIGNoYW4ub2Zmc2V0ICs9IGNoYW4uYnVmZmVyX2N1cnI7XG4gIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9vdXRwdXQgdG8gb3V0X2NoYW5uZWxcblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsY2FtbF9tbF9ieXRlc19sZW5ndGhcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N0cmluZ19vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfYnl0ZXMoY2hhbmlkLGJ1ZmZlcixvZmZzZXQsbGVuKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBpZighIGNoYW4ub3BlbmVkKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIkNhbm5vdCBvdXRwdXQgdG8gYSBjbG9zZWQgY2hhbm5lbFwiKTtcbiAgdmFyIGJ1ZmZlciA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoYnVmZmVyKTtcbiAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuKTtcbiAgaWYoY2hhbi5idWZmZXJfY3VyciArIGJ1ZmZlci5sZW5ndGggPiBjaGFuLmJ1ZmZlci5sZW5ndGgpIHtcbiAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KGNoYW4uYnVmZmVyX2N1cnIgKyBidWZmZXIubGVuZ3RoKTtcbiAgICBiLnNldChjaGFuLmJ1ZmZlcik7XG4gICAgY2hhbi5idWZmZXIgPSBiXG4gIH1cbiAgc3dpdGNoKGNoYW4uYnVmZmVyZWQpe1xuICBjYXNlIDA6IC8vIFVuYnVmZmVyZWRcbiAgICBjaGFuLmJ1ZmZlci5zZXQoYnVmZmVyLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgY2FtbF9tbF9mbHVzaCAoY2hhbmlkKTtcbiAgICBicmVha1xuICBjYXNlIDE6IC8vIEJ1ZmZlcmVkICh0aGUgZGVmYXVsdClcbiAgICBjaGFuLmJ1ZmZlci5zZXQoYnVmZmVyLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlci5sZW5ndGgpXG4gICAgICBjYW1sX21sX2ZsdXNoIChjaGFuaWQpO1xuICAgIGJyZWFrO1xuICBjYXNlIDI6IC8vIEJ1ZmZlcmVkIChvbmx5IGZvciBzdGRvdXQgYW5kIHN0ZGVycilcbiAgICB2YXIgaWQgPSBidWZmZXIubGFzdEluZGV4T2YoMTApXG4gICAgaWYoaWQgPCAwKSB7XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoYnVmZmVyLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYnVmZmVyLmxlbmd0aDtcbiAgICAgIGlmKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXIubGVuZ3RoKVxuICAgICAgICBjYW1sX21sX2ZsdXNoIChjaGFuaWQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNoYW4uYnVmZmVyLnNldChidWZmZXIuc3ViYXJyYXkoMCwgaWQgKyAxKSwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGlkICsgMTtcbiAgICAgIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCk7XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoYnVmZmVyLnN1YmFycmF5KGlkICsgMSksIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoIC0gaWQgLSAxO1xuICAgIH1cbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfb3V0cHV0X2J5dGVzLCBjYW1sX2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXQoY2hhbmlkLGJ1ZmZlcixvZmZzZXQsbGVuKXtcbiAgcmV0dXJuIGNhbWxfbWxfb3V0cHV0X2J5dGVzKGNoYW5pZCxjYW1sX2J5dGVzX29mX3N0cmluZyhidWZmZXIpLG9mZnNldCxsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dHB1dF9jaGFyXG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9vdXRwdXRfY2hhciAoY2hhbmlkLGMpIHtcbiAgdmFyIHMgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICBjYW1sX21sX291dHB1dChjaGFuaWQscywwLDEpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vdXRwdXRfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZywgY2FtbF9tbF9vdXRwdXQsY2FtbF9tbF9zdHJpbmdfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX291dHB1dF92YWx1ZSAoY2hhbmlkLHYsZmxhZ3MpIHtcbiAgdmFyIHMgPSBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcodiwgZmxhZ3MpO1xuICBjYW1sX21sX291dHB1dChjaGFuaWQscywwLGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSk7XG4gIHJldHVybiAwO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc2Vla19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfbWxfZmx1c2hcbmZ1bmN0aW9uIGNhbWxfc2Vla19vdXQoY2hhbmlkLCBwb3Mpe1xuICBjYW1sX21sX2ZsdXNoKGNoYW5pZCk7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBjaGFuLm9mZnNldCA9IHBvcztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfc2Vla19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19vdXQoY2hhbmlkLHBvcyl7XG4gIHJldHVybiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2Vla19vdXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQsIGNhbWxfc2Vla19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19vdXRfNjQoY2hhbmlkLHBvcyl7XG4gIHZhciBwb3MgPSBjYW1sX2ludDY0X3RvX2Zsb2F0KHBvcyk7XG4gIHJldHVybiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3Nfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX21sX2ZsdXNoXG5mdW5jdGlvbiBjYW1sX3Bvc19vdXQoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICByZXR1cm4gY2hhbi5vZmZzZXQgKyBjaGFuLmJ1ZmZlcl9jdXJyXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dFxuLy9SZXF1aXJlczogY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19vdXQoY2hhbmlkKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9wb3Nfb3V0XzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2Zsb2F0LCBjYW1sX3Bvc19vdXRcbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX291dF82NChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQgKGNhbWxfcG9zX291dChjaGFuaWQpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2ludCAoY2hhbmlkLGkpIHtcbiAgdmFyIGFyciA9IFsoaT4+MjQpICYgMHhGRiwoaT4+MTYpICYgMHhGRiwoaT4+OCkgJiAweEZGLGkgJiAweEZGIF07XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfYXJyYXkoYXJyKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLHMsMCw0KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pc19idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9pc19idWZmZXJlZChjaGFuaWQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXS5idWZmZXJlZCA/IDEgOiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2J1ZmZlcmVkXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX21sX2ZsdXNoXG5mdW5jdGlvbiBjYW1sX21sX3NldF9idWZmZXJlZChjaGFuaWQsdikge1xuICBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF0uYnVmZmVyZWQgPSB2O1xuICBpZighdikgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICByZXR1cm4gMFxufVxuIiwiXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWlub3JcbmZ1bmN0aW9uIGNhbWxfZ2NfbWlub3IodW5pdCl7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuZ2ModHJ1ZSk7XG4gIHJldHVybiAwXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX21ham9yKHVuaXQpe1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLmdjKCk7XG4gIHJldHVybiAwXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2Z1bGxfbWFqb3JcbmZ1bmN0aW9uIGNhbWxfZ2NfZnVsbF9tYWpvcih1bml0KXtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5nYygpO1xuICByZXR1cm4gMFxufVxuLy9Qcm92aWRlczogY2FtbF9nY19jb21wYWN0aW9uXG5mdW5jdGlvbiBjYW1sX2djX2NvbXBhY3Rpb24oKXsgcmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2djX2NvdW50ZXJzXG5mdW5jdGlvbiBjYW1sX2djX2NvdW50ZXJzKCkgeyByZXR1cm4gWzI1NCwwLDAsMF0gfVxuLy9Qcm92aWRlczogY2FtbF9nY19xdWlja19zdGF0XG5mdW5jdGlvbiBjYW1sX2djX3F1aWNrX3N0YXQoKXtcbiAgcmV0dXJuIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2djX3N0YXRcbmZ1bmN0aW9uIGNhbWxfZ2Nfc3RhdCgpIHtcbiAgcmV0dXJuIFswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2Nfc2V0XG5mdW5jdGlvbiBjYW1sX2djX3NldChfY29udHJvbCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nY19nZXRcbmZ1bmN0aW9uIGNhbWxfZ2NfZ2V0KCl7XG4gIHJldHVybiBbMCwwLDAsMCwwLDAsMCwwLDBdXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWVtcHJvZl9zZXRcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zZXQoX2NvbnRyb2wpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVnaXN0ZXIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXIgKCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlXG52YXIgYWxsX2ZpbmFsaXplcnMgPSBuZXcgZ2xvYmFsVGhpcy5TZXQoKVxuZnVuY3Rpb24gY2FtbF9maW5hbF9yZWdpc3Rlcl9jYWxsZWRfd2l0aG91dF92YWx1ZSAoY2IsIGEpIHtcbiAgaWYoZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSAmJiBhIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgdmFyIHggPSBuZXcgZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoeCl7YWxsX2ZpbmFsaXplcnMuZGVsZXRlKHgpOyBjYigwKTsgcmV0dXJuO30pO1xuICAgIHgucmVnaXN0ZXIoYSx4KTtcbiAgICBhbGxfZmluYWxpemVycy5hZGQoeCk7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluYWxfcmVsZWFzZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9maW5hbF9yZWxlYXNlICgpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RhcnQocmF0ZSxzdGFja19zaXplLHRyYWNrZXIpe1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tZW1wcm9mX3N0b3BcbmZ1bmN0aW9uIGNhbWxfbWVtcHJvZl9zdG9wKHVuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcmVzdW1lXG5mdW5jdGlvbiBjYW1sX2V2ZW50bG9nX3Jlc3VtZSh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXZlbnRsb2dfcGF1c2VcbmZ1bmN0aW9uIGNhbWxfZXZlbnRsb2dfcGF1c2UodW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX2h1Z2VfZmFsbGJhY2tfY291bnRcbmZ1bmN0aW9uIGNhbWxfZ2NfaHVnZV9mYWxsYmFja19jb3VudCh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfbWFqb3Jfc2xpY2VcbmZ1bmN0aW9uIGNhbWxfZ2NfbWFqb3Jfc2xpY2Uod29yaykgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yX3dvcmRzXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yX3dvcmRzKHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWlub3JfZnJlZVxuZnVuY3Rpb24gY2FtbF9nZXRfbWlub3JfZnJlZSh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X21ham9yX2J1Y2tldFxuZnVuY3Rpb24gY2FtbF9nZXRfbWFqb3JfYnVja2V0KG4pIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfbWFqb3JfY3JlZGl0XG5mdW5jdGlvbiBjYW1sX2dldF9tYWpvcl9jcmVkaXQobikgeyByZXR1cm4gMDsgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uLCBIdWdvIEhldXphcmQsIEFuZHkgUmF5XG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4vL1xuLy8gQmlnYXJyYXkuXG4vL1xuLy8gLSBhbGwgYmlnYXJyYXkgdHlwZXMgaW5jbHVkaW5nIEludDY0IGFuZCBDb21wbGV4LlxuLy8gLSBmb3J0cmFuICsgYyBsYXlvdXRzXG4vLyAtIHN1Yi9zbGljZS9yZXNoYXBlXG4vLyAtIHJldGFpbiBmYXN0IHBhdGggZm9yIDFkIGFycmF5IGFjY2Vzc1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2luaXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfYmFfaW5pdCgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSB7XG4gIHZhciBuX2RpbXMgPSBkaW1zLmxlbmd0aDtcbiAgdmFyIHNpemUgPSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5fZGltczsgaSsrKSB7XG4gICAgaWYgKGRpbXNbaV0gPCAwKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiBuZWdhdGl2ZSBkaW1lbnNpb25cIik7XG4gICAgc2l6ZSA9IHNpemUgKiBkaW1zW2ldO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpe1xuICBzd2l0Y2goa2luZCl7XG4gIGNhc2UgNzogY2FzZSAxMDogY2FzZSAxMTogcmV0dXJuIDI7XG4gIGRlZmF1bHQ6IHJldHVybiAxO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlX2J1ZmZlclxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgc2l6ZSl7XG4gIHZhciB2aWV3O1xuICBzd2l0Y2goa2luZCl7XG4gIGNhc2UgMDogIHZpZXcgPSBGbG9hdDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDE6ICB2aWV3ID0gRmxvYXQ2NEFycmF5OyBicmVhaztcbiAgY2FzZSAyOiAgdmlldyA9IEludDhBcnJheTsgYnJlYWs7XG4gIGNhc2UgMzogIHZpZXcgPSBVaW50OEFycmF5OyBicmVhaztcbiAgY2FzZSA0OiAgdmlldyA9IEludDE2QXJyYXk7IGJyZWFrO1xuICBjYXNlIDU6ICB2aWV3ID0gVWludDE2QXJyYXk7IGJyZWFrO1xuICBjYXNlIDY6ICB2aWV3ID0gSW50MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgNzogIHZpZXcgPSBJbnQzMkFycmF5OyBicmVhaztcbiAgY2FzZSA4OiAgdmlldyA9IEludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDk6ICB2aWV3ID0gSW50MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgMTA6IHZpZXcgPSBGbG9hdDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDExOiB2aWV3ID0gRmxvYXQ2NEFycmF5OyBicmVhaztcbiAgY2FzZSAxMjogdmlldyA9IFVpbnQ4QXJyYXk7IGJyZWFrO1xuICB9XG4gIGlmICghdmlldykgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuY3JlYXRlOiB1bnN1cHBvcnRlZCBraW5kXCIpO1xuICB2YXIgZGF0YSA9IG5ldyB2aWV3KHNpemUgKiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpKTtcbiAgcmV0dXJuIGRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbi8vVmVyc2lvbjogPCA0LjExXG52YXIgY2FtbF9iYV9jdXN0b21fbmFtZSA9IFwiX2JpZ2FycmF5XCJcblxuLy9Qcm92aWRlczogY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9WZXJzaW9uOiA+PSA0LjExXG52YXIgY2FtbF9iYV9jdXN0b21fbmFtZSA9IFwiX2JpZ2FycjAyXCJcblxuLy9Qcm92aWRlczogTWxfQmlnYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jdXN0b21fbmFtZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGksIGNhbWxfaW50NjRfaGkzMiwgY2FtbF9pbnQ2NF9sbzMyXG5mdW5jdGlvbiBNbF9CaWdhcnJheSAoa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcblxuICB0aGlzLmtpbmQgICA9IGtpbmQgO1xuICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgdGhpcy5kaW1zICAgPSBkaW1zO1xuICB0aGlzLmRhdGEgPSBidWZmZXI7XG59XG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5jYW1sX2N1c3RvbSA9IGNhbWxfYmFfY3VzdG9tX25hbWU7XG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHZhciBvZnMgPSAwO1xuICBpZih0eXBlb2YgYXJnID09PSBcIm51bWJlclwiKSBhcmcgPSBbYXJnXTtcbiAgaWYgKCEgKGFyZyBpbnN0YW5jZW9mIEFycmF5KSkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiYmlnYXJyYXkuanM6IGludmFsaWQgb2Zmc2V0XCIpO1xuICBpZiAodGhpcy5kaW1zLmxlbmd0aCAhPSBhcmcubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmdldC9zZXQ6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgaWYodGhpcy5sYXlvdXQgPT0gMCAvKiBjX2xheW91dCAqLykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJnW2ldIDwgMCB8fCBhcmdbaV0gPj0gdGhpcy5kaW1zW2ldKVxuICAgICAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gICAgICBvZnMgPSAob2ZzICogdGhpcy5kaW1zW2ldKSArIGFyZ1tpXTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMuZGltcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGFyZ1tpXSA8IDEgfHwgYXJnW2ldID4gdGhpcy5kaW1zW2ldKXtcbiAgICAgICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICAgICAgfVxuICAgICAgb2ZzID0gKG9mcyAqIHRoaXMuZGltc1tpXSkgKyAoYXJnW2ldIC0gMSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvZnM7XG59XG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAob2ZzKSB7XG4gIHN3aXRjaCh0aGlzLmtpbmQpe1xuICBjYXNlIDc6XG4gICAgLy8gSW50NjRcbiAgICB2YXIgbCA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMF07XG4gICAgdmFyIGggPSB0aGlzLmRhdGFbb2ZzICogMiArIDFdO1xuICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19oaShsLGgpO1xuICBjYXNlIDEwOiBjYXNlIDExOlxuICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgdmFyIHIgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgIHZhciBpID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICByZXR1cm4gWzI1NCwgciwgaV07XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIHRoaXMuZGF0YVtvZnNdXG4gIH1cbn1cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChvZnMsdikge1xuICBzd2l0Y2godGhpcy5raW5kKXtcbiAgY2FzZSA3OlxuICAgIC8vIEludDY0XG4gICAgdGhpcy5kYXRhW29mcyAqIDIgKyAwXSA9IGNhbWxfaW50NjRfbG8zMih2KTtcbiAgICB0aGlzLmRhdGFbb2ZzICogMiArIDFdID0gY2FtbF9pbnQ2NF9oaTMyKHYpO1xuICAgIGJyZWFrO1xuICBjYXNlIDEwOiBjYXNlIDExOlxuICAgIC8vIENvbXBsZXgzMiwgQ29tcGxleDY0XG4gICAgdGhpcy5kYXRhW29mcyAqIDIgKyAwXSA9IHZbMV07XG4gICAgdGhpcy5kYXRhW29mcyAqIDIgKyAxXSA9IHZbMl07XG4gICAgYnJlYWs7XG4gIGRlZmF1bHQ6XG4gICAgdGhpcy5kYXRhW29mc10gPSB2O1xuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAwXG59XG5cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAodikge1xuICBzd2l0Y2godGhpcy5raW5kKXtcbiAgY2FzZSA3OlxuICAgIC8vIEludDY0XG4gICAgdmFyIGEgPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgdmFyIGIgPSBjYW1sX2ludDY0X2hpMzIodik7XG4gICAgaWYoYSA9PSBiKXtcbiAgICAgIHRoaXMuZGF0YS5maWxsKGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGk8dGhpcy5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdGhpcy5kYXRhW2ldID0gKGklMiA9PSAwKSA/IGEgOiBiO1xuICAgICAgfVxuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMDogY2FzZSAxMTpcbiAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgIHZhciBpbSA9IHZbMV07XG4gICAgdmFyIHJlID0gdlsyXTtcbiAgICBpZihpbSA9PSByZSl7XG4gICAgICB0aGlzLmRhdGEuZmlsbChpbSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yKHZhciBpID0gMDsgaTx0aGlzLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgICB0aGlzLmRhdGFbaV0gPSAoaSUyID09IDApID8gaW0gOiByZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGRlZmF1bHQ6XG4gICAgdGhpcy5kYXRhLmZpbGwodik7XG4gICAgYnJlYWs7XG4gIH1cbn1cblxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIChiLCB0b3RhbCkge1xuICBpZiAodGhpcy5sYXlvdXQgIT0gYi5sYXlvdXQgfHwgdGhpcy5raW5kICE9IGIua2luZCkge1xuICAgIHZhciBrMSA9IHRoaXMua2luZCB8ICh0aGlzLmxheW91dCA8PCA4KTtcbiAgICB2YXIgazIgPSAgICBiLmtpbmQgfCAoYi5sYXlvdXQgPDwgOCk7XG4gICAgcmV0dXJuIGsyIC0gazE7XG4gIH1cbiAgaWYgKHRoaXMuZGltcy5sZW5ndGggIT0gYi5kaW1zLmxlbmd0aCkge1xuICAgIHJldHVybiBiLmRpbXMubGVuZ3RoIC0gdGhpcy5kaW1zLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKylcbiAgICBpZiAodGhpcy5kaW1zW2ldICE9IGIuZGltc1tpXSlcbiAgICAgIHJldHVybiAodGhpcy5kaW1zW2ldIDwgYi5kaW1zW2ldKSA/IC0xIDogMTtcbiAgc3dpdGNoICh0aGlzLmtpbmQpIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gIGNhc2UgMTA6XG4gIGNhc2UgMTE6XG4gICAgLy8gRmxvYXRzXG4gICAgdmFyIHgsIHk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHggPSB0aGlzLmRhdGFbaV07XG4gICAgICB5ID0gYi5kYXRhW2ldO1xuICAgICAgaWYgKHggPCB5KVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoeCA+IHkpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgaWYgKHggIT0geSkge1xuICAgICAgICBpZiAoIXRvdGFsKSByZXR1cm4gTmFOO1xuICAgICAgICBpZiAoeCA9PSB4KSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHkgPT0geSkgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA3OlxuICAgIC8vIEludDY0XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKz0yKSB7XG4gICAgICAvLyBDaGVjayBoaWdoZXN0IGJpdHMgZmlyc3RcbiAgICAgIGlmICh0aGlzLmRhdGFbaSsxXSA8IGIuZGF0YVtpKzFdKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAodGhpcy5kYXRhW2krMV0gPiBiLmRhdGFbaSsxXSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICBpZiAoKHRoaXMuZGF0YVtpXSA+Pj4gMCkgPCAoYi5kYXRhW2ldID4+PiAwKSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKCh0aGlzLmRhdGFbaV0gPj4+IDApID4gKGIuZGF0YVtpXSA+Pj4gMCkpXG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAyOlxuICBjYXNlIDM6XG4gIGNhc2UgNDpcbiAgY2FzZSA1OlxuICBjYXNlIDY6XG4gIGNhc2UgODpcbiAgY2FzZSA5OlxuICBjYXNlIDEyOlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5kYXRhW2ldIDwgYi5kYXRhW2ldKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAodGhpcy5kYXRhW2ldID4gYi5kYXRhW2ldKVxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IE1sX0JpZ2FycmF5X2NfMV8xXG4vL1JlcXVpcmVzOiBNbF9CaWdhcnJheSwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBNbF9CaWdhcnJheV9jXzFfMShraW5kLCBsYXlvdXQsIGRpbXMsIGJ1ZmZlcikge1xuICB0aGlzLmtpbmQgICA9IGtpbmQgO1xuICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgdGhpcy5kaW1zICAgPSBkaW1zO1xuICB0aGlzLmRhdGEgICA9IGJ1ZmZlcjtcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlID0gbmV3IE1sX0JpZ2FycmF5KClcbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZS5vZmZzZXQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIGlmKHR5cGVvZiBhcmcgIT09IFwibnVtYmVyXCIpe1xuICAgIGlmKChhcmcgaW5zdGFuY2VvZiBBcnJheSkgJiYgYXJnLmxlbmd0aCA9PSAxKVxuICAgICAgYXJnID0gYXJnWzBdO1xuICAgIGVsc2UgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiTWxfQmlnYXJyYXlfY18xXzEub2Zmc2V0XCIpO1xuICB9XG4gIGlmIChhcmcgPCAwIHx8IGFyZyA+PSB0aGlzLmRpbXNbMF0pXG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gYXJnO1xufVxuXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9mcykge1xuICByZXR1cm4gdGhpcy5kYXRhW29mc107XG59XG5cbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob2ZzLHYpIHtcbiAgdGhpcy5kYXRhW29mc10gPSB2O1xuICByZXR1cm4gMFxufVxuXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uICh2KSB7XG4gIHRoaXMuZGF0YS5maWxsKHYpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NvbXBhcmVcbmZ1bmN0aW9uIGNhbWxfYmFfY29tcGFyZShhLGIsdG90YWwpe1xuICByZXR1cm4gYS5jb21wYXJlKGIsdG90YWwpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuLy9SZXF1aXJlczogTWxfQmlnYXJyYXksIE1sX0JpZ2FycmF5X2NfMV8xLCBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpe1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCk7XG4gIGlmKGNhbWxfYmFfZ2V0X3NpemUoZGltcykgKiBzaXplX3Blcl9lbGVtZW50ICE9IGRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwibGVuZ3RoIGRvZXNuJ3QgbWF0Y2ggZGltc1wiKTtcbiAgfVxuICBpZihsYXlvdXQgPT0gMCAmJiAvLyBjX2xheW91dFxuICAgICBkaW1zLmxlbmd0aCA9PSAxICYmIC8vIEFycmF5MVxuICAgICBzaXplX3Blcl9lbGVtZW50ID09IDEpIC8vIDEtdG8tMSBtYXBwaW5nXG4gICAgcmV0dXJuIG5ldyBNbF9CaWdhcnJheV9jXzFfMShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xuICByZXR1cm4gbmV3IE1sX0JpZ2FycmF5KGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG5cbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX2J1ZmZlclxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGUoa2luZCwgbGF5b3V0LCBkaW1zX21sKSB7XG4gIHZhciBkaW1zID0gY2FtbF9qc19mcm9tX2FycmF5KGRpbXNfbWwpO1xuICB2YXIgZGF0YSA9IGNhbWxfYmFfY3JlYXRlX2J1ZmZlcihraW5kLCBjYW1sX2JhX2dldF9zaXplKGRpbXMpKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NoYW5nZV9sYXlvdXRcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gY2FtbF9iYV9jaGFuZ2VfbGF5b3V0KGJhLCBsYXlvdXQpIHtcbiAgaWYoYmEubGF5b3V0ID09IGxheW91dCkgcmV0dXJuIGJhO1xuICB2YXIgbmV3X2RpbXMgPSBbXVxuICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgbmV3X2RpbXNbaV0gPSBiYS5kaW1zW2JhLmRpbXMubGVuZ3RoIC0gaSAtIDFdO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGxheW91dCwgbmV3X2RpbXMsIGJhLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2tpbmRcbmZ1bmN0aW9uIGNhbWxfYmFfa2luZChiYSkge1xuICByZXR1cm4gYmEua2luZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9sYXlvdXRcbmZ1bmN0aW9uIGNhbWxfYmFfbGF5b3V0KGJhKSB7XG4gIHJldHVybiBiYS5sYXlvdXQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbnVtX2RpbXNcbmZ1bmN0aW9uIGNhbWxfYmFfbnVtX2RpbXMoYmEpIHtcbiAgcmV0dXJuIGJhLmRpbXMubGVuZ3RoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2RpbVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2RpbShiYSwgaSkge1xuICBpZiAoaSA8IDAgfHwgaSA+PSBiYS5kaW1zLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5kaW1cIik7XG4gIHJldHVybiBiYS5kaW1zW2ldO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2RpbV8xXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2RpbVxuZnVuY3Rpb24gY2FtbF9iYV9kaW1fMShiYSkge1xuICByZXR1cm4gY2FtbF9iYV9kaW0oYmEsIDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2RpbV8yXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2RpbVxuZnVuY3Rpb24gY2FtbF9iYV9kaW1fMihiYSkge1xuICByZXR1cm4gY2FtbF9iYV9kaW0oYmEsIDEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2RpbV8zXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2RpbVxuZnVuY3Rpb24gY2FtbF9iYV9kaW1fMyhiYSkge1xuICByZXR1cm4gY2FtbF9iYV9kaW0oYmEsIDIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF9nZW5lcmljXG4vL1JlcXVpcmVzOiBjYW1sX2pzX2Zyb21fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0X2dlbmVyaWMoYmEsIGkpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChjYW1sX2pzX2Zyb21fYXJyYXkoaSkpO1xuICByZXR1cm4gYmEuZ2V0KG9mcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfZ2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfZ2V0MTYoYmEsIGkwKSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMpO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzICsgMSk7XG4gIHJldHVybiAoYjEgfCAoYjIgPDwgOCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDMyKGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBiYS5nZXQob2ZzKzApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzKzEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzKzIpO1xuICB2YXIgYjQgPSBiYS5nZXQob2ZzKzMpO1xuICByZXR1cm4gKCAoYjEgPDwgMCkgIHxcbiAgICAgICAgICAgKGIyIDw8IDgpICB8XG4gICAgICAgICAgIChiMyA8PCAxNikgfFxuICAgICAgICAgICAoYjQgPDwgMjQpICk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW50NjRfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfZ2V0NjQoYmEsIGkwKSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyA3ID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGJhLmdldChvZnMrMCk7XG4gIHZhciBiMiA9IGJhLmdldChvZnMrMSk7XG4gIHZhciBiMyA9IGJhLmdldChvZnMrMik7XG4gIHZhciBiNCA9IGJhLmdldChvZnMrMyk7XG4gIHZhciBiNSA9IGJhLmdldChvZnMrNCk7XG4gIHZhciBiNiA9IGJhLmdldChvZnMrNSk7XG4gIHZhciBiNyA9IGJhLmdldChvZnMrNik7XG4gIHZhciBiOCA9IGJhLmdldChvZnMrNyk7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzKFtiOCxiNyxiNixiNSxiNCxiMyxiMixiMV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF8xXG5mdW5jdGlvbiBjYW1sX2JhX2dldF8xKGJhLCBpMCkge1xuICByZXR1cm4gYmEuZ2V0KGJhLm9mZnNldChpMCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF8yXG5mdW5jdGlvbiBjYW1sX2JhX2dldF8yKGJhLCBpMCwgaTEpIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoW2kwLGkxXSkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF8zXG5mdW5jdGlvbiBjYW1sX2JhX2dldF8zKGJhLCBpMCwgaTEsIGkyKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCxpMSxpMl0pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXRfZ2VuZXJpY1xuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2JhX3NldF9nZW5lcmljKGJhLCBpLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoY2FtbF9qc19mcm9tX2FycmF5KGkpKSwgdik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0MTYoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyAxID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGJhLnNldChvZnMrMCwgIHYgICAgICAgICYgMHhmZik7XG4gIGJhLnNldChvZnMrMSwgKHYgPj4+IDgpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDMyKGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzKzAsICB2ICAgICAgICAgJiAweGZmKTtcbiAgYmEuc2V0KG9mcysxLCAodiA+Pj4gOCkgICYgMHhmZik7XG4gIGJhLnNldChvZnMrMiwgKHYgPj4+IDE2KSAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzMsICh2ID4+PiAyNCkgJiAweGZmKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfdWludDhfc2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW50NjRfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYmFfdWludDhfc2V0NjQoYmEsIGkwLCB2KSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoaTApO1xuICBpZihvZnMgKyA3ID49IGJhLmRhdGEubGVuZ3RoKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciB2ID0gY2FtbF9pbnQ2NF90b19ieXRlcyh2KTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IDg7IGkrKykgYmEuc2V0KG9mcytpLCB2WzctaV0pXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8xXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8xKGJhLCBpMCwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGkwKSwgdik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzJcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzIoYmEsIGkwLCBpMSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KFtpMCxpMV0pLCB2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0XzNcbmZ1bmN0aW9uIGNhbWxfYmFfc2V0XzMoYmEsIGkwLCBpMSwgaTIsIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChbaTAsaTEsaTJdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2ZpbGxcbmZ1bmN0aW9uIGNhbWxfYmFfZmlsbChiYSwgdikge1xuICBiYS5maWxsKHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfYmxpdChzcmMsIGRzdCkge1xuICBpZiAoZHN0LmRpbXMubGVuZ3RoICE9IHNyYy5kaW1zLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5ibGl0OiBkaW1lbnNpb24gbWlzbWF0Y2hcIik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZHN0LmRpbXMubGVuZ3RoOyBpKyspXG4gICAgaWYgKGRzdC5kaW1zW2ldICE9IHNyYy5kaW1zW2ldKVxuICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBkc3QuZGF0YS5zZXQoc3JjLmRhdGEpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zdWJcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX3N1YihiYSwgb2ZzLCBsZW4pIHtcbiAgdmFyIGNoYW5nZWRfZGltO1xuICB2YXIgbXVsID0gMTtcbiAgaWYgKGJhLmxheW91dCA9PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgICAgbXVsID0gbXVsICogYmEuZGltc1tpXTtcbiAgICBjaGFuZ2VkX2RpbSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAoYmEuZGltcy5sZW5ndGggLSAxKTsgaSsrKVxuICAgICAgbXVsID0gbXVsICogYmEuZGltc1tpXTtcbiAgICBjaGFuZ2VkX2RpbSA9IGJhLmRpbXMubGVuZ3RoIC0gMTtcbiAgICBvZnMgPSBvZnMgLSAxO1xuICB9XG4gIGlmIChvZnMgPCAwIHx8IGxlbiA8IDAgfHwgKG9mcyArIGxlbikgPiBiYS5kaW1zW2NoYW5nZWRfZGltXSl7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuc3ViOiBiYWQgc3ViLWFycmF5XCIpO1xuICB9XG4gIHZhciBuZXdfZGltcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgbmV3X2RpbXNbaV0gPSBiYS5kaW1zW2ldO1xuICBuZXdfZGltc1tjaGFuZ2VkX2RpbV0gPSBsZW47XG4gIG11bCAqPSBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGJhLmtpbmQpO1xuICB2YXIgbmV3X2RhdGEgPSBiYS5kYXRhLnN1YmFycmF5KG9mcyAqIG11bCwgKG9mcyArIGxlbikgKiBtdWwpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgbmV3X2RpbXMsIG5ld19kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zbGljZVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9zbGljZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbnVtX2luZHMgPSB2aW5kLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gW107XG4gIHZhciBzdWJfZGltcyA9IFtdO1xuICB2YXIgb2ZzO1xuXG4gIGlmIChudW1faW5kcyA+IGJhLmRpbXMubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnNsaWNlOiB0b28gbWFueSBpbmRpY2VzXCIpO1xuXG4gIC8vIENvbXB1dGUgb2Zmc2V0IGFuZCBjaGVjayBib3VuZHNcbiAgaWYgKGJhLmxheW91dCA9PSAwKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1faW5kczsgaSsrKVxuICAgICAgaW5kZXhbaV0gPSB2aW5kW2ldO1xuICAgIGZvciAoOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIGluZGV4W2ldID0gMDtcbiAgICBzdWJfZGltcyA9IGJhLmRpbXMuc2xpY2UobnVtX2luZHMpO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2luZHM7IGkrKylcbiAgICAgIGluZGV4W2JhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHMgKyBpXSA9IHZpbmRbaV07XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtpXSA9IDE7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKDAsIGJhLmRpbXMubGVuZ3RoIC0gbnVtX2luZHMpO1xuICB9XG4gIG9mcyA9IGJhLm9mZnNldChpbmRleCk7XG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShzdWJfZGltcyk7XG4gIHZhciBzaXplX3Blcl9lbGVtZW50ID0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShvZnMgKiBzaXplX3Blcl9lbGVtZW50LCAob2ZzICsgc2l6ZSkgKiBzaXplX3Blcl9lbGVtZW50KTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBiYS5sYXlvdXQsIHN1Yl9kaW1zLCBuZXdfZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfcmVzaGFwZVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5LCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9iYV9nZXRfc2l6ZVxuZnVuY3Rpb24gY2FtbF9iYV9yZXNoYXBlKGJhLCB2aW5kKSB7XG4gIHZpbmQgPSBjYW1sX2pzX2Zyb21fYXJyYXkodmluZCk7XG4gIHZhciBuZXdfZGltID0gW107XG4gIHZhciBudW1fZGltcyA9IHZpbmQubGVuZ3RoO1xuXG4gIGlmIChudW1fZGltcyA8IDAgfHwgbnVtX2RpbXMgPiAxNil7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogYmFkIG51bWJlciBvZiBkaW1lbnNpb25zXCIpO1xuICB9XG4gIHZhciBudW1fZWx0cyA9IDE7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgIG5ld19kaW1baV0gPSB2aW5kW2ldO1xuICAgIGlmIChuZXdfZGltW2ldIDwgMClcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnJlc2hhcGU6IG5lZ2F0aXZlIGRpbWVuc2lvblwiKTtcbiAgICBudW1fZWx0cyA9IG51bV9lbHRzICogbmV3X2RpbVtpXTtcbiAgfVxuXG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShiYS5kaW1zKTtcbiAgLy8gQ2hlY2sgdGhhdCBzaXplcyBhZ3JlZVxuICBpZiAobnVtX2VsdHMgIT0gc2l6ZSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBzaXplIG1pc21hdGNoXCIpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGJhLmtpbmQsIGJhLmxheW91dCwgbmV3X2RpbSwgYmEuZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaW50NjRfdG9fYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfYml0c19vZl9mbG9hdFxuZnVuY3Rpb24gY2FtbF9iYV9zZXJpYWxpemUod3JpdGVyLCBiYSwgc3opIHtcbiAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zLmxlbmd0aCk7XG4gIHdyaXRlci53cml0ZSgzMiwgKGJhLmtpbmQgfCAoYmEubGF5b3V0IDw8IDgpKSk7XG4gIGlmKGJhLmNhbWxfY3VzdG9tID09IFwiX2JpZ2FycjAyXCIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmKGJhLmRpbXNbaV0gPCAweGZmZmYpXG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgYmEuZGltc1tpXSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgd3JpdGVyLndyaXRlKDE2LCAweGZmZmYpO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIDApO1xuICAgICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRpbXNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgZWxzZVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB3cml0ZXIud3JpdGUoMzIsYmEuZGltc1tpXSlcbiAgc3dpdGNoKGJhLmtpbmQpe1xuICBjYXNlIDI6ICAvL0ludDhBcnJheVxuICBjYXNlIDM6ICAvL1VpbnQ4QXJyYXlcbiAgY2FzZSAxMjogLy9VaW50OEFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgd3JpdGVyLndyaXRlKDgsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA0OiAgLy8gSW50MTZBcnJheVxuICBjYXNlIDU6ICAvLyBVaW50MTZBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSgxNiwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDY6ICAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA4OiAgLy8gSW50MzJBcnJheSAoaW50KVxuICBjYXNlIDk6ICAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgd3JpdGVyLndyaXRlKDgsMCk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNzogIC8vIEludDMyQXJyYXkgKGludDY0KVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aCAvIDI7IGkrKyl7XG4gICAgICB2YXIgYiA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoYmEuZ2V0KGkpKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUgKDgsIGJbal0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxOiAgLy8gRmxvYXQ2NEFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChiYS5nZXQoaSkpKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUgKDgsIGJbal0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAwOiAgLy8gRmxvYXQzMkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKTtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgYik7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiAvLyBGbG9hdDMyQXJyYXkgKGNvbXBsZXgzMilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspe1xuICAgICAgdmFyIGogPSBiYS5nZXQoaSk7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChqWzFdKSk7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdChqWzJdKSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDExOiAvLyBGbG9hdDY0QXJyYXkgKGNvbXBsZXg2NClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspe1xuICAgICAgdmFyIGNvbXBsZXggPSBiYS5nZXQoaSk7XG4gICAgICB2YXIgYiA9IGNhbWxfaW50NjRfdG9fYnl0ZXMoY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KGNvbXBsZXhbMV0pKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB3cml0ZXIud3JpdGUgKDgsIGJbal0pO1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzJdKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cbiAgc3pbMF0gPSAoNCArIGJhLmRpbXMubGVuZ3RoKSAqIDQ7XG4gIHN6WzFdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2Rlc2VyaWFsaXplXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfYnl0ZXMsIGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfZGVzZXJpYWxpemUocmVhZGVyLCBzeiwgbmFtZSl7XG4gIHZhciBudW1fZGltcyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIGlmIChudW1fZGltcyA8IDAgfHwgbnVtX2RpbXMgPiAxNilcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHdyb25nIG51bWJlciBvZiBiaWdhcnJheSBkaW1lbnNpb25zXCIpO1xuICB2YXIgdGFnID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgdmFyIGtpbmQgPSB0YWcgJiAweGZmXG4gIHZhciBsYXlvdXQgPSAodGFnID4+IDgpICYgMTtcbiAgdmFyIGRpbXMgPSBbXVxuICBpZihuYW1lID09IFwiX2JpZ2FycjAyXCIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSB7XG4gICAgICB2YXIgc2l6ZV9kaW0gPSByZWFkZXIucmVhZDE2dSgpO1xuICAgICAgaWYoc2l6ZV9kaW0gPT0gMHhmZmZmKXtcbiAgICAgICAgdmFyIHNpemVfZGltX2hpID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgdmFyIHNpemVfZGltX2xvID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgaWYoc2l6ZV9kaW1faGkgIT0gMClcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGJpZ2FycmF5IGRpbWVuc2lvbiBvdmVyZmxvdyBpbiAzMmJpdFwiKTtcbiAgICAgICAgc2l6ZV9kaW0gPSBzaXplX2RpbV9sbztcbiAgICAgIH1cbiAgICAgIGRpbXMucHVzaChzaXplX2RpbSk7XG4gICAgfVxuICBlbHNlXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZGltczsgaSsrKSBkaW1zLnB1c2gocmVhZGVyLnJlYWQzMnUoKSk7XG4gIHZhciBzaXplID0gY2FtbF9iYV9nZXRfc2l6ZShkaW1zKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgc2l6ZSk7XG4gIHZhciBiYSA9IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xuICBzd2l0Y2goa2luZCl7XG4gIGNhc2UgMjogIC8vSW50OEFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQ4cygpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAzOiAgLy9VaW50OEFycmF5XG4gIGNhc2UgMTI6IC8vVWludDhBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNDogIC8vIEludDE2QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDE2cygpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA1OiAgLy8gVWludDE2QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDE2dSgpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA2OiAgLy8gSW50MzJBcnJheSAoaW50MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgODogIC8vIEludDMyQXJyYXkgKGludClcbiAgY2FzZSA5OiAgLy8gSW50MzJBcnJheSAobmF0aXZlaW50KVxuICAgIHZhciBzaXh0eSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICBpZihzaXh0eSkgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBjYW5ub3QgcmVhZCBiaWdhcnJheSB3aXRoIDY0LWJpdCBPQ2FtbCBpbnRzXCIpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDc6IC8vIChpbnQ2NClcbiAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgaW50NjQgPSBjYW1sX2ludDY0X29mX2J5dGVzKHQpO1xuICAgICAgYmEuc2V0KGksaW50NjQpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxOiAgLy8gRmxvYXQ2NEFycmF5XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIGYgPSBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMoY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KSk7XG4gICAgICBiYS5zZXQoaSxmKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMDogIC8vIEZsb2F0MzJBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgdmFyIGYgPSBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMocmVhZGVyLnJlYWQzMnMoKSk7XG4gICAgICBiYS5zZXQoaSxmKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgdmFyIHJlID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgdmFyIGltID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgYmEuc2V0KGksWzI1NCxyZSxpbV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMTogLy8gRmxvYXQ2NEFycmF5IChjb21wbGV4NjQpXG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIHJlID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIGltID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgYmEuc2V0KGksWzI1NCxyZSxpbV0pO1xuICAgIH1cbiAgICBicmVha1xuICB9XG4gIHN6WzBdID0gKDQgKyBudW1fZGltcykgKiA0O1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YSk7XG59XG5cbi8vRGVwcmVjYXRlZFxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVfZnJvbVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlX2Zyb20oZGF0YTEsIGRhdGEyLCBqc3R5cCwga2luZCwgbGF5b3V0LCBkaW1zKXtcbiAgaWYoZGF0YTIgfHwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSA9PSAyKXtcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JhX2NyZWF0ZV9mcm9tOiB1c2UgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVwiKTtcbiAgfVxuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKGtpbmQsIGxheW91dCwgZGltcywgZGF0YTEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2hhc2ggY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemUsIGNhbWxfaGFzaF9taXhfaW50LCBjYW1sX2hhc2hfbWl4X2Zsb2F0XG5mdW5jdGlvbiBjYW1sX2JhX2hhc2goYmEpe1xuICB2YXIgbnVtX2VsdHMgPSBjYW1sX2JhX2dldF9zaXplKGJhLmRpbXMpO1xuICB2YXIgaCA9IDA7XG4gIHN3aXRjaChiYS5raW5kKXtcbiAgY2FzZSAyOiAgLy9JbnQ4QXJyYXlcbiAgY2FzZSAzOiAgLy9VaW50OEFycmF5XG4gIGNhc2UgMTI6IC8vVWludDhBcnJheVxuICAgIGlmKG51bV9lbHRzID4gMjU2KSBudW1fZWx0cyA9IDI1NjtcbiAgICB2YXIgdyA9IDAsIGkgPTA7XG4gICAgZm9yKGkgPSAwOyBpICsgNCA8PSBiYS5kYXRhLmxlbmd0aDsgaSs9NCl7XG4gICAgICB3ID0gYmEuZGF0YVtpKzBdIHwgKGJhLmRhdGFbaSsxXSA8PCA4KSB8IChiYS5kYXRhW2krMl0gPDwgMTYpIHwgKGJhLmRhdGFbaSszXSA8PCAyNCk7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCx3KTtcbiAgICB9XG4gICAgdyA9IDA7XG4gICAgc3dpdGNoIChudW1fZWx0cyAmIDMpIHtcbiAgICBjYXNlIDM6IHcgID0gYmEuZGF0YVtpKzJdIDw8IDE2OyAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgIGNhc2UgMjogdyB8PSBiYS5kYXRhW2krMV0gPDwgODsgICAgIC8qIGZhbGx0aHJvdWdoICovXG4gICAgY2FzZSAxOiB3IHw9IGJhLmRhdGFbaSswXTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNDogIC8vIEludDE2QXJyYXlcbiAgY2FzZSA1OiAgLy8gVWludDE2QXJyYXlcbiAgICBpZihudW1fZWx0cyA+IDEyOCkgbnVtX2VsdHMgPSAxMjg7XG4gICAgdmFyIHcgPSAwLCBpID0wO1xuICAgIGZvcihpID0gMDsgaSArIDIgPD0gYmEuZGF0YS5sZW5ndGg7IGkrPTIpe1xuICAgICAgdyA9IGJhLmRhdGFbaSswXSB8IChiYS5kYXRhW2krMV0gPDwgMTYpO1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsdyk7XG4gICAgfVxuICAgIGlmICgobnVtX2VsdHMgJiAxKSAhPSAwKVxuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICBjYXNlIDY6ICAvLyBJbnQzMkFycmF5IChpbnQzMilcbiAgICBpZiAobnVtX2VsdHMgPiA2NCkgbnVtX2VsdHMgPSA2NDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9lbHRzOyBpKyspIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgY2FzZSA4OiAgLy8gSW50MzJBcnJheSAoaW50KVxuICBjYXNlIDk6ICAvLyBJbnQzMkFycmF5IChuYXRpdmVpbnQpXG4gICAgaWYgKG51bV9lbHRzID4gNjQpIG51bV9lbHRzID0gNjQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgNzogIC8vIEludDMyQXJyYXkgKGludDY0KVxuICAgIGlmIChudW1fZWx0cyA+IDMyKSBudW1fZWx0cyA9IDMyO1xuICAgIG51bV9lbHRzICo9IDJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9lbHRzOyBpKyspIHtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IC8vIEZsb2F0MzJBcnJheSAoY29tcGxleDMyKVxuICAgIG51bV9lbHRzICo9MjsgLyogZmFsbHRocm91Z2ggKi9cbiAgY2FzZSAwOiAgLy8gRmxvYXQzMkFycmF5XG4gICAgaWYgKG51bV9lbHRzID4gNjQpIG51bV9lbHRzID0gNjQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgY2FzZSAxMTogLy8gRmxvYXQ2NEFycmF5IChjb21wbGV4NjQpXG4gICAgbnVtX2VsdHMgKj0yOyAvKiBmYWxsdGhyb3VnaCAqL1xuICBjYXNlIDE6ICAvLyBGbG9hdDY0QXJyYXlcbiAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9lbHRzOyBpKyspIGggPSBjYW1sX2hhc2hfbWl4X2Zsb2F0KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYmFfdG9fdHlwZWRfYXJyYXkoYmEpe1xuICByZXR1cm4gYmEuZGF0YTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5KHRhKXtcbiAgdmFyIGtpbmQ7XG4gIGlmICAgICAgKHRhIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSBraW5kID0gMDtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpIGtpbmQgPSAxO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIEludDhBcnJheSkga2luZCA9IDI7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDhBcnJheSkga2luZCA9IDM7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgSW50MTZBcnJheSkga2luZCA9IDQ7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgVWludDE2QXJyYXkpIGtpbmQgPSA1O1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIEludDMyQXJyYXkpIGtpbmQgPSA2O1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSBraW5kID0gNjtcbiAgZWxzZSBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXk6IHVuc3VwcG9ydGVkIGtpbmRcIik7XG4gIHJldHVybiBraW5kO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfZnJvbV90eXBlZF9hcnJheSh0YSl7XG4gIHZhciBraW5kID0gY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5KHRhKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCAwLCBbdGEubGVuZ3RoXSwgdGEpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9mb3JtYXRfaW50IGNvbnN0IChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZywgY2FtbF9zdHJfcmVwZWF0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2Zvcm1hdF9pbnQoZm10LCBpKSB7XG4gIGlmIChjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGZtdCkgPT0gXCIlZFwiKSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIlwiK2kpO1xuICB2YXIgZiA9IGNhbWxfcGFyc2VfZm9ybWF0KGZtdCk7XG4gIGlmIChpIDwgMCkgeyBpZiAoZi5zaWduZWRjb252KSB7IGYuc2lnbiA9IC0xOyBpID0gLWk7IH0gZWxzZSBpID4+Pj0gMDsgfVxuICB2YXIgcyA9IGkudG9TdHJpbmcoZi5iYXNlKTtcbiAgaWYgKGYucHJlYyA+PSAwKSB7XG4gICAgZi5maWxsZXIgPSAnICc7XG4gICAgdmFyIG4gPSBmLnByZWMgLSBzLmxlbmd0aDtcbiAgICBpZiAobiA+IDApIHMgPSBjYW1sX3N0cl9yZXBlYXQgKG4sICcwJykgKyBzO1xuICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2Vcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIChzKSB7XG4gIHZhciBpID0gMCwgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpLCBiYXNlID0gMTAsIHNpZ24gPSAxO1xuICBpZiAobGVuID4gMCkge1xuICAgIHN3aXRjaCAoY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLGkpKSB7XG4gICAgY2FzZSA0NTogaSsrOyBzaWduID0gLTE7IGJyZWFrO1xuICAgIGNhc2UgNDM6IGkrKzsgc2lnbiA9IDE7IGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAoaSArIDEgPCBsZW4gJiYgY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKSA9PSA0OClcbiAgICBzd2l0Y2ggKGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSArIDEpKSB7XG4gICAgY2FzZSAxMjA6IGNhc2UgODg6IGJhc2UgPSAxNjsgaSArPSAyOyBicmVhaztcbiAgICBjYXNlIDExMTogY2FzZSA3OTogYmFzZSA9ICA4OyBpICs9IDI7IGJyZWFrO1xuICAgIGNhc2UgIDk4OiBjYXNlIDY2OiBiYXNlID0gIDI7IGkgKz0gMjsgYnJlYWs7XG4gICAgY2FzZSAxMTc6IGNhc2UgODU6IGkgKz0gMjsgYnJlYWs7XG4gICAgfVxuICByZXR1cm4gW2ksIHNpZ24sIGJhc2VdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2RpZ2l0XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2RpZ2l0KGMpIHtcbiAgaWYgKGMgPj0gNDggJiYgYyA8PSA1NykgIHJldHVybiBjIC0gNDg7XG4gIGlmIChjID49IDY1ICYmIGMgPD0gOTApICByZXR1cm4gYyAtIDU1O1xuICBpZiAoYyA+PSA5NyAmJiBjIDw9IDEyMikgcmV0dXJuIGMgLSA4NztcbiAgcmV0dXJuIC0xO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludF9vZl9zdHJpbmcgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UsIGNhbWxfcGFyc2VfZGlnaXQsIGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfaW50X29mX3N0cmluZyAocykge1xuICB2YXIgciA9IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSAocyk7XG4gIHZhciBpID0gclswXSwgc2lnbiA9IHJbMV0sIGJhc2UgPSByWzJdO1xuICB2YXIgbGVuID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICB2YXIgdGhyZXNob2xkID0gLTEgPj4+IDA7XG4gIHZhciBjID0gKGkgPCBsZW4pP2NhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk6MDtcbiAgdmFyIGQgPSBjYW1sX3BhcnNlX2RpZ2l0KGMpO1xuICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgdmFyIHJlcyA9IGQ7XG4gIGZvciAoaSsrO2k8bGVuO2krKykge1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICByZXMgPSBiYXNlICogcmVzICsgZDtcbiAgICBpZiAocmVzID4gdGhyZXNob2xkKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgfVxuICBpZiAoaSAhPSBsZW4pIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICAvLyBGb3IgYmFzZSBkaWZmZXJlbnQgZnJvbSAxMCwgd2UgZXhwZWN0IGFuIHVuc2lnbmVkIHJlcHJlc2VudGF0aW9uLFxuICAvLyBoZW5jZSBhbnkgdmFsdWUgb2YgJ3JlcycgKGxlc3MgdGhhbiAndGhyZXNob2xkJykgaXMgYWNjZXB0YWJsZS5cbiAgLy8gQnV0IHdlIGhhdmUgdG8gY29udmVydCB0aGUgcmVzdWx0IGJhY2sgdG8gYSBzaWduZWQgaW50ZWdlci5cbiAgcmVzID0gc2lnbiAqIHJlcztcbiAgaWYgKChiYXNlID09IDEwKSAmJiAoKHJlcyB8IDApICE9IHJlcykpXG4gICAgLyogU2lnbmVkIHJlcHJlc2VudGF0aW9uIGV4cGVjdGVkLCBhbGxvdyAtMl4obmJpdHMtMSkgdG8gMl4obmJpdHMtMSkgLSAxICovXG4gICAgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHJldHVybiByZXMgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX211bCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tdWwoYSxiKXtcbiAgcmV0dXJuIE1hdGguaW11bChhLGIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2RpdlxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuZnVuY3Rpb24gY2FtbF9kaXYoeCx5KSB7XG4gIGlmICh5ID09IDApIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCk7XG4gIHJldHVybiAoeC95KXwwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vZFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuZnVuY3Rpb24gY2FtbF9tb2QoeCx5KSB7XG4gIGlmICh5ID09IDApIGNhbWxfcmFpc2VfemVyb19kaXZpZGUgKCk7XG4gIHJldHVybiB4JXk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnN3YXAxNlxuZnVuY3Rpb24gY2FtbF9ic3dhcDE2KHgpIHtcbiAgcmV0dXJuICgoKCh4ICYgMHgwMEZGKSA8PCA4KSB8XG4gICAgICAgICAgICgoeCAmIDB4RkYwMCkgPj4gOCkpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfYnN3YXBcbmZ1bmN0aW9uIGNhbWxfaW50MzJfYnN3YXAoeCkge1xuICByZXR1cm4gKCgoeCAmIDB4MDAwMDAwRkYpIDw8IDI0KSB8XG4gICAgICAgICAgKCh4ICYgMHgwMDAwRkYwMCkgPDwgOCkgfFxuICAgICAgICAgICgoeCAmIDB4MDBGRjAwMDApID4+PiA4KSB8XG4gICAgICAgICAgKCh4ICYgMHhGRjAwMDAwMCkgPj4+IDI0KSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2Jzd2FwXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X2Jzd2FwKHgpIHtcbiAgdmFyIHkgPSBjYW1sX2ludDY0X3RvX2J5dGVzKHgpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbeVs3XSwgeVs2XSwgeVs1XSwgeVs0XSwgeVszXSwgeVsyXSwgeVsxXSwgeVswXV0pO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBIYXNodGJsXG5cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX3VuaXZfcGFyYW0gbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfY29udGVudFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2N1c3RvbV9vcHNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1ZlcnNpb246IDwgNC4xMlxuZnVuY3Rpb24gY2FtbF9oYXNoX3VuaXZfcGFyYW0gKGNvdW50LCBsaW1pdCwgb2JqKSB7XG4gIHZhciBoYXNoX2FjY3UgPSAwO1xuICBmdW5jdGlvbiBoYXNoX2F1eCAob2JqKSB7XG4gICAgbGltaXQgLS07XG4gICAgaWYgKGNvdW50IDwgMCB8fCBsaW1pdCA8IDApIHJldHVybjtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkgJiYgb2JqWzBdID09PSAob2JqWzBdfDApKSB7XG4gICAgICBzd2l0Y2ggKG9ialswXSkge1xuICAgICAgY2FzZSAyNDg6XG4gICAgICAgIC8vIE9iamVjdFxuICAgICAgICBjb3VudCAtLTtcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDY1NTk5ICsgb2JqWzJdKSB8IDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTA6XG4gICAgICAgIC8vIEZvcndhcmRcbiAgICAgICAgbGltaXQrKzsgaGFzaF9hdXgob2JqKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb3VudCAtLTtcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgb2JqWzBdKSB8IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSBvYmoubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkgaGFzaF9hdXggKG9ialtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKG9iaikpIHtcbiAgICAgIGNvdW50IC0tO1xuICAgICAgdmFyIGNvbnRlbnQgPSBjYW1sX21sX2J5dGVzX2NvbnRlbnQob2JqKTtcbiAgICAgIGlmKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGZvciAodmFyIGIgPSBjb250ZW50LCBsID0gYi5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIGIuY2hhckNvZGVBdChpKSkgfCAwO1xuICAgICAgfSBlbHNlIHsgLyogQVJSQVkgKi9cbiAgICAgICAgZm9yICh2YXIgYSA9IGNvbnRlbnQsIGwgPSBhLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYVtpXSkgfCAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcob2JqKSkge1xuICAgICAgdmFyIGpzYnl0ZXMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG9iaik7XG4gICAgICBmb3IgKHZhciBiID0ganNieXRlcywgbCA9IGpzYnl0ZXMubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgYi5jaGFyQ29kZUF0KGkpKSB8IDA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBmb3IgKHZhciBiID0gb2JqLCBsID0gb2JqLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIGIuY2hhckNvZGVBdChpKSkgfCAwO1xuICAgIH0gZWxzZSBpZiAob2JqID09PSAob2JqfDApKSB7XG4gICAgICAvLyBJbnRlZ2VyXG4gICAgICBjb3VudCAtLTtcbiAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiA2NTU5OSArIG9iaikgfCAwO1xuICAgIH0gZWxzZSBpZiAob2JqID09PSArb2JqKSB7XG4gICAgICAvLyBGbG9hdFxuICAgICAgY291bnQtLTtcbiAgICAgIHZhciBwID0gY2FtbF9pbnQ2NF90b19ieXRlcyAoY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IChvYmopKTtcbiAgICAgIGZvciAodmFyIGkgPSA3OyBpID49IDA7IGktLSkgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDE5ICsgcFtpXSkgfCAwO1xuICAgIH0gZWxzZSBpZihvYmogJiYgb2JqLmNhbWxfY3VzdG9tKSB7XG4gICAgICBpZihjYW1sX2N1c3RvbV9vcHNbb2JqLmNhbWxfY3VzdG9tXSAmJiBjYW1sX2N1c3RvbV9vcHNbb2JqLmNhbWxfY3VzdG9tXS5oYXNoKSB7XG4gICAgICAgIHZhciBoID0gY2FtbF9jdXN0b21fb3BzW29iai5jYW1sX2N1c3RvbV0uaGFzaChvYmopIHwgMDtcbiAgICAgICAgaGFzaF9hY2N1ID0gKGhhc2hfYWNjdSAqIDY1NTk5ICsgaCkgfCAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBoYXNoX2F1eCAob2JqKTtcbiAgcmV0dXJuIGhhc2hfYWNjdSAmIDB4M0ZGRkZGRkY7XG59XG5cbi8vZnVuY3Rpb24gUk9UTDMyKHgsbikgeyByZXR1cm4gKCh4IDw8IG4pIHwgKHggPj4+ICgzMi1uKSkpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2ludFxuLy9SZXF1aXJlczogY2FtbF9tdWxcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfaW50KGgsZCkge1xuICBkID0gY2FtbF9tdWwoZCwgMHhjYzllMmQ1MXwwKTtcbiAgZCA9ICgoZCA8PCAxNSkgfCAoZCA+Pj4gKDMyLTE1KSkpOyAvLyBST1RMMzIoZCwgMTUpO1xuICBkID0gY2FtbF9tdWwoZCwgMHgxYjg3MzU5Myk7XG4gIGggXj0gZDtcbiAgaCA9ICgoaCA8PCAxMykgfCAoaCA+Pj4gKDMyLTEzKSkpOyAgIC8vUk9UTDMyKGgsIDEzKTtcbiAgcmV0dXJuICgoKGggKyAoaCA8PCAyKSl8MCkgKyAoMHhlNjU0NmI2NHwwKSl8MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9maW5hbFxuLy9SZXF1aXJlczogY2FtbF9tdWxcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmluYWwoaCkge1xuICBoIF49IGggPj4+IDE2O1xuICBoID0gY2FtbF9tdWwgKGgsIDB4ODVlYmNhNmJ8MCk7XG4gIGggXj0gaCA+Pj4gMTM7XG4gIGggPSBjYW1sX211bCAoaCwgMHhjMmIyYWUzNXwwKTtcbiAgaCBePSBoID4+PiAxNjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCwgY2FtbF9oYXNoX21peF9pbnQ2NFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9mbG9hdCAoaCwgdjApIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfaW50NjQoaCwgY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0ICh2MCkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9pbnQ2NFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbG8zMiwgY2FtbF9pbnQ2NF9oaTMyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ludDY0IChoLCB2KSB7XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBjYW1sX2ludDY0X2xvMzIodikpO1xuICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgY2FtbF9pbnQ2NF9oaTMyKHYpKTtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBzKSB7XG4gIHZhciBsZW4gPSBzLmxlbmd0aCwgaSwgdztcbiAgZm9yIChpID0gMDsgaSArIDQgPD0gbGVuOyBpICs9IDQpIHtcbiAgICB3ID0gcy5jaGFyQ29kZUF0KGkpXG4gICAgICB8IChzLmNoYXJDb2RlQXQoaSsxKSA8PCA4KVxuICAgICAgfCAocy5jaGFyQ29kZUF0KGkrMikgPDwgMTYpXG4gICAgICB8IChzLmNoYXJDb2RlQXQoaSszKSA8PCAyNCk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICB9XG4gIHcgPSAwO1xuICBzd2l0Y2ggKGxlbiAmIDMpIHtcbiAgY2FzZSAzOiB3ICA9IHMuY2hhckNvZGVBdChpKzIpIDw8IDE2O1xuICBjYXNlIDI6IHcgfD0gcy5jaGFyQ29kZUF0KGkrMSkgPDwgODtcbiAgY2FzZSAxOlxuICAgIHcgfD0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgZGVmYXVsdDpcbiAgfVxuICBoIF49IGxlbjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCwgcykge1xuICB2YXIgbGVuID0gcy5sZW5ndGgsIGksIHc7XG4gIGZvciAoaSA9IDA7IGkgKyA0IDw9IGxlbjsgaSArPSA0KSB7XG4gICAgdyA9IHNbaV1cbiAgICAgIHwgKHNbaSsxXSA8PCA4KVxuICAgICAgfCAoc1tpKzJdIDw8IDE2KVxuICAgICAgfCAoc1tpKzNdIDw8IDI0KTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIH1cbiAgdyA9IDA7XG4gIHN3aXRjaCAobGVuICYgMykge1xuICBjYXNlIDM6IHcgID0gc1tpKzJdIDw8IDE2O1xuICBjYXNlIDI6IHcgfD0gc1tpKzFdIDw8IDg7XG4gIGNhc2UgMTogdyB8PSBzW2ldO1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgZGVmYXVsdDpcbiAgfVxuICBoIF49IGxlbjtcbiAgcmV0dXJuIGg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfY29udGVudFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9ieXRlcyhoLCB2KSB7XG4gIHZhciBjb250ZW50ID0gY2FtbF9tbF9ieXRlc19jb250ZW50KHYpO1xuICBpZih0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIilcbiAgICByZXR1cm4gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsIGNvbnRlbnQpXG4gIGVsc2UgLyogQVJSQVkgKi9cbiAgICByZXR1cm4gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCwgY29udGVudCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsIHYpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHYpKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2ggbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9pc19tbF9zdHJpbmcsIGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBjYW1sX2hhc2hfbWl4X2ZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0LCBjYW1sX2hhc2hfbWl4X3N0cmluZywgY2FtbF9oYXNoX21peF9ieXRlcywgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuZnVuY3Rpb24gY2FtbF9oYXNoIChjb3VudCwgbGltaXQsIHNlZWQsIG9iaikge1xuICB2YXIgcXVldWUsIHJkLCB3ciwgc3osIG51bSwgaCwgdiwgaSwgbGVuO1xuICBzeiA9IGxpbWl0O1xuICBpZiAoc3ogPCAwIHx8IHN6ID4gMjU2KSBzeiA9IDI1NjtcbiAgbnVtID0gY291bnQ7XG4gIGggPSBzZWVkO1xuICBxdWV1ZSA9IFtvYmpdOyByZCA9IDA7IHdyID0gMTtcbiAgd2hpbGUgKHJkIDwgd3IgJiYgbnVtID4gMCkge1xuICAgIHYgPSBxdWV1ZVtyZCsrXTtcbiAgICBpZiAodiAmJiB2LmNhbWxfY3VzdG9tKXtcbiAgICAgIGlmKGNhbWxfY3VzdG9tX29wc1t2LmNhbWxfY3VzdG9tXSAmJiBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCkge1xuICAgICAgICB2YXIgaGggPSBjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0uaGFzaCh2KTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50IChoLCBoaCk7XG4gICAgICAgIG51bSAtLTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodiBpbnN0YW5jZW9mIEFycmF5ICYmIHZbMF0gPT09ICh2WzBdfDApKSB7XG4gICAgICBzd2l0Y2ggKHZbMF0pIHtcbiAgICAgIGNhc2UgMjQ4OlxuICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHZbMl0pO1xuICAgICAgICBudW0tLTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MDpcbiAgICAgICAgLy8gRm9yd2FyZFxuICAgICAgICBxdWV1ZVstLXJkXSA9IHZbMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHZbMF0pKSB7XG4gICAgICAgICAgLyogQWxsIGNvbnRpbnVhdGlvbnMgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSxcbiAgICAgICAgICAgICBzaW5jZSB3ZSBoYXZlIG5vIGlkZWEgaG93IHRvIGRpc3Rpbmd1aXNoIHRoZW0uICovXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRhZyA9ICgodi5sZW5ndGggLSAxKSA8PCAxMCkgfCB2WzBdO1xuICAgICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdGFnKTtcbiAgICAgICAgZm9yIChpID0gMSwgbGVuID0gdi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgIGlmICh3ciA+PSBzeikgYnJlYWs7XG4gICAgICAgICAgcXVldWVbd3IrK10gPSB2W2ldO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfYnl0ZXMoaCx2KVxuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh2KSkge1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsdilcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHYgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCx2KVxuICAgICAgbnVtLS07XG4gICAgfSBlbHNlIGlmICh2ID09PSAodnwwKSkge1xuICAgICAgLy8gSW50ZWdlclxuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHYrdisxKTtcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodiA9PT0gK3YpIHtcbiAgICAgIC8vIEZsb2F0XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLHYpO1xuICAgICAgbnVtLS07XG4gICAgfVxuICB9XG4gIGggPSBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpO1xuICByZXR1cm4gaCAmIDB4M0ZGRkZGRkY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2hhc2hcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfZmluYWwsIGNhbWxfaGFzaF9taXhfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19oYXNoKGgsIHYpe1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfc3RyaW5nKGgsdik7XG4gIHZhciBoID0gY2FtbF9oYXNoX21peF9maW5hbChoKTtcbiAgcmV0dXJuIGggJiAweDNGRkZGRkZGO1xufVxuIiwiLy9Qcm92aWRlczogQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQ2NFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnQ2NFxudmFyIEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50NjQgPSBjYW1sX2hhc2hfbWl4X2ludDY0O1xuLy9Qcm92aWRlczogQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG52YXIgQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQgPSBjYW1sX2hhc2hfbWl4X2ludDtcbi8vUHJvdmlkZXM6IEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfZmxvYXRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfZmxvYXRcbnZhciBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2Zsb2F0ID0gY2FtbF9oYXNoX21peF9mbG9hdDtcbi8vUHJvdmlkZXM6IEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X3N0cmluZ1xudmFyIEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfc3RyaW5nID0gY2FtbF9oYXNoX21peF9zdHJpbmc7XG4vL1Byb3ZpZGVzOiBCYXNlX2ludGVybmFsaGFzaF9nZXRfaGFzaF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9maW5hbFxuZnVuY3Rpb24gQmFzZV9pbnRlcm5hbGhhc2hfZ2V0X2hhc2hfdmFsdWUoc2VlZCkge1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoc2VlZCk7XG4gIHJldHVybiBoICYgMHgzRkZGRkZGRjtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBwYXJzaW5nLmMgODk4MyAyMDA4LTA4LTA2IDA5OjM4OjI1WiB4bGVyb3kgJCAqL1xuXG4vKiBUaGUgUERBIGF1dG9tYXRvbiBmb3IgcGFyc2VycyBnZW5lcmF0ZWQgYnkgY2FtbHlhY2MgKi9cblxuLyogVGhlIHB1c2hkb3duIGF1dG9tYXRhICovXG5cbi8vUHJvdmlkZXM6IGNhbWxfcGFyc2VyX3RyYWNlXG52YXIgY2FtbF9wYXJzZXJfdHJhY2UgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2VuZ2luZVxuLy9SZXF1aXJlczogY2FtbF9sZXhfYXJyYXksIGNhbWxfcGFyc2VyX3RyYWNlLGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX3BhcnNlX2VuZ2luZSh0YWJsZXMsIGVudiwgY21kLCBhcmcpXG57XG4gIHZhciBFUlJDT0RFID0gMjU2O1xuXG4gIC8vdmFyIFNUQVJUID0gMDtcbiAgLy92YXIgVE9LRU5fUkVBRCA9IDE7XG4gIC8vdmFyIFNUQUNLU19HUk9XTl8xID0gMjtcbiAgLy92YXIgU1RBQ0tTX0dST1dOXzIgPSAzO1xuICAvL3ZhciBTRU1BTlRJQ19BQ1RJT05fQ09NUFVURUQgPSA0O1xuICAvL3ZhciBFUlJPUl9ERVRFQ1RFRCA9IDU7XG4gIHZhciBsb29wID0gNjtcbiAgdmFyIHRlc3RzaGlmdCA9IDc7XG4gIHZhciBzaGlmdCA9IDg7XG4gIHZhciBzaGlmdF9yZWNvdmVyID0gOTtcbiAgdmFyIHJlZHVjZSA9IDEwO1xuXG4gIHZhciBSRUFEX1RPS0VOID0gMDtcbiAgdmFyIFJBSVNFX1BBUlNFX0VSUk9SID0gMTtcbiAgdmFyIEdST1dfU1RBQ0tTXzEgPSAyO1xuICB2YXIgR1JPV19TVEFDS1NfMiA9IDM7XG4gIHZhciBDT01QVVRFX1NFTUFOVElDX0FDVElPTiA9IDQ7XG4gIHZhciBDQUxMX0VSUk9SX0ZVTkNUSU9OID0gNTtcblxuICB2YXIgZW52X3Nfc3RhY2sgPSAxO1xuICB2YXIgZW52X3Zfc3RhY2sgPSAyO1xuICB2YXIgZW52X3N5bWJfc3RhcnRfc3RhY2sgPSAzO1xuICB2YXIgZW52X3N5bWJfZW5kX3N0YWNrID0gNDtcbiAgdmFyIGVudl9zdGFja3NpemUgPSA1O1xuICB2YXIgZW52X3N0YWNrYmFzZSA9IDY7XG4gIHZhciBlbnZfY3Vycl9jaGFyID0gNztcbiAgdmFyIGVudl9sdmFsID0gODtcbiAgdmFyIGVudl9zeW1iX3N0YXJ0ID0gOTtcbiAgdmFyIGVudl9zeW1iX2VuZCA9IDEwO1xuICB2YXIgZW52X2FzcCA9IDExO1xuICB2YXIgZW52X3J1bGVfbGVuID0gMTI7XG4gIHZhciBlbnZfcnVsZV9udW1iZXIgPSAxMztcbiAgdmFyIGVudl9zcCA9IDE0O1xuICB2YXIgZW52X3N0YXRlID0gMTU7XG4gIHZhciBlbnZfZXJyZmxhZyA9IDE2O1xuXG4gIC8vIHZhciBfdGJsX2FjdGlvbnMgPSAxO1xuICB2YXIgdGJsX3RyYW5zbF9jb25zdCA9IDI7XG4gIHZhciB0YmxfdHJhbnNsX2Jsb2NrID0gMztcbiAgdmFyIHRibF9saHMgPSA0O1xuICB2YXIgdGJsX2xlbiA9IDU7XG4gIHZhciB0YmxfZGVmcmVkID0gNjtcbiAgdmFyIHRibF9kZ290byA9IDc7XG4gIHZhciB0Ymxfc2luZGV4ID0gODtcbiAgdmFyIHRibF9yaW5kZXggPSA5O1xuICB2YXIgdGJsX2dpbmRleCA9IDEwO1xuICB2YXIgdGJsX3RhYmxlc2l6ZSA9IDExO1xuICB2YXIgdGJsX3RhYmxlID0gMTI7XG4gIHZhciB0YmxfY2hlY2sgPSAxMztcbiAgLy8gdmFyIF90YmxfZXJyb3JfZnVuY3Rpb24gPSAxNDtcbiAgdmFyIHRibF9uYW1lc19jb25zdCA9IDE1O1xuICB2YXIgdGJsX25hbWVzX2Jsb2NrID0gMTY7XG5cblxuICBmdW5jdGlvbiBsb2coeCkge1xuICAgIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh4ICsgXCJcXG5cIik7XG4gICAgY2FtbF9tbF9vdXRwdXQoMiwgcywgMCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRva2VuX25hbWUobmFtZXMsIG51bWJlcilcbiAge1xuICAgIHZhciBzdHIgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhuYW1lcyk7XG4gICAgaWYgKHN0clswXSA9PSAnXFx4MDAnKVxuICAgICAgcmV0dXJuIFwiPHVua25vd24gdG9rZW4+XCI7XG4gICAgcmV0dXJuIHN0ci5zcGxpdCgnXFx4MDAnKVtudW1iZXJdO1xuICB9XG5cbiAgZnVuY3Rpb24gcHJpbnRfdG9rZW4oc3RhdGUsIHRvaylcbiAge1xuICAgIHZhciB0b2tlbiwga2luZDtcbiAgICBpZiAodG9rIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRva2VuID0gdG9rZW5fbmFtZSh0YWJsZXNbdGJsX25hbWVzX2Jsb2NrXSwgdG9rWzBdKTtcbiAgICAgIGlmICh0eXBlb2YgdG9rWzFdID09IFwibnVtYmVyXCIpXG4gICAgICAgIGtpbmQgPSBcIlwiICsgdG9rWzFdO1xuICAgICAgZWxzZSBpZiAodHlwZW9mIHRva1sxXSA9PSBcInN0cmluZ1wiKVxuICAgICAgICBraW5kID0gdG9rWzFdXG4gICAgICBlbHNlIGlmICh0b2tbMV0gaW5zdGFuY2VvZiBNbEJ5dGVzKVxuICAgICAgICBraW5kID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh0b2tbMV0pXG4gICAgICBlbHNlXG4gICAgICAgIGtpbmQgPSBcIl9cIlxuICAgICAgbG9nKFwiU3RhdGUgXCIgKyBzdGF0ZSArIFwiOiByZWFkIHRva2VuIFwiICsgdG9rZW4gKyBcIihcIiArIGtpbmQgKyBcIilcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRva2VuID0gdG9rZW5fbmFtZSh0YWJsZXNbdGJsX25hbWVzX2NvbnN0XSwgdG9rKTtcbiAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVhZCB0b2tlbiBcIiArIHRva2VuKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRhYmxlcy5kZ290bykge1xuICAgIHRhYmxlcy5kZWZyZWQgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9kZWZyZWRdKTtcbiAgICB0YWJsZXMuc2luZGV4ID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0Ymxfc2luZGV4XSk7XG4gICAgdGFibGVzLmNoZWNrICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2NoZWNrXSk7XG4gICAgdGFibGVzLnJpbmRleCA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX3JpbmRleF0pO1xuICAgIHRhYmxlcy50YWJsZSAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF90YWJsZV0pO1xuICAgIHRhYmxlcy5sZW4gICAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9sZW5dKTtcbiAgICB0YWJsZXMubGhzICAgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfbGhzXSk7XG4gICAgdGFibGVzLmdpbmRleCA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2dpbmRleF0pO1xuICAgIHRhYmxlcy5kZ290byAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9kZ290b10pO1xuICB9XG5cbiAgdmFyIHJlcyA9IDAsIG4sIG4xLCBuMiwgc3RhdGUxO1xuXG4gIC8vIFJFU1RPUkVcbiAgdmFyIHNwID0gZW52W2Vudl9zcF07XG4gIHZhciBzdGF0ZSA9IGVudltlbnZfc3RhdGVdO1xuICB2YXIgZXJyZmxhZyA9IGVudltlbnZfZXJyZmxhZ107XG5cbiAgZXhpdDpmb3IgKDs7KSB7XG4gICAgbmV4dDpzd2l0Y2goY21kKSB7XG4gICAgY2FzZSAwOi8vU1RBUlQ6XG4gICAgICBzdGF0ZSA9IDA7XG4gICAgICBlcnJmbGFnID0gMDtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuXG4gICAgY2FzZSA2Oi8vbG9vcDpcbiAgICAgIG4gPSB0YWJsZXMuZGVmcmVkW3N0YXRlXTtcbiAgICAgIGlmIChuICE9IDApIHsgY21kID0gcmVkdWNlOyBicmVhazsgfVxuICAgICAgaWYgKGVudltlbnZfY3Vycl9jaGFyXSA+PSAwKSB7IGNtZCA9IHRlc3RzaGlmdDsgYnJlYWs7IH1cbiAgICAgIHJlcyA9IFJFQURfVE9LRU47XG4gICAgICBicmVhayBleGl0O1xuICAgICAgLyogVGhlIE1MIGNvZGUgY2FsbHMgdGhlIGxleGVyIGFuZCB1cGRhdGVzICovXG4gICAgICAvKiBzeW1iX3N0YXJ0IGFuZCBzeW1iX2VuZCAqL1xuICAgIGNhc2UgMTovL1RPS0VOX1JFQUQ6XG4gICAgICBpZiAoYXJnIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfYmxvY2tdW2FyZ1swXSArIDFdO1xuICAgICAgICBlbnZbZW52X2x2YWxdID0gYXJnWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gdGFibGVzW3RibF90cmFuc2xfY29uc3RdW2FyZyArIDFdO1xuICAgICAgICBlbnZbZW52X2x2YWxdID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSkgcHJpbnRfdG9rZW4gKHN0YXRlLCBhcmcpO1xuICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICBjYXNlIDc6Ly90ZXN0c2hpZnQ6XG4gICAgICBuMSA9IHRhYmxlcy5zaW5kZXhbc3RhdGVdO1xuICAgICAgbjIgPSBuMSArIGVudltlbnZfY3Vycl9jaGFyXTtcbiAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBlbnZbZW52X2N1cnJfY2hhcl0pIHtcbiAgICAgICAgY21kID0gc2hpZnQ7IGJyZWFrO1xuICAgICAgfVxuICAgICAgbjEgPSB0YWJsZXMucmluZGV4W3N0YXRlXTtcbiAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT0gZW52W2Vudl9jdXJyX2NoYXJdKSB7XG4gICAgICAgIG4gPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgICBjbWQgPSByZWR1Y2U7IGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGVycmZsYWcgPD0gMCkge1xuICAgICAgICByZXMgPSBDQUxMX0VSUk9SX0ZVTkNUSU9OO1xuICAgICAgICBicmVhayBleGl0O1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSBjYWxscyB0aGUgZXJyb3IgZnVuY3Rpb24gKi9cbiAgICBjYXNlIDU6Ly9FUlJPUl9ERVRFQ1RFRDpcbiAgICAgIGlmIChlcnJmbGFnIDwgMykge1xuICAgICAgICBlcnJmbGFnID0gMztcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIHN0YXRlMSA9IGVudltlbnZfc19zdGFja11bc3AgKyAxXTtcbiAgICAgICAgICBuMSA9IHRhYmxlcy5zaW5kZXhbc3RhdGUxXTtcbiAgICAgICAgICBuMiA9IG4xICsgRVJSQ09ERTtcbiAgICAgICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09IEVSUkNPREUpIHtcbiAgICAgICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgICAgICAgbG9nKFwiUmVjb3ZlcmluZyBpbiBzdGF0ZSBcIiArIHN0YXRlMSk7XG4gICAgICAgICAgICBjbWQgPSBzaGlmdF9yZWNvdmVyOyBicmVhayBuZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgICAgICAgIGxvZyhcIkRpc2NhcmRpbmcgc3RhdGUgXCIgKyBzdGF0ZTEpO1xuICAgICAgICAgICAgaWYgKHNwIDw9IGVudltlbnZfc3RhY2tiYXNlXSkge1xuICAgICAgICAgICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgICAgICAgICAgbG9nKFwiTm8gbW9yZSBzdGF0ZXMgdG8gZGlzY2FyZFwiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFJBSVNFX1BBUlNFX0VSUk9SO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgICAgICBzcC0tO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGVudltlbnZfY3Vycl9jaGFyXSA9PSAwKVxuICAgICAgICAgIHJldHVybiBSQUlTRV9QQVJTRV9FUlJPUjsgLyogVGhlIE1MIGNvZGUgcmFpc2VzIFBhcnNlX2Vycm9yICovXG4gICAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgICBsb2coXCJEaXNjYXJkaW5nIGxhc3QgdG9rZW4gcmVhZFwiKTtcbiAgICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICAgIGNtZCA9IGxvb3A7IGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgY2FzZSA4Oi8vc2hpZnQ6XG4gICAgICBlbnZbZW52X2N1cnJfY2hhcl0gPSAtMTtcbiAgICAgIGlmIChlcnJmbGFnID4gMCkgZXJyZmxhZy0tO1xuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgY2FzZSA5Oi8vc2hpZnRfcmVjb3ZlcjpcbiAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgbG9nKFwiU3RhdGUgXCIgKyBzdGF0ZSArIFwiOiBzaGlmdCB0byBzdGF0ZSBcIiArIHRhYmxlcy50YWJsZVtuMl0pO1xuICAgICAgc3RhdGUgPSB0YWJsZXMudGFibGVbbjJdO1xuICAgICAgc3ArKztcbiAgICAgIGlmIChzcCA+PSBlbnZbZW52X3N0YWNrc2l6ZV0pIHtcbiAgICAgICAgcmVzID0gR1JPV19TVEFDS1NfMTtcbiAgICAgICAgYnJlYWsgZXhpdDtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgcmVzaXplcyB0aGUgc3RhY2tzICovXG4gICAgY2FzZSAyOi8vU1RBQ0tTX0dST1dOXzE6XG4gICAgICBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV0gPSBzdGF0ZTtcbiAgICAgIGVudltlbnZfdl9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfbHZhbF07XG4gICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfc3RhcnRdO1xuICAgICAgZW52W2Vudl9zeW1iX2VuZF9zdGFja11bc3AgKyAxXSA9IGVudltlbnZfc3ltYl9lbmRdO1xuICAgICAgY21kID0gbG9vcDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAxMDovL3JlZHVjZTpcbiAgICAgIGlmIChjYW1sX3BhcnNlcl90cmFjZSlcbiAgICAgICAgbG9nKFwiU3RhdGUgXCIgKyBzdGF0ZSArIFwiOiByZWR1Y2UgYnkgcnVsZSBcIiArIG4pO1xuICAgICAgdmFyIG0gPSB0YWJsZXMubGVuW25dO1xuICAgICAgZW52W2Vudl9hc3BdID0gc3A7XG4gICAgICBlbnZbZW52X3J1bGVfbnVtYmVyXSA9IG47XG4gICAgICBlbnZbZW52X3J1bGVfbGVuXSA9IG07XG4gICAgICBzcCA9IHNwIC0gbSArIDE7XG4gICAgICBtID0gdGFibGVzLmxoc1tuXTtcbiAgICAgIHN0YXRlMSA9IGVudltlbnZfc19zdGFja11bc3BdO1xuICAgICAgbjEgPSB0YWJsZXMuZ2luZGV4W21dO1xuICAgICAgbjIgPSBuMSArIHN0YXRlMTtcbiAgICAgIGlmIChuMSAhPSAwICYmIG4yID49IDAgJiYgbjIgPD0gdGFibGVzW3RibF90YWJsZXNpemVdICYmXG4gICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBzdGF0ZTEpXG4gICAgICAgIHN0YXRlID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgIGVsc2VcbiAgICAgICAgc3RhdGUgPSB0YWJsZXMuZGdvdG9bbV07XG4gICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgIHJlcyA9IEdST1dfU1RBQ0tTXzI7XG4gICAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgIGNhc2UgMzovL1NUQUNLU19HUk9XTl8yOlxuICAgICAgcmVzID0gQ09NUFVURV9TRU1BTlRJQ19BQ1RJT047XG4gICAgICBicmVhayBleGl0O1xuICAgICAgLyogVGhlIE1MIGNvZGUgY2FsbHMgdGhlIHNlbWFudGljIGFjdGlvbiAqL1xuICAgIGNhc2UgNDovL1NFTUFOVElDX0FDVElPTl9DT01QVVRFRDpcbiAgICAgIGVudltlbnZfc19zdGFja11bc3AgKyAxXSA9IHN0YXRlO1xuICAgICAgZW52W2Vudl92X3N0YWNrXVtzcCArIDFdID0gYXJnO1xuICAgICAgdmFyIGFzcCA9IGVudltlbnZfYXNwXTtcbiAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgIGlmIChzcCA+IGFzcCkge1xuICAgICAgICAvKiBUaGlzIGlzIGFuIGVwc2lsb24gcHJvZHVjdGlvbi4gVGFrZSBzeW1iX3N0YXJ0IGVxdWFsIHRvIHN5bWJfZW5kLiAqL1xuICAgICAgICBlbnZbZW52X3N5bWJfc3RhcnRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVthc3AgKyAxXTtcbiAgICAgIH1cbiAgICAgIGNtZCA9IGxvb3A7IGJyZWFrO1xuICAgICAgLyogU2hvdWxkIG5vdCBoYXBwZW4gKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFJBSVNFX1BBUlNFX0VSUk9SO1xuICAgIH1cbiAgfVxuICAvLyBTQVZFXG4gIGVudltlbnZfc3BdID0gc3A7XG4gIGVudltlbnZfc3RhdGVdID0gc3RhdGU7XG4gIGVudltlbnZfZXJyZmxhZ10gPSBlcnJmbGFnO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NldF9wYXJzZXJfdHJhY2UgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2VyX3RyYWNlXG5mdW5jdGlvbiBjYW1sX3NldF9wYXJzZXJfdHJhY2UoYm9vbCkge1xuICB2YXIgb2xkZmxhZyA9IGNhbWxfcGFyc2VyX3RyYWNlO1xuICBjYW1sX3BhcnNlcl90cmFjZSA9IGJvb2w7XG4gIHJldHVybiBvbGRmbGFnO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF91cGRhdGVfZHVtbXlcbmZ1bmN0aW9uIGNhbWxfdXBkYXRlX2R1bW15ICh4LCB5KSB7XG4gIGlmKCB0eXBlb2YgeT09PVwiZnVuY3Rpb25cIiApIHsgeC5mdW4gPSB5OyByZXR1cm4gMDsgfVxuICBpZiggeS5mdW4gKSB7IHguZnVuID0geS5mdW47IHJldHVybiAwOyB9XG4gIHZhciBpID0geS5sZW5ndGg7IHdoaWxlIChpLS0pIHhbaV0gPSB5W2ldOyByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19kdW1teV9pbmZpeFxuLy9SZXF1aXJlczogY2FtbF9jYWxsX2dlblxuZnVuY3Rpb24gY2FtbF9hbGxvY19kdW1teV9pbmZpeCAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmICh4KSB7IHJldHVybiBjYW1sX2NhbGxfZ2VuKGYuZnVuLCBbeF0pIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfaXNfYmxvY2sgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfaXNfYmxvY2sgKHgpIHsgcmV0dXJuICsoeCBpbnN0YW5jZW9mIEFycmF5KTsgfVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9pc19tbF9ieXRlcywgY2FtbF9pc19tbF9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfb2JqX3RhZyAoeCkge1xuICBpZiAoKHggaW5zdGFuY2VvZiBBcnJheSkgJiYgeFswXSA9PSAoeFswXSA+Pj4gMCkpXG4gICAgcmV0dXJuIHhbMF1cbiAgZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyh4KSlcbiAgICByZXR1cm4gMjUyXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHgpKVxuICAgIHJldHVybiAyNTJcbiAgZWxzZSBpZiAoKHggaW5zdGFuY2VvZiBGdW5jdGlvbikgfHwgdHlwZW9mIHggPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiAyNDdcbiAgZWxzZSBpZiAoeCAmJiB4LmNhbWxfY3VzdG9tKVxuICAgIHJldHVybiAyNTVcbiAgZWxzZVxuICAgIHJldHVybiAxMDAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3NldF90YWcgKG11dGFibGUsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfc2V0X3RhZyAoeCwgdGFnKSB7IHhbMF0gPSB0YWc7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX29ial9ibG9jayBjb25zdCAoY29uc3QsY29uc3QpXG5mdW5jdGlvbiBjYW1sX29ial9ibG9jayAodGFnLCBzaXplKSB7XG4gIHZhciBvID0gbmV3IEFycmF5KHNpemUrMSk7XG4gIG9bMF09dGFnO1xuICBmb3IgKHZhciBpID0gMTsgaSA8PSBzaXplOyBpKyspIG9baV0gPSAwO1xuICByZXR1cm4gbztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfd2l0aF90YWdcbmZ1bmN0aW9uIGNhbWxfb2JqX3dpdGhfdGFnKHRhZyx4KSB7XG4gIHZhciBsID0geC5sZW5ndGg7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gdGFnO1xuICBmb3IodmFyIGkgPSAxOyBpIDwgbDsgaSsrICkgYVtpXSA9IHhbaV07XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9kdXAgbXV0YWJsZSAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfb2JqX2R1cCAoeCkge1xuICB2YXIgbCA9IHgubGVuZ3RoO1xuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGw7IGkrKyApIGFbaV0gPSB4W2ldO1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfdHJ1bmNhdGUgKG11dGFibGUsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX29ial90cnVuY2F0ZSAoeCwgcykge1xuICBpZiAoczw9MCB8fCBzICsgMSA+IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJPYmoudHJ1bmNhdGVcIik7XG4gIGlmICh4Lmxlbmd0aCAhPSBzICsgMSkgeC5sZW5ndGggPSBzICsgMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX21ha2VfZm9yd2FyZFxuZnVuY3Rpb24gY2FtbF9vYmpfbWFrZV9mb3J3YXJkIChiLHYpIHtcbiAgYlswXT0yNTA7XG4gIGJbMV09djtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcFxuZnVuY3Rpb24gY2FtbF9vYmpfY29tcGFyZV9hbmRfc3dhcCh4LGksb2xkLG4pe1xuICBpZih4W2krMV0gPT0gb2xkKSB7XG4gICAgeFtpKzFdID0gbjtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9pc19zaGFyZWRcbmZ1bmN0aW9uIGNhbWxfb2JqX2lzX3NoYXJlZCh4KXtcbiAgcmV0dXJuIDFcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X21ha2VfZm9yd2FyZCBjb25zdCAobXV0YWJsZSlcbmZ1bmN0aW9uIGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQgKHYpIHsgcmV0dXJuIFsyNTAsIHZdOyB9XG5cbi8vLy8vLy8vLy8vLy8gQ2FtbGludGVybmFsT09cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X3B1YmxpY19tZXRob2QgY29uc3RcbnZhciBjYW1sX21ldGhvZF9jYWNoZSA9IFtdO1xuZnVuY3Rpb24gY2FtbF9nZXRfcHVibGljX21ldGhvZCAob2JqLCB0YWcsIGNhY2hlaWQpIHtcbiAgdmFyIG1ldGhzID0gb2JqWzFdO1xuICB2YXIgb2ZzID0gY2FtbF9tZXRob2RfY2FjaGVbY2FjaGVpZF07XG4gIGlmIChvZnMgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGUgYXJyYXkgaXMgbm90IHNwYXJzZVxuICAgIGZvciAodmFyIGkgPSBjYW1sX21ldGhvZF9jYWNoZS5sZW5ndGg7IGkgPCBjYWNoZWlkOyBpKyspXG4gICAgICBjYW1sX21ldGhvZF9jYWNoZVtpXSA9IDA7XG4gIH0gZWxzZSBpZiAobWV0aHNbb2ZzXSA9PT0gdGFnKSB7XG4gICAgcmV0dXJuIG1ldGhzW29mcyAtIDFdO1xuICB9XG4gIHZhciBsaSA9IDMsIGhpID0gbWV0aHNbMV0gKiAyICsgMSwgbWk7XG4gIHdoaWxlIChsaSA8IGhpKSB7XG4gICAgbWkgPSAoKGxpK2hpKSA+PiAxKSB8IDE7XG4gICAgaWYgKHRhZyA8IG1ldGhzW21pKzFdKSBoaSA9IG1pLTI7XG4gICAgZWxzZSBsaSA9IG1pO1xuICB9XG4gIGNhbWxfbWV0aG9kX2NhY2hlW2NhY2hlaWRdID0gbGkgKyAxO1xuICAvKiByZXR1cm4gMCBpZiB0YWcgaXMgbm90IHRoZXJlICovXG4gIHJldHVybiAodGFnID09IG1ldGhzW2xpKzFdID8gbWV0aHNbbGldIDogMCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb29fbGFzdF9pZFxudmFyIGNhbWxfb29fbGFzdF9pZCA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfc2V0X29vX2lkXG4vL1JlcXVpcmVzOiBjYW1sX29vX2xhc3RfaWRcbmZ1bmN0aW9uIGNhbWxfc2V0X29vX2lkIChiKSB7XG4gIGJbMl09Y2FtbF9vb19sYXN0X2lkKys7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZyZXNoX29vX2lkIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX29vX2xhc3RfaWRcbmZ1bmN0aW9uIGNhbWxfZnJlc2hfb29faWQoKSB7XG4gIHJldHVybiBjYW1sX29vX2xhc3RfaWQrKztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfcmF3X2ZpZWxkXG5mdW5jdGlvbiBjYW1sX29ial9yYXdfZmllbGQobyxpKSB7IHJldHVybiBvW2krMV0gfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9zZXRfcmF3X2ZpZWxkXG5mdW5jdGlvbiBjYW1sX29ial9zZXRfcmF3X2ZpZWxkKG8saSx2KSB7IHJldHVybiBvW2krMV0gPSB2IH1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzXG5mdW5jdGlvbiBjYW1sX29ial9yZWFjaGFibGVfd29yZHMobykgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9hZGRfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX29ial9hZGRfb2Zmc2V0KHYsb2Zmc2V0KSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJPYmouYWRkX29mZnNldCBpcyBub3Qgc3VwcG9ydGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial91cGRhdGVfdGFnXG5mdW5jdGlvbiBjYW1sX29ial91cGRhdGVfdGFnKGIsbyxuKSB7XG4gICAgaWYoYlswXT09bykgeyBiWzBdID0gbjsgcmV0dXJuIDEgfVxuICAgIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZ1xuLy9SZXF1aXJlczogY2FtbF9vYmpfdGFnLCBjYW1sX29ial91cGRhdGVfdGFnLCBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5cbmZ1bmN0aW9uIGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZyhvKSB7XG4gIHZhciB0ID0gY2FtbF9vYmpfdGFnKG8pO1xuICBpZih0ICE9IDI0NiAmJiB0ICE9IDI1MCAmJiB0ICE9IDI0NClcbiAgICByZXR1cm4gNFxuICBpZihjYW1sX29ial91cGRhdGVfdGFnKG8sIDI0NiwgMjQ0KSkge1xuICAgIHJldHVybiAwXG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpZWxkMCA9IG9bMV07XG4gICAgdCA9IG9bMF1cbiAgICBpZih0ID09IDI0NCkge1xuICAgICAgaWYoZmllbGQwID09IGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbigwKSlcbiAgICAgICAgcmV0dXJuIDFcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIDJcbiAgICB9IGVsc2UgaWYgKHQgPT0gMjUwKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXNzZXJ0IHQgPSBsYXp5X3RhZ1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV91cGRhdGVfdG9fZm9yd2FyZFxuLy9SZXF1aXJlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuICBmdW5jdGlvbiBjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcndhcmQobykge1xuICBjYW1sX29ial91cGRhdGVfdGFnKG8sMjQ0LDI1MCk7XG4gIHJldHVybiAwOyAvLyB1bml0XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X3Jlc2V0X3RvX2xhenlcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3VwZGF0ZV90YWdcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZXNldF90b19sYXp5KG8pIHtcbiAgY2FtbF9vYmpfdXBkYXRlX3RhZyhvLDI0NCwyNDYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sYXp5X3JlYWRfcmVzdWx0XG4vL1JlcXVpcmVzOiBjYW1sX29ial90YWdcbmZ1bmN0aW9uIGNhbWxfbGF6eV9yZWFkX3Jlc3VsdChvKSB7XG4gIHJldHVybiAoY2FtbF9vYmpfdGFnKG8pID09IDI1MCk/b1sxXTpvO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xuLy9WZXJzaW9uOiA8IDVcbmZ1bmN0aW9uIGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbi8vVmVyc2lvbjogPj0gNVxuZnVuY3Rpb24gY2FtbF9pc19jb250aW51YXRpb25fdGFnKHQpIHtcbiAgcmV0dXJuICh0ID09IDI0NSkgPyAxIDogMDtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc1xudmFyIGNhbWxfZG9tYWluX2RscyA9IFswXTtcblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzX3NldFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5fZGxzXG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfc2V0KGEpIHtcbiAgY2FtbF9kb21haW5fZGxzID0gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fZGxzX2dldFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5fZGxzXG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9kbHNfZ2V0KHVuaXQpIHtcbiAgcmV0dXJuIGNhbWxfZG9tYWluX2Rscztcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19sb2FkXG5mdW5jdGlvbiBjYW1sX2F0b21pY19sb2FkKHJlZil7XG4gIHJldHVybiByZWZbMV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2Nhc1xuZnVuY3Rpb24gY2FtbF9hdG9taWNfY2FzKHJlZixvLG4pIHtcbiAgaWYocmVmWzFdID09PSBvKXtcbiAgICByZWZbMV0gPSBuO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19mZXRjaF9hZGRcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2ZldGNoX2FkZChyZWYsIGkpIHtcbiAgdmFyIG9sZCA9IHJlZlsxXTtcbiAgcmVmWzFdICs9IGk7XG4gIHJldHVybiBvbGQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXRvbWljX2V4Y2hhbmdlXG5mdW5jdGlvbiBjYW1sX2F0b21pY19leGNoYW5nZShyZWYsIHYpIHtcbiAgdmFyIHIgPSByZWZbMV07XG4gIHJlZlsxXSA9IHY7XG4gIHJldHVybiByO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5cbnZhciBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW5fID0gWzBdXG5mdW5jdGlvbiBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW4odW5pdCkge1xuICByZXR1cm4gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuX1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZG9tYWluX3NldF9uYW1lXG5mdW5jdGlvbiBjYW1sX21sX2RvbWFpbl9zZXRfbmFtZShfbmFtZSkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWNvbW1lbmRlZF9kb21haW5fY291bnRcbmZ1bmN0aW9uIGNhbWxfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50KHVuaXQpIHsgcmV0dXJuIDEgfVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2lkXG52YXIgY2FtbF9kb21haW5faWQgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2RvbWFpbl9zcGF3blxuLy9SZXF1aXJlczogY2FtbF9tbF9tdXRleF91bmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2lkXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG52YXIgY2FtbF9kb21haW5fbGF0ZXN0X2lkeCA9IDFcbmZ1bmN0aW9uIGNhbWxfZG9tYWluX3NwYXduKGYsbXV0ZXgpe1xuICAgIHZhciBpZCA9IGNhbWxfZG9tYWluX2xhdGVzdF9pZHgrKztcbiAgICB2YXIgb2xkID0gY2FtbF9kb21haW5faWQ7XG4gICAgY2FtbF9kb21haW5faWQgPSBpZDtcbiAgICBjYW1sX2NhbGxiYWNrKGYsWzBdKTtcbiAgICBjYW1sX2RvbWFpbl9pZCA9IG9sZDtcbiAgICBjYW1sX21sX211dGV4X3VubG9jayhtdXRleCk7XG4gICAgcmV0dXJuIGlkO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZG9tYWluX2lkXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5faWQodW5pdCl7XG4gICAgcmV0dXJuIGNhbWxfZG9tYWluX2lkO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZG9tYWluX2NwdV9yZWxheFxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4KHVuaXQpe1xuICAgIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF90YWdcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfc3RyaW5nLCBjYW1sX2lzX21sX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2NvbXBhcmVfdmFsX3RhZyhhKXtcbiAgaWYgKHR5cGVvZiBhID09PSBcIm51bWJlclwiKSByZXR1cm4gMTAwMDsgLy8gaW50X3RhZyAod2UgdXNlIGl0IGZvciBhbGwgbnVtYmVycylcbiAgZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyhhKSkgcmV0dXJuIDI1MjsgLy8gc3RyaW5nX3RhZ1xuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyhhKSkgcmV0dXJuIDEyNTI7IC8vIG9jYW1sIHN0cmluZyAoaWYgZGlmZmVyZW50IGZyb20gYnl0ZXMpXG4gIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBBcnJheSAmJiBhWzBdID09PSAoYVswXT4+PjApICYmIGFbMF0gPD0gMjU1KSB7XG4gICAgLy8gTG9vayBsaWtlIGFuIG9jYW1sIGJsb2NrXG4gICAgdmFyIHRhZyA9IGFbMF0gfCAwO1xuICAgIC8vIGlnbm9yZSBkb3VibGVfYXJyYXlfdGFnIGJlY2F1c2Ugd2UgY2Fubm90IGFjY3VyYXRlbHkgc2V0XG4gICAgLy8gdGhpcyB0YWcgd2hlbiB3ZSBjcmVhdGUgYW4gYXJyYXkgb2YgZmxvYXQuXG4gICAgcmV0dXJuICh0YWcgPT0gMjU0KT8wOnRhZ1xuICB9XG4gIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBTdHJpbmcpIHJldHVybiAxMjUyMDsgLy8gamF2YXNjcmlwdCBzdHJpbmcsIGxpa2Ugc3RyaW5nX3RhZyAoMjUyKVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PSBcInN0cmluZ1wiKSByZXR1cm4gMTI1MjA7IC8vIGphdmFzY3JpcHQgc3RyaW5nLCBsaWtlIHN0cmluZ190YWcgKDI1MilcbiAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIE51bWJlcikgcmV0dXJuIDEwMDA7IC8vIGludF90YWcgKHdlIHVzZSBpdCBmb3IgYWxsIG51bWJlcnMpXG4gIGVsc2UgaWYgKGEgJiYgYS5jYW1sX2N1c3RvbSkgcmV0dXJuIDEyNTU7IC8vIGxpa2UgY3VzdG9tX3RhZyAoMjU1KVxuICBlbHNlIGlmIChhICYmIGEuY29tcGFyZSkgcmV0dXJuIDEyNTY7IC8vIGxpa2UgY3VzdG9tX3RhZyAoMjU1KVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PSBcImZ1bmN0aW9uXCIpIHJldHVybiAxMjQ3OyAvLyBsaWtlIGNsb3N1cmVfdGFnICgyNDcpXG4gIGVsc2UgaWYgKHR5cGVvZiBhID09IFwic3ltYm9sXCIpIHJldHVybiAxMjUxO1xuICByZXR1cm4gMTAwMTsgLy9vdXRfb2ZfaGVhcF90YWdcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2N1c3RvbV9vcHNcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShhKXtcbiAgcmV0dXJuIGNhbWxfY3VzdG9tX29wc1thLmNhbWxfY3VzdG9tXSAmJiBjYW1sX2N1c3RvbV9vcHNbYS5jYW1sX2N1c3RvbV0uY29tcGFyZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b21cbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbShudW0sIGN1c3RvbSwgc3dhcCwgdG90YWwpIHtcbiAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oY3VzdG9tKTtcbiAgaWYoY29tcCkge1xuICAgIHZhciB4ID0gKHN3YXAgPiAwKT9jb21wKGN1c3RvbSxudW0sdG90YWwpOmNvbXAobnVtLGN1c3RvbSx0b3RhbCk7XG4gICAgaWYodG90YWwgJiYgeCAhPSB4KSByZXR1cm4gc3dhcDsgLy8gdG90YWwgJiYgbmFuXG4gICAgaWYoK3ggIT0gK3gpIHJldHVybiAreDsgLy8gbmFuXG4gICAgaWYoKHggfCAwKSAhPSAwKSByZXR1cm4gKHggfCAwKTsgLy8gIW5hblxuICB9XG4gIHJldHVybiBzd2FwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWwgKGNvbnN0LCBjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ludF9jb21wYXJlLCBjYW1sX3N0cmluZ19jb21wYXJlLCBjYW1sX2J5dGVzX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tLCBjYW1sX2NvbXBhcmVfdmFsX3RhZ1xuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbmZ1bmN0aW9uIGNhbWxfY29tcGFyZV92YWwgKGEsIGIsIHRvdGFsKSB7XG4gIHZhciBzdGFjayA9IFtdO1xuICBmb3IoOzspIHtcbiAgICBpZiAoISh0b3RhbCAmJiBhID09PSBiKSkge1xuICAgICAgdmFyIHRhZ19hID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSk7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZih0YWdfYSA9PSAyNTApIHsgYSA9IGFbMV07IGNvbnRpbnVlIH1cblxuICAgICAgdmFyIHRhZ19iID0gY2FtbF9jb21wYXJlX3ZhbF90YWcoYik7XG4gICAgICAvLyBmb3J3YXJkX3RhZyA/XG4gICAgICBpZih0YWdfYiA9PSAyNTApIHsgYiA9IGJbMV07IGNvbnRpbnVlIH1cblxuICAgICAgLy8gdGFncyBhcmUgZGlmZmVyZW50XG4gICAgICBpZih0YWdfYSAhPT0gdGFnX2IpIHtcbiAgICAgICAgaWYodGFnX2EgPT0gMTAwMCkge1xuICAgICAgICAgIGlmKHRhZ19iID09IDEyNTUpIHsgLy9pbW1lZGlhdGUgY2FuIGNvbXBhcmUgYWdhaW5zdCBjdXN0b21cbiAgICAgICAgICAgIHJldHVybiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20oYSwgYiwgLTEsIHRvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgaWYodGFnX2IgPT0gMTAwMCkge1xuICAgICAgICAgIGlmKHRhZ19hID09IDEyNTUpIHsgLy9pbW1lZGlhdGUgY2FuIGNvbXBhcmUgYWdhaW5zdCBjdXN0b21cbiAgICAgICAgICAgIHJldHVybiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20oYiwgYSwgMSwgdG90YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAodGFnX2EgPCB0YWdfYik/LTE6MTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCh0YWdfYSl7XG4gICAgICAgIC8vIDI0NjogTGF6eV90YWcgaGFuZGxlZCBiZWxsb3dcbiAgICAgIGNhc2UgMjQ3OiAvLyBDbG9zdXJlX3RhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGZ1bmN0aW9uYWwgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDI0ODogLy8gT2JqZWN0XG4gICAgICAgIHZhciB4ID0gY2FtbF9pbnRfY29tcGFyZShhWzJdLCBiWzJdKTtcbiAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNDk6IC8vIEluZml4XG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW5cbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogZnVuY3Rpb25hbCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjUwOiAvLyBGb3J3YXJkIHRhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuLCBoYW5kbGVkIGFib3ZlXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgRm9yd2FyZF90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUxOiAvL0Fic3RyYWN0XG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBhYnN0cmFjdCB2YWx1ZVwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MjogLy8gT0NhbWwgYnl0ZXNcbiAgICAgICAgaWYgKGEgIT09IGIpIHtcbiAgICAgICAgICB2YXIgeCA9IGNhbWxfYnl0ZXNfY29tcGFyZShhLCBiKTtcbiAgICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MzogLy8gRG91YmxlX3RhZ1xuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgRG91YmxlX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheV90YWdcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlbiwgaGFuZGxlZCBhYm92ZVxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IERvdWJsZV9hcnJheV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyNTU6IC8vIEN1c3RvbV90YWdcbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBDdXN0b21fdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNDc6IC8vIEZ1bmN0aW9uXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGZ1bmN0aW9uYWwgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU1OiAvLyBDdXN0b21cbiAgICAgICAgdmFyIGNvbXAgPSBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oYSk7XG4gICAgICAgIGlmKGNvbXAgIT0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGIpKXtcbiAgICAgICAgICByZXR1cm4gKGEuY2FtbF9jdXN0b208Yi5jYW1sX2N1c3RvbSk/LTE6MTtcbiAgICAgICAgfVxuICAgICAgICBpZighY29tcClcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBhYnN0cmFjdCB2YWx1ZVwiKTtcbiAgICAgICAgdmFyIHggPSBjb21wKGEsYix0b3RhbCk7XG4gICAgICAgIGlmKHggIT0geCl7IC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIFVOT1JERVJFRFxuICAgICAgICAgIHJldHVybiB0b3RhbD8tMTp4O1xuICAgICAgICB9XG4gICAgICAgIGlmKHggIT09ICh4fDApKXsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjU2OiAvLyBjb21wYXJlIGZ1bmN0aW9uXG4gICAgICAgIHZhciB4ID0gYS5jb21wYXJlKGIsdG90YWwpO1xuICAgICAgICBpZih4ICE9IHgpIHsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgVU5PUkRFUkVEXG4gICAgICAgICAgcmV0dXJuIHRvdGFsPy0xOng7XG4gICAgICAgIH1cbiAgICAgICAgaWYoeCAhPT0gKHh8MCkpeyAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCByZXR1cm4gdmFsdWVcbiAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCAhPSAwKSByZXR1cm4gKHggfCAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwMDA6IC8vIE51bWJlclxuICAgICAgICBhID0gK2E7XG4gICAgICAgIGIgPSArYjtcbiAgICAgICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgICAgIGlmIChhID4gYikgcmV0dXJuIDE7XG4gICAgICAgIGlmIChhICE9IGIpIHtcbiAgICAgICAgICBpZiAoIXRvdGFsKSByZXR1cm4gTmFOO1xuICAgICAgICAgIGlmIChhID09IGEpIHJldHVybiAxO1xuICAgICAgICAgIGlmIChiID09IGIpIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTAwMTogLy8gVGhlIHJlc3RcbiAgICAgICAgLy8gSGVyZSB3ZSBjYW4gYmUgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgICAgICAgLy8gMS4gSmF2YVNjcmlwdCBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy8gMi4gSmF2YVNjcmlwdCBvYmplY3QgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy8gMy4gSmF2YVNjcmlwdCBvYmplY3QgdGhhbiBjYW5ub3QgYmUgY29lcmNlZCB0byBwcmltaXRpdmUgdHlwZXNcbiAgICAgICAgLy9cbiAgICAgICAgLy8gKDMpIHdpbGwgcmFpc2UgYSBbVHlwZUVycm9yXVxuICAgICAgICAvLyAoMikgd2lsbCBjb2VyY2UgdG8gcHJpbWl0aXZlIHR5cGVzIHVzaW5nIFt2YWx1ZU9mXSBvciBbdG9TdHJpbmddXG4gICAgICAgIC8vICgyKSBhbmQgKDMpLCBhZnRlciBldmVudHVhbCBjb2VyY2lvblxuICAgICAgICAvLyAtIGlmIGEgYW5kIGIgYXJlIHN0cmluZ3MsIGFwcGx5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvblxuICAgICAgICAvLyAtIGlmIGEgb3IgYiBhcmUgbm90IHN0cmluZ3MsIGNvbnZlcnQgYSBhbmQgYiB0byBudW1iZXJcbiAgICAgICAgLy8gICBhbmQgYXBwbHkgc3RhbmRhcmQgY29tcGFyaXNvblxuICAgICAgICAvL1xuICAgICAgICAvLyBFeGNlcHRpb246IGAhPWAgd2lsbCBub3QgY29lcmNlL2NvbnZlcnQgaWYgYm90aCBhIGFuZCBiIGFyZSBvYmplY3RzXG4gICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICBpZiAoYSAhPSBiKSB7XG4gICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgICBpZiAoYSA9PSBhKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYiA9PSBiKSByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTE6IC8vIEphdmFTY3JpcHQgU3ltYm9sLCBubyBvcmRlcmluZy5cbiAgICAgICAgaWYoYSAhPT0gYikge1xuICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOYU47XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTI6IC8vIG9jYW1sIHN0cmluZ3NcbiAgICAgICAgdmFyIGEgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGEpO1xuICAgICAgICB2YXIgYiA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoYik7XG4gICAgICAgIGlmKGEgIT09IGIpIHtcbiAgICAgICAgICBpZihhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1MjA6IC8vIGphdmFzY3JpcHQgc3RyaW5nc1xuICAgICAgICB2YXIgYSA9IGEudG9TdHJpbmcoKTtcbiAgICAgICAgdmFyIGIgPSBiLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmKGEgIT09IGIpIHtcbiAgICAgICAgICBpZihhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICAgIGlmKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjQ2OiAvLyBMYXp5X3RhZ1xuICAgICAgY2FzZSAyNTQ6IC8vIERvdWJsZV9hcnJheVxuICAgICAgZGVmYXVsdDogLy8gQmxvY2sgd2l0aCBvdGhlciB0YWdcbiAgICAgICAgaWYoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHRhZ19hKSkge1xuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGNvbnRpbnVhdGlvbiB2YWx1ZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiAoYS5sZW5ndGggPCBiLmxlbmd0aCk/LTE6MTtcbiAgICAgICAgaWYgKGEubGVuZ3RoID4gMSkgc3RhY2sucHVzaChhLCBiLCAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFjay5sZW5ndGggPT0gMCkgcmV0dXJuIDA7XG4gICAgdmFyIGkgPSBzdGFjay5wb3AoKTtcbiAgICBiID0gc3RhY2sucG9wKCk7XG4gICAgYSA9IHN0YWNrLnBvcCgpO1xuICAgIGlmIChpICsgMSA8IGEubGVuZ3RoKSBzdGFjay5wdXNoKGEsIGIsIGkgKyAxKTtcbiAgICBhID0gYVtpXTtcbiAgICBiID0gYltpXTtcbiAgfVxufVxuLy9Qcm92aWRlczogY2FtbF9jb21wYXJlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2NvbXBhcmUgKGEsIGIpIHsgcmV0dXJuIGNhbWxfY29tcGFyZV92YWwgKGEsIGIsIHRydWUpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2ludF9jb21wYXJlIG11dGFibGUgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfaW50X2NvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKGEgPCBiKSByZXR1cm4gKC0xKTsgaWYgKGEgPT0gYikgcmV0dXJuIDA7IHJldHVybiAxO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2VxdWFsICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA9PSAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9ub3RlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX25vdGVxdWFsICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSAhPSAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9ncmVhdGVyZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ncmVhdGVyZXF1YWwgKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpID49IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dyZWF0ZXJ0aGFuIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZ3JlYXRlcnRoYW4gKHgsIHkpIHsgcmV0dXJuICsoY2FtbF9jb21wYXJlX3ZhbCh4LHksZmFsc2UpID4gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbGVzc2VxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfbGVzc2VxdWFsICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA8PSAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9sZXNzdGhhbiBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3N0aGFuICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA8IDApOyB9XG4iLCIvLyBKc19vZl9vY2FtbCBsaWJyYXJ5XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSnNsaWI6IGNvZGUgc3BlY2lmaWMgdG8gSnNfb2Zfb2NhbWxcblxuLy9Qcm92aWRlczogY2FtbF9qc19vbl9pZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9qc19vbl9pZSAoKSB7XG4gIHZhciB1YSA9XG4gICAgICBnbG9iYWxUaGlzLm5hdmlnYXRvcj9nbG9iYWxUaGlzLm5hdmlnYXRvci51c2VyQWdlbnQ6XCJcIjtcbiAgcmV0dXJuIHVhLmluZGV4T2YoXCJNU0lFXCIpICE9IC0xICYmIHVhLmluZGV4T2YoXCJPcGVyYVwiKSAhPSAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2h0bWxfZXNjYXBlIGNvbnN0IChjb25zdClcbnZhciBjYW1sX2pzX3JlZ2V4cHMgPSB7IGFtcDovJi9nLCBsdDovPC9nLCBxdW90Oi9cXFwiL2csIGFsbDovWyY8XFxcIl0vIH07XG5mdW5jdGlvbiBjYW1sX2pzX2h0bWxfZXNjYXBlIChzKSB7XG4gIGlmICghY2FtbF9qc19yZWdleHBzLmFsbC50ZXN0KHMpKSByZXR1cm4gcztcbiAgcmV0dXJuIHMucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMuYW1wLCBcIiZhbXA7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmx0LCBcIiZsdDtcIilcbiAgICAucmVwbGFjZShjYW1sX2pzX3JlZ2V4cHMucXVvdCwgXCImcXVvdDtcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaHRtbF9lbnRpdGllc1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VudGl0aWVzKHMpIHtcbiAgdmFyIGVudGl0eSA9IC9eJiM/WzAtOWEtekEtWl0rOyQvXG4gIGlmKHMubWF0Y2goZW50aXR5KSlcbiAge1xuICAgIHZhciBzdHIsIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7XG4gICAgdGVtcC5pbm5lckhUTUw9IHM7XG4gICAgc3RyPSB0ZW1wLnRleHRDb250ZW50IHx8IHRlbXAuaW5uZXJUZXh0O1xuICAgIHRlbXA9bnVsbDtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGVsc2Uge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJJbnZhbGlkIGVudGl0eSBcIiArIHMpO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZ2V0X2NvbnNvbGUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfZ2V0X2NvbnNvbGUgKCkge1xuICB2YXIgYyA9IGNvbnNvbGU7XG4gIHZhciBtID0gW1wibG9nXCIsIFwiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCIsIFwiYXNzZXJ0XCIsIFwiZGlyXCIsIFwiZGlyeG1sXCIsXG4gICAgICAgICAgIFwidHJhY2VcIiwgXCJncm91cFwiLCBcImdyb3VwQ29sbGFwc2VkXCIsIFwiZ3JvdXBFbmRcIiwgXCJ0aW1lXCIsIFwidGltZUVuZFwiXTtcbiAgZnVuY3Rpb24gZiAoKSB7fVxuICBmb3IgKHZhciBpID0gMDsgaSA8IG0ubGVuZ3RoOyBpKyspIGlmICghY1ttW2ldXSkgY1ttW2ldXT1mO1xuICByZXR1cm4gYztcbn1cblxuLy9Qcm92aWRlczogY2FtbF94bWxodHRwcmVxdWVzdF9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vV2Vha2RlZlxuZnVuY3Rpb24gY2FtbF94bWxodHRwcmVxdWVzdF9jcmVhdGUodW5pdCl7XG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLlhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHRyeSB7IHJldHVybiBuZXcgZ2xvYmFsVGhpcy5YTUxIdHRwUmVxdWVzdCB9IGNhdGNoIChlKSB7IH07XG4gIH1cbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuYWN0aXZlWE9iamVjdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkgeyByZXR1cm4gbmV3IGdsb2JhbFRoaXMuYWN0aXZlWE9iamVjdChcIk1zeG1sMi5YTUxIVFRQXCIpIH0gY2F0Y2goZSl7IH07XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLmFjdGl2ZVhPYmplY3QoXCJNc3htbDMuWE1MSFRUUFwiKSB9IGNhdGNoKGUpeyB9O1xuICAgIHRyeSB7IHJldHVybiBuZXcgZ2xvYmFsVGhpcy5hY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIikgfSBjYXRjaChlKXsgfTtcbiAgfVxuICBjYW1sX2ZhaWx3aXRoKFwiQ2Fubm90IGNyZWF0ZSBhIFhNTEh0dHBSZXF1ZXN0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb24oZXhuKSB7XG4gIGlmKGV4bi5qc19lcnJvcikgeyByZXR1cm4gZXhuLmpzX2Vycm9yOyB9XG4gIHJldHVybiBudWxsO1xufVxuIiwiLy8vLy8vLy8vIEJJR1NUUklOR1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2JpZ3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYmlnc3RyaW5nKGgsIGJzKSB7XG4gIHJldHVybiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FycihoLGJzLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIG11dGFibGVcbmZ1bmN0aW9uIGJpZ3N0cmluZ190b19hcnJheV9idWZmZXIoYnMpIHtcbiAgcmV0dXJuIGJzLmRhdGEuYnVmZmVyXG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ190b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkoYnMpIHtcbiAgcmV0dXJuIGJzLmRhdGFcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlciBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXIoYWIpIHtcbiAgdmFyIHRhID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKDEyLCAwLCBbdGEubGVuZ3RoXSwgdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXkgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG5mdW5jdGlvbiBiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXkoYmEpIHtcbiAgdmFyIHRhID0gbmV3IFVpbnQ4QXJyYXkoYmEuYnVmZmVyLCBiYS5ieXRlT2Zmc2V0LCBiYS5sZW5ndGggKiBiYS5CWVRFU19QRVJfRUxFTUVOVCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoMTIsIDAsIFt0YS5sZW5ndGhdLCB0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX21lbWNtcFxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfbWVtY21wKHMxLCBwb3MxLCBzMiwgcG9zMiwgbGVuKXtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBhID0gY2FtbF9iYV9nZXRfMShzMSxwb3MxICsgaSk7XG4gICAgdmFyIGIgPSBjYW1sX2JhX2dldF8xKHMyLHBvczIgKyBpKTtcbiAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmEoYmExLCBwb3MxLCBiYTIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMS5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKDEyICE9IGJhMi5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczEgPSBiYTEub2Zmc2V0KHBvczEpO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKG9mczEgKyBsZW4gPiBiYTEuZGF0YS5sZW5ndGgpe1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gYmExLmRhdGEuc3ViYXJyYXkob2ZzMSxvZnMxK2xlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSxwb3MyKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKHBvczEgKyBsZW4gPiBjYW1sX21sX3N0cmluZ19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYob2ZzMiArIGxlbiA+IGJhMi5kYXRhLmxlbmd0aCkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyhzdHIxKS5zbGljZShwb3MxLHBvczEgKyBsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2Usb2ZzMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfYnl0ZXNfdG9fYmFcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9hcnJheV9ib3VuZF9lcnJvciwgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYnl0ZXNfdG9fYmEoc3RyMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMiA9IGJhMi5vZmZzZXQocG9zMik7XG4gIGlmKHBvczEgKyBsZW4gPiBjYW1sX21sX2J5dGVzX2xlbmd0aChzdHIxKSkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihvZnMyICsgbGVuID4gYmEyLmRhdGEubGVuZ3RoKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMoc3RyMSkuc2xpY2UocG9zMSxwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLG9mczIpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfYmxpdF9ieXRlcywgY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9tbF9ieXRlc19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfYmFfdG9fYnl0ZXMoYmExLCBwb3MxLCBieXRlczIsIHBvczIsIGxlbil7XG4gIGlmKDEyICE9IGJhMS5raW5kKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZihsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMxID0gYmExLm9mZnNldChwb3MxKTtcbiAgaWYob2ZzMSArIGxlbiA+IGJhMS5kYXRhLmxlbmd0aCl7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmKHBvczIgKyBsZW4gPiBjYW1sX21sX2J5dGVzX2xlbmd0aChieXRlczIpKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gYmExLmRhdGEuc2xpY2Uob2ZzMSwgb2ZzMStsZW4pO1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl9hcnJheShzbGljZSksIDAsIGJ5dGVzMiwgcG9zMiwgbGVuKTtcbiAgcmV0dXJuIDBcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9jaGFuXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSwgY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF9NRDVJbml0LCBjYW1sX01ENVVwZGF0ZSwgY2FtbF9NRDVGaW5hbFxuZnVuY3Rpb24gY2FtbF9tZDVfY2hhbihjaGFuaWQsdG9yZWFkKXtcbiAgdmFyIGN0eCA9IGNhbWxfTUQ1SW5pdCgpO1xuICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoNDA5Nik7XG4gIGlmKHRvcmVhZCA8IDApe1xuICAgIHdoaWxlKHRydWUpe1xuICAgICAgdmFyIHJlYWQgPSBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCxidWZmZXIsMCxidWZmZXIubGVuZ3RoKTtcbiAgICAgIGlmKHJlYWQgPT0gMCkgYnJlYWs7XG4gICAgICBjYW1sX01ENVVwZGF0ZShjdHgsYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpLCByZWFkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUodG9yZWFkID4gMCkge1xuICAgICAgdmFyIHJlYWQgPSBjYW1sX21sX2lucHV0X2Jsb2NrKGNoYW5pZCxidWZmZXIsMCwgKHRvcmVhZCA+IGJ1ZmZlci5sZW5ndGggPyBidWZmZXIubGVuZ3RoIDogdG9yZWFkKSk7XG4gICAgICBpZihyZWFkID09IDApIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgICAgIGNhbWxfTUQ1VXBkYXRlKGN0eCxidWZmZXIuc3ViYXJyYXkoMCwgcmVhZCksIHJlYWQpO1xuICAgICAgdG9yZWFkIC09IHJlYWRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGNhbWxfTUQ1RmluYWwoY3R4KSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWQ1X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9zdHJpbmcsIGNhbWxfbWQ1X2J5dGVzXG5mdW5jdGlvbiBjYW1sX21kNV9zdHJpbmcocywgb2ZzLCBsZW4pIHtcbiAgcmV0dXJuIGNhbWxfbWQ1X2J5dGVzKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpLG9mcyxsZW4pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENVRyYW5zZm9ybVxudmFyIGNhbWxfTUQ1VHJhbnNmb3JtID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gYWRkICh4LCB5KSB7IHJldHVybiAoeCArIHkpIHwgMDsgfVxuICBmdW5jdGlvbiB4eChxLGEsYix4LHMsdCkge1xuICAgIGEgPSBhZGQoYWRkKGEsIHEpLCBhZGQoeCwgdCkpO1xuICAgIHJldHVybiBhZGQoKGEgPDwgcykgfCAoYSA+Pj4gKDMyIC0gcykpLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBmZihhLGIsYyxkLHgscyx0KSB7XG4gICAgcmV0dXJuIHh4KChiICYgYykgfCAoKH5iKSAmIGQpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuICBmdW5jdGlvbiBnZyhhLGIsYyxkLHgscyx0KSB7XG4gICAgcmV0dXJuIHh4KChiICYgZCkgfCAoYyAmICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTtcbiAgfVxuICBmdW5jdGlvbiBoaChhLGIsYyxkLHgscyx0KSB7IHJldHVybiB4eChiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpOyB9XG4gIGZ1bmN0aW9uIGlpKGEsYixjLGQseCxzLHQpIHsgcmV0dXJuIHh4KGMgXiAoYiB8ICh+ZCkpLCBhLCBiLCB4LCBzLCB0KTsgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAodywgYnVmZmVyKSB7XG4gICAgdmFyIGEgPSB3WzBdLCBiID0gd1sxXSwgYyA9IHdbMl0sIGQgPSB3WzNdO1xuXG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclsgMF0sIDcsIDB4RDc2QUE0NzgpO1xuICAgIGQgPSBmZihkLCBhLCBiLCBjLCBidWZmZXJbIDFdLCAxMiwgMHhFOEM3Qjc1Nik7XG4gICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlclsgMl0sIDE3LCAweDI0MjA3MERCKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWyAzXSwgMjIsIDB4QzFCRENFRUUpO1xuICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbIDRdLCA3LCAweEY1N0MwRkFGKTtcbiAgICBkID0gZmYoZCwgYSwgYiwgYywgYnVmZmVyWyA1XSwgMTIsIDB4NDc4N0M2MkEpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbIDZdLCAxNywgMHhBODMwNDYxMyk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsgN10sIDIyLCAweEZENDY5NTAxKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWyA4XSwgNywgMHg2OTgwOThEOCk7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsgOV0sIDEyLCAweDhCNDRGN0FGKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWzEwXSwgMTcsIDB4RkZGRjVCQjEpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbMTFdLCAyMiwgMHg4OTVDRDdCRSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclsxMl0sIDcsIDB4NkI5MDExMjIpO1xuICAgIGQgPSBmZihkLCBhLCBiLCBjLCBidWZmZXJbMTNdLCAxMiwgMHhGRDk4NzE5Myk7XG4gICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNF0sIDE3LCAweEE2Nzk0MzhFKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzE1XSwgMjIsIDB4NDlCNDA4MjEpO1xuXG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsgMV0sIDUsIDB4RjYxRTI1NjIpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbIDZdLCA5LCAweEMwNDBCMzQwKTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWzExXSwgMTQsIDB4MjY1RTVBNTEpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbIDBdLCAyMCwgMHhFOUI2QzdBQSk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsgNV0sIDUsIDB4RDYyRjEwNUQpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbMTBdLCA5LCAweDAyNDQxNDUzKTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWzE1XSwgMTQsIDB4RDhBMUU2ODEpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbIDRdLCAyMCwgMHhFN0QzRkJDOCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsgOV0sIDUsIDB4MjFFMUNERTYpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbMTRdLCA5LCAweEMzMzcwN0Q2KTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWyAzXSwgMTQsIDB4RjRENTBEODcpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbIDhdLCAyMCwgMHg0NTVBMTRFRCk7XG4gICAgYSA9IGdnKGEsIGIsIGMsIGQsIGJ1ZmZlclsxM10sIDUsIDB4QTlFM0U5MDUpO1xuICAgIGQgPSBnZyhkLCBhLCBiLCBjLCBidWZmZXJbIDJdLCA5LCAweEZDRUZBM0Y4KTtcbiAgICBjID0gZ2coYywgZCwgYSwgYiwgYnVmZmVyWyA3XSwgMTQsIDB4Njc2RjAyRDkpO1xuICAgIGIgPSBnZyhiLCBjLCBkLCBhLCBidWZmZXJbMTJdLCAyMCwgMHg4RDJBNEM4QSk7XG5cbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWyA1XSwgNCwgMHhGRkZBMzk0Mik7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlclsgOF0sIDExLCAweDg3NzFGNjgxKTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWzExXSwgMTYsIDB4NkQ5RDYxMjIpO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbMTRdLCAyMywgMHhGREU1MzgwQyk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsgMV0sIDQsIDB4QTRCRUVBNDQpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbIDRdLCAxMSwgMHg0QkRFQ0ZBOSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsgN10sIDE2LCAweEY2QkI0QjYwKTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWzEwXSwgMjMsIDB4QkVCRkJDNzApO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbMTNdLCA0LCAweDI4OUI3RUM2KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWyAwXSwgMTEsIDB4RUFBMTI3RkEpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbIDNdLCAxNiwgMHhENEVGMzA4NSk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsgNl0sIDIzLCAweDA0ODgxRDA1KTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWyA5XSwgNCwgMHhEOUQ0RDAzOSk7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlclsxMl0sIDExLCAweEU2REI5OUU1KTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWzE1XSwgMTYsIDB4MUZBMjdDRjgpO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbIDJdLCAyMywgMHhDNEFDNTY2NSk7XG5cbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWyAwXSwgNiwgMHhGNDI5MjI0NCk7XG4gICAgZCA9IGlpKGQsIGEsIGIsIGMsIGJ1ZmZlclsgN10sIDEwLCAweDQzMkFGRjk3KTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWzE0XSwgMTUsIDB4QUI5NDIzQTcpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbIDVdLCAyMSwgMHhGQzkzQTAzOSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsxMl0sIDYsIDB4NjU1QjU5QzMpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbIDNdLCAxMCwgMHg4RjBDQ0M5Mik7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsxMF0sIDE1LCAweEZGRUZGNDdEKTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWyAxXSwgMjEsIDB4ODU4NDVERDEpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbIDhdLCA2LCAweDZGQTg3RTRGKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWzE1XSwgMTAsIDB4RkUyQ0U2RTApO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbIDZdLCAxNSwgMHhBMzAxNDMxNCk7XG4gICAgYiA9IGlpKGIsIGMsIGQsIGEsIGJ1ZmZlclsxM10sIDIxLCAweDRFMDgxMUExKTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWyA0XSwgNiwgMHhGNzUzN0U4Mik7XG4gICAgZCA9IGlpKGQsIGEsIGIsIGMsIGJ1ZmZlclsxMV0sIDEwLCAweEJEM0FGMjM1KTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWyAyXSwgMTUsIDB4MkFEN0QyQkIpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbIDldLCAyMSwgMHhFQjg2RDM5MSk7XG5cbiAgICB3WzBdID0gYWRkKGEsIHdbMF0pO1xuICAgIHdbMV0gPSBhZGQoYiwgd1sxXSk7XG4gICAgd1syXSA9IGFkZChjLCB3WzJdKTtcbiAgICB3WzNdID0gYWRkKGQsIHdbM10pO1xuICB9fSkoKVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUluaXRcbmZ1bmN0aW9uIGNhbWxfTUQ1SW5pdCgpIHtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcig2NCk7XG4gIHZhciBiMzIgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgdmFyIGI4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgcmV0dXJuIHtsZW46MCxcbiAgICAgICAgICB3Om5ldyBVaW50MzJBcnJheShbMHg2NzQ1MjMwMSwgMHhFRkNEQUI4OSwgMHg5OEJBRENGRSwgMHgxMDMyNTQ3Nl0pLFxuICAgICAgICAgIGIzMjpiMzIsXG4gICAgICAgICAgYjg6Yjh9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfTUQ1VXBkYXRlXG4vL1JlcXVpcmVzOiBjYW1sX01ENVRyYW5zZm9ybVxuZnVuY3Rpb24gY2FtbF9NRDVVcGRhdGUoY3R4LCBpbnB1dCwgaW5wdXRfbGVuKXtcbiAgdmFyIGluX2J1ZiA9IGN0eC5sZW4gJiAweDNmO1xuICB2YXIgaW5wdXRfcG9zID0gMDtcbiAgY3R4LmxlbiArPSBpbnB1dF9sZW47XG4gIGlmKGluX2J1Zil7XG4gICAgdmFyIG1pc3NpbmcgPSA2NCAtIGluX2J1ZjtcbiAgICBpZihpbnB1dF9sZW4gPCBtaXNzaW5nKSB7XG4gICAgICBjdHguYjguc2V0KGlucHV0LnN1YmFycmF5KDAsaW5wdXRfbGVuKSxpbl9idWYpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoMCxtaXNzaW5nKSxpbl9idWYpO1xuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBpbnB1dF9sZW4gLT0gbWlzc2luZztcbiAgICBpbnB1dF9wb3MgKz0gbWlzc2luZztcbiAgfVxuICB3aGlsZShpbnB1dF9sZW4gPj0gNjQpe1xuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoaW5wdXRfcG9zLGlucHV0X3BvcyArIDY0KSwgMCk7XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGlucHV0X2xlbiAtPSA2NDtcbiAgICBpbnB1dF9wb3MgKz0gNjQ7XG4gIH1cbiAgaWYoaW5wdXRfbGVuKVxuICAgIGN0eC5iOC5zZXQoaW5wdXQuc3ViYXJyYXkoaW5wdXRfcG9zLGlucHV0X3BvcyArIGlucHV0X2xlbiksIDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENUZpbmFsXG4vL1JlcXVpcmVzOiBjYW1sX01ENVRyYW5zZm9ybVxuZnVuY3Rpb24gY2FtbF9NRDVGaW5hbChjdHgpe1xuICB2YXIgaW5fYnVmID0gY3R4LmxlbiAmIDB4M2Y7XG4gIGN0eC5iOFtpbl9idWZdID0gMHg4MDtcbiAgaW5fYnVmICsrO1xuICBpZihpbl9idWYgPiA1Nikge1xuICAgIGZvcih2YXIgaiA9IGluX2J1ZjsgaiA8IDY0OyBqKyspe1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gICAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICAgIGZvcih2YXIgaiA9IDA7IGogPCA1NjsgaisrKXtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvcih2YXIgaiA9IGluX2J1ZjsgaiA8IDU2OyBqKyspe1xuICAgICAgY3R4LmI4W2pdID0gMDtcbiAgICB9XG4gIH1cbiAgY3R4LmIzMlsxNF0gPSBjdHgubGVuIDw8IDM7XG4gIGN0eC5iMzJbMTVdID0gKGN0eC5sZW4gPj4gMjkpICYgMHgxRkZGRkZGRjtcbiAgY2FtbF9NRDVUcmFuc2Zvcm0oY3R4LncsIGN0eC5iMzIpO1xuICB2YXIgdCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCA0OyBqKyspXG4gICAgICB0W2kgKiA0ICsgal0gPSAoY3R4LndbaV0gPj4gKDggKiBqKSkgJiAweEZGO1xuICByZXR1cm4gdDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcywgY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfTUQ1SW5pdCwgY2FtbF9NRDVVcGRhdGUsIGNhbWxfTUQ1RmluYWxcbmZ1bmN0aW9uIGNhbWxfbWQ1X2J5dGVzKHMsIG9mcywgbGVuKSB7XG4gIHZhciBjdHggPSBjYW1sX01ENUluaXQoKTtcbiAgdmFyIGEgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHMpO1xuICBjYW1sX01ENVVwZGF0ZShjdHgsYS5zdWJhcnJheShvZnMsIG9mcyArIGxlbiksIGxlbik7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShjYW1sX01ENUZpbmFsKGN0eCkpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDIwIC0gSHVnbyBIZXV6YXJkXG4vLyBDb3B5cmlnaHQgKEMpIDIwMjAgLSBTaGFjaGFyIEl0emhha3lcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iLzQuMDcvb3RoZXJsaWJzL3N0ci9zdHJzdHVicy5jXG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanNjb3EvanNjb3EvYmxvYi92OC4xMS9jb3EtanMvanNfc3R1Yi9zdHIuanNcblxuLy9Qcm92aWRlczogcmVfbWF0Y2hcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2dldFxuXG52YXIgcmVfbWF0Y2ggPSBmdW5jdGlvbigpe1xuICB2YXIgcmVfd29yZF9sZXR0ZXJzID0gW1xuICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIDB4MDAtMHgxRjogbm9uZSAqL1xuICAgIDB4MDAsIDB4MDAsIDB4RkYsIDB4MDMsICAgICAgIC8qIDB4MjAtMHgzRjogZGlnaXRzIDAtOSAqL1xuICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4ODcsICAgICAgIC8qIDB4NDAtMHg1RjogQSB0byBaLCBfICovXG4gICAgMHhGRSwgMHhGRiwgMHhGRiwgMHgwNywgICAgICAgLyogMHg2MC0weDdGOiBhIHRvIHogKi9cbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiAweDgwLTB4OUY6IG5vbmUgKi9cbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiAweEEwLTB4QkY6IG5vbmUgKi9cbiAgICAweEZGLCAweEZGLCAweDdGLCAweEZGLCAgICAgICAvKiAweEMwLTB4REY6IExhdGluLTEgYWNjZW50ZWQgdXBwZXJjYXNlICovXG4gICAgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiAgICAgICAgLyogMHhFMC0weEZGOiBMYXRpbi0xIGFjY2VudGVkIGxvd2VyY2FzZSAqL1xuICBdO1xuXG4gIHZhciBvcGNvZGVzID0ge1xuICAgIENIQVI6IDAsIENIQVJOT1JNOiAxLCBTVFJJTkc6IDIsIFNUUklOR05PUk06IDMsIENIQVJDTEFTUzogNCxcbiAgICBCT0w6IDUsIEVPTDogNiwgV09SREJPVU5EQVJZOiA3LFxuICAgIEJFR0dST1VQOiA4LCBFTkRHUk9VUDogOSwgUkVGR1JPVVA6IDEwLFxuICAgIEFDQ0VQVDogMTEsXG4gICAgU0lNUExFT1BUOiAxMiwgU0lNUExFU1RBUjogMTMsIFNJTVBMRVBMVVM6IDE0LFxuICAgIEdPVE86IDE1LCBQVVNIQkFDSzogMTYsIFNFVE1BUks6IDE3LFxuICAgIENIRUNLUFJPR1JFU1M6IDE4XG4gIH07XG5cbiAgZnVuY3Rpb24gaXNfd29yZF9sZXR0ZXIoYykge1xuICAgIHJldHVybiAocmVfd29yZF9sZXR0ZXJzWyAgKGMgPj4gMyldID4+IChjICYgNykpICYgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluX2JpdHNldChzLGkpIHtcbiAgICByZXR1cm4gKGNhbWxfc3RyaW5nX2dldChzLChpID4+IDMpKSA+PiAoaSAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiByZV9tYXRjaF9pbXBsKHJlLCBzLCBwb3MsIHBhcnRpYWwpIHtcblxuICAgIHZhciBwcm9nICAgICAgICAgID0gY2FtbF9qc19mcm9tX2FycmF5KHJlWzFdKSxcbiAgICAgICAgY3Bvb2wgICAgICAgICA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsyXSksXG4gICAgICAgIG5vcm10YWJsZSAgICAgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHJlWzNdKSxcbiAgICAgICAgbnVtZ3JvdXBzICAgICA9IHJlWzRdIHwgMCxcbiAgICAgICAgbnVtcmVnaXN0ZXJzICA9IHJlWzVdIHwgMCxcbiAgICAgICAgc3RhcnRjaGFycyAgICA9IHJlWzZdIHwgMDtcblxuICAgIHZhciBzID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcocyk7XG5cbiAgICB2YXIgcGMgPSAwLFxuICAgICAgICBxdWl0ID0gZmFsc2UsXG4gICAgICAgIHN0YWNrID0gW10sXG4gICAgICAgIGdyb3VwcyA9IG5ldyBBcnJheShudW1ncm91cHMpLFxuICAgICAgICByZV9yZWdpc3RlciA9IG5ldyBBcnJheShudW1yZWdpc3RlcnMpO1xuXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkrKyl7XG4gICAgICBncm91cHNbaV0gPSB7c3RhcnQ6IC0xLCBlbmQ6LTF9XG4gICAgfVxuICAgIGdyb3Vwc1swXS5zdGFydCA9IHBvcztcblxuICAgIHZhciBiYWNrdHJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHZhciBpdGVtID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGlmIChpdGVtLnVuZG8pIHtcbiAgICAgICAgICBpdGVtLnVuZG8ub2JqW2l0ZW0udW5kby5wcm9wXSA9IGl0ZW0udW5kby52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKGl0ZW0ucG9zKSB7XG4gICAgICAgICAgcGMgPSBpdGVtLnBvcy5wYztcbiAgICAgICAgICBwb3MgPSBpdGVtLnBvcy50eHQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBxdWl0ID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgdmFyIHB1c2ggPSBmdW5jdGlvbihpdGVtKSB7IHN0YWNrLnB1c2goaXRlbSk7IH07XG5cbiAgICB2YXIgYWNjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZ3JvdXBzWzBdLmVuZCA9IHBvcztcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoMSArIGdyb3Vwcy5sZW5ndGgqMik7XG4gICAgICByZXN1bHRbMF0gPSAwOyAvLyB0YWdcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgZyA9IGdyb3Vwc1tpXTtcbiAgICAgICAgaWYoZy5zdGFydCA8IDAgfHwgZy5lbmQgPCAwKSB7XG4gICAgICAgICAgZy5zdGFydCA9IGcuZW5kID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0WzIqaSArIDEgXSA9IGcuc3RhcnQ7XG4gICAgICAgIHJlc3VsdFsyKmkgKyAxICsgMSBdID0gZy5lbmQ7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH07XG5cbiAgICB2YXIgcHJlZml4X21hdGNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYocGFydGlhbCkgcmV0dXJuIGFjY2VwdCAoKTtcbiAgICAgIGVsc2UgYmFja3RyYWNrICgpO1xuICAgIH1cblxuICAgIC8qIE1haW4gREZBIGludGVycHJldGVyIGxvb3AgKi9cbiAgICB3aGlsZSAoIXF1aXQpIHtcbiAgICAgIHZhciBvcCA9IHByb2dbcGNdICYgMHhmZixcbiAgICAgICAgICBzYXJnID0gcHJvZ1twY10gPj4gOCxcbiAgICAgICAgICB1YXJnID0gc2FyZyAmIDB4ZmYsXG4gICAgICAgICAgYyA9IHNbcG9zXSxcbiAgICAgICAgICBncm91cDtcblxuICAgICAgcGMrKztcblxuICAgICAgc3dpdGNoIChvcCkge1xuICAgICAgY2FzZSBvcGNvZGVzLkNIQVI6XG4gICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgaWYgKGMgPT09IHVhcmcpIHBvcysrO1xuICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSTk9STTpcbiAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICBpZiAobm9ybXRhYmxlLmNoYXJDb2RlQXQoYykgPT09IHVhcmcpIHBvcysrO1xuICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkc6XG4gICAgICAgIGZvciAodmFyIGFyZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoY3Bvb2xbdWFyZ10pLCBpID0gMDsgaSA8IGFyZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgICBpZiAoYyA9PT0gYXJnLmNoYXJDb2RlQXQoaSkpXG4gICAgICAgICAgICBjID0gc1srK3Bvc107XG4gICAgICAgICAgZWxzZSB7IGJhY2t0cmFjaygpOyBicmVhazsgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNUUklOR05PUk06XG4gICAgICAgIGZvciAodmFyIGFyZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoY3Bvb2xbdWFyZ10pLCBpID0gMDsgaSA8IGFyZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgICBpZiAobm9ybXRhYmxlLmNoYXJDb2RlQXQoYykgPT09IGFyZy5jaGFyQ29kZUF0KGkpKVxuICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGVsc2UgeyBiYWNrdHJhY2soKTsgYnJlYWs7IH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSQ0xBU1M6XG4gICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHBvcysrO1xuICAgICAgICBlbHNlIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5CT0w6XG4gICAgICAgIGlmKHBvcyA+IDAgJiYgc1twb3MgLSAxXSAhPSAxMCAvKiBcXG4gKi8pIHtiYWNrdHJhY2soKX1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuRU9MOlxuICAgICAgICBpZihwb3MgPCBzLmxlbmd0aCAmJiBzW3Bvc10gIT0gMTAgLyogXFxuICovKSB7YmFja3RyYWNrKCl9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLldPUkRCT1VOREFSWTpcbiAgICAgICAgaWYocG9zID09IDApIHtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYoaXNfd29yZF9sZXR0ZXIoc1swXSkpIGJyZWFrO1xuICAgICAgICAgIGJhY2t0cmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvcyA9PT0gcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZihpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSkgYnJlYWs7XG4gICAgICAgICAgYmFja3RyYWNrICgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmKGlzX3dvcmRfbGV0dGVyKHNbcG9zIC0gMV0pICE9IGlzX3dvcmRfbGV0dGVyKHNbcG9zXSkpIGJyZWFrO1xuICAgICAgICAgIGJhY2t0cmFjayAoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5CRUdHUk9VUDpcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgIHB1c2goe3VuZG86IHtvYmo6Z3JvdXAsXG4gICAgICAgICAgICAgICAgICAgICBwcm9wOidzdGFydCcsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ3JvdXAuc3RhcnR9fSk7XG4gICAgICAgIGdyb3VwLnN0YXJ0ID0gcG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5FTkRHUk9VUDpcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbdWFyZ107XG4gICAgICAgIHB1c2goe3VuZG86IHtvYmo6IGdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcDonZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBncm91cC5lbmR9fSk7XG4gICAgICAgIGdyb3VwLmVuZCA9IHBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuUkVGR1JPVVA6XG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICBpZihncm91cC5zdGFydCA8IDAgfHwgZ3JvdXAuZW5kIDwgMCkge2JhY2t0cmFjayAoKTsgYnJlYWt9XG4gICAgICAgIGZvciAodmFyIGkgPSBncm91cC5zdGFydDsgaSA8IGdyb3VwLmVuZDsgaSsrKXtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYoc1tpXSAhPSBzW3Bvc10pIHtiYWNrdHJhY2sgKCk7IGJyZWFrfVxuICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNJTVBMRU9QVDpcbiAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHBvcysrO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVTVEFSOlxuICAgICAgICB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSlcbiAgICAgICAgICBjID0gc1srK3Bvc107XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNJTVBMRVBMVVM6XG4gICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgaWYgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBjID0gc1srK3Bvc107XG4gICAgICAgICAgfSB3aGlsZSAoaW5fYml0c2V0KGNwb29sW3VhcmddLCBjKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQUNDRVBUOlxuICAgICAgICByZXR1cm4gYWNjZXB0KCk7XG4gICAgICBjYXNlIG9wY29kZXMuR09UTzpcbiAgICAgICAgcGMgPSBwYyArIHNhcmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlBVU0hCQUNLOlxuICAgICAgICBwdXNoKHtwb3M6IHtwYzogcGMgKyBzYXJnLCB0eHQ6IHBvc319KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU0VUTUFSSzpcbiAgICAgICAgcHVzaCh7dW5kbzoge29iajpyZV9yZWdpc3RlcixcbiAgICAgICAgICAgICAgICAgICAgIHByb3A6IHVhcmcsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcmVfcmVnaXN0ZXJbdWFyZ119fSk7XG4gICAgICAgIHJlX3JlZ2lzdGVyW3VhcmddID0gcG9zO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEVDS1BST0dSRVNTOlxuICAgICAgICBpZiAocmVfcmVnaXN0ZXJbdWFyZ10gPT09IHBvcykgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBieXRlY29kZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gcmVfbWF0Y2hfaW1wbDtcbn0oKTtcblxuXG4vL1Byb3ZpZGVzOiByZV9zZWFyY2hfZm9yd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zZWFyY2hfZm9yd2FyZChyZSwgcywgcG9zKSB7XG4gIGlmKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfZm9yd2FyZFwiKVxuICB3aGlsZSAocG9zIDw9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSkge1xuICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgIHBvcysrO1xuICB9XG5cbiAgcmV0dXJuIFswXTsgIC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2JhY2t3YXJkXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIHJlX3NlYXJjaF9iYWNrd2FyZChyZSwgcywgcG9zKSB7XG4gIGlmKHBvcyA8IDAgfHwgcG9zID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0ci5zZWFyY2hfYmFja3dhcmRcIilcbiAgd2hpbGUgKHBvcyA+PSAwKSB7XG4gICAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDApO1xuICAgIGlmIChyZXMpIHJldHVybiByZXM7XG4gICAgcG9zLS07XG4gIH1cblxuICByZXR1cm4gWzBdOyAgLyogW3x8XSA6IGludCBhcnJheSAqL1xufVxuXG5cbi8vUHJvdmlkZXM6IHJlX3N0cmluZ19tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zdHJpbmdfbWF0Y2gocmUscyxwb3Mpe1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIuc3RyaW5nX21hdGNoXCIpXG4gIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgZWxzZSByZXR1cm4gWzBdO1xufVxuXG4vL1Byb3ZpZGVzOiByZV9wYXJ0aWFsX21hdGNoXG4vL1JlcXVpcmVzOiByZV9tYXRjaCwgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIHJlX3BhcnRpYWxfbWF0Y2gocmUscyxwb3Mpe1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIucGFydGlhbF9tYXRjaFwiKVxuICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMSk7XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGVsc2UgcmV0dXJuIFswXTtcbn1cblxuLy9Qcm92aWRlczogcmVfcmVwbGFjZW1lbnRfdGV4dFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9hcnJheV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vIGV4dGVybmFsIHJlX3JlcGxhY2VtZW50X3RleHQ6IHN0cmluZyAtPiBpbnQgYXJyYXkgLT4gc3RyaW5nIC0+IHN0cmluZ1xuZnVuY3Rpb24gcmVfcmVwbGFjZW1lbnRfdGV4dChyZXBsLGdyb3VwcyxvcmlnKSB7XG4gIHZhciByZXBsID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZXBsKTtcbiAgdmFyIGxlbiA9IHJlcGwubGVuZ3RoO1xuICB2YXIgb3JpZyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcob3JpZyk7XG4gIHZhciByZXMgPSBcIlwiOyAvL3Jlc3VsdFxuICB2YXIgbiA9IDA7IC8vIGN1cnJlbnQgcG9zaXRpb25cbiAgdmFyIGN1cjsgLy9jdXJyZW50IGNoYXJcbiAgdmFyIHN0YXJ0LCBlbmQsIGM7XG4gIHdoaWxlKG4gPCBsZW4pe1xuICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgaWYoY3VyICE9ICdcXFxcJyl7XG4gICAgICByZXMgKz0gY3VyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmKG4gPT0gbGVuKSBjYW1sX2ZhaWx3aXRoKFwiU3RyLnJlcGxhY2U6IGlsbGVnYWwgYmFja3NsYXNoIHNlcXVlbmNlXCIpO1xuICAgICAgY3VyID0gcmVwbC5jaGFyQXQobisrKTtcbiAgICAgIHN3aXRjaChjdXIpe1xuICAgICAgY2FzZSAnXFxcXCc6XG4gICAgICAgIHJlcyArPSBjdXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOlxuICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOlxuICAgICAgICBjID0gK2N1cjtcbiAgICAgICAgaWYgKGMqMiA+PSBncm91cHMubGVuZ3RoIC0gMSApXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiByZWZlcmVuY2UgdG8gdW5tYXRjaGVkIGdyb3VwXCIgKTtcbiAgICAgICAgc3RhcnQgPSBjYW1sX2FycmF5X2dldChncm91cHMsYyoyKTtcbiAgICAgICAgZW5kID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLCBjKjIgKzEpO1xuICAgICAgICBpZiAoc3RhcnQgPT0gLTEpXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiByZWZlcmVuY2UgdG8gdW5tYXRjaGVkIGdyb3VwXCIpO1xuICAgICAgICByZXMrPW9yaWcuc2xpY2Uoc3RhcnQsZW5kKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXMgKz0gKCdcXFxcJyAgKyBjdXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhyZXMpOyB9XG5cblxuLy9Qcm92aWRlczogY2FtbF9zdHJfaW5pdGlhbGl6ZVxuZnVuY3Rpb24gY2FtbF9zdHJfaW5pdGlhbGl6ZSh1bml0KSB7XG4gIHJldHVybiAwO1xufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUgQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAqL1xuLyogIGVuIEF1dG9tYXRpcXVlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCAgICAqL1xuLyogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aXRoICAgICAqL1xuLyogIHRoZSBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiBmaWxlIC4uL0xJQ0VOU0UuICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKiAkSWQ6IGxleGluZy5jIDYwNDUgMjAwNC0wMS0wMSAxNjo0Mjo0M1ogZG9saWdleiAkICovXG5cbi8qIFRoZSB0YWJsZS1kcml2ZW4gYXV0b21hdG9uIGZvciBsZXhlcnMgZ2VuZXJhdGVkIGJ5IGNhbWxsZXguICovXG5cbi8vUHJvdmlkZXM6IGNhbWxfbGV4X2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2xleF9hcnJheShzKSB7XG4gIHMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpO1xuICB2YXIgbCA9IHMubGVuZ3RoIC8gMjtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgIGFbaV0gPSAocy5jaGFyQ29kZUF0KDIgKiBpKSB8IChzLmNoYXJDb2RlQXQoMiAqIGkgKyAxKSA8PCA4KSkgPDwgMTYgPj4gMTY7XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIGNhbWxfbGV4X2FycmF5LCBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuXG4gIGlmICghdGJsLmxleF9kZWZhdWx0KSB7XG4gICAgdGJsLmxleF9iYXNlID0gICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFzZV0pO1xuICAgIHRibC5sZXhfYmFja3RyayA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfZGVmYXVsdF0pO1xuICB9XG5cbiAgdmFyIGMsIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMobGV4YnVmW2xleF9idWZmZXJdKTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvcig7Oykge1xuICAgIC8qIExvb2t1cCBiYXNlIGFkZHJlc3Mgb3IgYWN0aW9uIG51bWJlciBmb3IgY3VycmVudCBzdGF0ZSAqL1xuICAgIHZhciBiYXNlID0gdGJsLmxleF9iYXNlW3N0YXRlXTtcbiAgICBpZiAoYmFzZSA8IDApIHJldHVybiAtYmFzZS0xO1xuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IGJhY2t0cms7XG4gICAgfVxuICAgIC8qIFNlZSBpZiB3ZSBuZWVkIGEgcmVmaWxsICovXG4gICAgaWYgKGxleGJ1ZltsZXhfY3Vycl9wb3NdID49IGxleGJ1ZltsZXhfYnVmZmVyX2xlbl0pe1xuICAgICAgaWYgKGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID09IDApXG4gICAgICAgIHJldHVybiAtc3RhdGUgLSAxO1xuICAgICAgZWxzZVxuICAgICAgICBjID0gMjU2O1xuICAgIH1lbHNle1xuICAgICAgLyogUmVhZCBuZXh0IGlucHV0IGNoYXIgKi9cbiAgICAgIGMgPSBidWZmZXJbbGV4YnVmW2xleF9jdXJyX3Bvc11dO1xuICAgICAgbGV4YnVmW2xleF9jdXJyX3Bvc10gKys7XG4gICAgfVxuICAgIC8qIERldGVybWluZSBuZXh0IHN0YXRlICovXG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09IHN0YXRlKVxuICAgICAgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfZGVmYXVsdFtzdGF0ZV07XG4gICAgLyogSWYgbm8gdHJhbnNpdGlvbiBvbiB0aGlzIGNoYXIsIHJldHVybiB0byBsYXN0IGJhY2t0cmFjayBwb2ludCAqL1xuICAgIGlmIChzdGF0ZSA8IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdID0gbGV4YnVmW2xleF9sYXN0X3Bvc107XG4gICAgICBpZiAobGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPT0gLTEpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfWVsc2V7XG4gICAgICAvKiBFcmFzZSB0aGUgRU9GIGNvbmRpdGlvbiBvbmx5IGlmIHRoZSBFT0YgcHNldWRvLWNoYXJhY3RlciB3YXNcbiAgICAgICAgIGNvbnN1bWVkIGJ5IHRoZSBhdXRvbWF0b24gKGkuZS4gdGhlcmUgd2FzIG5vIGJhY2t0cmFjayBhYm92ZSlcbiAgICAgICovXG4gICAgICBpZiAoYyA9PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyogTmV3IGxleGVyIGVuZ2luZSwgd2l0aCBtZW1vcnkgb2YgcG9zaXRpb25zICAqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX25ld19sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9sZXhfcnVuX21lbShzLCBpLCBtZW0sIGN1cnJfcG9zKSB7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgZHN0ID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKGRzdCA9PSAweGZmKSByZXR1cm47XG4gICAgdmFyIHNyYyA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChzcmMgPT0gMHhmZilcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSBjdXJyX3BvcztcbiAgICBlbHNlXG4gICAgICBtZW0gW2RzdCArIDFdID0gbWVtIFtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX2xleF9ydW5fdGFnKHMsIGksIG1lbSkge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChkc3QgPT0gMHhmZikgcmV0dXJuIDtcbiAgICB2YXIgc3JjID0gcy5jaGFyQ29kZUF0KGkpOyBpKys7XG4gICAgaWYgKHNyYyA9PSAweGZmKVxuICAgICAgbWVtIFtkc3QgKyAxXSA9IC0xO1xuICAgIGVsc2VcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSBtZW0gW3NyYyArIDFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbWxfbmV3X2xleF9lbmdpbmUodGJsLCBzdGFydF9zdGF0ZSwgbGV4YnVmKSB7XG4gIHZhciBsZXhfYnVmZmVyID0gMjtcbiAgdmFyIGxleF9idWZmZXJfbGVuID0gMztcbiAgdmFyIGxleF9zdGFydF9wb3MgPSA1O1xuICB2YXIgbGV4X2N1cnJfcG9zID0gNjtcbiAgdmFyIGxleF9sYXN0X3BvcyA9IDc7XG4gIHZhciBsZXhfbGFzdF9hY3Rpb24gPSA4O1xuICB2YXIgbGV4X2VvZl9yZWFjaGVkID0gOTtcbiAgdmFyIGxleF9tZW0gPSAxMDtcbiAgdmFyIGxleF9iYXNlID0gMTtcbiAgdmFyIGxleF9iYWNrdHJrID0gMjtcbiAgdmFyIGxleF9kZWZhdWx0ID0gMztcbiAgdmFyIGxleF90cmFucyA9IDQ7XG4gIHZhciBsZXhfY2hlY2sgPSA1O1xuICB2YXIgbGV4X2Jhc2VfY29kZSA9IDY7XG4gIHZhciBsZXhfYmFja3Rya19jb2RlID0gNztcbiAgdmFyIGxleF9kZWZhdWx0X2NvZGUgPSA4O1xuICB2YXIgbGV4X3RyYW5zX2NvZGUgPSA5O1xuICB2YXIgbGV4X2NoZWNrX2NvZGUgPSAxMDtcbiAgdmFyIGxleF9jb2RlID0gMTE7XG5cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHQpIHtcbiAgICB0YmwubGV4X2Jhc2UgPSAgICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYXNlXSk7XG4gICAgdGJsLmxleF9iYWNrdHJrID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFja3Rya10pO1xuICAgIHRibC5sZXhfY2hlY2sgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2NoZWNrXSk7XG4gICAgdGJsLmxleF90cmFucyA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfdHJhbnNdKTtcbiAgICB0YmwubGV4X2RlZmF1bHQgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9kZWZhdWx0XSk7XG4gIH1cbiAgaWYgKCF0YmwubGV4X2RlZmF1bHRfY29kZSkge1xuICAgIHRibC5sZXhfYmFzZV9jb2RlID0gICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFzZV9jb2RlXSk7XG4gICAgdGJsLmxleF9iYWNrdHJrX2NvZGUgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYWNrdHJrX2NvZGVdKTtcbiAgICB0YmwubGV4X2NoZWNrX2NvZGUgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2NoZWNrX2NvZGVdKTtcbiAgICB0YmwubGV4X3RyYW5zX2NvZGUgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X3RyYW5zX2NvZGVdKTtcbiAgICB0YmwubGV4X2RlZmF1bHRfY29kZSA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2RlZmF1bHRfY29kZV0pO1xuICB9XG4gIGlmICh0YmwubGV4X2NvZGUgPT0gbnVsbCkgdGJsLmxleF9jb2RlID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyh0YmxbbGV4X2NvZGVdKTtcblxuICB2YXIgYywgc3RhdGUgPSBzdGFydF9zdGF0ZTtcblxuICB2YXIgYnVmZmVyID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhsZXhidWZbbGV4X2J1ZmZlcl0pO1xuXG4gIGlmIChzdGF0ZSA+PSAwKSB7XG4gICAgLyogRmlyc3QgZW50cnkgKi9cbiAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfc3RhcnRfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gLTE7XG4gIH0gZWxzZSB7XG4gICAgLyogUmVlbnRyeSBhZnRlciByZWZpbGwgKi9cbiAgICBzdGF0ZSA9IC1zdGF0ZSAtIDE7XG4gIH1cbiAgZm9yKDs7KSB7XG4gICAgLyogTG9va3VwIGJhc2UgYWRkcmVzcyBvciBhY3Rpb24gbnVtYmVyIGZvciBjdXJyZW50IHN0YXRlICovXG4gICAgdmFyIGJhc2UgPSB0YmwubGV4X2Jhc2Vbc3RhdGVdO1xuICAgIGlmIChiYXNlIDwgMCkge1xuICAgICAgdmFyIHBjX29mZiA9IHRibC5sZXhfYmFzZV9jb2RlW3N0YXRlXTtcbiAgICAgIGNhbWxfbGV4X3J1bl90YWcodGJsLmxleF9jb2RlLCBwY19vZmYsIGxleGJ1ZltsZXhfbWVtXSk7XG4gICAgICByZXR1cm4gLWJhc2UtMTtcbiAgICB9XG4gICAgLyogU2VlIGlmIGl0J3MgYSBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICB2YXIgYmFja3RyayA9IHRibC5sZXhfYmFja3Rya1tzdGF0ZV07XG4gICAgaWYgKGJhY2t0cmsgPj0gMCkge1xuICAgICAgdmFyIHBjX29mZiA9IHRibC5sZXhfYmFja3Rya19jb2RlW3N0YXRlXTtcbiAgICAgIGNhbWxfbGV4X3J1bl90YWcodGJsLmxleF9jb2RlLCBwY19vZmYsIGxleGJ1ZltsZXhfbWVtXSk7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKXtcbiAgICAgIGlmIChsZXhidWZbbGV4X2VvZl9yZWFjaGVkXSA9PSAwKVxuICAgICAgICByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2VcbiAgICAgICAgYyA9IDI1NjtcbiAgICB9ZWxzZXtcbiAgICAgIC8qIFJlYWQgbmV4dCBpbnB1dCBjaGFyICovXG4gICAgICBjID0gYnVmZmVyW2xleGJ1ZltsZXhfY3Vycl9wb3NdXTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdICsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIHZhciBwc3RhdGUgPSBzdGF0ZSA7XG4gICAgaWYgKHRibC5sZXhfY2hlY2tbYmFzZSArIGNdID09IHN0YXRlKVxuICAgICAgc3RhdGUgPSB0YmwubGV4X3RyYW5zW2Jhc2UgKyBjXTtcbiAgICBlbHNlXG4gICAgICBzdGF0ZSA9IHRibC5sZXhfZGVmYXVsdFtzdGF0ZV07XG4gICAgLyogSWYgbm8gdHJhbnNpdGlvbiBvbiB0aGlzIGNoYXIsIHJldHVybiB0byBsYXN0IGJhY2t0cmFjayBwb2ludCAqL1xuICAgIGlmIChzdGF0ZSA8IDApIHtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdID0gbGV4YnVmW2xleF9sYXN0X3Bvc107XG4gICAgICBpZiAobGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPT0gLTEpXG4gICAgICAgIGNhbWxfZmFpbHdpdGgoXCJsZXhpbmc6IGVtcHR5IHRva2VuXCIpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gbGV4YnVmW2xleF9sYXN0X2FjdGlvbl07XG4gICAgfWVsc2V7XG4gICAgICAvKiBJZiBzb21lIHRyYW5zaXRpb24sIGdldCBhbmQgcGVyZm9ybSBtZW1vcnkgbW92ZXMgKi9cbiAgICAgIHZhciBiYXNlX2NvZGUgPSB0YmwubGV4X2Jhc2VfY29kZVtwc3RhdGVdLCBwY19vZmY7XG4gICAgICBpZiAodGJsLmxleF9jaGVja19jb2RlW2Jhc2VfY29kZSArIGNdID09IHBzdGF0ZSlcbiAgICAgICAgcGNfb2ZmID0gdGJsLmxleF90cmFuc19jb2RlW2Jhc2VfY29kZSArIGNdO1xuICAgICAgZWxzZVxuICAgICAgICBwY19vZmYgPSB0YmwubGV4X2RlZmF1bHRfY29kZVtwc3RhdGVdO1xuICAgICAgaWYgKHBjX29mZiA+IDApXG4gICAgICAgIGNhbWxfbGV4X3J1bl9tZW1cbiAgICAgICh0YmwubGV4X2NvZGUsIHBjX29mZiwgbGV4YnVmW2xleF9tZW1dLCBsZXhidWZbbGV4X2N1cnJfcG9zXSk7XG4gICAgICAvKiBFcmFzZSB0aGUgRU9GIGNvbmRpdGlvbiBvbmx5IGlmIHRoZSBFT0YgcHNldWRvLWNoYXJhY3RlciB3YXNcbiAgICAgICAgIGNvbnN1bWVkIGJ5IHRoZSBhdXRvbWF0b24gKGkuZS4gdGhlcmUgd2FzIG5vIGJhY2t0cmFjayBhYm92ZSlcbiAgICAgICovXG4gICAgICBpZiAoYyA9PSAyNTYpIGxleGJ1ZltsZXhfZW9mX3JlYWNoZWRdID0gMDtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gQXJyYXlcblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zdWIgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9zdWIgKGEsIGksIGxlbikge1xuICB2YXIgYTIgPSBuZXcgQXJyYXkobGVuKzEpO1xuICBhMlswXT0wO1xuICBmb3IodmFyIGkyID0gMSwgaTE9IGkrMTsgaTIgPD0gbGVuOyBpMisrLGkxKysgKXtcbiAgICBhMltpMl09YVtpMV07XG4gIH1cbiAgcmV0dXJuIGEyO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2FwcGVuZCBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2FycmF5X2FwcGVuZChhMSwgYTIpIHtcbiAgdmFyIGwxID0gYTEubGVuZ3RoLCBsMiA9IGEyLmxlbmd0aDtcbiAgdmFyIGwgPSBsMStsMi0xXG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBhWzBdID0gMDtcbiAgdmFyIGkgPSAxLGogPSAxO1xuICBmb3IoO2k8bDE7aSsrKSBhW2ldPWExW2ldO1xuICBmb3IoO2k8bDtpKyssaisrKSBhW2ldPWEyW2pdO1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9jb25jYXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9jb25jYXQobCkge1xuICB2YXIgYSA9IFswXTtcbiAgd2hpbGUgKGwgIT09IDApIHtcbiAgICB2YXIgYiA9IGxbMV07XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBiLmxlbmd0aDsgaSsrKSBhLnB1c2goYltpXSk7XG4gICAgbCA9IGxbMl07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9hcnJheV9ibGl0KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgaWYgKGkyIDw9IGkxKSB7XG4gICAgZm9yICh2YXIgaiA9IDE7IGogPD0gbGVuOyBqKyspIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGogPSBsZW47IGogPj0gMTsgai0tKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9ibGl0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfYmxpdChhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIGlmIChpMiA8PSBpMSkge1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IGxlbjsgaisrKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBqID0gbGVuOyBqID49IDE7IGotLSkgYTJbaTIgKyBqXSA9IGExW2kxICsgal07XG4gIH07XG4gIHJldHVybiAwO1xufVxuXG4vLy8vLy8vLy8vLy8vIFBlcnZhc2l2ZVxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9zZXQgKG11dGFibGUsIGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9hcnJheV9zZXQgKGFycmF5LCBpbmRleCwgbmV3dmFsKSB7XG4gIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgYXJyYXlbaW5kZXgrMV09bmV3dmFsOyByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9nZXQgbXV0YWJsZSAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2FycmF5X2dldCAoYXJyYXksIGluZGV4KSB7XG4gIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gYXJyYXkubGVuZ3RoIC0gMSkpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5W2luZGV4KzFdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2ZpbGxcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfZmlsbChhcnJheSwgb2ZzLCBsZW4sIHYpe1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspe1xuICAgIGFycmF5W29mcytpKzFdID0gdjtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jaGVja19ib3VuZCAobXV0YWJsZSwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2NoZWNrX2JvdW5kIChhcnJheSwgaW5kZXgpIHtcbiAgaWYgKGluZGV4ID4+PiAwID49IGFycmF5Lmxlbmd0aCAtIDEpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFycmF5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfdmVjdCBjb25zdCAoY29uc3QsIG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX21ha2VfdmVjdCAobGVuLCBpbml0KSB7XG4gIGlmIChsZW4gPCAwKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBsZW4gPSBsZW4gKyAxIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXT0wO1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gaW5pdDtcbiAgcmV0dXJuIGI7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWFrZV9mbG9hdF92ZWN0IGNvbnN0IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfbWFrZV9mbG9hdF92ZWN0KGxlbil7XG4gIGlmIChsZW4gPCAwKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBsZW4gPSBsZW4gKyAxIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXT0yNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSAwO1xuICByZXR1cm4gYlxufVxuLy9Qcm92aWRlczogY2FtbF9mbG9hdGFycmF5X2NyZWF0ZSBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlKGxlbil7XG4gIGlmIChsZW4gPCAwKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHZhciBsZW4gPSBsZW4gKyAxIHwgMDtcbiAgdmFyIGIgPSBuZXcgQXJyYXkobGVuKTtcbiAgYlswXT0yNTQ7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuOyBpKyspIGJbaV0gPSAwO1xuICByZXR1cm4gYlxufVxuIiwiLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnRfcG9wY291bnQgY29uc3RcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50X3BvcGNvdW50KHYpIHtcbiAgdiA9IHYgLSAoKHYgPj4+IDEpICYgMHg1NTU1NTU1NSk7XG4gIHYgPSAodiAmIDB4MzMzMzMzMzMpICsgKCh2ID4+PiAyKSAmIDB4MzMzMzMzMzMpO1xuICByZXR1cm4gKCh2ICsgKHYgPj4+IDQpICYgMHhGMEYwRjBGKSAqIDB4MTAxMDEwMSkgPj4+IDI0O1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2NsZWFyX2NhbWxfYmFja3RyYWNlX3BvcyBjb25zdFxuZnVuY3Rpb24gQmFzZV9jbGVhcl9jYW1sX2JhY2t0cmFjZV9wb3MoeCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9jYW1sX2V4bl9pc19tb3N0X3JlY2VudF9leG4gY29uc3RcbmZ1bmN0aW9uIEJhc2VfY2FtbF9leG5faXNfbW9zdF9yZWNlbnRfZXhuKHgpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY2x6IGNvbnN0XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludDMyX2Nseih4KSB7XG4gIHZhciBuID0gMzI7XG4gIHZhciB5O1xuICB5ID0geCA+PjE2OyBpZiAoeSAhPSAwKSB7IG4gPSBuIC0xNjsgeCA9IHk7IH1cbiAgeSA9IHggPj4gODsgaWYgKHkgIT0gMCkgeyBuID0gbiAtIDg7IHggPSB5OyB9XG4gIHkgPSB4ID4+IDQ7IGlmICh5ICE9IDApIHsgbiA9IG4gLSA0OyB4ID0geTsgfVxuICB5ID0geCA+PiAyOyBpZiAoeSAhPSAwKSB7IG4gPSBuIC0gMjsgeCA9IHk7IH1cbiAgeSA9IHggPj4gMTsgaWYgKHkgIT0gMCkgcmV0dXJuIG4gLSAyO1xuICByZXR1cm4gbiAtIHg7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50X2NseiBjb25zdFxuLy9SZXF1aXJlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHpcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50X2Nseih4KSB7IHJldHVybiBCYXNlX2ludF9tYXRoX2ludDMyX2Nseih4KTsgfVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jbHogY29uc3Rcbi8vUmVxdWlyZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY2x6XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jbHooeCkgeyByZXR1cm4gQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHooeCk7IH1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnQ2NF9jbHogY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQsIGNhbWxfaW50NjRfaXNfemVybywgY2FtbF9pbnQ2NF90b19pbnQzMlxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnQ2NF9jbHooeCkge1xuICB2YXIgbiA9IDY0O1xuICB2YXIgeTtcbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMzIpO1xuICBpZiAoIWNhbWxfaW50NjRfaXNfemVybyh5KSkgeyBuID0gbiAtMzI7IHggPSB5OyB9XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDE2KTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHsgbiA9IG4gLTE2OyB4ID0geTsgfVxuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCA4KTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHsgbiA9IG4gLSA4OyB4ID0geTsgfVxuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCA0KTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHsgbiA9IG4gLSA0OyB4ID0geTsgfVxuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAyKTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHsgbiA9IG4gLSAyOyB4ID0geTsgfVxuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAxKTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHJldHVybiBuIC0gMjtcbiAgcmV0dXJuIG4gLSBjYW1sX2ludDY0X3RvX2ludDMyKHgpO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2N0eiBjb25zdFxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHooeCkge1xuICBpZiAoeCA9PT0gMCkgeyByZXR1cm4gMzI7IH1cbiAgdmFyIG4gPSAxO1xuICBpZiAoICh4ICYgMHgwMDAwRkZGRikgPT09IDApIHsgbiA9IG4gKyAxNjsgeCA9IHggPj4gMTY7IH1cbiAgaWYgKCAoeCAmIDB4MDAwMDAwRkYpID09PSAwKSB7IG4gPSBuICsgIDg7IHggPSB4ID4+ICA4OyB9XG4gIGlmICggKHggJiAweDAwMDAwMDBGKSA9PT0gMCkgeyBuID0gbiArICA0OyB4ID0geCA+PiAgNDsgfVxuICBpZiAoICh4ICYgMHgwMDAwMDAwMykgPT09IDApIHsgbiA9IG4gKyAgMjsgeCA9IHggPj4gIDI7IH1cbiAgcmV0dXJuIG4gLSAoeCAmIDEpO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludF9jdHogY29uc3Rcbi8vUmVxdWlyZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY3R6XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludF9jdHooeCkgeyByZXR1cm4gQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHooeCk7IH1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY3R6IGNvbnN0XG4vL1JlcXVpcmVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2N0elxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY3R6KHgpIHsgcmV0dXJuIEJhc2VfaW50X21hdGhfaW50MzJfY3R6KHgpOyB9XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50NjRfY3R6IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkLCBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfaW50NjRfdG9faW50MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYW5kLCBjYW1sX2ludDY0X29mX2ludDMyLCBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnQ2NF9jdHooeCkge1xuICBpZiAoY2FtbF9pbnQ2NF9pc196ZXJvKHgpKSB7IHJldHVybiA2NDsgfVxuICB2YXIgbiA9IDE7XG4gIGZ1bmN0aW9uIGlzX3plcm8gKHgpICAgIHsgcmV0dXJuIGNhbWxfaW50NjRfaXNfemVybyh4KTsgfVxuICBmdW5jdGlvbiBsYW5kICh4LHkpICAgICB7IHJldHVybiBjYW1sX2ludDY0X2FuZCh4LCB5KTsgfVxuICBmdW5jdGlvbiBzbWFsbF9pbnQ2NCh4KSB7IHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSh4LDAsMCk7IH1cbiAgaWYgKGlzX3plcm8obGFuZCh4LCBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgweEZGRkZGRiwgMHgwMDAwRkYsIDB4MDAwMCkpKSkge1xuICAgIG4gPSBuICsgMzI7IHggPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDMyKTtcbiAgfVxuICBpZiAoaXNfemVybyhsYW5kKHgsIHNtYWxsX2ludDY0KDB4MDBGRkZGKSkpKSB7XG4gICAgbiA9IG4gKyAxNjsgeCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMTYpO1xuICB9XG4gIGlmIChpc196ZXJvKGxhbmQoeCwgc21hbGxfaW50NjQoMHgwMDAwRkYpKSkpIHtcbiAgICBuID0gbiArICA4OyB4ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCA4KTtcbiAgfVxuICBpZiAoaXNfemVybyhsYW5kKHgsIHNtYWxsX2ludDY0KDB4MDAwMDBGKSkpKSB7XG4gICAgbiA9IG4gKyAgNDsgeCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgNCk7XG4gIH1cbiAgaWYgKGlzX3plcm8obGFuZCh4LCBzbWFsbF9pbnQ2NCgweDAwMDAwMykpKSkge1xuICAgIG4gPSBuICsgIDI7IHggPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDIpO1xuICB9XG4gIHJldHVybiBuIC0gKGNhbWxfaW50NjRfdG9faW50MzIoY2FtbF9pbnQ2NF9hbmQoeCwgc21hbGxfaW50NjQoMHgwMDAwMDEpKSkpO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludF9wb3dfc3R1YiBjb25zdFxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnRfcG93X3N0dWIoYmFzZSwgZXhwb25lbnQpIHtcbiAgdmFyIG9uZSA9IDE7XG4gIHZhciBtdWwgPSBbb25lLCBiYXNlLCBvbmUsIG9uZV07XG4gIHZhciByZXMgPSBvbmU7XG4gIHdoaWxlICghZXhwb25lbnQ9PTApIHtcbiAgICBtdWxbMV0gPSAobXVsWzFdICogbXVsWzNdKSB8IDA7XG4gICAgbXVsWzJdID0gKG11bFsxXSAqIG11bFsxXSkgfCAwO1xuICAgIG11bFszXSA9IChtdWxbMl0gKiBtdWxbMV0pIHwgMDtcbiAgICByZXMgPSAocmVzICogbXVsW2V4cG9uZW50ICYgM10pIHwgMDtcbiAgICBleHBvbmVudCA9IGV4cG9uZW50ID4+IDI7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnQ2NF9wb3dfc3R1YiBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9tdWwsIGNhbWxfaW50NjRfaXNfemVybywgY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGksIGNhbWxfaW50NjRfbG8zMlxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnQ2NF9wb3dfc3R1YihiYXNlLCBleHBvbmVudCkge1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkoMSwwKTtcbiAgdmFyIG11bCA9IFtvbmUsIGJhc2UsIG9uZSwgb25lXTtcbiAgdmFyIHJlcyA9IG9uZTtcbiAgd2hpbGUgKCFjYW1sX2ludDY0X2lzX3plcm8oZXhwb25lbnQpKSB7XG4gICAgbXVsWzFdID0gY2FtbF9pbnQ2NF9tdWwobXVsWzFdLCBtdWxbM10pO1xuICAgIG11bFsyXSA9IGNhbWxfaW50NjRfbXVsKG11bFsxXSwgbXVsWzFdKTtcbiAgICBtdWxbM10gPSBjYW1sX2ludDY0X211bChtdWxbMl0sIG11bFsxXSk7XG4gICAgcmVzID0gY2FtbF9pbnQ2NF9tdWwocmVzLCBtdWxbY2FtbF9pbnQ2NF9sbzMyKGV4cG9uZW50KSAmIDNdKTtcbiAgICBleHBvbmVudCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoZXhwb25lbnQsIDIpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaGFzaF9zdHJpbmcgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9oYXNoXG5mdW5jdGlvbiBCYXNlX2hhc2hfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaCgxLDEsMCxzKVxufVxuLy9Qcm92aWRlczogQmFzZV9oYXNoX2RvdWJsZSBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9oYXNoXG5mdW5jdGlvbiBCYXNlX2hhc2hfZG91YmxlKGQpIHtcbiAgcmV0dXJuIGNhbWxfaGFzaCgxLDEsMCxkKTtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9hbV90ZXN0aW5nIGNvbnN0XG4vL1dlYWtkZWZcbmZ1bmN0aW9uIEJhc2VfYW1fdGVzdGluZyh4KSB7XG4gIHJldHVybiAwO1xufVxuIiwiXG4vL1Byb3ZpZGVzOiBNbE11dGV4XG5mdW5jdGlvbiBNbE11dGV4KCkge1xuICB0aGlzLmxvY2tlZCA9IGZhbHNlXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfbmV3XG4vL1JlcXVpcmVzOiBNbE11dGV4XG5mdW5jdGlvbiBjYW1sX21sX211dGV4X25ldyh1bml0KSB7XG4gIHJldHVybiBuZXcgTWxNdXRleCgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X2xvY2tcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfbG9jayh0KSB7XG4gIGlmKHQubG9ja2VkKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJNdXRleC5sb2NrOiBtdXRleCBhbHJlYWR5IGxvY2tlZC4gQ2Fubm90IHdhaXQuXCIpO1xuICBlbHNlIHQubG9ja2VkID0gdHJ1ZTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2tcbmZ1bmN0aW9uIGNhbWxfbWxfbXV0ZXhfdHJ5X2xvY2sodCkge1xuICBpZighdC5sb2NrZWQpIHtcbiAgICB0LmxvY2tlZCA9IHRydWU7XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X3VubG9jayh0KSB7XG4gIHQubG9ja2VkID0gZmFsc2U7XG4gIHJldHVybiAwO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIFdlYWsgQVBJXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG52YXIgY2FtbF9lcGhlX2tleV9vZmZzZXQgPSAzXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxudmFyIGNhbWxfZXBoZV9kYXRhX29mZnNldCA9IDJcblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3NldF9rZXlcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfa2V5KHgsIGksIHYpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLnNldFwiKTtcbiAgaWYgKHYgaW5zdGFuY2VvZiBPYmplY3QgJiYgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgaWYoeFsxXS5yZWdpc3RlcikgeFsxXS5yZWdpc3Rlcih2LCB1bmRlZmluZWQsIHYpO1xuICAgIHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXSA9IG5ldyBnbG9iYWxUaGlzLldlYWtSZWYodik7XG4gIH1cbiAgZWxzZSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSB2O1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfdW5zZXRfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfdW5zZXRfa2V5KHgsIGkpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLnNldFwiKTtcbiAgaWYoZ2xvYmFsVGhpcy5XZWFrUmVmICYmIHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB4WzFdLnVucmVnaXN0ZXIpIHtcbiAgICB2YXIgb2xkID0geFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldLmRlcmVmKCk7XG4gICAgaWYob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjb3VudCA9IDBcbiAgICAgIGZvcih2YXIgaiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBqIDwgeC5sZW5ndGg7IGorKyl7XG4gICAgICAgIHZhciBrZXkgPSB4W2pdO1xuICAgICAgICBpZihrZXkgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYpe1xuICAgICAgICAgIGtleSA9IGtleS5kZXJlZigpXG4gICAgICAgICAgaWYoa2V5ID09PSBvbGQpIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmKGNvdW50ID09IDEpIHhbMV0udW5yZWdpc3RlcihvbGQpO1xuICAgIH1cbiAgfVxuICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSB1bmRlZmluZWQ7XG4gIHJldHVybiAwXG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF93ZWFrX2NyZWF0ZSwgY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfY3JlYXRlIChuKSB7XG4gIHZhciB4ID0gY2FtbF93ZWFrX2NyZWF0ZShuKTtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0LCBjYW1sX2ludmFsaWRfYXJndW1lbnQsY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX3dlYWtfY3JlYXRlIChuKSB7XG4gIGlmIChuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuY3JlYXRlXCIpO1xuICB2YXIgeCA9IFsyNTEsXCJjYW1sX2VwaGVfbGlzdF9oZWFkXCJdO1xuICB4Lmxlbmd0aCA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgbjtcbiAgcmV0dXJuIHg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd2Vha19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9SZXF1aXJlczogY2FtbF9lcGhlX3NldF9rZXksIGNhbWxfZXBoZV91bnNldF9rZXlcbmZ1bmN0aW9uIGNhbWxfd2Vha19zZXQoeCwgaSwgdikge1xuICBpZih2ID09IDApIGNhbWxfZXBoZV91bnNldF9rZXkoeCxpKVxuICBlbHNlIGNhbWxfZXBoZV9zZXRfa2V5KHgsaSx2WzFdKVxuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL0FsaWFzOiBjYW1sX3dlYWtfZ2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2tleSh4LCBpKSB7XG4gIGlmKGkgPCAwIHx8IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaSA+PSB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiV2Vhay5nZXRfa2V5XCIpO1xuICB2YXIgd2VhayA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpIF07XG4gIGlmKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB3ZWFrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB3ZWFrID0gd2Vhay5kZXJlZigpO1xuICByZXR1cm4gKHdlYWs9PT11bmRlZmluZWQpPzA6WzAsIHdlYWtdO1xufVxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9rZXlfY29weVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2dldF9rZXksY2FtbF9lcGhlX2tleV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL0FsaWFzOiBjYW1sX3dlYWtfZ2V0X2NvcHlcbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfa2V5X2NvcHkoeCwgaSkge1xuICBpZihpIDwgMCB8fCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgPj0geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuZ2V0X2NvcHlcIik7XG4gIHZhciB5ID0gY2FtbF9lcGhlX2dldF9rZXkoeCwgaSk7XG4gIGlmICh5ID09PSAwKSByZXR1cm4geTtcbiAgdmFyIHogPSB5WzFdO1xuICBpZiAoeiBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gWzAsIGNhbWxfb2JqX2R1cCh6KV07XG4gIHJldHVybiB5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfY2hlY2tfa2V5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL0FsaWFzOiBjYW1sX3dlYWtfY2hlY2tcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jaGVja19rZXkoeCwgaSkge1xuICB2YXIgd2VhayA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXTtcbiAgaWYoZ2xvYmFsVGhpcy5XZWFrUmVmICYmIHdlYWsgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYpIHdlYWsgPSB3ZWFrLmRlcmVmKCk7XG4gIGlmKHdlYWs9PT11bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2JsaXRfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JsaXRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL0FsaWFzOiBjYW1sX3dlYWtfYmxpdFxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfa2V5KGExLCBpMSwgYTIsIGkyLCBsZW4pIHtcbiAgLy8gbWludXMgb25lIGJlY2F1c2UgY2FtbF9hcnJheV9ibGl0IHdvcmtzIG9uIG9jYW1sIGFycmF5XG4gIGNhbWxfYXJyYXlfYmxpdChhMSwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpMSAtIDEsXG4gICAgICAgICAgICAgICAgICBhMiwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpMiAtIDEsXG4gICAgICAgICAgICAgICAgICBsZW4pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2JsaXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0LCBjYW1sX2VwaGVfc2V0X2RhdGEsIGNhbWxfZXBoZV91bnNldF9kYXRhXG5mdW5jdGlvbiBjYW1sX2VwaGVfYmxpdF9kYXRhKHNyYywgZHN0KXtcbiAgdmFyIG4gPSBzcmNbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XTtcbiAgaWYobiA9PT0gdW5kZWZpbmVkKSBjYW1sX2VwaGVfdW5zZXRfZGF0YShkc3QpO1xuICBlbHNlIGNhbWxfZXBoZV9zZXRfZGF0YShkc3QsIG4pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2dldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfZGF0YSh4KXtcbiAgaWYoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIDA7XG4gIGVsc2VcbiAgICByZXR1cm4gWzAsIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX2R1cFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9kYXRhX2NvcHkoeCl7XG4gIGlmKHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiAwO1xuICBlbHNlXG4gICAgcmV0dXJuIFswLCBjYW1sX29ial9kdXAoeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdKV07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9zZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0LCBjYW1sX2VwaGVfa2V5X29mZnNldCwgY2FtbF9lcGhlX3Vuc2V0X2RhdGFcbmZ1bmN0aW9uIGNhbWxfZXBoZV9zZXRfZGF0YSh4LCBkYXRhKXtcbiAgaWYoZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSAmJiBnbG9iYWxUaGlzLldlYWtSZWYpIHtcbiAgICBpZighICh4WzFdIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSkpIHtcbiAgICAgIHhbMV0gPSBuZXcgZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeShmdW5jdGlvbiAoKSB7IGNhbWxfZXBoZV91bnNldF9kYXRhKHgpIH0pO1xuICAgICAgLy9yZWdpc3RlciBhbGwga2V5c1xuICAgICAgZm9yKHZhciBqID0gY2FtbF9lcGhlX2tleV9vZmZzZXQ7IGogPCB4Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgdmFyIGtleSA9IHhbal07XG4gICAgICAgIGlmKGtleSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgICAgICAgIGtleSA9IGtleS5kZXJlZigpO1xuICAgICAgICAgIGlmKGtleSkgeFsxXS5yZWdpc3RlcihrZXksIHVuZGVmaW5lZCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPSBkYXRhO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX2tleV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV91bnNldF9kYXRhKHgpe1xuICBpZihnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5ICYmIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIGlmKHhbMV0gaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkZpbmFsaXphdGlvblJlZ2lzdHJ5KXtcbiAgICAgIC8vdW5yZWdpc3RlciBhbGwga2V5c1xuICAgICAgZm9yKHZhciBqID0gY2FtbF9lcGhlX2tleV9vZmZzZXQ7IGogPCB4Lmxlbmd0aDsgaisrKXtcbiAgICAgICAgdmFyIGtleSA9IHhbal07XG4gICAgICAgIGlmKGtleSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgICAgICAgIGtleSA9IGtleS5kZXJlZigpO1xuICAgICAgICAgIGlmKGtleSkgeFsxXS51bnJlZ2lzdGVyKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID0gdW5kZWZpbmVkO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NoZWNrX2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2NoZWNrX2RhdGEoeCl7XG4gIGlmKHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiAwO1xuICBlbHNlXG4gICAgcmV0dXJuIDE7XG59XG4iLCJcbi8vUHJvdmlkZXM6IGNhbWxfbHhtX25leHRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfc2hpZnRfbGVmdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF94b3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYWRkXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X211bFxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfMVxuLy9SZXF1aXJlczogY2FtbF9iYV9zZXRfMVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfbmV3X3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9seG1fbmV4dCh2KSB7XG4gIGZ1bmN0aW9uIHNoaWZ0X2woeCwgayl7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfc2hpZnRfbGVmdCh4LGspO1xuICB9XG4gIGZ1bmN0aW9uIHNoaWZ0X3IoeCwgayl7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCxrKTtcbiAgfVxuICBmdW5jdGlvbiBvcihhLCBiKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9vcihhLGIpO1xuICB9XG4gIGZ1bmN0aW9uIHhvcihhLCBiKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF94b3IoYSxiKTtcbiAgfVxuICBmdW5jdGlvbiBhZGQoYSwgYil7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfYWRkKGEsYik7XG4gIH1cbiAgZnVuY3Rpb24gbXVsKGEsIGIpe1xuICAgIHJldHVybiBjYW1sX2ludDY0X211bChhLGIpO1xuICB9XG4gIGZ1bmN0aW9uIHJvdGwoeCwgaykge1xuICAgIHJldHVybiBvcihzaGlmdF9sKHgsayksc2hpZnRfciAoeCwgNjQgLSBrKSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0KGEsIGkpIHtcbiAgICByZXR1cm4gY2FtbF9iYV9nZXRfMShhLCBpKTtcbiAgfVxuICBmdW5jdGlvbiBzZXQoYSwgaSwgeCkge1xuICAgIHJldHVybiBjYW1sX2JhX3NldF8xKGEsIGksIHgpO1xuICB9XG4gIHZhciBNID0gY2FtbF9pbnQ2NF9vZl9zdHJpbmcoY2FtbF9uZXdfc3RyaW5nKFwiMHhkMTM0MjU0M2RlODJlZjk1XCIpKTtcbiAgdmFyIGRhYmEgPSBjYW1sX2ludDY0X29mX3N0cmluZyhjYW1sX25ld19zdHJpbmcoXCIweGRhYmEwYjZlYjA5MzIyZTNcIikpO1xuICB2YXIgeiwgcTAsIHExO1xuICB2YXIgc3QgPSB2O1xuICB2YXIgYSA9IGdldChzdCwwKTtcbiAgdmFyIHMgPSBnZXQoc3QsMSk7XG4gIHZhciB4MCA9IGdldChzdCwyKTtcbiAgdmFyIHgxID0gZ2V0KHN0LDMpO1xuICAvKiBDb21iaW5pbmcgb3BlcmF0aW9uICovXG4gIHogPSBhZGQocywgeDApO1xuICAvKiBNaXhpbmcgZnVuY3Rpb24gKi9cbiAgeiA9IG11bCh4b3IoeixzaGlmdF9yKHosMzIpKSwgZGFiYSk7XG4gIHogPSBtdWwoeG9yKHosc2hpZnRfcih6LDMyKSksIGRhYmEpO1xuICB6ID0geG9yKHosc2hpZnRfcih6LDMyKSk7XG4gIC8qIExDRyB1cGRhdGUgKi9cbiAgc2V0KHN0LCAxLCBhZGQgKG11bChzLE0pLCBhKSk7XG4gIC8qIFhCRyB1cGRhdGUgKi9cbiAgdmFyIHEwID0geDBcbiAgdmFyIHExID0geDFcbiAgcTEgPSB4b3IocTEscTApO1xuICBxMCA9IHJvdGwocTAsIDI0KTtcbiAgcTAgPSB4b3IoeG9yKHEwLCBxMSksIChzaGlmdF9sKHExLDE2KSkpO1xuICBxMSA9IHJvdGwocTEsIDM3KTtcbiAgc2V0KHN0LCAyLCBxMCk7XG4gIHNldChzdCwgMywgcTEpO1xuICAvKiBSZXR1cm4gcmVzdWx0ICovXG4gIHJldHVybiB6O1xufVxuIiwiXG4vL1Byb3ZpZGVzOiB6c3RkX2RlY29tcHJlc3NcbnZhciB6c3RkX2RlY29tcHJlc3MgPSAoZnVuY3Rpb24gKCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG4vLyBhbGlhc2VzIGZvciBzaG9ydGVyIGNvbXByZXNzZWQgY29kZSAobW9zdCBtaW5pZmVycyBkb24ndCBkbyB0aGlzKVxudmFyIGFiID0gQXJyYXlCdWZmZXIsIHU4ID0gVWludDhBcnJheSwgdTE2ID0gVWludDE2QXJyYXksIGkxNiA9IEludDE2QXJyYXksIHUzMiA9IFVpbnQzMkFycmF5LCBpMzIgPSBJbnQzMkFycmF5O1xudmFyIHNsYyA9IGZ1bmN0aW9uICh2LCBzLCBlKSB7XG4gICAgaWYgKHU4LnByb3RvdHlwZS5zbGljZSlcbiAgICAgICAgcmV0dXJuIHU4LnByb3RvdHlwZS5zbGljZS5jYWxsKHYsIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApXG4gICAgICAgIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKVxuICAgICAgICBlID0gdi5sZW5ndGg7XG4gICAgdmFyIG4gPSBuZXcgdTgoZSAtIHMpO1xuICAgIG4uc2V0KHYuc3ViYXJyYXkocywgZSkpO1xuICAgIHJldHVybiBuO1xufTtcbnZhciBmaWxsID0gZnVuY3Rpb24gKHYsIG4sIHMsIGUpIHtcbiAgICBpZiAodTgucHJvdG90eXBlLmZpbGwpXG4gICAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuZmlsbC5jYWxsKHYsIG4sIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApXG4gICAgICAgIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKVxuICAgICAgICBlID0gdi5sZW5ndGg7XG4gICAgZm9yICg7IHMgPCBlOyArK3MpXG4gICAgICAgIHZbc10gPSBuO1xuICAgIHJldHVybiB2O1xufTtcbnZhciBjcHcgPSBmdW5jdGlvbiAodiwgdCwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuY29weVdpdGhpbilcbiAgICAgICAgcmV0dXJuIHU4LnByb3RvdHlwZS5jb3B5V2l0aGluLmNhbGwodiwgdCwgcywgZSk7XG4gICAgaWYgKHMgPT0gbnVsbCB8fCBzIDwgMClcbiAgICAgICAgcyA9IDA7XG4gICAgaWYgKGUgPT0gbnVsbCB8fCBlID4gdi5sZW5ndGgpXG4gICAgICAgIGUgPSB2Lmxlbmd0aDtcbiAgICB3aGlsZSAocyA8IGUpIHtcbiAgICAgICAgdlt0KytdID0gdltzKytdO1xuICAgIH1cbn07XG4vKipcbiAqIENvZGVzIGZvciBlcnJvcnMgZ2VuZXJhdGVkIHdpdGhpbiB0aGlzIGxpYnJhcnlcbiAqL1xuLy8gZXJyb3IgY29kZXNcbnZhciBlYyA9IFtcbiAgICAnaW52YWxpZCB6c3RkIGRhdGEnLFxuICAgICd3aW5kb3cgc2l6ZSB0b28gbGFyZ2UgKD4yMDQ2TUIpJyxcbiAgICAnaW52YWxpZCBibG9jayB0eXBlJyxcbiAgICAnRlNFIGFjY3VyYWN5IHRvbyBoaWdoJyxcbiAgICAnbWF0Y2ggZGlzdGFuY2UgdG9vIGZhciBiYWNrJyxcbiAgICAndW5leHBlY3RlZCBFT0YnXG5dO1xuO1xudmFyIGVyciA9IGZ1bmN0aW9uIChpbmQsIG1zZywgbnQpIHtcbiAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgfHwgZWNbaW5kXSk7XG4gICAgZS5jb2RlID0gaW5kO1xuICAgIGlmICghbnQpXG4gICAgICAgIHRocm93IGU7XG4gICAgcmV0dXJuIGU7XG59O1xudmFyIHJiID0gZnVuY3Rpb24gKGQsIGIsIG4pIHtcbiAgICB2YXIgaSA9IDAsIG8gPSAwO1xuICAgIGZvciAoOyBpIDwgbjsgKytpKVxuICAgICAgICBvIHw9IGRbYisrXSA8PCAoaSA8PCAzKTtcbiAgICByZXR1cm4gbztcbn07XG52YXIgYjQgPSBmdW5jdGlvbiAoZCwgYikgeyByZXR1cm4gKGRbYl0gfCAoZFtiICsgMV0gPDwgOCkgfCAoZFtiICsgMl0gPDwgMTYpIHwgKGRbYiArIDNdIDw8IDI0KSkgPj4+IDA7IH07XG4vLyByZWFkIFpzdGFuZGFyZCBmcmFtZSBoZWFkZXJcbnZhciByemZoID0gZnVuY3Rpb24gKGRhdCwgdykge1xuICAgIHZhciBuMyA9IGRhdFswXSB8IChkYXRbMV0gPDwgOCkgfCAoZGF0WzJdIDw8IDE2KTtcbiAgICBpZiAobjMgPT0gMHgyRkI1MjggJiYgZGF0WzNdID09IDI1Mykge1xuICAgICAgICAvLyBac3RhbmRhcmRcbiAgICAgICAgdmFyIGZsZyA9IGRhdFs0XTtcbiAgICAgICAgLy8gICAgc2luZ2xlIHNlZ21lbnQgICAgICAgY2hlY2tzdW0gICAgICAgICAgICAgZGljdCBmbGFnICAgICBmcmFtZSBjb250ZW50IGZsYWdcbiAgICAgICAgdmFyIHNzID0gKGZsZyA+PiA1KSAmIDEsIGNjID0gKGZsZyA+PiAyKSAmIDEsIGRmID0gZmxnICYgMywgZmNmID0gZmxnID4+IDY7XG4gICAgICAgIGlmIChmbGcgJiA4KVxuICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAvLyBieXRlXG4gICAgICAgIHZhciBidCA9IDYgLSBzcztcbiAgICAgICAgLy8gZGljdCBieXRlc1xuICAgICAgICB2YXIgZGIgPSBkZiA9PSAzID8gNCA6IGRmO1xuICAgICAgICAvLyBkaWN0aW9uYXJ5IGlkXG4gICAgICAgIHZhciBkaSA9IHJiKGRhdCwgYnQsIGRiKTtcbiAgICAgICAgYnQgKz0gZGI7XG4gICAgICAgIC8vIGZyYW1lIHNpemUgYnl0ZXNcbiAgICAgICAgdmFyIGZzYiA9IGZjZiA/ICgxIDw8IGZjZikgOiBzcztcbiAgICAgICAgLy8gZnJhbWUgc291cmNlIHNpemVcbiAgICAgICAgdmFyIGZzcyA9IHJiKGRhdCwgYnQsIGZzYikgKyAoKGZjZiA9PSAxKSAmJiAyNTYpO1xuICAgICAgICAvLyB3aW5kb3cgc2l6ZVxuICAgICAgICB2YXIgd3MgPSBmc3M7XG4gICAgICAgIGlmICghc3MpIHtcbiAgICAgICAgICAgIC8vIHdpbmRvdyBkZXNjcmlwdG9yXG4gICAgICAgICAgICB2YXIgd2IgPSAxIDw8ICgxMCArIChkYXRbNV0gPj4gMykpO1xuICAgICAgICAgICAgd3MgPSB3YiArICh3YiA+PiAzKSAqIChkYXRbNV0gJiA3KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod3MgPiAyMTQ1Mzg2NDk2KVxuICAgICAgICAgICAgZXJyKDEpO1xuICAgICAgICB2YXIgYnVmID0gbmV3IHU4KCh3ID09IDEgPyAoZnNzIHx8IHdzKSA6IHcgPyAwIDogd3MpICsgMTIpO1xuICAgICAgICBidWZbMF0gPSAxLCBidWZbNF0gPSA0LCBidWZbOF0gPSA4O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYjogYnQgKyBmc2IsXG4gICAgICAgICAgICB5OiAwLFxuICAgICAgICAgICAgbDogMCxcbiAgICAgICAgICAgIGQ6IGRpLFxuICAgICAgICAgICAgdzogKHcgJiYgdyAhPSAxKSA/IHcgOiBidWYuc3ViYXJyYXkoMTIpLFxuICAgICAgICAgICAgZTogd3MsXG4gICAgICAgICAgICBvOiBuZXcgaTMyKGJ1Zi5idWZmZXIsIDAsIDMpLFxuICAgICAgICAgICAgdTogZnNzLFxuICAgICAgICAgICAgYzogY2MsXG4gICAgICAgICAgICBtOiBNYXRoLm1pbigxMzEwNzIsIHdzKVxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmICgoKG4zID4+IDQpIHwgKGRhdFszXSA8PCAyMCkpID09IDB4MTg0RDJBNSkge1xuICAgICAgICAvLyBza2lwcGFibGVcbiAgICAgICAgcmV0dXJuIGI0KGRhdCwgNCkgKyA4O1xuICAgIH1cbiAgICBlcnIoMCk7XG59O1xuLy8gbW9zdCBzaWduaWZpY2FudCBiaXQgZm9yIG5vbnplcm9cbnZhciBtc2IgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFyIGJpdHMgPSAwO1xuICAgIGZvciAoOyAoMSA8PCBiaXRzKSA8PSB2YWw7ICsrYml0cylcbiAgICAgICAgO1xuICAgIHJldHVybiBiaXRzIC0gMTtcbn07XG4vLyByZWFkIGZpbml0ZSBzdGF0ZSBlbnRyb3B5XG52YXIgcmZzZSA9IGZ1bmN0aW9uIChkYXQsIGJ0LCBtYWwpIHtcbiAgICAvLyB0YWJsZSBwb3NcbiAgICB2YXIgdHBvcyA9IChidCA8PCAzKSArIDQ7XG4gICAgLy8gYWNjdXJhY3kgbG9nXG4gICAgdmFyIGFsID0gKGRhdFtidF0gJiAxNSkgKyA1O1xuICAgIGlmIChhbCA+IG1hbClcbiAgICAgICAgZXJyKDMpO1xuICAgIC8vIHNpemVcbiAgICB2YXIgc3ogPSAxIDw8IGFsO1xuICAgIC8vIHByb2JhYmlsaXRpZXMgc3ltYm9scyAgcmVwZWF0ICAgaW5kZXggICBoaWdoIHRocmVzaG9sZFxuICAgIHZhciBwcm9icyA9IHN6LCBzeW0gPSAtMSwgcmUgPSAtMSwgaSA9IC0xLCBodCA9IHN6O1xuICAgIC8vIG9wdGltaXphdGlvbjogc2luZ2xlIGFsbG9jYXRpb24gaXMgbXVjaCBmYXN0ZXJcbiAgICB2YXIgYnVmID0gbmV3IGFiKDUxMiArIChzeiA8PCAyKSk7XG4gICAgdmFyIGZyZXEgPSBuZXcgaTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICAvLyBzYW1lIHZpZXcgYXMgZnJlcVxuICAgIHZhciBkc3RhdGUgPSBuZXcgdTE2KGJ1ZiwgMCwgMjU2KTtcbiAgICB2YXIgbnN0YXRlID0gbmV3IHUxNihidWYsIDUxMiwgc3opO1xuICAgIHZhciBiYjEgPSA1MTIgKyAoc3ogPDwgMSk7XG4gICAgdmFyIHN5bXMgPSBuZXcgdTgoYnVmLCBiYjEsIHN6KTtcbiAgICB2YXIgbmJpdHMgPSBuZXcgdTgoYnVmLCBiYjEgKyBzeik7XG4gICAgd2hpbGUgKHN5bSA8IDI1NSAmJiBwcm9icyA+IDApIHtcbiAgICAgICAgdmFyIGJpdHMgPSBtc2IocHJvYnMgKyAxKTtcbiAgICAgICAgdmFyIGNidCA9IHRwb3MgPj4gMztcbiAgICAgICAgLy8gbWFza1xuICAgICAgICB2YXIgbXNrID0gKDEgPDwgKGJpdHMgKyAxKSkgLSAxO1xuICAgICAgICB2YXIgdmFsID0gKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj4gKHRwb3MgJiA3KSkgJiBtc2s7XG4gICAgICAgIC8vIG1hc2sgKDEgZmV3ZXIgYml0KVxuICAgICAgICB2YXIgbXNrMWZiID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgICAvLyBtYXggc21hbGwgdmFsdWVcbiAgICAgICAgdmFyIG1zdiA9IG1zayAtIHByb2JzIC0gMTtcbiAgICAgICAgLy8gc21hbGwgdmFsdWVcbiAgICAgICAgdmFyIHN2YWwgPSB2YWwgJiBtc2sxZmI7XG4gICAgICAgIGlmIChzdmFsIDwgbXN2KVxuICAgICAgICAgICAgdHBvcyArPSBiaXRzLCB2YWwgPSBzdmFsO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRwb3MgKz0gYml0cyArIDE7XG4gICAgICAgICAgICBpZiAodmFsID4gbXNrMWZiKVxuICAgICAgICAgICAgICAgIHZhbCAtPSBtc3Y7XG4gICAgICAgIH1cbiAgICAgICAgZnJlcVsrK3N5bV0gPSAtLXZhbDtcbiAgICAgICAgaWYgKHZhbCA9PSAtMSkge1xuICAgICAgICAgICAgcHJvYnMgKz0gdmFsO1xuICAgICAgICAgICAgc3ltc1stLWh0XSA9IHN5bTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBwcm9icyAtPSB2YWw7XG4gICAgICAgIGlmICghdmFsKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgLy8gcmVwZWF0IGJ5dGVcbiAgICAgICAgICAgICAgICB2YXIgcmJ0ID0gdHBvcyA+PiAzO1xuICAgICAgICAgICAgICAgIHJlID0gKChkYXRbcmJ0XSB8IChkYXRbcmJ0ICsgMV0gPDwgOCkpID4+ICh0cG9zICYgNykpICYgMztcbiAgICAgICAgICAgICAgICB0cG9zICs9IDI7XG4gICAgICAgICAgICAgICAgc3ltICs9IHJlO1xuICAgICAgICAgICAgfSB3aGlsZSAocmUgPT0gMyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN5bSA+IDI1NSB8fCBwcm9icylcbiAgICAgICAgZXJyKDApO1xuICAgIHZhciBzeW1wb3MgPSAwO1xuICAgIC8vIHN5bSBzdGVwIChjb3ByaW1lIHdpdGggc3ogLSBmb3JtdWxhIGZyb20genN0ZCBzb3VyY2UpXG4gICAgdmFyIHNzdGVwID0gKHN6ID4+IDEpICsgKHN6ID4+IDMpICsgMztcbiAgICAvLyBzeW0gbWFza1xuICAgIHZhciBzbWFzayA9IHN6IC0gMTtcbiAgICBmb3IgKHZhciBzID0gMDsgcyA8PSBzeW07ICsrcykge1xuICAgICAgICB2YXIgc2YgPSBmcmVxW3NdO1xuICAgICAgICBpZiAoc2YgPCAxKSB7XG4gICAgICAgICAgICBkc3RhdGVbc10gPSAtc2Y7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGlzIHNwbGl0IGludG8gdHdvIGxvb3BzIGluIHpzdGQgdG8gYXZvaWQgYnJhbmNoaW5nLCBidXQgYXMgSlMgaXMgaGlnaGVyLWxldmVsIHRoYXQgaXMgdW5uZWNlc3NhcnlcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNmOyArK2kpIHtcbiAgICAgICAgICAgIHN5bXNbc3ltcG9zXSA9IHM7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgc3ltcG9zID0gKHN5bXBvcyArIHNzdGVwKSAmIHNtYXNrO1xuICAgICAgICAgICAgfSB3aGlsZSAoc3ltcG9zID49IGh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZnRlciBzcHJlYWRpbmcgc3ltYm9scywgc2hvdWxkIGJlIHplcm8gYWdhaW5cbiAgICBpZiAoc3ltcG9zKVxuICAgICAgICBlcnIoMCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHN6OyArK2kpIHtcbiAgICAgICAgLy8gbmV4dCBzdGF0ZVxuICAgICAgICB2YXIgbnMgPSBkc3RhdGVbc3ltc1tpXV0rKztcbiAgICAgICAgLy8gbnVtIGJpdHNcbiAgICAgICAgdmFyIG5iID0gbmJpdHNbaV0gPSBhbCAtIG1zYihucyk7XG4gICAgICAgIG5zdGF0ZVtpXSA9IChucyA8PCBuYikgLSBzejtcbiAgICB9XG4gICAgcmV0dXJuIFsodHBvcyArIDcpID4+IDMsIHtcbiAgICAgICAgICAgIGI6IGFsLFxuICAgICAgICAgICAgczogc3ltcyxcbiAgICAgICAgICAgIG46IG5iaXRzLFxuICAgICAgICAgICAgdDogbnN0YXRlXG4gICAgICAgIH1dO1xufTtcbi8vIHJlYWQgaHVmZm1hblxudmFyIHJodSA9IGZ1bmN0aW9uIChkYXQsIGJ0KSB7XG4gICAgLy8gIGluZGV4ICB3ZWlnaHQgY291bnRcbiAgICB2YXIgaSA9IDAsIHdjID0gLTE7XG4gICAgLy8gICAgYnVmZmVyICAgICAgICAgICAgIGhlYWRlciBieXRlXG4gICAgdmFyIGJ1ZiA9IG5ldyB1OCgyOTIpLCBoYiA9IGRhdFtidF07XG4gICAgLy8gaHVmZm1hbiB3ZWlnaHRzXG4gICAgdmFyIGh3ID0gYnVmLnN1YmFycmF5KDAsIDI1Nik7XG4gICAgLy8gcmFuayBjb3VudFxuICAgIHZhciByYyA9IGJ1Zi5zdWJhcnJheSgyNTYsIDI2OCk7XG4gICAgLy8gcmFuayBpbmRleFxuICAgIHZhciByaSA9IG5ldyB1MTYoYnVmLmJ1ZmZlciwgMjY4KTtcbiAgICAvLyBOT1RFOiBhdCB0aGlzIHBvaW50IGJ0IGlzIDEgbGVzcyB0aGFuIGV4cGVjdGVkXG4gICAgaWYgKGhiIDwgMTI4KSB7XG4gICAgICAgIC8vIGVuZCBieXRlLCBmc2UgZGVjb2RlIHRhYmxlXG4gICAgICAgIHZhciBfYSA9IHJmc2UoZGF0LCBidCArIDEsIDYpLCBlYnQgPSBfYVswXSwgZmR0ID0gX2FbMV07XG4gICAgICAgIGJ0ICs9IGhiO1xuICAgICAgICB2YXIgZXBvcyA9IGVidCA8PCAzO1xuICAgICAgICAvLyBsYXN0IGJ5dGVcbiAgICAgICAgdmFyIGxiID0gZGF0W2J0XTtcbiAgICAgICAgaWYgKCFsYilcbiAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgLy8gIHN0YXRlMSAgIHN0YXRlMiAgIHN0YXRlMSBiaXRzICAgc3RhdGUyIGJpdHNcbiAgICAgICAgdmFyIHN0MSA9IDAsIHN0MiA9IDAsIGJ0cjEgPSBmZHQuYiwgYnRyMiA9IGJ0cjE7XG4gICAgICAgIC8vIGZzZSBwb3NcbiAgICAgICAgLy8gcHJlLWluY3JlbWVudCB0byBhY2NvdW50IGZvciBvcmlnaW5hbCBkZWZpY2l0IG9mIDFcbiAgICAgICAgdmFyIGZwb3MgPSAoKytidCA8PCAzKSAtIDggKyBtc2IobGIpO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBmcG9zIC09IGJ0cjE7XG4gICAgICAgICAgICBpZiAoZnBvcyA8IGVwb3MpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB2YXIgY2J0ID0gZnBvcyA+PiAzO1xuICAgICAgICAgICAgc3QxICs9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoZnBvcyAmIDcpKSAmICgoMSA8PCBidHIxKSAtIDEpO1xuICAgICAgICAgICAgaHdbKyt3Y10gPSBmZHQuc1tzdDFdO1xuICAgICAgICAgICAgZnBvcyAtPSBidHIyO1xuICAgICAgICAgICAgaWYgKGZwb3MgPCBlcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2J0ID0gZnBvcyA+PiAzO1xuICAgICAgICAgICAgc3QyICs9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoZnBvcyAmIDcpKSAmICgoMSA8PCBidHIyKSAtIDEpO1xuICAgICAgICAgICAgaHdbKyt3Y10gPSBmZHQuc1tzdDJdO1xuICAgICAgICAgICAgYnRyMSA9IGZkdC5uW3N0MV07XG4gICAgICAgICAgICBzdDEgPSBmZHQudFtzdDFdO1xuICAgICAgICAgICAgYnRyMiA9IGZkdC5uW3N0Ml07XG4gICAgICAgICAgICBzdDIgPSBmZHQudFtzdDJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICgrK3djID4gMjU1KVxuICAgICAgICAgICAgZXJyKDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgd2MgPSBoYiAtIDEyNztcbiAgICAgICAgZm9yICg7IGkgPCB3YzsgaSArPSAyKSB7XG4gICAgICAgICAgICB2YXIgYnl0ZSA9IGRhdFsrK2J0XTtcbiAgICAgICAgICAgIGh3W2ldID0gYnl0ZSA+PiA0O1xuICAgICAgICAgICAgaHdbaSArIDFdID0gYnl0ZSAmIDE1O1xuICAgICAgICB9XG4gICAgICAgICsrYnQ7XG4gICAgfVxuICAgIC8vIHdlaWdodCBleHBvbmVudGlhbCBzdW1cbiAgICB2YXIgd2VzID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgICB2YXIgd3QgPSBod1tpXTtcbiAgICAgICAgLy8gYml0cyBtdXN0IGJlIGF0IG1vc3QgMTEsIHNhbWUgYXMgd2VpZ2h0XG4gICAgICAgIGlmICh3dCA+IDExKVxuICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICB3ZXMgKz0gd3QgJiYgKDEgPDwgKHd0IC0gMSkpO1xuICAgIH1cbiAgICAvLyBtYXggYml0c1xuICAgIHZhciBtYiA9IG1zYih3ZXMpICsgMTtcbiAgICAvLyB0YWJsZSBzaXplXG4gICAgdmFyIHRzID0gMSA8PCBtYjtcbiAgICAvLyByZW1haW5pbmcgc3VtXG4gICAgdmFyIHJlbSA9IHRzIC0gd2VzO1xuICAgIC8vIG11c3QgYmUgcG93ZXIgb2YgMlxuICAgIGlmIChyZW0gJiAocmVtIC0gMSkpXG4gICAgICAgIGVycigwKTtcbiAgICBod1t3YysrXSA9IG1zYihyZW0pICsgMTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgICB2YXIgd3QgPSBod1tpXTtcbiAgICAgICAgKytyY1tod1tpXSA9IHd0ICYmIChtYiArIDEgLSB3dCldO1xuICAgIH1cbiAgICAvLyBodWYgYnVmXG4gICAgdmFyIGhidWYgPSBuZXcgdTgodHMgPDwgMSk7XG4gICAgLy8gICAgc3ltYm9scyAgICAgICAgICAgICAgICAgICAgICBudW0gYml0c1xuICAgIHZhciBzeW1zID0gaGJ1Zi5zdWJhcnJheSgwLCB0cyksIG5iID0gaGJ1Zi5zdWJhcnJheSh0cyk7XG4gICAgcmlbbWJdID0gMDtcbiAgICBmb3IgKGkgPSBtYjsgaSA+IDA7IC0taSkge1xuICAgICAgICB2YXIgcHYgPSByaVtpXTtcbiAgICAgICAgZmlsbChuYiwgaSwgcHYsIHJpW2kgLSAxXSA9IHB2ICsgcmNbaV0gKiAoMSA8PCAobWIgLSBpKSkpO1xuICAgIH1cbiAgICBpZiAocmlbMF0gIT0gdHMpXG4gICAgICAgIGVycigwKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgd2M7ICsraSkge1xuICAgICAgICB2YXIgYml0cyA9IGh3W2ldO1xuICAgICAgICBpZiAoYml0cykge1xuICAgICAgICAgICAgdmFyIGNvZGUgPSByaVtiaXRzXTtcbiAgICAgICAgICAgIGZpbGwoc3ltcywgaSwgY29kZSwgcmlbYml0c10gPSBjb2RlICsgKDEgPDwgKG1iIC0gYml0cykpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW2J0LCB7XG4gICAgICAgICAgICBuOiBuYixcbiAgICAgICAgICAgIGI6IG1iLFxuICAgICAgICAgICAgczogc3ltc1xuICAgICAgICB9XTtcbn07XG4vLyBUYWJsZXMgZ2VuZXJhdGVkIHVzaW5nIHRoaXM6XG4vLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDFhcnJvd3ovYTk3OTQ1MmQ0MzU1OTkyY2JmOGYyNTdjYmZmYzllZGRcbi8vIGRlZmF1bHQgbGl0ZXJhbCBsZW5ndGggdGFibGVcbnZhciBkbGx0ID0gLyojX19QVVJFX18qLyByZnNlKC8qI19fUFVSRV9fKi8gbmV3IHU4KFtcbiAgICA4MSwgMTYsIDk5LCAxNDAsIDQ5LCAxOTgsIDI0LCA5OSwgMTIsIDMzLCAxOTYsIDI0LCA5OSwgMTAyLCAxMDIsIDEzNCwgNzAsIDE0NiwgNFxuXSksIDAsIDYpWzFdO1xuLy8gZGVmYXVsdCBtYXRjaCBsZW5ndGggdGFibGVcbnZhciBkbWx0ID0gLyojX19QVVJFX18qLyByZnNlKC8qI19fUFVSRV9fKi8gbmV3IHU4KFtcbiAgICAzMywgMjAsIDE5NiwgMjQsIDk5LCAxNDAsIDMzLCAxMzIsIDE2LCA2NiwgOCwgMzMsIDEzMiwgMTYsIDY2LCA4LCAzMywgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCAzNiwgOVxuXSksIDAsIDYpWzFdO1xuLy8gZGVmYXVsdCBvZmZzZXQgY29kZSB0YWJsZVxudmFyIGRvY3QgPSAvKiNfX1BVUkVfXyAqLyByZnNlKC8qI19fUFVSRV9fKi8gbmV3IHU4KFtcbiAgICAzMiwgMTMyLCAxNiwgNjYsIDEwMiwgNzAsIDY4LCA2OCwgNjgsIDY4LCAzNiwgNzMsIDJcbl0pLCAwLCA1KVsxXTtcbi8vIGJpdHMgdG8gYmFzZWxpbmVcbnZhciBiMmJsID0gZnVuY3Rpb24gKGIsIHMpIHtcbiAgICB2YXIgbGVuID0gYi5sZW5ndGgsIGJsID0gbmV3IGkzMihsZW4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgYmxbaV0gPSBzO1xuICAgICAgICBzICs9IDEgPDwgYltpXTtcbiAgICB9XG4gICAgcmV0dXJuIGJsO1xufTtcbi8vIGxpdGVyYWwgbGVuZ3RoIGJpdHNcbnZhciBsbGIgPSAvKiNfX1BVUkVfXyAqLyBuZXcgdTgoKCAvKiNfX1BVUkVfXyAqL25ldyBpMzIoW1xuICAgIDAsIDAsIDAsIDAsIDE2ODQzMDA5LCA1MDUyODc3MCwgMTM0Njc4MDIwLCAyMDIwNTAwNTcsIDI2OTQyMjA5M1xuXSkpLmJ1ZmZlciwgMCwgMzYpO1xuLy8gbGl0ZXJhbCBsZW5ndGggYmFzZWxpbmVcbnZhciBsbGJsID0gLyojX19QVVJFX18gKi8gYjJibChsbGIsIDApO1xuLy8gbWF0Y2ggbGVuZ3RoIGJpdHNcbnZhciBtbGIgPSAvKiNfX1BVUkVfXyAqLyBuZXcgdTgoKCAvKiNfX1BVUkVfXyAqL25ldyBpMzIoW1xuICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDE2ODQzMDA5LCA1MDUyODc3MCwgMTE3NzY5MjIwLCAxODUyMDcwNDgsIDI1MjU3OTA4NCwgMTZcbl0pKS5idWZmZXIsIDAsIDUzKTtcbi8vIG1hdGNoIGxlbmd0aCBiYXNlbGluZVxudmFyIG1sYmwgPSAvKiNfX1BVUkVfXyAqLyBiMmJsKG1sYiwgMyk7XG4vLyBkZWNvZGUgaHVmZm1hbiBzdHJlYW1cbnZhciBkaHUgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGxlbiA9IGRhdC5sZW5ndGgsIHNzID0gb3V0Lmxlbmd0aCwgbGIgPSBkYXRbbGVuIC0gMV0sIG1zayA9ICgxIDw8IGh1LmIpIC0gMSwgZWIgPSAtaHUuYjtcbiAgICBpZiAoIWxiKVxuICAgICAgICBlcnIoMCk7XG4gICAgdmFyIHN0ID0gMCwgYnRyID0gaHUuYiwgcG9zID0gKGxlbiA8PCAzKSAtIDggKyBtc2IobGIpIC0gYnRyLCBpID0gLTE7XG4gICAgZm9yICg7IHBvcyA+IGViICYmIGkgPCBzczspIHtcbiAgICAgICAgdmFyIGNidCA9IHBvcyA+PiAzO1xuICAgICAgICB2YXIgdmFsID0gKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PiAocG9zICYgNyk7XG4gICAgICAgIHN0ID0gKChzdCA8PCBidHIpIHwgdmFsKSAmIG1zaztcbiAgICAgICAgb3V0WysraV0gPSBodS5zW3N0XTtcbiAgICAgICAgcG9zIC09IChidHIgPSBodS5uW3N0XSk7XG4gICAgfVxuICAgIGlmIChwb3MgIT0gZWIgfHwgaSArIDEgIT0gc3MpXG4gICAgICAgIGVycigwKTtcbn07XG4vLyBkZWNvZGUgaHVmZm1hbiBzdHJlYW0gNHhcbi8vIFRPRE86IHVzZSB3b3JrZXJzIHRvIHBhcmFsbGVsaXplXG52YXIgZGh1NCA9IGZ1bmN0aW9uIChkYXQsIG91dCwgaHUpIHtcbiAgICB2YXIgYnQgPSA2O1xuICAgIHZhciBzcyA9IG91dC5sZW5ndGgsIHN6MSA9IChzcyArIDMpID4+IDIsIHN6MiA9IHN6MSA8PCAxLCBzejMgPSBzejEgKyBzejI7XG4gICAgZGh1KGRhdC5zdWJhcnJheShidCwgYnQgKz0gZGF0WzBdIHwgKGRhdFsxXSA8PCA4KSksIG91dC5zdWJhcnJheSgwLCBzejEpLCBodSk7XG4gICAgZGh1KGRhdC5zdWJhcnJheShidCwgYnQgKz0gZGF0WzJdIHwgKGRhdFszXSA8PCA4KSksIG91dC5zdWJhcnJheShzejEsIHN6MiksIGh1KTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0LCBidCArPSBkYXRbNF0gfCAoZGF0WzVdIDw8IDgpKSwgb3V0LnN1YmFycmF5KHN6Miwgc3ozKSwgaHUpO1xuICAgIGRodShkYXQuc3ViYXJyYXkoYnQpLCBvdXQuc3ViYXJyYXkoc3ozKSwgaHUpO1xufTtcbi8vIHJlYWQgWnN0YW5kYXJkIGJsb2NrXG52YXIgcnpiID0gZnVuY3Rpb24gKGRhdCwgc3QsIG91dCkge1xuICAgIHZhciBfYTtcbiAgICB2YXIgYnQgPSBzdC5iO1xuICAgIC8vICAgIGJ5dGUgMCAgICAgICAgYmxvY2sgdHlwZVxuICAgIHZhciBiMCA9IGRhdFtidF0sIGJ0eXBlID0gKGIwID4+IDEpICYgMztcbiAgICBzdC5sID0gYjAgJiAxO1xuICAgIHZhciBzeiA9IChiMCA+PiAzKSB8IChkYXRbYnQgKyAxXSA8PCA1KSB8IChkYXRbYnQgKyAyXSA8PCAxMyk7XG4gICAgLy8gZW5kIGJ5dGUgZm9yIGJsb2NrXG4gICAgdmFyIGVidCA9IChidCArPSAzKSArIHN6O1xuICAgIGlmIChidHlwZSA9PSAxKSB7XG4gICAgICAgIGlmIChidCA+PSBkYXQubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzdC5iID0gYnQgKyAxO1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICBmaWxsKG91dCwgZGF0W2J0XSwgc3QueSwgc3QueSArPSBzeik7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWxsKG5ldyB1OChzeiksIGRhdFtidF0pO1xuICAgIH1cbiAgICBpZiAoZWJ0ID4gZGF0Lmxlbmd0aClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChidHlwZSA9PSAwKSB7XG4gICAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgICAgIG91dC5zZXQoZGF0LnN1YmFycmF5KGJ0LCBlYnQpLCBzdC55KTtcbiAgICAgICAgICAgIHN0LnkgKz0gc3o7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzbGMoZGF0LCBidCwgZWJ0KTtcbiAgICB9XG4gICAgaWYgKGJ0eXBlID09IDIpIHtcbiAgICAgICAgLy8gICAgYnl0ZSAzICAgICAgICBsaXQgYnR5cGUgICAgIHNpemUgZm9ybWF0XG4gICAgICAgIHZhciBiMyA9IGRhdFtidF0sIGxidCA9IGIzICYgMywgc2YgPSAoYjMgPj4gMikgJiAzO1xuICAgICAgICAvLyBsaXQgc3JjIHNpemUgIGxpdCBjbXAgc3ogNCBzdHJlYW1zXG4gICAgICAgIHZhciBsc3MgPSBiMyA+PiA0LCBsY3MgPSAwLCBzNCA9IDA7XG4gICAgICAgIGlmIChsYnQgPCAyKSB7XG4gICAgICAgICAgICBpZiAoc2YgJiAxKVxuICAgICAgICAgICAgICAgIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKChzZiAmIDIpICYmIChkYXRbKytidF0gPDwgMTIpKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsc3MgPSBiMyA+PiAzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgczQgPSBzZjtcbiAgICAgICAgICAgIGlmIChzZiA8IDIpXG4gICAgICAgICAgICAgICAgbHNzIHw9ICgoZGF0WysrYnRdICYgNjMpIDw8IDQpLCBsY3MgPSAoZGF0W2J0XSA+PiA2KSB8IChkYXRbKytidF0gPDwgMik7XG4gICAgICAgICAgICBlbHNlIGlmIChzZiA9PSAyKVxuICAgICAgICAgICAgICAgIGxzcyB8PSAoZGF0WysrYnRdIDw8IDQpIHwgKChkYXRbKytidF0gJiAzKSA8PCAxMiksIGxjcyA9IChkYXRbYnRdID4+IDIpIHwgKGRhdFsrK2J0XSA8PCA2KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoZGF0WysrYnRdICYgNjMpIDw8IDEyKSwgbGNzID0gKGRhdFtidF0gPj4gNikgfCAoZGF0WysrYnRdIDw8IDIpIHwgKGRhdFsrK2J0XSA8PCAxMCk7XG4gICAgICAgIH1cbiAgICAgICAgKytidDtcbiAgICAgICAgLy8gYWRkIGxpdGVyYWxzIHRvIGVuZCAtIGNhbiBuZXZlciBvdmVybGFwIHdpdGggYmFja3JlZmVyZW5jZXMgYmVjYXVzZSB1bnVzZWQgbGl0ZXJhbHMgYWx3YXlzIGFwcGVuZGVkXG4gICAgICAgIHZhciBidWYgPSBvdXQgPyBvdXQuc3ViYXJyYXkoc3QueSwgc3QueSArIHN0Lm0pIDogbmV3IHU4KHN0Lm0pO1xuICAgICAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgbGl0ZXJhbHNcbiAgICAgICAgdmFyIHNwbCA9IGJ1Zi5sZW5ndGggLSBsc3M7XG4gICAgICAgIGlmIChsYnQgPT0gMClcbiAgICAgICAgICAgIGJ1Zi5zZXQoZGF0LnN1YmFycmF5KGJ0LCBidCArPSBsc3MpLCBzcGwpO1xuICAgICAgICBlbHNlIGlmIChsYnQgPT0gMSlcbiAgICAgICAgICAgIGZpbGwoYnVmLCBkYXRbYnQrK10sIHNwbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gaHVmZm1hbiB0YWJsZVxuICAgICAgICAgICAgdmFyIGh1ID0gc3QuaDtcbiAgICAgICAgICAgIGlmIChsYnQgPT0gMikge1xuICAgICAgICAgICAgICAgIHZhciBodWQgPSByaHUoZGF0LCBidCk7XG4gICAgICAgICAgICAgICAgLy8gc3VidHJhY3QgZGVzY3JpcHRpb24gbGVuZ3RoXG4gICAgICAgICAgICAgICAgbGNzICs9IGJ0IC0gKGJ0ID0gaHVkWzBdKTtcbiAgICAgICAgICAgICAgICBzdC5oID0gaHUgPSBodWRbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghaHUpXG4gICAgICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAgICAgKHM0ID8gZGh1NCA6IGRodSkoZGF0LnN1YmFycmF5KGJ0LCBidCArPSBsY3MpLCBidWYuc3ViYXJyYXkoc3BsKSwgaHUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIG51bSBzZXF1ZW5jZXNcbiAgICAgICAgdmFyIG5zID0gZGF0W2J0KytdO1xuICAgICAgICBpZiAobnMpIHtcbiAgICAgICAgICAgIGlmIChucyA9PSAyNTUpXG4gICAgICAgICAgICAgICAgbnMgPSAoZGF0W2J0KytdIHwgKGRhdFtidCsrXSA8PCA4KSkgKyAweDdGMDA7XG4gICAgICAgICAgICBlbHNlIGlmIChucyA+IDEyNylcbiAgICAgICAgICAgICAgICBucyA9ICgobnMgLSAxMjgpIDw8IDgpIHwgZGF0W2J0KytdO1xuICAgICAgICAgICAgLy8gc3ltYm9sIGNvbXByZXNzaW9uIG1vZGVzXG4gICAgICAgICAgICB2YXIgc2NtID0gZGF0W2J0KytdO1xuICAgICAgICAgICAgaWYgKHNjbSAmIDMpXG4gICAgICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAgICAgdmFyIGR0cyA9IFtkbWx0LCBkb2N0LCBkbGx0XTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAyOyBpID4gLTE7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBtZCA9IChzY20gPj4gKChpIDw8IDEpICsgMikpICYgMztcbiAgICAgICAgICAgICAgICBpZiAobWQgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBybGUgYnVmXG4gICAgICAgICAgICAgICAgICAgIHZhciByYnVmID0gbmV3IHU4KFswLCAwLCBkYXRbYnQrK11dKTtcbiAgICAgICAgICAgICAgICAgICAgZHRzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgczogcmJ1Zi5zdWJhcnJheSgyLCAzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG46IHJidWYuc3ViYXJyYXkoMCwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0OiBuZXcgdTE2KHJidWYuYnVmZmVyLCAwLCAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGI6IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWQgPT0gMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhY2N1cmFjeSBsb2cgOCBmb3Igb2Zmc2V0cywgOSBmb3Igb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgIF9hID0gcmZzZShkYXQsIGJ0LCA5IC0gKGkgJiAxKSksIGJ0ID0gX2FbMF0sIGR0c1tpXSA9IF9hWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZCA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghc3QudClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgICAgICAgICAgZHRzW2ldID0gc3QudFtpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2IgPSBzdC50ID0gZHRzLCBtbHQgPSBfYlswXSwgb2N0ID0gX2JbMV0sIGxsdCA9IF9iWzJdO1xuICAgICAgICAgICAgdmFyIGxiID0gZGF0W2VidCAtIDFdO1xuICAgICAgICAgICAgaWYgKCFsYilcbiAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICB2YXIgc3BvcyA9IChlYnQgPDwgMykgLSA4ICsgbXNiKGxiKSAtIGxsdC5iLCBjYnQgPSBzcG9zID4+IDMsIG91YnQgPSAwO1xuICAgICAgICAgICAgdmFyIGxzdCA9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBsbHQuYikgLSAxKTtcbiAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG9jdC5iKSA+PiAzO1xuICAgICAgICAgICAgdmFyIG9zdCA9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBvY3QuYikgLSAxKTtcbiAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG1sdC5iKSA+PiAzO1xuICAgICAgICAgICAgdmFyIG1zdCA9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBtbHQuYikgLSAxKTtcbiAgICAgICAgICAgIGZvciAoKytuczsgLS1uczspIHtcbiAgICAgICAgICAgICAgICB2YXIgbGxjID0gbGx0LnNbbHN0XTtcbiAgICAgICAgICAgICAgICB2YXIgbGJ0ciA9IGxsdC5uW2xzdF07XG4gICAgICAgICAgICAgICAgdmFyIG1sYyA9IG1sdC5zW21zdF07XG4gICAgICAgICAgICAgICAgdmFyIG1idHIgPSBtbHQublttc3RdO1xuICAgICAgICAgICAgICAgIHZhciBvZmMgPSBvY3Quc1tvc3RdO1xuICAgICAgICAgICAgICAgIHZhciBvYnRyID0gb2N0Lm5bb3N0XTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBvZmMpID4+IDM7XG4gICAgICAgICAgICAgICAgdmFyIG9mcCA9IDEgPDwgb2ZjO1xuICAgICAgICAgICAgICAgIHZhciBvZmYgPSBvZnAgKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSB8IChkYXRbY2J0ICsgM10gPDwgMjQpKSA+Pj4gKHNwb3MgJiA3KSkgJiAob2ZwIC0gMSkpO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG1sYlttbGNdKSA+PiAzO1xuICAgICAgICAgICAgICAgIHZhciBtbCA9IG1sYmxbbWxjXSArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBtbGJbbWxjXSkgLSAxKSk7XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbGxiW2xsY10pID4+IDM7XG4gICAgICAgICAgICAgICAgdmFyIGxsID0gbGxibFtsbGNdICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxsYltsbGNdKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBsYnRyKSA+PiAzO1xuICAgICAgICAgICAgICAgIGxzdCA9IGxsdC50W2xzdF0gKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IGxidHIpIC0gMSkpO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG1idHIpID4+IDM7XG4gICAgICAgICAgICAgICAgbXN0ID0gbWx0LnRbbXN0XSArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbWJ0cikgLSAxKSk7XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2J0cikgPj4gMztcbiAgICAgICAgICAgICAgICBvc3QgPSBvY3QudFtvc3RdICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBvYnRyKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBpZiAob2ZmID4gMykge1xuICAgICAgICAgICAgICAgICAgICBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgICAgICAgICAgc3Qub1sxXSA9IHN0Lm9bMF07XG4gICAgICAgICAgICAgICAgICAgIHN0Lm9bMF0gPSBvZmYgLT0gMztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBvZmYgLSAobGwgIT0gMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9mZiA9IGlkeCA9PSAzID8gc3Qub1swXSAtIDEgOiBzdC5vW2lkeF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID4gMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC5vWzJdID0gc3Qub1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0Lm9bMV0gPSBzdC5vWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Qub1swXSA9IG9mZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBvZmYgPSBzdC5vWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxsOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IGJ1ZltzcGwgKyBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3VidCArPSBsbCwgc3BsICs9IGxsO1xuICAgICAgICAgICAgICAgIHZhciBzdGluID0gb3VidCAtIG9mZjtcbiAgICAgICAgICAgICAgICBpZiAoc3RpbiA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IC1zdGluO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnMgPSBzdC5lICsgc3RpbjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IG1sKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gbWw7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBzdC53W2JzICsgaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb3VidCArPSBsZW4sIG1sIC09IGxlbiwgc3RpbiA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWw7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBidWZbb3VidCArIGldID0gYnVmW3N0aW4gKyBpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3VidCArPSBtbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvdWJ0ICE9IHNwbCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChzcGwgPCBidWYubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZltvdWJ0KytdID0gYnVmW3NwbCsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgb3VidCA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgICAgICBpZiAob3V0KVxuICAgICAgICAgICAgICAgIHN0LnkgKz0gb3VidDtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBidWYgPSBzbGMoYnVmLCAwLCBvdWJ0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvdXQpIHtcbiAgICAgICAgICAgICAgICBzdC55ICs9IGxzcztcbiAgICAgICAgICAgICAgICBpZiAoc3BsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbHNzOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9IGJ1ZltzcGwgKyBpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNwbClcbiAgICAgICAgICAgICAgICBidWYgPSBzbGMoYnVmLCBzcGwpO1xuICAgICAgICB9XG4gICAgICAgIHN0LmIgPSBlYnQ7XG4gICAgICAgIHJldHVybiBidWY7XG4gICAgfVxuICAgIGVycigyKTtcbn07XG4vLyBjb25jYXRcbnZhciBjY3QgPSBmdW5jdGlvbiAoYnVmcywgb2wpIHtcbiAgICBpZiAoYnVmcy5sZW5ndGggPT0gMSlcbiAgICAgICAgcmV0dXJuIGJ1ZnNbMF07XG4gICAgdmFyIGJ1ZiA9IG5ldyB1OChvbCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIGIgPSAwOyBpIDwgYnVmcy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgY2hrID0gYnVmc1tpXTtcbiAgICAgICAgYnVmLnNldChjaGssIGIpO1xuICAgICAgICBiICs9IGNoay5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBidWY7XG59O1xuLyoqXG4gKiBEZWNvbXByZXNzZXMgWnN0YW5kYXJkIGRhdGFcbiAqIEBwYXJhbSBkYXQgVGhlIGlucHV0IGRhdGFcbiAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBidWZmZXIuIElmIHVuc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZVxuICogICAgICAgICAgICBleGFjdGx5IGVub3VnaCBtZW1vcnkgdG8gZml0IHRoZSBkZWNvbXByZXNzZWQgZGF0YS4gSWYgeW91clxuICogICAgICAgICAgICBkYXRhIGhhcyBtdWx0aXBsZSBmcmFtZXMgYW5kIHlvdSBrbm93IHRoZSBvdXRwdXQgc2l6ZSwgc3BlY2lmeWluZ1xuICogICAgICAgICAgICBpdCB3aWxsIHlpZWxkIGJldHRlciBwZXJmb3JtYW5jZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgZGF0YVxuICovXG5yZXR1cm4gZnVuY3Rpb24gZGVjb21wcmVzcyhkYXQsIGJ1Zikge1xuICAgIHZhciBidCA9IDAsIGJ1ZnMgPSBbXSwgbmIgPSArIWJ1Ziwgb2wgPSAwO1xuICAgIGZvciAoOyBkYXQubGVuZ3RoOykge1xuICAgICAgICB2YXIgc3QgPSByemZoKGRhdCwgbmIgfHwgYnVmKTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdCA9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKG5iKSB7XG4gICAgICAgICAgICAgICAgYnVmID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoc3Qudy5sZW5ndGggPT0gc3QudSkge1xuICAgICAgICAgICAgICAgICAgICBidWZzLnB1c2goYnVmID0gc3Qudyk7XG4gICAgICAgICAgICAgICAgICAgIG9sICs9IHN0LnU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVmcy5wdXNoKGJ1Zik7XG4gICAgICAgICAgICAgICAgc3QuZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDsgIXN0Lmw7KSB7XG4gICAgICAgICAgICAgICAgdmFyIGJsayA9IHJ6YihkYXQsIHN0LCBidWYpO1xuICAgICAgICAgICAgICAgIGlmICghYmxrKVxuICAgICAgICAgICAgICAgICAgICBlcnIoNSk7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZilcbiAgICAgICAgICAgICAgICAgICAgc3QuZSA9IHN0Lnk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZnMucHVzaChibGspO1xuICAgICAgICAgICAgICAgICAgICBvbCArPSBibGsubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBjcHcoc3QudywgMCwgYmxrLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgIHN0Lncuc2V0KGJsaywgc3Qudy5sZW5ndGggLSBibGsubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidCA9IHN0LmIgKyAoc3QuYyAqIDQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJ0ID0gc3Q7XG4gICAgICAgIGRhdCA9IGRhdC5zdWJhcnJheShidCk7XG4gICAgfVxuICAgIHJldHVybiBjY3QoYnVmcywgb2wpO1xufVxufSkgKClcbiIsIi8vLy8vLy8vLyBUSU1FX05PV1xuXG4vL1Byb3ZpZGVzOiB0aW1lX25vd19uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm9cbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsLCBjYW1sX2ludDY0X29mX2Zsb2F0LCBjYW1sX2ludDY0X29mX2ludDMyXG52YXIgbXNfdG9fbmFubyA9IGNhbWxfaW50NjRfb2ZfaW50MzIoMTAwMCoxMDAwKTtcbmZ1bmN0aW9uIHRpbWVfbm93X25hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVybygpe1xuICAgIHZhciBtcyA9IERhdGUubm93KCk7XG4gICAgLy8gbXVsdGlwbGUgYnkgdHdvIC0gaW50NjMgaW50ZWdlcnMgYXJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnRcbiAgICB2YXIgbXNfaTYzID0gY2FtbF9pbnQ2NF9vZl9mbG9hdChtcyoyKTtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9tdWwobXNfaTYzLG1zX3RvX25hbm8pO1xufVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBQYWRkaW5nIHBvc2l0aW9uLiAqKVxudHlwZSBwYWR0eSA9XG4gIHwgTGVmdCAgICgqIFRleHQgaXMgbGVmdCBqdXN0aWZpZWQgKCctJyBvcHRpb24pLiAgICAgICAgICAgICAgICopXG4gIHwgUmlnaHQgICgqIFRleHQgaXMgcmlnaHQganVzdGlmaWVkIChubyAnLScgb3B0aW9uKS4gICAgICAgICAgICopXG4gIHwgWmVyb3MgICgqIFRleHQgaXMgcmlnaHQganVzdGlmaWVkIGJ5IHplcm9zIChzZWUgJzAnIG9wdGlvbikuICopXG5cbigqKiopXG5cbigqIEludGVnZXIgY29udmVyc2lvbi4gKilcbnR5cGUgaW50X2NvbnYgPVxuICB8IEludF9kIHwgSW50X3BkIHwgSW50X3NkICAgICAgICAoKiAgJWQgfCAlK2QgfCAlIGQgICopXG4gIHwgSW50X2kgfCBJbnRfcGkgfCBJbnRfc2kgICAgICAgICgqICAlaSB8ICUraSB8ICUgaSAgKilcbiAgfCBJbnRfeCB8IEludF9DeCAgICAgICAgICAgICAgICAgKCogICV4IHwgJSN4ICAgICAgICAqKVxuICB8IEludF9YIHwgSW50X0NYICAgICAgICAgICAgICAgICAoKiAgJVggfCAlI1ggICAgICAgICopXG4gIHwgSW50X28gfCBJbnRfQ28gICAgICAgICAgICAgICAgICgqICAlbyB8ICUjbyAgICAgICAgKilcbiAgfCBJbnRfdSAgICAgICAgICAgICAgICAgICAgICAgICAgKCogICV1ICAgICAgICAgICAgICAqKVxuICB8IEludF9DZCB8IEludF9DaSB8IEludF9DdSAgICAgICAoKiAgJSNkIHwgJSNpIHwgJSN1ICopXG5cbigqIEZsb2F0IGNvbnZlcnNpb24uICopXG50eXBlIGZsb2F0X2ZsYWdfY29udiA9XG4gIHwgRmxvYXRfZmxhZ18gICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gIHwgRmxvYXRfZmxhZ19wICAgICAgICAgICAgICAgICAgICgqICUrW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcyAgICAgICAgICAgICAgICAgICAoKiAlIFtmZUVnR0ZoSF0gKilcbnR5cGUgZmxvYXRfa2luZF9jb252ID1cbiAgfCBGbG9hdF9mICAgICAgICAgICAgICAgICAgICAgICAgKCogICVmIHwgJStmIHwgJSBmICAqKVxuICB8IEZsb2F0X2UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJWUgfCAlK2UgfCAlIGUgICopXG4gIHwgRmxvYXRfRSAgICAgICAgICAgICAgICAgICAgICAgICgqICAlRSB8ICUrRSB8ICUgRSAgKilcbiAgfCBGbG9hdF9nICAgICAgICAgICAgICAgICAgICAgICAgKCogICVnIHwgJStnIHwgJSBnICAqKVxuICB8IEZsb2F0X0cgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUcgfCAlK0cgfCAlIEcgICopXG4gIHwgRmxvYXRfRiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlRiB8ICUrRiB8ICUgRiAgKilcbiAgfCBGbG9hdF9oICAgICAgICAgICAgICAgICAgICAgICAgKCogICVoIHwgJStoIHwgJSBoICAqKVxuICB8IEZsb2F0X0ggICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUggfCAlK0ggfCAlIEggICopXG4gIHwgRmxvYXRfQ0YgICAgICAgICAgICAgICAgICAgICAgICgqICAlI0Z8ICUrI0Z8ICUgI0YgKilcbnR5cGUgZmxvYXRfY29udiA9IGZsb2F0X2ZsYWdfY29udiAqIGZsb2F0X2tpbmRfY29udlxuXG4oKioqKVxuXG4oKiBDaGFyIHNldHMgKHNlZSAlWy4uLl0pIGFyZSBiaXRtYXBzIGltcGxlbWVudGVkIGFzIDMyLWNoYXIgc3RyaW5ncy4gKilcbnR5cGUgY2hhcl9zZXQgPSBzdHJpbmdcblxuKCoqKilcblxuKCogQ291bnRlciB1c2VkIGluIFNjYW5mLiAqKVxudHlwZSBjb3VudGVyID1cbiAgfCBMaW5lX2NvdW50ZXIgICAgICgqICAlbCAgICAgICopXG4gIHwgQ2hhcl9jb3VudGVyICAgICAoKiAgJW4gICAgICAqKVxuICB8IFRva2VuX2NvdW50ZXIgICAgKCogICVOLCAlTCAgKilcblxuKCoqKilcblxuKCogUGFkZGluZyBvZiBzdHJpbmdzIGFuZCBudW1iZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwYWRkaW5nID1cbiAgKCogTm8gcGFkZGluZyAoZXg6IFwiJWRcIikgKilcbiAgfCBOb19wYWRkaW5nICA6ICgnYSwgJ2EpIHBhZGRpbmdcbiAgKCogTGl0ZXJhbCBwYWRkaW5nIChleDogXCIlOGRcIikgKilcbiAgfCBMaXRfcGFkZGluZyA6IHBhZHR5ICogaW50IC0+ICgnYSwgJ2EpIHBhZGRpbmdcbiAgKCogUGFkZGluZyBhcyBleHRyYSBhcmd1bWVudCAoZXg6IFwiJSpkXCIpICopXG4gIHwgQXJnX3BhZGRpbmcgOiBwYWR0eSAtPiAoaW50IC0+ICdhLCAnYSkgcGFkZGluZ1xuXG4oKiBTb21lIGZvcm1hdHMsIHN1Y2ggYXMgJV9kLFxuICAgb25seSBhY2NlcHQgYW4gb3B0aW9uYWwgbnVtYmVyIGFzIHBhZGRpbmcgb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcGFkX29wdGlvbiA9IGludCBvcHRpb25cblxuKCogUHJlY2lzaW9uIG9mIGZsb2F0cyBhbmQgJzAnLXBhZGRpbmcgb2YgaW50ZWdlcnMuICopXG50eXBlICgnYSwgJ2IpIHByZWNpc2lvbiA9XG4gICgqIE5vIHByZWNpc2lvbiAoZXg6IFwiJWZcIikgKilcbiAgfCBOb19wcmVjaXNpb24gOiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogTGl0ZXJhbCBwcmVjaXNpb24gKGV4OiBcIiUuM2ZcIikgKilcbiAgfCBMaXRfcHJlY2lzaW9uIDogaW50IC0+ICgnYSwgJ2EpIHByZWNpc2lvblxuICAoKiBQcmVjaXNpb24gYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikgKilcbiAgfCBBcmdfcHJlY2lzaW9uIDogKGludCAtPiAnYSwgJ2EpIHByZWNpc2lvblxuXG4oKiBTb21lIGZvcm1hdHMsIHN1Y2ggYXMgJV9mLFxuICAgb25seSBhY2NlcHQgYW4gb3B0aW9uYWwgbnVtYmVyIGFzIHByZWNpc2lvbiBvcHRpb24gKG5vIGV4dHJhIGFyZ3VtZW50KSAqKVxudHlwZSBwcmVjX29wdGlvbiA9IGludCBvcHRpb25cblxuKCogc2VlIHRoZSBDdXN0b20gZm9ybWF0IGNvbWJpbmF0b3IgKilcbnR5cGUgKCdhLCAnYiwgJ2MpIGN1c3RvbV9hcml0eSA9XG4gIHwgQ3VzdG9tX3plcm8gOiAoJ2EsIHN0cmluZywgJ2EpIGN1c3RvbV9hcml0eVxuICB8IEN1c3RvbV9zdWNjIDogKCdhLCAnYiwgJ2MpIGN1c3RvbV9hcml0eSAtPlxuICAgICgnYSwgJ3ggLT4gJ2IsICd4IC0+ICdjKSBjdXN0b21fYXJpdHlcblxuKCoqKilcblxuKCogICAgICAgIFJlbGF0aW9uYWwgZm9ybWF0IHR5cGVzXG5cbkluIHRoZSBmaXJzdCBmb3JtYXQrZ2FkdHMgaW1wbGVtZW50YXRpb24sIHRoZSB0eXBlIGZvciAlKC4uJSkgaW4gdGhlXG5mbXQgR0FEVCB3YXMgYXMgZm9sbG93czpcblxufCBGb3JtYXRfc3Vic3QgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgcGFkX29wdGlvbiAqICgnZDEsICdxMSwgJ2QyLCAncTIpIHJlYWRlcl9uYl91bmlmaWVyICpcbiAgICAoJ3gsICdiLCAnYywgJ2QxLCAncTEsICd1KSBmbXR0eSAqXG4gICAgKCd1LCAnYiwgJ2MsICdxMSwgJ2UxLCAnZikgZm10IC0+XG4gICAgICAoKCd4LCAnYiwgJ2MsICdkMiwgJ3EyLCAndSkgZm9ybWF0NiAtPiAneCwgJ2IsICdjLCAnZDEsICdlMSwgJ2YpIGZtdFxuXG5Ob3RpY2UgdGhhdCB0aGUgJ3UgcGFyYW1ldGVyIGluICdmIHBvc2l0aW9uIGluIHRoZSBmb3JtYXQgYXJndW1lbnRcbigoJ3gsIC4uLCAndSkgZm9ybWF0NiAtPiAuLikgaXMgZXF1YWwgdG8gdGhlICd1IHBhcmFtZXRlciBpbiAnYVxucG9zaXRpb24gaW4gdGhlIGZvcm1hdCB0YWlsICgoJ3UsIC4uLCAnZikgZm10KS4gVGhpcyBtZWFucyB0aGF0IHRoZVxudHlwZSBvZiB0aGUgZXhwZWN0ZWQgZm9ybWF0IHBhcmFtZXRlciBkZXBlbmRzIG9mIHdoZXJlIHRoZSAlKC4uLiUpXG5hcmUgaW4gdGhlIGZvcm1hdCBzdHJpbmc6XG5cbiAgIyBQcmludGYucHJpbnRmIFwiJSglKVwiXG4gIC0gOiAodW5pdCwgb3V0X2NoYW5uZWwsIHVuaXQsICdfYSwgJ19hLCB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gdW5pdFxuICA9IDxmdW4+XG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSklZFwiXG4gIC0gOiAoaW50IC0+IHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgaW50IC0+IHVuaXQpXG4gICAgICBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NiAtPiBpbnQgLT4gdW5pdFxuICA9IDxmdW4+XG5cbk9uIHRoZSBjb250cmFyeSwgdGhlIGxlZ2FjeSB0eXBlciBnaXZlcyBhIGNsZXZlciB0eXBlIHRoYXQgZG9lcyBub3RcbmRlcGVuZCBvbiB0aGUgcG9zaXRpb24gb2YgJSguLiUpIGluIHRoZSBmb3JtYXQgc3RyaW5nLiBGb3IgZXhhbXBsZSxcbiUoJSkgd2lsbCBoYXZlIHRoZSBwb2x5bW9ycGhpYyB0eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKTogaXQgY2FuXG5iZSBjb25jYXRlbmF0ZWQgdG8gYW55IGZvcm1hdCB0eXBlLCBhbmQgb25seSBlbmZvcmNlcyB0aGUgY29uc3RyYWludFxudGhhdCBpdHMgJ2EgYW5kICdmIHBhcmFtZXRlcnMgYXJlIGVxdWFsIChubyBmb3JtYXQgYXJndW1lbnRzKSBhbmQgJ2RcbmFuZCAnZSBhcmUgZXF1YWwgKG5vIHJlYWRlciBhcmd1bWVudCkuXG5cblRoZSB3ZWFrZW5pbmcgb2YgdGhpcyBwYXJhbWV0ZXIgdHlwZSBpbiB0aGUgR0FEVCB2ZXJzaW9uIGJyb2tlIHVzZXJcbmNvZGUgKGluIGZhY3QgaXQgZXNzZW50aWFsbHkgbWFkZSAlKC4uLiUpIHVudXNhYmxlIGV4Y2VwdCBhdCB0aGUgbGFzdFxucG9zaXRpb24gb2YgYSBmb3JtYXQpLiBJbiBwYXJ0aWN1bGFyLCB0aGUgZm9sbG93aW5nIHdvdWxkIG5vdCB3b3JrXG5hbnltb3JlOlxuXG4gIGZ1biBzZXAgLT5cbiAgICBGb3JtYXQucHJpbnRmIFwiZm9vJSglKWJhciUoJSliYXpcIiBzZXAgc2VwXG5cbkFzIHRoZSB0eXBlLWNoZWNrZXIgd291bGQgcmVxdWlyZSB0d28gKmluY29tcGF0aWJsZSogdHlwZXMgZm9yIHRoZSAlKCUpXG5pbiBkaWZmZXJlbnQgcG9zaXRpb25zLlxuXG5UaGUgc29sdXRpb24gdG8gcmVnYWluIGEgZ2VuZXJhbCB0eXBlIGZvciAlKC4uJSkgaXMgdG8gZ2VuZXJhbGl6ZSB0aGlzXG50ZWNobmlxdWUsIG5vdCBvbmx5IG9uIHRoZSAnZCwgJ2UgcGFyYW1ldGVycywgYnV0IG9uIGFsbCBzaXhcbnBhcmFtZXRlcnMgb2YgYSBmb3JtYXQ6IHdlIGludHJvZHVjZSBhIFwicmVsYXRpb25hbFwiIHR5cGVcbiAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbndob3NlIHZhbHVlcyBhcmUgcHJvb2ZzIHRoYXQgKCdhMSwgLi4sICdmMSkgYW5kICgnYTIsIC4uLCAnZjIpIG1vcmFsbHlcbmNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9ybWF0IHR5cGU6ICdhMSBpcyBvYnRhaW5lZCBmcm9tICdmMSwnYjEsJ2MxXG5pbiB0aGUgZXhhY3Qgc2FtZSB3YXkgdGhhdCAnYTIgaXMgb2J0YWluZWQgZnJvbSAnZjIsJ2IyLCdjMiwgZXRjLlxuXG5Gb3IgZXhhbXBsZSwgdGhlIHJlbGF0aW9uIGJldHdlZW4gdHdvIGZvcm1hdCB0eXBlcyBiZWdpbm5pbmcgd2l0aCBhIENoYXJcbnBhcmFtZXRlciBpcyBhcyBmb2xsb3dzOlxuXG58IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgY2hhciAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuSW4gdGhlIGdlbmVyYWwgY2FzZSwgdGhlIHRlcm0gc3RydWN0dXJlIG9mIGZtdHR5X3JlbCBpcyAoYWxtb3N0WzFdKVxuaXNvbW9ycGhpYyB0byB0aGUgZm10dHkgb2YgdGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uOiBldmVyeVxuY29uc3RydWN0b3IgaXMgcmUtcmVhZCB3aXRoIGEgYmluYXJ5LCByZWxhdGlvbmFsIHR5cGUsIGluc3RlYWQgb2YgdGhlXG5wcmV2aW91cyB1bmFyeSB0eXBpbmcuIGZtdHR5IGNhbiB0aGVuIGJlIHJlLWRlZmluZWQgYXMgdGhlIGRpYWdvbmFsIG9mXG5mbXR0eV9yZWw6XG5cbiAgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmLFxuICAgICAgICAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eV9yZWxcblxuT25jZSB3ZSBoYXZlIHRoaXMgZm10dHlfcmVsIHR5cGUgaW4gcGxhY2UsIHdlIGNhbiBnaXZlIHRoZSBtb3JlXG5nZW5lcmFsIHR5cGUgdG8gJSguLi4lKTpcblxufCBGb3JtYXRfc3Vic3QgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgcGFkX29wdGlvbiAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IsICdjLCAnajIsICdkLCAnYSkgZm10dHlfcmVsICpcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbldlIGFjY2VwdCBhbnkgZm9ybWF0ICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NikgKHRoaXMgaXNcbmNvbXBsZXRlbHkgdW5yZWxhdGVkIHRvIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGZvcm1hdCksIGJ1dCBhbHNvXG5yZXF1aXJlIGEgcHJvb2YgdGhhdCB0aGlzIGZvcm1hdCBpcyBpbiByZWxhdGlvbiB0byBhbm90aGVyIGZvcm1hdCB0aGF0XG5pcyBjb25jYXRlbmFibGUgdG8gdGhlIGZvcm1hdCB0YWlsLiBXaGVuIGV4ZWN1dGluZyBhICUoLi4uJSkgZm9ybWF0XG4oaW4gY2FtbGludGVybmFsRm9ybWF0Lm1sOm1ha2VfcHJpbnRmIG9yIHNjYW5mLm1sOm1ha2Vfc2NhbmYpLCB3ZVxudHJhbnN0eXBlIHRoZSBmb3JtYXQgYWxvbmcgdGhpcyByZWxhdGlvbiB1c2luZyB0aGUgJ3JlY2FzdCcgZnVuY3Rpb25cbnRvIHRyYW5zcG9zZSBiZXR3ZWVuIHJlbGF0ZWQgZm9ybWF0IHR5cGVzLlxuXG4gIHZhbCByZWNhc3QgOlxuICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSkgZm10XG4gIC0+ICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIC0+ICgnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXRcblxuTk9URSBbMV06IHRoZSB0eXBpbmcgb2YgRm9ybWF0X3N1YnN0X3R5IHJlcXVpcmVzIG5vdCBvbmUgZm9ybWF0IHR5cGUsIGJ1dFxudHdvLCBvbmUgdG8gZXN0YWJsaXNoIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdCBhcmd1bWVudCBhbmQgdGhlXG5maXJzdCBzaXggcGFyYW1ldGVycywgYW5kIHRoZSBvdGhlciBmb3IgdGhlIGxpbmsgYmV0d2VlbiB0aGUgZm9ybWF0XG5hcmd1bWVudCBhbmQgdGhlIGxhc3Qgc2l4IHBhcmFtZXRlcnMuXG5cbnwgRm9ybWF0X3N1YnN0X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgJ2cxLCAnYjEsICdjMSwgJ2oxLCAnZDEsICdhMSkgZm10dHlfcmVsICpcbiAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG5XaGVuIHdlIGdlbmVyYXRlIGEgZm9ybWF0IEFTVCwgd2UgZ2VuZXJhdGUgZXhhY3RseSB0aGUgc2FtZSB3aXRuZXNzXG5mb3IgYm90aCByZWxhdGlvbnMsIGFuZCB0aGUgd2l0bmVzcy1jb252ZXJzaW9uIGZ1bmN0aW9ucyBpblxuY2FtbGludGVybmFsRm9ybWF0IGRvIHJlbHkgb24gdGhpcyBpbnZhcmlhbnQuIEZvciBleGFtcGxlLCB0aGVcbmZ1bmN0aW9uIHRoYXQgcHJvdmVzIHRoYXQgdGhlIHJlbGF0aW9uIGlzIHRyYW5zaXRpdmVcblxuICB2YWwgdHJhbnMgOlxuICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMixcbiAgICAgICdhMywgJ2IzLCAnYzMsICdkMywgJ2UzLCAnZjMpIGZtdHR5X3JlbFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMywgJ2IzLCAnYzMsICdkMywgJ2UzLCAnZjMpIGZtdHR5X3JlbFxuXG5kb2VzIGFzc3VtZSB0aGF0IHRoZSB0d28gaW5wdXRzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSB0ZXJtIHN0cnVjdHVyZVxuKGFuZCBpcyBvbmx5IGV2ZXJ5IHVzZWQgZm9yIGFyZ3VtZW50IHdpdG5lc3NlcyBvZiB0aGVcbkZvcm1hdF9zdWJzdF90eSBjb25zdHJ1Y3RvcikuXG4qKVxuXG4oKiBUeXBlIG9mIGEgYmxvY2sgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSBibG9ja190eXBlID1cbiAgfCBQcF9oYm94ICAgKCogSG9yaXpvbnRhbCBibG9jayBubyBsaW5lIGJyZWFraW5nICopXG4gIHwgUHBfdmJveCAgICgqIFZlcnRpY2FsIGJsb2NrIGVhY2ggYnJlYWsgbGVhZHMgdG8gYSBuZXcgbGluZSAqKVxuICB8IFBwX2h2Ym94ICAoKiBIb3Jpem9udGFsLXZlcnRpY2FsIGJsb2NrOiBzYW1lIGFzIHZib3gsIGV4Y2VwdCBpZiB0aGlzIGJsb2NrXG4gICAgICAgICAgICAgICAgIGlzIHNtYWxsIGVub3VnaCB0byBmaXQgb24gYSBzaW5nbGUgbGluZSAqKVxuICB8IFBwX2hvdmJveCAoKiBIb3Jpem9udGFsIG9yIFZlcnRpY2FsIGJsb2NrOiBicmVha3MgbGVhZCB0byBuZXcgbGluZVxuICAgICAgICAgICAgICAgICBvbmx5IHdoZW4gbmVjZXNzYXJ5IHRvIHByaW50IHRoZSBjb250ZW50IG9mIHRoZSBibG9jayAqKVxuICB8IFBwX2JveCAgICAoKiBIb3Jpem9udGFsIG9yIEluZGVudCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2ssIG9yXG4gICAgICAgICAgICAgICAgIHdoZW4gaXQgbGVhZHMgdG8gYSBuZXcgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgbGluZSAqKVxuICB8IFBwX2ZpdHMgICAoKiBJbnRlcm5hbCB1c2FnZTogd2hlbiBhIGJsb2NrIGZpdHMgb24gYSBzaW5nbGUgbGluZSAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSBmb3JtYXR0aW5nX2xpdCA9XG4gIHwgQ2xvc2VfYm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBdICAgKilcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQH0gICAqKVxuICB8IEJyZWFrIG9mIHN0cmluZyAqIGludCAqIGludCAgICAgICAgICAoKiBALCB8IEAgIHwgQDsgfCBAOzw+ICopXG4gIHwgRkZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEA/ICAgKilcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFxcbiAgKilcbiAgfCBGbHVzaF9uZXdsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQC4gICAqKVxuICB8IE1hZ2ljX3NpemUgb2Ygc3RyaW5nICogaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPG4+ICopXG4gIHwgRXNjYXBlZF9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBAICAgKilcbiAgfCBFc2NhcGVkX3BlcmNlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQCUlICAqKVxuICB8IFNjYW5faW5kaWMgb2YgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAWCAgICopXG5cbigqIEZvcm1hdHRpbmcgZWxlbWVudCB1c2VkIGJ5IHRoZSBGb3JtYXQgcHJldHR5LXByaW50ZXIuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXR0aW5nX2dlbiA9XG4gIHwgT3Blbl90YWcgOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEB7ICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cbiAgfCBPcGVuX2JveCA6ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+ICAgICAgKCogQFsgICAqKVxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXR0aW5nX2dlblxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCB0eXBlIGVsZW1lbnRzLiAqKVxuKCogSW4gcGFydGljdWxhciB1c2VkIHRvIHJlcHJlc2VudCAlKC4uLiUpIGFuZCAley4uLiV9IGNvbnRlbnRzLiAqKVxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSA9XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmLFxuICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5hbmQgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCA9XG4gIHwgQ2hhcl90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVjICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoY2hhciAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgU3RyaW5nX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVzICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoc3RyaW5nIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgc3RyaW5nIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEludF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlZCAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGludCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGludCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnQzMl90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxkICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQzMiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGludDMyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IE5hdGl2ZWludF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlbmQgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKG5hdGl2ZWludCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIG5hdGl2ZWludCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnQ2NF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxkICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQ2NCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGludDY0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEZsb2F0X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlZiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGZsb2F0IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgZmxvYXQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQm9vbF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVCICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoYm9vbCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGJvb2wgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbiAgfCBGb3JtYXRfYXJnX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXsuLi4lfSAqKVxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG4gIHwgRm9ybWF0X3N1YnN0X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzIsICdiMiwgJ2MyLCAnajIsICdkMiwgJ2EyKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cxLCAnYjEsICdjMSwgJ2oxLCAnZTEsICdmMSxcbiAgICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKVxuICAgICAgICAgICBmbXR0eV9yZWxcblxuICAoKiBQcmludGYgYW5kIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnMuICopXG4gIHwgQWxwaGFfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVhICAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoKCdiMSAtPiAneCAtPiAnYzEpIC0+ICd4IC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdiMiAtPiAneCAtPiAnYzIpIC0+ICd4IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFRoZXRhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAldCAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ2MxKSAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ2MyKSAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBBbnlfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFVzZWQgZm9yIGN1c3RvbSBmb3JtYXRzICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yLiAqKVxuICB8IFJlYWRlcl90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCd4IC0+ICdhMSwgJ2IxLCAnYzEsICgnYjEgLT4gJ3gpIC0+ICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ3ggLT4gJ2EyLCAnYjIsICdjMiwgKCdiMiAtPiAneCkgLT4gJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICgnYjEgLT4gJ3gpIC0+ICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgKCdiMiAtPiAneCkgLT4gJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbiAgfCBFbmRfb2ZfZm10dHkgOlxuICAgICAgKCdmMSwgJ2IxLCAnYzEsICdkMSwgJ2QxLCAnZjEsXG4gICAgICAgJ2YyLCAnYjIsICdjMiwgJ2QyLCAnZDIsICdmMikgZm10dHlfcmVsXG5cbigqKiopXG5cbigqIExpc3Qgb2YgZm9ybWF0IGVsZW1lbnRzLiAqKVxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgPVxuICB8IENoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVjICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgIChjaGFyIC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IENhbWxfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVDICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgIChjaGFyIC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFN0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVzICopXG4gICAgICAoJ3gsIHN0cmluZyAtPiAnYSkgcGFkZGluZyAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IENhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVTICopXG4gICAgICAoJ3gsIHN0cmluZyAtPiAnYSkgcGFkZGluZyAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQzMiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlbFtkaXhYdW9dICopXG4gICAgICBpbnRfY29udiAqICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksIGludDMyIC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgTmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5bZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBuYXRpdmVpbnQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQ2NCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlTFtkaXhYdW9dICopXG4gICAgICBpbnRfY29udiAqICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksIGludDY0IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJVtmZUVnR0ZoSF0gKilcbiAgICAgIGZsb2F0X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBmbG9hdCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEJvb2wgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbYkJdICopXG4gICAgICAoJ3gsIGJvb2wgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBGbHVzaCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlISAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBhYmMgKilcbiAgICAgIHN0cmluZyAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IENoYXJfbGl0ZXJhbCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIHggKilcbiAgICAgIGNoYXIgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcblxuICB8IEZvcm1hdF9hcmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYiwgJ2MsICdqMiwgJ2UsICdmKSBmbXRcblxuICAoKiBQcmludGYgYW5kIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBBbHBoYSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoKCdiIC0+ICd4IC0+ICdjKSAtPiAneCAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBUaGV0YSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAldCAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoKCdiIC0+ICdjKSAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcblxuICAoKiBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3I6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQF8gKilcbiAgICAgIGZvcm1hdHRpbmdfbGl0ICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRm9ybWF0dGluZ19nZW4gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UxLCAnZjEpIGZvcm1hdHRpbmdfZ2VuICpcbiAgICAgICgnZjEsICdiLCAnYywgJ2UxLCAnZTIsICdmMikgZm10IC0+ICgnYTEsICdiLCAnYywgJ2QxLCAnZTIsICdmMikgZm10XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVyICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCAtPiAnYSwgJ2IsICdjLCAoJ2IgLT4gJ3gpIC0+ICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fY2hhcl9zZXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbLi4uXSAqKVxuICAgICAgcGFkX29wdGlvbiAqIGNoYXJfc2V0ICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoc3RyaW5nIC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbbmxOTF0gKilcbiAgICAgIGNvdW50ZXIgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgIChpbnQgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgU2Nhbl9uZXh0X2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJTBjICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJZ25vcmVkX3BhcmFtIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAneSwgJ3gpIGlnbm9yZWQgKiAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcblxuICAoKiBDdXN0b20gcHJpbnRpbmcgZm9ybWF0IChQUiM2NDUyLCBHUFIjMTQwKVxuXG4gICAgIFdlIGluY2x1ZGUgYSB0eXBlIEN1c3RvbSBvZiBcImN1c3RvbSBjb252ZXJ0ZXJzXCIsIHdoZXJlIGFuXG4gICAgIGFyYml0cmFyeSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IG9uZSBvciBtb3JlXG4gICAgIGFyZ3VtZW50cy4gVGhlcmUgaXMgbm8gc3ludGF4IGZvciBjdXN0b20gY29udmVydGVycywgaXQgaXMgb25seVxuICAgICBpbnRlbmRlZCBmb3IgY3VzdG9tIHByb2Nlc3NvcnMgdGhhdCB3aXNoIHRvIHJlbHkgb24gdGhlXG4gICAgIHN0ZGxpYi1kZWZpbmVkIGZvcm1hdCBHQURUcy5cblxuICAgICBGb3IgaW5zdGFuY2UgYSBwcmUtcHJvY2Vzc29yIGNvdWxkIGNob29zZSB0byBpbnRlcnByZXQgc3RyaW5nc1xuICAgICBwcmVmaXhlZCB3aXRoIFtcIiFcIl0gYXMgZm9ybWF0IHN0cmluZ3Mgd2hlcmUgWyV7eyAuLi4gfX1dIGlzXG4gICAgIGEgc3BlY2lhbCBmb3JtIHRvIHBhc3MgYSB0b19zdHJpbmcgZnVuY3Rpb24sIHNvIHRoYXQgb25lIGNvdWxkXG4gICAgIHdyaXRlOlxuXG4gICAgIHtbXG4gICAgICAgdHlwZSB0ID0geyB4IDogaW50OyB5IDogaW50IH1cblxuICAgICAgIGxldCBzdHJpbmdfb2ZfdCB0ID0gUHJpbnRmLnNwcmludGYgXCJ7IHggPSAlZDsgeSA9ICVkIH1cIiB0LnggdC55XG5cbiAgICAgICBQcmludGYucHJpbnRmICFcInQgPSAle3tzdHJpbmdfb2ZfdH19XCIgeyB4ID0gNDI7IHkgPSA0MiB9XG4gICAgIF19XG4gICopXG4gIHwgQ3VzdG9tIDpcbiAgICAgICgnYSwgJ3gsICd5KSBjdXN0b21fYXJpdHkgKiAodW5pdCAtPiAneCkgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogZW5kIG9mIGEgZm9ybWF0IHNwZWNpZmljYXRpb24gKilcbiAgfCBFbmRfb2ZfZm9ybWF0IDpcbiAgICAgICAgKCdmLCAnYiwgJ2MsICdlLCAnZSwgJ2YpIGZtdFxuXG4oKioqKVxuXG4oKiBUeXBlIGZvciBpZ25vcmVkIHBhcmFtZXRlcnMgKHNlZSBcIiVfXCIpLiAqKVxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBpZ25vcmVkID1cbiAgfCBJZ25vcmVkX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2MgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9DICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfcyAqKVxuICAgICAgcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfUyAqKVxuICAgICAgcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZCAqKVxuICAgICAgaW50X2NvbnYgKiBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9pbnQzMiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9sZCAqKVxuICAgICAgaW50X2NvbnYgKiBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9uZCAqKVxuICAgICAgaW50X2NvbnYgKiBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9pbnQ2NCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9MZCAqKVxuICAgICAgaW50X2NvbnYgKiBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mbG9hdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9mICopXG4gICAgICBwYWRfb3B0aW9uICogcHJlY19vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Jvb2wgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX0IgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3suLi4lfSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfKC4uLiUpICopXG4gICAgICBwYWRfb3B0aW9uICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9yZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9yICopXG4gICAgICAoJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9bLi4uXSAqKVxuICAgICAgcGFkX29wdGlvbiAqIGNoYXJfc2V0IC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9bbmxOTF0gKilcbiAgICAgIGNvdW50ZXIgLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXzBjICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuXG5hbmQgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPVxuICBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAqIHN0cmluZ1xuXG5sZXQgcmVjIGVyYXNlX3JlbCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgLlxuICAoYSwgYiwgYywgZCwgZSwgZixcbiAgIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHlcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBDaGFyX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBTdHJpbmdfdHkgcmVzdCAtPlxuICAgIFN0cmluZ190eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT5cbiAgICBJbnQzMl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgSW50NjRfdHkgcmVzdCAtPlxuICAgIEludDY0X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPlxuICAgIEZsb2F0X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBCb29sX3R5IHJlc3QgLT5cbiAgICBCb29sX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBGb3JtYXRfYXJnX3R5ICh0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIF90eTIsIHJlc3QpIC0+XG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MSwgZXJhc2VfcmVsIHJlc3QpXG4gIHwgQWxwaGFfdHkgcmVzdCAtPlxuICAgIEFscGhhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgQW55X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPlxuICAgIFJlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0IHR5cGUgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0IHR5cGVzLiAqKVxuKCogVXNlZCBieTpcbiAgICogcmVhZGVyX25iX3VuaWZpZXJfb2ZfZm10dHkgdG8gY291bnQgcmVhZGVycyBpbiBhbiBmbXR0eSxcbiAgICogU2NhbmYudGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyB0byBleHRyYWN0IHJlYWRlcnMgaW5zaWRlICUoLi4uJSksXG4gICAqIENhbWxpbnRlcm5hbEZvcm1hdC5mbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCB0byBleHRyYWN0IGZvcm1hdCB0eXBlLiAqKVxuXG4oKlxubGV0IHJlYyBjb25jYXRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCAuXG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdHR5IC0+XG4gICAgKGEsIGIsIGMsIGQsIGcsIGgpIGZtdHR5ID1cbiopXG5sZXQgcmVjIGNvbmNhdF9mbXR0eSA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAgICAgIGcxIGoxIGcyIGoyXG4gIC5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGQxLCBhMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGQyLCBhMikgZm10dHlfcmVsIC0+XG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgIChnMSwgYjEsIGMxLCBqMSwgZTEsIGYxLFxuICAgICBnMiwgYjIsIGMyLCBqMiwgZTIsIGYyKSBmbXR0eV9yZWwgPVxuZnVuIGZtdHR5MSBmbXR0eTIgLT4gbWF0Y2ggZm10dHkxIHdpdGhcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBDaGFyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnRfdHkgcmVzdCAtPlxuICAgIEludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDMyX3R5IHJlc3QgLT5cbiAgICBJbnQzMl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgTmF0aXZlaW50X3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50NjRfdHkgcmVzdCAtPlxuICAgIEludDY0X3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPlxuICAgIEZsb2F0X3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFRoZXRhX3R5IHJlc3QgLT5cbiAgICBUaGV0YV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgQW55X3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+XG4gICAgSWdub3JlZF9yZWFkZXJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfYXJnX3R5ICh0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEVuZF9vZl9mbXR0eSAtPiBmbXR0eTJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBjb25jYXRlbmF0aW9uICopXG5cbigqIENvbmNhdGVuYXRlIHR3byBmb3JtYXRzLiAqKVxubGV0IHJlYyBjb25jYXRfZm10IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoZiwgYiwgYywgZSwgZywgaCkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGcsIGgpIGZtdCA9XG5mdW4gZm10MSBmbXQyIC0+IG1hdGNoIGZtdDEgd2l0aFxuICB8IFN0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIFN0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX3N0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIENhbWxfc3RyaW5nIChwYWQsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgSW50MzIgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDY0IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBDaGFyIChyZXN0KSAtPlxuICAgIENoYXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgQ2FtbF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgQm9vbCAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBBbHBoYSByZXN0IC0+XG4gICAgQWxwaGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBUaGV0YSAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ3VzdG9tIChhcml0eSwgZiwgcmVzdCkgLT5cbiAgICBDdXN0b20gKGFyaXR5LCBmLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBSZWFkZXIgcmVzdCAtPlxuICAgIFJlYWRlciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIEZsdXNoIChjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgU3RyaW5nX2xpdGVyYWwgKHN0ciwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2hhcl9saXRlcmFsIChjaHIsIHJlc3QpIC0+XG4gICAgQ2hhcl9saXRlcmFsICAgKGNociwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBGb3JtYXRfYXJnIChwYWQsIGZtdHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9hcmcgICAocGFkLCBmbXR0eSwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRm9ybWF0X3N1YnN0IChwYWQsIGZtdHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCByZXN0KSAtPlxuICAgIFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIHJlc3QpIC0+XG4gICAgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgU2Nhbl9uZXh0X2NoYXIgKHJlc3QpIC0+XG4gICAgU2Nhbl9uZXh0X2NoYXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICBJZ25vcmVkX3BhcmFtIChpZ24sIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIHJlc3QpIC0+XG4gICAgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBmbXQyXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEV4Y2VwdGlvbnMgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICAoKiBmb3IgcnVudGltZS9mYWlsX25hdC5jICopXG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIFwiUGVydmFzaXZlcy5hcnJheV9ib3VuZF9lcnJvclwiXG4gICAgKEludmFsaWRfYXJndW1lbnQgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpXG5cbmV4dGVybmFsIHJhaXNlIDogZXhuIC0+ICdhID0gXCIlcmFpc2VcIlxuZXh0ZXJuYWwgcmFpc2Vfbm90cmFjZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlX25vdHJhY2VcIlxuXG5sZXQgZmFpbHdpdGggcyA9IHJhaXNlKEZhaWx1cmUgcylcbmxldCBpbnZhbGlkX2FyZyBzID0gcmFpc2UoSW52YWxpZF9hcmd1bWVudCBzKVxuXG5leGNlcHRpb24gRXhpdFxuZXhjZXB0aW9uIE1hdGNoX2ZhaWx1cmUgPSBNYXRjaF9mYWlsdXJlXG5leGNlcHRpb24gQXNzZXJ0X2ZhaWx1cmUgPSBBc3NlcnRfZmFpbHVyZVxuZXhjZXB0aW9uIEludmFsaWRfYXJndW1lbnQgPSBJbnZhbGlkX2FyZ3VtZW50XG5leGNlcHRpb24gRmFpbHVyZSA9IEZhaWx1cmVcbmV4Y2VwdGlvbiBOb3RfZm91bmQgPSBOb3RfZm91bmRcbmV4Y2VwdGlvbiBPdXRfb2ZfbWVtb3J5ID0gT3V0X29mX21lbW9yeVxuZXhjZXB0aW9uIFN0YWNrX292ZXJmbG93ID0gU3RhY2tfb3ZlcmZsb3dcbmV4Y2VwdGlvbiBTeXNfZXJyb3IgPSBTeXNfZXJyb3JcbmV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSA9IEVuZF9vZl9maWxlXG5leGNlcHRpb24gRGl2aXNpb25fYnlfemVybyA9IERpdmlzaW9uX2J5X3plcm9cbmV4Y2VwdGlvbiBTeXNfYmxvY2tlZF9pbyA9IFN5c19ibG9ja2VkX2lvXG5leGNlcHRpb24gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgPSBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuXG4oKiBDb21wb3NpdGlvbiBvcGVyYXRvcnMgKilcblxuZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcbmV4dGVybmFsICggQEAgKSA6ICgnYSAtPiAnYikgLT4gJ2EgLT4gJ2IgPSBcIiVhcHBseVwiXG5cbigqIERlYnVnZ2luZyAqKVxuXG5leHRlcm5hbCBfX0xPQ19fIDogc3RyaW5nID0gXCIlbG9jX0xPQ1wiXG5leHRlcm5hbCBfX0ZJTEVfXyA6IHN0cmluZyA9IFwiJWxvY19GSUxFXCJcbmV4dGVybmFsIF9fTElORV9fIDogaW50ID0gXCIlbG9jX0xJTkVcIlxuZXh0ZXJuYWwgX19NT0RVTEVfXyA6IHN0cmluZyA9IFwiJWxvY19NT0RVTEVcIlxuZXh0ZXJuYWwgX19QT1NfXyA6IHN0cmluZyAqIGludCAqIGludCAqIGludCA9IFwiJWxvY19QT1NcIlxuZXh0ZXJuYWwgX19GVU5DVElPTl9fIDogc3RyaW5nID0gXCIlbG9jX0ZVTkNUSU9OXCJcblxuZXh0ZXJuYWwgX19MT0NfT0ZfXyA6ICdhIC0+IHN0cmluZyAqICdhID0gXCIlbG9jX0xPQ1wiXG5leHRlcm5hbCBfX0xJTkVfT0ZfXyA6ICdhIC0+IGludCAqICdhID0gXCIlbG9jX0xJTkVcIlxuZXh0ZXJuYWwgX19QT1NfT0ZfXyA6ICdhIC0+IChzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQpICogJ2EgPSBcIiVsb2NfUE9TXCJcblxuKCogQ29tcGFyaXNvbnMgKilcblxuZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZXh0ZXJuYWwgKCA8PiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcbmV4dGVybmFsICggPCApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbmV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbmV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuZXh0ZXJuYWwgKCA+PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5leHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbmxldCBtaW4geCB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuZXh0ZXJuYWwgKCA9PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxXCJcbmV4dGVybmFsICggIT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcVwiXG5cbigqIEJvb2xlYW4gb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5leHRlcm5hbCAoIHx8ICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG5cbigqIEludGVnZXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tICkgOiBpbnQgLT4gaW50ID0gXCIlbmVnaW50XCJcbmV4dGVybmFsICggfisgKSA6IGludCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBzdWNjIDogaW50IC0+IGludCA9IFwiJXN1Y2NpbnRcIlxuZXh0ZXJuYWwgcHJlZCA6IGludCAtPiBpbnQgPSBcIiVwcmVkaW50XCJcbmV4dGVybmFsICggKyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgKCAtICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXN1YmludFwiXG5leHRlcm5hbCAoICogKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbmV4dGVybmFsICggLyApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgKCBtb2QgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbW9kaW50XCJcblxubGV0IGFicyB4ID0gaWYgeCA+PSAwIHRoZW4geCBlbHNlIC14XG5cbmV4dGVybmFsICggbGFuZCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgKCBsb3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlb3JpbnRcIlxuZXh0ZXJuYWwgKCBseG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXhvcmludFwiXG5cbmxldCBsbm90IHggPSB4IGx4b3IgKC0xKVxuXG5leHRlcm5hbCAoIGxzbCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVsc2xpbnRcIlxuZXh0ZXJuYWwgKCBsc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNyaW50XCJcbmV4dGVybmFsICggYXNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5cbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuXG4oKiBGbG9hdGluZy1wb2ludCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsICggfi0uICkgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJW5lZ2Zsb2F0XCJcbmV4dGVybmFsICggfisuICkgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsICggKy4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWRkZmxvYXRcIlxuZXh0ZXJuYWwgKCAtLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVzdWJmbG9hdFwiXG5leHRlcm5hbCAoICouICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJW11bGZsb2F0XCJcbmV4dGVybmFsICggLy4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlZGl2ZmxvYXRcIlxuZXh0ZXJuYWwgKCAqKiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBfZmxvYXRcIiBcImV4cFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zX2Zsb2F0XCIgXCJhY29zXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luX2Zsb2F0XCIgXCJhc2luXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuX2Zsb2F0XCIgXCJhdGFuXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbjJfZmxvYXRcIiBcImF0YW4yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGh5cG90IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgICAgICAgICAgICAgID0gXCJjYW1sX2h5cG90X2Zsb2F0XCIgXCJjYW1sX2h5cG90XCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc19mbG9hdFwiIFwiY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NoX2Zsb2F0XCIgXCJjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc2hfZmxvYXRcIiBcImNhbWxfYWNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMXAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxcF9mbG9hdFwiIFwiY2FtbF9sb2cxcFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5fZmxvYXRcIiBcInNpblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luaF9mbG9hdFwiIFwic2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNxcnQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zcXJ0X2Zsb2F0XCIgXCJzcXJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Rhbl9mbG9hdFwiIFwidGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5oX2Zsb2F0XCIgXCJ0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2VpbCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NlaWxfZmxvYXRcIiBcImNlaWxcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvb3IgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9vcl9mbG9hdFwiIFwiZmxvb3JcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5leHRlcm5hbCBjb3B5c2lnbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICAgICA9IFwiY2FtbF9jb3B5c2lnbl9mbG9hdFwiIFwiY2FtbF9jb3B5c2lnblwiXG4gICAgICAgICAgICAgICAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbW9kX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZm1vZF9mbG9hdFwiIFwiZm1vZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmcmV4cCA6IGZsb2F0IC0+IGZsb2F0ICogaW50ID0gXCJjYW1sX2ZyZXhwX2Zsb2F0XCJcbmV4dGVybmFsIGxkZXhwIDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IChpbnQgW0B1bnRhZ2dlZF0pIC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9sZGV4cF9mbG9hdFwiIFwiY2FtbF9sZGV4cF9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZGYgOiBmbG9hdCAtPiBmbG9hdCAqIGZsb2F0ID0gXCJjYW1sX21vZGZfZmxvYXRcIlxuZXh0ZXJuYWwgZmxvYXQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIGZsb2F0X29mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdHJ1bmNhdGUgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGludF9vZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuZXh0ZXJuYWwgZmxvYXRfb2ZfYml0cyA6IGludDY0IC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNcIiBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c191bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmxldCBpbmZpbml0eSA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMExcbmxldCBuZWdfaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4RkZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmFuID1cbiAgZmxvYXRfb2ZfYml0cyAweDdGX0YwXzAwXzAwXzAwXzAwXzAwXzAxTFxubGV0IG1heF9mbG9hdCA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9FRl9GRl9GRl9GRl9GRl9GRl9GRkxcbmxldCBtaW5fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4MDBfMTBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgZXBzaWxvbl9mbG9hdCA9XG4gIGZsb2F0X29mX2JpdHMgMHgzQ19CMF8wMF8wMF8wMF8wMF8wMF8wMExcblxudHlwZSBmcGNsYXNzID1cbiAgICBGUF9ub3JtYWxcbiAgfCBGUF9zdWJub3JtYWxcbiAgfCBGUF96ZXJvXG4gIHwgRlBfaW5maW5pdGVcbiAgfCBGUF9uYW5cbmV4dGVybmFsIGNsYXNzaWZ5X2Zsb2F0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGZwY2xhc3MgPVxuICBcImNhbWxfY2xhc3NpZnlfZmxvYXRcIiBcImNhbWxfY2xhc3NpZnlfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5cbigqIFN0cmluZyBhbmQgYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlcyBTdHJpbmcgYW5kIEJ5dGVzICopXG5cbmV4dGVybmFsIHN0cmluZ19sZW5ndGggOiBzdHJpbmcgLT4gaW50ID0gXCIlc3RyaW5nX2xlbmd0aFwiXG5leHRlcm5hbCBieXRlc19sZW5ndGggOiBieXRlcyAtPiBpbnQgPSBcIiVieXRlc19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfY3JlYXRlIDogaW50IC0+IGJ5dGVzID0gXCJjYW1sX2NyZWF0ZV9ieXRlc1wiXG5leHRlcm5hbCBzdHJpbmdfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X3N0cmluZ1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBieXRlc19ibGl0IDogYnl0ZXMgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBieXRlc191bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcblxubGV0ICggXiApIHMxIHMyID1cbiAgbGV0IGwxID0gc3RyaW5nX2xlbmd0aCBzMSBhbmQgbDIgPSBzdHJpbmdfbGVuZ3RoIHMyIGluXG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIChsMSArIGwyKSBpblxuICBzdHJpbmdfYmxpdCBzMSAwIHMgMCBsMTtcbiAgc3RyaW5nX2JsaXQgczIgMCBzIGwxIGwyO1xuICBieXRlc191bnNhZmVfdG9fc3RyaW5nIHNcblxuKCogQ2hhcmFjdGVyIG9wZXJhdGlvbnMgLS0gbW9yZSBpbiBtb2R1bGUgQ2hhciAqKVxuXG5leHRlcm5hbCBpbnRfb2ZfY2hhciA6IGNoYXIgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdW5zYWZlX2NoYXJfb2ZfaW50IDogaW50IC0+IGNoYXIgPSBcIiVpZGVudGl0eVwiXG5sZXQgY2hhcl9vZl9pbnQgbiA9XG4gIGlmIG4gPCAwIHx8IG4gPiAyNTUgdGhlbiBpbnZhbGlkX2FyZyBcImNoYXJfb2ZfaW50XCIgZWxzZSB1bnNhZmVfY2hhcl9vZl9pbnQgblxuXG4oKiBVbml0IG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgaWdub3JlIDogJ2EgLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbigqIFBhaXIgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBmc3QgOiAnYSAqICdiIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsIHNuZCA6ICdhICogJ2IgLT4gJ2IgPSBcIiVmaWVsZDFcIlxuXG4oKiBSZWZlcmVuY2VzICopXG5cbnR5cGUgJ2EgcmVmID0geyBtdXRhYmxlIGNvbnRlbnRzIDogJ2EgfVxuZXh0ZXJuYWwgcmVmIDogJ2EgLT4gJ2EgcmVmID0gXCIlbWFrZW11dGFibGVcIlxuZXh0ZXJuYWwgKCAhICkgOiAnYSByZWYgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuZXh0ZXJuYWwgKCA6PSApIDogJ2EgcmVmIC0+ICdhIC0+IHVuaXQgPSBcIiVzZXRmaWVsZDBcIlxuZXh0ZXJuYWwgaW5jciA6IGludCByZWYgLT4gdW5pdCA9IFwiJWluY3JcIlxuZXh0ZXJuYWwgZGVjciA6IGludCByZWYgLT4gdW5pdCA9IFwiJWRlY3JcIlxuXG4oKiBSZXN1bHQgdHlwZSAqKVxuXG50eXBlICgnYSwnYikgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnYlxuXG4oKiBTdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbnMgKilcblxuZXh0ZXJuYWwgZm9ybWF0X2ludCA6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2Zsb2F0IDogc3RyaW5nIC0+IGZsb2F0IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfZmxvYXRcIlxuXG5sZXQgc3RyaW5nX29mX2Jvb2wgYiA9XG4gIGlmIGIgdGhlbiBcInRydWVcIiBlbHNlIFwiZmFsc2VcIlxubGV0IGJvb2xfb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgfCBcInRydWVcIiAtPiB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IGZhbHNlXG4gIHwgXyAtPiBpbnZhbGlkX2FyZyBcImJvb2xfb2Zfc3RyaW5nXCJcblxubGV0IGJvb2xfb2Zfc3RyaW5nX29wdCA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gU29tZSB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IFNvbWUgZmFsc2VcbiAgfCBfIC0+IE5vbmVcblxubGV0IHN0cmluZ19vZl9pbnQgbiA9XG4gIGZvcm1hdF9pbnQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5cbmxldCBpbnRfb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogcHJvdmlkZSB0aGlzIGRpcmVjdGx5IGFzIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlLiAqKVxuICB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmV4dGVybmFsIHN0cmluZ19nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuXG5sZXQgdmFsaWRfZmxvYXRfbGV4ZW0gcyA9XG4gIGxldCBsID0gc3RyaW5nX2xlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID49IGwgdGhlbiBzIF4gXCIuXCIgZWxzZVxuICAgIG1hdGNoIHN0cmluZ19nZXQgcyBpIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gbG9vcCAoaSArIDEpXG4gICAgfCBfIC0+IHNcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBzdHJpbmdfb2ZfZmxvYXQgZiA9IHZhbGlkX2Zsb2F0X2xleGVtIChmb3JtYXRfZmxvYXQgXCIlLjEyZ1wiIGYpXG5cbmV4dGVybmFsIGZsb2F0X29mX3N0cmluZyA6IHN0cmluZyAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdF9vZl9zdHJpbmdcIlxuXG5sZXQgZmxvYXRfb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogcHJvdmlkZSB0aGlzIGRpcmVjdGx5IGFzIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlLiAqKVxuICB0cnkgU29tZSAoZmxvYXRfb2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxuKCogTGlzdCBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIExpc3QgKilcblxubGV0IHJlYyAoIEAgKSBsMSBsMiA9XG4gIG1hdGNoIGwxIHdpdGhcbiAgICBbXSAtPiBsMlxuICB8IGhkIDo6IHRsIC0+IGhkIDo6ICh0bCBAIGwyKVxuXG4oKiBJL08gb3BlcmF0aW9ucyAqKVxuXG50eXBlIGluX2NoYW5uZWxcbnR5cGUgb3V0X2NoYW5uZWxcblxuZXh0ZXJuYWwgb3Blbl9kZXNjcmlwdG9yX291dCA6IGludCAtPiBvdXRfY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3Jfb3V0XCJcbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9pbiA6IGludCAtPiBpbl9jaGFubmVsID0gXCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pblwiXG5cbmxldCBzdGRpbiA9IG9wZW5fZGVzY3JpcHRvcl9pbiAwXG5sZXQgc3Rkb3V0ID0gb3Blbl9kZXNjcmlwdG9yX291dCAxXG5sZXQgc3RkZXJyID0gb3Blbl9kZXNjcmlwdG9yX291dCAyXG5cbigqIEdlbmVyYWwgb3V0cHV0IGZ1bmN0aW9ucyAqKVxuXG50eXBlIG9wZW5fZmxhZyA9XG4gICAgT3Blbl9yZG9ubHkgfCBPcGVuX3dyb25seSB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdCB8IE9wZW5fdHJ1bmMgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeSB8IE9wZW5fdGV4dCB8IE9wZW5fbm9uYmxvY2tcblxuZXh0ZXJuYWwgb3Blbl9kZXNjIDogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuXG5leHRlcm5hbCBzZXRfb3V0X2NoYW5uZWxfbmFtZTogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX291dF9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9vdXQob3Blbl9kZXNjIG5hbWUgbW9kZSBwZXJtKSBpblxuICBzZXRfb3V0X2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5fb3V0IG5hbWUgPVxuICBvcGVuX291dF9nZW4gW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX3RydW5jOyBPcGVuX3RleHRdIDBvNjY2IG5hbWVcblxubGV0IG9wZW5fb3V0X2JpbiBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl9iaW5hcnldIDBvNjY2IG5hbWVcblxuZXh0ZXJuYWwgZmx1c2ggOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2ZsdXNoXCJcblxuZXh0ZXJuYWwgb3V0X2NoYW5uZWxzX2xpc3QgOiB1bml0IC0+IG91dF9jaGFubmVsIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX291dF9jaGFubmVsc19saXN0XCJcblxubGV0IGZsdXNoX2FsbCAoKSA9XG4gIGxldCByZWMgaXRlciA9IGZ1bmN0aW9uXG4gICAgICBbXSAtPiAoKVxuICAgIHwgYTo6bCAtPlxuICAgICAgICBiZWdpbiB0cnlcbiAgICAgICAgICAgIGZsdXNoIGFcbiAgICAgICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgICAgICgpICgqIGlnbm9yZSBjaGFubmVscyBjbG9zZWQgZHVyaW5nIGEgcHJlY2VkaW5nIGZsdXNoLiAqKVxuICAgICAgICBlbmQ7XG4gICAgICAgIGl0ZXIgbFxuICBpbiBpdGVyIChvdXRfY2hhbm5lbHNfbGlzdCAoKSlcblxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dCA6IG91dF9jaGFubmVsIC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX291dHB1dF9zdHJpbmcgOiBvdXRfY2hhbm5lbCAtPiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRwdXRcIlxuXG5leHRlcm5hbCBvdXRwdXRfY2hhciA6IG91dF9jaGFubmVsIC0+IGNoYXIgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5cbmxldCBvdXRwdXRfYnl0ZXMgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXQgb2MgcyAwIChieXRlc19sZW5ndGggcylcblxubGV0IG91dHB1dF9zdHJpbmcgb2MgcyA9XG4gIHVuc2FmZV9vdXRwdXRfc3RyaW5nIG9jIHMgMCAoc3RyaW5nX2xlbmd0aCBzKVxuXG5sZXQgb3V0cHV0IG9jIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0XCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0IG9jIHMgb2ZzIGxlblxuXG5sZXQgb3V0cHV0X3N1YnN0cmluZyBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gc3RyaW5nX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJvdXRwdXRfc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIG9mcyBsZW5cblxuZXh0ZXJuYWwgb3V0cHV0X2J5dGUgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfY2hhclwiXG5leHRlcm5hbCBvdXRwdXRfYmluYXJ5X2ludCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX291dHB1dF9pbnRcIlxuXG5leHRlcm5hbCBtYXJzaGFsX3RvX2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiB1bml0IGxpc3QgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxubGV0IG91dHB1dF92YWx1ZSBjaGFuIHYgPSBtYXJzaGFsX3RvX2NoYW5uZWwgY2hhbiB2IFtdXG5cbmV4dGVybmFsIHNlZWtfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRcIlxuZXh0ZXJuYWwgcG9zX291dCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3Nfb3V0XCJcbmV4dGVybmFsIG91dF9jaGFubmVsX2xlbmd0aCA6IG91dF9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2Vfb3V0X2NoYW5uZWwgOiBvdXRfY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX291dCBvYyA9IGZsdXNoIG9jOyBjbG9zZV9vdXRfY2hhbm5lbCBvY1xubGV0IGNsb3NlX291dF9ub2VyciBvYyA9XG4gICh0cnkgZmx1c2ggb2Mgd2l0aCBfIC0+ICgpKTtcbiAgKHRyeSBjbG9zZV9vdXRfY2hhbm5lbCBvYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfb3V0IDogb3V0X2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIEdlbmVyYWwgaW5wdXQgZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIHNldF9pbl9jaGFubmVsX25hbWU6IGluX2NoYW5uZWwgLT4gc3RyaW5nIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZVwiXG5cbmxldCBvcGVuX2luX2dlbiBtb2RlIHBlcm0gbmFtZSA9XG4gIGxldCBjID0gb3Blbl9kZXNjcmlwdG9yX2luKG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X2luX2NoYW5uZWxfbmFtZSBjIG5hbWU7XG4gIGNcblxubGV0IG9wZW5faW4gbmFtZSA9XG4gIG9wZW5faW5fZ2VuIFtPcGVuX3Jkb25seTsgT3Blbl90ZXh0XSAwIG5hbWVcblxubGV0IG9wZW5faW5fYmluIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fYmluYXJ5XSAwIG5hbWVcblxuZXh0ZXJuYWwgaW5wdXRfY2hhciA6IGluX2NoYW5uZWwgLT4gY2hhciA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2lucHV0IDogaW5fY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX2lucHV0XCJcblxubGV0IGlucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW5cblxubGV0IHJlYyB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIGxlbiA8PSAwIHRoZW4gKCkgZWxzZSBiZWdpblxuICAgIGxldCByID0gdW5zYWZlX2lucHV0IGljIHMgb2ZzIGxlbiBpblxuICAgIGlmIHIgPSAwXG4gICAgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgIGVsc2UgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIChvZnMgKyByKSAobGVuIC0gcilcbiAgZW5kXG5cbmxldCByZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGJ5dGVzX2xlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJyZWFsbHlfaW5wdXRcIlxuICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIGxldCBzID0gYnl0ZXNfY3JlYXRlIGxlbiBpblxuICByZWFsbHlfaW5wdXQgaWMgcyAwIGxlbjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbmV4dGVybmFsIGlucHV0X3NjYW5fbGluZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X3NjYW5fbGluZVwiXG5cbmxldCBpbnB1dF9saW5lIGNoYW4gPVxuICBsZXQgcmVjIGJ1aWxkX3Jlc3VsdCBidWYgcG9zID0gZnVuY3Rpb25cbiAgICBbXSAtPiBidWZcbiAgfCBoZCA6OiB0bCAtPlxuICAgICAgbGV0IGxlbiA9IGJ5dGVzX2xlbmd0aCBoZCBpblxuICAgICAgYnl0ZXNfYmxpdCBoZCAwIGJ1ZiAocG9zIC0gbGVuKSBsZW47XG4gICAgICBidWlsZF9yZXN1bHQgYnVmIChwb3MgLSBsZW4pIHRsIGluXG4gIGxldCByZWMgc2NhbiBhY2N1IGxlbiA9XG4gICAgbGV0IG4gPSBpbnB1dF9zY2FuX2xpbmUgY2hhbiBpblxuICAgIGlmIG4gPSAwIHRoZW4gYmVnaW4gICAgICAgICAgICAgICAgICAgKCogbiA9IDA6IHdlIGFyZSBhdCBFT0YgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByYWlzZSBFbmRfb2ZfZmlsZVxuICAgICAgfCBfICAtPiBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiBhY2N1XG4gICAgZW5kIGVsc2UgaWYgbiA+IDAgdGhlbiBiZWdpbiAgICAgICAgICAoKiBuID4gMDogbmV3bGluZSBmb3VuZCBpbiBidWZmZXIgKilcbiAgICAgIGxldCByZXMgPSBieXRlc19jcmVhdGUgKG4gLSAxKSBpblxuICAgICAgaWdub3JlICh1bnNhZmVfaW5wdXQgY2hhbiByZXMgMCAobiAtIDEpKTtcbiAgICAgIGlnbm9yZSAoaW5wdXRfY2hhciBjaGFuKTsgICAgICAgICAgICgqIHNraXAgdGhlIG5ld2xpbmUgKilcbiAgICAgIG1hdGNoIGFjY3Ugd2l0aFxuICAgICAgICBbXSAtPiByZXNcbiAgICAgIHwgIF8gLT4gbGV0IGxlbiA9IGxlbiArIG4gLSAxIGluXG4gICAgICAgICAgICAgIGJ1aWxkX3Jlc3VsdCAoYnl0ZXNfY3JlYXRlIGxlbikgbGVuIChyZXMgOjogYWNjdSlcbiAgICBlbmQgZWxzZSBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICgqIG4gPCAwOiBuZXdsaW5lIG5vdCBmb3VuZCAqKVxuICAgICAgbGV0IGJlZyA9IGJ5dGVzX2NyZWF0ZSAoLW4pIGluXG4gICAgICBpZ25vcmUodW5zYWZlX2lucHV0IGNoYW4gYmVnIDAgKC1uKSk7XG4gICAgICBzY2FuIChiZWcgOjogYWNjdSkgKGxlbiAtIG4pXG4gICAgZW5kXG4gIGluIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgKHNjYW4gW10gMClcblxuZXh0ZXJuYWwgaW5wdXRfYnl0ZSA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2NoYXJcIlxuZXh0ZXJuYWwgaW5wdXRfYmluYXJ5X2ludCA6IGluX2NoYW5uZWwgLT4gaW50ID0gXCJjYW1sX21sX2lucHV0X2ludFwiXG5leHRlcm5hbCBpbnB1dF92YWx1ZSA6IGluX2NoYW5uZWwgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVcIlxuZXh0ZXJuYWwgc2Vla19pbiA6IGluX2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pblwiXG5leHRlcm5hbCBwb3NfaW4gOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9wb3NfaW5cIlxuZXh0ZXJuYWwgaW5fY2hhbm5lbF9sZW5ndGggOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVcIlxuZXh0ZXJuYWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXQgPSBcImNhbWxfbWxfY2xvc2VfY2hhbm5lbFwiXG5sZXQgY2xvc2VfaW5fbm9lcnIgaWMgPSAodHJ5IGNsb3NlX2luIGljIHdpdGggXyAtPiAoKSlcbmV4dGVybmFsIHNldF9iaW5hcnlfbW9kZV9pbiA6IGluX2NoYW5uZWwgLT4gYm9vbCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXCJcblxuKCogT3V0cHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBvdXRwdXQgKilcblxubGV0IHByaW50X2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZG91dCBjXG5sZXQgcHJpbnRfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzXG5sZXQgcHJpbnRfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRvdXQgc1xubGV0IHByaW50X2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmludF9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByaW50X2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3Rkb3V0IHM7IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5sZXQgcHJpbnRfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZG91dCAnXFxuJzsgZmx1c2ggc3Rkb3V0XG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgZXJyb3IgKilcblxubGV0IHByZXJyX2NoYXIgYyA9IG91dHB1dF9jaGFyIHN0ZGVyciBjXG5sZXQgcHJlcnJfc3RyaW5nIHMgPSBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzXG5sZXQgcHJlcnJfYnl0ZXMgcyA9IG91dHB1dF9ieXRlcyBzdGRlcnIgc1xubGV0IHByZXJyX2ludCBpID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9pbnQgaSlcbmxldCBwcmVycl9mbG9hdCBmID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgKHN0cmluZ19vZl9mbG9hdCBmKVxubGV0IHByZXJyX2VuZGxpbmUgcyA9XG4gIG91dHB1dF9zdHJpbmcgc3RkZXJyIHM7IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5sZXQgcHJlcnJfbmV3bGluZSAoKSA9IG91dHB1dF9jaGFyIHN0ZGVyciAnXFxuJzsgZmx1c2ggc3RkZXJyXG5cbigqIElucHV0IGZ1bmN0aW9ucyBvbiBzdGFuZGFyZCBpbnB1dCAqKVxuXG5sZXQgcmVhZF9saW5lICgpID0gZmx1c2ggc3Rkb3V0OyBpbnB1dF9saW5lIHN0ZGluXG5sZXQgcmVhZF9pbnQgKCkgPSBpbnRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfaW50X29wdCAoKSA9IGludF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXQgKCkgPSBmbG9hdF9vZl9zdHJpbmcocmVhZF9saW5lKCkpXG5sZXQgcmVhZF9mbG9hdF9vcHQgKCkgPSBmbG9hdF9vZl9zdHJpbmdfb3B0KHJlYWRfbGluZSgpKVxuXG4oKiBPcGVyYXRpb25zIG9uIGxhcmdlIGZpbGVzICopXG5cbm1vZHVsZSBMYXJnZUZpbGUgPVxuICBzdHJ1Y3RcbiAgICBleHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19vdXRfNjRcIlxuICAgIGV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3Nfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICAgIGV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludDY0IC0+IHVuaXQgPSBcImNhbWxfbWxfc2Vla19pbl82NFwiXG4gICAgZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9wb3NfaW5fNjRcIlxuICAgIGV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCA9IFwiY2FtbF9tbF9jaGFubmVsX3NpemVfNjRcIlxuICBlbmRcblxuKCogRm9ybWF0cyAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2XG4gICA9ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm9ybWF0NlxuICAgPSBGb3JtYXQgb2YgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mbXRcbiAgICAgICAgICAgICAgICogc3RyaW5nXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdjLCAnYywgJ2QpIGZvcm1hdDZcblxudHlwZSAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MsICdjKSBmb3JtYXQ0XG5cbmxldCBzdHJpbmdfb2ZfZm9ybWF0IChGb3JtYXQgKF9mbXQsIHN0cikpID0gc3RyXG5cbmV4dGVybmFsIGZvcm1hdF9vZl9zdHJpbmcgOlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSBcIiVpZGVudGl0eVwiXG5cbmxldCAoIF5eICkgKEZvcm1hdCAoZm10MSwgc3RyMSkpIChGb3JtYXQgKGZtdDIsIHN0cjIpKSA9XG4gIEZvcm1hdCAoQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmNvbmNhdF9mbXQgZm10MSBmbXQyLFxuICAgICAgICAgIHN0cjEgXiBcIiUsXCIgXiBzdHIyKVxuXG4oKiBNaXNjZWxsYW5lb3VzICopXG5cbmV4dGVybmFsIHN5c19leGl0IDogaW50IC0+ICdhID0gXCJjYW1sX3N5c19leGl0XCJcblxuKCogZm9yIGF0X2V4aXQgKilcbnR5cGUgJ2EgYXRvbWljX3RcbmV4dGVybmFsIGF0b21pY19tYWtlIDogJ2EgLT4gJ2EgYXRvbWljX3QgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCBhdG9taWNfZ2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgPSBcIiVhdG9taWNfbG9hZFwiXG5leHRlcm5hbCBhdG9taWNfY29tcGFyZV9hbmRfc2V0IDogJ2EgYXRvbWljX3QgLT4gJ2EgLT4gJ2EgLT4gYm9vbFxuICA9IFwiJWF0b21pY19jYXNcIlxuXG5sZXQgZXhpdF9mdW5jdGlvbiA9IGF0b21pY19tYWtlIGZsdXNoX2FsbFxuXG5sZXQgcmVjIGF0X2V4aXQgZiA9XG4gICgqIE1QUiM3MjUzLCBNUFIjNzc5NjogbWFrZSBzdXJlIFwiZlwiIGlzIGV4ZWN1dGVkIG9ubHkgb25jZSAqKVxuICBsZXQgZl95ZXRfdG9fcnVuID0gYXRvbWljX21ha2UgdHJ1ZSBpblxuICBsZXQgb2xkX2V4aXQgPSBhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24gaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICBpZiBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGZfeWV0X3RvX3J1biB0cnVlIGZhbHNlIHRoZW4gZiAoKSA7XG4gICAgb2xkX2V4aXQgKClcbiAgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBhdG9taWNfY29tcGFyZV9hbmRfc2V0IGV4aXRfZnVuY3Rpb24gb2xkX2V4aXQgbmV3X2V4aXQgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiBhdF9leGl0IGZcblxubGV0IGRvX2RvbWFpbl9sb2NhbF9hdF9leGl0ID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgKCFkb19kb21haW5fbG9jYWxfYXRfZXhpdCkgKCk7XG4gIChhdG9taWNfZ2V0IGV4aXRfZnVuY3Rpb24pICgpXG5cbmxldCBleGl0IHJldGNvZGUgPVxuICBkb19hdF9leGl0ICgpO1xuICBzeXNfZXhpdCByZXRjb2RlXG5cbmxldCBfID0gcmVnaXN0ZXJfbmFtZWRfdmFsdWUgXCJQZXJ2YXNpdmVzLmRvX2F0X2V4aXRcIiBkb19hdF9leGl0XG5cbigqTU9EVUxFX0FMSUFTRVMqKVxubW9kdWxlIEFyZyAgICAgICAgICAgID0gQXJnXG5tb2R1bGUgQXJyYXkgICAgICAgICAgPSBBcnJheVxubW9kdWxlIEFycmF5TGFiZWxzICAgID0gQXJyYXlMYWJlbHNcbm1vZHVsZSBBdG9taWMgICAgICAgICA9IEF0b21pY1xubW9kdWxlIEJpZ2FycmF5ICAgICAgID0gQmlnYXJyYXlcbm1vZHVsZSBCb29sICAgICAgICAgICA9IEJvb2xcbm1vZHVsZSBCdWZmZXIgICAgICAgICA9IEJ1ZmZlclxubW9kdWxlIEJ5dGVzICAgICAgICAgID0gQnl0ZXNcbm1vZHVsZSBCeXRlc0xhYmVscyAgICA9IEJ5dGVzTGFiZWxzXG5tb2R1bGUgQ2FsbGJhY2sgICAgICAgPSBDYWxsYmFja1xubW9kdWxlIENoYXIgICAgICAgICAgID0gQ2hhclxubW9kdWxlIENvbXBsZXggICAgICAgID0gQ29tcGxleFxubW9kdWxlIENvbmRpdGlvbiAgICAgID0gQ29uZGl0aW9uXG5tb2R1bGUgRGlnZXN0ICAgICAgICAgPSBEaWdlc3Rcbm1vZHVsZSBEb21haW4gICAgICAgICA9IERvbWFpblxubW9kdWxlIEVmZmVjdCAgICAgICAgID0gRWZmZWN0XG5tb2R1bGUgRWl0aGVyICAgICAgICAgPSBFaXRoZXJcbm1vZHVsZSBFcGhlbWVyb24gICAgICA9IEVwaGVtZXJvblxubW9kdWxlIEZpbGVuYW1lICAgICAgID0gRmlsZW5hbWVcbm1vZHVsZSBGbG9hdCAgICAgICAgICA9IEZsb2F0XG5tb2R1bGUgRm9ybWF0ICAgICAgICAgPSBGb3JtYXRcbm1vZHVsZSBGdW4gICAgICAgICAgICA9IEZ1blxubW9kdWxlIEdjICAgICAgICAgICAgID0gR2Ncbm1vZHVsZSBIYXNodGJsICAgICAgICA9IEhhc2h0Ymxcbm1vZHVsZSBJbl9jaGFubmVsICAgICA9IEluX2NoYW5uZWxcbm1vZHVsZSBJbnQgICAgICAgICAgICA9IEludFxubW9kdWxlIEludDMyICAgICAgICAgID0gSW50MzJcbm1vZHVsZSBJbnQ2NCAgICAgICAgICA9IEludDY0XG5tb2R1bGUgTGF6eSAgICAgICAgICAgPSBMYXp5XG5tb2R1bGUgTGV4aW5nICAgICAgICAgPSBMZXhpbmdcbm1vZHVsZSBMaXN0ICAgICAgICAgICA9IExpc3Rcbm1vZHVsZSBMaXN0TGFiZWxzICAgICA9IExpc3RMYWJlbHNcbm1vZHVsZSBNYXAgICAgICAgICAgICA9IE1hcFxubW9kdWxlIE1hcnNoYWwgICAgICAgID0gTWFyc2hhbFxubW9kdWxlIE1vcmVMYWJlbHMgICAgID0gTW9yZUxhYmVsc1xubW9kdWxlIE11dGV4ICAgICAgICAgID0gTXV0ZXhcbm1vZHVsZSBOYXRpdmVpbnQgICAgICA9IE5hdGl2ZWludFxubW9kdWxlIE9iaiAgICAgICAgICAgID0gT2JqXG5tb2R1bGUgT28gICAgICAgICAgICAgPSBPb1xubW9kdWxlIE9wdGlvbiAgICAgICAgID0gT3B0aW9uXG5tb2R1bGUgT3V0X2NoYW5uZWwgICAgPSBPdXRfY2hhbm5lbFxubW9kdWxlIFBhcnNpbmcgICAgICAgID0gUGFyc2luZ1xubW9kdWxlIFByaW50ZXhjICAgICAgID0gUHJpbnRleGNcbm1vZHVsZSBQcmludGYgICAgICAgICA9IFByaW50ZlxubW9kdWxlIFF1ZXVlICAgICAgICAgID0gUXVldWVcbm1vZHVsZSBSYW5kb20gICAgICAgICA9IFJhbmRvbVxubW9kdWxlIFJlc3VsdCAgICAgICAgID0gUmVzdWx0XG5tb2R1bGUgU2NhbmYgICAgICAgICAgPSBTY2FuZlxubW9kdWxlIFNlbWFwaG9yZSAgICAgID0gU2VtYXBob3JlXG5tb2R1bGUgU2VxICAgICAgICAgICAgPSBTZXFcbm1vZHVsZSBTZXQgICAgICAgICAgICA9IFNldFxubW9kdWxlIFN0YWNrICAgICAgICAgID0gU3RhY2tcbm1vZHVsZSBTdGRMYWJlbHMgICAgICA9IFN0ZExhYmVsc1xubW9kdWxlIFN0cmluZyAgICAgICAgID0gU3RyaW5nXG5tb2R1bGUgU3RyaW5nTGFiZWxzICAgPSBTdHJpbmdMYWJlbHNcbm1vZHVsZSBTeXMgICAgICAgICAgICA9IFN5c1xubW9kdWxlIFVjaGFyICAgICAgICAgID0gVWNoYXJcbm1vZHVsZSBVbml0ICAgICAgICAgICA9IFVuaXRcbm1vZHVsZSBXZWFrICAgICAgICAgICA9IFdlYWtcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgR2FicmllbCBTY2hlcmVyLCBwcm9qZXQgUGFyc2lmYWwsIElOUklBIFNhY2xheSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAoJ2EsICdiKSB0ID0gTGVmdCBvZiAnYSB8IFJpZ2h0IG9mICdiXG5cbmxldCBsZWZ0IHYgPSBMZWZ0IHZcbmxldCByaWdodCB2ID0gUmlnaHQgdlxuXG5sZXQgaXNfbGVmdCA9IGZ1bmN0aW9uXG58IExlZnQgXyAtPiB0cnVlXG58IFJpZ2h0IF8gLT4gZmFsc2VcblxubGV0IGlzX3JpZ2h0ID0gZnVuY3Rpb25cbnwgTGVmdCBfIC0+IGZhbHNlXG58IFJpZ2h0IF8gLT4gdHJ1ZVxuXG5sZXQgZmluZF9sZWZ0ID0gZnVuY3Rpb25cbnwgTGVmdCB2IC0+IFNvbWUgdlxufCBSaWdodCBfIC0+IE5vbmVcblxubGV0IGZpbmRfcmlnaHQgPSBmdW5jdGlvblxufCBMZWZ0IF8gLT4gTm9uZVxufCBSaWdodCB2IC0+IFNvbWUgdlxuXG5sZXQgbWFwX2xlZnQgZiA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBMZWZ0IChmIHYpXG58IFJpZ2h0IF8gYXMgZSAtPiBlXG5cbmxldCBtYXBfcmlnaHQgZiA9IGZ1bmN0aW9uXG58IExlZnQgXyBhcyBlIC0+IGVcbnwgUmlnaHQgdiAtPiBSaWdodCAoZiB2KVxuXG5sZXQgbWFwIH5sZWZ0IH5yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBMZWZ0IChsZWZ0IHYpXG58IFJpZ2h0IHYgLT4gUmlnaHQgKHJpZ2h0IHYpXG5cbmxldCBmb2xkIH5sZWZ0IH5yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBsZWZ0IHZcbnwgUmlnaHQgdiAtPiByaWdodCB2XG5cbmxldCBpdGVyID0gZm9sZFxuXG5sZXQgZm9yX2FsbCA9IGZvbGRcblxubGV0IGVxdWFsIH5sZWZ0IH5yaWdodCBlMSBlMiA9IG1hdGNoIGUxLCBlMiB3aXRoXG58IExlZnQgdjEsIExlZnQgdjIgLT4gbGVmdCB2MSB2MlxufCBSaWdodCB2MSwgUmlnaHQgdjIgLT4gcmlnaHQgdjEgdjJcbnwgTGVmdCBfLCBSaWdodCBfIHwgUmlnaHQgXywgTGVmdCBfIC0+IGZhbHNlXG5cbmxldCBjb21wYXJlIH5sZWZ0IH5yaWdodCBlMSBlMiA9IG1hdGNoIGUxLCBlMiB3aXRoXG58IExlZnQgdjEsIExlZnQgdjIgLT4gbGVmdCB2MSB2MlxufCBSaWdodCB2MSwgUmlnaHQgdjIgLT4gcmlnaHQgdjEgdjJcbnwgTGVmdCBfLCBSaWdodCBfIC0+ICgtMSlcbnwgUmlnaHQgXywgTGVmdCBfIC0+IDFcbiIsIigqIEBjb25maWd1cmVfaW5wdXRAICopXG4jMyBcInN5cy5tbC5pblwiXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgYmFja2VuZF90eXBlID1cbiAgfCBOYXRpdmVcbiAgfCBCeXRlY29kZVxuICB8IE90aGVyIG9mIHN0cmluZ1xuKCogU3lzdGVtIGludGVyZmFjZSAqKVxuXG5leHRlcm5hbCBnZXRfY29uZmlnOiB1bml0IC0+IHN0cmluZyAqIGludCAqIGJvb2wgPSBcImNhbWxfc3lzX2dldF9jb25maWdcIlxuZXh0ZXJuYWwgZ2V0X2V4ZWN1dGFibGVfbmFtZSA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19leGVjdXRhYmxlX25hbWVcIlxuZXh0ZXJuYWwgYXJndiA6IHN0cmluZyBhcnJheSA9IFwiJXN5c19hcmd2XCJcbmV4dGVybmFsIGJpZ19lbmRpYW4gOiB1bml0IC0+IGJvb2wgPSBcIiViaWdfZW5kaWFuXCJcbmV4dGVybmFsIHdvcmRfc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIld29yZF9zaXplXCJcbmV4dGVybmFsIGludF9zaXplIDogdW5pdCAtPiBpbnQgPSBcIiVpbnRfc2l6ZVwiXG5leHRlcm5hbCBtYXhfd29zaXplIDogdW5pdCAtPiBpbnQgPSBcIiVtYXhfd29zaXplXCJcbmV4dGVybmFsIHVuaXggOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfdW5peFwiXG5leHRlcm5hbCB3aW4zMiA6IHVuaXQgLT4gYm9vbCA9IFwiJW9zdHlwZV93aW4zMlwiXG5leHRlcm5hbCBjeWd3aW4gOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfY3lnd2luXCJcbmV4dGVybmFsIGdldF9iYWNrZW5kX3R5cGUgOiB1bml0IC0+IGJhY2tlbmRfdHlwZSA9IFwiJWJhY2tlbmRfdHlwZVwiXG5cbmxldCBleGVjdXRhYmxlX25hbWUgPSBnZXRfZXhlY3V0YWJsZV9uYW1lKClcbmxldCAob3NfdHlwZSwgXywgXykgPSBnZXRfY29uZmlnKClcbmxldCBiYWNrZW5kX3R5cGUgPSBnZXRfYmFja2VuZF90eXBlICgpXG5sZXQgYmlnX2VuZGlhbiA9IGJpZ19lbmRpYW4gKClcbmxldCB3b3JkX3NpemUgPSB3b3JkX3NpemUgKClcbmxldCBpbnRfc2l6ZSA9IGludF9zaXplICgpXG5sZXQgdW5peCA9IHVuaXggKClcbmxldCB3aW4zMiA9IHdpbjMyICgpXG5sZXQgY3lnd2luID0gY3lnd2luICgpXG5sZXQgbWF4X2FycmF5X2xlbmd0aCA9IG1heF93b3NpemUgKClcbmxldCBtYXhfZmxvYXRhcnJheV9sZW5ndGggPSBtYXhfYXJyYXlfbGVuZ3RoIC8gKDY0IC8gd29yZF9zaXplKVxubGV0IG1heF9zdHJpbmdfbGVuZ3RoID0gd29yZF9zaXplIC8gOCAqIG1heF9hcnJheV9sZW5ndGggLSAxXG5leHRlcm5hbCBydW50aW1lX3ZhcmlhbnQgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9ydW50aW1lX3ZhcmlhbnRcIlxuZXh0ZXJuYWwgcnVudGltZV9wYXJhbWV0ZXJzIDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfcnVudGltZV9wYXJhbWV0ZXJzXCJcblxuZXh0ZXJuYWwgZmlsZV9leGlzdHM6IHN0cmluZyAtPiBib29sID0gXCJjYW1sX3N5c19maWxlX2V4aXN0c1wiXG5leHRlcm5hbCBpc19kaXJlY3RvcnkgOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfaXNfZGlyZWN0b3J5XCJcbmV4dGVybmFsIHJlbW92ZTogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbW92ZVwiXG5leHRlcm5hbCByZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX3JlbmFtZVwiXG5leHRlcm5hbCBnZXRlbnY6IHN0cmluZyAtPiBzdHJpbmcgPSBcImNhbWxfc3lzX2dldGVudlwiXG5cbmxldCBnZXRlbnZfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChnZXRlbnYgcylcbiAgd2l0aCBOb3RfZm91bmQgLT4gTm9uZVxuXG5leHRlcm5hbCBjb21tYW5kOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFwiXG5leHRlcm5hbCB0aW1lOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKSA9XG4gIFwiY2FtbF9zeXNfdGltZVwiIFwiY2FtbF9zeXNfdGltZV91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGNoZGlyOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2hkaXJcIlxuZXh0ZXJuYWwgbWtkaXI6IHN0cmluZyAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfbWtkaXJcIlxuZXh0ZXJuYWwgcm1kaXI6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19ybWRpclwiXG5leHRlcm5hbCBnZXRjd2Q6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19nZXRjd2RcIlxuZXh0ZXJuYWwgcmVhZGRpciA6IHN0cmluZyAtPiBzdHJpbmcgYXJyYXkgPSBcImNhbWxfc3lzX3JlYWRfZGlyZWN0b3J5XCJcblxubGV0IGludGVyYWN0aXZlID0gcmVmIGZhbHNlXG5cbnR5cGUgc2lnbmFsX2JlaGF2aW9yID1cbiAgICBTaWduYWxfZGVmYXVsdFxuICB8IFNpZ25hbF9pZ25vcmVcbiAgfCBTaWduYWxfaGFuZGxlIG9mIChpbnQgLT4gdW5pdClcblxuZXh0ZXJuYWwgc2lnbmFsIDogaW50IC0+IHNpZ25hbF9iZWhhdmlvciAtPiBzaWduYWxfYmVoYXZpb3JcbiAgICAgICAgICAgICAgICA9IFwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyXCJcblxubGV0IHNldF9zaWduYWwgc2lnX251bSBzaWdfYmVoID0gaWdub3JlKHNpZ25hbCBzaWdfbnVtIHNpZ19iZWgpXG5cbmxldCBzaWdhYnJ0ID0gLTFcbmxldCBzaWdhbHJtID0gLTJcbmxldCBzaWdmcGUgPSAtM1xubGV0IHNpZ2h1cCA9IC00XG5sZXQgc2lnaWxsID0gLTVcbmxldCBzaWdpbnQgPSAtNlxubGV0IHNpZ2tpbGwgPSAtN1xubGV0IHNpZ3BpcGUgPSAtOFxubGV0IHNpZ3F1aXQgPSAtOVxubGV0IHNpZ3NlZ3YgPSAtMTBcbmxldCBzaWd0ZXJtID0gLTExXG5sZXQgc2lndXNyMSA9IC0xMlxubGV0IHNpZ3VzcjIgPSAtMTNcbmxldCBzaWdjaGxkID0gLTE0XG5sZXQgc2lnY29udCA9IC0xNVxubGV0IHNpZ3N0b3AgPSAtMTZcbmxldCBzaWd0c3RwID0gLTE3XG5sZXQgc2lndHRpbiA9IC0xOFxubGV0IHNpZ3R0b3UgPSAtMTlcbmxldCBzaWd2dGFscm0gPSAtMjBcbmxldCBzaWdwcm9mID0gLTIxXG5sZXQgc2lnYnVzID0gLTIyXG5sZXQgc2lncG9sbCA9IC0yM1xubGV0IHNpZ3N5cyA9IC0yNFxubGV0IHNpZ3RyYXAgPSAtMjVcbmxldCBzaWd1cmcgPSAtMjZcbmxldCBzaWd4Y3B1ID0gLTI3XG5sZXQgc2lneGZzeiA9IC0yOFxuXG5leGNlcHRpb24gQnJlYWtcblxubGV0IGNhdGNoX2JyZWFrIG9uID1cbiAgaWYgb24gdGhlblxuICAgIHNldF9zaWduYWwgc2lnaW50IChTaWduYWxfaGFuZGxlKGZ1biBfIC0+IHJhaXNlIEJyZWFrKSlcbiAgZWxzZVxuICAgIHNldF9zaWduYWwgc2lnaW50IFNpZ25hbF9kZWZhdWx0XG5cblxuZXh0ZXJuYWwgZW5hYmxlX3J1bnRpbWVfd2FybmluZ3M6IGJvb2wgLT4gdW5pdCA9XG4gIFwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5nc1wiXG5leHRlcm5hbCBydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQ6IHVuaXQgLT4gYm9vbCA9XG4gIFwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcIlxuXG4oKiBUaGUgdmVyc2lvbiBzdHJpbmcgaXMgZm91bmQgaW4gZmlsZSAuLi9WRVJTSU9OICopXG5cbmxldCBvY2FtbF92ZXJzaW9uID0gXCJAVkVSU0lPTkBcIlxuXG5sZXQgZGV2ZWxvcG1lbnRfdmVyc2lvbiA9IEBPQ0FNTF9ERVZFTE9QTUVOVF9WRVJTSU9OQFxuXG50eXBlIGV4dHJhX3ByZWZpeCA9IFBsdXMgfCBUaWxkZVxuXG50eXBlIGV4dHJhX2luZm8gPSBleHRyYV9wcmVmaXggKiBzdHJpbmdcblxudHlwZSBvY2FtbF9yZWxlYXNlX2luZm8gPSB7XG4gIG1ham9yIDogaW50O1xuICBtaW5vciA6IGludDtcbiAgcGF0Y2hsZXZlbCA6IGludDtcbiAgZXh0cmEgOiBleHRyYV9pbmZvIG9wdGlvblxufVxuXG5sZXQgb2NhbWxfcmVsZWFzZSA9IHtcbiAgbWFqb3IgPSBAT0NBTUxfVkVSU0lPTl9NQUpPUkA7XG4gIG1pbm9yID0gQE9DQU1MX1ZFUlNJT05fTUlOT1JAO1xuICBwYXRjaGxldmVsID0gQE9DQU1MX1ZFUlNJT05fUEFUQ0hMRVZFTEA7XG4gIGV4dHJhID0gQE9DQU1MX1JFTEVBU0VfRVhUUkFAXG59XG5cbigqIE9wdGltaXphdGlvbiAqKVxuXG5leHRlcm5hbCBvcGFxdWVfaWRlbnRpdHkgOiAnYSAtPiAnYSA9IFwiJW9wYXF1ZVwiXG5cbm1vZHVsZSBJbW1lZGlhdGU2NCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZShJbW1lZGlhdGUgOiBJbW1lZGlhdGUpKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA9IHN0cnVjdFxuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuICAgIGV4dGVybmFsIG1hZ2ljIDogXyByZXByIC0+IHQgcmVwciA9IFwiJWlkZW50aXR5XCJcbiAgICBsZXQgcmVwciA9XG4gICAgICBpZiB3b3JkX3NpemUgPSA2NCB0aGVuXG4gICAgICAgIG1hZ2ljIEltbWVkaWF0ZVxuICAgICAgZWxzZVxuICAgICAgICBtYWdpYyBOb25faW1tZWRpYXRlXG4gIGVuZFxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE9wZXJhdGlvbnMgb24gaW50ZXJuYWwgcmVwcmVzZW50YXRpb25zIG9mIHZhbHVlcyAqKVxuXG50eXBlIHRcblxudHlwZSByYXdfZGF0YSA9IG5hdGl2ZWludFxuXG5leHRlcm5hbCByZXByIDogJ2EgLT4gdCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIG9iaiA6IHQgLT4gJ2EgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBtYWdpYyA6ICdhIC0+ICdiID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgaXNfaW50IDogdCAtPiBib29sID0gXCIlb2JqX2lzX2ludFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBpc19ibG9jayBhID0gbm90IChpc19pbnQgYSlcbmV4dGVybmFsIHRhZyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial90YWdcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2l6ZSA6IHQgLT4gaW50ID0gXCIlb2JqX3NpemVcIlxuZXh0ZXJuYWwgcmVhY2hhYmxlX3dvcmRzIDogdCAtPiBpbnQgPSBcImNhbWxfb2JqX3JlYWNoYWJsZV93b3Jkc1wiXG5leHRlcm5hbCBmaWVsZCA6IHQgLT4gaW50IC0+IHQgPSBcIiVvYmpfZmllbGRcIlxuZXh0ZXJuYWwgc2V0X2ZpZWxkIDogdCAtPiBpbnQgLT4gdCAtPiB1bml0ID0gXCIlb2JqX3NldF9maWVsZFwiXG5leHRlcm5hbCBjb21wYXJlX2FuZF9zd2FwX2ZpZWxkIDogdCAtPiBpbnQgLT4gdCAtPiB0IC0+IGJvb2xcbiAgPSBcImNhbWxfb2JqX2NvbXBhcmVfYW5kX3N3YXBcIlxuZXh0ZXJuYWwgaXNfc2hhcmVkIDogdCAtPiBib29sID0gXCJjYW1sX29ial9pc19zaGFyZWRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9nZXQgOiBmbG9hdGFycmF5IC0+IGludCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9hdGFycmF5X2dldFwiXG5leHRlcm5hbCBmbG9hdGFycmF5X3NldCA6XG4gICAgZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiY2FtbF9mbG9hdGFycmF5X3NldFwiXG5sZXQgW0BpbmxpbmUgYWx3YXlzXSBkb3VibGVfZmllbGQgeCBpID0gZmxvYXRhcnJheV9nZXQgKG9iaiB4IDogZmxvYXRhcnJheSkgaVxubGV0IFtAaW5saW5lIGFsd2F5c10gc2V0X2RvdWJsZV9maWVsZCB4IGkgdiA9XG4gIGZsb2F0YXJyYXlfc2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGkgdlxuZXh0ZXJuYWwgcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgPSBcImNhbWxfb2JqX3Jhd19maWVsZFwiXG5leHRlcm5hbCBzZXRfcmF3X2ZpZWxkIDogdCAtPiBpbnQgLT4gcmF3X2RhdGEgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfb2JqX3NldF9yYXdfZmllbGRcIlxuXG5leHRlcm5hbCBuZXdfYmxvY2sgOiBpbnQgLT4gaW50IC0+IHQgPSBcImNhbWxfb2JqX2Jsb2NrXCJcbmV4dGVybmFsIGR1cCA6IHQgLT4gdCA9IFwiY2FtbF9vYmpfZHVwXCJcbmV4dGVybmFsIGFkZF9vZmZzZXQgOiB0IC0+IEludDMyLnQgLT4gdCA9IFwiY2FtbF9vYmpfYWRkX29mZnNldFwiXG5leHRlcm5hbCB3aXRoX3RhZyA6IGludCAtPiB0IC0+IHQgPSBcImNhbWxfb2JqX3dpdGhfdGFnXCJcblxubGV0IGZpcnN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl90YWcgPSAwXG5sZXQgbGFzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfdGFnID0gMjQzXG5cbmxldCBmb3JjaW5nX3RhZyA9IDI0NFxubGV0IGNvbnRfdGFnID0gMjQ1XG5sZXQgbGF6eV90YWcgPSAyNDZcbmxldCBjbG9zdXJlX3RhZyA9IDI0N1xubGV0IG9iamVjdF90YWcgPSAyNDhcbmxldCBpbmZpeF90YWcgPSAyNDlcbmxldCBmb3J3YXJkX3RhZyA9IDI1MFxuXG5sZXQgbm9fc2Nhbl90YWcgPSAyNTFcblxubGV0IGFic3RyYWN0X3RhZyA9IDI1MVxubGV0IHN0cmluZ190YWcgPSAyNTJcbmxldCBkb3VibGVfdGFnID0gMjUzXG5sZXQgZG91YmxlX2FycmF5X3RhZyA9IDI1NFxubGV0IGN1c3RvbV90YWcgPSAyNTVcblxuXG5sZXQgaW50X3RhZyA9IDEwMDBcbmxldCBvdXRfb2ZfaGVhcF90YWcgPSAxMDAxXG5sZXQgdW5hbGlnbmVkX3RhZyA9IDEwMDJcblxubW9kdWxlIENsb3N1cmUgPSBzdHJ1Y3RcbiAgdHlwZSBpbmZvID0ge1xuICAgIGFyaXR5OiBpbnQ7XG4gICAgc3RhcnRfZW52OiBpbnQ7XG4gIH1cblxuICBsZXQgaW5mb19vZl9yYXcgKGluZm8gOiBuYXRpdmVpbnQpID1cbiAgICBsZXQgb3BlbiBOYXRpdmVpbnQgaW5cbiAgICBsZXQgYXJpdHkgPVxuICAgICAgKCogc2lnbmVkOiBuZWdhdGl2ZSBmb3IgdHVwbGVkIGZ1bmN0aW9ucyAqKVxuICAgICAgaWYgU3lzLndvcmRfc2l6ZSA9IDY0IHRoZW5cbiAgICAgICAgdG9faW50IChzaGlmdF9yaWdodCBpbmZvIDU2KVxuICAgICAgZWxzZVxuICAgICAgICB0b19pbnQgKHNoaWZ0X3JpZ2h0IGluZm8gMjQpXG4gICAgaW5cbiAgICBsZXQgc3RhcnRfZW52ID1cbiAgICAgICgqIHN0YXJ0X2VudiBpcyB1bnNpZ25lZCwgYnV0IHdlIGtub3cgaXQgY2FuIGFsd2F5cyBmaXQgYW4gT0NhbWxcbiAgICAgICAgIGludGVnZXIgc28gd2UgdXNlIFt0b19pbnRdIGluc3RlYWQgb2YgW3Vuc2lnbmVkX3RvX2ludF0uICopXG4gICAgICB0b19pbnQgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKHNoaWZ0X2xlZnQgaW5mbyA4KSA5KSBpblxuICAgIHsgYXJpdHk7IHN0YXJ0X2VudiB9XG5cbiAgKCogbm90ZTogd2UgZXhwZWN0IGEgY2xvc3VyZSwgbm90IGFuIGluZml4IHBvaW50ZXIgKilcbiAgbGV0IGluZm8gKG9iaiA6IHQpID1cbiAgICBhc3NlcnQgKHRhZyBvYmogPSBjbG9zdXJlX3RhZyk7XG4gICAgaW5mb19vZl9yYXcgKHJhd19maWVsZCBvYmogMSlcbmVuZFxuXG5tb2R1bGUgRXh0ZW5zaW9uX2NvbnN0cnVjdG9yID1cbnN0cnVjdFxuICB0eXBlIHQgPSBleHRlbnNpb25fY29uc3RydWN0b3JcbiAgbGV0IG9mX3ZhbCB4ID1cbiAgICBsZXQgeCA9IHJlcHIgeCBpblxuICAgIGxldCBzbG90ID1cbiAgICAgIGlmIChpc19ibG9jayB4KSAmJiAodGFnIHgpIDw+IG9iamVjdF90YWcgJiYgKHNpemUgeCkgPj0gMSB0aGVuIGZpZWxkIHggMFxuICAgICAgZWxzZSB4XG4gICAgaW5cbiAgICBsZXQgbmFtZSA9XG4gICAgICBpZiAoaXNfYmxvY2sgc2xvdCkgJiYgKHRhZyBzbG90KSA9IG9iamVjdF90YWcgdGhlbiBmaWVsZCBzbG90IDBcbiAgICAgIGVsc2UgaW52YWxpZF9hcmcgXCJPYmouZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXCJcbiAgICBpblxuICAgICAgaWYgKHRhZyBuYW1lKSA9IHN0cmluZ190YWcgdGhlbiAob2JqIHNsb3QgOiB0KVxuICAgICAgZWxzZSBpbnZhbGlkX2FyZyBcIk9iai5leHRlbnNpb25fY29uc3RydWN0b3JcIlxuXG4gIGxldCBbQGlubGluZSBhbHdheXNdIG5hbWUgKHNsb3QgOiB0KSA9XG4gICAgKG9iaiAoZmllbGQgKHJlcHIgc2xvdCkgMCkgOiBzdHJpbmcpXG5cbiAgbGV0IFtAaW5saW5lIGFsd2F5c10gaWQgKHNsb3QgOiB0KSA9XG4gICAgKG9iaiAoZmllbGQgKHJlcHIgc2xvdCkgMSkgOiBpbnQpXG5lbmRcblxubW9kdWxlIEVwaGVtZXJvbiA9IHN0cnVjdFxuICB0eXBlIG9ial90ID0gdFxuXG4gIHR5cGUgdCAoKiogZXBoZW1lcm9uICopXG5cbiAgICgqKiBUbyBjaGFuZ2UgaW4gc3luYyB3aXRoIHdlYWsuaCAqKVxuICBsZXQgYWRkaXRpb25hbF92YWx1ZXMgPSAyXG4gIGxldCBtYXhfZXBoZV9sZW5ndGggPSBTeXMubWF4X2FycmF5X2xlbmd0aCAtIGFkZGl0aW9uYWxfdmFsdWVzXG5cbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IHQgPSBcImNhbWxfZXBoZV9jcmVhdGVcIlxuICBsZXQgY3JlYXRlIGwgPVxuICAgIGlmIG5vdCAoMCA8PSBsICYmIGwgPD0gbWF4X2VwaGVfbGVuZ3RoKSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIk9iai5FcGhlbWVyb24uY3JlYXRlXCI7XG4gICAgY3JlYXRlIGxcblxuICBsZXQgbGVuZ3RoIHggPSBzaXplKHJlcHIgeCkgLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG4gIGxldCByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gbXNnID1cbiAgICBpZiBub3QgKDAgPD0gbyAmJiBvIDwgbGVuZ3RoIGUpIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIG1zZ1xuXG4gIGV4dGVybmFsIGdldF9rZXk6IHQgLT4gaW50IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9rZXlcIlxuICBsZXQgZ2V0X2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uZ2V0X2tleVwiO1xuICAgIGdldF9rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgZ2V0X2tleV9jb3B5OiB0IC0+IGludCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfa2V5X2NvcHlcIlxuICBsZXQgZ2V0X2tleV9jb3B5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi5nZXRfa2V5X2NvcHlcIjtcbiAgICBnZXRfa2V5X2NvcHkgZSBvXG5cbiAgZXh0ZXJuYWwgc2V0X2tleTogdCAtPiBpbnQgLT4gb2JqX3QgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3NldF9rZXlcIlxuICBsZXQgc2V0X2tleSBlIG8geCA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi5zZXRfa2V5XCI7XG4gICAgc2V0X2tleSBlIG8geFxuXG4gIGV4dGVybmFsIHVuc2V0X2tleTogdCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3Vuc2V0X2tleVwiXG4gIGxldCB1bnNldF9rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLnVuc2V0X2tleVwiO1xuICAgIHVuc2V0X2tleSBlIG9cblxuICBleHRlcm5hbCBjaGVja19rZXk6IHQgLT4gaW50IC0+IGJvb2wgPSBcImNhbWxfZXBoZV9jaGVja19rZXlcIlxuICBsZXQgY2hlY2tfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi5jaGVja19rZXlcIjtcbiAgICBjaGVja19rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgYmxpdF9rZXkgOiB0IC0+IGludCAtPiB0IC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgID0gXCJjYW1sX2VwaGVfYmxpdF9rZXlcIlxuXG4gIGxldCBibGl0X2tleSBlMSBvMSBlMiBvMiBsID1cbiAgICBpZiBsIDwgMCB8fCBvMSA8IDAgfHwgbzEgPiBsZW5ndGggZTEgLSBsXG4gICAgICAgfHwgbzIgPCAwIHx8IG8yID4gbGVuZ3RoIGUyIC0gbFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJPYmouRXBoZW1lcm9uLmJsaXRfa2V5XCJcbiAgICBlbHNlIGlmIGwgPD4gMCB0aGVuIGJsaXRfa2V5IGUxIG8xIGUyIG8yIGxcblxuICBleHRlcm5hbCBnZXRfZGF0YTogdCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfZGF0YVwiXG4gIGV4dGVybmFsIGdldF9kYXRhX2NvcHk6IHQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2RhdGFfY29weVwiXG4gIGV4dGVybmFsIHNldF9kYXRhOiB0IC0+IG9ial90IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfZGF0YVwiXG4gIGV4dGVybmFsIHVuc2V0X2RhdGE6IHQgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3Vuc2V0X2RhdGFcIlxuICBleHRlcm5hbCBjaGVja19kYXRhOiB0IC0+IGJvb2wgPSBcImNhbWxfZXBoZV9jaGVja19kYXRhXCJcbiAgZXh0ZXJuYWwgYmxpdF9kYXRhIDogdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9ibGl0X2RhdGFcIlxuXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTdGVwaGVuIERvbGFuLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTctMjAxOCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZS4gICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAhJ2EgdFxuXG5leHRlcm5hbCBtYWtlIDogJ2EgLT4gJ2EgdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsIGdldCA6ICdhIHQgLT4gJ2EgPSBcIiVhdG9taWNfbG9hZFwiXG5leHRlcm5hbCBleGNoYW5nZSA6ICdhIHQgLT4gJ2EgLT4gJ2EgPSBcIiVhdG9taWNfZXhjaGFuZ2VcIlxuZXh0ZXJuYWwgY29tcGFyZV9hbmRfc2V0IDogJ2EgdCAtPiAnYSAtPiAnYSAtPiBib29sID0gXCIlYXRvbWljX2Nhc1wiXG5leHRlcm5hbCBmZXRjaF9hbmRfYWRkIDogaW50IHQgLT4gaW50IC0+IGludCA9IFwiJWF0b21pY19mZXRjaF9hZGRcIlxuZXh0ZXJuYWwgaWdub3JlIDogJ2EgLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbmxldCBzZXQgciB4ID0gaWdub3JlIChleGNoYW5nZSByIHgpXG5sZXQgaW5jciByID0gaWdub3JlIChmZXRjaF9hbmRfYWRkIHIgMSlcbmxldCBkZWNyIHIgPSBpZ25vcmUgKGZldGNoX2FuZF9hZGQgciAoLTEpKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBJbnRlcm5hbHMgb2YgZm9yY2luZyBsYXp5IHZhbHVlcy4gKilcblxudHlwZSAnYSB0ID0gJ2EgbGF6eV90XG5cbmV4Y2VwdGlvbiBVbmRlZmluZWRcblxuKCogW3VwZGF0ZV90b19mb3JjaW5nIGJsa10gdHJpZXMgdG8gdXBkYXRlIGEgW2Jsa10gd2l0aCBbbGF6eV90YWddIHRvXG4gICBbZm9yY2luZ190YWddIHVzaW5nIGNvbXBhcmUtYW5kLXN3YXAgKENBUyksIHRha2luZyBjYXJlIHRvIGhhbmRsZSBjb25jdXJyZW50XG4gICBtYXJraW5nIG9mIHRoZSBoZWFkZXIgd29yZCBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLiBSZXR1cm5zIFswXSBpZiB0aGVcbiAgIENBUyBpcyBzdWNjZXNzZnVsLiBJZiB0aGUgQ0FTIGZhaWxzLCB0aGVuIHRoZSB0YWcgd2FzIG9ic2VydmVkIHRvIGJlXG4gICBzb21ldGhpbmcgb3RoZXIgdGhhbiBbbGF6eV90YWddIGR1ZSB0byBhIGNvbmN1cnJlbnQgbXV0YXRvci4gSW4gdGhpcyBjYXNlLFxuICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgWzFdLiAqKVxuZXh0ZXJuYWwgdXBkYXRlX3RvX2ZvcmNpbmcgOiBPYmoudCAtPiBpbnQgPVxuICBcImNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZ1wiIFtAQG5vYWxsb2NdXG5cbigqIFtyZXNldF90b19sYXp5IGJsa10gZXhwZWN0cyBbYmxrXSB0byBiZSBhIGxhenkgb2JqZWN0IHdpdGggW09iai5mb3JjaW5nX3RhZ11cbiAgIGFuZCB1cGRhdGVzIHRoZSB0YWcgdG8gW09iai5sYXp5X3RhZ10sIHRha2luZyBjYXJlIHRvIGhhbmRsZSBjb25jdXJyZW50XG4gICBtYXJraW5nIG9mIHRoaXMgb2JqZWN0J3MgaGVhZGVyIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuICopXG5leHRlcm5hbCByZXNldF90b19sYXp5IDogT2JqLnQgLT4gdW5pdCA9IFwiY2FtbF9sYXp5X3Jlc2V0X3RvX2xhenlcIiBbQEBub2FsbG9jXVxuXG4oKiBbdXBkYXRlX3RvX2ZvcndhcmQgYmxrXSBleHBlY3RzIFtibGtdIHRvIGJlIGEgbGF6eSBvYmplY3Qgd2l0aFxuICAgW09iai5mb3JjaW5nX3RhZ10gYW5kIHVwZGF0ZXMgdGhlIHRhZyB0byBbT2JqLmZvcndhcmRfdGFnXSwgdGFraW5nIGNhcmUgdG9cbiAgIGhhbmRsZSBjb25jdXJyZW50IG1hcmtpbmcgb2YgdGhpcyBvYmplY3QncyBoZWFkZXIgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC5cbiAqKVxuZXh0ZXJuYWwgdXBkYXRlX3RvX2ZvcndhcmQgOiBPYmoudCAtPiB1bml0ID1cbiAgXCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcndhcmRcIiBbQEBub2FsbG9jXVxuXG4oKiBBc3N1bWVzIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgZm9yY2luZyAqKVxubGV0IGRvX2ZvcmNlX2Jsb2NrIGJsayA9XG4gIGxldCBiID0gT2JqLnJlcHIgYmxrIGluXG4gIGxldCBjbG9zdXJlID0gKE9iai5vYmogKE9iai5maWVsZCBiIDApIDogdW5pdCAtPiAnYXJnKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgKCkpOyAoKiBSZWxlYXNlIHRoZSBjbG9zdXJlICopXG4gIHRyeVxuICAgIGxldCByZXN1bHQgPSBjbG9zdXJlICgpIGluXG4gICAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByIHJlc3VsdCk7XG4gICAgdXBkYXRlX3RvX2ZvcndhcmQgYjtcbiAgICByZXN1bHRcbiAgd2l0aCBlIC0+XG4gICAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByIChmdW4gKCkgLT4gcmFpc2UgZSkpO1xuICAgIHJlc2V0X3RvX2xhenkgYjtcbiAgICByYWlzZSBlXG5cbigqIEFzc3VtZXMgW2Jsa10gaXMgYSBibG9jayB3aXRoIHRhZyBmb3JjaW5nICopXG5sZXQgZG9fZm9yY2VfdmFsX2Jsb2NrIGJsayA9XG4gIGxldCBiID0gT2JqLnJlcHIgYmxrIGluXG4gIGxldCBjbG9zdXJlID0gKE9iai5vYmogKE9iai5maWVsZCBiIDApIDogdW5pdCAtPiAnYXJnKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgKCkpOyAoKiBSZWxlYXNlIHRoZSBjbG9zdXJlICopXG4gIGxldCByZXN1bHQgPSBjbG9zdXJlICgpIGluXG4gIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciByZXN1bHQpO1xuICB1cGRhdGVfdG9fZm9yd2FyZCBiO1xuICByZXN1bHRcblxuKCogQ2FsbGVkIGJ5IFtmb3JjZV9nZW5dICopXG5sZXQgZm9yY2VfZ2VuX2xhenlfYmxvY2sgfm9ubHlfdmFsIChibGsgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBXZSBleHBlY3QgdGhlIHRhZyB0byBiZSBbbGF6eV90YWddLCBidXQgbWF5IGJlIG90aGVyIHRhZ3MgZHVlIHRvXG4gICAgIGNvbmN1cnJlbnQgZm9yY2luZyBvZiBsYXp5IHZhbHVlcy4gKilcbiAgbWF0Y2ggdXBkYXRlX3RvX2ZvcmNpbmcgKE9iai5yZXByIGJsaykgd2l0aFxuICB8IDAgd2hlbiBvbmx5X3ZhbCAtPiBkb19mb3JjZV92YWxfYmxvY2sgYmxrXG4gIHwgMCAtPiBkb19mb3JjZV9ibG9jayBibGtcbiAgfCBfIC0+IHJhaXNlIFVuZGVmaW5lZFxuXG4oKiB1c2VkIGluIHRoZSAlbGF6eV9mb3JjZSBwcmltaXRpdmUgKilcbmxldCBmb3JjZV9sYXp5X2Jsb2NrIGJsayA9IGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbDpmYWxzZSBibGtcblxuKCogW2ZvcmNlX2dlbiB+b25seV92YWw6ZmFsc2VdIGlzIG5vdCB1c2VkLCBzaW5jZSBbTGF6eS5mb3JjZV0gaXNcbiAgIGRlY2xhcmVkIGFzIGEgcHJpbWl0aXZlIHdob3NlIGNvZGUgaW5saW5lcyB0aGUgdGFnIHRlc3RzIG9mIGl0c1xuICAgYXJndW1lbnQsIGV4Y2VwdCB3aGVuIGFmbCBpbnN0cnVtZW50YXRpb24gaXMgdHVybmVkIG9uLiAqKVxubGV0IGZvcmNlX2dlbiB+b25seV92YWwgKGx6diA6ICdhcmcgbGF6eV90KSA9XG4gICgqIFVzaW5nIFtTeXMub3BhcXVlX2lkZW50aXR5XSBwcmV2ZW50cyB0d28gcG90ZW50aWFsIHByb2JsZW1zOlxuICAgICAtIElmIHRoZSB2YWx1ZSBpcyBrbm93biB0byBoYXZlIEZvcndhcmRfdGFnLCB0aGVuIGl0IGNvdWxkIGhhdmUgYmVlblxuICAgICAgIHNob3J0Y3V0IGR1cmluZyBHQywgc28gdGhhdCBpbmZvcm1hdGlvbiBtdXN0IGJlIGZvcmdvdHRlbiAoc2VlIEdQUiM3MTNcbiAgICAgICBhbmQgaXNzdWUgIzczMDEpLiBUaGlzIGlzIG5vdCBhbiBpc3N1ZSBoZXJlIGF0IHRoZSBtb21lbnQgc2luY2VcbiAgICAgICBbT2JqLnRhZ10gaXMgbm90IHNpbXBsaWZpZWQgYnkgdGhlIGNvbXBpbGVyLCBhbmQgR1BSIzcxMyBhbHNvXG4gICAgICAgZW5zdXJlcyB0aGF0IG5vIHZhbHVlIHdpbGwgYmUga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZy5cbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gYmUgaW1tdXRhYmxlLCB0aGVuIGlmIHRoZSBjb21waWxlclxuICAgICAgIGNhbm5vdCBwcm92ZSB0aGF0IHRoZSBsYXN0IGJyYW5jaCBpcyBub3QgdGFrZW4gaXQgd2lsbCBpc3N1ZSBhXG4gICAgICAgd2FybmluZyA1OSAobW9kaWZpY2F0aW9uIG9mIGFuIGltbXV0YWJsZSB2YWx1ZSkgKilcbiAgbGV0IGx6diA9IFN5cy5vcGFxdWVfaWRlbnRpdHkgbHp2IGluXG4gIGxldCB4ID0gT2JqLnJlcHIgbHp2IGluXG4gICgqIFNUQVJUIG5vIHNhZmUgcG9pbnRzLiBJZiBhIEdDIG9jY3VycyBoZXJlLCB0aGVuIHRoZSBvYmplY3QgW3hdIG1heSBiZVxuICAgICBzaG9ydC1jaXJjdWl0ZWQsIGFuZCBnZXR0aW5nIHRoZSBmaXJzdCBmaWVsZCBvZiBbeF0gd291bGQgZ2V0IHVzIHRoZSB3cm9uZ1xuICAgICB2YWx1ZS4gTHVja2lseSwgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGluc2VydCBHQyBzYWZlIHBvaW50cyBhdCB0aGlzIHBsYWNlLFxuICAgICBzbyBpdCBpcyBvay4gKilcbiAgbGV0IHQgPSBPYmoudGFnIHggaW5cbiAgaWYgdCA9IE9iai5mb3J3YXJkX3RhZyB0aGVuXG4gICAgKE9iai5vYmogKE9iai5maWVsZCB4IDApIDogJ2FyZylcbiAgKCogRU5EIG5vIHNhZmUgcG9pbnRzICopXG4gIGVsc2UgaWYgdCA9IE9iai5mb3JjaW5nX3RhZyB0aGVuIHJhaXNlIFVuZGVmaW5lZFxuICBlbHNlIGlmIHQgPD4gT2JqLmxhenlfdGFnIHRoZW4gKE9iai5vYmogeCA6ICdhcmcpXG4gIGVsc2UgZm9yY2VfZ2VuX2xhenlfYmxvY2sgfm9ubHlfdmFsIGx6dlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW0xhenldOiBkZWZlcnJlZCBjb21wdXRhdGlvbnMgKilcblxuXG4oKlxuICAgV0FSTklORzogc29tZSBwdXJwbGUgbWFnaWMgaXMgZ29pbmcgb24gaGVyZS4gIERvIG5vdCB0YWtlIHRoaXMgZmlsZVxuICAgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcHJvZ3JhbSBpbiBPQ2FtbC5cbiopXG5cblxuKCogV2UgbWFrZSB1c2Ugb2YgdHdvIHNwZWNpYWwgdGFncyBwcm92aWRlZCBieSB0aGUgcnVudGltZTpcbiAgIFtsYXp5X3RhZ10gYW5kIFtmb3J3YXJkX3RhZ10uXG5cbiAgIEEgdmFsdWUgb2YgdHlwZSBbJ2EgTGF6eS50XSBjYW4gYmUgb25lIG9mIHRocmVlIHRoaW5nczpcbiAgIDEuIEEgYmxvY2sgb2Ygc2l6ZSAxIHdpdGggdGFnIFtsYXp5X3RhZ10uICBJdHMgZmllbGQgaXMgYSBjbG9zdXJlIG9mXG4gICAgICB0eXBlIFt1bml0IC0+ICdhXSB0aGF0IGNvbXB1dGVzIHRoZSB2YWx1ZS5cbiAgIDIuIEEgYmxvY2sgb2Ygc2l6ZSAxIHdpdGggdGFnIFtmb3J3YXJkX3RhZ10uICBJdHMgZmllbGQgaXMgdGhlIHZhbHVlXG4gICAgICBvZiB0eXBlIFsnYV0gdGhhdCB3YXMgY29tcHV0ZWQuXG4gICAzLiBBbnl0aGluZyBlbHNlIGV4Y2VwdCBhIGZsb2F0LiAgVGhpcyBoYXMgdHlwZSBbJ2FdIGFuZCBpcyB0aGUgdmFsdWVcbiAgICAgIHRoYXQgd2FzIGNvbXB1dGVkLlxuICAgRXhjZXB0aW9ucyBhcmUgc3RvcmVkIGluIGZvcm1hdCAoMSkuXG4gICBUaGUgR0Mgd2lsbCBtYWdpY2FsbHkgY2hhbmdlIHRoaW5ncyBmcm9tICgyKSB0byAoMykgYWNjb3JkaW5nIHRvIGl0c1xuICAgZmFuY3kuXG5cbiAgIElmIE9DYW1sIHdhcyBjb25maWd1cmVkIHdpdGggdGhlIC1mbGF0LWZsb2F0LWFycmF5IG9wdGlvbiAod2hpY2ggaXNcbiAgIGN1cnJlbnRseSB0aGUgZGVmYXVsdCksIHRoZSBmb2xsb3dpbmcgaXMgYWxzbyB0cnVlOlxuICAgV2UgY2Fubm90IHVzZSByZXByZXNlbnRhdGlvbiAoMykgZm9yIGEgW2Zsb2F0IExhenkudF0gYmVjYXVzZVxuICAgW2NhbWxfbWFrZV9hcnJheV0gYXNzdW1lcyB0aGF0IG9ubHkgYSBbZmxvYXRdIHZhbHVlIGNhbiBoYXZlIHRhZ1xuICAgW0RvdWJsZV90YWddLlxuXG4gICBXZSBoYXZlIHRvIHVzZSB0aGUgYnVpbHQtaW4gdHlwZSBjb25zdHJ1Y3RvciBbbGF6eV90XSB0b1xuICAgbGV0IHRoZSBjb21waWxlciBpbXBsZW1lbnQgdGhlIHNwZWNpYWwgdHlwaW5nIGFuZCBjb21waWxhdGlvblxuICAgcnVsZXMgZm9yIHRoZSBbbGF6eV0ga2V5d29yZC5cbiopXG5cbnR5cGUgJ2EgdCA9ICdhIENhbWxpbnRlcm5hbExhenkudFxuXG5leGNlcHRpb24gVW5kZWZpbmVkID0gQ2FtbGludGVybmFsTGF6eS5VbmRlZmluZWRcbmV4dGVybmFsIG1ha2VfZm9yd2FyZCA6ICdhIC0+ICdhIGxhenlfdCA9IFwiY2FtbF9sYXp5X21ha2VfZm9yd2FyZFwiXG5leHRlcm5hbCBmb3JjZSA6ICdhIHQgLT4gJ2EgPSBcIiVsYXp5X2ZvcmNlXCJcblxubGV0IGZvcmNlX3ZhbCBsID0gQ2FtbGludGVybmFsTGF6eS5mb3JjZV9nZW4gfm9ubHlfdmFsOnRydWUgbFxuXG5sZXQgZnJvbV9mdW4gKGYgOiB1bml0IC0+ICdhcmcpID1cbiAgbGV0IHggPSBPYmoubmV3X2Jsb2NrIE9iai5sYXp5X3RhZyAxIGluXG4gIE9iai5zZXRfZmllbGQgeCAwIChPYmoucmVwciBmKTtcbiAgKE9iai5vYmogeCA6ICdhcmcgdClcblxubGV0IGZyb21fdmFsICh2IDogJ2FyZykgPVxuICBsZXQgdCA9IE9iai50YWcgKE9iai5yZXByIHYpIGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgfHwgdCA9IE9iai5sYXp5X3RhZyB8fFxuICAgICB0ID0gT2JqLmZvcmNpbmdfdGFnIHx8IHQgPSBPYmouZG91YmxlX3RhZyB0aGVuIGJlZ2luXG4gICAgbWFrZV9mb3J3YXJkIHZcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICAoT2JqLm1hZ2ljIHYgOiAnYXJnIHQpXG4gIGVuZFxuXG5sZXQgaXNfdmFsIChsIDogJ2FyZyB0KSA9IE9iai50YWcgKE9iai5yZXByIGwpIDw+IE9iai5sYXp5X3RhZ1xuXG5sZXQgbWFwIGYgeCA9XG4gIGxhenkgKGYgKGZvcmNlIHgpKVxuXG5sZXQgbWFwX3ZhbCBmIHggPVxuICBpZiBpc192YWwgeFxuICB0aGVuIGZyb21fdmFsIChmIChmb3JjZSB4KSlcbiAgZWxzZSBsYXp5IChmIChmb3JjZSB4KSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTaW1vbiBDcnVhbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtTZXFdOiBmdW5jdGlvbmFsIGl0ZXJhdG9ycyAqKVxuXG50eXBlICsnYSBub2RlID1cbiAgfCBOaWxcbiAgfCBDb25zIG9mICdhICogJ2EgdFxuXG5hbmQgJ2EgdCA9IHVuaXQgLT4gJ2Egbm9kZVxuXG5sZXQgZW1wdHkgKCkgPSBOaWxcblxubGV0IHJldHVybiB4ICgpID0gQ29ucyAoeCwgZW1wdHkpXG5cbmxldCBjb25zIHggbmV4dCAoKSA9IENvbnMgKHgsIG5leHQpXG5cbmxldCByZWMgYXBwZW5kIHNlcTEgc2VxMiAoKSA9XG4gIG1hdGNoIHNlcTEoKSB3aXRoXG4gIHwgTmlsIC0+IHNlcTIoKVxuICB8IENvbnMgKHgsIG5leHQpIC0+IENvbnMgKHgsIGFwcGVuZCBuZXh0IHNlcTIpXG5cbmxldCByZWMgbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPiBDb25zIChmIHgsIG1hcCBmIG5leHQpXG5cbmxldCByZWMgZmlsdGVyX21hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBmaWx0ZXJfbWFwIGYgbmV4dCAoKVxuICAgICAgICB8IFNvbWUgeSAtPiBDb25zICh5LCBmaWx0ZXJfbWFwIGYgbmV4dClcblxubGV0IHJlYyBmaWx0ZXIgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICBpZiBmIHhcbiAgICAgIHRoZW4gQ29ucyAoeCwgZmlsdGVyIGYgbmV4dClcbiAgICAgIGVsc2UgZmlsdGVyIGYgbmV4dCAoKVxuXG5sZXQgcmVjIGNvbmNhdCBzZXEgKCkgPSBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICBhcHBlbmQgeCAoY29uY2F0IG5leHQpICgpXG5cbmxldCByZWMgZmxhdF9tYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgIGFwcGVuZCAoZiB4KSAoZmxhdF9tYXAgZiBuZXh0KSAoKVxuXG5sZXQgY29uY2F0X21hcCA9IGZsYXRfbWFwXG5cbmxldCByZWMgZm9sZF9sZWZ0IGYgYWNjIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gYWNjXG4gICAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgICBsZXQgYWNjID0gZiBhY2MgeCBpblxuICAgICAgICBmb2xkX2xlZnQgZiBhY2MgbmV4dFxuXG5sZXQgcmVjIGl0ZXIgZiBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICAgIHwgTmlsIC0+ICgpXG4gICAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgICBmIHg7XG4gICAgICAgIGl0ZXIgZiBuZXh0XG5cbmxldCByZWMgdW5mb2xkIGYgdSAoKSA9XG4gIG1hdGNoIGYgdSB3aXRoXG4gIHwgTm9uZSAtPiBOaWxcbiAgfCBTb21lICh4LCB1JykgLT4gQ29ucyAoeCwgdW5mb2xkIGYgdScpXG5cbmxldCBpc19lbXB0eSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKF8sIF8pIC0+XG4gICAgICBmYWxzZVxuXG5sZXQgdW5jb25zIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBTb21lICh4LCB4cylcbiAgfCBOaWwgLT5cbiAgICAgIE5vbmVcblxuXG5cbmxldCByZWMgbGVuZ3RoX2F1eCBhY2N1IHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoXywgeHMpIC0+XG4gICAgICBsZW5ndGhfYXV4IChhY2N1ICsgMSkgeHNcblxubGV0W0BpbmxpbmVdIGxlbmd0aCB4cyA9XG4gIGxlbmd0aF9hdXggMCB4c1xuXG5sZXQgcmVjIGl0ZXJpX2F1eCBmIGkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgICgpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBmIGkgeDtcbiAgICAgIGl0ZXJpX2F1eCBmIChpKzEpIHhzXG5cbmxldFtAaW5saW5lXSBpdGVyaSBmIHhzID1cbiAgaXRlcmlfYXV4IGYgMCB4c1xuXG5sZXQgcmVjIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSBpIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBsZXQgYWNjdSA9IGYgYWNjdSBpIHggaW5cbiAgICAgIGZvbGRfbGVmdGlfYXV4IGYgYWNjdSAoaSsxKSB4c1xuXG5sZXRbQGlubGluZV0gZm9sZF9sZWZ0aSBmIGFjY3UgeHMgPVxuICBmb2xkX2xlZnRpX2F1eCBmIGFjY3UgMCB4c1xuXG5sZXQgcmVjIGZvcl9hbGwgcCB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgcCB4ICYmIGZvcl9hbGwgcCB4c1xuXG5sZXQgcmVjIGV4aXN0cyBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgcCB4IHx8IGV4aXN0cyBwIHhzXG5cbmxldCByZWMgZmluZCBwIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kIHAgeHNcblxubGV0IHJlYyBmaW5kX21hcCBmIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgZmluZF9tYXAgZiB4c1xuICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+XG4gICAgICAgICAgcmVzdWx0XG5cbigqIFtpdGVyMl0sIFtmb2xkX2xlZnQyXSwgW2Zvcl9hbGwyXSwgW2V4aXN0czJdLCBbbWFwMl0sIFt6aXBdIHdvcmsgYWxzbyBpblxuICAgdGhlIGNhc2Ugd2hlcmUgdGhlIHR3byBzZXF1ZW5jZXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4gVGhleSBzdG9wIGFzIHNvb25cbiAgIGFzIG9uZSBzZXF1ZW5jZSBpcyBleGhhdXN0ZWQuIFRoZWlyIGJlaGF2aW9yIGlzIHNsaWdodGx5IGFzeW1tZXRyaWM6IHdoZW5cbiAgIFt4c10gaXMgZW1wdHksIHRoZXkgZG8gbm90IGZvcmNlIFt5c107IGhvd2V2ZXIsIHdoZW4gW3lzXSBpcyBlbXB0eSwgW3hzXSBpc1xuICAgZm9yY2VkLCBldmVuIHRob3VnaCB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBhcHBsaWNhdGlvbiBbeHMoKV0gdHVybnMgb3V0XG4gICB0byBiZSB1c2VsZXNzLiAqKVxuXG5sZXQgcmVjIGl0ZXIyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgICgpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKClcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgZiB4IHk7XG4gICAgICAgICAgaXRlcjIgZiB4cyB5c1xuXG5sZXQgcmVjIGZvbGRfbGVmdDIgZiBhY2N1IHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBhY2N1XG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgYWNjdVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBsZXQgYWNjdSA9IGYgYWNjdSB4IHkgaW5cbiAgICAgICAgICBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5c1xuXG5sZXQgcmVjIGZvcl9hbGwyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5ICYmIGZvcl9hbGwyIGYgeHMgeXNcblxubGV0IHJlYyBleGlzdHMyIGYgeHMgeXMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgZiB4IHkgfHwgZXhpc3RzMiBmIHhzIHlzXG5cbmxldCByZWMgZXF1YWwgZXEgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBlcSB4IHkgJiYgZXF1YWwgZXEgeHMgeXNcbiAgfCBOaWwsIENvbnMgKF8sIF8pXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgZmFsc2VcblxubGV0IHJlYyBjb21wYXJlIGNtcCB4cyB5cyA9XG4gIG1hdGNoIHhzKCksIHlzKCkgd2l0aFxuICB8IE5pbCwgTmlsIC0+XG4gICAgICAwXG4gIHwgQ29ucyAoeCwgeHMpLCBDb25zICh5LCB5cykgLT5cbiAgICAgIGxldCBjID0gY21wIHggeSBpblxuICAgICAgaWYgYyA8PiAwIHRoZW4gYyBlbHNlIGNvbXBhcmUgY21wIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKSAtPlxuICAgICAgLTFcbiAgfCBDb25zIChfLCBfKSwgTmlsIC0+XG4gICAgICArMVxuXG5cblxuKCogW2luaXRfYXV4IGYgaSBqXSBpcyB0aGUgc2VxdWVuY2UgW2YgaSwgLi4uLCBmIChqLTEpXS4gKilcblxubGV0IHJlYyBpbml0X2F1eCBmIGkgaiAoKSA9XG4gIGlmIGkgPCBqIHRoZW4gYmVnaW5cbiAgICBDb25zIChmIGksIGluaXRfYXV4IGYgKGkgKyAxKSBqKVxuICBlbmRcbiAgZWxzZVxuICAgIE5pbFxuXG5sZXQgaW5pdCBuIGYgPVxuICBpZiBuIDwgMCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTZXEuaW5pdFwiXG4gIGVsc2VcbiAgICBpbml0X2F1eCBmIDAgblxuXG5sZXQgcmVjIHJlcGVhdCB4ICgpID1cbiAgQ29ucyAoeCwgcmVwZWF0IHgpXG5cbmxldCByZWMgZm9yZXZlciBmICgpID1cbiAgQ29ucyAoZigpLCBmb3JldmVyIGYpXG5cbigqIFRoaXMgcHJlbGltaW5hcnkgZGVmaW5pdGlvbiBvZiBbY3ljbGVdIHJlcXVpcmVzIHRoZSBzZXF1ZW5jZSBbeHNdXG4gICB0byBiZSBub25lbXB0eS4gQXBwbHlpbmcgaXQgdG8gYW4gZW1wdHkgc2VxdWVuY2Ugd291bGQgcHJvZHVjZSBhXG4gICBzZXF1ZW5jZSB0aGF0IGRpdmVyZ2VzIHdoZW4gaXQgaXMgZm9yY2VkLiAqKVxuXG5sZXQgcmVjIGN5Y2xlX25vbmVtcHR5IHhzICgpID1cbiAgYXBwZW5kIHhzIChjeWNsZV9ub25lbXB0eSB4cykgKClcblxuKCogW2N5Y2xlIHhzXSBjaGVja3Mgd2hldGhlciBbeHNdIGlzIGVtcHR5IGFuZCwgaWYgc28sIHJldHVybnMgYW4gZW1wdHlcbiAgIHNlcXVlbmNlLiBPdGhlcndpc2UsIFtjeWNsZSB4c10gcHJvZHVjZXMgb25lIGNvcHkgb2YgW3hzXSBmb2xsb3dlZFxuICAgd2l0aCB0aGUgaW5maW5pdGUgc2VxdWVuY2UgW2N5Y2xlX25vbmVtcHR5IHhzXS4gVGh1cywgdGhlIG5vbmVtcHRpbmVzc1xuICAgY2hlY2sgaXMgcGVyZm9ybWVkIGp1c3Qgb25jZS4gKilcblxubGV0IGN5Y2xlIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cycpIC0+XG4gICAgICBDb25zICh4LCBhcHBlbmQgeHMnIChjeWNsZV9ub25lbXB0eSB4cykpXG5cbigqIFtpdGVyYXRlMSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbZiB4LCBmIChmIHgpLCAuLi5dLlxuICAgSXQgaXMgZXF1aXZhbGVudCB0byBbdGFpbCAoaXRlcmF0ZSBmIHgpXS5cbiAgIFtpdGVyYXRlMV0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtpdGVyYXRlXS4gKilcblxubGV0IHJlYyBpdGVyYXRlMSBmIHggKCkgPVxuICBsZXQgeSA9IGYgeCBpblxuICBDb25zICh5LCBpdGVyYXRlMSBmIHkpXG5cbigqIFtpdGVyYXRlIGYgeF0gaXMgdGhlIHNlcXVlbmNlIFt4LCBmIHgsIC4uLl0uICopXG5cbigqIFRoZSByZWFzb24gd2h5IHdlIGdpdmUgdGhpcyBzbGlnaHRseSBpbmRpcmVjdCBkZWZpbml0aW9uIG9mIFtpdGVyYXRlXSxcbiAgIGFzIG9wcG9zZWQgdG8gdGhlIG1vcmUgbmFpdmUgZGVmaW5pdGlvbiB0aGF0IG1heSBjb21lIHRvIG1pbmQsIGlzIHRoYXRcbiAgIHdlIGFyZSBjYXJlZnVsIHRvIGF2b2lkIGV2YWx1YXRpbmcgW2YgeF0gdW50aWwgdGhpcyBmdW5jdGlvbiBjYWxsIGlzXG4gICBhY3R1YWxseSBuZWNlc3NhcnkuIFRoZSBuYWl2ZSBkZWZpbml0aW9uIChub3Qgc2hvd24gaGVyZSkgY29tcHV0ZXMgdGhlXG4gICBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIHNlcXVlbmNlLCBbZiB4XSwgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgaXNcbiAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gKilcblxubGV0IGl0ZXJhdGUgZiB4ID1cbiAgY29ucyB4IChpdGVyYXRlMSBmIHgpXG5cblxuXG5sZXQgcmVjIG1hcGlfYXV4IGYgaSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChmIGkgeCwgbWFwaV9hdXggZiAoaSsxKSB4cylcblxubGV0W0BpbmxpbmVdIG1hcGkgZiB4cyA9XG4gIG1hcGlfYXV4IGYgMCB4c1xuXG4oKiBbdGFpbF9zY2FuIGYgcyB4c10gaXMgZXF1aXZhbGVudCB0byBbdGFpbCAoc2NhbiBmIHMgeHMpXS5cbiAgIFt0YWlsX3NjYW5dIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbc2Nhbl0uICopXG5cbigqIFRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbc2Nhbl0gaXMgbWVhbnQgdG8gYXZvaWQgY29tcHV0aW5nXG4gICBlbGVtZW50cyB0b28gZWFybHk7IHNlZSB0aGUgYWJvdmUgY29tbWVudCBhYm91dCBbaXRlcmF0ZTFdIGFuZCBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgdGFpbF9zY2FuIGYgcyB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBsZXQgcyA9IGYgcyB4IGluXG4gICAgICBDb25zIChzLCB0YWlsX3NjYW4gZiBzIHhzKVxuXG5sZXQgc2NhbiBmIHMgeHMgPVxuICBjb25zIHMgKHRhaWxfc2NhbiBmIHMgeHMpXG5cbigqIFt0YWtlXSBpcyBkZWZpbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCBbdGFrZSAwIHhzXSByZXR1cm5zIFtlbXB0eV1cbiAgIGltbWVkaWF0ZWx5LCB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4gKilcblxubGV0IHJlYyB0YWtlX2F1eCBuIHhzID1cbiAgaWYgbiA9IDAgdGhlblxuICAgIGVtcHR5XG4gIGVsc2VcbiAgICBmdW4gKCkgLT5cbiAgICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgQ29ucyAoeCwgdGFrZV9hdXggKG4tMSkgeHMpXG5cbmxldCB0YWtlIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLnRha2VcIjtcbiAgdGFrZV9hdXggbiB4c1xuXG4oKiBbZm9yY2VfZHJvcCBuIHhzXSBpcyBlcXVpdmFsZW50IHRvIFtkcm9wIG4geHMgKCldLlxuICAgW2ZvcmNlX2Ryb3AgbiB4c10gcmVxdWlyZXMgW24gPiAwXS5cbiAgIFtmb3JjZV9kcm9wXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW2Ryb3BdLiAqKVxuXG5sZXQgcmVjIGZvcmNlX2Ryb3AgbiB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoXywgeHMpIC0+XG4gICAgICBsZXQgbiA9IG4gLSAxIGluXG4gICAgICBpZiBuID0gMCB0aGVuXG4gICAgICAgIHhzKClcbiAgICAgIGVsc2VcbiAgICAgICAgZm9yY2VfZHJvcCBuIHhzXG5cbigqIFtkcm9wXSBpcyBkZWZpbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCBbZHJvcCAwIHhzXSByZXR1cm5zIFt4c10gaW1tZWRpYXRlbHksXG4gICB3aXRob3V0IGFsbG9jYXRpbmcgYW55IG1lbW9yeS4gKilcblxubGV0IGRyb3AgbiB4cyA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJTZXEuZHJvcFwiXG4gIGVsc2UgaWYgbiA9IDAgdGhlblxuICAgIHhzXG4gIGVsc2VcbiAgICBmdW4gKCkgLT5cbiAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG5sZXQgcmVjIHRha2Vfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBpZiBwIHggdGhlbiBDb25zICh4LCB0YWtlX3doaWxlIHAgeHMpIGVsc2UgTmlsXG5cbmxldCByZWMgZHJvcF93aGlsZSBwIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgYXMgbm9kZSAtPlxuICAgICAgaWYgcCB4IHRoZW4gZHJvcF93aGlsZSBwIHhzICgpIGVsc2Ugbm9kZVxuXG5sZXQgcmVjIGdyb3VwIGVxIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIENvbnMgKGNvbnMgeCAodGFrZV93aGlsZSAoZXEgeCkgeHMpLCBncm91cCBlcSAoZHJvcF93aGlsZSAoZXEgeCkgeHMpKVxuXG5leGNlcHRpb24gRm9yY2VkX3R3aWNlXG5cbm1vZHVsZSBTdXNwZW5zaW9uID0gc3RydWN0XG5cbiAgdHlwZSAnYSBzdXNwZW5zaW9uID1cbiAgICB1bml0IC0+ICdhXG5cbiAgKCogQ29udmVyc2lvbnMuICopXG5cbiAgbGV0IHRvX2xhenkgOiAnYSBzdXNwZW5zaW9uIC0+ICdhIExhenkudCA9XG4gICAgTGF6eS5mcm9tX2Z1blxuICAgICgqIGZ1biBzIC0+IGxhenkgKHMoKSkgKilcblxuICBsZXQgZnJvbV9sYXp5IChzIDogJ2EgTGF6eS50KSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZ1biAoKSAtPiBMYXp5LmZvcmNlIHNcblxuICAoKiBbbWVtb2l6ZV0gdHVybnMgYW4gYXJiaXRyYXJ5IHN1c3BlbnNpb24gaW50byBhIHBlcnNpc3RlbnQgc3VzcGVuc2lvbi4gKilcblxuICBsZXQgbWVtb2l6ZSAocyA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgZnJvbV9sYXp5ICh0b19sYXp5IHMpXG5cbiAgKCogW2ZhaWx1cmVdIGlzIGEgc3VzcGVuc2lvbiB0aGF0IGZhaWxzIHdoZW4gZm9yY2VkLiAqKVxuXG4gIGxldCBmYWlsdXJlIDogXyBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEEgc3VzcGVuc2lvbiBjcmVhdGVkIGJ5IFtvbmNlXSBoYXMgYmVlbiBmb3JjZWQgdHdpY2UuICopXG4gICAgICByYWlzZSBGb3JjZWRfdHdpY2VcblxuICAoKiBJZiBbZl0gaXMgYSBzdXNwZW5zaW9uLCB0aGVuIFtvbmNlIGZdIGlzIGEgc3VzcGVuc2lvbiB0aGF0IGNhbiBiZSBmb3JjZWRcbiAgICAgYXQgbW9zdCBvbmNlLiBJZiBpdCBpcyBmb3JjZWQgbW9yZSB0aGFuIG9uY2UsIHRoZW4gW0ZvcmNlZF90d2ljZV0gaXNcbiAgICAgcmFpc2VkLiAqKVxuXG4gIGxldCBvbmNlIChmIDogJ2Egc3VzcGVuc2lvbikgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBsZXQgYWN0aW9uID0gQXRvbWljLm1ha2UgZiBpblxuICAgIGZ1biAoKSAtPlxuICAgICAgKCogR2V0IHRoZSBmdW5jdGlvbiBjdXJyZW50bHkgc3RvcmVkIGluIFthY3Rpb25dLCBhbmQgd3JpdGUgdGhlXG4gICAgICAgICBmdW5jdGlvbiBbZmFpbHVyZV0gaW4gaXRzIHBsYWNlLCBzbyB0aGUgbmV4dCBhY2Nlc3Mgd2lsbCByZXN1bHRcbiAgICAgICAgIGluIGEgY2FsbCB0byBbZmFpbHVyZSgpXS4gKilcbiAgICAgIGxldCBmID0gQXRvbWljLmV4Y2hhbmdlIGFjdGlvbiBmYWlsdXJlIGluXG4gICAgICBmKClcblxuZW5kICgqIFN1c3BlbnNpb24gKilcblxubGV0IHJlYyBtZW1vaXplIHhzID1cbiAgU3VzcGVuc2lvbi5tZW1vaXplIChmdW4gKCkgLT5cbiAgICBtYXRjaCB4cygpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBDb25zICh4LCBtZW1vaXplIHhzKVxuICApXG5cbmxldCByZWMgb25jZSB4cyA9XG4gIFN1c3BlbnNpb24ub25jZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgb25jZSB4cylcbiAgKVxuXG5cbmxldCByZWMgemlwIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgQ29ucyAoKHgsIHkpLCB6aXAgeHMgeXMpXG5cbmxldCByZWMgbWFwMiBmIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIHlzKCkgd2l0aFxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICBOaWxcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgQ29ucyAoZiB4IHksIG1hcDIgZiB4cyB5cylcblxubGV0IHJlYyBpbnRlcmxlYXZlIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB5cygpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zICh4LCBpbnRlcmxlYXZlIHlzIHhzKVxuXG4oKiBbc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgW3NvcnRlZF9tZXJnZSBjbXAgKGNvbnMgeCB4cykgeXNdLlxuXG4gICBbc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgW3NvcnRlZF9tZXJnZSBjbXAgeHMgKGNvbnMgeSB5cyldLlxuXG4gICBbc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIChjb25zIHkgeXMpXS5cblxuICAgVGhlc2UgdGhyZWUgZnVuY3Rpb25zIGFyZSB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyBpbiB0aGUgZGVmaW5pdGlvblxuICAgb2YgW3NvcnRlZF9tZXJnZV0uICopXG5cbmxldCByZWMgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMgKCkgPVxuICBtYXRjaCB5cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHgsIHhzKVxuICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxciBjbXAgeHMgeSB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgQ29ucyAoeSwgeXMpXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXNcblxuYW5kIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5cyA9XG4gIGlmIGNtcCB4IHkgPD0gMCB0aGVuXG4gICAgQ29ucyAoeCwgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMpXG4gIGVsc2VcbiAgICBDb25zICh5LCBzb3J0ZWRfbWVyZ2UxbCBjbXAgeCB4cyB5cylcblxubGV0IHNvcnRlZF9tZXJnZSBjbXAgeHMgeXMgKCkgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgICB8IE5pbCwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgTmlsLCBjXG4gICAgfCBjLCBOaWwgLT5cbiAgICAgICAgY1xuICAgIHwgQ29ucyAoeCwgeHMpLCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cblxubGV0IHJlYyBtYXBfZnN0IHh5cyAoKSA9XG4gIG1hdGNoIHh5cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKCh4LCBfKSwgeHlzKSAtPlxuICAgICAgQ29ucyAoeCwgbWFwX2ZzdCB4eXMpXG5cbmxldCByZWMgbWFwX3NuZCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoXywgeSksIHh5cykgLT5cbiAgICAgIENvbnMgKHksIG1hcF9zbmQgeHlzKVxuXG5sZXQgdW56aXAgeHlzID1cbiAgbWFwX2ZzdCB4eXMsIG1hcF9zbmQgeHlzXG5cbmxldCBzcGxpdCA9XG4gIHVuemlwXG5cbigqIFtmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4c10gaXMgZXF1aXZhbGVudCB0b1xuICAgW2ZpbHRlcl9tYXAgRWl0aGVyLmZpbmRfbGVmdCAobWFwIGYgeHMpXS4gKilcblxubGV0IHJlYyBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBFaXRoZXIuTGVmdCB5IC0+XG4gICAgICAgICAgQ29ucyAoeSwgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMpXG4gICAgICB8IEVpdGhlci5SaWdodCBfIC0+XG4gICAgICAgICAgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKClcblxubGV0IHJlYyBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4cyAoKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgeiAtPlxuICAgICAgICAgIENvbnMgKHosIGZpbHRlcl9tYXBfZmluZF9yaWdodF9tYXAgZiB4cylcblxubGV0IHBhcnRpdGlvbl9tYXAgZiB4cyA9XG4gIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzLFxuICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHNcblxubGV0IHBhcnRpdGlvbiBwIHhzID1cbiAgZmlsdGVyIHAgeHMsIGZpbHRlciAoZnVuIHggLT4gbm90IChwIHgpKSB4c1xuXG4oKiBJZiBbeHNzXSBpcyBhIG1hdHJpeCAoYSBzZXF1ZW5jZSBvZiByb3dzKSwgdGhlbiBbcGVlbCB4c3NdIGlzIGEgcGFpciBvZlxuICAgdGhlIGZpcnN0IGNvbHVtbiAoYSBzZXF1ZW5jZSBvZiBlbGVtZW50cykgYW5kIG9mIHRoZSByZW1haW5kZXIgb2YgdGhlXG4gICBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygc2hvcnRlciByb3dzKS4gVGhlc2UgdHdvIHNlcXVlbmNlcyBoYXZlIHRoZSBzYW1lXG4gICBsZW5ndGguIFRoZSByb3dzIG9mIHRoZSBtYXRyaXggW3hzc10gYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIHRoZSBzYW1lXG4gICBsZW5ndGguIEFuIGVtcHR5IHJvdyBpcyBpZ25vcmVkLiAqKVxuXG4oKiBCZWNhdXNlIFtwZWVsXSB1c2VzIFt1bnppcF0sIGl0cyBhcmd1bWVudCBtdXN0IGJlIHBlcnNpc3RlbnQuIFRoZSBzYW1lXG4gICByZW1hcmsgYXBwbGllcyB0byBbdHJhbnNwb3NlXSwgW2RpYWdvbmFsc10sIFtwcm9kdWN0XSwgZXRjLiAqKVxuXG5sZXQgcGVlbCB4c3MgPVxuICB1bnppcCAoZmlsdGVyX21hcCB1bmNvbnMgeHNzKVxuXG5sZXQgcmVjIHRyYW5zcG9zZSB4c3MgKCkgPVxuICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCB4c3MgaW5cbiAgaWYgaXNfZW1wdHkgaGVhZHMgdGhlbiBiZWdpblxuICAgIGFzc2VydCAoaXNfZW1wdHkgdGFpbHMpO1xuICAgIE5pbFxuICBlbmRcbiAgZWxzZVxuICAgIENvbnMgKGhlYWRzLCB0cmFuc3Bvc2UgdGFpbHMpXG5cbigqIFRoZSBpbnRlcm5hbCBmdW5jdGlvbiBbZGlhZ29uYWxzXSB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCwgW3JlbWFpbmRlcnNdLFxuICAgd2hpY2ggY29udGFpbnMgdGhlIHJlbWFpbmRlcnMgb2YgdGhlIHJvd3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlblxuICAgZGlzY292ZXJlZC4gKilcblxubGV0IHJlYyBkaWFnb25hbHMgcmVtYWluZGVycyB4c3MgKCkgPVxuICBtYXRjaCB4c3MoKSB3aXRoXG4gIHwgQ29ucyAoeHMsIHhzcykgLT5cbiAgICAgIGJlZ2luIG1hdGNoIHhzKCkgd2l0aFxuICAgICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgICAoKiBXZSBkaXNjb3ZlciBhIG5ldyBub25lbXB0eSByb3cgW3ggOjogeHNdLiBUaHVzLCB0aGUgbmV4dCBkaWFnb25hbFxuICAgICAgICAgICAgIGlzIFt4IDo6IGhlYWRzXTogdGhpcyBkaWFnb25hbCBiZWdpbnMgd2l0aCBbeF0gYW5kIGNvbnRpbnVlcyB3aXRoXG4gICAgICAgICAgICAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgZXZlcnkgcm93IGluIFtyZW1haW5kZXJzXS4gSW4gdGhlIHJlY3Vyc2l2ZVxuICAgICAgICAgICAgIGNhbGwsIHRoZSBhcmd1bWVudCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGggW3hzIDo6XG4gICAgICAgICAgICAgdGFpbHNdLCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgb25lIG1vcmUgcmVtYWluaW5nIHJvdywgW3hzXSxcbiAgICAgICAgICAgICBhbmQgdGhhdCB3ZSBrZWVwIHRoZSB0YWlscyBvZiB0aGUgcHJlLWV4aXN0aW5nIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgICAgIGxldCBoZWFkcywgdGFpbHMgPSBwZWVsIHJlbWFpbmRlcnMgaW5cbiAgICAgICAgICBDb25zIChjb25zIHggaGVhZHMsIGRpYWdvbmFscyAoY29ucyB4cyB0YWlscykgeHNzKVxuICAgICAgfCBOaWwgLT5cbiAgICAgICAgICAoKiBXZSBkaXNjb3ZlciBhIG5ldyBlbXB0eSByb3cuIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBkaWFnb25hbCBpc1xuICAgICAgICAgICAgIGp1c3QgW2hlYWRzXSwgYW5kIFtyZW1haW5kZXJzXSBpcyBpbnN0YW50aWF0ZWQgd2l0aCBqdXN0IFt0YWlsc10sXG4gICAgICAgICAgICAgYXMgd2UgZG8gbm90IGhhdmUgb25lIG1vcmUgcmVtYWluaW5nIHJvdy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoaGVhZHMsIGRpYWdvbmFscyB0YWlscyB4c3MpXG4gICAgICBlbmRcbiAgfCBOaWwgLT5cbiAgICAgICgqIFRoZXJlIGFyZSBubyBtb3JlIHJvd3MgdG8gYmUgZGlzY292ZXJlZC4gVGhlcmUgcmVtYWlucyB0byBleGhhdXN0XG4gICAgICAgICB0aGUgcmVtYWluaW5nIHJvd3MuICopXG4gICAgICB0cmFuc3Bvc2UgcmVtYWluZGVycyAoKVxuXG4oKiBJZiBbeHNzXSBpcyBhIG1hdHJpeCAoYSBzZXF1ZW5jZSBvZiByb3dzKSwgdGhlbiBbZGlhZ29uYWxzIHhzc10gaXNcbiAgIHRoZSBzZXF1ZW5jZSBvZiBpdHMgZGlhZ29uYWxzLlxuXG4gICBUaGUgZmlyc3QgZGlhZ29uYWwgY29udGFpbnMganVzdCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGVcbiAgIGZpcnN0IHJvdy4gVGhlIHNlY29uZCBkaWFnb25hbCBjb250YWlucyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGVcbiAgIHNlY29uZCByb3cgYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBvZiB0aGUgZmlyc3Qgcm93OyBhbmQgc28gb24uXG4gICBUaGlzIGtpbmQgb2YgZGlhZ29uYWwgaXMgaW4gZmFjdCBzb21ldGltZXMga25vd24gYXMgYW4gYW50aWRpYWdvbmFsLlxuXG4gICAtIEV2ZXJ5IGRpYWdvbmFsIGlzIGEgZmluaXRlIHNlcXVlbmNlLlxuICAgLSBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG4gICAtIFRoZSBtYXRyaXggW3hzc10gaXMgbm90IHJlcXVpcmVkIHRvIGJlIGZpbml0ZSAoaW4gZWl0aGVyIGRpcmVjdGlvbikuXG4gICAtIFRoZSBtYXRyaXggW3hzc10gbXVzdCBiZSBwZXJzaXN0ZW50LiAqKVxuXG5sZXQgZGlhZ29uYWxzIHhzcyA9XG4gIGRpYWdvbmFscyBlbXB0eSB4c3NcblxubGV0IG1hcF9wcm9kdWN0IGYgeHMgeXMgPVxuICBjb25jYXQgKGRpYWdvbmFscyAoXG4gICAgbWFwIChmdW4geCAtPlxuICAgICAgbWFwIChmdW4geSAtPlxuICAgICAgICBmIHggeVxuICAgICAgKSB5c1xuICAgICkgeHNcbiAgKSlcblxubGV0IHByb2R1Y3QgeHMgeXMgPVxuICBtYXBfcHJvZHVjdCAoZnVuIHggeSAtPiAoeCwgeSkpIHhzIHlzXG5cbmxldCBvZl9kaXNwZW5zZXIgaXQgPVxuICBsZXQgcmVjIGMgKCkgPVxuICAgIG1hdGNoIGl0KCkgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBOaWxcbiAgICB8IFNvbWUgeCAtPlxuICAgICAgICBDb25zICh4LCBjKVxuICBpblxuICBjXG5cbmxldCB0b19kaXNwZW5zZXIgeHMgPVxuICBsZXQgcyA9IHJlZiB4cyBpblxuICBmdW4gKCkgLT5cbiAgICBtYXRjaCAoIXMpKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5vbmVcbiAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICBzIDo9IHhzO1xuICAgICAgICBTb21lIHhcblxuXG5cbmxldCByZWMgaW50cyBpICgpID1cbiAgQ29ucyAoaSwgaW50cyAoaSArIDEpKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPSBOb25lIHwgU29tZSBvZiAnYVxuXG5sZXQgbm9uZSA9IE5vbmVcbmxldCBzb21lIHYgPSBTb21lIHZcbmxldCB2YWx1ZSBvIH5kZWZhdWx0ID0gbWF0Y2ggbyB3aXRoIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBkZWZhdWx0XG5sZXQgZ2V0ID0gZnVuY3Rpb24gU29tZSB2IC0+IHYgfCBOb25lIC0+IGludmFsaWRfYXJnIFwib3B0aW9uIGlzIE5vbmVcIlxubGV0IGJpbmQgbyBmID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBmIHZcbmxldCBqb2luID0gZnVuY3Rpb24gU29tZSBvIC0+IG8gfCBOb25lIC0+IE5vbmVcbmxldCBtYXAgZiBvID0gbWF0Y2ggbyB3aXRoIE5vbmUgLT4gTm9uZSB8IFNvbWUgdiAtPiBTb21lIChmIHYpXG5sZXQgZm9sZCB+bm9uZSB+c29tZSA9IGZ1bmN0aW9uIFNvbWUgdiAtPiBzb21lIHYgfCBOb25lIC0+IG5vbmVcbmxldCBpdGVyIGYgPSBmdW5jdGlvbiBTb21lIHYgLT4gZiB2IHwgTm9uZSAtPiAoKVxubGV0IGlzX25vbmUgPSBmdW5jdGlvbiBOb25lIC0+IHRydWUgfCBTb21lIF8gLT4gZmFsc2VcbmxldCBpc19zb21lID0gZnVuY3Rpb24gTm9uZSAtPiBmYWxzZSB8IFNvbWUgXyAtPiB0cnVlXG5cbmxldCBlcXVhbCBlcSBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gZXEgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiB0cnVlXG58IF8gLT4gZmFsc2VcblxubGV0IGNvbXBhcmUgY21wIG8wIG8xID0gbWF0Y2ggbzAsIG8xIHdpdGhcbnwgU29tZSB2MCwgU29tZSB2MSAtPiBjbXAgdjAgdjFcbnwgTm9uZSwgTm9uZSAtPiAwXG58IE5vbmUsIFNvbWUgXyAtPiAtMVxufCBTb21lIF8sIE5vbmUgLT4gMVxuXG5sZXQgdG9fcmVzdWx0IH5ub25lID0gZnVuY3Rpb24gTm9uZSAtPiBFcnJvciBub25lIHwgU29tZSB2IC0+IE9rIHZcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gTm9uZSAtPiBbXSB8IFNvbWUgdiAtPiBbdl1cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBOb25lIC0+IFNlcS5lbXB0eSB8IFNvbWUgdiAtPiBTZXEucmV0dXJuIHZcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSkgcmVzdWx0ID0gT2sgb2YgJ2EgfCBFcnJvciBvZiAnZVxuXG5sZXQgb2sgdiA9IE9rIHZcbmxldCBlcnJvciBlID0gRXJyb3IgZVxubGV0IHZhbHVlIHIgfmRlZmF1bHQgPSBtYXRjaCByIHdpdGggT2sgdiAtPiB2IHwgRXJyb3IgXyAtPiBkZWZhdWx0XG5sZXQgZ2V0X29rID0gZnVuY3Rpb24gT2sgdiAtPiB2IHwgRXJyb3IgXyAtPiBpbnZhbGlkX2FyZyBcInJlc3VsdCBpcyBFcnJvciBfXCJcbmxldCBnZXRfZXJyb3IgPSBmdW5jdGlvbiBFcnJvciBlIC0+IGUgfCBPayBfIC0+IGludmFsaWRfYXJnIFwicmVzdWx0IGlzIE9rIF9cIlxubGV0IGJpbmQgciBmID0gbWF0Y2ggciB3aXRoIE9rIHYgLT4gZiB2IHwgRXJyb3IgXyBhcyBlIC0+IGVcbmxldCBqb2luID0gZnVuY3Rpb24gT2sgciAtPiByIHwgRXJyb3IgXyBhcyBlIC0+IGVcbmxldCBtYXAgZiA9IGZ1bmN0aW9uIE9rIHYgLT4gT2sgKGYgdikgfCBFcnJvciBfIGFzIGUgLT4gZVxubGV0IG1hcF9lcnJvciBmID0gZnVuY3Rpb24gRXJyb3IgZSAtPiBFcnJvciAoZiBlKSB8IE9rIF8gYXMgdiAtPiB2XG5sZXQgZm9sZCB+b2sgfmVycm9yID0gZnVuY3Rpb24gT2sgdiAtPiBvayB2IHwgRXJyb3IgZSAtPiBlcnJvciBlXG5sZXQgaXRlciBmID0gZnVuY3Rpb24gT2sgdiAtPiBmIHYgfCBFcnJvciBfIC0+ICgpXG5sZXQgaXRlcl9lcnJvciBmID0gZnVuY3Rpb24gRXJyb3IgZSAtPiBmIGUgfCBPayBfIC0+ICgpXG5sZXQgaXNfb2sgPSBmdW5jdGlvbiBPayBfIC0+IHRydWUgfCBFcnJvciBfIC0+IGZhbHNlXG5sZXQgaXNfZXJyb3IgPSBmdW5jdGlvbiBFcnJvciBfIC0+IHRydWUgfCBPayBfIC0+IGZhbHNlXG5cbmxldCBlcXVhbCB+b2sgfmVycm9yIHIwIHIxID0gbWF0Y2ggcjAsIHIxIHdpdGhcbnwgT2sgdjAsIE9rIHYxIC0+IG9rIHYwIHYxXG58IEVycm9yIGUwLCBFcnJvciBlMSAtPiBlcnJvciBlMCBlMVxufCBfLCBfIC0+IGZhbHNlXG5cbmxldCBjb21wYXJlIH5vayB+ZXJyb3IgcjAgcjEgPSBtYXRjaCByMCwgcjEgd2l0aFxufCBPayB2MCwgT2sgdjEgLT4gb2sgdjAgdjFcbnwgRXJyb3IgZTAsIEVycm9yIGUxIC0+IGVycm9yIGUwIGUxXG58IE9rIF8sIEVycm9yIF8gLT4gLTFcbnwgRXJyb3IgXywgT2sgXyAtPiAxXG5cbmxldCB0b19vcHRpb24gPSBmdW5jdGlvbiBPayB2IC0+IFNvbWUgdiB8IEVycm9yIF8gLT4gTm9uZVxubGV0IHRvX2xpc3QgPSBmdW5jdGlvbiBPayB2IC0+IFt2XSB8IEVycm9yIF8gLT4gW11cbmxldCB0b19zZXEgPSBmdW5jdGlvbiBPayB2IC0+IFNlcS5yZXR1cm4gdiB8IEVycm9yIF8gLT4gU2VxLmVtcHR5XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGJvb2wgPSBmYWxzZSB8IHRydWVcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxubGV0IGVxdWFsIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBib29sIC0+IGJvb2wgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmV4dGVybmFsIHRvX2ludCA6IGJvb2wgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxubGV0IHRvX2Zsb2F0ID0gZnVuY3Rpb24gZmFsc2UgLT4gMC4gfCB0cnVlIC0+IDEuXG5cbigqXG5sZXQgb2Zfc3RyaW5nID0gZnVuY3Rpb25cbnwgXCJmYWxzZVwiIC0+IFNvbWUgZmFsc2VcbnwgXCJ0cnVlXCIgLT4gU29tZSB0cnVlXG58IF8gLT4gTm9uZVxuKilcblxubGV0IHRvX3N0cmluZyA9IGZ1bmN0aW9uIGZhbHNlIC0+IFwiZmFsc2VcIiB8IHRydWUgLT4gXCJ0cnVlXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQ2hhcmFjdGVyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgY29kZTogY2hhciAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCB1bnNhZmVfY2hyOiBpbnQgLT4gY2hhciA9IFwiJWlkZW50aXR5XCJcblxubGV0IGNociBuID1cbiAgaWYgbiA8IDAgfHwgbiA+IDI1NSB0aGVuIGludmFsaWRfYXJnIFwiQ2hhci5jaHJcIiBlbHNlIHVuc2FmZV9jaHIgblxuXG5leHRlcm5hbCBieXRlc19jcmVhdGU6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3NldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcblxubGV0IGVzY2FwZWQgPSBmdW5jdGlvblxuICB8ICdcXCcnIC0+IFwiXFxcXCdcIlxuICB8ICdcXFxcJyAtPiBcIlxcXFxcXFxcXCJcbiAgfCAnXFxuJyAtPiBcIlxcXFxuXCJcbiAgfCAnXFx0JyAtPiBcIlxcXFx0XCJcbiAgfCAnXFxyJyAtPiBcIlxcXFxyXCJcbiAgfCAnXFxiJyAtPiBcIlxcXFxiXCJcbiAgfCAnICcgLi4gJ34nIGFzIGMgLT5cbiAgICAgIGxldCBzID0gYnl0ZXNfY3JlYXRlIDEgaW5cbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAwIGM7XG4gICAgICB1bnNhZmVfdG9fc3RyaW5nIHNcbiAgfCBjIC0+XG4gICAgICBsZXQgbiA9IGNvZGUgYyBpblxuICAgICAgbGV0IHMgPSBieXRlc19jcmVhdGUgNCBpblxuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDAgJ1xcXFwnO1xuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDEgKHVuc2FmZV9jaHIgKDQ4ICsgbiAvIDEwMCkpO1xuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDIgKHVuc2FmZV9jaHIgKDQ4ICsgKG4gLyAxMCkgbW9kIDEwKSk7XG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMyAodW5zYWZlX2NociAoNDggKyBuIG1vZCAxMCkpO1xuICAgICAgdW5zYWZlX3RvX3N0cmluZyBzXG5cbmxldCBsb3dlcmNhc2VfYXNjaWkgPSBmdW5jdGlvblxuICB8ICdBJyAuLiAnWicgYXMgYyAtPiB1bnNhZmVfY2hyKGNvZGUgYyArIDMyKVxuICB8IGMgLT4gY1xuXG5sZXQgdXBwZXJjYXNlX2FzY2lpID0gZnVuY3Rpb25cbiAgfCAnYScgLi4gJ3onIGFzIGMgLT4gdW5zYWZlX2Nocihjb2RlIGMgLSAzMilcbiAgfCBjIC0+IGNcblxudHlwZSB0ID0gY2hhclxuXG5sZXQgY29tcGFyZSBjMSBjMiA9IGNvZGUgYzEgLSBjb2RlIGMyXG5sZXQgZXF1YWwgKGMxOiB0KSAoYzI6IHQpID0gY29tcGFyZSBjMSBjMiA9IDBcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGFuaWVsIEMuIEJ1ZW56bGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgZm9ybWF0X2ludCA6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuXG5sZXQgZXJyX25vX3ByZWQgPSBcIlUrMDAwMCBoYXMgbm8gcHJlZGVjZXNzb3JcIlxubGV0IGVycl9ub19zdWNjID0gXCJVKzEwRkZGRiBoYXMgbm8gc3VjY2Vzc29yXCJcbmxldCBlcnJfbm90X3N2IGkgPSBmb3JtYXRfaW50IFwiJVhcIiBpIF4gXCIgaXMgbm90IGFuIFVuaWNvZGUgc2NhbGFyIHZhbHVlXCJcbmxldCBlcnJfbm90X2xhdGluMSB1ID0gXCJVK1wiIF4gZm9ybWF0X2ludCBcIiUwNFhcIiB1IF4gXCIgaXMgbm90IGEgbGF0aW4xIGNoYXJhY3RlclwiXG5cbnR5cGUgdCA9IGludFxuXG5sZXQgbWluID0gMHgwMDAwXG5sZXQgbWF4ID0gMHgxMEZGRkZcbmxldCBsb19ib3VuZCA9IDB4RDdGRlxubGV0IGhpX2JvdW5kID0gMHhFMDAwXG5cbmxldCBib20gPSAweEZFRkZcbmxldCByZXAgPSAweEZGRkRcblxubGV0IHN1Y2MgdSA9XG4gIGlmIHUgPSBsb19ib3VuZCB0aGVuIGhpX2JvdW5kIGVsc2VcbiAgaWYgdSA9IG1heCB0aGVuIGludmFsaWRfYXJnIGVycl9ub19zdWNjIGVsc2VcbiAgdSArIDFcblxubGV0IHByZWQgdSA9XG4gIGlmIHUgPSBoaV9ib3VuZCB0aGVuIGxvX2JvdW5kIGVsc2VcbiAgaWYgdSA9IG1pbiB0aGVuIGludmFsaWRfYXJnIGVycl9ub19wcmVkIGVsc2VcbiAgdSAtIDFcblxubGV0IGlzX3ZhbGlkIGkgPSAobWluIDw9IGkgJiYgaSA8PSBsb19ib3VuZCkgfHwgKGhpX2JvdW5kIDw9IGkgJiYgaSA8PSBtYXgpXG5sZXQgb2ZfaW50IGkgPSBpZiBpc192YWxpZCBpIHRoZW4gaSBlbHNlIGludmFsaWRfYXJnIChlcnJfbm90X3N2IGkpXG5leHRlcm5hbCB1bnNhZmVfb2ZfaW50IDogaW50IC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCB0b19pbnQgOiB0IC0+IGludCA9IFwiJWlkZW50aXR5XCJcblxubGV0IGlzX2NoYXIgdSA9IHUgPCAyNTZcbmxldCBvZl9jaGFyIGMgPSBDaGFyLmNvZGUgY1xubGV0IHRvX2NoYXIgdSA9XG4gIGlmIHUgPiAyNTUgdGhlbiBpbnZhbGlkX2FyZyAoZXJyX25vdF9sYXRpbjEgdSkgZWxzZVxuICBDaGFyLnVuc2FmZV9jaHIgdVxuXG5sZXQgdW5zYWZlX3RvX2NoYXIgPSBDaGFyLnVuc2FmZV9jaHJcblxubGV0IGVxdWFsIDogaW50IC0+IGludCAtPiBib29sID0gKCA9IClcbmxldCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBTdGRsaWIuY29tcGFyZVxubGV0IGhhc2ggPSB0b19pbnRcblxuKCogVVRGIGNvZGVjcyB0b29scyAqKVxuXG50eXBlIHV0Zl9kZWNvZGUgPSBpbnRcbigqIFRoaXMgaXMgYW4gaW50IFsweERVVVVVVVVdIGRlY29tcG9zZWQgYXMgZm9sbG93czpcbiAgIC0gW0RdIGlzIGZvdXIgYml0cyBmb3IgZGVjb2RlIGluZm9ybWF0aW9uLCB0aGUgaGlnaGVzdCBiaXQgaXMgc2V0IGlmIHRoZVxuICAgICBkZWNvZGUgaXMgdmFsaWQuIFRoZSB0aHJlZSBsb3dlciBiaXRzIGluZGljYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHNcbiAgICAgZnJvbSB0aGUgc291cmNlIHRoYXQgd2VyZSBjb25zdW1lZCBieSB0aGUgZGVjb2RlLlxuICAgLSBbVVVVVVVVXSBpcyB0aGUgZGVjb2RlZCBVbmljb2RlIGNoYXJhY3RlciBvciB0aGUgVW5pY29kZSByZXBsYWNlbWVudFxuICAgICBjaGFyYWN0ZXIgVStGRkZEIGlmIGZvciBpbnZhbGlkIGRlY29kZXMuICopXG5cbmxldCB2YWxpZF9iaXQgPSAyN1xubGV0IGRlY29kZV9iaXRzID0gMjRcblxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfaXNfdmFsaWQgZCA9IChkIGxzciB2YWxpZF9iaXQpID0gMVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGVfbGVuZ3RoIGQgPSAoZCBsc3IgZGVjb2RlX2JpdHMpIGxhbmQgMGIxMTFcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX3VjaGFyIGQgPSB1bnNhZmVfb2ZfaW50IChkIGxhbmQgMHhGRkZGRkYpXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZSBuIHUgPSAoKDggbG9yIG4pIGxzbCBkZWNvZGVfYml0cykgbG9yICh0b19pbnQgdSlcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2ludmFsaWQgbiA9IChuIGxzbCBkZWNvZGVfYml0cykgbG9yIHJlcFxuXG5sZXQgdXRmXzhfYnl0ZV9sZW5ndGggdSA9IG1hdGNoIHRvX2ludCB1IHdpdGhcbnwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxufCB1IHdoZW4gdSA8PSAweDAwN0YgLT4gMVxufCB1IHdoZW4gdSA8PSAweDA3RkYgLT4gMlxufCB1IHdoZW4gdSA8PSAweEZGRkYgLT4gM1xufCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPiA0XG58IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCB1dGZfMTZfYnl0ZV9sZW5ndGggdSA9IG1hdGNoIHRvX2ludCB1IHdpdGhcbnwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxufCB1IHdoZW4gdSA8PSAweEZGRkYgLT4gMlxufCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPiA0XG58IF8gLT4gYXNzZXJ0IGZhbHNlXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEFuIGFsaWFzIGZvciB0aGUgdHlwZSBvZiBsaXN0cy4gKilcbnR5cGUgJ2EgdCA9ICdhIGxpc3QgPSBbXSB8ICg6Oikgb2YgJ2EgKiAnYSBsaXN0XG5cbigqIExpc3Qgb3BlcmF0aW9ucyAqKVxuXG5sZXQgcmVjIGxlbmd0aF9hdXggbGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBsZW5cbiAgfCBfOjpsIC0+IGxlbmd0aF9hdXggKGxlbiArIDEpIGxcblxubGV0IGxlbmd0aCBsID0gbGVuZ3RoX2F1eCAwIGxcblxubGV0IGNvbnMgYSBsID0gYTo6bFxuXG5sZXQgaGQgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhaWx3aXRoIFwiaGRcIlxuICB8IGE6Ol8gLT4gYVxuXG5sZXQgdGwgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhaWx3aXRoIFwidGxcIlxuICB8IF86OmwgLT4gbFxuXG5sZXQgbnRoIGwgbiA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0Lm50aFwiIGVsc2VcbiAgbGV0IHJlYyBudGhfYXV4IGwgbiA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBmYWlsd2l0aCBcIm50aFwiXG4gICAgfCBhOjpsIC0+IGlmIG4gPSAwIHRoZW4gYSBlbHNlIG50aF9hdXggbCAobi0xKVxuICBpbiBudGhfYXV4IGwgblxuXG5sZXQgbnRoX29wdCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gTm9uZVxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIFNvbWUgYSBlbHNlIG50aF9hdXggbCAobi0xKVxuICBpbiBudGhfYXV4IGwgblxuXG5sZXQgYXBwZW5kID0gKEApXG5cbmxldCByZWMgcmV2X2FwcGVuZCBsMSBsMiA9XG4gIG1hdGNoIGwxIHdpdGhcbiAgICBbXSAtPiBsMlxuICB8IGEgOjogbCAtPiByZXZfYXBwZW5kIGwgKGEgOjogbDIpXG5cbmxldCByZXYgbCA9IHJldl9hcHBlbmQgbCBbXVxuXG5sZXQgcmVjIGluaXRfdGFpbHJlY19hdXggYWNjIGkgbiBmID1cbiAgaWYgaSA+PSBuIHRoZW4gYWNjXG4gIGVsc2UgaW5pdF90YWlscmVjX2F1eCAoZiBpIDo6IGFjYykgKGkrMSkgbiBmXG5cbmxldCByZWMgaW5pdF9hdXggaSBuIGYgPVxuICBpZiBpID49IG4gdGhlbiBbXVxuICBlbHNlXG4gICAgbGV0IHIgPSBmIGkgaW5cbiAgICByIDo6IGluaXRfYXV4IChpKzEpIG4gZlxuXG5sZXQgcmV2X2luaXRfdGhyZXNob2xkID1cbiAgbWF0Y2ggU3lzLmJhY2tlbmRfdHlwZSB3aXRoXG4gIHwgU3lzLk5hdGl2ZSB8IFN5cy5CeXRlY29kZSAtPiAxMF8wMDBcbiAgKCogV2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2ssIGJldHRlciBiZSBzYWZlIGFuZCBhc3N1bWUgaXQnc1xuICAgICBzbWFsbC4gKilcbiAgfCBTeXMuT3RoZXIgXyAtPiA1MFxuXG5sZXQgaW5pdCBsZW4gZiA9XG4gIGlmIGxlbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QuaW5pdFwiIGVsc2VcbiAgaWYgbGVuID4gcmV2X2luaXRfdGhyZXNob2xkIHRoZW4gcmV2IChpbml0X3RhaWxyZWNfYXV4IFtdIDAgbGVuIGYpXG4gIGVsc2UgaW5pdF9hdXggMCBsZW4gZlxuXG5sZXQgcmVjIGZsYXR0ZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgbDo6ciAtPiBsIEAgZmxhdHRlbiByXG5cbmxldCBjb25jYXQgPSBmbGF0dGVuXG5cbmxldCByZWMgbWFwIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgYTo6bCAtPiBsZXQgciA9IGYgYSBpbiByIDo6IG1hcCBmIGxcblxubGV0IHJlYyBtYXBpIGkgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW11cbiAgfCBhOjpsIC0+IGxldCByID0gZiBpIGEgaW4gciA6OiBtYXBpIChpICsgMSkgZiBsXG5cbmxldCBtYXBpIGYgbCA9IG1hcGkgMCBmIGxcblxubGV0IHJldl9tYXAgZiBsID1cbiAgbGV0IHJlYyBybWFwX2YgYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1XG4gICAgfCBhOjpsIC0+IHJtYXBfZiAoZiBhIDo6IGFjY3UpIGxcbiAgaW5cbiAgcm1hcF9mIFtdIGxcblxuXG5sZXQgcmVjIGl0ZXIgZiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gKClcbiAgfCBhOjpsIC0+IGYgYTsgaXRlciBmIGxcblxubGV0IHJlYyBpdGVyaSBpIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGkgYTsgaXRlcmkgKGkgKyAxKSBmIGxcblxubGV0IGl0ZXJpIGYgbCA9IGl0ZXJpIDAgZiBsXG5cbmxldCByZWMgZm9sZF9sZWZ0IGYgYWNjdSBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gICAgW10gLT4gYWNjdVxuICB8IGE6OmwgLT4gZm9sZF9sZWZ0IGYgKGYgYWNjdSBhKSBsXG5cbmxldCByZWMgZm9sZF9yaWdodCBmIGwgYWNjdSA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGYgYSAoZm9sZF9yaWdodCBmIGwgYWNjdSlcblxubGV0IHJlYyBtYXAyIGYgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gW11cbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IGxldCByID0gZiBhMSBhMiBpbiByIDo6IG1hcDIgZiBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QubWFwMlwiXG5cbmxldCByZXZfbWFwMiBmIGwxIGwyID1cbiAgbGV0IHJlYyBybWFwMl9mIGFjY3UgbDEgbDIgPVxuICAgIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICB8IChbXSwgW10pIC0+IGFjY3VcbiAgICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcm1hcDJfZiAoZiBhMSBhMiA6OiBhY2N1KSBsMSBsMlxuICAgIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5yZXZfbWFwMlwiXG4gIGluXG4gIHJtYXAyX2YgW10gbDEgbDJcblxuXG5sZXQgcmVjIGl0ZXIyIGYgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gKClcbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IGYgYTEgYTI7IGl0ZXIyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lml0ZXIyXCJcblxubGV0IHJlYyBmb2xkX2xlZnQyIGYgYWNjdSBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBhY2N1XG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmb2xkX2xlZnQyIGYgKGYgYWNjdSBhMSBhMikgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LmZvbGRfbGVmdDJcIlxuXG5sZXQgcmVjIGZvbGRfcmlnaHQyIGYgbDEgbDIgYWNjdSA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiBhY2N1XG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyIChmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UpXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX3JpZ2h0MlwiXG5cbmxldCByZWMgZm9yX2FsbCBwID0gZnVuY3Rpb25cbiAgICBbXSAtPiB0cnVlXG4gIHwgYTo6bCAtPiBwIGEgJiYgZm9yX2FsbCBwIGxcblxubGV0IHJlYyBleGlzdHMgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IHAgYSB8fCBleGlzdHMgcCBsXG5cbmxldCByZWMgZm9yX2FsbDIgcCBsMSBsMiA9XG4gIG1hdGNoIChsMSwgbDIpIHdpdGhcbiAgICAoW10sIFtdKSAtPiB0cnVlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyICYmIGZvcl9hbGwyIHAgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LmZvcl9hbGwyXCJcblxubGV0IHJlYyBleGlzdHMyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gZmFsc2VcbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHAgYTEgYTIgfHwgZXhpc3RzMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5leGlzdHMyXCJcblxubGV0IHJlYyBtZW0geCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGNvbXBhcmUgYSB4ID0gMCB8fCBtZW0geCBsXG5cbmxldCByZWMgbWVtcSB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWxzZVxuICB8IGE6OmwgLT4gYSA9PSB4IHx8IG1lbXEgeCBsXG5cbmxldCByZWMgYXNzb2MgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgKGEsYik6OmwgLT4gaWYgY29tcGFyZSBhIHggPSAwIHRoZW4gYiBlbHNlIGFzc29jIHggbFxuXG5sZXQgcmVjIGFzc29jX29wdCB4ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBOb25lXG4gIHwgKGEsYik6OmwgLT4gaWYgY29tcGFyZSBhIHggPSAwIHRoZW4gU29tZSBiIGVsc2UgYXNzb2Nfb3B0IHggbFxuXG5sZXQgcmVjIGFzc3EgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgKGEsYik6OmwgLT4gaWYgYSA9PSB4IHRoZW4gYiBlbHNlIGFzc3EgeCBsXG5cbmxldCByZWMgYXNzcV9vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIFNvbWUgYiBlbHNlIGFzc3Ffb3B0IHggbFxuXG5sZXQgcmVjIG1lbV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBmYWxzZVxuICB8IChhLCBfKSA6OiBsIC0+IGNvbXBhcmUgYSB4ID0gMCB8fCBtZW1fYXNzb2MgeCBsXG5cbmxldCByZWMgbWVtX2Fzc3EgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBhID09IHggfHwgbWVtX2Fzc3EgeCBsXG5cbmxldCByZWMgcmVtb3ZlX2Fzc29jIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgKGEsIF8gYXMgcGFpcikgOjogbCAtPlxuICAgICAgaWYgY29tcGFyZSBhIHggPSAwIHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc29jIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgKGEsIF8gYXMgcGFpcikgOjogbCAtPiBpZiBhID09IHggdGhlbiBsIGVsc2UgcGFpciA6OiByZW1vdmVfYXNzcSB4IGxcblxubGV0IHJlYyBmaW5kIHAgPSBmdW5jdGlvblxuICB8IFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiB4IGVsc2UgZmluZCBwIGxcblxubGV0IHJlYyBmaW5kX29wdCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIFNvbWUgeCBlbHNlIGZpbmRfb3B0IHAgbFxuXG5sZXQgcmVjIGZpbmRfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IGwgLT5cbiAgICAgYmVnaW4gbWF0Y2ggZiB4IHdpdGhcbiAgICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT4gcmVzdWx0XG4gICAgICAgfCBOb25lIC0+IGZpbmRfbWFwIGYgbFxuICAgICBlbmRcblxubGV0IGZpbmRfYWxsIHAgPVxuICBsZXQgcmVjIGZpbmQgYWNjdSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gcmV2IGFjY3VcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4gZmluZCAoeCA6OiBhY2N1KSBsIGVsc2UgZmluZCBhY2N1IGwgaW5cbiAgZmluZCBbXVxuXG5sZXQgZmlsdGVyID0gZmluZF9hbGxcblxubGV0IGZpbHRlcmkgcCBsID1cbiAgbGV0IHJlYyBhdXggaSBhY2MgPSBmdW5jdGlvblxuICB8IFtdIC0+IHJldiBhY2NcbiAgfCB4OjpsIC0+IGF1eCAoaSArIDEpIChpZiBwIGkgeCB0aGVuIHg6OmFjYyBlbHNlIGFjYykgbFxuICBpblxuICBhdXggMCBbXSBsXG5cbmxldCBmaWx0ZXJfbWFwIGYgPVxuICBsZXQgcmVjIGF1eCBhY2N1ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHJldiBhY2N1XG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGF1eCBhY2N1IGxcbiAgICAgICAgfCBTb21lIHYgLT4gYXV4ICh2IDo6IGFjY3UpIGxcbiAgaW5cbiAgYXV4IFtdXG5cbmxldCBjb25jYXRfbWFwIGYgbCA9XG4gIGxldCByZWMgYXV4IGYgYWNjID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHJldiBhY2NcbiAgICB8IHggOjogbCAtPlxuICAgICAgIGxldCB4cyA9IGYgeCBpblxuICAgICAgIGF1eCBmIChyZXZfYXBwZW5kIHhzIGFjYykgbFxuICBpbiBhdXggZiBbXSBsXG5cbmxldCBmb2xkX2xlZnRfbWFwIGYgYWNjdSBsID1cbiAgbGV0IHJlYyBhdXggYWNjdSBsX2FjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdSwgcmV2IGxfYWNjdVxuICAgIHwgeCA6OiBsIC0+XG4gICAgICAgIGxldCBhY2N1LCB4ID0gZiBhY2N1IHggaW5cbiAgICAgICAgYXV4IGFjY3UgKHggOjogbF9hY2N1KSBsIGluXG4gIGF1eCBhY2N1IFtdIGxcblxubGV0IHBhcnRpdGlvbiBwIGwgPVxuICBsZXQgcmVjIHBhcnQgeWVzIG5vID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAocmV2IHllcywgcmV2IG5vKVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBwYXJ0ICh4IDo6IHllcykgbm8gbCBlbHNlIHBhcnQgeWVzICh4IDo6IG5vKSBsIGluXG4gIHBhcnQgW10gW10gbFxuXG5sZXQgcGFydGl0aW9uX21hcCBwIGwgPVxuICBsZXQgcmVjIHBhcnQgbGVmdCByaWdodCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gKHJldiBsZWZ0LCByZXYgcmlnaHQpXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIHAgeCB3aXRoXG4gICAgICAgfCBFaXRoZXIuTGVmdCB2IC0+IHBhcnQgKHYgOjogbGVmdCkgcmlnaHQgbFxuICAgICAgIHwgRWl0aGVyLlJpZ2h0IHYgLT4gcGFydCBsZWZ0ICh2IDo6IHJpZ2h0KSBsXG4gICAgIGVuZFxuICBpblxuICBwYXJ0IFtdIFtdIGxcblxubGV0IHJlYyBzcGxpdCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gKFtdLCBbXSlcbiAgfCAoeCx5KTo6bCAtPlxuICAgICAgbGV0IChyeCwgcnkpID0gc3BsaXQgbCBpbiAoeDo6cngsIHk6OnJ5KVxuXG5sZXQgcmVjIGNvbWJpbmUgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gW11cbiAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IChhMSwgYTIpIDo6IGNvbWJpbmUgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0LmNvbWJpbmVcIlxuXG4oKiogc29ydGluZyAqKVxuXG5sZXQgcmVjIG1lcmdlIGNtcCBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIGwyIC0+IGwyXG4gIHwgbDEsIFtdIC0+IGwxXG4gIHwgaDEgOjogdDEsIGgyIDo6IHQyIC0+XG4gICAgICBpZiBjbXAgaDEgaDIgPD0gMFxuICAgICAgdGhlbiBoMSA6OiBtZXJnZSBjbXAgdDEgbDJcbiAgICAgIGVsc2UgaDIgOjogbWVyZ2UgY21wIGwxIHQyXG5cblxubGV0IHN0YWJsZV9zb3J0IGNtcCBsID1cbiAgbGV0IHJlYyByZXZfbWVyZ2UgbDEgbDIgYWNjdSA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGwyIGFjY3VcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGwxIGFjY3VcbiAgICB8IGgxOjp0MSwgaDI6OnQyIC0+XG4gICAgICAgIGlmIGNtcCBoMSBoMiA8PSAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlIHQxIGwyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSByZXZfbWVyZ2UgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHJldl9tZXJnZV9yZXYgbDEgbDIgYWNjdSA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGwyIGFjY3VcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGwxIGFjY3VcbiAgICB8IGgxOjp0MSwgaDI6OnQyIC0+XG4gICAgICAgIGlmIGNtcCBoMSBoMiA+IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIGwyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSByZXZfbWVyZ2VfcmV2IGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyBzb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9IGlmIGNtcCB4MSB4MiA8PSAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXSBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgaWYgY21wIHgxIHgyIDw9IDAgdGhlblxuICAgICAgICAgICAgaWYgY21wIHgyIHgzIDw9IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzIDw9IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgIGVsc2UgW3gzOyB4MTsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPD0gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgyIHgzIDw9IDAgdGhlbiBbeDI7IHgzOyB4MV1cbiAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSByZXZfc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSByZXZfc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlX3JldiBzMSBzMiBbXSwgdGwpXG4gIGFuZCByZXZfc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPSBpZiBjbXAgeDEgeDIgPiAwIHRoZW4gW3gxOyB4Ml0gZWxzZSBbeDI7IHgxXSBpblxuICAgICAgICAocywgdGwpXG4gICAgfCAzLCB4MSA6OiB4MiA6OiB4MyA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgaWYgY21wIHgxIHgyID4gMCB0aGVuXG4gICAgICAgICAgICBpZiBjbXAgeDIgeDMgPiAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA+IDAgdGhlbiBbeDE7IHgzOyB4Ml1cbiAgICAgICAgICAgIGVsc2UgW3gzOyB4MTsgeDJdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPiAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgZWxzZSBpZiBjbXAgeDIgeDMgPiAwIHRoZW4gW3gyOyB4MzsgeDFdXG4gICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSBzb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2UgczEgczIgW10sIHRsKVxuICBpblxuICBsZXQgbGVuID0gbGVuZ3RoIGwgaW5cbiAgaWYgbGVuIDwgMiB0aGVuIGwgZWxzZSBmc3QgKHNvcnQgbGVuIGwpXG5cblxubGV0IHNvcnQgPSBzdGFibGVfc29ydFxubGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbigqIE5vdGU6IG9uIGEgbGlzdCBvZiBsZW5ndGggYmV0d2VlbiBhYm91dCAxMDAwMDAgKGRlcGVuZGluZyBvbiB0aGUgbWlub3JcbiAgIGhlYXAgc2l6ZSBhbmQgdGhlIHR5cGUgb2YgdGhlIGxpc3QpIGFuZCBTeXMubWF4X2FycmF5X3NpemUsIGl0IGlzXG4gICBhY3R1YWxseSBmYXN0ZXIgdG8gdXNlIHRoZSBmb2xsb3dpbmcsIGJ1dCBpdCBtaWdodCBhbHNvIHVzZSBtb3JlIG1lbW9yeVxuICAgYmVjYXVzZSB0aGUgYXJndW1lbnQgbGlzdCBjYW5ub3QgYmUgZGVhbGxvY2F0ZWQgaW5jcmVtZW50YWxseS5cblxuICAgQWxzbywgdGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gdGhpcyBjb2RlIG9yIGluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2Ygb2JqX3RydW5jYXRlLlxuXG5leHRlcm5hbCBvYmpfdHJ1bmNhdGUgOiAnYSBhcnJheSAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9vYmpfdHJ1bmNhdGVcIlxuXG5sZXQgYXJyYXlfdG9fbGlzdF9pbl9wbGFjZSBhID1cbiAgbGV0IGwgPSBBcnJheS5sZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgYWNjdSBuIHAgPVxuICAgIGlmIHAgPD0gMCB0aGVuIGFjY3UgZWxzZSBiZWdpblxuICAgICAgaWYgcCA9IG4gdGhlbiBiZWdpblxuICAgICAgICBvYmpfdHJ1bmNhdGUgYSBwO1xuICAgICAgICBsb29wIChhLihwLTEpIDo6IGFjY3UpIChuLTEwMDApIChwLTEpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBsb29wIChhLihwLTEpIDo6IGFjY3UpIG4gKHAtMSlcbiAgICAgIGVuZFxuICAgIGVuZFxuICBpblxuICBsb29wIFtdIChsLTEwMDApIGxcblxuXG5sZXQgc3RhYmxlX3NvcnQgY21wIGwgPVxuICBsZXQgYSA9IEFycmF5Lm9mX2xpc3QgbCBpblxuICBBcnJheS5zdGFibGVfc29ydCBjbXAgYTtcbiAgYXJyYXlfdG9fbGlzdF9pbl9wbGFjZSBhXG5cbiopXG5cblxuKCoqIHNvcnRpbmcgKyByZW1vdmluZyBkdXBsaWNhdGVzICopXG5cbmxldCBzb3J0X3VuaXEgY21wIGwgPVxuICBsZXQgcmVjIHJldl9tZXJnZSBsMSBsMiBhY2N1ID1cbiAgICBtYXRjaCBsMSwgbDIgd2l0aFxuICAgIHwgW10sIGwyIC0+IHJldl9hcHBlbmQgbDIgYWNjdVxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgbDEgYWNjdVxuICAgIHwgaDE6OnQxLCBoMjo6dDIgLT5cbiAgICAgICAgbGV0IGMgPSBjbXAgaDEgaDIgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByZXZfbWVyZ2UgdDEgdDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlIHQxIGwyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSByZXZfbWVyZ2UgbDEgdDIgKGgyOjphY2N1KVxuICBpblxuICBsZXQgcmVjIHJldl9tZXJnZV9yZXYgbDEgbDIgYWNjdSA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGwyIGFjY3VcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGwxIGFjY3VcbiAgICB8IGgxOjp0MSwgaDI6OnQyIC0+XG4gICAgICAgIGxldCBjID0gY21wIGgxIGgyIGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gcmV2X21lcmdlX3JldiB0MSB0MiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgaWYgYyA+IDBcbiAgICAgICAgdGhlbiByZXZfbWVyZ2VfcmV2IHQxIGwyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSByZXZfbWVyZ2VfcmV2IGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyBzb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MV0gZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlblxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyXSBlbHNlIGlmIGMgPCAwIHRoZW4gW3gyOyB4M10gZWxzZSBbeDM7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDMgaW5cbiAgICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgW3gzOyB4MTsgeDJdXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gyOyB4MzsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHJldl9zb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHJldl9zb3J0IG4yIGwyIGluXG4gICAgICAgIChyZXZfbWVyZ2VfcmV2IHMxIHMyIFtdLCB0bClcbiAgYW5kIHJldl9zb3J0IG4gbCA9XG4gICAgbWF0Y2ggbiwgbCB3aXRoXG4gICAgfCAyLCB4MSA6OiB4MiA6OiB0bCAtPlxuICAgICAgICBsZXQgcyA9XG4gICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MV0gZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlblxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyXSBlbHNlIGlmIGMgPiAwIHRoZW4gW3gyOyB4M10gZWxzZSBbeDM7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlblxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgyOyB4M11cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDMgaW5cbiAgICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDE7IHgyXVxuICAgICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICAgIGVsc2UgW3gzOyB4MTsgeDJdXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDEgeDMgaW5cbiAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbGV0IGMgPSBjbXAgeDIgeDMgaW5cbiAgICAgICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDI7IHgxXVxuICAgICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gyOyB4MzsgeDFdXG4gICAgICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHNvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlIHMxIHMyIFtdLCB0bClcbiAgaW5cbiAgbGV0IGxlbiA9IGxlbmd0aCBsIGluXG4gIGlmIGxlbiA8IDIgdGhlbiBsIGVsc2UgZnN0IChzb3J0IGxlbiBsKVxuXG5cbmxldCByZWMgY29tcGFyZV9sZW5ndGhzIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfIC0+IC0xXG4gIHwgXywgW10gLT4gMVxuICB8IF8gOjogbDEsIF8gOjogbDIgLT4gY29tcGFyZV9sZW5ndGhzIGwxIGwyXG5cbmxldCByZWMgY29tcGFyZV9sZW5ndGhfd2l0aCBsIG4gPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPlxuICAgIGlmIG4gPSAwIHRoZW4gMCBlbHNlXG4gICAgICBpZiBuID4gMCB0aGVuIC0xIGVsc2UgMVxuICB8IF8gOjogbCAtPlxuICAgIGlmIG4gPD0gMCB0aGVuIDEgZWxzZVxuICAgICAgY29tcGFyZV9sZW5ndGhfd2l0aCBsIChuLTEpXG5cbigqKiB7MSBDb21wYXJpc29ufSAqKVxuXG4oKiBOb3RlOiB3ZSBhcmUgKm5vdCogc2hvcnRjdXR0aW5nIHRoZSBsaXN0IGJ5IHVzaW5nXG4gICBbTGlzdC5jb21wYXJlX2xlbmd0aHNdIGZpcnN0OyB0aGlzIG1heSBiZSBzbG93ZXIgb24gbG9uZyBsaXN0c1xuICAgaW1tZWRpYXRlbHkgc3RhcnQgd2l0aCBkaXN0aW5jdCBlbGVtZW50cy4gSXQgaXMgYWxzbyBpbmNvcnJlY3QgZm9yXG4gICBbY29tcGFyZV0gYmVsb3csIGFuZCBpdCBpcyBiZXR0ZXIgKHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZSkgdG9cbiAgIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3IgYm90aCBmdW5jdGlvbnMuICopXG5sZXQgcmVjIGVxdWFsIGVxIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gdHJ1ZVxuICB8IFtdLCBfOjpfIHwgXzo6XywgW10gLT4gZmFsc2VcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPiBlcSBhMSBhMiAmJiBlcXVhbCBlcSBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfOjpfIC0+IC0xXG4gIHwgXzo6XywgW10gLT4gMVxuICB8IGExOjpsMSwgYTI6OmwyIC0+XG4gICAgbGV0IGMgPSBjbXAgYTEgYTIgaW5cbiAgICBpZiBjIDw+IDAgdGhlbiBjXG4gICAgZWxzZSBjb21wYXJlIGNtcCBsMSBsMlxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGwgPVxuICBsZXQgcmVjIGF1eCBsICgpID0gbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBTZXEuTmlsXG4gICAgfCB4IDo6IHRhaWwgLT4gU2VxLkNvbnMgKHgsIGF1eCB0YWlsKVxuICBpblxuICBhdXggbFxuXG5sZXQgb2Zfc2VxIHNlcSA9XG4gIGxldCByZWMgZGlyZWN0IGRlcHRoIHNlcSA6IF8gbGlzdCA9XG4gICAgaWYgZGVwdGg9MFxuICAgIHRoZW5cbiAgICAgIFNlcS5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiB4OjphY2MpIFtdIHNlcVxuICAgICAgfD4gcmV2ICgqIHRhaWxyZWMgKilcbiAgICBlbHNlIG1hdGNoIHNlcSgpIHdpdGhcbiAgICAgIHwgU2VxLk5pbCAtPiBbXVxuICAgICAgfCBTZXEuQ29ucyAoeCwgbmV4dCkgLT4geCA6OiBkaXJlY3QgKGRlcHRoLTEpIG5leHRcbiAgaW5cbiAgZGlyZWN0IDUwMCBzZXFcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gaW50XG5cbmxldCB6ZXJvID0gMFxubGV0IG9uZSA9IDFcbmxldCBtaW51c19vbmUgPSAtMVxuZXh0ZXJuYWwgbmVnIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5leHRlcm5hbCBhZGQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFkZGludFwiXG5leHRlcm5hbCBzdWIgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXN1YmludFwiXG5leHRlcm5hbCBtdWwgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG5leHRlcm5hbCBkaXYgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWRpdmludFwiXG5leHRlcm5hbCByZW0gOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW1vZGludFwiXG5leHRlcm5hbCBzdWNjIDogaW50IC0+IGludCA9IFwiJXN1Y2NpbnRcIlxuZXh0ZXJuYWwgcHJlZCA6IGludCAtPiBpbnQgPSBcIiVwcmVkaW50XCJcbmxldCBhYnMgeCA9IGlmIHggPj0gMCB0aGVuIHggZWxzZSAteFxubGV0IG1heF9pbnQgPSAoLTEpIGxzciAxXG5sZXQgbWluX2ludCA9IG1heF9pbnQgKyAxXG5leHRlcm5hbCBsb2dhbmQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFuZGludFwiXG5leHRlcm5hbCBsb2dvciA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlb3JpbnRcIlxuZXh0ZXJuYWwgbG9neG9yIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxubGV0IGxvZ25vdCB4ID0gbG9neG9yIHggKC0xKVxuZXh0ZXJuYWwgc2hpZnRfbGVmdCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNyaW50XCJcbmxldCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5cbigqXG5leHRlcm5hbCBpbnRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludCA9IFwiY2FtbF9pbnRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmcgcyA9IHRyeSBTb21lIChpbnRfb2Zfc3RyaW5nIHMpIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcbiopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmxldCB0b19zdHJpbmcgeCA9IGZvcm1hdF9pbnQgXCIlZFwiIHhcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMuIFdoZW4geW91IG1vZGlmeSB0aGUgb25lIGluIHRoaXMgZmlsZSB5b3UgbmVlZCB0b1xuICAgbW9kaWZ5IGl0cyBkdXBsaWNhdGUgaW4gc3RyaW5nLm1sLlxuICAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBcImR1cGxpY2F0ZWRcIiBjb21tZW50IGFib3ZlIHRoZWlyIGRlZmluaXRpb24uXG4qKVxuXG5leHRlcm5hbCBsZW5ndGggOiBieXRlcyAtPiBpbnQgPSBcIiVieXRlc19sZW5ndGhcIlxuZXh0ZXJuYWwgc3RyaW5nX2xlbmd0aCA6IHN0cmluZyAtPiBpbnQgPSBcIiVzdHJpbmdfbGVuZ3RoXCJcbmV4dGVybmFsIGdldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2ZpbGwgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IGNoYXIgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfZmlsbF9ieXRlc1wiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB1bnNhZmVfdG9fc3RyaW5nIDogYnl0ZXMgLT4gc3RyaW5nID0gXCIlYnl0ZXNfdG9fc3RyaW5nXCJcbmV4dGVybmFsIHVuc2FmZV9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gYnl0ZXMgPSBcIiVieXRlc19vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdW5zYWZlX2JsaXRfc3RyaW5nIDogc3RyaW5nIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCIgW0BAbm9hbGxvY11cblxubGV0IG1ha2UgbiBjID1cbiAgbGV0IHMgPSBjcmVhdGUgbiBpblxuICB1bnNhZmVfZmlsbCBzIDAgbiBjO1xuICBzXG5cbmxldCBpbml0IG4gZiA9XG4gIGxldCBzID0gY3JlYXRlIG4gaW5cbiAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgdW5zYWZlX3NldCBzIGkgKGYgaSlcbiAgZG9uZTtcbiAgc1xuXG5sZXQgZW1wdHkgPSBjcmVhdGUgMFxuXG5sZXQgY29weSBzID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gIGxldCByID0gY3JlYXRlIGxlbiBpblxuICB1bnNhZmVfYmxpdCBzIDAgciAwIGxlbjtcbiAgclxuXG5sZXQgdG9fc3RyaW5nIGIgPSB1bnNhZmVfdG9fc3RyaW5nIChjb3B5IGIpXG5sZXQgb2Zfc3RyaW5nIHMgPSBjb3B5ICh1bnNhZmVfb2Zfc3RyaW5nIHMpXG5cbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuc3ViIC8gQnl0ZXMuc3ViXCJcbiAgZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGxlbiBpblxuICAgIHVuc2FmZV9ibGl0IHMgb2ZzIHIgMCBsZW47XG4gICAgclxuICBlbmRcblxubGV0IHN1Yl9zdHJpbmcgYiBvZnMgbGVuID0gdW5zYWZlX3RvX3N0cmluZyAoc3ViIGIgb2ZzIGxlbilcblxuKCogYWRkaXRpb24gd2l0aCBhbiBvdmVyZmxvdyBjaGVjayAqKVxubGV0ICgrKykgYSBiID1cbiAgbGV0IGMgPSBhICsgYiBpblxuICBtYXRjaCBhIDwgMCwgYiA8IDAsIGMgPCAwIHdpdGhcbiAgfCB0cnVlICwgdHJ1ZSAsIGZhbHNlXG4gIHwgZmFsc2UsIGZhbHNlLCB0cnVlICAtPiBpbnZhbGlkX2FyZyBcIkJ5dGVzLmV4dGVuZFwiICgqIG92ZXJmbG93ICopXG4gIHwgXyAtPiBjXG5cbmxldCBleHRlbmQgcyBsZWZ0IHJpZ2h0ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzICsrIGxlZnQgKysgcmlnaHQgaW5cbiAgbGV0IHIgPSBjcmVhdGUgbGVuIGluXG4gIGxldCAoc3Jjb2ZmLCBkc3RvZmYpID0gaWYgbGVmdCA8IDAgdGhlbiAtbGVmdCwgMCBlbHNlIDAsIGxlZnQgaW5cbiAgbGV0IGNweWxlbiA9IEludC5taW4gKGxlbmd0aCBzIC0gc3Jjb2ZmKSAobGVuIC0gZHN0b2ZmKSBpblxuICBpZiBjcHlsZW4gPiAwIHRoZW4gdW5zYWZlX2JsaXQgcyBzcmNvZmYgciBkc3RvZmYgY3B5bGVuO1xuICByXG5cbmxldCBmaWxsIHMgb2ZzIGxlbiBjID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuZmlsbCAvIEJ5dGVzLmZpbGxcIlxuICBlbHNlIHVuc2FmZV9maWxsIHMgb2ZzIGxlbiBjXG5cbmxldCBibGl0IHMxIG9mczEgczIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBsZW5ndGggczEgLSBsZW5cbiAgICAgICAgICAgICB8fCBvZnMyIDwgMCB8fCBvZnMyID4gbGVuZ3RoIHMyIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCeXRlcy5ibGl0XCJcbiAgZWxzZSB1bnNhZmVfYmxpdCBzMSBvZnMxIHMyIG9mczIgbGVuXG5cbmxldCBibGl0X3N0cmluZyBzMSBvZnMxIHMyIG9mczIgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBvZnMxIDwgMCB8fCBvZnMxID4gc3RyaW5nX2xlbmd0aCBzMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggczIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5ibGl0IC8gQnl0ZXMuYmxpdF9zdHJpbmdcIlxuICBlbHNlIHVuc2FmZV9ibGl0X3N0cmluZyBzMSBvZnMxIHMyIG9mczIgbGVuXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaXRlciBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYodW5zYWZlX2dldCBhIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpdGVyaSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgaSAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxubGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgaW52YWxpZF9hcmcgXCJCeXRlcy5jb25jYXRcIlxuXG5sZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyBzZXBsZW4gPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY1xuICB8IGhkIDo6IFtdIC0+IGxlbmd0aCBoZCArIGFjY1xuICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIHNlcGxlbiArIGFjYykgYWNjKSBzZXBsZW4gdGxcblxubGV0IHJlYyB1bnNhZmVfYmxpdHMgZHN0IHBvcyBzZXAgc2VwbGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBkc3RcbiAgfCBoZCA6OiBbXSAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTsgZHN0XG4gIHwgaGQgOjogdGwgLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7XG4gICAgdW5zYWZlX2JsaXQgc2VwIDAgZHN0IChwb3MgKyBsZW5ndGggaGQpIHNlcGxlbjtcbiAgICB1bnNhZmVfYmxpdHMgZHN0IChwb3MgKyBsZW5ndGggaGQgKyBzZXBsZW4pIHNlcCBzZXBsZW4gdGxcblxubGV0IGNvbmNhdCBzZXAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGVtcHR5XG4gIHwgbCAtPiBsZXQgc2VwbGVuID0gbGVuZ3RoIHNlcCBpblxuICAgICAgICAgIHVuc2FmZV9ibGl0c1xuICAgICAgICAgICAgKGNyZWF0ZSAoc3VtX2xlbmd0aHMgMCBzZXBsZW4gbCkpXG4gICAgICAgICAgICAwIHNlcCBzZXBsZW4gbFxuXG5sZXQgY2F0IHMxIHMyID1cbiAgbGV0IGwxID0gbGVuZ3RoIHMxIGluXG4gIGxldCBsMiA9IGxlbmd0aCBzMiBpblxuICBsZXQgciA9IGNyZWF0ZSAobDEgKyBsMikgaW5cbiAgdW5zYWZlX2JsaXQgczEgMCByIDAgbDE7XG4gIHVuc2FmZV9ibGl0IHMyIDAgciBsMSBsMjtcbiAgclxuXG5cbmV4dGVybmFsIGNoYXJfY29kZTogY2hhciAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBjaGFyX2NocjogaW50IC0+IGNoYXIgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19zcGFjZSA9IGZ1bmN0aW9uXG4gIHwgJyAnIHwgJ1xcMDEyJyB8ICdcXG4nIHwgJ1xccicgfCAnXFx0JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5sZXQgdHJpbSBzID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gIGxldCBpID0gcmVmIDAgaW5cbiAgd2hpbGUgIWkgPCBsZW4gJiYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAhaSkgZG9cbiAgICBpbmNyIGlcbiAgZG9uZTtcbiAgbGV0IGogPSByZWYgKGxlbiAtIDEpIGluXG4gIHdoaWxlICFqID49ICFpICYmIGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgIWopIGRvXG4gICAgZGVjciBqXG4gIGRvbmU7XG4gIGlmICFqID49ICFpIHRoZW5cbiAgICBzdWIgcyAhaSAoIWogLSAhaSArIDEpXG4gIGVsc2VcbiAgICBlbXB0eVxuXG5sZXQgdW5zYWZlX2VzY2FwZSBzID1cbiAgKCogV2UgcGVyZm9ybSB0d28gcGFzc2VzIG9uIHRoZSBpbnB1dCBzZXF1ZW5jZSwgb25lIHRvIGNvbXB1dGUgdGhlXG4gICAgIHJlc3VsdCBzaXplIGFuZCBvbmUgdG8gd3JpdGUgdGhlIHJlc3VsdC5cblxuICAgICAjMTE1MDgsICMxMTUwOTogVGhpcyBsb2dpYyB3b3VsZCBiZSBpbmNvcnJlY3QgaW4gcHJlc2VuY2Ugb2ZcbiAgICAgY29uY3VycmVudCBtb2RpZmljYXRpb24gdG8gdGhlIGlucHV0LCBtYWtpbmcgdGhlIHVzZSBvZlxuICAgICBbdW5zYWZlX3NldF0gYmVsb3cgbWVtb3J5LXVuc2FmZS5cblxuICAgICBQcmVjb25kaXRpb246IFRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSBjYWxsZWQgb246XG4gICAgIC0gYW4gaW1tdXRhYmxlIGJ5dGUgc2VxdWVuY2VcbiAgICAgLSBhIHVuaXF1ZWx5LW93bmVkIGJ5dGUgc2VxdWVuY2UgKHRoZSBmdW5jdGlvbiB0YWtlcyBvd25lcnNoaXApXG5cbiAgICAgSW4gZWl0aGVyIGNhc2Ugd2UgcmV0dXJuIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZS5cbiAgKilcbiAgbGV0IG4gPSByZWYgMCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgbiA6PSAhbiArXG4gICAgICAobWF0Y2ggdW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgIHwgJ1xcXCInIHwgJ1xcXFwnIHwgJ1xcbicgfCAnXFx0JyB8ICdcXHInIHwgJ1xcYicgLT4gMlxuICAgICAgIHwgJyAnIC4uICd+JyAtPiAxXG4gICAgICAgfCBfIC0+IDQpXG4gIGRvbmU7XG4gIGlmICFuID0gbGVuZ3RoIHMgdGhlbiBzXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgcycgPSBjcmVhdGUgIW4gaW5cbiAgICBuIDo9IDA7XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkb1xuICAgICAgYmVnaW4gbWF0Y2ggdW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAoJ1xcXCInIHwgJ1xcXFwnKSBhcyBjIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiBjXG4gICAgICB8ICdcXG4nIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAnbidcbiAgICAgIHwgJ1xcdCcgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICd0J1xuICAgICAgfCAnXFxyJyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ3InXG4gICAgICB8ICdcXGInIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAnYidcbiAgICAgIHwgKCcgJyAuLiAnficpIGFzIGMgLT4gdW5zYWZlX3NldCBzJyAhbiBjXG4gICAgICB8IGMgLT5cbiAgICAgICAgICBsZXQgYSA9IGNoYXJfY29kZSBjIGluXG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgaW5jciBuO1xuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gKGNoYXJfY2hyICg0OCArIGEgLyAxMDApKTtcbiAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAoY2hhcl9jaHIgKDQ4ICsgKGEgLyAxMCkgbW9kIDEwKSk7XG4gICAgICAgICAgaW5jciBuO1xuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gKGNoYXJfY2hyICg0OCArIGEgbW9kIDEwKSk7XG4gICAgICBlbmQ7XG4gICAgICBpbmNyIG5cbiAgICBkb25lO1xuICAgIHMnXG4gIGVuZFxuXG5sZXQgZXNjYXBlZCBiID1cbiAgbGV0IGIgPSBjb3B5IGIgaW5cbiAgKCogV2UgY29weSBvdXIgaW5wdXQgdG8gb2J0YWluIGEgdW5pcXVlbHktb3duZWQgYnl0ZSBzZXF1ZW5jZSBbYl1cbiAgICAgdG8gc2F0aXNmeSBbdW5zYWZlX2VzY2FwZV0ncyBwcmVjb25kaXRpb24gKilcbiAgdW5zYWZlX2VzY2FwZSBiXG5cbmxldCBtYXAgZiBzID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBsID0gMCB0aGVuIHMgZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG8gdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgcyBpKSkgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwaSBmIHMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGwgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyB1bnNhZmVfc2V0IHIgaSAoZiBpICh1bnNhZmVfZ2V0IHMgaSkpIGRvbmU7XG4gICAgclxuICBlbmRcblxubGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFyXG5cbmxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IGxlbmd0aCBhIC0gMSBkb3dudG8gMCBkb1xuICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gIGRvbmU7XG4gICFyXG5cbmxldCBleGlzdHMgcCBzID1cbiAgbGV0IG4gPSBsZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBzIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwgcCBzID1cbiAgbGV0IG4gPSBsZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IHMgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID0gbWFwIENoYXIudXBwZXJjYXNlX2FzY2lpIHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9IG1hcCBDaGFyLmxvd2VyY2FzZV9hc2NpaSBzXG5cbmxldCBhcHBseTEgZiBzID1cbiAgaWYgbGVuZ3RoIHMgPSAwIHRoZW4gcyBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjb3B5IHMgaW5cbiAgICB1bnNhZmVfc2V0IHIgMCAoZih1bnNhZmVfZ2V0IHMgMCkpO1xuICAgIHJcbiAgZW5kXG5cbmxldCBjYXBpdGFsaXplX2FzY2lpIHMgPSBhcHBseTEgQ2hhci51cHBlcmNhc2VfYXNjaWkgc1xubGV0IHVuY2FwaXRhbGl6ZV9hc2NpaSBzID0gYXBwbHkxIENoYXIubG93ZXJjYXNlX2FzY2lpIHNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBzdGFydHNfd2l0aCB+cHJlZml4IHMgPVxuICBsZXQgbGVuX3MgPSBsZW5ndGggc1xuICBhbmQgbGVuX3ByZSA9IGxlbmd0aCBwcmVmaXggaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgaWYgaSA9IGxlbl9wcmUgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiB1bnNhZmVfZ2V0IHMgaSA8PiB1bnNhZmVfZ2V0IHByZWZpeCBpIHRoZW4gZmFsc2VcbiAgICBlbHNlIGF1eCAoaSArIDEpXG4gIGluIGxlbl9zID49IGxlbl9wcmUgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleCBzIGMgPSBpbmRleF9yZWMgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyBpbmRleF9yZWNfb3B0IHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIGluZGV4X3JlY19vcHQgcyBsaW0gKGkgKyAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4X2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbSAvIEJ5dGVzLmluZGV4X2Zyb21cIiBlbHNlXG4gIGluZGV4X3JlYyBzIGwgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjIHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgcmluZGV4X3JlYyBzIChpIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleCBzIGMgPSByaW5kZXhfcmVjIHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAwIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIHJpbmRleF9yZWNfb3B0IHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X29wdCBzIGMgPSByaW5kZXhfcmVjX29wdCBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgMCB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yY29udGFpbnNfZnJvbSAvIEJ5dGVzLnJjb250YWluc19mcm9tXCJcbiAgZWxzZVxuICAgIHRyeSBpZ25vcmUgKHJpbmRleF9yZWMgcyBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cblxudHlwZSB0ID0gYnl0ZXNcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiB0IC0+IHQgLT4gYm9vbCA9IFwiY2FtbF9ieXRlc19lcXVhbFwiIFtAQG5vYWxsb2NdXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgc3BsaXRfb25fY2hhciBzZXAgcyA9XG4gIGxldCByID0gcmVmIFtdIGluXG4gIGxldCBqID0gcmVmIChsZW5ndGggcykgaW5cbiAgZm9yIGkgPSBsZW5ndGggcyAtIDEgZG93bnRvIDAgZG9cbiAgICBpZiB1bnNhZmVfZ2V0IHMgaSA9IHNlcCB0aGVuIGJlZ2luXG4gICAgICByIDo9IHN1YiBzIChpICsgMSkgKCFqIC0gaSAtIDEpIDo6ICFyO1xuICAgICAgaiA6PSBpXG4gICAgZW5kXG4gIGRvbmU7XG4gIHN1YiBzIDAgIWogOjogIXJcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA9IGxlbmd0aCBzIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gZ2V0IHMgaSBpblxuICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgaW5cbiAgYXV4IDBcblxubGV0IHRvX3NlcWkgcyA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPSBsZW5ndGggcyB0aGVuIFNlcS5OaWxcbiAgICBlbHNlXG4gICAgICBsZXQgeCA9IGdldCBzIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgb2Zfc2VxIGkgPVxuICBsZXQgbiA9IHJlZiAwIGluXG4gIGxldCBidWYgPSByZWYgKG1ha2UgMjU2ICdcXDAwMCcpIGluXG4gIGxldCByZXNpemUgKCkgPVxuICAgICgqIHJlc2l6ZSAqKVxuICAgIGxldCBuZXdfbGVuID0gSW50Lm1pbiAoMiAqIGxlbmd0aCAhYnVmKSBTeXMubWF4X3N0cmluZ19sZW5ndGggaW5cbiAgICBpZiBsZW5ndGggIWJ1ZiA9IG5ld19sZW4gdGhlbiBmYWlsd2l0aCBcIkJ5dGVzLm9mX3NlcTogY2Fubm90IGdyb3cgYnl0ZXNcIjtcbiAgICBsZXQgbmV3X2J1ZiA9IG1ha2UgbmV3X2xlbiAnXFwwMDAnIGluXG4gICAgYmxpdCAhYnVmIDAgbmV3X2J1ZiAwICFuO1xuICAgIGJ1ZiA6PSBuZXdfYnVmXG4gIGluXG4gIFNlcS5pdGVyXG4gICAgKGZ1biBjIC0+XG4gICAgICAgaWYgIW4gPSBsZW5ndGggIWJ1ZiB0aGVuIHJlc2l6ZSgpO1xuICAgICAgIHNldCAhYnVmICFuIGM7XG4gICAgICAgaW5jciBuKVxuICAgIGk7XG4gIHN1YiAhYnVmIDAgIW5cblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuKCogVGhlIGdldF8gZnVuY3Rpb25zIGFyZSBhbGwgZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcblxuZXh0ZXJuYWwgdW5zYWZlX2dldF91aW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXRfdWludDE2X25lIDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWNhbWxfYnl0ZXNfZ2V0MTZ1XCJcbmV4dGVybmFsIGdldF91aW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgPSBcIiVieXRlc19zYWZlX2dldFwiXG5leHRlcm5hbCBnZXRfdWludDE2X25lIDogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiJWNhbWxfYnl0ZXNfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogYnl0ZXMgLT4gaW50IC0+IGludDMyID0gXCIlY2FtbF9ieXRlc19nZXQzMlwiXG5leHRlcm5hbCBnZXRfaW50NjRfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX2J5dGVzX2dldDY0XCJcblxuZXh0ZXJuYWwgdW5zYWZlX3NldF91aW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF91aW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCIlY2FtbF9ieXRlc19zZXQxNnVcIlxuZXh0ZXJuYWwgc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBzZXRfaW50MTZfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2XCJcbmV4dGVybmFsIHNldF9pbnQzMl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMlwiXG5leHRlcm5hbCBzZXRfaW50NjRfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjRcIlxuZXh0ZXJuYWwgc3dhcDE2IDogaW50IC0+IGludCA9IFwiJWJzd2FwMTZcIlxuZXh0ZXJuYWwgc3dhcDMyIDogaW50MzIgLT4gaW50MzIgPSBcIiVic3dhcF9pbnQzMlwiXG5leHRlcm5hbCBzd2FwNjQgOiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWJzd2FwX2ludDY0XCJcblxubGV0IHVuc2FmZV9nZXRfdWludDE2X2xlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gc3dhcDE2ICh1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgdW5zYWZlX2dldF91aW50MTZfbmUgYiBpXG5cbmxldCB1bnNhZmVfZ2V0X3VpbnQxNl9iZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhblxuICB0aGVuIHVuc2FmZV9nZXRfdWludDE2X25lIGIgaVxuICBlbHNlIHN3YXAxNiAodW5zYWZlX2dldF91aW50MTZfbmUgYiBpKVxuXG5sZXQgZ2V0X2ludDggYiBpID1cbiAgKChnZXRfdWludDggYiBpKSBsc2wgKFN5cy5pbnRfc2l6ZSAtIDgpKSBhc3IgKFN5cy5pbnRfc2l6ZSAtIDgpXG5cbmxldCBnZXRfdWludDE2X2xlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IChnZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSBnZXRfdWludDE2X25lIGIgaVxuXG5sZXQgZ2V0X3VpbnQxNl9iZSBiIGkgPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgKGdldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIGdldF91aW50MTZfbmUgYiBpXG5cbmxldCBnZXRfaW50MTZfbmUgYiBpID1cbiAgKChnZXRfdWludDE2X25lIGIgaSkgbHNsIChTeXMuaW50X3NpemUgLSAxNikpIGFzciAoU3lzLmludF9zaXplIC0gMTYpXG5cbmxldCBnZXRfaW50MTZfbGUgYiBpID1cbiAgKChnZXRfdWludDE2X2xlIGIgaSkgbHNsIChTeXMuaW50X3NpemUgLSAxNikpIGFzciAoU3lzLmludF9zaXplIC0gMTYpXG5cbmxldCBnZXRfaW50MTZfYmUgYiBpID1cbiAgKChnZXRfdWludDE2X2JlIGIgaSkgbHNsIChTeXMuaW50X3NpemUgLSAxNikpIGFzciAoU3lzLmludF9zaXplIC0gMTYpXG5cbmxldCBnZXRfaW50MzJfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgKGdldF9pbnQzMl9uZSBiIGkpXG4gIGVsc2UgZ2V0X2ludDMyX25lIGIgaVxuXG5sZXQgZ2V0X2ludDMyX2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiAoZ2V0X2ludDMyX25lIGIgaSlcbiAgZWxzZSBnZXRfaW50MzJfbmUgYiBpXG5cbmxldCBnZXRfaW50NjRfbGUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwNjQgKGdldF9pbnQ2NF9uZSBiIGkpXG4gIGVsc2UgZ2V0X2ludDY0X25lIGIgaVxuXG5sZXQgZ2V0X2ludDY0X2JlIGIgaSA9XG4gIGlmIG5vdCBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCAoZ2V0X2ludDY0X25lIGIgaSlcbiAgZWxzZSBnZXRfaW50NjRfbmUgYiBpXG5cbmxldCB1bnNhZmVfc2V0X3VpbnQxNl9sZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuXG4gIHRoZW4gdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgeFxuXG5sZXQgdW5zYWZlX3NldF91aW50MTZfYmUgYiBpIHggPVxuICBpZiBTeXMuYmlnX2VuZGlhblxuICB0aGVuIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSB4IGVsc2VcbiAgdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIChzd2FwMTYgeClcblxubGV0IHNldF9pbnQxNl9sZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDE2X25lIGIgaSAoc3dhcDE2IHgpXG4gIGVsc2Ugc2V0X2ludDE2X25lIGIgaSB4XG5cbmxldCBzZXRfaW50MTZfYmUgYiBpIHggPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MTZfbmUgYiBpIChzd2FwMTYgeClcbiAgZWxzZSBzZXRfaW50MTZfbmUgYiBpIHhcblxubGV0IHNldF9pbnQzMl9sZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDMyX25lIGIgaSAoc3dhcDMyIHgpXG4gIGVsc2Ugc2V0X2ludDMyX25lIGIgaSB4XG5cbmxldCBzZXRfaW50MzJfYmUgYiBpIHggPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50MzJfbmUgYiBpIChzd2FwMzIgeClcbiAgZWxzZSBzZXRfaW50MzJfbmUgYiBpIHhcblxubGV0IHNldF9pbnQ2NF9sZSBiIGkgeCA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDY0X25lIGIgaSAoc3dhcDY0IHgpXG4gIGVsc2Ugc2V0X2ludDY0X25lIGIgaSB4XG5cbmxldCBzZXRfaW50NjRfYmUgYiBpIHggPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzZXRfaW50NjRfbmUgYiBpIChzd2FwNjQgeClcbiAgZWxzZSBzZXRfaW50NjRfbmUgYiBpIHhcblxubGV0IHNldF91aW50OCA9IHNldF9pbnQ4XG5sZXQgc2V0X3VpbnQxNl9uZSA9IHNldF9pbnQxNl9uZVxubGV0IHNldF91aW50MTZfYmUgPSBzZXRfaW50MTZfYmVcbmxldCBzZXRfdWludDE2X2xlID0gc2V0X2ludDE2X2xlXG5cbigqIFVURiBjb2RlY3MgYW5kIHZhbGlkYXRpb25zICopXG5cbmxldCBkZWNfaW52YWxpZCA9IFVjaGFyLnV0Zl9kZWNvZGVfaW52YWxpZFxubGV0W0BpbmxpbmVdIGRlY19yZXQgbiB1ID0gVWNoYXIudXRmX2RlY29kZSBuIChVY2hhci51bnNhZmVfb2ZfaW50IHUpXG5cbigqIEluIGNhc2Ugb2YgZGVjb2RpbmcgZXJyb3IsIGlmIHdlIGVycm9yIG9uIHRoZSBmaXJzdCBieXRlLCB3ZVxuICAgY29uc3VtZSB0aGUgYnl0ZSwgb3RoZXJ3aXNlIHdlIGNvbnN1bWUgdGhlIFtuXSBieXRlcyBwcmVjZWRpbmdcbiAgIHRoZSBlcnJvcmluZyBieXRlLlxuXG4gICBUaGlzIG1lYW5zIHRoYXQgaWYgYSBjbGllbnQgdXNlcyBkZWNvZGVzIHdpdGhvdXQgY2FyaW5nIGFib3V0XG4gICB2YWxpZGl0eSBpdCBuYXR1cmFsbHkgcmVwbGFjZSBib2d1cyBkYXRhIHdpdGggVWNoYXIucmVwIGFjY29yZGluZ1xuICAgdG8gdGhlIFdIQVRXRyBFbmNvZGluZyBzdGFuZGFyZC4gT3RoZXIgc2NoZW1lcyBhcmUgcG9zc2libGUgYnlcbiAgIGNvbnN1bHRpbmcgdGhlIG51bWJlciBvZiB1c2VkIGJ5dGVzIG9uIGludmFsaWQgZGVjb2Rlcy4gRm9yIG1vcmVcbiAgIGRldGFpbHMgc2VlIGh0dHBzOi8vaHNpdm9uZW4uZmkvYnJva2VuLXV0Zi04L1xuXG4gICBGb3IgdGhpcyByZWFzb24gaW4gW2dldF91dGZfOF91Y2hhcl0gd2UgZ3JhZHVhbGx5IGNoZWNrIHRoZSBuZXh0XG4gICBieXRlIGlzIGF2YWlsYWJsZSByYXRoZXIgdGhhbiBkb2luZyBpdCBpbW1lZGlhdGVseSBhZnRlciB0aGVcbiAgIGZpcnN0IGJ5dGUuIENvbnRyYXN0IHdpdGggW2lzX3ZhbGlkX3V0Zl84XS4gKilcblxuKCogVVRGLTggKilcblxubGV0W0BpbmxpbmVdIG5vdF9pbl94ODBfdG9feEJGIGIgPSBiIGxzciA2IDw+IDBiMTBcbmxldFtAaW5saW5lXSBub3RfaW5feEEwX3RvX3hCRiBiID0gYiBsc3IgNSA8PiAwYjEwMVxubGV0W0BpbmxpbmVdIG5vdF9pbl94ODBfdG9feDlGIGIgPSBiIGxzciA1IDw+IDBiMTAwXG5sZXRbQGlubGluZV0gbm90X2luX3g5MF90b194QkYgYiA9IGIgPCAweDkwIHx8IDB4QkYgPCBiXG5sZXRbQGlubGluZV0gbm90X2luX3g4MF90b194OEYgYiA9IGIgbHNyIDQgPD4gMHg4XG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl8yIGIwIGIxID1cbiAgKChiMCBsYW5kIDB4MUYpIGxzbCA2KSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpKVxuXG5sZXRbQGlubGluZV0gdXRmXzhfdWNoYXJfMyBiMCBiMSBiMiA9XG4gICgoYjAgbGFuZCAweDBGKSBsc2wgMTIpIGxvclxuICAoKGIxIGxhbmQgMHgzRikgbHNsIDYpIGxvclxuICAoKGIyIGxhbmQgMHgzRikpXG5cbmxldFtAaW5saW5lXSB1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzID1cbiAgKChiMCBsYW5kIDB4MDcpIGxzbCAxOCkgbG9yXG4gICgoYjEgbGFuZCAweDNGKSBsc2wgMTIpIGxvclxuICAoKGIyIGxhbmQgMHgzRikgbHNsIDYpIGxvclxuICAoKGIzIGxhbmQgMHgzRikpXG5cbmxldCBnZXRfdXRmXzhfdWNoYXIgYiBpID1cbiAgbGV0IGIwID0gZ2V0X3VpbnQ4IGIgaSBpbiAoKiByYWlzZXMgaWYgW2ldIGlzIG5vdCBhIHZhbGlkIGluZGV4LiAqKVxuICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50OCBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIG1hdGNoIENoYXIudW5zYWZlX2NociBiMCB3aXRoICgqIFNlZSBUaGUgVW5pY29kZSBTdGFuZGFyZCwgVGFibGUgMy43ICopXG4gIHwgJ1xceDAwJyAuLiAnXFx4N0YnIC0+IGRlY19yZXQgMSBiMFxuICB8ICdcXHhDMicgLi4gJ1xceERGJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBkZWNfcmV0IDIgKHV0Zl84X3VjaGFyXzIgYjAgYjEpXG4gIHwgJ1xceEUwJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94QTBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RTEnIC4uICdcXHhFQycgfCAnXFx4RUUnIC4uICdcXHhFRicgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBkZWNfcmV0IDMgKHV0Zl84X3VjaGFyXzMgYjAgYjEgYjIpXG4gIHwgJ1xceEVEJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feDlGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGRlY19yZXQgMyAodXRmXzhfdWNoYXJfMyBiMCBiMSBiMilcbiAgfCAnXFx4RjAnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g5MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgJ1xceEYxJyAuLiAnXFx4RjMnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBsZXQgYjMgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIzIHRoZW4gZGVjX2ludmFsaWQgMyBlbHNlXG4gICAgICBkZWNfcmV0IDQgKHV0Zl84X3VjaGFyXzQgYjAgYjEgYjIgYjMpXG4gIHwgJ1xceEY0JyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feDhGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgbGV0IGIzID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMyB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgZGVjX3JldCA0ICh1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzKVxuICB8IF8gLT4gZGVjX2ludmFsaWQgMVxuXG5sZXQgc2V0X3V0Zl84X3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDggaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBtYXRjaCBVY2hhci50b19pbnQgdSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAwIC0+IGFzc2VydCBmYWxzZVxuICB8IHUgd2hlbiB1IDw9IDB4MDA3RiAtPlxuICAgICAgc2V0X3VpbnQ4IGIgaSB1O1xuICAgICAgMVxuICB8IHUgd2hlbiB1IDw9IDB4MDdGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgKHNldF91aW50OCBiIGkgKDB4QzAgbG9yICh1IGxzciA2KSk7XG4gICAgICAgc2V0IGIgbGFzdCAoMHg4MCBsb3IgKHUgbGFuZCAweDNGKSk7XG4gICAgICAgMilcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIChzZXRfdWludDggYiBpICgweEUwIGxvciAodSBsc3IgMTIpKTtcbiAgICAgICBzZXQgYiAoaSArIDEpICgweDgwIGxvciAoKHUgbHNyIDYpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIGxhc3QgKDB4ODAgbG9yICh1IGxhbmQgMHgzRikpO1xuICAgICAgIDMpXG4gIHwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIChzZXRfdWludDggYiBpICgweEYwIGxvciAodSBsc3IgMTgpKTtcbiAgICAgICBzZXQgYiAoaSArIDEpICgweDgwIGxvciAoKHUgbHNyIDEyKSBsYW5kIDB4M0YpKTtcbiAgICAgICBzZXQgYiAoaSArIDIpICgweDgwIGxvciAoKHUgbHNyIDYpIGxhbmQgMHgzRikpO1xuICAgICAgIHNldCBiIGxhc3QgKDB4ODAgbG9yICh1IGxhbmQgMHgzRikpO1xuICAgICAgIDQpXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGlzX3ZhbGlkX3V0Zl84IGIgPVxuICBsZXQgcmVjIGxvb3AgbWF4IGIgaSA9XG4gICAgaWYgaSA+IG1heCB0aGVuIHRydWUgZWxzZVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQ4IGluXG4gICAgbWF0Y2ggQ2hhci51bnNhZmVfY2hyIChnZXQgYiBpKSB3aXRoXG4gICAgfCAnXFx4MDAnIC4uICdcXHg3RicgLT4gbG9vcCBtYXggYiAoaSArIDEpXG4gICAgfCAnXFx4QzInIC4uICdcXHhERicgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMSBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RTAnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feEEwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhFMScgLi4gJ1xceEVDJyB8ICdcXHhFRScgLi4gJ1xceEVGJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAyIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RUQnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDIgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3g5RiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhGMCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94OTBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAyKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhGMScgLi4gJ1xceEYzJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEY0JyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194OEYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDIpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuXG4oKiBVVEYtMTZCRSAqKVxuXG5sZXQgZ2V0X3V0Zl8xNmJlX3VjaGFyIGIgaSA9XG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9iZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIGlmIGkgPSBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfcmV0IDIgdVxuICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGRlY19pbnZhbGlkIDJcbiAgfCBoaSAtPiAoKiBjb21iaW5lIFtoaV0gd2l0aCBhIGxvdyBzdXJyb2dhdGUgKilcbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAobWF4IC0gaSArIDEpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19pbnZhbGlkIDIgKCogcmV0cnkgaGVyZSAqKVxuICAgICAgfCBsbyAtPlxuICAgICAgICAgIGxldCB1ID0gKCgoaGkgbGFuZCAweDNGRikgbHNsIDEwKSBsb3IgKGxvIGxhbmQgMHgzRkYpKSArIDB4MTAwMDAgaW5cbiAgICAgICAgICBkZWNfcmV0IDQgdVxuXG5sZXQgc2V0X3V0Zl8xNmJlX3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDE2X2JlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgbWF0Y2ggVWNoYXIudG9faW50IHUgd2l0aFxuICB8IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2UgKHNldCBiIGkgdTsgMilcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgbGV0IHUnID0gdSAtIDB4MTAwMDAgaW5cbiAgICAgIGxldCBoaSA9ICgweEQ4MDAgbG9yICh1JyBsc3IgMTApKSBpblxuICAgICAgbGV0IGxvID0gKDB4REMwMCBsb3IgKHUnIGxhbmQgMHgzRkYpKSBpblxuICAgICAgc2V0IGIgaSBoaTsgc2V0IGIgKGkgKyAyKSBsbzsgNFxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBpc192YWxpZF91dGZfMTZiZSBiID1cbiAgbGV0IHJlYyBsb29wIG1heCBiIGkgPVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9iZSBpblxuICAgIGlmIGkgPiBtYXggdGhlbiB0cnVlIGVsc2VcbiAgICBpZiBpID0gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBsb29wIG1heCBiIChpICsgMilcbiAgICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGZhbHNlXG4gICAgfCBfaGkgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGZhbHNlXG4gICAgICAgIHwgX2xvIC0+IGxvb3AgbWF4IGIgKGkgKyA0KVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuXG4oKiBVVEYtMTZMRSAqKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIGIgaSA9XG4gIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9sZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIGlmIGkgPSBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfcmV0IDIgdVxuICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGRlY19pbnZhbGlkIDJcbiAgfCBoaSAtPiAoKiBjb21iaW5lIFtoaV0gd2l0aCBhIGxvdyBzdXJyb2dhdGUgKilcbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAobWF4IC0gaSArIDEpIGVsc2VcbiAgICAgIG1hdGNoIGdldCBiIChpICsgMikgd2l0aFxuICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGRlY19pbnZhbGlkIDIgKCogcmV0cnkgaGVyZSAqKVxuICAgICAgfCBsbyAtPlxuICAgICAgICAgIGxldCB1ID0gKCgoaGkgbGFuZCAweDNGRikgbHNsIDEwKSBsb3IgKGxvIGxhbmQgMHgzRkYpKSArIDB4MTAwMDAgaW5cbiAgICAgICAgICBkZWNfcmV0IDQgdVxuXG5sZXQgc2V0X3V0Zl8xNmxlX3VjaGFyIGIgaSB1ID1cbiAgbGV0IHNldCA9IHVuc2FmZV9zZXRfdWludDE2X2xlIGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IG1heCB0aGVuIGludmFsaWRfYXJnIFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiIGVsc2VcbiAgbWF0Y2ggVWNoYXIudG9faW50IHUgd2l0aFxuICB8IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbiAgfCB1IHdoZW4gdSA8PSAweEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2UgKHNldCBiIGkgdTsgMilcbiAgfCB1IHdoZW4gdSA8PSAweDEwRkZGRiAtPlxuICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIDAgZWxzZVxuICAgICAgbGV0IHUnID0gdSAtIDB4MTAwMDAgaW5cbiAgICAgIGxldCBoaSA9ICgweEQ4MDAgbG9yICh1JyBsc3IgMTApKSBpblxuICAgICAgbGV0IGxvID0gKDB4REMwMCBsb3IgKHUnIGxhbmQgMHgzRkYpKSBpblxuICAgICAgc2V0IGIgaSBoaTsgc2V0IGIgKGkgKyAyKSBsbzsgNFxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBpc192YWxpZF91dGZfMTZsZSBiID1cbiAgbGV0IHJlYyBsb29wIG1heCBiIGkgPVxuICAgIGxldCBnZXQgPSB1bnNhZmVfZ2V0X3VpbnQxNl9sZSBpblxuICAgIGlmIGkgPiBtYXggdGhlbiB0cnVlIGVsc2VcbiAgICBpZiBpID0gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgIG1hdGNoIGdldCBiIGkgd2l0aFxuICAgIHwgdSB3aGVuIHUgPCAweEQ4MDAgfHwgdSA+IDB4REZGRiAtPiBsb29wIG1heCBiIChpICsgMilcbiAgICB8IHUgd2hlbiB1ID4gMHhEQkZGIC0+IGZhbHNlXG4gICAgfCBfaGkgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZmFsc2UgZWxzZVxuICAgICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgICAgfCB1IHdoZW4gdSA8IDB4REMwMCB8fCB1ID4gMHhERkZGIC0+IGZhbHNlXG4gICAgICAgIHwgX2xvIC0+IGxvb3AgbWF4IGIgKGkgKyA0KVxuICBpblxuICBsb29wIChsZW5ndGggYiAtIDEpIGIgMFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTdHJpbmcgb3BlcmF0aW9ucywgYmFzZWQgb24gYnl0ZSBzZXF1ZW5jZSBvcGVyYXRpb25zICopXG5cbigqIFdBUk5JTkc6IFNvbWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgZHVwbGljYXRlZCBpbiBieXRlcy5tbCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucy4gV2hlbiB5b3UgbW9kaWZ5IHRoZSBvbmUgaW4gdGhpcyBmaWxlIHlvdSBuZWVkIHRvXG4gICBtb2RpZnkgaXRzIGR1cGxpY2F0ZSBpbiBieXRlcy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6IHN0cmluZyAtPiBpbnQgLT4gIGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuXG5tb2R1bGUgQiA9IEJ5dGVzXG5cbmxldCBidHMgPSBCLnVuc2FmZV90b19zdHJpbmdcbmxldCBib3MgPSBCLnVuc2FmZV9vZl9zdHJpbmdcblxubGV0IG1ha2UgbiBjID1cbiAgQi5tYWtlIG4gYyB8PiBidHNcbmxldCBpbml0IG4gZiA9XG4gIEIuaW5pdCBuIGYgfD4gYnRzXG5sZXQgZW1wdHkgPSBcIlwiXG5sZXQgb2ZfYnl0ZXMgPSBCLnRvX3N0cmluZ1xubGV0IHRvX2J5dGVzID0gQi5vZl9zdHJpbmdcbmxldCBzdWIgcyBvZnMgbGVuID1cbiAgQi5zdWIgKGJvcyBzKSBvZnMgbGVuIHw+IGJ0c1xubGV0IGJsaXQgPVxuICBCLmJsaXRfc3RyaW5nXG5cbmxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbmNhdFwiXG5cbmxldCByZWMgc3VtX2xlbmd0aHMgYWNjIHNlcGxlbiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjXG4gIHwgaGQgOjogW10gLT4gbGVuZ3RoIGhkICsgYWNjXG4gIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgc2VwbGVuICsgYWNjKSBhY2MpIHNlcGxlbiB0bFxuXG5sZXQgcmVjIHVuc2FmZV9ibGl0cyBkc3QgcG9zIHNlcCBzZXBsZW4gPSBmdW5jdGlvblxuICAgIFtdIC0+IGRzdFxuICB8IGhkIDo6IFtdIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpOyBkc3RcbiAgfCBoZCA6OiB0bCAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTtcbiAgICB1bnNhZmVfYmxpdCBzZXAgMCBkc3QgKHBvcyArIGxlbmd0aCBoZCkgc2VwbGVuO1xuICAgIHVuc2FmZV9ibGl0cyBkc3QgKHBvcyArIGxlbmd0aCBoZCArIHNlcGxlbikgc2VwIHNlcGxlbiB0bFxuXG5sZXQgY29uY2F0IHNlcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gXCJcIlxuICB8IGwgLT4gbGV0IHNlcGxlbiA9IGxlbmd0aCBzZXAgaW4gYnRzIEBAXG4gICAgICAgICAgdW5zYWZlX2JsaXRzXG4gICAgICAgICAgICAoQi5jcmVhdGUgKHN1bV9sZW5ndGhzIDAgc2VwbGVuIGwpKVxuICAgICAgICAgICAgMCBzZXAgc2VwbGVuIGxcblxubGV0IGNhdCA9ICggXiApXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpdGVyIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiAodW5zYWZlX2dldCBzIGkpIGRvbmVcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGl0ZXJpIGYgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IHMgaSkgZG9uZVxuXG5sZXQgbWFwIGYgcyA9XG4gIEIubWFwIGYgKGJvcyBzKSB8PiBidHNcbmxldCBtYXBpIGYgcyA9XG4gIEIubWFwaSBmIChib3MgcykgfD4gYnRzXG5sZXQgZm9sZF9yaWdodCBmIHggYSA9XG4gIEIuZm9sZF9yaWdodCBmIChib3MgeCkgYVxubGV0IGZvbGRfbGVmdCBmIGEgeCA9XG4gIEIuZm9sZF9sZWZ0IGYgYSAoYm9zIHgpXG5sZXQgZXhpc3RzIGYgcyA9XG4gIEIuZXhpc3RzIGYgKGJvcyBzKVxubGV0IGZvcl9hbGwgZiBzID1cbiAgQi5mb3JfYWxsIGYgKGJvcyBzKVxuXG4oKiBCZXdhcmU6IHdlIGNhbm5vdCB1c2UgQi50cmltIG9yIEIuZXNjYXBlIGJlY2F1c2UgdGhleSBhbHdheXMgbWFrZSBhXG4gICBjb3B5LCBidXQgU3RyaW5nLm1saSBzcGVsbHMgb3V0IHNvbWUgY2FzZXMgd2hlcmUgd2UgYXJlIG5vdCBhbGxvd2VkXG4gICB0byBtYWtlIGEgY29weS4gKilcblxubGV0IGlzX3NwYWNlID0gZnVuY3Rpb25cbiAgfCAnICcgfCAnXFwwMTInIHwgJ1xcbicgfCAnXFxyJyB8ICdcXHQnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cbmxldCB0cmltIHMgPVxuICBpZiBzID0gXCJcIiB0aGVuIHNcbiAgZWxzZSBpZiBpc19zcGFjZSAodW5zYWZlX2dldCBzIDApIHx8IGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgKGxlbmd0aCBzIC0gMSkpXG4gICAgdGhlbiBidHMgKEIudHJpbSAoYm9zIHMpKVxuICBlbHNlIHNcblxubGV0IGVzY2FwZWQgcyA9XG4gIGxldCBiID0gYm9zIHMgaW5cbiAgKCogV2Ugc2F0aXNmeSBbdW5zYWZlX2VzY2FwZV0ncyBwcmVjb25kaXRpb24gYnkgcGFzc2luZyBhblxuICAgICBpbW11dGFibGUgYnl0ZSBzZXF1ZW5jZSBbYl0uICopXG4gIGJ0cyAoQi51bnNhZmVfZXNjYXBlIGIpXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjIHMgbGltIGkgYyA9XG4gIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIGluZGV4X3JlYyBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4IHMgYyA9IGluZGV4X3JlYyBzIChsZW5ndGggcykgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfb3B0IHMgYyA9IGluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tIC8gQnl0ZXMuaW5kZXhfZnJvbVwiIGVsc2VcbiAgICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5pbmRleF9mcm9tX29wdCAvIEJ5dGVzLmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIGluZGV4X3JlY19vcHQgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWMgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSByaW5kZXhfcmVjIHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9mcm9tIHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tIC8gQnl0ZXMucmluZGV4X2Zyb21cIlxuICBlbHNlXG4gICAgcmluZGV4X3JlYyBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIHJpbmRleF9yZWNfb3B0IHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgcmluZGV4X3JlY19vcHQgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbV9vcHQgcyBpIGMgPVxuICBpZiBpIDwgLTEgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fb3B0IC8gQnl0ZXMucmluZGV4X2Zyb21fb3B0XCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWNfb3B0IHMgaSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWluc19mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuY29udGFpbnNfZnJvbSAvIEJ5dGVzLmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAoaW5kZXhfcmVjIHMgbCBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBjb250YWlucyBzIGMgPSBjb250YWluc19mcm9tIHMgMCBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJjb250YWluc19mcm9tIC8gQnl0ZXMucmNvbnRhaW5zX2Zyb21cIlxuICBlbHNlXG4gICAgdHJ5IGlnbm9yZSAocmluZGV4X3JlYyBzIGkgYyk7IHRydWUgd2l0aCBOb3RfZm91bmQgLT4gZmFsc2VcblxubGV0IHVwcGVyY2FzZV9hc2NpaSBzID1cbiAgQi51cHBlcmNhc2VfYXNjaWkgKGJvcyBzKSB8PiBidHNcbmxldCBsb3dlcmNhc2VfYXNjaWkgcyA9XG4gIEIubG93ZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi5jYXBpdGFsaXplX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgdW5jYXBpdGFsaXplX2FzY2lpIHMgPVxuICBCLnVuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBlbmRzX3dpdGggfnN1ZmZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9zdWYgPSBsZW5ndGggc3VmZml4IGluXG4gIGxldCBkaWZmID0gbGVuX3MgLSBsZW5fc3VmIGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fc3VmIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIChkaWZmICsgaSkgPD4gdW5zYWZlX2dldCBzdWZmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBkaWZmID49IDAgJiYgYXV4IDBcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2ggOiBpbnQgLT4gc3RyaW5nIC0+IGludCA9IFwiY2FtbF9zdHJpbmdfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2ggMCB4XG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBzcGxpdF9vbl9jaGFyIHNlcCBzID1cbiAgbGV0IHIgPSByZWYgW10gaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCBzKSBpblxuICBmb3IgaSA9IGxlbmd0aCBzIC0gMSBkb3dudG8gMCBkb1xuICAgIGlmIHVuc2FmZV9nZXQgcyBpID0gc2VwIHRoZW4gYmVnaW5cbiAgICAgIHIgOj0gc3ViIHMgKGkgKyAxKSAoIWogLSBpIC0gMSkgOjogIXI7XG4gICAgICBqIDo9IGlcbiAgICBlbmRcbiAgZG9uZTtcbiAgc3ViIHMgMCAhaiA6OiAhclxuXG50eXBlIHQgPSBzdHJpbmdcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxuZXh0ZXJuYWwgZXF1YWwgOiBzdHJpbmcgLT4gc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3RyaW5nX2VxdWFsXCIgW0BAbm9hbGxvY11cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gYm9zIHMgfD4gQi50b19zZXFcblxubGV0IHRvX3NlcWkgcyA9IGJvcyBzIHw+IEIudG9fc2VxaVxuXG5sZXQgb2Zfc2VxIGcgPSBCLm9mX3NlcSBnIHw+IGJ0c1xuXG4oKiBVVEYgZGVjb2RlcnMgYW5kIHZhbGlkYXRvcnMgKilcblxubGV0IGdldF91dGZfOF91Y2hhciBzIGkgPSBCLmdldF91dGZfOF91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfOCBzID0gQi5pc192YWxpZF91dGZfOCAoYm9zIHMpXG5cbmxldCBnZXRfdXRmXzE2YmVfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzE2YmVfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgcyA9IEIuaXNfdmFsaWRfdXRmXzE2YmUgKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmxlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmxlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmxlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmxlIChib3MgcylcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZy9kZWNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgZ2V0X3VpbnQ4IDogc3RyaW5nIC0+IGludCAtPiBpbnQgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlY2FtbF9zdHJpbmdfZ2V0MTZcIlxuZXh0ZXJuYWwgZ2V0X2ludDMyX25lIDogc3RyaW5nIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfc3RyaW5nX2dldDMyXCJcbmV4dGVybmFsIGdldF9pbnQ2NF9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX3N0cmluZ19nZXQ2NFwiXG5cbmxldCBnZXRfaW50OCBzIGkgPSBCLmdldF9pbnQ4IChib3MgcykgaVxubGV0IGdldF91aW50MTZfbGUgcyBpID0gQi5nZXRfdWludDE2X2xlIChib3MgcykgaVxubGV0IGdldF91aW50MTZfYmUgcyBpID0gQi5nZXRfdWludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9uZSBzIGkgPSBCLmdldF9pbnQxNl9uZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbGUgcyBpID0gQi5nZXRfaW50MTZfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2JlIHMgaSA9IEIuZ2V0X2ludDE2X2JlIChib3MgcykgaVxubGV0IGdldF9pbnQzMl9sZSBzIGkgPSBCLmdldF9pbnQzMl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfYmUgcyBpID0gQi5nZXRfaW50MzJfYmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDY0X2xlIHMgaSA9IEIuZ2V0X2ludDY0X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9iZSBzIGkgPSBCLmdldF9pbnQ2NF9iZSAoYm9zIHMpIGlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gdW5pdCA9ICgpXG5cbmxldCBlcXVhbCAoKSAoKSA9IHRydWVcbmxldCBjb21wYXJlICgpICgpID0gMFxubGV0IHRvX3N0cmluZyAoKSA9IFwiKClcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGV4dGVybl9mbGFncyA9XG4gICAgTm9fc2hhcmluZ1xuICB8IENsb3N1cmVzXG4gIHwgQ29tcGF0XzMyXG4oKiBub3RlOiB0aGlzIHR5cGUgZGVmaW5pdGlvbiBpcyB1c2VkIGluICdydW50aW1lL2RlYnVnZ2VyLmMnICopXG5cbmV4dGVybmFsIHRvX2NoYW5uZWw6IG91dF9jaGFubmVsIC0+ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVcIlxuZXh0ZXJuYWwgdG9fYnl0ZXM6ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IGJ5dGVzXG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzXCJcbmV4dGVybmFsIHRvX3N0cmluZzogJ2EgLT4gZXh0ZXJuX2ZsYWdzIGxpc3QgLT4gc3RyaW5nXG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZ1wiXG5leHRlcm5hbCB0b19idWZmZXJfdW5zYWZlOlxuICAgICAgYnl0ZXMgLT4gaW50IC0+IGludCAtPiAnYSAtPiBleHRlcm5fZmxhZ3MgbGlzdCAtPiBpbnRcbiAgICA9IFwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnVmZmVyXCJcblxubGV0IHRvX2J1ZmZlciBidWZmIG9mcyBsZW4gdiBmbGFncyA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC50b19idWZmZXI6IHN1YnN0cmluZyBvdXQgb2YgYm91bmRzXCJcbiAgZWxzZSB0b19idWZmZXJfdW5zYWZlIGJ1ZmYgb2ZzIGxlbiB2IGZsYWdzXG5cbigqIFRoZSBmdW5jdGlvbnMgYmVsb3cgdXNlIGJ5dGUgc2VxdWVuY2VzIGFzIGlucHV0LCBuZXZlciB1c2luZyBhbnlcbiAgIG11dGF0aW9uLiBJdCBtYWtlcyBzZW5zZSB0byB1c2Ugbm9uLW11dGF0ZWQgW2J5dGVzXSByYXRoZXIgdGhhblxuICAgW3N0cmluZ10sIGJlY2F1c2Ugd2UgcmVhbGx5IHdvcmsgd2l0aCBzZXF1ZW5jZXMgb2YgYnl0ZXMsIG5vdFxuICAgYSB0ZXh0IHJlcHJlc2VudGF0aW9uLlxuKilcblxuZXh0ZXJuYWwgZnJvbV9jaGFubmVsOiBpbl9jaGFubmVsIC0+ICdhID0gXCJjYW1sX2lucHV0X3ZhbHVlXCJcbmV4dGVybmFsIGZyb21fYnl0ZXNfdW5zYWZlOiBieXRlcyAtPiBpbnQgLT4gJ2EgPSBcImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlc1wiXG5leHRlcm5hbCBkYXRhX3NpemVfdW5zYWZlOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX21hcnNoYWxfZGF0YV9zaXplXCJcblxubGV0IGhlYWRlcl9zaXplID0gMjBcbmxldCBkYXRhX3NpemUgYnVmZiBvZnMgPVxuICBpZiBvZnMgPCAwIHx8IG9mcyA+IEJ5dGVzLmxlbmd0aCBidWZmIC0gaGVhZGVyX3NpemVcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIk1hcnNoYWwuZGF0YV9zaXplXCJcbiAgZWxzZSBkYXRhX3NpemVfdW5zYWZlIGJ1ZmYgb2ZzXG5sZXQgdG90YWxfc2l6ZSBidWZmIG9mcyA9IGhlYWRlcl9zaXplICsgZGF0YV9zaXplIGJ1ZmYgb2ZzXG5cbmxldCBmcm9tX2J5dGVzIGJ1ZmYgb2ZzID1cbiAgaWYgb2ZzIDwgMCB8fCBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIGhlYWRlcl9zaXplXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJNYXJzaGFsLmZyb21fYnl0ZXNcIlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IGxlbiA9IGRhdGFfc2l6ZV91bnNhZmUgYnVmZiBvZnMgaW5cbiAgICBpZiBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIChoZWFkZXJfc2l6ZSArIGxlbilcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC5mcm9tX2J5dGVzXCJcbiAgICBlbHNlIGZyb21fYnl0ZXNfdW5zYWZlIGJ1ZmYgb2ZzXG4gIGVuZFxuXG5sZXQgZnJvbV9zdHJpbmcgYnVmZiBvZnMgPVxuICAoKiBCeXRlcy51bnNhZmVfb2Zfc3RyaW5nIGlzIHNhZmUgaGVyZSwgYXMgdGhlIHByb2R1Y2VkIGJ5dGVcbiAgICAgc2VxdWVuY2UgaXMgbmV2ZXIgbXV0YXRlZCAqKVxuICBmcm9tX2J5dGVzIChCeXRlcy51bnNhZmVfb2Zfc3RyaW5nIGJ1ZmYpIG9mc1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgYXJyYXlzLiAqKVxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxuKCogQXJyYXkgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuZXh0ZXJuYWwgZ2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG5leHRlcm5hbCBzZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2dldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIGFycmF5ID0gXCJjYW1sX21ha2VfdmVjdFwiXG5leHRlcm5hbCBjcmVhdGU6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgdW5zYWZlX3N1YiA6ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfc3ViXCJcbmV4dGVybmFsIGFwcGVuZF9wcmltIDogJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfYXBwZW5kXCJcbmV4dGVybmFsIGNvbmNhdCA6ICdhIGFycmF5IGxpc3QgLT4gJ2EgYXJyYXkgPSBcImNhbWxfYXJyYXlfY29uY2F0XCJcbmV4dGVybmFsIHVuc2FmZV9ibGl0IDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+ICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9ibGl0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDpcbiAgJ2EgYXJyYXkgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2FycmF5X2ZpbGxcIlxuZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0OiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcblxubW9kdWxlIEZsb2F0YXJyYXkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IGZsb2F0YXJyYXkgPSBcImNhbWxfZmxvYXRhcnJheV9jcmVhdGVcIlxuICBleHRlcm5hbCBsZW5ndGggOiBmbG9hdGFycmF5IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdFxuICAgICAgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9zZXRcIlxuZW5kXG5cbmxldCBpbml0IGwgZiA9XG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlXG4gIGlmIGwgPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5pbml0XCJcbiAgKCogU2VlICM2NTc1LiBXZSBjb3VsZCBhbHNvIGNoZWNrIGZvciBtYXhpbXVtIGFycmF5IHNpemUsIGJ1dCB0aGlzIGRlcGVuZHNcbiAgICAgb24gd2hldGhlciB3ZSBjcmVhdGUgYSBmbG9hdCBhcnJheSBvciBhIHJlZ3VsYXIgb25lLi4uICopXG4gIGVsc2VcbiAgIGxldCByZXMgPSBjcmVhdGUgbCAoZiAwKSBpblxuICAgZm9yIGkgPSAxIHRvIHByZWQgbCBkb1xuICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICBkb25lO1xuICAgcmVzXG5cbmxldCBtYWtlX21hdHJpeCBzeCBzeSBpbml0ID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSBzeCBbfHxdIGluXG4gIGZvciB4ID0gMCB0byBwcmVkIHN4IGRvXG4gICAgdW5zYWZlX3NldCByZXMgeCAoY3JlYXRlIHN5IGluaXQpXG4gIGRvbmU7XG4gIHJlc1xuXG5sZXQgY29weSBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpbiBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSB1bnNhZmVfc3ViIGEgMCBsXG5cbmxldCBhcHBlbmQgYTEgYTIgPVxuICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgaWYgbDEgPSAwIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGxlbmd0aCBhMiA9IDAgdGhlbiB1bnNhZmVfc3ViIGExIDAgbDFcbiAgZWxzZSBhcHBlbmRfcHJpbSBhMSBhMlxuXG5sZXQgc3ViIGEgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuc3ViXCJcbiAgZWxzZSB1bnNhZmVfc3ViIGEgb2ZzIGxlblxuXG5sZXQgZmlsbCBhIG9mcyBsZW4gdiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggYSAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZmlsbFwiXG4gIGVsc2UgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxubGV0IGJsaXQgYTEgb2ZzMSBhMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IGxlbmd0aCBhMSAtIGxlblxuICAgICAgICAgICAgIHx8IG9mczIgPCAwIHx8IG9mczIgPiBsZW5ndGggYTIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmJsaXRcIlxuICBlbHNlIHVuc2FmZV9ibGl0IGExIG9mczEgYTIgb2ZzMiBsZW5cblxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBpdGVyMiBmIGEgYiA9XG4gIGlmIGxlbmd0aCBhIDw+IGxlbmd0aCBiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2VcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpIGRvbmVcblxubGV0IG1hcCBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZih1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZih1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgbWFwMiBmIGEgYiA9XG4gIGxldCBsYSA9IGxlbmd0aCBhIGluXG4gIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gIGlmIGxhIDw+IGxiIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIkFycmF5Lm1hcDI6IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoXCJcbiAgZWxzZSBiZWdpblxuICAgIGlmIGxhID0gMCB0aGVuIFt8fF0gZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgKGYgKHVuc2FmZV9nZXQgYSAwKSAodW5zYWZlX2dldCBiIDApKSBpblxuICAgICAgZm9yIGkgPSAxIHRvIGxhIC0gMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpICh1bnNhZmVfZ2V0IGIgaSkpXG4gICAgICBkb25lO1xuICAgICAgclxuICAgIGVuZFxuICBlbmRcblxubGV0IGl0ZXJpIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgbWFwaSBmIGEgPVxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGlmIGwgPSAwIHRoZW4gW3x8XSBlbHNlIGJlZ2luXG4gICAgbGV0IHIgPSBjcmVhdGUgbCAoZiAwICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgZm9yIGkgPSAxIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiBpICh1bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG4gIGVuZFxuXG5sZXQgdG9fbGlzdCBhID1cbiAgbGV0IHJlYyB0b2xpc3QgaSByZXMgPVxuICAgIGlmIGkgPCAwIHRoZW4gcmVzIGVsc2UgdG9saXN0IChpIC0gMSkgKHVuc2FmZV9nZXQgYSBpIDo6IHJlcykgaW5cbiAgdG9saXN0IChsZW5ndGggYSAtIDEpIFtdXG5cbigqIENhbm5vdCB1c2UgTGlzdC5sZW5ndGggaGVyZSBiZWNhdXNlIHRoZSBMaXN0IG1vZHVsZSBkZXBlbmRzIG9uIEFycmF5LiAqKVxubGV0IHJlYyBsaXN0X2xlbmd0aCBhY2N1ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBhY2N1XG4gIHwgXzo6dCAtPiBsaXN0X2xlbmd0aCAoc3VjYyBhY2N1KSB0XG5cbmxldCBvZl9saXN0ID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbfHxdXG4gIHwgaGQ6OnRsIGFzIGwgLT5cbiAgICAgIGxldCBhID0gY3JlYXRlIChsaXN0X2xlbmd0aCAwIGwpIGhkIGluXG4gICAgICBsZXQgcmVjIGZpbGwgaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgW10gLT4gYVxuICAgICAgICB8IGhkOjp0bCAtPiB1bnNhZmVfc2V0IGEgaSBoZDsgZmlsbCAoaSsxKSB0bCBpblxuICAgICAgZmlsbCAxIHRsXG5cbmxldCBmb2xkX2xlZnQgZiB4IGEgPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lO1xuICAhclxuXG5sZXQgZm9sZF9sZWZ0X21hcCBmIGFjYyBpbnB1dF9hcnJheSA9XG4gIGxldCBsZW4gPSBsZW5ndGggaW5wdXRfYXJyYXkgaW5cbiAgaWYgbGVuID0gMCB0aGVuIChhY2MsIFt8fF0pIGVsc2UgYmVnaW5cbiAgICBsZXQgYWNjLCBlbHQgPSBmIGFjYyAodW5zYWZlX2dldCBpbnB1dF9hcnJheSAwKSBpblxuICAgIGxldCBvdXRwdXRfYXJyYXkgPSBjcmVhdGUgbGVuIGVsdCBpblxuICAgIGxldCBhY2MgPSByZWYgYWNjIGluXG4gICAgZm9yIGkgPSAxIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCBhY2MnLCBlbHQgPSBmICFhY2MgKHVuc2FmZV9nZXQgaW5wdXRfYXJyYXkgaSkgaW5cbiAgICAgIGFjYyA6PSBhY2MnO1xuICAgICAgdW5zYWZlX3NldCBvdXRwdXRfYXJyYXkgaSBlbHQ7XG4gICAgZG9uZTtcbiAgICAhYWNjLCBvdXRwdXRfYXJyYXlcbiAgZW5kXG5cbmxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IGxlbmd0aCBhIC0gMSBkb3dudG8gMCBkb1xuICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gIGRvbmU7XG4gICFyXG5cbmxldCBleGlzdHMgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwgcCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IGZvcl9hbGwyIHAgbDEgbDIgPVxuICBsZXQgbjEgPSBsZW5ndGggbDFcbiAgYW5kIG4yID0gbGVuZ3RoIGwyIGluXG4gIGlmIG4xIDw+IG4yIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5mb3JfYWxsMlwiXG4gIGVsc2UgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuMSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgbDEgaSkgKHVuc2FmZV9nZXQgbDIgaSkgdGhlbiBsb29wIChzdWNjIGkpXG4gICAgZWxzZSBmYWxzZSBpblxuICBsb29wIDBcblxubGV0IGV4aXN0czIgcCBsMSBsMiA9XG4gIGxldCBuMSA9IGxlbmd0aCBsMVxuICBhbmQgbjIgPSBsZW5ndGggbDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmV4aXN0czJcIlxuICBlbHNlIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbjEgdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBsMSBpKSAodW5zYWZlX2dldCBsMiBpKSB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBtZW0geCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhIGkpIHggPSAwIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IG1lbXEgeCBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBmYWxzZVxuICAgIGVsc2UgaWYgeCA9PSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgIGVsc2UgbG9vcCAoc3VjYyBpKSBpblxuICBsb29wIDBcblxubGV0IGZpbmRfb3B0IHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIGlmIHAgeCB0aGVuIFNvbWUgeFxuICAgICAgZWxzZSBsb29wIChzdWNjIGkpXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgZmluZF9tYXAgZiBhID1cbiAgbGV0IG4gPSBsZW5ndGggYSBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4gdGhlbiBOb25lXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggZiAodW5zYWZlX2dldCBhIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIChzdWNjIGkpXG4gICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgaW5cbiAgbG9vcCAwXG5cbmxldCBzcGxpdCB4ID1cbiAgaWYgeCA9IFt8fF0gdGhlbiBbfHxdLCBbfHxdXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgYTAsIGIwID0gdW5zYWZlX2dldCB4IDAgaW5cbiAgICBsZXQgbiA9IGxlbmd0aCB4IGluXG4gICAgbGV0IGEgPSBjcmVhdGUgbiBhMCBpblxuICAgIGxldCBiID0gY3JlYXRlIG4gYjAgaW5cbiAgICBmb3IgaSA9IDEgdG8gbiAtIDEgZG9cbiAgICAgIGxldCBhaSwgYmkgPSB1bnNhZmVfZ2V0IHggaSBpblxuICAgICAgdW5zYWZlX3NldCBhIGkgYWk7XG4gICAgICB1bnNhZmVfc2V0IGIgaSBiaVxuICAgIGRvbmU7XG4gICAgYSwgYlxuICBlbmRcblxubGV0IGNvbWJpbmUgYSBiID1cbiAgbGV0IG5hID0gbGVuZ3RoIGEgaW5cbiAgbGV0IG5iID0gbGVuZ3RoIGIgaW5cbiAgaWYgbmEgPD4gbmIgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmNvbWJpbmVcIjtcbiAgaWYgbmEgPSAwIHRoZW4gW3x8XVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IHggPSBjcmVhdGUgbmEgKHVuc2FmZV9nZXQgYSAwLCB1bnNhZmVfZ2V0IGIgMCkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbmEgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHggaSAodW5zYWZlX2dldCBhIGksIHVuc2FmZV9nZXQgYiBpKVxuICAgIGRvbmU7XG4gICAgeFxuICBlbmRcblxuZXhjZXB0aW9uIEJvdHRvbSBvZiBpbnRcbmxldCBzb3J0IGNtcCBhID1cbiAgbGV0IG1heHNvbiBsIGkgPVxuICAgIGxldCBpMzEgPSBpK2kraSsxIGluXG4gICAgbGV0IHggPSByZWYgaTMxIGluXG4gICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgIGlmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwIHRoZW4geCA6PSBpMzErMTtcbiAgICAgIGlmIGNtcCAoZ2V0IGEgIXgpIChnZXQgYSAoaTMxKzIpKSA8IDAgdGhlbiB4IDo9IGkzMSsyO1xuICAgICAgIXhcbiAgICBlbmQgZWxzZVxuICAgICAgaWYgaTMxKzEgPCBsICYmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwXG4gICAgICB0aGVuIGkzMSsxXG4gICAgICBlbHNlIGlmIGkzMSA8IGwgdGhlbiBpMzEgZWxzZSByYWlzZSAoQm90dG9tIGkpXG4gIGluXG4gIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgIGlmIGNtcCAoZ2V0IGEgaikgZSA+IDAgdGhlbiBiZWdpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICB0cmlja2xlZG93biBsIGogZTtcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgc2V0IGEgaSBlO1xuICAgIGVuZDtcbiAgaW5cbiAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgbGV0IHJlYyBidWJibGVkb3duIGwgaSA9XG4gICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgYnViYmxlZG93biBsIGpcbiAgaW5cbiAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gIGxldCByZWMgdHJpY2tsZXVwIGkgZSA9XG4gICAgbGV0IGZhdGhlciA9IChpIC0gMSkgLyAzIGluXG4gICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgaWYgY21wIChnZXQgYSBmYXRoZXIpIGUgPCAwIHRoZW4gYmVnaW5cbiAgICAgIHNldCBhIGkgKGdldCBhIGZhdGhlcik7XG4gICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICBzZXQgYSBpIGU7XG4gICAgZW5kO1xuICBpblxuICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgZm9yIGkgPSBsIC0gMSBkb3dudG8gMiBkb1xuICAgIGxldCBlID0gKGdldCBhIGkpIGluXG4gICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgdHJpY2tsZXVwIChidWJibGUgaSAwKSBlO1xuICBkb25lO1xuICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG5cbmxldCBjdXRvZmYgPSA1XG5sZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICBsZXQgbWVyZ2Ugc3JjMW9mcyBzcmMxbGVuIHNyYzIgc3JjMm9mcyBzcmMybGVuIGRzdCBkc3RvZnMgPVxuICAgIGxldCBzcmMxciA9IHNyYzFvZnMgKyBzcmMxbGVuIGFuZCBzcmMyciA9IHNyYzJvZnMgKyBzcmMybGVuIGluXG4gICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgaWYgY21wIHMxIHMyIDw9IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgZHN0IGQgczE7XG4gICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICBpZiBpMSA8IHNyYzFyIHRoZW5cbiAgICAgICAgICBsb29wIGkxIChnZXQgYSBpMSkgaTIgczIgKGQgKyAxKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgYmxpdCBzcmMyIGkyIGRzdCAoZCArIDEpIChzcmMyciAtIGkyKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICBsZXQgaTIgPSBpMiArIDEgaW5cbiAgICAgICAgaWYgaTIgPCBzcmMyciB0aGVuXG4gICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJsaXQgYSBpMSBkc3QgKGQgKyAxKSAoc3JjMXIgLSBpMSlcbiAgICAgIGVuZFxuICAgIGluIGxvb3Agc3JjMW9mcyAoZ2V0IGEgc3JjMW9mcykgc3JjMm9mcyAoZ2V0IHNyYzIgc3JjMm9mcykgZHN0b2ZzO1xuICBpblxuICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSAoc3Jjb2ZzICsgaSkpIGluXG4gICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICB3aGlsZSAoIWogPj0gZHN0b2ZzICYmIGNtcCAoZ2V0IGRzdCAhaikgZSA+IDApIGRvXG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgKGdldCBkc3QgIWopO1xuICAgICAgICBkZWNyIGo7XG4gICAgICBkb25lO1xuICAgICAgc2V0IGRzdCAoIWogKyAxKSBlO1xuICAgIGRvbmU7XG4gIGluXG4gIGxldCByZWMgc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgIGxldCBsMSA9IGxlbiAvIDIgaW5cbiAgICAgIGxldCBsMiA9IGxlbiAtIGwxIGluXG4gICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgIHNvcnR0byBzcmNvZnMgYSAoc3Jjb2ZzICsgbDIpIGwxO1xuICAgICAgbWVyZ2UgKHNyY29mcyArIGwyKSBsMSBkc3QgKGRzdG9mcyArIGwxKSBsMiBkc3QgZHN0b2ZzO1xuICAgIGVuZDtcbiAgaW5cbiAgbGV0IGwgPSBsZW5ndGggYSBpblxuICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgbGV0IGwxID0gbCAvIDIgaW5cbiAgICBsZXQgbDIgPSBsIC0gbDEgaW5cbiAgICBsZXQgdCA9IG1ha2UgbDIgKGdldCBhIDApIGluXG4gICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICBzb3J0dG8gMCBhIGwyIGwxO1xuICAgIG1lcmdlIGwyIGwxIHQgMCBsMiBhIDA7XG4gIGVuZFxuXG5cbmxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGEgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICB0aGVuXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICAgIGVsc2UgU2VxLk5pbFxuICBpblxuICBhdXggMFxuXG5sZXQgdG9fc2VxaSBhID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgdGhlblxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gICAgZWxzZSBTZXEuTmlsXG4gIGluXG4gIGF1eCAwXG5cbmxldCBvZl9yZXZfbGlzdCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW3x8XVxuICB8IGhkOjp0bCBhcyBsIC0+XG4gICAgICBsZXQgbGVuID0gbGlzdF9sZW5ndGggMCBsIGluXG4gICAgICBsZXQgYSA9IGNyZWF0ZSBsZW4gaGQgaW5cbiAgICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgICBbXSAtPiBhXG4gICAgICAgIHwgaGQ6OnRsIC0+IHVuc2FmZV9zZXQgYSBpIGhkOyBmaWxsIChpLTEpIHRsXG4gICAgICBpblxuICAgICAgZmlsbCAobGVuLTIpIHRsXG5cbmxldCBvZl9zZXEgaSA9XG4gIGxldCBsID0gU2VxLmZvbGRfbGVmdCAoZnVuIGFjYyB4IC0+IHg6OmFjYykgW10gaSBpblxuICBvZl9yZXZfbGlzdCBsXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgT2plZGEgQmFyLCBMZXhpRmkgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIG5lZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlbmVnZmxvYXRcIlxuZXh0ZXJuYWwgYWRkIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVhZGRmbG9hdFwiXG5leHRlcm5hbCBzdWIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJXN1YmZsb2F0XCJcbmV4dGVybmFsIG11bCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlbXVsZmxvYXRcIlxuZXh0ZXJuYWwgZGl2IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVkaXZmbG9hdFwiXG5leHRlcm5hbCByZW0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbW9kX2Zsb2F0XCIgXCJmbW9kXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZtYSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2ZtYV9mbG9hdFwiIFwiY2FtbF9mbWFcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWJzIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVhYnNmbG9hdFwiXG5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IGluZmluaXR5ID0gU3RkbGliLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gU3RkbGliLm5lZ19pbmZpbml0eVxubGV0IG5hbiA9IFN0ZGxpYi5uYW5cbmxldCBpc19maW5pdGUgKHg6IGZsb2F0KSA9IHggLS4geCA9IDAuXG5sZXQgaXNfaW5maW5pdGUgKHg6IGZsb2F0KSA9IDEuIC8uIHggPSAwLlxubGV0IGlzX25hbiAoeDogZmxvYXQpID0geCA8PiB4XG5cbmxldCBwaSA9IDB4MS45MjFmYjU0NDQyZDE4cCsxXG5sZXQgbWF4X2Zsb2F0ID0gU3RkbGliLm1heF9mbG9hdFxubGV0IG1pbl9mbG9hdCA9IFN0ZGxpYi5taW5fZmxvYXRcbmxldCBlcHNpbG9uID0gU3RkbGliLmVwc2lsb25fZmxvYXRcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0b2ZpbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcbmxldCBvZl9zdHJpbmdfb3B0ID0gU3RkbGliLmZsb2F0X29mX3N0cmluZ19vcHRcbmxldCB0b19zdHJpbmcgPSBTdGRsaWIuc3RyaW5nX29mX2Zsb2F0XG50eXBlIGZwY2xhc3MgPSBTdGRsaWIuZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcG93IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcG93ZXJfZmxvYXRcIiBcInBvd1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjYnJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2JydF9mbG9hdFwiIFwiY2FtbF9jYnJ0XCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cF9mbG9hdFwiIFwiZXhwXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGV4cDIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHAyX2Zsb2F0XCIgXCJjYW1sX2V4cDJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbG9nMiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzJfZmxvYXRcIiBcImNhbWxfbG9nMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuX2Zsb2F0XCIgXCJ0YW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5fZmxvYXRcIiBcImF0YW5cIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuMl9mbG9hdFwiIFwiYXRhbjJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc2hfZmxvYXRcIiBcImNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYWNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zaF9mbG9hdFwiIFwiY2FtbF9hY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5oX2Zsb2F0XCIgXCJjYW1sX2FzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbmhfZmxvYXRcIiBcImNhbWxfYXRhbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmX2Zsb2F0XCIgXCJjYW1sX2VyZlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBlcmZjIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXJmY19mbG9hdFwiIFwiY2FtbF9lcmZjXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRydW5jIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdHJ1bmNfZmxvYXRcIiBcImNhbWxfdHJ1bmNcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9yb3VuZF9mbG9hdFwiIFwiY2FtbF9yb3VuZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjZWlsIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY2VpbF9mbG9hdFwiIFwiY2VpbFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Zsb29yX2Zsb2F0XCIgXCJmbG9vclwiXG5bQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgaXNfaW50ZWdlciB4ID0geCA9IHRydW5jIHggJiYgaXNfZmluaXRlIHhcblxuZXh0ZXJuYWwgbmV4dF9hZnRlciA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gID0gXCJjYW1sX25leHRhZnRlcl9mbG9hdFwiIFwiY2FtbF9uZXh0YWZ0ZXJcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgc3VjYyB4ID0gbmV4dF9hZnRlciB4IGluZmluaXR5XG5sZXQgcHJlZCB4ID0gbmV4dF9hZnRlciB4IG5lZ19pbmZpbml0eVxuXG5leHRlcm5hbCBjb3B5X3NpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpZ25fYml0IDogKGZsb2F0IFtAdW5ib3hlZF0pIC0+IGJvb2xcbiAgPSBcImNhbWxfc2lnbmJpdF9mbG9hdFwiIFwiY2FtbF9zaWduYml0XCIgW0BAbm9hbGxvY11cblxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbnR5cGUgdCA9IGZsb2F0XG5leHRlcm5hbCBjb21wYXJlIDogZmxvYXQgLT4gZmxvYXQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5sZXQgZXF1YWwgeCB5ID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldFtAaW5saW5lXSBtaW4gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuICBlbHNlIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIHlcblxubGV0W0BpbmxpbmVdIG1heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heCAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB8fCBpc19uYW4geSB0aGVuIChuYW4sIG5hbilcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgsIHkpIGVsc2UgKHksIHgpXG5cbmxldFtAaW5saW5lXSBtaW5fbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXhfbnVtICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIHlcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG5cbmxldFtAaW5saW5lXSBtaW5fbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiBpc19uYW4geCB0aGVuICh5LHkpXG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiAoeCx4KVxuICBlbHNlIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlbiAoeCx5KSBlbHNlICh5LHgpXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDogaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgLT4gaW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9oYXNoXCIgW0BAbm9hbGxvY11cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuXG4gIHR5cGUgdCA9IGZsb2F0YXJyYXlcblxuICBleHRlcm5hbCBsZW5ndGggOiB0IC0+IGludCA9IFwiJWZsb2F0YXJyYXlfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gdCA9IFwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZVwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiB0IC0+IGludCAtPiBmbG9hdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiB0IC0+IGludCAtPiBmbG9hdCAtPiB1bml0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcblxuICBsZXQgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGZvciBpID0gb2ZzIHRvIG9mcyArIGxlbiAtIDEgZG8gdW5zYWZlX3NldCBhIGkgdiBkb25lXG5cbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXQ6IHQgLT4gaW50IC0+IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID1cbiAgICBcImNhbWxfZmxvYXRhcnJheV9ibGl0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY2hlY2sgYSBvZnMgbGVuIG1zZyA9XG4gICAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyArIGxlbiA8IDAgfHwgb2ZzICsgbGVuID4gbGVuZ3RoIGEgdGhlblxuICAgICAgaW52YWxpZF9hcmcgbXNnXG5cbiAgbGV0IG1ha2UgbiB2ID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIG4gaW5cbiAgICB1bnNhZmVfZmlsbCByZXN1bHQgMCBuIHY7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGluaXQgbCBmID1cbiAgICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkuaW5pdFwiXG4gICAgZWxzZVxuICAgICAgbGV0IHJlcyA9IGNyZWF0ZSBsIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgICAgZG9uZTtcbiAgICAgIHJlc1xuXG4gIGxldCBhcHBlbmQgYTEgYTIgPVxuICAgIGxldCBsMSA9IGxlbmd0aCBhMSBpblxuICAgIGxldCBsMiA9IGxlbmd0aCBhMiBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgKGwxICsgbDIpIGluXG4gICAgdW5zYWZlX2JsaXQgYTEgMCByZXN1bHQgMCBsMTtcbiAgICB1bnNhZmVfYmxpdCBhMiAwIHJlc3VsdCBsMSBsMjtcbiAgICByZXN1bHRcblxuICAoKiBuZXh0IDMgZnVuY3Rpb25zOiBtb2RpZmllZCBjb3B5IG9mIGNvZGUgZnJvbSBzdHJpbmcubWwgKilcbiAgbGV0IGVuc3VyZV9nZSAoeDppbnQpIHkgPVxuICAgIGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmNvbmNhdFwiXG5cbiAgbGV0IHJlYyBzdW1fbGVuZ3RocyBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjXG4gICAgfCBoZCA6OiB0bCAtPiBzdW1fbGVuZ3RocyAoZW5zdXJlX2dlIChsZW5ndGggaGQgKyBhY2MpIGFjYykgdGxcblxuICBsZXQgY29uY2F0IGwgPVxuICAgIGxldCBsZW4gPSBzdW1fbGVuZ3RocyAwIGwgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgbG9vcCBsIGkgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCAoaSA9IGxlbilcbiAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgbGV0IGhsZW4gPSBsZW5ndGggaGQgaW5cbiAgICAgICAgdW5zYWZlX2JsaXQgaGQgMCByZXN1bHQgaSBobGVuO1xuICAgICAgICBsb29wIHRsIChpICsgaGxlbilcbiAgICBpblxuICAgIGxvb3AgbCAwO1xuICAgIHJlc3VsdFxuXG4gIGxldCBzdWIgYSBvZnMgbGVuID1cbiAgICBjaGVjayBhIG9mcyBsZW4gXCJGbG9hdC5BcnJheS5zdWJcIjtcbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIGxlbiBpblxuICAgIHVuc2FmZV9ibGl0IGEgb2ZzIHJlc3VsdCAwIGxlbjtcbiAgICByZXN1bHRcblxuICBsZXQgY29weSBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSBsIGluXG4gICAgdW5zYWZlX2JsaXQgYSAwIHJlc3VsdCAwIGw7XG4gICAgcmVzdWx0XG5cbiAgbGV0IGZpbGwgYSBvZnMgbGVuIHYgPVxuICAgIGNoZWNrIGEgb2ZzIGxlbiBcIkZsb2F0LkFycmF5LmZpbGxcIjtcbiAgICB1bnNhZmVfZmlsbCBhIG9mcyBsZW4gdlxuXG4gIGxldCBibGl0IHNyYyBzb2ZzIGRzdCBkb2ZzIGxlbiA9XG4gICAgY2hlY2sgc3JjIHNvZnMgbGVuIFwiRmxvYXQuYXJyYXkuYmxpdFwiO1xuICAgIGNoZWNrIGRzdCBkb2ZzIGxlbiBcIkZsb2F0LmFycmF5LmJsaXRcIjtcbiAgICB1bnNhZmVfYmxpdCBzcmMgc29mcyBkc3QgZG9mcyBsZW5cblxuICBsZXQgdG9fbGlzdCBhID1cbiAgICBMaXN0LmluaXQgKGxlbmd0aCBhKSAodW5zYWZlX2dldCBhKVxuXG4gIGxldCBvZl9saXN0IGwgPVxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgKExpc3QubGVuZ3RoIGwpIGluXG4gICAgbGV0IHJlYyBmaWxsIGkgbCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gcmVzdWx0XG4gICAgICB8IGggOjogdCAtPiB1bnNhZmVfc2V0IHJlc3VsdCBpIGg7IGZpbGwgKGkgKyAxKSB0XG4gICAgaW5cbiAgICBmaWxsIDAgbFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgaXRlciBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXIyIGYgYSBiID1cbiAgICBpZiBsZW5ndGggYSA8PiBsZW5ndGggYiB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5Lml0ZXIyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSBkb25lXG5cbiAgbGV0IG1hcCBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gIGxldCBtYXAyIGYgYSBiID1cbiAgICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICAgIGxldCBsYiA9IGxlbmd0aCBiIGluXG4gICAgaWYgbGEgPD4gbGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBjcmVhdGUgbGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXJpIGYgYSA9XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgbGV0IG1hcGkgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgICBsZXQgciA9IHJlZiB4IGluXG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgICBkb25lO1xuICAgICFyXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb2xkX3JpZ2h0IGYgYSB4ID1cbiAgICBsZXQgciA9IHJlZiB4IGluXG4gICAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDAgZG9cbiAgICAgIHIgOj0gZiAodW5zYWZlX2dldCBhIGkpICFyXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZXhpc3RzIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvcl9hbGwgcCBhID1cbiAgICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IG4gdGhlbiB0cnVlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIGxvb3AgKGkgKyAxKVxuICAgICAgZWxzZSBmYWxzZSBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgbWVtIHggYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhIGkpIHggPSAwIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwsIGJ1dCBzbGlnaHRseSBkaWZmZXJlbnQgKilcbiAgbGV0IG1lbV9pZWVlIHggYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgaWYgeCA9ICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiB0cnVlXG4gICAgICBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGV4Y2VwdGlvbiBCb3R0b20gb2YgaW50XG4gIGxldCBzb3J0IGNtcCBhID1cbiAgICBsZXQgbWF4c29uIGwgaSA9XG4gICAgICBsZXQgaTMxID0gaStpK2krMSBpblxuICAgICAgbGV0IHggPSByZWYgaTMxIGluXG4gICAgICBpZiBpMzErMiA8IGwgdGhlbiBiZWdpblxuICAgICAgICBpZiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMCB0aGVuIHggOj0gaTMxKzE7XG4gICAgICAgIGlmIGNtcCAoZ2V0IGEgIXgpIChnZXQgYSAoaTMxKzIpKSA8IDAgdGhlbiB4IDo9IGkzMSsyO1xuICAgICAgICAheFxuICAgICAgZW5kIGVsc2VcbiAgICAgICAgaWYgaTMxKzEgPCBsICYmIGNtcCAoZ2V0IGEgaTMxKSAoZ2V0IGEgKGkzMSsxKSkgPCAwXG4gICAgICAgIHRoZW4gaTMxKzFcbiAgICAgICAgZWxzZSBpZiBpMzEgPCBsIHRoZW4gaTMxIGVsc2UgcmFpc2UgKEJvdHRvbSBpKVxuICAgIGluXG4gICAgbGV0IHJlYyB0cmlja2xlZG93biBsIGkgZSA9XG4gICAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICAgIGlmIGNtcCAoZ2V0IGEgaikgZSA+IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgICAgdHJpY2tsZWRvd24gbCBqIGU7XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgYSBpIGU7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsZXQgdHJpY2tsZSBsIGkgZSA9IHRyeSB0cmlja2xlZG93biBsIGkgZSB3aXRoIEJvdHRvbSBpIC0+IHNldCBhIGkgZSBpblxuICAgIGxldCByZWMgYnViYmxlZG93biBsIGkgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBzZXQgYSBpIChnZXQgYSBqKTtcbiAgICAgIGJ1YmJsZWRvd24gbCBqXG4gICAgaW5cbiAgICBsZXQgYnViYmxlIGwgaSA9IHRyeSBidWJibGVkb3duIGwgaSB3aXRoIEJvdHRvbSBpIC0+IGkgaW5cbiAgICBsZXQgcmVjIHRyaWNrbGV1cCBpIGUgPVxuICAgICAgbGV0IGZhdGhlciA9IChpIC0gMSkgLyAzIGluXG4gICAgICBhc3NlcnQgKGkgPD4gZmF0aGVyKTtcbiAgICAgIGlmIGNtcCAoZ2V0IGEgZmF0aGVyKSBlIDwgMCB0aGVuIGJlZ2luXG4gICAgICAgIHNldCBhIGkgKGdldCBhIGZhdGhlcik7XG4gICAgICAgIGlmIGZhdGhlciA+IDAgdGhlbiB0cmlja2xldXAgZmF0aGVyIGUgZWxzZSBzZXQgYSAwIGU7XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXQgYSBpIGU7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgZm9yIGkgPSAobCArIDEpIC8gMyAtIDEgZG93bnRvIDAgZG8gdHJpY2tsZSBsIGkgKGdldCBhIGkpOyBkb25lO1xuICAgIGZvciBpID0gbCAtIDEgZG93bnRvIDIgZG9cbiAgICAgIGxldCBlID0gKGdldCBhIGkpIGluXG4gICAgICBzZXQgYSBpIChnZXQgYSAwKTtcbiAgICAgIHRyaWNrbGV1cCAoYnViYmxlIGkgMCkgZTtcbiAgICBkb25lO1xuICAgIGlmIGwgPiAxIHRoZW4gKGxldCBlID0gKGdldCBhIDEpIGluIHNldCBhIDEgKGdldCBhIDApOyBzZXQgYSAwIGUpXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBleGNlcHQgZm9yIHRoZSBjYWxsIHRvIFtjcmVhdGVdICopXG4gIGxldCBjdXRvZmYgPSA1XG4gIGxldCBzdGFibGVfc29ydCBjbXAgYSA9XG4gICAgbGV0IG1lcmdlIHNyYzFvZnMgc3JjMWxlbiBzcmMyIHNyYzJvZnMgc3JjMmxlbiBkc3QgZHN0b2ZzID1cbiAgICAgIGxldCBzcmMxciA9IHNyYzFvZnMgKyBzcmMxbGVuIGFuZCBzcmMyciA9IHNyYzJvZnMgKyBzcmMybGVuIGluXG4gICAgICBsZXQgcmVjIGxvb3AgaTEgczEgaTIgczIgZCA9XG4gICAgICAgIGlmIGNtcCBzMSBzMiA8PSAwIHRoZW4gYmVnaW5cbiAgICAgICAgICBzZXQgZHN0IGQgczE7XG4gICAgICAgICAgbGV0IGkxID0gaTEgKyAxIGluXG4gICAgICAgICAgaWYgaTEgPCBzcmMxciB0aGVuXG4gICAgICAgICAgICBsb29wIGkxIChnZXQgYSBpMSkgaTIgczIgKGQgKyAxKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJsaXQgc3JjMiBpMiBkc3QgKGQgKyAxKSAoc3JjMnIgLSBpMilcbiAgICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICBzZXQgZHN0IGQgczI7XG4gICAgICAgICAgbGV0IGkyID0gaTIgKyAxIGluXG4gICAgICAgICAgaWYgaTIgPCBzcmMyciB0aGVuXG4gICAgICAgICAgICBsb29wIGkxIHMxIGkyIChnZXQgc3JjMiBpMikgKGQgKyAxKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGJsaXQgYSBpMSBkc3QgKGQgKyAxKSAoc3JjMXIgLSBpMSlcbiAgICAgICAgZW5kXG4gICAgICBpbiBsb29wIHNyYzFvZnMgKGdldCBhIHNyYzFvZnMpIHNyYzJvZnMgKGdldCBzcmMyIHNyYzJvZnMpIGRzdG9mcztcbiAgICBpblxuICAgIGxldCBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgICBsZXQgZSA9IChnZXQgYSAoc3Jjb2ZzICsgaSkpIGluXG4gICAgICAgIGxldCBqID0gcmVmIChkc3RvZnMgKyBpIC0gMSkgaW5cbiAgICAgICAgd2hpbGUgKCFqID49IGRzdG9mcyAmJiBjbXAgKGdldCBkc3QgIWopIGUgPiAwKSBkb1xuICAgICAgICAgIHNldCBkc3QgKCFqICsgMSkgKGdldCBkc3QgIWopO1xuICAgICAgICAgIGRlY3IgajtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgc2V0IGRzdCAoIWogKyAxKSBlO1xuICAgICAgZG9uZTtcbiAgICBpblxuICAgIGxldCByZWMgc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiA9XG4gICAgICBpZiBsZW4gPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gZWxzZSBiZWdpblxuICAgICAgICBsZXQgbDEgPSBsZW4gLyAyIGluXG4gICAgICAgIGxldCBsMiA9IGxlbiAtIGwxIGluXG4gICAgICAgIHNvcnR0byAoc3Jjb2ZzICsgbDEpIGRzdCAoZHN0b2ZzICsgbDEpIGwyO1xuICAgICAgICBzb3J0dG8gc3Jjb2ZzIGEgKHNyY29mcyArIGwyKSBsMTtcbiAgICAgICAgbWVyZ2UgKHNyY29mcyArIGwyKSBsMSBkc3QgKGRzdG9mcyArIGwxKSBsMiBkc3QgZHN0b2ZzO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGlmIGwgPD0gY3V0b2ZmIHRoZW4gaXNvcnR0byAwIGEgMCBsIGVsc2UgYmVnaW5cbiAgICAgIGxldCBsMSA9IGwgLyAyIGluXG4gICAgICBsZXQgbDIgPSBsIC0gbDEgaW5cbiAgICAgIGxldCB0ID0gY3JlYXRlIGwyIGluXG4gICAgICBzb3J0dG8gbDEgdCAwIGwyO1xuICAgICAgc29ydHRvIDAgYSBsMiBsMTtcbiAgICAgIG1lcmdlIGwyIGwxIHQgMCBsMiBhIDA7XG4gICAgZW5kXG5cbiAgbGV0IGZhc3Rfc29ydCA9IHN0YWJsZV9zb3J0XG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCB0b19zZXEgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoeCwgYXV4IChpKzEpKVxuICAgICAgZWxzZSBTZXEuTmlsXG4gICAgaW5cbiAgICBhdXggMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxaSBhID1cbiAgICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAgIGlmIGkgPCBsZW5ndGggYVxuICAgICAgdGhlblxuICAgICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICAgICAgZWxzZSBTZXEuTmlsXG4gICAgaW5cbiAgICBhdXggMFxuXG4gICgqIG1vc3RseSBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG9mX3Jldl9saXN0IGwgPVxuICAgIGxldCBsZW4gPSBMaXN0Lmxlbmd0aCBsIGluXG4gICAgbGV0IGEgPSBjcmVhdGUgbGVuIGluXG4gICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICBbXSAtPiBhXG4gICAgICB8IGhkOjp0bCAtPiB1bnNhZmVfc2V0IGEgaSBoZDsgZmlsbCAoaS0xKSB0bFxuICAgIGluXG4gICAgZmlsbCAobGVuLTEpIGxcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG9mX3NlcSBpID1cbiAgICBsZXQgbCA9IFNlcS5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiB4OjphY2MpIFtdIGkgaW5cbiAgICBvZl9yZXZfbGlzdCBsXG5cblxuICBsZXQgbWFwX3RvX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGlmIGwgPSAwIHRoZW4gW3wgfF0gZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBBcnJheS5tYWtlIGwgKGYgKHVuc2FmZV9nZXQgYSAwKSkgaW5cbiAgICAgIGZvciBpID0gMSB0byBsIC0gMSBkb1xuICAgICAgICBBcnJheS51bnNhZmVfc2V0IHIgaSAoZiAodW5zYWZlX2dldCBhIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcblxuICBsZXQgbWFwX2Zyb21fYXJyYXkgZiBhID1cbiAgICBsZXQgbCA9IEFycmF5Lmxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgKEFycmF5LnVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcblxuZW5kXG5cbm1vZHVsZSBBcnJheUxhYmVscyA9IEFycmF5XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50MzJdOiAzMi1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDMyIC0+IGludCAtPiBpbnQzMiA9IFwiJWludDMyX2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50MzIgLT4gaW50ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDMyIC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDMyX3RvX2Zsb2F0XCIgXCJjYW1sX2ludDMyX3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50MzJfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbmxldCB6ZXJvID0gMGxcbmxldCBvbmUgPSAxbFxubGV0IG1pbnVzX29uZSA9IC0xbFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFsXG5sZXQgcHJlZCBuID0gc3ViIG4gMWxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMGwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMGxcbmxldCBtYXhfaW50ID0gMHg3RkZGRkZGRmxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMWwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBtYXRjaCBTeXMud29yZF9zaXplIHdpdGhcbiAgfCAzMiAtPlxuICAgICAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgICAgIGZ1biBuIC0+XG4gICAgICAgIGlmIGNvbXBhcmUgemVybyBuIDw9IDAgJiYgY29tcGFyZSBuIG1heF9pbnQgPD0gMCB0aGVuXG4gICAgICAgICAgU29tZSAodG9faW50IG4pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBOb25lXG4gIHwgNjQgLT5cbiAgICAgICgqIFNvIHRoYXQgaXQgY29tcGlsZXMgaW4gMzItYml0ICopXG4gICAgICBsZXQgbWFzayA9IDB4RkZGRiBsc2wgMTYgbG9yIDB4RkZGRiBpblxuICAgICAgZnVuIG4gLT4gU29tZSAodG9faW50IG4gbGFuZCBtYXNrKVxuICB8IF8gLT5cbiAgICAgIGFzc2VydCBmYWxzZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDMyID0gXCJjYW1sX2ludDMyX29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBpbnQzMlxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lXG4gICBiaXRuZXNzLiBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSBuIGQgPCAwIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIHIgZCA+PSAwIHRoZW4gc3VjYyBxIGVsc2UgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbSW50NjRdOiA2NC1iaXQgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnIDogaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9uZWdcIlxuZXh0ZXJuYWwgYWRkIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9hZGRcIlxuZXh0ZXJuYWwgc3ViIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9zdWJcIlxuZXh0ZXJuYWwgbXVsIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9tdWxcIlxuZXh0ZXJuYWwgZGl2IDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9kaXZcIlxuZXh0ZXJuYWwgcmVtIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9hbmRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X29yXCJcbmV4dGVybmFsIGxvZ3hvciA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQ2NCAtPiBpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9sc2xcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHQgOiBpbnQ2NCAtPiBpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IGludDY0IC0+IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X2xzclwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50IDogaW50NjQgLT4gaW50ID0gXCIlaW50NjRfdG9faW50XCJcbmV4dGVybmFsIG9mX2Zsb2F0IDogZmxvYXQgLT4gaW50NjRcbiAgPSBcImNhbWxfaW50NjRfb2ZfZmxvYXRcIiBcImNhbWxfaW50NjRfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0b19mbG9hdCA6IGludDY0IC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDY0X3RvX2Zsb2F0XCIgXCJjYW1sX2ludDY0X3RvX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgb2ZfaW50MzIgOiBpbnQzMiAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludDMyXCJcbmV4dGVybmFsIHRvX2ludDMyIDogaW50NjQgLT4gaW50MzIgPSBcIiVpbnQ2NF90b19pbnQzMlwiXG5leHRlcm5hbCBvZl9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9vZl9uYXRpdmVpbnRcIlxuZXh0ZXJuYWwgdG9fbmF0aXZlaW50IDogaW50NjQgLT4gbmF0aXZlaW50ID0gXCIlaW50NjRfdG9fbmF0aXZlaW50XCJcblxubGV0IHplcm8gPSAwTFxubGV0IG9uZSA9IDFMXG5sZXQgbWludXNfb25lID0gLTFMXG5sZXQgc3VjYyBuID0gYWRkIG4gMUxcbmxldCBwcmVkIG4gPSBzdWIgbiAxTFxubGV0IGFicyBuID0gaWYgbiA+PSAwTCB0aGVuIG4gZWxzZSBuZWcgblxubGV0IG1pbl9pbnQgPSAweDgwMDAwMDAwMDAwMDAwMDBMXG5sZXQgbWF4X2ludCA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxcbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMUwpXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICBmdW4gbiAtPlxuICAgIGlmIGNvbXBhcmUgemVybyBuIDw9IDAgJiYgY29tcGFyZSBuIG1heF9pbnQgPD0gMCB0aGVuXG4gICAgICBTb21lICh0b19pbnQgbilcbiAgICBlbHNlXG4gICAgICBOb25lXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBpbnQ2NCAtPiBzdHJpbmcgPSBcImNhbWxfaW50NjRfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50NjQgPSBcImNhbWxfaW50NjRfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IGV4cG9zZSBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZSBkaXJlY3RseS4gKilcbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cblxuXG5leHRlcm5hbCBiaXRzX29mX2Zsb2F0IDogZmxvYXQgLT4gaW50NjRcbiAgPSBcImNhbWxfaW50NjRfYml0c19vZl9mbG9hdFwiIFwiY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvYXRfb2ZfYml0cyA6IGludDY0IC0+IGZsb2F0XG4gID0gXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNcIiBcImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0c191bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxudHlwZSB0ID0gaW50NjRcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxubGV0IGVxdWFsICh4OiB0KSAoeTogdCkgPSBjb21wYXJlIHggeSA9IDBcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZVxuICAgYml0bmVzcy4gU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgbiBkIDwgMCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSByIGQgPj0gMCB0aGVuIHN1Y2MgcSBlbHNlIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW05hdGl2ZWludF06IHByb2Nlc3Nvci1uYXRpdmUgaW50ZWdlcnMgKilcblxuZXh0ZXJuYWwgbmVnOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X25lZ1wiXG5leHRlcm5hbCBhZGQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FkZFwiXG5leHRlcm5hbCBzdWI6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X3N1YlwiXG5leHRlcm5hbCBtdWw6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X211bFwiXG5leHRlcm5hbCBkaXY6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2RpdlwiXG5leHRlcm5hbCByZW06IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X21vZFwiXG5leHRlcm5hbCBsb2dhbmQ6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2FuZFwiXG5leHRlcm5hbCBsb2dvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb3JcIlxuZXh0ZXJuYWwgbG9neG9yOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF94b3JcIlxuZXh0ZXJuYWwgc2hpZnRfbGVmdDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0OiBuYXRpdmVpbnQgLT4gaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hc3JcIlxuZXh0ZXJuYWwgc2hpZnRfcmlnaHRfbG9naWNhbDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfbHNyXCJcbmV4dGVybmFsIG9mX2ludDogaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9vZl9pbnRcIlxuZXh0ZXJuYWwgdG9faW50OiBuYXRpdmVpbnQgLT4gaW50ID0gXCIlbmF0aXZlaW50X3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IG5hdGl2ZWludFxuICA9IFwiY2FtbF9uYXRpdmVpbnRfb2ZfZmxvYXRcIiBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBuYXRpdmVpbnQgLT4gZmxvYXRcbiAgPSBcImNhbWxfbmF0aXZlaW50X3RvX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG9mX2ludDMyOiBpbnQzMiAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50MzJcIlxuZXh0ZXJuYWwgdG9faW50MzI6IG5hdGl2ZWludCAtPiBpbnQzMiA9IFwiJW5hdGl2ZWludF90b19pbnQzMlwiXG5cbmxldCB6ZXJvID0gMG5cbmxldCBvbmUgPSAxblxubGV0IG1pbnVzX29uZSA9IC0xblxubGV0IHN1Y2MgbiA9IGFkZCBuIDFuXG5sZXQgcHJlZCBuID0gc3ViIG4gMW5cbmxldCBhYnMgbiA9IGlmIG4gPj0gMG4gdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBzaXplID0gU3lzLndvcmRfc2l6ZVxubGV0IG1pbl9pbnQgPSBzaGlmdF9sZWZ0IDFuIChzaXplIC0gMSlcbmxldCBtYXhfaW50ID0gc3ViIG1pbl9pbnQgMW5cbmxldCBsb2dub3QgbiA9IGxvZ3hvciBuICgtMW4pXG5cbmxldCB1bnNpZ25lZF90b19pbnQgPVxuICBsZXQgbWF4X2ludCA9IG9mX2ludCBTdGRsaWIubWF4X2ludCBpblxuICBmdW4gbiAtPlxuICAgIGlmIGNvbXBhcmUgemVybyBuIDw9IDAgJiYgY29tcGFyZSBuIG1heF9pbnQgPD0gMCB0aGVuXG4gICAgICBTb21lICh0b19pbnQgbilcbiAgICBlbHNlXG4gICAgICBOb25lXG5cbmV4dGVybmFsIGZvcm1hdCA6IHN0cmluZyAtPiBuYXRpdmVpbnQgLT4gc3RyaW5nID0gXCJjYW1sX25hdGl2ZWludF9mb3JtYXRcIlxubGV0IHRvX3N0cmluZyBuID0gZm9ybWF0IFwiJWRcIiBuXG5cbmV4dGVybmFsIG9mX3N0cmluZzogc3RyaW5nIC0+IG5hdGl2ZWludCA9IFwiY2FtbF9uYXRpdmVpbnRfb2Zfc3RyaW5nXCJcblxubGV0IG9mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IGV4cG9zZSBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZSBkaXJlY3RseS4gKilcbiAgdHJ5IFNvbWUgKG9mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbnR5cGUgdCA9IG5hdGl2ZWludFxuXG5sZXQgY29tcGFyZSAoeDogdCkgKHk6IHQpID0gU3RkbGliLmNvbXBhcmUgeCB5XG5sZXQgZXF1YWwgKHg6IHQpICh5OiB0KSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXQgdW5zaWduZWRfY29tcGFyZSBuIG0gPVxuICBjb21wYXJlIChzdWIgbiBtaW5faW50KSAoc3ViIG0gbWluX2ludClcblxubGV0IG1pbiB4IHkgOiB0ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmxldCBtYXggeCB5IDogdCA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbigqIFVuc2lnbmVkIGRpdmlzaW9uIGZyb20gc2lnbmVkIGRpdmlzaW9uIG9mIHRoZSBzYW1lXG4gICBiaXRuZXNzLiBTZWUgV2FycmVuIEpyLiwgSGVucnkgUy4gKDIwMTMpLiBIYWNrZXIncyBEZWxpZ2h0ICgyIGVkLiksIFNlYyA5LTMuXG4qKVxubGV0IHVuc2lnbmVkX2RpdiBuIGQgPVxuICBpZiBkIDwgemVybyB0aGVuXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSBuIGQgPCAwIHRoZW4gemVybyBlbHNlIG9uZVxuICBlbHNlXG4gICAgbGV0IHEgPSBzaGlmdF9sZWZ0IChkaXYgKHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgbiAxKSBkKSAxIGluXG4gICAgbGV0IHIgPSBzdWIgbiAobXVsIHEgZCkgaW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIHIgZCA+PSAwIHRoZW4gc3VjYyBxIGVsc2UgcVxuXG5sZXQgdW5zaWduZWRfcmVtIG4gZCA9XG4gIHN1YiBuIChtdWwgKHVuc2lnbmVkX2RpdiBuIGQpIGQpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFRoZSBydW4tdGltZSBsaWJyYXJ5IGZvciBsZXhlcnMgZ2VuZXJhdGVkIGJ5IGNhbWxsZXggKilcblxudHlwZSBwb3NpdGlvbiA9IHtcbiAgcG9zX2ZuYW1lIDogc3RyaW5nO1xuICBwb3NfbG51bSA6IGludDtcbiAgcG9zX2JvbCA6IGludDtcbiAgcG9zX2NudW0gOiBpbnQ7XG59XG5cbmxldCBkdW1teV9wb3MgPSB7XG4gIHBvc19mbmFtZSA9IFwiXCI7XG4gIHBvc19sbnVtID0gMDtcbiAgcG9zX2JvbCA9IDA7XG4gIHBvc19jbnVtID0gLTE7XG59XG5cbnR5cGUgbGV4YnVmID1cbiAgeyByZWZpbGxfYnVmZiA6IGxleGJ1ZiAtPiB1bml0O1xuICAgIG11dGFibGUgbGV4X2J1ZmZlciA6IGJ5dGVzO1xuICAgIG11dGFibGUgbGV4X2J1ZmZlcl9sZW4gOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfYWJzX3BvcyA6IGludDtcbiAgICBtdXRhYmxlIGxleF9zdGFydF9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfY3Vycl9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfbGFzdF9wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfbGFzdF9hY3Rpb24gOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfZW9mX3JlYWNoZWQgOiBib29sO1xuICAgIG11dGFibGUgbGV4X21lbSA6IGludCBhcnJheTtcbiAgICBtdXRhYmxlIGxleF9zdGFydF9wIDogcG9zaXRpb247XG4gICAgbXV0YWJsZSBsZXhfY3Vycl9wIDogcG9zaXRpb247XG4gIH1cblxudHlwZSBsZXhfdGFibGVzID1cbiAgeyBsZXhfYmFzZTogc3RyaW5nO1xuICAgIGxleF9iYWNrdHJrOiBzdHJpbmc7XG4gICAgbGV4X2RlZmF1bHQ6IHN0cmluZztcbiAgICBsZXhfdHJhbnM6IHN0cmluZztcbiAgICBsZXhfY2hlY2s6IHN0cmluZztcbiAgICBsZXhfYmFzZV9jb2RlIDogc3RyaW5nO1xuICAgIGxleF9iYWNrdHJrX2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X2RlZmF1bHRfY29kZSA6IHN0cmluZztcbiAgICBsZXhfdHJhbnNfY29kZSA6IHN0cmluZztcbiAgICBsZXhfY2hlY2tfY29kZSA6IHN0cmluZztcbiAgICBsZXhfY29kZTogc3RyaW5nO31cblxuZXh0ZXJuYWwgY19lbmdpbmUgOiBsZXhfdGFibGVzIC0+IGludCAtPiBsZXhidWYgLT4gaW50ID0gXCJjYW1sX2xleF9lbmdpbmVcIlxuZXh0ZXJuYWwgY19uZXdfZW5naW5lIDogbGV4X3RhYmxlcyAtPiBpbnQgLT4gbGV4YnVmIC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX25ld19sZXhfZW5naW5lXCJcblxubGV0IGVuZ2luZSB0Ymwgc3RhdGUgYnVmID1cbiAgbGV0IHJlc3VsdCA9IGNfZW5naW5lIHRibCBzdGF0ZSBidWYgaW5cbiAgaWYgcmVzdWx0ID49IDAgJiYgYnVmLmxleF9jdXJyX3AgIT0gZHVtbXlfcG9zIHRoZW4gYmVnaW5cbiAgICBidWYubGV4X3N0YXJ0X3AgPC0gYnVmLmxleF9jdXJyX3A7XG4gICAgYnVmLmxleF9jdXJyX3AgPC0ge2J1Zi5sZXhfY3Vycl9wXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGggcG9zX2NudW0gPSBidWYubGV4X2Fic19wb3MgKyBidWYubGV4X2N1cnJfcG9zfTtcbiAgZW5kO1xuICByZXN1bHRcblxuXG5sZXQgbmV3X2VuZ2luZSB0Ymwgc3RhdGUgYnVmID1cbiAgbGV0IHJlc3VsdCA9IGNfbmV3X2VuZ2luZSB0Ymwgc3RhdGUgYnVmIGluXG4gIGlmIHJlc3VsdCA+PSAwICYmIGJ1Zi5sZXhfY3Vycl9wICE9IGR1bW15X3BvcyB0aGVuIGJlZ2luXG4gICAgYnVmLmxleF9zdGFydF9wIDwtIGJ1Zi5sZXhfY3Vycl9wO1xuICAgIGJ1Zi5sZXhfY3Vycl9wIDwtIHtidWYubGV4X2N1cnJfcFxuICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBvc19jbnVtID0gYnVmLmxleF9hYnNfcG9zICsgYnVmLmxleF9jdXJyX3Bvc307XG4gIGVuZDtcbiAgcmVzdWx0XG5cbmxldCBsZXhfcmVmaWxsIHJlYWRfZnVuIGF1eF9idWZmZXIgbGV4YnVmID1cbiAgbGV0IHJlYWQgPVxuICAgIHJlYWRfZnVuIGF1eF9idWZmZXIgKEJ5dGVzLmxlbmd0aCBhdXhfYnVmZmVyKSBpblxuICBsZXQgbiA9XG4gICAgaWYgcmVhZCA+IDBcbiAgICB0aGVuIHJlYWRcbiAgICBlbHNlIChsZXhidWYubGV4X2VvZl9yZWFjaGVkIDwtIHRydWU7IDApIGluXG4gICgqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGJ1ZmZlcjpcbiAgICAgICAgPC0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tPlxuICAgICAgICB8ICBqdW5rIHwgICAgICB2YWxpZCBkYXRhICAgICB8ICAganVuayAgICB8XG4gICAgICAgIF4gICAgICAgXiAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgIF5cbiAgICAgICAgMCAgICBzdGFydF9wb3MgICAgICAgICAgICAgYnVmZmVyX2VuZCAgICBCeXRlcy5sZW5ndGggYnVmZmVyXG4gICopXG4gIGlmIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiArIG4gPiBCeXRlcy5sZW5ndGggbGV4YnVmLmxleF9idWZmZXIgdGhlbiBiZWdpblxuICAgICgqIFRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICopXG4gICAgaWYgbGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MgKyBuXG4gICAgICAgPD0gQnl0ZXMubGVuZ3RoIGxleGJ1Zi5sZXhfYnVmZmVyXG4gICAgdGhlbiBiZWdpblxuICAgICAgKCogQnV0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBpZiB3ZSByZWNsYWltIHRoZSBqdW5rIGF0IHRoZSBiZWdpbm5pbmdcbiAgICAgICAgIG9mIHRoZSBidWZmZXIgKilcbiAgICAgIEJ5dGVzLmJsaXQgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9zdGFydF9wb3NcbiAgICAgICAgICAgICAgICAgIGxleGJ1Zi5sZXhfYnVmZmVyIDBcbiAgICAgICAgICAgICAgICAgIChsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3BvcylcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgKCogV2UgbXVzdCBncm93IHRoZSBidWZmZXIuICBEb3VibGluZyBpdHMgc2l6ZSB3aWxsIHByb3ZpZGUgZW5vdWdoXG4gICAgICAgICBzcGFjZSBzaW5jZSBuIDw9IFN0cmluZy5sZW5ndGggYXV4X2J1ZmZlciA8PSBTdHJpbmcubGVuZ3RoIGJ1ZmZlci5cbiAgICAgICAgIFdhdGNoIG91dCBmb3Igc3RyaW5nIGxlbmd0aCBvdmVyZmxvdywgdGhvdWdoLiAqKVxuICAgICAgbGV0IG5ld2xlbiA9XG4gICAgICAgIEludC5taW4gKDIgKiBCeXRlcy5sZW5ndGggbGV4YnVmLmxleF9idWZmZXIpIFN5cy5tYXhfc3RyaW5nX2xlbmd0aCBpblxuICAgICAgaWYgbGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MgKyBuID4gbmV3bGVuXG4gICAgICB0aGVuIGZhaWx3aXRoIFwiTGV4aW5nLmxleF9yZWZpbGw6IGNhbm5vdCBncm93IGJ1ZmZlclwiO1xuICAgICAgbGV0IG5ld2J1ZiA9IEJ5dGVzLmNyZWF0ZSBuZXdsZW4gaW5cbiAgICAgICgqIENvcHkgdGhlIHZhbGlkIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV3IGJ1ZmZlciAqKVxuICAgICAgQnl0ZXMuYmxpdCBsZXhidWYubGV4X2J1ZmZlciBsZXhidWYubGV4X3N0YXJ0X3Bvc1xuICAgICAgICAgICAgICAgICAgbmV3YnVmIDBcbiAgICAgICAgICAgICAgICAgIChsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBsZXhidWYubGV4X3N0YXJ0X3Bvcyk7XG4gICAgICBsZXhidWYubGV4X2J1ZmZlciA8LSBuZXdidWZcbiAgICBlbmQ7XG4gICAgKCogUmVhbGxvY2F0aW9uIG9yIG5vdCwgd2UgaGF2ZSBzaGlmdGVkIHRoZSBkYXRhIGxlZnQgYnlcbiAgICAgICBzdGFydF9wb3MgY2hhcmFjdGVyczsgdXBkYXRlIHRoZSBwb3NpdGlvbnMgKilcbiAgICBsZXQgcyA9IGxleGJ1Zi5sZXhfc3RhcnRfcG9zIGluXG4gICAgbGV4YnVmLmxleF9hYnNfcG9zIDwtIGxleGJ1Zi5sZXhfYWJzX3BvcyArIHM7XG4gICAgbGV4YnVmLmxleF9jdXJyX3BvcyA8LSBsZXhidWYubGV4X2N1cnJfcG9zIC0gcztcbiAgICBsZXhidWYubGV4X3N0YXJ0X3BvcyA8LSAwO1xuICAgIGxleGJ1Zi5sZXhfbGFzdF9wb3MgPC0gbGV4YnVmLmxleF9sYXN0X3BvcyAtIHM7XG4gICAgbGV4YnVmLmxleF9idWZmZXJfbGVuIDwtIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIHMgO1xuICAgIGxldCB0ID0gbGV4YnVmLmxleF9tZW0gaW5cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIHQtMSBkb1xuICAgICAgbGV0IHYgPSB0LihpKSBpblxuICAgICAgaWYgdiA+PSAwIHRoZW5cbiAgICAgICAgdC4oaSkgPC0gdi1zXG4gICAgZG9uZVxuICBlbmQ7XG4gICgqIFRoZXJlIGlzIG5vdyBlbm91Z2ggc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICopXG4gIEJ5dGVzLmJsaXQgYXV4X2J1ZmZlciAwIGxleGJ1Zi5sZXhfYnVmZmVyIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiBuO1xuICBsZXhidWYubGV4X2J1ZmZlcl9sZW4gPC0gbGV4YnVmLmxleF9idWZmZXJfbGVuICsgblxuXG5sZXQgemVyb19wb3MgPSB7XG4gIHBvc19mbmFtZSA9IFwiXCI7XG4gIHBvc19sbnVtID0gMTtcbiAgcG9zX2JvbCA9IDA7XG4gIHBvc19jbnVtID0gMDtcbn1cblxubGV0IGZyb21fZnVuY3Rpb24gPyh3aXRoX3Bvc2l0aW9ucyA9IHRydWUpIGYgPVxuICB7IHJlZmlsbF9idWZmID0gbGV4X3JlZmlsbCBmIChCeXRlcy5jcmVhdGUgNTEyKTtcbiAgICBsZXhfYnVmZmVyID0gQnl0ZXMuY3JlYXRlIDEwMjQ7XG4gICAgbGV4X2J1ZmZlcl9sZW4gPSAwO1xuICAgIGxleF9hYnNfcG9zID0gMDtcbiAgICBsZXhfc3RhcnRfcG9zID0gMDtcbiAgICBsZXhfY3Vycl9wb3MgPSAwO1xuICAgIGxleF9sYXN0X3BvcyA9IDA7XG4gICAgbGV4X2xhc3RfYWN0aW9uID0gMDtcbiAgICBsZXhfbWVtID0gW3x8XTtcbiAgICBsZXhfZW9mX3JlYWNoZWQgPSBmYWxzZTtcbiAgICBsZXhfc3RhcnRfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gICAgbGV4X2N1cnJfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gIH1cblxubGV0IGZyb21fY2hhbm5lbCA/d2l0aF9wb3NpdGlvbnMgaWMgPVxuICBmcm9tX2Z1bmN0aW9uID93aXRoX3Bvc2l0aW9ucyAoZnVuIGJ1ZiBuIC0+IGlucHV0IGljIGJ1ZiAwIG4pXG5cbmxldCBmcm9tX3N0cmluZyA/KHdpdGhfcG9zaXRpb25zID0gdHJ1ZSkgcyA9XG4gIHsgcmVmaWxsX2J1ZmYgPSAoZnVuIGxleGJ1ZiAtPiBsZXhidWYubGV4X2VvZl9yZWFjaGVkIDwtIHRydWUpO1xuICAgIGxleF9idWZmZXIgPSBCeXRlcy5vZl9zdHJpbmcgczsgKCogaGF2ZSB0byBtYWtlIGEgY29weSBmb3IgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1bnNhZmUtc3RyaW5nIG1vZGUgKilcbiAgICBsZXhfYnVmZmVyX2xlbiA9IFN0cmluZy5sZW5ndGggcztcbiAgICBsZXhfYWJzX3BvcyA9IDA7XG4gICAgbGV4X3N0YXJ0X3BvcyA9IDA7XG4gICAgbGV4X2N1cnJfcG9zID0gMDtcbiAgICBsZXhfbGFzdF9wb3MgPSAwO1xuICAgIGxleF9sYXN0X2FjdGlvbiA9IDA7XG4gICAgbGV4X21lbSA9IFt8fF07XG4gICAgbGV4X2VvZl9yZWFjaGVkID0gdHJ1ZTtcbiAgICBsZXhfc3RhcnRfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gICAgbGV4X2N1cnJfcCA9IGlmIHdpdGhfcG9zaXRpb25zIHRoZW4gemVyb19wb3MgZWxzZSBkdW1teV9wb3M7XG4gIH1cblxubGV0IHNldF9wb3NpdGlvbiBsZXhidWYgcG9zaXRpb24gPVxuICBsZXhidWYubGV4X2N1cnJfcCAgPC0ge3Bvc2l0aW9uIHdpdGggcG9zX2ZuYW1lID0gbGV4YnVmLmxleF9jdXJyX3AucG9zX2ZuYW1lfTtcbiAgbGV4YnVmLmxleF9hYnNfcG9zIDwtIHBvc2l0aW9uLnBvc19jbnVtXG5cbmxldCBzZXRfZmlsZW5hbWUgbGV4YnVmIGZuYW1lID1cbiAgbGV4YnVmLmxleF9jdXJyX3AgPC0ge2xleGJ1Zi5sZXhfY3Vycl9wIHdpdGggcG9zX2ZuYW1lID0gZm5hbWV9XG5cbmxldCB3aXRoX3Bvc2l0aW9ucyBsZXhidWYgPSBsZXhidWYubGV4X2N1cnJfcCAhPSBkdW1teV9wb3NcblxubGV0IGxleGVtZSBsZXhidWYgPVxuICBsZXQgbGVuID0gbGV4YnVmLmxleF9jdXJyX3BvcyAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zIGluXG4gIEJ5dGVzLnN1Yl9zdHJpbmcgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9zdGFydF9wb3MgbGVuXG5cbmxldCBzdWJfbGV4ZW1lIGxleGJ1ZiBpMSBpMiA9XG4gIGxldCBsZW4gPSBpMi1pMSBpblxuICBCeXRlcy5zdWJfc3RyaW5nIGxleGJ1Zi5sZXhfYnVmZmVyIGkxIGxlblxuXG5sZXQgc3ViX2xleGVtZV9vcHQgbGV4YnVmIGkxIGkyID1cbiAgaWYgaTEgPj0gMCB0aGVuIGJlZ2luXG4gICAgbGV0IGxlbiA9IGkyLWkxIGluXG4gICAgU29tZSAoQnl0ZXMuc3ViX3N0cmluZyBsZXhidWYubGV4X2J1ZmZlciBpMSBsZW4pXG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgTm9uZVxuICBlbmRcblxubGV0IHN1Yl9sZXhlbWVfY2hhciBsZXhidWYgaSA9IEJ5dGVzLmdldCBsZXhidWYubGV4X2J1ZmZlciBpXG5cbmxldCBzdWJfbGV4ZW1lX2NoYXJfb3B0IGxleGJ1ZiBpID1cbiAgaWYgaSA+PSAwIHRoZW5cbiAgICBTb21lIChCeXRlcy5nZXQgbGV4YnVmLmxleF9idWZmZXIgaSlcbiAgZWxzZVxuICAgIE5vbmVcblxuXG5sZXQgbGV4ZW1lX2NoYXIgbGV4YnVmIGkgPVxuICBCeXRlcy5nZXQgbGV4YnVmLmxleF9idWZmZXIgKGxleGJ1Zi5sZXhfc3RhcnRfcG9zICsgaSlcblxubGV0IGxleGVtZV9zdGFydCBsZXhidWYgPSBsZXhidWYubGV4X3N0YXJ0X3AucG9zX2NudW1cbmxldCBsZXhlbWVfZW5kIGxleGJ1ZiA9IGxleGJ1Zi5sZXhfY3Vycl9wLnBvc19jbnVtXG5cbmxldCBsZXhlbWVfc3RhcnRfcCBsZXhidWYgPSBsZXhidWYubGV4X3N0YXJ0X3BcbmxldCBsZXhlbWVfZW5kX3AgbGV4YnVmID0gbGV4YnVmLmxleF9jdXJyX3BcblxubGV0IG5ld19saW5lIGxleGJ1ZiA9XG4gIGxldCBsY3AgPSBsZXhidWYubGV4X2N1cnJfcCBpblxuICBpZiBsY3AgIT0gZHVtbXlfcG9zIHRoZW5cbiAgICBsZXhidWYubGV4X2N1cnJfcCA8LVxuICAgICAgeyBsY3Agd2l0aFxuICAgICAgICBwb3NfbG51bSA9IGxjcC5wb3NfbG51bSArIDE7XG4gICAgICAgIHBvc19ib2wgPSBsY3AucG9zX2NudW07XG4gICAgICB9XG5cblxuXG4oKiBEaXNjYXJkIGRhdGEgbGVmdCBpbiBsZXhlciBidWZmZXIuICopXG5cbmxldCBmbHVzaF9pbnB1dCBsYiA9XG4gIGxiLmxleF9jdXJyX3BvcyA8LSAwO1xuICBsYi5sZXhfYWJzX3BvcyA8LSAwO1xuICBsZXQgbGNwID0gbGIubGV4X2N1cnJfcCBpblxuICBpZiBsY3AgIT0gZHVtbXlfcG9zIHRoZW5cbiAgICBsYi5sZXhfY3Vycl9wIDwtIHt6ZXJvX3BvcyB3aXRoIHBvc19mbmFtZSA9IGxjcC5wb3NfZm5hbWV9O1xuICBsYi5sZXhfYnVmZmVyX2xlbiA8LSAwO1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBUaGUgcGFyc2luZyBlbmdpbmUgKilcblxub3BlbiBMZXhpbmdcblxuKCogSW50ZXJuYWwgaW50ZXJmYWNlIHRvIHRoZSBwYXJzaW5nIGVuZ2luZSAqKVxuXG50eXBlIHBhcnNlcl9lbnYgPVxuICB7IG11dGFibGUgc19zdGFjayA6IGludCBhcnJheTsgICAgICAgICgqIFN0YXRlcyAqKVxuICAgIG11dGFibGUgdl9zdGFjayA6IE9iai50IGFycmF5OyAgICAgICgqIFNlbWFudGljIGF0dHJpYnV0ZXMgKilcbiAgICBtdXRhYmxlIHN5bWJfc3RhcnRfc3RhY2sgOiBwb3NpdGlvbiBhcnJheTsgKCogU3RhcnQgcG9zaXRpb25zICopXG4gICAgbXV0YWJsZSBzeW1iX2VuZF9zdGFjayA6IHBvc2l0aW9uIGFycmF5OyAgICgqIEVuZCBwb3NpdGlvbnMgKilcbiAgICBtdXRhYmxlIHN0YWNrc2l6ZSA6IGludDsgICAgICAgICAgICAoKiBTaXplIG9mIHRoZSBzdGFja3MgKilcbiAgICBtdXRhYmxlIHN0YWNrYmFzZSA6IGludDsgICAgICAgICAgICAoKiBCYXNlIHNwIGZvciBjdXJyZW50IHBhcnNlICopXG4gICAgbXV0YWJsZSBjdXJyX2NoYXIgOiBpbnQ7ICAgICAgICAgICAgKCogTGFzdCB0b2tlbiByZWFkICopXG4gICAgbXV0YWJsZSBsdmFsIDogT2JqLnQ7ICAgICAgICAgICAgICAgKCogSXRzIHNlbWFudGljIGF0dHJpYnV0ZSAqKVxuICAgIG11dGFibGUgc3ltYl9zdGFydCA6IHBvc2l0aW9uOyAgICAgICgqIFN0YXJ0IHBvcy4gb2YgdGhlIGN1cnJlbnQgc3ltYm9sKilcbiAgICBtdXRhYmxlIHN5bWJfZW5kIDogcG9zaXRpb247ICAgICAgICAoKiBFbmQgcG9zLiBvZiB0aGUgY3VycmVudCBzeW1ib2wgKilcbiAgICBtdXRhYmxlIGFzcCA6IGludDsgICAgICAgICAgICAgICAgICAoKiBUaGUgc3RhY2sgcG9pbnRlciBmb3IgYXR0cmlidXRlcyAqKVxuICAgIG11dGFibGUgcnVsZV9sZW4gOiBpbnQ7ICAgICAgICAgICAgICgqIE51bWJlciBvZiByaHMgaXRlbXMgaW4gdGhlIHJ1bGUgKilcbiAgICBtdXRhYmxlIHJ1bGVfbnVtYmVyIDogaW50OyAgICAgICAgICAoKiBSdWxlIG51bWJlciB0byByZWR1Y2UgYnkgKilcbiAgICBtdXRhYmxlIHNwIDogaW50OyAgICAgICAgICAgICAgICAgICAoKiBTYXZlZCBzcCBmb3IgcGFyc2VfZW5naW5lICopXG4gICAgbXV0YWJsZSBzdGF0ZSA6IGludDsgICAgICAgICAgICAgICAgKCogU2F2ZWQgc3RhdGUgZm9yIHBhcnNlX2VuZ2luZSAqKVxuICAgIG11dGFibGUgZXJyZmxhZyA6IGludCB9ICAgICAgICAgICAgICgqIFNhdmVkIGVycm9yIGZsYWcgZm9yIHBhcnNlX2VuZ2luZSAqKVxuW0BAd2FybmluZyBcIi11bnVzZWQtZmllbGRcIl1cblxudHlwZSBwYXJzZV90YWJsZXMgPVxuICB7IGFjdGlvbnMgOiAocGFyc2VyX2VudiAtPiBPYmoudCkgYXJyYXk7XG4gICAgdHJhbnNsX2NvbnN0IDogaW50IGFycmF5O1xuICAgIHRyYW5zbF9ibG9jayA6IGludCBhcnJheTtcbiAgICBsaHMgOiBzdHJpbmc7XG4gICAgbGVuIDogc3RyaW5nO1xuICAgIGRlZnJlZCA6IHN0cmluZztcbiAgICBkZ290byA6IHN0cmluZztcbiAgICBzaW5kZXggOiBzdHJpbmc7XG4gICAgcmluZGV4IDogc3RyaW5nO1xuICAgIGdpbmRleCA6IHN0cmluZztcbiAgICB0YWJsZXNpemUgOiBpbnQ7XG4gICAgdGFibGUgOiBzdHJpbmc7XG4gICAgY2hlY2sgOiBzdHJpbmc7XG4gICAgZXJyb3JfZnVuY3Rpb24gOiBzdHJpbmcgLT4gdW5pdDtcbiAgICBuYW1lc19jb25zdCA6IHN0cmluZztcbiAgICBuYW1lc19ibG9jayA6IHN0cmluZyB9XG5cbmV4Y2VwdGlvbiBZWWV4aXQgb2YgT2JqLnRcbmV4Y2VwdGlvbiBQYXJzZV9lcnJvclxuXG50eXBlIHBhcnNlcl9pbnB1dCA9XG4gICAgU3RhcnRcbiAgfCBUb2tlbl9yZWFkXG4gIHwgU3RhY2tzX2dyb3duXzFcbiAgfCBTdGFja3NfZ3Jvd25fMlxuICB8IFNlbWFudGljX2FjdGlvbl9jb21wdXRlZFxuICB8IEVycm9yX2RldGVjdGVkXG5cbnR5cGUgcGFyc2VyX291dHB1dCA9XG4gICAgUmVhZF90b2tlblxuICB8IFJhaXNlX3BhcnNlX2Vycm9yXG4gIHwgR3Jvd19zdGFja3NfMVxuICB8IEdyb3dfc3RhY2tzXzJcbiAgfCBDb21wdXRlX3NlbWFudGljX2FjdGlvblxuICB8IENhbGxfZXJyb3JfZnVuY3Rpb25cblxuKCogdG8gYXZvaWQgd2FybmluZ3MgKilcbmxldCBfID0gW1JlYWRfdG9rZW47IFJhaXNlX3BhcnNlX2Vycm9yOyBHcm93X3N0YWNrc18xOyBHcm93X3N0YWNrc18yO1xuICAgICAgICAgQ29tcHV0ZV9zZW1hbnRpY19hY3Rpb247IENhbGxfZXJyb3JfZnVuY3Rpb25dXG5cbmV4dGVybmFsIHBhcnNlX2VuZ2luZSA6XG4gICAgcGFyc2VfdGFibGVzIC0+IHBhcnNlcl9lbnYgLT4gcGFyc2VyX2lucHV0IC0+IE9iai50IC0+IHBhcnNlcl9vdXRwdXRcbiAgICA9IFwiY2FtbF9wYXJzZV9lbmdpbmVcIlxuXG5leHRlcm5hbCBzZXRfdHJhY2U6IGJvb2wgLT4gYm9vbFxuICAgID0gXCJjYW1sX3NldF9wYXJzZXJfdHJhY2VcIlxuXG5sZXQgZW52ID1cbiAgeyBzX3N0YWNrID0gQXJyYXkubWFrZSAxMDAgMDtcbiAgICB2X3N0YWNrID0gQXJyYXkubWFrZSAxMDAgKE9iai5yZXByICgpKTtcbiAgICBzeW1iX3N0YXJ0X3N0YWNrID0gQXJyYXkubWFrZSAxMDAgZHVtbXlfcG9zO1xuICAgIHN5bWJfZW5kX3N0YWNrID0gQXJyYXkubWFrZSAxMDAgZHVtbXlfcG9zO1xuICAgIHN0YWNrc2l6ZSA9IDEwMDtcbiAgICBzdGFja2Jhc2UgPSAwO1xuICAgIGN1cnJfY2hhciA9IDA7XG4gICAgbHZhbCA9IE9iai5yZXByICgpO1xuICAgIHN5bWJfc3RhcnQgPSBkdW1teV9wb3M7XG4gICAgc3ltYl9lbmQgPSBkdW1teV9wb3M7XG4gICAgYXNwID0gMDtcbiAgICBydWxlX2xlbiA9IDA7XG4gICAgcnVsZV9udW1iZXIgPSAwO1xuICAgIHNwID0gMDtcbiAgICBzdGF0ZSA9IDA7XG4gICAgZXJyZmxhZyA9IDAgfVxuXG5sZXQgZ3Jvd19zdGFja3MoKSA9XG4gIGxldCBvbGRzaXplID0gZW52LnN0YWNrc2l6ZSBpblxuICBsZXQgbmV3c2l6ZSA9IG9sZHNpemUgKiAyIGluXG4gIGxldCBuZXdfcyA9IEFycmF5Lm1ha2UgbmV3c2l6ZSAwXG4gIGFuZCBuZXdfdiA9IEFycmF5Lm1ha2UgbmV3c2l6ZSAoT2JqLnJlcHIgKCkpXG4gIGFuZCBuZXdfc3RhcnQgPSBBcnJheS5tYWtlIG5ld3NpemUgZHVtbXlfcG9zXG4gIGFuZCBuZXdfZW5kID0gQXJyYXkubWFrZSBuZXdzaXplIGR1bW15X3BvcyBpblxuICAgIEFycmF5LmJsaXQgZW52LnNfc3RhY2sgMCBuZXdfcyAwIG9sZHNpemU7XG4gICAgZW52LnNfc3RhY2sgPC0gbmV3X3M7XG4gICAgQXJyYXkuYmxpdCBlbnYudl9zdGFjayAwIG5ld192IDAgb2xkc2l6ZTtcbiAgICBlbnYudl9zdGFjayA8LSBuZXdfdjtcbiAgICBBcnJheS5ibGl0IGVudi5zeW1iX3N0YXJ0X3N0YWNrIDAgbmV3X3N0YXJ0IDAgb2xkc2l6ZTtcbiAgICBlbnYuc3ltYl9zdGFydF9zdGFjayA8LSBuZXdfc3RhcnQ7XG4gICAgQXJyYXkuYmxpdCBlbnYuc3ltYl9lbmRfc3RhY2sgMCBuZXdfZW5kIDAgb2xkc2l6ZTtcbiAgICBlbnYuc3ltYl9lbmRfc3RhY2sgPC0gbmV3X2VuZDtcbiAgICBlbnYuc3RhY2tzaXplIDwtIG5ld3NpemVcblxubGV0IGNsZWFyX3BhcnNlcigpID1cbiAgQXJyYXkuZmlsbCBlbnYudl9zdGFjayAwIGVudi5zdGFja3NpemUgKE9iai5yZXByICgpKTtcbiAgZW52Lmx2YWwgPC0gT2JqLnJlcHIgKClcblxubGV0IGN1cnJlbnRfbG9va2FoZWFkX2Z1biA9IHJlZiAoZnVuIChfIDogT2JqLnQpIC0+IGZhbHNlKVxuXG5sZXQgeXlwYXJzZSB0YWJsZXMgc3RhcnQgbGV4ZXIgbGV4YnVmID1cbiAgbGV0IHJlYyBsb29wIGNtZCBhcmcgPVxuICAgIG1hdGNoIHBhcnNlX2VuZ2luZSB0YWJsZXMgZW52IGNtZCBhcmcgd2l0aFxuICAgICAgUmVhZF90b2tlbiAtPlxuICAgICAgICBsZXQgdCA9IE9iai5yZXByKGxleGVyIGxleGJ1ZikgaW5cbiAgICAgICAgZW52LnN5bWJfc3RhcnQgPC0gbGV4YnVmLmxleF9zdGFydF9wO1xuICAgICAgICBlbnYuc3ltYl9lbmQgPC0gbGV4YnVmLmxleF9jdXJyX3A7XG4gICAgICAgIGxvb3AgVG9rZW5fcmVhZCB0XG4gICAgfCBSYWlzZV9wYXJzZV9lcnJvciAtPlxuICAgICAgICByYWlzZSBQYXJzZV9lcnJvclxuICAgIHwgQ29tcHV0ZV9zZW1hbnRpY19hY3Rpb24gLT5cbiAgICAgICAgbGV0IChhY3Rpb24sIHZhbHVlKSA9XG4gICAgICAgICAgdHJ5XG4gICAgICAgICAgICAoU2VtYW50aWNfYWN0aW9uX2NvbXB1dGVkLCB0YWJsZXMuYWN0aW9ucy4oZW52LnJ1bGVfbnVtYmVyKSBlbnYpXG4gICAgICAgICAgd2l0aCBQYXJzZV9lcnJvciAtPlxuICAgICAgICAgICAgKEVycm9yX2RldGVjdGVkLCBPYmoucmVwciAoKSkgaW5cbiAgICAgICAgbG9vcCBhY3Rpb24gdmFsdWVcbiAgICB8IEdyb3dfc3RhY2tzXzEgLT5cbiAgICAgICAgZ3Jvd19zdGFja3MoKTsgbG9vcCBTdGFja3NfZ3Jvd25fMSAoT2JqLnJlcHIgKCkpXG4gICAgfCBHcm93X3N0YWNrc18yIC0+XG4gICAgICAgIGdyb3dfc3RhY2tzKCk7IGxvb3AgU3RhY2tzX2dyb3duXzIgKE9iai5yZXByICgpKVxuICAgIHwgQ2FsbF9lcnJvcl9mdW5jdGlvbiAtPlxuICAgICAgICB0YWJsZXMuZXJyb3JfZnVuY3Rpb24gXCJzeW50YXggZXJyb3JcIjtcbiAgICAgICAgbG9vcCBFcnJvcl9kZXRlY3RlZCAoT2JqLnJlcHIgKCkpIGluXG4gIGxldCBpbml0X2FzcCA9IGVudi5hc3BcbiAgYW5kIGluaXRfc3AgPSBlbnYuc3BcbiAgYW5kIGluaXRfc3RhY2tiYXNlID0gZW52LnN0YWNrYmFzZVxuICBhbmQgaW5pdF9zdGF0ZSA9IGVudi5zdGF0ZVxuICBhbmQgaW5pdF9jdXJyX2NoYXIgPSBlbnYuY3Vycl9jaGFyXG4gIGFuZCBpbml0X2x2YWwgPSBlbnYubHZhbFxuICBhbmQgaW5pdF9lcnJmbGFnID0gZW52LmVycmZsYWcgaW5cbiAgZW52LnN0YWNrYmFzZSA8LSBlbnYuc3AgKyAxO1xuICBlbnYuY3Vycl9jaGFyIDwtIHN0YXJ0O1xuICBlbnYuc3ltYl9lbmQgPC0gbGV4YnVmLmxleF9jdXJyX3A7XG4gIHRyeVxuICAgIGxvb3AgU3RhcnQgKE9iai5yZXByICgpKVxuICB3aXRoIGV4biAtPlxuICAgIGxldCBjdXJyX2NoYXIgPSBlbnYuY3Vycl9jaGFyIGluXG4gICAgZW52LmFzcCA8LSBpbml0X2FzcDtcbiAgICBlbnYuc3AgPC0gaW5pdF9zcDtcbiAgICBlbnYuc3RhY2tiYXNlIDwtIGluaXRfc3RhY2tiYXNlO1xuICAgIGVudi5zdGF0ZSA8LSBpbml0X3N0YXRlO1xuICAgIGVudi5jdXJyX2NoYXIgPC0gaW5pdF9jdXJyX2NoYXI7XG4gICAgZW52Lmx2YWwgPC0gaW5pdF9sdmFsO1xuICAgIGVudi5lcnJmbGFnIDwtIGluaXRfZXJyZmxhZztcbiAgICBtYXRjaCBleG4gd2l0aFxuICAgICAgWVlleGl0IHYgLT5cbiAgICAgICAgT2JqLm1hZ2ljIHZcbiAgICB8IF8gLT5cbiAgICAgICAgY3VycmVudF9sb29rYWhlYWRfZnVuIDo9XG4gICAgICAgICAgKGZ1biB0b2sgLT5cbiAgICAgICAgICAgIGlmIE9iai5pc19ibG9jayB0b2tcbiAgICAgICAgICAgIHRoZW4gdGFibGVzLnRyYW5zbF9ibG9jay4oT2JqLnRhZyB0b2spID0gY3Vycl9jaGFyXG4gICAgICAgICAgICBlbHNlIHRhYmxlcy50cmFuc2xfY29uc3QuKE9iai5tYWdpYyB0b2spID0gY3Vycl9jaGFyKTtcbiAgICAgICAgcmFpc2UgZXhuXG5cbmxldCBwZWVrX3ZhbCBlbnYgbiA9XG4gIE9iai5tYWdpYyBlbnYudl9zdGFjay4oZW52LmFzcCAtIG4pXG5cbmxldCBzeW1ib2xfc3RhcnRfcG9zICgpID1cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPD0gMCB0aGVuIGVudi5zeW1iX2VuZF9zdGFjay4oZW52LmFzcClcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgc3QgPSBlbnYuc3ltYl9zdGFydF9zdGFjay4oZW52LmFzcCAtIGkgKyAxKSBpblxuICAgICAgbGV0IGVuID0gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwIC0gaSArIDEpIGluXG4gICAgICBpZiBzdCA8PiBlbiB0aGVuIHN0IGVsc2UgbG9vcCAoaSAtIDEpXG4gICAgZW5kXG4gIGluXG4gIGxvb3AgZW52LnJ1bGVfbGVuXG5cbmxldCBzeW1ib2xfZW5kX3BvcyAoKSA9IGVudi5zeW1iX2VuZF9zdGFjay4oZW52LmFzcClcbmxldCByaHNfc3RhcnRfcG9zIG4gPSBlbnYuc3ltYl9zdGFydF9zdGFjay4oZW52LmFzcCAtIChlbnYucnVsZV9sZW4gLSBuKSlcbmxldCByaHNfZW5kX3BvcyBuID0gZW52LnN5bWJfZW5kX3N0YWNrLihlbnYuYXNwIC0gKGVudi5ydWxlX2xlbiAtIG4pKVxuXG5sZXQgc3ltYm9sX3N0YXJ0ICgpID0gKHN5bWJvbF9zdGFydF9wb3MgKCkpLnBvc19jbnVtXG5sZXQgc3ltYm9sX2VuZCAoKSA9IChzeW1ib2xfZW5kX3BvcyAoKSkucG9zX2NudW1cbmxldCByaHNfc3RhcnQgbiA9IChyaHNfc3RhcnRfcG9zIG4pLnBvc19jbnVtXG5sZXQgcmhzX2VuZCBuID0gKHJoc19lbmRfcG9zIG4pLnBvc19jbnVtXG5cbmxldCBpc19jdXJyZW50X2xvb2thaGVhZCB0b2sgPVxuICAoIWN1cnJlbnRfbG9va2FoZWFkX2Z1bikoT2JqLnJlcHIgdG9rKVxuXG5sZXQgcGFyc2VfZXJyb3IgKF8gOiBzdHJpbmcpID0gKClcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogU2V0cyBvdmVyIG9yZGVyZWQgdHlwZXMgKilcblxubW9kdWxlIHR5cGUgT3JkZXJlZFR5cGUgPVxuICBzaWdcbiAgICB0eXBlIHRcbiAgICB2YWwgY29tcGFyZTogdCAtPiB0IC0+IGludFxuICBlbmRcblxubW9kdWxlIHR5cGUgUyA9XG4gIHNpZ1xuICAgIHR5cGUgZWx0XG4gICAgdHlwZSB0XG4gICAgdmFsIGVtcHR5OiB0XG4gICAgdmFsIGlzX2VtcHR5OiB0IC0+IGJvb2xcbiAgICB2YWwgbWVtOiBlbHQgLT4gdCAtPiBib29sXG4gICAgdmFsIGFkZDogZWx0IC0+IHQgLT4gdFxuICAgIHZhbCBzaW5nbGV0b246IGVsdCAtPiB0XG4gICAgdmFsIHJlbW92ZTogZWx0IC0+IHQgLT4gdFxuICAgIHZhbCB1bmlvbjogdCAtPiB0IC0+IHRcbiAgICB2YWwgaW50ZXI6IHQgLT4gdCAtPiB0XG4gICAgdmFsIGRpc2pvaW50OiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBkaWZmOiB0IC0+IHQgLT4gdFxuICAgIHZhbCBjb21wYXJlOiB0IC0+IHQgLT4gaW50XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBzdWJzZXQ6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIGl0ZXI6IChlbHQgLT4gdW5pdCkgLT4gdCAtPiB1bml0XG4gICAgdmFsIG1hcDogKGVsdCAtPiBlbHQpIC0+IHQgLT4gdFxuICAgIHZhbCBmb2xkOiAoZWx0IC0+ICdhIC0+ICdhKSAtPiB0IC0+ICdhIC0+ICdhXG4gICAgdmFsIGZvcl9hbGw6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBib29sXG4gICAgdmFsIGV4aXN0czogKGVsdCAtPiBib29sKSAtPiB0IC0+IGJvb2xcbiAgICB2YWwgZmlsdGVyOiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gdFxuICAgIHZhbCBmaWx0ZXJfbWFwOiAoZWx0IC0+IGVsdCBvcHRpb24pIC0+IHQgLT4gdFxuICAgIHZhbCBwYXJ0aXRpb246IChlbHQgLT4gYm9vbCkgLT4gdCAtPiB0ICogdFxuICAgIHZhbCBjYXJkaW5hbDogdCAtPiBpbnRcbiAgICB2YWwgZWxlbWVudHM6IHQgLT4gZWx0IGxpc3RcbiAgICB2YWwgbWluX2VsdDogdCAtPiBlbHRcbiAgICB2YWwgbWluX2VsdF9vcHQ6IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBtYXhfZWx0OiB0IC0+IGVsdFxuICAgIHZhbCBtYXhfZWx0X29wdDogdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIGNob29zZTogdCAtPiBlbHRcbiAgICB2YWwgY2hvb3NlX29wdDogdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIHNwbGl0OiBlbHQgLT4gdCAtPiB0ICogYm9vbCAqIHRcbiAgICB2YWwgZmluZDogZWx0IC0+IHQgLT4gZWx0XG4gICAgdmFsIGZpbmRfb3B0OiBlbHQgLT4gdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIGZpbmRfZmlyc3Q6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBlbHRcbiAgICB2YWwgZmluZF9maXJzdF9vcHQ6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBlbHQgb3B0aW9uXG4gICAgdmFsIGZpbmRfbGFzdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdFxuICAgIHZhbCBmaW5kX2xhc3Rfb3B0OiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBvZl9saXN0OiBlbHQgbGlzdCAtPiB0XG4gICAgdmFsIHRvX3NlcV9mcm9tIDogZWx0IC0+IHQgLT4gZWx0IFNlcS50XG4gICAgdmFsIHRvX3NlcSA6IHQgLT4gZWx0IFNlcS50XG4gICAgdmFsIHRvX3Jldl9zZXEgOiB0IC0+IGVsdCBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogZWx0IFNlcS50IC0+IHQgLT4gdFxuICAgIHZhbCBvZl9zZXEgOiBlbHQgU2VxLnQgLT4gdFxuICBlbmRcblxubW9kdWxlIE1ha2UoT3JkOiBPcmRlcmVkVHlwZSkgPVxuICBzdHJ1Y3RcbiAgICB0eXBlIGVsdCA9IE9yZC50XG4gICAgdHlwZSB0ID0gRW1wdHkgfCBOb2RlIG9mIHtsOnQ7IHY6ZWx0OyByOnQ7IGg6aW50fVxuXG4gICAgKCogU2V0cyBhcmUgcmVwcmVzZW50ZWQgYnkgYmFsYW5jZWQgYmluYXJ5IHRyZWVzICh0aGUgaGVpZ2h0cyBvZiB0aGVcbiAgICAgICBjaGlsZHJlbiBkaWZmZXIgYnkgYXQgbW9zdCAyICopXG5cbiAgICBsZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gMFxuICAgICAgfCBOb2RlIHtofSAtPiBoXG5cbiAgICAoKiBDcmVhdGVzIGEgbmV3IG5vZGUgd2l0aCBsZWZ0IHNvbiBsLCB2YWx1ZSB2IGFuZCByaWdodCBzb24gci5cbiAgICAgICBXZSBtdXN0IGhhdmUgYWxsIGVsZW1lbnRzIG9mIGwgPCB2IDwgYWxsIGVsZW1lbnRzIG9mIHIuXG4gICAgICAgbCBhbmQgciBtdXN0IGJlIGJhbGFuY2VkIGFuZCB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAyLlxuICAgICAgIElubGluZSBleHBhbnNpb24gb2YgaGVpZ2h0IGZvciBiZXR0ZXIgc3BlZWQuICopXG5cbiAgICBsZXQgY3JlYXRlIGwgdiByID1cbiAgICAgIGxldCBobCA9IG1hdGNoIGwgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgbGV0IGhyID0gbWF0Y2ggciB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBOb2Rle2w7IHY7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgICgqIFNhbWUgYXMgY3JlYXRlLCBidXQgcGVyZm9ybXMgb25lIHN0ZXAgb2YgcmViYWxhbmNpbmcgaWYgbmVjZXNzYXJ5LlxuICAgICAgIEFzc3VtZXMgbCBhbmQgciBiYWxhbmNlZCBhbmQgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMy5cbiAgICAgICBJbmxpbmUgZXhwYW5zaW9uIG9mIGNyZWF0ZSBmb3IgYmV0dGVyIHNwZWVkIGluIHRoZSBtb3N0IGZyZXF1ZW50IGNhc2VcbiAgICAgICB3aGVyZSBubyByZWJhbGFuY2luZyBpcyByZXF1aXJlZC4gKilcblxuICAgIGxldCBiYWwgbCB2IHIgPVxuICAgICAgbGV0IGhsID0gbWF0Y2ggbCB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBsZXQgaHIgPSBtYXRjaCByIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGlmIGhsID4gaHIgKyAyIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQuYmFsXCJcbiAgICAgICAgfCBOb2Rle2w9bGw7IHY9bHY7IHI9bHJ9IC0+XG4gICAgICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVpZ2h0IGxyIHRoZW5cbiAgICAgICAgICAgICAgY3JlYXRlIGxsIGx2IChjcmVhdGUgbHIgdiByKVxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBtYXRjaCBsciB3aXRoXG4gICAgICAgICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQuYmFsXCJcbiAgICAgICAgICAgICAgfCBOb2Rle2w9bHJsOyB2PWxydjsgcj1scnJ9LT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxybCkgbHJ2IChjcmVhdGUgbHJyIHYgcilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2UgaWYgaHIgPiBobCArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCByIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1ybDsgdj1ydjsgcj1ycn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCByciA+PSBoZWlnaHQgcmwgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHYgcmwpIHJ2IHJyXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIHJsIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1ybGw7IHY9cmx2OyByPXJscn0gLT5cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgdiBybGwpIHJsdiAoY3JlYXRlIHJsciBydiBycilcbiAgICAgICAgICAgIGVuZFxuICAgICAgZW5kIGVsc2VcbiAgICAgICAgTm9kZXtsOyB2OyByOyBoPShpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSl9XG5cbiAgICAoKiBJbnNlcnRpb24gb2Ygb25lIGVsZW1lbnQgKilcblxuICAgIGxldCByZWMgYWRkIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb2Rle2w9RW1wdHk7IHY9eDsgcj1FbXB0eTsgaD0xfVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IGFzIHQgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gdCBlbHNlXG4gICAgICAgICAgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gYWRkIHggbCBpblxuICAgICAgICAgICAgaWYgbCA9PSBsbCB0aGVuIHQgZWxzZSBiYWwgbGwgdiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IHJyID0gYWRkIHggciBpblxuICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIHQgZWxzZSBiYWwgbCB2IHJyXG5cbiAgICBsZXQgc2luZ2xldG9uIHggPSBOb2Rle2w9RW1wdHk7IHY9eDsgcj1FbXB0eTsgaD0xfVxuXG4gICAgKCogQmV3YXJlOiB0aG9zZSB0d28gZnVuY3Rpb25zIGFzc3VtZSB0aGF0IHRoZSBhZGRlZCB2IGlzICpzdHJpY3RseSpcbiAgICAgICBzbWFsbGVyIChvciBiaWdnZXIpIHRoYW4gYWxsIHRoZSBwcmVzZW50IGVsZW1lbnRzIGluIHRoZSB0cmVlOyBpdFxuICAgICAgIGRvZXMgbm90IHRlc3QgZm9yIGVxdWFsaXR5IHdpdGggdGhlIGN1cnJlbnQgbWluIChvciBtYXgpIGVsZW1lbnQuXG4gICAgICAgSW5kZWVkLCB0aGV5IGFyZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBcImpvaW5cIiBvcGVyYXRpb24gd2hpY2hcbiAgICAgICByZXNwZWN0cyB0aGlzIHByZWNvbmRpdGlvbi5cbiAgICAqKVxuXG4gICAgbGV0IHJlYyBhZGRfbWluX2VsZW1lbnQgeCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IHNpbmdsZXRvbiB4XG4gICAgICB8IE5vZGUge2w7IHY7IHJ9IC0+XG4gICAgICAgIGJhbCAoYWRkX21pbl9lbGVtZW50IHggbCkgdiByXG5cbiAgICBsZXQgcmVjIGFkZF9tYXhfZWxlbWVudCB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgcn0gLT5cbiAgICAgICAgYmFsIGwgdiAoYWRkX21heF9lbGVtZW50IHggcilcblxuICAgICgqIFNhbWUgYXMgY3JlYXRlIGFuZCBiYWwsIGJ1dCBubyBhc3N1bXB0aW9ucyBhcmUgbWFkZSBvbiB0aGVcbiAgICAgICByZWxhdGl2ZSBoZWlnaHRzIG9mIGwgYW5kIHIuICopXG5cbiAgICBsZXQgcmVjIGpvaW4gbCB2IHIgPVxuICAgICAgbWF0Y2ggKGwsIHIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSAtPiBhZGRfbWluX2VsZW1lbnQgdiByXG4gICAgICB8IChfLCBFbXB0eSkgLT4gYWRkX21heF9lbGVtZW50IHYgbFxuICAgICAgfCAoTm9kZXtsPWxsOyB2PWx2OyByPWxyOyBoPWxofSwgTm9kZXtsPXJsOyB2PXJ2OyByPXJyOyBoPXJofSkgLT5cbiAgICAgICAgICBpZiBsaCA+IHJoICsgMiB0aGVuIGJhbCBsbCBsdiAoam9pbiBsciB2IHIpIGVsc2VcbiAgICAgICAgICBpZiByaCA+IGxoICsgMiB0aGVuIGJhbCAoam9pbiBsIHYgcmwpIHJ2IHJyIGVsc2VcbiAgICAgICAgICBjcmVhdGUgbCB2IHJcblxuICAgICgqIFNtYWxsZXN0IGFuZCBncmVhdGVzdCBlbGVtZW50IG9mIGEgc2V0ICopXG5cbiAgICBsZXQgcmVjIG1pbl9lbHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsPUVtcHR5OyB2fSAtPiB2XG4gICAgICB8IE5vZGV7bH0gLT4gbWluX2VsdCBsXG5cbiAgICBsZXQgcmVjIG1pbl9lbHRfb3B0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2Rle2w9RW1wdHk7IHZ9IC0+IFNvbWUgdlxuICAgICAgfCBOb2Rle2x9IC0+IG1pbl9lbHRfb3B0IGxcblxuICAgIGxldCByZWMgbWF4X2VsdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle3Y7IHI9RW1wdHl9IC0+IHZcbiAgICAgIHwgTm9kZXtyfSAtPiBtYXhfZWx0IHJcblxuICAgIGxldCByZWMgbWF4X2VsdF9vcHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGV7djsgcj1FbXB0eX0gLT4gU29tZSB2XG4gICAgICB8IE5vZGV7cn0gLT4gbWF4X2VsdF9vcHQgclxuXG4gICAgKCogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IG9mIHRoZSBnaXZlbiBzZXQgKilcblxuICAgIGxldCByZWMgcmVtb3ZlX21pbl9lbHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5yZW1vdmVfbWluX2VsdFwiXG4gICAgICB8IE5vZGV7bD1FbXB0eTsgcn0gLT4gclxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGJhbCAocmVtb3ZlX21pbl9lbHQgbCkgdiByXG5cbiAgICAoKiBNZXJnZSB0d28gdHJlZXMgbCBhbmQgciBpbnRvIG9uZS5cbiAgICAgICBBbGwgZWxlbWVudHMgb2YgbCBtdXN0IHByZWNlZGUgdGhlIGVsZW1lbnRzIG9mIHIuXG4gICAgICAgQXNzdW1lIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDIuICopXG5cbiAgICBsZXQgbWVyZ2UgdDEgdDIgPVxuICAgICAgbWF0Y2ggKHQxLCB0Mikgd2l0aFxuICAgICAgICAoRW1wdHksIHQpIC0+IHRcbiAgICAgIHwgKHQsIEVtcHR5KSAtPiB0XG4gICAgICB8IChfLCBfKSAtPiBiYWwgdDEgKG1pbl9lbHQgdDIpIChyZW1vdmVfbWluX2VsdCB0MilcblxuICAgICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLlxuICAgICAgIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgICBObyBhc3N1bXB0aW9uIG9uIHRoZSBoZWlnaHRzIG9mIGwgYW5kIHIuICopXG5cbiAgICBsZXQgY29uY2F0IHQxIHQyID1cbiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0KSAtPiB0XG4gICAgICB8ICh0LCBFbXB0eSkgLT4gdFxuICAgICAgfCAoXywgXykgLT4gam9pbiB0MSAobWluX2VsdCB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuXG4gICAgKCogU3BsaXR0aW5nLiAgc3BsaXQgeCBzIHJldHVybnMgYSB0cmlwbGUgKGwsIHByZXNlbnQsIHIpIHdoZXJlXG4gICAgICAgIC0gbCBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIG9mIHMgdGhhdCBhcmUgPCB4XG4gICAgICAgIC0gciBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzIG9mIHMgdGhhdCBhcmUgPiB4XG4gICAgICAgIC0gcHJlc2VudCBpcyBmYWxzZSBpZiBzIGNvbnRhaW5zIG5vIGVsZW1lbnQgZXF1YWwgdG8geCxcbiAgICAgICAgICBvciB0cnVlIGlmIHMgY29udGFpbnMgYW4gZWxlbWVudCBlcXVhbCB0byB4LiAqKVxuXG4gICAgbGV0IHJlYyBzcGxpdCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAoRW1wdHksIGZhbHNlLCBFbXB0eSlcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiAobCwgdHJ1ZSwgcilcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCAobGwsIHByZXMsIHJsKSA9IHNwbGl0IHggbCBpbiAobGwsIHByZXMsIGpvaW4gcmwgdiByKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCAobHIsIHByZXMsIHJyKSA9IHNwbGl0IHggciBpbiAoam9pbiBsIHYgbHIsIHByZXMsIHJyKVxuXG4gICAgKCogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNldCBvcGVyYXRpb25zICopXG5cbiAgICBsZXQgZW1wdHkgPSBFbXB0eVxuXG4gICAgbGV0IGlzX2VtcHR5ID0gZnVuY3Rpb24gRW1wdHkgLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcblxuICAgIGxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBmYWxzZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBjID0gMCB8fCBtZW0geCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgcmVtb3ZlIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCAoTm9kZXtsOyB2OyByfSBhcyB0KSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBtZXJnZSBsIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICAgIGxldCBsbCA9IHJlbW92ZSB4IGwgaW5cbiAgICAgICAgICAgICAgaWYgbCA9PSBsbCB0aGVuIHRcbiAgICAgICAgICAgICAgZWxzZSBiYWwgbGwgdiByXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCByciA9IHJlbW92ZSB4IHIgaW5cbiAgICAgICAgICAgICAgaWYgciA9PSByciB0aGVuIHRcbiAgICAgICAgICAgICAgZWxzZSBiYWwgbCB2IHJyXG5cbiAgICBsZXQgcmVjIHVuaW9uIHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0MikgLT4gdDJcbiAgICAgIHwgKHQxLCBFbXB0eSkgLT4gdDFcbiAgICAgIHwgKE5vZGV7bD1sMTsgdj12MTsgcj1yMTsgaD1oMX0sIE5vZGV7bD1sMjsgdj12Mjsgcj1yMjsgaD1oMn0pIC0+XG4gICAgICAgICAgaWYgaDEgPj0gaDIgdGhlblxuICAgICAgICAgICAgaWYgaDIgPSAxIHRoZW4gYWRkIHYyIHMxIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbGV0IChsMiwgXywgcjIpID0gc3BsaXQgdjEgczIgaW5cbiAgICAgICAgICAgICAgam9pbiAodW5pb24gbDEgbDIpIHYxICh1bmlvbiByMSByMilcbiAgICAgICAgICAgIGVuZFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGlmIGgxID0gMSB0aGVuIGFkZCB2MSBzMiBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIGxldCAobDEsIF8sIHIxKSA9IHNwbGl0IHYyIHMxIGluXG4gICAgICAgICAgICAgIGpvaW4gKHVuaW9uIGwxIGwyKSB2MiAodW5pb24gcjEgcjIpXG4gICAgICAgICAgICBlbmRcblxuICAgIGxldCByZWMgaW50ZXIgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIC0+IEVtcHR5XG4gICAgICB8IChfLCBFbXB0eSkgLT4gRW1wdHlcbiAgICAgIHwgKE5vZGV7bD1sMTsgdj12MTsgcj1yMX0sIHQyKSAtPlxuICAgICAgICAgIG1hdGNoIHNwbGl0IHYxIHQyIHdpdGhcbiAgICAgICAgICAgIChsMiwgZmFsc2UsIHIyKSAtPlxuICAgICAgICAgICAgICBjb25jYXQgKGludGVyIGwxIGwyKSAoaW50ZXIgcjEgcjIpXG4gICAgICAgICAgfCAobDIsIHRydWUsIHIyKSAtPlxuICAgICAgICAgICAgICBqb2luIChpbnRlciBsMSBsMikgdjEgKGludGVyIHIxIHIyKVxuXG4gICAgKCogU2FtZSBhcyBzcGxpdCwgYnV0IGNvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWVzXG4gICAgICAgb25seSBpZiB0aGUgcGl2b3QgZWxlbWVudCBpcyBub3QgaW4gdGhlIHNldC4gIFRoZSByaWdodCBzdWJ0cmVlXG4gICAgICAgaXMgY29tcHV0ZWQgb24gZGVtYW5kLiAqKVxuXG4gICAgdHlwZSBzcGxpdF9iaXMgPVxuICAgICAgfCBGb3VuZFxuICAgICAgfCBOb3RGb3VuZCBvZiB0ICogKHVuaXQgLT4gdClcblxuICAgIGxldCByZWMgc3BsaXRfYmlzIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vdEZvdW5kIChFbXB0eSwgKGZ1biAoKSAtPiBFbXB0eSkpXG4gICAgICB8IE5vZGV7bDsgdjsgcjsgX30gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gRm91bmRcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIG1hdGNoIHNwbGl0X2JpcyB4IGwgd2l0aFxuICAgICAgICAgICAgfCBGb3VuZCAtPiBGb3VuZFxuICAgICAgICAgICAgfCBOb3RGb3VuZCAobGwsIHJsKSAtPiBOb3RGb3VuZCAobGwsIChmdW4gKCkgLT4gam9pbiAocmwgKCkpIHYgcikpXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF0Y2ggc3BsaXRfYmlzIHggciB3aXRoXG4gICAgICAgICAgICB8IEZvdW5kIC0+IEZvdW5kXG4gICAgICAgICAgICB8IE5vdEZvdW5kIChsciwgcnIpIC0+IE5vdEZvdW5kIChqb2luIGwgdiBsciwgcnIpXG5cbiAgICBsZXQgcmVjIGRpc2pvaW50IHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSB8IChfLCBFbXB0eSkgLT4gdHJ1ZVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxfSwgdDIpIC0+XG4gICAgICAgICAgaWYgczEgPT0gczIgdGhlbiBmYWxzZVxuICAgICAgICAgIGVsc2UgbWF0Y2ggc3BsaXRfYmlzIHYxIHQyIHdpdGhcbiAgICAgICAgICAgICAgTm90Rm91bmQobDIsIHIyKSAtPiBkaXNqb2ludCBsMSBsMiAmJiBkaXNqb2ludCByMSAocjIgKCkpXG4gICAgICAgICAgICB8IEZvdW5kIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVjIGRpZmYgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIC0+IEVtcHR5XG4gICAgICB8ICh0MSwgRW1wdHkpIC0+IHQxXG4gICAgICB8IChOb2Rle2w9bDE7IHY9djE7IHI9cjF9LCB0MikgLT5cbiAgICAgICAgICBtYXRjaCBzcGxpdCB2MSB0MiB3aXRoXG4gICAgICAgICAgICAobDIsIGZhbHNlLCByMikgLT5cbiAgICAgICAgICAgICAgam9pbiAoZGlmZiBsMSBsMikgdjEgKGRpZmYgcjEgcjIpXG4gICAgICAgICAgfCAobDIsIHRydWUsIHIyKSAtPlxuICAgICAgICAgICAgICBjb25jYXQgKGRpZmYgbDEgbDIpIChkaWZmIHIxIHIyKVxuXG4gICAgdHlwZSBlbnVtZXJhdGlvbiA9IEVuZCB8IE1vcmUgb2YgZWx0ICogdCAqIGVudW1lcmF0aW9uXG5cbiAgICBsZXQgcmVjIGNvbnNfZW51bSBzIGUgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBjb25zX2VudW0gbCAoTW9yZSh2LCByLCBlKSlcblxuICAgIGxldCByZWMgY29tcGFyZV9hdXggZTEgZTIgPVxuICAgICAgICBtYXRjaCAoZTEsIGUyKSB3aXRoXG4gICAgICAgIChFbmQsIEVuZCkgLT4gMFxuICAgICAgfCAoRW5kLCBfKSAgLT4gLTFcbiAgICAgIHwgKF8sIEVuZCkgLT4gMVxuICAgICAgfCAoTW9yZSh2MSwgcjEsIGUxKSwgTW9yZSh2MiwgcjIsIGUyKSkgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHYxIHYyIGluXG4gICAgICAgICAgaWYgYyA8PiAwXG4gICAgICAgICAgdGhlbiBjXG4gICAgICAgICAgZWxzZSBjb21wYXJlX2F1eCAoY29uc19lbnVtIHIxIGUxKSAoY29uc19lbnVtIHIyIGUyKVxuXG4gICAgbGV0IGNvbXBhcmUgczEgczIgPVxuICAgICAgY29tcGFyZV9hdXggKGNvbnNfZW51bSBzMSBFbmQpIChjb25zX2VudW0gczIgRW5kKVxuXG4gICAgbGV0IGVxdWFsIHMxIHMyID1cbiAgICAgIGNvbXBhcmUgczEgczIgPSAwXG5cbiAgICBsZXQgcmVjIHN1YnNldCBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIEVtcHR5LCBfIC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBfLCBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IE5vZGUge2w9bDE7IHY9djE7IHI9cjF9LCAoTm9kZSB7bD1sMjsgdj12Mjsgcj1yMn0gYXMgdDIpIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB2MSB2MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIHN1YnNldCBsMSBsMiAmJiBzdWJzZXQgcjEgcjJcbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIHN1YnNldCAoTm9kZSB7bD1sMTsgdj12MTsgcj1FbXB0eTsgaD0wfSkgbDIgJiYgc3Vic2V0IHIxIHQyXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3Vic2V0IChOb2RlIHtsPUVtcHR5OyB2PXYxOyByPXIxOyBoPTB9KSByMiAmJiBzdWJzZXQgbDEgdDJcblxuICAgIGxldCByZWMgaXRlciBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gKClcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBpdGVyIGYgbDsgZiB2OyBpdGVyIGYgclxuXG4gICAgbGV0IHJlYyBmb2xkIGYgcyBhY2N1ID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gZm9sZCBmIHIgKGYgdiAoZm9sZCBmIGwgYWNjdSkpXG5cbiAgICBsZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHRydWVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBwIHYgJiYgZm9yX2FsbCBwIGwgJiYgZm9yX2FsbCBwIHJcblxuICAgIGxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBmYWxzZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IHAgdiB8fCBleGlzdHMgcCBsIHx8IGV4aXN0cyBwIHJcblxuICAgIGxldCByZWMgZmlsdGVyIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCAoTm9kZXtsOyB2OyByfSkgYXMgdCAtPlxuICAgICAgICAgICgqIGNhbGwgW3BdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IGwnID0gZmlsdGVyIHAgbCBpblxuICAgICAgICAgIGxldCBwdiA9IHAgdiBpblxuICAgICAgICAgIGxldCByJyA9IGZpbHRlciBwIHIgaW5cbiAgICAgICAgICBpZiBwdiB0aGVuXG4gICAgICAgICAgICBpZiBsPT1sJyAmJiByPT1yJyB0aGVuIHQgZWxzZSBqb2luIGwnIHYgcidcbiAgICAgICAgICBlbHNlIGNvbmNhdCBsJyByJ1xuXG4gICAgbGV0IHJlYyBwYXJ0aXRpb24gcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IChFbXB0eSwgRW1wdHkpXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCAobHQsIGxmKSA9IHBhcnRpdGlvbiBwIGwgaW5cbiAgICAgICAgICBsZXQgcHYgPSBwIHYgaW5cbiAgICAgICAgICBsZXQgKHJ0LCByZikgPSBwYXJ0aXRpb24gcCByIGluXG4gICAgICAgICAgaWYgcHZcbiAgICAgICAgICB0aGVuIChqb2luIGx0IHYgcnQsIGNvbmNhdCBsZiByZilcbiAgICAgICAgICBlbHNlIChjb25jYXQgbHQgcnQsIGpvaW4gbGYgdiByZilcblxuICAgIGxldCByZWMgY2FyZGluYWwgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAwXG4gICAgICB8IE5vZGV7bDsgcn0gLT4gY2FyZGluYWwgbCArIDEgKyBjYXJkaW5hbCByXG5cbiAgICBsZXQgcmVjIGVsZW1lbnRzX2F1eCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGVsZW1lbnRzX2F1eCAodiA6OiBlbGVtZW50c19hdXggYWNjdSByKSBsXG5cbiAgICBsZXQgZWxlbWVudHMgcyA9XG4gICAgICBlbGVtZW50c19hdXggW10gc1xuXG4gICAgbGV0IGNob29zZSA9IG1pbl9lbHRcblxuICAgIGxldCBjaG9vc2Vfb3B0ID0gbWluX2VsdF9vcHRcblxuICAgIGxldCByZWMgZmluZCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gdlxuICAgICAgICAgIGVsc2UgZmluZCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X2F1eCB2MCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICB2MFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdjAgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3QgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdiBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdF9hdXggdjAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgU29tZSB2MFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2IGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9vcHQgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2IGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0IGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3RfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdjAgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lIHYwXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdiBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2MCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdiBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0IGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX29wdCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIFNvbWUgdlxuICAgICAgICAgIGVsc2UgZmluZF9vcHQgeCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCB0cnlfam9pbiBsIHYgciA9XG4gICAgICAoKiBbam9pbiBsIHYgcl0gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gKGVsZW1lbnRzIG9mIGwgPCB2IDxcbiAgICAgICAgIGVsZW1lbnRzIG9mIHIpOyB1c2UgW3RyeV9qb2luIGwgdiByXSB3aGVuIHRoaXMgcHJvcGVydHkgbWF5XG4gICAgICAgICBub3QgaG9sZCwgYnV0IHlvdSBob3BlIGl0IGRvZXMgaG9sZCBpbiB0aGUgY29tbW9uIGNhc2UgKilcbiAgICAgIGlmIChsID0gRW1wdHkgfHwgT3JkLmNvbXBhcmUgKG1heF9lbHQgbCkgdiA8IDApXG4gICAgICAmJiAociA9IEVtcHR5IHx8IE9yZC5jb21wYXJlIHYgKG1pbl9lbHQgcikgPCAwKVxuICAgICAgdGhlbiBqb2luIGwgdiByXG4gICAgICBlbHNlIHVuaW9uIGwgKGFkZCB2IHIpXG5cbiAgICBsZXQgcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgTm9kZXtsOyB2OyByfSBhcyB0IC0+XG4gICAgICAgICAoKiBlbmZvcmNlIGxlZnQtdG8tcmlnaHQgZXZhbHVhdGlvbiBvcmRlciAqKVxuICAgICAgICAgbGV0IGwnID0gbWFwIGYgbCBpblxuICAgICAgICAgbGV0IHYnID0gZiB2IGluXG4gICAgICAgICBsZXQgcicgPSBtYXAgZiByIGluXG4gICAgICAgICBpZiBsID09IGwnICYmIHYgPT0gdicgJiYgciA9PSByJyB0aGVuIHRcbiAgICAgICAgIGVsc2UgdHJ5X2pvaW4gbCcgdicgcidcblxuICAgIGxldCB0cnlfY29uY2F0IHQxIHQyID1cbiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0KSAtPiB0XG4gICAgICB8ICh0LCBFbXB0eSkgLT4gdFxuICAgICAgfCAoXywgXykgLT4gdHJ5X2pvaW4gdDEgKG1pbl9lbHQgdDIpIChyZW1vdmVfbWluX2VsdCB0MilcblxuICAgIGxldCByZWMgZmlsdGVyX21hcCBmID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgTm9kZXtsOyB2OyByfSBhcyB0IC0+XG4gICAgICAgICAoKiBlbmZvcmNlIGxlZnQtdG8tcmlnaHQgZXZhbHVhdGlvbiBvcmRlciAqKVxuICAgICAgICAgbGV0IGwnID0gZmlsdGVyX21hcCBmIGwgaW5cbiAgICAgICAgIGxldCB2JyA9IGYgdiBpblxuICAgICAgICAgbGV0IHInID0gZmlsdGVyX21hcCBmIHIgaW5cbiAgICAgICAgIGJlZ2luIG1hdGNoIHYnIHdpdGhcbiAgICAgICAgICAgfCBTb21lIHYnIC0+XG4gICAgICAgICAgICAgIGlmIGwgPT0gbCcgJiYgdiA9PSB2JyAmJiByID09IHInIHRoZW4gdFxuICAgICAgICAgICAgICBlbHNlIHRyeV9qb2luIGwnIHYnIHInXG4gICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICB0cnlfY29uY2F0IGwnIHInXG4gICAgICAgICBlbmRcblxuICAgIGxldCBvZl9zb3J0ZWRfbGlzdCBsID1cbiAgICAgIGxldCByZWMgc3ViIG4gbCA9XG4gICAgICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgICAgICB8IDAsIGwgLT4gRW1wdHksIGxcbiAgICAgICAgfCAxLCB4MCA6OiBsIC0+IE5vZGUge2w9RW1wdHk7IHY9eDA7IHI9RW1wdHk7IGg9MX0sIGxcbiAgICAgICAgfCAyLCB4MCA6OiB4MSA6OiBsIC0+XG4gICAgICAgICAgICBOb2Rle2w9Tm9kZXtsPUVtcHR5OyB2PXgwOyByPUVtcHR5OyBoPTF9OyB2PXgxOyByPUVtcHR5OyBoPTJ9LCBsXG4gICAgICAgIHwgMywgeDAgOjogeDEgOjogeDIgOjogbCAtPlxuICAgICAgICAgICAgTm9kZXtsPU5vZGV7bD1FbXB0eTsgdj14MDsgcj1FbXB0eTsgaD0xfTsgdj14MTtcbiAgICAgICAgICAgICAgICAgcj1Ob2Rle2w9RW1wdHk7IHY9eDI7IHI9RW1wdHk7IGg9MX07IGg9Mn0sIGxcbiAgICAgICAgfCBuLCBsIC0+XG4gICAgICAgICAgbGV0IG5sID0gbiAvIDIgaW5cbiAgICAgICAgICBsZXQgbGVmdCwgbCA9IHN1YiBubCBsIGluXG4gICAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgICAgfCBbXSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICB8IG1pZCA6OiBsIC0+XG4gICAgICAgICAgICBsZXQgcmlnaHQsIGwgPSBzdWIgKG4gLSBubCAtIDEpIGwgaW5cbiAgICAgICAgICAgIGNyZWF0ZSBsZWZ0IG1pZCByaWdodCwgbFxuICAgICAgaW5cbiAgICAgIGZzdCAoc3ViIChMaXN0Lmxlbmd0aCBsKSBsKVxuXG4gICAgbGV0IG9mX2xpc3QgbCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gZW1wdHlcbiAgICAgIHwgW3gwXSAtPiBzaW5nbGV0b24geDBcbiAgICAgIHwgW3gwOyB4MV0gLT4gYWRkIHgxIChzaW5nbGV0b24geDApXG4gICAgICB8IFt4MDsgeDE7IHgyXSAtPiBhZGQgeDIgKGFkZCB4MSAoc2luZ2xldG9uIHgwKSlcbiAgICAgIHwgW3gwOyB4MTsgeDI7IHgzXSAtPiBhZGQgeDMgKGFkZCB4MiAoYWRkIHgxIChzaW5nbGV0b24geDApKSlcbiAgICAgIHwgW3gwOyB4MTsgeDI7IHgzOyB4NF0gLT4gYWRkIHg0IChhZGQgeDMgKGFkZCB4MiAoYWRkIHgxIChzaW5nbGV0b24geDApKSkpXG4gICAgICB8IF8gLT4gb2Zfc29ydGVkX2xpc3QgKExpc3Quc29ydF91bmlxIE9yZC5jb21wYXJlIGwpXG5cbiAgICBsZXQgYWRkX3NlcSBpIG0gPVxuICAgICAgU2VxLmZvbGRfbGVmdCAoZnVuIHMgeCAtPiBhZGQgeCBzKSBtIGlcblxuICAgIGxldCBvZl9zZXEgaSA9IGFkZF9zZXEgaSBlbXB0eVxuXG4gICAgbGV0IHJlYyBzZXFfb2ZfZW51bV8gYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgICAgfCBFbmQgLT4gU2VxLk5pbFxuICAgICAgfCBNb3JlICh4LCB0LCByZXN0KSAtPiBTZXEuQ29ucyAoeCwgc2VxX29mX2VudW1fIChjb25zX2VudW0gdCByZXN0KSlcblxuICAgIGxldCB0b19zZXEgYyA9IHNlcV9vZl9lbnVtXyAoY29uc19lbnVtIGMgRW5kKVxuXG4gICAgbGV0IHJlYyBzbm9jX2VudW0gcyBlID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgICBFbXB0eSAtPiBlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gc25vY19lbnVtIHIgKE1vcmUodiwgbCwgZSkpXG5cbiAgICBsZXQgcmVjIHJldl9zZXFfb2ZfZW51bV8gYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgICAgfCBFbmQgLT4gU2VxLk5pbFxuICAgICAgfCBNb3JlICh4LCB0LCByZXN0KSAtPiBTZXEuQ29ucyAoeCwgcmV2X3NlcV9vZl9lbnVtXyAoc25vY19lbnVtIHQgcmVzdCkpXG5cbiAgICBsZXQgdG9fcmV2X3NlcSBjID0gcmV2X3NlcV9vZl9lbnVtXyAoc25vY19lbnVtIGMgRW5kKVxuXG4gICAgbGV0IHRvX3NlcV9mcm9tIGxvdyBzID1cbiAgICAgIGxldCByZWMgYXV4IGxvdyBzIGMgPSBtYXRjaCBzIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBjXG4gICAgICAgIHwgTm9kZSB7bDsgcjsgdjsgX30gLT5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIE9yZC5jb21wYXJlIHYgbG93IHdpdGhcbiAgICAgICAgICAgICAgfCAwIC0+IE1vcmUgKHYsIHIsIGMpXG4gICAgICAgICAgICAgIHwgbiB3aGVuIG48MCAtPiBhdXggbG93IHIgY1xuICAgICAgICAgICAgICB8IF8gLT4gYXV4IGxvdyBsIChNb3JlICh2LCByLCBjKSlcbiAgICAgICAgICAgIGVuZFxuICAgICAgaW5cbiAgICAgIHNlcV9vZl9lbnVtXyAoYXV4IGxvdyBzIEVuZClcbiAgZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm1vZHVsZSB0eXBlIE9yZGVyZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGNvbXBhcmU6IHQgLT4gdCAtPiBpbnRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISsnYSB0XG4gICAgdmFsIGVtcHR5OiAnYSB0XG4gICAgdmFsIGlzX2VtcHR5OiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgbWVtOiAga2V5IC0+ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBhZGQ6IGtleSAtPiAnYSAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgdXBkYXRlOiBrZXkgLT4gKCdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBzaW5nbGV0b246IGtleSAtPiAnYSAtPiAnYSB0XG4gICAgdmFsIHJlbW92ZToga2V5IC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBtZXJnZTpcbiAgICAgICAgICAoa2V5IC0+ICdhIG9wdGlvbiAtPiAnYiBvcHRpb24gLT4gJ2Mgb3B0aW9uKSAtPiAnYSB0IC0+ICdiIHQgLT4gJ2MgdFxuICAgIHZhbCB1bmlvbjogKGtleSAtPiAnYSAtPiAnYSAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGNvbXBhcmU6ICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnRcbiAgICB2YWwgZXF1YWw6ICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmb2xkOiAoa2V5IC0+ICdhIC0+ICdiIC0+ICdiKSAtPiAnYSB0IC0+ICdiIC0+ICdiXG4gICAgdmFsIGZvcl9hbGw6IChrZXkgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGV4aXN0czogKGtleSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgZmlsdGVyOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBmaWx0ZXJfbWFwOiAoa2V5IC0+ICdhIC0+ICdiIG9wdGlvbikgLT4gJ2EgdCAtPiAnYiB0XG4gICAgdmFsIHBhcnRpdGlvbjogKGtleSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgKiAnYSB0XG4gICAgdmFsIGNhcmRpbmFsOiAnYSB0IC0+IGludFxuICAgIHZhbCBiaW5kaW5nczogJ2EgdCAtPiAoa2V5ICogJ2EpIGxpc3RcbiAgICB2YWwgbWluX2JpbmRpbmc6ICdhIHQgLT4gKGtleSAqICdhKVxuICAgIHZhbCBtaW5fYmluZGluZ19vcHQ6ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgICB2YWwgbWF4X2JpbmRpbmc6ICdhIHQgLT4gKGtleSAqICdhKVxuICAgIHZhbCBtYXhfYmluZGluZ19vcHQ6ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgICB2YWwgY2hvb3NlOiAnYSB0IC0+IChrZXkgKiAnYSlcbiAgICB2YWwgY2hvb3NlX29wdDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBzcGxpdDoga2V5IC0+ICdhIHQgLT4gJ2EgdCAqICdhIG9wdGlvbiAqICdhIHRcbiAgICB2YWwgZmluZDoga2V5IC0+ICdhIHQgLT4gJ2FcbiAgICB2YWwgZmluZF9vcHQ6IGtleSAtPiAnYSB0IC0+ICdhIG9wdGlvblxuICAgIHZhbCBmaW5kX2ZpcnN0OiAoa2V5IC0+IGJvb2wpIC0+ICdhIHQgLT4ga2V5ICogJ2FcbiAgICB2YWwgZmluZF9maXJzdF9vcHQ6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICAgIHZhbCBmaW5kX2xhc3Q6IChrZXkgLT4gYm9vbCkgLT4gJ2EgdCAtPiBrZXkgKiAnYVxuICAgIHZhbCBmaW5kX2xhc3Rfb3B0OiAoa2V5IC0+IGJvb2wpIC0+ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgICB2YWwgbWFwOiAoJ2EgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgdFxuICAgIHZhbCBtYXBpOiAoa2V5IC0+ICdhIC0+ICdiKSAtPiAnYSB0IC0+ICdiIHRcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3Jldl9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2Zyb20gOiBrZXkgLT4gJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSBNYWtlKE9yZDogT3JkZXJlZFR5cGUpID0gc3RydWN0XG5cbiAgICB0eXBlIGtleSA9IE9yZC50XG5cbiAgICB0eXBlICdhIHQgPVxuICAgICAgICBFbXB0eVxuICAgICAgfCBOb2RlIG9mIHtsOidhIHQ7IHY6a2V5OyBkOidhOyByOidhIHQ7IGg6aW50fVxuXG4gICAgbGV0IGhlaWdodCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZSB7aH0gLT4gaFxuXG4gICAgbGV0IGNyZWF0ZSBsIHggZCByID1cbiAgICAgIGxldCBobCA9IGhlaWdodCBsIGFuZCBociA9IGhlaWdodCByIGluXG4gICAgICBOb2Rle2w7IHY9eDsgZDsgcjsgaD0oaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpfVxuXG4gICAgbGV0IHNpbmdsZXRvbiB4IGQgPSBOb2Rle2w9RW1wdHk7IHY9eDsgZDsgcj1FbXB0eTsgaD0xfVxuXG4gICAgbGV0IGJhbCBsIHggZCByID1cbiAgICAgIGxldCBobCA9IG1hdGNoIGwgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgbGV0IGhyID0gbWF0Y2ggciB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBpZiBobCA+IGhyICsgMiB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgIHwgTm9kZXtsPWxsOyB2PWx2OyBkPWxkOyByPWxyfSAtPlxuICAgICAgICAgICAgaWYgaGVpZ2h0IGxsID49IGhlaWdodCBsciB0aGVuXG4gICAgICAgICAgICAgIGNyZWF0ZSBsbCBsdiBsZCAoY3JlYXRlIGxyIHggZCByKVxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBtYXRjaCBsciB3aXRoXG4gICAgICAgICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgICAgICAgfCBOb2Rle2w9bHJsOyB2PWxydjsgZD1scmQ7IHI9bHJyfS0+XG4gICAgICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBsZCBscmwpIGxydiBscmQgKGNyZWF0ZSBscnIgeCBkIHIpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGVuZCBlbHNlIGlmIGhyID4gaGwgKyAyIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgfCBOb2Rle2w9cmw7IHY9cnY7IGQ9cmQ7IHI9cnJ9IC0+XG4gICAgICAgICAgICBpZiBoZWlnaHQgcnIgPj0gaGVpZ2h0IHJsIHRoZW5cbiAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB4IGQgcmwpIHJ2IHJkIHJyXG4gICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIG1hdGNoIHJsIHdpdGhcbiAgICAgICAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICAgICAgICB8IE5vZGV7bD1ybGw7IHY9cmx2OyBkPXJsZDsgcj1ybHJ9IC0+XG4gICAgICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHggZCBybGwpIHJsdiBybGQgKGNyZWF0ZSBybHIgcnYgcmQgcnIpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIE5vZGV7bDsgdj14OyBkOyByOyBoPShpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSl9XG5cbiAgICBsZXQgZW1wdHkgPSBFbXB0eVxuXG4gICAgbGV0IGlzX2VtcHR5ID0gZnVuY3Rpb24gRW1wdHkgLT4gdHJ1ZSB8IF8gLT4gZmFsc2VcblxuICAgIGxldCByZWMgYWRkIHggZGF0YSA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9kZXtsPUVtcHR5OyB2PXg7IGQ9ZGF0YTsgcj1FbXB0eTsgaD0xfVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSBhcyBtIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBpZiBkID09IGRhdGEgdGhlbiBtIGVsc2UgTm9kZXtsOyB2PXg7IGQ9ZGF0YTsgcjsgaH1cbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBsbCA9IGFkZCB4IGRhdGEgbCBpblxuICAgICAgICAgICAgaWYgbCA9PSBsbCB0aGVuIG0gZWxzZSBiYWwgbGwgdiBkIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSBhZGQgeCBkYXRhIHIgaW5cbiAgICAgICAgICAgIGlmIHIgPT0gcnIgdGhlbiBtIGVsc2UgYmFsIGwgdiBkIHJyXG5cbiAgICBsZXQgcmVjIGZpbmQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIGRcbiAgICAgICAgICBlbHNlIGZpbmQgeCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9hdXggdjAgZDAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgKHYwLCBkMClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYwIGQwIGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGQgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9vcHRfYXV4IHYwIGQwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIFNvbWUgKHYwLCBkMClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZCBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdjAgZDAgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3Rfb3B0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYgZCBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdCBmIHJcblxuICAgIGxldCByZWMgZmluZF9sYXN0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYwIGQwIGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3QgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBkIGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0X29wdF9hdXggdjAgZDAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgU29tZSAodjAsIGQwKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGQgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdjAgZDAgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9vcHQgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3Rfb3B0X2F1eCB2IGQgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X29wdCBmIGxcblxuICAgIGxldCByZWMgZmluZF9vcHQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBTb21lIGRcbiAgICAgICAgICBlbHNlIGZpbmRfb3B0IHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIG1lbSB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBOb2RlIHtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgYyA9IDAgfHwgbWVtIHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIG1pbl9iaW5kaW5nID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGUge2w9RW1wdHk7IHY7IGR9IC0+ICh2LCBkKVxuICAgICAgfCBOb2RlIHtsfSAtPiBtaW5fYmluZGluZyBsXG5cbiAgICBsZXQgcmVjIG1pbl9iaW5kaW5nX29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZSB7bD1FbXB0eTsgdjsgZH0gLT4gU29tZSAodiwgZClcbiAgICAgIHwgTm9kZSB7bH0tPiBtaW5fYmluZGluZ19vcHQgbFxuXG4gICAgbGV0IHJlYyBtYXhfYmluZGluZyA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2RlIHt2OyBkOyByPUVtcHR5fSAtPiAodiwgZClcbiAgICAgIHwgTm9kZSB7cn0gLT4gbWF4X2JpbmRpbmcgclxuXG4gICAgbGV0IHJlYyBtYXhfYmluZGluZ19vcHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGUge3Y7IGQ7IHI9RW1wdHl9IC0+IFNvbWUgKHYsIGQpXG4gICAgICB8IE5vZGUge3J9IC0+IG1heF9iaW5kaW5nX29wdCByXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9taW5fYmluZGluZyA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLnJlbW92ZV9taW5fZWx0XCJcbiAgICAgIHwgTm9kZSB7bD1FbXB0eTsgcn0gLT4gclxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBiYWwgKHJlbW92ZV9taW5fYmluZGluZyBsKSB2IGQgclxuXG4gICAgbGV0IG1lcmdlIHQxIHQyID1cbiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0KSAtPiB0XG4gICAgICB8ICh0LCBFbXB0eSkgLT4gdFxuICAgICAgfCAoXywgXykgLT5cbiAgICAgICAgICBsZXQgKHgsIGQpID0gbWluX2JpbmRpbmcgdDIgaW5cbiAgICAgICAgICBiYWwgdDEgeCBkIChyZW1vdmVfbWluX2JpbmRpbmcgdDIpXG5cbiAgICBsZXQgcmVjIHJlbW92ZSB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBFbXB0eVxuICAgICAgfCAoTm9kZSB7bDsgdjsgZDsgcn0gYXMgbSkgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gbWVyZ2UgbCByXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgbGwgPSByZW1vdmUgeCBsIGluIGlmIGwgPT0gbGwgdGhlbiBtIGVsc2UgYmFsIGxsIHYgZCByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IHJyID0gcmVtb3ZlIHggciBpbiBpZiByID09IHJyIHRoZW4gbSBlbHNlIGJhbCBsIHYgZCByclxuXG4gICAgbGV0IHJlYyB1cGRhdGUgeCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBmIE5vbmUgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBFbXB0eVxuICAgICAgICAgIHwgU29tZSBkYXRhIC0+IE5vZGV7bD1FbXB0eTsgdj14OyBkPWRhdGE7IHI9RW1wdHk7IGg9MX1cbiAgICAgICAgICBlbmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcjsgaH0gYXMgbSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBiZWdpblxuICAgICAgICAgICAgbWF0Y2ggZiAoU29tZSBkKSB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gbWVyZ2UgbCByXG4gICAgICAgICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgICAgICAgIGlmIGQgPT0gZGF0YSB0aGVuIG0gZWxzZSBOb2Rle2w7IHY9eDsgZD1kYXRhOyByOyBofVxuICAgICAgICAgIGVuZCBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBsbCA9IHVwZGF0ZSB4IGYgbCBpblxuICAgICAgICAgICAgaWYgbCA9PSBsbCB0aGVuIG0gZWxzZSBiYWwgbGwgdiBkIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgcnIgPSB1cGRhdGUgeCBmIHIgaW5cbiAgICAgICAgICAgIGlmIHIgPT0gcnIgdGhlbiBtIGVsc2UgYmFsIGwgdiBkIHJyXG5cbiAgICBsZXQgcmVjIGl0ZXIgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+ICgpXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaXRlciBmIGw7IGYgdiBkOyBpdGVyIGYgclxuXG4gICAgbGV0IHJlYyBtYXAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgRW1wdHlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcjsgaH0gLT5cbiAgICAgICAgICBsZXQgbCcgPSBtYXAgZiBsIGluXG4gICAgICAgICAgbGV0IGQnID0gZiBkIGluXG4gICAgICAgICAgbGV0IHInID0gbWFwIGYgciBpblxuICAgICAgICAgIE5vZGV7bD1sJzsgdjsgZD1kJzsgcj1yJzsgaH1cblxuICAgIGxldCByZWMgbWFwaSBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBofSAtPlxuICAgICAgICAgIGxldCBsJyA9IG1hcGkgZiBsIGluXG4gICAgICAgICAgbGV0IGQnID0gZiB2IGQgaW5cbiAgICAgICAgICBsZXQgcicgPSBtYXBpIGYgciBpblxuICAgICAgICAgIE5vZGV7bD1sJzsgdjsgZD1kJzsgcj1yJzsgaH1cblxuICAgIGxldCByZWMgZm9sZCBmIG0gYWNjdSA9XG4gICAgICBtYXRjaCBtIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGZvbGQgZiByIChmIHYgZCAoZm9sZCBmIGwgYWNjdSkpXG5cbiAgICBsZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHRydWVcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT4gcCB2IGQgJiYgZm9yX2FsbCBwIGwgJiYgZm9yX2FsbCBwIHJcblxuICAgIGxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBmYWxzZVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPiBwIHYgZCB8fCBleGlzdHMgcCBsIHx8IGV4aXN0cyBwIHJcblxuICAgICgqIEJld2FyZTogdGhvc2UgdHdvIGZ1bmN0aW9ucyBhc3N1bWUgdGhhdCB0aGUgYWRkZWQgayBpcyAqc3RyaWN0bHkqXG4gICAgICAgc21hbGxlciAob3IgYmlnZ2VyKSB0aGFuIGFsbCB0aGUgcHJlc2VudCBrZXlzIGluIHRoZSB0cmVlOyBpdFxuICAgICAgIGRvZXMgbm90IHRlc3QgZm9yIGVxdWFsaXR5IHdpdGggdGhlIGN1cnJlbnQgbWluIChvciBtYXgpIGtleS5cblxuICAgICAgIEluZGVlZCwgdGhleSBhcmUgb25seSB1c2VkIGR1cmluZyB0aGUgXCJqb2luXCIgb3BlcmF0aW9uIHdoaWNoXG4gICAgICAgcmVzcGVjdHMgdGhpcyBwcmVjb25kaXRpb24uXG4gICAgKilcblxuICAgIGxldCByZWMgYWRkX21pbl9iaW5kaW5nIGsgeCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IHNpbmdsZXRvbiBrIHhcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgYmFsIChhZGRfbWluX2JpbmRpbmcgayB4IGwpIHYgZCByXG5cbiAgICBsZXQgcmVjIGFkZF9tYXhfYmluZGluZyBrIHggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBzaW5nbGV0b24gayB4XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgIGJhbCBsIHYgZCAoYWRkX21heF9iaW5kaW5nIGsgeCByKVxuXG4gICAgKCogU2FtZSBhcyBjcmVhdGUgYW5kIGJhbCwgYnV0IG5vIGFzc3VtcHRpb25zIGFyZSBtYWRlIG9uIHRoZVxuICAgICAgIHJlbGF0aXZlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcblxuICAgIGxldCByZWMgam9pbiBsIHYgZCByID1cbiAgICAgIG1hdGNoIChsLCByKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gYWRkX21pbl9iaW5kaW5nIHYgZCByXG4gICAgICB8IChfLCBFbXB0eSkgLT4gYWRkX21heF9iaW5kaW5nIHYgZCBsXG4gICAgICB8IChOb2Rle2w9bGw7IHY9bHY7IGQ9bGQ7IHI9bHI7IGg9bGh9LFxuICAgICAgICAgTm9kZXtsPXJsOyB2PXJ2OyBkPXJkOyByPXJyOyBoPXJofSkgLT5cbiAgICAgICAgICBpZiBsaCA+IHJoICsgMiB0aGVuIGJhbCBsbCBsdiBsZCAoam9pbiBsciB2IGQgcikgZWxzZVxuICAgICAgICAgIGlmIHJoID4gbGggKyAyIHRoZW4gYmFsIChqb2luIGwgdiBkIHJsKSBydiByZCByciBlbHNlXG4gICAgICAgICAgY3JlYXRlIGwgdiBkIHJcblxuICAgICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLlxuICAgICAgIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgICBObyBhc3N1bXB0aW9uIG9uIHRoZSBoZWlnaHRzIG9mIGwgYW5kIHIuICopXG5cbiAgICBsZXQgY29uY2F0IHQxIHQyID1cbiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0KSAtPiB0XG4gICAgICB8ICh0LCBFbXB0eSkgLT4gdFxuICAgICAgfCAoXywgXykgLT5cbiAgICAgICAgICBsZXQgKHgsIGQpID0gbWluX2JpbmRpbmcgdDIgaW5cbiAgICAgICAgICBqb2luIHQxIHggZCAocmVtb3ZlX21pbl9iaW5kaW5nIHQyKVxuXG4gICAgbGV0IGNvbmNhdF9vcl9qb2luIHQxIHYgZCB0MiA9XG4gICAgICBtYXRjaCBkIHdpdGhcbiAgICAgIHwgU29tZSBkIC0+IGpvaW4gdDEgdiBkIHQyXG4gICAgICB8IE5vbmUgLT4gY29uY2F0IHQxIHQyXG5cbiAgICBsZXQgcmVjIHNwbGl0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIChFbXB0eSwgTm9uZSwgRW1wdHkpXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIChsLCBTb21lIGQsIHIpXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgKGxsLCBwcmVzLCBybCkgPSBzcGxpdCB4IGwgaW4gKGxsLCBwcmVzLCBqb2luIHJsIHYgZCByKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCAobHIsIHByZXMsIHJyKSA9IHNwbGl0IHggciBpbiAoam9pbiBsIHYgZCBsciwgcHJlcywgcnIpXG5cbiAgICBsZXQgcmVjIG1lcmdlIGYgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICAoRW1wdHksIEVtcHR5KSAtPiBFbXB0eVxuICAgICAgfCAoTm9kZSB7bD1sMTsgdj12MTsgZD1kMTsgcj1yMTsgaD1oMX0sIF8pIHdoZW4gaDEgPj0gaGVpZ2h0IHMyIC0+XG4gICAgICAgICAgbGV0IChsMiwgZDIsIHIyKSA9IHNwbGl0IHYxIHMyIGluXG4gICAgICAgICAgY29uY2F0X29yX2pvaW4gKG1lcmdlIGYgbDEgbDIpIHYxIChmIHYxIChTb21lIGQxKSBkMikgKG1lcmdlIGYgcjEgcjIpXG4gICAgICB8IChfLCBOb2RlIHtsPWwyOyB2PXYyOyBkPWQyOyByPXIyfSkgLT5cbiAgICAgICAgICBsZXQgKGwxLCBkMSwgcjEpID0gc3BsaXQgdjIgczEgaW5cbiAgICAgICAgICBjb25jYXRfb3Jfam9pbiAobWVyZ2UgZiBsMSBsMikgdjIgKGYgdjIgZDEgKFNvbWUgZDIpKSAobWVyZ2UgZiByMSByMilcbiAgICAgIHwgXyAtPlxuICAgICAgICAgIGFzc2VydCBmYWxzZVxuXG4gICAgbGV0IHJlYyB1bmlvbiBmIHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgIHwgKEVtcHR5LCBzKSB8IChzLCBFbXB0eSkgLT4gc1xuICAgICAgfCAoTm9kZSB7bD1sMTsgdj12MTsgZD1kMTsgcj1yMTsgaD1oMX0sXG4gICAgICAgICBOb2RlIHtsPWwyOyB2PXYyOyBkPWQyOyByPXIyOyBoPWgyfSkgLT5cbiAgICAgICAgICBpZiBoMSA+PSBoMiB0aGVuXG4gICAgICAgICAgICBsZXQgKGwyLCBkMiwgcjIpID0gc3BsaXQgdjEgczIgaW5cbiAgICAgICAgICAgIGxldCBsID0gdW5pb24gZiBsMSBsMiBhbmQgciA9IHVuaW9uIGYgcjEgcjIgaW5cbiAgICAgICAgICAgIG1hdGNoIGQyIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiBqb2luIGwgdjEgZDEgclxuICAgICAgICAgICAgfCBTb21lIGQyIC0+IGNvbmNhdF9vcl9qb2luIGwgdjEgKGYgdjEgZDEgZDIpIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgKGwxLCBkMSwgcjEpID0gc3BsaXQgdjIgczEgaW5cbiAgICAgICAgICAgIGxldCBsID0gdW5pb24gZiBsMSBsMiBhbmQgciA9IHVuaW9uIGYgcjEgcjIgaW5cbiAgICAgICAgICAgIG1hdGNoIGQxIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiBqb2luIGwgdjIgZDIgclxuICAgICAgICAgICAgfCBTb21lIGQxIC0+IGNvbmNhdF9vcl9qb2luIGwgdjIgKGYgdjIgZDEgZDIpIHJcblxuICAgIGxldCByZWMgZmlsdGVyIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBFbXB0eVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSBhcyBtIC0+XG4gICAgICAgICAgKCogY2FsbCBbcF0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgbCcgPSBmaWx0ZXIgcCBsIGluXG4gICAgICAgICAgbGV0IHB2ZCA9IHAgdiBkIGluXG4gICAgICAgICAgbGV0IHInID0gZmlsdGVyIHAgciBpblxuICAgICAgICAgIGlmIHB2ZCB0aGVuIGlmIGw9PWwnICYmIHI9PXInIHRoZW4gbSBlbHNlIGpvaW4gbCcgdiBkIHInXG4gICAgICAgICAgZWxzZSBjb25jYXQgbCcgcidcblxuICAgIGxldCByZWMgZmlsdGVyX21hcCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICAoKiBjYWxsIFtmXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCBsJyA9IGZpbHRlcl9tYXAgZiBsIGluXG4gICAgICAgICAgbGV0IGZ2ZCA9IGYgdiBkIGluXG4gICAgICAgICAgbGV0IHInID0gZmlsdGVyX21hcCBmIHIgaW5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBmdmQgd2l0aFxuICAgICAgICAgICAgfCBTb21lIGQnIC0+IGpvaW4gbCcgdiBkJyByJ1xuICAgICAgICAgICAgfCBOb25lIC0+IGNvbmNhdCBsJyByJ1xuICAgICAgICAgIGVuZFxuXG4gICAgbGV0IHJlYyBwYXJ0aXRpb24gcCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IChFbXB0eSwgRW1wdHkpXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgKCogY2FsbCBbcF0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgKGx0LCBsZikgPSBwYXJ0aXRpb24gcCBsIGluXG4gICAgICAgICAgbGV0IHB2ZCA9IHAgdiBkIGluXG4gICAgICAgICAgbGV0IChydCwgcmYpID0gcGFydGl0aW9uIHAgciBpblxuICAgICAgICAgIGlmIHB2ZFxuICAgICAgICAgIHRoZW4gKGpvaW4gbHQgdiBkIHJ0LCBjb25jYXQgbGYgcmYpXG4gICAgICAgICAgZWxzZSAoY29uY2F0IGx0IHJ0LCBqb2luIGxmIHYgZCByZilcblxuICAgIHR5cGUgJ2EgZW51bWVyYXRpb24gPSBFbmQgfCBNb3JlIG9mIGtleSAqICdhICogJ2EgdCAqICdhIGVudW1lcmF0aW9uXG5cbiAgICBsZXQgcmVjIGNvbnNfZW51bSBtIGUgPVxuICAgICAgbWF0Y2ggbSB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGVcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT4gY29uc19lbnVtIGwgKE1vcmUodiwgZCwgciwgZSkpXG5cbiAgICBsZXQgY29tcGFyZSBjbXAgbTEgbTIgPVxuICAgICAgbGV0IHJlYyBjb21wYXJlX2F1eCBlMSBlMiA9XG4gICAgICAgICAgbWF0Y2ggKGUxLCBlMikgd2l0aFxuICAgICAgICAgIChFbmQsIEVuZCkgLT4gMFxuICAgICAgICB8IChFbmQsIF8pICAtPiAtMVxuICAgICAgICB8IChfLCBFbmQpIC0+IDFcbiAgICAgICAgfCAoTW9yZSh2MSwgZDEsIHIxLCBlMSksIE1vcmUodjIsIGQyLCByMiwgZTIpKSAtPlxuICAgICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB2MSB2MiBpblxuICAgICAgICAgICAgaWYgYyA8PiAwIHRoZW4gYyBlbHNlXG4gICAgICAgICAgICBsZXQgYyA9IGNtcCBkMSBkMiBpblxuICAgICAgICAgICAgaWYgYyA8PiAwIHRoZW4gYyBlbHNlXG4gICAgICAgICAgICBjb21wYXJlX2F1eCAoY29uc19lbnVtIHIxIGUxKSAoY29uc19lbnVtIHIyIGUyKVxuICAgICAgaW4gY29tcGFyZV9hdXggKGNvbnNfZW51bSBtMSBFbmQpIChjb25zX2VudW0gbTIgRW5kKVxuXG4gICAgbGV0IGVxdWFsIGNtcCBtMSBtMiA9XG4gICAgICBsZXQgcmVjIGVxdWFsX2F1eCBlMSBlMiA9XG4gICAgICAgICAgbWF0Y2ggKGUxLCBlMikgd2l0aFxuICAgICAgICAgIChFbmQsIEVuZCkgLT4gdHJ1ZVxuICAgICAgICB8IChFbmQsIF8pICAtPiBmYWxzZVxuICAgICAgICB8IChfLCBFbmQpIC0+IGZhbHNlXG4gICAgICAgIHwgKE1vcmUodjEsIGQxLCByMSwgZTEpLCBNb3JlKHYyLCBkMiwgcjIsIGUyKSkgLT5cbiAgICAgICAgICAgIE9yZC5jb21wYXJlIHYxIHYyID0gMCAmJiBjbXAgZDEgZDIgJiZcbiAgICAgICAgICAgIGVxdWFsX2F1eCAoY29uc19lbnVtIHIxIGUxKSAoY29uc19lbnVtIHIyIGUyKVxuICAgICAgaW4gZXF1YWxfYXV4IChjb25zX2VudW0gbTEgRW5kKSAoY29uc19lbnVtIG0yIEVuZClcblxuICAgIGxldCByZWMgY2FyZGluYWwgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAwXG4gICAgICB8IE5vZGUge2w7IHJ9IC0+IGNhcmRpbmFsIGwgKyAxICsgY2FyZGluYWwgclxuXG4gICAgbGV0IHJlYyBiaW5kaW5nc19hdXggYWNjdSA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT4gYmluZGluZ3NfYXV4ICgodiwgZCkgOjogYmluZGluZ3NfYXV4IGFjY3UgcikgbFxuXG4gICAgbGV0IGJpbmRpbmdzIHMgPVxuICAgICAgYmluZGluZ3NfYXV4IFtdIHNcblxuICAgIGxldCBjaG9vc2UgPSBtaW5fYmluZGluZ1xuXG4gICAgbGV0IGNob29zZV9vcHQgPSBtaW5fYmluZGluZ19vcHRcblxuICAgIGxldCBhZGRfc2VxIGkgbSA9XG4gICAgICBTZXEuZm9sZF9sZWZ0IChmdW4gbSAoayx2KSAtPiBhZGQgayB2IG0pIG0gaVxuXG4gICAgbGV0IG9mX3NlcSBpID0gYWRkX3NlcSBpIGVtcHR5XG5cbiAgICBsZXQgcmVjIHNlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKGssdix0LHJlc3QpIC0+IFNlcS5Db25zICgoayx2KSwgc2VxX29mX2VudW1fIChjb25zX2VudW0gdCByZXN0KSlcblxuICAgIGxldCB0b19zZXEgbSA9XG4gICAgICBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSBtIEVuZClcblxuICAgIGxldCByZWMgc25vY19lbnVtIHMgZSA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2Rle2w7IHY7IGQ7IHJ9IC0+IHNub2NfZW51bSByIChNb3JlKHYsIGQsIGwsIGUpKVxuXG4gICAgbGV0IHJlYyByZXZfc2VxX29mX2VudW1fIGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICAgIHwgRW5kIC0+IFNlcS5OaWxcbiAgICAgIHwgTW9yZSAoayx2LHQscmVzdCkgLT5cbiAgICAgICAgICBTZXEuQ29ucyAoKGssdiksIHJldl9zZXFfb2ZfZW51bV8gKHNub2NfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3Jldl9zZXEgYyA9XG4gICAgICByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gYyBFbmQpXG5cbiAgICBsZXQgdG9fc2VxX2Zyb20gbG93IG0gPVxuICAgICAgbGV0IHJlYyBhdXggbG93IG0gYyA9IG1hdGNoIG0gd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGNcbiAgICAgICAgfCBOb2RlIHtsOyB2OyBkOyByOyBffSAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggT3JkLmNvbXBhcmUgdiBsb3cgd2l0aFxuICAgICAgICAgICAgICB8IDAgLT4gTW9yZSAodiwgZCwgciwgYylcbiAgICAgICAgICAgICAgfCBuIHdoZW4gbjwwIC0+IGF1eCBsb3cgciBjXG4gICAgICAgICAgICAgIHwgXyAtPiBhdXggbG93IGwgKE1vcmUgKHYsIGQsIHIsIGMpKVxuICAgICAgICAgICAgZW5kXG4gICAgICBpblxuICAgICAgc2VxX29mX2VudW1fIChhdXggbG93IG0gRW5kKVxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgJ2EgdCA9IHsgbXV0YWJsZSBjIDogJ2EgbGlzdDsgbXV0YWJsZSBsZW4gOiBpbnQ7IH1cblxuZXhjZXB0aW9uIEVtcHR5XG5cbmxldCBjcmVhdGUgKCkgPSB7IGMgPSBbXTsgbGVuID0gMDsgfVxuXG5sZXQgY2xlYXIgcyA9IHMuYyA8LSBbXTsgcy5sZW4gPC0gMFxuXG5sZXQgY29weSBzID0geyBjID0gcy5jOyBsZW4gPSBzLmxlbjsgfVxuXG5sZXQgcHVzaCB4IHMgPSBzLmMgPC0geCA6OiBzLmM7IHMubGVuIDwtIHMubGVuICsgMVxuXG5sZXQgcG9wIHMgPVxuICBtYXRjaCBzLmMgd2l0aFxuICB8IGhkOjp0bCAtPiBzLmMgPC0gdGw7IHMubGVuIDwtIHMubGVuIC0gMTsgaGRcbiAgfCBbXSAgICAgLT4gcmFpc2UgRW1wdHlcblxubGV0IHBvcF9vcHQgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6OnRsIC0+IHMuYyA8LSB0bDsgcy5sZW4gPC0gcy5sZW4gLSAxOyBTb21lIGhkXG4gIHwgW10gICAgIC0+IE5vbmVcblxubGV0IHRvcCBzID1cbiAgbWF0Y2ggcy5jIHdpdGhcbiAgfCBoZDo6XyAtPiBoZFxuICB8IFtdICAgIC0+IHJhaXNlIEVtcHR5XG5cbmxldCB0b3Bfb3B0IHMgPVxuICBtYXRjaCBzLmMgd2l0aFxuICB8IGhkOjpfIC0+IFNvbWUgaGRcbiAgfCBbXSAgICAtPiBOb25lXG5cbmxldCBpc19lbXB0eSBzID0gKHMuYyA9IFtdKVxuXG5sZXQgbGVuZ3RoIHMgPSBzLmxlblxuXG5sZXQgaXRlciBmIHMgPSBMaXN0Lml0ZXIgZiBzLmNcblxubGV0IGZvbGQgZiBhY2MgcyA9IExpc3QuZm9sZF9sZWZ0IGYgYWNjIHMuY1xuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHMgPSBMaXN0LnRvX3NlcSBzLmNcblxubGV0IGFkZF9zZXEgcSBpID0gU2VxLml0ZXIgKGZ1biB4IC0+IHB1c2ggeCBxKSBpXG5cbmxldCBvZl9zZXEgZyA9XG4gIGxldCBzID0gY3JlYXRlKCkgaW5cbiAgYWRkX3NlcSBzIGc7XG4gIHNcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgRnJhbmNvaXMgUG90dGllciwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgSmVyZW1pZSBEaW1pbm8sIEphbmUgU3RyZWV0IEV1cm9wZSAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXhjZXB0aW9uIEVtcHR5XG5cbnR5cGUgJ2EgY2VsbCA9XG4gIHwgTmlsXG4gIHwgQ29ucyBvZiB7IGNvbnRlbnQ6ICdhOyBtdXRhYmxlIG5leHQ6ICdhIGNlbGwgfVxuXG50eXBlICdhIHQgPSB7XG4gIG11dGFibGUgbGVuZ3RoOiBpbnQ7XG4gIG11dGFibGUgZmlyc3Q6ICdhIGNlbGw7XG4gIG11dGFibGUgbGFzdDogJ2EgY2VsbFxufVxuXG5sZXQgY3JlYXRlICgpID0ge1xuICBsZW5ndGggPSAwO1xuICBmaXJzdCA9IE5pbDtcbiAgbGFzdCA9IE5pbFxufVxuXG5sZXQgY2xlYXIgcSA9XG4gIHEubGVuZ3RoIDwtIDA7XG4gIHEuZmlyc3QgPC0gTmlsO1xuICBxLmxhc3QgPC0gTmlsXG5cbmxldCBhZGQgeCBxID1cbiAgbGV0IGNlbGwgPSBDb25zIHtcbiAgICBjb250ZW50ID0geDtcbiAgICBuZXh0ID0gTmlsXG4gIH0gaW5cbiAgbWF0Y2ggcS5sYXN0IHdpdGhcbiAgfCBOaWwgLT5cbiAgICBxLmxlbmd0aCA8LSAxO1xuICAgIHEuZmlyc3QgPC0gY2VsbDtcbiAgICBxLmxhc3QgPC0gY2VsbFxuICB8IENvbnMgbGFzdCAtPlxuICAgIHEubGVuZ3RoIDwtIHEubGVuZ3RoICsgMTtcbiAgICBsYXN0Lm5leHQgPC0gY2VsbDtcbiAgICBxLmxhc3QgPC0gY2VsbFxuXG5sZXQgcHVzaCA9XG4gIGFkZFxuXG5sZXQgcGVlayBxID1cbiAgbWF0Y2ggcS5maXJzdCB3aXRoXG4gIHwgTmlsIC0+IHJhaXNlIEVtcHR5XG4gIHwgQ29ucyB7IGNvbnRlbnQgfSAtPiBjb250ZW50XG5cbmxldCBwZWVrX29wdCBxID1cbiAgbWF0Y2ggcS5maXJzdCB3aXRoXG4gIHwgTmlsIC0+IE5vbmVcbiAgfCBDb25zIHsgY29udGVudCB9IC0+IFNvbWUgY29udGVudFxuXG5sZXQgdG9wID1cbiAgcGVla1xuXG5sZXQgdGFrZSBxID1cbiAgbWF0Y2ggcS5maXJzdCB3aXRoXG4gIHwgTmlsIC0+IHJhaXNlIEVtcHR5XG4gIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgPSBOaWwgfSAtPlxuICAgIGNsZWFyIHE7XG4gICAgY29udGVudFxuICB8IENvbnMgeyBjb250ZW50OyBuZXh0IH0gLT5cbiAgICBxLmxlbmd0aCA8LSBxLmxlbmd0aCAtIDE7XG4gICAgcS5maXJzdCA8LSBuZXh0O1xuICAgIGNvbnRlbnRcblxubGV0IHRha2Vfb3B0IHEgPVxuICBtYXRjaCBxLmZpcnN0IHdpdGhcbiAgfCBOaWwgLT4gTm9uZVxuICB8IENvbnMgeyBjb250ZW50OyBuZXh0ID0gTmlsIH0gLT5cbiAgICBjbGVhciBxO1xuICAgIFNvbWUgY29udGVudFxuICB8IENvbnMgeyBjb250ZW50OyBuZXh0IH0gLT5cbiAgICBxLmxlbmd0aCA8LSBxLmxlbmd0aCAtIDE7XG4gICAgcS5maXJzdCA8LSBuZXh0O1xuICAgIFNvbWUgY29udGVudFxuXG5sZXQgcG9wID1cbiAgdGFrZVxuXG5sZXQgY29weSA9XG4gIGxldCByZWMgY29weSBxX3JlcyBwcmV2IGNlbGwgPVxuICAgIG1hdGNoIGNlbGwgd2l0aFxuICAgIHwgTmlsIC0+IHFfcmVzLmxhc3QgPC0gcHJldjsgcV9yZXNcbiAgICB8IENvbnMgeyBjb250ZW50OyBuZXh0IH0gLT5cbiAgICAgIGxldCByZXMgPSBDb25zIHsgY29udGVudDsgbmV4dCA9IE5pbCB9IGluXG4gICAgICBiZWdpbiBtYXRjaCBwcmV2IHdpdGhcbiAgICAgIHwgTmlsIC0+IHFfcmVzLmZpcnN0IDwtIHJlc1xuICAgICAgfCBDb25zIHAgLT4gcC5uZXh0IDwtIHJlc1xuICAgICAgZW5kO1xuICAgICAgY29weSBxX3JlcyByZXMgbmV4dFxuICBpblxuICBmdW4gcSAtPiBjb3B5IHsgbGVuZ3RoID0gcS5sZW5ndGg7IGZpcnN0ID0gTmlsOyBsYXN0ID0gTmlsIH0gTmlsIHEuZmlyc3RcblxubGV0IGlzX2VtcHR5IHEgPVxuICBxLmxlbmd0aCA9IDBcblxubGV0IGxlbmd0aCBxID1cbiAgcS5sZW5ndGhcblxubGV0IGl0ZXIgPVxuICBsZXQgcmVjIGl0ZXIgZiBjZWxsID1cbiAgICBtYXRjaCBjZWxsIHdpdGhcbiAgICB8IE5pbCAtPiAoKVxuICAgIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgICAgZiBjb250ZW50O1xuICAgICAgaXRlciBmIG5leHRcbiAgaW5cbiAgZnVuIGYgcSAtPiBpdGVyIGYgcS5maXJzdFxuXG5sZXQgZm9sZCA9XG4gIGxldCByZWMgZm9sZCBmIGFjY3UgY2VsbCA9XG4gICAgbWF0Y2ggY2VsbCB3aXRoXG4gICAgfCBOaWwgLT4gYWNjdVxuICAgIHwgQ29ucyB7IGNvbnRlbnQ7IG5leHQgfSAtPlxuICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgY29udGVudCBpblxuICAgICAgZm9sZCBmIGFjY3UgbmV4dFxuICBpblxuICBmdW4gZiBhY2N1IHEgLT4gZm9sZCBmIGFjY3UgcS5maXJzdFxuXG5sZXQgdHJhbnNmZXIgcTEgcTIgPVxuICBpZiBxMS5sZW5ndGggPiAwIHRoZW5cbiAgICBtYXRjaCBxMi5sYXN0IHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgcTIubGVuZ3RoIDwtIHExLmxlbmd0aDtcbiAgICAgIHEyLmZpcnN0IDwtIHExLmZpcnN0O1xuICAgICAgcTIubGFzdCA8LSBxMS5sYXN0O1xuICAgICAgY2xlYXIgcTFcbiAgICB8IENvbnMgbGFzdCAtPlxuICAgICAgcTIubGVuZ3RoIDwtIHEyLmxlbmd0aCArIHExLmxlbmd0aDtcbiAgICAgIGxhc3QubmV4dCA8LSBxMS5maXJzdDtcbiAgICAgIHEyLmxhc3QgPC0gcTEubGFzdDtcbiAgICAgIGNsZWFyIHExXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgcSA9XG4gIGxldCByZWMgYXV4IGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICB8IE5pbCAtPiBTZXEuTmlsXG4gICAgfCBDb25zIHsgY29udGVudD14OyBuZXh0OyB9IC0+IFNlcS5Db25zICh4LCBhdXggbmV4dClcbiAgaW5cbiAgYXV4IHEuZmlyc3RcblxubGV0IGFkZF9zZXEgcSBpID0gU2VxLml0ZXIgKGZ1biB4IC0+IHB1c2ggeCBxKSBpXG5cbmxldCBvZl9zZXEgZyA9XG4gIGxldCBxID0gY3JlYXRlKCkgaW5cbiAgYWRkX3NlcSBxIGc7XG4gIHFcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgIFBpZXJyZSBXZWlzIGFuZCBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTkgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRXh0ZW5zaWJsZSBidWZmZXJzICopXG5cbigqIFRoZSBbaW5uZXJfYnVmZmVyXSB0eXBlIGVuc3VyZXMgdGhhdCB0aGUgW2xlbmd0aF0gYW5kIFtidWZmZXJdIGZpZWxkcyBhcmVcbiAgIGFsd2F5cyBzeW5jaHJvbml6ZWQsIFtsZW5ndGggPSBCeXRlcy5sZW5ndGggYnVmZmVyXSwgZXZlbiBpbiBwcmVzZW5jZVxuICAgb2YgZGF0YSByYWNlcy5cbiopXG50eXBlIGlubmVyX2J1ZmZlciA9IHtcbiAgYnVmZmVyOiBieXRlcztcbiAgbGVuZ3RoOiBpbnQ7XG59XG5cbnR5cGUgdCA9XG4ge211dGFibGUgaW5uZXIgOiBpbm5lcl9idWZmZXI7XG4gIG11dGFibGUgcG9zaXRpb24gOiBpbnQ7XG4gIGluaXRpYWxfYnVmZmVyIDogYnl0ZXN9XG4oKiBJbnZhcmlhbnRzOiBhbGwgcGFydHMgb2YgdGhlIGNvZGUgcHJlc2VydmUgdGhlIGludmFyaWFudHMgdGhhdDpcbiAgIC0gW2lubmVyLmxlbmd0aCA9IEJ5dGVzLmxlbmd0aCBpbm5lci5idWZmZXJdXG4gICBJbiBhYnNlbmNlIG9mIGRhdGEgcmFjZXMsIHdlIGFsc28gaGF2ZVxuICAgLSBbMCA8PSBiLnBvc2l0aW9uIDw9IGIuaW5uZXIubGVuZ3RoXVxuXG4gICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBbYi5wb3NpdGlvbiA9IGIuaW5uZXIubGVuZ3RoXSBpcyBsZWdhbCxcbiAgIGl0IG1lYW5zIHRoYXQgdGhlIGJ1ZmZlciBpcyBmdWxsIGFuZCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW5kZWRcbiAgIGJlZm9yZSBhbnkgZnVydGhlciBhZGRpdGlvbi4gKilcblxubGV0IGNyZWF0ZSBuID1cbiBsZXQgbiA9IGlmIG4gPCAxIHRoZW4gMSBlbHNlIG4gaW5cbiBsZXQgbiA9IGlmIG4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiBTeXMubWF4X3N0cmluZ19sZW5ndGggZWxzZSBuIGluXG4gbGV0IHMgPSBCeXRlcy5jcmVhdGUgbiBpblxuIHsgaW5uZXIgPSB7IGJ1ZmZlciA9IHM7IGxlbmd0aCA9IG59OyBwb3NpdGlvbiA9IDA7IGluaXRpYWxfYnVmZmVyID0gc31cblxubGV0IGNvbnRlbnRzIGIgPSBCeXRlcy5zdWJfc3RyaW5nIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxubGV0IHRvX2J5dGVzIGIgPSBCeXRlcy5zdWIgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBzdWIgYiBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGIucG9zaXRpb24gLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5zdWJcIlxuICBlbHNlIEJ5dGVzLnN1Yl9zdHJpbmcgYi5pbm5lci5idWZmZXIgb2ZzIGxlblxuXG5cbmxldCBibGl0IHNyYyBzcmNvZmYgZHN0IGRzdG9mZiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IHNyY29mZiA8IDAgfHwgc3Jjb2ZmID4gc3JjLnBvc2l0aW9uIC0gbGVuXG4gICAgICAgICAgICAgfHwgZHN0b2ZmIDwgMCB8fCBkc3RvZmYgPiAoQnl0ZXMubGVuZ3RoIGRzdCkgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5ibGl0XCJcbiAgZWxzZVxuICAgIEJ5dGVzLmJsaXQgc3JjLmlubmVyLmJ1ZmZlciBzcmNvZmYgZHN0IGRzdG9mZiBsZW5cblxuXG5sZXQgbnRoIGIgb2ZzID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBpZiBvZnMgPCAwIHx8IG9mcyA+PSBwb3NpdGlvbiB8fCBwb3NpdGlvbiA+IGxlbmd0aCB0aGVuXG4gICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5udGhcIlxuICBlbHNlIEJ5dGVzLnVuc2FmZV9nZXQgYnVmZmVyIG9mc1xuXG5cbmxldCBsZW5ndGggYiA9IGIucG9zaXRpb25cblxubGV0IGNsZWFyIGIgPSBiLnBvc2l0aW9uIDwtIDBcblxubGV0IHJlc2V0IGIgPVxuICBiLnBvc2l0aW9uIDwtIDA7XG4gIGxldCBpbm5lciA9XG4gICAgeyBidWZmZXIgPSBiLmluaXRpYWxfYnVmZmVyOyBsZW5ndGggPSBCeXRlcy5sZW5ndGggYi5pbml0aWFsX2J1ZmZlciB9XG4gIGluXG4gIGIuaW5uZXIgPC0gaW5uZXJcblxuKCogW3Jlc2l6ZSBiIG1vcmVdIGVuc3VyZXMgdGhhdCBbYi5wb3NpdGlvbiArIG1vcmUgPD0gYi5pbm5lci5sZW5ndGhdIGhvbGRzXG4gICBieSBkeW5hbWljYWxseSBleHRlbmRpbmcgW2IuaW5uZXJdIGlmIG5lY2Vzc2FyeSAtLSBhbmQgdGh1c1xuICAgaW5jcmVhc2luZyBbYi5pbm5lci5sZW5ndGhdLlxuKilcbmxldCByZXNpemUgYiBtb3JlID1cbiAgbGV0IG9sZF9wb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCBvbGRfbGVuID0gYi5pbm5lci5sZW5ndGggaW5cbiAgbGV0IG5ld19sZW4gPSByZWYgb2xkX2xlbiBpblxuICB3aGlsZSBvbGRfcG9zICsgbW9yZSA+ICFuZXdfbGVuIGRvIG5ld19sZW4gOj0gMiAqICFuZXdfbGVuIGRvbmU7XG4gIGlmICFuZXdfbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gYmVnaW5cbiAgICBpZiBvbGRfcG9zICsgbW9yZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICB0aGVuIG5ld19sZW4gOj0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgZWxzZSBmYWlsd2l0aCBcIkJ1ZmZlci5hZGQ6IGNhbm5vdCBncm93IGJ1ZmZlclwiXG4gIGVuZDtcbiAgbGV0IG5ld19idWZmZXIgPSBCeXRlcy5jcmVhdGUgIW5ld19sZW4gaW5cbiAgKCogUFIjNjE0ODogbGV0J3Mga2VlcCB1c2luZyBbYmxpdF0gcmF0aGVyIHRoYW4gW3Vuc2FmZV9ibGl0XSBpblxuICAgICB0aGlzIHRyaWNreSBmdW5jdGlvbiB0aGF0IGlzIHNsb3cgYW55d2F5LiAqKVxuICBCeXRlcy5ibGl0IGIuaW5uZXIuYnVmZmVyIDAgbmV3X2J1ZmZlciAwIGIucG9zaXRpb247XG4gIGIuaW5uZXIgPC0geyBidWZmZXIgPSBuZXdfYnVmZmVyOyBsZW5ndGggPSAhbmV3X2xlbiB9XG5cbigqIE5vdGU6XG4gICAgU29tZSBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IGhhdmUgYSBmYXN0IHBhdGggd2hlbiB0aGUgaW5uZXJcbiAgYnVmZmVyIGRvZXNuJ3QgbmVlZCB0byBiZSBleHRlbmRlZC5cbiAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB1bnNhZmUgYWNjZXNzZXMgb24gdGhlXG4gIGNvbnRlbnRzIG9mIHRoZSBbaW5uZXJdIGZpZWxkIHNpbmNlIGl0cyBmaWVsZHMgYXJlIGltbXV0YWJsZS5cbiAgSW4gcHJlc2VuY2Ugb2YgZGF0YSByYWNlcywgd2UgbWF5IGFjY2VzcyB0aGUgd3JvbmcgaW5uZXIgYnVmZmVyLCBidXQgd2VcbiAgd2lsbCB1c2UgdGhpcyBidWZmZXIgc2FmZWx5LlxuICBBcyBzb29uIGFzIHdlIG5lZWQgdG8gcmVzaXplIHRoZSBidWZmZXIsIHdlIGZhbGwgYmFjayB0byBzYWZlIGFjY2Vzc2VzLlxuKilcblxubGV0IGFkZF9jaGFyIGIgYyA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7YnVmZmVyO2xlbmd0aH0gPSBiLmlubmVyIGluXG4gIGlmIHBvcyA+PSBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMTtcbiAgICBCeXRlcy5zZXQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBjXG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgYnVmZmVyIHBvcyBjO1xuICBiLnBvc2l0aW9uIDwtIHBvcyArIDFcblxubGV0IHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heCA9IDRcbmxldCB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4ID0gNFxuXG5sZXQgcmVjIGFkZF91dGZfOF91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl84X3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl84X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl84X3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZiZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZiZV91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCByZWMgYWRkX3V0Zl8xNmxlX3VjaGFyIGIgdSA9XG4gIGxldCBwb3MgPSBiLnBvc2l0aW9uIGluXG4gIGlmIHBvcyA+PSBiLmlubmVyLmxlbmd0aCB0aGVuIHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7XG4gIGxldCBuID0gQnl0ZXMuc2V0X3V0Zl8xNmxlX3VjaGFyIGIuaW5uZXIuYnVmZmVyIHBvcyB1IGluXG4gIGlmIG4gPSAwXG4gIHRoZW4gKHJlc2l6ZSBiIHVjaGFyX3V0Zl8xNl9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfMTZsZV91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IGFkZF9zdWJzdHJpbmcgYiBzIG9mZnNldCBsZW4gPVxuICBpZiBvZmZzZXQgPCAwIHx8IGxlbiA8IDAgfHwgb2Zmc2V0ID4gU3RyaW5nLmxlbmd0aCBzIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX3N1YnN0cmluZy9hZGRfc3ViYnl0ZXNcIjtcbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyBsZW4gaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIGxlbjtcbiAgICBCeXRlcy5ibGl0X3N0cmluZyBzIG9mZnNldCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlblxuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyBvZmZzZXQgYnVmZmVyIHBvc2l0aW9uIGxlbjtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9zdWJieXRlcyBiIHMgb2Zmc2V0IGxlbiA9XG4gIGFkZF9zdWJzdHJpbmcgYiAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzKSBvZmZzZXQgbGVuXG5cbmxldCBhZGRfc3RyaW5nIGIgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjsgbGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IGIucG9zaXRpb24gKyBsZW4gaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIGxlbjtcbiAgICBCeXRlcy5ibGl0X3N0cmluZyBzIDAgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBsZW47XG4gICkgZWxzZVxuICAgIEJ5dGVzLnVuc2FmZV9ibGl0X3N0cmluZyBzIDAgYnVmZmVyIHBvc2l0aW9uIGxlbjtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9ieXRlcyBiIHMgPSBhZGRfc3RyaW5nIGIgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcylcblxubGV0IGFkZF9idWZmZXIgYiBicyA9XG4gIGFkZF9zdWJieXRlcyBiIGJzLmlubmVyLmJ1ZmZlciAwIGJzLnBvc2l0aW9uXG5cbigqIHRoaXMgKHByaXZhdGUpIGZ1bmN0aW9uIGNvdWxkIG1vdmUgaW50byB0aGUgc3RhbmRhcmQgbGlicmFyeSAqKVxubGV0IHJlYWxseV9pbnB1dF91cF90byBpYyBidWYgb2ZzIGxlbiA9XG4gIGxldCByZWMgbG9vcCBpYyBidWYgfmFscmVhZHlfcmVhZCB+b2ZzIH50b19yZWFkID1cbiAgICBpZiB0b19yZWFkID0gMCB0aGVuIGFscmVhZHlfcmVhZFxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gaW5wdXQgaWMgYnVmIG9mcyB0b19yZWFkIGluXG4gICAgICBpZiByID0gMCB0aGVuIGFscmVhZHlfcmVhZFxuICAgICAgZWxzZSBiZWdpblxuICAgICAgICBsZXQgYWxyZWFkeV9yZWFkID0gYWxyZWFkeV9yZWFkICsgciBpblxuICAgICAgICBsZXQgb2ZzID0gb2ZzICsgciBpblxuICAgICAgICBsZXQgdG9fcmVhZCA9IHRvX3JlYWQgLSByIGluXG4gICAgICAgIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQgfm9mcyB+dG9fcmVhZFxuICAgICAgZW5kXG4gICAgZW5kXG4gIGluIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQ6MCB+b2ZzIH50b19yZWFkOmxlblxuXG5cbmxldCB1bnNhZmVfYWRkX2NoYW5uZWxfdXBfdG8gYiBpYyBsZW4gPVxuICBpZiBiLnBvc2l0aW9uICsgbGVuID4gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiBsZW47XG4gIGxldCBuID0gcmVhbGx5X2lucHV0X3VwX3RvIGljIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuIGluXG4gIGIucG9zaXRpb24gPC0gYi5wb3NpdGlvbiArIG47XG4gIG5cblxubGV0IGFkZF9jaGFubmVsIGIgaWMgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBsZW4gPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlbiAgICgqIFBSIzUwMDQgKilcbiAgICBpbnZhbGlkX2FyZyBcIkJ1ZmZlci5hZGRfY2hhbm5lbFwiO1xuICBsZXQgbiA9IHVuc2FmZV9hZGRfY2hhbm5lbF91cF90byBiIGljIGxlbiBpblxuICAoKiBJdCBpcyBpbnRlbnRpb25hbCB0aGF0IGEgY29uc3VtZXIgY2F0Y2hpbmcgRW5kX29mX2ZpbGVcbiAgICAgd2lsbCBzZWUgdGhlIGRhdGEgd3JpdHRlbiAoc2VlICM2NzE5LCAjNzEzNikuICopXG4gIGlmIG4gPCBsZW4gdGhlbiByYWlzZSBFbmRfb2ZfZmlsZTtcbiAgKClcblxubGV0IG91dHB1dF9idWZmZXIgb2MgYiA9XG4gIG91dHB1dCBvYyBiLmlubmVyLmJ1ZmZlciAwIGIucG9zaXRpb25cblxubGV0IGNsb3NpbmcgPSBmdW5jdGlvblxuICB8ICcoJyAtPiAnKSdcbiAgfCAneycgLT4gJ30nXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuKCogb3BlbmluZyBhbmQgY2xvc2luZzogb3BlbiBhbmQgY2xvc2UgY2hhcmFjdGVycywgdHlwaWNhbGx5ICggYW5kIClcbiAgIGs6IGJhbGFuY2Ugb2Ygb3BlbmluZyBhbmQgY2xvc2luZyBjaGFyc1xuICAgczogdGhlIHN0cmluZyB3aGVyZSB3ZSBhcmUgc2VhcmNoaW5nXG4gICBzdGFydDogdGhlIGluZGV4IHdoZXJlIHdlIHN0YXJ0IHRoZSBzZWFyY2guICopXG5sZXQgYWR2YW5jZV90b19jbG9zaW5nIG9wZW5pbmcgY2xvc2luZyBrIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgayBpIGxpbSA9XG4gICAgaWYgaSA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICAgIGlmIHMuW2ldID0gb3BlbmluZyB0aGVuIGFkdmFuY2UgKGsgKyAxKSAoaSArIDEpIGxpbSBlbHNlXG4gICAgaWYgcy5baV0gPSBjbG9zaW5nIHRoZW5cbiAgICAgIGlmIGsgPSAwIHRoZW4gaSBlbHNlIGFkdmFuY2UgKGsgLSAxKSAoaSArIDEpIGxpbVxuICAgIGVsc2UgYWR2YW5jZSBrIChpICsgMSkgbGltIGluXG4gIGFkdmFuY2UgayBzdGFydCAoU3RyaW5nLmxlbmd0aCBzKVxuXG5sZXQgYWR2YW5jZV90b19ub25fYWxwaGEgcyBzdGFydCA9XG4gIGxldCByZWMgYWR2YW5jZSBpIGxpbSA9XG4gICAgaWYgaSA+PSBsaW0gdGhlbiBsaW0gZWxzZVxuICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICB8ICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyB8ICdfJyAtPiBhZHZhbmNlIChpICsgMSkgbGltXG4gICAgfCBfIC0+IGkgaW5cbiAgYWR2YW5jZSBzdGFydCAoU3RyaW5nLmxlbmd0aCBzKVxuXG4oKiBXZSBhcmUganVzdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGlkZW50IGluIHMsIHN0YXJ0aW5nIGF0IHN0YXJ0LiAqKVxubGV0IGZpbmRfaWRlbnQgcyBzdGFydCBsaW0gPVxuICBpZiBzdGFydCA+PSBsaW0gdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBtYXRjaCBzLltzdGFydF0gd2l0aFxuICAoKiBQYXJlbnRoZXNpemVkIGlkZW50ID8gKilcbiAgfCAnKCcgfCAneycgYXMgYyAtPlxuICAgICBsZXQgbmV3X3N0YXJ0ID0gc3RhcnQgKyAxIGluXG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19jbG9zaW5nIGMgKGNsb3NpbmcgYykgMCBzIG5ld19zdGFydCBpblxuICAgICBTdHJpbmcuc3ViIHMgbmV3X3N0YXJ0IChzdG9wIC0gc3RhcnQgLSAxKSwgc3RvcCArIDFcbiAgKCogUmVndWxhciBpZGVudCAqKVxuICB8IF8gLT5cbiAgICAgbGV0IHN0b3AgPSBhZHZhbmNlX3RvX25vbl9hbHBoYSBzIChzdGFydCArIDEpIGluXG4gICAgIFN0cmluZy5zdWIgcyBzdGFydCAoc3RvcCAtIHN0YXJ0KSwgc3RvcFxuXG4oKiBTdWJzdGl0dXRlICRpZGVudCwgJChpZGVudCksIG9yICR7aWRlbnR9IGluIHMsXG4gICAgYWNjb3JkaW5nIHRvIHRoZSBmdW5jdGlvbiBtYXBwaW5nIGYuICopXG5sZXQgYWRkX3N1YnN0aXR1dGUgYiBmIHMgPVxuICBsZXQgbGltID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgc3Vic3QgcHJldmlvdXMgaSA9XG4gICAgaWYgaSA8IGxpbSB0aGVuIGJlZ2luXG4gICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICB8ICckJyBhcyBjdXJyZW50IHdoZW4gcHJldmlvdXMgPSAnXFxcXCcgLT5cbiAgICAgICAgIGFkZF9jaGFyIGIgY3VycmVudDtcbiAgICAgICAgIHN1YnN0ICcgJyAoaSArIDEpXG4gICAgICB8ICckJyAtPlxuICAgICAgICAgbGV0IGogPSBpICsgMSBpblxuICAgICAgICAgbGV0IGlkZW50LCBuZXh0X2kgPSBmaW5kX2lkZW50IHMgaiBsaW0gaW5cbiAgICAgICAgIGFkZF9zdHJpbmcgYiAoZiBpZGVudCk7XG4gICAgICAgICBzdWJzdCAnICcgbmV4dF9pXG4gICAgICB8IGN1cnJlbnQgd2hlbiBwcmV2aW91cyA9PSAnXFxcXCcgLT5cbiAgICAgICAgIGFkZF9jaGFyIGIgJ1xcXFwnO1xuICAgICAgICAgYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgJyAnIChpICsgMSlcbiAgICAgIHwgJ1xcXFwnIGFzIGN1cnJlbnQgLT5cbiAgICAgICAgIHN1YnN0IGN1cnJlbnQgKGkgKyAxKVxuICAgICAgfCBjdXJyZW50IC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCBjdXJyZW50IChpICsgMSlcbiAgICBlbmQgZWxzZVxuICAgIGlmIHByZXZpb3VzID0gJ1xcXFwnIHRoZW4gYWRkX2NoYXIgYiBwcmV2aW91cyBpblxuICBzdWJzdCAnICcgMFxuXG5sZXQgdHJ1bmNhdGUgYiBsZW4gPVxuICAgIGlmIGxlbiA8IDAgfHwgbGVuID4gbGVuZ3RoIGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJCdWZmZXIudHJ1bmNhdGVcIlxuICAgIGVsc2VcbiAgICAgIGIucG9zaXRpb24gPC0gbGVuXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgYiA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICgqIE5vdGUgdGhhdCBiLnBvc2l0aW9uIGlzIG5vdCBhIGNvbnN0YW50IGFuZCBjYW5ub3QgYmUgbGlmdGVkIG91dCBvZiBhdXggKilcbiAgICBpZiBpID49IGIucG9zaXRpb24gdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBCeXRlcy5nZXQgYi5pbm5lci5idWZmZXIgaSBpblxuICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgaW5cbiAgYXV4IDBcblxubGV0IHRvX3NlcWkgYiA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICgqIE5vdGUgdGhhdCBiLnBvc2l0aW9uIGlzIG5vdCBhIGNvbnN0YW50IGFuZCBjYW5ub3QgYmUgbGlmdGVkIG91dCBvZiBhdXggKilcbiAgICBpZiBpID49IGIucG9zaXRpb24gdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBCeXRlcy5nZXQgYi5pbm5lci5idWZmZXIgaSBpblxuICAgICAgU2VxLkNvbnMgKChpLHgpLCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCBhZGRfc2VxIGIgc2VxID0gU2VxLml0ZXIgKGFkZF9jaGFyIGIpIHNlcVxuXG5sZXQgb2Zfc2VxIGkgPVxuICBsZXQgYiA9IGNyZWF0ZSAzMiBpblxuICBhZGRfc2VxIGIgaTtcbiAgYlxuXG4oKiogezYgQmluYXJ5IGVuY29kaW5nIG9mIGludGVnZXJzfSAqKVxuXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfaW50MTYgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2dVwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDMyIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMydVwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDY0IDogYnl0ZXMgLT4gaW50IC0+IGludDY0IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDY0dVwiXG5leHRlcm5hbCBzZXRfaW50OCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbmV4dGVybmFsIHNldF9pbnQxNiA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZcIlxuZXh0ZXJuYWwgc2V0X2ludDMyIDogYnl0ZXMgLT4gaW50IC0+IGludDMyIC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDMyXCJcbmV4dGVybmFsIHNldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NFwiXG5cbmV4dGVybmFsIHN3YXAxNiA6IGludCAtPiBpbnQgPSBcIiVic3dhcDE2XCJcbmV4dGVybmFsIHN3YXAzMiA6IGludDMyIC0+IGludDMyID0gXCIlYnN3YXBfaW50MzJcIlxuZXh0ZXJuYWwgc3dhcDY0IDogaW50NjQgLT4gaW50NjQgPSBcIiVic3dhcF9pbnQ2NFwiXG5cblxubGV0IGFkZF9pbnQ4IGIgeCA9XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtsZW5ndGg7IGJ1ZmZlcn0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBwb3NpdGlvbiArIDEgaW5cbiAgaWYgbmV3X3Bvc2l0aW9uID4gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIDE7XG4gICAgc2V0X2ludDggYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50OCBidWZmZXIgcG9zaXRpb24geDtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9pbnQxNl9uZSBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyAyIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAyO1xuICAgIHNldF9pbnQxNiBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIHhcbiAgKSBlbHNlXG4gICAgdW5zYWZlX3NldF9pbnQxNiBidWZmZXIgcG9zaXRpb24geDtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9pbnQzMl9uZSBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyA0IGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiA0O1xuICAgIHNldF9pbnQzMiBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIHhcbiAgKSBlbHNlXG4gICAgdW5zYWZlX3NldF9pbnQzMiBidWZmZXIgcG9zaXRpb24geDtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9pbnQ2NF9uZSBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyA4IGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiA4O1xuICAgIHNldF9pbnQ2NCBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIHhcbiAgKSBlbHNlXG4gICAgdW5zYWZlX3NldF9pbnQ2NCBidWZmZXIgcG9zaXRpb24geDtcbiAgYi5wb3NpdGlvbiA8LSBuZXdfcG9zaXRpb25cblxubGV0IGFkZF9pbnQxNl9sZSBiIHggPVxuICBhZGRfaW50MTZfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMTYgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MTZfYmUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAxNiB4KVxuXG5sZXQgYWRkX2ludDMyX2xlIGIgeCA9XG4gIGFkZF9pbnQzMl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAzMiB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQzMl9iZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDMyIHgpXG5cbmxldCBhZGRfaW50NjRfbGUgYiB4ID1cbiAgYWRkX2ludDY0X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDY0X2JlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwNjQgeClcblxubGV0IGFkZF91aW50OCA9IGFkZF9pbnQ4XG5sZXQgYWRkX3VpbnQxNl9uZSA9IGFkZF9pbnQxNl9uZVxubGV0IGFkZF91aW50MTZfbGUgPSBhZGRfaW50MTZfbGVcbmxldCBhZGRfdWludDE2X2JlID0gYWRkX2ludDE2X2JlXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIENvbGzDqGdlIGRlIEZyYW5jZSBhbmQgSU5SSUEgUGFyaXMgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiogU2VtYXBob3JlcyAqKVxuXG50eXBlIHNlbSA9IHtcbiAgbXV0OiBNdXRleC50OyAgICAgICAgICAgICAgICAgICAgICAgICAoKiBwcm90ZWN0cyBbdl0gKilcbiAgbXV0YWJsZSB2OiBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAoKiB0aGUgY3VycmVudCB2YWx1ZSAqKVxuICBub256ZXJvOiBDb25kaXRpb24udCAgICAgICAgICAgICAgICAgICgqIHNpZ25hbGVkIHdoZW4gW3YgPiAwXSAqKVxufVxuXG5tb2R1bGUgQ291bnRpbmcgPSBzdHJ1Y3RcblxudHlwZSB0ID0gc2VtXG5cbmxldCBtYWtlIHYgPVxuICBpZiB2IDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VtYXBob3JlLkNvdW50aW5nLmluaXQ6IHdyb25nIGluaXRpYWwgdmFsdWVcIjtcbiAgeyBtdXQgPSBNdXRleC5jcmVhdGUoKTsgdjsgbm9uemVybyA9IENvbmRpdGlvbi5jcmVhdGUoKSB9XG5cbmxldCByZWxlYXNlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICBpZiBzLnYgPCBtYXhfaW50IHRoZW4gYmVnaW5cbiAgICBzLnYgPC0gcy52ICsgMTtcbiAgICBDb25kaXRpb24uc2lnbmFsIHMubm9uemVybztcbiAgICBNdXRleC51bmxvY2sgcy5tdXRcbiAgZW5kIGVsc2UgYmVnaW5cbiAgICBNdXRleC51bmxvY2sgcy5tdXQ7XG4gICAgcmFpc2UgKFN5c19lcnJvciBcIlNlbWFwaG9yZS5Db3VudGluZy5yZWxlYXNlOiBvdmVyZmxvd1wiKVxuICBlbmRcblxubGV0IGFjcXVpcmUgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIHdoaWxlIHMudiA9IDAgZG8gQ29uZGl0aW9uLndhaXQgcy5ub256ZXJvIHMubXV0IGRvbmU7XG4gIHMudiA8LSBzLnYgLSAxO1xuICBNdXRleC51bmxvY2sgcy5tdXRcblxubGV0IHRyeV9hY3F1aXJlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICBsZXQgcmV0ID0gaWYgcy52ID0gMCB0aGVuIGZhbHNlIGVsc2UgKHMudiA8LSBzLnYgLSAxOyB0cnVlKSBpblxuICBNdXRleC51bmxvY2sgcy5tdXQ7XG4gIHJldFxuXG5sZXQgZ2V0X3ZhbHVlIHMgPSBzLnZcblxuZW5kXG5cbm1vZHVsZSBCaW5hcnkgPSBzdHJ1Y3RcblxudHlwZSB0ID0gc2VtXG5cbmxldCBtYWtlIGIgPVxuICB7IG11dCA9IE11dGV4LmNyZWF0ZSgpO1xuICAgIHYgPSBpZiBiIHRoZW4gMSBlbHNlIDA7XG4gICAgbm9uemVybyA9IENvbmRpdGlvbi5jcmVhdGUoKSB9XG5cbmxldCByZWxlYXNlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICBzLnYgPC0gMTtcbiAgQ29uZGl0aW9uLnNpZ25hbCBzLm5vbnplcm87XG4gIE11dGV4LnVubG9jayBzLm11dFxuXG5sZXQgYWNxdWlyZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgd2hpbGUgcy52ID0gMCBkbyBDb25kaXRpb24ud2FpdCBzLm5vbnplcm8gcy5tdXQgZG9uZTtcbiAgcy52IDwtIDA7XG4gIE11dGV4LnVubG9jayBzLm11dFxuXG5sZXQgdHJ5X2FjcXVpcmUgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIGxldCByZXQgPSBpZiBzLnYgPSAwIHRoZW4gZmFsc2UgZWxzZSAocy52IDwtIDA7IHRydWUpIGluXG4gIE11dGV4LnVubG9jayBzLm11dDtcbiAgcmV0XG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICBLQyBTaXZhcmFtYWtyaXNobmFuLCBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9sYW4sIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgVG9tIEtlbGx5LCBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5ICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOSBJbmRpYW4gSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIE1hZHJhcyAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAyMSBPQ2FtbCBMYWJzIENvbnN1bHRhbmN5IEx0ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgUmF3ID0gc3RydWN0XG4gICgqIExvdy1sZXZlbCBwcmltaXRpdmVzIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lICopXG4gIHR5cGUgdCA9IHByaXZhdGUgaW50XG4gIGV4dGVybmFsIHNwYXduIDogKHVuaXQgLT4gdW5pdCkgLT4gTXV0ZXgudCAtPiB0XG4gICAgPSBcImNhbWxfZG9tYWluX3NwYXduXCJcbiAgZXh0ZXJuYWwgc2VsZiA6IHVuaXQgLT4gdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9pZFwiXG4gIGV4dGVybmFsIGNwdV9yZWxheCA6IHVuaXQgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcIlxuICBleHRlcm5hbCBnZXRfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50OiB1bml0IC0+IGludFxuICAgID0gXCJjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFwiIFtAQG5vYWxsb2NdXG5lbmRcblxubGV0IGNwdV9yZWxheCAoKSA9IFJhdy5jcHVfcmVsYXggKClcblxudHlwZSBpZCA9IFJhdy50XG5cbnR5cGUgJ2Egc3RhdGUgPVxufCBSdW5uaW5nXG58IEZpbmlzaGVkIG9mICgnYSwgZXhuKSByZXN1bHRcblxudHlwZSAnYSB0ID0ge1xuICBkb21haW4gOiBSYXcudDtcbiAgdGVybV9tdXRleDogTXV0ZXgudDtcbiAgdGVybV9jb25kaXRpb246IENvbmRpdGlvbi50O1xuICB0ZXJtX3N0YXRlOiAnYSBzdGF0ZSByZWYgKCogcHJvdGVjdGVkIGJ5IFt0ZXJtX211dGV4XSAqKVxufVxuXG5tb2R1bGUgRExTID0gc3RydWN0XG5cbiAgdHlwZSBkbHNfc3RhdGUgPSBPYmoudCBhcnJheVxuXG4gIGxldCB1bmlxdWVfdmFsdWUgPSBPYmoucmVwciAocmVmIDApXG5cbiAgZXh0ZXJuYWwgZ2V0X2Rsc19zdGF0ZSA6IHVuaXQgLT4gZGxzX3N0YXRlID0gXCIlZGxzX2dldFwiXG5cbiAgZXh0ZXJuYWwgc2V0X2Rsc19zdGF0ZSA6IGRsc19zdGF0ZSAtPiB1bml0ID1cbiAgICBcImNhbWxfZG9tYWluX2Rsc19zZXRcIiBbQEBub2FsbG9jXVxuXG4gIGxldCBjcmVhdGVfZGxzICgpID1cbiAgICBsZXQgc3QgPSBBcnJheS5tYWtlIDggdW5pcXVlX3ZhbHVlIGluXG4gICAgc2V0X2Rsc19zdGF0ZSBzdFxuXG4gIGxldCBfID0gY3JlYXRlX2RscyAoKVxuXG4gIHR5cGUgJ2Ega2V5ID0gaW50ICogKHVuaXQgLT4gJ2EpXG5cbiAgbGV0IGtleV9jb3VudGVyID0gQXRvbWljLm1ha2UgMFxuXG4gIHR5cGUga2V5X2luaXRpYWxpemVyID1cbiAgICBLSTogJ2Ega2V5ICogKCdhIC0+ICdhKSAtPiBrZXlfaW5pdGlhbGl6ZXJcblxuICBsZXQgcGFyZW50X2tleXMgPSBBdG9taWMubWFrZSAoW10gOiBrZXlfaW5pdGlhbGl6ZXIgbGlzdClcblxuICBsZXQgcmVjIGFkZF9wYXJlbnRfa2V5IGtpID1cbiAgICBsZXQgbCA9IEF0b21pYy5nZXQgcGFyZW50X2tleXMgaW5cbiAgICBpZiBub3QgKEF0b21pYy5jb21wYXJlX2FuZF9zZXQgcGFyZW50X2tleXMgbCAoa2kgOjogbCkpXG4gICAgdGhlbiBhZGRfcGFyZW50X2tleSBraVxuXG4gIGxldCBuZXdfa2V5ID9zcGxpdF9mcm9tX3BhcmVudCBpbml0X29ycGhhbiA9XG4gICAgbGV0IGlkeCA9IEF0b21pYy5mZXRjaF9hbmRfYWRkIGtleV9jb3VudGVyIDEgaW5cbiAgICBsZXQgayA9IChpZHgsIGluaXRfb3JwaGFuKSBpblxuICAgIGJlZ2luIG1hdGNoIHNwbGl0X2Zyb21fcGFyZW50IHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgc3BsaXQgLT4gYWRkX3BhcmVudF9rZXkgKEtJKGssIHNwbGl0KSlcbiAgICBlbmQ7XG4gICAga1xuXG4gICgqIElmIG5lY2Vzc2FyeSwgZ3JvdyB0aGUgY3VycmVudCBkb21haW4ncyBsb2NhbCBzdGF0ZSBhcnJheSBzdWNoIHRoYXQgW2lkeF1cbiAgICogaXMgYSB2YWxpZCBpbmRleCBpbiB0aGUgYXJyYXkuICopXG4gIGxldCBtYXliZV9ncm93IGlkeCA9XG4gICAgbGV0IHN0ID0gZ2V0X2Rsc19zdGF0ZSAoKSBpblxuICAgIGxldCBzeiA9IEFycmF5Lmxlbmd0aCBzdCBpblxuICAgIGlmIGlkeCA8IHN6IHRoZW4gc3RcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgcmVjIGNvbXB1dGVfbmV3X3NpemUgcyA9XG4gICAgICAgIGlmIGlkeCA8IHMgdGhlbiBzIGVsc2UgY29tcHV0ZV9uZXdfc2l6ZSAoMiAqIHMpXG4gICAgICBpblxuICAgICAgbGV0IG5ld19zeiA9IGNvbXB1dGVfbmV3X3NpemUgc3ogaW5cbiAgICAgIGxldCBuZXdfc3QgPSBBcnJheS5tYWtlIG5ld19zeiB1bmlxdWVfdmFsdWUgaW5cbiAgICAgIEFycmF5LmJsaXQgc3QgMCBuZXdfc3QgMCBzejtcbiAgICAgIHNldF9kbHNfc3RhdGUgbmV3X3N0O1xuICAgICAgbmV3X3N0XG4gICAgZW5kXG5cbiAgbGV0IHNldCAoaWR4LCBfaW5pdCkgeCA9XG4gICAgbGV0IHN0ID0gbWF5YmVfZ3JvdyBpZHggaW5cbiAgICAoKiBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gZW5zdXJlcyB0aGF0IGZsYW1iZGEgZG9lcyBub3QgbG9vayBhdCB0aGUgdHlwZSBvZlxuICAgICAqIFt4XSwgd2hpY2ggbWF5IGJlIGEgW2Zsb2F0XSBhbmQgY29uY2x1ZGUgdGhhdCB0aGUgW3N0XSBpcyBhIGZsb2F0IGFycmF5LlxuICAgICAqIFdlIGRvIG5vdCB3YW50IE9DYW1sJ3MgZmxvYXQgYXJyYXkgb3B0aW1pc2F0aW9uIGtpY2tpbmcgaW4gaGVyZS4gKilcbiAgICBzdC4oaWR4KSA8LSBPYmoucmVwciAoU3lzLm9wYXF1ZV9pZGVudGl0eSB4KVxuXG4gIGxldCBnZXQgKGlkeCwgaW5pdCkgPVxuICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluXG4gICAgbGV0IHYgPSBzdC4oaWR4KSBpblxuICAgIGlmIHYgPT0gdW5pcXVlX3ZhbHVlIHRoZW5cbiAgICAgIGxldCB2JyA9IE9iai5yZXByIChpbml0ICgpKSBpblxuICAgICAgc3QuKGlkeCkgPC0gKFN5cy5vcGFxdWVfaWRlbnRpdHkgdicpO1xuICAgICAgT2JqLm1hZ2ljIHYnXG4gICAgZWxzZSBPYmoubWFnaWMgdlxuXG4gIGxldCBnZXRfaW5pdGlhbF9rZXlzICgpIDogKGludCAqIE9iai50KSBsaXN0ID1cbiAgICBMaXN0Lm1hcFxuICAgICAgKGZ1biAoS0kgKChpZHgsIF8pIGFzIGssIHNwbGl0KSkgLT5cbiAgICAgICAgICAgKGlkeCwgT2JqLnJlcHIgKHNwbGl0IChnZXQgaykpKSlcbiAgICAgIChBdG9taWMuZ2V0IHBhcmVudF9rZXlzKVxuXG4gIGxldCBzZXRfaW5pdGlhbF9rZXlzIChsOiAoaW50ICogT2JqLnQpIGxpc3QpID1cbiAgICBMaXN0Lml0ZXJcbiAgICAgIChmdW4gKGlkeCwgdikgLT5cbiAgICAgICAgbGV0IHN0ID0gbWF5YmVfZ3JvdyBpZHggaW4gc3QuKGlkeCkgPC0gdilcbiAgICAgIGxcblxuZW5kXG5cbigqKioqKioqKiBJZGVudGl0eSAqKioqKioqKioqKVxuXG5sZXQgZ2V0X2lkIHsgZG9tYWluOyBfIH0gPSBkb21haW5cblxubGV0IHNlbGYgKCkgPSBSYXcuc2VsZiAoKVxuXG5sZXQgaXNfbWFpbl9kb21haW4gKCkgPSAoc2VsZiAoKSA6PiBpbnQpID0gMFxuXG4oKioqKioqKiogQ2FsbGJhY2tzICoqKioqKioqKiopXG5cbigqIGZpcnN0IHNwYXduLCBkb21haW4gc3RhcnR1cCBhbmQgYXQgZXhpdCBmdW5jdGlvbmFsaXR5ICopXG5sZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgPSBBdG9taWMubWFrZSBmYWxzZVxuXG5sZXQgZmlyc3Rfc3Bhd25fZnVuY3Rpb24gPSByZWYgKGZ1biAoKSAtPiAoKSlcblxubGV0IGJlZm9yZV9maXJzdF9zcGF3biBmID1cbiAgaWYgQXRvbWljLmdldCBmaXJzdF9kb21haW5fc3Bhd25lZCB0aGVuXG4gICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgXCJmaXJzdCBkb21haW4gYWxyZWFkeSBzcGF3bmVkXCIpXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgb2xkX2YgPSAhZmlyc3Rfc3Bhd25fZnVuY3Rpb24gaW5cbiAgICBsZXQgbmV3X2YgKCkgPSBvbGRfZiAoKTsgZiAoKSBpblxuICAgIGZpcnN0X3NwYXduX2Z1bmN0aW9uIDo9IG5ld19mXG4gIGVuZFxuXG5sZXQgZG9fYmVmb3JlX2ZpcnN0X3NwYXduICgpID1cbiAgaWYgbm90IChBdG9taWMuZ2V0IGZpcnN0X2RvbWFpbl9zcGF3bmVkKSB0aGVuIGJlZ2luXG4gICAgQXRvbWljLnNldCBmaXJzdF9kb21haW5fc3Bhd25lZCB0cnVlO1xuICAgICFmaXJzdF9zcGF3bl9mdW5jdGlvbigpO1xuICAgICgqIFJlbGVhc2UgdGhlIG9sZCBmdW5jdGlvbiAqKVxuICAgIGZpcnN0X3NwYXduX2Z1bmN0aW9uIDo9IChmdW4gKCkgLT4gKCkpXG4gIGVuZFxuXG5sZXQgYXRfZXhpdF9rZXkgPSBETFMubmV3X2tleSAoZnVuICgpIC0+IChmdW4gKCkgLT4gKCkpKVxuXG5sZXQgYXRfZXhpdCBmID1cbiAgbGV0IG9sZF9leGl0IDogdW5pdCAtPiB1bml0ID0gRExTLmdldCBhdF9leGl0X2tleSBpblxuICBsZXQgbmV3X2V4aXQgKCkgPVxuICAgICgqIFRoZSBkb21haW4gdGVybWluYXRpb24gY2FsbGJhY2tzIChbYXRfZXhpdF0pIGFyZSBydW4gaW5cbiAgICAgICBsYXN0LWluLWZpcnN0LW91dCAoTElGTykgb3JkZXIgaW4gb3JkZXIgdG8gYmUgc3ltbWV0cmljIHdpdGggdGhlIGRvbWFpblxuICAgICAgIGNyZWF0aW9uIGNhbGxiYWNrcyAoW2F0X2VhY2hfc3Bhd25dKSB3aGljaCBydW4gaW4gZmlyc3QtaW4tZmlzcnQtb3V0XG4gICAgICAgKEZJRk8pIG9yZGVyLiAqKVxuICAgIGYgKCk7IG9sZF9leGl0ICgpXG4gIGluXG4gIERMUy5zZXQgYXRfZXhpdF9rZXkgbmV3X2V4aXRcblxubGV0IGRvX2F0X2V4aXQgKCkgPVxuICBsZXQgZiA6IHVuaXQgLT4gdW5pdCA9IERMUy5nZXQgYXRfZXhpdF9rZXkgaW5cbiAgZiAoKVxuXG5sZXQgXyA9IFN0ZGxpYi5kb19kb21haW5fbG9jYWxfYXRfZXhpdCA6PSBkb19hdF9leGl0XG5cbigqKioqKioqIENyZWF0aW9uIGFuZCBUZXJtaW5hdGlvbiAqKioqKioqKilcblxubGV0IHNwYXduIGYgPVxuICBkb19iZWZvcmVfZmlyc3Rfc3Bhd24gKCk7XG4gIGxldCBwayA9IERMUy5nZXRfaW5pdGlhbF9rZXlzICgpIGluXG5cbiAgKCogVGhlIFt0ZXJtX211dGV4XSBhbmQgW3Rlcm1fY29uZGl0aW9uXSBhcmUgdXNlZCB0b1xuICAgICBzeW5jaHJvbml6ZSB3aXRoIHRoZSBqb2luaW5nIGRvbWFpbnMgKilcbiAgbGV0IHRlcm1fbXV0ZXggPSBNdXRleC5jcmVhdGUgKCkgaW5cbiAgbGV0IHRlcm1fY29uZGl0aW9uID0gQ29uZGl0aW9uLmNyZWF0ZSAoKSBpblxuICBsZXQgdGVybV9zdGF0ZSA9IHJlZiBSdW5uaW5nIGluXG5cbiAgbGV0IGJvZHkgKCkgPVxuICAgIGxldCByZXN1bHQgPVxuICAgICAgbWF0Y2hcbiAgICAgICAgRExTLmNyZWF0ZV9kbHMgKCk7XG4gICAgICAgIERMUy5zZXRfaW5pdGlhbF9rZXlzIHBrO1xuICAgICAgICBsZXQgcmVzID0gZiAoKSBpblxuICAgICAgICByZXNcbiAgICAgIHdpdGhcbiAgICAgIHwgeCAtPiBPayB4XG4gICAgICB8IGV4Y2VwdGlvbiBleCAtPiBFcnJvciBleFxuICAgIGluXG5cbiAgICBsZXQgcmVzdWx0JyA9XG4gICAgICAoKiBSdW4gdGhlIFthdF9leGl0XSBjYWxsYmFja3Mgd2hlbiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGVpdGhlclxuICAgICAgICAgdGVybWluYXRlcyBub3JtYWxseSBvciBleGNlcHRpb25hbGx5LiAqKVxuICAgICAgbWF0Y2ggZG9fYXRfZXhpdCAoKSB3aXRoXG4gICAgICB8ICgpIC0+IHJlc3VsdFxuICAgICAgfCBleGNlcHRpb24gZXggLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCByZXN1bHQgd2l0aFxuICAgICAgICAgIHwgT2sgXyAtPlxuICAgICAgICAgICAgICAoKiBJZiB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIHRlcm1pbmF0ZWQgbm9ybWFsbHksIGJ1dCB0aGVcbiAgICAgICAgICAgICAgICAgW2F0X2V4aXRdIGNhbGxiYWNrcyByYWlzZWQgYW4gZXhjZXB0aW9uLCB0aGVuIHJldHVybiB0aGVcbiAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLiAqKVxuICAgICAgICAgICAgICBFcnJvciBleFxuICAgICAgICAgIHwgRXJyb3IgXyAtPlxuICAgICAgICAgICAgICAoKiBJZiBib3RoIHRoZSBkb21haW4gY29tcHV0YXRpb24gYW5kIHRoZSBbYXRfZXhpdF0gY2FsbGJhY2tzXG4gICAgICAgICAgICAgICAgIHJhaXNlZCBleGNlcHRpb25zLCB0aGVuIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGZyb20gdGhlXG4gICAgICAgICAgICAgICAgIFthdF9leGl0XSBjYWxsYmFja3MgYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLiAqKVxuICAgICAgICAgICAgICByZXN1bHRcbiAgICAgICAgICBlbmRcbiAgICBpblxuXG4gICAgKCogU3luY2hyb25pemUgd2l0aCBqb2luaW5nIGRvbWFpbnMgKilcbiAgICBNdXRleC5sb2NrIHRlcm1fbXV0ZXg7XG4gICAgbWF0Y2ggIXRlcm1fc3RhdGUgd2l0aFxuICAgIHwgUnVubmluZyAtPlxuICAgICAgICB0ZXJtX3N0YXRlIDo9IEZpbmlzaGVkIHJlc3VsdCc7XG4gICAgICAgIENvbmRpdGlvbi5icm9hZGNhc3QgdGVybV9jb25kaXRpb247XG4gICAgfCBGaW5pc2hlZCBfIC0+XG4gICAgICAgIGZhaWx3aXRoIFwiaW50ZXJuYWwgZXJyb3I6IEFtIEkgYWxyZWFkeSBmaW5pc2hlZD9cIlxuICAgICgqIFt0ZXJtX211dGV4XSBpcyB1bmxvY2tlZCBpbiB0aGUgcnVudGltZSBhZnRlciB0aGUgY2xlYW51cCBmdW5jdGlvbnMgb25cbiAgICAgICB0aGUgQyBzaWRlIGFyZSBmaW5pc2hlZC4gKilcbiAgaW5cbiAgeyBkb21haW4gPSBSYXcuc3Bhd24gYm9keSB0ZXJtX211dGV4O1xuICAgIHRlcm1fbXV0ZXg7XG4gICAgdGVybV9jb25kaXRpb247XG4gICAgdGVybV9zdGF0ZSB9XG5cbmxldCBqb2luIHsgdGVybV9tdXRleDsgdGVybV9jb25kaXRpb247IHRlcm1fc3RhdGU7IF8gfSA9XG4gIE11dGV4LmxvY2sgdGVybV9tdXRleDtcbiAgbGV0IHJlYyBsb29wICgpID1cbiAgICBtYXRjaCAhdGVybV9zdGF0ZSB3aXRoXG4gICAgfCBSdW5uaW5nIC0+XG4gICAgICAgIENvbmRpdGlvbi53YWl0IHRlcm1fY29uZGl0aW9uIHRlcm1fbXV0ZXg7XG4gICAgICAgIGxvb3AgKClcbiAgICB8IEZpbmlzaGVkIHJlcyAtPlxuICAgICAgICBNdXRleC51bmxvY2sgdGVybV9tdXRleDtcbiAgICAgICAgcmVzXG4gIGluXG4gIG1hdGNoIGxvb3AgKCkgd2l0aFxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGV4IC0+IHJhaXNlIGV4XG5cbmxldCByZWNvbW1lbmRlZF9kb21haW5fY291bnQgPSBSYXcuZ2V0X3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgIEJlbm9pdCBWYXVnb24sIEVOU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAoKiBUb29scyB0byBtYW5pcHVsYXRlIHNjYW5uaW5nIHNldCBvZiBjaGFycyAoc2VlICVbLi4uXSkgKilcblxudHlwZSBtdXRhYmxlX2NoYXJfc2V0ID0gYnl0ZXNcblxuKCogQ3JlYXRlIGEgZnJlc2gsIGVtcHR5LCBtdXRhYmxlIGNoYXIgc2V0LiAqKVxubGV0IGNyZWF0ZV9jaGFyX3NldCAoKSA9IEJ5dGVzLm1ha2UgMzIgJ1xcMDAwJ1xuXG4oKiBBZGQgYSBjaGFyIGluIGEgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgYyA9XG4gIGxldCBpbmQgPSBpbnRfb2ZfY2hhciBjIGluXG4gIGxldCBzdHJfaW5kID0gaW5kIGxzciAzIGFuZCBtYXNrID0gMSBsc2wgKGluZCBsYW5kIDBiMTExKSBpblxuICBCeXRlcy5zZXQgY2hhcl9zZXQgc3RyX2luZFxuICAgIChjaGFyX29mX2ludCAoaW50X29mX2NoYXIgKEJ5dGVzLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsb3IgbWFzaykpXG5cbmxldCBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBCeXRlcy50b19zdHJpbmcgY2hhcl9zZXRcblxuKCogQ29tcHV0ZSB0aGUgY29tcGxlbWVudCBvZiBhIGNoYXIgc2V0LiAqKVxubGV0IHJldl9jaGFyX3NldCBjaGFyX3NldCA9XG4gIGxldCBjaGFyX3NldCcgPSBjcmVhdGVfY2hhcl9zZXQgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIDMxIGRvXG4gICAgQnl0ZXMuc2V0IGNoYXJfc2V0JyBpXG4gICAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IGkpIGx4b3IgMHhGRikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGNoYXJfc2V0J1xuXG4oKiBSZXR1cm4gdHJ1ZSBpZiBhIGBjJyBpcyBpbiBgY2hhcl9zZXQnLiAqKVxubGV0IGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgKGludF9vZl9jaGFyIChTdHJpbmcuZ2V0IGNoYXJfc2V0IHN0cl9pbmQpIGxhbmQgbWFzaykgPD4gMFxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKCogSWdub3JlZCBwYXJhbSBjb252ZXJzaW9uICopXG5cbigqIEdBRFQgdXNlZCB0byBhYnN0cmFjdCBhbiBleGlzdGVudGlhbCB0eXBlIHBhcmFtZXRlci4gKilcbigqIFNlZSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiID0gUGFyYW1fZm9ybWF0X0VCQiA6XG4gICAgKCd4IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYXJhbV9mb3JtYXRfZWJiXG5cbigqIENvbXB1dGUgYSBwYWRkaW5nIGFzc29jaWF0ZWQgdG8gYSBwYWRfb3B0aW9uIChzZWUgXCIlXzQyZFwiKS4gKilcbmxldCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wYWRkaW5nXG4gIHwgU29tZSB3aWR0aCAtPiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuXG4oKiBDb21wdXRlIGEgcHJlY2lzaW9uIGFzc29jaWF0ZWQgdG8gYSBwcmVjX29wdGlvbiAoc2VlIFwiJV8uNDJmXCIpLiAqKVxubGV0IHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQgPSBtYXRjaCBwcmVjX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBOb19wcmVjaXNpb25cbiAgfCBTb21lIG5kZWMgLT4gTGl0X3ByZWNpc2lvbiBuZGVjXG5cbigqIFR1cm4gYW4gaWdub3JlZCBwYXJhbSBpbnRvIGl0cyBlcXVpdmFsZW50IG5vdC1pZ25vcmVkIGZvcm1hdCBub2RlLiAqKVxuKCogVXNlZCBmb3IgZm9ybWF0IHByZXR0eS1wcmludGluZyBhbmQgU2NhbmYuICopXG5sZXQgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSBhIGIgYyBkIGUgZiB4IHkgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+ICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYXJhbV9mb3JtYXRfZWJiID1cbmZ1biBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2hhciBmbXQpXG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChDYW1sX2NoYXIgZm10KVxuICB8IElnbm9yZWRfc3RyaW5nIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9jYW1sX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEludCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2ludDMyIChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoSW50MzIgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9uYXRpdmVpbnQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChOYXRpdmVpbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQ2NCAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDY0IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfZmxvYXQgKHBhZF9vcHQsIHByZWNfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGbG9hdCAoKEZsb2F0X2ZsYWdfLCBGbG9hdF9mKSxcbiAgICAgICAgICAgICAgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgcHJlY19vZl9wcmVjX29wdCBwcmVjX29wdCwgZm10KSlcbiAgfCBJZ25vcmVkX2Jvb2wgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKEJvb2wgKHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgZm10KSlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChSZWFkZXIgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQpKVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10KVxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUeXBlcyAqKVxuXG50eXBlICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlbiA9XG4gIHwgQWNjX29wZW5fdGFnIG9mICgnYiwgJ2MpIGFjY1xuICB8IEFjY19vcGVuX2JveCBvZiAoJ2IsICdjKSBhY2NcblxuKCogUmV2ZXJzZWQgbGlzdCBvZiBwcmludGluZyBhdG9tcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBwcmludGYgYXJndW1lbnRzLiAqKVxuYW5kICgnYiwgJ2MpIGFjYyA9XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IG9mICgnYiwgJ2MpIGFjYyAqIGZvcm1hdHRpbmdfbGl0XG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gb2YgKCdiLCAnYykgYWNjICogKCdiLCAnYykgYWNjX2Zvcm1hdHRpbmdfZ2VuXG4gICAgICAoKiBTcGVjaWFsIGZtdHRpbmcgKGJveCkgKilcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBMaXRlcmFsIHN0cmluZyAqKVxuICB8IEFjY19jaGFyX2xpdGVyYWwgICBvZiAoJ2IsICdjKSBhY2MgKiBjaGFyICAgICAgICgqIExpdGVyYWwgY2hhciAqKVxuICB8IEFjY19kYXRhX3N0cmluZyAgICBvZiAoJ2IsICdjKSBhY2MgKiBzdHJpbmcgICAgICgqIEdlbmVyYXRlZCBzdHJpbmcgKilcbiAgfCBBY2NfZGF0YV9jaGFyICAgICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBHZW5lcmF0ZWQgY2hhciAqKVxuICB8IEFjY19kZWxheSAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgKiAoJ2IgLT4gJ2MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBEZWxheWVkIHByaW50aW5nICglYSwgJXQpICopXG4gIHwgQWNjX2ZsdXNoICAgICAgICAgIG9mICgnYiwgJ2MpIGFjYyAgICAgICAgICAgICAgKCogRmx1c2ggKilcbiAgfCBBY2NfaW52YWxpZF9hcmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nXG4gICAgICAoKiBSYWlzZSBJbnZhbGlkX2FyZ3VtZW50IG1zZyAqKVxuICB8IEVuZF9vZl9hY2NcblxuKCogTGlzdCBvZiBoZXRlcm9nZW5lb3VzIHZhbHVlcy4gKilcbigqIFVzZWQgdG8gYWNjdW11bGF0ZSBzY2FuZiBjYWxsYmFjayBhcmd1bWVudHMuICopXG50eXBlICgnYSwgJ2IpIGhldGVyX2xpc3QgPVxuICB8IENvbnMgOiAnYyAqICgnYSwgJ2IpIGhldGVyX2xpc3QgLT4gKCdjIC0+ICdhLCAnYikgaGV0ZXJfbGlzdFxuICB8IE5pbCA6ICgnYiwgJ2IpIGhldGVyX2xpc3RcblxuKCogRXhpc3RlbnRpYWwgQmxhY2sgQm94ZXMuICopXG4oKiBVc2VkIHRvIGFic3RyYWN0IHNvbWUgZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRkaW5nIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkZGluZ19mbXR0eV9lYmIgPSBQYWRkaW5nX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXR0eS4gKilcbigqIFNlZSB0aGUgdHlwZV9wYWRwcmVjIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFkcHJlY19mbXR0eV9lYmIgPSBQYWRwcmVjX2ZtdHR5X0VCQiA6XG4gICAgICgneCwgJ3kpIHBhZGRpbmcgKiAoJ3ksICd6KSBwcmVjaXNpb24gKiAoJ3osICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHBhZGRpbmcgYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZGRpbmdfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiID0gUGFkZGluZ19mbXRfRUJCIDpcbiAgICAgKF8sICd4IC0+ICdhKSBwYWRkaW5nICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwYWRkaW5nX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcHJlY2lzaW9uIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wcmVjaXNpb25fZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmIgPSBQcmVjaXNpb25fZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3gsICdiLCAnYywgJ2UsICdmKSBwcmVjaXNpb25fZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcGFkcHJlY19mbXRfZWJiIGFuZCBwYXJzZV9mb3JtYXQgZnVuY3Rpb25zLiAqKVxudHlwZSAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmIgPSBQYWRwcmVjX2ZtdF9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAncCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAoJ3AsICdiLCAnYywgJ2UsICdmKSBwYWRwcmVjX2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgdGhlICdhIGFuZCAnZCBwYXJhbWV0ZXJzIG9mIGFuIGZtdC4gKilcbigqIE91dHB1dCB0eXBlIG9mIHRoZSBmb3JtYXQgcGFyc2luZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiID0gRm10X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdiLCAnYywgJ2UsICdmKSBmbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2Zvcm1hdF9nZW4gZnVuY3Rpb24uICopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiID0gRm10X2ZtdHR5X0VCQiA6XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBmbXQgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10dHkgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGFuIGZtdHR5IGFuZCBhbiBmbXQuICopXG4oKiBTZWUgdGhlIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYiA9IEZtdHR5X2ZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10dHkgKlxuICAgICAoJ3gsICdiLCAnYywgJ3ksICdlLCAnZikgZm10X2ZtdHR5X2ViYiAtPlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfZm10X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgZm10dHkgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIGZvcm1hdCB0eXBlcy4gKilcbnR5cGUgZm10dHlfZWJiID0gRm10dHlfRUJCIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+IGZtdHR5X2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcGFkZGluZyB0eXBlIHBhcmFtZXRlcnMuICopXG4oKiBVc2VkIHRvIGNvbXBhcmUgcGFkZGluZ3MuICopXG50eXBlIHBhZGRpbmdfZWJiID0gUGFkZGluZ19FQkIgOiAoJ2EsICdiKSBwYWRkaW5nIC0+IHBhZGRpbmdfZWJiXG5cbigqIEFic3RyYWN0IGFsbCBwcmVjaXNpb24gdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHByZWNpc2lvbnMuICopXG50eXBlIHByZWNpc2lvbl9lYmIgPSBQcmVjaXNpb25fRUJCIDogKCdhLCAnYikgcHJlY2lzaW9uIC0+IHByZWNpc2lvbl9lYmJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBDb25zdGFudHMgKilcblxuKCogRGVmYXVsdCBwcmVjaXNpb24gZm9yIGZsb2F0IHByaW50aW5nLiAqKVxubGV0IGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252ID1cbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyB8IEZsb2F0X2ggfCBGbG9hdF9IXG4gIHwgRmxvYXRfQ0YgLT4gLTZcbiAgKCogRm9yICVoICVIIGFuZCAlI0YgZm9ybWF0cywgYSBuZWdhdGl2ZSBwcmVjaXNpb24gbWVhbnMgXCJhcyBtYW55IGRpZ2l0cyBhc1xuICAgICBuZWNlc3NhcnlcIi4gIEZvciB0aGUgb3RoZXIgRlAgZm9ybWF0cywgd2UgdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWVcbiAgICAgb2YgdGhlIHByZWNpc2lvbiwgaGVuY2UgNiBkaWdpdHMgYnkgZGVmYXVsdC4gKilcbiAgfCBGbG9hdF9GIC0+IDEyXG4gICgqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBPQ2FtbCBmbG9hdCBwcmludGluZyAoJUYpLiAqKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEV4dGVybmFscyAqKVxuXG5leHRlcm5hbCBmb3JtYXRfZmxvYXQ6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ6IHN0cmluZyAtPiBpbnQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9pbnRcIlxuZXh0ZXJuYWwgZm9ybWF0X2ludDMyOiBzdHJpbmcgLT4gaW50MzIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2ludDMyX2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfbmF0aXZlaW50OiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQ2NDogc3RyaW5nIC0+IGludDY0IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQ2NF9mb3JtYXRcIlxuZXh0ZXJuYWwgaGV4c3RyaW5nX29mX2Zsb2F0OiBmbG9hdCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaGV4c3RyaW5nX29mX2Zsb2F0XCJcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICgqIFRvb2xzIHRvIHByZXR0eS1wcmludCBmb3JtYXRzICopXG5cbigqIFR5cGUgb2YgZXh0ZW5zaWJsZSBjaGFyYWN0ZXIgYnVmZmVycy4gKilcbnR5cGUgYnVmZmVyID0ge1xuICBtdXRhYmxlIGluZCA6IGludDtcbiAgbXV0YWJsZSBieXRlcyA6IGJ5dGVzO1xufVxuXG4oKiBDcmVhdGUgYSBmcmVzaCBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NyZWF0ZSBpbml0X3NpemUgPSB7IGluZCA9IDA7IGJ5dGVzID0gQnl0ZXMuY3JlYXRlIGluaXRfc2l6ZSB9XG5cbigqIENoZWNrIHNpemUgb2YgdGhlIGJ1ZmZlciBhbmQgZ3JvdyBpdCBpZiBuZWVkZWQuICopXG5sZXQgYnVmZmVyX2NoZWNrX3NpemUgYnVmIG92ZXJoZWFkID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYuYnl0ZXMgaW5cbiAgbGV0IG1pbl9sZW4gPSBidWYuaW5kICsgb3ZlcmhlYWQgaW5cbiAgaWYgbWluX2xlbiA+IGxlbiB0aGVuIChcbiAgICBsZXQgbmV3X2xlbiA9IEludC5tYXggKGxlbiAqIDIpIG1pbl9sZW4gaW5cbiAgICBsZXQgbmV3X3N0ciA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYuYnl0ZXMgMCBuZXdfc3RyIDAgbGVuO1xuICAgIGJ1Zi5ieXRlcyA8LSBuZXdfc3RyO1xuICApXG5cbigqIEFkZCB0aGUgY2hhcmFjdGVyIGBjJyB0byB0aGUgYnVmZmVyIGBidWYnLiAqKVxubGV0IGJ1ZmZlcl9hZGRfY2hhciBidWYgYyA9XG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiAxO1xuICBCeXRlcy5zZXQgYnVmLmJ5dGVzIGJ1Zi5pbmQgYztcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgMVxuXG4oKiBBZGQgdGhlIHN0cmluZyBgcycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX3N0cmluZyBidWYgcyA9XG4gIGxldCBzdHJfbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBzdHJfbGVuO1xuICBTdHJpbmcuYmxpdCBzIDAgYnVmLmJ5dGVzIGJ1Zi5pbmQgc3RyX2xlbjtcbiAgYnVmLmluZCA8LSBidWYuaW5kICsgc3RyX2xlblxuXG4oKiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4gKilcbmxldCBidWZmZXJfY29udGVudHMgYnVmID1cbiAgQnl0ZXMuc3ViX3N0cmluZyBidWYuYnl0ZXMgMCBidWYuaW5kXG5cbigqKiopXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciBjb252ZXJzaW9uIHRvIGNoYXIuICopXG5sZXQgY2hhcl9vZl9pY29udiBpY29udiA9IG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCB8IEludF9DZCAtPiAnZCcgfCBJbnRfaSB8IEludF9waSB8IEludF9zaVxuICB8IEludF9DaSAtPiAnaScgfCBJbnRfeCB8IEludF9DeCAtPiAneCcgfCBJbnRfWCB8IEludF9DWCAtPiAnWCcgfCBJbnRfb1xuICB8IEludF9DbyAtPiAnbycgfCBJbnRfdSB8IEludF9DdSAtPiAndSdcblxuKCogQ29udmVydCBhIGZsb2F0IGNvbnZlcnNpb24gdG8gY2hhci4gKilcbigqIGBjRicgd2lsbCBiZSAnRicgZm9yIGRpc3BsYXlpbmcgZm9ybWF0IGFuZCAnZycgdG8gY2FsbCBsaWJjIHByaW50ZiAqKVxubGV0IGNoYXJfb2ZfZmNvbnYgPyhjRj0nRicpIGZjb252ID0gbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9mIC0+ICdmJyB8IEZsb2F0X2UgLT4gJ2UnXG4gIHwgRmxvYXRfRSAtPiAnRScgfCBGbG9hdF9nIC0+ICdnJ1xuICB8IEZsb2F0X0cgLT4gJ0cnIHwgRmxvYXRfRiAtPiBjRlxuICB8IEZsb2F0X2ggLT4gJ2gnIHwgRmxvYXRfSCAtPiAnSCdcbiAgfCBGbG9hdF9DRiAtPiAnRidcblxuXG4oKiBDb252ZXJ0IGEgc2Nhbm5pbmcgY291bnRlciB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfY291bnRlciBjb3VudGVyID0gbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyICAtPiAnbCdcbiAgfCBDaGFyX2NvdW50ZXIgIC0+ICduJ1xuICB8IFRva2VuX2NvdW50ZXIgLT4gJ04nXG5cbigqKiopXG5cbigqIFByaW50IGEgY2hhcl9zZXQgaW4gYSBidWZmZXIgd2l0aCB0aGUgT0NhbWwgZm9ybWF0IGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0ID1cbiAgbGV0IHJlYyBwcmludF9zdGFydCBzZXQgPVxuICAgIGxldCBpc19hbG9uZSBjID1cbiAgICAgIGxldCBiZWZvcmUsIGFmdGVyID0gQ2hhci4oY2hyIChjb2RlIGMgLSAxKSwgY2hyIChjb2RlIGMgKyAxKSkgaW5cbiAgICAgIGlzX2luX2NoYXJfc2V0IHNldCBjXG4gICAgICAmJiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCBiZWZvcmUgJiYgaXNfaW5fY2hhcl9zZXQgc2V0IGFmdGVyKSBpblxuICAgIGlmIGlzX2Fsb25lICddJyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nO1xuICAgIHByaW50X291dCBzZXQgMTtcbiAgICBpZiBpc19hbG9uZSAnLScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICctJztcbiAgYW5kIHByaW50X291dCBzZXQgaSA9XG4gICAgaWYgaSA8IDI1NiB0aGVuXG4gICAgICBpZiBpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IGkpIHRoZW4gcHJpbnRfZmlyc3Qgc2V0IGlcbiAgICAgIGVsc2UgcHJpbnRfb3V0IHNldCAoaSArIDEpXG4gIGFuZCBwcmludF9maXJzdCBzZXQgaSA9XG4gICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnXFwyNTUnIC0+IHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICB8ICddJyB8ICctJyAtPiBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgfCBfIC0+IHByaW50X3NlY29uZCBzZXQgKGkgKyAxKTtcbiAgYW5kIHByaW50X3NlY29uZCBzZXQgaSA9XG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuXG4gICAgICBtYXRjaCBjaGFyX29mX2ludCBpIHdpdGhcbiAgICAgIHwgJ1xcMjU1JyAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTQ7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIDI1NTtcbiAgICAgIHwgJ10nIHwgJy0nIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgICB8IF8gd2hlbiBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgKGkgKyAxKSkpIC0+XG4gICAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICAgIHByaW50X2NoYXIgYnVmIGk7XG4gICAgICAgIHByaW50X291dCBzZXQgKGkgKyAyKTtcbiAgICAgIHwgXyAtPlxuICAgICAgICBwcmludF9pbiBzZXQgKGkgLSAxKSAoaSArIDIpO1xuICAgIGVsc2UgKFxuICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgIHByaW50X291dCBzZXQgKGkgKyAxKTtcbiAgICApXG4gIGFuZCBwcmludF9pbiBzZXQgaSBqID1cbiAgICBpZiBqID0gMjU2IHx8IG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBqKSkgdGhlbiAoXG4gICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGludF9vZl9jaGFyICctJyk7XG4gICAgICBwcmludF9jaGFyIGJ1ZiAoaiAtIDEpO1xuICAgICAgaWYgaiA8IDI1NiB0aGVuIHByaW50X291dCBzZXQgKGogKyAxKTtcbiAgICApIGVsc2VcbiAgICAgIHByaW50X2luIHNldCBpIChqICsgMSk7XG4gIGFuZCBwcmludF9jaGFyIGJ1ZiBpID0gbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgfCAnJScgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIHwgJ0AnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICdAJztcbiAgICB8IGMgICAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGluXG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ1snO1xuICBwcmludF9zdGFydCAoXG4gICAgaWYgaXNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgJ1xcMDAwJ1xuICAgIHRoZW4gKCBidWZmZXJfYWRkX2NoYXIgYnVmICdeJzsgcmV2X2NoYXJfc2V0IGNoYXJfc2V0IClcbiAgICBlbHNlIGNoYXJfc2V0XG4gICk7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ10nXG5cbigqKiopXG5cbigqIFByaW50IGEgcGFkdHkgaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wYWR0eSBidWYgcGFkdHkgPSBtYXRjaCBwYWR0eSB3aXRoXG4gIHwgTGVmdCAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSdcbiAgfCBSaWdodCAtPiAoKVxuICB8IFplcm9zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJzAnXG5cbigqIFByaW50IHRoZSAnXycgb2YgYW4gaWdub3JlZCBmbGFnIGlmIG5lZWRlZC4gKilcbmxldCBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZyA9XG4gIGlmIGlnbl9mbGFnIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXydcblxuKCoqKilcblxubGV0IGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgd2lkdGggLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIHdpZHRoKVxuXG4oKioqKVxuXG4oKiBQcmludCBwYWRkaW5nIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkZGluZyA6IHR5cGUgYSBiIC4gYnVmZmVyIC0+IChhLCBiKSBwYWRkaW5nIC0+IHVuaXQgPVxuZnVuIGJ1ZiBwYWQgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+ICgpXG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCBuKSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgYnByaW50X3BhZHR5IGJ1ZiBwYWR0eTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcqJ1xuXG4oKiBQcmludCBwcmVjaXNpb24gaW4gYSBidWZmZXIgd2l0aCB0aGUgZm9ybWF0LWxpa2Ugc3ludGF4LiAqKVxubGV0IGJwcmludF9wcmVjaXNpb24gOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcHJlY2lzaW9uIC0+IHVuaXQgPVxuICBmdW4gYnVmIHByZWMgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uIC0+ICgpXG4gIHwgTGl0X3ByZWNpc2lvbiBuIC0+XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLic7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIChJbnQudG9fc3RyaW5nIG4pO1xuICB8IEFyZ19wcmVjaXNpb24gLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIuKlwiXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBvciAnIycgYXNzb2NpYXRlZCB0byBhbiBpbnQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X3BkIHwgSW50X3BpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgSW50X3NkIHwgSW50X3NpIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgSW50X0N4IHwgSW50X0NYIHwgSW50X0NvIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEludF9kIHwgSW50X2kgfCBJbnRfeCB8IEludF9YIHwgSW50X28gfCBJbnRfdSAtPiAoKVxuXG4oKiBQcmludCBhbiBjb21wbGV0ZSBpbnQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlMy4qZFwiKS4gKilcbmxldCBicHJpbnRfaW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9pY29udiBpY29udilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIGM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqKiopXG5cbigqIFByaW50IHRoZSBvcHRpb25hbCAnKycsICcgJyBhbmQvb3IgJyMnIGFzc29jaWF0ZWQgdG8gYSBmbG9hdCBjb252ZXJzaW9uLiAqKVxubGV0IGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udiA9XG4gIGJlZ2luIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZmxhZ19wIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJysnXG4gIHwgRmxvYXRfZmxhZ19zIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyAnXG4gIHwgRmxvYXRfZmxhZ18gLT4gKCkgZW5kO1xuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X0NGIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyMnXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0dcbiAgfCBGbG9hdF9GIHwgRmxvYXRfaCB8IEZsb2F0X0ggLT4gKClcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmbG9hdCBmb3JtYXQgaW4gYSBidWZmZXIgKGV4OiBcIiUrKi4zZlwiKS4gKilcbmxldCBicHJpbnRfZmxvYXRfZm10IGJ1ZiBpZ25fZmxhZyBmY29udiBwYWQgcHJlYyA9XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICBicHJpbnRfcGFkZGluZyBidWYgcGFkO1xuICBicHJpbnRfcHJlY2lzaW9uIGJ1ZiBwcmVjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2Zjb252IGZjb252KVxuXG4oKiBDb21wdXRlIHRoZSBsaXRlcmFsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZvcm1hdHRpbmdfbGl0LiAqKVxuKCogVXNlZCBieSBQcmludGYgYW5kIFNjYW5mIHdoZXJlIGZvcm1hdHRpbmcgaXMgbm90IGludGVycHJldGVkLiAqKVxubGV0IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCA9IG1hdGNoIGZvcm1hdHRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAtPiBcIkBdXCJcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAtPiBcIkB9XCJcbiAgfCBCcmVhayAoc3RyLCBfLCBfKSAgICAtPiBzdHJcbiAgfCBGRmx1c2ggICAgICAgICAgICAgICAtPiBcIkA/XCJcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAtPiBcIkBcXG5cIlxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgIC0+IFwiQC5cIlxuICB8IE1hZ2ljX3NpemUgKHN0ciwgXykgIC0+IHN0clxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgIC0+IFwiQEBcIlxuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgIC0+IFwiQCVcIlxuICB8IFNjYW5faW5kaWMgYyAtPiBcIkBcIiBeIChTdHJpbmcubWFrZSAxIGMpXG5cbigqKiopXG5cbigqIFByaW50IGEgbGl0ZXJhbCBjaGFyIGluIGEgYnVmZmVyLCBlc2NhcGUgJyUnIGJ5IFwiJSVcIi4gKilcbmxldCBicHJpbnRfY2hhcl9saXRlcmFsIGJ1ZiBjaHIgPSBtYXRjaCBjaHIgd2l0aFxuICB8ICclJyAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlJVwiXG4gIHwgXyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmIGNoclxuXG4oKiBQcmludCBhIGxpdGVyYWwgc3RyaW5nIGluIGEgYnVmZmVyLCBlc2NhcGUgYWxsICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHIgPVxuICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzdHIgLSAxIGRvXG4gICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgc3RyLltpXVxuICBkb25lXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwcmV0dHktcHJpbnRpbmcgKilcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgdHlwZSAoYW4gZm10dHkpIGluIGEgYnVmZmVyLiAqKVxubGV0IHJlYyBicHJpbnRfZm10dHkgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgICBidWZmZXIgLT4gKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIGksIGosIGssIGwpIGZtdHR5X3JlbCAtPiB1bml0ID1cbmZ1biBidWYgZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVjXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXNcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnRfdHkgcmVzdCAgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlaVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEludDMyX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVsaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJW5pXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQ2NF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlTGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZsb2F0X3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVmXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQm9vbF90eSByZXN0ICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBBbHBoYV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlYVwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFRoZXRhX3R5IHJlc3QgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiV0XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQW55X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJT9cIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBSZWFkZXJfdHkgcmVzdCAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlclwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVfclwiO1xuICAgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIle1wiOyBicHJpbnRfZm10dHkgYnVmIHN1Yl9mbXR0eTtcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlfVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWJfZm10dHksIF8sIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJShcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuXG4gIHwgRW5kX29mX2ZtdHR5IC0+ICgpXG5cbigqKiopXG5cbmxldCByZWMgaW50X29mX2N1c3RvbV9hcml0eSA6IHR5cGUgYSBiIGMgLlxuICAoYSwgYiwgYykgY3VzdG9tX2FyaXR5IC0+IGludCA9XG4gIGZ1bmN0aW9uXG4gIHwgQ3VzdG9tX3plcm8gLT4gMFxuICB8IEN1c3RvbV9zdWNjIHggLT4gMSArIGludF9vZl9jdXN0b21fYXJpdHkgeFxuXG4oKiBQcmludCBhIGNvbXBsZXRlIGZvcm1hdCBpbiBhIGJ1ZmZlci4gKilcbmxldCBicHJpbnRfZm10IGJ1ZiBmbXQgPVxuICBsZXQgcmVjIGZtdGl0ZXIgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gYm9vbCAtPiB1bml0ID1cbiAgZnVuIGZtdCBpZ25fZmxhZyAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdzJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkZGluZyBidWYgcGFkOyBidWZmZXJfYWRkX2NoYXIgYnVmICdTJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcblxuICAgIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfYWx0aW50X2ZtdCBidWYgaWduX2ZsYWcgaWNvbnYgcGFkIHByZWMgJ2wnO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICduJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdMJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWM7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdDJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICdhJzsgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAndCc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICBmb3IgX2kgPSAxIHRvIGludF9vZl9jdXN0b21fYXJpdHkgYXJpdHkgZG9cbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICc/JztcbiAgICAgIGRvbmU7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBSZWFkZXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncic7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUhXCI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG5cbiAgICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIHN0cjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgICAgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRfb3B0IGJ1ZiBwYWRfb3B0OyBidWZmZXJfYWRkX2NoYXIgYnVmICd7JztcbiAgICAgIGJwcmludF9mbXR0eSBidWYgZm10dHk7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICd9JztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgd2lkdGhfb3B0OyBicHJpbnRfY2hhcl9zZXQgYnVmIGNoYXJfc2V0O1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfY291bnRlciBjb3VudGVyKTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgXCIwY1wiOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICAgIGZtdGl0ZXIgZm10JyB0cnVlO1xuXG4gICAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0KTtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZm10aW5nX2dlbiB3aXRoXG4gICAgICB8IE9wZW5fdGFnIChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkB7XCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIHwgT3Blbl9ib3ggKEZvcm1hdCAoXywgc3RyKSkgLT5cbiAgICAgICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiQFtcIjsgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHN0clxuICAgICAgZW5kO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+ICgpXG5cbiAgaW4gZm10aXRlciBmbXQgZmFsc2VcblxuKCoqKilcblxuKCogQ29udmVydCBhIGZvcm1hdCB0byBzdHJpbmcuICopXG5sZXQgc3RyaW5nX29mX2ZtdCBmbXQgPVxuICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICBicHJpbnRfZm10IGJ1ZiBmbXQ7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZSBleHRyYWN0aW9uICopXG5cbnR5cGUgKF8sIF8pIGVxID0gUmVmbCA6ICgnYSwgJ2EpIGVxXG5cbigqIEludmFyaWFudDogdGhpcyBmdW5jdGlvbiBpcyB0aGUgaWRlbnRpdHkgb24gdmFsdWVzLlxuXG4gICBJbiBwYXJ0aWN1bGFyLCBpZiAodHkxLCB0eTIpIGhhdmUgZXF1YWwgdmFsdWVzLCB0aGVuXG4gICAodHJhbnMgKHN5bW0gdHkxKSB0eTIpIHJlc3BlY3RzIHRoZSAndHJhbnMnIHByZWNvbmRpdGlvbi4gKilcbmxldCByZWMgc3ltbSA6IHR5cGUgYTEgYjEgYzEgZDEgZTEgZjEgYTIgYjIgYzIgZDIgZTIgZjIgLlxuICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4tPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMixcbiAgICBhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXR0eV9yZWxcbj0gZnVuY3Rpb25cbiAgfCBDaGFyX3R5IHJlc3QgLT4gQ2hhcl90eSAoc3ltbSByZXN0KVxuICB8IEludF90eSByZXN0IC0+IEludF90eSAoc3ltbSByZXN0KVxuICB8IEludDMyX3R5IHJlc3QgLT4gSW50MzJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQ2NF90eSByZXN0IC0+IEludDY0X3R5IChzeW1tIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT4gTmF0aXZlaW50X3R5IChzeW1tIHJlc3QpXG4gIHwgRmxvYXRfdHkgcmVzdCAtPiBGbG9hdF90eSAoc3ltbSByZXN0KVxuICB8IEJvb2xfdHkgcmVzdCAtPiBCb29sX3R5IChzeW1tIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT4gU3RyaW5nX3R5IChzeW1tIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPiBUaGV0YV90eSAoc3ltbSByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT4gQWxwaGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPiBBbnlfdHkgKHN5bW0gcmVzdClcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPiBSZWFkZXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+IElnbm9yZWRfcmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIHN5bW0gcmVzdClcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyLCB0eTEsIHN5bW0gcmVzdClcbiAgfCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG5cbmxldCByZWMgZm10dHlfcmVsX2RldCA6IHR5cGUgYTEgYiBjIGQxIGUxIGYxIGEyIGQyIGUyIGYyIC5cbiAgKGExLCBiLCBjLCBkMSwgZTEsIGYxLFxuICAgYTIsIGIsIGMsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoZjEsIGYyKSBlcSAtPiAoYTEsIGEyKSBlcSlcbiAgKiAoKGExLCBhMikgZXEgLT4gKGYxLCBmMikgZXEpXG4gICogKChlMSwgZTIpIGVxIC0+IChkMSwgZDIpIGVxKVxuICAqICgoZDEsIGQyKSBlcSAtPiAoZTEsIGUyKSBlcSlcbj0gZnVuY3Rpb25cbiAgfCBFbmRfb2ZfZm10dHkgLT5cbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbClcbiAgfCBDaGFyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50MzJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBJbnQ2NF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEFueV90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZWQgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG4gIHwgRm9ybWF0X2FyZ190eSAoX3R5LCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgbGV0IGFnLCBnYSwgZGosIGpkID0gZm10dHlfcmVsX2RldCB0eSBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZyBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGdhIFJlZmwgaW4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gbGV0IFJlZmwgPSBkaiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGpkIFJlZmwgaW4gbGV0IFJlZmwgPSBkZSBSZWZsIGluIFJlZmwpXG5cbigqIFByZWNvbmRpdGlvbjogd2UgYXNzdW1lIHRoYXQgdGhlIHR3byBmbXR0eV9yZWwgYXJndW1lbnRzIGhhdmUgZXF1YWxcbiAgIHZhbHVlcyAoYXQgcG9zc2libHkgZGlzdGluY3QgdHlwZXMpOyB0aGlzIGludmFyaWFudCBjb21lcyBmcm9tIHRoZSB3YXlcbiAgIGZtdHR5X3JlbCB3aXRuZXNzZXMgYXJlIHByb2R1Y2VkIGJ5IHRoZSB0eXBlLWNoZWNrZXJcblxuICAgVGhlIGNvZGUgYmVsb3cgdXNlcyAoYXNzZXJ0IGZhbHNlKSB3aGVuIHRoaXMgYXNzdW1wdGlvbiBpcyBicm9rZW4uIFRoZVxuICAgY29kZSBwYXR0ZXJuIGlzIHRoZSBmb2xsb3dpbmc6XG5cbiAgICAgfCBGb28geCwgRm9vIHkgLT5cbiAgICAgICAoKiBjYXNlIHdoZXJlIGluZGVlZCBib3RoIHZhbHVlc1xuICAgICAgICAgIHN0YXJ0IHdpdGggY29uc3RydWN0b3IgRm9vICopXG4gICAgIHwgRm9vIF8sIF9cbiAgICAgfCBfLCBGb28gXyAtPlxuICAgICAgICgqIGRpZmZlcmVudCBoZWFkIGNvbnN0cnVjdG9yczogYnJva2VuIHByZWNvbmRpdGlvbiAqKVxuICAgICAgIGFzc2VydCBmYWxzZVxuKilcbmFuZCB0cmFucyA6IHR5cGVcbiAgYTEgYjEgYzEgZDEgZTEgZjFcbiAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgYTMgYjMgYzMgZDMgZTMgZjNcbi5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG4tPiAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eV9yZWxcbj0gZnVuIHR5MSB0eTIgLT4gbWF0Y2ggdHkxLCB0eTIgd2l0aFxuICB8IENoYXJfdHkgcmVzdDEsIENoYXJfdHkgcmVzdDIgLT4gQ2hhcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgU3RyaW5nX3R5IHJlc3QxLCBTdHJpbmdfdHkgcmVzdDIgLT4gU3RyaW5nX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBCb29sX3R5IHJlc3QxLCBCb29sX3R5IHJlc3QyIC0+IEJvb2xfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludF90eSByZXN0MSwgSW50X3R5IHJlc3QyIC0+IEludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50MzJfdHkgcmVzdDEsIEludDMyX3R5IHJlc3QyIC0+IEludDMyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnQ2NF90eSByZXN0MSwgSW50NjRfdHkgcmVzdDIgLT4gSW50NjRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IE5hdGl2ZWludF90eSByZXN0MSwgTmF0aXZlaW50X3R5IHJlc3QyIC0+IE5hdGl2ZWludF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRmxvYXRfdHkgcmVzdDEsIEZsb2F0X3R5IHJlc3QyIC0+IEZsb2F0X3R5ICh0cmFucyByZXN0MSByZXN0MilcblxuICB8IEFscGhhX3R5IHJlc3QxLCBBbHBoYV90eSByZXN0MiAtPiBBbHBoYV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQWxwaGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbHBoYV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgVGhldGFfdHkgcmVzdDEsIFRoZXRhX3R5IHJlc3QyIC0+IFRoZXRhX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBUaGV0YV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIFRoZXRhX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBBbnlfdHkgcmVzdDEsIEFueV90eSByZXN0MiAtPiBBbnlfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFueV90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEFueV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgUmVhZGVyX3R5IHJlc3QxLCBSZWFkZXJfdHkgcmVzdDIgLT4gUmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBSZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBSZWFkZXJfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QxLCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MiAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIElnbm9yZWRfcmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBGb3JtYXRfYXJnX3R5ICh0eTEsIHJlc3QxKSwgRm9ybWF0X2FyZ190eSAodHkyLCByZXN0MikgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0cmFucyB0eTEgdHkyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfYXJnX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgRm9ybWF0X2FyZ190eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTEyLCByZXN0MSksXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTIxLCB0eTIyLCByZXN0MikgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEyKSB0eTIxIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICBsZXQgUmVmbCA9IGYyIFJlZmwgaW5cbiAgICBsZXQgUmVmbCA9IGY0IFJlZmwgaW5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MTEsIHR5MjIsIHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZvcm1hdF9zdWJzdF90eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9zdWJzdF90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRW5kX29mX2ZtdHR5LCBFbmRfb2ZfZm10dHkgLT4gRW5kX29mX2ZtdHR5XG4gIHwgRW5kX29mX2ZtdHR5LCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEVuZF9vZl9mbXR0eSAtPiBhc3NlcnQgZmFsc2VcblxubGV0IHJlYyBmbXR0eV9vZl9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm9ybWF0dGluZ19nZW4gLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGZvcm1hdHRpbmdfZ2VuIC0+IG1hdGNoIGZvcm1hdHRpbmdfZ2VuIHdpdGhcbiAgfCBPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBFeHRyYWN0IHRoZSB0eXBlIHJlcHJlc2VudGF0aW9uIChhbiBmbXR0eSkgb2YgYSBmb3JtYXQuICopXG5hbmQgZm10dHlfb2ZfZm10IDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmbXR0eSAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgKFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuXG4gIHwgSW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQzMiAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQzMl90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoTmF0aXZlaW50X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEludDY0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKEZsb2F0X3R5IHR5X3Jlc3QpIGluXG4gICAgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSBwYWQgcHJlY190eVxuXG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgICAgICAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAgICAgICAgICAgLT5cbiAgICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChCb29sX3R5IChmbXR0eV9vZl9mbXQgcmVzdCkpXG4gIHwgQWxwaGEgcmVzdCAgICAgICAgICAgICAgICAgLT4gQWxwaGFfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgIC0+IFRoZXRhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAgICAtPiBmbXR0eV9vZl9jdXN0b20gYXJpdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFJlYWRlciByZXN0ICAgICAgICAgICAgICAgIC0+IFJlYWRlcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnX3R5ICh0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0IChfLCB0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5LCB0eSwgZm10dHlfb2ZfZm10IHJlc3QpXG5cbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+IFN0cmluZ190eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT4gSW50X3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAtPiBDaGFyX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAtPiBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdFxuICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKGZtdGluZ19nZW4sIHJlc3QpICAtPlxuICAgIGNvbmNhdF9mbXR0eSAoZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gZm10aW5nX2dlbikgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgLT4gRW5kX29mX2ZtdHR5XG5cbmFuZCBmbXR0eV9vZl9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICh5LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gYXJpdHkgZm10dHkgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IGZtdHR5XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT4gQW55X3R5IChmbXR0eV9vZl9jdXN0b20gYXJpdHkgZm10dHkpXG5cbigqIEV4dHJhY3QgdGhlIGZtdHR5IG9mIGFuIGlnbm9yZWQgcGFyYW1ldGVyIGZvbGxvd2VkIGJ5IHRoZSByZXN0IG9mXG4gICB0aGUgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2lnbm9yZWRfZm9ybWF0IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgIChhLCBiLCBjLCBkLCB5LCB4KSBpZ25vcmVkIC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gY29uY2F0X2ZtdHR5IGZtdHR5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gSWdub3JlZF9yZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCBmbXQpXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAgICAgICAgICAtPiBmbXR0eV9vZl9mbXQgZm10XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwYWRkaW5nIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlKnNcIikuICopXG5hbmQgZm10dHlfb2ZfcGFkZGluZ19mbXR0eSA6IHR5cGUgeCBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIGEpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwYWQgZm10dHkgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAgLT4gZm10dHlcbiAgICB8IExpdF9wYWRkaW5nIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wYWRkaW5nIF8gLT4gSW50X3R5IGZtdHR5XG5cbigqIEFkZCBhbiBJbnRfdHkgbm9kZSBpZiBwcmVjaXNpb24gaXMgdGFrZW4gYXMgYW4gZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUuKmZcIikuKilcbmFuZCBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwcmVjaXNpb24gLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+ICh4LCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG4gIGZ1biBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMgd2l0aFxuICAgIHwgTm9fcHJlY2lzaW9uICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcHJlY2lzaW9uIF8gLT4gZm10dHlcbiAgICB8IEFyZ19wcmVjaXNpb24gICAtPiBJbnRfdHkgZm10dHlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgdHlwaW5nICopXG5cbigqIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhIGZvcm1hdCBkb2VzIG5vdCBtYXRjaCBhIGdpdmVuIGZvcm1hdCB0eXBlLiAqKVxuZXhjZXB0aW9uIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIHBhZGRpbmcuICopXG4oKiBUYWtlIGFuIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiB0aGUgaW50ZWdlciBzaG91bGQgYmUga2VwdCBhcyBhcmd1bWVudC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkZGluZyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRkaW5nX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCwgZm10dHkgd2l0aFxuICB8IE5vX3BhZGRpbmcsIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKE5vX3BhZGRpbmcsIGZtdHR5KVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIF8gLT4gUGFkZGluZ19mbXR0eV9FQkIgKExpdF9wYWRkaW5nIChwYWR0eSx3KSxmbXR0eSlcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgSW50X3R5IHJlc3QgLT4gUGFkZGluZ19mbXR0eV9FQkIgKEFyZ19wYWRkaW5nIHBhZHR5LHJlc3QpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIENvbnZlcnQgYSAodXBhZGRpbmcsIHVwcmVjaXNpb24pIHRvIGEgKHBhZGRpbmcsIHByZWNpc2lvbikuICopXG4oKiBUYWtlIG9uZSBvciB0d28gSW50X3R5IGZyb20gdGhlIGZtdHR5IGlmIG5lZWRlZC4gKilcbigqIFJhaXNlIFR5cGVfbWlzbWF0Y2ggaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IHR5cGVfcGFkcHJlYyA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IHogLlxuICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgeikgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBwYWRwcmVjX2ZtdHR5X2ViYiA9XG5mdW4gcGFkIHByZWMgZm10dHkgLT4gbWF0Y2ggcHJlYywgdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIE5vX3ByZWNpc2lvbiwgcmVzdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAsIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIHJlc3QpIC0+XG4gICAgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgTGl0X3ByZWNpc2lvbiBwLCByZXN0KVxuICB8IEFyZ19wcmVjaXNpb24sIFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEludF90eSByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIEFyZ19wcmVjaXNpb24sIHJlc3QpXG4gIHwgXywgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVHlwZSBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBJZiB0eXBpbmcgc3VjY2VlZCwgZ2VuZXJhdGUgYSBjb3B5IG9mIHRoZSBmb3JtYXQgd2l0aCB0aGUgc2FtZVxuICAgIHR5cGUgcGFyYW1ldGVycyBhcyB0aGUgZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCByZWMgdHlwZV9mb3JtYXQgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjIgIC5cbiAgICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdFxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkgd2l0aFxuICB8IEZtdF9mbXR0eV9FQkIgKGZtdCcsIEVuZF9vZl9mbXR0eSkgLT4gZm10J1xuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXRfZ2VuIDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBmbXQgZm10dHkgLT4gbWF0Y2ggZm10LCBmbXR0eSB3aXRoXG4gIHwgQ2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXIgZm10JywgZm10dHknKVxuICB8IENhbWxfY2hhciBmbXRfcmVzdCwgQ2hhcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfY2hhciBmbXQnLCBmbXR0eScpXG4gIHwgU3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBTdHJpbmdfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKENhbWxfc3RyaW5nIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50MzJfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEludDMyIChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDY0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgRmxvYXRfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEZsb2F0IChmY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEJvb2wgKHBhZCwgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZGRpbmcgcGFkIGZtdHR5IHdpdGhcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChwYWQsIEJvb2xfdHkgZm10dHlfcmVzdCkgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICAgIEZtdF9mbXR0eV9FQkIgKEJvb2wgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBGbHVzaCBmbXRfcmVzdCwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGbHVzaCBmbXQnLCBmbXR0eScpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10JyksIGZtdHR5JylcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKENoYXJfbGl0ZXJhbCAoY2hyLCBmbXQnKSwgZm10dHknKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5LCBmbXRfcmVzdCksXG4gICAgRm9ybWF0X2FyZ190eSAoc3ViX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWJfZm10dHknIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5JywgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5MSwgX3N1Yl9mbXR0eTIsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWJfZm10dHkxKSB0aGVuXG4gICAgICByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID1cbiAgICAgIHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCAoZXJhc2VfcmVsIGZtdHR5X3Jlc3QpXG4gICAgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eTEsIGZtdCcpLCBmbXR0eScpXG4gICgqIFByaW50ZiBhbmQgRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBBbHBoYSBmbXRfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChBbHBoYSBmbXQnLCBmbXR0eScpXG4gIHwgVGhldGEgZm10X3Jlc3QsIFRoZXRhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoVGhldGEgZm10JywgZm10dHknKVxuXG4gICgqIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXQnKSwgZm10dHknKVxuICB8IEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nX2dlbiwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9mb3JtYXR0aW5nX2dlbiBmb3JtYXR0aW5nX2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0XG5cbiAgKCogU2NhbmYgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IFJlYWRlciBmbXRfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoUmVhZGVyIGZtdCcsIGZtdHR5JylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXRfcmVzdCksIFN0cmluZ190eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIGZtdCcpLCBmbXR0eScpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpLCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXQnKSwgZm10dHknKVxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCksIGZtdHR5X3Jlc3QgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW0gaWduIHJlc3QgZm10dHlfcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdCAtPiBGbXRfZm10dHlfRUJCIChFbmRfb2ZfZm9ybWF0LCBmbXR0eV9yZXN0KVxuXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbmFuZCB0eXBlX2Zvcm1hdHRpbmdfZ2VuIDogdHlwZSBhMSBhMyBiMSBiMyBjMSBjMyBkMSBkMyBlMSBlMiBlMyBmMSBmMiBmMyAuXG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGYxLCBiMSwgYzEsIGUxLCBlMiwgZjIpIGZtdCAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXR0eSAtPlxuICAgIChhMywgYjMsIGMzLCBkMywgZTMsIGYzKSBmbXRfZm10dHlfZWJiID1cbmZ1biBmb3JtYXR0aW5nX2dlbiBmbXQwIGZtdHR5MCAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10MSwgc3RyKSkgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MiwgZm10dHkyKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQxIGZtdHR5MCBpblxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQzLCBmbXR0eTMpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDAgZm10dHkyIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdDIsIHN0cikpLCBmbXQzKSwgZm10dHkzKVxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcblxuKCogVHlwZSBhbiBJZ25vcmVkX3BhcmFtIG5vZGUgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuYW5kIHR5cGVfaWdub3JlZF9wYXJhbSA6IHR5cGUgcCBxIHggeSB6IHQgdSB2IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgeSwgeiwgdCwgcSwgcCkgaWdub3JlZCAtPlxuICAgIChwLCB5LCB6LCBxLCB1LCB2KSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10X2ZtdHR5X2ViYiA9XG5mdW4gaWduIGZtdCBmbXR0eSAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50IF8gICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50MzIgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfbmF0aXZlaW50IF8gICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfaW50NjQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZmxvYXQgXyAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgIGFzIGlnbicgLT4gdHlwZV9pZ25vcmVkX3BhcmFtX29uZSBpZ24nIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSAtPlxuICAgIHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgKElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgc3ViX2ZtdHR5KSkgZm10IGZtdHR5XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5JywgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSkgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5IGZtdCBmbXR0eSBpblxuICAgIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHknKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQnKSxcbiAgICAgICAgICAgICAgICAgICBmbXR0eScpXG4gIHwgSWdub3JlZF9yZWFkZXIgLT4gKFxuICAgIG1hdGNoIGZtdHR5IHdpdGhcbiAgICB8IElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3JlYWRlciwgZm10JyksIGZtdHR5JylcbiAgICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG5cbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIDogdHlwZSBhMSBhMiBiMSBiMiBjMSBjMiBkMSBkMiBlMSBlMiBmMSBmMiAuXG4gICAgKGEyLCBiMiwgYzIsIGQyLCBkMiwgYTIpIGlnbm9yZWQgLT5cbiAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5IC0+XG4gICAgKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdF9mbXR0eV9lYmJcbj0gZnVuIGlnbiBmbXQgZm10dHkgLT5cbiAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IGluXG4gIEZtdF9mbXR0eV9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbiwgZm10JyksIGZtdHR5JylcblxuKCogVHlwaW5nIG9mIHRoZSBjb21wbGV4IGNhc2U6IFwiJV8oLi4uJSlcIi4gKilcbmFuZCB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiA6IHR5cGUgdyB4IHkgeiBwIHMgdCB1IGEgYiBjIGQgZSBmIC5cbiAgICAodywgeCwgeSwgeiwgcywgcCkgZm10dHkgLT5cbiAgICAocCwgeCwgeSwgcywgdCwgdSkgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eV9mbXRfZWJiID1cbmZ1biBzdWJfZm10dHkgZm10IGZtdHR5IC0+IG1hdGNoIHN1Yl9mbXR0eSwgZm10dHkgd2l0aFxuICB8IENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQ2hhcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0LCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoU3RyaW5nX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEludDMyX3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnQzMl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChJbnQzMl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBOYXRpdmVpbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoTmF0aXZlaW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQ2NF90eSBzdWJfZm10dHlfcmVzdCwgSW50NjRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEZsb2F0X3R5IHN1Yl9mbXR0eV9yZXN0LCBGbG9hdF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGbG9hdF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQm9vbF90eSBzdWJfZm10dHlfcmVzdCwgQm9vbF90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChCb29sX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBBbHBoYV90eSBzdWJfZm10dHlfcmVzdCwgQWxwaGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFRoZXRhX3R5IHN1Yl9mbXR0eV9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChUaGV0YV90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0LCBSZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoUmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgSWdub3JlZF9yZWFkZXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuXG4gIHwgRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eSwgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiBzdWIyX2ZtdHR5IDw+IEZtdHR5X0VCQiBzdWIyX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gc3ViX2ZtdHR5X3Jlc3QgZm10IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5Jywgc3ViX2ZtdHR5X3Jlc3QnKSwgZm10JylcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHksICBzdWIyX2ZtdHR5LCAgc3ViX2ZtdHR5X3Jlc3QpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLCBmbXR0eV9yZXN0KSAtPlxuICAgICgqIFRPRE8gZGVmaW5lIEZtdHR5X3JlbF9FQkIgdG8gcmVtb3ZlIHRob3NlIGVyYXNlX3JlbCAqKVxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHkpIDw+IEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1YjFfZm10dHknKVxuICAgIHRoZW4gcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIyX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IHN1Yl9mbXR0eScgPSB0cmFucyAoc3ltbSBzdWIxX2ZtdHR5Jykgc3ViMl9mbXR0eScgaW5cbiAgICBsZXQgXywgZjIsIF8sIGY0ID0gZm10dHlfcmVsX2RldCBzdWJfZm10dHknIGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eV9yZXN0JywgZm10JykgPVxuICAgICAgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gKGVyYXNlX3JlbCBzdWJfZm10dHlfcmVzdCkgZm10IGZtdHR5X3Jlc3RcbiAgICBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEZvcm1hdF9zdWJzdF90eSAoc3ViMV9mbXR0eScsIHN1YjJfZm10dHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbSBzdWJfZm10dHlfcmVzdCcpLFxuICAgICAgICAgICAgICAgICAgIGZtdCcpXG4gIHwgRW5kX29mX2ZtdHR5LCBmbXR0eSAtPlxuICAgIEZtdHR5X2ZtdF9FQkIgKEVuZF9vZl9mbXR0eSwgdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSlcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBgcmVjYXN0YCBpcyBhIGJpdCBkaXNhcHBvaW50aW5nLiBUaGVcbiAgIGludmFyaWFudCBwcm92aWRlZCBieSB0aGUgdHlwZSBhcmUgdmVyeSBzdHJvbmc6IHRoZSBpbnB1dCBmb3JtYXQnc1xuICAgdHlwZSBpcyBpbiByZWxhdGlvbiB0byB0aGUgb3V0cHV0IHR5cGUncyBhcyB3aXRuZXNzZWQgYnkgdGhlXG4gICBmbXR0eV9yZWwgYXJndW1lbnQuIE9uZSB3b3VsZCBhdCBmaXJzdCBleHBlY3QgdGhpcyBmdW5jdGlvbiB0byBiZVxuICAgdG90YWwsIGFuZCBpbXBsZW1lbnRhYmxlIGJ5IGV4aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZy4gSW5zdGVhZCxcbiAgIHdlIHJldXNlIHRoZSBoaWdobHkgcGFydGlhbCBhbmQgbXVjaCBsZXNzIHdlbGwtZGVmaW5lZCBmdW5jdGlvblxuICAgYHR5cGVfZm9ybWF0YCB0aGF0IGhhcyBsb3N0IGFsbCBrbm93bGVkZ2Ugb2YgdGhlIGNvcnJlc3BvbmRlbmNlXG4gICBiZXR3ZWVuIHRoZSBhcmd1bWVudCdzIHR5cGVzLlxuXG4gICBCZXNpZGVzIHRoZSBmYWN0IHRoYXQgdGhpcyBmdW5jdGlvbiByZXVzZXMgYSBsb3Qgb2YgdGhlXG4gICBgdHlwZV9mb3JtYXRgIGxvZ2ljIChlZy46IHNlZWluZyBJbnRfdHkgaW4gdGhlIGZtdHR5IHBhcmFtZXRlciBkb2VzXG4gICBub3QgbGV0IHlvdSBtYXRjaCBvbiBJbnQgb25seSwgYXMgeW91IG1heSBpbiBmYWN0IGhhdmUgRmxvYXRcbiAgIChBcmdfcGFkZGluZywgLi4uKSAoXCIlLipkXCIpIGJlZ2lubmluZyB3aXRoIGFuIEludF90eSksIGl0IGlzIGFsc29cbiAgIGEgcGFydGlhbCBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgdHlwaW5nIGluZm9ybWF0aW9uIGluIGEgZm9ybWF0IGlzXG4gICBub3QgcXVpdGUgZW5vdWdoIHRvIHJlY29uc3RydWN0IGl0IHVuYW1iaWd1b3VzbHkuIEZvciBleGFtcGxlLCB0aGVcbiAgIGZvcm1hdCB0eXBlcyBvZiBcIiVkJV9yXCIgYW5kIFwiJV9yJWRcIiBoYXZlIHRoZSBzYW1lIGZvcm1hdDZcbiAgIHBhcmFtZXRlcnMsIGJ1dCB0aGV5IGFyZSBub3QgYXQgYWxsIGV4Y2hhbmdlYWJsZSwgYW5kIHB1dHRpbmcgb25lXG4gICBpbiBwbGFjZSBvZiB0aGUgb3RoZXIgbXVzdCByZXN1bHQgaW4gYSBkeW5hbWljIGZhaWx1cmUuXG5cbiAgIEdpdmVuIHRoYXQ6XG4gICAtIHdlJ2QgaGF2ZSB0byBkdXBsaWNhdGUgYSBsb3Qgb2Ygbm9uLXRyaXZpYWwgdHlwaW5nIGxvZ2ljIGZyb20gdHlwZV9mb3JtYXRcbiAgIC0gdGhpcyB3b3VsZG4ndCBldmVuIGVsaW1pbmF0ZSAoYWxsKSB0aGUgZHluYW1pYyBmYWlsdXJlc1xuICAgd2UgZGVjaWRlZCB0byBqdXN0IHJldXNlIHR5cGVfZm9ybWF0IGRpcmVjdGx5IGZvciBub3cuXG4qKVxubGV0IHJlY2FzdCA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMlxuICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdFxuPSBmdW4gZm10IGZtdHR5IC0+XG4gIHR5cGVfZm9ybWF0IGZtdCAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUHJpbnRpbmcgdG9vbHMgKilcblxuKCogQWRkIHBhZGRpbmcgc3BhY2VzIGFyb3VuZCBhIHN0cmluZy4gKilcbmxldCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCBzdHIgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoLCBwYWR0eSA9XG4gICAgYWJzIHdpZHRoLFxuICAgICgqIHdoaWxlIGxpdGVyYWwgcGFkZGluZyB3aWR0aHMgYXJlIGFsd2F5cyBub24tbmVnYXRpdmUsXG4gICAgICAgZHluYW1pY2FsbHktc2V0IHdpZHRocyAoQXJnX3BhZGRpbmcsIGVnLiAlKmQpIG1heSBiZSBuZWdhdGl2ZTtcbiAgICAgICB3ZSBpbnRlcnByZXQgdGhvc2UgYXMgc3BlY2lmeWluZyBhIHBhZGRpbmctdG8tdGhlLWxlZnQ7IHRoaXNcbiAgICAgICBtZWFucyB0aGF0ICcwJyBtYXkgZ2V0IGRyb3BwZWQgZXZlbiBpZiBpdCB3YXMgZXhwbGljaXRseSBzZXQsXG4gICAgICAgYnV0OlxuICAgICAgIC0gdGhpcyBpcyB3aGF0IHRoZSBsZWdhY3kgaW1wbGVtZW50YXRpb24gZG9lcywgYW5kXG4gICAgICAgICB3ZSBwcmVzZXJ2ZSBjb21wYXRpYmlsaXR5IGlmIHBvc3NpYmxlXG4gICAgICAgLSB3ZSBjb3VsZCBvbmx5IHNpZ25hbCB0aGlzIGlzc3VlIGJ5IGZhaWxpbmcgYXQgcnVudGltZSxcbiAgICAgICAgIHdoaWNoIGlzIG5vdCB2ZXJ5IG5pY2UuLi4gKilcbiAgICBpZiB3aWR0aCA8IDAgdGhlbiBMZWZ0IGVsc2UgcGFkdHkgaW5cbiAgaWYgd2lkdGggPD0gbGVuIHRoZW4gc3RyIGVsc2VcbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSB3aWR0aCAoaWYgcGFkdHkgPSBaZXJvcyB0aGVuICcwJyBlbHNlICcgJykgaW5cbiAgICBiZWdpbiBtYXRjaCBwYWR0eSB3aXRoXG4gICAgfCBMZWZ0ICAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgMCBsZW5cbiAgICB8IFJpZ2h0IC0+IFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAwICYmIChzdHIuWzBdID0gJysnIHx8IHN0ci5bMF0gPSAnLScgfHwgc3RyLlswXSA9ICcgJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMCBzdHIuWzBdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzICh3aWR0aCAtIGxlbiArIDEpIChsZW4gLSAxKVxuICAgIHwgWmVyb3Mgd2hlbiBsZW4gPiAxICYmIHN0ci5bMF0gPSAnMCcgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzICh3aWR0aCAtIGxlbiArIDIpIChsZW4gLSAyKVxuICAgIHwgWmVyb3MgLT5cbiAgICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAod2lkdGggLSBsZW4pIGxlblxuICAgIGVuZDtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBBZGQgJzAnIHBhZGRpbmcgdG8gaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gKilcbmxldCBmaXhfaW50X3ByZWNpc2lvbiBwcmVjIHN0ciA9XG4gIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIG1hdGNoIHN0ci5bMF0gd2l0aFxuICB8ICgnKycgfCAnLScgfCAnICcpIGFzIGMgd2hlbiBwcmVjICsgMSA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMSkgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAwIGM7XG4gICAgU3RyaW5nLmJsaXQgc3RyIDEgcmVzIChwcmVjIC0gbGVuICsgMikgKGxlbiAtIDEpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIHdoZW4gcHJlYyArIDIgPiBsZW4gJiYgbGVuID4gMSAmJiAoc3RyLlsxXSA9ICd4JyB8fCBzdHIuWzFdID0gJ1gnKSAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIChwcmVjICsgMikgJzAnIGluXG4gICAgQnl0ZXMuc2V0IHJlcyAxIHN0ci5bMV07XG4gICAgU3RyaW5nLmJsaXQgc3RyIDIgcmVzIChwcmVjIC0gbGVuICsgNCkgKGxlbiAtIDIpO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHdoZW4gcHJlYyA+IGxlbiAtPlxuICAgIGxldCByZXMgPSBCeXRlcy5tYWtlIHByZWMgJzAnIGluXG4gICAgU3RyaW5nLmJsaXQgc3RyIDAgcmVzIChwcmVjIC0gbGVuKSBsZW47XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgfCBfIC0+XG4gICAgc3RyXG5cbigqIEVzY2FwZSBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGluZyBjb252ZW50aW9uLiAqKVxubGV0IHN0cmluZ190b19jYW1sX3N0cmluZyBzdHIgPVxuICBsZXQgc3RyID0gU3RyaW5nLmVzY2FwZWQgc3RyIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFxcIicgaW5cbiAgU3RyaW5nLnVuc2FmZV9ibGl0IHN0ciAwIHJlcyAxIGw7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfaW50L2ludDMyL25hdGl2ZWludC9pbnQ2NCBmaXJzdCBhcmd1bWVudFxuICAgZnJvbSBhbiBpbnRfY29udi4gKilcbmxldCBmb3JtYXRfb2ZfaWNvbnYgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWRcIiB8IEludF9wZCAtPiBcIiUrZFwiIHwgSW50X3NkIC0+IFwiJSBkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVpXCIgfCBJbnRfcGkgLT4gXCIlK2lcIiB8IEludF9zaSAtPiBcIiUgaVwiXG4gIHwgSW50X3ggLT4gXCIleFwiIHwgSW50X0N4IC0+IFwiJSN4XCJcbiAgfCBJbnRfWCAtPiBcIiVYXCIgfCBJbnRfQ1ggLT4gXCIlI1hcIlxuICB8IEludF9vIC0+IFwiJW9cIiB8IEludF9DbyAtPiBcIiUjb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIldVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZMID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVMZFwiIHwgSW50X3BkIC0+IFwiJStMZFwiIHwgSW50X3NkIC0+IFwiJSBMZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlTGlcIiB8IEludF9waSAtPiBcIiUrTGlcIiB8IEludF9zaSAtPiBcIiUgTGlcIlxuICB8IEludF94IC0+IFwiJUx4XCIgfCBJbnRfQ3ggLT4gXCIlI0x4XCJcbiAgfCBJbnRfWCAtPiBcIiVMWFwiIHwgSW50X0NYIC0+IFwiJSNMWFwiXG4gIHwgSW50X28gLT4gXCIlTG9cIiB8IEludF9DbyAtPiBcIiUjTG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJUx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udmwgPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJWxkXCIgfCBJbnRfcGQgLT4gXCIlK2xkXCIgfCBJbnRfc2QgLT4gXCIlIGxkXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVsaVwiIHwgSW50X3BpIC0+IFwiJStsaVwiIHwgSW50X3NpIC0+IFwiJSBsaVwiXG4gIHwgSW50X3ggLT4gXCIlbHhcIiB8IEludF9DeCAtPiBcIiUjbHhcIlxuICB8IEludF9YIC0+IFwiJWxYXCIgfCBJbnRfQ1ggLT4gXCIlI2xYXCJcbiAgfCBJbnRfbyAtPiBcIiVsb1wiIHwgSW50X0NvIC0+IFwiJSNsb1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbHVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252biA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlbmRcIiB8IEludF9wZCAtPiBcIiUrbmRcIiB8IEludF9zZCAtPiBcIiUgbmRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJW5pXCIgfCBJbnRfcGkgLT4gXCIlK25pXCIgfCBJbnRfc2kgLT4gXCIlIG5pXCJcbiAgfCBJbnRfeCAtPiBcIiVueFwiIHwgSW50X0N4IC0+IFwiJSNueFwiXG4gIHwgSW50X1ggLT4gXCIlblhcIiB8IEludF9DWCAtPiBcIiUjblhcIlxuICB8IEludF9vIC0+IFwiJW5vXCIgfCBJbnRfQ28gLT4gXCIlI25vXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVudVwiXG5cbigqIEdlbmVyYXRlIHRoZSBmb3JtYXRfZmxvYXQgZmlyc3QgYXJndW1lbnQgZnJvbSBhIGZsb2F0X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMgPVxuICAgIGxldCBwcmVjID0gYWJzIHByZWMgaW5cbiAgICBsZXQgc3ltYiA9IGNoYXJfb2ZfZmNvbnYgfmNGOidnJyBmY29udiBpblxuICAgIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gICAgYnByaW50X2Zjb252X2ZsYWcgYnVmIGZjb252O1xuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBwcmVjKTtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmIHN5bWI7XG4gICAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG5sZXQgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgcyA9XG4gIG1hdGNoIGljb252IHdpdGhcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgLT5cbiAgICBsZXQgZGlnaXRzID1cbiAgICAgIGxldCBuID0gcmVmIDAgaW5cbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHMgaSB3aXRoXG4gICAgICAgIHwgJzAnLi4nOScgLT4gaW5jciBuXG4gICAgICAgIHwgXyAtPiAoKVxuICAgICAgZG9uZTtcbiAgICAgICFuXG4gICAgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAoZGlnaXRzIC0gMSkgLyAzKSBpblxuICAgIGxldCBwb3MgPSByZWYgMCBpblxuICAgIGxldCBwdXQgYyA9IEJ5dGVzLnNldCBidWYgIXBvcyBjOyBpbmNyIHBvcyBpblxuICAgIGxldCBsZWZ0ID0gcmVmICgoZGlnaXRzIC0gMSkgbW9kIDMgKyAxKSBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgfCAnMCcuLic5JyBhcyBjIC0+XG4gICAgICAgICAgaWYgIWxlZnQgPSAwIHRoZW4gKHB1dCAnXyc7IGxlZnQgOj0gMyk7IGRlY3IgbGVmdDsgcHV0IGNcbiAgICAgIHwgYyAtPiBwdXQgY1xuICAgIGRvbmU7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgfCBfIC0+IHNcblxuKCogQ29udmVydCBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nIGFjY29yZGluZyB0byBhIGNvbnZlcnNpb24uICopXG5sZXQgY29udmVydF9pbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50IChmb3JtYXRfb2ZfaWNvbnYgaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQzMiBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQzMiAoZm9ybWF0X29mX2ljb252bCBpY29udikgbilcbmxldCBjb252ZXJ0X25hdGl2ZWludCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9uYXRpdmVpbnQgKGZvcm1hdF9vZl9pY29udm4gaWNvbnYpIG4pXG5sZXQgY29udmVydF9pbnQ2NCBpY29udiBuID1cbiAgdHJhbnNmb3JtX2ludF9hbHQgaWNvbnYgKGZvcm1hdF9pbnQ2NCAoZm9ybWF0X29mX2ljb252TCBpY29udikgbilcblxuKCogQ29udmVydCBhIGZsb2F0IHRvIHN0cmluZy4gKilcbigqIEZpeCBzcGVjaWFsIGNhc2Ugb2YgXCJPQ2FtbCBmbG9hdCBmb3JtYXRcIi4gKilcbmxldCBjb252ZXJ0X2Zsb2F0IGZjb252IHByZWMgeCA9XG4gIGxldCBoZXggKCkgPVxuICAgIGxldCBzaWduID1cbiAgICAgIG1hdGNoIGZzdCBmY29udiB3aXRoXG4gICAgICB8IEZsb2F0X2ZsYWdfcCAtPiAnKydcbiAgICAgIHwgRmxvYXRfZmxhZ19zIC0+ICcgJ1xuICAgICAgfCBfIC0+ICctJyBpblxuICAgIGhleHN0cmluZ19vZl9mbG9hdCB4IHByZWMgc2lnbiBpblxuICBsZXQgYWRkX2RvdF9pZl9uZWVkZWQgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGlzX3ZhbGlkIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltpXSB3aXRoXG4gICAgICAgIHwgJy4nIHwgJ2UnIHwgJ0UnIC0+IHRydWVcbiAgICAgICAgfCBfIC0+IGlzX3ZhbGlkIChpICsgMSkgaW5cbiAgICBpZiBpc192YWxpZCAwIHRoZW4gc3RyIGVsc2Ugc3RyIF4gXCIuXCIgaW5cbiAgbGV0IGNhbWxfc3BlY2lhbF92YWwgc3RyID0gbWF0Y2ggY2xhc3NpZnlfZmxvYXQgeCB3aXRoXG4gICAgfCBGUF9ub3JtYWwgfCBGUF9zdWJub3JtYWwgfCBGUF96ZXJvIC0+IHN0clxuICAgIHwgRlBfaW5maW5pdGUgLT4gaWYgeCA8IDAuMCB0aGVuIFwibmVnX2luZmluaXR5XCIgZWxzZSBcImluZmluaXR5XCJcbiAgICB8IEZQX25hbiAtPiBcIm5hblwiIGluXG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfaCAtPiBoZXggKClcbiAgfCBGbG9hdF9IIC0+IFN0cmluZy51cHBlcmNhc2VfYXNjaWkgKGhleCAoKSlcbiAgfCBGbG9hdF9DRiAtPiBjYW1sX3NwZWNpYWxfdmFsIChoZXggKCkpXG4gIHwgRmxvYXRfRiAtPlxuICAgIGxldCBzdHIgPSBmb3JtYXRfZmxvYXQgKGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjKSB4IGluXG4gICAgY2FtbF9zcGVjaWFsX3ZhbCAoYWRkX2RvdF9pZl9uZWVkZWQgc3RyKVxuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HIC0+XG4gICAgZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeFxuXG4oKiBDb252ZXJ0IGEgY2hhciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIE9DYW1sIGxleGljYWwgY29udmVudGlvbi4gKilcbmxldCBmb3JtYXRfY2FtbF9jaGFyIGMgPVxuICBsZXQgc3RyID0gQ2hhci5lc2NhcGVkIGMgaW5cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBsZXQgcmVzID0gQnl0ZXMubWFrZSAobCArIDIpICdcXCcnIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBDb252ZXJ0IGEgZm9ybWF0IHR5cGUgdG8gc3RyaW5nICopXG5sZXQgc3RyaW5nX29mX2ZtdHR5IGZtdHR5ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTtcbiAgYnVmZmVyX2NvbnRlbnRzIGJ1ZlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBwcmludGluZyBmdW5jdGlvbiAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBwcmludGluZyBmdW5jdGlvbi4gKilcbigqIFVzZWQgdG8gZ2VuZXJhdGUgUHJpbnRmIGFuZCBGb3JtYXQgcHJpbnRpbmcgZnVuY3Rpb25zLiAqKVxuKCogUGFyYW1ldGVyczpcbiAgICAgazogYSBjb250aW51YXRpb24gZmluYWxseSBhcHBsaWVkIHRvIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCB0aGUgYWNjdW11bGF0b3IuXG4gICAgIG86IHRoZSBvdXRwdXQgc3RyZWFtIChzZWUgaywgJWEgYW5kICV0KS5cbiAgICAgYWNjOiByZXYgbGlzdCBvZiBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzaCwgZm9ybWF0dGluZywgLi4uKS5cbiAgICAgZm10OiB0aGUgZm9ybWF0LiAqKVxubGV0IHJlYyBtYWtlX3ByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2NhbWxfY2hhciBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBtYWtlX3BhZGRpbmcgayBhY2MgcmVzdCBwYWQgKGZ1biBzdHIgLT4gc3RyKVxuICB8IENhbWxfc3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ190b19jYW1sX3N0cmluZ1xuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50IGljb252XG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDMyIGljb252XG4gIHwgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9uYXRpdmVpbnQgaWNvbnZcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfaW50NjQgaWNvbnZcbiAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgZmNvbnZcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIHN0cmluZ19vZl9ib29sXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIGZ1biBmIHggLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGZ1biBvIC0+IGYgbyB4KSkgcmVzdFxuICB8IFRoZXRhIHJlc3QgLT5cbiAgICBmdW4gZiAtPiBtYWtlX3ByaW50ZiBrIChBY2NfZGVsYXkgKGFjYywgZikpIHJlc3RcbiAgfCBDdXN0b20gKGFyaXR5LCBmLCByZXN0KSAtPlxuICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgKCkpXG4gIHwgUmVhZGVyIF8gLT5cbiAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICopXG4gICAgKCogSW5kZWVkLCBzaW5jZSBwcmludGYgYW5kIGNvLiB0YWtlIGEgZm9ybWF0NCBhcyBhcmd1bWVudCwgdGhlICdkIGFuZCAnZVxuICAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiBmbXQgYXJlIG9idmlvdXNseSBlcXVhbHMuIFRoZSBSZWFkZXIgaXMgdGhlXG4gICAgICAgb25seSBjb25zdHJ1Y3RvciB3aGljaCB0b3VjaCAnZCBhbmQgJ2UgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBmb3JtYXRcbiAgICAgICB0eXBlLCBpdCBhZGRzIGFuICgtPikgdG8gdGhlICdkIHBhcmFtZXRlcnMuIENvbnNlcXVlbnRseSwgYSBmb3JtYXQ0XG4gICAgICAgY2Fubm90IGNvbnRhaW4gYSBSZWFkZXIgbm9kZSwgZXhjZXB0IGluIHRoZSBzdWItZm9ybWF0IGFzc29jaWF0ZWQgdG9cbiAgICAgICBhbiAley4uLiV9LiBJdCdzIG5vdCBhIHByb2JsZW0gYmVjYXVzZSBtYWtlX3ByaW50ZiBkbyBub3QgY2FsbFxuICAgICAgIGl0c2VsZiByZWN1cnNpdmVseSBvbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvICV7Li4uJX0uICopXG4gICAgYXNzZXJ0IGZhbHNlXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mbHVzaCBhY2MpIHJlc3RcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX3N0cmluZ19saXRlcmFsIChhY2MsIHN0cikpIHJlc3RcbiAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfY2hhcl9saXRlcmFsIChhY2MsIGNocikpIHJlc3RcblxuICB8IEZvcm1hdF9hcmcgKF8sIHN1Yl9mbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSBzdHJpbmdfb2ZfZm10dHkgc3ViX2ZtdHR5IGluXG4gICAgKGZ1biBzdHIgLT5cbiAgICAgIGlnbm9yZSBzdHI7XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHkpKSByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+IG1ha2VfcHJpbnRmIGsgYWNjXG4gICAgICAoY29uY2F0X2ZtdCAocmVjYXN0IGZtdCBmbXR0eSkgcmVzdClcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpIC0+XG4gICAgbGV0IG5ld19hY2MgPSBBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVbXCIpIGluXG4gICAgZnVuIF8gLT4gbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAtPlxuICAgICgqIFRoaXMgY2FzZSBzaG91bGQgYmUgcmVmdXNlZCBmb3IgUHJpbnRmLiAqKVxuICAgICgqIEFjY2VwdGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAqKVxuICAgICgqIEludGVycHJldCAlbCwgJW4gYW5kICVMIGFzICV1LiAqKVxuICAgIGZ1biBuIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmb3JtYXRfaW50IFwiJXVcIiBuKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfY2hhciAoYWNjLCBjKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbWFrZV9pZ25vcmVkX3BhcmFtIGsgYWNjIGlnbiByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19saXQgKGFjYywgZm10aW5nX2xpdCkpIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl90YWcga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGxldCBrJyBrYWNjID1cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19mb3JtYXR0aW5nX2dlbiAoYWNjLCBBY2Nfb3Blbl9ib3gga2FjYykpIHJlc3QgaW5cbiAgICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdCdcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBrIGFjY1xuXG4oKiBEZWxheSB0aGUgZXJyb3IgKEludmFsaWRfYXJndW1lbnQgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpLiAqKVxuKCogR2VuZXJhdGUgZnVuY3Rpb25zIHRvIHRha2UgcmVtYWluaW5nIGFyZ3VtZW50cyAoYWZ0ZXIgdGhlIFwiJV9cIikuICopXG5hbmQgbWFrZV9pZ25vcmVkX3BhcmFtIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT4gYSA9XG5mdW4gayBhY2MgaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zdHJpbmcgXyAgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQzMiAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mbG9hdCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKF8sIGZtdHR5KSAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgZm10dHkgZm10XG4gIHwgSWdub3JlZF9yZWFkZXIgICAgICAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIF8gICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcblxuXG4oKiBTcGVjaWFsIGNhc2Ugb2YgcHJpbnRmIFwiJV8oXCIuICopXG5hbmQgbWFrZV9mcm9tX2ZtdHR5IDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgZm10dHkgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50MzJfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRmxvYXRfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBSZWFkZXJfdHkgXyAgICAgICAgICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBfICAgICAtPiBhc3NlcnQgZmFsc2VcbiAgfCBGb3JtYXRfYXJnX3R5IChfLCByZXN0KSAtPiBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICBmdW4gXyAtPiBtYWtlX2Zyb21fZm10dHkgayBhY2MgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogSW5zZXJ0IGFuIEFjY19pbnZhbGlkX2FyZyBpbiB0aGUgYWNjdW11bGF0b3IgYW5kIGNvbnRpbnVlIHRvIGdlbmVyYXRlXG4gICBjbG9zdXJlcyB0byBnZXQgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG5hbmQgbWFrZV9pbnZhbGlkX2FyZyA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGZtdCAtPlxuICBtYWtlX3ByaW50ZiBrIChBY2NfaW52YWxpZF9hcmcgKGFjYywgXCJQcmludGY6IGJhZCBjb252ZXJzaW9uICVfXCIpKSBmbXRcblxuKCogRml4IHBhZGRpbmcsIHRha2UgaXQgYXMgYW4gZXh0cmEgaW50ZWdlciBhcmd1bWVudCBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9wYWRkaW5nIDogdHlwZSB4IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHogLT4gYSkgcGFkZGluZyAtPiAoeiAtPiBzdHJpbmcpIC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCB0cmFucyAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgdHJhbnMgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3aWR0aCAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHkgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX3N0cmluZyAoYWNjLCBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyBmbXRcblxuKCogRml4IHBhZGRpbmcgYW5kIHByZWNpc2lvbiBmb3IgaW50LCBpbnQzMiwgbmF0aXZlaW50IG9yIGludDY0LiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IChpbnRfY29udiAtPiB6IC0+IHN0cmluZykgLT5cbiAgICBpbnRfY29udiAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgcHJlYyB0cmFucyBpY29udiAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICB8IE5vX3BhZGRpbmcsIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gdHJhbnMgaWNvbnYgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuXG4oKiBDb252ZXJ0IGEgZmxvYXQsIGZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gaWYgbmVlZGVkLiAqKVxuKCogVGFrZSB0aGUgZmxvYXQgYXJndW1lbnQgYW5kIG9uZSBvciB0d28gZXh0cmEgaW50ZWdlciBhcmd1bWVudHMgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfZmxvYXRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeSwgZmxvYXQgLT4gYSkgcHJlY2lzaW9uIC0+IGZsb2F0X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgZmNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgKGRlZmF1bHRfZmxvYXRfcHJlY2lzaW9uIGZjb252KSB4IGluXG4gICAgICBsZXQgc3RyJyA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgc3RyIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyJykpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChjb252ZXJ0X2Zsb2F0IGZjb252IHAgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbmFuZCBtYWtlX2N1c3RvbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgKChiLCBjKSBhY2MgLT4gZikgLT4gKGIsIGMpIGFjYyAtPlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gIChhLCB4LCB5KSBjdXN0b21fYXJpdHkgLT4geCAtPiB5ID1cbiAgZnVuIGsgYWNjIHJlc3QgYXJpdHkgZiAtPiBtYXRjaCBhcml0eSB3aXRoXG4gIHwgQ3VzdG9tX3plcm8gLT4gbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tX3N1Y2MgYXJpdHkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbWFrZV9jdXN0b20gayBhY2MgcmVzdCBhcml0eSAoZiB4KVxuXG5sZXQgY29uc3QgeCBfID0geFxuXG5sZXQgcmVjIG1ha2VfaXByaW50ZiA6IHR5cGUgYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGEgPVxuICBmdW4gayBvIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICAgIHwgQ2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBDYW1sX3N0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChMaXRfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9zdHJpbmcgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IE5hdGl2ZWludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgSW50NjQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEZsb2F0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBCb29sIChOb19wYWRkaW5nLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQm9vbCAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKEFyZ19wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IEFscGhhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgVGhldGEgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyByZXN0IGFyaXR5XG4gICAgfCBSZWFkZXIgXyAtPlxuICAgICAgICAoKiBUaGlzIGNhc2UgaXMgaW1wb3NzaWJsZSwgYnkgdHlwaW5nIG9mIGZvcm1hdHMuICBTZWUgdGhlXG4gICAgICAgICAgIG5vdGUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2FzZSBmb3IgbWFrZV9wcmludGYuICopXG4gICAgICAgIGFzc2VydCBmYWxzZVxuICAgIHwgRmx1c2ggcmVzdCAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgRm9ybWF0X3N1YnN0IChfLCBmbXR0eSwgcmVzdCkgLT5cbiAgICAgICAgZnVuIChGb3JtYXQgKGZtdCwgXykpIC0+XG4gICAgICAgICAgbWFrZV9pcHJpbnRmIGsgb1xuICAgICAgICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG4gICAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pZ25vcmVkX3BhcmFtIChmdW4gXyAtPiBrIG8pIChFbmRfb2ZfYWNjKSBpZ24gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIChmdW4ga29jIC0+IG1ha2VfaXByaW50ZiBrIGtvYyByZXN0KSBvIGZtdCdcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgICAgIGsgb1xuYW5kIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIDpcbiAgdHlwZSB4IHkgeiBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+IHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+IHggPVxuICBmdW4gayBvIGZtdCBwYWQgcHJlYyAtPiBtYXRjaCBwYWQsIHByZWMgd2l0aFxuICAgIHwgTm9fcGFkZGluZyAgICwgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IE5vX3BhZGRpbmcgICAsIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTGl0X3ByZWNpc2lvbiBfIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KSlcbiAgICB8IEFyZ19wYWRkaW5nIF8sIEFyZ19wcmVjaXNpb24gICAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpKVxuYW5kIGZuX29mX2N1c3RvbV9hcml0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT5cbiAgc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHkgPVxuICBmdW4gayBvIGZtdCAtPiBmdW5jdGlvblxuICAgIHwgQ3VzdG9tX3plcm8gLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyBmbXRcbiAgICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgICAgIGNvbnN0IChmbl9vZl9jdXN0b21fYXJpdHkgayBvIGZtdCBhcml0eSlcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29udGludWF0aW9ucyBmb3IgbWFrZV9wcmludGYgKilcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBvIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQHtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIFwiQFtcIjsgb3V0cHV0X2FjYyBvIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X3N0cmluZyBvIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgb3V0cHV0X2NoYXIgbyBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmIG9cbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IGZsdXNoIG9cbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBvIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIGJ1ZnB1dF9hY2MgYiBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgcztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX3RhZyBhY2MnKSAtPlxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQHtcIjsgYnVmcHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkBbXCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgc1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBmIGJcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gYnVmcHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IGJ1ZnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBEaWZmZXIgZnJvbSBidWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiAlYSBhbmQgJXQuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBzdHJwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IHN0cnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiAoZiAoKSlcbiAgfCBBY2NfZmx1c2ggcCAgICAgICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgYiBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIEVycm9yIG1hbmFnZW1lbnQgKilcblxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBwcmV0dHktcHJpbnRlZCBlcnJvciBtZXNzYWdlLiAqKVxubGV0IGZhaWx3aXRoX21lc3NhZ2UgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAyNTYgaW5cbiAgbGV0IGsgYWNjID0gc3RycHV0X2FjYyBidWYgYWNjOyBmYWlsd2l0aCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdHRpbmcgdG9vbHMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhbiBvcGVuIGJsb2NrIGRlc2NyaXB0aW9uIChpbmRlbnQsIGJsb2NrX3R5cGUpICopXG5sZXQgb3Blbl9ib3hfb2Zfc3RyaW5nIHN0ciA9XG4gIGlmIHN0ciA9IFwiXCIgdGhlbiAoMCwgUHBfYm94KSBlbHNlXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IGludmFsaWRfYm94ICgpID0gZmFpbHdpdGhfbWVzc2FnZSBcImludmFsaWQgYm94IGRlc2NyaXB0aW9uICVTXCIgc3RyIGluXG4gICAgbGV0IHJlYyBwYXJzZV9zcGFjZXMgaSA9XG4gICAgICBpZiBpID0gbGVuIHRoZW4gaSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcgJyB8ICdcXHQnIC0+IHBhcnNlX3NwYWNlcyAoaSArIDEpXG4gICAgICAgIHwgXyAtPiBpXG4gICAgYW5kIHBhcnNlX2x3b3JkIGkgaiA9XG4gICAgICBpZiBqID0gbGVuIHRoZW4gaiBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5bal0gd2l0aFxuICAgICAgICB8ICdhJyAuLiAneicgLT4gcGFyc2VfbHdvcmQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqXG4gICAgYW5kIHBhcnNlX2ludCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IHBhcnNlX2ludCBpIChqICsgMSlcbiAgICAgICAgfCBfIC0+IGogaW5cbiAgICBsZXQgd3N0YXJ0ID0gcGFyc2Vfc3BhY2VzIDAgaW5cbiAgICBsZXQgd2VuZCA9IHBhcnNlX2x3b3JkIHdzdGFydCB3c3RhcnQgaW5cbiAgICBsZXQgYm94X25hbWUgPSBTdHJpbmcuc3ViIHN0ciB3c3RhcnQgKHdlbmQgLSB3c3RhcnQpIGluXG4gICAgbGV0IG5zdGFydCA9IHBhcnNlX3NwYWNlcyB3ZW5kIGluXG4gICAgbGV0IG5lbmQgPSBwYXJzZV9pbnQgbnN0YXJ0IG5zdGFydCBpblxuICAgIGxldCBpbmRlbnQgPVxuICAgICAgaWYgbnN0YXJ0ID0gbmVuZCB0aGVuIDAgZWxzZVxuICAgICAgICB0cnkgaW50X29mX3N0cmluZyAoU3RyaW5nLnN1YiBzdHIgbnN0YXJ0IChuZW5kIC0gbnN0YXJ0KSlcbiAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT4gaW52YWxpZF9ib3ggKCkgaW5cbiAgICBsZXQgZXhwX2VuZCA9IHBhcnNlX3NwYWNlcyBuZW5kIGluXG4gICAgaWYgZXhwX2VuZCA8PiBsZW4gdGhlbiBpbnZhbGlkX2JveCAoKTtcbiAgICBsZXQgYm94X3R5cGUgPSBtYXRjaCBib3hfbmFtZSB3aXRoXG4gICAgICB8IFwiXCIgfCBcImJcIiAtPiBQcF9ib3hcbiAgICAgIHwgXCJoXCIgICAgICAtPiBQcF9oYm94XG4gICAgICB8IFwidlwiICAgICAgLT4gUHBfdmJveFxuICAgICAgfCBcImh2XCIgICAgIC0+IFBwX2h2Ym94XG4gICAgICB8IFwiaG92XCIgICAgLT4gUHBfaG92Ym94XG4gICAgICB8IF8gICAgICAgIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgKGluZGVudCwgYm94X3R5cGUpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUGFyc2luZyB0b29scyAqKVxuXG4oKiBDcmVhdGUgYSBwYWRkaW5nX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcgYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcGFkZGluZyB0byBkaXNqb2luIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnQgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZGRpbmdfZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcGFkZGluZ19mbXRfZWJiID1cbmZ1biBwYWQgZm10IC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAgICAgICAgIC0+IFBhZGRpbmdfZm10X0VCQiAoTm9fcGFkZGluZywgZm10KVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRkaW5nX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgZm10KVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIGZtdClcblxuKCogQ3JlYXRlIGEgcHJlY2lzaW9uX2ZtdF9lYmIgZnJvbSBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wcmVjaXNpb25fZm10X2ViYiA6IHR5cGUgeCB5IC5cbiAgICAoeCwgeSkgcHJlY2lzaW9uIC0+IChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAgIChfLCBfLCBfLCBfLCBfKSBwcmVjaXNpb25fZm10X2ViYiA9XG5mdW4gcHJlYyBmbXQgLT4gbWF0Y2ggcHJlYyB3aXRoXG4gIHwgTm9fcHJlY2lzaW9uICAgIC0+IFByZWNpc2lvbl9mbXRfRUJCIChOb19wcmVjaXNpb24sIGZtdClcbiAgfCBMaXRfcHJlY2lzaW9uIHAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKExpdF9wcmVjaXNpb24gcCwgZm10KVxuICB8IEFyZ19wcmVjaXNpb24gICAtPiBQcmVjaXNpb25fZm10X0VCQiAoQXJnX3ByZWNpc2lvbiwgZm10KVxuXG4oKiBDcmVhdGUgYSBwYWRwcmVjX2ZtdF9lYmIgZnJvbSBhIHBhZGRpbmcsIGEgcHJlY2lzaW9uIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgYW5kIHRoZSBwcmVjaXNpb24gdG8gZGlzam9pbiB0eXBlIHBhcmFtZXRlcnMgb2YgYXJndW1lbnRzXG4gICBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcGFkcHJlY19mbXRfZWJiIDogdHlwZSB4IHkgeiB0IC5cbiAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+XG4gICAgKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgIChfLCBfLCBfLCBfLCBfKSBwYWRwcmVjX2ZtdF9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdCAtPlxuICBsZXQgUHJlY2lzaW9uX2ZtdF9FQkIgKHByZWMsIGZtdCcpID0gbWFrZV9wcmVjaXNpb25fZm10X2ViYiBwcmVjIGZtdCBpblxuICBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIHByZWMsIGZtdCcpXG4gIHwgTGl0X3BhZGRpbmcgKHMsIHcpIC0+IFBhZHByZWNfZm10X0VCQiAoTGl0X3BhZGRpbmcgKHMsIHcpLCBwcmVjLCBmbXQnKVxuICB8IEFyZ19wYWRkaW5nIHMgICAgICAtPiBQYWRwcmVjX2ZtdF9FQkIgKEFyZ19wYWRkaW5nIHMsIHByZWMsIGZtdCcpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCBwYXJzaW5nICopXG5cbigqIFBhcnNlIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIGZvcm1hdCBhbmQgY3JlYXRlIGEgZm10X2ViYi4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSBpbiBjYXNlIG9mIGludmFsaWQgZm9ybWF0LiAqKVxubGV0IGZtdF9lYmJfb2Zfc3RyaW5nID9sZWdhY3lfYmVoYXZpb3Igc3RyID1cbiAgKCogUGFyYW1ldGVycyBuYW1pbmcgY29udmVudGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gbGl0X3N0YXJ0OiBzdGFydCBvZiB0aGUgbGl0ZXJhbCBzZXF1ZW5jZS4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBzdHJfaW5kOiBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGVuZF9pbmQ6IGVuZCBvZiB0aGUgY3VycmVudCAoc3ViLSlmb3JtYXQuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gcGN0X2luZDogaW5kZXggb2YgdGhlICclJyBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICopXG4gICgqICAgLSB6ZXJvOiAgaXMgdGhlICcwJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIG1pbnVzOiBpcyB0aGUgJy0nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGx1czogIGlzIHRoZSAnKycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBoYXNoOiAgaXMgdGhlICcjJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHNwYWNlOiBpcyB0aGUgJyAnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaWduOiAgIGlzIHRoZSAnXycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBwYWQ6IHBhZGRpbmcgb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHByZWM6IHByZWNpc2lvbiBvZiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3ltYjogY2hhciByZXByZXNlbnRpbmcgdGhlIGNvbnZlcnNpb24gKCdjJywgJ3MnLCAnZCcsIC4uLikuICopXG4gICgqICAgLSBjaGFyX3NldDogc2V0IG9mIGNoYXJhY3RlcnMgYXMgYml0bWFwIChzZWUgc2NhbmYgJVsuLi5dKS4gICAgKilcblxuICBsZXQgbGVnYWN5X2JlaGF2aW9yID0gbWF0Y2ggbGVnYWN5X2JlaGF2aW9yIHdpdGhcbiAgICB8IFNvbWUgZmxhZyAtPiBmbGFnXG4gICAgfCBOb25lIC0+IHRydWVcbiAgKCogIFdoZW4gdGhpcyBmbGFnIGlzIGVuYWJsZWQsIHRoZSBmb3JtYXQgcGFyc2VyIHRyaWVzIHRvIGJlaGF2ZSBhc1xuICAgICAgdGhlIDw0LjAyIGltcGxlbWVudGF0aW9ucywgaW4gcGFydGljdWxhciBpdCBpZ25vcmVzIG1vc3QgYmVuaW5lXG4gICAgICBub25zZW5zaWNhbCBmb3JtYXQuIFdoZW4gdGhlIGZsYWcgaXMgZGlzYWJsZWQsIGl0IHdpbGwgcmVqZWN0IGFueVxuICAgICAgZm9ybWF0IHRoYXQgaXMgbm90IGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uLlxuXG4gICAgICBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSBcIiUrIGRcIjogc3BlY2lmeWluZyBib3RoICcrJyAoaWYgdGhlXG4gICAgICBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoIGEgJysnIHRvIGdldCB0aGUgc2FtZSB3aWR0aCBhc1xuICAgICAgbmVnYXRpdmUgbnVtYmVycykgYW5kICcgJyAoaWYgdGhlIG51bWJlciBpcyBwb3NpdGl2ZSwgcGFkIHdpdGhcbiAgICAgIGEgc3BhY2UpIGRvZXMgbm90IG1ha2Ugc2Vuc2UsIGJ1dCB0aGUgbGVnYWN5ICg8IDQuMDIpXG4gICAgICBpbXBsZW1lbnRhdGlvbiB3YXMgaGFwcHkgdG8ganVzdCBpZ25vcmUgdGhlIHNwYWNlLlxuICAqKVxuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZS4gKilcbiAgbGV0IGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZCBtc2cgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIG1zZ1xuICBpblxuXG4gICgqIFVzZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBmb3JtYXQgKG9yIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXQpIHdhcyBlbmNvdW50ZXJlZFxuICAgICAgdW5leHBlY3RlZGx5LiAqKVxuICBsZXQgdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2UgZW5kX2luZFxuICAgICAgXCJ1bmV4cGVjdGVkIGVuZCBvZiBmb3JtYXRcIlxuICBpblxuXG4gICgqIFVzZWQgZm9yICUwYzogbm8gb3RoZXIgd2lkdGhzIGFyZSBpbXBsZW1lbnRlZCAqKVxuICBsZXQgaW52YWxpZF9ub25udWxsX2NoYXJfd2lkdGggc3RyX2luZCA9XG4gICAgaW52YWxpZF9mb3JtYXRfbWVzc2FnZSBzdHJfaW5kXG4gICAgICBcIm5vbi16ZXJvIHdpZHRocyBhcmUgdW5zdXBwb3J0ZWQgZm9yICVjIGNvbnZlcnNpb25zXCJcbiAgaW5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGFuIG9wdGlvbiBkZXBlbmRlbmN5XG4gICAgIHByb2JsZW0uICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IHN0cl9pbmQgYyBzID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAnJWMnIHdpdGhvdXQgJXNcIlxuICAgICAgc3RyIHN0cl9pbmQgYyBzXG4gIGluXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGFuIHVuZXhwZWN0ZWRcbiAgICAgY2hhcmFjdGVyLiAqKVxuICBsZXQgZXhwZWN0ZWRfY2hhcmFjdGVyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZCA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlcyBleHBlY3RlZCwgcmVhZCAlQ1wiXG4gICAgICBzdHIgc3RyX2luZCBleHBlY3RlZCByZWFkXG4gIGluXG5cbiAgKCogUGFyc2UgdGhlIHN0cmluZyBmcm9tIGJlZ19pbmQgKGluY2x1ZGVkKSB0byBlbmRfaW5kIChleGNsdWRlZCkuICopXG4gIGxldCByZWMgcGFyc2UgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gYmVnX2luZCBlbmRfaW5kIC0+IHBhcnNlX2xpdGVyYWwgYmVnX2luZCBiZWdfaW5kIGVuZF9pbmRcblxuICAoKiBSZWFkIGxpdGVyYWwgY2hhcmFjdGVycyB1cCB0byAnJScgb3IgJ0AnIHNwZWNpYWwgY2hhcmFjdGVycy4gKilcbiAgYW5kIHBhcnNlX2xpdGVyYWwgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGxpdF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIEVuZF9vZl9mb3JtYXQgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2Zvcm1hdCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgYWRkX2xpdGVyYWwgbGl0X3N0YXJ0IHN0cl9pbmQgZm10X3Jlc3RcbiAgICAgIHwgJ0AnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2VfYWZ0ZXJfYXQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8IF8gLT5cbiAgICAgICAgcGFyc2VfbGl0ZXJhbCBsaXRfc3RhcnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG5cbiAgKCogUGFyc2UgYSBmb3JtYXQgYWZ0ZXIgJyUnICopXG4gIGFuZCBwYXJzZV9mb3JtYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBlbmRfaW5kIC0+IHBhcnNlX2lnbiBwY3RfaW5kIChwY3RfaW5kICsgMSkgZW5kX2luZFxuXG4gIGFuZCBwYXJzZV9pZ24gOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ18nIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgKHN0cl9pbmQrMSkgZW5kX2luZCB0cnVlXG4gICAgICB8IF8gLT4gcGFyc2VfZmxhZ3MgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgZmFsc2VcblxuICBhbmQgcGFyc2VfZmxhZ3MgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmJcbiAgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgaWduIC0+XG4gICAgbGV0IHplcm8gPSByZWYgZmFsc2UgYW5kIG1pbnVzID0gcmVmIGZhbHNlXG4gICAgYW5kIHBsdXMgPSByZWYgZmFsc2UgYW5kIHNwYWNlID0gcmVmIGZhbHNlXG4gICAgYW5kIGhhc2ggPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgc2V0X2ZsYWcgc3RyX2luZCBmbGFnID1cbiAgICAgICgqIGluIGxlZ2FjeSBtb2RlLCBkdXBsaWNhdGUgZmxhZ3MgYXJlIGFjY2VwdGVkICopXG4gICAgICBpZiAhZmxhZyAmJiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIGR1cGxpY2F0ZSBmbGFnICVDXCJcbiAgICAgICAgICBzdHIgc3RyX2luZCBzdHIuW3N0cl9pbmRdO1xuICAgICAgZmxhZyA6PSB0cnVlO1xuICAgIGluXG4gICAgbGV0IHJlYyByZWFkX2ZsYWdzIHN0cl9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnMCcgLT4gc2V0X2ZsYWcgc3RyX2luZCB6ZXJvOyAgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICctJyAtPiBzZXRfZmxhZyBzdHJfaW5kIG1pbnVzOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJysnIC0+IHNldF9mbGFnIHN0cl9pbmQgcGx1czsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnIycgLT4gc2V0X2ZsYWcgc3RyX2luZCBoYXNoOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyAnIC0+IHNldF9mbGFnIHN0cl9pbmQgc3BhY2U7IHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmRcbiAgICAgICAgICAhemVybyAhbWludXMgIXBsdXMgIWhhc2ggIXNwYWNlIGlnblxuICAgICAgZW5kXG4gICAgaW5cbiAgICByZWFkX2ZsYWdzIHN0cl9pbmRcblxuICAoKiBUcnkgdG8gcmVhZCBhIGRpZ2l0YWwgb3IgYSAnKicgcGFkZGluZy4gKilcbiAgYW5kIHBhcnNlX3BhZGRpbmcgOiB0eXBlIGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCB6ZXJvIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYWR0eSA9IG1hdGNoIHplcm8sIG1pbnVzIHdpdGhcbiAgICAgIHwgZmFsc2UsIGZhbHNlIC0+IFJpZ2h0XG4gICAgICB8IGZhbHNlLCB0cnVlICAtPiBMZWZ0XG4gICAgICB8ICB0cnVlLCBmYWxzZSAtPiBaZXJvc1xuICAgICAgfCAgdHJ1ZSwgdHJ1ZSAgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gTGVmdFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnLScgXCIwXCIgaW5cbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgIGxldCBuZXdfaW5kLCB3aWR0aCA9IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwIGluXG4gICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgKExpdF9wYWRkaW5nIChwYWR0eSwgd2lkdGgpKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZVxuICAgICAgICBpZ24gKEFyZ19wYWRkaW5nIHBhZHR5KVxuICAgIHwgXyAtPlxuICAgICAgYmVnaW4gbWF0Y2ggcGFkdHkgd2l0aFxuICAgICAgfCBMZWZ0ICAtPlxuICAgICAgICBpZiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgICBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IChzdHJfaW5kIC0gMSkgJy0nIFwicGFkZGluZ1wiO1xuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBOb19wYWRkaW5nXG4gICAgICB8IFplcm9zIC0+XG4gICAgICAgICAoKiBhICcwJyBwYWRkaW5nIGluZGljYXRpb24gbm90IGZvbGxvd2VkIGJ5IGFueXRoaW5nIHNob3VsZFxuICAgICAgICAgICBiZSBpbnRlcnByZXRlZCBhcyBhIFJpZ2h0IHBhZGRpbmcgb2Ygd2lkdGggMC4gVGhpcyBpcyB1c2VkXG4gICAgICAgICAgIGJ5IHNjYW5uaW5nIGNvbnZlcnNpb25zICUwcyBhbmQgJTBjICopXG4gICAgICAgIHBhcnNlX2FmdGVyX3BhZGRpbmcgcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIChMaXRfcGFkZGluZyAoUmlnaHQsIDApKVxuICAgICAgfCBSaWdodCAtPlxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBOb19wYWRkaW5nXG4gICAgICBlbmRcblxuICAoKiBJcyBwcmVjaXNpb24gZGVmaW5lZD8gKilcbiAgYW5kIHBhcnNlX2FmdGVyX3BhZGRpbmcgOiB0eXBlIHggZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgXykgcGFkZGluZyAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnLicgLT5cbiAgICAgIHBhcnNlX3ByZWNpc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIHBhZFxuICAgIHwgc3ltYiAtPlxuICAgICAgcGFyc2VfY29udmVyc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZFxuICAgICAgICBOb19wcmVjaXNpb24gcGFkIHN5bWJcblxuICAoKiBSZWFkIHRoZSBkaWdpdGFsIG9yICcqJyBwcmVjaXNpb24uICopXG4gIGFuZCBwYXJzZV9wcmVjaXNpb24gOiB0eXBlIHggZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgXykgcGFkZGluZyAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbGV0IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZCA9XG4gICAgICBsZXQgbmV3X2luZCwgcHJlYyA9IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwIGluXG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCBuZXdfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gcHJlYykgaW5cbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT4gcGFyc2VfbGl0ZXJhbCBtaW51cyBzdHJfaW5kXG4gICAgfCAoJysnIHwgJy0nKSBhcyBzeW1iIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+XG4gICAgICAoKiBMZWdhY3kgbW9kZSB3b3VsZCBhY2NlcHQgYW5kIGlnbm9yZSAnKycgb3IgJy0nIGJlZm9yZSB0aGVcbiAgICAgICAgIGludGVnZXIgZGVzY3JpYmluZyB0aGUgZGVzaXJlZCBwcmVjaXNpb247IG5vdGUgdGhhdCB0aGlzXG4gICAgICAgICBjYW5ub3QgaGFwcGVuIGZvciBwYWRkaW5nIHdpZHRoLCBhcyAnKycgYW5kICctJyBhbHJlYWR5IGhhdmVcbiAgICAgICAgIGEgc2VtYW50aWNzIHRoZXJlLlxuXG4gICAgICAgICBUaGF0IHNhaWQsIHRoZSBpZGVhIChzdXBwb3J0ZWQgYnkgdGhpcyB0d2VhaykgdGhhdCB3aWR0aCBhbmRcbiAgICAgICAgIHByZWNpc2lvbiBsaXRlcmFscyBhcmUgXCJpbnRlZ2VyIGxpdGVyYWxzXCIgaW4gdGhlIE9DYW1sIHNlbnNlIGlzXG4gICAgICAgICBzdGlsbCBibGF0YW50bHkgd3JvbmcsIGFzIDEyM180NTYgb3IgMHhGRiBhcmUgcmVqZWN0ZWQuICopXG4gICAgICBwYXJzZV9saXRlcmFsIChtaW51cyB8fCBzeW1iID0gJy0nKSAoc3RyX2luZCArIDEpXG4gICAgfCAnKicgLT5cbiAgICAgIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIHBhZCBBcmdfcHJlY2lzaW9uXG4gICAgfCBfIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICAoKiBub3RlIHRoYXQgbGVnYWN5IGltcGxlbWVudGF0aW9uIGRpZCBub3QgaWdub3JlICcuJyB3aXRob3V0XG4gICAgICAgICAgIGEgbnVtYmVyIChhcyBpdCBkb2VzIGZvciBwYWRkaW5nIGluZGljYXRpb25zKSwgYnV0XG4gICAgICAgICAgIGludGVycHJldHMgaXQgYXMgJy4wJyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICAgIHBhZCAoTGl0X3ByZWNpc2lvbiAwKVxuICAgICAgZWxzZVxuICAgICAgICBpbnZhbGlkX2Zvcm1hdF93aXRob3V0IChzdHJfaW5kIC0gMSkgJy4nIFwicHJlY2lzaW9uXCJcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2FmdGVyX3ByZWNpc2lvbiA6IHR5cGUgeCB5IHogdCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+XG4gICAgICAgICh4LCB5KSBwYWRkaW5nIC0+ICh6LCB0KSBwcmVjaXNpb24gLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgcHJlYyAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbGV0IHBhcnNlX2NvbnYgKHR5cGUgdSkgKHR5cGUgdikgKHBhZHByZWMgOiAodSwgdikgcGFkZGluZykgPVxuICAgICAgcGFyc2VfY29udmVyc2lvbiBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZFxuICAgICAgICBwcmVjIHBhZHByZWMgc3RyLltzdHJfaW5kXSBpblxuICAgICgqIGluIGxlZ2FjeSBtb2RlLCBzb21lIGZvcm1hdHMgKCVzIGFuZCAlUykgYWNjZXB0IGEgd2VpcmQgbWl4IG9mXG4gICAgICAgcGFkZGluZyBhbmQgcHJlY2lzaW9uLCB3aGljaCBpcyBtZXJnZWQgYXMgYSBzaW5nbGUgcGFkZGluZ1xuICAgICAgIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgaW4gJS4xMHMgdGhlIHByZWNpc2lvbiBpcyBpbXBsaWNpdGx5XG4gICAgICAgdW5kZXJzdG9vZCBhcyBwYWRkaW5nICUxMHMsIGJ1dCB0aGUgbGVmdC1wYWRkaW5nIGNvbXBvbmVudCBtYXlcbiAgICAgICBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGEgbGVmdCBwYWRkaW5nIG9yIGEgbmVnYXRpdmUgcHJlY2lzaW9uOlxuICAgICAgICUtLjNzIGFuZCAlLi0zcyBhcmUgZXF1aXZhbGVudCB0byAlLTNzICopXG4gICAgbWF0Y2ggcGFkIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgLT4gKFxuICAgICAgbWF0Y2ggbWludXMsIHByZWMgd2l0aFxuICAgICAgICB8IF8sIE5vX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IE5vX3BhZGRpbmdcbiAgICAgICAgfCBmYWxzZSwgTGl0X3ByZWNpc2lvbiBuIC0+IHBhcnNlX2NvbnYgKExpdF9wYWRkaW5nIChSaWdodCwgbikpXG4gICAgICAgIHwgdHJ1ZSwgTGl0X3ByZWNpc2lvbiBuIC0+IHBhcnNlX2NvbnYgKExpdF9wYWRkaW5nIChMZWZ0LCBuKSlcbiAgICAgICAgfCBmYWxzZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBSaWdodClcbiAgICAgICAgfCB0cnVlLCBBcmdfcHJlY2lzaW9uIC0+IHBhcnNlX2NvbnYgKEFyZ19wYWRkaW5nIExlZnQpXG4gICAgKVxuICAgIHwgcGFkIC0+IHBhcnNlX2NvbnYgcGFkXG5cbiAgKCogQ2FzZSBhbmFseXNpcyBvbiBjb252ZXJzaW9uLiAqKVxuICBhbmQgcGFyc2VfY29udmVyc2lvbiA6IHR5cGUgeCB5IHogdCB1IHYgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gKHgsIHkpIHBhZGRpbmcgLT5cbiAgICAgICAgKHosIHQpIHByZWNpc2lvbiAtPiAodSwgdikgcGFkZGluZyAtPiBjaGFyIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgcGFkcHJlYyBzeW1iIC0+XG4gICAgKCogRmxhZ3MgdXNlZCB0byBjaGVjayBvcHRpb24gdXNhZ2VzL2NvbXBhdGliaWxpdGllcy4gKilcbiAgICBsZXQgcGx1c191c2VkICA9IHJlZiBmYWxzZSBhbmQgaGFzaF91c2VkID0gcmVmIGZhbHNlXG4gICAgYW5kIHNwYWNlX3VzZWQgPSByZWYgZmFsc2UgYW5kIGlnbl91c2VkICAgPSByZWYgZmFsc2VcbiAgICBhbmQgcGFkX3VzZWQgICA9IHJlZiBmYWxzZSBhbmQgcHJlY191c2VkICA9IHJlZiBmYWxzZSBpblxuXG4gICAgKCogQWNjZXNzIHRvIG9wdGlvbnMsIHVwZGF0ZSBmbGFncy4gKilcbiAgICBsZXQgZ2V0X3BsdXMgICAgKCkgPSBwbHVzX3VzZWQgIDo9IHRydWU7IHBsdXNcbiAgICBhbmQgZ2V0X2hhc2ggICAoKSA9IGhhc2hfdXNlZCA6PSB0cnVlOyBoYXNoXG4gICAgYW5kIGdldF9zcGFjZSAgICgpID0gc3BhY2VfdXNlZCA6PSB0cnVlOyBzcGFjZVxuICAgIGFuZCBnZXRfaWduICAgICAoKSA9IGlnbl91c2VkICAgOj0gdHJ1ZTsgaWduXG4gICAgYW5kIGdldF9wYWQgICAgICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRcbiAgICBhbmQgZ2V0X3ByZWMgICAgKCkgPSBwcmVjX3VzZWQgIDo9IHRydWU7IHByZWNcbiAgICBhbmQgZ2V0X3BhZHByZWMgKCkgPSBwYWRfdXNlZCAgIDo9IHRydWU7IHBhZHByZWMgaW5cblxuICAgIGxldCBnZXRfaW50X3BhZCAoKSA6ICh4LHkpIHBhZGRpbmcgPVxuICAgICAgKCogJTUuM2QgaXMgYWNjZXB0ZWQgYW5kIG1lYW5pbmdmdWw6IHBhZCB0byBsZW5ndGggNSB3aXRoXG4gICAgICAgICBzcGFjZXMsIGJ1dCBmaXJzdCBwYWQgd2l0aCB6ZXJvcyB1cHRvIGxlbmd0aCAzICgwLXBhZGRpbmdcbiAgICAgICAgIGlzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBcInByZWNpc2lvblwiIGZvciBpbnRlZ2VyIGZvcm1hdHMpLlxuXG4gICAgICAgICAlMDUuM2QgaXMgcmVkdW5kYW50OiBwYWQgdG8gbGVuZ3RoIDUgKndpdGggemVyb3MqLCBidXRcbiAgICAgICAgIGZpcnN0IHBhZCB3aXRoIHplcm9zLi4uIFRvIGFkZCBpbnN1bHQgdG8gdGhlIGluanVyeSwgdGhlXG4gICAgICAgICBsZWdhY3kgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgMC1wYWRkaW5nIGluZGljYXRpb24gYW5kXG4gICAgICAgICBkb2VzIHRoZSA1IHBhZGRpbmcgd2l0aCBzcGFjZXMgaW5zdGVhZC4gV2UgcmV1c2UgdGhpc1xuICAgICAgICAgaW50ZXJwcmV0YXRpb24gZm9yIGNvbXBhdGliaWxpdHksIGJ1dCBzdGF0aWNhbGx5IHJlamVjdCB0aGlzXG4gICAgICAgICBmb3JtYXQgd2hlbiB0aGUgbGVnYWN5IG1vZGUgaXMgZGlzYWJsZWQsIHRvIHByb3RlY3Qgc3RyaWN0XG4gICAgICAgICB1c2VycyBmcm9tIHRoaXMgY29ybmVyIGNhc2UuICopXG4gICAgICAgbWF0Y2ggZ2V0X3BhZCAoKSwgZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgICAgfCBwYWQsIE5vX3ByZWNpc2lvbiAtPiBwYWRcbiAgICAgICAgIHwgTm9fcGFkZGluZywgXyAgICAgLT4gTm9fcGFkZGluZ1xuICAgICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIG4pLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExpdF9wYWRkaW5nIChSaWdodCwgbilcbiAgICAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJzAnIFwicHJlY2lzaW9uXCJcbiAgICAgICAgIHwgQXJnX3BhZGRpbmcgWmVyb3MsIF8gLT5cbiAgICAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gQXJnX3BhZGRpbmcgUmlnaHRcbiAgICAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJzAnIFwicHJlY2lzaW9uXCJcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgXyBhcyBwYWQsIF8gLT4gcGFkXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZCBpblxuXG4gICAgKCogQ2hlY2sgdGhhdCBwYWR0eSA8PiBaZXJvcy4gKilcbiAgICBsZXQgY2hlY2tfbm9fMCBzeW1iICh0eXBlIGEgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA6IChhLGIpIHBhZGRpbmcgPVxuICAgICAgbWF0Y2ggcGFkIHdpdGhcbiAgICAgIHwgTm9fcGFkZGluZyAtPiBwYWRcbiAgICAgIHwgTGl0X3BhZGRpbmcgKChMZWZ0IHwgUmlnaHQpLCBfKSAtPiBwYWRcbiAgICAgIHwgQXJnX3BhZGRpbmcgKExlZnQgfCBSaWdodCkgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExpdF9wYWRkaW5nIChSaWdodCwgd2lkdGgpXG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgWmVyb3MgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gQXJnX3BhZGRpbmcgUmlnaHRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIjBcIlxuICAgIGluXG5cbiAgICAoKiBHZXQgcGFkZGluZyBhcyBhIHBhZF9vcHRpb24gKHNlZSBcIiVfXCIsIFwiJXtcIiwgXCIlKFwiIGFuZCBcIiVbXCIpLlxuICAgICAgIChubyBuZWVkIGZvciBsZWdhY3kgbW9kZSB0d2Vha2luZywgdGhvc2Ugd2VyZSByZWplY3RlZCBieSB0aGVcbiAgICAgICBsZWdhY3kgcGFyc2VyIGFzIHdlbGwpICopXG4gICAgbGV0IG9wdF9vZl9wYWQgYyAodHlwZSBhKSAodHlwZSBiKSAocGFkIDogKGEsIGIpIHBhZGRpbmcpID0gbWF0Y2ggcGFkIHdpdGhcbiAgICAgIHwgTm9fcGFkZGluZyAtPiBOb25lXG4gICAgICB8IExpdF9wYWRkaW5nIChSaWdodCwgd2lkdGgpIC0+IFNvbWUgd2lkdGhcbiAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJzAnXCJcbiAgICAgIHwgTGl0X3BhZGRpbmcgKExlZnQsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBTb21lIHdpZHRoXG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIGMgXCInLSdcIlxuICAgICAgfCBBcmdfcGFkZGluZyBfIC0+IGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJyonXCJcbiAgICBpblxuICAgIGxldCBnZXRfcGFkX29wdCBjID0gb3B0X29mX3BhZCBjIChnZXRfcGFkICgpKSBpblxuICAgIGxldCBnZXRfcGFkcHJlY19vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZHByZWMgKCkpIGluXG5cbiAgICAoKiBHZXQgcHJlY2lzaW9uIGFzIGEgcHJlY19vcHRpb24gKHNlZSBcIiVfZlwiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBnZXRfcHJlY19vcHQgKCkgPSBtYXRjaCBnZXRfcHJlYyAoKSB3aXRoXG4gICAgICB8IE5vX3ByZWNpc2lvbiAgICAgICAtPiBOb25lXG4gICAgICB8IExpdF9wcmVjaXNpb24gbmRlYyAtPiBTb21lIG5kZWNcbiAgICAgIHwgQXJnX3ByZWNpc2lvbiAgICAgIC0+IGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKidcIlxuICAgIGluXG5cbiAgICBsZXQgZm10X3Jlc3VsdCA9IG1hdGNoIHN5bWIgd2l0aFxuICAgIHwgJywnIC0+XG4gICAgICBwYXJzZSBzdHJfaW5kIGVuZF9pbmRcbiAgICB8ICdjJyAtPlxuICAgICAgbGV0IGNoYXJfZm9ybWF0IGZtdF9yZXN0ID0gKCogJWMgKilcbiAgICAgICAgaWYgZ2V0X2lnbiAoKVxuICAgICAgICB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKENoYXIgZm10X3Jlc3QpXG4gICAgICBpblxuICAgICAgbGV0IHNjYW5fZm9ybWF0IGZtdF9yZXN0ID0gKCogJTBjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX3NjYW5fbmV4dF9jaGFyLCBmbXRfcmVzdCkpXG4gICAgICAgIGVsc2UgRm10X0VCQiAoU2Nhbl9uZXh0X2NoYXIgZm10X3Jlc3QpXG4gICAgICBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGJlZ2luIG1hdGNoIGdldF9wYWRfb3B0ICdjJyB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBjaGFyX2Zvcm1hdCBmbXRfcmVzdFxuICAgICAgICB8IFNvbWUgMCAtPiBzY2FuX2Zvcm1hdCBmbXRfcmVzdFxuICAgICAgICB8IFNvbWUgX24gLT5cbiAgICAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvclxuICAgICAgICAgICB0aGVuIGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmRcbiAgICAgICAgICAgZWxzZSAoKiBsZWdhY3kgaWdub3JlcyAlYyB3aWR0aHMgKikgY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgIGVuZFxuICAgIHwgJ0MnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfY2FtbF9jaGFyLGZtdF9yZXN0KSlcbiAgICAgIGVsc2UgRm10X0VCQiAoQ2FtbF9jaGFyIGZtdF9yZXN0KVxuICAgIHwgJ3MnIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoU3RyaW5nIChwYWQnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ1MnIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2NhbWxfc3RyaW5nIChnZXRfcGFkcHJlY19vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRkaW5nX2ZtdF9FQkIgKHBhZCcsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkZGluZ19mbXRfZWJiIHBhZCBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChDYW1sX3N0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPlxuICAgICAgbGV0IGljb252ID0gY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgKGdldF9wbHVzICgpKSAoZ2V0X2hhc2ggKCkpXG4gICAgICAgIChnZXRfc3BhY2UgKCkpIHN5bWIgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ04nIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IGNvdW50ZXIgPSBUb2tlbl9jb3VudGVyIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgY291bnRlciBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdF9yZXN0KSlcbiAgICB8ICdsJyB8ICduJyB8ICdMJyB3aGVuIHN0cl9pbmQ9ZW5kX2luZCB8fCBub3QgKGlzX2ludF9iYXNlIHN0ci5bc3RyX2luZF0pIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgbGV0IGNvdW50ZXIgPSBjb3VudGVyX29mX2NoYXIgc3ltYiBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAgIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludDMyIChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoSW50MzIgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICduJyAtPlxuICAgICAgbGV0IGljb252ID1cbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIChzdHJfaW5kICsgMSkgKGdldF9wbHVzICgpKVxuICAgICAgICAgIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3RyLltzdHJfaW5kXSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfbmF0aXZlaW50IChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoTmF0aXZlaW50IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnTCcgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAgIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2ludDY0IChpY29udiwgZ2V0X3BhZF9vcHQgJ18nKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X2ludF9wYWQgKCkpIChnZXRfcHJlYyAoKSkgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoSW50NjQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdmJyB8ICdlJyB8ICdFJyB8ICdnJyB8ICdHJyB8ICdGJyB8ICdoJyB8ICdIJyAtPlxuICAgICAgbGV0IGZjb252ID1cbiAgICAgICAgY29tcHV0ZV9mbG9hdF9jb252IHBjdF9pbmQgc3RyX2luZFxuICAgICAgICAgIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKSAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9mbG9hdCAoZ2V0X3BhZF9vcHQgJ18nLCBnZXRfcHJlY19vcHQgKCkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEZsb2F0IChmY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnYicgfCAnQicgLT5cbiAgICAgIGxldCBwYWQgPSBjaGVja19ub18wIHN5bWIgKGdldF9wYWRwcmVjICgpKSBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfYm9vbCAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQm9vbCAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdhJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEFscGhhIGZtdF9yZXN0KVxuICAgIHwgJ3QnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoVGhldGEgZm10X3Jlc3QpXG4gICAgfCAncicgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9yZWFkZXIsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2UgRm10X0VCQiAoUmVhZGVyIGZtdF9yZXN0KVxuICAgIHwgJyEnIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRmx1c2ggZm10X3Jlc3QpXG4gICAgfCAoJyUnIHwgJ0AnKSBhcyBjIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsIChjLCBmbXRfcmVzdCkpXG4gICAgfCAneycgLT5cbiAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgc3RyX2luZCBlbmRfaW5kICd9JyBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3ViX2VuZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgIGxldCBzdWJfZm10dHkgPSBmbXR0eV9vZl9mbXQgc3ViX2ZtdCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9mb3JtYXRfYXJnIChnZXRfcGFkX29wdCAnXycsIHN1Yl9mbXR0eSkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChGb3JtYXRfYXJnIChnZXRfcGFkX29wdCAneycsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJygnIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnKScgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCBzdWJfZW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnXycsIHN1Yl9mbXR0eSkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChGb3JtYXRfc3Vic3QgKGdldF9wYWRfb3B0ICcoJywgc3ViX2ZtdHR5LCBmbXRfcmVzdCkpXG4gICAgfCAnWycgLT5cbiAgICAgIGxldCBuZXh0X2luZCwgY2hhcl9zZXQgPSBwYXJzZV9jaGFyX3NldCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnXycsIGNoYXJfc2V0KSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIEZtdF9FQkIgKFNjYW5fY2hhcl9zZXQgKGdldF9wYWRfb3B0ICdbJywgY2hhcl9zZXQsIGZtdF9yZXN0KSlcbiAgICB8ICctJyB8ICcrJyB8ICcjJyB8ICcgJyB8ICdfJyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgZmxhZyAlQyBpcyBvbmx5IGFsbG93ZWQgYWZ0ZXIgdGhlICclJScsIGJlZm9yZSBwYWRkaW5nIGFuZCBwcmVjaXNpb25cIlxuICAgICAgICBzdHIgcGN0X2luZCBzeW1iXG4gICAgfCBfIC0+XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIFxcXG4gICAgICAgICBpbnZhbGlkIGNvbnZlcnNpb24gXFxcIiUlJWNcXFwiXCIgc3RyIChzdHJfaW5kIC0gMSkgc3ltYlxuICAgIGluXG4gICAgKCogQ2hlY2sgZm9yIHVudXNlZCBvcHRpb25zLCBhbmQgcmVqZWN0IHRoZW0gYXMgaW5jb21wYXRpYmxlLlxuXG4gICAgICAgU3VjaCBjaGVja3MgbmVlZCB0byBiZSBkaXNhYmxlZCBpbiBsZWdhY3kgbW9kZSwgYXMgdGhlIGxlZ2FjeVxuICAgICAgIHBhcnNlciBzaWxlbnRseSBpZ25vcmVkIGluY29tcGF0aWJsZSBmbGFncy4gKilcbiAgICBpZiBub3QgbGVnYWN5X2JlaGF2aW9yIHRoZW4gYmVnaW5cbiAgICBpZiBub3QgIXBsdXNfdXNlZCAmJiBwbHVzIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCI7XG4gICAgaWYgbm90ICFoYXNoX3VzZWQgJiYgaGFzaCB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicjJ1wiO1xuICAgIGlmIG5vdCAhc3BhY2VfdXNlZCAmJiBzcGFjZSB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicgJ1wiO1xuICAgIGlmIG5vdCAhcGFkX3VzZWQgICYmIFBhZGRpbmdfRUJCIHBhZCA8PiBQYWRkaW5nX0VCQiBOb19wYWRkaW5nIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiYHBhZGRpbmcnXCI7XG4gICAgaWYgbm90ICFwcmVjX3VzZWQgJiYgUHJlY2lzaW9uX0VCQiBwcmVjIDw+IFByZWNpc2lvbl9FQkIgTm9fcHJlY2lzaW9uIHRoZW5cbiAgICAgIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAoaWYgaWduIHRoZW4gJ18nIGVsc2Ugc3ltYilcbiAgICAgICAgXCJgcHJlY2lzaW9uJ1wiO1xuICAgIGlmIGlnbiAmJiBwbHVzIHRoZW4gaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICdfJyBcIicrJ1wiO1xuICAgIGVuZDtcbiAgICAoKiB0aGlzIGxhc3QgdGVzdCBtdXN0IG5vdCBiZSBkaXNhYmxlZCBpbiBsZWdhY3kgbW9kZSxcbiAgICAgICBhcyBpZ25vcmluZyBpdCB3b3VsZCB0eXBpY2FsbHkgcmVzdWx0IGluIGEgZGlmZmVyZW50IHR5cGluZ1xuICAgICAgIHRoYW4gd2hhdCB0aGUgbGVnYWN5IHBhcnNlciB1c2VkICopXG4gICAgaWYgbm90ICFpZ25fdXNlZCAmJiBpZ24gdGhlblxuICAgICAgYmVnaW4gbWF0Y2ggc3ltYiB3aXRoXG4gICAgICAgICgqIGFyZ3VtZW50LWxlc3MgZm9ybWF0cyBjYW4gc2FmZWx5IGJlIGlnbm9yZWQgaW4gbGVnYWN5IG1vZGUgKilcbiAgICAgICAgfCAoJ0AnIHwgJyUnIHwgJyEnIHwgJywnKSB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPiAoKVxuICAgICAgICB8IF8gLT5cbiAgICAgICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIidfJ1wiXG4gICAgICBlbmQ7XG4gICAgZm10X3Jlc3VsdFxuXG4gICgqIFBhcnNlIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gKGFmdGVyICdAJykuICopXG4gIGFuZCBwYXJzZV9hZnRlcl9hdCA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoJ0AnLCBFbmRfb2ZfZm9ybWF0KSlcbiAgICBlbHNlXG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ1snIC0+XG4gICAgICAgIHBhcnNlX3RhZyBmYWxzZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV9ib3gsIGZtdF9yZXN0KSlcbiAgICAgIHwgJ3snIC0+XG4gICAgICAgIHBhcnNlX3RhZyB0cnVlIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnfScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKENsb3NlX3RhZywgZm10X3Jlc3QpKVxuICAgICAgfCAnLCcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAsXCIsIDAsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICcgJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQnJlYWsgKFwiQCBcIiwgMSwgMCksIGZtdF9yZXN0KSlcbiAgICAgIHwgJzsnIC0+XG4gICAgICAgIHBhcnNlX2dvb2RfYnJlYWsgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICc/JyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRkZsdXNoLCBmbXRfcmVzdCkpXG4gICAgICB8ICdcXG4nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChGb3JjZV9uZXdsaW5lLCBmbXRfcmVzdCkpXG4gICAgICB8ICcuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRmx1c2hfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgcGFyc2VfbWFnaWNfc2l6ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ0AnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChFc2NhcGVkX2F0LCBmbXRfcmVzdCkpXG4gICAgICB8ICclJyB3aGVuIHN0cl9pbmQgKyAxIDwgZW5kX2luZCAmJiBzdHIuW3N0cl9pbmQgKyAxXSA9ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMikgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9wZXJjZW50LCBmbXRfcmVzdCkpXG4gICAgICB8ICclJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgZm10X3Jlc3QpKVxuICAgICAgfCBjIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljIGMsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPG5hbWU+IGFmdGVyIFwiQHtcIiBvciBcIkBbXCIuICopXG4gIGFuZCBwYXJzZV90YWcgOiB0eXBlIGUgZiAuIGJvb2wgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBpc19vcGVuX3RhZyBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICB0cnlcbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICc8JyAtPlxuICAgICAgICBsZXQgaW5kID0gU3RyaW5nLmluZGV4X2Zyb20gc3RyIChzdHJfaW5kICsgMSkgJz4nIGluXG4gICAgICAgIGlmIGluZCA+PSBlbmRfaW5kIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICBsZXQgc3ViX3N0ciA9IFN0cmluZy5zdWIgc3RyIHN0cl9pbmQgKGluZCAtIHN0cl9pbmQgKyAxKSBpblxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChpbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIChpbmQgKyAxKSBpblxuICAgICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoc3ViX2ZtdCwgc3ViX3N0cikgaW5cbiAgICAgICAgbGV0IGZvcm1hdHRpbmcgPVxuICAgICAgICAgIGlmIGlzX29wZW5fdGFnIHRoZW4gT3Blbl90YWcgc3ViX2Zvcm1hdCBlbHNlIE9wZW5fYm94IHN1Yl9mb3JtYXQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcbiAgICAgIHwgXyAtPlxuICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBzdWJfZm9ybWF0ID0gRm9ybWF0IChFbmRfb2ZfZm9ybWF0LCBcIlwiKSBpblxuICAgICAgbGV0IGZvcm1hdHRpbmcgPVxuICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2dlbiAoZm9ybWF0dGluZywgZm10X3Jlc3QpKVxuXG4gICgqIFRyeSB0byByZWFkIHRoZSBvcHRpb25hbCA8d2lkdGggb2Zmc2V0PiBhZnRlciBcIkA7XCIuICopXG4gIGFuZCBwYXJzZV9nb29kX2JyZWFrIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGxldCBuZXh0X2luZCwgZm9ybWF0dGluZ19saXQgPVxuICAgICAgdHJ5XG4gICAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHx8IHN0ci5bc3RyX2luZF0gPD4gJzwnIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICBsZXQgc3RyX2luZF8xID0gcGFyc2Vfc3BhY2VzIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBtYXRjaCBzdHIuW3N0cl9pbmRfMV0gd2l0aFxuICAgICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gKFxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHdpZHRoID0gcGFyc2VfaW50ZWdlciBzdHJfaW5kXzEgZW5kX2luZCBpblxuICAgICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzNdIHdpdGhcbiAgICAgICAgICAgICAgfCAnPicgLT5cbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzMtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfMyArIDEsIEJyZWFrIChzLCB3aWR0aCwgMClcbiAgICAgICAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHN0cl9pbmRfNCwgb2Zmc2V0ID0gcGFyc2VfaW50ZWdlciBzdHJfaW5kXzMgZW5kX2luZCBpblxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzUgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF80IGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBpZiBzdHIuW3N0cl9pbmRfNV0gPD4gJz4nIHRoZW4gcmFpc2UgTm90X2ZvdW5kO1xuICAgICAgICAgICAgICAgIGxldCBzID0gU3RyaW5nLnN1YiBzdHIgKHN0cl9pbmQtMikgKHN0cl9pbmRfNS1zdHJfaW5kKzMpIGluXG4gICAgICAgICAgICAgICAgc3RyX2luZF81ICsgMSwgQnJlYWsgKHMsIHdpZHRoLCBvZmZzZXQpXG4gICAgICAgICAgICAgIHwgXyAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgKVxuICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB3aXRoIE5vdF9mb3VuZCB8IEZhaWx1cmUgXyAtPlxuICAgICAgICBzdHJfaW5kLCBCcmVhayAoXCJAO1wiLCAxLCAwKVxuICAgIGluXG4gICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBuZXh0X2luZCBlbmRfaW5kIGluXG4gICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCkpXG5cbiAgKCogUGFyc2UgdGhlIHNpemUgaW4gYSA8bj4uICopXG4gIGFuZCBwYXJzZV9tYWdpY19zaXplIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIG1hdGNoXG4gICAgICB0cnlcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+XG4gICAgICAgICAgbGV0IHN0cl9pbmRfMiwgc2l6ZSA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICBsZXQgc3RyX2luZF8zID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfMiBlbmRfaW5kIGluXG4gICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzNdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kIC0gMikgKHN0cl9pbmRfMyAtIHN0cl9pbmQgKyAzKSBpblxuICAgICAgICAgIFNvbWUgKHN0cl9pbmRfMyArIDEsIE1hZ2ljX3NpemUgKHMsIHNpemUpKVxuICAgICAgICB8IF8gLT4gTm9uZVxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgTm9uZVxuICAgIHdpdGhcbiAgICB8IFNvbWUgKG5leHRfaW5kLCBmb3JtYXR0aW5nX2xpdCkgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKGZvcm1hdHRpbmdfbGl0LCBmbXRfcmVzdCkpXG4gICAgfCBOb25lIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKFNjYW5faW5kaWMgJzwnLCBmbXRfcmVzdCkpXG5cbiAgKCogUGFyc2UgYW5kIGNvbnN0cnVjdCBhIGNoYXIgc2V0LiAqKVxuICBhbmQgcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuXG4gICAgbGV0IGNoYXJfc2V0ID0gY3JlYXRlX2NoYXJfc2V0ICgpIGluXG4gICAgbGV0IGFkZF9jaGFyIGMgPVxuICAgICAgYWRkX2luX2NoYXJfc2V0IGNoYXJfc2V0IGM7XG4gICAgaW5cbiAgICBsZXQgYWRkX3JhbmdlIGMgYycgPVxuICAgICAgZm9yIGkgPSBpbnRfb2ZfY2hhciBjIHRvIGludF9vZl9jaGFyIGMnIGRvXG4gICAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCAoY2hhcl9vZl9pbnQgaSk7XG4gICAgICBkb25lO1xuICAgIGluXG5cbiAgICBsZXQgZmFpbF9zaW5nbGVfcGVyY2VudCBzdHJfaW5kID1cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogJyUlJyBhbG9uZSBpcyBub3QgYWNjZXB0ZWQgaW4gY2hhcmFjdGVyIHNldHMsIFxcXG4gICAgICAgICB1c2UgJSUlJSBpbnN0ZWFkIGF0IHBvc2l0aW9uICVkLlwiIHN0ciBzdHJfaW5kXG4gICAgaW5cblxuICAgICgqIFBhcnNlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBjaGFyIHNldC4gKilcbiAgICBsZXQgcmVjIHBhcnNlX2NoYXJfc2V0X3N0YXJ0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbGV0IGMgPSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG5cbiAgICAoKiBQYXJzZSB0aGUgY29udGVudCBvZiBhIGNoYXIgc2V0IHVudGlsIHRoZSBmaXJzdCAnXScuICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgc3RyX2luZCBlbmRfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBhZGRfY2hhciAnLSc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMgLT5cbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogVGVzdCBmb3IgcmFuZ2UgaW4gY2hhciBzZXQuICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgYWRkX2NoYXIgYztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJy0nIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG4gICAgICB8ICgnJScgfCAnQCcpIGFzIGMnIHdoZW4gYyA9ICclJyAtPlxuICAgICAgICBhZGRfY2hhciBjJztcbiAgICAgICAgcGFyc2VfY2hhcl9zZXRfY29udGVudCAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgYycgLT5cbiAgICAgICAgaWYgYyA9ICclJyB0aGVuIGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZDtcbiAgICAgICAgKCogbm90ZSB0aGF0ICdAJyBhbG9uZSBpcyBhY2NlcHRlZCwgYXMgZG9uZSBieSB0aGUgbGVnYWN5XG4gICAgICAgICAgIGltcGxlbWVudGF0aW9uOyB0aGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpY2FsbHkgcmVxdWlyZXMgJUBcbiAgICAgICAgICAgc28gd2UgY291bGQgd2FybiBvbiB0aGF0ICopXG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGMnXG5cbiAgICAoKiBNYW5hZ2UgcmFuZ2UgaW4gY2hhciBzZXQgKGV4Y2VwdCBpZiB0aGUgJy0nIHRoZSBsYXN0IGNoYXIgYmVmb3JlICddJykgKilcbiAgICBhbmQgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfbWludXMgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnXScgLT5cbiAgICAgICAgYWRkX2NoYXIgYztcbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDFdIHdpdGhcbiAgICAgICAgICB8ICgnJScgfCAnQCcpIGFzIGMnIC0+XG4gICAgICAgICAgICBhZGRfcmFuZ2UgYyBjJztcbiAgICAgICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kXG4gICAgICAgICAgfCBfIC0+IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZFxuICAgICAgICBlbmRcbiAgICAgIHwgYycgLT5cbiAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgaW5cbiAgICBsZXQgc3RyX2luZCwgcmV2ZXJzZSA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICAgIHwgJ14nIC0+IHN0cl9pbmQgKyAxLCB0cnVlXG4gICAgICAgIHwgXyAtPiBzdHJfaW5kLCBmYWxzZSBpblxuICAgIGxldCBuZXh0X2luZCA9IHBhcnNlX2NoYXJfc2V0X3N0YXJ0IHN0cl9pbmQgZW5kX2luZCBpblxuICAgIGxldCBjaGFyX3NldCA9IGZyZWV6ZV9jaGFyX3NldCBjaGFyX3NldCBpblxuICAgIG5leHRfaW5kLCAoaWYgcmV2ZXJzZSB0aGVuIHJldl9jaGFyX3NldCBjaGFyX3NldCBlbHNlIGNoYXJfc2V0KVxuXG4gICgqIENvbnN1bWUgYWxsIG5leHQgc3BhY2VzLCByYWlzZSBhbiBGYWlsdXJlIGlmIGVuZF9pbmQgaXMgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3NwYWNlcyBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgaWYgc3RyLltzdHJfaW5kXSA9ICcgJyB0aGVuIHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgZWxzZSBzdHJfaW5kXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmUgaWYgZW5kX2luZCBpc1xuICAgICByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIGFjYyA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgYXMgYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBhY2MgKiAxMCArIChpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJzAnKSBpblxuICAgICAgaWYgbmV3X2FjYyA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBpbnRlZ2VyICVkIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGltaXQgJWRcIlxuICAgICAgICAgIHN0ciBuZXdfYWNjIFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgICAgZWxzZVxuICAgICAgICBwYXJzZV9wb3NpdGl2ZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgbmV3X2FjY1xuICAgIHwgXyAtPiBzdHJfaW5kLCBhY2NcblxuICAoKiBSZWFkIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlciBmcm9tIHRoZSBzdHJpbmcsIHJhaXNlIGEgRmFpbHVyZVxuICAgICBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9pbnRlZ2VyIHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICcwJyAuLiAnOScgLT4gcGFyc2VfcG9zaXRpdmUgc3RyX2luZCBlbmRfaW5kIDBcbiAgICB8ICctJyAtPiAoXG4gICAgICBpZiBzdHJfaW5kICsgMSA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZCArIDFdIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyAtPlxuICAgICAgICBsZXQgbmV4dF9pbmQsIG4gPSBwYXJzZV9wb3NpdGl2ZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgMCBpblxuICAgICAgICBuZXh0X2luZCwgLW5cbiAgICAgIHwgYyAtPlxuICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImRpZ2l0XCIgY1xuICAgIClcbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgKCogQWRkIGEgbGl0ZXJhbCB0byBhIGZvcm1hdCBmcm9tIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgc3ViLXNlcXVlbmNlLiAqKVxuICBhbmQgYWRkX2xpdGVyYWwgOiB0eXBlIGEgZCBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiAoYSwgXywgXywgZCwgZSwgZikgZm10IC0+XG4gICAgICAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBmbXQgLT4gbWF0Y2ggc3RyX2luZCAtIGxpdF9zdGFydCB3aXRoXG4gICAgfCAwICAgIC0+IEZtdF9FQkIgZm10XG4gICAgfCAxICAgIC0+IEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoc3RyLltsaXRfc3RhcnRdLCBmbXQpKVxuICAgIHwgc2l6ZSAtPiBGbXRfRUJCIChTdHJpbmdfbGl0ZXJhbCAoU3RyaW5nLnN1YiBzdHIgbGl0X3N0YXJ0IHNpemUsIGZtdCkpXG5cbiAgKCogU2VhcmNoIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc3ViLWZvcm1hdFxuICAgICAoaS5lLiB0aGUgY29ycmVzcG9uZGluZyBcIiV9XCIgb3IgXCIlKVwiKSAqKVxuICBhbmQgc2VhcmNoX3N1YmZvcm1hdF9lbmQgc3RyX2luZCBlbmRfaW5kIGMgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogdW5jbG9zZWQgc3ViLWZvcm1hdCwgXFxcbiAgICAgICAgIGV4cGVjdGVkIFxcXCIlJSVjXFxcIiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkXCIgc3RyIGMgZW5kX2luZDtcbiAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICB8ICclJyAtPlxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBpZiBzdHIuW3N0cl9pbmQgKyAxXSA9IGMgdGhlbiAoKiBFbmQgb2YgZm9ybWF0IGZvdW5kICopIHN0cl9pbmQgZWxzZVxuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgIHwgJ18nIC0+XG4gICAgICAgICAgKCogU2VhcmNoIGZvciBcIiVfKFwiIG9yIFwiJV97XCIuICopXG4gICAgICAgICAgaWYgc3RyX2luZCArIDIgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMl0gd2l0aFxuICAgICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnfScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCAnKCcgLT5cbiAgICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAzKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgICB8IF8gLT4gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAzKSBlbmRfaW5kIGNcbiAgICAgICAgICBlbmRcbiAgICAgICAgfCAneycgLT5cbiAgICAgICAgICAoKiAley4uLiV9IHN1Yi1mb3JtYXQgZm91bmQuICopXG4gICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDIpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgfCAnKCcgLT5cbiAgICAgICAgICAoKiAlKC4uLiUpIHN1Yi1mb3JtYXQgZm91bmQuICopXG4gICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDIpIGVuZF9pbmQgJyknIGluXG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgfCAnfScgLT5cbiAgICAgICAgICAoKiBFcnJvcjogJSguLi4lfS4gKilcbiAgICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImNoYXJhY3RlciAnKSdcIiAnfSdcbiAgICAgICAgfCAnKScgLT5cbiAgICAgICAgICAoKiBFcnJvcjogJXsuLi4lKS4gKilcbiAgICAgICAgICBleHBlY3RlZF9jaGFyYWN0ZXIgKHN0cl9pbmQgKyAxKSBcImNoYXJhY3RlciAnfSdcIiAnKSdcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kIGNcbiAgICAgICAgZW5kXG4gICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBjXG5cbiAgKCogQ2hlY2sgaWYgc3ltYiBpcyBhIHZhbGlkIGludCBjb252ZXJzaW9uIGFmdGVyIFwiJWxcIiwgXCIlblwiIG9yIFwiJUxcIiAqKVxuICBhbmQgaXNfaW50X2Jhc2Ugc3ltYiA9IG1hdGNoIHN5bWIgd2l0aFxuICAgIHwgJ2QnIHwgJ2knIHwgJ3gnIHwgJ1gnIHwgJ28nIHwgJ3UnIC0+IHRydWVcbiAgICB8IF8gLT4gZmFsc2VcblxuICAoKiBDb252ZXJ0IGEgY2hhciAobCwgbiBvciBMKSB0byBpdHMgYXNzb2NpYXRlZCBjb3VudGVyLiAqKVxuICBhbmQgY291bnRlcl9vZl9jaGFyIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdsJyAtPiBMaW5lX2NvdW50ZXIgIHwgJ24nIC0+IENoYXJfY291bnRlclxuICAgIHwgJ0wnIC0+IFRva2VuX2NvdW50ZXIgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIENvbnZlcnQgKHBsdXMsIHN5bWIpIHRvIGl0cyBhc3NvY2lhdGVkIGludF9jb252LiAqKVxuICBhbmQgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIG1hdGNoIHBsdXMsIGhhc2gsIHNwYWNlLCBzeW1iIHdpdGhcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdkJyAtPiBJbnRfZCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnaScgLT4gSW50X2lcbiAgICB8IGZhbHNlLCBmYWxzZSwgIHRydWUsICdkJyAtPiBJbnRfc2QgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnaScgLT4gSW50X3NpXG4gICAgfCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X3BkIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9waVxuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ3gnIC0+IEludF94ICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdYJyAtPiBJbnRfWFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3gnIC0+IEludF9DeCB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdYJyAtPiBJbnRfQ1hcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICdvJyAtPiBJbnRfb1xuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ28nIC0+IEludF9Db1xuICAgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ3UnIC0+IEludF91XG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnZCcgLT4gSW50X0NkXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnaScgLT4gSW50X0NpXG4gICAgfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAndScgLT4gSW50X0N1XG4gICAgfCBfLCB0cnVlLCBfLCAneCcgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0N4XG4gICAgfCBfLCB0cnVlLCBfLCAnWCcgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0NYXG4gICAgfCBfLCB0cnVlLCBfLCAnbycgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gSW50X0NvXG4gICAgfCBfLCB0cnVlLCBfLCAoJ2QnIHwgJ2knIHwgJ3UnKSAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgZmFsc2Ugc3BhY2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicjJ1wiXG4gICAgfCB0cnVlLCBfLCB0cnVlLCBfIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlblxuICAgICAgICAoKiBwbHVzIGFuZCBzcGFjZTogbGVnYWN5IGltcGxlbWVudGF0aW9uIHByZWZlcnMgcGx1cyAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggZmFsc2Ugc3ltYlxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJyAnIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCB0cnVlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIlxuICAgIHwgdHJ1ZSwgXywgZmFsc2UsIF8gICAgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBmYWxzZSBoYXNoIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInKydcIlxuICAgIHwgZmFsc2UsIF8sIGZhbHNlLCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIENvbnZlcnQgKHBsdXMsIHNwYWNlLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBmbG9hdF9jb252LiAqKVxuICBhbmQgY29tcHV0ZV9mbG9hdF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGhhc2ggc3BhY2Ugc3ltYiA9XG4gICAgbGV0IGZsYWcgPSBtYXRjaCBwbHVzLCBzcGFjZSB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19cbiAgICB8IGZhbHNlLCAgdHJ1ZSAtPiBGbG9hdF9mbGFnX3NcbiAgICB8ICB0cnVlLCBmYWxzZSAtPiBGbG9hdF9mbGFnX3BcbiAgICB8ICB0cnVlLCAgdHJ1ZSAtPlxuICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEZsb2F0X2ZsYWdfcFxuICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJyAnIFwiJysnXCIgaW5cbiAgICBsZXQga2luZCA9IG1hdGNoIGhhc2gsIHN5bWIgd2l0aFxuICAgIHwgXywgJ2YnIC0+IEZsb2F0X2ZcbiAgICB8IF8sICdlJyAtPiBGbG9hdF9lXG4gICAgfCBfLCAnRScgLT4gRmxvYXRfRVxuICAgIHwgXywgJ2cnIC0+IEZsb2F0X2dcbiAgICB8IF8sICdHJyAtPiBGbG9hdF9HXG4gICAgfCBfLCAnaCcgLT4gRmxvYXRfaFxuICAgIHwgXywgJ0gnIC0+IEZsb2F0X0hcbiAgICB8IGZhbHNlLCAnRicgLT4gRmxvYXRfRlxuICAgIHwgdHJ1ZSwgJ0YnIC0+IEZsb2F0X0NGXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZSBpblxuICAgIGZsYWcsIGtpbmRcblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UgYWJvdXQgaW5jb21wYXRpYmxlIG9wdGlvbnMuKilcbiAgYW5kIGluY29tcGF0aWJsZV9mbGFnIDogdHlwZSBhIC4gaW50IC0+IGludCAtPiBjaGFyIC0+IHN0cmluZyAtPiBhID1cbiAgICBmdW4gcGN0X2luZCBzdHJfaW5kIHN5bWIgb3B0aW9uIC0+XG4gICAgICBsZXQgc3ViZm10ID0gU3RyaW5nLnN1YiBzdHIgcGN0X2luZCAoc3RyX2luZCAtIHBjdF9pbmQpIGluXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IGF0IGNoYXJhY3RlciBudW1iZXIgJWQsIFxcXG4gICAgICAgICAlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCAnJWMnIGluIHN1Yi1mb3JtYXQgJVNcIlxuICAgICAgICBzdHIgcGN0X2luZCBvcHRpb24gc3ltYiBzdWJmbXRcblxuICBpbiBwYXJzZSAwIChTdHJpbmcubGVuZ3RoIHN0cilcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICgqIEd1YXJkZWQgc3RyaW5nIHRvIGZvcm1hdCBjb252ZXJzaW9ucyAqKVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGFjY29yZGluZyB0byBhbiBmbXR0eS4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IGZvcm1hdF9vZl9zdHJpbmdfZm10dHkgc3RyIGZtdHR5ID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCBmbXR0eSwgc3RyKVxuICB3aXRoIFR5cGVfbWlzbWF0Y2ggLT5cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImJhZCBpbnB1dDogZm9ybWF0IHR5cGUgbWlzbWF0Y2ggYmV0d2VlbiAlUyBhbmQgJVNcIlxuICAgICAgc3RyIChzdHJpbmdfb2ZfZm10dHkgZm10dHkpXG5cbigqIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgY29tcGF0aWJsZSB3aXRoIGFuIG90aGVyIGZvcm1hdC4gKilcbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiB0eXBlIG1pc21hdGNoLiAqKVxubGV0IGZvcm1hdF9vZl9zdHJpbmdfZm9ybWF0IHN0ciAoRm9ybWF0IChmbXQnLCBzdHInKSkgPVxuICBsZXQgRm10X0VCQiBmbXQgPSBmbXRfZWJiX29mX3N0cmluZyBzdHIgaW5cbiAgdHJ5IEZvcm1hdCAodHlwZV9mb3JtYXQgZm10IChmbXR0eV9vZl9mbXQgZm10JyksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCIgc3RyIHN0cidcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgWGF2aWVyIExlcm95IGFuZCBQaWVycmUgV2VpcywgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3Ncbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0XG5cbmxldCBrZnByaW50ZiBrIG8gKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZiAoZnVuIGFjYyAtPiBvdXRwdXRfYWNjIG8gYWNjOyBrIG8pIEVuZF9vZl9hY2MgZm10XG5sZXQga2JwcmludGYgayBiIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGYgKGZ1biBhY2MgLT4gYnVmcHV0X2FjYyBiIGFjYzsgayBiKSBFbmRfb2ZfYWNjIGZtdFxubGV0IGlrZnByaW50ZiBrIG9jIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9pcHJpbnRmIGsgb2MgZm10XG5sZXQgaWticHJpbnRmID0gaWtmcHJpbnRmXG5cbmxldCBmcHJpbnRmIG9jIGZtdCA9IGtmcHJpbnRmIGlnbm9yZSBvYyBmbXRcbmxldCBicHJpbnRmIGIgZm10ID0ga2JwcmludGYgaWdub3JlIGIgZm10XG5sZXQgaWZwcmludGYgb2MgZm10ID0gaWtmcHJpbnRmIGlnbm9yZSBvYyBmbXRcbmxldCBpYnByaW50ZiBiIGZtdCA9IGlrYnByaW50ZiBpZ25vcmUgYiBmbXRcbmxldCBwcmludGYgZm10ID0gZnByaW50ZiBzdGRvdXQgZm10XG5sZXQgZXByaW50ZiBmbXQgPSBmcHJpbnRmIHN0ZGVyciBmbXRcblxubGV0IGtzcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgaycgYWNjID1cbiAgICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSA2NCBpblxuICAgIHN0cnB1dF9hY2MgYnVmIGFjYztcbiAgICBrIChCdWZmZXIuY29udGVudHMgYnVmKSBpblxuICBtYWtlX3ByaW50ZiBrJyBFbmRfb2ZfYWNjIGZtdFxuXG5sZXQgc3ByaW50ZiBmbXQgPSBrc3ByaW50ZiAoZnVuIHMgLT4gcykgZm10XG5cbmxldCBrcHJpbnRmID0ga3NwcmludGZcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBrZXkgPSBzdHJpbmdcbnR5cGUgZG9jID0gc3RyaW5nXG50eXBlIHVzYWdlX21zZyA9IHN0cmluZ1xudHlwZSBhbm9uX2Z1biA9IChzdHJpbmcgLT4gdW5pdClcblxudHlwZSBzcGVjID1cbiAgfCBVbml0IG9mICh1bml0IC0+IHVuaXQpICAgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHVuaXQgYXJndW1lbnQgKilcbiAgfCBCb29sIG9mIChib29sIC0+IHVuaXQpICAgICAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGEgYm9vbCBhcmd1bWVudCAqKVxuICB8IFNldCBvZiBib29sIHJlZiAgICAgICAgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRydWUgKilcbiAgfCBDbGVhciBvZiBib29sIHJlZiAgICAgICAgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byBmYWxzZSAqKVxuICB8IFN0cmluZyBvZiAoc3RyaW5nIC0+IHVuaXQpICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBzdHJpbmcgYXJndW1lbnQgKilcbiAgfCBTZXRfc3RyaW5nIG9mIHN0cmluZyByZWYgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nIGFyZ3VtZW50ICopXG4gIHwgSW50IG9mIChpbnQgLT4gdW5pdCkgICAgICAgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhbiBpbnQgYXJndW1lbnQgKilcbiAgfCBTZXRfaW50IG9mIGludCByZWYgICAgICAgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byB0aGUgaW50IGFyZ3VtZW50ICopXG4gIHwgRmxvYXQgb2YgKGZsb2F0IC0+IHVuaXQpICAgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIGZsb2F0IGFyZ3VtZW50ICopXG4gIHwgU2V0X2Zsb2F0IG9mIGZsb2F0IHJlZiAgICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIGZsb2F0IGFyZ3VtZW50ICopXG4gIHwgVHVwbGUgb2Ygc3BlYyBsaXN0ICAgICAgICAgKCogVGFrZSBzZXZlcmFsIGFyZ3VtZW50cyBhY2NvcmRpbmcgdG8gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYyBsaXN0ICopXG4gIHwgU3ltYm9sIG9mIHN0cmluZyBsaXN0ICogKHN0cmluZyAtPiB1bml0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFRha2Ugb25lIG9mIHRoZSBzeW1ib2xzIGFzIGFyZ3VtZW50IGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHN5bWJvbC4gKilcbiAgfCBSZXN0IG9mIChzdHJpbmcgLT4gdW5pdCkgICAoKiBTdG9wIGludGVycHJldGluZyBrZXl3b3JkcyBhbmQgY2FsbCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3aXRoIGVhY2ggcmVtYWluaW5nIGFyZ3VtZW50ICopXG4gIHwgUmVzdF9hbGwgb2YgKHN0cmluZyBsaXN0IC0+IHVuaXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogU3RvcCBpbnRlcnByZXRpbmcga2V5d29yZHMgYW5kIGNhbGwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cy4gKilcbiAgfCBFeHBhbmQgb2YgKHN0cmluZyAtPiBzdHJpbmcgYXJyYXkpICgqIElmIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHRvIHByb2Nlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBvZiB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tcIi1mb29cIjsgXCJhcmdcIl0gQCByZXN0XSB3aGVyZSBcImZvb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZWdpc3RlcmVkIGFzIFtFeHBhbmQgZl0sIHRoZW4gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgW2YgXCJhcmdcIiBAIHJlc3RdIGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLiBPbmx5IGFsbG93ZWQgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY10uICopXG5cbmV4Y2VwdGlvbiBCYWQgb2Ygc3RyaW5nXG5leGNlcHRpb24gSGVscCBvZiBzdHJpbmdcblxudHlwZSBlcnJvciA9XG4gIHwgVW5rbm93biBvZiBzdHJpbmdcbiAgfCBXcm9uZyBvZiBzdHJpbmcgKiBzdHJpbmcgKiBzdHJpbmcgICgqIG9wdGlvbiwgYWN0dWFsLCBleHBlY3RlZCAqKVxuICB8IE1pc3Npbmcgb2Ygc3RyaW5nXG4gIHwgTWVzc2FnZSBvZiBzdHJpbmdcblxuZXhjZXB0aW9uIFN0b3Agb2YgZXJyb3IgKCogdXNlZCBpbnRlcm5hbGx5ICopXG5cbm9wZW4gUHJpbnRmXG5cbmxldCByZWMgYXNzb2MzIHggbCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8ICh5MSwgeTIsIF8pIDo6IF8gd2hlbiB5MSA9IHggLT4geTJcbiAgfCBfIDo6IHQgLT4gYXNzb2MzIHggdFxuXG5cbmxldCBzcGxpdCBzID1cbiAgbGV0IGkgPSBTdHJpbmcuaW5kZXggcyAnPScgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBTdHJpbmcuc3ViIHMgMCBpLCBTdHJpbmcuc3ViIHMgKGkrMSkgKGxlbi0oaSsxKSlcblxuXG5sZXQgbWFrZV9zeW1saXN0IHByZWZpeCBzZXAgc3VmZml4IGwgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBcIjxub25lPlwiXG4gIHwgaDo6dCAtPiAoTGlzdC5mb2xkX2xlZnQgKGZ1biB4IHkgLT4geCBeIHNlcCBeIHkpIChwcmVmaXggXiBoKSB0KSBeIHN1ZmZpeFxuXG5cbmxldCBwcmludF9zcGVjIGJ1ZiAoa2V5LCBzcGVjLCBkb2MpID1cbiAgaWYgU3RyaW5nLmxlbmd0aCBkb2MgPiAwIHRoZW5cbiAgICBtYXRjaCBzcGVjIHdpdGhcbiAgICB8IFN5bWJvbCAobCwgXykgLT5cbiAgICAgICAgYnByaW50ZiBidWYgXCIgICVzICVzJXNcXG5cIiBrZXkgKG1ha2Vfc3ltbGlzdCBcIntcIiBcInxcIiBcIn1cIiBsKSBkb2NcbiAgICB8IF8gLT5cbiAgICAgICAgYnByaW50ZiBidWYgXCIgICVzICVzXFxuXCIga2V5IGRvY1xuXG5cbmxldCBoZWxwX2FjdGlvbiAoKSA9IHJhaXNlIChTdG9wIChVbmtub3duIFwiLWhlbHBcIikpXG5cbmxldCBhZGRfaGVscCBzcGVjbGlzdCA9XG4gIGxldCBhZGQxID1cbiAgICB0cnkgaWdub3JlIChhc3NvYzMgXCItaGVscFwiIHNwZWNsaXN0KTsgW11cbiAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICAgICAgW1wiLWhlbHBcIiwgVW5pdCBoZWxwX2FjdGlvbiwgXCIgRGlzcGxheSB0aGlzIGxpc3Qgb2Ygb3B0aW9uc1wiXVxuICBhbmQgYWRkMiA9XG4gICAgdHJ5IGlnbm9yZSAoYXNzb2MzIFwiLS1oZWxwXCIgc3BlY2xpc3QpOyBbXVxuICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgICAgICBbXCItLWhlbHBcIiwgVW5pdCBoZWxwX2FjdGlvbiwgXCIgRGlzcGxheSB0aGlzIGxpc3Qgb2Ygb3B0aW9uc1wiXVxuICBpblxuICBzcGVjbGlzdCBAIChhZGQxIEAgYWRkMilcblxuXG5sZXQgdXNhZ2VfYiBidWYgc3BlY2xpc3QgZXJybXNnID1cbiAgYnByaW50ZiBidWYgXCIlc1xcblwiIGVycm1zZztcbiAgTGlzdC5pdGVyIChwcmludF9zcGVjIGJ1ZikgKGFkZF9oZWxwIHNwZWNsaXN0KVxuXG5cbmxldCB1c2FnZV9zdHJpbmcgc3BlY2xpc3QgZXJybXNnID1cbiAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDIwMCBpblxuICB1c2FnZV9iIGIgc3BlY2xpc3QgZXJybXNnO1xuICBCdWZmZXIuY29udGVudHMgYlxuXG5cbmxldCB1c2FnZSBzcGVjbGlzdCBlcnJtc2cgPVxuICBlcHJpbnRmIFwiJXNcIiAodXNhZ2Vfc3RyaW5nIHNwZWNsaXN0IGVycm1zZylcblxuXG5sZXQgY3VycmVudCA9IHJlZiAwXG5cbmxldCBib29sX29mX3N0cmluZ19vcHQgeCA9XG4gIHRyeSBTb21lIChib29sX29mX3N0cmluZyB4KVxuICB3aXRoIEludmFsaWRfYXJndW1lbnQgXyAtPiBOb25lXG5cbmxldCBpbnRfb2Zfc3RyaW5nX29wdCB4ID1cbiAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgeClcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5sZXQgZmxvYXRfb2Zfc3RyaW5nX29wdCB4ID1cbiAgdHJ5IFNvbWUgKGZsb2F0X29mX3N0cmluZyB4KVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbmxldCBwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY19hdXggYWxsb3dfZXhwYW5kIGN1cnJlbnQgYXJndiBzcGVjbGlzdCBhbm9uZnVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyA9XG4gIGxldCBpbml0cG9zID0gIWN1cnJlbnQgaW5cbiAgbGV0IGNvbnZlcnRfZXJyb3IgZXJyb3IgPVxuICAgICgqIGNvbnZlcnQgYW4gaW50ZXJuYWwgZXJyb3IgdG8gYSBCYWQvSGVscCBleGNlcHRpb25cbiAgICAgICAqb3IqIGFkZCB0aGUgcHJvZ3JhbSBuYW1lIGFzIGEgcHJlZml4IGFuZCB0aGUgdXNhZ2UgbWVzc2FnZSBhcyBhIHN1ZmZpeFxuICAgICAgIHRvIGFuIHVzZXItcmFpc2VkIEJhZCBleGNlcHRpb24uXG4gICAgKilcbiAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgMjAwIGluXG4gICAgbGV0IHByb2duYW1lID1cbiAgICAgIGlmIGluaXRwb3MgPCAoQXJyYXkubGVuZ3RoICFhcmd2KSB0aGVuICFhcmd2Lihpbml0cG9zKSBlbHNlIFwiKD8pXCIgaW5cbiAgICBiZWdpbiBtYXRjaCBlcnJvciB3aXRoXG4gICAgICB8IFVua25vd24gXCItaGVscFwiIC0+ICgpXG4gICAgICB8IFVua25vd24gXCItLWhlbHBcIiAtPiAoKVxuICAgICAgfCBVbmtub3duIHMgLT5cbiAgICAgICAgICBicHJpbnRmIGIgXCIlczogdW5rbm93biBvcHRpb24gJyVzJy5cXG5cIiBwcm9nbmFtZSBzXG4gICAgICB8IE1pc3NpbmcgcyAtPlxuICAgICAgICAgIGJwcmludGYgYiBcIiVzOiBvcHRpb24gJyVzJyBuZWVkcyBhbiBhcmd1bWVudC5cXG5cIiBwcm9nbmFtZSBzXG4gICAgICB8IFdyb25nIChvcHQsIGFyZywgZXhwZWN0ZWQpIC0+XG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6IHdyb25nIGFyZ3VtZW50ICclcyc7IG9wdGlvbiAnJXMnIGV4cGVjdHMgJXMuXFxuXCJcbiAgICAgICAgICAgICAgICAgIHByb2duYW1lIGFyZyBvcHQgZXhwZWN0ZWRcbiAgICAgIHwgTWVzc2FnZSBzIC0+ICgqIHVzZXIgZXJyb3IgbWVzc2FnZSAqKVxuICAgICAgICAgIGJwcmludGYgYiBcIiVzOiAlcy5cXG5cIiBwcm9nbmFtZSBzXG4gICAgZW5kO1xuICAgIHVzYWdlX2IgYiAhc3BlY2xpc3QgZXJybXNnO1xuICAgIGlmIGVycm9yID0gVW5rbm93biBcIi1oZWxwXCIgfHwgZXJyb3IgPSBVbmtub3duIFwiLS1oZWxwXCJcbiAgICB0aGVuIEhlbHAgKEJ1ZmZlci5jb250ZW50cyBiKVxuICAgIGVsc2UgQmFkIChCdWZmZXIuY29udGVudHMgYilcbiAgaW5cbiAgaW5jciBjdXJyZW50O1xuICB3aGlsZSAhY3VycmVudCA8IChBcnJheS5sZW5ndGggIWFyZ3YpIGRvXG4gICAgYmVnaW4gdHJ5XG4gICAgICBsZXQgcyA9ICFhcmd2LighY3VycmVudCkgaW5cbiAgICAgIGlmIFN0cmluZy5sZW5ndGggcyA+PSAxICYmIHMuWzBdID0gJy0nIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IGFjdGlvbiwgZm9sbG93ID1cbiAgICAgICAgICB0cnkgYXNzb2MzIHMgIXNwZWNsaXN0LCBOb25lXG4gICAgICAgICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICB0cnlcbiAgICAgICAgICAgIGxldCBrZXl3b3JkLCBhcmcgPSBzcGxpdCBzIGluXG4gICAgICAgICAgICBhc3NvYzMga2V5d29yZCAhc3BlY2xpc3QsIFNvbWUgYXJnXG4gICAgICAgICAgd2l0aCBOb3RfZm91bmQgLT4gcmFpc2UgKFN0b3AgKFVua25vd24gcykpXG4gICAgICAgIGluXG4gICAgICAgIGxldCBub19hcmcgKCkgPVxuICAgICAgICAgIG1hdGNoIGZvbGxvdyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIGFyZyAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJubyBhcmd1bWVudFwiKSkpIGluXG4gICAgICAgIGxldCBnZXRfYXJnICgpID1cbiAgICAgICAgICBtYXRjaCBmb2xsb3cgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICBpZiAhY3VycmVudCArIDEgPCAoQXJyYXkubGVuZ3RoICFhcmd2KSB0aGVuICFhcmd2LighY3VycmVudCArIDEpXG4gICAgICAgICAgICAgIGVsc2UgcmFpc2UgKFN0b3AgKE1pc3NpbmcgcykpXG4gICAgICAgICAgfCBTb21lIGFyZyAtPiBhcmdcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGNvbnN1bWVfYXJnICgpID1cbiAgICAgICAgICBtYXRjaCBmb2xsb3cgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBpbmNyIGN1cnJlbnRcbiAgICAgICAgICB8IFNvbWUgXyAtPiAoKVxuICAgICAgICBpblxuICAgICAgICBsZXQgcmVjIHRyZWF0X2FjdGlvbiA9IGZ1bmN0aW9uXG4gICAgICAgIHwgVW5pdCBmIC0+IG5vX2FyZyAoKTsgZiAoKTtcbiAgICAgICAgfCBCb29sIGYgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBib29sX29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhIGJvb2xlYW5cIikpKVxuICAgICAgICAgICAgfCBTb21lIHMgLT4gZiBzXG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBTZXQgciAtPiBub19hcmcgKCk7IHIgOj0gdHJ1ZTtcbiAgICAgICAgfCBDbGVhciByIC0+IG5vX2FyZyAoKTsgciA6PSBmYWxzZTtcbiAgICAgICAgfCBTdHJpbmcgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGYgYXJnO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU3ltYm9sIChzeW1iLCBmKSAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGlmIExpc3QubWVtIGFyZyBzeW1iIHRoZW4gYmVnaW5cbiAgICAgICAgICAgICAgZiBhcmc7XG4gICAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwib25lIG9mOiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAobWFrZV9zeW1saXN0IFwiXCIgXCIgXCIgXCJcIiBzeW1iKSkpKVxuICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgU2V0X3N0cmluZyByIC0+XG4gICAgICAgICAgICByIDo9IGdldF9hcmcgKCk7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBJbnQgZiAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYW4gaW50ZWdlclwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgeCAtPiBmIHhcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFNldF9pbnQgciAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGludF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYW4gaW50ZWdlclwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgeCAtPiByIDo9IHhcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IEZsb2F0IGYgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBmbG9hdF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYSBmbG9hdFwiKSkpXG4gICAgICAgICAgICB8IFNvbWUgeCAtPiBmIHhcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFNldF9mbG9hdCByIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggZmxvYXRfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImEgZmxvYXRcIikpKVxuICAgICAgICAgICAgfCBTb21lIHggLT4gciA6PSB4XG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBUdXBsZSBzcGVjcyAtPlxuICAgICAgICAgICAgbm9fYXJnICgpO1xuICAgICAgICAgICAgTGlzdC5pdGVyIHRyZWF0X2FjdGlvbiBzcGVjcztcbiAgICAgICAgfCBSZXN0IGYgLT5cbiAgICAgICAgICAgIG5vX2FyZyAoKTtcbiAgICAgICAgICAgIHdoaWxlICFjdXJyZW50IDwgKEFycmF5Lmxlbmd0aCAhYXJndikgLSAxIGRvXG4gICAgICAgICAgICAgIGYgIWFyZ3YuKCFjdXJyZW50ICsgMSk7XG4gICAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICAgICAgZG9uZTtcbiAgICAgICAgfCBSZXN0X2FsbCBmIC0+XG4gICAgICAgICAgICBub19hcmcgKCk7XG4gICAgICAgICAgICBsZXQgYWNjID0gcmVmIFtdIGluXG4gICAgICAgICAgICB3aGlsZSAhY3VycmVudCA8IEFycmF5Lmxlbmd0aCAhYXJndiAtIDEgZG9cbiAgICAgICAgICAgICAgYWNjIDo9ICFhcmd2LighY3VycmVudCArIDEpIDo6ICFhY2M7XG4gICAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICAgICAgZG9uZTtcbiAgICAgICAgICAgIGYgKExpc3QucmV2ICFhY2MpXG4gICAgICAgIHwgRXhwYW5kIGYgLT5cbiAgICAgICAgICAgIGlmIG5vdCBhbGxvd19leHBhbmQgdGhlblxuICAgICAgICAgICAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCBcIkFyZy5FeHBhbmQgaXMgaXMgb25seSBhbGxvd2VkIHdpdGggXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZy5wYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY1wiKTtcbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBsZXQgbmV3YXJnID0gZiBhcmcgaW5cbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICAgICAgbGV0IGJlZm9yZSA9IEFycmF5LnN1YiAhYXJndiAwICghY3VycmVudCArIDEpXG4gICAgICAgICAgICBhbmQgYWZ0ZXIgPVxuICAgICAgICAgICAgICBBcnJheS5zdWIgIWFyZ3YgKCFjdXJyZW50ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICgoQXJyYXkubGVuZ3RoICFhcmd2KSAtICFjdXJyZW50IC0gMSkgaW5cbiAgICAgICAgICAgIGFyZ3Y6PSBBcnJheS5jb25jYXQgW2JlZm9yZTtuZXdhcmc7YWZ0ZXJdO1xuICAgICAgICBpblxuICAgICAgICB0cmVhdF9hY3Rpb24gYWN0aW9uIGVuZFxuICAgICAgZWxzZSBhbm9uZnVuIHNcbiAgICB3aXRoIHwgQmFkIG0gLT4gcmFpc2UgKGNvbnZlcnRfZXJyb3IgKE1lc3NhZ2UgbSkpO1xuICAgICAgICAgfCBTdG9wIGUgLT4gcmFpc2UgKGNvbnZlcnRfZXJyb3IgZSk7XG4gICAgZW5kO1xuICAgIGluY3IgY3VycmVudFxuICBkb25lXG5cbmxldCBwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pYyBjdXJyZW50IGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1biBlcnJtc2cgPVxuICBwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY19hdXggdHJ1ZSBjdXJyZW50IGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1biBlcnJtc2dcblxubGV0IHBhcnNlX2FyZ3ZfZHluYW1pYyA/KGN1cnJlbnQ9Y3VycmVudCkgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZyA9XG4gIHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljX2F1eCBmYWxzZSBjdXJyZW50IChyZWYgYXJndikgc3BlY2xpc3QgYW5vbmZ1blxuICAgIGVycm1zZ1xuXG5cbmxldCBwYXJzZV9hcmd2ID8oY3VycmVudD1jdXJyZW50KSBhcmd2IHNwZWNsaXN0IGFub25mdW4gZXJybXNnID1cbiAgcGFyc2VfYXJndl9keW5hbWljIH5jdXJyZW50OmN1cnJlbnQgYXJndiAocmVmIHNwZWNsaXN0KSBhbm9uZnVuIGVycm1zZ1xuXG5cbmxldCBwYXJzZSBsIGYgbXNnID1cbiAgdHJ5XG4gICAgcGFyc2VfYXJndiBTeXMuYXJndiBsIGYgbXNnXG4gIHdpdGhcbiAgfCBCYWQgbXNnIC0+IGVwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAyXG4gIHwgSGVscCBtc2cgLT4gcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMFxuXG5cbmxldCBwYXJzZV9keW5hbWljIGwgZiBtc2cgPVxuICB0cnlcbiAgICBwYXJzZV9hcmd2X2R5bmFtaWMgU3lzLmFyZ3YgbCBmIG1zZ1xuICB3aXRoXG4gIHwgQmFkIG1zZyAtPiBlcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMlxuICB8IEhlbHAgbXNnIC0+IHByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDBcblxubGV0IHBhcnNlX2V4cGFuZCBsIGYgbXNnID1cbiAgdHJ5XG4gICAgbGV0IGFyZ3YgPSByZWYgU3lzLmFyZ3YgaW5cbiAgICBsZXQgc3BlYyA9IHJlZiBsIGluXG4gICAgbGV0IGN1cnJlbnQgPSByZWYgKCFjdXJyZW50KSBpblxuICAgIHBhcnNlX2FuZF9leHBhbmRfYXJndl9keW5hbWljIGN1cnJlbnQgYXJndiBzcGVjIGYgbXNnXG4gIHdpdGhcbiAgfCBCYWQgbXNnIC0+IGVwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAyXG4gIHwgSGVscCBtc2cgLT4gcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMFxuXG5cbmxldCBzZWNvbmRfd29yZCBzID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgbiA9XG4gICAgaWYgbiA+PSBsZW4gdGhlbiBsZW5cbiAgICBlbHNlIGlmIHMuW25dID0gJyAnIHRoZW4gbG9vcCAobisxKVxuICAgIGVsc2UgblxuICBpblxuICBtYXRjaCBTdHJpbmcuaW5kZXggcyAnXFx0JyB3aXRoXG4gIHwgbiAtPiBsb29wIChuKzEpXG4gIHwgZXhjZXB0aW9uIE5vdF9mb3VuZCAtPlxuICAgICAgYmVnaW4gbWF0Y2ggU3RyaW5nLmluZGV4IHMgJyAnIHdpdGhcbiAgICAgIHwgbiAtPiBsb29wIChuKzEpXG4gICAgICB8IGV4Y2VwdGlvbiBOb3RfZm91bmQgLT4gbGVuXG4gICAgICBlbmRcblxuXG5sZXQgbWF4X2FyZ19sZW4gY3VyIChrd2QsIHNwZWMsIGRvYykgPVxuICBtYXRjaCBzcGVjIHdpdGhcbiAgfCBTeW1ib2wgXyAtPiBJbnQubWF4IGN1ciAoU3RyaW5nLmxlbmd0aCBrd2QpXG4gIHwgXyAtPiBJbnQubWF4IGN1ciAoU3RyaW5nLmxlbmd0aCBrd2QgKyBzZWNvbmRfd29yZCBkb2MpXG5cblxubGV0IHJlcGxhY2VfbGVhZGluZ190YWIgcyA9XG4gIGxldCBzZWVuID0gcmVmIGZhbHNlIGluXG4gIFN0cmluZy5tYXAgKGZ1bmN0aW9uICdcXHQnIHdoZW4gbm90ICFzZWVuIC0+IHNlZW4gOj0gdHJ1ZTsgJyAnIHwgYyAtPiBjKSBzXG5cbmxldCBhZGRfcGFkZGluZyBsZW4ga3NkID1cbiAgbWF0Y2gga3NkIHdpdGhcbiAgfCAoXywgXywgXCJcIikgLT5cbiAgICAgICgqIERvIG5vdCBwYWQgdW5kb2N1bWVudGVkIG9wdGlvbnMsIHNvIHRoYXQgdGhleSBzdGlsbCBkb24ndCBzaG93IHVwIHdoZW5cbiAgICAgICAqIHJ1biB0aHJvdWdoIFt1c2FnZV0gb3IgW3BhcnNlXS4gKilcbiAgICAgIGtzZFxuICB8IChrd2QsIChTeW1ib2wgXyBhcyBzcGVjKSwgbXNnKSAtPlxuICAgICAgbGV0IGN1dGNvbCA9IHNlY29uZF93b3JkIG1zZyBpblxuICAgICAgbGV0IHNwYWNlcyA9IFN0cmluZy5tYWtlICgoSW50Lm1heCAwIChsZW4gLSBjdXRjb2wpKSArIDMpICcgJyBpblxuICAgICAgKGt3ZCwgc3BlYywgXCJcXG5cIiBeIHNwYWNlcyBeIHJlcGxhY2VfbGVhZGluZ190YWIgbXNnKVxuICB8IChrd2QsIHNwZWMsIG1zZykgLT5cbiAgICAgIGxldCBjdXRjb2wgPSBzZWNvbmRfd29yZCBtc2cgaW5cbiAgICAgIGxldCBrd2RfbGVuID0gU3RyaW5nLmxlbmd0aCBrd2QgaW5cbiAgICAgIGxldCBkaWZmID0gbGVuIC0ga3dkX2xlbiAtIGN1dGNvbCBpblxuICAgICAgaWYgZGlmZiA8PSAwIHRoZW5cbiAgICAgICAgKGt3ZCwgc3BlYywgcmVwbGFjZV9sZWFkaW5nX3RhYiBtc2cpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBzcGFjZXMgPSBTdHJpbmcubWFrZSBkaWZmICcgJyBpblxuICAgICAgICBsZXQgcHJlZml4ID0gU3RyaW5nLnN1YiAocmVwbGFjZV9sZWFkaW5nX3RhYiBtc2cpIDAgY3V0Y29sIGluXG4gICAgICAgIGxldCBzdWZmaXggPSBTdHJpbmcuc3ViIG1zZyBjdXRjb2wgKFN0cmluZy5sZW5ndGggbXNnIC0gY3V0Y29sKSBpblxuICAgICAgICAoa3dkLCBzcGVjLCBwcmVmaXggXiBzcGFjZXMgXiBzdWZmaXgpXG5cblxubGV0IGFsaWduID8obGltaXQ9bWF4X2ludCkgc3BlY2xpc3QgPVxuICBsZXQgY29tcGxldGVkID0gYWRkX2hlbHAgc3BlY2xpc3QgaW5cbiAgbGV0IGxlbiA9IExpc3QuZm9sZF9sZWZ0IG1heF9hcmdfbGVuIDAgY29tcGxldGVkIGluXG4gIGxldCBsZW4gPSBJbnQubWluIGxlbiBsaW1pdCBpblxuICBMaXN0Lm1hcCAoYWRkX3BhZGRpbmcgbGVuKSBjb21wbGV0ZWRcblxubGV0IHRyaW1fY3IgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgaWYgbGVuID4gMCAmJiBTdHJpbmcuZ2V0IHMgKGxlbiAtIDEpID0gJ1xccicgdGhlblxuICAgIFN0cmluZy5zdWIgcyAwIChsZW4gLSAxKVxuICBlbHNlXG4gICAgc1xuXG5sZXQgcmVhZF9hdXggdHJpbSBzZXAgZmlsZSA9XG4gIGxldCBpYyA9IG9wZW5faW5fYmluIGZpbGUgaW5cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgMjAwIGluXG4gIGxldCB3b3JkcyA9IHJlZiBbXSBpblxuICBsZXQgc3Rhc2ggKCkgPVxuICAgIGxldCB3b3JkID0gQnVmZmVyLmNvbnRlbnRzIGJ1ZiBpblxuICAgIGxldCB3b3JkID0gaWYgdHJpbSB0aGVuIHRyaW1fY3Igd29yZCBlbHNlIHdvcmQgaW5cbiAgICB3b3JkcyA6PSB3b3JkIDo6ICF3b3JkcztcbiAgICBCdWZmZXIuY2xlYXIgYnVmXG4gIGluXG4gIGJlZ2luXG4gICAgdHJ5IHdoaWxlIHRydWUgZG9cbiAgICAgICAgbGV0IGMgPSBpbnB1dF9jaGFyIGljIGluXG4gICAgICAgIGlmIGMgPSBzZXAgdGhlbiBzdGFzaCAoKSBlbHNlIEJ1ZmZlci5hZGRfY2hhciBidWYgY1xuICAgICAgZG9uZVxuICAgIHdpdGggRW5kX29mX2ZpbGUgLT4gKClcbiAgZW5kO1xuICBpZiBCdWZmZXIubGVuZ3RoIGJ1ZiA+IDAgdGhlbiBzdGFzaCAoKTtcbiAgY2xvc2VfaW4gaWM7XG4gIEFycmF5Lm9mX2xpc3QgKExpc3QucmV2ICF3b3JkcylcblxubGV0IHJlYWRfYXJnID0gcmVhZF9hdXggdHJ1ZSAnXFxuJ1xuXG5sZXQgcmVhZF9hcmcwID0gcmVhZF9hdXggZmFsc2UgJ1xceDAwJ1xuXG5sZXQgd3JpdGVfYXV4IHNlcCBmaWxlIGFyZ3MgPVxuICBsZXQgb2MgPSBvcGVuX291dF9iaW4gZmlsZSBpblxuICBBcnJheS5pdGVyIChmdW4gcyAtPiBmcHJpbnRmIG9jIFwiJXMlY1wiIHMgc2VwKSBhcmdzO1xuICBjbG9zZV9vdXQgb2NcblxubGV0IHdyaXRlX2FyZyA9IHdyaXRlX2F1eCAnXFxuJ1xuXG5sZXQgd3JpdGVfYXJnMCA9IHdyaXRlX2F1eCAnXFx4MDAnXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gUHJpbnRmXG5cbnR5cGUgdCA9IGV4biA9IC4uXG5cbmxldCBwcmludGVycyA9IEF0b21pYy5tYWtlIFtdXG5cbmxldCBsb2NmbXQgPSBmb3JtYXRfb2Zfc3RyaW5nIFwiRmlsZSBcXFwiJXNcXFwiLCBsaW5lICVkLCBjaGFyYWN0ZXJzICVkLSVkOiAlc1wiXG5cbmxldCBmaWVsZCB4IGkgPVxuICBsZXQgZiA9IE9iai5maWVsZCB4IGkgaW5cbiAgaWYgbm90IChPYmouaXNfYmxvY2sgZikgdGhlblxuICAgIHNwcmludGYgXCIlZFwiIChPYmoubWFnaWMgZiA6IGludCkgICAgICAgICAgICgqIGNhbiBhbHNvIGJlIGEgY2hhciAqKVxuICBlbHNlIGlmIE9iai50YWcgZiA9IE9iai5zdHJpbmdfdGFnIHRoZW5cbiAgICBzcHJpbnRmIFwiJVNcIiAoT2JqLm1hZ2ljIGYgOiBzdHJpbmcpXG4gIGVsc2UgaWYgT2JqLnRhZyBmID0gT2JqLmRvdWJsZV90YWcgdGhlblxuICAgIHN0cmluZ19vZl9mbG9hdCAoT2JqLm1hZ2ljIGYgOiBmbG9hdClcbiAgZWxzZVxuICAgIFwiX1wiXG5cbmxldCByZWMgb3RoZXJfZmllbGRzIHggaSA9XG4gIGlmIGkgPj0gT2JqLnNpemUgeCB0aGVuIFwiXCJcbiAgZWxzZSBzcHJpbnRmIFwiLCAlcyVzXCIgKGZpZWxkIHggaSkgKG90aGVyX2ZpZWxkcyB4IChpKzEpKVxuXG5sZXQgZmllbGRzIHggPVxuICBtYXRjaCBPYmouc2l6ZSB4IHdpdGhcbiAgfCAwIC0+IFwiXCJcbiAgfCAxIC0+IFwiXCJcbiAgfCAyIC0+IHNwcmludGYgXCIoJXMpXCIgKGZpZWxkIHggMSlcbiAgfCBfIC0+IHNwcmludGYgXCIoJXMlcylcIiAoZmllbGQgeCAxKSAob3RoZXJfZmllbGRzIHggMilcblxubGV0IHVzZV9wcmludGVycyB4ID1cbiAgbGV0IHJlYyBjb252ID0gZnVuY3Rpb25cbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIChtYXRjaCBoZCB4IHdpdGhcbiAgICAgICAgIHwgTm9uZSB8IGV4Y2VwdGlvbiBfIC0+IGNvbnYgdGxcbiAgICAgICAgIHwgU29tZSBzIC0+IFNvbWUgcylcbiAgICB8IFtdIC0+IE5vbmUgaW5cbiAgY29udiAoQXRvbWljLmdldCBwcmludGVycylcblxubGV0IGRlc3RydWN0X2V4dF9jb25zdHJ1Y3RvciB4ID1cbiAgaWYgT2JqLnRhZyB4IDw+IDAgdGhlblxuICAgICgoT2JqLm1hZ2ljIChPYmouZmllbGQgeCAwKSA6IHN0cmluZyksIE5vbmUpXG4gIGVsc2VcbiAgICBsZXQgY29uc3RydWN0b3IgPVxuICAgICAgKE9iai5tYWdpYyAoT2JqLmZpZWxkIChPYmouZmllbGQgeCAwKSAwKSA6IHN0cmluZykgaW5cbiAgICAoY29uc3RydWN0b3IsIFNvbWUgKGZpZWxkcyB4KSlcblxubGV0IHN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0b3IgdCA9XG4gIGxldCBjb25zdHJ1Y3RvciwgZmllbGRzX29wdCA9IGRlc3RydWN0X2V4dF9jb25zdHJ1Y3RvciB0IGluXG4gIG1hdGNoIGZpZWxkc19vcHQgd2l0aFxuICB8IE5vbmUgLT4gY29uc3RydWN0b3JcbiAgfCBTb21lIGYgLT4gY29uc3RydWN0b3IgXiBmXG5cbmxldCB0b19zdHJpbmdfZGVmYXVsdCA9IGZ1bmN0aW9uXG4gIHwgT3V0X29mX21lbW9yeSAtPiBcIk91dCBvZiBtZW1vcnlcIlxuICB8IFN0YWNrX292ZXJmbG93IC0+IFwiU3RhY2sgb3ZlcmZsb3dcIlxuICB8IE1hdGNoX2ZhaWx1cmUoZmlsZSwgbGluZSwgY2hhcikgLT5cbiAgICAgIHNwcmludGYgbG9jZm10IGZpbGUgbGluZSBjaGFyIChjaGFyKzUpIFwiUGF0dGVybiBtYXRjaGluZyBmYWlsZWRcIlxuICB8IEFzc2VydF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis2KSBcIkFzc2VydGlvbiBmYWlsZWRcIlxuICB8IFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis2KSBcIlVuZGVmaW5lZCByZWN1cnNpdmUgbW9kdWxlXCJcbiAgfCB4IC0+XG4gICAgICBzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIChPYmoucmVwciB4KVxuXG5sZXQgdG9fc3RyaW5nIGUgPVxuICBtYXRjaCB1c2VfcHJpbnRlcnMgZSB3aXRoXG4gIHwgU29tZSBzIC0+IHNcbiAgfCBOb25lIC0+IHRvX3N0cmluZ19kZWZhdWx0IGVcblxubGV0IHByaW50IGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGVwcmludGYgXCJVbmNhdWdodCBleGNlcHRpb246ICVzXFxuXCIgKHRvX3N0cmluZyB4KTtcbiAgICBmbHVzaCBzdGRlcnI7XG4gICAgcmFpc2UgeFxuXG5sZXQgY2F0Y2ggZmN0IGFyZyA9XG4gIHRyeVxuICAgIGZjdCBhcmdcbiAgd2l0aCB4IC0+XG4gICAgZmx1c2ggc3Rkb3V0O1xuICAgIGVwcmludGYgXCJVbmNhdWdodCBleGNlcHRpb246ICVzXFxuXCIgKHRvX3N0cmluZyB4KTtcbiAgICBleGl0IDJcblxudHlwZSByYXdfYmFja3RyYWNlX3Nsb3RcbnR5cGUgcmF3X2JhY2t0cmFjZV9lbnRyeSA9IHByaXZhdGUgaW50XG50eXBlIHJhd19iYWNrdHJhY2UgPSByYXdfYmFja3RyYWNlX2VudHJ5IGFycmF5XG5cbmxldCByYXdfYmFja3RyYWNlX2VudHJpZXMgYnQgPSBidFxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZTpcbiAgdW5pdCAtPiByYXdfYmFja3RyYWNlID0gXCJjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZVwiXG5cbmV4dGVybmFsIHJhaXNlX3dpdGhfYmFja3RyYWNlOiBleG4gLT4gcmF3X2JhY2t0cmFjZSAtPiAnYVxuICA9IFwiJXJhaXNlX3dpdGhfYmFja3RyYWNlXCJcblxudHlwZSBiYWNrdHJhY2Vfc2xvdCA9XG4gIHwgS25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgICAgOiBib29sO1xuICAgICAgZmlsZW5hbWUgICAgOiBzdHJpbmc7XG4gICAgICBsaW5lX251bWJlciA6IGludDtcbiAgICAgIHN0YXJ0X2NoYXIgIDogaW50O1xuICAgICAgZW5kX2NoYXIgICAgOiBpbnQ7XG4gICAgICBpc19pbmxpbmUgICA6IGJvb2w7XG4gICAgICBkZWZuYW1lICAgICA6IHN0cmluZztcbiAgICB9XG4gIHwgVW5rbm93bl9sb2NhdGlvbiBvZiB7XG4gICAgICBpc19yYWlzZSA6IGJvb2xcbiAgICB9XG5cbigqIHRvIGF2b2lkIHdhcm5pbmcgKilcbmxldCBfID0gW0tub3duX2xvY2F0aW9uIHsgaXNfcmFpc2UgPSBmYWxzZTsgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciA9IDA7IHN0YXJ0X2NoYXIgPSAwOyBlbmRfY2hhciA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2lubGluZSA9IGZhbHNlOyBkZWZuYW1lID0gXCJcIiB9O1xuICAgICAgICAgVW5rbm93bl9sb2NhdGlvbiB7IGlzX3JhaXNlID0gZmFsc2UgfV1cblxuZXh0ZXJuYWwgY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3Q6XG4gIHJhd19iYWNrdHJhY2Vfc2xvdCAtPiBiYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdFwiXG5cbmV4dGVybmFsIGNvbnZlcnRfcmF3X2JhY2t0cmFjZTpcbiAgcmF3X2JhY2t0cmFjZSAtPiBiYWNrdHJhY2Vfc2xvdCBhcnJheSA9IFwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2VcIlxuXG5sZXQgY29udmVydF9yYXdfYmFja3RyYWNlIGJ0ID1cbiAgdHJ5IFNvbWUgKGNvbnZlcnRfcmF3X2JhY2t0cmFjZSBidClcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5sZXQgZm9ybWF0X2JhY2t0cmFjZV9zbG90IHBvcyBzbG90ID1cbiAgbGV0IGluZm8gaXNfcmFpc2UgPVxuICAgIGlmIGlzX3JhaXNlIHRoZW5cbiAgICAgIGlmIHBvcyA9IDAgdGhlbiBcIlJhaXNlZCBhdFwiIGVsc2UgXCJSZS1yYWlzZWQgYXRcIlxuICAgIGVsc2VcbiAgICAgIGlmIHBvcyA9IDAgdGhlbiBcIlJhaXNlZCBieSBwcmltaXRpdmUgb3BlcmF0aW9uIGF0XCIgZWxzZSBcIkNhbGxlZCBmcm9tXCJcbiAgaW5cbiAgbWF0Y2ggc2xvdCB3aXRoXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgICBpZiBsLmlzX3JhaXNlIHRoZW5cbiAgICAgICAgKCogY29tcGlsZXItaW5zZXJ0ZWQgcmUtcmFpc2UsIHNraXBwZWQgKikgTm9uZVxuICAgICAgZWxzZVxuICAgICAgICBTb21lIChzcHJpbnRmIFwiJXMgdW5rbm93biBsb2NhdGlvblwiIChpbmZvIGZhbHNlKSlcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgICBTb21lIChzcHJpbnRmIFwiJXMgJXMgaW4gZmlsZSBcXFwiJXNcXFwiJXMsIGxpbmUgJWQsIGNoYXJhY3RlcnMgJWQtJWRcIlxuICAgICAgICAgICAgICAoaW5mbyBsLmlzX3JhaXNlKSBsLmRlZm5hbWUgbC5maWxlbmFtZVxuICAgICAgICAgICAgICAoaWYgbC5pc19pbmxpbmUgdGhlbiBcIiAoaW5saW5lZClcIiBlbHNlIFwiXCIpXG4gICAgICAgICAgICAgIGwubGluZV9udW1iZXIgbC5zdGFydF9jaGFyIGwuZW5kX2NoYXIpXG5cbmxldCBwcmludF9leGNlcHRpb25fYmFja3RyYWNlIG91dGNoYW4gYmFja3RyYWNlID1cbiAgbWF0Y2ggYmFja3RyYWNlIHdpdGhcbiAgfCBOb25lIC0+XG4gICAgICBmcHJpbnRmIG91dGNoYW5cbiAgICAgICAgXCIoUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIGNhbm5vdCBwcmludCBzdGFjayBiYWNrdHJhY2UpXFxuXCJcbiAgfCBTb21lIGEgLT5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggYSAtIDEgZG9cbiAgICAgICAgbWF0Y2ggZm9ybWF0X2JhY2t0cmFjZV9zbG90IGkgYS4oaSkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBzdHIgLT4gZnByaW50ZiBvdXRjaGFuIFwiJXNcXG5cIiBzdHJcbiAgICAgIGRvbmVcblxubGV0IHByaW50X3Jhd19iYWNrdHJhY2Ugb3V0Y2hhbiByYXdfYmFja3RyYWNlID1cbiAgcHJpbnRfZXhjZXB0aW9uX2JhY2t0cmFjZSBvdXRjaGFuIChjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSlcblxuKCogY29uZnVzaW5nbHkgbmFtZWQ6IHByaW50cyB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgcHJpbnRfYmFja3RyYWNlIG91dGNoYW4gPVxuICBwcmludF9yYXdfYmFja3RyYWNlIG91dGNoYW4gKGdldF9yYXdfYmFja3RyYWNlICgpKVxuXG5sZXQgYmFja3RyYWNlX3RvX3N0cmluZyBiYWNrdHJhY2UgPVxuICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICB8IE5vbmUgLT5cbiAgICAgXCIoUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIGNhbm5vdCBwcmludCBzdGFjayBiYWNrdHJhY2UpXFxuXCJcbiAgfCBTb21lIGEgLT5cbiAgICAgIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAxMDI0IGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGEgLSAxIGRvXG4gICAgICAgIG1hdGNoIGZvcm1hdF9iYWNrdHJhY2Vfc2xvdCBpIGEuKGkpIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgc3RyIC0+IGJwcmludGYgYiBcIiVzXFxuXCIgc3RyXG4gICAgICBkb25lO1xuICAgICAgQnVmZmVyLmNvbnRlbnRzIGJcblxubGV0IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIHJhd19iYWNrdHJhY2UgPVxuICBiYWNrdHJhY2VfdG9fc3RyaW5nIChjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSlcblxubGV0IGJhY2t0cmFjZV9zbG90X2lzX3JhaXNlID0gZnVuY3Rpb25cbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IGwuaXNfcmFpc2VcbiAgfCBVbmtub3duX2xvY2F0aW9uIGwgLT4gbC5pc19yYWlzZVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lID0gZnVuY3Rpb25cbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IGwuaXNfaW5saW5lXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IGZhbHNlXG5cbnR5cGUgbG9jYXRpb24gPSB7XG4gIGZpbGVuYW1lIDogc3RyaW5nO1xuICBsaW5lX251bWJlciA6IGludDtcbiAgc3RhcnRfY2hhciA6IGludDtcbiAgZW5kX2NoYXIgOiBpbnQ7XG59XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvbiA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfIC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+XG4gICAgU29tZSB7XG4gICAgICBmaWxlbmFtZSAgICA9IGwuZmlsZW5hbWU7XG4gICAgICBsaW5lX251bWJlciA9IGwubGluZV9udW1iZXI7XG4gICAgICBzdGFydF9jaGFyICA9IGwuc3RhcnRfY2hhcjtcbiAgICAgIGVuZF9jaGFyICAgID0gbC5lbmRfY2hhcjtcbiAgICB9XG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9kZWZuYW1lID0gZnVuY3Rpb25cbiAgfCBVbmtub3duX2xvY2F0aW9uIF9cbiAgfCBLbm93bl9sb2NhdGlvbiB7IGRlZm5hbWUgPSBcIlwiIH0gLT4gTm9uZVxuICB8IEtub3duX2xvY2F0aW9uIGwgLT4gU29tZSBsLmRlZm5hbWVcblxubGV0IGJhY2t0cmFjZV9zbG90cyByYXdfYmFja3RyYWNlID1cbiAgKCogVGhlIGRvY3VtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgU29tZSBpc1xuICAgICByZXR1cm5lZCBvbmx5IGlmIGEgcGFydCBvZiB0aGUgdHJhY2UgaXMgdXNhYmxlLiBUaGlzIGdpdmVzIHVzXG4gICAgIGEgYml0IG1vcmUgd29yayB0aGFuIGp1c3QgY29udmVydF9yYXdfYmFja3RyYWNlLCBidXQgaXQgbWFrZXMgdGhlXG4gICAgIEFQSSBtb3JlIHVzZXItZnJpZW5kbHkgLS0gb3RoZXJ3aXNlIG1vc3QgdXNlcnMgd291bGQgaGF2ZSB0b1xuICAgICByZWltcGxlbWVudCB0aGUgXCJQcm9ncmFtIG5vdCBsaW5rZWQgd2l0aCAtZywgc29ycnlcIiBsb2dpY1xuICAgICB0aGVtc2VsdmVzLiAqKVxuICBtYXRjaCBjb252ZXJ0X3Jhd19iYWNrdHJhY2UgcmF3X2JhY2t0cmFjZSB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgYmFja3RyYWNlIC0+XG4gICAgICBsZXQgdXNhYmxlX3Nsb3QgPSBmdW5jdGlvblxuICAgICAgICB8IFVua25vd25fbG9jYXRpb24gXyAtPiBmYWxzZVxuICAgICAgICB8IEtub3duX2xvY2F0aW9uIF8gLT4gdHJ1ZSBpblxuICAgICAgbGV0IHJlYyBleGlzdHNfdXNhYmxlID0gZnVuY3Rpb25cbiAgICAgICAgfCAoLTEpIC0+IGZhbHNlXG4gICAgICAgIHwgaSAtPiB1c2FibGVfc2xvdCBiYWNrdHJhY2UuKGkpIHx8IGV4aXN0c191c2FibGUgKGkgLSAxKSBpblxuICAgICAgaWYgZXhpc3RzX3VzYWJsZSAoQXJyYXkubGVuZ3RoIGJhY2t0cmFjZSAtIDEpXG4gICAgICB0aGVuIFNvbWUgYmFja3RyYWNlXG4gICAgICBlbHNlIE5vbmVcblxubGV0IGJhY2t0cmFjZV9zbG90c19vZl9yYXdfZW50cnkgZW50cnkgPVxuICBiYWNrdHJhY2Vfc2xvdHMgW3wgZW50cnkgfF1cblxubW9kdWxlIFNsb3QgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGZvcm1hdCA9IGZvcm1hdF9iYWNrdHJhY2Vfc2xvdFxuICBsZXQgaXNfcmFpc2UgPSBiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZVxuICBsZXQgaXNfaW5saW5lID0gYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lXG4gIGxldCBsb2NhdGlvbiA9IGJhY2t0cmFjZV9zbG90X2xvY2F0aW9uXG4gIGxldCBuYW1lID0gYmFja3RyYWNlX3Nsb3RfZGVmbmFtZVxuZW5kXG5cbmxldCByYXdfYmFja3RyYWNlX2xlbmd0aCBidCA9IEFycmF5Lmxlbmd0aCBidFxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9zbG90IDpcbiAgcmF3X2JhY2t0cmFjZSAtPiBpbnQgLT4gcmF3X2JhY2t0cmFjZV9zbG90ID0gXCJjYW1sX3Jhd19iYWNrdHJhY2Vfc2xvdFwiXG5cbmV4dGVybmFsIGdldF9yYXdfYmFja3RyYWNlX25leHRfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2Vfc2xvdCAtPiByYXdfYmFja3RyYWNlX3Nsb3Qgb3B0aW9uXG4gID0gXCJjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90XCJcblxuKCogY29uZnVzaW5nbHkgbmFtZWQ6XG4gICByZXR1cm5zIHRoZSAqc3RyaW5nKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnbG9iYWwgY3VycmVudCBiYWNrdHJhY2UgKilcbmxldCBnZXRfYmFja3RyYWNlICgpID0gcmF3X2JhY2t0cmFjZV90b19zdHJpbmcgKGdldF9yYXdfYmFja3RyYWNlICgpKVxuXG5leHRlcm5hbCByZWNvcmRfYmFja3RyYWNlOiBib29sIC0+IHVuaXQgPSBcImNhbWxfcmVjb3JkX2JhY2t0cmFjZVwiXG5leHRlcm5hbCBiYWNrdHJhY2Vfc3RhdHVzOiB1bml0IC0+IGJvb2wgPSBcImNhbWxfYmFja3RyYWNlX3N0YXR1c1wiXG5cbmxldCByZWMgcmVnaXN0ZXJfcHJpbnRlciBmbiA9XG4gIGxldCBvbGRfcHJpbnRlcnMgPSBBdG9taWMuZ2V0IHByaW50ZXJzIGluXG4gIGxldCBuZXdfcHJpbnRlcnMgPSBmbiA6OiBvbGRfcHJpbnRlcnMgaW5cbiAgbGV0IHN1Y2Nlc3MgPSBBdG9taWMuY29tcGFyZV9hbmRfc2V0IHByaW50ZXJzIG9sZF9wcmludGVycyBuZXdfcHJpbnRlcnMgaW5cbiAgaWYgbm90IHN1Y2Nlc3MgdGhlbiByZWdpc3Rlcl9wcmludGVyIGZuXG5cbmV4dGVybmFsIGdldF9jYWxsc3RhY2s6IGludCAtPiByYXdfYmFja3RyYWNlID0gXCJjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFja1wiXG5cbmxldCBleG5fc2xvdCB4ID1cbiAgbGV0IHggPSBPYmoucmVwciB4IGluXG4gIGlmIE9iai50YWcgeCA9IDAgdGhlbiBPYmouZmllbGQgeCAwIGVsc2UgeFxuXG5sZXQgZXhuX3Nsb3RfaWQgeCA9XG4gIGxldCBzbG90ID0gZXhuX3Nsb3QgeCBpblxuICAoT2JqLm9iaiAoT2JqLmZpZWxkIHNsb3QgMSkgOiBpbnQpXG5cbmxldCBleG5fc2xvdF9uYW1lIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDApIDogc3RyaW5nKVxuXG5leHRlcm5hbCBnZXRfZGVidWdfaW5mb19zdGF0dXMgOiB1bml0IC0+IGludCA9IFwiY2FtbF9tbF9kZWJ1Z19pbmZvX3N0YXR1c1wiXG5cbigqIERlc2NyaXB0aW9ucyBmb3IgZXJyb3JzIGluIHN0YXJ0dXAuaC4gU2VlIGFsc28gYmFja3RyYWNlLmMgKilcbmxldCBlcnJvcnMgPSBbfCBcIlwiO1xuICAoKiBGSUxFX05PVF9GT1VORCAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgbm90IGZvdW5kKVwiO1xuICAoKiBCQURfQllURUNPREUgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdClcIjtcbiAgKCogV1JPTkdfTUFHSUMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGhhcyB3cm9uZyBtYWdpYyBudW1iZXIpXCI7XG4gICgqIE5PX0ZEUyAqKVxuICBcIihDYW5ub3QgcHJpbnQgbG9jYXRpb25zOlxcbiBcXFxuICAgICAgYnl0ZWNvZGUgZXhlY3V0YWJsZSBwcm9ncmFtIGZpbGUgY2Fubm90IGJlIG9wZW5lZDtcXG4gXFxcbiAgICAgIC0tIHRvbyBtYW55IG9wZW4gZmlsZXMuIFRyeSBydW5uaW5nIHdpdGggT0NBTUxSVU5QQVJBTT1iPTIpXCJcbnxdXG5cbmxldCBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlID1cbiAgZXByaW50ZiBcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gJXNcXG5cIiAodG9fc3RyaW5nIGV4bik7XG4gIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2U7XG4gIGxldCBzdGF0dXMgPSBnZXRfZGVidWdfaW5mb19zdGF0dXMgKCkgaW5cbiAgaWYgc3RhdHVzIDwgMCB0aGVuXG4gICAgcHJlcnJfZW5kbGluZSBlcnJvcnMuKGFicyBzdGF0dXMpO1xuICBmbHVzaCBzdGRlcnJcblxubGV0IHVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyID0gcmVmIGRlZmF1bHRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXJcblxubGV0IHNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBmbiA9IHVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIDo9IGZuXG5cbmxldCBlbXB0eV9iYWNrdHJhY2UgOiByYXdfYmFja3RyYWNlID0gW3wgfF1cblxubGV0IHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKSA9XG4gIHRyeVxuICAgIGdldF9yYXdfYmFja3RyYWNlICgpXG4gIHdpdGggXyAoKiBPdXRfb2ZfbWVtb3J5PyAqKSAtPlxuICAgIGVtcHR5X2JhY2t0cmFjZVxuXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZSA9XG4gIHRyeVxuICAgICgqIEdldCB0aGUgYmFja3RyYWNlIG5vdywgaW4gY2FzZSBvbmUgb2YgdGhlIFthdF9leGl0XSBmdW5jdGlvblxuICAgICAgIGRlc3Ryb3lzIGl0LiAqKVxuICAgIGxldCByYXdfYmFja3RyYWNlID1cbiAgICAgIGlmIGRlYnVnZ2VyX2luX3VzZSAoKiBTYW1lIHRlc3QgYXMgaW4gW3J1bnRpbWUvcHJpbnRleGMuY10gKikgdGhlblxuICAgICAgICBlbXB0eV9iYWNrdHJhY2VcbiAgICAgIGVsc2VcbiAgICAgICAgdHJ5X2dldF9yYXdfYmFja3RyYWNlICgpXG4gICAgaW5cbiAgICAodHJ5IFN0ZGxpYi5kb19hdF9leGl0ICgpIHdpdGggXyAtPiAoKSk7XG4gICAgdHJ5XG4gICAgICAhdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZXhuIHJhd19iYWNrdHJhY2VcbiAgICB3aXRoIGV4bicgLT5cbiAgICAgIGxldCByYXdfYmFja3RyYWNlJyA9IHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZXByaW50ZiBcIkZhdGFsIGVycm9yOiBleGNlcHRpb24gJXNcXG5cIiAodG9fc3RyaW5nIGV4bik7XG4gICAgICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICAgICAgZXByaW50ZiBcIkZhdGFsIGVycm9yIGluIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyOiBleGNlcHRpb24gJXNcXG5cIlxuICAgICAgICAodG9fc3RyaW5nIGV4bicpO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZSc7XG4gICAgICBmbHVzaCBzdGRlcnJcbiAgd2l0aFxuICAgIHwgT3V0X29mX21lbW9yeSAtPlxuICAgICAgICBwcmVycl9lbmRsaW5lXG4gICAgICAgICAgXCJGYXRhbCBlcnJvcjogb3V0IG9mIG1lbW9yeSBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlclwiXG5cbigqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFtjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbl0gaW5cbiAgIFtydW50aW1lL3ByaW50ZXhjLmNdIHdoaWNoIGV4cGVjdHMgbm8gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcbmxldCBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICBoYW5kbGVfdW5jYXVnaHRfZXhjZXB0aW9uJyBleG4gZGVidWdnZXJfaW5fdXNlXG4gIHdpdGggXyAtPlxuICAgICgqIFRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50ICopXG4gICAgKClcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gJ2EgLT4gdW5pdFxuICA9IFwiY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZVwiXG5cbmxldCAoKSA9XG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIFwiUHJpbnRleGMuaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvblwiXG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvblxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leHRlcm5hbCBpZCA6ICdhIC0+ICdhID0gXCIlaWRlbnRpdHlcIlxubGV0IGNvbnN0IGMgXyA9IGNcbmxldCBmbGlwIGYgeCB5ID0gZiB5IHhcbmxldCBuZWdhdGUgcCB2ID0gbm90IChwIHYpXG5cbmV4Y2VwdGlvbiBGaW5hbGx5X3JhaXNlZCBvZiBleG5cblxubGV0ICgpID0gUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciBAQCBmdW5jdGlvblxufCBGaW5hbGx5X3JhaXNlZCBleG4gLT4gU29tZSAoXCJGdW4uRmluYWxseV9yYWlzZWQ6IFwiIF4gUHJpbnRleGMudG9fc3RyaW5nIGV4bilcbnwgXyAtPiBOb25lXG5cbmxldCBwcm90ZWN0IH4oZmluYWxseSA6IHVuaXQgLT4gdW5pdCkgd29yayA9XG4gIGxldCBmaW5hbGx5X25vX2V4biAoKSA9XG4gICAgdHJ5IGZpbmFsbHkgKCkgd2l0aCBlIC0+XG4gICAgICBsZXQgYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgKEZpbmFsbHlfcmFpc2VkIGUpIGJ0XG4gIGluXG4gIG1hdGNoIHdvcmsgKCkgd2l0aFxuICB8IHJlc3VsdCAtPiBmaW5hbGx5X25vX2V4biAoKSA7IHJlc3VsdFxuICB8IGV4Y2VwdGlvbiB3b3JrX2V4biAtPlxuICAgICAgbGV0IHdvcmtfYnQgPSBQcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICAgZmluYWxseV9ub19leG4gKCkgO1xuICAgICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2Ugd29ya19leG4gd29ya19idFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IFBhcmEsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICBKYWNxdWVzLUhlbnJpIEpvdXJkYW4sIHByb2pldCBHYWxsaXVtLCBJTlJJQSBQYXJpcyAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5Ni0yMDE2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgICAqKVxuKCogICAgIGV0IGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHN0YXQgPSB7XG4gIG1pbm9yX3dvcmRzIDogZmxvYXQ7XG4gIHByb21vdGVkX3dvcmRzIDogZmxvYXQ7XG4gIG1ham9yX3dvcmRzIDogZmxvYXQ7XG4gIG1pbm9yX2NvbGxlY3Rpb25zIDogaW50O1xuICBtYWpvcl9jb2xsZWN0aW9ucyA6IGludDtcbiAgaGVhcF93b3JkcyA6IGludDtcbiAgaGVhcF9jaHVua3MgOiBpbnQ7XG4gIGxpdmVfd29yZHMgOiBpbnQ7XG4gIGxpdmVfYmxvY2tzIDogaW50O1xuICBmcmVlX3dvcmRzIDogaW50O1xuICBmcmVlX2Jsb2NrcyA6IGludDtcbiAgbGFyZ2VzdF9mcmVlIDogaW50O1xuICBmcmFnbWVudHMgOiBpbnQ7XG4gIGNvbXBhY3Rpb25zIDogaW50O1xuICB0b3BfaGVhcF93b3JkcyA6IGludDtcbiAgc3RhY2tfc2l6ZSA6IGludDtcbiAgZm9yY2VkX21ham9yX2NvbGxlY3Rpb25zOiBpbnQ7XG59XG5cbnR5cGUgY29udHJvbCA9IHtcbiAgbWlub3JfaGVhcF9zaXplIDogaW50O1xuICBtYWpvcl9oZWFwX2luY3JlbWVudCA6IGludDtcbiAgc3BhY2Vfb3ZlcmhlYWQgOiBpbnQ7XG4gIHZlcmJvc2UgOiBpbnQ7XG4gIG1heF9vdmVyaGVhZCA6IGludDtcbiAgc3RhY2tfbGltaXQgOiBpbnQ7XG4gIGFsbG9jYXRpb25fcG9saWN5IDogaW50O1xuICB3aW5kb3dfc2l6ZSA6IGludDtcbiAgY3VzdG9tX21ham9yX3JhdGlvIDogaW50O1xuICBjdXN0b21fbWlub3JfcmF0aW8gOiBpbnQ7XG4gIGN1c3RvbV9taW5vcl9tYXhfc2l6ZSA6IGludDtcbn1cblxuZXh0ZXJuYWwgc3RhdCA6IHVuaXQgLT4gc3RhdCA9IFwiY2FtbF9nY19zdGF0XCJcbmV4dGVybmFsIHF1aWNrX3N0YXQgOiB1bml0IC0+IHN0YXQgPSBcImNhbWxfZ2NfcXVpY2tfc3RhdFwiXG5leHRlcm5hbCBjb3VudGVycyA6IHVuaXQgLT4gKGZsb2F0ICogZmxvYXQgKiBmbG9hdCkgPSBcImNhbWxfZ2NfY291bnRlcnNcIlxuZXh0ZXJuYWwgbWlub3Jfd29yZHMgOiB1bml0IC0+IChmbG9hdCBbQHVuYm94ZWRdKVxuICA9IFwiY2FtbF9nY19taW5vcl93b3Jkc1wiIFwiY2FtbF9nY19taW5vcl93b3Jkc191bmJveGVkXCJcbmV4dGVybmFsIGdldCA6IHVuaXQgLT4gY29udHJvbCA9IFwiY2FtbF9nY19nZXRcIlxuZXh0ZXJuYWwgc2V0IDogY29udHJvbCAtPiB1bml0ID0gXCJjYW1sX2djX3NldFwiXG5leHRlcm5hbCBtaW5vciA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19taW5vclwiXG5leHRlcm5hbCBtYWpvcl9zbGljZSA6IGludCAtPiBpbnQgPSBcImNhbWxfZ2NfbWFqb3Jfc2xpY2VcIlxuZXh0ZXJuYWwgbWFqb3IgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfbWFqb3JcIlxuZXh0ZXJuYWwgZnVsbF9tYWpvciA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9nY19mdWxsX21ham9yXCJcbmV4dGVybmFsIGNvbXBhY3QgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfY29tcGFjdGlvblwiXG5leHRlcm5hbCBnZXRfbWlub3JfZnJlZSA6IHVuaXQgLT4gaW50ID0gXCJjYW1sX2dldF9taW5vcl9mcmVlXCJcblxubGV0IGV2ZW50bG9nX3BhdXNlICgpID0gKClcbmxldCBldmVudGxvZ19yZXN1bWUgKCkgPSAoKVxuXG5vcGVuIFByaW50ZlxuXG5sZXQgcHJpbnRfc3RhdCBjID1cbiAgbGV0IHN0ID0gc3RhdCAoKSBpblxuICBmcHJpbnRmIGMgXCJtaW5vcl9jb2xsZWN0aW9uczogICAgICAlZFxcblwiIHN0Lm1pbm9yX2NvbGxlY3Rpb25zO1xuICBmcHJpbnRmIGMgXCJtYWpvcl9jb2xsZWN0aW9uczogICAgICAlZFxcblwiIHN0Lm1ham9yX2NvbGxlY3Rpb25zO1xuICBmcHJpbnRmIGMgXCJjb21wYWN0aW9uczogICAgICAgICAgICAlZFxcblwiIHN0LmNvbXBhY3Rpb25zO1xuICBmcHJpbnRmIGMgXCJmb3JjZWRfbWFqb3JfY29sbGVjdGlvbnM6ICVkXFxuXCIgc3QuZm9yY2VkX21ham9yX2NvbGxlY3Rpb25zO1xuICBmcHJpbnRmIGMgXCJcXG5cIjtcbiAgbGV0IGwxID0gU3RyaW5nLmxlbmd0aCAoc3ByaW50ZiBcIiUuMGZcIiBzdC5taW5vcl93b3JkcykgaW5cbiAgZnByaW50ZiBjIFwibWlub3Jfd29yZHM6ICAgICUqLjBmXFxuXCIgbDEgc3QubWlub3Jfd29yZHM7XG4gIGZwcmludGYgYyBcInByb21vdGVkX3dvcmRzOiAlKi4wZlxcblwiIGwxIHN0LnByb21vdGVkX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJtYWpvcl93b3JkczogICAgJSouMGZcXG5cIiBsMSBzdC5tYWpvcl93b3JkcztcbiAgZnByaW50ZiBjIFwiXFxuXCI7XG4gIGxldCBsMiA9IFN0cmluZy5sZW5ndGggKHNwcmludGYgXCIlZFwiIHN0LnRvcF9oZWFwX3dvcmRzKSBpblxuICBmcHJpbnRmIGMgXCJ0b3BfaGVhcF93b3JkczogJSpkXFxuXCIgbDIgc3QudG9wX2hlYXBfd29yZHM7XG4gIGZwcmludGYgYyBcImhlYXBfd29yZHM6ICAgICAlKmRcXG5cIiBsMiBzdC5oZWFwX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJsaXZlX3dvcmRzOiAgICAgJSpkXFxuXCIgbDIgc3QubGl2ZV93b3JkcztcbiAgZnByaW50ZiBjIFwiZnJlZV93b3JkczogICAgICUqZFxcblwiIGwyIHN0LmZyZWVfd29yZHM7XG4gIGZwcmludGYgYyBcImxhcmdlc3RfZnJlZTogICAlKmRcXG5cIiBsMiBzdC5sYXJnZXN0X2ZyZWU7XG4gIGZwcmludGYgYyBcImZyYWdtZW50czogICAgICAlKmRcXG5cIiBsMiBzdC5mcmFnbWVudHM7XG4gIGZwcmludGYgYyBcIlxcblwiO1xuICBmcHJpbnRmIGMgXCJsaXZlX2Jsb2NrczogJWRcXG5cIiBzdC5saXZlX2Jsb2NrcztcbiAgZnByaW50ZiBjIFwiZnJlZV9ibG9ja3M6ICVkXFxuXCIgc3QuZnJlZV9ibG9ja3M7XG4gIGZwcmludGYgYyBcImhlYXBfY2h1bmtzOiAlZFxcblwiIHN0LmhlYXBfY2h1bmtzXG5cblxubGV0IGFsbG9jYXRlZF9ieXRlcyAoKSA9XG4gIGxldCAobWksIHBybywgbWEpID0gY291bnRlcnMgKCkgaW5cbiAgKG1pICsuIG1hIC0uIHBybykgKi4gZmxvYXRfb2ZfaW50IChTeXMud29yZF9zaXplIC8gOClcblxuXG5leHRlcm5hbCBmaW5hbGlzZSA6ICgnYSAtPiB1bml0KSAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2ZpbmFsX3JlZ2lzdGVyXCJcbmV4dGVybmFsIGZpbmFsaXNlX2xhc3QgOiAodW5pdCAtPiB1bml0KSAtPiAnYSAtPiB1bml0ID1cbiAgXCJjYW1sX2ZpbmFsX3JlZ2lzdGVyX2NhbGxlZF93aXRob3V0X3ZhbHVlXCJcbmV4dGVybmFsIGZpbmFsaXNlX3JlbGVhc2UgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZmluYWxfcmVsZWFzZVwiXG5cblxudHlwZSBhbGFybSA9IGJvb2wgQXRvbWljLnRcbnR5cGUgYWxhcm1fcmVjID0ge2FjdGl2ZSA6IGFsYXJtOyBmIDogdW5pdCAtPiB1bml0fVxuXG5sZXQgcmVjIGNhbGxfYWxhcm0gYXJlYyA9XG4gIGlmIEF0b21pYy5nZXQgYXJlYy5hY3RpdmUgdGhlbiBiZWdpblxuICAgIGZpbmFsaXNlIGNhbGxfYWxhcm0gYXJlYztcbiAgICBhcmVjLmYgKCk7XG4gIGVuZFxuXG5cbmxldCBjcmVhdGVfYWxhcm0gZiA9XG4gIGxldCBhcmVjID0geyBhY3RpdmUgPSBBdG9taWMubWFrZSB0cnVlOyBmID0gZiB9IGluXG4gIGZpbmFsaXNlIGNhbGxfYWxhcm0gYXJlYztcbiAgYXJlYy5hY3RpdmVcblxuXG5sZXQgZGVsZXRlX2FsYXJtIGEgPSBBdG9taWMuc2V0IGEgZmFsc2VcblxubW9kdWxlIE1lbXByb2YgPVxuICBzdHJ1Y3RcbiAgICB0eXBlIGFsbG9jYXRpb25fc291cmNlID0gTm9ybWFsIHwgTWFyc2hhbCB8IEN1c3RvbVxuICAgIHR5cGUgYWxsb2NhdGlvbiA9XG4gICAgICB7IG5fc2FtcGxlcyA6IGludDtcbiAgICAgICAgc2l6ZSA6IGludDtcbiAgICAgICAgc291cmNlIDogYWxsb2NhdGlvbl9zb3VyY2U7XG4gICAgICAgIGNhbGxzdGFjayA6IFByaW50ZXhjLnJhd19iYWNrdHJhY2UgfVxuXG4gICAgdHlwZSAoJ21pbm9yLCAnbWFqb3IpIHRyYWNrZXIgPSB7XG4gICAgICBhbGxvY19taW5vcjogYWxsb2NhdGlvbiAtPiAnbWlub3Igb3B0aW9uO1xuICAgICAgYWxsb2NfbWFqb3I6IGFsbG9jYXRpb24gLT4gJ21ham9yIG9wdGlvbjtcbiAgICAgIHByb21vdGU6ICdtaW5vciAtPiAnbWFqb3Igb3B0aW9uO1xuICAgICAgZGVhbGxvY19taW5vcjogJ21pbm9yIC0+IHVuaXQ7XG4gICAgICBkZWFsbG9jX21ham9yOiAnbWFqb3IgLT4gdW5pdDtcbiAgICB9XG5cbiAgICBsZXQgbnVsbF90cmFja2VyID0ge1xuICAgICAgYWxsb2NfbWlub3IgPSAoZnVuIF8gLT4gTm9uZSk7XG4gICAgICBhbGxvY19tYWpvciA9IChmdW4gXyAtPiBOb25lKTtcbiAgICAgIHByb21vdGUgPSAoZnVuIF8gLT4gTm9uZSk7XG4gICAgICBkZWFsbG9jX21pbm9yID0gKGZ1biBfIC0+ICgpKTtcbiAgICAgIGRlYWxsb2NfbWFqb3IgPSAoZnVuIF8gLT4gKCkpO1xuICAgIH1cblxuICAgIGV4dGVybmFsIGNfc3RhcnQgOlxuICAgICAgZmxvYXQgLT4gaW50IC0+ICgnbWlub3IsICdtYWpvcikgdHJhY2tlciAtPiB1bml0XG4gICAgICA9IFwiY2FtbF9tZW1wcm9mX3N0YXJ0XCJcblxuICAgIGxldCBzdGFydFxuICAgICAgfnNhbXBsaW5nX3JhdGVcbiAgICAgID8oY2FsbHN0YWNrX3NpemUgPSBtYXhfaW50KVxuICAgICAgdHJhY2tlciA9XG4gICAgICBjX3N0YXJ0IHNhbXBsaW5nX3JhdGUgY2FsbHN0YWNrX3NpemUgdHJhY2tlclxuXG4gICAgZXh0ZXJuYWwgc3RvcCA6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9tZW1wcm9mX3N0b3BcIlxuICBlbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTWVzc2FnZSBkaWdlc3QgKE1ENSkgKilcblxudHlwZSB0ID0gc3RyaW5nXG5cbmxldCBjb21wYXJlID0gU3RyaW5nLmNvbXBhcmVcbmxldCBlcXVhbCA9IFN0cmluZy5lcXVhbFxuXG5leHRlcm5hbCB1bnNhZmVfc3RyaW5nOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX21kNV9zdHJpbmdcIlxuZXh0ZXJuYWwgY2hhbm5lbDogaW5fY2hhbm5lbCAtPiBpbnQgLT4gdCA9IFwiY2FtbF9tZDVfY2hhblwiXG5cbmxldCBzdHJpbmcgc3RyID1cbiAgdW5zYWZlX3N0cmluZyBzdHIgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbmxldCBieXRlcyBiID0gc3RyaW5nIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGIpXG5cbmxldCBzdWJzdHJpbmcgc3RyIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gU3RyaW5nLmxlbmd0aCBzdHIgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5zdWJzdHJpbmdcIlxuICBlbHNlIHVuc2FmZV9zdHJpbmcgc3RyIG9mcyBsZW5cblxubGV0IHN1YmJ5dGVzIGIgb2ZzIGxlbiA9IHN1YnN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKSBvZnMgbGVuXG5cbmxldCBmaWxlIGZpbGVuYW1lID1cbiAgbGV0IGljID0gb3Blbl9pbl9iaW4gZmlsZW5hbWUgaW5cbiAgbWF0Y2ggY2hhbm5lbCBpYyAoLTEpIHdpdGhcbiAgICB8IGQgLT4gY2xvc2VfaW4gaWM7IGRcbiAgICB8IGV4Y2VwdGlvbiBlIC0+IGNsb3NlX2luIGljOyByYWlzZSBlXG5cbmxldCBvdXRwdXQgY2hhbiBkaWdlc3QgPVxuICBvdXRwdXRfc3RyaW5nIGNoYW4gZGlnZXN0XG5cbmxldCBpbnB1dCBjaGFuID0gcmVhbGx5X2lucHV0X3N0cmluZyBjaGFuIDE2XG5cbmxldCBjaGFyX2hleCBuID1cbiAgQ2hhci51bnNhZmVfY2hyIChuICsgaWYgbiA8IDEwIHRoZW4gQ2hhci5jb2RlICcwJyBlbHNlIChDaGFyLmNvZGUgJ2EnIC0gMTApKVxuXG5sZXQgdG9faGV4IGQgPVxuICBpZiBTdHJpbmcubGVuZ3RoIGQgPD4gMTYgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC50b19oZXhcIjtcbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAzMiBpblxuICBmb3IgaSA9IDAgdG8gMTUgZG9cbiAgICBsZXQgeCA9IENoYXIuY29kZSBkLltpXSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIpIChjaGFyX2hleCAoeCBsc3IgNCkpO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzdWx0IChpKjIrMSkgKGNoYXJfaGV4ICh4IGxhbmQgMHgwZikpO1xuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc3VsdFxuXG5sZXQgZnJvbV9oZXggcyA9XG4gIGlmIFN0cmluZy5sZW5ndGggcyA8PiAzMiB0aGVuIGludmFsaWRfYXJnIFwiRGlnZXN0LmZyb21faGV4XCI7XG4gIGxldCBkaWdpdCBjID1cbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8ICcwJy4uJzknIC0+IENoYXIuY29kZSBjIC0gQ2hhci5jb2RlICcwJ1xuICAgIHwgJ0EnLi4nRicgLT4gQ2hhci5jb2RlIGMgLSBDaGFyLmNvZGUgJ0EnICsgMTBcbiAgICB8ICdhJy4uJ2YnIC0+IENoYXIuY29kZSBjIC0gQ2hhci5jb2RlICdhJyArIDEwXG4gICAgfCBfIC0+IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiRGlnZXN0LmZyb21faGV4XCIpXG4gIGluXG4gIGxldCBieXRlIGkgPSBkaWdpdCBzLltpXSBsc2wgNCArIGRpZ2l0IHMuW2krMV0gaW5cbiAgbGV0IHJlc3VsdCA9IEJ5dGVzLmNyZWF0ZSAxNiBpblxuICBmb3IgaSA9IDAgdG8gMTUgZG9cbiAgICBCeXRlcy5zZXQgcmVzdWx0IGkgKENoYXIuY2hyIChieXRlICgyICogaSkpKTtcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXN1bHRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICBNYW51ZWwgU2VycmFubyBldCBYYXZpZXIgTGVyb3ksIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDAgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtCaWdhcnJheV06IGxhcmdlLCBtdWx0aS1kaW1lbnNpb25hbCwgbnVtZXJpY2FsIGFycmF5cyAqKVxuXG4oKiBUaGVzZSB0eXBlcyBpbiBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSB0YWJsZXMgaW5cbiAgIC4uL3R5cGluZy90eXBlb3B0Lm1sICopXG5cbnR5cGUgZmxvYXQzMl9lbHQgPSBGbG9hdDMyX2VsdFxudHlwZSBmbG9hdDY0X2VsdCA9IEZsb2F0NjRfZWx0XG50eXBlIGludDhfc2lnbmVkX2VsdCA9IEludDhfc2lnbmVkX2VsdFxudHlwZSBpbnQ4X3Vuc2lnbmVkX2VsdCA9IEludDhfdW5zaWduZWRfZWx0XG50eXBlIGludDE2X3NpZ25lZF9lbHQgPSBJbnQxNl9zaWduZWRfZWx0XG50eXBlIGludDE2X3Vuc2lnbmVkX2VsdCA9IEludDE2X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQzMl9lbHQgPSBJbnQzMl9lbHRcbnR5cGUgaW50NjRfZWx0ID0gSW50NjRfZWx0XG50eXBlIGludF9lbHQgPSBJbnRfZWx0XG50eXBlIG5hdGl2ZWludF9lbHQgPSBOYXRpdmVpbnRfZWx0XG50eXBlIGNvbXBsZXgzMl9lbHQgPSBDb21wbGV4MzJfZWx0XG50eXBlIGNvbXBsZXg2NF9lbHQgPSBDb21wbGV4NjRfZWx0XG5cbnR5cGUgKCdhLCAnYikga2luZCA9XG4gICAgRmxvYXQzMiA6IChmbG9hdCwgZmxvYXQzMl9lbHQpIGtpbmRcbiAgfCBGbG9hdDY0IDogKGZsb2F0LCBmbG9hdDY0X2VsdCkga2luZFxuICB8IEludDhfc2lnbmVkIDogKGludCwgaW50OF9zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50OF91bnNpZ25lZCA6IChpbnQsIGludDhfdW5zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50MTZfc2lnbmVkIDogKGludCwgaW50MTZfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3Vuc2lnbmVkIDogKGludCwgaW50MTZfdW5zaWduZWRfZWx0KSBraW5kXG4gIHwgSW50MzIgOiAoaW50MzIsIGludDMyX2VsdCkga2luZFxuICB8IEludDY0IDogKGludDY0LCBpbnQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQgOiAoaW50LCBpbnRfZWx0KSBraW5kXG4gIHwgTmF0aXZlaW50IDogKG5hdGl2ZWludCwgbmF0aXZlaW50X2VsdCkga2luZFxuICB8IENvbXBsZXgzMiA6IChDb21wbGV4LnQsIGNvbXBsZXgzMl9lbHQpIGtpbmRcbiAgfCBDb21wbGV4NjQgOiAoQ29tcGxleC50LCBjb21wbGV4NjRfZWx0KSBraW5kXG4gIHwgQ2hhciA6IChjaGFyLCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuXG50eXBlIGNfbGF5b3V0ID0gQ19sYXlvdXRfdHlwXG50eXBlIGZvcnRyYW5fbGF5b3V0ID0gRm9ydHJhbl9sYXlvdXRfdHlwICgqKilcblxudHlwZSAnYSBsYXlvdXQgPVxuICAgIENfbGF5b3V0OiBjX2xheW91dCBsYXlvdXRcbiAgfCBGb3J0cmFuX2xheW91dDogZm9ydHJhbl9sYXlvdXQgbGF5b3V0XG5cbigqIEtlZXAgdGhvc2UgY29uc3RhbnRzIGluIHN5bmMgd2l0aCB0aGUgY2FtbF9iYV9raW5kIGVudW1lcmF0aW9uXG4gICBpbiBiaWdhcnJheS5oICopXG5cbmxldCBmbG9hdDMyID0gRmxvYXQzMlxubGV0IGZsb2F0NjQgPSBGbG9hdDY0XG5sZXQgaW50OF9zaWduZWQgPSBJbnQ4X3NpZ25lZFxubGV0IGludDhfdW5zaWduZWQgPSBJbnQ4X3Vuc2lnbmVkXG5sZXQgaW50MTZfc2lnbmVkID0gSW50MTZfc2lnbmVkXG5sZXQgaW50MTZfdW5zaWduZWQgPSBJbnQxNl91bnNpZ25lZFxubGV0IGludDMyID0gSW50MzJcbmxldCBpbnQ2NCA9IEludDY0XG5sZXQgaW50ID0gSW50XG5sZXQgbmF0aXZlaW50ID0gTmF0aXZlaW50XG5sZXQgY29tcGxleDMyID0gQ29tcGxleDMyXG5sZXQgY29tcGxleDY0ID0gQ29tcGxleDY0XG5sZXQgY2hhciA9IENoYXJcblxubGV0IGtpbmRfc2l6ZV9pbl9ieXRlcyA6IHR5cGUgYSBiLiAoYSwgYikga2luZCAtPiBpbnQgPSBmdW5jdGlvblxuICB8IEZsb2F0MzIgLT4gNFxuICB8IEZsb2F0NjQgLT4gOFxuICB8IEludDhfc2lnbmVkIC0+IDFcbiAgfCBJbnQ4X3Vuc2lnbmVkIC0+IDFcbiAgfCBJbnQxNl9zaWduZWQgLT4gMlxuICB8IEludDE2X3Vuc2lnbmVkIC0+IDJcbiAgfCBJbnQzMiAtPiA0XG4gIHwgSW50NjQgLT4gOFxuICB8IEludCAtPiBTeXMud29yZF9zaXplIC8gOFxuICB8IE5hdGl2ZWludCAtPiBTeXMud29yZF9zaXplIC8gOFxuICB8IENvbXBsZXgzMiAtPiA4XG4gIHwgQ29tcGxleDY0IC0+IDE2XG4gIHwgQ2hhciAtPiAxXG5cbigqIEtlZXAgdGhvc2UgY29uc3RhbnRzIGluIHN5bmMgd2l0aCB0aGUgY2FtbF9iYV9sYXlvdXQgZW51bWVyYXRpb25cbiAgIGluIGJpZ2FycmF5LmggKilcblxubGV0IGNfbGF5b3V0ID0gQ19sYXlvdXRcbmxldCBmb3J0cmFuX2xheW91dCA9IEZvcnRyYW5fbGF5b3V0XG5cbm1vZHVsZSBHZW5hcnJheSA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0XG4gIGV4dGVybmFsIGNyZWF0ZTogKCdhLCAnYikga2luZCAtPiAnYyBsYXlvdXQgLT4gaW50IGFycmF5IC0+ICgnYSwgJ2IsICdjKSB0XG4gICAgID0gXCJjYW1sX2JhX2NyZWF0ZVwiXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IGFycmF5IC0+ICdhXG4gICAgID0gXCJjYW1sX2JhX2dldF9nZW5lcmljXCJcbiAgZXh0ZXJuYWwgc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgYXJyYXkgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiY2FtbF9iYV9zZXRfZ2VuZXJpY1wiXG5cbiAgbGV0IHJlYyBjbG9vcCBhcnIgaWR4IGYgY29sIG1heCA9XG4gICAgaWYgY29sID0gQXJyYXkubGVuZ3RoIGlkeCB0aGVuIHNldCBhcnIgaWR4IChmIGlkeClcbiAgICBlbHNlIGZvciBqID0gMCB0byBwcmVkIG1heC4oY29sKSBkb1xuICAgICAgICAgICBpZHguKGNvbCkgPC0gajtcbiAgICAgICAgICAgY2xvb3AgYXJyIGlkeCBmIChzdWNjIGNvbCkgbWF4XG4gICAgICAgICBkb25lXG4gIGxldCByZWMgZmxvb3AgYXJyIGlkeCBmIGNvbCBtYXggPVxuICAgIGlmIGNvbCA8IDAgdGhlbiBzZXQgYXJyIGlkeCAoZiBpZHgpXG4gICAgZWxzZSBmb3IgaiA9IDEgdG8gbWF4Lihjb2wpIGRvXG4gICAgICAgICAgIGlkeC4oY29sKSA8LSBqO1xuICAgICAgICAgICBmbG9vcCBhcnIgaWR4IGYgKHByZWQgY29sKSBtYXhcbiAgICAgICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbXMgZiA9XG4gICAgbGV0IGFyciA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW1zIGluXG4gICAgbGV0IGRsZW4gPSBBcnJheS5sZW5ndGggZGltcyBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjbG9vcCBhcnIgKEFycmF5Lm1ha2UgZGxlbiAwKSBmIDAgZGltczsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmbG9vcCBhcnIgKEFycmF5Lm1ha2UgZGxlbiAxKSBmIChwcmVkIGRsZW4pIGRpbXM7IGFyclxuXG4gIGV4dGVybmFsIG51bV9kaW1zOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcImNhbWxfYmFfbnVtX2RpbXNcIlxuICBleHRlcm5hbCBudGhfZGltOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX2JhX2RpbVwiXG4gIGxldCBkaW1zIGEgPVxuICAgIGxldCBuID0gbnVtX2RpbXMgYSBpblxuICAgIGxldCBkID0gQXJyYXkubWFrZSBuIDAgaW5cbiAgICBmb3IgaSA9IDAgdG8gbi0xIGRvIGQuKGkpIDwtIG50aF9kaW0gYSBpIGRvbmU7XG4gICAgZFxuXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoQXJyYXkuZm9sZF9sZWZ0ICggKiApIDEgKGRpbXMgYXJyKSlcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgZXh0ZXJuYWwgc2xpY2VfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IGFycmF5IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3NsaWNlXCJcbiAgZXh0ZXJuYWwgc2xpY2VfcmlnaHQ6ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCBhcnJheSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zbGljZVwiXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXRcbiAgICAgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG5lbmRcblxubW9kdWxlIEFycmF5MCA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0ID0gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgbGV0IGNyZWF0ZSBraW5kIGxheW91dCA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8fF1cbiAgbGV0IGdldCBhcnIgPSBHZW5hcnJheS5nZXQgYXJyIFt8fF1cbiAgbGV0IHNldCBhcnIgPSBHZW5hcnJheS5zZXQgYXJyIFt8fF1cbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPSBraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKVxuXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG5cbiAgbGV0IG9mX3ZhbHVlIGtpbmQgbGF5b3V0IHYgPVxuICAgIGxldCBhID0gY3JlYXRlIGtpbmQgbGF5b3V0IGluXG4gICAgc2V0IGEgdjtcbiAgICBhXG4gIGxldCBpbml0ID0gb2ZfdmFsdWVcbmVuZFxuXG5tb2R1bGUgQXJyYXkxID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbSA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltfF1cbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gJ2EgPSBcIiVjYW1sX2JhX3JlZl8xXCJcbiAgZXh0ZXJuYWwgc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWNhbWxfYmFfc2V0XzFcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gJ2EgPSBcIiVjYW1sX2JhX3Vuc2FmZV9yZWZfMVwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfc2V0XzFcIlxuICBleHRlcm5hbCBkaW06ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChkaW0gYXJyKVxuXG4gIGV4dGVybmFsIHN1YjogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCAnYykgdCA9IFwiY2FtbF9iYV9zdWJcIlxuICBsZXQgc2xpY2UgKHR5cGUgdCkgKGEgOiAoXywgXywgdCkgR2VuYXJyYXkudCkgbiA9XG4gICAgbWF0Y2ggbGF5b3V0IGEgd2l0aFxuICAgIHwgQ19sYXlvdXQgLT4gKEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XSA6IChfLCBfLCB0KSBHZW5hcnJheS50KVxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gKEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xufF06IChfLCBfLCB0KSBHZW5hcnJheS50KVxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuICBsZXQgY19pbml0IGFyciBkaW0gZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltIGRvIHVuc2FmZV9zZXQgYXJyIGkgKGYgaSkgZG9uZVxuICBsZXQgZm9ydHJhbl9pbml0IGFyciBkaW0gZiA9XG4gICAgZm9yIGkgPSAxIHRvIGRpbSBkbyB1bnNhZmVfc2V0IGFyciBpIChmIGkpIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbSBmID1cbiAgICBsZXQgYXJyID0gY3JlYXRlIGtpbmQgbGF5b3V0IGRpbSBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbSBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltIGY7IGFyclxuICBsZXQgb2ZfYXJyYXkgKHR5cGUgdCkga2luZCAobGF5b3V0OiB0IGxheW91dCkgZGF0YSA9XG4gICAgbGV0IGJhID0gY3JlYXRlIGtpbmQgbGF5b3V0IChBcnJheS5sZW5ndGggZGF0YSkgaW5cbiAgICBsZXQgb2ZzID1cbiAgICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgICAgIENfbGF5b3V0IC0+IDBcbiAgICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gMVxuICAgIGluXG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkYXRhIC0gMSBkbyB1bnNhZmVfc2V0IGJhIChpICsgb2ZzKSBkYXRhLihpKSBkb25lO1xuICAgIGJhXG5lbmRcblxubW9kdWxlIEFycmF5MiA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0ID0gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgbGV0IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbTE7IGRpbTJ8XVxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgPSBcIiVjYW1sX2JhX3JlZl8yXCJcbiAgZXh0ZXJuYWwgc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVjYW1sX2JhX3NldF8yXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYVxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3JlZl8yXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0XG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfc2V0XzJcIlxuICBleHRlcm5hbCBkaW0xOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8xXCJcbiAgZXh0ZXJuYWwgZGltMjogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMlwiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbTEgYXJyKSAqIChkaW0yIGFycilcblxuICBleHRlcm5hbCBzdWJfbGVmdDogKCdhLCAnYiwgY19sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBleHRlcm5hbCBzdWJfcmlnaHQ6XG4gICAgKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBsZXQgc2xpY2VfbGVmdCBhIG4gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF1cbiAgbGV0IHNsaWNlX3JpZ2h0IGEgbiA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xufF1cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbiAgbGV0IGNfaW5pdCBhcnIgZGltMSBkaW0yIGYgPVxuICAgIGZvciBpID0gMCB0byBwcmVkIGRpbTEgZG9cbiAgICAgIGZvciBqID0gMCB0byBwcmVkIGRpbTIgZG9cbiAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIChmIGkgailcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBmID1cbiAgICBmb3IgaiA9IDEgdG8gZGltMiBkb1xuICAgICAgZm9yIGkgPSAxIHRvIGRpbTEgZG9cbiAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIChmIGkgailcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0xIGRpbTIgZiA9XG4gICAgbGV0IGFyciA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgaW5cbiAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgIHwgQ19sYXlvdXQgLT4gY19pbml0IGFyciBkaW0xIGRpbTIgZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBmOyBhcnJcbiAgbGV0IG9mX2FycmF5ICh0eXBlIHQpIGtpbmQgKGxheW91dDogdCBsYXlvdXQpIGRhdGEgPVxuICAgIGxldCBkaW0xID0gQXJyYXkubGVuZ3RoIGRhdGEgaW5cbiAgICBsZXQgZGltMiA9IGlmIGRpbTEgPSAwIHRoZW4gMCBlbHNlIEFycmF5Lmxlbmd0aCBkYXRhLigwKSBpblxuICAgIGxldCBiYSA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgaW5cbiAgICBsZXQgb2ZzID1cbiAgICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgICAgIENfbGF5b3V0IC0+IDBcbiAgICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gMVxuICAgIGluXG4gICAgZm9yIGkgPSAwIHRvIGRpbTEgLSAxIGRvXG4gICAgICBsZXQgcm93ID0gZGF0YS4oaSkgaW5cbiAgICAgIGlmIEFycmF5Lmxlbmd0aCByb3cgPD4gZGltMiB0aGVuXG4gICAgICAgIGludmFsaWRfYXJnKFwiQmlnYXJyYXkuQXJyYXkyLm9mX2FycmF5OiBub24tcmVjdGFuZ3VsYXIgZGF0YVwiKTtcbiAgICAgIGZvciBqID0gMCB0byBkaW0yIC0gMSBkb1xuICAgICAgICB1bnNhZmVfc2V0IGJhIChpICsgb2ZzKSAoaiArIG9mcykgcm93LihqKVxuICAgICAgZG9uZVxuICAgIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5tb2R1bGUgQXJyYXkzID0gc3RydWN0XG4gIHR5cGUgKCEnYSwgISdiLCAhJ2MpIHQgPSAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICBsZXQgY3JlYXRlIGtpbmQgbGF5b3V0IGRpbTEgZGltMiBkaW0zID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW0xOyBkaW0yOyBkaW0zfF1cbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYSA9IFwiJWNhbWxfYmFfcmVmXzNcIlxuICBleHRlcm5hbCBzZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3NldF8zXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2FcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9yZWZfM1wiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9zZXRfM1wiXG4gIGV4dGVybmFsIGRpbTE6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzFcIlxuICBleHRlcm5hbCBkaW0yOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8yXCJcbiAgZXh0ZXJuYWwgZGltMzogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fM1wiXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKGRpbTEgYXJyKSAqIChkaW0yIGFycikgKiAoZGltMyBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViX2xlZnQ6ICgnYSwgJ2IsIGNfbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgZXh0ZXJuYWwgc3ViX3JpZ2h0OlxuICAgICAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGxldCBzbGljZV9sZWZ0XzEgYSBuIG0gPSBHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xuOyBtfF1cbiAgbGV0IHNsaWNlX3JpZ2h0XzEgYSBuIG0gPSBHZW5hcnJheS5zbGljZV9yaWdodCBhIFt8bjsgbXxdXG4gIGxldCBzbGljZV9sZWZ0XzIgYSBuID0gR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdXG4gIGxldCBzbGljZV9yaWdodF8yIGEgbiA9IEdlbmFycmF5LnNsaWNlX3JpZ2h0IGEgW3xufF1cbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbiAgbGV0IGNfaW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgZm9yIGkgPSAwIHRvIHByZWQgZGltMSBkb1xuICAgICAgZm9yIGogPSAwIHRvIHByZWQgZGltMiBkb1xuICAgICAgICBmb3IgayA9IDAgdG8gcHJlZCBkaW0zIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBhcnIgaSBqIGsgKGYgaSBqIGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lXG4gIGxldCBmb3J0cmFuX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGYgPVxuICAgIGZvciBrID0gMSB0byBkaW0zIGRvXG4gICAgICBmb3IgaiA9IDEgdG8gZGltMiBkb1xuICAgICAgICBmb3IgaSA9IDEgdG8gZGltMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYXJyIGkgaiBrIChmIGkgaiBrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltMSBkaW0yIGRpbTMgZiA9XG4gICAgbGV0IGFyciA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgZGltMyBpblxuICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgfCBDX2xheW91dCAtPiBjX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmOyBhcnJcbiAgbGV0IG9mX2FycmF5ICh0eXBlIHQpIGtpbmQgKGxheW91dDogdCBsYXlvdXQpIGRhdGEgPVxuICAgIGxldCBkaW0xID0gQXJyYXkubGVuZ3RoIGRhdGEgaW5cbiAgICBsZXQgZGltMiA9IGlmIGRpbTEgPSAwIHRoZW4gMCBlbHNlIEFycmF5Lmxlbmd0aCBkYXRhLigwKSBpblxuICAgIGxldCBkaW0zID0gaWYgZGltMiA9IDAgdGhlbiAwIGVsc2UgQXJyYXkubGVuZ3RoIGRhdGEuKDApLigwKSBpblxuICAgIGxldCBiYSA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgZGltMyBpblxuICAgIGxldCBvZnMgPVxuICAgICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICAgICAgQ19sYXlvdXQgLT4gMFxuICAgICAgfCBGb3J0cmFuX2xheW91dCAtPiAxXG4gICAgaW5cbiAgICBmb3IgaSA9IDAgdG8gZGltMSAtIDEgZG9cbiAgICAgIGxldCByb3cgPSBkYXRhLihpKSBpblxuICAgICAgaWYgQXJyYXkubGVuZ3RoIHJvdyA8PiBkaW0yIHRoZW5cbiAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTMub2ZfYXJyYXk6IG5vbi1jdWJpYyBkYXRhXCIpO1xuICAgICAgZm9yIGogPSAwIHRvIGRpbTIgLSAxIGRvXG4gICAgICAgIGxldCBjb2wgPSByb3cuKGopIGluXG4gICAgICAgIGlmIEFycmF5Lmxlbmd0aCBjb2wgPD4gZGltMyB0aGVuXG4gICAgICAgICAgaW52YWxpZF9hcmcoXCJCaWdhcnJheS5BcnJheTMub2ZfYXJyYXk6IG5vbi1jdWJpYyBkYXRhXCIpO1xuICAgICAgICBmb3IgayA9IDAgdG8gZGltMyAtIDEgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGJhIChpICsgb2ZzKSAoaiArIG9mcykgKGsgKyBvZnMpIGNvbC4oaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmU7XG4gICAgYmFcbmVuZFxuXG5leHRlcm5hbCBnZW5hcnJheV9vZl9hcnJheTA6ICgnYSwgJ2IsICdjKSBBcnJheTAudCAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBnZW5hcnJheV9vZl9hcnJheTE6ICgnYSwgJ2IsICdjKSBBcnJheTEudCAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBnZW5hcnJheV9vZl9hcnJheTI6ICgnYSwgJ2IsICdjKSBBcnJheTIudCAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBnZW5hcnJheV9vZl9hcnJheTM6ICgnYSwgJ2IsICdjKSBBcnJheTMudCAtPiAoJ2EsICdiLCAnYykgR2VuYXJyYXkudFxuICAgPSBcIiVpZGVudGl0eVwiXG5sZXQgYXJyYXkwX29mX2dlbmFycmF5IGEgPVxuICBpZiBHZW5hcnJheS5udW1fZGltcyBhID0gMCB0aGVuIGFcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkJpZ2FycmF5LmFycmF5MF9vZl9nZW5hcnJheVwiXG5sZXQgYXJyYXkxX29mX2dlbmFycmF5IGEgPVxuICBpZiBHZW5hcnJheS5udW1fZGltcyBhID0gMSB0aGVuIGFcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkJpZ2FycmF5LmFycmF5MV9vZl9nZW5hcnJheVwiXG5sZXQgYXJyYXkyX29mX2dlbmFycmF5IGEgPVxuICBpZiBHZW5hcnJheS5udW1fZGltcyBhID0gMiB0aGVuIGFcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkJpZ2FycmF5LmFycmF5Ml9vZl9nZW5hcnJheVwiXG5sZXQgYXJyYXkzX29mX2dlbmFycmF5IGEgPVxuICBpZiBHZW5hcnJheS5udW1fZGltcyBhID0gMyB0aGVuIGFcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkJpZ2FycmF5LmFycmF5M19vZl9nZW5hcnJheVwiXG5cbmV4dGVybmFsIHJlc2hhcGU6XG4gICAoJ2EsICdiLCAnYykgR2VuYXJyYXkudCAtPiBpbnQgYXJyYXkgLT4gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgID0gXCJjYW1sX2JhX3Jlc2hhcGVcIlxubGV0IHJlc2hhcGVfMCBhID0gcmVzaGFwZSBhIFt8fF1cbmxldCByZXNoYXBlXzEgYSBkaW0xID0gcmVzaGFwZSBhIFt8ZGltMXxdXG5sZXQgcmVzaGFwZV8yIGEgZGltMSBkaW0yID0gcmVzaGFwZSBhIFt8ZGltMTtkaW0yfF1cbmxldCByZXNoYXBlXzMgYSBkaW0xIGRpbTIgZGltMyA9IHJlc2hhcGUgYSBbfGRpbTE7ZGltMjtkaW0zfF1cblxuKCogRm9yY2UgY2FtbF9iYV9nZXRfezEsMiwzLE59IHRvIGJlIGxpbmtlZCBpbiwgc2luY2Ugd2UgZG9uJ3QgcmVmZXJcbiAgIHRvIHRob3NlIHByaW1pdGl2ZXMgZGlyZWN0bHkgaW4gdGhpcyBmaWxlICopXG5cbmxldCBfID1cbiAgbGV0IF8gPSBHZW5hcnJheS5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTEuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkyLmdldCBpblxuICBsZXQgXyA9IEFycmF5My5nZXQgaW5cbiAgKClcblxuW0BAQG9jYW1sLndhcm5pbmcgXCItMzJcIl1cbmV4dGVybmFsIGdldDE6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfMVwiXG5leHRlcm5hbCBnZXQyOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzJcIlxuZXh0ZXJuYWwgZ2V0MzogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8zXCJcbmV4dGVybmFsIHNldDE6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfMVwiXG5leHRlcm5hbCBzZXQyOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzJcIlxuZXh0ZXJuYWwgc2V0MzogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8zXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgKilcbigqICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENhbWJpdW0sIENvbGxlZ2UgZGUgRnJhbmNlIGFuZCBJbnJpYSAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICopXG5cbmV4dGVybmFsIHJhbmRvbV9zZWVkOiB1bml0IC0+IGludCBhcnJheSA9IFwiY2FtbF9zeXNfcmFuZG9tX3NlZWRcIlxuXG5tb2R1bGUgU3RhdGUgPSBzdHJ1Y3RcblxuICBvcGVuIEJpZ2FycmF5XG5cbiAgdHlwZSB0ID0gKGludDY0LCBpbnQ2NF9lbHQsIGNfbGF5b3V0KSBBcnJheTEudFxuXG4gIGV4dGVybmFsIG5leHQ6IHQgLT4gKGludDY0W0B1bmJveGVkXSlcbiAgICAgID0gXCJjYW1sX2x4bV9uZXh0XCIgXCJjYW1sX2x4bV9uZXh0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuXG4gIGxldCBjcmVhdGUgKCkgOiB0ID1cbiAgICBBcnJheTEuY3JlYXRlIEludDY0IENfbGF5b3V0IDRcblxuICBsZXQgc2V0IHMgaTEgaTIgaTMgaTQgPVxuICAgIEFycmF5MS51bnNhZmVfc2V0IHMgMCAoSW50NjQubG9nb3IgaTEgMUwpOyAoKiBtdXN0IGJlIG9kZCAqKVxuICAgIEFycmF5MS51bnNhZmVfc2V0IHMgMSBpMjtcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDIgKGlmIGkzIDw+IDBMIHRoZW4gaTMgZWxzZSAxTCk7ICgqIG11c3Qgbm90IGJlIDAgKilcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDMgKGlmIGk0IDw+IDBMIHRoZW4gaTQgZWxzZSAyTCkgKCogbXVzdCBub3QgYmUgMCAqKVxuXG4gIGxldCBtayBpMSBpMiBpMyBpNCA9XG4gICAgbGV0IHMgPSBjcmVhdGUgKCkgaW5cbiAgICBzZXQgcyBpMSBpMiBpMyBpNDsgc1xuXG4gIGxldCBhc3NpZ24gKGRzdDogdCkgKHNyYzogdCkgPVxuICAgIEFycmF5MS5ibGl0IHNyYyBkc3RcblxuICBsZXQgY29weSBzID1cbiAgICBsZXQgcycgPSBjcmVhdGUoKSBpbiBhc3NpZ24gcycgczsgcydcblxuICAoKiBUaGUgc2VlZCBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEl0IGNhbiBiZSBqdXN0IG9uZSBpbnRlZ2VyLFxuICAgICBidXQgaXQgY2FuIGFsc28gYmUgMTIgb3IgbW9yZSBieXRlcy4gIFRvIGhpZGUgdGhlIGRpZmZlcmVuY2UsXG4gICAgIHdlIHNlcmlhbGl6ZSB0aGUgYXJyYXkgYXMgYSBzZXF1ZW5jZSBvZiBieXRlcywgdGhlbiBoYXNoIHRoZVxuICAgICBzZXF1ZW5jZSB3aXRoIE1ENSAoRGlnZXN0LmJ5dGVzKS4gIE1ENSBnaXZlcyBvbmx5IDEyOCBiaXRzIHdoaWxlXG4gICAgIHdlIG5lZWQgMjU2IGJpdHMsIHNvIHdlIGhhc2ggdHdpY2Ugd2l0aCBkaWZmZXJlbnQgc3VmZml4ZXMuICopXG4gIGxldCByZWluaXQgcyBzZWVkID1cbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBzZWVkIGluXG4gICAgbGV0IGIgPSBCeXRlcy5jcmVhdGUgKG4gKiA4ICsgMSkgaW5cbiAgICBmb3IgaSA9IDAgdG8gbi0xIGRvXG4gICAgICBCeXRlcy5zZXRfaW50NjRfbGUgYiAoaSAqIDgpIChJbnQ2NC5vZl9pbnQgc2VlZC4oaSkpXG4gICAgZG9uZTtcbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMSc7XG4gICAgbGV0IGQxID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBCeXRlcy5zZXQgYiAobiAqIDgpICdcXHgwMic7XG4gICAgbGV0IGQyID0gRGlnZXN0LmJ5dGVzIGIgaW5cbiAgICBzZXQgcyAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMSAwKVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQxIDgpXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDIgMClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMiA4KVxuXG4gIGxldCBtYWtlIHNlZWQgPVxuICAgIGxldCBzID0gY3JlYXRlKCkgaW4gcmVpbml0IHMgc2VlZDsgc1xuXG4gIGxldCBtYWtlX3NlbGZfaW5pdCAoKSA9XG4gICAgbWFrZSAocmFuZG9tX3NlZWQgKCkpXG5cbiAgKCogUmV0dXJuIDMwIHJhbmRvbSBiaXRzIGFzIGFuIGludGVnZXIgMCA8PSB4IDwgMTA3Mzc0MTgyNCAqKVxuICBsZXQgYml0cyBzID1cbiAgICBJbnQ2NC50b19pbnQgKG5leHQgcykgbGFuZCAweDNGRkZfRkZGRlxuXG4gICgqIFJldHVybiBhbiBpbnRlZ2VyIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkgKilcbiAgbGV0IHJlYyBpbnRhdXggcyBuID1cbiAgICBsZXQgciA9IGJpdHMgcyBpblxuICAgIGxldCB2ID0gciBtb2QgbiBpblxuICAgIGlmIHIgLSB2ID4gMHgzRkZGRkZGRiAtIG4gKyAxIHRoZW4gaW50YXV4IHMgbiBlbHNlIHZcblxuICBsZXQgaW50IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kID4gMHgzRkZGRkZGRiB8fCBib3VuZCA8PSAwXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlJhbmRvbS5pbnRcIlxuICAgIGVsc2UgaW50YXV4IHMgYm91bmRcblxuICAoKiBSZXR1cm4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLlxuICAgICBbYm91bmRdIG1heSBiZSBhbnkgcG9zaXRpdmUgW2ludF0uICopXG4gIGxldCByZWMgaW50NjNhdXggcyBuID1cbiAgICBsZXQgciA9IEludDY0LnRvX2ludCAobmV4dCBzKSBsYW5kIG1heF9pbnQgaW5cbiAgICBsZXQgdiA9IHIgbW9kIG4gaW5cbiAgICBpZiByIC0gdiA+IG1heF9pbnQgLSBuICsgMSB0aGVuIGludDYzYXV4IHMgbiBlbHNlIHZcblxuICBsZXQgZnVsbF9pbnQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMCB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBcIlJhbmRvbS5mdWxsX2ludFwiXG4gICAgZWxzZSBpZiBib3VuZCA+IDB4M0ZGRkZGRkYgdGhlblxuICAgICAgaW50NjNhdXggcyBib3VuZFxuICAgIGVsc2VcbiAgICAgIGludGF1eCBzIGJvdW5kXG5cbiAgKCogUmV0dXJuIDMyIHJhbmRvbSBiaXRzIGFzIGFuIFtpbnQzMl0gKilcbiAgbGV0IGJpdHMzMiBzID1cbiAgICBJbnQ2NC50b19pbnQzMiAobmV4dCBzKVxuXG4gICgqIFJldHVybiBhbiBbaW50MzJdIGJldHdlZW4gMCAoaW5jbHVkZWQpIGFuZCBbYm91bmRdIChleGNsdWRlZCkuICopXG4gIGxldCByZWMgaW50MzJhdXggcyBuID1cbiAgICBsZXQgciA9IEludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJpdHMzMiBzKSAxIGluXG4gICAgbGV0IHYgPSBJbnQzMi5yZW0gciBuIGluXG4gICAgaWYgSW50MzIuKHN1YiByIHYgPiBhZGQgKHN1YiBtYXhfaW50IG4pIDFsKVxuICAgIHRoZW4gaW50MzJhdXggcyBuXG4gICAgZWxzZSB2XG5cbiAgbGV0IGludDMyIHMgYm91bmQgPVxuICAgIGlmIGJvdW5kIDw9IDBsXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlJhbmRvbS5pbnQzMlwiXG4gICAgZWxzZSBpbnQzMmF1eCBzIGJvdW5kXG5cbiAgKCogUmV0dXJuIDY0IHJhbmRvbSBiaXRzIGFzIGFuIFtpbnQ2NF0gKilcbiAgbGV0IGJpdHM2NCBzID1cbiAgICBuZXh0IHNcblxuICAoKiBSZXR1cm4gYW4gW2ludDY0XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDY0YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzNjQgcykgMSBpblxuICAgIGxldCB2ID0gSW50NjQucmVtIHIgbiBpblxuICAgIGlmIEludDY0LihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxTClcbiAgICB0aGVuIGludDY0YXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQ2NCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwTFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50NjRcIlxuICAgIGVsc2UgaW50NjRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiAzMiBvciA2NCByYW5kb20gYml0cyBhcyBhIFtuYXRpdmVpbnRdICopXG4gIGxldCBuYXRpdmViaXRzID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGJpdHMzMiBzKVxuICAgIGVsc2UgZnVuIHMgLT4gSW50NjQudG9fbmF0aXZlaW50IChiaXRzNjQgcylcblxuICAoKiBSZXR1cm4gYSBbbmF0aXZlaW50XSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgbmF0aXZlaW50ID1cbiAgICBpZiBOYXRpdmVpbnQuc2l6ZSA9IDMyXG4gICAgdGhlbiBmdW4gcyBib3VuZCAtPiBOYXRpdmVpbnQub2ZfaW50MzIgKGludDMyIHMgKE5hdGl2ZWludC50b19pbnQzMiBib3VuZCkpXG4gICAgZWxzZSBmdW4gcyBib3VuZCAtPiBJbnQ2NC50b19uYXRpdmVpbnQgKGludDY0IHMgKEludDY0Lm9mX25hdGl2ZWludCBib3VuZCkpXG5cbiAgKCogUmV0dXJuIGEgZmxvYXQgMCA8IHggPCAxIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhbW9uZyB0aGVcbiAgICAgbXVsdGlwbGVzIG9mIDJeLTUzICopXG4gIGxldCByZWMgcmF3ZmxvYXQgcyA9XG4gICAgbGV0IGIgPSBuZXh0IHMgaW5cbiAgICBsZXQgbiA9IEludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgYiAxMSBpblxuICAgIGlmIG4gPD4gMEwgdGhlbiBJbnQ2NC50b19mbG9hdCBuICouIDB4MS5wLTUzIGVsc2UgcmF3ZmxvYXQgc1xuXG4gICgqIFJldHVybiBhIGZsb2F0IGJldHdlZW4gMCBhbmQgW2JvdW5kXSAqKVxuICBsZXQgZmxvYXQgcyBib3VuZCA9IHJhd2Zsb2F0IHMgKi4gYm91bmRcblxuICAoKiBSZXR1cm4gYSByYW5kb20gQm9vbGVhbiAqKVxuICBsZXQgYm9vbCBzID0gbmV4dCBzIDwgMExcblxuICAoKiBTcGxpdCBhIG5ldyBQUk5HIG9mZiB0aGUgZ2l2ZW4gUFJORyAqKVxuICBsZXQgc3BsaXQgcyA9XG4gICAgbGV0IGkxID0gYml0czY0IHMgaW4gbGV0IGkyID0gYml0czY0IHMgaW5cbiAgICBsZXQgaTMgPSBiaXRzNjQgcyBpbiBsZXQgaTQgPSBiaXRzNjQgcyBpblxuICAgIG1rIGkxIGkyIGkzIGk0XG5lbmRcblxubGV0IG1rX2RlZmF1bHQgKCkgPVxuICAoKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYnRhaW5lZCB3aXRoIFtTdGF0ZS5tYWtlIFt8IDMxNDE1OTI2NSB8XV0uICopXG4gIFN0YXRlLm1rICgtNjE5Njg3NDI4OTU2NzcwNTA5N0wpXG4gICAgICAgICAgIDU4NjU3MzI0OTgzMzcxMzE4OUxcbiAgICAgICAgICAgKC04NTkxMjY4ODAzODY1MDQzNDA3TClcbiAgICAgICAgICAgNjM4ODYxMzU5NTg0OTc3MjA0NExcblxubGV0IHJhbmRvbV9rZXkgPVxuICBEb21haW4uRExTLm5ld19rZXkgfnNwbGl0X2Zyb21fcGFyZW50OlN0YXRlLnNwbGl0IG1rX2RlZmF1bHRcblxubGV0IGJpdHMgKCkgPSBTdGF0ZS5iaXRzIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IGludCBib3VuZCA9IFN0YXRlLmludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBmdWxsX2ludCBib3VuZCA9IFN0YXRlLmZ1bGxfaW50IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGludDMyIGJvdW5kID0gU3RhdGUuaW50MzIgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgbmF0aXZlaW50IGJvdW5kID0gU3RhdGUubmF0aXZlaW50IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGludDY0IGJvdW5kID0gU3RhdGUuaW50NjQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgZmxvYXQgc2NhbGUgPSBTdGF0ZS5mbG9hdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc2NhbGVcbmxldCBib29sICgpID0gU3RhdGUuYm9vbCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBiaXRzMzIgKCkgPSBTdGF0ZS5iaXRzMzIgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgYml0czY0ICgpID0gU3RhdGUuYml0czY0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IG5hdGl2ZWJpdHMgKCkgPSBTdGF0ZS5uYXRpdmViaXRzIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5yZWluaXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNlZWRcbmxldCBpbml0IHNlZWQgPSBmdWxsX2luaXQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCAoKSA9IGZ1bGxfaW5pdCAocmFuZG9tX3NlZWQoKSlcblxuKCogU3BsaXR0aW5nICopXG5cbmxldCBzcGxpdCAoKSA9IFN0YXRlLnNwbGl0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxuXG4oKiBNYW5pcHVsYXRpbmcgdGhlIGN1cnJlbnQgc3RhdGUuICopXG5cbmxldCBnZXRfc3RhdGUgKCkgPSBTdGF0ZS5jb3B5IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IHNldF9zdGF0ZSBzID0gU3RhdGUuYXNzaWduIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEhhc2ggdGFibGVzICopXG5cbigqIFdlIGRvIGR5bmFtaWMgaGFzaGluZywgYW5kIHJlc2l6ZSB0aGUgdGFibGUgYW5kIHJlaGFzaCB0aGUgZWxlbWVudHNcbiAgIHdoZW4gdGhlIGxvYWQgZmFjdG9yIGJlY29tZXMgdG9vIGhpZ2guICopXG5cbnR5cGUgKCdhLCAnYikgdCA9XG4gIHsgbXV0YWJsZSBzaXplOiBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgKCogbnVtYmVyIG9mIGVudHJpZXMgKilcbiAgICBtdXRhYmxlIGRhdGE6ICgnYSwgJ2IpIGJ1Y2tldGxpc3QgYXJyYXk7ICAoKiB0aGUgYnVja2V0cyAqKVxuICAgIHNlZWQ6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAoKiBmb3IgcmFuZG9taXphdGlvbiAqKVxuICAgIG11dGFibGUgaW5pdGlhbF9zaXplOiBpbnQ7ICAgICAgICAgICAgICAgICgqIGluaXRpYWwgYXJyYXkgc2l6ZSAqKVxuICB9XG5cbmFuZCAoJ2EsICdiKSBidWNrZXRsaXN0ID1cbiAgICBFbXB0eVxuICB8IENvbnMgb2YgeyBtdXRhYmxlIGtleTogJ2E7XG4gICAgICAgICAgICAgIG11dGFibGUgZGF0YTogJ2I7XG4gICAgICAgICAgICAgIG11dGFibGUgbmV4dDogKCdhLCAnYikgYnVja2V0bGlzdCB9XG5cbigqIFRoZSBzaWduIG9mIGluaXRpYWxfc2l6ZSBlbmNvZGVzIHRoZSBmYWN0IHRoYXQgYSB0cmF2ZXJzYWwgaXNcbiAgIG9uZ29pbmcgb3Igbm90LlxuXG4gICBUaGlzIGRpc2FibGVzIHRoZSBlZmZpY2llbnQgaW4gcGxhY2UgaW1wbGVtZW50YXRpb24gb2YgcmVzaXppbmcuXG4qKVxuXG5sZXQgb25nb2luZ190cmF2ZXJzYWwgaCA9XG4gIE9iai5zaXplIChPYmoucmVwciBoKSA8IDQgKCogY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBoYXNoIHRhYmxlcyAqKVxuICB8fCBoLmluaXRpYWxfc2l6ZSA8IDBcblxubGV0IGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaCA9XG4gIGguaW5pdGlhbF9zaXplIDwtIC0gaC5pbml0aWFsX3NpemVcblxuKCogVG8gcGljayByYW5kb20gc2VlZHMgaWYgcmVxdWVzdGVkICopXG5cbmxldCByYW5kb21pemVkX2RlZmF1bHQgPVxuICBsZXQgcGFyYW1zID1cbiAgICB0cnkgU3lzLmdldGVudiBcIk9DQU1MUlVOUEFSQU1cIiB3aXRoIE5vdF9mb3VuZCAtPlxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiQ0FNTFJVTlBBUkFNXCIgd2l0aCBOb3RfZm91bmQgLT4gXCJcIiBpblxuICBTdHJpbmcuY29udGFpbnMgcGFyYW1zICdSJ1xuXG5sZXQgcmFuZG9taXplZCA9IEF0b21pYy5tYWtlIHJhbmRvbWl6ZWRfZGVmYXVsdFxuXG5sZXQgcmFuZG9taXplICgpID0gQXRvbWljLnNldCByYW5kb21pemVkIHRydWVcbmxldCBpc19yYW5kb21pemVkICgpID0gQXRvbWljLmdldCByYW5kb21pemVkXG5cbmxldCBwcm5nX2tleSA9IERvbWFpbi5ETFMubmV3X2tleSBSYW5kb20uU3RhdGUubWFrZV9zZWxmX2luaXRcblxuKCogRnVuY3Rpb25zIHdoaWNoIGFwcGVhciBiZWZvcmUgdGhlIGZ1bmN0b3JpYWwgaW50ZXJmYWNlIG11c3QgZWl0aGVyIGJlXG4gICBpbmRlcGVuZGVudCBvZiB0aGUgaGFzaCBmdW5jdGlvbiBvciB0YWtlIGl0IGFzIGEgcGFyYW1ldGVyIChzZWUgIzIyMDIgYW5kXG4gICBjb2RlIGJlbG93IHRoZSBmdW5jdG9yIGRlZmluaXRpb25zLiAqKVxuXG4oKiBDcmVhdGluZyBhIGZyZXNoLCBlbXB0eSB0YWJsZSAqKVxuXG5sZXQgcmVjIHBvd2VyXzJfYWJvdmUgeCBuID1cbiAgaWYgeCA+PSBuIHRoZW4geFxuICBlbHNlIGlmIHggKiAyID4gU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiB4XG4gIGVsc2UgcG93ZXJfMl9hYm92ZSAoeCAqIDIpIG5cblxubGV0IGNyZWF0ZSA/KHJhbmRvbSA9IEF0b21pYy5nZXQgcmFuZG9taXplZCkgaW5pdGlhbF9zaXplID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IGluaXRpYWxfc2l6ZSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5KSBlbHNlIDBcbiAgaW5cbiAgeyBpbml0aWFsX3NpemUgPSBzOyBzaXplID0gMDsgc2VlZCA9IHNlZWQ7IGRhdGEgPSBBcnJheS5tYWtlIHMgRW1wdHkgfVxuXG5sZXQgY2xlYXIgaCA9XG4gIGlmIGguc2l6ZSA+IDAgdGhlbiBiZWdpblxuICAgIGguc2l6ZSA8LSAwO1xuICAgIEFycmF5LmZpbGwgaC5kYXRhIDAgKEFycmF5Lmxlbmd0aCBoLmRhdGEpIEVtcHR5XG4gIGVuZFxuXG5sZXQgcmVzZXQgaCA9XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggaC5kYXRhIGluXG4gIGlmIE9iai5zaXplIChPYmoucmVwciBoKSA8IDQgKCogY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBoYXNoIHRhYmxlcyAqKVxuICAgIHx8IGxlbiA9IGFicyBoLmluaXRpYWxfc2l6ZSB0aGVuXG4gICAgY2xlYXIgaFxuICBlbHNlIGJlZ2luXG4gICAgaC5zaXplIDwtIDA7XG4gICAgaC5kYXRhIDwtIEFycmF5Lm1ha2UgKGFicyBoLmluaXRpYWxfc2l6ZSkgRW1wdHlcbiAgZW5kXG5cbmxldCBjb3B5X2J1Y2tldGxpc3QgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IEVtcHR5XG4gIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgbGV0IHJlYyBsb29wIHByZWMgPSBmdW5jdGlvblxuICAgICAgICB8IEVtcHR5IC0+ICgpXG4gICAgICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgICAgbGV0IHIgPSBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgICB8IENvbnMgcHJlYyAtPiAgcHJlYy5uZXh0IDwtIHJcbiAgICAgICAgICAgIGVuZDtcbiAgICAgICAgICAgIGxvb3AgciBuZXh0XG4gICAgICBpblxuICAgICAgbGV0IHIgPSBDb25zIHtrZXk7IGRhdGE7IG5leHR9IGluXG4gICAgICBsb29wIHIgbmV4dDtcbiAgICAgIHJcblxubGV0IGNvcHkgaCA9IHsgaCB3aXRoIGRhdGEgPSBBcnJheS5tYXAgY29weV9idWNrZXRsaXN0IGguZGF0YSB9XG5cbmxldCBsZW5ndGggaCA9IGguc2l6ZVxuXG5sZXQgaW5zZXJ0X2FsbF9idWNrZXRzIGluZGV4ZnVuIGlucGxhY2Ugb2RhdGEgbmRhdGEgPVxuICBsZXQgbnNpemUgPSBBcnJheS5sZW5ndGggbmRhdGEgaW5cbiAgbGV0IG5kYXRhX3RhaWwgPSBBcnJheS5tYWtlIG5zaXplIEVtcHR5IGluXG4gIGxldCByZWMgaW5zZXJ0X2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSBhcyBjZWxsIC0+XG4gICAgICAgIGxldCBjZWxsID1cbiAgICAgICAgICBpZiBpbnBsYWNlIHRoZW4gY2VsbFxuICAgICAgICAgIGVsc2UgQ29ucyB7a2V5OyBkYXRhOyBuZXh0ID0gRW1wdHl9XG4gICAgICAgIGluXG4gICAgICAgIGxldCBuaWR4ID0gaW5kZXhmdW4ga2V5IGluXG4gICAgICAgIGJlZ2luIG1hdGNoIG5kYXRhX3RhaWwuKG5pZHgpIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBuZGF0YS4obmlkeCkgPC0gY2VsbDtcbiAgICAgICAgfCBDb25zIHRhaWwgLT4gdGFpbC5uZXh0IDwtIGNlbGw7XG4gICAgICAgIGVuZDtcbiAgICAgICAgbmRhdGFfdGFpbC4obmlkeCkgPC0gY2VsbDtcbiAgICAgICAgaW5zZXJ0X2J1Y2tldCBuZXh0XG4gIGluXG4gIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggb2RhdGEgLSAxIGRvXG4gICAgaW5zZXJ0X2J1Y2tldCBvZGF0YS4oaSlcbiAgZG9uZTtcbiAgaWYgaW5wbGFjZSB0aGVuXG4gICAgZm9yIGkgPSAwIHRvIG5zaXplIC0gMSBkb1xuICAgICAgbWF0Y2ggbmRhdGFfdGFpbC4oaSkgd2l0aFxuICAgICAgfCBFbXB0eSAtPiAoKVxuICAgICAgfCBDb25zIHRhaWwgLT4gdGFpbC5uZXh0IDwtIEVtcHR5XG4gICAgZG9uZVxuXG5sZXQgcmVzaXplIGluZGV4ZnVuIGggPVxuICBsZXQgb2RhdGEgPSBoLmRhdGEgaW5cbiAgbGV0IG9zaXplID0gQXJyYXkubGVuZ3RoIG9kYXRhIGluXG4gIGxldCBuc2l6ZSA9IG9zaXplICogMiBpblxuICBpZiBuc2l6ZSA8IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIHRoZW4gYmVnaW5cbiAgICBsZXQgbmRhdGEgPSBBcnJheS5tYWtlIG5zaXplIEVtcHR5IGluXG4gICAgbGV0IGlucGxhY2UgPSBub3QgKG9uZ29pbmdfdHJhdmVyc2FsIGgpIGluXG4gICAgaC5kYXRhIDwtIG5kYXRhOyAgICAgICAgICAoKiBzbyB0aGF0IGluZGV4ZnVuIHNlZXMgdGhlIG5ldyBidWNrZXQgY291bnQgKilcbiAgICBpbnNlcnRfYWxsX2J1Y2tldHMgKGluZGV4ZnVuIGgpIGlucGxhY2Ugb2RhdGEgbmRhdGFcbiAgZW5kXG5cbmxldCBpdGVyIGYgaCA9XG4gIGxldCByZWMgZG9fYnVja2V0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+XG4gICAgICAgICgpXG4gICAgfCBDb25ze2tleTsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgZiBrZXkgZGF0YTsgZG9fYnVja2V0IG5leHQgaW5cbiAgbGV0IG9sZF90cmF2ID0gb25nb2luZ190cmF2ZXJzYWwgaCBpblxuICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gIHRyeVxuICAgIGxldCBkID0gaC5kYXRhIGluXG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkIC0gMSBkb1xuICAgICAgZG9fYnVja2V0IGQuKGkpXG4gICAgZG9uZTtcbiAgICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG5sZXQgcmVjIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgcHJlYyA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIGJlZ2luIG1hdGNoIHByZWMgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIEVtcHR5XG4gICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gRW1wdHlcbiAgICAgIGVuZFxuICB8IChDb25zICh7a2V5OyBkYXRhOyBuZXh0fSBhcyBjKSkgYXMgc2xvdCAtPlxuICAgICAgYmVnaW4gbWF0Y2ggZiBrZXkgZGF0YSB3aXRoXG4gICAgICB8IE5vbmUgLT5cbiAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIHByZWMgbmV4dFxuICAgICAgfCBTb21lIGRhdGEgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gc2xvdFxuICAgICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBzbG90XG4gICAgICAgICAgZW5kO1xuICAgICAgICAgIGMuZGF0YSA8LSBkYXRhO1xuICAgICAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgc2xvdCBuZXh0XG4gICAgICBlbmRcblxubGV0IGZpbHRlcl9tYXBfaW5wbGFjZSBmIGggPVxuICBsZXQgZCA9IGguZGF0YSBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkIC0gMSBkb1xuICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBFbXB0eSBoLmRhdGEuKGkpXG4gICAgZG9uZTtcbiAgICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGhcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbmxldCBmb2xkIGYgaCBpbml0ID1cbiAgbGV0IHJlYyBkb19idWNrZXQgYiBhY2N1ID1cbiAgICBtYXRjaCBiIHdpdGhcbiAgICAgIEVtcHR5IC0+XG4gICAgICAgIGFjY3VcbiAgICB8IENvbnN7a2V5OyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICBkb19idWNrZXQgbmV4dCAoZiBrZXkgZGF0YSBhY2N1KSBpblxuICBsZXQgb2xkX3RyYXYgPSBvbmdvaW5nX3RyYXZlcnNhbCBoIGluXG4gIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgdHJ5XG4gICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICBsZXQgYWNjdSA9IHJlZiBpbml0IGluXG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkIC0gMSBkb1xuICAgICAgYWNjdSA6PSBkb19idWNrZXQgZC4oaSkgIWFjY3VcbiAgICBkb25lO1xuICAgIGlmIG5vdCBvbGRfdHJhdiB0aGVuIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICAhYWNjdVxuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxudHlwZSBzdGF0aXN0aWNzID0ge1xuICBudW1fYmluZGluZ3M6IGludDtcbiAgbnVtX2J1Y2tldHM6IGludDtcbiAgbWF4X2J1Y2tldF9sZW5ndGg6IGludDtcbiAgYnVja2V0X2hpc3RvZ3JhbTogaW50IGFycmF5XG59XG5cbmxldCByZWMgYnVja2V0X2xlbmd0aCBhY2N1ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhY2N1XG4gIHwgQ29uc3tuZXh0fSAtPiBidWNrZXRfbGVuZ3RoIChhY2N1ICsgMSkgbmV4dFxuXG5sZXQgc3RhdHMgaCA9XG4gIGxldCBtYmwgPVxuICAgIEFycmF5LmZvbGRfbGVmdCAoZnVuIG0gYiAtPiBJbnQubWF4IG0gKGJ1Y2tldF9sZW5ndGggMCBiKSkgMCBoLmRhdGEgaW5cbiAgbGV0IGhpc3RvID0gQXJyYXkubWFrZSAobWJsICsgMSkgMCBpblxuICBBcnJheS5pdGVyXG4gICAgKGZ1biBiIC0+XG4gICAgICBsZXQgbCA9IGJ1Y2tldF9sZW5ndGggMCBiIGluXG4gICAgICBoaXN0by4obCkgPC0gaGlzdG8uKGwpICsgMSlcbiAgICBoLmRhdGE7XG4gIHsgbnVtX2JpbmRpbmdzID0gaC5zaXplO1xuICAgIG51bV9idWNrZXRzID0gQXJyYXkubGVuZ3RoIGguZGF0YTtcbiAgICBtYXhfYnVja2V0X2xlbmd0aCA9IG1ibDtcbiAgICBidWNrZXRfaGlzdG9ncmFtID0gaGlzdG8gfVxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHRibCA9XG4gICgqIGNhcHR1cmUgY3VycmVudCBhcnJheSwgc28gdGhhdCBldmVuIGlmIHRoZSB0YWJsZSBpcyByZXNpemVkIHdlXG4gICAgIGtlZXAgaXRlcmF0aW5nIG9uIHRoZSBzYW1lIGFycmF5ICopXG4gIGxldCB0YmxfZGF0YSA9IHRibC5kYXRhIGluXG4gICgqIHN0YXRlOiBpbmRleCAqIG5leHQgYnVja2V0IHRvIHRyYXZlcnNlICopXG4gIGxldCByZWMgYXV4IGkgYnVjayAoKSA9IG1hdGNoIGJ1Y2sgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgaWYgaSA9IEFycmF5Lmxlbmd0aCB0YmxfZGF0YVxuICAgICAgICB0aGVuIFNlcS5OaWxcbiAgICAgICAgZWxzZSBhdXgoaSsxKSB0YmxfZGF0YS4oaSkgKClcbiAgICB8IENvbnMge2tleTsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgU2VxLkNvbnMgKChrZXksIGRhdGEpLCBhdXggaSBuZXh0KVxuICBpblxuICBhdXggMCBFbXB0eVxuXG5sZXQgdG9fc2VxX2tleXMgbSA9IFNlcS5tYXAgZnN0ICh0b19zZXEgbSlcblxubGV0IHRvX3NlcV92YWx1ZXMgbSA9IFNlcS5tYXAgc25kICh0b19zZXEgbSlcblxuKCogRnVuY3RvcmlhbCBpbnRlcmZhY2UgKilcblxubW9kdWxlIHR5cGUgSGFzaGVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgaGFzaDogdCAtPiBpbnRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFNlZWRlZEhhc2hlZFR5cGUgPVxuICBzaWdcbiAgICB0eXBlIHRcbiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIHNlZWRlZF9oYXNoOiBpbnQgLT4gdCAtPiBpbnRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFMgPVxuICBzaWdcbiAgICB0eXBlIGtleVxuICAgIHR5cGUgISdhIHRcbiAgICB2YWwgY3JlYXRlOiBpbnQgLT4gJ2EgdFxuICAgIHZhbCBjbGVhciA6ICdhIHQgLT4gdW5pdFxuICAgIHZhbCByZXNldCA6ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBjb3B5OiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgYWRkOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIHJlbW92ZTogJ2EgdCAtPiBrZXkgLT4gdW5pdFxuICAgIHZhbCBmaW5kOiAnYSB0IC0+IGtleSAtPiAnYVxuICAgIHZhbCBmaW5kX29wdDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIGZpbmRfYWxsOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gICAgdmFsIHJlcGxhY2UgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgICB2YWwgaXRlcjogKGtleSAtPiAnYSAtPiB1bml0KSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZmlsdGVyX21hcF9pbnBsYWNlOiAoa2V5IC0+ICdhIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZvbGQ6IChrZXkgLT4gJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdhIHQgLT4gJ2IgLT4gJ2JcbiAgICB2YWwgbGVuZ3RoOiAnYSB0IC0+IGludFxuICAgIHZhbCBzdGF0czogJ2EgdCAtPiBzdGF0aXN0aWNzXG4gICAgdmFsIHRvX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19zZXFfa2V5cyA6IF8gdCAtPiBrZXkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX3ZhbHVlcyA6ICdhIHQgLT4gJ2EgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIHJlcGxhY2Vfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTZWVkZWRTID1cbiAgc2lnXG4gICAgdHlwZSBrZXlcbiAgICB0eXBlICEnYSB0XG4gICAgdmFsIGNyZWF0ZSA6ID9yYW5kb206Ym9vbCAtPiBpbnQgLT4gJ2EgdFxuICAgIHZhbCBjbGVhciA6ICdhIHQgLT4gdW5pdFxuICAgIHZhbCByZXNldCA6ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBjb3B5IDogJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGFkZCA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiBrZXkgLT4gdW5pdFxuICAgIHZhbCBmaW5kIDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgICB2YWwgZmluZF9vcHQ6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICAgIHZhbCBmaW5kX2FsbCA6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgbWVtIDogJ2EgdCAtPiBrZXkgLT4gYm9vbFxuICAgIHZhbCBpdGVyIDogKGtleSAtPiAnYSAtPiB1bml0KSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZmlsdGVyX21hcF9pbnBsYWNlOiAoa2V5IC0+ICdhIC0+ICdhIG9wdGlvbikgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZvbGQgOiAoa2V5IC0+ICdhIC0+ICdiIC0+ICdiKSAtPiAnYSB0IC0+ICdiIC0+ICdiXG4gICAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gICAgdmFsIHN0YXRzOiAnYSB0IC0+IHN0YXRpc3RpY3NcbiAgICB2YWwgdG9fc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9rZXlzIDogXyB0IC0+IGtleSBTZXEudFxuICAgIHZhbCB0b19zZXFfdmFsdWVzIDogJ2EgdCAtPiAnYSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgcmVwbGFjZV9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgZW5kXG5cbm1vZHVsZSBNYWtlU2VlZGVkKEg6IFNlZWRlZEhhc2hlZFR5cGUpOiAoU2VlZGVkUyB3aXRoIHR5cGUga2V5ID0gSC50KSA9XG4gIHN0cnVjdFxuICAgIHR5cGUga2V5ID0gSC50XG4gICAgdHlwZSAnYSBoYXNodGJsID0gKGtleSwgJ2EpIHRcbiAgICB0eXBlICdhIHQgPSAnYSBoYXNodGJsXG4gICAgbGV0IGNyZWF0ZSA9IGNyZWF0ZVxuICAgIGxldCBjbGVhciA9IGNsZWFyXG4gICAgbGV0IHJlc2V0ID0gcmVzZXRcbiAgICBsZXQgY29weSA9IGNvcHlcblxuICAgIGxldCBrZXlfaW5kZXggaCBrZXkgPVxuICAgICAgKEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSkgbGFuZCAoQXJyYXkubGVuZ3RoIGguZGF0YSAtIDEpXG5cbiAgICBsZXQgYWRkIGgga2V5IGRhdGEgPVxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgICAgIGxldCBidWNrZXQgPSBDb25ze2tleTsgZGF0YTsgbmV4dD1oLmRhdGEuKGkpfSBpblxuICAgICAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcblxuICAgIGxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICgpXG4gICAgICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiBiZWdpblxuICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBuZXh0XG4gICAgICAgICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gbmV4dFxuICAgICAgICAgIGVuZFxuICAgICAgICAgIGVsc2UgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IGMgbmV4dFxuXG4gICAgbGV0IHJlbW92ZSBoIGtleSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IEVtcHR5IGguZGF0YS4oaSlcblxuICAgIGxldCByZWMgZmluZF9yZWMga2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrIHRoZW4gZGF0YSBlbHNlIGZpbmRfcmVjIGtleSBuZXh0XG5cbiAgICBsZXQgZmluZCBoIGtleSA9XG4gICAgICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazEgdGhlbiBkMSBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazIgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGszIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxuICAgIGxldCByZWMgZmluZF9yZWNfb3B0IGtleSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsgdGhlbiBTb21lIGRhdGEgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHRcblxuICAgIGxldCBmaW5kX29wdCBoIGtleSA9XG4gICAgICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsxIHRoZW4gU29tZSBkMSBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsyIHRoZW4gU29tZSBkMiBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMyB0aGVuIFNvbWUgZDMgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHQzXG5cbiAgICBsZXQgZmluZF9hbGwgaCBrZXkgPVxuICAgICAgbGV0IHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgW11cbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YT1kOyBuZXh0fSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwgayBrZXlcbiAgICAgICAgICB0aGVuIGQgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgICAgIGVsc2UgZmluZF9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICB0cnVlXG4gICAgICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiAoc2xvdC5rZXkgPC0ga2V5OyBzbG90LmRhdGEgPC0gZGF0YTsgZmFsc2UpXG4gICAgICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgICAgIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnN7a2V5OyBkYXRhOyBuZXh0PWx9O1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICAgICAgZW5kXG5cbiAgICBsZXQgbWVtIGgga2V5ID1cbiAgICAgIGxldCByZWMgbWVtX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgICAgICBILmVxdWFsIGsga2V5IHx8IG1lbV9pbl9idWNrZXQgbmV4dCBpblxuICAgICAgbWVtX2luX2J1Y2tldCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSlcblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgICBsZXQgaXRlciA9IGl0ZXJcbiAgICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBzdGF0cyA9IHN0YXRzXG4gICAgbGV0IHRvX3NlcSA9IHRvX3NlcVxuICAgIGxldCB0b19zZXFfa2V5cyA9IHRvX3NlcV9rZXlzXG4gICAgbGV0IHRvX3NlcV92YWx1ZXMgPSB0b19zZXFfdmFsdWVzXG4gIGVuZFxuXG5tb2R1bGUgTWFrZShIOiBIYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4oKiBQb2x5bW9ycGhpYyBoYXNoIGZ1bmN0aW9uLWJhc2VkIHRhYmxlcyAqKVxuKCogQ29kZSBpbmNsdWRlZCBiZWxvdyB0aGUgZnVuY3RvcmlhbCBpbnRlcmZhY2UgdG8gZ3VhcmQgYWdhaW5zdCBhY2NpZGVudGFsXG4gICB1c2UgLSBzZWUgIzIyMDIgKilcblxuZXh0ZXJuYWwgc2VlZGVkX2hhc2hfcGFyYW0gOlxuICBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiBpbnQgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5cbmxldCBoYXNoIHggPSBzZWVkZWRfaGFzaF9wYXJhbSAxMCAxMDAgMCB4XG5sZXQgaGFzaF9wYXJhbSBuMSBuMiB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gbjEgbjIgMCB4XG5sZXQgc2VlZGVkX2hhc2ggc2VlZCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIHNlZWQgeFxuXG5sZXQga2V5X2luZGV4IGgga2V5ID1cbiAgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDRcbiAgdGhlbiAoc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIGguc2VlZCBrZXkpIGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuICBlbHNlIGludmFsaWRfYXJnIFwiSGFzaHRibDogdW5zdXBwb3J0ZWQgaGFzaCB0YWJsZSBmb3JtYXRcIlxuXG5sZXQgYWRkIGgga2V5IGRhdGEgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICBsZXQgYnVja2V0ID0gQ29uc3trZXk7IGRhdGE7IG5leHQ9aC5kYXRhLihpKX0gaW5cbiAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG5cbmxldCByZWMgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IHByZWMgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICAoKVxuICB8IChDb25zIHtrZXk9azsgbmV4dH0pIGFzIGMgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGJlZ2luXG4gICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICBtYXRjaCBwcmVjIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIG5leHRcbiAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIG5leHRcbiAgICAgIGVuZFxuICAgICAgZWxzZSByZW1vdmVfYnVja2V0IGggaSBrZXkgYyBuZXh0XG5cbmxldCByZW1vdmUgaCBrZXkgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICByZW1vdmVfYnVja2V0IGggaSBrZXkgRW1wdHkgaC5kYXRhLihpKVxuXG5sZXQgcmVjIGZpbmRfcmVjIGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIGRhdGEgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dFxuXG5sZXQgZmluZCBoIGtleSA9XG4gIG1hdGNoIGguZGF0YS4oa2V5X2luZGV4IGgga2V5KSB3aXRoXG4gIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrMSA9IDAgdGhlbiBkMSBlbHNlXG4gICAgICBtYXRjaCBuZXh0MSB3aXRoXG4gICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMiA9IDAgdGhlbiBkMiBlbHNlXG4gICAgICAgICAgbWF0Y2ggbmV4dDIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgaWYgY29tcGFyZSBrZXkgazMgPSAwIHRoZW4gZDMgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dDNcblxubGV0IHJlYyBmaW5kX3JlY19vcHQga2V5ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgTm9uZVxuICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrID0gMCB0aGVuIFNvbWUgZGF0YSBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dFxuXG5sZXQgZmluZF9vcHQgaCBrZXkgPVxuICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgIGlmIGNvbXBhcmUga2V5IGsxID0gMCB0aGVuIFNvbWUgZDEgZWxzZVxuICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGsyID0gMCB0aGVuIFNvbWUgZDIgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMyA9IDAgdGhlbiBTb21lIGQzIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0M1xuXG5sZXQgZmluZF9hbGwgaCBrZXkgPVxuICBsZXQgcmVjIGZpbmRfaW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgW11cbiAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgaWYgY29tcGFyZSBrIGtleSA9IDBcbiAgICAgIHRoZW4gZGF0YSA6OiBmaW5kX2luX2J1Y2tldCBuZXh0XG4gICAgICBlbHNlIGZpbmRfaW5fYnVja2V0IG5leHQgaW5cbiAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbmxldCByZWMgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoe2tleT1rOyBuZXh0fSBhcyBzbG90KSAtPlxuICAgICAgaWYgY29tcGFyZSBrIGtleSA9IDBcbiAgICAgIHRoZW4gKHNsb3Qua2V5IDwtIGtleTsgc2xvdC5kYXRhIDwtIGRhdGE7IGZhbHNlKVxuICAgICAgZWxzZSByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBuZXh0XG5cbmxldCByZXBsYWNlIGgga2V5IGRhdGEgPVxuICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICBsZXQgbCA9IGguZGF0YS4oaSkgaW5cbiAgaWYgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbCB0aGVuIGJlZ2luXG4gICAgaC5kYXRhLihpKSA8LSBDb25ze2tleTsgZGF0YTsgbmV4dD1sfTtcbiAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG4gIGVuZFxuXG5sZXQgbWVtIGgga2V5ID1cbiAgbGV0IHJlYyBtZW1faW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgZmFsc2VcbiAgfCBDb25ze2tleT1rOyBuZXh0fSAtPlxuICAgICAgY29tcGFyZSBrIGtleSA9IDAgfHwgbWVtX2luX2J1Y2tldCBuZXh0IGluXG4gIG1lbV9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbmxldCBhZGRfc2VxIHRibCBpID1cbiAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiBhZGQgdGJsIGsgdikgaVxuXG5sZXQgcmVwbGFjZV9zZXEgdGJsIGkgPVxuICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG5sZXQgb2Zfc2VxIGkgPVxuICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gIHJlcGxhY2Vfc2VxIHRibCBpO1xuICB0YmxcblxubGV0IHJlYnVpbGQgPyhyYW5kb20gPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWQpIGggPVxuICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgKEFycmF5Lmxlbmd0aCBoLmRhdGEpIGluXG4gIGxldCBzZWVkID1cbiAgICBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcHJuZ19rZXkpXG4gICAgZWxzZSBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNCB0aGVuIGguc2VlZFxuICAgIGVsc2UgMCBpblxuICBsZXQgaCcgPSB7XG4gICAgc2l6ZSA9IGguc2l6ZTtcbiAgICBkYXRhID0gQXJyYXkubWFrZSBzIEVtcHR5O1xuICAgIHNlZWQgPSBzZWVkO1xuICAgIGluaXRpYWxfc2l6ZSA9IGlmIE9iai5zaXplIChPYmoucmVwciBoKSA+PSA0IHRoZW4gaC5pbml0aWFsX3NpemUgZWxzZSBzXG4gIH0gaW5cbiAgaW5zZXJ0X2FsbF9idWNrZXRzIChrZXlfaW5kZXggaCcpIGZhbHNlIGguZGF0YSBoJy5kYXRhO1xuICBoJ1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiogV2VhayBhcnJheSBvcGVyYXRpb25zICopXG5cbnR5cGUgISdhIHRcblxuZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+ICdhIHQgPSBcImNhbWxfd2Vha19jcmVhdGVcIlxuXG4oKiogbnVtYmVyIG9mIGFkZGl0aW9uYWwgdmFsdWVzIGluIGEgd2VhayBwb2ludGVyXG4gKiAgICAtIExpbmtcbiAqICAgIC0gRGF0YSAqKVxubGV0IGFkZGl0aW9uYWxfdmFsdWVzID0gMiAoKiBDQU1MX0VQSEVfRklSU1RfS0VZIGluIHdlYWsuaCAqKVxuXG5sZXQgY3JlYXRlIGwgPVxuICBpZiBub3QgKDAgPD0gbCAmJiBsIDw9IE9iai5FcGhlbWVyb24ubWF4X2VwaGVfbGVuZ3RoKSB0aGVuXG4gICAgaW52YWxpZF9hcmcoXCJXZWFrLmNyZWF0ZVwiKTtcbiAgY3JlYXRlIGxcblxuXG5sZXQgbGVuZ3RoIHggPSBPYmouc2l6ZShPYmoucmVwciB4KSAtIGFkZGl0aW9uYWxfdmFsdWVzXG5cbmxldCByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gbXNnID1cbiAgaWYgbm90ICgwIDw9IG8gJiYgbyA8IGxlbmd0aCBlKSB0aGVuXG4gICAgaW52YWxpZF9hcmcobXNnKVxuXG5leHRlcm5hbCBzZXQnIDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3NldF9rZXlcIlxuZXh0ZXJuYWwgdW5zZXQgOiAnYSB0IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfdW5zZXRfa2V5XCJcbmxldCBzZXQgZSBvIHggPVxuICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJXZWFrLnNldFwiO1xuICBtYXRjaCB4IHdpdGhcbiAgfCBOb25lIC0+IHVuc2V0IGUgb1xuICB8IFNvbWUgeCAtPiBzZXQnIGUgbyB4XG5cbmV4dGVybmFsIGdldCA6ICdhIHQgLT4gaW50IC0+ICdhIG9wdGlvbiA9IFwiY2FtbF93ZWFrX2dldFwiXG5sZXQgZ2V0IGUgbyA9XG4gIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIldlYWsuZ2V0XCI7XG4gIGdldCBlIG9cblxuZXh0ZXJuYWwgZ2V0X2NvcHkgOiAnYSB0IC0+IGludCAtPiAnYSBvcHRpb24gPSBcImNhbWxfd2Vha19nZXRfY29weVwiXG5sZXQgZ2V0X2NvcHkgZSBvID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5nZXRfY29weVwiO1xuICBnZXRfY29weSBlIG9cblxuZXh0ZXJuYWwgY2hlY2sgOiAnYSB0IC0+IGludCAtPiBib29sID0gXCJjYW1sX3dlYWtfY2hlY2tcIlxubGV0IGNoZWNrIGUgbyA9XG4gIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIldlYWsuY2hlY2tcIjtcbiAgY2hlY2sgZSBvXG5cbmV4dGVybmFsIGJsaXQgOiAnYSB0IC0+IGludCAtPiAnYSB0IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF93ZWFrX2JsaXRcIlxuXG4oKiBibGl0OiBzcmMgc3Jjb2ZmIGRzdCBkc3RvZmYgbGVuICopXG5sZXQgYmxpdCBlMSBvMSBlMiBvMiBsID1cbiAgaWYgbCA8IDAgfHwgbzEgPCAwIHx8IG8xID4gbGVuZ3RoIGUxIC0gbFxuICAgICB8fCBvMiA8IDAgfHwgbzIgPiBsZW5ndGggZTIgLSBsXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJXZWFrLmJsaXRcIlxuICBlbHNlIGlmIGwgPD4gMCB0aGVuIGJsaXQgZTEgbzEgZTIgbzIgbFxuXG5sZXQgZmlsbCBhciBvZnMgbGVuIHggPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIGFyIC0gbGVuXG4gIHRoZW4gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgXCJXZWFrLmZpbGxcIilcbiAgZWxzZSBiZWdpblxuICAgIGZvciBpID0gb2ZzIHRvIChvZnMgKyBsZW4gLSAxKSBkb1xuICAgICAgc2V0IGFyIGkgeFxuICAgIGRvbmVcbiAgZW5kXG5cblxuKCoqIFdlYWsgaGFzaCB0YWJsZXMgKilcblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB0eXBlIGRhdGFcbiAgdHlwZSB0XG4gIHZhbCBjcmVhdGUgOiBpbnQgLT4gdFxuICB2YWwgY2xlYXIgOiB0IC0+IHVuaXRcbiAgdmFsIG1lcmdlIDogdCAtPiBkYXRhIC0+IGRhdGFcbiAgdmFsIGFkZCA6IHQgLT4gZGF0YSAtPiB1bml0XG4gIHZhbCByZW1vdmUgOiB0IC0+IGRhdGEgLT4gdW5pdFxuICB2YWwgZmluZCA6IHQgLT4gZGF0YSAtPiBkYXRhXG4gIHZhbCBmaW5kX29wdCA6IHQgLT4gZGF0YSAtPiBkYXRhIG9wdGlvblxuICB2YWwgZmluZF9hbGwgOiB0IC0+IGRhdGEgLT4gZGF0YSBsaXN0XG4gIHZhbCBtZW0gOiB0IC0+IGRhdGEgLT4gYm9vbFxuICB2YWwgaXRlciA6IChkYXRhIC0+IHVuaXQpIC0+IHQgLT4gdW5pdFxuICB2YWwgZm9sZCA6IChkYXRhIC0+ICdhIC0+ICdhKSAtPiB0IC0+ICdhIC0+ICdhXG4gIHZhbCBjb3VudCA6IHQgLT4gaW50XG4gIHZhbCBzdGF0cyA6IHQgLT4gaW50ICogaW50ICogaW50ICogaW50ICogaW50ICogaW50XG5lbmRcblxubW9kdWxlIE1ha2UgKEggOiBIYXNodGJsLkhhc2hlZFR5cGUpIDogKFMgd2l0aCB0eXBlIGRhdGEgPSBILnQpID0gc3RydWN0XG5cbiAgdHlwZSAnYSB3ZWFrX3QgPSAnYSB0XG4gIGxldCB3ZWFrX2NyZWF0ZSA9IGNyZWF0ZVxuICBsZXQgZW1wdHlidWNrZXQgPSB3ZWFrX2NyZWF0ZSAwXG5cbiAgdHlwZSBkYXRhID0gSC50XG5cbiAgdHlwZSB0ID0ge1xuICAgIG11dGFibGUgdGFibGUgOiBkYXRhIHdlYWtfdCBhcnJheTtcbiAgICBtdXRhYmxlIGhhc2hlcyA6IGludCBhcnJheSBhcnJheTtcbiAgICBtdXRhYmxlIGxpbWl0IDogaW50OyAgICAgICAgICAgICAgICgqIGJ1Y2tldCBzaXplIGxpbWl0ICopXG4gICAgbXV0YWJsZSBvdmVyc2l6ZSA6IGludDsgICAgICAgICAgICAoKiBudW1iZXIgb2Ygb3ZlcnNpemUgYnVja2V0cyAqKVxuICAgIG11dGFibGUgcm92ZXIgOiBpbnQ7ICAgICAgICAgICAgICAgKCogZm9yIGludGVybmFsIGJvb2trZWVwaW5nICopXG4gIH1cblxuICBsZXQgZ2V0X2luZGV4IHQgaCA9IChoIGxhbmQgbWF4X2ludCkgbW9kIChBcnJheS5sZW5ndGggdC50YWJsZSlcblxuICBsZXQgbGltaXQgPSA3XG4gIGxldCBvdmVyX2xpbWl0ID0gMlxuXG4gIGxldCBjcmVhdGUgc3ogPVxuICAgIGxldCBzeiA9IGlmIHN6IDwgNyB0aGVuIDcgZWxzZSBzeiBpblxuICAgIGxldCBzeiA9IGlmIHN6ID4gU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiBTeXMubWF4X2FycmF5X2xlbmd0aCBlbHNlIHN6IGluXG4gICAge1xuICAgICAgdGFibGUgPSBBcnJheS5tYWtlIHN6IGVtcHR5YnVja2V0O1xuICAgICAgaGFzaGVzID0gQXJyYXkubWFrZSBzeiBbfCB8XTtcbiAgICAgIGxpbWl0ID0gbGltaXQ7XG4gICAgICBvdmVyc2l6ZSA9IDA7XG4gICAgICByb3ZlciA9IDA7XG4gICAgfVxuXG4gIGxldCBjbGVhciB0ID1cbiAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIHQudGFibGUgLSAxIGRvXG4gICAgICB0LnRhYmxlLihpKSA8LSBlbXB0eWJ1Y2tldDtcbiAgICAgIHQuaGFzaGVzLihpKSA8LSBbfCB8XTtcbiAgICBkb25lO1xuICAgIHQubGltaXQgPC0gbGltaXQ7XG4gICAgdC5vdmVyc2l6ZSA8LSAwXG5cblxuICBsZXQgZm9sZCBmIHQgaW5pdCA9XG4gICAgbGV0IHJlYyBmb2xkX2J1Y2tldCBpIGIgYWNjdSA9XG4gICAgICBpZiBpID49IGxlbmd0aCBiIHRoZW4gYWNjdSBlbHNlXG4gICAgICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgICAgIHwgU29tZSB2IC0+IGZvbGRfYnVja2V0IChpKzEpIGIgKGYgdiBhY2N1KVxuICAgICAgfCBOb25lIC0+IGZvbGRfYnVja2V0IChpKzEpIGIgYWNjdVxuICAgIGluXG4gICAgQXJyYXkuZm9sZF9yaWdodCAoZm9sZF9idWNrZXQgMCkgdC50YWJsZSBpbml0XG5cblxuICBsZXQgaXRlciBmIHQgPVxuICAgIGxldCByZWMgaXRlcl9idWNrZXQgaSBiID1cbiAgICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiAoKSBlbHNlXG4gICAgICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgICAgIHwgU29tZSB2IC0+IGYgdjsgaXRlcl9idWNrZXQgKGkrMSkgYlxuICAgICAgfCBOb25lIC0+IGl0ZXJfYnVja2V0IChpKzEpIGJcbiAgICBpblxuICAgIEFycmF5Lml0ZXIgKGl0ZXJfYnVja2V0IDApIHQudGFibGVcblxuXG4gIGxldCBpdGVyX3dlYWsgZiB0ID1cbiAgICBsZXQgcmVjIGl0ZXJfYnVja2V0IGkgaiBiID1cbiAgICAgIGlmIGkgPj0gbGVuZ3RoIGIgdGhlbiAoKSBlbHNlXG4gICAgICBtYXRjaCBjaGVjayBiIGkgd2l0aFxuICAgICAgfCB0cnVlIC0+IGYgYiB0Lmhhc2hlcy4oaikgaTsgaXRlcl9idWNrZXQgKGkrMSkgaiBiXG4gICAgICB8IGZhbHNlIC0+IGl0ZXJfYnVja2V0IChpKzEpIGogYlxuICAgIGluXG4gICAgQXJyYXkuaXRlcmkgKGl0ZXJfYnVja2V0IDApIHQudGFibGVcblxuXG4gIGxldCByZWMgY291bnRfYnVja2V0IGkgYiBhY2N1ID1cbiAgICBpZiBpID49IGxlbmd0aCBiIHRoZW4gYWNjdSBlbHNlXG4gICAgY291bnRfYnVja2V0IChpKzEpIGIgKGFjY3UgKyAoaWYgY2hlY2sgYiBpIHRoZW4gMSBlbHNlIDApKVxuXG5cbiAgbGV0IGNvdW50IHQgPVxuICAgIEFycmF5LmZvbGRfcmlnaHQgKGNvdW50X2J1Y2tldCAwKSB0LnRhYmxlIDBcblxuXG4gIGxldCBuZXh0X3N6IG4gPSBJbnQubWluICgzICogbiAvIDIgKyAzKSBTeXMubWF4X2FycmF5X2xlbmd0aFxuICBsZXQgcHJldl9zeiBuID0gKChuIC0gMykgKiAyICsgMikgLyAzXG5cbiAgbGV0IHRlc3Rfc2hyaW5rX2J1Y2tldCB0ID1cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4odC5yb3ZlcikgaW5cbiAgICBsZXQgaGJ1Y2tldCA9IHQuaGFzaGVzLih0LnJvdmVyKSBpblxuICAgIGxldCBsZW4gPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHByZXZfbGVuID0gcHJldl9zeiBsZW4gaW5cbiAgICBsZXQgbGl2ZSA9IGNvdW50X2J1Y2tldCAwIGJ1Y2tldCAwIGluXG4gICAgaWYgbGl2ZSA8PSBwcmV2X2xlbiB0aGVuIGJlZ2luXG4gICAgICBsZXQgcmVjIGxvb3AgaSBqID1cbiAgICAgICAgaWYgaiA+PSBwcmV2X2xlbiB0aGVuIGJlZ2luXG4gICAgICAgICAgaWYgY2hlY2sgYnVja2V0IGkgdGhlbiBsb29wIChpICsgMSkgalxuICAgICAgICAgIGVsc2UgaWYgY2hlY2sgYnVja2V0IGogdGhlbiBiZWdpblxuICAgICAgICAgICAgYmxpdCBidWNrZXQgaiBidWNrZXQgaSAxO1xuICAgICAgICAgICAgaGJ1Y2tldC4oaSkgPC0gaGJ1Y2tldC4oaik7XG4gICAgICAgICAgICBsb29wIChpICsgMSkgKGogLSAxKTtcbiAgICAgICAgICBlbmQgZWxzZSBsb29wIGkgKGogLSAxKTtcbiAgICAgICAgZW5kO1xuICAgICAgaW5cbiAgICAgIGxvb3AgMCAobGVuZ3RoIGJ1Y2tldCAtIDEpO1xuICAgICAgaWYgcHJldl9sZW4gPSAwIHRoZW4gYmVnaW5cbiAgICAgICAgdC50YWJsZS4odC5yb3ZlcikgPC0gZW1wdHlidWNrZXQ7XG4gICAgICAgIHQuaGFzaGVzLih0LnJvdmVyKSA8LSBbfCB8XTtcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBuZXdidWNrZXQgPSB3ZWFrX2NyZWF0ZSBwcmV2X2xlbiBpblxuICAgICAgICBibGl0IGJ1Y2tldCAwIG5ld2J1Y2tldCAwIHByZXZfbGVuO1xuICAgICAgICB0LnRhYmxlLih0LnJvdmVyKSA8LSBuZXdidWNrZXQ7XG4gICAgICAgIHQuaGFzaGVzLih0LnJvdmVyKSA8LSBBcnJheS5zdWIgaGJ1Y2tldCAwIHByZXZfbGVuXG4gICAgICBlbmQ7XG4gICAgICBpZiBsZW4gPiB0LmxpbWl0ICYmIHByZXZfbGVuIDw9IHQubGltaXQgdGhlbiB0Lm92ZXJzaXplIDwtIHQub3ZlcnNpemUgLSAxO1xuICAgIGVuZDtcbiAgICB0LnJvdmVyIDwtICh0LnJvdmVyICsgMSkgbW9kIChBcnJheS5sZW5ndGggdC50YWJsZSlcblxuXG4gIGxldCByZWMgcmVzaXplIHQgPVxuICAgIGxldCBvbGRsZW4gPSBBcnJheS5sZW5ndGggdC50YWJsZSBpblxuICAgIGxldCBuZXdsZW4gPSBuZXh0X3N6IG9sZGxlbiBpblxuICAgIGlmIG5ld2xlbiA+IG9sZGxlbiB0aGVuIGJlZ2luXG4gICAgICBsZXQgbmV3dCA9IGNyZWF0ZSBuZXdsZW4gaW5cbiAgICAgIGxldCBhZGRfd2VhayBvYiBvaCBvaSA9XG4gICAgICAgIGxldCBzZXR0ZXIgbmIgbmkgXyA9IGJsaXQgb2Igb2kgbmIgbmkgMSBpblxuICAgICAgICBsZXQgaCA9IG9oLihvaSkgaW5cbiAgICAgICAgYWRkX2F1eCBuZXd0IHNldHRlciBOb25lIGggKGdldF9pbmRleCBuZXd0IGgpO1xuICAgICAgaW5cbiAgICAgIGl0ZXJfd2VhayBhZGRfd2VhayB0O1xuICAgICAgdC50YWJsZSA8LSBuZXd0LnRhYmxlO1xuICAgICAgdC5oYXNoZXMgPC0gbmV3dC5oYXNoZXM7XG4gICAgICB0LmxpbWl0IDwtIG5ld3QubGltaXQ7XG4gICAgICB0Lm92ZXJzaXplIDwtIG5ld3Qub3ZlcnNpemU7XG4gICAgICB0LnJvdmVyIDwtIHQucm92ZXIgbW9kIEFycmF5Lmxlbmd0aCBuZXd0LnRhYmxlO1xuICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICB0LmxpbWl0IDwtIG1heF9pbnQ7ICAgICAgICAgICAgICgqIG1heGltdW0gc2l6ZSBhbHJlYWR5IHJlYWNoZWQgKilcbiAgICAgIHQub3ZlcnNpemUgPC0gMDtcbiAgICBlbmRcblxuICBhbmQgYWRkX2F1eCB0IHNldHRlciBkIGggaW5kZXggPVxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLihpbmRleCkgaW5cbiAgICBsZXQgaGFzaGVzID0gdC5oYXNoZXMuKGluZGV4KSBpblxuICAgIGxldCBzeiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID49IHN6IHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IG5ld3N6ID1cbiAgICAgICAgICBJbnQubWluICgzICogc3ogLyAyICsgMykgKFN5cy5tYXhfYXJyYXlfbGVuZ3RoIC0gYWRkaXRpb25hbF92YWx1ZXMpXG4gICAgICAgIGluXG4gICAgICAgIGlmIG5ld3N6IDw9IHN6IHRoZW4gZmFpbHdpdGggXCJXZWFrLk1ha2U6IGhhc2ggYnVja2V0IGNhbm5vdCBncm93IG1vcmVcIjtcbiAgICAgICAgbGV0IG5ld2J1Y2tldCA9IHdlYWtfY3JlYXRlIG5ld3N6IGluXG4gICAgICAgIGxldCBuZXdoYXNoZXMgPSBBcnJheS5tYWtlIG5ld3N6IDAgaW5cbiAgICAgICAgYmxpdCBidWNrZXQgMCBuZXdidWNrZXQgMCBzejtcbiAgICAgICAgQXJyYXkuYmxpdCBoYXNoZXMgMCBuZXdoYXNoZXMgMCBzejtcbiAgICAgICAgc2V0dGVyIG5ld2J1Y2tldCBzeiBkO1xuICAgICAgICBuZXdoYXNoZXMuKHN6KSA8LSBoO1xuICAgICAgICB0LnRhYmxlLihpbmRleCkgPC0gbmV3YnVja2V0O1xuICAgICAgICB0Lmhhc2hlcy4oaW5kZXgpIDwtIG5ld2hhc2hlcztcbiAgICAgICAgaWYgc3ogPD0gdC5saW1pdCAmJiBuZXdzeiA+IHQubGltaXQgdGhlbiBiZWdpblxuICAgICAgICAgIHQub3ZlcnNpemUgPC0gdC5vdmVyc2l6ZSArIDE7XG4gICAgICAgICAgZm9yIF9pID0gMCB0byBvdmVyX2xpbWl0IGRvIHRlc3Rfc2hyaW5rX2J1Y2tldCB0IGRvbmU7XG4gICAgICAgIGVuZDtcbiAgICAgICAgaWYgdC5vdmVyc2l6ZSA+IEFycmF5Lmxlbmd0aCB0LnRhYmxlIC8gb3Zlcl9saW1pdCB0aGVuIHJlc2l6ZSB0O1xuICAgICAgZW5kIGVsc2UgaWYgY2hlY2sgYnVja2V0IGkgdGhlbiBiZWdpblxuICAgICAgICBsb29wIChpICsgMSlcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIHNldHRlciBidWNrZXQgaSBkO1xuICAgICAgICBoYXNoZXMuKGkpIDwtIGg7XG4gICAgICBlbmQ7XG4gICAgaW5cbiAgICBsb29wIDBcblxuXG4gIGxldCBhZGQgdCBkID1cbiAgICBsZXQgaCA9IEguaGFzaCBkIGluXG4gICAgYWRkX2F1eCB0IHNldCAoU29tZSBkKSBoIChnZXRfaW5kZXggdCBoKVxuXG5cbiAgbGV0IGZpbmRfb3IgdCBkIGlmbm90Zm91bmQgPVxuICAgIGxldCBoID0gSC5oYXNoIGQgaW5cbiAgICBsZXQgaW5kZXggPSBnZXRfaW5kZXggdCBoIGluXG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKGluZGV4KSBpblxuICAgIGxldCBoYXNoZXMgPSB0Lmhhc2hlcy4oaW5kZXgpIGluXG4gICAgbGV0IHN6ID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBpZm5vdGZvdW5kIGggaW5kZXhcbiAgICAgIGVsc2UgaWYgaCA9IGhhc2hlcy4oaSkgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBnZXRfY29weSBidWNrZXQgaSB3aXRoXG4gICAgICAgIHwgU29tZSB2IHdoZW4gSC5lcXVhbCB2IGRcbiAgICAgICAgICAgLT4gYmVnaW4gbWF0Y2ggZ2V0IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIHYgLT4gdlxuICAgICAgICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICB8IF8gLT4gbG9vcCAoaSArIDEpXG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IG1lcmdlIHQgZCA9XG4gICAgZmluZF9vciB0IGQgKGZ1biBoIGluZGV4IC0+IGFkZF9hdXggdCBzZXQgKFNvbWUgZCkgaCBpbmRleDsgZClcblxuXG4gIGxldCBmaW5kIHQgZCA9IGZpbmRfb3IgdCBkIChmdW4gX2ggX2luZGV4IC0+IHJhaXNlIE5vdF9mb3VuZClcblxuICBsZXQgZmluZF9vcHQgdCBkID1cbiAgICBsZXQgaCA9IEguaGFzaCBkIGluXG4gICAgbGV0IGluZGV4ID0gZ2V0X2luZGV4IHQgaCBpblxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLihpbmRleCkgaW5cbiAgICBsZXQgaGFzaGVzID0gdC5oYXNoZXMuKGluZGV4KSBpblxuICAgIGxldCBzeiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID49IHN6IHRoZW4gTm9uZVxuICAgICAgZWxzZSBpZiBoID0gaGFzaGVzLihpKSB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGdldF9jb3B5IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgfCBTb21lIHYgd2hlbiBILmVxdWFsIHYgZFxuICAgICAgICAgICAtPiBiZWdpbiBtYXRjaCBnZXQgYnVja2V0IGkgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgXyBhcyB2IC0+IHZcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuXG4gIGxldCBmaW5kX3NoYWRvdyB0IGQgaWZmb3VuZCBpZm5vdGZvdW5kID1cbiAgICBsZXQgaCA9IEguaGFzaCBkIGluXG4gICAgbGV0IGluZGV4ID0gZ2V0X2luZGV4IHQgaCBpblxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLihpbmRleCkgaW5cbiAgICBsZXQgaGFzaGVzID0gdC5oYXNoZXMuKGluZGV4KSBpblxuICAgIGxldCBzeiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID49IHN6IHRoZW4gaWZub3Rmb3VuZFxuICAgICAgZWxzZSBpZiBoID0gaGFzaGVzLihpKSB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGdldF9jb3B5IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgfCBTb21lIHYgd2hlbiBILmVxdWFsIHYgZCAtPiBpZmZvdW5kIGJ1Y2tldCBpXG4gICAgICAgIHwgXyAtPiBsb29wIChpICsgMSlcbiAgICAgIGVuZCBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cblxuICBsZXQgcmVtb3ZlIHQgZCA9IGZpbmRfc2hhZG93IHQgZCAoZnVuIHcgaSAtPiBzZXQgdyBpIE5vbmUpICgpXG5cblxuICBsZXQgbWVtIHQgZCA9IGZpbmRfc2hhZG93IHQgZCAoZnVuIF93IF9pIC0+IHRydWUpIGZhbHNlXG5cblxuICBsZXQgZmluZF9hbGwgdCBkID1cbiAgICBsZXQgaCA9IEguaGFzaCBkIGluXG4gICAgbGV0IGluZGV4ID0gZ2V0X2luZGV4IHQgaCBpblxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLihpbmRleCkgaW5cbiAgICBsZXQgaGFzaGVzID0gdC5oYXNoZXMuKGluZGV4KSBpblxuICAgIGxldCBzeiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSBhY2N1ID1cbiAgICAgIGlmIGkgPj0gc3ogdGhlbiBhY2N1XG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkXG4gICAgICAgICAgIC0+IGJlZ2luIG1hdGNoIGdldCBidWNrZXQgaSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSB2IC0+IGxvb3AgKGkgKyAxKSAodiA6OiBhY2N1KVxuICAgICAgICAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpIGFjY3VcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgXyAtPiBsb29wIChpICsgMSkgYWNjdVxuICAgICAgZW5kIGVsc2UgbG9vcCAoaSArIDEpIGFjY3VcbiAgICBpblxuICAgIGxvb3AgMCBbXVxuXG5cbiAgbGV0IHN0YXRzIHQgPVxuICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggdC50YWJsZSBpblxuICAgIGxldCBsZW5zID0gQXJyYXkubWFwIGxlbmd0aCB0LnRhYmxlIGluXG4gICAgQXJyYXkuc29ydCBjb21wYXJlIGxlbnM7XG4gICAgbGV0IHRvdGxlbiA9IEFycmF5LmZvbGRfbGVmdCAoICsgKSAwIGxlbnMgaW5cbiAgICAobGVuLCBjb3VudCB0LCB0b3RsZW4sIGxlbnMuKDApLCBsZW5zLihsZW4vMiksIGxlbnMuKGxlbi0xKSlcblxuXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQSBwcmV0dHktcHJpbnRpbmcgZmFjaWxpdHkgYW5kIGRlZmluaXRpb24gb2YgZm9ybWF0dGVycyBmb3IgJ3BhcmFsbGVsJ1xuICAgKGkuZS4gdW5yZWxhdGVkIG9yIGluZGVwZW5kZW50KSBwcmV0dHktcHJpbnRpbmcgb24gbXVsdGlwbGUgb3V0IGNoYW5uZWxzLiAqKVxuXG4oKlxuICAgVGhlIHByZXR0eS1wcmludGluZyBlbmdpbmUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLlxuKilcblxubGV0IGlkIHggPSB4XG5cbigqIEEgZGV2b3RlZCB0eXBlIGZvciBzaXplcyB0byBhdm9pZCBjb25mdXNpb25cbiAgIGJldHdlZW4gc2l6ZXMgYW5kIG1lcmUgaW50ZWdlcnMuICopXG5tb2R1bGUgU2l6ZSA6IHNpZ1xuICB0eXBlIHRcblxuICB2YWwgdG9faW50IDogdCAtPiBpbnRcbiAgdmFsIG9mX2ludCA6IGludCAtPiB0XG4gIHZhbCB6ZXJvIDogdFxuICB2YWwgdW5rbm93biA6IHRcbiAgdmFsIGlzX2tub3duIDogdCAtPiBib29sXG5lbmQgID0gc3RydWN0XG4gIHR5cGUgdCA9IGludFxuXG4gIGxldCB0b19pbnQgPSBpZFxuICBsZXQgb2ZfaW50ID0gaWRcbiAgbGV0IHplcm8gPSAwXG4gIGxldCB1bmtub3duID0gLTFcbiAgbGV0IGlzX2tub3duIG4gPSBuID49IDBcbmVuZFxuXG5cblxuKCogVGhlIHByZXR0eS1wcmludGluZyBib3hlcyBkZWZpbml0aW9uOlxuICAgYSBwcmV0dHktcHJpbnRpbmcgYm94IGlzIGVpdGhlclxuICAgLSBoYm94OiBob3Jpem9udGFsIGJveCAobm8gbGluZSBzcGxpdHRpbmcpXG4gICAtIHZib3g6IHZlcnRpY2FsIGJveCAoZXZlcnkgYnJlYWsgaGludCBzcGxpdHMgdGhlIGxpbmUpXG4gICAtIGh2Ym94OiBob3Jpem9udGFsL3ZlcnRpY2FsIGJveFxuICAgICAodGhlIGJveCBiZWhhdmVzIGFzIGFuIGhvcml6b250YWwgYm94IGlmIGl0IGZpdHMgb25cbiAgICAgIHRoZSBjdXJyZW50IGxpbmUsIG90aGVyd2lzZSB0aGUgYm94IGJlaGF2ZXMgYXMgYSB2ZXJ0aWNhbCBib3gpXG4gICAtIGhvdmJveDogaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBjb21wYWN0aW5nIGJveFxuICAgICAodGhlIGJveCBpcyBjb21wYWN0aW5nIG1hdGVyaWFsLCBwcmludGluZyBhcyBtdWNoIG1hdGVyaWFsIGFzIHBvc3NpYmxlXG4gICAgICBvbiBldmVyeSBsaW5lcylcbiAgIC0gYm94OiBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGNvbXBhY3RpbmcgYm94IHdpdGggZW5oYW5jZWQgYm94IHN0cnVjdHVyZVxuICAgICAodGhlIGJveCBiZWhhdmVzIGFzIGFuIGhvcml6b250YWwgb3IgdmVydGljYWwgYm94IGJ1dCBicmVhayBoaW50cyBzcGxpdFxuICAgICAgdGhlIGxpbmUgaWYgc3BsaXR0aW5nIHdvdWxkIG1vdmUgdG8gdGhlIGxlZnQpXG4qKVxudHlwZSBib3hfdHlwZSA9IENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5ibG9ja190eXBlID1cbiAgfCBQcF9oYm94IHwgUHBfdmJveCB8IFBwX2h2Ym94IHwgUHBfaG92Ym94IHwgUHBfYm94IHwgUHBfZml0c1xuXG5cbigqIFRoZSBwcmV0dHktcHJpbnRpbmcgdG9rZW5zIGRlZmluaXRpb246XG4gICBhcmUgZWl0aGVyIHRleHQgdG8gcHJpbnQgb3IgcHJldHR5IHByaW50aW5nXG4gICBlbGVtZW50cyB0aGF0IGRyaXZlIGluZGVudGF0aW9uIGFuZCBsaW5lIHNwbGl0dGluZy4gKilcbnR5cGUgcHBfdG9rZW4gPVxuICB8IFBwX3RleHQgb2Ygc3RyaW5nICAgICAgICAgICgqIG5vcm1hbCB0ZXh0ICopXG4gIHwgUHBfYnJlYWsgb2YgeyAgICAgICAgICAgICAgKCogY29tcGxldGUgYnJlYWsgKilcbiAgICAgIGZpdHM6IHN0cmluZyAqIGludCAqIHN0cmluZzsgICAoKiBsaW5lIGlzIG5vdCBzcGxpdCAqKVxuICAgICAgYnJlYWtzOiBzdHJpbmcgKiBpbnQgKiBzdHJpbmc7ICgqIGxpbmUgaXMgc3BsaXQgKilcbiAgICB9XG4gIHwgUHBfdGJyZWFrIG9mIGludCAqIGludCAgICAgKCogZ28gdG8gbmV4dCB0YWJ1bGF0aW9uICopXG4gIHwgUHBfc3RhYiAgICAgICAgICAgICAgICAgICAgKCogc2V0IGEgdGFidWxhdGlvbiAqKVxuICB8IFBwX2JlZ2luIG9mIGludCAqIGJveF90eXBlICgqIGJlZ2lubmluZyBvZiBhIGJveCAqKVxuICB8IFBwX2VuZCAgICAgICAgICAgICAgICAgICAgICgqIGVuZCBvZiBhIGJveCAqKVxuICB8IFBwX3RiZWdpbiBvZiB0Ym94ICAgICAgICAgICgqIGJlZ2lubmluZyBvZiBhIHRhYnVsYXRpb24gYm94ICopXG4gIHwgUHBfdGVuZCAgICAgICAgICAgICAgICAgICAgKCogZW5kIG9mIGEgdGFidWxhdGlvbiBib3ggKilcbiAgfCBQcF9uZXdsaW5lICAgICAgICAgICAgICAgICAoKiB0byBmb3JjZSBhIG5ld2xpbmUgaW5zaWRlIGEgYm94ICopXG4gIHwgUHBfaWZfbmV3bGluZSAgICAgICAgICAgICAgKCogdG8gZG8gc29tZXRoaW5nIG9ubHkgaWYgdGhpcyB2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSBoYXMgYmVlbiBicm9rZW4gKilcbiAgfCBQcF9vcGVuX3RhZyBvZiBzdGFnICAgICAgICAgKCogb3BlbmluZyBhIHRhZyBuYW1lICopXG4gIHwgUHBfY2xvc2VfdGFnICAgICAgICAgICAgICAgKCogY2xvc2luZyB0aGUgbW9zdCByZWNlbnRseSBvcGVuIHRhZyAqKVxuXG5hbmQgc3RhZyA9IC4uXG5cbmFuZCB0Ym94ID0gUHBfdGJveCBvZiBpbnQgbGlzdCByZWYgICgqIFRhYnVsYXRpb24gYm94ICopXG5cbnR5cGUgdGFnID0gc3RyaW5nXG50eXBlIHN0YWcgKz0gU3RyaW5nX3RhZyBvZiB0YWdcblxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgcXVldWU6XG4gICBwcmV0dHktcHJpbnRpbmcgbWF0ZXJpYWwgaXMgbm90IHdyaXR0ZW4gaW4gdGhlIG91dHB1dCBhcyBzb29uIGFzIGVtaXR0ZWQ7XG4gICBpbnN0ZWFkLCB0aGUgbWF0ZXJpYWwgaXMgc2ltcGx5IHJlY29yZGVkIGluIHRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZSxcbiAgIHVudGlsIHRoZSBlbmNsb3NpbmcgYm94IGhhcyBhIGtub3duIGNvbXB1dGVkIHNpemUgYW5kIHByb3BlciBzcGxpdHRpbmdcbiAgIGRlY2lzaW9ucyBjYW4gYmUgbWFkZS5cblxuICAgVGhlIHByZXR0eS1wcmludGVyIHF1ZXVlIGNvbnRhaW5zIGZvcm1hdHRpbmcgZWxlbWVudHMgdG8gYmUgcHJpbnRlZC5cbiAgIEVhY2ggZm9ybWF0dGluZyBlbGVtZW50IGlzIGEgdHVwbGUgKHNpemUsIHRva2VuLCBsZW5ndGgpLCB3aGVyZVxuICAgLSBsZW5ndGggaXMgdGhlIGRlY2xhcmVkIGxlbmd0aCBvZiB0aGUgdG9rZW4sXG4gICAtIHNpemUgaXMgZWZmZWN0aXZlIHNpemUgb2YgdGhlIHRva2VuIHdoZW4gaXQgaXMgcHJpbnRlZFxuICAgICAoc2l6ZSBpcyBzZXQgd2hlbiB0aGUgc2l6ZSBvZiB0aGUgYm94IGlzIGtub3duLCBzbyB0aGF0IHNpemUgb2YgYnJlYWtcbiAgICAgIGhpbnRzIGFyZSBkZWZpbml0aXZlKS4gKilcbnR5cGUgcHBfcXVldWVfZWxlbSA9IHtcbiAgbXV0YWJsZSBzaXplIDogU2l6ZS50O1xuICB0b2tlbiA6IHBwX3Rva2VuO1xuICBsZW5ndGggOiBpbnQ7XG59XG5cblxuKCogVGhlIHByZXR0eS1wcmludGVyIHF1ZXVlIGRlZmluaXRpb24uICopXG50eXBlIHBwX3F1ZXVlID0gcHBfcXVldWVfZWxlbSBRdWV1ZS50XG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBzY2FubmluZyBzdGFjay4gKilcblxuKCogVGhlIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrOiBzY2FubmluZyBlbGVtZW50IGRlZmluaXRpb24uICopXG50eXBlIHBwX3NjYW5fZWxlbSA9IHtcbiAgbGVmdF90b3RhbCA6IGludDsgKCogVmFsdWUgb2YgcHBfbGVmdF90b3RhbCB3aGVuIHRoZSBlbGVtZW50IHdhcyBlbnF1ZXVlZC4gKilcbiAgcXVldWVfZWxlbSA6IHBwX3F1ZXVlX2VsZW1cbn1cblxuKCogVGhlIHByZXR0eS1wcmludGVyIGZvcm1hdHRpbmcgc3RhY2s6XG4gICB0aGUgZm9ybWF0dGluZyBzdGFjayBjb250YWlucyB0aGUgZGVzY3JpcHRpb24gb2YgYWxsIHRoZSBjdXJyZW50bHkgYWN0aXZlXG4gICBib3hlczsgdGhlIHByZXR0eS1wcmludGVyIGZvcm1hdHRpbmcgc3RhY2sgaXMgdXNlZCB0byBzcGxpdCB0aGUgbGluZXNcbiAgIHdoaWxlIHByaW50aW5nIHRva2Vucy4gKilcblxuKCogVGhlIHByZXR0eS1wcmludGVyIGZvcm1hdHRpbmcgc3RhY2s6IGZvcm1hdHRpbmcgc3RhY2sgZWxlbWVudCBkZWZpbml0aW9uLlxuICAgRWFjaCBzdGFjayBlbGVtZW50IGRlc2NyaWJlcyBhIHByZXR0eS1wcmludGluZyBib3guICopXG50eXBlIHBwX2Zvcm1hdF9lbGVtID0geyBib3hfdHlwZSA6IGJveF90eXBlOyB3aWR0aCA6IGludCB9XG5cbigqIFRoZSBmb3JtYXR0ZXIgZGVmaW5pdGlvbi5cbiAgIEVhY2ggZm9ybWF0dGVyIHZhbHVlIGlzIGEgcHJldHR5LXByaW50ZXIgaW5zdGFuY2Ugd2l0aCBhbGwgaXRzXG4gICBtYWNoaW5lcnkuICopXG50eXBlIGZvcm1hdHRlciA9IHtcbiAgKCogVGhlIHByZXR0eS1wcmludGVyIHNjYW5uaW5nIHN0YWNrLiAqKVxuICBwcF9zY2FuX3N0YWNrIDogcHBfc2Nhbl9lbGVtIFN0YWNrLnQ7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBmb3JtYXR0aW5nIHN0YWNrLiAqKVxuICBwcF9mb3JtYXRfc3RhY2sgOiBwcF9mb3JtYXRfZWxlbSBTdGFjay50O1xuICBwcF90Ym94X3N0YWNrIDogdGJveCBTdGFjay50O1xuICAoKiBUaGUgcHJldHR5LXByaW50ZXIgc2VtYW50aWNzIHRhZyBzdGFjay4gKilcbiAgcHBfdGFnX3N0YWNrIDogc3RhZyBTdGFjay50O1xuICBwcF9tYXJrX3N0YWNrIDogc3RhZyBTdGFjay50O1xuICAoKiBWYWx1ZSBvZiByaWdodCBtYXJnaW4uICopXG4gIG11dGFibGUgcHBfbWFyZ2luIDogaW50O1xuICAoKiBNaW5pbWFsIHNwYWNlIGxlZnQgYmVmb3JlIG1hcmdpbiwgd2hlbiBvcGVuaW5nIGEgYm94LiAqKVxuICBtdXRhYmxlIHBwX21pbl9zcGFjZV9sZWZ0IDogaW50O1xuICAoKiBNYXhpbXVtIHZhbHVlIG9mIGluZGVudGF0aW9uOlxuICAgICBubyBib3ggY2FuIGJlIG9wZW5lZCBmdXJ0aGVyLiAqKVxuICBtdXRhYmxlIHBwX21heF9pbmRlbnQgOiBpbnQ7XG4gICgqIFNwYWNlIHJlbWFpbmluZyBvbiB0aGUgY3VycmVudCBsaW5lLiAqKVxuICBtdXRhYmxlIHBwX3NwYWNlX2xlZnQgOiBpbnQ7XG4gICgqIEN1cnJlbnQgdmFsdWUgb2YgaW5kZW50YXRpb24uICopXG4gIG11dGFibGUgcHBfY3VycmVudF9pbmRlbnQgOiBpbnQ7XG4gICgqIFRydWUgd2hlbiB0aGUgbGluZSBoYXMgYmVlbiBicm9rZW4gYnkgdGhlIHByZXR0eS1wcmludGVyLiAqKVxuICBtdXRhYmxlIHBwX2lzX25ld19saW5lIDogYm9vbDtcbiAgKCogVG90YWwgd2lkdGggb2YgdG9rZW5zIGFscmVhZHkgcHJpbnRlZC4gKilcbiAgbXV0YWJsZSBwcF9sZWZ0X3RvdGFsIDogaW50O1xuICAoKiBUb3RhbCB3aWR0aCBvZiB0b2tlbnMgZXZlciBwdXQgaW4gcXVldWUuICopXG4gIG11dGFibGUgcHBfcmlnaHRfdG90YWwgOiBpbnQ7XG4gICgqIEN1cnJlbnQgbnVtYmVyIG9mIG9wZW4gYm94ZXMuICopXG4gIG11dGFibGUgcHBfY3Vycl9kZXB0aCA6IGludDtcbiAgKCogTWF4aW11bSBudW1iZXIgb2YgYm94ZXMgd2hpY2ggY2FuIGJlIHNpbXVsdGFuZW91c2x5IG9wZW4uICopXG4gIG11dGFibGUgcHBfbWF4X2JveGVzIDogaW50O1xuICAoKiBFbGxpcHNpcyBzdHJpbmcuICopXG4gIG11dGFibGUgcHBfZWxsaXBzaXMgOiBzdHJpbmc7XG4gICgqIE91dHB1dCBmdW5jdGlvbi4gKilcbiAgbXV0YWJsZSBwcF9vdXRfc3RyaW5nIDogc3RyaW5nIC0+IGludCAtPiBpbnQgLT4gdW5pdDtcbiAgKCogRmx1c2hpbmcgZnVuY3Rpb24uICopXG4gIG11dGFibGUgcHBfb3V0X2ZsdXNoIDogdW5pdCAtPiB1bml0O1xuICAoKiBPdXRwdXQgb2YgbmV3IGxpbmVzLiAqKVxuICBtdXRhYmxlIHBwX291dF9uZXdsaW5lIDogdW5pdCAtPiB1bml0O1xuICAoKiBPdXRwdXQgb2YgYnJlYWsgaGludHMgc3BhY2VzLiAqKVxuICBtdXRhYmxlIHBwX291dF9zcGFjZXMgOiBpbnQgLT4gdW5pdDtcbiAgKCogT3V0cHV0IG9mIGluZGVudGF0aW9uIG9mIG5ldyBsaW5lcy4gKilcbiAgbXV0YWJsZSBwcF9vdXRfaW5kZW50IDogaW50IC0+IHVuaXQ7XG4gICgqIEFyZSB0YWdzIHByaW50ZWQgPyAqKVxuICBtdXRhYmxlIHBwX3ByaW50X3RhZ3MgOiBib29sO1xuICAoKiBBcmUgdGFncyBtYXJrZWQgPyAqKVxuICBtdXRhYmxlIHBwX21hcmtfdGFncyA6IGJvb2w7XG4gICgqIEZpbmQgb3BlbmluZyBhbmQgY2xvc2luZyBtYXJrZXJzIG9mIHRhZ3MuICopXG4gIG11dGFibGUgcHBfbWFya19vcGVuX3RhZyA6IHN0YWcgLT4gc3RyaW5nO1xuICBtdXRhYmxlIHBwX21hcmtfY2xvc2VfdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIG11dGFibGUgcHBfcHJpbnRfb3Blbl90YWcgOiBzdGFnIC0+IHVuaXQ7XG4gIG11dGFibGUgcHBfcHJpbnRfY2xvc2VfdGFnIDogc3RhZyAtPiB1bml0O1xuICAoKiBUaGUgcHJldHR5LXByaW50ZXIgcXVldWUuICopXG4gIHBwX3F1ZXVlIDogcHBfcXVldWU7XG59XG5cblxuKCogVGhlIGZvcm1hdHRlciBzcGVjaWZpYyB0YWcgaGFuZGxpbmcgZnVuY3Rpb25zLiAqKVxudHlwZSBmb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgPSB7XG4gIG1hcmtfb3Blbl9zdGFnIDogc3RhZyAtPiBzdHJpbmc7XG4gIG1hcmtfY2xvc2Vfc3RhZyA6IHN0YWcgLT4gc3RyaW5nO1xuICBwcmludF9vcGVuX3N0YWcgOiBzdGFnIC0+IHVuaXQ7XG4gIHByaW50X2Nsb3NlX3N0YWcgOiBzdGFnIC0+IHVuaXQ7XG59XG5cblxuKCogVGhlIGZvcm1hdHRlciBmdW5jdGlvbnMgdG8gb3V0cHV0IG1hdGVyaWFsLiAqKVxudHlwZSBmb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyA9IHtcbiAgb3V0X3N0cmluZyA6IHN0cmluZyAtPiBpbnQgLT4gaW50IC0+IHVuaXQ7XG4gIG91dF9mbHVzaCA6IHVuaXQgLT4gdW5pdDtcbiAgb3V0X25ld2xpbmUgOiB1bml0IC0+IHVuaXQ7XG4gIG91dF9zcGFjZXMgOiBpbnQgLT4gdW5pdDtcbiAgb3V0X2luZGVudCA6IGludCAtPiB1bml0O1xufVxuXG5cbigqXG5cbiAgQXV4aWxpYXJpZXMgYW5kIGJhc2ljIGZ1bmN0aW9ucy5cblxuKilcblxuKCogRW50ZXIgYSB0b2tlbiBpbiB0aGUgcHJldHR5LXByaW50ZXIgcXVldWUuICopXG5sZXQgcHBfZW5xdWV1ZSBzdGF0ZSB0b2tlbiA9XG4gIHN0YXRlLnBwX3JpZ2h0X3RvdGFsIDwtIHN0YXRlLnBwX3JpZ2h0X3RvdGFsICsgdG9rZW4ubGVuZ3RoO1xuICBRdWV1ZS5hZGQgdG9rZW4gc3RhdGUucHBfcXVldWVcblxuXG5sZXQgcHBfY2xlYXJfcXVldWUgc3RhdGUgPVxuICBzdGF0ZS5wcF9sZWZ0X3RvdGFsIDwtIDE7IHN0YXRlLnBwX3JpZ2h0X3RvdGFsIDwtIDE7XG4gIFF1ZXVlLmNsZWFyIHN0YXRlLnBwX3F1ZXVlXG5cblxuKCogUHBfaW5maW5pdHk6IGxhcmdlIHZhbHVlIGZvciBkZWZhdWx0IHRva2VucyBzaXplLlxuXG4gICBQcF9pbmZpbml0eSBpcyBkb2N1bWVudGVkIGFzIGJlaW5nIGdyZWF0ZXIgdGhhbiAxZTEwOyB0byBhdm9pZFxuICAgY29uZnVzaW9uIGFib3V0IHRoZSB3b3JkICdncmVhdGVyJywgd2UgY2hvb3NlIHBwX2luZmluaXR5IGdyZWF0ZXJcbiAgIHRoYW4gMWUxMCArIDE7IGZvciBjb3JyZWN0IGhhbmRsaW5nIG9mIHRlc3RzIGluIHRoZSBhbGdvcml0aG0sXG4gICBwcF9pbmZpbml0eSBtdXN0IGJlIGV2ZW4gb25lIG1vcmUgdGhhbiAxZTEwICsgMTsgbGV0J3Mgc3RhbmQgb24gdGhlXG4gICBzYWZlIHNpZGUgYnkgY2hvb3NpbmcgMS5lMTArMTAuXG5cbiAgIFBwX2luZmluaXR5IGNvdWxkIHByb2JhYmx5IGJlIDEwNzM3NDE4MjMgdGhhdCBpcyAyXjMwIC0gMSwgdGhhdCBpc1xuICAgdGhlIG1pbmltYWwgdXBwZXIgYm91bmQgZm9yIGludGVnZXJzOyBub3cgdGhhdCBtYXhfaW50IGlzIGRlZmluZWQsXG4gICB0aGlzIGxpbWl0IGNvdWxkIGFsc28gYmUgZGVmaW5lZCBhcyBtYXhfaW50IC0gMS5cblxuICAgSG93ZXZlciwgYmVmb3JlIHNldHRpbmcgcHBfaW5maW5pdHkgdG8gc29tZXRoaW5nIGFyb3VuZCBtYXhfaW50LCB3ZVxuICAgbXVzdCBjYXJlZnVsbHkgZG91YmxlLWNoZWNrIGFsbCB0aGUgaW50ZWdlciBhcml0aG1ldGljIG9wZXJhdGlvbnNcbiAgIHRoYXQgaW52b2x2ZSBwcF9pbmZpbml0eSwgc2luY2UgYW55IG92ZXJmbG93IHdvdWxkIHdyZWNrIGhhdm9jIHRoZVxuICAgcHJldHR5LXByaW50aW5nIGFsZ29yaXRobSdzIGludmFyaWFudHMuIEdpdmVuIHRoYXQgdGhpcyBhcml0aG1ldGljXG4gICBjb3JyZWN0bmVzcyBjaGVjayBpcyBkaWZmaWN1bHQgYW5kIGVycm9yIHByb25lIGFuZCBnaXZlbiB0aGF0IDFlMTBcbiAgICsgMSBpcyBpbiBwcmFjdGljZSBsYXJnZSBlbm91Z2gsIHRoZXJlIGlzIG5vIG5lZWQgdG8gYXR0ZW1wdCB0byBzZXRcbiAgIHBwX2luZmluaXR5IHRvIHRoZSB0aGVvcmV0aWNhbGx5IG1heGltdW0gbGltaXQuIEl0IGlzIG5vdCB3b3J0aCB0aGVcbiAgIGJ1cmRlbiAhICopXG5sZXQgcHBfaW5maW5pdHkgPSAxMDAwMDAwMDEwXG5cbigqIE91dHB1dCBmdW5jdGlvbnMgZm9yIHRoZSBmb3JtYXR0ZXIuICopXG5sZXQgcHBfb3V0cHV0X3N0cmluZyBzdGF0ZSBzID0gc3RhdGUucHBfb3V0X3N0cmluZyBzIDAgKFN0cmluZy5sZW5ndGggcylcbmFuZCBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZSA9IHN0YXRlLnBwX291dF9uZXdsaW5lICgpXG5hbmQgcHBfb3V0cHV0X3NwYWNlcyBzdGF0ZSBuID0gc3RhdGUucHBfb3V0X3NwYWNlcyBuXG5hbmQgcHBfb3V0cHV0X2luZGVudCBzdGF0ZSBuID0gc3RhdGUucHBfb3V0X2luZGVudCBuXG5cbigqIEZvcm1hdCBhIHRleHR1YWwgdG9rZW4gKilcbmxldCBmb3JtYXRfcHBfdGV4dCBzdGF0ZSBzaXplIHRleHQgPVxuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX3NwYWNlX2xlZnQgLSBzaXplO1xuICBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIHRleHQ7XG4gIHN0YXRlLnBwX2lzX25ld19saW5lIDwtIGZhbHNlXG5cbigqIEZvcm1hdCBhIHN0cmluZyBieSBpdHMgbGVuZ3RoLCBpZiBub3QgZW1wdHkgKilcbmxldCBmb3JtYXRfc3RyaW5nIHN0YXRlIHMgPVxuICBpZiBzIDw+IFwiXCIgdGhlbiBmb3JtYXRfcHBfdGV4dCBzdGF0ZSAoU3RyaW5nLmxlbmd0aCBzKSBzXG5cbigqIFRvIGZvcm1hdCBhIGJyZWFrLCBpbmRlbnRpbmcgYSBuZXcgbGluZS4gKilcbmxldCBicmVha19uZXdfbGluZSBzdGF0ZSAoYmVmb3JlLCBvZmZzZXQsIGFmdGVyKSB3aWR0aCA9XG4gIGZvcm1hdF9zdHJpbmcgc3RhdGUgYmVmb3JlO1xuICBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZTtcbiAgc3RhdGUucHBfaXNfbmV3X2xpbmUgPC0gdHJ1ZTtcbiAgbGV0IGluZGVudCA9IHN0YXRlLnBwX21hcmdpbiAtIHdpZHRoICsgb2Zmc2V0IGluXG4gICgqIERvbid0IGluZGVudCBtb3JlIHRoYW4gcHBfbWF4X2luZGVudC4gKilcbiAgbGV0IHJlYWxfaW5kZW50ID0gSW50Lm1pbiBzdGF0ZS5wcF9tYXhfaW5kZW50IGluZGVudCBpblxuICBzdGF0ZS5wcF9jdXJyZW50X2luZGVudCA8LSByZWFsX2luZGVudDtcbiAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9jdXJyZW50X2luZGVudDtcbiAgcHBfb3V0cHV0X2luZGVudCBzdGF0ZSBzdGF0ZS5wcF9jdXJyZW50X2luZGVudDtcbiAgZm9ybWF0X3N0cmluZyBzdGF0ZSBhZnRlclxuXG5cbigqIFRvIGZvcmNlIGEgbGluZSBicmVhayBpbnNpZGUgYSBib3g6IG5vIG9mZnNldCBpcyBhZGRlZC4gKilcbmxldCBicmVha19saW5lIHN0YXRlIHdpZHRoID0gYnJlYWtfbmV3X2xpbmUgc3RhdGUgKFwiXCIsIDAsIFwiXCIpIHdpZHRoXG5cbigqIFRvIGZvcm1hdCBhIGJyZWFrIHRoYXQgZml0cyBvbiB0aGUgY3VycmVudCBsaW5lLiAqKVxubGV0IGJyZWFrX3NhbWVfbGluZSBzdGF0ZSAoYmVmb3JlLCB3aWR0aCwgYWZ0ZXIpID1cbiAgZm9ybWF0X3N0cmluZyBzdGF0ZSBiZWZvcmU7XG4gIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfc3BhY2VfbGVmdCAtIHdpZHRoO1xuICBwcF9vdXRwdXRfc3BhY2VzIHN0YXRlIHdpZHRoO1xuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGFmdGVyXG5cblxuKCogVG8gaW5kZW50IG5vIG1vcmUgdGhhbiBwcF9tYXhfaW5kZW50LCBpZiBvbmUgdHJpZXMgdG8gb3BlbiBhIGJveFxuICAgYmV5b25kIHBwX21heF9pbmRlbnQsIHRoZW4gdGhlIGJveCBpcyByZWplY3RlZCBvbiB0aGUgbGVmdFxuICAgYnkgc2ltdWxhdGluZyBhIGJyZWFrLiAqKVxubGV0IHBwX2ZvcmNlX2JyZWFrX2xpbmUgc3RhdGUgPVxuICBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB3aXRoXG4gIHwgTm9uZSAtPiBwcF9vdXRwdXRfbmV3bGluZSBzdGF0ZVxuICB8IFNvbWUgeyBib3hfdHlwZTsgd2lkdGggfSAtPlxuICAgIGlmIHdpZHRoID4gc3RhdGUucHBfc3BhY2VfbGVmdCB0aGVuXG4gICAgICBtYXRjaCBib3hfdHlwZSB3aXRoXG4gICAgICB8IFBwX2ZpdHMgfCBQcF9oYm94IC0+ICgpXG4gICAgICB8IFBwX3Zib3ggfCBQcF9odmJveCB8IFBwX2hvdmJveCB8IFBwX2JveCAtPiBicmVha19saW5lIHN0YXRlIHdpZHRoXG5cblxuKCogVG8gc2tpcCBhIHRva2VuLCBpZiB0aGUgcHJldmlvdXMgbGluZSBoYXMgYmVlbiBicm9rZW4uICopXG5sZXQgcHBfc2tpcF90b2tlbiBzdGF0ZSA9XG4gIG1hdGNoIFF1ZXVlLnRha2Vfb3B0IHN0YXRlLnBwX3F1ZXVlIHdpdGhcbiAgfCBOb25lIC0+ICgpICgqIHByaW50X2lmX25ld2xpbmUgbXVzdCBoYXZlIGJlZW4gdGhlIGxhc3QgcHJpbnRpbmcgY29tbWFuZCAqKVxuICB8IFNvbWUgeyBzaXplOyBsZW5ndGg7IF8gfSAtPlxuICAgIHN0YXRlLnBwX2xlZnRfdG90YWwgPC0gc3RhdGUucHBfbGVmdF90b3RhbCAtIGxlbmd0aDtcbiAgICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX3NwYWNlX2xlZnQgKyBTaXplLnRvX2ludCBzaXplXG5cblxuKCpcblxuICBUaGUgbWFpbiBwcmV0dHkgcHJpbnRpbmcgZnVuY3Rpb25zLlxuXG4qKVxuXG4oKiBGb3JtYXR0aW5nIGEgdG9rZW4gd2l0aCBhIGdpdmVuIHNpemUuICopXG5sZXQgZm9ybWF0X3BwX3Rva2VuIHN0YXRlIHNpemUgPSBmdW5jdGlvblxuXG4gIHwgUHBfdGV4dCBzIC0+XG4gICAgZm9ybWF0X3BwX3RleHQgc3RhdGUgc2l6ZSBzXG5cbiAgfCBQcF9iZWdpbiAob2ZmLCB0eSkgLT5cbiAgICBsZXQgaW5zZXJ0aW9uX3BvaW50ID0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfc3BhY2VfbGVmdCBpblxuICAgIGlmIGluc2VydGlvbl9wb2ludCA+IHN0YXRlLnBwX21heF9pbmRlbnQgdGhlblxuICAgICAgKCogY2FuIG5vdCBvcGVuIGEgYm94IHJpZ2h0IHRoZXJlLiAqKVxuICAgICAgYmVnaW4gcHBfZm9yY2VfYnJlYWtfbGluZSBzdGF0ZSBlbmQ7XG4gICAgbGV0IHdpZHRoID0gc3RhdGUucHBfc3BhY2VfbGVmdCAtIG9mZiBpblxuICAgIGxldCBib3hfdHlwZSA9XG4gICAgICBtYXRjaCB0eSB3aXRoXG4gICAgICB8IFBwX3Zib3ggLT4gUHBfdmJveFxuICAgICAgfCBQcF9oYm94IHwgUHBfaHZib3ggfCBQcF9ob3Zib3ggfCBQcF9ib3ggfCBQcF9maXRzIC0+XG4gICAgICAgIGlmIHNpemUgPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0IHRoZW4gdHkgZWxzZSBQcF9maXRzIGluXG4gICAgU3RhY2sucHVzaCB7IGJveF90eXBlOyB3aWR0aCB9IHN0YXRlLnBwX2Zvcm1hdF9zdGFja1xuXG4gIHwgUHBfZW5kIC0+XG4gICAgU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9mb3JtYXRfc3RhY2sgfD4gaWdub3JlXG5cbiAgfCBQcF90YmVnaW4gKFBwX3Rib3ggXyBhcyB0Ym94KSAtPlxuICAgIFN0YWNrLnB1c2ggdGJveCBzdGF0ZS5wcF90Ym94X3N0YWNrXG5cbiAgfCBQcF90ZW5kIC0+XG4gICAgU3RhY2sucG9wX29wdCBzdGF0ZS5wcF90Ym94X3N0YWNrIHw+IGlnbm9yZVxuXG4gIHwgUHBfc3RhYiAtPlxuICAgIGJlZ2luIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfdGJveF9zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+ICgpICgqIE5vIG9wZW4gdGFidWxhdGlvbiBib3guICopXG4gICAgfCBTb21lIChQcF90Ym94IHRhYnMpIC0+XG4gICAgICBsZXQgcmVjIGFkZF90YWIgbiA9IGZ1bmN0aW9uXG4gICAgICAgIHwgW10gLT4gW25dXG4gICAgICAgIHwgeCA6OiBsIGFzIGxzIC0+IGlmIG4gPCB4IHRoZW4gbiA6OiBscyBlbHNlIHggOjogYWRkX3RhYiBuIGwgaW5cbiAgICAgIHRhYnMgOj0gYWRkX3RhYiAoc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfc3BhY2VfbGVmdCkgIXRhYnNcbiAgICBlbmRcblxuICB8IFBwX3RicmVhayAobiwgb2ZmKSAtPlxuICAgIGxldCBpbnNlcnRpb25fcG9pbnQgPSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IGluXG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF90Ym94X3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gKCkgKCogTm8gb3BlbiB0YWJ1bGF0aW9uIGJveC4gKilcbiAgICB8IFNvbWUgKFBwX3Rib3ggdGFicykgLT5cbiAgICAgIGxldCB0YWIgPVxuICAgICAgICBtYXRjaCAhdGFicyB3aXRoXG4gICAgICAgIHwgW10gLT4gaW5zZXJ0aW9uX3BvaW50XG4gICAgICAgIHwgZmlyc3QgOjogXyAtPlxuICAgICAgICAgIGxldCByZWMgZmluZCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IGhlYWQgOjogdGFpbCAtPlxuICAgICAgICAgICAgICBpZiBoZWFkID49IGluc2VydGlvbl9wb2ludCB0aGVuIGhlYWQgZWxzZSBmaW5kIHRhaWxcbiAgICAgICAgICAgIHwgW10gLT4gZmlyc3QgaW5cbiAgICAgICAgICBmaW5kICF0YWJzIGluXG4gICAgICBsZXQgb2Zmc2V0ID0gdGFiIC0gaW5zZXJ0aW9uX3BvaW50IGluXG4gICAgICBpZiBvZmZzZXQgPj0gMFxuICAgICAgdGhlbiBicmVha19zYW1lX2xpbmUgc3RhdGUgKFwiXCIsIG9mZnNldCArIG4sIFwiXCIpXG4gICAgICBlbHNlIGJyZWFrX25ld19saW5lIHN0YXRlIChcIlwiLCB0YWIgKyBvZmYsIFwiXCIpIHN0YXRlLnBwX21hcmdpblxuICAgIGVuZFxuXG4gIHwgUHBfbmV3bGluZSAtPlxuICAgIGJlZ2luIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfZm9ybWF0X3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gcHBfb3V0cHV0X25ld2xpbmUgc3RhdGUgKCogTm8gb3BlbiBib3guICopXG4gICAgfCBTb21lIHsgd2lkdGg7IF99IC0+IGJyZWFrX2xpbmUgc3RhdGUgd2lkdGhcbiAgICBlbmRcblxuICB8IFBwX2lmX25ld2xpbmUgLT5cbiAgICBpZiBzdGF0ZS5wcF9jdXJyZW50X2luZGVudCAhPSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9zcGFjZV9sZWZ0XG4gICAgdGhlbiBwcF9za2lwX3Rva2VuIHN0YXRlXG5cbiAgfCBQcF9icmVhayB7IGZpdHM7IGJyZWFrcyB9IC0+XG4gICAgbGV0IGJlZm9yZSwgb2ZmLCBfID0gYnJlYWtzIGluXG4gICAgYmVnaW4gbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9mb3JtYXRfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBvcGVuIGJveC4gKilcbiAgICB8IFNvbWUgeyBib3hfdHlwZTsgd2lkdGggfSAtPlxuICAgICAgYmVnaW4gbWF0Y2ggYm94X3R5cGUgd2l0aFxuICAgICAgfCBQcF9ob3Zib3ggLT5cbiAgICAgICAgaWYgc2l6ZSArIFN0cmluZy5sZW5ndGggYmVmb3JlID4gc3RhdGUucHBfc3BhY2VfbGVmdFxuICAgICAgICB0aGVuIGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgICBlbHNlIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICB8IFBwX2JveCAtPlxuICAgICAgICAoKiBIYXZlIHRoZSBsaW5lIGp1c3QgYmVlbiBicm9rZW4gaGVyZSA/ICopXG4gICAgICAgIGlmIHN0YXRlLnBwX2lzX25ld19saW5lIHRoZW4gYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHMgZWxzZVxuICAgICAgICBpZiBzaXplICsgU3RyaW5nLmxlbmd0aCBiZWZvcmUgPiBzdGF0ZS5wcF9zcGFjZV9sZWZ0XG4gICAgICAgICAgdGhlbiBicmVha19uZXdfbGluZSBzdGF0ZSBicmVha3Mgd2lkdGggZWxzZVxuICAgICAgICAoKiBicmVhayB0aGUgbGluZSBoZXJlIGxlYWRzIHRvIG5ldyBpbmRlbnRhdGlvbiA/ICopXG4gICAgICAgIGlmIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50ID4gc3RhdGUucHBfbWFyZ2luIC0gd2lkdGggKyBvZmZcbiAgICAgICAgdGhlbiBicmVha19uZXdfbGluZSBzdGF0ZSBicmVha3Mgd2lkdGhcbiAgICAgICAgZWxzZSBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0c1xuICAgICAgfCBQcF9odmJveCAtPiBicmVha19uZXdfbGluZSBzdGF0ZSBicmVha3Mgd2lkdGhcbiAgICAgIHwgUHBfZml0cyAtPiBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0c1xuICAgICAgfCBQcF92Ym94IC0+IGJyZWFrX25ld19saW5lIHN0YXRlIGJyZWFrcyB3aWR0aFxuICAgICAgfCBQcF9oYm94IC0+IGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzXG4gICAgICBlbmRcbiAgICBlbmRcblxuICAgfCBQcF9vcGVuX3RhZyB0YWdfbmFtZSAtPlxuICAgICBsZXQgbWFya2VyID0gc3RhdGUucHBfbWFya19vcGVuX3RhZyB0YWdfbmFtZSBpblxuICAgICBwcF9vdXRwdXRfc3RyaW5nIHN0YXRlIG1hcmtlcjtcbiAgICAgU3RhY2sucHVzaCB0YWdfbmFtZSBzdGF0ZS5wcF9tYXJrX3N0YWNrXG5cbiAgIHwgUHBfY2xvc2VfdGFnIC0+XG4gICAgIGJlZ2luIG1hdGNoIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfbWFya19zdGFjayB3aXRoXG4gICAgIHwgTm9uZSAtPiAoKSAoKiBObyBtb3JlIHRhZyB0byBjbG9zZS4gKilcbiAgICAgfCBTb21lIHRhZ19uYW1lIC0+XG4gICAgICAgbGV0IG1hcmtlciA9IHN0YXRlLnBwX21hcmtfY2xvc2VfdGFnIHRhZ19uYW1lIGluXG4gICAgICAgcHBfb3V0cHV0X3N0cmluZyBzdGF0ZSBtYXJrZXJcbiAgICAgZW5kXG5cblxuKCogUHJpbnQgaWYgdG9rZW4gc2l6ZSBpcyBrbm93biBlbHNlIHByaW50aW5nIGlzIGRlbGF5ZWQuXG4gICBQcmludGluZyBpcyBkZWxheWVkIHdoZW4gdGhlIHRleHQgd2FpdGluZyBpbiB0aGUgcXVldWUgcmVxdWlyZXNcbiAgIG1vcmUgcm9vbSB0byBmb3JtYXQgdGhhbiBleGlzdHMgb24gdGhlIGN1cnJlbnQgbGluZS4gKilcbmxldCByZWMgYWR2YW5jZV9sZWZ0IHN0YXRlID1cbiAgbWF0Y2ggUXVldWUucGVla19vcHQgc3RhdGUucHBfcXVldWUgd2l0aFxuICB8IE5vbmUgLT4gKCkgKCogTm8gdG9rZW5zIHRvIHByaW50ICopXG4gIHwgU29tZSB7IHNpemU7IHRva2VuOyBsZW5ndGggfSAtPlxuICAgIGxldCBwZW5kaW5nX2NvdW50ID0gc3RhdGUucHBfcmlnaHRfdG90YWwgLSBzdGF0ZS5wcF9sZWZ0X3RvdGFsIGluXG4gICAgaWYgU2l6ZS5pc19rbm93biBzaXplIHx8IHBlbmRpbmdfY291bnQgPj0gc3RhdGUucHBfc3BhY2VfbGVmdCB0aGVuIGJlZ2luXG4gICAgICBRdWV1ZS50YWtlIHN0YXRlLnBwX3F1ZXVlIHw+IGlnbm9yZTsgKCogTm90IGVtcHR5OiB3ZSBwZWVrIGludG8gaXQgKilcbiAgICAgIGxldCBzaXplID0gaWYgU2l6ZS5pc19rbm93biBzaXplIHRoZW4gU2l6ZS50b19pbnQgc2l6ZSBlbHNlIHBwX2luZmluaXR5IGluXG4gICAgICBmb3JtYXRfcHBfdG9rZW4gc3RhdGUgc2l6ZSB0b2tlbjtcbiAgICAgIHN0YXRlLnBwX2xlZnRfdG90YWwgPC0gbGVuZ3RoICsgc3RhdGUucHBfbGVmdF90b3RhbDtcbiAgICAgIChhZHZhbmNlX2xlZnQgW0B0YWlsY2FsbF0pIHN0YXRlXG4gICAgZW5kXG5cblxuKCogVG8gZW5xdWV1ZSBhIHRva2VuIDogdHJ5IHRvIGFkdmFuY2UuICopXG5sZXQgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIHRvayA9IHBwX2VucXVldWUgc3RhdGUgdG9rOyBhZHZhbmNlX2xlZnQgc3RhdGVcblxuXG4oKiBUbyBlbnF1ZXVlIHN0cmluZ3MuICopXG5sZXQgZW5xdWV1ZV9zdHJpbmdfYXMgc3RhdGUgc2l6ZSBzID1cbiAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIHsgc2l6ZTsgdG9rZW4gPSBQcF90ZXh0IHM7IGxlbmd0aCA9IFNpemUudG9faW50IHNpemUgfVxuXG5cbmxldCBlbnF1ZXVlX3N0cmluZyBzdGF0ZSBzID1cbiAgZW5xdWV1ZV9zdHJpbmdfYXMgc3RhdGUgKFNpemUub2ZfaW50IChTdHJpbmcubGVuZ3RoIHMpKSBzXG5cblxuKCogUm91dGluZXMgZm9yIHNjYW4gc3RhY2tcbiAgIGRldGVybWluZSBzaXplIG9mIGJveGVzLiAqKVxuXG4oKiBUaGUgc2Nhbl9zdGFjayBpcyBuZXZlciBlbXB0eS4gKilcbmxldCBpbml0aWFsaXplX3NjYW5fc3RhY2sgc3RhY2sgPVxuICBTdGFjay5jbGVhciBzdGFjaztcbiAgbGV0IHF1ZXVlX2VsZW0gPSB7IHNpemUgPSBTaXplLnVua25vd247IHRva2VuID0gUHBfdGV4dCBcIlwiOyBsZW5ndGggPSAwIH0gaW5cbiAgU3RhY2sucHVzaCB7IGxlZnRfdG90YWwgPSAtMTsgcXVldWVfZWxlbSB9IHN0YWNrXG5cbigqIFNldHRpbmcgdGhlIHNpemUgb2YgYm94ZXMgb24gc2NhbiBzdGFjazpcbiAgIGlmIHR5ID0gdHJ1ZSB0aGVuIHNpemUgb2YgYnJlYWsgaXMgc2V0IGVsc2Ugc2l6ZSBvZiBib3ggaXMgc2V0O1xuICAgaW4gZWFjaCBjYXNlIHBwX3NjYW5fc3RhY2sgaXMgcG9wcGVkLlxuXG4gICBOb3RlOlxuICAgUGF0dGVybiBtYXRjaGluZyBvbiBzY2FuIHN0YWNrIGlzIGV4aGF1c3RpdmUsIHNpbmNlIHNjYW5fc3RhY2sgaXMgbmV2ZXJcbiAgIGVtcHR5LlxuICAgUGF0dGVybiBtYXRjaGluZyBvbiB0b2tlbiBpbiBzY2FuIHN0YWNrIGlzIGFsc28gZXhoYXVzdGl2ZSxcbiAgIHNpbmNlIHNjYW5fcHVzaCBpcyB1c2VkIG9uIGJyZWFrcyBhbmQgb3BlbmluZyBvZiBib3hlcy4gKilcbmxldCBzZXRfc2l6ZSBzdGF0ZSB0eSA9XG4gIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfc2Nhbl9zdGFjayB3aXRoXG4gIHwgTm9uZSAtPiAoKSAoKiBzY2FuX3N0YWNrIGlzIG5ldmVyIGVtcHR5LiAqKVxuICB8IFNvbWUgeyBsZWZ0X3RvdGFsOyBxdWV1ZV9lbGVtIH0gLT5cbiAgICBsZXQgc2l6ZSA9IFNpemUudG9faW50IHF1ZXVlX2VsZW0uc2l6ZSBpblxuICAgICgqIHRlc3QgaWYgc2NhbiBzdGFjayBjb250YWlucyBhbnkgZGF0YSB0aGF0IGlzIG5vdCBvYnNvbGV0ZS4gKilcbiAgICBpZiBsZWZ0X3RvdGFsIDwgc3RhdGUucHBfbGVmdF90b3RhbCB0aGVuXG4gICAgICBpbml0aWFsaXplX3NjYW5fc3RhY2sgc3RhdGUucHBfc2Nhbl9zdGFja1xuICAgIGVsc2VcbiAgICAgIG1hdGNoIHF1ZXVlX2VsZW0udG9rZW4gd2l0aFxuICAgICAgfCBQcF9icmVhayBfIHwgUHBfdGJyZWFrIChfLCBfKSAtPlxuICAgICAgICBpZiB0eSB0aGVuIGJlZ2luXG4gICAgICAgICAgcXVldWVfZWxlbS5zaXplIDwtIFNpemUub2ZfaW50IChzdGF0ZS5wcF9yaWdodF90b3RhbCArIHNpemUpO1xuICAgICAgICAgIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfc2Nhbl9zdGFjayB8PiBpZ25vcmVcbiAgICAgICAgZW5kXG4gICAgICB8IFBwX2JlZ2luIChfLCBfKSAtPlxuICAgICAgICBpZiBub3QgdHkgdGhlbiBiZWdpblxuICAgICAgICAgIHF1ZXVlX2VsZW0uc2l6ZSA8LSBTaXplLm9mX2ludCAoc3RhdGUucHBfcmlnaHRfdG90YWwgKyBzaXplKTtcbiAgICAgICAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX3NjYW5fc3RhY2sgfD4gaWdub3JlXG4gICAgICAgIGVuZFxuICAgICAgfCBQcF90ZXh0IF8gfCBQcF9zdGFiIHwgUHBfdGJlZ2luIF8gfCBQcF90ZW5kIHwgUHBfZW5kXG4gICAgICB8IFBwX25ld2xpbmUgfCBQcF9pZl9uZXdsaW5lIHwgUHBfb3Blbl90YWcgXyB8IFBwX2Nsb3NlX3RhZyAtPlxuICAgICAgICAoKSAoKiBzY2FuX3B1c2ggaXMgb25seSB1c2VkIGZvciBicmVha3MgYW5kIGJveGVzLiAqKVxuXG5cbigqIFB1c2ggYSB0b2tlbiBvbiBwcmV0dHktcHJpbnRlciBzY2FubmluZyBzdGFjay5cbiAgIElmIGIgaXMgdHJ1ZSBzZXRfc2l6ZSBpcyBjYWxsZWQuICopXG5sZXQgc2Nhbl9wdXNoIHN0YXRlIGIgdG9rZW4gPVxuICBwcF9lbnF1ZXVlIHN0YXRlIHRva2VuO1xuICBpZiBiIHRoZW4gc2V0X3NpemUgc3RhdGUgdHJ1ZTtcbiAgbGV0IGVsZW0gPSB7IGxlZnRfdG90YWwgPSBzdGF0ZS5wcF9yaWdodF90b3RhbDsgcXVldWVfZWxlbSA9IHRva2VuIH0gaW5cbiAgU3RhY2sucHVzaCBlbGVtIHN0YXRlLnBwX3NjYW5fc3RhY2tcblxuXG4oKiBUbyBvcGVuIGEgbmV3IGJveCA6XG4gICB0aGUgdXNlciBtYXkgc2V0IHRoZSBkZXB0aCBib3VuZCBwcF9tYXhfYm94ZXNcbiAgIGFueSB0ZXh0IG5lc3RlZCBkZWVwZXIgaXMgcHJpbnRlZCBhcyB0aGUgZWxsaXBzaXMgc3RyaW5nLiAqKVxubGV0IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgYnJfdHkgPVxuICBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwtIHN0YXRlLnBwX2N1cnJfZGVwdGggKyAxO1xuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgc2l6ZSA9IFNpemUub2ZfaW50ICgtIHN0YXRlLnBwX3JpZ2h0X3RvdGFsKSBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbiA9IFBwX2JlZ2luIChpbmRlbnQsIGJyX3R5KTsgbGVuZ3RoID0gMCB9IGluXG4gICAgc2Nhbl9wdXNoIHN0YXRlIGZhbHNlIGVsZW0gZWxzZVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoID0gc3RhdGUucHBfbWF4X2JveGVzXG4gIHRoZW4gZW5xdWV1ZV9zdHJpbmcgc3RhdGUgc3RhdGUucHBfZWxsaXBzaXNcblxuXG4oKiBUaGUgYm94IHdoaWNoIGlzIGFsd2F5cyBvcGVuLiAqKVxubGV0IHBwX29wZW5fc3lzX2JveCBzdGF0ZSA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSAwIFBwX2hvdmJveFxuXG4oKiBDbG9zZSBhIGJveCwgc2V0dGluZyBzaXplcyBvZiBpdHMgc3ViIGJveGVzLiAqKVxubGV0IHBwX2Nsb3NlX2JveCBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPiAxIHRoZW5cbiAgYmVnaW5cbiAgICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBiZWdpblxuICAgICAgcHBfZW5xdWV1ZSBzdGF0ZSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfZW5kOyBsZW5ndGggPSAwIH07XG4gICAgICBzZXRfc2l6ZSBzdGF0ZSB0cnVlOyBzZXRfc2l6ZSBzdGF0ZSBmYWxzZVxuICAgIGVuZDtcbiAgICBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwtIHN0YXRlLnBwX2N1cnJfZGVwdGggLSAxO1xuICBlbmRcblxuXG4oKiBPcGVuIGEgdGFnLCBwdXNoaW5nIGl0IG9uIHRoZSB0YWcgc3RhY2suICopXG5sZXQgcHBfb3Blbl9zdGFnIHN0YXRlIHRhZ19uYW1lID1cbiAgaWYgc3RhdGUucHBfcHJpbnRfdGFncyB0aGVuXG4gIGJlZ2luXG4gICAgU3RhY2sucHVzaCB0YWdfbmFtZSBzdGF0ZS5wcF90YWdfc3RhY2s7XG4gICAgc3RhdGUucHBfcHJpbnRfb3Blbl90YWcgdGFnX25hbWVcbiAgZW5kO1xuICBpZiBzdGF0ZS5wcF9tYXJrX3RhZ3MgdGhlblxuICAgIGxldCB0b2tlbiA9IFBwX29wZW5fdGFnIHRhZ19uYW1lIGluXG4gICAgcHBfZW5xdWV1ZSBzdGF0ZSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuOyBsZW5ndGggPSAwIH1cblxuXG4oKiBDbG9zZSBhIHRhZywgcG9wcGluZyBpdCBmcm9tIHRoZSB0YWcgc3RhY2suICopXG5sZXQgcHBfY2xvc2Vfc3RhZyBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX21hcmtfdGFncyB0aGVuXG4gICAgcHBfZW5xdWV1ZSBzdGF0ZSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfY2xvc2VfdGFnOyBsZW5ndGggPSAwIH07XG4gIGlmIHN0YXRlLnBwX3ByaW50X3RhZ3MgdGhlblxuICAgIG1hdGNoIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfdGFnX3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gKCkgKCogTm8gbW9yZSB0YWcgdG8gY2xvc2UuICopXG4gICAgfCBTb21lIHRhZ19uYW1lIC0+XG4gICAgICBzdGF0ZS5wcF9wcmludF9jbG9zZV90YWcgdGFnX25hbWVcblxubGV0IHBwX3NldF9wcmludF90YWdzIHN0YXRlIGIgPSBzdGF0ZS5wcF9wcmludF90YWdzIDwtIGJcbmxldCBwcF9zZXRfbWFya190YWdzIHN0YXRlIGIgPSBzdGF0ZS5wcF9tYXJrX3RhZ3MgPC0gYlxubGV0IHBwX2dldF9wcmludF90YWdzIHN0YXRlICgpID0gc3RhdGUucHBfcHJpbnRfdGFnc1xubGV0IHBwX2dldF9tYXJrX3RhZ3Mgc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXJrX3RhZ3NcbmxldCBwcF9zZXRfdGFncyBzdGF0ZSBiID1cbiAgcHBfc2V0X3ByaW50X3RhZ3Mgc3RhdGUgYjsgcHBfc2V0X21hcmtfdGFncyBzdGF0ZSBiXG5cblxuKCogSGFuZGxpbmcgdGFnIGhhbmRsaW5nIGZ1bmN0aW9uczogZ2V0L3NldCBmdW5jdGlvbnMuICopXG5sZXQgcHBfZ2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyBzdGF0ZSAoKSA9IHtcbiAgbWFya19vcGVuX3N0YWcgPSBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnO1xuICBtYXJrX2Nsb3NlX3N0YWcgPSBzdGF0ZS5wcF9tYXJrX2Nsb3NlX3RhZztcbiAgcHJpbnRfb3Blbl9zdGFnID0gc3RhdGUucHBfcHJpbnRfb3Blbl90YWc7XG4gIHByaW50X2Nsb3NlX3N0YWcgPSBzdGF0ZS5wcF9wcmludF9jbG9zZV90YWc7XG59XG5cblxubGV0IHBwX3NldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgc3RhdGUge1xuICAgICBtYXJrX29wZW5fc3RhZyA9IG1vdDtcbiAgICAgbWFya19jbG9zZV9zdGFnID0gbWN0O1xuICAgICBwcmludF9vcGVuX3N0YWcgPSBwb3Q7XG4gICAgIHByaW50X2Nsb3NlX3N0YWcgPSBwY3Q7XG4gIH0gPVxuICBzdGF0ZS5wcF9tYXJrX29wZW5fdGFnIDwtIG1vdDtcbiAgc3RhdGUucHBfbWFya19jbG9zZV90YWcgPC0gbWN0O1xuICBzdGF0ZS5wcF9wcmludF9vcGVuX3RhZyA8LSBwb3Q7XG4gIHN0YXRlLnBwX3ByaW50X2Nsb3NlX3RhZyA8LSBwY3RcblxuXG4oKiBJbml0aWFsaXplIHByZXR0eS1wcmludGVyLiAqKVxubGV0IHBwX3Jpbml0IHN0YXRlID1cbiAgcHBfY2xlYXJfcXVldWUgc3RhdGU7XG4gIGluaXRpYWxpemVfc2Nhbl9zdGFjayBzdGF0ZS5wcF9zY2FuX3N0YWNrO1xuICBTdGFjay5jbGVhciBzdGF0ZS5wcF9mb3JtYXRfc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX3Rib3hfc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX3RhZ19zdGFjaztcbiAgU3RhY2suY2xlYXIgc3RhdGUucHBfbWFya19zdGFjaztcbiAgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgPC0gMDtcbiAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSAwO1xuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX21hcmdpbjtcbiAgcHBfb3Blbl9zeXNfYm94IHN0YXRlXG5cbmxldCBjbGVhcl90YWdfc3RhY2sgc3RhdGUgPVxuICBTdGFjay5pdGVyIChmdW4gXyAtPiBwcF9jbG9zZV9zdGFnIHN0YXRlICgpKSBzdGF0ZS5wcF90YWdfc3RhY2tcblxuXG4oKiBGbHVzaGluZyBwcmV0dHktcHJpbnRlciBxdWV1ZS4gKilcbmxldCBwcF9mbHVzaF9xdWV1ZSBzdGF0ZSBiID1cbiAgY2xlYXJfdGFnX3N0YWNrIHN0YXRlO1xuICB3aGlsZSBzdGF0ZS5wcF9jdXJyX2RlcHRoID4gMSBkb1xuICAgIHBwX2Nsb3NlX2JveCBzdGF0ZSAoKVxuICBkb25lO1xuICBzdGF0ZS5wcF9yaWdodF90b3RhbCA8LSBwcF9pbmZpbml0eTtcbiAgYWR2YW5jZV9sZWZ0IHN0YXRlO1xuICBpZiBiIHRoZW4gcHBfb3V0cHV0X25ld2xpbmUgc3RhdGU7XG4gIHBwX3Jpbml0IHN0YXRlXG5cbigqXG5cbiAgUHJvY2VkdXJlcyB0byBmb3JtYXQgdmFsdWVzIGFuZCB1c2UgYm94ZXMuXG5cbiopXG5cbigqIFRvIGZvcm1hdCBhIHN0cmluZy4gKilcbmxldCBwcF9wcmludF9hc19zaXplIHN0YXRlIHNpemUgcyA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXNcbiAgdGhlbiBlbnF1ZXVlX3N0cmluZ19hcyBzdGF0ZSBzaXplIHNcblxuXG5sZXQgcHBfcHJpbnRfYXMgc3RhdGUgaXNpemUgcyA9XG4gIHBwX3ByaW50X2FzX3NpemUgc3RhdGUgKFNpemUub2ZfaW50IGlzaXplKSBzXG5cblxubGV0IHBwX3ByaW50X3N0cmluZyBzdGF0ZSBzID1cbiAgcHBfcHJpbnRfYXMgc3RhdGUgKFN0cmluZy5sZW5ndGggcykgc1xuXG5sZXQgcHBfcHJpbnRfYnl0ZXMgc3RhdGUgcyA9XG4gIHBwX3ByaW50X2FzIHN0YXRlIChCeXRlcy5sZW5ndGggcykgKEJ5dGVzLnRvX3N0cmluZyBzKVxuXG4oKiBUbyBmb3JtYXQgYW4gaW50ZWdlci4gKilcbmxldCBwcF9wcmludF9pbnQgc3RhdGUgaSA9IHBwX3ByaW50X3N0cmluZyBzdGF0ZSAoSW50LnRvX3N0cmluZyBpKVxuXG4oKiBUbyBmb3JtYXQgYSBmbG9hdC4gKilcbmxldCBwcF9wcmludF9mbG9hdCBzdGF0ZSBmID0gcHBfcHJpbnRfc3RyaW5nIHN0YXRlIChzdHJpbmdfb2ZfZmxvYXQgZilcblxuKCogVG8gZm9ybWF0IGEgYm9vbGVhbi4gKilcbmxldCBwcF9wcmludF9ib29sIHN0YXRlIGIgPSBwcF9wcmludF9zdHJpbmcgc3RhdGUgKHN0cmluZ19vZl9ib29sIGIpXG5cbigqIFRvIGZvcm1hdCBhIGNoYXIuICopXG5sZXQgcHBfcHJpbnRfY2hhciBzdGF0ZSBjID1cbiAgcHBfcHJpbnRfYXMgc3RhdGUgMSAoU3RyaW5nLm1ha2UgMSBjKVxuXG5cbigqIE9wZW5pbmcgYm94ZXMuICopXG5sZXQgcHBfb3Blbl9oYm94IHN0YXRlICgpID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIDAgUHBfaGJveFxuYW5kIHBwX29wZW5fdmJveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX3Zib3hcblxuYW5kIHBwX29wZW5faHZib3ggc3RhdGUgaW5kZW50ID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBQcF9odmJveFxuYW5kIHBwX29wZW5faG92Ym94IHN0YXRlIGluZGVudCA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgUHBfaG92Ym94XG5hbmQgcHBfb3Blbl9ib3ggc3RhdGUgaW5kZW50ID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBQcF9ib3hcblxuXG4oKiBQcmludGluZyBxdWV1ZWQgdGV4dC5cblxuICAgW3BwX3ByaW50X2ZsdXNoXSBwcmludHMgYWxsIHBlbmRpbmcgaXRlbXMgaW4gdGhlIHByZXR0eS1wcmludGVyIHF1ZXVlIGFuZFxuICAgdGhlbiBmbHVzaGVzIHRoZSBsb3cgbGV2ZWwgb3V0cHV0IGRldmljZSBvZiB0aGUgZm9ybWF0dGVyIHRvIGFjdHVhbGx5XG4gICBkaXNwbGF5IHByaW50aW5nIG1hdGVyaWFsLlxuXG4gICBbcHBfcHJpbnRfbmV3bGluZV0gYmVoYXZlcyBhcyBbcHBfcHJpbnRfZmx1c2hdIGFmdGVyIHByaW50aW5nIGFuIGFkZGl0aW9uYWxcbiAgIG5ldyBsaW5lLiAqKVxubGV0IHBwX3ByaW50X25ld2xpbmUgc3RhdGUgKCkgPVxuICBwcF9mbHVzaF9xdWV1ZSBzdGF0ZSB0cnVlOyBzdGF0ZS5wcF9vdXRfZmx1c2ggKClcbmFuZCBwcF9wcmludF9mbHVzaCBzdGF0ZSAoKSA9XG4gIHBwX2ZsdXNoX3F1ZXVlIHN0YXRlIGZhbHNlOyBzdGF0ZS5wcF9vdXRfZmx1c2ggKClcblxuXG4oKiBUbyBnZXQgYSBuZXdsaW5lIHdoZW4gb25lIGRvZXMgbm90IHdhbnQgdG8gY2xvc2UgdGhlIGN1cnJlbnQgYm94LiAqKVxubGV0IHBwX2ZvcmNlX25ld2xpbmUgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgeyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX25ld2xpbmU7IGxlbmd0aCA9IDAgfVxuXG5cbigqIFRvIGZvcm1hdCBzb21ldGhpbmcsIG9ubHkgaW4gY2FzZSB0aGUgbGluZSBoYXMganVzdCBiZWVuIGJyb2tlbi4gKilcbmxldCBwcF9wcmludF9pZl9uZXdsaW5lIHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlXG4gICAgICB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfaWZfbmV3bGluZTsgbGVuZ3RoID0gMCB9XG5cblxuKCogR2VuZXJhbGl6ZWQgYnJlYWsgaGludCB0aGF0IGFsbG93cyBwcmludGluZyBzdHJpbmdzIGJlZm9yZS9hZnRlclxuICAgc2FtZS1saW5lIG9mZnNldCAod2lkdGgpIG9yIG5ldy1saW5lIG9mZnNldCAqKVxubGV0IHBwX3ByaW50X2N1c3RvbV9icmVhayBzdGF0ZSB+Zml0cyB+YnJlYWtzID1cbiAgbGV0IGJlZm9yZSwgd2lkdGgsIGFmdGVyID0gZml0cyBpblxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgc2l6ZSA9IFNpemUub2ZfaW50ICgtIHN0YXRlLnBwX3JpZ2h0X3RvdGFsKSBpblxuICAgIGxldCB0b2tlbiA9IFBwX2JyZWFrIHsgZml0czsgYnJlYWtzIH0gaW5cbiAgICBsZXQgbGVuZ3RoID0gU3RyaW5nLmxlbmd0aCBiZWZvcmUgKyB3aWR0aCArIFN0cmluZy5sZW5ndGggYWZ0ZXIgaW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZTsgdG9rZW47IGxlbmd0aCB9IGluXG4gICAgc2Nhbl9wdXNoIHN0YXRlIHRydWUgZWxlbVxuXG4oKiBQcmludGluZyBicmVhayBoaW50czpcbiAgIEEgYnJlYWsgaGludCBpbmRpY2F0ZXMgd2hlcmUgYSBib3ggbWF5IGJlIGJyb2tlbi5cbiAgIElmIGxpbmUgaXMgYnJva2VuIHRoZW4gb2Zmc2V0IGlzIGFkZGVkIHRvIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgY3VycmVudFxuICAgYm94IGVsc2UgKHRoZSB2YWx1ZSBvZikgd2lkdGggYmxhbmtzIGFyZSBwcmludGVkLiAqKVxubGV0IHBwX3ByaW50X2JyZWFrIHN0YXRlIHdpZHRoIG9mZnNldCA9XG4gIHBwX3ByaW50X2N1c3RvbV9icmVhayBzdGF0ZVxuICAgIH5maXRzOihcIlwiLCB3aWR0aCwgXCJcIikgfmJyZWFrczooXCJcIiwgb2Zmc2V0LCBcIlwiKVxuXG5cbigqIFByaW50IGEgc3BhY2UgOlxuICAgYSBzcGFjZSBpcyBhIGJyZWFrIGhpbnQgdGhhdCBwcmludHMgYSBzaW5nbGUgc3BhY2UgaWYgdGhlIGJyZWFrIGRvZXMgbm90XG4gICBzcGxpdCB0aGUgbGluZTtcbiAgIGEgY3V0IGlzIGEgYnJlYWsgaGludCB0aGF0IHByaW50cyBub3RoaW5nIGlmIHRoZSBicmVhayBkb2VzIG5vdCBzcGxpdCB0aGVcbiAgIGxpbmUuICopXG5sZXQgcHBfcHJpbnRfc3BhY2Ugc3RhdGUgKCkgPSBwcF9wcmludF9icmVhayBzdGF0ZSAxIDBcbmFuZCBwcF9wcmludF9jdXQgc3RhdGUgKCkgPSBwcF9wcmludF9icmVhayBzdGF0ZSAwIDBcblxuXG4oKiBUYWJ1bGF0aW9uIGJveGVzLiAqKVxubGV0IHBwX29wZW5fdGJveCBzdGF0ZSAoKSA9XG4gIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gc3RhdGUucHBfY3Vycl9kZXB0aCArIDE7XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS56ZXJvIGluXG4gICAgbGV0IGVsZW0gPSB7IHNpemU7IHRva2VuID0gUHBfdGJlZ2luIChQcF90Ym94IChyZWYgW10pKTsgbGVuZ3RoID0gMCB9IGluXG4gICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIGVsZW1cblxuXG4oKiBDbG9zZSBhIHRhYnVsYXRpb24gYm94LiAqKVxubGV0IHBwX2Nsb3NlX3Rib3ggc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoID4gMSB0aGVuXG4gIGJlZ2luXG4gICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICAgbGV0IGVsZW0gPSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfdGVuZDsgbGVuZ3RoID0gMCB9IGluXG4gICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZSBlbGVtO1xuICAgICBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwtIHN0YXRlLnBwX2N1cnJfZGVwdGggLSAxXG4gIGVuZFxuXG5cbigqIFByaW50IGEgdGFidWxhdGlvbiBicmVhay4gKilcbmxldCBwcF9wcmludF90YnJlYWsgc3RhdGUgd2lkdGggb2Zmc2V0ID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IHNpemUgPSBTaXplLm9mX2ludCAoLSBzdGF0ZS5wcF9yaWdodF90b3RhbCkgaW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZTsgdG9rZW4gPSBQcF90YnJlYWsgKHdpZHRoLCBvZmZzZXQpOyBsZW5ndGggPSB3aWR0aCB9IGluXG4gICAgc2Nhbl9wdXNoIHN0YXRlIHRydWUgZWxlbVxuXG5cbmxldCBwcF9wcmludF90YWIgc3RhdGUgKCkgPSBwcF9wcmludF90YnJlYWsgc3RhdGUgMCAwXG5cbmxldCBwcF9zZXRfdGFiIHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IGVsZW0gPSB7IHNpemUgPSBTaXplLnplcm87IHRva2VuID0gUHBfc3RhYjsgbGVuZ3RoID0gMCB9IGluXG4gICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIGVsZW1cblxuXG4oKlxuXG4gIFByb2NlZHVyZXMgdG8gY29udHJvbCB0aGUgcHJldHR5LXByaW50ZXJzXG5cbiopXG5cbigqIFNldF9tYXhfYm94ZXMuICopXG5sZXQgcHBfc2V0X21heF9ib3hlcyBzdGF0ZSBuID0gaWYgbiA+IDEgdGhlbiBzdGF0ZS5wcF9tYXhfYm94ZXMgPC0gblxuXG4oKiBUbyBrbm93IHRoZSBjdXJyZW50IG1heGltdW0gbnVtYmVyIG9mIGJveGVzIGFsbG93ZWQuICopXG5sZXQgcHBfZ2V0X21heF9ib3hlcyBzdGF0ZSAoKSA9IHN0YXRlLnBwX21heF9ib3hlc1xuXG5sZXQgcHBfb3Zlcl9tYXhfYm94ZXMgc3RhdGUgKCkgPSBzdGF0ZS5wcF9jdXJyX2RlcHRoID0gc3RhdGUucHBfbWF4X2JveGVzXG5cbigqIEVsbGlwc2lzLiAqKVxubGV0IHBwX3NldF9lbGxpcHNpc190ZXh0IHN0YXRlIHMgPSBzdGF0ZS5wcF9lbGxpcHNpcyA8LSBzXG5hbmQgcHBfZ2V0X2VsbGlwc2lzX3RleHQgc3RhdGUgKCkgPSBzdGF0ZS5wcF9lbGxpcHNpc1xuXG5cbigqIFRvIHNldCB0aGUgbWFyZ2luIG9mIHByZXR0eS1wcmludGVyLiAqKVxubGV0IHBwX2xpbWl0IG4gPVxuICBpZiBuIDwgcHBfaW5maW5pdHkgdGhlbiBuIGVsc2UgcHJlZCBwcF9pbmZpbml0eVxuXG5cbigqIEludGVybmFsIHByZXR0eS1wcmludGVyIGZ1bmN0aW9ucy4gKilcbmxldCBwcF9zZXRfbWluX3NwYWNlX2xlZnQgc3RhdGUgbiA9XG4gIGlmIG4gPj0gMSB0aGVuXG4gICAgbGV0IG4gPSBwcF9saW1pdCBuIGluXG4gICAgc3RhdGUucHBfbWluX3NwYWNlX2xlZnQgPC0gbjtcbiAgICBzdGF0ZS5wcF9tYXhfaW5kZW50IDwtIHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX21pbl9zcGFjZV9sZWZ0O1xuICAgIHBwX3Jpbml0IHN0YXRlXG5cblxuKCogSW5pdGlhbGx5LCB3ZSBoYXZlIDpcbiAgIHBwX21heF9pbmRlbnQgPSBwcF9tYXJnaW4gLSBwcF9taW5fc3BhY2VfbGVmdCwgYW5kXG4gICBwcF9zcGFjZV9sZWZ0ID0gcHBfbWFyZ2luLiAqKVxubGV0IHBwX3NldF9tYXhfaW5kZW50IHN0YXRlIG4gPVxuICBpZiBuID4gMSB0aGVuXG4gICAgcHBfc2V0X21pbl9zcGFjZV9sZWZ0IHN0YXRlIChzdGF0ZS5wcF9tYXJnaW4gLSBuKVxuXG5cbmxldCBwcF9nZXRfbWF4X2luZGVudCBzdGF0ZSAoKSA9IHN0YXRlLnBwX21heF9pbmRlbnRcblxubGV0IHBwX3NldF9tYXJnaW4gc3RhdGUgbiA9XG4gIGlmIG4gPj0gMSB0aGVuXG4gICAgbGV0IG4gPSBwcF9saW1pdCBuIGluXG4gICAgc3RhdGUucHBfbWFyZ2luIDwtIG47XG4gICAgbGV0IG5ld19tYXhfaW5kZW50ID1cbiAgICAgICgqIFRyeSB0byBtYWludGFpbiBtYXhfaW5kZW50IHRvIGl0cyBhY3R1YWwgdmFsdWUuICopXG4gICAgICBpZiBzdGF0ZS5wcF9tYXhfaW5kZW50IDw9IHN0YXRlLnBwX21hcmdpblxuICAgICAgdGhlbiBzdGF0ZS5wcF9tYXhfaW5kZW50IGVsc2VcbiAgICAgICgqIElmIHBvc3NpYmxlIG1haW50YWluIHBwX21pbl9zcGFjZV9sZWZ0IHRvIGl0cyBhY3R1YWwgdmFsdWUsXG4gICAgICAgICBpZiB0aGlzIGxlYWRzIHRvIGEgdG9vIHNtYWxsIG1heF9pbmRlbnQsIHRha2UgaGFsZiBvZiB0aGVcbiAgICAgICAgIG5ldyBtYXJnaW4sIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLiAqKVxuICAgICAgIEludC5tYXggKEludC5tYXggKHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX21pbl9zcGFjZV9sZWZ0KVxuICAgICAgICAgICAgICAgIChzdGF0ZS5wcF9tYXJnaW4gLyAyKSkgMSBpblxuICAgICgqIFJlYnVpbGQgaW52YXJpYW50cy4gKilcbiAgICBwcF9zZXRfbWF4X2luZGVudCBzdGF0ZSBuZXdfbWF4X2luZGVudFxuXG5cbigqKiBHZW9tZXRyeSBmdW5jdGlvbnMgYW5kIHR5cGVzICopXG50eXBlIGdlb21ldHJ5ID0geyBtYXhfaW5kZW50OmludDsgbWFyZ2luOiBpbnR9XG5cbmxldCB2YWxpZGF0ZV9nZW9tZXRyeSB7bWFyZ2luOyBtYXhfaW5kZW50fSA9XG4gIGlmIG1heF9pbmRlbnQgPCAyIHRoZW5cbiAgICBFcnJvciBcIm1heF9pbmRlbnQgPCAyXCJcbiAgZWxzZSBpZiBtYXJnaW4gPD0gbWF4X2luZGVudCB0aGVuXG4gICAgRXJyb3IgXCJtYXJnaW4gPD0gbWF4X2luZGVudFwiXG4gIGVsc2UgT2sgKClcblxubGV0IGNoZWNrX2dlb21ldHJ5IGdlb21ldHJ5ID1cbiAgbWF0Y2ggdmFsaWRhdGVfZ2VvbWV0cnkgZ2VvbWV0cnkgd2l0aFxuICB8IE9rICgpIC0+IHRydWVcbiAgfCBFcnJvciBfIC0+IGZhbHNlXG5cbmxldCBwcF9nZXRfbWFyZ2luIHN0YXRlICgpID0gc3RhdGUucHBfbWFyZ2luXG5cbmxldCBwcF9zZXRfZnVsbF9nZW9tZXRyeSBzdGF0ZSB7bWFyZ2luOyBtYXhfaW5kZW50fSA9XG4gIHBwX3NldF9tYXJnaW4gc3RhdGUgbWFyZ2luO1xuICBwcF9zZXRfbWF4X2luZGVudCBzdGF0ZSBtYXhfaW5kZW50O1xuICAoKVxuXG5sZXQgcHBfc2V0X2dlb21ldHJ5IHN0YXRlIH5tYXhfaW5kZW50IH5tYXJnaW4gPVxuICBsZXQgZ2VvbWV0cnkgPSB7IG1heF9pbmRlbnQ7IG1hcmdpbiB9IGluXG4gIG1hdGNoIHZhbGlkYXRlX2dlb21ldHJ5IGdlb21ldHJ5IHdpdGhcbiAgfCBFcnJvciBtc2cgLT5cbiAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoXCJGb3JtYXQucHBfc2V0X2dlb21ldHJ5OiBcIiBeIG1zZykpXG4gIHwgT2sgKCkgLT5cbiAgICBwcF9zZXRfZnVsbF9nZW9tZXRyeSBzdGF0ZSBnZW9tZXRyeVxuXG5sZXQgcHBfc2FmZV9zZXRfZ2VvbWV0cnkgc3RhdGUgfm1heF9pbmRlbnQgfm1hcmdpbiA9XG4gIGxldCBnZW9tZXRyeSA9IHsgbWF4X2luZGVudDsgbWFyZ2luIH0gaW5cbiAgbWF0Y2ggdmFsaWRhdGVfZ2VvbWV0cnkgZ2VvbWV0cnkgd2l0aFxuICB8IEVycm9yIF9tc2cgLT5cbiAgICAgKClcbiAgfCBPayAoKSAtPlxuICAgIHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlIGdlb21ldHJ5XG5cbmxldCBwcF9nZXRfZ2VvbWV0cnkgc3RhdGUgKCkgPVxuICB7IG1hcmdpbiA9IHBwX2dldF9tYXJnaW4gc3RhdGUgKCk7IG1heF9pbmRlbnQgPSBwcF9nZXRfbWF4X2luZGVudCBzdGF0ZSAoKSB9XG5cbmxldCBwcF91cGRhdGVfZ2VvbWV0cnkgc3RhdGUgdXBkYXRlID1cbiAgbGV0IGdlb21ldHJ5ID0gcHBfZ2V0X2dlb21ldHJ5IHN0YXRlICgpIGluXG4gIHBwX3NldF9mdWxsX2dlb21ldHJ5IHN0YXRlICh1cGRhdGUgZ2VvbWV0cnkpXG5cbigqIFNldHRpbmcgYSBmb3JtYXR0ZXIgYmFzaWMgb3V0cHV0IGZ1bmN0aW9ucy4gKilcbmxldCBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgc3RhdGUge1xuICAgICAgb3V0X3N0cmluZyA9IGY7XG4gICAgICBvdXRfZmx1c2ggPSBnO1xuICAgICAgb3V0X25ld2xpbmUgPSBoO1xuICAgICAgb3V0X3NwYWNlcyA9IGk7XG4gICAgICBvdXRfaW5kZW50ID0gajtcbiAgICB9ID1cbiAgc3RhdGUucHBfb3V0X3N0cmluZyA8LSBmO1xuICBzdGF0ZS5wcF9vdXRfZmx1c2ggPC0gZztcbiAgc3RhdGUucHBfb3V0X25ld2xpbmUgPC0gaDtcbiAgc3RhdGUucHBfb3V0X3NwYWNlcyA8LSBpO1xuICBzdGF0ZS5wcF9vdXRfaW5kZW50IDwtIGpcblxubGV0IHBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGF0ZSAoKSA9IHtcbiAgb3V0X3N0cmluZyA9IHN0YXRlLnBwX291dF9zdHJpbmc7XG4gIG91dF9mbHVzaCA9IHN0YXRlLnBwX291dF9mbHVzaDtcbiAgb3V0X25ld2xpbmUgPSBzdGF0ZS5wcF9vdXRfbmV3bGluZTtcbiAgb3V0X3NwYWNlcyA9IHN0YXRlLnBwX291dF9zcGFjZXM7XG4gIG91dF9pbmRlbnQgPSBzdGF0ZS5wcF9vdXRfaW5kZW50O1xufVxuXG5cbigqIFNldHRpbmcgYSBmb3JtYXR0ZXIgYmFzaWMgc3RyaW5nIG91dHB1dCBhbmQgZmx1c2ggZnVuY3Rpb25zLiAqKVxubGV0IHBwX3NldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyBzdGF0ZSBmIGcgPVxuICBzdGF0ZS5wcF9vdXRfc3RyaW5nIDwtIGY7IHN0YXRlLnBwX291dF9mbHVzaCA8LSBnXG5cbmxldCBwcF9nZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgc3RhdGUgKCkgPVxuICAoc3RhdGUucHBfb3V0X3N0cmluZywgc3RhdGUucHBfb3V0X2ZsdXNoKVxuXG5cbigqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIG91dHB1dCBuZXcgbGluZXMuICopXG5sZXQgZGlzcGxheV9uZXdsaW5lIHN0YXRlICgpID0gc3RhdGUucHBfb3V0X3N0cmluZyBcIlxcblwiIDAgIDFcblxuKCogVGhlIGRlZmF1bHQgZnVuY3Rpb24gdG8gb3V0cHV0IHNwYWNlcy4gKilcbmxldCBibGFua19saW5lID0gU3RyaW5nLm1ha2UgODAgJyAnXG5sZXQgcmVjIGRpc3BsYXlfYmxhbmtzIHN0YXRlIG4gPVxuICBpZiBuID4gMCB0aGVuXG4gIGlmIG4gPD0gODAgdGhlbiBzdGF0ZS5wcF9vdXRfc3RyaW5nIGJsYW5rX2xpbmUgMCBuIGVsc2VcbiAgYmVnaW5cbiAgICBzdGF0ZS5wcF9vdXRfc3RyaW5nIGJsYW5rX2xpbmUgMCA4MDtcbiAgICBkaXNwbGF5X2JsYW5rcyBzdGF0ZSAobiAtIDgwKVxuICBlbmRcblxuXG4oKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBvdXRwdXQgaW5kZW50YXRpb24gb2YgbmV3IGxpbmVzLiAqKVxubGV0IGRpc3BsYXlfaW5kZW50ID0gZGlzcGxheV9ibGFua3NcblxuKCogU2V0dGluZyBhIGZvcm1hdHRlciBiYXNpYyBvdXRwdXQgZnVuY3Rpb25zIGFzIHByaW50aW5nIHRvIGEgZ2l2ZW5cbiAgIFtTdGRsaWIub3V0X2NoYW5uZWxdIHZhbHVlLiAqKVxubGV0IHBwX3NldF9mb3JtYXR0ZXJfb3V0X2NoYW5uZWwgc3RhdGUgb2MgPVxuICBzdGF0ZS5wcF9vdXRfc3RyaW5nIDwtIG91dHB1dF9zdWJzdHJpbmcgb2M7XG4gIHN0YXRlLnBwX291dF9mbHVzaCA8LSAoZnVuICgpIC0+IGZsdXNoIG9jKTtcbiAgc3RhdGUucHBfb3V0X25ld2xpbmUgPC0gZGlzcGxheV9uZXdsaW5lIHN0YXRlO1xuICBzdGF0ZS5wcF9vdXRfc3BhY2VzIDwtIGRpc3BsYXlfYmxhbmtzIHN0YXRlO1xuICBzdGF0ZS5wcF9vdXRfaW5kZW50IDwtIGRpc3BsYXlfaW5kZW50IHN0YXRlXG5cbigqXG5cbiAgRGVmaW5pbmcgc3BlY2lmaWMgZm9ybWF0dGVyc1xuXG4qKVxuXG5sZXQgZGVmYXVsdF9wcF9tYXJrX29wZW5fdGFnID0gZnVuY3Rpb25cbiAgfCBTdHJpbmdfdGFnIHMgLT4gXCI8XCIgXiBzIF4gXCI+XCJcbiAgfCBfIC0+IFwiXCJcbmxldCBkZWZhdWx0X3BwX21hcmtfY2xvc2VfdGFnID0gZnVuY3Rpb25cbiAgfCBTdHJpbmdfdGFnIHMgLT4gXCI8L1wiIF4gcyBeIFwiPlwiXG4gIHwgXyAtPiBcIlwiXG5cbmxldCBkZWZhdWx0X3BwX3ByaW50X29wZW5fdGFnID0gaWdub3JlXG5sZXQgZGVmYXVsdF9wcF9wcmludF9jbG9zZV90YWcgPSBpZ25vcmVcblxuKCogQnVpbGRpbmcgYSBmb3JtYXR0ZXIgZ2l2ZW4gaXRzIGJhc2ljIG91dHB1dCBmdW5jdGlvbnMuXG4gICBPdGhlciBmaWVsZHMgZ2V0IHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMuICopXG5sZXQgcHBfbWFrZV9mb3JtYXR0ZXIgZiBnIGggaSBqID1cbiAgKCogVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGZvcm1hdHRlciBjb250YWlucyBhIGR1bW15IGJveC4gKilcbiAgbGV0IHBwX3F1ZXVlID0gUXVldWUuY3JlYXRlICgpIGluXG4gIGxldCBzeXNfdG9rID1cbiAgICB7IHNpemUgPSBTaXplLnVua25vd247IHRva2VuID0gUHBfYmVnaW4gKDAsIFBwX2hvdmJveCk7IGxlbmd0aCA9IDAgfSBpblxuICBRdWV1ZS5hZGQgc3lzX3RvayBwcF9xdWV1ZTtcbiAgbGV0IHNjYW5fc3RhY2sgPSBTdGFjay5jcmVhdGUgKCkgaW5cbiAgaW5pdGlhbGl6ZV9zY2FuX3N0YWNrIHNjYW5fc3RhY2s7XG4gIFN0YWNrLnB1c2ggeyBsZWZ0X3RvdGFsID0gMTsgcXVldWVfZWxlbSA9IHN5c190b2sgfSBzY2FuX3N0YWNrO1xuICBsZXQgcHBfbWFyZ2luID0gNzhcbiAgYW5kIHBwX21pbl9zcGFjZV9sZWZ0ID0gMTAgaW5cbiAge1xuICAgIHBwX3NjYW5fc3RhY2sgPSBzY2FuX3N0YWNrO1xuICAgIHBwX2Zvcm1hdF9zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKTtcbiAgICBwcF90Ym94X3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX3RhZ19zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKTtcbiAgICBwcF9tYXJrX3N0YWNrID0gU3RhY2suY3JlYXRlICgpO1xuICAgIHBwX21hcmdpbiA9IHBwX21hcmdpbjtcbiAgICBwcF9taW5fc3BhY2VfbGVmdCA9IHBwX21pbl9zcGFjZV9sZWZ0O1xuICAgIHBwX21heF9pbmRlbnQgPSBwcF9tYXJnaW4gLSBwcF9taW5fc3BhY2VfbGVmdDtcbiAgICBwcF9zcGFjZV9sZWZ0ID0gcHBfbWFyZ2luO1xuICAgIHBwX2N1cnJlbnRfaW5kZW50ID0gMDtcbiAgICBwcF9pc19uZXdfbGluZSA9IHRydWU7XG4gICAgcHBfbGVmdF90b3RhbCA9IDE7XG4gICAgcHBfcmlnaHRfdG90YWwgPSAxO1xuICAgIHBwX2N1cnJfZGVwdGggPSAxO1xuICAgIHBwX21heF9ib3hlcyA9IG1heF9pbnQ7XG4gICAgcHBfZWxsaXBzaXMgPSBcIi5cIjtcbiAgICBwcF9vdXRfc3RyaW5nID0gZjtcbiAgICBwcF9vdXRfZmx1c2ggPSBnO1xuICAgIHBwX291dF9uZXdsaW5lID0gaDtcbiAgICBwcF9vdXRfc3BhY2VzID0gaTtcbiAgICBwcF9vdXRfaW5kZW50ID0gajtcbiAgICBwcF9wcmludF90YWdzID0gZmFsc2U7XG4gICAgcHBfbWFya190YWdzID0gZmFsc2U7XG4gICAgcHBfbWFya19vcGVuX3RhZyA9IGRlZmF1bHRfcHBfbWFya19vcGVuX3RhZztcbiAgICBwcF9tYXJrX2Nsb3NlX3RhZyA9IGRlZmF1bHRfcHBfbWFya19jbG9zZV90YWc7XG4gICAgcHBfcHJpbnRfb3Blbl90YWcgPSBkZWZhdWx0X3BwX3ByaW50X29wZW5fdGFnO1xuICAgIHBwX3ByaW50X2Nsb3NlX3RhZyA9IGRlZmF1bHRfcHBfcHJpbnRfY2xvc2VfdGFnO1xuICAgIHBwX3F1ZXVlID0gcHBfcXVldWU7XG4gIH1cblxuXG4oKiBCdWlsZCBhIGZvcm1hdHRlciBvdXQgb2YgaXRzIG91dCBmdW5jdGlvbnMuICopXG5sZXQgZm9ybWF0dGVyX29mX291dF9mdW5jdGlvbnMgb3V0X2Z1bnMgPVxuICBwcF9tYWtlX2Zvcm1hdHRlclxuICAgIG91dF9mdW5zLm91dF9zdHJpbmdcbiAgICBvdXRfZnVucy5vdXRfZmx1c2hcbiAgICBvdXRfZnVucy5vdXRfbmV3bGluZVxuICAgIG91dF9mdW5zLm91dF9zcGFjZXNcbiAgICBvdXRfZnVucy5vdXRfaW5kZW50XG5cblxuKCogTWFrZSBhIGZvcm1hdHRlciB3aXRoIGRlZmF1bHQgZnVuY3Rpb25zIHRvIG91dHB1dCBzcGFjZXMsXG4gIGluZGVudGF0aW9uLCBhbmQgbmV3IGxpbmVzLiAqKVxubGV0IG1ha2VfZm9ybWF0dGVyIG91dHB1dCBmbHVzaCA9XG4gIGxldCBwcGYgPSBwcF9tYWtlX2Zvcm1hdHRlciBvdXRwdXQgZmx1c2ggaWdub3JlIGlnbm9yZSBpZ25vcmUgaW5cbiAgcHBmLnBwX291dF9uZXdsaW5lIDwtIGRpc3BsYXlfbmV3bGluZSBwcGY7XG4gIHBwZi5wcF9vdXRfc3BhY2VzIDwtIGRpc3BsYXlfYmxhbmtzIHBwZjtcbiAgcHBmLnBwX291dF9pbmRlbnQgPC0gZGlzcGxheV9pbmRlbnQgcHBmO1xuICBwcGZcblxuXG4oKiBNYWtlIGEgZm9ybWF0dGVyIHdyaXRpbmcgdG8gYSBnaXZlbiBbU3RkbGliLm91dF9jaGFubmVsXSB2YWx1ZS4gKilcbmxldCBmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwgb2MgPVxuICBtYWtlX2Zvcm1hdHRlciAob3V0cHV0X3N1YnN0cmluZyBvYykgKGZ1biAoKSAtPiBmbHVzaCBvYylcblxuXG4oKiBNYWtlIGEgZm9ybWF0dGVyIHdyaXRpbmcgdG8gYSBnaXZlbiBbQnVmZmVyLnRdIHZhbHVlLiAqKVxubGV0IGZvcm1hdHRlcl9vZl9idWZmZXIgYiA9XG4gIG1ha2VfZm9ybWF0dGVyIChCdWZmZXIuYWRkX3N1YnN0cmluZyBiKSBpZ25vcmVcblxuXG4oKiBBbGxvY2F0aW5nIGJ1ZmZlciBmb3IgcHJldHR5LXByaW50aW5nIHB1cnBvc2VzLlxuICAgRGVmYXVsdCBidWZmZXIgc2l6ZSBpcyBwcF9idWZmZXJfc2l6ZSBvciA1MTIuXG4qKVxubGV0IHBwX2J1ZmZlcl9zaXplID0gNTEyXG5sZXQgcHBfbWFrZV9idWZmZXIgKCkgPSBCdWZmZXIuY3JlYXRlIHBwX2J1ZmZlcl9zaXplXG5cbigqIFRoZSBzdGFuZGFyZCAoc2hhcmVkKSBidWZmZXIuICopXG5sZXQgc3RkYnVmID0gcHBfbWFrZV9idWZmZXIgKClcblxuKCogUHJlZGVmaW5lZCBmb3JtYXR0ZXJzIHN0YW5kYXJkIGZvcm1hdHRlciB0byBwcmludFxuICAgdG8gW1N0ZGxpYi5zdGRvdXRdLCBbU3RkbGliLnN0ZGVycl0sIGFuZCB7IXN0ZGJ1Zn0uICopXG5sZXQgc3RkX2Zvcm1hdHRlciA9IGZvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCBTdGRsaWIuc3Rkb3V0XG5hbmQgZXJyX2Zvcm1hdHRlciA9IGZvcm1hdHRlcl9vZl9vdXRfY2hhbm5lbCBTdGRsaWIuc3RkZXJyXG5hbmQgc3RyX2Zvcm1hdHRlciA9IGZvcm1hdHRlcl9vZl9idWZmZXIgc3RkYnVmXG5cbigqIEluaXRpYWxpc2UgZG9tYWluIGxvY2FsIHN0YXRlICopXG5tb2R1bGUgRExTID0gRG9tYWluLkRMU1xuXG5sZXQgc3RkYnVmX2tleSA9IERMUy5uZXdfa2V5IHBwX21ha2VfYnVmZmVyXG5sZXQgXyA9IERMUy5zZXQgc3RkYnVmX2tleSBzdGRidWZcblxubGV0IHN0cl9mb3JtYXR0ZXJfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPlxuICBmb3JtYXR0ZXJfb2ZfYnVmZmVyIChETFMuZ2V0IHN0ZGJ1Zl9rZXkpKVxubGV0IF8gPSBETFMuc2V0IHN0cl9mb3JtYXR0ZXJfa2V5IHN0cl9mb3JtYXR0ZXJcblxubGV0IGJ1ZmZlcmVkX291dF9zdHJpbmcga2V5IHN0ciBvZnMgbGVuID1cbiAgQnVmZmVyLmFkZF9zdWJzdHJpbmcgKERvbWFpbi5ETFMuZ2V0IGtleSkgc3RyIG9mcyBsZW5cblxubGV0IGJ1ZmZlcmVkX291dF9mbHVzaCBvYyBrZXkgKCkgPVxuICBsZXQgYnVmID0gRG9tYWluLkRMUy5nZXQga2V5IGluXG4gIGxldCBsZW4gPSBCdWZmZXIubGVuZ3RoIGJ1ZiBpblxuICBsZXQgc3RyID0gQnVmZmVyLmNvbnRlbnRzIGJ1ZiBpblxuICBvdXRwdXRfc3Vic3RyaW5nIG9jIHN0ciAwIGxlbiA7XG4gIFN0ZGxpYi5mbHVzaCBvYztcbiAgQnVmZmVyLmNsZWFyIGJ1ZlxuXG5sZXQgc3RkX2J1Zl9rZXkgPSBEb21haW4uRExTLm5ld19rZXkgKGZ1biAoKSAtPiBCdWZmZXIuY3JlYXRlIHBwX2J1ZmZlcl9zaXplKVxubGV0IGVycl9idWZfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IChmdW4gKCkgLT4gQnVmZmVyLmNyZWF0ZSBwcF9idWZmZXJfc2l6ZSlcblxubGV0IHN0ZF9mb3JtYXR0ZXJfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPlxuICBsZXQgcHBmID1cbiAgICBwcF9tYWtlX2Zvcm1hdHRlciAoYnVmZmVyZWRfb3V0X3N0cmluZyBzdGRfYnVmX2tleSlcbiAgICAgIChidWZmZXJlZF9vdXRfZmx1c2ggU3RkbGliLnN0ZG91dCBzdGRfYnVmX2tleSkgaWdub3JlIGlnbm9yZSBpZ25vcmVcbiAgaW5cbiAgcHBmLnBwX291dF9uZXdsaW5lIDwtIGRpc3BsYXlfbmV3bGluZSBwcGY7XG4gIHBwZi5wcF9vdXRfc3BhY2VzIDwtIGRpc3BsYXlfYmxhbmtzIHBwZjtcbiAgcHBmLnBwX291dF9pbmRlbnQgPC0gZGlzcGxheV9pbmRlbnQgcHBmO1xuICBEb21haW4uYXRfZXhpdCAocHBfcHJpbnRfZmx1c2ggcHBmKTtcbiAgcHBmKVxubGV0IF8gPSBETFMuc2V0IHN0ZF9mb3JtYXR0ZXJfa2V5IHN0ZF9mb3JtYXR0ZXJcblxubGV0IGVycl9mb3JtYXR0ZXJfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPlxuICBsZXQgcHBmID1cbiAgICBwcF9tYWtlX2Zvcm1hdHRlciAoYnVmZmVyZWRfb3V0X3N0cmluZyBlcnJfYnVmX2tleSlcbiAgICAgIChidWZmZXJlZF9vdXRfZmx1c2ggU3RkbGliLnN0ZGVyciBlcnJfYnVmX2tleSkgaWdub3JlIGlnbm9yZSBpZ25vcmVcbiAgaW5cbiAgcHBmLnBwX291dF9uZXdsaW5lIDwtIGRpc3BsYXlfbmV3bGluZSBwcGY7XG4gIHBwZi5wcF9vdXRfc3BhY2VzIDwtIGRpc3BsYXlfYmxhbmtzIHBwZjtcbiAgcHBmLnBwX291dF9pbmRlbnQgPC0gZGlzcGxheV9pbmRlbnQgcHBmO1xuICBEb21haW4uYXRfZXhpdCAocHBfcHJpbnRfZmx1c2ggcHBmKTtcbiAgcHBmKVxubGV0IF8gPSBETFMuc2V0IGVycl9mb3JtYXR0ZXJfa2V5IGVycl9mb3JtYXR0ZXJcblxubGV0IGdldF9zdGRfZm9ybWF0dGVyICgpID0gRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleVxubGV0IGdldF9lcnJfZm9ybWF0dGVyICgpID0gRExTLmdldCBlcnJfZm9ybWF0dGVyX2tleVxubGV0IGdldF9zdHJfZm9ybWF0dGVyICgpID0gRExTLmdldCBzdHJfZm9ybWF0dGVyX2tleVxubGV0IGdldF9zdGRidWYgKCkgPSBETFMuZ2V0IHN0ZGJ1Zl9rZXlcblxuKCogW2ZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIgYnVmIHBwZl0gZmx1c2hlcyBmb3JtYXR0ZXIgW3BwZl0sXG4gICB0aGVuIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBbYnVmXSB0aGF0IGlzIHJlc2V0LlxuICAgRm9ybWF0dGVyIFtwcGZdIGlzIHN1cHBvc2VkIHRvIHByaW50IHRvIGJ1ZmZlciBbYnVmXSwgb3RoZXJ3aXNlIHRoaXNcbiAgIGZ1bmN0aW9uIGlzIG5vdCByZWFsbHkgdXNlZnVsLiAqKVxubGV0IGZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIgYnVmIHBwZiA9XG4gIHBwX2ZsdXNoX3F1ZXVlIHBwZiBmYWxzZTtcbiAgbGV0IHMgPSBCdWZmZXIuY29udGVudHMgYnVmIGluXG4gIEJ1ZmZlci5yZXNldCBidWY7XG4gIHNcblxuKCogRmx1c2ggW3N0cl9mb3JtYXR0ZXJdIGFuZCBnZXQgdGhlIGNvbnRlbnRzIG9mIFtzdGRidWZdLiAqKVxubGV0IGZsdXNoX3N0cl9mb3JtYXR0ZXIgKCkgPVxuICBsZXQgc3RkYnVmID0gRExTLmdldCBzdGRidWZfa2V5IGluXG4gIGxldCBzdHJfZm9ybWF0dGVyID0gRExTLmdldCBzdHJfZm9ybWF0dGVyX2tleSBpblxuICBmbHVzaF9idWZmZXJfZm9ybWF0dGVyIHN0ZGJ1ZiBzdHJfZm9ybWF0dGVyXG5cbmxldCBtYWtlX3N5bmNocm9uaXplZF9mb3JtYXR0ZXIgb3V0cHV0IGZsdXNoID1cbiAgRExTLm5ld19rZXkgKGZ1biAoKSAtPlxuICAgIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIHBwX2J1ZmZlcl9zaXplIGluXG4gICAgbGV0IG91dHB1dCcgPSBCdWZmZXIuYWRkX3N1YnN0cmluZyBidWYgaW5cbiAgICBsZXQgZmx1c2gnICgpID1cbiAgICAgIG91dHB1dCAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgMCAoQnVmZmVyLmxlbmd0aCBidWYpO1xuICAgICAgQnVmZmVyLmNsZWFyIGJ1ZjtcbiAgICAgIGZsdXNoICgpXG4gICAgaW5cbiAgICBtYWtlX2Zvcm1hdHRlciBvdXRwdXQnIGZsdXNoJylcblxubGV0IHN5bmNocm9uaXplZF9mb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwgb2MgPVxuICBtYWtlX3N5bmNocm9uaXplZF9mb3JtYXR0ZXIgKG91dHB1dF9zdWJzdHJpbmcgb2MpIChmdW4gKCkgLT4gZmx1c2ggb2MpXG5cbigqXG4gIFN5bWJvbGljIHByZXR0eS1wcmludGluZ1xuKilcblxuKCpcbiAgU3ltYm9saWMgcHJldHR5LXByaW50aW5nIGlzIHByZXR0eS1wcmludGluZyB3aXRoIG5vIGxvdyBsZXZlbCBvdXRwdXQuXG5cbiAgV2hlbiB1c2luZyBhIHN5bWJvbGljIGZvcm1hdHRlciwgYWxsIHJlZ3VsYXIgcHJldHR5LXByaW50aW5nIGFjdGl2aXRpZXNcbiAgb2NjdXIgYnV0IG91dHB1dCBtYXRlcmlhbCBpcyBzeW1ib2xpYyBhbmQgc3RvcmVkIGluIGEgYnVmZmVyIG9mIG91dHB1dFxuICBpdGVtcy4gQXQgdGhlIGVuZCBvZiBwcmV0dHktcHJpbnRpbmcsIGZsdXNoaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGFsbG93c1xuICBwb3N0LXByb2Nlc3Npbmcgb2Ygc3ltYm9saWMgb3V0cHV0IGJlZm9yZSBsb3cgbGV2ZWwgb3V0cHV0IG9wZXJhdGlvbnMuXG4qKVxuXG50eXBlIHN5bWJvbGljX291dHB1dF9pdGVtID1cbiAgfCBPdXRwdXRfZmx1c2hcbiAgfCBPdXRwdXRfbmV3bGluZVxuICB8IE91dHB1dF9zdHJpbmcgb2Ygc3RyaW5nXG4gIHwgT3V0cHV0X3NwYWNlcyBvZiBpbnRcbiAgfCBPdXRwdXRfaW5kZW50IG9mIGludFxuXG50eXBlIHN5bWJvbGljX291dHB1dF9idWZmZXIgPSB7XG4gIG11dGFibGUgc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzIDogc3ltYm9saWNfb3V0cHV0X2l0ZW0gbGlzdDtcbn1cblxubGV0IG1ha2Vfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciAoKSA9XG4gIHsgc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzID0gW10gfVxuXG5sZXQgY2xlYXJfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgPVxuICBzb2Iuc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzIDwtIFtdXG5cbmxldCBnZXRfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgPVxuICBMaXN0LnJldiBzb2Iuc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzXG5cbmxldCBmbHVzaF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYiA9XG4gIGxldCBpdGVtcyA9IGdldF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYiBpblxuICBjbGVhcl9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIHNvYjtcbiAgaXRlbXNcblxubGV0IGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgaXRlbSA9XG4gIHNvYi5zeW1ib2xpY19vdXRwdXRfY29udGVudHMgPC0gaXRlbSA6OiBzb2Iuc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzXG5cbmxldCBmb3JtYXR0ZXJfb2Zfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgPVxuICBsZXQgc3ltYm9saWNfZmx1c2ggc29iICgpID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIE91dHB1dF9mbHVzaFxuICBhbmQgc3ltYm9saWNfbmV3bGluZSBzb2IgKCkgPVxuICAgIGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgT3V0cHV0X25ld2xpbmVcbiAgYW5kIHN5bWJvbGljX3N0cmluZyBzb2IgcyBpIG4gPVxuICAgIGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgKE91dHB1dF9zdHJpbmcgKFN0cmluZy5zdWIgcyBpIG4pKVxuICBhbmQgc3ltYm9saWNfc3BhY2VzIHNvYiBuID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIChPdXRwdXRfc3BhY2VzIG4pXG4gIGFuZCBzeW1ib2xpY19pbmRlbnQgc29iIG4gPVxuICAgIGFkZF9zeW1ib2xpY19vdXRwdXRfaXRlbSBzb2IgKE91dHB1dF9pbmRlbnQgbikgaW5cblxuICBsZXQgZiA9IHN5bWJvbGljX3N0cmluZyBzb2JcbiAgYW5kIGcgPSBzeW1ib2xpY19mbHVzaCBzb2JcbiAgYW5kIGggPSBzeW1ib2xpY19uZXdsaW5lIHNvYlxuICBhbmQgaSA9IHN5bWJvbGljX3NwYWNlcyBzb2JcbiAgYW5kIGogPSBzeW1ib2xpY19pbmRlbnQgc29iIGluXG4gIHBwX21ha2VfZm9ybWF0dGVyIGYgZyBoIGkgalxuXG4oKlxuXG4gIEJhc2ljIGZ1bmN0aW9ucyBvbiB0aGUgJ3N0YW5kYXJkJyBmb3JtYXR0ZXJcbiAgKHRoZSBmb3JtYXR0ZXIgdGhhdCBwcmludHMgdG8gW1N0ZGxpYi5zdGRvdXRdKS5cblxuKilcblxubGV0IG9wZW5faGJveCB2ID0gcHBfb3Blbl9oYm94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Blbl92Ym94IHYgPSBwcF9vcGVuX3Zib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvcGVuX2h2Ym94IHYgPSBwcF9vcGVuX2h2Ym94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Blbl9ob3Zib3ggdiA9IHBwX29wZW5faG92Ym94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Blbl9ib3ggdiA9IHBwX29wZW5fYm94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgY2xvc2VfYm94IHYgPSBwcF9jbG9zZV9ib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvcGVuX3N0YWcgdiA9IHBwX29wZW5fc3RhZyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGNsb3NlX3N0YWcgdiA9IHBwX2Nsb3NlX3N0YWcgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9hcyB2IHcgPSBwcF9wcmludF9hcyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdiB3XG5hbmQgcHJpbnRfc3RyaW5nIHYgPSBwcF9wcmludF9zdHJpbmcgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9ieXRlcyB2ID0gcHBfcHJpbnRfYnl0ZXMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9pbnQgdiA9IHBwX3ByaW50X2ludCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2Zsb2F0IHYgPSBwcF9wcmludF9mbG9hdCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2NoYXIgdiA9IHBwX3ByaW50X2NoYXIgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9ib29sIHYgPSBwcF9wcmludF9ib29sIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfYnJlYWsgdiB3ID0gcHBfcHJpbnRfYnJlYWsgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHYgd1xuYW5kIHByaW50X2N1dCB2ID0gcHBfcHJpbnRfY3V0IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfc3BhY2UgdiA9IHBwX3ByaW50X3NwYWNlIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZm9yY2VfbmV3bGluZSB2ID0gcHBfZm9yY2VfbmV3bGluZSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2ZsdXNoIHYgPSBwcF9wcmludF9mbHVzaCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X25ld2xpbmUgdiA9IHBwX3ByaW50X25ld2xpbmUgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9pZl9uZXdsaW5lIHYgPSBwcF9wcmludF9pZl9uZXdsaW5lIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBvcGVuX3Rib3ggdiA9IHBwX29wZW5fdGJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGNsb3NlX3Rib3ggdiA9IHBwX2Nsb3NlX3Rib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF90YnJlYWsgdiB3ID0gcHBfcHJpbnRfdGJyZWFrIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2IHdcblxuYW5kIHNldF90YWIgdiA9IHBwX3NldF90YWIgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF90YWIgdiA9IHBwX3ByaW50X3RhYiAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X21hcmdpbiB2ID0gcHBfc2V0X21hcmdpbiAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9tYXJnaW4gdiA9IHBwX2dldF9tYXJnaW4gKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9tYXhfaW5kZW50IHYgPSBwcF9zZXRfbWF4X2luZGVudCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9tYXhfaW5kZW50IHYgPSBwcF9nZXRfbWF4X2luZGVudCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2dlb21ldHJ5IH5tYXhfaW5kZW50IH5tYXJnaW4gPVxuICBwcF9zZXRfZ2VvbWV0cnkgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIH5tYXhfaW5kZW50IH5tYXJnaW5cbmFuZCBzYWZlX3NldF9nZW9tZXRyeSB+bWF4X2luZGVudCB+bWFyZ2luID1cbiAgcHBfc2FmZV9zZXRfZ2VvbWV0cnkgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIH5tYXhfaW5kZW50IH5tYXJnaW5cbmFuZCBnZXRfZ2VvbWV0cnkgdiA9IHBwX2dldF9nZW9tZXRyeSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHVwZGF0ZV9nZW9tZXRyeSB2ID0gcHBfdXBkYXRlX2dlb21ldHJ5IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfbWF4X2JveGVzIHYgPSBwcF9zZXRfbWF4X2JveGVzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X21heF9ib3hlcyB2ID0gcHBfZ2V0X21heF9ib3hlcyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG92ZXJfbWF4X2JveGVzIHYgPSBwcF9vdmVyX21heF9ib3hlcyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2VsbGlwc2lzX3RleHQgdiA9IHBwX3NldF9lbGxpcHNpc190ZXh0IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X2VsbGlwc2lzX3RleHQgdiA9IHBwX2dldF9lbGxpcHNpc190ZXh0IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIHYgPVxuICBwcF9zZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgdiA9XG4gIHBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyB2ID1cbiAgcHBfZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgdiB3ID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2IHdcbmFuZCBnZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgdiA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyB2ID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgdiA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBzZXRfcHJpbnRfdGFncyB2ID1cbiAgcHBfc2V0X3ByaW50X3RhZ3MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfcHJpbnRfdGFncyB2ID1cbiAgcHBfZ2V0X3ByaW50X3RhZ3MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBzZXRfbWFya190YWdzIHYgPVxuICBwcF9zZXRfbWFya190YWdzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X21hcmtfdGFncyB2ID1cbiAgcHBfZ2V0X21hcmtfdGFncyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHNldF90YWdzIHYgPVxuICBwcF9zZXRfdGFncyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5cbigqIENvbnZlbmllbmNlIGZ1bmN0aW9ucyAqKVxuXG4oKiBUbyBmb3JtYXQgYSBsaXN0ICopXG5sZXQgcmVjIHBwX3ByaW50X2xpc3QgPyhwcF9zZXAgPSBwcF9wcmludF9jdXQpIHBwX3YgcHBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiAoKVxuICB8IFt2XSAtPiBwcF92IHBwZiB2XG4gIHwgdiA6OiB2cyAtPlxuICAgIHBwX3YgcHBmIHY7XG4gICAgcHBfc2VwIHBwZiAoKTtcbiAgICBwcF9wcmludF9saXN0IH5wcF9zZXAgcHBfdiBwcGYgdnNcblxuKCogVG8gZm9ybWF0IGEgc2VxdWVuY2UgKilcbmxldCByZWMgcHBfcHJpbnRfc2VxX2luIH5wcF9zZXAgcHBfdiBwcGYgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBTZXEuTmlsIC0+ICgpXG4gIHwgU2VxLkNvbnMgKHYsIHNlcSkgLT5cbiAgICBwcF9zZXAgcHBmICgpO1xuICAgIHBwX3YgcHBmIHY7XG4gICAgcHBfcHJpbnRfc2VxX2luIH5wcF9zZXAgcHBfdiBwcGYgc2VxXG5cbmxldCBwcF9wcmludF9zZXEgPyhwcF9zZXAgPSBwcF9wcmludF9jdXQpIHBwX3YgcHBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgU2VxLk5pbCAtPiAoKVxuICB8IFNlcS5Db25zICh2LCBzZXEpIC0+XG4gICAgcHBfdiBwcGYgdjtcbiAgICBwcF9wcmludF9zZXFfaW4gfnBwX3NlcCBwcF92IHBwZiBzZXFcblxuKCogVG8gZm9ybWF0IGZyZWUtZmxvd2luZyB0ZXh0ICopXG5sZXQgcHBfcHJpbnRfdGV4dCBwcGYgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IGxlZnQgPSByZWYgMCBpblxuICBsZXQgcmlnaHQgPSByZWYgMCBpblxuICBsZXQgZmx1c2ggKCkgPVxuICAgIHBwX3ByaW50X3N0cmluZyBwcGYgKFN0cmluZy5zdWIgcyAhbGVmdCAoIXJpZ2h0IC0gIWxlZnQpKTtcbiAgICBpbmNyIHJpZ2h0OyBsZWZ0IDo9ICFyaWdodDtcbiAgaW5cbiAgd2hpbGUgKCFyaWdodCA8PiBsZW4pIGRvXG4gICAgbWF0Y2ggcy5bIXJpZ2h0XSB3aXRoXG4gICAgICB8ICdcXG4nIC0+XG4gICAgICAgIGZsdXNoICgpO1xuICAgICAgICBwcF9mb3JjZV9uZXdsaW5lIHBwZiAoKVxuICAgICAgfCAnICcgLT5cbiAgICAgICAgZmx1c2ggKCk7IHBwX3ByaW50X3NwYWNlIHBwZiAoKVxuICAgICAgKCogdGhlcmUgaXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgJ1xcdCdcbiAgICAgICAgIGFzIGl0IGlzIHVuY2xlYXIgd2hhdCBhIHJpZ2h0IHNlbWFudGljcyB3b3VsZCBiZSAqKVxuICAgICAgfCBfIC0+IGluY3IgcmlnaHRcbiAgZG9uZTtcbiAgaWYgIWxlZnQgPD4gbGVuIHRoZW4gZmx1c2ggKClcblxubGV0IHBwX3ByaW50X29wdGlvbiA/KG5vbmUgPSBmdW4gXyAoKSAtPiAoKSkgcHBfdiBwcGYgPSBmdW5jdGlvblxufCBOb25lIC0+IG5vbmUgcHBmICgpXG58IFNvbWUgdiAtPiBwcF92IHBwZiB2XG5cbmxldCBwcF9wcmludF9yZXN1bHQgfm9rIH5lcnJvciBwcGYgPSBmdW5jdGlvblxufCBPayB2IC0+IG9rIHBwZiB2XG58IEVycm9yIGUgLT4gZXJyb3IgcHBmIGVcblxubGV0IHBwX3ByaW50X2VpdGhlciB+bGVmdCB+cmlnaHQgcHBmID0gZnVuY3Rpb25cbnwgRWl0aGVyLkxlZnQgbCAtPiBsZWZ0IHBwZiBsXG58IEVpdGhlci5SaWdodCByIC0+IHJpZ2h0IHBwZiByXG5cbiAoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmxldCBjb21wdXRlX3RhZyBvdXRwdXQgdGFnX2FjYyA9XG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDE2IGluXG4gIGxldCBwcGYgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGJ1ZiBpblxuICBvdXRwdXQgcHBmIHRhZ19hY2M7XG4gIHBwX3ByaW50X2ZsdXNoIHBwZiAoKTtcbiAgbGV0IGxlbiA9IEJ1ZmZlci5sZW5ndGggYnVmIGluXG4gIGlmIGxlbiA8IDIgdGhlbiBCdWZmZXIuY29udGVudHMgYnVmXG4gIGVsc2UgQnVmZmVyLnN1YiBidWYgMSAobGVuIC0gMilcblxuICgqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gIERlZmluaW5nIGNvbnRpbnVhdGlvbnMgdG8gYmUgcGFzc2VkIGFzIGFyZ3VtZW50cyBvZlxuICBDYW1saW50ZXJuYWxGb3JtYXQubWFrZV9wcmludGYuXG5cbiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdFxuXG4oKiBJbnRlcnByZXQgYSBmb3JtYXR0aW5nIGVudGl0eSBvbiBhIGZvcm1hdHRlci4gKilcbmxldCBvdXRwdXRfZm9ybWF0dGluZ19saXQgcHBmIGZtdGluZ19saXQgPSBtYXRjaCBmbXRpbmdfbGl0IHdpdGhcbiAgfCBDbG9zZV9ib3ggICAgICAgICAgICAgICAgIC0+IHBwX2Nsb3NlX2JveCBwcGYgKClcbiAgfCBDbG9zZV90YWcgICAgICAgICAgICAgICAgIC0+IHBwX2Nsb3NlX3N0YWcgcHBmICgpXG4gIHwgQnJlYWsgKF8sIHdpZHRoLCBvZmZzZXQpICAtPiBwcF9wcmludF9icmVhayBwcGYgd2lkdGggb2Zmc2V0XG4gIHwgRkZsdXNoICAgICAgICAgICAgICAgICAgICAtPiBwcF9wcmludF9mbHVzaCBwcGYgKClcbiAgfCBGb3JjZV9uZXdsaW5lICAgICAgICAgICAgIC0+IHBwX2ZvcmNlX25ld2xpbmUgcHBmICgpXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAtPiBwcF9wcmludF9uZXdsaW5lIHBwZiAoKVxuICB8IE1hZ2ljX3NpemUgKF8sIF8pICAgICAgICAgLT4gKClcbiAgfCBFc2NhcGVkX2F0ICAgICAgICAgICAgICAgIC0+IHBwX3ByaW50X2NoYXIgcHBmICdAJ1xuICB8IEVzY2FwZWRfcGVyY2VudCAgICAgICAgICAgLT4gcHBfcHJpbnRfY2hhciBwcGYgJyUnXG4gIHwgU2Nhbl9pbmRpYyBjICAgICAgICAgICAgICAtPiBwcF9wcmludF9jaGFyIHBwZiAnQCc7IHBwX3ByaW50X2NoYXIgcHBmIGNcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhbiBvdXRwdXRfc3RyZWFtLiAqKVxuKCogRGlmZmVyIGZyb20gUHJpbnRmLm91dHB1dF9hY2MgYnkgdGhlIGludGVycHJldGF0aW9uIG9mIGZvcm1hdHRpbmcuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIENhbWxpbnRlcm5hbEZvcm1hdC5tYWtlX3ByaW50Zi4gKilcbmxldCByZWMgb3V0cHV0X2FjYyBwcGYgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIHMpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgcztcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgYykgLT5cbiAgICBvdXRwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSAoU3RyaW5nLm1ha2UgMSBjKTtcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGYpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBvdXRwdXRfZm9ybWF0dGluZ19saXQgcHBmIGY7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIHBwZiBwO1xuICAgIHBwX29wZW5fc3RhZyBwcGYgKFN0cmluZ190YWcgKGNvbXB1dGVfdGFnIG91dHB1dF9hY2MgYWNjJykpXG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBvdXRwdXRfYWNjIHBwZiBwO1xuICAgIGxldCAoaW5kZW50LCBidHkpID0gb3Blbl9ib3hfb2Zfc3RyaW5nIChjb21wdXRlX3RhZyBvdXRwdXRfYWNjIGFjYycpIGluXG4gICAgcHBfb3Blbl9ib3hfZ2VuIHBwZiBpbmRlbnQgYnR5XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBvdXRwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9zdHJpbmcgcHBmIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAocCwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChwLCBjKSAgICAgLT4gb3V0cHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfY2hhciBwcGYgYztcbiAgfCBBY2NfZGVsYXkgKHAsIGYpICAgICAgICAgLT4gb3V0cHV0X2FjYyBwcGYgcDsgZiBwcGY7XG4gIHwgQWNjX2ZsdXNoIHAgICAgICAgICAgICAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2ZsdXNoIHBwZiAoKTtcbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gb3V0cHV0X2FjYyBwcGYgcDsgaW52YWxpZF9hcmcgbXNnO1xuICB8IEVuZF9vZl9hY2MgICAgICAgICAgICAgICAtPiAoKVxuXG4oKiBSZWN1cnNpdmVseSBvdXRwdXQgYW4gXCJhY2N1bXVsYXRvclwiIGNvbnRhaW5pbmcgYSByZXZlcnNlZCBsaXN0IG9mXG4gICBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzLCAuLi4pIGluIGEgYnVmZmVyLiAqKVxuKCogRGlmZmVyIGZyb20gUHJpbnRmLmJ1ZnB1dF9hY2MgYnkgdGhlIGludGVycHJldGF0aW9uIG9mIGZvcm1hdHRpbmcuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIENhbWxpbnRlcm5hbEZvcm1hdC5tYWtlX3ByaW50Zi4gKilcbmxldCByZWMgc3RycHV0X2FjYyBwcGYgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIHMpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgcztcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgYykgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSAoU3RyaW5nLm1ha2UgMSBjKTtcbiAgfCBBY2NfZGVsYXkgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBmKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIChmICgpKTtcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGYpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBvdXRwdXRfZm9ybWF0dGluZ19saXQgcHBmIGY7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIHBwX29wZW5fc3RhZyBwcGYgKFN0cmluZ190YWcgKGNvbXB1dGVfdGFnIHN0cnB1dF9hY2MgYWNjJykpXG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl9ib3ggYWNjJykgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIGxldCAoaW5kZW50LCBidHkpID0gb3Blbl9ib3hfb2Zfc3RyaW5nIChjb21wdXRlX3RhZyBzdHJwdXRfYWNjIGFjYycpIGluXG4gICAgcHBfb3Blbl9ib3hfZ2VuIHBwZiBpbmRlbnQgYnR5XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBzdHJwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9zdHJpbmcgcHBmIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAocCwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChwLCBjKSAgICAgLT4gc3RycHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfY2hhciBwcGYgYztcbiAgfCBBY2NfZGVsYXkgKHAsIGYpICAgICAgICAgLT4gc3RycHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfc3RyaW5nIHBwZiAoZiAoKSk7XG4gIHwgQWNjX2ZsdXNoIHAgICAgICAgICAgICAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2ZsdXNoIHBwZiAoKTtcbiAgfCBBY2NfaW52YWxpZF9hcmcgKHAsIG1zZykgLT4gc3RycHV0X2FjYyBwcGYgcDsgaW52YWxpZF9hcmcgbXNnO1xuICB8IEVuZF9vZl9hY2MgICAgICAgICAgICAgICAtPiAoKVxuXG4oKlxuXG4gIERlZmluaW5nIFtmcHJpbnRmXSBhbmQgdmFyaW91cyBmbGF2b3JzIG9mIFtmcHJpbnRmXS5cblxuKilcblxubGV0IGtmcHJpbnRmIGsgcHBmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGZcbiAgICAoZnVuIGFjYyAtPiBvdXRwdXRfYWNjIHBwZiBhY2M7IGsgcHBmKVxuICAgIEVuZF9vZl9hY2MgZm10XG5cbmFuZCBpa2ZwcmludGYgayBwcGYgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX2lwcmludGYgayBwcGYgZm10XG5cbmxldCBpZnByaW50ZiBfcHBmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9pcHJpbnRmIGlnbm9yZSAoKSBmbXRcblxubGV0IGZwcmludGYgcHBmID0ga2ZwcmludGYgaWdub3JlIHBwZlxuXG5sZXQgcHJpbnRmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGZcbiAgICAoZnVuIGFjYyAtPiBvdXRwdXRfYWNjIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSBhY2MpXG4gICAgRW5kX29mX2FjYyBmbXRcblxubGV0IGVwcmludGYgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZlxuICAgIChmdW4gYWNjIC0+IG91dHB1dF9hY2MgKERMUy5nZXQgZXJyX2Zvcm1hdHRlcl9rZXkpIGFjYylcbiAgICBFbmRfb2ZfYWNjIGZtdFxuXG5sZXQga2RwcmludGYgayAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gayAoZnVuIHBwZiAtPiBvdXRwdXRfYWNjIHBwZiBhY2MpKVxuICAgIEVuZF9vZl9hY2MgZm10XG5cbmxldCBkcHJpbnRmIGZtdCA9IGtkcHJpbnRmIChmdW4gaSAtPiBpKSBmbXRcblxubGV0IGtzcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYiA9IHBwX21ha2VfYnVmZmVyICgpIGluXG4gIGxldCBwcGYgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGIgaW5cbiAgbGV0IGsgYWNjID1cbiAgICBzdHJwdXRfYWNjIHBwZiBhY2M7XG4gICAgayAoZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBiIHBwZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG5cbmxldCBzcHJpbnRmIGZtdCA9IGtzcHJpbnRmIGlkIGZtdFxuXG5sZXQga2FzcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBsZXQgYiA9IHBwX21ha2VfYnVmZmVyICgpIGluXG4gIGxldCBwcGYgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGIgaW5cbiAgbGV0IGsgYWNjID1cbiAgICBvdXRwdXRfYWNjIHBwZiBhY2M7XG4gICAgayAoZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBiIHBwZikgaW5cbiAgbWFrZV9wcmludGYgayBFbmRfb2ZfYWNjIGZtdFxuXG5cbmxldCBhc3ByaW50ZiBmbXQgPSBrYXNwcmludGYgaWQgZm10XG5cbigqIEZsdXNoaW5nIHN0YW5kYXJkIGZvcm1hdHRlcnMgYXQgZW5kIG9mIGV4ZWN1dGlvbi4gKilcblxubGV0IGZsdXNoX3N0YW5kYXJkX2Zvcm1hdHRlcnMgKCkgPVxuICBwcF9wcmludF9mbHVzaCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgKCk7XG4gIHBwX3ByaW50X2ZsdXNoIChETFMuZ2V0IGVycl9mb3JtYXR0ZXJfa2V5KSAoKVxuXG5sZXQgKCkgPSBhdF9leGl0IGZsdXNoX3N0YW5kYXJkX2Zvcm1hdHRlcnNcblxubGV0ICgpID0gRG9tYWluLmJlZm9yZV9maXJzdF9zcGF3biAoZnVuICgpIC0+XG4gIGZsdXNoX3N0YW5kYXJkX2Zvcm1hdHRlcnMgKCk7XG4gIGxldCBmcyA9IHBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyICgpIGluXG4gIHBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBzdGRfZm9ybWF0dGVyXG4gICAge2ZzIHdpdGggb3V0X3N0cmluZyA9IGJ1ZmZlcmVkX291dF9zdHJpbmcgc3RkX2J1Zl9rZXk7XG4gICAgICAgICAgICAgb3V0X2ZsdXNoID0gYnVmZmVyZWRfb3V0X2ZsdXNoIFN0ZGxpYi5zdGRvdXQgc3RkX2J1Zl9rZXl9O1xuXG4gIGxldCBmcyA9IHBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBlcnJfZm9ybWF0dGVyICgpIGluXG4gIHBwX3NldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyBlcnJfZm9ybWF0dGVyXG4gICAge2ZzIHdpdGggb3V0X3N0cmluZyA9IGJ1ZmZlcmVkX291dF9zdHJpbmcgZXJyX2J1Zl9rZXk7XG4gICAgICAgICAgICAgb3V0X2ZsdXNoID0gYnVmZmVyZWRfb3V0X2ZsdXNoIFN0ZGxpYi5zdGRlcnIgZXJyX2J1Zl9rZXl9O1xuKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgUGllcnJlIFdlaXMsIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxuKCogYWxpYXMgdG8gYXZvaWQgd2FybmluZyBmb3IgYW1iaWd1aXR5IGJldHdlZW5cbiAgIFN0ZGxpYi5mb3JtYXQ2XG4gICBhbmQgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDZcblxuICAgKHRoZSBmb3JtZXIgaXMgaW4gZmFjdCBhbiBhbGlhcyBmb3IgdGhlIGxhdHRlcixcbiAgICBidXQgdGhlIGFtYmlndWl0eSB3YXJuaW5nIGRvZXNuJ3QgY2FyZSlcbiopXG50eXBlICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIFN0ZGxpYi5mb3JtYXQ2XG5cblxuKCogVGhlIHJ1bi10aW1lIGxpYnJhcnkgZm9yIHNjYW5uZXJzLiAqKVxuXG4oKiBTY2FubmluZyBidWZmZXJzLiAqKVxubW9kdWxlIHR5cGUgU0NBTk5JTkcgPSBzaWdcblxuICB0eXBlIGluX2NoYW5uZWxcblxuICB0eXBlIHNjYW5idWYgPSBpbl9jaGFubmVsXG5cbiAgdHlwZSBmaWxlX25hbWUgPSBzdHJpbmdcblxuICB2YWwgc3RkaW4gOiBpbl9jaGFubmVsXG4gICgqIFRoZSBzY2FubmluZyBidWZmZXIgcmVhZGluZyBmcm9tIFtTdGRsaWIuc3RkaW5dLiAqKVxuXG4gIHZhbCBuZXh0X2NoYXIgOiBzY2FuYnVmIC0+IGNoYXJcbiAgKCogW1NjYW5uaW5nLm5leHRfY2hhciBpYl0gYWR2YW5jZSB0aGUgc2Nhbm5pbmcgYnVmZmVyIGZvclxuICAgICBvbmUgY2hhcmFjdGVyLlxuICAgICBJZiBubyBtb3JlIGNoYXJhY3RlciBjYW4gYmUgcmVhZCwgc2V0cyBhIGVuZCBvZiBmaWxlIGNvbmRpdGlvbiBhbmRcbiAgICAgcmV0dXJucyAnXFwwMDAnLiAqKVxuXG4gIHZhbCBpbnZhbGlkYXRlX2N1cnJlbnRfY2hhciA6IHNjYW5idWYgLT4gdW5pdFxuICAoKiBbU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWJdIG1hcmsgdGhlIGN1cnJlbnRfY2hhciBhcyBhbHJlYWR5XG4gICAgIHNjYW5uZWQuICopXG5cbiAgdmFsIHBlZWtfY2hhciA6IHNjYW5idWYgLT4gY2hhclxuICAoKiBbU2Nhbm5pbmcucGVla19jaGFyIGliXSByZXR1cm5zIHRoZSBjdXJyZW50IGNoYXIgYXZhaWxhYmxlIGluXG4gICAgIHRoZSBidWZmZXIgb3IgcmVhZHMgb25lIGlmIG5lY2Vzc2FyeSAod2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXNcbiAgICAgYWxyZWFkeSBzY2FubmVkKS5cbiAgICAgSWYgbm8gY2hhcmFjdGVyIGNhbiBiZSByZWFkLCBzZXRzIGFuIGVuZCBvZiBmaWxlIGNvbmRpdGlvbiBhbmRcbiAgICAgcmV0dXJucyAnXFwwMDAnLiAqKVxuXG4gIHZhbCBjaGVja2VkX3BlZWtfY2hhciA6IHNjYW5idWYgLT4gY2hhclxuICAoKiBTYW1lIGFzIFtTY2FubmluZy5wZWVrX2NoYXJdIGFib3ZlIGJ1dCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIGNoYXIgb3JcbiAgICAgZmFpbHM6IGluc3RlYWQgb2YgcmV0dXJuaW5nIGEgbnVsbCBjaGFyIHdoZW4gdGhlIHJlYWRpbmcgbWV0aG9kIG9mIHRoZVxuICAgICBpbnB1dCBidWZmZXIgaGFzIHJlYWNoZWQgYW4gZW5kIG9mIGZpbGUsIHRoZSBmdW5jdGlvbiByYWlzZXMgZXhjZXB0aW9uXG4gICAgIFtFbmRfb2ZfZmlsZV0uICopXG5cbiAgdmFsIHN0b3JlX2NoYXIgOiBpbnQgLT4gc2NhbmJ1ZiAtPiBjaGFyIC0+IGludFxuICAoKiBbU2Nhbm5pbmcuc3RvcmVfY2hhciBsaW0gaWIgY10gYWRkcyBbY10gdG8gdGhlIHRva2VuIGJ1ZmZlclxuICAgICBvZiB0aGUgc2Nhbm5pbmcgYnVmZmVyIFtpYl0uIEl0IGFsc28gYWR2YW5jZXMgdGhlIHNjYW5uaW5nIGJ1ZmZlciBmb3JcbiAgICAgb25lIGNoYXJhY3RlciBhbmQgcmV0dXJucyBbbGltIC0gMV0sIGluZGljYXRpbmcgdGhlIG5ldyBsaW1pdCBmb3IgdGhlXG4gICAgIGxlbmd0aCBvZiB0aGUgY3VycmVudCB0b2tlbi4gKilcblxuICB2YWwgc2tpcF9jaGFyIDogaW50IC0+IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5za2lwX2NoYXIgbGltIGliXSBpZ25vcmVzIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4gKilcblxuICB2YWwgaWdub3JlX2NoYXIgOiBpbnQgLT4gc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLmlnbm9yZV9jaGFyIGliIGxpbV0gaWdub3JlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYW5kXG4gICAgIGRlY3JlbWVudHMgdGhlIGxpbWl0LiAqKVxuXG4gIHZhbCB0b2tlbiA6IHNjYW5idWYgLT4gc3RyaW5nXG4gICgqIFtTY2FubmluZy50b2tlbiBpYl0gcmV0dXJucyB0aGUgc3RyaW5nIHN0b3JlZCBpbnRvIHRoZSB0b2tlblxuICAgICBidWZmZXIgb2YgdGhlIHNjYW5uaW5nIGJ1ZmZlcjogaXQgcmV0dXJucyB0aGUgdG9rZW4gbWF0Y2hlZCBieSB0aGVcbiAgICAgZm9ybWF0LiAqKVxuXG4gIHZhbCByZXNldF90b2tlbiA6IHNjYW5idWYgLT4gdW5pdFxuICAoKiBbU2Nhbm5pbmcucmVzZXRfdG9rZW4gaWJdIHJlc2V0cyB0aGUgdG9rZW4gYnVmZmVyIG9mXG4gICAgIHRoZSBnaXZlbiBzY2FubmluZyBidWZmZXIuICopXG5cbiAgdmFsIGNoYXJfY291bnQgOiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcuY2hhcl9jb3VudCBpYl0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAgcmVhZCBzbyBmYXIgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiAqKVxuXG4gIHZhbCBsaW5lX2NvdW50IDogc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLmxpbmVfY291bnQgaWJdIHJldHVybnMgdGhlIG51bWJlciBvZiBuZXcgbGluZVxuICAgICBjaGFyYWN0ZXJzIHJlYWQgc28gZmFyIGZyb20gdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgdG9rZW5fY291bnQgOiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcudG9rZW5fY291bnQgaWJdIHJldHVybnMgdGhlIG51bWJlciBvZiB0b2tlbnMgcmVhZFxuICAgICBzbyBmYXIgZnJvbSBbaWJdLiAqKVxuXG4gIHZhbCBlb2YgOiBzY2FuYnVmIC0+IGJvb2xcbiAgKCogW1NjYW5uaW5nLmVvZiBpYl0gcmV0dXJucyB0aGUgZW5kIG9mIGlucHV0IGNvbmRpdGlvblxuICAgICBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiAqKVxuXG4gIHZhbCBlbmRfb2ZfaW5wdXQgOiBzY2FuYnVmIC0+IGJvb2xcbiAgKCogW1NjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYl0gdGVzdHMgdGhlIGVuZCBvZiBpbnB1dCBjb25kaXRpb25cbiAgICAgb2YgdGhlIGdpdmVuIGJ1ZmZlciAoaWYgbm8gY2hhciBoYXMgZXZlciBiZWVuIHJlYWQsIGFuIGF0dGVtcHQgdG9cbiAgICAgcmVhZCBvbmUgaXMgcGVyZm9ybWVkKS4gKilcblxuICB2YWwgYmVnaW5uaW5nX29mX2lucHV0IDogc2NhbmJ1ZiAtPiBib29sXG4gICgqIFtTY2FubmluZy5iZWdpbm5pbmdfb2ZfaW5wdXQgaWJdIHRlc3RzIHRoZSBiZWdpbm5pbmcgb2YgaW5wdXRcbiAgICAgY29uZGl0aW9uIG9mIHRoZSBnaXZlbiBidWZmZXIuICopXG5cbiAgdmFsIG5hbWVfb2ZfaW5wdXQgOiBzY2FuYnVmIC0+IHN0cmluZ1xuICAoKiBbU2Nhbm5pbmcubmFtZV9vZl9pbnB1dCBpYl0gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyXG4gICAgIHNvdXJjZSBmb3IgaW5wdXQgYnVmZmVyIFtpYl0uICopXG5cbiAgdmFsIG9wZW5faW4gOiBmaWxlX25hbWUgLT4gaW5fY2hhbm5lbFxuICB2YWwgb3Blbl9pbl9iaW4gOiBmaWxlX25hbWUgLT4gaW5fY2hhbm5lbFxuICB2YWwgZnJvbV9maWxlIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fZmlsZV9iaW4gOiBmaWxlX25hbWUgLT4gaW5fY2hhbm5lbFxuICB2YWwgZnJvbV9zdHJpbmcgOiBzdHJpbmcgLT4gaW5fY2hhbm5lbFxuICB2YWwgZnJvbV9mdW5jdGlvbiA6ICh1bml0IC0+IGNoYXIpIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fY2hhbm5lbCA6IFN0ZGxpYi5pbl9jaGFubmVsIC0+IGluX2NoYW5uZWxcblxuICB2YWwgY2xvc2VfaW4gOiBpbl9jaGFubmVsIC0+IHVuaXRcblxuZW5kXG5cblxubW9kdWxlIFNjYW5uaW5nIDogU0NBTk5JTkcgPSBzdHJ1Y3RcblxuICAoKiBUaGUgcnVuLXRpbWUgbGlicmFyeSBmb3Igc2NhbmYuICopXG5cbiAgdHlwZSBmaWxlX25hbWUgPSBzdHJpbmdcblxuICB0eXBlIGluX2NoYW5uZWxfbmFtZSA9XG4gICAgfCBGcm9tX2NoYW5uZWwgb2YgU3RkbGliLmluX2NoYW5uZWxcbiAgICB8IEZyb21fZmlsZSBvZiBmaWxlX25hbWUgKiBTdGRsaWIuaW5fY2hhbm5lbFxuICAgIHwgRnJvbV9mdW5jdGlvblxuICAgIHwgRnJvbV9zdHJpbmdcblxuXG4gIHR5cGUgaW5fY2hhbm5lbCA9IHtcbiAgICBtdXRhYmxlIGljX2VvZiA6IGJvb2w7XG4gICAgbXV0YWJsZSBpY19jdXJyZW50X2NoYXIgOiBjaGFyO1xuICAgIG11dGFibGUgaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDogYm9vbDtcbiAgICBtdXRhYmxlIGljX2NoYXJfY291bnQgOiBpbnQ7XG4gICAgbXV0YWJsZSBpY19saW5lX2NvdW50IDogaW50O1xuICAgIG11dGFibGUgaWNfdG9rZW5fY291bnQgOiBpbnQ7XG4gICAgaWNfZ2V0X25leHRfY2hhciA6IHVuaXQgLT4gY2hhcjtcbiAgICBpY190b2tlbl9idWZmZXIgOiBCdWZmZXIudDtcbiAgICBpY19pbnB1dF9uYW1lIDogaW5fY2hhbm5lbF9uYW1lO1xuICB9XG5cblxuICB0eXBlIHNjYW5idWYgPSBpbl9jaGFubmVsXG5cbiAgbGV0IG51bGxfY2hhciA9ICdcXDAwMCdcblxuICAoKiBSZWFkcyBhIG5ldyBjaGFyYWN0ZXIgZnJvbSBpbnB1dCBidWZmZXIuXG4gICAgIE5leHRfY2hhciBuZXZlciBmYWlscywgZXZlbiBpbiBjYXNlIG9mIGVuZCBvZiBpbnB1dDpcbiAgICAgaXQgdGhlbiBzaW1wbHkgc2V0cyB0aGUgZW5kIG9mIGZpbGUgY29uZGl0aW9uLiAqKVxuICBsZXQgbmV4dF9jaGFyIGliID1cbiAgICB0cnlcbiAgICAgIGxldCBjID0gaWIuaWNfZ2V0X25leHRfY2hhciAoKSBpblxuICAgICAgaWIuaWNfY3VycmVudF9jaGFyIDwtIGM7XG4gICAgICBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPC0gdHJ1ZTtcbiAgICAgIGliLmljX2NoYXJfY291bnQgPC0gc3VjYyBpYi5pY19jaGFyX2NvdW50O1xuICAgICAgaWYgYyA9ICdcXG4nIHRoZW4gaWIuaWNfbGluZV9jb3VudCA8LSBzdWNjIGliLmljX2xpbmVfY291bnQ7XG4gICAgICBjIHdpdGhcbiAgICB8IEVuZF9vZl9maWxlIC0+XG4gICAgICBsZXQgYyA9IG51bGxfY2hhciBpblxuICAgICAgaWIuaWNfY3VycmVudF9jaGFyIDwtIGM7XG4gICAgICBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWQgPC0gZmFsc2U7XG4gICAgICBpYi5pY19lb2YgPC0gdHJ1ZTtcbiAgICAgIGNcblxuXG4gIGxldCBwZWVrX2NoYXIgaWIgPVxuICAgIGlmIGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZFxuICAgIHRoZW4gaWIuaWNfY3VycmVudF9jaGFyXG4gICAgZWxzZSBuZXh0X2NoYXIgaWJcblxuXG4gICgqIFJldHVybnMgYSB2YWxpZCBjdXJyZW50IGNoYXIgZm9yIHRoZSBpbnB1dCBidWZmZXIuIEluIHBhcnRpY3VsYXJcbiAgICAgbm8gaXJyZWxldmFudCBudWxsIGNoYXJhY3RlciAoYXMgc2V0IGJ5IFtuZXh0X2NoYXJdIGluIGNhc2Ugb2YgZW5kXG4gICAgIG9mIGlucHV0KSBpcyByZXR1cm5lZCwgc2luY2UgW0VuZF9vZl9maWxlXSBpcyByYWlzZWQgd2hlblxuICAgICBbbmV4dF9jaGFyXSBzZXRzIHRoZSBlbmQgb2YgZmlsZSBjb25kaXRpb24gd2hpbGUgdHJ5aW5nIHRvIHJlYWQgYVxuICAgICBuZXcgY2hhcmFjdGVyLiAqKVxuICBsZXQgY2hlY2tlZF9wZWVrX2NoYXIgaWIgPVxuICAgIGxldCBjID0gcGVla19jaGFyIGliIGluXG4gICAgaWYgaWIuaWNfZW9mIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICAgY1xuXG5cbiAgbGV0IGVuZF9vZl9pbnB1dCBpYiA9XG4gICAgaWdub3JlIChwZWVrX2NoYXIgaWIpO1xuICAgIGliLmljX2VvZlxuXG5cbiAgbGV0IGVvZiBpYiA9IGliLmljX2VvZlxuXG4gIGxldCBiZWdpbm5pbmdfb2ZfaW5wdXQgaWIgPSBpYi5pY19jaGFyX2NvdW50ID0gMFxuXG4gIGxldCBuYW1lX29mX2lucHV0IGliID1cbiAgICBtYXRjaCBpYi5pY19pbnB1dF9uYW1lIHdpdGhcbiAgICB8IEZyb21fY2hhbm5lbCBfaWMgLT4gXCJ1bm5hbWVkIFN0ZGxpYiBpbnB1dCBjaGFubmVsXCJcbiAgICB8IEZyb21fZmlsZSAoZm5hbWUsIF9pYykgLT4gZm5hbWVcbiAgICB8IEZyb21fZnVuY3Rpb24gLT4gXCJ1bm5hbWVkIGZ1bmN0aW9uXCJcbiAgICB8IEZyb21fc3RyaW5nIC0+IFwidW5uYW1lZCBjaGFyYWN0ZXIgc3RyaW5nXCJcblxuXG4gIGxldCBjaGFyX2NvdW50IGliID1cbiAgICBpZiBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWRcbiAgICB0aGVuIGliLmljX2NoYXJfY291bnQgLSAxXG4gICAgZWxzZSBpYi5pY19jaGFyX2NvdW50XG5cblxuICBsZXQgbGluZV9jb3VudCBpYiA9IGliLmljX2xpbmVfY291bnRcblxuICBsZXQgcmVzZXRfdG9rZW4gaWIgPSBCdWZmZXIucmVzZXQgaWIuaWNfdG9rZW5fYnVmZmVyXG5cbiAgbGV0IGludmFsaWRhdGVfY3VycmVudF9jaGFyIGliID0gaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDwtIGZhbHNlXG5cbiAgbGV0IHRva2VuIGliID1cbiAgICBsZXQgdG9rZW5fYnVmZmVyID0gaWIuaWNfdG9rZW5fYnVmZmVyIGluXG4gICAgbGV0IHRvayA9IEJ1ZmZlci5jb250ZW50cyB0b2tlbl9idWZmZXIgaW5cbiAgICBCdWZmZXIuY2xlYXIgdG9rZW5fYnVmZmVyO1xuICAgIGliLmljX3Rva2VuX2NvdW50IDwtIHN1Y2MgaWIuaWNfdG9rZW5fY291bnQ7XG4gICAgdG9rXG5cblxuICBsZXQgdG9rZW5fY291bnQgaWIgPSBpYi5pY190b2tlbl9jb3VudFxuXG4gIGxldCBza2lwX2NoYXIgd2lkdGggaWIgPVxuICAgIGludmFsaWRhdGVfY3VycmVudF9jaGFyIGliO1xuICAgIHdpZHRoXG5cblxuICBsZXQgaWdub3JlX2NoYXIgd2lkdGggaWIgPSBza2lwX2NoYXIgKHdpZHRoIC0gMSkgaWJcblxuICBsZXQgc3RvcmVfY2hhciB3aWR0aCBpYiBjID1cbiAgICBCdWZmZXIuYWRkX2NoYXIgaWIuaWNfdG9rZW5fYnVmZmVyIGM7XG4gICAgaWdub3JlX2NoYXIgd2lkdGggaWJcblxuXG4gIGxldCBkZWZhdWx0X3Rva2VuX2J1ZmZlcl9zaXplID0gMTAyNFxuXG4gIGxldCBjcmVhdGUgaW5hbWUgbmV4dCA9IHtcbiAgICBpY19lb2YgPSBmYWxzZTtcbiAgICBpY19jdXJyZW50X2NoYXIgPSBudWxsX2NoYXI7XG4gICAgaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkID0gZmFsc2U7XG4gICAgaWNfY2hhcl9jb3VudCA9IDA7XG4gICAgaWNfbGluZV9jb3VudCA9IDA7XG4gICAgaWNfdG9rZW5fY291bnQgPSAwO1xuICAgIGljX2dldF9uZXh0X2NoYXIgPSBuZXh0O1xuICAgIGljX3Rva2VuX2J1ZmZlciA9IEJ1ZmZlci5jcmVhdGUgZGVmYXVsdF90b2tlbl9idWZmZXJfc2l6ZTtcbiAgICBpY19pbnB1dF9uYW1lID0gaW5hbWU7XG4gIH1cblxuXG4gIGxldCBmcm9tX3N0cmluZyBzID1cbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICAgIGxldCBuZXh0ICgpID1cbiAgICAgIGlmICFpID49IGxlbiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlIGVsc2VcbiAgICAgIGxldCBjID0gcy5bIWldIGluXG4gICAgICBpbmNyIGk7XG4gICAgICBjIGluXG4gICAgY3JlYXRlIEZyb21fc3RyaW5nIG5leHRcblxuXG4gIGxldCBmcm9tX2Z1bmN0aW9uID0gY3JlYXRlIEZyb21fZnVuY3Rpb25cblxuICAoKiBTY2FubmluZyBmcm9tIGFuIGlucHV0IGNoYW5uZWwuICopXG5cbiAgKCogUG9zaXRpb24gb2YgdGhlIHByb2JsZW06XG5cbiAgICAgV2UgY2Fubm90IHByZXZlbnQgdGhlIHNjYW5uaW5nIG1lY2hhbmlzbSB0byB1c2Ugb25lIGxvb2thaGVhZCBjaGFyYWN0ZXIsXG4gICAgIGlmIG5lZWRlZCBieSB0aGUgc2VtYW50aWNzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIHNwZWNpZmljYXRpb25zIChlLmcuIGFcbiAgICAgdHJhaWxpbmcgJ3NraXAgc3BhY2UnIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm1hdCBzdHJpbmcpOyBpbiB0aGlzIGNhc2UsXG4gICAgIHRoZSBtYW5kYXRvcnkgbG9va2FoZWFkIGNoYXJhY3RlciBpcyBpbmRlZWQgcmVhZCBmcm9tIHRoZSBpbnB1dCBhbmQgbm90XG4gICAgIHVzZWQgdG8gcmV0dXJuIHRoZSB0b2tlbiByZWFkLiBJdCBpcyB0aHVzIG1hbmRhdG9yeSB0byBiZSBhYmxlIHRvIHN0b3JlXG4gICAgIGFuIHVudXNlZCBsb29rYWhlYWQgY2hhcmFjdGVyIHNvbWV3aGVyZSB0byBnZXQgaXQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlclxuICAgICBvZiB0aGUgbmV4dCBzY2FuLlxuXG4gICAgIFRvIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtLCBhbGwgdGhlIHNjYW5uaW5nIGZ1bmN0aW9ucyBnZXQgYSBsb3cgbGV2ZWxcbiAgICAgaW5wdXQgYnVmZmVyIGFyZ3VtZW50IHdoZXJlIHRoZXkgc3RvcmUgdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXIgd2hlblxuICAgICBuZWVkZWQ7IGFkZGl0aW9uYWxseSwgdGhlIGlucHV0IGJ1ZmZlciBpcyB0aGUgb25seSBzb3VyY2Ugb2YgY2hhcmFjdGVyIG9mXG4gICAgIGEgc2Nhbm5lci4gVGhlIFtzY2FuYnVmXSBpbnB1dCBidWZmZXJzIGFyZSBkZWZpbmVkIGluIG1vZHVsZSB7IVNjYW5uaW5nfS5cblxuICAgICBOb3cgd2UgdW5kZXJzdGFuZCB0aGF0IGl0IGlzIGV4dHJlbWVseSBpbXBvcnRhbnQgdGhhdCByZWxhdGVkIGFuZFxuICAgICBzdWNjZXNzaXZlIGNhbGxzIHRvIHNjYW5uZXJzIGluZGVlZCByZWFkIGZyb20gdGhlIHNhbWUgaW5wdXQgYnVmZmVyLlxuICAgICBJbiBlZmZlY3QsIGlmIGEgc2Nhbm5lciBbc2NhbjFdIGlzIHJlYWRpbmcgZnJvbSBbaWIxXSBhbmQgc3RvcmVzIGFuXG4gICAgIHVudXNlZCBsb29rYWhlYWQgY2hhcmFjdGVyIFtjMV0gaW50byBpdHMgaW5wdXQgYnVmZmVyIFtpYjFdLCB0aGVuXG4gICAgIGFub3RoZXIgc2Nhbm5lciBbc2NhbjJdIG5vdCByZWFkaW5nIGZyb20gdGhlIHNhbWUgYnVmZmVyIFtpYjFdIHdpbGwgbWlzc1xuICAgICB0aGUgY2hhcmFjdGVyIFtjMV0sIHNlZW1pbmdseSB2YW5pc2hlZCBpbiB0aGUgYWlyIGZyb20gdGhlIHBvaW50IG9mIHZpZXdcbiAgICAgb2YgW3NjYW4yXS5cblxuICAgICBUaGlzIG1lY2hhbmlzbSB3b3JrcyBwZXJmZWN0bHkgdG8gcmVhZCBmcm9tIHN0cmluZ3MsIGZyb20gZmlsZXMsIGFuZCBmcm9tXG4gICAgIGZ1bmN0aW9ucywgc2luY2UgaW4gdGhvc2UgY2FzZXMsIGFsbG9jYXRpbmcgdHdvIGJ1ZmZlcnMgcmVhZGluZyBmcm9tIHRoZVxuICAgICBzYW1lIHNvdXJjZSBpcyB1bm5hdHVyYWwuXG5cbiAgICAgU3RpbGwsIHRoZXJlIGlzIGEgZGlmZmljdWx0eSBpbiB0aGUgY2FzZSBvZiBzY2FubmluZyBmcm9tIGFuIGlucHV0XG4gICAgIGNoYW5uZWwuIEluIGVmZmVjdCwgd2hlbiBzY2FubmluZyBmcm9tIGFuIGlucHV0IGNoYW5uZWwgW2ljXSwgdGhpcyBjaGFubmVsXG4gICAgIG1heSBub3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHdpdGhpbiB0aGlzIGxpYnJhcnkuIEhlbmNlLCBpdCBtYXkgYmVcbiAgICAgc2hhcmVkICh0d28gZnVuY3Rpb25zIG9mIHRoZSB1c2VyJ3MgcHJvZ3JhbSBtYXkgc3VjY2Vzc2l2ZWx5IHJlYWQgZnJvbVxuICAgICBbaWNdKS4gVGhpcyBpcyBoaWdobHkgZXJyb3IgcHJvbmUgc2luY2UsIG9uZSBvZiB0aGUgZnVuY3Rpb24gbWF5IHNlZWsgdGhlXG4gICAgIGlucHV0IGNoYW5uZWwsIHdoaWxlIHRoZSBvdGhlciBmdW5jdGlvbiBoYXMgc3RpbGwgYW4gdW51c2VkIGxvb2thaGVhZFxuICAgICBjaGFyYWN0ZXIgaW4gaXRzIGlucHV0IGJ1ZmZlci4gSW4gY29uY2x1c2lvbiwgeW91IHNob3VsZCBuZXZlciBtaXggZGlyZWN0XG4gICAgIGxvdyBsZXZlbCByZWFkaW5nIGFuZCBoaWdoIGxldmVsIHNjYW5uaW5nIGZyb20gdGhlIHNhbWUgaW5wdXQgY2hhbm5lbC5cblxuICAqKVxuXG4gICgqIFBlcmZvcm0gYnVmZmVyaXplZCBpbnB1dCB0byBpbXByb3ZlIGVmZmljaWVuY3kuICopXG4gIGxldCBmaWxlX2J1ZmZlcl9zaXplID0gcmVmIDEwMjRcblxuICAoKiBUaGUgc2Nhbm5lciBjbG9zZXMgdGhlIGlucHV0IGNoYW5uZWwgYXQgZW5kIG9mIGlucHV0LiAqKVxuICBsZXQgc2Nhbl9jbG9zZV9hdF9lbmQgaWMgPSBTdGRsaWIuY2xvc2VfaW4gaWM7IHJhaXNlIEVuZF9vZl9maWxlXG5cbiAgKCogVGhlIHNjYW5uZXIgZG9lcyBub3QgY2xvc2UgdGhlIGlucHV0IGNoYW5uZWwgYXQgZW5kIG9mIGlucHV0OlxuICAgICBpdCBqdXN0IHJhaXNlcyBbRW5kX29mX2ZpbGVdLiAqKVxuICBsZXQgc2Nhbl9yYWlzZV9hdF9lbmQgX2ljID0gcmFpc2UgRW5kX29mX2ZpbGVcblxuICBsZXQgZnJvbV9pYyBzY2FuX2Nsb3NlX2ljIGluYW1lIGljID1cbiAgICBsZXQgbGVuID0gIWZpbGVfYnVmZmVyX3NpemUgaW5cbiAgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGxlbiBpblxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgbGltID0gcmVmIDAgaW5cbiAgICBsZXQgZW9mID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IG5leHQgKCkgPVxuICAgICAgaWYgIWkgPCAhbGltIHRoZW4gYmVnaW4gbGV0IGMgPSBCeXRlcy5nZXQgYnVmICFpIGluIGluY3IgaTsgYyBlbmQgZWxzZVxuICAgICAgaWYgIWVvZiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlIGVsc2UgYmVnaW5cbiAgICAgICAgbGltIDo9IGlucHV0IGljIGJ1ZiAwIGxlbjtcbiAgICAgICAgaWYgIWxpbSA9IDAgdGhlbiBiZWdpbiBlb2YgOj0gdHJ1ZTsgc2Nhbl9jbG9zZV9pYyBpYyBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgIGkgOj0gMTtcbiAgICAgICAgICBCeXRlcy5nZXQgYnVmIDBcbiAgICAgICAgZW5kXG4gICAgICBlbmQgaW5cbiAgICBjcmVhdGUgaW5hbWUgbmV4dFxuXG5cbiAgbGV0IGZyb21faWNfY2xvc2VfYXRfZW5kID0gZnJvbV9pYyBzY2FuX2Nsb3NlX2F0X2VuZFxuICBsZXQgZnJvbV9pY19yYWlzZV9hdF9lbmQgPSBmcm9tX2ljIHNjYW5fcmFpc2VfYXRfZW5kXG5cbiAgKCogVGhlIHNjYW5uaW5nIGJ1ZmZlciByZWFkaW5nIGZyb20gW1N0ZGxpYi5zdGRpbl0uXG4gICAgIE9uZSBjb3VsZCB0cnkgdG8gZGVmaW5lIFtzdGRpbl0gYXMgYSBzY2FubmluZyBidWZmZXIgcmVhZGluZyBhIGNoYXJhY3RlclxuICAgICBhdCBhIHRpbWUgKG5vIGJ1ZmZlcml6YXRpb24gYXQgYWxsKSwgYnV0IHVuZm9ydHVuYXRlbHkgdGhlIHRvcC1sZXZlbFxuICAgICBpbnRlcmFjdGlvbiB3b3VsZCBiZSB3cm9uZy4gVGhpcyBpcyBkdWUgdG8gc29tZSBraW5kIG9mXG4gICAgICdyYWNlIGNvbmRpdGlvbicgd2hlbiByZWFkaW5nIGZyb20gW1N0ZGxpYi5zdGRpbl0sXG4gICAgIHNpbmNlIHRoZSBpbnRlcmFjdGl2ZSBjb21waWxlciBhbmQgW1NjYW5mLnNjYW5mXSB3aWxsIHNpbXVsdGFuZW91c2x5XG4gICAgIHJlYWQgdGhlIG1hdGVyaWFsIHRoZXkgbmVlZCBmcm9tIFtTdGRsaWIuc3RkaW5dOyB0aGVuLCBjb25mdXNpb25cbiAgICAgd2lsbCByZXN1bHQgZnJvbSB3aGF0IHNob3VsZCBiZSByZWFkIGJ5IHRoZSB0b3AtbGV2ZWwgYW5kIHdoYXQgc2hvdWxkIGJlXG4gICAgIHJlYWQgYnkgW1NjYW5mLnNjYW5mXS5cbiAgICAgVGhpcyBpcyBldmVuIG1vcmUgY29tcGxpY2F0ZWQgYnkgdGhlIG9uZSBjaGFyYWN0ZXIgbG9va2FoZWFkIHRoYXRcbiAgICAgW1NjYW5mLnNjYW5mXSBpcyBzb21ldGltZXMgb2JsaWdlZCB0byBtYWludGFpbjogdGhlIGxvb2thaGVhZCBjaGFyYWN0ZXJcbiAgICAgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHRoZSBuZXh0IFtTY2FuZi5zY2FuZl0gZW50cnksIHNlZW1pbmdseSBjb21pbmcgZnJvbVxuICAgICBub3doZXJlLlxuICAgICBBbHNvIG5vIFtFbmRfb2ZfZmlsZV0gaXMgcmFpc2VkIHdoZW4gcmVhZGluZyBmcm9tIHN0ZGluOiBpZiBub3QgZW5vdWdoXG4gICAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHJlYWQsIHdlIHNpbXBseSBhc2sgdG8gcmVhZCBtb3JlLiAqKVxuICBsZXQgc3RkaW4gPVxuICAgIGZyb21faWMgc2Nhbl9yYWlzZV9hdF9lbmRcbiAgICAgIChGcm9tX2ZpbGUgKFwiLVwiLCBTdGRsaWIuc3RkaW4pKSBTdGRsaWIuc3RkaW5cblxuICBsZXQgb3Blbl9pbl9maWxlIG9wZW5faW4gZm5hbWUgPVxuICAgIG1hdGNoIGZuYW1lIHdpdGhcbiAgICB8IFwiLVwiIC0+IHN0ZGluXG4gICAgfCBmbmFtZSAtPlxuICAgICAgbGV0IGljID0gb3Blbl9pbiBmbmFtZSBpblxuICAgICAgZnJvbV9pY19jbG9zZV9hdF9lbmQgKEZyb21fZmlsZSAoZm5hbWUsIGljKSkgaWNcblxuXG4gIGxldCBvcGVuX2luID0gb3Blbl9pbl9maWxlIFN0ZGxpYi5vcGVuX2luXG4gIGxldCBvcGVuX2luX2JpbiA9IG9wZW5faW5fZmlsZSBTdGRsaWIub3Blbl9pbl9iaW5cblxuICBsZXQgZnJvbV9maWxlID0gb3Blbl9pblxuICBsZXQgZnJvbV9maWxlX2JpbiA9IG9wZW5faW5fYmluXG5cbiAgbGV0IGZyb21fY2hhbm5lbCBpYyA9XG4gICAgZnJvbV9pY19yYWlzZV9hdF9lbmQgKEZyb21fY2hhbm5lbCBpYykgaWNcblxuXG4gIGxldCBjbG9zZV9pbiBpYiA9XG4gICAgbWF0Y2ggaWIuaWNfaW5wdXRfbmFtZSB3aXRoXG4gICAgfCBGcm9tX2NoYW5uZWwgaWMgLT5cbiAgICAgIFN0ZGxpYi5jbG9zZV9pbiBpY1xuICAgIHwgRnJvbV9maWxlIChfZm5hbWUsIGljKSAtPiBTdGRsaWIuY2xvc2VfaW4gaWNcbiAgICB8IEZyb21fZnVuY3Rpb24gfCBGcm9tX3N0cmluZyAtPiAoKVxuXG5lbmRcblxuXG4oKiBGb3JtYXR0ZWQgaW5wdXQgZnVuY3Rpb25zLiAqKVxuXG50eXBlICgnYSwgJ2IsICdjLCAnZCkgc2Nhbm5lciA9XG4gICAgICgnYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgJ2IsICdjLCAnYSAtPiAnZCwgJ2QpIGZvcm1hdDYgLT4gJ2NcblxudHlwZSAoJ2EsICdiLCAnYywgJ2QpIHNjYW5uZXJfb3B0ID1cbiAgICAgKCdhLCBTY2FubmluZy5pbl9jaGFubmVsLCAnYiwgJ2MsICdhIC0+ICdkIG9wdGlvbiwgJ2QpIGZvcm1hdDYgLT4gJ2NcblxuKCogUmVwb3J0aW5nIGVycm9ycy4gKilcbmV4Y2VwdGlvbiBTY2FuX2ZhaWx1cmUgb2Ygc3RyaW5nXG5cbmxldCBiYWRfaW5wdXQgcyA9IHJhaXNlIChTY2FuX2ZhaWx1cmUgcylcblxubGV0IGJhZF9pbnB1dF9lc2NhcGUgYyA9XG4gIGJhZF9pbnB1dCAoUHJpbnRmLnNwcmludGYgXCJpbGxlZ2FsIGVzY2FwZSBjaGFyYWN0ZXIgJUNcIiBjKVxuXG5cbmxldCBiYWRfdG9rZW5fbGVuZ3RoIG1lc3NhZ2UgPVxuICBiYWRfaW5wdXRcbiAgICAoUHJpbnRmLnNwcmludGZcbiAgICAgICBcInNjYW5uaW5nIG9mICVzIGZhaWxlZDogXFxcbiAgICAgICAgdGhlIHNwZWNpZmllZCBsZW5ndGggd2FzIHRvbyBzaG9ydCBmb3IgdG9rZW5cIlxuICAgICAgIG1lc3NhZ2UpXG5cblxubGV0IGJhZF9lbmRfb2ZfaW5wdXQgbWVzc2FnZSA9XG4gIGJhZF9pbnB1dFxuICAgIChQcmludGYuc3ByaW50ZlxuICAgICAgIFwic2Nhbm5pbmcgb2YgJXMgZmFpbGVkOiBcXFxuICAgICAgICBwcmVtYXR1cmUgZW5kIG9mIGZpbGUgb2NjdXJyZWQgYmVmb3JlIGVuZCBvZiB0b2tlblwiXG4gICAgICAgbWVzc2FnZSlcblxuXG5sZXQgYmFkX2Zsb2F0ICgpID1cbiAgYmFkX2lucHV0IFwibm8gZG90IG9yIGV4cG9uZW50IHBhcnQgZm91bmQgaW4gZmxvYXQgdG9rZW5cIlxuXG5cbmxldCBiYWRfaGV4X2Zsb2F0ICgpID1cbiAgYmFkX2lucHV0IFwibm90IGEgdmFsaWQgZmxvYXQgaW4gaGV4YWRlY2ltYWwgbm90YXRpb25cIlxuXG5cbmxldCBjaGFyYWN0ZXJfbWlzbWF0Y2hfZXJyIGMgY2kgPVxuICBQcmludGYuc3ByaW50ZiBcImxvb2tpbmcgZm9yICVDLCBmb3VuZCAlQ1wiIGMgY2lcblxuXG5sZXQgY2hhcmFjdGVyX21pc21hdGNoIGMgY2kgPVxuICBiYWRfaW5wdXQgKGNoYXJhY3Rlcl9taXNtYXRjaF9lcnIgYyBjaSlcblxuXG5sZXQgcmVjIHNraXBfd2hpdGVzIGliID1cbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgbm90IChTY2FubmluZy5lb2YgaWIpIHRoZW4gYmVnaW5cbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8ICcgJyB8ICdcXHQnIHwgJ1xcbicgfCAnXFxyJyAtPlxuICAgICAgU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWI7IHNraXBfd2hpdGVzIGliXG4gICAgfCBfIC0+ICgpXG4gIGVuZFxuXG5cbigqIENoZWNraW5nIHRoYXQgW2NdIGlzIGluZGVlZCBpbiB0aGUgaW5wdXQsIHRoZW4gc2tpcHMgaXQuXG4gICBJbiB0aGlzIGNhc2UsIHRoZSBjaGFyYWN0ZXIgW2NdIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIHRoZVxuICAgZm9ybWF0IGFzIGJlaW5nIG1hbmRhdG9yeSBpbiB0aGUgaW5wdXQ7IGhlbmNlIHdlIHNob3VsZCBmYWlsIHdpdGhcbiAgIFtFbmRfb2ZfZmlsZV0gaW4gY2FzZSBvZiBlbmRfb2ZfaW5wdXQuXG4gICAoUmVtZW1iZXIgdGhhdCBbU2Nhbl9mYWlsdXJlXSBpcyByYWlzZWQgb25seSB3aGVuICh3ZSBjYW4gcHJvdmUgYnlcbiAgIGV2aWRlbmNlKSB0aGF0IHRoZSBpbnB1dCBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbi4gV2UgbXVzdFxuICAgdGh1cyBkaWZmZXJlbnRpYXRlIFtFbmRfb2ZfZmlsZV0gYXMgYW4gZXJyb3IgZHVlIHRvIGxhY2sgb2YgaW5wdXQsIGFuZFxuICAgW1NjYW5fZmFpbHVyZV0gd2hpY2ggaXMgZHVlIHRvIHByb3ZhYmx5IHdyb25nIGlucHV0LiBJIGFtIG5vdCBzdXJlIHRoaXMgaXNcbiAgIHdvcnRoIHRoZSBidXJkZW46IGl0IGlzIGNvbXBsZXggYW5kIHNvbWVob3cgc3VibGltaW5hbDsgc2hvdWxkIGJlIGNsZWFyZXJcbiAgIHRvIGZhaWwgd2l0aCBTY2FuX2ZhaWx1cmUgXCJOb3QgZW5vdWdoIGlucHV0IHRvIGNvbXBsZXRlIHNjYW5uaW5nXCIhKVxuXG4gICBUaGF0J3Mgd2h5LCB3YWl0aW5nIGZvciBhIGJldHRlciBzb2x1dGlvbiwgd2UgdXNlIGNoZWNrZWRfcGVla19jaGFyIGhlcmUuXG4gICBXZSBhcmUgYWxzbyBjYXJlZnVsIHRvIHRyZWF0IFwiXFxyXFxuXCIgaW4gdGhlIGlucHV0IGFzIGFuIGVuZCBvZiBsaW5lIG1hcmtlcjpcbiAgIGl0IGFsd2F5cyBtYXRjaGVzIGEgJ1xcbicgc3BlY2lmaWNhdGlvbiBpbiB0aGUgaW5wdXQgZm9ybWF0IHN0cmluZy4gKilcbmxldCByZWMgY2hlY2tfY2hhciBpYiBjID1cbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJyAnIC0+IHNraXBfd2hpdGVzIGliXG4gIHwgJ1xcbicgLT4gY2hlY2tfbmV3bGluZSBpYlxuICB8IGMgLT4gY2hlY2tfdGhpc19jaGFyIGliIGNcblxuYW5kIGNoZWNrX3RoaXNfY2hhciBpYiBjID1cbiAgbGV0IGNpID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgaWYgY2kgPSBjIHRoZW4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWIgZWxzZVxuICBjaGFyYWN0ZXJfbWlzbWF0Y2ggYyBjaVxuXG5hbmQgY2hlY2tfbmV3bGluZSBpYiA9XG4gIGxldCBjaSA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIG1hdGNoIGNpIHdpdGhcbiAgfCAnXFxuJyAtPiBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYlxuICB8ICdcXHInIC0+IFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliOyBjaGVja190aGlzX2NoYXIgaWIgJ1xcbidcbiAgfCBfIC0+IGNoYXJhY3Rlcl9taXNtYXRjaCAnXFxuJyBjaVxuXG5cbigqIEV4dHJhY3RpbmcgdG9rZW5zIGZyb20gdGhlIG91dHB1dCB0b2tlbiBidWZmZXIuICopXG5cbmxldCB0b2tlbl9jaGFyIGliID0gKFNjYW5uaW5nLnRva2VuIGliKS5bMF1cblxubGV0IHRva2VuX3N0cmluZyA9IFNjYW5uaW5nLnRva2VuXG5cbmxldCB0b2tlbl9ib29sIGliID1cbiAgbWF0Y2ggU2Nhbm5pbmcudG9rZW4gaWIgd2l0aFxuICB8IFwidHJ1ZVwiIC0+IHRydWVcbiAgfCBcImZhbHNlXCIgLT4gZmFsc2VcbiAgfCBzIC0+IGJhZF9pbnB1dCAoUHJpbnRmLnNwcmludGYgXCJpbnZhbGlkIGJvb2xlYW4gJyVzJ1wiIHMpXG5cblxuKCogVGhlIHR5cGUgb2YgaW50ZWdlciBjb252ZXJzaW9ucy4gKilcbnR5cGUgaW50ZWdlcl9jb252ZXJzaW9uID1cbiAgfCBCX2NvbnZlcnNpb24gKCogVW5zaWduZWQgYmluYXJ5IGNvbnZlcnNpb24gKilcbiAgfCBEX2NvbnZlcnNpb24gKCogU2lnbmVkIGRlY2ltYWwgY29udmVyc2lvbiAqKVxuICB8IElfY29udmVyc2lvbiAoKiBTaWduZWQgaW50ZWdlciBjb252ZXJzaW9uICopXG4gIHwgT19jb252ZXJzaW9uICgqIFVuc2lnbmVkIG9jdGFsIGNvbnZlcnNpb24gKilcbiAgfCBVX2NvbnZlcnNpb24gKCogVW5zaWduZWQgZGVjaW1hbCBjb252ZXJzaW9uICopXG4gIHwgWF9jb252ZXJzaW9uICgqIFVuc2lnbmVkIGhleGFkZWNpbWFsIGNvbnZlcnNpb24gKilcblxuXG5sZXQgaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgPSBmdW5jdGlvblxuICB8ICdiJyAtPiBCX2NvbnZlcnNpb25cbiAgfCAnZCcgLT4gRF9jb252ZXJzaW9uXG4gIHwgJ2knIC0+IElfY29udmVyc2lvblxuICB8ICdvJyAtPiBPX2NvbnZlcnNpb25cbiAgfCAndScgLT4gVV9jb252ZXJzaW9uXG4gIHwgJ3gnIHwgJ1gnIC0+IFhfY29udmVyc2lvblxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cblxuKCogRXh0cmFjdCBhbiBpbnRlZ2VyIGxpdGVyYWwgdG9rZW4uXG4gICBTaW5jZSB0aGUgZnVuY3Rpb25zIFN0ZGxpYi4qaW50Kl9vZl9zdHJpbmcgZG8gbm90IGFjY2VwdCBhIGxlYWRpbmcgKyxcbiAgIHdlIHNraXAgaXQgaWYgbmVjZXNzYXJ5LiAqKVxubGV0IHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIgPVxuICBsZXQgdG9rID1cbiAgICBtYXRjaCBjb252IHdpdGhcbiAgICB8IERfY29udmVyc2lvbiB8IElfY29udmVyc2lvbiAtPiBTY2FubmluZy50b2tlbiBpYlxuICAgIHwgVV9jb252ZXJzaW9uIC0+IFwiMHVcIiBeIFNjYW5uaW5nLnRva2VuIGliXG4gICAgfCBPX2NvbnZlcnNpb24gLT4gXCIwb1wiIF4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IFhfY29udmVyc2lvbiAtPiBcIjB4XCIgXiBTY2FubmluZy50b2tlbiBpYlxuICAgIHwgQl9jb252ZXJzaW9uIC0+IFwiMGJcIiBeIFNjYW5uaW5nLnRva2VuIGliIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCB0b2sgaW5cbiAgaWYgbCA9IDAgfHwgdG9rLlswXSA8PiAnKycgdGhlbiB0b2sgZWxzZSBTdHJpbmcuc3ViIHRvayAxIChsIC0gMSlcblxuXG4oKiBBbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBudW1iZXIgcmFpc2UgdGhlIGV4Y2VwdGlvblxuICAgRmFpbHVyZSB3aGVuIHRoZSBjb252ZXJzaW9uIGlzIG5vdCBwb3NzaWJsZS5cbiAgIFRoaXMgZXhjZXB0aW9uIGlzIHRoZW4gdHJhcHBlZCBpbiBba3NjYW5mXS4gKilcbmxldCB0b2tlbl9pbnQgY29udiBpYiA9IGludF9vZl9zdHJpbmcgKHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIpXG5cbmxldCB0b2tlbl9mbG9hdCBpYiA9IGZsb2F0X29mX3N0cmluZyAoU2Nhbm5pbmcudG9rZW4gaWIpXG5cbigqIFRvIHNjYW4gbmF0aXZlIGludHMsIGludDMyIGFuZCBpbnQ2NCBpbnRlZ2Vycy5cbiAgIFdlIGNhbm5vdCBhY2Nlc3MgdG8gY29udmVyc2lvbnMgdG8vZnJvbSBzdHJpbmdzIGZvciB0aG9zZSB0eXBlcyxcbiAgIE5hdGl2ZWludC5vZl9zdHJpbmcsIEludDMyLm9mX3N0cmluZywgYW5kIEludDY0Lm9mX3N0cmluZyxcbiAgIHNpbmNlIHRob3NlIG1vZHVsZXMgYXJlIG5vdCBhdmFpbGFibGUgdG8gW1NjYW5mXS5cbiAgIEhvd2V2ZXIsIHdlIGNhbiBiaW5kIGFuZCB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgcHJpbWl0aXZlcyB0aGF0IGFyZVxuICAgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lLiAqKVxuZXh0ZXJuYWwgbmF0aXZlaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBuYXRpdmVpbnRcbiAgPSBcImNhbWxfbmF0aXZlaW50X29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIGludDMyX29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQzMlxuICA9IFwiY2FtbF9pbnQzMl9vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCBpbnQ2NF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50NjRcbiAgPSBcImNhbWxfaW50NjRfb2Zfc3RyaW5nXCJcblxuXG5sZXQgdG9rZW5fbmF0aXZlaW50IGNvbnYgaWIgPSBuYXRpdmVpbnRfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxubGV0IHRva2VuX2ludDMyIGNvbnYgaWIgPSBpbnQzMl9vZl9zdHJpbmcgKHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIpXG5sZXQgdG9rZW5faW50NjQgY29udiBpYiA9IGludDY0X29mX3N0cmluZyAodG9rZW5faW50X2xpdGVyYWwgY29udiBpYilcblxuKCogU2Nhbm5pbmcgbnVtYmVycy4gKilcblxuKCogRGlnaXRzIHNjYW5uaW5nIGZ1bmN0aW9ucyBzdXBwb3NlIHRoYXQgb25lIGNoYXJhY3RlciBoYXMgYmVlbiBjaGVja2VkIGFuZFxuICAgaXMgYXZhaWxhYmxlLCBzaW5jZSB0aGV5IHJldHVybiBhdCBlbmQgb2YgZmlsZSB3aXRoIHRoZSBjdXJyZW50bHkgZm91bmRcbiAgIHRva2VuIHNlbGVjdGVkLlxuXG4gICBQdXQgaXQgaW4gYW5vdGhlciB3YXksIHRoZSBkaWdpdHMgc2Nhbm5pbmcgZnVuY3Rpb25zIHNjYW4gZm9yIGEgcG9zc2libHlcbiAgIGVtcHR5IHNlcXVlbmNlIG9mIGRpZ2l0cywgKGhlbmNlLCBhIHN1Y2Nlc3NmdWwgc2Nhbm5pbmcgZnJvbSBvbmUgb2YgdGhvc2VcbiAgIGZ1bmN0aW9ucyBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZSB0b2tlbiBpcyBhIHdlbGwtZm9ybWVkIG51bWJlcjogdG8gZ2V0IGFcbiAgIHRydWUgbnVtYmVyLCBpdCBpcyBtYW5kYXRvcnkgdG8gY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgdmFsaWQgZGlnaXQgaXNcbiAgIGF2YWlsYWJsZSBiZWZvcmUgY2FsbGluZyBvbmUgb2YgdGhlIGRpZ2l0IHNjYW5uaW5nIGZ1bmN0aW9ucykuICopXG5cbigqIFRoZSBkZWNpbWFsIGNhc2UgaXMgdHJlYXRlZCBlc3BlY2lhbGx5IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuICopXG5sZXQgcmVjIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcwJyAuLiAnOScgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliXG4gIHwgJ18nIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIgaW5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuICB8IF8gLT4gd2lkdGhcblxuXG5sZXQgc2Nhbl9kZWNpbWFsX2RpZ2l0X3BsdXMgd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIFwiZGVjaW1hbCBkaWdpdHNcIiBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJzAnIC4uICc5JyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliXG4gIHwgYyAtPlxuICAgIGJhZF9pbnB1dCAoUHJpbnRmLnNwcmludGYgXCJjaGFyYWN0ZXIgJUMgaXMgbm90IGEgZGVjaW1hbCBkaWdpdFwiIGMpXG5cblxuKCogVG8gc2NhbiBudW1iZXJzIGZyb20gb3RoZXIgYmFzZXMsIHdlIHVzZSBhIHByZWRpY2F0ZSBhcmd1bWVudCB0b1xuICAgc2NhbiBkaWdpdHMuICopXG5sZXQgc2Nhbl9kaWdpdF9zdGFyIGRpZ2l0cCB3aWR0aCBpYiA9XG4gIGxldCByZWMgc2Nhbl9kaWdpdHMgd2lkdGggaWIgPVxuICAgIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICBtYXRjaCBjIHdpdGhcbiAgICB8IGMgd2hlbiBkaWdpdHAgYyAtPlxuICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICBzY2FuX2RpZ2l0cyB3aWR0aCBpYlxuICAgIHwgJ18nIC0+XG4gICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYiBpblxuICAgICAgc2Nhbl9kaWdpdHMgd2lkdGggaWJcbiAgICB8IF8gLT4gd2lkdGggaW5cbiAgc2Nhbl9kaWdpdHMgd2lkdGggaWJcblxuXG5sZXQgc2Nhbl9kaWdpdF9wbHVzIGJhc2lzIGRpZ2l0cCB3aWR0aCBpYiA9XG4gICgqIEVuc3VyZSB3ZSBoYXZlIGdvdCBlbm91Z2ggd2lkdGggbGVmdCxcbiAgICAgYW5kIHJlYWQgYXQgbGVhc3Qgb25lIGRpZ2l0LiAqKVxuICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIFwiZGlnaXRzXCIgZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIGlmIGRpZ2l0cCBjIHRoZW5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBzY2FuX2RpZ2l0X3N0YXIgZGlnaXRwIHdpZHRoIGliXG4gIGVsc2VcbiAgICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiY2hhcmFjdGVyICVDIGlzIG5vdCBhIHZhbGlkICVzIGRpZ2l0XCIgYyBiYXNpcylcblxuXG5sZXQgaXNfYmluYXJ5X2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzEnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxubGV0IHNjYW5fYmluYXJ5X2ludCA9IHNjYW5fZGlnaXRfcGx1cyBcImJpbmFyeVwiIGlzX2JpbmFyeV9kaWdpdFxuXG5sZXQgaXNfb2N0YWxfZGlnaXQgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnNycgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxuXG5sZXQgc2Nhbl9vY3RhbF9pbnQgPSBzY2FuX2RpZ2l0X3BsdXMgXCJvY3RhbFwiIGlzX29jdGFsX2RpZ2l0XG5cbmxldCBpc19oZXhhX2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxuXG5sZXQgc2Nhbl9oZXhhZGVjaW1hbF9pbnQgPSBzY2FuX2RpZ2l0X3BsdXMgXCJoZXhhZGVjaW1hbFwiIGlzX2hleGFfZGlnaXRcblxuKCogU2NhbiBhIGRlY2ltYWwgaW50ZWdlci4gKilcbmxldCBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50ID0gc2Nhbl9kZWNpbWFsX2RpZ2l0X3BsdXNcblxubGV0IHNjYW5fc2lnbiB3aWR0aCBpYiA9XG4gIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJysnIC0+IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgY1xuICB8ICctJyAtPiBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGNcbiAgfCBfIC0+IHdpZHRoXG5cblxubGV0IHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWIgPVxuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgc2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuXG5cbigqIFNjYW4gYW4gdW5zaWduZWQgaW50ZWdlciB0aGF0IGNvdWxkIGJlIGdpdmVuIGluIGFueSAoY29tbW9uKSBiYXNpcy5cbiAgIElmIGRpZ2l0cyBhcmUgcHJlZml4ZWQgYnkgb25lIG9mIDB4LCAwWCwgMG8sIG9yIDBiLCB0aGUgbnVtYmVyIGlzXG4gICBhc3N1bWVkIHRvIGJlIHdyaXR0ZW4gcmVzcGVjdGl2ZWx5IGluIGhleGFkZWNpbWFsLCBoZXhhZGVjaW1hbCxcbiAgIG9jdGFsLCBvciBiaW5hcnkuICopXG5sZXQgc2Nhbl91bnNpZ25lZF9pbnQgd2lkdGggaWIgPVxuICBtYXRjaCBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiB3aXRoXG4gIHwgJzAnIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgYmVnaW4gbWF0Y2ggYyB3aXRoXG4gICAgfCAneCcgfCAnWCcgLT4gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgICB8ICdvJyAtPiBzY2FuX29jdGFsX2ludCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICAgIHwgJ2InIC0+IHNjYW5fYmluYXJ5X2ludCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICAgIHwgXyAtPiBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYiBlbmRcbiAgfCBfIC0+IHNjYW5fdW5zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcblxuXG5sZXQgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9pbnQgd2lkdGggaWIgPVxuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgc2Nhbl91bnNpZ25lZF9pbnQgd2lkdGggaWJcblxuXG5sZXQgc2Nhbl9pbnRfY29udmVyc2lvbiBjb252IHdpZHRoIGliID1cbiAgbWF0Y2ggY29udiB3aXRoXG4gIHwgQl9jb252ZXJzaW9uIC0+IHNjYW5fYmluYXJ5X2ludCB3aWR0aCBpYlxuICB8IERfY29udmVyc2lvbiAtPiBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gIHwgSV9jb252ZXJzaW9uIC0+IHNjYW5fb3B0aW9uYWxseV9zaWduZWRfaW50IHdpZHRoIGliXG4gIHwgT19jb252ZXJzaW9uIC0+IHNjYW5fb2N0YWxfaW50IHdpZHRoIGliXG4gIHwgVV9jb252ZXJzaW9uIC0+IHNjYW5fdW5zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcbiAgfCBYX2NvbnZlcnNpb24gLT4gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgd2lkdGggaWJcblxuXG4oKiBTY2FubmluZyBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAqKVxuXG4oKiBGcmFjdGlvbmFsIHBhcnQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZWR1Y2VkIHRvIDAgZGlnaXRzLiAqKVxubGV0IHNjYW5fZnJhY3Rpb25hbF9wYXJ0IHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcwJyAuLiAnOScgYXMgYyAtPlxuICAgIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gIHwgXyAtPiB3aWR0aFxuXG5cbigqIEV4cCBwYXJ0IGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVkdWNlZCB0byAwIGRpZ2l0cy4gKilcbmxldCBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJ2UnIHwgJ0UnIGFzIGMgLT5cbiAgICBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gIHwgXyAtPiB3aWR0aFxuXG5cbigqIFNjYW4gdGhlIGludGVnZXIgcGFydCBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgKG5vdCB1c2luZyB0aGVcbiAgIE9DYW1sIGxleGljYWwgY29udmVudGlvbiBzaW5jZSB0aGUgaW50ZWdlciBwYXJ0IGNhbiBiZSBlbXB0eSk6XG4gICBhbiBvcHRpb25hbCBzaWduLCBmb2xsb3dlZCBieSBhIHBvc3NpYmx5IGVtcHR5IHNlcXVlbmNlIG9mIGRlY2ltYWxcbiAgIGRpZ2l0cyAoZS5nLiAtLjEpLiAqKVxubGV0IHNjYW5faW50ZWdlcl9wYXJ0IHdpZHRoIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIHNjYW5fZGVjaW1hbF9kaWdpdF9zdGFyIHdpZHRoIGliXG5cblxuKCpcbiAgIEZvciB0aGUgdGltZSBiZWluZyB3ZSBoYXZlIChhcyBmb3VuZCBpbiBzY2FuZi5tbGkpOlxuICAgdGhlIGZpZWxkIHdpZHRoIGlzIGNvbXBvc2VkIG9mIGFuIG9wdGlvbmFsIGludGVnZXIgbGl0ZXJhbFxuICAgaW5kaWNhdGluZyB0aGUgbWF4aW1hbCB3aWR0aCBvZiB0aGUgdG9rZW4gdG8gcmVhZC5cbiAgIFVuZm9ydHVuYXRlbHksIHRoZSB0eXBlLWNoZWNrZXIgbGV0IHRoZSB1c2VyIHdyaXRlIGFuIG9wdGlvbmFsIHByZWNpc2lvbixcbiAgIHNpbmNlIHRoaXMgaXMgdmFsaWQgZm9yIHByaW50ZiBmb3JtYXQgc3RyaW5ncy5cblxuICAgVGh1cywgdGhlIG5leHQgc3RlcCBmb3IgU2NhbmYgaXMgdG8gc3VwcG9ydCBhIGZ1bGwgd2lkdGggYW5kIHByZWNpc2lvblxuICAgaW5kaWNhdGlvbiwgbW9yZSBvciBsZXNzIHNpbWlsYXIgdG8gdGhlIG9uZSBmb3IgcHJpbnRmLCBwb3NzaWJseSBleHRlbmRlZFxuICAgdG8gdGhlIHNwZWNpZmljYXRpb24gb2YgYSBbbWF4LCBtaW5dIHJhbmdlIGZvciB0aGUgd2lkdGggb2YgdGhlIHRva2VuIHJlYWRcbiAgIGZvciBzdHJpbmdzLiBTb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHNwZWMgZm9yIHNjYW5mLm1saTpcblxuICAgVGhlIG9wdGlvbmFsIFt3aWR0aF0gaXMgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBtYXhpbWFsXG4gICB3aWR0aCBvZiB0aGUgdG9rZW4gcmVhZC4gRm9yIGluc3RhbmNlLCBbJTZkXSByZWFkcyBhbiBpbnRlZ2VyLFxuICAgaGF2aW5nIGF0IG1vc3QgNiBjaGFyYWN0ZXJzLlxuXG4gICBUaGUgb3B0aW9uYWwgW3ByZWNpc2lvbl0gaXMgYSBkb3QgWy5dIGZvbGxvd2VkIGJ5IGFuIGludGVnZXI6XG5cbiAgIC0gaW4gdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBjb252ZXJzaW9ucyAoWyVmXSwgWyVlXSwgWyVnXSwgWyVGXSwgWyVFXSxcbiAgIGFuZCBbJUZdIGNvbnZlcnNpb25zLCB0aGUgW3ByZWNpc2lvbl0gaW5kaWNhdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZlxuICAgZGlnaXRzIHRoYXQgbWF5IGZvbGxvdyB0aGUgZGVjaW1hbCBwb2ludC4gRm9yIGluc3RhbmNlLCBbJS40Zl0gcmVhZHMgYVxuICAgW2Zsb2F0XSB3aXRoIGF0IG1vc3QgNCBmcmFjdGlvbmFsIGRpZ2l0cyxcblxuICAgLSBpbiB0aGUgc3RyaW5nIGNvbnZlcnNpb25zIChbJXNdLCBbJVNdLCBbJVxcWyByYW5nZSBcXF1dKSwgYW5kIGluIHRoZVxuICAgaW50ZWdlciBudW1iZXIgY29udmVyc2lvbnMgKFslaV0sIFslZF0sIFsldV0sIFsleF0sIFslb10sIGFuZCB0aGVpclxuICAgW2ludDMyXSwgW2ludDY0XSwgYW5kIFtuYXRpdmVfaW50XSBjb3JyZXNwb25kZW50KSwgdGhlIFtwcmVjaXNpb25dXG4gICBpbmRpY2F0ZXMgdGhlIHJlcXVpcmVkIG1pbmltdW0gd2lkdGggb2YgdGhlIHRva2VuIHJlYWQsXG5cbiAgIC0gb24gYWxsIG90aGVyIGNvbnZlcnNpb25zLCB0aGUgd2lkdGggYW5kIHByZWNpc2lvbiBzcGVjaWZ5IHRoZSBbbWF4LCBtaW5dXG4gICByYW5nZSBmb3IgdGhlIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkLlxuKilcbmxldCBzY2FuX2Zsb2F0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGxldCB3aWR0aCA9IHNjYW5faW50ZWdlcl9wYXJ0IHdpZHRoIGliIGluXG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoLCBwcmVjaXNpb24gZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCwgcHJlY2lzaW9uIGVsc2VcbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJy4nIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgbGV0IHByZWNpc2lvbiA9IEludC5taW4gd2lkdGggcHJlY2lzaW9uIGluXG4gICAgbGV0IHdpZHRoID0gd2lkdGggLSAocHJlY2lzaW9uIC0gc2Nhbl9mcmFjdGlvbmFsX3BhcnQgcHJlY2lzaW9uIGliKSBpblxuICAgIHNjYW5fZXhwb25lbnRfcGFydCB3aWR0aCBpYiwgcHJlY2lzaW9uXG4gIHwgXyAtPlxuICAgIHNjYW5fZXhwb25lbnRfcGFydCB3aWR0aCBpYiwgcHJlY2lzaW9uXG5cblxubGV0IGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGVycm9yIHN0ciA9XG4gIGxldCBsb3dlcmNhc2UgYyA9XG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCAnQScgLi4gJ1onIC0+XG4gICAgICBjaGFyX29mX2ludCAoaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICdBJyArIGludF9vZl9jaGFyICdhJylcbiAgICB8IF8gLT4gYyBpblxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHdpZHRoID0gcmVmIHdpZHRoIGluXG4gIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBsb3dlcmNhc2UgYyA8PiBsb3dlcmNhc2Ugc3RyLltpXSB0aGVuIGVycm9yICgpO1xuICAgIGlmICF3aWR0aCA9IDAgdGhlbiBlcnJvciAoKTtcbiAgICB3aWR0aCA6PSBTY2FubmluZy5zdG9yZV9jaGFyICF3aWR0aCBpYiBjO1xuICBkb25lO1xuICAhd2lkdGhcblxuXG5sZXQgc2Nhbl9oZXhfZmxvYXQgd2lkdGggcHJlY2lzaW9uIGliID1cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgfCAnMCcgYXMgYyAtPiAoXG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgbGV0IHdpZHRoID0gY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmcgd2lkdGggaWIgYmFkX2hleF9mbG9hdCBcInhcIiBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICBsZXQgd2lkdGggPSBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICB8ICcuJyB8ICdwJyB8ICdQJyAtPiB3aWR0aFxuICAgICAgICB8IF8gLT4gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgd2lkdGggaWIgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgIGxldCB3aWR0aCA9IG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgICAgfCAnLicgYXMgYyAtPiAoXG4gICAgICAgICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgICAgICAgIHwgJ3AnIHwgJ1AnIC0+IHdpZHRoXG4gICAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgIGxldCBwcmVjaXNpb24gPSBJbnQubWluIHdpZHRoIHByZWNpc2lvbiBpblxuICAgICAgICAgICAgICAgIHdpZHRoIC0gKHByZWNpc2lvbiAtIHNjYW5faGV4YWRlY2ltYWxfaW50IHByZWNpc2lvbiBpYilcbiAgICAgICAgICApXG4gICAgICAgICAgfCBfIC0+IHdpZHRoIGluXG4gICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgICAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgICB8ICdwJyB8ICdQJyBhcyBjIC0+XG4gICAgICAgICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgICAgICAgICAgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuICAgICAgICAgIHwgXyAtPiB3aWR0aFxuICApXG4gIHwgJ24nIHwgJ04nIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICBjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyB3aWR0aCBpYiBiYWRfaGV4X2Zsb2F0IFwiYW5cIlxuICB8ICdpJyB8ICdJJyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmcgd2lkdGggaWIgYmFkX2hleF9mbG9hdCBcIm5maW5pdHlcIlxuICB8IF8gLT4gYmFkX2hleF9mbG9hdCAoKVxuXG5cbmxldCBzY2FuX2NhbWxfZmxvYXRfcmVzdCB3aWR0aCBwcmVjaXNpb24gaWIgPVxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICBsZXQgd2lkdGggPSBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBtYXRjaCBjIHdpdGhcbiAgfCAnLicgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAoKiBUaGUgZWZmZWN0aXZlIHdpZHRoIGF2YWlsYWJsZSBmb3Igc2Nhbm5pbmcgdGhlIGZyYWN0aW9uYWwgcGFydCBpc1xuICAgICAgIHRoZSBtaW5pbXVtIG9mIGRlY2xhcmVkIHByZWNpc2lvbiBhbmQgd2lkdGggbGVmdC4gKilcbiAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICAoKiBBZnRlciBzY2FubmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0IHdpdGggW3ByZWNpc2lvbl0gcHJvdmlzaW9uYWwgd2lkdGgsXG4gICAgICAgW3dpZHRoX3ByZWNpc2lvbl0gaXMgbGVmdC4gKilcbiAgICBsZXQgd2lkdGhfcHJlY2lzaW9uID0gc2Nhbl9mcmFjdGlvbmFsX3BhcnQgcHJlY2lzaW9uIGliIGluXG4gICAgKCogSGVuY2UsIHNjYW5uaW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQgdG9vayBleGFjdGx5XG4gICAgICAgW3ByZWNpc2lvbiAtIHdpZHRoX3ByZWNpc2lvbl0gY2hhcnMuICopXG4gICAgbGV0IGZyYWNfd2lkdGggPSBwcmVjaXNpb24gLSB3aWR0aF9wcmVjaXNpb24gaW5cbiAgICAoKiBBbmQgbmV3IHByb3Zpc2lvbmFsIHdpZHRoIGlzIFt3aWR0aCAtIHdpZHRoX3ByZWNpc2lvbi4gKilcbiAgICBsZXQgd2lkdGggPSB3aWR0aCAtIGZyYWNfd2lkdGggaW5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWJcbiAgfCAnZScgfCAnRScgLT5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWJcbiAgfCBfIC0+IGJhZF9mbG9hdCAoKVxuXG5cbmxldCBzY2FuX2NhbWxfZmxvYXQgd2lkdGggcHJlY2lzaW9uIGliID1cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gIHwgJzAnIGFzIGMgLT4gKFxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gICAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICB8ICd4JyB8ICdYJyBhcyBjIC0+IChcbiAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICAgIGxldCB3aWR0aCA9IHNjYW5faGV4YWRlY2ltYWxfaW50IHdpZHRoIGliIGluXG4gICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICAgICAgbGV0IHdpZHRoID0gbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgfCAnLicgYXMgYyAtPiAoXG4gICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgICAgICB8ICdwJyB8ICdQJyAtPiB3aWR0aFxuICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgIGxldCBwcmVjaXNpb24gPSBJbnQubWluIHdpZHRoIHByZWNpc2lvbiBpblxuICAgICAgICAgICAgICB3aWR0aCAtIChwcmVjaXNpb24gLSBzY2FuX2hleGFkZWNpbWFsX2ludCBwcmVjaXNpb24gaWIpXG4gICAgICAgIClcbiAgICAgICAgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgfCBfIC0+IGJhZF9mbG9hdCAoKSBpblxuICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgICAgbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgfCAncCcgfCAnUCcgYXMgYyAtPlxuICAgICAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgICAgICAgIHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcbiAgICAgICAgfCBfIC0+IHdpZHRoXG4gICAgKVxuICAgIHwgXyAtPlxuICAgICAgc2Nhbl9jYW1sX2Zsb2F0X3Jlc3Qgd2lkdGggcHJlY2lzaW9uIGliXG4gIClcbiAgfCAnMScgLi4gJzknIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICAgIHNjYW5fY2FtbF9mbG9hdF9yZXN0IHdpZHRoIHByZWNpc2lvbiBpYlxuKCogU3BlY2lhbCBjYXNlIG9mIG5hbiBhbmQgaW5maW5pdHk6XG4gIHwgJ2knIC0+XG4gIHwgJ24nIC0+XG4qKVxuICB8IF8gLT4gYmFkX2Zsb2F0ICgpXG5cblxuKCogU2NhbiBhIHJlZ3VsYXIgc3RyaW5nOlxuICAgc3RvcHMgd2hlbiBlbmNvdW50ZXJpbmcgYSBzcGFjZSwgaWYgbm8gc2Nhbm5pbmcgaW5kaWNhdGlvbiBoYXMgYmVlbiBnaXZlbjtcbiAgIG90aGVyd2lzZSwgc3RvcHMgd2hlbiBlbmNvdW50ZXJpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNjYW5uaW5nXG4gICBpbmRpY2F0aW9uIFtzdHBdLlxuICAgSXQgYWxzbyBzdG9wcyBhdCBlbmQgb2YgZmlsZSBvciB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGhhc1xuICAgYmVlbiByZWFkLiAqKVxubGV0IHNjYW5fc3RyaW5nIHN0cCB3aWR0aCBpYiA9XG4gIGxldCByZWMgbG9vcCB3aWR0aCA9XG4gICAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgbWF0Y2ggc3RwIHdpdGhcbiAgICAgIHwgU29tZSBjJyB3aGVuIGMgPSBjJyAtPiBTY2FubmluZy5za2lwX2NoYXIgd2lkdGggaWJcbiAgICAgIHwgU29tZSBfIC0+IGxvb3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYylcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICBtYXRjaCBjIHdpdGhcbiAgICAgICAgfCAnICcgfCAnXFx0JyB8ICdcXG4nIHwgJ1xccicgLT4gd2lkdGhcbiAgICAgICAgfCBfIC0+IGxvb3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaW5cbiAgbG9vcCB3aWR0aFxuXG5cbigqIFNjYW4gYSBjaGFyOiBwZWVrIHN0cmljdGx5IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIGlucHV0LCB3aGF0c29ldmVyLiAqKVxubGV0IHNjYW5fY2hhciB3aWR0aCBpYiA9XG4gICgqIFRoZSBjYXNlIHdpZHRoID0gMCBjb3VsZCBub3QgaGFwcGVuIGhlcmUsIHNpbmNlIGl0IGlzIHRlc3RlZCBiZWZvcmVcbiAgICAgY2FsbGluZyBzY2FuX2NoYXIsIGluIHRoZSBtYWluIHNjYW5uaW5nIGZ1bmN0aW9uLlxuICAgIGlmIHdpZHRoID0gMCB0aGVuIGJhZF90b2tlbl9sZW5ndGggXCJhIGNoYXJhY3RlclwiIGVsc2UgKilcbiAgU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiAoU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIpXG5cblxubGV0IGNoYXJfZm9yX2JhY2tzbGFzaCA9IGZ1bmN0aW9uXG4gIHwgJ24nIC0+ICdcXDAxMCdcbiAgfCAncicgLT4gJ1xcMDEzJ1xuICB8ICdiJyAtPiAnXFwwMDgnXG4gIHwgJ3QnIC0+ICdcXDAwOSdcbiAgfCBjIC0+IGNcblxuXG4oKiBUaGUgaW50ZWdlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmYWNpYWwgdmFsdWUgb2YgYSB2YWxpZFxuICAgZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIuICopXG5sZXQgZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMgPSBpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJzAnXG5cbmxldCBjaGFyX2Zvcl9kZWNpbWFsX2NvZGUgYzAgYzEgYzIgPVxuICBsZXQgYyA9XG4gICAgMTAwICogZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMwICtcbiAgICAgMTAgKiBkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzEgK1xuICAgICAgICAgIGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMiBpblxuICBpZiBjIDwgMCB8fCBjID4gMjU1IHRoZW5cbiAgICBiYWRfaW5wdXRcbiAgICAgIChQcmludGYuc3ByaW50ZlxuICAgICAgICAgXCJiYWQgY2hhcmFjdGVyIGRlY2ltYWwgZW5jb2RpbmcgXFxcXCVjJWMlY1wiIGMwIGMxIGMyKSBlbHNlXG4gIGNoYXJfb2ZfaW50IGNcblxuXG4oKiBUaGUgaW50ZWdlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmYWNpYWwgdmFsdWUgb2YgYSB2YWxpZFxuICAgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyLiAqKVxubGV0IGhleGFkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYyA9XG4gIGxldCBkID0gaW50X29mX2NoYXIgYyBpblxuICAoKiBDb3VsZCBhbHNvIGJlOlxuICAgIGlmIGQgPD0gaW50X29mX2NoYXIgJzknIHRoZW4gZCAtIGludF9vZl9jaGFyICcwJyBlbHNlXG4gICAgaWYgZCA8PSBpbnRfb2ZfY2hhciAnRicgdGhlbiAxMCArIGQgLSBpbnRfb2ZfY2hhciAnQScgZWxzZVxuICAgIGlmIGQgPD0gaW50X29mX2NoYXIgJ2YnIHRoZW4gMTAgKyBkIC0gaW50X29mX2NoYXIgJ2EnIGVsc2UgYXNzZXJ0IGZhbHNlXG4gICopXG4gIGlmIGQgPj0gaW50X29mX2NoYXIgJ2EnIHRoZW5cbiAgICBkIC0gODcgKCogMTAgKyBpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJ2EnICopIGVsc2VcbiAgaWYgZCA+PSBpbnRfb2ZfY2hhciAnQScgdGhlblxuICAgIGQgLSA1NSAgKCogMTAgKyBpbnRfb2ZfY2hhciBjIC0gaW50X29mX2NoYXIgJ0EnICopIGVsc2VcbiAgICBkIC0gaW50X29mX2NoYXIgJzAnXG5cblxubGV0IGNoYXJfZm9yX2hleGFkZWNpbWFsX2NvZGUgYzEgYzIgPVxuICBsZXQgYyA9XG4gICAgMTYgKiBoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMxICtcbiAgICAgICAgIGhleGFkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzIgaW5cbiAgaWYgYyA8IDAgfHwgYyA+IDI1NSB0aGVuXG4gICAgYmFkX2lucHV0XG4gICAgICAoUHJpbnRmLnNwcmludGYgXCJiYWQgY2hhcmFjdGVyIGhleGFkZWNpbWFsIGVuY29kaW5nIFxcXFwlYyVjXCIgYzEgYzIpIGVsc2VcbiAgY2hhcl9vZl9pbnQgY1xuXG5cbigqIENhbGxlZCBpbiBwYXJ0aWN1bGFyIHdoZW4gZW5jb3VudGVyaW5nICdcXFxcJyBhcyBzdGFydGVyIG9mIGEgY2hhci5cbiAgIFN0b3BzIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyAnXFwnJy4gKilcbmxldCBjaGVja19uZXh0X2NoYXIgbWVzc2FnZSB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIGJhZF90b2tlbl9sZW5ndGggbWVzc2FnZSBlbHNlXG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIGJhZF9lbmRfb2ZfaW5wdXQgbWVzc2FnZSBlbHNlXG4gIGNcblxuXG5sZXQgY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyID0gY2hlY2tfbmV4dF9jaGFyIFwiYSBDaGFyXCJcbmxldCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyA9IGNoZWNrX25leHRfY2hhciBcImEgU3RyaW5nXCJcblxubGV0IHNjYW5fYmFja3NsYXNoX2NoYXIgd2lkdGggaWIgPVxuICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIgd2lkdGggaWIgd2l0aFxuICB8ICdcXFxcJyB8ICdcXCcnIHwgJ1xcXCInIHwgJ24nIHwgJ3QnIHwgJ2InIHwgJ3InIGFzIGMgLT5cbiAgICBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIChjaGFyX2Zvcl9iYWNrc2xhc2ggYylcbiAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICBsZXQgZ2V0X2RpZ2l0ICgpID1cbiAgICAgIGxldCBjID0gU2Nhbm5pbmcubmV4dF9jaGFyIGliIGluXG4gICAgICBtYXRjaCBjIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyBhcyBjIC0+IGNcbiAgICAgIHwgYyAtPiBiYWRfaW5wdXRfZXNjYXBlIGMgaW5cbiAgICBsZXQgYzAgPSBjIGluXG4gICAgbGV0IGMxID0gZ2V0X2RpZ2l0ICgpIGluXG4gICAgbGV0IGMyID0gZ2V0X2RpZ2l0ICgpIGluXG4gICAgU2Nhbm5pbmcuc3RvcmVfY2hhciAod2lkdGggLSAyKSBpYiAoY2hhcl9mb3JfZGVjaW1hbF9jb2RlIGMwIGMxIGMyKVxuICB8ICd4JyAtPlxuICAgIGxldCBnZXRfZGlnaXQgKCkgPVxuICAgICAgbGV0IGMgPSBTY2FubmluZy5uZXh0X2NoYXIgaWIgaW5cbiAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgfCAnMCcgLi4gJzknIHwgJ0EnIC4uICdGJyB8ICdhJyAuLiAnZicgYXMgYyAtPiBjXG4gICAgICB8IGMgLT4gYmFkX2lucHV0X2VzY2FwZSBjIGluXG4gICAgbGV0IGMxID0gZ2V0X2RpZ2l0ICgpIGluXG4gICAgbGV0IGMyID0gZ2V0X2RpZ2l0ICgpIGluXG4gICAgU2Nhbm5pbmcuc3RvcmVfY2hhciAod2lkdGggLSAyKSBpYiAoY2hhcl9mb3JfaGV4YWRlY2ltYWxfY29kZSBjMSBjMilcbiAgfCBjIC0+XG4gICAgYmFkX2lucHV0X2VzY2FwZSBjXG5cblxuKCogU2NhbiBhIGNoYXJhY3RlciAoYW4gT0NhbWwgdG9rZW4pLiAqKVxubGV0IHNjYW5fY2FtbF9jaGFyIHdpZHRoIGliID1cblxuICBsZXQgcmVjIGZpbmRfc3RhcnQgd2lkdGggPVxuICAgIG1hdGNoIFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIHdpdGhcbiAgICB8ICdcXCcnIC0+IGZpbmRfY2hhciAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBjIC0+IGNoYXJhY3Rlcl9taXNtYXRjaCAnXFwnJyBjXG5cbiAgYW5kIGZpbmRfY2hhciB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXFxcJyAtPlxuICAgICAgZmluZF9zdG9wIChzY2FuX2JhY2tzbGFzaF9jaGFyIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYikgaWIpXG4gICAgfCBjIC0+XG4gICAgICBmaW5kX3N0b3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYylcblxuICBhbmQgZmluZF9zdG9wIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xcJycgLT4gU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWJcbiAgICB8IGMgLT4gY2hhcmFjdGVyX21pc21hdGNoICdcXCcnIGMgaW5cblxuICBmaW5kX3N0YXJ0IHdpZHRoXG5cblxuKCogU2NhbiBhIGRlbGltaXRlZCBzdHJpbmcgKGFuIE9DYW1sIHRva2VuKS4gKilcbmxldCBzY2FuX2NhbWxfc3RyaW5nIHdpZHRoIGliID1cblxuICBsZXQgcmVjIGZpbmRfc3RhcnQgd2lkdGggPVxuICAgIG1hdGNoIFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIHdpdGhcbiAgICB8ICdcXFwiJyAtPiBmaW5kX3N0b3AgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgYyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcXCInIGNcblxuICBhbmQgZmluZF9zdG9wIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxcIicgLT4gU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWJcbiAgICB8ICdcXFxcJyAtPiBzY2FuX2JhY2tzbGFzaCAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBjIC0+IGZpbmRfc3RvcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKVxuXG4gIGFuZCBzY2FuX2JhY2tzbGFzaCB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xccicgLT4gc2tpcF9uZXdsaW5lIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8ICdcXG4nIC0+IHNraXBfc3BhY2VzIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IF8gLT4gZmluZF9zdG9wIChzY2FuX2JhY2tzbGFzaF9jaGFyIHdpZHRoIGliKVxuXG4gIGFuZCBza2lwX25ld2xpbmUgd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXG4nIC0+IHNraXBfc3BhY2VzIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IF8gLT4gZmluZF9zdG9wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliICdcXHInKVxuXG4gIGFuZCBza2lwX3NwYWNlcyB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgd2lkdGggaWIgd2l0aFxuICAgIHwgJyAnIC0+IHNraXBfc3BhY2VzIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IF8gLT4gZmluZF9zdG9wIHdpZHRoIGluXG5cbiAgZmluZF9zdGFydCB3aWR0aFxuXG5cbigqIFNjYW4gYSBib29sZWFuIChhbiBPQ2FtbCB0b2tlbikuICopXG5sZXQgc2Nhbl9ib29sIGliID1cbiAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBsZXQgbSA9XG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCAndCcgLT4gNFxuICAgIHwgJ2YnIC0+IDVcbiAgICB8IGMgLT5cbiAgICAgIGJhZF9pbnB1dFxuICAgICAgICAoUHJpbnRmLnNwcmludGYgXCJ0aGUgY2hhcmFjdGVyICVDIGNhbm5vdCBzdGFydCBhIGJvb2xlYW5cIiBjKSBpblxuICBzY2FuX3N0cmluZyBOb25lIG0gaWJcblxuXG4oKiBTY2FuIGEgc3RyaW5nIGNvbnRhaW5pbmcgZWxlbWVudHMgaW4gY2hhcl9zZXQgYW5kIHRlcm1pbmF0ZWQgYnkgc2Nhbl9pbmRpY1xuICAgaWYgcHJvdmlkZWQuICopXG5sZXQgc2Nhbl9jaGFyc19pbl9jaGFyX3NldCBjaGFyX3NldCBzY2FuX2luZGljIHdpZHRoIGliID1cbiAgbGV0IHJlYyBzY2FuX2NoYXJzIGkgc3RwID1cbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIGkgPiAwICYmIG5vdCAoU2Nhbm5pbmcuZW9mIGliKSAmJlxuICAgICAgIGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgJiZcbiAgICAgICBpbnRfb2ZfY2hhciBjIDw+IHN0cCB0aGVuXG4gICAgICBsZXQgXyA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgbWF4X2ludCBpYiBjIGluXG4gICAgICBzY2FuX2NoYXJzIChpIC0gMSkgc3RwIGluXG4gIG1hdGNoIHNjYW5faW5kaWMgd2l0aFxuICB8IE5vbmUgLT4gc2Nhbl9jaGFycyB3aWR0aCAoLTEpO1xuICB8IFNvbWUgYyAtPlxuICAgIHNjYW5fY2hhcnMgd2lkdGggKGludF9vZl9jaGFyIGMpO1xuICAgIGlmIG5vdCAoU2Nhbm5pbmcuZW9mIGliKSB0aGVuXG4gICAgICBsZXQgY2kgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICAgIGlmIGMgPSBjaVxuICAgICAgdGhlbiBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYlxuICAgICAgZWxzZSBjaGFyYWN0ZXJfbWlzbWF0Y2ggYyBjaVxuXG5cbigqIFRoZSBnbG9iYWwgZXJyb3IgcmVwb3J0IGZ1bmN0aW9uIGZvciBbU2NhbmZdLiAqKVxubGV0IHNjYW5mX2JhZF9pbnB1dCBpYiA9IGZ1bmN0aW9uXG4gIHwgU2Nhbl9mYWlsdXJlIHMgfCBGYWlsdXJlIHMgLT5cbiAgICBsZXQgaSA9IFNjYW5uaW5nLmNoYXJfY291bnQgaWIgaW5cbiAgICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwic2NhbmY6IGJhZCBpbnB1dCBhdCBjaGFyIG51bWJlciAlaTogJXNcIiBpIHMpXG4gIHwgeCAtPiByYWlzZSB4XG5cblxuKCogR2V0IHRoZSBjb250ZW50IG9mIGEgY291bnRlciBmcm9tIGFuIGlucHV0IGJ1ZmZlci4gKilcbmxldCBnZXRfY291bnRlciBpYiBjb3VudGVyID1cbiAgbWF0Y2ggY291bnRlciB3aXRoXG4gIHwgTGluZV9jb3VudGVyIC0+IFNjYW5uaW5nLmxpbmVfY291bnQgaWJcbiAgfCBDaGFyX2NvdW50ZXIgLT4gU2Nhbm5pbmcuY2hhcl9jb3VudCBpYlxuICB8IFRva2VuX2NvdW50ZXIgLT4gU2Nhbm5pbmcudG9rZW5fY291bnQgaWJcblxuXG4oKiBDb21wdXRlIHRoZSB3aWR0aCBvZiBhIHBhZGRpbmcgb3B0aW9uIChzZWUgXCIlNDJ7XCIgYW5kIFwiJTEyMyhcIikuICopXG5sZXQgd2lkdGhfb2ZfcGFkX29wdCBwYWRfb3B0ID0gbWF0Y2ggcGFkX29wdCB3aXRoXG4gIHwgTm9uZSAtPiBtYXhfaW50XG4gIHwgU29tZSB3aWR0aCAtPiB3aWR0aFxuXG5cbmxldCBzdG9wcGVyX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZyA9XG4gIGlmIGZtdGluZyA9IEVzY2FwZWRfcGVyY2VudCB0aGVuICclJywgXCJcIiBlbHNlXG4gICAgbGV0IHN0ciA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmcgaW5cbiAgICBsZXQgc3RwID0gc3RyLlsxXSBpblxuICAgIGxldCBzdWJfc3RyID0gU3RyaW5nLnN1YiBzdHIgMiAoU3RyaW5nLmxlbmd0aCBzdHIgLSAyKSBpblxuICAgIHN0cCwgc3ViX3N0clxuXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBSZWFkZXIgbWFuYWdlbWVudCAqKVxuXG4oKiBBIGNhbGwgdG8gdGFrZV9mb3JtYXRfcmVhZGVycyBvbiBhIGZvcm1hdCBpcyBldmFsdWF0ZWQgaW50byBmdW5jdGlvbnNcbiAgIHRha2luZyByZWFkZXJzIGFzIGFyZ3VtZW50cyBhbmQgYWdncmVnYXRlIHRoZW0gaW50byBhbiBoZXRlcm9nZW5lb3VzIGxpc3QgKilcbigqIFdoZW4gYWxsIHJlYWRlcnMgYXJlIHRha2VuLCBmaW5hbGx5IHBhc3MgdGhlIGxpc3Qgb2YgdGhlIHJlYWRlcnMgdG8gdGhlXG4gICBjb250aW51YXRpb24gay4gKilcbmxldCByZWMgdGFrZV9mb3JtYXRfcmVhZGVycyA6IHR5cGUgYSBjIGQgZSBmIC5cbiAgICAoKGQsIGUpIGhldGVyX2xpc3QgLT4gZSkgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgIGQgPVxuZnVuIGsgZm10IC0+IG1hdGNoIGZtdCB3aXRoXG4gIHwgUmVhZGVyIGZtdF9yZXN0IC0+XG4gICAgZnVuIHJlYWRlciAtPlxuICAgICAgbGV0IG5ld19rIHJlYWRlcnNfcmVzdCA9IGsgKENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSkgaW5cbiAgICAgIHRha2VfZm9ybWF0X3JlYWRlcnMgbmV3X2sgZm10X3Jlc3RcbiAgfCBDaGFyIHJlc3QgICAgICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IENhbWxfY2hhciByZXN0ICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgU3RyaW5nIChfLCByZXN0KSAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBDYW1sX3N0cmluZyAoXywgcmVzdCkgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEludCAoXywgXywgXywgcmVzdCkgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgSW50MzIgKF8sIF8sIF8sIHJlc3QpICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBOYXRpdmVpbnQgKF8sIF8sIF8sIHJlc3QpICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEludDY0IChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgRmxvYXQgKF8sIF8sIF8sIHJlc3QpICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBCb29sIChfLCByZXN0KSAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEFscGhhIHJlc3QgICAgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgVGhldGEgcmVzdCAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGbHVzaCByZXN0ICAgICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFN0cmluZ19saXRlcmFsIChfLCByZXN0KSAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChfLCByZXN0KSAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBDdXN0b20gKF8sIF8sIHJlc3QpICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuXG4gIHwgU2Nhbl9jaGFyX3NldCAoXywgXywgcmVzdCkgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTY2FuX2dldF9jb3VudGVyIChfLCByZXN0KSAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoXywgcmVzdCkgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQsIF8pKSwgcmVzdCkgLT5cbiAgICAgIHRha2VfZm9ybWF0X3JlYWRlcnMgayAoY29uY2F0X2ZtdCBmbXQgcmVzdClcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10LCBfKSksIHJlc3QpIC0+XG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgKGNvbmNhdF9mbXQgZm10IHJlc3QpXG5cbiAgfCBGb3JtYXRfYXJnIChfLCBfLCByZXN0KSAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpICAgIC0+XG4gICAgIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayAoZXJhc2VfcmVsIChzeW1tIGZtdHR5KSkgcmVzdFxuICB8IElnbm9yZWRfcGFyYW0gKGlnbiwgcmVzdCkgICAgICAgIC0+IHRha2VfaWdub3JlZF9mb3JtYXRfcmVhZGVycyBrIGlnbiByZXN0XG5cbiAgfCBFbmRfb2ZfZm9ybWF0ICAgICAgICAgICAgICAgICAgICAtPiBrIE5pbFxuXG4oKiBUYWtlIHJlYWRlcnMgYXNzb2NpYXRlZCB0byBhbiBmbXR0eSBjb21pbmcgZnJvbSBhIEZvcm1hdF9zdWJzdCBcIiUoLi4uJSlcIi4gKilcbmFuZCB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIDogdHlwZSB4IHkgYSBjIGQgZSBmIC5cbiAgICAoKGQsIGUpIGhldGVyX2xpc3QgLT4gZSkgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIHgsIHkpIGZtdHR5IC0+XG4gICAgICAoeSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgeCwgZSwgZikgZm10IC0+IGQgPVxuZnVuIGsgZm10dHkgZm10IC0+IG1hdGNoIGZtdHR5IHdpdGhcbiAgfCBSZWFkZXJfdHkgZm10X3Jlc3QgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRfcmVzdCBmbXRcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSBmbXRfcmVzdCAtPlxuICAgIGZ1biByZWFkZXIgLT5cbiAgICAgIGxldCBuZXdfayByZWFkZXJzX3Jlc3QgPSBrIChDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkpIGluXG4gICAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIG5ld19rIGZtdF9yZXN0IGZtdFxuICB8IENoYXJfdHkgcmVzdCAgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBTdHJpbmdfdHkgcmVzdCAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgSW50X3R5IHJlc3QgICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEludDMyX3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEZsb2F0X3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBCb29sX3R5IHJlc3QgICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IFRoZXRhX3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBBbnlfdHkgcmVzdCAgICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgRm9ybWF0X2FyZ190eSAoXywgcmVzdCkgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEVuZF9vZl9mbXR0eSAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgcmVzdCkgLT5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEpIHR5MiBpblxuICAgIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayAoY29uY2F0X2ZtdHR5IHR5IHJlc3QpIGZtdFxuXG4oKiBUYWtlIHJlYWRlcnMgYXNzb2NpYXRlZCB0byBhbiBpZ25vcmVkIHBhcmFtZXRlci4gKilcbmFuZCB0YWtlX2lnbm9yZWRfZm9ybWF0X3JlYWRlcnMgOiB0eXBlIHggeSBhIGMgZCBlIGYgLlxuICAgICgoZCwgZSkgaGV0ZXJfbGlzdCAtPiBlKSAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgeCwgeSkgaWdub3JlZCAtPlxuICAgICAgKHksIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIHgsIGUsIGYpIGZtdCAtPiBkID1cbmZ1biBrIGlnbiBmbXQgLT4gbWF0Y2ggaWduIHdpdGhcbiAgfCBJZ25vcmVkX3JlYWRlciAtPlxuICAgIGZ1biByZWFkZXIgLT5cbiAgICAgIGxldCBuZXdfayByZWFkZXJzX3Jlc3QgPSBrIChDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkpIGluXG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIG5ld19rIGZtdFxuICB8IElnbm9yZWRfY2hhciAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfY2FtbF9jaGFyICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgXyAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfaW50IChfLCBfKSAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfbmF0aXZlaW50IChfLCBfKSAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfaW50NjQgKF8sIF8pICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfYm9vbCBfICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyBfICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIGZtdHR5IGZtdFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBHZW5lcmljIHNjYW5uaW5nICopXG5cbigqIE1ha2UgYSBnZW5lcmljIHNjYW5uaW5nIGZ1bmN0aW9uLiAqKVxuKCogU2NhbiBhIHN0cmVhbSBhY2NvcmRpbmcgdG8gYSBmb3JtYXQgYW5kIHJlYWRlcnMgb2J0YWluZWQgYnlcbiAgIHRha2VfZm9ybWF0X3JlYWRlcnMsIGFuZCBhZ2dyZWdhdGUgc2Nhbm5lZCB2YWx1ZXMgaW50byBhblxuICAgaGV0ZXJvZ2VuZW91cyBsaXN0LiAqKVxuKCogUmV0dXJuIHRoZSBoZXRlcm9nZW5lb3VzIGxpc3Qgb2Ygc2Nhbm5lZCB2YWx1ZXMuICopXG5sZXQgcmVjIG1ha2Vfc2NhbmYgOiB0eXBlIGEgYyBkIGUgZi5cbiAgICBTY2FubmluZy5pbl9jaGFubmVsIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAgIChkLCBlKSBoZXRlcl9saXN0IC0+IChhLCBmKSBoZXRlcl9saXN0ID1cbmZ1biBpYiBmbXQgcmVhZGVycyAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IENoYXIgcmVzdCAtPlxuICAgIGxldCBfID0gc2Nhbl9jaGFyIDAgaWIgaW5cbiAgICBsZXQgYyA9IHRva2VuX2NoYXIgaWIgaW5cbiAgICBDb25zIChjLCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIGxldCBfID0gc2Nhbl9jYW1sX2NoYXIgMCBpYiBpblxuICAgIGxldCBjID0gdG9rZW5fY2hhciBpYiBpblxuICAgIENvbnMgKGMsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuXG4gIHwgU3RyaW5nIChwYWQsIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSkgLT5cbiAgICBsZXQgc3RwLCBzdHIgPSBzdG9wcGVyX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9zdHJpbmcgKFNvbWUgc3RwKSB3aWR0aCBpYiBpblxuICAgIGxldCBzdHJfcmVzdCA9IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgc3RyX3Jlc3QgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW4gdG9rZW5fc3RyaW5nXG4gIHwgU3RyaW5nIChwYWQsIEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpKSAtPlxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX3N0cmluZyAoU29tZSAneycpIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgKGNvbmNhdF9mbXQgZm10JyByZXN0KSByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhblxuICAgICAgICAgICAgICAgICAgIHRva2VuX3N0cmluZ1xuICB8IFN0cmluZyAocGFkLCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9zdHJpbmcgKFNvbWUgJ1snKSB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW5cbiAgICAgICAgICAgICAgICAgICB0b2tlbl9zdHJpbmdcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9zdHJpbmcgTm9uZSB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW4gdG9rZW5fc3RyaW5nXG5cbiAgfCBDYW1sX3N0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2NhbWxfc3RyaW5nIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhbiB0b2tlbl9zdHJpbmdcbiAgfCBJbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IGMgPSBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciAoY2hhcl9vZl9pY29udiBpY29udikgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9pbnRfY29udmVyc2lvbiBjIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gKHRva2VuX2ludCBjKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9pbnQzMiBjKVxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgYyA9IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIChjaGFyX29mX2ljb252IGljb252KSBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2ludF9jb252ZXJzaW9uIGMgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2NhbiAodG9rZW5fbmF0aXZlaW50IGMpXG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IGMgPSBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciAoY2hhcl9vZl9pY29udiBpY29udikgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9pbnRfY29udmVyc2lvbiBjIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gKHRva2VuX2ludDY0IGMpXG4gIHwgRmxvYXQgKChfLCAoRmxvYXRfRiB8IEZsb2F0X0NGKSksIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2Nhbl9jYW1sX2Zsb2F0IHRva2VuX2Zsb2F0XG4gIHwgRmxvYXQgKChfLCAoRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0cpKSxcbiAgICAgICAgICAgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuX2Zsb2F0IHRva2VuX2Zsb2F0XG4gIHwgRmxvYXQgKChfLCAoRmxvYXRfaCB8IEZsb2F0X0gpKSwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuX2hleF9mbG9hdCB0b2tlbl9mbG9hdFxuICB8IEJvb2wgKHBhZCwgcmVzdCkgLT5cbiAgICBsZXQgc2NhbiBfIF8gaWIgPSBzY2FuX2Jvb2wgaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX2Jvb2xcbiAgfCBBbHBoYSBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiVhXFxcIlwiXG4gIHwgVGhldGEgXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIldFxcXCJcIlxuICB8IEN1c3RvbSBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiU/XFxcIiAoY3VzdG9tIGNvbnZlcnRlcilcIlxuICB8IFJlYWRlciBmbXRfcmVzdCAtPlxuICAgIGJlZ2luIG1hdGNoIHJlYWRlcnMgd2l0aFxuICAgIHwgQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpIC0+XG4gICAgICAgIGxldCB4ID0gcmVhZGVyIGliIGluXG4gICAgICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10X3Jlc3QgcmVhZGVyc19yZXN0KVxuICAgIHwgTmlsIC0+XG4gICAgICAgIGludmFsaWRfYXJnIFwic2NhbmY6IG1pc3NpbmcgcmVhZGVyXCJcbiAgICBlbmRcbiAgfCBGbHVzaCByZXN0IC0+XG4gICAgaWYgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnNcbiAgICBlbHNlIGJhZF9pbnB1dCBcImVuZCBvZiBpbnB1dCBub3QgZm91bmRcIlxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgKHN0ciwgcmVzdCkgLT5cbiAgICBTdHJpbmcuaXRlciAoY2hlY2tfY2hhciBpYikgc3RyO1xuICAgIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG4gIHwgQ2hhcl9saXRlcmFsIChjaHIsIHJlc3QpIC0+XG4gICAgY2hlY2tfY2hhciBpYiBjaHI7XG4gICAgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnNcblxuICB8IEZvcm1hdF9hcmcgKHBhZF9vcHQsIGZtdHR5LCByZXN0KSAtPlxuICAgIGxldCBfID0gc2Nhbl9jYW1sX3N0cmluZyAod2lkdGhfb2ZfcGFkX29wdCBwYWRfb3B0KSBpYiBpblxuICAgIGxldCBzID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgbGV0IGZtdCA9XG4gICAgICB0cnkgZm9ybWF0X29mX3N0cmluZ19mbXR0eSBzIGZtdHR5XG4gICAgICB3aXRoIEZhaWx1cmUgbXNnIC0+IGJhZF9pbnB1dCBtc2dcbiAgICBpblxuICAgIENvbnMgKGZtdCwgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgRm9ybWF0X3N1YnN0IChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9zdHJpbmcgKHdpZHRoX29mX3BhZF9vcHQgcGFkX29wdCkgaWIgaW5cbiAgICBsZXQgcyA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIGxldCBmbXQsIGZtdCcgPVxuICAgICAgdHJ5XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHMgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10JyA9IGZtdF9lYmJfb2Zfc3RyaW5nIHMgaW5cbiAgICAgICAgKCogVE9ETzogZmluZCBhIHdheSB0byBhdm9pZCByZXBhcnNpbmcgdHdpY2UgKilcblxuICAgICAgICAoKiBUT0RPOiB0aGVzZSB0eXBlLWNoZWNrcyBiZWxvdyAqY2FuKiBmYWlsIGJlY2F1c2Ugb2YgdHlwZVxuICAgICAgICAgICBhbWJpZ3VpdHkgaW4gcHJlc2VuY2Ugb2YgaWdub3JlZC1yZWFkZXJzOiBcIiVfciVkXCIgYW5kIFwiJWQlX3JcIlxuICAgICAgICAgICBhcmUgdHlwZWQgaW4gdGhlIHNhbWUgd2F5LlxuXG4gICAgICAgICAgICMgU2NhbmYuc3NjYW5mIFwiXFxcIiVfciVkXFxcIjNcIiBcIiUoJWQlX3IlKVwiIGlnbm9yZVxuICAgICAgICAgICAgIChmdW4gZm10IG4gLT4gc3RyaW5nX29mX2Zvcm1hdCBmbXQsIG4pXG4gICAgICAgICAgIEV4Y2VwdGlvbjogQ2FtbGludGVybmFsRm9ybWF0LlR5cGVfbWlzbWF0Y2guXG5cbiAgICAgICAgICAgV2Ugc2hvdWxkIHByb3Blcmx5IGNhdGNoIHRoaXMgZXhjZXB0aW9uLlxuICAgICAgICAqKVxuICAgICAgICB0eXBlX2Zvcm1hdCBmbXQgKGVyYXNlX3JlbCBmbXR0eSksXG4gICAgICAgIHR5cGVfZm9ybWF0IGZtdCcgKGVyYXNlX3JlbCAoc3ltbSBmbXR0eSkpXG4gICAgICB3aXRoIEZhaWx1cmUgbXNnIC0+IGJhZF9pbnB1dCBtc2dcbiAgICBpblxuICAgIENvbnMgKEZvcm1hdCAoZm10LCBzKSxcbiAgICAgICAgICBtYWtlX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVycylcblxuICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSkgLT5cbiAgICBsZXQgc3RwLCBzdHIgPSBzdG9wcGVyX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBsZXQgd2lkdGggPSB3aWR0aF9vZl9wYWRfb3B0IHdpZHRoX29wdCBpblxuICAgIHNjYW5fY2hhcnNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgKFNvbWUgc3RwKSB3aWR0aCBpYjtcbiAgICBsZXQgcyA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIGxldCBzdHJfcmVzdCA9IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIGluXG4gICAgQ29ucyAocywgbWFrZV9zY2FuZiBpYiBzdHJfcmVzdCByZWFkZXJzKVxuICB8IFNjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQsIHJlc3QpIC0+XG4gICAgbGV0IHdpZHRoID0gd2lkdGhfb2ZfcGFkX29wdCB3aWR0aF9vcHQgaW5cbiAgICBzY2FuX2NoYXJzX2luX2NoYXJfc2V0IGNoYXJfc2V0IE5vbmUgd2lkdGggaWI7XG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBDb25zIChzLCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIGxldCBjb3VudCA9IGdldF9jb3VudGVyIGliIGNvdW50ZXIgaW5cbiAgICBDb25zIChjb3VudCwgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAtPlxuICAgIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgICBDb25zIChjLCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgcmVzdCkgLT5cbiAgICBTdHJpbmcuaXRlciAoY2hlY2tfY2hhciBpYikgKHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmb3JtYXR0aW5nX2xpdCk7XG4gICAgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnNcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGNoZWNrX2NoYXIgaWIgJ0AnOyBjaGVja19jaGFyIGliICd7JztcbiAgICBtYWtlX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVyc1xuICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX2JveCAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgY2hlY2tfY2hhciBpYiAnQCc7IGNoZWNrX2NoYXIgaWIgJ1snO1xuICAgIG1ha2Vfc2NhbmYgaWIgKGNvbmNhdF9mbXQgZm10JyByZXN0KSByZWFkZXJzXG5cbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgbGV0IFBhcmFtX2Zvcm1hdF9FQkIgZm10JyA9IHBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCBpZ24gcmVzdCBpblxuICAgIGJlZ2luIG1hdGNoIG1ha2Vfc2NhbmYgaWIgZm10JyByZWFkZXJzIHdpdGhcbiAgICB8IENvbnMgKF8sIGFyZ19yZXN0KSAtPiBhcmdfcmVzdFxuICAgIHwgTmlsIC0+IGFzc2VydCBmYWxzZVxuICAgIGVuZFxuXG4gIHwgRW5kX29mX2Zvcm1hdCAtPlxuICAgIE5pbFxuXG4oKiBDYXNlIGFuYWx5c2lzIG9uIHBhZGRpbmcgYW5kIHByZWNpc2lvbi4gKilcbigqIFJlamVjdCBmb3JtYXRzIGNvbnRhaW5pbmcgXCIlKlwiIG9yIFwiJS4qXCIuICopXG4oKiBQYXNzIHBhZGRpbmcgYW5kIHByZWNpc2lvbiB0byB0aGUgZ2VuZXJpYyBzY2FubmVyIGBzY2FuJy4gKilcbmFuZCBwYWRfcHJlY19zY2FuZiA6IHR5cGUgYSBjIGQgZSBmIHggeSB6IHQgLlxuICAgIFNjYW5uaW5nLmluX2NoYW5uZWwgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKGQsIGUpIGhldGVyX2xpc3QgLT4gKHgsIHkpIHBhZGRpbmcgLT4gKHksIHogLT4gYSkgcHJlY2lzaW9uIC0+XG4gICAgICAoaW50IC0+IGludCAtPiBTY2FubmluZy5pbl9jaGFubmVsIC0+IHQpIC0+XG4gICAgICAoU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiB6KSAtPlxuICAgICAgKHgsIGYpIGhldGVyX2xpc3QgPVxuZnVuIGliIGZtdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gdG9rZW4gLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBsZXQgXyA9IHNjYW4gbWF4X2ludCBtYXhfaW50IGliIGluXG4gICAgbGV0IHggPSB0b2tlbiBpYiBpblxuICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMpXG4gIHwgTm9fcGFkZGluZywgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgbGV0IF8gPSBzY2FuIG1heF9pbnQgcCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IExpdF9wYWRkaW5nICgoUmlnaHQgfCBaZXJvcyksIHcpLCBOb19wcmVjaXNpb24gLT5cbiAgICBsZXQgXyA9IHNjYW4gdyBtYXhfaW50IGliIGluXG4gICAgbGV0IHggPSB0b2tlbiBpYiBpblxuICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMpXG4gIHwgTGl0X3BhZGRpbmcgKChSaWdodCB8IFplcm9zKSwgdyksIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGxldCBfID0gc2NhbiB3IHAgaWIgaW5cbiAgICBsZXQgeCA9IHRva2VuIGliIGluXG4gICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycylcbiAgfCBMaXRfcGFkZGluZyAoTGVmdCwgXyksIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJS1cXFwiXCJcbiAgfCBMaXRfcGFkZGluZyAoKFJpZ2h0IHwgWmVyb3MpLCBfKSwgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlKlxcXCJcIlxuICB8IEFyZ19wYWRkaW5nIF8sIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJSpcXFwiXCJcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUqXFxcIlwiXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAoKiBEZWZpbmluZyBbc2NhbmZdIGFuZCB2YXJpb3VzIGZsYXZvcnMgb2YgW3NjYW5mXSAqKVxuXG5sZXQga3NjYW5mX2dlbiBpYiBlZiBhZiAoRm9ybWF0IChmbXQsIHN0cikpID1cbiAgbGV0IHJlYyBhcHBseSA6IHR5cGUgYSBiIC4gYSAtPiAoYSwgYikgaGV0ZXJfbGlzdCAtPiBiID1cbiAgICBmdW4gZiBhcmdzIC0+IG1hdGNoIGFyZ3Mgd2l0aFxuICAgIHwgQ29ucyAoeCwgcikgLT4gYXBwbHkgKGYgeCkgclxuICAgIHwgTmlsIC0+IGZcbiAgaW5cbiAgbGV0IGsgcmVhZGVycyBmID1cbiAgICBTY2FubmluZy5yZXNldF90b2tlbiBpYjtcbiAgICBtYXRjaCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzIHdpdGhcbiAgICB8IGV4Y2VwdGlvbiAoU2Nhbl9mYWlsdXJlIF8gfCBGYWlsdXJlIF8gfCBFbmRfb2ZfZmlsZSBhcyBleGMpIC0+XG4gICAgICAgIGVmIGliIGV4Y1xuICAgIHwgZXhjZXB0aW9uIEludmFsaWRfYXJndW1lbnQgbXNnIC0+XG4gICAgICAgIGludmFsaWRfYXJnIChtc2cgXiBcIiBpbiBmb3JtYXQgXFxcIlwiIF4gU3RyaW5nLmVzY2FwZWQgc3RyIF4gXCJcXFwiXCIpXG4gICAgfCBhcmdzIC0+XG4gICAgICAgIGFmIChhcHBseSBmIGFyZ3MpXG4gIGluXG4gIHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcblxubGV0IGtzY2FuZiBpYiBlZiBmbXQgPVxuICBrc2NhbmZfZ2VuIGliIGVmIChmdW4geCAtPiB4KSBmbXRcblxubGV0IGtzY2FuZl9vcHQgaWIgZm10ID1cbiAga3NjYW5mX2dlbiBpYiAoZnVuIF8gXyAtPiBOb25lKSAoZnVuIHggLT4gU29tZSB4KSBmbXRcblxuKCoqKilcblxubGV0IGtic2NhbmYgPSBrc2NhbmZcbmxldCBic2NhbmYgaWIgZm10ID0ga2JzY2FuZiBpYiBzY2FuZl9iYWRfaW5wdXQgZm10XG5sZXQgYnNjYW5mX29wdCBpYiBmbXQgPSBrc2NhbmZfb3B0IGliIGZtdFxuXG5sZXQga3NzY2FuZiBzIGVmIGZtdCA9IGtic2NhbmYgKFNjYW5uaW5nLmZyb21fc3RyaW5nIHMpIGVmIGZtdFxubGV0IHNzY2FuZiBzIGZtdCA9IGtic2NhbmYgKFNjYW5uaW5nLmZyb21fc3RyaW5nIHMpIHNjYW5mX2JhZF9pbnB1dCBmbXRcbmxldCBzc2NhbmZfb3B0IHMgZm10ID0ga3NjYW5mX29wdCAoU2Nhbm5pbmcuZnJvbV9zdHJpbmcgcykgZm10XG5cbmxldCBzY2FuZiBmbXQgPSBrc2NhbmYgU2Nhbm5pbmcuc3RkaW4gc2NhbmZfYmFkX2lucHV0IGZtdFxubGV0IHNjYW5mX29wdCBmbXQgPSBrc2NhbmZfb3B0IFNjYW5uaW5nLnN0ZGluIGZtdFxuXG4oKioqKVxuXG4oKiBTY2FubmluZyBmb3JtYXQgc3RyaW5ncy4gKilcbmxldCBic2NhbmZfZm9ybWF0IDpcbiAgU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPlxuICAoKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gJ2cpIC0+ICdnID1cbiAgZnVuIGliIGZvcm1hdCBmIC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfc3RyaW5nIG1heF9pbnQgaWIgaW5cbiAgICBsZXQgc3RyID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgbGV0IGZtdCcgPVxuICAgICAgdHJ5IGZvcm1hdF9vZl9zdHJpbmdfZm9ybWF0IHN0ciBmb3JtYXRcbiAgICAgIHdpdGggRmFpbHVyZSBtc2cgLT4gYmFkX2lucHV0IG1zZyBpblxuICAgIGYgZm10J1xuXG5cbmxldCBzc2NhbmZfZm9ybWF0IDpcbiAgc3RyaW5nIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+XG4gICgoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAnZykgLT4gJ2cgPVxuICBmdW4gcyBmb3JtYXQgZiAtPiBic2NhbmZfZm9ybWF0IChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBmb3JtYXQgZlxuXG5cbmxldCBmb3JtYXRfZnJvbV9zdHJpbmcgcyBmbXQgPVxuICBzc2NhbmZfZm9ybWF0IChcIlxcXCJcIiBeIFN0cmluZy5lc2NhcGVkIHMgXiBcIlxcXCJcIikgZm10IChmdW4geCAtPiB4KVxuXG5cbmxldCB1bmVzY2FwZWQgcyA9XG4gIHNzY2FuZiAoXCJcXFwiXCIgXiBzIF4gXCJcXFwiXCIpIFwiJVMlIVwiIChmdW4geCAtPiB4KVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBSZWdpc3RlcmluZyBPQ2FtbCB2YWx1ZXMgd2l0aCB0aGUgQyBydW50aW1lIGZvciBsYXRlciBjYWxsYmFja3MgKilcblxuZXh0ZXJuYWwgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgOiBzdHJpbmcgLT4gT2JqLnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgcmVnaXN0ZXIgbmFtZSB2ID1cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSAoT2JqLnJlcHIgdilcblxubGV0IHJlZ2lzdGVyX2V4Y2VwdGlvbiBuYW1lIChleG4gOiBleG4pID1cbiAgbGV0IGV4biA9IE9iai5yZXByIGV4biBpblxuICBsZXQgc2xvdCA9IGlmIE9iai50YWcgZXhuID0gT2JqLm9iamVjdF90YWcgdGhlbiBleG4gZWxzZSBPYmouZmllbGQgZXhuIDAgaW5cbiAgcmVnaXN0ZXJfbmFtZWRfdmFsdWUgbmFtZSBzbG90XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICBKZXJvbWUgVm91aWxsb24sIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAyIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gT2JqXG5cbigqKioqIE9iamVjdCByZXByZXNlbnRhdGlvbiAqKioqKVxuXG5leHRlcm5hbCBzZXRfaWQ6ICdhIC0+ICdhID0gXCJjYW1sX3NldF9vb19pZFwiIFtAQG5vYWxsb2NdXG5cbigqKioqIE9iamVjdCBjb3B5ICoqKiopXG5cbmxldCBjb3B5IG8gPVxuICBsZXQgbyA9IChPYmoub2JqIChPYmouZHVwIChPYmoucmVwciBvKSkpIGluXG4gIHNldF9pZCBvXG5cbigqKioqIENvbXByZXNzaW9uIG9wdGlvbnMgKioqKilcbigqIFBhcmFtZXRlcnMgKilcbnR5cGUgcGFyYW1zID0ge1xuICAgIG11dGFibGUgY29tcGFjdF90YWJsZSA6IGJvb2w7XG4gICAgbXV0YWJsZSBjb3B5X3BhcmVudCA6IGJvb2w7XG4gICAgbXV0YWJsZSBjbGVhbl93aGVuX2NvcHlpbmcgOiBib29sO1xuICAgIG11dGFibGUgcmV0cnlfY291bnQgOiBpbnQ7XG4gICAgbXV0YWJsZSBidWNrZXRfc21hbGxfc2l6ZSA6IGludFxuICB9XG5cbmxldCBwYXJhbXMgPSB7XG4gIGNvbXBhY3RfdGFibGUgPSB0cnVlO1xuICBjb3B5X3BhcmVudCA9IHRydWU7XG4gIGNsZWFuX3doZW5fY29weWluZyA9IHRydWU7XG4gIHJldHJ5X2NvdW50ID0gMztcbiAgYnVja2V0X3NtYWxsX3NpemUgPSAxNlxufVxuXG4oKioqKiBQYXJhbWV0ZXJzICoqKiopXG5cbmxldCBpbml0aWFsX29iamVjdF9zaXplID0gMlxuXG4oKioqKiBJdGVtcyAqKioqKVxuXG50eXBlIGl0ZW0gPSBEdW1teUEgfCBEdW1teUIgfCBEdW1teUMgb2YgaW50XG5sZXQgXyA9IFtEdW1teUE7IER1bW15QjsgRHVtbXlDIDBdICgqIHRvIGF2b2lkIHdhcm5pbmdzICopXG5cbmxldCBkdW1teV9pdGVtID0gKG1hZ2ljICgpIDogaXRlbSlcblxuKCoqKiogVHlwZXMgKioqKilcblxudHlwZSB0YWdcbnR5cGUgbGFiZWwgPSBpbnRcbnR5cGUgY2xvc3VyZSA9IGl0ZW1cbnR5cGUgdCA9IER1bW15QSB8IER1bW15QiB8IER1bW15QyBvZiBpbnRcbmxldCBfID0gW0R1bW15QTsgRHVtbXlCOyBEdW1teUMgMF0gKCogdG8gYXZvaWQgd2FybmluZ3MgKilcblxudHlwZSBvYmogPSB0IGFycmF5XG5leHRlcm5hbCByZXQgOiAob2JqIC0+ICdhKSAtPiBjbG9zdXJlID0gXCIlaWRlbnRpdHlcIlxuXG4oKioqKiBMYWJlbHMgKioqKilcblxubGV0IHB1YmxpY19tZXRob2RfbGFiZWwgcyA6IHRhZyA9XG4gIGxldCBhY2N1ID0gcmVmIDAgaW5cbiAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICBhY2N1IDo9IDIyMyAqICFhY2N1ICsgQ2hhci5jb2RlIHMuW2ldXG4gIGRvbmU7XG4gICgqIHJlZHVjZSB0byAzMSBiaXRzICopXG4gIGFjY3UgOj0gIWFjY3UgbGFuZCAoMSBsc2wgMzEgLSAxKTtcbiAgKCogbWFrZSBpdCBzaWduZWQgZm9yIDY0IGJpdHMgYXJjaGl0ZWN0dXJlcyAqKVxuICBsZXQgdGFnID0gaWYgIWFjY3UgPiAweDNGRkZGRkZGIHRoZW4gIWFjY3UgLSAoMSBsc2wgMzEpIGVsc2UgIWFjY3UgaW5cbiAgKCogUHJpbnRmLmVwcmludGYgXCIlcyA9ICVkXFxuXCIgcyB0YWc7IGZsdXNoIHN0ZGVycjsgKilcbiAgbWFnaWMgdGFnXG5cbigqKioqIFNwYXJzZSBhcnJheSAqKioqKVxuXG5tb2R1bGUgVmFycyA9XG4gIE1hcC5NYWtlKHN0cnVjdCB0eXBlIHQgPSBzdHJpbmcgbGV0IGNvbXBhcmUgKHg6dCkgeSA9IGNvbXBhcmUgeCB5IGVuZClcbnR5cGUgdmFycyA9IGludCBWYXJzLnRcblxubW9kdWxlIE1ldGhzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IHN0cmluZyBsZXQgY29tcGFyZSAoeDp0KSB5ID0gY29tcGFyZSB4IHkgZW5kKVxudHlwZSBtZXRocyA9IGxhYmVsIE1ldGhzLnRcbm1vZHVsZSBMYWJzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IGxhYmVsIGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG50eXBlIGxhYnMgPSBib29sIExhYnMudFxuXG4oKiBUaGUgY29tcGlsZXIgYXNzdW1lcyB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBbc2l6ZV0uICopXG50eXBlIHRhYmxlID1cbiB7IG11dGFibGUgc2l6ZTogaW50O1xuICAgbXV0YWJsZSBtZXRob2RzOiBjbG9zdXJlIGFycmF5O1xuICAgbXV0YWJsZSBtZXRob2RzX2J5X25hbWU6IG1ldGhzO1xuICAgbXV0YWJsZSBtZXRob2RzX2J5X2xhYmVsOiBsYWJzO1xuICAgbXV0YWJsZSBwcmV2aW91c19zdGF0ZXM6XG4gICAgIChtZXRocyAqIGxhYnMgKiAobGFiZWwgKiBpdGVtKSBsaXN0ICogdmFycyAqXG4gICAgICBsYWJlbCBsaXN0ICogc3RyaW5nIGxpc3QpIGxpc3Q7XG4gICBtdXRhYmxlIGhpZGRlbl9tZXRoczogKGxhYmVsICogaXRlbSkgbGlzdDtcbiAgIG11dGFibGUgdmFyczogdmFycztcbiAgIG11dGFibGUgaW5pdGlhbGl6ZXJzOiAob2JqIC0+IHVuaXQpIGxpc3QgfVxuXG5sZXQgZHVtbXlfdGFibGUgPVxuICB7IG1ldGhvZHMgPSBbfCBkdW1teV9pdGVtIHxdO1xuICAgIG1ldGhvZHNfYnlfbmFtZSA9IE1ldGhzLmVtcHR5O1xuICAgIG1ldGhvZHNfYnlfbGFiZWwgPSBMYWJzLmVtcHR5O1xuICAgIHByZXZpb3VzX3N0YXRlcyA9IFtdO1xuICAgIGhpZGRlbl9tZXRocyA9IFtdO1xuICAgIHZhcnMgPSBWYXJzLmVtcHR5O1xuICAgIGluaXRpYWxpemVycyA9IFtdO1xuICAgIHNpemUgPSAwIH1cblxubGV0IHRhYmxlX2NvdW50ID0gcmVmIDBcblxuKCogZHVtbXlfbWV0IHNob3VsZCBiZSBhIHBvaW50ZXIsIHNvIHVzZSBhbiBhdG9tICopXG5sZXQgZHVtbXlfbWV0IDogaXRlbSA9IG9iaiAoT2JqLm5ld19ibG9jayAwIDApXG4oKiBpZiBkZWJ1Z2dpbmcgaXMgbmVlZGVkLCB0aGlzIGNvdWxkIGJlIGEgZ29vZCBpZGVhOiAqKVxuKCogbGV0IGR1bW15X21ldCAoKSA9IGZhaWx3aXRoIFwiVW5kZWZpbmVkIG1ldGhvZFwiICopXG5cbmxldCByZWMgZml0X3NpemUgbiA9XG4gIGlmIG4gPD0gMiB0aGVuIG4gZWxzZVxuICBmaXRfc2l6ZSAoKG4rMSkvMikgKiAyXG5cbmxldCBuZXdfdGFibGUgcHViX2xhYmVscyA9XG4gIGluY3IgdGFibGVfY291bnQ7XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcHViX2xhYmVscyBpblxuICBsZXQgbWV0aG9kcyA9IEFycmF5Lm1ha2UgKGxlbioyKzIpIGR1bW15X21ldCBpblxuICBtZXRob2RzLigwKSA8LSBtYWdpYyBsZW47XG4gIG1ldGhvZHMuKDEpIDwtIG1hZ2ljIChmaXRfc2l6ZSBsZW4gKiBTeXMud29yZF9zaXplIC8gOCAtIDEpO1xuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkbyBtZXRob2RzLihpKjIrMykgPC0gbWFnaWMgcHViX2xhYmVscy4oaSkgZG9uZTtcbiAgeyBtZXRob2RzID0gbWV0aG9kcztcbiAgICBtZXRob2RzX2J5X25hbWUgPSBNZXRocy5lbXB0eTtcbiAgICBtZXRob2RzX2J5X2xhYmVsID0gTGFicy5lbXB0eTtcbiAgICBwcmV2aW91c19zdGF0ZXMgPSBbXTtcbiAgICBoaWRkZW5fbWV0aHMgPSBbXTtcbiAgICB2YXJzID0gVmFycy5lbXB0eTtcbiAgICBpbml0aWFsaXplcnMgPSBbXTtcbiAgICBzaXplID0gaW5pdGlhbF9vYmplY3Rfc2l6ZSB9XG5cbmxldCByZXNpemUgYXJyYXkgbmV3X3NpemUgPVxuICBsZXQgb2xkX3NpemUgPSBBcnJheS5sZW5ndGggYXJyYXkubWV0aG9kcyBpblxuICBpZiBuZXdfc2l6ZSA+IG9sZF9zaXplIHRoZW4gYmVnaW5cbiAgICBsZXQgbmV3X2J1Y2sgPSBBcnJheS5tYWtlIG5ld19zaXplIGR1bW15X21ldCBpblxuICAgIEFycmF5LmJsaXQgYXJyYXkubWV0aG9kcyAwIG5ld19idWNrIDAgb2xkX3NpemU7XG4gICAgYXJyYXkubWV0aG9kcyA8LSBuZXdfYnVja1xuIGVuZFxuXG5sZXQgcHV0IGFycmF5IGxhYmVsIGVsZW1lbnQgPVxuICByZXNpemUgYXJyYXkgKGxhYmVsICsgMSk7XG4gIGFycmF5Lm1ldGhvZHMuKGxhYmVsKSA8LSBlbGVtZW50XG5cbigqKioqIENsYXNzZXMgKioqKilcblxubGV0IG1ldGhvZF9jb3VudCA9IHJlZiAwXG5sZXQgaW5zdF92YXJfY291bnQgPSByZWYgMFxuXG4oKiB0eXBlIHQgKilcbnR5cGUgbWV0aCA9IGl0ZW1cblxubGV0IG5ld19tZXRob2QgdGFibGUgPVxuICBsZXQgaW5kZXggPSBBcnJheS5sZW5ndGggdGFibGUubWV0aG9kcyBpblxuICByZXNpemUgdGFibGUgKGluZGV4ICsgMSk7XG4gIGluZGV4XG5cbmxldCBnZXRfbWV0aG9kX2xhYmVsIHRhYmxlIG5hbWUgPVxuICB0cnlcbiAgICBNZXRocy5maW5kIG5hbWUgdGFibGUubWV0aG9kc19ieV9uYW1lXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgbGV0IGxhYmVsID0gbmV3X21ldGhvZCB0YWJsZSBpblxuICAgIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSA8LSBNZXRocy5hZGQgbmFtZSBsYWJlbCB0YWJsZS5tZXRob2RzX2J5X25hbWU7XG4gICAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSBMYWJzLmFkZCBsYWJlbCB0cnVlIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWw7XG4gICAgbGFiZWxcblxubGV0IGdldF9tZXRob2RfbGFiZWxzIHRhYmxlIG5hbWVzID1cbiAgQXJyYXkubWFwIChnZXRfbWV0aG9kX2xhYmVsIHRhYmxlKSBuYW1lc1xuXG5sZXQgc2V0X21ldGhvZCB0YWJsZSBsYWJlbCBlbGVtZW50ID1cbiAgaW5jciBtZXRob2RfY291bnQ7XG4gIGlmIExhYnMuZmluZCBsYWJlbCB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIHRoZW5cbiAgICBwdXQgdGFibGUgbGFiZWwgZWxlbWVudFxuICBlbHNlXG4gICAgdGFibGUuaGlkZGVuX21ldGhzIDwtIChsYWJlbCwgZWxlbWVudCkgOjogdGFibGUuaGlkZGVuX21ldGhzXG5cbmxldCBnZXRfbWV0aG9kIHRhYmxlIGxhYmVsID1cbiAgdHJ5IExpc3QuYXNzb2MgbGFiZWwgdGFibGUuaGlkZGVuX21ldGhzXG4gIHdpdGggTm90X2ZvdW5kIC0+IHRhYmxlLm1ldGhvZHMuKGxhYmVsKVxuXG5sZXQgdG9fbGlzdCBhcnIgPVxuICBpZiBhcnIgPT0gbWFnaWMgMCB0aGVuIFtdIGVsc2UgQXJyYXkudG9fbGlzdCBhcnJcblxubGV0IG5hcnJvdyB0YWJsZSB2YXJzIHZpcnRfbWV0aHMgY29uY3JfbWV0aHMgPVxuICBsZXQgdmFycyA9IHRvX2xpc3QgdmFyc1xuICBhbmQgdmlydF9tZXRocyA9IHRvX2xpc3QgdmlydF9tZXRoc1xuICBhbmQgY29uY3JfbWV0aHMgPSB0b19saXN0IGNvbmNyX21ldGhzIGluXG4gIGxldCB2aXJ0X21ldGhfbGFicyA9IExpc3QubWFwIChnZXRfbWV0aG9kX2xhYmVsIHRhYmxlKSB2aXJ0X21ldGhzIGluXG4gIGxldCBjb25jcl9tZXRoX2xhYnMgPSBMaXN0Lm1hcCAoZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSkgY29uY3JfbWV0aHMgaW5cbiAgdGFibGUucHJldmlvdXNfc3RhdGVzIDwtXG4gICAgICh0YWJsZS5tZXRob2RzX2J5X25hbWUsIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwsIHRhYmxlLmhpZGRlbl9tZXRocyxcbiAgICAgIHRhYmxlLnZhcnMsIHZpcnRfbWV0aF9sYWJzLCB2YXJzKVxuICAgICA6OiB0YWJsZS5wcmV2aW91c19zdGF0ZXM7XG4gIHRhYmxlLnZhcnMgPC1cbiAgICBWYXJzLmZvbGRcbiAgICAgIChmdW4gbGFiIGluZm8gdHZhcnMgLT5cbiAgICAgICAgaWYgTGlzdC5tZW0gbGFiIHZhcnMgdGhlbiBWYXJzLmFkZCBsYWIgaW5mbyB0dmFycyBlbHNlIHR2YXJzKVxuICAgICAgdGFibGUudmFycyBWYXJzLmVtcHR5O1xuICBsZXQgYnlfbmFtZSA9IHJlZiBNZXRocy5lbXB0eSBpblxuICBsZXQgYnlfbGFiZWwgPSByZWYgTGFicy5lbXB0eSBpblxuICBMaXN0Lml0ZXIyXG4gICAgKGZ1biBtZXQgbGFiZWwgLT5cbiAgICAgICBieV9uYW1lIDo9IE1ldGhzLmFkZCBtZXQgbGFiZWwgIWJ5X25hbWU7XG4gICAgICAgYnlfbGFiZWwgOj1cbiAgICAgICAgICBMYWJzLmFkZCBsYWJlbFxuICAgICAgICAgICAgKHRyeSBMYWJzLmZpbmQgbGFiZWwgdGFibGUubWV0aG9kc19ieV9sYWJlbCB3aXRoIE5vdF9mb3VuZCAtPiB0cnVlKVxuICAgICAgICAgICAgIWJ5X2xhYmVsKVxuICAgIGNvbmNyX21ldGhzIGNvbmNyX21ldGhfbGFicztcbiAgTGlzdC5pdGVyMlxuICAgIChmdW4gbWV0IGxhYmVsIC0+XG4gICAgICAgYnlfbmFtZSA6PSBNZXRocy5hZGQgbWV0IGxhYmVsICFieV9uYW1lO1xuICAgICAgIGJ5X2xhYmVsIDo9IExhYnMuYWRkIGxhYmVsIGZhbHNlICFieV9sYWJlbClcbiAgICB2aXJ0X21ldGhzIHZpcnRfbWV0aF9sYWJzO1xuICB0YWJsZS5tZXRob2RzX2J5X25hbWUgPC0gIWJ5X25hbWU7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gIWJ5X2xhYmVsO1xuICB0YWJsZS5oaWRkZW5fbWV0aHMgPC1cbiAgICAgTGlzdC5mb2xkX3JpZ2h0XG4gICAgICAgKGZ1biAoKGxhYiwgXykgYXMgbWV0KSBobSAtPlxuICAgICAgICAgIGlmIExpc3QubWVtIGxhYiB2aXJ0X21ldGhfbGFicyB0aGVuIGhtIGVsc2UgbWV0OjpobSlcbiAgICAgICB0YWJsZS5oaWRkZW5fbWV0aHNcbiAgICAgICBbXVxuXG5sZXQgd2lkZW4gdGFibGUgPVxuICBsZXQgKGJ5X25hbWUsIGJ5X2xhYmVsLCBzYXZlZF9oaWRkZW5fbWV0aHMsIHNhdmVkX3ZhcnMsIHZpcnRfbWV0aHMsIHZhcnMpID1cbiAgICBMaXN0LmhkIHRhYmxlLnByZXZpb3VzX3N0YXRlc1xuICBpblxuICB0YWJsZS5wcmV2aW91c19zdGF0ZXMgPC0gTGlzdC50bCB0YWJsZS5wcmV2aW91c19zdGF0ZXM7XG4gIHRhYmxlLnZhcnMgPC1cbiAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAoZnVuIHMgdiAtPiBWYXJzLmFkZCB2IChWYXJzLmZpbmQgdiB0YWJsZS52YXJzKSBzKVxuICAgICAgIHNhdmVkX3ZhcnMgdmFycztcbiAgdGFibGUubWV0aG9kc19ieV9uYW1lIDwtIGJ5X25hbWU7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gYnlfbGFiZWw7XG4gIHRhYmxlLmhpZGRlbl9tZXRocyA8LVxuICAgICBMaXN0LmZvbGRfcmlnaHRcbiAgICAgICAoZnVuICgobGFiLCBfKSBhcyBtZXQpIGhtIC0+XG4gICAgICAgICAgaWYgTGlzdC5tZW0gbGFiIHZpcnRfbWV0aHMgdGhlbiBobSBlbHNlIG1ldDo6aG0pXG4gICAgICAgdGFibGUuaGlkZGVuX21ldGhzXG4gICAgICAgc2F2ZWRfaGlkZGVuX21ldGhzXG5cbmxldCBuZXdfc2xvdCB0YWJsZSA9XG4gIGxldCBpbmRleCA9IHRhYmxlLnNpemUgaW5cbiAgdGFibGUuc2l6ZSA8LSBpbmRleCArIDE7XG4gIGluZGV4XG5cbmxldCBuZXdfdmFyaWFibGUgdGFibGUgbmFtZSA9XG4gIHRyeSBWYXJzLmZpbmQgbmFtZSB0YWJsZS52YXJzXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgbGV0IGluZGV4ID0gbmV3X3Nsb3QgdGFibGUgaW5cbiAgICBpZiBuYW1lIDw+IFwiXCIgdGhlbiB0YWJsZS52YXJzIDwtIFZhcnMuYWRkIG5hbWUgaW5kZXggdGFibGUudmFycztcbiAgICBpbmRleFxuXG5sZXQgdG9fYXJyYXkgYXJyID1cbiAgaWYgYXJyID0gT2JqLm1hZ2ljIDAgdGhlbiBbfHxdIGVsc2UgYXJyXG5cbmxldCBuZXdfbWV0aG9kc192YXJpYWJsZXMgdGFibGUgbWV0aHMgdmFscyA9XG4gIGxldCBtZXRocyA9IHRvX2FycmF5IG1ldGhzIGluXG4gIGxldCBubWV0aHMgPSBBcnJheS5sZW5ndGggbWV0aHMgYW5kIG52YWxzID0gQXJyYXkubGVuZ3RoIHZhbHMgaW5cbiAgbGV0IHJlcyA9IEFycmF5Lm1ha2UgKG5tZXRocyArIG52YWxzKSAwIGluXG4gIGZvciBpID0gMCB0byBubWV0aHMgLSAxIGRvXG4gICAgcmVzLihpKSA8LSBnZXRfbWV0aG9kX2xhYmVsIHRhYmxlIG1ldGhzLihpKVxuICBkb25lO1xuICBmb3IgaSA9IDAgdG8gbnZhbHMgLSAxIGRvXG4gICAgcmVzLihpK25tZXRocykgPC0gbmV3X3ZhcmlhYmxlIHRhYmxlIHZhbHMuKGkpXG4gIGRvbmU7XG4gIHJlc1xuXG5sZXQgZ2V0X3ZhcmlhYmxlIHRhYmxlIG5hbWUgPVxuICB0cnkgVmFycy5maW5kIG5hbWUgdGFibGUudmFycyB3aXRoIE5vdF9mb3VuZCAtPiBhc3NlcnQgZmFsc2VcblxubGV0IGdldF92YXJpYWJsZXMgdGFibGUgbmFtZXMgPVxuICBBcnJheS5tYXAgKGdldF92YXJpYWJsZSB0YWJsZSkgbmFtZXNcblxubGV0IGFkZF9pbml0aWFsaXplciB0YWJsZSBmID1cbiAgdGFibGUuaW5pdGlhbGl6ZXJzIDwtIGY6OnRhYmxlLmluaXRpYWxpemVyc1xuXG4oKlxubW9kdWxlIEtleXMgPVxuICBNYXAuTWFrZShzdHJ1Y3QgdHlwZSB0ID0gdGFnIGFycmF5IGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG5sZXQga2V5X21hcCA9IHJlZiBLZXlzLmVtcHR5XG5sZXQgZ2V0X2tleSB0YWdzIDogaXRlbSA9XG4gIHRyeSBtYWdpYyAoS2V5cy5maW5kIHRhZ3MgIWtleV9tYXAgOiB0YWcgYXJyYXkpXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAga2V5X21hcCA6PSBLZXlzLmFkZCB0YWdzIHRhZ3MgIWtleV9tYXA7XG4gICAgbWFnaWMgdGFnc1xuKilcblxubGV0IGNyZWF0ZV90YWJsZSBwdWJsaWNfbWV0aG9kcyA9XG4gIGlmIHB1YmxpY19tZXRob2RzID09IG1hZ2ljIDAgdGhlbiBuZXdfdGFibGUgW3x8XSBlbHNlXG4gICgqIFtwdWJsaWNfbWV0aG9kc10gbXVzdCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgZm9yIGJ5dGVjb2RlICopXG4gIGxldCB0YWdzID0gQXJyYXkubWFwIHB1YmxpY19tZXRob2RfbGFiZWwgcHVibGljX21ldGhvZHMgaW5cbiAgbGV0IHRhYmxlID0gbmV3X3RhYmxlIHRhZ3MgaW5cbiAgQXJyYXkuaXRlcmlcbiAgICAoZnVuIGkgbWV0IC0+XG4gICAgICBsZXQgbGFiID0gaSoyKzIgaW5cbiAgICAgIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSAgPC0gTWV0aHMuYWRkIG1ldCBsYWIgdGFibGUubWV0aG9kc19ieV9uYW1lO1xuICAgICAgdGFibGUubWV0aG9kc19ieV9sYWJlbCA8LSBMYWJzLmFkZCBsYWIgdHJ1ZSB0YWJsZS5tZXRob2RzX2J5X2xhYmVsKVxuICAgIHB1YmxpY19tZXRob2RzO1xuICB0YWJsZVxuXG5sZXQgaW5pdF9jbGFzcyB0YWJsZSA9XG4gIGluc3RfdmFyX2NvdW50IDo9ICFpbnN0X3Zhcl9jb3VudCArIHRhYmxlLnNpemUgLSAxO1xuICB0YWJsZS5pbml0aWFsaXplcnMgPC0gTGlzdC5yZXYgdGFibGUuaW5pdGlhbGl6ZXJzO1xuICByZXNpemUgdGFibGUgKDMgKyBtYWdpYyB0YWJsZS5tZXRob2RzLigxKSAqIDE2IC8gU3lzLndvcmRfc2l6ZSlcblxubGV0IGluaGVyaXRzIGNsYSB2YWxzIHZpcnRfbWV0aHMgY29uY3JfbWV0aHMgKF8sIHN1cGVyLCBfLCBlbnYpIHRvcCA9XG4gIG5hcnJvdyBjbGEgdmFscyB2aXJ0X21ldGhzIGNvbmNyX21ldGhzO1xuICBsZXQgaW5pdCA9XG4gICAgaWYgdG9wIHRoZW4gc3VwZXIgY2xhIGVudiBlbHNlIE9iai5yZXByIChzdXBlciBjbGEpIGluXG4gIHdpZGVuIGNsYTtcbiAgQXJyYXkuY29uY2F0XG4gICAgW1t8IHJlcHIgaW5pdCB8XTtcbiAgICAgbWFnaWMgKEFycmF5Lm1hcCAoZ2V0X3ZhcmlhYmxlIGNsYSkgKHRvX2FycmF5IHZhbHMpIDogaW50IGFycmF5KTtcbiAgICAgQXJyYXkubWFwXG4gICAgICAgKGZ1biBubSAtPiByZXByIChnZXRfbWV0aG9kIGNsYSAoZ2V0X21ldGhvZF9sYWJlbCBjbGEgbm0pIDogY2xvc3VyZSkpXG4gICAgICAgKHRvX2FycmF5IGNvbmNyX21ldGhzKSBdXG5cbmxldCBtYWtlX2NsYXNzIHB1Yl9tZXRocyBjbGFzc19pbml0ID1cbiAgbGV0IHRhYmxlID0gY3JlYXRlX3RhYmxlIHB1Yl9tZXRocyBpblxuICBsZXQgZW52X2luaXQgPSBjbGFzc19pbml0IHRhYmxlIGluXG4gIGluaXRfY2xhc3MgdGFibGU7XG4gIChlbnZfaW5pdCAoT2JqLnJlcHIgMCksIGNsYXNzX2luaXQsIGVudl9pbml0LCBPYmoucmVwciAwKVxuXG50eXBlIGluaXRfdGFibGUgPSB7IG11dGFibGUgZW52X2luaXQ6IHQ7IG11dGFibGUgY2xhc3NfaW5pdDogdGFibGUgLT4gdCB9XG5bQEB3YXJuaW5nIFwiLXVudXNlZC1maWVsZFwiXVxuXG5sZXQgbWFrZV9jbGFzc19zdG9yZSBwdWJfbWV0aHMgY2xhc3NfaW5pdCBpbml0X3RhYmxlID1cbiAgbGV0IHRhYmxlID0gY3JlYXRlX3RhYmxlIHB1Yl9tZXRocyBpblxuICBsZXQgZW52X2luaXQgPSBjbGFzc19pbml0IHRhYmxlIGluXG4gIGluaXRfY2xhc3MgdGFibGU7XG4gIGluaXRfdGFibGUuY2xhc3NfaW5pdCA8LSBjbGFzc19pbml0O1xuICBpbml0X3RhYmxlLmVudl9pbml0IDwtIGVudl9pbml0XG5cbmxldCBkdW1teV9jbGFzcyBsb2MgPVxuICBsZXQgdW5kZWYgPSBmdW4gXyAtPiByYWlzZSAoVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgbG9jKSBpblxuICAoT2JqLm1hZ2ljIHVuZGVmLCB1bmRlZiwgdW5kZWYsIE9iai5yZXByIDApXG5cbigqKioqIE9iamVjdHMgKioqKilcblxubGV0IGNyZWF0ZV9vYmplY3QgdGFibGUgPVxuICAoKiBYWFggQXBwZWwgZGUgW29ial9ibG9ja10gfCBDYWxsIHRvIFtvYmpfYmxvY2tdICAqKVxuICBsZXQgb2JqID0gT2JqLm5ld19ibG9jayBPYmoub2JqZWN0X3RhZyB0YWJsZS5zaXplIGluXG4gICgqIFhYWCBBcHBlbCBkZSBbY2FtbF9tb2RpZnldIHwgQ2FsbCB0byBbY2FtbF9tb2RpZnldICopXG4gIE9iai5zZXRfZmllbGQgb2JqIDAgKE9iai5yZXByIHRhYmxlLm1ldGhvZHMpO1xuICBPYmoub2JqIChzZXRfaWQgb2JqKVxuXG5sZXQgY3JlYXRlX29iamVjdF9vcHQgb2JqXzAgdGFibGUgPVxuICBpZiAoT2JqLm1hZ2ljIG9ial8wIDogYm9vbCkgdGhlbiBvYmpfMCBlbHNlIGJlZ2luXG4gICAgKCogWFhYIEFwcGVsIGRlIFtvYmpfYmxvY2tdIHwgQ2FsbCB0byBbb2JqX2Jsb2NrXSAgKilcbiAgICBsZXQgb2JqID0gT2JqLm5ld19ibG9jayBPYmoub2JqZWN0X3RhZyB0YWJsZS5zaXplIGluXG4gICAgKCogWFhYIEFwcGVsIGRlIFtjYW1sX21vZGlmeV0gfCBDYWxsIHRvIFtjYW1sX21vZGlmeV0gKilcbiAgICBPYmouc2V0X2ZpZWxkIG9iaiAwIChPYmoucmVwciB0YWJsZS5tZXRob2RzKTtcbiAgICBPYmoub2JqIChzZXRfaWQgb2JqKVxuICBlbmRcblxubGV0IHJlYyBpdGVyX2Ygb2JqID1cbiAgZnVuY3Rpb25cbiAgICBbXSAgIC0+ICgpXG4gIHwgZjo6bCAtPiBmIG9iajsgaXRlcl9mIG9iaiBsXG5cbmxldCBydW5faW5pdGlhbGl6ZXJzIG9iaiB0YWJsZSA9XG4gIGxldCBpbml0cyA9IHRhYmxlLmluaXRpYWxpemVycyBpblxuICBpZiBpbml0cyA8PiBbXSB0aGVuXG4gICAgaXRlcl9mIG9iaiBpbml0c1xuXG5sZXQgcnVuX2luaXRpYWxpemVyc19vcHQgb2JqXzAgb2JqIHRhYmxlID1cbiAgaWYgKE9iai5tYWdpYyBvYmpfMCA6IGJvb2wpIHRoZW4gb2JqIGVsc2UgYmVnaW5cbiAgICBsZXQgaW5pdHMgPSB0YWJsZS5pbml0aWFsaXplcnMgaW5cbiAgICBpZiBpbml0cyA8PiBbXSB0aGVuIGl0ZXJfZiBvYmogaW5pdHM7XG4gICAgb2JqXG4gIGVuZFxuXG5sZXQgY3JlYXRlX29iamVjdF9hbmRfcnVuX2luaXRpYWxpemVycyBvYmpfMCB0YWJsZSA9XG4gIGlmIChPYmoubWFnaWMgb2JqXzAgOiBib29sKSB0aGVuIG9ial8wIGVsc2UgYmVnaW5cbiAgICBsZXQgb2JqID0gY3JlYXRlX29iamVjdCB0YWJsZSBpblxuICAgIHJ1bl9pbml0aWFsaXplcnMgb2JqIHRhYmxlO1xuICAgIG9ialxuICBlbmRcblxuKCogRXF1aXZhbGVudCBwcmltaXRpdmUgYmVsb3dcbmxldCBzZW5kc2VsZiBvYmogbGFiID1cbiAgKG1hZ2ljIG9iaiA6IChvYmogLT4gdCkgYXJyYXkgYXJyYXkpLigwKS4obGFiKSBvYmpcbiopXG5leHRlcm5hbCBzZW5kIDogb2JqIC0+IHRhZyAtPiAnYSA9IFwiJXNlbmRcIlxuZXh0ZXJuYWwgc2VuZGNhY2hlIDogb2JqIC0+IHRhZyAtPiB0IC0+IGludCAtPiAnYSA9IFwiJXNlbmRjYWNoZVwiXG5leHRlcm5hbCBzZW5kc2VsZiA6IG9iaiAtPiBsYWJlbCAtPiAnYSA9IFwiJXNlbmRzZWxmXCJcbmV4dGVybmFsIGdldF9wdWJsaWNfbWV0aG9kIDogb2JqIC0+IHRhZyAtPiBjbG9zdXJlXG4gICAgPSBcImNhbWxfZ2V0X3B1YmxpY19tZXRob2RcIiBbQEBub2FsbG9jXVxuXG4oKioqKiB0YWJsZSBjb2xsZWN0aW9uIGFjY2VzcyAqKioqKVxuXG50eXBlIHRhYmxlcyA9XG4gIHwgRW1wdHlcbiAgfCBDb25zIG9mIHtrZXkgOiBjbG9zdXJlOyBtdXRhYmxlIGRhdGE6IHRhYmxlczsgbXV0YWJsZSBuZXh0OiB0YWJsZXN9XG5cbmxldCBzZXRfZGF0YSB0YWJsZXMgdiA9IG1hdGNoIHRhYmxlcyB3aXRoXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLmRhdGEgPC0gdlxubGV0IHNldF9uZXh0IHRhYmxlcyB2ID0gbWF0Y2ggdGFibGVzIHdpdGhcbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMubmV4dCA8LSB2XG5sZXQgZ2V0X2tleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLmtleVxubGV0IGdldF9kYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMuZGF0YVxubGV0IGdldF9uZXh0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgfCBDb25zIHRhYmxlcyAtPiB0YWJsZXMubmV4dFxuXG5sZXQgYnVpbGRfcGF0aCBuIGtleXMgdGFibGVzID1cbiAgbGV0IHJlcyA9IENvbnMge2tleSA9IE9iai5tYWdpYyAwOyBkYXRhID0gRW1wdHk7IG5leHQgPSBFbXB0eX0gaW5cbiAgbGV0IHIgPSByZWYgcmVzIGluXG4gIGZvciBpID0gMCB0byBuIGRvXG4gICAgciA6PSBDb25zIHtrZXkgPSBrZXlzLihpKTsgZGF0YSA9ICFyOyBuZXh0ID0gRW1wdHl9XG4gIGRvbmU7XG4gIHNldF9kYXRhIHRhYmxlcyAhcjtcbiAgcmVzXG5cbmxldCByZWMgbG9va3VwX2tleXMgaSBrZXlzIHRhYmxlcyA9XG4gIGlmIGkgPCAwIHRoZW4gdGFibGVzIGVsc2VcbiAgbGV0IGtleSA9IGtleXMuKGkpIGluXG4gIGxldCByZWMgbG9va3VwX2tleSAodGFibGVzOnRhYmxlcykgPVxuICAgIGlmIGdldF9rZXkgdGFibGVzID09IGtleSB0aGVuXG4gICAgICBtYXRjaCBnZXRfZGF0YSB0YWJsZXMgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgQ29ucyBfIGFzIHRhYmxlc19kYXRhIC0+XG4gICAgICAgICAgbG9va3VwX2tleXMgKGktMSkga2V5cyB0YWJsZXNfZGF0YVxuICAgIGVsc2VcbiAgICAgIG1hdGNoIGdldF9uZXh0IHRhYmxlcyB3aXRoXG4gICAgICB8IENvbnMgXyBhcyBuZXh0IC0+IGxvb2t1cF9rZXkgbmV4dFxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIGxldCBuZXh0IDogdGFibGVzID0gQ29ucyB7a2V5OyBkYXRhID0gRW1wdHk7IG5leHQgPSBFbXB0eX0gaW5cbiAgICAgICAgICBzZXRfbmV4dCB0YWJsZXMgbmV4dDtcbiAgICAgICAgICBidWlsZF9wYXRoIChpLTEpIGtleXMgbmV4dFxuICBpblxuICBsb29rdXBfa2V5IHRhYmxlc1xuXG5sZXQgbG9va3VwX3RhYmxlcyByb290IGtleXMgPVxuICBtYXRjaCBnZXRfZGF0YSByb290IHdpdGhcbiAgfCBDb25zIF8gYXMgcm9vdF9kYXRhIC0+XG4gICAgbG9va3VwX2tleXMgKEFycmF5Lmxlbmd0aCBrZXlzIC0gMSkga2V5cyByb290X2RhdGFcbiAgfCBFbXB0eSAtPlxuICAgIGJ1aWxkX3BhdGggKEFycmF5Lmxlbmd0aCBrZXlzIC0gMSkga2V5cyByb290XG5cbigqKioqIGJ1aWx0aW4gbWV0aG9kcyAqKioqKVxuXG5sZXQgZ2V0X2NvbnN0IHggPSByZXQgKGZ1biBfb2JqIC0+IHgpXG5sZXQgZ2V0X3ZhciBuICAgPSByZXQgKGZ1biBvYmogLT4gQXJyYXkudW5zYWZlX2dldCBvYmogbilcbmxldCBnZXRfZW52IGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pXG5sZXQgZ2V0X21ldGggbiAgPSByZXQgKGZ1biBvYmogLT4gc2VuZHNlbGYgb2JqIG4pXG5sZXQgc2V0X3ZhciBuICAgPSByZXQgKGZ1biBvYmogeCAtPiBBcnJheS51bnNhZmVfc2V0IG9iaiBuIHgpXG5sZXQgYXBwX2NvbnN0IGYgeCA9IHJldCAoZnVuIF9vYmogLT4gZiB4KVxubGV0IGFwcF92YXIgZiBuICAgPSByZXQgKGZ1biBvYmogLT4gZiAoQXJyYXkudW5zYWZlX2dldCBvYmogbikpXG5sZXQgYXBwX2VudiBmIGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIGYgKEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pKVxubGV0IGFwcF9tZXRoIGYgbiAgPSByZXQgKGZ1biBvYmogLT4gZiAoc2VuZHNlbGYgb2JqIG4pKVxubGV0IGFwcF9jb25zdF9jb25zdCBmIHggeSA9IHJldCAoZnVuIF9vYmogLT4gZiB4IHkpXG5sZXQgYXBwX2NvbnN0X3ZhciBmIHggbiAgID0gcmV0IChmdW4gb2JqIC0+IGYgeCAoQXJyYXkudW5zYWZlX2dldCBvYmogbikpXG5sZXQgYXBwX2NvbnN0X21ldGggZiB4IG4gPSByZXQgKGZ1biBvYmogLT4gZiB4IChzZW5kc2VsZiBvYmogbikpXG5sZXQgYXBwX3Zhcl9jb25zdCBmIG4geCA9IHJldCAoZnVuIG9iaiAtPiBmIChBcnJheS51bnNhZmVfZ2V0IG9iaiBuKSB4KVxubGV0IGFwcF9tZXRoX2NvbnN0IGYgbiB4ID0gcmV0IChmdW4gb2JqIC0+IGYgKHNlbmRzZWxmIG9iaiBuKSB4KVxubGV0IGFwcF9jb25zdF9lbnYgZiB4IGUgbiA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIGYgeCAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikpXG5sZXQgYXBwX2Vudl9jb25zdCBmIGUgbiB4ID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgZiAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikgeClcbmxldCBtZXRoX2FwcF9jb25zdCBuIHggPSByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKSB4KVxubGV0IG1ldGhfYXBwX3ZhciBuIG0gPVxuICByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKSAoQXJyYXkudW5zYWZlX2dldCBvYmogbSkpXG5sZXQgbWV0aF9hcHBfZW52IG4gZSBtID1cbiAgcmV0IChmdW4gb2JqIC0+IChzZW5kc2VsZiBvYmogbiA6IF8gLT4gXylcbiAgICAgIChBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBtKSlcbmxldCBtZXRoX2FwcF9tZXRoIG4gbSA9XG4gIHJldCAoZnVuIG9iaiAtPiAoc2VuZHNlbGYgb2JqIG4gOiBfIC0+IF8pIChzZW5kc2VsZiBvYmogbSkpXG5sZXQgc2VuZF9jb25zdCBtIHggYyA9XG4gIHJldCAoZnVuIG9iaiAtPiBzZW5kY2FjaGUgeCBtIChBcnJheS51bnNhZmVfZ2V0IG9iaiAwKSBjKVxubGV0IHNlbmRfdmFyIG0gbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlIChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pIDogb2JqKSBtXG4gICAgICAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBzZW5kX2VudiBtIGUgbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlXG4gICAgICAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0XG4gICAgICAgICAgICAgICAgICAgIChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKSA6IG9iailcbiAgICAgIG0gKEFycmF5LnVuc2FmZV9nZXQgb2JqIDApIGMpXG5sZXQgc2VuZF9tZXRoIG0gbiBjID1cbiAgcmV0IChmdW4gb2JqIC0+XG4gICAgc2VuZGNhY2hlIChzZW5kc2VsZiBvYmogbikgbSAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBuZXdfY2FjaGUgdGFibGUgPVxuICBsZXQgbiA9IG5ld19tZXRob2QgdGFibGUgaW5cbiAgbGV0IG4gPVxuICAgIGlmIG4gbW9kIDIgPSAwIHx8IG4gPiAyICsgbWFnaWMgdGFibGUubWV0aG9kcy4oMSkgKiAxNiAvIFN5cy53b3JkX3NpemVcbiAgICB0aGVuIG4gZWxzZSBuZXdfbWV0aG9kIHRhYmxlXG4gIGluXG4gIHRhYmxlLm1ldGhvZHMuKG4pIDwtIE9iai5tYWdpYyAwO1xuICBuXG5cbnR5cGUgaW1wbCA9XG4gICAgR2V0Q29uc3RcbiAgfCBHZXRWYXJcbiAgfCBHZXRFbnZcbiAgfCBHZXRNZXRoXG4gIHwgU2V0VmFyXG4gIHwgQXBwQ29uc3RcbiAgfCBBcHBWYXJcbiAgfCBBcHBFbnZcbiAgfCBBcHBNZXRoXG4gIHwgQXBwQ29uc3RDb25zdFxuICB8IEFwcENvbnN0VmFyXG4gIHwgQXBwQ29uc3RFbnZcbiAgfCBBcHBDb25zdE1ldGhcbiAgfCBBcHBWYXJDb25zdFxuICB8IEFwcEVudkNvbnN0XG4gIHwgQXBwTWV0aENvbnN0XG4gIHwgTWV0aEFwcENvbnN0XG4gIHwgTWV0aEFwcFZhclxuICB8IE1ldGhBcHBFbnZcbiAgfCBNZXRoQXBwTWV0aFxuICB8IFNlbmRDb25zdFxuICB8IFNlbmRWYXJcbiAgfCBTZW5kRW52XG4gIHwgU2VuZE1ldGhcbiAgfCBDbG9zdXJlIG9mIGNsb3N1cmVcblxubGV0IG1ldGhvZF9pbXBsIHRhYmxlIGkgYXJyID1cbiAgbGV0IG5leHQgKCkgPSBpbmNyIGk7IG1hZ2ljIGFyci4oIWkpIGluXG4gIG1hdGNoIG5leHQoKSB3aXRoXG4gICAgR2V0Q29uc3QgLT4gbGV0IHggOiB0ID0gbmV4dCgpIGluIGdldF9jb25zdCB4XG4gIHwgR2V0VmFyICAgLT4gbGV0IG4gPSBuZXh0KCkgaW4gZ2V0X3ZhciBuXG4gIHwgR2V0RW52ICAgLT4gbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW4gZ2V0X2VudiBlIG5cbiAgfCBHZXRNZXRoICAtPiBsZXQgbiA9IG5leHQoKSBpbiBnZXRfbWV0aCBuXG4gIHwgU2V0VmFyICAgLT4gbGV0IG4gPSBuZXh0KCkgaW4gc2V0X3ZhciBuXG4gIHwgQXBwQ29uc3QgLT4gbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gYXBwX2NvbnN0IGYgeFxuICB8IEFwcFZhciAgIC0+IGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBhcHBfdmFyIGYgblxuICB8IEFwcEVudiAgIC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiAgbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9lbnYgZiBlIG5cbiAgfCBBcHBNZXRoICAtPiBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQgKCkgaW4gYXBwX21ldGggZiBuXG4gIHwgQXBwQ29uc3RDb25zdCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IHkgPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9jb25zdCBmIHggeVxuICB8IEFwcENvbnN0VmFyIC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgYXBwX2NvbnN0X3ZhciBmIHggblxuICB8IEFwcENvbnN0RW52IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQgKCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9lbnYgZiB4IGUgblxuICB8IEFwcENvbnN0TWV0aCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF9tZXRoIGYgeCBuXG4gIHwgQXBwVmFyQ29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluXG4gICAgICBhcHBfdmFyX2NvbnN0IGYgbiB4XG4gIHwgQXBwRW52Q29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCBlID0gbmV4dCAoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpblxuICAgICAgYXBwX2Vudl9jb25zdCBmIGUgbiB4XG4gIHwgQXBwTWV0aENvbnN0IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpblxuICAgICAgYXBwX21ldGhfY29uc3QgZiBuIHhcbiAgfCBNZXRoQXBwQ29uc3QgLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIG1ldGhfYXBwX2NvbnN0IG4geFxuICB8IE1ldGhBcHBWYXIgLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCBtID0gbmV4dCgpIGluIG1ldGhfYXBwX3ZhciBuIG1cbiAgfCBNZXRoQXBwRW52IC0+XG4gICAgICBsZXQgbiA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbSA9IG5leHQoKSBpblxuICAgICAgbWV0aF9hcHBfZW52IG4gZSBtXG4gIHwgTWV0aEFwcE1ldGggLT5cbiAgICAgIGxldCBuID0gbmV4dCgpIGluIGxldCBtID0gbmV4dCgpIGluIG1ldGhfYXBwX21ldGggbiBtXG4gIHwgU2VuZENvbnN0IC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBzZW5kX2NvbnN0IG0geCAobmV3X2NhY2hlIHRhYmxlKVxuICB8IFNlbmRWYXIgLT5cbiAgICAgIGxldCBtID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBzZW5kX3ZhciBtIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBTZW5kRW52IC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpblxuICAgICAgc2VuZF9lbnYgbSBlIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBTZW5kTWV0aCAtPlxuICAgICAgbGV0IG0gPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0ICgpIGluIHNlbmRfbWV0aCBtIG4gKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBDbG9zdXJlIF8gYXMgY2xvIC0+IG1hZ2ljIGNsb1xuXG5sZXQgc2V0X21ldGhvZHMgdGFibGUgbWV0aG9kcyA9XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggbWV0aG9kcyBpbiBsZXQgaSA9IHJlZiAwIGluXG4gIHdoaWxlICFpIDwgbGVuIGRvXG4gICAgbGV0IGxhYmVsID0gbWV0aG9kcy4oIWkpIGluIGxldCBjbG8gPSBtZXRob2RfaW1wbCB0YWJsZSBpIG1ldGhvZHMgaW5cbiAgICBzZXRfbWV0aG9kIHRhYmxlIGxhYmVsIGNsbztcbiAgICBpbmNyIGlcbiAgZG9uZVxuXG4oKioqKiBTdGF0aXN0aWNzICoqKiopXG5cbnR5cGUgc3RhdHMgPVxuICB7IGNsYXNzZXM6IGludDsgbWV0aG9kczogaW50OyBpbnN0X3ZhcnM6IGludDsgfVxuXG5sZXQgc3RhdHMgKCkgPVxuICB7IGNsYXNzZXMgPSAhdGFibGVfY291bnQ7XG4gICAgbWV0aG9kcyA9ICFtZXRob2RfY291bnQ7IGluc3RfdmFycyA9ICFpbnN0X3Zhcl9jb3VudDsgfVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwNCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHNoYXBlID1cbiAgfCBGdW5jdGlvblxuICB8IExhenlcbiAgfCBDbGFzc1xuICB8IE1vZHVsZSBvZiBzaGFwZSBhcnJheVxuICB8IFZhbHVlIG9mIE9iai50XG5cbmxldCByZWMgaW5pdF9tb2RfZmllbGQgbW9kdSBpIGxvYyBzaGFwZSA9XG4gIGxldCBpbml0ID1cbiAgICBtYXRjaCBzaGFwZSB3aXRoXG4gICAgfCBGdW5jdGlvbiAtPlxuICAgICAgIGxldCByZWMgZm4gKHggOiAnYSkgPVxuICAgICAgICAgbGV0IGZuJyA6ICdhIC0+ICdiID0gT2JqLm9iaiAoT2JqLmZpZWxkIG1vZHUgaSkgaW5cbiAgICAgICAgIGlmIGZuID09IGZuJyB0aGVuXG4gICAgICAgICAgIHJhaXNlIChVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSBsb2MpXG4gICAgICAgICBlbHNlXG4gICAgICAgICAgIGZuJyB4IGluXG4gICAgICAgT2JqLnJlcHIgZm5cbiAgICB8IExhenkgLT5cbiAgICAgICBsZXQgcmVjIGwgPVxuICAgICAgICAgbGF6eSAoXG4gICAgICAgICAgIGxldCBsJyA9IE9iai5vYmogKE9iai5maWVsZCBtb2R1IGkpIGluXG4gICAgICAgICAgIGlmIGwgPT0gbCcgdGhlblxuICAgICAgICAgICAgIHJhaXNlIChVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZSBsb2MpXG4gICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICBMYXp5LmZvcmNlIGwnKSBpblxuICAgICAgIE9iai5yZXByIGxcbiAgICB8IENsYXNzIC0+XG4gICAgICAgT2JqLnJlcHIgKENhbWxpbnRlcm5hbE9PLmR1bW15X2NsYXNzIGxvYylcbiAgICB8IE1vZHVsZSBjb21wcyAtPlxuICAgICAgIE9iai5yZXByIChpbml0X21vZF9ibG9jayBsb2MgY29tcHMpXG4gICAgfCBWYWx1ZSB2IC0+IHZcbiAgaW5cbiAgT2JqLnNldF9maWVsZCBtb2R1IGkgaW5pdFxuXG5hbmQgaW5pdF9tb2RfYmxvY2sgbG9jIGNvbXBzID1cbiAgbGV0IGxlbmd0aCA9IEFycmF5Lmxlbmd0aCBjb21wcyBpblxuICBsZXQgbW9kdSA9IE9iai5uZXdfYmxvY2sgMCBsZW5ndGggaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCAtIDEgZG9cbiAgICBpbml0X21vZF9maWVsZCBtb2R1IGkgbG9jIGNvbXBzLihpKVxuICBkb25lO1xuICBtb2R1XG5cbmxldCBpbml0X21vZCBsb2Mgc2hhcGUgPVxuICBtYXRjaCBzaGFwZSB3aXRoXG4gIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgIE9iai5yZXByIChpbml0X21vZF9ibG9jayBsb2MgY29tcHMpXG4gIHwgXyAtPiBmYWlsd2l0aCBcIkNhbWxpbnRlcm5hbE1vZC5pbml0X21vZDogbm90IGEgbW9kdWxlXCJcblxubGV0IHJlYyB1cGRhdGVfbW9kX2ZpZWxkIG1vZHUgaSBzaGFwZSBuID1cbiAgbWF0Y2ggc2hhcGUgd2l0aFxuICB8IEZ1bmN0aW9uIHwgTGF6eSAtPlxuICAgICBPYmouc2V0X2ZpZWxkIG1vZHUgaSBuXG4gIHwgVmFsdWUgXyAtPlxuICAgICAoKSAoKiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGVyZSAqKVxuICB8IENsYXNzIC0+XG4gICAgIGFzc2VydCAoT2JqLnRhZyBuID0gMCAmJiBPYmouc2l6ZSBuID0gNCk7XG4gICAgIGxldCBjbCA9IE9iai5maWVsZCBtb2R1IGkgaW5cbiAgICAgZm9yIGogPSAwIHRvIDMgZG9cbiAgICAgICBPYmouc2V0X2ZpZWxkIGNsIGogKE9iai5maWVsZCBuIGopXG4gICAgIGRvbmVcbiAgfCBNb2R1bGUgY29tcHMgLT5cbiAgICAgdXBkYXRlX21vZF9ibG9jayBjb21wcyAoT2JqLmZpZWxkIG1vZHUgaSkgblxuXG5hbmQgdXBkYXRlX21vZF9ibG9jayBjb21wcyBvIG4gPVxuICBhc3NlcnQgKE9iai50YWcgbiA9IDAgJiYgT2JqLnNpemUgbiA+PSBBcnJheS5sZW5ndGggY29tcHMpO1xuICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGNvbXBzIC0gMSBkb1xuICAgIHVwZGF0ZV9tb2RfZmllbGQgbyBpIGNvbXBzLihpKSAoT2JqLmZpZWxkIG4gaSlcbiAgZG9uZVxuXG5sZXQgdXBkYXRlX21vZCBzaGFwZSBvIG4gPVxuICBtYXRjaCBzaGFwZSB3aXRoXG4gIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgIHVwZGF0ZV9tb2RfYmxvY2sgY29tcHMgbyBuXG4gIHwgXyAtPiBmYWlsd2l0aCBcIkNhbWxpbnRlcm5hbE1vZC51cGRhdGVfbW9kOiBub3QgYSBtb2R1bGVcIlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NyBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgdHlwZSBTZWVkZWRTID0gc2lnXG5cbiAgdHlwZSBrZXlcbiAgdHlwZSAhJ2EgdFxuICB2YWwgY3JlYXRlIDogP3JhbmRvbSAoKnRod2FydCB0b29scy9zeW5jX3N0ZGxpYl9kb2NzKikgOiBib29sIC0+IGludCAtPiAnYSB0XG4gIHZhbCBjbGVhciA6ICdhIHQgLT4gdW5pdFxuICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgdmFsIGFkZCA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICB2YWwgZmluZF9vcHQgOiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gIHZhbCBzdGF0cyA6ICdhIHQgLT4gSGFzaHRibC5zdGF0aXN0aWNzXG4gIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgdmFsIHJlcGxhY2Vfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICB2YWwgY2xlYW46ICdhIHQgLT4gdW5pdFxuICB2YWwgc3RhdHNfYWxpdmU6ICdhIHQgLT4gSGFzaHRibC5zdGF0aXN0aWNzXG4gICAgKCoqIHNhbWUgYXMgeyFzdGF0c30gYnV0IG9ubHkgY291bnQgdGhlIGFsaXZlIGJpbmRpbmdzICopXG5lbmRcblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuXG4gIHR5cGUga2V5XG4gIHR5cGUgISdhIHRcbiAgdmFsIGNyZWF0ZSA6IGludCAtPiAnYSB0XG4gIHZhbCBjbGVhciA6ICdhIHQgLT4gdW5pdFxuICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgdmFsIGNvcHkgOiAnYSB0IC0+ICdhIHRcbiAgdmFsIGFkZCA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGtleSAtPiAnYVxuICB2YWwgZmluZF9vcHQgOiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgdmFsIGZpbmRfYWxsIDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICB2YWwgcmVwbGFjZSA6ICdhIHQgLT4ga2V5IC0+ICdhIC0+IHVuaXRcbiAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gIHZhbCBzdGF0cyA6ICdhIHQgLT4gSGFzaHRibC5zdGF0aXN0aWNzXG4gIHZhbCBhZGRfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgdmFsIHJlcGxhY2Vfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICB2YWwgY2xlYW46ICdhIHQgLT4gdW5pdFxuICB2YWwgc3RhdHNfYWxpdmU6ICdhIHQgLT4gSGFzaHRibC5zdGF0aXN0aWNzXG4gICAgKCoqIHNhbWUgYXMgeyFzdGF0c30gYnV0IG9ubHkgY291bnQgdGhlIGFsaXZlIGJpbmRpbmdzICopXG5lbmRcblxubW9kdWxlIEdlbkhhc2hUYWJsZSA9IHN0cnVjdFxuXG4gIHR5cGUgZXF1YWwgPVxuICB8IEVUcnVlIHwgRUZhbHNlXG4gIHwgRURlYWQgKCoqIHRoZSBnYXJiYWdlIGNvbGxlY3RvciByZWNsYWltZWQgdGhlIGRhdGEgKilcblxuICBtb2R1bGUgTWFrZVNlZWRlZChIOiBzaWdcbiAgICB0eXBlIHRcbiAgICB0eXBlICdhIGNvbnRhaW5lclxuICAgIHZhbCBjcmVhdGU6IHQgLT4gJ2EgLT4gJ2EgY29udGFpbmVyXG4gICAgdmFsIHNlZWRlZF9oYXNoOiBpbnQgLT4gdCAtPiBpbnRcbiAgICB2YWwgZXF1YWw6ICdhIGNvbnRhaW5lciAtPiB0IC0+IGVxdWFsXG4gICAgdmFsIGdldF9kYXRhOiAnYSBjb250YWluZXIgLT4gJ2Egb3B0aW9uXG4gICAgdmFsIHNldF9rZXlfZGF0YTogJ2EgY29udGFpbmVyIC0+IHQgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBjaGVja19rZXk6ICdhIGNvbnRhaW5lciAtPiBib29sXG4gIGVuZCkgOiBTZWVkZWRTIHdpdGggdHlwZSBrZXkgPSBILnRcbiAgPSBzdHJ1Y3RcblxuICAgIHR5cGUgJ2EgdCA9XG4gICAgICB7IG11dGFibGUgc2l6ZTogaW50OyAgICAgICAgICAgICAgICAgICgqIG51bWJlciBvZiBlbnRyaWVzICopXG4gICAgICAgIG11dGFibGUgZGF0YTogJ2EgYnVja2V0bGlzdCBhcnJheTsgICgqIHRoZSBidWNrZXRzICopXG4gICAgICAgIHNlZWQ6IGludDsgICAgICAgICAgICAgICAgICAgICAgICAgICgqIGZvciByYW5kb21pemF0aW9uICopXG4gICAgICAgIGluaXRpYWxfc2l6ZTogaW50OyAgICAgICAgICAgICAgICAgICgqIGluaXRpYWwgYXJyYXkgc2l6ZSAqKVxuICAgICAgfVxuXG4gICAgYW5kICdhIGJ1Y2tldGxpc3QgPVxuICAgIHwgRW1wdHlcbiAgICB8IENvbnMgb2YgaW50ICgqIGhhc2ggb2YgdGhlIGtleSAqKSAqICdhIEguY29udGFpbmVyICogJ2EgYnVja2V0bGlzdFxuXG4gICAgKCoqIHRoZSBoYXNoIG9mIHRoZSBrZXkgaXMga2VwdCBpbiBvcmRlciB0byB0ZXN0IHRoZSBlcXVhbGl0eSBvZiB0aGUgaGFzaFxuICAgICAgYmVmb3JlIHRoZSBrZXkuIFNhbWUgcmVhc29uIGFzIGZvciBXZWFrLk1ha2UgKilcblxuICAgIHR5cGUga2V5ID0gSC50XG5cbiAgICBsZXQgcmVjIHBvd2VyXzJfYWJvdmUgeCBuID1cbiAgICAgIGlmIHggPj0gbiB0aGVuIHhcbiAgICAgIGVsc2UgaWYgeCAqIDIgPiBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIHhcbiAgICAgIGVsc2UgcG93ZXJfMl9hYm92ZSAoeCAqIDIpIG5cblxuICAgIGxldCBwcm5nID0gbGF6eSAoUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0KCkpXG5cbiAgICBsZXQgY3JlYXRlID8ocmFuZG9tID0gKEhhc2h0YmwuaXNfcmFuZG9taXplZCAoKSkpIGluaXRpYWxfc2l6ZSA9XG4gICAgICBsZXQgcyA9IHBvd2VyXzJfYWJvdmUgMTYgaW5pdGlhbF9zaXplIGluXG4gICAgICBsZXQgc2VlZCA9IGlmIHJhbmRvbSB0aGVuIFJhbmRvbS5TdGF0ZS5iaXRzIChMYXp5LmZvcmNlIHBybmcpIGVsc2UgMCBpblxuICAgICAgeyBpbml0aWFsX3NpemUgPSBzOyBzaXplID0gMDsgc2VlZCA9IHNlZWQ7IGRhdGEgPSBBcnJheS5tYWtlIHMgRW1wdHkgfVxuXG4gICAgbGV0IGNsZWFyIGggPVxuICAgICAgaC5zaXplIDwtIDA7XG4gICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIGguZGF0YSBpblxuICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgaC5kYXRhLihpKSA8LSBFbXB0eVxuICAgICAgZG9uZVxuXG4gICAgbGV0IHJlc2V0IGggPVxuICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgICAgIGlmIGxlbiA9IGguaW5pdGlhbF9zaXplIHRoZW5cbiAgICAgICAgY2xlYXIgaFxuICAgICAgZWxzZSBiZWdpblxuICAgICAgICBoLnNpemUgPC0gMDtcbiAgICAgICAgaC5kYXRhIDwtIEFycmF5Lm1ha2UgaC5pbml0aWFsX3NpemUgRW1wdHlcbiAgICAgIGVuZFxuXG4gICAgbGV0IGNvcHkgaCA9IHsgaCB3aXRoIGRhdGEgPSBBcnJheS5jb3B5IGguZGF0YSB9XG5cbiAgICBsZXQga2V5X2luZGV4IGggaGtleSA9XG4gICAgICBoa2V5IGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuXG4gICAgbGV0IGNsZWFuIGggPVxuICAgICAgbGV0IHJlYyBkb19idWNrZXQgPSBmdW5jdGlvblxuICAgICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgICBFbXB0eVxuICAgICAgICB8IENvbnMoXywgYywgcmVzdCkgd2hlbiBub3QgKEguY2hlY2tfa2V5IGMpIC0+XG4gICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgIGRvX2J1Y2tldCByZXN0XG4gICAgICAgIHwgQ29ucyhoa2V5LCBjLCByZXN0KSAtPlxuICAgICAgICAgICAgQ29ucyhoa2V5LCBjLCBkb19idWNrZXQgcmVzdClcbiAgICAgIGluXG4gICAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBkIC0gMSBkb1xuICAgICAgICBkLihpKSA8LSBkb19idWNrZXQgZC4oaSlcbiAgICAgIGRvbmVcblxuICAgICgqKiByZXNpemUgaXMgdGhlIG9ubHkgZnVuY3Rpb24gdG8gZG8gdGhlIGFjdHVhbCBjbGVhbmluZyBvZiBkZWFkIGtleXNcbiAgICAgICAgKHJlbW92ZSBkb2VzIGl0IGp1c3QgYmVjYXVzZSBpdCBjb3VsZCkuXG5cbiAgICAgICAgVGhlIGdvYWwgaXMgdG86XG5cbiAgICAgICAgLSBub3QgcmVzaXplIGluZmluaXRlbHkgd2hlbiB0aGUgYWN0dWFsIG51bWJlciBvZiBhbGl2ZSBrZXlzIGlzXG4gICAgICAgIGJvdW5kZWQgYnV0IGtleXMgYXJlIGNvbnRpbnVvdXNseSBhZGRlZC4gVGhhdCB3b3VsZCBoYXBwZW4gaWZcbiAgICAgICAgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmVzaXplLlxuICAgICAgICAtIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgZWFjaCBhZGRpdGlvbiwgdGhhdCB3b3VsZCBoYXBwZW4gaWYgdGhpc1xuICAgICAgICBmdW5jdGlvbiBkb24ndCByZXNpemUgZXZlbiB3aGVuIG9ubHkgb25lIGtleSBpcyBkZWFkLlxuXG4gICAgICAgIFNvIHRoZSBhbGdvcml0aG06XG4gICAgICAgIC0gY2xlYW4gdGhlIGtleXMgYmVmb3JlIHJlc2l6aW5nXG4gICAgICAgIC0gaWYgdGhlIG51bWJlciBvZiByZW1haW5pbmcga2V5cyBpcyBsZXNzIHRoYW4gaGFsZiB0aGUgc2l6ZSBvZiB0aGVcbiAgICAgICAgYXJyYXksIGRvbid0IHJlc2l6ZS5cbiAgICAgICAgLSBpZiBpdCBpcyBtb3JlLCByZXNpemUuXG5cbiAgICAgICAgVGhlIHNlY29uZCBwcm9ibGVtIHJlbWFpbnMgaWYgdGhlIHRhYmxlIHJlYWNoZXMgeyFTeXMubWF4X2FycmF5X2xlbmd0aH0uXG5cbiAgICAqKVxuICAgIGxldCByZXNpemUgaCA9XG4gICAgICBsZXQgb2RhdGEgPSBoLmRhdGEgaW5cbiAgICAgIGxldCBvc2l6ZSA9IEFycmF5Lmxlbmd0aCBvZGF0YSBpblxuICAgICAgbGV0IG5zaXplID0gb3NpemUgKiAyIGluXG4gICAgICBjbGVhbiBoO1xuICAgICAgaWYgbnNpemUgPCBTeXMubWF4X2FycmF5X2xlbmd0aCAmJiBoLnNpemUgPj0gb3NpemUgbHNyIDEgdGhlbiBiZWdpblxuICAgICAgICBsZXQgbmRhdGEgPSBBcnJheS5tYWtlIG5zaXplIEVtcHR5IGluXG4gICAgICAgIGguZGF0YSA8LSBuZGF0YTsgICAgICAgKCogc28gdGhhdCBrZXlfaW5kZXggc2VlcyB0aGUgbmV3IGJ1Y2tldCBjb3VudCAqKVxuICAgICAgICBsZXQgcmVjIGluc2VydF9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgICAgICAgRW1wdHkgLT4gKClcbiAgICAgICAgICB8IENvbnMoaGtleSwgZGF0YSwgcmVzdCkgLT5cbiAgICAgICAgICAgICAgaW5zZXJ0X2J1Y2tldCByZXN0OyAoKiBwcmVzZXJ2ZSBvcmlnaW5hbCBvcmRlciBvZiBlbGVtZW50cyAqKVxuICAgICAgICAgICAgICBsZXQgbmlkeCA9IGtleV9pbmRleCBoIGhrZXkgaW5cbiAgICAgICAgICAgICAgbmRhdGEuKG5pZHgpIDwtIENvbnMoaGtleSwgZGF0YSwgbmRhdGEuKG5pZHgpKSBpblxuICAgICAgICBmb3IgaSA9IDAgdG8gb3NpemUgLSAxIGRvXG4gICAgICAgICAgaW5zZXJ0X2J1Y2tldCBvZGF0YS4oaSlcbiAgICAgICAgZG9uZVxuICAgICAgZW5kXG5cbiAgICBsZXQgYWRkIGgga2V5IGluZm8gPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGggaGtleSBpblxuICAgICAgbGV0IGNvbnRhaW5lciA9IEguY3JlYXRlIGtleSBpbmZvIGluXG4gICAgICBsZXQgYnVja2V0ID0gQ29ucyhoa2V5LCBjb250YWluZXIsIGguZGF0YS4oaSkpIGluXG4gICAgICBoLmRhdGEuKGkpIDwtIGJ1Y2tldDtcbiAgICAgIGguc2l6ZSA8LSBoLnNpemUgKyAxO1xuICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBoXG5cbiAgICBsZXQgcmVtb3ZlIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgcmVjIHJlbW92ZV9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgICAgIHwgQ29ucyhoaywgYywgbmV4dCkgd2hlbiBoa2V5ID0gaGsgLT5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgICAgfCBFVHJ1ZSAtPiBoLnNpemUgPC0gaC5zaXplIC0gMTsgbmV4dFxuICAgICAgICAgICAgfCBFRmFsc2UgLT4gQ29ucyhoaywgYywgcmVtb3ZlX2J1Y2tldCBuZXh0KVxuICAgICAgICAgICAgfCBFRGVhZCAtPlxuICAgICAgICAgICAgICAgICgqIFRoZSBkZWFkIGtleSBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuIEl0IGlzIGFjY2VwdGFibGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZnVuY3Rpb24gc2luY2UgaXQgYWxyZWFkeSByZW1vdmVzIGEgYmluZGluZyAqKVxuICAgICAgICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgICAgICAgIHJlbW92ZV9idWNrZXQgbmV4dFxuICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgQ29ucyhoayxjLG5leHQpIC0+IENvbnMoaGssIGMsIHJlbW92ZV9idWNrZXQgbmV4dCkgaW5cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGggaGtleSBpblxuICAgICAgaC5kYXRhLihpKSA8LSByZW1vdmVfYnVja2V0IGguZGF0YS4oaSlcblxuICAgICgqKiB7IWZpbmR9IGRvbid0IHJlbW92ZSBkZWFkIGtleXMgYmVjYXVzZSBpdCB3b3VsZCBiZSBzdXJwcmlzaW5nIGZvclxuICAgICAgICB0aGUgdXNlciB0aGF0IGEgcmVhZC1vbmx5IGZ1bmN0aW9uIG11dGF0ZXMgdGhlIHN0YXRlIChlZy4gY29uY3VycmVudFxuICAgICAgICBhY2Nlc3MpLiBTYW1lIGZvciB7IW1lbX0uXG4gICAgKilcbiAgICBsZXQgcmVjIGZpbmRfcmVjIGtleSBoa2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgd2hlbiBoa2V5ID0gaGsgIC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPlxuICAgICAgICAgICAgICBiZWdpbiBtYXRjaCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICgqIFRoaXMgY2FzZSBpcyBub3QgaW1wb3NzaWJsZSBiZWNhdXNlIHRoZSBnYyBjYW4gcnVuIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgICAgICBILmVxdWFsIGFuZCBILmdldF9kYXRhICopXG4gICAgICAgICAgICAgICAgICBmaW5kX3JlYyBrZXkgaGtleSByZXN0XG4gICAgICAgICAgICAgIHwgU29tZSBkIC0+IGRcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgfCBFRmFsc2UgLT4gZmluZF9yZWMga2V5IGhrZXkgcmVzdFxuICAgICAgICAgIHwgRURlYWQgLT5cbiAgICAgICAgICAgICAgZmluZF9yZWMga2V5IGhrZXkgcmVzdFxuICAgICAgICAgIGVuZFxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+XG4gICAgICAgICAgZmluZF9yZWMga2V5IGhrZXkgcmVzdFxuXG4gICAgbGV0IGZpbmQgaCBrZXkgPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgICgqIFRPRE8gaW5saW5lIDMgaXRlcmF0aW9ucyAqKVxuICAgICAgZmluZF9yZWMga2V5IGhrZXkgKGguZGF0YS4oa2V5X2luZGV4IGggaGtleSkpXG5cbiAgICBsZXQgcmVjIGZpbmRfcmVjX29wdCBrZXkgaGtleSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrZXkgPSBoayAgLT5cbiAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICB8IEVUcnVlIC0+XG4gICAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZ2V0X2RhdGEgYyB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgKCogVGhpcyBjYXNlIGlzIG5vdCBpbXBvc3NpYmxlIGJlY2F1c2UgdGhlIGdjIGNhbiBydW4gYmV0d2VlblxuICAgICAgICAgICAgICAgICAgICAgIEguZXF1YWwgYW5kIEguZ2V0X2RhdGEgKilcbiAgICAgICAgICAgICAgICAgIGZpbmRfcmVjX29wdCBrZXkgaGtleSByZXN0XG4gICAgICAgICAgICAgIHwgU29tZSBfIGFzIGQgLT4gZFxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICB8IEVGYWxzZSAtPiBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuICAgICAgICAgIHwgRURlYWQgLT5cbiAgICAgICAgICAgICAgZmluZF9yZWNfb3B0IGtleSBoa2V5IHJlc3RcbiAgICAgICAgICBlbmRcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPlxuICAgICAgICAgIGZpbmRfcmVjX29wdCBrZXkgaGtleSByZXN0XG5cbiAgICBsZXQgZmluZF9vcHQgaCBrZXkgPVxuICAgICAgbGV0IGhrZXkgPSBILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkgaW5cbiAgICAgICgqIFRPRE8gaW5saW5lIDMgaXRlcmF0aW9ucyAqKVxuICAgICAgZmluZF9yZWNfb3B0IGtleSBoa2V5IChoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpKVxuXG4gICAgbGV0IGZpbmRfYWxsIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgcmVjIGZpbmRfaW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gW11cbiAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgd2hlbiBoa2V5ID0gaGsgIC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPiBiZWdpbiBtYXRjaCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgIGZpbmRfaW5fYnVja2V0IHJlc3RcbiAgICAgICAgICAgICAgfCBTb21lIGQgLT4gZDo6ZmluZF9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgICAgZW5kXG4gICAgICAgICAgfCBFRmFsc2UgLT4gZmluZF9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgIHwgRURlYWQgLT5cbiAgICAgICAgICAgICAgZmluZF9pbl9idWNrZXQgcmVzdFxuICAgICAgICAgIGVuZFxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+XG4gICAgICAgICAgZmluZF9pbl9idWNrZXQgcmVzdCBpblxuICAgICAgZmluZF9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBoa2V5KVxuXG5cbiAgICBsZXQgcmVwbGFjZSBoIGtleSBpbmZvID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgcmVjIHJlcGxhY2VfYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgICAgfCBDb25zKGhrLCBjLCBuZXh0KSB3aGVuIGhrZXkgPSBoayAtPlxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgICB8IEVUcnVlIC0+IEguc2V0X2tleV9kYXRhIGMga2V5IGluZm9cbiAgICAgICAgICAgIHwgRUZhbHNlIHwgRURlYWQgLT4gcmVwbGFjZV9idWNrZXQgbmV4dFxuICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgQ29ucyhfLF8sbmV4dCkgLT4gcmVwbGFjZV9idWNrZXQgbmV4dFxuICAgICAgaW5cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGggaGtleSBpblxuICAgICAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gICAgICB0cnlcbiAgICAgICAgcmVwbGFjZV9idWNrZXQgbFxuICAgICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IEguY3JlYXRlIGtleSBpbmZvIGluXG4gICAgICAgIGguZGF0YS4oaSkgPC0gQ29ucyhoa2V5LCBjb250YWluZXIsIGwpO1xuICAgICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBoXG5cbiAgICBsZXQgbWVtIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMoaGssIGMsIHJlc3QpIHdoZW4gaGsgPSBoa2V5IC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPiB0cnVlXG4gICAgICAgICAgfCBFRmFsc2UgfCBFRGVhZCAtPiBtZW1faW5fYnVja2V0IHJlc3RcbiAgICAgICAgICBlbmRcbiAgICAgIHwgQ29ucyhfaGssIF9jLCByZXN0KSAtPiBtZW1faW5fYnVja2V0IHJlc3QgaW5cbiAgICAgIG1lbV9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBoa2V5KVxuXG4gICAgbGV0IGxlbmd0aCBoID0gaC5zaXplXG5cbiAgICBsZXQgcmVjIGJ1Y2tldF9sZW5ndGggYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPiBidWNrZXRfbGVuZ3RoIChhY2N1ICsgMSkgcmVzdFxuXG4gICAgbGV0IHN0YXRzIGggPVxuICAgICAgbGV0IG1ibCA9XG4gICAgICAgIEFycmF5LmZvbGRfbGVmdCAoZnVuIG0gYiAtPiBJbnQubWF4IG0gKGJ1Y2tldF9sZW5ndGggMCBiKSkgMCBoLmRhdGEgaW5cbiAgICAgIGxldCBoaXN0byA9IEFycmF5Lm1ha2UgKG1ibCArIDEpIDAgaW5cbiAgICAgIEFycmF5Lml0ZXJcbiAgICAgICAgKGZ1biBiIC0+XG4gICAgICAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aCAwIGIgaW5cbiAgICAgICAgICAgaGlzdG8uKGwpIDwtIGhpc3RvLihsKSArIDEpXG4gICAgICAgIGguZGF0YTtcbiAgICAgIHsgSGFzaHRibC5udW1fYmluZGluZ3MgPSBoLnNpemU7XG4gICAgICAgIG51bV9idWNrZXRzID0gQXJyYXkubGVuZ3RoIGguZGF0YTtcbiAgICAgICAgbWF4X2J1Y2tldF9sZW5ndGggPSBtYmw7XG4gICAgICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbiAgICBsZXQgcmVjIGJ1Y2tldF9sZW5ndGhfYWxpdmUgYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgQ29ucyhfLCBjLCByZXN0KSB3aGVuIEguY2hlY2tfa2V5IGMgLT5cbiAgICAgICAgICBidWNrZXRfbGVuZ3RoX2FsaXZlIChhY2N1ICsgMSkgcmVzdFxuICAgICAgfCBDb25zKF8sIF8sIHJlc3QpIC0+IGJ1Y2tldF9sZW5ndGhfYWxpdmUgYWNjdSByZXN0XG5cbiAgICBsZXQgc3RhdHNfYWxpdmUgaCA9XG4gICAgICBsZXQgc2l6ZSA9IHJlZiAwIGluXG4gICAgICBsZXQgbWJsID1cbiAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgKGZ1biBtIGIgLT4gSW50Lm1heCBtIChidWNrZXRfbGVuZ3RoX2FsaXZlIDAgYikpIDAgaC5kYXRhXG4gICAgICBpblxuICAgICAgbGV0IGhpc3RvID0gQXJyYXkubWFrZSAobWJsICsgMSkgMCBpblxuICAgICAgQXJyYXkuaXRlclxuICAgICAgICAoZnVuIGIgLT5cbiAgICAgICAgICAgbGV0IGwgPSBidWNrZXRfbGVuZ3RoX2FsaXZlIDAgYiBpblxuICAgICAgICAgICBzaXplIDo9ICFzaXplICsgbDtcbiAgICAgICAgICAgaGlzdG8uKGwpIDwtIGhpc3RvLihsKSArIDEpXG4gICAgICAgIGguZGF0YTtcbiAgICAgIHsgSGFzaHRibC5udW1fYmluZGluZ3MgPSAhc2l6ZTtcbiAgICAgICAgbnVtX2J1Y2tldHMgPSBBcnJheS5sZW5ndGggaC5kYXRhO1xuICAgICAgICBtYXhfYnVja2V0X2xlbmd0aCA9IG1ibDtcbiAgICAgICAgYnVja2V0X2hpc3RvZ3JhbSA9IGhpc3RvIH1cblxuICAgIGxldCBhZGRfc2VxIHRibCBpID1cbiAgICAgIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxuICAgIGxldCByZXBsYWNlX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IHJlcGxhY2UgdGJsIGsgdikgaVxuXG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG5cbiAgZW5kXG5lbmRcblxubW9kdWxlIE9iakVwaCA9IE9iai5FcGhlbWVyb25cblxubGV0IF9vYmpfb3B0IDogT2JqLnQgb3B0aW9uIC0+ICdhIG9wdGlvbiA9IGZ1biB4IC0+XG4gIG1hdGNoIHggd2l0aFxuICB8IE5vbmUgLT4geFxuICB8IFNvbWUgdiAtPiBTb21lIChPYmoub2JqIHYpXG5cbigqKiBUaGUgcHJldmlvdXMgZnVuY3Rpb24gaXMgdHlwZWQgc28gdGhpcyBvbmUgaXMgYWxzbyBjb3JyZWN0ICopXG5sZXQgb2JqX29wdCA6IE9iai50IG9wdGlvbiAtPiAnYSBvcHRpb24gPSBmdW4geCAtPiBPYmoubWFnaWMgeFxuXG5cbm1vZHVsZSBLMSA9IHN0cnVjdFxuICB0eXBlICgnaywnZCkgdCA9IE9iakVwaC50XG5cbiAgbGV0IGNyZWF0ZSAoKSA6ICgnaywnZCkgdCA9IE9iakVwaC5jcmVhdGUgMVxuXG4gIGxldCBnZXRfa2V5ICh0OignaywnZCkgdCkgOiAnayBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IDApXG4gIGxldCBzZXRfa2V5ICh0OignaywnZCkgdCkgKGs6J2spIDogdW5pdCA9IE9iakVwaC5zZXRfa2V5IHQgMCAoT2JqLnJlcHIgaylcbiAgbGV0IGNoZWNrX2tleSAodDooJ2ssJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCAwXG5cbiAgbGV0IGdldF9kYXRhICh0OignaywnZCkgdCkgOiAnZCBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2RhdGEgdClcbiAgbGV0IHNldF9kYXRhICh0OignaywnZCkgdCkgKGQ6J2QpIDogdW5pdCA9IE9iakVwaC5zZXRfZGF0YSB0IChPYmoucmVwciBkKVxuICBsZXQgdW5zZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogdW5pdCA9IE9iakVwaC51bnNldF9kYXRhIHRcblxuICBsZXQgbWFrZSBrZXkgZGF0YSA9XG4gICAgbGV0IGVwaCA9IGNyZWF0ZSAoKSBpblxuICAgIHNldF9kYXRhIGVwaCBkYXRhO1xuICAgIHNldF9rZXkgZXBoIGtleTtcbiAgICBlcGhcblxuICBsZXQgcXVlcnkgZXBoIGtleSA9XG4gICAgbWF0Y2ggZ2V0X2tleSBlcGggd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGsgd2hlbiBrID09IGtleSAtPiBnZXRfZGF0YSBlcGhcbiAgICB8IFNvbWUgXyAtPiBOb25lXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWQgKEg6SGFzaHRibC5TZWVkZWRIYXNoZWRUeXBlKSA9XG4gICAgR2VuSGFzaFRhYmxlLk1ha2VTZWVkZWQoc3RydWN0XG4gICAgICB0eXBlICdhIGNvbnRhaW5lciA9IChILnQsJ2EpIHRcbiAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgbGV0IGNyZWF0ZSBrIGQgPVxuICAgICAgICBsZXQgYyA9IGNyZWF0ZSAoKSBpblxuICAgICAgICBzZXRfZGF0YSBjIGQ7XG4gICAgICAgIHNldF9rZXkgYyBrO1xuICAgICAgICBjXG4gICAgICBsZXQgc2VlZGVkX2hhc2ggPSBILnNlZWRlZF9oYXNoXG4gICAgICBsZXQgZXF1YWwgYyBrID1cbiAgICAgICAgKCogeyFnZXRfa2V5X2NvcHl9IGlzIG5vdCB1c2VkIGJlY2F1c2UgdGhlIGVxdWFsaXR5IG9mIHRoZSB1c2VyIGNhbiBiZVxuICAgICAgICAgICAgdGhlIHBoeXNpY2FsIGVxdWFsaXR5ICopXG4gICAgICAgIG1hdGNoIGdldF9rZXkgYyB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBHZW5IYXNoVGFibGUuRURlYWRcbiAgICAgICAgfCBTb21lIGsnIC0+XG4gICAgICAgICAgICBpZiBILmVxdWFsIGsgaycgdGhlbiBHZW5IYXNoVGFibGUuRVRydWUgZWxzZSBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICBsZXQgZ2V0X2RhdGEgPSBnZXRfZGF0YVxuICAgICAgbGV0IHNldF9rZXlfZGF0YSBjIGsgZCA9XG4gICAgICAgIHVuc2V0X2RhdGEgYztcbiAgICAgICAgc2V0X2tleSBjIGs7XG4gICAgICAgIHNldF9kYXRhIGMgZFxuICAgICAgbGV0IGNoZWNrX2tleSA9IGNoZWNrX2tleVxuICAgIGVuZClcblxuICBtb2R1bGUgTWFrZShIOiBIYXNodGJsLkhhc2hlZFR5cGUpOiAoUyB3aXRoIHR5cGUga2V5ID0gSC50KSA9XG4gIHN0cnVjdFxuICAgIGluY2x1ZGUgTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgICAgdHlwZSB0ID0gSC50XG4gICAgICAgIGxldCBlcXVhbCA9IEguZXF1YWxcbiAgICAgICAgbGV0IHNlZWRlZF9oYXNoIChfc2VlZDogaW50KSB4ID0gSC5oYXNoIHhcbiAgICAgIGVuZClcbiAgICBsZXQgY3JlYXRlIHN6ID0gY3JlYXRlIH5yYW5kb206ZmFsc2Ugc3pcbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcbiAgZW5kXG5cbiAgbW9kdWxlIEJ1Y2tldCA9IHN0cnVjdFxuXG4gICAgdHlwZSBub25yZWMgKCdrLCAnZCkgdCA9ICgnaywgJ2QpIHQgbGlzdCByZWZcbiAgICBsZXQgazFfbWFrZSA9IG1ha2VcbiAgICBsZXQgbWFrZSAoKSA9IHJlZiBbXVxuICAgIGxldCBhZGQgYiBrIGQgPSBiIDo9IGsxX21ha2UgayBkIDo6ICFiXG5cbiAgICBsZXQgdGVzdF9rZXkgayBlID1cbiAgICAgIG1hdGNoIGdldF9rZXkgZSB3aXRoXG4gICAgICB8IFNvbWUgeCB3aGVuIHggPT0gayAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcblxuICAgIGxldCByZW1vdmUgYiBrID1cbiAgICAgIGxldCByZWMgbG9vcCBsIGFjYyA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IFtdIC0+ICgpXG4gICAgICAgIHwgaCA6OiB0IHdoZW4gdGVzdF9rZXkgayBoIC0+IGIgOj0gTGlzdC5yZXZfYXBwZW5kIGFjYyB0XG4gICAgICAgIHwgaCA6OiB0IC0+IGxvb3AgdCAoaCA6OiBhY2MpXG4gICAgICBpblxuICAgICAgbG9vcCAhYiBbXVxuXG4gICAgbGV0IGZpbmQgYiBrID1cbiAgICAgIG1hdGNoIExpc3QuZmluZF9vcHQgKHRlc3Rfa2V5IGspICFiIHdpdGhcbiAgICAgIHwgU29tZSBlIC0+IGdldF9kYXRhIGVcbiAgICAgIHwgTm9uZSAtPiBOb25lXG5cbiAgICBsZXQgbGVuZ3RoIGIgPSBMaXN0Lmxlbmd0aCAhYlxuICAgIGxldCBjbGVhciBiID0gYiA6PSBbXVxuXG4gIGVuZFxuXG5lbmRcblxubW9kdWxlIEsyID0gc3RydWN0XG4gIHR5cGUgKCdrMSwgJ2syLCAnZCkgdCA9IE9iakVwaC50XG5cbiAgbGV0IGNyZWF0ZSAoKSA6ICgnazEsJ2syLCdkKSB0ID0gT2JqRXBoLmNyZWF0ZSAyXG5cbiAgbGV0IGdldF9rZXkxICh0OignazEsJ2syLCdkKSB0KSA6ICdrMSBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IDApXG4gIGxldCBzZXRfa2V5MSAodDooJ2sxLCdrMiwnZCkgdCkgKGs6J2sxKSA6IHVuaXQgPVxuICAgIE9iakVwaC5zZXRfa2V5IHQgMCAoT2JqLnJlcHIgaylcbiAgbGV0IGNoZWNrX2tleTEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCAwXG5cbiAgbGV0IGdldF9rZXkyICh0OignazEsJ2syLCdkKSB0KSA6ICdrMiBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IDEpXG4gIGxldCBzZXRfa2V5MiAodDooJ2sxLCdrMiwnZCkgdCkgKGs6J2syKSA6IHVuaXQgPVxuICAgIE9iakVwaC5zZXRfa2V5IHQgMSAoT2JqLnJlcHIgaylcbiAgbGV0IGNoZWNrX2tleTIgKHQ6KCdrMSwnazIsJ2QpIHQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCAxXG5cbiAgbGV0IGdldF9kYXRhICh0OignazEsJ2syLCdkKSB0KSA6ICdkIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfZGF0YSB0KVxuICBsZXQgc2V0X2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIChkOidkKSA6IHVuaXQgPVxuICAgIE9iakVwaC5zZXRfZGF0YSB0IChPYmoucmVwciBkKVxuICBsZXQgdW5zZXRfZGF0YSAodDooJ2sxLCdrMiwnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2RhdGEgdFxuXG4gIGxldCBtYWtlIGtleTEga2V5MiBkYXRhID1cbiAgICBsZXQgZXBoID0gY3JlYXRlICgpIGluXG4gICAgc2V0X2RhdGEgZXBoIGRhdGE7XG4gICAgc2V0X2tleTEgZXBoIGtleTE7XG4gICAgc2V0X2tleTIgZXBoIGtleTI7XG4gICAgaWdub3JlIChTeXMub3BhcXVlX2lkZW50aXR5IGtleTEpO1xuICAgIGVwaFxuXG4gIGxldCBxdWVyeSBlcGgga2V5MSBrZXkyID1cbiAgICBtYXRjaCBnZXRfa2V5MSBlcGggd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGsgd2hlbiBrID09IGtleTEgLT5cbiAgICAgICAgYmVnaW4gbWF0Y2ggZ2V0X2tleTIgZXBoIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgfCBTb21lIGsgd2hlbiBrID09IGtleTIgLT4gZ2V0X2RhdGEgZXBoXG4gICAgICAgIHwgU29tZSBfIC0+IE5vbmVcbiAgICAgICAgZW5kXG4gICAgfCBTb21lIF8gLT4gTm9uZVxuXG4gIG1vZHVsZSBNYWtlU2VlZGVkXG4gICAgICAoSDE6SGFzaHRibC5TZWVkZWRIYXNoZWRUeXBlKVxuICAgICAgKEgyOkhhc2h0YmwuU2VlZGVkSGFzaGVkVHlwZSkgPVxuICAgIEdlbkhhc2hUYWJsZS5NYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgdHlwZSAnYSBjb250YWluZXIgPSAoSDEudCxIMi50LCdhKSB0XG4gICAgICB0eXBlIHQgPSBIMS50ICogSDIudFxuICAgICAgbGV0IGNyZWF0ZSAoazEsazIpIGQgPVxuICAgICAgICBsZXQgYyA9IGNyZWF0ZSAoKSBpblxuICAgICAgICBzZXRfZGF0YSBjIGQ7XG4gICAgICAgIHNldF9rZXkxIGMgazE7IHNldF9rZXkyIGMgazI7XG4gICAgICAgIGNcbiAgICAgIGxldCBzZWVkZWRfaGFzaCBzZWVkIChrMSxrMikgPVxuICAgICAgICBIMS5zZWVkZWRfaGFzaCBzZWVkIGsxICsgSDIuc2VlZGVkX2hhc2ggc2VlZCBrMiAqIDY1NTk5XG4gICAgICBsZXQgZXF1YWwgYyAoazEsazIpID1cbiAgICAgICAgbWF0Y2ggZ2V0X2tleTEgYywgZ2V0X2tleTIgYyB3aXRoXG4gICAgICAgIHwgTm9uZSwgXyB8IF8gLCBOb25lIC0+IEdlbkhhc2hUYWJsZS5FRGVhZFxuICAgICAgICB8IFNvbWUgazEnLCBTb21lIGsyJyAtPlxuICAgICAgICAgICAgaWYgSDEuZXF1YWwgazEgazEnICYmIEgyLmVxdWFsIGsyIGsyJ1xuICAgICAgICAgICAgdGhlbiBHZW5IYXNoVGFibGUuRVRydWUgZWxzZSBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICBsZXQgZ2V0X2RhdGEgPSBnZXRfZGF0YVxuICAgICAgbGV0IHNldF9rZXlfZGF0YSBjIChrMSxrMikgZCA9XG4gICAgICAgIHVuc2V0X2RhdGEgYztcbiAgICAgICAgc2V0X2tleTEgYyBrMTsgc2V0X2tleTIgYyBrMjtcbiAgICAgICAgc2V0X2RhdGEgYyBkXG4gICAgICBsZXQgY2hlY2tfa2V5IGMgPSBjaGVja19rZXkxIGMgJiYgY2hlY2tfa2V5MiBjXG4gICAgZW5kKVxuXG4gIG1vZHVsZSBNYWtlKEgxOiBIYXNodGJsLkhhc2hlZFR5cGUpKEgyOiBIYXNodGJsLkhhc2hlZFR5cGUpOlxuICAgIChTIHdpdGggdHlwZSBrZXkgPSBIMS50ICogSDIudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWRcbiAgICAgICAgKHN0cnVjdFxuICAgICAgICAgIHR5cGUgdCA9IEgxLnRcbiAgICAgICAgICBsZXQgZXF1YWwgPSBIMS5lcXVhbFxuICAgICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEgxLmhhc2ggeFxuICAgICAgICBlbmQpXG4gICAgICAgIChzdHJ1Y3RcbiAgICAgICAgICB0eXBlIHQgPSBIMi50XG4gICAgICAgICAgbGV0IGVxdWFsID0gSDIuZXF1YWxcbiAgICAgICAgICBsZXQgc2VlZGVkX2hhc2ggKF9zZWVkOiBpbnQpIHggPSBIMi5oYXNoIHhcbiAgICAgICAgZW5kKVxuICAgIGxldCBjcmVhdGUgc3ogPSBjcmVhdGUgfnJhbmRvbTpmYWxzZSBzelxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuICBlbmRcblxuICBtb2R1bGUgQnVja2V0ID0gc3RydWN0XG5cbiAgICB0eXBlIG5vbnJlYyAoJ2sxLCAnazIsICdkKSB0ID0gKCdrMSwgJ2syLCAnZCkgdCBsaXN0IHJlZlxuICAgIGxldCBrMl9tYWtlID0gbWFrZVxuICAgIGxldCBtYWtlICgpID0gcmVmIFtdXG4gICAgbGV0IGFkZCBiIGsxIGsyIGQgPSBiIDo9IGsyX21ha2UgazEgazIgZCA6OiAhYlxuXG4gICAgbGV0IHRlc3Rfa2V5cyBrMSBrMiBlID1cbiAgICAgIG1hdGNoIGdldF9rZXkxIGUsIGdldF9rZXkyIGUgd2l0aFxuICAgICAgfCBTb21lIHgxLCBTb21lIHgyIHdoZW4geDEgPT0gazEgJiYgeDIgPT0gazIgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVtb3ZlIGIgazEgazIgPVxuICAgICAgbGV0IHJlYyBsb29wIGwgYWNjID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgW10gLT4gKClcbiAgICAgICAgfCBoIDo6IHQgd2hlbiB0ZXN0X2tleXMgazEgazIgaCAtPiBiIDo9IExpc3QucmV2X2FwcGVuZCBhY2MgdFxuICAgICAgICB8IGggOjogdCAtPiBsb29wIHQgKGggOjogYWNjKVxuICAgICAgaW5cbiAgICAgIGxvb3AgIWIgW11cblxuICAgIGxldCBmaW5kIGIgazEgazIgPVxuICAgICAgbWF0Y2ggTGlzdC5maW5kX29wdCAodGVzdF9rZXlzIGsxIGsyKSAhYiB3aXRoXG4gICAgICB8IFNvbWUgZSAtPiBnZXRfZGF0YSBlXG4gICAgICB8IE5vbmUgLT4gTm9uZVxuXG4gICAgbGV0IGxlbmd0aCBiID0gTGlzdC5sZW5ndGggIWJcbiAgICBsZXQgY2xlYXIgYiA9IGIgOj0gW11cblxuICBlbmRcblxuZW5kXG5cbm1vZHVsZSBLbiA9IHN0cnVjdFxuICB0eXBlICgnaywnZCkgdCA9IE9iakVwaC50XG5cbiAgbGV0IGNyZWF0ZSBuIDogKCdrLCdkKSB0ID0gT2JqRXBoLmNyZWF0ZSBuXG4gIGxldCBsZW5ndGggKGs6KCdrLCdkKSB0KSA6IGludCA9IE9iakVwaC5sZW5ndGgga1xuXG4gIGxldCBnZXRfa2V5ICh0OignaywnZCkgdCkgKG46aW50KSA6ICdrIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfa2V5IHQgbilcbiAgbGV0IHNldF9rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIChrOidrKSA6IHVuaXQgPVxuICAgIE9iakVwaC5zZXRfa2V5IHQgbiAoT2JqLnJlcHIgaylcbiAgbGV0IGNoZWNrX2tleSAodDooJ2ssJ2QpIHQpIChuOmludCkgOiBib29sID0gT2JqRXBoLmNoZWNrX2tleSB0IG5cblxuICBsZXQgZ2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSA6ICdkIG9wdGlvbiA9IG9ial9vcHQgKE9iakVwaC5nZXRfZGF0YSB0KVxuICBsZXQgc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSAoZDonZCkgOiB1bml0ID0gT2JqRXBoLnNldF9kYXRhIHQgKE9iai5yZXByIGQpXG4gIGxldCB1bnNldF9kYXRhICh0OignaywnZCkgdCkgOiB1bml0ID0gT2JqRXBoLnVuc2V0X2RhdGEgdFxuXG4gIGxldCBtYWtlIGtleXMgZGF0YSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGgga2V5cyBpblxuICAgIGxldCBlcGggPSBjcmVhdGUgbCBpblxuICAgIHNldF9kYXRhIGVwaCBkYXRhO1xuICAgIGZvciBpID0gMCB0byBsIC0gMSBkbyBzZXRfa2V5IGVwaCBpIGtleXMuKGkpIGRvbmU7XG4gICAgZXBoXG5cbiAgbGV0IHF1ZXJ5IGVwaCBrZXlzID1cbiAgICBsZXQgbCA9IGxlbmd0aCBlcGggaW5cbiAgICB0cnlcbiAgICAgIGlmIGwgPD4gQXJyYXkubGVuZ3RoIGtleXMgdGhlbiByYWlzZSBFeGl0O1xuICAgICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICAgIG1hdGNoIGdldF9rZXkgZXBoIGkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gcmFpc2UgRXhpdFxuICAgICAgICB8IFNvbWUgayB3aGVuIGsgPT0ga2V5cy4oaSkgLT4gKClcbiAgICAgICAgfCBTb21lIF8gLT4gcmFpc2UgRXhpdFxuICAgICAgZG9uZTtcbiAgICAgIGdldF9kYXRhIGVwaFxuICAgIHdpdGggRXhpdCAtPiBOb25lXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWQgKEg6SGFzaHRibC5TZWVkZWRIYXNoZWRUeXBlKSA9XG4gICAgR2VuSGFzaFRhYmxlLk1ha2VTZWVkZWQoc3RydWN0XG4gICAgICB0eXBlICdhIGNvbnRhaW5lciA9IChILnQsJ2EpIHRcbiAgICAgIHR5cGUgdCA9IEgudCBhcnJheVxuICAgICAgbGV0IGNyZWF0ZSBrIGQgPVxuICAgICAgICBsZXQgYyA9IGNyZWF0ZSAoQXJyYXkubGVuZ3RoIGspIGluXG4gICAgICAgIHNldF9kYXRhIGMgZDtcbiAgICAgICAgZm9yIGk9MCB0byBBcnJheS5sZW5ndGggayAtMSBkb1xuICAgICAgICAgIHNldF9rZXkgYyBpIGsuKGkpO1xuICAgICAgICBkb25lO1xuICAgICAgICBjXG4gICAgICBsZXQgc2VlZGVkX2hhc2ggc2VlZCBrID1cbiAgICAgICAgbGV0IGggPSByZWYgMCBpblxuICAgICAgICBmb3IgaT0wIHRvIEFycmF5Lmxlbmd0aCBrIC0xIGRvXG4gICAgICAgICAgaCA6PSBILnNlZWRlZF9oYXNoIHNlZWQgay4oaSkgKiA2NTU5OSArICFoO1xuICAgICAgICBkb25lO1xuICAgICAgICAhaFxuICAgICAgbGV0IGVxdWFsIGMgayA9XG4gICAgICAgIGxldCBsZW4gID0gQXJyYXkubGVuZ3RoIGsgaW5cbiAgICAgICAgbGV0IGxlbicgPSBsZW5ndGggYyBpblxuICAgICAgICBpZiBsZW4gIT0gbGVuJyB0aGVuIEdlbkhhc2hUYWJsZS5FRmFsc2VcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxldCByZWMgZXF1YWxfYXJyYXkgayBjIGkgPVxuICAgICAgICAgICAgaWYgaSA8IDAgdGhlbiBHZW5IYXNoVGFibGUuRVRydWVcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgbWF0Y2ggZ2V0X2tleSBjIGkgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT4gR2VuSGFzaFRhYmxlLkVEZWFkXG4gICAgICAgICAgICAgIHwgU29tZSBraSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrLihpKSBraVxuICAgICAgICAgICAgICAgICAgdGhlbiBlcXVhbF9hcnJheSBrIGMgKGktMSlcbiAgICAgICAgICAgICAgICAgIGVsc2UgR2VuSGFzaFRhYmxlLkVGYWxzZVxuICAgICAgICAgIGluXG4gICAgICAgICAgZXF1YWxfYXJyYXkgayBjIChsZW4tMSlcbiAgICAgIGxldCBnZXRfZGF0YSA9IGdldF9kYXRhXG4gICAgICBsZXQgc2V0X2tleV9kYXRhIGMgayBkID1cbiAgICAgICAgdW5zZXRfZGF0YSBjO1xuICAgICAgICBmb3IgaT0wIHRvIEFycmF5Lmxlbmd0aCBrIC0xIGRvXG4gICAgICAgICAgc2V0X2tleSBjIGkgay4oaSk7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHNldF9kYXRhIGMgZFxuICAgICAgbGV0IGNoZWNrX2tleSBjID1cbiAgICAgICAgbGV0IHJlYyBjaGVjayBjIGkgPVxuICAgICAgICAgIGkgPCAwIHx8IChjaGVja19rZXkgYyBpICYmIGNoZWNrIGMgKGktMSkpIGluXG4gICAgICAgIGNoZWNrIGMgKGxlbmd0aCBjIC0gMSlcbiAgICBlbmQpXG5cbiAgbW9kdWxlIE1ha2UoSDogSGFzaHRibC5IYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCBhcnJheSkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4gIG1vZHVsZSBCdWNrZXQgPSBzdHJ1Y3RcblxuICAgIHR5cGUgbm9ucmVjICgnaywgJ2QpIHQgPSAoJ2ssICdkKSB0IGxpc3QgcmVmXG4gICAgbGV0IGtuX21ha2UgPSBtYWtlXG4gICAgbGV0IG1ha2UgKCkgPSByZWYgW11cbiAgICBsZXQgYWRkIGIgayBkID0gYiA6PSBrbl9tYWtlIGsgZCA6OiAhYlxuXG4gICAgbGV0IHRlc3Rfa2V5cyBrIGUgPVxuICAgICAgdHJ5XG4gICAgICAgIGlmIGxlbmd0aCBlIDw+IEFycmF5Lmxlbmd0aCBrIHRoZW4gcmFpc2UgRXhpdDtcbiAgICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBrIC0gMSBkb1xuICAgICAgICAgIG1hdGNoIGdldF9rZXkgZSBpIHdpdGhcbiAgICAgICAgICB8IFNvbWUgeCB3aGVuIHggPT0gay4oaSkgLT4gKClcbiAgICAgICAgICB8IF8gLT4gcmFpc2UgRXhpdFxuICAgICAgICBkb25lO1xuICAgICAgICB0cnVlXG4gICAgICB3aXRoIEV4aXQgLT4gZmFsc2VcblxuICAgIGxldCByZW1vdmUgYiBrID1cbiAgICAgIGxldCByZWMgbG9vcCBsIGFjYyA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IFtdIC0+ICgpXG4gICAgICAgIHwgaCA6OiB0IHdoZW4gdGVzdF9rZXlzIGsgaCAtPiBiIDo9IExpc3QucmV2X2FwcGVuZCBhY2MgdFxuICAgICAgICB8IGggOjogdCAtPiBsb29wIHQgKGggOjogYWNjKVxuICAgICAgaW5cbiAgICAgIGxvb3AgIWIgW11cblxuICAgIGxldCBmaW5kIGIgayA9XG4gICAgICBtYXRjaCBMaXN0LmZpbmRfb3B0ICh0ZXN0X2tleXMgaykgIWIgd2l0aFxuICAgICAgfCBTb21lIGUgLT4gZ2V0X2RhdGEgZVxuICAgICAgfCBOb25lIC0+IE5vbmVcblxuICAgIGxldCBsZW5ndGggYiA9IExpc3QubGVuZ3RoICFiXG4gICAgbGV0IGNsZWFyIGIgPSBiIDo9IFtdXG5cbiAgZW5kXG5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgIFhhdmllciBMZXJveSBhbmQgRGFtaWVuIERvbGlnZXosIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5sZXQgZ2VuZXJpY19xdW90ZSBxdW90ZXF1b3RlIHMgPVxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKGwgKyAyMCkgaW5cbiAgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcJyc7XG4gIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgIGlmIHMuW2ldID0gJ1xcJydcbiAgICB0aGVuIEJ1ZmZlci5hZGRfc3RyaW5nIGIgcXVvdGVxdW90ZVxuICAgIGVsc2UgQnVmZmVyLmFkZF9jaGFyIGIgIHMuW2ldXG4gIGRvbmU7XG4gIEJ1ZmZlci5hZGRfY2hhciBiICdcXCcnO1xuICBCdWZmZXIuY29udGVudHMgYlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIE9wZW4gR3JvdXAgc3BlY2lmaWNhdGlvbiBmb3VuZCBoZXJlOlxuICBbWzFdXSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvYmFzZW5hbWUuaHRtbFxuICBJbiBzdGVwIDEgb2YgW1sxXV0sIHdlIGNob29zZSB0byByZXR1cm4gXCIuXCIgZm9yIGVtcHR5IGlucHV0LlxuICAgIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIE9DYW1sKVxuICBJbiBzdGVwIDIsIHdlIGNob29zZSB0byBwcm9jZXNzIFwiLy9cIiBub3JtYWxseS5cbiAgU3RlcCA2IGlzIG5vdCBpbXBsZW1lbnRlZDogd2UgY29uc2lkZXIgdGhhdCB0aGUgW3N1ZmZpeF0gb3BlcmFuZCBpc1xuICAgIGFsd2F5cyBhYnNlbnQuICBTdWZmaXhlcyBhcmUgaGFuZGxlZCBieSBbY2hvcF9zdWZmaXhdIGFuZCBbY2hvcF9leHRlbnNpb25dLlxuKilcbmxldCBnZW5lcmljX2Jhc2VuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZSBuYW1lID1cbiAgbGV0IHJlYyBmaW5kX2VuZCBuID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIDFcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gZmluZF9lbmQgKG4gLSAxKVxuICAgIGVsc2UgZmluZF9iZWcgbiAobiArIDEpXG4gIGFuZCBmaW5kX2JlZyBuIHAgPVxuICAgIGlmIG4gPCAwIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgcFxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiBTdHJpbmcuc3ViIG5hbWUgKG4gKyAxKSAocCAtIG4gLSAxKVxuICAgIGVsc2UgZmluZF9iZWcgKG4gLSAxKSBwXG4gIGluXG4gIGlmIG5hbWUgPSBcIlwiXG4gIHRoZW4gY3VycmVudF9kaXJfbmFtZVxuICBlbHNlIGZpbmRfZW5kIChTdHJpbmcubGVuZ3RoIG5hbWUgLSAxKVxuXG4oKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIE9wZW4gR3JvdXAgc3BlY2lmaWNhdGlvbiBmb3VuZCBoZXJlOlxuICBbWzJdXSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvZGlybmFtZS5odG1sXG4gIEluIHN0ZXAgNiBvZiBbWzJdXSwgd2UgY2hvb3NlIHRvIHByb2Nlc3MgXCIvL1wiIG5vcm1hbGx5LlxuKilcbmxldCBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lIG5hbWUgPVxuICBsZXQgcmVjIHRyYWlsaW5nX3NlcCBuID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIDFcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gdHJhaWxpbmdfc2VwIChuIC0gMSlcbiAgICBlbHNlIGJhc2UgblxuICBhbmQgYmFzZSBuID1cbiAgICBpZiBuIDwgMCB0aGVuIGN1cnJlbnRfZGlyX25hbWVcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gaW50ZXJtZWRpYXRlX3NlcCBuXG4gICAgZWxzZSBiYXNlIChuIC0gMSlcbiAgYW5kIGludGVybWVkaWF0ZV9zZXAgbiA9XG4gICAgaWYgbiA8IDAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCAxXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIGludGVybWVkaWF0ZV9zZXAgKG4gLSAxKVxuICAgIGVsc2UgU3RyaW5nLnN1YiBuYW1lIDAgKG4gKyAxKVxuICBpblxuICBpZiBuYW1lID0gXCJcIlxuICB0aGVuIGN1cnJlbnRfZGlyX25hbWVcbiAgZWxzZSB0cmFpbGluZ19zZXAgKFN0cmluZy5sZW5ndGggbmFtZSAtIDEpXG5cbm1vZHVsZSB0eXBlIFNZU0RFUFMgPSBzaWdcbiAgdmFsIG51bGwgOiBzdHJpbmdcbiAgdmFsIGN1cnJlbnRfZGlyX25hbWUgOiBzdHJpbmdcbiAgdmFsIHBhcmVudF9kaXJfbmFtZSA6IHN0cmluZ1xuICB2YWwgZGlyX3NlcCA6IHN0cmluZ1xuICB2YWwgaXNfZGlyX3NlcCA6IHN0cmluZyAtPiBpbnQgLT4gYm9vbFxuICB2YWwgaXNfcmVsYXRpdmUgOiBzdHJpbmcgLT4gYm9vbFxuICB2YWwgaXNfaW1wbGljaXQgOiBzdHJpbmcgLT4gYm9vbFxuICB2YWwgY2hlY2tfc3VmZml4IDogc3RyaW5nIC0+IHN0cmluZyAtPiBib29sXG4gIHZhbCBjaG9wX3N1ZmZpeF9vcHQgOiBzdWZmaXg6c3RyaW5nIC0+IHN0cmluZyAtPiBzdHJpbmcgb3B0aW9uXG4gIHZhbCB0ZW1wX2Rpcl9uYW1lIDogc3RyaW5nXG4gIHZhbCBxdW90ZSA6IHN0cmluZyAtPiBzdHJpbmdcbiAgdmFsIHF1b3RlX2NvbW1hbmQgOlxuICAgIHN0cmluZyAtPiA/c3RkaW46IHN0cmluZyAtPiA/c3Rkb3V0OiBzdHJpbmcgLT4gP3N0ZGVycjogc3RyaW5nXG4gICAgICAgICAgIC0+IHN0cmluZyBsaXN0IC0+IHN0cmluZ1xuICB2YWwgYmFzZW5hbWUgOiBzdHJpbmcgLT4gc3RyaW5nXG4gIHZhbCBkaXJuYW1lIDogc3RyaW5nIC0+IHN0cmluZ1xuZW5kXG5cbm1vZHVsZSBVbml4IDogU1lTREVQUyA9IHN0cnVjdFxuICBsZXQgbnVsbCA9IFwiL2Rldi9udWxsXCJcbiAgbGV0IGN1cnJlbnRfZGlyX25hbWUgPSBcIi5cIlxuICBsZXQgcGFyZW50X2Rpcl9uYW1lID0gXCIuLlwiXG4gIGxldCBkaXJfc2VwID0gXCIvXCJcbiAgbGV0IGlzX2Rpcl9zZXAgcyBpID0gcy5baV0gPSAnLydcbiAgbGV0IGlzX3JlbGF0aXZlIG4gPSBTdHJpbmcubGVuZ3RoIG4gPCAxIHx8IG4uWzBdIDw+ICcvJ1xuICBsZXQgaXNfaW1wbGljaXQgbiA9XG4gICAgaXNfcmVsYXRpdmUgblxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuL1wiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAzIHx8IFN0cmluZy5zdWIgbiAwIDMgPD4gXCIuLi9cIilcbiAgbGV0IGNoZWNrX3N1ZmZpeCBuYW1lIHN1ZmYgPVxuICAgIFN0cmluZy5lbmRzX3dpdGggfnN1ZmZpeDpzdWZmIG5hbWVcblxuICBsZXQgY2hvcF9zdWZmaXhfb3B0IH5zdWZmaXggZmlsZW5hbWUgPVxuICAgIGxldCBsZW5fcyA9IFN0cmluZy5sZW5ndGggc3VmZml4IGFuZCBsZW5fZiA9IFN0cmluZy5sZW5ndGggZmlsZW5hbWUgaW5cbiAgICBpZiBsZW5fZiA+PSBsZW5fcyB0aGVuXG4gICAgICBsZXQgciA9IFN0cmluZy5zdWIgZmlsZW5hbWUgKGxlbl9mIC0gbGVuX3MpIGxlbl9zIGluXG4gICAgICBpZiByID0gc3VmZml4IHRoZW5cbiAgICAgICAgU29tZSAoU3RyaW5nLnN1YiBmaWxlbmFtZSAwIChsZW5fZiAtIGxlbl9zKSlcbiAgICAgIGVsc2VcbiAgICAgICAgTm9uZVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuICBsZXQgdGVtcF9kaXJfbmFtZSA9XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJUTVBESVJcIiB3aXRoIE5vdF9mb3VuZCAtPiBcIi90bXBcIlxuICBsZXQgcXVvdGUgPSBnZW5lcmljX3F1b3RlIFwiJ1xcXFwnJ1wiXG4gIGxldCBxdW90ZV9jb21tYW5kIGNtZCA/c3RkaW4gP3N0ZG91dCA/c3RkZXJyIGFyZ3MgPVxuICAgIFN0cmluZy5jb25jYXQgXCIgXCIgKExpc3QubWFwIHF1b3RlIChjbWQgOjogYXJncykpXG4gICAgXiAobWF0Y2ggc3RkaW4gIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiIDxcIiBeIHF1b3RlIGYpXG4gICAgXiAobWF0Y2ggc3Rkb3V0IHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiID5cIiBeIHF1b3RlIGYpXG4gICAgXiAobWF0Y2ggc3RkZXJyIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IGlmIHN0ZGVyciA9IHN0ZG91dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBcIiAyPiYxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXCIgMj5cIiBeIHF1b3RlIGYpXG4gIGxldCBiYXNlbmFtZSA9IGdlbmVyaWNfYmFzZW5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG4gIGxldCBkaXJuYW1lID0gZ2VuZXJpY19kaXJuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZVxuZW5kXG5cbm1vZHVsZSBXaW4zMiA6IFNZU0RFUFMgPSBzdHJ1Y3RcbiAgbGV0IG51bGwgPSBcIk5VTFwiXG4gIGxldCBjdXJyZW50X2Rpcl9uYW1lID0gXCIuXCJcbiAgbGV0IHBhcmVudF9kaXJfbmFtZSA9IFwiLi5cIlxuICBsZXQgZGlyX3NlcCA9IFwiXFxcXFwiXG4gIGxldCBpc19kaXJfc2VwIHMgaSA9IGxldCBjID0gcy5baV0gaW4gYyA9ICcvJyB8fCBjID0gJ1xcXFwnIHx8IGMgPSAnOidcbiAgbGV0IGlzX3JlbGF0aXZlIG4gPVxuICAgIChTdHJpbmcubGVuZ3RoIG4gPCAxIHx8IG4uWzBdIDw+ICcvJylcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMSB8fCBuLlswXSA8PiAnXFxcXCcpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDIgfHwgbi5bMV0gPD4gJzonKVxuICBsZXQgaXNfaW1wbGljaXQgbiA9XG4gICAgaXNfcmVsYXRpdmUgblxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuL1wiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IFN0cmluZy5zdWIgbiAwIDIgPD4gXCIuXFxcXFwiKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAzIHx8IFN0cmluZy5zdWIgbiAwIDMgPD4gXCIuLi9cIilcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMyB8fCBTdHJpbmcuc3ViIG4gMCAzIDw+IFwiLi5cXFxcXCIpXG4gIGxldCBjaGVja19zdWZmaXggbmFtZSBzdWZmID1cbiAgIFN0cmluZy5sZW5ndGggbmFtZSA+PSBTdHJpbmcubGVuZ3RoIHN1ZmYgJiZcbiAgIChsZXQgcyA9IFN0cmluZy5zdWIgbmFtZSAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gU3RyaW5nLmxlbmd0aCBzdWZmKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcubGVuZ3RoIHN1ZmYpIGluXG4gICAgU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSBzID0gU3RyaW5nLmxvd2VyY2FzZV9hc2NpaSBzdWZmKVxuXG4gIGxldCBjaG9wX3N1ZmZpeF9vcHQgfnN1ZmZpeCBmaWxlbmFtZSA9XG4gICAgbGV0IGxlbl9zID0gU3RyaW5nLmxlbmd0aCBzdWZmaXggYW5kIGxlbl9mID0gU3RyaW5nLmxlbmd0aCBmaWxlbmFtZSBpblxuICAgIGlmIGxlbl9mID49IGxlbl9zIHRoZW5cbiAgICAgIGxldCByID0gU3RyaW5nLnN1YiBmaWxlbmFtZSAobGVuX2YgLSBsZW5fcykgbGVuX3MgaW5cbiAgICAgIGlmIFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgciA9IFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgc3VmZml4IHRoZW5cbiAgICAgICAgU29tZSAoU3RyaW5nLnN1YiBmaWxlbmFtZSAwIChsZW5fZiAtIGxlbl9zKSlcbiAgICAgIGVsc2VcbiAgICAgICAgTm9uZVxuICAgIGVsc2VcbiAgICAgIE5vbmVcblxuXG4gIGxldCB0ZW1wX2Rpcl9uYW1lID1cbiAgICB0cnkgU3lzLmdldGVudiBcIlRFTVBcIiB3aXRoIE5vdF9mb3VuZCAtPiBcIi5cIlxuICBsZXQgcXVvdGUgcyA9XG4gICAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKGwgKyAyMCkgaW5cbiAgICBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIic7XG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA9IGwgdGhlbiBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIicgZWxzZVxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnXFxcIicgLT4gbG9vcF9icyAwIGk7XG4gICAgICB8ICdcXFxcJyAtPiBsb29wX2JzIDAgaTtcbiAgICAgIHwgYyAgICAtPiBCdWZmZXIuYWRkX2NoYXIgYiBjOyBsb29wIChpKzEpO1xuICAgIGFuZCBsb29wX2JzIG4gaSA9XG4gICAgICBpZiBpID0gbCB0aGVuIGJlZ2luXG4gICAgICAgIEJ1ZmZlci5hZGRfY2hhciBiICdcXFwiJztcbiAgICAgICAgYWRkX2JzIG47XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICAgIHwgJ1xcXCInIC0+IGFkZF9icyAoMipuKzEpOyBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIic7IGxvb3AgKGkrMSk7XG4gICAgICAgIHwgJ1xcXFwnIC0+IGxvb3BfYnMgKG4rMSkgKGkrMSk7XG4gICAgICAgIHwgXyAgICAtPiBhZGRfYnMgbjsgbG9vcCBpXG4gICAgICBlbmRcbiAgICBhbmQgYWRkX2JzIG4gPSBmb3IgX2ogPSAxIHRvIG4gZG8gQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXFwnOyBkb25lXG4gICAgaW5cbiAgICBsb29wIDA7XG4gICAgQnVmZmVyLmNvbnRlbnRzIGJcbigqXG5RdW90aW5nIGNvbW1hbmRzIGZvciBleGVjdXRpb24gYnkgY21kLmV4ZSBpcyBkaWZmaWN1bHQuXG4xLSBFYWNoIGFyZ3VtZW50IGlzIGZpcnN0IHF1b3RlZCB1c2luZyB0aGUgXCJxdW90ZVwiIGZ1bmN0aW9uIGFib3ZlLCB0b1xuICAgcHJvdGVjdCBpdCBhZ2FpbnN0IHRoZSBwcm9jZXNzaW5nIHBlcmZvcm1lZCBieSB0aGUgQyBydW50aW1lIHN5c3RlbSxcbiAgIHRoZW4gY21kLmV4ZSdzIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB3aXRoICdeJywgdXNpbmdcbiAgIHRoZSBcInF1b3RlX2NtZFwiIGZ1bmN0aW9uIGJlbG93LiAgRm9yIG1vcmUgZGV0YWlscywgc2VlXG4gICBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS90d2lzdHlsaXR0bGVwYXNzYWdlc2FsbGFsaWtlLzIwMTEvMDQvMjNcbjItIFRoZSBjb21tYW5kIGFuZCB0aGUgcmVkaXJlY3Rpb24gZmlsZXMsIGlmIGFueSwgbXVzdCBiZSBkb3VibGUtcXVvdGVkXG4gICBpbiBjYXNlIHRoZXkgY29udGFpbiBzcGFjZXMuICBUaGlzIHF1b3RpbmcgaXMgaW50ZXJwcmV0ZWQgYnkgY21kLmV4ZSxcbiAgIG5vdCBieSB0aGUgQyBydW50aW1lIHN5c3RlbSwgaGVuY2UgdGhlIFwicXVvdGVcIiBmdW5jdGlvbiBhYm92ZVxuICAgY2Fubm90IGJlIHVzZWQuICBUaGUgdHdvIGNoYXJhY3RlcnMgd2UgZG9uJ3Qga25vdyBob3cgdG8gcXVvdGVcbiAgIGluc2lkZSBhIGRvdWJsZS1xdW90ZWQgY21kLmV4ZSBzdHJpbmcgYXJlIGRvdWJsZS1xdW90ZSBhbmQgcGVyY2VudC5cbiAgIFdlIGp1c3QgZmFpbCBpZiB0aGUgY29tbWFuZCBuYW1lIG9yIHRoZSByZWRpcmVjdGlvbiBmaWxlIG5hbWVzXG4gICBjb250YWluIGEgZG91YmxlIHF1b3RlIChub3QgYWxsb3dlZCBpbiBXaW5kb3dzIGZpbGUgbmFtZXMsIGFueXdheSlcbiAgIG9yIGEgcGVyY2VudC4gIFNlZSBmdW5jdGlvbiBcInF1b3RlX2NtZF9maWxlbmFtZVwiIGJlbG93LlxuMy0gVGhlIHdob2xlIHN0cmluZyBwYXNzZWQgdG8gU3lzLmNvbW1hbmQgaXMgdGhlbiBlbmNsb3NlZCBpbiBkb3VibGVcbiAgIHF1b3Rlcywgd2hpY2ggYXJlIGltbWVkaWF0ZWx5IHN0cmlwcGVkIGJ5IGNtZC5leGUuICBPdGhlcndpc2UsXG4gICBzb21lIG9mIHRoZSBkb3VibGUgcXVvdGVzIGZyb20gc3RlcCAyIGFib3ZlIGNhbiBiZSBtaXNwYXJzZWQuXG4gICBTZWUgZS5nLiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTk2NTE0MVxuKilcbiAgbGV0IHF1b3RlX2NtZCBzID1cbiAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgKFN0cmluZy5sZW5ndGggcyArIDIwKSBpblxuICAgIFN0cmluZy5pdGVyXG4gICAgICAoZnVuIGMgLT5cbiAgICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICAgIHwgJygnIHwgJyknIHwgJyEnIHwgJ14nIHwgJyUnIHwgJ1xcXCInIHwgJzwnIHwgJz4nIHwgJyYnIHwgJ3wnIC0+XG4gICAgICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYiAnXic7IEJ1ZmZlci5hZGRfY2hhciBiIGNcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYiBjKVxuICAgICAgcztcbiAgICBCdWZmZXIuY29udGVudHMgYlxuICBsZXQgcXVvdGVfY21kX2ZpbGVuYW1lIGYgPVxuICAgIGlmIFN0cmluZy5jb250YWlucyBmICdcXFwiJyB8fCBTdHJpbmcuY29udGFpbnMgZiAnJScgdGhlblxuICAgICAgZmFpbHdpdGggKFwiRmlsZW5hbWUucXVvdGVfY29tbWFuZDogYmFkIGZpbGUgbmFtZSBcIiBeIGYpXG4gICAgZWxzZSBpZiBTdHJpbmcuY29udGFpbnMgZiAnICcgdGhlblxuICAgICAgXCJcXFwiXCIgXiBmIF4gXCJcXFwiXCJcbiAgICBlbHNlXG4gICAgICBmXG4gICgqIFJlZGlyZWN0aW9ucyBpbiBjbWQuZXhlOiBzZWUgaHR0cHM6Ly9zczY0LmNvbS9udC9zeW50YXgtcmVkaXJlY3Rpb24uaHRtbFxuICAgICBhbmQgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcHJldmlvdXMtdmVyc2lvbnMvd2luZG93cy9pdC1wcm8vd2luZG93cy14cC9iYjQ5MDk4Mih2PXRlY2huZXQuMTApXG4gICopXG4gIGxldCBxdW90ZV9jb21tYW5kIGNtZCA/c3RkaW4gP3N0ZG91dCA/c3RkZXJyIGFyZ3MgPVxuICAgIFN0cmluZy5jb25jYXQgXCJcIiBbXG4gICAgICBcIlxcXCJcIjtcbiAgICAgIHF1b3RlX2NtZF9maWxlbmFtZSBjbWQ7XG4gICAgICBcIiBcIjtcbiAgICAgIHF1b3RlX2NtZCAoU3RyaW5nLmNvbmNhdCBcIiBcIiAoTGlzdC5tYXAgcXVvdGUgYXJncykpO1xuICAgICAgKG1hdGNoIHN0ZGluICB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBcIiA8XCIgXiBxdW90ZV9jbWRfZmlsZW5hbWUgZik7XG4gICAgICAobWF0Y2ggc3Rkb3V0IHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+IFwiID5cIiBeIHF1b3RlX2NtZF9maWxlbmFtZSBmKTtcbiAgICAgIChtYXRjaCBzdGRlcnIgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdGRlcnIgPSBzdGRvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIFwiIDI+JjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgXCIgMj5cIiBeIHF1b3RlX2NtZF9maWxlbmFtZSBmKTtcbiAgICAgIFwiXFxcIlwiXG4gICAgXVxuICBsZXQgaGFzX2RyaXZlIHMgPVxuICAgIGxldCBpc19sZXR0ZXIgPSBmdW5jdGlvblxuICAgICAgfCAnQScgLi4gJ1onIHwgJ2EnIC4uICd6JyAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcbiAgICBpblxuICAgIFN0cmluZy5sZW5ndGggcyA+PSAyICYmIGlzX2xldHRlciBzLlswXSAmJiBzLlsxXSA9ICc6J1xuICBsZXQgZHJpdmVfYW5kX3BhdGggcyA9XG4gICAgaWYgaGFzX2RyaXZlIHNcbiAgICB0aGVuIChTdHJpbmcuc3ViIHMgMCAyLCBTdHJpbmcuc3ViIHMgMiAoU3RyaW5nLmxlbmd0aCBzIC0gMikpXG4gICAgZWxzZSAoXCJcIiwgcylcbiAgbGV0IGRpcm5hbWUgcyA9XG4gICAgbGV0IChkcml2ZSwgcGF0aCkgPSBkcml2ZV9hbmRfcGF0aCBzIGluXG4gICAgbGV0IGRpciA9IGdlbmVyaWNfZGlybmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgcGF0aCBpblxuICAgIGRyaXZlIF4gZGlyXG4gIGxldCBiYXNlbmFtZSBzID1cbiAgICBsZXQgKF9kcml2ZSwgcGF0aCkgPSBkcml2ZV9hbmRfcGF0aCBzIGluXG4gICAgZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgcGF0aFxuZW5kXG5cbm1vZHVsZSBDeWd3aW4gOiBTWVNERVBTID0gc3RydWN0XG4gIGxldCBudWxsID0gXCIvZGV2L251bGxcIlxuICBsZXQgY3VycmVudF9kaXJfbmFtZSA9IFwiLlwiXG4gIGxldCBwYXJlbnRfZGlyX25hbWUgPSBcIi4uXCJcbiAgbGV0IGRpcl9zZXAgPSBcIi9cIlxuICBsZXQgaXNfZGlyX3NlcCA9IFdpbjMyLmlzX2Rpcl9zZXBcbiAgbGV0IGlzX3JlbGF0aXZlID0gV2luMzIuaXNfcmVsYXRpdmVcbiAgbGV0IGlzX2ltcGxpY2l0ID0gV2luMzIuaXNfaW1wbGljaXRcbiAgbGV0IGNoZWNrX3N1ZmZpeCA9IFdpbjMyLmNoZWNrX3N1ZmZpeFxuICBsZXQgY2hvcF9zdWZmaXhfb3B0ID0gV2luMzIuY2hvcF9zdWZmaXhfb3B0XG4gIGxldCB0ZW1wX2Rpcl9uYW1lID0gVW5peC50ZW1wX2Rpcl9uYW1lXG4gIGxldCBxdW90ZSA9IFVuaXgucXVvdGVcbiAgbGV0IHF1b3RlX2NvbW1hbmQgPSBVbml4LnF1b3RlX2NvbW1hbmRcbiAgbGV0IGJhc2VuYW1lID0gZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWVcbiAgbGV0IGRpcm5hbWUgPSBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG5lbmRcblxubW9kdWxlIFN5c2RlcHMgPVxuICAodmFsIChtYXRjaCBTeXMub3NfdHlwZSB3aXRoXG4gICAgICAgfCBcIldpbjMyXCIgLT4gKG1vZHVsZSBXaW4zMjogU1lTREVQUylcbiAgICAgICB8IFwiQ3lnd2luXCIgLT4gKG1vZHVsZSBDeWd3aW46IFNZU0RFUFMpXG4gICAgICAgfCBfIC0+IChtb2R1bGUgVW5peDogU1lTREVQUykpKVxuXG5pbmNsdWRlIFN5c2RlcHNcblxubGV0IGNvbmNhdCBkaXJuYW1lIGZpbGVuYW1lID1cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIGRpcm5hbWUgaW5cbiAgaWYgbCA9IDAgfHwgaXNfZGlyX3NlcCBkaXJuYW1lIChsLTEpXG4gIHRoZW4gZGlybmFtZSBeIGZpbGVuYW1lXG4gIGVsc2UgZGlybmFtZSBeIGRpcl9zZXAgXiBmaWxlbmFtZVxuXG5sZXQgY2hvcF9zdWZmaXggbmFtZSBzdWZmID1cbiAgaWYgY2hlY2tfc3VmZml4IG5hbWUgc3VmZlxuICB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBTdHJpbmcubGVuZ3RoIHN1ZmYpXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJGaWxlbmFtZS5jaG9wX3N1ZmZpeFwiXG5cbmxldCBleHRlbnNpb25fbGVuIG5hbWUgPVxuICBsZXQgcmVjIGNoZWNrIGkwIGkgPVxuICAgIGlmIGkgPCAwIHx8IGlzX2Rpcl9zZXAgbmFtZSBpIHRoZW4gMFxuICAgIGVsc2UgaWYgbmFtZS5baV0gPSAnLicgdGhlbiBjaGVjayBpMCAoaSAtIDEpXG4gICAgZWxzZSBTdHJpbmcubGVuZ3RoIG5hbWUgLSBpMFxuICBpblxuICBsZXQgcmVjIHNlYXJjaF9kb3QgaSA9XG4gICAgaWYgaSA8IDAgfHwgaXNfZGlyX3NlcCBuYW1lIGkgdGhlbiAwXG4gICAgZWxzZSBpZiBuYW1lLltpXSA9ICcuJyB0aGVuIGNoZWNrIGkgKGkgLSAxKVxuICAgIGVsc2Ugc2VhcmNoX2RvdCAoaSAtIDEpXG4gIGluXG4gIHNlYXJjaF9kb3QgKFN0cmluZy5sZW5ndGggbmFtZSAtIDEpXG5cbmxldCBleHRlbnNpb24gbmFtZSA9XG4gIGxldCBsID0gZXh0ZW5zaW9uX2xlbiBuYW1lIGluXG4gIGlmIGwgPSAwIHRoZW4gXCJcIiBlbHNlIFN0cmluZy5zdWIgbmFtZSAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gbCkgbFxuXG5sZXQgY2hvcF9leHRlbnNpb24gbmFtZSA9XG4gIGxldCBsID0gZXh0ZW5zaW9uX2xlbiBuYW1lIGluXG4gIGlmIGwgPSAwIHRoZW4gaW52YWxpZF9hcmcgXCJGaWxlbmFtZS5jaG9wX2V4dGVuc2lvblwiXG4gIGVsc2UgU3RyaW5nLnN1YiBuYW1lIDAgKFN0cmluZy5sZW5ndGggbmFtZSAtIGwpXG5cbmxldCByZW1vdmVfZXh0ZW5zaW9uIG5hbWUgPVxuICBsZXQgbCA9IGV4dGVuc2lvbl9sZW4gbmFtZSBpblxuICBpZiBsID0gMCB0aGVuIG5hbWUgZWxzZSBTdHJpbmcuc3ViIG5hbWUgMCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gbClcblxuZXh0ZXJuYWwgb3Blbl9kZXNjOiBzdHJpbmcgLT4gb3Blbl9mbGFnIGxpc3QgLT4gaW50IC0+IGludCA9IFwiY2FtbF9zeXNfb3BlblwiXG5leHRlcm5hbCBjbG9zZV9kZXNjOiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9zeXNfY2xvc2VcIlxuXG5sZXQgcHJuZ19rZXkgPVxuICBEb21haW4uRExTLm5ld19rZXkgUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0XG5cbmxldCB0ZW1wX2ZpbGVfbmFtZSB0ZW1wX2RpciBwcmVmaXggc3VmZml4ID1cbiAgbGV0IHJhbmRvbV9zdGF0ZSA9IERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5IGluXG4gIGxldCBybmQgPSAoUmFuZG9tLlN0YXRlLmJpdHMgcmFuZG9tX3N0YXRlKSBsYW5kIDB4RkZGRkZGIGluXG4gIGNvbmNhdCB0ZW1wX2RpciAoUHJpbnRmLnNwcmludGYgXCIlcyUwNnglc1wiIHByZWZpeCBybmQgc3VmZml4KVxuXG5sZXQgY3VycmVudF90ZW1wX2Rpcl9uYW1lID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudDpGdW4uaWQgKGZ1biAoKSAtPiB0ZW1wX2Rpcl9uYW1lKVxuXG5sZXQgc2V0X3RlbXBfZGlyX25hbWUgcyA9IERvbWFpbi5ETFMuc2V0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZSBzXG5sZXQgZ2V0X3RlbXBfZGlyX25hbWUgKCkgPSBEb21haW4uRExTLmdldCBjdXJyZW50X3RlbXBfZGlyX25hbWVcblxubGV0IHRlbXBfZmlsZSA/KHRlbXBfZGlyID0gRG9tYWluLkRMUy5nZXQgY3VycmVudF90ZW1wX2Rpcl9uYW1lKSBwcmVmaXggc3VmZml4ID1cbiAgbGV0IHJlYyB0cnlfbmFtZSBjb3VudGVyID1cbiAgICBsZXQgbmFtZSA9IHRlbXBfZmlsZV9uYW1lIHRlbXBfZGlyIHByZWZpeCBzdWZmaXggaW5cbiAgICB0cnlcbiAgICAgIGNsb3NlX2Rlc2Mob3Blbl9kZXNjIG5hbWUgW09wZW5fd3Jvbmx5OyBPcGVuX2NyZWF0OyBPcGVuX2V4Y2xdIDBvNjAwKTtcbiAgICAgIG5hbWVcbiAgICB3aXRoIFN5c19lcnJvciBfIGFzIGUgLT5cbiAgICAgIGlmIGNvdW50ZXIgPj0gMTAwMCB0aGVuIHJhaXNlIGUgZWxzZSB0cnlfbmFtZSAoY291bnRlciArIDEpXG4gIGluIHRyeV9uYW1lIDBcblxubGV0IG9wZW5fdGVtcF9maWxlID8obW9kZSA9IFtPcGVuX3RleHRdKSA/KHBlcm1zID0gMG82MDApXG4gICAgPyh0ZW1wX2RpciA9IERvbWFpbi5ETFMuZ2V0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZSlcbiAgICBwcmVmaXggc3VmZml4ID1cbiAgbGV0IHJlYyB0cnlfbmFtZSBjb3VudGVyID1cbiAgICBsZXQgbmFtZSA9IHRlbXBfZmlsZV9uYW1lIHRlbXBfZGlyIHByZWZpeCBzdWZmaXggaW5cbiAgICB0cnlcbiAgICAgIChuYW1lLFxuICAgICAgIG9wZW5fb3V0X2dlbiAoT3Blbl93cm9ubHk6Ok9wZW5fY3JlYXQ6Ok9wZW5fZXhjbDo6bW9kZSkgcGVybXMgbmFtZSlcbiAgICB3aXRoIFN5c19lcnJvciBfIGFzIGUgLT5cbiAgICAgIGlmIGNvdW50ZXIgPj0gMTAwMCB0aGVuIHJhaXNlIGUgZWxzZSB0cnlfbmFtZSAoY291bnRlciArIDEpXG4gIGluIHRyeV9uYW1lIDBcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQ29tcGxleCBudW1iZXJzICopXG5cbnR5cGUgdCA9IHsgcmU6IGZsb2F0OyBpbTogZmxvYXQgfVxuXG5sZXQgemVybyA9IHsgcmUgPSAwLjA7IGltID0gMC4wIH1cbmxldCBvbmUgPSB7IHJlID0gMS4wOyBpbSA9IDAuMCB9XG5sZXQgaSA9IHsgcmUgPSAwLjA7IGltID0gMS4wIH1cblxubGV0IGFkZCB4IHkgPSB7IHJlID0geC5yZSArLiB5LnJlOyBpbSA9IHguaW0gKy4geS5pbSB9XG5cbmxldCBzdWIgeCB5ID0geyByZSA9IHgucmUgLS4geS5yZTsgaW0gPSB4LmltIC0uIHkuaW0gfVxuXG5sZXQgbmVnIHggPSB7IHJlID0gLS4geC5yZTsgaW0gPSAtLiB4LmltIH1cblxubGV0IGNvbmogeCA9IHsgcmUgPSB4LnJlOyBpbSA9IC0uIHguaW0gfVxuXG5sZXQgbXVsIHggeSA9IHsgcmUgPSB4LnJlICouIHkucmUgLS4geC5pbSAqLiB5LmltO1xuICAgICAgICAgICAgICAgIGltID0geC5yZSAqLiB5LmltICsuIHguaW0gKi4geS5yZSB9XG5cbmxldCBkaXYgeCB5ID1cbiAgaWYgYWJzX2Zsb2F0IHkucmUgPj0gYWJzX2Zsb2F0IHkuaW0gdGhlblxuICAgIGxldCByID0geS5pbSAvLiB5LnJlIGluXG4gICAgbGV0IGQgPSB5LnJlICsuIHIgKi4geS5pbSBpblxuICAgIHsgcmUgPSAoeC5yZSArLiByICouIHguaW0pIC8uIGQ7XG4gICAgICBpbSA9ICh4LmltIC0uIHIgKi4geC5yZSkgLy4gZCB9XG4gIGVsc2VcbiAgICBsZXQgciA9IHkucmUgLy4geS5pbSBpblxuICAgIGxldCBkID0geS5pbSArLiByICouIHkucmUgaW5cbiAgICB7IHJlID0gKHIgKi4geC5yZSArLiB4LmltKSAvLiBkO1xuICAgICAgaW0gPSAociAqLiB4LmltIC0uIHgucmUpIC8uIGQgfVxuXG5sZXQgaW52IHggPSBkaXYgb25lIHhcblxubGV0IG5vcm0yIHggPSB4LnJlICouIHgucmUgKy4geC5pbSAqLiB4LmltXG5cbmxldCBub3JtIHggPSBGbG9hdC5oeXBvdCB4LnJlIHguaW1cblxubGV0IGFyZyB4ID0gYXRhbjIgeC5pbSB4LnJlXG5cbmxldCBwb2xhciBuIGEgPSB7IHJlID0gY29zIGEgKi4gbjsgaW0gPSBzaW4gYSAqLiBuIH1cblxubGV0IHNxcnQgeCA9XG4gIGlmIHgucmUgPSAwLjAgJiYgeC5pbSA9IDAuMCB0aGVuIHsgcmUgPSAwLjA7IGltID0gMC4wIH1cbiAgZWxzZSBiZWdpblxuICAgIGxldCByID0gYWJzX2Zsb2F0IHgucmUgYW5kIGkgPSBhYnNfZmxvYXQgeC5pbSBpblxuICAgIGxldCB3ID1cbiAgICAgIGlmIHIgPj0gaSB0aGVuIGJlZ2luXG4gICAgICAgIGxldCBxID0gaSAvLiByIGluXG4gICAgICAgIHNxcnQocikgKi4gc3FydCgwLjUgKi4gKDEuMCArLiBzcXJ0KDEuMCArLiBxICouIHEpKSlcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIGxldCBxID0gciAvLiBpIGluXG4gICAgICAgIHNxcnQoaSkgKi4gc3FydCgwLjUgKi4gKHEgKy4gc3FydCgxLjAgKy4gcSAqLiBxKSkpXG4gICAgICBlbmQgaW5cbiAgICBpZiB4LnJlID49IDAuMFxuICAgIHRoZW4geyByZSA9IHc7ICBpbSA9IDAuNSAqLiB4LmltIC8uIHcgfVxuICAgIGVsc2UgeyByZSA9IDAuNSAqLiBpIC8uIHc7ICBpbSA9IGlmIHguaW0gPj0gMC4wIHRoZW4gdyBlbHNlIC0uIHcgfVxuICBlbmRcblxubGV0IGV4cCB4ID1cbiAgbGV0IGUgPSBleHAgeC5yZSBpbiB7IHJlID0gZSAqLiBjb3MgeC5pbTsgaW0gPSBlICouIHNpbiB4LmltIH1cblxubGV0IGxvZyB4ID0geyByZSA9IGxvZyAobm9ybSB4KTsgaW0gPSBhdGFuMiB4LmltIHgucmUgfVxuXG5sZXQgcG93IHggeSA9IGV4cCAobXVsIHkgKGxvZyB4KSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gaW5fY2hhbm5lbFxuXG50eXBlIG9wZW5fZmxhZyA9IFN0ZGxpYi5vcGVuX2ZsYWcgPVxuICB8IE9wZW5fcmRvbmx5XG4gIHwgT3Blbl93cm9ubHlcbiAgfCBPcGVuX2FwcGVuZFxuICB8IE9wZW5fY3JlYXRcbiAgfCBPcGVuX3RydW5jXG4gIHwgT3Blbl9leGNsXG4gIHwgT3Blbl9iaW5hcnlcbiAgfCBPcGVuX3RleHRcbiAgfCBPcGVuX25vbmJsb2NrXG5cbmxldCBzdGRpbiA9IFN0ZGxpYi5zdGRpblxubGV0IG9wZW5fYmluID0gU3RkbGliLm9wZW5faW5fYmluXG5sZXQgb3Blbl90ZXh0ID0gU3RkbGliLm9wZW5faW5cbmxldCBvcGVuX2dlbiA9IFN0ZGxpYi5vcGVuX2luX2dlblxuXG5sZXQgd2l0aF9vcGVuIG9wZW5mdW4gcyBmID1cbiAgbGV0IGljID0gb3BlbmZ1biBzIGluXG4gIEZ1bi5wcm90ZWN0IH5maW5hbGx5OihmdW4gKCkgLT4gU3RkbGliLmNsb3NlX2luX25vZXJyIGljKVxuICAgIChmdW4gKCkgLT4gZiBpYylcblxubGV0IHdpdGhfb3Blbl9iaW4gcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX2luX2JpbiBzIGZcblxubGV0IHdpdGhfb3Blbl90ZXh0IHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9pbiBzIGZcblxubGV0IHdpdGhfb3Blbl9nZW4gZmxhZ3MgcGVybSBzIGYgPVxuICB3aXRoX29wZW4gKFN0ZGxpYi5vcGVuX2luX2dlbiBmbGFncyBwZXJtKSBzIGZcblxubGV0IHNlZWsgPSBTdGRsaWIuTGFyZ2VGaWxlLnNlZWtfaW5cbmxldCBwb3MgPSBTdGRsaWIuTGFyZ2VGaWxlLnBvc19pblxubGV0IGxlbmd0aCA9IFN0ZGxpYi5MYXJnZUZpbGUuaW5fY2hhbm5lbF9sZW5ndGhcbmxldCBjbG9zZSA9IFN0ZGxpYi5jbG9zZV9pblxubGV0IGNsb3NlX25vZXJyID0gU3RkbGliLmNsb3NlX2luX25vZXJyXG5cbmxldCBpbnB1dF9jaGFyIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICB8IGMgLT4gU29tZSBjXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0X2J5dGUgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfYnl0ZSBpYyB3aXRoXG4gIHwgbiAtPiBTb21lIG5cbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXRfbGluZSBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9saW5lIGljIHdpdGhcbiAgfCBzIC0+IFNvbWUgc1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dCA9IFN0ZGxpYi5pbnB1dFxuXG5sZXQgcmVhbGx5X2lucHV0IGljIGJ1ZiBwb3MgbGVuID1cbiAgbWF0Y2ggU3RkbGliLnJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiB3aXRoXG4gIHwgKCkgLT4gU29tZSAoKVxuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCByZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXRfc3RyaW5nIGljIGxlbiB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG4oKiBSZWFkIHVwIHRvIFtsZW5dIGJ5dGVzIGludG8gW2J1Zl0sIHN0YXJ0aW5nIGF0IFtvZnNdLiBSZXR1cm4gdG90YWwgYnl0ZXNcbiAgIHJlYWQuICopXG5sZXQgcmVhZF91cHRvIGljIGJ1ZiBvZnMgbGVuID1cbiAgbGV0IHJlYyBsb29wIG9mcyBsZW4gPVxuICAgIGlmIGxlbiA9IDAgdGhlbiBvZnNcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IFN0ZGxpYi5pbnB1dCBpYyBidWYgb2ZzIGxlbiBpblxuICAgICAgaWYgciA9IDAgdGhlblxuICAgICAgICBvZnNcbiAgICAgIGVsc2VcbiAgICAgICAgbG9vcCAob2ZzICsgcikgKGxlbiAtIHIpXG4gICAgZW5kXG4gIGluXG4gIGxvb3Agb2ZzIGxlbiAtIG9mc1xuXG4oKiBCZXN0IGVmZm9ydCBhdHRlbXB0IHRvIHJldHVybiBhIGJ1ZmZlciB3aXRoID49IChvZnMgKyBuKSBieXRlcyBvZiBzdG9yYWdlLFxuICAgYW5kIHN1Y2ggdGhhdCBpdCBjb2luY2lkZXMgd2l0aCBbYnVmXSBhdCBpbmRpY2VzIDwgW29mc10uXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgaXMgZXF1YWwgdG8gW2J1Zl0gaXRzZWxmIGlmIGl0IGFscmVhZHkgaGFzIHN1ZmZpY2llbnRcbiAgIGZyZWUgc3BhY2UuXG5cbiAgIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgKmZld2VyKiB0aGFuIFtvZnMgKyBuXSBieXRlcyBvZiBzdG9yYWdlIGlmIHRoaXNcbiAgIG51bWJlciBpcyA+IFtTeXMubWF4X3N0cmluZ19sZW5ndGhdLiBIb3dldmVyIHRoZSByZXR1cm5lZCBidWZmZXIgd2lsbFxuICAgKmFsd2F5cyogaGF2ZSA+IFtvZnNdIGJ5dGVzIG9mIHN0b3JhZ2UuIEluIHRoZSBsaW1pdGluZyBjYXNlIHdoZW4gW29mcyA9IGxlblxuICAgPSBTeXMubWF4X3N0cmluZ19sZW5ndGhdIChzbyB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXNpemUgdGhlIGJ1ZmZlciBhdFxuICAgYWxsKSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKilcblxubGV0IGVuc3VyZSBidWYgb2ZzIG4gPVxuICBsZXQgbGVuID0gQnl0ZXMubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPj0gb2ZzICsgbiB0aGVuIGJ1ZlxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG5ld19sZW4gPSByZWYgbGVuIGluXG4gICAgd2hpbGUgIW5ld19sZW4gPCBvZnMgKyBuIGRvXG4gICAgICBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiArIDFcbiAgICBkb25lO1xuICAgIGxldCBuZXdfbGVuID0gIW5ld19sZW4gaW5cbiAgICBsZXQgbmV3X2xlbiA9XG4gICAgICBpZiBuZXdfbGVuIDw9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIG5ld19sZW5cbiAgICAgIGVsc2UgaWYgb2ZzIDwgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgICBlbHNlXG4gICAgICAgIGZhaWx3aXRoIFwiSW5fY2hhbm5lbC5pbnB1dF9hbGw6IGNoYW5uZWwgY29udGVudCBcXFxuICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBzdHJpbmcgbGVuZ3RoXCJcbiAgICBpblxuICAgIGxldCBuZXdfYnVmID0gQnl0ZXMuY3JlYXRlIG5ld19sZW4gaW5cbiAgICBCeXRlcy5ibGl0IGJ1ZiAwIG5ld19idWYgMCBvZnM7XG4gICAgbmV3X2J1ZlxuICBlbmRcblxubGV0IGlucHV0X2FsbCBpYyA9XG4gIGxldCBjaHVua19zaXplID0gNjU1MzYgaW4gKCogSU9fQlVGRkVSX1NJWkUgKilcbiAgbGV0IGluaXRpYWxfc2l6ZSA9XG4gICAgdHJ5XG4gICAgICBTdGRsaWIuaW5fY2hhbm5lbF9sZW5ndGggaWMgLSBTdGRsaWIucG9zX2luIGljXG4gICAgd2l0aCBTeXNfZXJyb3IgXyAtPlxuICAgICAgLTFcbiAgaW5cbiAgbGV0IGluaXRpYWxfc2l6ZSA9IGlmIGluaXRpYWxfc2l6ZSA8IDAgdGhlbiBjaHVua19zaXplIGVsc2UgaW5pdGlhbF9zaXplIGluXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIGlmIGluaXRpYWxfc2l6ZSA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgaW5pdGlhbF9zaXplXG4gICAgZWxzZVxuICAgICAgU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gIGluXG4gIGxldCBidWYgPSBCeXRlcy5jcmVhdGUgaW5pdGlhbF9zaXplIGluXG4gIGxldCBucmVhZCA9IHJlYWRfdXB0byBpYyBidWYgMCBpbml0aWFsX3NpemUgaW5cbiAgaWYgbnJlYWQgPCBpbml0aWFsX3NpemUgdGhlbiAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIHBhcnRpYWxseSBmaWxsZWQgKilcbiAgICBCeXRlcy5zdWJfc3RyaW5nIGJ1ZiAwIG5yZWFkXG4gIGVsc2UgYmVnaW4gKCogbnJlYWQgPSBpbml0aWFsX3NpemUsIG1heWJlIEVPRiByZWFjaGVkICopXG4gICAgbWF0Y2ggU3RkbGliLmlucHV0X2NoYXIgaWMgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+XG4gICAgICAgICgqIEVPRiByZWFjaGVkLCBidWZmZXIgaXMgY29tcGxldGVseSBmaWxsZWQgKilcbiAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBidWZcbiAgICB8IGMgLT5cbiAgICAgICAgKCogRU9GIG5vdCByZWFjaGVkICopXG4gICAgICAgIGxldCByZWMgbG9vcCBidWYgb2ZzID1cbiAgICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBvZnMgY2h1bmtfc2l6ZSBpblxuICAgICAgICAgIGxldCByZW0gPSBCeXRlcy5sZW5ndGggYnVmIC0gb2ZzIGluXG4gICAgICAgICAgKCogW3JlbV0gY2FuIGJlIDwgW2NodW5rX3NpemVdIGlmIGJ1ZmZlciBzaXplIGNsb3NlIHRvXG4gICAgICAgICAgICAgW1N5cy5tYXhfc3RyaW5nX2xlbmd0aF0gKilcbiAgICAgICAgICBsZXQgciA9IHJlYWRfdXB0byBpYyBidWYgb2ZzIHJlbSBpblxuICAgICAgICAgIGlmIHIgPCByZW0gdGhlbiAoKiBFT0YgcmVhY2hlZCAqKVxuICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCAob2ZzICsgcilcbiAgICAgICAgICBlbHNlICgqIHIgPSByZW0gKilcbiAgICAgICAgICAgIGxvb3AgYnVmIChvZnMgKyByZW0pXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWYgPSBlbnN1cmUgYnVmIG5yZWFkIChjaHVua19zaXplICsgMSkgaW5cbiAgICAgICAgQnl0ZXMuc2V0IGJ1ZiBucmVhZCBjO1xuICAgICAgICBsb29wIGJ1ZiAobnJlYWQgKyAxKVxuICBlbmRcblxubGV0IHNldF9iaW5hcnlfbW9kZSA9IFN0ZGxpYi5zZXRfYmluYXJ5X21vZGVfaW5cbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSB0ID0gb3V0X2NoYW5uZWxcblxudHlwZSBvcGVuX2ZsYWcgPSBTdGRsaWIub3Blbl9mbGFnID1cbiAgfCBPcGVuX3Jkb25seVxuICB8IE9wZW5fd3Jvbmx5XG4gIHwgT3Blbl9hcHBlbmRcbiAgfCBPcGVuX2NyZWF0XG4gIHwgT3Blbl90cnVuY1xuICB8IE9wZW5fZXhjbFxuICB8IE9wZW5fYmluYXJ5XG4gIHwgT3Blbl90ZXh0XG4gIHwgT3Blbl9ub25ibG9ja1xuXG5sZXQgc3Rkb3V0ID0gU3RkbGliLnN0ZG91dFxubGV0IHN0ZGVyciA9IFN0ZGxpYi5zdGRlcnJcbmxldCBvcGVuX2JpbiA9IFN0ZGxpYi5vcGVuX291dF9iaW5cbmxldCBvcGVuX3RleHQgPSBTdGRsaWIub3Blbl9vdXRcbmxldCBvcGVuX2dlbiA9IFN0ZGxpYi5vcGVuX291dF9nZW5cblxubGV0IHdpdGhfb3BlbiBvcGVuZnVuIHMgZiA9XG4gIGxldCBvYyA9IG9wZW5mdW4gcyBpblxuICBGdW4ucHJvdGVjdCB+ZmluYWxseTooZnVuICgpIC0+IFN0ZGxpYi5jbG9zZV9vdXRfbm9lcnIgb2MpXG4gICAgKGZ1biAoKSAtPiBmIG9jKVxuXG5sZXQgd2l0aF9vcGVuX2JpbiBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5fb3V0X2JpbiBzIGZcblxubGV0IHdpdGhfb3Blbl90ZXh0IHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9vdXQgcyBmXG5cbmxldCB3aXRoX29wZW5fZ2VuIGZsYWdzIHBlcm0gcyBmID1cbiAgd2l0aF9vcGVuIChTdGRsaWIub3Blbl9vdXRfZ2VuIGZsYWdzIHBlcm0pIHMgZlxuXG5sZXQgc2VlayA9IFN0ZGxpYi5MYXJnZUZpbGUuc2Vla19vdXRcbmxldCBwb3MgPSBTdGRsaWIuTGFyZ2VGaWxlLnBvc19vdXRcbmxldCBsZW5ndGggPSBTdGRsaWIuTGFyZ2VGaWxlLm91dF9jaGFubmVsX2xlbmd0aFxubGV0IGNsb3NlID0gU3RkbGliLmNsb3NlX291dFxubGV0IGNsb3NlX25vZXJyID0gU3RkbGliLmNsb3NlX291dF9ub2VyclxubGV0IGZsdXNoID0gU3RkbGliLmZsdXNoXG5sZXQgZmx1c2hfYWxsID0gU3RkbGliLmZsdXNoX2FsbFxubGV0IG91dHB1dF9jaGFyID0gU3RkbGliLm91dHB1dF9jaGFyXG5sZXQgb3V0cHV0X2J5dGUgPSBTdGRsaWIub3V0cHV0X2J5dGVcbmxldCBvdXRwdXRfc3RyaW5nID0gU3RkbGliLm91dHB1dF9zdHJpbmdcbmxldCBvdXRwdXRfYnl0ZXMgPSBTdGRsaWIub3V0cHV0X2J5dGVzXG5sZXQgb3V0cHV0ID0gU3RkbGliLm91dHB1dFxubGV0IG91dHB1dF9zdWJzdHJpbmcgPSBTdGRsaWIub3V0cHV0X3N1YnN0cmluZ1xubGV0IHNldF9iaW5hcnlfbW9kZSA9IFN0ZGxpYi5zZXRfYmluYXJ5X21vZGVfb3V0XG5cbmV4dGVybmFsIHNldF9idWZmZXJlZCA6IHQgLT4gYm9vbCAtPiB1bml0ID0gXCJjYW1sX21sX3NldF9idWZmZXJlZFwiXG5cbmV4dGVybmFsIGlzX2J1ZmZlcmVkIDogdCAtPiBib29sID0gXCJjYW1sX21sX2lzX2J1ZmZlcmVkXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgS0MgU2l2YXJhbWFrcmlzaG5hbiwgSW5kaWFuIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBNYWRyYXMgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgSW5kaWFuIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBNYWRyYXMgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAnYSB0ID0gLi5cbmV4dGVybmFsIHBlcmZvcm0gOiAnYSB0IC0+ICdhID0gXCIlcGVyZm9ybVwiXG5cbnR5cGUgZXhuICs9IFVuaGFuZGxlZDogJ2EgdCAtPiBleG5cbmV4Y2VwdGlvbiBDb250aW51YXRpb25fYWxyZWFkeV9yZXN1bWVkXG5cbmxldCAoKSA9XG4gIGxldCBwcmludGVyID0gZnVuY3Rpb25cbiAgICB8IFVuaGFuZGxlZCB4IC0+XG4gICAgICAgIGxldCBtc2cgPSBQcmludGYuc3ByaW50ZiBcIlN0ZGxpYi5FZmZlY3QuVW5oYW5kbGVkKCVzKVwiXG4gICAgICAgICAgICAoUHJpbnRleGMuc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciBAQCBPYmoucmVwciB4KVxuICAgICAgICBpblxuICAgICAgICBTb21lIG1zZ1xuICAgIHwgXyAtPiBOb25lXG4gIGluXG4gIFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgcHJpbnRlclxuXG4oKiBSZWdpc3RlciB0aGUgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiBhY2Nlc3MgaXQgKilcbnR5cGUgXyB0ICs9IFNob3VsZF9ub3Rfc2VlX3RoaXNfXyA6IHVuaXQgdFxubGV0IF8gPSBDYWxsYmFjay5yZWdpc3Rlcl9leGNlcHRpb24gXCJFZmZlY3QuVW5oYW5kbGVkXCJcbiAgICAgICAgICAoVW5oYW5kbGVkIFNob3VsZF9ub3Rfc2VlX3RoaXNfXylcbmxldCBfID0gQ2FsbGJhY2sucmVnaXN0ZXJfZXhjZXB0aW9uIFwiRWZmZWN0LkNvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcIlxuICAgICAgICAgIENvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcblxudHlwZSAoJ2EsICdiKSBzdGFja1xuXG5leHRlcm5hbCByZXN1bWUgOiAoJ2EsICdiKSBzdGFjayAtPiAoJ2MgLT4gJ2EpIC0+ICdjIC0+ICdiID0gXCIlcmVzdW1lXCJcbmV4dGVybmFsIHJ1bnN0YWNrIDogKCdhLCAnYikgc3RhY2sgLT4gKCdjIC0+ICdhKSAtPiAnYyAtPiAnYiA9IFwiJXJ1bnN0YWNrXCJcblxubW9kdWxlIERlZXAgPSBzdHJ1Y3RcblxuICB0eXBlICgnYSwnYikgY29udGludWF0aW9uXG4gIHR5cGUgbGFzdF9maWJlclxuXG4gIGV4dGVybmFsIHRha2VfY29udF9ub2V4YyA6ICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiAtPiAoJ2EsICdiKSBzdGFjayA9XG4gICAgXCJjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGNcIiBbQEBub2FsbG9jXVxuICBleHRlcm5hbCBhbGxvY19zdGFjayA6XG4gICAgKCdhIC0+ICdiKSAtPlxuICAgIChleG4gLT4gJ2IpIC0+XG4gICAgKCdjIHQgLT4gKCdjLCAnYikgY29udGludWF0aW9uIC0+IGxhc3RfZmliZXIgLT4gJ2IpIC0+XG4gICAgKCdhLCAnYikgc3RhY2sgPSBcImNhbWxfYWxsb2Nfc3RhY2tcIlxuXG4gIGxldCBjb250aW51ZSBrIHYgPSByZXN1bWUgKHRha2VfY29udF9ub2V4YyBrKSAoZnVuIHggLT4geCkgdlxuXG4gIGxldCBkaXNjb250aW51ZSBrIGUgPSByZXN1bWUgKHRha2VfY29udF9ub2V4YyBrKSAoZnVuIGUgLT4gcmFpc2UgZSkgZVxuXG4gIGxldCBkaXNjb250aW51ZV93aXRoX2JhY2t0cmFjZSBrIGUgYnQgPSByZXN1bWUgKHRha2VfY29udF9ub2V4YyBrKSAoZnVuIGUgLT5cbiAgICBQcmludGV4Yy5yYWlzZV93aXRoX2JhY2t0cmFjZSBlIGJ0KSBlXG5cbiAgdHlwZSAoJ2EsJ2IpIGhhbmRsZXIgPVxuICAgIHsgcmV0YzogJ2EgLT4gJ2I7XG4gICAgICBleG5jOiBleG4gLT4gJ2I7XG4gICAgICBlZmZjOiAnYy4nYyB0IC0+ICgoJ2MsJ2IpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuICBleHRlcm5hbCByZXBlcmZvcm0gOlxuICAgICdhIHQgLT4gKCdhLCAnYikgY29udGludWF0aW9uIC0+IGxhc3RfZmliZXIgLT4gJ2IgPSBcIiVyZXBlcmZvcm1cIlxuXG4gIGxldCBtYXRjaF93aXRoIGNvbXAgYXJnIGhhbmRsZXIgPVxuICAgIGxldCBlZmZjIGVmZiBrIGxhc3RfZmliZXIgPVxuICAgICAgbWF0Y2ggaGFuZGxlci5lZmZjIGVmZiB3aXRoXG4gICAgICB8IFNvbWUgZiAtPiBmIGtcbiAgICAgIHwgTm9uZSAtPiByZXBlcmZvcm0gZWZmIGsgbGFzdF9maWJlclxuICAgIGluXG4gICAgbGV0IHMgPSBhbGxvY19zdGFjayBoYW5kbGVyLnJldGMgaGFuZGxlci5leG5jIGVmZmMgaW5cbiAgICBydW5zdGFjayBzIGNvbXAgYXJnXG5cbiAgdHlwZSAnYSBlZmZlY3RfaGFuZGxlciA9XG4gICAgeyBlZmZjOiAnYi4gJ2IgdCAtPiAoKCdiLCdhKSBjb250aW51YXRpb24gLT4gJ2EpIG9wdGlvbiB9XG5cbiAgbGV0IHRyeV93aXRoIGNvbXAgYXJnIGhhbmRsZXIgPVxuICAgIGxldCBlZmZjJyBlZmYgayBsYXN0X2ZpYmVyID1cbiAgICAgIG1hdGNoIGhhbmRsZXIuZWZmYyBlZmYgd2l0aFxuICAgICAgfCBTb21lIGYgLT4gZiBrXG4gICAgICB8IE5vbmUgLT4gcmVwZXJmb3JtIGVmZiBrIGxhc3RfZmliZXJcbiAgICBpblxuICAgIGxldCBzID0gYWxsb2Nfc3RhY2sgKGZ1biB4IC0+IHgpIChmdW4gZSAtPiByYWlzZSBlKSBlZmZjJyBpblxuICAgIHJ1bnN0YWNrIHMgY29tcCBhcmdcblxuICBleHRlcm5hbCBnZXRfY2FsbHN0YWNrIDpcbiAgICAoJ2EsJ2IpIGNvbnRpbnVhdGlvbiAtPiBpbnQgLT4gUHJpbnRleGMucmF3X2JhY2t0cmFjZSA9XG4gICAgXCJjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrXCJcbmVuZFxuXG5tb2R1bGUgU2hhbGxvdyA9IHN0cnVjdFxuXG4gIHR5cGUgKCdhLCdiKSBjb250aW51YXRpb25cbiAgdHlwZSBsYXN0X2ZpYmVyXG5cbiAgZXh0ZXJuYWwgYWxsb2Nfc3RhY2sgOlxuICAgICgnYSAtPiAnYikgLT5cbiAgICAoZXhuIC0+ICdiKSAtPlxuICAgICgnYyB0IC0+ICgnYywgJ2IpIGNvbnRpbnVhdGlvbiAtPiBsYXN0X2ZpYmVyIC0+ICdiKSAtPlxuICAgICgnYSwgJ2IpIHN0YWNrID0gXCJjYW1sX2FsbG9jX3N0YWNrXCJcblxuXG4gIGxldCBmaWJlciA6IHR5cGUgYSBiLiAoYSAtPiBiKSAtPiAoYSwgYikgY29udGludWF0aW9uID0gZnVuIGYgLT5cbiAgICBsZXQgbW9kdWxlIE0gPSBzdHJ1Y3QgdHlwZSBfIHQgKz0gSW5pdGlhbF9zZXR1cF9fIDogYSB0IGVuZCBpblxuICAgIGxldCBleGNlcHRpb24gRSBvZiAoYSxiKSBjb250aW51YXRpb24gaW5cbiAgICBsZXQgZicgKCkgPSBmIChwZXJmb3JtIE0uSW5pdGlhbF9zZXR1cF9fKSBpblxuICAgIGxldCBlcnJvciBfID0gZmFpbHdpdGggXCJpbXBvc3NpYmxlXCIgaW5cbiAgICBsZXQgZWZmYyBlZmYgayBfbGFzdF9maWJlciA9XG4gICAgICBtYXRjaCBlZmYgd2l0aFxuICAgICAgfCBNLkluaXRpYWxfc2V0dXBfXyAtPiByYWlzZV9ub3RyYWNlIChFIGspXG4gICAgICB8IF8gLT4gZXJyb3IgKClcbiAgICBpblxuICAgIGxldCBzID0gYWxsb2Nfc3RhY2sgZXJyb3IgZXJyb3IgZWZmYyBpblxuICAgIG1hdGNoIHJ1bnN0YWNrIHMgZicgKCkgd2l0aFxuICAgIHwgZXhjZXB0aW9uIEUgayAtPiBrXG4gICAgfCBfIC0+IGVycm9yICgpXG5cbiAgdHlwZSAoJ2EsJ2IpIGhhbmRsZXIgPVxuICAgIHsgcmV0YzogJ2EgLT4gJ2I7XG4gICAgICBleG5jOiBleG4gLT4gJ2I7XG4gICAgICBlZmZjOiAnYy4nYyB0IC0+ICgoJ2MsJ2EpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuICBleHRlcm5hbCB1cGRhdGVfaGFuZGxlciA6XG4gICAgKCdhLCdiKSBjb250aW51YXRpb24gLT5cbiAgICAoJ2IgLT4gJ2MpIC0+XG4gICAgKGV4biAtPiAnYykgLT5cbiAgICAoJ2QgdCAtPiAoJ2QsJ2IpIGNvbnRpbnVhdGlvbiAtPiBsYXN0X2ZpYmVyIC0+ICdjKSAtPlxuICAgICgnYSwnYykgc3RhY2sgPSBcImNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGNcIiBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIHJlcGVyZm9ybSA6XG4gICAgJ2EgdCAtPiAoJ2EsICdiKSBjb250aW51YXRpb24gLT4gbGFzdF9maWJlciAtPiAnYyA9IFwiJXJlcGVyZm9ybVwiXG5cbiAgbGV0IGNvbnRpbnVlX2dlbiBrIHJlc3VtZV9mdW4gdiBoYW5kbGVyID1cbiAgICBsZXQgZWZmYyBlZmYgayBsYXN0X2ZpYmVyID1cbiAgICAgIG1hdGNoIGhhbmRsZXIuZWZmYyBlZmYgd2l0aFxuICAgICAgfCBTb21lIGYgLT4gZiBrXG4gICAgICB8IE5vbmUgLT4gcmVwZXJmb3JtIGVmZiBrIGxhc3RfZmliZXJcbiAgICBpblxuICAgIGxldCBzdGFjayA9IHVwZGF0ZV9oYW5kbGVyIGsgaGFuZGxlci5yZXRjIGhhbmRsZXIuZXhuYyBlZmZjIGluXG4gICAgcmVzdW1lIHN0YWNrIHJlc3VtZV9mdW4gdlxuXG4gIGxldCBjb250aW51ZV93aXRoIGsgdiBoYW5kbGVyID1cbiAgICBjb250aW51ZV9nZW4gayAoZnVuIHggLT4geCkgdiBoYW5kbGVyXG5cbiAgbGV0IGRpc2NvbnRpbnVlX3dpdGggayB2IGhhbmRsZXIgPVxuICAgIGNvbnRpbnVlX2dlbiBrIChmdW4gZSAtPiByYWlzZSBlKSB2IGhhbmRsZXJcblxuICBsZXQgZGlzY29udGludWVfd2l0aF9iYWNrdHJhY2UgayB2IGJ0IGhhbmRsZXIgPVxuICAgIGNvbnRpbnVlX2dlbiBrIChmdW4gZSAtPiBQcmludGV4Yy5yYWlzZV93aXRoX2JhY2t0cmFjZSBlIGJ0KSB2IGhhbmRsZXJcblxuICBleHRlcm5hbCBnZXRfY2FsbHN0YWNrIDpcbiAgICAoJ2EsJ2IpIGNvbnRpbnVhdGlvbiAtPiBpbnQgLT4gUHJpbnRleGMucmF3X2JhY2t0cmFjZSA9XG4gICAgXCJjYW1sX2dldF9jb250aW51YXRpb25fY2FsbHN0YWNrXCJcbmVuZFxuIiwiKCogZ2VuZXJhdGVkIGJ5IGR1bmUgKilcblxuKCoqIEBjYW5vbmljYWwgSnNvb19ydW50aW1lLlJ1bnRpbWVfdmVyc2lvbiAqKVxubW9kdWxlIFJ1bnRpbWVfdmVyc2lvbiA9IEpzb29fcnVudGltZV9fUnVudGltZV92ZXJzaW9uXG5cbm1vZHVsZSBKc29vX3J1bnRpbWVfXyA9IHN0cnVjdCBlbmRcbltAQGRlcHJlY2F0ZWQgXCJ0aGlzIG1vZHVsZSBpcyBzaGFkb3dlZFwiXVxuIiwibW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgdFxuXG4gIHR5cGUgJ2EganNfYXJyYXkgPSB0XG5cbiAgdHlwZSAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrID0gdFxuXG4gIGV4dGVybmFsIHN0cmluZyA6IHN0cmluZyAtPiB0ID0gXCJjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBleHRlcm5hbCBieXRlc3RyaW5nIDogc3RyaW5nIC0+IHQgPSBcImNhbWxfanNieXRlc19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNieXRlc1wiXG5cbiAgZXh0ZXJuYWwgYm9vbCA6IGJvb2wgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG4gIGV4dGVybmFsIHRvX2Jvb2wgOiB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbiAgZXh0ZXJuYWwgYXJyYXkgOiAnYSBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Zyb21fYXJyYXlcIlxuXG4gIGV4dGVybmFsIHRvX2FycmF5IDogdCAtPiAnYSBhcnJheSA9IFwiY2FtbF9qc190b19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2Zsb2F0XCJcblxuICBleHRlcm5hbCBmbG9hdF9vZl9udW1iZXIgOiB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuICBleHRlcm5hbCB0eXBlb2YgOiB0IC0+IHQgPSBcImNhbWxfanNfdHlwZW9mXCJcblxuICBleHRlcm5hbCBpbnN0YW5jZW9mIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfanNfaW5zdGFuY2VvZlwiXG5cbiAgZXh0ZXJuYWwgZGVidWdnZXIgOiB1bml0IC0+IHVuaXQgPSBcImRlYnVnZ2VyXCJcblxuICBleHRlcm5hbCBnZXQgOiB0IC0+IHQgLT4gdCA9IFwiY2FtbF9qc19nZXRcIlxuXG4gIGV4dGVybmFsIHNldCA6IHQgLT4gdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfanNfc2V0XCJcblxuICBleHRlcm5hbCBkZWxldGUgOiB0IC0+IHQgLT4gdW5pdCA9IFwiY2FtbF9qc19kZWxldGVcIlxuXG4gIGV4dGVybmFsIGNhbGwgOiB0IC0+IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2NhbGxcIlxuXG4gIGV4dGVybmFsIGZ1bl9jYWxsIDogdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfZnVuX2NhbGxcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbCA6IHQgLT4gc3RyaW5nIC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19tZXRoX2NhbGxcIlxuXG4gIGV4dGVybmFsIG5ld19vYmogOiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19uZXdcIlxuXG4gIGV4dGVybmFsIG5ld19vYmpfYXJyIDogdCAtPiB0IGpzX2FycmF5IC0+IHQgPSBcImNhbWxfb2pzX25ld19hcnJcIlxuXG4gIGV4dGVybmFsIG9iaiA6IChzdHJpbmcgKiB0KSBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX29iamVjdFwiXG5cbiAgZXh0ZXJuYWwgZXF1YWxzIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfanNfZXF1YWxzXCJcblxuICBleHRlcm5hbCBwdXJlX2V4cHIgOiAodW5pdCAtPiAnYSkgLT4gJ2EgPSBcImNhbWxfanNfcHVyZV9leHByXCJcblxuICBleHRlcm5hbCBldmFsX3N0cmluZyA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19ldmFsX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwganNfZXhwciA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19leHByXCJcblxuICBleHRlcm5hbCBwdXJlX2pzX2V4cHIgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfcHVyZV9qc19leHByXCJcblxuICBleHRlcm5hbCBjYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfdW5zYWZlXCJcblxuICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgKHQganNfYXJyYXkgLT4gJ2IpIC0+ICgnYywgdCBqc19hcnJheSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzXCJcblxuICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0XCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3RcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICgnYiAtPiB0IGpzX2FycmF5IC0+ICdhKSAtPiAoJ2IsIHQganNfYXJyYXkgLT4gJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzXCJcblxuICBleHRlcm5hbCB3cmFwX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja1wiXG5cbiAgZXh0ZXJuYWwgd3JhcF9tZXRoX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrXCJcbmVuZFxuXG5tb2R1bGUgU3lzID0gc3RydWN0XG4gIHR5cGUgJ2EgY2FsbGJhY2sgPSAnYVxuXG4gIGV4dGVybmFsIGNyZWF0ZV9maWxlIDogbmFtZTpzdHJpbmcgLT4gY29udGVudDpzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9jcmVhdGVfZmlsZVwiXG5cbiAgZXh0ZXJuYWwgcmVhZF9maWxlIDogbmFtZTpzdHJpbmcgLT4gc3RyaW5nID0gXCJjYW1sX3JlYWRfZmlsZV9jb250ZW50XCJcblxuICBleHRlcm5hbCBzZXRfY2hhbm5lbF9vdXRwdXQnIDogb3V0X2NoYW5uZWwgLT4gKGpzX3N0cmluZzpKcy50IC0+IHVuaXQpIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9zZXRfY2hhbm5lbF9vdXRwdXRcIlxuXG4gIGV4dGVybmFsIHNldF9jaGFubmVsX2lucHV0JyA6IGluX2NoYW5uZWwgLT4gKHVuaXQgLT4gc3RyaW5nKSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsXCJcblxuICBleHRlcm5hbCBtb3VudF9wb2ludCA6IHVuaXQgLT4gc3RyaW5nIGxpc3QgPSBcImNhbWxfbGlzdF9tb3VudF9wb2ludFwiXG5cbiAgZXh0ZXJuYWwgbW91bnRfYXV0b2xvYWQgOiBzdHJpbmcgLT4gKHN0cmluZyAtPiBzdHJpbmcgLT4gc3RyaW5nIG9wdGlvbikgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21vdW50X2F1dG9sb2FkXCJcblxuICBleHRlcm5hbCB1bm1vdW50IDogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfdW5tb3VudFwiXG5cbiAgbW9kdWxlIENvbmZpZyA9IHN0cnVjdFxuICAgIGV4dGVybmFsIHVzZV9qc19zdHJpbmcgOiB1bml0IC0+IGJvb2wgPSBcImNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXCJcblxuICAgIGV4dGVybmFsIGVmZmVjdHMgOiB1bml0IC0+IGJvb2wgPSBcImNhbWxfanNvb19mbGFnc19lZmZlY3RzXCJcbiAgZW5kXG5cbiAgbGV0IHZlcnNpb24gPSBSdW50aW1lX3ZlcnNpb24uc1xuXG4gIGxldCBnaXRfdmVyc2lvbiA9IFJ1bnRpbWVfdmVyc2lvbi5naXRfdmVyc2lvblxuZW5kXG5cbm1vZHVsZSBFcnJvciA6IHNpZ1xuICB0eXBlIHRcblxuICB2YWwgcmFpc2VfIDogdCAtPiAnYVxuXG4gIHZhbCBhdHRhY2hfanNfYmFja3RyYWNlIDogZXhuIC0+IGZvcmNlOmJvb2wgLT4gZXhuXG4gICgqKiBBdHRhY2ggYSBKYXZhc1NjcmlwdCBlcnJvciB0byBhbiBPQ2FtbCBleGNlcHRpb24uICBpZiBbZm9yY2UgPSBmYWxzZV0gYW5kIGFcbiAgICBKYXZhc1NjcmlwdCBlcnJvciBpcyBhbHJlYWR5IGF0dGFjaGVkLCBpdCB3aWxsIGRvIG5vdGhpbmcuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvXG4gICAgc3RvcmUgYW5kIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IEphdmFTY3JpcHQgc3RhY2sgdHJhY2VzLlxuXG4gICAgQXR0YWNoaW5nIEphdmFzU2NyaXB0IGVycm9ycyB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IHdoZW4gY29tcGlsaW5nIHdpdGhcbiAgICBbLS1lbmFibGUgd2l0aC1qcy1lcnJvcl0uICopXG5cbiAgdmFsIG9mX2V4biA6IGV4biAtPiB0IG9wdGlvblxuICAoKiogRXh0cmFjdCBhIEphdmFTY3JpcHQgZXJyb3IgYXR0YWNoZWQgdG8gYW4gT0NhbWwgZXhjZXB0aW9uLCBpZiBhbnkuICBUaGlzIGlzIHVzZWZ1bCB0b1xuICAgICAgaW5zcGVjdCBhbiBldmVudHVhbCBzdGFjayBzdHJhY2UsIGVzcGVjaWFsbHkgd2hlbiBzb3VyY2VtYXAgaXMgZW5hYmxlZC4gKilcblxuICBleGNlcHRpb24gRXhuIG9mIHRcbiAgKCoqIFRoZSBbRXJyb3JdIGV4Y2VwdGlvbiB3cmFwIGphdmFzY3JpcHQgZXhjZXB0aW9ucyB3aGVuIGNhdWdodCBieSBPQ2FtbCBjb2RlLlxuICAgICAgSW4gY2FzZSB0aGUgamF2YXNjcmlwdCBleGNlcHRpb24gaXMgbm90IGFuIGluc3RhbmNlIG9mIGphdmFzY3JpcHQgW0Vycm9yXSxcbiAgICAgIGl0IHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgd3JhcHBlZCBpbnRvIGEgW0ZhaWx1cmVdIGV4Y2VwdGlvbi5cbiAgKilcbmVuZCA9IHN0cnVjdFxuICB0eXBlIHRcblxuICBleGNlcHRpb24gRXhuIG9mIHRcblxuICBsZXQgXyA9IENhbGxiYWNrLnJlZ2lzdGVyX2V4Y2VwdGlvbiBcImpzRXJyb3JcIiAoRXhuIChPYmoubWFnaWMgW3x8XSkpXG5cbiAgbGV0IHJhaXNlXyA6IHQgLT4gJ2EgPSBKcy5qc19leHByIFwiKGZ1bmN0aW9uIChleG4pIHsgdGhyb3cgZXhuIH0pXCJcblxuICBleHRlcm5hbCBvZl9leG4gOiBleG4gLT4gdCBvcHRpb24gPSBcImNhbWxfanNfZXJyb3Jfb3B0aW9uX29mX2V4Y2VwdGlvblwiXG5cbiAgZXh0ZXJuYWwgYXR0YWNoX2pzX2JhY2t0cmFjZSA6IGV4biAtPiBmb3JjZTpib29sIC0+IGV4biA9IFwiY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2VcIlxuZW5kXG5cbltAQEBvY2FtbC53YXJuaW5nIFwiLTMyLTYwXCJdXG5cbm1vZHVsZSBGb3JfY29tcGF0aWJpbGl0eV9vbmx5ID0gc3RydWN0XG4gICgqIEFkZCBwcmltaXRpdmVzIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIEV4aXN0aW5nIHVzZXJzIG1pZ2h0XG4gICAgIGRlcGVuZCBvbiBpdCAoZS5nLiBnZW5fanNfYXBpKSwgd2UgZG9udCB3YW50IHRoZSBvY2FtbCBjb21waWxlclxuICAgICB0byBjb21wbGFpbiBhYm91dCB0aGVzZXMgbWlzc2luZyBwcmltaXRpdmVzLiAqKVxuXG4gIGV4dGVybmFsIGNhbWxfanNfZnJvbV9zdHJpbmcgOiBzdHJpbmcgLT4gSnMudCA9IFwiY2FtbF9qc19mcm9tX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc190b19ieXRlX3N0cmluZyA6IEpzLnQgLT4gc3RyaW5nID0gXCJjYW1sX2pzX3RvX2J5dGVfc3RyaW5nXCJcblxuICBleHRlcm5hbCBjYW1sX2pzX3RvX3N0cmluZyA6IEpzLnQgLT4gc3RyaW5nID0gXCJjYW1sX2pzX3RvX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgY2FtbF9saXN0X29mX2pzX2FycmF5IDogJ2EgSnMuanNfYXJyYXkgLT4gJ2EgbGlzdCA9IFwiY2FtbF9saXN0X29mX2pzX2FycmF5XCJcblxuICBleHRlcm5hbCBjYW1sX2xpc3RfdG9fanNfYXJyYXkgOiAnYSBsaXN0IC0+ICdhIEpzLmpzX2FycmF5ID0gXCJjYW1sX2xpc3RfdG9fanNfYXJyYXlcIlxuXG4gIGV4dGVybmFsIHZhcmlhYmxlIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX3ZhclwiXG5lbmRcblxubW9kdWxlIFR5cGVkX2FycmF5ID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdHlwZWRBcnJheSA9IEpzLnRcblxuICB0eXBlIGFycmF5QnVmZmVyID0gSnMudFxuXG4gIHR5cGUgdWludDhBcnJheSA9IEpzLnRcblxuICBleHRlcm5hbCBraW5kIDogKCdhLCAnYikgdHlwZWRBcnJheSAtPiAoJ2EsICdiKSBCaWdhcnJheS5raW5kXG4gICAgPSBcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgZnJvbV9nZW5hcnJheSA6XG4gICAgKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheVxuICAgID0gXCJjYW1sX2JhX3RvX3R5cGVkX2FycmF5XCJcblxuICBleHRlcm5hbCB0b19nZW5hcnJheSA6XG4gICAgKCdhLCAnYikgdHlwZWRBcnJheSAtPiAoJ2EsICdiLCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuR2VuYXJyYXkudFxuICAgID0gXCJjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXlcIlxuXG4gIG1vZHVsZSBCaWdzdHJpbmcgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSAoY2hhciwgQmlnYXJyYXkuaW50OF91bnNpZ25lZF9lbHQsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5BcnJheTEudFxuXG4gICAgZXh0ZXJuYWwgdG9fYXJyYXlCdWZmZXIgOiB0IC0+IGFycmF5QnVmZmVyID0gXCJiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyXCJcblxuICAgIGV4dGVybmFsIHRvX3VpbnQ4QXJyYXkgOiB0IC0+IHVpbnQ4QXJyYXkgPSBcImJpZ3N0cmluZ190b190eXBlZF9hcnJheVwiXG5cbiAgICBleHRlcm5hbCBvZl9hcnJheUJ1ZmZlciA6IGFycmF5QnVmZmVyIC0+IHQgPSBcImJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXJcIlxuXG4gICAgZXh0ZXJuYWwgb2ZfdWludDhBcnJheSA6IHVpbnQ4QXJyYXkgLT4gdCA9IFwiYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5XCJcbiAgZW5kXG5cbiAgZXh0ZXJuYWwgb2ZfdWludDhBcnJheSA6IHVpbnQ4QXJyYXkgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9hcnJheVwiXG5lbmRcblxubW9kdWxlIEludDY0ID0gc3RydWN0XG4gIGV4dGVybmFsIGNyZWF0ZV9pbnQ2NF9sb19taV9oaSA6IGludCAtPiBpbnQgLT4gaW50IC0+IEludDY0LnRcbiAgICA9IFwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGlcIlxuZW5kXG4iLCIoKiBnZW5lcmF0ZWQgYnkgZHVuZSAqKVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5DU1MgKilcbm1vZHVsZSBDU1MgPSBKc19vZl9vY2FtbF9fQ1NTXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkRvbSAqKVxubW9kdWxlIERvbSA9IEpzX29mX29jYW1sX19Eb21cblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRG9tX2V2ZW50cyAqKVxubW9kdWxlIERvbV9ldmVudHMgPSBKc19vZl9vY2FtbF9fRG9tX2V2ZW50c1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Eb21faHRtbCAqKVxubW9kdWxlIERvbV9odG1sID0gSnNfb2Zfb2NhbWxfX0RvbV9odG1sXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkRvbV9zdmcgKilcbm1vZHVsZSBEb21fc3ZnID0gSnNfb2Zfb2NhbWxfX0RvbV9zdmdcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRXZlbnRTb3VyY2UgKilcbm1vZHVsZSBFdmVudFNvdXJjZSA9IEpzX29mX29jYW1sX19FdmVudFNvdXJjZVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5GaWxlICopXG5tb2R1bGUgRmlsZSA9IEpzX29mX29jYW1sX19GaWxlXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkZpcmVidWcgKilcbm1vZHVsZSBGaXJlYnVnID0gSnNfb2Zfb2NhbWxfX0ZpcmVidWdcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRm9ybSAqKVxubW9kdWxlIEZvcm0gPSBKc19vZl9vY2FtbF9fRm9ybVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5HZW9sb2NhdGlvbiAqKVxubW9kdWxlIEdlb2xvY2F0aW9uID0gSnNfb2Zfb2NhbWxfX0dlb2xvY2F0aW9uXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkltcG9ydCAqKVxubW9kdWxlIEltcG9ydCA9IEpzX29mX29jYW1sX19JbXBvcnRcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgKilcbm1vZHVsZSBJbnRlcnNlY3Rpb25PYnNlcnZlciA9IEpzX29mX29jYW1sX19JbnRlcnNlY3Rpb25PYnNlcnZlclxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5JbnRsICopXG5tb2R1bGUgSW50bCA9IEpzX29mX29jYW1sX19JbnRsXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkpzICopXG5tb2R1bGUgSnMgPSBKc19vZl9vY2FtbF9fSnNcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSnNvbiAqKVxubW9kdWxlIEpzb24gPSBKc19vZl9vY2FtbF9fSnNvblxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Kc3RhYmxlICopXG5tb2R1bGUgSnN0YWJsZSA9IEpzX29mX29jYW1sX19Kc3RhYmxlXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkxpYl92ZXJzaW9uICopXG5tb2R1bGUgTGliX3ZlcnNpb24gPSBKc19vZl9vY2FtbF9fTGliX3ZlcnNpb25cblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuTXV0YXRpb25PYnNlcnZlciAqKVxubW9kdWxlIE11dGF0aW9uT2JzZXJ2ZXIgPSBKc19vZl9vY2FtbF9fTXV0YXRpb25PYnNlcnZlclxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5QZXJmb3JtYW5jZU9ic2VydmVyICopXG5tb2R1bGUgUGVyZm9ybWFuY2VPYnNlcnZlciA9IEpzX29mX29jYW1sX19QZXJmb3JtYW5jZU9ic2VydmVyXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlJlZ2V4cCAqKVxubW9kdWxlIFJlZ2V4cCA9IEpzX29mX29jYW1sX19SZWdleHBcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuUmVzaXplT2JzZXJ2ZXIgKilcbm1vZHVsZSBSZXNpemVPYnNlcnZlciA9IEpzX29mX29jYW1sX19SZXNpemVPYnNlcnZlclxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5TeXNfanMgKilcbm1vZHVsZSBTeXNfanMgPSBKc19vZl9vY2FtbF9fU3lzX2pzXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlR5cGVkX2FycmF5ICopXG5tb2R1bGUgVHlwZWRfYXJyYXkgPSBKc19vZl9vY2FtbF9fVHlwZWRfYXJyYXlcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuVXJsICopXG5tb2R1bGUgVXJsID0gSnNfb2Zfb2NhbWxfX1VybFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5XZWJHTCAqKVxubW9kdWxlIFdlYkdMID0gSnNfb2Zfb2NhbWxfX1dlYkdMXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLldlYlNvY2tldHMgKilcbm1vZHVsZSBXZWJTb2NrZXRzID0gSnNfb2Zfb2NhbWxfX1dlYlNvY2tldHNcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuV29ya2VyICopXG5tb2R1bGUgV29ya2VyID0gSnNfb2Zfb2NhbWxfX1dvcmtlclxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5YbWxIdHRwUmVxdWVzdCAqKVxubW9kdWxlIFhtbEh0dHBSZXF1ZXN0ID0gSnNfb2Zfb2NhbWxfX1htbEh0dHBSZXF1ZXN0XG5cbm1vZHVsZSBKc19vZl9vY2FtbF9fID0gc3RydWN0IGVuZFxuW0BAZGVwcmVjYXRlZCBcInRoaXMgbW9kdWxlIGlzIHNoYWRvd2VkXCJdXG4iLCIoKiBKc19vZl9vY2FtbFxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCA8ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcblxuICBleHRlcm5hbCAoID49ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcmVxdWFsXCJcblxuICBleHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZW5kXG5cbm1vZHVsZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGV4dGVybmFsICggPCApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuXG4gIGV4dGVybmFsICggPD0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgKCA8PiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPSApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuXG4gIGV4dGVybmFsICggPj0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5cbiAgZXh0ZXJuYWwgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgbGV0IG1heCAoeCA6IGludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbiAgbGV0IG1pbiAoeCA6IGludCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIFN0cmluZyA9IHN0cnVjdFxuICBpbmNsdWRlIFN0cmluZ1xuXG4gIGxldCBlcXVhbCAoeCA6IHN0cmluZykgKHkgOiBzdHJpbmcpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5tb2R1bGUgQ2hhciA9IHN0cnVjdFxuICBpbmNsdWRlIENoYXJcblxuICBsZXQgZXF1YWwgKHggOiBjaGFyKSAoeSA6IGNoYXIpID0gUG9seS5lcXVhbCB4IHlcbmVuZFxuXG5pbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbigqIFRoaXMgbG9jYWwgbW9kdWxlIFtKc10gaXMgbmVlZGVkIHNvIHRoYXQgdGhlIHBweF9qcyBleHRlbnNpb24gd29yayB3aXRoaW4gdGhhdCBmaWxlLiAqKVxubW9kdWxlIEpzID0gc3RydWN0XG4gIHR5cGUgKydhIHRcblxuICB0eXBlICgtJ2EsICsnYikgbWV0aF9jYWxsYmFja1xuXG4gIG1vZHVsZSBVbnNhZmUgPSBzdHJ1Y3RcbiAgICB0eXBlIHRvcFxuXG4gICAgdHlwZSBhbnkgPSB0b3AgdFxuXG4gICAgdHlwZSBhbnlfanNfYXJyYXkgPSBhbnlcblxuICAgIGV4dGVybmFsIGluamVjdCA6ICdhIC0+IGFueSA9IFwiJWlkZW50aXR5XCJcblxuICAgIGV4dGVybmFsIGNvZXJjZSA6IF8gdCAtPiBfIHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgICBleHRlcm5hbCBnZXQgOiAnYSAtPiAnYiAtPiAnYyA9IFwiY2FtbF9qc19nZXRcIlxuXG4gICAgZXh0ZXJuYWwgc2V0IDogJ2EgLT4gJ2IgLT4gJ2MgLT4gdW5pdCA9IFwiY2FtbF9qc19zZXRcIlxuXG4gICAgZXh0ZXJuYWwgZGVsZXRlIDogJ2EgLT4gJ2IgLT4gdW5pdCA9IFwiY2FtbF9qc19kZWxldGVcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbCA6ICdhIC0+ICdiIC0+IGFueSBhcnJheSAtPiAnYyA9IFwiY2FtbF9qc19jYWxsXCJcblxuICAgIGV4dGVybmFsIGZ1bl9jYWxsIDogJ2EgLT4gYW55IGFycmF5IC0+ICdiID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbCA6ICdhIC0+IHN0cmluZyAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICAgIGV4dGVybmFsIG5ld19vYmogOiAnYSAtPiBhbnkgYXJyYXkgLT4gJ2IgPSBcImNhbWxfanNfbmV3XCJcblxuICAgIGV4dGVybmFsIG5ld19vYmpfYXJyIDogJ2EgLT4gYW55X2pzX2FycmF5IC0+ICdiID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICAgIGV4dGVybmFsIG9iaiA6IChzdHJpbmcgKiBhbnkpIGFycmF5IC0+ICdhID0gXCJjYW1sX2pzX29iamVjdFwiXG5cbiAgICBleHRlcm5hbCBlcXVhbHMgOiAnYSAtPiAnYiAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgICBleHRlcm5hbCBwdXJlX2V4cHIgOiAodW5pdCAtPiAnYSkgLT4gJ2EgPSBcImNhbWxfanNfcHVyZV9leHByXCJcblxuICAgIGV4dGVybmFsIGV2YWxfc3RyaW5nIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V2YWxfc3RyaW5nXCJcblxuICAgIGV4dGVybmFsIGpzX2V4cHIgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXhwclwiXG5cbiAgICBleHRlcm5hbCBwdXJlX2pzX2V4cHIgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfcHVyZV9qc19leHByXCJcblxuICAgIGxldCBnbG9iYWwgPSBwdXJlX2pzX2V4cHIgXCJnbG9iYWxUaGlzXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgICAoYW55X2pzX2FycmF5IC0+ICdiKSAtPiAoJ2MsIGFueV9qc19hcnJheSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja19hcmd1bWVudHNcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0XCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmVcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyaXR5IDogaW50IC0+ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAgICgnYiAtPiBhbnlfanNfYXJyYXkgLT4gJ2EpIC0+ICgnYiwgYW55X2pzX2FycmF5IC0+ICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzXCJcblxuICAgICgqIERFUFJFQ0FURUQgKilcbiAgICBleHRlcm5hbCB2YXJpYWJsZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc192YXJcIlxuICBlbmRcblxuICAoKioqKilcblxuICB0eXBlICdhIG9wdCA9ICdhXG5cbiAgdHlwZSAnYSBvcHRkZWYgPSAnYVxuXG4gIGV4dGVybmFsIGRlYnVnZ2VyIDogdW5pdCAtPiB1bml0ID0gXCJkZWJ1Z2dlclwiXG5cbiAgbGV0IG51bGwgOiAnYSBvcHQgPSBVbnNhZmUucHVyZV9qc19leHByIFwibnVsbFwiXG5cbiAgZXh0ZXJuYWwgc29tZSA6ICdhIC0+ICdhIG9wdCA9IFwiJWlkZW50aXR5XCJcblxuICBsZXQgdW5kZWZpbmVkIDogJ2Egb3B0ZGVmID0gVW5zYWZlLnB1cmVfanNfZXhwciBcInVuZGVmaW5lZFwiXG5cbiAgZXh0ZXJuYWwgZGVmIDogJ2EgLT4gJ2Egb3B0ZGVmID0gXCIlaWRlbnRpdHlcIlxuXG4gIG1vZHVsZSB0eXBlIE9QVCA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGVtcHR5IDogJ2EgdFxuXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICdhIHRcblxuICAgIHZhbCBtYXAgOiAnYSB0IC0+ICgnYSAtPiAnYikgLT4gJ2IgdFxuXG4gICAgdmFsIGJpbmQgOiAnYSB0IC0+ICgnYSAtPiAnYiB0KSAtPiAnYiB0XG5cbiAgICB2YWwgdGVzdCA6ICdhIHQgLT4gYm9vbFxuXG4gICAgdmFsIGl0ZXIgOiAnYSB0IC0+ICgnYSAtPiB1bml0KSAtPiB1bml0XG5cbiAgICB2YWwgY2FzZSA6ICdhIHQgLT4gKHVuaXQgLT4gJ2IpIC0+ICgnYSAtPiAnYikgLT4gJ2JcblxuICAgIHZhbCBnZXQgOiAnYSB0IC0+ICh1bml0IC0+ICdhKSAtPiAnYVxuXG4gICAgdmFsIG9wdGlvbiA6ICdhIG9wdGlvbiAtPiAnYSB0XG5cbiAgICB2YWwgdG9fb3B0aW9uIDogJ2EgdCAtPiAnYSBvcHRpb25cbiAgZW5kXG5cbiAgbW9kdWxlIE9wdCA6IE9QVCB3aXRoIHR5cGUgJ2EgdCA9ICdhIG9wdCA9IHN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9ICdhIG9wdFxuXG4gICAgbGV0IGVtcHR5ID0gbnVsbFxuXG4gICAgbGV0IHJldHVybiA9IHNvbWVcblxuICAgIGxldCBtYXAgeCBmID0gaWYgVW5zYWZlLmVxdWFscyB4IG51bGwgdGhlbiBudWxsIGVsc2UgcmV0dXJuIChmIHgpXG5cbiAgICBsZXQgYmluZCB4IGYgPSBpZiBVbnNhZmUuZXF1YWxzIHggbnVsbCB0aGVuIG51bGwgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSBub3QgKFVuc2FmZS5lcXVhbHMgeCBudWxsKVxuXG4gICAgbGV0IGl0ZXIgeCBmID0gaWYgbm90IChVbnNhZmUuZXF1YWxzIHggbnVsbCkgdGhlbiBmIHhcblxuICAgIGxldCBjYXNlIHggZiBnID0gaWYgVW5zYWZlLmVxdWFscyB4IG51bGwgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIFVuc2FmZS5lcXVhbHMgeCBudWxsIHRoZW4gZiAoKSBlbHNlIHhcblxuICAgIGxldCBvcHRpb24geCA9XG4gICAgICBtYXRjaCB4IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBlbXB0eVxuICAgICAgfCBTb21lIHggLT4gcmV0dXJuIHhcblxuICAgIGxldCB0b19vcHRpb24geCA9IGNhc2UgeCAoZnVuICgpIC0+IE5vbmUpIChmdW4geCAtPiBTb21lIHgpXG4gIGVuZFxuXG4gIG1vZHVsZSBPcHRkZWYgOiBPUFQgd2l0aCB0eXBlICdhIHQgPSAnYSBvcHRkZWYgPSBzdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSAnYSBvcHRkZWZcblxuICAgIGxldCBlbXB0eSA9IHVuZGVmaW5lZFxuXG4gICAgbGV0IHJldHVybiA9IGRlZlxuXG4gICAgbGV0IG1hcCB4IGYgPSBpZiB4ID09IHVuZGVmaW5lZCB0aGVuIHVuZGVmaW5lZCBlbHNlIHJldHVybiAoZiB4KVxuXG4gICAgbGV0IGJpbmQgeCBmID0gaWYgeCA9PSB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSBmIHhcblxuICAgIGxldCB0ZXN0IHggPSB4ICE9IHVuZGVmaW5lZFxuXG4gICAgbGV0IGl0ZXIgeCBmID0gaWYgeCAhPSB1bmRlZmluZWQgdGhlbiBmIHhcblxuICAgIGxldCBjYXNlIHggZiBnID0gaWYgeCA9PSB1bmRlZmluZWQgdGhlbiBmICgpIGVsc2UgZyB4XG5cbiAgICBsZXQgZ2V0IHggZiA9IGlmIHggPT0gdW5kZWZpbmVkIHRoZW4gZiAoKSBlbHNlIHhcblxuICAgIGxldCBvcHRpb24geCA9XG4gICAgICBtYXRjaCB4IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBlbXB0eVxuICAgICAgfCBTb21lIHggLT4gcmV0dXJuIHhcblxuICAgIGxldCB0b19vcHRpb24geCA9IGNhc2UgeCAoZnVuICgpIC0+IE5vbmUpIChmdW4geCAtPiBTb21lIHgpXG4gIGVuZFxuXG4gICgqKioqKVxuXG4gIGxldCBjb2VyY2UgeCBmIGcgPSBPcHQuZ2V0IChmIHgpIChmdW4gKCkgLT4gZyB4KVxuXG4gIGxldCBjb2VyY2Vfb3B0IHggZiBnID0gT3B0LmdldCAoT3B0LmJpbmQgeCBmKSAoZnVuICgpIC0+IGcgeClcblxuICAoKioqKilcblxuICB0eXBlICsnYSBtZXRoXG5cbiAgdHlwZSArJ2EgZ2VuX3Byb3BcblxuICB0eXBlICdhIHJlYWRvbmx5X3Byb3AgPSA8IGdldCA6ICdhID4gZ2VuX3Byb3BcblxuICB0eXBlICdhIHdyaXRlb25seV9wcm9wID0gPCBzZXQgOiAnYSAtPiB1bml0ID4gZ2VuX3Byb3BcblxuICB0eXBlICdhIHByb3AgPSA8IGdldCA6ICdhIDsgc2V0IDogJ2EgLT4gdW5pdCA+IGdlbl9wcm9wXG5cbiAgdHlwZSAnYSBvcHRkZWZfcHJvcCA9IDwgZ2V0IDogJ2Egb3B0ZGVmIDsgc2V0IDogJ2EgLT4gdW5pdCA+IGdlbl9wcm9wXG5cbiAgdHlwZSArJ2EgY29uc3RyXG5cbiAgKCoqKiopXG5cbiAgdHlwZSAnYSBjYWxsYmFjayA9ICh1bml0LCAnYSkgbWV0aF9jYWxsYmFja1xuXG4gIGV4dGVybmFsIHdyYXBfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrXCJcblxuICBleHRlcm5hbCB3cmFwX21ldGhfY2FsbGJhY2sgOiAoJ2EgLT4gJ2IpIC0+ICgnYSwgJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tcIlxuXG4gICgqKioqKVxuXG4gIGxldCBfdHJ1ZSA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJ0cnVlXCJcblxuICBsZXQgX2ZhbHNlID0gVW5zYWZlLnB1cmVfanNfZXhwciBcImZhbHNlXCJcblxuICB0eXBlIG1hdGNoX3Jlc3VsdF9oYW5kbGVcblxuICB0eXBlIHN0cmluZ19hcnJheVxuXG4gIGNsYXNzIHR5cGUganNfc3RyaW5nID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHZhbHVlT2YgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBjaGFyQXQgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgY2hhckNvZGVBdCA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICAgICgqIFRoaXMgbWF5IHJldHVybiBOYU4uLi4gKilcbiAgICAgIG1ldGhvZCBjb25jYXQgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBjb25jYXRfMiA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGNvbmNhdF8zIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgY29uY2F0XzQgOlxuICAgICAgICBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBpbmRleE9mIDoganNfc3RyaW5nIHQgLT4gaW50IG1ldGhcblxuICAgICAgbWV0aG9kIGluZGV4T2ZfZnJvbSA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBpbnQgbWV0aFxuXG4gICAgICBtZXRob2QgbGFzdEluZGV4T2YgOiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgICBtZXRob2QgbGFzdEluZGV4T2ZfZnJvbSA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBpbnQgbWV0aFxuXG4gICAgICBtZXRob2QgbG9jYWxlQ29tcGFyZSA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IG1ldGhcblxuICAgICAgbWV0aG9kIF9tYXRjaCA6IHJlZ0V4cCB0IC0+IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCBvcHQgbWV0aFxuXG4gICAgICBtZXRob2Qgbm9ybWFsaXplIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgbm9ybWFsaXplX2Zvcm0gOiBub3JtYWxpemF0aW9uIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgcmVwbGFjZSA6IHJlZ0V4cCB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHJlcGxhY2Vfc3RyaW5nIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc2VhcmNoIDogcmVnRXhwIHQgLT4gaW50IG1ldGhcblxuICAgICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzbGljZV9lbmQgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3BsaXQgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzcGxpdF9saW1pdGVkIDoganNfc3RyaW5nIHQgLT4gaW50IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNwbGl0X3JlZ0V4cCA6IHJlZ0V4cCB0IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNwbGl0X3JlZ0V4cExpbWl0ZWQgOiByZWdFeHAgdCAtPiBpbnQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3Vic3RyaW5nIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzdWJzdHJpbmdfdG9FbmQgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdG9Mb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0b0xvY2FsZUxvd2VyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRvVXBwZXJDYXNlIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdG9Mb2NhbGVVcHBlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0cmltIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgICBlbmRcblxuICBhbmQgcmVnRXhwID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBleGVjIDoganNfc3RyaW5nIHQgLT4gbWF0Y2hfcmVzdWx0X2hhbmRsZSB0IG9wdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0ZXN0IDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc291cmNlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgZ2xvYmFsIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGlnbm9yZUNhc2UgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbXVsdGlsaW5lIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGxhc3RJbmRleCA6IGludCBwcm9wXG4gICAgZW5kXG5cbiAgYW5kIG5vcm1hbGl6YXRpb24gPSBqc19zdHJpbmdcblxuICAoKiBzdHJpbmcgaXMgdXNlZCBieSBwcHhfanMsIGl0IG5lZWRzIHRvIGNvbWUgYmVmb3JlIGFueSB1c2Ugb2YgdGhlXG4gICAgIG5ldyBzeW50YXggaW4gdGhpcyBmaWxlICopXG4gIGV4dGVybmFsIHN0cmluZyA6IHN0cmluZyAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX3N0cmluZyA6IGpzX3N0cmluZyB0IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmdcIlxuXG4gIGxldCBuZmMgPSBzdHJpbmcgXCJORkNcIlxuXG4gIGxldCBuZmQgPSBzdHJpbmcgXCJORkRcIlxuXG4gIGxldCBuZmtjID0gc3RyaW5nIFwiTkZLQ1wiXG5cbiAgbGV0IG5ma2QgPSBzdHJpbmcgXCJORktEXCJcbmVuZFxuXG5pbmNsdWRlIEpzXG5cbmNsYXNzIHR5cGUgc3RyaW5nX2NvbnN0ciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBmcm9tQ2hhckNvZGUgOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxubGV0IHN0cmluZ19jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX1N0cmluZ1xuXG5sZXQgcmVnRXhwID0gVW5zYWZlLmdsb2JhbCMjLl9SZWdFeHBcblxubGV0IHJlZ0V4cF9jb3B5ID0gcmVnRXhwXG5cbmxldCByZWdFeHBfd2l0aEZsYWdzID0gcmVnRXhwXG5cbmNsYXNzIHR5cGUgWydhXSBqc19hcnJheSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBjb25jYXQgOiAnYSBqc19hcnJheSB0IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIGpvaW4gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcG9wIDogJ2Egb3B0ZGVmIG1ldGhcblxuICAgIG1ldGhvZCBwdXNoIDogJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBwdXNoXzIgOiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHB1c2hfMyA6ICdhIC0+ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgcHVzaF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCByZXZlcnNlIDogJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2hpZnQgOiAnYSBvcHRkZWYgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZV9lbmQgOiBpbnQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc29ydCA6ICgnYSAtPiAnYSAtPiBmbG9hdCkgY2FsbGJhY2sgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc29ydF9hc1N0cmluZ3MgOiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpY2UgOiBpbnQgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGljZV8xIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpY2VfMiA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaWNlXzMgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGljZV80IDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCB1bnNoaWZ0IDogJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCB1bnNoaWZ0XzIgOiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc2hpZnRfMyA6ICdhIC0+ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgdW5zaGlmdF80IDogJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBzb21lIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+IGJvb2wgdCkgY2FsbGJhY2sgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBldmVyeSA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiBib29sIHQpIGNhbGxiYWNrIC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZm9yRWFjaCA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBtYXAgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbHRlciA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiBib29sIHQpIGNhbGxiYWNrIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlZHVjZV9pbml0IDpcbiAgICAgICgnYiAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYikgY2FsbGJhY2sgLT4gJ2IgLT4gJ2IgbWV0aFxuXG4gICAgbWV0aG9kIHJlZHVjZSA6ICgnYSAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYSkgY2FsbGJhY2sgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHJlZHVjZVJpZ2h0X2luaXQgOlxuICAgICAgKCdiIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiAtPiAnYiBtZXRoXG5cbiAgICBtZXRob2QgcmVkdWNlUmlnaHQgOiAoJ2EgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2EpIGNhbGxiYWNrIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcHJvcFxuICBlbmRcblxubGV0IG9iamVjdF9jb25zdHJ1Y3RvciA9IFVuc2FmZS5nbG9iYWwjIy5fT2JqZWN0XG5cbmxldCBvYmplY3Rfa2V5cyBvIDoganNfc3RyaW5nIHQganNfYXJyYXkgdCA9IG9iamVjdF9jb25zdHJ1Y3RvciMja2V5cyBvXG5cbmxldCBhcnJheV9jb25zdHJ1Y3RvciA9IFVuc2FmZS5nbG9iYWwjIy5fQXJyYXlcblxubGV0IGFycmF5X2VtcHR5ID0gYXJyYXlfY29uc3RydWN0b3JcblxubGV0IGFycmF5X2xlbmd0aCA9IGFycmF5X2NvbnN0cnVjdG9yXG5cbmxldCBhcnJheV9nZXQgOiAnYSAjanNfYXJyYXkgdCAtPiBpbnQgLT4gJ2Egb3B0ZGVmID0gVW5zYWZlLmdldFxuXG5sZXQgYXJyYXlfc2V0IDogJ2EgI2pzX2FycmF5IHQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBVbnNhZmUuc2V0XG5cbmxldCBhcnJheV9tYXBfcG9seSA6XG4gICAgJ2EgI2pzX2FycmF5IHQgLT4gKCdhIC0+IGludCAtPiAnYSAjanNfYXJyYXkgdCAtPiAnYikgY2FsbGJhY2sgLT4gJ2IgI2pzX2FycmF5IHQgPVxuIGZ1biBhIGNiIC0+IChVbnNhZmUuY29lcmNlIGEpIyNtYXAgY2JcblxubGV0IGFycmF5X21hcCBmIGEgPSBhcnJheV9tYXBfcG9seSBhICh3cmFwX2NhbGxiYWNrIChmdW4geCBfaWR4IF8gLT4gZiB4KSlcblxubGV0IGFycmF5X21hcGkgZiBhID0gYXJyYXlfbWFwX3BvbHkgYSAod3JhcF9jYWxsYmFjayAoZnVuIHggaWR4IF8gLT4gZiBpZHggeCkpXG5cbmNsYXNzIHR5cGUgbWF0Y2hfcmVzdWx0ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbanNfc3RyaW5nIHRdIGpzX2FycmF5XG5cbiAgICBtZXRob2QgaW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlucHV0IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IHN0cl9hcnJheSA6IHN0cmluZ19hcnJheSB0IC0+IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgPSBVbnNhZmUuY29lcmNlXG5cbmxldCBtYXRjaF9yZXN1bHQgOiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgLT4gbWF0Y2hfcmVzdWx0IHQgPSBVbnNhZmUuY29lcmNlXG5cbmNsYXNzIHR5cGUgbnVtYmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nX3JhZGl4IDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0ZpeGVkIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0V4cG9uZW50aWFsIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRXhwb25lbnRpYWxfZGlnaXRzIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1ByZWNpc2lvbiA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5leHRlcm5hbCBudW1iZXJfb2ZfZmxvYXQgOiBmbG9hdCAtPiBudW1iZXIgdCA9IFwiY2FtbF9qc19mcm9tX2Zsb2F0XCJcblxuZXh0ZXJuYWwgZmxvYXRfb2ZfbnVtYmVyIDogbnVtYmVyIHQgLT4gZmxvYXQgPSBcImNhbWxfanNfdG9fZmxvYXRcIlxuXG5jbGFzcyB0eXBlIGRhdGUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9EYXRlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvVGltZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0xvY2FsZURhdGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVUaW1lU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHZhbHVlT2YgOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VGltZSA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRGdWxsWWVhciA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDRnVsbFllYXIgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldE1vbnRoIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENNb250aCA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RGF0ZSA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDRGF0ZSA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RGF5IDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENEYXkgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEhvdXJzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENIb3VycyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0TWludXRlcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDTWludXRlcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2Vjb25kcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDU2Vjb25kcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0TWlsbGlzZWNvbmRzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVVENNaWxsaXNlY29uZHMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFRpbWV6b25lT2Zmc2V0IDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBzZXRUaW1lIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEZ1bGxZZWFyIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENGdWxsWWVhciA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0TW9udGggOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ01vbnRoIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXREYXRlIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENEYXRlIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXREYXkgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ0RheSA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SG91cnMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ0hvdXJzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRNaW51dGVzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENNaW51dGVzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTZWNvbmRzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENTZWNvbmRzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRNaWxsaXNlY29uZHMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVUQ01pbGxpc2Vjb25kcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgdG9VVENTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9JU09TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9KU09OIDogJ2EgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSBkYXRlX2NvbnN0ciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwYXJzZSA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX21vbnRoIDogaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19kYXkgOiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX2hvdXIgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfbWluIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19zZWMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19tcyA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgbm93IDogZmxvYXQgbWV0aFxuICBlbmRcblxubGV0IGRhdGVfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9EYXRlXG5cbmxldCBkYXRlIDogZGF0ZV9jb25zdHIgdCA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX25vdyA6IGRhdGUgdCBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9mcm9tVGltZVZhbHVlIDogKGZsb2F0IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbW9udGggOiAoaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2RheSA6IChpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX2hvdXIgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbWluIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9zZWMgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9tcyA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPVxuICBkYXRlX2NvbnN0clxuXG5jbGFzcyB0eXBlIG1hdGggPVxuICBvYmplY3RcbiAgICBtZXRob2QgX0UgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xOMiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE4xMCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE9HMkUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xPRzEwRSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUEkgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NRUlQxXzJfIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TUVJUMiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhYnMgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgYWNvcyA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBhc2luIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgYXRhbjIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgY2VpbCA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBjb3MgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZXhwIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZyA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtYXggOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWF4XzMgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWF4XzQgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWluIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1pbl8zIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1pbl80IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHBvdyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCByYW5kb20gOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgcm91bmQgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2luIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNxcnQgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgdGFuIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuICBlbmRcblxubGV0IG1hdGggPSBVbnNhZmUuZ2xvYmFsIyMuX01hdGhcblxuY2xhc3MgdHlwZSBlcnJvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1lc3NhZ2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3RhY2sgOiBqc19zdHJpbmcgdCBvcHRkZWYgcHJvcFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxubGV0IGVycm9yX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fRXJyb3JcblxubW9kdWxlIEpzX2Vycm9yID0gc3RydWN0XG4gIHR5cGUgZXJyb3JfdCA9IGVycm9yIHRcblxuICBpbmNsdWRlIEpzb29fcnVudGltZS5FcnJvclxuXG4gIGV4dGVybmFsIG9mX2Vycm9yIDogZXJyb3JfdCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGV4dGVybmFsIHRvX2Vycm9yIDogdCAtPiBlcnJvcl90ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCBuYW1lIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubmFtZVxuXG4gIGxldCBtZXNzYWdlIGUgPSB0b19zdHJpbmcgKHRvX2Vycm9yIGUpIyMubWVzc2FnZVxuXG4gIGxldCBzdGFjayAoZSA6IHQpIDogc3RyaW5nIG9wdGlvbiA9XG4gICAgT3B0LnRvX29wdGlvbiAoT3B0Lm1hcCAodG9fZXJyb3IgZSkjIy5zdGFjayB0b19zdHJpbmcpXG5cbiAgbGV0IHRvX3N0cmluZyBlID0gdG9fc3RyaW5nICh0b19lcnJvciBlKSMjdG9TdHJpbmdcbmVuZFxuXG5tb2R1bGUgTWFnaWMgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgVCA9IHNpZ1xuICAgIGV4Y2VwdGlvbiBFcnJvciBvZiBlcnJvciB0XG4gIGVuZFxuXG4gIHR5cGUgKCdhLCAnYikgZXEgPSBFcSA6ICgnYSwgJ2EpIGVxXG5cbiAgbGV0IChlcSA6IChlcnJvciB0LCBKc19lcnJvci50KSBlcSkgPSBPYmoubWFnaWMgRXFcblxuICBsZXQgbSA9XG4gICAgbWF0Y2ggZXEgd2l0aFxuICAgIHwgRXEgLT5cbiAgICAgICAgKG1vZHVsZSBzdHJ1Y3RcbiAgICAgICAgICBleGNlcHRpb24gRXJyb3IgPSBKc19lcnJvci5FeG5cbiAgICAgICAgZW5kIDogVClcblxuICBtb2R1bGUgRXJyb3IgPSAodmFsIG0gOiBUKVxuZW5kXG5cbmluY2x1ZGUgTWFnaWMuRXJyb3JcblxubGV0IHJhaXNlX2pzX2Vycm9yIGUgPSBKc19lcnJvci5yYWlzZV8gKEpzX2Vycm9yLm9mX2Vycm9yIGUpXG5cbmxldCBzdHJpbmdfb2ZfZXJyb3IgZSA9IEpzX2Vycm9yLnRvX3N0cmluZyAoSnNfZXJyb3Iub2ZfZXJyb3IgZSlcblxubGV0IGV4bl93aXRoX2pzX2JhY2t0cmFjZSA9IEpzX2Vycm9yLmF0dGFjaF9qc19iYWNrdHJhY2VcblxuZXh0ZXJuYWwganNfZXJyb3Jfb2ZfZXhuIDogZXhuIC0+IGVycm9yIHQgb3B0ID0gXCJjYW1sX2pzX2Vycm9yX29mX2V4Y2VwdGlvblwiXG5cbmNsYXNzIHR5cGUganNvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwYXJzZSA6IGpzX3N0cmluZyB0IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBzdHJpbmdpZnkgOiAnYSAtPiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5sZXQgX0pTT04gOiBqc29uIHQgPSBVbnNhZmUuZ2xvYmFsIyMuX0pTT05cblxubGV0IGRlY29kZVVSSSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5kZWNvZGVVUkkgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBkZWNvZGVVUklDb21wb25lbnQgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZGVjb2RlVVJJQ29tcG9uZW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZW5jb2RlVVJJIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVuY29kZVVSSSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVuY29kZVVSSUNvbXBvbmVudCAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lbmNvZGVVUklDb21wb25lbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZXNjYXBlIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgdW5lc2NhcGUgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMudW5lc2NhcGUgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmV4dGVybmFsIGJvb2wgOiBib29sIC0+IGJvb2wgdCA9IFwiY2FtbF9qc19mcm9tX2Jvb2xcIlxuXG5leHRlcm5hbCB0b19ib29sIDogYm9vbCB0IC0+IGJvb2wgPSBcImNhbWxfanNfdG9fYm9vbFwiXG5cbmV4dGVybmFsIGFycmF5IDogJ2EgYXJyYXkgLT4gJ2EganNfYXJyYXkgdCA9IFwiY2FtbF9qc19mcm9tX2FycmF5XCJcblxuZXh0ZXJuYWwgdG9fYXJyYXkgOiAnYSBqc19hcnJheSB0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2pzX3RvX2FycmF5XCJcblxuZXh0ZXJuYWwgYnl0ZXN0cmluZyA6IHN0cmluZyAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc2J5dGVzX29mX3N0cmluZ1wiXG5cbmV4dGVybmFsIHRvX2J5dGVzdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcIlxuXG5leHRlcm5hbCB0eXBlb2YgOiBfIHQgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNfdHlwZW9mXCJcblxuZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IF8gdCAtPiBfIGNvbnN0ciAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG5sZXQgaXNOYU4gKGkgOiAnYSkgOiBib29sID1cbiAgdG9fYm9vbCAoVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5pc05hTiBbfCBVbnNhZmUuaW5qZWN0IGkgfF0pXG5cbmxldCBwYXJzZUludCAocyA6IGpzX3N0cmluZyB0KSA6IGludCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUludCBbfCBVbnNhZmUuaW5qZWN0IHMgfF0gaW5cbiAgaWYgaXNOYU4gcyB0aGVuIGZhaWx3aXRoIFwicGFyc2VJbnRcIiBlbHNlIHNcblxubGV0IHBhcnNlRmxvYXQgKHMgOiBqc19zdHJpbmcgdCkgOiBmbG9hdCA9XG4gIGxldCBzID0gVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5wYXJzZUZsb2F0IFt8IFVuc2FmZS5pbmplY3QgcyB8XSBpblxuICBpZiBpc05hTiBzIHRoZW4gZmFpbHdpdGggXCJwYXJzZUZsb2F0XCIgZWxzZSBzXG5cbmxldCBfID1cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciAoZnVuY3Rpb25cbiAgICAgIHwgSnNfZXJyb3IuRXhuIGUgLT4gU29tZSAoSnNfZXJyb3IudG9fc3RyaW5nIGUpXG4gICAgICB8IF8gLT4gTm9uZSlcblxubGV0IF8gPVxuICBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIChmdW4gZSAtPlxuICAgICAgbGV0IGUgOiA8IC4uID4gdCA9IE9iai5tYWdpYyBlIGluXG4gICAgICBpZiBpbnN0YW5jZW9mIGUgYXJyYXlfY29uc3RydWN0b3IgdGhlbiBOb25lIGVsc2UgU29tZSAodG9fc3RyaW5nIGUjI3RvU3RyaW5nKSlcblxubGV0IGV4cG9ydF9qcyAoZmllbGQgOiBqc19zdHJpbmcgdCkgeCA9XG4gIFVuc2FmZS5zZXRcbiAgICAoVW5zYWZlLnB1cmVfanNfZXhwciBcImpzb29fZXhwb3J0c1wiKVxuICAgIGZpZWxkXG4gICAgKGlmIFN0cmluZy5lcXVhbCAoSnMudG9fc3RyaW5nICh0eXBlb2YgKE9iai5tYWdpYyB4KSkpIFwiZnVuY3Rpb25cIlxuICAgICAgICAoKiBmdW5jdGlvbiB3aXRoIGFyaXR5L2xlbmd0aCBlcXVhbCB0byB6ZXJvIGFyZSBhbHJlYWR5IHdyYXBwZWQgKilcbiAgICAgICAgJiYgVW5zYWZlLmdldCAoT2JqLm1hZ2ljIHgpIChKcy5zdHJpbmcgXCJsZW5ndGhcIikgPiAwXG4gICAgdGhlbiBPYmoubWFnaWMgKHdyYXBfY2FsbGJhY2sgKE9iai5tYWdpYyB4KSlcbiAgICBlbHNlIHgpXG5cbmxldCBleHBvcnQgZmllbGQgeCA9IGV4cG9ydF9qcyAoc3RyaW5nIGZpZWxkKSB4XG5cbmxldCBleHBvcnRfYWxsIG9iaiA9XG4gIGxldCBrZXlzID0gb2JqZWN0X2tleXMgb2JqIGluXG4gIGtleXMjI2ZvckVhY2hcbiAgICAod3JhcF9jYWxsYmFjayAoZnVuIChrZXkgOiBqc19zdHJpbmcgdCkgXyBfIC0+IGV4cG9ydF9qcyBrZXkgKFVuc2FmZS5nZXQgb2JqIGtleSkpKVxuXG4oKioqKilcblxuKCogREVQUkVDQVRFRCAqKVxuXG50eXBlIGZsb2F0X3Byb3AgPSBmbG9hdCBwcm9wXG5cbmV4dGVybmFsIGZsb2F0IDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5cbmV4dGVybmFsIHRvX2Zsb2F0IDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgWydub2RlXSBub2RlTGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IGxpc3Rfb2Zfbm9kZUxpc3QgKG5vZGVMaXN0IDogJ2Egbm9kZUxpc3QgdCkgPVxuICBsZXQgbGVuZ3RoID0gbm9kZUxpc3QjIy5sZW5ndGggaW5cbiAgbGV0IHJlYyBhZGRfaXRlbSBhY2MgaSA9XG4gICAgaWYgaSA8IGxlbmd0aFxuICAgIHRoZW5cbiAgICAgIG1hdGNoIE9wdC50b19vcHRpb24gKG5vZGVMaXN0IyNpdGVtIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBhZGRfaXRlbSBhY2MgKGkgKyAxKVxuICAgICAgfCBTb21lIGUgLT4gYWRkX2l0ZW0gKGUgOjogYWNjKSAoaSArIDEpXG4gICAgZWxzZSBMaXN0LnJldiBhY2NcbiAgaW5cbiAgYWRkX2l0ZW0gW10gMFxuXG50eXBlIG5vZGVUeXBlID1cbiAgfCBPVEhFUlxuICAoKiBXaWxsIG5vdCBoYXBwZW4gKilcbiAgfCBFTEVNRU5UXG4gIHwgQVRUUklCVVRFXG4gIHwgVEVYVFxuICB8IENEQVRBX1NFQ1RJT05cbiAgfCBFTlRJVFlfUkVGRVJFTkNFXG4gIHwgRU5USVRZXG4gIHwgUFJPQ0VTU0lOR19JTlNUUlVDVElPTlxuICB8IENPTU1FTlRcbiAgfCBET0NVTUVOVFxuICB8IERPQ1VNRU5UX1RZUEVcbiAgfCBET0NVTUVOVF9GUkFHTUVOVFxuICB8IE5PVEFUSU9OXG5cbm1vZHVsZSBEb2N1bWVudFBvc2l0aW9uID0gc3RydWN0XG4gIHR5cGUgdCA9IGludFxuXG4gIHR5cGUgbWFzayA9IGludFxuXG4gIGxldCBkaXNjb25uZWN0ZWQgPSAweDAxXG5cbiAgbGV0IHByZWNlZGluZyA9IDB4MDJcblxuICBsZXQgZm9sbG93aW5nID0gMHgwNFxuXG4gIGxldCBjb250YWlucyA9IDB4MDhcblxuICBsZXQgY29udGFpbmVkX2J5ID0gMHgxMFxuXG4gIGxldCBpbXBsZW1lbnRhdGlvbl9zcGVjaWZpYyA9IDB4MjBcblxuICBsZXQgaGFzIHQgbWFzayA9IHQgbGFuZCBtYXNrID0gbWFza1xuXG4gIGxldCBhZGQgeCB5ID0geCBsb3IgeVxuXG4gIGxldCAoICsgKSA9IGFkZFxuZW5kXG5cbmNsYXNzIHR5cGUgbm9kZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBub2RlTmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBub2RlVmFsdWUgOiBqc19zdHJpbmcgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5vZGVUeXBlIDogbm9kZVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhcmVudE5vZGUgOiBub2RlIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBjaGlsZE5vZGVzIDogbm9kZSBub2RlTGlzdCB0IHByb3BcblxuICAgIG1ldGhvZCBmaXJzdENoaWxkIDogbm9kZSB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgbGFzdENoaWxkIDogbm9kZSB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgcHJldmlvdXNTaWJsaW5nIDogbm9kZSB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgbmV4dFNpYmxpbmcgOiBub2RlIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lc3BhY2VVUkkgOiBqc19zdHJpbmcgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIGluc2VydEJlZm9yZSA6IG5vZGUgdCAtPiBub2RlIHQgb3B0IC0+IG5vZGUgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZUNoaWxkIDogbm9kZSB0IC0+IG5vZGUgdCAtPiBub2RlIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUNoaWxkIDogbm9kZSB0IC0+IG5vZGUgdCBtZXRoXG5cbiAgICBtZXRob2QgYXBwZW5kQ2hpbGQgOiBub2RlIHQgLT4gbm9kZSB0IG1ldGhcblxuICAgIG1ldGhvZCBoYXNDaGlsZE5vZGVzIDogYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9uZU5vZGUgOiBib29sIHQgLT4gbm9kZSB0IG1ldGhcblxuICAgIG1ldGhvZCBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA6IG5vZGUgdCAtPiBEb2N1bWVudFBvc2l0aW9uLnQgbWV0aFxuXG4gICAgbWV0aG9kIGxvb2t1cE5hbWVzcGFjZVVSSSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgbG9va3VwUHJlZml4IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcbiAgZW5kXG5cbmxldCBhcHBlbmRDaGlsZCAocCA6ICNub2RlIHQpIChuIDogI25vZGUgdCkgPSBpZ25vcmUgKHAjI2FwcGVuZENoaWxkIChuIDo+IG5vZGUgdCkpXG5cbmxldCByZW1vdmVDaGlsZCAocCA6ICNub2RlIHQpIChuIDogI25vZGUgdCkgPSBpZ25vcmUgKHAjI3JlbW92ZUNoaWxkIChuIDo+IG5vZGUgdCkpXG5cbmxldCByZXBsYWNlQ2hpbGQgKHAgOiAjbm9kZSB0KSAobiA6ICNub2RlIHQpIChvIDogI25vZGUgdCkgPVxuICBpZ25vcmUgKHAjI3JlcGxhY2VDaGlsZCAobiA6PiBub2RlIHQpIChvIDo+IG5vZGUgdCkpXG5cbmxldCBpbnNlcnRCZWZvcmUgKHAgOiAjbm9kZSB0KSAobiA6ICNub2RlIHQpIChvIDogI25vZGUgdCBvcHQpID1cbiAgaWdub3JlIChwIyNpbnNlcnRCZWZvcmUgKG4gOj4gbm9kZSB0KSAobyA6PiBub2RlIHQgb3B0KSlcblxuKCoqIFNwZWNpZmljYXRpb24gb2YgW0F0dHJdIG9iamVjdHMuICopXG5jbGFzcyB0eXBlIGF0dHIgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG5vZGVcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNwZWNpZmllZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3duZXJFbGVtZW50IDogZWxlbWVudCB0IHByb3BcbiAgZW5kXG5cbigqKiBTcGVjaWZpY2F0aW9uIG9mIFtOYW1lZE5vZGVNYXBdIG9iamVjdHMuICopXG5hbmQgWydub2RlXSBuYW1lZE5vZGVNYXAgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZ2V0TmFtZWRJdGVtIDoganNfc3RyaW5nIHQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldE5hbWVkSXRlbSA6ICdub2RlIHQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZU5hbWVkSXRlbSA6IGpzX3N0cmluZyB0IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCoqIFNwZWNpZmljYXRpb24gb2YgW0VsZW1lbnRdIG9iamVjdHMuICopXG5hbmQgZWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbm9kZVxuXG4gICAgbWV0aG9kIHRhZ05hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0QXR0cmlidXRlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRBdHRyaWJ1dGUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVBdHRyaWJ1dGUgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBoYXNBdHRyaWJ1dGUgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEF0dHJpYnV0ZU5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRBdHRyaWJ1dGVOUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUF0dHJpYnV0ZU5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaGFzQXR0cmlidXRlTlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEF0dHJpYnV0ZU5vZGUgOiBqc19zdHJpbmcgdCAtPiBhdHRyIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRBdHRyaWJ1dGVOb2RlIDogYXR0ciB0IC0+IGF0dHIgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUF0dHJpYnV0ZU5vZGUgOiBhdHRyIHQgLT4gYXR0ciB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBdHRyaWJ1dGVOb2RlTlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBhdHRyIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRBdHRyaWJ1dGVOb2RlTlMgOiBhdHRyIHQgLT4gYXR0ciB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudHNCeVRhZ05hbWUgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IG5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZXMgOiBhdHRyIG5hbWVkTm9kZU1hcCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgY2hhcmFjdGVyRGF0YSA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbm9kZVxuXG4gICAgbWV0aG9kIGRhdGEgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdWJqc19zdHJpbmdEYXRhIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgYXBwZW5kRGF0YSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluc2VydERhdGEgOiBpbnQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlRGF0YSA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZURhdGEgOiBpbnQgLT4gaW50IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSBjb21tZW50ID0gY2hhcmFjdGVyRGF0YVxuXG5jbGFzcyB0eXBlIHRleHQgPSBjaGFyYWN0ZXJEYXRhXG5cbmNsYXNzIHR5cGUgZG9jdW1lbnRGcmFnbWVudCA9IG5vZGVcblxuY2xhc3MgdHlwZSBbJ2VsZW1lbnRdIGRvY3VtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBub2RlXG5cbiAgICBtZXRob2QgZG9jdW1lbnRFbGVtZW50IDogJ2VsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA6IGRvY3VtZW50RnJhZ21lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlRWxlbWVudCA6IGpzX3N0cmluZyB0IC0+ICdlbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUVsZW1lbnROUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+ICdlbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVRleHROb2RlIDoganNfc3RyaW5nIHQgLT4gdGV4dCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVBdHRyaWJ1dGUgOiBqc19zdHJpbmcgdCAtPiBhdHRyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUNvbW1lbnQgOiBqc19zdHJpbmcgdCAtPiBjb21tZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRCeUlkIDoganNfc3RyaW5nIHQgLT4gJ2VsZW1lbnQgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRzQnlUYWdOYW1lIDoganNfc3RyaW5nIHQgLT4gJ2VsZW1lbnQgbm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgaW1wb3J0Tm9kZSA6IGVsZW1lbnQgdCAtPiBib29sIHQgLT4gJ2VsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgYWRvcHROb2RlIDogZWxlbWVudCB0IC0+ICdlbGVtZW50IHQgbWV0aFxuICBlbmRcblxudHlwZSBub2RlX3R5cGUgPVxuICB8IEVsZW1lbnQgb2YgZWxlbWVudCB0XG4gIHwgQXR0ciBvZiBhdHRyIHRcbiAgfCBUZXh0IG9mIHRleHQgdFxuICB8IE90aGVyIG9mIG5vZGUgdFxuXG5sZXQgbm9kZVR5cGUgZSA9XG4gIG1hdGNoIGUjIy5ub2RlVHlwZSB3aXRoXG4gIHwgRUxFTUVOVCAtPiBFbGVtZW50IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gIHwgQVRUUklCVVRFIC0+IEF0dHIgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgfCBDREFUQV9TRUNUSU9OIHwgVEVYVCAtPiBUZXh0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gIHwgXyAtPiBPdGhlciAoZSA6PiBub2RlIHQpXG5cbm1vZHVsZSBDb2VyY2VUbyA9IHN0cnVjdFxuICBsZXQgY2FzdCAoZSA6ICNub2RlIEpzLnQpIHQgPVxuICAgIGlmIGUjIy5ub2RlVHlwZSA9PSB0IHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKSBlbHNlIEpzLm51bGxcblxuICBsZXQgZWxlbWVudCBlIDogZWxlbWVudCBKcy50IEpzLm9wdCA9IGNhc3QgZSBFTEVNRU5UXG5cbiAgbGV0IHRleHQgZSA6IHRleHQgSnMudCBKcy5vcHQgPVxuICAgIGlmIGUjIy5ub2RlVHlwZSA9PSBURVhUIHx8IGUjIy5ub2RlVHlwZSA9PSBDREFUQV9TRUNUSU9OXG4gICAgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGF0dHIgZSA6IGF0dHIgSnMudCBKcy5vcHQgPSBjYXN0IGUgQVRUUklCVVRFXG5lbmRcblxudHlwZSAoJ2EsICdiKSBldmVudF9saXN0ZW5lciA9ICgnYSwgJ2IgLT4gYm9vbCB0KSBtZXRoX2NhbGxiYWNrIG9wdFxuKCoqIFRoZSB0eXBlIG9mIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9ucy4gIFRoZSBmaXJzdCB0eXBlIHBhcmFtZXRlclxuICAgICAgWydhXSBpcyB0aGUgdHlwZSBvZiB0aGUgdGFyZ2V0IG9iamVjdDsgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbiAgICAgIFsnYl0gaXMgdGhlIHR5cGUgb2YgdGhlIGV2ZW50IG9iamVjdC4gKilcblxuY2xhc3MgdHlwZSBbJ2FdIGV2ZW50ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6ICdhIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdXJyZW50VGFyZ2V0IDogJ2EgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgKCogTGVnYWN5IG1ldGhvZHMgKilcbiAgICBtZXRob2Qgc3JjRWxlbWVudCA6ICdhIHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgWydhLCAnYl0gY3VzdG9tRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFsnYV0gZXZlbnRcblxuICAgIG1ldGhvZCBkZXRhaWwgOiAnYiBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IG5vX2hhbmRsZXIgOiAoJ2EsICdiKSBldmVudF9saXN0ZW5lciA9IEpzLm51bGxcblxubGV0IHdpbmRvd19ldmVudCAoKSA6ICdhICNldmVudCB0ID0gSnMuVW5zYWZlLnB1cmVfanNfZXhwciBcImV2ZW50XCJcblxuKCogVGhlIGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0IG11c3QgYmUgY2FsbGVkIGV4cGxpY2l0bHkgd2hlblxuICAgdXNpbmcgYWRkRXZlbnRMaXN0ZW5lci4uLiAqKVxubGV0IGhhbmRsZXIgZiA9XG4gIEpzLnNvbWVcbiAgICAoSnMuVW5zYWZlLmNhbGxiYWNrIChmdW4gZSAtPlxuICAgICAgICAgKCogZGVwZW5kaW5nIG9uIHRoZSBpbnRlcm5ldCBleHBsb3JlciB2ZXJzaW9uLCBlIGNhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC4gKilcbiAgICAgICAgIGlmIG5vdCAoSnMuT3B0LnRlc3QgKHNvbWUgZSkpXG4gICAgICAgICB0aGVuIChcbiAgICAgICAgICAgbGV0IGUgPSB3aW5kb3dfZXZlbnQgKCkgaW5cbiAgICAgICAgICAgbGV0IHJlcyA9IGYgZSBpblxuICAgICAgICAgICBpZiBub3QgKEpzLnRvX2Jvb2wgcmVzKSB0aGVuIGUjIy5yZXR1cm5WYWx1ZSA6PSByZXM7XG4gICAgICAgICAgIHJlcylcbiAgICAgICAgIGVsc2VcbiAgICAgICAgICAgbGV0IHJlcyA9IGYgZSBpblxuICAgICAgICAgICBpZiBub3QgKEpzLnRvX2Jvb2wgcmVzKSB0aGVuIChKcy5VbnNhZmUuY29lcmNlIGUpIyNwcmV2ZW50RGVmYXVsdDtcbiAgICAgICAgICAgcmVzKSlcblxubGV0IGZ1bGxfaGFuZGxlciBmID1cbiAgSnMuc29tZVxuICAgIChKcy5VbnNhZmUubWV0aF9jYWxsYmFjayAoZnVuIHRoaXMgZSAtPlxuICAgICAgICAgKCogZGVwZW5kaW5nIG9uIHRoZSBpbnRlcm5ldCBleHBsb3JlciB2ZXJzaW9uLCBlIGNhbiBiZSBudWxsIG9yIHVuZGVmaW5lZCAqKVxuICAgICAgICAgaWYgbm90IChKcy5PcHQudGVzdCAoc29tZSBlKSlcbiAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICBsZXQgZSA9IHdpbmRvd19ldmVudCAoKSBpblxuICAgICAgICAgICBsZXQgcmVzID0gZiB0aGlzIGUgaW5cbiAgICAgICAgICAgaWYgbm90IChKcy50b19ib29sIHJlcykgdGhlbiBlIyMucmV0dXJuVmFsdWUgOj0gcmVzO1xuICAgICAgICAgICByZXMpXG4gICAgICAgICBlbHNlXG4gICAgICAgICAgIGxldCByZXMgPSBmIHRoaXMgZSBpblxuICAgICAgICAgICBpZiBub3QgKEpzLnRvX2Jvb2wgcmVzKSB0aGVuIChKcy5VbnNhZmUuY29lcmNlIGUpIyNwcmV2ZW50RGVmYXVsdDtcbiAgICAgICAgICAgcmVzKSlcblxubGV0IGludm9rZV9oYW5kbGVyIChmIDogKCdhLCAnYikgZXZlbnRfbGlzdGVuZXIpICh0aGlzIDogJ2EpIChldmVudCA6ICdiKSA6IGJvb2wgdCA9XG4gIEpzLlVuc2FmZS5jYWxsIGYgdGhpcyBbfCBKcy5VbnNhZmUuaW5qZWN0IGV2ZW50IHxdXG5cbmxldCBldmVudFRhcmdldCAoZSA6ICg8IC4uID4gYXMgJ2EpICNldmVudCB0KSA6ICdhIHQgPVxuICBsZXQgdGFyZ2V0ID1cbiAgICBPcHQuZ2V0IGUjIy50YXJnZXQgKGZ1biAoKSAtPiBPcHQuZ2V0IGUjIy5zcmNFbGVtZW50IChmdW4gKCkgLT4gcmFpc2UgTm90X2ZvdW5kKSlcbiAgaW5cbiAgaWYgSnMuaW5zdGFuY2VvZiB0YXJnZXQgSnMuVW5zYWZlLmdsb2JhbCMjLl9Ob2RlXG4gIHRoZW5cbiAgICAoKiBXb3JrYXJvdW5kIGZvciBTYWZhcmkgYnVnICopXG4gICAgbGV0IHRhcmdldCcgOiBub2RlIEpzLnQgPSBKcy5VbnNhZmUuY29lcmNlIHRhcmdldCBpblxuICAgIGlmIHRhcmdldCcjIy5ub2RlVHlwZSA9PSBURVhUXG4gICAgdGhlbiBKcy5VbnNhZmUuY29lcmNlIChPcHQuZ2V0IHRhcmdldCcjIy5wYXJlbnROb2RlIChmdW4gKCkgLT4gYXNzZXJ0IGZhbHNlKSlcbiAgICBlbHNlIHRhcmdldFxuICBlbHNlIHRhcmdldFxuXG5tb2R1bGUgRXZlbnQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0eXAgPSBKcy5qc19zdHJpbmcgSnMudFxuXG4gIGxldCBtYWtlIHMgPSBKcy5zdHJpbmcgc1xuZW5kXG5cbnR5cGUgZXZlbnRfbGlzdGVuZXJfaWQgPSB1bml0IC0+IHVuaXRcblxuY2xhc3MgdHlwZSBldmVudF9saXN0ZW5lcl9vcHRpb25zID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNhcHR1cmUgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmNlIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFzc2l2ZSA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxubGV0IGFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyAoZSA6ICg8IC4uID4gYXMgJ2EpIHQpIHR5cCA/Y2FwdHVyZSA/b25jZSA/cGFzc2l2ZSBoID1cbiAgaWYgKEpzLlVuc2FmZS5jb2VyY2UgZSkjIy5hZGRFdmVudExpc3RlbmVyID09IEpzLnVuZGVmaW5lZFxuICB0aGVuXG4gICAgbGV0IGV2ID0gKEpzLnN0cmluZyBcIm9uXCIpIyNjb25jYXQgdHlwIGluXG4gICAgbGV0IGNhbGxiYWNrIGUgPSBKcy5VbnNhZmUuY2FsbCAoaCwgZSwgW3x8XSkgaW5cbiAgICBsZXQgKCkgPSAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjYXR0YWNoRXZlbnQgZXYgY2FsbGJhY2sgaW5cbiAgICBmdW4gKCkgLT4gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI2RldGFjaEV2ZW50IGV2IGNhbGxiYWNrXG4gIGVsc2VcbiAgICBsZXQgb3B0cyA6IGV2ZW50X2xpc3RlbmVyX29wdGlvbnMgdCA9IEpzLlVuc2FmZS5vYmogW3x8XSBpblxuICAgIGxldCBpdGVyIHQgZiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgfCBTb21lIGIgLT4gZiBiXG4gICAgaW5cbiAgICBpdGVyIGNhcHR1cmUgKGZ1biBiIC0+IG9wdHMjIy5jYXB0dXJlIDo9IGIpO1xuICAgIGl0ZXIgb25jZSAoZnVuIGIgLT4gb3B0cyMjLm9uY2UgOj0gYik7XG4gICAgaXRlciBwYXNzaXZlIChmdW4gYiAtPiBvcHRzIyMucGFzc2l2ZSA6PSBiKTtcbiAgICBsZXQgKCkgPSAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjYWRkRXZlbnRMaXN0ZW5lciB0eXAgaCBvcHRzIGluXG4gICAgZnVuICgpIC0+IChKcy5VbnNhZmUuY29lcmNlIGUpIyNyZW1vdmVFdmVudExpc3RlbmVyIHR5cCBoIG9wdHNcblxubGV0IGFkZEV2ZW50TGlzdGVuZXIgKGUgOiAoPCAuLiA+IGFzICdhKSB0KSB0eXAgaCBjYXB0ID1cbiAgYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zIGUgdHlwIH5jYXB0dXJlOmNhcHQgaFxuXG5sZXQgcmVtb3ZlRXZlbnRMaXN0ZW5lciBpZCA9IGlkICgpXG5cbmxldCBwcmV2ZW50RGVmYXVsdCBldiA9XG4gIGlmIEpzLk9wdGRlZi50ZXN0IChKcy5VbnNhZmUuY29lcmNlIGV2KSMjLnByZXZlbnREZWZhdWx0ICgqIElFIGhhY2sgKilcbiAgdGhlbiAoSnMuVW5zYWZlLmNvZXJjZSBldikjI3ByZXZlbnREZWZhdWx0XG4gIGVsc2UgKEpzLlVuc2FmZS5jb2VyY2UgZXYpIyMucmV0dXJuVmFsdWUgOj0gSnMuYm9vbCBmYWxzZVxuXG5sZXQgY3JlYXRlQ3VzdG9tRXZlbnQgP2J1YmJsZXMgP2NhbmNlbGFibGUgP2RldGFpbCB0eXAgPVxuICBsZXQgb3B0X2l0ZXIgZiA9IGZ1bmN0aW9uXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHggLT4gZiB4XG4gIGluXG4gIGxldCBvcHRzID0gVW5zYWZlLm9iaiBbfHxdIGluXG4gIG9wdF9pdGVyIChmdW4geCAtPiBvcHRzIyMuYnViYmxlcyA6PSBib29sIHgpIGJ1YmJsZXM7XG4gIG9wdF9pdGVyIChmdW4geCAtPiBvcHRzIyMuY2FuY2VsYWJsZSA6PSBib29sIHgpIGNhbmNlbGFibGU7XG4gIG9wdF9pdGVyIChmdW4geCAtPiBvcHRzIyMuZGV0YWlsIDo9IHNvbWUgeCkgZGV0YWlsO1xuICBsZXQgY29uc3RyIDpcbiAgICAgICggICAoJ2EsICdiKSAjY3VzdG9tRXZlbnQgSnMudCBFdmVudC50eXBcbiAgICAgICAtPiA8IGRldGFpbCA6ICdiIG9wdCBwcm9wID4gdFxuICAgICAgIC0+ICgnYSwgJ2IpIGN1c3RvbUV2ZW50IHQpXG4gICAgICBjb25zdHIgPVxuICAgIFVuc2FmZS5nbG9iYWwjIy5fQ3VzdG9tRXZlbnRcbiAgaW5cbiAgbmV3JWpzIGNvbnN0ciB0eXAgb3B0c1xuXG4oKiBJRSA8IDkgKilcblxuY2xhc3MgdHlwZSBzdHJpbmdMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRhaW5zIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcbiAgZW5kXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEyIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxub3BlbiBKc1xuXG50eXBlIHVpbnQzMiA9IGZsb2F0XG5cbmNsYXNzIHR5cGUgYXJyYXlCdWZmZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYnl0ZUxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+IGFycmF5QnVmZmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIHNsaWNlX3RvRW5kIDogaW50IC0+IGFycmF5QnVmZmVyIHQgbWV0aFxuICBlbmRcblxubGV0IGFycmF5QnVmZmVyIDogKGludCAtPiBhcnJheUJ1ZmZlciB0KSBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0FycmF5QnVmZmVyXG5cbmNsYXNzIHR5cGUgYXJyYXlCdWZmZXJWaWV3ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGJ1ZmZlciA6IGFycmF5QnVmZmVyIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJ5dGVPZmZzZXQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJ5dGVMZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBbJ2EsICdiXSB0eXBlZEFycmF5ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBhcnJheUJ1ZmZlclZpZXdcblxuICAgIG1ldGhvZCBfQllURVNfUEVSX0VMRU1FTlQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2V0X2Zyb21BcnJheSA6ICdhIGpzX2FycmF5IHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldF9mcm9tVHlwZWRBcnJheSA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3ViYXJyYXkgOiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3ViYXJyYXlfdG9FbmQgOiBpbnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZV90b0VuZCA6IGludCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgbWV0aFxuXG4gICAgKCogVGhpcyBmYWtlIG1ldGhvZCBpcyBuZWVkZWQgZm9yIHR5cGluZyBwdXJwb3Nlcy5cbiAgICAgICBXaXRob3V0IGl0LCBbJ2JdIHdvdWxkIG5vdCBiZSBjb25zdHJhaW5lZC4gKilcbiAgICBtZXRob2QgX2NvbnRlbnRfdHlwZV8gOiAnYiBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxudHlwZSBpbnQ4QXJyYXkgPSAoaW50LCBCaWdhcnJheS5pbnQ4X3NpZ25lZF9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSB1aW50OEFycmF5ID0gKGludCwgQmlnYXJyYXkuaW50OF91bnNpZ25lZF9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSBpbnQxNkFycmF5ID0gKGludCwgQmlnYXJyYXkuaW50MTZfc2lnbmVkX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIHVpbnQxNkFycmF5ID0gKGludCwgQmlnYXJyYXkuaW50MTZfdW5zaWduZWRfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgaW50MzJBcnJheSA9IChpbnQzMiwgQmlnYXJyYXkuaW50MzJfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgdWludDMyQXJyYXkgPSAoaW50MzIsIEJpZ2FycmF5LmludDMyX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIGZsb2F0MzJBcnJheSA9IChmbG9hdCwgQmlnYXJyYXkuZmxvYXQzMl9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSBmbG9hdDY0QXJyYXkgPSAoZmxvYXQsIEJpZ2FycmF5LmZsb2F0NjRfZWx0KSB0eXBlZEFycmF5XG5cbmV4dGVybmFsIGtpbmQgOiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gKCdhLCAnYikgQmlnYXJyYXkua2luZFxuICA9IFwiY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5XCJcblxuZXh0ZXJuYWwgZnJvbV9nZW5hcnJheSA6XG4gICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdFxuICA9IFwiY2FtbF9iYV90b190eXBlZF9hcnJheVwiXG5cbmV4dGVybmFsIHRvX2dlbmFycmF5IDpcbiAgKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+ICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50XG4gID0gXCJjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXlcIlxuXG5sZXQgaW50OEFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnQ4QXJyYXlcblxubGV0IGludDhBcnJheV9mcm9tQXJyYXkgPSBpbnQ4QXJyYXlcblxubGV0IGludDhBcnJheV9mcm9tVHlwZWRBcnJheSA9IGludDhBcnJheVxuXG5sZXQgaW50OEFycmF5X2Zyb21CdWZmZXIgPSBpbnQ4QXJyYXlcblxubGV0IGludDhBcnJheV9pbkJ1ZmZlciA9IGludDhBcnJheVxuXG5sZXQgdWludDhBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fVWludDhBcnJheVxuXG5sZXQgdWludDhBcnJheV9mcm9tQXJyYXkgPSB1aW50OEFycmF5XG5cbmxldCB1aW50OEFycmF5X2Zyb21UeXBlZEFycmF5ID0gdWludDhBcnJheVxuXG5sZXQgdWludDhBcnJheV9mcm9tQnVmZmVyID0gdWludDhBcnJheVxuXG5sZXQgdWludDhBcnJheV9pbkJ1ZmZlciA9IHVpbnQ4QXJyYXlcblxubGV0IGludDE2QXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludDE2QXJyYXlcblxubGV0IGludDE2QXJyYXlfZnJvbUFycmF5ID0gaW50MTZBcnJheVxuXG5sZXQgaW50MTZBcnJheV9mcm9tVHlwZWRBcnJheSA9IGludDE2QXJyYXlcblxubGV0IGludDE2QXJyYXlfZnJvbUJ1ZmZlciA9IGludDE2QXJyYXlcblxubGV0IGludDE2QXJyYXlfaW5CdWZmZXIgPSBpbnQxNkFycmF5XG5cbmxldCB1aW50MTZBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fVWludDE2QXJyYXlcblxubGV0IHVpbnQxNkFycmF5X2Zyb21BcnJheSA9IHVpbnQxNkFycmF5XG5cbmxldCB1aW50MTZBcnJheV9mcm9tVHlwZWRBcnJheSA9IHVpbnQxNkFycmF5XG5cbmxldCB1aW50MTZBcnJheV9mcm9tQnVmZmVyID0gdWludDE2QXJyYXlcblxubGV0IHVpbnQxNkFycmF5X2luQnVmZmVyID0gdWludDE2QXJyYXlcblxubGV0IGludDMyQXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludDMyQXJyYXlcblxubGV0IGludDMyQXJyYXlfZnJvbUFycmF5ID0gaW50MzJBcnJheVxuXG5sZXQgaW50MzJBcnJheV9mcm9tVHlwZWRBcnJheSA9IGludDMyQXJyYXlcblxubGV0IGludDMyQXJyYXlfZnJvbUJ1ZmZlciA9IGludDMyQXJyYXlcblxubGV0IGludDMyQXJyYXlfaW5CdWZmZXIgPSBpbnQzMkFycmF5XG5cbmxldCB1aW50MzJBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fVWludDMyQXJyYXlcblxubGV0IHVpbnQzMkFycmF5X2Zyb21BcnJheSA9IHVpbnQzMkFycmF5XG5cbmxldCB1aW50MzJBcnJheV9mcm9tVHlwZWRBcnJheSA9IHVpbnQzMkFycmF5XG5cbmxldCB1aW50MzJBcnJheV9mcm9tQnVmZmVyID0gdWludDMyQXJyYXlcblxubGV0IHVpbnQzMkFycmF5X2luQnVmZmVyID0gdWludDMyQXJyYXlcblxubGV0IGZsb2F0MzJBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRmxvYXQzMkFycmF5XG5cbmxldCBmbG9hdDMyQXJyYXlfZnJvbUFycmF5ID0gZmxvYXQzMkFycmF5XG5cbmxldCBmbG9hdDMyQXJyYXlfZnJvbVR5cGVkQXJyYXkgPSBmbG9hdDMyQXJyYXlcblxubGV0IGZsb2F0MzJBcnJheV9mcm9tQnVmZmVyID0gZmxvYXQzMkFycmF5XG5cbmxldCBmbG9hdDMyQXJyYXlfaW5CdWZmZXIgPSBmbG9hdDMyQXJyYXlcblxubGV0IGZsb2F0NjRBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRmxvYXQ2NEFycmF5XG5cbmxldCBmbG9hdDY0QXJyYXlfZnJvbUFycmF5ID0gZmxvYXQ2NEFycmF5XG5cbmxldCBmbG9hdDY0QXJyYXlfZnJvbVR5cGVkQXJyYXkgPSBmbG9hdDY0QXJyYXlcblxubGV0IGZsb2F0NjRBcnJheV9mcm9tQnVmZmVyID0gZmxvYXQ2NEFycmF5XG5cbmxldCBmbG9hdDY0QXJyYXlfaW5CdWZmZXIgPSBmbG9hdDY0QXJyYXlcblxubGV0IHNldCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9XG4gZnVuIGEgaSB2IC0+IGFycmF5X3NldCAoVW5zYWZlLmNvZXJjZSBhKSBpIHZcblxubGV0IGdldCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiBpbnQgLT4gJ2Egb3B0ZGVmID0gZnVuIGEgaSAtPiBKcy5VbnNhZmUuZ2V0IGEgaVxuXG5sZXQgdW5zYWZlX2dldCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiBpbnQgLT4gJ2EgPSBmdW4gYSBpIC0+IEpzLlVuc2FmZS5nZXQgYSBpXG5cbmNsYXNzIHR5cGUgZGF0YVZpZXcgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGFycmF5QnVmZmVyVmlld1xuXG4gICAgbWV0aG9kIGdldEludDggOiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVaW50OCA6IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEludDE2IDogaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW50MTZfIDogaW50IC0+IGJvb2wgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVpbnQxNiA6IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVpbnQxNl8gOiBpbnQgLT4gYm9vbCB0IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW50MzIgOiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbnQzMl8gOiBpbnQgLT4gYm9vbCB0IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VWludDMyIDogaW50IC0+IHVpbnQzMiBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VWludDMyXyA6IGludCAtPiBib29sIHQgLT4gdWludDMyIG1ldGhcblxuICAgIG1ldGhvZCBnZXRGbG9hdDMyIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRGbG9hdDMyXyA6IGludCAtPiBib29sIHQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZsb2F0NjQgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZsb2F0NjRfIDogaW50IC0+IGJvb2wgdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50OCA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VWludDggOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludDE2IDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnQxNl8gOiBpbnQgLT4gaW50IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVaW50MTYgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVpbnQxNl8gOiBpbnQgLT4gaW50IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnQzMiA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50MzJfIDogaW50IC0+IGludCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VWludDMyIDogaW50IC0+IHVpbnQzMiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVaW50MzJfIDogaW50IC0+IHVpbnQzMiAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RmxvYXQzMiA6IGludCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRGbG9hdDMyXyA6IGludCAtPiBmbG9hdCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RmxvYXQ2NCA6IGludCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRGbG9hdDY0XyA6IGludCAtPiBmbG9hdCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5sZXQgZGF0YVZpZXcgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0RhdGFWaWV3XG5cbmxldCBkYXRhVmlld19pbkJ1ZmZlciA9IGRhdGFWaWV3XG5cbm1vZHVsZSBCaWdzdHJpbmcgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gKGNoYXIsIEJpZ2FycmF5LmludDhfdW5zaWduZWRfZWx0LCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuQXJyYXkxLnRcblxuICBleHRlcm5hbCB0b19hcnJheUJ1ZmZlciA6IHQgLT4gYXJyYXlCdWZmZXIgSnMudCA9IFwiYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlclwiXG5cbiAgZXh0ZXJuYWwgdG9fdWludDhBcnJheSA6IHQgLT4gdWludDhBcnJheSBKcy50ID0gXCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXlcIlxuXG4gIGV4dGVybmFsIG9mX2FycmF5QnVmZmVyIDogYXJyYXlCdWZmZXIgSnMudCAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyXCJcblxuICBleHRlcm5hbCBvZl91aW50OEFycmF5IDogdWludDhBcnJheSBKcy50IC0+IHQgPSBcImJpZ3N0cmluZ19vZl90eXBlZF9hcnJheVwiXG5lbmRcblxubW9kdWxlIFN0cmluZyA9IHN0cnVjdFxuICBleHRlcm5hbCBvZl91aW50OEFycmF5IDogdWludDhBcnJheSBKcy50IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfYXJyYXlcIlxuXG4gIGxldCBvZl9hcnJheUJ1ZmZlciBhYiA9XG4gICAgbGV0IHVpbnQ4ID0gbmV3JWpzIHVpbnQ4QXJyYXlfZnJvbUJ1ZmZlciBhYiBpblxuICAgIG9mX3VpbnQ4QXJyYXkgdWludDhcbmVuZFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMSBQaWVycmUgQ2hhbWJhcnRcbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuIERvbVxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgYmxvYiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBzaXplIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4gYmxvYiB0IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZV93aXRoQ29udGVudFR5cGUgOiBpbnQgLT4gaW50IC0+IGpzX3N0cmluZyB0IC0+IGJsb2IgdCBtZXRoXG4gIGVuZFxuXG5sZXQgYmxvYl9jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX0Jsb2JcblxudHlwZSAnYSBtYWtlX2Jsb2IgPVxuICA/Y29udGVudFR5cGU6c3RyaW5nIC0+ID9lbmRpbmdzOlsgYFRyYW5zcGFyZW50IHwgYE5hdGl2ZSBdIC0+ICdhIC0+IGJsb2IgdFxuXG5sZXQgcmVjIGZpbHRlcl9tYXAgZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gW11cbiAgfCB2IDo6IHEgLT4gKFxuICAgICAgbWF0Y2ggZiB2IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBmaWx0ZXJfbWFwIGYgcVxuICAgICAgfCBTb21lIHYnIC0+IHYnIDo6IGZpbHRlcl9tYXAgZiBxKVxuXG5sZXQgbWFrZV9ibG9iX29wdGlvbnMgY29udGVudFR5cGUgZW5kaW5ncyA9XG4gIGxldCBvcHRpb25zID1cbiAgICBmaWx0ZXJfbWFwXG4gICAgICAoZnVuIChuYW1lLCB2KSAtPlxuICAgICAgICBtYXRjaCB2IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgfCBTb21lIHYgLT4gU29tZSAobmFtZSwgVW5zYWZlLmluamVjdCAoc3RyaW5nIHYpKSlcbiAgICAgIFsgXCJ0eXBlXCIsIGNvbnRlbnRUeXBlXG4gICAgICA7ICggXCJlbmRpbmdzXCJcbiAgICAgICAgLCBtYXRjaCBlbmRpbmdzIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICAgIHwgU29tZSBgVHJhbnNwYXJlbnQgLT4gU29tZSBcInRyYW5zcGFyZW50XCJcbiAgICAgICAgICB8IFNvbWUgYE5hdGl2ZSAtPiBTb21lIFwibmF0aXZlXCIgKVxuICAgICAgXVxuICBpblxuICBtYXRjaCBvcHRpb25zIHdpdGhcbiAgfCBbXSAtPiB1bmRlZmluZWRcbiAgfCBsIC0+IFVuc2FmZS5vYmogKEFycmF5Lm9mX2xpc3QgbClcblxubGV0IGJsb2JfcmF3ID9jb250ZW50VHlwZSA/ZW5kaW5ncyBhID1cbiAgbGV0IG9wdGlvbnMgPSBtYWtlX2Jsb2Jfb3B0aW9ucyBjb250ZW50VHlwZSBlbmRpbmdzIGluXG4gIG5ldyVqcyBibG9iX2NvbnN0ciAoYXJyYXkgYSkgb3B0aW9uc1xuXG5sZXQgYmxvYl9mcm9tX3N0cmluZyA/Y29udGVudFR5cGUgP2VuZGluZ3MgcyA9XG4gIGJsb2JfcmF3ID9jb250ZW50VHlwZSA/ZW5kaW5ncyBbfCBzdHJpbmcgcyB8XVxuXG5sZXQgYmxvYl9mcm9tX2FueSA/Y29udGVudFR5cGUgP2VuZGluZ3MgbCA9XG4gIGxldCBsID1cbiAgICBMaXN0Lm1hcFxuICAgICAgKGZ1bmN0aW9uXG4gICAgICAgIHwgYGFycmF5QnVmZmVyIGEgLT4gVW5zYWZlLmluamVjdCBhXG4gICAgICAgIHwgYGFycmF5QnVmZmVyVmlldyBhIC0+IFVuc2FmZS5pbmplY3QgYVxuICAgICAgICB8IGBzdHJpbmcgcyAtPiBVbnNhZmUuaW5qZWN0IChzdHJpbmcgcylcbiAgICAgICAgfCBganNfc3RyaW5nIHMgLT4gVW5zYWZlLmluamVjdCBzXG4gICAgICAgIHwgYGJsb2IgYiAtPiBVbnNhZmUuaW5qZWN0IGIpXG4gICAgICBsXG4gIGluXG4gIGJsb2JfcmF3ID9jb250ZW50VHlwZSA/ZW5kaW5ncyAoQXJyYXkub2ZfbGlzdCBsKVxuXG5jbGFzcyB0eXBlIGZpbGUgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGJsb2JcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RNb2RpZmllZERhdGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbiBmaXJlZm94IDMuMC0zLjUgZmlsZS5uYW1lIGlzIG5vdCBhdmFpbGFibGUsIHdlIHVzZSB0aGUgbm9uc3RhbmRhcmQgZmlsZU5hbWUgaW5zdGVhZCAqKVxuY2xhc3MgdHlwZSBmaWxlX25hbWVfb25seSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWxlTmFtZSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgZmlsZW5hbWUgZmlsZSA9XG4gIGxldCBmaWxlIDogZmlsZV9uYW1lX29ubHkgdCA9IEpzLlVuc2FmZS5jb2VyY2UgZmlsZSBpblxuICBtYXRjaCBPcHRkZWYudG9fb3B0aW9uIGZpbGUjIy5uYW1lIHdpdGhcbiAgfCBOb25lIC0+IChcbiAgICAgIG1hdGNoIE9wdGRlZi50b19vcHRpb24gZmlsZSMjLmZpbGVOYW1lIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBmYWlsd2l0aCBcImNhbid0IHJldHJpZXZlIGZpbGUgbmFtZTogbm90IGltcGxlbWVudGVkXCJcbiAgICAgIHwgU29tZSBuYW1lIC0+IG5hbWUpXG4gIHwgU29tZSBuYW1lIC0+IG5hbWVcblxudHlwZSBmaWxlX2FueSA9IDwgPiB0XG5cbmxldCBkb2NfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9Eb2N1bWVudFxuXG5tb2R1bGUgQ29lcmNlVG8gPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwganNvbiA6IGZpbGVfYW55IC0+ICdhIE9wdC50ID0gXCIlaWRlbnRpdHlcIlxuXG4gIGxldCBkb2N1bWVudCAoZSA6IGZpbGVfYW55KSA9XG4gICAgaWYgaW5zdGFuY2VvZiBlIGRvY19jb25zdHJcbiAgICB0aGVuIEpzLnNvbWUgKFVuc2FmZS5jb2VyY2UgZSA6IGVsZW1lbnQgZG9jdW1lbnQgdClcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgYmxvYiAoZSA6IGZpbGVfYW55KSA9XG4gICAgaWYgaW5zdGFuY2VvZiBlIGJsb2JfY29uc3RyIHRoZW4gSnMuc29tZSAoVW5zYWZlLmNvZXJjZSBlIDogI2Jsb2IgdCkgZWxzZSBKcy5udWxsXG5cbiAgbGV0IHN0cmluZyAoZSA6IGZpbGVfYW55KSA9XG4gICAgaWYgdHlwZW9mIGUgPT0gc3RyaW5nIFwic3RyaW5nXCJcbiAgICB0aGVuIEpzLnNvbWUgKFVuc2FmZS5jb2VyY2UgZSA6IGpzX3N0cmluZyB0KVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBhcnJheUJ1ZmZlciAoZSA6IGZpbGVfYW55KSA9XG4gICAgaWYgaW5zdGFuY2VvZiBlIFR5cGVkX2FycmF5LmFycmF5QnVmZmVyXG4gICAgdGhlbiBKcy5zb21lIChVbnNhZmUuY29lcmNlIGUgOiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciB0KVxuICAgIGVsc2UgSnMubnVsbFxuZW5kXG5cbmNsYXNzIHR5cGUgZmlsZUxpc3QgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtmaWxlXSBEb20ubm9kZUxpc3RcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZmlsZUVycm9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNvZGUgOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBbJ2FdIHByb2dyZXNzRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFsnYV0gZXZlbnRcblxuICAgIG1ldGhvZCBsZW5ndGhDb21wdXRhYmxlIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsb2FkZWQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRvdGFsIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcHJvZ3Jlc3NFdmVudFRhcmdldCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgbWV0aG9kIG9ubG9hZHN0YXJ0IDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnByb2dyZXNzIDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvYWQgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uYWJvcnQgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZGVuZCA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG50eXBlIHJlYWR5U3RhdGUgPVxuICB8IEVNUFRZXG4gIHwgTE9BRElOR1xuICB8IERPTkVcblxuY2xhc3MgdHlwZSBmaWxlUmVhZGVyID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBtZXRob2QgcmVhZEFzQXJyYXlCdWZmZXIgOiAjYmxvYiB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWRBc0JpbmFyeVN0cmluZyA6ICNibG9iIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZEFzVGV4dCA6ICNibG9iIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZEFzVGV4dF93aXRoRW5jb2RpbmcgOiAjYmxvYiB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWRBc0RhdGFVUkwgOiAjYmxvYiB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFib3J0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IHJlYWR5U3RhdGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlc3VsdCA6IGZpbGVfYW55IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlcnJvciA6IGZpbGVFcnJvciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIGluaGVyaXQgcHJvZ3Jlc3NFdmVudFRhcmdldFxuICBlbmRcblxubW9kdWxlIFJlYWRlckV2ZW50ID0gc3RydWN0XG4gIHR5cGUgdHlwID0gZmlsZVJlYWRlciBwcm9ncmVzc0V2ZW50IHQgRG9tLkV2ZW50LnR5cFxuXG4gIGxldCBsb2Fkc3RhcnQgPSBFdmVudC5tYWtlIFwibG9hZHN0YXJ0XCJcblxuICBsZXQgcHJvZ3Jlc3MgPSBFdmVudC5tYWtlIFwicHJvZ3Jlc3NcIlxuXG4gIGxldCBhYm9ydCA9IEV2ZW50Lm1ha2UgXCJhYm9ydFwiXG5cbiAgbGV0IGVycm9yID0gRXZlbnQubWFrZSBcImVycm9yXCJcblxuICBsZXQgbG9hZCA9IEV2ZW50Lm1ha2UgXCJsb2FkXCJcblxuICBsZXQgbG9hZGVuZCA9IEV2ZW50Lm1ha2UgXCJsb2FkZW5kXCJcbmVuZFxuXG5sZXQgZmlsZVJlYWRlciA6IGZpbGVSZWFkZXIgdCBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ZpbGVSZWFkZXJcblxubGV0IGFkZEV2ZW50TGlzdGVuZXIgPSBEb20uYWRkRXZlbnRMaXN0ZW5lclxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG5leHRlcm5hbCBjYW1sX2pzX29uX2llIDogdW5pdCAtPiBib29sIHQgPSBcImNhbWxfanNfb25faWVcIlxuXG5sZXQgb25JRSA9IEpzLnRvX2Jvb2wgKGNhbWxfanNfb25faWUgKCkpXG5cbmV4dGVybmFsIGh0bWxfZXNjYXBlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNfaHRtbF9lc2NhcGVcIlxuXG5leHRlcm5hbCBkZWNvZGVfaHRtbF9lbnRpdGllcyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzX2h0bWxfZW50aXRpZXNcIlxuXG5jbGFzcyB0eXBlIGNzc1N0eWxlRGVjbGFyYXRpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2Qgc2V0UHJvcGVydHkgOlxuICAgICAganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0ZGVmIC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQcm9wZXJ0eVZhbHVlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFByb3BlcnR5UHJpb3JpdHkgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlUHJvcGVydHkgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbkRlbGF5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbkRpcmVjdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25EdXJhdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25GaWxsTW9kZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25JdGVyYXRpb25Db3VudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25OYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvblBsYXlTdGF0ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25UaW1pbmdGdW5jdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmRBdHRhY2htZW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmRDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kSW1hZ2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZFBvc2l0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmRSZXBlYXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckJvdHRvbSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJCb3R0b21Db2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJCb3R0b21TdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJCb3R0b21XaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJDb2xsYXBzZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJMZWZ0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckxlZnRDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJMZWZ0U3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyTGVmdFdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclJhZGl1cyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJSaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJSaWdodENvbG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclJpZ2h0U3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyUmlnaHRXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJTcGFjaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclRvcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJUb3BDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJUb3BTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJUb3BXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3R0b20gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2FwdGlvblNpZGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xlYXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xpcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb250ZW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvdW50ZXJJbmNyZW1lbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY291bnRlclJlc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNzc0Zsb2F0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNzc1RleHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY3Vyc29yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRpcmVjdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkaXNwbGF5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGVtcHR5Q2VsbHMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZmlsbCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnRGYW1pbHkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udFNpemUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udFN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnRWYXJpYW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnRXZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxlZnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGV0dGVyU3BhY2luZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaW5lSGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpc3RTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaXN0U3R5bGVJbWFnZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaXN0U3R5bGVQb3NpdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaXN0U3R5bGVUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5Cb3R0b20gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luTGVmdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5SaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5Ub3AgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWF4SGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1heFdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1pbkhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtaW5XaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvcGFjaXR5IDoganNfc3RyaW5nIHQgb3B0ZGVmIHByb3BcblxuICAgIG1ldGhvZCBvdXRsaW5lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG91dGxpbmVDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdXRsaW5lT2Zmc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG91dGxpbmVTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdXRsaW5lV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3ZlcmZsb3cgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3ZlcmZsb3dYIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG92ZXJmbG93WSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWRkaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZGRpbmdCb3R0b20gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFkZGluZ0xlZnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFkZGluZ1JpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZGRpbmdUb3AgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFnZUJyZWFrQWZ0ZXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFnZUJyZWFrQmVmb3JlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBvaW50ZXJFdmVudHMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcG9zaXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3Ryb2tlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0cm9rZVdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYmxlTGF5b3V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0QW5jaG9yIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHREZWNvcmF0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRJbmRlbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dFRyYW5zZm9ybSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0b3AgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdHJhbnNmb3JtIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZlcnRpY2FsQWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdmlzaWJpbGl0eSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aGl0ZVNwYWNlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdvcmRTcGFjaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHpJbmRleCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbnR5cGUgKCdhLCAnYikgZXZlbnRfbGlzdGVuZXIgPSAoJ2EsICdiKSBEb20uZXZlbnRfbGlzdGVuZXJcblxudHlwZSBtb3VzZV9idXR0b24gPVxuICB8IE5vX2J1dHRvblxuICB8IExlZnRfYnV0dG9uXG4gIHwgTWlkZGxlX2J1dHRvblxuICB8IFJpZ2h0X2J1dHRvblxuXG50eXBlIGRlbHRhX21vZGUgPVxuICB8IERlbHRhX3BpeGVsXG4gIHwgRGVsdGFfbGluZVxuICB8IERlbHRhX3BhZ2VcblxuY2xhc3MgdHlwZSBldmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2VsZW1lbnRdIERvbS5ldmVudFxuICBlbmRcblxuYW5kIFsnYV0gY3VzdG9tRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtlbGVtZW50LCAnYV0gRG9tLmN1c3RvbUV2ZW50XG4gIGVuZFxuXG5hbmQgZm9jdXNFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCByZWxhdGVkVGFyZ2V0IDogZWxlbWVudCB0IG9wdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIG1vdXNlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgcmVsYXRlZFRhcmdldCA6IGVsZW1lbnQgdCBvcHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRYIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRZIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5YIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5ZIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRYIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRZIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdHJsS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzaGlmdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWx0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZXRhS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBidXR0b24gOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdoaWNoIDogbW91c2VfYnV0dG9uIG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZnJvbUVsZW1lbnQgOiBlbGVtZW50IHQgb3B0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdG9FbGVtZW50IDogZWxlbWVudCB0IG9wdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VYIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFnZVkgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBrZXlib2FyZEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGFsdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2hpZnRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN0cmxLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1ldGFLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxvY2F0aW9uIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBrZXkgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvZGUgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdoaWNoIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2hhckNvZGUgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBrZXlDb2RlIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRNb2RpZmllclN0YXRlIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBrZXlJZGVudGlmaWVyIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBtb3VzZXdoZWVsRXZlbnQgPVxuICBvYmplY3RcbiAgICAoKiBBbGwgbW9kZXJuIGJyb3dzZXJzICopXG4gICAgaW5oZXJpdCBtb3VzZUV2ZW50XG5cbiAgICBtZXRob2Qgd2hlZWxEZWx0YSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2hlZWxEZWx0YVggOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aGVlbERlbHRhWSA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRlbHRhWCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZWx0YVkgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGVsdGFaIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRlbHRhTW9kZSA6IGRlbHRhX21vZGUgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIG1vdXNlU2Nyb2xsRXZlbnQgPVxuICBvYmplY3RcbiAgICAoKiBGaXJlZm94ICopXG4gICAgaW5oZXJpdCBtb3VzZUV2ZW50XG5cbiAgICBtZXRob2QgZGV0YWlsIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBheGlzIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0hPUklaT05UQUxfQVhJUyA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJUSUNBTF9BWElTIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgdG91Y2hFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCB0b3VjaGVzIDogdG91Y2hMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldFRvdWNoZXMgOiB0b3VjaExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2hhbmdlZFRvdWNoZXMgOiB0b3VjaExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3RybEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2hpZnRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWV0YUtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVsYXRlZFRhcmdldCA6IGVsZW1lbnQgdCBvcHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCB0b3VjaExpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+IHRvdWNoIHQgb3B0ZGVmIG1ldGhcbiAgZW5kXG5cbmFuZCB0b3VjaCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBpZGVudGlmaWVyIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBlbGVtZW50IHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5YIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5ZIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRYIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRZIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYWdlWCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFnZVkgOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHN1Ym1pdEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHN1Ym1pdHRlciA6IGVsZW1lbnQgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGRyYWdFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbW91c2VFdmVudFxuXG4gICAgbWV0aG9kIGRhdGFUcmFuc2ZlciA6IGRhdGFUcmFuc2ZlciB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBjbGlwYm9hcmRFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBjbGlwYm9hcmREYXRhIDogZGF0YVRyYW5zZmVyIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGRhdGFUcmFuc2ZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBkcm9wRWZmZWN0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGVmZmVjdEFsbG93ZWQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZmlsZXMgOiBGaWxlLmZpbGVMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHR5cGVzIDoganNfc3RyaW5nIHQganNfYXJyYXkgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWRkRWxlbWVudCA6IGVsZW1lbnQgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhckRhdGEgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhckRhdGFfYWxsIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RGF0YSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzZXREYXRhIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RHJhZ0ltYWdlIDogZWxlbWVudCB0IC0+IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5hbmQgZXZlbnRUYXJnZXQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIG1ldGhvZCBvbmNsaWNrIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRibGNsaWNrIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1vdXNlZG93biA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tb3VzZXVwIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1vdXNlb3ZlciA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tb3VzZW1vdmUgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubW91c2VvdXQgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ua2V5cHJlc3MgOiAoJ3NlbGYgdCwga2V5Ym9hcmRFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ua2V5ZG93biA6ICgnc2VsZiB0LCBrZXlib2FyZEV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25rZXl1cCA6ICgnc2VsZiB0LCBrZXlib2FyZEV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zY3JvbGwgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbndoZWVsIDogKCdzZWxmIHQsIG1vdXNld2hlZWxFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZ3N0YXJ0IDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZ2VuZCA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWdlbnRlciA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWdvdmVyIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZ2xlYXZlIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHJhZyA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyb3AgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25hbmltYXRpb25zdGFydCA6ICgnc2VsZiB0LCBhbmltYXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uYW5pbWF0aW9uZW5kIDogKCdzZWxmIHQsIGFuaW1hdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25hbmltYXRpb25pdGVyYXRpb24gOlxuICAgICAgKCdzZWxmIHQsIGFuaW1hdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25hbmltYXRpb25jYW5jZWwgOiAoJ3NlbGYgdCwgYW5pbWF0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnRyYW5zaXRpb25ydW4gOiAoJ3NlbGYgdCwgdHJhbnNpdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb250cmFuc2l0aW9uc3RhcnQgOiAoJ3NlbGYgdCwgdHJhbnNpdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb250cmFuc2l0aW9uZW5kIDogKCdzZWxmIHQsIHRyYW5zaXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9udHJhbnNpdGlvbmNhbmNlbCA6ICgnc2VsZiB0LCB0cmFuc2l0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmdvdHBvaW50ZXJjYXB0dXJlIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9zdHBvaW50ZXJjYXB0dXJlIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcmVudGVyIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcmNhbmNlbCA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJkb3duIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcmxlYXZlIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcm1vdmUgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVyb3V0IDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcm92ZXIgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVydXAgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGlzcGF0Y2hFdmVudCA6IGV2ZW50IHQgLT4gYm9vbCB0IG1ldGhcbiAgZW5kXG5cbmFuZCBwb3BTdGF0ZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHN0YXRlIDogSnMuVW5zYWZlLmFueSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgcG9pbnRlckV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBtb3VzZUV2ZW50XG5cbiAgICBtZXRob2QgcG9pbnRlcklkIDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJlc3N1cmUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFuZ2VudGlhbFByZXNzdXJlIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRpbHRYIDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aWx0WSA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdHdpc3QgOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBvaW50ZXJUeXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlzUHJpbWFyeSA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgc3RvcmFnZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGtleSA6IGpzX3N0cmluZyB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2xkVmFsdWUgOiBqc19zdHJpbmcgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5ld1ZhbHVlIDoganNfc3RyaW5nIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1cmwgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RvcmFnZUFyZWEgOiBzdG9yYWdlIHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBzdG9yYWdlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qga2V5IDogaW50IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SXRlbSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SXRlbSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUl0ZW0gOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhciA6IHVuaXQgbWV0aFxuICBlbmRcblxuYW5kIGhhc2hDaGFuZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBvbGRVUkwgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmV3VVJMIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGFuaW1hdGlvbkV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbk5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZWxhcHNlZFRpbWUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHNldWRvRWxlbWVudCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCB0cmFuc2l0aW9uRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgcHJvcGVydHlOYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVsYXBzZWRUaW1lIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBzZXVkb0VsZW1lbnQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgbWVkaWFFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcbiAgZW5kXG5cbmFuZCBtZXNzYWdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgZGF0YSA6IFVuc2FmZS5hbnkgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzb3VyY2UgOiBVbnNhZmUuYW55IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgbm9kZVNlbGVjdG9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHF1ZXJ5U2VsZWN0b3IgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBxdWVyeVNlbGVjdG9yQWxsIDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCBEb20ubm9kZUxpc3QgdCBtZXRoXG4gIGVuZFxuXG5hbmQgdG9rZW5MaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiBqc19zdHJpbmcgdCBvcHRkZWYgbWV0aFxuXG4gICAgbWV0aG9kIGNvbnRhaW5zIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBhZGQgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmUgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0b2dnbGUgOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cmluZ2lmaWVyIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuYW5kIGVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IERvbS5lbGVtZW50XG5cbiAgICBpbmhlcml0IG5vZGVTZWxlY3RvclxuXG4gICAgbWV0aG9kIGlkIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRpdGxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxhbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGlyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsYXNzTmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGFzc0xpc3QgOiB0b2tlbkxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xvc2VzdCA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHN0eWxlIDogY3NzU3R5bGVEZWNsYXJhdGlvbiB0IHByb3BcblxuICAgIG1ldGhvZCBpbm5lckhUTUwgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3V0ZXJIVE1MIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRDb250ZW50IDoganNfc3RyaW5nIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBpbm5lclRleHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xpZW50TGVmdCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50VG9wIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbGllbnRXaWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50SGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRMZWZ0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRUb3AgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldFBhcmVudCA6IGVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9mZnNldFdpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRIZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbExlZnQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbFRvcCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsV2lkdGggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbEhlaWdodCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgZ2V0Q2xpZW50UmVjdHMgOiBjbGllbnRSZWN0TGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgOiBjbGllbnRSZWN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNjcm9sbEludG9WaWV3IDogYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsaWNrIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZm9jdXMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibHVyIDogdW5pdCBtZXRoXG5cbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG4gIGVuZFxuXG5hbmQgY2xpZW50UmVjdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0b3AgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmlnaHQgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYm90dG9tIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxlZnQgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBmbG9hdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGZsb2F0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgY2xpZW50UmVjdExpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+IGNsaWVudFJlY3QgdCBvcHQgbWV0aFxuICBlbmRcblxubGV0IG5vX2hhbmRsZXIgOiAoJ2EsICdiKSBldmVudF9saXN0ZW5lciA9IERvbS5ub19oYW5kbGVyXG5cbmxldCBoYW5kbGVyID0gRG9tLmhhbmRsZXJcblxubGV0IGZ1bGxfaGFuZGxlciA9IERvbS5mdWxsX2hhbmRsZXJcblxubGV0IGludm9rZV9oYW5kbGVyID0gRG9tLmludm9rZV9oYW5kbGVyXG5cbm1vZHVsZSBFdmVudCA9IHN0cnVjdFxuICB0eXBlICdhIHR5cCA9ICdhIERvbS5FdmVudC50eXBcblxuICBsZXQgY2xpY2sgPSBEb20uRXZlbnQubWFrZSBcImNsaWNrXCJcblxuICBsZXQgY29weSA9IERvbS5FdmVudC5tYWtlIFwiY29weVwiXG5cbiAgbGV0IGN1dCA9IERvbS5FdmVudC5tYWtlIFwiY3V0XCJcblxuICBsZXQgcGFzdGUgPSBEb20uRXZlbnQubWFrZSBcInBhc3RlXCJcblxuICBsZXQgZGJsY2xpY2sgPSBEb20uRXZlbnQubWFrZSBcImRibGNsaWNrXCJcblxuICBsZXQgbW91c2Vkb3duID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZWRvd25cIlxuXG4gIGxldCBtb3VzZXVwID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZXVwXCJcblxuICBsZXQgbW91c2VvdmVyID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZW92ZXJcIlxuXG4gIGxldCBtb3VzZW1vdmUgPSBEb20uRXZlbnQubWFrZSBcIm1vdXNlbW92ZVwiXG5cbiAgbGV0IG1vdXNlb3V0ID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZW91dFwiXG5cbiAgbGV0IGtleXByZXNzID0gRG9tLkV2ZW50Lm1ha2UgXCJrZXlwcmVzc1wiXG5cbiAgbGV0IGtleWRvd24gPSBEb20uRXZlbnQubWFrZSBcImtleWRvd25cIlxuXG4gIGxldCBrZXl1cCA9IERvbS5FdmVudC5tYWtlIFwia2V5dXBcIlxuXG4gIGxldCBtb3VzZXdoZWVsID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZXdoZWVsXCJcblxuICBsZXQgd2hlZWwgPSBEb20uRXZlbnQubWFrZSBcIndoZWVsXCJcblxuICBsZXQgX0RPTU1vdXNlU2Nyb2xsID0gRG9tLkV2ZW50Lm1ha2UgXCJET01Nb3VzZVNjcm9sbFwiXG5cbiAgbGV0IHRvdWNoc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcInRvdWNoc3RhcnRcIlxuXG4gIGxldCB0b3VjaG1vdmUgPSBEb20uRXZlbnQubWFrZSBcInRvdWNobW92ZVwiXG5cbiAgbGV0IHRvdWNoZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJ0b3VjaGVuZFwiXG5cbiAgbGV0IHRvdWNoY2FuY2VsID0gRG9tLkV2ZW50Lm1ha2UgXCJ0b3VjaGNhbmNlbFwiXG5cbiAgbGV0IGRyYWdzdGFydCA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ3N0YXJ0XCJcblxuICBsZXQgZHJhZ2VuZCA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ2VuZFwiXG5cbiAgbGV0IGRyYWdlbnRlciA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ2VudGVyXCJcblxuICBsZXQgZHJhZ292ZXIgPSBEb20uRXZlbnQubWFrZSBcImRyYWdvdmVyXCJcblxuICBsZXQgZHJhZ2xlYXZlID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnbGVhdmVcIlxuXG4gIGxldCBkcmFnID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnXCJcblxuICBsZXQgZHJvcCA9IERvbS5FdmVudC5tYWtlIFwiZHJvcFwiXG5cbiAgbGV0IGhhc2hjaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcImhhc2hjaGFuZ2VcIlxuXG4gIGxldCBjaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcImNoYW5nZVwiXG5cbiAgbGV0IGlucHV0ID0gRG9tLkV2ZW50Lm1ha2UgXCJpbnB1dFwiXG5cbiAgbGV0IHRpbWV1cGRhdGUgPSBEb20uRXZlbnQubWFrZSBcInRpbWV1cGRhdGVcIlxuXG4gIGxldCBzdWJtaXQgPSBEb20uRXZlbnQubWFrZSBcInN1Ym1pdFwiXG5cbiAgbGV0IHNjcm9sbCA9IERvbS5FdmVudC5tYWtlIFwic2Nyb2xsXCJcblxuICBsZXQgZm9jdXMgPSBEb20uRXZlbnQubWFrZSBcImZvY3VzXCJcblxuICBsZXQgYmx1ciA9IERvbS5FdmVudC5tYWtlIFwiYmx1clwiXG5cbiAgbGV0IGxvYWQgPSBEb20uRXZlbnQubWFrZSBcImxvYWRcIlxuXG4gIGxldCB1bmxvYWQgPSBEb20uRXZlbnQubWFrZSBcInVubG9hZFwiXG5cbiAgbGV0IGJlZm9yZXVubG9hZCA9IERvbS5FdmVudC5tYWtlIFwiYmVmb3JldW5sb2FkXCJcblxuICBsZXQgcmVzaXplID0gRG9tLkV2ZW50Lm1ha2UgXCJyZXNpemVcIlxuXG4gIGxldCBvcmllbnRhdGlvbmNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwib3JpZW50YXRpb25jaGFuZ2VcIlxuXG4gIGxldCBwb3BzdGF0ZSA9IERvbS5FdmVudC5tYWtlIFwicG9wc3RhdGVcIlxuXG4gIGxldCBlcnJvciA9IERvbS5FdmVudC5tYWtlIFwiZXJyb3JcIlxuXG4gIGxldCBhYm9ydCA9IERvbS5FdmVudC5tYWtlIFwiYWJvcnRcIlxuXG4gIGxldCBzZWxlY3QgPSBEb20uRXZlbnQubWFrZSBcInNlbGVjdFwiXG5cbiAgbGV0IG9ubGluZSA9IERvbS5FdmVudC5tYWtlIFwib25saW5lXCJcblxuICBsZXQgb2ZmbGluZSA9IERvbS5FdmVudC5tYWtlIFwib2ZmbGluZVwiXG5cbiAgbGV0IGNoZWNraW5nID0gRG9tLkV2ZW50Lm1ha2UgXCJjaGVja2luZ1wiXG5cbiAgbGV0IG5vdXBkYXRlID0gRG9tLkV2ZW50Lm1ha2UgXCJub3VwZGF0ZVwiXG5cbiAgbGV0IGRvd25sb2FkaW5nID0gRG9tLkV2ZW50Lm1ha2UgXCJkb3dubG9hZGluZ1wiXG5cbiAgbGV0IHByb2dyZXNzID0gRG9tLkV2ZW50Lm1ha2UgXCJwcm9ncmVzc1wiXG5cbiAgbGV0IHVwZGF0ZXJlYWR5ID0gRG9tLkV2ZW50Lm1ha2UgXCJ1cGRhdGVyZWFkeVwiXG5cbiAgbGV0IGNhY2hlZCA9IERvbS5FdmVudC5tYWtlIFwiY2FjaGVkXCJcblxuICBsZXQgb2Jzb2xldGUgPSBEb20uRXZlbnQubWFrZSBcIm9ic29sZXRlXCJcblxuICBsZXQgZG9tQ29udGVudExvYWRlZCA9IERvbS5FdmVudC5tYWtlIFwiRE9NQ29udGVudExvYWRlZFwiXG5cbiAgbGV0IGFuaW1hdGlvbnN0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJhbmltYXRpb25zdGFydFwiXG5cbiAgbGV0IGFuaW1hdGlvbmVuZCA9IERvbS5FdmVudC5tYWtlIFwiYW5pbWF0aW9uZW5kXCJcblxuICBsZXQgYW5pbWF0aW9uaXRlcmF0aW9uID0gRG9tLkV2ZW50Lm1ha2UgXCJhbmltYXRpb25pdGVyYXRpb25cIlxuXG4gIGxldCBhbmltYXRpb25jYW5jZWwgPSBEb20uRXZlbnQubWFrZSBcImFuaW1hdGlvbmNhbmNlbFwiXG5cbiAgbGV0IHRyYW5zaXRpb25ydW4gPSBEb20uRXZlbnQubWFrZSBcInRyYW5zaXRpb25ydW5cIlxuXG4gIGxldCB0cmFuc2l0aW9uc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcInRyYW5zaXRpb25zdGFydFwiXG5cbiAgbGV0IHRyYW5zaXRpb25lbmQgPSBEb20uRXZlbnQubWFrZSBcInRyYW5zaXRpb25lbmRcIlxuXG4gIGxldCB0cmFuc2l0aW9uY2FuY2VsID0gRG9tLkV2ZW50Lm1ha2UgXCJ0cmFuc2l0aW9uY2FuY2VsXCJcblxuICBsZXQgY2FucGxheSA9IERvbS5FdmVudC5tYWtlIFwiY2FucGxheVwiXG5cbiAgbGV0IGNhbnBsYXl0aHJvdWdoID0gRG9tLkV2ZW50Lm1ha2UgXCJjYW5wbGF5dGhyb3VnaFwiXG5cbiAgbGV0IGR1cmF0aW9uY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJkdXJhdGlvbmNoYW5nZVwiXG5cbiAgbGV0IGVtcHRpZWQgPSBEb20uRXZlbnQubWFrZSBcImVtcHRpZWRcIlxuXG4gIGxldCBlbmRlZCA9IERvbS5FdmVudC5tYWtlIFwiZW5kZWRcIlxuXG4gIGxldCBnb3Rwb2ludGVyY2FwdHVyZSA9IERvbS5FdmVudC5tYWtlIFwiZ290cG9pbnRlcmNhcHR1cmVcIlxuXG4gIGxldCBsb2FkZWRkYXRhID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2FkZWRkYXRhXCJcblxuICBsZXQgbG9hZGVkbWV0YWRhdGEgPSBEb20uRXZlbnQubWFrZSBcImxvYWRlZG1ldGFkYXRhXCJcblxuICBsZXQgbG9hZHN0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2Fkc3RhcnRcIlxuXG4gIGxldCBsb3N0cG9pbnRlcmNhcHR1cmUgPSBEb20uRXZlbnQubWFrZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiXG5cbiAgbGV0IG1lc3NhZ2UgPSBEb20uRXZlbnQubWFrZSBcIm1lc3NhZ2VcIlxuXG4gIGxldCBwYXVzZSA9IERvbS5FdmVudC5tYWtlIFwicGF1c2VcIlxuXG4gIGxldCBwbGF5ID0gRG9tLkV2ZW50Lm1ha2UgXCJwbGF5XCJcblxuICBsZXQgcGxheWluZyA9IERvbS5FdmVudC5tYWtlIFwicGxheWluZ1wiXG5cbiAgbGV0IHBvaW50ZXJlbnRlciA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcmVudGVyXCJcblxuICBsZXQgcG9pbnRlcmNhbmNlbCA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcmNhbmNlbFwiXG5cbiAgbGV0IHBvaW50ZXJkb3duID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVyZG93blwiXG5cbiAgbGV0IHBvaW50ZXJsZWF2ZSA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcmxlYXZlXCJcblxuICBsZXQgcG9pbnRlcm1vdmUgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJtb3ZlXCJcblxuICBsZXQgcG9pbnRlcm91dCA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcm91dFwiXG5cbiAgbGV0IHBvaW50ZXJvdmVyID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVyb3ZlclwiXG5cbiAgbGV0IHBvaW50ZXJ1cCA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcnVwXCJcblxuICBsZXQgcmF0ZWNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwicmF0ZWNoYW5nZVwiXG5cbiAgbGV0IHNlZWtlZCA9IERvbS5FdmVudC5tYWtlIFwic2Vla2VkXCJcblxuICBsZXQgc2Vla2luZyA9IERvbS5FdmVudC5tYWtlIFwic2Vla2luZ1wiXG5cbiAgbGV0IHN0YWxsZWQgPSBEb20uRXZlbnQubWFrZSBcInN0YWxsZWRcIlxuXG4gIGxldCBzdXNwZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJzdXNwZW5kXCJcblxuICBsZXQgdm9sdW1lY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJ2b2x1bWVjaGFuZ2VcIlxuXG4gIGxldCB3YWl0aW5nID0gRG9tLkV2ZW50Lm1ha2UgXCJ3YWl0aW5nXCJcblxuICBsZXQgbWFrZSA9IERvbS5FdmVudC5tYWtlXG5lbmRcblxudHlwZSBldmVudF9saXN0ZW5lcl9pZCA9IERvbS5ldmVudF9saXN0ZW5lcl9pZFxuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lciA9IERvbS5hZGRFdmVudExpc3RlbmVyXG5cbmxldCBhZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgPSBEb20uYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zXG5cbmxldCByZW1vdmVFdmVudExpc3RlbmVyID0gRG9tLnJlbW92ZUV2ZW50TGlzdGVuZXJcblxubGV0IGNyZWF0ZUN1c3RvbUV2ZW50ID0gRG9tLmNyZWF0ZUN1c3RvbUV2ZW50XG5cbmNsYXNzIHR5cGUgWydub2RlXSBjb2xsZWN0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgbmFtZWRJdGVtIDoganNfc3RyaW5nIHQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSBodG1sRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBoZWFkRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHByb2ZpbGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGxpbmtFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY3Jvc3NvcmlnaW4gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBocmVmbGFuZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtZWRpYSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZWwgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmV2IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGl0bGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgdGV4dCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbWV0YUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjb250ZW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGh0dHBFcXVpdiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNjaGVtZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYmFzZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBocmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgc3R5bGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1lZGlhIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBib2R5RWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBmb3JtRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGVsZW1lbnRzIDogZWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXB0Q2hhcnNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZW5jdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfbWV0aG9kIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdWJtaXQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXNldCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG9uc3VibWl0IDogKCdzZWxmIHQsIHN1Ym1pdEV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG9wdEdyb3VwRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBsYWJlbCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgb3B0aW9uRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgb3B0R3JvdXBFbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZWZhdWx0U2VsZWN0ZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgc2VsZWN0RWxlbWVudCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0ZWRJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9wdGlvbnMgOiBvcHRpb25FbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG11bHRpcGxlIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNpemUgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBhZGQgOiAjb3B0R3JvdXBFbGVtZW50IHQgLT4gI29wdEdyb3VwRWxlbWVudCB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmUgOiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVxdWlyZWQgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmNoYW5nZSA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25pbnB1dCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGlucHV0RWxlbWVudCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZGVmYXVsdFZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRlZmF1bHRDaGVja2VkIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXB0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hlY2tlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1heExlbmd0aCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkT25seSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVxdWlyZWQgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzaXplIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVzZU1hcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3QgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmaWxlcyA6IEZpbGUuZmlsZUxpc3QgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBsYWNlaG9sZGVyIDoganNfc3RyaW5nIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25EaXJlY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uU3RhcnQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvbkVuZCA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgb25zZWxlY3QgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uY2hhbmdlIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmlucHV0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmJsdXIgOiAoJ3NlbGYgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25mb2N1cyA6ICgnc2VsZiB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGV4dEFyZWFFbGVtZW50ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBkZWZhdWx0VmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29scyA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZE9ubHkgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJvd3MgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvbkRpcmVjdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25FbmQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvblN0YXJ0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVxdWlyZWQgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwbGFjZWhvbGRlciA6IGpzX3N0cmluZyB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zZWxlY3QgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uY2hhbmdlIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmlucHV0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmJsdXIgOiAoJ3NlbGYgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25mb2N1cyA6ICgnc2VsZiB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYnV0dG9uRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbGFiZWxFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHRtbEZvciA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZmllbGRTZXRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbGVnZW5kRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB1TGlzdEVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgb0xpc3RFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGRMaXN0RWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBsaUVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgZGl2RWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBwYXJhZ3JhcGhFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGhlYWRpbmdFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIHF1b3RlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNpdGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHByZUVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgYnJFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGhyRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBtb2RFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY2l0ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkYXRlVGltZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYW5jaG9yRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaGFyc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvb3JkcyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBocmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhyZWZsYW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVsIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJldiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzaGFwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBpbWFnZUVsZW1lbnQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFsdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdXNlTWFwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGlzTWFwIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBuYXR1cmFsV2lkdGggOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuYXR1cmFsSGVpZ2h0IDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29tcGxldGUgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25lcnJvciA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25hYm9ydCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG9iamVjdEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvZGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYXJjaGl2ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2RlQmFzZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2RlVHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkYXRhIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRlY2xhcmUgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0YW5kYnkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHVzZU1hcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkb2N1bWVudCA6IERvbS5lbGVtZW50IERvbS5kb2N1bWVudCB0IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBhcmFtRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWVUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBhcmVhRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29vcmRzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhyZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgbm9IcmVmIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBzaGFwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBtYXBFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYXJlYXMgOiBhcmVhRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHNjcmlwdEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCB0ZXh0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGVmZXIgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhc3luYyA6IGJvb2wgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGVtYmVkRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRhYmxlQ2VsbEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjZWxsSW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFiYnIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYXhpcyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaE9mZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb2xTcGFuIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBoZWFkZXJzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJvd1NwYW4gOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNjb3BlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGFibGVSb3dFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2Qgcm93SW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlY3Rpb25Sb3dJbmRleCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2VsbHMgOiB0YWJsZUNlbGxFbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hPZmYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdkFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGluc2VydENlbGwgOiBpbnQgLT4gdGFibGVDZWxsRWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVDZWxsIDogaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSB0YWJsZUNvbEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaE9mZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzcGFuIDogaW50IHByb3BcblxuICAgIG1ldGhvZCB2QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRhYmxlU2VjdGlvbkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaE9mZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgcm93cyA6IHRhYmxlUm93RWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGluc2VydFJvdyA6IGludCAtPiB0YWJsZVJvd0VsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlUm93IDogaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSB0YWJsZUNhcHRpb25FbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIHRhYmxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNhcHRpb24gOiB0YWJsZUNhcHRpb25FbGVtZW50IHQgcHJvcFxuXG4gICAgbWV0aG9kIHRIZWFkIDogdGFibGVTZWN0aW9uRWxlbWVudCB0IHByb3BcblxuICAgIG1ldGhvZCB0Rm9vdCA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCBwcm9wXG5cbiAgICBtZXRob2Qgcm93cyA6IHRhYmxlUm93RWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRCb2RpZXMgOiB0YWJsZVNlY3Rpb25FbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNlbGxQYWRkaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNlbGxTcGFjaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZyYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJ1bGVzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN1bW1hcnkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY3JlYXRlVEhlYWQgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVRIZWFkIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlVEZvb3QgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVRGb290IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlQ2FwdGlvbiA6IHRhYmxlQ2FwdGlvbkVsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlQ2FwdGlvbiA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluc2VydFJvdyA6IGludCAtPiB0YWJsZVJvd0VsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlUm93IDogaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSB0aW1lUmFuZ2VzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhcnQgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGVuZF8gOiBpbnQgLT4gZmxvYXQgbWV0aFxuICBlbmRcblxudHlwZSBuZXR3b3JrU3RhdGUgPVxuICB8IE5FVFdPUktfRU1QVFlcbiAgfCBORVRXT1JLX0lETEVcbiAgfCBORVRXT1JLX0xPQURJTkdcbiAgfCBORVRXT1JLX05PX1NPVVJDRVxuXG50eXBlIHJlYWR5U3RhdGUgPVxuICB8IEhBVkVfTk9USElOR1xuICB8IEhBVkVfTUVUQURBVEFcbiAgfCBIQVZFX0NVUlJFTlRfREFUQVxuICB8IEhBVkVfRlVUVVJFX0RBVEFcbiAgfCBIQVZFX0VOT1VHSF9EQVRBXG5cbigqIGh0dHA6Ly93d3cudzNzY2hvb2xzLmNvbS90YWdzL3JlZl9hdl9kb20uYXNwICopXG4oKiBvbmx5IGZlYXR1cmVzIHN1cHBvcnRlZCBieSBhbGwgYnJvd3Nlci4gKElFOSspICopXG5jbGFzcyB0eXBlIG1lZGlhRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNhblBsYXlUeXBlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGxvYWQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwbGF5IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcGF1c2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhdXRvcGxheSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgYnVmZmVyZWQgOiB0aW1lUmFuZ2VzIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRyb2xzIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBjdXJyZW50U3JjIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRUaW1lIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGR1cmF0aW9uIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVuZGVkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsb29wIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBtZWRpYWdyb3VwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG11dGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBuZXR3b3JrU3RhdGVfaW50IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuZXR3b3JrU3RhdGUgOiBuZXR3b3JrU3RhdGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhdXNlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGxheWJhY2tSYXRlIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHBsYXllZCA6IHRpbWVSYW5nZXMgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJlbG9hZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlX2ludCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IHJlYWR5U3RhdGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlZWthYmxlIDogdGltZVJhbmdlcyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWVraW5nIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgdm9sdW1lIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIG9uY2FucGxheSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25jYW5wbGF5dGhyb3VnaCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kdXJhdGlvbmNoYW5nZSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25lbXB0aWVkIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmVuZGVkIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvYWRlZGRhdGEgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZGVkbWV0YWRhdGEgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubG9hZHN0YXJ0IDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBhdXNlIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBsYXkgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucGxheWluZyA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25yYXRlY2hhbmdlIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnNlZWtlZCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zZWVraW5nIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnN0YWxsZWQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc3VzcGVuZCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb252b2x1bWVjaGFuZ2UgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ud2FpdGluZyA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGF1ZGlvRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbWVkaWFFbGVtZW50XG4gIGVuZFxuXG5jbGFzcyB0eXBlIHZpZGVvRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbWVkaWFFbGVtZW50XG4gIGVuZFxuXG50eXBlIGNvbnRleHQgPSBqc19zdHJpbmcgdFxuXG5sZXQgXzJkXyA9IEpzLnN0cmluZyBcIjJkXCJcblxudHlwZSBjYW52YXNQYXR0ZXJuXG5cbmNsYXNzIHR5cGUgY2FudmFzRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHdpZHRoIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHRvRGF0YVVSTCA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0RhdGFVUkxfdHlwZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0RhdGFVUkxfdHlwZV9jb21wcmVzc2lvbiA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDb250ZXh0IDoganNfc3RyaW5nIHQgLT4gY2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHQgbWV0aFxuICBlbmRcblxuYW5kIGNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjYW52YXMgOiBjYW52YXNFbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNhdmUgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXN0b3JlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2NhbGUgOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByb3RhdGUgOiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0cmFuc2xhdGUgOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0cmFuc2Zvcm0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRUcmFuc2Zvcm0gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnbG9iYWxBbHBoYSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3Ryb2tlU3R5bGUgOiBqc19zdHJpbmcgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0cm9rZVN0eWxlX2dyYWRpZW50IDogY2FudmFzR3JhZGllbnQgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0cm9rZVN0eWxlX3BhdHRlcm4gOiBjYW52YXNQYXR0ZXJuIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWxsU3R5bGUgOiBqc19zdHJpbmcgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbGxTdHlsZV9ncmFkaWVudCA6IGNhbnZhc0dyYWRpZW50IHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWxsU3R5bGVfcGF0dGVybiA6IGNhbnZhc1BhdHRlcm4gdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNyZWF0ZUxpbmVhckdyYWRpZW50IDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGNhbnZhc0dyYWRpZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVJhZGlhbEdyYWRpZW50IDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGNhbnZhc0dyYWRpZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVBhdHRlcm4gOiBpbWFnZUVsZW1lbnQgdCAtPiBqc19zdHJpbmcgdCAtPiBjYW52YXNQYXR0ZXJuIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVBhdHRlcm5fZnJvbUNhbnZhcyA6XG4gICAgICBjYW52YXNFbGVtZW50IHQgLT4ganNfc3RyaW5nIHQgLT4gY2FudmFzUGF0dGVybiB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVQYXR0ZXJuX2Zyb21WaWRlbyA6IHZpZGVvRWxlbWVudCB0IC0+IGpzX3N0cmluZyB0IC0+IGNhbnZhc1BhdHRlcm4gdCBtZXRoXG5cbiAgICBtZXRob2QgbGluZVdpZHRoIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGxpbmVDYXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGluZUpvaW4gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWl0ZXJMaW1pdCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBzaGFkb3dPZmZzZXRYIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYWRvd09mZnNldFkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhZG93Qmx1ciA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBzaGFkb3dDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGVhclJlY3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmaWxsUmVjdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cm9rZVJlY3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiZWdpblBhdGggOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9zZVBhdGggOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBtb3ZlVG8gOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsaW5lVG8gOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBxdWFkcmF0aWNDdXJ2ZVRvIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmV6aWVyQ3VydmVUbyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFyY1RvIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVjdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFyYyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmaWxsIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Ryb2tlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xpcCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGlzUG9pbnRJblBhdGggOiBmbG9hdCAtPiBmbG9hdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdGb2N1c1JpbmcgOiAjZWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGZvbnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dEFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRCYXNlbGluZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmaWxsVGV4dCA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZpbGxUZXh0X3dpdGhXaWR0aCA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cm9rZVRleHQgOiBqc19zdHJpbmcgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJva2VUZXh0X3dpdGhXaWR0aCA6IGpzX3N0cmluZyB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG1lYXN1cmVUZXh0IDoganNfc3RyaW5nIHQgLT4gdGV4dE1ldHJpY3MgdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlIDogaW1hZ2VFbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX3dpdGhTaXplIDpcbiAgICAgIGltYWdlRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mdWxsIDpcbiAgICAgICAgIGltYWdlRWxlbWVudCB0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mcm9tQ2FudmFzIDogY2FudmFzRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mcm9tQ2FudmFzV2l0aFNpemUgOlxuICAgICAgY2FudmFzRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mdWxsRnJvbUNhbnZhcyA6XG4gICAgICAgICBjYW52YXNFbGVtZW50IHRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Zyb21WaWRlb1dpdGhWaWRlbyA6IHZpZGVvRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mcm9tVmlkZW9XaXRoU2l6ZSA6XG4gICAgICB2aWRlb0VsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnVsbEZyb21WaWRlbyA6XG4gICAgICAgICB2aWRlb0VsZW1lbnQgdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVJbWFnZURhdGEgOiBpbnQgLT4gaW50IC0+IGltYWdlRGF0YSB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbWFnZURhdGEgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBpbWFnZURhdGEgdCBtZXRoXG5cbiAgICBtZXRob2QgcHV0SW1hZ2VEYXRhIDogaW1hZ2VEYXRhIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5hbmQgY2FudmFzR3JhZGllbnQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYWRkQ29sb3JTdG9wIDogZmxvYXQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5hbmQgdGV4dE1ldHJpY3MgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgd2lkdGggOiBmbG9hdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgaW1hZ2VEYXRhID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHdpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRhdGEgOiBjYW52YXNQaXhlbEFycmF5IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGNhbnZhc1BpeGVsQXJyYXkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmV4dGVybmFsIHBpeGVsX2dldCA6IGNhbnZhc1BpeGVsQXJyYXkgdCAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX2pzX2dldFwiXG5cbmV4dGVybmFsIHBpeGVsX3NldCA6IGNhbnZhc1BpeGVsQXJyYXkgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfanNfc2V0XCJcblxuY2xhc3MgdHlwZSByYW5nZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjb2xsYXBzZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXJ0T2Zmc2V0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbmRPZmZzZXQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXJ0Q29udGFpbmVyIDogRG9tLm5vZGUgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZW5kQ29udGFpbmVyIDogRG9tLm5vZGUgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2V0U3RhcnQgOiBEb20ubm9kZSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRFbmQgOiBEb20ubm9kZSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTdGFydEJlZm9yZSA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RW5kQmVmb3JlIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTdGFydEFmdGVyIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRFbmRBZnRlciA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VsZWN0Tm9kZSA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VsZWN0Tm9kZUNvbnRlbnRzIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb2xsYXBzZSA6IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9uZUNvbnRlbnRzIDogRG9tLmRvY3VtZW50RnJhZ21lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZXh0cmFjdENvbnRlbnRzIDogRG9tLmRvY3VtZW50RnJhZ21lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlQ29udGVudHMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbnNlcnROb2RlIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdXJyb3VuZENvbnRlbnRzIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9uZVJhbmdlIDogcmFuZ2UgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG4oKiogSW5mb3JtYXRpb24gb24gY3VycmVudCBzZWxlY3Rpb24gKilcbmNsYXNzIHR5cGUgc2VsZWN0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFuY2hvck5vZGUgOiBEb20ubm9kZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbmNob3JPZmZzZXQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZvY3VzTm9kZSA6IERvbS5ub2RlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZvY3VzT2Zmc2V0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpc0NvbGxhcHNlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmFuZ2VDb3VudCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0UmFuZ2VBdCA6IGludCAtPiByYW5nZSB0IG1ldGhcblxuICAgIG1ldGhvZCBjb2xsYXBzZSA6IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBleHRlbmQgOiBEb20ubm9kZSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBtb2RpZnkgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb2xsYXBzZVRvU3RhcnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb2xsYXBzZVRvRW5kIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VsZWN0QWxsQ2hpbGRyZW4gOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFkZFJhbmdlIDogcmFuZ2UgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVSYW5nZSA6IHJhbmdlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlQWxsUmFuZ2VzIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlRnJvbURvY3VtZW50IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29udGFpbnNOb2RlIDogRG9tLm5vZGUgdCAtPiBib29sIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZG9jdW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtlbGVtZW50XSBEb20uZG9jdW1lbnRcblxuICAgIGluaGVyaXQgbm9kZVNlbGVjdG9yXG5cbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgdGl0bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVmZXJyZXIgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZG9tYWluIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF9VUkwgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVhZCA6IGhlYWRFbGVtZW50IHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvZHkgOiBib2R5RWxlbWVudCB0IHByb3BcblxuICAgIG1ldGhvZCBkb2N1bWVudEVsZW1lbnQgOiBodG1sRWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbWFnZXMgOiBpbWFnZUVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhcHBsZXRzIDogZWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxpbmtzIDogZWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZvcm1zIDogZm9ybUVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbmNob3JzIDogZWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvb2tpZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkZXNpZ25Nb2RlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG9wZW5fIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvc2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3cml0ZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGV4ZWNDb21tYW5kIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IC0+IGpzX3N0cmluZyB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVSYW5nZSA6IHJhbmdlIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgRG9tLm5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRzQnlOYW1lIDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCBEb20ubm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgYWN0aXZlRWxlbWVudCA6IGVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhpZGRlbiA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25mdWxsc2NyZWVuY2hhbmdlIDogKGRvY3VtZW50IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb253ZWJraXRmdWxsc2NyZWVuY2hhbmdlIDogKGRvY3VtZW50IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG4gIGVuZFxuXG50eXBlIGludGVydmFsX2lkXG5cbnR5cGUgdGltZW91dF9pZFxuXG50eXBlIGFuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2lkXG5cbmNsYXNzIHR5cGUgbG9jYXRpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgaHJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwcm90b2NvbCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBob3N0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhvc3RuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG9yaWdpbiA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcG9ydCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYXRobmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzZWFyY2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaGFzaCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhc3NpZ24gOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVsb2FkIDogdW5pdCBtZXRoXG4gIGVuZFxuXG5sZXQgbG9jYXRpb25fb3JpZ2luIChsb2MgOiBsb2NhdGlvbiB0KSA9XG4gIE9wdGRlZi5jYXNlXG4gICAgbG9jIyMub3JpZ2luXG4gICAgKGZ1biAoKSAtPlxuICAgICAgbGV0IHByb3RvY29sID0gbG9jIyMucHJvdG9jb2wgaW5cbiAgICAgIGxldCBob3N0bmFtZSA9IGxvYyMjLmhvc3RuYW1lIGluXG4gICAgICBsZXQgcG9ydCA9IGxvYyMjLnBvcnQgaW5cbiAgICAgIGlmIHByb3RvY29sIyMubGVuZ3RoID0gMCAmJiBob3N0bmFtZSMjLmxlbmd0aCA9IDBcbiAgICAgIHRoZW4gSnMuc3RyaW5nIFwiXCJcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IG9yaWdpbiA9IHByb3RvY29sIyNjb25jYXRfMiAoSnMuc3RyaW5nIFwiLy9cIikgaG9zdG5hbWUgaW5cbiAgICAgICAgaWYgcG9ydCMjLmxlbmd0aCA+IDAgdGhlbiBvcmlnaW4jI2NvbmNhdF8yIChKcy5zdHJpbmcgXCI6XCIpIGxvYyMjLnBvcnQgZWxzZSBvcmlnaW4pXG4gICAgKGZ1biBvIC0+IG8pXG5cbmNsYXNzIHR5cGUgaGlzdG9yeSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXRlIDogSnMuVW5zYWZlLmFueSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ28gOiBpbnQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJhY2sgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmb3J3YXJkIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcHVzaFN0YXRlIDogJ2EuICdhIC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlU3RhdGUgOiAnYS4gJ2EgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuY2xhc3MgdHlwZSB1bmRvTWFuYWdlciA9IG9iamVjdCBlbmRcblxuY2xhc3MgdHlwZSBuYXZpZ2F0b3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYXBwQ29kZU5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXBwTmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhcHBWZXJzaW9uIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvb2tpZUVuYWJsZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uTGluZSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGxhdGZvcm0gOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmVuZG9yIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVzZXJBZ2VudCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsYW5ndWFnZSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXNlckxhbmd1YWdlIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtYXhUb3VjaFBvaW50cyA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHNjcmVlbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB3aWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdmFpbFdpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdmFpbEhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGFwcGxpY2F0aW9uQ2FjaGUgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgc3RhdHVzIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1cGRhdGUgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhYm9ydCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN3YXBDYWNoZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG9uY2hlY2tpbmcgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25lcnJvciA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbm5vdXBkYXRlIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZG93bmxvYWRpbmcgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25wcm9ncmVzcyA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbnVwZGF0ZXJlYWR5IDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uY2FjaGVkIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ub2Jzb2xldGUgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBpbmhlcml0IGV2ZW50VGFyZ2V0XG4gIGVuZFxuXG5jbGFzcyB0eXBlIF9VUkwgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY3JlYXRlT2JqZWN0VVJMIDogI0ZpbGUuYmxvYiB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCByZXZva2VPYmplY3RVUkwgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgd2luZG93ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIGRvY3VtZW50IDogZG9jdW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXBwbGljYXRpb25DYWNoZSA6IGFwcGxpY2F0aW9uQ2FjaGUgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsb2NhdGlvbiA6IGxvY2F0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhpc3RvcnkgOiBoaXN0b3J5IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVuZG9NYW5hZ2VyIDogdW5kb01hbmFnZXIgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmF2aWdhdG9yIDogbmF2aWdhdG9yIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldFNlbGVjdGlvbiA6IHNlbGVjdGlvbiB0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9zZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RvcCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZvY3VzIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmx1ciA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNjcm9sbCA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2Nyb2xsQnkgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlc3Npb25TdG9yYWdlIDogc3RvcmFnZSB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbG9jYWxTdG9yYWdlIDogc3RvcmFnZSB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdG9wIDogd2luZG93IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhcmVudCA6IHdpbmRvdyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmcmFtZUVsZW1lbnQgOiBlbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvcGVuXyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCAtPiB3aW5kb3cgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGFsZXJ0IDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29uZmlybSA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgcHJvbXB0IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBwcmludCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludGVydmFsIDogKHVuaXQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgLT4gZmxvYXQgLT4gaW50ZXJ2YWxfaWQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFySW50ZXJ2YWwgOiBpbnRlcnZhbF9pZCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRUaW1lb3V0IDogKHVuaXQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgLT4gZmxvYXQgLT4gdGltZW91dF9pZCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJUaW1lb3V0IDogdGltZW91dF9pZCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOlxuICAgICAgKGZsb2F0IC0+IHVuaXQpIEpzLmNhbGxiYWNrIC0+IGFuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2lkIG1ldGhcblxuICAgIG1ldGhvZCBjYW5jZWxBbmltYXRpb25GcmFtZSA6IGFuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2lkIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNjcmVlbiA6IHNjcmVlbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbm5lcldpZHRoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbm5lckhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb3V0ZXJXaWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb3V0ZXJIZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldENvbXB1dGVkU3R5bGUgOiAjZWxlbWVudCB0IC0+IGNzc1N0eWxlRGVjbGFyYXRpb24gdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q29tcHV0ZWRTdHlsZV9wc2V1ZG9FbHQgOlxuICAgICAgI2VsZW1lbnQgdCAtPiBqc19zdHJpbmcgdCAtPiBjc3NTdHlsZURlY2xhcmF0aW9uIHQgbWV0aFxuXG4gICAgbWV0aG9kIGF0b2IgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgYnRvYSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBvbmxvYWQgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbnVubG9hZCA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uYmVmb3JldW5sb2FkIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25ibHVyIDogKHdpbmRvdyB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmZvY3VzIDogKHdpbmRvdyB0LCBmb2N1c0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbnJlc2l6ZSA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ub3JpZW50YXRpb25jaGFuZ2UgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbnBvcHN0YXRlIDogKHdpbmRvdyB0LCBwb3BTdGF0ZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmhhc2hjaGFuZ2UgOiAod2luZG93IHQsIGhhc2hDaGFuZ2VFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25vbmxpbmUgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25vZmZsaW5lIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VUkwgOiBfVVJMIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRldmljZVBpeGVsUmF0aW8gOiBmbG9hdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgd2luZG93IDogd2luZG93IHQgPSBKcy5VbnNhZmUuZ2xvYmFsXG5cbigqIFRoZSB0b3BsZXZlbCBvYmplY3QgKilcblxubGV0IGRvY3VtZW50ID0gd2luZG93IyMuZG9jdW1lbnRcblxubGV0IGdldEVsZW1lbnRCeUlkIGlkID1cbiAgSnMuT3B0LmNhc2VcbiAgICAoZG9jdW1lbnQjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgaWQpKVxuICAgIChmdW4gKCkgLT4gcmFpc2UgTm90X2ZvdW5kKVxuICAgIChmdW4gcG5vZGUgLT4gcG5vZGUpXG5cbmxldCBnZXRFbGVtZW50QnlJZF9leG4gaWQgPVxuICBKcy5PcHQuY2FzZVxuICAgIChkb2N1bWVudCMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBpZCkpXG4gICAgKGZ1biAoKSAtPiBmYWlsd2l0aCAoUHJpbnRmLnNwcmludGYgXCJnZXRFbGVtZW50QnlJZF9leG46ICVTIG5vdCBmb3VuZFwiIGlkKSlcbiAgICAoZnVuIHBub2RlIC0+IHBub2RlKVxuXG5sZXQgZ2V0RWxlbWVudEJ5SWRfb3B0IGlkID0gSnMuT3B0LnRvX29wdGlvbiAoZG9jdW1lbnQjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgaWQpKVxuXG5sZXQgZ2V0RWxlbWVudEJ5SWRfY29lcmNlIGlkIGNvZXJjZSA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKGRvY3VtZW50IyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIGlkKSlcbiAgICAoZnVuICgpIC0+IE5vbmUpXG4gICAgKGZ1biBlIC0+IEpzLk9wdC50b19vcHRpb24gKGNvZXJjZSBlKSlcblxuKCoqKiopXG5cbmNsYXNzIHR5cGUgZnJhbWVTZXRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY29scyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByb3dzIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBmcmFtZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmcmFtZUJvcmRlciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsb25nRGVzYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5IZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBub1Jlc2l6ZSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb250ZW50RG9jdW1lbnQgOiBkb2N1bWVudCB0IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGlGcmFtZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmcmFtZUJvcmRlciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbG9uZ0Rlc2MgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luSGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbldpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2Nyb2xsaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNyYyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb250ZW50RG9jdW1lbnQgOiBkb2N1bWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udGVudFdpbmRvdyA6IHdpbmRvdyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqKioqKVxuXG4oKlhYWCBTaG91bGQgcHJvdmlkZSBjcmVhdGlvbiBmdW5jdGlvbnMgYSBsYSBsYWJsZ3RrLi4uICopXG5cbmxldCBvcHRfaXRlciB4IGYgPVxuICBtYXRjaCB4IHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSB2IC0+IGYgdlxuXG5sZXQgY3JlYXRlRWxlbWVudCAoZG9jIDogZG9jdW1lbnQgdCkgbmFtZSA9IGRvYyMjY3JlYXRlRWxlbWVudCAoSnMuc3RyaW5nIG5hbWUpXG5cbmxldCB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBuYW1lID0gSnMuVW5zYWZlLmNvZXJjZSAoY3JlYXRlRWxlbWVudCBkb2MgbmFtZSlcblxubGV0IGNyZWF0ZUVsZW1lbnRTeW50YXggPSByZWYgYFVua25vd25cblxubGV0IHJlYyB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBlbHQgPVxuICBpZiBQb2x5LihfdHlwZSA9IE5vbmUpICYmIFBvbHkuKG5hbWUgPSBOb25lKVxuICB0aGVuIEpzLlVuc2FmZS5jb2VyY2UgKGNyZWF0ZUVsZW1lbnQgZG9jIGVsdClcbiAgZWxzZVxuICAgIG1hdGNoICFjcmVhdGVFbGVtZW50U3ludGF4IHdpdGhcbiAgICB8IGBTdGFuZGFyZCAtPlxuICAgICAgICBsZXQgcmVzID0gSnMuVW5zYWZlLmNvZXJjZSAoY3JlYXRlRWxlbWVudCBkb2MgZWx0KSBpblxuICAgICAgICBvcHRfaXRlciBfdHlwZSAoZnVuIHQgLT4gcmVzIyMuX3R5cGUgOj0gdCk7XG4gICAgICAgIG9wdF9pdGVyIG5hbWUgKGZ1biBuIC0+IHJlcyMjLm5hbWUgOj0gbik7XG4gICAgICAgIHJlc1xuICAgIHwgYEV4dGVuZGVkIC0+XG4gICAgICAgIGxldCBhID0gbmV3JWpzIEpzLmFycmF5X2VtcHR5IGluXG4gICAgICAgIGlnbm9yZSAoYSMjcHVzaF8yIChKcy5zdHJpbmcgXCI8XCIpIChKcy5zdHJpbmcgZWx0KSk7XG4gICAgICAgIG9wdF9pdGVyIF90eXBlIChmdW4gdCAtPlxuICAgICAgICAgICAgaWdub3JlIChhIyNwdXNoXzMgKEpzLnN0cmluZyBcIiB0eXBlPVxcXCJcIikgKGh0bWxfZXNjYXBlIHQpIChKcy5zdHJpbmcgXCJcXFwiXCIpKSk7XG4gICAgICAgIG9wdF9pdGVyIG5hbWUgKGZ1biBuIC0+XG4gICAgICAgICAgICBpZ25vcmUgKGEjI3B1c2hfMyAoSnMuc3RyaW5nIFwiIG5hbWU9XFxcIlwiKSAoaHRtbF9lc2NhcGUgbikgKEpzLnN0cmluZyBcIlxcXCJcIikpKTtcbiAgICAgICAgaWdub3JlIChhIyNwdXNoIChKcy5zdHJpbmcgXCI+XCIpKTtcbiAgICAgICAgSnMuVW5zYWZlLmNvZXJjZSAoZG9jIyNjcmVhdGVFbGVtZW50IChhIyNqb2luIChKcy5zdHJpbmcgXCJcIikpKVxuICAgIHwgYFVua25vd24gLT5cbiAgICAgICAgY3JlYXRlRWxlbWVudFN5bnRheCA6PVxuICAgICAgICAgIGlmIHRyeVxuICAgICAgICAgICAgICAgbGV0IGVsIDogaW5wdXRFbGVtZW50IEpzLnQgPVxuICAgICAgICAgICAgICAgICBKcy5VbnNhZmUuY29lcmNlXG4gICAgICAgICAgICAgICAgICAgKGRvY3VtZW50IyNjcmVhdGVFbGVtZW50IChKcy5zdHJpbmcgXCI8aW5wdXQgbmFtZT1cXFwieFxcXCI+XCIpKVxuICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgIGVsIyMudGFnTmFtZSMjdG9Mb3dlckNhc2UgPT0gSnMuc3RyaW5nIFwiaW5wdXRcIlxuICAgICAgICAgICAgICAgJiYgZWwjIy5uYW1lID09IEpzLnN0cmluZyBcInhcIlxuICAgICAgICAgICAgIHdpdGggXyAtPiBmYWxzZVxuICAgICAgICAgIHRoZW4gYEV4dGVuZGVkXG4gICAgICAgICAgZWxzZSBgU3RhbmRhcmQ7XG4gICAgICAgIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIGVsdFxuXG5sZXQgY3JlYXRlSHRtbCBkb2MgOiBodG1sRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJodG1sXCJcblxubGV0IGNyZWF0ZUhlYWQgZG9jIDogaGVhZEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaGVhZFwiXG5cbmxldCBjcmVhdGVMaW5rIGRvYyA6IGxpbmtFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxpbmtcIlxuXG5sZXQgY3JlYXRlVGl0bGUgZG9jIDogdGl0bGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRpdGxlXCJcblxubGV0IGNyZWF0ZU1ldGEgZG9jIDogbWV0YUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibWV0YVwiXG5cbmxldCBjcmVhdGVCYXNlIGRvYyA6IGJhc2VFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImJhc2VcIlxuXG5sZXQgY3JlYXRlU3R5bGUgZG9jIDogc3R5bGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN0eWxlXCJcblxubGV0IGNyZWF0ZUJvZHkgZG9jIDogYm9keUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYm9keVwiXG5cbmxldCBjcmVhdGVGb3JtIGRvYyA6IGZvcm1FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvcm1cIlxuXG5sZXQgY3JlYXRlT3B0Z3JvdXAgZG9jIDogb3B0R3JvdXBFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm9wdGdyb3VwXCJcblxubGV0IGNyZWF0ZU9wdGlvbiBkb2MgOiBvcHRpb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm9wdGlvblwiXG5cbmxldCBjcmVhdGVTZWxlY3QgP190eXBlID9uYW1lIGRvYyA6IHNlbGVjdEVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIFwic2VsZWN0XCJcblxubGV0IGNyZWF0ZUlucHV0ID9fdHlwZSA/bmFtZSBkb2MgOiBpbnB1dEVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIFwiaW5wdXRcIlxuXG5sZXQgY3JlYXRlVGV4dGFyZWEgP190eXBlID9uYW1lIGRvYyA6IHRleHRBcmVhRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgXCJ0ZXh0YXJlYVwiXG5cbmxldCBjcmVhdGVCdXR0b24gP190eXBlID9uYW1lIGRvYyA6IGJ1dHRvbkVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIFwiYnV0dG9uXCJcblxubGV0IGNyZWF0ZUxhYmVsIGRvYyA6IGxhYmVsRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsYWJlbFwiXG5cbmxldCBjcmVhdGVGaWVsZHNldCBkb2MgOiBmaWVsZFNldEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZmllbGRzZXRcIlxuXG5sZXQgY3JlYXRlTGVnZW5kIGRvYyA6IGxlZ2VuZEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGVnZW5kXCJcblxubGV0IGNyZWF0ZVVsIGRvYyA6IHVMaXN0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ1bFwiXG5cbmxldCBjcmVhdGVPbCBkb2MgOiBvTGlzdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwib2xcIlxuXG5sZXQgY3JlYXRlRGwgZG9jIDogZExpc3RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImRsXCJcblxubGV0IGNyZWF0ZUxpIGRvYyA6IGxpRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsaVwiXG5cbmxldCBjcmVhdGVEaXYgZG9jIDogZGl2RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJkaXZcIlxuXG5sZXQgY3JlYXRlRW1iZWQgZG9jIDogZW1iZWRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImVtYmVkXCJcblxubGV0IGNyZWF0ZVAgZG9jIDogcGFyYWdyYXBoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwXCJcblxubGV0IGNyZWF0ZUgxIGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImgxXCJcblxubGV0IGNyZWF0ZUgyIGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImgyXCJcblxubGV0IGNyZWF0ZUgzIGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImgzXCJcblxubGV0IGNyZWF0ZUg0IGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImg0XCJcblxubGV0IGNyZWF0ZUg1IGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImg1XCJcblxubGV0IGNyZWF0ZUg2IGRvYyA6IGhlYWRpbmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImg2XCJcblxubGV0IGNyZWF0ZVEgZG9jIDogcXVvdGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInFcIlxuXG5sZXQgY3JlYXRlQmxvY2txdW90ZSBkb2MgOiBxdW90ZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYmxvY2txdW90ZVwiXG5cbmxldCBjcmVhdGVQcmUgZG9jIDogcHJlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwcmVcIlxuXG5sZXQgY3JlYXRlQnIgZG9jIDogYnJFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImJyXCJcblxubGV0IGNyZWF0ZUhyIGRvYyA6IGhyRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoclwiXG5cbmxldCBjcmVhdGVJbnMgZG9jIDogbW9kRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJpbnNcIlxuXG5sZXQgY3JlYXRlRGVsIGRvYyA6IG1vZEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZGVsXCJcblxubGV0IGNyZWF0ZUEgZG9jIDogYW5jaG9yRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhXCJcblxubGV0IGNyZWF0ZUltZyBkb2MgOiBpbWFnZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaW1nXCJcblxubGV0IGNyZWF0ZU9iamVjdCBkb2MgOiBvYmplY3RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm9iamVjdFwiXG5cbmxldCBjcmVhdGVQYXJhbSBkb2MgOiBwYXJhbUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicGFyYW1cIlxuXG5sZXQgY3JlYXRlTWFwIGRvYyA6IG1hcEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibWFwXCJcblxubGV0IGNyZWF0ZUFyZWEgZG9jIDogYXJlYUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYXJlYVwiXG5cbmxldCBjcmVhdGVTY3JpcHQgZG9jIDogc2NyaXB0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzY3JpcHRcIlxuXG5sZXQgY3JlYXRlVGFibGUgZG9jIDogdGFibGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRhYmxlXCJcblxubGV0IGNyZWF0ZUNhcHRpb24gZG9jIDogdGFibGVDYXB0aW9uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjYXB0aW9uXCJcblxubGV0IGNyZWF0ZUNvbCBkb2MgOiB0YWJsZUNvbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY29sXCJcblxubGV0IGNyZWF0ZUNvbGdyb3VwIGRvYyA6IHRhYmxlQ29sRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjb2xncm91cFwiXG5cbmxldCBjcmVhdGVUaGVhZCBkb2MgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRoZWFkXCJcblxubGV0IGNyZWF0ZVRmb290IGRvYyA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGZvb3RcIlxuXG5sZXQgY3JlYXRlVGJvZHkgZG9jIDogdGFibGVTZWN0aW9uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0Ym9keVwiXG5cbmxldCBjcmVhdGVUciBkb2MgOiB0YWJsZVJvd0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidHJcIlxuXG5sZXQgY3JlYXRlVGggZG9jIDogdGFibGVDZWxsRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0aFwiXG5cbmxldCBjcmVhdGVUZCBkb2MgOiB0YWJsZUNlbGxFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRkXCJcblxubGV0IGNyZWF0ZVN1YiBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInN1YlwiXG5cbmxldCBjcmVhdGVTdXAgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzdXBcIlxuXG5sZXQgY3JlYXRlU3BhbiBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInNwYW5cIlxuXG5sZXQgY3JlYXRlVHQgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJ0dFwiXG5cbmxldCBjcmVhdGVJIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiaVwiXG5cbmxldCBjcmVhdGVCIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiYlwiXG5cbmxldCBjcmVhdGVCaWcgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJiaWdcIlxuXG5sZXQgY3JlYXRlU21hbGwgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzbWFsbFwiXG5cbmxldCBjcmVhdGVFbSBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImVtXCJcblxubGV0IGNyZWF0ZVN0cm9uZyBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInN0cm9uZ1wiXG5cbmxldCBjcmVhdGVDaXRlIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiY2l0ZVwiXG5cbmxldCBjcmVhdGVEZm4gZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJkZm5cIlxuXG5sZXQgY3JlYXRlQ29kZSBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImNvZGVcIlxuXG5sZXQgY3JlYXRlU2FtcCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInNhbXBcIlxuXG5sZXQgY3JlYXRlS2JkIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwia2JkXCJcblxubGV0IGNyZWF0ZVZhciBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcInZhclwiXG5cbmxldCBjcmVhdGVBYmJyIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiYWJiclwiXG5cbmxldCBjcmVhdGVEZCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImRkXCJcblxubGV0IGNyZWF0ZUR0IGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiZHRcIlxuXG5sZXQgY3JlYXRlTm9zY3JpcHQgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJub3NjcmlwdFwiXG5cbmxldCBjcmVhdGVBZGRyZXNzIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiYWRkcmVzc1wiXG5cbmxldCBjcmVhdGVGcmFtZXNldCBkb2MgOiBmcmFtZVNldEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZnJhbWVzZXRcIlxuXG5sZXQgY3JlYXRlRnJhbWUgZG9jIDogZnJhbWVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZyYW1lXCJcblxubGV0IGNyZWF0ZUlmcmFtZSBkb2MgOiBpRnJhbWVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImlmcmFtZVwiXG5cbmxldCBjcmVhdGVBdWRpbyBkb2MgOiBhdWRpb0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYXVkaW9cIlxuXG5sZXQgY3JlYXRlVmlkZW8gZG9jIDogYXVkaW9FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInZpZGVvXCJcblxuZXhjZXB0aW9uIENhbnZhc19ub3RfYXZhaWxhYmxlXG5cbmxldCBjcmVhdGVDYW52YXMgZG9jIDogY2FudmFzRWxlbWVudCB0ID1cbiAgbGV0IGMgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNhbnZhc1wiIGluXG4gIGlmIG5vdCAoT3B0LnRlc3QgYyMjLmdldENvbnRleHQpIHRoZW4gcmFpc2UgQ2FudmFzX25vdF9hdmFpbGFibGU7XG4gIGNcblxubGV0IGh0bWxfZWxlbWVudCA6IGh0bWxFbGVtZW50IHQgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9IVE1MRWxlbWVudFxuXG5tb2R1bGUgQ29lcmNlVG8gPSBzdHJ1Y3RcbiAgbGV0IGVsZW1lbnQgOiAjRG9tLm5vZGUgSnMudCAtPiBlbGVtZW50IEpzLnQgSnMub3B0ID1cbiAgICBpZiBkZWYgaHRtbF9lbGVtZW50ID09IHVuZGVmaW5lZFxuICAgIHRoZW5cbiAgICAgICgqIGllIDwgOSBkb2VzIG5vdCBoYXZlIEhUTUxFbGVtZW50OiB3ZSBoYXZlIHRvIGNoZWF0IHRvIGNoZWNrXG4gICAgICAgICB0aGF0IHNvbWV0aGluZyBpcyBhbiBodG1sIGVsZW1lbnQgKilcbiAgICAgIGZ1biBlIC0+XG4gICAgICBpZiBkZWYgKEpzLlVuc2FmZS5jb2VyY2UgZSkjIy5pbm5lckhUTUwgPT0gdW5kZWZpbmVkXG4gICAgICB0aGVuIEpzLm51bGxcbiAgICAgIGVsc2UgSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgIGVsc2VcbiAgICAgIGZ1biBlIC0+XG4gICAgICBpZiBKcy5pbnN0YW5jZW9mIGUgaHRtbF9lbGVtZW50IHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKSBlbHNlIEpzLm51bGxcblxuICBsZXQgdW5zYWZlQ29lcmNlIHRhZyAoZSA6ICNlbGVtZW50IHQpID1cbiAgICBpZiBlIyMudGFnTmFtZSMjdG9Mb3dlckNhc2UgPT0gSnMuc3RyaW5nIHRhZ1xuICAgIHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBhIGUgPSB1bnNhZmVDb2VyY2UgXCJhXCIgZVxuXG4gIGxldCBhcmVhIGUgPSB1bnNhZmVDb2VyY2UgXCJhcmVhXCIgZVxuXG4gIGxldCBiYXNlIGUgPSB1bnNhZmVDb2VyY2UgXCJiYXNlXCIgZVxuXG4gIGxldCBibG9ja3F1b3RlIGUgPSB1bnNhZmVDb2VyY2UgXCJibG9ja3F1b3RlXCIgZVxuXG4gIGxldCBib2R5IGUgPSB1bnNhZmVDb2VyY2UgXCJib2R5XCIgZVxuXG4gIGxldCBiciBlID0gdW5zYWZlQ29lcmNlIFwiYnJcIiBlXG5cbiAgbGV0IGJ1dHRvbiBlID0gdW5zYWZlQ29lcmNlIFwiYnV0dG9uXCIgZVxuXG4gIGxldCBjYW52YXMgZSA9IHVuc2FmZUNvZXJjZSBcImNhbnZhc1wiIGVcblxuICBsZXQgY2FwdGlvbiBlID0gdW5zYWZlQ29lcmNlIFwiY2FwdGlvblwiIGVcblxuICBsZXQgY29sIGUgPSB1bnNhZmVDb2VyY2UgXCJjb2xcIiBlXG5cbiAgbGV0IGNvbGdyb3VwIGUgPSB1bnNhZmVDb2VyY2UgXCJjb2xncm91cFwiIGVcblxuICBsZXQgZGVsIGUgPSB1bnNhZmVDb2VyY2UgXCJkZWxcIiBlXG5cbiAgbGV0IGRpdiBlID0gdW5zYWZlQ29lcmNlIFwiZGl2XCIgZVxuXG4gIGxldCBkbCBlID0gdW5zYWZlQ29lcmNlIFwiZGxcIiBlXG5cbiAgbGV0IGZpZWxkc2V0IGUgPSB1bnNhZmVDb2VyY2UgXCJmaWVsZHNldFwiIGVcblxuICBsZXQgZW1iZWQgZSA9IHVuc2FmZUNvZXJjZSBcImVtYmVkXCIgZVxuXG4gIGxldCBmb3JtIGUgPSB1bnNhZmVDb2VyY2UgXCJmb3JtXCIgZVxuXG4gIGxldCBmcmFtZXNldCBlID0gdW5zYWZlQ29lcmNlIFwiZnJhbWVzZXRcIiBlXG5cbiAgbGV0IGZyYW1lIGUgPSB1bnNhZmVDb2VyY2UgXCJmcmFtZVwiIGVcblxuICBsZXQgaDEgZSA9IHVuc2FmZUNvZXJjZSBcImgxXCIgZVxuXG4gIGxldCBoMiBlID0gdW5zYWZlQ29lcmNlIFwiaDJcIiBlXG5cbiAgbGV0IGgzIGUgPSB1bnNhZmVDb2VyY2UgXCJoM1wiIGVcblxuICBsZXQgaDQgZSA9IHVuc2FmZUNvZXJjZSBcImg0XCIgZVxuXG4gIGxldCBoNSBlID0gdW5zYWZlQ29lcmNlIFwiaDVcIiBlXG5cbiAgbGV0IGg2IGUgPSB1bnNhZmVDb2VyY2UgXCJoNlwiIGVcblxuICBsZXQgaGVhZCBlID0gdW5zYWZlQ29lcmNlIFwiaGVhZFwiIGVcblxuICBsZXQgaHIgZSA9IHVuc2FmZUNvZXJjZSBcImhyXCIgZVxuXG4gIGxldCBodG1sIGUgPSB1bnNhZmVDb2VyY2UgXCJodG1sXCIgZVxuXG4gIGxldCBpZnJhbWUgZSA9IHVuc2FmZUNvZXJjZSBcImlmcmFtZVwiIGVcblxuICBsZXQgaW1nIGUgPSB1bnNhZmVDb2VyY2UgXCJpbWdcIiBlXG5cbiAgbGV0IGlucHV0IGUgPSB1bnNhZmVDb2VyY2UgXCJpbnB1dFwiIGVcblxuICBsZXQgaW5zIGUgPSB1bnNhZmVDb2VyY2UgXCJpbnNcIiBlXG5cbiAgbGV0IGxhYmVsIGUgPSB1bnNhZmVDb2VyY2UgXCJsYWJlbFwiIGVcblxuICBsZXQgbGVnZW5kIGUgPSB1bnNhZmVDb2VyY2UgXCJsZWdlbmRcIiBlXG5cbiAgbGV0IGxpIGUgPSB1bnNhZmVDb2VyY2UgXCJsaVwiIGVcblxuICBsZXQgbGluayBlID0gdW5zYWZlQ29lcmNlIFwibGlua1wiIGVcblxuICBsZXQgbWFwIGUgPSB1bnNhZmVDb2VyY2UgXCJtYXBcIiBlXG5cbiAgbGV0IG1ldGEgZSA9IHVuc2FmZUNvZXJjZSBcIm1ldGFcIiBlXG5cbiAgbGV0IF9vYmplY3QgZSA9IHVuc2FmZUNvZXJjZSBcIm9iamVjdFwiIGVcblxuICBsZXQgb2wgZSA9IHVuc2FmZUNvZXJjZSBcIm9sXCIgZVxuXG4gIGxldCBvcHRncm91cCBlID0gdW5zYWZlQ29lcmNlIFwib3B0Z3JvdXBcIiBlXG5cbiAgbGV0IG9wdGlvbiBlID0gdW5zYWZlQ29lcmNlIFwib3B0aW9uXCIgZVxuXG4gIGxldCBwIGUgPSB1bnNhZmVDb2VyY2UgXCJwXCIgZVxuXG4gIGxldCBwYXJhbSBlID0gdW5zYWZlQ29lcmNlIFwicGFyYW1cIiBlXG5cbiAgbGV0IHByZSBlID0gdW5zYWZlQ29lcmNlIFwicHJlXCIgZVxuXG4gIGxldCBxIGUgPSB1bnNhZmVDb2VyY2UgXCJxXCIgZVxuXG4gIGxldCBzY3JpcHQgZSA9IHVuc2FmZUNvZXJjZSBcInNjcmlwdFwiIGVcblxuICBsZXQgc2VsZWN0IGUgPSB1bnNhZmVDb2VyY2UgXCJzZWxlY3RcIiBlXG5cbiAgbGV0IHN0eWxlIGUgPSB1bnNhZmVDb2VyY2UgXCJzdHlsZVwiIGVcblxuICBsZXQgdGFibGUgZSA9IHVuc2FmZUNvZXJjZSBcInRhYmxlXCIgZVxuXG4gIGxldCB0Ym9keSBlID0gdW5zYWZlQ29lcmNlIFwidGJvZHlcIiBlXG5cbiAgbGV0IHRkIGUgPSB1bnNhZmVDb2VyY2UgXCJ0ZFwiIGVcblxuICBsZXQgdGV4dGFyZWEgZSA9IHVuc2FmZUNvZXJjZSBcInRleHRhcmVhXCIgZVxuXG4gIGxldCB0Zm9vdCBlID0gdW5zYWZlQ29lcmNlIFwidGZvb3RcIiBlXG5cbiAgbGV0IHRoIGUgPSB1bnNhZmVDb2VyY2UgXCJ0aFwiIGVcblxuICBsZXQgdGhlYWQgZSA9IHVuc2FmZUNvZXJjZSBcInRoZWFkXCIgZVxuXG4gIGxldCB0aXRsZSBlID0gdW5zYWZlQ29lcmNlIFwidGl0bGVcIiBlXG5cbiAgbGV0IHRyIGUgPSB1bnNhZmVDb2VyY2UgXCJ0clwiIGVcblxuICBsZXQgdWwgZSA9IHVuc2FmZUNvZXJjZSBcInVsXCIgZVxuXG4gIGxldCBhdWRpbyBlID0gdW5zYWZlQ29lcmNlIFwiYXVkaW9cIiBlXG5cbiAgbGV0IHZpZGVvIGUgPSB1bnNhZmVDb2VyY2UgXCJ2aWRlb1wiIGVcblxuICBsZXQgdW5zYWZlQ29lcmNlRXZlbnQgY29uc3RyIChldiA6ICNldmVudCB0KSA9XG4gICAgaWYgZGVmIGNvbnN0ciAhPSB1bmRlZmluZWQgJiYgSnMuaW5zdGFuY2VvZiBldiBjb25zdHJcbiAgICB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZXYpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IG1vdXNlRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX01vdXNlRXZlbnQgZXZcblxuICBsZXQga2V5Ym9hcmRFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fS2V5Ym9hcmRFdmVudCBldlxuXG4gIGxldCB3aGVlbEV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9XaGVlbEV2ZW50IGV2XG5cbiAgbGV0IG1vdXNlU2Nyb2xsRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX01vdXNlU2Nyb2xsRXZlbnQgZXZcblxuICBsZXQgcG9wU3RhdGVFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fUG9wU3RhdGVFdmVudCBldlxuXG4gIGxldCBtZXNzYWdlRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX01lc3NhZ2VFdmVudCBldlxuZW5kXG5cbigqKioqKVxuXG5sZXQgZXZlbnRUYXJnZXQgPSBEb20uZXZlbnRUYXJnZXRcblxubGV0IGV2ZW50UmVsYXRlZFRhcmdldCAoZSA6ICNtb3VzZUV2ZW50IHQpID1cbiAgT3B0ZGVmLmdldCBlIyMucmVsYXRlZFRhcmdldCAoZnVuICgpIC0+XG4gICAgICBtYXRjaCBKcy50b19zdHJpbmcgZSMjLl90eXBlIHdpdGhcbiAgICAgIHwgXCJtb3VzZW92ZXJcIiAtPiBPcHRkZWYuZ2V0IGUjIy5mcm9tRWxlbWVudCAoZnVuICgpIC0+IGFzc2VydCBmYWxzZSlcbiAgICAgIHwgXCJtb3VzZW91dFwiIC0+IE9wdGRlZi5nZXQgZSMjLnRvRWxlbWVudCAoZnVuICgpIC0+IGFzc2VydCBmYWxzZSlcbiAgICAgIHwgXyAtPiBKcy5udWxsKVxuXG5sZXQgZXZlbnRBYnNvbHV0ZVBvc2l0aW9uJyAoZSA6ICNtb3VzZUV2ZW50IHQpID1cbiAgbGV0IGJvZHkgPSBkb2N1bWVudCMjLmJvZHkgaW5cbiAgbGV0IGh0bWwgPSBkb2N1bWVudCMjLmRvY3VtZW50RWxlbWVudCBpblxuICAoIGUjIy5jbGllbnRYICsgYm9keSMjLnNjcm9sbExlZnQgKyBodG1sIyMuc2Nyb2xsTGVmdFxuICAsIGUjIy5jbGllbnRZICsgYm9keSMjLnNjcm9sbFRvcCArIGh0bWwjIy5zY3JvbGxUb3AgKVxuXG5sZXQgZXZlbnRBYnNvbHV0ZVBvc2l0aW9uIChlIDogI21vdXNlRXZlbnQgdCkgPVxuICBPcHRkZWYuY2FzZVxuICAgIGUjIy5wYWdlWFxuICAgIChmdW4gKCkgLT4gZXZlbnRBYnNvbHV0ZVBvc2l0aW9uJyBlKVxuICAgIChmdW4geCAtPiBPcHRkZWYuY2FzZSBlIyMucGFnZVkgKGZ1biAoKSAtPiBldmVudEFic29sdXRlUG9zaXRpb24nIGUpIChmdW4geSAtPiB4LCB5KSlcblxubGV0IGVsZW1lbnRDbGllbnRQb3NpdGlvbiAoZSA6ICNlbGVtZW50IHQpID1cbiAgbGV0IHIgPSBlIyNnZXRCb3VuZGluZ0NsaWVudFJlY3QgaW5cbiAgbGV0IGJvZHkgPSBkb2N1bWVudCMjLmJvZHkgaW5cbiAgbGV0IGh0bWwgPSBkb2N1bWVudCMjLmRvY3VtZW50RWxlbWVudCBpblxuICAoIHRydW5jYXRlIHIjIy5sZWZ0IC0gYm9keSMjLmNsaWVudExlZnQgLSBodG1sIyMuY2xpZW50TGVmdFxuICAsIHRydW5jYXRlIHIjIy50b3AgLSBib2R5IyMuY2xpZW50VG9wIC0gaHRtbCMjLmNsaWVudFRvcCApXG5cbmxldCBnZXREb2N1bWVudFNjcm9sbCAoKSA9XG4gIGxldCBib2R5ID0gZG9jdW1lbnQjIy5ib2R5IGluXG4gIGxldCBodG1sID0gZG9jdW1lbnQjIy5kb2N1bWVudEVsZW1lbnQgaW5cbiAgYm9keSMjLnNjcm9sbExlZnQgKyBodG1sIyMuc2Nyb2xsTGVmdCwgYm9keSMjLnNjcm9sbFRvcCArIGh0bWwjIy5zY3JvbGxUb3BcblxubGV0IGJ1dHRvblByZXNzZWQgKGV2IDogI21vdXNlRXZlbnQgSnMudCkgPVxuICBKcy5PcHRkZWYuY2FzZVxuICAgIGV2IyMud2hpY2hcbiAgICAoZnVuICgpIC0+XG4gICAgICBtYXRjaCBldiMjLmJ1dHRvbiB3aXRoXG4gICAgICB8IDEgLT4gTGVmdF9idXR0b25cbiAgICAgIHwgMiAtPiBSaWdodF9idXR0b25cbiAgICAgIHwgNCAtPiBNaWRkbGVfYnV0dG9uXG4gICAgICB8IF8gLT4gTm9fYnV0dG9uKVxuICAgIChmdW4geCAtPiB4KVxuXG5sZXQgYWRkTW91c2V3aGVlbEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyBlID9jYXB0dXJlID9vbmNlID9wYXNzaXZlIGggPVxuICBhZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnNcbiAgICA/Y2FwdHVyZVxuICAgID9vbmNlXG4gICAgP3Bhc3NpdmVcbiAgICBlXG4gICAgRXZlbnQud2hlZWxcbiAgICAoaGFuZGxlciAoZnVuIChlIDogbW91c2V3aGVlbEV2ZW50IHQpIC0+XG4gICAgICAgICBsZXQgZHggPSAtT3B0ZGVmLmdldCBlIyMud2hlZWxEZWx0YVggKGZ1biAoKSAtPiAwKSAvIDQwIGluXG4gICAgICAgICBsZXQgZHkgPSAtT3B0ZGVmLmdldCBlIyMud2hlZWxEZWx0YVkgKGZ1biAoKSAtPiBlIyMud2hlZWxEZWx0YSkgLyA0MCBpblxuICAgICAgICAgaCAoZSA6PiBtb3VzZUV2ZW50IHQpIH5keCB+ZHkpKVxuXG5sZXQgYWRkTW91c2V3aGVlbEV2ZW50TGlzdGVuZXIgZSBoIGNhcHQgPVxuICBhZGRNb3VzZXdoZWVsRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zIH5jYXB0dXJlOmNhcHQgZSBoXG5cbigqKioqKilcblxubW9kdWxlIEtleWJvYXJkX2NvZGUgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IFVuaWRlbnRpZmllZFxuICAgICgqIEFscGhhYmV0aWMgQ2hhcmFjdGVycyAqKVxuICAgIHwgS2V5QVxuICAgIHwgS2V5QlxuICAgIHwgS2V5Q1xuICAgIHwgS2V5RFxuICAgIHwgS2V5RVxuICAgIHwgS2V5RlxuICAgIHwgS2V5R1xuICAgIHwgS2V5SFxuICAgIHwgS2V5SVxuICAgIHwgS2V5SlxuICAgIHwgS2V5S1xuICAgIHwgS2V5TFxuICAgIHwgS2V5TVxuICAgIHwgS2V5TlxuICAgIHwgS2V5T1xuICAgIHwgS2V5UFxuICAgIHwgS2V5UVxuICAgIHwgS2V5UlxuICAgIHwgS2V5U1xuICAgIHwgS2V5VFxuICAgIHwgS2V5VVxuICAgIHwgS2V5VlxuICAgIHwgS2V5V1xuICAgIHwgS2V5WFxuICAgIHwgS2V5WVxuICAgIHwgS2V5WlxuICAgICgqIERpZ2l0cyAqKVxuICAgIHwgRGlnaXQwXG4gICAgfCBEaWdpdDFcbiAgICB8IERpZ2l0MlxuICAgIHwgRGlnaXQzXG4gICAgfCBEaWdpdDRcbiAgICB8IERpZ2l0NVxuICAgIHwgRGlnaXQ2XG4gICAgfCBEaWdpdDdcbiAgICB8IERpZ2l0OFxuICAgIHwgRGlnaXQ5XG4gICAgfCBNaW51c1xuICAgIHwgRXF1YWxcbiAgICAoKiBXaGl0ZXNwYWNlICopXG4gICAgfCBUYWJcbiAgICB8IEVudGVyXG4gICAgfCBTcGFjZVxuICAgICgqIEVkaXRpbmcgKilcbiAgICB8IEVzY2FwZVxuICAgIHwgQmFja3NwYWNlXG4gICAgfCBJbnNlcnRcbiAgICB8IERlbGV0ZVxuICAgIHwgQ2Fwc0xvY2tcbiAgICAoKiBNaXNjIFByaW50YWJsZSAqKVxuICAgIHwgQnJhY2tldExlZnRcbiAgICB8IEJyYWNrZXRSaWdodFxuICAgIHwgU2VtaWNvbG9uXG4gICAgfCBRdW90ZVxuICAgIHwgQmFja3F1b3RlXG4gICAgfCBCYWNrc2xhc2hcbiAgICB8IENvbW1hXG4gICAgfCBQZXJpb2RcbiAgICB8IFNsYXNoXG4gICAgKCogRnVuY3Rpb24ga2V5cyAqKVxuICAgIHwgRjFcbiAgICB8IEYyXG4gICAgfCBGM1xuICAgIHwgRjRcbiAgICB8IEY1XG4gICAgfCBGNlxuICAgIHwgRjdcbiAgICB8IEY4XG4gICAgfCBGOVxuICAgIHwgRjEwXG4gICAgfCBGMTFcbiAgICB8IEYxMlxuICAgICgqIE51bXBhZCBrZXlzICopXG4gICAgfCBOdW1wYWQwXG4gICAgfCBOdW1wYWQxXG4gICAgfCBOdW1wYWQyXG4gICAgfCBOdW1wYWQzXG4gICAgfCBOdW1wYWQ0XG4gICAgfCBOdW1wYWQ1XG4gICAgfCBOdW1wYWQ2XG4gICAgfCBOdW1wYWQ3XG4gICAgfCBOdW1wYWQ4XG4gICAgfCBOdW1wYWQ5XG4gICAgfCBOdW1wYWRNdWx0aXBseVxuICAgIHwgTnVtcGFkU3VidHJhY3RcbiAgICB8IE51bXBhZEFkZFxuICAgIHwgTnVtcGFkRGVjaW1hbFxuICAgIHwgTnVtcGFkRXF1YWxcbiAgICB8IE51bXBhZEVudGVyXG4gICAgfCBOdW1wYWREaXZpZGVcbiAgICB8IE51bUxvY2tcbiAgICAoKiBNb2RpZmllciBrZXlzICopXG4gICAgfCBDb250cm9sTGVmdFxuICAgIHwgQ29udHJvbFJpZ2h0XG4gICAgfCBNZXRhTGVmdFxuICAgIHwgTWV0YVJpZ2h0XG4gICAgfCBTaGlmdExlZnRcbiAgICB8IFNoaWZ0UmlnaHRcbiAgICB8IEFsdExlZnRcbiAgICB8IEFsdFJpZ2h0XG4gICAgKCogQXJyb3cga2V5cyAqKVxuICAgIHwgQXJyb3dMZWZ0XG4gICAgfCBBcnJvd1JpZ2h0XG4gICAgfCBBcnJvd1VwXG4gICAgfCBBcnJvd0Rvd25cbiAgICAoKiBOYXZpZ2F0aW9uICopXG4gICAgfCBQYWdlVXBcbiAgICB8IFBhZ2VEb3duXG4gICAgfCBIb21lXG4gICAgfCBFbmRcbiAgICAoKiBTb3VuZCAqKVxuICAgIHwgVm9sdW1lTXV0ZVxuICAgIHwgVm9sdW1lRG93blxuICAgIHwgVm9sdW1lVXBcbiAgICAoKiBNZWRpYSAqKVxuICAgIHwgTWVkaWFUcmFja1ByZXZpb3VzXG4gICAgfCBNZWRpYVRyYWNrTmV4dFxuICAgIHwgTWVkaWFQbGF5UGF1c2VcbiAgICB8IE1lZGlhU3RvcFxuICAgICgqIEJyb3dzZXIgc3BlY2lhbCAqKVxuICAgIHwgQ29udGV4dE1lbnVcbiAgICB8IEJyb3dzZXJTZWFyY2hcbiAgICB8IEJyb3dzZXJIb21lXG4gICAgfCBCcm93c2VyRmF2b3JpdGVzXG4gICAgfCBCcm93c2VyUmVmcmVzaFxuICAgIHwgQnJvd3NlclN0b3BcbiAgICB8IEJyb3dzZXJGb3J3YXJkXG4gICAgfCBCcm93c2VyQmFja1xuICAgICgqIE1pc2MgKilcbiAgICB8IE9TTGVmdFxuICAgIHwgT1NSaWdodFxuICAgIHwgU2Nyb2xsTG9ja1xuICAgIHwgUHJpbnRTY3JlZW5cbiAgICB8IEludGxCYWNrc2xhc2hcbiAgICB8IEludGxZZW5cbiAgICB8IFBhdXNlXG5cbiAgbGV0IHRyeV9jb2RlIHYgPVxuICAgIG1hdGNoIEpzLnRvX3N0cmluZyB2IHdpdGhcbiAgICAoKiBBbHBoYWJldGljIENoYXJhY3RlcnMgKilcbiAgICB8IFwiS2V5QVwiIC0+IEtleUFcbiAgICB8IFwiS2V5QlwiIC0+IEtleUJcbiAgICB8IFwiS2V5Q1wiIC0+IEtleUNcbiAgICB8IFwiS2V5RFwiIC0+IEtleURcbiAgICB8IFwiS2V5RVwiIC0+IEtleUVcbiAgICB8IFwiS2V5RlwiIC0+IEtleUZcbiAgICB8IFwiS2V5R1wiIC0+IEtleUdcbiAgICB8IFwiS2V5SFwiIC0+IEtleUhcbiAgICB8IFwiS2V5SVwiIC0+IEtleUlcbiAgICB8IFwiS2V5SlwiIC0+IEtleUpcbiAgICB8IFwiS2V5S1wiIC0+IEtleUtcbiAgICB8IFwiS2V5TFwiIC0+IEtleUxcbiAgICB8IFwiS2V5TVwiIC0+IEtleU1cbiAgICB8IFwiS2V5TlwiIC0+IEtleU5cbiAgICB8IFwiS2V5T1wiIC0+IEtleU9cbiAgICB8IFwiS2V5UFwiIC0+IEtleVBcbiAgICB8IFwiS2V5UVwiIC0+IEtleVFcbiAgICB8IFwiS2V5UlwiIC0+IEtleVJcbiAgICB8IFwiS2V5U1wiIC0+IEtleVNcbiAgICB8IFwiS2V5VFwiIC0+IEtleVRcbiAgICB8IFwiS2V5VVwiIC0+IEtleVVcbiAgICB8IFwiS2V5VlwiIC0+IEtleVZcbiAgICB8IFwiS2V5V1wiIC0+IEtleVdcbiAgICB8IFwiS2V5WFwiIC0+IEtleVhcbiAgICB8IFwiS2V5WVwiIC0+IEtleVlcbiAgICB8IFwiS2V5WlwiIC0+IEtleVpcbiAgICAoKiBEaWdpdHMgKilcbiAgICB8IFwiRGlnaXQwXCIgLT4gRGlnaXQwXG4gICAgfCBcIkRpZ2l0MVwiIC0+IERpZ2l0MVxuICAgIHwgXCJEaWdpdDJcIiAtPiBEaWdpdDJcbiAgICB8IFwiRGlnaXQzXCIgLT4gRGlnaXQzXG4gICAgfCBcIkRpZ2l0NFwiIC0+IERpZ2l0NFxuICAgIHwgXCJEaWdpdDVcIiAtPiBEaWdpdDVcbiAgICB8IFwiRGlnaXQ2XCIgLT4gRGlnaXQ2XG4gICAgfCBcIkRpZ2l0N1wiIC0+IERpZ2l0N1xuICAgIHwgXCJEaWdpdDhcIiAtPiBEaWdpdDhcbiAgICB8IFwiRGlnaXQ5XCIgLT4gRGlnaXQ5XG4gICAgfCBcIk1pbnVzXCIgLT4gTWludXNcbiAgICB8IFwiRXF1YWxcIiAtPiBFcXVhbFxuICAgICgqIFdoaXRlc3BhY2UgKilcbiAgICB8IFwiVGFiXCIgLT4gVGFiXG4gICAgfCBcIkVudGVyXCIgLT4gRW50ZXJcbiAgICB8IFwiU3BhY2VcIiAtPiBTcGFjZVxuICAgICgqIEVkaXRpbmcgKilcbiAgICB8IFwiRXNjYXBlXCIgLT4gRXNjYXBlXG4gICAgfCBcIkJhY2tzcGFjZVwiIC0+IEJhY2tzcGFjZVxuICAgIHwgXCJJbnNlcnRcIiAtPiBJbnNlcnRcbiAgICB8IFwiRGVsZXRlXCIgLT4gRGVsZXRlXG4gICAgfCBcIkNhcHNMb2NrXCIgLT4gQ2Fwc0xvY2tcbiAgICAoKiBNaXNjIFByaW50YWJsZSAqKVxuICAgIHwgXCJCcmFja2V0TGVmdFwiIC0+IEJyYWNrZXRMZWZ0XG4gICAgfCBcIkJyYWNrZXRSaWdodFwiIC0+IEJyYWNrZXRSaWdodFxuICAgIHwgXCJTZW1pY29sb25cIiAtPiBTZW1pY29sb25cbiAgICB8IFwiUXVvdGVcIiAtPiBRdW90ZVxuICAgIHwgXCJCYWNrcXVvdGVcIiAtPiBCYWNrcXVvdGVcbiAgICB8IFwiQmFja3NsYXNoXCIgLT4gQmFja3NsYXNoXG4gICAgfCBcIkNvbW1hXCIgLT4gQ29tbWFcbiAgICB8IFwiUGVyaW9kXCIgLT4gUGVyaW9kXG4gICAgfCBcIlNsYXNoXCIgLT4gU2xhc2hcbiAgICAoKiBGdW5jdGlvbiBrZXlzICopXG4gICAgfCBcIkYxXCIgLT4gRjFcbiAgICB8IFwiRjJcIiAtPiBGMlxuICAgIHwgXCJGM1wiIC0+IEYzXG4gICAgfCBcIkY0XCIgLT4gRjRcbiAgICB8IFwiRjVcIiAtPiBGNVxuICAgIHwgXCJGNlwiIC0+IEY2XG4gICAgfCBcIkY3XCIgLT4gRjdcbiAgICB8IFwiRjhcIiAtPiBGOFxuICAgIHwgXCJGOVwiIC0+IEY5XG4gICAgfCBcIkYxMFwiIC0+IEYxMFxuICAgIHwgXCJGMTFcIiAtPiBGMTFcbiAgICB8IFwiRjEyXCIgLT4gRjEyXG4gICAgKCogTnVtcGFkIGtleXMgKilcbiAgICB8IFwiTnVtcGFkMFwiIC0+IE51bXBhZDBcbiAgICB8IFwiTnVtcGFkMVwiIC0+IE51bXBhZDFcbiAgICB8IFwiTnVtcGFkMlwiIC0+IE51bXBhZDJcbiAgICB8IFwiTnVtcGFkM1wiIC0+IE51bXBhZDNcbiAgICB8IFwiTnVtcGFkNFwiIC0+IE51bXBhZDRcbiAgICB8IFwiTnVtcGFkNVwiIC0+IE51bXBhZDVcbiAgICB8IFwiTnVtcGFkNlwiIC0+IE51bXBhZDZcbiAgICB8IFwiTnVtcGFkN1wiIC0+IE51bXBhZDdcbiAgICB8IFwiTnVtcGFkOFwiIC0+IE51bXBhZDhcbiAgICB8IFwiTnVtcGFkOVwiIC0+IE51bXBhZDlcbiAgICB8IFwiTnVtcGFkTXVsdGlwbHlcIiAtPiBOdW1wYWRNdWx0aXBseVxuICAgIHwgXCJOdW1wYWRTdWJ0cmFjdFwiIC0+IE51bXBhZFN1YnRyYWN0XG4gICAgfCBcIk51bXBhZEFkZFwiIC0+IE51bXBhZEFkZFxuICAgIHwgXCJOdW1wYWREZWNpbWFsXCIgLT4gTnVtcGFkRGVjaW1hbFxuICAgIHwgXCJOdW1wYWRFcXVhbFwiIC0+IE51bXBhZEVxdWFsXG4gICAgfCBcIk51bXBhZEVudGVyXCIgLT4gTnVtcGFkRW50ZXJcbiAgICB8IFwiTnVtcGFkRGl2aWRlXCIgLT4gTnVtcGFkRGl2aWRlXG4gICAgfCBcIk51bUxvY2tcIiAtPiBOdW1Mb2NrXG4gICAgKCogTW9kaWZpZXIga2V5cyAqKVxuICAgIHwgXCJDb250cm9sTGVmdFwiIC0+IENvbnRyb2xMZWZ0XG4gICAgfCBcIkNvbnRyb2xSaWdodFwiIC0+IENvbnRyb2xSaWdodFxuICAgIHwgXCJNZXRhTGVmdFwiIC0+IE1ldGFMZWZ0XG4gICAgfCBcIk1ldGFSaWdodFwiIC0+IE1ldGFSaWdodFxuICAgIHwgXCJTaGlmdExlZnRcIiAtPiBTaGlmdExlZnRcbiAgICB8IFwiU2hpZnRSaWdodFwiIC0+IFNoaWZ0UmlnaHRcbiAgICB8IFwiQWx0TGVmdFwiIC0+IEFsdExlZnRcbiAgICB8IFwiQWx0UmlnaHRcIiAtPiBBbHRSaWdodFxuICAgICgqIEFycm93IGtleXMgKilcbiAgICB8IFwiQXJyb3dMZWZ0XCIgLT4gQXJyb3dMZWZ0XG4gICAgfCBcIkFycm93UmlnaHRcIiAtPiBBcnJvd1JpZ2h0XG4gICAgfCBcIkFycm93VXBcIiAtPiBBcnJvd1VwXG4gICAgfCBcIkFycm93RG93blwiIC0+IEFycm93RG93blxuICAgICgqIE5hdmlnYXRpb24gKilcbiAgICB8IFwiUGFnZVVwXCIgLT4gUGFnZVVwXG4gICAgfCBcIlBhZ2VEb3duXCIgLT4gUGFnZURvd25cbiAgICB8IFwiSG9tZVwiIC0+IEhvbWVcbiAgICB8IFwiRW5kXCIgLT4gRW5kXG4gICAgKCogU291bmQgKilcbiAgICB8IFwiVm9sdW1lTXV0ZVwiIC0+IFZvbHVtZU11dGVcbiAgICB8IFwiVm9sdW1lRG93blwiIC0+IFZvbHVtZURvd25cbiAgICB8IFwiVm9sdW1lVXBcIiAtPiBWb2x1bWVVcFxuICAgICgqIE1lZGlhICopXG4gICAgfCBcIk1lZGlhVHJhY2tQcmV2aW91c1wiIC0+IE1lZGlhVHJhY2tQcmV2aW91c1xuICAgIHwgXCJNZWRpYVRyYWNrTmV4dFwiIC0+IE1lZGlhVHJhY2tOZXh0XG4gICAgfCBcIk1lZGlhUGxheVBhdXNlXCIgLT4gTWVkaWFQbGF5UGF1c2VcbiAgICB8IFwiTWVkaWFTdG9wXCIgLT4gTWVkaWFTdG9wXG4gICAgKCogQnJvd3NlciBzcGVjaWFsICopXG4gICAgfCBcIkNvbnRleHRNZW51XCIgLT4gQ29udGV4dE1lbnVcbiAgICB8IFwiQnJvd3NlclNlYXJjaFwiIC0+IEJyb3dzZXJTZWFyY2hcbiAgICB8IFwiQnJvd3NlckhvbWVcIiAtPiBCcm93c2VySG9tZVxuICAgIHwgXCJCcm93c2VyRmF2b3JpdGVzXCIgLT4gQnJvd3NlckZhdm9yaXRlc1xuICAgIHwgXCJCcm93c2VyUmVmcmVzaFwiIC0+IEJyb3dzZXJSZWZyZXNoXG4gICAgfCBcIkJyb3dzZXJTdG9wXCIgLT4gQnJvd3NlclN0b3BcbiAgICB8IFwiQnJvd3NlckZvcndhcmRcIiAtPiBCcm93c2VyRm9yd2FyZFxuICAgIHwgXCJCcm93c2VyQmFja1wiIC0+IEJyb3dzZXJCYWNrXG4gICAgKCogTWlzYyAqKVxuICAgIHwgXCJPU0xlZnRcIiAtPiBPU0xlZnRcbiAgICB8IFwiT1NSaWdodFwiIC0+IE9TUmlnaHRcbiAgICB8IFwiU2Nyb2xsTG9ja1wiIC0+IFNjcm9sbExvY2tcbiAgICB8IFwiUHJpbnRTY3JlZW5cIiAtPiBQcmludFNjcmVlblxuICAgIHwgXCJJbnRsQmFja3NsYXNoXCIgLT4gSW50bEJhY2tzbGFzaFxuICAgIHwgXCJJbnRsWWVuXCIgLT4gSW50bFllblxuICAgIHwgXCJQYXVzZVwiIC0+IFBhdXNlXG4gICAgfCBfIC0+IFVuaWRlbnRpZmllZFxuXG4gIGxldCB0cnlfa2V5X2NvZGVfbGVmdCA9IGZ1bmN0aW9uXG4gICAgfCAxNiAtPiBTaGlmdExlZnRcbiAgICB8IDE3IC0+IENvbnRyb2xMZWZ0XG4gICAgfCAxOCAtPiBBbHRMZWZ0XG4gICAgfCA5MSAtPiBNZXRhTGVmdFxuICAgIHwgXyAtPiBVbmlkZW50aWZpZWRcblxuICBsZXQgdHJ5X2tleV9jb2RlX3JpZ2h0ID0gZnVuY3Rpb25cbiAgICB8IDE2IC0+IFNoaWZ0UmlnaHRcbiAgICB8IDE3IC0+IENvbnRyb2xSaWdodFxuICAgIHwgMTggLT4gQWx0UmlnaHRcbiAgICB8IDkxIC0+IE1ldGFSaWdodFxuICAgIHwgXyAtPiBVbmlkZW50aWZpZWRcblxuICBsZXQgdHJ5X2tleV9jb2RlX251bXBhZCA9IGZ1bmN0aW9uXG4gICAgfCA0NiAtPiBOdW1wYWREZWNpbWFsXG4gICAgfCA0NSAtPiBOdW1wYWQwXG4gICAgfCAzNSAtPiBOdW1wYWQxXG4gICAgfCA0MCAtPiBOdW1wYWQyXG4gICAgfCAzNCAtPiBOdW1wYWQzXG4gICAgfCAzNyAtPiBOdW1wYWQ0XG4gICAgfCAxMiAtPiBOdW1wYWQ1XG4gICAgfCAzOSAtPiBOdW1wYWQ2XG4gICAgfCAzNiAtPiBOdW1wYWQ3XG4gICAgfCAzOCAtPiBOdW1wYWQ4XG4gICAgfCAzMyAtPiBOdW1wYWQ5XG4gICAgfCAxMyAtPiBOdW1wYWRFbnRlclxuICAgIHwgMTExIC0+IE51bXBhZERpdmlkZVxuICAgIHwgMTA3IC0+IE51bXBhZEFkZFxuICAgIHwgMTA5IC0+IE51bXBhZFN1YnRyYWN0XG4gICAgfCAxMDYgLT4gTnVtcGFkTXVsdGlwbHlcbiAgICB8IDExMCAtPiBOdW1wYWREZWNpbWFsXG4gICAgfCA5NiAtPiBOdW1wYWQwXG4gICAgfCA5NyAtPiBOdW1wYWQxXG4gICAgfCA5OCAtPiBOdW1wYWQyXG4gICAgfCA5OSAtPiBOdW1wYWQzXG4gICAgfCAxMDAgLT4gTnVtcGFkNFxuICAgIHwgMTAxIC0+IE51bXBhZDVcbiAgICB8IDEwMiAtPiBOdW1wYWQ2XG4gICAgfCAxMDMgLT4gTnVtcGFkN1xuICAgIHwgMTA0IC0+IE51bXBhZDhcbiAgICB8IDEwNSAtPiBOdW1wYWQ5XG4gICAgfCBfIC0+IFVuaWRlbnRpZmllZFxuXG4gIGxldCB0cnlfa2V5X2NvZGVfbm9ybWFsID0gZnVuY3Rpb25cbiAgICB8IDI3IC0+IEVzY2FwZVxuICAgIHwgMTEyIC0+IEYxXG4gICAgfCAxMTMgLT4gRjJcbiAgICB8IDExNCAtPiBGM1xuICAgIHwgMTE1IC0+IEY0XG4gICAgfCAxMTYgLT4gRjVcbiAgICB8IDExNyAtPiBGNlxuICAgIHwgMTE4IC0+IEY3XG4gICAgfCAxMTkgLT4gRjhcbiAgICB8IDEyMCAtPiBGOVxuICAgIHwgMTIxIC0+IEYxMFxuICAgIHwgMTIyIC0+IEYxMVxuICAgIHwgMTIzIC0+IEYxMlxuICAgIHwgNDIgLT4gUHJpbnRTY3JlZW5cbiAgICB8IDE0NSAtPiBTY3JvbGxMb2NrXG4gICAgfCAxOSAtPiBQYXVzZVxuICAgIHwgMTkyIC0+IEJhY2txdW90ZVxuICAgIHwgNDkgLT4gRGlnaXQxXG4gICAgfCA1MCAtPiBEaWdpdDJcbiAgICB8IDUxIC0+IERpZ2l0M1xuICAgIHwgNTIgLT4gRGlnaXQ0XG4gICAgfCA1MyAtPiBEaWdpdDVcbiAgICB8IDU0IC0+IERpZ2l0NlxuICAgIHwgNTUgLT4gRGlnaXQ3XG4gICAgfCA1NiAtPiBEaWdpdDhcbiAgICB8IDU3IC0+IERpZ2l0OVxuICAgIHwgNDggLT4gRGlnaXQwXG4gICAgfCAxODkgLT4gTWludXNcbiAgICB8IDE4NyAtPiBFcXVhbFxuICAgIHwgOCAtPiBCYWNrc3BhY2VcbiAgICB8IDkgLT4gVGFiXG4gICAgfCA4MSAtPiBLZXlRXG4gICAgfCA4NyAtPiBLZXlXXG4gICAgfCA2OSAtPiBLZXlFXG4gICAgfCA4MiAtPiBLZXlSXG4gICAgfCA4NCAtPiBLZXlUXG4gICAgfCA4OSAtPiBLZXlZXG4gICAgfCA4NSAtPiBLZXlVXG4gICAgfCA3MyAtPiBLZXlJXG4gICAgfCA3OSAtPiBLZXlPXG4gICAgfCA4MCAtPiBLZXlQXG4gICAgfCAyMTkgLT4gQnJhY2tldExlZnRcbiAgICB8IDIyMSAtPiBCcmFja2V0UmlnaHRcbiAgICB8IDIyMCAtPiBCYWNrc2xhc2hcbiAgICB8IDIwIC0+IENhcHNMb2NrXG4gICAgfCA2NSAtPiBLZXlBXG4gICAgfCA4MyAtPiBLZXlTXG4gICAgfCA2OCAtPiBLZXlEXG4gICAgfCA3MCAtPiBLZXlGXG4gICAgfCA3MSAtPiBLZXlHXG4gICAgfCA3MiAtPiBLZXlIXG4gICAgfCA3NCAtPiBLZXlKXG4gICAgfCA3NSAtPiBLZXlLXG4gICAgfCA3NiAtPiBLZXlMXG4gICAgfCAxODYgLT4gU2VtaWNvbG9uXG4gICAgfCAyMjIgLT4gUXVvdGVcbiAgICB8IDEzIC0+IEVudGVyXG4gICAgfCA5MCAtPiBLZXlaXG4gICAgfCA4OCAtPiBLZXlYXG4gICAgfCA2NyAtPiBLZXlDXG4gICAgfCA4NiAtPiBLZXlWXG4gICAgfCA2NiAtPiBLZXlCXG4gICAgfCA3OCAtPiBLZXlOXG4gICAgfCA3NyAtPiBLZXlNXG4gICAgfCAxODggLT4gQ29tbWFcbiAgICB8IDE5MCAtPiBQZXJpb2RcbiAgICB8IDE5MSAtPiBTbGFzaFxuICAgIHwgMzIgLT4gU3BhY2VcbiAgICB8IDkzIC0+IENvbnRleHRNZW51XG4gICAgfCA0NSAtPiBJbnNlcnRcbiAgICB8IDM2IC0+IEhvbWVcbiAgICB8IDMzIC0+IFBhZ2VVcFxuICAgIHwgNDYgLT4gRGVsZXRlXG4gICAgfCAzNSAtPiBFbmRcbiAgICB8IDM0IC0+IFBhZ2VEb3duXG4gICAgfCAzNyAtPiBBcnJvd0xlZnRcbiAgICB8IDQwIC0+IEFycm93RG93blxuICAgIHwgMzkgLT4gQXJyb3dSaWdodFxuICAgIHwgMzggLT4gQXJyb3dVcFxuICAgIHwgXyAtPiBVbmlkZW50aWZpZWRcblxuICBsZXQgbWFrZV91bmlkZW50aWZpZWQgXyA9IFVuaWRlbnRpZmllZFxuXG4gIGxldCB0cnlfbmV4dCB2YWx1ZSBmID0gZnVuY3Rpb25cbiAgICB8IFVuaWRlbnRpZmllZCAtPiBPcHRkZWYuY2FzZSB2YWx1ZSBtYWtlX3VuaWRlbnRpZmllZCBmXG4gICAgfCB2IC0+IHZcblxuICBsZXQgcnVuX25leHQgdmFsdWUgZiA9IGZ1bmN0aW9uXG4gICAgfCBVbmlkZW50aWZpZWQgLT4gZiB2YWx1ZVxuICAgIHwgdiAtPiB2XG5cbiAgbGV0IGdldF9rZXlfY29kZSBldnQgPSBldnQjIy5rZXlDb2RlXG5cbiAgbGV0IHRyeV9rZXlfbG9jYXRpb24gZXZ0ID1cbiAgICBtYXRjaCBldnQjIy5sb2NhdGlvbiB3aXRoXG4gICAgfCAxIC0+IHJ1bl9uZXh0IChnZXRfa2V5X2NvZGUgZXZ0KSB0cnlfa2V5X2NvZGVfbGVmdFxuICAgIHwgMiAtPiBydW5fbmV4dCAoZ2V0X2tleV9jb2RlIGV2dCkgdHJ5X2tleV9jb2RlX3JpZ2h0XG4gICAgfCAzIC0+IHJ1bl9uZXh0IChnZXRfa2V5X2NvZGUgZXZ0KSB0cnlfa2V5X2NvZGVfbnVtcGFkXG4gICAgfCBfIC0+IG1ha2VfdW5pZGVudGlmaWVkXG5cbiAgbGV0ICggfD4gKSB4IGYgPSBmIHhcblxuICBsZXQgb2ZfZXZlbnQgZXZ0ID1cbiAgICBVbmlkZW50aWZpZWRcbiAgICB8PiB0cnlfbmV4dCBldnQjIy5jb2RlIHRyeV9jb2RlXG4gICAgfD4gdHJ5X2tleV9sb2NhdGlvbiBldnRcbiAgICB8PiBydW5fbmV4dCAoZ2V0X2tleV9jb2RlIGV2dCkgdHJ5X2tleV9jb2RlX25vcm1hbFxuXG4gIGxldCBvZl9rZXlfY29kZSA9IHRyeV9rZXlfY29kZV9ub3JtYWxcbmVuZFxuXG5tb2R1bGUgS2V5Ym9hcmRfa2V5ID0gc3RydWN0XG4gIHR5cGUgdCA9IFVjaGFyLnQgb3B0aW9uXG5cbiAgbGV0IGNoYXJfb2ZfaW50IHZhbHVlID1cbiAgICBpZiAwIDwgdmFsdWUgdGhlbiB0cnkgU29tZSAoVWNoYXIub2ZfaW50IHZhbHVlKSB3aXRoIF8gLT4gTm9uZSBlbHNlIE5vbmVcblxuICBsZXQgZW1wdHlfc3RyaW5nIF8gPSBKcy5zdHJpbmcgXCJcIlxuXG4gIGxldCBub25lIF8gPSBOb25lXG5cbiAgbGV0IG9mX2V2ZW50IGV2dCA9XG4gICAgbGV0IGtleSA9IE9wdGRlZi5nZXQgZXZ0IyMua2V5IGVtcHR5X3N0cmluZyBpblxuICAgIG1hdGNoIGtleSMjLmxlbmd0aCB3aXRoXG4gICAgfCAwIC0+IE9wdGRlZi5jYXNlIGV2dCMjLmNoYXJDb2RlIG5vbmUgY2hhcl9vZl9pbnRcbiAgICB8IDEgLT4gY2hhcl9vZl9pbnQgKGludF9vZl9mbG9hdCAoa2V5IyNjaGFyQ29kZUF0IDApKVxuICAgIHwgXyAtPiBOb25lXG5lbmRcblxuKCoqKioqKVxuXG5sZXQgZWxlbWVudCA6ICNEb20uZWxlbWVudCB0IC0+IGVsZW1lbnQgdCA9IEpzLlVuc2FmZS5jb2VyY2VcblxudHlwZSB0YWdnZWRFbGVtZW50ID1cbiAgfCBBIG9mIGFuY2hvckVsZW1lbnQgdFxuICB8IEFyZWEgb2YgYXJlYUVsZW1lbnQgdFxuICB8IEF1ZGlvIG9mIGF1ZGlvRWxlbWVudCB0XG4gIHwgQmFzZSBvZiBiYXNlRWxlbWVudCB0XG4gIHwgQmxvY2txdW90ZSBvZiBxdW90ZUVsZW1lbnQgdFxuICB8IEJvZHkgb2YgYm9keUVsZW1lbnQgdFxuICB8IEJyIG9mIGJyRWxlbWVudCB0XG4gIHwgQnV0dG9uIG9mIGJ1dHRvbkVsZW1lbnQgdFxuICB8IENhbnZhcyBvZiBjYW52YXNFbGVtZW50IHRcbiAgfCBDYXB0aW9uIG9mIHRhYmxlQ2FwdGlvbkVsZW1lbnQgdFxuICB8IENvbCBvZiB0YWJsZUNvbEVsZW1lbnQgdFxuICB8IENvbGdyb3VwIG9mIHRhYmxlQ29sRWxlbWVudCB0XG4gIHwgRGVsIG9mIG1vZEVsZW1lbnQgdFxuICB8IERpdiBvZiBkaXZFbGVtZW50IHRcbiAgfCBEbCBvZiBkTGlzdEVsZW1lbnQgdFxuICB8IEVtYmVkIG9mIGVtYmVkRWxlbWVudCB0XG4gIHwgRmllbGRzZXQgb2YgZmllbGRTZXRFbGVtZW50IHRcbiAgfCBGb3JtIG9mIGZvcm1FbGVtZW50IHRcbiAgfCBGcmFtZXNldCBvZiBmcmFtZVNldEVsZW1lbnQgdFxuICB8IEZyYW1lIG9mIGZyYW1lRWxlbWVudCB0XG4gIHwgSDEgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEgyIG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBIMyBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSDQgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEg1IG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBINiBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSGVhZCBvZiBoZWFkRWxlbWVudCB0XG4gIHwgSHIgb2YgaHJFbGVtZW50IHRcbiAgfCBIdG1sIG9mIGh0bWxFbGVtZW50IHRcbiAgfCBJZnJhbWUgb2YgaUZyYW1lRWxlbWVudCB0XG4gIHwgSW1nIG9mIGltYWdlRWxlbWVudCB0XG4gIHwgSW5wdXQgb2YgaW5wdXRFbGVtZW50IHRcbiAgfCBJbnMgb2YgbW9kRWxlbWVudCB0XG4gIHwgTGFiZWwgb2YgbGFiZWxFbGVtZW50IHRcbiAgfCBMZWdlbmQgb2YgbGVnZW5kRWxlbWVudCB0XG4gIHwgTGkgb2YgbGlFbGVtZW50IHRcbiAgfCBMaW5rIG9mIGxpbmtFbGVtZW50IHRcbiAgfCBNYXAgb2YgbWFwRWxlbWVudCB0XG4gIHwgTWV0YSBvZiBtZXRhRWxlbWVudCB0XG4gIHwgT2JqZWN0IG9mIG9iamVjdEVsZW1lbnQgdFxuICB8IE9sIG9mIG9MaXN0RWxlbWVudCB0XG4gIHwgT3B0Z3JvdXAgb2Ygb3B0R3JvdXBFbGVtZW50IHRcbiAgfCBPcHRpb24gb2Ygb3B0aW9uRWxlbWVudCB0XG4gIHwgUCBvZiBwYXJhbUVsZW1lbnQgdFxuICB8IFBhcmFtIG9mIHBhcmFtRWxlbWVudCB0XG4gIHwgUHJlIG9mIHByZUVsZW1lbnQgdFxuICB8IFEgb2YgcXVvdGVFbGVtZW50IHRcbiAgfCBTY3JpcHQgb2Ygc2NyaXB0RWxlbWVudCB0XG4gIHwgU2VsZWN0IG9mIHNlbGVjdEVsZW1lbnQgdFxuICB8IFN0eWxlIG9mIHN0eWxlRWxlbWVudCB0XG4gIHwgVGFibGUgb2YgdGFibGVFbGVtZW50IHRcbiAgfCBUYm9keSBvZiB0YWJsZVNlY3Rpb25FbGVtZW50IHRcbiAgfCBUZCBvZiB0YWJsZUNlbGxFbGVtZW50IHRcbiAgfCBUZXh0YXJlYSBvZiB0ZXh0QXJlYUVsZW1lbnQgdFxuICB8IFRmb290IG9mIHRhYmxlU2VjdGlvbkVsZW1lbnQgdFxuICB8IFRoIG9mIHRhYmxlQ2VsbEVsZW1lbnQgdFxuICB8IFRoZWFkIG9mIHRhYmxlU2VjdGlvbkVsZW1lbnQgdFxuICB8IFRpdGxlIG9mIHRpdGxlRWxlbWVudCB0XG4gIHwgVHIgb2YgdGFibGVSb3dFbGVtZW50IHRcbiAgfCBVbCBvZiB1TGlzdEVsZW1lbnQgdFxuICB8IFZpZGVvIG9mIHZpZGVvRWxlbWVudCB0XG4gIHwgT3RoZXIgb2YgZWxlbWVudCB0XG5cbmxldCBvdGhlciBlID0gT3RoZXIgKGUgOiAjZWxlbWVudCB0IDo+IGVsZW1lbnQgdClcblxubGV0IHRhZ2dlZCAoZSA6ICNlbGVtZW50IHQpID1cbiAgbGV0IHRhZyA9IEpzLnRvX2J5dGVzdHJpbmcgZSMjLnRhZ05hbWUjI3RvTG93ZXJDYXNlIGluXG4gIGlmIFN0cmluZy5sZW5ndGggdGFnID0gMFxuICB0aGVuIG90aGVyIGVcbiAgZWxzZVxuICAgIG1hdGNoIFN0cmluZy51bnNhZmVfZ2V0IHRhZyAwIHdpdGhcbiAgICB8ICdhJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJhXCIgLT4gQSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYXJlYVwiIC0+IEFyZWEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImF1ZGlvXCIgLT4gQXVkaW8gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnYicgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiYmFzZVwiIC0+IEJhc2UgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImJsb2NrcXVvdGVcIiAtPiBCbG9ja3F1b3RlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJib2R5XCIgLT4gQm9keSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYnJcIiAtPiBCciAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYnV0dG9uXCIgLT4gQnV0dG9uIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2MnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImNhbnZhc1wiIC0+IENhbnZhcyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiY2FwdGlvblwiIC0+IENhcHRpb24gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImNvbFwiIC0+IENvbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiY29sZ3JvdXBcIiAtPiBDb2xncm91cCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdkJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJkZWxcIiAtPiBEZWwgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImRpdlwiIC0+IERpdiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiZGxcIiAtPiBEbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdlJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJlbWJlZFwiIC0+IEVtYmVkIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2YnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImZpZWxkc2V0XCIgLT4gRmllbGRzZXQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImZvcm1cIiAtPiBGb3JtIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJmcmFtZXNldFwiIC0+IEZyYW1lc2V0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJmcmFtZVwiIC0+IEZyYW1lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2gnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImgxXCIgLT4gSDEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImgyXCIgLT4gSDIgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImgzXCIgLT4gSDMgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImg0XCIgLT4gSDQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImg1XCIgLT4gSDUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImg2XCIgLT4gSDYgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImhlYWRcIiAtPiBIZWFkIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoclwiIC0+IEhyIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJodG1sXCIgLT4gSHRtbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdpJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJpZnJhbWVcIiAtPiBJZnJhbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImltZ1wiIC0+IEltZyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaW5wdXRcIiAtPiBJbnB1dCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaW5zXCIgLT4gSW5zIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2wnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImxhYmVsXCIgLT4gTGFiZWwgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImxlZ2VuZFwiIC0+IExlZ2VuZCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwibGlcIiAtPiBMaSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwibGlua1wiIC0+IExpbmsgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnbScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwibWFwXCIgLT4gTWFwIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJtZXRhXCIgLT4gTWV0YSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdvJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJvYmplY3RcIiAtPiBPYmplY3QgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcIm9sXCIgLT4gT2wgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcIm9wdGdyb3VwXCIgLT4gT3B0Z3JvdXAgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcIm9wdGlvblwiIC0+IE9wdGlvbiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdwJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJwXCIgLT4gUCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwicGFyYW1cIiAtPiBQYXJhbSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwicHJlXCIgLT4gUHJlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3EnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInFcIiAtPiBRIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3MnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInNjcmlwdFwiIC0+IFNjcmlwdCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwic2VsZWN0XCIgLT4gU2VsZWN0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJzdHlsZVwiIC0+IFN0eWxlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3QnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInRhYmxlXCIgLT4gVGFibGUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRib2R5XCIgLT4gVGJvZHkgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRkXCIgLT4gVGQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRleHRhcmVhXCIgLT4gVGV4dGFyZWEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRmb290XCIgLT4gVGZvb3QgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRoXCIgLT4gVGggKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRoZWFkXCIgLT4gVGhlYWQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRpdGxlXCIgLT4gVGl0bGUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInRyXCIgLT4gVHIgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAndScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwidWxcIiAtPiBVbCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICd2JyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJ2aWRlb1wiIC0+IFZpZGVvIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgXyAtPiBvdGhlciBlXG5cbmxldCBvcHRfdGFnZ2VkIGUgPSBPcHQuY2FzZSBlIChmdW4gKCkgLT4gTm9uZSkgKGZ1biBlIC0+IFNvbWUgKHRhZ2dlZCBlKSlcblxudHlwZSB0YWdnZWRFdmVudCA9XG4gIHwgTW91c2VFdmVudCBvZiBtb3VzZUV2ZW50IHRcbiAgfCBLZXlib2FyZEV2ZW50IG9mIGtleWJvYXJkRXZlbnQgdFxuICB8IE1lc3NhZ2VFdmVudCBvZiBtZXNzYWdlRXZlbnQgdFxuICB8IE1vdXNld2hlZWxFdmVudCBvZiBtb3VzZXdoZWVsRXZlbnQgdFxuICB8IE1vdXNlU2Nyb2xsRXZlbnQgb2YgbW91c2VTY3JvbGxFdmVudCB0XG4gIHwgUG9wU3RhdGVFdmVudCBvZiBwb3BTdGF0ZUV2ZW50IHRcbiAgfCBPdGhlckV2ZW50IG9mIGV2ZW50IHRcblxubGV0IHRhZ2dlZEV2ZW50IChldiA6ICNldmVudCBKcy50KSA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKENvZXJjZVRvLm1vdXNlRXZlbnQgZXYpXG4gICAgKGZ1biAoKSAtPlxuICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgKENvZXJjZVRvLmtleWJvYXJkRXZlbnQgZXYpXG4gICAgICAgIChmdW4gKCkgLT5cbiAgICAgICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAgICAgKENvZXJjZVRvLndoZWVsRXZlbnQgZXYpXG4gICAgICAgICAgICAoZnVuICgpIC0+XG4gICAgICAgICAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgICAgICAgICAgKENvZXJjZVRvLm1vdXNlU2Nyb2xsRXZlbnQgZXYpXG4gICAgICAgICAgICAgICAgKGZ1biAoKSAtPlxuICAgICAgICAgICAgICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgICAgICAgICAgICAgKENvZXJjZVRvLnBvcFN0YXRlRXZlbnQgZXYpXG4gICAgICAgICAgICAgICAgICAgIChmdW4gKCkgLT5cbiAgICAgICAgICAgICAgICAgICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAgICAgICAgICAgICAgICAgKENvZXJjZVRvLm1lc3NhZ2VFdmVudCBldilcbiAgICAgICAgICAgICAgICAgICAgICAgIChmdW4gKCkgLT4gT3RoZXJFdmVudCAoZXYgOj4gZXZlbnQgdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAoZnVuIGV2IC0+IE1lc3NhZ2VFdmVudCBldikpXG4gICAgICAgICAgICAgICAgICAgIChmdW4gZXYgLT4gUG9wU3RhdGVFdmVudCBldikpXG4gICAgICAgICAgICAgICAgKGZ1biBldiAtPiBNb3VzZVNjcm9sbEV2ZW50IGV2KSlcbiAgICAgICAgICAgIChmdW4gZXYgLT4gTW91c2V3aGVlbEV2ZW50IGV2KSlcbiAgICAgICAgKGZ1biBldiAtPiBLZXlib2FyZEV2ZW50IGV2KSlcbiAgICAoZnVuIGV2IC0+IE1vdXNlRXZlbnQgZXYpXG5cbmxldCBvcHRfdGFnZ2VkRXZlbnQgZXYgPSBPcHQuY2FzZSBldiAoZnVuICgpIC0+IE5vbmUpIChmdW4gZXYgLT4gU29tZSAodGFnZ2VkRXZlbnQgZXYpKVxuXG5sZXQgc3RvcFByb3BhZ2F0aW9uIGV2ID1cbiAgbGV0IGUgPSBKcy5VbnNhZmUuY29lcmNlIGV2IGluXG4gIE9wdGRlZi5jYXNlXG4gICAgZSMjLnN0b3BQcm9wYWdhdGlvblxuICAgIChmdW4gKCkgLT4gZSMjLmNhbmNlbEJ1YmJsZSA6PSBKcy5fdHJ1ZSlcbiAgICAoZnVuIF8gLT4gZSMjX3N0b3BQcm9wYWdhdGlvbilcblxubGV0IF9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgOiAodW5pdCAtPiB1bml0KSBKcy5jYWxsYmFjayAtPiB1bml0ID1cbiAgSnMuVW5zYWZlLnB1cmVfZXhwciAoZnVuIF8gLT5cbiAgICAgIGxldCB3ID0gSnMuVW5zYWZlLmNvZXJjZSB3aW5kb3cgaW5cbiAgICAgIGxldCBsID1cbiAgICAgICAgWyB3IyMucmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgIDsgdyMjLm1velJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA7IHcjIy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOyB3IyMub1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA7IHcjIy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICBdXG4gICAgICBpblxuICAgICAgdHJ5XG4gICAgICAgIGxldCByZXEgPSBMaXN0LmZpbmQgKGZ1biBjIC0+IEpzLk9wdGRlZi50ZXN0IGMpIGwgaW5cbiAgICAgICAgZnVuIGNhbGxiYWNrIC0+IEpzLlVuc2FmZS5mdW5fY2FsbCByZXEgW3wgSnMuVW5zYWZlLmluamVjdCBjYWxsYmFjayB8XVxuICAgICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgbGV0IG5vdyAoKSA9IChuZXclanMgSnMuZGF0ZV9ub3cpIyNnZXRUaW1lIGluXG4gICAgICAgIGxldCBsYXN0ID0gcmVmIChub3cgKCkpIGluXG4gICAgICAgIGZ1biBjYWxsYmFjayAtPlxuICAgICAgICAgIGxldCB0ID0gbm93ICgpIGluXG4gICAgICAgICAgbGV0IGR0ID0gIWxhc3QgKy4gKDEwMDAuIC8uIDYwLikgLS4gdCBpblxuICAgICAgICAgIGxldCBkdCA9IGlmIFBvbHkuKGR0IDwgMC4pIHRoZW4gMC4gZWxzZSBkdCBpblxuICAgICAgICAgIGxhc3QgOj0gdDtcbiAgICAgICAgICBpZ25vcmUgKHdpbmRvdyMjc2V0VGltZW91dCBjYWxsYmFjayBkdCkpXG5cbigqKioqKVxuXG5sZXQgaGFzUHVzaFN0YXRlICgpID0gSnMuT3B0ZGVmLnRlc3QgKEpzLlVuc2FmZS5jb2VyY2Ugd2luZG93IyMuaGlzdG9yeSkjIy5wdXNoU3RhdGVcblxubGV0IGhhc1BsYWNlaG9sZGVyICgpID1cbiAgbGV0IGkgPSBjcmVhdGVJbnB1dCBkb2N1bWVudCBpblxuICBKcy5PcHRkZWYudGVzdCAoSnMuVW5zYWZlLmNvZXJjZSBpKSMjLnBsYWNlaG9sZGVyXG5cbmxldCBoYXNSZXF1aXJlZCAoKSA9XG4gIGxldCBpID0gY3JlYXRlSW5wdXQgZG9jdW1lbnQgaW5cbiAgSnMuT3B0ZGVmLnRlc3QgKEpzLlVuc2FmZS5jb2VyY2UgaSkjIy5yZXF1aXJlZFxuXG5sZXQgb3ZlcmZsb3dfbGltaXQgPSAyMTQ3NDgzXzAwMC5cblxuKCogbXMgKilcblxudHlwZSB0aW1lb3V0X2lkX3NhZmUgPSB0aW1lb3V0X2lkIG9wdGlvbiByZWZcblxubGV0IHNldFRpbWVvdXQgY2FsbGJhY2sgZCA6IHRpbWVvdXRfaWRfc2FmZSA9XG4gIGxldCBpZCA9IHJlZiBOb25lIGluXG4gIGxldCByZWMgbG9vcCBkICgpID1cbiAgICBsZXQgc3RlcCwgcmVtYWluID1cbiAgICAgIGlmIFBvbHkuKGQgPiBvdmVyZmxvd19saW1pdCkgdGhlbiBvdmVyZmxvd19saW1pdCwgZCAtLiBvdmVyZmxvd19saW1pdCBlbHNlIGQsIDAuXG4gICAgaW5cbiAgICBsZXQgY2IgPSBpZiBQb2x5LihyZW1haW4gPSAwLikgdGhlbiBjYWxsYmFjayBlbHNlIGxvb3AgcmVtYWluIGluXG4gICAgaWQgOj0gU29tZSAod2luZG93IyNzZXRUaW1lb3V0IChKcy53cmFwX2NhbGxiYWNrIGNiKSBzdGVwKVxuICBpblxuICBsb29wIGQgKCk7XG4gIGlkXG5cbmxldCBjbGVhclRpbWVvdXQgKGlkIDogdGltZW91dF9pZF9zYWZlKSA9XG4gIG1hdGNoICFpZCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgeCAtPlxuICAgICAgaWQgOj0gTm9uZTtcbiAgICAgIHdpbmRvdyMjY2xlYXJUaW1lb3V0IHhcblxubGV0IGpzX2FycmF5X29mX2NvbGxlY3Rpb24gKGMgOiAjZWxlbWVudCBjb2xsZWN0aW9uIEpzLnQpIDogI2VsZW1lbnQgSnMudCBKcy5qc19hcnJheSBKcy50XG4gICAgPVxuICBKcy5VbnNhZmUuKG1ldGhfY2FsbCAoanNfZXhwciBcIltdLnNsaWNlXCIpIFwiY2FsbFwiIFt8IGluamVjdCBjIHxdKVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMSBQaWVycmUgQ2hhbWJhcnRcbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuIERvbV9odG1sXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBmb3JtRGF0YSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhcHBlbmQgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhcHBlbmRfYmxvYiA6IGpzX3N0cmluZyB0IC0+IEZpbGUuYmxvYiB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxubGV0IGZvcm1EYXRhIDogZm9ybURhdGEgdCBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0Zvcm1EYXRhXG5cbmxldCBmb3JtRGF0YV9mb3JtIDogKGZvcm1FbGVtZW50IHQgLT4gZm9ybURhdGEgdCkgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9Gb3JtRGF0YVxuXG50eXBlIGZvcm1fZWx0ID1cbiAgWyBgU3RyaW5nIG9mIGpzX3N0cmluZyB0XG4gIHwgYEZpbGUgb2YgRmlsZS5maWxlIHRcbiAgXVxuXG50eXBlIGZvcm1fY29udGVudHMgPVxuICBbIGBGaWVsZHMgb2YgKHN0cmluZyAqIGZvcm1fZWx0KSBsaXN0IHJlZlxuICB8IGBGb3JtRGF0YSBvZiBmb3JtRGF0YSB0XG4gIF1cblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgdiA6OiBxIC0+IChcbiAgICAgIG1hdGNoIGYgdiB3aXRoXG4gICAgICB8IE5vbmUgLT4gZmlsdGVyX21hcCBmIHFcbiAgICAgIHwgU29tZSB2JyAtPiB2JyA6OiBmaWx0ZXJfbWFwIGYgcSlcblxuY2xhc3MgdHlwZSBzdWJtaXR0YWJsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZGlzYWJsZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5sZXQgaGF2ZV9jb250ZW50IChlbHQgOiBzdWJtaXR0YWJsZUVsZW1lbnQgdCkgPVxuICBlbHQjIy5uYW1lIyMubGVuZ3RoID4gMCAmJiBub3QgKEpzLnRvX2Jvb2wgZWx0IyMuZGlzYWJsZWQpXG5cbmxldCBnZXRfdGV4dGFyZWFfdmFsIChlbHQgOiB0ZXh0QXJlYUVsZW1lbnQgdCkgPVxuICBpZiBoYXZlX2NvbnRlbnQgKGVsdCA6PiBzdWJtaXR0YWJsZUVsZW1lbnQgdClcbiAgdGhlblxuICAgIGxldCBuYW1lID0gdG9fc3RyaW5nIGVsdCMjLm5hbWUgaW5cbiAgICBbIG5hbWUsIGBTdHJpbmcgZWx0IyMudmFsdWUgXVxuICBlbHNlIFtdXG5cbmxldCBnZXRfc2VsZWN0X3ZhbCAoZWx0IDogc2VsZWN0RWxlbWVudCB0KSA9XG4gIGlmIGhhdmVfY29udGVudCAoZWx0IDo+IHN1Ym1pdHRhYmxlRWxlbWVudCB0KVxuICB0aGVuXG4gICAgbGV0IG5hbWUgPSB0b19zdHJpbmcgZWx0IyMubmFtZSBpblxuICAgIGlmIHRvX2Jvb2wgZWx0IyMubXVsdGlwbGVcbiAgICB0aGVuXG4gICAgICBsZXQgb3B0aW9ucyA9XG4gICAgICAgIEFycmF5LmluaXQgZWx0IyMub3B0aW9ucyMjLmxlbmd0aCAoZnVuIGkgLT4gT3B0LnRvX29wdGlvbiAoZWx0IyMub3B0aW9ucyMjaXRlbSBpKSlcbiAgICAgIGluXG4gICAgICBmaWx0ZXJfbWFwXG4gICAgICAgIChmdW5jdGlvblxuICAgICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgICAgfCBTb21lIGUgLT5cbiAgICAgICAgICAgICAgaWYgSnMudG9fYm9vbCBlIyMuc2VsZWN0ZWQgdGhlbiBTb21lIChuYW1lLCBgU3RyaW5nIGUjIy52YWx1ZSkgZWxzZSBOb25lKVxuICAgICAgICAoQXJyYXkudG9fbGlzdCBvcHRpb25zKVxuICAgIGVsc2UgWyBuYW1lLCBgU3RyaW5nIGVsdCMjLnZhbHVlIF1cbiAgZWxzZSBbXVxuXG5jbGFzcyB0eXBlIGZpbGVfaW5wdXQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGlucHV0RWxlbWVudFxuXG4gICAgbWV0aG9kIGZpbGVzIDogRmlsZS5maWxlTGlzdCB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbXVsdGlwbGUgOiBib29sIG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgZ2V0X2lucHV0X3ZhbCA/KGdldCA9IGZhbHNlKSAoZWx0IDogaW5wdXRFbGVtZW50IHQpID1cbiAgaWYgaGF2ZV9jb250ZW50IChlbHQgOj4gc3VibWl0dGFibGVFbGVtZW50IHQpXG4gIHRoZW5cbiAgICBsZXQgbmFtZSA9IHRvX3N0cmluZyBlbHQjIy5uYW1lIGluXG4gICAgbGV0IHZhbHVlID0gZWx0IyMudmFsdWUgaW5cbiAgICBtYXRjaCB0b19ieXRlc3RyaW5nIGVsdCMjLl90eXBlIyN0b0xvd2VyQ2FzZSB3aXRoXG4gICAgfCBcImNoZWNrYm94XCIgfCBcInJhZGlvXCIgLT5cbiAgICAgICAgaWYgdG9fYm9vbCBlbHQjIy5jaGVja2VkIHRoZW4gWyBuYW1lLCBgU3RyaW5nIHZhbHVlIF0gZWxzZSBbXVxuICAgIHwgXCJzdWJtaXRcIiB8IFwicmVzZXRcIiAtPiBbXVxuICAgIHwgXCJ0ZXh0XCIgfCBcInBhc3N3b3JkXCIgLT4gWyBuYW1lLCBgU3RyaW5nIHZhbHVlIF1cbiAgICB8IFwiZmlsZVwiIC0+IChcbiAgICAgICAgaWYgZ2V0XG4gICAgICAgIHRoZW4gWyBuYW1lLCBgU3RyaW5nIHZhbHVlIF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGxldCBlbHQgOiBmaWxlX2lucHV0IHQgPSBVbnNhZmUuY29lcmNlIGVsdCBpblxuICAgICAgICAgIG1hdGNoIE9wdGRlZi50b19vcHRpb24gZWx0IyMuZmlsZXMgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBbXVxuICAgICAgICAgIHwgU29tZSBsaXN0IC0+IChcbiAgICAgICAgICAgICAgaWYgbGlzdCMjLmxlbmd0aCA9IDBcbiAgICAgICAgICAgICAgdGhlbiBbIG5hbWUsIGBTdHJpbmcgKEpzLnN0cmluZyBcIlwiKSBdXG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXRjaCBPcHRkZWYudG9fb3B0aW9uIGVsdCMjLm11bHRpcGxlIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgfCBTb21lIGZhbHNlIC0+IChcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggT3B0LnRvX29wdGlvbiAobGlzdCMjaXRlbSAwKSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBbXVxuICAgICAgICAgICAgICAgICAgICB8IFNvbWUgZmlsZSAtPiBbIG5hbWUsIGBGaWxlIGZpbGUgXSlcbiAgICAgICAgICAgICAgICB8IFNvbWUgdHJ1ZSAtPlxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWFwXG4gICAgICAgICAgICAgICAgICAgICAgKGZ1biBmIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBPcHQudG9fb3B0aW9uIGYgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBmaWxlIC0+IFNvbWUgKG5hbWUsIGBGaWxlIGZpbGUpKVxuICAgICAgICAgICAgICAgICAgICAgIChBcnJheS50b19saXN0IChBcnJheS5pbml0IGxpc3QjIy5sZW5ndGggKGZ1biBpIC0+IGxpc3QjI2l0ZW0gaSkpKSkpXG4gICAgfCBfIC0+IFsgbmFtZSwgYFN0cmluZyB2YWx1ZSBdXG4gIGVsc2UgW11cblxubGV0IGdldF9mb3JtX2VsZW1lbnRzIChmb3JtIDogZm9ybUVsZW1lbnQgdCkgPVxuICBsZXQgcmVjIGxvb3AgYWNjIGkgPVxuICAgIGlmIGkgPCAwXG4gICAgdGhlbiBhY2NcbiAgICBlbHNlXG4gICAgICBtYXRjaCBPcHQudG9fb3B0aW9uIChmb3JtIyMuZWxlbWVudHMjI2l0ZW0gaSkgd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgYWNjIChpIC0gaSlcbiAgICAgIHwgU29tZSB4IC0+IGxvb3AgKHggOjogYWNjKSAoaSAtIDEpXG4gIGluXG4gIGxvb3AgW10gKGZvcm0jIy5lbGVtZW50cyMjLmxlbmd0aCAtIDEpXG5cbmxldCBnZXRfZWxlbWVudF9jb250ZW50ID9nZXQgdiA9XG4gIG1hdGNoIHRhZ2dlZCB2IHdpdGhcbiAgfCBTZWxlY3QgdiAtPiBnZXRfc2VsZWN0X3ZhbCB2XG4gIHwgSW5wdXQgdiAtPiBnZXRfaW5wdXRfdmFsID9nZXQgdlxuICB8IFRleHRhcmVhIHYgLT4gZ2V0X3RleHRhcmVhX3ZhbCB2XG4gIHwgXyAtPiBbXVxuXG5sZXQgZm9ybV9lbGVtZW50cyA/Z2V0IChmb3JtIDogZm9ybUVsZW1lbnQgdCkgPVxuICBMaXN0LmZsYXR0ZW4gKExpc3QubWFwIChmdW4gdiAtPiBnZXRfZWxlbWVudF9jb250ZW50ID9nZXQgdikgKGdldF9mb3JtX2VsZW1lbnRzIGZvcm0pKVxuXG5sZXQgYXBwZW5kIChmb3JtX2NvbnRlbnRzIDogZm9ybV9jb250ZW50cykgKGZvcm1fZWx0IDogc3RyaW5nICogZm9ybV9lbHQpID1cbiAgbWF0Y2ggZm9ybV9jb250ZW50cyB3aXRoXG4gIHwgYEZpZWxkcyBsaXN0IC0+IGxpc3QgOj0gZm9ybV9lbHQgOjogIWxpc3RcbiAgfCBgRm9ybURhdGEgZiAtPiAoXG4gICAgICBtYXRjaCBmb3JtX2VsdCB3aXRoXG4gICAgICB8IG5hbWUsIGBTdHJpbmcgcyAtPiBmIyNhcHBlbmQgKHN0cmluZyBuYW1lKSBzXG4gICAgICB8IG5hbWUsIGBGaWxlIGZpbGUgLT4gZiMjYXBwZW5kX2Jsb2IgKHN0cmluZyBuYW1lKSAoZmlsZSA6PiBGaWxlLmJsb2IgdCkpXG5cbmxldCBlbXB0eV9mb3JtX2NvbnRlbnRzICgpID1cbiAgbWF0Y2ggT3B0ZGVmLnRvX29wdGlvbiAoSnMuZGVmIGZvcm1EYXRhKSB3aXRoXG4gIHwgTm9uZSAtPiBgRmllbGRzIChyZWYgW10pXG4gIHwgU29tZSBjb25zdHIgLT4gYEZvcm1EYXRhIChuZXclanMgY29uc3RyKVxuXG5sZXQgcG9zdF9mb3JtX2NvbnRlbnRzIGZvcm0gPVxuICBsZXQgY29udGVudHMgPSBlbXB0eV9mb3JtX2NvbnRlbnRzICgpIGluXG4gIExpc3QuaXRlciAoYXBwZW5kIGNvbnRlbnRzKSAoZm9ybV9lbGVtZW50cyBmb3JtKTtcbiAgY29udGVudHNcblxubGV0IGdldF9mb3JtX2NvbnRlbnRzIGZvcm0gPVxuICBMaXN0Lm1hcFxuICAgIChmdW5jdGlvblxuICAgICAgfCBuYW1lLCBgU3RyaW5nIHMgLT4gbmFtZSwgdG9fc3RyaW5nIHNcbiAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG4gICAgKGZvcm1fZWxlbWVudHMgfmdldDp0cnVlIGZvcm0pXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiEgSW1wb3J0XG5cbnR5cGUgcmVhZHlTdGF0ZSA9XG4gIHwgVU5TRU5UXG4gIHwgT1BFTkVEXG4gIHwgSEVBREVSU19SRUNFSVZFRFxuICB8IExPQURJTkdcbiAgfCBET05FXG5cbnR5cGUgXyByZXNwb25zZSA9XG4gIHwgQXJyYXlCdWZmZXIgOiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciB0IE9wdC50IHJlc3BvbnNlXG4gIHwgQmxvYiA6ICNGaWxlLmJsb2IgdCBPcHQudCByZXNwb25zZVxuICB8IERvY3VtZW50IDogRG9tLmVsZW1lbnQgRG9tLmRvY3VtZW50IHQgT3B0LnQgcmVzcG9uc2VcbiAgfCBKU09OIDogJ2EgT3B0LnQgcmVzcG9uc2VcbiAgfCBUZXh0IDoganNfc3RyaW5nIHQgcmVzcG9uc2VcbiAgfCBEZWZhdWx0IDogc3RyaW5nIHJlc3BvbnNlXG5cbmNsYXNzIHR5cGUgeG1sSHR0cFJlcXVlc3QgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIG1ldGhvZCBvbnJlYWR5c3RhdGVjaGFuZ2UgOiAodW5pdCAtPiB1bml0KSBKcy5jYWxsYmFjayBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiByZWFkeVN0YXRlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfb3BlbiA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBfb3Blbl9mdWxsIDpcbiAgICAgICAgIGpzX3N0cmluZyB0XG4gICAgICAtPiBqc19zdHJpbmcgdFxuICAgICAgLT4gYm9vbCB0XG4gICAgICAtPiBqc19zdHJpbmcgdCBvcHRcbiAgICAgIC0+IGpzX3N0cmluZyB0IG9wdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0UmVxdWVzdEhlYWRlciA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG92ZXJyaWRlTWltZVR5cGUgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZW5kIDoganNfc3RyaW5nIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfYmxvYiA6ICNGaWxlLmJsb2IgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZW5kX2RvY3VtZW50IDogRG9tLmVsZW1lbnQgRG9tLmRvY3VtZW50IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9mb3JtRGF0YSA6IEZvcm0uZm9ybURhdGEgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhYm9ydCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0YXR1cyA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhdHVzVGV4dCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRSZXNwb25zZUhlYWRlciA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlc3BvbnNlIDogRmlsZS5maWxlX2FueSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVzcG9uc2VUZXh0IDoganNfc3RyaW5nIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXNwb25zZVhNTCA6IERvbS5lbGVtZW50IERvbS5kb2N1bWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVzcG9uc2VUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpdGhDcmVkZW50aWFscyA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgaW5oZXJpdCBGaWxlLnByb2dyZXNzRXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCBvbnRpbWVvdXQgOlxuICAgICAgKCdzZWxmIHQsICdzZWxmIEZpbGUucHJvZ3Jlc3NFdmVudCB0KSBEb20uZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1cGxvYWQgOiB4bWxIdHRwUmVxdWVzdFVwbG9hZCB0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgeG1sSHR0cFJlcXVlc3RVcGxvYWQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgRmlsZS5wcm9ncmVzc0V2ZW50VGFyZ2V0XG4gIGVuZFxuXG5tb2R1bGUgRXZlbnQgPSBzdHJ1Y3RcbiAgdHlwZSB0eXAgPSB4bWxIdHRwUmVxdWVzdCBGaWxlLnByb2dyZXNzRXZlbnQgdCBEb20uRXZlbnQudHlwXG5cbiAgbGV0IHJlYWR5c3RhdGVjaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcInJlYWR5c3RhdGVjaGFuZ2VcIlxuXG4gIGxldCBsb2Fkc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcImxvYWRzdGFydFwiXG5cbiAgbGV0IHByb2dyZXNzID0gRG9tLkV2ZW50Lm1ha2UgXCJwcm9ncmVzc1wiXG5cbiAgbGV0IGFib3J0ID0gRG9tLkV2ZW50Lm1ha2UgXCJhYm9ydFwiXG5cbiAgbGV0IGVycm9yID0gRG9tLkV2ZW50Lm1ha2UgXCJlcnJvclwiXG5cbiAgbGV0IGxvYWQgPSBEb20uRXZlbnQubWFrZSBcImxvYWRcIlxuXG4gIGxldCB0aW1lb3V0ID0gRG9tLkV2ZW50Lm1ha2UgXCJ0aW1lb3V0XCJcblxuICBsZXQgbG9hZGVuZCA9IERvbS5FdmVudC5tYWtlIFwibG9hZGVuZFwiXG5lbmRcblxuZXh0ZXJuYWwgY3JlYXRlIDogdW5pdCAtPiB4bWxIdHRwUmVxdWVzdCBKcy50ID0gXCJjYW1sX3htbGh0dHByZXF1ZXN0X2NyZWF0ZVwiXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE1IE9DYW1sUHJvOiBHcsOpZ29pcmUgSGVucnksIMOHYcSfZGHFnyBCb3ptYW4uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4gRG9tX2h0bWxcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIFsnYSwgJ2JdIHdvcmtlciA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOiAoJ3NlbGYgdCwgZXJyb3JFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubWVzc2FnZSA6ICgnc2VsZiB0LCAnYiBtZXNzYWdlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwb3N0TWVzc2FnZSA6ICdhIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRlcm1pbmF0ZSA6IHVuaXQgbWV0aFxuICBlbmRcblxuYW5kIGVycm9yRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgbWVzc2FnZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWxlbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsaW5lbm8gOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbG5vIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlcnJvciA6IFVuc2FmZS5hbnkgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIFsnYV0gbWVzc2FnZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGRhdGEgOiAnYSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgd29ya2VyID0gVW5zYWZlLmdsb2JhbCMjLl9Xb3JrZXJcblxubGV0IGNyZWF0ZSBzY3JpcHQgPSBuZXclanMgd29ya2VyIChzdHJpbmcgc2NyaXB0KVxuXG5sZXQgaW1wb3J0X3NjcmlwdHMgc2NyaXB0cyA6IHVuaXQgPVxuICBpZiBVbnNhZmUuZ2xvYmFsIyMuaW1wb3J0U2NyaXB0cyA9PSB1bmRlZmluZWRcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIldvcmtlci5pbXBvcnRfc2NyaXB0cyBpcyB1bmRlZmluZWRcIjtcbiAgVW5zYWZlLmZ1bl9jYWxsXG4gICAgVW5zYWZlLmdsb2JhbCMjLmltcG9ydFNjcmlwdHNcbiAgICAoQXJyYXkubWFwIChmdW4gcyAtPiBVbnNhZmUuaW5qZWN0IChzdHJpbmcgcykpIChBcnJheS5vZl9saXN0IHNjcmlwdHMpKVxuXG5sZXQgc2V0X29ubWVzc2FnZSBoYW5kbGVyID1cbiAgaWYgVW5zYWZlLmdsb2JhbCMjLm9ubWVzc2FnZSA9PSB1bmRlZmluZWRcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIldvcmtlci5vbm1lc3NhZ2UgaXMgdW5kZWZpbmVkXCI7XG4gIGxldCBqc19oYW5kbGVyIChldiA6ICdhIG1lc3NhZ2VFdmVudCBKcy50KSA9IGhhbmRsZXIgZXYjIy5kYXRhIGluXG4gIFVuc2FmZS5nbG9iYWwjIy5vbm1lc3NhZ2UgOj0gd3JhcF9jYWxsYmFjayBqc19oYW5kbGVyXG5cbmxldCBwb3N0X21lc3NhZ2UgbXNnID1cbiAgaWYgVW5zYWZlLmdsb2JhbCMjLnBvc3RNZXNzYWdlID09IHVuZGVmaW5lZFxuICB0aGVuIGludmFsaWRfYXJnIFwiV29ya2VyLm9ubWVzc2FnZSBpcyB1bmRlZmluZWRcIjtcbiAgVW5zYWZlLmdsb2JhbCMjcG9zdE1lc3NhZ2UgbXNnXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEyIEphY3F1ZXMtUGFzY2FsIERlcGxhaXhcbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuISBJbXBvcnRcblxudHlwZSByZWFkeVN0YXRlID1cbiAgfCBDT05ORUNUSU5HXG4gIHwgT1BFTlxuICB8IENMT1NJTkdcbiAgfCBDTE9TRURcblxuY2xhc3MgdHlwZSBbJ2FdIGNsb3NlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFsnYV0gRG9tLmV2ZW50XG5cbiAgICBtZXRob2QgY29kZSA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhc29uIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdhc0NsZWFuIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgWydhXSBtZXNzYWdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFsnYV0gRG9tLmV2ZW50XG5cbiAgICBtZXRob2QgZGF0YSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkYXRhX2J1ZmZlciA6IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRhdGFfYmxvYiA6IEZpbGUuYmxvYiBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgd2ViU29ja2V0ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgdXJsIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiByZWFkeVN0YXRlIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBidWZmZXJlZEFtb3VudCA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25vcGVuIDpcbiAgICAgICgnc2VsZiBKcy50LCAnc2VsZiBEb20uZXZlbnQgSnMudCkgRG9tLmV2ZW50X2xpc3RlbmVyIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25jbG9zZSA6XG4gICAgICAoJ3NlbGYgSnMudCwgJ3NlbGYgY2xvc2VFdmVudCBKcy50KSBEb20uZXZlbnRfbGlzdGVuZXIgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmVycm9yIDpcbiAgICAgICgnc2VsZiBKcy50LCAnc2VsZiBEb20uZXZlbnQgSnMudCkgRG9tLmV2ZW50X2xpc3RlbmVyIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgZXh0ZW5zaW9ucyA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcm90b2NvbCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbG9zZSA6IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlX3dpdGhDb2RlIDogaW50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlX3dpdGhDb2RlQW5kUmVhc29uIDogaW50IC0+IEpzLmpzX3N0cmluZyBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIG9ubWVzc2FnZSA6XG4gICAgICAoJ3NlbGYgSnMudCwgJ3NlbGYgbWVzc2FnZUV2ZW50IEpzLnQpIERvbS5ldmVudF9saXN0ZW5lciBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJpbmFyeVR5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICBtZXRob2Qgc2VuZCA6IEpzLmpzX3N0cmluZyBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfYnVmZmVyIDogVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBzZW5kX2Jsb2IgOiBGaWxlLmJsb2IgSnMudCAtPiB1bml0IEpzLm1ldGhcbiAgZW5kXG5cbmxldCB3ZWJTb2NrZXQgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1dlYlNvY2tldFxuXG5sZXQgd2ViU29ja2V0X3dpdGhQcm90b2NvbCA9IHdlYlNvY2tldFxuXG5sZXQgd2ViU29ja2V0X3dpdGhQcm90b2NvbHMgPSB3ZWJTb2NrZXRcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IHdlYlNvY2tldFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMiBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG4oKiogNS4xIFR5cGVzICopXG5cbnR5cGUgc2l6ZWkgPSBpbnRcblxudHlwZSBzaXplaXB0ciA9IGludFxuXG50eXBlIGludHB0ciA9IGludFxuXG50eXBlIHVpbnQgPSBpbnRcblxudHlwZSBjbGFtcGYgPSBmbG9hdFxuXG50eXBlIHZvaWRcblxudHlwZSBjbGVhckJ1ZmZlck1hc2sgPSBpbnRcblxudHlwZSBiZWdpbk1vZGVcblxudHlwZSBibGVuZGluZ0ZhY3RvclxuXG50eXBlIGJsZW5kTW9kZVxuXG50eXBlIGJ1ZmZlclRhcmdldFxuXG50eXBlIGJ1ZmZlclVzYWdlXG5cbnR5cGUgY3VsbEZhY2VNb2RlXG5cbnR5cGUgZGVwdGhGdW5jdGlvblxuXG50eXBlIGVuYWJsZUNhcFxuXG50eXBlIGVycm9yQ29kZVxuXG50eXBlIGZyb250RmFjZURpclxuXG50eXBlIGhpbnRUYXJnZXRcblxudHlwZSBoaW50TW9kZVxuXG50eXBlIHRleHR1cmVVbml0ID0gaW50XG5cbnR5cGUgJ2EgcGl4ZWxTdG9yZVBhcmFtXG5cbnR5cGUgc3RlbmNpbE9wXG5cbnR5cGUgZmJUYXJnZXRcblxudHlwZSBhdHRhY2htZW50UG9pbnRcblxudHlwZSByYlRhcmdldFxuXG50eXBlIHRleFRhcmdldFxuXG50eXBlICdhIHBhcmFtZXRlclxuXG50eXBlICdhIGJ1ZmZlclBhcmFtZXRlclxuXG50eXBlICdhIHZlcnRleEF0dHJpYlBhcmFtXG5cbnR5cGUgdmVydGV4QXR0cmliUG9pbnRlclBhcmFtXG5cbnR5cGUgJ2EgYXR0YWNoUGFyYW1cblxudHlwZSBmcmFtZWJ1ZmZlclN0YXR1c1xuXG50eXBlICdhIHJlbmRlcmJ1ZmZlclBhcmFtXG5cbnR5cGUgZm9ybWF0XG5cbnR5cGUgcGl4ZWxGb3JtYXRcblxudHlwZSBwaXhlbFR5cGVcblxudHlwZSAnYSB0ZXhQYXJhbVxuXG50eXBlIGRhdGFUeXBlXG5cbnR5cGUgc2hhZGVyVHlwZVxuXG50eXBlICdhIHByb2dyYW1QYXJhbVxuXG50eXBlICdhIHNoYWRlclBhcmFtXG5cbnR5cGUgdGV4dHVyZUZpbHRlclxuXG50eXBlIHdyYXBNb2RlXG5cbnR5cGUgdGV4RmlsdGVyXG5cbnR5cGUgdW5pZm9ybVR5cGVcblxudHlwZSBjb2xvcnNwYWNlQ29udmVyc2lvblxuXG50eXBlIHNoYWRlclByZWNpc2lvblR5cGVcblxudHlwZSBvYmplY3RUeXBlXG5cbigqKiA1LjIgV2ViR0xDb250ZXh0QXR0cmlidXRlcyAqKVxuY2xhc3MgdHlwZSBjb250ZXh0QXR0cmlidXRlcyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhbHBoYSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgZGVwdGggOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0ZW5jaWwgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFudGlhbGlhcyA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgcHJlbXVsdGlwbGllZEFscGhhIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBwcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHByZWZlckxvd1Bvd2VyVG9IaWdoUGVyZm9ybWFuY2UgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgOiBib29sIHQgcHJvcFxuICBlbmRcblxubGV0IGRlZmF1bHRDb250ZXh0QXR0cmlidXRlcyA9XG4gIEpzLlVuc2FmZS4oXG4gICAgb2JqXG4gICAgICBbfCBcImFscGhhXCIsIGluamVjdCBfdHJ1ZVxuICAgICAgIDsgXCJkZXB0aFwiLCBpbmplY3QgX3RydWVcbiAgICAgICA7IFwic3RlbmNpbFwiLCBpbmplY3QgX2ZhbHNlXG4gICAgICAgOyBcImFudGlhbGlhc1wiLCBpbmplY3QgX3RydWVcbiAgICAgICA7IFwicHJlbXVsdGlwbGllZEFscGhhXCIsIGluamVjdCBfZmFsc2VcbiAgICAgICA7IFwicHJlc2VydmVEcmF3aW5nQnVmZmVyXCIsIGluamVjdCBfZmFsc2VcbiAgICAgICA7IFwicHJlZmVyTG93UG93ZXJUb0hpZ2hQZXJmb3JtYW5jZVwiLCBpbmplY3QgX2ZhbHNlXG4gICAgICAgOyBcImZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXRcIiwgaW5qZWN0IF9mYWxzZVxuICAgICAgfF0pXG5cbnR5cGUgYnVmZmVyXG5cbnR5cGUgZnJhbWVidWZmZXJcblxudHlwZSBwcm9ncmFtXG5cbnR5cGUgcmVuZGVyYnVmZmVyXG5cbnR5cGUgc2hhZGVyXG5cbnR5cGUgdGV4dHVyZVxuXG50eXBlICdhIHVuaWZvcm1Mb2NhdGlvblxuXG5jbGFzcyB0eXBlIGFjdGl2ZUluZm8gPVxuICBvYmplY3RcbiAgICBtZXRob2Qgc2l6ZSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgc2hhZGVyUHJlY2lzaW9uRm9ybWF0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHJhbmdlTWluIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByYW5nZU1heCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJlY2lzaW9uIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcmVuZGVyaW5nQ29udGV4dCA9XG4gIG9iamVjdFxuXG4gICAgKCoqIDUuMTMuMSBBdHRyaWJ1dGVzICopXG5cbiAgICBtZXRob2QgY2FudmFzIDogRG9tX2h0bWwuY2FudmFzRWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkcmF3aW5nQnVmZmVyV2lkdGggOiBzaXplaSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZHJhd2luZ0J1ZmZlckhlaWdodCA6IHNpemVpIHJlYWRvbmx5X3Byb3BcblxuICAgICgqKiA1LjEzLjIgR2V0dGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGV4dCAqKVxuXG4gICAgbWV0aG9kIGdldENvbnRleHRBdHRyaWJ1dGVzIDogY29udGV4dEF0dHJpYnV0ZXMgdCBtZXRoXG5cbiAgICAoKiogNS4xMy4zIFNldHRpbmcgYW5kIGdldHRpbmcgc3RhdGUgKilcblxuICAgIG1ldGhvZCBhY3RpdmVUZXh0dXJlIDogdGV4dHVyZVVuaXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmxlbmRDb2xvciA6IGNsYW1wZiAtPiBjbGFtcGYgLT4gY2xhbXBmIC0+IGNsYW1wZiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibGVuZEVxdWF0aW9uIDogYmxlbmRNb2RlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsZW5kRXF1YXRpb25TZXBhcmF0ZSA6IGJsZW5kTW9kZSAtPiBibGVuZE1vZGUgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmxlbmRGdW5jIDogYmxlbmRpbmdGYWN0b3IgLT4gYmxlbmRpbmdGYWN0b3IgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmxlbmRGdW5jU2VwYXJhdGUgOlxuICAgICAgYmxlbmRpbmdGYWN0b3IgLT4gYmxlbmRpbmdGYWN0b3IgLT4gYmxlbmRpbmdGYWN0b3IgLT4gYmxlbmRpbmdGYWN0b3IgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJDb2xvciA6IGNsYW1wZiAtPiBjbGFtcGYgLT4gY2xhbXBmIC0+IGNsYW1wZiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhckRlcHRoIDogY2xhbXBmIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyU3RlbmNpbCA6IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb2xvck1hc2sgOiBib29sIHQgLT4gYm9vbCB0IC0+IGJvb2wgdCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3VsbEZhY2UgOiBjdWxsRmFjZU1vZGUgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVwdGhGdW5jIDogZGVwdGhGdW5jdGlvbiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZXB0aE1hc2sgOiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVwdGhSYW5nZSA6IGNsYW1wZiAtPiBjbGFtcGYgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGlzYWJsZSA6IGVuYWJsZUNhcCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlbmFibGUgOiBlbmFibGVDYXAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZnJvbnRGYWNlIDogZnJvbnRGYWNlRGlyIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFBhcmFtZXRlciA6ICdhLiAnYSBwYXJhbWV0ZXIgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVycm9yIDogZXJyb3JDb2RlIG1ldGhcblxuICAgIG1ldGhvZCBoaW50IDogaGludFRhcmdldCAtPiBoaW50TW9kZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpc0VuYWJsZWQgOiBlbmFibGVDYXAgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBsaW5lV2lkdGggOiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBwaXhlbFN0b3JlaSA6ICdhLiAnYSBwaXhlbFN0b3JlUGFyYW0gLT4gJ2EgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcG9seWdvbk9mZnNldCA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNhbXBsZUNvdmVyYWdlIDogY2xhbXBmIC0+IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsRnVuYyA6IGRlcHRoRnVuY3Rpb24gLT4gaW50IC0+IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbEZ1bmNTZXBhcmF0ZSA6IGN1bGxGYWNlTW9kZSAtPiBkZXB0aEZ1bmN0aW9uIC0+IGludCAtPiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxNYXNrIDogdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsTWFza1NlcGFyYXRlIDogY3VsbEZhY2VNb2RlIC0+IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbE9wIDogc3RlbmNpbE9wIC0+IHN0ZW5jaWxPcCAtPiBzdGVuY2lsT3AgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbE9wU2VwYXJhdGUgOlxuICAgICAgY3VsbEZhY2VNb2RlIC0+IHN0ZW5jaWxPcCAtPiBzdGVuY2lsT3AgLT4gc3RlbmNpbE9wIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuNCBWaWV3aW5nIGFuZCBjbGlwcGluZyAqKVxuXG4gICAgbWV0aG9kIHNjaXNzb3IgOiBpbnQgLT4gaW50IC0+IHNpemVpIC0+IHNpemVpIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZpZXdwb3J0IDogaW50IC0+IGludCAtPiBzaXplaSAtPiBzaXplaSAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjUgQnVmZmVyIG9iamVjdHMgKilcblxuICAgIG1ldGhvZCBiaW5kQnVmZmVyIDogYnVmZmVyVGFyZ2V0IC0+IGJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJpbmRCdWZmZXJfIDogYnVmZmVyVGFyZ2V0IC0+IGJ1ZmZlciB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBidWZmZXJEYXRhX2NyZWF0ZSA6IGJ1ZmZlclRhcmdldCAtPiBzaXplaXB0ciAtPiBidWZmZXJVc2FnZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBidWZmZXJEYXRhIDpcbiAgICAgIGJ1ZmZlclRhcmdldCAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHQgLT4gYnVmZmVyVXNhZ2UgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYnVmZmVyRGF0YV9yYXcgOlxuICAgICAgYnVmZmVyVGFyZ2V0IC0+IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIHQgLT4gYnVmZmVyVXNhZ2UgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYnVmZmVyU3ViRGF0YSA6XG4gICAgICBidWZmZXJUYXJnZXQgLT4gaW50cHRyIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBidWZmZXJTdWJEYXRhX3JhdyA6XG4gICAgICBidWZmZXJUYXJnZXQgLT4gaW50cHRyIC0+IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlQnVmZmVyIDogYnVmZmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUJ1ZmZlciA6IGJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEJ1ZmZlclBhcmFtZXRlciA6ICdhLiBidWZmZXJUYXJnZXQgLT4gJ2EgYnVmZmVyUGFyYW1ldGVyIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBpc0J1ZmZlciA6IGJ1ZmZlciB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICAoKiogNS4xMy42IEZyYW1lYnVmZmVyIG9iamVjdHMgKilcblxuICAgIG1ldGhvZCBiaW5kRnJhbWVidWZmZXIgOiBmYlRhcmdldCAtPiBmcmFtZWJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJpbmRGcmFtZWJ1ZmZlcl8gOiBmYlRhcmdldCAtPiBmcmFtZWJ1ZmZlciB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjaGVja0ZyYW1lYnVmZmVyU3RhdHVzIDogZmJUYXJnZXQgLT4gZnJhbWVidWZmZXJTdGF0dXMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUZyYW1lYnVmZmVyIDogZnJhbWVidWZmZXIgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlRnJhbWVidWZmZXIgOiBmcmFtZWJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyIDpcbiAgICAgIGZiVGFyZ2V0IC0+IGF0dGFjaG1lbnRQb2ludCAtPiByYlRhcmdldCAtPiByZW5kZXJidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmcmFtZWJ1ZmZlclRleHR1cmUyRCA6XG4gICAgICBmYlRhcmdldCAtPiBhdHRhY2htZW50UG9pbnQgLT4gdGV4VGFyZ2V0IC0+IHRleHR1cmUgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyIDpcbiAgICAgICdhLiBmYlRhcmdldCAtPiBhdHRhY2htZW50UG9pbnQgLT4gJ2EgYXR0YWNoUGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGlzRnJhbWVidWZmZXIgOiBmcmFtZWJ1ZmZlciB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICAoKiogNS4xMy43IFJlbmRlcmJ1ZmZlciBvYmplY3RzICopXG5cbiAgICBtZXRob2QgYmluZFJlbmRlcmJ1ZmZlciA6IHJiVGFyZ2V0IC0+IHJlbmRlcmJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJpbmRSZW5kZXJidWZmZXJfIDogcmJUYXJnZXQgLT4gcmVuZGVyYnVmZmVyIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVJlbmRlcmJ1ZmZlciA6IHJlbmRlcmJ1ZmZlciB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVSZW5kZXJidWZmZXIgOiByZW5kZXJidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXIgOiAnYS4gcmJUYXJnZXQgLT4gJ2EgcmVuZGVyYnVmZmVyUGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGlzUmVuZGVyYnVmZmVyIDogcmVuZGVyYnVmZmVyIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCByZW5kZXJidWZmZXJTdG9yYWdlIDogcmJUYXJnZXQgLT4gZm9ybWF0IC0+IHNpemVpIC0+IHNpemVpIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuOCBUZXh0dXJlIG9iamVjdHMgKilcblxuICAgIG1ldGhvZCBiaW5kVGV4dHVyZSA6IHRleFRhcmdldCAtPiB0ZXh0dXJlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmluZFRleHR1cmVfIDogdGV4VGFyZ2V0IC0+IHRleHR1cmUgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29tcHJlc3NlZFRleEltYWdlMkQgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IGludFxuICAgICAgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29weVRleEltYWdlMkQgOlxuICAgICAgdGV4VGFyZ2V0IC0+IGludCAtPiBwaXhlbEZvcm1hdCAtPiBpbnQgLT4gaW50IC0+IHNpemVpIC0+IHNpemVpIC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb3B5VGV4U3ViSW1hZ2UyRCA6XG4gICAgICB0ZXhUYXJnZXQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBzaXplaSAtPiBzaXplaSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVUZXh0dXJlIDogdGV4dHVyZSB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVUZXh0dXJlIDogdGV4dHVyZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdlbmVyYXRlTWlwbWFwIDogdGV4VGFyZ2V0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFRleFBhcmFtZXRlciA6IHRleFRhcmdldCAtPiAnYSB0ZXhQYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgaXNUZXh0dXJlIDogdGV4dHVyZSB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9uZXcgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gdm9pZCBvcHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfZnJvbVZpZXcgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX2Zyb21JbWFnZURhdGEgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5pbWFnZURhdGEgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9mcm9tSW1hZ2UgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5pbWFnZUVsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9mcm9tQ2FudmFzIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuY2FudmFzRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX2Zyb21WaWRlbyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLnZpZGVvRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgICgqIHtbXG4gICAgICAgIG1ldGhvZCB0ZXhQYXJhbWV0ZXJmIDogdGV4VGFyZ2V0IC0+IHRleFBhcmFtIC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuICAgICAgIF19XG4gICAgKilcbiAgICBtZXRob2QgdGV4UGFyYW1ldGVyaSA6IHRleFRhcmdldCAtPiAnYSB0ZXhQYXJhbSAtPiAnYSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhTdWJJbWFnZTJEX2Zyb21WaWV3IDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleFN1YkltYWdlMkRfZnJvbUltYWdlRGF0YSA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmltYWdlRGF0YSB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhTdWJJbWFnZTJEX2Zyb21JbWFnZSA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmltYWdlRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhTdWJJbWFnZTJEX2Zyb21DYW52YXMgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5jYW52YXNFbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleFN1YkltYWdlMkRfZnJvbVZpZGVvIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwudmlkZW9FbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuOSBQcm9ncmFtcyBhbmQgU2hhZGVycyAqKVxuXG4gICAgbWV0aG9kIGF0dGFjaFNoYWRlciA6IHByb2dyYW0gdCAtPiBzaGFkZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiaW5kQXR0cmliTG9jYXRpb24gOiBwcm9ncmFtIHQgLT4gdWludCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb21waWxlU2hhZGVyIDogc2hhZGVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUHJvZ3JhbSA6IHByb2dyYW0gdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU2hhZGVyIDogc2hhZGVyVHlwZSAtPiBzaGFkZXIgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlUHJvZ3JhbSA6IHByb2dyYW0gdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVTaGFkZXIgOiBzaGFkZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZXRhY2hTaGFkZXIgOiBwcm9ncmFtIHQgLT4gc2hhZGVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QXR0YWNoZWRTaGFkZXJzIDogcHJvZ3JhbSB0IC0+IHNoYWRlciB0IGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFByb2dyYW1QYXJhbWV0ZXIgOiAnYS4gcHJvZ3JhbSB0IC0+ICdhIHByb2dyYW1QYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UHJvZ3JhbUluZm9Mb2cgOiBwcm9ncmFtIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNoYWRlclBhcmFtZXRlciA6ICdhLiBzaGFkZXIgdCAtPiAnYSBzaGFkZXJQYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0IDpcbiAgICAgIHNoYWRlclR5cGUgLT4gc2hhZGVyUHJlY2lzaW9uVHlwZSAtPiBzaGFkZXJQcmVjaXNpb25Gb3JtYXQgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2hhZGVySW5mb0xvZyA6IHNoYWRlciB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTaGFkZXJTb3VyY2UgOiBzaGFkZXIgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgaXNQcm9ncmFtIDogcHJvZ3JhbSB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgaXNTaGFkZXIgOiBzaGFkZXIgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGxpbmtQcm9ncmFtIDogcHJvZ3JhbSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNoYWRlclNvdXJjZSA6IHNoYWRlciB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVzZVByb2dyYW0gOiBwcm9ncmFtIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmFsaWRhdGVQcm9ncmFtIDogcHJvZ3JhbSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMTAgVW5pZm9ybXMgYW5kIGF0dHJpYnV0ZXMgKilcblxuICAgIG1ldGhvZCBkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgOiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVuYWJsZVZlcnRleEF0dHJpYkFycmF5IDogdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBY3RpdmVBdHRyaWIgOiBwcm9ncmFtIHQgLT4gdWludCAtPiBhY3RpdmVJbmZvIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEFjdGl2ZVVuaWZvcm0gOiBwcm9ncmFtIHQgLT4gdWludCAtPiBhY3RpdmVJbmZvIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEF0dHJpYkxvY2F0aW9uIDogcHJvZ3JhbSB0IC0+IGpzX3N0cmluZyB0IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VW5pZm9ybSA6ICdhICdiLiBwcm9ncmFtIHQgLT4gJ2EgdW5pZm9ybUxvY2F0aW9uIHQgLT4gJ2IgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVuaWZvcm1Mb2NhdGlvbiA6ICdhLiBwcm9ncmFtIHQgLT4ganNfc3RyaW5nIHQgLT4gJ2EgdW5pZm9ybUxvY2F0aW9uIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFZlcnRleEF0dHJpYiA6ICdhLiB1aW50IC0+ICdhIHZlcnRleEF0dHJpYlBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQgOiB1aW50IC0+IHZlcnRleEF0dHJpYlBvaW50ZXJQYXJhbSAtPiBzaXplaXB0ciBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFmIDogZmxvYXQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFmdl90eXBlZCA6XG4gICAgICBmbG9hdCB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWZ2IDogZmxvYXQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWkgOiBpbnQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xaXZfdHlwZWQgOlxuICAgICAgaW50IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWl2IDogaW50IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yZiA6IFsgYHZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMmZ2X3R5cGVkIDpcbiAgICAgIFsgYHZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMmZ2IDogWyBgdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJpIDogWyBgaXZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yaXYgOiBbIGBpdmVjMiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yaXZfdHlwZWQgOlxuICAgICAgWyBgaXZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNmIDogWyBgdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zZnZfdHlwZWQgOlxuICAgICAgWyBgdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zZnYgOiBbIGB2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2kgOiBbIGBpdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zaXYgOiBbIGBpdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zaXZfdHlwZWQgOlxuICAgICAgWyBgaXZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRmIDpcbiAgICAgIFsgYHZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGZ2X3R5cGVkIDpcbiAgICAgIFsgYHZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGZ2IDogWyBgdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRpIDpcbiAgICAgIFsgYGl2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00aXYgOiBbIGBpdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00aXZfdHlwZWQgOlxuICAgICAgWyBgaXZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDJmdiA6XG4gICAgICBbIGBtYXQyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDJmdl90eXBlZCA6XG4gICAgICBbIGBtYXQyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXgzZnYgOlxuICAgICAgWyBgbWF0MyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXgzZnZfdHlwZWQgOlxuICAgICAgWyBgbWF0MyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4NGZ2IDpcbiAgICAgIFsgYG1hdDQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4NGZ2X3R5cGVkIDpcbiAgICAgIFsgYG1hdDQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMWYgOiB1aW50IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjFmdiA6IHVpbnQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIxZnZfdHlwZWQgOiB1aW50IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjJmIDogdWludCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIyZnYgOiB1aW50IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMmZ2X3R5cGVkIDogdWludCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIzZiA6IHVpbnQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliM2Z2IDogdWludCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjNmdl90eXBlZCA6IHVpbnQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliNGYgOiB1aW50IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjRmdiA6IHVpbnQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWI0ZnZfdHlwZWQgOiB1aW50IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYlBvaW50ZXIgOlxuICAgICAgdWludCAtPiBpbnQgLT4gZGF0YVR5cGUgLT4gYm9vbCB0IC0+IHNpemVpIC0+IGludHB0ciAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjExIFdyaXRpbmcgdG8gdGhlIGRyYXdpbmcgYnVmZmVyICopXG5cbiAgICBtZXRob2QgY2xlYXIgOiBjbGVhckJ1ZmZlck1hc2sgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0FycmF5cyA6IGJlZ2luTW9kZSAtPiBpbnQgLT4gc2l6ZWkgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0VsZW1lbnRzIDogYmVnaW5Nb2RlIC0+IHNpemVpIC0+IGRhdGFUeXBlIC0+IGludHB0ciAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmaW5pc2ggOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmbHVzaCA6IHVuaXQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMTIgUmVhZGluZyBiYWNrIHBpeGVscyAqKVxuXG4gICAgbWV0aG9kIHJlYWRQaXhlbHMgOlxuICAgICAgICAgaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjEzIERldGVjdGluZyBjb250ZXh0IGxvc3QgZXZlbnRzICopXG5cbiAgICBtZXRob2QgaXNDb250ZXh0TG9zdCA6IGJvb2wgdCBtZXRoXG5cbiAgICAoKiogNS4xMy4xNCBEZXRlY3RpbmcgYW5kIGVuYWJsaW5nIGV4dGVuc2lvbnMgKilcblxuICAgIG1ldGhvZCBnZXRTdXBwb3J0ZWRFeHRlbnNpb25zIDoganNfc3RyaW5nIHQganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RXh0ZW5zaW9uIDogJ2EuIGpzX3N0cmluZyB0IC0+ICdhIHQgb3B0IG1ldGhcblxuICAgICgqIFVudHlwZWQhICopXG4gICAgKCoqIENvbnN0YW50cyAqKVxuXG4gICAgbWV0aG9kIF9ERVBUSF9CVUZGRVJfQklUXyA6IGNsZWFyQnVmZmVyTWFzayByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQlVGRkVSX0JJVF8gOiBjbGVhckJ1ZmZlck1hc2sgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT0xPUl9CVUZGRVJfQklUXyA6IGNsZWFyQnVmZmVyTWFzayByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPSU5UUyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVTIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORV9MT09QXyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVfU1RSSVBfIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVFJJQU5HTEVTIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVFJJQU5HTEVfU1RSSVBfIDogYmVnaW5Nb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVFJJQU5HTEVfRkFOXyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1pFUk8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORSA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1JDX0NPTE9SXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX1NSQ19DT0xPUl8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NSQ19BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19TUkNfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9EU1RfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfRFNUX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRFNUX0NPTE9SXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX0RTVF9DT0xPUl8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NSQ19BTFBIQV9TQVRVUkFURV8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZVTkNfQUREXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZVTkNfU1VCVFJBQ1RfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlVOQ19SRVZFUlNFX1NVQlRSQUNUXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTlNUQU5UX0NPTE9SXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUl8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT05TVEFOVF9BTFBIQV8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEFfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQVJSQVlfQlVGRkVSXyA6IGJ1ZmZlclRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0VMRU1FTlRfQVJSQVlfQlVGRkVSXyA6IGJ1ZmZlclRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NUUkVBTV9EUkFXXyA6IGJ1ZmZlclVzYWdlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RBVElDX0RSQVdfIDogYnVmZmVyVXNhZ2UgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9EWU5BTUlDX0RSQVdfIDogYnVmZmVyVXNhZ2UgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUk9OVCA6IGN1bGxGYWNlTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JBQ0sgOiBjdWxsRmFjZU1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUk9OVF9BTkRfQkFDS18gOiBjdWxsRmFjZU1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVUxMX0ZBQ0VfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkQgOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ESVRIRVIgOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1RFU1RfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfVEVTVF8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQ0lTU09SX1RFU1RfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9MWUdPTl9PRkZTRVRfRklMTF8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0VfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFX0NPVkVSQUdFXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05PX0VSUk9SXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVkFMSURfRU5VTV8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlZBTElEX1ZBTFVFXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVkFMSURfT1BFUkFUSU9OXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09VVF9PRl9NRU1PUllfIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09OVEVYVF9MT1NUX1dFQkdMXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NXIDogZnJvbnRGYWNlRGlyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ0NXIDogZnJvbnRGYWNlRGlyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRE9OVF9DQVJFXyA6IGhpbnRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkFTVEVTVCA6IGhpbnRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTklDRVNUIDogaGludE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9HRU5FUkFURV9NSVBNQVBfSElOVF8gOiBoaW50VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfRVFVQVRJT05fIDogYmxlbmRNb2RlIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0VRVUFUSU9OX1JHQl8gOiBibGVuZE1vZGUgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfRVFVQVRJT05fQUxQSEFfIDogYmxlbmRNb2RlIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0RTVF9SR0JfIDogYmxlbmRpbmdGYWN0b3IgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfU1JDX1JHQl8gOiBibGVuZGluZ0ZhY3RvciBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9EU1RfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfU1JDX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0NPTE9SXyA6IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FSUkFZX0JVRkZFUl9CSU5ESU5HXyA6IGJ1ZmZlciB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HXyA6IGJ1ZmZlciB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVUxMX0ZBQ0VfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRElUSEVSX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfVEVTVF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9URVNUX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NDSVNTT1JfVEVTVF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT0xZR09OX09GRlNFVF9GSUxMX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVfV0lEVEhfIDogZmxvYXQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFXyA6IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FMSUFTRURfTElORV9XSURUSF9SQU5HRV8gOiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVUxMX0ZBQ0VfTU9ERV8gOiBjdWxsRmFjZU1vZGUgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJPTlRfRkFDRV8gOiBmcm9udEZhY2VEaXIgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfUkFOR0VfIDogVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfV1JJVEVNQVNLXyA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9DTEVBUl9WQUxVRV8gOiBmbG9hdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9GVU5DXyA6IGRlcHRoRnVuY3Rpb24gcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9DTEVBUl9WQUxVRV8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9GVU5DXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0ZBSUxfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9SRUZfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfVkFMVUVfTUFTS18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9XUklURU1BU0tfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19GVU5DXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfRkFJTF8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTF8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX1JFRl8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0tfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19XUklURU1BU0tfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZJRVdQT1JUIDogVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NDSVNTT1JfQk9YXyA6IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT0xPUl9DTEVBUl9WQUxVRV8gOiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT0xPUl9XUklURU1BU0tfIDogYm9vbCB0IGpzX2FycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0FMSUdOTUVOVF9QQVJBTSA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QQUNLX0FMSUdOTUVOVF8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1RFWFRVUkVfU0laRV8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1ZJRVdQT1JUX0RJTVNfIDogVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NVQlBJWEVMX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFRF9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9HUkVFTl9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTFVFX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FMUEhBX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9MWUdPTl9PRkZTRVRfVU5JVFNfIDogZmxvYXQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9MWUdPTl9PRkZTRVRfRkFDVE9SXyA6IGZsb2F0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQklORElOR18yRF8gOiB0ZXh0dXJlIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQklORElOR19DVUJFX01BUF8gOiB0ZXh0dXJlIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRV9CVUZGRVJTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVfQ09WRVJBR0VfVkFMVUVfIDogZmxvYXQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFX0NPVkVSQUdFX0lOVkVSVF8gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU18gOlxuICAgICAgVHlwZWRfYXJyYXkudWludDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9HRU5FUkFURV9NSVBNQVBfSElOVF9QQVJBTV8gOiBoaW50TW9kZSBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CVUZGRVJfU0laRV8gOiBpbnQgYnVmZmVyUGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQlVGRkVSX1VTQUdFXyA6IGJ1ZmZlclVzYWdlIGJ1ZmZlclBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JZVEUgOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX0JZVEVfRFQgOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NIT1JUIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9TSE9SVF8gOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVCA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfSU5UXyA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVQgOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX0JZVEVfIDogcGl4ZWxUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfU0hPUlRfNF80XzRfNF8gOiBwaXhlbFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9TSE9SVF81XzVfNV8xXyA6IHBpeGVsVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX1NIT1JUXzVfNl81XyA6IHBpeGVsVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FMUEhBIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SR0IgOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JHQkEgOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xVTUlOQU5DRSA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTFVNSU5BTkNFX0FMUEhBXyA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9JTkRFWF8gOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1NURU5DSUxfIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9DT01QT05FTlRfIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFHTUVOVF9TSEFERVJfIDogc2hhZGVyVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9TSEFERVJfIDogc2hhZGVyVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9WRVJURVhfQVRUUklCU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9WQVJZSU5HX1ZFQ1RPUlNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TSEFERVJfVFlQRV8gOiBzaGFkZXJUeXBlIHNoYWRlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVMRVRFX1NUQVRVU18gOiBib29sIHQgc2hhZGVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT01QSUxFX1NUQVRVU18gOiBib29sIHQgc2hhZGVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERUxFVEVfU1RBVFVTX1BST0cgOiBib29sIHQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElOS19TVEFUVVNfIDogYm9vbCB0IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZBTElEQVRFX1NUQVRVU18gOiBib29sIHQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQVRUQUNIRURfU0hBREVSU18gOiBpbnQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUNUSVZFX1VOSUZPUk1TXyA6IGludCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BQ1RJVkVfQVRUUklCVVRFU18gOiBpbnQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OXyA6IGpzX3N0cmluZyB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NVUlJFTlRfUFJPR1JBTV8gOiBwcm9ncmFtIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFTkRPUiA6IGpzX3N0cmluZyB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkVSIDoganNfc3RyaW5nIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSU0lPTiA6IGpzX3N0cmluZyB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FDVElWRV9URVhUVVJFXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9CSU5ESU5HXyA6IGZyYW1lYnVmZmVyIHQgb3B0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9CSU5ESU5HXyA6IHJlbmRlcmJ1ZmZlciB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfUkVOREVSQlVGRkVSX1NJWkUgOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTkVWRVIgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTEVTUyA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9FUVVBTCA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MRVFVQUwgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfR1JFQVRFUiA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OT1RFUVVBTCA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9HRVFVQUwgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUxXQVlTIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0tFRVAgOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRVBMQUNFIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5DUiA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFQ1IgOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlZFUlQgOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTkNSX1dSQVBfIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVDUl9XUkFQXyA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1pFUk9fIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTkVBUkVTVCA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVBUiA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05FQVJFU1RfTUlQTUFQX05FQVJFU1RfIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORUFSX01JUE1BUF9ORUFSRVNUXyA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05FQVJFU1RfTUlQTUFQX0xJTkVBUl8gOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FQVJfTUlQTUFQX0xJTkVBUl8gOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX01BR19GSUxURVJfIDogdGV4RmlsdGVyIHRleFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9NSU5fRklMVEVSXyA6IHRleEZpbHRlciB0ZXhQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfV1JBUF9TXyA6IHdyYXBNb2RlIHRleFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9XUkFQX1RfIDogd3JhcE1vZGUgdGV4UGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OT05FX09UIDogb2JqZWN0VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfT1QgOiBvYmplY3RUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX09UIDogb2JqZWN0VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfMkRfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTEgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTQgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU1IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFNiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTcgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU4IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFOSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTEwIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTEgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxMiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTEzIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTQgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxNSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE2IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTcgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxOCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE5IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjAgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyMSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTIyIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjMgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyNCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI1IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjYgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyNyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI4IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjkgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUzMCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTMxIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRVBFQVQgOiB3cmFwTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NMQU1QX1RPX0VER0VfIDogd3JhcE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NSVJST1JFRF9SRVBFQVRfIDogd3JhcE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX1ZFQzJfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9WRUMzXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfVkVDNF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVF9WRUMyXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5UX1ZFQzNfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlRfVkVDNF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JPT0xfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CT09MX1ZFQzJfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CT09MX1ZFQzNfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CT09MX1ZFQzRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9NQVQyXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfTUFUM18gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX01BVDRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVSXzJEXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFUl9DVUJFXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEXyA6IGJvb2wgdCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRV8gOiBpbnQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERV8gOiBpbnQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEVfIDogaW50IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEXyA6IGJvb2wgdCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUl8gOiB2ZXJ0ZXhBdHRyaWJQb2ludGVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HXyA6XG4gICAgICBidWZmZXIgdCBvcHQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUJfIDpcbiAgICAgIFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTE9XX0ZMT0FUXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NRURJVU1fRkxPQVRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0hJR0hfRkxPQVRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xPV19JTlRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01FRElVTV9JTlRfIDogc2hhZGVyUHJlY2lzaW9uVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0hJR0hfSU5UXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUiA6IGZiVGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSIDogcmJUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SR0JBNCA6IGZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JHQjVfQTFfIDogZm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkdCNTY1IDogZm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfQ09NUE9ORU5UMTZfIDogZm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9JTkRFWDhfIDogZm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX1dJRFRIXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9IRUlHSFRfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF8gOiBmb3JtYXQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0JMVUVfU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfIDogb2JqZWN0VHlwZSBhdHRhY2hQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfUkVOREVSQlVGRkVSIDpcbiAgICAgIHJlbmRlcmJ1ZmZlciB0IGF0dGFjaFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9URVhUVVJFIDpcbiAgICAgIHRleHR1cmUgdCBhdHRhY2hQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF8gOiBpbnQgYXR0YWNoUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV8gOiBpbnQgYXR0YWNoUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT0xPUl9BVFRBQ0hNRU5UMF8gOiBhdHRhY2htZW50UG9pbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9BVFRBQ0hNRU5UXyA6IGF0dGFjaG1lbnRQb2ludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQVRUQUNITUVOVF8gOiBhdHRhY2htZW50UG9pbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlRfIDogYXR0YWNobWVudFBvaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQ09NUExFVEVfIDogZnJhbWVidWZmZXJTdGF0dXMgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfIDogZnJhbWVidWZmZXJTdGF0dXMgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF8gOiBmcmFtZWJ1ZmZlclN0YXR1cyByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU18gOiBmcmFtZWJ1ZmZlclN0YXR1cyByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEXyA6IGZyYW1lYnVmZmVyU3RhdHVzIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0ZMSVBfWV9XRUJHTF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0xfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTF9QQVJBTSA6XG4gICAgICBjb2xvcnNwYWNlQ29udmVyc2lvbiBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OT05FIDogY29sb3JzcGFjZUNvbnZlcnNpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CUk9XU0VSX0RFRkFVTFRfV0VCR0xfIDogY29sb3JzcGFjZUNvbnZlcnNpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfQUxJR05NRU5UXyA6IGludCBwaXhlbFN0b3JlUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfRkxJUF9ZX1dFQkdMXyA6IGJvb2wgdCBwaXhlbFN0b3JlUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0xfIDogYm9vbCB0IHBpeGVsU3RvcmVQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0xfIDogaW50IHBpeGVsU3RvcmVQYXJhbSByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiogNS4xNCBXZWJHTENvbnRleHRFdmVudCAqKVxuXG5jbGFzcyB0eXBlIGNvbnRleHRFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRcblxuICAgIG1ldGhvZCBzdGF0dXNNZXNzYWdlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubW9kdWxlIEV2ZW50ID0gc3RydWN0XG4gIGxldCB3ZWJnbGNvbnRleHRsb3N0ID0gRG9tX2h0bWwuRXZlbnQubWFrZSBcIndlYmdsY29udGV4dGxvc3RcIlxuXG4gIGxldCB3ZWJnbGNvbnRleHRyZXN0b3JlZCA9IERvbV9odG1sLkV2ZW50Lm1ha2UgXCJ3ZWJnbGNvbnRleHRyZXN0b3JlZFwiXG5cbiAgbGV0IHdlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IgPSBEb21faHRtbC5FdmVudC5tYWtlIFwid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvclwiXG5lbmRcblxuKCoqKiopXG5cbmNsYXNzIHR5cGUgY2FudmFzRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBnZXRDb250ZXh0IDoganNfc3RyaW5nIHQgLT4gcmVuZGVyaW5nQ29udGV4dCB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q29udGV4dF8gOiBqc19zdHJpbmcgdCAtPiBjb250ZXh0QXR0cmlidXRlcyB0IC0+IHJlbmRlcmluZ0NvbnRleHQgdCBvcHQgbWV0aFxuICBlbmRcblxubGV0IGdldENvbnRleHQgKGMgOiBEb21faHRtbC5jYW52YXNFbGVtZW50IHQpID1cbiAgbGV0IGMgOiBjYW52YXNFbGVtZW50IHQgPSBKcy5VbnNhZmUuY29lcmNlIGMgaW5cbiAgbGV0IGN0eCA9IGMjI2dldENvbnRleHQgKEpzLnN0cmluZyBcIndlYmdsXCIpIGluXG4gIGlmIE9wdC50ZXN0IGN0eCB0aGVuIGN0eCBlbHNlIGMgIyMgKGdldENvbnRleHQgKEpzLnN0cmluZyBcImV4cGVyaW1lbnRhbC13ZWJnbFwiKSlcblxubGV0IGdldENvbnRleHRXaXRoQXR0cmlidXRlcyAoYyA6IERvbV9odG1sLmNhbnZhc0VsZW1lbnQgdCkgYXR0cmlicyA9XG4gIGxldCBjIDogY2FudmFzRWxlbWVudCB0ID0gSnMuVW5zYWZlLmNvZXJjZSBjIGluXG4gIGxldCBjdHggPSBjIyNnZXRDb250ZXh0XyAoSnMuc3RyaW5nIFwid2ViZ2xcIikgYXR0cmlicyBpblxuICBpZiBPcHQudGVzdCBjdHggdGhlbiBjdHggZWxzZSBjIyNnZXRDb250ZXh0XyAoSnMuc3RyaW5nIFwiZXhwZXJpbWVudGFsLXdlYmdsXCIpIGF0dHJpYnNcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmFwaGHDq2wgUHJvdXN0LCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxudHlwZSByZWdleHAgPSBKcy5yZWdFeHAgSnMudFxuXG50eXBlIHJlc3VsdCA9IEpzLm1hdGNoX3Jlc3VsdCBKcy50XG5cbmxldCByZWdleHAgcyA9IG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIChKcy5ieXRlc3RyaW5nIHMpIChKcy5zdHJpbmcgXCJnXCIpXG5cbmxldCByZWdleHBfY2FzZV9mb2xkIHMgPSBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyAoSnMuYnl0ZXN0cmluZyBzKSAoSnMuc3RyaW5nIFwiZ2lcIilcblxubGV0IHJlZ2V4cF93aXRoX2ZsYWcgcyBmID1cbiAgbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgKEpzLmJ5dGVzdHJpbmcgcykgKEpzLnN0cmluZyAoXCJnXCIgXiBmKSlcblxubGV0IGJsdW50X3N0cl9hcnJheV9nZXQgYSBpID1cbiAgSnMudG9fYnl0ZXN0cmluZyAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IGEgaSkgKGZ1biAoKSAtPiBhc3NlcnQgZmFsc2UpKVxuXG5sZXQgc3RyaW5nX21hdGNoIHIgcyBpID1cbiAgciMjLmxhc3RJbmRleCA6PSBpO1xuICBKcy5PcHQudG9fb3B0aW9uIChKcy5PcHQubWFwIChyIyNleGVjIChKcy5ieXRlc3RyaW5nIHMpKSBKcy5tYXRjaF9yZXN1bHQpXG5cbmxldCBzZWFyY2ggciBzIGkgPVxuICByIyMubGFzdEluZGV4IDo9IGk7XG4gIEpzLk9wdC50b19vcHRpb25cbiAgICAoSnMuT3B0Lm1hcFxuICAgICAgIChyIyNleGVjIChKcy5ieXRlc3RyaW5nIHMpKVxuICAgICAgIChmdW4gcmVzX3ByZSAtPlxuICAgICAgICAgbGV0IHJlcyA9IEpzLm1hdGNoX3Jlc3VsdCByZXNfcHJlIGluXG4gICAgICAgICByZXMjIy5pbmRleCwgcmVzKSlcblxubGV0IHNlYXJjaF9mb3J3YXJkID0gc2VhcmNoXG5cbmxldCBtYXRjaGVkX3N0cmluZyByID0gYmx1bnRfc3RyX2FycmF5X2dldCByIDBcblxubGV0IG1hdGNoZWRfZ3JvdXAgciBpID1cbiAgSnMuT3B0ZGVmLnRvX29wdGlvbiAoSnMuT3B0ZGVmLm1hcCAoSnMuYXJyYXlfZ2V0IHIgaSkgSnMudG9fYnl0ZXN0cmluZylcblxubGV0IHF1b3RlX3JlcGxfcmUgPSBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyAoSnMuc3RyaW5nIFwiWyRdXCIpIChKcy5zdHJpbmcgXCJnXCIpXG5cbmxldCBxdW90ZV9yZXBsIHMgPSAoSnMuYnl0ZXN0cmluZyBzKSMjcmVwbGFjZSBxdW90ZV9yZXBsX3JlIChKcy5zdHJpbmcgXCIkJCQkXCIpXG5cbmxldCBnbG9iYWxfcmVwbGFjZSByIHMgc19ieSA9XG4gIHIjIy5sYXN0SW5kZXggOj0gMDtcbiAgSnMudG9fYnl0ZXN0cmluZyAoSnMuYnl0ZXN0cmluZyBzKSAjIyAocmVwbGFjZSByIChxdW90ZV9yZXBsIHNfYnkpKVxuXG5sZXQgcmVwbGFjZV9maXJzdCByIHMgc19ieSA9XG4gIGxldCBmbGFncyA9XG4gICAgbWF0Y2ggSnMudG9fYm9vbCByIyMuaWdub3JlQ2FzZSwgSnMudG9fYm9vbCByIyMubXVsdGlsaW5lIHdpdGhcbiAgICB8IGZhbHNlLCBmYWxzZSAtPiBKcy5zdHJpbmcgXCJcIlxuICAgIHwgZmFsc2UsIHRydWUgLT4gSnMuc3RyaW5nIFwibVwiXG4gICAgfCB0cnVlLCBmYWxzZSAtPiBKcy5zdHJpbmcgXCJpXCJcbiAgICB8IHRydWUsIHRydWUgLT4gSnMuc3RyaW5nIFwibWlcIlxuICBpblxuICBsZXQgcicgPSBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyByIyMuc291cmNlIGZsYWdzIGluXG4gIEpzLnRvX2J5dGVzdHJpbmcgKEpzLmJ5dGVzdHJpbmcgcykgIyMgKHJlcGxhY2UgcicgKHF1b3RlX3JlcGwgc19ieSkpXG5cbmxldCBsaXN0X29mX2pzX2FycmF5IGEgPVxuICBsZXQgcmVjIGF1eCBhY2N1IGlkeCA9XG4gICAgaWYgaWR4IDwgMCB0aGVuIGFjY3UgZWxzZSBhdXggKGJsdW50X3N0cl9hcnJheV9nZXQgYSBpZHggOjogYWNjdSkgKGlkeCAtIDEpXG4gIGluXG4gIGF1eCBbXSAoYSMjLmxlbmd0aCAtIDEpXG5cbmxldCBzcGxpdCByIHMgPVxuICByIyMubGFzdEluZGV4IDo9IDA7XG4gIGxpc3Rfb2ZfanNfYXJyYXkgKEpzLnN0cl9hcnJheSAoSnMuYnl0ZXN0cmluZyBzKSAjIyAoc3BsaXRfcmVnRXhwIHIpKVxuXG5sZXQgYm91bmRlZF9zcGxpdCByIHMgaSA9XG4gIHIjIy5sYXN0SW5kZXggOj0gMDtcbiAgbGlzdF9vZl9qc19hcnJheSAoSnMuc3RyX2FycmF5IChKcy5ieXRlc3RyaW5nIHMpICMjIChzcGxpdF9yZWdFeHBMaW1pdGVkIHIgaSkpXG5cbigqIE1vcmUgY29uc3RydWN0b3JzICopXG5cbmxldCBxdW90ZV9yZSA9IHJlZ2V4cCBcIltcXFxcXVsoKVxcXFxcXFxcfCsqLj97fV4kXVwiXG5cbmxldCBxdW90ZSBzID0gSnMudG9fYnl0ZXN0cmluZyAoSnMuYnl0ZXN0cmluZyBzKSAjIyAocmVwbGFjZSBxdW90ZV9yZSAoSnMuc3RyaW5nIFwiXFxcXCQmXCIpKVxuXG5sZXQgcmVnZXhwX3N0cmluZyBzID0gcmVnZXhwIChxdW90ZSBzKVxuXG5sZXQgcmVnZXhwX3N0cmluZ19jYXNlX2ZvbGQgcyA9IHJlZ2V4cF9jYXNlX2ZvbGQgKHF1b3RlIHMpXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIFJhcGhhw6tsIFByb3VzdFxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuKCogVXJsIHRhbXBlcmluZy4gKilcblxubGV0IHNwbGl0IGMgcyA9IEpzLnN0cl9hcnJheSAocyMjc3BsaXQgKEpzLnN0cmluZyAoU3RyaW5nLm1ha2UgMSBjKSkpXG5cbmxldCBzcGxpdF8yIGMgcyA9XG4gIGxldCBpbmRleCA9IHMjI2luZGV4T2YgKEpzLnN0cmluZyAoU3RyaW5nLm1ha2UgMSBjKSkgaW5cbiAgaWYgaW5kZXggPCAwIHRoZW4gSnMudW5kZWZpbmVkIGVsc2UgSnMuZGVmIChzIyNzbGljZSAwIGluZGV4LCBzIyNzbGljZV9lbmQgKGluZGV4ICsgMSkpXG5cbmV4Y2VwdGlvbiBMb2NhbF9leG5cblxubGV0IGludGVycnVwdCAoKSA9IHJhaXNlIExvY2FsX2V4blxuXG4oKiB1cmwgKEFLQSBwZXJjZW50KSBlbmNvZGluZy9kZWNvZGluZyAqKVxuXG5sZXQgcGx1c19yZSA9IFJlZ2V4cC5yZWdleHBfc3RyaW5nIFwiK1wiXG5cbmxldCBlc2NhcGVfcGx1cyBzID0gUmVnZXhwLmdsb2JhbF9yZXBsYWNlIHBsdXNfcmUgcyBcIiUyQlwiXG5cbmxldCB1bmVzY2FwZV9wbHVzIHMgPSBSZWdleHAuZ2xvYmFsX3JlcGxhY2UgcGx1c19yZSBzIFwiIFwiXG5cbmxldCBwbHVzX3JlX2pzX3N0cmluZyA9IG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIChKcy5zdHJpbmcgXCJcXFxcK1wiKSAoSnMuc3RyaW5nIFwiZ1wiKVxuXG5sZXQgdW5lc2NhcGVfcGx1c19qc19zdHJpbmcgcyA9XG4gIHBsdXNfcmVfanNfc3RyaW5nIyMubGFzdEluZGV4IDo9IDA7XG4gIHMjI3JlcGxhY2UgcGx1c19yZV9qc19zdHJpbmcgKEpzLnN0cmluZyBcIiBcIilcblxubGV0IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIHMgPVxuICBKcy50b19ieXRlc3RyaW5nIChKcy51bmVzY2FwZSAodW5lc2NhcGVfcGx1c19qc19zdHJpbmcgcykpXG5cbmxldCB1cmxkZWNvZGUgcyA9IEpzLnRvX2J5dGVzdHJpbmcgKEpzLnVuZXNjYXBlIChKcy5ieXRlc3RyaW5nICh1bmVzY2FwZV9wbHVzIHMpKSlcblxuKCpsZXQgdXJsZW5jb2RlX2pzX3N0cmluZ19zdHJpbmcgcyA9XG4gIEpzLnRvX2J5dGVzdHJpbmcgKEpzLmVzY2FwZSBzKSopXG5cbmxldCB1cmxlbmNvZGUgPyh3aXRoX3BsdXMgPSB0cnVlKSBzID1cbiAgaWYgd2l0aF9wbHVzXG4gIHRoZW4gZXNjYXBlX3BsdXMgKEpzLnRvX2J5dGVzdHJpbmcgKEpzLmVzY2FwZSAoSnMuYnl0ZXN0cmluZyBzKSkpXG4gIGVsc2UgSnMudG9fYnl0ZXN0cmluZyAoSnMuZXNjYXBlIChKcy5ieXRlc3RyaW5nIHMpKVxuXG50eXBlIGh0dHBfdXJsID1cbiAgeyBodV9ob3N0IDogc3RyaW5nICAoKiogVGhlIGhvc3QgcGFydCBvZiB0aGUgdXJsLiAqKVxuICA7IGh1X3BvcnQgOiBpbnQgICgqKiBUaGUgcG9ydCBmb3IgdGhlIGNvbm5lY3Rpb24gaWYgYW55LiAqKVxuICA7IGh1X3BhdGggOiBzdHJpbmcgbGlzdCAgKCoqIFRoZSBwYXRoIHNwbGl0IG9uIFsnLyddIGNoYXJhY3RlcnMuICopXG4gIDsgaHVfcGF0aF9zdHJpbmcgOiBzdHJpbmcgICgqKiBUaGUgb3JpZ2luYWwgZW50aXJlIHBhdGguICopXG4gIDsgaHVfYXJndW1lbnRzIDogKHN0cmluZyAqIHN0cmluZykgbGlzdFxuICAgICAgICAoKiogQXJndW1lbnRzIGFzIGEgZmllbGQtdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0aW9uIGxpc3QuKilcbiAgOyBodV9mcmFnbWVudCA6IHN0cmluZyAgKCoqIFRoZSBmcmFnbWVudCBwYXJ0IChhZnRlciB0aGUgWycjJ10gY2hhcmFjdGVyKS4gKilcbiAgfVxuKCoqIFRoZSB0eXBlIGZvciBIVFRQIHVybC4gKilcblxudHlwZSBmaWxlX3VybCA9XG4gIHsgZnVfcGF0aCA6IHN0cmluZyBsaXN0XG4gIDsgZnVfcGF0aF9zdHJpbmcgOiBzdHJpbmdcbiAgOyBmdV9hcmd1bWVudHMgOiAoc3RyaW5nICogc3RyaW5nKSBsaXN0XG4gIDsgZnVfZnJhZ21lbnQgOiBzdHJpbmdcbiAgfVxuKCoqIFRoZSB0eXBlIGZvciBsb2NhbCBmaWxlIHVybHMuICopXG5cbnR5cGUgdXJsID1cbiAgfCBIdHRwIG9mIGh0dHBfdXJsXG4gIHwgSHR0cHMgb2YgaHR0cF91cmxcbiAgfCBGaWxlIG9mIGZpbGVfdXJsXG4gICAgICAoKiogVGhlIHR5cGUgZm9yIHVybHMuIFtGaWxlXSBpcyBmb3IgbG9jYWwgZmlsZXMgYW5kIFtFeG90aWMgc10gaXMgZm9yXG4gICAgdW5rbm93bi91bnN1cHBvcnRlZCBwcm90b2NvbHMuICopXG5cbmV4Y2VwdGlvbiBOb3RfYW5faHR0cF9wcm90b2NvbFxuXG5sZXQgaXNfc2VjdXJlIHByb3Rfc3RyaW5nID1cbiAgbWF0Y2ggSnMudG9fYnl0ZXN0cmluZyBwcm90X3N0cmluZyMjdG9Mb3dlckNhc2Ugd2l0aFxuICB8IFwiaHR0cHM6XCIgfCBcImh0dHBzXCIgLT4gdHJ1ZVxuICB8IFwiaHR0cDpcIiB8IFwiaHR0cFwiIC0+IGZhbHNlXG4gIHwgXCJmaWxlOlwiIHwgXCJmaWxlXCIgfCBfIC0+IHJhaXNlIE5vdF9hbl9odHRwX3Byb3RvY29sXG5cbigqIHBvcnQgbnVtYmVyICopXG5sZXQgZGVmYXVsdF9odHRwX3BvcnQgPSA4MFxuXG5sZXQgZGVmYXVsdF9odHRwc19wb3J0ID0gNDQzXG5cbigqIHBhdGggKilcbmxldCBwYXRoX29mX3BhdGhfc3RyaW5nIHMgPVxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBsZXQgaiA9IHRyeSBTdHJpbmcuaW5kZXhfZnJvbSBzIGkgJy8nIHdpdGggTm90X2ZvdW5kIC0+IGwgaW5cbiAgICBsZXQgd29yZCA9IFN0cmluZy5zdWIgcyBpIChqIC0gaSkgaW5cbiAgICBpZiBqID49IGwgdGhlbiBbIHdvcmQgXSBlbHNlIHdvcmQgOjogYXV4IChqICsgMSlcbiAgaW5cbiAgbWF0Y2ggYXV4IDAgd2l0aFxuICB8IFsgXCJcIiBdIC0+IFtdXG4gIHwgWyBcIlwiOyBcIlwiIF0gLT4gWyBcIlwiIF1cbiAgfCBhIC0+IGFcblxuKCogQXJndW1lbnRzICopXG5sZXQgZW5jb2RlX2FyZ3VtZW50cyBsID1cbiAgU3RyaW5nLmNvbmNhdCBcIiZcIiAoTGlzdC5tYXAgKGZ1biAobiwgdikgLT4gdXJsZW5jb2RlIG4gXiBcIj1cIiBeIHVybGVuY29kZSB2KSBsKVxuXG5sZXQgZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmcgcyA9XG4gIGxldCBhcnIgPSBzcGxpdCAnJicgcyBpblxuICBsZXQgbGVuID0gYXJyIyMubGVuZ3RoIGluXG4gIGxldCBuYW1lX3ZhbHVlX3NwbGl0IHMgPSBzcGxpdF8yICc9JyBzIGluXG4gIGxldCByZWMgYXV4IGFjYyBpZHggPVxuICAgIGlmIGlkeCA8IDBcbiAgICB0aGVuIGFjY1xuICAgIGVsc2VcbiAgICAgIHRyeVxuICAgICAgICBhdXhcbiAgICAgICAgICAoSnMuT3B0ZGVmLmNhc2UgKEpzLmFycmF5X2dldCBhcnIgaWR4KSBpbnRlcnJ1cHQgKGZ1biBzIC0+XG4gICAgICAgICAgICAgICBKcy5PcHRkZWYuY2FzZSAobmFtZV92YWx1ZV9zcGxpdCBzKSBpbnRlcnJ1cHQgKGZ1biAoeCwgeSkgLT5cbiAgICAgICAgICAgICAgICAgICBsZXQgZ2V0ID0gdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgaW5cbiAgICAgICAgICAgICAgICAgICBnZXQgeCwgZ2V0IHkpKVxuICAgICAgICAgIDo6IGFjYylcbiAgICAgICAgICAocHJlZCBpZHgpXG4gICAgICB3aXRoIExvY2FsX2V4biAtPiBhdXggYWNjIChwcmVkIGlkeClcbiAgaW5cbiAgYXV4IFtdIChsZW4gLSAxKVxuXG5sZXQgZGVjb2RlX2FyZ3VtZW50cyBzID0gZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmcgKEpzLmJ5dGVzdHJpbmcgcylcblxubGV0IHVybF9yZSA9XG4gIG5ldyVqcyBKcy5yZWdFeHBcbiAgICAoSnMuYnl0ZXN0cmluZ1xuICAgICAgIFwiXihbSGhdW1R0XVtUdF1bUHBdW1NzXT8pOi8vKFswLTlhLXpBLVouLV0rfFxcXFxbWzAtOWEtekEtWi4tXStcXFxcXXxcXFxcW1swLTlBLUZhLWY6Ll0rXFxcXF0pPyg6KFswLTldKykpPygvKFteXFxcXD8jXSopKFxcXFw/KFteI10qKSk/KCMoLiopKT8pPyRcIilcblxubGV0IGZpbGVfcmUgPVxuICBuZXclanMgSnMucmVnRXhwXG4gICAgKEpzLmJ5dGVzdHJpbmcgXCJeKFtGZl1bSWldW0xsXVtFZV0pOi8vKFteXFxcXD8jXSopKFxcXFw/KFteI10qKSk/KCMoLiopKT8kXCIpXG5cbmxldCB1cmxfb2ZfanNfc3RyaW5nIHMgPVxuICBKcy5PcHQuY2FzZVxuICAgICh1cmxfcmUjI2V4ZWMgcylcbiAgICAoZnVuICgpIC0+XG4gICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAoZmlsZV9yZSMjZXhlYyBzKVxuICAgICAgICAoZnVuICgpIC0+IE5vbmUpXG4gICAgICAgIChmdW4gaGFuZGxlIC0+XG4gICAgICAgICAgbGV0IHJlcyA9IEpzLm1hdGNoX3Jlc3VsdCBoYW5kbGUgaW5cbiAgICAgICAgICBsZXQgcGF0aF9zdHIgPVxuICAgICAgICAgICAgdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgMikgaW50ZXJydXB0KVxuICAgICAgICAgIGluXG4gICAgICAgICAgU29tZVxuICAgICAgICAgICAgKEZpbGVcbiAgICAgICAgICAgICAgIHsgZnVfcGF0aCA9IHBhdGhfb2ZfcGF0aF9zdHJpbmcgcGF0aF9zdHJcbiAgICAgICAgICAgICAgIDsgZnVfcGF0aF9zdHJpbmcgPSBwYXRoX3N0clxuICAgICAgICAgICAgICAgOyBmdV9hcmd1bWVudHMgPVxuICAgICAgICAgICAgICAgICAgIGRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyA0KSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpXG4gICAgICAgICAgICAgICA7IGZ1X2ZyYWdtZW50ID1cbiAgICAgICAgICAgICAgICAgICBKcy50b19ieXRlc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyA2KSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpXG4gICAgICAgICAgICAgICB9KSkpXG4gICAgKGZ1biBoYW5kbGUgLT5cbiAgICAgIGxldCByZXMgPSBKcy5tYXRjaF9yZXN1bHQgaGFuZGxlIGluXG4gICAgICBsZXQgc3NsID0gaXNfc2VjdXJlIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDEpIGludGVycnVwdCkgaW5cbiAgICAgIGxldCBwb3J0X29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgXCJcIiAtPiBpZiBzc2wgdGhlbiA0NDMgZWxzZSA4MFxuICAgICAgICB8IHMgLT4gaW50X29mX3N0cmluZyBzXG4gICAgICBpblxuICAgICAgbGV0IHBhdGhfc3RyID1cbiAgICAgICAgdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmdcbiAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyA2KSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpXG4gICAgICBpblxuICAgICAgbGV0IHVybCA9XG4gICAgICAgIHsgaHVfaG9zdCA9XG4gICAgICAgICAgICB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyAyKSBpbnRlcnJ1cHQpXG4gICAgICAgIDsgaHVfcG9ydCA9XG4gICAgICAgICAgICBwb3J0X29mX3N0cmluZ1xuICAgICAgICAgICAgICAoSnMudG9fYnl0ZXN0cmluZ1xuICAgICAgICAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyA0KSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpKVxuICAgICAgICA7IGh1X3BhdGggPSBwYXRoX29mX3BhdGhfc3RyaW5nIHBhdGhfc3RyXG4gICAgICAgIDsgaHVfcGF0aF9zdHJpbmcgPSBwYXRoX3N0clxuICAgICAgICA7IGh1X2FyZ3VtZW50cyA9XG4gICAgICAgICAgICBkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZ1xuICAgICAgICAgICAgICAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyA4KSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpXG4gICAgICAgIDsgaHVfZnJhZ21lbnQgPVxuICAgICAgICAgICAgdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmdcbiAgICAgICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgMTApIChmdW4gKCkgLT4gSnMuYnl0ZXN0cmluZyBcIlwiKSlcbiAgICAgICAgfVxuICAgICAgaW5cbiAgICAgIFNvbWUgKGlmIHNzbCB0aGVuIEh0dHBzIHVybCBlbHNlIEh0dHAgdXJsKSlcblxubGV0IHVybF9vZl9zdHJpbmcgcyA9IHVybF9vZl9qc19zdHJpbmcgKEpzLmJ5dGVzdHJpbmcgcylcblxubGV0IHN0cmluZ19vZl91cmwgPSBmdW5jdGlvblxuICB8IEZpbGUgeyBmdV9wYXRoID0gcGF0aDsgZnVfYXJndW1lbnRzID0gYXJnczsgZnVfZnJhZ21lbnQgPSBmcmFnOyBfIH0gLT4gKFxuICAgICAgXCJmaWxlOi8vXCJcbiAgICAgIF4gU3RyaW5nLmNvbmNhdCBcIi9cIiAoTGlzdC5tYXAgKGZ1biB4IC0+IHVybGVuY29kZSB4KSBwYXRoKVxuICAgICAgXiAobWF0Y2ggYXJncyB3aXRoXG4gICAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgICB8IGwgLT4gXCI/XCIgXiBlbmNvZGVfYXJndW1lbnRzIGwpXG4gICAgICBeXG4gICAgICBtYXRjaCBmcmFnIHdpdGhcbiAgICAgIHwgXCJcIiAtPiBcIlwiXG4gICAgICB8IHMgLT4gXCIjXCIgXiB1cmxlbmNvZGUgcylcbiAgfCBIdHRwXG4gICAgICB7IGh1X2hvc3QgPSBob3N0XG4gICAgICA7IGh1X3BvcnQgPSBwb3J0XG4gICAgICA7IGh1X3BhdGggPSBwYXRoXG4gICAgICA7IGh1X2FyZ3VtZW50cyA9IGFyZ3NcbiAgICAgIDsgaHVfZnJhZ21lbnQgPSBmcmFnXG4gICAgICA7IF9cbiAgICAgIH0gLT4gKFxuICAgICAgXCJodHRwOi8vXCJcbiAgICAgIF4gdXJsZW5jb2RlIGhvc3RcbiAgICAgIF4gKG1hdGNoIHBvcnQgd2l0aFxuICAgICAgICB8IDgwIC0+IFwiXCJcbiAgICAgICAgfCBuIC0+IFwiOlwiIF4gc3RyaW5nX29mX2ludCBuKVxuICAgICAgXiBcIi9cIlxuICAgICAgXiBTdHJpbmcuY29uY2F0IFwiL1wiIChMaXN0Lm1hcCAoZnVuIHggLT4gdXJsZW5jb2RlIHgpIHBhdGgpXG4gICAgICBeIChtYXRjaCBhcmdzIHdpdGhcbiAgICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICAgIHwgbCAtPiBcIj9cIiBeIGVuY29kZV9hcmd1bWVudHMgbClcbiAgICAgIF5cbiAgICAgIG1hdGNoIGZyYWcgd2l0aFxuICAgICAgfCBcIlwiIC0+IFwiXCJcbiAgICAgIHwgcyAtPiBcIiNcIiBeIHVybGVuY29kZSBzKVxuICB8IEh0dHBzXG4gICAgICB7IGh1X2hvc3QgPSBob3N0XG4gICAgICA7IGh1X3BvcnQgPSBwb3J0XG4gICAgICA7IGh1X3BhdGggPSBwYXRoXG4gICAgICA7IGh1X2FyZ3VtZW50cyA9IGFyZ3NcbiAgICAgIDsgaHVfZnJhZ21lbnQgPSBmcmFnXG4gICAgICA7IF9cbiAgICAgIH0gLT4gKFxuICAgICAgXCJodHRwczovL1wiXG4gICAgICBeIHVybGVuY29kZSBob3N0XG4gICAgICBeIChtYXRjaCBwb3J0IHdpdGhcbiAgICAgICAgfCA0NDMgLT4gXCJcIlxuICAgICAgICB8IG4gLT4gXCI6XCIgXiBzdHJpbmdfb2ZfaW50IG4pXG4gICAgICBeIFwiL1wiXG4gICAgICBeIFN0cmluZy5jb25jYXQgXCIvXCIgKExpc3QubWFwIChmdW4geCAtPiB1cmxlbmNvZGUgeCkgcGF0aClcbiAgICAgIF4gKG1hdGNoIGFyZ3Mgd2l0aFxuICAgICAgICB8IFtdIC0+IFwiXCJcbiAgICAgICAgfCBsIC0+IFwiP1wiIF4gZW5jb2RlX2FyZ3VtZW50cyBsKVxuICAgICAgXlxuICAgICAgbWF0Y2ggZnJhZyB3aXRoXG4gICAgICB8IFwiXCIgLT4gXCJcIlxuICAgICAgfCBzIC0+IFwiI1wiIF4gdXJsZW5jb2RlIHMpXG5cbm1vZHVsZSBDdXJyZW50ID0gc3RydWN0XG4gIGxldCBsID1cbiAgICBpZiBKcy5PcHRkZWYudGVzdCAoSnMuT3B0ZGVmLnJldHVybiBEb21faHRtbC53aW5kb3cjIy5sb2NhdGlvbilcbiAgICB0aGVuIERvbV9odG1sLndpbmRvdyMjLmxvY2F0aW9uXG4gICAgZWxzZVxuICAgICAgbGV0IGVtcHR5ID0gSnMuc3RyaW5nIFwiXCIgaW5cbiAgICAgIG9iamVjdCVqc1xuICAgICAgICB2YWwgbXV0YWJsZSBocmVmID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBwcm90b2NvbCA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgaG9zdCA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgaG9zdG5hbWUgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIHBvcnQgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIHBhdGhuYW1lID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBzZWFyY2ggPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIGhhc2ggPSBlbXB0eVxuXG4gICAgICAgIHZhbCBvcmlnaW4gPSBKcy51bmRlZmluZWRcblxuICAgICAgICBtZXRob2QgcmVsb2FkID0gKClcblxuICAgICAgICBtZXRob2QgcmVwbGFjZSBfID0gKClcblxuICAgICAgICBtZXRob2QgYXNzaWduIF8gPSAoKVxuICAgICAgZW5kXG5cbiAgbGV0IGhvc3QgPSB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBsIyMuaG9zdG5hbWVcblxuICBsZXQgcHJvdG9jb2wgPSB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBsIyMucHJvdG9jb2xcblxuICBsZXQgcG9ydCA9XG4gICAgKGZ1biAoKSAtPlxuICAgICAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgKEpzLnRvX2J5dGVzdHJpbmcgbCMjLnBvcnQpKSB3aXRoIEZhaWx1cmUgXyAtPiBOb25lKVxuICAgICAgKClcblxuICBsZXQgcGF0aF9zdHJpbmcgPSB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBsIyMucGF0aG5hbWVcblxuICBsZXQgcGF0aCA9IHBhdGhfb2ZfcGF0aF9zdHJpbmcgcGF0aF9zdHJpbmdcblxuICBsZXQgYXJndW1lbnRzID1cbiAgICBkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZ1xuICAgICAgKGlmIGwjIy5zZWFyY2gjI2NoYXJBdCAwID09IEpzLnN0cmluZyBcIj9cIlxuICAgICAgdGhlbiBsIyMuc2VhcmNoIyNzbGljZV9lbmQgMVxuICAgICAgZWxzZSBsIyMuc2VhcmNoKVxuXG4gIGxldCBnZXRfZnJhZ21lbnQgKCkgPVxuICAgICgqIGxvY2F0aW9uLmhhc2ggZG9lc24ndCBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGRlcGVuZGluZyBvbiB0aGUgYnJvd3NlclxuICAgICAgIEZpcmVmb3ggYnVnIDogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDgzMzA0ICopXG4gICAgKCogbGV0IHMgPSBKcy50b19ieXRlc3RyaW5nIChsIyNoYXNoKSBpbiAqKVxuICAgICgqIGlmIFN0cmluZy5sZW5ndGggcyA+IDAgJiYgcy5bMF0gPSAnIycgKilcbiAgICAoKiB0aGVuIFN0cmluZy5zdWIgcyAxIChTdHJpbmcubGVuZ3RoIHMgLSAxKSAqKVxuICAgICgqIGVsc2UgczsgKilcbiAgICBKcy5PcHQuY2FzZVxuICAgICAgKGwjIy5ocmVmIyNfbWF0Y2ggKG5ldyVqcyBKcy5yZWdFeHAgKEpzLnN0cmluZyBcIiMoLiopXCIpKSlcbiAgICAgIChmdW4gKCkgLT4gXCJcIilcbiAgICAgIChmdW4gcmVzIC0+XG4gICAgICAgIGxldCByZXMgPSBKcy5tYXRjaF9yZXN1bHQgcmVzIGluXG4gICAgICAgIEpzLnRvX3N0cmluZyAoSnMuVW5zYWZlLmdldCByZXMgMSkpXG5cbiAgbGV0IHNldF9mcmFnbWVudCBzID0gbCMjLmhhc2ggOj0gSnMuYnl0ZXN0cmluZyAodXJsZW5jb2RlIHMpXG5cbiAgbGV0IGdldCAoKSA9IHVybF9vZl9qc19zdHJpbmcgbCMjLmhyZWZcblxuICBsZXQgc2V0IHUgPSBsIyMuaHJlZiA6PSBKcy5ieXRlc3RyaW5nIChzdHJpbmdfb2ZfdXJsIHUpXG5cbiAgbGV0IGFzX3N0cmluZyA9IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIGwjIy5ocmVmXG5lbmRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTQgSHVnbyBIZXV6YXJkXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuZXh0ZXJuYWwgY3JlYXRlX2ZpbGUgOiBuYW1lOnN0cmluZyAtPiBjb250ZW50OnN0cmluZyAtPiB1bml0ID0gXCJjYW1sX2NyZWF0ZV9maWxlXCJcblxuZXh0ZXJuYWwgcmVhZF9maWxlIDogbmFtZTpzdHJpbmcgLT4gc3RyaW5nID0gXCJjYW1sX3JlYWRfZmlsZV9jb250ZW50XCJcblxubGV0IHVwZGF0ZV9maWxlIH5uYW1lIH5jb250ZW50ID1cbiAgbGV0IG9jID0gb3Blbl9vdXQgbmFtZSBpblxuICBvdXRwdXRfc3RyaW5nIG9jIGNvbnRlbnQ7XG4gIGNsb3NlX291dCBvY1xuXG5leHRlcm5hbCBzZXRfY2hhbm5lbF9vdXRwdXQnIDpcbiAgb3V0X2NoYW5uZWwgLT4gKEpzLmpzX3N0cmluZyBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrIC0+IHVuaXRcbiAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XCJcblxuZXh0ZXJuYWwgc2V0X2NoYW5uZWxfaW5wdXQnIDogaW5fY2hhbm5lbCAtPiAodW5pdCAtPiBzdHJpbmcpIEpzLmNhbGxiYWNrIC0+IHVuaXRcbiAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsXCJcblxubGV0IHNldF9jaGFubmVsX2ZsdXNoZXIgKG91dF9jaGFubmVsIDogb3V0X2NoYW5uZWwpIChmIDogc3RyaW5nIC0+IHVuaXQpID1cbiAgbGV0IGYnIDogKEpzLmpzX3N0cmluZyBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrID1cbiAgICBKcy53cmFwX2NhbGxiYWNrIChmdW4gcyAtPiBmIChKcy50b19ieXRlc3RyaW5nIHMpKVxuICBpblxuICBzZXRfY2hhbm5lbF9vdXRwdXQnIG91dF9jaGFubmVsIGYnXG5cbmxldCBzZXRfY2hhbm5lbF9maWxsZXIgKGluX2NoYW5uZWwgOiBpbl9jaGFubmVsKSAoZiA6IHVuaXQgLT4gc3RyaW5nKSA9XG4gIGxldCBmJyA6ICh1bml0IC0+IHN0cmluZykgSnMuY2FsbGJhY2sgPSBKcy53cmFwX2NhbGxiYWNrIGYgaW5cbiAgc2V0X2NoYW5uZWxfaW5wdXQnIGluX2NoYW5uZWwgZidcblxuZXh0ZXJuYWwgbW91bnRfcG9pbnQgOiB1bml0IC0+IHN0cmluZyBsaXN0ID0gXCJjYW1sX2xpc3RfbW91bnRfcG9pbnRcIlxuXG5leHRlcm5hbCBtb3VudF9hdXRvbG9hZCA6XG4gIHN0cmluZyAtPiAoc3RyaW5nIC0+IHN0cmluZyAtPiBzdHJpbmcgb3B0aW9uKSBKcy5jYWxsYmFjayAtPiB1bml0XG4gID0gXCJjYW1sX21vdW50X2F1dG9sb2FkXCJcblxuZXh0ZXJuYWwgdW5tb3VudCA6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3VubW91bnRcIlxuXG5sZXQgbW91bnQgfnBhdGggZiA9XG4gIG1vdW50X2F1dG9sb2FkIHBhdGggKEpzLndyYXBfY2FsbGJhY2sgKGZ1biBwcmVmaXggcGF0aCAtPiBmIH5wcmVmaXggfnBhdGgpKVxuXG5sZXQgdW5tb3VudCB+cGF0aCA9IHVubW91bnQgcGF0aFxuXG5sZXQganNfb2Zfb2NhbWxfdmVyc2lvbiA9XG4gIGlmIFN0cmluZy5lcXVhbCBMaWJfdmVyc2lvbi5naXRfdmVyc2lvbiBcIlwiXG4gIHRoZW4gTGliX3ZlcnNpb24uc1xuICBlbHNlIExpYl92ZXJzaW9uLnMgXiBcIitcIiBeIExpYl92ZXJzaW9uLmdpdF92ZXJzaW9uXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE5IEFsZXhhbmRlciBZYW5pblxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgcmVzaXplT2JzZXJ2ZXJTaXplID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGlubGluZVNpemUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYmxvY2tTaXplIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSByZXNpemVPYnNlcnZlckVudHJ5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRhcmdldCA6IERvbS5ub2RlIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnRSZWN0IDogRG9tX2h0bWwuY2xpZW50UmVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBib3JkZXJCb3hTaXplIDogcmVzaXplT2JzZXJ2ZXJTaXplIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29udGVudEJveFNpemUgOiByZXNpemVPYnNlcnZlclNpemUgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcmVzaXplT2JzZXJ2ZXJPcHRpb25zID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGJveCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLndyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHJlc2l6ZU9ic2VydmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG9ic2VydmUgOiAjRG9tLm5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBvYnNlcnZlX3dpdGhPcHRpb25zIDpcbiAgICAgICNEb20ubm9kZSBKcy50IC0+IHJlc2l6ZU9ic2VydmVyT3B0aW9ucyBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHVub2JzZXJ2ZSA6ICNEb20ubm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGRpc2Nvbm5lY3QgOiB1bml0IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBlbXB0eV9yZXNpemVfb2JzZXJ2ZXJfb3B0aW9ucyAoKSA6IHJlc2l6ZU9ic2VydmVyT3B0aW9ucyBKcy50ID0gSnMuVW5zYWZlLm9iaiBbfHxdXG5cbmxldCByZXNpemVPYnNlcnZlciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fUmVzaXplT2JzZXJ2ZXJcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IHJlc2l6ZU9ic2VydmVyXG5cbmxldCByZXNpemVPYnNlcnZlciA6XG4gICAgKCAgIChyZXNpemVPYnNlcnZlckVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMudCAtPiByZXNpemVPYnNlcnZlciBKcy50IC0+IHVuaXQpXG4gICAgICAgIEpzLmNhbGxiYWNrXG4gICAgIC0+IHJlc2l6ZU9ic2VydmVyIEpzLnQpXG4gICAgSnMuY29uc3RyID1cbiAgcmVzaXplT2JzZXJ2ZXJcblxubGV0IG9ic2VydmVcbiAgICB+KG5vZGUgOiAjRG9tLm5vZGUgSnMudClcbiAgICB+KGYgOiByZXNpemVPYnNlcnZlckVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMudCAtPiByZXNpemVPYnNlcnZlciBKcy50IC0+IHVuaXQpXG4gICAgPyhib3ggOiBKcy5qc19zdHJpbmcgSnMudCBvcHRpb24pXG4gICAgKCkgOiByZXNpemVPYnNlcnZlciBKcy50ID1cbiAgbGV0IG9icyA9IG5ldyVqcyByZXNpemVPYnNlcnZlciAoSnMud3JhcF9jYWxsYmFjayBmKSBpblxuICAobWF0Y2ggYm94IHdpdGhcbiAgfCBOb25lIC0+IG9icyMjb2JzZXJ2ZSBub2RlXG4gIHwgU29tZSBib3ggLT5cbiAgICAgIGxldCBvcHRzID0gZW1wdHlfcmVzaXplX29ic2VydmVyX29wdGlvbnMgKCkgaW5cbiAgICAgIG9wdHMjIy5ib3ggOj0gYm94O1xuICAgICAgb2JzIyNvYnNlcnZlX3dpdGhPcHRpb25zIG5vZGUgb3B0cyk7XG4gIG9ic1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAyMSBQaGlsaXAgV2hpdGVcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgcGVyZm9ybWFuY2VPYnNlcnZlckluaXQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZW50cnlUeXBlcyA6IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcGVyZm9ybWFuY2VFbnRyeSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBuYW1lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVudHJ5VHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGFydFRpbWUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZHVyYXRpb24gOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBlcmZvcm1hbmNlT2JzZXJ2ZXJFbnRyeUxpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZ2V0RW50cmllcyA6IHBlcmZvcm1hbmNlRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcGVyZm9ybWFuY2VPYnNlcnZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBvYnNlcnZlIDogcGVyZm9ybWFuY2VPYnNlcnZlckluaXQgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBkaXNjb25uZWN0IDogdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgdGFrZVJlY29yZHMgOiBwZXJmb3JtYW5jZUVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgcGVyZm9ybWFuY2VPYnNlcnZlciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fUGVyZm9ybWFuY2VPYnNlcnZlclxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgcGVyZm9ybWFuY2VPYnNlcnZlclxuXG5sZXQgcGVyZm9ybWFuY2VPYnNlcnZlciA6XG4gICAgKCAgIChwZXJmb3JtYW5jZU9ic2VydmVyRW50cnlMaXN0IEpzLnQgLT4gcGVyZm9ybWFuY2VPYnNlcnZlciBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgIC0+IHBlcmZvcm1hbmNlT2JzZXJ2ZXIgSnMudClcbiAgICBKcy5jb25zdHIgPVxuICBwZXJmb3JtYW5jZU9ic2VydmVyXG5cbmxldCBvYnNlcnZlIH5lbnRyeV90eXBlcyB+ZiA9XG4gIGxldCBlbnRyeV90eXBlcyA9IGVudHJ5X3R5cGVzIHw+IExpc3QubWFwIEpzLnN0cmluZyB8PiBBcnJheS5vZl9saXN0IHw+IEpzLmFycmF5IGluXG4gIGxldCBwZXJmb3JtYW5jZV9vYnNlcnZlcl9pbml0IDogcGVyZm9ybWFuY2VPYnNlcnZlckluaXQgSnMudCA9IEpzLlVuc2FmZS5vYmogW3x8XSBpblxuICBsZXQgKCkgPSBwZXJmb3JtYW5jZV9vYnNlcnZlcl9pbml0IyMuZW50cnlUeXBlcyA6PSBlbnRyeV90eXBlcyBpblxuICBsZXQgb2JzID0gbmV3JWpzIHBlcmZvcm1hbmNlT2JzZXJ2ZXIgKEpzLndyYXBfY2FsbGJhY2sgZikgaW5cbiAgbGV0ICgpID0gb2JzIyNvYnNlcnZlIHBlcmZvcm1hbmNlX29ic2VydmVyX2luaXQgaW5cbiAgb2JzXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE1IFN0w6lwaGFuZSBMZWdyYW5kXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBtdXRhdGlvbk9ic2VydmVySW5pdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjaGlsZExpc3QgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXR0cmlidXRlcyA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjaGFyYWN0ZXJEYXRhIDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN1YnRyZWUgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXR0cmlidXRlT2xkVmFsdWUgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2hhcmFjdGVyRGF0YU9sZFZhbHVlIDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZUZpbHRlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbXV0YXRpb25SZWNvcmQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgX3R5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDogRG9tLm5vZGUgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWRkZWROb2RlcyA6IERvbS5ub2RlIERvbS5ub2RlTGlzdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZW1vdmVkTm9kZXMgOiBEb20ubm9kZSBEb20ubm9kZUxpc3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJldmlvdXNTaWJsaW5nIDogRG9tLm5vZGUgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5leHRTaWJsaW5nIDogRG9tLm5vZGUgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZU5hbWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZU5hbWVzcGFjZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2xkVmFsdWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBtdXRhdGlvbk9ic2VydmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG9ic2VydmUgOiAjRG9tLm5vZGUgSnMudCAtPiBtdXRhdGlvbk9ic2VydmVySW5pdCBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGRpc2Nvbm5lY3QgOiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB0YWtlUmVjb3JkcyA6IG11dGF0aW9uUmVjb3JkIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgZW1wdHlfbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdCAoKSA6IG11dGF0aW9uT2JzZXJ2ZXJJbml0IEpzLnQgPSBKcy5VbnNhZmUub2JqIFt8fF1cblxubGV0IG11dGF0aW9uT2JzZXJ2ZXIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX011dGF0aW9uT2JzZXJ2ZXJcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IG11dGF0aW9uT2JzZXJ2ZXJcblxubGV0IG11dGF0aW9uT2JzZXJ2ZXIgOlxuICAgICggICAobXV0YXRpb25SZWNvcmQgSnMudCBKcy5qc19hcnJheSBKcy50IC0+IG11dGF0aW9uT2JzZXJ2ZXIgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAtPiBtdXRhdGlvbk9ic2VydmVyIEpzLnQpXG4gICAgSnMuY29uc3RyID1cbiAgbXV0YXRpb25PYnNlcnZlclxuXG5sZXQgb2JzZXJ2ZVxuICAgIH4obm9kZSA6ICNEb20ubm9kZSBKcy50KVxuICAgIH4oZiA6IG11dGF0aW9uUmVjb3JkIEpzLnQgSnMuanNfYXJyYXkgSnMudCAtPiBtdXRhdGlvbk9ic2VydmVyIEpzLnQgLT4gdW5pdClcbiAgICA/KGNoaWxkX2xpc3QgOiBib29sIG9wdGlvbilcbiAgICA/KGF0dHJpYnV0ZXMgOiBib29sIG9wdGlvbilcbiAgICA/KGNoYXJhY3Rlcl9kYXRhIDogYm9vbCBvcHRpb24pXG4gICAgPyhzdWJ0cmVlIDogYm9vbCBvcHRpb24pXG4gICAgPyhhdHRyaWJ1dGVfb2xkX3ZhbHVlIDogYm9vbCBvcHRpb24pXG4gICAgPyhjaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWUgOiBib29sIG9wdGlvbilcbiAgICA/KGF0dHJpYnV0ZV9maWx0ZXIgOiBKcy5qc19zdHJpbmcgSnMudCBsaXN0IG9wdGlvbilcbiAgICAoKSA6IG11dGF0aW9uT2JzZXJ2ZXIgSnMudCA9XG4gIGxldCBvcHRfaXRlciB4IGYgPVxuICAgIG1hdGNoIHggd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSB4IC0+IGYgeFxuICBpblxuICBsZXQgb2JzID0gbmV3JWpzIG11dGF0aW9uT2JzZXJ2ZXIgKEpzLndyYXBfY2FsbGJhY2sgZikgaW5cbiAgbGV0IGNmZyA9IGVtcHR5X211dGF0aW9uX29ic2VydmVyX2luaXQgKCkgaW5cbiAgbGV0ICgpID0gb3B0X2l0ZXIgY2hpbGRfbGlzdCAoZnVuIHYgLT4gY2ZnIyMuY2hpbGRMaXN0IDo9IHYpIGluXG4gIGxldCAoKSA9IG9wdF9pdGVyIGF0dHJpYnV0ZXMgKGZ1biB2IC0+IGNmZyMjLmF0dHJpYnV0ZXMgOj0gdikgaW5cbiAgbGV0ICgpID0gb3B0X2l0ZXIgY2hhcmFjdGVyX2RhdGEgKGZ1biB2IC0+IGNmZyMjLmNoYXJhY3RlckRhdGEgOj0gdikgaW5cbiAgbGV0ICgpID0gb3B0X2l0ZXIgc3VidHJlZSAoZnVuIHYgLT4gY2ZnIyMuc3VidHJlZSA6PSB2KSBpblxuICBsZXQgKCkgPSBvcHRfaXRlciBhdHRyaWJ1dGVfb2xkX3ZhbHVlIChmdW4gdiAtPiBjZmcjIy5hdHRyaWJ1dGVPbGRWYWx1ZSA6PSB2KSBpblxuICBsZXQgKCkgPVxuICAgIG9wdF9pdGVyIGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSAoZnVuIHYgLT4gY2ZnIyMuY2hhcmFjdGVyRGF0YU9sZFZhbHVlIDo9IHYpXG4gIGluXG4gIGxldCAoKSA9XG4gICAgb3B0X2l0ZXIgYXR0cmlidXRlX2ZpbHRlciAoZnVuIGwgLT5cbiAgICAgICAgY2ZnIyMuYXR0cmlidXRlRmlsdGVyIDo9IEpzLmFycmF5IChBcnJheS5vZl9saXN0IGwpKVxuICBpblxuICBsZXQgKCkgPSBvYnMjI29ic2VydmUgbm9kZSBjZmcgaW5cbiAgb2JzXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IFBpZXJyZSBDaGFtYmFydCAyMDEyLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbnR5cGUgJ2EgdCA9IDwgPiBKcy50XG5cbmxldCBvYmogPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX09iamVjdFxuXG5sZXQgY3JlYXRlICgpIDogJ2EgdCA9IG5ldyVqcyBvYmpcblxubGV0IGFkZCAodCA6ICdhIHQpIChrIDogSnMuanNfc3RyaW5nIEpzLnQpICh2IDogJ2EpID1cbiAgKCogJ18nIGlzIGFkZGVkIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG9iamVjdHMgbWV0aG9kcyAqKVxuICBKcy5VbnNhZmUuc2V0IHQgKGsjI2NvbmNhdCAoSnMuc3RyaW5nIFwiX1wiKSkgdlxuXG5sZXQgcmVtb3ZlICh0IDogJ2EgdCkgKGsgOiBKcy5qc19zdHJpbmcgSnMudCkgPVxuICBKcy5VbnNhZmUuZGVsZXRlIHQgKGsjI2NvbmNhdCAoSnMuc3RyaW5nIFwiX1wiKSlcblxubGV0IGZpbmQgKHQgOiAnYSB0KSAoayA6IEpzLmpzX3N0cmluZyBKcy50KSA6ICdhIEpzLk9wdGRlZi50ID1cbiAgSnMuVW5zYWZlLmdldCB0IChrIyNjb25jYXQgKEpzLnN0cmluZyBcIl9cIikpXG5cbmxldCBrZXlzICh0IDogJ2EgdCkgOiBKcy5qc19zdHJpbmcgSnMudCBsaXN0ID1cbiAgbGV0IGtleV9hcnJheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgPVxuICAgIEpzLlVuc2FmZS5nbG9iYWwjIy5fT2JqZWN0IyNrZXlzIHRcbiAgaW5cbiAgbGV0IHJlcyA9IHJlZiBbXSBpblxuICBmb3IgaSA9IDAgdG8gcHJlZCBrZXlfYXJyYXkjIy5sZW5ndGggZG9cbiAgICBsZXQga2V5ID1cbiAgICAgIEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCBrZXlfYXJyYXkgaSkgKGZ1biAoKSAtPiBmYWlsd2l0aCBcIkpzdGFibGUua2V5c1wiKVxuICAgIGluXG4gICAgcmVzIDo9IGtleSMjc3Vic3RyaW5nIDAgKHByZWQga2V5IyMubGVuZ3RoKSA6OiAhcmVzXG4gIGRvbmU7XG4gIExpc3QucmV2ICFyZXNcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgR3LDqWdvaXJlIEhlbnJ5IDIwMTAuXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIGpzb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgcGFyc2UgOiAnYS4ganNfc3RyaW5nIHQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHBhcnNlXyA6XG4gICAgICAnYSAnYiAnYyAnZC4ganNfc3RyaW5nIHQgLT4gKCdiIHQsIGpzX3N0cmluZyB0IC0+ICdjIC0+ICdkKSBtZXRoX2NhbGxiYWNrIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBzdHJpbmdpZnkgOiAnYS4gJ2EgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cmluZ2lmeV8gOlxuICAgICAgJ2EgJ2IgJ2MgJ2QuICdhIC0+ICgnYiwganNfc3RyaW5nIHQgLT4gJ2MgLT4gJ2QpIG1ldGhfY2FsbGJhY2sgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxubGV0IGpzb24gOiBqc29uIEpzLnQgPSBVbnNhZmUuZ2xvYmFsIyMuX0pTT05cblxubGV0IGlucHV0X3Jldml2ZXIgPVxuICBsZXQgcmV2aXZlciBfdGhpcyBfa2V5ICh2YWx1ZSA6IFVuc2FmZS5hbnkpIDogT2JqLnQgPVxuICAgIGlmIHR5cGVvZiB2YWx1ZSA9PSBzdHJpbmcgXCJzdHJpbmdcIlxuICAgIHRoZW4gT2JqLnJlcHIgKHRvX2J5dGVzdHJpbmcgKFVuc2FmZS5jb2VyY2UgdmFsdWUpKVxuICAgIGVsc2UgaWYgaW5zdGFuY2VvZiB2YWx1ZSBKcy5hcnJheV9lbXB0eVxuICAgICAgICAgICAgJiYgKFVuc2FmZS5jb2VyY2UgdmFsdWUpIyMubGVuZ3RoID09IDRcbiAgICAgICAgICAgICYmIFVuc2FmZS5nZXQgdmFsdWUgMCA9PSAyNTVcbiAgICB0aGVuXG4gICAgICBPYmoucmVwclxuICAgICAgICAoSnNvb19ydW50aW1lLkludDY0LmNyZWF0ZV9pbnQ2NF9sb19taV9oaVxuICAgICAgICAgICAoVW5zYWZlLmdldCB2YWx1ZSAxKVxuICAgICAgICAgICAoVW5zYWZlLmdldCB2YWx1ZSAyKVxuICAgICAgICAgICAoVW5zYWZlLmdldCB2YWx1ZSAzKSlcbiAgICBlbHNlIE9iai5yZXByIHZhbHVlXG4gIGluXG4gIHdyYXBfbWV0aF9jYWxsYmFjayByZXZpdmVyXG5cbmxldCB1bnNhZmVfaW5wdXQgcyA9IGpzb24jI3BhcnNlXyBzIGlucHV0X3Jldml2ZXJcblxuY2xhc3MgdHlwZSBvYmogPVxuICBvYmplY3RcbiAgICBtZXRob2QgY29uc3RydWN0b3IgOiAnYS4gJ2EgY29uc3RyIEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBtbEludDY0X2NvbnN0ciA9XG4gIGxldCBkdW1teV9pbnQ2NCA9IDFMIGluXG4gIGxldCBkdW1teV9vYmogOiBvYmogdCA9IE9iai5tYWdpYyBkdW1teV9pbnQ2NCBpblxuICBkdW1teV9vYmojIy5jb25zdHJ1Y3RvclxuXG5sZXQgb3V0cHV0X3Jldml2ZXIgX2tleSAodmFsdWUgOiBVbnNhZmUuYW55KSA6IE9iai50ID1cbiAgaWYgT2JqLnRhZyAoT2JqLnJlcHIgdmFsdWUpID0gT2JqLnN0cmluZ190YWdcbiAgdGhlbiBPYmoucmVwciAoYnl0ZXN0cmluZyAoT2JqLm1hZ2ljIHZhbHVlIDogc3RyaW5nKSlcbiAgZWxzZSBpZiBpbnN0YW5jZW9mIHZhbHVlIG1sSW50NjRfY29uc3RyXG4gIHRoZW5cbiAgICBsZXQgdmFsdWUgPSBVbnNhZmUuY29lcmNlIHZhbHVlIGluXG4gICAgT2JqLnJlcHIgKGFycmF5IFt8IDI1NTsgdmFsdWUjIy5sbzsgdmFsdWUjIy5taTsgdmFsdWUjIy5oaSB8XSlcbiAgZWxzZSBPYmoucmVwciB2YWx1ZVxuXG5sZXQgb3V0cHV0IG9iaiA9IGpzb24jI3N0cmluZ2lmeV8gb2JqIChKcy53cmFwX2NhbGxiYWNrIG91dHB1dF9yZXZpdmVyKVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBSYXBoYcOrbCBQcm91c3RcbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuISBJbXBvcnRcblxubW9kdWxlIENvbG9yID0gc3RydWN0XG4gICgqIFRoZSB0eXBlIG9mIENTUyBjb2xvcnMuIEZpcnN0IGJ5IG5hbWUgYW5kIHRoZW4gYnkgY29uc3RydWN0b3IuICopXG4gIHR5cGUgbmFtZSA9XG4gICAgfCBBbGljZWJsdWVcbiAgICB8IEFudGlxdWV3aGl0ZVxuICAgIHwgQXF1YVxuICAgIHwgQXF1YW1hcmluZVxuICAgIHwgQXp1cmVcbiAgICB8IEJlaWdlXG4gICAgfCBCaXNxdWVcbiAgICB8IEJsYWNrXG4gICAgfCBCbGFuY2hlZGFsbW9uZFxuICAgIHwgQmx1ZVxuICAgIHwgQmx1ZXZpb2xldFxuICAgIHwgQnJvd25cbiAgICB8IEJ1cmx5d29vZFxuICAgIHwgQ2FkZXRibHVlXG4gICAgfCBDaGFydHJldXNlXG4gICAgfCBDaG9jb2xhdGVcbiAgICB8IENvcmFsXG4gICAgfCBDb3JuZmxvd2VyYmx1ZVxuICAgIHwgQ29ybnNpbGtcbiAgICB8IENyaW1zb25cbiAgICB8IEN5YW5cbiAgICB8IERhcmtibHVlXG4gICAgfCBEYXJrY3lhblxuICAgIHwgRGFya2dvbGRlbnJvZFxuICAgIHwgRGFya2dyYXlcbiAgICB8IERhcmtncmVlblxuICAgIHwgRGFya2dyZXlcbiAgICB8IERhcmtraGFraVxuICAgIHwgRGFya21hZ2VudGFcbiAgICB8IERhcmtvbGl2ZWdyZWVuXG4gICAgfCBEYXJrb3JhbmdlXG4gICAgfCBEYXJrb3JjaGlkXG4gICAgfCBEYXJrcmVkXG4gICAgfCBEYXJrc2FsbW9uXG4gICAgfCBEYXJrc2VhZ3JlZW5cbiAgICB8IERhcmtzbGF0ZWJsdWVcbiAgICB8IERhcmtzbGF0ZWdyYXlcbiAgICB8IERhcmtzbGF0ZWdyZXlcbiAgICB8IERhcmt0dXJxdW9pc2VcbiAgICB8IERhcmt2aW9sZXRcbiAgICB8IERlZXBwaW5rXG4gICAgfCBEZWVwc2t5Ymx1ZVxuICAgIHwgRGltZ3JheVxuICAgIHwgRGltZ3JleVxuICAgIHwgRG9kZ2VyYmx1ZVxuICAgIHwgRmlyZWJyaWNrXG4gICAgfCBGbG9yYWx3aGl0ZVxuICAgIHwgRm9yZXN0Z3JlZW5cbiAgICB8IEZ1Y2hzaWFcbiAgICB8IEdhaW5zYm9yb1xuICAgIHwgR2hvc3R3aGl0ZVxuICAgIHwgR29sZFxuICAgIHwgR29sZGVucm9kXG4gICAgfCBHcmF5XG4gICAgfCBHcmV5XG4gICAgfCBHcmVlblxuICAgIHwgR3JlZW55ZWxsb3dcbiAgICB8IEhvbmV5ZGV3XG4gICAgfCBIb3RwaW5rXG4gICAgfCBJbmRpYW5yZWRcbiAgICB8IEluZGlnb1xuICAgIHwgSXZvcnlcbiAgICB8IEtoYWtpXG4gICAgfCBMYXZlbmRlclxuICAgIHwgTGF2ZW5kZXJibHVzaFxuICAgIHwgTGF3bmdyZWVuXG4gICAgfCBMZW1vbmNoaWZmb25cbiAgICB8IExpZ2h0Ymx1ZVxuICAgIHwgTGlnaHRjb3JhbFxuICAgIHwgTGlnaHRjeWFuXG4gICAgfCBMaWdodGdvbGRlbnJvZHllbGxvd1xuICAgIHwgTGlnaHRncmF5XG4gICAgfCBMaWdodGdyZWVuXG4gICAgfCBMaWdodGdyZXlcbiAgICB8IExpZ2h0cGlua1xuICAgIHwgTGlnaHRzYWxtb25cbiAgICB8IExpZ2h0c2VhZ3JlZW5cbiAgICB8IExpZ2h0c2t5Ymx1ZVxuICAgIHwgTGlnaHRzbGF0ZWdyYXlcbiAgICB8IExpZ2h0c2xhdGVncmV5XG4gICAgfCBMaWdodHN0ZWVsYmx1ZVxuICAgIHwgTGlnaHR5ZWxsb3dcbiAgICB8IExpbWVcbiAgICB8IExpbWVncmVlblxuICAgIHwgTGluZW5cbiAgICB8IE1hZ2VudGFcbiAgICB8IE1hcm9vblxuICAgIHwgTWVkaXVtYXF1YW1hcmluZVxuICAgIHwgTWVkaXVtYmx1ZVxuICAgIHwgTWVkaXVtb3JjaGlkXG4gICAgfCBNZWRpdW1wdXJwbGVcbiAgICB8IE1lZGl1bXNlYWdyZWVuXG4gICAgfCBNZWRpdW1zbGF0ZWJsdWVcbiAgICB8IE1lZGl1bXNwcmluZ2dyZWVuXG4gICAgfCBNZWRpdW10dXJxdW9pc2VcbiAgICB8IE1lZGl1bXZpb2xldHJlZFxuICAgIHwgTWlkbmlnaHRibHVlXG4gICAgfCBNaW50Y3JlYW1cbiAgICB8IE1pc3R5cm9zZVxuICAgIHwgTW9jY2FzaW5cbiAgICB8IE5hdmFqb3doaXRlXG4gICAgfCBOYXZ5XG4gICAgfCBPbGRsYWNlXG4gICAgfCBPbGl2ZVxuICAgIHwgT2xpdmVkcmFiXG4gICAgfCBPcmFuZ2VcbiAgICB8IE9yYW5nZXJlZFxuICAgIHwgT3JjaGlkXG4gICAgfCBQYWxlZ29sZGVucm9kXG4gICAgfCBQYWxlZ3JlZW5cbiAgICB8IFBhbGV0dXJxdW9pc2VcbiAgICB8IFBhbGV2aW9sZXRyZWRcbiAgICB8IFBhcGF5YXdoaXBcbiAgICB8IFBlYWNocHVmZlxuICAgIHwgUGVydVxuICAgIHwgUGlua1xuICAgIHwgUGx1bVxuICAgIHwgUG93ZGVyYmx1ZVxuICAgIHwgUHVycGxlXG4gICAgfCBSZWRcbiAgICB8IFJvc3licm93blxuICAgIHwgUm95YWxibHVlXG4gICAgfCBTYWRkbGVicm93blxuICAgIHwgU2FsbW9uXG4gICAgfCBTYW5keWJyb3duXG4gICAgfCBTZWFncmVlblxuICAgIHwgU2Vhc2hlbGxcbiAgICB8IFNpZW5uYVxuICAgIHwgU2lsdmVyXG4gICAgfCBTa3libHVlXG4gICAgfCBTbGF0ZWJsdWVcbiAgICB8IFNsYXRlZ3JheVxuICAgIHwgU2xhdGVncmV5XG4gICAgfCBTbm93XG4gICAgfCBTcHJpbmdncmVlblxuICAgIHwgU3RlZWxibHVlXG4gICAgfCBUYW5cbiAgICB8IFRlYWxcbiAgICB8IFRoaXN0bGVcbiAgICB8IFRvbWF0b1xuICAgIHwgVHVycXVvaXNlXG4gICAgfCBWaW9sZXRcbiAgICB8IFdoZWF0XG4gICAgfCBXaGl0ZVxuICAgIHwgV2hpdGVzbW9rZVxuICAgIHwgWWVsbG93XG4gICAgfCBZZWxsb3dncmVlblxuXG4gIGxldCBzdHJpbmdfb2ZfbmFtZSA9IGZ1bmN0aW9uXG4gICAgfCBBbGljZWJsdWUgLT4gXCJhbGljZWJsdWVcIlxuICAgIHwgQW50aXF1ZXdoaXRlIC0+IFwiYW50aXF1ZXdoaXRlXCJcbiAgICB8IEFxdWEgLT4gXCJhcXVhXCJcbiAgICB8IEFxdWFtYXJpbmUgLT4gXCJhcXVhbWFyaW5lXCJcbiAgICB8IEF6dXJlIC0+IFwiYXp1cmVcIlxuICAgIHwgQmVpZ2UgLT4gXCJiZWlnZVwiXG4gICAgfCBCaXNxdWUgLT4gXCJiaXNxdWVcIlxuICAgIHwgQmxhY2sgLT4gXCJibGFja1wiXG4gICAgfCBCbGFuY2hlZGFsbW9uZCAtPiBcImJsYW5jaGVkYWxtb25kXCJcbiAgICB8IEJsdWUgLT4gXCJibHVlXCJcbiAgICB8IEJsdWV2aW9sZXQgLT4gXCJibHVldmlvbGV0XCJcbiAgICB8IEJyb3duIC0+IFwiYnJvd25cIlxuICAgIHwgQnVybHl3b29kIC0+IFwiYnVybHl3b29kXCJcbiAgICB8IENhZGV0Ymx1ZSAtPiBcImNhZGV0Ymx1ZVwiXG4gICAgfCBDaGFydHJldXNlIC0+IFwiY2hhcnRyZXVzZVwiXG4gICAgfCBDaG9jb2xhdGUgLT4gXCJjaG9jb2xhdGVcIlxuICAgIHwgQ29yYWwgLT4gXCJjb3JhbFwiXG4gICAgfCBDb3JuZmxvd2VyYmx1ZSAtPiBcImNvcm5mbG93ZXJibHVlXCJcbiAgICB8IENvcm5zaWxrIC0+IFwiY29ybnNpbGtcIlxuICAgIHwgQ3JpbXNvbiAtPiBcImNyaW1zb25cIlxuICAgIHwgQ3lhbiAtPiBcImN5YW5cIlxuICAgIHwgRGFya2JsdWUgLT4gXCJkYXJrYmx1ZVwiXG4gICAgfCBEYXJrY3lhbiAtPiBcImRhcmtjeWFuXCJcbiAgICB8IERhcmtnb2xkZW5yb2QgLT4gXCJkYXJrZ29sZGVucm9kXCJcbiAgICB8IERhcmtncmF5IC0+IFwiZGFya2dyYXlcIlxuICAgIHwgRGFya2dyZWVuIC0+IFwiZGFya2dyZWVuXCJcbiAgICB8IERhcmtncmV5IC0+IFwiZGFya2dyZXlcIlxuICAgIHwgRGFya2toYWtpIC0+IFwiZGFya2toYWtpXCJcbiAgICB8IERhcmttYWdlbnRhIC0+IFwiZGFya21hZ2VudGFcIlxuICAgIHwgRGFya29saXZlZ3JlZW4gLT4gXCJkYXJrb2xpdmVncmVlblwiXG4gICAgfCBEYXJrb3JhbmdlIC0+IFwiZGFya29yYW5nZVwiXG4gICAgfCBEYXJrb3JjaGlkIC0+IFwiZGFya29yY2hpZFwiXG4gICAgfCBEYXJrcmVkIC0+IFwiZGFya3JlZFwiXG4gICAgfCBEYXJrc2FsbW9uIC0+IFwiZGFya3NhbG1vblwiXG4gICAgfCBEYXJrc2VhZ3JlZW4gLT4gXCJkYXJrc2VhZ3JlZW5cIlxuICAgIHwgRGFya3NsYXRlYmx1ZSAtPiBcImRhcmtzbGF0ZWJsdWVcIlxuICAgIHwgRGFya3NsYXRlZ3JheSAtPiBcImRhcmtzbGF0ZWdyYXlcIlxuICAgIHwgRGFya3NsYXRlZ3JleSAtPiBcImRhcmtzbGF0ZWdyZXlcIlxuICAgIHwgRGFya3R1cnF1b2lzZSAtPiBcImRhcmt0dXJxdW9pc2VcIlxuICAgIHwgRGFya3Zpb2xldCAtPiBcImRhcmt2aW9sZXRcIlxuICAgIHwgRGVlcHBpbmsgLT4gXCJkZWVwcGlua1wiXG4gICAgfCBEZWVwc2t5Ymx1ZSAtPiBcImRlZXBza3libHVlXCJcbiAgICB8IERpbWdyYXkgLT4gXCJkaW1ncmF5XCJcbiAgICB8IERpbWdyZXkgLT4gXCJkaW1ncmV5XCJcbiAgICB8IERvZGdlcmJsdWUgLT4gXCJkb2RnZXJibHVlXCJcbiAgICB8IEZpcmVicmljayAtPiBcImZpcmVicmlja1wiXG4gICAgfCBGbG9yYWx3aGl0ZSAtPiBcImZsb3JhbHdoaXRlXCJcbiAgICB8IEZvcmVzdGdyZWVuIC0+IFwiZm9yZXN0Z3JlZW5cIlxuICAgIHwgRnVjaHNpYSAtPiBcImZ1Y2hzaWFcIlxuICAgIHwgR2FpbnNib3JvIC0+IFwiZ2FpbnNib3JvXCJcbiAgICB8IEdob3N0d2hpdGUgLT4gXCJnaG9zdHdoaXRlXCJcbiAgICB8IEdvbGQgLT4gXCJnb2xkXCJcbiAgICB8IEdvbGRlbnJvZCAtPiBcImdvbGRlbnJvZFwiXG4gICAgfCBHcmF5IC0+IFwiZ3JheVwiXG4gICAgfCBHcmVlbiAtPiBcImdyZWVuXCJcbiAgICB8IEdyZWVueWVsbG93IC0+IFwiZ3JlZW55ZWxsb3dcIlxuICAgIHwgR3JleSAtPiBcImdyZXlcIlxuICAgIHwgSG9uZXlkZXcgLT4gXCJob25leWRld1wiXG4gICAgfCBIb3RwaW5rIC0+IFwiaG90cGlua1wiXG4gICAgfCBJbmRpYW5yZWQgLT4gXCJpbmRpYW5yZWRcIlxuICAgIHwgSW5kaWdvIC0+IFwiaW5kaWdvXCJcbiAgICB8IEl2b3J5IC0+IFwiaXZvcnlcIlxuICAgIHwgS2hha2kgLT4gXCJraGFraVwiXG4gICAgfCBMYXZlbmRlciAtPiBcImxhdmVuZGVyXCJcbiAgICB8IExhdmVuZGVyYmx1c2ggLT4gXCJsYXZlbmRlcmJsdXNoXCJcbiAgICB8IExhd25ncmVlbiAtPiBcImxhd25ncmVlblwiXG4gICAgfCBMZW1vbmNoaWZmb24gLT4gXCJsZW1vbmNoaWZmb25cIlxuICAgIHwgTGlnaHRibHVlIC0+IFwibGlnaHRibHVlXCJcbiAgICB8IExpZ2h0Y29yYWwgLT4gXCJsaWdodGNvcmFsXCJcbiAgICB8IExpZ2h0Y3lhbiAtPiBcImxpZ2h0Y3lhblwiXG4gICAgfCBMaWdodGdvbGRlbnJvZHllbGxvdyAtPiBcImxpZ2h0Z29sZGVucm9keWVsbG93XCJcbiAgICB8IExpZ2h0Z3JheSAtPiBcImxpZ2h0Z3JheVwiXG4gICAgfCBMaWdodGdyZWVuIC0+IFwibGlnaHRncmVlblwiXG4gICAgfCBMaWdodGdyZXkgLT4gXCJsaWdodGdyZXlcIlxuICAgIHwgTGlnaHRwaW5rIC0+IFwibGlnaHRwaW5rXCJcbiAgICB8IExpZ2h0c2FsbW9uIC0+IFwibGlnaHRzYWxtb25cIlxuICAgIHwgTGlnaHRzZWFncmVlbiAtPiBcImxpZ2h0c2VhZ3JlZW5cIlxuICAgIHwgTGlnaHRza3libHVlIC0+IFwibGlnaHRza3libHVlXCJcbiAgICB8IExpZ2h0c2xhdGVncmF5IC0+IFwibGlnaHRzbGF0ZWdyYXlcIlxuICAgIHwgTGlnaHRzbGF0ZWdyZXkgLT4gXCJsaWdodHNsYXRlZ3JleVwiXG4gICAgfCBMaWdodHN0ZWVsYmx1ZSAtPiBcImxpZ2h0c3RlZWxibHVlXCJcbiAgICB8IExpZ2h0eWVsbG93IC0+IFwibGlnaHR5ZWxsb3dcIlxuICAgIHwgTGltZSAtPiBcImxpbWVcIlxuICAgIHwgTGltZWdyZWVuIC0+IFwibGltZWdyZWVuXCJcbiAgICB8IExpbmVuIC0+IFwibGluZW5cIlxuICAgIHwgTWFnZW50YSAtPiBcIm1hZ2VudGFcIlxuICAgIHwgTWFyb29uIC0+IFwibWFyb29uXCJcbiAgICB8IE1lZGl1bWFxdWFtYXJpbmUgLT4gXCJtZWRpdW1hcXVhbWFyaW5lXCJcbiAgICB8IE1lZGl1bWJsdWUgLT4gXCJtZWRpdW1ibHVlXCJcbiAgICB8IE1lZGl1bW9yY2hpZCAtPiBcIm1lZGl1bW9yY2hpZFwiXG4gICAgfCBNZWRpdW1wdXJwbGUgLT4gXCJtZWRpdW1wdXJwbGVcIlxuICAgIHwgTWVkaXVtc2VhZ3JlZW4gLT4gXCJtZWRpdW1zZWFncmVlblwiXG4gICAgfCBNZWRpdW1zbGF0ZWJsdWUgLT4gXCJtZWRpdW1zbGF0ZWJsdWVcIlxuICAgIHwgTWVkaXVtc3ByaW5nZ3JlZW4gLT4gXCJtZWRpdW1zcHJpbmdncmVlblwiXG4gICAgfCBNZWRpdW10dXJxdW9pc2UgLT4gXCJtZWRpdW10dXJxdW9pc2VcIlxuICAgIHwgTWVkaXVtdmlvbGV0cmVkIC0+IFwibWVkaXVtdmlvbGV0cmVkXCJcbiAgICB8IE1pZG5pZ2h0Ymx1ZSAtPiBcIm1pZG5pZ2h0Ymx1ZVwiXG4gICAgfCBNaW50Y3JlYW0gLT4gXCJtaW50Y3JlYW1cIlxuICAgIHwgTWlzdHlyb3NlIC0+IFwibWlzdHlyb3NlXCJcbiAgICB8IE1vY2Nhc2luIC0+IFwibW9jY2FzaW5cIlxuICAgIHwgTmF2YWpvd2hpdGUgLT4gXCJuYXZham93aGl0ZVwiXG4gICAgfCBOYXZ5IC0+IFwibmF2eVwiXG4gICAgfCBPbGRsYWNlIC0+IFwib2xkbGFjZVwiXG4gICAgfCBPbGl2ZSAtPiBcIm9saXZlXCJcbiAgICB8IE9saXZlZHJhYiAtPiBcIm9saXZlZHJhYlwiXG4gICAgfCBPcmFuZ2UgLT4gXCJvcmFuZ2VcIlxuICAgIHwgT3JhbmdlcmVkIC0+IFwib3JhbmdlcmVkXCJcbiAgICB8IE9yY2hpZCAtPiBcIm9yY2hpZFwiXG4gICAgfCBQYWxlZ29sZGVucm9kIC0+IFwicGFsZWdvbGRlbnJvZFwiXG4gICAgfCBQYWxlZ3JlZW4gLT4gXCJwYWxlZ3JlZW5cIlxuICAgIHwgUGFsZXR1cnF1b2lzZSAtPiBcInBhbGV0dXJxdW9pc2VcIlxuICAgIHwgUGFsZXZpb2xldHJlZCAtPiBcInBhbGV2aW9sZXRyZWRcIlxuICAgIHwgUGFwYXlhd2hpcCAtPiBcInBhcGF5YXdoaXBcIlxuICAgIHwgUGVhY2hwdWZmIC0+IFwicGVhY2hwdWZmXCJcbiAgICB8IFBlcnUgLT4gXCJwZXJ1XCJcbiAgICB8IFBpbmsgLT4gXCJwaW5rXCJcbiAgICB8IFBsdW0gLT4gXCJwbHVtXCJcbiAgICB8IFBvd2RlcmJsdWUgLT4gXCJwb3dkZXJibHVlXCJcbiAgICB8IFB1cnBsZSAtPiBcInB1cnBsZVwiXG4gICAgfCBSZWQgLT4gXCJyZWRcIlxuICAgIHwgUm9zeWJyb3duIC0+IFwicm9zeWJyb3duXCJcbiAgICB8IFJveWFsYmx1ZSAtPiBcInJveWFsYmx1ZVwiXG4gICAgfCBTYWRkbGVicm93biAtPiBcInNhZGRsZWJyb3duXCJcbiAgICB8IFNhbG1vbiAtPiBcInNhbG1vblwiXG4gICAgfCBTYW5keWJyb3duIC0+IFwic2FuZHlicm93blwiXG4gICAgfCBTZWFncmVlbiAtPiBcInNlYWdyZWVuXCJcbiAgICB8IFNlYXNoZWxsIC0+IFwic2Vhc2hlbGxcIlxuICAgIHwgU2llbm5hIC0+IFwic2llbm5hXCJcbiAgICB8IFNpbHZlciAtPiBcInNpbHZlclwiXG4gICAgfCBTa3libHVlIC0+IFwic2t5Ymx1ZVwiXG4gICAgfCBTbGF0ZWJsdWUgLT4gXCJzbGF0ZWJsdWVcIlxuICAgIHwgU2xhdGVncmF5IC0+IFwic2xhdGVncmF5XCJcbiAgICB8IFNsYXRlZ3JleSAtPiBcInNsYXRlZ3JleVwiXG4gICAgfCBTbm93IC0+IFwic25vd1wiXG4gICAgfCBTcHJpbmdncmVlbiAtPiBcInNwcmluZ2dyZWVuXCJcbiAgICB8IFN0ZWVsYmx1ZSAtPiBcInN0ZWVsYmx1ZVwiXG4gICAgfCBUYW4gLT4gXCJ0YW5cIlxuICAgIHwgVGVhbCAtPiBcInRlYWxcIlxuICAgIHwgVGhpc3RsZSAtPiBcInRoaXN0bGVcIlxuICAgIHwgVG9tYXRvIC0+IFwidG9tYXRvXCJcbiAgICB8IFR1cnF1b2lzZSAtPiBcInR1cnF1b2lzZVwiXG4gICAgfCBWaW9sZXQgLT4gXCJ2aW9sZXRcIlxuICAgIHwgV2hlYXQgLT4gXCJ3aGVhdFwiXG4gICAgfCBXaGl0ZSAtPiBcIndoaXRlXCJcbiAgICB8IFdoaXRlc21va2UgLT4gXCJ3aGl0ZXNtb2tlXCJcbiAgICB8IFllbGxvdyAtPiBcInllbGxvd1wiXG4gICAgfCBZZWxsb3dncmVlbiAtPiBcInllbGxvd2dyZWVuXCJcblxuICBsZXQgbmFtZV9vZl9zdHJpbmcgPSBmdW5jdGlvblxuICAgIHwgXCJhbGljZWJsdWVcIiAtPiBBbGljZWJsdWVcbiAgICB8IFwiYW50aXF1ZXdoaXRlXCIgLT4gQW50aXF1ZXdoaXRlXG4gICAgfCBcImFxdWFcIiAtPiBBcXVhXG4gICAgfCBcImFxdWFtYXJpbmVcIiAtPiBBcXVhbWFyaW5lXG4gICAgfCBcImF6dXJlXCIgLT4gQXp1cmVcbiAgICB8IFwiYmVpZ2VcIiAtPiBCZWlnZVxuICAgIHwgXCJiaXNxdWVcIiAtPiBCaXNxdWVcbiAgICB8IFwiYmxhY2tcIiAtPiBCbGFja1xuICAgIHwgXCJibGFuY2hlZGFsbW9uZFwiIC0+IEJsYW5jaGVkYWxtb25kXG4gICAgfCBcImJsdWVcIiAtPiBCbHVlXG4gICAgfCBcImJsdWV2aW9sZXRcIiAtPiBCbHVldmlvbGV0XG4gICAgfCBcImJyb3duXCIgLT4gQnJvd25cbiAgICB8IFwiYnVybHl3b29kXCIgLT4gQnVybHl3b29kXG4gICAgfCBcImNhZGV0Ymx1ZVwiIC0+IENhZGV0Ymx1ZVxuICAgIHwgXCJjaGFydHJldXNlXCIgLT4gQ2hhcnRyZXVzZVxuICAgIHwgXCJjaG9jb2xhdGVcIiAtPiBDaG9jb2xhdGVcbiAgICB8IFwiY29yYWxcIiAtPiBDb3JhbFxuICAgIHwgXCJjb3JuZmxvd2VyYmx1ZVwiIC0+IENvcm5mbG93ZXJibHVlXG4gICAgfCBcImNvcm5zaWxrXCIgLT4gQ29ybnNpbGtcbiAgICB8IFwiY3JpbXNvblwiIC0+IENyaW1zb25cbiAgICB8IFwiY3lhblwiIC0+IEN5YW5cbiAgICB8IFwiZGFya2JsdWVcIiAtPiBEYXJrYmx1ZVxuICAgIHwgXCJkYXJrY3lhblwiIC0+IERhcmtjeWFuXG4gICAgfCBcImRhcmtnb2xkZW5yb2RcIiAtPiBEYXJrZ29sZGVucm9kXG4gICAgfCBcImRhcmtncmF5XCIgLT4gRGFya2dyYXlcbiAgICB8IFwiZGFya2dyZWVuXCIgLT4gRGFya2dyZWVuXG4gICAgfCBcImRhcmtncmV5XCIgLT4gRGFya2dyZXlcbiAgICB8IFwiZGFya2toYWtpXCIgLT4gRGFya2toYWtpXG4gICAgfCBcImRhcmttYWdlbnRhXCIgLT4gRGFya21hZ2VudGFcbiAgICB8IFwiZGFya29saXZlZ3JlZW5cIiAtPiBEYXJrb2xpdmVncmVlblxuICAgIHwgXCJkYXJrb3JhbmdlXCIgLT4gRGFya29yYW5nZVxuICAgIHwgXCJkYXJrb3JjaGlkXCIgLT4gRGFya29yY2hpZFxuICAgIHwgXCJkYXJrcmVkXCIgLT4gRGFya3JlZFxuICAgIHwgXCJkYXJrc2FsbW9uXCIgLT4gRGFya3NhbG1vblxuICAgIHwgXCJkYXJrc2VhZ3JlZW5cIiAtPiBEYXJrc2VhZ3JlZW5cbiAgICB8IFwiZGFya3NsYXRlYmx1ZVwiIC0+IERhcmtzbGF0ZWJsdWVcbiAgICB8IFwiZGFya3NsYXRlZ3JheVwiIC0+IERhcmtzbGF0ZWdyYXlcbiAgICB8IFwiZGFya3NsYXRlZ3JleVwiIC0+IERhcmtzbGF0ZWdyZXlcbiAgICB8IFwiZGFya3R1cnF1b2lzZVwiIC0+IERhcmt0dXJxdW9pc2VcbiAgICB8IFwiZGFya3Zpb2xldFwiIC0+IERhcmt2aW9sZXRcbiAgICB8IFwiZGVlcHBpbmtcIiAtPiBEZWVwcGlua1xuICAgIHwgXCJkZWVwc2t5Ymx1ZVwiIC0+IERlZXBza3libHVlXG4gICAgfCBcImRpbWdyYXlcIiAtPiBEaW1ncmF5XG4gICAgfCBcImRpbWdyZXlcIiAtPiBEaW1ncmV5XG4gICAgfCBcImRvZGdlcmJsdWVcIiAtPiBEb2RnZXJibHVlXG4gICAgfCBcImZpcmVicmlja1wiIC0+IEZpcmVicmlja1xuICAgIHwgXCJmbG9yYWx3aGl0ZVwiIC0+IEZsb3JhbHdoaXRlXG4gICAgfCBcImZvcmVzdGdyZWVuXCIgLT4gRm9yZXN0Z3JlZW5cbiAgICB8IFwiZnVjaHNpYVwiIC0+IEZ1Y2hzaWFcbiAgICB8IFwiZ2FpbnNib3JvXCIgLT4gR2FpbnNib3JvXG4gICAgfCBcImdob3N0d2hpdGVcIiAtPiBHaG9zdHdoaXRlXG4gICAgfCBcImdvbGRcIiAtPiBHb2xkXG4gICAgfCBcImdvbGRlbnJvZFwiIC0+IEdvbGRlbnJvZFxuICAgIHwgXCJncmF5XCIgLT4gR3JheVxuICAgIHwgXCJncmVlblwiIC0+IEdyZWVuXG4gICAgfCBcImdyZWVueWVsbG93XCIgLT4gR3JlZW55ZWxsb3dcbiAgICB8IFwiZ3JleVwiIC0+IEdyZXlcbiAgICB8IFwiaG9uZXlkZXdcIiAtPiBIb25leWRld1xuICAgIHwgXCJob3RwaW5rXCIgLT4gSG90cGlua1xuICAgIHwgXCJpbmRpYW5yZWRcIiAtPiBJbmRpYW5yZWRcbiAgICB8IFwiaW5kaWdvXCIgLT4gSW5kaWdvXG4gICAgfCBcIml2b3J5XCIgLT4gSXZvcnlcbiAgICB8IFwia2hha2lcIiAtPiBLaGFraVxuICAgIHwgXCJsYXZlbmRlclwiIC0+IExhdmVuZGVyXG4gICAgfCBcImxhdmVuZGVyYmx1c2hcIiAtPiBMYXZlbmRlcmJsdXNoXG4gICAgfCBcImxhd25ncmVlblwiIC0+IExhd25ncmVlblxuICAgIHwgXCJsZW1vbmNoaWZmb25cIiAtPiBMZW1vbmNoaWZmb25cbiAgICB8IFwibGlnaHRibHVlXCIgLT4gTGlnaHRibHVlXG4gICAgfCBcImxpZ2h0Y29yYWxcIiAtPiBMaWdodGNvcmFsXG4gICAgfCBcImxpZ2h0Y3lhblwiIC0+IExpZ2h0Y3lhblxuICAgIHwgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiIC0+IExpZ2h0Z29sZGVucm9keWVsbG93XG4gICAgfCBcImxpZ2h0Z3JheVwiIC0+IExpZ2h0Z3JheVxuICAgIHwgXCJsaWdodGdyZWVuXCIgLT4gTGlnaHRncmVlblxuICAgIHwgXCJsaWdodGdyZXlcIiAtPiBMaWdodGdyZXlcbiAgICB8IFwibGlnaHRwaW5rXCIgLT4gTGlnaHRwaW5rXG4gICAgfCBcImxpZ2h0c2FsbW9uXCIgLT4gTGlnaHRzYWxtb25cbiAgICB8IFwibGlnaHRzZWFncmVlblwiIC0+IExpZ2h0c2VhZ3JlZW5cbiAgICB8IFwibGlnaHRza3libHVlXCIgLT4gTGlnaHRza3libHVlXG4gICAgfCBcImxpZ2h0c2xhdGVncmF5XCIgLT4gTGlnaHRzbGF0ZWdyYXlcbiAgICB8IFwibGlnaHRzbGF0ZWdyZXlcIiAtPiBMaWdodHNsYXRlZ3JleVxuICAgIHwgXCJsaWdodHN0ZWVsYmx1ZVwiIC0+IExpZ2h0c3RlZWxibHVlXG4gICAgfCBcImxpZ2h0eWVsbG93XCIgLT4gTGlnaHR5ZWxsb3dcbiAgICB8IFwibGltZVwiIC0+IExpbWVcbiAgICB8IFwibGltZWdyZWVuXCIgLT4gTGltZWdyZWVuXG4gICAgfCBcImxpbmVuXCIgLT4gTGluZW5cbiAgICB8IFwibWFnZW50YVwiIC0+IE1hZ2VudGFcbiAgICB8IFwibWFyb29uXCIgLT4gTWFyb29uXG4gICAgfCBcIm1lZGl1bWFxdWFtYXJpbmVcIiAtPiBNZWRpdW1hcXVhbWFyaW5lXG4gICAgfCBcIm1lZGl1bWJsdWVcIiAtPiBNZWRpdW1ibHVlXG4gICAgfCBcIm1lZGl1bW9yY2hpZFwiIC0+IE1lZGl1bW9yY2hpZFxuICAgIHwgXCJtZWRpdW1wdXJwbGVcIiAtPiBNZWRpdW1wdXJwbGVcbiAgICB8IFwibWVkaXVtc2VhZ3JlZW5cIiAtPiBNZWRpdW1zZWFncmVlblxuICAgIHwgXCJtZWRpdW1zbGF0ZWJsdWVcIiAtPiBNZWRpdW1zbGF0ZWJsdWVcbiAgICB8IFwibWVkaXVtc3ByaW5nZ3JlZW5cIiAtPiBNZWRpdW1zcHJpbmdncmVlblxuICAgIHwgXCJtZWRpdW10dXJxdW9pc2VcIiAtPiBNZWRpdW10dXJxdW9pc2VcbiAgICB8IFwibWVkaXVtdmlvbGV0cmVkXCIgLT4gTWVkaXVtdmlvbGV0cmVkXG4gICAgfCBcIm1pZG5pZ2h0Ymx1ZVwiIC0+IE1pZG5pZ2h0Ymx1ZVxuICAgIHwgXCJtaW50Y3JlYW1cIiAtPiBNaW50Y3JlYW1cbiAgICB8IFwibWlzdHlyb3NlXCIgLT4gTWlzdHlyb3NlXG4gICAgfCBcIm1vY2Nhc2luXCIgLT4gTW9jY2FzaW5cbiAgICB8IFwibmF2YWpvd2hpdGVcIiAtPiBOYXZham93aGl0ZVxuICAgIHwgXCJuYXZ5XCIgLT4gTmF2eVxuICAgIHwgXCJvbGRsYWNlXCIgLT4gT2xkbGFjZVxuICAgIHwgXCJvbGl2ZVwiIC0+IE9saXZlXG4gICAgfCBcIm9saXZlZHJhYlwiIC0+IE9saXZlZHJhYlxuICAgIHwgXCJvcmFuZ2VcIiAtPiBPcmFuZ2VcbiAgICB8IFwib3JhbmdlcmVkXCIgLT4gT3JhbmdlcmVkXG4gICAgfCBcIm9yY2hpZFwiIC0+IE9yY2hpZFxuICAgIHwgXCJwYWxlZ29sZGVucm9kXCIgLT4gUGFsZWdvbGRlbnJvZFxuICAgIHwgXCJwYWxlZ3JlZW5cIiAtPiBQYWxlZ3JlZW5cbiAgICB8IFwicGFsZXR1cnF1b2lzZVwiIC0+IFBhbGV0dXJxdW9pc2VcbiAgICB8IFwicGFsZXZpb2xldHJlZFwiIC0+IFBhbGV2aW9sZXRyZWRcbiAgICB8IFwicGFwYXlhd2hpcFwiIC0+IFBhcGF5YXdoaXBcbiAgICB8IFwicGVhY2hwdWZmXCIgLT4gUGVhY2hwdWZmXG4gICAgfCBcInBlcnVcIiAtPiBQZXJ1XG4gICAgfCBcInBpbmtcIiAtPiBQaW5rXG4gICAgfCBcInBsdW1cIiAtPiBQbHVtXG4gICAgfCBcInBvd2RlcmJsdWVcIiAtPiBQb3dkZXJibHVlXG4gICAgfCBcInB1cnBsZVwiIC0+IFB1cnBsZVxuICAgIHwgXCJyZWRcIiAtPiBSZWRcbiAgICB8IFwicm9zeWJyb3duXCIgLT4gUm9zeWJyb3duXG4gICAgfCBcInJveWFsYmx1ZVwiIC0+IFJveWFsYmx1ZVxuICAgIHwgXCJzYWRkbGVicm93blwiIC0+IFNhZGRsZWJyb3duXG4gICAgfCBcInNhbG1vblwiIC0+IFNhbG1vblxuICAgIHwgXCJzYW5keWJyb3duXCIgLT4gU2FuZHlicm93blxuICAgIHwgXCJzZWFncmVlblwiIC0+IFNlYWdyZWVuXG4gICAgfCBcInNlYXNoZWxsXCIgLT4gU2Vhc2hlbGxcbiAgICB8IFwic2llbm5hXCIgLT4gU2llbm5hXG4gICAgfCBcInNpbHZlclwiIC0+IFNpbHZlclxuICAgIHwgXCJza3libHVlXCIgLT4gU2t5Ymx1ZVxuICAgIHwgXCJzbGF0ZWJsdWVcIiAtPiBTbGF0ZWJsdWVcbiAgICB8IFwic2xhdGVncmF5XCIgLT4gU2xhdGVncmF5XG4gICAgfCBcInNsYXRlZ3JleVwiIC0+IFNsYXRlZ3JleVxuICAgIHwgXCJzbm93XCIgLT4gU25vd1xuICAgIHwgXCJzcHJpbmdncmVlblwiIC0+IFNwcmluZ2dyZWVuXG4gICAgfCBcInN0ZWVsYmx1ZVwiIC0+IFN0ZWVsYmx1ZVxuICAgIHwgXCJ0YW5cIiAtPiBUYW5cbiAgICB8IFwidGVhbFwiIC0+IFRlYWxcbiAgICB8IFwidGhpc3RsZVwiIC0+IFRoaXN0bGVcbiAgICB8IFwidG9tYXRvXCIgLT4gVG9tYXRvXG4gICAgfCBcInR1cnF1b2lzZVwiIC0+IFR1cnF1b2lzZVxuICAgIHwgXCJ2aW9sZXRcIiAtPiBWaW9sZXRcbiAgICB8IFwid2hlYXRcIiAtPiBXaGVhdFxuICAgIHwgXCJ3aGl0ZVwiIC0+IFdoaXRlXG4gICAgfCBcIndoaXRlc21va2VcIiAtPiBXaGl0ZXNtb2tlXG4gICAgfCBcInllbGxvd1wiIC0+IFllbGxvd1xuICAgIHwgXCJ5ZWxsb3dncmVlblwiIC0+IFllbGxvd2dyZWVuXG4gICAgfCBzIC0+IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChzIF4gXCIgaXMgbm90IGEgdmFsaWQgY29sb3IgbmFtZVwiKSlcblxuICBsZXQgcmdiX29mX25hbWUgPSBmdW5jdGlvblxuICAgIHwgQWxpY2VibHVlIC0+IDI0MCwgMjQ4LCAyNTVcbiAgICB8IEFudGlxdWV3aGl0ZSAtPiAyNTAsIDIzNSwgMjE1XG4gICAgfCBBcXVhIC0+IDAsIDI1NSwgMjU1XG4gICAgfCBBcXVhbWFyaW5lIC0+IDEyNywgMjU1LCAyMTJcbiAgICB8IEF6dXJlIC0+IDI0MCwgMjU1LCAyNTVcbiAgICB8IEJlaWdlIC0+IDI0NSwgMjQ1LCAyMjBcbiAgICB8IEJpc3F1ZSAtPiAyNTUsIDIyOCwgMTk2XG4gICAgfCBCbGFjayAtPiAwLCAwLCAwXG4gICAgfCBCbGFuY2hlZGFsbW9uZCAtPiAyNTUsIDIzNSwgMjA1XG4gICAgfCBCbHVlIC0+IDAsIDAsIDI1NVxuICAgIHwgQmx1ZXZpb2xldCAtPiAxMzgsIDQzLCAyMjZcbiAgICB8IEJyb3duIC0+IDE2NSwgNDIsIDQyXG4gICAgfCBCdXJseXdvb2QgLT4gMjIyLCAxODQsIDEzNVxuICAgIHwgQ2FkZXRibHVlIC0+IDk1LCAxNTgsIDE2MFxuICAgIHwgQ2hhcnRyZXVzZSAtPiAxMjcsIDI1NSwgMFxuICAgIHwgQ2hvY29sYXRlIC0+IDIxMCwgMTA1LCAzMFxuICAgIHwgQ29yYWwgLT4gMjU1LCAxMjcsIDgwXG4gICAgfCBDb3JuZmxvd2VyYmx1ZSAtPiAxMDAsIDE0OSwgMjM3XG4gICAgfCBDb3Juc2lsayAtPiAyNTUsIDI0OCwgMjIwXG4gICAgfCBDcmltc29uIC0+IDIyMCwgMjAsIDYwXG4gICAgfCBDeWFuIC0+IDAsIDI1NSwgMjU1XG4gICAgfCBEYXJrYmx1ZSAtPiAwLCAwLCAxMzlcbiAgICB8IERhcmtjeWFuIC0+IDAsIDEzOSwgMTM5XG4gICAgfCBEYXJrZ29sZGVucm9kIC0+IDE4NCwgMTM0LCAxMVxuICAgIHwgRGFya2dyYXkgLT4gMTY5LCAxNjksIDE2OVxuICAgIHwgRGFya2dyZWVuIC0+IDAsIDEwMCwgMFxuICAgIHwgRGFya2dyZXkgLT4gMTY5LCAxNjksIDE2OVxuICAgIHwgRGFya2toYWtpIC0+IDE4OSwgMTgzLCAxMDdcbiAgICB8IERhcmttYWdlbnRhIC0+IDEzOSwgMCwgMTM5XG4gICAgfCBEYXJrb2xpdmVncmVlbiAtPiA4NSwgMTA3LCA0N1xuICAgIHwgRGFya29yYW5nZSAtPiAyNTUsIDE0MCwgMFxuICAgIHwgRGFya29yY2hpZCAtPiAxNTMsIDUwLCAyMDRcbiAgICB8IERhcmtyZWQgLT4gMTM5LCAwLCAwXG4gICAgfCBEYXJrc2FsbW9uIC0+IDIzMywgMTUwLCAxMjJcbiAgICB8IERhcmtzZWFncmVlbiAtPiAxNDMsIDE4OCwgMTQzXG4gICAgfCBEYXJrc2xhdGVibHVlIC0+IDcyLCA2MSwgMTM5XG4gICAgfCBEYXJrc2xhdGVncmF5IC0+IDQ3LCA3OSwgNzlcbiAgICB8IERhcmtzbGF0ZWdyZXkgLT4gNDcsIDc5LCA3OVxuICAgIHwgRGFya3R1cnF1b2lzZSAtPiAwLCAyMDYsIDIwOVxuICAgIHwgRGFya3Zpb2xldCAtPiAxNDgsIDAsIDIxMVxuICAgIHwgRGVlcHBpbmsgLT4gMjU1LCAyMCwgMTQ3XG4gICAgfCBEZWVwc2t5Ymx1ZSAtPiAwLCAxOTEsIDI1NVxuICAgIHwgRGltZ3JheSAtPiAxMDUsIDEwNSwgMTA1XG4gICAgfCBEaW1ncmV5IC0+IDEwNSwgMTA1LCAxMDVcbiAgICB8IERvZGdlcmJsdWUgLT4gMzAsIDE0NCwgMjU1XG4gICAgfCBGaXJlYnJpY2sgLT4gMTc4LCAzNCwgMzRcbiAgICB8IEZsb3JhbHdoaXRlIC0+IDI1NSwgMjUwLCAyNDBcbiAgICB8IEZvcmVzdGdyZWVuIC0+IDM0LCAxMzksIDM0XG4gICAgfCBGdWNoc2lhIC0+IDI1NSwgMCwgMjU1XG4gICAgfCBHYWluc2Jvcm8gLT4gMjIwLCAyMjAsIDIyMFxuICAgIHwgR2hvc3R3aGl0ZSAtPiAyNDgsIDI0OCwgMjU1XG4gICAgfCBHb2xkIC0+IDI1NSwgMjE1LCAwXG4gICAgfCBHb2xkZW5yb2QgLT4gMjE4LCAxNjUsIDMyXG4gICAgfCBHcmF5IC0+IDEyOCwgMTI4LCAxMjhcbiAgICB8IEdyZWVuIC0+IDAsIDEyOCwgMFxuICAgIHwgR3JlZW55ZWxsb3cgLT4gMTczLCAyNTUsIDQ3XG4gICAgfCBHcmV5IC0+IDEyOCwgMTI4LCAxMjhcbiAgICB8IEhvbmV5ZGV3IC0+IDI0MCwgMjU1LCAyNDBcbiAgICB8IEhvdHBpbmsgLT4gMjU1LCAxMDUsIDE4MFxuICAgIHwgSW5kaWFucmVkIC0+IDIwNSwgOTIsIDkyXG4gICAgfCBJbmRpZ28gLT4gNzUsIDAsIDEzMFxuICAgIHwgSXZvcnkgLT4gMjU1LCAyNTUsIDI0MFxuICAgIHwgS2hha2kgLT4gMjQwLCAyMzAsIDE0MFxuICAgIHwgTGF2ZW5kZXIgLT4gMjMwLCAyMzAsIDI1MFxuICAgIHwgTGF2ZW5kZXJibHVzaCAtPiAyNTUsIDI0MCwgMjQ1XG4gICAgfCBMYXduZ3JlZW4gLT4gMTI0LCAyNTIsIDBcbiAgICB8IExlbW9uY2hpZmZvbiAtPiAyNTUsIDI1MCwgMjA1XG4gICAgfCBMaWdodGJsdWUgLT4gMTczLCAyMTYsIDIzMFxuICAgIHwgTGlnaHRjb3JhbCAtPiAyNDAsIDEyOCwgMTI4XG4gICAgfCBMaWdodGN5YW4gLT4gMjI0LCAyNTUsIDI1NVxuICAgIHwgTGlnaHRnb2xkZW5yb2R5ZWxsb3cgLT4gMjUwLCAyNTAsIDIxMFxuICAgIHwgTGlnaHRncmF5IC0+IDIxMSwgMjExLCAyMTFcbiAgICB8IExpZ2h0Z3JlZW4gLT4gMTQ0LCAyMzgsIDE0NFxuICAgIHwgTGlnaHRncmV5IC0+IDIxMSwgMjExLCAyMTFcbiAgICB8IExpZ2h0cGluayAtPiAyNTUsIDE4MiwgMTkzXG4gICAgfCBMaWdodHNhbG1vbiAtPiAyNTUsIDE2MCwgMTIyXG4gICAgfCBMaWdodHNlYWdyZWVuIC0+IDMyLCAxNzgsIDE3MFxuICAgIHwgTGlnaHRza3libHVlIC0+IDEzNSwgMjA2LCAyNTBcbiAgICB8IExpZ2h0c2xhdGVncmF5IC0+IDExOSwgMTM2LCAxNTNcbiAgICB8IExpZ2h0c2xhdGVncmV5IC0+IDExOSwgMTM2LCAxNTNcbiAgICB8IExpZ2h0c3RlZWxibHVlIC0+IDE3NiwgMTk2LCAyMjJcbiAgICB8IExpZ2h0eWVsbG93IC0+IDI1NSwgMjU1LCAyMjRcbiAgICB8IExpbWUgLT4gMCwgMjU1LCAwXG4gICAgfCBMaW1lZ3JlZW4gLT4gNTAsIDIwNSwgNTBcbiAgICB8IExpbmVuIC0+IDI1MCwgMjQwLCAyMzBcbiAgICB8IE1hZ2VudGEgLT4gMjU1LCAwLCAyNTVcbiAgICB8IE1hcm9vbiAtPiAxMjgsIDAsIDBcbiAgICB8IE1lZGl1bWFxdWFtYXJpbmUgLT4gMTAyLCAyMDUsIDE3MFxuICAgIHwgTWVkaXVtYmx1ZSAtPiAwLCAwLCAyMDVcbiAgICB8IE1lZGl1bW9yY2hpZCAtPiAxODYsIDg1LCAyMTFcbiAgICB8IE1lZGl1bXB1cnBsZSAtPiAxNDcsIDExMiwgMjE5XG4gICAgfCBNZWRpdW1zZWFncmVlbiAtPiA2MCwgMTc5LCAxMTNcbiAgICB8IE1lZGl1bXNsYXRlYmx1ZSAtPiAxMjMsIDEwNCwgMjM4XG4gICAgfCBNZWRpdW1zcHJpbmdncmVlbiAtPiAwLCAyNTAsIDE1NFxuICAgIHwgTWVkaXVtdHVycXVvaXNlIC0+IDcyLCAyMDksIDIwNFxuICAgIHwgTWVkaXVtdmlvbGV0cmVkIC0+IDE5OSwgMjEsIDEzM1xuICAgIHwgTWlkbmlnaHRibHVlIC0+IDI1LCAyNSwgMTEyXG4gICAgfCBNaW50Y3JlYW0gLT4gMjQ1LCAyNTUsIDI1MFxuICAgIHwgTWlzdHlyb3NlIC0+IDI1NSwgMjI4LCAyMjVcbiAgICB8IE1vY2Nhc2luIC0+IDI1NSwgMjI4LCAxODFcbiAgICB8IE5hdmFqb3doaXRlIC0+IDI1NSwgMjIyLCAxNzNcbiAgICB8IE5hdnkgLT4gMCwgMCwgMTI4XG4gICAgfCBPbGRsYWNlIC0+IDI1MywgMjQ1LCAyMzBcbiAgICB8IE9saXZlIC0+IDEyOCwgMTI4LCAwXG4gICAgfCBPbGl2ZWRyYWIgLT4gMTA3LCAxNDIsIDM1XG4gICAgfCBPcmFuZ2UgLT4gMjU1LCAxNjUsIDBcbiAgICB8IE9yYW5nZXJlZCAtPiAyNTUsIDY5LCAwXG4gICAgfCBPcmNoaWQgLT4gMjE4LCAxMTIsIDIxNFxuICAgIHwgUGFsZWdvbGRlbnJvZCAtPiAyMzgsIDIzMiwgMTcwXG4gICAgfCBQYWxlZ3JlZW4gLT4gMTUyLCAyNTEsIDE1MlxuICAgIHwgUGFsZXR1cnF1b2lzZSAtPiAxNzUsIDIzOCwgMjM4XG4gICAgfCBQYWxldmlvbGV0cmVkIC0+IDIxOSwgMTEyLCAxNDdcbiAgICB8IFBhcGF5YXdoaXAgLT4gMjU1LCAyMzksIDIxM1xuICAgIHwgUGVhY2hwdWZmIC0+IDI1NSwgMjE4LCAxODVcbiAgICB8IFBlcnUgLT4gMjA1LCAxMzMsIDYzXG4gICAgfCBQaW5rIC0+IDI1NSwgMTkyLCAyMDNcbiAgICB8IFBsdW0gLT4gMjIxLCAxNjAsIDIyMVxuICAgIHwgUG93ZGVyYmx1ZSAtPiAxNzYsIDIyNCwgMjMwXG4gICAgfCBQdXJwbGUgLT4gMTI4LCAwLCAxMjhcbiAgICB8IFJlZCAtPiAyNTUsIDAsIDBcbiAgICB8IFJvc3licm93biAtPiAxODgsIDE0MywgMTQzXG4gICAgfCBSb3lhbGJsdWUgLT4gNjUsIDEwNSwgMjI1XG4gICAgfCBTYWRkbGVicm93biAtPiAxMzksIDY5LCAxOVxuICAgIHwgU2FsbW9uIC0+IDI1MCwgMTI4LCAxMTRcbiAgICB8IFNhbmR5YnJvd24gLT4gMjQ0LCAxNjQsIDk2XG4gICAgfCBTZWFncmVlbiAtPiA0NiwgMTM5LCA4N1xuICAgIHwgU2Vhc2hlbGwgLT4gMjU1LCAyNDUsIDIzOFxuICAgIHwgU2llbm5hIC0+IDE2MCwgODIsIDQ1XG4gICAgfCBTaWx2ZXIgLT4gMTkyLCAxOTIsIDE5MlxuICAgIHwgU2t5Ymx1ZSAtPiAxMzUsIDIwNiwgMjM1XG4gICAgfCBTbGF0ZWJsdWUgLT4gMTA2LCA5MCwgMjA1XG4gICAgfCBTbGF0ZWdyYXkgLT4gMTEyLCAxMjgsIDE0NFxuICAgIHwgU2xhdGVncmV5IC0+IDExMiwgMTI4LCAxNDRcbiAgICB8IFNub3cgLT4gMjU1LCAyNTAsIDI1MFxuICAgIHwgU3ByaW5nZ3JlZW4gLT4gMCwgMjU1LCAxMjdcbiAgICB8IFN0ZWVsYmx1ZSAtPiA3MCwgMTMwLCAxODBcbiAgICB8IFRhbiAtPiAyMTAsIDE4MCwgMTQwXG4gICAgfCBUZWFsIC0+IDAsIDEyOCwgMTI4XG4gICAgfCBUaGlzdGxlIC0+IDIxNiwgMTkxLCAyMTZcbiAgICB8IFRvbWF0byAtPiAyNTUsIDk5LCA3MVxuICAgIHwgVHVycXVvaXNlIC0+IDY0LCAyMjQsIDIwOFxuICAgIHwgVmlvbGV0IC0+IDIzOCwgMTMwLCAyMzhcbiAgICB8IFdoZWF0IC0+IDI0NSwgMjIyLCAxNzlcbiAgICB8IFdoaXRlIC0+IDI1NSwgMjU1LCAyNTVcbiAgICB8IFdoaXRlc21va2UgLT4gMjQ1LCAyNDUsIDI0NVxuICAgIHwgWWVsbG93IC0+IDI1NSwgMjU1LCAwXG4gICAgfCBZZWxsb3dncmVlbiAtPiAxNTQsIDIwNSwgNTBcblxuICB0eXBlIHQgPVxuICAgIHwgTmFtZSBvZiBuYW1lXG4gICAgfCBSR0Igb2YgKGludCAqIGludCAqIGludClcbiAgICAgICAgKCoqIFJlZCwgR3JlZW4gYW5kIEJsdWUgdmFsdWVzLiBDbGlwcGVkIHRvIFtbMC4uMjU1XV0gYnkgbW9zdCAoQWxsPylcbiAgICAgICAgICAgIGJyb3dzZXJzLiAqKVxuICAgIHwgUkdCX3BlcmNlbnQgb2YgKGludCAqIGludCAqIGludClcbiAgICAgICAgKCoqIFJHQiBjaGFubmVscyBhcmUgc3BlY2lmaWVkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGVpciBtYXhpbWFsIHZhbHVlLiAqKVxuICAgIHwgUkdCQSBvZiAoaW50ICogaW50ICogaW50ICogZmxvYXQpXG4gICAgICAgICgqKiBTYW1lIGFzIFJHQiB3aXRoIGFkZGl0aW9uYWwgdHJhbnNwYXJlbmN5IGFyZ3VtZW50LiBPcGFjaXR5IHNob3VsZCBiZSBpblxuICAgICAgICAgICAgWzAuXSAoY29tcGxldGVseSB0cmFuc3BhcmVudCkgYW5kIFsxLl0gKGNvbXBsZXRlbHkgb3BhcXVlKS4gKilcbiAgICB8IFJHQkFfcGVyY2VudCBvZiAoaW50ICogaW50ICogaW50ICogZmxvYXQpXG4gICAgICAgICgqKiBSR0IgY2hhbm5lbHMgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgbWF4aW1hbCB2YWx1ZS4gQWxwaGFcbiAgICAgICAgICAgIGNoYW5uZWwgKG9wYWNpdHkpIGlzIHN0aWxsIGEgWzAuXSB0byBbMS5dIGZsb2F0LiAqKVxuICAgIHwgSFNMIG9mIChpbnQgKiBpbnQgKiBpbnQpXG4gICAgICAgICgqKiBIdWUsIFNhdHVyYXRpb24gYW5kIExpZ2h0bmVzcyB2YWx1ZXMuIEh1ZSBpcyBhbiBhbmdsZSBpbiBkZWdyZWUgKGluXG4gICAgICAgICAgICBpbnRlcnZhbCBbWzAuLjM2MFtdKS4gU2F0dXJhdGlvbiBpcyBhIHBlcmNlbnRhZ2UgKFtbMC4uMTAwXV0pIHdpdGggWzBdXG4gICAgICAgICAgICBiZWluZyBjb2xvcmxlc3MuIExpZ2h0bmVzcyBpcyBhbHNvIGEgcGVyY2VudGFnZSAoW1swLi4xMDBdXSkgd2l0aCBbMF1cbiAgICAgICAgICAgIGJlaW5nIGJsYWNrLiAqKVxuICAgIHwgSFNMQSBvZiAoaW50ICogaW50ICogaW50ICogZmxvYXQpXG4gICAgICAgICgqKiBTYW1lIGFzIEhTTCB3aXRoIGFuIG9wYWNpdHkgYXJndW1lbnQgYmV0d2VlbiBbMC5dIGFuZCBbMS5dLiAqKVxuXG4gIGxldCByZ2IgP2EgciBnIGIgPVxuICAgIG1hdGNoIGEgd2l0aFxuICAgIHwgTm9uZSAtPiBSR0IgKHIsIGcsIGIpXG4gICAgfCBTb21lIGEgLT4gUkdCQSAociwgZywgYiwgYSlcblxuICBsZXQgaHNsID9hIGggcyBsID1cbiAgICBtYXRjaCBhIHdpdGhcbiAgICB8IE5vbmUgLT4gSFNMIChoLCBzLCBsKVxuICAgIHwgU29tZSBhIC0+IEhTTEEgKGgsIHMsIGwsIGEpXG5cbiAgbGV0IHN0cmluZ19vZl90ID0gZnVuY3Rpb25cbiAgICB8IE5hbWUgbiAtPiBzdHJpbmdfb2ZfbmFtZSBuXG4gICAgfCBSR0IgKHIsIGcsIGIpIC0+IFByaW50Zi5zcHJpbnRmIFwicmdiKCVkLCVkLCVkKVwiIHIgZyBiXG4gICAgfCBSR0JfcGVyY2VudCAociwgZywgYikgLT4gUHJpbnRmLnNwcmludGYgXCJyZ2IoJWQlJSwlZCUlLCVkJSUpXCIgciBnIGJcbiAgICB8IFJHQkEgKHIsIGcsIGIsIGEpIC0+IFByaW50Zi5zcHJpbnRmIFwicmdiYSglZCwlZCwlZCwlZilcIiByIGcgYiBhXG4gICAgfCBSR0JBX3BlcmNlbnQgKHIsIGcsIGIsIGEpIC0+IFByaW50Zi5zcHJpbnRmIFwicmdiYSglZCUlLCVkJSUsJWQlJSwlZilcIiByIGcgYiBhXG4gICAgfCBIU0wgKGgsIHMsIGwpIC0+IFByaW50Zi5zcHJpbnRmIFwiaHNsKCVkLCVkJSUsJWQlJSlcIiBoIHMgbFxuICAgIHwgSFNMQSAoaCwgcywgbCwgYSkgLT4gUHJpbnRmLnNwcmludGYgXCJoc2xhKCVkLCVkJSUsJWQlJSwlZilcIiBoIHMgbCBhXG5cbiAgbGV0IGhleF9vZl9yZ2IgKHJlZCwgZ3JlZW4sIGJsdWUpID1cbiAgICBsZXQgaW5fcmFuZ2UgaSA9XG4gICAgICBpZiBpIDwgMCB8fCBpID4gMjU1XG4gICAgICB0aGVuIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChzdHJpbmdfb2ZfaW50IGkgXiBcIiBpcyBvdXQgb2YgdmFsaWQgcmFuZ2VcIikpXG4gICAgaW5cbiAgICBpbl9yYW5nZSByZWQ7XG4gICAgaW5fcmFuZ2UgZ3JlZW47XG4gICAgaW5fcmFuZ2UgYmx1ZTtcbiAgICBQcmludGYuc3ByaW50ZiBcIiMlMDJYJTAyWCUwMlhcIiByZWQgZ3JlZW4gYmx1ZVxuXG4gICgqIE9jYW1sIDwtPiBKUyByZXByZXNlbnRhdGlvbiAqKVxuICB0eXBlIGpzX3QgPSBKcy5qc19zdHJpbmcgSnMudFxuXG4gICgqIFRPRE8/IGJlIG1vcmUgcmVzdHJpY3RpdmUsIGNsaXAgdmFsdWVzIGludG8gc3RhbmRhcmQgcmFuZ2UgKilcbiAgbGV0IGpzX3Rfb2ZfanNfc3RyaW5nIHMgPVxuICAgIGxldCByZ2JfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cCAoSnMuYnl0ZXN0cmluZyBcIl5yZ2JcXFxcKFxcXFxzKlxcXFxkKixcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqXFxcXCkkXCIpXG4gICAgaW5cbiAgICBsZXQgcmdiX3BjdF9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwIChKcy5ieXRlc3RyaW5nIFwiXnJnYlxcXFwoXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiVcXFxcKSRcIilcbiAgICBpblxuICAgIGxldCByZ2JhX3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHBcbiAgICAgICAgKEpzLmJ5dGVzdHJpbmcgXCJecmdiYVxcXFwoXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKixcXFxccypcXFxcZCosXFxcXGQqXFxcXC4/XFxcXGQqXFxcXCkkXCIpXG4gICAgaW5cbiAgICBsZXQgcmdiYV9wY3RfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cFxuICAgICAgICAoSnMuYnl0ZXN0cmluZyBcIl5yZ2JhXFxcXChcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJSxcXFxcZCpcXFxcLj9cXFxcZCpcXFxcKSRcIilcbiAgICBpblxuICAgIGxldCBoc2xfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cCAoSnMuYnl0ZXN0cmluZyBcIl5oc2xcXFxcKFxcXFxzKlxcXFxkKixcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiVcXFxcKSRcIilcbiAgICBpblxuICAgIGxldCBoc2xhX3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHBcbiAgICAgICAgKEpzLmJ5dGVzdHJpbmcgXCJeaHNsYVxcXFwoXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJSxcXFxcZCpcXFxcLj9cXFxcZCpcXFxcKSRcIilcbiAgICBpblxuICAgIGlmIEpzLnRvX2Jvb2wgKHJnYl9yZSMjdGVzdCBzKVxuICAgICAgIHx8IEpzLnRvX2Jvb2wgKHJnYmFfcmUjI3Rlc3QgcylcbiAgICAgICB8fCBKcy50b19ib29sIChyZ2JfcGN0X3JlIyN0ZXN0IHMpXG4gICAgICAgfHwgSnMudG9fYm9vbCAocmdiYV9wY3RfcmUjI3Rlc3QgcylcbiAgICAgICB8fCBKcy50b19ib29sIChoc2xfcmUjI3Rlc3QgcylcbiAgICAgICB8fCBKcy50b19ib29sIChoc2xhX3JlIyN0ZXN0IHMpXG4gICAgdGhlbiBzXG4gICAgZWxzZSBpZiBMaXN0Lm1lbVxuICAgICAgICAgICAgICAoSnMudG9fc3RyaW5nIHMpXG4gICAgICAgICAgICAgIFsgXCJhbGljZWJsdWVcIlxuICAgICAgICAgICAgICA7IFwiYW50aXF1ZXdoaXRlXCJcbiAgICAgICAgICAgICAgOyBcImFxdWFcIlxuICAgICAgICAgICAgICA7IFwiYXF1YW1hcmluZVwiXG4gICAgICAgICAgICAgIDsgXCJhenVyZVwiXG4gICAgICAgICAgICAgIDsgXCJiZWlnZVwiXG4gICAgICAgICAgICAgIDsgXCJiaXNxdWVcIlxuICAgICAgICAgICAgICA7IFwiYmxhY2tcIlxuICAgICAgICAgICAgICA7IFwiYmxhbmNoZWRhbG1vbmRcIlxuICAgICAgICAgICAgICA7IFwiYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJibHVldmlvbGV0XCJcbiAgICAgICAgICAgICAgOyBcImJyb3duXCJcbiAgICAgICAgICAgICAgOyBcImJ1cmx5d29vZFwiXG4gICAgICAgICAgICAgIDsgXCJjYWRldGJsdWVcIlxuICAgICAgICAgICAgICA7IFwiY2hhcnRyZXVzZVwiXG4gICAgICAgICAgICAgIDsgXCJjaG9jb2xhdGVcIlxuICAgICAgICAgICAgICA7IFwiY29yYWxcIlxuICAgICAgICAgICAgICA7IFwiY29ybmZsb3dlcmJsdWVcIlxuICAgICAgICAgICAgICA7IFwiY29ybnNpbGtcIlxuICAgICAgICAgICAgICA7IFwiY3JpbXNvblwiXG4gICAgICAgICAgICAgIDsgXCJjeWFuXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtibHVlXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtjeWFuXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtnb2xkZW5yb2RcIlxuICAgICAgICAgICAgICA7IFwiZGFya2dyYXlcIlxuICAgICAgICAgICAgICA7IFwiZGFya2dyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtncmV5XCJcbiAgICAgICAgICAgICAgOyBcImRhcmtraGFraVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrbWFnZW50YVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrb2xpdmVncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrb3JhbmdlXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtvcmNoaWRcIlxuICAgICAgICAgICAgICA7IFwiZGFya3JlZFwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrc2FsbW9uXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtzZWFncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrc2xhdGVibHVlXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtzbGF0ZWdyYXlcIlxuICAgICAgICAgICAgICA7IFwiZGFya3NsYXRlZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrdHVycXVvaXNlXCJcbiAgICAgICAgICAgICAgOyBcImRhcmt2aW9sZXRcIlxuICAgICAgICAgICAgICA7IFwiZGVlcHBpbmtcIlxuICAgICAgICAgICAgICA7IFwiZGVlcHNreWJsdWVcIlxuICAgICAgICAgICAgICA7IFwiZGltZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJkaW1ncmV5XCJcbiAgICAgICAgICAgICAgOyBcImRvZGdlcmJsdWVcIlxuICAgICAgICAgICAgICA7IFwiZmlyZWJyaWNrXCJcbiAgICAgICAgICAgICAgOyBcImZsb3JhbHdoaXRlXCJcbiAgICAgICAgICAgICAgOyBcImZvcmVzdGdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImZ1Y2hzaWFcIlxuICAgICAgICAgICAgICA7IFwiZ2FpbnNib3JvXCJcbiAgICAgICAgICAgICAgOyBcImdob3N0d2hpdGVcIlxuICAgICAgICAgICAgICA7IFwiZ29sZFwiXG4gICAgICAgICAgICAgIDsgXCJnb2xkZW5yb2RcIlxuICAgICAgICAgICAgICA7IFwiZ3JheVwiXG4gICAgICAgICAgICAgIDsgXCJncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJncmVlbnllbGxvd1wiXG4gICAgICAgICAgICAgIDsgXCJncmV5XCJcbiAgICAgICAgICAgICAgOyBcImhvbmV5ZGV3XCJcbiAgICAgICAgICAgICAgOyBcImhvdHBpbmtcIlxuICAgICAgICAgICAgICA7IFwiaW5kaWFucmVkXCJcbiAgICAgICAgICAgICAgOyBcImluZGlnb1wiXG4gICAgICAgICAgICAgIDsgXCJpdm9yeVwiXG4gICAgICAgICAgICAgIDsgXCJraGFraVwiXG4gICAgICAgICAgICAgIDsgXCJsYXZlbmRlclwiXG4gICAgICAgICAgICAgIDsgXCJsYXZlbmRlcmJsdXNoXCJcbiAgICAgICAgICAgICAgOyBcImxhd25ncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJsZW1vbmNoaWZmb25cIlxuICAgICAgICAgICAgICA7IFwibGlnaHRibHVlXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Y29yYWxcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRjeWFuXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Z29sZGVucm9keWVsbG93XCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Z3JheVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Z3JleVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHBpbmtcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRzYWxtb25cIlxuICAgICAgICAgICAgICA7IFwibGlnaHRzZWFncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodHNreWJsdWVcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRzbGF0ZWdyYXlcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRzbGF0ZWdyZXlcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRzdGVlbGJsdWVcIlxuICAgICAgICAgICAgICA7IFwibGlnaHR5ZWxsb3dcIlxuICAgICAgICAgICAgICA7IFwibGltZVwiXG4gICAgICAgICAgICAgIDsgXCJsaW1lZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibGluZW5cIlxuICAgICAgICAgICAgICA7IFwibWFnZW50YVwiXG4gICAgICAgICAgICAgIDsgXCJtYXJvb25cIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtYXF1YW1hcmluZVwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1ibHVlXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bW9yY2hpZFwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1wdXJwbGVcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtc2VhZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtc2xhdGVibHVlXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXNwcmluZ2dyZWVuXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXR1cnF1b2lzZVwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW12aW9sZXRyZWRcIlxuICAgICAgICAgICAgICA7IFwibWlkbmlnaHRibHVlXCJcbiAgICAgICAgICAgICAgOyBcIm1pbnRjcmVhbVwiXG4gICAgICAgICAgICAgIDsgXCJtaXN0eXJvc2VcIlxuICAgICAgICAgICAgICA7IFwibW9jY2FzaW5cIlxuICAgICAgICAgICAgICA7IFwibmF2YWpvd2hpdGVcIlxuICAgICAgICAgICAgICA7IFwibmF2eVwiXG4gICAgICAgICAgICAgIDsgXCJvbGRsYWNlXCJcbiAgICAgICAgICAgICAgOyBcIm9saXZlXCJcbiAgICAgICAgICAgICAgOyBcIm9saXZlZHJhYlwiXG4gICAgICAgICAgICAgIDsgXCJvcmFuZ2VcIlxuICAgICAgICAgICAgICA7IFwib3JhbmdlcmVkXCJcbiAgICAgICAgICAgICAgOyBcIm9yY2hpZFwiXG4gICAgICAgICAgICAgIDsgXCJwYWxlZ29sZGVucm9kXCJcbiAgICAgICAgICAgICAgOyBcInBhbGVncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJwYWxldHVycXVvaXNlXCJcbiAgICAgICAgICAgICAgOyBcInBhbGV2aW9sZXRyZWRcIlxuICAgICAgICAgICAgICA7IFwicGFwYXlhd2hpcFwiXG4gICAgICAgICAgICAgIDsgXCJwZWFjaHB1ZmZcIlxuICAgICAgICAgICAgICA7IFwicGVydVwiXG4gICAgICAgICAgICAgIDsgXCJwaW5rXCJcbiAgICAgICAgICAgICAgOyBcInBsdW1cIlxuICAgICAgICAgICAgICA7IFwicG93ZGVyYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJwdXJwbGVcIlxuICAgICAgICAgICAgICA7IFwicmVkXCJcbiAgICAgICAgICAgICAgOyBcInJvc3licm93blwiXG4gICAgICAgICAgICAgIDsgXCJyb3lhbGJsdWVcIlxuICAgICAgICAgICAgICA7IFwic2FkZGxlYnJvd25cIlxuICAgICAgICAgICAgICA7IFwic2FsbW9uXCJcbiAgICAgICAgICAgICAgOyBcInNhbmR5YnJvd25cIlxuICAgICAgICAgICAgICA7IFwic2VhZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwic2Vhc2hlbGxcIlxuICAgICAgICAgICAgICA7IFwic2llbm5hXCJcbiAgICAgICAgICAgICAgOyBcInNpbHZlclwiXG4gICAgICAgICAgICAgIDsgXCJza3libHVlXCJcbiAgICAgICAgICAgICAgOyBcInNsYXRlYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJzbGF0ZWdyYXlcIlxuICAgICAgICAgICAgICA7IFwic2xhdGVncmV5XCJcbiAgICAgICAgICAgICAgOyBcInNub3dcIlxuICAgICAgICAgICAgICA7IFwic3ByaW5nZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwic3RlZWxibHVlXCJcbiAgICAgICAgICAgICAgOyBcInRhblwiXG4gICAgICAgICAgICAgIDsgXCJ0ZWFsXCJcbiAgICAgICAgICAgICAgOyBcInRoaXN0bGVcIlxuICAgICAgICAgICAgICA7IFwidG9tYXRvXCJcbiAgICAgICAgICAgICAgOyBcInR1cnF1b2lzZVwiXG4gICAgICAgICAgICAgIDsgXCJ2aW9sZXRcIlxuICAgICAgICAgICAgICA7IFwid2hlYXRcIlxuICAgICAgICAgICAgICA7IFwid2hpdGVcIlxuICAgICAgICAgICAgICA7IFwid2hpdGVzbW9rZVwiXG4gICAgICAgICAgICAgIDsgXCJ5ZWxsb3dcIlxuICAgICAgICAgICAgICA7IFwieWVsbG93Z3JlZW5cIlxuICAgICAgICAgICAgICBdXG4gICAgdGhlbiBzXG4gICAgZWxzZSByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoSnMudG9fc3RyaW5nIHMgXiBcIiBpcyBub3QgYSB2YWxpZCBjb2xvclwiKSlcblxuICBsZXQgbmFtZSBjbiA9IEpzLnN0cmluZyAoc3RyaW5nX29mX25hbWUgY24pXG5cbiAgbGV0IGpzID0gZnVuY3Rpb25cbiAgICB8IE5hbWUgbiAtPiBuYW1lIG5cbiAgICB8IChSR0IgXyB8IFJHQl9wZXJjZW50IF8gfCBSR0JBIF8gfCBSR0JBX3BlcmNlbnQgXyB8IEhTTCBfIHwgSFNMQSBfKSBhcyBjIC0+XG4gICAgICAgIEpzLnN0cmluZyAoc3RyaW5nX29mX3QgYylcblxuICBsZXQgbWwgYyA9XG4gICAgbGV0IHMgPSBKcy50b19zdHJpbmcgYyBpblxuICAgIHRyeSBOYW1lIChuYW1lX29mX3N0cmluZyBzKVxuICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBfIC0+IChcbiAgICAgIGxldCBmYWlsICgpID0gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKHMgXiBcIiBpcyBub3QgYSB2YWxpZCBjb2xvclwiKSkgaW5cbiAgICAgIGxldCByZV9yZ2IgPVxuICAgICAgICBSZWdleHAucmVnZXhwIFwiKHJnYmE/KVxcXFwoKD86KFxcXFxkKiksKFxcXFxkKiksKFxcXFxkKikoPzosKFxcXFxkKig/OlxcXFwuXFxcXGQqKT8pKT8pXFxcXClcIlxuICAgICAgaW5cbiAgICAgIGxldCByZV9yZ2JfcGN0ID1cbiAgICAgICAgUmVnZXhwLnJlZ2V4cCBcIihyZ2JhPylcXFxcKCg/OihcXFxcZCopJSwoXFxcXGQqKSUsKFxcXFxkKiklKD86LChcXFxcZCooPzpcXFxcLlxcXFxkKik/KSk/KVxcXFwpXCJcbiAgICAgIGluXG4gICAgICBsZXQgcmVfaHNsID1cbiAgICAgICAgUmVnZXhwLnJlZ2V4cCBcIihoc2xhPylcXFxcKCg/OihcXFxcZCopLChcXFxcZCopJSwoXFxcXGQqKSUoPzosKFxcXFxkKig/OlxcXFwuXFxcXGQqKT8pKT8pXFxcXClcIlxuICAgICAgaW5cbiAgICAgIGxldCBpX29mX3NfbyA9IGZ1bmN0aW9uXG4gICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgIHwgU29tZSBpIC0+IChcbiAgICAgICAgICAgIHRyeSBpbnRfb2Zfc3RyaW5nIGlcbiAgICAgICAgICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBzIHwgRmFpbHVyZSBzIC0+XG4gICAgICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcImNvbG9yIGNvbnZlcnNpb24gZXJyb3IgKFwiIF4gaSBeIFwiKTogXCIgXiBzKSkpXG4gICAgICBpblxuICAgICAgbGV0IGZfb2ZfcyBmID1cbiAgICAgICAgdHJ5IGZsb2F0X29mX3N0cmluZyBmXG4gICAgICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBzIHwgRmFpbHVyZSBzIC0+XG4gICAgICAgICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKFwiY29sb3IgY29udmVyc2lvbiBlcnJvciAoXCIgXiBmIF4gXCIpOiBcIiBeIHMpKVxuICAgICAgaW5cbiAgICAgIG1hdGNoIFJlZ2V4cC5zdHJpbmdfbWF0Y2ggcmVfcmdiIHMgMCB3aXRoXG4gICAgICB8IFNvbWUgciAtPiAoXG4gICAgICAgICAgbGV0IHJlZCA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMiBpblxuICAgICAgICAgIGxldCBncmVlbiA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMyBpblxuICAgICAgICAgIGxldCBibHVlID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA0IGluXG4gICAgICAgICAgbGV0IGFscGhhID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA1IGluXG4gICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAxIHdpdGhcbiAgICAgICAgICB8IFNvbWUgXCJyZ2JcIiAtPiAoXG4gICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIF8gLT4gZmFpbCAoKVxuICAgICAgICAgICAgICB8IE5vbmUgLT4gUkdCIChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlKSlcbiAgICAgICAgICB8IFNvbWUgXCJyZ2JhXCIgLT4gKFxuICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgICAgIHwgU29tZSBhIC0+IFJHQkEgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUsIGZfb2ZfcyBhKSlcbiAgICAgICAgICB8IFNvbWUgXyB8IE5vbmUgLT4gZmFpbCAoKSlcbiAgICAgIHwgTm9uZSAtPiAoXG4gICAgICAgICAgbWF0Y2ggUmVnZXhwLnN0cmluZ19tYXRjaCByZV9yZ2JfcGN0IHMgMCB3aXRoXG4gICAgICAgICAgfCBTb21lIHIgLT4gKFxuICAgICAgICAgICAgICBsZXQgcmVkID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAyIGluXG4gICAgICAgICAgICAgIGxldCBncmVlbiA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMyBpblxuICAgICAgICAgICAgICBsZXQgYmx1ZSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNCBpblxuICAgICAgICAgICAgICBsZXQgYWxwaGEgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDUgaW5cbiAgICAgICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAxIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIFwicmdiXCIgLT4gKFxuICAgICAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT4gZmFpbCAoKVxuICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IFJHQl9wZXJjZW50IChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlKSlcbiAgICAgICAgICAgICAgfCBTb21lIFwicmdiYVwiIC0+IChcbiAgICAgICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgICAgICAgICB8IFNvbWUgYSAtPlxuICAgICAgICAgICAgICAgICAgICAgIFJHQkFfcGVyY2VudCAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSwgZl9vZl9zIGEpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIHwgU29tZSBfIHwgTm9uZSAtPiBmYWlsICgpKVxuICAgICAgICAgIHwgTm9uZSAtPiAoXG4gICAgICAgICAgICAgIG1hdGNoIFJlZ2V4cC5zdHJpbmdfbWF0Y2ggcmVfaHNsIHMgMCB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSByIC0+IChcbiAgICAgICAgICAgICAgICAgIGxldCByZWQgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDIgaW5cbiAgICAgICAgICAgICAgICAgIGxldCBncmVlbiA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMyBpblxuICAgICAgICAgICAgICAgICAgbGV0IGJsdWUgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDQgaW5cbiAgICAgICAgICAgICAgICAgIGxldCBhbHBoYSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNSBpblxuICAgICAgICAgICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAxIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgU29tZSBcImhzbFwiIC0+IChcbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT4gZmFpbCAoKVxuICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBIU0wgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUpKVxuICAgICAgICAgICAgICAgICAgfCBTb21lIFwiaHNsYVwiIC0+IChcbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgYSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBIU0xBIChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlLCBmX29mX3MgYSkpXG4gICAgICAgICAgICAgICAgICB8IFNvbWUgXyB8IE5vbmUgLT4gZmFpbCAoKSlcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGZhaWwgKCkpKSlcbmVuZFxuXG5tb2R1bGUgTGVuZ3RoID0gc3RydWN0XG4gICgqIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtdmFsdWVzLyNsZW5ndGhzICopXG5cbiAgKCogVE9ETzpcbiAgICAge1tcbiAgICAgICB0eXBlIGpzX3QgPSBwcml2YXRlIEpzLnN0cmluZyBKcy50XG4gICAgICAgdmFsIGpzX3Rfb2ZfdFxuICAgICAgIHZhbCB0X29mX2pzX3RcbiAgICAgICB2YWwgdF9vZl9zdHJpbmdcbiAgICAgXX1cbiAgKilcblxuICB0eXBlIHQgPVxuICAgIHwgWmVyb1xuICAgICgqIHJlbGF0aXZlICopXG4gICAgfCBFbSBvZiBmbG9hdFxuICAgIHwgRXggb2YgZmxvYXRcbiAgICB8IFB4IG9mIGZsb2F0XG4gICAgfCBHZCBvZiBmbG9hdFxuICAgIHwgUmVtIG9mIGZsb2F0XG4gICAgfCBWdyBvZiBmbG9hdFxuICAgIHwgVmggb2YgZmxvYXRcbiAgICB8IFZtIG9mIGZsb2F0XG4gICAgfCBDaCBvZiBmbG9hdFxuICAgICgqIGFic29sdXRlICopXG4gICAgfCBNbSBvZiBmbG9hdFxuICAgIHwgQ20gb2YgZmxvYXRcbiAgICB8IEluIG9mIGZsb2F0XG4gICAgfCBQdCBvZiBmbG9hdFxuICAgIHwgUGMgb2YgZmxvYXRcblxuICBsZXQgc3RyaW5nX29mX3QgPSBmdW5jdGlvblxuICAgIHwgWmVybyAtPiBcIjBcIlxuICAgIHwgRW0gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiZW1cIlxuICAgIHwgRXggZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiZXhcIlxuICAgIHwgUHggZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwicHhcIlxuICAgIHwgR2QgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiZ2RcIlxuICAgIHwgUmVtIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInJlbVwiXG4gICAgfCBWdyBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJ2d1wiXG4gICAgfCBWaCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJ2aFwiXG4gICAgfCBWbSBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJ2bVwiXG4gICAgfCBDaCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJjaFwiXG4gICAgfCBNbSBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJtbVwiXG4gICAgfCBDbSBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJjbVwiXG4gICAgfCBJbiBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJpblwiXG4gICAgfCBQdCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJwdFwiXG4gICAgfCBQYyBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJwY1wiXG5cbiAgdHlwZSBqc190ID0gSnMuanNfc3RyaW5nIEpzLnRcblxuICBsZXQganMgdCA9IEpzLnN0cmluZyAoc3RyaW5nX29mX3QgdClcblxuICBsZXQgbWwgdCA9XG4gICAgbGV0IHMgPSBKcy50b19zdHJpbmcgdCBpblxuICAgIGlmIFN0cmluZy5lcXVhbCBzIFwiMFwiXG4gICAgdGhlbiBaZXJvXG4gICAgZWxzZVxuICAgICAgbGV0IGZhaWwgKCkgPSByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAocyBeIFwiIGlzIG5vdCBhIHZhbGlkIGxlbmd0aFwiKSkgaW5cbiAgICAgIGxldCByZSA9IFJlZ2V4cC5yZWdleHAgXCJeKFxcXFxkKig/OlxcXFwuXFxcXGQqKT8pXFxcXHMqKFxcXFxTKikkXCIgaW5cbiAgICAgIG1hdGNoIFJlZ2V4cC5zdHJpbmdfbWF0Y2ggcmUgcyAwIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICB8IFNvbWUgciAtPiAoXG4gICAgICAgICAgbGV0IGYgPVxuICAgICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAxIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgICB8IFNvbWUgZiAtPiAoXG4gICAgICAgICAgICAgICAgdHJ5IGZsb2F0X29mX3N0cmluZyBmXG4gICAgICAgICAgICAgICAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IHMgLT5cbiAgICAgICAgICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcImxlbmd0aCBjb252ZXJzaW9uIGVycm9yOiBcIiBeIHMpKSlcbiAgICAgICAgICBpblxuICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMiB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICB8IFNvbWUgXCJlbVwiIC0+IEVtIGZcbiAgICAgICAgICB8IFNvbWUgXCJleFwiIC0+IEV4IGZcbiAgICAgICAgICB8IFNvbWUgXCJweFwiIC0+IFB4IGZcbiAgICAgICAgICB8IFNvbWUgXCJnZFwiIC0+IEdkIGZcbiAgICAgICAgICB8IFNvbWUgXCJyZW1cIiAtPiBSZW0gZlxuICAgICAgICAgIHwgU29tZSBcInZ3XCIgLT4gVncgZlxuICAgICAgICAgIHwgU29tZSBcInZoXCIgLT4gVmggZlxuICAgICAgICAgIHwgU29tZSBcInZtXCIgLT4gVm0gZlxuICAgICAgICAgIHwgU29tZSBcImNoXCIgLT4gQ2ggZlxuICAgICAgICAgIHwgU29tZSBcIm1tXCIgLT4gTW0gZlxuICAgICAgICAgIHwgU29tZSBcImNtXCIgLT4gQ20gZlxuICAgICAgICAgIHwgU29tZSBcImluXCIgLT4gSW4gZlxuICAgICAgICAgIHwgU29tZSBcInB0XCIgLT4gUHQgZlxuICAgICAgICAgIHwgU29tZSBcInBjXCIgLT4gUGMgZlxuICAgICAgICAgIHwgU29tZSBfIC0+IGZhaWwgKCkpXG5lbmRcblxubW9kdWxlIEFuZ2xlID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBEZWcgb2YgZmxvYXRcbiAgICB8IEdyYWQgb2YgZmxvYXRcbiAgICB8IFJhZCBvZiBmbG9hdFxuICAgIHwgVHVybnMgb2YgZmxvYXRcblxuICBsZXQgc3RyaW5nX29mX3QgPSBmdW5jdGlvblxuICAgIHwgRGVnIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImRlZ1wiXG4gICAgfCBHcmFkIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImdyYWRcIlxuICAgIHwgUmFkIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInJhZFwiXG4gICAgfCBUdXJucyBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJ0dXJuc1wiXG5cbiAgdHlwZSBqc190ID0gSnMuanNfc3RyaW5nIEpzLnRcblxuICBsZXQganMgdCA9IEpzLnN0cmluZyAoc3RyaW5nX29mX3QgdClcblxuICBsZXQgbWwgaiA9XG4gICAgbGV0IHMgPSBKcy50b19zdHJpbmcgaiBpblxuICAgIGxldCByZSA9IFJlZ2V4cC5yZWdleHAgXCJeKFxcXFxkKig/OlxcXFwuXFxcXGQqKSkoZGVnfGdyYWR8cmFkfHR1cm5zKSRcIiBpblxuICAgIGxldCBmYWlsICgpID0gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKHMgXiBcIiBpcyBub3QgYSB2YWxpZCBsZW5ndGhcIikpIGluXG4gICAgbWF0Y2ggUmVnZXhwLnN0cmluZ19tYXRjaCByZSBzIDAgd2l0aFxuICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgfCBTb21lIHIgLT4gKFxuICAgICAgICBsZXQgZiA9XG4gICAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAxIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgIHwgU29tZSBmIC0+IChcbiAgICAgICAgICAgICAgdHJ5IGZsb2F0X29mX3N0cmluZyBmXG4gICAgICAgICAgICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBzIC0+XG4gICAgICAgICAgICAgICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKFwibGVuZ3RoIGNvbnZlcnNpb24gZXJyb3I6IFwiIF4gcykpKVxuICAgICAgICBpblxuICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDIgd2l0aFxuICAgICAgICB8IFNvbWUgXCJkZWdcIiAtPiBEZWcgZlxuICAgICAgICB8IFNvbWUgXCJncmFkXCIgLT4gR3JhZCBmXG4gICAgICAgIHwgU29tZSBcInJhZFwiIC0+IFJhZCBmXG4gICAgICAgIHwgU29tZSBcInR1cm5zXCIgLT4gVHVybnMgZlxuICAgICAgICB8IFNvbWUgXyB8IE5vbmUgLT4gZmFpbCAoKSlcbmVuZFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbigqKiBKYXZhc2NyaXB0IGV2ZW50cy4gKilcblxub3BlbiEgSW1wb3J0XG5tb2R1bGUgVHlwID0gRG9tX2h0bWwuRXZlbnRcblxudHlwZSBsaXN0ZW5lciA9IERvbV9odG1sLmV2ZW50X2xpc3RlbmVyX2lkXG5cbmxldCBsaXN0ZW4gPyhjYXB0dXJlID0gZmFsc2UpIHRhcmdldCB0eXAgY2IgPVxuICBEb21faHRtbC5hZGRFdmVudExpc3RlbmVyXG4gICAgdGFyZ2V0XG4gICAgdHlwXG4gICAgKERvbV9odG1sLmZ1bGxfaGFuZGxlciAoZnVuIG4gZSAtPiBKcy5ib29sIChjYiBuIGUpKSlcbiAgICAoSnMuYm9vbCBjYXB0dXJlKVxuXG5sZXQgc3RvcF9saXN0ZW4gPSBEb21faHRtbC5yZW1vdmVFdmVudExpc3RlbmVyXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE0IEh1Z28gSGV1emFyZFxuICogQ29weXJpZ2h0IChDKSAyMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG5sZXQgeG1sbnMgPSBKcy5zdHJpbmcgXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG5cbigqIHRyYW5zbGF0ZSBzcGVjIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL2lkbC5odG1sICopXG4oKiBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvc3RydWN0Lmh0bWwgKilcblxudHlwZSBlcnJvcl9jb2RlID1cbiAgfCBXUk9OR19UWVBFX0VSUlxuICB8IElOVkFMSURfVkFMVUVfRVJSXG4gIHwgTUFUUklYX05PVF9JTlZFUlRBQkxFXG5cbmNsYXNzIHR5cGUgc3ZnX2Vycm9yID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBKcy5lcnJvclxuXG4gICAgbWV0aG9kIGNvZGUgOiBlcnJvcl9jb2RlIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuZXhjZXB0aW9uIFNWR0Vycm9yIG9mIHN2Z19lcnJvclxuXG50eXBlIGxlbmd0aFVuaXRUeXBlID1cbiAgfCBMRU5HVEhUWVBFX1VOS05PV05cbiAgfCBMRU5HVEhUWVBFX05VTUJFUlxuICB8IExFTkdUSFRZUEVfUEVSQ0VOVEFHRVxuICB8IExFTkdUSFRZUEVfRU1TXG4gIHwgTEVOR1RIVFlQRV9FWFNcbiAgfCBMRU5HVEhUWVBFX1BYXG4gIHwgTEVOR1RIVFlQRV9DTVxuICB8IExFTkdUSFRZUEVfTU1cbiAgfCBMRU5HVEhUWVBFX0lOXG4gIHwgTEVOR1RIVFlQRV9QVFxuICB8IExFTkdUSFRZUEVfUENcblxudHlwZSBhbmdsZVVuaXRUeXBlID1cbiAgfCBBTkdMRVRZUEVfVU5LTk9XTlxuICB8IEFOR0xFVFlQRV9VTlNQRUNJRklFRFxuICB8IEFOR0xFVFlQRV9ERUdcbiAgfCBBTkdMRVRZUEVfUkFEXG4gIHwgQU5HTEVUWVBFX0dSQURcblxudHlwZSBjb2xvclR5cGUgPVxuICB8IENPTE9SVFlQRV9VTktOT1dOXG4gIHwgQ09MT1JUWVBFX1JHQkNPTE9SXG4gIHwgQ09MT1JUWVBFX1JHQkNPTE9SX0lDQ0NPTE9SXG4gIHwgQ09MT1JUWVBFX0NVUlJFTlRDT0xPUlxuXG50eXBlIGFsaWdubWVudFR5cGUgPVxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fVU5LTk9XTlxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fTk9ORVxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JTllNSU5cbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUlOXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JTlxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JTllNSURcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUlEXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JRFxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1JTllNQVhcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUFYXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1BWFxuXG50eXBlIG1lZXRPclNsaWNlVHlwZSA9XG4gIHwgTUVFVE9SU0xJQ0VfVU5LTk9XTlxuICB8IE1FRVRPUlNMSUNFX01FRVRcbiAgfCBNRUVUT1JTTElDRV9TTElDRVxuXG50eXBlIHRyYW5zZm9ybVR5cGUgPVxuICB8IFRSQU5TRk9STV9VTktOT1dOXG4gIHwgVFJBTlNGT1JNX01BVFJJWFxuICB8IFRSQU5TRk9STV9UUkFOU0xBVEVcbiAgfCBUUkFOU0ZPUk1fU0NBTEVcbiAgfCBUUkFOU0ZPUk1fUk9UQVRFXG4gIHwgVFJBTlNGT1JNX1NLRVdYXG4gIHwgVFJBTlNGT1JNX1NLRVdZXG5cbnR5cGUgem9vbUFuZFBhblR5cGUgPVxuICB8IFpPT01BTkRQQU5fVU5LTk9XTlxuICB8IFpPT01BTkRQQU5fRElTQUJMRVxuICB8IFpPT01BTkRQQU5fTUFHTklGWVxuXG50eXBlIGxlbmd0aEFkanVzdCA9XG4gIHwgTEVOR1RIQURKVVNUX1VOS05PV05cbiAgfCBMRU5HVEhBREpVU1RfU1BBQ0lOR1xuICB8IExFTkdUSEFESlVTVF9TUEFDSU5HQU5ER0xZUEhTXG5cbnR5cGUgdW5pdFR5cGUgPVxuICB8IFVOSVRfVFlQRV9VTktOT1dOXG4gIHwgVU5JVF9UWVBFX1VTRVJTUEFDRU9OVVNFXG4gIHwgVU5JVF9UWVBFX09CSkVDVEJPVU5ESU5HQk9YXG5cbigqIGludGVyZmFjZSBTVkdSZW5kZXJpbmdJbnRlbnQgKilcbnR5cGUgaW50ZW50VHlwZSA9XG4gIHwgUkVOREVSSU5HX0lOVEVOVF9VTktOT1dOXG4gIHwgUkVOREVSSU5HX0lOVEVOVF9BVVRPXG4gIHwgUkVOREVSSU5HX0lOVEVOVF9QRVJDRVBUVUFMXG4gIHwgUkVOREVSSU5HX0lOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUNcbiAgfCBSRU5ERVJJTkdfSU5URU5UX1NBVFVSQVRJT05cbiAgfCBSRU5ERVJJTkdfSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQ1xuXG4oKiBQYXRoIFNlZ21lbnQgVHlwZXMgKilcbnR5cGUgcGF0aFNlZ21lbnRUeXBlID1cbiAgfCBQQVRIU0VHX1VOS05PV05cbiAgfCBQQVRIU0VHX0NMT1NFUEFUSFxuICB8IFBBVEhTRUdfTU9WRVRPX0FCU1xuICB8IFBBVEhTRUdfTU9WRVRPX1JFTFxuICB8IFBBVEhTRUdfTElORVRPX0FCU1xuICB8IFBBVEhTRUdfTElORVRPX1JFTFxuICB8IFBBVEhTRUdfQ1VSVkVUT19DVUJJQ19BQlNcbiAgfCBQQVRIU0VHX0NVUlZFVE9fQ1VCSUNfUkVMXG4gIHwgUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19BQlNcbiAgfCBQQVRIU0VHX0NVUlZFVE9fUVVBRFJBVElDX1JFTFxuICB8IFBBVEhTRUdfQVJDX0FCU1xuICB8IFBBVEhTRUdfQVJDX1JFTFxuICB8IFBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfQUJTXG4gIHwgUEFUSFNFR19MSU5FVE9fSE9SSVpPTlRBTF9SRUxcbiAgfCBQQVRIU0VHX0xJTkVUT19WRVJUSUNBTF9BQlNcbiAgfCBQQVRIU0VHX0xJTkVUT19WRVJUSUNBTF9SRUxcbiAgfCBQQVRIU0VHX0NVUlZFVE9fQ1VCSUNfU01PT1RIX0FCU1xuICB8IFBBVEhTRUdfQ1VSVkVUT19DVUJJQ19TTU9PVEhfUkVMXG4gIHwgUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfQUJTXG4gIHwgUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19TTU9PVEhfUkVMXG5cbigqIHRleHRQYXRoIE1ldGhvZCBUeXBlcyAqKVxudHlwZSB0ZXh0UGF0aE1ldGhvZFR5cGUgPVxuICB8IFRFWFRQQVRIX01FVEhPRFRZUEVfVU5LTk9XTlxuICB8IFRFWFRQQVRIX01FVEhPRFRZUEVfQUxJR05cbiAgfCBURVhUUEFUSF9NRVRIT0RUWVBFX1NUUkVUQ0hcblxuKCogdGV4dFBhdGggU3BhY2luZyBUeXBlcyAqKVxudHlwZSB0ZXh0UGF0aFNwYWNpbmdUeXBlID1cbiAgfCBURVhUUEFUSF9TUEFDSU5HVFlQRV9VTktOT1dOXG4gIHwgVEVYVFBBVEhfU1BBQ0lOR1RZUEVfQVVUT1xuICB8IFRFWFRQQVRIX1NQQUNJTkdUWVBFX0VYQUNUXG5cbigqIFNwcmVhZCBNZXRob2QgVHlwZXMgKilcbnR5cGUgc3ByZWFkTWV0aG9kVHlwZSA9XG4gIHwgU1BSRUFETUVUSE9EX1VOS05PV05cbiAgfCBTUFJFQURNRVRIT0RfUEFEXG4gIHwgU1BSRUFETUVUSE9EX1JFRkxFQ1RcbiAgfCBTUFJFQURNRVRIT0RfUkVQRUFUXG5cbnR5cGUgc3VzcGVuZEhhbmRsZUlEXG5cbigqKioqKVxuXG5jbGFzcyB0eXBlIFsnYV0gYW5pbWF0ZWQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYmFzZVZhbCA6ICdhIHByb3BcblxuICAgIG1ldGhvZCBhbmltVmFsIDogJ2EgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBbJ2FdIGxpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbnVtYmVyT2ZJdGVtcyA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xlYXIgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbml0aWFsaXplIDogJ2EgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGdldEl0ZW0gOiBpbnQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGluc2VydEl0ZW1CZWZvcmUgOiAnYSAtPiBpbnQgLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2VJdGVtIDogJ2EgLT4gaW50IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVJdGVtIDogaW50IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBhcHBlbmRJdGVtIDogJ2EgLT4gJ2EgbWV0aFxuICBlbmRcblxuKCoqKiopXG5cbigqIGludGVyZmFjZSBTVkdFbGVtZW50ICopXG5jbGFzcyB0eXBlIGVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IERvbS5lbGVtZW50XG5cbiAgICBtZXRob2QgaWQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgeG1sYmFzZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvd25lclNWR0VsZW1lbnQgOiBzdmdFbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZpZXdwb3J0RWxlbWVudCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRTdHJpbmcgKilcbmFuZCBhbmltYXRlZFN0cmluZyA9IFtqc19zdHJpbmcgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkQm9vbGVhbiAqKVxuYW5kIGFuaW1hdGVkQm9vbGVhbiA9IFtib29sIHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdTdHJpbmdMaXN0ICopXG5hbmQgc3RyaW5nTGlzdCA9IFtqc19zdHJpbmcgdF0gbGlzdFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiAqKVxuYW5kIGFuaW1hdGVkRW51bWVyYXRpb24gPSBbaW50ICgqc2hvcnQqKV0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkSW50ZWdlciAqKVxuYW5kIGFuaW1hdGVkSW50ZWdlciA9IFtpbnRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZE51bWJlciAqKVxuYW5kIGFuaW1hdGVkTnVtYmVyID0gW2Zsb2F0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTnVtYmVyTGlzdCAqKVxuYW5kIG51bWJlckxpc3QgPSBbbnVtYmVyIHRdIGxpc3RcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkTnVtYmVyTGlzdCAqKVxuYW5kIGFuaW1hdGVkTnVtYmVyTGlzdCA9IFtudW1iZXJMaXN0IHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdMZW5ndGggKilcbmFuZCBsZW5ndGggPVxuICBvYmplY3RcbiAgICBtZXRob2QgdW5pdFR5cGUgOiBsZW5ndGhVbml0VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWVJblNwZWNpZmllZFVuaXRzIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlQXNTdHJpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmV3VmFsdWVTcGVjaWZpZWRVbml0cyA6IGxlbmd0aFVuaXRUeXBlIC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbnZlcnRUb1NwZWNpZmllZFVuaXRzIDogbGVuZ3RoVW5pdFR5cGUgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRMZW5ndGggKilcbmFuZCBhbmltYXRlZExlbmd0aCA9IFtsZW5ndGggdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0xlbmd0aExpc3QgKilcbmFuZCBsZW5ndGhMaXN0ID0gW2xlbmd0aCB0XSBsaXN0XG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZExlbmd0aExpc3QgKilcbmFuZCBhbmltYXRlZExlbmd0aExpc3QgPSBbbGVuZ3RoTGlzdCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5nbGUgKilcbmFuZCBhbmdsZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB1bml0VHlwZSA6IGFuZ2xlVW5pdFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlSW5TcGVjaWZpZWRVbml0cyA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZUFzU3RyaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5ld1ZhbHVlU3BlY2lmaWVkVW5pdHMgOiBhbmdsZVVuaXRUeXBlIC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbnZlcnRUb1NwZWNpZmllZFVuaXRzIDogYW5nbGVVbml0VHlwZSAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZEFuZ2xlICopXG5hbmQgYW5pbWF0ZWRBbmdsZSA9IFthbmdsZSB0XSBhbmltYXRlZFxuXG4oKiBYWFhYWCBNb3ZlIGl0ICopXG5hbmQgcmdiQ29sb3IgPSBvYmplY3QgZW5kXG5cbigqIGludGVyZmFjZSBTVkdDb2xvciAqKVxuYW5kIGNvbG9yID1cbiAgb2JqZWN0XG4gICAgKCogWFhYIGluaGVyaXQgY3NzVmFsdWUgKilcbiAgICBtZXRob2QgY29sb3JUeXBlIDogY29sb3JUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZ2JDb2xvciA6IHJnYkNvbG9yIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGljY0NvbG9yIDogaWNjQ29sb3IgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2V0UkdCQ29sb3IgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRSR0JDb2xvcklDQ0NvbG9yIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0Q29sb3IgOiBjb2xvclR5cGUgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHSUNDQ29sb3IgKilcbmFuZCBpY2NDb2xvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjb2xvclByb2ZpbGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29sb3JzIDogbnVtYmVyTGlzdCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdSZWN0ICopXG5hbmQgcmVjdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkUmVjdCAqKVxuYW5kIGFuaW1hdGVkUmVjdCA9IFtyZWN0IHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdTdHlsYWJsZSAqKVxuYW5kIHN0eWxhYmxlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNsYXNzTmFtZSA6IGFuaW1hdGVkU3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0eWxlIDogRG9tX2h0bWwuY3NzU3R5bGVEZWNsYXJhdGlvbiB0IHJlYWRvbmx5X3Byb3BcbiAgICAoKiAgIENTU1ZhbHVlIGdldFByZXNlbnRhdGlvbkF0dHJpYnV0ZShpbiBET01TdHJpbmcgbmFtZSk7ICopXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTG9jYXRhYmxlICopXG5hbmQgbG9jYXRhYmxlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG5lYXJlc3RWaWV3cG9ydEVsZW1lbnQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZhcnRoZXN0Vmlld3BvcnRFbGVtZW50IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRCQm94IDogcmVjdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDVE0gOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2NyZWVuQ1RNIDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFRyYW5zZm9ybVRvRWxlbWVudCA6IGVsZW1lbnQgdCAtPiBtYXRyaXggdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVHJhbnNmb3JtYWJsZSAqKVxuYW5kIHRyYW5zZm9ybWFibGUgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGxvY2F0YWJsZVxuXG4gICAgbWV0aG9kIHRyYW5zZm9ybSA6IGFuaW1hdGVkVHJhbnNmb3JtTGlzdCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUZXN0cyAqKVxuYW5kIHRlc3RzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHJlcXVpcmVkRmVhdHVyZXMgOiBzdHJpbmdMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlcXVpcmVkRXh0ZW5zaW9ucyA6IHN0cmluZ0xpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3lzdGVtTGFuZ3VhZ2UgOiBzdHJpbmdMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhhc0V4dGVuc2lvbiA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTGFuZ1NwYWNlICopXG5hbmQgbGFuZ1NwYWNlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHhtbGxhbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgeG1sc3BhY2UgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCAqKVxuYW5kIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCA6IGFuaW1hdGVkQm9vbGVhbiB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdGaXRUb1ZpZXdCb3ggKilcbmFuZCBmaXRUb1ZpZXdCb3ggPVxuICBvYmplY3RcbiAgICBtZXRob2Qgdmlld0JveCA6IGFuaW1hdGVkUmVjdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmVzZXJ2ZUFzcGVjdFJhdGlvIDogYW5pbWF0ZWRQcmVzZXJ2ZUFzcGVjdFJhdGlvIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1pvb21BbmRQYW4gKilcbmFuZCB6b29tQW5kUGFuID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHpvb21BbmRQYW4gOiB6b29tQW5kUGFuVHlwZSBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVmlld1NwZWMgKilcbmFuZCB2aWV3U3BlYyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgem9vbUFuZFBhblxuXG4gICAgaW5oZXJpdCBmaXRUb1ZpZXdCb3hcblxuICAgIG1ldGhvZCB0cmFuc2Zvcm0gOiB0cmFuc2Zvcm1MaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZpZXdUYXJnZXQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZpZXdCb3hTdHJpbmcgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJlc2VydmVBc3BlY3RSYXRpb1N0cmluZyA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0cmFuc2Zvcm1TdHJpbmcgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgdmlld1RhcmdldFN0cmluZyA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdVUklSZWZlcmVuY2UgKilcbmFuZCB1cmlSZWZlcmVuY2UgPVxuICBvYmplY3RcbiAgICBtZXRob2QgaHJlZiA6IGFuaW1hdGVkU3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0NTU1J1bGUgOiBDU1NSdWxlICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTE9SX1BST0ZJTEVfUlVMRSA9IDc7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRG9jdW1lbnQgKilcbmFuZCBkb2N1bWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2VsZW1lbnRdIERvbS5kb2N1bWVudFxuXG4gICAgKCpYWFggaW5oZXJpdCBkb2N1bWVudEV2ZW50ICopXG4gICAgbWV0aG9kIHRpdGxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlZmVycmVyIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRvbWFpbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfVVJMIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJvb3RFbGVtZW50IDogc3ZnRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG4gICAgKCogcm9vdEVsZW1lbnQgd2lsbCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbiBhbiBodG1sIGNvbnRleHQgKilcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdTVkdFbGVtZW50ICopXG5hbmQgc3ZnRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCBsb2NhdGFibGVcblxuICAgIGluaGVyaXQgZml0VG9WaWV3Qm94XG5cbiAgICBpbmhlcml0IHpvb21BbmRQYW5cblxuICAgICgqWFhYIGluaGVyaXQgZG9jdW1lbnRldmVudCwgdmlld2NzcywgZG9jdW1lbnRjc3MgKilcbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnRTY3JpcHRUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnRTdHlsZVR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgdmlld3BvcnQgOiByZWN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBpeGVsVW5pdFRvTWlsbGltZXRlclggOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGl4ZWxVbml0VG9NaWxsaW1ldGVyWSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5QaXhlbFVuaXRUb01pbGxpbWV0ZXJYIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNjcmVlblBpeGVsVW5pdFRvTWlsbGltZXRlclkgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXNlQ3VycmVudFZpZXcgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRWaWV3IDogdmlld1NwZWMgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFNjYWxlIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRUcmFuc2xhdGUgOiBwb2ludCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdXNwZW5kUmVkcmF3IDogaW50IC0+IHN1c3BlbmRIYW5kbGVJRCBtZXRoXG5cbiAgICBtZXRob2QgdW5zdXNwZW5kUmVkcmF3IDogc3VzcGVuZEhhbmRsZUlEIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc3VzcGVuZFJlZHJhd0FsbCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZvcmNlUmVkcmF3IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcGF1c2VBbmltYXRpb25zIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5wYXVzZUFuaW1hdGlvbnMgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhbmltYXRpb25zUGF1c2VkIDogYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDdXJyZW50VGltZSA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRDdXJyZW50VGltZSA6IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbnRlcnNlY3Rpb25MaXN0IDogcmVjdCB0IC0+IGVsZW1lbnQgdCAtPiBlbGVtZW50IERvbS5ub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbmNsb3N1cmVMaXN0IDogcmVjdCB0IC0+IGVsZW1lbnQgdCAtPiBlbGVtZW50IERvbS5ub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBjaGVja0ludGVyc2VjdGlvbiA6IGVsZW1lbnQgdCAtPiByZWN0IHQgLT4gYm9vbCB0XG5cbiAgICBtZXRob2QgY2hlY2tFbmNsb3N1cmUgOiBlbGVtZW50IHQgLT4gcmVjdCB0IC0+IGJvb2wgdFxuXG4gICAgbWV0aG9kIGRlc2VsZWN0QWxsIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHTnVtYmVyIDogbnVtYmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR0xlbmd0aCA6IGxlbmd0aCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdBbmdsZSA6IGFuZ2xlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BvaW50IDogcG9pbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHTWF0cml4IDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1JlY3QgOiByZWN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1RyYW5zZm9ybSA6IHRyYW5zZm9ybSB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdUcmFuc2Zvcm1Gcm9tTWF0cml4IDogbWF0cml4IHQgLT4gdHJhbnNmb3JtIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRCeUlkIDoganNfc3RyaW5nIHQgLT4gRG9tLmVsZW1lbnQgdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHR0VsZW1lbnQgKilcbmFuZCBnRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRGVmc0VsZW1lbnQgKilcbmFuZCBkZWZzRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG4gICAgKCogWFhYWFhYWCA/IGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXQgKilcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdEZXNjRWxlbWVudCAqKVxuYW5kIGRlc2NFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICAgICgqIFhYWFhYWFggPyBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0ICopXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGl0bGVFbGVtZW50ICopXG5hbmQgdGl0bGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1N5bWJvbEVsZW1lbnQgKilcbmFuZCBzeW1ib2xFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IGZpdFRvVmlld0JveFxuXG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1VzZUVsZW1lbnQgKilcbmFuZCB1c2VFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGluc3RhbmNlUm9vdCA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbmltYXRlZEluc3RhbmNlUm9vdCA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBlbGVtZW50SW5zdGFuY2UgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgY29ycmVzcG9uZGluZ0VsZW1lbnQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvcnJlc3BvbmRpbmdVc2VFbGVtZW50IDogdXNlRWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXJlbnROb2RlIDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNoaWxkTm9kZXMgOiBlbGVtZW50SW5zdGFuY2VMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpcnN0Q2hpbGQgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGFzdENoaWxkIDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZXZpb3VzU2libGluZyA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuZXh0U2libGluZyA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdFbGVtZW50SW5zdGFuY2VMaXN0ICopXG5hbmQgZWxlbWVudEluc3RhbmNlTGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gZWxlbWVudEluc3RhbmNlIHRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdJbWFnZUVsZW1lbnQgKilcbmFuZCBpbWFnZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gICAgKCogcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkUHJlc2VydmVBc3BlY3RSYXRpbyBwcmVzZXJ2ZUFzcGVjdFJhdGlvICopXG4gIGVuZFxuXG5hbmQgc3dpdGNoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG4gIGVuZFxuXG4oKiBYWFggZGVwcmVjYXRlZCA9PiBpbnRlcmZhY2UgR2V0U1ZHRG9jdW1lbnQgPT4gU1ZHRG9jdW1lbnQgZ2V0U1ZHRG9jdW1lbnQoKSAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHU3R5bGVFbGVtZW50ICopXG5hbmQgc3R5bGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgbWV0aG9kIHR5cGVfIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1lZGlhIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRpdGxlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BvaW50ICopXG5hbmQgcG9pbnQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgeCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1hdHJpeFRyYW5zZm9ybSA6IG1hdHJpeCB0IC0+IHBvaW50IHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BvaW50TGlzdCAqKVxuYW5kIHBvaW50TGlzdCA9IFtwb2ludCB0XSBsaXN0XG5cbigqIGludGVyZmFjZSBTVkdNYXRyaXggKilcbmFuZCBtYXRyaXggPVxuICBvYmplY3RcbiAgICBtZXRob2QgYSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBiIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGMgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGYgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbXVsdGlwbHkgOiBtYXRyaXggdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgaW52ZXJzZSA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCB0cmFuc2xhdGUgOiBmbG9hdCAtPiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgc2NhbGUgOiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgc2NhbGVOb25Vbmlmb3JtIDogZmxvYXQgLT4gZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHJvdGF0ZSA6IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCByb3RhdGVGcm9tVmVjdG9yIDogZmxvYXQgLT4gZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGZsaXBYIDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGZsaXBZIDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNrZXdYIDogZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNrZXdZIDogZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RyYW5zZm9ybSAqKVxuYW5kIHRyYW5zZm9ybSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfdHlwZSA6IHRyYW5zZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1hdHJpeCA6IG1hdHJpeCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbmdsZSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZXRNYXRyaXggOiBtYXRyaXggdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRUcmFuc2xhdGUgOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTY2FsZSA6IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFJvdGF0ZSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFNrZXdYIDogZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U2tld1kgOiBmbG9hdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUcmFuc2Zvcm1MaXN0ICopXG5hbmQgdHJhbnNmb3JtTGlzdCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW3RyYW5zZm9ybSB0XSBsaXN0XG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHVHJhbnNmb3JtRnJvbU1hdHJpeCA6IG1hdHJpeCAtPiB0cmFuc2Zvcm0gdCBtZXRoXG5cbiAgICBtZXRob2QgY29uc29saWRhdGUgOiB0cmFuc2Zvcm0gdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRUcmFuc2Zvcm1MaXN0ICopXG5hbmQgYW5pbWF0ZWRUcmFuc2Zvcm1MaXN0ID0gW3RyYW5zZm9ybUxpc3QgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR1ByZXNlcnZlQXNwZWN0UmF0aW8gKilcbmFuZCBwcmVzZXJ2ZUFzcGVjdFJhdGlvID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFsaWduIDogYWxpZ25tZW50VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWVldE9yU2xpY2UgOiBtZWV0T3JTbGljZVR5cGUgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkUHJlc2VydmVBc3BlY3RSYXRpbyAqKVxuYW5kIGFuaW1hdGVkUHJlc2VydmVBc3BlY3RSYXRpbyA9IFtwcmVzZXJ2ZUFzcGVjdFJhdGlvIHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnICopXG5hbmQgcGF0aFNlZyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwYXRoU2VnVHlwZSA6IHBhdGhTZWdtZW50VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGF0aFNlZ1R5cGVBc0xldHRlciA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ2xvc2VQYXRoICopXG5hbmQgcGF0aFNlZ0Nsb3NlUGF0aCA9IHBhdGhTZWdcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdNb3ZldG9BYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTW92ZXRvUmVsICopXG5hbmQgcGF0aFNlZ01vdmV0byA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b1JlbCAqKVxuYW5kIHBhdGhTZWdMaW5ldG8gPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0FicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNSZWwgKilcbmFuZCBwYXRoU2VnQ3VydmV0b0N1YmljID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHgxIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkxIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHgyIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkyIDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwgKilcbmFuZCBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpYyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB4MSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5MSA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQXJjQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0FyY1JlbCopXG5hbmQgcGF0aFNlZ0FyYyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgcjEgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgcjIgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgYW5nbGUgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgbGFyZ2VBcmNGbGFnIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBzd2VlcEZsYWcgOiBib29sIHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwgKilcbmFuZCBwYXRoU2VnTGluZXRvSG9yaXpvbnRhbCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbEFicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbFJlbCAqKVxuYW5kIHBhdGhTZWdMaW5ldG9WZXJ0aWNhbCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHkgOiBmbG9hdFxuICBlbmRcblxuYW5kIHBhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGggPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXRcblxuICAgIG1ldGhvZCB5IDogZmxvYXRcblxuICAgIG1ldGhvZCB4MiA6IGZsb2F0XG5cbiAgICBtZXRob2QgeTIgOiBmbG9hdFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwgICopXG5hbmQgcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGggPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXRcblxuICAgIG1ldGhvZCB5IDogZmxvYXRcbiAgZW5kXG5cbmFuZCBwYXRoU2VnTGlzdCA9IFtwYXRoU2VnIHRdIGxpc3RcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkUGF0aERhdGEgKilcbmFuZCBhbmltYXRlZFBhdGhEYXRhID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBhdGhTZWdMaXN0IDogcGF0aFNlZ0xpc3QgdCBwcm9wXG5cbiAgICBtZXRob2Qgbm9ybWFsaXplZFBhdGhTZWdMaXN0IDogcGF0aFNlZ0xpc3QgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0ZWRQYXRoU2VnTGlzdCA6IHBhdGhTZWdMaXN0IHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGVkTm9ybWFsaXplZFBhdGhTZWdMaXN0IDogcGF0aFNlZ0xpc3QgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aEVsZW1lbnQgKilcbmFuZCBwYXRoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBpbmhlcml0IGFuaW1hdGVkUGF0aERhdGFcblxuICAgIG1ldGhvZCBwYXRoTGVuZ3RoIDogYW5pbWF0ZWROdW1iZXIgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0VG90YWxMZW5ndGggOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UG9pbnRBdExlbmd0aCA6IGZsb2F0IC0+IHBvaW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFBhdGhTZWdBdExlbmd0aCA6IGZsb2F0IC0+IGludFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDbG9zZVBhdGggOiBwYXRoU2VnQ2xvc2VQYXRoIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTW92ZXRvQWJzIDogZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ01vdmV0byBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ01vdmV0b1JlbCA6IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdNb3ZldG8gbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9BYnMgOiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvUmVsIDogZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0xpbmV0byBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY0FicyA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b0N1YmljIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvQ3ViaWMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljQWJzIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1JlbCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0FyY0FicyA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBib29sIHQgLT4gYm9vbCB0IC0+IHBhdGhTZWdBcmMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdBcmNSZWwgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IGJvb2wgdCAtPiBwYXRoU2VnQXJjIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyA6IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG9Ib3Jpem9udGFsIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbFJlbCA6IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG9Ib3Jpem9udGFsIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvVmVydGljYWxBYnMgOiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvVmVydGljYWwgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdMaW5ldG9WZXJ0aWNhbFJlbCA6IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG9WZXJ0aWNhbCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aEFicyA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoUmVsIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGggbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoQWJzIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aFJlbCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUmVjdEVsZW1lbnQgKilcbmFuZCByZWN0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJ4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcnkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdDaXJjbGVFbGVtZW50ICopXG5hbmQgY2lyY2xlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgY3ggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdFbGxpcHNlRWxlbWVudCAqKVxuYW5kIGVsbGlwc2VFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCBjeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcnggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0xpbmVFbGVtZW50ICopXG5jbGFzcyB0eXBlIGxpbmVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCB4MSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkxIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeDIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5MiA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkUG9pbnRzICopXG5hbmQgYW5pbWF0ZWRQb2ludHMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcG9pbnRzIDogcG9pbnRMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGVkcG9pbnRzIDogcG9pbnRMaXN0IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BvbHlsaW5lRWxlbWVudCAqKVxuYW5kIHBvbHlMaW5lRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBpbmhlcml0IGFuaW1hdGVkUG9pbnRzXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUG9seWdvbkVsZW1lbnQgKilcbmFuZCBwb2x5Z29uRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBpbmhlcml0IGFuaW1hdGVkUG9pbnRzXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGV4dENvbnRlbnRFbGVtZW50ICopXG5hbmQgdGV4dENvbnRlbnRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgdGV4dExlbmd0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxlbmd0aEFkanVzdCA6IGxlbmd0aEFkanVzdCBhbmltYXRlZCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXROdW1iZXJPZkNoYXJzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDb21wdXRlZFRleHRMZW5ndGggOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U3ViU3RyaW5nTGVuZ3RoIDogaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U3RhcnRQb3NpdGlvbk9mQ2hhciA6IGludCAtPiBwb2ludCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbmRQb3NpdGlvbk9mQ2hhciA6IGludCAtPiBwb2ludCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFeHRlbnRPZkNoYXIgOiBpbnQgLT4gcmVjdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRSb3RhdGlvbk9mQ2hhciA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q2hhck51bUF0UG9zaXRpb24gOiBwb2ludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbGVjdFN1YlN0cmluZyA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudCAqKVxuYW5kIHRleHRQb3NpdGlvbmluZ0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHRleHRDb250ZW50RWxlbWVudFxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkeCA6IGFuaW1hdGVkTGVuZ3RoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkeSA6IGFuaW1hdGVkTGVuZ3RoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByb3RhdGUgOiBhbmltYXRlZE51bWJlckxpc3QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGV4dEVsZW1lbnQgKilcbmFuZCB0ZXh0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgdGV4dFBvc2l0aW9uaW5nRWxlbWVudFxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG4gIGVuZFxuXG5hbmQgdHNwYW5FbGVtZW50ID0gdGV4dFBvc2l0aW9uaW5nRWxlbWVudFxuXG5hbmQgdHJlZkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHRleHRQb3NpdGlvbmluZ0VsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGV4dFBhdGhFbGVtZW50ICopXG5hbmQgdGV4dFBhdGhFbGVtZW50TWV0aG9kID0gW3RleHRQYXRoTWV0aG9kVHlwZV0gYW5pbWF0ZWRcblxuYW5kIHRleHRQYXRoRWxlbWVudFNwYWNpbmcgPSBbdGV4dFBhdGhTcGFjaW5nVHlwZV0gYW5pbWF0ZWRcblxuYW5kIHRleHRQYXRoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgdGV4dENvbnRlbnRFbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgbWV0aG9kIHN0YXJ0T2Zmc2V0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWV0aG9kXyA6IHRleHRQYXRoRWxlbWVudE1ldGhvZCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3BhY2luZyA6IHRleHRQYXRoRWxlbWVudFNwYWNpbmcgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FsdEdseXBoRWxlbWVudCAqKVxuYW5kIGFsdEdseXBoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgdGV4dFBvc2l0aW9uaW5nRWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIG1ldGhvZCBnbHlwaFJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb3JtYXQgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQWx0R2x5cGhEZWZFbGVtZW50ICopXG5hbmQgYWx0R2x5cGhEZWZFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHQWx0R2x5cGhJdGVtRWxlbWVudCAqKVxuYW5kIGFsdEdseXBoSXRlbUVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdHbHlwaFJlZkVsZW1lbnQgKilcbmFuZCBnbHlwaFJlZkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBtZXRob2QgZ2x5cGhSZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9ybWF0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBkeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBkeSA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYWludCA6IFNWR0NvbG9yIHsgKilcblxuKCogICAvLyBQYWludCBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1JHQkNPTE9SID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9SR0JDT0xPUl9JQ0NDT0xPUiA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfTk9ORSA9IDEwMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9DVVJSRU5UQ09MT1IgPSAxMDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVVJJX05PTkUgPSAxMDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVVJJX0NVUlJFTlRDT0xPUiA9IDEwNDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VUklfUkdCQ09MT1IgPSAxMDU7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVVJJX1JHQkNPTE9SX0lDQ0NPTE9SID0gMTA2OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VSSSA9IDEwNzsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcGFpbnRUeXBlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHVyaTsgKilcblxuKCogICB2b2lkIHNldFVyaShpbiBET01TdHJpbmcgdXJpKTsgKilcbigqICAgdm9pZCBzZXRQYWludChpbiB1bnNpZ25lZCBzaG9ydCBwYWludFR5cGUsIGluIERPTVN0cmluZyB1cmksIGluIERPTVN0cmluZyByZ2JDb2xvciwgaW4gRE9NU3RyaW5nIGljY0NvbG9yKSByYWlzZXMoU1ZHRXhjZXB0aW9uKTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdNYXJrZXJFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHTGFuZ1NwYWNlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdFeHRlcm5hbFJlc291cmNlc1JlcXVpcmVkLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdTdHlsYWJsZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRml0VG9WaWV3Qm94IHsgKilcblxuKCogICAvLyBNYXJrZXIgVW5pdCBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSVU5JVFNfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJVTklUU19VU0VSU1BBQ0VPTlVTRSA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJVTklUU19TVFJPS0VXSURUSCA9IDI7ICopXG5cbigqICAgLy8gTWFya2VyIE9yaWVudGF0aW9uIFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJfT1JJRU5UX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSX09SSUVOVF9BVVRPID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUl9PUklFTlRfQU5HTEUgPSAyOyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCByZWZYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggcmVmWTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gbWFya2VyVW5pdHM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCBtYXJrZXJXaWR0aDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIG1hcmtlckhlaWdodDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gb3JpZW50VHlwZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkQW5nbGUgb3JpZW50QW5nbGU7ICopXG5cbigqICAgdm9pZCBzZXRPcmllbnRUb0F1dG8oKSByYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqICAgdm9pZCBzZXRPcmllbnRUb0FuZ2xlKGluIFNWR0FuZ2xlIGFuZ2xlKSByYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdDb2xvclByb2ZpbGVFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHVVJJUmVmZXJlbmNlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdSZW5kZXJpbmdJbnRlbnQgeyAqKVxuKCogICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxvY2FsOyAqKVxuKCogICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5hbWU7ICopXG4oKiAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCByZW5kZXJpbmdJbnRlbnQ7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHQ29sb3JQcm9maWxlUnVsZSA6IFNWR0NTU1J1bGUsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR1JlbmRlcmluZ0ludGVudCB7ICopXG4oKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcgc3JjIHNldHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5hbWUgc2V0cmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCByZW5kZXJpbmdJbnRlbnQgc2V0cmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHR3JhZGllbnRFbGVtZW50ICopXG5hbmQgYW5pbWF0ZWRTcHJlYWRNZXRob2QgPSBbc3ByZWFkTWV0aG9kVHlwZV0gYW5pbWF0ZWRcblxuYW5kIGdyYWRpZW50RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gZ3JhZGllbnRVbml0czsgKilcbiAgICBtZXRob2QgZ3JhZGllbnRUcmFuc2Zvcm0gOiBhbmltYXRlZFRyYW5zZm9ybUxpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3ByZWFkTWV0aG9kIDogYW5pbWF0ZWRTcHJlYWRNZXRob2QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTGluZWFyR3JhZGllbnRFbGVtZW50ICopXG5hbmQgbGluZWFyR3JhZGllbnRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBncmFkaWVudEVsZW1lbnRcblxuICAgIG1ldGhvZCB4MSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkxIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeDIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5MiA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1JhZGlhbEdyYWRpZW50RWxlbWVudCAqKVxuYW5kIHJhZGlhbEdyYWRpZW50RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZ3JhZGllbnRFbGVtZW50XG5cbiAgICBtZXRob2QgY3ggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZ5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU3RvcEVsZW1lbnQgKilcbmFuZCBzdG9wRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgbWV0aG9kIG9mZnNldCA6IGFuaW1hdGVkTnVtYmVyIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdHRlcm5FbGVtZW50ICopXG5hbmQgcGF0dGVybkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IGZpdFRvVmlld0JveFxuXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBwYXR0ZXJuVW5pdHM7ICopXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBwYXR0ZXJuQ29udGVudFVuaXRzOyAqKVxuICAgIG1ldGhvZCBwYXR0ZXJuVHJhbnNmb3JtIDogYW5pbWF0ZWRUcmFuc2Zvcm1MaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdDbGlwUGF0aEVsZW1lbnQgKilcbmFuZCBjbGlwUGF0aEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gY2xpcFBhdGhVbml0czsgKilcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdNYXNrRWxlbWVudCAqKVxuYW5kIG1hc2tFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG1hc2tVbml0czsgKilcbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG1hc2tDb250ZW50VW5pdHM7ICopXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdGaWx0ZXJFbGVtZW50ICopXG5hbmQgZmlsdGVyRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gZmlsdGVyVW5pdHM7ICopXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBwcmltaXRpdmVVbml0czsgKilcbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbHRlclJlc1ggOiBhbmltYXRlZEludGVnZXIgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsdGVyUmVzWSA6IGFuaW1hdGVkSW50ZWdlciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZXRGaWx0ZXJSZXMgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyA6IFNWR1N0eWxhYmxlIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIHg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCB5OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggd2lkdGg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCBoZWlnaHQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyByZXN1bHQ7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVCbGVuZEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBCbGVuZCBNb2RlIFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfTk9STUFMID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9NVUxUSVBMWSA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfU0NSRUVOID0gMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9EQVJLRU4gPSA0OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX0xJR0hURU4gPSA1OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjI7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG1vZGU7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBDb2xvciBNYXRyaXggVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09MT1JNQVRSSVhfVFlQRV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09MT1JNQVRSSVhfVFlQRV9NQVRSSVggPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT0xPUk1BVFJJWF9UWVBFX1NBVFVSQVRFID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09MT1JNQVRSSVhfVFlQRV9IVUVST1RBVEUgPSAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT0xPUk1BVFJJWF9UWVBFX0xVTUlOQU5DRVRPQUxQSEEgPSA0OyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHR5cGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlckxpc3QgdmFsdWVzOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHQ29tcG9uZW50VHJhbnNmZXJGdW5jdGlvbkVsZW1lbnQgOiBTVkdFbGVtZW50IHsgKilcblxuKCogICAvLyBDb21wb25lbnQgVHJhbnNmZXIgVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9JREVOVElUWSA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfVEFCTEUgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX0RJU0NSRVRFID0gMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9MSU5FQVIgPSA0OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX0dBTU1BID0gNTsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiB0eXBlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXJMaXN0IHRhYmxlVmFsdWVzOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc2xvcGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBpbnRlcmNlcHQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBhbXBsaXR1ZGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBleHBvbmVudDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIG9mZnNldDsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUZ1bmNSRWxlbWVudCA6IFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50IHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUZ1bmNHRWxlbWVudCA6IFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50IHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUZ1bmNCRWxlbWVudCA6IFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50IHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUZ1bmNBRWxlbWVudCA6IFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50IHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUNvbXBvc2l0ZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gQ29tcG9zaXRlIE9wZXJhdG9ycyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9PVkVSID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX0lOID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX09VVCA9IDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9BVE9QID0gNDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX1hPUiA9IDU7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9BUklUSE1FVElDID0gNjsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBvcGVyYXRvcjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGsxOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgazI7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrMzsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGs0OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gRWRnZSBNb2RlIFZhbHVlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRURHRU1PREVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19FREdFTU9ERV9EVVBMSUNBVEUgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRURHRU1PREVfV1JBUCA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19FREdFTU9ERV9OT05FID0gMzsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRJbnRlZ2VyIG9yZGVyWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkSW50ZWdlciBvcmRlclk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlckxpc3Qga2VybmVsTWF0cml4OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZGl2aXNvcjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGJpYXM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEludGVnZXIgdGFyZ2V0WDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkSW50ZWdlciB0YXJnZXRZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBlZGdlTW9kZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEJvb2xlYW4gcHJlc2VydmVBbHBoYTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzdXJmYWNlU2NhbGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBkaWZmdXNlQ29uc3RhbnQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhZOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudCA6IFNWR0VsZW1lbnQgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgYXppbXV0aDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGVsZXZhdGlvbjsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRVBvaW50TGlnaHRFbGVtZW50IDogU1ZHRWxlbWVudCB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB4OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgeTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHo7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVTcG90TGlnaHRFbGVtZW50IDogU1ZHRWxlbWVudCB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB4OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgeTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHo7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBwb2ludHNBdFg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBwb2ludHNBdFk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBwb2ludHNBdFo7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzcGVjdWxhckV4cG9uZW50OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgbGltaXRpbmdDb25lQW5nbGU7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVEaXNwbGFjZW1lbnRNYXBFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIENoYW5uZWwgU2VsZWN0b3JzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19DSEFOTkVMX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfQ0hBTk5FTF9SID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0NIQU5ORUxfRyA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19DSEFOTkVMX0IgPSAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfQ0hBTk5FTF9BID0gNDsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc2NhbGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHhDaGFubmVsU2VsZWN0b3I7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHlDaGFubmVsU2VsZWN0b3I7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVGbG9vZEVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUdhdXNzaWFuQmx1ckVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHN0ZERldmlhdGlvblg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzdGREZXZpYXRpb25ZOyAqKVxuXG4oKiAgIHZvaWQgc2V0U3RkRGV2aWF0aW9uKGluIGZsb2F0IHN0ZERldmlhdGlvblgsIGluIGZsb2F0IHN0ZERldmlhdGlvblkpIHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFSW1hZ2VFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR1VSSVJlZmVyZW5jZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0xhbmdTcGFjZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRQcmVzZXJ2ZUFzcGVjdFJhdGlvIHByZXNlcnZlQXNwZWN0UmF0aW87ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVNZXJnZUVsZW1lbnQgOiBTVkdFbGVtZW50LCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRU1lcmdlTm9kZUVsZW1lbnQgOiBTVkdFbGVtZW50IHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRU1vcnBob2xvZ3lFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBNb3JwaG9sb2d5IE9wZXJhdG9ycyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTU9SUEhPTE9HWV9PUEVSQVRPUl9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01PUlBIT0xPR1lfT1BFUkFUT1JfRVJPREUgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTU9SUEhPTE9HWV9PUEVSQVRPUl9ESUxBVEUgPSAyOyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG9wZXJhdG9yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgcmFkaXVzWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHJhZGl1c1k7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVPZmZzZXRFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZHg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBkeTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRVNwZWN1bGFyTGlnaHRpbmdFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHN1cmZhY2VTY2FsZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNwZWN1bGFyQ29uc3RhbnQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzcGVjdWxhckV4cG9uZW50OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRVRpbGVFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRVR1cmJ1bGVuY2VFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBUdXJidWxlbmNlIFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19UVVJCVUxFTkNFX1RZUEVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19UVVJCVUxFTkNFX1RZUEVfRlJBQ1RBTE5PSVNFID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1RVUkJVTEVOQ0VfVFlQRV9UVVJCVUxFTkNFID0gMjsgKilcblxuKCogICAvLyBTdGl0Y2ggT3B0aW9ucyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfU1RJVENIVFlQRV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1NUSVRDSFRZUEVfU1RJVENIID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1NUSVRDSFRZUEVfTk9TVElUQ0ggPSAyOyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBiYXNlRnJlcXVlbmN5WDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGJhc2VGcmVxdWVuY3lZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRJbnRlZ2VyIG51bU9jdGF2ZXM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzZWVkOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBzdGl0Y2hUaWxlczsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gdHlwZTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdDdXJzb3JFbGVtZW50ICopXG5hbmQgY3Vyc29yRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQUVsZW1lbnQgKilcbmFuZCBhRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGFuaW1hdGVkU3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1ZpZXdFbGVtZW50ICopXG5hbmQgdmlld0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBmaXRUb1ZpZXdCb3hcblxuICAgIGluaGVyaXQgem9vbUFuZFBhblxuXG4gICAgbWV0aG9kIHZpZXdUYXJnZXQgOiBzdHJpbmdMaXN0IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1NjcmlwdEVsZW1lbnQgKilcbmFuZCBzY3JpcHRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBtZXRob2QgdHlwZV8gOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHWm9vbUV2ZW50IDogVUlFdmVudCAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHUmVjdCB6b29tUmVjdFNjcmVlbjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IHByZXZpb3VzU2NhbGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdQb2ludCBwcmV2aW91c1RyYW5zbGF0ZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IG5ld1NjYWxlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHUG9pbnQgbmV3VHJhbnNsYXRlOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGlvbkVsZW1lbnQgKilcbmFuZCBhbmltYXRpb25FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgICgqIGluaGVyaXQgZWxlbWVudFRpbWVDb250cm9sICopXG4gICAgbWV0aG9kIHRhcmdldEVsZW1lbnQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldFN0YXJ0VGltZSA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRDdXJyZW50VGltZSA6IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTaW1wbGVEdXJhdGlvbiA6IGZsb2F0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlRWxlbWVudCAqKVxuYW5kIGFuaW1hdGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBhbmltYXRpb25FbGVtZW50XG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU2V0RWxlbWVudCAqKVxuYW5kIHNldEVsZW1lbnQgPSBhbmltYXRpb25FbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlTW90aW9uRWxlbWVudCAqKVxuYW5kIGFuaW1hdGVNb3Rpb25FbGVtZW50ID0gYW5pbWF0aW9uRWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHTVBhdGhFbGVtZW50ICopXG5hbmQgbVBhdGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZUNvbG9yRWxlbWVudCAqKVxuYW5kIGFuaW1hdGVDb2xvckVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGFuaW1hdGlvbkVsZW1lbnRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudCAqKVxuYW5kIGFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50ID0gYW5pbWF0aW9uRWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEVsZW1lbnQgKilcbmFuZCBmb250RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0dseXBoRWxlbWVudCAqKVxuKCogaW50ZXJmYWNlIFNWR01pc3NpbmdHbHlwaEVsZW1lbnQqKVxuYW5kIGdseXBoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0hLZXJuRWxlbWVudCA6IFNWR0VsZW1lbnQgKilcbigqIGludGVyZmFjZSBTVkdWS2VybkVsZW1lbnQgOiBTVkdFbGVtZW50ICopXG5cbigqIGludGVyZmFjZSBTVkdGb250RmFjZUVsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9udEZhY2VFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEZhY2VTcmNFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvbnRGYWNlU3JjRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRGYWNlVXJpRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb250RmFjZVVyaUVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb250RmFjZUZvcm1hdEVsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9udEZhY2VGb3JtYXRFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEZhY2VOYW1lRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb250RmFjZU5hbWVFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHTWV0YWRhdGFFbGVtZW50ICopXG5jbGFzcyB0eXBlIG1ldGFkYXRhRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvcmVpZ25PYmplY3RFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvcmVpZ25PYmplY3RFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgY3JlYXRlRWxlbWVudCAoZG9jIDogZG9jdW1lbnQgdCkgbmFtZSA9IGRvYyMjY3JlYXRlRWxlbWVudE5TIHhtbG5zIChKcy5zdHJpbmcgbmFtZSlcblxubGV0IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIG5hbWUgPSBKcy5VbnNhZmUuY29lcmNlIChjcmVhdGVFbGVtZW50IGRvYyBuYW1lKVxuXG5sZXQgY3JlYXRlQSBkb2MgOiBhRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhXCJcblxubGV0IGNyZWF0ZUFsdEdseXBoIGRvYyA6IGFsdEdseXBoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbHRnbHlwaFwiXG5cbmxldCBjcmVhdGVBbHRHbHlwaERlZiBkb2MgOiBhbHRHbHlwaERlZkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYWx0Z2x5cGhkZWZcIlxuXG5sZXQgY3JlYXRlQWx0R2x5cGhJdGVtIGRvYyA6IGFsdEdseXBoSXRlbUVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYWx0Z2x5cGhpdGVtXCJcblxubGV0IGNyZWF0ZUFuaW1hdGUgZG9jIDogYW5pbWF0ZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYW5pbWF0ZVwiXG5cbmxldCBjcmVhdGVBbmltYXRlQ29sb3IgZG9jIDogYW5pbWF0ZUNvbG9yRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbmltYXRlY29sb3JcIlxuXG5sZXQgY3JlYXRlQW5pbWF0ZU1vdGlvbiBkb2MgOiBhbmltYXRlTW90aW9uRWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJhbmltYXRlbW90aW9uXCJcblxubGV0IGNyZWF0ZUFuaW1hdGVUcmFuc2Zvcm0gZG9jIDogYW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYW5pbWF0ZXRyYW5zZm9ybVwiXG5cbmxldCBjcmVhdGVDaXJjbGUgZG9jIDogY2lyY2xlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjaXJjbGVcIlxuXG5sZXQgY3JlYXRlQ2xpcFBhdGggZG9jIDogY2xpcFBhdGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNsaXBwYXRoXCJcblxuKCogbGV0IGNyZWF0ZUNvbG9yUHJvZmlsZSBkb2MgOiBjb2xvclByb2ZpbGUgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY29sb3ItcHJvZmlsZVwiICopXG5sZXQgY3JlYXRlQ3Vyc29yIGRvYyA6IGN1cnNvckVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY3Vyc29yXCJcblxubGV0IGNyZWF0ZURlZnMgZG9jIDogZGVmc0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZGVmc1wiXG5cbmxldCBjcmVhdGVEZXNjIGRvYyA6IGRlc2NFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImRlc2NcIlxuXG5sZXQgY3JlYXRlRWxsaXBzZSBkb2MgOiBlbGxpcHNlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJlbGxpcHNlXCJcblxuKCogbGV0IGNyZWF0ZUZlKiAqKVxubGV0IGNyZWF0ZUZpbHRlciBkb2MgOiBmaWx0ZXJFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZpbHRlclwiXG5cbmxldCBjcmVhdGVGb250IGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnRcIlxuXG5sZXQgY3JlYXRlRm9udEZhY2UgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udC1mYWNlXCJcblxubGV0IGNyZWF0ZUZvbnRGYWNlRm9ybWF0IGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnQtZmFjZS1mb3JtYXRcIlxuXG5sZXQgY3JlYXRlRm9udEZhY2VOYW1lIGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnQtZmFjZS1uYW1lXCJcblxubGV0IGNyZWF0ZUZvbnRGYWNlU3JjIGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnQtZmFjZS1zcmNcIlxuXG5sZXQgY3JlYXRlRm9udEZhY2VVcmkgZG9jIDogZm9udEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZm9udC1mYWNlLXVyaVwiXG5cbmxldCBjcmVhdGVGb3JlaWduT2JqZWN0IGRvYyA6IGZvcmVpZ25PYmplY3RFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvcmVpZ25PYmplY3RcIlxuXG5sZXQgY3JlYXRlRyBkb2MgOiBnRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJnXCJcblxubGV0IGNyZWF0ZUdseXBoIGRvYyA6IGdseXBoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJnbHlwaFwiXG5cbmxldCBjcmVhdGVHbHlwaFJlZiBkb2MgOiBnbHlwaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZ2x5cGhyZWZcIlxuXG5sZXQgY3JlYXRlaGtlcm4gZG9jIDogZWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoa2VyblwiXG5cbmxldCBjcmVhdGVJbWFnZSBkb2MgOiBpbWFnZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaW1hZ2VcIlxuXG5sZXQgY3JlYXRlTGluZUVsZW1lbnQgZG9jIDogbGluZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGluZVwiXG5cbmxldCBjcmVhdGVMaW5lYXJFbGVtZW50IGRvYyA6IGxpbmVhckdyYWRpZW50RWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsaW5lYXJncmFkaWVudFwiXG5cbigqIGxldCBjcmVhdGVNYXJrZXIgZG9jIDogbWFya2VyRWxlbWVudCAqKVxubGV0IGNyZWF0ZU1hc2sgZG9jIDogbWFza0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibWFza1wiXG5cbmxldCBjcmVhdGVNZXRhRGF0YSBkb2MgOiBtZXRhZGF0YUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibWV0YWRhdGFcIlxuXG5sZXQgY3JlYXRlTWlzc2luZ0dseXBoIGRvYyA6IGdseXBoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtaXNzaW5nLWdseXBoXCJcblxubGV0IGNyZWF0ZU1QYXRoIGRvYyA6IG1QYXRoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJtcGF0aFwiXG5cbmxldCBjcmVhdGVQYXRoIGRvYyA6IHBhdGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBhdGhcIlxuXG5sZXQgY3JlYXRlUGF0dGVybiBkb2MgOiBwYXR0ZXJuRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwYXR0ZXJuXCJcblxubGV0IGNyZWF0ZVBvbHlnb24gZG9jIDogcG9seWdvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicG9seWdvblwiXG5cbmxldCBjcmVhdGVQb2x5bGluZSBkb2MgOiBwb2x5TGluZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicG9seWxpbmVcIlxuXG5sZXQgY3JlYXRlUmFkaWFsZ3JhZGllbnQgZG9jIDogcmFkaWFsR3JhZGllbnRFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInJhZGlhbGdyYWRpZW50XCJcblxubGV0IGNyZWF0ZVJlY3QgZG9jIDogcmVjdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicmVjdFwiXG5cbmxldCBjcmVhdGVTY3JpcHQgZG9jIDogc2NyaXB0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzY3JpcHRcIlxuXG5sZXQgY3JlYXRlU2V0IGRvYyA6IHNldEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic2V0XCJcblxubGV0IGNyZWF0ZVN0b3AgZG9jIDogc3RvcEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3RvcFwiXG5cbmxldCBjcmVhdGVTdHlsZSBkb2MgOiBzdHlsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3R5bGVcIlxuXG5sZXQgY3JlYXRlU3ZnIGRvYyA6IHN2Z0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3ZnXCJcblxubGV0IGNyZWF0ZVN3aXRjaCBkb2MgOiBzd2l0Y2hFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN3aXRjaFwiXG5cbmxldCBjcmVhdGVTeW1ib2wgZG9jIDogc3ltYm9sRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzeW1ib2xcIlxuXG5sZXQgY3JlYXRlVGV4dEVsZW1lbnQgZG9jIDogdGV4dEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGV4dFwiXG5cbmxldCBjcmVhdGVUZXh0cGF0aCBkb2MgOiB0ZXh0UGF0aEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGV4dHBhdGhcIlxuXG5sZXQgY3JlYXRlVGl0bGUgZG9jIDogdGl0bGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRpdGxlXCJcblxubGV0IGNyZWF0ZVRyZWYgZG9jIDogdHJlZkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidHJlZlwiXG5cbmxldCBjcmVhdGVUc3BhbiBkb2MgOiB0c3BhbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidHNwYW5cIlxuXG5sZXQgY3JlYXRlVXNlIGRvYyA6IHVzZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidXNlXCJcblxubGV0IGNyZWF0ZVZpZXcgZG9jIDogdmlld0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidmlld1wiXG5cbmxldCBjcmVhdGV2a2VybiBkb2MgOiBlbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInZrZXJuXCJcblxuKCoqKiopXG5cbmxldCBzdmdfZWxlbWVudCA6IGVsZW1lbnQgdCBjb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1NWR0VsZW1lbnRcblxubGV0IGRvY3VtZW50ID0gSnMuVW5zYWZlLmdsb2JhbCMjLmRvY3VtZW50XG5cbmxldCBnZXRFbGVtZW50QnlJZCBpZCA6IGVsZW1lbnQgdCA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKEpzLlVuc2FmZS5nbG9iYWwjIy5kb2N1bWVudCMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBpZCkpXG4gICAgKGZ1biAoKSAtPiByYWlzZSBOb3RfZm91bmQpXG4gICAgKGZ1biBlIC0+IGlmIEpzLmluc3RhbmNlb2YgZSBzdmdfZWxlbWVudCB0aGVuIGUgZWxzZSByYWlzZSBOb3RfZm91bmQpXG5cbm1vZHVsZSBDb2VyY2VUbyA9IHN0cnVjdFxuICBsZXQgZWxlbWVudCAoZSA6ICNEb20ubm9kZSBKcy50KSA6IGVsZW1lbnQgSnMudCBKcy5vcHQgPVxuICAgIGlmIEpzLmluc3RhbmNlb2YgZSBzdmdfZWxlbWVudCB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSkgZWxzZSBKcy5udWxsXG5cbiAgbGV0IHVuc2FmZUNvZXJjZSAoZSA6ICNlbGVtZW50IHQpIHRhZyA9XG4gICAgaWYgZSMjLnRhZ05hbWUjI3RvTG93ZXJDYXNlID09IEpzLnN0cmluZyB0YWdcbiAgICB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgYSBlIDogYUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFcIlxuXG4gIGxldCBhbHRHbHlwaCBlIDogYWx0R2x5cGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbHRnbHlwaFwiXG5cbiAgbGV0IGFsdEdseXBoRGVmIGUgOiBhbHRHbHlwaERlZkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFsdGdseXBoZGVmXCJcblxuICBsZXQgYWx0R2x5cGhJdGVtIGUgOiBhbHRHbHlwaEl0ZW1FbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbHRnbHlwaGl0ZW1cIlxuXG4gIGxldCBhbmltYXRlIGUgOiBhbmltYXRlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYW5pbWF0ZVwiXG5cbiAgbGV0IGFuaW1hdGVDb2xvciBlIDogYW5pbWF0ZUNvbG9yRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYW5pbWF0ZWNvbG9yXCJcblxuICBsZXQgYW5pbWF0ZU1vdGlvbiBlIDogYW5pbWF0ZU1vdGlvbkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFuaW1hdGVtb3Rpb25cIlxuXG4gIGxldCBhbmltYXRlVHJhbnNmb3JtIGUgOiBhbmltYXRlVHJhbnNmb3JtRWxlbWVudCB0IG9wdCA9XG4gICAgdW5zYWZlQ29lcmNlIGUgXCJhbmltYXRldHJhbnNmb3JtXCJcblxuICBsZXQgY2lyY2xlIGUgOiBjaXJjbGVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJjaXJjbGVcIlxuXG4gIGxldCBjbGlwUGF0aCBlIDogY2xpcFBhdGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJjbGlwcGF0aFwiXG5cbiAgKCogbGV0IENvbG9yUHJvZmlsZSBlIDogY29sb3JQcm9maWxlIHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJjb2xvci1wcm9maWxlXCIgKilcbiAgbGV0IGN1cnNvciBlIDogY3Vyc29yRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiY3Vyc29yXCJcblxuICBsZXQgZGVmcyBlIDogZGVmc0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImRlZnNcIlxuXG4gIGxldCBkZXNjIGUgOiBkZXNjRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZGVzY1wiXG5cbiAgbGV0IGVsbGlwc2UgZSA6IGVsbGlwc2VFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJlbGxpcHNlXCJcblxuICAoKiBsZXQgRmUqICopXG4gIGxldCBmaWx0ZXIgZSA6IGZpbHRlckVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZpbHRlclwiXG5cbiAgbGV0IGZvbnQgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250XCJcblxuICBsZXQgZm9udEZhY2UgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250LWZhY2VcIlxuXG4gIGxldCBmb250RmFjZUZvcm1hdCBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnQtZmFjZS1mb3JtYXRcIlxuXG4gIGxldCBmb250RmFjZU5hbWUgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250LWZhY2UtbmFtZVwiXG5cbiAgbGV0IGZvbnRGYWNlU3JjIGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udC1mYWNlLXNyY1wiXG5cbiAgbGV0IGZvbnRGYWNlVXJpIGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udC1mYWNlLXVyaVwiXG5cbiAgbGV0IGZvcmVpZ25PYmplY3QgZSA6IGZvcmVpZ25PYmplY3RFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb3JlaWdub2JqZWN0XCJcblxuICBsZXQgZyBlIDogZ0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImdcIlxuXG4gIGxldCBnbHlwaCBlIDogZ2x5cGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJnbHlwaFwiXG5cbiAgbGV0IGdseXBoUmVmIGUgOiBnbHlwaEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImdseXBocmVmXCJcblxuICBsZXQgaGtlcm4gZSA6IGVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImhrZXJuXCJcblxuICBsZXQgaW1hZ2UgZSA6IGltYWdlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiaW1hZ2VcIlxuXG4gIGxldCBsaW5lRWxlbWVudCBlIDogbGluZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImxpbmVcIlxuXG4gIGxldCBsaW5lYXJFbGVtZW50IGUgOiBsaW5lYXJHcmFkaWVudEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImxpbmVhcmdyYWRpZW50XCJcblxuICAoKiBsZXQgTWFya2VyIGUgOiBtYXJrZXJFbGVtZW50ICopXG4gIGxldCBtYXNrIGUgOiBtYXNrRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibWFza1wiXG5cbiAgbGV0IG1ldGFEYXRhIGUgOiBtZXRhZGF0YUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcIm1ldGFkYXRhXCJcblxuICBsZXQgbWlzc2luZ0dseXBoIGUgOiBnbHlwaEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcIm1pc3NpbmctZ2x5cGhcIlxuXG4gIGxldCBtUGF0aCBlIDogbVBhdGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJtcGF0aFwiXG5cbiAgbGV0IHBhdGggZSA6IHBhdGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJwYXRoXCJcblxuICBsZXQgcGF0dGVybiBlIDogcGF0dGVybkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInBhdHRlcm5cIlxuXG4gIGxldCBwb2x5Z29uIGUgOiBwb2x5Z29uRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicG9seWdvblwiXG5cbiAgbGV0IHBvbHlsaW5lIGUgOiBwb2x5TGluZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInBvbHlsaW5lXCJcblxuICBsZXQgcmFkaWFsZ3JhZGllbnQgZSA6IHJhZGlhbEdyYWRpZW50RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicmFkaWFsZ3JhZGllbnRcIlxuXG4gIGxldCByZWN0IGUgOiByZWN0RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicmVjdFwiXG5cbiAgbGV0IHNjcmlwdCBlIDogc2NyaXB0RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic2NyaXB0XCJcblxuICBsZXQgc2V0IGUgOiBzZXRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzZXRcIlxuXG4gIGxldCBzdG9wIGUgOiBzdG9wRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic3RvcFwiXG5cbiAgbGV0IHN0eWxlIGUgOiBzdHlsZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInN0eWxlXCJcblxuICBsZXQgc3ZnIGUgOiBzdmdFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzdmdcIlxuXG4gIGxldCBzd2l0Y2ggZSA6IHN3aXRjaEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInN3aXRjaFwiXG5cbiAgbGV0IHN5bWJvbCBlIDogc3ltYm9sRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic3ltYm9sXCJcblxuICBsZXQgdGV4dEVsZW1lbnQgZSA6IHRleHRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ0ZXh0XCJcblxuICBsZXQgdGV4dHBhdGggZSA6IHRleHRQYXRoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidGV4dHBhdGhcIlxuXG4gIGxldCB0aXRsZSBlIDogdGl0bGVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ0aXRsZVwiXG5cbiAgbGV0IHRyZWYgZSA6IHRyZWZFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ0cmVmXCJcblxuICBsZXQgdHNwYW4gZSA6IHRzcGFuRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidHNwYW5cIlxuXG4gIGxldCB1c2UgZSA6IHVzZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInVzZVwiXG5cbiAgbGV0IHZpZXcgZSA6IHZpZXdFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ2aWV3XCJcblxuICBsZXQgdmtlcm4gZSA6IGVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInZrZXJuXCJcbmVuZFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxuKCogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50U291cmNlICopXG5vcGVuIEpzXG5vcGVuIERvbVxub3BlbiEgSW1wb3J0XG5cbnR5cGUgc3RhdGUgPVxuICB8IENPTk5FQ1RJTkdcbiAgfCBPUEVOXG4gIHwgQ0xPU0VEXG5cbmNsYXNzIHR5cGUgWydhXSBtZXNzYWdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFsnYV0gRG9tLmV2ZW50XG5cbiAgICBtZXRob2QgZGF0YSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvcmlnaW4gOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGFzdEV2ZW50SWQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gICAgKCogbWV0aG9kIHNvdXJjZSA6IHVuaXQgKilcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZXZlbnRTb3VyY2UgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIG1ldGhvZCB1cmwgOiBzdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2l0aENyZWRlbnRpYWxzIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDogc3RhdGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsb3NlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgb25vcGVuIDogKCdzZWxmIHQsICdzZWxmIG1lc3NhZ2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubWVzc2FnZSA6ICgnc2VsZiB0LCAnc2VsZiBtZXNzYWdlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmVycm9yIDogKCdzZWxmIHQsICdzZWxmIG1lc3NhZ2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBvcHRpb25zID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHdpdGhDcmVkZW50aWFscyA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxubGV0IHdpdGhDcmVkZW50aWFscyBiIDogb3B0aW9ucyB0ID1cbiAgbGV0IGluaXQgPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgaW5pdCMjLndpdGhDcmVkZW50aWFscyA6PSBKcy5ib29sIGI7XG4gIGluaXRcblxubGV0IGV2ZW50U291cmNlID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9FdmVudFNvdXJjZVxuXG5sZXQgZXZlbnRTb3VyY2Vfb3B0aW9ucyA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRXZlbnRTb3VyY2VcblxubGV0IGFkZEV2ZW50TGlzdGVuZXIgPSBEb20uYWRkRXZlbnRMaXN0ZW5lclxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIGNvbnNvbGUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbG9nIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ180IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfNiA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGxvZ183IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfOCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWJ1ZyA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVidWdfMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkZWJ1Z18zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVidWdfNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVidWdfNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbmZvIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbmZvXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5mb18zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5mb180IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbmZvXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd2FybiA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd2Fybl8yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdhcm5fMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdhcm5fNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd2Fybl81IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVycm9yIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlcnJvcl8yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGVycm9yXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlcnJvcl80IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlcnJvcl81IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF8gOiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XzEgOiBib29sIHQgLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfMiA6IGJvb2wgdCAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XzMgOiBib29sIHQgLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XzQgOiBib29sIHQgLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfNSA6IGJvb2wgdCAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGlyIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkaXJ4bWwgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRyYWNlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXAgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBfMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBDb2xsYXBzZWQgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwQ29sbGFwc2VkXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBDb2xsYXBzZWRfMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwQ29sbGFwc2VkXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwQ29sbGFwc2VkXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ3JvdXBFbmQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0aW1lIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGltZUVuZCA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuZXh0ZXJuYWwgZ2V0X2NvbnNvbGUgOiB1bml0IC0+IGNvbnNvbGUgdCA9IFwiY2FtbF9qc19nZXRfY29uc29sZVwiXG5cbmxldCBjb25zb2xlID0gZ2V0X2NvbnNvbGUgKClcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3TDqXBoYW5lIExlZ3JhbmRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG50eXBlIHBvc2l0aW9uRXJyb3JDb2RlXG5cbnR5cGUgd2F0Y2hJZFxuXG5jbGFzcyB0eXBlIGNvb3JkaW5hdGVzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxhdGl0dWRlIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxvbmdpdHVkZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbHRpdHVkZSA6IGZsb2F0IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjdXJhY3kgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWx0aXR1ZGVBY2N1cmFjeSA6IGZsb2F0IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVhZGluZyA6IGZsb2F0IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3BlZWQgOiBmbG9hdCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwb3NpdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjb29yZHMgOiBjb29yZGluYXRlcyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aW1lc3RhbXAgOiBKcy5kYXRlIEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcG9zaXRpb25PcHRpb25zID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGVuYWJsZUhpZ2hBY2N1cmFjeSA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aW1lb3V0IDogaW50IEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWF4aW11bUFnZSA6IGludCBKcy53cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwb3NpdGlvbkVycm9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF9QRVJNSVNTSU9OX0RFTklFRF8gOiBwb3NpdGlvbkVycm9yQ29kZSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPU0lUSU9OX1VOQVZBSUxBQkxFXyA6IHBvc2l0aW9uRXJyb3JDb2RlIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVElNRU9VVCA6IHBvc2l0aW9uRXJyb3JDb2RlIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb2RlIDogcG9zaXRpb25FcnJvckNvZGUgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1lc3NhZ2UgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGdlb2xvY2F0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGdldEN1cnJlbnRQb3NpdGlvbiA6XG4gICAgICAgICAocG9zaXRpb24gSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAgLT4gKHBvc2l0aW9uRXJyb3IgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAgLT4gcG9zaXRpb25PcHRpb25zIEpzLnRcbiAgICAgIC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHdhdGNoUG9zaXRpb24gOlxuICAgICAgICAgKHBvc2l0aW9uIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgIC0+IChwb3NpdGlvbkVycm9yIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgIC0+IHBvc2l0aW9uT3B0aW9ucyBKcy50XG4gICAgICAtPiB3YXRjaElkIEpzLm1ldGhcblxuICAgIG1ldGhvZCBjbGVhcldhdGNoIDogd2F0Y2hJZCAtPiB1bml0IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBlbXB0eV9wb3NpdGlvbl9vcHRpb25zICgpID0gSnMuVW5zYWZlLm9iaiBbfHxdXG5cbmxldCBnZW9sb2NhdGlvbiA9XG4gIGxldCB4ID0gSnMuVW5zYWZlLmdsb2JhbCMjLm5hdmlnYXRvciBpblxuICBpZiBKcy5PcHRkZWYudGVzdCB4IHRoZW4geCMjLmdlb2xvY2F0aW9uIGVsc2UgeFxuXG4oKiB1bmRlZmluZWQgKilcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IGdlb2xvY2F0aW9uXG4iLCJjbGFzcyB0eXBlIGludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdGFyZ2V0IDogRG9tLm5vZGUgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYm91bmRpbmdDbGllbnRSZWN0IDogRG9tX2h0bWwuY2xpZW50UmVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByb290Qm91bmRzIDogRG9tX2h0bWwuY2xpZW50UmVjdCBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW50ZXJzZWN0aW9uUmVjdCA6IERvbV9odG1sLmNsaWVudFJlY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW50ZXJzZWN0aW9uUmF0aW8gOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXNJbnRlcnNlY3RpbmcgOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRpbWUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGludGVyc2VjdGlvbk9ic2VydmVyT3B0aW9ucyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCByb290IDogRG9tLm5vZGUgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJvb3RNYXJnaW4gOiBKcy5qc19zdHJpbmcgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRocmVzaG9sZCA6IGZsb2F0IEpzLmpzX2FycmF5IEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgcm9vdCA6IERvbS5ub2RlIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByb290TWFyZ2luIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRocmVzaG9sZHMgOiBmbG9hdCBKcy5qc19hcnJheSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvYnNlcnZlIDogI0RvbS5ub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgdW5vYnNlcnZlIDogI0RvbS5ub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgZGlzY29ubmVjdCA6IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHRha2VSZWNvcmRzIDogaW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBlbXB0eV9pbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfb3B0aW9ucyAoKSA6IGludGVyc2VjdGlvbk9ic2VydmVyT3B0aW9ucyBKcy50ID1cbiAgSnMuVW5zYWZlLm9iaiBbfHxdXG5cbmxldCBpbnRlcnNlY3Rpb25PYnNlcnZlcl91bnNhZmUgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGVyc2VjdGlvbk9ic2VydmVyXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCBpbnRlcnNlY3Rpb25PYnNlcnZlcl91bnNhZmVcblxubGV0IGludGVyc2VjdGlvbk9ic2VydmVyIDpcbiAgICAoICAgKCAgIGludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy50XG4gICAgICAgICAtPiBpbnRlcnNlY3Rpb25PYnNlcnZlciBKcy50XG4gICAgICAgICAtPiB1bml0KVxuICAgICAgICBKcy5jYWxsYmFja1xuICAgICAtPiBpbnRlcnNlY3Rpb25PYnNlcnZlck9wdGlvbnMgSnMudFxuICAgICAtPiBpbnRlcnNlY3Rpb25PYnNlcnZlciBKcy50KVxuICAgIEpzLmNvbnN0ciA9XG4gIGludGVyc2VjdGlvbk9ic2VydmVyX3Vuc2FmZVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxOCBTdMOpcGhhbmUgTGVncmFuZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbm1vZHVsZSB0eXBlIFNoYXJlZCA9IHNpZ1xuICBjbGFzcyB0eXBlIG9iamVjdF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuICAgIGVuZFxuXG4gIHZhbCBvYmplY3Rfb3B0aW9ucyA6IHVuaXQgLT4gb2JqZWN0X29wdGlvbnMgSnMudFxuXG4gIGNsYXNzIHR5cGUgX29iamVjdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2Qgc3VwcG9ydGVkTG9jYWxlc09mIDpcbiAgICAgICAgICAgSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudFxuICAgICAgICAtPiBvYmplY3Rfb3B0aW9ucyBKcy50IEpzLm9wdGRlZlxuICAgICAgICAtPiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5tb2R1bGUgU2hhcmVkIDogU2hhcmVkID0gc3RydWN0XG4gIGNsYXNzIHR5cGUgb2JqZWN0X29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG4gICAgZW5kXG5cbiAgbGV0IG9iamVjdF9vcHRpb25zICgpID1cbiAgICBvYmplY3QlanNcbiAgICAgIHZhbCBtdXRhYmxlIGxvY2FsZU1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBfb2JqZWN0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBzdXBwb3J0ZWRMb2NhbGVzT2YgOlxuICAgICAgICAgICBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50XG4gICAgICAgIC0+IG9iamVjdF9vcHRpb25zIEpzLnQgSnMub3B0ZGVmXG4gICAgICAgIC0+IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbm1vZHVsZSBDb2xsYXRvciA9IHN0cnVjdFxuICBpbmNsdWRlIFNoYXJlZFxuXG4gIGNsYXNzIHR5cGUgcmVzb2x2ZWRfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgdXNhZ2UgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBzZW5zaXRpdml0eSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGlnbm9yZVB1bmN0dWF0aW9uIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGNvbGxhdGlvbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG51bWVyaWMgOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgY2FzZUZpcnN0IDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHVzYWdlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgc2Vuc2l0aXZpdHkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBpZ25vcmVQdW5jdHVhdGlvbiA6IGJvb2wgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1lcmljIDogYm9vbCBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIGNhc2VGaXJzdCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcbiAgICBlbmRcblxuICBsZXQgb3B0aW9ucyAoKSA9XG4gICAgb2JqZWN0JWpzXG4gICAgICB2YWwgbXV0YWJsZSBsb2NhbGVNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSB1c2FnZSA9IEpzLnN0cmluZyBcInNvcnRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSBzZW5zaXRpdml0eSA9IEpzLnN0cmluZyBcInZhcmlhbnRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSBpZ25vcmVQdW5jdHVhdGlvbiA9IEpzLl9mYWxzZVxuXG4gICAgICB2YWwgbXV0YWJsZSBudW1lcmljID0gSnMuX2ZhbHNlXG5cbiAgICAgIHZhbCBtdXRhYmxlIGNhc2VGaXJzdCA9IEpzLnN0cmluZyBcImZhbHNlXCJcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIHQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGNvbXBhcmUgOiAoSnMuanNfc3RyaW5nIEpzLnQgLT4gSnMuanNfc3RyaW5nIEpzLnQgLT4gaW50KSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCByZXNvbHZlZE9wdGlvbnMgOiB1bml0IC0+IHJlc29sdmVkX29wdGlvbnMgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxubW9kdWxlIERhdGVUaW1lRm9ybWF0ID0gc3RydWN0XG4gIGluY2x1ZGUgU2hhcmVkXG5cbiAgY2xhc3MgdHlwZSByZXNvbHZlZF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBjYWxlbmRhciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG51bWJlcmluZ1N5c3RlbSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHRpbWVab25lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgaG91cjEyIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHdlZWtkYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgZXJhIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIHllYXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbW9udGggOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgZGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIGhvdXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWludXRlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIHNlY29uZCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCB0aW1lWm9uZU5hbWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgZGF0ZVN0eWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHRpbWVTdHlsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBjYWxlbmRhciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBkYXlQZXJpb2QgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbnVtYmVyaW5nU3lzdGVtIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB0aW1lWm9uZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBob3VyMTIgOiBib29sIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGhvdXJDeWNsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBmb3JtYXRNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgd2Vla2RheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBlcmEgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgeWVhciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtb250aCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBkYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgaG91ciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW51dGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgc2Vjb25kIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGZyYWN0aW9uYWxTZWNvbmREaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHRpbWVab25lTmFtZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG4gICAgZW5kXG5cbiAgbGV0IG9wdGlvbnMgKCkgOiBvcHRpb25zIEpzLnQgPVxuICAgIG9iamVjdCVqc1xuICAgICAgdmFsIG11dGFibGUgZGF0ZVN0eWxlID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHRpbWVTdHlsZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBjYWxlbmRhciA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBkYXlQZXJpb2QgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbnVtYmVyaW5nU3lzdGVtID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGxvY2FsZU1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIHRpbWVab25lID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGhvdXIxMiA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBob3VyQ3ljbGUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgZm9ybWF0TWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcblxuICAgICAgdmFsIG11dGFibGUgd2Vla2RheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBlcmEgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgeWVhciA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtb250aCA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBkYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgaG91ciA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtaW51dGUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgc2Vjb25kID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGZyYWN0aW9uYWxTZWNvbmREaWdpdHMgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgdGltZVpvbmVOYW1lID0gSnMudW5kZWZpbmVkXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBmb3JtYXRfcGFydCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgX3R5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBfdmFsdWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSB0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBmb3JtYXQgOiAoSnMuZGF0ZSBKcy50IC0+IEpzLmpzX3N0cmluZyBKcy50KSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBmb3JtYXRUb1BhcnRzIDpcbiAgICAgICAgSnMuZGF0ZSBKcy50IEpzLm9wdGRlZiAtPiBmb3JtYXRfcGFydCBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuXG4gICAgICBtZXRob2QgcmVzb2x2ZWRPcHRpb25zIDogdW5pdCAtPiByZXNvbHZlZF9vcHRpb25zIEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbm1vZHVsZSBOdW1iZXJGb3JtYXQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTaGFyZWRcblxuICBjbGFzcyB0eXBlIHJlc29sdmVkX29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG51bWJlcmluZ1N5c3RlbSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHN0eWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgY3VycmVuY3kgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgY3VycmVuY3lEaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIHVzZUdyb3VwaW5nIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1JbnRlZ2VyRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIG9wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGNvbXBhY3REaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGN1cnJlbmN5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGN1cnJlbmN5RGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBjdXJyZW5jeVNpZ24gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIG5vdGF0aW9uIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG51bWJlcmluZ1N5c3RlbSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBzaWduRGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBzdHlsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHVuaXQgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdW5pdERpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdXNlR3JvdXBpbmcgOiBib29sIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgcm91bmRpbmdNb2RlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHJvdW5kaW5nUHJpb3JpdHkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgcm91bmRpbmdJbmNyZW1lbnQgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdHJhaWxpbmdaZXJvRGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtSW50ZWdlckRpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG4gICAgZW5kXG5cbiAgbGV0IG9wdGlvbnMgKCkgOiBvcHRpb25zIEpzLnQgPVxuICAgIG9iamVjdCVqc1xuICAgICAgdmFsIG11dGFibGUgY29tcGFjdERpc3BsYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgY3VycmVuY3kgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgY3VycmVuY3lEaXNwbGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGN1cnJlbmN5U2lnbiA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBsb2NhbGVNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSBub3RhdGlvbiA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBudW1iZXJpbmdTeXN0ZW0gPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgc2lnbkRpc3BsYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgc3R5bGUgPSBKcy5zdHJpbmcgXCJkZWNpbWFsXCJcblxuICAgICAgdmFsIG11dGFibGUgdW5pdCA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB1bml0RGlzcGxheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB1c2VHcm91cGluZyA9IEpzLl90cnVlXG5cbiAgICAgIHZhbCBtdXRhYmxlIHJvdW5kaW5nTW9kZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSByb3VuZGluZ1ByaW9yaXR5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHJvdW5kaW5nSW5jcmVtZW50ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHRyYWlsaW5nWmVyb0Rpc3BsYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWluaW11bUludGVnZXJEaWdpdHMgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWluaW11bUZyYWN0aW9uRGlnaXRzID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1heGltdW1GcmFjdGlvbkRpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWF4aW11bVNpZ25pZmljYW50RGlnaXRzID0gSnMudW5kZWZpbmVkXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBmb3JtYXRfcGFydCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgX3R5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBfdmFsdWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSB0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBmb3JtYXQgOiAoSnMubnVtYmVyIEpzLnQgLT4gSnMuanNfc3RyaW5nIEpzLnQpIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGZvcm1hdFRvUGFydHMgOlxuICAgICAgICBKcy5udW1iZXIgSnMudCBKcy5vcHRkZWYgLT4gZm9ybWF0X3BhcnQgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcblxuICAgICAgbWV0aG9kIHJlc29sdmVkT3B0aW9ucyA6IHVuaXQgLT4gcmVzb2x2ZWRfb3B0aW9ucyBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5tb2R1bGUgUGx1cmFsUnVsZXMgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTaGFyZWRcblxuICBjbGFzcyB0eXBlIHJlc29sdmVkX29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHBsdXJhbENhdGVnb3JpZXMgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIF90eXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUludGVnZXJEaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIF90eXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuICAgIGVuZFxuXG4gIGxldCBvcHRpb25zICgpIDogb3B0aW9ucyBKcy50ID1cbiAgICBvYmplY3QlanNcbiAgICAgIHZhbCBtdXRhYmxlIGxvY2FsZU1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIF90eXBlID0gSnMuc3RyaW5nIFwiY2FyZGluYWxcIlxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2Qgc2VsZWN0IDogSnMubnVtYmVyIEpzLnQgLT4gSnMuanNfc3RyaW5nIEpzLnQgSnMubWV0aFxuXG4gICAgICBtZXRob2QgcmVzb2x2ZWRPcHRpb25zIDogdW5pdCAtPiByZXNvbHZlZF9vcHRpb25zIEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbmNsYXNzIHR5cGUgaW50bCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfQ29sbGF0b3IgOiBDb2xsYXRvci5fb2JqZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9EYXRlVGltZUZvcm1hdCA6IERhdGVUaW1lRm9ybWF0Ll9vYmplY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX051bWJlckZvcm1hdCA6IE51bWJlckZvcm1hdC5fb2JqZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QbHVyYWxSdWxlcyA6IFBsdXJhbFJ1bGVzLl9vYmplY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0Q2Fub25pY2FsTG9jYWxlcyA6XG4gICAgICBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IC0+IEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICBlbmRcblxubGV0IGludGwgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGxcblxubGV0IGNvbGxhdG9yX2NvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50bCMjLl9Db2xsYXRvclxuXG5sZXQgZGF0ZVRpbWVGb3JtYXRfY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRsIyMuX0RhdGVUaW1lRm9ybWF0XG5cbmxldCBudW1iZXJGb3JtYXRfY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRsIyMuX051bWJlckZvcm1hdFxuXG5sZXQgcGx1cmFsUnVsZXNfY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRsIyMuX1BsdXJhbFJ1bGVzXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCBpbnRsXG4iLCJtb2R1bGUgdHlwZSBTID0gc2lnXG4gIHZhbCBwcmVfdGVzdF9ob29rIDogdW5pdCAtPiB1bml0XG5lbmRcblxubGV0IHByZV90ZXN0X2hvb2sgPSBpZ25vcmVcbiIsIltAQEBvY2FtbC53YXJuaW5nIFwiLTNcIl1cblxuKCogYmxpdF9zdHJpbmcgZG9lc24ndCBleGlzdCBpbiBbU3RkTGFiZWxzLkJ5dGVzXS4uLiAgKilcbmxldCBieXRlc19ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zIH5kc3QgfmRzdF9wb3MgfmxlbiA9XG4gIEJ5dGVzLmJsaXRfc3RyaW5nIHNyYyBzcmNfcG9zIGRzdCBkc3RfcG9zIGxlblxuOztcblxub3BlbiBTdGRMYWJlbHNcbm9wZW4gRm9ybWF0XG5cbigqKiBUeXBlIG9mIFMtZXhwcmVzc2lvbnMgKilcbnR5cGUgdCA9XG4gIHwgQXRvbSBvZiBzdHJpbmdcbiAgfCBMaXN0IG9mIHQgbGlzdFxuXG5sZXQgc2V4cF9vZl90IHQgPSB0XG5sZXQgdF9vZl9zZXhwIHQgPSB0XG5cbmxldCByZWMgY29tcGFyZV9saXN0IGEgYiA9XG4gIG1hdGNoIGEsIGIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgeCA6OiB4cywgeSA6OiB5cyAtPlxuICAgIGxldCByZXMgPSBjb21wYXJlIHggeSBpblxuICAgIGlmIHJlcyA8PiAwIHRoZW4gcmVzIGVsc2UgY29tcGFyZV9saXN0IHhzIHlzXG5cbmFuZCBjb21wYXJlIGEgYiA9XG4gIGlmIGEgPT0gYlxuICB0aGVuIDBcbiAgZWxzZSAoXG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBBdG9tIGEsIEF0b20gYiAtPiBTdHJpbmcuY29tcGFyZSBhIGJcbiAgICB8IEF0b20gXywgXyAtPiAtMVxuICAgIHwgXywgQXRvbSBfIC0+IDFcbiAgICB8IExpc3QgYSwgTGlzdCBiIC0+IGNvbXBhcmVfbGlzdCBhIGIpXG47O1xuXG5sZXQgZXF1YWwgYSBiID0gY29tcGFyZSBhIGIgPSAwXG5cbmV4Y2VwdGlvbiBOb3RfZm91bmRfcyBvZiB0XG5leGNlcHRpb24gT2Zfc2V4cF9lcnJvciBvZiBleG4gKiB0XG5cbm1vZHVsZSBQcmludGluZyA9IHN0cnVjdFxuICAoKiBEZWZhdWx0IGluZGVudGF0aW9uIGxldmVsIGZvciBodW1hbi1yZWFkYWJsZSBjb252ZXJzaW9ucyAqKVxuXG4gIGxldCBkZWZhdWx0X2luZGVudCA9IHJlZiAxXG5cbiAgKCogRXNjYXBpbmcgb2Ygc3RyaW5ncyB1c2VkIGFzIGF0b21zIGluIFMtZXhwcmVzc2lvbnMgKilcblxuICBsZXQgbXVzdF9lc2NhcGUgc3RyID1cbiAgICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgICBsZW4gPSAwXG4gICAgfHxcbiAgICBsZXQgcmVjIGxvb3Agc3RyIGl4ID1cbiAgICAgIG1hdGNoIHN0ci5baXhdIHdpdGhcbiAgICAgIHwgJ1wiJyB8ICcoJyB8ICcpJyB8ICc7JyB8ICdcXFxcJyAtPiB0cnVlXG4gICAgICB8ICd8JyAtPlxuICAgICAgICBpeCA+IDBcbiAgICAgICAgJiZcbiAgICAgICAgbGV0IG5leHQgPSBpeCAtIDEgaW5cbiAgICAgICAgQ2hhci5lcXVhbCBzdHIuW25leHRdICcjJyB8fCBsb29wIHN0ciBuZXh0XG4gICAgICB8ICcjJyAtPlxuICAgICAgICBpeCA+IDBcbiAgICAgICAgJiZcbiAgICAgICAgbGV0IG5leHQgPSBpeCAtIDEgaW5cbiAgICAgICAgQ2hhci5lcXVhbCBzdHIuW25leHRdICd8JyB8fCBsb29wIHN0ciBuZXh0XG4gICAgICB8ICdcXDAwMCcgLi4gJ1xcMDMyJyB8ICdcXDEyNycgLi4gJ1xcMjU1JyAtPiB0cnVlXG4gICAgICB8IF8gLT4gaXggPiAwICYmIGxvb3Agc3RyIChpeCAtIDEpXG4gICAgaW5cbiAgICBsb29wIHN0ciAobGVuIC0gMSlcbiAgOztcblxuICBsZXQgZXNjYXBlZCBzID1cbiAgICBsZXQgbiA9IHJlZiAwIGluXG4gICAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggcyAtIDEgZG9cbiAgICAgIG5cbiAgICAgIDo9ICFuXG4gICAgICAgICArXG4gICAgICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgICAgfCAnXFxcIicgfCAnXFxcXCcgfCAnXFxuJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxiJyAtPiAyXG4gICAgICAgICB8ICcgJyAuLiAnficgLT4gMVxuICAgICAgICAgfCBfIC0+IDRcbiAgICBkb25lO1xuICAgIGlmICFuID0gU3RyaW5nLmxlbmd0aCBzXG4gICAgdGhlbiBzXG4gICAgZWxzZSAoXG4gICAgICBsZXQgcycgPSBCeXRlcy5jcmVhdGUgIW4gaW5cbiAgICAgIG4gOj0gMDtcbiAgICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICAgIChtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgICAgfCAoJ1xcXCInIHwgJ1xcXFwnKSBhcyBjIC0+XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgICBpbmNyIG47XG4gICAgICAgICAgIEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gY1xuICAgICAgICAgfCAnXFxuJyAtPlxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICduJ1xuICAgICAgICAgfCAnXFx0JyAtPlxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICd0J1xuICAgICAgICAgfCAnXFxyJyAtPlxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdyJ1xuICAgICAgICAgfCAnXFxiJyAtPlxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdiJ1xuICAgICAgICAgfCAnICcgLi4gJ34nIGFzIGMgLT4gQnl0ZXMudW5zYWZlX3NldCBzJyAhbiBjXG4gICAgICAgICB8IGMgLT5cbiAgICAgICAgICAgbGV0IGEgPSBDaGFyLmNvZGUgYyBpblxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuIChDaGFyLmNociAoNDggKyAoYSAvIDEwMCkpKTtcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuIChDaGFyLmNociAoNDggKyAoYSAvIDEwIG1vZCAxMCkpKTtcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuIChDaGFyLmNociAoNDggKyAoYSBtb2QgMTApKSkpO1xuICAgICAgICBpbmNyIG5cbiAgICAgIGRvbmU7XG4gICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMnKVxuICA7O1xuXG4gIGxldCBlc2Nfc3RyIHN0ciA9XG4gICAgbGV0IGVzdHIgPSBlc2NhcGVkIHN0ciBpblxuICAgIGxldCBlbGVuID0gU3RyaW5nLmxlbmd0aCBlc3RyIGluXG4gICAgbGV0IHJlcyA9IEJ5dGVzLmNyZWF0ZSAoZWxlbiArIDIpIGluXG4gICAgYnl0ZXNfYmxpdF9zdHJpbmcgfnNyYzplc3RyIH5zcmNfcG9zOjAgfmRzdDpyZXMgfmRzdF9wb3M6MSB+bGVuOmVsZW47XG4gICAgQnl0ZXMudW5zYWZlX3NldCByZXMgMCAnXCInO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzIChlbGVuICsgMSkgJ1wiJztcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuICA7O1xuXG4gIGxldCBpbmRleF9vZl9uZXdsaW5lIHN0ciBzdGFydCA9XG4gICAgdHJ5IFNvbWUgKFN0cmluZy5pbmRleF9mcm9tIHN0ciBzdGFydCAnXFxuJykgd2l0aFxuICAgIHwgTm90X2ZvdW5kIC0+IE5vbmVcbiAgOztcblxuICBsZXQgZ2V0X3N1YnN0cmluZyBzdHIgaW5kZXggZW5kX3Bvc19vcHQgPVxuICAgIGxldCBlbmRfcG9zID1cbiAgICAgIG1hdGNoIGVuZF9wb3Nfb3B0IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBTdHJpbmcubGVuZ3RoIHN0clxuICAgICAgfCBTb21lIGVuZF9wb3MgLT4gZW5kX3Bvc1xuICAgIGluXG4gICAgU3RyaW5nLnN1YiBzdHIgfnBvczppbmRleCB+bGVuOihlbmRfcG9zIC0gaW5kZXgpXG4gIDs7XG5cbiAgbGV0IGlzX29uZV9saW5lIHN0ciA9XG4gICAgbWF0Y2ggaW5kZXhfb2ZfbmV3bGluZSBzdHIgMCB3aXRoXG4gICAgfCBOb25lIC0+IHRydWVcbiAgICB8IFNvbWUgaW5kZXggLT4gaW5kZXggKyAxID0gU3RyaW5nLmxlbmd0aCBzdHJcbiAgOztcblxuICBsZXQgcHBfaHVtX21heWJlX2VzY19zdHIgcHBmIHN0ciA9XG4gICAgaWYgbm90IChtdXN0X2VzY2FwZSBzdHIpXG4gICAgdGhlbiBwcF9wcmludF9zdHJpbmcgcHBmIHN0clxuICAgIGVsc2UgaWYgaXNfb25lX2xpbmUgc3RyXG4gICAgdGhlbiBwcF9wcmludF9zdHJpbmcgcHBmIChlc2Nfc3RyIHN0cilcbiAgICBlbHNlIChcbiAgICAgIGxldCByZWMgbG9vcCBpbmRleCA9XG4gICAgICAgIGxldCBuZXh0X25ld2xpbmUgPSBpbmRleF9vZl9uZXdsaW5lIHN0ciBpbmRleCBpblxuICAgICAgICBsZXQgbmV4dF9saW5lID0gZ2V0X3N1YnN0cmluZyBzdHIgaW5kZXggbmV4dF9uZXdsaW5lIGluXG4gICAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgKGVzY2FwZWQgbmV4dF9saW5lKTtcbiAgICAgICAgbWF0Y2ggbmV4dF9uZXdsaW5lIHdpdGhcbiAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgIHwgU29tZSBuZXdsaW5lX2luZGV4IC0+XG4gICAgICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIlxcXFxcIjtcbiAgICAgICAgICBwcF9mb3JjZV9uZXdsaW5lIHBwZiAoKTtcbiAgICAgICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiXFxcXG5cIjtcbiAgICAgICAgICBsb29wIChuZXdsaW5lX2luZGV4ICsgMSlcbiAgICAgIGluXG4gICAgICBwcF9vcGVuX2JveCBwcGYgMDtcbiAgICAgICgqIHRoZSBsZWFkaW5nIHNwYWNlIGlzIHRvIGxpbmUgdXAgdGhlIGxpbmVzICopXG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiIFxcXCJcIjtcbiAgICAgIGxvb3AgMDtcbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCJcXFwiXCI7XG4gICAgICBwcF9jbG9zZV9ib3ggcHBmICgpKVxuICA7O1xuXG4gIGxldCBtYWNoX21heWJlX2VzY19zdHIgc3RyID0gaWYgbXVzdF9lc2NhcGUgc3RyIHRoZW4gZXNjX3N0ciBzdHIgZWxzZSBzdHJcblxuICAoKiBPdXRwdXQgb2YgUy1leHByZXNzaW9ucyB0byBmb3JtYXR0ZXJzICopXG5cbiAgbGV0IHJlYyBwcF9odW1faW5kZW50IGluZGVudCBwcGYgPSBmdW5jdGlvblxuICAgIHwgQXRvbSBzdHIgLT4gcHBfaHVtX21heWJlX2VzY19zdHIgcHBmIHN0clxuICAgIHwgTGlzdCAoaCA6OiB0KSAtPlxuICAgICAgcHBfb3Blbl9ib3ggcHBmIGluZGVudDtcbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCIoXCI7XG4gICAgICBwcF9odW1faW5kZW50IGluZGVudCBwcGYgaDtcbiAgICAgIHBwX2h1bV9yZXN0IGluZGVudCBwcGYgdFxuICAgIHwgTGlzdCBbXSAtPiBwcF9wcmludF9zdHJpbmcgcHBmIFwiKClcIlxuXG4gIGFuZCBwcF9odW1fcmVzdCBpbmRlbnQgcHBmID0gZnVuY3Rpb25cbiAgICB8IGggOjogdCAtPlxuICAgICAgcHBfcHJpbnRfc3BhY2UgcHBmICgpO1xuICAgICAgcHBfaHVtX2luZGVudCBpbmRlbnQgcHBmIGg7XG4gICAgICBwcF9odW1fcmVzdCBpbmRlbnQgcHBmIHRcbiAgICB8IFtdIC0+XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiKVwiO1xuICAgICAgcHBfY2xvc2VfYm94IHBwZiAoKVxuICA7O1xuXG4gIGxldCByZWMgcHBfbWFjaF9pbnRlcm5hbCBtYXlfbmVlZF9zcGFjZSBwcGYgPSBmdW5jdGlvblxuICAgIHwgQXRvbSBzdHIgLT5cbiAgICAgIGxldCBzdHInID0gbWFjaF9tYXliZV9lc2Nfc3RyIHN0ciBpblxuICAgICAgbGV0IG5ld19tYXlfbmVlZF9zcGFjZSA9IHN0cicgPT0gc3RyIGluXG4gICAgICBpZiBtYXlfbmVlZF9zcGFjZSAmJiBuZXdfbWF5X25lZWRfc3BhY2UgdGhlbiBwcF9wcmludF9zdHJpbmcgcHBmIFwiIFwiO1xuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBzdHInO1xuICAgICAgbmV3X21heV9uZWVkX3NwYWNlXG4gICAgfCBMaXN0IChoIDo6IHQpIC0+XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiKFwiO1xuICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gcHBfbWFjaF9pbnRlcm5hbCBmYWxzZSBwcGYgaCBpblxuICAgICAgcHBfbWFjaF9yZXN0IG1heV9uZWVkX3NwYWNlIHBwZiB0O1xuICAgICAgZmFsc2VcbiAgICB8IExpc3QgW10gLT5cbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCIoKVwiO1xuICAgICAgZmFsc2VcblxuICBhbmQgcHBfbWFjaF9yZXN0IG1heV9uZWVkX3NwYWNlIHBwZiA9IGZ1bmN0aW9uXG4gICAgfCBoIDo6IHQgLT5cbiAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IHBwX21hY2hfaW50ZXJuYWwgbWF5X25lZWRfc3BhY2UgcHBmIGggaW5cbiAgICAgIHBwX21hY2hfcmVzdCBtYXlfbmVlZF9zcGFjZSBwcGYgdFxuICAgIHwgW10gLT4gcHBfcHJpbnRfc3RyaW5nIHBwZiBcIilcIlxuICA7O1xuXG4gIGxldCBwcF9odW0gcHBmIHNleHAgPSBwcF9odW1faW5kZW50ICFkZWZhdWx0X2luZGVudCBwcGYgc2V4cFxuICBsZXQgcHBfbWFjaCBwcGYgc2V4cCA9IGlnbm9yZSAocHBfbWFjaF9pbnRlcm5hbCBmYWxzZSBwcGYgc2V4cClcbiAgbGV0IHBwID0gcHBfbWFjaFxuXG4gICgqIFNleHAgc2l6ZSAqKVxuXG4gIGxldCByZWMgc2l6ZV9sb29wICgodiwgYykgYXMgYWNjKSA9IGZ1bmN0aW9uXG4gICAgfCBBdG9tIHN0ciAtPiB2ICsgMSwgYyArIFN0cmluZy5sZW5ndGggc3RyXG4gICAgfCBMaXN0IGxzdCAtPiBMaXN0LmZvbGRfbGVmdCBsc3QgfmluaXQ6YWNjIH5mOnNpemVfbG9vcFxuICA7O1xuXG4gIGxldCBzaXplIHNleHAgPSBzaXplX2xvb3AgKDAsIDApIHNleHBcblxuICAoKiBCdWZmZXIgY29udmVyc2lvbnMgKilcblxuICBsZXQgdG9fYnVmZmVyX2h1bSB+YnVmID8oaW5kZW50ID0gIWRlZmF1bHRfaW5kZW50KSBzZXhwID1cbiAgICBsZXQgcHBmID0gRm9ybWF0LmZvcm1hdHRlcl9vZl9idWZmZXIgYnVmIGluXG4gICAgRm9ybWF0LmZwcmludGYgcHBmIFwiJWFAP1wiIChwcF9odW1faW5kZW50IGluZGVudCkgc2V4cFxuICA7O1xuXG4gIGxldCB0b19idWZmZXJfbWFjaCB+YnVmIHNleHAgPVxuICAgIGxldCByZWMgbG9vcCBtYXlfbmVlZF9zcGFjZSA9IGZ1bmN0aW9uXG4gICAgICB8IEF0b20gc3RyIC0+XG4gICAgICAgIGxldCBzdHInID0gbWFjaF9tYXliZV9lc2Nfc3RyIHN0ciBpblxuICAgICAgICBsZXQgbmV3X21heV9uZWVkX3NwYWNlID0gc3RyJyA9PSBzdHIgaW5cbiAgICAgICAgaWYgbWF5X25lZWRfc3BhY2UgJiYgbmV3X21heV9uZWVkX3NwYWNlIHRoZW4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnICc7XG4gICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBzdHInO1xuICAgICAgICBuZXdfbWF5X25lZWRfc3BhY2VcbiAgICAgIHwgTGlzdCAoaCA6OiB0KSAtPlxuICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYnVmICcoJztcbiAgICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gbG9vcCBmYWxzZSBoIGluXG4gICAgICAgIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSB0O1xuICAgICAgICBmYWxzZVxuICAgICAgfCBMaXN0IFtdIC0+XG4gICAgICAgIEJ1ZmZlci5hZGRfc3RyaW5nIGJ1ZiBcIigpXCI7XG4gICAgICAgIGZhbHNlXG4gICAgYW5kIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSA9IGZ1bmN0aW9uXG4gICAgICB8IGggOjogdCAtPlxuICAgICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBsb29wIG1heV9uZWVkX3NwYWNlIGggaW5cbiAgICAgICAgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlIHRcbiAgICAgIHwgW10gLT4gQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnKSdcbiAgICBpblxuICAgIGlnbm9yZSAobG9vcCBmYWxzZSBzZXhwKVxuICA7O1xuXG4gIGxldCB0b19idWZmZXIgPSB0b19idWZmZXJfbWFjaFxuXG4gIGxldCB0b19idWZmZXJfZ2VuIH5idWYgfmFkZF9jaGFyIH5hZGRfc3RyaW5nIHNleHAgPVxuICAgIGxldCByZWMgbG9vcCBtYXlfbmVlZF9zcGFjZSA9IGZ1bmN0aW9uXG4gICAgICB8IEF0b20gc3RyIC0+XG4gICAgICAgIGxldCBzdHInID0gbWFjaF9tYXliZV9lc2Nfc3RyIHN0ciBpblxuICAgICAgICBsZXQgbmV3X21heV9uZWVkX3NwYWNlID0gc3RyJyA9PSBzdHIgaW5cbiAgICAgICAgaWYgbWF5X25lZWRfc3BhY2UgJiYgbmV3X21heV9uZWVkX3NwYWNlIHRoZW4gYWRkX2NoYXIgYnVmICcgJztcbiAgICAgICAgYWRkX3N0cmluZyBidWYgc3RyJztcbiAgICAgICAgbmV3X21heV9uZWVkX3NwYWNlXG4gICAgICB8IExpc3QgKGggOjogdCkgLT5cbiAgICAgICAgYWRkX2NoYXIgYnVmICcoJztcbiAgICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gbG9vcCBmYWxzZSBoIGluXG4gICAgICAgIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSB0O1xuICAgICAgICBmYWxzZVxuICAgICAgfCBMaXN0IFtdIC0+XG4gICAgICAgIGFkZF9zdHJpbmcgYnVmIFwiKClcIjtcbiAgICAgICAgZmFsc2VcbiAgICBhbmQgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlID0gZnVuY3Rpb25cbiAgICAgIHwgaCA6OiB0IC0+XG4gICAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IGxvb3AgbWF5X25lZWRfc3BhY2UgaCBpblxuICAgICAgICBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgdFxuICAgICAgfCBbXSAtPiBhZGRfY2hhciBidWYgJyknXG4gICAgaW5cbiAgICBpZ25vcmUgKGxvb3AgZmFsc2Ugc2V4cClcbiAgOztcblxuICAoKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgdGhpbmcgb24gdGhlIG1pbm9yIGhlYXAgaXMgMjU2IHdvcmRzLlxuICAgICBQcmV2aW91c2x5LCB0aGlzIHNpemUgb2YgdGhlIHJldHVybmVkIGJ1ZmZlciBoZXJlIHdhcyA0MDk2IGJ5dGVzLCB3aGljaFxuICAgICBjYXVzZWQgdGhlIEJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQgb24gdGhlICptYWpvciogaGVhcCBldmVyeSB0aW1lLlxuXG4gICAgIEFjY29yZGluZyB0byBhIHNpbXBsZSBiZW5jaG1hcmsgYnkgUm9uLCB3ZSBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3JcbiAgICAgc21hbGwgcy1leHByZXNzaW9ucyBieSBhIGZhY3RvciBvZiB+NCBpZiB3ZSBvbmx5IGFsbG9jYXRlIDEwMjQgYnl0ZXNcbiAgICAgKDEyOCB3b3JkcyArIHNvbWUgc21hbGwgb3ZlcmhlYWQpIHdvcnRoIG9mIGJ1ZmZlciBpbml0aWFsbHkuICBBbmQgb25lXG4gICAgIGNhbiBhcmd1ZSB0aGF0IGlmIGl0J3MgZnJlZSB0byBhbGxvY2F0ZSBzdHJpbmdzIHNtYWxsZXIgdGhhbiAyNTYgd29yZHMsXG4gICAgIGxhcmdlIHMtZXhwcmVzc2lvbnMgcmVxdWlyaW5nIGxhcmdlciBleHBlbnNpdmUgYnVmZmVycyB3b24ndCBub3RpY2VcbiAgICAgdGhlIGV4dHJhIHR3byBkb3VibGluZ3MgZnJvbSAxMDI0IGJ5dGVzIHRvIDIwNDggYW5kIDQwOTYuIEFuZCBlc3BlY2lhbGx5XG4gICAgIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMgdG8gYWx3YXlzIHBhc3MgaW4gYSBsYXJnZXIgYnVmZmVyIHRvXG4gICAgIHVzZS4gKilcbiAgbGV0IGJ1ZmZlciAoKSA9IEJ1ZmZlci5jcmVhdGUgMTAyNFxuXG4gICgqIFN0cmluZyBjb252ZXJzaW9ucyAqKVxuXG4gIGxldCB0b19zdHJpbmdfaHVtID9pbmRlbnQgPSBmdW5jdGlvblxuICAgIHwgQXRvbSBzdHJcbiAgICAgIHdoZW4gbWF0Y2ggaW5kZXhfb2ZfbmV3bGluZSBzdHIgMCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICAgIHwgU29tZSBfIC0+IGZhbHNlIC0+IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHJcbiAgICB8IHNleHAgLT5cbiAgICAgIGxldCBidWYgPSBidWZmZXIgKCkgaW5cbiAgICAgIHRvX2J1ZmZlcl9odW0gP2luZGVudCBzZXhwIH5idWY7XG4gICAgICBCdWZmZXIuY29udGVudHMgYnVmXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZ19tYWNoID0gZnVuY3Rpb25cbiAgICB8IEF0b20gc3RyIC0+IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHJcbiAgICB8IHNleHAgLT5cbiAgICAgIGxldCBidWYgPSBidWZmZXIgKCkgaW5cbiAgICAgIHRvX2J1ZmZlcl9tYWNoIHNleHAgfmJ1ZjtcbiAgICAgIEJ1ZmZlci5jb250ZW50cyBidWZcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nX21hY2hcbmVuZFxuXG5pbmNsdWRlIFByaW50aW5nXG5cbmxldCBvZl9mbG9hdF9zdHlsZSA6IFsgYFVuZGVyc2NvcmVzIHwgYE5vX3VuZGVyc2NvcmVzIF0gcmVmID0gcmVmIGBOb191bmRlcnNjb3Jlc1xubGV0IG9mX2ludF9zdHlsZSA6IFsgYFVuZGVyc2NvcmVzIHwgYE5vX3VuZGVyc2NvcmVzIF0gcmVmID0gcmVmIGBOb191bmRlcnNjb3Jlc1xuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBpbmNsdWRlIFByaW50aW5nXG5lbmRcblxubGV0IG1lc3NhZ2UgbmFtZSBmaWVsZHMgPVxuICBsZXQgcmVjIGNvbnZfZmllbGRzID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IFtdXG4gICAgfCAoZm5hbWUsIGZzZXhwKSA6OiByZXN0IC0+XG4gICAgICAobWF0Y2ggZm5hbWUgd2l0aFxuICAgICAgIHwgXCJcIiAtPiBmc2V4cCA6OiBjb252X2ZpZWxkcyByZXN0XG4gICAgICAgfCBfIC0+IExpc3QgWyBBdG9tIGZuYW1lOyBmc2V4cCBdIDo6IGNvbnZfZmllbGRzIHJlc3QpXG4gIGluXG4gIExpc3QgKEF0b20gbmFtZSA6OiBjb252X2ZpZWxkcyBmaWVsZHMpXG47O1xuIiwiKCoqIFJlcHJlc2VudGF0aW9uIG9mIFMtZXhwcmVzc2lvbiBncmFtbWFycyAqKVxuXG4oKiogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIHJlcHJlc2VudGF0aW9uIGZvciBzLWV4cHJlc3Npb24gZ3JhbW1hcnMuIFVzaW5nIHBweF9zZXhwX2NvbnZcbiAgICBhbmQgW1tAQGRlcml2aW5nIHNleHBfZ3JhbW1hcl1dIHByb2R1Y2VzIGEgZ3JhbW1hciB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVyaXZlZFxuICAgIFtvZl9zZXhwXSBmb3IgYSBnaXZlbiB0eXBlLlxuXG4gICAgQXMgd2l0aCBvdGhlciBkZXJpdmVkIGRlZmluaXRpb25zLCBwb2x5bW9ycGhpYyB0eXBlcyBkZXJpdmUgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGFcbiAgICBncmFtbWFyIGZvciBlYWNoIHR5cGUgYXJndW1lbnQgYW5kIHByb2R1Y2VzIGEgZ3JhbW1hciBmb3IgdGhlIG1vbm9tb3JwaGl6ZWQgdHlwZS5cblxuICAgIE1vbm9tb3JwaGljIHR5cGVzIGRlcml2ZSBhIGdyYW1tYXIgZGlyZWN0bHkuIFRvIGF2b2lkIHRvcC1sZXZlbCBzaWRlIGVmZmVjdHMsXG4gICAgW1tAQGRlcml2aW5nIHNleHBfZ3JhbW1hcl1dIHdyYXBzIGdyYW1tYXJzIGluIHRoZSBbTGF6eV0gY29uc3RydWN0b3IgYXMgbmVlZGVkLlxuXG4gICAgVGhpcyB0eXBlIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFzIG91ciBuZWVkcyBmb3IgZXhwcmVzc2l2ZSBncmFtbWFycyBjaGFuZ2UuIFdlIHdpbGxcbiAgICBhdHRlbXB0IHRvIG1ha2UgY2hhbmdlcyBiYWNrd2FyZC1jb21wYXRpYmxlLCBvciBhdCBsZWFzdCBwcm92aWRlIGEgcmVhc29uYWJsZSB1cGdyYWRlXG4gICAgcGF0aC4gKilcblxuW0BAQHdhcm5pbmcgXCItMzBcIl0gKCogYWxsb3cgZHVwbGljYXRlIGZpZWxkIG5hbWVzICopXG5cbigqKiBHcmFtbWFyIG9mIGEgc2V4cC4gKilcbnR5cGUgZ3JhbW1hciA9XG4gIHwgQW55IG9mIHN0cmluZyAoKiogYWNjZXB0cyBhbnkgc2V4cDsgc3RyaW5nIGlzIGEgdHlwZSBuYW1lIGZvciBodW1hbiByZWFkYWJpbGl0eSAqKVxuICB8IEJvb2wgKCoqIGFjY2VwdHMgdGhlIGF0b21zIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIiwgbW9kdWxvIGNhcGl0YWxpemF0aW9uICopXG4gIHwgQ2hhciAoKiogYWNjZXB0cyBhbnkgc2luZ2xlLWNoYXJhY3RlciBhdG9tICopXG4gIHwgSW50ZWdlciAoKiogYWNjZXB0cyBhbnkgYXRvbSBtYXRjaGluZyBvY2FtbCBpbnRlZ2VyIHN5bnRheCwgcmVnYXJkbGVzcyBvZiBiaXQgd2lkdGggKilcbiAgfCBGbG9hdCAoKiogYWNjZXB0cyBhbnkgYXRvbSBtYXRjaGluZyBvY2FtbCBmbG9hdCBzeW50YXggKilcbiAgfCBTdHJpbmcgKCoqIGFjY2VwdHMgYW55IGF0b20gKilcbiAgfCBPcHRpb24gb2YgZ3JhbW1hciAoKiogYWNjZXB0cyBhbiBvcHRpb24sIGJvdGggW05vbmVdIHZzIFtTb21lIF9dIGFuZCBbKCldIHZzIFsoXyldLiAqKVxuICB8IExpc3Qgb2YgbGlzdF9ncmFtbWFyICgqKiBhY2NlcHRzIGEgbGlzdCAqKVxuICB8IFZhcmlhbnQgb2YgdmFyaWFudCAoKiogYWNjZXB0cyBjbGF1c2VzIGtleWVkIGJ5IGEgbGVhZGluZyBvciBzb2xlIGF0b20gKilcbiAgfCBVbmlvbiBvZiBncmFtbWFyIGxpc3QgKCoqIGFjY2VwdHMgYSBzZXhwIGlmIGFueSBvZiB0aGUgbGlzdGVkIGdyYW1tYXJzIGFjY2VwdHMgaXQgKilcbiAgfCBUYWdnZWQgb2YgZ3JhbW1hciB3aXRoX3RhZ1xuICAoKiogYW5ub3RhdGVzIGEgZ3JhbW1hciB3aXRoIGEgY2xpZW50LXNwZWNpZmljIGtleS92YWx1ZSBwYWlyICopXG4gIHwgVHl2YXIgb2Ygc3RyaW5nXG4gICgqKiBOYW1lIG9mIGEgdHlwZSB2YXJpYWJsZSwgZS5nLiBbVHl2YXIgXCJhXCJdIGZvciBbJ2FdLiBPbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgYm9keSBvZlxuICAgICAgdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgW2RlZm5dIGRlZmluZXMgYSBjb3JyZXNwb25kaW5nIHR5cGUgdmFyaWFibGUuICopXG4gIHwgVHljb24gb2Ygc3RyaW5nICogZ3JhbW1hciBsaXN0XG4gICgqKiBUeXBlIGNvbnN0cnVjdG9yIGFwcGxpZWQgdG8gYXJndW1lbnRzLiBGb3IgZXhhbXBsZSwgW1R5Y29uIChcImxpc3RcIiwgWyBJbnRlZ2VyIF0pXVxuICAgICAgcmVwcmVzZW50cyBbaW50IGxpc3RdLiBPbmx5IG1lYW5pbmdmdWwgd2hlbiB0aGUgaW5uZXJtb3N0IGVuY2xvc2luZyBbUmVjdXJzaXZlXVxuICAgICAgZ3JhbW1hciBkZWZpbmVzIGEgY29ycmVzcG9uZGluZyB0eXBlIGNvbnN0cnVjdG9yLiAqKVxuICB8IFJlY3Vyc2l2ZSBvZiBncmFtbWFyICogZGVmbiBsaXN0XG4gICgqKiBbUmVjdXJzaXZlIChncmFtbWFyLCBkZWZpbml0aW9ucyldIGFsbG93cyBbZ3JhbW1hcl0gdG8gcmVmZXIgdG8gdHlwZSBjb25zdHJ1Y3RvcnNcbiAgICAgIGZyb20gdGhlIG11dHVhbGx5IHJlY3Vyc2l2ZSBbZGVmaW5pdGlvbnNdLiBUaGUgZGVmaW5pdGlvbnMgbWF5IGFsc28gcmVmZXIgdG8gZWFjaFxuICAgICAgb3RoZXJzJyB0eXBlIGNvbnN0cnVjdG9ycy5cblxuICAgICAgT3JkaW5hcmlseSwgW2dyYW1tYXJdIGl0c2VsZiBpcyBqdXN0IGEgW1R5Y29uXSBhcmd1bWVudCwgYWx0aG91Z2ggdGVjaG5pY2FsbHkgaXQgY2FuXG4gICAgICBiZSBhbnkgZ3JhbW1hci5cblxuICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZGVmaW5lIGEgYmluYXJ5IHRyZWUgcGFyYW1ldGVyaXplZCBieSBhIHR5cGVcbiAgICAgIHN0b3JlZCBhdCBpdHMgbGVhdmVzLlxuXG4gICAgICB7W1xuICAgICAgICBsZXQgZGVmbnMgPVxuICAgICAgICAgIFsgeyB0eWNvbiA9IFwidHJlZVwiXG4gICAgICAgICAgICA7IHR5dmFycyA9IFtcImFcIl1cbiAgICAgICAgICAgIDsgZ3JhbW1hciA9XG4gICAgICAgICAgICAgICAgVmFyaWFudFxuICAgICAgICAgICAgICAgICAgeyBuYW1lX2tpbmQgPSBDYXBpdGFsaXplZFxuICAgICAgICAgICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgICAgICAgICBbIHsgbmFtZSA9IFwiTm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA7IGFyZ3MgPSBDb25zIChUeWNvbiAoXCJub2RlXCIsIFtUeXZhciBcImFcIl0pLCBFbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA7IHsgbmFtZSA9IFwiVHJlZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA7IGFyZ3MgPSBDb25zIChUeWNvbiAoXCJsZWFmXCIsIFtUeXZhciBcImFcIl0pLCBFbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOyB7IHR5Y29uID0gXCJub2RlXCJcbiAgICAgICAgICAgIDsgdHl2YXJzID0gW1wiYVwiXVxuICAgICAgICAgICAgOyBncmFtbWFyID0gTGlzdCAoTWFueSAoVHljb24gXCJ0cmVlXCIsIFtUeXZhciBcImFcIl0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDsgeyB0eWNvbiA9IFwibGVhZlwiXG4gICAgICAgICAgICA7IHR5dmFycyA9IFtcImFcIl1cbiAgICAgICAgICAgIDsgZ3JhbW1hciA9IFtUeXZhciBcImFcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIDs7XG4gICAgICBdfVxuXG4gICAgICBOb3JtYWxseSwgdGhlIHR5cGUgb2YgYSB0cmVlIHN0b3JpbmcgaW50ZWdlcnMgd291bGQgYmUgd3JpdHRlbiBsaWtlIHRoaXM6XG5cbiAgICAgIHtbXG4gICAgICAgIFJlY3Vyc2l2ZSAoVHljb24gKFwidHJlZVwiLCBbIEludGVnZXIgXSksIGRlZm5zKVxuICAgICAgXX1cblxuICAgICAgSXQgaXMgZXF1aXZhbGVudCwgdGhvdWdoIG5lZWRsZXNzbHkgdmVyYm9zZSwgdG8gcmVwbGFjZSB0aGUgW1R5Y29uXSByZWZlcmVuY2Ugd2l0aFxuICAgICAgdGhlIGdyYW1tYXIgb2YgW1widHJlZVwiXSwgc3Vic3RpdHV0aW5nIFtJbnRlZ2VyXSBmb3IgW1R5dmFyIFwiYVwiXTpcblxuICAgICAge1tcbiAgICAgICAgUmVjdXJzaXZlXG4gICAgICAgICAgKCBWYXJpYW50XG4gICAgICAgICAgICAgIHsgbmFtZV9raW5kID0gQ2FwaXRhbGl6ZWRcbiAgICAgICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgICAgIFsgeyBuYW1lID0gXCJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgOyBhcmdzID0gQ29ucyAoVHljb24gKFwibm9kZVwiLCBbVHl2YXIgXCJhXCJdKSwgRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDsgeyBuYW1lID0gXCJUcmVlXCJcbiAgICAgICAgICAgICAgICAgICAgOyBhcmdzID0gQ29ucyAoVHljb24gKFwibGVhZlwiLCBbVHl2YXIgXCJhXCJdKSwgRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICwgZGVmbnMgKVxuICAgICAgXX1cbiAgKilcbiAgfCBMYXp5IG9mIGdyYW1tYXIgbGF6eV90XG4gICgqKiBMYXppbHkgY29tcHV0ZWQgZ3JhbW1hci4gVXNlIFtMYXp5XSB0byBhdm9pZCB0b3AtbGV2ZWwgc2lkZSBlZmZlY3RzLiBUbyBkZWZpbmVcbiAgICAgIHJlY3Vyc2l2ZSBncmFtbWFycywgdXNlIFtSZWN1cnNpdmVdIGluc3RlYWQuICopXG5cbigqKiBHcmFtbWFyIG9mIGEgbGlzdCBvZiBzZXhwcy4gKilcbmFuZCBsaXN0X2dyYW1tYXIgPVxuICB8IEVtcHR5ICgqKiBhY2NlcHRzIGFuIGVtcHR5IGxpc3Qgb2Ygc2V4cHMgKilcbiAgfCBDb25zIG9mIGdyYW1tYXIgKiBsaXN0X2dyYW1tYXJcbiAgKCoqIGFjY2VwdHMgYSBub24tZW1wdHkgbGlzdCB3aXRoIGhlYWQgYW5kIHRhaWwgbWF0Y2hpbmcgdGhlIGdpdmVuIGdyYW1tYXJzICopXG4gIHwgTWFueSBvZiBncmFtbWFyICgqKiBhY2NlcHRzIHplcm8gb3IgbW9yZSBzZXhwcywgZWFjaCBtYXRjaGluZyB0aGUgZ2l2ZW4gZ3JhbW1hciAqKVxuICB8IEZpZWxkcyBvZiByZWNvcmQgKCoqIGFjY2VwdHMgc2V4cHMgcmVwcmVzZW50aW5nIGZpZWxkcyBvZiBhIHJlY29yZCAqKVxuXG4oKiogQ2FzZSBzZW5zaXRpdml0eSBvcHRpb25zIGZvciBuYW1lcyBvZiB2YXJpYW50IGNvbnN0cnVjdG9ycy4gKilcbmFuZCBjYXNlX3NlbnNpdGl2aXR5ID1cbiAgfCBDYXNlX2luc2Vuc2l0aXZlICgqKiBDb21wYXJpc29uIGlzIGNhc2UgaW5zZW5zaXRpdmUuIFVzZWQgZm9yIGN1c3RvbSBwYXJzZXJzLiAqKVxuICB8IENhc2Vfc2Vuc2l0aXZlICgqKiBDb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLiBVc2VkIGZvciBwb2x5bW9ycGhpYyB2YXJpYW50cy4gKilcbiAgfCBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICgqKiBDb21wYXJpc29uIGlzIGNhc2UgaW5zZW5zaXRpdmUgZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIGNhc2Ugc2Vuc2l0aXZlIGFmdGVyd2FyZC5cbiAgICAgIFVzZWQgZm9yIHJlZ3VsYXIgdmFyaWFudHMuICopXG5cbigqKiBHcmFtbWFyIG9mIHZhcmlhbnRzLiBBY2NlcHRzIGFueSBzZXhwIG1hdGNoaW5nIG9uZSBvZiB0aGUgY2xhdXNlcy4gKilcbmFuZCB2YXJpYW50ID1cbiAgeyBjYXNlX3NlbnNpdGl2aXR5IDogY2FzZV9zZW5zaXRpdml0eVxuICA7IGNsYXVzZXMgOiBjbGF1c2Ugd2l0aF90YWdfbGlzdCBsaXN0XG4gIH1cblxuKCoqIEdyYW1tYXIgb2YgYSBzaW5nbGUgdmFyaWFudCBjbGF1c2UuIEFjY2VwdHMgc2V4cHMgYmFzZWQgb24gdGhlIFtjbGF1c2Vfa2luZF0uICopXG5hbmQgY2xhdXNlID1cbiAgeyBuYW1lIDogc3RyaW5nXG4gIDsgY2xhdXNlX2tpbmQgOiBjbGF1c2Vfa2luZFxuICB9XG5cbigqKiBHcmFtbWFyIG9mIGEgc2luZ2xlIHZhcmlhbnQgY2xhdXNlJ3MgY29udGVudHMuIFtBdG9tX2NsYXVzZV0gYWNjZXB0cyBhbiBhdG9tIG1hdGNoaW5nXG4gICAgdGhlIGNsYXVzZSdzIG5hbWUuIFtMaXN0X2NsYXVzZV0gYWNjZXB0cyBhIGxpc3Qgd2hvc2UgaGVhZCBpcyBhbiBhdG9tIG1hdGNoaW5nIHRoZVxuICAgIGNsYXVzZSdzIG5hbWUgYW5kIHdob3NlIHRhaWwgbWF0Y2hlcyBbYXJnc10uIFRoZSBjbGF1c2UncyBuYW1lIGlzIG1hdGNoZWQgbW9kdWxvIHRoZVxuICAgIHZhcmlhbnQncyBbbmFtZV9raW5kXS4gKilcbmFuZCBjbGF1c2Vfa2luZCA9XG4gIHwgQXRvbV9jbGF1c2VcbiAgfCBMaXN0X2NsYXVzZSBvZiB7IGFyZ3MgOiBsaXN0X2dyYW1tYXIgfVxuXG4oKiogR3JhbW1hciBvZiBhIHJlY29yZC4gQWNjZXB0cyBhbnkgbGlzdCBvZiBzZXhwcyBzcGVjaWZ5aW5nIGVhY2ggb2YgdGhlIGZpZWxkcyxcbiAgICByZWdhcmRsZXNzIG9mIG9yZGVyLiBJZiBbYWxsb3dfZXh0cmFfZmllbGRzXSBpcyBzcGVjaWZpZWQsIGlnbm9yZXMgc2V4cHMgd2l0aCBuYW1lc1xuICAgIG5vdCBmb3VuZCBpbiBbZmllbGRzXS4gKilcbmFuZCByZWNvcmQgPVxuICB7IGFsbG93X2V4dHJhX2ZpZWxkcyA6IGJvb2xcbiAgOyBmaWVsZHMgOiBmaWVsZCB3aXRoX3RhZ19saXN0IGxpc3RcbiAgfVxuXG4oKiogR3JhbW1hciBvZiBhIHJlY29yZCBmaWVsZC4gQSBmaWVsZCBtdXN0IHNob3cgdXAgZXhhY3RseSBvbmNlIGluIGEgcmVjb3JkIGlmXG4gICAgW3JlcXVpcmVkXSwgb3IgYXQgbW9zdCBvbmNlIG90aGVyd2lzZS4gQWNjZXB0cyBhIGxpc3QgaGVhZGVkIGJ5IFtuYW1lXSBhcyBhbiBhdG9tLFxuICAgIGZvbGxvd2VkIGJ5IHNleHBzIG1hdGNoaW5nIFthcmdzXS4gKilcbmFuZCBmaWVsZCA9XG4gIHsgbmFtZSA6IHN0cmluZ1xuICA7IHJlcXVpcmVkIDogYm9vbFxuICA7IGFyZ3MgOiBsaXN0X2dyYW1tYXJcbiAgfVxuXG4oKiogR3JhbW1hciB0YWdnZWQgd2l0aCBjbGllbnQtc3BlY2lmaWMga2V5L3ZhbHVlIHBhaXIuICopXG5hbmQgJ2Egd2l0aF90YWcgPVxuICB7IGtleSA6IHN0cmluZ1xuICA7IHZhbHVlIDogU2V4cC50XG4gIDsgZ3JhbW1hciA6ICdhXG4gIH1cblxuYW5kICdhIHdpdGhfdGFnX2xpc3QgPVxuICB8IFRhZyBvZiAnYSB3aXRoX3RhZ19saXN0IHdpdGhfdGFnXG4gIHwgTm9fdGFnIG9mICdhXG5cbigqKiBHcmFtbWFyIG9mIGEgcmVjdXJzaXZlIHR5cGUgZGVmaW5pdGlvbi4gTmFtZXMgdGhlIFt0eWNvbl0gYmVpbmcgZGVmaW5lZCwgYW5kIHRoZVxuICAgIFt0eXZhcnNdIGl0IHRha2VzIGFzIHBhcmFtZXRlcnMuIFNwZWNpZmllcyB0aGUgW2dyYW1tYXJdIG9mIHRoZSBbdHljb25dLiBUaGUgZ3JhbW1hclxuICAgIG1heSByZWZlciB0byBhbnkgb2YgdGhlIFt0eXZhcnNdLCBhbmQgdG8gYW55IG9mIHRoZSBbdHljb25dcyBmcm9tIHRoZSBzYW1lIHNldCBvZlxuICAgIFtSZWN1cnNpdmVdIGRlZmluaXRpb25zLiAqKVxuYW5kIGRlZm4gPVxuICB7IHR5Y29uIDogc3RyaW5nXG4gIDsgdHl2YXJzIDogc3RyaW5nIGxpc3RcbiAgOyBncmFtbWFyIDogZ3JhbW1hclxuICB9XG5cbigqKiBUb3AtbGV2ZWwgZ3JhbW1hciB0eXBlLiBIYXMgYSBwaGFudG9tIHR5cGUgcGFyYW1ldGVyIHRvIGFzc29jaWF0ZSBlYWNoIGdyYW1tYXIgd2l0aFxuICAgIHRoZSB0eXBlIGl0cyBzZXhwcyByZXByZXNlbnQuIFRoaXMgbWFrZXMgaXQgaGFyZGVyIHRvIGFwcGx5IGdyYW1tYXJzIHRvIHRoZSB3cm9uZ1xuICAgIHR5cGUsIHdoaWxlIGdyYW1tYXJzIGNhbiBzdGlsbCBiZSBlYXNpbHkgY29lcmNlZCB0byBhIG5ldyB0eXBlIGlmIG5lZWRlZC4gKilcbnR5cGUgXyB0ID0geyB1bnR5cGVkIDogZ3JhbW1hciB9IFtAQHVuYm94ZWRdXG5cbmxldCBjb2VyY2UgKHR5cGUgYSBiKSAoeyB1bnR5cGVkID0gXyB9IGFzIHQgOiBhIHQpIDogYiB0ID0gdFxuXG4oKiogVGhpcyByZXNlcnZlZCBrZXkgaXMgdXNlZCBmb3IgYWxsIHRhZ3MgZ2VuZXJhdGVkIGZyb20gZG9jIGNvbW1lbnRzLiAqKVxubGV0IGRvY19jb21tZW50X3RhZyA9IFwic2V4cF9ncmFtbWFyLmRvY19jb21tZW50XCJcbiIsImxldCB1bml0X3NleHBfZ3JhbW1hciA6IHVuaXQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBMaXN0IEVtcHR5IH1cbmxldCBib29sX3NleHBfZ3JhbW1hciA6IGJvb2wgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBCb29sIH1cbmxldCBzdHJpbmdfc2V4cF9ncmFtbWFyIDogc3RyaW5nIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gU3RyaW5nIH1cbmxldCBieXRlc19zZXhwX2dyYW1tYXIgOiBieXRlcyBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IFN0cmluZyB9XG5sZXQgY2hhcl9zZXhwX2dyYW1tYXIgOiBjaGFyIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gQ2hhciB9XG5sZXQgaW50X3NleHBfZ3JhbW1hciA6IGludCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEludGVnZXIgfVxubGV0IGZsb2F0X3NleHBfZ3JhbW1hciA6IGZsb2F0IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gRmxvYXQgfVxubGV0IGludDMyX3NleHBfZ3JhbW1hciA6IGludDMyIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gSW50ZWdlciB9XG5sZXQgaW50NjRfc2V4cF9ncmFtbWFyIDogaW50NjQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBJbnRlZ2VyIH1cbmxldCBuYXRpdmVpbnRfc2V4cF9ncmFtbWFyIDogbmF0aXZlaW50IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gSW50ZWdlciB9XG5sZXQgc2V4cF90X3NleHBfZ3JhbW1hciA6IFNleHAudCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEFueSBcIlNleHAudFwiIH1cbmxldCByZWZfc2V4cF9ncmFtbWFyIGdyYW1tYXIgPSBTZXhwX2dyYW1tYXIuY29lcmNlIGdyYW1tYXJcbmxldCBsYXp5X3Rfc2V4cF9ncmFtbWFyIGdyYW1tYXIgPSBTZXhwX2dyYW1tYXIuY29lcmNlIGdyYW1tYXJcblxubGV0IG9wdGlvbl9zZXhwX2dyYW1tYXIgKHsgdW50eXBlZCB9IDogXyBTZXhwX2dyYW1tYXIudCkgOiBfIG9wdGlvbiBTZXhwX2dyYW1tYXIudCA9XG4gIHsgdW50eXBlZCA9IE9wdGlvbiB1bnR5cGVkIH1cbjs7XG5cbmxldCBsaXN0X3NleHBfZ3JhbW1hciAoeyB1bnR5cGVkIH0gOiBfIFNleHBfZ3JhbW1hci50KSA6IF8gbGlzdCBTZXhwX2dyYW1tYXIudCA9XG4gIHsgdW50eXBlZCA9IExpc3QgKE1hbnkgdW50eXBlZCkgfVxuOztcblxubGV0IGFycmF5X3NleHBfZ3JhbW1hciAoeyB1bnR5cGVkIH0gOiBfIFNleHBfZ3JhbW1hci50KSA6IF8gYXJyYXkgU2V4cF9ncmFtbWFyLnQgPVxuICB7IHVudHlwZWQgPSBMaXN0IChNYW55IHVudHlwZWQpIH1cbjs7XG5cbmxldCBlbXB0eV9zZXhwX2dyYW1tYXIgOiBfIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gVW5pb24gW10gfVxubGV0IG9wYXF1ZV9zZXhwX2dyYW1tYXIgPSBlbXB0eV9zZXhwX2dyYW1tYXJcbmxldCBmdW5fc2V4cF9ncmFtbWFyID0gZW1wdHlfc2V4cF9ncmFtbWFyXG4iLCIoKiBVdGlsaXR5IE1vZHVsZSBmb3IgUy1leHByZXNzaW9uIENvbnZlcnNpb25zICopXG5cbm9wZW4gU3RkTGFiZWxzXG5vcGVuIE1vcmVMYWJlbHNcbm9wZW4gUHJpbnRmXG5vcGVuIFNleHBcblxuKCogQ29udmVyc2lvbiBvZiBPQ2FtbC12YWx1ZXMgdG8gUy1leHByZXNzaW9ucyAqKVxuZXh0ZXJuYWwgZm9ybWF0X2Zsb2F0IDogc3RyaW5nIC0+IGZsb2F0IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfZmxvYXRcIlxuXG4oKiAnJS4xN2cnIGlzIGd1YXJhbnRlZWQgdG8gYmUgcm91bmQtdHJpcHBhYmxlLlxuXG4gICAnJS4xNWcnIHdpbGwgYmUgcm91bmQtdHJpcHBhYmxlIGFuZCBub3QgaGF2ZSBub2lzZSBhdCB0aGUgbGFzdCBkaWdpdCBvciB0d28gZm9yIGEgZmxvYXRcbiAgIHdoaWNoIHdhcyBjb252ZXJ0ZWQgZnJvbSBhIGRlY2ltYWwgKHN0cmluZykgd2l0aCA8PSAxNSBzaWduaWZpY2FudCBkaWdpdHMuICBTbyBpdCdzXG4gICB3b3J0aCB0cnlpbmcgZmlyc3QgdG8gYXZvaWQgdGhpbmdzIGxpa2UgXCIzLjE0MDAwMDAwMDAwMDAwMDFcIi5cblxuICAgU2VlIGNvbW1lbnQgYWJvdmUgW3RvX3N0cmluZ19yb3VuZF90cmlwcGFibGVdIGluIHshQ29yZS5GbG9hdH0gZm9yXG4gICBkZXRhaWxlZCBleHBsYW5hdGlvbiBhbmQgZXhhbXBsZXMuICopXG5sZXQgZGVmYXVsdF9zdHJpbmdfb2ZfZmxvYXQgPVxuICByZWYgKGZ1biB4IC0+XG4gICAgbGV0IHkgPSBmb3JtYXRfZmxvYXQgXCIlLjE1R1wiIHggaW5cbiAgICBpZiBmbG9hdF9vZl9zdHJpbmcgeSA9IHggdGhlbiB5IGVsc2UgZm9ybWF0X2Zsb2F0IFwiJS4xN0dcIiB4KVxuOztcblxubGV0IHJlYWRfb2xkX29wdGlvbl9mb3JtYXQgPSByZWYgdHJ1ZVxubGV0IHdyaXRlX29sZF9vcHRpb25fZm9ybWF0ID0gcmVmIHRydWVcbmxldCBsaXN0X21hcCBmIGwgPSBMaXN0LnJldiAoTGlzdC5yZXZfbWFwIGwgfmYpXG5sZXQgc2V4cF9vZl91bml0ICgpID0gTGlzdCBbXVxubGV0IHNleHBfb2ZfYm9vbCBiID0gQXRvbSAoc3RyaW5nX29mX2Jvb2wgYilcbmxldCBzZXhwX29mX3N0cmluZyBzdHIgPSBBdG9tIHN0clxubGV0IHNleHBfb2ZfYnl0ZXMgYnl0ZXMgPSBBdG9tIChCeXRlcy50b19zdHJpbmcgYnl0ZXMpXG5sZXQgc2V4cF9vZl9jaGFyIGMgPSBBdG9tIChTdHJpbmcubWFrZSAxIGMpXG5sZXQgc2V4cF9vZl9pbnQgbiA9IEF0b20gKHN0cmluZ19vZl9pbnQgbilcbmxldCBzZXhwX29mX2Zsb2F0IG4gPSBBdG9tICghZGVmYXVsdF9zdHJpbmdfb2ZfZmxvYXQgbilcbmxldCBzZXhwX29mX2ludDMyIG4gPSBBdG9tIChJbnQzMi50b19zdHJpbmcgbilcbmxldCBzZXhwX29mX2ludDY0IG4gPSBBdG9tIChJbnQ2NC50b19zdHJpbmcgbilcbmxldCBzZXhwX29mX25hdGl2ZWludCBuID0gQXRvbSAoTmF0aXZlaW50LnRvX3N0cmluZyBuKVxubGV0IHNleHBfb2ZfcmVmIHNleHBfb2ZfX2EgcmYgPSBzZXhwX29mX19hICFyZlxubGV0IHNleHBfb2ZfbGF6eV90IHNleHBfb2ZfX2EgbHYgPSBzZXhwX29mX19hIChMYXp5LmZvcmNlIGx2KVxuXG5sZXQgc2V4cF9vZl9vcHRpb24gc2V4cF9vZl9fYSA9IGZ1bmN0aW9uXG4gIHwgU29tZSB4IHdoZW4gIXdyaXRlX29sZF9vcHRpb25fZm9ybWF0IC0+IExpc3QgWyBzZXhwX29mX19hIHggXVxuICB8IFNvbWUgeCAtPiBMaXN0IFsgQXRvbSBcInNvbWVcIjsgc2V4cF9vZl9fYSB4IF1cbiAgfCBOb25lIHdoZW4gIXdyaXRlX29sZF9vcHRpb25fZm9ybWF0IC0+IExpc3QgW11cbiAgfCBOb25lIC0+IEF0b20gXCJub25lXCJcbjs7XG5cbmxldCBzZXhwX29mX3BhaXIgc2V4cF9vZl9fYSBzZXhwX29mX19iIChhLCBiKSA9IExpc3QgWyBzZXhwX29mX19hIGE7IHNleHBfb2ZfX2IgYiBdXG5cbmxldCBzZXhwX29mX3RyaXBsZSBzZXhwX29mX19hIHNleHBfb2ZfX2Igc2V4cF9vZl9fYyAoYSwgYiwgYykgPVxuICBMaXN0IFsgc2V4cF9vZl9fYSBhOyBzZXhwX29mX19iIGI7IHNleHBfb2ZfX2MgYyBdXG47O1xuXG4oKiBMaXN0LnJldiAoTGlzdC5yZXZfbWFwIC4uLikgaXMgdGFpbCByZWN1cnNpdmUsIHRoZSBPQ2FtbCBzdGFuZGFyZFxuICAgbGlicmFyeSBMaXN0Lm1hcCBpcyBOT1QuICopXG5sZXQgc2V4cF9vZl9saXN0IHNleHBfb2ZfX2EgbHN0ID0gTGlzdCAoTGlzdC5yZXYgKExpc3QucmV2X21hcCBsc3QgfmY6c2V4cF9vZl9fYSkpXG5cbmxldCBzZXhwX29mX2FycmF5IHNleHBfb2ZfX2EgYXIgPVxuICBsZXQgbHN0X3JlZiA9IHJlZiBbXSBpblxuICBmb3IgaSA9IEFycmF5Lmxlbmd0aCBhciAtIDEgZG93bnRvIDAgZG9cbiAgICBsc3RfcmVmIDo9IHNleHBfb2ZfX2EgYXIuKGkpIDo6ICFsc3RfcmVmXG4gIGRvbmU7XG4gIExpc3QgIWxzdF9yZWZcbjs7XG5cbmxldCBzZXhwX29mX2hhc2h0Ymwgc2V4cF9vZl9rZXkgc2V4cF9vZl92YWwgaHRibCA9XG4gIGxldCBjb2xsIH5rZXk6ayB+ZGF0YTp2IGFjYyA9IExpc3QgWyBzZXhwX29mX2tleSBrOyBzZXhwX29mX3ZhbCB2IF0gOjogYWNjIGluXG4gIExpc3QgKEhhc2h0YmwuZm9sZCBodGJsIH5pbml0OltdIH5mOmNvbGwpXG47O1xuXG5sZXQgc2V4cF9vZl9vcGFxdWUgXyA9IEF0b20gXCI8b3BhcXVlPlwiXG5sZXQgc2V4cF9vZl9mdW4gXyA9IEF0b20gXCI8ZnVuPlwiXG5cbigqIEV4Y2VwdGlvbiBjb252ZXJ0ZXIgcmVnaXN0cmF0aW9uIGFuZCBsb29rdXAgKilcblxubW9kdWxlIEV4bl9jb252ZXJ0ZXIgPSBzdHJ1Y3RcbiAgKCogVGhlc2UgZXhjZXB0aW9uIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgYXNzdW1lIHRoYXQgY29udGV4dC1zd2l0Y2hlc1xuICAgICBjYW5ub3QgaGFwcGVuIHVubGVzcyB0aGVyZSBpcyBhbiBhbGxvY2F0aW9uLiAgSXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3RcbiAgICAgdGhhdCB0aGlzIHdpbGwgcmVtYWluIHRydWUgZm9yIHRoZSBmb3Jlc2VlYWJsZSBmdXR1cmUuICBUaGF0IHdheSB3ZVxuICAgICBhdm9pZCB1c2luZyBtdXRleGVzIGFuZCB0aHVzIGEgZGVwZW5kZW5jeSBvbiB0aGUgdGhyZWFkcyBsaWJyYXJ5LiAqKVxuXG4gICgqIEZhc3QgYW5kIGF1dG9tYXRpYyBleGNlcHRpb24gcmVnaXN0cmF0aW9uICopXG5cbiAgbW9kdWxlIFJlZ2lzdHJhdGlvbiA9IHN0cnVjdFxuICAgIHR5cGUgdCA9XG4gICAgICB7IHNleHBfb2ZfZXhuIDogZXhuIC0+IFNleHAudFxuICAgICAgOyAoKiBJZiBbcHJpbnRleGMgPSB0cnVlXSB0aGVuIHRoaXMgc2V4cCBjb252ZXJ0ZXIgaXMgdXNlZCBmb3IgUHJpbnRleGMudG9fc3RyaW5nICopXG4gICAgICAgIHByaW50ZXhjIDogYm9vbFxuICAgICAgfVxuICBlbmRcblxuICBtb2R1bGUgRXhuX3RhYmxlID0gRXBoZW1lcm9uLksxLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSB0ID0gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXG5cbiAgICAgIGxldCBlcXVhbCA9ICggPT0gKVxuICAgICAgbGV0IGhhc2ggPSBPYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLmlkXG4gICAgZW5kKVxuXG4gIGxldCB0aGVfZXhuX3RhYmxlIDogUmVnaXN0cmF0aW9uLnQgRXhuX3RhYmxlLnQgPSBFeG5fdGFibGUuY3JlYXRlIDE3XG5cbiAgKCogRXBoZW1lcm9ucyBhcmUgdXNlZCBzbyB0aGF0IFtzZXhwX29mX2V4bl0gY2xvc3VyZSBkb24ndCBrZWVwIHRoZVxuICAgICBleHRlbnNpb25fY29uc3RydWN0b3IgbGl2ZS4gKilcbiAgbGV0IGFkZCA/KHByaW50ZXhjID0gdHJ1ZSkgP2ZpbmFsaXNlOl8gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHNleHBfb2ZfZXhuID1cbiAgICBFeG5fdGFibGUuYWRkIHRoZV9leG5fdGFibGUgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHsgc2V4cF9vZl9leG47IHByaW50ZXhjIH1cbiAgOztcblxuICBsZXQgZmluZF9hdXRvIH5mb3JfcHJpbnRleGMgZXhuID1cbiAgICBsZXQgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yID0gT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5vZl92YWwgZXhuIGluXG4gICAgbWF0Y2ggRXhuX3RhYmxlLmZpbmRfb3B0IHRoZV9leG5fdGFibGUgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSB7IHNleHBfb2ZfZXhuOyBwcmludGV4YyB9IC0+XG4gICAgICAobWF0Y2ggZm9yX3ByaW50ZXhjLCBwcmludGV4YyB3aXRoXG4gICAgICAgfCBmYWxzZSwgXyB8IF8sIHRydWUgLT4gU29tZSAoc2V4cF9vZl9leG4gZXhuKVxuICAgICAgIHwgdHJ1ZSwgZmFsc2UgLT4gTm9uZSlcbiAgOztcblxuICBtb2R1bGUgRm9yX3VuaXRfdGVzdHNfb25seSA9IHN0cnVjdFxuICAgIGxldCBzaXplICgpID0gKEV4bl90YWJsZS5zdGF0c19hbGl2ZSB0aGVfZXhuX3RhYmxlKS5udW1fYmluZGluZ3NcbiAgZW5kXG5lbmRcblxubGV0IHNleHBfb2ZfZXhuX29wdF9mb3JfcHJpbnRleGMgZXhuID0gRXhuX2NvbnZlcnRlci5maW5kX2F1dG8gfmZvcl9wcmludGV4Yzp0cnVlIGV4blxubGV0IHNleHBfb2ZfZXhuX29wdCBleG4gPSBFeG5fY29udmVydGVyLmZpbmRfYXV0byB+Zm9yX3ByaW50ZXhjOmZhbHNlIGV4blxuXG5sZXQgc2V4cF9vZl9leG4gZXhuID1cbiAgbWF0Y2ggc2V4cF9vZl9leG5fb3B0IGV4biB3aXRoXG4gIHwgTm9uZSAtPiBMaXN0IFsgQXRvbSAoUHJpbnRleGMudG9fc3RyaW5nIGV4bikgXVxuICB8IFNvbWUgc2V4cCAtPiBzZXhwXG47O1xuXG5sZXQgZXhuX3RvX3N0cmluZyBlID0gU2V4cC50b19zdHJpbmdfaHVtIChzZXhwX29mX2V4biBlKVxuXG4oKiB7W2V4Y2VwdGlvbiBCbGFoIFtAQGRlcml2aW5nIHNleHBdXX0gZ2VuZXJhdGVzIGEgY2FsbCB0byB0aGUgZnVuY3Rpb25cbiAgIFtFeG5fY29udmVydGVyLmFkZF0gZGVmaW5lZCBpbiB0aGlzIGZpbGUuICBTbyB3ZSBhcmUgZ3VhcmFudGVkIHRoYXQgYXMgc29vbiBhcyB3ZVxuICAgbWFyayBhbiBleGNlcHRpb24gYXMgc2V4cGFibGUsIHRoaXMgbW9kdWxlIHdpbGwgYmUgbGlua2VkIGluIGFuZCB0aGlzIHByaW50ZXIgd2lsbCBiZVxuICAgcmVnaXN0ZXJlZCwgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LiAqKVxubGV0ICgpID1cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciAoZnVuIGV4biAtPlxuICAgIG1hdGNoIHNleHBfb2ZfZXhuX29wdF9mb3JfcHJpbnRleGMgZXhuIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBzZXhwIC0+IFNvbWUgKFNleHAudG9fc3RyaW5nX2h1bSB+aW5kZW50OjIgc2V4cCkpXG47O1xuXG5sZXQgcHJpbnRleGNfcHJlZmVyX3NleHAgZXhuID1cbiAgbWF0Y2ggc2V4cF9vZl9leG5fb3B0IGV4biB3aXRoXG4gIHwgTm9uZSAtPiBQcmludGV4Yy50b19zdHJpbmcgZXhuXG4gIHwgU29tZSBzZXhwIC0+IFNleHAudG9fc3RyaW5nX2h1bSB+aW5kZW50OjIgc2V4cFxuOztcblxuKCogQ29udmVyc2lvbiBvZiBTLWV4cHJlc3Npb25zIHRvIE9DYW1sLXZhbHVlcyAqKVxuXG5leGNlcHRpb24gT2Zfc2V4cF9lcnJvciA9IFNleHAuT2Zfc2V4cF9lcnJvclxuXG5sZXQgcmVjb3JkX2NoZWNrX2V4dHJhX2ZpZWxkcyA9IHJlZiB0cnVlXG5sZXQgb2Zfc2V4cF9lcnJvcl9leG4gZXhjIHNleHAgPSByYWlzZSAoT2Zfc2V4cF9lcnJvciAoZXhjLCBzZXhwKSlcbmxldCBvZl9zZXhwX2Vycm9yIHdoYXQgc2V4cCA9IHJhaXNlIChPZl9zZXhwX2Vycm9yIChGYWlsdXJlIHdoYXQsIHNleHApKVxuXG5sZXQgdW5pdF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IFtdIC0+ICgpXG4gIHwgQXRvbSBfIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJ1bml0X29mX3NleHA6IGVtcHR5IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGJvb2xfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSAoXCJ0cnVlXCIgfCBcIlRydWVcIikgLT4gdHJ1ZVxuICB8IEF0b20gKFwiZmFsc2VcIiB8IFwiRmFsc2VcIikgLT4gZmFsc2VcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcImJvb2xfb2Zfc2V4cDogdW5rbm93biBzdHJpbmdcIiBzZXhwXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJib29sX29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IHN0cmluZ19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPiBzdHJcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcInN0cmluZ19vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBieXRlc19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPiBCeXRlcy5vZl9zdHJpbmcgc3RyXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJieXRlc19vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBjaGFyX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgaWYgU3RyaW5nLmxlbmd0aCBzdHIgPD4gMVxuICAgIHRoZW4gb2Zfc2V4cF9lcnJvciBcImNoYXJfb2Zfc2V4cDogYXRvbSBzdHJpbmcgbXVzdCBjb250YWluIG9uZSBjaGFyYWN0ZXIgb25seVwiIHNleHA7XG4gICAgc3RyLlswXVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiY2hhcl9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBpbnRfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICAodHJ5IGludF9vZl9zdHJpbmcgc3RyIHdpdGhcbiAgICAgfCBleGMgLT4gb2Zfc2V4cF9lcnJvciAoXCJpbnRfb2Zfc2V4cDogXCIgXiBleG5fdG9fc3RyaW5nIGV4Yykgc2V4cClcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImludF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBmbG9hdF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgICh0cnkgZmxvYXRfb2Zfc3RyaW5nIHN0ciB3aXRoXG4gICAgIHwgZXhjIC0+IG9mX3NleHBfZXJyb3IgKFwiZmxvYXRfb2Zfc2V4cDogXCIgXiBleG5fdG9fc3RyaW5nIGV4Yykgc2V4cClcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImZsb2F0X29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGludDMyX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgKHRyeSBJbnQzMi5vZl9zdHJpbmcgc3RyIHdpdGhcbiAgICAgfCBleGMgLT4gb2Zfc2V4cF9lcnJvciAoXCJpbnQzMl9vZl9zZXhwOiBcIiBeIGV4bl90b19zdHJpbmcgZXhjKSBzZXhwKVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiaW50MzJfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgaW50NjRfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICAodHJ5IEludDY0Lm9mX3N0cmluZyBzdHIgd2l0aFxuICAgICB8IGV4YyAtPiBvZl9zZXhwX2Vycm9yIChcImludDY0X29mX3NleHA6IFwiIF4gZXhuX3RvX3N0cmluZyBleGMpIHNleHApXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJpbnQ2NF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBuYXRpdmVpbnRfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICAodHJ5IE5hdGl2ZWludC5vZl9zdHJpbmcgc3RyIHdpdGhcbiAgICAgfCBleGMgLT4gb2Zfc2V4cF9lcnJvciAoXCJuYXRpdmVpbnRfb2Zfc2V4cDogXCIgXiBleG5fdG9fc3RyaW5nIGV4Yykgc2V4cClcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcIm5hdGl2ZWludF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCByZWZfb2Zfc2V4cCBhX19vZl9zZXhwIHNleHAgPSByZWYgKGFfX29mX3NleHAgc2V4cClcbmxldCBsYXp5X3Rfb2Zfc2V4cCBhX19vZl9zZXhwIHNleHAgPSBMYXp5LmZyb21fdmFsIChhX19vZl9zZXhwIHNleHApXG5cbmxldCBvcHRpb25fb2Zfc2V4cCBhX19vZl9zZXhwIHNleHAgPVxuICBpZiAhcmVhZF9vbGRfb3B0aW9uX2Zvcm1hdFxuICB0aGVuIChcbiAgICBtYXRjaCBzZXhwIHdpdGhcbiAgICB8IExpc3QgW10gfCBBdG9tIChcIm5vbmVcIiB8IFwiTm9uZVwiKSAtPiBOb25lXG4gICAgfCBMaXN0IFsgZWwgXSB8IExpc3QgWyBBdG9tIChcInNvbWVcIiB8IFwiU29tZVwiKTsgZWwgXSAtPiBTb21lIChhX19vZl9zZXhwIGVsKVxuICAgIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJvcHRpb25fb2Zfc2V4cDogbGlzdCBtdXN0IHJlcHJlc2VudCBvcHRpb25hbCB2YWx1ZVwiIHNleHBcbiAgICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwib3B0aW9uX29mX3NleHA6IG9ubHkgbm9uZSBjYW4gYmUgYXRvbVwiIHNleHApXG4gIGVsc2UgKFxuICAgIG1hdGNoIHNleHAgd2l0aFxuICAgIHwgQXRvbSAoXCJub25lXCIgfCBcIk5vbmVcIikgLT4gTm9uZVxuICAgIHwgTGlzdCBbIEF0b20gKFwic29tZVwiIHwgXCJTb21lXCIpOyBlbCBdIC0+IFNvbWUgKGFfX29mX3NleHAgZWwpXG4gICAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcIm9wdGlvbl9vZl9zZXhwOiBvbmx5IG5vbmUgY2FuIGJlIGF0b21cIiBzZXhwXG4gICAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcIm9wdGlvbl9vZl9zZXhwOiBsaXN0IG11c3QgYmUgKHNvbWUgZWwpXCIgc2V4cClcbjs7XG5cbmxldCBwYWlyX29mX3NleHAgYV9fb2Zfc2V4cCBiX19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IFsgYV9zZXhwOyBiX3NleHAgXSAtPlxuICAgIGxldCBhID0gYV9fb2Zfc2V4cCBhX3NleHAgaW5cbiAgICBsZXQgYiA9IGJfX29mX3NleHAgYl9zZXhwIGluXG4gICAgYSwgYlxuICB8IExpc3QgXyAtPlxuICAgIG9mX3NleHBfZXJyb3IgXCJwYWlyX29mX3NleHA6IGxpc3QgbXVzdCBjb250YWluIGV4YWN0bHkgdHdvIGVsZW1lbnRzIG9ubHlcIiBzZXhwXG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJwYWlyX29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IHRyaXBsZV9vZl9zZXhwIGFfX29mX3NleHAgYl9fb2Zfc2V4cCBjX19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IFsgYV9zZXhwOyBiX3NleHA7IGNfc2V4cCBdIC0+XG4gICAgbGV0IGEgPSBhX19vZl9zZXhwIGFfc2V4cCBpblxuICAgIGxldCBiID0gYl9fb2Zfc2V4cCBiX3NleHAgaW5cbiAgICBsZXQgYyA9IGNfX29mX3NleHAgY19zZXhwIGluXG4gICAgYSwgYiwgY1xuICB8IExpc3QgXyAtPlxuICAgIG9mX3NleHBfZXJyb3IgXCJ0cmlwbGVfb2Zfc2V4cDogbGlzdCBtdXN0IGNvbnRhaW4gZXhhY3RseSB0aHJlZSBlbGVtZW50cyBvbmx5XCIgc2V4cFxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwidHJpcGxlX29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGxpc3Rfb2Zfc2V4cCBhX19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IGxzdCAtPlxuICAgIGxldCByZXZfbHN0ID0gTGlzdC5yZXZfbWFwIGxzdCB+ZjphX19vZl9zZXhwIGluXG4gICAgTGlzdC5yZXYgcmV2X2xzdFxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwibGlzdF9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBhcnJheV9vZl9zZXhwIGFfX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IExpc3QgW10gLT4gW3x8XVxuICB8IExpc3QgKGggOjogdCkgLT5cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggdCArIDEgaW5cbiAgICBsZXQgcmVzID0gQXJyYXkubWFrZSBsZW4gKGFfX29mX3NleHAgaCkgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IHJlc1xuICAgICAgfCBoIDo6IHQgLT5cbiAgICAgICAgcmVzLihpKSA8LSBhX19vZl9zZXhwIGg7XG4gICAgICAgIGxvb3AgKGkgKyAxKSB0XG4gICAgaW5cbiAgICBsb29wIDEgdFxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwiYXJyYXlfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgaGFzaHRibF9vZl9zZXhwIGtleV9vZl9zZXhwIHZhbF9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IGxzdCAtPlxuICAgIGxldCBodGJsID0gSGFzaHRibC5jcmVhdGUgMCBpblxuICAgIGxldCBhY3QgPSBmdW5jdGlvblxuICAgICAgfCBMaXN0IFsga19zZXhwOyB2X3NleHAgXSAtPlxuICAgICAgICBIYXNodGJsLmFkZCBodGJsIH5rZXk6KGtleV9vZl9zZXhwIGtfc2V4cCkgfmRhdGE6KHZhbF9vZl9zZXhwIHZfc2V4cClcbiAgICAgIHwgTGlzdCBfIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJoYXNodGJsX29mX3NleHA6IHR1cGxlIGxpc3QgbmVlZGVkXCIgc2V4cFxuICAgIGluXG4gICAgTGlzdC5pdGVyIGxzdCB+ZjphY3Q7XG4gICAgaHRibFxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwiaGFzaHRibF9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBvcGFxdWVfb2Zfc2V4cCBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciBcIm9wYXF1ZV9vZl9zZXhwOiBjYW5ub3QgY29udmVydCBvcGFxdWUgdmFsdWVzXCIgc2V4cFxuOztcblxubGV0IGZ1bl9vZl9zZXhwIHNleHAgPSBvZl9zZXhwX2Vycm9yIFwiZnVuX29mX3NleHA6IGNhbm5vdCBjb252ZXJ0IGZ1bmN0aW9uIHZhbHVlc1wiIHNleHBcblxuKCogU2V4cCBHcmFtbWFycyAqKVxuXG5pbmNsdWRlIFNleHBfY29udl9ncmFtbWFyXG5cbigqIFJlZ2lzdGVyaW5nIGRlZmF1bHQgZXhjZXB0aW9uIHByaW50ZXJzICopXG5cbmxldCBnZXRfZmxjX2Vycm9yIG5hbWUgKGZpbGUsIGxpbmUsIGNocikgPSBBdG9tIChzcHJpbnRmIFwiJXMgJXM6JWQ6JWRcIiBuYW1lIGZpbGUgbGluZSBjaHIpXG5cbmxldCAoKSA9XG4gIExpc3QuaXRlclxuICAgIH5mOihmdW4gKGV4dGVuc2lvbl9jb25zdHJ1Y3RvciwgaGFuZGxlcikgLT5cbiAgICAgIEV4bl9jb252ZXJ0ZXIuYWRkIH5wcmludGV4YzpmYWxzZSB+ZmluYWxpc2U6ZmFsc2UgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIGhhbmRsZXIpXG4gICAgWyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEFzc2VydF9mYWlsdXJlXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEFzc2VydF9mYWlsdXJlIGFyZyAtPiBnZXRfZmxjX2Vycm9yIFwiQXNzZXJ0X2ZhaWx1cmVcIiBhcmdcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEV4aXRdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgRXhpdCAtPiBBdG9tIFwiRXhpdFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBFbmRfb2ZfZmlsZV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBFbmRfb2ZfZmlsZSAtPiBBdG9tIFwiRW5kX29mX2ZpbGVcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgRmFpbHVyZV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBGYWlsdXJlIGFyZyAtPiBMaXN0IFsgQXRvbSBcIkZhaWx1cmVcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgTm90X2ZvdW5kXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IE5vdF9mb3VuZCAtPiBBdG9tIFwiTm90X2ZvdW5kXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEludmFsaWRfYXJndW1lbnRdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgSW52YWxpZF9hcmd1bWVudCBhcmcgLT4gTGlzdCBbIEF0b20gXCJJbnZhbGlkX2FyZ3VtZW50XCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE1hdGNoX2ZhaWx1cmVdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgTWF0Y2hfZmFpbHVyZSBhcmcgLT4gZ2V0X2ZsY19lcnJvciBcIk1hdGNoX2ZhaWx1cmVcIiBhcmdcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE5vdF9mb3VuZF9zXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IE5vdF9mb3VuZF9zIGFyZyAtPiBMaXN0IFsgQXRvbSBcIk5vdF9mb3VuZF9zXCI7IGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTeXNfZXJyb3JdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgU3lzX2Vycm9yIGFyZyAtPiBMaXN0IFsgQXRvbSBcIlN5c19lcnJvclwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBBcmcuSGVscF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBBcmcuSGVscCBhcmcgLT4gTGlzdCBbIEF0b20gXCJBcmcuSGVscFwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBBcmcuQmFkXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEFyZy5CYWQgYXJnIC0+IExpc3QgWyBBdG9tIFwiQXJnLkJhZFwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBMYXp5LlVuZGVmaW5lZF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBMYXp5LlVuZGVmaW5lZCAtPiBBdG9tIFwiTGF6eS5VbmRlZmluZWRcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgUGFyc2luZy5QYXJzZV9lcnJvcl1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBQYXJzaW5nLlBhcnNlX2Vycm9yIC0+IEF0b20gXCJQYXJzaW5nLlBhcnNlX2Vycm9yXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFF1ZXVlLkVtcHR5XVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFF1ZXVlLkVtcHR5IC0+IEF0b20gXCJRdWV1ZS5FbXB0eVwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTY2FuZi5TY2FuX2ZhaWx1cmVdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgU2NhbmYuU2Nhbl9mYWlsdXJlIGFyZyAtPiBMaXN0IFsgQXRvbSBcIlNjYW5mLlNjYW5fZmFpbHVyZVwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTdGFjay5FbXB0eV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBTdGFjay5FbXB0eSAtPiBBdG9tIFwiU3RhY2suRW1wdHlcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgU3lzLkJyZWFrXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFN5cy5CcmVhayAtPiBBdG9tIFwiU3lzLkJyZWFrXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgXVxuOztcblxubGV0ICgpID1cbiAgTGlzdC5pdGVyXG4gICAgfmY6KGZ1biAoZXh0ZW5zaW9uX2NvbnN0cnVjdG9yLCBoYW5kbGVyKSAtPlxuICAgICAgRXhuX2NvbnZlcnRlci5hZGQgfnByaW50ZXhjOnRydWUgfmZpbmFsaXNlOmZhbHNlIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciBoYW5kbGVyKVxuICAgIFsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBPZl9zZXhwX2Vycm9yXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IE9mX3NleHBfZXJyb3IgKGV4Yywgc2V4cCkgLT5cbiAgICAgICAgICBMaXN0IFsgQXRvbSBcIlNleHBsaWIuQ29udi5PZl9zZXhwX2Vycm9yXCI7IHNleHBfb2ZfZXhuIGV4Yzsgc2V4cCBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIF1cbjs7XG5cbmV4dGVybmFsIGlnbm9yZSA6IF8gLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5leHRlcm5hbCAoID0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG4iLCIoKiBDb252X2Vycm9yOiBNb2R1bGUgZm9yIEhhbmRsaW5nIEVycm9ycyBkdXJpbmcgQXV0b21hdGVkIFMtZXhwcmVzc2lvblxuICAgQ29udmVyc2lvbnMgKilcblxub3BlbiBTdGRMYWJlbHNcbm9wZW4gUHJpbnRmXG5vcGVuIFNleHBfY29udlxuXG5leGNlcHRpb24gT2Zfc2V4cF9lcnJvciA9IE9mX3NleHBfZXJyb3JcblxuKCogRXJyb3JzIGNvbmNlcm5pbmcgdHVwbGVzICopXG5cbmxldCB0dXBsZV9vZl9zaXplX25fZXhwZWN0ZWQgbG9jIG4gc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKHNwcmludGYgXCIlc19vZl9zZXhwOiB0dXBsZSBvZiBzaXplICVkIGV4cGVjdGVkXCIgbG9jIG4pIHNleHBcbjs7XG5cbigqIEVycm9ycyBjb25jZXJuaW5nIHN1bSB0eXBlcyAqKVxuXG5sZXQgc3RhZ19ub19hcmdzIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogdGhpcyBjb25zdHJ1Y3RvciBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1wiKSBzZXhwXG47O1xuXG5sZXQgc3RhZ19pbmNvcnJlY3Rfbl9hcmdzIGxvYyB0YWcgc2V4cCA9XG4gIGxldCBtc2cgPSBzcHJpbnRmIFwiJXNfb2Zfc2V4cDogc3VtIHRhZyAlUyBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHNcIiBsb2MgdGFnIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCBzdGFnX3Rha2VzX2FyZ3MgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiB0aGlzIGNvbnN0cnVjdG9yIHJlcXVpcmVzIGFyZ3VtZW50c1wiKSBzZXhwXG47O1xuXG5sZXQgbmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBleHBlY3RlZCBhIHZhcmlhbnQgdHlwZSwgc2F3IGEgbmVzdGVkIGxpc3RcIikgc2V4cFxuOztcblxubGV0IGVtcHR5X2xpc3RfaW52YWxpZF9zdW0gbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBleHBlY3RlZCBhIHZhcmlhbnQgdHlwZSwgc2F3IGFuIGVtcHR5IGxpc3RcIikgc2V4cFxuOztcblxubGV0IHVuZXhwZWN0ZWRfc3RhZyBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHVuZXhwZWN0ZWQgdmFyaWFudCBjb25zdHJ1Y3RvclwiKSBzZXhwXG47O1xuXG4oKiBFcnJvcnMgY29uY2VybmluZyByZWNvcmRzICopXG5cbmxldCByZWNvcmRfc2V4cF9ib29sX3dpdGhfcGF5bG9hZCBsb2Mgc2V4cCA9XG4gIGxldCBtc2cgPVxuICAgIGxvYyBeIFwiX29mX3NleHA6IHJlY29yZCBjb252ZXJzaW9uOiBhIFtzZXhwLmJvb2xdIGZpZWxkIHdhcyBnaXZlbiBhIHBheWxvYWQuXCJcbiAgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHJlY29yZF9vbmx5X3BhaXJzX2V4cGVjdGVkIGxvYyBzZXhwID1cbiAgbGV0IG1zZyA9XG4gICAgbG9jXG4gICAgXiBcIl9vZl9zZXhwOiByZWNvcmQgY29udmVyc2lvbjogb25seSBwYWlycyBleHBlY3RlZCwgdGhlaXIgZmlyc3QgZWxlbWVudCBtdXN0IGJlIGFuIFxcXG4gICAgICAgYXRvbVwiXG4gIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCByZWNvcmRfc3VwZXJmbHVvdXNfZmllbGRzIH53aGF0IH5sb2MgcmV2X2ZsZF9uYW1lcyBzZXhwID1cbiAgbGV0IGZsZF9uYW1lc19zdHIgPSBTdHJpbmcuY29uY2F0IChMaXN0LnJldiByZXZfZmxkX25hbWVzKSB+c2VwOlwiIFwiIGluXG4gIGxldCBtc2cgPSBzcHJpbnRmIFwiJXNfb2Zfc2V4cDogJXM6ICVzXCIgbG9jIHdoYXQgZmxkX25hbWVzX3N0ciBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX2R1cGxpY2F0ZV9maWVsZHMgbG9jIHJldl9mbGRfbmFtZXMgc2V4cCA9XG4gIHJlY29yZF9zdXBlcmZsdW91c19maWVsZHMgfndoYXQ6XCJkdXBsaWNhdGUgZmllbGRzXCIgfmxvYyByZXZfZmxkX25hbWVzIHNleHBcbjs7XG5cbmxldCByZWNvcmRfZXh0cmFfZmllbGRzIGxvYyByZXZfZmxkX25hbWVzIHNleHAgPVxuICByZWNvcmRfc3VwZXJmbHVvdXNfZmllbGRzIH53aGF0OlwiZXh0cmEgZmllbGRzXCIgfmxvYyByZXZfZmxkX25hbWVzIHNleHBcbjs7XG5cbmxldCByZWMgcmVjb3JkX2dldF91bmRlZmluZWRfbG9vcCBmaWVsZHMgPSBmdW5jdGlvblxuICB8IFtdIC0+IFN0cmluZy5jb25jYXQgKExpc3QucmV2IGZpZWxkcykgfnNlcDpcIiBcIlxuICB8ICh0cnVlLCBmaWVsZCkgOjogcmVzdCAtPiByZWNvcmRfZ2V0X3VuZGVmaW5lZF9sb29wIChmaWVsZCA6OiBmaWVsZHMpIHJlc3RcbiAgfCBfIDo6IHJlc3QgLT4gcmVjb3JkX2dldF91bmRlZmluZWRfbG9vcCBmaWVsZHMgcmVzdFxuOztcblxubGV0IHJlY29yZF91bmRlZmluZWRfZWxlbWVudHMgbG9jIHNleHAgbHN0ID1cbiAgbGV0IHVuZGVmaW5lZCA9IHJlY29yZF9nZXRfdW5kZWZpbmVkX2xvb3AgW10gbHN0IGluXG4gIGxldCBtc2cgPVxuICAgIHNwcmludGYgXCIlc19vZl9zZXhwOiB0aGUgZm9sbG93aW5nIHJlY29yZCBlbGVtZW50cyB3ZXJlIHVuZGVmaW5lZDogJXNcIiBsb2MgdW5kZWZpbmVkXG4gIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCByZWNvcmRfbGlzdF9pbnN0ZWFkX2F0b20gbG9jIHNleHAgPVxuICBsZXQgbXNnID0gbG9jIF4gXCJfb2Zfc2V4cDogbGlzdCBpbnN0ZWFkIG9mIGF0b20gZm9yIHJlY29yZCBleHBlY3RlZFwiIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCByZWNvcmRfcG9seV9maWVsZF92YWx1ZSBsb2Mgc2V4cCA9XG4gIGxldCBtc2cgPVxuICAgIGxvY1xuICAgIF4gXCJfb2Zfc2V4cDogY2Fubm90IGNvbnZlcnQgdmFsdWVzIG9mIHR5cGVzIHJlc3VsdGluZyBmcm9tIHBvbHltb3JwaGljIHJlY29yZCBmaWVsZHNcIlxuICBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG4oKiBFcnJvcnMgY29uY2VybmluZyBwb2x5bW9ycGhpYyB2YXJpYW50cyAqKVxuXG5leGNlcHRpb24gTm9fdmFyaWFudF9tYXRjaFxuXG5sZXQgbm9fdmFyaWFudF9tYXRjaCAoKSA9IHJhaXNlIE5vX3ZhcmlhbnRfbWF0Y2hcblxubGV0IG5vX21hdGNoaW5nX3ZhcmlhbnRfZm91bmQgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBubyBtYXRjaGluZyB2YXJpYW50IGZvdW5kXCIpIHNleHBcbjs7XG5cbmxldCBwdGFnX25vX2FyZ3MgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBwb2x5bW9ycGhpYyB2YXJpYW50IGRvZXMgbm90IHRha2UgYXJndW1lbnRzXCIpIHNleHBcbjs7XG5cbmxldCBwdGFnX2luY29ycmVjdF9uX2FyZ3MgbG9jIGNuc3RyIHNleHAgPVxuICBsZXQgbXNnID1cbiAgICBzcHJpbnRmXG4gICAgICBcIiVzX29mX3NleHA6IHBvbHltb3JwaGljIHZhcmlhbnQgdGFnICVTIGhhcyBpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50c1wiXG4gICAgICBsb2NcbiAgICAgIGNuc3RyXG4gIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCBwdGFnX3Rha2VzX2FyZ3MgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBwb2x5bW9ycGhpYyB2YXJpYW50IHRhZyB0YWtlcyBhbiBhcmd1bWVudFwiKSBzZXhwXG47O1xuXG5sZXQgbmVzdGVkX2xpc3RfaW52YWxpZF9wb2x5X3ZhciBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IGEgbmVzdGVkIGxpc3QgaXMgYW4gaW52YWxpZCBwb2x5bW9ycGhpYyB2YXJpYW50XCIpIHNleHBcbjs7XG5cbmxldCBlbXB0eV9saXN0X2ludmFsaWRfcG9seV92YXIgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiB0aGUgZW1wdHkgbGlzdCBpcyBhbiBpbnZhbGlkIHBvbHltb3JwaGljIHZhcmlhbnRcIikgc2V4cFxuOztcblxubGV0IGVtcHR5X3R5cGUgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiB0cnlpbmcgdG8gY29udmVydCBhbiBlbXB0eSB0eXBlXCIpIHNleHBcbjs7XG4iLCIoKiogUHJpbWl0aXZlcyBmb3IgcG9seW1vcnBoaWMgY29tcGFyZS4gKilcblxuKCpfIFBvbHltb3JwaGljIGNvbXBpbGVyIHByaW1pdGl2ZXMgY2FuJ3QgYmUgYWxpYXNlcyBhcyB0aGlzIGRvZXNuJ3QgcGxheSB3ZWxsIHdpdGhcbiAgaW5saW5pbmcuIChJZiBhbGlhc2VkIHdpdGhvdXQgYSB0eXBlIGFubm90YXRpb24sIHRoZSBjb21waWxlciB3b3VsZCBpbXBsZW1lbnQgdGhlbVxuICB1c2luZyB0aGUgZ2VuZXJpYyBjb2RlIGRvaW5nIGEgQyBjYWxsLCBhbmQgaXQncyB0aGlzIGNvZGUgdGhhdCB3b3VsZCBiZSBpbmxpbmVkLikgQXMgYVxuICByZXN1bHQgd2UgaGF2ZSB0byBjb3B5IHRoZSBbZXh0ZXJuYWwgLi4uXSBkZWNsYXJhdGlvbiBoZXJlLiAqKVxuZXh0ZXJuYWwgKCA8ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuZXh0ZXJuYWwgKCA8PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG5leHRlcm5hbCAoIDw+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZXh0ZXJuYWwgKCA+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuZXh0ZXJuYWwgKCA+PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5leHRlcm5hbCBhc2NlbmRpbmcgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbmV4dGVybmFsIGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbmV4dGVybmFsIGVxdWFsIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxubGV0IGRlc2NlbmRpbmcgeCB5ID0gY29tcGFyZSB5IHhcbmxldCBtYXggPSBDYW1sLm1heFxubGV0IG1pbiA9IENhbWwubWluXG4iLCIoKiBUaGlzIG1vZHVsZSBpcyBpbmNsdWRlZCBpbiBbSW1wb3J0XS4gIEl0IGlzIGFpbWVkIGF0IG1vZHVsZXMgdGhhdCBkZWZpbmUgdGhlIHN0YW5kYXJkXG4gICBjb21iaW5hdG9ycyBmb3IgW3NleHBfb2ZdLCBbb2Zfc2V4cF0sIFtjb21wYXJlXSBhbmQgW2hhc2hdIGFuZCBhcmUgaW5jbHVkZWQgaW5cbiAgIFtJbXBvcnRdLiAqKVxuXG5pbmNsdWRlIChcbiAgU2hhZG93X3N0ZGxpYiA6XG4gICAgbW9kdWxlIHR5cGUgb2Ygc3RydWN0XG4gICAgaW5jbHVkZSBTaGFkb3dfc3RkbGliXG4gIGVuZFxuICB3aXRoIHR5cGUgJ2EgcmVmIDo9ICdhIHJlZlxuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIGZvcm1hdCA6PSAoJ2EsICdiLCAnYykgZm9ybWF0XG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDQgOj0gKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0XG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA6PSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NlxuICAoKiBUaGVzZSBtb2R1bGVzIGFyZSByZWRlZmluZWQgaW4gQmFzZSAqKVxuICB3aXRoIG1vZHVsZSBBcnJheSA6PSBTaGFkb3dfc3RkbGliLkFycmF5XG4gIHdpdGggbW9kdWxlIEF0b21pYyA6PSBTaGFkb3dfc3RkbGliLkF0b21pY1xuICB3aXRoIG1vZHVsZSBCb29sIDo9IFNoYWRvd19zdGRsaWIuQm9vbFxuICB3aXRoIG1vZHVsZSBCdWZmZXIgOj0gU2hhZG93X3N0ZGxpYi5CdWZmZXJcbiAgd2l0aCBtb2R1bGUgQnl0ZXMgOj0gU2hhZG93X3N0ZGxpYi5CeXRlc1xuICB3aXRoIG1vZHVsZSBDaGFyIDo9IFNoYWRvd19zdGRsaWIuQ2hhclxuICB3aXRoIG1vZHVsZSBFaXRoZXIgOj0gU2hhZG93X3N0ZGxpYi5FaXRoZXJcbiAgd2l0aCBtb2R1bGUgRmxvYXQgOj0gU2hhZG93X3N0ZGxpYi5GbG9hdFxuICB3aXRoIG1vZHVsZSBIYXNodGJsIDo9IFNoYWRvd19zdGRsaWIuSGFzaHRibFxuICB3aXRoIG1vZHVsZSBJbnQgOj0gU2hhZG93X3N0ZGxpYi5JbnRcbiAgd2l0aCBtb2R1bGUgSW50MzIgOj0gU2hhZG93X3N0ZGxpYi5JbnQzMlxuICB3aXRoIG1vZHVsZSBJbnQ2NCA6PSBTaGFkb3dfc3RkbGliLkludDY0XG4gIHdpdGggbW9kdWxlIExhenkgOj0gU2hhZG93X3N0ZGxpYi5MYXp5XG4gIHdpdGggbW9kdWxlIExpc3QgOj0gU2hhZG93X3N0ZGxpYi5MaXN0XG4gIHdpdGggbW9kdWxlIE1hcCA6PSBTaGFkb3dfc3RkbGliLk1hcFxuICB3aXRoIG1vZHVsZSBOYXRpdmVpbnQgOj0gU2hhZG93X3N0ZGxpYi5OYXRpdmVpbnRcbiAgd2l0aCBtb2R1bGUgT3B0aW9uIDo9IFNoYWRvd19zdGRsaWIuT3B0aW9uXG4gIHdpdGggbW9kdWxlIFByaW50ZiA6PSBTaGFkb3dfc3RkbGliLlByaW50ZlxuICB3aXRoIG1vZHVsZSBRdWV1ZSA6PSBTaGFkb3dfc3RkbGliLlF1ZXVlXG4gIHdpdGggbW9kdWxlIFJhbmRvbSA6PSBTaGFkb3dfc3RkbGliLlJhbmRvbVxuICB3aXRoIG1vZHVsZSBSZXN1bHQgOj0gU2hhZG93X3N0ZGxpYi5SZXN1bHRcbiAgd2l0aCBtb2R1bGUgU2V0IDo9IFNoYWRvd19zdGRsaWIuU2V0XG4gIHdpdGggbW9kdWxlIFN0YWNrIDo9IFNoYWRvd19zdGRsaWIuU3RhY2tcbiAgd2l0aCBtb2R1bGUgU3RyaW5nIDo9IFNoYWRvd19zdGRsaWIuU3RyaW5nXG4gIHdpdGggbW9kdWxlIFN5cyA6PSBTaGFkb3dfc3RkbGliLlN5c1xuICB3aXRoIG1vZHVsZSBVY2hhciA6PSBTaGFkb3dfc3RkbGliLlVjaGFyXG4gIHdpdGggbW9kdWxlIFVuaXQgOj0gU2hhZG93X3N0ZGxpYi5Vbml0KSBbQG9jYW1sLndhcm5pbmcgXCItM1wiXVxuXG50eXBlICdhIHJlZiA9ICdhIENhbWwucmVmID0geyBtdXRhYmxlIGNvbnRlbnRzIDogJ2EgfVxuXG4oKiBSZXNodWZmbGUgW0NhbWxdIHNvIHRoYXQgd2UgY2hvb3NlIHRoZSBtb2R1bGVzIHVzaW5nIGxhYmVscyB3aGVuIGF2YWlsYWJsZS4gKilcbm1vZHVsZSBDYW1sID0gc3RydWN0XG5cbiAgaW5jbHVkZSBDYW1sXG5cbiAgbW9kdWxlIEFyZyA9IENhbWwuQXJnICgqKiBAY2Fub25pY2FsIENhbWwuQXJnICopXG5cbiAgbW9kdWxlIEFycmF5ID0gQ2FtbC5TdGRMYWJlbHMuQXJyYXkgKCoqIEBjYW5vbmljYWwgQ2FtbC5TdGRMYWJlbHMuQXJyYXkgKilcblxuICBtb2R1bGUgQm9vbCA9IENhbWwuQm9vbCAoKiogQGNhbm9uaWNhbCBDYW1sLkJvb2wgKilcblxuICBtb2R1bGUgQnVmZmVyID0gQ2FtbC5CdWZmZXIgKCoqIEBjYW5vbmljYWwgQ2FtbC5CdWZmZXIgKilcblxuICBtb2R1bGUgQnl0ZXMgPSBDYW1sLlN0ZExhYmVscy5CeXRlcyAoKiogQGNhbm9uaWNhbCBDYW1sLlN0ZExhYmVscy5CeXRlcyAqKVxuXG4gIG1vZHVsZSBDaGFyID0gQ2FtbC5DaGFyICgqKiBAY2Fub25pY2FsIENhbWwuQ2hhciAqKVxuXG4gIG1vZHVsZSBFcGhlbWVyb24gPSBDYW1sLkVwaGVtZXJvbiAoKiogQGNhbm9uaWNhbCBDYW1sLkVwaGVtZXJvbiAqKVxuXG4gIG1vZHVsZSBGbG9hdCA9IENhbWwuRmxvYXQgKCoqIEBjYW5vbmljYWwgQ2FtbC5GbG9hdCAqKVxuXG4gIG1vZHVsZSBGb3JtYXQgPSBDYW1sLkZvcm1hdCAoKiogQGNhbm9uaWNhbCBDYW1sLkZvcm1hdCAqKVxuXG4gIG1vZHVsZSBGdW4gPSBDYW1sLkZ1biAoKiogQGNhbm9uaWNhbCBDYW1sLkZ1biAqKVxuXG4gIG1vZHVsZSBHYyA9IENhbWwuR2MgKCoqIEBjYW5vbmljYWwgQ2FtbC5HYyAqKVxuXG4gIG1vZHVsZSBIYXNodGJsID0gQ2FtbC5Nb3JlTGFiZWxzLkhhc2h0YmwgKCoqIEBjYW5vbmljYWwgQ2FtbC5Nb3JlTGFiZWxzLkhhc2h0YmwgKilcblxuICBtb2R1bGUgSW50MzIgPSBDYW1sLkludDMyICgqKiBAY2Fub25pY2FsIENhbWwuSW50MzIgKilcblxuICBtb2R1bGUgSW50ID0gQ2FtbC5JbnQgKCoqIEBjYW5vbmljYWwgQ2FtbC5JbnQgKilcblxuICBtb2R1bGUgSW50NjQgPSBDYW1sLkludDY0ICgqKiBAY2Fub25pY2FsIENhbWwuSW50NjQgKilcblxuICBtb2R1bGUgTGF6eSA9IENhbWwuTGF6eSAoKiogQGNhbm9uaWNhbCBDYW1sLkxhenkgKilcblxuICBtb2R1bGUgTGV4aW5nID0gQ2FtbC5MZXhpbmcgKCoqIEBjYW5vbmljYWwgQ2FtbC5MZXhpbmcgKilcblxuICBtb2R1bGUgTGlzdCA9IENhbWwuU3RkTGFiZWxzLkxpc3QgKCoqIEBjYW5vbmljYWwgQ2FtbC5TdGRMYWJlbHMuTGlzdCAqKVxuXG4gIG1vZHVsZSBNYXAgPSBDYW1sLk1vcmVMYWJlbHMuTWFwICgqKiBAY2Fub25pY2FsIENhbWwuTW9yZUxhYmVscy5NYXAgKilcblxuICBtb2R1bGUgTmF0aXZlaW50ID0gQ2FtbC5OYXRpdmVpbnQgKCoqIEBjYW5vbmljYWwgQ2FtbC5OYXRpdmVpbnQgKilcblxuICBtb2R1bGUgT2JqID0gQ2FtbC5PYmogKCoqIEBjYW5vbmljYWwgQ2FtbC5PYmogKilcblxuICBtb2R1bGUgT3B0aW9uID0gQ2FtbC5PcHRpb24gKCoqIEBjYW5vbmljYWwgQ2FtbC5PcHRpb24gKilcblxuICBtb2R1bGUgUGFyc2luZyA9IENhbWwuUGFyc2luZyAoKiogQGNhbm9uaWNhbCBDYW1sLlBhcnNpbmcgKilcblxuICBtb2R1bGUgUHJpbnRleGMgPSBDYW1sLlByaW50ZXhjICgqKiBAY2Fub25pY2FsIENhbWwuUHJpbnRleGMgKilcblxuICBtb2R1bGUgUHJpbnRmID0gQ2FtbC5QcmludGYgKCoqIEBjYW5vbmljYWwgQ2FtbC5QcmludGYgKilcblxuICBtb2R1bGUgUXVldWUgPSBDYW1sLlF1ZXVlICgqKiBAY2Fub25pY2FsIENhbWwuUXVldWUgKilcblxuICBtb2R1bGUgUmFuZG9tID0gQ2FtbC5SYW5kb20gKCoqIEBjYW5vbmljYWwgQ2FtbC5SYW5kb20gKilcblxuICBtb2R1bGUgUmVzdWx0ID0gQ2FtbC5SZXN1bHQgKCoqIEBjYW5vbmljYWwgQ2FtbC5SZXN1bHQgKilcblxuICBtb2R1bGUgU2NhbmYgPSBDYW1sLlNjYW5mICgqKiBAY2Fub25pY2FsIENhbWwuU2NhbmYgKilcblxuICBtb2R1bGUgU2VxID0gQ2FtbC5TZXEgKCoqIEBjYW5vbmljYWwgQ2FtbC5TZXEgKilcblxuICBtb2R1bGUgU2V0ID0gQ2FtbC5Nb3JlTGFiZWxzLlNldCAoKiogQGNhbm9uaWNhbCBDYW1sLk1vcmVMYWJlbHMuU2V0ICopXG5cbiAgbW9kdWxlIFN0YWNrID0gQ2FtbC5TdGFjayAoKiogQGNhbm9uaWNhbCBDYW1sLlN0YWNrICopXG5cbiAgbW9kdWxlIFN0cmluZyA9IENhbWwuU3RkTGFiZWxzLlN0cmluZyAoKiogQGNhbm9uaWNhbCBDYW1sLlN0ZExhYmVscy5TdHJpbmcgKilcblxuICBtb2R1bGUgU3lzID0gQ2FtbC5TeXMgKCoqIEBjYW5vbmljYWwgQ2FtbC5TeXMgKilcblxuICBtb2R1bGUgVWNoYXIgPSBDYW1sLlVjaGFyICgqKiBAY2Fub25pY2FsIENhbWwuVWNoYXIgKilcblxuICBtb2R1bGUgVW5pdCA9IENhbWwuVW5pdCAoKiogQGNhbm9uaWNhbCBDYW1sLlVuaXQgKilcblxuICBleGNlcHRpb24gTm90X2ZvdW5kID0gQ2FtbC5Ob3RfZm91bmRcbmVuZFxuXG5leHRlcm5hbCAoIHw+ICkgOiAnYSAtPiAoJ2EgLT4gJ2IpIC0+ICdiID0gXCIlcmV2YXBwbHlcIlxuXG4oKiBUaGVzZSBuZWVkIHRvIGJlIGRlY2xhcmVkIGFzIGFuIGV4dGVybmFsIHRvIGdldCB0aGUgbGF6eSBiZWhhdmlvciAqKVxuZXh0ZXJuYWwgKCAmJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcbmV4dGVybmFsICggfHwgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdW9yXCJcbmV4dGVybmFsIG5vdCA6IGJvb2wgLT4gYm9vbCA9IFwiJWJvb2xub3RcIlxuXG4oKiBXZSB1c2UgW09iai5tYWdpY10gaGVyZSBhcyBvdGhlciBpbXBsZW1lbnRhdGlvbnMgZ2VuZXJhdGUgYSBjb25kaXRpb25hbCBqdW1wIGFuZCB0aGVcbiAgIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2UgaXMgbm90aWNlYWJsZS4gKilcbmxldCBib29sX3RvX2ludCAoeCA6IGJvb2wpIDogaW50ID0gQ2FtbC5PYmoubWFnaWMgeFxuXG4oKiBUaGlzIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgZm9yIHRoZSB3YXJuaW5ncyB0byB3b3JrIHByb3Blcmx5ICopXG5leHRlcm5hbCBpZ25vcmUgOiBfIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG5sZXQgKCAhPSApID0gQ2FtbC4oICE9IClcbmxldCAoICogKSA9IENhbWwuKCAqIClcbmxldCAoICoqICkgPSBDYW1sLiggKiogKVxubGV0ICggKi4gKSA9IENhbWwuKCAqLiApXG5sZXQgKCArICkgPSBDYW1sLiggKyApXG5sZXQgKCArLiApID0gQ2FtbC4oICsuIClcbmxldCAoIC0gKSA9IENhbWwuKCAtIClcbmxldCAoIC0uICkgPSBDYW1sLiggLS4gKVxubGV0ICggLyApID0gQ2FtbC4oIC8gKVxubGV0ICggLy4gKSA9IENhbWwuKCAvLiApXG5cbm1vZHVsZSBQb2x5ID0gUG9seTAgKCoqIEBjYW5vbmljYWwgQmFzZS5Qb2x5ICopXG5cbm1vZHVsZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gICgqIERlY2xhcmVkIGFzIGV4dGVybmFscyBzbyB0aGF0IHRoZSBjb21waWxlciBza2lwcyB0aGUgY2FtbF9hcHBseV9YIHdyYXBwaW5nIGV2ZW4gd2hlblxuICAgICBjb21waWxpbmcgd2l0aG91dCBjcm9zcyBsaWJyYXJ5IGlubGluaW5nLiAqKVxuICBleHRlcm5hbCAoID0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbiAgZXh0ZXJuYWwgKCA8PiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuICBleHRlcm5hbCAoIDwgKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbiAgZXh0ZXJuYWwgKCA+ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG4gIGV4dGVybmFsICggPD0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG4gIGV4dGVybmFsICggPj0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG4gIGV4dGVybmFsIGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWNvbXBhcmVcIlxuICBleHRlcm5hbCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBsZXQgYXNjZW5kaW5nICh4IDogaW50KSB5ID0gY29tcGFyZSB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBpbnQpIHkgPSBjb21wYXJlIHkgeFxuICBsZXQgbWF4ICh4IDogaW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IGludCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxuaW5jbHVkZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbm1vZHVsZSBJbnQzMl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oIDwgKSB4IHlcbiAgbGV0ICggPD0gKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA9ICkgeCB5XG4gIGxldCAoID4gKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuZXF1YWwgeCB5XG4gIGxldCBtYXggKHggOiBDYW1sLkludDMyLnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gICgqIERlY2xhcmVkIGFzIGV4dGVybmFscyBzbyB0aGF0IHRoZSBjb21waWxlciBza2lwcyB0aGUgY2FtbF9hcHBseV9YIHdyYXBwaW5nIGV2ZW4gd2hlblxuICAgICBjb21waWxpbmcgd2l0aG91dCBjcm9zcyBsaWJyYXJ5IGlubGluaW5nLiAqKVxuICBleHRlcm5hbCAoID0gKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbiAgZXh0ZXJuYWwgKCA8PiApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuICBleHRlcm5hbCAoIDwgKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbiAgZXh0ZXJuYWwgKCA+ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG4gIGV4dGVybmFsICggPD0gKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWxlc3NlcXVhbFwiXG4gIGV4dGVybmFsICggPj0gKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG4gIGV4dGVybmFsIGNvbXBhcmUgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGludCA9IFwiJWNvbXBhcmVcIlxuICBleHRlcm5hbCBlcXVhbCA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBsZXQgYXNjZW5kaW5nICh4IDogQ2FtbC5JbnQ2NC50KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogQ2FtbC5JbnQ2NC50KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgbWF4ICh4IDogQ2FtbC5JbnQ2NC50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IENhbWwuSW50NjQudCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgQm9vbF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBib29sKSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBib29sKSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBib29sKSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IGJvb2wpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBib29sKSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IGJvb2wpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IGJvb2wpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogYm9vbCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBib29sKSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgQ2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogY2hhcikgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IGNoYXIpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBjaGFyKSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IGNoYXIpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IGNoYXIpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogY2hhcikgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBjaGFyKSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgVWNoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCBpIHggPSBDYW1sLlVjaGFyLnRvX2ludCB4XG4gIGxldCAoIDwgKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgKGkgeCkgKGkgeSlcbiAgbGV0ICggPD0gKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIChpIHgpIChpIHkpXG4gIGxldCAoIDw+ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD4gKSAoaSB4KSAoaSB5KVxuICBsZXQgKCA9ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPSApIChpIHgpIChpIHkpXG4gIGxldCAoID4gKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+ICkgKGkgeCkgKGkgeSlcbiAgbGV0ICggPj0gKSAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIChpIHgpIChpIHkpXG5cbiAgbGV0IGFzY2VuZGluZyAoeCA6IENhbWwuVWNoYXIudCkgeSA9XG4gICAgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5hc2NlbmRpbmcgKGkgeCkgKGkgeSlcbiAgOztcblxuICBsZXQgZGVzY2VuZGluZyAoeCA6IENhbWwuVWNoYXIudCkgeSA9XG4gICAgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5kZXNjZW5kaW5nIChpIHgpIChpIHkpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmUgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmNvbXBhcmUgKGkgeCkgKGkgeSlcbiAgbGV0IGVxdWFsICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5lcXVhbCAoaSB4KSAoaSB5KVxuICBsZXQgbWF4ICh4IDogQ2FtbC5VY2hhci50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IENhbWwuVWNoYXIudCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBmbG9hdCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogZmxvYXQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBmbG9hdCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBmbG9hdCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogZmxvYXQpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogZmxvYXQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogZmxvYXQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBTdHJpbmdfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBzdHJpbmcpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBzdHJpbmcpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogc3RyaW5nKSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBzdHJpbmcpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogc3RyaW5nKSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IHN0cmluZykgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIEJ5dGVzX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBieXRlcykgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogYnl0ZXMpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBieXRlcykgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBieXRlcykgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogYnl0ZXMpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogYnl0ZXMpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogYnl0ZXMpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbigqIFRoaXMgbmVlZHMgdG8gYmUgZGVmaW5lZCBhcyBhbiBleHRlcm5hbCBzbyB0aGF0IHRoZSBjb21waWxlciBjYW4gc3BlY2lhbGl6ZSBpdCBhcyBhXG4gICBkaXJlY3Qgc2V0IG9yIGNhbWxfbW9kaWZ5ICopXG5leHRlcm5hbCAoIDo9ICkgOiAnYSByZWYgLT4gJ2EgLT4gdW5pdCA9IFwiJXNldGZpZWxkMFwiXG5cbigqIFRoZXNlIG5lZWQgdG8gYmUgZGVmaW5lZCBhcyBhbiBleHRlcm5hbCBvdGhlcndpc2UgdGhlIGNvbXBpbGVyIHdvbid0IHVuYm94XG4gICByZWZlcmVuY2VzICopXG5leHRlcm5hbCAoICEgKSA6ICdhIHJlZiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCByZWYgOiAnYSAtPiAnYSByZWYgPSBcIiVtYWtlbXV0YWJsZVwiXG5cbmxldCAoIEAgKSA9IENhbWwuKCBAIClcbmxldCAoIF4gKSA9IENhbWwuKCBeIClcbmxldCAoIH4tICkgPSBDYW1sLiggfi0gKVxubGV0ICggfi0uICkgPSBDYW1sLiggfi0uIClcbmxldCAoIGFzciApID0gQ2FtbC4oIGFzciApXG5sZXQgKCBsYW5kICkgPSBDYW1sLiggbGFuZCApXG5sZXQgbG5vdCA9IENhbWwubG5vdFxubGV0ICggbG9yICkgPSBDYW1sLiggbG9yIClcbmxldCAoIGxzbCApID0gQ2FtbC4oIGxzbCApXG5sZXQgKCBsc3IgKSA9IENhbWwuKCBsc3IgKVxubGV0ICggbHhvciApID0gQ2FtbC4oIGx4b3IgKVxubGV0ICggbW9kICkgPSBDYW1sLiggbW9kIClcbmxldCBhYnMgPSBDYW1sLmFic1xubGV0IGZhaWx3aXRoID0gQ2FtbC5mYWlsd2l0aFxubGV0IGZzdCA9IENhbWwuZnN0XG5sZXQgaW52YWxpZF9hcmcgPSBDYW1sLmludmFsaWRfYXJnXG5sZXQgc25kID0gQ2FtbC5zbmRcblxuKCogW3JhaXNlXSBuZWVkcyB0byBiZSBkZWZpbmVkIGFzIGFuIGV4dGVybmFsIGFzIHRoZSBjb21waWxlciBhdXRvbWF0aWNhbGx5IHJlcGxhY2VzXG4gICAnJXJhaXNlJyBieSAnJXJlcmFpc2UnIHdoZW4gYXBwcm9wcmlhdGUuICopXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiBfID0gXCIlcmFpc2VcIlxuXG5sZXQgcGh5c19lcXVhbCA9IENhbWwuKCA9PSApXG5sZXQgZGVjciA9IENhbWwuZGVjclxubGV0IGluY3IgPSBDYW1sLmluY3JcblxuKCogdXNlZCBieSBzZXhwX2NvbnYsIHdoaWNoIGZsb2F0MCBkZXBlbmRzIG9uIHRocm91Z2ggb3B0aW9uICopXG5sZXQgZmxvYXRfb2Zfc3RyaW5nID0gQ2FtbC5mbG9hdF9vZl9zdHJpbmdcblxuKCogW2FtX3Rlc3RpbmddIGlzIHVzZWQgaW4gYSBmZXcgcGxhY2VzIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSB3aGVuIGluIHRlc3RpbmcgbW9kZSwgc3VjaFxuICAgYXMgaW4gW3JhbmRvbS5tbF0uICBbYW1fdGVzdGluZ10gaXMgaW1wbGVtZW50ZWQgdXNpbmcgW0Jhc2VfYW1fdGVzdGluZ10sIGEgd2VhayBDL2pzXG4gICBwcmltaXRpdmUgdGhhdCByZXR1cm5zIFtmYWxzZV0sIGJ1dCB3aGVuIGxpbmtpbmcgYW4gaW5saW5lLXRlc3QtcnVubmVyIGV4ZWN1dGFibGUsIGlzXG4gICBvdmVycmlkZGVuIGJ5IGFub3RoZXIgcHJpbWl0aXZlIHRoYXQgcmV0dXJucyBbdHJ1ZV0uICopXG5leHRlcm5hbCBhbV90ZXN0aW5nIDogdW5pdCAtPiBib29sID0gXCJCYXNlX2FtX3Rlc3RpbmdcIlxuXG5sZXQgYW1fdGVzdGluZyA9IGFtX3Rlc3RpbmcgKClcbiIsIm9wZW4hIEltcG9ydDBcbmluY2x1ZGUgQ2FtbC5QcmludGZcblxuKCoqIGZhaWx3aXRoLCBpbnZhbGlkX2FyZywgYW5kIGV4aXQgYWNjZXB0aW5nIHByaW50ZidzIGZvcm1hdC4gKilcblxubGV0IGZhaWx3aXRoZiBmbXQgPSBrc3ByaW50ZiAoZnVuIHMgKCkgLT4gZmFpbHdpdGggcykgZm10XG5sZXQgaW52YWxpZF9hcmdmIGZtdCA9IGtzcHJpbnRmIChmdW4gcyAoKSAtPiBpbnZhbGlkX2FyZyBzKSBmbXRcbiIsIigqIFtTeXMwXSBkZWZpbmVzIGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHkgZGVmaW5lZCBpblxuICAgdGVybXMgb2YgW0NhbWwuU3lzXS4gIFtTeXMwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlIHBhcnQgb2ZcbiAgIFtDYW1sLlN5c10gdGhhdCBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXIgdGhhbiBzeXMubWxcbiAgIHNob3VsZCB1c2UgW0NhbWwuU3lzXS4gW1N5czBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlXG4gICBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuICBBbGwgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIHRoZXNlXG4gICBmdW5jdGlvbnMgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLlN5c10gaW4gYnVpbGQgb3JkZXIgc2hvdWxkIGRvXG4gICBbbW9kdWxlIFN5cyA9IFN5czBdLiAgRGVmaW5pbmcgW21vZHVsZSBTeXMgPSBTeXMwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlXG4gICBpdCBwcmV2ZW50cyBvY2FtbGRlcCBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLlN5c10uICopXG5cbm9wZW4hIEltcG9ydDBcblxudHlwZSBiYWNrZW5kX3R5cGUgPSBDYW1sLlN5cy5iYWNrZW5kX3R5cGUgPVxuICB8IE5hdGl2ZVxuICB8IEJ5dGVjb2RlXG4gIHwgT3RoZXIgb2Ygc3RyaW5nXG5cbmxldCBiYWNrZW5kX3R5cGUgPSBDYW1sLlN5cy5iYWNrZW5kX3R5cGVcbmxldCBpbnRlcmFjdGl2ZSA9IENhbWwuU3lzLmludGVyYWN0aXZlXG5sZXQgb3NfdHlwZSA9IENhbWwuU3lzLm9zX3R5cGVcbmxldCB1bml4ID0gQ2FtbC5TeXMudW5peFxubGV0IHdpbjMyID0gQ2FtbC5TeXMud2luMzJcbmxldCBjeWd3aW4gPSBDYW1sLlN5cy5jeWd3aW5cbmxldCB3b3JkX3NpemVfaW5fYml0cyA9IENhbWwuU3lzLndvcmRfc2l6ZVxubGV0IGludF9zaXplX2luX2JpdHMgPSBDYW1sLlN5cy5pbnRfc2l6ZVxubGV0IGJpZ19lbmRpYW4gPSBDYW1sLlN5cy5iaWdfZW5kaWFuXG5sZXQgbWF4X3N0cmluZ19sZW5ndGggPSBDYW1sLlN5cy5tYXhfc3RyaW5nX2xlbmd0aFxubGV0IG1heF9hcnJheV9sZW5ndGggPSBDYW1sLlN5cy5tYXhfYXJyYXlfbGVuZ3RoXG5sZXQgcnVudGltZV92YXJpYW50ID0gQ2FtbC5TeXMucnVudGltZV92YXJpYW50XG5sZXQgcnVudGltZV9wYXJhbWV0ZXJzID0gQ2FtbC5TeXMucnVudGltZV9wYXJhbWV0ZXJzXG5sZXQgYXJndiA9IENhbWwuU3lzLmFyZ3ZcbmxldCBnZXRfYXJndiAoKSA9IENhbWwuU3lzLmFyZ3ZcbmxldCBvY2FtbF92ZXJzaW9uID0gQ2FtbC5TeXMub2NhbWxfdmVyc2lvblxubGV0IGVuYWJsZV9ydW50aW1lX3dhcm5pbmdzID0gQ2FtbC5TeXMuZW5hYmxlX3J1bnRpbWVfd2FybmluZ3NcbmxldCBydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQgPSBDYW1sLlN5cy5ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcblxubGV0IGdldGVudl9leG4gdmFyID1cbiAgdHJ5IENhbWwuU3lzLmdldGVudiB2YXIgd2l0aFxuICB8IENhbWwuTm90X2ZvdW5kIC0+XG4gICAgUHJpbnRmLmZhaWx3aXRoZiBcIlN5cy5nZXRlbnZfZXhuOiBlbnZpcm9ubWVudCB2YXJpYWJsZSAlcyBpcyBub3Qgc2V0XCIgdmFyICgpXG47O1xuXG5sZXQgZ2V0ZW52IHZhciA9XG4gIG1hdGNoIENhbWwuU3lzLmdldGVudiB2YXIgd2l0aFxuICB8IHggLT4gU29tZSB4XG4gIHwgZXhjZXB0aW9uIENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmV4dGVybmFsIG9wYXF1ZV9pZGVudGl0eSA6ICdhIC0+ICdhID0gXCIlb3BhcXVlXCJcblxuZXhjZXB0aW9uIEJyZWFrID0gQ2FtbC5TeXMuQnJlYWtcbiIsIigqIFtBcnJheTBdIGRlZmluZXMgYXJyYXkgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseSBkZWZpbmVkIGluIHRlcm1zXG4gICBvZiBbQ2FtbC5BcnJheV0uICBbQXJyYXkwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlIHBhcnQgb2YgW0NhbWwuQXJyYXldXG4gICB0aGF0IFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlciB0aGFuIGFycmF5MC5tbCBzaG91bGQgdXNlIFtDYW1sLkFycmF5XS5cbiAgIFtBcnJheTBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci4gIEFsbFxuICAgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIGFycmF5cyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuQXJyYXldIGluIGJ1aWxkIG9yZGVyIHNob3VsZFxuICAgZG8gW21vZHVsZSBBcnJheSA9IEFycmF5MF0uICBUaGlzIGluY2x1ZGVzIHVzZXMgb2Ygc3Vic2NyaXB0IHN5bnRheCAoW3guKGkpXSwgW3guKGkpIDwtXG4gICBlXSksIHdoaWNoIHRoZSBPQ2FtbCBwYXJzZXIgZGVzdWdhcnMgaW50byBjYWxscyB0byBbQXJyYXkuZ2V0XSBhbmQgW0FycmF5LnNldF0uXG4gICBEZWZpbmluZyBbbW9kdWxlIEFycmF5ID0gQXJyYXkwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0IHByZXZlbnRzIG9jYW1sZGVwIGZyb21cbiAgIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLkFycmF5XS4gKilcblxub3BlbiEgSW1wb3J0MFxubW9kdWxlIFN5cyA9IFN5czBcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcblxubW9kdWxlIEFycmF5ID0gc3RydWN0XG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuICBleHRlcm5hbCBjcmVhdGVfZmxvYXRfdW5pbml0aWFsaXplZCA6IGludCAtPiBmbG9hdCBhcnJheSA9IFwiY2FtbF9tYWtlX2Zsb2F0X3ZlY3RcIlxuICBleHRlcm5hbCBnZXQgOiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgPSBcIiVhcnJheV9zYWZlX2dldFwiXG4gIGV4dGVybmFsIGxlbmd0aCA6ICdhIGFycmF5IC0+IGludCA9IFwiJWFycmF5X2xlbmd0aFwiXG4gIGV4dGVybmFsIHNldCA6ICdhIGFycmF5IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlYXJyYXlfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3Vuc2FmZV9zZXRcIlxuXG4gIGV4dGVybmFsIHVuc2FmZV9ibGl0XG4gICAgOiAgc3JjOidhIGFycmF5XG4gICAgLT4gc3JjX3BvczppbnRcbiAgICAtPiBkc3Q6J2EgYXJyYXlcbiAgICAtPiBkc3RfcG9zOmludFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiB1bml0XG4gICAgPSBcImNhbWxfYXJyYXlfYmxpdFwiXG5lbmRcblxuaW5jbHVkZSBBcnJheVxuXG5sZXQgbWF4X2xlbmd0aCA9IFN5cy5tYXhfYXJyYXlfbGVuZ3RoXG5cbmxldCBjcmVhdGUgfmxlbiB4ID1cbiAgdHJ5IGNyZWF0ZSBsZW4geCB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBfIC0+IGludmFsaWRfYXJnZiBcIkFycmF5LmNyZWF0ZSB+bGVuOiVkOiBpbnZhbGlkIGxlbmd0aFwiIGxlbiAoKVxuOztcblxubGV0IGNyZWF0ZV9mbG9hdF91bmluaXRpYWxpemVkIH5sZW4gPVxuICB0cnkgY3JlYXRlX2Zsb2F0X3VuaW5pdGlhbGl6ZWQgbGVuIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IF8gLT5cbiAgICBpbnZhbGlkX2FyZ2YgXCJBcnJheS5jcmVhdGVfZmxvYXRfdW5pbml0aWFsaXplZCB+bGVuOiVkOiBpbnZhbGlkIGxlbmd0aFwiIGxlbiAoKVxuOztcblxubGV0IGFwcGVuZCA9IENhbWwuQXJyYXkuYXBwZW5kXG5sZXQgYmxpdCA9IENhbWwuQXJyYXkuYmxpdFxubGV0IGNvbmNhdCA9IENhbWwuQXJyYXkuY29uY2F0XG5sZXQgY29weSA9IENhbWwuQXJyYXkuY29weVxubGV0IGZpbGwgPSBDYW1sLkFycmF5LmZpbGxcbmxldCBpbml0ID0gQ2FtbC5BcnJheS5pbml0XG5sZXQgbWFrZV9tYXRyaXggPSBDYW1sLkFycmF5Lm1ha2VfbWF0cml4XG5sZXQgb2ZfbGlzdCA9IENhbWwuQXJyYXkub2ZfbGlzdFxubGV0IHN1YiA9IENhbWwuQXJyYXkuc3ViXG5sZXQgdG9fbGlzdCA9IENhbWwuQXJyYXkudG9fbGlzdFxuXG4oKiBUaGVzZSBhcmUgZXRhIGV4cGFuZGVkIGluIG9yZGVyIHRvIHBlcm11dGUgcGFyYW1ldGVyIG9yZGVyIHRvIGZvbGxvdyBCYXNlXG4gICBjb252ZW50aW9ucy4gKilcbmxldCBmb2xkIHQgfmluaXQgfmYgPSBDYW1sLkFycmF5LmZvbGRfbGVmdCB0IH5pbml0IH5mXG5sZXQgZm9sZF9yaWdodCB0IH5mIH5pbml0ID0gQ2FtbC5BcnJheS5mb2xkX3JpZ2h0IHQgfmYgfmluaXRcbmxldCBpdGVyIHQgfmYgPSBDYW1sLkFycmF5Lml0ZXIgdCB+ZlxubGV0IGl0ZXJpIHQgfmYgPSBDYW1sLkFycmF5Lml0ZXJpIHQgfmZcbmxldCBtYXAgdCB+ZiA9IENhbWwuQXJyYXkubWFwIHQgfmZcbmxldCBtYXBpIHQgfmYgPSBDYW1sLkFycmF5Lm1hcGkgdCB+ZlxubGV0IHN0YWJsZV9zb3J0IHQgfmNvbXBhcmUgPSBDYW1sLkFycmF5LnN0YWJsZV9zb3J0IHQgfmNtcDpjb21wYXJlXG5cbmxldCBzd2FwIHQgaSBqID1cbiAgbGV0IGVsdF9pID0gdC4oaSkgaW5cbiAgbGV0IGVsdF9qID0gdC4oaikgaW5cbiAgdW5zYWZlX3NldCB0IGkgZWx0X2o7XG4gIHVuc2FmZV9zZXQgdCBqIGVsdF9pXG47O1xuIiwiKCogW0NoYXIwXSBkZWZpbmVzIGNoYXIgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseSBkZWZpbmVkIGluIHRlcm1zIG9mXG4gICBbQ2FtbC5DaGFyXS4gIFtDaGFyMF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZSBwYXJ0IG9mIFtDYW1sLkNoYXJdIHRoYXRcbiAgIFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlciB0aGFuIGNoYXIwLm1sIHNob3VsZCB1c2UgW0NhbWwuQ2hhcl0uXG4gICBbQ2hhcjBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci4gIEFsbFxuICAgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIGNoYXJzIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5DaGFyXSBpbiBidWlsZCBvcmRlciBzaG91bGQgZG9cbiAgIFttb2R1bGUgQ2hhciA9IENoYXIwXS4gIERlZmluaW5nIFttb2R1bGUgQ2hhciA9IENoYXIwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0XG4gICBwcmV2ZW50cyBvY2FtbGRlcCBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLkNoYXJdLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5cbmxldCBmYWlsd2l0aGYgPSBQcmludGYuZmFpbHdpdGhmXG5sZXQgZXNjYXBlZCA9IENhbWwuQ2hhci5lc2NhcGVkXG5sZXQgbG93ZXJjYXNlID0gQ2FtbC5DaGFyLmxvd2VyY2FzZV9hc2NpaVxubGV0IHRvX2ludCA9IENhbWwuQ2hhci5jb2RlXG5sZXQgdW5zYWZlX29mX2ludCA9IENhbWwuQ2hhci51bnNhZmVfY2hyXG5sZXQgdXBwZXJjYXNlID0gQ2FtbC5DaGFyLnVwcGVyY2FzZV9hc2NpaVxuXG4oKiBXZSB1c2Ugb3VyIG93biByYW5nZSB0ZXN0IHdoZW4gY29udmVydGluZyBpbnRlZ2VycyB0byBjaGFycyByYXRoZXIgdGhhblxuICAgY2FsbGluZyBbQ2FtbC5DaGFyLmNocl0gYmVjYXVzZSBpdCdzIHNpbXBsZSBhbmQgaXQgc2F2ZXMgdXMgYSBmdW5jdGlvbiBjYWxsXG4gICBhbmQgdGhlIHRyeS13aXRoIChleGNlcHRpb25zIGNvc3QsIGVzcGVjaWFsbHkgaW4gdGhlIHdvcmxkIHdpdGggYmFja3RyYWNlcykuICopXG5sZXQgaW50X2lzX29rIGkgPSAwIDw9IGkgJiYgaSA8PSAyNTVcbmxldCBtaW5fdmFsdWUgPSB1bnNhZmVfb2ZfaW50IDBcbmxldCBtYXhfdmFsdWUgPSB1bnNhZmVfb2ZfaW50IDI1NVxubGV0IG9mX2ludCBpID0gaWYgaW50X2lzX29rIGkgdGhlbiBTb21lICh1bnNhZmVfb2ZfaW50IGkpIGVsc2UgTm9uZVxuXG5sZXQgb2ZfaW50X2V4biBpID1cbiAgaWYgaW50X2lzX29rIGlcbiAgdGhlbiB1bnNhZmVfb2ZfaW50IGlcbiAgZWxzZSBmYWlsd2l0aGYgXCJDaGFyLm9mX2ludF9leG4gZ290IGludGVnZXIgb3V0IG9mIHJhbmdlOiAlZFwiIGkgKClcbjs7XG5cbmxldCBlcXVhbCAodDEgOiBjaGFyKSB0MiA9IFBvbHkuZXF1YWwgdDEgdDJcbiIsIigqIFtJbnQwXSBkZWZpbmVzIGludGVnZXIgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseVxuICAgZGVmaW5lZCBpbiB0ZXJtcyBvZiBbQ2FtbF0uIFtJbnQwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlXG4gICBwYXJ0IG9mIFtDYW1sXSB0aGF0IFtCYXNlXSB1c2VzIGZvciBpbnRlZ2VycyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXJcbiAgIHRoYW4gaW50MC5tbCBzaG91bGQgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSB0aHJvdWdoIFtDYW1sXS4gW0ludDBdIGhhc1xuICAgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuXG5cbiAgIEFsbCBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2UgaW50cyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuSW50XSBpbiBidWlsZFxuICAgb3JkZXIgc2hvdWxkIGRvOlxuXG4gICB7W1xuICAgICBtb2R1bGUgSW50ICA9IEludDBcbiAgIF19XG5cbiAgIERlZmluaW5nIFttb2R1bGUgSW50ID0gSW50MF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdCBwcmV2ZW50cyBvY2FtbGRlcFxuICAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5JbnRdLiAqKVxuXG5sZXQgdG9fc3RyaW5nID0gQ2FtbC5zdHJpbmdfb2ZfaW50XG5sZXQgb2Zfc3RyaW5nID0gQ2FtbC5pbnRfb2Zfc3RyaW5nXG5sZXQgdG9fZmxvYXQgPSBDYW1sLmZsb2F0X29mX2ludFxubGV0IG9mX2Zsb2F0ID0gQ2FtbC5pbnRfb2ZfZmxvYXRcbmxldCBtYXhfdmFsdWUgPSBDYW1sLm1heF9pbnRcbmxldCBtaW5fdmFsdWUgPSBDYW1sLm1pbl9pbnRcbmxldCBzdWNjID0gQ2FtbC5zdWNjXG4iLCIoKiBbTGlzdDBdIGRlZmluZXMgbGlzdCBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5IGRlZmluZWQgaW4gdGVybXMgb2ZcbiAgIFtDYW1sLkxpc3RdLiAgW0xpc3QwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlIHBhcnQgb2YgW0NhbWwuTGlzdF0gdGhhdFxuICAgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyIHRoYW4gbGlzdDAubWwgc2hvdWxkIHVzZSBbQ2FtbC5MaXN0XS5cbiAgIFtMaXN0MF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLiAgQWxsXG4gICBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2UgbGlzdHMgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLkxpc3RdIGluIGJ1aWxkIG9yZGVyIHNob3VsZCBkb1xuICAgW21vZHVsZSBMaXN0ID0gTGlzdDBdLiAgRGVmaW5pbmcgW21vZHVsZSBMaXN0ID0gTGlzdDBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXRcbiAgIHByZXZlbnRzIG9jYW1sZGVwIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuTGlzdF0uICopXG5cbm9wZW4hIEltcG9ydDBcblxubGV0IGhkX2V4biA9IENhbWwuTGlzdC5oZFxubGV0IGxlbmd0aCA9IENhbWwuTGlzdC5sZW5ndGhcbmxldCByZXZfYXBwZW5kID0gQ2FtbC5MaXN0LnJldl9hcHBlbmRcbmxldCB0bF9leG4gPSBDYW1sLkxpc3QudGxcbmxldCB1bnppcCA9IENhbWwuTGlzdC5zcGxpdFxuXG4oKiBUaGVzZSBhcmUgZXRhIGV4cGFuZGVkIGluIG9yZGVyIHRvIHBlcm11dGUgcGFyYW1ldGVyIG9yZGVyIHRvIGZvbGxvdyBCYXNlXG4gICBjb252ZW50aW9ucy4gKilcbmxldCBleGlzdHMgdCB+ZiA9IENhbWwuTGlzdC5leGlzdHMgdCB+ZlxubGV0IGV4aXN0czJfb2sgbDEgbDIgfmYgPSBDYW1sLkxpc3QuZXhpc3RzMiBsMSBsMiB+ZlxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9IENhbWwuTGlzdC5mb2xkX2xlZnQgdCB+ZiB+aW5pdFxubGV0IGZvbGQyX29rIGwxIGwyIH5pbml0IH5mID0gQ2FtbC5MaXN0LmZvbGRfbGVmdDIgbDEgbDIgfmluaXQgfmZcbmxldCBmb3JfYWxsIHQgfmYgPSBDYW1sLkxpc3QuZm9yX2FsbCB0IH5mXG5sZXQgZm9yX2FsbDJfb2sgbDEgbDIgfmYgPSBDYW1sLkxpc3QuZm9yX2FsbDIgbDEgbDIgfmZcbmxldCBpdGVyIHQgfmYgPSBDYW1sLkxpc3QuaXRlciB0IH5mXG5sZXQgaXRlcjJfb2sgbDEgbDIgfmYgPSBDYW1sLkxpc3QuaXRlcjIgbDEgbDIgfmZcbmxldCBub250YWlsX21hcCB0IH5mID0gQ2FtbC5MaXN0Lm1hcCB0IH5mXG5sZXQgbm9udGFpbF9tYXBpIHQgfmYgPSBDYW1sLkxpc3QubWFwaSB0IH5mXG5sZXQgcGFydGl0aW9uIHQgfmYgPSBDYW1sLkxpc3QucGFydGl0aW9uIHQgfmZcbmxldCByZXZfbWFwIHQgfmYgPSBDYW1sLkxpc3QucmV2X21hcCB0IH5mXG5sZXQgcmV2X21hcDJfb2sgbDEgbDIgfmYgPSBDYW1sLkxpc3QucmV2X21hcDIgbDEgbDIgfmZcbmxldCBzb3J0IGwgfmNvbXBhcmUgPSBDYW1sLkxpc3Quc29ydCBsIH5jbXA6Y29tcGFyZVxubGV0IHN0YWJsZV9zb3J0IGwgfmNvbXBhcmUgPSBDYW1sLkxpc3Quc3RhYmxlX3NvcnQgbCB+Y21wOmNvbXBhcmVcblxubGV0IHJldiA9IGZ1bmN0aW9uXG4gIHwgKFtdIHwgWyBfIF0pIGFzIHJlcyAtPiByZXNcbiAgfCB4IDo6IHkgOjogcmVzdCAtPiByZXZfYXBwZW5kIHJlc3QgWyB5OyB4IF1cbjs7XG5cbmxldCBmb2xkX3JpZ2h0IGwgfmYgfmluaXQgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBpbml0ICgqIGF2b2lkIHRoZSBhbGxvY2F0aW9uIG9mIFt+Zl0gYmVsb3cgKilcbiAgfCBfIC0+IGZvbGQgfmY6KGZ1biBhIGIgLT4gZiBiIGEpIH5pbml0IChyZXYgbClcbjs7XG4iLCIoKlxuICAgVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBydW50aW1lIHN1cHBvcnQgZm9yIFtwcHhfaGFzaF0uXG5cbiAgIFRoZSBbcHB4X2hhc2hdIHN5bnRheCBleHRlbnNpb24gc3VwcG9ydHM6IFtAQGRlcml2aW5nIGhhc2hdIGFuZCBbJWhhc2hfZm9sZDogVFlQRV0gYW5kXG4gICBbJWhhc2g6IFRZUEVdXG5cbiAgIEZvciB0eXBlIFt0XSBhIGZ1bmN0aW9uIFtoYXNoX2ZvbGRfdF0gb2YgdHlwZSBbSGFzaC5zdGF0ZSAtPiB0IC0+IEhhc2guc3RhdGVdIGlzXG4gICBnZW5lcmF0ZWQuXG5cbiAgIFRoZSBnZW5lcmF0ZWQgW2hhc2hfZm9sZF88VD5dIGZ1bmN0aW9uIGlzIGNvbXBvc2l0aW9uYWwsIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZVxuICAgdHlwZTsgYWxsb3dpbmcgdXNlciBvdmVycmlkZXMgYXQgZXZlcnkgbGV2ZWwuIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gb2NhbWwncyBidWlsdGluXG4gICBwb2x5bW9ycGhpYyBoYXNoaW5nIFtIYXNodGJsLmhhc2hdIHdoaWNoIGlnbm9yZXMgdXNlciBvdmVycmlkZXMuXG5cbiAgIFRoZSBnZW5lcmF0b3IgYWxzbyBwcm92aWRlcyBhIGRpcmVjdCBoYXNoLWZ1bmN0aW9uIFtoYXNoXSAobmFtZWQgW2hhc2hfPFQ+XSB3aGVuIDxUPiAhPVxuICAgXCJ0XCIpIG9mIHR5cGU6IFt0IC0+IEhhc2guaGFzaF92YWx1ZV0uXG5cbiAgIFRoZSBmb2xkaW5nIGhhc2ggZnVuY3Rpb24gY2FuIGJlIGFjY2Vzc2VkIGFzIFslaGFzaF9mb2xkOiBUWVBFXVxuICAgVGhlIGRpcmVjdCBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBhY2Nlc3NlZCBhcyBbJWhhc2g6IFRZUEVdXG4qKVxuXG5vcGVuISBJbXBvcnQwXG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbm1vZHVsZSBDaGFyID0gQ2hhcjBcbm1vZHVsZSBJbnQgPSBJbnQwXG5tb2R1bGUgTGlzdCA9IExpc3QwXG5pbmNsdWRlIEhhc2hfaW50ZlxuXG4oKiogQnVpbHRpbiBmb2xkaW5nLXN0eWxlIGhhc2ggZnVuY3Rpb25zLCBhYnN0cmFjdGVkIG92ZXIgW0hhc2hfaW50Zi5TXSAqKVxubW9kdWxlIEZvbGRpbmcgKEhhc2ggOiBIYXNoX2ludGYuUykgOlxuICBIYXNoX2ludGYuQnVpbHRpbl9pbnRmXG4gIHdpdGggdHlwZSBzdGF0ZSA9IEhhc2guc3RhdGVcbiAgIGFuZCB0eXBlIGhhc2hfdmFsdWUgPSBIYXNoLmhhc2hfdmFsdWUgPSBzdHJ1Y3RcbiAgdHlwZSBzdGF0ZSA9IEhhc2guc3RhdGVcbiAgdHlwZSBoYXNoX3ZhbHVlID0gSGFzaC5oYXNoX3ZhbHVlXG4gIHR5cGUgJ2EgZm9sZGVyID0gc3RhdGUgLT4gJ2EgLT4gc3RhdGVcblxuICBsZXQgaGFzaF9mb2xkX3VuaXQgcyAoKSA9IHNcbiAgbGV0IGhhc2hfZm9sZF9pbnQgPSBIYXNoLmZvbGRfaW50XG4gIGxldCBoYXNoX2ZvbGRfaW50NjQgPSBIYXNoLmZvbGRfaW50NjRcbiAgbGV0IGhhc2hfZm9sZF9mbG9hdCA9IEhhc2guZm9sZF9mbG9hdFxuICBsZXQgaGFzaF9mb2xkX3N0cmluZyA9IEhhc2guZm9sZF9zdHJpbmdcbiAgbGV0IGFzX2ludCBmIHMgeCA9IGhhc2hfZm9sZF9pbnQgcyAoZiB4KVxuXG4gICgqIFRoaXMgaWdub3JlcyB0aGUgc2lnbiBiaXQgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIGJ1dCBpdCdzIHVubGlrZWx5IHRvIGxlYWQgdG9cbiAgICAgZnJlcXVlbnQgY29sbGlzaW9ucyAobWluX3ZhbHVlIGNvbGxpZGluZyB3aXRoIDAgaXMgdGhlIG1vc3QgbGlrZWx5IG9uZSkuICAqKVxuICBsZXQgaGFzaF9mb2xkX2ludDMyID0gYXNfaW50IENhbWwuSW50MzIudG9faW50XG4gIGxldCBoYXNoX2ZvbGRfY2hhciA9IGFzX2ludCBDaGFyLnRvX2ludFxuXG4gIGxldCBoYXNoX2ZvbGRfYm9vbCA9XG4gICAgYXNfaW50IChmdW5jdGlvblxuICAgICAgfCB0cnVlIC0+IDFcbiAgICAgIHwgZmFsc2UgLT4gMClcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX25hdGl2ZWludCBzIHggPSBoYXNoX2ZvbGRfaW50NjQgcyAoQ2FtbC5JbnQ2NC5vZl9uYXRpdmVpbnQgeClcblxuICBsZXQgaGFzaF9mb2xkX29wdGlvbiBoYXNoX2ZvbGRfZWxlbSBzID0gZnVuY3Rpb25cbiAgICB8IE5vbmUgLT4gaGFzaF9mb2xkX2ludCBzIDBcbiAgICB8IFNvbWUgeCAtPiBoYXNoX2ZvbGRfZWxlbSAoaGFzaF9mb2xkX2ludCBzIDEpIHhcbiAgOztcblxuICBsZXQgcmVjIGhhc2hfZm9sZF9saXN0X2JvZHkgaGFzaF9mb2xkX2VsZW0gcyBsaXN0ID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IHNcbiAgICB8IHggOjogeHMgLT4gaGFzaF9mb2xkX2xpc3RfYm9keSBoYXNoX2ZvbGRfZWxlbSAoaGFzaF9mb2xkX2VsZW0gcyB4KSB4c1xuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfbGlzdCBoYXNoX2ZvbGRfZWxlbSBzIGxpc3QgPVxuICAgICgqIFRoZSBbbGVuZ3RoXSBvZiB0aGUgbGlzdCBtdXN0IGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBoYXNoLXN0YXRlIHNvIHZhbHVlcyBvZlxuICAgICAgIHR5cGVzIHN1Y2ggYXMgW3VuaXQgbGlzdF0gLSAoW10sIFsoKV0sIFsoKTsoKV0sLi4pIGFyZSBoYXNoZWQgZGlmZmVyZW50bHkuICopXG4gICAgKCogVGhlIFtsZW5ndGhdIG11c3QgY29tZSBiZWZvcmUgdGhlIGVsZW1lbnRzIHRvIGF2b2lkIGEgdmlvbGF0aW9uIG9mIHRoZSBydWxlXG4gICAgICAgZW5mb3JjZWQgYnkgUGVyZmVjdF9oYXNoLiAqKVxuICAgIGxldCBzID0gaGFzaF9mb2xkX2ludCBzIChMaXN0Lmxlbmd0aCBsaXN0KSBpblxuICAgIGxldCBzID0gaGFzaF9mb2xkX2xpc3RfYm9keSBoYXNoX2ZvbGRfZWxlbSBzIGxpc3QgaW5cbiAgICBzXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9sYXp5X3QgaGFzaF9mb2xkX2VsZW0gcyB4ID0gaGFzaF9mb2xkX2VsZW0gcyAoQ2FtbC5MYXp5LmZvcmNlIHgpXG4gIGxldCBoYXNoX2ZvbGRfcmVmX2Zyb3plbiBoYXNoX2ZvbGRfZWxlbSBzIHggPSBoYXNoX2ZvbGRfZWxlbSBzICF4XG5cbiAgbGV0IHJlYyBoYXNoX2ZvbGRfYXJyYXlfZnJvemVuX2kgaGFzaF9mb2xkX2VsZW0gcyBhcnJheSBpID1cbiAgICBpZiBpID0gQXJyYXkubGVuZ3RoIGFycmF5XG4gICAgdGhlbiBzXG4gICAgZWxzZSAoXG4gICAgICBsZXQgZSA9IEFycmF5LnVuc2FmZV9nZXQgYXJyYXkgaSBpblxuICAgICAgaGFzaF9mb2xkX2FycmF5X2Zyb3plbl9pIGhhc2hfZm9sZF9lbGVtIChoYXNoX2ZvbGRfZWxlbSBzIGUpIGFycmF5IChpICsgMSkpXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9hcnJheV9mcm96ZW4gaGFzaF9mb2xkX2VsZW0gcyBhcnJheSA9XG4gICAgaGFzaF9mb2xkX2FycmF5X2Zyb3plbl9pXG4gICAgICAoKiBbbGVuZ3RoXSBtdXN0IGJlIGluY29ycG9yYXRlZCBmb3IgYXJyYXlzLCBhcyBpdCBpcyBmb3IgbGlzdHMuIFNlZSBjb21tZW50IGFib3ZlICopXG4gICAgICBoYXNoX2ZvbGRfZWxlbVxuICAgICAgKGhhc2hfZm9sZF9pbnQgcyAoQXJyYXkubGVuZ3RoIGFycmF5KSlcbiAgICAgIGFycmF5XG4gICAgICAwXG4gIDs7XG5cbiAgKCogdGhlIGR1cGxpY2F0aW9uIGhlcmUgaXMgYmVjYXVzZSB3ZSB0aGlua1xuICAgICBvY2FtbCBjYW4ndCBlbGltaW5hdGUgaW5kaXJlY3QgZnVuY3Rpb24gY2FsbHMgb3RoZXJ3aXNlLiAqKVxuICBsZXQgaGFzaF9uYXRpdmVpbnQgeCA9XG4gICAgSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX25hdGl2ZWludCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIDs7XG5cbiAgbGV0IGhhc2hfaW50NjQgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9pbnQ2NCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIGxldCBoYXNoX2ludDMyIHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfaW50MzIgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICBsZXQgaGFzaF9jaGFyIHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfY2hhciAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIGxldCBoYXNoX2ludCB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2ludCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIGxldCBoYXNoX2Jvb2wgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9ib29sIChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcblxuICBsZXQgaGFzaF9zdHJpbmcgeCA9XG4gICAgSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX3N0cmluZyAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIDs7XG5cbiAgbGV0IGhhc2hfZmxvYXQgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9mbG9hdCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIGxldCBoYXNoX3VuaXQgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF91bml0IChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbmVuZFxuXG5tb2R1bGUgRiAoSGFzaCA6IEhhc2hfaW50Zi5TKSA6XG4gIEhhc2hfaW50Zi5GdWxsXG4gIHdpdGggdHlwZSBoYXNoX3ZhbHVlID0gSGFzaC5oYXNoX3ZhbHVlXG4gICBhbmQgdHlwZSBzdGF0ZSA9IEhhc2guc3RhdGVcbiAgIGFuZCB0eXBlIHNlZWQgPSBIYXNoLnNlZWQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBIYXNoXG5cbiAgdHlwZSAnYSBmb2xkZXIgPSBzdGF0ZSAtPiAnYSAtPiBzdGF0ZVxuXG4gIGxldCBjcmVhdGUgP3NlZWQgKCkgPSByZXNldCA/c2VlZCAoYWxsb2MgKCkpXG4gIGxldCBvZl9mb2xkIGhhc2hfZm9sZF90IHQgPSBnZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX3QgKGNyZWF0ZSAoKSkgdClcblxuICBtb2R1bGUgQnVpbHRpbiA9IEZvbGRpbmcgKEhhc2gpXG5cbiAgbGV0IHJ1biA/c2VlZCBmb2xkZXIgeCA9XG4gICAgSGFzaC5nZXRfaGFzaF92YWx1ZSAoZm9sZGVyIChIYXNoLnJlc2V0ID9zZWVkIChIYXNoLmFsbG9jICgpKSkgeClcbiAgOztcbmVuZFxuXG5tb2R1bGUgSW50ZXJuYWxoYXNoIDogc2lnXG4gIGluY2x1ZGVcbiAgICBIYXNoX2ludGYuU1xuICAgIHdpdGggdHlwZSBzdGF0ZSA9IEJhc2VfaW50ZXJuYWxoYXNoX3R5cGVzLnN0YXRlXG4gICAgICgqIFdlIGdpdmUgYSBjb25jcmV0ZSB0eXBlIGZvciBbc3RhdGVdLCBhbGJlaXQgb25seSBwYXJ0aWFsbHkgZXhwb3NlZCAoc2VlXG4gICAgICAgIEJhc2VfaW50ZXJuYWxoYXNoX3R5cGVzKSwgc28gdGhhdCBpdCB1bmlmaWVzIHdpdGggdGhlIHNhbWUgdHlwZSBpbiBbQmFzZV9ib290XSxcbiAgICAgICAgYW5kIHRvIGFsbG93IG9wdGltaXphdGlvbnMgZm9yIHRoZSBpbW1lZGlhdGUgdHlwZS4gKilcbiAgICAgYW5kIHR5cGUgc2VlZCA9IEJhc2VfaW50ZXJuYWxoYXNoX3R5cGVzLnNlZWRcbiAgICAgYW5kIHR5cGUgaGFzaF92YWx1ZSA9IEJhc2VfaW50ZXJuYWxoYXNoX3R5cGVzLmhhc2hfdmFsdWVcblxuICBleHRlcm5hbCBmb2xkX2ludDY0IDogc3RhdGUgLT4gaW50NjQgLT4gc3RhdGUgPSBcIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50NjRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGZvbGRfaW50IDogc3RhdGUgLT4gaW50IC0+IHN0YXRlID0gXCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludFwiIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgZm9sZF9mbG9hdCA6IHN0YXRlIC0+IGZsb2F0IC0+IHN0YXRlID0gXCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2Zsb2F0XCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBmb2xkX3N0cmluZyA6IHN0YXRlIC0+IHN0cmluZyAtPiBzdGF0ZSA9IFwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9zdHJpbmdcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGdldF9oYXNoX3ZhbHVlIDogc3RhdGUgLT4gaGFzaF92YWx1ZSA9IFwiQmFzZV9pbnRlcm5hbGhhc2hfZ2V0X2hhc2hfdmFsdWVcIlxuICBbQEBub2FsbG9jXVxuZW5kID0gc3RydWN0XG4gIGxldCBkZXNjcmlwdGlvbiA9IFwiaW50ZXJuYWxoYXNoXCJcblxuICBpbmNsdWRlIEJhc2VfaW50ZXJuYWxoYXNoX3R5cGVzXG5cbiAgbGV0IGFsbG9jICgpID0gY3JlYXRlX3NlZWRlZCAwXG4gIGxldCByZXNldCA/KHNlZWQgPSAwKSBfdCA9IGNyZWF0ZV9zZWVkZWQgc2VlZFxuXG4gIG1vZHVsZSBGb3JfdGVzdHMgPSBzdHJ1Y3RcbiAgICBsZXQgY29tcGFyZV9zdGF0ZSAoYSA6IHN0YXRlKSAoYiA6IHN0YXRlKSA9IGNvbXBhcmUgKGEgOj4gaW50KSAoYiA6PiBpbnQpXG4gICAgbGV0IHN0YXRlX3RvX3N0cmluZyAoc3RhdGUgOiBzdGF0ZSkgPSBJbnQudG9fc3RyaW5nIChzdGF0ZSA6PiBpbnQpXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIGluY2x1ZGUgSW50ZXJuYWxoYXNoXG5cbiAgdHlwZSAnYSBmb2xkZXIgPSBzdGF0ZSAtPiAnYSAtPiBzdGF0ZVxuXG4gIGxldCBjcmVhdGUgP3NlZWQgKCkgPSByZXNldCA/c2VlZCAoYWxsb2MgKCkpXG4gIGxldCBydW4gP3NlZWQgZm9sZGVyIHggPSBnZXRfaGFzaF92YWx1ZSAoZm9sZGVyIChyZXNldCA/c2VlZCAoYWxsb2MgKCkpKSB4KVxuICBsZXQgb2ZfZm9sZCBoYXNoX2ZvbGRfdCB0ID0gZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF90IChjcmVhdGUgKCkpIHQpXG5cbiAgbW9kdWxlIEJ1aWx0aW4gPSBzdHJ1Y3RcbiAgICBtb2R1bGUgRm9sZGluZyA9IEZvbGRpbmcgKEludGVybmFsaGFzaClcbiAgICBpbmNsdWRlIEZvbGRpbmdcblxuICAgICgqIFtGb2xkaW5nXSBwcm92aWRlcyBzb21lIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgW2hhc2hfKl0gZnVuY3Rpb25zIGJlbG93LFxuICAgICAgIGJ1dCB0aGV5IGFyZSBpbmVmZmljaWVudCBmb3Igc29tZSB1c2UtY2FzZXMgYmVjYXVzZSBvZiB0aGUgdXNlIG9mIHRoZSBbaGFzaF9mb2xkXVxuICAgICAgIGZ1bmN0aW9ucy4gQXQgdGhpcyBwb2ludCwgdGhlIFtoYXNoX3ZhbHVlXSB0eXBlIGhhcyBiZWVuIGZpeGVkIHRvIFtpbnRdLCBzbyB0aGlzXG4gICAgICAgbW9kdWxlIGNhbiBwcm92aWRlIHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucy4gKilcblxuICAgIGxldCBoYXNoX2NoYXIgPSBDaGFyMC50b19pbnRcblxuICAgICgqIFRoaXMgaGFzaCB3YXMgY2hvc2VuIGZyb20gaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vYmFkYm95LzYyNjc3NDNcblxuICAgICAgIEl0IGF0dGVtcHRzIHRvIGZ1bGZpbGwgdGhlIHByaW1hcnkgZ29hbHMgb2YgYSBub24tY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uOlxuXG4gICAgICAgLSBhIGJpdCBjaGFuZ2UgaW4gdGhlIGlucHV0IHNob3VsZCBjaGFuZ2UgfjEvMiBvZiB0aGUgb3V0cHV0IGJpdHNcbiAgICAgICAtIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBhY3Jvc3MgdGhlIG91dHB1dCByYW5nZVxuICAgICAgIC0gaW5wdXRzIHRoYXQgYXJlIGNsb3NlIHRvIGVhY2ggb3RoZXIgc2hvdWxkbid0IGxlYWQgdG8gb3V0cHV0cyB0aGF0IGFyZSBjbG9zZSB0b1xuICAgICAgICAgZWFjaCBvdGhlci5cbiAgICAgICAtIGFsbCBiaXRzIG9mIHRoZSBpbnB1dCBhcmUgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBvdXRwdXRcblxuICAgICAgIEluIG91ciBjYXNlIHdlIGFsc28gd2FudCBpdCB0byBiZSBmYXN0LCBub24tYWxsb2NhdGluZywgYW5kIGlubGluYWJsZS4gICopXG4gICAgbGV0W0BpbmxpbmUgYWx3YXlzXSBoYXNoX2ludCAodCA6IGludCkgPVxuICAgICAgbGV0IHQgPSBsbm90IHQgKyAodCBsc2wgMjEpIGluXG4gICAgICBsZXQgdCA9IHQgbHhvciAodCBsc3IgMjQpIGluXG4gICAgICBsZXQgdCA9IHQgKyAodCBsc2wgMykgKyAodCBsc2wgOCkgaW5cbiAgICAgIGxldCB0ID0gdCBseG9yICh0IGxzciAxNCkgaW5cbiAgICAgIGxldCB0ID0gdCArICh0IGxzbCAyKSArICh0IGxzbCA0KSBpblxuICAgICAgbGV0IHQgPSB0IGx4b3IgKHQgbHNyIDI4KSBpblxuICAgICAgdCArICh0IGxzbCAzMSlcbiAgICA7O1xuXG4gICAgbGV0IGhhc2hfYm9vbCB4ID0gaWYgeCB0aGVuIDEgZWxzZSAwXG5cbiAgICBleHRlcm5hbCBoYXNoX2Zsb2F0IDogZmxvYXQgLT4gaW50ID0gXCJCYXNlX2hhc2hfZG91YmxlXCIgW0BAbm9hbGxvY11cblxuICAgIGxldCBoYXNoX3VuaXQgKCkgPSAwXG4gIGVuZFxuZW5kXG5cbmluY2x1ZGUgVFxuIiwib3BlbiBJbXBvcnQwXG5cbmxldCBwaHlzX2VxdWFsID0gcGh5c19lcXVhbFxuXG5leHRlcm5hbCBwb2x5bW9ycGhpY19jb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5leHRlcm5hbCBwb2x5bW9ycGhpY19lcXVhbCA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuXG5sZXQgY29tcGFyZV9hYnN0cmFjdCB+dHlwZV9uYW1lIF8gXyA9XG4gIFByaW50Zi5rc3ByaW50ZlxuICAgIGZhaWx3aXRoXG4gICAgXCJDb21wYXJlIGNhbGxlZCBvbiB0aGUgdHlwZSAlcywgd2hpY2ggaXMgYWJzdHJhY3QgaW4gYW4gaW1wbGVtZW50YXRpb24uXCJcbiAgICB0eXBlX25hbWVcbjs7XG5cbmxldCBlcXVhbF9hYnN0cmFjdCB+dHlwZV9uYW1lIF8gXyA9XG4gIFByaW50Zi5rc3ByaW50ZlxuICAgIGZhaWx3aXRoXG4gICAgXCJFcXVhbCBjYWxsZWQgb24gdGhlIHR5cGUgJXMsIHdoaWNoIGlzIGFic3RyYWN0IGluIGFuIGltcGxlbWVudGF0aW9uLlwiXG4gICAgdHlwZV9uYW1lXG47O1xuXG50eXBlICdhIGNvbXBhcmUgPSAnYSAtPiAnYSAtPiBpbnRcbnR5cGUgJ2EgZXF1YWwgPSAnYSAtPiAnYSAtPiBib29sXG5cbm1vZHVsZSBDb21wYXJhYmxlID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBjb21wYXJlIDogdCBjb21wYXJlXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMxID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgY29tcGFyZSA6ICdhIGNvbXBhcmUgLT4gJ2EgdCBjb21wYXJlXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgY29tcGFyZSA6ICdhIGNvbXBhcmUgLT4gJ2IgY29tcGFyZSAtPiAoJ2EsICdiKSB0IGNvbXBhcmVcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICB2YWwgY29tcGFyZSA6ICdhIGNvbXBhcmUgLT4gJ2IgY29tcGFyZSAtPiAnYyBjb21wYXJlIC0+ICgnYSwgJ2IsICdjKSB0IGNvbXBhcmVcbiAgZW5kXG5lbmRcblxubW9kdWxlIEVxdWFsID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBlcXVhbCA6IHQgZXF1YWxcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBlcXVhbCA6ICdhIGVxdWFsIC0+ICdhIHQgZXF1YWxcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBlcXVhbCA6ICdhIGVxdWFsIC0+ICdiIGVxdWFsIC0+ICgnYSwgJ2IpIHQgZXF1YWxcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICB2YWwgZXF1YWwgOiAnYSBlcXVhbCAtPiAnYiBlcXVhbCAtPiAnYyBlcXVhbCAtPiAoJ2EsICdiLCAnYykgdCBlcXVhbFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgQnVpbHRpbiA9IHN0cnVjdFxuICBsZXQgY29tcGFyZV9ib29sIDogYm9vbCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX2NoYXIgOiBjaGFyIGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfZmxvYXQgOiBmbG9hdCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX2ludCA6IGludCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX2ludDMyIDogaW50MzIgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9pbnQ2NCA6IGludDY0IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfbmF0aXZlaW50IDogbmF0aXZlaW50IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfc3RyaW5nIDogc3RyaW5nIGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfdW5pdCA6IHVuaXQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuXG4gIGxldCBjb21wYXJlX2FycmF5IGNvbXBhcmVfZWx0IGEgYiA9XG4gICAgaWYgcGh5c19lcXVhbCBhIGJcbiAgICB0aGVuIDBcbiAgICBlbHNlIChcbiAgICAgIGxldCBsZW5fYSA9IEFycmF5MC5sZW5ndGggYSBpblxuICAgICAgbGV0IGxlbl9iID0gQXJyYXkwLmxlbmd0aCBiIGluXG4gICAgICBsZXQgcmV0ID0gY29tcGFyZSBsZW5fYSBsZW5fYiBpblxuICAgICAgaWYgcmV0IDw+IDBcbiAgICAgIHRoZW4gcmV0XG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgICAgIGlmIGkgPSBsZW5fYVxuICAgICAgICAgIHRoZW4gMFxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IGwgPSBBcnJheTAudW5zYWZlX2dldCBhIGlcbiAgICAgICAgICAgIGFuZCByID0gQXJyYXkwLnVuc2FmZV9nZXQgYiBpIGluXG4gICAgICAgICAgICBsZXQgcmVzID0gY29tcGFyZV9lbHQgbCByIGluXG4gICAgICAgICAgICBpZiByZXMgPD4gMCB0aGVuIHJlcyBlbHNlIGxvb3AgKGkgKyAxKSlcbiAgICAgICAgaW5cbiAgICAgICAgbG9vcCAwKSlcbiAgOztcblxuICBsZXQgcmVjIGNvbXBhcmVfbGlzdCBjb21wYXJlX2VsdCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgW10sIFtdIC0+IDBcbiAgICB8IFtdLCBfIC0+IC0xXG4gICAgfCBfLCBbXSAtPiAxXG4gICAgfCB4IDo6IHhzLCB5IDo6IHlzIC0+XG4gICAgICBsZXQgcmVzID0gY29tcGFyZV9lbHQgeCB5IGluXG4gICAgICBpZiByZXMgPD4gMCB0aGVuIHJlcyBlbHNlIGNvbXBhcmVfbGlzdCBjb21wYXJlX2VsdCB4cyB5c1xuICA7O1xuXG4gIGxldCBjb21wYXJlX29wdGlvbiBjb21wYXJlX2VsdCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgTm9uZSwgTm9uZSAtPiAwXG4gICAgfCBOb25lLCBTb21lIF8gLT4gLTFcbiAgICB8IFNvbWUgXywgTm9uZSAtPiAxXG4gICAgfCBTb21lIGEsIFNvbWUgYiAtPiBjb21wYXJlX2VsdCBhIGJcbiAgOztcblxuICBsZXQgY29tcGFyZV9yZWYgY29tcGFyZV9lbHQgYSBiID0gY29tcGFyZV9lbHQgIWEgIWJcbiAgbGV0IGVxdWFsX2Jvb2wgOiBib29sIGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfY2hhciA6IGNoYXIgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9pbnQgOiBpbnQgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9pbnQzMiA6IGludDMyIGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfaW50NjQgOiBpbnQ2NCBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX25hdGl2ZWludCA6IG5hdGl2ZWludCBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX3N0cmluZyA6IHN0cmluZyBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX3VuaXQgOiB1bml0IGVxdWFsID0gUG9seS5lcXVhbFxuXG4gICgqIFtQb2x5LmVxdWFsXSBpcyBJRUVFIGNvbXBsaWFudCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudCBoZXJlLiAqKVxuICBsZXQgZXF1YWxfZmxvYXQgeCB5ID0gZXF1YWxfaW50IChjb21wYXJlX2Zsb2F0IHggeSkgMFxuXG4gIGxldCBlcXVhbF9hcnJheSBlcXVhbF9lbHQgYSBiID1cbiAgICBwaHlzX2VxdWFsIGEgYlxuICAgIHx8XG4gICAgbGV0IGxlbl9hID0gQXJyYXkwLmxlbmd0aCBhIGluXG4gICAgbGV0IGxlbl9iID0gQXJyYXkwLmxlbmd0aCBiIGluXG4gICAgZXF1YWwgbGVuX2EgbGVuX2JcbiAgICAmJlxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGkgPSBsZW5fYVxuICAgICAgfHxcbiAgICAgIGxldCBsID0gQXJyYXkwLnVuc2FmZV9nZXQgYSBpXG4gICAgICBhbmQgciA9IEFycmF5MC51bnNhZmVfZ2V0IGIgaSBpblxuICAgICAgZXF1YWxfZWx0IGwgciAmJiBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuICA7O1xuXG4gIGxldCByZWMgZXF1YWxfbGlzdCBlcXVhbF9lbHQgYSBiID1cbiAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IFtdLCBbXSAtPiB0cnVlXG4gICAgfCBbXSwgXyB8IF8sIFtdIC0+IGZhbHNlXG4gICAgfCB4IDo6IHhzLCB5IDo6IHlzIC0+IGVxdWFsX2VsdCB4IHkgJiYgZXF1YWxfbGlzdCBlcXVhbF9lbHQgeHMgeXNcbiAgOztcblxuICBsZXQgZXF1YWxfb3B0aW9uIGVxdWFsX2VsdCBhIGIgPVxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgTm9uZSwgTm9uZSAtPiB0cnVlXG4gICAgfCBOb25lLCBTb21lIF8gfCBTb21lIF8sIE5vbmUgLT4gZmFsc2VcbiAgICB8IFNvbWUgYSwgU29tZSBiIC0+IGVxdWFsX2VsdCBhIGJcbiAgOztcblxuICBsZXQgZXF1YWxfcmVmIGVxdWFsX2VsdCBhIGIgPSBlcXVhbF9lbHQgIWEgIWJcbmVuZFxuIiwiKCoqIFRoaXMgbW9kdWxlIGlzIGZvciB1c2UgYnkgcHB4X2hhc2gsIGFuZCBpcyB0aHVzIG5vdCBpbiB0aGUgaW50ZXJmYWNlIG9mIEJhc2UuICopXG5tb2R1bGUgU3RkID0gc3RydWN0XG4gIG1vZHVsZSBIYXNoID0gSGFzaCAoKiogQGNhbm9uaWNhbCBCYXNlLkhhc2ggKilcbmVuZFxuXG50eXBlICdhIGhhc2hfZm9sZCA9IFN0ZC5IYXNoLnN0YXRlIC0+ICdhIC0+IFN0ZC5IYXNoLnN0YXRlXG5cbm1vZHVsZSBIYXNoYWJsZSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgaGFzaF9mb2xkX3QgOiB0IGhhc2hfZm9sZFxuICAgIHZhbCBoYXNoIDogdCAtPiBTdGQuSGFzaC5oYXNoX3ZhbHVlXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMxID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgaGFzaF9mb2xkX3QgOiAnYSBoYXNoX2ZvbGQgLT4gJ2EgdCBoYXNoX2ZvbGRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBoYXNoX2ZvbGRfdCA6ICdhIGhhc2hfZm9sZCAtPiAnYiBoYXNoX2ZvbGQgLT4gKCdhLCAnYikgdCBoYXNoX2ZvbGRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICB2YWwgaGFzaF9mb2xkX3RcbiAgICAgIDogICdhIGhhc2hfZm9sZFxuICAgICAgLT4gJ2IgaGFzaF9mb2xkXG4gICAgICAtPiAnYyBoYXNoX2ZvbGRcbiAgICAgIC0+ICgnYSwgJ2IsICdjKSB0IGhhc2hfZm9sZFxuICBlbmRcbmVuZFxuIiwib3BlbiBIYXNoLkJ1aWx0aW5cbm9wZW4gUHB4X2NvbXBhcmVfbGliLkJ1aWx0aW5cbmluY2x1ZGUgU2V4cGxpYjAuU2V4cFxuXG4oKiogVHlwZSBvZiBTLWV4cHJlc3Npb25zICopXG50eXBlIHQgPSBTZXhwbGliMC5TZXhwLnQgPVxuICB8IEF0b20gb2Ygc3RyaW5nXG4gIHwgTGlzdCBvZiB0IGxpc3RcbltAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG5sZXQgcmVjIGNvbXBhcmUgPVxuICAoZnVuIGFfXzAwMV8gYl9fMDAyXyAtPlxuICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDFfIGJfXzAwMl9cbiAgICAgdGhlbiAwXG4gICAgIGVsc2UgKFxuICAgICAgIG1hdGNoIGFfXzAwMV8sIGJfXzAwMl8gd2l0aFxuICAgICAgIHwgQXRvbSBfYV9fMDAzXywgQXRvbSBfYl9fMDA0XyAtPiBjb21wYXJlX3N0cmluZyBfYV9fMDAzXyBfYl9fMDA0X1xuICAgICAgIHwgQXRvbSBfLCBfIC0+IC0xXG4gICAgICAgfCBfLCBBdG9tIF8gLT4gMVxuICAgICAgIHwgTGlzdCBfYV9fMDA1XywgTGlzdCBfYl9fMDA2XyAtPiBjb21wYXJlX2xpc3QgY29tcGFyZSBfYV9fMDA1XyBfYl9fMDA2XylcbiAgICAgICA6IHQgLT4gdCAtPiBpbnQpXG47O1xuXG5sZXQgcmVjIChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAoZnVuIGhzdiBhcmcgLT5cbiAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgfCBBdG9tIF9hMCAtPlxuICAgICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDAgaW5cbiAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgaGFzaF9mb2xkX3N0cmluZyBoc3YgX2EwXG4gICAgIHwgTGlzdCBfYTAgLT5cbiAgICAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxIGluXG4gICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgIGhhc2hfZm9sZF9saXN0IGhhc2hfZm9sZF90IGhzdiBfYTBcbiAgICAgICA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcblxuYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICBsZXQgZnVuYyBhcmcgPVxuICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgaGFzaF9mb2xkX3QgaHN2IGFyZylcbiAgaW5cbiAgZnVuIHggLT4gZnVuYyB4XG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgdF9zZXhwX2dyYW1tYXIgPSBTZXhwbGliMC5TZXhwX2NvbnYuc2V4cF90X3NleHBfZ3JhbW1hclxubGV0IG9mX3N0cmluZyA9ICgpXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgU3lzID0gU3lzMFxuXG50eXBlIHQgPVxuICB8IFczMlxuICB8IFc2NFxuW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbmxldCBzZXhwX29mX3QgPVxuICAoZnVuY3Rpb25cbiAgICB8IFczMiAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJXMzJcIlxuICAgIHwgVzY0IC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlc2NFwiXG4gICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbjs7XG5cbltAQEBlbmRdXG5cbmxldCBudW1fYml0cyA9IGZ1bmN0aW9uXG4gIHwgVzMyIC0+IDMyXG4gIHwgVzY0IC0+IDY0XG47O1xuXG5sZXQgd29yZF9zaXplID1cbiAgbWF0Y2ggU3lzLndvcmRfc2l6ZV9pbl9iaXRzIHdpdGhcbiAgfCAzMiAtPiBXMzJcbiAgfCA2NCAtPiBXNjRcbiAgfCBfIC0+IGZhaWx3aXRoIFwidW5rbm93biB3b3JkIHNpemVcIlxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgciA9IHJlZiBbIFwiQmFzZS5TZXhwLnBwX2h1bVwiIF1cbmxldCBhbGwgKCkgPSAhclxubGV0IHJlZ2lzdGVyIHAgPSByIDo9IHAgOjogIXJcblxubW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB0eXBlIHRcblxuICB2YWwgcHAgOiBGb3JtYXR0ZXIudCAtPiB0IC0+IHVuaXRcbmVuZFxuXG5tb2R1bGUgUmVnaXN0ZXJfcHAgKE0gOiBzaWdcbiAgICBpbmNsdWRlIFNcblxuICAgIHZhbCBtb2R1bGVfbmFtZSA6IHN0cmluZ1xuICBlbmQpID1cbnN0cnVjdFxuICBpbmNsdWRlIE1cblxuICBsZXQgKCkgPSByZWdpc3RlciAoTS5tb2R1bGVfbmFtZSBeIFwiLnBwXCIpXG5lbmRcblxubW9kdWxlIFJlZ2lzdGVyIChNIDogc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgbW9kdWxlX25hbWUgOiBzdHJpbmdcbiAgICB2YWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmdcbiAgZW5kKSA9XG4gIFJlZ2lzdGVyX3BwIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIGxldCBwcCBmb3JtYXR0ZXIgdCA9IENhbWwuRm9ybWF0LnBwX3ByaW50X3N0cmluZyBmb3JtYXR0ZXIgKE0udG9fc3RyaW5nIHQpXG4gIGVuZClcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlIHQgPSBleG4gW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbmxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9leG4gOiB0IC0+IFNleHBsaWIwLlNleHAudClcblxuW0BAQGVuZF1cblxubGV0IGV4aXQgPSBDYW1sLmV4aXRcblxuZXhjZXB0aW9uIEZpbmFsbHkgb2YgdCAqIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbmxldCAoKSA9XG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBGaW5hbGx5XSAoZnVuY3Rpb25cbiAgICB8IEZpbmFsbHkgKGFyZzBfXzAwMV8sIGFyZzFfXzAwMl8pIC0+XG4gICAgICBsZXQgcmVzMF9fMDAzXyA9IHNleHBfb2ZfdCBhcmcwX18wMDFfXG4gICAgICBhbmQgcmVzMV9fMDA0XyA9IHNleHBfb2ZfdCBhcmcxX18wMDJfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJleG4ubWwuRmluYWxseVwiOyByZXMwX18wMDNfOyByZXMxX18wMDRfIF1cbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuOztcblxuW0BAQGVuZF1cblxuZXhjZXB0aW9uIFJlcmFpc2VkIG9mIHN0cmluZyAqIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbmxldCAoKSA9XG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBSZXJhaXNlZF0gKGZ1bmN0aW9uXG4gICAgfCBSZXJhaXNlZCAoYXJnMF9fMDA1XywgYXJnMV9fMDA2XykgLT5cbiAgICAgIGxldCByZXMwX18wMDdfID0gc2V4cF9vZl9zdHJpbmcgYXJnMF9fMDA1X1xuICAgICAgYW5kIHJlczFfXzAwOF8gPSBzZXhwX29mX3QgYXJnMV9fMDA2XyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiZXhuLm1sLlJlcmFpc2VkXCI7IHJlczBfXzAwN187IHJlczFfXzAwOF8gXVxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG47O1xuXG5bQEBAZW5kXVxuXG5leGNlcHRpb24gU2V4cCBvZiBTZXhwLnRcblxuKCogV2UgaW5zdGFsbCBhIGN1c3RvbSBleG4tY29udmVydGVyIHJhdGhlciB0aGFuIHVzZTpcblxuICAge1tcbiAgICAgZXhjZXB0aW9uIFNleHAgb2YgU2V4cC50IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuICAgICAoKiAuLi4gKilcbiAgICAgW0BAQGVuZF1cbiAgIF19XG5cbiAgIHRvIGVsaW1pbmF0ZSB0aGUgZXh0cmEgd3JhcHBpbmcgb2YgWyhTZXhwIC4uLildLiAqKVxubGV0ICgpID1cbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFNleHBdIChmdW5jdGlvblxuICAgIHwgU2V4cCB0IC0+IHRcbiAgICB8IF8gLT5cbiAgICAgICgqIFJlYWNoaW5nIHRoaXMgYnJhbmNoIGluZGljYXRlcyBhIGJ1ZyBpbiBzZXhwbGliLiAqKVxuICAgICAgYXNzZXJ0IGZhbHNlKVxuOztcblxubGV0IGNyZWF0ZV9zIHNleHAgPSBTZXhwIHNleHBcblxubGV0IHJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIHQgYmFja3RyYWNlID1cbiAgQ2FtbC5QcmludGV4Yy5yYWlzZV93aXRoX2JhY2t0cmFjZSB0IGJhY2t0cmFjZVxuOztcblxuZXh0ZXJuYWwgaXNfcGh5c19lcXVhbF9tb3N0X3JlY2VudCA6IHQgLT4gYm9vbCA9IFwiQmFzZV9jYW1sX2V4bl9pc19tb3N0X3JlY2VudF9leG5cIlxuXG5sZXQgcmVyYWlzZSBleG4gc3RyID1cbiAgbGV0IGV4bicgPSBSZXJhaXNlZCAoc3RyLCBleG4pIGluXG4gIGlmIGlzX3BoeXNfZXF1YWxfbW9zdF9yZWNlbnQgZXhuXG4gIHRoZW4gKFxuICAgIGxldCBidCA9IENhbWwuUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICByYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSBleG4nIGJ0KVxuICBlbHNlIHJhaXNlIGV4bidcbjs7XG5cbmxldCByZXJhaXNlZiBleGMgZm9ybWF0ID0gUHJpbnRmLmtzcHJpbnRmIChmdW4gc3RyICgpIC0+IHJlcmFpc2UgZXhjIHN0cikgZm9ybWF0XG5sZXQgdG9fc3RyaW5nIGV4YyA9IFNleHAudG9fc3RyaW5nX2h1bSB+aW5kZW50OjIgKHNleHBfb2ZfZXhuIGV4YylcbmxldCB0b19zdHJpbmdfbWFjaCBleGMgPSBTZXhwLnRvX3N0cmluZ19tYWNoIChzZXhwX29mX2V4biBleGMpXG5sZXQgc2V4cF9vZl90ID0gc2V4cF9vZl9leG5cblxubGV0IHByb3RlY3R4IH5mIHggfihmaW5hbGx5IDogXyAtPiB1bml0KSA9XG4gIG1hdGNoIGYgeCB3aXRoXG4gIHwgcmVzIC0+XG4gICAgZmluYWxseSB4O1xuICAgIHJlc1xuICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICBsZXQgYnQgPSBDYW1sLlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgKG1hdGNoIGZpbmFsbHkgeCB3aXRoXG4gICAgIHwgKCkgLT4gcmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UgZXhuIGJ0XG4gICAgIHwgZXhjZXB0aW9uIGZpbmFsX2V4biAtPlxuICAgICAgICgqIFVuZm9ydHVuYXRlbHksIHRoZSBiYWNrdHJhY2Ugb2YgdGhlIFtmaW5hbF9leG5dIGlzIGRpc2NhcmRlZCBoZXJlLiAqKVxuICAgICAgIHJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIChGaW5hbGx5IChleG4sIGZpbmFsX2V4bikpIGJ0KVxuOztcblxubGV0IHByb3RlY3QgfmYgfmZpbmFsbHkgPSBwcm90ZWN0eCB+ZiAoKSB+ZmluYWxseVxuXG5sZXQgZG9lc19yYWlzZSAodHlwZSBhKSAoZiA6IHVuaXQgLT4gYSkgPVxuICB0cnlcbiAgICBpZ25vcmUgKGYgKCkgOiBhKTtcbiAgICBmYWxzZVxuICB3aXRoXG4gIHwgXyAtPiB0cnVlXG47O1xuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyX3BwIChzdHJ1Y3RcbiAgICB0eXBlIHQgPSBleG5cblxuICAgIGxldCBwcCBwcGYgdCA9XG4gICAgICBtYXRjaCBzZXhwX29mX2V4bl9vcHQgdCB3aXRoXG4gICAgICB8IFNvbWUgc2V4cCAtPiBTZXhwLnBwX2h1bSBwcGYgc2V4cFxuICAgICAgfCBOb25lIC0+IENhbWwuRm9ybWF0LnBwX3ByaW50X3N0cmluZyBwcGYgKENhbWwuUHJpbnRleGMudG9fc3RyaW5nIHQpXG4gICAgOztcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5FeG5cIlxuICBlbmQpXG5cbmxldCBwcmludF93aXRoX2JhY2t0cmFjZSBleGMgcmF3X2JhY2t0cmFjZSA9XG4gIENhbWwuRm9ybWF0LmVwcmludGYgXCJAWzwyPlVuY2F1Z2h0IGV4Y2VwdGlvbjpAXFxuQFxcbkBbJWFAXUBdQFxcbkAuXCIgcHAgZXhjO1xuICBpZiBDYW1sLlByaW50ZXhjLmJhY2t0cmFjZV9zdGF0dXMgKClcbiAgdGhlbiBDYW1sLlByaW50ZXhjLnByaW50X3Jhd19iYWNrdHJhY2UgQ2FtbC5zdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgQ2FtbC5mbHVzaCBDYW1sLnN0ZGVyclxuOztcblxubGV0IHNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciAoKSA9XG4gIENhbWwuUHJpbnRleGMuc2V0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIHByaW50X3dpdGhfYmFja3RyYWNlXG47O1xuXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2F1eCB+ZG9fYXRfZXhpdCB+ZXhpdCBmID1cbiAgdHJ5IGYgKCkgd2l0aFxuICB8IGV4YyAtPlxuICAgIGxldCByYXdfYmFja3RyYWNlID0gQ2FtbC5QcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgICgqIE9uZSByZWFzb24gdG8gcnVuIFtkb19hdF9leGl0XSBoYW5kbGVycyBiZWZvcmUgcHJpbnRpbmcgb3V0IHRoZSBlcnJvciBtZXNzYWdlIGlzXG4gICAgICAgdGhhdCBpdCBoZWxwcyBjdXJzZXMgYXBwbGljYXRpb25zIGJyaW5nIHRoZSB0ZXJtaW5hbCBpbiBhIGdvb2Qgc3RhdGUsIG90aGVyd2lzZSB0aGVcbiAgICAgICBlcnJvciBtZXNzYWdlIG1pZ2h0IGdldCBjb3JydXB0ZWQuICBBbHNvLCB0aGUgT0NhbWwgdG9wLWxldmVsIHVuY2F1Z2h0IGV4Y2VwdGlvblxuICAgICAgIGhhbmRsZXIgZG9lcyB0aGUgc2FtZS4gKilcbiAgICBpZiBkb19hdF9leGl0XG4gICAgdGhlbiAoXG4gICAgICB0cnkgQ2FtbC5kb19hdF9leGl0ICgpIHdpdGhcbiAgICAgIHwgXyAtPiAoKSk7XG4gICAgKHRyeSBwcmludF93aXRoX2JhY2t0cmFjZSBleGMgcmF3X2JhY2t0cmFjZSB3aXRoXG4gICAgIHwgXyAtPlxuICAgICAgICh0cnlcbiAgICAgICAgICBDYW1sLlByaW50Zi5lcHJpbnRmIFwiRXhuLmhhbmRsZV91bmNhdWdodCBjb3VsZCBub3QgcHJpbnQ7IGV4aXRpbmcgYW55d2F5XFxuJSFcIlxuICAgICAgICB3aXRoXG4gICAgICAgIHwgXyAtPiAoKSkpO1xuICAgIGV4aXQgMVxuOztcblxubGV0IGhhbmRsZV91bmNhdWdodF9hbmRfZXhpdCBmID0gaGFuZGxlX3VuY2F1Z2h0X2F1eCBmIH5leGl0IH5kb19hdF9leGl0OnRydWVcblxubGV0IGhhbmRsZV91bmNhdWdodCB+ZXhpdDptdXN0X2V4aXQgZiA9XG4gIGhhbmRsZV91bmNhdWdodF9hdXggZiB+ZXhpdDooaWYgbXVzdF9leGl0IHRoZW4gZXhpdCBlbHNlIGlnbm9yZSkgfmRvX2F0X2V4aXQ6bXVzdF9leGl0XG47O1xuXG5sZXQgcmVyYWlzZV91bmNhdWdodCBzdHIgZnVuYyA9XG4gIHRyeSBmdW5jICgpIHdpdGhcbiAgfCBleG4gLT5cbiAgICBsZXQgYnQgPSBDYW1sLlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgcmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UgKFJlcmFpc2VkIChzdHIsIGV4bikpIGJ0XG47O1xuXG5leHRlcm5hbCBjbGVhcl9iYWNrdHJhY2UgOiB1bml0IC0+IHVuaXQgPSBcIkJhc2VfY2xlYXJfY2FtbF9iYWNrdHJhY2VfcG9zXCIgW0BAbm9hbGxvY11cblxubGV0IHJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIGUgPVxuICAoKiBXZSBjbGVhciB0aGUgYmFja3RyYWNlIHRvIHJlZHVjZSBjb25mdXNpb24sIHNvIHRoYXQgcGVvcGxlIGRvbid0IHRoaW5rIHdoYXRldmVyXG4gICAgIGlzIHN0b3JlZCBjb3JyZXNwb25kcyB0byB0aGlzIHJhaXNlLiAqKVxuICBjbGVhcl9iYWNrdHJhY2UgKCk7XG4gIENhbWwucmFpc2Vfbm90cmFjZSBlXG47O1xuXG5sZXQgaW5pdGlhbGl6ZV9tb2R1bGUgKCkgPSBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgKClcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbGV0IGNsZWFyX2JhY2t0cmFjZSA9IGNsZWFyX2JhY2t0cmFjZVxuZW5kXG4iLCIoKiBiZWxvbmdzIGluIENvbW1vbiwgYnV0IG1vdmVkIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzICopXG5cbm9wZW4hIEltcG9ydFxuXG50eXBlICdhIHJldHVybiA9IHsgcmV0dXJuIDogJ2IuICdhIC0+ICdiIH0gW0BAdW5ib3hlZF1cblxubGV0IHdpdGhfcmV0dXJuICh0eXBlIGEpIGYgPVxuICBsZXQgbW9kdWxlIE0gPSBzdHJ1Y3RcbiAgICAoKiBSYWlzZWQgdG8gaW5kaWNhdGUgfnJldHVybiB3YXMgY2FsbGVkLiAgTG9jYWwgc28gdGhhdCB0aGUgZXhjZXB0aW9uIGlzIHRpZWQgdG8gYVxuICAgICAgIHBhcnRpY3VsYXIgY2FsbCBvZiBbd2l0aF9yZXR1cm5dLiAqKVxuICAgIGV4Y2VwdGlvbiBSZXR1cm4gb2YgYVxuICBlbmRcbiAgaW5cbiAgbGV0IGlzX2FsaXZlID0gcmVmIHRydWUgaW5cbiAgbGV0IHJldHVybiBhID1cbiAgICBpZiBub3QgIWlzX2FsaXZlXG4gICAgdGhlbiBmYWlsd2l0aCBcInVzZSBvZiBbcmV0dXJuXSBmcm9tIGEgW3dpdGhfcmV0dXJuXSB0aGF0IGFscmVhZHkgcmV0dXJuZWRcIjtcbiAgICBFeG4ucmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgKE0uUmV0dXJuIGEpXG4gIGluXG4gIHRyeVxuICAgIGxldCBhID0gZiB7IHJldHVybiB9IGluXG4gICAgaXNfYWxpdmUgOj0gZmFsc2U7XG4gICAgYVxuICB3aXRoXG4gIHwgZXhuIC0+XG4gICAgaXNfYWxpdmUgOj0gZmFsc2U7XG4gICAgKG1hdGNoIGV4biB3aXRoXG4gICAgIHwgTS5SZXR1cm4gYSAtPiBhXG4gICAgIHwgXyAtPiByYWlzZSBleG4pXG47O1xuXG5sZXQgd2l0aF9yZXR1cm5fb3B0aW9uIGYgPVxuICB3aXRoX3JldHVybiAoZnVuIHJldHVybiAtPlxuICAgIGYgeyByZXR1cm4gPSAoZnVuIGEgLT4gcmV0dXJuLnJldHVybiAoU29tZSBhKSkgfTtcbiAgICBOb25lKVxuOztcblxubGV0IHByZXBlbmQgeyByZXR1cm4gfSB+ZiA9IHsgcmV0dXJuID0gKGZ1biB4IC0+IHJldHVybiAoZiB4KSkgfVxuIiwib3BlbiEgSW1wb3J0XG5cbm1vZHVsZSB0eXBlIEJhc2ljID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBiaW5kIDogJ2EgdCAtPiBmOignYSAtPiAnYiB0KSAtPiAnYiB0XG4gIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG5cbiAgKCoqIFRoZSBmb2xsb3dpbmcgaWRlbnRpdGllcyBvdWdodCB0byBob2xkIChmb3Igc29tZSB2YWx1ZSBvZiA9KTpcblxuICAgICAgLSBbcmV0dXJuIHggPj49IGYgPSBmIHhdXG4gICAgICAtIFt0ID4+PSBmdW4geCAtPiByZXR1cm4geCA9IHRdXG4gICAgICAtIFsodCA+Pj0gZikgPj49IGcgPSB0ID4+PSBmdW4geCAtPiAoZiB4ID4+PSBnKV1cblxuICAgICAgTm90ZTogWz4+PV0gaXMgdGhlIGluZml4IG5vdGF0aW9uIGZvciBbYmluZF0pICopXG5cbiAgKCoqIFRoZSBbbWFwXSBhcmd1bWVudCB0byBbTW9uYWQuTWFrZV0gc2F5cyBob3cgdG8gaW1wbGVtZW50IHRoZSBtb25hZCdzIFttYXBdIGZ1bmN0aW9uLlxuICAgICAgW2BEZWZpbmVfdXNpbmdfYmluZF0gbWVhbnMgdG8gZGVmaW5lIFttYXAgdCB+ZiA9IGJpbmQgdCB+ZjooZnVuIGEgLT4gcmV0dXJuIChmIGEpKV0uXG4gICAgICBbYEN1c3RvbV0gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBwcmVzdW1hYmx5IHdpdGggc29tZXRoaW5nIG1vcmVcbiAgICAgIGVmZmljaWVudC5cblxuICAgICAgU29tZSBvdGhlciBmdW5jdGlvbnMgcmV0dXJuZWQgYnkgW01vbmFkLk1ha2VdIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIFttYXBdLCBzb1xuICAgICAgcGFzc2luZyBpbiBhIG1vcmUgZWZmaWNpZW50IFttYXBdIHdpbGwgaW1wcm92ZSB0aGVpciBlZmZpY2llbmN5IGFzIHdlbGwuICopXG4gIHZhbCBtYXAgOiBbIGBEZWZpbmVfdXNpbmdfYmluZCB8IGBDdXN0b20gb2YgJ2EgdCAtPiBmOignYSAtPiAnYikgLT4gJ2IgdCBdXG5lbmRcblxubW9kdWxlIHR5cGUgSW5maXggPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgKCoqIFt0ID4+PSBmXSByZXR1cm5zIGEgY29tcHV0YXRpb24gdGhhdCBzZXF1ZW5jZXMgdGhlIGNvbXB1dGF0aW9ucyByZXByZXNlbnRlZCBieSB0d29cbiAgICAgIG1vbmFkIGVsZW1lbnRzLiAgVGhlIHJlc3VsdGluZyBjb21wdXRhdGlvbiBmaXJzdCBkb2VzIFt0XSB0byB5aWVsZCBhIHZhbHVlIFt2XSwgYW5kXG4gICAgICB0aGVuIHJ1bnMgdGhlIGNvbXB1dGF0aW9uIHJldHVybmVkIGJ5IFtmIHZdLiAqKVxuICB2YWwgKCA+Pj0gKSA6ICdhIHQgLT4gKCdhIC0+ICdiIHQpIC0+ICdiIHRcblxuICAoKiogW3QgPj58IGZdIGlzIFt0ID4+PSAoZnVuIGEgLT4gcmV0dXJuIChmIGEpKV0uICopXG4gIHZhbCAoID4+fCApIDogJ2EgdCAtPiAoJ2EgLT4gJ2IpIC0+ICdiIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTeW50YXggPSBzaWdcbiAgKCoqIE9wZW5pbmcgYSBtb2R1bGUgb2YgdGhpcyB0eXBlIGFsbG93cyBvbmUgdG8gdXNlIHRoZSBbJWJpbmRdIGFuZCBbJW1hcF0gc3ludGF4XG4gICAgICBleHRlbnNpb25zIGRlZmluZWQgYnkgcHB4X2xldCwgYW5kIGJyaW5ncyBbcmV0dXJuXSBpbnRvIHNjb3BlLiAqKVxuXG4gIHR5cGUgJ2EgdFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgKCoqIFRoZXNlIGFyZSBjb252ZW5pZW50IHRvIGhhdmUgaW4gc2NvcGUgd2hlbiBwcm9ncmFtbWluZyB3aXRoIGEgbW9uYWQ6ICopXG5cbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICAgaW5jbHVkZSBJbmZpeCB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgICAgdmFsIHJldHVybiA6ICdhIC0+ICdhIHRcbiAgICAgIHZhbCBiaW5kIDogJ2EgdCAtPiBmOignYSAtPiAnYiB0KSAtPiAnYiB0XG4gICAgICB2YWwgbWFwIDogJ2EgdCAtPiBmOignYSAtPiAnYikgLT4gJ2IgdFxuICAgICAgdmFsIGJvdGggOiAnYSB0IC0+ICdiIHQgLT4gKCdhICogJ2IpIHRcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzIDogc2lnIGVuZFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX3dpdGhvdXRfc3ludGF4ID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIGluY2x1ZGUgSW5maXggd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBtb2R1bGUgTW9uYWRfaW5maXggOiBJbmZpeCB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5cbiAgKCoqIFtiaW5kIHQgfmZdID0gW3QgPj49IGZdICopXG4gIHZhbCBiaW5kIDogJ2EgdCAtPiBmOignYSAtPiAnYiB0KSAtPiAnYiB0XG5cbiAgKCoqIFtyZXR1cm4gdl0gcmV0dXJucyB0aGUgKHRyaXZpYWwpIGNvbXB1dGF0aW9uIHRoYXQgcmV0dXJucyB2LiAqKVxuICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICgqKiBbbWFwIHQgfmZdIGlzIHQgPj58IGYuICopXG4gIHZhbCBtYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAnYiB0XG5cbiAgKCoqIFtqb2luIHRdIGlzIFt0ID4+PSAoZnVuIHQnIC0+IHQnKV0uICopXG4gIHZhbCBqb2luIDogJ2EgdCB0IC0+ICdhIHRcblxuICAoKiogW2lnbm9yZV9tIHRdIGlzIFttYXAgdCB+ZjooZnVuIF8gLT4gKCkpXS4gIFtpZ25vcmVfbV0gdXNlZCB0byBiZSBjYWxsZWQgW2lnbm9yZV0sXG4gICAgICBidXQgd2UgZGVjaWRlZCB0aGF0IHdhcyBhIGJhZCBuYW1lLCBiZWNhdXNlIGl0IHNoYWRvd2VkIHRoZSB3aWRlbHkgdXNlZFxuICAgICAgW0NhbWwuaWdub3JlXS4gIFNvbWUgbW9uYWRzIHN0aWxsIGRvIFtsZXQgaWdub3JlID0gaWdub3JlX21dIGZvciBoaXN0b3JpY2FsXG4gICAgICByZWFzb25zLiAqKVxuICB2YWwgaWdub3JlX20gOiAnYSB0IC0+IHVuaXQgdFxuXG4gIHZhbCBhbGwgOiAnYSB0IGxpc3QgLT4gJ2EgbGlzdCB0XG5cbiAgKCoqIExpa2UgW2FsbF0sIGJ1dCBlbnN1cmVzIHRoYXQgZXZlcnkgbW9uYWRpYyB2YWx1ZSBpbiB0aGUgbGlzdCBwcm9kdWNlcyBhIHVuaXQgdmFsdWUsXG4gICAgICBhbGwgb2Ygd2hpY2ggYXJlIGRpc2NhcmRlZCByYXRoZXIgdGhhbiBiZWluZyBjb2xsZWN0ZWQgaW50byBhIGxpc3QuICopXG4gIHZhbCBhbGxfdW5pdCA6IHVuaXQgdCBsaXN0IC0+IHVuaXQgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgaW5jbHVkZSBTX3dpdGhvdXRfc3ludGF4IHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgaW5jbHVkZSBTeW50YXggd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEJhc2ljMiA9IHNpZ1xuICAoKiogTXVsdGkgcGFyYW1ldGVyIG1vbmFkLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBnZXRzIHVuaWZpZWQgYWNyb3NzIGFsbCB0aGUgY29tcHV0YXRpb24uXG4gICAgICBUaGlzIGlzIHVzZWQgdG8gZW5jb2RlIG1vbmFkcyB3b3JraW5nIG9uIGEgbXVsdGkgcGFyYW1ldGVyIGRhdGEgc3RydWN0dXJlIGxpa2VcbiAgICAgIChbKCdhLCdiKSByZXN1bHRdKS4gKilcblxuICB0eXBlICgnYSwgJ2UpIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZSkgdCkgLT4gKCdiLCAnZSkgdFxuICB2YWwgbWFwIDogWyBgRGVmaW5lX3VzaW5nX2JpbmQgfCBgQ3VzdG9tIG9mICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2UpIHQgXVxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgSW5maXgyID0gc2lnXG4gICgqKiBTYW1lIGFzIHshSW5maXh9LCBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHR3byBhcmd1bWVudHMuIFRoZSBzZWNvbmQgaXMgYWx3YXlzIGp1c3RcbiAgICAgIHBhc3NlZCB0aHJvdWdoLiAqKVxuXG4gIHR5cGUgKCdhLCAnZSkgdFxuXG4gIHZhbCAoID4+PSApIDogKCdhLCAnZSkgdCAtPiAoJ2EgLT4gKCdiLCAnZSkgdCkgLT4gKCdiLCAnZSkgdFxuICB2YWwgKCA+PnwgKSA6ICgnYSwgJ2UpIHQgLT4gKCdhIC0+ICdiKSAtPiAoJ2IsICdlKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU3ludGF4MiA9IHNpZ1xuICB0eXBlICgnYSwgJ2UpIHRcblxuICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8pIHRcblxuICAgIGluY2x1ZGUgSW5maXgyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIHRcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfKSB0XG4gICAgICB2YWwgYmluZCA6ICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZSkgdCkgLT4gKCdiLCAnZSkgdFxuICAgICAgdmFsIG1hcCA6ICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2UpIHRcbiAgICAgIHZhbCBib3RoIDogKCdhLCAnZSkgdCAtPiAoJ2IsICdlKSB0IC0+ICgnYSAqICdiLCAnZSkgdFxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgOiBzaWcgZW5kXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICgqKiBUaGUgc2FtZSBhcyB7IVN9IGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdHdvIGFyZ3VtZW50cy4gVGhlIHNlY29uZCBpcyBhbHdheXMganVzdFxuICAgICAgcGFzc2VkIHRocm91Z2guICopXG5cbiAgdHlwZSAoJ2EsICdlKSB0XG5cbiAgaW5jbHVkZSBJbmZpeDIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgdFxuICBpbmNsdWRlIFN5bnRheDIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgdFxuICBtb2R1bGUgTW9uYWRfaW5maXggOiBJbmZpeDIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdlKSB0KSAtPiAoJ2IsICdlKSB0XG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8pIHRcbiAgdmFsIG1hcCA6ICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2UpIHRcbiAgdmFsIGpvaW4gOiAoKCdhLCAnZSkgdCwgJ2UpIHQgLT4gKCdhLCAnZSkgdFxuICB2YWwgaWdub3JlX20gOiAoXywgJ2UpIHQgLT4gKHVuaXQsICdlKSB0XG4gIHZhbCBhbGwgOiAoJ2EsICdlKSB0IGxpc3QgLT4gKCdhIGxpc3QsICdlKSB0XG4gIHZhbCBhbGxfdW5pdCA6ICh1bml0LCAnZSkgdCBsaXN0IC0+ICh1bml0LCAnZSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEJhc2ljMyA9IHNpZ1xuICAoKiogTXVsdGkgcGFyYW1ldGVyIG1vbmFkLiBUaGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGdldCB1bmlmaWVkIGFjcm9zcyBhbGwgdGhlXG4gICAgICBjb21wdXRhdGlvbi4gKilcblxuICB0eXBlICgnYSwgJ2QsICdlKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdkLCAnZSkgdCkgLT4gKCdiLCAnZCwgJ2UpIHRcblxuICB2YWwgbWFwXG4gICAgOiBbIGBEZWZpbmVfdXNpbmdfYmluZCB8IGBDdXN0b20gb2YgKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2QsICdlKSB0IF1cblxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfLCBfKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgSW5maXgzID0gc2lnXG4gICgqKiBTYW1lIGFzIEluZml4LCBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHRocmVlIGFyZ3VtZW50cy4gVGhlIHNlY29uZCBhbmQgdGhpcmQgYXJlXG4gICAgICBhbHdheXMganVzdCBwYXNzZWQgdGhyb3VnaC4gKilcblxuICB0eXBlICgnYSwgJ2QsICdlKSB0XG5cbiAgdmFsICggPj49ICkgOiAoJ2EsICdkLCAnZSkgdCAtPiAoJ2EgLT4gKCdiLCAnZCwgJ2UpIHQpIC0+ICgnYiwgJ2QsICdlKSB0XG4gIHZhbCAoID4+fCApIDogKCdhLCAnZCwgJ2UpIHQgLT4gKCdhIC0+ICdiKSAtPiAoJ2IsICdkLCAnZSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFN5bnRheDMgPSBzaWdcbiAgdHlwZSAoJ2EsICdkLCAnZSkgdFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXywgXykgdFxuXG4gICAgaW5jbHVkZSBJbmZpeDMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSB0XG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXywgXykgdFxuICAgICAgdmFsIGJpbmQgOiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdkLCAnZSkgdCkgLT4gKCdiLCAnZCwgJ2UpIHRcbiAgICAgIHZhbCBtYXAgOiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnZCwgJ2UpIHRcbiAgICAgIHZhbCBib3RoIDogKCdhLCAnZCwgJ2UpIHQgLT4gKCdiLCAnZCwgJ2UpIHQgLT4gKCdhICogJ2IsICdkLCAnZSkgdFxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgOiBzaWcgZW5kXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICgqKiBUaGUgc2FtZSBhcyB7IVN9IGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdGhyZWUgYXJndW1lbnRzLiBUaGUgc2Vjb25kXG4gICAgICBhbmQgdGhpcmQgYXJlIGFsd2F5cyBqdXN0IHBhc3NlZCB0aHJvdWdoLiAqKVxuXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHRcblxuICBpbmNsdWRlIEluZml4MyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIHRcbiAgaW5jbHVkZSBTeW50YXgzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgdFxuICBtb2R1bGUgTW9uYWRfaW5maXggOiBJbmZpeDMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdkLCAnZSkgdCAtPiBmOignYSAtPiAoJ2IsICdkLCAnZSkgdCkgLT4gKCdiLCAnZCwgJ2UpIHRcbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXywgXykgdFxuICB2YWwgbWFwIDogKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2QsICdlKSB0XG4gIHZhbCBqb2luIDogKCgnYSwgJ2QsICdlKSB0LCAnZCwgJ2UpIHQgLT4gKCdhLCAnZCwgJ2UpIHRcbiAgdmFsIGlnbm9yZV9tIDogKF8sICdkLCAnZSkgdCAtPiAodW5pdCwgJ2QsICdlKSB0XG4gIHZhbCBhbGwgOiAoJ2EsICdkLCAnZSkgdCBsaXN0IC0+ICgnYSBsaXN0LCAnZCwgJ2UpIHRcbiAgdmFsIGFsbF91bml0IDogKHVuaXQsICdkLCAnZSkgdCBsaXN0IC0+ICh1bml0LCAnZCwgJ2UpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBCYXNpY19pbmRleGVkID0gc2lnXG4gICgqKiBJbmRleGVkIG1vbmFkLCBpbiB0aGUgc3R5bGUgb2YgQXRrZXkuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIHBhcmFtZXRlcnMgYXJlIGNvbXBvc2VkXG4gICAgICBhY3Jvc3MgYWxsIGNvbXB1dGF0aW9uLiBUbyBzZWUgdGhpcyBtb3JlIGNsZWFybHksIHlvdSBjYW4gbG9vayBhdCB0aGUgdHlwZSBvZiBiaW5kOlxuXG4gICAgICB7W1xuICAgICAgICB2YWwgYmluZCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrKSB0KSAtPiAoJ2IsICdpLCAnaykgdFxuICAgICAgXX1cblxuICAgICAgYW5kIGlzb2xhdGUgc29tZSBvZiB0aGUgdHlwZSB2YXJpYWJsZXMgdG8gc2VlIHRoZWlyIGluZGl2aWR1YWwgYmVoYXZpb3JzOlxuXG4gICAgICB7W1xuICAgICAgICB2YWwgYmluZCA6ICdhICAgICAgICAgICAgIC0+IGY6KCdhIC0+ICAnYiAgICAgICAgICAgKSAtPiAgJ2JcbiAgICAgICAgdmFsIGJpbmQgOiAgICAgICdpLCAnaiAgICAtPiAgICAgICAgICAgICAgICdqLCAnayAgICAgLT4gICAgICdpLCAna1xuICAgICAgXX1cblxuICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQXRrZXktc3R5bGUgaW5kZXhlZCBtb25hZHMsIHNlZTpcblxuICAgICAge3ZcbiAgICAgICAgUGFyYW1ldGVyaXNlZCBOb3Rpb25zIG9mIENvbXB1dGF0aW9uXG4gICAgICAgIFJvYmVydCBBdGtleVxuICAgICAgICBodHRwOi8vYmVudG5pYi5vcmcvcGFyYW1ub3Rpb25zLWpmcC5wZGZcbiAgICAgIHZ9ICopXG5cbiAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2spIHQpIC0+ICgnYiwgJ2ksICdrKSB0XG5cbiAgdmFsIG1hcFxuICAgIDogWyBgRGVmaW5lX3VzaW5nX2JpbmQgfCBgQ3VzdG9tIG9mICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaikgdCBdXG5cbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgSW5maXhfaW5kZXhlZCA9IHNpZ1xuICAoKiogU2FtZSBhcyB7IUluZml4fSwgZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0aHJlZSBhcmd1bWVudHMuIFRoZSBzZWNvbmQgYW5kXG4gICAgICB0aGlyZCBhcmUgY29tcG9zZWQgYWNyb3NzIGFsbCBjb21wdXRhdGlvbi4gKilcblxuICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgdmFsICggPj49ICkgOiAoJ2EsICdpLCAnaikgdCAtPiAoJ2EgLT4gKCdiLCAnaiwgJ2spIHQpIC0+ICgnYiwgJ2ksICdrKSB0XG4gIHZhbCAoID4+fCApIDogKCdhLCAnaSwgJ2opIHQgLT4gKCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFN5bnRheF9pbmRleGVkID0gc2lnXG4gIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSkgdFxuXG4gICAgaW5jbHVkZSBJbmZpeF9pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgdFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSkgdFxuICAgICAgdmFsIGJpbmQgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAoJ2IsICdqLCAnaykgdCkgLT4gKCdiLCAnaSwgJ2spIHRcbiAgICAgIHZhbCBtYXAgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2opIHRcbiAgICAgIHZhbCBib3RoIDogKCdhLCAnaSwgJ2opIHQgLT4gKCdiLCAnaiwgJ2spIHQgLT4gKCdhICogJ2IsICdpLCAnaykgdFxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgOiBzaWcgZW5kXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfaW5kZXhlZCA9IHNpZ1xuICAoKiogVGhlIHNhbWUgYXMgeyFTfSBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHRocmVlIGFyZ3VtZW50cy4gVGhlIHNlY29uZCBhbmRcbiAgICAgIHRoaXJkIGFyZSBjb21wb3NlZCBhY3Jvc3MgYWxsIGNvbXB1dGF0aW9uLiAqKVxuXG4gIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICBpbmNsdWRlIEluZml4X2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSB0XG4gIGluY2x1ZGUgU3ludGF4X2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSB0XG4gIG1vZHVsZSBNb25hZF9pbmZpeCA6IEluZml4X2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAoJ2IsICdqLCAnaykgdCkgLT4gKCdiLCAnaSwgJ2spIHRcbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpKSB0XG4gIHZhbCBtYXAgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2opIHRcbiAgdmFsIGpvaW4gOiAoKCdhLCAnaiwgJ2spIHQsICdpLCAnaikgdCAtPiAoJ2EsICdpLCAnaykgdFxuICB2YWwgaWdub3JlX20gOiAoXywgJ2ksICdqKSB0IC0+ICh1bml0LCAnaSwgJ2opIHRcbiAgdmFsIGFsbCA6ICgnYSwgJ2ksICdpKSB0IGxpc3QgLT4gKCdhIGxpc3QsICdpLCAnaSkgdFxuICB2YWwgYWxsX3VuaXQgOiAodW5pdCwgJ2ksICdpKSB0IGxpc3QgLT4gKHVuaXQsICdpLCAnaSkgdFxuZW5kXG5cbm1vZHVsZSBTX3RvX1MyIChYIDogUykgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnRcbmVuZFxuXG5tb2R1bGUgUzJfdG9fUzMgKFggOiBTMikgOiBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudFxuZW5kXG5cbm1vZHVsZSBTX3RvX1NfaW5kZXhlZCAoWCA6IFMpIDogU19pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA9ICdhIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2ksICdqKSB0ID0gJ2EgWC50XG5lbmRcblxubW9kdWxlIFMyX3RvX1MgKFggOiBTMikgOiBTIHdpdGggdHlwZSAnYSB0ID0gKCdhLCB1bml0KSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAnYSB0ID0gKCdhLCB1bml0KSBYLnRcbmVuZFxuXG5tb2R1bGUgUzNfdG9fUzIgKFggOiBTMykgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UsIHVuaXQpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlLCB1bml0KSBYLnRcbmVuZFxuXG5tb2R1bGUgU19pbmRleGVkX3RvX1MyIChYIDogU19pbmRleGVkKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSwgJ2UpIFgudCA9XG5zdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSwgJ2UpIFgudFxuZW5kXG5cbm1vZHVsZSB0eXBlIE1vbmFkID0gc2lnXG4gICgqKiBBIG1vbmFkIGlzIGFuIGFic3RyYWN0aW9uIG9mIHRoZSBjb25jZXB0IG9mIHNlcXVlbmNpbmcgb2YgY29tcHV0YXRpb25zLiAgQSB2YWx1ZSBvZlxuICAgICAgdHlwZSBbJ2EgbW9uYWRdIHJlcHJlc2VudHMgYSBjb21wdXRhdGlvbiB0aGF0IHJldHVybnMgYSB2YWx1ZSBvZiB0eXBlIFsnYV0uICopXG5cbiAgbW9kdWxlIHR5cGUgQmFzaWMgPSBCYXNpY1xuICBtb2R1bGUgdHlwZSBCYXNpYzIgPSBCYXNpYzJcbiAgbW9kdWxlIHR5cGUgQmFzaWMzID0gQmFzaWMzXG4gIG1vZHVsZSB0eXBlIEJhc2ljX2luZGV4ZWQgPSBCYXNpY19pbmRleGVkXG4gIG1vZHVsZSB0eXBlIEluZml4ID0gSW5maXhcbiAgbW9kdWxlIHR5cGUgSW5maXgyID0gSW5maXgyXG4gIG1vZHVsZSB0eXBlIEluZml4MyA9IEluZml4M1xuICBtb2R1bGUgdHlwZSBJbmZpeF9pbmRleGVkID0gSW5maXhfaW5kZXhlZFxuICBtb2R1bGUgdHlwZSBTeW50YXggPSBTeW50YXhcbiAgbW9kdWxlIHR5cGUgU3ludGF4MiA9IFN5bnRheDJcbiAgbW9kdWxlIHR5cGUgU3ludGF4MyA9IFN5bnRheDNcbiAgbW9kdWxlIHR5cGUgU3ludGF4X2luZGV4ZWQgPSBTeW50YXhfaW5kZXhlZFxuICBtb2R1bGUgdHlwZSBTX3dpdGhvdXRfc3ludGF4ID0gU193aXRob3V0X3N5bnRheFxuICBtb2R1bGUgdHlwZSBTID0gU1xuICBtb2R1bGUgdHlwZSBTMiA9IFMyXG4gIG1vZHVsZSB0eXBlIFMzID0gUzNcbiAgbW9kdWxlIHR5cGUgU19pbmRleGVkID0gU19pbmRleGVkXG5cbiAgbW9kdWxlIE1ha2UgKFggOiBCYXNpYykgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIFgudFxuICBtb2R1bGUgTWFrZTIgKFggOiBCYXNpYzIpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgWC50XG4gIG1vZHVsZSBNYWtlMyAoWCA6IEJhc2ljMykgOiBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIFgudFxuXG4gIG1vZHVsZSBNYWtlX2luZGV4ZWQgKFggOiBCYXNpY19pbmRleGVkKSA6XG4gICAgU19pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgWC50XG5cbiAgKCoqIERlZmluZSBhIG1vbmFkIHRocm91Z2ggYW4gaXNvbW9ycGhpc20gd2l0aCBhbiBleGlzdGluZyBtb25hZC4gRm9yIGV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgJ2EgdCA9IHsgdmFsdWUgOiAnYSB9XG5cbiAgICAgICAgaW5jbHVkZSBNb25hZC5PZl9tb25hZCAoTW9uYWQuSWRlbnQpIChzdHJ1Y3RcbiAgICAgICAgICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICAgICAgICAgIGxldCB0b19tb25hZCB7IHZhbHVlIH0gPSB2YWx1ZVxuICAgICAgICAgICAgbGV0IG9mX21vbmFkIHZhbHVlID0geyB2YWx1ZSB9XG4gICAgICAgICAgZW5kKVxuICAgICAgXX0gKilcbiAgbW9kdWxlIE9mX21vbmFkXG4gICAgICAoTW9uYWQgOiBTKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgdHlwZSAnYSB0XG5cbiAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICdhIHQgLT4gJ2EgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogJ2EgTW9uYWQudCAtPiAnYSB0XG4gICAgICAgICAgICAgICAgICAgZW5kKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgTS50XG5cbiAgbW9kdWxlIE9mX21vbmFkMlxuICAgICAgKE1vbmFkIDogUzIpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdiKSBNb25hZC50IC0+ICgnYSwgJ2IpIHRcbiAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIE0udFxuXG4gIG1vZHVsZSBPZl9tb25hZDNcbiAgICAgIChNb25hZCA6IFMzKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnYiwgJ2MpIE1vbmFkLnQgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgTS50XG5cbiAgbW9kdWxlIE9mX21vbmFkX2luZGV4ZWRcbiAgICAgIChNb25hZCA6IFNfaW5kZXhlZCkgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2ksICdqKSB0IC0+ICgnYSwgJ2ksICdqKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2ksICdqKSBNb25hZC50IC0+ICgnYSwgJ2ksICdqKSB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpIDogU19pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgTS50XG5cbiAgbW9kdWxlIElkZW50IDogUyB3aXRoIHR5cGUgJ2EgdCA9ICdhXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIExpc3QgPSBMaXN0MFxuaW5jbHVkZSBNb25hZF9pbnRmXG5cbm1vZHVsZSB0eXBlIEJhc2ljX2dlbmVyYWwgPSBzaWdcbiAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG5cbiAgdmFsIGJpbmRcbiAgICA6ICAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG4gICAgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2ssICdkLCAnZSkgdClcbiAgICAtPiAoJ2IsICdpLCAnaywgJ2QsICdlKSB0XG5cbiAgdmFsIG1hcFxuICAgIDogWyBgRGVmaW5lX3VzaW5nX2JpbmRcbiAgICAgIHwgYEN1c3RvbSBvZiAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdpLCAnaiwgJ2QsICdlKSB0XG4gICAgICBdXG5cbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgJ2ksICdpLCAnZCwgJ2UpIHRcbmVuZFxuXG5tb2R1bGUgTWFrZV9nZW5lcmFsIChNIDogQmFzaWNfZ2VuZXJhbCkgPSBzdHJ1Y3RcbiAgbGV0IGJpbmQgPSBNLmJpbmRcbiAgbGV0IHJldHVybiA9IE0ucmV0dXJuXG4gIGxldCBtYXBfdmlhX2JpbmQgbWEgfmYgPSBNLmJpbmQgbWEgfmY6KGZ1biBhIC0+IE0ucmV0dXJuIChmIGEpKVxuXG4gIGxldCBtYXAgPVxuICAgIG1hdGNoIE0ubWFwIHdpdGhcbiAgICB8IGBEZWZpbmVfdXNpbmdfYmluZCAtPiBtYXBfdmlhX2JpbmRcbiAgICB8IGBDdXN0b20geCAtPiB4XG4gIDs7XG5cbiAgbW9kdWxlIE1vbmFkX2luZml4ID0gc3RydWN0XG4gICAgbGV0ICggPj49ICkgdCBmID0gYmluZCB0IH5mXG4gICAgbGV0ICggPj58ICkgdCBmID0gbWFwIHQgfmZcbiAgZW5kXG5cbiAgaW5jbHVkZSBNb25hZF9pbmZpeFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuXG4gICAgaW5jbHVkZSBNb25hZF9pbmZpeFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgIGxldCBiaW5kID0gYmluZFxuICAgICAgbGV0IG1hcCA9IG1hcFxuICAgICAgbGV0IGJvdGggYSBiID0gYSA+Pj0gZnVuIGEgLT4gYiA+PnwgZnVuIGIgLT4gYSwgYlxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgPSBzdHJ1Y3QgZW5kXG4gICAgZW5kXG4gIGVuZFxuXG4gIGxldCBqb2luIHQgPSB0ID4+PSBmdW4gdCcgLT4gdCdcbiAgbGV0IGlnbm9yZV9tIHQgPSBtYXAgdCB+ZjooZnVuIF8gLT4gKCkpXG5cbiAgbGV0IGFsbCA9XG4gICAgbGV0IHJlYyBsb29wIHZzID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gcmV0dXJuIChMaXN0LnJldiB2cylcbiAgICAgIHwgdCA6OiB0cyAtPiB0ID4+PSBmdW4gdiAtPiBsb29wICh2IDo6IHZzKSB0c1xuICAgIGluXG4gICAgZnVuIHRzIC0+IGxvb3AgW10gdHNcbiAgOztcblxuICBsZXQgcmVjIGFsbF91bml0ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHJldHVybiAoKVxuICAgIHwgdCA6OiB0cyAtPiB0ID4+PSBmdW4gKCkgLT4gYWxsX3VuaXQgdHNcbiAgOztcbmVuZFxuXG5tb2R1bGUgTWFrZV9pbmRleGVkIChNIDogQmFzaWNfaW5kZXhlZCkgOlxuICBTX2luZGV4ZWQgd2l0aCB0eXBlICgnYSwgJ2ksICdqKSB0IDo9ICgnYSwgJ2ksICdqKSBNLnQgPSBNYWtlX2dlbmVyYWwgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnaSwgJ2opIE0udFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlMyAoTSA6IEJhc2ljMykgOiBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIE0udCA9XG4gIE1ha2VfZ2VuZXJhbCAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkLCAnZSkgTS50XG4gIGVuZClcblxubW9kdWxlIE1ha2UyIChNIDogQmFzaWMyKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdkKSB0IDo9ICgnYSwgJ2QpIE0udCA9IE1ha2VfZ2VuZXJhbCAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBNLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZSAoTSA6IEJhc2ljKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgTS50ID0gTWFrZV9nZW5lcmFsIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICdhIE0udFxuICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZF9nZW5lcmFsIChNb25hZCA6IHNpZ1xuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuXG4gICAgdmFsIGJpbmRcbiAgICAgIDogICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcbiAgICAgIC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrLCAnZCwgJ2UpIHQpXG4gICAgICAtPiAoJ2IsICdpLCAnaywgJ2QsICdlKSB0XG5cbiAgICB2YWwgbWFwIDogKCdhLCAnaSwgJ2osICdkLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2osICdkLCAnZSkgdFxuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSwgJ2QsICdlKSB0XG4gIGVuZCkgKE0gOiBzaWdcbiAgICAgICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcblxuICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgLT4gKCdhLCAnaSwgJ2osICdkLCAnZSkgTW9uYWQudFxuICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIE1vbmFkLnQgLT4gKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuICAgICAgICBlbmQpID1cbiAgTWFrZV9nZW5lcmFsIChzdHJ1Y3RcbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdpLCAnaiwgJ2QsICdlKSBNLnRcblxuICAgIGxldCByZXR1cm4gYSA9IE0ub2ZfbW9uYWQgKE1vbmFkLnJldHVybiBhKVxuICAgIGxldCBiaW5kIHQgfmYgPSBNLm9mX21vbmFkIChNb25hZC5iaW5kIChNLnRvX21vbmFkIHQpIH5mOihmdW4gYSAtPiBNLnRvX21vbmFkIChmIGEpKSlcbiAgICBsZXQgbWFwID0gYEN1c3RvbSAoZnVuIHQgfmYgLT4gTS5vZl9tb25hZCAoTW9uYWQubWFwIChNLnRvX21vbmFkIHQpIH5mKSlcbiAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWRfaW5kZXhlZFxuICAgIChNb25hZCA6IFNfaW5kZXhlZCkgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnaSwgJ2opIHQgLT4gKCdhLCAnaSwgJ2opIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2ksICdqKSBNb25hZC50IC0+ICgnYSwgJ2ksICdqKSB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgZW5kKSA9XG4gIE9mX21vbmFkX2dlbmVyYWxcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1vbmFkXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2ksICdqKSBNb25hZC50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTVxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdpLCAnaikgTS50XG4gICAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWQzXG4gICAgKE1vbmFkIDogUzMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdiLCAnYykgTW9uYWQudCAtPiAoJ2EsICdiLCAnYykgdFxuICAgICAgICAgICAgICAgICAgZW5kKSA9XG4gIE9mX21vbmFkX2dlbmVyYWxcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1vbmFkXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2QsICdlKSBNb25hZC50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTVxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkLCAnZSkgTS50XG4gICAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWQyXG4gICAgKE1vbmFkIDogUzIpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdiKSBNb25hZC50IC0+ICgnYSwgJ2IpIHRcbiAgICAgICAgICAgICAgICAgIGVuZCkgPVxuICBPZl9tb25hZF9nZW5lcmFsXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNb25hZFxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBNb25hZC50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTVxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBNLnRcbiAgICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZFxuICAgIChNb25hZCA6IFMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgdHlwZSAnYSB0XG5cbiAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAnYSB0IC0+ICdhIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAnYSBNb25hZC50IC0+ICdhIHRcbiAgICAgICAgICAgICAgICAgZW5kKSA9XG4gIE9mX21vbmFkX2dlbmVyYWxcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1vbmFkXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICdhIE1vbmFkLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNXG5cbiAgICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICdhIE0udFxuICAgIGVuZClcblxubW9kdWxlIElkZW50ID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhXG5cbiAgaW5jbHVkZSBNYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICAgIGxldCBiaW5kIGEgfmYgPSBmIGFcbiAgICAgIGxldCByZXR1cm4gYSA9IGFcbiAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIChmdW4gYSB+ZiAtPiBmIGEpXG4gICAgZW5kKVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQXBwbGljYXRpdmVfaW50ZlxubW9kdWxlIExpc3QgPSBMaXN0MFxuXG4oKiogVGhpcyBtb2R1bGUgc2VydmVzIG1vc3RseSBhcyBhIHBhcnRpYWwgY2hlY2sgdGhhdCBbUzJdIGFuZCBbU10gYXJlIGluIHN5bmMsIGJ1dFxuICAgIGFjdHVhbGx5IGNhbGxpbmcgaXQgaXMgb2NjYXNpb25hbGx5IHVzZWZ1bC4gKilcbm1vZHVsZSBTX3RvX1MyIChYIDogUykgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnRcbmVuZFxuXG5tb2R1bGUgUzJfdG9fUyAoWCA6IFMyKSA6IFMgd2l0aCB0eXBlICdhIHQgPSAoJ2EsIHVuaXQpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICdhIHQgPSAoJ2EsIHVuaXQpIFgudFxuZW5kXG5cbm1vZHVsZSBTMl90b19TMyAoWCA6IFMyKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50XG5lbmRcblxubW9kdWxlIFMzX3RvX1MyIChYIDogUzMpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2QpIHQgPSAoJ2EsICdkLCB1bml0KSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdkKSB0ID0gKCdhLCAnZCwgdW5pdCkgWC50XG5lbmRcblxubW9kdWxlIE1ha2UzIChYIDogQmFzaWMzKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIGxldCAoIDwqPiApID0gYXBwbHlcbiAgbGV0IGRlcml2ZWRfbWFwIHQgfmYgPSByZXR1cm4gZiA8Kj4gdFxuXG4gIGxldCBtYXAgPVxuICAgIG1hdGNoIFgubWFwIHdpdGhcbiAgICB8IGBEZWZpbmVfdXNpbmdfYXBwbHkgLT4gZGVyaXZlZF9tYXBcbiAgICB8IGBDdXN0b20geCAtPiB4XG4gIDs7XG5cbiAgbGV0ICggPj58ICkgdCBmID0gbWFwIHQgfmZcbiAgbGV0IG1hcDIgdGEgdGIgfmYgPSBtYXAgfmYgdGEgPCo+IHRiXG4gIGxldCBtYXAzIHRhIHRiIHRjIH5mID0gbWFwIH5mIHRhIDwqPiB0YiA8Kj4gdGNcbiAgbGV0IGFsbCB0cyA9IExpc3QuZm9sZF9yaWdodCB0cyB+aW5pdDoocmV0dXJuIFtdKSB+ZjoobWFwMiB+ZjooZnVuIHggeHMgLT4geCA6OiB4cykpXG4gIGxldCBib3RoIHRhIHRiID0gbWFwMiB0YSB0YiB+ZjooZnVuIGEgYiAtPiBhLCBiKVxuICBsZXQgKCAqPiApIHUgdiA9IHJldHVybiAoZnVuICgpIHkgLT4geSkgPCo+IHUgPCo+IHZcbiAgbGV0ICggPCogKSB1IHYgPSByZXR1cm4gKGZ1biB4ICgpIC0+IHgpIDwqPiB1IDwqPiB2XG4gIGxldCBhbGxfdW5pdCB0cyA9IExpc3QuZm9sZCB0cyB+aW5pdDoocmV0dXJuICgpKSB+ZjooICo+IClcblxuICBtb2R1bGUgQXBwbGljYXRpdmVfaW5maXggPSBzdHJ1Y3RcbiAgICBsZXQgKCA8Kj4gKSA9ICggPCo+IClcbiAgICBsZXQgKCAqPiApID0gKCAqPiApXG4gICAgbGV0ICggPCogKSA9ICggPCogKVxuICAgIGxldCAoID4+fCApID0gKCA+PnwgKVxuICBlbmRcbmVuZFxuXG5tb2R1bGUgTWFrZTIgKFggOiBCYXNpYzIpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgWC50ID0gTWFrZTMgKHN0cnVjdFxuICAgIGluY2x1ZGUgWFxuXG4gICAgdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlIChYIDogQmFzaWMpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBYLnQgPSBNYWtlMiAoc3RydWN0XG4gICAgaW5jbHVkZSBYXG5cbiAgICB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZV9sZXRfc3ludGF4M1xuICAgIChYIDogRm9yX2xldF9zeW50YXgzKSAoSW50ZiA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgdHlwZSBTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpXG4gICAgKEltcGwgOiBJbnRmLlMpID1cbnN0cnVjdFxuICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgIGluY2x1ZGUgWFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgWFxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzID0gSW1wbFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgTWFrZV9sZXRfc3ludGF4MlxuICAgIChYIDogRm9yX2xldF9zeW50YXgyKSAoSW50ZiA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgdHlwZSBTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpXG4gICAgKEltcGwgOiBJbnRmLlMpID1cbiAgTWFrZV9sZXRfc3ludGF4M1xuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgWFxuXG4gICAgICB0eXBlICgnYSwgJ2QsIF8pIHQgPSAoJ2EsICdkKSBYLnRcbiAgICBlbmQpXG4gICAgKEludGYpXG4gICAgKEltcGwpXG5cbm1vZHVsZSBNYWtlX2xldF9zeW50YXhcbiAgICAoWCA6IEZvcl9sZXRfc3ludGF4KSAoSW50ZiA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSB0eXBlIFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKVxuICAgIChJbXBsIDogSW50Zi5TKSA9XG4gIE1ha2VfbGV0X3N5bnRheDJcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIFhcblxuICAgICAgdHlwZSAoJ2EsIF8pIHQgPSAnYSBYLnRcbiAgICBlbmQpXG4gICAgKEludGYpXG4gICAgKEltcGwpXG5cbigqKiBUaGlzIGZ1bmN0b3IgY2xvc2VseSByZXNlbWJsZXMgW01ha2UzXSwgYW5kIGluZGVlZCBpdCBjb3VsZCBiZSBpbXBsZW1lbnRlZFxuICAgIG11Y2ggc2hvcnRlciBpbiB0ZXJtcyBvZiBbTWFrZTNdLiBIb3dldmVyLCB3ZSBpbXBsZW1lbnQgaXQgYnkgaGFuZCBzbyB0aGF0XG4gICAgdGhlIHJlc3VsdGluZyBmdW5jdGlvbnMgYXJlIG1vcmUgZWZmaWNpZW50LCBlLmcuIHVzaW5nIFttYXAyXSBkaXJlY3RseSBpbnN0ZWFkIG9mXG4gICAgZGVmaW5pbmcgW2FwcGx5XSBpbiB0ZXJtcyBvZiBpdCBhbmQgdGhlbiBbbWFwMl0gaW4gdGVybXMgb2YgdGhhdC4gRm9yIG1vc3RcbiAgICBhcHBsaWNhdGl2ZXMgdGhpcyBkb2VzIG5vdCBtYXR0ZXIsIGJ1dCBmb3Igc29tZSAoc3VjaCBhcyBCb25zYWkuVmFsdWUudCksIGl0IGhhcyBhXG4gICAgbGFyZ2VyIGltcGFjdC4gKilcbm1vZHVsZSBNYWtlM191c2luZ19tYXAyIChYIDogQmFzaWMzX3VzaW5nX21hcDIpIDpcbiAgUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgbGV0IGFwcGx5IHRmIHRhID0gbWFwMiB0ZiB0YSB+ZjooZnVuIGYgYSAtPiBmIGEpXG4gIGxldCAoIDwqPiApID0gYXBwbHlcbiAgbGV0IGRlcml2ZWRfbWFwIHQgfmYgPSByZXR1cm4gZiA8Kj4gdFxuXG4gIGxldCBtYXAgPVxuICAgIG1hdGNoIFgubWFwIHdpdGhcbiAgICB8IGBEZWZpbmVfdXNpbmdfbWFwMiAtPiBkZXJpdmVkX21hcFxuICAgIHwgYEN1c3RvbSB4IC0+IHhcbiAgOztcblxuICBsZXQgKCA+PnwgKSB0IGYgPSBtYXAgdCB+ZlxuICBsZXQgYm90aCB0YSB0YiA9IG1hcDIgdGEgdGIgfmY6KGZ1biBhIGIgLT4gYSwgYilcbiAgbGV0IG1hcDMgdGEgdGIgdGMgfmYgPSBtYXAyIChtYXAyIHRhIHRiIH5mKSB0YyB+ZjooZnVuIGZhYiBjIC0+IGZhYiBjKVxuICBsZXQgYWxsIHRzID0gTGlzdC5mb2xkX3JpZ2h0IHRzIH5pbml0OihyZXR1cm4gW10pIH5mOihtYXAyIH5mOihmdW4geCB4cyAtPiB4IDo6IHhzKSlcbiAgbGV0ICggKj4gKSB1IHYgPSBtYXAyIHUgdiB+ZjooZnVuICgpIHkgLT4geSlcbiAgbGV0ICggPCogKSB1IHYgPSBtYXAyIHUgdiB+ZjooZnVuIHggKCkgLT4geClcbiAgbGV0IGFsbF91bml0IHRzID0gTGlzdC5mb2xkIHRzIH5pbml0OihyZXR1cm4gKCkpIH5mOiggKj4gKVxuXG4gIG1vZHVsZSBBcHBsaWNhdGl2ZV9pbmZpeCA9IHN0cnVjdFxuICAgIGxldCAoIDwqPiApID0gKCA8Kj4gKVxuICAgIGxldCAoICo+ICkgPSAoICo+IClcbiAgICBsZXQgKCA8KiApID0gKCA8KiApXG4gICAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBNYWtlMl91c2luZ19tYXAyIChYIDogQmFzaWMyX3VzaW5nX21hcDIpIDpcbiAgUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgWC50ID0gTWFrZTNfdXNpbmdfbWFwMiAoc3RydWN0XG4gICAgaW5jbHVkZSBYXG5cbiAgICB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50XG4gIGVuZClcblxubW9kdWxlIE1ha2VfdXNpbmdfbWFwMiAoWCA6IEJhc2ljX3VzaW5nX21hcDIpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBYLnQgPVxuICBNYWtlMl91c2luZ19tYXAyIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFhcblxuICAgIHR5cGUgKCdhLCAnZSkgdCA9ICdhIFgudFxuICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZDIgKE0gOiBNb25hZC5TMikgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSBNLnQgPSBNYWtlMiAoc3RydWN0XG4gICAgdHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSkgTS50XG5cbiAgICBsZXQgcmV0dXJuID0gTS5yZXR1cm5cbiAgICBsZXQgYXBwbHkgbWYgbXggPSBNLmJpbmQgbWYgfmY6KGZ1biBmIC0+IE0ubWFwIG14IH5mKVxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIE0ubWFwXG4gIGVuZClcblxubW9kdWxlIE9mX21vbmFkIChNIDogTW9uYWQuUykgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIE0udCA9IE9mX21vbmFkMiAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICB0eXBlICgnYSwgXykgdCA9ICdhIE0udFxuICBlbmQpXG5cbm1vZHVsZSBDb21wb3NlIChGIDogUykgKEcgOiBTKSA6IFMgd2l0aCB0eXBlICdhIHQgPSAnYSBGLnQgRy50ID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIEYudCBHLnRcblxuICBpbmNsdWRlIE1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgICAgbGV0IHJldHVybiBhID0gRy5yZXR1cm4gKEYucmV0dXJuIGEpXG4gICAgICBsZXQgYXBwbHkgdGYgdHggPSBHLmFwcGx5IChHLm1hcCB+ZjpGLmFwcGx5IHRmKSB0eFxuICAgICAgbGV0IGN1c3RvbV9tYXAgdCB+ZiA9IEcubWFwIH5mOihGLm1hcCB+ZikgdFxuICAgICAgbGV0IG1hcCA9IGBDdXN0b20gY3VzdG9tX21hcFxuICAgIGVuZClcbmVuZFxuXG5tb2R1bGUgUGFpciAoRiA6IFMpIChHIDogUykgOiBTIHdpdGggdHlwZSAnYSB0ID0gJ2EgRi50ICogJ2EgRy50ID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIEYudCAqICdhIEcudFxuXG4gIGluY2x1ZGUgTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgICBsZXQgcmV0dXJuIGEgPSBGLnJldHVybiBhLCBHLnJldHVybiBhXG4gICAgICBsZXQgYXBwbHkgdGYgdHggPSBGLmFwcGx5IChmc3QgdGYpIChmc3QgdHgpLCBHLmFwcGx5IChzbmQgdGYpIChzbmQgdHgpXG4gICAgICBsZXQgY3VzdG9tX21hcCB0IH5mID0gRi5tYXAgfmYgKGZzdCB0KSwgRy5tYXAgfmYgKHNuZCB0KVxuICAgICAgbGV0IG1hcCA9IGBDdXN0b20gY3VzdG9tX21hcFxuICAgIGVuZClcbmVuZFxuIiwiKCogW0J5dGVzMF0gZGVmaW5lcyBzdHJpbmcgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseVxuICAgZGVmaW5lZCBpbiB0ZXJtcyBvZiBbQ2FtbC5CeXRlc10uIFtCeXRlczBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzc1xuICAgdGhlIHBhcnQgb2YgW0NhbWwuQnl0ZXNdIHRoYXQgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyXG4gICB0aGFuIGJ5dGVzMC5tbCBzaG91bGQgdXNlIFtDYW1sLkJ5dGVzXS4gW0J5dGVzMF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZFxuICAgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci5cblxuICAgQWxsIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBzdHJpbmdzIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5CeXRlc10gaW5cbiAgIGJ1aWxkIG9yZGVyIHNob3VsZCBkbzpcblxuICAge1tcbiAgICAgbW9kdWxlIEJ5dGVzICA9IEJ5dGVzMFxuICAgXX1cblxuICAgRGVmaW5pbmcgW21vZHVsZSBCeXRlcyA9IEJ5dGVzMF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdCBwcmV2ZW50c1xuICAgb2NhbWxkZXAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5CeXRlc10uICopXG5cbm9wZW4hIEltcG9ydDBcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbm1vZHVsZSBQcmltaXRpdmVzID0gc3RydWN0XG4gIGV4dGVybmFsIGdldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfc2FmZV9nZXRcIlxuICBleHRlcm5hbCBsZW5ndGggOiBieXRlcyAtPiBpbnQgPSBcIiVieXRlc19sZW5ndGhcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgPSBcIiVieXRlc191bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgc2V0ICAgICAgICA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5cbiAgKCogW3Vuc2FmZV9ibGl0X3N0cmluZ10gaXMgbm90IGV4cG9ydGVkIGluIHRoZSBbc3RkbGliXSBzbyB3ZSBleHBvcnQgaXQgaGVyZSAqKVxuICBleHRlcm5hbCB1bnNhZmVfYmxpdF9zdHJpbmdcbiAgICA6ICBzcmM6c3RyaW5nXG4gICAgLT4gc3JjX3BvczppbnRcbiAgICAtPiBkc3Q6Ynl0ZXNcbiAgICAtPiBkc3RfcG9zOmludFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiB1bml0XG4gICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIHVuc2FmZV9nZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgPSBcIiVjYW1sX2J5dGVzX2dldDY0dVwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjR1XCJcbmVuZFxuXG5pbmNsdWRlIFByaW1pdGl2ZXNcblxubGV0IG1heF9sZW5ndGggPSBTeXMubWF4X3N0cmluZ19sZW5ndGhcbmxldCBibGl0ID0gQ2FtbC5CeXRlcy5ibGl0XG5sZXQgYmxpdF9zdHJpbmcgPSBDYW1sLkJ5dGVzLmJsaXRfc3RyaW5nXG5sZXQgY29tcGFyZSA9IENhbWwuQnl0ZXMuY29tcGFyZVxubGV0IGNvcHkgPSBDYW1sLkJ5dGVzLmNvcHlcbmxldCBjcmVhdGUgPSBDYW1sLkJ5dGVzLmNyZWF0ZVxubGV0IGZpbGwgPSBDYW1sLkJ5dGVzLmZpbGxcbmxldCBtYWtlID0gQ2FtbC5CeXRlcy5tYWtlXG5sZXQgbWFwID0gQ2FtbC5CeXRlcy5tYXBcbmxldCBtYXBpID0gQ2FtbC5CeXRlcy5tYXBpXG5sZXQgc3ViID0gQ2FtbC5CeXRlcy5zdWJcbmxldCB1bnNhZmVfYmxpdCA9IENhbWwuQnl0ZXMudW5zYWZlX2JsaXRcbmxldCB0b19zdHJpbmcgPSBDYW1sLkJ5dGVzLnRvX3N0cmluZ1xubGV0IG9mX3N0cmluZyA9IENhbWwuQnl0ZXMub2Zfc3RyaW5nXG5sZXQgdW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpzID0gQ2FtbC5CeXRlcy51bnNhZmVfdG9fc3RyaW5nIHNcbmxldCB1bnNhZmVfb2Zfc3RyaW5nX3Byb21pc2Vfbm9fbXV0YXRpb24gPSBDYW1sLkJ5dGVzLnVuc2FmZV9vZl9zdHJpbmdcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlICgnYSwgJ3dpdG5lc3MpIHQgPVxuICB7IGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnRcbiAgOyBzZXhwX29mX3QgOiAnYSAtPiBTZXhwLnRcbiAgfVxuXG50eXBlICgnYSwgJ2IpIGNvbXBhcmF0b3IgPSAoJ2EsICdiKSB0XG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdHlwZSB0XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGNvbXBhcmF0b3IgOiAodCwgY29tcGFyYXRvcl93aXRuZXNzKSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EgdCwgY29tcGFyYXRvcl93aXRuZXNzKSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIHR5cGUgU19mYyA9IHNpZ1xuICB0eXBlIGNvbXBhcmFibGVfdFxuXG4gIGluY2x1ZGUgUyB3aXRoIHR5cGUgdCA6PSBjb21wYXJhYmxlX3RcbmVuZFxuXG5tb2R1bGUgTW9kdWxlID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdCA9IChtb2R1bGUgUyB3aXRoIHR5cGUgdCA9ICdhIGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9ICdiKVxuZW5kXG5cbmxldCBtYWtlICh0eXBlIHQpIH5jb21wYXJlIH5zZXhwX29mX3QgPVxuICAobW9kdWxlIHN0cnVjdFxuICAgIHR5cGUgY29tcGFyYWJsZV90ID0gdFxuICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgICBsZXQgY29tcGFyYXRvciA9IHsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgZW5kIDogU19mY1xuICAgIHdpdGggdHlwZSBjb21wYXJhYmxlX3QgPSB0KVxuOztcblxubW9kdWxlIFNfdG9fUzEgKFMgOiBTKSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSBTLnRcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBTLmNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIG9wZW4gU1xuXG4gIGxldCBjb21wYXJhdG9yID0gY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSBNYWtlIChNIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgaW5jbHVkZSBNXG5cbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciA9IE0ueyBjb21wYXJlOyBzZXhwX29mX3QgfVxuZW5kXG5cbm1vZHVsZSBNYWtlMSAoTSA6IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiAnYSB0IC0+ICdhIHQgLT4gaW50XG4gICAgdmFsIHNleHBfb2ZfdCA6ICdhIHQgLT4gU2V4cC50XG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBNLnsgY29tcGFyZTsgc2V4cF9vZl90IH1cbmVuZFxuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYVxuXG4gIGluY2x1ZGUgTWFrZTEgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcblxuICAgICAgbGV0IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgICAgIGxldCBzZXhwX29mX3QgXyA9IFNleHAuQXRvbSBcIl9cIlxuICAgIGVuZClcbmVuZFxuXG5tb2R1bGUgdHlwZSBEZXJpdmVkID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlICdjbXAgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EsICdjbXApIGNvbXBhcmF0b3IgLT4gKCdhIHQsICdjbXAgY29tcGFyYXRvcl93aXRuZXNzKSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIERlcml2ZWQgKE0gOiBzaWdcbiAgICB0eXBlICdhIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcblxuICAgIHZhbCBzZXhwX29mX3QgOiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSAnY21wIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yIGEgPVxuICAgIHsgY29tcGFyZSA9IE0uY29tcGFyZSBhLmNvbXBhcmU7IHNleHBfb2ZfdCA9IE0uc2V4cF9vZl90IGEuc2V4cF9vZl90IH1cbiAgOztcbmVuZFxuXG5tb2R1bGUgdHlwZSBEZXJpdmVkMiA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAoJ2NtcF9hLCAnY21wX2IpIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBjb21wYXJhdG9yXG4gICAgOiAgKCdhLCAnY21wX2EpIGNvbXBhcmF0b3JcbiAgICAtPiAoJ2IsICdjbXBfYikgY29tcGFyYXRvclxuICAgIC0+ICgoJ2EsICdiKSB0LCAoJ2NtcF9hLCAnY21wX2IpIGNvbXBhcmF0b3Jfd2l0bmVzcykgY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSBEZXJpdmVkMiAoTSA6IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gICAgdmFsIHNleHBfb2ZfdFxuICAgICAgOiAgKCdhIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnYiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2EsICdiKSB0XG4gICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgKCdjbXBfYSwgJ2NtcF9iKSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciBhIGIgPVxuICAgIHsgY29tcGFyZSA9IE0uY29tcGFyZSBhLmNvbXBhcmUgYi5jb21wYXJlXG4gICAgOyBzZXhwX29mX3QgPSBNLnNleHBfb2ZfdCBhLnNleHBfb2ZfdCBiLnNleHBfb2ZfdFxuICAgIH1cbiAgOztcbmVuZFxuXG5tb2R1bGUgdHlwZSBEZXJpdmVkX3BoYW50b20gPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgJ2NtcCBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgY29tcGFyYXRvclxuICAgIDogICgnYSwgJ2NtcCkgY29tcGFyYXRvclxuICAgIC0+ICgoJ2EsIF8pIHQsICdjbXAgY29tcGFyYXRvcl93aXRuZXNzKSBjb21wYXJhdG9yXG5lbmRcblxubW9kdWxlIERlcml2ZWRfcGhhbnRvbSAoTSA6IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gaW50XG4gICAgdmFsIHNleHBfb2ZfdCA6ICgnYSAtPiBTZXhwLnQpIC0+ICgnYSwgXykgdCAtPiBTZXhwLnRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSAnY21wX2EgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgYSA9XG4gICAgeyBjb21wYXJlID0gTS5jb21wYXJlIGEuY29tcGFyZTsgc2V4cF9vZl90ID0gTS5zZXhwX29mX3QgYS5zZXhwX29mX3QgfVxuICA7O1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSAoJ2YsICdzKSB0ID1cbiAgfCBGaXJzdCBvZiAnZlxuICB8IFNlY29uZCBvZiAnc1xuW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IGNvbXBhcmUgOlxuICAnZiAncy4gKCdmIC0+ICdmIC0+IGludCkgLT4gKCdzIC0+ICdzIC0+IGludCkgLT4gKCdmLCAncykgdCAtPiAoJ2YsICdzKSB0IC0+IGludFxuICA9XG4gIGZ1biBfY21wX19mIF9jbXBfX3MgYV9fMDAxXyBiX18wMDJfIC0+XG4gIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwMV8gYl9fMDAyX1xuICB0aGVuIDBcbiAgZWxzZSAoXG4gICAgbWF0Y2ggYV9fMDAxXywgYl9fMDAyXyB3aXRoXG4gICAgfCBGaXJzdCBfYV9fMDAzXywgRmlyc3QgX2JfXzAwNF8gLT4gX2NtcF9fZiBfYV9fMDAzXyBfYl9fMDA0X1xuICAgIHwgRmlyc3QgXywgXyAtPiAtMVxuICAgIHwgXywgRmlyc3QgXyAtPiAxXG4gICAgfCBTZWNvbmQgX2FfXzAwNV8sIFNlY29uZCBfYl9fMDA2XyAtPiBfY21wX19zIF9hX18wMDVfIF9iX18wMDZfKVxuOztcblxubGV0IGhhc2hfZm9sZF90XG4gIDogdHlwZSBmIHMuXG4gICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBmIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHMgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgIC0+IChmLCBzKSB0XG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gID1cbiAgZnVuIF9oYXNoX2ZvbGRfZiBfaGFzaF9mb2xkX3MgaHN2IGFyZyAtPlxuICBtYXRjaCBhcmcgd2l0aFxuICB8IEZpcnN0IF9hMCAtPlxuICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDAgaW5cbiAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgX2hhc2hfZm9sZF9mIGhzdiBfYTBcbiAgfCBTZWNvbmQgX2EwIC0+XG4gICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMSBpblxuICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICBfaGFzaF9mb2xkX3MgaHN2IF9hMFxuOztcblxubGV0IHRfb2Zfc2V4cCA6XG4gICdmICdzLlxuICAoU2V4cGxpYjAuU2V4cC50IC0+ICdmKSAtPiAoU2V4cGxpYjAuU2V4cC50IC0+ICdzKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gKCdmLCAncykgdFxuICA9XG4gIGZ1biAodHlwZSBmX18wMjNfIHNfXzAyNF8pXG4gICAgICA6ICAoKFNleHBsaWIwLlNleHAudCAtPiBmX18wMjNfKSAtPiAoU2V4cGxpYjAuU2V4cC50IC0+IHNfXzAyNF8pIC0+IFNleHBsaWIwLlNleHAudFxuICAgICAgICAgIC0+IChmX18wMjNfLCBzX18wMjRfKSB0KSAtPlxuICAgIGxldCBlcnJvcl9zb3VyY2VfXzAxMV8gPSBcImVpdGhlcjAubWwudFwiIGluXG4gICAgZnVuIF9vZl9mX18wMDdfIF9vZl9zX18wMDhfIC0+IGZ1bmN0aW9uXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImZpcnN0XCIgfCBcIkZpcnN0XCIpIGFzIF90YWdfXzAxNF8pIDo6IHNleHBfYXJnc19fMDE1XykgYXNcbiAgICAgICAgX3NleHBfXzAxM18gLT5cbiAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDE1XyB3aXRoXG4gICAgICAgICB8IFsgYXJnMF9fMDE2XyBdIC0+XG4gICAgICAgICAgIGxldCByZXMwX18wMTdfID0gX29mX2ZfXzAwN18gYXJnMF9fMDE2XyBpblxuICAgICAgICAgICBGaXJzdCByZXMwX18wMTdfXG4gICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDExX1xuICAgICAgICAgICAgIF90YWdfXzAxNF9cbiAgICAgICAgICAgICBfc2V4cF9fMDEzXylcbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwic2Vjb25kXCIgfCBcIlNlY29uZFwiKSBhcyBfdGFnX18wMTlfKSA6OiBzZXhwX2FyZ3NfXzAyMF8pIGFzXG4gICAgICAgIF9zZXhwX18wMThfIC0+XG4gICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAyMF8gd2l0aFxuICAgICAgICAgfCBbIGFyZzBfXzAyMV8gXSAtPlxuICAgICAgICAgICBsZXQgcmVzMF9fMDIyXyA9IF9vZl9zX18wMDhfIGFyZzBfXzAyMV8gaW5cbiAgICAgICAgICAgU2Vjb25kIHJlczBfXzAyMl9cbiAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMTFfXG4gICAgICAgICAgICAgX3RhZ19fMDE5X1xuICAgICAgICAgICAgIF9zZXhwX18wMThfKVxuICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiZmlyc3RcIiB8IFwiRmlyc3RcIikgYXMgc2V4cF9fMDEyXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDExXyBzZXhwX18wMTJfXG4gICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJzZWNvbmRcIiB8IFwiU2Vjb25kXCIpIGFzIHNleHBfXzAxMl8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAxMV8gc2V4cF9fMDEyX1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAxMF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDExXyBzZXhwX18wMTBfXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMTBfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDExXyBzZXhwX18wMTBfXG4gICAgICB8IHNleHBfXzAxMF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAxMV8gc2V4cF9fMDEwX1xuOztcblxubGV0IHNleHBfb2ZfdCA6XG4gICdmICdzLlxuICAoJ2YgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ3MgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ2YsICdzKSB0IC0+IFNleHBsaWIwLlNleHAudFxuICA9XG4gIGZ1biAodHlwZSBmX18wMzFfIHNfXzAzMl8pXG4gICAgICA6ICAoKGZfXzAzMV8gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoc19fMDMyXyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgICAgLT4gKGZfXzAzMV8sIHNfXzAzMl8pIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgIGZ1biBfb2ZfZl9fMDI1XyBfb2Zfc19fMDI2XyAtPiBmdW5jdGlvblxuICAgICAgfCBGaXJzdCBhcmcwX18wMjdfIC0+XG4gICAgICAgIGxldCByZXMwX18wMjhfID0gX29mX2ZfXzAyNV8gYXJnMF9fMDI3XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJGaXJzdFwiOyByZXMwX18wMjhfIF1cbiAgICAgIHwgU2Vjb25kIGFyZzBfXzAyOV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAzMF8gPSBfb2Zfc19fMDI2XyBhcmcwX18wMjlfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlNlY29uZFwiOyByZXMwX18wMzBfIF1cbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOlxuICAgICAgICdmIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgIC0+ICdzIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgIC0+ICgnZiwgJ3MpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gID1cbiAgZnVuIF8nZl9zZXhwX2dyYW1tYXIgXydzX3NleHBfZ3JhbW1hciAtPlxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiRmlyc3RcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Zfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIlNlY29uZFwiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nc19zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxuW0BAQGVuZF1cbiIsIigqIFRoZSB0eXBlIFt0XSBzaG91bGQgYmUgYWJzdHJhY3QgdG8gbWFrZSB0aGUgZnNldCBhbmQgc2V0IGZ1bmN0aW9ucyB1bmF2YWlsYWJsZVxuICAgZm9yIHByaXZhdGUgdHlwZXMgYXQgdGhlIGxldmVsIG9mIHR5cGVzIChhbmQgbm90IGJ5IHB1dHRpbmcgTm9uZSBpbiB0aGUgZmllbGQpLlxuICAgVW5mb3J0dW5hdGVseSwgbWFraW5nIHRoZSB0eXBlIGFic3RyYWN0IG1lYW5zIHRoYXQgd2hlbiBjcmVhdGluZyBmaWVsZHMgKHRocm91Z2hcbiAgIGEgW2NyZWF0ZV0gZnVuY3Rpb24pIHZhbHVlIHJlc3RyaWN0aW9uIGtpY2tzIGluLiBUaGlzIGlzIHdvcmtlZCBhcm91bmQgYnkgaW5zdGVhZFxuICAgbm90IG1ha2luZyB0aGUgdHlwZSBhYnN0cmFjdCwgYnV0IGZvcmNpbmcgYW55b25lIGJyZWFraW5nIHRoZSBhYnN0cmFjdGlvbiB0byB1c2VcbiAgIHRoZSBbRm9yX2dlbmVyYXRlZF9jb2RlXSBtb2R1bGUsIG1ha2luZyBpdCBvYnZpb3VzIHRvIGFueSByZWFkZXIgdGhhdCBzb21ldGhpbmcgdWdseVxuICAgaXMgZ29pbmcgb24uXG4gICB0X3dpdGhfcGVybSAoYW5kIGRlcml2YXRpdmVzKSBpcyB0aGUgdHlwZSB0aGF0IHVzZXJzIHJlYWxseSB1c2UuIEl0IGlzIGEgY29uc3RydWN0b3JcbiAgIGJlY2F1c2U6XG4gICAxLiBpdCBtYWtlcyB0eXBlIGVycm9ycyBtb3JlIHJlYWRhYmxlIChsZXNzIGFsaWFzaW5nKVxuICAgMi4gdGhlIHR5cGVyIGluIG9jYW1sIDQuMDEgYWxsb3dzIHRoaXM6XG5cbiAgIHtbXG4gICAgIG1vZHVsZSBBID0gc3RydWN0XG4gICAgICAgdHlwZSB0ID0ge2EgOiBpbnR9XG4gICAgIGVuZFxuICAgICB0eXBlIHQgPSBBLnRcbiAgICAgbGV0IGYgKHggOiB0KSA9IHguYVxuICAgXX1cblxuICAgKGFsdGhvdWdoIHdpdGggV2FybmluZyA0MDogYSBpcyB1c2VkIG91dCBvZiBzY29wZSlcbiAgIHdoaWNoIG1lYW5zIHRoYXQgaWYgW3Rfd2l0aF9wZXJtXSB3YXMgcmVhbGx5IGFuIGFsaWFzIG9uIFtGb3JfZ2VuZXJhdGVkX2NvZGUudF0sXG4gICBwZW9wbGUgY291bGQgc2F5IFt0LnNldHRlcl0gYW5kIGJyZWFrIHRoZSBhYnN0cmFjdGlvbiB3aXRoIG5vIGluZGljYXRpb24gdGhhdFxuICAgc29tZXRoaW5nIHVnbHkgaXMgZ29pbmcgb24gaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgVGhlIHdhcm5pbmcgaXMgKEkgdGhpbmspIGZvciBwZW9wbGUgd2hvIHdhbnQgdG8gbWFrZSB0aGVpciBjb2RlIGNvbXBhdGlibGUgd2l0aFxuICAgcHJldmlvdXMgdmVyc2lvbnMgb2Ygb2NhbWwsIHNvIHdlIG1heSB2ZXJ5IHdlbGwgdHVybiBpdCBvZmYuXG5cbiAgIFRoZSB0eXBlIHRfd2l0aF9wZXJtIGNvdWxkIGFsc28gaGF2ZSBiZWVuIGEgW3VuaXQgLT4gRm9yX2dlbmVyYXRlZF9jb2RlLnRdIHRvIHdvcmtcbiAgIGFyb3VuZCB2YWx1ZSByZXN0cmljdGlvbiBhbmQgdGhlbiBbRm9yX2dlbmVyYXRlZF9jb2RlLnRdIHdvdWxkIGhhdmUgYmVlbiBhIHByb3BlclxuICAgYWJzdHJhY3QgdHlwZSwgYnV0IGl0IGxvb2tzIGxpa2UgaXQgY291bGQgaW1wYWN0IHBlcmZvcm1hbmNlIChmb3IgZXhhbXBsZSwgYSBmb2xkIG9uIGFcbiAgIHJlY29yZCB0eXBlIHdpdGggNDAgZmllbGRzIHdvdWxkIGFjdHVhbGx5IGFsbG9jYXRlIHRoZSA0MCBbRm9yX2dlbmVyYXRlZF9jb2RlLnRdJ3MgYXRcbiAgIGV2ZXJ5IHNpbmdsZSBmb2xkLikgKilcblxubW9kdWxlIEZvcl9nZW5lcmF0ZWRfY29kZSA9IHN0cnVjdFxuICB0eXBlICgncGVybSwgJ3JlY29yZCwgJ2ZpZWxkKSB0ID1cbiAgICB7IGZvcmNlX3ZhcmlhbmNlIDogJ3Blcm0gLT4gdW5pdFxuICAgIDsgKCogZm9yY2UgW3RdIHRvIGJlIGNvbnRyYXZhcmlhbnQgaW4gWydwZXJtXSwgYmVjYXVzZSBwaGFudG9tIHR5cGUgdmFyaWFibGVzIG9uXG4gICAgICAgICBjb25jcmV0ZSB0eXBlcyBkb24ndCB3b3JrIHRoYXQgd2VsbCBvdGhlcndpc2UgKHVzaW5nIDo+IGNhbiByZW1vdmUgdGhlbSBlYXNpbHkpICopXG4gICAgICBuYW1lIDogc3RyaW5nXG4gICAgOyBzZXR0ZXIgOiAoJ3JlY29yZCAtPiAnZmllbGQgLT4gdW5pdCkgb3B0aW9uXG4gICAgOyBnZXR0ZXIgOiAncmVjb3JkIC0+ICdmaWVsZFxuICAgIDsgZnNldCA6ICdyZWNvcmQgLT4gJ2ZpZWxkIC0+ICdyZWNvcmRcbiAgICB9XG5cbiAgbGV0IG9wYXF1ZV9pZGVudGl0eSA9IFN5czAub3BhcXVlX2lkZW50aXR5XG5lbmRcblxudHlwZSAoJ3Blcm0sICdyZWNvcmQsICdmaWVsZCkgdF93aXRoX3Blcm0gPVxuICB8IEZpZWxkIG9mICgncGVybSwgJ3JlY29yZCwgJ2ZpZWxkKSBGb3JfZ2VuZXJhdGVkX2NvZGUudFxuW0BAdW5ib3hlZF1cblxudHlwZSAoJ3JlY29yZCwgJ2ZpZWxkKSB0ID0gKFsgYFJlYWQgfCBgU2V0X2FuZF9jcmVhdGUgXSwgJ3JlY29yZCwgJ2ZpZWxkKSB0X3dpdGhfcGVybVxudHlwZSAoJ3JlY29yZCwgJ2ZpZWxkKSByZWFkb25seV90ID0gKFsgYFJlYWQgXSwgJ3JlY29yZCwgJ2ZpZWxkKSB0X3dpdGhfcGVybVxuXG5sZXQgbmFtZSAoRmllbGQgZmllbGQpID0gZmllbGQubmFtZVxubGV0IGdldCAoRmllbGQgZmllbGQpIHIgPSBmaWVsZC5nZXR0ZXIgclxubGV0IGZzZXQgKEZpZWxkIGZpZWxkKSByIHYgPSBmaWVsZC5mc2V0IHIgdlxubGV0IHNldHRlciAoRmllbGQgZmllbGQpID0gZmllbGQuc2V0dGVyXG5cbnR5cGUgKCdwZXJtLCAncmVjb3JkLCAncmVzdWx0KSB1c2VyID1cbiAgeyBmIDogJ2ZpZWxkLiAoJ3Blcm0sICdyZWNvcmQsICdmaWVsZCkgdF93aXRoX3Blcm0gLT4gJ3Jlc3VsdCB9XG5cbmxldCBtYXAgKEZpZWxkIGZpZWxkKSByIH5mID0gZmllbGQuZnNldCByIChmIChmaWVsZC5nZXR0ZXIgcikpXG5cbmxldCB1cGRhdGVyIChGaWVsZCBmaWVsZCkgPVxuICBtYXRjaCBmaWVsZC5zZXR0ZXIgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgc2V0dGVyIC0+IFNvbWUgKGZ1biByIH5mIC0+IHNldHRlciByIChmIChmaWVsZC5nZXR0ZXIgcikpKVxuOztcbiIsIigqIFtTdHJpbmcwXSBkZWZpbmVzIHN0cmluZyBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5IGRlZmluZWQgaW5cbiAgIHRlcm1zIG9mIFtDYW1sLlN0cmluZ10uIFtTdHJpbmcwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3MgdGhlIHBhcnQgb2ZcbiAgIFtDYW1sLlN0cmluZ10gdGhhdCBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXIgdGhhbiBzdHJpbmcwLm1sIHNob3VsZFxuICAgdXNlIFtDYW1sLlN0cmluZ10uICBbU3RyaW5nMF0gaGFzIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzXG4gICBidWlsZCBvcmRlci5cblxuICAgQWxsIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBzdHJpbmdzLCBpbmNsdWRpbmcgdGhlIHN1YnNjcmlwdCBzeW50YXhcbiAgIFt4LihpKV0gb3IgW3guKGkpIDwtIGVdIHdoaWNoIHRoZSBPQ2FtbCBwYXJzZXIgZGVzdWdhcnMgaW50byBjYWxscyB0b1xuICAgW1N0cmluZ10sIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5TdHJpbmddIGluIGJ1aWxkIG9yZGVyIHNob3VsZCBkb1xuXG4gICB7W1xuICAgICBtb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxuICAgXX1cblxuICAgRGVmaW5pbmcgW21vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0IHByZXZlbnRzXG4gICBvY2FtbGRlcCBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLlN0cmluZ10uICopXG5cbm9wZW4hIEltcG9ydDBcbm1vZHVsZSBCeXRlcyA9IEJ5dGVzMFxubW9kdWxlIFN5cyA9IFN5czBcblxubW9kdWxlIFN0cmluZyA9IHN0cnVjdFxuICBleHRlcm5hbCBnZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfc2FmZV9nZXRcIlxuICBleHRlcm5hbCBsZW5ndGggOiBzdHJpbmcgLT4gaW50ID0gXCIlc3RyaW5nX2xlbmd0aFwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQgOiBzdHJpbmcgLT4gaW50IC0+IGNoYXIgPSBcIiVzdHJpbmdfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHNldCAgICAgICAgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZW5kXG5cbmluY2x1ZGUgU3RyaW5nXG5cbmxldCBtYXhfbGVuZ3RoID0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG5sZXQgKCBeICkgPSAoIF4gKVxubGV0IGNhcGl0YWxpemUgPSBDYW1sLlN0cmluZy5jYXBpdGFsaXplX2FzY2lpXG5sZXQgY29tcGFyZSA9IENhbWwuU3RyaW5nLmNvbXBhcmVcblxubGV0IGNvcHkgeCA9XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmdcbiAgICB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpcbiAgICAgIChCeXRlcy5vZl9zdHJpbmcgeClcbjs7XG5cbmxldCBlc2NhcGVkID0gQ2FtbC5TdHJpbmcuZXNjYXBlZFxubGV0IGxvd2VyY2FzZSA9IENhbWwuU3RyaW5nLmxvd2VyY2FzZV9hc2NpaVxubGV0IG1ha2UgPSBDYW1sLlN0cmluZy5tYWtlXG5sZXQgc3ViID0gQ2FtbC5TdHJpbmcuc3ViXG5sZXQgdW5jYXBpdGFsaXplID0gQ2FtbC5TdHJpbmcudW5jYXBpdGFsaXplX2FzY2lpXG5sZXQgdW5zYWZlX2JsaXQgPSBDYW1sLlN0cmluZy51bnNhZmVfYmxpdFxubGV0IHVwcGVyY2FzZSA9IENhbWwuU3RyaW5nLnVwcGVyY2FzZV9hc2NpaVxuXG5sZXQgY29uY2F0ID8oc2VwID0gXCJcIikgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+IFwiXCJcbiAgKCogVGhlIHN0ZGxpYiBkb2VzIG5vdCBzcGVjaWFsaXplIHRoaXMgY2FzZSBiZWNhdXNlIGl0IGNvdWxkIGJyZWFrIGV4aXN0aW5nIHByb2plY3RzLiAqKVxuICB8IFsgeCBdIC0+IHhcbiAgfCBsIC0+IENhbWwuU3RyaW5nLmNvbmNhdCB+c2VwIGxcbjs7XG5cbigqIFRoZXNlIGFyZSBldGEgZXhwYW5kZWQgaW4gb3JkZXIgdG8gcGVybXV0ZSBwYXJhbWV0ZXIgb3JkZXIgdG8gZm9sbG93IEJhc2VcbiAgIGNvbnZlbnRpb25zLiAqKVxubGV0IGl0ZXIgdCB+ZiA9IENhbWwuU3RyaW5nLml0ZXIgdCB+ZlxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgSW50ID0gSW50MFxubW9kdWxlIFN0cmluZyA9IFN0cmluZzBcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gQ2FtbC5MZXhpbmcucG9zaXRpb24gPVxuICAgIHsgcG9zX2ZuYW1lIDogc3RyaW5nXG4gICAgOyBwb3NfbG51bSA6IGludFxuICAgIDsgcG9zX2JvbCA6IGludFxuICAgIDsgcG9zX2NudW0gOiBpbnRcbiAgICB9XG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlID1cbiAgICAoZnVuIGFfXzAwMV8gYl9fMDAyXyAtPlxuICAgICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwMV8gYl9fMDAyX1xuICAgICAgIHRoZW4gMFxuICAgICAgIGVsc2UgKFxuICAgICAgICAgbWF0Y2ggY29tcGFyZV9zdHJpbmcgYV9fMDAxXy5wb3NfZm5hbWUgYl9fMDAyXy5wb3NfZm5hbWUgd2l0aFxuICAgICAgICAgfCAwIC0+XG4gICAgICAgICAgIChtYXRjaCBjb21wYXJlX2ludCBhX18wMDFfLnBvc19sbnVtIGJfXzAwMl8ucG9zX2xudW0gd2l0aFxuICAgICAgICAgICAgfCAwIC0+XG4gICAgICAgICAgICAgIChtYXRjaCBjb21wYXJlX2ludCBhX18wMDFfLnBvc19ib2wgYl9fMDAyXy5wb3NfYm9sIHdpdGhcbiAgICAgICAgICAgICAgIHwgMCAtPiBjb21wYXJlX2ludCBhX18wMDFfLnBvc19jbnVtIGJfXzAwMl8ucG9zX2NudW1cbiAgICAgICAgICAgICAgIHwgbiAtPiBuKVxuICAgICAgICAgICAgfCBuIC0+IG4pXG4gICAgICAgICB8IG4gLT4gbilcbiAgICAgICAgIDogdCAtPiB0IC0+IGludClcbiAgOztcblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgZnVuIGhzdiBhcmcgLT5cbiAgICAgIGxldCBoc3YgPVxuICAgICAgICBsZXQgaHN2ID1cbiAgICAgICAgICBsZXQgaHN2ID1cbiAgICAgICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICAgICAgIGhhc2hfZm9sZF9zdHJpbmcgaHN2IGFyZy5wb3NfZm5hbWVcbiAgICAgICAgICBpblxuICAgICAgICAgIGhhc2hfZm9sZF9pbnQgaHN2IGFyZy5wb3NfbG51bVxuICAgICAgICBpblxuICAgICAgICBoYXNoX2ZvbGRfaW50IGhzdiBhcmcucG9zX2JvbFxuICAgICAgaW5cbiAgICAgIGhhc2hfZm9sZF9pbnQgaHN2IGFyZy5wb3NfY251bVxuICA7O1xuXG4gIGxldCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyBhcmcgPVxuICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgICAgaGFzaF9mb2xkX3QgaHN2IGFyZylcbiAgICBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgPVxuICAgIChmdW4geyBwb3NfZm5hbWUgPSBwb3NfZm5hbWVfXzAwNF9cbiAgICAgICAgIDsgcG9zX2xudW0gPSBwb3NfbG51bV9fMDA2X1xuICAgICAgICAgOyBwb3NfYm9sID0gcG9zX2JvbF9fMDA4X1xuICAgICAgICAgOyBwb3NfY251bSA9IHBvc19jbnVtX18wMTBfXG4gICAgICAgICB9IC0+XG4gICAgICBsZXQgYm5kc19fMDAzXyA9IFtdIGluXG4gICAgICBsZXQgYm5kc19fMDAzXyA9XG4gICAgICAgIGxldCBhcmdfXzAxMV8gPSBzZXhwX29mX2ludCBwb3NfY251bV9fMDEwXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJwb3NfY251bVwiOyBhcmdfXzAxMV8gXSA6OiBibmRzX18wMDNfXG4gICAgICBpblxuICAgICAgbGV0IGJuZHNfXzAwM18gPVxuICAgICAgICBsZXQgYXJnX18wMDlfID0gc2V4cF9vZl9pbnQgcG9zX2JvbF9fMDA4XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJwb3NfYm9sXCI7IGFyZ19fMDA5XyBdIDo6IGJuZHNfXzAwM19cbiAgICAgIGluXG4gICAgICBsZXQgYm5kc19fMDAzXyA9XG4gICAgICAgIGxldCBhcmdfXzAwN18gPSBzZXhwX29mX2ludCBwb3NfbG51bV9fMDA2XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJwb3NfbG51bVwiOyBhcmdfXzAwN18gXSA6OiBibmRzX18wMDNfXG4gICAgICBpblxuICAgICAgbGV0IGJuZHNfXzAwM18gPVxuICAgICAgICBsZXQgYXJnX18wMDVfID0gc2V4cF9vZl9zdHJpbmcgcG9zX2ZuYW1lX18wMDRfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInBvc19mbmFtZVwiOyBhcmdfXzAwNV8gXSA6OiBibmRzX18wMDNfXG4gICAgICBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IGJuZHNfXzAwM19cbiAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG4oKiBUaGlzIGlzIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIFBweF9oZXJlLmxpZnRfcG9zaXRpb25fYXNfc3RyaW5nLiAqKVxubGV0IG1ha2VfbG9jYXRpb25fc3RyaW5nIH5wb3NfZm5hbWUgfnBvc19sbnVtIH5wb3NfY251bSB+cG9zX2JvbCA9XG4gIFN0cmluZy5jb25jYXRcbiAgICBbIHBvc19mbmFtZTsgXCI6XCI7IEludC50b19zdHJpbmcgcG9zX2xudW07IFwiOlwiOyBJbnQudG9fc3RyaW5nIChwb3NfY251bSAtIHBvc19ib2wpIF1cbjs7XG5cbmxldCB0b19zdHJpbmcgeyBDYW1sLkxleGluZy5wb3NfZm5hbWU7IHBvc19sbnVtOyBwb3NfY251bTsgcG9zX2JvbCB9ID1cbiAgbWFrZV9sb2NhdGlvbl9zdHJpbmcgfnBvc19mbmFtZSB+cG9zX2xudW0gfnBvc19jbnVtIH5wb3NfYm9sXG47O1xuXG5sZXQgc2V4cF9vZl90IHQgPSBTZXhwLkF0b20gKHRvX3N0cmluZyB0KVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIExpc3QwXG5cbmxldCBpc19lbXB0eSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBwYXJ0aXRpb25fbWFwIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgdCBmc3Qgc25kID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IHJldiBmc3QsIHJldiBzbmRcbiAgICB8IHggOjogdCAtPlxuICAgICAgKG1hdGNoIChmIHggOiBfIEVpdGhlcjAudCkgd2l0aFxuICAgICAgIHwgRmlyc3QgeSAtPiBsb29wIHQgKHkgOjogZnN0KSBzbmRcbiAgICAgICB8IFNlY29uZCB5IC0+IGxvb3AgdCBmc3QgKHkgOjogc25kKSlcbiAgaW5cbiAgbG9vcCB0IFtdIFtdXG47O1xuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgRWl0aGVyID0gRWl0aGVyMFxuXG50eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBDYW1sLnJlc3VsdCA9XG4gIHwgT2sgb2YgJ2FcbiAgfCBFcnJvciBvZiAnYlxuW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hciwgY29tcGFyZSwgZXF1YWwsIGhhc2hdXG5cbmxldCB0X29mX3NleHAgOlxuICAnYSAnYi5cbiAgKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gKFNleHBsaWIwLlNleHAudCAtPiAnYikgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICgnYSwgJ2IpIHRcbiAgPVxuICBmdW4gKHR5cGUgYV9fMDE3XyBiX18wMThfKVxuICAgICAgOiAgKChTZXhwbGliMC5TZXhwLnQgLT4gYV9fMDE3XykgLT4gKFNleHBsaWIwLlNleHAudCAtPiBiX18wMThfKSAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICAgICAgICAtPiAoYV9fMDE3XywgYl9fMDE4XykgdCkgLT5cbiAgICBsZXQgZXJyb3Jfc291cmNlX18wMDVfID0gXCJyZXN1bHQubWwudFwiIGluXG4gICAgZnVuIF9vZl9hX18wMDFfIF9vZl9iX18wMDJfIC0+IGZ1bmN0aW9uXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcIm9rXCIgfCBcIk9rXCIpIGFzIF90YWdfXzAwOF8pIDo6IHNleHBfYXJnc19fMDA5XykgYXNcbiAgICAgICAgX3NleHBfXzAwN18gLT5cbiAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDA5XyB3aXRoXG4gICAgICAgICB8IFsgYXJnMF9fMDEwXyBdIC0+XG4gICAgICAgICAgIGxldCByZXMwX18wMTFfID0gX29mX2FfXzAwMV8gYXJnMF9fMDEwXyBpblxuICAgICAgICAgICBPayByZXMwX18wMTFfXG4gICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDA1X1xuICAgICAgICAgICAgIF90YWdfXzAwOF9cbiAgICAgICAgICAgICBfc2V4cF9fMDA3XylcbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwiZXJyb3JcIiB8IFwiRXJyb3JcIikgYXMgX3RhZ19fMDEzXykgOjogc2V4cF9hcmdzX18wMTRfKSBhc1xuICAgICAgICBfc2V4cF9fMDEyXyAtPlxuICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMTRfIHdpdGhcbiAgICAgICAgIHwgWyBhcmcwX18wMTVfIF0gLT5cbiAgICAgICAgICAgbGV0IHJlczBfXzAxNl8gPSBfb2ZfYl9fMDAyXyBhcmcwX18wMTVfIGluXG4gICAgICAgICAgIEVycm9yIHJlczBfXzAxNl9cbiAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMDVfXG4gICAgICAgICAgICAgX3RhZ19fMDEzX1xuICAgICAgICAgICAgIF9zZXhwX18wMTJfKVxuICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwib2tcIiB8IFwiT2tcIikgYXMgc2V4cF9fMDA2XyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDZfXG4gICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJlcnJvclwiIHwgXCJFcnJvclwiKSBhcyBzZXhwX18wMDZfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNl9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuICAgICAgfCBzZXhwX18wMDRfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbjs7XG5cbmxldCBzZXhwX29mX3QgOlxuICAnYSAnYi5cbiAgKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdiIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdhLCAnYikgdCAtPiBTZXhwbGliMC5TZXhwLnRcbiAgPVxuICBmdW4gKHR5cGUgYV9fMDI1XyBiX18wMjZfKVxuICAgICAgOiAgKChhX18wMjVfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKGJfXzAyNl8gLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAgIC0+IChhX18wMjVfLCBiX18wMjZfKSB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICBmdW4gX29mX2FfXzAxOV8gX29mX2JfXzAyMF8gLT4gZnVuY3Rpb25cbiAgICAgIHwgT2sgYXJnMF9fMDIxXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDIyXyA9IF9vZl9hX18wMTlfIGFyZzBfXzAyMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiT2tcIjsgcmVzMF9fMDIyXyBdXG4gICAgICB8IEVycm9yIGFyZzBfXzAyM18gLT5cbiAgICAgICAgbGV0IHJlczBfXzAyNF8gPSBfb2ZfYl9fMDIwXyBhcmcwX18wMjNfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkVycm9yXCI7IHJlczBfXzAyNF8gXVxuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6XG4gICAgICAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgLT4gJ2IgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgLT4gKCdhLCAnYikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciBfJ2Jfc2V4cF9ncmFtbWFyIC0+XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJPa1wiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiRXJyb3JcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Jfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbmxldCBjb21wYXJlIDpcbiAgJ2EgJ2IuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICgnYiAtPiAnYiAtPiBpbnQpIC0+ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdCAtPiBpbnRcbiAgPVxuICBmdW4gX2NtcF9fYSBfY21wX19iIGFfXzAyN18gYl9fMDI4XyAtPlxuICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMjdfIGJfXzAyOF9cbiAgdGhlbiAwXG4gIGVsc2UgKFxuICAgIG1hdGNoIGFfXzAyN18sIGJfXzAyOF8gd2l0aFxuICAgIHwgT2sgX2FfXzAyOV8sIE9rIF9iX18wMzBfIC0+IF9jbXBfX2EgX2FfXzAyOV8gX2JfXzAzMF9cbiAgICB8IE9rIF8sIF8gLT4gLTFcbiAgICB8IF8sIE9rIF8gLT4gMVxuICAgIHwgRXJyb3IgX2FfXzAzMV8sIEVycm9yIF9iX18wMzJfIC0+IF9jbXBfX2IgX2FfXzAzMV8gX2JfXzAzMl8pXG47O1xuXG5sZXQgZXF1YWwgOlxuICAnYSAnYi4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICgnYiAtPiAnYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gYm9vbFxuICA9XG4gIGZ1biBfY21wX19hIF9jbXBfX2IgYV9fMDMzXyBiX18wMzRfIC0+XG4gIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAzM18gYl9fMDM0X1xuICB0aGVuIHRydWVcbiAgZWxzZSAoXG4gICAgbWF0Y2ggYV9fMDMzXywgYl9fMDM0XyB3aXRoXG4gICAgfCBPayBfYV9fMDM1XywgT2sgX2JfXzAzNl8gLT4gX2NtcF9fYSBfYV9fMDM1XyBfYl9fMDM2X1xuICAgIHwgT2sgXywgXyAtPiBmYWxzZVxuICAgIHwgXywgT2sgXyAtPiBmYWxzZVxuICAgIHwgRXJyb3IgX2FfXzAzN18sIEVycm9yIF9iX18wMzhfIC0+IF9jbXBfX2IgX2FfXzAzN18gX2JfXzAzOF8pXG47O1xuXG5sZXQgaGFzaF9mb2xkX3RcbiAgOiB0eXBlIGEgYi5cbiAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGEgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gYiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgLT4gKGEsIGIpIHRcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgPVxuICBmdW4gX2hhc2hfZm9sZF9hIF9oYXNoX2ZvbGRfYiBoc3YgYXJnIC0+XG4gIG1hdGNoIGFyZyB3aXRoXG4gIHwgT2sgX2EwIC0+XG4gICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMCBpblxuICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICBfaGFzaF9mb2xkX2EgaHN2IF9hMFxuICB8IEVycm9yIF9hMCAtPlxuICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDEgaW5cbiAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgX2hhc2hfZm9sZF9iIGhzdiBfYTBcbjs7XG5cbltAQEBlbmRdXG5cbmluY2x1ZGUgTW9uYWQuTWFrZTIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG5cbiAgICBsZXQgYmluZCB4IH5mID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBFcnJvciBfIGFzIHggLT4geFxuICAgICAgfCBPayB4IC0+IGYgeFxuICAgIDs7XG5cbiAgICBsZXQgbWFwIHggfmYgPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IEVycm9yIF8gYXMgeCAtPiB4XG4gICAgICB8IE9rIHggLT4gT2sgKGYgeClcbiAgICA7O1xuXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgbGV0IHJldHVybiB4ID0gT2sgeFxuICBlbmQpXG5cbmxldCBpbnZhcmlhbnQgY2hlY2tfb2sgY2hlY2tfZXJyb3IgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE9rIG9rIC0+IGNoZWNrX29rIG9rXG4gIHwgRXJyb3IgZXJyb3IgLT4gY2hlY2tfZXJyb3IgZXJyb3Jcbjs7XG5cbmxldCBmYWlsIHggPSBFcnJvciB4XG5sZXQgZmFpbGYgZm9ybWF0ID0gUHJpbnRmLmtzcHJpbnRmIGZhaWwgZm9ybWF0XG5cbmxldCBtYXBfZXJyb3IgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE9rIF8gYXMgeCAtPiB4XG4gIHwgRXJyb3IgeCAtPiBFcnJvciAoZiB4KVxuOztcblxubW9kdWxlIEVycm9yID0gTW9uYWQuTWFrZTIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2IsICdhKSB0XG5cbiAgICBsZXQgYmluZCB4IH5mID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBPayBfIGFzIG9rIC0+IG9rXG4gICAgICB8IEVycm9yIGUgLT4gZiBlXG4gICAgOztcblxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcF9lcnJvclxuICAgIGxldCByZXR1cm4gZSA9IEVycm9yIGVcbiAgZW5kKVxuXG5sZXQgaXNfb2sgPSBmdW5jdGlvblxuICB8IE9rIF8gLT4gdHJ1ZVxuICB8IEVycm9yIF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19lcnJvciA9IGZ1bmN0aW9uXG4gIHwgT2sgXyAtPiBmYWxzZVxuICB8IEVycm9yIF8gLT4gdHJ1ZVxuOztcblxubGV0IG9rID0gZnVuY3Rpb25cbiAgfCBPayB4IC0+IFNvbWUgeFxuICB8IEVycm9yIF8gLT4gTm9uZVxuOztcblxubGV0IGVycm9yID0gZnVuY3Rpb25cbiAgfCBPayBfIC0+IE5vbmVcbiAgfCBFcnJvciB4IC0+IFNvbWUgeFxuOztcblxubGV0IG9mX29wdGlvbiBvcHQgfmVycm9yID1cbiAgbWF0Y2ggb3B0IHdpdGhcbiAgfCBTb21lIHggLT4gT2sgeFxuICB8IE5vbmUgLT4gRXJyb3IgZXJyb3Jcbjs7XG5cbmxldCBpdGVyIHYgfmYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBPayB4IC0+IGYgeFxuICB8IEVycm9yIF8gLT4gKClcbjs7XG5cbmxldCBpdGVyX2Vycm9yIHYgfmYgPVxuICBtYXRjaCB2IHdpdGhcbiAgfCBPayBfIC0+ICgpXG4gIHwgRXJyb3IgeCAtPiBmIHhcbjs7XG5cbmxldCB0b19laXRoZXIgOiBfIHQgLT4gXyBFaXRoZXIudCA9IGZ1bmN0aW9uXG4gIHwgT2sgeCAtPiBGaXJzdCB4XG4gIHwgRXJyb3IgeCAtPiBTZWNvbmQgeFxuOztcblxubGV0IG9mX2VpdGhlciA6IF8gRWl0aGVyLnQgLT4gXyB0ID0gZnVuY3Rpb25cbiAgfCBGaXJzdCB4IC0+IE9rIHhcbiAgfCBTZWNvbmQgeCAtPiBFcnJvciB4XG47O1xuXG5sZXQgb2tfaWZfdHJ1ZSBib29sIH5lcnJvciA9IGlmIGJvb2wgdGhlbiBPayAoKSBlbHNlIEVycm9yIGVycm9yXG5cbmxldCB0cnlfd2l0aCBmID1cbiAgdHJ5IE9rIChmICgpKSB3aXRoXG4gIHwgZXhuIC0+IEVycm9yIGV4blxuOztcblxubGV0IG9rX2V4biA9IGZ1bmN0aW9uXG4gIHwgT2sgeCAtPiB4XG4gIHwgRXJyb3IgZXhuIC0+IHJhaXNlIGV4blxuOztcblxubGV0IG9rX29yX2ZhaWx3aXRoID0gZnVuY3Rpb25cbiAgfCBPayB4IC0+IHhcbiAgfCBFcnJvciBzdHIgLT4gZmFpbHdpdGggc3RyXG47O1xuXG5tb2R1bGUgRXhwb3J0ID0gc3RydWN0XG4gIHR5cGUgKCdvaywgJ2VycikgX3Jlc3VsdCA9ICgnb2ssICdlcnIpIHQgPVxuICAgIHwgT2sgb2YgJ29rXG4gICAgfCBFcnJvciBvZiAnZXJyXG5cbiAgbGV0IGlzX2Vycm9yID0gaXNfZXJyb3JcbiAgbGV0IGlzX29rID0gaXNfb2tcbmVuZFxuXG5sZXQgY29tYmluZSB0MSB0MiB+b2sgfmVyciA9XG4gIG1hdGNoIHQxLCB0MiB3aXRoXG4gIHwgT2sgXywgRXJyb3IgZSB8IEVycm9yIGUsIE9rIF8gLT4gRXJyb3IgZVxuICB8IE9rIG9rMSwgT2sgb2syIC0+IE9rIChvayBvazEgb2syKVxuICB8IEVycm9yIGVycjEsIEVycm9yIGVycjIgLT4gRXJyb3IgKGVyciBlcnIxIGVycjIpXG47O1xuXG5sZXQgY29tYmluZV9lcnJvcnMgbCA9XG4gIGxldCBvaywgZXJycyA9IExpc3QxLnBhcnRpdGlvbl9tYXAgbCB+Zjp0b19laXRoZXIgaW5cbiAgbWF0Y2ggZXJycyB3aXRoXG4gIHwgW10gLT4gT2sgb2tcbiAgfCBfIDo6IF8gLT4gRXJyb3IgZXJyc1xuOztcblxubGV0IGNvbWJpbmVfZXJyb3JzX3VuaXQgbCA9IG1hcCAoY29tYmluZV9lcnJvcnMgbCkgfmY6KGZ1biAoXyA6IHVuaXQgbGlzdCkgLT4gKCkpXG5cbigqIGRlcHJlY2F0ZWQgYmluZGluZyBmb3IgZXhwb3J0IG9ubHkgKilcbmxldCBva19mc3QgPSB0b19laXRoZXJcbiIsIigqKiBQcm92aWRlcyBnZW5lcmljIHNpZ25hdHVyZXMgZm9yIGNvbnRhaW5lciBkYXRhIHN0cnVjdHVyZXMuXG5cbiAgICBUaGVzZSBzaWduYXR1cmVzIGluY2x1ZGUgZnVuY3Rpb25zIChbaXRlcl0sIFtmb2xkXSwgW2V4aXN0c10sIFtmb3JfYWxsXSwgLi4uKSB0aGF0XG4gICAgeW91IHdvdWxkIGV4cGVjdCB0byBmaW5kIGluIGFueSBjb250YWluZXIuIFVzZWQgYnkgaW5jbHVkaW5nIFtDb250YWluZXIuUzBdIG9yXG4gICAgW0NvbnRhaW5lci5TMV0gaW4gdGhlIHNpZ25hdHVyZSBmb3IgZXZlcnkgY29udGFpbmVyLWxpa2UgZGF0YSBzdHJ1Y3R1cmUgKFtBcnJheV0sXG4gICAgW0xpc3RdLCBbU3RyaW5nXSwgLi4uKSB0byBlbnN1cmUgYSBjb25zaXN0ZW50IGludGVyZmFjZS4gKilcblxub3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBFeHBvcnQgPSBzdHJ1Y3RcbiAgKCoqIFtDb250aW51ZV9vcl9zdG9wLnRdIGlzIHVzZWQgYnkgdGhlIFtmXSBhcmd1bWVudCB0byBbZm9sZF91bnRpbF0gaW4gb3JkZXIgdG9cbiAgICAgIGluZGljYXRlIHdoZXRoZXIgZm9sZGluZyBzaG91bGQgY29udGludWUsIG9yIHN0b3AgZWFybHkuXG5cbiAgICAgIEBjYW5vbmljYWwgQmFzZS5Db250YWluZXIuQ29udGludWVfb3Jfc3RvcFxuICAqKVxuICBtb2R1bGUgQ29udGludWVfb3Jfc3RvcCA9IHN0cnVjdFxuICAgIHR5cGUgKCdhLCAnYikgdCA9XG4gICAgICB8IENvbnRpbnVlIG9mICdhXG4gICAgICB8IFN0b3Agb2YgJ2JcbiAgZW5kXG5lbmRcblxuaW5jbHVkZSBFeHBvcnRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5Db250YWluZXIuU3VtbWFibGUgKilcbm1vZHVsZSB0eXBlIFN1bW1hYmxlID0gc2lnXG4gIHR5cGUgdFxuXG4gICgqKiBUaGUgcmVzdWx0IG9mIHN1bW1pbmcgbm8gdmFsdWVzLiAqKVxuICB2YWwgemVybyA6IHRcblxuICAoKiogQW4gb3BlcmF0aW9uIHRoYXQgY29tYmluZXMgdHdvIFt0XSdzIGFuZCBoYW5kbGVzIFt6ZXJvICsgeF0gYnkganVzdCByZXR1cm5pbmcgW3hdLFxuICAgICAgYXMgd2VsbCBhcyBpbiB0aGUgc3ltbWV0cmljIGNhc2UuICopXG4gIHZhbCAoICsgKSA6IHQgLT4gdCAtPiB0XG5lbmRcblxuKCoqIFNpZ25hdHVyZSBmb3IgbW9ub21vcnBoaWMgY29udGFpbmVyIC0gYSBjb250YWluZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCB0eXBlLCBlLmcuLFxuICAgIHN0cmluZywgd2hpY2ggaXMgYSBjb250YWluZXIgb2YgY2hhcmFjdGVycyAoW3R5cGUgZWx0ID0gY2hhcl0pIGFuZCBuZXZlciBvZiBhbnl0aGluZ1xuICAgIGVsc2UuICopXG5tb2R1bGUgdHlwZSBTMCA9IHNpZ1xuICB0eXBlIHRcbiAgdHlwZSBlbHRcblxuICAoKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgdGhlcmUsIHVzaW5nIGVxdWFsaXR5IG9uIFtlbHRdcy4gKilcbiAgdmFsIG1lbSA6IHQgLT4gZWx0IC0+IGJvb2xcblxuICB2YWwgbGVuZ3RoIDogdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogdCAtPiBib29sXG5cbiAgKCoqIFtpdGVyXSBtdXN0IGFsbG93IGV4Y2VwdGlvbnMgcmFpc2VkIGluIFtmXSB0byBlc2NhcGUsIHRlcm1pbmF0aW5nIHRoZSBpdGVyYXRpb25cbiAgICAgIGNsZWFubHkuICBUaGUgc2FtZSBob2xkcyBmb3IgYWxsIGZ1bmN0aW9ucyBiZWxvdyB0YWtpbmcgYW4gW2ZdLiAqKVxuICB2YWwgaXRlciA6IHQgLT4gZjooZWx0IC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogW2ZvbGQgdCB+aW5pdCB+Zl0gcmV0dXJucyBbZiAoLi4uIGYgKGYgKGYgaW5pdCBlMSkgZTIpIGUzIC4uLikgZW5dLCB3aGVyZSBbZTEuLmVuXVxuICAgICAgYXJlIHRoZSBlbGVtZW50cyBvZiBbdF0uICopXG4gIHZhbCBmb2xkIDogdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtmb2xkX3Jlc3VsdCB0IH5pbml0IH5mXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0gdGhhdCBydW5zIGluIHRoZVxuICAgICAgW1Jlc3VsdF0gbW9uYWQuICBJZiBbZl0gcmV0dXJucyBhbiBbRXJyb3IgX10sIHRoYXQgdmFsdWUgaXMgcmV0dXJuZWQgd2l0aG91dCBhbnlcbiAgICAgIGFkZGl0aW9uYWwgaW52b2NhdGlvbnMgb2YgW2ZdLiAqKVxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICAoKiogW2ZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0uIElmIFtmXVxuICAgICAgcmV0dXJucyBbU3RvcCBfXSB0aGUgY29tcHV0YXRpb24gY2Vhc2VzIGFuZCByZXN1bHRzIGluIHRoYXQgdmFsdWUuIElmIFtmXSByZXR1cm5zXG4gICAgICBbQ29udGludWUgX10sIHRoZSBmb2xkIHdpbGwgcHJvY2VlZC4gSWYgW2ZdIG5ldmVyIHJldHVybnMgW1N0b3AgX10sIHRoZSBmaW5hbCByZXN1bHRcbiAgICAgIGlzIGNvbXB1dGVkIGJ5IFtmaW5pc2hdLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIG1heWJlX25lZ2F0aXZlID1cbiAgICAgICAgICB8IEZvdW5kX25lZ2F0aXZlIG9mIGludFxuICAgICAgICAgIHwgQWxsX25vbm5lZ2F0aXZlIG9mIHsgc3VtIDogaW50IH1cblxuICAgICAgICAoKiogW2ZpcnN0X25lZ19vcl9zdW0gbGlzdF0gcmV0dXJucyB0aGUgZmlyc3QgbmVnYXRpdmUgbnVtYmVyIGluIFtsaXN0XSwgaWYgYW55LFxuICAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN1bSBvZiB0aGUgbGlzdC4gKilcbiAgICAgICAgbGV0IGZpcnN0X25lZ19vcl9zdW0gPVxuICAgICAgICAgIExpc3QuZm9sZF91bnRpbCB+aW5pdDowXG4gICAgICAgICAgICB+ZjooZnVuIHN1bSB4IC0+XG4gICAgICAgICAgICAgIGlmIHggPCAwXG4gICAgICAgICAgICAgIHRoZW4gU3RvcCAoRm91bmRfbmVnYXRpdmUgeClcbiAgICAgICAgICAgICAgZWxzZSBDb250aW51ZSAoc3VtICsgeCkpXG4gICAgICAgICAgICB+ZmluaXNoOihmdW4gc3VtIC0+IEFsbF9ub25uZWdhdGl2ZSB7IHN1bSB9KVxuICAgICAgICA7O1xuXG4gICAgICAgIGxldCB4ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgMzsgNDsgNV1cbiAgICAgICAgdmFsIHggOiBtYXliZV9uZWdhdGl2ZSA9IEFsbF9ub25uZWdhdGl2ZSB7c3VtID0gMTV9XG5cbiAgICAgICAgbGV0IHkgPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAtMzsgNDsgNV1cbiAgICAgICAgdmFsIHkgOiBtYXliZV9uZWdhdGl2ZSA9IEZvdW5kX25lZ2F0aXZlIC0zXG4gICAgICBdfSAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGVyZSBleGlzdHMgYW4gZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkXG4gICAgICBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdLiBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBleGlzdHMgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdIGZvciBhbGxcbiAgICAgIGVsZW1lbnRzLiBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBmb3JfYWxsIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGNvdW50IDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gaW50XG5cbiAgKCoqIFJldHVybnMgdGhlIHN1bSBvZiBbZiBpXSBmb3IgYWxsIFtpXSBpbiB0aGUgY29udGFpbmVyLiAqKVxuICB2YWwgc3VtIDogKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pIC0+IHQgLT4gZjooZWx0IC0+ICdzdW0pIC0+ICdzdW1cblxuICAoKiogUmV0dXJucyBhcyBhbiBbb3B0aW9uXSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggW2ZdIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgZmluZCA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGVsdCBvcHRpb25cblxuICAoKiogUmV0dXJucyB0aGUgZmlyc3QgZXZhbHVhdGlvbiBvZiBbZl0gdGhhdCByZXR1cm5zIFtTb21lXSwgYW5kIHJldHVybnMgW05vbmVdIGlmIHRoZXJlXG4gICAgICBpcyBubyBzdWNoIGVsZW1lbnQuICAqKVxuICB2YWwgZmluZF9tYXAgOiB0IC0+IGY6KGVsdCAtPiAnYSBvcHRpb24pIC0+ICdhIG9wdGlvblxuXG4gIHZhbCB0b19saXN0IDogdCAtPiBlbHQgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiB0IC0+IGVsdCBhcnJheVxuXG4gICgqKiBSZXR1cm5zIGEgbWluIChyZXNwLiBtYXgpIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgW2NvbXBhcmVdXG4gICAgICBmdW5jdGlvbi4gSW4gY2FzZSBvZiBhIHRpZSwgdGhlIGZpcnN0IGVsZW1lbnQgZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGVcbiAgICAgIGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIFtmb2xkXSBzbyBpdCBoYXMgdGhlIHNhbWVcbiAgICAgIGNvbXBsZXhpdHkgYXMgW2ZvbGRdLiBSZXR1cm5zIFtOb25lXSBpZmYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuICopXG4gIHZhbCBtaW5fZWx0IDogdCAtPiBjb21wYXJlOihlbHQgLT4gZWx0IC0+IGludCkgLT4gZWx0IG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0IDogdCAtPiBjb21wYXJlOihlbHQgLT4gZWx0IC0+IGludCkgLT4gZWx0IG9wdGlvblxuZW5kXG5cbm1vZHVsZSB0eXBlIFMwX3BoYW50b20gPSBzaWdcbiAgdHlwZSBlbHRcbiAgdHlwZSAnYSB0XG5cbiAgKCoqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIHRoZXJlLCB1c2luZyBlcXVhbGl0eSBvbiBbZWx0XXMuICopXG4gIHZhbCBtZW0gOiBfIHQgLT4gZWx0IC0+IGJvb2xcblxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiBfIHQgLT4gYm9vbFxuICB2YWwgaXRlciA6IF8gdCAtPiBmOihlbHQgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBbZm9sZCB0IH5pbml0IH5mXSByZXR1cm5zIFtmICguLi4gZiAoZiAoZiBpbml0IGUxKSBlMikgZTMgLi4uKSBlbl0sIHdoZXJlIFtlMS4uZW5dXG4gICAgICBhcmUgdGhlIGVsZW1lbnRzIG9mIFt0XS4gKilcbiAgdmFsIGZvbGQgOiBfIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbZm9sZF9yZXN1bHQgdCB+aW5pdCB+Zl0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdIHRoYXQgcnVucyBpbiB0aGVcbiAgICAgIFtSZXN1bHRdIG1vbmFkLiAgSWYgW2ZdIHJldHVybnMgYW4gW0Vycm9yIF9dLCB0aGF0IHZhbHVlIGlzIHJldHVybmVkIHdpdGhvdXQgYW55XG4gICAgICBhZGRpdGlvbmFsIGludm9jYXRpb25zIG9mIFtmXS4gKilcbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgXyB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICAoKiogW2ZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0uIElmIFtmXVxuICAgICAgcmV0dXJucyBbU3RvcCBfXSB0aGUgY29tcHV0YXRpb24gY2Vhc2VzIGFuZCByZXN1bHRzIGluIHRoYXQgdmFsdWUuIElmIFtmXSByZXR1cm5zXG4gICAgICBbQ29udGludWUgX10sIHRoZSBmb2xkIHdpbGwgcHJvY2VlZC4gSWYgW2ZdIG5ldmVyIHJldHVybnMgW1N0b3AgX10sIHRoZSBmaW5hbCByZXN1bHRcbiAgICAgIGlzIGNvbXB1dGVkIGJ5IFtmaW5pc2hdLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIG1heWJlX25lZ2F0aXZlID1cbiAgICAgICAgICB8IEZvdW5kX25lZ2F0aXZlIG9mIGludFxuICAgICAgICAgIHwgQWxsX25vbm5lZ2F0aXZlIG9mIHsgc3VtIDogaW50IH1cblxuICAgICAgICAoKiogW2ZpcnN0X25lZ19vcl9zdW0gbGlzdF0gcmV0dXJucyB0aGUgZmlyc3QgbmVnYXRpdmUgbnVtYmVyIGluIFtsaXN0XSwgaWYgYW55LFxuICAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN1bSBvZiB0aGUgbGlzdC4gKilcbiAgICAgICAgbGV0IGZpcnN0X25lZ19vcl9zdW0gPVxuICAgICAgICAgIExpc3QuZm9sZF91bnRpbCB+aW5pdDowXG4gICAgICAgICAgICB+ZjooZnVuIHN1bSB4IC0+XG4gICAgICAgICAgICAgIGlmIHggPCAwXG4gICAgICAgICAgICAgIHRoZW4gU3RvcCAoRm91bmRfbmVnYXRpdmUgeClcbiAgICAgICAgICAgICAgZWxzZSBDb250aW51ZSAoc3VtICsgeCkpXG4gICAgICAgICAgICB+ZmluaXNoOihmdW4gc3VtIC0+IEFsbF9ub25uZWdhdGl2ZSB7IHN1bSB9KVxuICAgICAgICA7O1xuXG4gICAgICAgIGxldCB4ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgMzsgNDsgNV1cbiAgICAgICAgdmFsIHggOiBtYXliZV9uZWdhdGl2ZSA9IEFsbF9ub25uZWdhdGl2ZSB7c3VtID0gMTV9XG5cbiAgICAgICAgbGV0IHkgPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAtMzsgNDsgNV1cbiAgICAgICAgdmFsIHkgOiBtYXliZV9uZWdhdGl2ZSA9IEZvdW5kX25lZ2F0aXZlIC0zXG4gICAgICBdfSAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogIF8gdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGV4aXN0cyBhbiBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvdmlkZWRcbiAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0uICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBleGlzdHMgOiBfIHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0gZm9yIGFsbFxuICAgICAgZWxlbWVudHMuICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBmb3JfYWxsIDogXyB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgY291bnQgOiBfIHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGludFxuXG4gICgqKiBSZXR1cm5zIHRoZSBzdW0gb2YgW2YgaV0gZm9yIGFsbCBbaV0gaW4gdGhlIGNvbnRhaW5lci4gVGhlIG9yZGVyIGluIHdoaWNoIHRoZVxuICAgICAgZWxlbWVudHMgd2lsbCBiZSBzdW1tZWQgaXMgdW5zcGVjaWZpZWQuICopXG4gIHZhbCBzdW0gOiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSkgLT4gXyB0IC0+IGY6KGVsdCAtPiAnc3VtKSAtPiAnc3VtXG5cbiAgKCoqIFJldHVybnMgYXMgYW4gW29wdGlvbl0gdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIFtmXSBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGZpbmQgOiBfIHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGVsdCBvcHRpb25cblxuICAoKiogUmV0dXJucyB0aGUgZmlyc3QgZXZhbHVhdGlvbiBvZiBbZl0gdGhhdCByZXR1cm5zIFtTb21lXSwgYW5kIHJldHVybnMgW05vbmVdIGlmIHRoZXJlXG4gICAgICBpcyBubyBzdWNoIGVsZW1lbnQuICAqKVxuICB2YWwgZmluZF9tYXAgOiBfIHQgLT4gZjooZWx0IC0+ICdhIG9wdGlvbikgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIHRvX2xpc3QgOiBfIHQgLT4gZWx0IGxpc3RcbiAgdmFsIHRvX2FycmF5IDogXyB0IC0+IGVsdCBhcnJheVxuXG4gICgqKiBSZXR1cm5zIGEgbWluIChyZXNwIG1heCkgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBbY29tcGFyZV1cbiAgICAgIGZ1bmN0aW9uLCBvciBbTm9uZV0gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuICBJbiBjYXNlIG9mIGEgdGllLCB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGUgY29sbGVjdGlvbiBpcyByZXR1cm5lZC4gKilcbiAgdmFsIG1pbl9lbHQgOiBfIHQgLT4gY29tcGFyZTooZWx0IC0+IGVsdCAtPiBpbnQpIC0+IGVsdCBvcHRpb25cblxuICB2YWwgbWF4X2VsdCA6IF8gdCAtPiBjb21wYXJlOihlbHQgLT4gZWx0IC0+IGludCkgLT4gZWx0IG9wdGlvblxuZW5kXG5cbigqKiBTaWduYXR1cmUgZm9yIHBvbHltb3JwaGljIGNvbnRhaW5lciwgZS5nLiwgWydhIGxpc3RdIG9yIFsnYSBhcnJheV0uICopXG5tb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICB0eXBlICdhIHRcblxuICAoKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnQgaXMgdGhlcmUsIHVzaW5nIFtlcXVhbF0uICopXG4gIHZhbCBtZW0gOiAnYSB0IC0+ICdhIC0+IGVxdWFsOignYSAtPiAnYSAtPiBib29sKSAtPiBib29sXG5cbiAgdmFsIGxlbmd0aCA6ICdhIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6ICdhIHQgLT4gYm9vbFxuICB2YWwgaXRlciA6ICdhIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBbZm9sZCB0IH5pbml0IH5mXSByZXR1cm5zIFtmICguLi4gZiAoZiAoZiBpbml0IGUxKSBlMikgZTMgLi4uKSBlbl0sIHdoZXJlIFtlMS4uZW5dXG4gICAgICBhcmUgdGhlIGVsZW1lbnRzIG9mIFt0XSAgKilcbiAgdmFsIGZvbGQgOiAnYSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbZm9sZF9yZXN1bHQgdCB+aW5pdCB+Zl0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdIHRoYXQgcnVucyBpbiB0aGVcbiAgICAgIFtSZXN1bHRdIG1vbmFkLiAgSWYgW2ZdIHJldHVybnMgYW4gW0Vycm9yIF9dLCB0aGF0IHZhbHVlIGlzIHJldHVybmVkIHdpdGhvdXQgYW55XG4gICAgICBhZGRpdGlvbmFsIGludm9jYXRpb25zIG9mIFtmXS4gKilcbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICAoKiogW2ZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0uIElmIFtmXVxuICAgICAgcmV0dXJucyBbU3RvcCBfXSB0aGUgY29tcHV0YXRpb24gY2Vhc2VzIGFuZCByZXN1bHRzIGluIHRoYXQgdmFsdWUuIElmIFtmXSByZXR1cm5zXG4gICAgICBbQ29udGludWUgX10sIHRoZSBmb2xkIHdpbGwgcHJvY2VlZC4gSWYgW2ZdIG5ldmVyIHJldHVybnMgW1N0b3AgX10sIHRoZSBmaW5hbCByZXN1bHRcbiAgICAgIGlzIGNvbXB1dGVkIGJ5IFtmaW5pc2hdLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIG1heWJlX25lZ2F0aXZlID1cbiAgICAgICAgICB8IEZvdW5kX25lZ2F0aXZlIG9mIGludFxuICAgICAgICAgIHwgQWxsX25vbm5lZ2F0aXZlIG9mIHsgc3VtIDogaW50IH1cblxuICAgICAgICAoKiogW2ZpcnN0X25lZ19vcl9zdW0gbGlzdF0gcmV0dXJucyB0aGUgZmlyc3QgbmVnYXRpdmUgbnVtYmVyIGluIFtsaXN0XSwgaWYgYW55LFxuICAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN1bSBvZiB0aGUgbGlzdC4gKilcbiAgICAgICAgbGV0IGZpcnN0X25lZ19vcl9zdW0gPVxuICAgICAgICAgIExpc3QuZm9sZF91bnRpbCB+aW5pdDowXG4gICAgICAgICAgICB+ZjooZnVuIHN1bSB4IC0+XG4gICAgICAgICAgICAgIGlmIHggPCAwXG4gICAgICAgICAgICAgIHRoZW4gU3RvcCAoRm91bmRfbmVnYXRpdmUgeClcbiAgICAgICAgICAgICAgZWxzZSBDb250aW51ZSAoc3VtICsgeCkpXG4gICAgICAgICAgICB+ZmluaXNoOihmdW4gc3VtIC0+IEFsbF9ub25uZWdhdGl2ZSB7IHN1bSB9KVxuICAgICAgICA7O1xuXG4gICAgICAgIGxldCB4ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgMzsgNDsgNV1cbiAgICAgICAgdmFsIHggOiBtYXliZV9uZWdhdGl2ZSA9IEFsbF9ub25uZWdhdGl2ZSB7c3VtID0gMTV9XG5cbiAgICAgICAgbGV0IHkgPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAtMzsgNDsgNV1cbiAgICAgICAgdmFsIHkgOiBtYXliZV9uZWdhdGl2ZSA9IEZvdW5kX25lZ2F0aXZlIC0zXG4gICAgICBdfSAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGV4aXN0cyBhbiBlbGVtZW50IGZvciB3aGljaCB0aGUgcHJvdmlkZWRcbiAgICAgIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0uICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBleGlzdHMgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0gZm9yIGFsbFxuICAgICAgZWxlbWVudHMuICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBmb3JfYWxsIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgY291bnQgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGludFxuXG4gICgqKiBSZXR1cm5zIHRoZSBzdW0gb2YgW2YgaV0gZm9yIGFsbCBbaV0gaW4gdGhlIGNvbnRhaW5lci4gKilcbiAgdmFsIHN1bSA6IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKSAtPiAnYSB0IC0+IGY6KCdhIC0+ICdzdW0pIC0+ICdzdW1cblxuICAoKiogUmV0dXJucyBhcyBhbiBbb3B0aW9uXSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggW2ZdIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgZmluZCA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFJldHVybnMgdGhlIGZpcnN0IGV2YWx1YXRpb24gb2YgW2ZdIHRoYXQgcmV0dXJucyBbU29tZV0sIGFuZCByZXR1cm5zIFtOb25lXSBpZiB0aGVyZVxuICAgICAgaXMgbm8gc3VjaCBlbGVtZW50LiAgKilcbiAgdmFsIGZpbmRfbWFwIDogJ2EgdCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuXG4gIHZhbCB0b19saXN0IDogJ2EgdCAtPiAnYSBsaXN0XG4gIHZhbCB0b19hcnJheSA6ICdhIHQgLT4gJ2EgYXJyYXlcblxuICAoKiogUmV0dXJucyBhIG1pbmltdW0gKHJlc3AgbWF4aW11bSkgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZFxuICAgICAgW2NvbXBhcmVdIGZ1bmN0aW9uLCBvciBbTm9uZV0gaWYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuIEluIGNhc2Ugb2YgYSB0aWUsIHRoZSBmaXJzdFxuICAgICAgZWxlbWVudCBlbmNvdW50ZXJlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZSBjb2xsZWN0aW9uIGlzIHJldHVybmVkLiBUaGUgaW1wbGVtZW50YXRpb25cbiAgICAgIHVzZXMgW2ZvbGRdIHNvIGl0IGhhcyB0aGUgc2FtZSBjb21wbGV4aXR5IGFzIFtmb2xkXS4gKilcbiAgdmFsIG1pbl9lbHQgOiAnYSB0IC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludCkgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1heF9lbHQgOiAnYSB0IC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludCkgLT4gJ2Egb3B0aW9uXG5lbmRcblxubW9kdWxlIHR5cGUgUzFfcGhhbnRvbV9pbnZhcmlhbnQgPSBzaWdcbiAgdHlwZSAoJ2EsICdwaGFudG9tKSB0XG5cbiAgKCoqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIHRoZXJlLCB1c2luZyBbZXF1YWxdLiAqKVxuICB2YWwgbWVtIDogKCdhLCBfKSB0IC0+ICdhIC0+IGVxdWFsOignYSAtPiAnYSAtPiBib29sKSAtPiBib29sXG5cbiAgdmFsIGxlbmd0aCA6IChfLCBfKSB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBpdGVyIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogW2ZvbGQgdCB+aW5pdCB+Zl0gcmV0dXJucyBbZiAoLi4uIGYgKGYgKGYgaW5pdCBlMSkgZTIpIGUzIC4uLikgZW5dLCB3aGVyZSBbZTEuLmVuXVxuICAgICAgYXJlIHRoZSBlbGVtZW50cyBvZiBbdF0uICopXG4gIHZhbCBmb2xkIDogKCdhLCBfKSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbZm9sZF9yZXN1bHQgdCB+aW5pdCB+Zl0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdIHRoYXQgcnVucyBpbiB0aGVcbiAgICAgIFtSZXN1bHRdIG1vbmFkLiAgSWYgW2ZdIHJldHVybnMgYW4gW0Vycm9yIF9dLCB0aGF0IHZhbHVlIGlzIHJldHVybmVkIHdpdGhvdXQgYW55XG4gICAgICBhZGRpdGlvbmFsIGludm9jYXRpb25zIG9mIFtmXS4gKilcbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gICgqKiBbZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2hdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXS4gSWYgW2ZdXG4gICAgICByZXR1cm5zIFtTdG9wIF9dIHRoZSBjb21wdXRhdGlvbiBjZWFzZXMgYW5kIHJlc3VsdHMgaW4gdGhhdCB2YWx1ZS4gSWYgW2ZdIHJldHVybnNcbiAgICAgIFtDb250aW51ZSBfXSwgdGhlIGZvbGQgd2lsbCBwcm9jZWVkLiBJZiBbZl0gbmV2ZXIgcmV0dXJucyBbU3RvcCBfXSwgdGhlIGZpbmFsIHJlc3VsdFxuICAgICAgaXMgY29tcHV0ZWQgYnkgW2ZpbmlzaF0uXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgbWF5YmVfbmVnYXRpdmUgPVxuICAgICAgICAgIHwgRm91bmRfbmVnYXRpdmUgb2YgaW50XG4gICAgICAgICAgfCBBbGxfbm9ubmVnYXRpdmUgb2YgeyBzdW0gOiBpbnQgfVxuXG4gICAgICAgICgqKiBbZmlyc3RfbmVnX29yX3N1bSBsaXN0XSByZXR1cm5zIHRoZSBmaXJzdCBuZWdhdGl2ZSBudW1iZXIgaW4gW2xpc3RdLCBpZiBhbnksXG4gICAgICAgICAgICBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3VtIG9mIHRoZSBsaXN0LiAqKVxuICAgICAgICBsZXQgZmlyc3RfbmVnX29yX3N1bSA9XG4gICAgICAgICAgTGlzdC5mb2xkX3VudGlsIH5pbml0OjBcbiAgICAgICAgICAgIH5mOihmdW4gc3VtIHggLT5cbiAgICAgICAgICAgICAgaWYgeCA8IDBcbiAgICAgICAgICAgICAgdGhlbiBTdG9wIChGb3VuZF9uZWdhdGl2ZSB4KVxuICAgICAgICAgICAgICBlbHNlIENvbnRpbnVlIChzdW0gKyB4KSlcbiAgICAgICAgICAgIH5maW5pc2g6KGZ1biBzdW0gLT4gQWxsX25vbm5lZ2F0aXZlIHsgc3VtIH0pXG4gICAgICAgIDs7XG5cbiAgICAgICAgbGV0IHggPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAzOyA0OyA1XVxuICAgICAgICB2YWwgeCA6IG1heWJlX25lZ2F0aXZlID0gQWxsX25vbm5lZ2F0aXZlIHtzdW0gPSAxNX1cblxuICAgICAgICBsZXQgeSA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IC0zOyA0OyA1XVxuICAgICAgICB2YWwgeSA6IG1heWJlX25lZ2F0aXZlID0gRm91bmRfbmVnYXRpdmUgLTNcbiAgICAgIF19ICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGVyZSBleGlzdHMgYW4gZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkXG4gICAgICBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZXhpc3RzIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byBbdHJ1ZV0gZm9yIGFsbFxuICAgICAgZWxlbWVudHMuICBUaGlzIGlzIGEgc2hvcnQtY2lyY3VpdGluZyBvcGVyYXRpb24uICopXG4gIHZhbCBmb3JfYWxsIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBjb3VudCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBpbnRcblxuICAoKiogUmV0dXJucyB0aGUgc3VtIG9mIFtmIGldIGZvciBhbGwgW2ldIGluIHRoZSBjb250YWluZXIuICopXG4gIHZhbCBzdW0gOiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSkgLT4gKCdhLCBfKSB0IC0+IGY6KCdhIC0+ICdzdW0pIC0+ICdzdW1cblxuICAoKiogUmV0dXJucyBhcyBhbiBbb3B0aW9uXSB0aGUgZmlyc3QgZWxlbWVudCBmb3Igd2hpY2ggW2ZdIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgZmluZCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSBvcHRpb25cblxuICAoKiogUmV0dXJucyB0aGUgZmlyc3QgZXZhbHVhdGlvbiBvZiBbZl0gdGhhdCByZXR1cm5zIFtTb21lXSwgYW5kIHJldHVybnMgW05vbmVdIGlmIHRoZXJlXG4gICAgICBpcyBubyBzdWNoIGVsZW1lbnQuICAqKVxuICB2YWwgZmluZF9tYXAgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cblxuICB2YWwgdG9fbGlzdCA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCB0b19hcnJheSA6ICgnYSwgXykgdCAtPiAnYSBhcnJheVxuXG4gICgqKiBSZXR1cm5zIGEgbWluIChyZXNwIG1heCkgZWxlbWVudCBmcm9tIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBbY29tcGFyZV1cbiAgICAgIGZ1bmN0aW9uLiBJbiBjYXNlIG9mIGEgdGllLCB0aGUgZmlyc3QgZWxlbWVudCBlbmNvdW50ZXJlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZVxuICAgICAgY29sbGVjdGlvbiBpcyByZXR1cm5lZC4gVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgW2ZvbGRdIHNvIGl0IGhhcyB0aGUgc2FtZSBjb21wbGV4aXR5XG4gICAgICBhcyBbZm9sZF0uIFJldHVybnMgW05vbmVdIGlmZiB0aGUgY29sbGVjdGlvbiBpcyBlbXB0eS4gKilcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBvcHRpb25cblxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpIC0+ICdhIG9wdGlvblxuZW5kXG5cbm1vZHVsZSB0eXBlIFMxX3BoYW50b20gPSBzaWdcbiAgdHlwZSAoJ2EsICsncGhhbnRvbSkgdFxuXG4gIGluY2x1ZGUgUzFfcGhhbnRvbV9pbnZhcmlhbnQgd2l0aCB0eXBlICgnYSwgJ3BoYW50b20pIHQgOj0gKCdhLCAncGhhbnRvbSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEdlbmVyaWMgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2EgZWx0XG5cbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogXyB0IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBmb2xkIDogJ2EgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZXhpc3RzIDogJ2EgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbCA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogJ2EgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBzdW0gOiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSkgLT4gJ2EgdCAtPiBmOignYSBlbHQgLT4gJ3N1bSkgLT4gJ3N1bVxuICB2YWwgZmluZCA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIGZpbmRfbWFwIDogJ2EgdCAtPiBmOignYSBlbHQgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cbiAgdmFsIHRvX2xpc3QgOiAnYSB0IC0+ICdhIGVsdCBsaXN0XG4gIHZhbCB0b19hcnJheSA6ICdhIHQgLT4gJ2EgZWx0IGFycmF5XG4gIHZhbCBtaW5fZWx0IDogJ2EgdCAtPiBjb21wYXJlOignYSBlbHQgLT4gJ2EgZWx0IC0+IGludCkgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgbWF4X2VsdCA6ICdhIHQgLT4gY29tcGFyZTooJ2EgZWx0IC0+ICdhIGVsdCAtPiBpbnQpIC0+ICdhIGVsdCBvcHRpb25cbmVuZFxuXG5tb2R1bGUgdHlwZSBHZW5lcmljX3BoYW50b20gPSBzaWdcbiAgdHlwZSAoJ2EsICdwaGFudG9tKSB0XG4gIHR5cGUgJ2EgZWx0XG5cbiAgdmFsIGxlbmd0aCA6IChfLCBfKSB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBpdGVyIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBmb2xkIDogKCdhLCBfKSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZXhpc3RzIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gaW50XG5cbiAgdmFsIHN1bVxuICAgIDogIChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKVxuICAgIC0+ICgnYSwgXykgdFxuICAgIC0+IGY6KCdhIGVsdCAtPiAnc3VtKVxuICAgIC0+ICdzdW1cblxuICB2YWwgZmluZCA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgZmluZF9tYXAgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG4gIHZhbCB0b19saXN0IDogKCdhLCBfKSB0IC0+ICdhIGVsdCBsaXN0XG4gIHZhbCB0b19hcnJheSA6ICgnYSwgXykgdCAtPiAnYSBlbHQgYXJyYXlcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gY29tcGFyZTooJ2EgZWx0IC0+ICdhIGVsdCAtPiBpbnQpIC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gY29tcGFyZTooJ2EgZWx0IC0+ICdhIGVsdCAtPiBpbnQpIC0+ICdhIGVsdCBvcHRpb25cbmVuZFxuXG5tb2R1bGUgdHlwZSBNYWtlX2dlbl9hcmcgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2EgZWx0XG5cbiAgdmFsIGZvbGQgOiAnYSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogVGhlIFtpdGVyXSBhcmd1bWVudCB0byBbQ29udGFpbmVyLk1ha2VdIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHRoZVxuICAgICAgY29udGFpbmVyJ3MgW2l0ZXJdIGZ1bmN0aW9uLiAgW2BEZWZpbmVfdXNpbmdfZm9sZF0gbWVhbnMgdG8gZGVmaW5lIFtpdGVyXVxuICAgICAgdmlhOlxuXG4gICAgICB7W1xuICAgICAgICBpdGVyIHQgfmYgPSBDb250YWluZXIuaXRlciB+Zm9sZCB0IH5mXG4gICAgICBdfVxuXG4gICAgICBbYEN1c3RvbV0gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBwcmVzdW1hYmx5IHdpdGggc29tZXRoaW5nIG1vcmVcbiAgICAgIGVmZmljaWVudC4gIFNldmVyYWwgb3RoZXIgZnVuY3Rpb25zIHJldHVybmVkIGJ5IFtDb250YWluZXIuTWFrZV0gYXJlIGRlZmluZWQgaW5cbiAgICAgIHRlcm1zIG9mIFtpdGVyXSwgc28gcGFzc2luZyBpbiBhIG1vcmUgZWZmaWNpZW50IFtpdGVyXSB3aWxsIGltcHJvdmUgdGhlaXIgZWZmaWNpZW5jeVxuICAgICAgYXMgd2VsbC4gKilcbiAgdmFsIGl0ZXIgOiBbIGBEZWZpbmVfdXNpbmdfZm9sZCB8IGBDdXN0b20gb2YgJ2EgdCAtPiBmOignYSBlbHQgLT4gdW5pdCkgLT4gdW5pdCBdXG5cbiAgKCoqIFRoZSBbbGVuZ3RoXSBhcmd1bWVudCB0byBbQ29udGFpbmVyLk1ha2VdIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHRoZVxuICAgICAgY29udGFpbmVyJ3MgW2xlbmd0aF0gZnVuY3Rpb24uICBbYERlZmluZV91c2luZ19mb2xkXSBtZWFucyB0byBkZWZpbmVcbiAgICAgIFtsZW5ndGhdIHZpYTpcblxuICAgICAge1tcbiAgICAgICAgbGVuZ3RoIHQgfmYgPSBDb250YWluZXIubGVuZ3RoIH5mb2xkIHQgfmZcbiAgICAgIF19XG5cbiAgICAgIFtgQ3VzdG9tXSBvdmVycmlkZXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24sIHByZXN1bWFibHkgd2l0aCBzb21ldGhpbmcgbW9yZVxuICAgICAgZWZmaWNpZW50LiAgU2V2ZXJhbCBvdGhlciBmdW5jdGlvbnMgcmV0dXJuZWQgYnkgW0NvbnRhaW5lci5NYWtlXSBhcmUgZGVmaW5lZCBpblxuICAgICAgdGVybXMgb2YgW2xlbmd0aF0sIHNvIHBhc3NpbmcgaW4gYSBtb3JlIGVmZmljaWVudCBbbGVuZ3RoXSB3aWxsIGltcHJvdmUgdGhlaXJcbiAgICAgIGVmZmljaWVuY3kgYXMgd2VsbC4gKilcbiAgdmFsIGxlbmd0aCA6IFsgYERlZmluZV91c2luZ19mb2xkIHwgYEN1c3RvbSBvZiAnYSB0IC0+IGludCBdXG5lbmRcblxubW9kdWxlIHR5cGUgTWFrZV9hcmcgPSBNYWtlX2dlbl9hcmcgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBNb25hZC5JZGVudC50XG5cbm1vZHVsZSB0eXBlIE1ha2UwX2FyZyA9IHNpZ1xuICBtb2R1bGUgRWx0IDogc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgZXF1YWwgOiB0IC0+IHQgLT4gYm9vbFxuICBlbmRcblxuICB0eXBlIHRcblxuICBpbmNsdWRlIE1ha2VfZ2VuX2FyZyB3aXRoIHR5cGUgJ2EgdCA6PSB0IGFuZCB0eXBlICdhIGVsdCA6PSBFbHQudFxuZW5kXG5cbm1vZHVsZSB0eXBlIENvbnRhaW5lciA9IHNpZ1xuICBpbmNsdWRlIG1vZHVsZSB0eXBlIG9mIHN0cnVjdFxuICAgIGluY2x1ZGUgRXhwb3J0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMwID0gUzBcbiAgbW9kdWxlIHR5cGUgUzBfcGhhbnRvbSA9IFMwX3BoYW50b21cbiAgbW9kdWxlIHR5cGUgUzEgPSBTMVxuICBtb2R1bGUgdHlwZSBTMV9waGFudG9tX2ludmFyaWFudCA9IFMxX3BoYW50b21faW52YXJpYW50XG4gIG1vZHVsZSB0eXBlIFMxX3BoYW50b20gPSBTMV9waGFudG9tXG4gIG1vZHVsZSB0eXBlIEdlbmVyaWMgPSBHZW5lcmljXG4gIG1vZHVsZSB0eXBlIEdlbmVyaWNfcGhhbnRvbSA9IEdlbmVyaWNfcGhhbnRvbVxuICBtb2R1bGUgdHlwZSBTdW1tYWJsZSA9IFN1bW1hYmxlXG5cbiAgKCoqIEdlbmVyaWMgZGVmaW5pdGlvbnMgb2YgY29udGFpbmVyIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgW2ZvbGRdLlxuXG4gICAgICBFLmcuOiBbaXRlciB+Zm9sZCB0IH5mID0gZm9sZCB0IH5pbml0OigpIH5mOihmdW4gKCkgYSAtPiBmIGEpXS4gKilcblxuICB0eXBlICgndCwgJ2EsICdhY2N1bSkgZm9sZCA9ICd0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuICB0eXBlICgndCwgJ2EpIGl0ZXIgPSAndCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIHR5cGUgJ3QgbGVuZ3RoID0gJ3QgLT4gaW50XG5cbiAgdmFsIGl0ZXIgOiBmb2xkOigndCwgJ2EsIHVuaXQpIGZvbGQgLT4gKCd0LCAnYSkgaXRlclxuICB2YWwgY291bnQgOiBmb2xkOigndCwgJ2EsIGludCkgZm9sZCAtPiAndCAtPiBmOignYSAtPiBib29sKSAtPiBpbnRcblxuICB2YWwgbWluX2VsdFxuICAgIDogIGZvbGQ6KCd0LCAnYSwgJ2Egb3B0aW9uKSBmb2xkXG4gICAgLT4gJ3RcbiAgICAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpXG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1heF9lbHRcbiAgICA6ICBmb2xkOigndCwgJ2EsICdhIG9wdGlvbikgZm9sZFxuICAgIC0+ICd0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KVxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBsZW5ndGggOiBmb2xkOigndCwgXywgaW50KSBmb2xkIC0+ICd0IC0+IGludFxuICB2YWwgdG9fbGlzdCA6IGZvbGQ6KCd0LCAnYSwgJ2EgbGlzdCkgZm9sZCAtPiAndCAtPiAnYSBsaXN0XG5cbiAgdmFsIHN1bVxuICAgIDogIGZvbGQ6KCd0LCAnYSwgJ3N1bSkgZm9sZFxuICAgIC0+IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKVxuICAgIC0+ICd0XG4gICAgLT4gZjooJ2EgLT4gJ3N1bSlcbiAgICAtPiAnc3VtXG5cbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgZm9sZDooJ3QsICdhLCAnYikgZm9sZFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiAnYSAtPiAoJ2IsICdlKSBSZXN1bHQudClcbiAgICAtPiAndFxuICAgIC0+ICgnYiwgJ2UpIFJlc3VsdC50XG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICBmb2xkOigndCwgJ2EsICdiKSBmb2xkXG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+ICdhIC0+ICgnYiwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYiAtPiAnZmluYWwpXG4gICAgLT4gJ3RcbiAgICAtPiAnZmluYWxcblxuICAoKiogR2VuZXJpYyBkZWZpbml0aW9ucyBvZiBjb250YWluZXIgb3BlcmF0aW9ucyBpbiB0ZXJtcyBvZiBbaXRlcl0gYW5kIFtsZW5ndGhdLiAqKVxuICB2YWwgaXNfZW1wdHkgOiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gYm9vbFxuXG4gIHZhbCBleGlzdHMgOiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbCA6IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmaW5kIDogaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIG9wdGlvblxuICB2YWwgZmluZF9tYXAgOiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cbiAgdmFsIHRvX2FycmF5IDogbGVuZ3RoOid0IGxlbmd0aCAtPiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gJ2EgYXJyYXlcblxuICAoKiogVGhlIGlkaW9tIGZvciB1c2luZyBbQ29udGFpbmVyLk1ha2VdIGlzIHRvIGJpbmQgdGhlIHJlc3VsdGluZyBtb2R1bGUgYW5kIHRvXG4gICAgICBleHBsaWNpdGx5IGltcG9ydCBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgdGhhdCBvbmUgd2FudHM6XG5cbiAgICAgIHtbXG4gICAgICAgIG1vZHVsZSBDID0gQ29udGFpbmVyLk1ha2UgKHN0cnVjdCAuLi4gZW5kKVxuICAgICAgICBsZXQgY291bnQgICAgPSBDLmNvdW50XG4gICAgICAgIGxldCBleGlzdHMgICA9IEMuZXhpc3RzXG4gICAgICAgIGxldCBmaW5kICAgICA9IEMuZmluZFxuICAgICAgICAoKiAuLi4gKilcbiAgICAgIF19XG5cbiAgICAgIFRoaXMgaXMgcHJlZmVyYWJsZSB0bzpcblxuICAgICAge1tcbiAgICAgICAgaW5jbHVkZSBDb250YWluZXIuTWFrZSAoc3RydWN0IC4uLiBlbmQpXG4gICAgICBdfVxuXG4gICAgICBiZWNhdXNlIHRoZSBbaW5jbHVkZV0gbWFrZXMgaXQgdG9vIGVhc3kgdG8gc2hhZG93IHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucyBvZlxuICAgICAgY29udGFpbmVyIGZ1bmN0aW9ucyAoW2xlbmd0aF0gYmVpbmcgYSBjb21tb24gb25lKS5cblxuICAgICAgW0NvbnRhaW5lci5NYWtlMF0gaXMgbGlrZSBbQ29udGFpbmVyLk1ha2VdLCBidXQgZm9yIG1vbm9tb3JwaGljIGNvbnRhaW5lcnMgbGlrZVxuICAgICAgW3N0cmluZ10uICopXG4gIG1vZHVsZSBNYWtlIChUIDogTWFrZV9hcmcpIDogUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgVC50XG5cbiAgbW9kdWxlIE1ha2UwIChUIDogTWFrZTBfYXJnKSA6IFMwIHdpdGggdHlwZSB0IDo9IFQudCBhbmQgdHlwZSBlbHQgOj0gVC5FbHQudFxuXG4gIG1vZHVsZSBNYWtlX2dlbiAoVCA6IE1ha2VfZ2VuX2FyZykgOlxuICAgIEdlbmVyaWMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgVC50IGFuZCB0eXBlICdhIGVsdCA6PSAnYSBULmVsdFxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxubW9kdWxlIExpc3QgPSBMaXN0MFxuaW5jbHVkZSBDb250YWluZXJfaW50ZlxuXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxuXG50eXBlICgndCwgJ2EsICdhY2N1bSkgZm9sZCA9ICd0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxudHlwZSAoJ3QsICdhKSBpdGVyID0gJ3QgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxudHlwZSAndCBsZW5ndGggPSAndCAtPiBpbnRcblxubGV0IGl0ZXIgfmZvbGQgdCB+ZiA9IGZvbGQgdCB+aW5pdDooKSB+ZjooZnVuICgpIGEgLT4gZiBhKVxubGV0IGNvdW50IH5mb2xkIHQgfmYgPSBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIG4gYSAtPiBpZiBmIGEgdGhlbiBuICsgMSBlbHNlIG4pXG5cbmxldCBzdW0gKHR5cGUgYSkgfmZvbGQgKG1vZHVsZSBNIDogU3VtbWFibGUgd2l0aCB0eXBlIHQgPSBhKSB0IH5mID1cbiAgZm9sZCB0IH5pbml0Ok0uemVybyB+ZjooZnVuIG4gYSAtPiBNLiggKyApIG4gKGYgYSkpXG47O1xuXG5sZXQgZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdCA9XG4gIHdpdGhfcmV0dXJuIChmdW4geyByZXR1cm4gfSAtPlxuICAgIFJlc3VsdC5Pa1xuICAgICAgKGZvbGQgdCB+aW5pdCB+ZjooZnVuIGFjYyBpdGVtIC0+XG4gICAgICAgICBtYXRjaCBmIGFjYyBpdGVtIHdpdGhcbiAgICAgICAgIHwgUmVzdWx0Lk9rIHggLT4geFxuICAgICAgICAgfCBFcnJvciBfIGFzIGUgLT4gcmV0dXJuIGUpKSlcbjs7XG5cbmxldCBmb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIH5maW5pc2ggdCA9XG4gIHdpdGhfcmV0dXJuIChmdW4geyByZXR1cm4gfSAtPlxuICAgIGZpbmlzaFxuICAgICAgKGZvbGQgdCB+aW5pdCB+ZjooZnVuIGFjYyBpdGVtIC0+XG4gICAgICAgICBtYXRjaCBmIGFjYyBpdGVtIHdpdGhcbiAgICAgICAgIHwgQ29udGludWVfb3Jfc3RvcC5Db250aW51ZSB4IC0+IHhcbiAgICAgICAgIHwgU3RvcCB4IC0+IHJldHVybiB4KSkpXG47O1xuXG5sZXQgbWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlID1cbiAgZm9sZCB0IH5pbml0Ok5vbmUgfmY6KGZ1biBhY2MgZWx0IC0+XG4gICAgbWF0Y2ggYWNjIHdpdGhcbiAgICB8IE5vbmUgLT4gU29tZSBlbHRcbiAgICB8IFNvbWUgbWluIC0+IGlmIGNvbXBhcmUgbWluIGVsdCA+IDAgdGhlbiBTb21lIGVsdCBlbHNlIGFjYylcbjs7XG5cbmxldCBtYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmUgPVxuICBmb2xkIHQgfmluaXQ6Tm9uZSB+ZjooZnVuIGFjYyBlbHQgLT5cbiAgICBtYXRjaCBhY2Mgd2l0aFxuICAgIHwgTm9uZSAtPiBTb21lIGVsdFxuICAgIHwgU29tZSBtYXggLT4gaWYgY29tcGFyZSBtYXggZWx0IDwgMCB0aGVuIFNvbWUgZWx0IGVsc2UgYWNjKVxuOztcblxubGV0IGxlbmd0aCB+Zm9sZCBjID0gZm9sZCBjIH5pbml0OjAgfmY6KGZ1biBhY2MgXyAtPiBhY2MgKyAxKVxuXG5sZXQgaXNfZW1wdHkgfml0ZXIgYyA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgYyB+ZjooZnVuIF8gLT4gci5yZXR1cm4gZmFsc2UpO1xuICAgIHRydWUpXG47O1xuXG5sZXQgZXhpc3RzIH5pdGVyIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyIGMgfmY6KGZ1biB4IC0+IGlmIGYgeCB0aGVuIHIucmV0dXJuIHRydWUpO1xuICAgIGZhbHNlKVxuOztcblxubGV0IGZvcl9hbGwgfml0ZXIgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgYyB+ZjooZnVuIHggLT4gaWYgbm90IChmIHgpIHRoZW4gci5yZXR1cm4gZmFsc2UpO1xuICAgIHRydWUpXG47O1xuXG5sZXQgZmluZF9tYXAgfml0ZXIgdCB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgdCB+ZjooZnVuIHggLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gKClcbiAgICAgIHwgU29tZSBfIGFzIHJlcyAtPiByLnJldHVybiByZXMpO1xuICAgIE5vbmUpXG47O1xuXG5sZXQgZmluZCB+aXRlciBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciBjIH5mOihmdW4geCAtPiBpZiBmIHggdGhlbiByLnJldHVybiAoU29tZSB4KSk7XG4gICAgTm9uZSlcbjs7XG5cbmxldCB0b19saXN0IH5mb2xkIGMgPSBMaXN0LnJldiAoZm9sZCBjIH5pbml0OltdIH5mOihmdW4gYWNjIHggLT4geCA6OiBhY2MpKVxuXG5sZXQgdG9fYXJyYXkgfmxlbmd0aCB+aXRlciBjID1cbiAgbGV0IGFycmF5ID0gcmVmIFt8fF0gaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICBpdGVyIGMgfmY6KGZ1biB4IC0+XG4gICAgaWYgIWkgPSAwIHRoZW4gYXJyYXkgOj0gQXJyYXkuY3JlYXRlIH5sZW46KGxlbmd0aCBjKSB4O1xuICAgICFhcnJheS4oIWkpIDwtIHg7XG4gICAgaW5jciBpKTtcbiAgIWFycmF5XG47O1xuXG5tb2R1bGUgTWFrZV9nZW4gKFQgOiBNYWtlX2dlbl9hcmcpIDogc2lnXG4gIGluY2x1ZGUgR2VuZXJpYyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBULnQgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBULmVsdFxuZW5kID0gc3RydWN0XG4gIGxldCBmb2xkID0gVC5mb2xkXG5cbiAgbGV0IGl0ZXIgPVxuICAgIG1hdGNoIFQuaXRlciB3aXRoXG4gICAgfCBgQ3VzdG9tIGl0ZXIgLT4gaXRlclxuICAgIHwgYERlZmluZV91c2luZ19mb2xkIC0+IGZ1biB0IH5mIC0+IGl0ZXIgfmZvbGQgdCB+ZlxuICA7O1xuXG4gIGxldCBsZW5ndGggPVxuICAgIG1hdGNoIFQubGVuZ3RoIHdpdGhcbiAgICB8IGBDdXN0b20gbGVuZ3RoIC0+IGxlbmd0aFxuICAgIHwgYERlZmluZV91c2luZ19mb2xkIC0+IGZ1biB0IC0+IGxlbmd0aCB+Zm9sZCB0XG4gIDs7XG5cbiAgbGV0IGlzX2VtcHR5IHQgPSBpc19lbXB0eSB+aXRlciB0XG4gIGxldCBzdW0gbSB0ID0gc3VtIH5mb2xkIG0gdFxuICBsZXQgY291bnQgdCB+ZiA9IGNvdW50IH5mb2xkIHQgfmZcbiAgbGV0IGV4aXN0cyB0IH5mID0gZXhpc3RzIH5pdGVyIHQgfmZcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IGZvcl9hbGwgfml0ZXIgdCB+ZlxuICBsZXQgZmluZF9tYXAgdCB+ZiA9IGZpbmRfbWFwIH5pdGVyIHQgfmZcbiAgbGV0IGZpbmQgdCB+ZiA9IGZpbmQgfml0ZXIgdCB+ZlxuICBsZXQgdG9fbGlzdCB0ID0gdG9fbGlzdCB+Zm9sZCB0XG4gIGxldCB0b19hcnJheSB0ID0gdG9fYXJyYXkgfmxlbmd0aCB+aXRlciB0XG4gIGxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBtaW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbiAgbGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IG1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuICBsZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IGZvbGRfcmVzdWx0IHQgfmZvbGQgfmluaXQgfmZcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoID0gZm9sZF91bnRpbCB0IH5mb2xkIH5pbml0IH5mIH5maW5pc2hcbmVuZFxuXG5tb2R1bGUgTWFrZSAoVCA6IE1ha2VfYXJnKSA9IHN0cnVjdFxuICBpbmNsdWRlIE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgVFxuXG4gICAgICB0eXBlICdhIGVsdCA9ICdhXG4gICAgZW5kKVxuXG4gIGxldCBtZW0gdCBhIH5lcXVhbCA9IGV4aXN0cyB0IH5mOihlcXVhbCBhKVxuZW5kXG5cbm1vZHVsZSBNYWtlMCAoVCA6IE1ha2UwX2FyZykgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBNYWtlX2dlbiAoc3RydWN0XG4gICAgICBpbmNsdWRlIFRcblxuICAgICAgdHlwZSAnYSB0ID0gVC50XG4gICAgICB0eXBlICdhIGVsdCA9IFQuRWx0LnRcbiAgICBlbmQpXG5cbiAgbGV0IG1lbSB0IGVsdCA9IGV4aXN0cyB0IH5mOihULkVsdC5lcXVhbCBlbHQpXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBDYW1sLkxhenlcblxudHlwZSAnYSB0ID0gJ2EgbGF6eV90IFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPSBsYXp5X3Rfb2Zfc2V4cFxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9IHNleHBfb2ZfbGF6eV90XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IGxhenlfdF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuOztcblxuW0BAQGVuZF1cblxubGV0IG1hcCB0IH5mID0gbGF6eSAoZiAoZm9yY2UgdCkpXG5cbmxldCBjb21wYXJlIGNvbXBhcmVfYSB0MSB0MiA9XG4gIGlmIHBoeXNfZXF1YWwgdDEgdDIgdGhlbiAwIGVsc2UgY29tcGFyZV9hIChmb3JjZSB0MSkgKGZvcmNlIHQyKVxuOztcblxubGV0IGVxdWFsIGVxdWFsX2EgdDEgdDIgPSBpZiBwaHlzX2VxdWFsIHQxIHQyIHRoZW4gdHJ1ZSBlbHNlIGVxdWFsX2EgKGZvcmNlIHQxKSAoZm9yY2UgdDIpXG5sZXQgaGFzaF9mb2xkX3QgPSBIYXNoLkJ1aWx0aW4uaGFzaF9mb2xkX2xhenlfdFxuXG5pbmNsdWRlIE1vbmFkLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgcmV0dXJuIHggPSBmcm9tX3ZhbCB4XG4gICAgbGV0IGJpbmQgdCB+ZiA9IGxhenkgKGZvcmNlIChmIChmb3JjZSB0KSkpXG4gICAgbGV0IG1hcCA9IG1hcFxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICBlbmQpXG5cbm1vZHVsZSBUX3VuZm9yY2luZyA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPVxuICAgIGlmIGlzX3ZhbCB0IHRoZW4gc2V4cF9vZl9hIChmb3JjZSB0KSBlbHNlIHNleHBfb2Zfc3RyaW5nIFwiPHVuZm9yY2VkIGxhenk+XCJcbiAgOztcbmVuZFxuIiwiKCogU3BsaXQgb2ZmIHRvIGF2b2lkIGEgY3ljbGljIGRlcGVuZGVuY3kgd2l0aCBbT3JfZXJyb3JdLiAqKVxuXG5vcGVuISBJbXBvcnRcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcblxubGV0IHNsb3dfY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGggPVxuICBpZiBwb3MgPCAwIHRoZW4gaW52YWxpZF9hcmdmIFwiTmVnYXRpdmUgcG9zaXRpb246ICVkXCIgcG9zICgpO1xuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmdmIFwiTmVnYXRpdmUgbGVuZ3RoOiAlZFwiIGxlbiAoKTtcbiAgKCogV2UgdXNlIFtwb3MgPiB0b3RhbF9sZW5ndGggLSBsZW5dIHJhdGhlciB0aGFuIFtwb3MgKyBsZW4gPiB0b3RhbF9sZW5ndGhdIHRvIGF2b2lkIHRoZVxuICAgICBwb3NzaWJpbGl0eSBvZiBvdmVyZmxvdy4gKilcbiAgaWYgcG9zID4gdG90YWxfbGVuZ3RoIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmdmIFwicG9zICsgbGVuIHBhc3QgZW5kOiAlZCArICVkID4gJWRcIiBwb3MgbGVuIHRvdGFsX2xlbmd0aCAoKVxuW0BAY29sZF0gW0BAaW5saW5lIG5ldmVyXSBbQEBsb2NhbCBuZXZlcl0gW0BAc3BlY2lhbGlzZSBuZXZlcl1cbjs7XG5cbmxldCBjaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aCA9XG4gICgqIFRoaXMgaXMgYmV0dGVyIHRoYW4gW3Nsb3dfY2hlY2tfcG9zX2xlbl9leG5dIGZvciB0d28gcmVhc29uczpcblxuICAgICAtIG11Y2ggbGVzcyBpbmxpbmVkIGNvZGVcbiAgICAgLSBvbmx5IG9uZSBjb25kaXRpb25hbCBqdW1wXG5cbiAgICAgVGhlIHJlYXNvbiBpdCB3b3JrcyBpcyB0aGF0IGNoZWNraW5nIFs8IDBdIGlzIHRlc3RpbmcgdGhlIGhpZ2hlc3Qgb3JkZXIgYml0LCBzb1xuICAgICBbYSA8IDAgfHwgYiA8IDBdIGlzIHRoZSBzYW1lIGFzIFthIGxvciBiIDwgMF0uXG5cbiAgICAgW3BvcyArIGxlbl0gY2FuIG92ZXJmbG93LCBzbyBbcG9zID4gdG90YWxfbGVuZ3RoIC0gbGVuXSBpcyBub3QgZXF1aXZhbGVudCB0b1xuICAgICBbdG90YWxfbGVuZ3RoIC0gbGVuIC0gcG9zIDwgMF0sIHdlIG5lZWQgdG8gdGVzdCBmb3IgW3BvcyArIGxlbl0gb3ZlcmZsb3cgYXNcbiAgICAgd2VsbC4gKilcbiAgbGV0IHN0b3AgPSBwb3MgKyBsZW4gaW5cbiAgaWYgcG9zIGxvciBsZW4gbG9yIHN0b3AgbG9yICh0b3RhbF9sZW5ndGggLSBzdG9wKSA8IDBcbiAgdGhlbiBzbG93X2NoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoXG47O1xuXG5sZXQgZ2V0X3Bvc19sZW5fZXhuID8ocG9zID0gMCkgP2xlbiAoKSB+dG90YWxfbGVuZ3RoID1cbiAgbGV0IGxlbiA9XG4gICAgbWF0Y2ggbGVuIHdpdGhcbiAgICB8IFNvbWUgaSAtPiBpXG4gICAgfCBOb25lIC0+IHRvdGFsX2xlbmd0aCAtIHBvc1xuICBpblxuICBjaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aDtcbiAgcG9zLCBsZW5cbjs7XG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGxldCBzbG93X2NoZWNrX3Bvc19sZW5fZXhuID0gc2xvd19jaGVja19wb3NfbGVuX2V4blxuZW5kXG4iLCJcbm1vZHVsZSBSZXByID0gc3RydWN0XG4gIG9wZW4gQ2FtbC5CaWdhcnJheVxuXG4gIHR5cGUgdCA9IChpbnQ2NCwgaW50NjRfZWx0LCBjX2xheW91dCkgQXJyYXkxLnRcblxuICBsZXQgb2Zfc3RhdGUgOiBDYW1sLlJhbmRvbS5TdGF0ZS50IC0+IHQgPSBDYW1sLk9iai5tYWdpY1xuZW5kXG5cbmxldCBhc3NpZ24gZHN0IHNyYyA9XG4gIGxldCBkc3QgPSBSZXByLm9mX3N0YXRlIChMYXp5LmZvcmNlIGRzdCkgaW5cbiAgbGV0IHNyYyA9IFJlcHIub2Zfc3RhdGUgKExhenkuZm9yY2Ugc3JjKSBpblxuICBDYW1sLkJpZ2FycmF5LkFycmF5MS5ibGl0IHNyYyBkc3RcblxubGV0IG1ha2VfZGVmYXVsdCBkZWZhdWx0ID1cbiAgbGV0IHNwbGl0X2Zyb21fcGFyZW50IHYgPVxuICAgIENhbWwuTGF6eS5tYXBfdmFsIENhbWwuUmFuZG9tLlN0YXRlLnNwbGl0IHZcbiAgaW5cbiAgQ2FtbC5Eb21haW4uRExTLm5ld19rZXkgfnNwbGl0X2Zyb21fcGFyZW50IChmdW4gKCkgLT4gZGVmYXVsdClcblxubGV0IGdldF9zdGF0ZSByYW5kb21fa2V5ID0gQ2FtbC5Eb21haW4uRExTLmdldCByYW5kb21fa2V5XG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBJbnQgPSBJbnQwXG5tb2R1bGUgQ2hhciA9IENoYXIwXG5cbigqIFVuZm9ydHVuYXRlbHksIGJlY2F1c2UgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZG9lcyBub3QgZXhwb3NlXG4gICBbQ2FtbC5SYW5kb20uU3RhdGUuZGVmYXVsdF0sIHdlIGhhdmUgdG8gY29uc3RydWN0IG91ciBvd24uICBXZSB0aGVuIGJ1aWxkIHRoZVxuICAgW0NhbWwuUmFuZG9tLmludF0sIFtDYW1sLlJhbmRvbS5ib29sXSBmdW5jdGlvbnMgYW5kIGZyaWVuZHMgdXNpbmcgdGhhdCBkZWZhdWx0IHN0YXRlIGluXG4gICBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB0aGUgc3RhbmRhcmQgbGlicmFyeS5cblxuICAgT25lIG90aGVyIHRyaWNraW5lc3MgaXMgdGhhdCB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgdW5leHBvc2VkIFtDYW1sLlJhbmRvbS5TdGF0ZS5hc3NpZ25dXG4gICBmdW5jdGlvbiwgd2hpY2ggYWNjZXNzZXMgdGhlIHVuZXhwb3NlZCBzdGF0ZSByZXByZXNlbnRhdGlvbi4gIFNvLCB3ZSBjb3B5IHRoZVxuICAgW1N0YXRlLnJlcHJdIHR5cGUgZGVmaW5pdGlvbiBhbmQgW2Fzc2lnbl0gZnVuY3Rpb24gdG8gaGVyZSBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LFxuICAgYW5kIHVzZSBbT2JqLm1hZ2ljXSB0byBnZXQgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLiAqKVxuXG4oKiBSZWdyZXNzaW9uIHRlc3RzIG91Z2h0IHRvIGJlIGRldGVybWluaXN0aWMgYmVjYXVzZSB0aGF0IHdheSBhbnlvbmUgd2hvIGJyZWFrcyB0aGUgdGVzdFxuICAga25vd3MgdGhhdCBpdCdzIHRoZWlyIGNvZGUgdGhhdCBicm9rZSB0aGUgdGVzdC4gIElmIHRlc3RzIGFyZSBub25kZXRlcm1pbmlzdGljLCBhIHRlc3RcbiAgIGZhaWx1cmUgbWF5IGluc3RlYWQgaGFwcGVuIGJlY2F1c2UgdGhlIHRlc3QgcnVubmVyIGdvdCB1bmx1Y2t5IGFuZCB1bmNvdmVyZWQgYW5cbiAgIGV4aXN0aW5nIGJ1ZyBpbiB0aGUgY29kZSBzdXBwb3NlZGx5IGJlaW5nIFwicHJvdGVjdGVkXCIgYnkgdGhlIHRlc3QgaW4gcXVlc3Rpb24uICopXG5sZXQgZm9yYmlkX25vbmRldGVybWluaXNtX2luX3Rlc3RzIH5hbGxvd19pbl90ZXN0cyA9XG4gIGlmIGFtX3Rlc3RpbmdcbiAgdGhlbiAoXG4gICAgbWF0Y2ggYWxsb3dfaW5fdGVzdHMgd2l0aFxuICAgIHwgU29tZSB0cnVlIC0+ICgpXG4gICAgfCBOb25lIHwgU29tZSBmYWxzZSAtPlxuICAgICAgZmFpbHdpdGhcbiAgICAgICAgXCJpbml0aWFsaXppbmcgUmFuZG9tIHdpdGggYSBub25kZXRlcm1pbmlzdGljIHNlZWQgaXMgZm9yYmlkZGVuIGluIGlubGluZSB0ZXN0c1wiKVxuOztcblxuZXh0ZXJuYWwgcmFuZG9tX3NlZWQgOiB1bml0IC0+IGludCBhcnJheSA9IFwiY2FtbF9zeXNfcmFuZG9tX3NlZWRcIlxuXG5sZXQgcmFuZG9tX3NlZWQgP2FsbG93X2luX3Rlc3RzICgpID1cbiAgZm9yYmlkX25vbmRldGVybWluaXNtX2luX3Rlc3RzIH5hbGxvd19pbl90ZXN0cztcbiAgcmFuZG9tX3NlZWQgKClcbjs7XG5cbm1vZHVsZSBTdGF0ZSA9IHN0cnVjdFxuICAoKiBXZSBhbGxvdyBsYXppbmVzcyBvbmx5IGZvciB0aGUgZGVmaW5pdGlvbiBvZiBbZGVmYXVsdF0sIGJlbG93LCB3aGljaCBtYXkgbGF6aWx5IGNhbGxcbiAgICAgW21ha2Vfc2VsZl9pbml0XS4gRm9yIGFsbCBvdGhlciBwdXJwb3Nlcywgd2UgY3JlYXRlIGFuZCB1c2UgW3RdIGVhZ2VybHkuICopXG4gIHR5cGUgdCA9IENhbWwuUmFuZG9tLlN0YXRlLnQgTGF6eS50XG5cbiAgbGV0IGJpdHMgdCA9IENhbWwuUmFuZG9tLlN0YXRlLmJpdHMgKExhenkuZm9yY2UgdClcbiAgbGV0IGJvb2wgdCA9IENhbWwuUmFuZG9tLlN0YXRlLmJvb2wgKExhenkuZm9yY2UgdClcbiAgbGV0IGludCB0IHggPSBDYW1sLlJhbmRvbS5TdGF0ZS5pbnQgKExhenkuZm9yY2UgdCkgeFxuICBsZXQgaW50MzIgdCB4ID0gQ2FtbC5SYW5kb20uU3RhdGUuaW50MzIgKExhenkuZm9yY2UgdCkgeFxuICBsZXQgaW50NjQgdCB4ID0gQ2FtbC5SYW5kb20uU3RhdGUuaW50NjQgKExhenkuZm9yY2UgdCkgeFxuICBsZXQgbmF0aXZlaW50IHQgeCA9IENhbWwuUmFuZG9tLlN0YXRlLm5hdGl2ZWludCAoTGF6eS5mb3JjZSB0KSB4XG4gIGxldCBtYWtlIHNlZWQgPSBMYXp5LmZyb21fdmFsIChDYW1sLlJhbmRvbS5TdGF0ZS5tYWtlIHNlZWQpXG4gIGxldCBjb3B5IHQgPSBMYXp5LmZyb21fdmFsIChDYW1sLlJhbmRvbS5TdGF0ZS5jb3B5IChMYXp5LmZvcmNlIHQpKVxuICBsZXQgY2hhciB0ID0gaW50IHQgMjU2IHw+IENoYXIudW5zYWZlX29mX2ludFxuICBsZXQgYXNjaWkgdCA9IGludCB0IDEyOCB8PiBDaGFyLnVuc2FmZV9vZl9pbnRcblxuICBsZXQgbWFrZV9zZWxmX2luaXQgP2FsbG93X2luX3Rlc3RzICgpID1cbiAgICBmb3JiaWRfbm9uZGV0ZXJtaW5pc21faW5fdGVzdHMgfmFsbG93X2luX3Rlc3RzO1xuICAgIExhenkuZnJvbV92YWwgKENhbWwuUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0ICgpKVxuICA7O1xuXG4gIGxldCBhc3NpZ24gPSBSYW5kb21fcmVwci5hc3NpZ25cblxuICBsZXQgZnVsbF9pbml0IHQgc2VlZCA9IGFzc2lnbiB0IChtYWtlIHNlZWQpXG5cbiAgbGV0IGRlZmF1bHQgPVxuICAgIGlmIGFtX3Rlc3RpbmdcbiAgICB0aGVuIChcbiAgICAgICgqIFdlIGRlZmluZSBCYXNlJ3MgZGVmYXVsdCByYW5kb20gc3RhdGUgYXMgYSBjb3B5IG9mIE9DYW1sJ3MgZGVmYXVsdCByYW5kb20gc3RhdGUuXG4gICAgICAgICBUaGlzIG1lYW5zIHRoYXQgcHJvZ3JhbXMgdGhhdCB1c2UgQmFzZS5SYW5kb20gd2lsbCBzZWUgdGhlIHNhbWUgc2VxdWVuY2Ugb2ZcbiAgICAgICAgIHJhbmRvbSBiaXRzIGFzIGlmIHRoZXkgaGFkIHVzZWQgQ2FtbC5SYW5kb20uIEhvd2V2ZXIsIGJlY2F1c2UgW2dldF9zdGF0ZV0gcmV0dXJuc1xuICAgICAgICAgYSBjb3B5LCBCYXNlLlJhbmRvbSBhbmQgT0NhbWwuUmFuZG9tIGFyZSBub3QgdXNpbmcgdGhlIHNhbWUgc3RhdGUuIElmIGEgcHJvZ3JhbVxuICAgICAgICAgdXNlZCBib3RoLCBlYWNoIG9mIHRoZW0gd291bGQgZ28gdGhyb3VnaCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiByYW5kb20gYml0cy4gVG9cbiAgICAgICAgIGF2b2lkIHRoYXQsIHdlIHJlc2V0IE9DYW1sJ3MgcmFuZG9tIHN0YXRlIHRvIGEgZGlmZmVyZW50IHNlZWQsIGdpdmluZyBpdCBhXG4gICAgICAgICBkaWZmZXJlbnQgc2VxdWVuY2UuICopXG4gICAgICBsZXQgdCA9IENhbWwuUmFuZG9tLmdldF9zdGF0ZSAoKSBpblxuICAgICAgQ2FtbC5SYW5kb20uaW5pdCAxMzc7XG4gICAgICBMYXp5LmZyb21fdmFsIHQpXG4gICAgZWxzZVxuICAgICAgbGF6eVxuICAgICAgICAoKiBPdXRzaWRlIG9mIHRlc3RzLCB3ZSBpbml0aWFsaXplIHJhbmRvbSBzdGF0ZSBub25kZXRlcm1pbmlzdGljYWxseSBhbmQgbGF6aWx5LlxuICAgICAgICAgICBXZSBmb3JjZSB0aGUgcmFuZG9tIGluaXRpYWxpemF0aW9uIHRvIGJlIGxhenkgc28gdGhhdCB3ZSBkbyBub3QgcGF5IGFueSBjb3N0XG4gICAgICAgICAgIGZvciBpdCBpbiBwcm9ncmFtcyB0aGF0IGRvIG5vdCB1c2UgcmFuZG9tbmVzcy4gKilcbiAgICAgICAgKExhenkuZm9yY2UgKG1ha2Vfc2VsZl9pbml0ICgpKSlcbiAgOztcblxuICBsZXQgaW50X29uXzY0Yml0cyB0IGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAweDNGRkZGRkZGICgqICgxIGxzbCAzMCkgLSAxICopXG4gICAgdGhlbiBpbnQgdCBib3VuZFxuICAgIGVsc2UgQ2FtbC5JbnQ2NC50b19pbnQgKGludDY0IHQgKENhbWwuSW50NjQub2ZfaW50IGJvdW5kKSlcbiAgOztcblxuICBsZXQgaW50X29uXzMyYml0cyB0IGJvdW5kID1cbiAgICAoKiBOb3QgYWx3YXlzIHRydWUgd2l0aCB0aGUgSmF2YVNjcmlwdCBiYWNrZW5kLiAqKVxuICAgIGlmIGJvdW5kIDw9IDB4M0ZGRkZGRkYgKCogKDEgbHNsIDMwKSAtIDEgKilcbiAgICB0aGVuIGludCB0IGJvdW5kXG4gICAgZWxzZSBDYW1sLkludDMyLnRvX2ludCAoaW50MzIgdCAoQ2FtbC5JbnQzMi5vZl9pbnQgYm91bmQpKVxuICA7O1xuXG4gIGxldCBpbnQgPVxuICAgIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICAgIHwgVzY0IC0+IGludF9vbl82NGJpdHNcbiAgICB8IFczMiAtPiBpbnRfb25fMzJiaXRzXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfaW50NjQgPVxuICAgIGxldCBvcGVuIENhbWwuSW50NjQgaW5cbiAgICBsZXQgYml0cyBzdGF0ZSA9IG9mX2ludCAoYml0cyBzdGF0ZSkgaW5cbiAgICBmdW4gc3RhdGUgLT5cbiAgICAgIGxvZ3hvclxuICAgICAgICAoYml0cyBzdGF0ZSlcbiAgICAgICAgKGxvZ3hvciAoc2hpZnRfbGVmdCAoYml0cyBzdGF0ZSkgMzApIChzaGlmdF9sZWZ0IChiaXRzIHN0YXRlKSA2MCkpXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfaW50MzIgPVxuICAgIGxldCBvcGVuIENhbWwuSW50MzIgaW5cbiAgICBsZXQgYml0cyBzdGF0ZSA9IG9mX2ludCAoYml0cyBzdGF0ZSkgaW5cbiAgICBmdW4gc3RhdGUgLT4gbG9neG9yIChiaXRzIHN0YXRlKSAoc2hpZnRfbGVmdCAoYml0cyBzdGF0ZSkgMzApXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfaW50X29uXzY0Yml0cyBzdGF0ZSA9IENhbWwuSW50NjQudG9faW50IChmdWxsX3JhbmdlX2ludDY0IHN0YXRlKVxuICBsZXQgZnVsbF9yYW5nZV9pbnRfb25fMzJiaXRzIHN0YXRlID0gQ2FtbC5JbnQzMi50b19pbnQgKGZ1bGxfcmFuZ2VfaW50MzIgc3RhdGUpXG5cbiAgbGV0IGZ1bGxfcmFuZ2VfaW50ID1cbiAgICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgICB8IFc2NCAtPiBmdWxsX3JhbmdlX2ludF9vbl82NGJpdHNcbiAgICB8IFczMiAtPiBmdWxsX3JhbmdlX2ludF9vbl8zMmJpdHNcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fNjRiaXRzIHN0YXRlID1cbiAgICBDYW1sLkludDY0LnRvX25hdGl2ZWludCAoZnVsbF9yYW5nZV9pbnQ2NCBzdGF0ZSlcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9uYXRpdmVpbnRfb25fMzJiaXRzIHN0YXRlID1cbiAgICBDYW1sLk5hdGl2ZWludC5vZl9pbnQzMiAoZnVsbF9yYW5nZV9pbnQzMiBzdGF0ZSlcbiAgOztcblxuICBsZXQgZnVsbF9yYW5nZV9uYXRpdmVpbnQgPVxuICAgIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICAgIHwgVzY0IC0+IGZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzY0Yml0c1xuICAgIHwgVzMyIC0+IGZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzMyYml0c1xuICA7O1xuXG4gIGxldCByYWlzZV9jcm9zc2VkX2JvdW5kcyBuYW1lIGxvd2VyX2JvdW5kIHVwcGVyX2JvdW5kIHN0cmluZ19vZl9ib3VuZCA9XG4gICAgUHJpbnRmLmZhaWx3aXRoZlxuICAgICAgXCJSYW5kb20uJXM6IGNyb3NzZWQgYm91bmRzIFslcyA+ICVzXVwiXG4gICAgICBuYW1lXG4gICAgICAoc3RyaW5nX29mX2JvdW5kIGxvd2VyX2JvdW5kKVxuICAgICAgKHN0cmluZ19vZl9ib3VuZCB1cHBlcl9ib3VuZClcbiAgICAgICgpXG4gIFtAQGNvbGRdIFtAQGlubGluZSBuZXZlcl0gW0BAbG9jYWwgbmV2ZXJdIFtAQHNwZWNpYWxpc2UgbmV2ZXJdXG4gIDs7XG5cbiAgbGV0IGludF9pbmNsID1cbiAgICBsZXQgcmVjIGluX3JhbmdlIHN0YXRlIGxvIGhpID1cbiAgICAgIGxldCBpbnQgPSBmdWxsX3JhbmdlX2ludCBzdGF0ZSBpblxuICAgICAgaWYgaW50ID49IGxvICYmIGludCA8PSBoaSB0aGVuIGludCBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gICAgaW5cbiAgICBmdW4gc3RhdGUgbG8gaGkgLT5cbiAgICAgIGlmIGxvID4gaGkgdGhlbiByYWlzZV9jcm9zc2VkX2JvdW5kcyBcImludFwiIGxvIGhpIEludC50b19zdHJpbmc7XG4gICAgICBsZXQgZGlmZiA9IGhpIC0gbG8gaW5cbiAgICAgIGlmIGRpZmYgPSBJbnQubWF4X3ZhbHVlXG4gICAgICB0aGVuIGxvICsgKGZ1bGxfcmFuZ2VfaW50IHN0YXRlIGxhbmQgSW50Lm1heF92YWx1ZSlcbiAgICAgIGVsc2UgaWYgZGlmZiA+PSAwXG4gICAgICB0aGVuIGxvICsgaW50IHN0YXRlIChJbnQuc3VjYyBkaWZmKVxuICAgICAgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICA7O1xuXG4gIGxldCBpbnQzMl9pbmNsID1cbiAgICBsZXQgb3BlbiBJbnQzMl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBsZXQgcmVjIGluX3JhbmdlIHN0YXRlIGxvIGhpID1cbiAgICAgIGxldCBpbnQgPSBmdWxsX3JhbmdlX2ludDMyIHN0YXRlIGluXG4gICAgICBpZiBpbnQgPj0gbG8gJiYgaW50IDw9IGhpIHRoZW4gaW50IGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgICBpblxuICAgIGxldCBvcGVuIENhbWwuSW50MzIgaW5cbiAgICBmdW4gc3RhdGUgbG8gaGkgLT5cbiAgICAgIGlmIGxvID4gaGkgdGhlbiByYWlzZV9jcm9zc2VkX2JvdW5kcyBcImludDMyXCIgbG8gaGkgdG9fc3RyaW5nO1xuICAgICAgbGV0IGRpZmYgPSBzdWIgaGkgbG8gaW5cbiAgICAgIGlmIGRpZmYgPSBtYXhfaW50XG4gICAgICB0aGVuIGFkZCBsbyAobG9nYW5kIChmdWxsX3JhbmdlX2ludDMyIHN0YXRlKSBtYXhfaW50KVxuICAgICAgZWxzZSBpZiBkaWZmID49IDBsXG4gICAgICB0aGVuIGFkZCBsbyAoaW50MzIgc3RhdGUgKHN1Y2MgZGlmZikpXG4gICAgICBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gIDs7XG5cbiAgbGV0IG5hdGl2ZWludF9pbmNsID1cbiAgICBsZXQgb3BlbiBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgbGV0IHJlYyBpbl9yYW5nZSBzdGF0ZSBsbyBoaSA9XG4gICAgICBsZXQgaW50ID0gZnVsbF9yYW5nZV9uYXRpdmVpbnQgc3RhdGUgaW5cbiAgICAgIGlmIGludCA+PSBsbyAmJiBpbnQgPD0gaGkgdGhlbiBpbnQgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICAgIGluXG4gICAgbGV0IG9wZW4gQ2FtbC5OYXRpdmVpbnQgaW5cbiAgICBmdW4gc3RhdGUgbG8gaGkgLT5cbiAgICAgIGlmIGxvID4gaGkgdGhlbiByYWlzZV9jcm9zc2VkX2JvdW5kcyBcIm5hdGl2ZWludFwiIGxvIGhpIHRvX3N0cmluZztcbiAgICAgIGxldCBkaWZmID0gc3ViIGhpIGxvIGluXG4gICAgICBpZiBkaWZmID0gbWF4X2ludFxuICAgICAgdGhlbiBhZGQgbG8gKGxvZ2FuZCAoZnVsbF9yYW5nZV9uYXRpdmVpbnQgc3RhdGUpIG1heF9pbnQpXG4gICAgICBlbHNlIGlmIGRpZmYgPj0gMG5cbiAgICAgIHRoZW4gYWRkIGxvIChuYXRpdmVpbnQgc3RhdGUgKHN1Y2MgZGlmZikpXG4gICAgICBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gIDs7XG5cbiAgbGV0IGludDY0X2luY2wgPVxuICAgIGxldCBvcGVuIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGxldCByZWMgaW5fcmFuZ2Ugc3RhdGUgbG8gaGkgPVxuICAgICAgbGV0IGludCA9IGZ1bGxfcmFuZ2VfaW50NjQgc3RhdGUgaW5cbiAgICAgIGlmIGludCA+PSBsbyAmJiBpbnQgPD0gaGkgdGhlbiBpbnQgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICAgIGluXG4gICAgbGV0IG9wZW4gQ2FtbC5JbnQ2NCBpblxuICAgIGZ1biBzdGF0ZSBsbyBoaSAtPlxuICAgICAgaWYgbG8gPiBoaSB0aGVuIHJhaXNlX2Nyb3NzZWRfYm91bmRzIFwiaW50NjRcIiBsbyBoaSB0b19zdHJpbmc7XG4gICAgICBsZXQgZGlmZiA9IHN1YiBoaSBsbyBpblxuICAgICAgaWYgZGlmZiA9IG1heF9pbnRcbiAgICAgIHRoZW4gYWRkIGxvIChsb2dhbmQgKGZ1bGxfcmFuZ2VfaW50NjQgc3RhdGUpIG1heF9pbnQpXG4gICAgICBlbHNlIGlmIGRpZmYgPj0gMExcbiAgICAgIHRoZW4gYWRkIGxvIChpbnQ2NCBzdGF0ZSAoc3VjYyBkaWZmKSlcbiAgICAgIGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgOztcblxuICAoKiBSZXR1cm4gYSB1bmlmb3JtbHkgcmFuZG9tIGZsb2F0IGluIFswLCAxKS4gKilcbiAgbGV0IHJlYyByYXdmbG9hdCBzdGF0ZSA9XG4gICAgbGV0IG9wZW4gRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgbGV0IHNjYWxlID0gMHgxcC0zMCBpblxuICAgICgqIDJeLTMwICopXG4gICAgbGV0IHIxID0gQ2FtbC5mbG9hdF9vZl9pbnQgKGJpdHMgc3RhdGUpIGluXG4gICAgbGV0IHIyID0gQ2FtbC5mbG9hdF9vZl9pbnQgKGJpdHMgc3RhdGUpIGluXG4gICAgbGV0IHJlc3VsdCA9ICgocjEgKi4gc2NhbGUpICsuIHIyKSAqLiBzY2FsZSBpblxuICAgICgqIFdpdGggdmVyeSBzbWFsbCBwcm9iYWJpbGl0eSwgcmVzdWx0IGNhbiByb3VuZCB1cCB0byAxLjAsIHNvIGluIHRoYXQgY2FzZSwgd2UganVzdFxuICAgICAgIHRyeSBhZ2Fpbi4gKilcbiAgICBpZiByZXN1bHQgPCAxLjAgdGhlbiByZXN1bHQgZWxzZSByYXdmbG9hdCBzdGF0ZVxuICA7O1xuXG4gIGxldCBmbG9hdCBzdGF0ZSBoaSA9IHJhd2Zsb2F0IHN0YXRlICouIGhpXG5cbiAgbGV0IGZsb2F0X3JhbmdlIHN0YXRlIGxvIGhpID1cbiAgICBsZXQgb3BlbiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBpZiBsbyA+IGhpIHRoZW4gcmFpc2VfY3Jvc3NlZF9ib3VuZHMgXCJmbG9hdFwiIGxvIGhpIENhbWwuc3RyaW5nX29mX2Zsb2F0O1xuICAgIGxvICsuIGZsb2F0IHN0YXRlIChoaSAtLiBsbylcbiAgOztcbmVuZFxuXG5sZXQgZGVmYXVsdCA9IFJhbmRvbV9yZXByLm1ha2VfZGVmYXVsdCBTdGF0ZS5kZWZhdWx0XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpXG5sZXQgaW50IHggPSBTdGF0ZS5pbnQgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4XG5sZXQgaW50MzIgeCA9IFN0YXRlLmludDMyIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeFxubGV0IG5hdGl2ZWludCB4ID0gU3RhdGUubmF0aXZlaW50IChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeFxubGV0IGludDY0IHggPSBTdGF0ZS5pbnQ2NCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHhcbmxldCBmbG9hdCB4ID0gU3RhdGUuZmxvYXQgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4XG5sZXQgaW50X2luY2wgeCB5ID0gU3RhdGUuaW50X2luY2wgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4IHlcbmxldCBpbnQzMl9pbmNsIHggeSA9IFN0YXRlLmludDMyX2luY2wgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4IHlcbmxldCBuYXRpdmVpbnRfaW5jbCB4IHkgPSBTdGF0ZS5uYXRpdmVpbnRfaW5jbCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHggeVxubGV0IGludDY0X2luY2wgeCB5ID0gU3RhdGUuaW50NjRfaW5jbCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHggeVxubGV0IGZsb2F0X3JhbmdlIHggeSA9IFN0YXRlLmZsb2F0X3JhbmdlIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeCB5XG5sZXQgYm9vbCAoKSA9IFN0YXRlLmJvb2wgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KVxubGV0IGNoYXIgKCkgPSBTdGF0ZS5jaGFyIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdClcbmxldCBhc2NpaSAoKSA9IFN0YXRlLmFzY2lpIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdClcbmxldCBmdWxsX2luaXQgc2VlZCA9IFN0YXRlLmZ1bGxfaW5pdCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHNlZWRcbmxldCBpbml0IHNlZWQgPSBmdWxsX2luaXQgW3wgc2VlZCB8XVxubGV0IHNlbGZfaW5pdCA/YWxsb3dfaW5fdGVzdHMgKCkgPSBmdWxsX2luaXQgKHJhbmRvbV9zZWVkID9hbGxvd19pbl90ZXN0cyAoKSlcbmxldCBzZXRfc3RhdGUgcyA9IFN0YXRlLmFzc2lnbiAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHNcbiIsIigqKiBBbiBpbnRlcm5hbC1vbmx5IG1vZHVsZSBmYWN0b3JlZCBvdXQgZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIGNvcmVfYXJyYXlcbiAgICBhbmQgY29yZV9saXN0LiAgQ29udGFpbnMgY29kZSBmb3IgcGVybXV0aW5nIGFuIGFycmF5LiAqKVxuXG5vcGVuISBJbXBvcnRcbmluY2x1ZGUgQXJyYXkwXG5cbmxldCBwZXJtdXRlID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpID8ocG9zID0gMCkgP2xlbiB0ID1cbiAgKCogQ29waWVkIGZyb20gW09yZGVyZWRfY29sbGVjdGlvbl9jb21tb24wXSB0byBhdm9pZCBhbGxvY2F0aW5nIGEgdHVwbGUgd2hlbiBjb21waWxpbmdcbiAgICAgd2l0aG91dCBmbGFtYmRhLiAqKVxuICBsZXQgdG90YWxfbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgbGV0IGxlbiA9XG4gICAgbWF0Y2ggbGVuIHdpdGhcbiAgICB8IFNvbWUgbCAtPiBsXG4gICAgfCBOb25lIC0+IHRvdGFsX2xlbmd0aCAtIHBvc1xuICBpblxuICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMC5jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aDtcbiAgbGV0IG51bV9zd2FwcyA9IGxlbiAtIDEgaW5cbiAgZm9yIGkgPSBudW1fc3dhcHMgZG93bnRvIDEgZG9cbiAgICBsZXQgdGhpc19pID0gcG9zICsgaSBpblxuICAgICgqIFtyYW5kb21faV0gaXMgZHJhd24gZnJvbSBbcG9zLHRoaXNfaV0gKilcbiAgICBsZXQgcmFuZG9tX2kgPSBwb3MgKyBSYW5kb20uU3RhdGUuaW50IHJhbmRvbV9zdGF0ZSAoaSArIDEpIGluXG4gICAgc3dhcCB0IHRoaXNfaSByYW5kb21faVxuICBkb25lXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbmxldCBjb25zdCBjIF8gPSBjXG5cbmV4dGVybmFsIGlnbm9yZSA6IF8gLT4gdW5pdCA9IFwiJWlnbm9yZVwiXG5cbigqIHRoaXMgaGFzIHRoZSBzYW1lIGJlaGF2aW9yIGFzIFtDYW1sLmlnbm9yZV0gKilcblxubGV0IG5vbiBmIHggPSBub3QgKGYgeClcblxubGV0IGZvcmV2ZXIgZiA9XG4gIGxldCByZWMgZm9yZXZlciAoKSA9XG4gICAgZiAoKTtcbiAgICBmb3JldmVyICgpXG4gIGluXG4gIHRyeSBmb3JldmVyICgpIHdpdGhcbiAgfCBlIC0+IGVcbjs7XG5cbmV4dGVybmFsIGlkIDogJ2EgLT4gJ2EgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoIHw+ICkgOiAnYSAtPiAoJ2EgLT4gJ2IpIC0+ICdiID0gXCIlcmV2YXBwbHlcIlxuXG4oKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhlc2UgZnVuY3Rpb25zIGlzIHRvIHBhc3MgaW4gZnVuY3Rpb25hbCBhcmd1bWVudHMgYW5kIGdldFxuICAgZnVuY3Rpb25zIGFzIGEgcmVzdWx0LiAqKVxubGV0IGNvbXBvc2UgZiBnIHggPSBmIChnIHgpXG5sZXQgZmxpcCBmIHggeSA9IGYgeSB4XG5sZXQgcmVjIGFwcGx5X25fdGltZXMgfm4gZiB4ID0gaWYgbiA8PSAwIHRoZW4geCBlbHNlIGFwcGx5X25fdGltZXMgfm46KG4gLSAxKSBmIChmIHgpXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSB0ID1cbiAgfCBMZXNzXG4gIHwgRXF1YWxcbiAgfCBHcmVhdGVyXG5bQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgZW51bWVyYXRlLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcblxubGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAoZnVuIGhzdiBhcmcgLT5cbiAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgfCBMZXNzIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMFxuICAgICB8IEVxdWFsIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMVxuICAgICB8IEdyZWF0ZXIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAyXG4gICAgICAgICAgICAgICAgICA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbjs7XG5cbmxldCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgbGV0IGZ1bmMgYXJnID1cbiAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgIGhhc2hfZm9sZF90IGhzdiBhcmcpXG4gIGluXG4gIGZ1biB4IC0+IGZ1bmMgeFxuOztcblxubGV0IGFsbCA9IChbIExlc3M7IEVxdWFsOyBHcmVhdGVyIF0gOiB0IGxpc3QpXG5cbmxldCB0X29mX3NleHAgPVxuICAobGV0IGVycm9yX3NvdXJjZV9fMDA1XyA9IFwib3JkZXJpbmcubWwudFwiIGluXG4gICBmdW5jdGlvblxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibGVzc1wiIHwgXCJMZXNzXCIpIC0+IExlc3NcbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImVxdWFsXCIgfCBcIkVxdWFsXCIpIC0+IEVxdWFsXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJncmVhdGVyXCIgfCBcIkdyZWF0ZXJcIikgLT4gR3JlYXRlclxuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJsZXNzXCIgfCBcIkxlc3NcIikgOjogXykgYXMgc2V4cF9fMDA2XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDZfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImVxdWFsXCIgfCBcIkVxdWFsXCIpIDo6IF8pIGFzIHNleHBfXzAwNl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA2X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJncmVhdGVyXCIgfCBcIkdyZWF0ZXJcIikgOjogXykgYXMgc2V4cF9fMDA2XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDZfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbiAgIHwgc2V4cF9fMDA0XyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG4gICAgICAgICAgICAgICAgICAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbjs7XG5cbmxldCBzZXhwX29mX3QgPVxuICAoZnVuY3Rpb25cbiAgICB8IExlc3MgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTGVzc1wiXG4gICAgfCBFcXVhbCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJFcXVhbFwiXG4gICAgfCBHcmVhdGVyIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkdyZWF0ZXJcIlxuICAgICAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWcgeyBuYW1lID0gXCJMZXNzXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJFcXVhbFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiR3JlYXRlclwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgZXF1YWwgYSBiID0gY29tcGFyZSBhIGIgPSAwXG5cbm1vZHVsZSBFeHBvcnQgPSBzdHJ1Y3RcbiAgdHlwZSBfb3JkZXJpbmcgPSB0ID1cbiAgICB8IExlc3NcbiAgICB8IEVxdWFsXG4gICAgfCBHcmVhdGVyXG5lbmRcblxubGV0IG9mX2ludCBuID0gaWYgbiA8IDAgdGhlbiBMZXNzIGVsc2UgaWYgbiA9IDAgdGhlbiBFcXVhbCBlbHNlIEdyZWF0ZXJcblxubGV0IHRvX2ludCA9IGZ1bmN0aW9uXG4gIHwgTGVzcyAtPiAtMVxuICB8IEVxdWFsIC0+IDBcbiAgfCBHcmVhdGVyIC0+IDFcbjs7XG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxubW9kdWxlIEVpdGhlciA9IEVpdGhlcjBcblxuXG5pbmNsdWRlIExpc3QxXG5cbigqIFRoaXMgaXRzZWxmIGluY2x1ZGVzIFtMaXN0MF0uICopXG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIGxpc3QgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID0gbGlzdF9vZl9zZXhwXG4gIGxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPSBzZXhwX29mX2xpc3RcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IGxpc3Rfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSBPcl91bmVxdWFsX2xlbmd0aHMgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID1cbiAgICB8IE9rIG9mICdhXG4gICAgfCBVbmVxdWFsX2xlbmd0aHNcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9XG4gICAgZnVuIF9jbXBfX2EgYV9fMDA2XyBiX18wMDdfIC0+XG4gICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDA2XyBiX18wMDdfXG4gICAgdGhlbiAwXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBhX18wMDZfLCBiX18wMDdfIHdpdGhcbiAgICAgIHwgT2sgX2FfXzAwOF8sIE9rIF9iX18wMDlfIC0+IF9jbXBfX2EgX2FfXzAwOF8gX2JfXzAwOV9cbiAgICAgIHwgT2sgXywgXyAtPiAtMVxuICAgICAgfCBfLCBPayBfIC0+IDFcbiAgICAgIHwgVW5lcXVhbF9sZW5ndGhzLCBVbmVxdWFsX2xlbmd0aHMgLT4gMClcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBmdW4gKHR5cGUgYV9fMDEzXykgOiAoKGFfXzAxM18gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiBhX18wMTNfIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgIGZ1biBfb2ZfYV9fMDEwXyAtPiBmdW5jdGlvblxuICAgICAgfCBPayBhcmcwX18wMTFfIC0+XG4gICAgICAgIGxldCByZXMwX18wMTJfID0gX29mX2FfXzAxMF8gYXJnMF9fMDExXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJPa1wiOyByZXMwX18wMTJfIF1cbiAgICAgIHwgVW5lcXVhbF9sZW5ndGhzIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlVuZXF1YWxfbGVuZ3Roc1wiXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5pbmNsdWRlIFRcblxubGV0IGludmFyaWFudCBmIHQgPSBpdGVyIHQgfmZcbmxldCBvZl9saXN0IHQgPSB0XG5cbmxldCByYW5nZScgfmNvbXBhcmUgfnN0cmlkZSA/KHN0YXJ0ID0gYGluY2x1c2l2ZSkgPyhzdG9wID0gYGV4Y2x1c2l2ZSkgc3RhcnRfaSBzdG9wX2kgPVxuICBsZXQgbmV4dF9pID0gc3RyaWRlIHN0YXJ0X2kgaW5cbiAgbGV0IG9yZGVyIHggeSA9IE9yZGVyaW5nLm9mX2ludCAoY29tcGFyZSB4IHkpIGluXG4gIGxldCByYWlzZV9zdHJpZGVfY2Fubm90X3JldHVybl9zYW1lX3ZhbHVlICgpID1cbiAgICBpbnZhbGlkX2FyZyBcIkxpc3QucmFuZ2UnOiBzdHJpZGUgZnVuY3Rpb24gY2Fubm90IHJldHVybiB0aGUgc2FtZSB2YWx1ZVwiXG4gIGluXG4gIGxldCBpbml0aWFsX3N0cmlkZV9vcmRlciA9XG4gICAgbWF0Y2ggb3JkZXIgc3RhcnRfaSBuZXh0X2kgd2l0aFxuICAgIHwgRXF1YWwgLT4gcmFpc2Vfc3RyaWRlX2Nhbm5vdF9yZXR1cm5fc2FtZV92YWx1ZSAoKVxuICAgIHwgTGVzcyAtPiBgTGVzc1xuICAgIHwgR3JlYXRlciAtPiBgR3JlYXRlclxuICBpblxuICBsZXQgcmVjIGxvb3AgaSBhY2N1bSA9XG4gICAgbGV0IGlfdG9fc3RvcF9vcmRlciA9IG9yZGVyIGkgc3RvcF9pIGluXG4gICAgbWF0Y2ggaV90b19zdG9wX29yZGVyLCBpbml0aWFsX3N0cmlkZV9vcmRlciB3aXRoXG4gICAgfCBMZXNzLCBgTGVzcyB8IEdyZWF0ZXIsIGBHcmVhdGVyIC0+XG4gICAgICAoKiBoYXZlbid0IHlldCByZWFjaGVkIFtzdG9wX2ldLiBDb250aW51ZS4gKilcbiAgICAgIGxldCBuZXh0X2kgPSBzdHJpZGUgaSBpblxuICAgICAgKG1hdGNoIG9yZGVyIGkgbmV4dF9pLCBpbml0aWFsX3N0cmlkZV9vcmRlciB3aXRoXG4gICAgICAgfCBFcXVhbCwgXyAtPiByYWlzZV9zdHJpZGVfY2Fubm90X3JldHVybl9zYW1lX3ZhbHVlICgpXG4gICAgICAgfCBMZXNzLCBgR3JlYXRlciB8IEdyZWF0ZXIsIGBMZXNzIC0+XG4gICAgICAgICBpbnZhbGlkX2FyZyBcIkxpc3QucmFuZ2UnOiBzdHJpZGUgZnVuY3Rpb24gY2Fubm90IGNoYW5nZSBkaXJlY3Rpb25cIlxuICAgICAgIHwgTGVzcywgYExlc3MgfCBHcmVhdGVyLCBgR3JlYXRlciAtPiBsb29wIG5leHRfaSAoaSA6OiBhY2N1bSkpXG4gICAgfCBMZXNzLCBgR3JlYXRlciB8IEdyZWF0ZXIsIGBMZXNzIC0+XG4gICAgICAoKiBzdGVwcGVkIHBhc3QgW3N0b3BfaV0uICBGaW5pc2hlZC4gKilcbiAgICAgIGFjY3VtXG4gICAgfCBFcXVhbCwgXyAtPlxuICAgICAgKCogcmVhY2hlZCBbc3RvcF9pXS4gIEZpbmlzaGVkLiAqKVxuICAgICAgKG1hdGNoIHN0b3Agd2l0aFxuICAgICAgIHwgYGluY2x1c2l2ZSAtPiBpIDo6IGFjY3VtXG4gICAgICAgfCBgZXhjbHVzaXZlIC0+IGFjY3VtKVxuICBpblxuICBsZXQgc3RhcnRfaSA9XG4gICAgbWF0Y2ggc3RhcnQgd2l0aFxuICAgIHwgYGluY2x1c2l2ZSAtPiBzdGFydF9pXG4gICAgfCBgZXhjbHVzaXZlIC0+IG5leHRfaVxuICBpblxuICByZXYgKGxvb3Agc3RhcnRfaSBbXSlcbjs7XG5cbmxldCByYW5nZSA/KHN0cmlkZSA9IDEpID8oc3RhcnQgPSBgaW5jbHVzaXZlKSA/KHN0b3AgPSBgZXhjbHVzaXZlKSBzdGFydF9pIHN0b3BfaSA9XG4gIGlmIHN0cmlkZSA9IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QucmFuZ2U6IHN0cmlkZSBtdXN0IGJlIG5vbi16ZXJvXCI7XG4gIHJhbmdlJyB+Y29tcGFyZSB+c3RyaWRlOihmdW4geCAtPiB4ICsgc3RyaWRlKSB+c3RhcnQgfnN0b3Agc3RhcnRfaSBzdG9wX2lcbjs7XG5cbmxldCBoZCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogXyAtPiBTb21lIHhcbjs7XG5cbmxldCB0bCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IF8gOjogdCcgLT4gU29tZSB0J1xuOztcblxubGV0IG50aCB0IG4gPVxuICBpZiBuIDwgMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IHJlYyBudGhfYXV4IHQgbiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgW10gLT4gTm9uZVxuICAgICAgfCBhIDo6IHQgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IHQgKG4gLSAxKVxuICAgIGluXG4gICAgbnRoX2F1eCB0IG4pXG47O1xuXG5sZXQgbnRoX2V4biB0IG4gPVxuICBtYXRjaCBudGggdCBuIHdpdGhcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnZiBcIkxpc3QubnRoX2V4biAlZCBjYWxsZWQgb24gbGlzdCBvZiBsZW5ndGggJWRcIiBuIChsZW5ndGggdCkgKClcbiAgfCBTb21lIGEgLT4gYVxuOztcblxubGV0IHVub3JkZXJlZF9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBsIHwgbCwgW10gLT4gbFxuICB8IF8gLT4gcmV2X2FwcGVuZCBsMSBsMlxuOztcblxubW9kdWxlIENoZWNrX2xlbmd0aDIgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiKSB0ID1cbiAgICB8IFNhbWVfbGVuZ3RoIG9mIGludFxuICAgIHwgVW5lcXVhbF9sZW5ndGhzIG9mXG4gICAgICAgIHsgc2hhcmVkX2xlbmd0aCA6IGludFxuICAgICAgICA7IHRhaWxfb2ZfYSA6ICdhIGxpc3RcbiAgICAgICAgOyB0YWlsX29mX2IgOiAnYiBsaXN0XG4gICAgICAgIH1cblxuICAoKiBJbiB0aGUgW1VuZXF1YWxfbGVuZ3Roc10gY2FzZSwgYXQgbGVhc3Qgb25lIG9mIHRoZSB0YWlscyB3aWxsIGJlIG5vbi1lbXB0eS4gKilcbiAgbGV0IG9mX2xpc3RzIGwxIGwyID1cbiAgICBsZXQgcmVjIGxvb3AgYSBiIHNoYXJlZF9sZW5ndGggPVxuICAgICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgICB8IFtdLCBbXSAtPiBTYW1lX2xlbmd0aCBzaGFyZWRfbGVuZ3RoXG4gICAgICB8IF8gOjogYSwgXyA6OiBiIC0+IGxvb3AgYSBiIChzaGFyZWRfbGVuZ3RoICsgMSlcbiAgICAgIHwgW10sIF8gfCBfLCBbXSAtPiBVbmVxdWFsX2xlbmd0aHMgeyBzaGFyZWRfbGVuZ3RoOyB0YWlsX29mX2EgPSBhOyB0YWlsX29mX2IgPSBiIH1cbiAgICBpblxuICAgIGxvb3AgbDEgbDIgMFxuICA7O1xuZW5kXG5cbmxldCBjaGVja19sZW5ndGgyX2V4biBuYW1lIGwxIGwyID1cbiAgbWF0Y2ggQ2hlY2tfbGVuZ3RoMi5vZl9saXN0cyBsMSBsMiB3aXRoXG4gIHwgU2FtZV9sZW5ndGggXyAtPiAoKVxuICB8IFVuZXF1YWxfbGVuZ3RocyB7IHNoYXJlZF9sZW5ndGg7IHRhaWxfb2ZfYTsgdGFpbF9vZl9iIH0gLT5cbiAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgIFwibGVuZ3RoIG1pc21hdGNoIGluICVzOiAlZCA8PiAlZFwiXG4gICAgICBuYW1lXG4gICAgICAoc2hhcmVkX2xlbmd0aCArIGxlbmd0aCB0YWlsX29mX2EpXG4gICAgICAoc2hhcmVkX2xlbmd0aCArIGxlbmd0aCB0YWlsX29mX2IpXG4gICAgICAoKVxuOztcblxubGV0IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmYgPVxuICBtYXRjaCBDaGVja19sZW5ndGgyLm9mX2xpc3RzIGwxIGwyIHdpdGhcbiAgfCBTYW1lX2xlbmd0aCBfIC0+IE9yX3VuZXF1YWxfbGVuZ3Rocy5PayAoZiBsMSBsMilcbiAgfCBVbmVxdWFsX2xlbmd0aHMgXyAtPiBVbmVxdWFsX2xlbmd0aHNcbjs7XG5cbm1vZHVsZSBDaGVja19sZW5ndGgzID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPVxuICAgIHwgU2FtZV9sZW5ndGggb2YgaW50XG4gICAgfCBVbmVxdWFsX2xlbmd0aHMgb2ZcbiAgICAgICAgeyBzaGFyZWRfbGVuZ3RoIDogaW50XG4gICAgICAgIDsgdGFpbF9vZl9hIDogJ2EgbGlzdFxuICAgICAgICA7IHRhaWxfb2ZfYiA6ICdiIGxpc3RcbiAgICAgICAgOyB0YWlsX29mX2MgOiAnYyBsaXN0XG4gICAgICAgIH1cblxuICAoKiBJbiB0aGUgW1VuZXF1YWxfbGVuZ3Roc10gY2FzZSwgYXQgbGVhc3Qgb25lIG9mIHRoZSB0YWlscyB3aWxsIGJlIG5vbi1lbXB0eS4gKilcbiAgbGV0IG9mX2xpc3RzIGwxIGwyIGwzID1cbiAgICBsZXQgcmVjIGxvb3AgYSBiIGMgc2hhcmVkX2xlbmd0aCA9XG4gICAgICBtYXRjaCBhLCBiLCBjIHdpdGhcbiAgICAgIHwgW10sIFtdLCBbXSAtPiBTYW1lX2xlbmd0aCBzaGFyZWRfbGVuZ3RoXG4gICAgICB8IF8gOjogYSwgXyA6OiBiLCBfIDo6IGMgLT4gbG9vcCBhIGIgYyAoc2hhcmVkX2xlbmd0aCArIDEpXG4gICAgICB8IFtdLCBfLCBfIHwgXywgW10sIF8gfCBfLCBfLCBbXSAtPlxuICAgICAgICBVbmVxdWFsX2xlbmd0aHMgeyBzaGFyZWRfbGVuZ3RoOyB0YWlsX29mX2EgPSBhOyB0YWlsX29mX2IgPSBiOyB0YWlsX29mX2MgPSBjIH1cbiAgICBpblxuICAgIGxvb3AgbDEgbDIgbDMgMFxuICA7O1xuZW5kXG5cbmxldCBjaGVja19sZW5ndGgzX2V4biBuYW1lIGwxIGwyIGwzID1cbiAgbWF0Y2ggQ2hlY2tfbGVuZ3RoMy5vZl9saXN0cyBsMSBsMiBsMyB3aXRoXG4gIHwgU2FtZV9sZW5ndGggXyAtPiAoKVxuICB8IFVuZXF1YWxfbGVuZ3RocyB7IHNoYXJlZF9sZW5ndGg7IHRhaWxfb2ZfYTsgdGFpbF9vZl9iOyB0YWlsX29mX2MgfSAtPlxuICAgIGxldCBuMSA9IHNoYXJlZF9sZW5ndGggKyBsZW5ndGggdGFpbF9vZl9hIGluXG4gICAgbGV0IG4yID0gc2hhcmVkX2xlbmd0aCArIGxlbmd0aCB0YWlsX29mX2IgaW5cbiAgICBsZXQgbjMgPSBzaGFyZWRfbGVuZ3RoICsgbGVuZ3RoIHRhaWxfb2ZfYyBpblxuICAgIGludmFsaWRfYXJnZiBcImxlbmd0aCBtaXNtYXRjaCBpbiAlczogJWQgPD4gJWQgfHwgJWQgPD4gJWRcIiBuYW1lIG4xIG4yIG4yIG4zICgpXG47O1xuXG5sZXQgY2hlY2tfbGVuZ3RoMyBsMSBsMiBsMyB+ZiA9XG4gIG1hdGNoIENoZWNrX2xlbmd0aDMub2ZfbGlzdHMgbDEgbDIgbDMgd2l0aFxuICB8IFNhbWVfbGVuZ3RoIF8gLT4gT3JfdW5lcXVhbF9sZW5ndGhzLk9rIChmIGwxIGwyIGwzKVxuICB8IFVuZXF1YWxfbGVuZ3RocyBfIC0+IFVuZXF1YWxfbGVuZ3Roc1xuOztcblxubGV0IGl0ZXIyIGwxIGwyIH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjooaXRlcjJfb2sgfmYpXG5cbmxldCBpdGVyMl9leG4gbDEgbDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIml0ZXIyX2V4blwiIGwxIGwyO1xuICBpdGVyMl9vayBsMSBsMiB+ZlxuOztcblxubGV0IHJldl9tYXAyIGwxIGwyIH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjoocmV2X21hcDJfb2sgfmYpXG5cbmxldCByZXZfbWFwMl9leG4gbDEgbDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcInJldl9tYXAyX2V4blwiIGwxIGwyO1xuICByZXZfbWFwMl9vayBsMSBsMiB+ZlxuOztcblxubGV0IGZvbGQyIGwxIGwyIH5pbml0IH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjooZm9sZDJfb2sgfmluaXQgfmYpXG5cbmxldCBmb2xkMl9leG4gbDEgbDIgfmluaXQgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcImZvbGQyX2V4blwiIGwxIGwyO1xuICBmb2xkMl9vayBsMSBsMiB+aW5pdCB+ZlxuOztcblxubGV0IGZvcl9hbGwyIGwxIGwyIH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjooZm9yX2FsbDJfb2sgfmYpXG5cbmxldCBmb3JfYWxsMl9leG4gbDEgbDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcImZvcl9hbGwyX2V4blwiIGwxIGwyO1xuICBmb3JfYWxsMl9vayBsMSBsMiB+ZlxuOztcblxubGV0IGV4aXN0czIgbDEgbDIgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihleGlzdHMyX29rIH5mKVxuXG5sZXQgZXhpc3RzMl9leG4gbDEgbDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcImV4aXN0czJfZXhuXCIgbDEgbDI7XG4gIGV4aXN0czJfb2sgbDEgbDIgfmZcbjs7XG5cbmxldCBtZW0gdCBhIH5lcXVhbCA9XG4gIGxldCByZWMgbG9vcCBlcXVhbCBhID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGZhbHNlXG4gICAgfCBiIDo6IGJzIC0+IGVxdWFsIGEgYiB8fCBsb29wIGVxdWFsIGEgYnNcbiAgaW5cbiAgbG9vcCBlcXVhbCBhIHRcbjs7XG5cbigqIFRoaXMgaXMgYSBjb3B5IG9mIHRoZSBjb2RlIGZyb20gdGhlIHN0YW5kYXJkIGxpYnJhcnksIHdpdGggYW4gZXh0cmEgZXRhLWV4cGFuc2lvbiB0b1xuICAgYXZvaWQgY3JlYXRpbmcgcGFydGlhbCBjbG9zdXJlcyAoc2hvd2VkIHVwIGZvciBbZmlsdGVyXSkgaW4gcHJvZmlsaW5nKS4gKilcbmxldCByZXZfZmlsdGVyIHQgfmYgPVxuICBsZXQgcmVjIGZpbmQgfmYgYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhY2N1XG4gICAgfCB4IDo6IGwgLT4gaWYgZiB4IHRoZW4gZmluZCB+ZiAoeCA6OiBhY2N1KSBsIGVsc2UgZmluZCB+ZiBhY2N1IGxcbiAgaW5cbiAgZmluZCB+ZiBbXSB0XG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPSByZXYgKHJldl9maWx0ZXIgdCB+ZilcblxubGV0IGZpbmRfbWFwIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gTm9uZVxuICAgIHwgeCA6OiBsIC0+XG4gICAgICAobWF0Y2ggZiB4IHdpdGhcbiAgICAgICB8IE5vbmUgLT4gbG9vcCBsXG4gICAgICAgfCBTb21lIF8gYXMgciAtPiByKVxuICBpblxuICBsb29wIHRcbjs7XG5cbmxldCBmaW5kX21hcF9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJMaXN0LmZpbmRfbWFwX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBmaW5kX21hcF9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZF9tYXAgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgU29tZSB4IC0+IHhcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX21hcF9leG5cbjs7XG5cbmxldCBmaW5kIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gTm9uZVxuICAgIHwgeCA6OiBsIC0+IGlmIGYgeCB0aGVuIFNvbWUgeCBlbHNlIGxvb3AgbFxuICBpblxuICBsb29wIHRcbjs7XG5cbmxldCBmaW5kX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkxpc3QuZmluZF9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgcmVjIGZpbmRfZXhuIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCB4IDo6IHQgLT4gaWYgZiB4IHRoZW4geCBlbHNlIGZpbmRfZXhuIHQgfmZcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX2V4blxuOztcblxubGV0IGZpbmRpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IHggOjogbCAtPiBpZiBmIGkgeCB0aGVuIFNvbWUgKGksIHgpIGVsc2UgbG9vcCAoaSArIDEpIGxcbiAgaW5cbiAgbG9vcCAwIHRcbjs7XG5cbmxldCBmaW5kaV9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJMaXN0LmZpbmRpX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBmaW5kaV9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZGkgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgU29tZSB4IC0+IHhcbiAgaW5cbiAgZmluZGlfZXhuXG47O1xuXG5sZXQgZmluZF9tYXBpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IHggOjogbCAtPlxuICAgICAgKG1hdGNoIGYgaSB4IHdpdGhcbiAgICAgICB8IFNvbWUgXyBhcyByZXN1bHQgLT4gcmVzdWx0XG4gICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKSBsKVxuICBpblxuICBsb29wIDAgdFxuOztcblxubGV0IGZpbmRfbWFwaV9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJMaXN0LmZpbmRfbWFwaV9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgZmluZF9tYXBpX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kX21hcGkgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgU29tZSB4IC0+IHhcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX21hcGlfZXhuXG47O1xuXG5sZXQgZm9yX2FsbGkgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gdHJ1ZVxuICAgIHwgaGQgOjogdGwgLT4gZiBpIGhkICYmIGxvb3AgKGkgKyAxKSB0bFxuICBpblxuICBsb29wIDAgdFxuOztcblxubGV0IGV4aXN0c2kgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgW10gLT4gZmFsc2VcbiAgICB8IGhkIDo6IHRsIC0+IGYgaSBoZCB8fCBsb29wIChpICsgMSkgdGxcbiAgaW5cbiAgbG9vcCAwIHRcbjs7XG5cbigqKiBGb3IgdGhlIGNvbnRhaW5lciBpbnRlcmZhY2UuICopXG5sZXQgZm9sZF9sZWZ0ID0gZm9sZFxuXG5sZXQgdG9fYXJyYXkgPSBBcnJheS5vZl9saXN0XG5sZXQgdG9fbGlzdCB0ID0gdFxuXG5sZXQgbWF4X25vbl90YWlsY2FsbCA9XG4gIG1hdGNoIFN5cy5iYWNrZW5kX3R5cGUgd2l0aFxuICB8IFN5cy5OYXRpdmUgfCBTeXMuQnl0ZWNvZGUgLT4gMV8wMDBcbiAgKCogV2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2ssIGJldHRlciBiZSBzYWZlIGFuZCBhc3N1bWUgaXQncyBzbWFsbC4gVGhpc1xuICAgICBudW1iZXIgd2FzIHRha2VuIGZyb20gb2NhbWwjc3RkbGliL2xpc3QubWwgd2hpY2ggaXMgYWxzbyBlcXVhbCB0byB0aGUgZGVmYXVsdCBsaW1pdFxuICAgICBvZiByZWN1cnNpdmUgY2FsbCBpbiB0aGUganNfb2Zfb2NhbWwgY29tcGlsZXIgYmVmb3JlIHN3aXRjaGluZyB0byB0cmFtcG9saW5lLiAqKVxuICB8IFN5cy5PdGhlciBfIC0+IDUwXG47O1xuXG4oKiogVGFpbCByZWN1cnNpdmUgdmVyc2lvbnMgb2Ygc3RhbmRhcmQgW0xpc3RdIG1vZHVsZSAqKVxuXG5sZXQgdGFpbF9hcHBlbmQgbDEgbDIgPSByZXZfYXBwZW5kIChyZXYgbDEpIGwyXG5cbigqIFRoZXJlIGFyZSBhIGZldyBvcHRpbWl6ZWQgbGlzdCBvcGVyYXRpb25zIGhlcmUsIGluY2x1ZGluZyBhcHBlbmQgYW5kIG1hcC4gIFRoZXJlIGFyZVxuICAgYmFzaWNhbGx5IHR3byBvcHRpbWl6YXRpb25zIGluIHBsYXk6IGxvb3AgdW5yb2xsaW5nLCBhbmQgZHluYW1pYyBzd2l0Y2hpbmcgYmV0d2VlblxuICAgc3RhY2sgYW5kIGhlYXAgYWxsb2NhdGlvbi5cblxuICAgVGhlIGxvb3AtdW5yb2xsaW5nIGlzIHN0cmFpZ2h0Zm9yd2FyZCwgd2UganVzdCB1bnJvbGwgNSBsZXZlbHMgb2YgdGhlIGxvb3AuICBUaGlzIG1ha2VzXG4gICBlYWNoIGl0ZXJhdGlvbiBmYXN0ZXIsIGFuZCBhbHNvIHJlZHVjZXMgdGhlIG51bWJlciBvZiBzdGFjayBmcmFtZXMgY29uc3VtZWQgcGVyIGxpc3RcbiAgIGVsZW1lbnQuXG5cbiAgIFRoZSBkeW5hbWljIHN3aXRjaGluZyBpcyBkb25lIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzLCBhbmQgdGhlblxuICAgc3dpdGNoaW5nIHRvIHRoZSBcInNsb3dcIiBpbXBsZW1lbnRhdGlvbiB3aGVuIHdlIGV4Y2VlZCBhIGdpdmVuIGxpbWl0LiAgVGhpcyBtZWFucyB0aGF0XG4gICBzaG9ydCBsaXN0cyB1c2UgdGhlIGZhc3Qgc3RhY2stYWxsb2NhdGlvbiBtZXRob2QsIGFuZCBsb25nIGxpc3RzIHVzZSBhIHNsb3dlciBvbmUgdGhhdFxuICAgZG9lc24ndCByZXF1aXJlIHN0YWNrIHNwYWNlLiAqKVxubGV0IHJlYyBjb3VudF9hcHBlbmQgbDEgbDIgY291bnQgPVxuICBtYXRjaCBsMiB3aXRoXG4gIHwgW10gLT4gbDFcbiAgfCBfIC0+XG4gICAgKG1hdGNoIGwxIHdpdGhcbiAgICAgfCBbXSAtPiBsMlxuICAgICB8IFsgeDEgXSAtPiB4MSA6OiBsMlxuICAgICB8IFsgeDE7IHgyIF0gLT4geDEgOjogeDIgOjogbDJcbiAgICAgfCBbIHgxOyB4MjsgeDMgXSAtPiB4MSA6OiB4MiA6OiB4MyA6OiBsMlxuICAgICB8IFsgeDE7IHgyOyB4MzsgeDQgXSAtPiB4MSA6OiB4MiA6OiB4MyA6OiB4NCA6OiBsMlxuICAgICB8IHgxIDo6IHgyIDo6IHgzIDo6IHg0IDo6IHg1IDo6IHRsIC0+XG4gICAgICAgeDFcbiAgICAgICA6OiB4MlxuICAgICAgIDo6IHgzXG4gICAgICAgOjogeDRcbiAgICAgICA6OiB4NVxuICAgICAgIDo6XG4gICAgICAgKGlmIGNvdW50ID4gbWF4X25vbl90YWlsY2FsbFxuICAgICAgICB0aGVuIHRhaWxfYXBwZW5kIHRsIGwyXG4gICAgICAgIGVsc2UgY291bnRfYXBwZW5kIHRsIGwyIChjb3VudCArIDEpKSlcbjs7XG5cbmxldCBhcHBlbmQgbDEgbDIgPSBjb3VudF9hcHBlbmQgbDEgbDIgMFxuXG4oKiBBbiBvcmRpbmFyeSB0YWlsIHJlY3Vyc2l2ZSBtYXAgYnVpbGRzIHVwIGFuIGludGVybWVkaWF0ZSAocmV2ZXJzZWQpIHJlcHJlc2VudGF0aW9uLFxuICAgd2l0aCBvbmUgaGVhcCBhbGxvY2F0ZWQgb2JqZWN0IHBlciBlbGVtZW50LiBUaGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uIGluc3RlYWQgY2h1bmtzXG4gICA5IG9iamVjdHMgaW50byBvbmUgaGVhcCBhbGxvY2F0ZWQgb2JqZWN0LCByZWR1Y2luZyBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZSBjb3N0c1xuICAgYWNjb3JkaW5nbHkuIE5vdGUgdGhhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGxpc3QgaXMgZG9uZSBieSB0aGUgc3RkbGliJ3MgbWFwXG4gICBmdW5jdGlvbi4gKilcbmxldCB0YWlsX21hcCB4cyB+ZiA9XG4gIGxldCByZWMgcmlzZSB5cyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiB5c1xuICAgIHwgKHkwLCB5MSwgeTIsIHkzLCB5NCwgeTUsIHk2LCB5NywgeTgpIDo6IGJzIC0+XG4gICAgICByaXNlICh5MCA6OiB5MSA6OiB5MiA6OiB5MyA6OiB5NCA6OiB5NSA6OiB5NiA6OiB5NyA6OiB5OCA6OiB5cykgYnNcbiAgaW5cbiAgbGV0IHJlYyBkaXZlIGJzID0gZnVuY3Rpb25cbiAgICB8IHgwIDo6IHgxIDo6IHgyIDo6IHgzIDo6IHg0IDo6IHg1IDo6IHg2IDo6IHg3IDo6IHg4IDo6IHhzIC0+XG4gICAgICBsZXQgeTAgPSBmIHgwIGluXG4gICAgICBsZXQgeTEgPSBmIHgxIGluXG4gICAgICBsZXQgeTIgPSBmIHgyIGluXG4gICAgICBsZXQgeTMgPSBmIHgzIGluXG4gICAgICBsZXQgeTQgPSBmIHg0IGluXG4gICAgICBsZXQgeTUgPSBmIHg1IGluXG4gICAgICBsZXQgeTYgPSBmIHg2IGluXG4gICAgICBsZXQgeTcgPSBmIHg3IGluXG4gICAgICBsZXQgeTggPSBmIHg4IGluXG4gICAgICBkaXZlICgoeTAsIHkxLCB5MiwgeTMsIHk0LCB5NSwgeTYsIHk3LCB5OCkgOjogYnMpIHhzXG4gICAgfCB4cyAtPiByaXNlIChub250YWlsX21hcCB+ZiB4cykgYnNcbiAgaW5cbiAgZGl2ZSBbXSB4c1xuOztcblxubGV0IHJlYyBjb3VudF9tYXAgfmYgbCBjdHIgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBbXVxuICB8IFsgeDEgXSAtPlxuICAgIGxldCBmMSA9IGYgeDEgaW5cbiAgICBbIGYxIF1cbiAgfCBbIHgxOyB4MiBdIC0+XG4gICAgbGV0IGYxID0gZiB4MSBpblxuICAgIGxldCBmMiA9IGYgeDIgaW5cbiAgICBbIGYxOyBmMiBdXG4gIHwgWyB4MTsgeDI7IHgzIF0gLT5cbiAgICBsZXQgZjEgPSBmIHgxIGluXG4gICAgbGV0IGYyID0gZiB4MiBpblxuICAgIGxldCBmMyA9IGYgeDMgaW5cbiAgICBbIGYxOyBmMjsgZjMgXVxuICB8IFsgeDE7IHgyOyB4MzsgeDQgXSAtPlxuICAgIGxldCBmMSA9IGYgeDEgaW5cbiAgICBsZXQgZjIgPSBmIHgyIGluXG4gICAgbGV0IGYzID0gZiB4MyBpblxuICAgIGxldCBmNCA9IGYgeDQgaW5cbiAgICBbIGYxOyBmMjsgZjM7IGY0IF1cbiAgfCB4MSA6OiB4MiA6OiB4MyA6OiB4NCA6OiB4NSA6OiB0bCAtPlxuICAgIGxldCBmMSA9IGYgeDEgaW5cbiAgICBsZXQgZjIgPSBmIHgyIGluXG4gICAgbGV0IGYzID0gZiB4MyBpblxuICAgIGxldCBmNCA9IGYgeDQgaW5cbiAgICBsZXQgZjUgPSBmIHg1IGluXG4gICAgZjFcbiAgICA6OiBmMlxuICAgIDo6IGYzXG4gICAgOjogZjRcbiAgICA6OiBmNVxuICAgIDo6IChpZiBjdHIgPiBtYXhfbm9uX3RhaWxjYWxsIHRoZW4gdGFpbF9tYXAgfmYgdGwgZWxzZSBjb3VudF9tYXAgfmYgdGwgKGN0ciArIDEpKVxuOztcblxubGV0IG1hcCBsIH5mID0gY291bnRfbWFwIH5mIGwgMFxuXG5sZXQgZm9sZGluZ19tYXAgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBtYXAgdCB+ZjooZnVuIHggLT5cbiAgICBsZXQgbmV3X2FjYywgeSA9IGYgIWFjYyB4IGluXG4gICAgYWNjIDo9IG5ld19hY2M7XG4gICAgeSlcbjs7XG5cbmxldCBmb2xkX21hcCB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGxldCByZXN1bHQgPVxuICAgIG1hcCB0IH5mOihmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MsIHkgPSBmICFhY2MgeCBpblxuICAgICAgYWNjIDo9IG5ld19hY2M7XG4gICAgICB5KVxuICBpblxuICAhYWNjLCByZXN1bHRcbjs7XG5cbmxldCAoID4+fCApIGwgZiA9IG1hcCBsIH5mXG5sZXQgbWFwMl9vayBsMSBsMiB+ZiA9IHJldiAocmV2X21hcDJfb2sgbDEgbDIgfmYpXG5sZXQgbWFwMiBsMSBsMiB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KG1hcDJfb2sgfmYpXG5cbmxldCBtYXAyX2V4biBsMSBsMiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwibWFwMl9leG5cIiBsMSBsMjtcbiAgbWFwMl9vayBsMSBsMiB+ZlxuOztcblxubGV0IHJldl9tYXAzX29rIGwxIGwyIGwzIH5mID1cbiAgbGV0IHJlYyBsb29wIGwxIGwyIGwzIGFjID1cbiAgICBtYXRjaCBsMSwgbDIsIGwzIHdpdGhcbiAgICB8IFtdLCBbXSwgW10gLT4gYWNcbiAgICB8IHgxIDo6IGwxLCB4MiA6OiBsMiwgeDMgOjogbDMgLT4gbG9vcCBsMSBsMiBsMyAoZiB4MSB4MiB4MyA6OiBhYylcbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG4gIGluXG4gIGxvb3AgbDEgbDIgbDMgW11cbjs7XG5cbmxldCByZXZfbWFwMyBsMSBsMiBsMyB+ZiA9IGNoZWNrX2xlbmd0aDMgbDEgbDIgbDMgfmY6KHJldl9tYXAzX29rIH5mKVxuXG5sZXQgcmV2X21hcDNfZXhuIGwxIGwyIGwzIH5mID1cbiAgY2hlY2tfbGVuZ3RoM19leG4gXCJyZXZfbWFwM19leG5cIiBsMSBsMiBsMztcbiAgcmV2X21hcDNfb2sgbDEgbDIgbDMgfmZcbjs7XG5cbmxldCBtYXAzX29rIGwxIGwyIGwzIH5mID0gcmV2IChyZXZfbWFwM19vayBsMSBsMiBsMyB+ZilcbmxldCBtYXAzIGwxIGwyIGwzIH5mID0gY2hlY2tfbGVuZ3RoMyBsMSBsMiBsMyB+ZjoobWFwM19vayB+ZilcblxubGV0IG1hcDNfZXhuIGwxIGwyIGwzIH5mID1cbiAgY2hlY2tfbGVuZ3RoM19leG4gXCJtYXAzX2V4blwiIGwxIGwyIGwzO1xuICBtYXAzX29rIGwxIGwyIGwzIH5mXG47O1xuXG5sZXQgcmVjIHJldl9tYXBfYXBwZW5kIGwxIGwyIH5mID1cbiAgbWF0Y2ggbDEgd2l0aFxuICB8IFtdIC0+IGwyXG4gIHwgaCA6OiB0IC0+IHJldl9tYXBfYXBwZW5kIH5mIHQgKGYgaCA6OiBsMilcbjs7XG5cbmxldCB1bnppcCBsaXN0ID1cbiAgbGV0IHJlYyBsb29wIGxpc3QgbDEgbDIgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gbDEsIGwyXG4gICAgfCAoeCwgeSkgOjogdGwgLT4gbG9vcCB0bCAoeCA6OiBsMSkgKHkgOjogbDIpXG4gIGluXG4gIGxvb3AgKHJldiBsaXN0KSBbXSBbXVxuOztcblxubGV0IHVuemlwMyBsaXN0ID1cbiAgbGV0IHJlYyBsb29wIGxpc3QgbDEgbDIgbDMgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gbDEsIGwyLCBsM1xuICAgIHwgKHgsIHksIHopIDo6IHRsIC0+IGxvb3AgdGwgKHggOjogbDEpICh5IDo6IGwyKSAoeiA6OiBsMylcbiAgaW5cbiAgbG9vcCAocmV2IGxpc3QpIFtdIFtdIFtdXG47O1xuXG5sZXQgemlwX2V4biBsMSBsMiA9XG4gIHRyeSBtYXAyX29rIH5mOihmdW4gYSBiIC0+IGEsIGIpIGwxIGwyIHdpdGhcbiAgfCBfIC0+IGludmFsaWRfYXJnZiBcImxlbmd0aCBtaXNtYXRjaCBpbiB6aXBfZXhuOiAlZCA8PiAlZFwiIChsZW5ndGggbDEpIChsZW5ndGggbDIpICgpXG47O1xuXG5sZXQgemlwIGwxIGwyID0gbWFwMiB+ZjooZnVuIGEgYiAtPiBhLCBiKSBsMSBsMlxuXG4oKiogQWRkaXRpb25hbCBsaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJldl9tYXBpIGwgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjXG4gICAgfCBoIDo6IHQgLT4gbG9vcCAoaSArIDEpIChmIGkgaCA6OiBhY2MpIHRcbiAgaW5cbiAgbG9vcCAwIFtdIGxcbjs7XG5cbmxldCBtYXBpIGwgfmYgPSByZXYgKHJldl9tYXBpIGwgfmYpXG5cbmxldCBmb2xkaW5nX21hcGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBtYXBpIHQgfmY6KGZ1biBpIHggLT5cbiAgICBsZXQgbmV3X2FjYywgeSA9IGYgaSAhYWNjIHggaW5cbiAgICBhY2MgOj0gbmV3X2FjYztcbiAgICB5KVxuOztcblxubGV0IGZvbGRfbWFwaSB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGxldCByZXN1bHQgPVxuICAgIG1hcGkgdCB+ZjooZnVuIGkgeCAtPlxuICAgICAgbGV0IG5ld19hY2MsIHkgPSBmIGkgIWFjYyB4IGluXG4gICAgICBhY2MgOj0gbmV3X2FjYztcbiAgICAgIHkpXG4gIGluXG4gICFhY2MsIHJlc3VsdFxuOztcblxubGV0IGl0ZXJpIGwgfmYgPVxuICBpZ25vcmVcbiAgICAoZm9sZCBsIH5pbml0OjAgfmY6KGZ1biBpIHggLT5cbiAgICAgICBmIGkgeDtcbiAgICAgICBpICsgMSlcbiAgICAgOiBpbnQpXG47O1xuXG5sZXQgZm9sZGkgdCB+aW5pdCB+ZiA9XG4gIHNuZCAoZm9sZCB0IH5pbml0OigwLCBpbml0KSB+ZjooZnVuIChpLCBhY2MpIHYgLT4gaSArIDEsIGYgaSBhY2MgdikpXG47O1xuXG5sZXQgZmlsdGVyaSBsIH5mID1cbiAgcmV2IChmb2xkaSBsIH5mOihmdW4gcG9zIGFjYyB4IC0+IGlmIGYgcG9zIHggdGhlbiB4IDo6IGFjYyBlbHNlIGFjYykgfmluaXQ6W10pXG47O1xuXG5sZXQgcmVkdWNlIGwgfmYgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgaGQgOjogdGwgLT4gU29tZSAoZm9sZCB+aW5pdDpoZCB+ZiB0bClcbjs7XG5cbmxldCByZWR1Y2VfZXhuIGwgfmYgPVxuICBtYXRjaCByZWR1Y2UgbCB+ZiB3aXRoXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmVkdWNlX2V4blwiXG4gIHwgU29tZSB2IC0+IHZcbjs7XG5cbmxldCByZWR1Y2VfYmFsYW5jZWQgbCB+ZiA9XG4gICgqIENhbGwgdGhlIFwic2l6ZVwiIG9mIGEgdmFsdWUgdGhlIG51bWJlciBvZiBsaXN0IGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG9cbiAgICAgaXQgdmlhIGNhbGxzIHRvIFtmXS4gIFdlIHByb2NlZWQgYnkgdXNpbmcgW2ZdIHRvIGNvbWJpbmUgZWxlbWVudHMgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAgIG9mIHRoZSBzYW1lIHNpemUgdW50aWwgd2UgY2FuJ3QgY29tYmluZSBhbnkgbW9yZSwgdGhlbiBnZXR0aW5nIGEgbmV3IGVsZW1lbnQgZnJvbSB0aGVcbiAgICAgaW5wdXQgbGlzdCBhbmQgcmVwZWF0aW5nLlxuXG4gICAgIFdpdGggdGhpcyBzdHJhdGVneSwgaW4gdGhlIGFjY3VtdWxhdG9yOlxuICAgICAtIHdlIG9ubHkgZXZlciBoYXZlIGVsZW1lbnRzIG9mIHNpemVzIGEgcG93ZXIgb2YgdHdvXG4gICAgIC0gd2UgbmV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIGVsZW1lbnQgb2YgZWFjaCBzaXplXG4gICAgIC0gdGhlIHN1bSBvZiBhbGwgdGhlIGVsZW1lbnQgc2l6ZXMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBjb25zdW1lZFxuXG4gICAgIFRoZXNlIGNvbmRpdGlvbnMgZW5mb3JjZSB0aGF0IGxpc3Qgb2YgZWxlbWVudHMgb2YgZWFjaCBzaXplIGlzIHByZWNpc2VseSB0aGUgYmluYXJ5XG4gICAgIGV4cGFuc2lvbiBvZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnN1bWVkOiBpZiB5b3UndmUgY29uc3VtZWQgMTMgPSAwYjExMDFcbiAgICAgZWxlbWVudHMsIHlvdSBoYXZlIG9uZSBlbGVtZW50IG9mIHNpemUgOCwgb25lIG9mIHNpemUgNCwgYW5kIG9uZSBvZiBzaXplIDEuICBIZW5jZVxuICAgICB3aGVuIGEgbmV3IGVsZW1lbnQgY29tZXMgYWxvbmcsIHRoZSBudW1iZXIgb2YgY29tYmluaW5ncyB5b3UgbmVlZCB0byBkbyBpcyB0aGUgbnVtYmVyXG4gICAgIG9mIHRyYWlsaW5nIDFzIGluIHRoZSBiaW5hcnkgZXhwYW5zaW9uIG9mIFtudW1dLCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZVxuICAgICBhbHJlYWR5IGdvbmUgaW50byB0aGUgYWNjdW11bGF0b3IuICBUaGUgYWNjdW11bGF0b3IgaXMgaW4gYXNjZW5kaW5nIG9yZGVyIG9mIHNpemUsIHNvXG4gICAgIHRoZSBuZXh0IGVsZW1lbnQgdG8gY29tYmluZSB3aXRoIGlzIGFsd2F5cyB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKilcbiAgbGV0IHJlYyBzdGVwX2FjY3VtIG51bSBhY2MgeCA9XG4gICAgaWYgbnVtIGxhbmQgMSA9IDBcbiAgICB0aGVuIHggOjogYWNjXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBhY2Mgd2l0aFxuICAgICAgfCBbXSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICgqIE5ldyBlbGVtZW50cyBmcm9tIGxhdGVyIGluIHRoZSBpbnB1dCBsaXN0IGdvIG9uIHRoZSBmcm9udCBvZiB0aGUgYWNjdW11bGF0b3IsIHNvXG4gICAgICAgICB0aGUgYWNjdW11bGF0b3IgaXMgaW4gcmV2ZXJzZSBvcmRlciB3cnQgdGhlIG9yaWdpbmFsIGxpc3Qgb3JkZXIsIGhlbmNlIFtmIHkgeF1cbiAgICAgICAgIGluc3RlYWQgb2YgW2YgeCB5XS4gKilcbiAgICAgIHwgeSA6OiB5cyAtPiBzdGVwX2FjY3VtIChudW0gYXNyIDEpIHlzIChmIHkgeCkpXG4gIGluXG4gICgqIEV4cGVyaW1lbnRhbGx5LCBpbmxpbmluZyBbZm9sZGldIGFuZCB1bnJvbGxpbmcgdGhpcyBsb29wIGEgZmV3IHRpbWVzIGNhbiByZWR1Y2VcbiAgICAgcnVudGltZSBkb3duIHRvIGEgdGhpcmQgYW5kIGFsbG9jYXRpb24gdG8gMS8xNnRoIG9yIHNvIGluIHRoZSBtaWNyb2JlbmNobWFya3MgYmVsb3cuXG4gICAgIEhvd2V2ZXIsIGluIG1vc3QgdXNlIGNhc2VzIFtmXSBpcyBsaWtlbHkgdG8gYmUgZXhwZW5zaXZlIChvdGhlcndpc2Ugd2h5IGRvIHlvdSBjYXJlXG4gICAgIGFib3V0IHRoZSBvcmRlciBvZiByZWR1Y3Rpb24/KSBzbyB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBmdW5jdGlvbiBpdHNlbGYgZG9lc24ndCByZWFsbHlcbiAgICAgbWF0dGVyLiBJZiB5b3UgY29tZSB1cCB3aXRoIGEgdXNlLWNhc2Ugd2hlcmUgaXQgZG9lcywgdGhlbiB0aGF0J3Mgc29tZXRoaW5nIHlvdSBtaWdodFxuICAgICB3YW50IHRvIHRyeTogc2VlIGhnIGxvZyAtcHIgNDllZjA2NWY0MjlkLiAqKVxuICBtYXRjaCBmb2xkaSBsIH5pbml0OltdIH5mOnN0ZXBfYWNjdW0gd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IHhzIC0+IFNvbWUgKGZvbGQgeHMgfmluaXQ6eCB+ZjooZnVuIHggeSAtPiBmIHkgeCkpXG47O1xuXG5sZXQgcmVkdWNlX2JhbGFuY2VkX2V4biBsIH5mID1cbiAgbWF0Y2ggcmVkdWNlX2JhbGFuY2VkIGwgfmYgd2l0aFxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmcgXCJMaXN0LnJlZHVjZV9iYWxhbmNlZF9leG5cIlxuICB8IFNvbWUgdiAtPiB2XG47O1xuXG5sZXQgZ3JvdXBpIGwgfmJyZWFrID1cbiAgbGV0IGdyb3VwcyA9XG4gICAgZm9sZGkgbCB+aW5pdDpbXSB+ZjooZnVuIGkgYWNjIHggLT5cbiAgICAgIG1hdGNoIGFjYyB3aXRoXG4gICAgICB8IFtdIC0+IFsgWyB4IF0gXVxuICAgICAgfCBjdXJyZW50X2dyb3VwIDo6IHRsIC0+XG4gICAgICAgIGlmIGJyZWFrIGkgKGhkX2V4biBjdXJyZW50X2dyb3VwKSB4XG4gICAgICAgIHRoZW4gWyB4IF0gOjogY3VycmVudF9ncm91cCA6OiB0bCAoKiBzdGFydCBuZXcgZ3JvdXAgKilcbiAgICAgICAgZWxzZSAoeCA6OiBjdXJyZW50X2dyb3VwKSA6OiB0bClcbiAgICAoKiBleHRlbmQgY3VycmVudCBncm91cCAqKVxuICBpblxuICBtYXRjaCBncm91cHMgd2l0aFxuICB8IFtdIC0+IFtdXG4gIHwgbCAtPiByZXZfbWFwIGwgfmY6cmV2XG47O1xuXG5sZXQgZ3JvdXAgbCB+YnJlYWsgPSBncm91cGkgbCB+YnJlYWs6KGZ1biBfIHggeSAtPiBicmVhayB4IHkpXG5cbmxldCBzb3J0X2FuZF9ncm91cCBsIH5jb21wYXJlID1cbiAgbCB8PiBzdGFibGVfc29ydCB+Y29tcGFyZSB8PiBncm91cCB+YnJlYWs6KGZ1biB4IHkgLT4gY29tcGFyZSB4IHkgPD4gMClcbjs7XG5cbmxldCBjb25jYXRfbWFwIGwgfmYgPVxuICBsZXQgcmVjIGF1eCBhY2MgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gcmV2IGFjY1xuICAgIHwgaGQgOjogdGwgLT4gYXV4IChyZXZfYXBwZW5kIChmIGhkKSBhY2MpIHRsXG4gIGluXG4gIGF1eCBbXSBsXG47O1xuXG5sZXQgY29uY2F0X21hcGkgbCB+ZiA9XG4gIGxldCByZWMgYXV4IGNvbnQgYWNjID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHJldiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IGF1eCAoY29udCArIDEpIChyZXZfYXBwZW5kIChmIGNvbnQgaGQpIGFjYykgdGxcbiAgaW5cbiAgYXV4IDAgW10gbFxuOztcblxubGV0IG1lcmdlIGwxIGwyIH5jb21wYXJlID1cbiAgbGV0IHJlYyBsb29wIGFjYyBsMSBsMiA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGFjYyBsMlxuICAgIHwgbDEsIFtdIC0+IHJldl9hcHBlbmQgYWNjIGwxXG4gICAgfCBoMSA6OiB0MSwgaDIgOjogdDIgLT5cbiAgICAgIGlmIGNvbXBhcmUgaDEgaDIgPD0gMCB0aGVuIGxvb3AgKGgxIDo6IGFjYykgdDEgbDIgZWxzZSBsb29wIChoMiA6OiBhY2MpIGwxIHQyXG4gIGluXG4gIGxvb3AgW10gbDEgbDJcbjs7XG5cbm1vZHVsZSBDYXJ0ZXNpYW5fcHJvZHVjdCA9IHN0cnVjdFxuICAoKiBXZSBhcmUgZXhwbGljaXQgYWJvdXQgd2hhdCB3ZSBleHBvcnQgZnJvbSBmdW5jdG9ycyBzbyB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseVxuICAgICByZWJpbmQgbW9yZSBlZmZpY2llbnQgbGlzdC1zcGVjaWZpYyBmdW5jdGlvbnMuICopXG5cbiAgbGV0IGJpbmQgPSBjb25jYXRfbWFwXG4gIGxldCBtYXAgPSBtYXBcbiAgbGV0IG1hcDIgYSBiIH5mID0gY29uY2F0X21hcCBhIH5mOihmdW4geCAtPiBtYXAgYiB+ZjooZnVuIHkgLT4gZiB4IHkpKVxuICBsZXQgcmV0dXJuIHggPSBbIHggXVxuICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgbGV0ICggPj49ICkgdCBmID0gYmluZCB0IH5mXG5cbiAgb3BlbiBzdHJ1Y3RcbiAgICBtb2R1bGUgQXBwbGljYXRpdmUgPSBBcHBsaWNhdGl2ZS5NYWtlX3VzaW5nX21hcDIgKHN0cnVjdFxuICAgICAgICB0eXBlICdhIHQgPSAnYSBsaXN0XG5cbiAgICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICAgICAgbGV0IG1hcDIgPSBtYXAyXG4gICAgICBlbmQpXG5cbiAgICBtb2R1bGUgTW9uYWQgPSBNb25hZC5NYWtlIChzdHJ1Y3RcbiAgICAgICAgdHlwZSAnYSB0ID0gJ2EgbGlzdFxuXG4gICAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgICAgIGxldCBiaW5kID0gYmluZFxuICAgICAgZW5kKVxuICBlbmRcblxuICBsZXQgYWxsID0gTW9uYWQuYWxsXG4gIGxldCBhbGxfdW5pdCA9IE1vbmFkLmFsbF91bml0XG4gIGxldCBpZ25vcmVfbSA9IE1vbmFkLmlnbm9yZV9tXG4gIGxldCBqb2luID0gTW9uYWQuam9pblxuXG4gIG1vZHVsZSBNb25hZF9pbmZpeCA9IHN0cnVjdFxuICAgIGxldCAoID4+fCApID0gKCA+PnwgKVxuICAgIGxldCAoID4+PSApID0gKCA+Pj0gKVxuICBlbmRcblxuICBsZXQgYXBwbHkgPSBBcHBsaWNhdGl2ZS5hcHBseVxuICBsZXQgYm90aCA9IEFwcGxpY2F0aXZlLmJvdGhcbiAgbGV0IG1hcDMgPSBBcHBsaWNhdGl2ZS5tYXAzXG4gIGxldCAoIDwqPiApID0gQXBwbGljYXRpdmUuKCA8Kj4gKVxuICBsZXQgKCAqPiApID0gQXBwbGljYXRpdmUuKCAqPiApXG4gIGxldCAoIDwqICkgPSBBcHBsaWNhdGl2ZS4oIDwqIClcblxuICBtb2R1bGUgQXBwbGljYXRpdmVfaW5maXggPSBzdHJ1Y3RcbiAgICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgICBsZXQgKCA8Kj4gKSA9IEFwcGxpY2F0aXZlLiggPCo+IClcbiAgICBsZXQgKCAqPiApID0gQXBwbGljYXRpdmUuKCAqPiApXG4gICAgbGV0ICggPCogKSA9IEFwcGxpY2F0aXZlLiggPCogKVxuICBlbmRcblxuICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgICBsZXQgKCA+Pj0gKSA9ICggPj49IClcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICBsZXQgYmluZCA9IGJpbmRcbiAgICAgIGxldCBtYXAgPSBtYXBcbiAgICAgIGxldCBib3RoID0gYm90aFxuXG4gICAgICBtb2R1bGUgT3Blbl9vbl9yaHMgPSBzdHJ1Y3QgZW5kXG4gICAgZW5kXG4gIGVuZFxuZW5kXG5cbmluY2x1ZGUgKENhcnRlc2lhbl9wcm9kdWN0IDogTW9uYWQuUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0KVxuXG4oKiogcmV0dXJucyBmaW5hbCBlbGVtZW50IG9mIGxpc3QgKilcbmxldCByZWMgbGFzdF9leG4gbGlzdCA9XG4gIG1hdGNoIGxpc3Qgd2l0aFxuICB8IFsgeCBdIC0+IHhcbiAgfCBfIDo6IHRsIC0+IGxhc3RfZXhuIHRsXG4gIHwgW10gLT4gaW52YWxpZF9hcmcgXCJMaXN0Lmxhc3RcIlxuOztcblxuKCoqIG9wdGlvbmFsbHkgcmV0dXJucyBmaW5hbCBlbGVtZW50IG9mIGxpc3QgKilcbmxldCByZWMgbGFzdCBsaXN0ID1cbiAgbWF0Y2ggbGlzdCB3aXRoXG4gIHwgWyB4IF0gLT4gU29tZSB4XG4gIHwgXyA6OiB0bCAtPiBsYXN0IHRsXG4gIHwgW10gLT4gTm9uZVxuOztcblxubGV0IHJlYyBpc19wcmVmaXggbGlzdCB+cHJlZml4IH5lcXVhbCA9XG4gIG1hdGNoIHByZWZpeCB3aXRoXG4gIHwgW10gLT4gdHJ1ZVxuICB8IGhkIDo6IHRsIC0+XG4gICAgKG1hdGNoIGxpc3Qgd2l0aFxuICAgICB8IFtdIC0+IGZhbHNlXG4gICAgIHwgaGQnIDo6IHRsJyAtPiBlcXVhbCBoZCBoZCcgJiYgaXNfcHJlZml4IHRsJyB+cHJlZml4OnRsIH5lcXVhbClcbjs7XG5cbmxldCBmaW5kX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZSB0IH5lcXVhbCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCBhMSA6OiB0IC0+XG4gICAgbGV0IHJlYyBsb29wIGExIHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IFtdIC0+IE5vbmVcbiAgICAgIHwgYTIgOjogdCAtPiBpZiBlcXVhbCBhMSBhMiB0aGVuIFNvbWUgKGExLCBhMikgZWxzZSBsb29wIGEyIHRcbiAgICBpblxuICAgIGxvb3AgYTEgdFxuOztcblxuKCogcmV0dXJucyBsaXN0IHdpdGhvdXQgYWRqYWNlbnQgZHVwbGljYXRlcyAqKVxubGV0IHJlbW92ZV9jb25zZWN1dGl2ZV9kdXBsaWNhdGVzID8od2hpY2hfdG9fa2VlcCA9IGBMYXN0KSBsaXN0IH5lcXVhbCA9XG4gIGxldCByZWMgbG9vcCB0b19rZWVwIGFjY3VtID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHRvX2tlZXAgOjogYWNjdW1cbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICBpZiBlcXVhbCBoZCB0b19rZWVwXG4gICAgICB0aGVuIChcbiAgICAgICAgbGV0IHRvX2tlZXAgPVxuICAgICAgICAgIG1hdGNoIHdoaWNoX3RvX2tlZXAgd2l0aFxuICAgICAgICAgIHwgYEZpcnN0IC0+IHRvX2tlZXBcbiAgICAgICAgICB8IGBMYXN0IC0+IGhkXG4gICAgICAgIGluXG4gICAgICAgIGxvb3AgdG9fa2VlcCBhY2N1bSB0bClcbiAgICAgIGVsc2UgbG9vcCBoZCAodG9fa2VlcCA6OiBhY2N1bSkgdGxcbiAgaW5cbiAgbWF0Y2ggbGlzdCB3aXRoXG4gIHwgW10gLT4gW11cbiAgfCBoZCA6OiB0bCAtPiByZXYgKGxvb3AgaGQgW10gdGwpXG47O1xuXG4oKiogcmV0dXJucyBzb3J0ZWQgdmVyc2lvbiBvZiBsaXN0IHdpdGggZHVwbGljYXRlcyByZW1vdmVkICopXG5sZXQgZGVkdXBfYW5kX3NvcnQgbGlzdCB+Y29tcGFyZSA9XG4gIG1hdGNoIGxpc3Qgd2l0aFxuICB8IFtdIHwgWyBfIF0gLT4gbGlzdCAoKiBwZXJmb3JtYW5jZSBoYWNrICopXG4gIHwgXyAtPlxuICAgIGxldCBlcXVhbCB4IHgnID0gY29tcGFyZSB4IHgnID0gMCBpblxuICAgIGxldCBzb3J0ZWQgPSBzb3J0IH5jb21wYXJlIGxpc3QgaW5cbiAgICByZW1vdmVfY29uc2VjdXRpdmVfZHVwbGljYXRlcyB+ZXF1YWwgc29ydGVkXG47O1xuXG5sZXQgZmluZF9hX2R1cCBsIH5jb21wYXJlID1cbiAgbGV0IHNvcnRlZCA9IHNvcnQgbCB+Y29tcGFyZSBpblxuICBsZXQgcmVjIGxvb3AgbCA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSB8IFsgXyBdIC0+IE5vbmVcbiAgICB8IGhkMSA6OiAoaGQyIDo6IF8gYXMgdGwpIC0+IGlmIGNvbXBhcmUgaGQxIGhkMiA9IDAgdGhlbiBTb21lIGhkMSBlbHNlIGxvb3AgdGxcbiAgaW5cbiAgbG9vcCBzb3J0ZWRcbjs7XG5cbmxldCBjb250YWluc19kdXAgbHN0IH5jb21wYXJlID1cbiAgbWF0Y2ggZmluZF9hX2R1cCBsc3QgfmNvbXBhcmUgd2l0aFxuICB8IFNvbWUgXyAtPiB0cnVlXG4gIHwgTm9uZSAtPiBmYWxzZVxuOztcblxubGV0IGZpbmRfYWxsX2R1cHMgbCB+Y29tcGFyZSA9XG4gICgqIFdlIGFkZCB0aGlzIHJldmVyc2FsLCBzbyB3ZSBjYW4gc2tpcCBhIFtyZXZdIGF0IHRoZSBlbmQuIFdlIGNvdWxkIHNraXBcbiAgICAgW3Jldl0gYW55d2F5IHNpbmNlIHdlIGRvbiBub3QgZ2l2ZSBhbnkgb3JkZXJpbmcgZ3VhcmFudGVlcywgYnV0IGl0IGlzXG4gICAgIG5pY2UgdG8gZ2V0IHJlc3VsdHMgaW4gbmF0dXJhbCBvcmRlci4gKilcbiAgbGV0IGNvbXBhcmUgYSBiID0gLTEgKiBjb21wYXJlIGEgYiBpblxuICBsZXQgc29ydGVkID0gc29ydCB+Y29tcGFyZSBsIGluXG4gICgqIFdhbGsgdGhlIGxpc3QgYW5kIHJlY29yZCB0aGUgZmlyc3Qgb2YgZWFjaCBjb25zZWN1dGl2ZSBydW4gb2YgaWRlbnRpY2FsIGVsZW1lbnRzICopXG4gIGxldCByZWMgbG9vcCBzb3J0ZWQgcHJldiB+YWxyZWFkeV9yZWNvcmRlZCBhY2MgPVxuICAgIG1hdGNoIHNvcnRlZCB3aXRoXG4gICAgfCBbXSAtPiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICBpZiBjb21wYXJlIHByZXYgaGQgPD4gMFxuICAgICAgdGhlbiBsb29wIHRsIGhkIH5hbHJlYWR5X3JlY29yZGVkOmZhbHNlIGFjY1xuICAgICAgZWxzZSBpZiBhbHJlYWR5X3JlY29yZGVkXG4gICAgICB0aGVuIGxvb3AgdGwgaGQgfmFscmVhZHlfcmVjb3JkZWQ6dHJ1ZSBhY2NcbiAgICAgIGVsc2UgbG9vcCB0bCBoZCB+YWxyZWFkeV9yZWNvcmRlZDp0cnVlIChoZCA6OiBhY2MpXG4gIGluXG4gIG1hdGNoIHNvcnRlZCB3aXRoXG4gIHwgW10gLT4gW11cbiAgfCBoZCA6OiB0bCAtPiBsb29wIHRsIGhkIH5hbHJlYWR5X3JlY29yZGVkOmZhbHNlIFtdXG47O1xuXG5sZXQgcmVjIGFsbF9lcXVhbF90byB0IHYgfmVxdWFsID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgW10gLT4gdHJ1ZVxuICB8IHggOjogeHMgLT4gZXF1YWwgeCB2ICYmIGFsbF9lcXVhbF90byB4cyB2IH5lcXVhbFxuOztcblxubGV0IGFsbF9lcXVhbCB0IH5lcXVhbCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IHhzIC0+IGlmIGFsbF9lcXVhbF90byB4cyB4IH5lcXVhbCB0aGVuIFNvbWUgeCBlbHNlIE5vbmVcbjs7XG5cbmxldCBjb3VudCB0IH5mID0gQ29udGFpbmVyLmNvdW50IH5mb2xkIHQgfmZcbmxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcbmxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5sZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuXG5sZXQgY291bnRpIHQgfmYgPVxuICBmb2xkaSB0IH5pbml0OjAgfmY6KGZ1biBpZHggY291bnQgYSAtPiBpZiBmIGlkeCBhIHRoZW4gY291bnQgKyAxIGVsc2UgY291bnQpXG47O1xuXG5sZXQgaW5pdCBuIH5mID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJMaXN0LmluaXQgJWRcIiBuICgpO1xuICBsZXQgcmVjIGxvb3AgaSBhY2N1bSA9XG4gICAgYXNzZXJ0IChpID49IDApO1xuICAgIGlmIGkgPSAwIHRoZW4gYWNjdW0gZWxzZSBsb29wIChpIC0gMSkgKGYgKGkgLSAxKSA6OiBhY2N1bSlcbiAgaW5cbiAgbG9vcCBuIFtdXG47O1xuXG5sZXQgcmV2X2ZpbHRlcl9tYXAgbCB+ZiA9XG4gIGxldCByZWMgbG9vcCBsIGFjY3VtID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IGFjY3VtXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgKG1hdGNoIGYgaGQgd2l0aFxuICAgICAgIHwgU29tZSB4IC0+IGxvb3AgdGwgKHggOjogYWNjdW0pXG4gICAgICAgfCBOb25lIC0+IGxvb3AgdGwgYWNjdW0pXG4gIGluXG4gIGxvb3AgbCBbXVxuOztcblxubGV0IGZpbHRlcl9tYXAgbCB+ZiA9IHJldiAocmV2X2ZpbHRlcl9tYXAgbCB+ZilcblxubGV0IHJldl9maWx0ZXJfbWFwaSBsIH5mID1cbiAgbGV0IHJlYyBsb29wIGkgbCBhY2N1bSA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBhY2N1bVxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgIChtYXRjaCBmIGkgaGQgd2l0aFxuICAgICAgIHwgU29tZSB4IC0+IGxvb3AgKGkgKyAxKSB0bCAoeCA6OiBhY2N1bSlcbiAgICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpIHRsIGFjY3VtKVxuICBpblxuICBsb29wIDAgbCBbXVxuOztcblxubGV0IGZpbHRlcl9tYXBpIGwgfmYgPSByZXYgKHJldl9maWx0ZXJfbWFwaSBsIH5mKVxubGV0IGZpbHRlcl9vcHQgbCA9IGZpbHRlcl9tYXAgbCB+ZjpGbi5pZFxuXG5sZXQgcGFydGl0aW9uM19tYXAgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCB0IGZzdCBzbmQgdHJkID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IHJldiBmc3QsIHJldiBzbmQsIHJldiB0cmRcbiAgICB8IHggOjogdCAtPlxuICAgICAgKG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBgRnN0IHkgLT4gbG9vcCB0ICh5IDo6IGZzdCkgc25kIHRyZFxuICAgICAgIHwgYFNuZCB5IC0+IGxvb3AgdCBmc3QgKHkgOjogc25kKSB0cmRcbiAgICAgICB8IGBUcmQgeSAtPiBsb29wIHQgZnN0IHNuZCAoeSA6OiB0cmQpKVxuICBpblxuICBsb29wIHQgW10gW10gW11cbjs7XG5cbmxldCBwYXJ0aXRpb25fdGYgdCB+ZiA9XG4gIGxldCBmIHggOiBfIEVpdGhlci50ID0gaWYgZiB4IHRoZW4gRmlyc3QgeCBlbHNlIFNlY29uZCB4IGluXG4gIHBhcnRpdGlvbl9tYXAgdCB+ZlxuOztcblxubGV0IHBhcnRpdGlvbl9yZXN1bHQgdCA9IHBhcnRpdGlvbl9tYXAgdCB+ZjpSZXN1bHQudG9fZWl0aGVyXG5cbm1vZHVsZSBBc3NvYyA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EgKiAnYikgbGlzdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCB0X29mX3NleHAgOlxuICAgICdhICdiLlxuICAgIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpXG4gICAgLT4gKFNleHBsaWIwLlNleHAudCAtPiAnYilcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgPVxuICAgIGxldCBlcnJvcl9zb3VyY2VfXzAyMl8gPSBcImxpc3QubWwuQXNzb2MudFwiIGluXG4gICAgZnVuIF9vZl9hX18wMTRfIF9vZl9iX18wMTVfIHhfXzAyM18gLT5cbiAgICAgIGxpc3Rfb2Zfc2V4cFxuICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbIGFyZzBfXzAxN187IGFyZzFfXzAxOF8gXSAtPlxuICAgICAgICAgICAgbGV0IHJlczBfXzAxOV8gPSBfb2ZfYV9fMDE0XyBhcmcwX18wMTdfXG4gICAgICAgICAgICBhbmQgcmVzMV9fMDIwXyA9IF9vZl9iX18wMTVfIGFyZzFfXzAxOF8gaW5cbiAgICAgICAgICAgIHJlczBfXzAxOV8sIHJlczFfXzAyMF9cbiAgICAgICAgICB8IHNleHBfXzAyMV8gLT5cbiAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci50dXBsZV9vZl9zaXplX25fZXhwZWN0ZWRcbiAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMjJfXG4gICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgc2V4cF9fMDIxXylcbiAgICAgICAgeF9fMDIzX1xuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOlxuICAgICdhICdiLlxuICAgICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdiIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgPVxuICAgIGZ1biBfb2ZfYV9fMDI0XyBfb2ZfYl9fMDI1XyB4X18wMzBfIC0+XG4gICAgICBzZXhwX29mX2xpc3RcbiAgICAgICAgKGZ1biAoYXJnMF9fMDI2XywgYXJnMV9fMDI3XykgLT5cbiAgICAgICAgICAgbGV0IHJlczBfXzAyOF8gPSBfb2ZfYV9fMDI0XyBhcmcwX18wMjZfXG4gICAgICAgICAgIGFuZCByZXMxX18wMjlfID0gX29mX2JfXzAyNV8gYXJnMV9fMDI3XyBpblxuICAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyByZXMwX18wMjhfOyByZXMxX18wMjlfIF0pXG4gICAgICAgIHhfXzAzMF9cbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAgICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gJ2IgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAoJ2EsICdiKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciBfJ2Jfc2V4cF9ncmFtbWFyIC0+XG4gICAgICBsaXN0X3NleHBfZ3JhbW1hclxuICAgICAgICB7IHVudHlwZWQgPVxuICAgICAgICAgICAgTGlzdCAoQ29ucyAoXydhX3NleHBfZ3JhbW1hci51bnR5cGVkLCBDb25zIChfJ2Jfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSkpXG4gICAgICAgIH1cbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGxldCBwYWlyX29mX2dyb3VwID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFzc2VydCBmYWxzZVxuICAgIHwgKGssIF8pIDo6IF8gYXMgbGlzdCAtPiBrLCBtYXAgbGlzdCB+ZjpzbmRcbiAgOztcblxuICBsZXQgZ3JvdXAgYWxpc3QgfmVxdWFsID1cbiAgICBncm91cCBhbGlzdCB+YnJlYWs6KGZ1biAoeCwgXykgKHksIF8pIC0+IG5vdCAoZXF1YWwgeCB5KSkgfD4gbWFwIH5mOnBhaXJfb2ZfZ3JvdXBcbiAgOztcblxuICBsZXQgc29ydF9hbmRfZ3JvdXAgYWxpc3QgfmNvbXBhcmUgPVxuICAgIHNvcnRfYW5kX2dyb3VwIGFsaXN0IH5jb21wYXJlOihmdW4gKHgsIF8pICh5LCBfKSAtPiBjb21wYXJlIHggeSlcbiAgICB8PiBtYXAgfmY6cGFpcl9vZl9ncm91cFxuICA7O1xuXG4gIGxldCBmaW5kIHQgfmVxdWFsIGtleSA9XG4gICAgbWF0Y2ggZmluZCB0IH5mOihmdW4gKGtleScsIF8pIC0+IGVxdWFsIGtleSBrZXknKSB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgeCAtPiBTb21lIChzbmQgeClcbiAgOztcblxuICBsZXQgZmluZF9leG4gPVxuICAgIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkxpc3QuQXNzb2MuZmluZF9leG46IG5vdCBmb3VuZFwiKSBpblxuICAgIGxldCBmaW5kX2V4biB0IH5lcXVhbCBrZXkgPVxuICAgICAgbWF0Y2ggZmluZCB0IGtleSB+ZXF1YWwgd2l0aFxuICAgICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgICAgfCBTb21lIHZhbHVlIC0+IHZhbHVlXG4gICAgaW5cbiAgICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gICAgZmluZF9leG5cbiAgOztcblxuICBsZXQgbWVtIHQgfmVxdWFsIGtleSA9XG4gICAgbWF0Y2ggZmluZCB0IH5lcXVhbCBrZXkgd2l0aFxuICAgIHwgTm9uZSAtPiBmYWxzZVxuICAgIHwgU29tZSBfIC0+IHRydWVcbiAgOztcblxuICBsZXQgcmVtb3ZlIHQgfmVxdWFsIGtleSA9IGZpbHRlciB0IH5mOihmdW4gKGtleScsIF8pIC0+IG5vdCAoZXF1YWwga2V5IGtleScpKVxuXG4gIGxldCBhZGQgdCB+ZXF1YWwga2V5IHZhbHVlID1cbiAgICAoKiB0aGUgcmVtb3ZlIGRvZXNuJ3QgY2hhbmdlIHRoZSBtYXAgc2VtYW50aWNzLCBidXQga2VlcHMgdGhlIGxpc3Qgc21hbGwgKilcbiAgICAoa2V5LCB2YWx1ZSkgOjogcmVtb3ZlIHQgfmVxdWFsIGtleVxuICA7O1xuXG4gIGxldCBpbnZlcnNlIHQgPSBtYXAgdCB+ZjooZnVuICh4LCB5KSAtPiB5LCB4KVxuICBsZXQgbWFwIHQgfmYgPSBtYXAgdCB+ZjooZnVuIChrZXksIHZhbHVlKSAtPiBrZXksIGYgdmFsdWUpXG5lbmRcblxubGV0IHN1YiBsIH5wb3MgfmxlbiA9XG4gICgqIFdlIHVzZSBbcG9zID4gbGVuZ3RoIGwgLSBsZW5dIHJhdGhlciB0aGFuIFtwb3MgKyBsZW4gPiBsZW5ndGggbF0gdG8gYXZvaWQgdGhlXG4gICAgIHBvc3NpYmlsaXR5IG9mIG92ZXJmbG93LiAqKVxuICBpZiBwb3MgPCAwIHx8IGxlbiA8IDAgfHwgcG9zID4gbGVuZ3RoIGwgLSBsZW4gdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3Quc3ViXCI7XG4gIHJldlxuICAgIChmb2xkaSBsIH5pbml0OltdIH5mOihmdW4gaSBhY2MgZWwgLT5cbiAgICAgICBpZiBpID49IHBvcyAmJiBpIDwgcG9zICsgbGVuIHRoZW4gZWwgOjogYWNjIGVsc2UgYWNjKSlcbjs7XG5cbmxldCBzcGxpdF9uIHRfb3JpZyBuID1cbiAgaWYgbiA8PSAwXG4gIHRoZW4gW10sIHRfb3JpZ1xuICBlbHNlIChcbiAgICBsZXQgcmVjIGxvb3AgbiB0IGFjY3VtID1cbiAgICAgIGlmIG4gPSAwXG4gICAgICB0aGVuIHJldiBhY2N1bSwgdFxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IFtdIC0+IHRfb3JpZywgW10gKCogaW4gdGhpcyBjYXNlLCB0X29yaWcgPSByZXYgYWNjdW0gKilcbiAgICAgICAgfCBoZCA6OiB0bCAtPiBsb29wIChuIC0gMSkgdGwgKGhkIDo6IGFjY3VtKSlcbiAgICBpblxuICAgIGxvb3AgbiB0X29yaWcgW10pXG47O1xuXG4oKiBjb3BpZWQgZnJvbSBbc3BsaXRfbl0gdG8gYXZvaWQgYWxsb2NhdGluZyBhIHR1cGxlICopXG5sZXQgdGFrZSB0X29yaWcgbiA9XG4gIGlmIG4gPD0gMFxuICB0aGVuIFtdXG4gIGVsc2UgKFxuICAgIGxldCByZWMgbG9vcCBuIHQgYWNjdW0gPVxuICAgICAgaWYgbiA9IDBcbiAgICAgIHRoZW4gcmV2IGFjY3VtXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgW10gLT4gdF9vcmlnXG4gICAgICAgIHwgaGQgOjogdGwgLT4gbG9vcCAobiAtIDEpIHRsIChoZCA6OiBhY2N1bSkpXG4gICAgaW5cbiAgICBsb29wIG4gdF9vcmlnIFtdKVxuOztcblxubGV0IHJlYyBkcm9wIHQgbiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IF8gOjogdGwgd2hlbiBuID4gMCAtPiBkcm9wIHRsIChuIC0gMSlcbiAgfCB0IC0+IHRcbjs7XG5cbmxldCBjaHVua3Nfb2YgbCB+bGVuZ3RoID1cbiAgaWYgbGVuZ3RoIDw9IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJMaXN0LmNodW5rc19vZjogRXhwZWN0ZWQgbGVuZ3RoID4gMCwgZ290ICVkXCIgbGVuZ3RoICgpO1xuICBsZXQgcmVjIGF1eCBvZl9sZW5ndGggYWNjIGwgPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gcmV2IGFjY1xuICAgIHwgXyA6OiBfIC0+XG4gICAgICBsZXQgc3VibGlzdCwgbCA9IHNwbGl0X24gbCBsZW5ndGggaW5cbiAgICAgIGF1eCBvZl9sZW5ndGggKHN1Ymxpc3QgOjogYWNjKSBsXG4gIGluXG4gIGF1eCBsZW5ndGggW10gbFxuOztcblxubGV0IHNwbGl0X3doaWxlIHhzIH5mID1cbiAgbGV0IHJlYyBsb29wIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCB3aGVuIGYgaGQgLT4gbG9vcCAoaGQgOjogYWNjKSB0bFxuICAgIHwgdCAtPiByZXYgYWNjLCB0XG4gIGluXG4gIGxvb3AgW10geHNcbjs7XG5cbigqIGNvcGllZCBmcm9tIFtzcGxpdF93aGlsZV0gdG8gYXZvaWQgYWxsb2NhdGluZyBhIHR1cGxlICopXG5sZXQgdGFrZV93aGlsZSB4cyB+ZiA9XG4gIGxldCByZWMgbG9vcCBhY2MgPSBmdW5jdGlvblxuICAgIHwgaGQgOjogdGwgd2hlbiBmIGhkIC0+IGxvb3AgKGhkIDo6IGFjYykgdGxcbiAgICB8IF8gLT4gcmV2IGFjY1xuICBpblxuICBsb29wIFtdIHhzXG47O1xuXG5sZXQgcmVjIGRyb3Bfd2hpbGUgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IGhkIDo6IHRsIHdoZW4gZiBoZCAtPiBkcm9wX3doaWxlIHRsIH5mXG4gIHwgdCAtPiB0XG47O1xuXG5sZXQgZHJvcF9sYXN0IHQgPVxuICBtYXRjaCByZXYgdCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IF8gOjogbHN0IC0+IFNvbWUgKHJldiBsc3QpXG47O1xuXG5sZXQgZHJvcF9sYXN0X2V4biB0ID1cbiAgbWF0Y2ggZHJvcF9sYXN0IHQgd2l0aFxuICB8IE5vbmUgLT4gZmFpbHdpdGggXCJMaXN0LmRyb3BfbGFzdF9leG46IGVtcHR5IGxpc3RcIlxuICB8IFNvbWUgbHN0IC0+IGxzdFxuOztcblxubGV0IGNhcnRlc2lhbl9wcm9kdWN0IGxpc3QxIGxpc3QyID1cbiAgaWYgaXNfZW1wdHkgbGlzdDJcbiAgdGhlbiBbXVxuICBlbHNlIChcbiAgICBsZXQgcmVjIGxvb3AgbDEgbDIgYWNjdW0gPVxuICAgICAgbWF0Y2ggbDEgd2l0aFxuICAgICAgfCBbXSAtPiBhY2N1bVxuICAgICAgfCBoZCA6OiB0bCAtPiBsb29wIHRsIGwyIChyZXZfYXBwZW5kIChtYXAgfmY6KGZ1biB4IC0+IGhkLCB4KSBsMikgYWNjdW0pXG4gICAgaW5cbiAgICByZXYgKGxvb3AgbGlzdDEgbGlzdDIgW10pKVxuOztcblxubGV0IGNvbmNhdCBsID0gZm9sZF9yaWdodCBsIH5pbml0OltdIH5mOmFwcGVuZFxubGV0IGNvbmNhdF9ub19vcmRlciBsID0gZm9sZCBsIH5pbml0OltdIH5mOihmdW4gYWNjIGwgLT4gcmV2X2FwcGVuZCBsIGFjYylcbmxldCBjb25zIHggbCA9IHggOjogbFxuXG5sZXQgaXNfc29ydGVkIGwgfmNvbXBhcmUgPVxuICBsZXQgcmVjIGxvb3AgbCA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSB8IFsgXyBdIC0+IHRydWVcbiAgICB8IHgxIDo6ICh4MiA6OiBfIGFzIHJlc3QpIC0+IGNvbXBhcmUgeDEgeDIgPD0gMCAmJiBsb29wIHJlc3RcbiAgaW5cbiAgbG9vcCBsXG47O1xuXG5sZXQgaXNfc29ydGVkX3N0cmljdGx5IGwgfmNvbXBhcmUgPVxuICBsZXQgcmVjIGxvb3AgbCA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSB8IFsgXyBdIC0+IHRydWVcbiAgICB8IHgxIDo6ICh4MiA6OiBfIGFzIHJlc3QpIC0+IGNvbXBhcmUgeDEgeDIgPCAwICYmIGxvb3AgcmVzdFxuICBpblxuICBsb29wIGxcbjs7XG5cbm1vZHVsZSBJbmZpeCA9IHN0cnVjdFxuICBsZXQgKCBAICkgPSBhcHBlbmRcbmVuZFxuXG5sZXQgcGVybXV0ZSA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBsaXN0ID1cbiAgbWF0Y2ggbGlzdCB3aXRoXG4gICgqIHNwZWNpYWwgY2FzZXMgdG8gc3BlZWQgdGhpbmdzIHVwIGluIHRyaXZpYWwgY2FzZXMgKilcbiAgfCBbXSB8IFsgXyBdIC0+IGxpc3RcbiAgfCBbIHg7IHkgXSAtPiBpZiBSYW5kb20uU3RhdGUuYm9vbCByYW5kb21fc3RhdGUgdGhlbiBbIHk7IHggXSBlbHNlIGxpc3RcbiAgfCBfIC0+XG4gICAgbGV0IGFyciA9IEFycmF5Lm9mX2xpc3QgbGlzdCBpblxuICAgIEFycmF5X3Blcm11dGUucGVybXV0ZSBhcnIgfnJhbmRvbV9zdGF0ZTtcbiAgICBBcnJheS50b19saXN0IGFyclxuOztcblxubGV0IHJhbmRvbV9lbGVtZW50X2V4biA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBsaXN0ID1cbiAgaWYgaXNfZW1wdHkgbGlzdFxuICB0aGVuIGZhaWx3aXRoIFwiTGlzdC5yYW5kb21fZWxlbWVudF9leG46IGVtcHR5IGxpc3RcIlxuICBlbHNlIG50aF9leG4gbGlzdCAoUmFuZG9tLlN0YXRlLmludCByYW5kb21fc3RhdGUgKGxlbmd0aCBsaXN0KSlcbjs7XG5cbmxldCByYW5kb21fZWxlbWVudCA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBsaXN0ID1cbiAgdHJ5IFNvbWUgKHJhbmRvbV9lbGVtZW50X2V4biB+cmFuZG9tX3N0YXRlIGxpc3QpIHdpdGhcbiAgfCBfIC0+IE5vbmVcbjs7XG5cbmxldCByZWMgY29tcGFyZSBjbXAgYSBiID1cbiAgbWF0Y2ggYSwgYiB3aXRoXG4gIHwgW10sIFtdIC0+IDBcbiAgfCBbXSwgXyAtPiAtMVxuICB8IF8sIFtdIC0+IDFcbiAgfCB4IDo6IHhzLCB5IDo6IHlzIC0+XG4gICAgbGV0IG4gPSBjbXAgeCB5IGluXG4gICAgaWYgbiA9IDAgdGhlbiBjb21wYXJlIGNtcCB4cyB5cyBlbHNlIG5cbjs7XG5cbmxldCBoYXNoX2ZvbGRfdCA9IGhhc2hfZm9sZF9saXN0XG5cbmxldCBlcXVhbCBlcXVhbCB0MSB0MiA9XG4gIGxldCByZWMgbG9vcCB+ZXF1YWwgdDEgdDIgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBbXSwgW10gLT4gdHJ1ZVxuICAgIHwgeDEgOjogdDEsIHgyIDo6IHQyIC0+IGVxdWFsIHgxIHgyICYmIGxvb3AgfmVxdWFsIHQxIHQyXG4gICAgfCBfIC0+IGZhbHNlXG4gIGluXG4gIGxvb3AgfmVxdWFsIHQxIHQyXG47O1xuXG5sZXQgdHJhbnNwb3NlID1cbiAgbGV0IHJlYyBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHQgY29sdW1uX2FjYyB0cmltbWVkIGZvdW5kX2VtcHR5ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IGNvbHVtbl9hY2MsIHRyaW1tZWQsIGZvdW5kX2VtcHR5XG4gICAgfCBbXSA6OiB0bCAtPiBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHRsIGNvbHVtbl9hY2MgdHJpbW1lZCB0cnVlXG4gICAgfCAoeCA6OiB4cykgOjogdGwgLT5cbiAgICAgIHNwbGl0X29mZl9maXJzdF9jb2x1bW4gdGwgKHggOjogY29sdW1uX2FjYykgKHhzIDo6IHRyaW1tZWQpIGZvdW5kX2VtcHR5XG4gIGluXG4gIGxldCBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHJvd3MgPSBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHJvd3MgW10gW10gZmFsc2UgaW5cbiAgbGV0IHJlYyBsb29wIHJvd3MgY29sdW1ucyBkb19yZXYgPVxuICAgIG1hdGNoIHNwbGl0X29mZl9maXJzdF9jb2x1bW4gcm93cyB3aXRoXG4gICAgfCBbXSwgW10sIF8gLT4gU29tZSAocmV2IGNvbHVtbnMpXG4gICAgfCBjb2x1bW4sIHRyaW1tZWRfcm93cywgZm91bmRfZW1wdHkgLT5cbiAgICAgIGlmIGZvdW5kX2VtcHR5XG4gICAgICB0aGVuIE5vbmVcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgY29sdW1uID0gaWYgZG9fcmV2IHRoZW4gcmV2IGNvbHVtbiBlbHNlIGNvbHVtbiBpblxuICAgICAgICBsb29wIHRyaW1tZWRfcm93cyAoY29sdW1uIDo6IGNvbHVtbnMpIChub3QgZG9fcmV2KSlcbiAgaW5cbiAgZnVuIHQgLT4gbG9vcCB0IFtdIHRydWVcbjs7XG5cbmV4Y2VwdGlvbiBUcmFuc3Bvc2VfZ290X2xpc3RzX29mX2RpZmZlcmVudF9sZW5ndGhzIG9mIGludCBsaXN0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG5sZXQgKCkgPVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGRcbiAgICBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBUcmFuc3Bvc2VfZ290X2xpc3RzX29mX2RpZmZlcmVudF9sZW5ndGhzXVxuICAgIChmdW5jdGlvblxuICAgICAgfCBUcmFuc3Bvc2VfZ290X2xpc3RzX29mX2RpZmZlcmVudF9sZW5ndGhzIGFyZzBfXzAzMV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAzMl8gPSBzZXhwX29mX2xpc3Qgc2V4cF9vZl9pbnQgYXJnMF9fMDMxXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcImxpc3QubWwuVHJhbnNwb3NlX2dvdF9saXN0c19vZl9kaWZmZXJlbnRfbGVuZ3Roc1wiXG4gICAgICAgICAgOyByZXMwX18wMzJfXG4gICAgICAgICAgXVxuICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbjs7XG5cbltAQEBlbmRdXG5cbmxldCB0cmFuc3Bvc2VfZXhuIGwgPVxuICBtYXRjaCB0cmFuc3Bvc2UgbCB3aXRoXG4gIHwgU29tZSBsIC0+IGxcbiAgfCBOb25lIC0+IHJhaXNlIChUcmFuc3Bvc2VfZ290X2xpc3RzX29mX2RpZmZlcmVudF9sZW5ndGhzIChtYXAgbCB+ZjpsZW5ndGgpKVxuOztcblxubGV0IGludGVyc3BlcnNlIHQgfnNlcCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IFtdXG4gIHwgeCA6OiB4cyAtPiB4IDo6IGZvbGRfcmlnaHQgeHMgfmluaXQ6W10gfmY6KGZ1biB5IGFjYyAtPiBzZXAgOjogeSA6OiBhY2MpXG47O1xuXG5sZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgdFxuXG5sZXQgaXNfc3VmZml4IGxpc3QgfnN1ZmZpeCB+ZXF1YWw6ZXF1YWxfZWx0ID1cbiAgbGV0IGxpc3RfbGVuID0gbGVuZ3RoIGxpc3QgaW5cbiAgbGV0IHN1ZmZpeF9sZW4gPSBsZW5ndGggc3VmZml4IGluXG4gIGxpc3RfbGVuID49IHN1ZmZpeF9sZW4gJiYgZXF1YWwgZXF1YWxfZWx0IChkcm9wIGxpc3QgKGxpc3RfbGVuIC0gc3VmZml4X2xlbikpIHN1ZmZpeFxuOztcbiIsIigqIFRoaXMgbW9kdWxlIGlzIHRyeWluZyB0byBtaW5pbWl6ZSBkZXBlbmRlbmNpZXMgb24gbW9kdWxlcyBpbiBDb3JlLCBzbyBhcyB0byBhbGxvd1xuICAgW0luZm9dLCBbRXJyb3JdLCBhbmQgW09yX2Vycm9yXSB0byBiZSB1c2VkIGluIGFzIG1hbnkgcGxhY2VzIGFzIHBvc3NpYmxlLiBQbGVhc2UgYXZvaWRcbiAgIGFkZGluZyBuZXcgZGVwZW5kZW5jaWVzLiAqKVxuXG5vcGVuISBJbXBvcnRcbmluY2x1ZGUgSW5mb19pbnRmXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxuXG5tb2R1bGUgTWVzc2FnZSA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgQ291bGRfbm90X2NvbnN0cnVjdCBvZiBTZXhwLnRcbiAgICB8IFN0cmluZyBvZiBzdHJpbmdcbiAgICB8IEV4biBvZiBleG5cbiAgICB8IFNleHAgb2YgU2V4cC50XG4gICAgfCBUYWdfc2V4cCBvZiBzdHJpbmcgKiBTZXhwLnQgKiBTb3VyY2VfY29kZV9wb3NpdGlvbjAudCBvcHRpb25cbiAgICB8IFRhZ190IG9mIHN0cmluZyAqIHRcbiAgICB8IFRhZ19hcmcgb2Ygc3RyaW5nICogU2V4cC50ICogdFxuICAgIHwgT2ZfbGlzdCBvZiBpbnQgb3B0aW9uICogdCBsaXN0XG4gICAgfCBXaXRoX2JhY2t0cmFjZSBvZiB0ICogc3RyaW5nICgqIGJhY2t0cmFjZSAqKVxuICBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICBsZXQgcmVjIHNleHBfb2ZfdCA9XG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IENvdWxkX25vdF9jb25zdHJ1Y3QgYXJnMF9fMDAxXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDAyXyA9IFNleHAuc2V4cF9vZl90IGFyZzBfXzAwMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiQ291bGRfbm90X2NvbnN0cnVjdFwiOyByZXMwX18wMDJfIF1cbiAgICAgIHwgU3RyaW5nIGFyZzBfXzAwM18gLT5cbiAgICAgICAgbGV0IHJlczBfXzAwNF8gPSBzZXhwX29mX3N0cmluZyBhcmcwX18wMDNfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlN0cmluZ1wiOyByZXMwX18wMDRfIF1cbiAgICAgIHwgRXhuIGFyZzBfXzAwNV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAwNl8gPSBzZXhwX29mX2V4biBhcmcwX18wMDVfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkV4blwiOyByZXMwX18wMDZfIF1cbiAgICAgIHwgU2V4cCBhcmcwX18wMDdfIC0+XG4gICAgICAgIGxldCByZXMwX18wMDhfID0gU2V4cC5zZXhwX29mX3QgYXJnMF9fMDA3XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJTZXhwXCI7IHJlczBfXzAwOF8gXVxuICAgICAgfCBUYWdfc2V4cCAoYXJnMF9fMDA5XywgYXJnMV9fMDEwXywgYXJnMl9fMDExXykgLT5cbiAgICAgICAgbGV0IHJlczBfXzAxMl8gPSBzZXhwX29mX3N0cmluZyBhcmcwX18wMDlfXG4gICAgICAgIGFuZCByZXMxX18wMTNfID0gU2V4cC5zZXhwX29mX3QgYXJnMV9fMDEwX1xuICAgICAgICBhbmQgcmVzMl9fMDE0XyA9IHNleHBfb2Zfb3B0aW9uIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3QgYXJnMl9fMDExXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlRhZ19zZXhwXCI7IHJlczBfXzAxMl87IHJlczFfXzAxM187IHJlczJfXzAxNF8gXVxuICAgICAgfCBUYWdfdCAoYXJnMF9fMDE1XywgYXJnMV9fMDE2XykgLT5cbiAgICAgICAgbGV0IHJlczBfXzAxN18gPSBzZXhwX29mX3N0cmluZyBhcmcwX18wMTVfXG4gICAgICAgIGFuZCByZXMxX18wMThfID0gc2V4cF9vZl90IGFyZzFfXzAxNl8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiVGFnX3RcIjsgcmVzMF9fMDE3XzsgcmVzMV9fMDE4XyBdXG4gICAgICB8IFRhZ19hcmcgKGFyZzBfXzAxOV8sIGFyZzFfXzAyMF8sIGFyZzJfXzAyMV8pIC0+XG4gICAgICAgIGxldCByZXMwX18wMjJfID0gc2V4cF9vZl9zdHJpbmcgYXJnMF9fMDE5X1xuICAgICAgICBhbmQgcmVzMV9fMDIzXyA9IFNleHAuc2V4cF9vZl90IGFyZzFfXzAyMF9cbiAgICAgICAgYW5kIHJlczJfXzAyNF8gPSBzZXhwX29mX3QgYXJnMl9fMDIxXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlRhZ19hcmdcIjsgcmVzMF9fMDIyXzsgcmVzMV9fMDIzXzsgcmVzMl9fMDI0XyBdXG4gICAgICB8IE9mX2xpc3QgKGFyZzBfXzAyNV8sIGFyZzFfXzAyNl8pIC0+XG4gICAgICAgIGxldCByZXMwX18wMjdfID0gc2V4cF9vZl9vcHRpb24gc2V4cF9vZl9pbnQgYXJnMF9fMDI1X1xuICAgICAgICBhbmQgcmVzMV9fMDI4XyA9IHNleHBfb2ZfbGlzdCBzZXhwX29mX3QgYXJnMV9fMDI2XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJPZl9saXN0XCI7IHJlczBfXzAyN187IHJlczFfXzAyOF8gXVxuICAgICAgfCBXaXRoX2JhY2t0cmFjZSAoYXJnMF9fMDI5XywgYXJnMV9fMDMwXykgLT5cbiAgICAgICAgbGV0IHJlczBfXzAzMV8gPSBzZXhwX29mX3QgYXJnMF9fMDI5X1xuICAgICAgICBhbmQgcmVzMV9fMDMyXyA9IHNleHBfb2Zfc3RyaW5nIGFyZzFfXzAzMF8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiV2l0aF9iYWNrdHJhY2VcIjsgcmVzMF9fMDMxXzsgcmVzMV9fMDMyXyBdXG4gICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBsZXQgcmVjIHRvX3N0cmluZ3NfaHVtIHQgYWMgPVxuICAgICgqIFdlIHVzZSBbU2V4cC50b19zdHJpbmdfbWFjaF0sIGRlc3BpdGUgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgaW1wbGVtZW50aW5nXG4gICAgICAgW3RvX3N0cmluZ3NfaHVtXSwgYmVjYXVzZSB3ZSB3YW50IHRoZSBpbmZvIHRvIGZpdCBvbiBhIHNpbmdsZSBsaW5lLCBhbmQgb25jZSB3ZSd2ZVxuICAgICAgIGhhZCB0byByZXNvcnQgdG8gc2V4cHMsIHRoZSBtZXNzYWdlIGlzIGdvaW5nIHRvIHN0YXJ0IG5vdCBsb29raW5nIHNvIHByZXR0eVxuICAgICAgIGFueXdheS4gKilcbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IENvdWxkX25vdF9jb25zdHJ1Y3Qgc2V4cCAtPlxuICAgICAgXCJjb3VsZCBub3QgY29uc3RydWN0IGluZm86IFwiIDo6IFNleHAudG9fc3RyaW5nX21hY2ggc2V4cCA6OiBhY1xuICAgIHwgU3RyaW5nIHN0cmluZyAtPiBzdHJpbmcgOjogYWNcbiAgICB8IEV4biBleG4gLT4gU2V4cC50b19zdHJpbmdfbWFjaCAoRXhuLnNleHBfb2ZfdCBleG4pIDo6IGFjXG4gICAgfCBTZXhwIHNleHAgLT4gU2V4cC50b19zdHJpbmdfbWFjaCBzZXhwIDo6IGFjXG4gICAgfCBUYWdfc2V4cCAodGFnLCBzZXhwLCBfKSAtPiB0YWcgOjogXCI6IFwiIDo6IFNleHAudG9fc3RyaW5nX21hY2ggc2V4cCA6OiBhY1xuICAgIHwgVGFnX3QgKHRhZywgdCkgLT4gdGFnIDo6IFwiOiBcIiA6OiB0b19zdHJpbmdzX2h1bSB0IGFjXG4gICAgfCBUYWdfYXJnICh0YWcsIHNleHAsIHQpIC0+XG4gICAgICBsZXQgYm9keSA9IFNleHAudG9fc3RyaW5nX21hY2ggc2V4cCA6OiBcIjogXCIgOjogdG9fc3RyaW5nc19odW0gdCBhYyBpblxuICAgICAgaWYgU3RyaW5nLmxlbmd0aCB0YWcgPSAwIHRoZW4gYm9keSBlbHNlIHRhZyA6OiBcIjogXCIgOjogYm9keVxuICAgIHwgV2l0aF9iYWNrdHJhY2UgKHQsIGJhY2t0cmFjZSkgLT5cbiAgICAgIHRvX3N0cmluZ3NfaHVtIHQgKFwiXFxuQmFja3RyYWNlOlxcblwiIDo6IGJhY2t0cmFjZSA6OiBhYylcbiAgICB8IE9mX2xpc3QgKHRydW5jX2FmdGVyLCB0cykgLT5cbiAgICAgIGxldCB0cyA9XG4gICAgICAgIG1hdGNoIHRydW5jX2FmdGVyIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHRzXG4gICAgICAgIHwgU29tZSBtYXggLT5cbiAgICAgICAgICBsZXQgbiA9IExpc3QubGVuZ3RoIHRzIGluXG4gICAgICAgICAgaWYgbiA8PSBtYXhcbiAgICAgICAgICB0aGVuIHRzXG4gICAgICAgICAgZWxzZSBMaXN0LnRha2UgdHMgbWF4IEAgWyBTdHJpbmcgKFByaW50Zi5zcHJpbnRmIFwiYW5kICVkIG1vcmUgaW5mb1wiIChuIC0gbWF4KSkgXVxuICAgICAgaW5cbiAgICAgIExpc3QuZm9sZCAoTGlzdC5yZXYgdHMpIH5pbml0OmFjIH5mOihmdW4gYWMgdCAtPlxuICAgICAgICB0b19zdHJpbmdzX2h1bSB0IChpZiBMaXN0LmlzX2VtcHR5IGFjIHRoZW4gYWMgZWxzZSBcIjsgXCIgOjogYWMpKVxuICA7O1xuXG4gIGxldCB0b19zdHJpbmdfaHVtX2RlcHJlY2F0ZWQgdCA9IFN0cmluZy5jb25jYXQgKHRvX3N0cmluZ3NfaHVtIHQgW10pXG5cbiAgbGV0IHJlYyB0b19zZXhwc19odW0gdCBhYyA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBDb3VsZF9ub3RfY29uc3RydWN0IF8gYXMgdCAtPiBzZXhwX29mX3QgdCA6OiBhY1xuICAgIHwgU3RyaW5nIHN0cmluZyAtPiBBdG9tIHN0cmluZyA6OiBhY1xuICAgIHwgRXhuIGV4biAtPiBFeG4uc2V4cF9vZl90IGV4biA6OiBhY1xuICAgIHwgU2V4cCBzZXhwIC0+IHNleHAgOjogYWNcbiAgICB8IFRhZ19zZXhwICh0YWcsIHNleHAsIGhlcmUpIC0+XG4gICAgICBMaXN0XG4gICAgICAgIChBdG9tIHRhZ1xuICAgICAgICAgOjogc2V4cFxuICAgICAgICAgOjpcbiAgICAgICAgIChtYXRjaCBoZXJlIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gW11cbiAgICAgICAgICB8IFNvbWUgaGVyZSAtPiBbIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3QgaGVyZSBdKSlcbiAgICAgIDo6IGFjXG4gICAgfCBUYWdfdCAodGFnLCB0KSAtPiBMaXN0IChBdG9tIHRhZyA6OiB0b19zZXhwc19odW0gdCBbXSkgOjogYWNcbiAgICB8IFRhZ19hcmcgKHRhZywgc2V4cCwgdCkgLT5cbiAgICAgIGxldCBib2R5ID0gc2V4cCA6OiB0b19zZXhwc19odW0gdCBbXSBpblxuICAgICAgaWYgU3RyaW5nLmxlbmd0aCB0YWcgPSAwIHRoZW4gTGlzdCBib2R5IDo6IGFjIGVsc2UgTGlzdCAoQXRvbSB0YWcgOjogYm9keSkgOjogYWNcbiAgICB8IFdpdGhfYmFja3RyYWNlICh0LCBiYWNrdHJhY2UpIC0+XG4gICAgICBTZXhwLkxpc3QgWyB0b19zZXhwX2h1bSB0OyBTZXhwLkF0b20gYmFja3RyYWNlIF0gOjogYWNcbiAgICB8IE9mX2xpc3QgKF8sIHRzKSAtPlxuICAgICAgTGlzdC5mb2xkIChMaXN0LnJldiB0cykgfmluaXQ6YWMgfmY6KGZ1biBhYyB0IC0+IHRvX3NleHBzX2h1bSB0IGFjKVxuXG4gIGFuZCB0b19zZXhwX2h1bSB0ID1cbiAgICBtYXRjaCB0b19zZXhwc19odW0gdCBbXSB3aXRoXG4gICAgfCBbIHNleHAgXSAtPiBzZXhwXG4gICAgfCBzZXhwcyAtPiBTZXhwLkxpc3Qgc2V4cHNcbiAgOztcblxuICAoKiBXZSB1c2UgW3Byb3RlY3RdIHRvIGd1YXJkIGFnYWluc3QgZXhjZXB0aW9ucyByYWlzZWQgYnkgdXNlci1zdXBwbGllZCBmdW5jdGlvbnMsIHNvXG4gICAgIHRoYXQgZmFpbHVyZSB0byBwcm9kdWNlIG9uZSBwYXJ0IG9mIGFuIGluZm8gZG9lc24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBwYXJ0cy4gKilcbiAgbGV0IHByb3RlY3QgZiA9XG4gICAgdHJ5IGYgKCkgd2l0aFxuICAgIHwgZXhuIC0+IENvdWxkX25vdF9jb25zdHJ1Y3QgKEV4bi5zZXhwX29mX3QgZXhuKVxuICA7O1xuXG4gIGxldCBvZl9pbmZvIGluZm8gPSBwcm90ZWN0IChmdW4gKCkgLT4gTGF6eS5mb3JjZSBpbmZvKVxuICBsZXQgdG9faW5mbyB0ID0gbGF6eSB0XG5lbmRcblxub3BlbiBNZXNzYWdlXG5cbnR5cGUgdCA9IE1lc3NhZ2UudCBMYXp5LnRcblxubGV0IGludmFyaWFudCBfID0gKClcbmxldCB0b19tZXNzYWdlID0gTWVzc2FnZS5vZl9pbmZvXG5sZXQgb2ZfbWVzc2FnZSA9IE1lc3NhZ2UudG9faW5mb1xuXG4oKiBJdCBpcyBPSyB0byB1c2UgW01lc3NhZ2UudG9fc2V4cF9odW1dLCB3aGljaCBpcyBub3Qgc3RhYmxlLCBiZWNhdXNlIFt0X29mX3NleHBdIGJlbG93XG4gICBjYW4gaGFuZGxlIGFueSBzZXhwLiAqKVxubGV0IHNleHBfb2ZfdCB0ID0gTWVzc2FnZS50b19zZXhwX2h1bSAodG9fbWVzc2FnZSB0KVxubGV0IHRfb2Zfc2V4cCBzZXhwID0gbGF6eSAoTWVzc2FnZS5TZXhwIHNleHApXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSB7IHVudHlwZWQgPSBBbnkgXCJJbmZvLnRcIiB9XG5sZXQgY29tcGFyZSB0MSB0MiA9IFNleHAuY29tcGFyZSAoc2V4cF9vZl90IHQxKSAoc2V4cF9vZl90IHQyKVxubGV0IGVxdWFsIHQxIHQyID0gU2V4cC5lcXVhbCAoc2V4cF9vZl90IHQxKSAoc2V4cF9vZl90IHQyKVxubGV0IGhhc2hfZm9sZF90IHN0YXRlIHQgPSBTZXhwLmhhc2hfZm9sZF90IHN0YXRlIChzZXhwX29mX3QgdClcbmxldCBoYXNoIHQgPSBIYXNoLnJ1biBoYXNoX2ZvbGRfdCB0XG5cbmxldCB0b19zdHJpbmdfaHVtIHQgPVxuICBtYXRjaCB0b19tZXNzYWdlIHQgd2l0aFxuICB8IFN0cmluZyBzIC0+IHNcbiAgfCBtZXNzYWdlIC0+IFNleHAudG9fc3RyaW5nX2h1bSAoTWVzc2FnZS50b19zZXhwX2h1bSBtZXNzYWdlKVxuOztcblxubGV0IHRvX3N0cmluZ19odW1fZGVwcmVjYXRlZCB0ID0gTWVzc2FnZS50b19zdHJpbmdfaHVtX2RlcHJlY2F0ZWQgKHRvX21lc3NhZ2UgdClcbmxldCB0b19zdHJpbmdfbWFjaCB0ID0gU2V4cC50b19zdHJpbmdfbWFjaCAoc2V4cF9vZl90IHQpXG5sZXQgb2ZfbGF6eSBsID0gbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFN0cmluZyAoTGF6eS5mb3JjZSBsKSkpXG5sZXQgb2ZfbGF6eV9zZXhwIGwgPSBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gU2V4cCAoTGF6eS5mb3JjZSBsKSkpXG5sZXQgb2ZfbGF6eV90IGxhenlfdCA9IExhenkuam9pbiBsYXp5X3RcbmxldCBvZl9zdHJpbmcgbWVzc2FnZSA9IExhenkuZnJvbV92YWwgKFN0cmluZyBtZXNzYWdlKVxubGV0IGNyZWF0ZWYgZm9ybWF0ID0gUHJpbnRmLmtzcHJpbnRmIG9mX3N0cmluZyBmb3JtYXRcbmxldCBvZl90aHVuayBmID0gbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFN0cmluZyAoZiAoKSkpKVxuXG5sZXQgY3JlYXRlID9oZXJlID9zdHJpY3QgdGFnIHggc2V4cF9vZl94ID1cbiAgbWF0Y2ggc3RyaWN0IHdpdGhcbiAgfCBOb25lIC0+IGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBUYWdfc2V4cCAodGFnLCBzZXhwX29mX3ggeCwgaGVyZSkpKVxuICB8IFNvbWUgKCkgLT4gb2ZfbWVzc2FnZSAoVGFnX3NleHAgKHRhZywgc2V4cF9vZl94IHgsIGhlcmUpKVxuOztcblxubGV0IGNyZWF0ZV9zIHNleHAgPSBMYXp5LmZyb21fdmFsIChTZXhwIHNleHApXG5sZXQgdGFnIHQgfnRhZyA9IGxhenkgKFRhZ190ICh0YWcsIHRvX21lc3NhZ2UgdCkpXG5cbmxldCB0YWdfc19sYXp5IHQgfnRhZyA9XG4gIGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBUYWdfYXJnIChcIlwiLCBMYXp5LmZvcmNlIHRhZywgdG9fbWVzc2FnZSB0KSkpXG47O1xuXG5sZXQgdGFnX3MgdCB+dGFnID0gdGFnX3NfbGF6eSB0IH50YWc6KExhenkuZnJvbV92YWwgdGFnKVxuXG5sZXQgdGFnX2FyZyB0IHRhZyB4IHNleHBfb2ZfeCA9XG4gIGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBUYWdfYXJnICh0YWcsIHNleHBfb2ZfeCB4LCB0b19tZXNzYWdlIHQpKSlcbjs7XG5cbmxldCBvZl9saXN0ID90cnVuY19hZnRlciB0cyA9IGxhenkgKE9mX2xpc3QgKHRydW5jX2FmdGVyLCBMaXN0Lm1hcCB0cyB+Zjp0b19tZXNzYWdlKSlcblxuZXhjZXB0aW9uIEV4biBvZiB0XG5cbmxldCAoKSA9XG4gICgqIFdlIGluc3RhbGwgYSBjdXN0b20gZXhuLWNvbnZlcnRlciByYXRoZXIgdGhhbiB1c2VcbiAgICAgW2V4Y2VwdGlvbiBFeG4gb2YgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF0gLi4uIFtAQEBlbmRdXSB0byBlbGltaW5hdGUgdGhlIGV4dHJhXG4gICAgIHdyYXBwaW5nIG9mIFwiKEV4biAuLi4pXCIuICopXG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBFeG5dIChmdW5jdGlvblxuICAgIHwgRXhuIHQgLT4gc2V4cF9vZl90IHRcbiAgICB8IF8gLT5cbiAgICAgICgqIFJlYWNoaW5nIHRoaXMgYnJhbmNoIGluZGljYXRlcyBhIGJ1ZyBpbiBzZXhwbGliLiAqKVxuICAgICAgYXNzZXJ0IGZhbHNlKVxuOztcblxubGV0IHRvX2V4biB0ID1cbiAgaWYgbm90IChMYXp5LmlzX3ZhbCB0KVxuICB0aGVuIEV4biB0XG4gIGVsc2UgKFxuICAgIG1hdGNoIExhenkuZm9yY2UgdCB3aXRoXG4gICAgfCBNZXNzYWdlLkV4biBleG4gLT4gZXhuXG4gICAgfCBfIC0+IEV4biB0KVxuOztcblxubGV0IG9mX2V4biA/YmFja3RyYWNlIGV4biA9XG4gIGxldCBiYWNrdHJhY2UgPVxuICAgIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgYEdldCAtPiBTb21lIChDYW1sLlByaW50ZXhjLmdldF9iYWNrdHJhY2UgKCkpXG4gICAgfCBTb21lIChgVGhpcyBzKSAtPiBTb21lIHNcbiAgaW5cbiAgbWF0Y2ggZXhuLCBiYWNrdHJhY2Ugd2l0aFxuICB8IEV4biB0LCBOb25lIC0+IHRcbiAgfCBFeG4gdCwgU29tZSBiYWNrdHJhY2UgLT4gbGF6eSAoV2l0aF9iYWNrdHJhY2UgKHRvX21lc3NhZ2UgdCwgYmFja3RyYWNlKSlcbiAgfCBfLCBOb25lIC0+IExhenkuZnJvbV92YWwgKE1lc3NhZ2UuRXhuIGV4bilcbiAgfCBfLCBTb21lIGJhY2t0cmFjZSAtPiBsYXp5IChXaXRoX2JhY2t0cmFjZSAoU2V4cCAoRXhuLnNleHBfb2ZfdCBleG4pLCBiYWNrdHJhY2UpKVxuOztcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3Rlcl9wcCAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbmZvXCJcbiAgICBsZXQgcHAgcHBmIHQgPSBDYW1sLkZvcm1hdC5wcF9wcmludF9zdHJpbmcgcHBmICh0b19zdHJpbmdfaHVtIHQpXG4gIGVuZClcblxubW9kdWxlIEludGVybmFsX3JlcHIgPSBNZXNzYWdlXG5cbiIsIigqIFRoaXMgbW9kdWxlIGlzIHRyeWluZyB0byBtaW5pbWl6ZSBkZXBlbmRlbmNpZXMgb24gbW9kdWxlcyBpbiBDb3JlLCBzbyBhcyB0byBhbGxvd1xuICAgW0Vycm9yXSBhbmQgW09yX2Vycm9yXSB0byBiZSB1c2VkIGluIHZhcmlvdXMgcGxhY2VzLiAgUGxlYXNlIGF2b2lkIGFkZGluZyBuZXdcbiAgIGRlcGVuZGVuY2llcy4gKilcblxub3BlbiEgSW1wb3J0XG5pbmNsdWRlIEluZm9cblxubGV0IHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEFueSBcIkVycm9yLnRcIiB9XG5sZXQgcmFpc2UgdCA9IHJhaXNlICh0b19leG4gdClcbmxldCByYWlzZV9zIHNleHAgPSByYWlzZSAoY3JlYXRlX3Mgc2V4cClcbmxldCB0b19pbmZvIHQgPSB0XG5sZXQgb2ZfaW5mbyB0ID0gdFxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyX3BwIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkVycm9yXCJcbiAgICBsZXQgcHAgPSBwcFxuICBlbmQpXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgSW52YXJpYW50X2ludGZcblxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbmxldCBpbnZhcmlhbnQgaGVyZSB0IHNleHBfb2ZfdCBmIDogdW5pdCA9XG4gIHRyeSBmICgpIHdpdGhcbiAgfCBleG4gLT5cbiAgICByYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImludmFyaWFudCBmYWlsZWRcIlxuICAgICAgICAgWyBcIlwiLCBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90IGhlcmVcbiAgICAgICAgIDsgXCJleG5cIiwgc2V4cF9vZl9leG4gZXhuXG4gICAgICAgICA7IFwiXCIsIHNleHBfb2ZfdCB0XG4gICAgICAgICBdKVxuOztcblxubGV0IGNoZWNrX2ZpZWxkIHQgZiBmaWVsZCA9XG4gIHRyeSBmIChGaWVsZC5nZXQgZmllbGQgdCkgd2l0aFxuICB8IGV4biAtPlxuICAgIHJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwicHJvYmxlbSB3aXRoIGZpZWxkXCJcbiAgICAgICAgIFsgXCJmaWVsZFwiLCBzZXhwX29mX3N0cmluZyAoRmllbGQubmFtZSBmaWVsZCk7IFwiZXhuXCIsIHNleHBfb2ZfZXhuIGV4biBdKVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5pbmNsdWRlIChcbiAgUmVzdWx0IDpcbiAgICBtb2R1bGUgdHlwZSBvZiBzdHJ1Y3RcbiAgICBpbmNsdWRlIFJlc3VsdFxuICBlbmRcbiAgd2l0aCBtb2R1bGUgRXJyb3IgOj0gUmVzdWx0LkVycm9yKVxuXG50eXBlICdhIHQgPSAoJ2EsIEVycm9yLnQpIFJlc3VsdC50XG5bQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9XG4gIGZ1biBfY21wX19hIGFfXzAwMV8gYl9fMDAyXyAtPiBSZXN1bHQuY29tcGFyZSBfY21wX19hIEVycm9yLmNvbXBhcmUgYV9fMDAxXyBiX18wMDJfXG47O1xuXG5sZXQgZXF1YWwgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sID1cbiAgZnVuIF9jbXBfX2EgYV9fMDA3XyBiX18wMDhfIC0+IFJlc3VsdC5lcXVhbCBfY21wX19hIEVycm9yLmVxdWFsIGFfXzAwN18gYl9fMDA4X1xuOztcblxubGV0IGhhc2hfZm9sZF90IDpcbiAgJ2EuXG4gIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gJ2EgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgLT4gJ2EgdFxuICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgPVxuICBmdW4gX2hhc2hfZm9sZF9hIGhzdiBhcmcgLT4gUmVzdWx0Lmhhc2hfZm9sZF90IF9oYXNoX2ZvbGRfYSBFcnJvci5oYXNoX2ZvbGRfdCBoc3YgYXJnXG47O1xuXG5sZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID1cbiAgZnVuIF9vZl9hX18wMTNfIHhfXzAxNV8gLT4gUmVzdWx0LnRfb2Zfc2V4cCBfb2ZfYV9fMDEzXyBFcnJvci50X29mX3NleHAgeF9fMDE1X1xuOztcblxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gIGZ1biBfb2ZfYV9fMDE2XyB4X18wMTdfIC0+IFJlc3VsdC5zZXhwX29mX3QgX29mX2FfXzAxNl8gRXJyb3Iuc2V4cF9vZl90IHhfXzAxN19cbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IFJlc3VsdC50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyIEVycm9yLnRfc2V4cF9ncmFtbWFyXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgaW52YXJpYW50IGludmFyaWFudF9hIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBPayBhIC0+IGludmFyaWFudF9hIGFcbiAgfCBFcnJvciBlcnJvciAtPiBFcnJvci5pbnZhcmlhbnQgZXJyb3Jcbjs7XG5cbmluY2x1ZGUgQXBwbGljYXRpdmUuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cblxuICAgIGxldCBhcHBseSBmIHggPVxuICAgICAgUmVzdWx0LmNvbWJpbmUgZiB4IH5vazooZnVuIGYgeCAtPiBmIHgpIH5lcnI6KGZ1biBlMSBlMiAtPiBFcnJvci5vZl9saXN0IFsgZTE7IGUyIF0pXG4gICAgOztcblxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICBlbmQpXG5cbm1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gIGxldCByZXR1cm4gPSByZXR1cm5cblxuICBpbmNsdWRlIE1vbmFkX2luZml4XG5cbiAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgbGV0IG1hcCA9IG1hcFxuICAgIGxldCBiaW5kID0gYmluZFxuICAgIGxldCBib3RoID0gYm90aFxuXG4gICAgKCogZnJvbSBBcHBsaWNhdGl2ZS5NYWtlICopXG4gICAgbW9kdWxlIE9wZW5fb25fcmhzID0gc3RydWN0IGVuZFxuICBlbmRcbmVuZFxuXG5sZXQgb2sgPSBSZXN1bHQub2tcbmxldCBpc19vayA9IFJlc3VsdC5pc19va1xubGV0IGlzX2Vycm9yID0gUmVzdWx0LmlzX2Vycm9yXG5cbmxldCB0cnlfd2l0aCA/KGJhY2t0cmFjZSA9IGZhbHNlKSBmID1cbiAgdHJ5IE9rIChmICgpKSB3aXRoXG4gIHwgZXhuIC0+IEVycm9yIChFcnJvci5vZl9leG4gZXhuID9iYWNrdHJhY2U6KGlmIGJhY2t0cmFjZSB0aGVuIFNvbWUgYEdldCBlbHNlIE5vbmUpKVxuOztcblxubGV0IHRyeV93aXRoX2pvaW4gP2JhY2t0cmFjZSBmID0gam9pbiAodHJ5X3dpdGggP2JhY2t0cmFjZSBmKVxuXG5sZXQgb2tfZXhuID0gZnVuY3Rpb25cbiAgfCBPayB4IC0+IHhcbiAgfCBFcnJvciBlcnIgLT4gRXJyb3IucmFpc2UgZXJyXG47O1xuXG5sZXQgb2ZfZXhuID9iYWNrdHJhY2UgZXhuID0gRXJyb3IgKEVycm9yLm9mX2V4biA/YmFja3RyYWNlIGV4bilcblxubGV0IG9mX2V4bl9yZXN1bHQgP2JhY2t0cmFjZSA9IGZ1bmN0aW9uXG4gIHwgT2sgXyBhcyB6IC0+IHpcbiAgfCBFcnJvciBleG4gLT4gb2ZfZXhuID9iYWNrdHJhY2UgZXhuXG47O1xuXG5sZXQgZXJyb3IgP2hlcmUgP3N0cmljdCBtZXNzYWdlIGEgc2V4cF9vZl9hID1cbiAgRXJyb3IgKEVycm9yLmNyZWF0ZSA/aGVyZSA/c3RyaWN0IG1lc3NhZ2UgYSBzZXhwX29mX2EpXG47O1xuXG5sZXQgZXJyb3JfcyBzZXhwID0gRXJyb3IgKEVycm9yLmNyZWF0ZV9zIHNleHApXG5sZXQgZXJyb3Jfc3RyaW5nIG1lc3NhZ2UgPSBFcnJvciAoRXJyb3Iub2Zfc3RyaW5nIG1lc3NhZ2UpXG5sZXQgZXJyb3JmIGZvcm1hdCA9IFByaW50Zi5rc3ByaW50ZiBlcnJvcl9zdHJpbmcgZm9ybWF0XG5sZXQgdGFnIHQgfnRhZyA9IFJlc3VsdC5tYXBfZXJyb3IgdCB+ZjooRXJyb3IudGFnIH50YWcpXG5sZXQgdGFnX3MgdCB+dGFnID0gUmVzdWx0Lm1hcF9lcnJvciB0IH5mOihFcnJvci50YWdfcyB+dGFnKVxubGV0IHRhZ19zX2xhenkgdCB+dGFnID0gUmVzdWx0Lm1hcF9lcnJvciB0IH5mOihFcnJvci50YWdfc19sYXp5IH50YWcpXG5cbmxldCB0YWdfYXJnIHQgbWVzc2FnZSBhIHNleHBfb2ZfYSA9XG4gIFJlc3VsdC5tYXBfZXJyb3IgdCB+ZjooZnVuIGUgLT4gRXJyb3IudGFnX2FyZyBlIG1lc3NhZ2UgYSBzZXhwX29mX2EpXG47O1xuXG5sZXQgdW5pbXBsZW1lbnRlZCBzID0gZXJyb3IgXCJ1bmltcGxlbWVudGVkXCIgcyBzZXhwX29mX3N0cmluZ1xubGV0IGNvbWJpbmVfZXJyb3JzIGwgPSBSZXN1bHQubWFwX2Vycm9yIChSZXN1bHQuY29tYmluZV9lcnJvcnMgbCkgfmY6RXJyb3Iub2ZfbGlzdFxubGV0IGNvbWJpbmVfZXJyb3JzX3VuaXQgbCA9IFJlc3VsdC5tYXAgKGNvbWJpbmVfZXJyb3JzIGwpIH5mOihmdW4gKF8gOiB1bml0IGxpc3QpIC0+ICgpKVxuXG5sZXQgZmlsdGVyX29rX2F0X2xlYXN0X29uZSBsID1cbiAgbGV0IG9rLCBlcnJzID0gTGlzdC5wYXJ0aXRpb25fbWFwIGwgfmY6UmVzdWx0LnRvX2VpdGhlciBpblxuICBtYXRjaCBvayB3aXRoXG4gIHwgW10gLT4gRXJyb3IgKEVycm9yLm9mX2xpc3QgZXJycylcbiAgfCBfIC0+IE9rIG9rXG47O1xuXG5sZXQgZmluZF9vayBsID1cbiAgbWF0Y2ggTGlzdC5maW5kX21hcCBsIH5mOlJlc3VsdC5vayB3aXRoXG4gIHwgU29tZSB4IC0+IE9rIHhcbiAgfCBOb25lIC0+XG4gICAgRXJyb3JcbiAgICAgIChFcnJvci5vZl9saXN0XG4gICAgICAgICAoTGlzdC5tYXAgbCB+ZjooZnVuY3Rpb25cbiAgICAgICAgICAgIHwgT2sgXyAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIHwgRXJyb3IgZXJyIC0+IGVycikpKVxuOztcblxubGV0IGZpbmRfbWFwX29rIGwgfmYgPVxuICBXaXRoX3JldHVybi53aXRoX3JldHVybiAoZnVuIHsgcmV0dXJuIH0gLT5cbiAgICBFcnJvclxuICAgICAgKEVycm9yLm9mX2xpc3RcbiAgICAgICAgIChMaXN0Lm1hcCBsIH5mOihmdW4gZWx0IC0+XG4gICAgICAgICAgICBtYXRjaCBmIGVsdCB3aXRoXG4gICAgICAgICAgICB8IE9rIF8gYXMgeCAtPiByZXR1cm4geFxuICAgICAgICAgICAgfCBFcnJvciBlcnIgLT4gZXJyKSkpKVxuOztcblxubGV0IG1hcCA9IFJlc3VsdC5tYXBcbmxldCBpdGVyID0gUmVzdWx0Lml0ZXJcbmxldCBpdGVyX2Vycm9yID0gUmVzdWx0Lml0ZXJfZXJyb3JcbiIsIigqIFRoaXMgaXMgYnJva2VuIG9mZiB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGJldHdlZW4gU2lnbiBhbmQgQ29tcGFyYWJsZS4gKilcblxub3BlbiEgSW1wb3J0XG5cbnR5cGUgdCA9XG4gIHwgTmVnXG4gIHwgWmVyb1xuICB8IFBvc1xuW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hciwgY29tcGFyZSwgaGFzaCwgZW51bWVyYXRlXVxuXG5sZXQgdF9vZl9zZXhwID1cbiAgKGxldCBlcnJvcl9zb3VyY2VfXzAwM18gPSBcInNpZ24wLm1sLnRcIiBpblxuICAgZnVuY3Rpb25cbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5lZ1wiIHwgXCJOZWdcIikgLT4gTmVnXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgLT4gWmVyb1xuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwicG9zXCIgfCBcIlBvc1wiKSAtPiBQb3NcbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibmVnXCIgfCBcIk5lZ1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJwb3NcIiB8IFwiUG9zXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwMl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDJfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICB8IHNleHBfXzAwMl8gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgICAgICAgICAgICAgICAgIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG47O1xuXG5sZXQgc2V4cF9vZl90ID1cbiAgKGZ1bmN0aW9uXG4gICAgfCBOZWcgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTmVnXCJcbiAgICB8IFplcm8gLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiWmVyb1wiXG4gICAgfCBQb3MgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiUG9zXCJcbiAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWcgeyBuYW1lID0gXCJOZWdcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlplcm9cIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlBvc1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5sZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG5cbmxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgKGZ1biBoc3YgYXJnIC0+XG4gICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgIHwgTmVnIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMFxuICAgICB8IFplcm8gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxXG4gICAgIHwgUG9zIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMlxuICAgICAgICAgICAgICA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbjs7XG5cbmxldCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgbGV0IGZ1bmMgYXJnID1cbiAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgIGhhc2hfZm9sZF90IGhzdiBhcmcpXG4gIGluXG4gIGZ1biB4IC0+IGZ1bmMgeFxuOztcblxubGV0IGFsbCA9IChbIE5lZzsgWmVybzsgUG9zIF0gOiB0IGxpc3QpXG5cbltAQEBlbmRdXG5cbm1vZHVsZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogdCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiB0KSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiB0KSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IHQpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiB0KSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IHQpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IHQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiB0KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IHQpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IHQpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogdCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiB0KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5sZXQgb2Zfc3RyaW5nIHMgPSB0X29mX3NleHAgKHNleHBfb2Zfc3RyaW5nIHMpXG5sZXQgdG9fc3RyaW5nIHQgPSBzdHJpbmdfb2Zfc2V4cCAoc2V4cF9vZl90IHQpXG5cbmxldCB0b19pbnQgPSBmdW5jdGlvblxuICB8IE5lZyAtPiAtMVxuICB8IFplcm8gLT4gMFxuICB8IFBvcyAtPiAxXG47O1xuXG5sZXQgXyA9IGhhc2hcblxuKCogSWdub3JlIHRoZSBoYXNoIGZ1bmN0aW9uIHByb2R1Y2VkIGJ5IFtAQGRlcml2aW5nX2lubGluZSBoYXNoXSAqKVxubGV0IGhhc2ggPSB0b19pbnRcbmxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5TaWduXCJcbmxldCBvZl9pbnQgbiA9IGlmIG4gPCAwIHRoZW4gTmVnIGVsc2UgaWYgbiA9IDAgdGhlbiBaZXJvIGVsc2UgUG9zXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQ29tcGFyYWJsZV9pbnRmXG5cbm1vZHVsZSBXaXRoX3plcm8gKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmVdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgW0BAQGVuZF1cblxuICAgIHZhbCB6ZXJvIDogdFxuICBlbmQpID1cbnN0cnVjdFxuICBvcGVuIFRcblxuICBsZXQgaXNfcG9zaXRpdmUgdCA9IGNvbXBhcmUgdCB6ZXJvID4gMFxuICBsZXQgaXNfbm9uX25lZ2F0aXZlIHQgPSBjb21wYXJlIHQgemVybyA+PSAwXG4gIGxldCBpc19uZWdhdGl2ZSB0ID0gY29tcGFyZSB0IHplcm8gPCAwXG4gIGxldCBpc19ub25fcG9zaXRpdmUgdCA9IGNvbXBhcmUgdCB6ZXJvIDw9IDBcbiAgbGV0IHNpZ24gdCA9IFNpZ24wLm9mX2ludCAoY29tcGFyZSB0IHplcm8pXG5lbmRcblxubW9kdWxlIFBvbHkgKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgPVxuc3RydWN0XG4gIG1vZHVsZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBULnQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICBsZXQgc2V4cF9vZl90ID0gKFQuc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG5cbiAgICBbQEBAZW5kXVxuXG4gICAgaW5jbHVkZSBQb2x5XG4gIGVuZFxuXG4gIGluY2x1ZGUgUG9seVxuXG4gIGxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxuICBsZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG4gIGxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICAgIGFzc2VydCAobWluIDw9IG1heCk7XG4gICAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG4gIDs7XG5cbiAgbGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXhcbiAgICB0aGVuXG4gICAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gICAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuICA7O1xuXG4gIG1vZHVsZSBDID0gc3RydWN0XG4gICAgaW5jbHVkZSBUXG4gICAgaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSlcbiAgZW5kXG5cbiAgaW5jbHVkZSBDXG5lbmRcblxubGV0IGd0IGNtcCBhIGIgPSBjbXAgYSBiID4gMFxubGV0IGx0IGNtcCBhIGIgPSBjbXAgYSBiIDwgMFxubGV0IGdlcSBjbXAgYSBiID0gY21wIGEgYiA+PSAwXG5sZXQgbGVxIGNtcCBhIGIgPSBjbXAgYSBiIDw9IDBcbmxldCBlcXVhbCBjbXAgYSBiID0gY21wIGEgYiA9IDBcbmxldCBub3RfZXF1YWwgY21wIGEgYiA9IGNtcCBhIGIgPD4gMFxubGV0IG1pbiBjbXAgdCB0JyA9IGlmIGxlcSBjbXAgdCB0JyB0aGVuIHQgZWxzZSB0J1xubGV0IG1heCBjbXAgdCB0JyA9IGlmIGdlcSBjbXAgdCB0JyB0aGVuIHQgZWxzZSB0J1xuXG5tb2R1bGUgSW5maXggKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmVdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA6IEluZml4IHdpdGggdHlwZSB0IDo9IFQudCA9IHN0cnVjdFxuICBsZXQgKCA+ICkgYSBiID0gZ3QgVC5jb21wYXJlIGEgYlxuICBsZXQgKCA8ICkgYSBiID0gbHQgVC5jb21wYXJlIGEgYlxuICBsZXQgKCA+PSApIGEgYiA9IGdlcSBULmNvbXBhcmUgYSBiXG4gIGxldCAoIDw9ICkgYSBiID0gbGVxIFQuY29tcGFyZSBhIGJcbiAgbGV0ICggPSApIGEgYiA9IGVxdWFsIFQuY29tcGFyZSBhIGJcbiAgbGV0ICggPD4gKSBhIGIgPSBub3RfZXF1YWwgVC5jb21wYXJlIGEgYlxuZW5kXG5cbm1vZHVsZSBQb2x5bW9ycGhpY19jb21wYXJlIChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgOiBQb2x5bW9ycGhpY19jb21wYXJlIHdpdGggdHlwZSB0IDo9IFQudCA9IHN0cnVjdFxuICBpbmNsdWRlIEluZml4IChUKVxuXG4gIGxldCBjb21wYXJlID0gVC5jb21wYXJlXG4gIGxldCBlcXVhbCA9ICggPSApXG4gIGxldCBtaW4gdCB0JyA9IG1pbiBjb21wYXJlIHQgdCdcbiAgbGV0IG1heCB0IHQnID0gbWF4IGNvbXBhcmUgdCB0J1xuZW5kXG5cbm1vZHVsZSBNYWtlX3VzaW5nX2NvbXBhcmF0b3IgKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICBpbmNsdWRlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA6PSB0XG4gIGVuZCkgOiBTIHdpdGggdHlwZSB0IDo9IFQudCBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBULmNvbXBhcmF0b3Jfd2l0bmVzcyA9IHN0cnVjdFxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmVcbiAgZW5kXG5cbiAgaW5jbHVkZSBUXG4gIG1vZHVsZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBQb2x5bW9ycGhpY19jb21wYXJlIChUKVxuICBpbmNsdWRlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCBhc2NlbmRpbmcgPSBjb21wYXJlXG4gIGxldCBkZXNjZW5kaW5nIHQgdCcgPSBjb21wYXJlIHQnIHRcbiAgbGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG4gIGxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbiAgbGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gICAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbiAgOztcblxuICBsZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICAgIGlmIG1pbiA+IG1heFxuICAgIHRoZW5cbiAgICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG4gIDs7XG5lbmRcblxubW9kdWxlIE1ha2UgKFQgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpID1cbiAgTWFrZV91c2luZ19jb21wYXJhdG9yIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcbiAgICBpbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcbiAgZW5kKVxuXG5tb2R1bGUgSW5oZXJpdCAoQyA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZV1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpIChUIDogc2lnXG4gICAgICAgICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgICAgICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICAgICAgICBbQEBAZW5kXVxuXG4gICAgICAgICAgdmFsIGNvbXBvbmVudCA6IHQgLT4gQy50XG4gICAgICAgIGVuZCkgPVxuICBNYWtlIChzdHJ1Y3RcbiAgICB0eXBlIHQgPSBULnQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICBsZXQgc2V4cF9vZl90ID0gKFQuc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IGNvbXBhcmUgdCB0JyA9IEMuY29tcGFyZSAoVC5jb21wb25lbnQgdCkgKFQuY29tcG9uZW50IHQnKVxuICBlbmQpXG5cbigqIGNvbXBhcmUgW3hdIGFuZCBbeV0gbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgZnVuY3Rpb25zIGluIHRoZSBsaXN0IFtjbXBzXSAqKVxubGV0IGxleGljb2dyYXBoaWMgY21wcyB4IHkgPVxuICBsZXQgcmVjIGxvb3AgPSBmdW5jdGlvblxuICAgIHwgY21wIDo6IGNtcHMgLT5cbiAgICAgIGxldCByZXMgPSBjbXAgeCB5IGluXG4gICAgICBpZiByZXMgPSAwIHRoZW4gbG9vcCBjbXBzIGVsc2UgcmVzXG4gICAgfCBbXSAtPiAwXG4gIGluXG4gIGxvb3AgY21wc1xuOztcblxubGV0IGxpZnQgY21wIH5mIHggeSA9IGNtcCAoZiB4KSAoZiB5KVxubGV0IHJldmVyc2UgY21wIHggeSA9IGNtcCB5IHhcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLkhhc2hhYmxlLktleSAqKVxubW9kdWxlIHR5cGUgS2V5ID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gIFtAQEBlbmRdXG5cbiAgKCoqIFZhbHVlcyByZXR1cm5lZCBieSBbaGFzaF0gbXVzdCBiZSBub24tbmVnYXRpdmUuICBBbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQgaW4gdGhlXG4gICAgICBjYXNlIHRoYXQgW2hhc2hdIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4gKilcbiAgdmFsIGhhc2ggOiB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSBIYXNoYWJsZSA9IHN0cnVjdFxuICB0eXBlICdhIHQgPVxuICAgIHsgaGFzaCA6ICdhIC0+IGludFxuICAgIDsgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludFxuICAgIDsgc2V4cF9vZl90IDogJ2EgLT4gU2V4cC50XG4gICAgfVxuXG4gICgqKiBUaGlzIGZ1bmN0aW9uIGlzIHNvdW5kIGJ1dCBub3QgY29tcGxldGUsIG1lYW5pbmcgdGhhdCBpZiBpdCByZXR1cm5zIFt0cnVlXSB0aGVuIGl0J3NcbiAgICAgIHNhZmUgdG8gdXNlIHRoZSB0d28gaW50ZXJjaGFuZ2VhYmx5LiAgSWYgaXQncyBbZmFsc2VdLCB5b3UgaGF2ZSBubyBndWFyYW50ZWVzLiAgRm9yXG4gICAgICBleGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICA+IHV0b3BcbiAgICAgICAgb3BlbiBDb3JlOztcbiAgICAgICAgbGV0IGVxdWFsIChhIDogJ2EgSGFzaHRibF9pbnRmLkhhc2hhYmxlLnQpIGIgPVxuICAgICAgICAgIHBoeXNfZXF1YWwgYSBiXG4gICAgICAgICAgfHwgKHBoeXNfZXF1YWwgYS5oYXNoIGIuaGFzaFxuICAgICAgICAgICAgICAmJiBwaHlzX2VxdWFsIGEuY29tcGFyZSBiLmNvbXBhcmVcbiAgICAgICAgICAgICAgJiYgcGh5c19lcXVhbCBhLnNleHBfb2ZfdCBiLnNleHBfb2ZfdClcbiAgICAgICAgOztcbiAgICAgICAgbGV0IGEgPSBIYXNodGJsX2ludGYuSGFzaGFibGUueyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgPSBJbnQuc2V4cF9vZl90IH07O1xuICAgICAgICBsZXQgYiA9IEhhc2h0YmxfaW50Zi5IYXNoYWJsZS57IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCA9IEludC5zZXhwX29mX3QgfTs7XG4gICAgICAgIGVxdWFsIGEgYjs7ICAoKiBmYWxzZT8hICopXG4gICAgICBdfVxuICAqKVxuICBsZXQgZXF1YWwgYSBiID1cbiAgICBwaHlzX2VxdWFsIGEgYlxuICAgIHx8IChwaHlzX2VxdWFsIGEuaGFzaCBiLmhhc2hcbiAgICAgICAgJiYgcGh5c19lcXVhbCBhLmNvbXBhcmUgYi5jb21wYXJlXG4gICAgICAgICYmIHBoeXNfZXF1YWwgYS5zZXhwX29mX3QgYi5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGhhc2hfcGFyYW0gPSBDYW1sLkhhc2h0YmwuaGFzaF9wYXJhbVxuICBsZXQgaGFzaCA9IENhbWwuSGFzaHRibC5oYXNoXG4gIGxldCBwb2x5ID0geyBoYXNoOyBjb21wYXJlID0gUG9seS5jb21wYXJlOyBzZXhwX29mX3QgPSAoZnVuIF8gLT4gU2V4cC5BdG9tIFwiX1wiKSB9XG5cbiAgbGV0IG9mX2tleSAodHlwZSBhKSAobW9kdWxlIEtleSA6IEtleSB3aXRoIHR5cGUgdCA9IGEpID1cbiAgICB7IGhhc2ggPSBLZXkuaGFzaDsgY29tcGFyZSA9IEtleS5jb21wYXJlOyBzZXhwX29mX3QgPSBLZXkuc2V4cF9vZl90IH1cbiAgOztcblxuICBsZXQgdG9fa2V5ICh0eXBlIGEpIHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH0gPVxuICAgIChtb2R1bGUgc3RydWN0XG4gICAgICB0eXBlIHQgPSBhXG5cbiAgICAgIGxldCBoYXNoID0gaGFzaFxuICAgICAgbGV0IGNvbXBhcmUgPSBjb21wYXJlXG4gICAgICBsZXQgc2V4cF9vZl90ID0gc2V4cF9vZl90XG4gICAgZW5kIDogS2V5XG4gICAgICB3aXRoIHR5cGUgdCA9IGEpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBIYXNoYWJsZVxuXG5tb2R1bGUgdHlwZSBIYXNoYWJsZSA9IHNpZ1xuICB0eXBlICdhIHQgPSAnYSBIYXNoYWJsZS50ID1cbiAgICB7IGhhc2ggOiAnYSAtPiBpbnRcbiAgICA7IGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnRcbiAgICA7IHNleHBfb2ZfdCA6ICdhIC0+IFNleHAudFxuICAgIH1cblxuICB2YWwgZXF1YWwgOiAnYSB0IC0+ICdhIHQgLT4gYm9vbFxuICB2YWwgcG9seSA6ICdhIHRcbiAgdmFsIG9mX2tleSA6IChtb2R1bGUgS2V5IHdpdGggdHlwZSB0ID0gJ2EpIC0+ICdhIHRcbiAgdmFsIHRvX2tleSA6ICdhIHQgLT4gKG1vZHVsZSBLZXkgd2l0aCB0eXBlIHQgPSAnYSlcbiAgdmFsIGhhc2hfcGFyYW0gOiBpbnQgLT4gaW50IC0+ICdhIC0+IGludFxuICB2YWwgaGFzaCA6ICdhIC0+IGludFxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgSWRlbnRpZmlhYmxlX2ludGZcblxubW9kdWxlIE1ha2UgKFQgOiBBcmcpID0gc3RydWN0XG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIENvbXBhcmFibGUuTWFrZSAoVClcbiAgaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoVClcblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5lbmRcblxubW9kdWxlIE1ha2VfdXNpbmdfY29tcGFyYXRvciAoVCA6IEFyZ193aXRoX2NvbXBhcmF0b3IpID0gc3RydWN0XG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIENvbXBhcmFibGUuTWFrZV91c2luZ19jb21wYXJhdG9yIChUKVxuICBpbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChUKVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IHVuaXQgW0BAZGVyaXZpbmdfaW5saW5lIGVudW1lcmF0ZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBhbGwgPSAoWyAoKSBdIDogdCBsaXN0KVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfdW5pdFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfdW5pdCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAodW5pdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl91bml0IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IHVuaXRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgY29tcGFyZSBfIF8gPSAwXG5cbiAgbGV0IG9mX3N0cmluZyA9IGZ1bmN0aW9uXG4gICAgfCBcIigpXCIgLT4gKClcbiAgICB8IF8gLT4gZmFpbHdpdGggXCJCYXNlLlVuaXQub2Zfc3RyaW5nOiAoKSBleHBlY3RlZFwiXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyAoKSA9IFwiKClcIlxuICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuVW5pdFwiXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIElkZW50aWZpYWJsZS5NYWtlIChUKVxuXG5sZXQgaW52YXJpYW50ICgpID0gKClcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMFxuXG5sZXQgZ2V0X3Bvc19sZW4gP3BvcyA/bGVuICgpIH50b3RhbF9sZW5ndGggPVxuICB0cnkgUmVzdWx0Lk9rIChnZXRfcG9zX2xlbl9leG4gKCkgP3BvcyA/bGVuIH50b3RhbF9sZW5ndGgpIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IHMgLT4gT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIHNcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuKCogVGhlc2UgZnVuY3Rpb25zIGltcGxlbWVudCBhIHNlYXJjaCBmb3IgdGhlIGZpcnN0IChyZXNwLiBsYXN0KSBlbGVtZW50XG4gICBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLCBhc3N1bWluZyB0aGF0IHRoZSBwcmVkaWNhdGUgaXMgaW5jcmVhc2luZyBvblxuICAgdGhlIGNvbnRhaW5lciwgbWVhbmluZyB0aGF0LCBpZiB0aGUgY29udGFpbmVyIGlzIFt1MS4uLnVuXSwgdGhlcmUgZXhpc3RzIGFcbiAgIGsgc3VjaCB0aGF0IHAodTEpPS4uLi49cCh1aykgPSBmYWxzZSBhbmQgcCh1aysxKT0uLi4uPXAodW4pPSB0cnVlLlxuICAgSWYgdGhpcyBrID0gMSAocmVzcCBuKSwgZmluZF9sYXN0X25vdF9zYXRpc2Z5aW5nIChyZXNwIGZpbmRfZmlyc3Rfc2F0aXNmeWluZylcbiAgIHdpbGwgcmV0dXJuIE5vbmUuICopXG5cbmxldCByZWMgbGluZWFyX3NlYXJjaF9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG8gfmhpIH5wcmVkID1cbiAgaWYgbG8gPiBoaVxuICB0aGVuIE5vbmVcbiAgZWxzZSBpZiBwcmVkIChnZXQgdCBsbylcbiAgdGhlbiBTb21lIGxvXG4gIGVsc2UgbGluZWFyX3NlYXJjaF9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG86KGxvICsgMSkgfmhpIH5wcmVkXG47O1xuXG4oKiBUYWtlcyBhIGNvbnRhaW5lciBbdF0sIGEgcHJlZGljYXRlIFtwcmVkXSBhbmQgdHdvIGluZGljZXMgW2xvIDwgaGldLCBzdWNoIHRoYXRcbiAgIFtwcmVkXSBpcyBpbmNyZWFzaW5nIG9uIFt0XSBiZXR3ZWVuIFtsb10gYW5kIFtoaV0uXG5cbiAgIHJldHVybiBhIHJhbmdlIChsbywgaGkpIHdoZXJlOlxuICAgLSBsbyBhbmQgaGkgYXJlIGNsb3NlIGVub3VnaCB0b2dldGhlciBmb3IgYSBsaW5lYXIgc2VhcmNoXG4gICAtIElmIFtwcmVkXSBpcyBub3QgY29uc3RhbnRseSBbZmFsc2VdIG9uIFt0XSBiZXR3ZWVuIFtsb10gYW5kIFtoaV0sIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgIG9uIHdoaWNoIFtwcmVkXSBpcyBbdHJ1ZV0gaXMgYmV0d2VlbiBbbG9dIGFuZCBbaGldLiAqKVxuKCogSW52YXJpYW50OiB0aGUgZmlyc3QgZWxlbWVudCBzYXRpc2Z5aW5nIFtwcmVkXSwgaWYgaXQgZXhpc3RzIGlzIGJldHdlZW4gW2xvXSBhbmQgW2hpXSAqKVxubGV0IHJlYyBmaW5kX3JhbmdlX25lYXJfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvIH5oaSB+cHJlZCA9XG4gICgqIFdhcm5pbmc6IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgdGVybWluYXRlIGlmIHRoZSBjb25zdGFudCAoY3VycmVudGx5IDgpIGlzXG4gICAgIHNldCA8PSAxICopXG4gIGlmIGhpIC0gbG8gPD0gOFxuICB0aGVuIGxvLCBoaVxuICBlbHNlIChcbiAgICBsZXQgbWlkID0gbG8gKyAoKGhpIC0gbG8pIC8gMikgaW5cbiAgICBpZiBwcmVkIChnZXQgdCBtaWQpXG4gICAgKCogSU5WQVJJQU5UIGNoZWNrOiBpdCBtZWFucyB0aGUgZmlyc3Qgc2F0aXNmeWluZyBlbGVtZW50IGlzIGJldHdlZW4gW2xvXSBhbmQgW21pZF0gKilcbiAgICB0aGVuXG4gICAgICBmaW5kX3JhbmdlX25lYXJfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvIH5oaTptaWQgfnByZWRcbiAgICAgICgqIElOVkFSSUFOVCBjaGVjazogaXQgbWVhbnMgdGhlIGZpcnN0IHNhdGlzZnlpbmcgZWxlbWVudCwgaWYgaXQgZXhpc3RzLFxuICAgICAgICAgaXMgYmV0d2VlbiBbbWlkKzFdIGFuZCBbaGldICopXG4gICAgZWxzZSBmaW5kX3JhbmdlX25lYXJfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvOihtaWQgKyAxKSB+aGkgfnByZWQpXG47O1xuXG5sZXQgZmluZF9maXJzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZCA9XG4gIGxldCBwb3MsIGxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5nZXRfcG9zX2xlbl9leG4gKCkgP3BvcyA/bGVuIH50b3RhbF9sZW5ndGg6KGxlbmd0aCB0KVxuICBpblxuICBsZXQgbG8gPSBwb3MgaW5cbiAgbGV0IGhpID0gcG9zICsgbGVuIC0gMSBpblxuICBsZXQgbG8sIGhpID0gZmluZF9yYW5nZV9uZWFyX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbyB+aGkgfnByZWQgaW5cbiAgbGluZWFyX3NlYXJjaF9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG8gfmhpIH5wcmVkXG47O1xuXG4oKiBUYWtlcyBhbiBhcnJheSB3aXRoIHNoYXBlIFt0cnVlLC4uLnRydWUsZmFsc2UsLi4uZmFsc2VdIChpLmUuLCB0aGUgX3JldmVyc2VfIG9mIHdoYXRcbiAgIGlzIGRlc2NyaWJlZCBhYm92ZSkgYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHRydWUgb3IgTm9uZSBpZiB0aGVyZSBhcmUgbm9cbiAgIHRydWUqKVxubGV0IGZpbmRfbGFzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5wcmVkIH5nZXQgfmxlbmd0aCA9XG4gIGxldCBwb3MsIGxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5nZXRfcG9zX2xlbl9leG4gKCkgP3BvcyA/bGVuIH50b3RhbF9sZW5ndGg6KGxlbmd0aCB0KVxuICBpblxuICBpZiBsZW4gPSAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICAoKiBUaGUgbGFzdCBzYXRpc2Z5aW5nIGlzIHRoZSBvbmUganVzdCBiZWZvcmUgdGhlIGZpcnN0IG5vdCBzYXRpc2Z5aW5nICopXG4gICAgbWF0Y2ggZmluZF9maXJzdF9zYXRpc2Z5aW5nIH5wb3MgfmxlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooRm4ubm9uIHByZWQpIHdpdGhcbiAgICB8IE5vbmUgLT4gU29tZSAocG9zICsgbGVuIC0gMSlcbiAgICAoKiBUaGlzIG1lYW5zIHRoYXQgYWxsIGVsZW1lbnRzIHNhdGlzZnkgcHJlZC5cbiAgICAgICBUaGVyZSBpcyBhdCBsZWFzdCBhbiBlbGVtZW50IGFzIChsZW4gPiAwKSAqKVxuICAgIHwgU29tZSBpIHdoZW4gaSA9IHBvcyAtPiBOb25lICgqIG5vIGVsZW1lbnQgc2F0aXNmaWVzIHByZWQgKilcbiAgICB8IFNvbWUgaSAtPiBTb21lIChpIC0gMSkpXG47O1xuXG5sZXQgYmluYXJ5X3NlYXJjaCA/cG9zID9sZW4gdCB+bGVuZ3RoIH5nZXQgfmNvbXBhcmUgaG93IHYgPVxuICBtYXRjaCBob3cgd2l0aFxuICB8IGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAtPlxuICAgIGZpbmRfbGFzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPCAwKVxuICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAtPlxuICAgIGZpbmRfbGFzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPD0gMClcbiAgfCBgRmlyc3RfZXF1YWxfdG8gLT5cbiAgICAobWF0Y2hcbiAgICAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA+PSAwKVxuICAgICB3aXRoXG4gICAgIHwgU29tZSB4IHdoZW4gY29tcGFyZSAoZ2V0IHQgeCkgdiA9IDAgLT4gU29tZSB4XG4gICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICB8IGBMYXN0X2VxdWFsX3RvIC0+XG4gICAgKG1hdGNoXG4gICAgICAgZmluZF9sYXN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA8PSAwKVxuICAgICB3aXRoXG4gICAgIHwgU29tZSB4IHdoZW4gY29tcGFyZSAoZ2V0IHQgeCkgdiA9IDAgLT4gU29tZSB4XG4gICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBOb25lKVxuICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gLT5cbiAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA+PSAwKVxuICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gLT5cbiAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5wcmVkOihmdW4geCAtPiBjb21wYXJlIHggdiA+IDApXG47O1xuXG5sZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgP3BvcyA/bGVuIHQgfmxlbmd0aCB+Z2V0IH5zZWdtZW50X29mIGhvdyA9XG4gIGxldCBpc19sZWZ0IHggPVxuICAgIG1hdGNoIHNlZ21lbnRfb2YgeCB3aXRoXG4gICAgfCBgTGVmdCAtPiB0cnVlXG4gICAgfCBgUmlnaHQgLT4gZmFsc2VcbiAgaW5cbiAgbGV0IGlzX3JpZ2h0IHggPSBub3QgKGlzX2xlZnQgeCkgaW5cbiAgbWF0Y2ggaG93IHdpdGhcbiAgfCBgTGFzdF9vbl9sZWZ0IC0+IGZpbmRfbGFzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5sZW5ndGggfmdldCB+cHJlZDppc19sZWZ0XG4gIHwgYEZpcnN0X29uX3JpZ2h0IC0+IGZpbmRfZmlyc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+bGVuZ3RoIH5nZXQgfnByZWQ6aXNfcmlnaHRcbjs7XG4iLCIoKiogTW9kdWxlIHR5cGVzIGZvciBhIFtiaW5hcnlfc2VhcmNoXSBmdW5jdGlvbiBmb3IgYSBzZXF1ZW5jZSwgYW5kIGZ1bmN0b3JzIGZvciBidWlsZGluZ1xuICAgIFtiaW5hcnlfc2VhcmNoXSBmdW5jdGlvbnMuICopXG5cbm9wZW4hIEltcG9ydFxuXG4oKiogQW4gW0luZGV4YWJsZV0gdHlwZSBpcyBhIGZpbml0ZSBzZXF1ZW5jZSBvZiBlbGVtZW50cyBpbmRleGVkIGJ5IGNvbnNlY3V0aXZlIGludGVnZXJzXG4gICAgWzBdIC4uLiBbbGVuZ3RoIHQgLSAxXS4gIFtnZXRdIGFuZCBbbGVuZ3RoXSBtdXN0IGJlIE8oMSkgZm9yIHRoZSByZXN1bHRpbmdcbiAgICBbYmluYXJ5X3NlYXJjaF0gdG8gYmUgbGcobikuICopXG5tb2R1bGUgdHlwZSBJbmRleGFibGUgPSBzaWdcbiAgdHlwZSBlbHRcbiAgdHlwZSB0XG5cbiAgdmFsIGdldCA6IHQgLT4gaW50IC0+IGVsdFxuICB2YWwgbGVuZ3RoIDogdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmRleGFibGUxID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBnZXQgOiAnYSB0IC0+IGludCAtPiAnYVxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSBXaGljaF90YXJnZXRfYnlfa2V5ID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgWyBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gKCoqICAgICAgICB7diB8IDwgZWx0IFggfCAgICAgICAgICAgICAgICAgICAgICAgdn0gKilcbiAgICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAoKiogICAgIHt2IHwgICAgICA8PSBlbHQgICAgICAgWCB8ICAgICAgICAgICB2fSAqKVxuICAgIHwgYExhc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgICA9IGVsdCBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgfCBgRmlyc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCBYID0gZWx0ICAgfCAgICAgICAgICAgdn0gKilcbiAgICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gKCoqIHt2ICAgICAgICAgICB8IFggICAgICAgPj0gZWx0ICAgICAgfCB2fSAqKVxuICAgIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAoKiogICAge3YgICAgICAgICAgICAgICAgICAgICAgIHwgWCA+IGVsdCB8IHZ9ICopXG4gICAgXVxuICBbQEBkZXJpdmluZ19pbmxpbmUgZW51bWVyYXRlXVxuXG4gIGxldCBhbGwgPVxuICAgIChbIGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhblxuICAgICA7IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90b1xuICAgICA7IGBMYXN0X2VxdWFsX3RvXG4gICAgIDsgYEZpcnN0X2VxdWFsX3RvXG4gICAgIDsgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90b1xuICAgICA7IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW5cbiAgICAgXVxuICAgICA6IHQgbGlzdClcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSBXaGljaF90YXJnZXRfYnlfc2VnbWVudCA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIFsgYExhc3Rfb25fbGVmdFxuICAgIHwgYEZpcnN0X29uX3JpZ2h0XG4gICAgXVxuICBbQEBkZXJpdmluZ19pbmxpbmUgZW51bWVyYXRlXVxuXG4gIGxldCBhbGwgPSAoWyBgTGFzdF9vbl9sZWZ0OyBgRmlyc3Rfb25fcmlnaHQgXSA6IHQgbGlzdClcblxuICBbQEBAZW5kXVxuZW5kXG5cbnR5cGUgKCd0LCAnZWx0LCAna2V5KSBiaW5hcnlfc2VhcmNoID1cbiAgP3BvczppbnRcbiAgLT4gP2xlbjppbnRcbiAgLT4gJ3RcbiAgLT4gY29tcGFyZTooJ2VsdCAtPiAna2V5IC0+IGludClcbiAgLT4gV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gIC0+ICdrZXlcbiAgLT4gaW50IG9wdGlvblxuXG50eXBlICgndCwgJ2VsdCkgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgPVxuICA/cG9zOmludFxuICAtPiA/bGVuOmludFxuICAtPiAndFxuICAtPiBzZWdtZW50X29mOignZWx0IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgLT4gV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAtPiBpbnQgb3B0aW9uXG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdHlwZSBlbHRcbiAgdHlwZSB0XG5cbiAgKCoqIFNlZSBbQmluYXJ5X3NlYXJjaC5iaW5hcnlfc2VhcmNoXSBpbiBiaW5hcnlfc2VhcmNoLm1sICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoIDogKHQsIGVsdCwgJ2tleSkgYmluYXJ5X3NlYXJjaFxuXG4gICgqKiBTZWUgW0JpbmFyeV9zZWFyY2guYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIGluIGJpbmFyeV9zZWFyY2gubWwgKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIDogKHQsIGVsdCkgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgYmluYXJ5X3NlYXJjaCA6ICgnYSB0LCAnYSwgJ2tleSkgYmluYXJ5X3NlYXJjaFxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgOiAoJ2EgdCwgJ2EpIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG5lbmRcblxubW9kdWxlIHR5cGUgQmluYXJ5X3NlYXJjaGFibGUgPSBzaWdcbiAgbW9kdWxlIHR5cGUgUyA9IFNcbiAgbW9kdWxlIHR5cGUgUzEgPSBTMVxuICBtb2R1bGUgdHlwZSBJbmRleGFibGUgPSBJbmRleGFibGVcbiAgbW9kdWxlIHR5cGUgSW5kZXhhYmxlMSA9IEluZGV4YWJsZTFcblxuICBtb2R1bGUgV2hpY2hfdGFyZ2V0X2J5X2tleSA9IFdoaWNoX3RhcmdldF9ieV9rZXlcbiAgbW9kdWxlIFdoaWNoX3RhcmdldF9ieV9zZWdtZW50ID0gV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnRcblxuICB0eXBlIG5vbnJlYyAoJ3QsICdlbHQsICdrZXkpIGJpbmFyeV9zZWFyY2ggPSAoJ3QsICdlbHQsICdrZXkpIGJpbmFyeV9zZWFyY2hcbiAgdHlwZSBub25yZWMgKCd0LCAnZWx0KSBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA9ICgndCwgJ2VsdCkgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcblxuICBtb2R1bGUgTWFrZSAoVCA6IEluZGV4YWJsZSkgOiBTIHdpdGggdHlwZSB0IDo9IFQudCB3aXRoIHR5cGUgZWx0IDo9IFQuZWx0XG4gIG1vZHVsZSBNYWtlMSAoVCA6IEluZGV4YWJsZTEpIDogUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgVC50XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBCaW5hcnlfc2VhcmNoYWJsZV9pbnRmXG5cbm1vZHVsZSB0eXBlIEFyZyA9IHNpZ1xuICB0eXBlICdhIGVsdFxuICB0eXBlICdhIHRcblxuICB2YWwgZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2EgZWx0XG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG5lbmRcblxubW9kdWxlIE1ha2VfZ2VuIChUIDogQXJnKSA9IHN0cnVjdFxuICBsZXQgZ2V0ID0gVC5nZXRcbiAgbGV0IGxlbmd0aCA9IFQubGVuZ3RoXG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggP3BvcyA/bGVuIHQgfmNvbXBhcmUgaG93IHYgPVxuICAgIEJpbmFyeV9zZWFyY2guYmluYXJ5X3NlYXJjaCA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfmNvbXBhcmUgaG93IHZcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgP3BvcyA/bGVuIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBCaW5hcnlfc2VhcmNoLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+c2VnbWVudF9vZiBob3dcbiAgOztcbmVuZFxuXG5tb2R1bGUgTWFrZSAoVCA6IEluZGV4YWJsZSkgPSBNYWtlX2dlbiAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICB0eXBlICdhIGVsdCA9IFQuZWx0XG4gICAgdHlwZSAnYSB0ID0gVC50XG4gIGVuZClcblxubW9kdWxlIE1ha2UxIChUIDogSW5kZXhhYmxlMSkgPSBNYWtlX2dlbiAoc3RydWN0XG4gICAgdHlwZSAnYSBlbHQgPSAnYVxuICAgIHR5cGUgJ2EgdCA9ICdhIFQudFxuXG4gICAgbGV0IGdldCA9IFQuZ2V0XG4gICAgbGV0IGxlbmd0aCA9IFQubGVuZ3RoXG4gIGVuZClcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBCbGl0X2ludGZcblxubW9kdWxlIHR5cGUgU2VxdWVuY2VfZ2VuID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG5lbmRcblxubW9kdWxlIE1ha2VfZ2VuXG4gICAgKFNyYyA6IFNlcXVlbmNlX2dlbikgKERzdCA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgU2VxdWVuY2VfZ2VuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgY3JlYXRlX2xpa2UgOiBsZW46aW50IC0+ICdhIFNyYy50IC0+ICdhIHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgdW5zYWZlX2JsaXQgOiAoJ2EgU3JjLnQsICdhIHQpIGJsaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKSA9XG5zdHJ1Y3RcbiAgbGV0IHVuc2FmZV9ibGl0ID0gRHN0LnVuc2FmZV9ibGl0XG5cbiAgbGV0IGJsaXQgfnNyYyB+c3JjX3BvcyB+ZHN0IH5kc3RfcG9zIH5sZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uY2hlY2tfcG9zX2xlbl9leG5cbiAgICAgIH5wb3M6c3JjX3Bvc1xuICAgICAgfmxlblxuICAgICAgfnRvdGFsX2xlbmd0aDooU3JjLmxlbmd0aCBzcmMpO1xuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uY2hlY2tfcG9zX2xlbl9leG5cbiAgICAgIH5wb3M6ZHN0X3Bvc1xuICAgICAgfmxlblxuICAgICAgfnRvdGFsX2xlbmd0aDooRHN0Lmxlbmd0aCBkc3QpO1xuICAgIGlmIGxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCB+c3JjIH5zcmNfcG9zIH5kc3QgfmRzdF9wb3MgfmxlblxuICA7O1xuXG4gIGxldCBibGl0b1xuICAgICAgICB+c3JjXG4gICAgICAgID8oc3JjX3BvcyA9IDApXG4gICAgICAgID8oc3JjX2xlbiA9IFNyYy5sZW5ndGggc3JjIC0gc3JjX3BvcylcbiAgICAgICAgfmRzdFxuICAgICAgICA/KGRzdF9wb3MgPSAwKVxuICAgICAgICAoKVxuICAgID1cbiAgICBibGl0IH5zcmMgfnNyY19wb3MgfmxlbjpzcmNfbGVuIH5kc3QgfmRzdF9wb3NcbiAgOztcblxuICAoKiBbc3ViXSBhbmQgW3N1Ym9dIGVuc3VyZSB0aGF0IGV2ZXJ5IHBvc2l0aW9uIG9mIHRoZSBjcmVhdGVkIHNlcXVlbmNlIGlzIHBvcHVsYXRlZCBieVxuICAgICBhbiBlbGVtZW50IG9mIHRoZSBzb3VyY2UgYXJyYXkuICBUaHVzIGV2ZXJ5IGVsZW1lbnQgb2YgW2RzdF0gYmVsb3cgaXMgd2VsbFxuICAgICBkZWZpbmVkLiAqKVxuICBsZXQgc3ViIHNyYyB+cG9zIH5sZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGg6KFNyYy5sZW5ndGggc3JjKTtcbiAgICBsZXQgZHN0ID0gRHN0LmNyZWF0ZV9saWtlIH5sZW4gc3JjIGluXG4gICAgaWYgbGVuID4gMCB0aGVuIHVuc2FmZV9ibGl0IH5zcmMgfnNyY19wb3M6cG9zIH5kc3QgfmRzdF9wb3M6MCB+bGVuO1xuICAgIGRzdFxuICA7O1xuXG4gIGxldCBzdWJvID8ocG9zID0gMCkgP2xlbiBzcmMgPVxuICAgIHN1YlxuICAgICAgc3JjXG4gICAgICB+cG9zXG4gICAgICB+bGVuOlxuICAgICAgICAobWF0Y2ggbGVuIHdpdGhcbiAgICAgICAgIHwgU29tZSBpIC0+IGlcbiAgICAgICAgIHwgTm9uZSAtPiBTcmMubGVuZ3RoIHNyYyAtIHBvcylcbiAgOztcbmVuZFxuXG5tb2R1bGUgTWFrZTEgKFNlcXVlbmNlIDogc2lnXG4gICAgaW5jbHVkZSBTZXF1ZW5jZV9nZW5cblxuICAgIHZhbCBjcmVhdGVfbGlrZSA6IGxlbjppbnQgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIHVuc2FmZV9ibGl0IDogKCdhIHQsICdhIHQpIGJsaXRcbiAgZW5kKSA9XG4gIE1ha2VfZ2VuIChTZXF1ZW5jZSkgKFNlcXVlbmNlKVxuXG5tb2R1bGUgTWFrZTFfZ2VuZXJpYyAoU2VxdWVuY2UgOiBTZXF1ZW5jZTEpID0gTWFrZV9nZW4gKFNlcXVlbmNlKSAoU2VxdWVuY2UpXG5cbm1vZHVsZSBNYWtlIChTZXF1ZW5jZSA6IHNpZ1xuICAgIGluY2x1ZGUgU2VxdWVuY2VcblxuICAgIHZhbCBjcmVhdGUgOiBsZW46aW50IC0+IHRcbiAgICB2YWwgdW5zYWZlX2JsaXQgOiAodCwgdCkgYmxpdFxuICBlbmQpID1cbnN0cnVjdFxuICBtb2R1bGUgU2VxdWVuY2UgPSBzdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSBTZXF1ZW5jZS50XG5cbiAgICBvcGVuIFNlcXVlbmNlXG5cbiAgICBsZXQgY3JlYXRlX2xpa2UgfmxlbiBfID0gY3JlYXRlIH5sZW5cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRcbiAgZW5kXG5cbiAgaW5jbHVkZSBNYWtlX2dlbiAoU2VxdWVuY2UpIChTZXF1ZW5jZSlcbmVuZFxuXG5tb2R1bGUgTWFrZV9kaXN0aW5jdFxuICAgIChTcmMgOiBTZXF1ZW5jZSkgKERzdCA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBTZXF1ZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgY3JlYXRlIDogbGVuOmludCAtPiB0XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWwgdW5zYWZlX2JsaXQgOiAoU3JjLnQsIHQpIGJsaXRcbiAgICAgICAgICAgICAgICAgICAgICBlbmQpID1cbiAgTWFrZV9nZW5cbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBTcmMudFxuXG4gICAgICBvcGVuIFNyY1xuXG4gICAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IERzdC50XG5cbiAgICAgIG9wZW4gRHN0XG5cbiAgICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICAgIGxldCBjcmVhdGVfbGlrZSB+bGVuIF8gPSBjcmVhdGUgfmxlblxuICAgICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRcbiAgICBlbmQpXG5cbm1vZHVsZSBNYWtlX3RvX3N0cmluZyAoVCA6IHNpZ1xuICAgIHR5cGUgdFxuICBlbmQpXG4gICAgKFRvX2J5dGVzIDogU19kaXN0aW5jdCB3aXRoIHR5cGUgc3JjIDo9IFQudCB3aXRoIHR5cGUgZHN0IDo9IGJ5dGVzKSA9XG5zdHJ1Y3RcbiAgb3BlbiBUb19ieXRlc1xuXG4gIGxldCBzdWIgc3JjIH5wb3MgfmxlbiA9XG4gICAgQnl0ZXMwLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6KHN1YiBzcmMgfnBvcyB+bGVuKVxuICA7O1xuXG4gIGxldCBzdWJvID9wb3MgP2xlbiBzcmMgPVxuICAgIEJ5dGVzMC51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOihzdWJvID9wb3MgP2xlbiBzcmMpXG4gIDs7XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG5pbmNsdWRlIChcbnN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBvcHRpb24gW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID0gY29tcGFyZV9vcHRpb25cblxuICBsZXQgaGFzaF9mb2xkX3QgOlxuICAgICdhLlxuICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gJ2EgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgIC0+ICdhIHRcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICA9XG4gICAgaGFzaF9mb2xkX29wdGlvblxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPVxuICAgIG9wdGlvbl9vZl9zZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgc2V4cF9vZl9vcHRpb25cbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IG9wdGlvbl9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmQgOlxuc2lnXG4gIHR5cGUgJ2EgdCA9ICdhIG9wdGlvbiBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBpbmNsdWRlIFBweF9oYXNoX2xpYi5IYXNoYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIGluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuZW5kKVxuXG50eXBlICdhIHQgPSAnYSBvcHRpb24gPVxuICB8IE5vbmVcbiAgfCBTb21lIG9mICdhXG5cbmxldCBpc19ub25lID0gZnVuY3Rpb25cbiAgfCBOb25lIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfc29tZSA9IGZ1bmN0aW9uXG4gIHwgU29tZSBfIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgdmFsdWVfbWFwIG8gfmRlZmF1bHQgfmYgPVxuICBtYXRjaCBvIHdpdGhcbiAgfCBTb21lIHggLT4gZiB4XG4gIHwgTm9uZSAtPiBkZWZhdWx0XG47O1xuXG5sZXQgaXRlciBvIH5mID1cbiAgbWF0Y2ggbyB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgYSAtPiBmIGFcbjs7XG5cbmxldCBpbnZhcmlhbnQgZiB0ID0gaXRlciB0IH5mXG5cbmxldCBjYWxsIHggfmYgPVxuICBtYXRjaCBmIHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSBmIC0+IGYgeFxuOztcblxubGV0IHZhbHVlIHQgfmRlZmF1bHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IGRlZmF1bHRcbiAgfCBTb21lIHggLT4geFxuOztcblxubGV0IHZhbHVlX2V4biA/aGVyZSA/ZXJyb3IgP21lc3NhZ2UgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFNvbWUgeCAtPiB4XG4gIHwgTm9uZSAtPlxuICAgIGxldCBlcnJvciA9XG4gICAgICBtYXRjaCBoZXJlLCBlcnJvciwgbWVzc2FnZSB3aXRoXG4gICAgICB8IE5vbmUsIE5vbmUsIE5vbmUgLT4gRXJyb3Iub2Zfc3RyaW5nIFwiT3B0aW9uLnZhbHVlX2V4biBOb25lXCJcbiAgICAgIHwgTm9uZSwgTm9uZSwgU29tZSBtIC0+IEVycm9yLm9mX3N0cmluZyBtXG4gICAgICB8IE5vbmUsIFNvbWUgZSwgTm9uZSAtPiBlXG4gICAgICB8IE5vbmUsIFNvbWUgZSwgU29tZSBtIC0+IEVycm9yLnRhZyBlIH50YWc6bVxuICAgICAgfCBTb21lIHAsIE5vbmUsIE5vbmUgLT5cbiAgICAgICAgRXJyb3IuY3JlYXRlIFwiT3B0aW9uLnZhbHVlX2V4blwiIHAgU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdFxuICAgICAgfCBTb21lIHAsIE5vbmUsIFNvbWUgbSAtPiBFcnJvci5jcmVhdGUgbSBwIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3RcbiAgICAgIHwgU29tZSBwLCBTb21lIGUsIF8gLT5cbiAgICAgICAgRXJyb3IuY3JlYXRlXG4gICAgICAgICAgKHZhbHVlIG1lc3NhZ2UgfmRlZmF1bHQ6XCJcIilcbiAgICAgICAgICAoZSwgcClcbiAgICAgICAgICAoc2V4cF9vZl9wYWlyIEVycm9yLnNleHBfb2ZfdCBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90KVxuICAgIGluXG4gICAgRXJyb3IucmFpc2UgZXJyb3Jcbjs7XG5cbmxldCB2YWx1ZV9vcl90aHVuayBvIH5kZWZhdWx0ID1cbiAgbWF0Y2ggbyB3aXRoXG4gIHwgU29tZSB4IC0+IHhcbiAgfCBOb25lIC0+IGRlZmF1bHQgKClcbjs7XG5cbmxldCB0b19hcnJheSB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBbfHxdXG4gIHwgU29tZSB4IC0+IFt8IHggfF1cbjs7XG5cbmxldCB0b19saXN0IHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IFtdXG4gIHwgU29tZSB4IC0+IFsgeCBdXG47O1xuXG5sZXQgbWluX2VsdCB0IH5jb21wYXJlOl8gPSB0XG5sZXQgbWF4X2VsdCB0IH5jb21wYXJlOl8gPSB0XG5cbmxldCBzdW0gKHR5cGUgYSkgKG1vZHVsZSBNIDogQ29udGFpbmVyLlN1bW1hYmxlIHdpdGggdHlwZSB0ID0gYSkgdCB+ZiA9XG4gIHZhbHVlX21hcCB0IH5kZWZhdWx0Ok0uemVybyB+ZlxuOztcblxubGV0IGZvcl9hbGwgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gdHJ1ZVxuICB8IFNvbWUgeCAtPiBmIHhcbjs7XG5cbmxldCBleGlzdHMgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gZmFsc2VcbiAgfCBTb21lIHggLT4gZiB4XG47O1xuXG5sZXQgbWVtIHQgYSB+ZXF1YWwgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IGZhbHNlXG4gIHwgU29tZSBhJyAtPiBlcXVhbCBhIGEnXG47O1xuXG5sZXQgbGVuZ3RoIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IDBcbiAgfCBTb21lIF8gLT4gMVxuOztcblxubGV0IGlzX2VtcHR5ID0gaXNfbm9uZVxuXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBpbml0XG4gIHwgU29tZSB4IC0+IGYgaW5pdCB4XG47O1xuXG5sZXQgY291bnQgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gMFxuICB8IFNvbWUgYSAtPiBpZiBmIGEgdGhlbiAxIGVsc2UgMFxuOztcblxubGV0IGZpbmQgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgeCAtPiBpZiBmIHggdGhlbiB0IGVsc2UgTm9uZVxuOztcblxubGV0IGZpbmRfbWFwIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIGEgLT4gZiBhXG47O1xuXG5sZXQgZXF1YWwgZiB0IHQnID1cbiAgbWF0Y2ggdCwgdCcgd2l0aFxuICB8IE5vbmUsIE5vbmUgLT4gdHJ1ZVxuICB8IFNvbWUgeCwgU29tZSB4JyAtPiBmIHggeCdcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgc29tZSB4ID0gU29tZSB4XG5cbmxldCBmaXJzdF9zb21lIHggeSA9XG4gIG1hdGNoIHggd2l0aFxuICB8IFNvbWUgXyAtPiB4XG4gIHwgTm9uZSAtPiB5XG47O1xuXG5sZXQgc29tZV9pZiBjb25kIHggPSBpZiBjb25kIHRoZW4gU29tZSB4IGVsc2UgTm9uZVxuXG5sZXQgbWVyZ2UgYSBiIH5mID1cbiAgbWF0Y2ggYSwgYiB3aXRoXG4gIHwgTm9uZSwgeCB8IHgsIE5vbmUgLT4geFxuICB8IFNvbWUgYSwgU29tZSBiIC0+IFNvbWUgKGYgYSBiKVxuOztcblxubGV0IGZpbHRlciB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU29tZSB2IGFzIG8gd2hlbiBmIHYgLT4gb1xuICB8IF8gLT4gTm9uZVxuOztcblxubGV0IHRyeV93aXRoIGYgPVxuICBtYXRjaCBmICgpIHdpdGhcbiAgfCB4IC0+IFNvbWUgeFxuICB8IGV4Y2VwdGlvbiBfIC0+IE5vbmVcbjs7XG5cbmxldCB0cnlfd2l0aF9qb2luIGYgPVxuICBtYXRjaCBmICgpIHdpdGhcbiAgfCB4IC0+IHhcbiAgfCBleGNlcHRpb24gXyAtPiBOb25lXG47O1xuXG5sZXQgbWFwIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIGEgLT4gU29tZSAoZiBhKVxuOztcblxubGV0IGFwcGx5IGYgeCA9XG4gIG1hdGNoIGYgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgZiAtPiBtYXAgfmYgeFxuOztcblxubW9kdWxlIE1vbmFkX2FyZyA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBvcHRpb25cblxuICBsZXQgcmV0dXJuIHggPSBTb21lIHhcbiAgbGV0IGFwcGx5ID0gYXBwbHlcbiAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG5cbiAgbGV0IGJpbmQgbyB+ZiA9XG4gICAgbWF0Y2ggbyB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgeCAtPiBmIHhcbiAgOztcbmVuZFxuXG5pbmNsdWRlIE1vbmFkLk1ha2UgKE1vbmFkX2FyZylcbmluY2x1ZGUgQXBwbGljYXRpdmUuTWFrZSAoTW9uYWRfYXJnKVxuXG5sZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgdFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlXG5cbm1vZHVsZSBPZl9zZXhwYWJsZVxuICAgIChTZXhwYWJsZSA6IFMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fc2V4cGFibGUgOiB0IC0+IFNleHBhYmxlLnRcbiAgICAgICAgICAgICAgICAgICAgICB2YWwgb2Zfc2V4cGFibGUgOiBTZXhwYWJsZS50IC0+IHRcbiAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMgd2l0aCB0eXBlIHQgOj0gTS50ID0gc3RydWN0XG4gIGxldCB0X29mX3NleHAgc2V4cCA9XG4gICAgbGV0IHMgPSBTZXhwYWJsZS50X29mX3NleHAgc2V4cCBpblxuICAgIHRyeSBNLm9mX3NleHBhYmxlIHMgd2l0aFxuICAgIHwgZXhuIC0+IG9mX3NleHBfZXJyb3JfZXhuIGV4biBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCB0ID0gU2V4cGFibGUuc2V4cF9vZl90IChNLnRvX3NleHBhYmxlIHQpXG5lbmRcblxubW9kdWxlIE9mX3NleHBhYmxlMVxuICAgIChTZXhwYWJsZSA6IFMxKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICB0eXBlICdhIHRcblxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fc2V4cGFibGUgOiAnYSB0IC0+ICdhIFNleHBhYmxlLnRcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX3NleHBhYmxlIDogJ2EgU2V4cGFibGUudCAtPiAnYSB0XG4gICAgICAgICAgICAgICAgICAgICBlbmQpIDogUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgTS50ID0gc3RydWN0XG4gIGxldCB0X29mX3NleHAgYV9vZl9zZXhwIHNleHAgPVxuICAgIGxldCBzID0gU2V4cGFibGUudF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwIGluXG4gICAgdHJ5IE0ub2Zfc2V4cGFibGUgcyB3aXRoXG4gICAgfCBleG4gLT4gb2Zfc2V4cF9lcnJvcl9leG4gZXhuIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID0gU2V4cGFibGUuc2V4cF9vZl90IHNleHBfb2ZfYSAoTS50b19zZXhwYWJsZSB0KVxuZW5kXG5cbm1vZHVsZSBPZl9zZXhwYWJsZTJcbiAgICAoU2V4cGFibGUgOiBTMikgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX3NleHBhYmxlIDogKCdhLCAnYikgdCAtPiAoJ2EsICdiKSBTZXhwYWJsZS50XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9zZXhwYWJsZSA6ICgnYSwgJ2IpIFNleHBhYmxlLnQgLT4gKCdhLCAnYikgdFxuICAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIE0udCA9IHN0cnVjdFxuICBsZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBiX29mX3NleHAgc2V4cCA9XG4gICAgbGV0IHMgPSBTZXhwYWJsZS50X29mX3NleHAgYV9vZl9zZXhwIGJfb2Zfc2V4cCBzZXhwIGluXG4gICAgdHJ5IE0ub2Zfc2V4cGFibGUgcyB3aXRoXG4gICAgfCBleG4gLT4gb2Zfc2V4cF9lcnJvcl9leG4gZXhuIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSBzZXhwX29mX2IgdCA9XG4gICAgU2V4cGFibGUuc2V4cF9vZl90IHNleHBfb2ZfYSBzZXhwX29mX2IgKE0udG9fc2V4cGFibGUgdClcbiAgOztcbmVuZFxuXG5tb2R1bGUgT2Zfc2V4cGFibGUzXG4gICAgKFNleHBhYmxlIDogUzMpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fc2V4cGFibGUgOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgU2V4cGFibGUudFxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgb2Zfc2V4cGFibGUgOiAoJ2EsICdiLCAnYykgU2V4cGFibGUudCAtPiAoJ2EsICdiLCAnYykgdFxuICAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMzIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgTS50ID0gc3RydWN0XG4gIGxldCB0X29mX3NleHAgYV9vZl9zZXhwIGJfb2Zfc2V4cCBjX29mX3NleHAgc2V4cCA9XG4gICAgbGV0IHMgPSBTZXhwYWJsZS50X29mX3NleHAgYV9vZl9zZXhwIGJfb2Zfc2V4cCBjX29mX3NleHAgc2V4cCBpblxuICAgIHRyeSBNLm9mX3NleHBhYmxlIHMgd2l0aFxuICAgIHwgZXhuIC0+IG9mX3NleHBfZXJyb3JfZXhuIGV4biBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2Egc2V4cF9vZl9iIHNleHBfb2ZfYyB0ID1cbiAgICBTZXhwYWJsZS5zZXhwX29mX3Qgc2V4cF9vZl9hIHNleHBfb2ZfYiBzZXhwX29mX2MgKE0udG9fc2V4cGFibGUgdClcbiAgOztcbmVuZFxuXG5tb2R1bGUgT2Zfc3RyaW5nYWJsZSAoTSA6IFN0cmluZ2FibGUuUykgOiBTIHdpdGggdHlwZSB0IDo9IE0udCA9IHN0cnVjdFxuICBsZXQgdF9vZl9zZXhwIHNleHAgPVxuICAgIG1hdGNoIHNleHAgd2l0aFxuICAgIHwgU2V4cC5BdG9tIHMgLT5cbiAgICAgICh0cnkgTS5vZl9zdHJpbmcgcyB3aXRoXG4gICAgICAgfCBleG4gLT4gb2Zfc2V4cF9lcnJvcl9leG4gZXhuIHNleHApXG4gICAgfCBTZXhwLkxpc3QgXyAtPlxuICAgICAgb2Zfc2V4cF9lcnJvclxuICAgICAgICBcIlNleHBhYmxlLk9mX3N0cmluZ2FibGUudF9vZl9zZXhwIGV4cGVjdGVkIGFuIGF0b20sIGJ1dCBnb3QgYSBsaXN0XCJcbiAgICAgICAgc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgdCA9IFNleHAuQXRvbSAoTS50b19zdHJpbmcgdClcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEVpdGhlcl9pbnRmXG5tb2R1bGUgTGlzdCA9IExpc3QwXG5pbmNsdWRlIEVpdGhlcjBcblxubGV0IHN3YXAgPSBmdW5jdGlvblxuICB8IEZpcnN0IHggLT4gU2Vjb25kIHhcbiAgfCBTZWNvbmQgeCAtPiBGaXJzdCB4XG47O1xuXG5sZXQgaXNfZmlyc3QgPSBmdW5jdGlvblxuICB8IEZpcnN0IF8gLT4gdHJ1ZVxuICB8IFNlY29uZCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfc2Vjb25kID0gZnVuY3Rpb25cbiAgfCBGaXJzdCBfIC0+IGZhbHNlXG4gIHwgU2Vjb25kIF8gLT4gdHJ1ZVxuOztcblxubGV0IHZhbHVlIChGaXJzdCB4IHwgU2Vjb25kIHgpID0geFxuXG5sZXQgdmFsdWVfbWFwIHQgfmZpcnN0IH5zZWNvbmQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBGaXJzdCB4IC0+IGZpcnN0IHhcbiAgfCBTZWNvbmQgeCAtPiBzZWNvbmQgeFxuOztcblxubGV0IGl0ZXIgPSB2YWx1ZV9tYXBcblxubGV0IG1hcCB0IH5maXJzdCB+c2Vjb25kID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRmlyc3QgeCAtPiBGaXJzdCAoZmlyc3QgeClcbiAgfCBTZWNvbmQgeCAtPiBTZWNvbmQgKHNlY29uZCB4KVxuOztcblxubGV0IGZpcnN0IHggPSBGaXJzdCB4XG5sZXQgc2Vjb25kIHggPSBTZWNvbmQgeFxuXG5sZXQgZXF1YWwgZXExIGVxMiB0MSB0MiA9XG4gIG1hdGNoIHQxLCB0MiB3aXRoXG4gIHwgRmlyc3QgeCwgRmlyc3QgeSAtPiBlcTEgeCB5XG4gIHwgU2Vjb25kIHgsIFNlY29uZCB5IC0+IGVxMiB4IHlcbiAgfCBGaXJzdCBfLCBTZWNvbmQgXyB8IFNlY29uZCBfLCBGaXJzdCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaW52YXJpYW50IGYgcyA9IGZ1bmN0aW9uXG4gIHwgRmlyc3QgeCAtPiBmIHhcbiAgfCBTZWNvbmQgeSAtPiBzIHlcbjs7XG5cbm1vZHVsZSBNYWtlX2ZvY3VzZWQgKE0gOiBzaWdcbiAgICB0eXBlICgrJ2EsICsnYikgdFxuXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXykgdFxuICAgIHZhbCBvdGhlciA6ICdiIC0+IChfLCAnYikgdFxuICAgIHZhbCBlaXRoZXIgOiAoJ2EsICdiKSB0IC0+IHJldHVybjooJ2EgLT4gJ2MpIC0+IG90aGVyOignYiAtPiAnYykgLT4gJ2NcblxuICAgIHZhbCBjb21iaW5lXG4gICAgICA6ICAoJ2EsICdkKSB0XG4gICAgICAtPiAoJ2IsICdkKSB0XG4gICAgICAtPiBmOignYSAtPiAnYiAtPiAnYylcbiAgICAgIC0+IG90aGVyOignZCAtPiAnZCAtPiAnZClcbiAgICAgIC0+ICgnYywgJ2QpIHRcblxuICAgIHZhbCBiaW5kIDogKCdhLCAnYikgdCAtPiBmOignYSAtPiAoJ2MsICdiKSB0KSAtPiAoJ2MsICdiKSB0XG4gIGVuZCkgPVxuc3RydWN0XG4gIGluY2x1ZGUgTVxuICBvcGVuIFdpdGhfcmV0dXJuXG5cbiAgbGV0IG1hcCB0IH5mID0gYmluZCB0IH5mOihmdW4geCAtPiByZXR1cm4gKGYgeCkpXG5cbiAgaW5jbHVkZSBNb25hZC5NYWtlMiAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuXG4gICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICBsZXQgYmluZCA9IGJpbmRcbiAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgIGVuZClcblxuICBtb2R1bGUgQXBwID0gQXBwbGljYXRpdmUuTWFrZTIgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcblxuICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgbGV0IGFwcGx5IHQxIHQyID0gYmluZCB0MSB+ZjooZnVuIGYgLT4gYmluZCB0MiB+ZjooZnVuIHggLT4gcmV0dXJuIChmIHgpKSlcbiAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgIGVuZClcblxuICBpbmNsdWRlIEFwcFxuXG4gIGxldCBjb21iaW5lX2FsbCA9XG4gICAgbGV0IHJlYyBvdGhlcl9sb29wIGYgYWNjID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gb3RoZXIgYWNjXG4gICAgICB8IHQgOjogdHMgLT5cbiAgICAgICAgZWl0aGVyXG4gICAgICAgICAgdFxuICAgICAgICAgIH5yZXR1cm46KGZ1biBfIC0+IG90aGVyX2xvb3AgZiBhY2MgdHMpXG4gICAgICAgICAgfm90aGVyOihmdW4gbyAtPiBvdGhlcl9sb29wIGYgKGYgYWNjIG8pIHRzKVxuICAgIGluXG4gICAgbGV0IHJlYyByZXR1cm5fbG9vcCBmIGFjYyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IHJldHVybiAoTGlzdC5yZXYgYWNjKVxuICAgICAgfCB0IDo6IHRzIC0+XG4gICAgICAgIGVpdGhlclxuICAgICAgICAgIHRcbiAgICAgICAgICB+cmV0dXJuOihmdW4geCAtPiByZXR1cm5fbG9vcCBmICh4IDo6IGFjYykgdHMpXG4gICAgICAgICAgfm90aGVyOihmdW4gbyAtPiBvdGhlcl9sb29wIGYgbyB0cylcbiAgICBpblxuICAgIGZ1biB0cyB+ZiAtPiByZXR1cm5fbG9vcCBmIFtdIHRzXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmVfYWxsX3VuaXQgPVxuICAgIGxldCByZWMgb3RoZXJfbG9vcCBmIGFjYyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IG90aGVyIGFjY1xuICAgICAgfCB0IDo6IHRzIC0+XG4gICAgICAgIGVpdGhlclxuICAgICAgICAgIHRcbiAgICAgICAgICB+cmV0dXJuOihmdW4gKCkgLT4gb3RoZXJfbG9vcCBmIGFjYyB0cylcbiAgICAgICAgICB+b3RoZXI6KGZ1biBvIC0+IG90aGVyX2xvb3AgZiAoZiBhY2MgbykgdHMpXG4gICAgaW5cbiAgICBsZXQgcmVjIHJldHVybl9sb29wIGYgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiByZXR1cm4gKClcbiAgICAgIHwgdCA6OiB0cyAtPlxuICAgICAgICBlaXRoZXIgdCB+cmV0dXJuOihmdW4gKCkgLT4gcmV0dXJuX2xvb3AgZiB0cykgfm90aGVyOihmdW4gbyAtPiBvdGhlcl9sb29wIGYgbyB0cylcbiAgICBpblxuICAgIGZ1biB0cyB+ZiAtPiByZXR1cm5fbG9vcCBmIHRzXG4gIDs7XG5cbiAgbGV0IHRvX29wdGlvbiB0ID0gZWl0aGVyIHQgfnJldHVybjpPcHRpb24uc29tZSB+b3RoZXI6KGZ1biBfIC0+IE5vbmUpXG4gIGxldCB2YWx1ZSB0IH5kZWZhdWx0ID0gZWl0aGVyIHQgfnJldHVybjpGbi5pZCB+b3RoZXI6KGZ1biBfIC0+IGRlZmF1bHQpXG5cbiAgbGV0IHdpdGhfcmV0dXJuIGYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gcmV0IC0+IG90aGVyIChmIChXaXRoX3JldHVybi5wcmVwZW5kIHJldCB+ZjpyZXR1cm4pKSlcbiAgOztcbmVuZFxuXG5tb2R1bGUgRmlyc3QgPSBNYWtlX2ZvY3VzZWQgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG5cbiAgICBsZXQgcmV0dXJuID0gZmlyc3RcbiAgICBsZXQgb3RoZXIgPSBzZWNvbmRcblxuICAgIGxldCBlaXRoZXIgdCB+cmV0dXJuIH5vdGhlciA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRmlyc3QgeCAtPiByZXR1cm4geFxuICAgICAgfCBTZWNvbmQgeSAtPiBvdGhlciB5XG4gICAgOztcblxuICAgIGxldCBjb21iaW5lIHQxIHQyIH5mIH5vdGhlciA9XG4gICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgfCBGaXJzdCB4LCBGaXJzdCB5IC0+IEZpcnN0IChmIHggeSlcbiAgICAgIHwgU2Vjb25kIHgsIFNlY29uZCB5IC0+IFNlY29uZCAob3RoZXIgeCB5KVxuICAgICAgfCBTZWNvbmQgeCwgXyB8IF8sIFNlY29uZCB4IC0+IFNlY29uZCB4XG4gICAgOztcblxuICAgIGxldCBiaW5kIHQgfmYgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEZpcnN0IHggLT4gZiB4XG4gICAgICAoKiBSZXVzZSB0aGUgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgYWxsb2NhdGlvbi4gKilcbiAgICAgIHwgU2Vjb25kIF8gYXMgeSAtPiB5XG4gICAgOztcbiAgZW5kKVxuXG5tb2R1bGUgU2Vjb25kID0gTWFrZV9mb2N1c2VkIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdiLCAnYSkgdFxuXG4gICAgbGV0IHJldHVybiA9IHNlY29uZFxuICAgIGxldCBvdGhlciA9IGZpcnN0XG5cbiAgICBsZXQgZWl0aGVyIHQgfnJldHVybiB+b3RoZXIgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IFNlY29uZCB5IC0+IHJldHVybiB5XG4gICAgICB8IEZpcnN0IHggLT4gb3RoZXIgeFxuICAgIDs7XG5cbiAgICBsZXQgY29tYmluZSB0MSB0MiB+ZiB+b3RoZXIgPVxuICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgIHwgU2Vjb25kIHgsIFNlY29uZCB5IC0+IFNlY29uZCAoZiB4IHkpXG4gICAgICB8IEZpcnN0IHgsIEZpcnN0IHkgLT4gRmlyc3QgKG90aGVyIHggeSlcbiAgICAgIHwgRmlyc3QgeCwgXyB8IF8sIEZpcnN0IHggLT4gRmlyc3QgeFxuICAgIDs7XG5cbiAgICBsZXQgYmluZCB0IH5mID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBTZWNvbmQgeCAtPiBmIHhcbiAgICAgICgqIFJldXNlIHRoZSB2YWx1ZSBpbiBvcmRlciB0byBhdm9pZCBhbGxvY2F0aW9uLCBsaWtlIFtGaXJzdC5iaW5kXSBhYm92ZS4gKilcbiAgICAgIHwgRmlyc3QgXyBhcyB5IC0+IHlcbiAgICA7O1xuICBlbmQpXG5cbm1vZHVsZSBFeHBvcnQgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2YsICdzKSBfZWl0aGVyID0gKCdmLCAncykgdCA9XG4gICAgfCBGaXJzdCBvZiAnZlxuICAgIHwgU2Vjb25kIG9mICdzXG5lbmRcbiIsImluY2x1ZGUgSW5kZXhlZF9jb250YWluZXJfaW50ZlxuXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxuXG5sZXQgaXRlcmkgfmZvbGQgdCB+ZiA9XG4gIGlnbm9yZVxuICAgIChmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIGkgeCAtPlxuICAgICAgIGYgaSB4O1xuICAgICAgIGkgKyAxKVxuICAgICA6IGludClcbjs7XG5cbmxldCBmb2xkaSB+Zm9sZCB0IH5pbml0IH5mID1cbiAgbGV0IGkgPSByZWYgMCBpblxuICBmb2xkIHQgfmluaXQgfmY6KGZ1biBhY2MgdiAtPlxuICAgIGxldCBhY2MgPSBmICFpIGFjYyB2IGluXG4gICAgaSA6PSAhaSArIDE7XG4gICAgYWNjKVxuOztcblxubGV0IGNvdW50aSB+Zm9sZGkgdCB+ZiA9IGZvbGRpIHQgfmluaXQ6MCB+ZjooZnVuIGkgbiBhIC0+IGlmIGYgaSBhIHRoZW4gbiArIDEgZWxzZSBuKVxuXG5sZXQgZXhpc3RzaSB+aXRlcmkgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXJpIGMgfmY6KGZ1biBpIHggLT4gaWYgZiBpIHggdGhlbiByLnJldHVybiB0cnVlKTtcbiAgICBmYWxzZSlcbjs7XG5cbmxldCBmb3JfYWxsaSB+aXRlcmkgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXJpIGMgfmY6KGZ1biBpIHggLT4gaWYgbm90IChmIGkgeCkgdGhlbiByLnJldHVybiBmYWxzZSk7XG4gICAgdHJ1ZSlcbjs7XG5cbmxldCBmaW5kX21hcGkgfml0ZXJpIHQgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyaSB0IH5mOihmdW4gaSB4IC0+XG4gICAgICBtYXRjaCBmIGkgeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gKClcbiAgICAgIHwgU29tZSBfIGFzIHJlcyAtPiByLnJldHVybiByZXMpO1xuICAgIE5vbmUpXG47O1xuXG5sZXQgZmluZGkgfml0ZXJpIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyaSBjIH5mOihmdW4gaSB4IC0+IGlmIGYgaSB4IHRoZW4gci5yZXR1cm4gKFNvbWUgKGksIHgpKSk7XG4gICAgTm9uZSlcbjs7XG5cbm1vZHVsZSBNYWtlX2dlbiAoVCA6IHNpZ1xuICAgIGluY2x1ZGUgQ29udGFpbmVyX2ludGYuTWFrZV9nZW5fYXJnXG5cbiAgICB2YWwgaXRlcmkgOiBbIGBEZWZpbmVfdXNpbmdfZm9sZCB8IGBDdXN0b20gb2YgKCdhIHQsICdhIGVsdCkgaXRlcmkgXVxuICAgIHZhbCBmb2xkaSA6IFsgYERlZmluZV91c2luZ19mb2xkIHwgYEN1c3RvbSBvZiAoJ2EgdCwgJ2EgZWx0LCBfKSBmb2xkaSBdXG4gIGVuZCkgOiBHZW5lcmljIHdpdGggdHlwZSAnYSB0IDo9ICdhIFQudCB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIFQuZWx0ID0gc3RydWN0XG4gIGluY2x1ZGUgQ29udGFpbmVyLk1ha2VfZ2VuIChUKVxuXG4gIGxldCBpdGVyaSA9XG4gICAgbWF0Y2ggVC5pdGVyaSB3aXRoXG4gICAgfCBgQ3VzdG9tIGl0ZXJpIC0+IGl0ZXJpXG4gICAgfCBgRGVmaW5lX3VzaW5nX2ZvbGQgLT4gZnVuIHQgfmYgLT4gaXRlcmkgfmZvbGQgdCB+ZlxuICA7O1xuXG4gIGxldCBmb2xkaSA9XG4gICAgbWF0Y2ggVC5mb2xkaSB3aXRoXG4gICAgfCBgQ3VzdG9tIGZvbGRpIC0+IGZvbGRpXG4gICAgfCBgRGVmaW5lX3VzaW5nX2ZvbGQgLT4gZnVuIHQgfmluaXQgfmYgLT4gZm9sZGkgfmZvbGQgdCB+aW5pdCB+ZlxuICA7O1xuXG4gIGxldCBjb3VudGkgdCB+ZiA9IGNvdW50aSB+Zm9sZGkgdCB+ZlxuICBsZXQgZXhpc3RzaSB0IH5mID0gZXhpc3RzaSB+aXRlcmkgdCB+ZlxuICBsZXQgZm9yX2FsbGkgdCB+ZiA9IGZvcl9hbGxpIH5pdGVyaSB0IH5mXG4gIGxldCBmaW5kX21hcGkgdCB+ZiA9IGZpbmRfbWFwaSB+aXRlcmkgdCB+ZlxuICBsZXQgZmluZGkgdCB+ZiA9IGZpbmRpIH5pdGVyaSB0IH5mXG5lbmRcblxubW9kdWxlIE1ha2UgKFQgOiBNYWtlX2FyZykgPSBzdHJ1Y3RcbiAgbW9kdWxlIEMgPSBDb250YWluZXIuTWFrZSAoVClcblxuICAoKiBOb3QgcGFydCBvZiBbQ29udGFpbmVyLkdlbmVyaWNdLiAqKVxuICBsZXQgbWVtID0gQy5tZW1cblxuICBpbmNsdWRlIE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgVFxuXG4gICAgICB0eXBlICdhIHQgPSAnYSBULnRcbiAgICAgIHR5cGUgJ2EgZWx0ID0gJ2FcbiAgICBlbmQpXG5lbmRcblxubW9kdWxlIE1ha2UwIChUIDogTWFrZTBfYXJnKSA9IHN0cnVjdFxuICBtb2R1bGUgQyA9IENvbnRhaW5lci5NYWtlMCAoVClcblxuICAoKiBOb3QgcGFydCBvZiBbQ29udGFpbmVyLkdlbmVyaWNdLiAqKVxuICBsZXQgbWVtID0gQy5tZW1cblxuICBpbmNsdWRlIE1ha2VfZ2VuIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgVFxuXG4gICAgICB0eXBlICdhIHQgPSBULnRcbiAgICAgIHR5cGUgJ2EgZWx0ID0gVC5FbHQudFxuICAgIGVuZClcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5vcGVuIENvbnRhaW5lcl9pbnRmLkV4cG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5tb2R1bGUgTGlzdCA9IExpc3QxXG5cbm1vZHVsZSBTdGVwID0gc3RydWN0XG4gICgqICdhIGlzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlLCAncyBpcyB0aGUgc3RhdGUgdGhhdCB3aWxsIHByb2R1Y2UgdGhlIHJlbWFpbmRlciBvZlxuICAgICB0aGUgc2VxdWVuY2UgKilcbiAgdHlwZSAoJ2EsICdzKSB0ID1cbiAgICB8IERvbmVcbiAgICB8IFNraXAgb2YgJ3NcbiAgICB8IFlpZWxkIG9mICdhICogJ3NcbiAgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgbGV0IHNleHBfb2ZfdCA6XG4gICAgJ2EgJ3MuXG4gICAgKCdhIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ3MgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnYSwgJ3MpIHRcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICA9XG4gICAgZnVuICh0eXBlIGFfXzAwOV8gc19fMDEwXylcbiAgICAgICAgOiAgKChhX18wMDlfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKHNfXzAxMF8gLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAgICAgLT4gKGFfXzAwOV8sIHNfXzAxMF8pIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgICAgZnVuIF9vZl9hX18wMDFfIF9vZl9zX18wMDJfIC0+IGZ1bmN0aW9uXG4gICAgICAgIHwgRG9uZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJEb25lXCJcbiAgICAgICAgfCBTa2lwIGFyZzBfXzAwM18gLT5cbiAgICAgICAgICBsZXQgcmVzMF9fMDA0XyA9IF9vZl9zX18wMDJfIGFyZzBfXzAwM18gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJTa2lwXCI7IHJlczBfXzAwNF8gXVxuICAgICAgICB8IFlpZWxkIChhcmcwX18wMDVfLCBhcmcxX18wMDZfKSAtPlxuICAgICAgICAgIGxldCByZXMwX18wMDdfID0gX29mX2FfXzAwMV8gYXJnMF9fMDA1X1xuICAgICAgICAgIGFuZCByZXMxX18wMDhfID0gX29mX3NfXzAwMl8gYXJnMV9fMDA2XyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIllpZWxkXCI7IHJlczBfXzAwN187IHJlczFfXzAwOF8gXVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxub3BlbiBTdGVwXG5cbigqICdhIGlzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlLCAncyBpcyB0aGUgc3RhdGUgdGhhdCB3aWxsIHByb2R1Y2UgdGhlIHJlbWFpbmRlciBvZiB0aGVcbiAgIHNlcXVlbmNlICopXG50eXBlICtfIHQgPSBTZXF1ZW5jZSA6ICdzICogKCdzIC0+ICgnYSwgJ3MpIFN0ZXAudCkgLT4gJ2EgdFxudHlwZSAnYSBzZXF1ZW5jZSA9ICdhIHRcblxubW9kdWxlIEV4cGVydCA9IHN0cnVjdFxuICBsZXQgbmV4dF9zdGVwIChTZXF1ZW5jZSAocywgZikpID1cbiAgICBtYXRjaCBmIHMgd2l0aFxuICAgIHwgRG9uZSAtPiBEb25lXG4gICAgfCBTa2lwIHMgLT4gU2tpcCAoU2VxdWVuY2UgKHMsIGYpKVxuICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCBTZXF1ZW5jZSAocywgZikpXG4gIDs7XG5cbiAgbGV0IGRlbGF5ZWRfZm9sZF9zdGVwIHMgfmluaXQgfmYgfmZpbmlzaCA9XG4gICAgbGV0IHJlYyBsb29wIHMgbmV4dCBmaW5pc2ggZiBhY2MgPVxuICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBmaW5pc2ggYWNjXG4gICAgICB8IFNraXAgcyAtPiBmIGFjYyBOb25lIH5rOihsb29wIHMgbmV4dCBmaW5pc2ggZilcbiAgICAgIHwgWWllbGQgKGEsIHMpIC0+IGYgYWNjIChTb21lIGEpIH5rOihsb29wIHMgbmV4dCBmaW5pc2ggZilcbiAgICBpblxuICAgIG1hdGNoIHMgd2l0aFxuICAgIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuZXh0IGZpbmlzaCBmIGluaXRcbiAgOztcbmVuZFxuXG5sZXQgdW5mb2xkX3N0ZXAgfmluaXQgfmYgPSBTZXF1ZW5jZSAoaW5pdCwgZilcblxubGV0IHVuZm9sZCB+aW5pdCB+ZiA9XG4gIHVuZm9sZF9zdGVwIH5pbml0IH5mOihmdW4gcyAtPlxuICAgIG1hdGNoIGYgcyB3aXRoXG4gICAgfCBOb25lIC0+IFN0ZXAuRG9uZVxuICAgIHwgU29tZSAoYSwgcykgLT4gU3RlcC5ZaWVsZCAoYSwgcykpXG47O1xuXG5sZXQgdW5mb2xkX3dpdGggcyB+aW5pdCB+ZiA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIChpbml0LCBzKVxuICAgICAgLCBmdW4gKHNlZWQsIHMpIC0+XG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKHNlZWQsIHMpXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAgICAgKG1hdGNoIGYgc2VlZCBhIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHNlZWQgLT4gU2tpcCAoc2VlZCwgcylcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgc2VlZCkgLT4gWWllbGQgKGEsIChzZWVkLCBzKSkpIClcbjs7XG5cbmxldCB1bmZvbGRfd2l0aF9hbmRfZmluaXNoIHMgfmluaXQgfnJ1bm5pbmdfc3RlcCB+aW5uZXJfZmluaXNoZWQgfmZpbmlzaGluZ19zdGVwID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggYElubmVyX3J1bm5pbmcgKGluaXQsIHMpXG4gICAgICAsIGZ1biBzdGF0ZSAtPlxuICAgICAgICBtYXRjaCBzdGF0ZSB3aXRoXG4gICAgICAgIHwgYElubmVyX3J1bm5pbmcgKHN0YXRlLCBpbm5lcl9zdGF0ZSkgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dCBpbm5lcl9zdGF0ZSB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBTa2lwIChgSW5uZXJfZmluaXNoZWQgKGlubmVyX2ZpbmlzaGVkIHN0YXRlKSlcbiAgICAgICAgICAgfCBTa2lwIGlubmVyX3N0YXRlIC0+IFNraXAgKGBJbm5lcl9ydW5uaW5nIChzdGF0ZSwgaW5uZXJfc3RhdGUpKVxuICAgICAgICAgICB8IFlpZWxkICh4LCBpbm5lcl9zdGF0ZSkgLT5cbiAgICAgICAgICAgICAobWF0Y2ggcnVubmluZ19zdGVwIHN0YXRlIHggd2l0aFxuICAgICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICAgICB8IFNraXAgc3RhdGUgLT4gU2tpcCAoYElubmVyX3J1bm5pbmcgKHN0YXRlLCBpbm5lcl9zdGF0ZSkpXG4gICAgICAgICAgICAgIHwgWWllbGQgKHksIHN0YXRlKSAtPiBZaWVsZCAoeSwgYElubmVyX3J1bm5pbmcgKHN0YXRlLCBpbm5lcl9zdGF0ZSkpKSlcbiAgICAgICAgfCBgSW5uZXJfZmluaXNoZWQgc3RhdGUgLT5cbiAgICAgICAgICAobWF0Y2ggZmluaXNoaW5nX3N0ZXAgc3RhdGUgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgc3RhdGUgLT4gU2tpcCAoYElubmVyX2ZpbmlzaGVkIHN0YXRlKVxuICAgICAgICAgICB8IFlpZWxkICh5LCBzdGF0ZSkgLT4gWWllbGQgKHksIGBJbm5lcl9maW5pc2hlZCBzdGF0ZSkpIClcbjs7XG5cbmxldCBvZl9saXN0IGwgPVxuICB1bmZvbGRfc3RlcCB+aW5pdDpsIH5mOihmdW5jdGlvblxuICAgIHwgW10gLT4gRG9uZVxuICAgIHwgeCA6OiBsIC0+IFlpZWxkICh4LCBsKSlcbjs7XG5cblxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzZWVkIHYgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgIHwgRG9uZSAtPiB2XG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIHYgbmV4dCBmXG4gICAgfCBZaWVsZCAoYSwgcykgLT4gbG9vcCBzIChmIHYgYSkgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgaW5pdCBuZXh0IGZcbjs7XG5cbmxldCB0b19saXN0X3JldiB0ID0gZm9sZCB0IH5pbml0OltdIH5mOihmdW4gbCB4IC0+IHggOjogbClcblxuXG5sZXQgdG9fbGlzdCAoU2VxdWVuY2UgKHMsIG5leHQpKSA9XG4gIGxldCBzYWZlX3RvX2xpc3QgdCA9IExpc3QucmV2ICh0b19saXN0X3JldiB0KSBpblxuICBsZXQgcmVjIHRvX2xpc3QgcyBuZXh0IGkgPVxuICAgIGlmIGkgPSAwXG4gICAgdGhlbiBzYWZlX3RvX2xpc3QgKFNlcXVlbmNlIChzLCBuZXh0KSlcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICB8IERvbmUgLT4gW11cbiAgICAgIHwgU2tpcCBzIC0+IHRvX2xpc3QgcyBuZXh0IGlcbiAgICAgIHwgWWllbGQgKGEsIHMpIC0+IGEgOjogdG9fbGlzdCBzIG5leHQgKGkgLSAxKSlcbiAgaW5cbiAgdG9fbGlzdCBzIG5leHQgNTAwXG47O1xuXG5sZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID0gc2V4cF9vZl9saXN0IHNleHBfb2ZfYSAodG9fbGlzdCB0KVxuXG5sZXQgcmFuZ2UgPyhzdHJpZGUgPSAxKSA/KHN0YXJ0ID0gYGluY2x1c2l2ZSkgPyhzdG9wID0gYGV4Y2x1c2l2ZSkgc3RhcnRfdiBzdG9wX3YgPVxuICBsZXQgc3RlcCA9XG4gICAgbWF0Y2ggc3RvcCB3aXRoXG4gICAgfCBgaW5jbHVzaXZlIHdoZW4gc3RyaWRlID49IDAgLT5cbiAgICAgIGZ1biBpIC0+IGlmIGkgPiBzdG9wX3YgdGhlbiBEb25lIGVsc2UgWWllbGQgKGksIGkgKyBzdHJpZGUpXG4gICAgfCBgaW5jbHVzaXZlIC0+IGZ1biBpIC0+IGlmIGkgPCBzdG9wX3YgdGhlbiBEb25lIGVsc2UgWWllbGQgKGksIGkgKyBzdHJpZGUpXG4gICAgfCBgZXhjbHVzaXZlIHdoZW4gc3RyaWRlID49IDAgLT5cbiAgICAgIGZ1biBpIC0+IGlmIGkgPj0gc3RvcF92IHRoZW4gRG9uZSBlbHNlIFlpZWxkIChpLCBpICsgc3RyaWRlKVxuICAgIHwgYGV4Y2x1c2l2ZSAtPiBmdW4gaSAtPiBpZiBpIDw9IHN0b3BfdiB0aGVuIERvbmUgZWxzZSBZaWVsZCAoaSwgaSArIHN0cmlkZSlcbiAgaW5cbiAgbGV0IGluaXQgPVxuICAgIG1hdGNoIHN0YXJ0IHdpdGhcbiAgICB8IGBpbmNsdXNpdmUgLT4gc3RhcnRfdlxuICAgIHwgYGV4Y2x1c2l2ZSAtPiBzdGFydF92ICsgc3RyaWRlXG4gIGluXG4gIHVuZm9sZF9zdGVwIH5pbml0IH5mOnN0ZXBcbjs7XG5cbmxldCBvZl9sYXp5IHRfbGF6eSA9XG4gIHVuZm9sZF9zdGVwIH5pbml0OnRfbGF6eSB+ZjooZnVuIHRfbGF6eSAtPlxuICAgIGxldCAoU2VxdWVuY2UgKHMsIG5leHQpKSA9IExhenkuZm9yY2UgdF9sYXp5IGluXG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gRG9uZVxuICAgIHwgU2tpcCBzIC0+XG4gICAgICBTa2lwXG4gICAgICAgIChsZXQgdiA9IFNlcXVlbmNlIChzLCBuZXh0KSBpblxuICAgICAgICAgbGF6eSB2KVxuICAgIHwgWWllbGQgKHgsIHMpIC0+XG4gICAgICBZaWVsZFxuICAgICAgICAoIHhcbiAgICAgICAgLCBsZXQgdiA9IFNlcXVlbmNlIChzLCBuZXh0KSBpblxuICAgICAgICAgIGxhenkgdiApKVxuOztcblxubGV0IG1hcCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggc2VlZFxuICAgICAgLCBmdW4gc2VlZCAtPlxuICAgICAgICBtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIHNcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGYgYSwgcykgKVxuOztcblxubGV0IG1hcGkgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoICgwLCBzKVxuICAgICAgLCBmdW4gKGksIHMpIC0+XG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGksIHMpXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChmIGkgYSwgKGkgKyAxLCBzKSkgKVxuOztcblxubGV0IGZvbGRpbmdfbWFwIHQgfmluaXQgfmYgPVxuICB1bmZvbGRfd2l0aCB0IH5pbml0IH5mOihmdW4gYWNjIHggLT5cbiAgICBsZXQgYWNjLCB4ID0gZiBhY2MgeCBpblxuICAgIFlpZWxkICh4LCBhY2MpKVxuOztcblxubGV0IGZvbGRpbmdfbWFwaSB0IH5pbml0IH5mID1cbiAgdW5mb2xkX3dpdGggdCB+aW5pdDooMCwgaW5pdCkgfmY6KGZ1biAoaSwgYWNjKSB4IC0+XG4gICAgbGV0IGFjYywgeCA9IGYgaSBhY2MgeCBpblxuICAgIFlpZWxkICh4LCAoaSArIDEsIGFjYykpKVxuOztcblxubGV0IGZpbHRlciB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggc2VlZFxuICAgICAgLCBmdW4gc2VlZCAtPlxuICAgICAgICBtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIHNcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgd2hlbiBmIGEgLT4gWWllbGQgKGEsIHMpXG4gICAgICAgIHwgWWllbGQgKF8sIHMpIC0+IFNraXAgcyApXG47O1xuXG5sZXQgZmlsdGVyaSB0IH5mID1cbiAgbWFwIH5mOnNuZCAoZmlsdGVyIChtYXBpIHQgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gKGksIHMpIC0+IGYgaSBzKSlcbjs7XG5cbmxldCBsZW5ndGggdCA9XG4gIGxldCByZWMgbG9vcCBpIHMgbmV4dCA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gaVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgaSBzIG5leHRcbiAgICB8IFlpZWxkIChfLCBzKSAtPiBsb29wIChpICsgMSkgcyBuZXh0XG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIDAgc2VlZCBuZXh0XG47O1xuXG5sZXQgdG9fbGlzdF9yZXZfd2l0aF9sZW5ndGggdCA9IGZvbGQgdCB+aW5pdDooW10sIDApIH5mOihmdW4gKGwsIGkpIHggLT4geCA6OiBsLCBpICsgMSlcblxubGV0IHRvX2FycmF5IHQgPVxuICBsZXQgbCwgbGVuID0gdG9fbGlzdF9yZXZfd2l0aF9sZW5ndGggdCBpblxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBbfHxdXG4gIHwgeCA6OiBsIC0+XG4gICAgbGV0IGEgPSBBcnJheS5jcmVhdGUgfmxlbiB4IGluXG4gICAgbGV0IHJlYyBsb29wIGkgbCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IChpID0gLTEpXG4gICAgICB8IHggOjogbCAtPlxuICAgICAgICBhLihpKSA8LSB4O1xuICAgICAgICBsb29wIChpIC0gMSkgbFxuICAgIGluXG4gICAgbG9vcCAobGVuIC0gMikgbDtcbiAgICBhXG47O1xuXG5sZXQgZmluZCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBZaWVsZCAoYSwgXykgd2hlbiBmIGEgLT4gU29tZSBhXG4gICAgfCBZaWVsZCAoXywgcykgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZlxuOztcblxubGV0IGZpbmRfbWFwIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgKG1hdGNoIGYgYSB3aXRoXG4gICAgICAgfCBOb25lIC0+IGxvb3AgcyBuZXh0IGZcbiAgICAgICB8IHNvbWVfYiAtPiBzb21lX2IpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZlxuOztcblxuXG5sZXQgZmluZF9tYXBpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgaSA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAobWF0Y2ggZiBpIGEgd2l0aFxuICAgICAgIHwgTm9uZSAtPiBsb29wIHMgbmV4dCBmIChpICsgMSlcbiAgICAgICB8IHNvbWVfYiAtPiBzb21lX2IpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZiBpXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmIDBcbjs7XG5cbmxldCBmb3JfYWxsIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IHRydWVcbiAgICB8IFlpZWxkIChhLCBfKSB3aGVuIG5vdCAoZiBhKSAtPiBmYWxzZVxuICAgIHwgWWllbGQgKF8sIHMpIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGZcbjs7XG5cbmxldCBmb3JfYWxsaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmIGkgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IHRydWVcbiAgICB8IFlpZWxkIChhLCBfKSB3aGVuIG5vdCAoZiBpIGEpIC0+IGZhbHNlXG4gICAgfCBZaWVsZCAoXywgcykgLT4gbG9vcCBzIG5leHQgZiAoaSArIDEpXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZiBpXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmIDBcbjs7XG5cbmxldCBleGlzdHMgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gZmFsc2VcbiAgICB8IFlpZWxkIChhLCBfKSB3aGVuIGYgYSAtPiB0cnVlXG4gICAgfCBZaWVsZCAoXywgcykgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZlxuOztcblxubGV0IGV4aXN0c2kgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiBpID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBmYWxzZVxuICAgIHwgWWllbGQgKGEsIF8pIHdoZW4gZiBpIGEgLT4gdHJ1ZVxuICAgIHwgWWllbGQgKF8sIHMpIC0+IGxvb3AgcyBuZXh0IGYgKGkgKyAxKVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGYgaVxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZiAwXG47O1xuXG5sZXQgaXRlciB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHNlZWQgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgIHwgRG9uZSAtPiAoKVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGZcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgZiBhO1xuICAgICAgbG9vcCBzIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZlxuOztcblxubGV0IGlzX2VtcHR5IHQgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0ID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiB0cnVlXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHRcbiAgICB8IFlpZWxkIF8gLT4gZmFsc2VcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0XG47O1xuXG5sZXQgbWVtIHQgYSB+ZXF1YWwgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGEgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IGZhbHNlXG4gICAgfCBZaWVsZCAoYiwgXykgd2hlbiBlcXVhbCBhIGIgLT4gdHJ1ZVxuICAgIHwgWWllbGQgKF8sIHMpIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGFcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGFcbjs7XG5cbmxldCBlbXB0eSA9IFNlcXVlbmNlICgoKSwgZnVuICgpIC0+IERvbmUpXG5cbmxldCBiaW5kIHQgfmYgPVxuICB1bmZvbGRfc3RlcFxuICAgIH5mOihmdW5jdGlvblxuICAgICAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCksIHJlc3QgLT5cbiAgICAgICAgKG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgICAgICB8IERvbmUgLT5cbiAgICAgICAgICAgKG1hdGNoIHJlc3Qgd2l0aFxuICAgICAgICAgICAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT5cbiAgICAgICAgICAgICAgKG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoZW1wdHksIFNlcXVlbmNlIChzLCBuZXh0KSlcbiAgICAgICAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFNraXAgKGYgYSwgU2VxdWVuY2UgKHMsIG5leHQpKSkpXG4gICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChTZXF1ZW5jZSAocywgbmV4dCksIHJlc3QpXG4gICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgKFNlcXVlbmNlIChzLCBuZXh0KSwgcmVzdCkpKSlcbiAgICB+aW5pdDooZW1wdHksIHQpXG47O1xuXG5sZXQgcmV0dXJuIHggPVxuICB1bmZvbGRfc3RlcCB+aW5pdDooU29tZSB4KSB+ZjooZnVuY3Rpb25cbiAgICB8IE5vbmUgLT4gRG9uZVxuICAgIHwgU29tZSB4IC0+IFlpZWxkICh4LCBOb25lKSlcbjs7XG5cbmluY2x1ZGUgTW9uYWQuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgIGxldCBiaW5kID0gYmluZFxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgZW5kKVxuXG5sZXQgbnRoIHMgbiA9XG4gIGlmIG4gPCAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgcmVjIGxvb3AgaSBzIG5leHQgPVxuICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBOb25lXG4gICAgICB8IFNraXAgcyAtPiBsb29wIGkgcyBuZXh0XG4gICAgICB8IFlpZWxkIChhLCBzKSAtPiBpZiBwaHlzX2VxdWFsIGkgMCB0aGVuIFNvbWUgYSBlbHNlIGxvb3AgKGkgLSAxKSBzIG5leHRcbiAgICBpblxuICAgIG1hdGNoIHMgd2l0aFxuICAgIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgbiBzIG5leHQpXG47O1xuXG5sZXQgbnRoX2V4biBzIG4gPVxuICBpZiBuIDwgMFxuICB0aGVuIGludmFsaWRfYXJnIFwiU2VxdWVuY2UubnRoXCJcbiAgZWxzZSAoXG4gICAgbWF0Y2ggbnRoIHMgbiB3aXRoXG4gICAgfCBOb25lIC0+IGZhaWx3aXRoIFwiU2VxdWVuY2UubnRoXCJcbiAgICB8IFNvbWUgeCAtPiB4KVxuOztcblxubW9kdWxlIE1lcmdlX3dpdGhfZHVwbGljYXRlc19lbGVtZW50ID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdCA9XG4gICAgfCBMZWZ0IG9mICdhXG4gICAgfCBSaWdodCBvZiAnYlxuICAgIHwgQm90aCBvZiAnYSAqICdiXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgOlxuICAgICdhICdiLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAoJ2IgLT4gJ2IgLT4gaW50KSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gaW50XG4gICAgPVxuICAgIGZ1biBfY21wX19hIF9jbXBfX2IgYV9fMDExXyBiX18wMTJfIC0+XG4gICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDExXyBiX18wMTJfXG4gICAgdGhlbiAwXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBhX18wMTFfLCBiX18wMTJfIHdpdGhcbiAgICAgIHwgTGVmdCBfYV9fMDEzXywgTGVmdCBfYl9fMDE0XyAtPiBfY21wX19hIF9hX18wMTNfIF9iX18wMTRfXG4gICAgICB8IExlZnQgXywgXyAtPiAtMVxuICAgICAgfCBfLCBMZWZ0IF8gLT4gMVxuICAgICAgfCBSaWdodCBfYV9fMDE1XywgUmlnaHQgX2JfXzAxNl8gLT4gX2NtcF9fYiBfYV9fMDE1XyBfYl9fMDE2X1xuICAgICAgfCBSaWdodCBfLCBfIC0+IC0xXG4gICAgICB8IF8sIFJpZ2h0IF8gLT4gMVxuICAgICAgfCBCb3RoIChfYV9fMDE3XywgX2FfXzAxOV8pLCBCb3RoIChfYl9fMDE4XywgX2JfXzAyMF8pIC0+XG4gICAgICAgIChtYXRjaCBfY21wX19hIF9hX18wMTdfIF9iX18wMThfIHdpdGhcbiAgICAgICAgIHwgMCAtPiBfY21wX19iIF9hX18wMTlfIF9iX18wMjBfXG4gICAgICAgICB8IG4gLT4gbikpXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF90XG4gICAgOiB0eXBlIGEgYi5cbiAgICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgICAtPiAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgICAtPiAoYSwgYikgdFxuICAgICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgPVxuICAgIGZ1biBfaGFzaF9mb2xkX2EgX2hhc2hfZm9sZF9iIGhzdiBhcmcgLT5cbiAgICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgICB8IExlZnQgX2EwIC0+XG4gICAgICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDAgaW5cbiAgICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgICBfaGFzaF9mb2xkX2EgaHN2IF9hMFxuICAgICAgfCBSaWdodCBfYTAgLT5cbiAgICAgICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMSBpblxuICAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgIF9oYXNoX2ZvbGRfYiBoc3YgX2EwXG4gICAgICB8IEJvdGggKF9hMCwgX2ExKSAtPlxuICAgICAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAyIGluXG4gICAgICAgIGxldCBoc3YgPVxuICAgICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICAgICBfaGFzaF9mb2xkX2EgaHN2IF9hMFxuICAgICAgICBpblxuICAgICAgICBfaGFzaF9mb2xkX2IgaHN2IF9hMVxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgOlxuICAgICdhICdiLlxuICAgIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpXG4gICAgLT4gKFNleHBsaWIwLlNleHAudCAtPiAnYilcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgPVxuICAgIGZ1biAodHlwZSBhX18wNDRfIGJfXzA0NV8pXG4gICAgICAgIDogICgoU2V4cGxpYjAuU2V4cC50IC0+IGFfXzA0NF8pIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gYl9fMDQ1XylcbiAgICAgICAgICAgIC0+IFNleHBsaWIwLlNleHAudCAtPiAoYV9fMDQ0XywgYl9fMDQ1XykgdCkgLT5cbiAgICAgIGxldCBlcnJvcl9zb3VyY2VfXzAyNV8gPSBcInNlcXVlbmNlLm1sLk1lcmdlX3dpdGhfZHVwbGljYXRlc19lbGVtZW50LnRcIiBpblxuICAgICAgZnVuIF9vZl9hX18wMjFfIF9vZl9iX18wMjJfIC0+IGZ1bmN0aW9uXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJsZWZ0XCIgfCBcIkxlZnRcIikgYXMgX3RhZ19fMDI4XykgOjogc2V4cF9hcmdzX18wMjlfKSBhc1xuICAgICAgICAgIF9zZXhwX18wMjdfIC0+XG4gICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDI5XyB3aXRoXG4gICAgICAgICAgIHwgWyBhcmcwX18wMzBfIF0gLT5cbiAgICAgICAgICAgICBsZXQgcmVzMF9fMDMxXyA9IF9vZl9hX18wMjFfIGFyZzBfXzAzMF8gaW5cbiAgICAgICAgICAgICBMZWZ0IHJlczBfXzAzMV9cbiAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMjVfXG4gICAgICAgICAgICAgICBfdGFnX18wMjhfXG4gICAgICAgICAgICAgICBfc2V4cF9fMDI3XylcbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcInJpZ2h0XCIgfCBcIlJpZ2h0XCIpIGFzIF90YWdfXzAzM18pIDo6IHNleHBfYXJnc19fMDM0XykgYXNcbiAgICAgICAgICBfc2V4cF9fMDMyXyAtPlxuICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAzNF8gd2l0aFxuICAgICAgICAgICB8IFsgYXJnMF9fMDM1XyBdIC0+XG4gICAgICAgICAgICAgbGV0IHJlczBfXzAzNl8gPSBfb2ZfYl9fMDIyXyBhcmcwX18wMzVfIGluXG4gICAgICAgICAgICAgUmlnaHQgcmVzMF9fMDM2X1xuICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAyNV9cbiAgICAgICAgICAgICAgIF90YWdfXzAzM19cbiAgICAgICAgICAgICAgIF9zZXhwX18wMzJfKVxuICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwiYm90aFwiIHwgXCJCb3RoXCIpIGFzIF90YWdfXzAzOF8pIDo6IHNleHBfYXJnc19fMDM5XykgYXNcbiAgICAgICAgICBfc2V4cF9fMDM3XyAtPlxuICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAzOV8gd2l0aFxuICAgICAgICAgICB8IFsgYXJnMF9fMDQwXzsgYXJnMV9fMDQxXyBdIC0+XG4gICAgICAgICAgICAgbGV0IHJlczBfXzA0Ml8gPSBfb2ZfYV9fMDIxXyBhcmcwX18wNDBfXG4gICAgICAgICAgICAgYW5kIHJlczFfXzA0M18gPSBfb2ZfYl9fMDIyXyBhcmcxX18wNDFfIGluXG4gICAgICAgICAgICAgQm90aCAocmVzMF9fMDQyXywgcmVzMV9fMDQzXylcbiAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMjVfXG4gICAgICAgICAgICAgICBfdGFnX18wMzhfXG4gICAgICAgICAgICAgICBfc2V4cF9fMDM3XylcbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibGVmdFwiIHwgXCJMZWZ0XCIpIGFzIHNleHBfXzAyNl8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjZfXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInJpZ2h0XCIgfCBcIlJpZ2h0XCIpIGFzIHNleHBfXzAyNl8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjZfXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImJvdGhcIiB8IFwiQm90aFwiKSBhcyBzZXhwX18wMjZfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI2X1xuICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDI0XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI0X1xuICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMjRfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNF9cbiAgICAgICAgfCBzZXhwX18wMjRfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI0X1xuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOlxuICAgICdhICdiLlxuICAgICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdiIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgPVxuICAgIGZ1biAodHlwZSBhX18wNTZfIGJfXzA1N18pXG4gICAgICAgIDogICgoYV9fMDU2XyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IChiX18wNTdfIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgICAgIC0+IChhX18wNTZfLCBiX18wNTdfKSB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICAgIGZ1biBfb2ZfYV9fMDQ2XyBfb2ZfYl9fMDQ3XyAtPiBmdW5jdGlvblxuICAgICAgICB8IExlZnQgYXJnMF9fMDQ4XyAtPlxuICAgICAgICAgIGxldCByZXMwX18wNDlfID0gX29mX2FfXzA0Nl8gYXJnMF9fMDQ4XyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkxlZnRcIjsgcmVzMF9fMDQ5XyBdXG4gICAgICAgIHwgUmlnaHQgYXJnMF9fMDUwXyAtPlxuICAgICAgICAgIGxldCByZXMwX18wNTFfID0gX29mX2JfXzA0N18gYXJnMF9fMDUwXyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlJpZ2h0XCI7IHJlczBfXzA1MV8gXVxuICAgICAgICB8IEJvdGggKGFyZzBfXzA1Ml8sIGFyZzFfXzA1M18pIC0+XG4gICAgICAgICAgbGV0IHJlczBfXzA1NF8gPSBfb2ZfYV9fMDQ2XyBhcmcwX18wNTJfXG4gICAgICAgICAgYW5kIHJlczFfXzA1NV8gPSBfb2ZfYl9fMDQ3XyBhcmcxX18wNTNfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiQm90aFwiOyByZXMwX18wNTRfOyByZXMxX18wNTVfIF1cbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAgICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gJ2IgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAoJ2EsICdiKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciBfJ2Jfc2V4cF9ncmFtbWFyIC0+XG4gICAgICB7IHVudHlwZWQgPVxuICAgICAgICAgIFZhcmlhbnRcbiAgICAgICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgICAgWyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJMZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIlJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Jfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkJvdGhcIlxuICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXJncyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggXydhX3NleHBfZ3JhbW1hci51bnR5cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgQ29ucyAoXydiX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICB9XG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5sZXQgbWVyZ2Vfd2l0aF9kdXBsaWNhdGVzIChTZXF1ZW5jZSAoczEsIG5leHQxKSkgKFNlcXVlbmNlIChzMiwgbmV4dDIpKSB+Y29tcGFyZSA9XG4gIGxldCB1bnNoYWRvd2VkX2NvbXBhcmUgPSBjb21wYXJlIGluXG4gIGxldCBvcGVuIE1lcmdlX3dpdGhfZHVwbGljYXRlc19lbGVtZW50IGluXG4gIGxldCBuZXh0ID0gZnVuY3Rpb25cbiAgICB8IFNraXAgczEsIHMyIC0+IFNraXAgKG5leHQxIHMxLCBzMilcbiAgICB8IHMxLCBTa2lwIHMyIC0+IFNraXAgKHMxLCBuZXh0MiBzMilcbiAgICB8IChZaWVsZCAoYSwgczEnKSBhcyBzMSksIChZaWVsZCAoYiwgczInKSBhcyBzMikgLT5cbiAgICAgIGxldCBjb21wYXJpc29uID0gdW5zaGFkb3dlZF9jb21wYXJlIGEgYiBpblxuICAgICAgaWYgY29tcGFyaXNvbiA8IDBcbiAgICAgIHRoZW4gWWllbGQgKExlZnQgYSwgKFNraXAgczEnLCBzMikpXG4gICAgICBlbHNlIGlmIGNvbXBhcmlzb24gPSAwXG4gICAgICB0aGVuIFlpZWxkIChCb3RoIChhLCBiKSwgKFNraXAgczEnLCBTa2lwIHMyJykpXG4gICAgICBlbHNlIFlpZWxkIChSaWdodCBiLCAoczEsIFNraXAgczInKSlcbiAgICB8IERvbmUsIERvbmUgLT4gRG9uZVxuICAgIHwgWWllbGQgKGEsIHMxKSwgRG9uZSAtPiBZaWVsZCAoTGVmdCBhLCAoU2tpcCBzMSwgRG9uZSkpXG4gICAgfCBEb25lLCBZaWVsZCAoYiwgczIpIC0+IFlpZWxkIChSaWdodCBiLCAoRG9uZSwgU2tpcCBzMikpXG4gIGluXG4gIFNlcXVlbmNlICgoU2tpcCBzMSwgU2tpcCBzMiksIG5leHQpXG47O1xuXG5sZXQgbWVyZ2VfZGVkdXBlZF9hbmRfc29ydGVkIHMxIHMyIH5jb21wYXJlID1cbiAgbWFwIChtZXJnZV93aXRoX2R1cGxpY2F0ZXMgczEgczIgfmNvbXBhcmUpIH5mOihmdW5jdGlvblxuICAgIHwgTGVmdCB4IHwgUmlnaHQgeCB8IEJvdGggKHgsIF8pIC0+IHgpXG47O1xuXG5sZXQgKG1lcmdlIFtAZGVwcmVjYXRlZFxuICAgICAgIFwiW3NpbmNlIDIwMjEtMDddIEZvciBpZGVudGljYWwgYmVoYXZpb3IsIHVzZSBcXFxuICAgICAgICBbU2VxdWVuY2UubWVyZ2VfZGVkdXBlZF9hbmRfc29ydGVkXSwgYnV0IGNvbnNpZGVyIHVzaW5nIFxcXG4gICAgICAgIFtTZXF1ZW5jZS5tZXJnZV9zb3J0ZWRdIGluc3RlYWQuXCJdKVxuICA9XG4gIG1lcmdlX2RlZHVwZWRfYW5kX3NvcnRlZFxuOztcblxubGV0IG1lcmdlX3NvcnRlZCAoU2VxdWVuY2UgKHMxLCBuZXh0MSkpIChTZXF1ZW5jZSAoczIsIG5leHQyKSkgfmNvbXBhcmUgPVxuICBsZXQgbmV4dCA9IGZ1bmN0aW9uXG4gICAgfCBTa2lwIHMxLCBzMiAtPiBTa2lwIChuZXh0MSBzMSwgczIpXG4gICAgfCBzMSwgU2tpcCBzMiAtPiBTa2lwIChzMSwgbmV4dDIgczIpXG4gICAgfCAoWWllbGQgKGEsIHMxJykgYXMgczEpLCAoWWllbGQgKGIsIHMyJykgYXMgczIpIC0+XG4gICAgICBsZXQgY29tcGFyaXNvbiA9IGNvbXBhcmUgYSBiIGluXG4gICAgICBpZiBjb21wYXJpc29uIDw9IDAgdGhlbiBZaWVsZCAoYSwgKFNraXAgczEnLCBzMikpIGVsc2UgWWllbGQgKGIsIChzMSwgU2tpcCBzMicpKVxuICAgIHwgRG9uZSwgRG9uZSAtPiBEb25lXG4gICAgfCBZaWVsZCAoYSwgczEpLCBEb25lIC0+IFlpZWxkIChhLCAoU2tpcCBzMSwgRG9uZSkpXG4gICAgfCBEb25lLCBZaWVsZCAoYiwgczIpIC0+IFlpZWxkIChiLCAoRG9uZSwgU2tpcCBzMikpXG4gIGluXG4gIFNlcXVlbmNlICgoU2tpcCBzMSwgU2tpcCBzMiksIG5leHQpXG47O1xuXG5sZXQgaGQgcyA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dFxuICAgIHwgWWllbGQgKGEsIF8pIC0+IFNvbWUgYVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG5leHRcbjs7XG5cbmxldCBoZF9leG4gcyA9XG4gIG1hdGNoIGhkIHMgd2l0aFxuICB8IE5vbmUgLT4gZmFpbHdpdGggXCJoZF9leG5cIlxuICB8IFNvbWUgYSAtPiBhXG47O1xuXG5sZXQgdGwgcyA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dFxuICAgIHwgWWllbGQgKF8sIGEpIC0+IFNvbWUgYVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICAobWF0Y2ggbG9vcCBzIG5leHQgd2l0aFxuICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICB8IFNvbWUgcyAtPiBTb21lIChTZXF1ZW5jZSAocywgbmV4dCkpKVxuOztcblxubGV0IHRsX2VhZ2VybHlfZXhuIHMgPVxuICBtYXRjaCB0bCBzIHdpdGhcbiAgfCBOb25lIC0+IGZhaWx3aXRoIFwiU2VxdWVuY2UudGxfZXhuXCJcbiAgfCBTb21lIHMgLT4gc1xuOztcblxubGV0IGxpZnRfaWRlbnRpdHkgbmV4dCBzID1cbiAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgfCBEb25lIC0+IERvbmVcbiAgfCBTa2lwIHMgLT4gU2tpcCAoYElkZW50aXR5IHMpXG4gIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCBgSWRlbnRpdHkgcylcbjs7XG5cbmxldCBuZXh0IHMgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0ID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHRcbiAgICB8IFlpZWxkIChhLCBzKSAtPiBTb21lIChhLCBTZXF1ZW5jZSAocywgbmV4dCkpXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbmV4dFxuOztcblxubGV0IGZpbHRlcl9vcHQgcyA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIHNcbiAgICAgICwgZnVuIHMgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCBzXG4gICAgICAgIHwgWWllbGQgKE5vbmUsIHMpIC0+IFNraXAgc1xuICAgICAgICB8IFlpZWxkIChTb21lIGEsIHMpIC0+IFlpZWxkIChhLCBzKSApXG47O1xuXG5sZXQgZmlsdGVyX21hcCBzIH5mID0gZmlsdGVyX29wdCAobWFwIHMgfmYpXG5sZXQgZmlsdGVyX21hcGkgcyB+ZiA9IGZpbHRlcl9tYXAgKG1hcGkgcyB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biAoaSwgcykgLT4gZiBpIHMpXG5cbmxldCBzcGxpdF9uIHMgbiA9XG4gIGxldCByZWMgbG9vcCBzIGkgYWNjdW0gbmV4dCA9XG4gICAgaWYgaSA8PSAwXG4gICAgdGhlbiBMaXN0LnJldiBhY2N1bSwgU2VxdWVuY2UgKHMsIG5leHQpXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgfCBEb25lIC0+IExpc3QucmV2IGFjY3VtLCBlbXB0eVxuICAgICAgfCBTa2lwIHMgLT4gbG9vcCBzIGkgYWNjdW0gbmV4dFxuICAgICAgfCBZaWVsZCAoYSwgcykgLT4gbG9vcCBzIChpIC0gMSkgKGEgOjogYWNjdW0pIG5leHQpXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbiBbXSBuZXh0XG47O1xuXG5sZXQgY2h1bmtzX2V4biB0IG4gPVxuICBpZiBuIDw9IDBcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcXVlbmNlLmNodW5rc19leG5cIlxuICBlbHNlXG4gICAgdW5mb2xkX3N0ZXAgfmluaXQ6dCB+ZjooZnVuIHQgLT5cbiAgICAgIG1hdGNoIHNwbGl0X24gdCBuIHdpdGhcbiAgICAgIHwgW10sIF9lbXB0eSAtPiBEb25lXG4gICAgICB8IChfIDo6IF8gYXMgeHMpLCB0IC0+IFlpZWxkICh4cywgdCkpXG47O1xuXG5sZXQgZmluZGkgcyB+ZiA9IGZpbmQgKG1hcGkgcyB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biAoaSwgcykgLT4gZiBpIHMpXG5cbmxldCBmaW5kX2V4biBzIH5mID1cbiAgbWF0Y2ggZmluZCBzIH5mIHdpdGhcbiAgfCBOb25lIC0+IGZhaWx3aXRoIFwiU2VxdWVuY2UuZmluZF9leG5cIlxuICB8IFNvbWUgeCAtPiB4XG47O1xuXG5sZXQgYXBwZW5kIHMxIHMyID1cbiAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgfCBTZXF1ZW5jZSAoczEsIG5leHQxKSwgU2VxdWVuY2UgKHMyLCBuZXh0MikgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBgRmlyc3RfbGlzdCBzMVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IGBGaXJzdF9saXN0IHMxIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQxIHMxIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IFNraXAgKGBTZWNvbmRfbGlzdCBzMilcbiAgICAgICAgICAgfCBTa2lwIHMxIC0+IFNraXAgKGBGaXJzdF9saXN0IHMxKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzMSkgLT4gWWllbGQgKGEsIGBGaXJzdF9saXN0IHMxKSlcbiAgICAgICAgfCBgU2Vjb25kX2xpc3QgczIgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dDIgczIgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgczIgLT4gU2tpcCAoYFNlY29uZF9saXN0IHMyKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzMikgLT4gWWllbGQgKGEsIGBTZWNvbmRfbGlzdCBzMikpIClcbjs7XG5cbmxldCBjb25jYXRfbWFwIHMgfmYgPSBiaW5kIHMgfmZcbmxldCBjb25jYXQgcyA9IGNvbmNhdF9tYXAgcyB+ZjpGbi5pZFxubGV0IGNvbmNhdF9tYXBpIHMgfmYgPSBjb25jYXRfbWFwIChtYXBpIHMgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gKGksIHMpIC0+IGYgaSBzKVxuXG5sZXQgemlwIChTZXF1ZW5jZSAoczEsIG5leHQxKSkgKFNlcXVlbmNlIChzMiwgbmV4dDIpKSA9XG4gIGxldCBuZXh0ID0gZnVuY3Rpb25cbiAgICB8IFlpZWxkIChhLCBzMSksIFlpZWxkIChiLCBzMikgLT4gWWllbGQgKChhLCBiKSwgKFNraXAgczEsIFNraXAgczIpKVxuICAgIHwgRG9uZSwgXyB8IF8sIERvbmUgLT4gRG9uZVxuICAgIHwgU2tpcCBzMSwgczIgLT4gU2tpcCAobmV4dDEgczEsIHMyKVxuICAgIHwgczEsIFNraXAgczIgLT4gU2tpcCAoczEsIG5leHQyIHMyKVxuICBpblxuICBTZXF1ZW5jZSAoKFNraXAgczEsIFNraXAgczIpLCBuZXh0KVxuOztcblxubGV0IHppcF9mdWxsIChTZXF1ZW5jZSAoczEsIG5leHQxKSkgKFNlcXVlbmNlIChzMiwgbmV4dDIpKSA9XG4gIGxldCBuZXh0ID0gZnVuY3Rpb25cbiAgICB8IFlpZWxkIChhLCBzMSksIFlpZWxkIChiLCBzMikgLT4gWWllbGQgKGBCb3RoIChhLCBiKSwgKFNraXAgczEsIFNraXAgczIpKVxuICAgIHwgRG9uZSwgRG9uZSAtPiBEb25lXG4gICAgfCBTa2lwIHMxLCBzMiAtPiBTa2lwIChuZXh0MSBzMSwgczIpXG4gICAgfCBzMSwgU2tpcCBzMiAtPiBTa2lwIChzMSwgbmV4dDIgczIpXG4gICAgfCBEb25lLCBZaWVsZCAoYiwgczIpIC0+IFlpZWxkIChgUmlnaHQgYiwgKERvbmUsIG5leHQyIHMyKSlcbiAgICB8IFlpZWxkIChhLCBzMSksIERvbmUgLT4gWWllbGQgKGBMZWZ0IGEsIChuZXh0MSBzMSwgRG9uZSkpXG4gIGluXG4gIFNlcXVlbmNlICgoU2tpcCBzMSwgU2tpcCBzMiksIG5leHQpXG47O1xuXG5sZXQgYm91bmRlZF9sZW5ndGggKFNlcXVlbmNlIChzZWVkLCBuZXh0KSkgfmF0X21vc3QgPVxuICBsZXQgcmVjIGxvb3AgaSBzZWVkIG5leHQgPVxuICAgIGlmIGkgPiBhdF9tb3N0XG4gICAgdGhlbiBgR3JlYXRlclxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBgSXMgaVxuICAgICAgfCBTa2lwIHNlZWQgLT4gbG9vcCBpIHNlZWQgbmV4dFxuICAgICAgfCBZaWVsZCAoXywgc2VlZCkgLT4gbG9vcCAoaSArIDEpIHNlZWQgbmV4dClcbiAgaW5cbiAgbG9vcCAwIHNlZWQgbmV4dFxuOztcblxubGV0IGxlbmd0aF9pc19ib3VuZGVkX2J5ID8obWluID0gLTEpID9tYXggdCA9XG4gIGxldCBsZW5ndGhfaXNfYXRfbGVhc3QgKFNlcXVlbmNlIChzLCBuZXh0KSkgPVxuICAgIGxldCByZWMgbG9vcCBzIGFjYyA9XG4gICAgICBpZiBhY2MgPj0gbWluXG4gICAgICB0aGVuIHRydWVcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gZmFsc2VcbiAgICAgICAgfCBTa2lwIHMgLT4gbG9vcCBzIGFjY1xuICAgICAgICB8IFlpZWxkIChfLCBzKSAtPiBsb29wIHMgKGFjYyArIDEpKVxuICAgIGluXG4gICAgbG9vcCBzIDBcbiAgaW5cbiAgbWF0Y2ggbWF4IHdpdGhcbiAgfCBOb25lIC0+IGxlbmd0aF9pc19hdF9sZWFzdCB0XG4gIHwgU29tZSBtYXggLT5cbiAgICAobWF0Y2ggYm91bmRlZF9sZW5ndGggdCB+YXRfbW9zdDptYXggd2l0aFxuICAgICB8IGBJcyBsZW4gd2hlbiBsZW4gPj0gbWluIC0+IHRydWVcbiAgICAgfCBfIC0+IGZhbHNlKVxuOztcblxubGV0IGl0ZXJpIHMgfmYgPSBpdGVyIChtYXBpIHMgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gKGksIHMpIC0+IGYgaSBzKVxuXG5sZXQgZm9sZGkgcyB+aW5pdCB+ZiA9XG4gIGZvbGQgfmluaXQgKG1hcGkgcyB+ZjooZnVuIGkgcyAtPiBpLCBzKSkgfmY6KGZ1biBhY2MgKGksIHMpIC0+IGYgaSBhY2Mgcylcbjs7XG5cbmxldCByZWR1Y2UgcyB+ZiA9XG4gIG1hdGNoIG5leHQgcyB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSAoYSwgcykgLT4gU29tZSAoZm9sZCBzIH5pbml0OmEgfmYpXG47O1xuXG5sZXQgcmVkdWNlX2V4biBzIH5mID1cbiAgbWF0Y2ggcmVkdWNlIHMgfmYgd2l0aFxuICB8IE5vbmUgLT4gZmFpbHdpdGggXCJTZXF1ZW5jZS5yZWR1Y2VfZXhuXCJcbiAgfCBTb21lIHJlcyAtPiByZXNcbjs7XG5cbmxldCBncm91cCAoU2VxdWVuY2UgKHMsIG5leHQpKSB+YnJlYWsgPVxuICB1bmZvbGRfc3RlcFxuICAgIH5pbml0OihTb21lIChbXSwgcykpXG4gICAgfmY6KGZ1bmN0aW9uXG4gICAgICB8IE5vbmUgLT4gRG9uZVxuICAgICAgfCBTb21lIChhY2MsIHMpIC0+XG4gICAgICAgIChtYXRjaCBhY2MsIG5leHQgcyB3aXRoXG4gICAgICAgICB8IF8sIFNraXAgcyAtPiBTa2lwIChTb21lIChhY2MsIHMpKVxuICAgICAgICAgfCBbXSwgRG9uZSAtPiBEb25lXG4gICAgICAgICB8IGFjYywgRG9uZSAtPiBZaWVsZCAoTGlzdC5yZXYgYWNjLCBOb25lKVxuICAgICAgICAgfCBbXSwgWWllbGQgKGN1ciwgcykgLT4gU2tpcCAoU29tZSAoWyBjdXIgXSwgcykpXG4gICAgICAgICB8IChwcmV2IDo6IF8gYXMgYWNjKSwgWWllbGQgKGN1ciwgcykgLT5cbiAgICAgICAgICAgaWYgYnJlYWsgcHJldiBjdXJcbiAgICAgICAgICAgdGhlbiBZaWVsZCAoTGlzdC5yZXYgYWNjLCBTb21lIChbIGN1ciBdLCBzKSlcbiAgICAgICAgICAgZWxzZSBTa2lwIChTb21lIChjdXIgOjogYWNjLCBzKSkpKVxuOztcblxubGV0IGZpbmRfY29uc2VjdXRpdmVfZHVwbGljYXRlIChTZXF1ZW5jZSAocywgbmV4dCkpIH5lcXVhbCA9XG4gIGxldCByZWMgbG9vcCBsYXN0X2VsdCBzID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBsYXN0X2VsdCBzXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIChtYXRjaCBsYXN0X2VsdCB3aXRoXG4gICAgICAgfCBTb21lIGIgd2hlbiBlcXVhbCBhIGIgLT4gU29tZSAoYiwgYSlcbiAgICAgICB8IE5vbmUgfCBTb21lIF8gLT4gbG9vcCAoU29tZSBhKSBzKVxuICBpblxuICBsb29wIE5vbmUgc1xuOztcblxubGV0IHJlbW92ZV9jb25zZWN1dGl2ZV9kdXBsaWNhdGVzIHMgfmVxdWFsID1cbiAgdW5mb2xkX3dpdGggcyB+aW5pdDpOb25lIH5mOihmdW4gcHJldiBhIC0+XG4gICAgbWF0Y2ggcHJldiB3aXRoXG4gICAgfCBTb21lIGIgd2hlbiBlcXVhbCBhIGIgLT4gU2tpcCAoU29tZSBhKVxuICAgIHwgTm9uZSB8IFNvbWUgXyAtPiBZaWVsZCAoYSwgU29tZSBhKSlcbjs7XG5cbmxldCBjb3VudCBzIH5mID0gbGVuZ3RoIChmaWx0ZXIgcyB+ZilcbmxldCBjb3VudGkgdCB+ZiA9IGxlbmd0aCAoZmlsdGVyaSB0IH5mKVxubGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxubGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbmxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5cbmxldCBpbml0IG4gfmYgPVxuICB1bmZvbGRfc3RlcCB+aW5pdDowIH5mOihmdW4gaSAtPiBpZiBpID49IG4gdGhlbiBEb25lIGVsc2UgWWllbGQgKGYgaSwgaSArIDEpKVxuOztcblxubGV0IHN1YiBzIH5wb3MgfmxlbiA9XG4gIGlmIHBvcyA8IDAgfHwgbGVuIDwgMCB0aGVuIGZhaWx3aXRoIFwiU2VxdWVuY2Uuc3ViXCI7XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoICgwLCBzKVxuICAgICAgLCBmdW4gKGksIHMpIC0+XG4gICAgICAgIGlmIGkgLSBwb3MgPj0gbGVuXG4gICAgICAgIHRoZW4gRG9uZVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoaSwgcylcbiAgICAgICAgICB8IFlpZWxkIChhLCBzKSB3aGVuIGkgPj0gcG9zIC0+IFlpZWxkIChhLCAoaSArIDEsIHMpKVxuICAgICAgICAgIHwgWWllbGQgKF8sIHMpIC0+IFNraXAgKGkgKyAxLCBzKSkgKVxuOztcblxubGV0IHRha2UgcyBsZW4gPVxuICBpZiBsZW4gPCAwIHRoZW4gZmFpbHdpdGggXCJTZXF1ZW5jZS50YWtlXCI7XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoICgwLCBzKVxuICAgICAgLCBmdW4gKGksIHMpIC0+XG4gICAgICAgIGlmIGkgPj0gbGVuXG4gICAgICAgIHRoZW4gRG9uZVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoaSwgcylcbiAgICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgKGkgKyAxLCBzKSkpIClcbjs7XG5cbmxldCBkcm9wIHMgbGVuID1cbiAgaWYgbGVuIDwgMCB0aGVuIGZhaWx3aXRoIFwiU2VxdWVuY2UuZHJvcFwiO1xuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCAoMCwgcylcbiAgICAgICwgZnVuIChpLCBzKSAtPlxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChpLCBzKVxuICAgICAgICB8IFlpZWxkIChhLCBzKSB3aGVuIGkgPj0gbGVuIC0+IFlpZWxkIChhLCAoaSArIDEsIHMpKVxuICAgICAgICB8IFlpZWxkIChfLCBzKSAtPiBTa2lwIChpICsgMSwgcykgKVxuOztcblxubGV0IHRha2Vfd2hpbGUgcyB+ZiA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIHNcbiAgICAgICwgZnVuIHMgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCBzXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIHdoZW4gZiBhIC0+IFlpZWxkIChhLCBzKVxuICAgICAgICB8IFlpZWxkIChfLCBfKSAtPiBEb25lIClcbjs7XG5cbmxldCBkcm9wX3doaWxlIHMgfmYgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBgRHJvcHBpbmcgc1xuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IGBEcm9wcGluZyBzIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGBEcm9wcGluZyBzKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzKSB3aGVuIGYgYSAtPiBTa2lwIChgRHJvcHBpbmcgcylcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIGBJZGVudGl0eSBzKSlcbiAgICAgICAgfCBgSWRlbnRpdHkgcyAtPiBsaWZ0X2lkZW50aXR5IG5leHQgcyApXG47O1xuXG5sZXQgc2hpZnRfcmlnaHQgcyB4ID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggYENvbnNpbmcgKHNlZWQsIHgpXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgYENvbnNpbmcgKHNlZWQsIHgpIC0+IFlpZWxkICh4LCBgSWRlbnRpdHkgc2VlZClcbiAgICAgICAgfCBgSWRlbnRpdHkgcyAtPiBsaWZ0X2lkZW50aXR5IG5leHQgcyApXG47O1xuXG5sZXQgc2hpZnRfcmlnaHRfd2l0aF9saXN0IHMgbCA9IGFwcGVuZCAob2ZfbGlzdCBsKSBzXG5sZXQgc2hpZnRfbGVmdCA9IGRyb3BcblxubW9kdWxlIEluZml4ID0gc3RydWN0XG4gIGxldCAoIEAgKSA9IGFwcGVuZFxuZW5kXG5cbmxldCBpbnRlcnNwZXJzZSBzIH5zZXAgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBgSW5pdCBzXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgYEluaXQgcyAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChgSW5pdCBzKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgYFJ1bm5pbmcgcykpXG4gICAgICAgIHwgYFJ1bm5pbmcgcyAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChgUnVubmluZyBzKVxuICAgICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoc2VwLCBgUHV0dGluZyAoYSwgcykpKVxuICAgICAgICB8IGBQdXR0aW5nIChhLCBzKSAtPiBZaWVsZCAoYSwgYFJ1bm5pbmcgcykgKVxuOztcblxubGV0IHJlcGVhdCB4ID0gdW5mb2xkX3N0ZXAgfmluaXQ6eCB+ZjooZnVuIHggLT4gWWllbGQgKHgsIHgpKVxuXG5sZXQgY3ljbGVfbGlzdF9leG4geHMgPVxuICBpZiBMaXN0LmlzX2VtcHR5IHhzIHRoZW4gaW52YWxpZF9hcmcgXCJTZXF1ZW5jZS5jeWNsZV9saXN0X2V4blwiO1xuICBsZXQgcyA9IG9mX2xpc3QgeHMgaW5cbiAgY29uY2F0X21hcCB+ZjooZnVuICgpIC0+IHMpIChyZXBlYXQgKCkpXG47O1xuXG5sZXQgY2FydGVzaWFuX3Byb2R1Y3Qgc2Egc2IgPSBjb25jYXRfbWFwIHNhIH5mOihmdW4gYSAtPiB6aXAgKHJlcGVhdCBhKSBzYilcbmxldCBzaW5nbGV0b24geCA9IHJldHVybiB4XG5cbmxldCBkZWxheWVkX2ZvbGQgcyB+aW5pdCB+ZiB+ZmluaXNoID1cbiAgRXhwZXJ0LmRlbGF5ZWRfZm9sZF9zdGVwIHMgfmluaXQgfmZpbmlzaCB+ZjooZnVuIGFjYyBvcHRpb24gfmsgLT5cbiAgICBtYXRjaCBvcHRpb24gd2l0aFxuICAgIHwgTm9uZSAtPiBrIGFjY1xuICAgIHwgU29tZSBhIC0+IGYgYWNjIGEgfmspXG47O1xuXG5sZXQgZm9sZF9tIH5iaW5kIH5yZXR1cm4gdCB+aW5pdCB+ZiA9XG4gIEV4cGVydC5kZWxheWVkX2ZvbGRfc3RlcFxuICAgIHRcbiAgICB+aW5pdFxuICAgIH5mOihmdW4gYWNjIG9wdGlvbiB+ayAtPlxuICAgICAgbWF0Y2ggb3B0aW9uIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBiaW5kIChyZXR1cm4gYWNjKSB+ZjprXG4gICAgICB8IFNvbWUgYSAtPiBiaW5kIChmIGFjYyBhKSB+ZjprKVxuICAgIH5maW5pc2g6cmV0dXJuXG47O1xuXG5sZXQgaXRlcl9tIH5iaW5kIH5yZXR1cm4gdCB+ZiA9XG4gIEV4cGVydC5kZWxheWVkX2ZvbGRfc3RlcFxuICAgIHRcbiAgICB+aW5pdDooKVxuICAgIH5mOihmdW4gKCkgb3B0aW9uIH5rIC0+XG4gICAgICBtYXRjaCBvcHRpb24gd2l0aFxuICAgICAgfCBOb25lIC0+IGJpbmQgKHJldHVybiAoKSkgfmY6a1xuICAgICAgfCBTb21lIGEgLT4gYmluZCAoZiBhKSB+ZjprKVxuICAgIH5maW5pc2g6cmV0dXJuXG47O1xuXG5sZXQgZm9sZF91bnRpbCBzIH5pbml0IH5mIH5maW5pc2ggPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgYWNjID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBmaW5pc2ggYWNjXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZiBhY2NcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgKG1hdGNoIChmIGFjYyBhIDogKCdhLCAnYikgQ29udGludWVfb3Jfc3RvcC50KSB3aXRoXG4gICAgICAgfCBTdG9wIHggLT4geFxuICAgICAgIHwgQ29udGludWUgYWNjIC0+IGxvb3AgcyBuZXh0IGYgYWNjKVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG5leHQgZiBpbml0XG47O1xuXG5sZXQgZm9sZF9yZXN1bHQgcyB+aW5pdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiBhY2MgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IFJlc3VsdC5yZXR1cm4gYWNjXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHQgZiBhY2NcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgKG1hdGNoIChmIGFjYyBhIDogKF8sIF8pIFJlc3VsdC50KSB3aXRoXG4gICAgICAgfCBFcnJvciBfIGFzIGUgLT4gZVxuICAgICAgIHwgT2sgYWNjIC0+IGxvb3AgcyBuZXh0IGYgYWNjKVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG5leHQgZiBpbml0XG47O1xuXG5sZXQgZm9yY2VfZWFnZXJseSB0ID0gb2ZfbGlzdCAodG9fbGlzdCB0KVxuXG5sZXQgbWVtb2l6ZSAodHlwZSBhKSAoU2VxdWVuY2UgKHMsIG5leHQpKSA9XG4gIGxldCBtb2R1bGUgTSA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IFQgb2YgKGEsIHQpIFN0ZXAudCBMYXp5LnRcbiAgZW5kXG4gIGluXG4gIGxldCByZWMgbWVtb2l6ZSBzID0gTS5UIChsYXp5IChmaW5kX3N0ZXAgcykpXG4gIGFuZCBmaW5kX3N0ZXAgcyA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gRG9uZVxuICAgIHwgU2tpcCBzIC0+IGZpbmRfc3RlcCBzXG4gICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIG1lbW9pemUgcylcbiAgaW5cbiAgU2VxdWVuY2UgKG1lbW9pemUgcywgZnVuIChNLlQgbCkgLT4gTGF6eS5mb3JjZSBsKVxuOztcblxubGV0IGRyb3BfZWFnZXJseSBzIGxlbiA9XG4gIGxldCByZWMgbG9vcCBpIH5sZW4gcyBuZXh0ID1cbiAgICBpZiBpID49IGxlblxuICAgIHRoZW4gU2VxdWVuY2UgKHMsIG5leHQpXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgfCBEb25lIC0+IGVtcHR5XG4gICAgICB8IFNraXAgcyAtPiBsb29wIGkgfmxlbiBzIG5leHRcbiAgICAgIHwgWWllbGQgKF8sIHMpIC0+IGxvb3AgKGkgKyAxKSB+bGVuIHMgbmV4dClcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgMCB+bGVuIHMgbmV4dFxuOztcblxubGV0IGRyb3Bfd2hpbGVfb3B0aW9uIChTZXF1ZW5jZSAocywgbmV4dCkpIH5mID1cbiAgbGV0IHJlYyBsb29wIHMgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFNraXAgcyAtPiBsb29wIHNcbiAgICB8IFlpZWxkICh4LCBzKSAtPiBpZiBmIHggdGhlbiBsb29wIHMgZWxzZSBTb21lICh4LCBTZXF1ZW5jZSAocywgbmV4dCkpXG4gIGluXG4gIGxvb3Agc1xuOztcblxubGV0IGNvbXBhcmUgY29tcGFyZV9hIHQxIHQyID1cbiAgV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciAoemlwX2Z1bGwgdDEgdDIpIH5mOihmdW5jdGlvblxuICAgICAgfCBgTGVmdCBfIC0+IHIucmV0dXJuIDFcbiAgICAgIHwgYFJpZ2h0IF8gLT4gci5yZXR1cm4gKC0xKVxuICAgICAgfCBgQm90aCAodjEsIHYyKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfYSB2MSB2MiBpblxuICAgICAgICBpZiBjIDw+IDAgdGhlbiByLnJldHVybiBjKTtcbiAgICAwKVxuOztcblxubGV0IGVxdWFsIGVxdWFsX2EgdDEgdDIgPVxuICBmb3JfYWxsICh6aXBfZnVsbCB0MSB0MikgfmY6KGZ1bmN0aW9uXG4gICAgfCBgQm90aCAoYTEsIGEyKSAtPiBlcXVhbF9hIGExIGEyXG4gICAgfCBgTGVmdCBfIHwgYFJpZ2h0IF8gLT4gZmFsc2UpXG47O1xuXG5sZXQgcm91bmRfcm9iaW4gbGlzdCA9XG4gIGxldCBuZXh0ICh0b2RvX3N0YWNrLCBkb25lX3N0YWNrKSA9XG4gICAgbWF0Y2ggdG9kb19zdGFjayB3aXRoXG4gICAgfCBTZXF1ZW5jZSAocywgZikgOjogdG9kb19zdGFjayAtPlxuICAgICAgKG1hdGNoIGYgcyB3aXRoXG4gICAgICAgfCBZaWVsZCAoeCwgcykgLT4gWWllbGQgKHgsICh0b2RvX3N0YWNrLCBTZXF1ZW5jZSAocywgZikgOjogZG9uZV9zdGFjaykpXG4gICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoU2VxdWVuY2UgKHMsIGYpIDo6IHRvZG9fc3RhY2ssIGRvbmVfc3RhY2spXG4gICAgICAgfCBEb25lIC0+IFNraXAgKHRvZG9fc3RhY2ssIGRvbmVfc3RhY2spKVxuICAgIHwgW10gLT4gaWYgTGlzdC5pc19lbXB0eSBkb25lX3N0YWNrIHRoZW4gRG9uZSBlbHNlIFNraXAgKExpc3QucmV2IGRvbmVfc3RhY2ssIFtdKVxuICBpblxuICBsZXQgc3RhdGUgPSBsaXN0LCBbXSBpblxuICBTZXF1ZW5jZSAoc3RhdGUsIG5leHQpXG47O1xuXG5sZXQgaW50ZXJsZWF2ZSAoU2VxdWVuY2UgKHMxLCBmMSkpID1cbiAgbGV0IG5leHQgKHRvZG9fc3RhY2ssIGRvbmVfc3RhY2ssIHMxKSA9XG4gICAgbWF0Y2ggdG9kb19zdGFjayB3aXRoXG4gICAgfCBTZXF1ZW5jZSAoczIsIGYyKSA6OiB0b2RvX3N0YWNrIC0+XG4gICAgICAobWF0Y2ggZjIgczIgd2l0aFxuICAgICAgIHwgWWllbGQgKHgsIHMyKSAtPiBZaWVsZCAoeCwgKHRvZG9fc3RhY2ssIFNlcXVlbmNlIChzMiwgZjIpIDo6IGRvbmVfc3RhY2ssIHMxKSlcbiAgICAgICB8IFNraXAgczIgLT4gU2tpcCAodG9kb19zdGFjaywgU2VxdWVuY2UgKHMyLCBmMikgOjogZG9uZV9zdGFjaywgczEpXG4gICAgICAgfCBEb25lIC0+IFNraXAgKHRvZG9fc3RhY2ssIGRvbmVfc3RhY2ssIHMxKSlcbiAgICB8IFtdIC0+XG4gICAgICAobWF0Y2ggZjEgczEsIGRvbmVfc3RhY2sgd2l0aFxuICAgICAgIHwgWWllbGQgKHQsIHMxKSwgXyAtPiBTa2lwIChMaXN0LnJldiAodCA6OiBkb25lX3N0YWNrKSwgW10sIHMxKVxuICAgICAgIHwgU2tpcCBzMSwgXyAtPiBTa2lwIChMaXN0LnJldiBkb25lX3N0YWNrLCBbXSwgczEpXG4gICAgICAgfCBEb25lLCBfIDo6IF8gLT4gU2tpcCAoTGlzdC5yZXYgZG9uZV9zdGFjaywgW10sIHMxKVxuICAgICAgIHwgRG9uZSwgW10gLT4gRG9uZSlcbiAgaW5cbiAgbGV0IHN0YXRlID0gW10sIFtdLCBzMSBpblxuICBTZXF1ZW5jZSAoc3RhdGUsIG5leHQpXG47O1xuXG5sZXQgaW50ZXJsZWF2ZWRfY2FydGVzaWFuX3Byb2R1Y3QgczEgczIgPVxuICBtYXAgczEgfmY6KGZ1biB4MSAtPiBtYXAgczIgfmY6KGZ1biB4MiAtPiB4MSwgeDIpKSB8PiBpbnRlcmxlYXZlXG47O1xuXG5sZXQgb2Zfc2VxIChzZXEgOiBfIENhbWwuU2VxLnQpID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQ6c2VxIH5mOihmdW4gc2VxIC0+XG4gICAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiBEb25lXG4gICAgfCBDb25zIChoZCwgdGwpIC0+IFlpZWxkIChoZCwgdGwpKVxuOztcblxubGV0IHRvX3NlcSAoU2VxdWVuY2UgKHN0YXRlLCBuZXh0KSkgPVxuICBsZXQgcmVjIGxvb3Agc3RhdGUgPVxuICAgIG1hdGNoIG5leHQgc3RhdGUgd2l0aFxuICAgIHwgRG9uZSAtPiBDYW1sLlNlcS5OaWxcbiAgICB8IFNraXAgc3RhdGUgLT4gbG9vcCBzdGF0ZVxuICAgIHwgWWllbGQgKGhkLCBzdGF0ZSkgLT4gQ2FtbC5TZXEuQ29ucyAoaGQsIGZ1biAoKSAtPiBsb29wIHN0YXRlKVxuICBpblxuICBmdW4gKCkgLT4gbG9vcCBzdGF0ZVxuOztcblxubW9kdWxlIEdlbmVyYXRvciA9IHN0cnVjdFxuICB0eXBlICdlbHQgc3RlcHMgPSBXcmFwIG9mICgnZWx0LCB1bml0IC0+ICdlbHQgc3RlcHMpIFN0ZXAudFxuXG4gIGxldCB1bndyYXAgKFdyYXAgc3RlcCkgPSBzdGVwXG5cbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICB0eXBlICgnYSwgJ2VsdCkgdCA9ICgnYSAtPiAnZWx0IHN0ZXBzKSAtPiAnZWx0IHN0ZXBzXG5cbiAgICBsZXQgcmV0dXJuIHggayA9IGsgeFxuXG4gICAgbGV0IGJpbmQgbSB+ZiBrID1cbiAgICAgIG0gKGZ1biBhIC0+XG4gICAgICAgIGxldCBtJyA9IGYgYSBpblxuICAgICAgICBtJyBrKVxuICAgIDs7XG5cbiAgICBsZXQgbWFwIG0gfmYgayA9IG0gKGZ1biBhIC0+IGsgKGYgYSkpXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gIGVuZFxuXG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIE1vbmFkLk1ha2UyIChUKVxuXG4gIGxldCB5aWVsZCBlIGsgPSBXcmFwIChZaWVsZCAoZSwgaykpXG4gIGxldCB0b19zdGVwcyB0ID0gdCAoZnVuICgpIC0+IFdyYXAgRG9uZSlcblxuICBsZXQgb2Zfc2VxdWVuY2Ugc2VxdWVuY2UgPVxuICAgIGRlbGF5ZWRfZm9sZFxuICAgICAgc2VxdWVuY2VcbiAgICAgIH5pbml0OigpXG4gICAgICB+ZjooZnVuICgpIHggfmsgZiAtPiBXcmFwIChZaWVsZCAoeCwgZnVuICgpIC0+IGsgKCkgZikpKVxuICAgICAgfmZpbmlzaDpyZXR1cm5cbiAgOztcblxuICBsZXQgcnVuIHQgPVxuICAgIGxldCBpbml0ICgpID0gdG9fc3RlcHMgdCBpblxuICAgIGxldCBmIHRodW5rID0gdW53cmFwICh0aHVuayAoKSkgaW5cbiAgICB1bmZvbGRfc3RlcCB+aW5pdCB+ZlxuICA7O1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQXJyYXkwXG5cbnR5cGUgJ2EgdCA9ICdhIGFycmF5IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPSBjb21wYXJlX2FycmF5XG5sZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID0gYXJyYXlfb2Zfc2V4cFxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9IHNleHBfb2ZfYXJyYXlcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gYXJyYXlfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbjs7XG5cbltAQEBlbmRdXG5cbigqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBuZXcgaW4tcGxhY2UsIGNvbnN0YW50IGhlYXAgc29ydGluZyBhbGdvcml0aG0gdG8gcmVwbGFjZSB0aGVcbiAgIG9uZSB1c2VkIGJ5IHRoZSBzdGFuZGFyZCBsaWJyYXJpZXMuICBJdHMgb25seSBwdXJwb3NlIGlzIHRvIGJlIGZhc3RlciAoaG9wZWZ1bGx5XG4gICBzdHJpY3RseSBmYXN0ZXIpIHRoYW4gdGhlIGJhc2Ugc29ydCBhbmQgc3RhYmxlX3NvcnQuXG5cbiAgIEF0IGEgaGlnaCBsZXZlbCB0aGUgYWxnb3JpdGhtIGlzOlxuICAgLSBwaWNrIHR3byBwaXZvdCBwb2ludHMgYnk6XG4gICAtIHBpY2sgNSBhcmJpdHJhcnkgZWxlbWVudHMgZnJvbSB0aGUgYXJyYXlcbiAgIC0gc29ydCB0aGVtIHdpdGhpbiB0aGUgYXJyYXlcbiAgIC0gdGFrZSB0aGUgZWxlbWVudHMgb24gZWl0aGVyIHNpZGUgb2YgdGhlIG1pZGRsZSBlbGVtZW50IG9mIHRoZSBzb3J0IGFzIHRoZSBwaXZvdHNcbiAgIC0gc29ydCB0aGUgYXJyYXkgd2l0aDpcbiAgIC0gYWxsIGVsZW1lbnRzIGxlc3MgdGhhbiBwaXZvdDEgdG8gdGhlIGxlZnQgKHJhbmdlIDEpXG4gICAtIGFsbCBlbGVtZW50cyA+PSBwaXZvdDEgYW5kIDw9IHBpdm90MiBpbiB0aGUgbWlkZGxlIChyYW5nZSAyKVxuICAgLSBhbGwgZWxlbWVudHMgPiBwaXZvdDIgdG8gdGhlIHJpZ2h0IChyYW5nZSAzKVxuICAgLSBpZiBwaXZvdDEgYW5kIHBpdm90MiBhcmUgZXF1YWwsIHRoZW4gdGhlIG1pZGRsZSByYW5nZSBpcyBzb3J0ZWQsIHNvIGlnbm9yZSBpdFxuICAgLSByZWN1cnNlIGludG8gcmFuZ2UgMSwgMiAoaWYgcGl2b3QxIGFuZCBwaXZvdDIgYXJlIHVuZXF1YWwpLCBhbmQgM1xuICAgLSBkdXJpbmcgcmVjdXJzaW9uIHRoZXJlIGFyZSB0d28gaW5mbGVjdGlvbiBwb2ludHM6XG4gICAtIGlmIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHJhbmdlIGlzIHNtYWxsLCB1c2UgaW5zZXJ0aW9uIHNvcnQgdG8gc29ydCBpdFxuICAgLSBpZiB0aGUgc3RhY2sgZGVwdGggaXMgbGFyZ2UsIHNvcnQgdGhlIHJhbmdlIHdpdGggaGVhcC1zb3J0IHRvIGF2b2lkIG5eMiB3b3JzdC1jYXNlXG4gICAgIGJlaGF2aW9yXG5cbiAgIFNlZSB0aGUgZm9sbG93aW5nIGZvciBtb3JlIGluZm9ybWF0aW9uOlxuICAgLSBcIkR1YWwtUGl2b3QgUXVpY2tzb3J0XCIgYnkgVmxhZGltaXIgWWFyb3NsYXZza2l5LlxuICAgICBBdmFpbGFibGUgYXRcbiAgICAgaHR0cDovL3d3dy5rcmljaGUuY29tLmFyL3Jvb3QvcHJvZ3JhbW1pbmcvc3BhY2VUaW1lQ29tcGxleGl0eS9EdWFsUGl2b3RRdWlja3NvcnQucGRmXG4gICAtIFwiUXVpY2tzb3J0IGlzIE9wdGltYWxcIiBieSBTZWRnZXdpY2sgYW5kIEJlbnRsZXkuXG4gICAgIFNsaWRlcyBhdCBodHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfnJzL3RhbGtzL1F1aWNrc29ydElzT3B0aW1hbC5wZGZcbiAgIC0gaHR0cDovL3d3dy5zb3J0aW5nLWFsZ29yaXRobXMuY29tL3F1aWNrLXNvcnQtMy13YXkgKilcblxubW9kdWxlIFNvcnQgPSBzdHJ1Y3RcbiAgKCogRm9yIHRoZSBzYWtlIG9mIHNwZWVkIHdlIGNvdWxkIHVzZSB1bnNhZmUgZ2V0L3NldCB0aHJvdWdob3V0LCBidXQgc3BlZWQgdGVzdHMgZG9uJ3RcbiAgICAgc2hvdyBhIHNpZ25pZmljYW50IGltcHJvdmVtZW50LiAqKVxuICBsZXQgZ2V0ID0gZ2V0XG4gIGxldCBzZXQgPSBzZXRcblxuICBsZXQgc3dhcCBhcnIgaSBqID1cbiAgICBsZXQgdG1wID0gZ2V0IGFyciBpIGluXG4gICAgc2V0IGFyciBpIChnZXQgYXJyIGopO1xuICAgIHNldCBhcnIgaiB0bXBcbiAgOztcblxuICBtb2R1bGUgdHlwZSBTb3J0ID0gc2lnXG4gICAgdmFsIHNvcnRcbiAgICAgIDogICdhIHRcbiAgICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludClcbiAgICAgIC0+IGxlZnQ6aW50ICgqIGxlZnRtb3N0IGluZGV4IG9mIHN1Yi1hcnJheSB0byBzb3J0ICopXG4gICAgICAtPiByaWdodDppbnQgKCogcmlnaHRtb3N0IGluZGV4IG9mIHN1Yi1hcnJheSB0byBzb3J0ICopXG4gICAgICAtPiB1bml0XG4gIGVuZFxuXG4gICgqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW5zZXJ0aW9uX3NvcnQgKilcbiAgbW9kdWxlIEluc2VydGlvbl9zb3J0IDogU29ydCA9IHN0cnVjdFxuICAgIGxldCBzb3J0IGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgKCogbG9vcCBpbnZhcmlhbnQ6XG4gICAgICAgICBbYXJyXSBpcyBzb3J0ZWQgZnJvbSBbbGVmdF0gdG8gW3BvcyAtIDFdLCBpbmNsdXNpdmUgKilcbiAgICAgIGZvciBwb3MgPSBsZWZ0ICsgMSB0byByaWdodCBkb1xuICAgICAgICAoKiBsb29wIGludmFyaWFudHM6XG4gICAgICAgICAgIDEuICB0aGUgc3ViYXJyYXkgYXJyW2xlZnQgLi4gaS0xXSBpcyBzb3J0ZWRcbiAgICAgICAgICAgMi4gIHRoZSBzdWJhcnJheSBhcnJbaSsxIC4uIHBvc10gaXMgc29ydGVkIGFuZCBjb250YWlucyBvbmx5IGVsZW1lbnRzID4gdlxuICAgICAgICAgICAzLiAgYXJyW2ldIG1heSBiZSB0aG91Z2h0IG9mIGFzIGNvbnRhaW5pbmcgdlxuXG4gICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFsbG9jYXRlIGEgY2xvc3VyZSwgYnV0IGlzIGxlZnQgaW4gdGhlIGZvclxuICAgICAgICAgICBsb29wIGZvciB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIGRvY3VtZW50YXRpb24uICopXG4gICAgICAgIGxldCByZWMgbG9vcCBhcnIgfmxlZnQgfmNvbXBhcmUgaSB2ID1cbiAgICAgICAgICBsZXQgaV9uZXh0ID0gaSAtIDEgaW5cbiAgICAgICAgICBpZiBpX25leHQgPj0gbGVmdCAmJiBjb21wYXJlIChnZXQgYXJyIGlfbmV4dCkgdiA+IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIHNldCBhcnIgaSAoZ2V0IGFyciBpX25leHQpO1xuICAgICAgICAgICAgbG9vcCBhcnIgfmxlZnQgfmNvbXBhcmUgaV9uZXh0IHYpXG4gICAgICAgICAgZWxzZSBpXG4gICAgICAgIGluXG4gICAgICAgIGxldCB2ID0gZ2V0IGFyciBwb3MgaW5cbiAgICAgICAgbGV0IGZpbmFsX3BvcyA9IGxvb3AgYXJyIH5sZWZ0IH5jb21wYXJlIHBvcyB2IGluXG4gICAgICAgIHNldCBhcnIgZmluYWxfcG9zIHZcbiAgICAgIGRvbmVcbiAgICA7O1xuICBlbmRcblxuICAoKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hlYXBzb3J0ICopXG4gIG1vZHVsZSBIZWFwX3NvcnQgOiBTb3J0ID0gc3RydWN0XG4gICAgKCogbG9vcCBpbnZhcmlhbnQ6XG4gICAgICAgcm9vdCdzIGNoaWxkcmVuIGFyZSBib3RoIGVpdGhlciByb290cyBvZiBtYXgtaGVhcHMgb3IgPiByaWdodCAqKVxuICAgIGxldCByZWMgaGVhcGlmeSBhcnIgfmNvbXBhcmUgcm9vdCB+bGVmdCB+cmlnaHQgPVxuICAgICAgbGV0IHJlbGF0aXZlX3Jvb3QgPSByb290IC0gbGVmdCBpblxuICAgICAgbGV0IGxlZnRfY2hpbGQgPSAoMiAqIHJlbGF0aXZlX3Jvb3QpICsgbGVmdCArIDEgaW5cbiAgICAgIGxldCByaWdodF9jaGlsZCA9ICgyICogcmVsYXRpdmVfcm9vdCkgKyBsZWZ0ICsgMiBpblxuICAgICAgbGV0IGxhcmdlc3QgPVxuICAgICAgICBpZiBsZWZ0X2NoaWxkIDw9IHJpZ2h0ICYmIGNvbXBhcmUgKGdldCBhcnIgbGVmdF9jaGlsZCkgKGdldCBhcnIgcm9vdCkgPiAwXG4gICAgICAgIHRoZW4gbGVmdF9jaGlsZFxuICAgICAgICBlbHNlIHJvb3RcbiAgICAgIGluXG4gICAgICBsZXQgbGFyZ2VzdCA9XG4gICAgICAgIGlmIHJpZ2h0X2NoaWxkIDw9IHJpZ2h0ICYmIGNvbXBhcmUgKGdldCBhcnIgcmlnaHRfY2hpbGQpIChnZXQgYXJyIGxhcmdlc3QpID4gMFxuICAgICAgICB0aGVuIHJpZ2h0X2NoaWxkXG4gICAgICAgIGVsc2UgbGFyZ2VzdFxuICAgICAgaW5cbiAgICAgIGlmIGxhcmdlc3QgPD4gcm9vdFxuICAgICAgdGhlbiAoXG4gICAgICAgIHN3YXAgYXJyIHJvb3QgbGFyZ2VzdDtcbiAgICAgICAgaGVhcGlmeSBhcnIgfmNvbXBhcmUgbGFyZ2VzdCB+bGVmdCB+cmlnaHQpXG4gICAgOztcblxuICAgIGxldCBidWlsZF9oZWFwIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgKCogRWxlbWVudHMgaW4gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBhcnJheSBhcmUgYWxyZWFkeSBoZWFwcyBvZiBzaXplIDEuICBXZSBtb3ZlXG4gICAgICAgICB0aHJvdWdoIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBhcnJheSBmcm9tIGJhY2sgdG8gZnJvbnQgZXhhbWluaW5nIHRoZSBlbGVtZW50IGF0XG4gICAgICAgICBoYW5kLCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoaWxkcmVuLCBmaXhpbmcgdGhlIGhlYXAgcHJvcGVydHkgYXMgd2UgZ28uICopXG4gICAgICBmb3IgaSA9IChsZWZ0ICsgcmlnaHQpIC8gMiBkb3dudG8gbGVmdCBkb1xuICAgICAgICBoZWFwaWZ5IGFyciB+Y29tcGFyZSBpIH5sZWZ0IH5yaWdodFxuICAgICAgZG9uZVxuICAgIDs7XG5cbiAgICBsZXQgc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGJ1aWxkX2hlYXAgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodDtcbiAgICAgICgqIGxvb3AgaW52YXJpYW50czpcbiAgICAgICAgIDEuICB0aGUgc3ViYXJyYXkgYXJyW2xlZnQgLi4uIGldIGlzIGEgbWF4LWhlYXAgSFxuICAgICAgICAgMi4gIHRoZSBzdWJhcnJheSBhcnJbaSsxIC4uLiByaWdodF0gaXMgc29ydGVkIChjYWxsIGl0IFMpXG4gICAgICAgICAzLiAgZXZlcnkgZWxlbWVudCBvZiBIIGlzIGxlc3MgdGhhbiBldmVyeSBlbGVtZW50IG9mIFMgKilcbiAgICAgIGZvciBpID0gcmlnaHQgZG93bnRvIGxlZnQgKyAxIGRvXG4gICAgICAgIHN3YXAgYXJyIGxlZnQgaTtcbiAgICAgICAgaGVhcGlmeSBhcnIgfmNvbXBhcmUgbGVmdCB+bGVmdCB+cmlnaHQ6KGkgLSAxKVxuICAgICAgZG9uZVxuICAgIDs7XG4gIGVuZFxuXG4gICgqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW50cm9zb3J0ICopXG4gIG1vZHVsZSBJbnRyb19zb3J0IDogc2lnXG4gICAgaW5jbHVkZSBTb3J0XG5cbiAgICB2YWwgZml2ZV9lbGVtZW50X3NvcnRcbiAgICAgIDogICdhIHRcbiAgICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludClcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiB1bml0XG4gIGVuZCA9IHN0cnVjdFxuICAgIGxldCBmaXZlX2VsZW1lbnRfc29ydCBhcnIgfmNvbXBhcmUgbTEgbTIgbTMgbTQgbTUgPVxuICAgICAgbGV0IGNvbXBhcmVfYW5kX3N3YXAgaSBqID1cbiAgICAgICAgaWYgY29tcGFyZSAoZ2V0IGFyciBpKSAoZ2V0IGFyciBqKSA+IDAgdGhlbiBzd2FwIGFyciBpIGpcbiAgICAgIGluXG4gICAgICAoKiBPcHRpbWFsIDUtZWxlbWVudCBzb3J0aW5nIG5ldHdvcms6XG5cbiAgICAgICAgIHt2XG4gICAgICAgICAgICAxLS1vLS0tLS1vLS0tLS1vLS0tLS0tLS0tLS0tLS0xXG4gICAgICAgICAgICAgICB8ICAgICB8ICAgICB8XG4gICAgICAgICAgICAyLS1vLS0tLS18LS1vLS18LS0tLS1vLS1vLS0tLS0yXG4gICAgICAgICAgICAgICAgICAgICB8ICB8ICB8ICAgICB8ICB8XG4gICAgICAgICAgICAzLS0tLS0tLS1vLS1vLS18LS1vLS18LS1vLS0tLS0zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8XG4gICAgICAgICAgICA0LS0tLS1vLS0tLS0tLS1vLS1vLS18LS0tLS1vLS00XG4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICB8XG4gICAgICAgICAgICA1LS0tLS1vLS0tLS0tLS0tLS0tLS1vLS0tLS1vLS01XG4gICAgICAgICAgdn0gKilcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTEgbTI7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG00IG01O1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMSBtMztcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTIgbTM7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0xIG00O1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMyBtNDtcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTIgbTU7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0yIG0zO1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtNCBtNVxuICAgIDs7XG5cbiAgICAoKiBjaG9vc2UgcGl2b3RzIGZvciB0aGUgYXJyYXkgYnkgc29ydGluZyA1IGVsZW1lbnRzIGFuZCBleGFtaW5pbmcgdGhlIGNlbnRlciB0aHJlZVxuICAgICAgIGVsZW1lbnRzLiAgVGhlIGdvYWwgaXMgdG8gY2hvb3NlIHR3byBwaXZvdHMgdGhhdCB3aWxsIGVpdGhlcjpcbiAgICAgICAtIGJyZWFrIHRoZSByYW5nZSB1cCBpbnRvIDMgZXZlbiBwYXJ0aXRpb25zXG4gICAgICAgICBvclxuICAgICAgIC0gZWxpbWluYXRlIGEgY29tbW9ubHkgYXBwZWFyaW5nIGVsZW1lbnQgYnkgc29ydGluZyBpdCBpbnRvIHRoZSBjZW50ZXIgcGFydGl0aW9uXG4gICAgICAgICBieSBpdHNlbGZcbiAgICAgICAgIFRvIHRoaXMgZW5kIHdlIGxvb2sgYXQgdGhlIGNlbnRlciAzIGVsZW1lbnRzIG9mIHRoZSA1IGFuZCByZXR1cm4gcGFpcnMgb2YgZXF1YWxcbiAgICAgICAgIGVsZW1lbnRzIG9yIHRoZSB3aWRlc3QgcmFuZ2UgKilcbiAgICBsZXQgY2hvb3NlX3Bpdm90cyBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGxldCBzaXh0aCA9IChyaWdodCAtIGxlZnQpIC8gNiBpblxuICAgICAgbGV0IG0xID0gbGVmdCArIHNpeHRoIGluXG4gICAgICBsZXQgbTIgPSBtMSArIHNpeHRoIGluXG4gICAgICBsZXQgbTMgPSBtMiArIHNpeHRoIGluXG4gICAgICBsZXQgbTQgPSBtMyArIHNpeHRoIGluXG4gICAgICBsZXQgbTUgPSBtNCArIHNpeHRoIGluXG4gICAgICBmaXZlX2VsZW1lbnRfc29ydCBhcnIgfmNvbXBhcmUgbTEgbTIgbTMgbTQgbTU7XG4gICAgICBsZXQgbTJfdmFsID0gZ2V0IGFyciBtMiBpblxuICAgICAgbGV0IG0zX3ZhbCA9IGdldCBhcnIgbTMgaW5cbiAgICAgIGxldCBtNF92YWwgPSBnZXQgYXJyIG00IGluXG4gICAgICBpZiBjb21wYXJlIG0yX3ZhbCBtM192YWwgPSAwXG4gICAgICB0aGVuIG0yX3ZhbCwgbTNfdmFsLCB0cnVlXG4gICAgICBlbHNlIGlmIGNvbXBhcmUgbTNfdmFsIG00X3ZhbCA9IDBcbiAgICAgIHRoZW4gbTNfdmFsLCBtNF92YWwsIHRydWVcbiAgICAgIGVsc2UgbTJfdmFsLCBtNF92YWwsIGZhbHNlXG4gICAgOztcblxuICAgIGxldCBkdWFsX3Bpdm90X3BhcnRpdGlvbiBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGxldCBwaXZvdDEsIHBpdm90MiwgcGl2b3RzX2VxdWFsID0gY2hvb3NlX3Bpdm90cyBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0IGluXG4gICAgICAoKiBsb29wIGludmFyaWFudHM6XG4gICAgICAgICAxLiAgbGVmdCA8PSBsIDwgciA8PSByaWdodFxuICAgICAgICAgMi4gIGwgPD0gcCA8PSByXG4gICAgICAgICAzLiAgbCA8PSB4IDwgcCAgICAgaW1wbGllcyBhcnJbeF0gPj0gcGl2b3QxXG4gICAgICAgICBhbmQgYXJyW3hdIDw9IHBpdm90MlxuICAgICAgICAgNC4gIGxlZnQgPD0geCA8IGwgIGltcGxpZXMgYXJyW3hdIDwgcGl2b3QxXG4gICAgICAgICA1LiAgciA8IHggPD0gcmlnaHQgaW1wbGllcyBhcnJbeF0gPiBwaXZvdDIgKilcbiAgICAgIGxldCByZWMgbG9vcCBsIHAgciA9XG4gICAgICAgIGxldCBwdiA9IGdldCBhcnIgcCBpblxuICAgICAgICBpZiBjb21wYXJlIHB2IHBpdm90MSA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgc3dhcCBhcnIgcCBsO1xuICAgICAgICAgIGNvbnQgKGwgKyAxKSAocCArIDEpIHIpXG4gICAgICAgIGVsc2UgaWYgY29tcGFyZSBwdiBwaXZvdDIgPiAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgICgqIGxvb3AgaW52YXJpYW50czogIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIG91dGVyIGxvb3AgKilcbiAgICAgICAgICBsZXQgcmVjIHNjYW5fYmFja3dhcmRzIHIgPVxuICAgICAgICAgICAgaWYgciA+IHAgJiYgY29tcGFyZSAoZ2V0IGFyciByKSBwaXZvdDIgPiAwIHRoZW4gc2Nhbl9iYWNrd2FyZHMgKHIgLSAxKSBlbHNlIHJcbiAgICAgICAgICBpblxuICAgICAgICAgIGxldCByID0gc2Nhbl9iYWNrd2FyZHMgciBpblxuICAgICAgICAgIHN3YXAgYXJyIHIgcDtcbiAgICAgICAgICBjb250IGwgcCAociAtIDEpKVxuICAgICAgICBlbHNlIGNvbnQgbCAocCArIDEpIHJcbiAgICAgIGFuZCBjb250IGwgcCByID0gaWYgcCA+IHIgdGhlbiBsLCByIGVsc2UgbG9vcCBsIHAgciBpblxuICAgICAgbGV0IGwsIHIgPSBjb250IGxlZnQgbGVmdCByaWdodCBpblxuICAgICAgbCwgciwgcGl2b3RzX2VxdWFsXG4gICAgOztcblxuICAgIGxldCByZWMgaW50cm9fc29ydCBhcnIgfm1heF9kZXB0aCB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgbGV0IGxlbiA9IHJpZ2h0IC0gbGVmdCArIDEgaW5cbiAgICAgICgqIFRoaXMgdGFrZXMgY2FyZSBvZiBzb21lIGVkZ2UgY2FzZXMsIHN1Y2ggYXMgbGVmdCA+IHJpZ2h0IG9yIHZlcnkgc2hvcnQgYXJyYXlzLFxuICAgICAgICAgc2luY2UgSW5zZXJ0aW9uX3NvcnQuc29ydCBoYW5kbGVzIHRoZXNlIGNhc2VzIHByb3Blcmx5LiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvXG4gICAgICAgICBtYWtlIHN1cmUgdGhhdCBsZWZ0IGFuZCByaWdodCBhcmUgdmFsaWQgaW4gcmVjdXJzaXZlIGNhbGxzLiAqKVxuICAgICAgaWYgbGVuIDw9IDMyXG4gICAgICB0aGVuIEluc2VydGlvbl9zb3J0LnNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodFxuICAgICAgZWxzZSBpZiBtYXhfZGVwdGggPCAwXG4gICAgICB0aGVuIEhlYXBfc29ydC5zb3J0IGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHRcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgbWF4X2RlcHRoID0gbWF4X2RlcHRoIC0gMSBpblxuICAgICAgICBsZXQgbCwgciwgbWlkZGxlX3NvcnRlZCA9IGR1YWxfcGl2b3RfcGFydGl0aW9uIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgaW5cbiAgICAgICAgaW50cm9fc29ydCBhcnIgfm1heF9kZXB0aCB+Y29tcGFyZSB+bGVmdCB+cmlnaHQ6KGwgLSAxKTtcbiAgICAgICAgaWYgbm90IG1pZGRsZV9zb3J0ZWQgdGhlbiBpbnRyb19zb3J0IGFyciB+bWF4X2RlcHRoIH5jb21wYXJlIH5sZWZ0OmwgfnJpZ2h0OnI7XG4gICAgICAgIGludHJvX3NvcnQgYXJyIH5tYXhfZGVwdGggfmNvbXBhcmUgfmxlZnQ6KHIgKyAxKSB+cmlnaHQpXG4gICAgOztcblxuICAgIGxldCBzb3J0IGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQgPVxuICAgICAgbGV0IGhlYXBfc29ydF9zd2l0Y2hfZGVwdGggPVxuICAgICAgICAoKiBXZSBiYWlsIG91dCB0byBoZWFwIHNvcnQgYXQgYSByZWN1cnNpb24gZGVwdGggb2YgMzIuIEdOVSBpbnRyb3NvcnQgdXNlcyAybGcobikuXG4gICAgICAgICAgIFRoZSBleHBlY3RlZCByZWN1cnNpb24gZGVwdGggZm9yIHBlcmZlY3QgMy13YXkgc3BsaXRzIGlzIGxvZ18zKG4pLlxuXG4gICAgICAgICAgIFVzaW5nIDMyIG1lYW5zIGEgYmFsYW5jZWQgMy13YXkgc3BsaXQgd291bGQgd29yayB1cCB0byAzXjMyIGVsZW1lbnRzIChyb3VnaGx5XG4gICAgICAgICAgIDJeNTAgb3IgMTBeMTUpLiBHTlUgcmVhY2hlcyBhIGRlcHRoIG9mIDMyIGF0IDY1NTM2IGVsZW1lbnRzLlxuXG4gICAgICAgICAgIEZvciBzbWFsbCBhcnJheXMsIHRoaXMgbWFrZXMgdXMgbGVzcyBsaWtlbHkgdG8gYmFpbCBvdXQgdG8gaGVhcCBzb3J0LCBidXQgdGhlXG4gICAgICAgICAgIDMyKk4gY29zdCBiZWZvcmUgd2UgZG8gaXMgbm90IHRoYXQgbXVjaC5cblxuICAgICAgICAgICBGb3IgbGFyZ2UgYXJyYXlzLCB0aGlzIG1lYW5zIHdlIGFyZSBtb3JlIGxpa2VseSB0byBiYWlsIG91dCB0byBoZWFwIHNvcnQgYXRcbiAgICAgICAgICAgc29tZSBwb2ludCBpZiB3ZSBnZXQgc29tZSBiYWQgc3BsaXRzIG9yIGlmIHRoZSBhcnJheSBpcyBodWdlLiBCdXQgdGhhdCdzIG9ubHkgYVxuICAgICAgICAgICBjb25zdGFudCBmYWN0b3IgY29zdCBpbiB0aGUgZmluYWwgc3RhZ2VzIG9mIHJlY3Vyc2lvbi5cblxuICAgICAgICAgICBBbGwgaW4gYWxsLCB0aGlzIHNlZW1zIHRvIGJlIGEgc21hbGwgdHJhZGVvZmYgYW5kIGF2b2lkcyBwYXlpbmcgYSBjb3N0IHRvXG4gICAgICAgICAgIGNvbXB1dGUgYSBsb2dhcml0aG0gYXQgdGhlIHN0YXJ0LiAqKVxuICAgICAgICAzMlxuICAgICAgaW5cbiAgICAgIGludHJvX3NvcnQgYXJyIH5tYXhfZGVwdGg6aGVhcF9zb3J0X3N3aXRjaF9kZXB0aCB+Y29tcGFyZSB+bGVmdCB+cmlnaHRcbiAgICA7O1xuICBlbmRcbmVuZFxuXG5sZXQgc29ydCA/cG9zID9sZW4gYXJyIH5jb21wYXJlID1cbiAgbGV0IHBvcywgbGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmdldF9wb3NfbGVuX2V4biAoKSA/cG9zID9sZW4gfnRvdGFsX2xlbmd0aDoobGVuZ3RoIGFycilcbiAgaW5cbiAgU29ydC5JbnRyb19zb3J0LnNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0OnBvcyB+cmlnaHQ6KHBvcyArIGxlbiAtIDEpXG47O1xuXG5sZXQgdG9fYXJyYXkgdCA9IHRcbmxldCBpc19lbXB0eSB0ID0gbGVuZ3RoIHQgPSAwXG5cbmxldCBpc19zb3J0ZWQgdCB+Y29tcGFyZSA9XG4gIGxldCBpID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgdHJ1ZSBpblxuICB3aGlsZSAhaSA+IDAgJiYgIXJlc3VsdCBkb1xuICAgIGxldCBlbHRfaSA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgIGxldCBlbHRfaV9taW51c18xID0gdW5zYWZlX2dldCB0ICghaSAtIDEpIGluXG4gICAgaWYgY29tcGFyZSBlbHRfaV9taW51c18xIGVsdF9pID4gMCB0aGVuIHJlc3VsdCA6PSBmYWxzZTtcbiAgICBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGlzX3NvcnRlZF9zdHJpY3RseSB0IH5jb21wYXJlID1cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiB0cnVlIGluXG4gIHdoaWxlICFpID4gMCAmJiAhcmVzdWx0IGRvXG4gICAgbGV0IGVsdF9pID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgbGV0IGVsdF9pX21pbnVzXzEgPSB1bnNhZmVfZ2V0IHQgKCFpIC0gMSkgaW5cbiAgICBpZiBjb21wYXJlIGVsdF9pX21pbnVzXzEgZWx0X2kgPj0gMCB0aGVuIHJlc3VsdCA6PSBmYWxzZTtcbiAgICBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IG1lcmdlIGExIGEyIH5jb21wYXJlID1cbiAgbGV0IGwxID0gQXJyYXkubGVuZ3RoIGExIGluXG4gIGxldCBsMiA9IEFycmF5Lmxlbmd0aCBhMiBpblxuICBpZiBsMSA9IDBcbiAgdGhlbiBjb3B5IGEyXG4gIGVsc2UgaWYgbDIgPSAwXG4gIHRoZW4gY29weSBhMVxuICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYTIgMCkgKHVuc2FmZV9nZXQgYTEgKGwxIC0gMSkpID49IDBcbiAgdGhlbiBhcHBlbmQgYTEgYTJcbiAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGExIDApICh1bnNhZmVfZ2V0IGEyIChsMiAtIDEpKSA+IDBcbiAgdGhlbiBhcHBlbmQgYTIgYTFcbiAgZWxzZSAoXG4gICAgbGV0IGxlbiA9IGwxICsgbDIgaW5cbiAgICBsZXQgbWVyZ2VkID0gY3JlYXRlIH5sZW4gKHVuc2FmZV9nZXQgYTEgMCkgaW5cbiAgICBsZXQgYTFfaW5kZXggPSByZWYgMCBpblxuICAgIGxldCBhMl9pbmRleCA9IHJlZiAwIGluXG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIGxldCB1c2VfYTEgPVxuICAgICAgICBpZiBsMSA9ICFhMV9pbmRleFxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgaWYgbDIgPSAhYTJfaW5kZXhcbiAgICAgICAgdGhlbiB0cnVlXG4gICAgICAgIGVsc2UgY29tcGFyZSAodW5zYWZlX2dldCBhMSAhYTFfaW5kZXgpICh1bnNhZmVfZ2V0IGEyICFhMl9pbmRleCkgPD0gMFxuICAgICAgaW5cbiAgICAgIGlmIHVzZV9hMVxuICAgICAgdGhlbiAoXG4gICAgICAgIHVuc2FmZV9zZXQgbWVyZ2VkIGkgKHVuc2FmZV9nZXQgYTEgIWExX2luZGV4KTtcbiAgICAgICAgYTFfaW5kZXggOj0gIWExX2luZGV4ICsgMSlcbiAgICAgIGVsc2UgKFxuICAgICAgICB1bnNhZmVfc2V0IG1lcmdlZCBpICh1bnNhZmVfZ2V0IGEyICFhMl9pbmRleCk7XG4gICAgICAgIGEyX2luZGV4IDo9ICFhMl9pbmRleCArIDEpXG4gICAgZG9uZTtcbiAgICBtZXJnZWQpXG47O1xuXG5sZXQgY29weV9tYXRyaXggPSBtYXAgfmY6Y29weVxuXG5sZXQgZm9sZGluZ19tYXAgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBtYXAgdCB+ZjooZnVuIHggLT5cbiAgICBsZXQgbmV3X2FjYywgeSA9IGYgIWFjYyB4IGluXG4gICAgYWNjIDo9IG5ld19hY2M7XG4gICAgeSlcbjs7XG5cbmxldCBmb2xkX21hcCB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGxldCByZXN1bHQgPVxuICAgIG1hcCB0IH5mOihmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MsIHkgPSBmICFhY2MgeCBpblxuICAgICAgYWNjIDo9IG5ld19hY2M7XG4gICAgICB5KVxuICBpblxuICAhYWNjLCByZXN1bHRcbjs7XG5cbmxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbmxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgY291bnQgdCB+ZiA9IENvbnRhaW5lci5jb3VudCB+Zm9sZCB0IH5mXG5sZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG5sZXQgbWluX2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxubGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcblxubGV0IGZvbGRpIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIGFjYyA6PSBmIGkgIWFjYyAodW5zYWZlX2dldCB0IGkpXG4gIGRvbmU7XG4gICFhY2Ncbjs7XG5cbmxldCBmb2xkaW5nX21hcGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBtYXBpIHQgfmY6KGZ1biBpIHggLT5cbiAgICBsZXQgbmV3X2FjYywgeSA9IGYgaSAhYWNjIHggaW5cbiAgICBhY2MgOj0gbmV3X2FjYztcbiAgICB5KVxuOztcblxubGV0IGZvbGRfbWFwaSB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGxldCByZXN1bHQgPVxuICAgIG1hcGkgdCB+ZjooZnVuIGkgeCAtPlxuICAgICAgbGV0IG5ld19hY2MsIHkgPSBmIGkgIWFjYyB4IGluXG4gICAgICBhY2MgOj0gbmV3X2FjYztcbiAgICAgIHkpXG4gIGluXG4gICFhY2MsIHJlc3VsdFxuOztcblxubGV0IGNvdW50aSB0IH5mID1cbiAgZm9sZGkgdCB+aW5pdDowIH5mOihmdW4gaWR4IGNvdW50IGEgLT4gaWYgZiBpZHggYSB0aGVuIGNvdW50ICsgMSBlbHNlIGNvdW50KVxuOztcblxubGV0IGNvbmNhdF9tYXAgdCB+ZiA9IGNvbmNhdCAodG9fbGlzdCAobWFwIH5mIHQpKVxubGV0IGNvbmNhdF9tYXBpIHQgfmYgPSBjb25jYXQgKHRvX2xpc3QgKG1hcGkgfmYgdCkpXG5cbmxldCByZXZfaW5wbGFjZSB0ID1cbiAgbGV0IGkgPSByZWYgMCBpblxuICBsZXQgaiA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICB3aGlsZSAhaSA8ICFqIGRvXG4gICAgc3dhcCB0ICFpICFqO1xuICAgIGluY3IgaTtcbiAgICBkZWNyIGpcbiAgZG9uZVxuOztcblxubGV0IHJldiB0ID1cbiAgbGV0IHQgPSBjb3B5IHQgaW5cbiAgcmV2X2lucGxhY2UgdDtcbiAgdFxuOztcblxubGV0IG9mX2xpc3RfcmV2IGwgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBbfHxdXG4gIHwgYSA6OiBsIC0+XG4gICAgbGV0IGxlbiA9IDEgKyBMaXN0Lmxlbmd0aCBsIGluXG4gICAgbGV0IHQgPSBjcmVhdGUgfmxlbiBhIGluXG4gICAgbGV0IHIgPSByZWYgbCBpblxuICAgICgqIFdlIHN0YXJ0IGF0IFtsZW4gLSAyXSBiZWNhdXNlIHdlIGFscmVhZHkgcHV0IFthXSBhdCBbdC4obGVuIC0gMSldLiAqKVxuICAgIGZvciBpID0gbGVuIC0gMiBkb3dudG8gMCBkb1xuICAgICAgbWF0Y2ggIXIgd2l0aFxuICAgICAgfCBbXSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgYSA6OiBsIC0+XG4gICAgICAgIHQuKGkpIDwtIGE7XG4gICAgICAgIHIgOj0gbFxuICAgIGRvbmU7XG4gICAgdFxuOztcblxuKCogW29mX2xpc3RfbWFwXSBhbmQgW29mX2xpc3RfcmV2X21hcF0gYXJlIGJhc2VkIG9uIGZ1bmN0aW9ucyBmcm9tIHRoZSBPQ2FtbFxuICAgZGlzdHJpYnV0aW9uLiAqKVxuXG5sZXQgb2ZfbGlzdF9tYXAgeHMgfmYgPVxuICBtYXRjaCB4cyB3aXRoXG4gIHwgW10gLT4gW3x8XVxuICB8IGhkIDo6IHRsIC0+XG4gICAgbGV0IGEgPSBjcmVhdGUgfmxlbjooMSArIExpc3QubGVuZ3RoIHRsKSAoZiBoZCkgaW5cbiAgICBsZXQgcmVjIGZpbGwgaSA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IGFcbiAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgdW5zYWZlX3NldCBhIGkgKGYgaGQpO1xuICAgICAgICBmaWxsIChpICsgMSkgdGxcbiAgICBpblxuICAgIGZpbGwgMSB0bFxuOztcblxubGV0IG9mX2xpc3RfbWFwaSB4cyB+ZiA9XG4gIG1hdGNoIHhzIHdpdGhcbiAgfCBbXSAtPiBbfHxdXG4gIHwgaGQgOjogdGwgLT5cbiAgICBsZXQgYSA9IGNyZWF0ZSB+bGVuOigxICsgTGlzdC5sZW5ndGggdGwpIChmIDAgaGQpIGluXG4gICAgbGV0IHJlYyBmaWxsIGEgaSA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IGFcbiAgICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICAgdW5zYWZlX3NldCBhIGkgKGYgaSBoZCk7XG4gICAgICAgIGZpbGwgYSAoaSArIDEpIHRsXG4gICAgaW5cbiAgICBmaWxsIGEgMSB0bFxuOztcblxubGV0IG9mX2xpc3RfcmV2X21hcCB4cyB+ZiA9XG4gIGxldCB0ID0gb2ZfbGlzdF9tYXAgeHMgfmYgaW5cbiAgcmV2X2lucGxhY2UgdDtcbiAgdFxuOztcblxubGV0IG9mX2xpc3RfcmV2X21hcGkgeHMgfmYgPVxuICBsZXQgdCA9IG9mX2xpc3RfbWFwaSB4cyB+ZiBpblxuICByZXZfaW5wbGFjZSB0O1xuICB0XG47O1xuXG5sZXQgZmlsdGVyX21hcGkgdCB+ZiA9XG4gIGxldCByID0gcmVmIFt8fF0gaW5cbiAgbGV0IGsgPSByZWYgMCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgbWF0Y2ggZiBpICh1bnNhZmVfZ2V0IHQgaSkgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBhIC0+XG4gICAgICBpZiAhayA9IDAgdGhlbiByIDo9IGNyZWF0ZSB+bGVuOihsZW5ndGggdCkgYTtcbiAgICAgIHVuc2FmZV9zZXQgIXIgIWsgYTtcbiAgICAgIGluY3Iga1xuICBkb25lO1xuICBpZiAhayA9IGxlbmd0aCB0IHRoZW4gIXIgZWxzZSBpZiAhayA+IDAgdGhlbiBzdWIgfnBvczowIH5sZW46IWsgIXIgZWxzZSBbfHxdXG47O1xuXG5sZXQgZmlsdGVyX21hcCB0IH5mID0gZmlsdGVyX21hcGkgdCB+ZjooZnVuIF9pIGEgLT4gZiBhKVxubGV0IGZpbHRlcl9vcHQgdCA9IGZpbHRlcl9tYXAgdCB+ZjpGbi5pZFxuXG5sZXQgcmFpc2VfbGVuZ3RoX21pc21hdGNoIG5hbWUgbjEgbjIgPVxuICBpbnZhbGlkX2FyZ2YgXCJsZW5ndGggbWlzbWF0Y2ggaW4gJXM6ICVkIDw+ICVkXCIgbmFtZSBuMSBuMiAoKVxuW0BAY29sZF0gW0BAaW5saW5lIG5ldmVyXSBbQEBsb2NhbCBuZXZlcl0gW0BAc3BlY2lhbGlzZSBuZXZlcl1cbjs7XG5cbmxldCBjaGVja19sZW5ndGgyX2V4biBuYW1lIHQxIHQyID1cbiAgbGV0IG4xID0gbGVuZ3RoIHQxIGluXG4gIGxldCBuMiA9IGxlbmd0aCB0MiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIHJhaXNlX2xlbmd0aF9taXNtYXRjaCBuYW1lIG4xIG4yXG47O1xuXG5sZXQgaXRlcjJfZXhuIHQxIHQyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJBcnJheS5pdGVyMl9leG5cIiB0MSB0MjtcbiAgaXRlcmkgdDEgfmY6KGZ1biBpIHgxIC0+IGYgeDEgKHVuc2FmZV9nZXQgdDIgaSkpXG47O1xuXG5sZXQgbWFwMl9leG4gdDEgdDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIkFycmF5Lm1hcDJfZXhuXCIgdDEgdDI7XG4gIGluaXQgKGxlbmd0aCB0MSkgfmY6KGZ1biBpIC0+IGYgKHVuc2FmZV9nZXQgdDEgaSkgKHVuc2FmZV9nZXQgdDIgaSkpXG47O1xuXG5sZXQgZm9sZDJfZXhuIHQxIHQyIH5pbml0IH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJBcnJheS5mb2xkMl9leG5cIiB0MSB0MjtcbiAgZm9sZGkgdDEgfmluaXQgfmY6KGZ1biBpIGFjIHggLT4gZiBhYyB4ICh1bnNhZmVfZ2V0IHQyIGkpKVxuOztcblxubGV0IGZpbHRlciB0IH5mID0gZmlsdGVyX21hcCB0IH5mOihmdW4geCAtPiBpZiBmIHggdGhlbiBTb21lIHggZWxzZSBOb25lKVxubGV0IGZpbHRlcmkgdCB+ZiA9IGZpbHRlcl9tYXBpIHQgfmY6KGZ1biBpIHggLT4gaWYgZiBpIHggdGhlbiBTb21lIHggZWxzZSBOb25lKVxuXG5cbmxldCBleGlzdHMgdCB+ZiA9XG4gIGxldCBpID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgZmFsc2UgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiBub3QgIXJlc3VsdCBkb1xuICAgIGlmIGYgKHVuc2FmZV9nZXQgdCAhaSkgdGhlbiByZXN1bHQgOj0gdHJ1ZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgZXhpc3RzaSB0IH5mID1cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiBmYWxzZSBpblxuICB3aGlsZSAhaSA+PSAwICYmIG5vdCAhcmVzdWx0IGRvXG4gICAgaWYgZiAhaSAodW5zYWZlX2dldCB0ICFpKSB0aGVuIHJlc3VsdCA6PSB0cnVlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBtZW0gdCBhIH5lcXVhbCA9IGV4aXN0cyB0IH5mOihlcXVhbCBhKVxuXG5sZXQgZm9yX2FsbCB0IH5mID1cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiB0cnVlIGluXG4gIHdoaWxlICFpID49IDAgJiYgIXJlc3VsdCBkb1xuICAgIGlmIG5vdCAoZiAodW5zYWZlX2dldCB0ICFpKSkgdGhlbiByZXN1bHQgOj0gZmFsc2UgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGZvcl9hbGxpIHQgfmYgPVxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgbGV0IGkgPSByZWYgKGxlbmd0aCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgdHJ1ZSBpblxuICB3aGlsZSAhaSA+PSAwICYmICFyZXN1bHQgZG9cbiAgICBpZiBub3QgKGYgIWkgKHVuc2FmZV9nZXQgdCAhaSkpIHRoZW4gcmVzdWx0IDo9IGZhbHNlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBleGlzdHMyX2V4biB0MSB0MiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiQXJyYXkuZXhpc3RzMl9leG5cIiB0MSB0MjtcbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0MSAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgZmFsc2UgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiBub3QgIXJlc3VsdCBkb1xuICAgIGlmIGYgKHVuc2FmZV9nZXQgdDEgIWkpICh1bnNhZmVfZ2V0IHQyICFpKSB0aGVuIHJlc3VsdCA6PSB0cnVlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBmb3JfYWxsMl9leG4gdDEgdDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIkFycmF5LmZvcl9hbGwyX2V4blwiIHQxIHQyO1xuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQxIC0gMSkgaW5cbiAgbGV0IHJlc3VsdCA9IHJlZiB0cnVlIGluXG4gIHdoaWxlICFpID49IDAgJiYgIXJlc3VsdCBkb1xuICAgIGlmIG5vdCAoZiAodW5zYWZlX2dldCB0MSAhaSkgKHVuc2FmZV9nZXQgdDIgIWkpKSB0aGVuIHJlc3VsdCA6PSBmYWxzZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgZXF1YWwgZXF1YWwgdDEgdDIgPSBsZW5ndGggdDEgPSBsZW5ndGggdDIgJiYgZm9yX2FsbDJfZXhuIHQxIHQyIH5mOmVxdWFsXG5cblxubGV0IG1hcF9pbnBsYWNlIHQgfmYgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgdW5zYWZlX3NldCB0IGkgKGYgKHVuc2FmZV9nZXQgdCBpKSlcbiAgZG9uZVxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSBmaW5kaV9pbnRlcm5hbCB0IH5mIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kID1cbiAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGlmIGxlbmd0aCA9IDBcbiAgdGhlbiBpZl9ub3RfZm91bmQgKClcbiAgZWxzZSAoXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGxldCBmb3VuZCA9IHJlZiBmYWxzZSBpblxuICAgIGxldCB2YWx1ZV9mb3VuZCA9IHJlZiAodW5zYWZlX2dldCB0IDApIGluXG4gICAgd2hpbGUgKG5vdCAhZm91bmQpICYmICFpIDwgbGVuZ3RoIGRvXG4gICAgICBsZXQgdmFsdWUgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICAgIGlmIGYgIWkgdmFsdWVcbiAgICAgIHRoZW4gKFxuICAgICAgICB2YWx1ZV9mb3VuZCA6PSB2YWx1ZTtcbiAgICAgICAgZm91bmQgOj0gdHJ1ZSlcbiAgICAgIGVsc2UgaW5jciBpXG4gICAgZG9uZTtcbiAgICBpZiAhZm91bmQgdGhlbiBpZl9mb3VuZCB+aTohaSB+dmFsdWU6IXZhbHVlX2ZvdW5kIGVsc2UgaWZfbm90X2ZvdW5kICgpKVxuOztcblxubGV0IGZpbmRpIHQgfmYgPVxuICBmaW5kaV9pbnRlcm5hbFxuICAgIHRcbiAgICB+ZlxuICAgIH5pZl9mb3VuZDooZnVuIH5pIH52YWx1ZSAtPiBTb21lIChpLCB2YWx1ZSkpXG4gICAgfmlmX25vdF9mb3VuZDooZnVuICgpIC0+IE5vbmUpXG47O1xuXG5sZXQgZmluZGlfZXhuIHQgfmYgPVxuICBmaW5kaV9pbnRlcm5hbFxuICAgIHRcbiAgICB+ZlxuICAgIH5pZl9mb3VuZDooZnVuIH5pIH52YWx1ZSAtPiBpLCB2YWx1ZSlcbiAgICB+aWZfbm90X2ZvdW5kOihmdW4gKCkgLT4gcmFpc2UgKE5vdF9mb3VuZF9zIChBdG9tIFwiQXJyYXkuZmluZGlfZXhuOiBub3QgZm91bmRcIikpKVxuOztcblxubGV0IGZpbmRfZXhuIHQgfmYgPVxuICBmaW5kaV9pbnRlcm5hbFxuICAgIHRcbiAgICB+ZjooZnVuIF9pIHggLT4gZiB4KVxuICAgIH5pZl9mb3VuZDooZnVuIH5pOl8gfnZhbHVlIC0+IHZhbHVlKVxuICAgIH5pZl9ub3RfZm91bmQ6KGZ1biAoKSAtPiByYWlzZSAoTm90X2ZvdW5kX3MgKEF0b20gXCJBcnJheS5maW5kX2V4bjogbm90IGZvdW5kXCIpKSlcbjs7XG5cbmxldCBmaW5kIHQgfmYgPSBPcHRpb24ubWFwIChmaW5kaSB0IH5mOihmdW4gX2kgeCAtPiBmIHgpKSB+ZjooZnVuIChfaSwgeCkgLT4geClcblxubGV0IGZpbmRfbWFwIHQgfmYgPVxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgaWYgbGVuZ3RoID0gMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGxldCB2YWx1ZV9mb3VuZCA9IHJlZiBOb25lIGluXG4gICAgd2hpbGUgT3B0aW9uLmlzX25vbmUgIXZhbHVlX2ZvdW5kICYmICFpIDwgbGVuZ3RoIGRvXG4gICAgICBsZXQgdmFsdWUgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICAgIHZhbHVlX2ZvdW5kIDo9IGYgdmFsdWU7XG4gICAgICBpbmNyIGlcbiAgICBkb25lO1xuICAgICF2YWx1ZV9mb3VuZClcbjs7XG5cbmxldCBmaW5kX21hcF9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJBcnJheS5maW5kX21hcF9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgZmluZF9tYXBfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmRfbWFwIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IFNvbWUgeCAtPiB4XG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9tYXBfZXhuXG47O1xuXG5sZXQgZmluZF9tYXBpIHQgfmYgPVxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgaWYgbGVuZ3RoID0gMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGxldCB2YWx1ZV9mb3VuZCA9IHJlZiBOb25lIGluXG4gICAgd2hpbGUgT3B0aW9uLmlzX25vbmUgIXZhbHVlX2ZvdW5kICYmICFpIDwgbGVuZ3RoIGRvXG4gICAgICBsZXQgdmFsdWUgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICAgIHZhbHVlX2ZvdW5kIDo9IGYgIWkgdmFsdWU7XG4gICAgICBpbmNyIGlcbiAgICBkb25lO1xuICAgICF2YWx1ZV9mb3VuZClcbjs7XG5cbmxldCBmaW5kX21hcGlfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiQXJyYXkuZmluZF9tYXBpX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBmaW5kX21hcGlfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmRfbWFwaSB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCBTb21lIHggLT4geFxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfbWFwaV9leG5cbjs7XG5cbmxldCBmaW5kX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZSB0IH5lcXVhbCA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgaWYgbiA8PSAxXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgcmVzdWx0ID0gcmVmIE5vbmUgaW5cbiAgICBsZXQgaSA9IHJlZiAxIGluXG4gICAgbGV0IHByZXYgPSByZWYgKHVuc2FmZV9nZXQgdCAwKSBpblxuICAgIHdoaWxlICFpIDwgbiBkb1xuICAgICAgbGV0IGN1ciA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgICAgaWYgZXF1YWwgY3VyICFwcmV2XG4gICAgICB0aGVuIChcbiAgICAgICAgcmVzdWx0IDo9IFNvbWUgKCFwcmV2LCBjdXIpO1xuICAgICAgICBpIDo9IG4pXG4gICAgICBlbHNlIChcbiAgICAgICAgcHJldiA6PSBjdXI7XG4gICAgICAgIGluY3IgaSlcbiAgICBkb25lO1xuICAgICFyZXN1bHQpXG47O1xuXG5sZXQgcmVkdWNlIHQgfmYgPVxuICBpZiBsZW5ndGggdCA9IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCByID0gcmVmICh1bnNhZmVfZ2V0IHQgMCkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgdCBpKVxuICAgIGRvbmU7XG4gICAgU29tZSAhcilcbjs7XG5cbmxldCByZWR1Y2VfZXhuIHQgfmYgPVxuICBtYXRjaCByZWR1Y2UgdCB+ZiB3aXRoXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZyBcIkFycmF5LnJlZHVjZV9leG5cIlxuICB8IFNvbWUgdiAtPiB2XG47O1xuXG5sZXQgcGVybXV0ZSA9IEFycmF5X3Blcm11dGUucGVybXV0ZVxuXG5sZXQgcmFuZG9tX2VsZW1lbnRfZXhuID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIHQgPVxuICBpZiBpc19lbXB0eSB0XG4gIHRoZW4gZmFpbHdpdGggXCJBcnJheS5yYW5kb21fZWxlbWVudF9leG46IGVtcHR5IGFycmF5XCJcbiAgZWxzZSB0LihSYW5kb20uU3RhdGUuaW50IHJhbmRvbV9zdGF0ZSAobGVuZ3RoIHQpKVxuOztcblxubGV0IHJhbmRvbV9lbGVtZW50ID8ocmFuZG9tX3N0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIHQgPVxuICB0cnkgU29tZSAocmFuZG9tX2VsZW1lbnRfZXhuIH5yYW5kb21fc3RhdGUgdCkgd2l0aFxuICB8IF8gLT4gTm9uZVxuOztcblxubGV0IHppcCB0MSB0MiA9XG4gIGlmIGxlbmd0aCB0MSA8PiBsZW5ndGggdDIgdGhlbiBOb25lIGVsc2UgU29tZSAobWFwMl9leG4gdDEgdDIgfmY6KGZ1biB4MSB4MiAtPiB4MSwgeDIpKVxuOztcblxubGV0IHppcF9leG4gdDEgdDIgPVxuICBpZiBsZW5ndGggdDEgPD4gbGVuZ3RoIHQyXG4gIHRoZW4gZmFpbHdpdGggXCJBcnJheS56aXBfZXhuXCJcbiAgZWxzZSBtYXAyX2V4biB0MSB0MiB+ZjooZnVuIHgxIHgyIC0+IHgxLCB4Milcbjs7XG5cbmxldCB1bnppcCB0ID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBpZiBuID0gMFxuICB0aGVuIFt8fF0sIFt8fF1cbiAgZWxzZSAoXG4gICAgbGV0IHgsIHkgPSB0LigwKSBpblxuICAgIGxldCByZXMxID0gY3JlYXRlIH5sZW46biB4IGluXG4gICAgbGV0IHJlczIgPSBjcmVhdGUgfmxlbjpuIHkgaW5cbiAgICBmb3IgaSA9IDEgdG8gbiAtIDEgZG9cbiAgICAgIGxldCB4LCB5ID0gdC4oaSkgaW5cbiAgICAgIHJlczEuKGkpIDwtIHg7XG4gICAgICByZXMyLihpKSA8LSB5XG4gICAgZG9uZTtcbiAgICByZXMxLCByZXMyKVxuOztcblxubGV0IHNvcnRlZF9jb3B5IHQgfmNvbXBhcmUgPVxuICBsZXQgdDEgPSBjb3B5IHQgaW5cbiAgc29ydCB0MSB+Y29tcGFyZTtcbiAgdDFcbjs7XG5cbmxldCBwYXJ0aXRpb25pX3RmIHQgfmYgPVxuICBsZXQgYm90aCA9IG1hcGkgdCB+ZjooZnVuIGkgeCAtPiBpZiBmIGkgeCB0aGVuIEVpdGhlci5GaXJzdCB4IGVsc2UgRWl0aGVyLlNlY29uZCB4KSBpblxuICBsZXQgdHJ1ZXMgPVxuICAgIGZpbHRlcl9tYXAgYm90aCB+ZjooZnVuY3Rpb25cbiAgICAgIHwgRmlyc3QgeCAtPiBTb21lIHhcbiAgICAgIHwgU2Vjb25kIF8gLT4gTm9uZSlcbiAgaW5cbiAgbGV0IGZhbHNlcyA9XG4gICAgZmlsdGVyX21hcCBib3RoIH5mOihmdW5jdGlvblxuICAgICAgfCBGaXJzdCBfIC0+IE5vbmVcbiAgICAgIHwgU2Vjb25kIHggLT4gU29tZSB4KVxuICBpblxuICB0cnVlcywgZmFsc2VzXG47O1xuXG5sZXQgcGFydGl0aW9uX3RmIHQgfmYgPSBwYXJ0aXRpb25pX3RmIHQgfmY6KGZ1biBfaSB4IC0+IGYgeClcbmxldCBsYXN0IHQgPSB0LihsZW5ndGggdCAtIDEpXG5cbigqIENvbnZlcnQgdG8gYSBzZXF1ZW5jZSBidXQgZG9lcyBub3QgYXR0ZW1wdCB0byBwcm90ZWN0IGFnYWluc3QgbW9kaWZpY2F0aW9uXG4gICBpbiB0aGUgYXJyYXkuICopXG5sZXQgdG9fc2VxdWVuY2VfbXV0YWJsZSB0ID1cbiAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQ6MCB+ZjooZnVuIGkgLT5cbiAgICBpZiBpID49IGxlbmd0aCB0IHRoZW4gU2VxdWVuY2UuU3RlcC5Eb25lIGVsc2UgU2VxdWVuY2UuU3RlcC5ZaWVsZCAodC4oaSksIGkgKyAxKSlcbjs7XG5cbmxldCB0b19zZXF1ZW5jZSB0ID0gdG9fc2VxdWVuY2VfbXV0YWJsZSAoY29weSB0KVxuXG5sZXQgY2FydGVzaWFuX3Byb2R1Y3QgdDEgdDIgPVxuICBpZiBpc19lbXB0eSB0MSB8fCBpc19lbXB0eSB0MlxuICB0aGVuIFt8fF1cbiAgZWxzZSAoXG4gICAgbGV0IG4xID0gbGVuZ3RoIHQxIGluXG4gICAgbGV0IG4yID0gbGVuZ3RoIHQyIGluXG4gICAgbGV0IHQgPSBjcmVhdGUgfmxlbjoobjEgKiBuMikgKHQxLigwKSwgdDIuKDApKSBpblxuICAgIGxldCByID0gcmVmIDAgaW5cbiAgICBmb3IgaTEgPSAwIHRvIG4xIC0gMSBkb1xuICAgICAgZm9yIGkyID0gMCB0byBuMiAtIDEgZG9cbiAgICAgICAgdC4oIXIpIDwtIHQxLihpMSksIHQyLihpMik7XG4gICAgICAgIGluY3IgclxuICAgICAgZG9uZVxuICAgIGRvbmU7XG4gICAgdClcbjs7XG5cbmxldCB0cmFuc3Bvc2UgdHQgPVxuICBpZiBsZW5ndGggdHQgPSAwXG4gIHRoZW4gU29tZSBbfHxdXG4gIGVsc2UgKFxuICAgIGxldCB3aWR0aCA9IGxlbmd0aCB0dCBpblxuICAgIGxldCBkZXB0aCA9IGxlbmd0aCB0dC4oMCkgaW5cbiAgICBpZiBleGlzdHMgdHQgfmY6KGZ1biB0IC0+IGxlbmd0aCB0IDw+IGRlcHRoKVxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgU29tZSAoaW5pdCBkZXB0aCB+ZjooZnVuIGQgLT4gaW5pdCB3aWR0aCB+ZjooZnVuIHcgLT4gdHQuKHcpLihkKSkpKSlcbjs7XG5cbmxldCB0cmFuc3Bvc2VfZXhuIHR0ID1cbiAgbWF0Y2ggdHJhbnNwb3NlIHR0IHdpdGhcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnIFwiQXJyYXkudHJhbnNwb3NlX2V4blwiXG4gIHwgU29tZSB0dCcgLT4gdHQnXG47O1xuXG5pbmNsdWRlIEJpbmFyeV9zZWFyY2hhYmxlLk1ha2UxIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGdldCA9IGdldFxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgZW5kKVxuXG5pbmNsdWRlIEJsaXQuTWFrZTEgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG5cbiAgICBsZXQgY3JlYXRlX2xpa2UgfmxlbiB0ID1cbiAgICAgIGlmIGxlbiA9IDBcbiAgICAgIHRoZW4gW3x8XVxuICAgICAgZWxzZSAoXG4gICAgICAgIGFzc2VydCAobGVuZ3RoIHQgPiAwKTtcbiAgICAgICAgY3JlYXRlIH5sZW4gdC4oMCkpXG4gICAgOztcblxuICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0XG4gIGVuZClcblxubGV0IGludmFyaWFudCBpbnZhcmlhbnRfYSB0ID0gaXRlciB0IH5mOmludmFyaWFudF9hXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIG1vZHVsZSBTb3J0ID0gU29ydFxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBJbnQgPSBJbnQwXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5cbigqIFdlIG1haW50YWluIHRoZSBwcm9wZXJ0eSB0aGF0IGFsbCB2YWx1ZXMgb2YgdHlwZSBbdF0gZG8gbm90IGhhdmUgdGhlIHRhZ1xuICAgW2RvdWJsZV9hcnJheV90YWddLiAgU29tZSBmdW5jdGlvbnMgYmVsb3cgYXNzdW1lIHRoaXMgaW4gb3JkZXIgdG8gYXZvaWQgdGVzdGluZyB0aGVcbiAgIHRhZywgYW5kIHdpbGwgc2VnZmF1bHQgaWYgdGhpcyBwcm9wZXJ0eSBkb2Vzbid0IGhvbGQuICopXG50eXBlIHQgPSBDYW1sLk9iai50IGFycmF5XG5cbmxldCBpbnZhcmlhbnQgdCA9IGFzc2VydCAoQ2FtbC5PYmoudGFnIChDYW1sLk9iai5yZXByIHQpIDw+IENhbWwuT2JqLmRvdWJsZV9hcnJheV90YWcpXG5sZXQgbGVuZ3RoID0gQXJyYXkubGVuZ3RoICgqIHdvdWxkIGNoZWNrIGZvciBmbG9hdCBhcnJheXMgaW4gMzIgYml0LCBidXQgd2hhdGV2ZXIgKilcblxubGV0IHNleHBfb2ZfdCB0ID1cbiAgU2V4cC5BdG9tXG4gICAgKFN0cmluZy5jb25jYXQgfnNlcDpcIlwiIFsgXCI8T2JqX2FycmF5LnQgb2YgbGVuZ3RoIFwiOyBJbnQudG9fc3RyaW5nIChsZW5ndGggdCk7IFwiPlwiIF0pXG47O1xuXG5sZXQgemVyb19vYmogPSBDYW1sLk9iai5yZXByICgwIDogaW50KVxuXG4oKiBXZSBjYWxsIFtBcnJheS5jcmVhdGVdIHdpdGggYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIGZsb2F0IHNvIHRoYXQgdGhlIGFycmF5IGRvZXNuJ3QgZ2V0XG4gICB0YWdnZWQgd2l0aCBbRG91YmxlX2FycmF5X3RhZ10uICopXG5sZXQgY3JlYXRlX3plcm8gfmxlbiA9IEFycmF5LmNyZWF0ZSB+bGVuIHplcm9fb2JqXG5sZXQgZW1wdHkgPSBbfHxdXG5cbnR5cGUgbm90X2FfZmxvYXQgPVxuICB8IE5vdF9hX2Zsb2F0XzBcbiAgfCBOb3RfYV9mbG9hdF8xIG9mIGludFxuXG5sZXQgX25vdF9hX2Zsb2F0XzAgPSBOb3RfYV9mbG9hdF8wXG5sZXQgX25vdF9hX2Zsb2F0XzEgPSBOb3RfYV9mbG9hdF8xIDQyXG5cbmxldCBnZXQgdCBpID1cbiAgKCogTWFrZSB0aGUgY29tcGlsZXIgYmVsaWV2ZSBbdF0gaXMgYW4gYXJyYXkgbm90IGNvbnRhaW5pbmcgZmxvYXRzIHNvIGl0IGRvZXMgbm90IGNoZWNrXG4gICAgIGlmIFt0XSBpcyB0YWdnZWQgd2l0aCBbRG91YmxlX2FycmF5X3RhZ10uICBJdCBpcyBOT1Qgb2sgdG8gdXNlIFtpbnQgYXJyYXldIHNpbmNlIChpZlxuICAgICB0aGlzIGZ1bmN0aW9uIGlzIGlubGluZWQgYW5kIHRoZSBhcnJheSBjb250YWlucyBpbi1oZWFwIGJveGVkIHZhbHVlcykgd3JvbmcgcmVnaXN0ZXJcbiAgICAgdHlwaW5nIG1heSByZXN1bHQsIGxlYWRpbmcgdG8gYSBmYWlsdXJlIHRvIHJlZ2lzdGVyIG5lY2Vzc2FyeSBHQyByb290cy4gKilcbiAgQ2FtbC5PYmoucmVwciAoKENhbWwuT2JqLm1hZ2ljICh0IDogdCkgOiBub3RfYV9mbG9hdCBhcnJheSkuKGkpIDogbm90X2FfZmxvYXQpXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHVuc2FmZV9nZXQgdCBpID1cbiAgKCogTWFrZSB0aGUgY29tcGlsZXIgYmVsaWV2ZSBbdF0gaXMgYW4gYXJyYXkgbm90IGNvbnRhaW5pbmcgZmxvYXRzIHNvIGl0IGRvZXMgbm90IGNoZWNrXG4gICAgIGlmIFt0XSBpcyB0YWdnZWQgd2l0aCBbRG91YmxlX2FycmF5X3RhZ10uICopXG4gIENhbWwuT2JqLnJlcHJcbiAgICAoQXJyYXkudW5zYWZlX2dldCAoQ2FtbC5PYmoubWFnaWMgKHQgOiB0KSA6IG5vdF9hX2Zsb2F0IGFycmF5KSBpIDogbm90X2FfZmxvYXQpXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqID1cbiAgKCogU2FtZSBjb21tZW50IGFzIFt1bnNhZmVfZ2V0XS4gU3lzLm9wYXF1ZV9pZGVudGl0eSBwcmV2ZW50cyB0aGUgY29tcGlsZXIgZnJvbVxuICAgICBwb3RlbnRpYWxseSB3cm9uZ2x5IGd1ZXNzaW5nIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBiYXNlZCBvbiB0aGUgdHlwZSBvZiBlbGVtZW50LCB0aGF0XG4gICAgIGlzIHByZXZlbnQgdGhlIGltcGxpY2F0aW9uOiAoT2JqLnRhZyBvYmogPSBPYmouZG91YmxlX3RhZykgPT4gKE9iai50YWcgdCA9XG4gICAgIE9iai5kb3VibGVfYXJyYXlfdGFnKSB3aGljaCBmbGFtYmRhIGhhcyB0cmllZCBpbiB0aGUgcGFzdCAoYXQgbGVhc3QgdGhhdCdzIGFzc3VtaW5nXG4gICAgIHRoZSBjb21waWxlciByZXNwZWN0cyBTeXMub3BhcXVlX2lkZW50aXR5LCB3aGljaCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlKS4gKilcbiAgQXJyYXkudW5zYWZlX3NldFxuICAgIChDYW1sLk9iai5tYWdpYyAodCA6IHQpIDogbm90X2FfZmxvYXQgYXJyYXkpXG4gICAgaVxuICAgIChDYW1sLk9iai5vYmogKFN5cy5vcGFxdWVfaWRlbnRpdHkgb2JqKSA6IG5vdF9hX2Zsb2F0KVxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSBzZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqID1cbiAgKCogc2FtZSBhcyB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgYnV0IHNhZmUgKilcbiAgKENhbWwuT2JqLm1hZ2ljICh0IDogdCkgOiBub3RfYV9mbG9hdCBhcnJheSkuKGkpXG4gIDwtIChDYW1sLk9iai5vYmogKFN5cy5vcGFxdWVfaWRlbnRpdHkgb2JqKSA6IG5vdF9hX2Zsb2F0KVxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSBpbnQgPVxuICAoKiBUaGlzIHNraXBzIFtjYW1sX21vZGlmeV0sIHdoaWNoIGlzIE9LIGlmIGJvdGggdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgaW50ZWdlcnMuICopXG4gIEFycmF5LnVuc2FmZV9zZXQgKENhbWwuT2JqLm1hZ2ljICh0IDogdCkgOiBpbnQgYXJyYXkpIGkgKFN5cy5vcGFxdWVfaWRlbnRpdHkgaW50KVxuOztcblxuKCogRm9yIFtzZXRdIGFuZCBbdW5zYWZlX3NldF0sIGlmIGEgcG9pbnRlciBpcyBpbnZvbHZlZCwgd2UgZmlyc3QgZG8gYSBwaHlzaWNhbC1lcXVhbGl0eVxuICAgdGVzdCB0byBzZWUgaWYgdGhlIHBvaW50ZXIgaXMgY2hhbmdpbmcuICBJZiBub3QsIHdlIGRvbid0IG5lZWQgdG8gZG8gdGhlIFtzZXRdLCB3aGljaFxuICAgc2F2ZXMgYSBjYWxsIHRvIFtjYW1sX21vZGlmeV0uICBXZSB0aGluayB0aGlzIHBoeXNpY2FsLWVxdWFsaXR5IHRlc3QgaXMgd29ydGggaXRcbiAgIGJlY2F1c2UgaXQgaXMgdmVyeSBjaGVhcCAoYm90aCB2YWx1ZXMgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGZyb20gdGhlIFtpc19pbnRdIHRlc3QpXG4gICBhbmQgYmVjYXVzZSBbY2FtbF9tb2RpZnldIGlzIGV4cGVuc2l2ZS4gKilcblxubGV0IHNldCB0IGkgb2JqID1cbiAgKCogV2UgdXNlIFtnZXRdIGZpcnN0IGJ1dCB0aGVuIHdlIHVzZSBbQXJyYXkudW5zYWZlX3NldF0gc2luY2Ugd2Uga25vdyB0aGF0IFtpXSBpc1xuICAgICB2YWxpZC4gKilcbiAgbGV0IG9sZF9vYmogPSBnZXQgdCBpIGluXG4gIGlmIENhbWwuT2JqLmlzX2ludCBvbGRfb2JqICYmIENhbWwuT2JqLmlzX2ludCBvYmpcbiAgdGhlbiB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSAoQ2FtbC5PYmoub2JqIG9iaiA6IGludClcbiAgZWxzZSBpZiBub3QgKHBoeXNfZXF1YWwgb2xkX29iaiBvYmopXG4gIHRoZW4gdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmpcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gdW5zYWZlX3NldCB0IGkgb2JqID1cbiAgbGV0IG9sZF9vYmogPSB1bnNhZmVfZ2V0IHQgaSBpblxuICBpZiBDYW1sLk9iai5pc19pbnQgb2xkX29iaiAmJiBDYW1sLk9iai5pc19pbnQgb2JqXG4gIHRoZW4gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgKENhbWwuT2JqLm9iaiBvYmogOiBpbnQpXG4gIGVsc2UgaWYgbm90IChwaHlzX2VxdWFsIG9sZF9vYmogb2JqKVxuICB0aGVuIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHVuc2FmZV9zZXRfb21pdF9waHlzX2VxdWFsX2NoZWNrIHQgaSBvYmogPVxuICBsZXQgb2xkX29iaiA9IHVuc2FmZV9nZXQgdCBpIGluXG4gIGlmIENhbWwuT2JqLmlzX2ludCBvbGRfb2JqICYmIENhbWwuT2JqLmlzX2ludCBvYmpcbiAgdGhlbiB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSAoQ2FtbC5PYmoub2JqIG9iaiA6IGludClcbiAgZWxzZSB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9ialxuOztcblxubGV0IHN3YXAgdCBpIGogPVxuICBsZXQgYSA9IGdldCB0IGkgaW5cbiAgbGV0IGIgPSBnZXQgdCBqIGluXG4gIHVuc2FmZV9zZXQgdCBpIGI7XG4gIHVuc2FmZV9zZXQgdCBqIGFcbjs7XG5cbmxldCBjcmVhdGUgfmxlbiB4ID1cbiAgKCogSWYgd2UgY2FuLCB1c2UgW0FycmF5LmNyZWF0ZV0gZGlyZWN0bHkuICopXG4gIGlmIENhbWwuT2JqLnRhZyB4IDw+IENhbWwuT2JqLmRvdWJsZV90YWdcbiAgdGhlbiBBcnJheS5jcmVhdGUgfmxlbiB4XG4gIGVsc2UgKFxuICAgICgqIE90aGVyd2lzZSB1c2UgW2NyZWF0ZV96ZXJvXSBhbmQgc2V0IHRoZSBjb250ZW50cyAqKVxuICAgIGxldCB0ID0gY3JlYXRlX3plcm8gfmxlbiBpblxuICAgIGxldCB4ID0gU3lzLm9wYXF1ZV9pZGVudGl0eSB4IGluXG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgeFxuICAgIGRvbmU7XG4gICAgdClcbjs7XG5cbmxldCBzaW5nbGV0b24gb2JqID0gY3JlYXRlIH5sZW46MSBvYmpcblxuKCogUHJlLWNvbmRpdGlvbjogdC4oaSkgaXMgYW4gaW50ZWdlci4gKilcbmxldCB1bnNhZmVfc2V0X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIG9iaiA9XG4gIGlmIENhbWwuT2JqLmlzX2ludCBvYmpcbiAgdGhlbiB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSAoQ2FtbC5PYmoub2JqIG9iaiA6IGludClcbiAgZWxzZVxuICAgICgqIFt0LihpKV0gaXMgYW4gaW50ZWdlciBhbmQgW29ial0gaXMgbm90LCBzbyB3ZSBkbyBub3QgbmVlZCB0byBjaGVjayBpZiB0aGV5IGFyZVxuICAgICAgIGVxdWFsLiAqKVxuICAgIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqXG47O1xuXG5sZXQgdW5zYWZlX3NldF9pbnQgdCBpIGludCA9XG4gIGxldCBvbGRfb2JqID0gdW5zYWZlX2dldCB0IGkgaW5cbiAgaWYgQ2FtbC5PYmouaXNfaW50IG9sZF9vYmpcbiAgdGhlbiB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSBpbnRcbiAgZWxzZSB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIChDYW1sLk9iai5yZXByIGludClcbjs7XG5cbmxldCB1bnNhZmVfY2xlYXJfaWZfcG9pbnRlciB0IGkgPVxuICBsZXQgb2xkX29iaiA9IHVuc2FmZV9nZXQgdCBpIGluXG4gIGlmIG5vdCAoQ2FtbC5PYmouaXNfaW50IG9sZF9vYmopIHRoZW4gdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSAoQ2FtbC5PYmoucmVwciAwKVxuOztcblxuKCoqIFt1bnNhZmVfYmxpdF0gaXMgbGlrZSBbQXJyYXkuYmxpdF0sIGV4Y2VwdCBpdCB1c2VzIG91ciBvd24gZm9yLWxvb3AgdG8gYXZvaWRcbiAgICBjYW1sX21vZGlmeSB3aGVuIHBvc3NpYmxlLiAgSXRzIHBlcmZvcm1hbmNlIGlzIHN0aWxsIG5vdCBjb21wYXJhYmxlIHRvIGEgbWVtY3B5LiAqKVxubGV0IHVuc2FmZV9ibGl0IH5zcmMgfnNyY19wb3MgfmRzdCB+ZHN0X3BvcyB+bGVuID1cbiAgKCogV2hlbiBbcGh5c19lcXVhbCBzcmMgZHN0XSwgd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIFtkc3RfcG9zIDwgc3JjX3Bvc10gYW5kIGhhdmUgdGhlXG4gICAgIGZvciBsb29wIGdvIGluIHRoZSByaWdodCBkaXJlY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgZGF0YSB0aGF0IHdlIHN0aWxsIG5lZWRcbiAgICAgdG8gcmVhZC4gIFdoZW4gW25vdCAocGh5c19lcXVhbCBzcmMgZHN0KV0sIGRvaW5nIHRoaXMgaXMgaGFybWxlc3MuICBGcm9tIGFcbiAgICAgbWVtb3J5LXBlcmZvcm1hbmNlIHBlcnNwZWN0aXZlLCBpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIG9uZSBsb29wcyB1cCBvciBkb3duLlxuICAgICBDb25zdGFudC1zdHJpZGUgYWNjZXNzLCBmb3J3YXJkIG9yIGJhY2t3YXJkLCBzaG91bGQgYmUgaW5kaXN0aW5ndWlzaGFibGUgKGF0IGxlYXN0IG9uXG4gICAgIGFuIGludGVsIGk3KS4gIFNvLCB3ZSBkb24ndCBkbyBhIGNoZWNrIGZvciBbcGh5c19lcXVhbCBzcmMgZHN0XSBhbmQgYWx3YXlzIGxvb3AgdXAgaW5cbiAgICAgdGhhdCBjYXNlLiAqKVxuICBpZiBkc3RfcG9zIDwgc3JjX3Bvc1xuICB0aGVuXG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgZHN0IChkc3RfcG9zICsgaSkgKHVuc2FmZV9nZXQgc3JjIChzcmNfcG9zICsgaSkpXG4gICAgZG9uZVxuICBlbHNlXG4gICAgZm9yIGkgPSBsZW4gLSAxIGRvd250byAwIGRvXG4gICAgICB1bnNhZmVfc2V0IGRzdCAoZHN0X3BvcyArIGkpICh1bnNhZmVfZ2V0IHNyYyAoc3JjX3BvcyArIGkpKVxuICAgIGRvbmVcbjs7XG5cbmluY2x1ZGUgQmxpdC5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IGNyZWF0ZSA9IGNyZWF0ZV96ZXJvXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0XG4gIGVuZClcblxubGV0IGNvcHkgc3JjID1cbiAgbGV0IGRzdCA9IGNyZWF0ZV96ZXJvIH5sZW46KGxlbmd0aCBzcmMpIGluXG4gIGJsaXRvIH5zcmMgfmRzdCAoKTtcbiAgZHN0XG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbigqIFdBUk5JTkc6XG4gICBXZSB1c2Ugbm9uLW1lbW9yeS1zYWZlIHRoaW5ncyB0aHJvdWdob3V0IHRoZSBbVHJ1c3RlZF0gbW9kdWxlLlxuICAgTW9zdCBvZiBpdCBpcyBvbmx5IHNhZmUgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgdHlwZSBzaWduYXR1cmUgKGUuZy4gZXhwb3NpbmdcbiAgIFt2YWwgY29weSA6ICdhIHQgLT4gJ2IgdF0gd291bGQgYmUgYSBiaWcgbWlzdGFrZSkuICopXG5tb2R1bGUgVHJ1c3RlZCA6IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgZW1wdHkgOiAnYSB0XG4gIHZhbCB1bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQgOiBsZW46aW50IC0+ICdhIHRcbiAgdmFsIGNyZWF0ZV9vYmpfYXJyYXkgOiBsZW46aW50IC0+ICdhIHRcbiAgdmFsIGNyZWF0ZSA6IGxlbjppbnQgLT4gJ2EgLT4gJ2EgdFxuICB2YWwgc2luZ2xldG9uIDogJ2EgLT4gJ2EgdFxuICB2YWwgZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2FcbiAgdmFsIHNldCA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHN3YXAgOiBfIHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4gIHZhbCB1bnNhZmVfZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2FcbiAgdmFsIHVuc2FmZV9zZXQgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCB1bnNhZmVfc2V0X29taXRfcGh5c19lcXVhbF9jaGVjayA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9zZXRfaW50IDogJ2EgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgOiAnYSB0IC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICB2YWwgdW5zYWZlX3NldF9hc3N1bWluZ19jdXJyZW50bHlfaW50IDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgc2V0X3dpdGhfY2FtbF9tb2RpZnkgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICB2YWwgdW5zYWZlX2JsaXQgOiAoJ2EgdCwgJ2EgdCkgQmxpdC5ibGl0XG4gIHZhbCBjb3B5IDogJ2EgdCAtPiAnYSB0XG4gIHZhbCB1bnNhZmVfY2xlYXJfaWZfcG9pbnRlciA6IF8gdCAtPiBpbnQgLT4gdW5pdFxuZW5kID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9IE9ial9hcnJheS50XG5cbiAgbGV0IGVtcHR5ID0gT2JqX2FycmF5LmVtcHR5XG4gIGxldCB1bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQgfmxlbiA9IE9ial9hcnJheS5jcmVhdGVfemVybyB+bGVuXG4gIGxldCBjcmVhdGVfb2JqX2FycmF5IH5sZW4gPSBPYmpfYXJyYXkuY3JlYXRlX3plcm8gfmxlblxuICBsZXQgY3JlYXRlIH5sZW4geCA9IE9ial9hcnJheS5jcmVhdGUgfmxlbiAoQ2FtbC5PYmoucmVwciB4KVxuICBsZXQgc2luZ2xldG9uIHggPSBPYmpfYXJyYXkuc2luZ2xldG9uIChDYW1sLk9iai5yZXByIHgpXG4gIGxldCBzd2FwIHQgaSBqID0gT2JqX2FycmF5LnN3YXAgdCBpIGpcbiAgbGV0IGdldCBhcnIgaSA9IENhbWwuT2JqLm9iaiAoT2JqX2FycmF5LmdldCBhcnIgaSlcbiAgbGV0IHNldCBhcnIgaSB4ID0gT2JqX2FycmF5LnNldCBhcnIgaSAoQ2FtbC5PYmoucmVwciB4KVxuICBsZXQgdW5zYWZlX2dldCBhcnIgaSA9IENhbWwuT2JqLm9iaiAoT2JqX2FycmF5LnVuc2FmZV9nZXQgYXJyIGkpXG4gIGxldCB1bnNhZmVfc2V0IGFyciBpIHggPSBPYmpfYXJyYXkudW5zYWZlX3NldCBhcnIgaSAoQ2FtbC5PYmoucmVwciB4KVxuICBsZXQgdW5zYWZlX3NldF9pbnQgYXJyIGkgeCA9IE9ial9hcnJheS51bnNhZmVfc2V0X2ludCBhcnIgaSB4XG5cbiAgbGV0IHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgYXJyIGkgeCA9XG4gICAgT2JqX2FycmF5LnVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgYXJyIGkgeFxuICA7O1xuXG4gIGxldCB1bnNhZmVfc2V0X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgYXJyIGkgeCA9XG4gICAgT2JqX2FycmF5LnVuc2FmZV9zZXRfYXNzdW1pbmdfY3VycmVudGx5X2ludCBhcnIgaSAoQ2FtbC5PYmoucmVwciB4KVxuICA7O1xuXG4gIGxldCBsZW5ndGggPSBPYmpfYXJyYXkubGVuZ3RoXG4gIGxldCB1bnNhZmVfYmxpdCA9IE9ial9hcnJheS51bnNhZmVfYmxpdFxuICBsZXQgY29weSA9IE9ial9hcnJheS5jb3B5XG5cbiAgbGV0IHVuc2FmZV9zZXRfb21pdF9waHlzX2VxdWFsX2NoZWNrIHQgaSB4ID1cbiAgICBPYmpfYXJyYXkudW5zYWZlX3NldF9vbWl0X3BoeXNfZXF1YWxfY2hlY2sgdCBpIChDYW1sLk9iai5yZXByIHgpXG4gIDs7XG5cbiAgbGV0IHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgeCA9XG4gICAgT2JqX2FycmF5LnVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgKENhbWwuT2JqLnJlcHIgeClcbiAgOztcblxuICBsZXQgc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIHggPSBPYmpfYXJyYXkuc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIChDYW1sLk9iai5yZXByIHgpXG4gIGxldCB1bnNhZmVfY2xlYXJfaWZfcG9pbnRlciA9IE9ial9hcnJheS51bnNhZmVfY2xlYXJfaWZfcG9pbnRlclxuZW5kXG5cbmluY2x1ZGUgVHJ1c3RlZFxuXG5sZXQgaW52YXJpYW50IHQgPSBhc3NlcnQgKENhbWwuT2JqLnRhZyAoQ2FtbC5PYmoucmVwciB0KSA8PiBDYW1sLk9iai5kb3VibGVfYXJyYXlfdGFnKVxuXG5sZXQgaW5pdCBsIH5mID1cbiAgaWYgbCA8IDBcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlVuaWZvcm1fYXJyYXkuaW5pdFwiXG4gIGVsc2UgKFxuICAgIGxldCByZXMgPSB1bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQgfmxlbjpsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IHJlcyBpIChmIGkpXG4gICAgZG9uZTtcbiAgICByZXMpXG47O1xuXG5sZXQgb2ZfYXJyYXkgYXJyID0gaW5pdCB+ZjooQXJyYXkudW5zYWZlX2dldCBhcnIpIChBcnJheS5sZW5ndGggYXJyKVxubGV0IG1hcCBhIH5mID0gaW5pdCB+ZjooZnVuIGkgLT4gZiAodW5zYWZlX2dldCBhIGkpKSAobGVuZ3RoIGEpXG5sZXQgbWFwaSBhIH5mID0gaW5pdCB+ZjooZnVuIGkgLT4gZiBpICh1bnNhZmVfZ2V0IGEgaSkpIChsZW5ndGggYSlcblxubGV0IGl0ZXIgYSB+ZiA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICBmICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZVxuOztcblxubGV0IGl0ZXJpIGEgfmYgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgZiBpICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZVxuOztcblxubGV0IGZvbGRpIGEgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIGFjYyA6PSBmIGkgIWFjYyAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmU7XG4gICFhY2Ncbjs7XG5cbmxldCB0b19saXN0IHQgPSBMaXN0LmluaXQgfmY6KGdldCB0KSAobGVuZ3RoIHQpXG5cbmxldCBvZl9saXN0IGwgPVxuICBsZXQgbGVuID0gTGlzdC5sZW5ndGggbCBpblxuICBsZXQgcmVzID0gdW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIH5sZW4gaW5cbiAgTGlzdC5pdGVyaSBsIH5mOihmdW4gaSB4IC0+IHNldCByZXMgaSB4KTtcbiAgcmVzXG47O1xuXG4oKiBJdCBpcyBub3Qgc2FmZSBmb3IgW3RvX2FycmF5XSB0byBiZSB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gYmVjYXVzZSB3ZSBoYXZlIGNvZGUgdGhhdFxuICAgcmVsaWVzIG9uIFtmbG9hdCBhcnJheV1zIGJlaW5nIHVuYm94ZWQsIGZvciBleGFtcGxlIGluIFtiaW5fd3JpdGVfYXJyYXldLiAqKVxubGV0IHRvX2FycmF5IHQgPSBBcnJheS5pbml0IChsZW5ndGggdCkgfmY6KGZ1biBpIC0+IHVuc2FmZV9nZXQgdCBpKVxuXG5sZXQgZXhpc3RzIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgdCB+ZiBpID1cbiAgICBpZiBpIDwgMCB0aGVuIGZhbHNlIGVsc2UgZiAodW5zYWZlX2dldCB0IGkpIHx8IGxvb3AgdCB+ZiAoaSAtIDEpXG4gIGluXG4gIGxvb3AgdCB+ZiAobGVuZ3RoIHQgLSAxKVxuOztcblxubGV0IGZvcl9hbGwgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCB0IH5mIGkgPSBpZiBpIDwgMCB0aGVuIHRydWUgZWxzZSBmICh1bnNhZmVfZ2V0IHQgaSkgJiYgbG9vcCB0IH5mIChpIC0gMSkgaW5cbiAgbG9vcCB0IH5mIChsZW5ndGggdCAtIDEpXG47O1xuXG5sZXQgbWFwMl9leG4gdDEgdDIgfmYgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHQxIGluXG4gIGlmIGxlbmd0aCB0MiA8PiBsZW4gdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5Lm1hcDJfZXhuXCI7XG4gIGluaXQgbGVuIH5mOihmdW4gaSAtPiBmICh1bnNhZmVfZ2V0IHQxIGkpICh1bnNhZmVfZ2V0IHQyIGkpKVxuOztcblxubGV0IHRfc2V4cF9ncmFtbWFyICh0eXBlIGVsdCkgKGdyYW1tYXIgOiBlbHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogZWx0IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChBcnJheS50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuOztcblxuaW5jbHVkZVxuICBTZXhwYWJsZS5PZl9zZXhwYWJsZTFcbiAgICAoQXJyYXkpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgICAgbGV0IHRvX3NleHBhYmxlID0gdG9fYXJyYXlcbiAgICAgIGxldCBvZl9zZXhwYWJsZSA9IG9mX2FycmF5XG4gICAgZW5kKVxuXG5pbmNsdWRlIEJsaXQuTWFrZTEgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG5cbiAgICBsZXQgY3JlYXRlX2xpa2UgfmxlbiB0ID1cbiAgICAgIGlmIGxlbiA9IDBcbiAgICAgIHRoZW4gZW1wdHlcbiAgICAgIGVsc2UgKFxuICAgICAgICBhc3NlcnQgKGxlbmd0aCB0ID4gMCk7XG4gICAgICAgIGNyZWF0ZSB+bGVuIChnZXQgdCAwKSlcbiAgICA7O1xuXG4gICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRcbiAgZW5kKVxuXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgbGV0IHIgPSByZWYgaW5pdCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IHQgaSlcbiAgZG9uZTtcbiAgIXJcbjs7XG5cbmxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5sZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuXG4oKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcHhfY29tcGFyZSBbY29tcGFyZV9hcnJheV0gYnV0IHVzZXMgb3VyIFt1bnNhZmVfZ2V0XSBhbmQgW2xlbmd0aF0uICopXG5sZXQgY29tcGFyZSBjb21wYXJlX2VsdCBhIGIgPVxuICBpZiBwaHlzX2VxdWFsIGEgYlxuICB0aGVuIDBcbiAgZWxzZSAoXG4gICAgbGV0IGxlbl9hID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgbGVuX2IgPSBsZW5ndGggYiBpblxuICAgIGxldCByZXQgPSBjb21wYXJlIGxlbl9hIGxlbl9iIGluXG4gICAgaWYgcmV0IDw+IDBcbiAgICB0aGVuIHJldFxuICAgIGVsc2UgKFxuICAgICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgICBpZiBpID0gbGVuX2FcbiAgICAgICAgdGhlbiAwXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCBsID0gdW5zYWZlX2dldCBhIGlcbiAgICAgICAgICBhbmQgciA9IHVuc2FmZV9nZXQgYiBpIGluXG4gICAgICAgICAgbGV0IHJlcyA9IGNvbXBhcmVfZWx0IGwgciBpblxuICAgICAgICAgIGlmIHJlcyA8PiAwIHRoZW4gcmVzIGVsc2UgbG9vcCAoaSArIDEpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgMCkpXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgY2VpbCA9IENhbWwuY2VpbFxubGV0IGZsb29yID0gQ2FtbC5mbG9vclxubGV0IG1vZF9mbG9hdCA9IENhbWwubW9kX2Zsb2F0XG5sZXQgbW9kZiA9IENhbWwubW9kZlxubGV0IGZsb2F0X29mX3N0cmluZyA9IENhbWwuZmxvYXRfb2Zfc3RyaW5nXG5sZXQgbmFuID0gQ2FtbC5uYW5cbmxldCBpbmZpbml0eSA9IENhbWwuaW5maW5pdHlcbmxldCBuZWdfaW5maW5pdHkgPSBDYW1sLm5lZ19pbmZpbml0eVxubGV0IG1heF9maW5pdGVfdmFsdWUgPSBDYW1sLm1heF9mbG9hdFxubGV0IGVwc2lsb25fZmxvYXQgPSBDYW1sLmVwc2lsb25fZmxvYXRcbmxldCBjbGFzc2lmeV9mbG9hdCA9IENhbWwuY2xhc3NpZnlfZmxvYXRcbmxldCBhYnNfZmxvYXQgPSBDYW1sLmFic19mbG9hdFxubGV0IGlzX2ludGVnZXIgPSBDYW1sLkZsb2F0LmlzX2ludGVnZXJcbmxldCAoICoqICkgPSBDYW1sLiggKiogKVxuXG5sZXQgKCAlLiApIGEgYiA9XG4gICgqIFJhaXNlIGluIGNhc2Ugb2YgYSBuZWdhdGl2ZSBtb2R1bHVzLCBhcyBkb2VzIEludC4oICUgKS4gKilcbiAgaWYgYiA8IDAuXG4gIHRoZW4gUHJpbnRmLmludmFsaWRfYXJnZiBcIiVmICUlICVmIGluIGZsb2F0MC5tbDogbW9kdWx1cyBzaG91bGQgYmUgcG9zaXRpdmVcIiBhIGIgKCk7XG4gIGxldCBtID0gQ2FtbC5tb2RfZmxvYXQgYSBiIGluXG4gICgqIFByb2R1Y2UgYSBub24tbmVnYXRpdmUgcmVzdWx0IGluIGFuYWxvZ3kgd2l0aCBJbnQuKCAlICkuICopXG4gIGlmIG0gPCAwLiB0aGVuIG0gKy4gYiBlbHNlIG1cbjs7XG5cbigqIFRoZSBiaXRzIG9mIElOUklBJ3MgW1BlcnZhc2l2ZXNdIHRoYXQgd2UganVzdCB3YW50IHRvIGV4cG9zZSBpbiBbRmxvYXRdLiBNb3N0IGFyZVxuICAgYWxyZWFkeSBkZXByZWNhdGVkIGluIFtQZXJ2YXNpdmVzXSwgYW5kIGV2ZW50dWFsbHkgYWxsIG9mIHRoZW0gc2hvdWxkIGJlLiAqKVxuaW5jbHVkZSAoXG4gIENhbWwgOlxuICBzaWdcbiAgICBleHRlcm5hbCBmcmV4cCA6IGZsb2F0IC0+IGZsb2F0ICogaW50ID0gXCJjYW1sX2ZyZXhwX2Zsb2F0XCJcblxuICAgIGV4dGVybmFsIGxkZXhwXG4gICAgICA6ICAoZmxvYXRbQHVuYm94ZWRdKVxuICAgICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgICAgLT4gKGZsb2F0W0B1bmJveGVkXSlcbiAgICAgID0gXCJjYW1sX2xkZXhwX2Zsb2F0XCIgXCJjYW1sX2xkZXhwX2Zsb2F0X3VuYm94ZWRcIlxuICAgIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBsb2cxMCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzEwX2Zsb2F0XCIgXCJsb2cxMFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBleHBtMSA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2V4cG0xX2Zsb2F0XCIgXCJjYW1sX2V4cG0xXCJcbiAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgbG9nMXAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxcF9mbG9hdFwiIFwiY2FtbF9sb2cxcFwiXG4gICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGNvcHlzaWduIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIHRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Rhbl9mbG9hdFwiIFwidGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgYXNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2FzaW5fZmxvYXRcIiBcImFzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuX2Zsb2F0XCIgXCJhdGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbjJfZmxvYXRcIiBcImF0YW4yXCJcbiAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgaHlwb3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiXG4gICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NoX2Zsb2F0XCIgXCJjb3NoXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBzaW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luaF9mbG9hdFwiIFwic2luaFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RhbmhfZmxvYXRcIiBcInRhbmhcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIHNxcnQgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zcXJ0X2Zsb2F0XCIgXCJzcXJ0XCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBleHAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBfZmxvYXRcIiBcImV4cFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgbG9nIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nX2Zsb2F0XCIgXCJsb2dcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICBlbmQpXG5cbigqIFdlIG5lZWQgdGhpcyBpbmRpcmVjdGlvbiBiZWNhdXNlIHRoZXNlIGFyZSBleHBvc2VkIGFzIFwidmFsXCIgaW5zdGVhZCBvZiBcImV4dGVybmFsXCIgKilcbmxldCBmcmV4cCA9IGZyZXhwXG5sZXQgbGRleHAgPSBsZGV4cFxubGV0IGlzX25hbiB4ID0gKHggOiBmbG9hdCkgPD4geFxuXG4oKiBBbiBvcmRlci1wcmVzZXJ2aW5nIGJpamVjdGlvbiBiZXR3ZWVuIGFsbCBmbG9hdHMgZXhjZXB0IGZvciBOYU5zLCBhbmQgOTkuOTUlIG9mXG4gICBpbnQ2NHMuXG5cbiAgIE5vdGUgd2UgZG9uJ3QgZGlzdGluZ3Vpc2ggMC4gYW5kIC0wLiBhcyBzZXBhcmF0ZSB2YWx1ZXMgaGVyZSwgdGhleSBib3RoIG1hcCB0byAwTCwgd2hpY2hcbiAgIG1hcHMgYmFjayB0byAwLlxuXG4gICBUaGlzIHNob3VsZCB3b3JrIGJvdGggb24gbGl0dGxlLWVuZGlhbiBhbmQgaGlnaC1lbmRpYW4gQ1BVcy4gIFdpa2lwZWRpYSBzYXlzOiBcIm9uXG4gICBtb2Rlcm4gc3RhbmRhcmQgY29tcHV0ZXJzIChpLmUuLCBpbXBsZW1lbnRpbmcgSUVFRSA3NTQpLCBvbmUgbWF5IGluIHByYWN0aWNlIHNhZmVseVxuICAgYXNzdW1lIHRoYXQgdGhlIGVuZGlhbm5lc3MgaXMgdGhlIHNhbWUgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgYXMgZm9yIGludGVnZXJzXCJcbiAgIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VuZGlhbm5lc3MjRmxvYXRpbmctcG9pbnRfYW5kX2VuZGlhbm5lc3MpLlxuKilcbmxldCB0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlciB0ID1cbiAgaWYgaXNfbmFuIHRcbiAgdGhlbiBOb25lXG4gIGVsc2UgaWYgdCA9IDAuXG4gIHRoZW4gKCogYWxzbyBpbmNsdWRlcyAtMC4gKilcbiAgICBTb21lIDBMXG4gIGVsc2UgaWYgdCA+IDAuXG4gIHRoZW4gU29tZSAoQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0IHQpXG4gIGVsc2UgU29tZSAoQ2FtbC5JbnQ2NC5uZWcgKENhbWwuSW50NjQuYml0c19vZl9mbG9hdCAoLS50KSkpXG47O1xuXG5sZXQgdG9faW50NjRfcHJlc2VydmVfb3JkZXJfZXhuIHggPSBPcHRpb24udmFsdWVfZXhuICh0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlciB4KVxuXG5sZXQgb2ZfaW50NjRfcHJlc2VydmVfb3JkZXIgeCA9XG4gIGlmIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgeCAwTFxuICB0aGVuIENhbWwuSW50NjQuZmxvYXRfb2ZfYml0cyB4XG4gIGVsc2Ugfi0uKENhbWwuSW50NjQuZmxvYXRfb2ZfYml0cyAoQ2FtbC5JbnQ2NC5uZWcgeCkpXG47O1xuXG5sZXQgb25lX3VscCBkaXIgdCA9XG4gIG1hdGNoIHRvX2ludDY0X3ByZXNlcnZlX29yZGVyIHQgd2l0aFxuICB8IE5vbmUgLT4gQ2FtbC5uYW5cbiAgfCBTb21lIHggLT5cbiAgICBvZl9pbnQ2NF9wcmVzZXJ2ZV9vcmRlclxuICAgICAgKENhbWwuSW50NjQuYWRkXG4gICAgICAgICB4XG4gICAgICAgICAobWF0Y2ggZGlyIHdpdGhcbiAgICAgICAgICB8IGBVcCAtPiAxTFxuICAgICAgICAgIHwgYERvd24gLT4gLTFMKSlcbjs7XG5cbigqIFt1cHBlcl9ib3VuZF9mb3JfaW50XSBhbmQgW2xvd2VyX2JvdW5kX2Zvcl9pbnRdIGFyZSBmb3IgY2FsY3VsYXRpbmcgdGhlIG1heC9taW4gZmxvYXRcbiAgIHRoYXQgZml0cyBpbiBhIGdpdmVuLXNpemUgaW50ZWdlciB3aGVuIHJvdW5kZWQgdG93YXJkcyAwICh1c2luZyBbaW50X29mX2Zsb2F0XSkuXG5cbiAgIG1heF9pbnQvbWluX2ludCBkZXBlbmQgb24gW251bV9iaXRzXSwgZS5nLiArLy0gMl4zMCwgKy8tIDJeNjIgaWYgMzEtYml0LCA2My1iaXRcbiAgIChyZXNwZWN0aXZlbHkpIHdoaWxlIGZsb2F0IGlzIElFRUUgc3RhbmRhcmQgZm9yIGRvdWJsZSAoNTIgc2lnbmlmaWNhbnQgYml0cykuXG5cbiAgIEluIGFsbCBjYXNlcywgd2Ugd2FudCB0byBndWFyYW50ZWUgdGhhdFxuICAgW2xvd2VyX2JvdW5kX2Zvcl9pbnQgPD0geCA8PSB1cHBlcl9ib3VuZF9mb3JfaW50XVxuICAgaWZmIFtpbnRfb2ZfZmxvYXQgeF0gZml0cyBpbiBhbiBpbnQgd2l0aCBbbnVtX2JpdHNdIGJpdHMuXG5cbiAgIFsyICoqIChudW1fYml0cyAtIDEpXSBpcyB0aGUgZmlyc3QgZmxvYXQgZ3JlYXRlciB0aGF0IG1heF9pbnQsIHdlIHVzZSB0aGUgcHJlY2VkaW5nXG4gICBmbG9hdCBhcyB1cHBlciBib3VuZC5cblxuICAgWy0gKDIgKiogKG51bV9iaXRzIC0gMSkpXSBpcyBlcXVhbCB0byBtaW5faW50LlxuICAgRm9yIGxvd2VyIGJvdW5kIHdlIGxvb2sgZm9yIHRoZSBzbWFsbGVzdCBmbG9hdCBbZl0gc2F0aXNmeWluZyBbZiA+IG1pbl9pbnQgLSAxXSBzbyB0aGF0XG4gICBbZl0gcm91bmRzIHRvd2FyZCB6ZXJvIHRvIFttaW5faW50XVxuXG4gICBTbyBpbiBwYXJ0aWN1bGFyIHdlIHdpbGwgaGF2ZTpcbiAgIFtsb3dlcl9ib3VuZF9mb3JfaW50IHggPD0gLSAoMiAqKiAoMS14KSldXG4gICBbdXBwZXJfYm91bmRfZm9yX2ludCB4ICA8ICAgIDIgKiogKDEteCkgXVxuKilcbmxldCB1cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzID1cbiAgbGV0IGV4cCA9IENhbWwuZmxvYXRfb2ZfaW50IChudW1fYml0cyAtIDEpIGluXG4gIG9uZV91bHAgYERvd24gKDIuICoqIGV4cClcbjs7XG5cbmxldCBpc194X21pbnVzX29uZV9leGFjdCB4ID1cbiAgKCogW3ggPSB4IC0uIDEuXSBkb2VzIG5vdCB3b3JrIHdpdGggeDg3IGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgYmFja2VuZCAod2hpY2ggaXMgdXNlZFxuICAgICBvbiAzMi1iaXQgb2NhbWwpIGJlY2F1c2Ugb2YgODAtYml0IHJlZ2lzdGVyIHByZWNpc2lvbiBvZiBpbnRlcm1lZGlhdGUgY29tcHV0YXRpb25zLlxuXG4gICAgIEFuIGFsdGVybmF0aXZlIHdheSBvZiBjb21wdXRpbmcgdGhpczogW3ggLS4gb25lX3VscCBgRG93biB4IDw9IDEuXSBpcyBhbHNvIHByb25lIHRvXG4gICAgIHRoZSBzYW1lIHByZWNpc2lvbiBpc3N1ZXM6IHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSBbeF0gaXMgNjQtYml0LlxuICAqKVxuICBsZXQgb3BlbiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgbm90IChDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgeCA9IENhbWwuSW50NjQuYml0c19vZl9mbG9hdCAoeCAtLiAxLikpXG47O1xuXG5sZXQgbG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0cyA9XG4gIGxldCBleHAgPSBDYW1sLmZsb2F0X29mX2ludCAobnVtX2JpdHMgLSAxKSBpblxuICBsZXQgbWluX2ludF9hc19mbG9hdCA9IH4tLigyLiAqKiBleHApIGluXG4gIGxldCBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgaWYgbnVtX2JpdHMgLSAxIDwgNTMgKCogNTMgPSAjYml0cyBpbiB0aGUgZmxvYXQncyBtYW50aXNzYSB3aXRoIHNpZ24gaW5jbHVkZWQgKilcbiAgdGhlbiAoXG4gICAgKCogVGhlIHNtYWxsZXN0IGZsb2F0IHRoYXQgcm91bmRzIHRvd2FyZHMgemVybyB0byBbbWluX2ludF0gaXNcbiAgICAgICBbbWluX2ludCAtIDEgKyBlcHNpbG9uXSAqKVxuICAgIGFzc2VydCAoaXNfeF9taW51c19vbmVfZXhhY3QgbWluX2ludF9hc19mbG9hdCk7XG4gICAgb25lX3VscCBgVXAgKG1pbl9pbnRfYXNfZmxvYXQgLS4gMS4pKVxuICBlbHNlIChcbiAgICAoKiBbbWluX2ludF9hc19mbG9hdF0gaXMgYWxyZWFkeSB0aGUgc21hbGxlc3QgZmxvYXQgW2ZdIHNhdGlzZnlpbmcgW2YgPiBtaW5faW50IC0gMV0uICopXG4gICAgYXNzZXJ0IChub3QgKGlzX3hfbWludXNfb25lX2V4YWN0IG1pbl9pbnRfYXNfZmxvYXQpKTtcbiAgICBtaW5faW50X2FzX2Zsb2F0KVxuOztcblxuKCogRmxvYXQgY2xhbXBpbmcgaXMgc3RydWN0dXJlZCBzbGlnaHRseSBkaWZmZXJlbnRseSB0aGFuIGNsYW1waW5nIGZvciBvdGhlciB0eXBlcywgc29cbiAgIHRoYXQgd2UgZ2V0IHRoZSBiZWhhdmlvciBvZiBbY2xhbXBfdW5jaGVja2VkIG5hbiB+bWluIH5tYXggPSBuYW5dIChmb3IgYW55IFttaW5dIGFuZFxuICAgW21heF0pIGZvciBmcmVlLlxuKilcbmxldCBjbGFtcF91bmNoZWNrZWQgKHQgOiBmbG9hdCkgfm1pbiB+bWF4ID1cbiAgaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIG1heCA8IHQgdGhlbiBtYXggZWxzZSB0XG47O1xuXG5sZXQgYm94ID1cbiAgKCogUHJldmVudCBwb3RlbnRpYWwgY29uc3RhbnQgZm9sZGluZyBvZiBbKy4gMC5dIGluIHRoZSBuZWFyIG9jYW1sb3B0IGZ1dHVyZS4gKilcbiAgbGV0IHggPSBTeXMwLm9wYXF1ZV9pZGVudGl0eSAwLiBpblxuICBmdW4gZiAtPiBmICsuIHhcbjs7XG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nMFxuaW5jbHVkZSBDaGFyMFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBjaGFyIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9jaGFyIDogdCAtPiB0IC0+IGludClcblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2NoYXJcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2NoYXIgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGNoYXJfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfY2hhciA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBjaGFyX3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IHRvX3N0cmluZyB0ID0gU3RyaW5nLm1ha2UgMSB0XG5cbiAgbGV0IG9mX3N0cmluZyBzID1cbiAgICBtYXRjaCBTdHJpbmcubGVuZ3RoIHMgd2l0aFxuICAgIHwgMSAtPiBzLlswXVxuICAgIHwgXyAtPiBmYWlsd2l0aGYgXCJDaGFyLm9mX3N0cmluZzogJVNcIiBzICgpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBUXG5cbmluY2x1ZGUgSWRlbnRpZmlhYmxlLk1ha2UgKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkNoYXJcIlxuICBlbmQpXG5cbmxldCBwcCBmbXQgYyA9IENhbWwuRm9ybWF0LmZwcmludGYgZm10IFwiJUNcIiBjXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIENoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgYWxsID0gQXJyYXkuaW5pdCAyNTYgfmY6dW5zYWZlX29mX2ludCB8PiBBcnJheS50b19saXN0XG5cbmxldCBpc19sb3dlcmNhc2UgPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc191cHBlcmNhc2UgPSBmdW5jdGlvblxuICB8ICdBJyAuLiAnWicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19wcmludCA9IGZ1bmN0aW9uXG4gIHwgJyAnIC4uICd+JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX3doaXRlc3BhY2UgPSBmdW5jdGlvblxuICB8ICdcXHQnIHwgJ1xcbicgfCAnXFwwMTEnICgqIHZlcnRpY2FsIHRhYiAqKSB8ICdcXDAxMicgKCogZm9ybSBmZWVkICopIHwgJ1xccicgfCAnICcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX2FscGhhID0gZnVuY3Rpb25cbiAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxuKCogV3JpdGluZyB0aGVzZSBvdXQsIGluc3RlYWQgb2YgY2FsbGluZyBbaXNfYWxwaGFdIGFuZCBbaXNfZGlnaXRdLCByZWR1Y2VzXG4gICBydW50aW1lIGJ5IGFwcHJveC4gMzAlICopXG5sZXQgaXNfYWxwaGFudW0gPSBmdW5jdGlvblxuICB8ICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJzAnIC4uICc5JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGdldF9kaWdpdF91bnNhZmUgdCA9IHRvX2ludCB0IC0gdG9faW50ICcwJ1xuXG5sZXQgZ2V0X2RpZ2l0X2V4biB0ID1cbiAgaWYgaXNfZGlnaXQgdFxuICB0aGVuIGdldF9kaWdpdF91bnNhZmUgdFxuICBlbHNlIGZhaWx3aXRoZiBcIkNoYXIuZ2V0X2RpZ2l0X2V4biAlQzogbm90IGEgZGlnaXRcIiB0ICgpXG47O1xuXG5sZXQgZ2V0X2RpZ2l0IHQgPSBpZiBpc19kaWdpdCB0IHRoZW4gU29tZSAoZ2V0X2RpZ2l0X3Vuc2FmZSB0KSBlbHNlIE5vbmVcblxubGV0IGlzX2hleF9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfaGV4X2RpZ2l0X2xvd2VyID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX2hleF9kaWdpdF91cHBlciA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyB8ICdBJyAuLiAnRicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBnZXRfaGV4X2RpZ2l0X2V4biA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyBhcyB0IC0+IHRvX2ludCB0IC0gdG9faW50ICcwJ1xuICB8ICdhJyAuLiAnZicgYXMgdCAtPiB0b19pbnQgdCAtIHRvX2ludCAnYScgKyAxMFxuICB8ICdBJyAuLiAnRicgYXMgdCAtPiB0b19pbnQgdCAtIHRvX2ludCAnQScgKyAxMFxuICB8IHQgLT5cbiAgICBFcnJvci5yYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcIkNoYXIuZ2V0X2hleF9kaWdpdF9leG46IG5vdCBhIGhleGFkZWNpbWFsIGRpZ2l0XCJcbiAgICAgICAgIFsgXCJjaGFyXCIsIHNleHBfb2ZfdCB0IF0pXG47O1xuXG5sZXQgZ2V0X2hleF9kaWdpdCB0ID0gaWYgaXNfaGV4X2RpZ2l0IHQgdGhlbiBTb21lIChnZXRfaGV4X2RpZ2l0X2V4biB0KSBlbHNlIE5vbmVcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgbGV0ICggPj0gKSA9ICggPj0gKVxuICBsZXQgKCA8PSApID0gKCA8PSApXG4gIGxldCAoID0gKSA9ICggPSApXG4gIGxldCAoID4gKSA9ICggPiApXG4gIGxldCAoIDwgKSA9ICggPCApXG4gIGxldCAoIDw+ICkgPSAoIDw+IClcbmVuZFxuXG5tb2R1bGUgQ2FzZWxlc3MgPSBzdHJ1Y3RcbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBjaGFyIFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgICBsZXQgdF9vZl9zZXhwID0gKGNoYXJfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICAgIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9jaGFyIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gY2hhcl9zZXhwX2dyYW1tYXJcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgY29tcGFyZSBjMSBjMiA9IGNvbXBhcmUgKGxvd2VyY2FzZSBjMSkgKGxvd2VyY2FzZSBjMilcbiAgICBsZXQgaGFzaF9mb2xkX3Qgc3RhdGUgdCA9IGhhc2hfZm9sZF9jaGFyIHN0YXRlIChsb3dlcmNhc2UgdClcbiAgICBsZXQgaGFzaCB0ID0gSGFzaC5ydW4gaGFzaF9mb2xkX3QgdFxuICBlbmRcblxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBDb21wYXJhYmxlLk1ha2UgKFQpXG5lbmRcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIENoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJtb2R1bGUgTGlzdCA9IExpc3RcblxubW9kdWxlIEVudW1lcmFibGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGFsbCA6IHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2EgdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYiBsaXN0IC0+ICgnYSwgJ2IpIHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdiIGxpc3QgLT4gJ2MgbGlzdCAtPiAoJ2EsICdiLCAnYykgdCBsaXN0XG4gIGVuZFxuZW5kXG4iLCJvcGVuISBJbXBvcnQwLkludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbm1vZHVsZSBCeXRlcyA9IEJ5dGVzMFxubW9kdWxlIFN0cmluZyA9IFN0cmluZzBcblxuKCogQ29uc3RydWN0IGEgYnl0ZSBzdHJpbmcgb2YgbGVuZ3RoIDI1NiwgbWFwcGluZyBldmVyeSBpbnB1dCBjaGFyYWN0ZXIgY29kZSB0b1xuICAgaXRzIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGNoYXJhY3Rlci5cblxuICAgQmVuY2htYXJrcyBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgZmFzdGVyIHRoYW4gdGhlIGxhbWJkYSAoaW5jbHVkaW5nIGNvc3Qgb2ZcbiAgIHRoaXMgZnVuY3Rpb24pLCBldmVuIGlmIHRhcmdldC9yZXBsYWNlbWVudCBhcmUganVzdCAyIGNoYXJhY3RlcnMgZWFjaC5cblxuICAgUmV0dXJuIE5vbmUgaWYgdGhlIHRyYW5zbGF0aW9uIG1hcCBpcyBlcXVpdmFsZW50IHRvIGp1c3QgdGhlIGlkZW50aXR5LiAqKVxubGV0IHRyX2NyZWF0ZV9tYXAgfnRhcmdldCB+cmVwbGFjZW1lbnQgPVxuICBsZXQgdHJfbWFwID0gQnl0ZXMuY3JlYXRlIDI1NiBpblxuICBmb3IgaSA9IDAgdG8gMjU1IGRvXG4gICAgQnl0ZXMudW5zYWZlX3NldCB0cl9tYXAgaSAoQ2hhci5vZl9pbnRfZXhuIGkpXG4gIGRvbmU7XG4gIGZvciBpID0gMCB0byBtaW4gKFN0cmluZy5sZW5ndGggdGFyZ2V0KSAoU3RyaW5nLmxlbmd0aCByZXBsYWNlbWVudCkgLSAxIGRvXG4gICAgbGV0IGluZGV4ID0gQ2hhci50b19pbnQgKFN0cmluZy51bnNhZmVfZ2V0IHRhcmdldCBpKSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgdHJfbWFwIGluZGV4IChTdHJpbmcudW5zYWZlX2dldCByZXBsYWNlbWVudCBpKVxuICBkb25lO1xuICBsZXQgbGFzdF9yZXBsYWNlbWVudCA9IFN0cmluZy51bnNhZmVfZ2V0IHJlcGxhY2VtZW50IChTdHJpbmcubGVuZ3RoIHJlcGxhY2VtZW50IC0gMSkgaW5cbiAgZm9yXG4gICAgaSA9IG1pbiAoU3RyaW5nLmxlbmd0aCB0YXJnZXQpIChTdHJpbmcubGVuZ3RoIHJlcGxhY2VtZW50KSB0byBTdHJpbmcubGVuZ3RoIHRhcmdldCAtIDFcbiAgZG9cbiAgICBsZXQgaW5kZXggPSBDaGFyLnRvX2ludCAoU3RyaW5nLnVuc2FmZV9nZXQgdGFyZ2V0IGkpIGluXG4gICAgQnl0ZXMudW5zYWZlX3NldCB0cl9tYXAgaW5kZXggbGFzdF9yZXBsYWNlbWVudFxuICBkb25lO1xuICBsZXQgcmVjIGhhdmVfYW55X2RpZmZlcmVudCB0cl9tYXAgaSA9XG4gICAgaWYgaSA9IDI1NlxuICAgIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIENoYXIuKCA8PiApIChCeXRlczAudW5zYWZlX2dldCB0cl9tYXAgaSkgKENoYXIub2ZfaW50X2V4biBpKVxuICAgIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaGF2ZV9hbnlfZGlmZmVyZW50IHRyX21hcCAoaSArIDEpXG4gIGluXG4gICgqIHF1aWNrIGNoZWNrIG9uIHRoZSBmaXJzdCB0YXJnZXQgY2hhcmFjdGVyIHdoaWNoIHdpbGwgOTklIGJlIHRydWUgKilcbiAgbGV0IGZpcnN0X3RhcmdldCA9IHRhcmdldC5bMF0gaW5cbiAgaWYgQ2hhci4oIDw+ICkgKEJ5dGVzMC51bnNhZmVfZ2V0IHRyX21hcCAoQ2hhci50b19pbnQgZmlyc3RfdGFyZ2V0KSkgZmlyc3RfdGFyZ2V0XG4gIHx8IGhhdmVfYW55X2RpZmZlcmVudCB0cl9tYXAgMFxuICB0aGVuIFNvbWUgKEJ5dGVzMC51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnRyX21hcClcbiAgZWxzZSBOb25lXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgJ2EgdCA9ICdhXG5cbmxldCBzdGFnZSA9IEZuLmlkXG5sZXQgdW5zdGFnZSA9IEZuLmlkXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxuaW5jbHVkZSBTdHJpbmcwXG5tb2R1bGUgQnl0ZXMgPSBCeXRlczBcbigqIFRoaXMgYWxpYXMgaXMgbmVjZXNzYXJ5IGRlc3BpdGUgW1N0cmluZzBdIGRlZmluaW5nIFtCeXRlcyA9IEJ5dGVzMF0sIGluIG9yZGVyIHRvXG4gICBjb252aW5jZSBvY2FtbGRlcCB0aGF0IHRoaXMgZmlsZSBkb2Vzbid0IGRlcGVuZCBvbiBieXRlcy5tbC4gKilcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xubGV0IHN0YWdlID0gU3RhZ2VkLnN0YWdlXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IHN0cmluZyBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfc3RyaW5nXG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9zdHJpbmcgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKHN0cmluZ19vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9zdHJpbmcgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gc3RyaW5nX3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgY29tcGFyZSA9IGNvbXBhcmVcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG50eXBlIGVsdCA9IGNoYXJcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcblxuKCogVGhpcyBpcyBjb3BpZWQvYWRhcHRlZCBmcm9tICdibGl0Lm1sJy5cbiAgIFtzdWJdLCBbc3Vib10gY291bGQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgW0JsaXQuTWFrZShCeXRlcyldIHBsdXMgdW5zYWZlIGNhc3RzIHRvL2Zyb21cbiAgIHN0cmluZyBidXQgd2VyZSBpbmxpbmVkIGhlcmUgdG8gYXZvaWQgdXNpbmcgW0J5dGVzLnVuc2FmZV9vZl9zdHJpbmddIGFzIG11Y2ggYXMgcG9zc2libGUuXG4qKVxubGV0IHN1YiBzcmMgfnBvcyB+bGVuID1cbiAgaWYgcG9zID0gMCAmJiBsZW4gPSBTdHJpbmcubGVuZ3RoIHNyY1xuICB0aGVuIHNyY1xuICBlbHNlIChcbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoOihsZW5ndGggc3JjKTtcbiAgICBpZiBsZW4gPSAwXG4gICAgdGhlbiBcIlwiXG4gICAgZWxzZSAoXG4gICAgICBsZXQgZHN0ID0gQnl0ZXMuY3JlYXRlIGxlbiBpblxuICAgICAgQnl0ZXMudW5zYWZlX2JsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3M6cG9zIH5kc3QgfmRzdF9wb3M6MCB+bGVuO1xuICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpkc3QpKVxuOztcblxubGV0IHN1Ym8gPyhwb3MgPSAwKSA/bGVuIHNyYyA9XG4gIHN1YlxuICAgIHNyY1xuICAgIH5wb3NcbiAgICB+bGVuOlxuICAgICAgKG1hdGNoIGxlbiB3aXRoXG4gICAgICAgfCBTb21lIGkgLT4gaVxuICAgICAgIHwgTm9uZSAtPiBsZW5ndGggc3JjIC0gcG9zKVxuOztcblxubGV0IHJlYyBjb250YWluc191bnNhZmUgdCB+cG9zIH5lbmRfIGNoYXIgPVxuICBwb3MgPCBlbmRfXG4gICYmIChDaGFyLmVxdWFsICh1bnNhZmVfZ2V0IHQgcG9zKSBjaGFyIHx8IGNvbnRhaW5zX3Vuc2FmZSB0IH5wb3M6KHBvcyArIDEpIH5lbmRfIGNoYXIpXG47O1xuXG5sZXQgY29udGFpbnMgPyhwb3MgPSAwKSA/bGVuIHQgY2hhciA9XG4gIGxldCB0b3RhbF9sZW5ndGggPSBTdHJpbmcubGVuZ3RoIHQgaW5cbiAgbGV0IGxlbiA9IE9wdGlvbi52YWx1ZSBsZW4gfmRlZmF1bHQ6KHRvdGFsX2xlbmd0aCAtIHBvcykgaW5cbiAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aDtcbiAgY29udGFpbnNfdW5zYWZlIHQgfnBvcyB+ZW5kXzoocG9zICsgbGVuKSBjaGFyXG47O1xuXG5sZXQgaXNfZW1wdHkgdCA9IGxlbmd0aCB0ID0gMFxuXG5sZXQgcmVjIGluZGV4X2Zyb21fZXhuX2ludGVybmFsIHN0cmluZyB+cG9zIH5sZW4gfm5vdF9mb3VuZCBjaGFyID1cbiAgaWYgcG9zID49IGxlblxuICB0aGVuIHJhaXNlIG5vdF9mb3VuZFxuICBlbHNlIGlmIENoYXIuZXF1YWwgKHVuc2FmZV9nZXQgc3RyaW5nIHBvcykgY2hhclxuICB0aGVuIHBvc1xuICBlbHNlIGluZGV4X2Zyb21fZXhuX2ludGVybmFsIHN0cmluZyB+cG9zOihwb3MgKyAxKSB+bGVuIH5ub3RfZm91bmQgY2hhclxuOztcblxubGV0IGluZGV4X2V4bl9pbnRlcm5hbCB0IH5ub3RfZm91bmQgY2hhciA9XG4gIGluZGV4X2Zyb21fZXhuX2ludGVybmFsIHQgfnBvczowIH5sZW46KGxlbmd0aCB0KSB+bm90X2ZvdW5kIGNoYXJcbjs7XG5cbmxldCBpbmRleF9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcuaW5kZXhfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGluZGV4X2V4biB0IGNoYXIgPSBpbmRleF9leG5faW50ZXJuYWwgdCB+bm90X2ZvdW5kIGNoYXIgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBpbmRleF9leG5cbjs7XG5cbmxldCBpbmRleF9mcm9tX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5pbmRleF9mcm9tX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBpbmRleF9mcm9tX2V4biB0IHBvcyBjaGFyID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgICBpZiBwb3MgPCAwIHx8IHBvcyA+IGxlblxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbV9leG5cIlxuICAgIGVsc2UgaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgdCB+cG9zIH5sZW4gfm5vdF9mb3VuZCBjaGFyXG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgaW5kZXhfZnJvbV9leG5cbjs7XG5cbmxldCByZWMgcmluZGV4X2Zyb21fZXhuX2ludGVybmFsIHN0cmluZyB+cG9zIH5sZW4gfm5vdF9mb3VuZCBjaGFyID1cbiAgaWYgcG9zIDwgMFxuICB0aGVuIHJhaXNlIG5vdF9mb3VuZFxuICBlbHNlIGlmIENoYXIuZXF1YWwgKHVuc2FmZV9nZXQgc3RyaW5nIHBvcykgY2hhclxuICB0aGVuIHBvc1xuICBlbHNlIHJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCBzdHJpbmcgfnBvczoocG9zIC0gMSkgfmxlbiB+bm90X2ZvdW5kIGNoYXJcbjs7XG5cbmxldCByaW5kZXhfZXhuX2ludGVybmFsIHQgfm5vdF9mb3VuZCBjaGFyID1cbiAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gIHJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCB0IH5wb3M6KGxlbiAtIDEpIH5sZW4gfm5vdF9mb3VuZCBjaGFyXG47O1xuXG5sZXQgcmluZGV4X2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5yaW5kZXhfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IHJpbmRleF9leG4gdCBjaGFyID0gcmluZGV4X2V4bl9pbnRlcm5hbCB0IH5ub3RfZm91bmQgY2hhciBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIHJpbmRleF9leG5cbjs7XG5cbmxldCByaW5kZXhfZnJvbV9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcucmluZGV4X2Zyb21fZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IHJpbmRleF9mcm9tX2V4biB0IHBvcyBjaGFyID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgICBpZiBwb3MgPCAtMSB8fCBwb3MgPj0gbGVuXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbV9leG5cIlxuICAgIGVsc2UgcmluZGV4X2Zyb21fZXhuX2ludGVybmFsIHQgfnBvcyB+bGVuIH5ub3RfZm91bmQgY2hhclxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIHJpbmRleF9mcm9tX2V4blxuOztcblxubGV0IGluZGV4IHQgY2hhciA9XG4gIHRyeSBTb21lIChpbmRleF9leG4gdCBjaGFyKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmxldCByaW5kZXggdCBjaGFyID1cbiAgdHJ5IFNvbWUgKHJpbmRleF9leG4gdCBjaGFyKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmxldCBpbmRleF9mcm9tIHQgcG9zIGNoYXIgPVxuICB0cnkgU29tZSAoaW5kZXhfZnJvbV9leG4gdCBwb3MgY2hhcikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5sZXQgcmluZGV4X2Zyb20gdCBwb3MgY2hhciA9XG4gIHRyeSBTb21lIChyaW5kZXhfZnJvbV9leG4gdCBwb3MgY2hhcikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5tb2R1bGUgU2VhcmNoX3BhdHRlcm4wID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgeyBwYXR0ZXJuIDogc3RyaW5nXG4gICAgOyBjYXNlX3NlbnNpdGl2ZSA6IGJvb2xcbiAgICA7IGttcF9hcnJheSA6IGludCBhcnJheVxuICAgIH1cblxuICBsZXQgc2V4cF9vZl90IHsgcGF0dGVybjsgY2FzZV9zZW5zaXRpdmU7IGttcF9hcnJheSA9IF8gfSA6IFNleHAudCA9XG4gICAgTGlzdFxuICAgICAgWyBMaXN0IFsgQXRvbSBcInBhdHRlcm5cIjsgc2V4cF9vZl9zdHJpbmcgcGF0dGVybiBdXG4gICAgICA7IExpc3QgWyBBdG9tIFwiY2FzZV9zZW5zaXRpdmVcIjsgc2V4cF9vZl9ib29sIGNhc2Vfc2Vuc2l0aXZlIF1cbiAgICAgIF1cbiAgOztcblxuICBsZXQgcGF0dGVybiB0ID0gdC5wYXR0ZXJuXG4gIGxldCBjYXNlX3NlbnNpdGl2ZSB0ID0gdC5jYXNlX3NlbnNpdGl2ZVxuXG4gICgqIEZpbmQgbWF4IG51bWJlciBvZiBtYXRjaGVkIGNoYXJhY3RlcnMgYXQgW25leHRfdGV4dF9jaGFyXSwgZ2l2ZW4gdGhlIGN1cnJlbnRcbiAgICAgW21hdGNoZWRfY2hhcnNdLiBUcnkgdG8gZXh0ZW5kIHRoZSBjdXJyZW50IG1hdGNoLCBpZiBjaGFycyBkb24ndCBtYXRjaCwgdHJ5IHRvIG1hdGNoXG4gICAgIGZld2VyIGNoYXJzLiBJZiBjaGFycyBtYXRjaCB0aGVuIGV4dGVuZCB0aGUgbWF0Y2guICopXG4gIGxldCBrbXBfaW50ZXJuYWxfbG9vcCB+bWF0Y2hlZF9jaGFycyB+bmV4dF90ZXh0X2NoYXIgfnBhdHRlcm4gfmttcF9hcnJheSB+Y2hhcl9lcXVhbCA9XG4gICAgbGV0IG1hdGNoZWRfY2hhcnMgPSByZWYgbWF0Y2hlZF9jaGFycyBpblxuICAgIHdoaWxlXG4gICAgICAhbWF0Y2hlZF9jaGFycyA+IDBcbiAgICAgICYmIG5vdCAoY2hhcl9lcXVhbCBuZXh0X3RleHRfY2hhciAodW5zYWZlX2dldCBwYXR0ZXJuICFtYXRjaGVkX2NoYXJzKSlcbiAgICBkb1xuICAgICAgbWF0Y2hlZF9jaGFycyA6PSBBcnJheS51bnNhZmVfZ2V0IGttcF9hcnJheSAoIW1hdGNoZWRfY2hhcnMgLSAxKVxuICAgIGRvbmU7XG4gICAgaWYgY2hhcl9lcXVhbCBuZXh0X3RleHRfY2hhciAodW5zYWZlX2dldCBwYXR0ZXJuICFtYXRjaGVkX2NoYXJzKVxuICAgIHRoZW4gbWF0Y2hlZF9jaGFycyA6PSAhbWF0Y2hlZF9jaGFycyArIDE7XG4gICAgIW1hdGNoZWRfY2hhcnNcbiAgOztcblxuICBsZXQgZ2V0X2NoYXJfZXF1YWwgfmNhc2Vfc2Vuc2l0aXZlID1cbiAgICBtYXRjaCBjYXNlX3NlbnNpdGl2ZSB3aXRoXG4gICAgfCB0cnVlIC0+IENoYXIuZXF1YWxcbiAgICB8IGZhbHNlIC0+IENoYXIuQ2FzZWxlc3MuZXF1YWxcbiAgOztcblxuICAoKiBDbGFzc2ljIEtNUCBwcmUtcHJvY2Vzc2luZyBvZiB0aGUgcGF0dGVybjogYnVpbGQgdGhlIGludCBhcnJheSwgd2hpY2gsIGZvciBlYWNoIGksXG4gICAgIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgbm9uLXRyaXZpYWwgcHJlZml4IG9mIHMgd2hpY2ggaXMgZXF1YWwgdG8gYSBzdWZmaXhcbiAgICAgZW5kaW5nIGF0IHMuW2ldICopXG4gIGxldCBjcmVhdGUgcGF0dGVybiB+Y2FzZV9zZW5zaXRpdmUgPVxuICAgIGxldCBuID0gbGVuZ3RoIHBhdHRlcm4gaW5cbiAgICBsZXQga21wX2FycmF5ID0gQXJyYXkuY3JlYXRlIH5sZW46biAoLTEpIGluXG4gICAgaWYgbiA+IDBcbiAgICB0aGVuIChcbiAgICAgIGxldCBjaGFyX2VxdWFsID0gZ2V0X2NoYXJfZXF1YWwgfmNhc2Vfc2Vuc2l0aXZlIGluXG4gICAgICBBcnJheS51bnNhZmVfc2V0IGttcF9hcnJheSAwIDA7XG4gICAgICBsZXQgbWF0Y2hlZF9jaGFycyA9IHJlZiAwIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbiAtIDEgZG9cbiAgICAgICAgbWF0Y2hlZF9jaGFyc1xuICAgICAgICA6PSBrbXBfaW50ZXJuYWxfbG9vcFxuICAgICAgICAgICAgIH5tYXRjaGVkX2NoYXJzOiFtYXRjaGVkX2NoYXJzXG4gICAgICAgICAgICAgfm5leHRfdGV4dF9jaGFyOih1bnNhZmVfZ2V0IHBhdHRlcm4gaSlcbiAgICAgICAgICAgICB+cGF0dGVyblxuICAgICAgICAgICAgIH5rbXBfYXJyYXlcbiAgICAgICAgICAgICB+Y2hhcl9lcXVhbDtcbiAgICAgICAgQXJyYXkudW5zYWZlX3NldCBrbXBfYXJyYXkgaSAhbWF0Y2hlZF9jaGFyc1xuICAgICAgZG9uZSk7XG4gICAgeyBwYXR0ZXJuOyBjYXNlX3NlbnNpdGl2ZTsga21wX2FycmF5IH1cbiAgOztcblxuICAoKiBDbGFzc2ljIEtNUDogdXNlIHRoZSBwcmUtcHJvY2Vzc2VkIHBhdHRlcm4gdG8gb3B0aW1pemUgbG9vay1iZWhpbmRzIG9uIG5vbi1tYXRjaGVzLlxuICAgICBXZSByZXR1cm4gaW50IHRvIGF2b2lkIGFsbG9jYXRpb24gaW4gW2luZGV4X2V4bl0uIC0xIG1lYW5zIG5vIG1hdGNoLiAqKVxuICBsZXQgaW5kZXhfaW50ZXJuYWwgPyhwb3MgPSAwKSB7IHBhdHRlcm47IGNhc2Vfc2Vuc2l0aXZlOyBrbXBfYXJyYXkgfSB+aW5fOnRleHQgPVxuICAgIGlmIHBvcyA8IDAgfHwgcG9zID4gbGVuZ3RoIHRleHQgLSBsZW5ndGggcGF0dGVyblxuICAgIHRoZW4gLTFcbiAgICBlbHNlIChcbiAgICAgIGxldCBjaGFyX2VxdWFsID0gZ2V0X2NoYXJfZXF1YWwgfmNhc2Vfc2Vuc2l0aXZlIGluXG4gICAgICBsZXQgaiA9IHJlZiBwb3MgaW5cbiAgICAgIGxldCBtYXRjaGVkX2NoYXJzID0gcmVmIDAgaW5cbiAgICAgIGxldCBrID0gbGVuZ3RoIHBhdHRlcm4gaW5cbiAgICAgIGxldCBuID0gbGVuZ3RoIHRleHQgaW5cbiAgICAgIHdoaWxlICFqIDwgbiAmJiAhbWF0Y2hlZF9jaGFycyA8IGsgZG9cbiAgICAgICAgbGV0IG5leHRfdGV4dF9jaGFyID0gdW5zYWZlX2dldCB0ZXh0ICFqIGluXG4gICAgICAgIG1hdGNoZWRfY2hhcnNcbiAgICAgICAgOj0ga21wX2ludGVybmFsX2xvb3BcbiAgICAgICAgICAgICB+bWF0Y2hlZF9jaGFyczohbWF0Y2hlZF9jaGFyc1xuICAgICAgICAgICAgIH5uZXh0X3RleHRfY2hhclxuICAgICAgICAgICAgIH5wYXR0ZXJuXG4gICAgICAgICAgICAgfmttcF9hcnJheVxuICAgICAgICAgICAgIH5jaGFyX2VxdWFsO1xuICAgICAgICBqIDo9ICFqICsgMVxuICAgICAgZG9uZTtcbiAgICAgIGlmICFtYXRjaGVkX2NoYXJzID0gayB0aGVuICFqIC0gayBlbHNlIC0xKVxuICA7O1xuXG4gIGxldCBtYXRjaGVzIHQgc3RyID0gaW5kZXhfaW50ZXJuYWwgdCB+aW5fOnN0ciA+PSAwXG5cbiAgbGV0IGluZGV4ID9wb3MgdCB+aW5fID1cbiAgICBsZXQgcCA9IGluZGV4X2ludGVybmFsID9wb3MgdCB+aW5fIGluXG4gICAgaWYgcCA8IDAgdGhlbiBOb25lIGVsc2UgU29tZSBwXG4gIDs7XG5cbiAgbGV0IGluZGV4X2V4biA/cG9zIHQgfmluXyA9XG4gICAgbGV0IHAgPSBpbmRleF9pbnRlcm5hbCA/cG9zIHQgfmluXyBpblxuICAgIGlmIHAgPj0gMFxuICAgIHRoZW4gcFxuICAgIGVsc2VcbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZSBcIlN1YnN0cmluZyBub3QgZm91bmRcIiBbIFwic3Vic3RyaW5nXCIsIHNleHBfb2Zfc3RyaW5nIHQucGF0dGVybiBdKVxuICA7O1xuXG4gIGxldCBpbmRleF9hbGwgeyBwYXR0ZXJuOyBjYXNlX3NlbnNpdGl2ZTsga21wX2FycmF5IH0gfm1heV9vdmVybGFwIH5pbl86dGV4dCA9XG4gICAgaWYgbGVuZ3RoIHBhdHRlcm4gPSAwXG4gICAgdGhlbiBMaXN0LmluaXQgKDEgKyBsZW5ndGggdGV4dCkgfmY6Rm4uaWRcbiAgICBlbHNlIChcbiAgICAgIGxldCBjaGFyX2VxdWFsID0gZ2V0X2NoYXJfZXF1YWwgfmNhc2Vfc2Vuc2l0aXZlIGluXG4gICAgICBsZXQgbWF0Y2hlZF9jaGFycyA9IHJlZiAwIGluXG4gICAgICBsZXQgayA9IGxlbmd0aCBwYXR0ZXJuIGluXG4gICAgICBsZXQgbiA9IGxlbmd0aCB0ZXh0IGluXG4gICAgICBsZXQgZm91bmQgPSByZWYgW10gaW5cbiAgICAgIGZvciBqID0gMCB0byBuIGRvXG4gICAgICAgIGlmICFtYXRjaGVkX2NoYXJzID0ga1xuICAgICAgICB0aGVuIChcbiAgICAgICAgICBmb3VuZCA6PSAoaiAtIGspIDo6ICFmb3VuZDtcbiAgICAgICAgICAoKiB3ZSBqdXN0IGZvdW5kIGEgbWF0Y2ggaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiAqKVxuICAgICAgICAgIG1hdGNoIG1heV9vdmVybGFwIHdpdGhcbiAgICAgICAgICB8IHRydWUgLT4gbWF0Y2hlZF9jaGFycyA6PSBBcnJheS51bnNhZmVfZ2V0IGttcF9hcnJheSAoayAtIDEpXG4gICAgICAgICAgfCBmYWxzZSAtPiBtYXRjaGVkX2NoYXJzIDo9IDApO1xuICAgICAgICBpZiBqIDwgblxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbmV4dF90ZXh0X2NoYXIgPSB1bnNhZmVfZ2V0IHRleHQgaiBpblxuICAgICAgICAgIG1hdGNoZWRfY2hhcnNcbiAgICAgICAgICA6PSBrbXBfaW50ZXJuYWxfbG9vcFxuICAgICAgICAgICAgICAgfm1hdGNoZWRfY2hhcnM6IW1hdGNoZWRfY2hhcnNcbiAgICAgICAgICAgICAgIH5uZXh0X3RleHRfY2hhclxuICAgICAgICAgICAgICAgfnBhdHRlcm5cbiAgICAgICAgICAgICAgIH5rbXBfYXJyYXlcbiAgICAgICAgICAgICAgIH5jaGFyX2VxdWFsKVxuICAgICAgZG9uZTtcbiAgICAgIExpc3QucmV2ICFmb3VuZClcbiAgOztcblxuICBsZXQgcmVwbGFjZV9maXJzdCA/cG9zIHQgfmluXzpzIH53aXRoXyA9XG4gICAgbWF0Y2ggaW5kZXggP3BvcyB0IH5pbl86cyB3aXRoXG4gICAgfCBOb25lIC0+IHNcbiAgICB8IFNvbWUgaSAtPlxuICAgICAgbGV0IGxlbl9zID0gbGVuZ3RoIHMgaW5cbiAgICAgIGxldCBsZW5fdCA9IGxlbmd0aCB0LnBhdHRlcm4gaW5cbiAgICAgIGxldCBsZW5fd2l0aCA9IGxlbmd0aCB3aXRoXyBpblxuICAgICAgbGV0IGRzdCA9IEJ5dGVzLmNyZWF0ZSAobGVuX3MgKyBsZW5fd2l0aCAtIGxlbl90KSBpblxuICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYzpzIH5zcmNfcG9zOjAgfmRzdCB+ZHN0X3BvczowIH5sZW46aTtcbiAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmM6d2l0aF8gfnNyY19wb3M6MCB+ZHN0IH5kc3RfcG9zOmkgfmxlbjpsZW5fd2l0aDtcbiAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nXG4gICAgICAgIH5zcmM6c1xuICAgICAgICB+c3JjX3BvczooaSArIGxlbl90KVxuICAgICAgICB+ZHN0XG4gICAgICAgIH5kc3RfcG9zOihpICsgbGVuX3dpdGgpXG4gICAgICAgIH5sZW46KGxlbl9zIC0gaSAtIGxlbl90KTtcbiAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6ZHN0XG4gIDs7XG5cblxuICBsZXQgcmVwbGFjZV9hbGwgdCB+aW5fOnMgfndpdGhfID1cbiAgICBsZXQgbWF0Y2hlcyA9IGluZGV4X2FsbCB0IH5tYXlfb3ZlcmxhcDpmYWxzZSB+aW5fOnMgaW5cbiAgICBtYXRjaCBtYXRjaGVzIHdpdGhcbiAgICB8IFtdIC0+IHNcbiAgICB8IF8gOjogXyAtPlxuICAgICAgbGV0IGxlbl9zID0gbGVuZ3RoIHMgaW5cbiAgICAgIGxldCBsZW5fdCA9IGxlbmd0aCB0LnBhdHRlcm4gaW5cbiAgICAgIGxldCBsZW5fd2l0aCA9IGxlbmd0aCB3aXRoXyBpblxuICAgICAgbGV0IG51bV9tYXRjaGVzID0gTGlzdC5sZW5ndGggbWF0Y2hlcyBpblxuICAgICAgbGV0IGRzdCA9IEJ5dGVzLmNyZWF0ZSAobGVuX3MgKyAoKGxlbl93aXRoIC0gbGVuX3QpICogbnVtX21hdGNoZXMpKSBpblxuICAgICAgbGV0IG5leHRfZHN0X3BvcyA9IHJlZiAwIGluXG4gICAgICBsZXQgbmV4dF9zcmNfcG9zID0gcmVmIDAgaW5cbiAgICAgIExpc3QuaXRlciBtYXRjaGVzIH5mOihmdW4gaSAtPlxuICAgICAgICBsZXQgbGVuID0gaSAtICFuZXh0X3NyY19wb3MgaW5cbiAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYzpzIH5zcmNfcG9zOiFuZXh0X3NyY19wb3MgfmRzdCB+ZHN0X3BvczohbmV4dF9kc3RfcG9zIH5sZW47XG4gICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nXG4gICAgICAgICAgfnNyYzp3aXRoX1xuICAgICAgICAgIH5zcmNfcG9zOjBcbiAgICAgICAgICB+ZHN0XG4gICAgICAgICAgfmRzdF9wb3M6KCFuZXh0X2RzdF9wb3MgKyBsZW4pXG4gICAgICAgICAgfmxlbjpsZW5fd2l0aDtcbiAgICAgICAgbmV4dF9kc3RfcG9zIDo9ICFuZXh0X2RzdF9wb3MgKyBsZW4gKyBsZW5fd2l0aDtcbiAgICAgICAgbmV4dF9zcmNfcG9zIDo9ICFuZXh0X3NyY19wb3MgKyBsZW4gKyBsZW5fdCk7XG4gICAgICBCeXRlcy5ibGl0X3N0cmluZ1xuICAgICAgICB+c3JjOnNcbiAgICAgICAgfnNyY19wb3M6IW5leHRfc3JjX3Bvc1xuICAgICAgICB+ZHN0XG4gICAgICAgIH5kc3RfcG9zOiFuZXh0X2RzdF9wb3NcbiAgICAgICAgfmxlbjoobGVuX3MgLSAhbmV4dF9zcmNfcG9zKTtcbiAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6ZHN0XG4gIDs7XG5cbiAgbGV0IHNwbGl0X29uIHQgcyA9XG4gICAgbGV0IHBhdHRlcm5fbGVuID0gU3RyaW5nLmxlbmd0aCB0LnBhdHRlcm4gaW5cbiAgICBsZXQgbWF0Y2hlcyA9IGluZGV4X2FsbCB0IH5tYXlfb3ZlcmxhcDpmYWxzZSB+aW5fOnMgaW5cbiAgICBMaXN0Lm1hcDJfZXhuXG4gICAgICAoLXBhdHRlcm5fbGVuIDo6IG1hdGNoZXMpXG4gICAgICAobWF0Y2hlcyBAIFsgU3RyaW5nLmxlbmd0aCBzIF0pXG4gICAgICB+ZjooZnVuIGkgaiAtPiBzdWIgcyB+cG9zOihpICsgcGF0dGVybl9sZW4pIH5sZW46KGogLSBpIC0gcGF0dGVybl9sZW4pKVxuICA7O1xuXG4gIG1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gICAgdHlwZSBwdWJsaWMgPSB0XG5cbiAgICB0eXBlIG5vbnJlYyB0ID0gdCA9XG4gICAgICB7IHBhdHRlcm4gOiBzdHJpbmdcbiAgICAgIDsgY2FzZV9zZW5zaXRpdmUgOiBib29sXG4gICAgICA7IGttcF9hcnJheSA6IGludCBhcnJheVxuICAgICAgfVxuICAgIFtAQGRlcml2aW5nX2lubGluZSBlcXVhbCwgc2V4cF9vZl1cblxuICAgIGxldCBlcXVhbCA9XG4gICAgICAoZnVuIGFfXzAwMl8gYl9fMDAzXyAtPlxuICAgICAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDAyXyBiX18wMDNfXG4gICAgICAgICB0aGVuIHRydWVcbiAgICAgICAgIGVsc2VcbiAgICAgICAgICAgUHB4X2NvbXBhcmVfbGliLiggJiYgKVxuICAgICAgICAgICAgIChlcXVhbF9zdHJpbmcgYV9fMDAyXy5wYXR0ZXJuIGJfXzAwM18ucGF0dGVybilcbiAgICAgICAgICAgICAoUHB4X2NvbXBhcmVfbGliLiggJiYgKVxuICAgICAgICAgICAgICAgIChlcXVhbF9ib29sIGFfXzAwMl8uY2FzZV9zZW5zaXRpdmUgYl9fMDAzXy5jYXNlX3NlbnNpdGl2ZSlcbiAgICAgICAgICAgICAgICAoZXF1YWxfYXJyYXkgZXF1YWxfaW50IGFfXzAwMl8ua21wX2FycmF5IGJfXzAwM18ua21wX2FycmF5KSlcbiAgICAgICAgICAgOiB0IC0+IHQgLT4gYm9vbClcbiAgICA7O1xuXG4gICAgbGV0IHNleHBfb2ZfdCA9XG4gICAgICAoZnVuIHsgcGF0dGVybiA9IHBhdHRlcm5fXzAwN19cbiAgICAgICAgICAgOyBjYXNlX3NlbnNpdGl2ZSA9IGNhc2Vfc2Vuc2l0aXZlX18wMDlfXG4gICAgICAgICAgIDsga21wX2FycmF5ID0ga21wX2FycmF5X18wMTFfXG4gICAgICAgICAgIH0gLT5cbiAgICAgICAgbGV0IGJuZHNfXzAwNl8gPSBbXSBpblxuICAgICAgICBsZXQgYm5kc19fMDA2XyA9XG4gICAgICAgICAgbGV0IGFyZ19fMDEyXyA9IHNleHBfb2ZfYXJyYXkgc2V4cF9vZl9pbnQga21wX2FycmF5X18wMTFfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwia21wX2FycmF5XCI7IGFyZ19fMDEyXyBdIDo6IGJuZHNfXzAwNl9cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGJuZHNfXzAwNl8gPVxuICAgICAgICAgIGxldCBhcmdfXzAxMF8gPSBzZXhwX29mX2Jvb2wgY2FzZV9zZW5zaXRpdmVfXzAwOV8gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJjYXNlX3NlbnNpdGl2ZVwiOyBhcmdfXzAxMF8gXVxuICAgICAgICAgIDo6IGJuZHNfXzAwNl9cbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGJuZHNfXzAwNl8gPVxuICAgICAgICAgIGxldCBhcmdfXzAwOF8gPSBzZXhwX29mX3N0cmluZyBwYXR0ZXJuX18wMDdfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwicGF0dGVyblwiOyBhcmdfXzAwOF8gXSA6OiBibmRzX18wMDZfXG4gICAgICAgIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBibmRzX18wMDZfXG4gICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgcmVwcmVzZW50YXRpb24gPSBGbi5pZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgU2VhcmNoX3BhdHRlcm5faGVscGVyID0gc3RydWN0XG4gIG1vZHVsZSBTZWFyY2hfcGF0dGVybiA9IFNlYXJjaF9wYXR0ZXJuMFxuZW5kXG5cbm9wZW4gU2VhcmNoX3BhdHRlcm5faGVscGVyXG5cbmxldCBzdWJzdHJfaW5kZXhfZ2VuIH5jYXNlX3NlbnNpdGl2ZSA/cG9zIHQgfnBhdHRlcm4gPVxuICBTZWFyY2hfcGF0dGVybi5pbmRleCA/cG9zIChTZWFyY2hfcGF0dGVybi5jcmVhdGUgfmNhc2Vfc2Vuc2l0aXZlIHBhdHRlcm4pIH5pbl86dFxuOztcblxubGV0IHN1YnN0cl9pbmRleF9leG5fZ2VuIH5jYXNlX3NlbnNpdGl2ZSA/cG9zIHQgfnBhdHRlcm4gPVxuICBTZWFyY2hfcGF0dGVybi5pbmRleF9leG4gP3BvcyAoU2VhcmNoX3BhdHRlcm4uY3JlYXRlIH5jYXNlX3NlbnNpdGl2ZSBwYXR0ZXJuKSB+aW5fOnRcbjs7XG5cbmxldCBzdWJzdHJfaW5kZXhfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmUgdCB+bWF5X292ZXJsYXAgfnBhdHRlcm4gPVxuICBTZWFyY2hfcGF0dGVybi5pbmRleF9hbGxcbiAgICAoU2VhcmNoX3BhdHRlcm4uY3JlYXRlIH5jYXNlX3NlbnNpdGl2ZSBwYXR0ZXJuKVxuICAgIH5tYXlfb3ZlcmxhcFxuICAgIH5pbl86dFxuOztcblxubGV0IHN1YnN0cl9yZXBsYWNlX2ZpcnN0X2dlbiB+Y2FzZV9zZW5zaXRpdmUgP3BvcyB0IH5wYXR0ZXJuID1cbiAgU2VhcmNoX3BhdHRlcm4ucmVwbGFjZV9maXJzdCA/cG9zIChTZWFyY2hfcGF0dGVybi5jcmVhdGUgfmNhc2Vfc2Vuc2l0aXZlIHBhdHRlcm4pIH5pbl86dFxuOztcblxubGV0IHN1YnN0cl9yZXBsYWNlX2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlIHQgfnBhdHRlcm4gPVxuICBTZWFyY2hfcGF0dGVybi5yZXBsYWNlX2FsbCAoU2VhcmNoX3BhdHRlcm4uY3JlYXRlIH5jYXNlX3NlbnNpdGl2ZSBwYXR0ZXJuKSB+aW5fOnRcbjs7XG5cbmxldCBpc19zdWJzdHJpbmdfZ2VuIH5jYXNlX3NlbnNpdGl2ZSB0IH5zdWJzdHJpbmcgPVxuICBPcHRpb24uaXNfc29tZSAoc3Vic3RyX2luZGV4X2dlbiB0IH5wYXR0ZXJuOnN1YnN0cmluZyB+Y2FzZV9zZW5zaXRpdmUpXG47O1xuXG5sZXQgc3Vic3RyX2luZGV4ID0gc3Vic3RyX2luZGV4X2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxubGV0IHN1YnN0cl9pbmRleF9leG4gPSBzdWJzdHJfaW5kZXhfZXhuX2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxubGV0IHN1YnN0cl9pbmRleF9hbGwgPSBzdWJzdHJfaW5kZXhfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxubGV0IHN1YnN0cl9yZXBsYWNlX2ZpcnN0ID0gc3Vic3RyX3JlcGxhY2VfZmlyc3RfZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5sZXQgc3Vic3RyX3JlcGxhY2VfYWxsID0gc3Vic3RyX3JlcGxhY2VfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxubGV0IGlzX3N1YnN0cmluZyA9IGlzX3N1YnN0cmluZ19nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcblxubGV0IGlzX3N1YnN0cmluZ19hdF9nZW4gPVxuICBsZXQgcmVjIGxvb3AgfnN0ciB+c3RyX3BvcyB+c3ViIH5zdWJfcG9zIH5zdWJfbGVuIH5jaGFyX2VxdWFsID1cbiAgICBpZiBzdWJfcG9zID0gc3ViX2xlblxuICAgIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgY2hhcl9lcXVhbCAodW5zYWZlX2dldCBzdHIgc3RyX3BvcykgKHVuc2FmZV9nZXQgc3ViIHN1Yl9wb3MpXG4gICAgdGhlbiBsb29wIH5zdHIgfnN0cl9wb3M6KHN0cl9wb3MgKyAxKSB+c3ViIH5zdWJfcG9zOihzdWJfcG9zICsgMSkgfnN1Yl9sZW4gfmNoYXJfZXF1YWxcbiAgICBlbHNlIGZhbHNlXG4gIGluXG4gIGZ1biBzdHIgfnBvczpzdHJfcG9zIH5zdWJzdHJpbmc6c3ViIH5jaGFyX2VxdWFsIC0+XG4gICAgbGV0IHN0cl9sZW4gPSBsZW5ndGggc3RyIGluXG4gICAgbGV0IHN1Yl9sZW4gPSBsZW5ndGggc3ViIGluXG4gICAgaWYgc3RyX3BvcyA8IDAgfHwgc3RyX3BvcyA+IHN0cl9sZW5cbiAgICB0aGVuXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCJTdHJpbmcuaXNfc3Vic3RyaW5nX2F0OiBpbnZhbGlkIGluZGV4ICVkIGZvciBzdHJpbmcgb2YgbGVuZ3RoICVkXCJcbiAgICAgICAgc3RyX3Bvc1xuICAgICAgICBzdHJfbGVuXG4gICAgICAgICgpO1xuICAgIHN0cl9wb3MgKyBzdWJfbGVuIDw9IHN0cl9sZW5cbiAgICAmJiBsb29wIH5zdHIgfnN0cl9wb3MgfnN1YiB+c3ViX3BvczowIH5zdWJfbGVuIH5jaGFyX2VxdWFsXG47O1xuXG5sZXQgaXNfc3VmZml4X2dlbiBzdHJpbmcgfnN1ZmZpeCB+Y2hhcl9lcXVhbCA9XG4gIGxldCBzdHJpbmdfbGVuID0gbGVuZ3RoIHN0cmluZyBpblxuICBsZXQgc3VmZml4X2xlbiA9IGxlbmd0aCBzdWZmaXggaW5cbiAgc3RyaW5nX2xlbiA+PSBzdWZmaXhfbGVuXG4gICYmIGlzX3N1YnN0cmluZ19hdF9nZW5cbiAgICAgICBzdHJpbmdcbiAgICAgICB+cG9zOihzdHJpbmdfbGVuIC0gc3VmZml4X2xlbilcbiAgICAgICB+c3Vic3RyaW5nOnN1ZmZpeFxuICAgICAgIH5jaGFyX2VxdWFsXG47O1xuXG5sZXQgaXNfcHJlZml4X2dlbiBzdHJpbmcgfnByZWZpeCB+Y2hhcl9lcXVhbCA9XG4gIGxldCBzdHJpbmdfbGVuID0gbGVuZ3RoIHN0cmluZyBpblxuICBsZXQgcHJlZml4X2xlbiA9IGxlbmd0aCBwcmVmaXggaW5cbiAgc3RyaW5nX2xlbiA+PSBwcmVmaXhfbGVuXG4gICYmIGlzX3N1YnN0cmluZ19hdF9nZW4gc3RyaW5nIH5wb3M6MCB+c3Vic3RyaW5nOnByZWZpeCB+Y2hhcl9lcXVhbFxuOztcblxubW9kdWxlIENhc2VsZXNzID0gc3RydWN0XG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgdHlwZSB0ID0gc3RyaW5nIFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgICBsZXQgdF9vZl9zZXhwID0gKHN0cmluZ19vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gICAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX3N0cmluZyA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IHN0cmluZ19zZXhwX2dyYW1tYXJcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgY2hhcl9jb21wYXJlX2Nhc2VsZXNzIGMxIGMyID0gQ2hhci5jb21wYXJlIChDaGFyLmxvd2VyY2FzZSBjMSkgKENoYXIubG93ZXJjYXNlIGMyKVxuXG4gICAgbGV0IHJlYyBjb21wYXJlX2xvb3AgfnBvcyB+c3RyaW5nMSB+bGVuMSB+c3RyaW5nMiB+bGVuMiA9XG4gICAgICBpZiBwb3MgPSBsZW4xXG4gICAgICB0aGVuIGlmIHBvcyA9IGxlbjIgdGhlbiAwIGVsc2UgLTFcbiAgICAgIGVsc2UgaWYgcG9zID0gbGVuMlxuICAgICAgdGhlbiAxXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGMgPSBjaGFyX2NvbXBhcmVfY2FzZWxlc3MgKHVuc2FmZV9nZXQgc3RyaW5nMSBwb3MpICh1bnNhZmVfZ2V0IHN0cmluZzIgcG9zKSBpblxuICAgICAgICBtYXRjaCBjIHdpdGhcbiAgICAgICAgfCAwIC0+IGNvbXBhcmVfbG9vcCB+cG9zOihwb3MgKyAxKSB+c3RyaW5nMSB+bGVuMSB+c3RyaW5nMiB+bGVuMlxuICAgICAgICB8IF8gLT4gYylcbiAgICA7O1xuXG4gICAgbGV0IGNvbXBhcmUgc3RyaW5nMSBzdHJpbmcyID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgc3RyaW5nMSBzdHJpbmcyXG4gICAgICB0aGVuIDBcbiAgICAgIGVsc2VcbiAgICAgICAgY29tcGFyZV9sb29wXG4gICAgICAgICAgfnBvczowXG4gICAgICAgICAgfnN0cmluZzFcbiAgICAgICAgICB+bGVuMTooU3RyaW5nLmxlbmd0aCBzdHJpbmcxKVxuICAgICAgICAgIH5zdHJpbmcyXG4gICAgICAgICAgfmxlbjI6KFN0cmluZy5sZW5ndGggc3RyaW5nMilcbiAgICA7O1xuXG4gICAgbGV0IGhhc2hfZm9sZF90IHN0YXRlIHQgPVxuICAgICAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gICAgICBsZXQgc3RhdGUgPSByZWYgKGhhc2hfZm9sZF9pbnQgc3RhdGUgbGVuKSBpblxuICAgICAgZm9yIHBvcyA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgICBzdGF0ZSA6PSBoYXNoX2ZvbGRfY2hhciAhc3RhdGUgKENoYXIubG93ZXJjYXNlICh1bnNhZmVfZ2V0IHQgcG9zKSlcbiAgICAgIGRvbmU7XG4gICAgICAhc3RhdGVcbiAgICA7O1xuXG4gICAgbGV0IGhhc2ggdCA9IEhhc2gucnVuIGhhc2hfZm9sZF90IHRcbiAgICBsZXQgaXNfc3VmZml4IHMgfnN1ZmZpeCA9IGlzX3N1ZmZpeF9nZW4gcyB+c3VmZml4IH5jaGFyX2VxdWFsOkNoYXIuQ2FzZWxlc3MuZXF1YWxcbiAgICBsZXQgaXNfcHJlZml4IHMgfnByZWZpeCA9IGlzX3ByZWZpeF9nZW4gcyB+cHJlZml4IH5jaGFyX2VxdWFsOkNoYXIuQ2FzZWxlc3MuZXF1YWxcbiAgICBsZXQgc3Vic3RyX2luZGV4ID0gc3Vic3RyX2luZGV4X2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgc3Vic3RyX2luZGV4X2V4biA9IHN1YnN0cl9pbmRleF9leG5fZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBzdWJzdHJfaW5kZXhfYWxsID0gc3Vic3RyX2luZGV4X2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IHN1YnN0cl9yZXBsYWNlX2ZpcnN0ID0gc3Vic3RyX3JlcGxhY2VfZmlyc3RfZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBzdWJzdHJfcmVwbGFjZV9hbGwgPSBzdWJzdHJfcmVwbGFjZV9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBpc19zdWJzdHJpbmcgPSBpc19zdWJzdHJpbmdfZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBpc19zdWJzdHJpbmdfYXQgPSBpc19zdWJzdHJpbmdfYXRfZ2VuIH5jaGFyX2VxdWFsOkNoYXIuQ2FzZWxlc3MuZXF1YWxcbiAgZW5kXG5cbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlIChUKVxuZW5kXG5cbmxldCBvZl9zdHJpbmcgPSBGbi5pZFxubGV0IHRvX3N0cmluZyA9IEZuLmlkXG5cbmxldCBpbml0IG4gfmYgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnZiBcIlN0cmluZy5pbml0ICVkXCIgbiAoKTtcbiAgbGV0IHQgPSBCeXRlcy5jcmVhdGUgbiBpblxuICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICBCeXRlcy5zZXQgdCBpIChmIGkpXG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6dFxuOztcblxubGV0IHRvX2xpc3QgcyA9XG4gIGxldCByZWMgbG9vcCBhY2MgaSA9IGlmIGkgPCAwIHRoZW4gYWNjIGVsc2UgbG9vcCAocy5baV0gOjogYWNjKSAoaSAtIDEpIGluXG4gIGxvb3AgW10gKGxlbmd0aCBzIC0gMSlcbjs7XG5cbmxldCB0b19saXN0X3JldiBzID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBhY2MgaSA9IGlmIGkgPSBsZW4gdGhlbiBhY2MgZWxzZSBsb29wIChzLltpXSA6OiBhY2MpIChpICsgMSkgaW5cbiAgbG9vcCBbXSAwXG47O1xuXG5sZXQgcmV2IHQgPVxuICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLmNyZWF0ZSBsZW4gaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICB1bnNhZmVfc2V0IHJlcyBpICh1bnNhZmVfZ2V0IHQgKGxlbiAtIDEgLSBpKSlcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpyZXNcbjs7XG5cbigqKiBFZmZpY2llbnQgc3RyaW5nIHNwbGl0dGluZyAqKVxuXG5sZXQgbHNwbGl0Ml9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcubHNwbGl0Ml9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgbHNwbGl0Ml9leG4gbGluZSB+b246ZGVsaW0gPVxuICAgIGxldCBwb3MgPSBpbmRleF9leG5faW50ZXJuYWwgbGluZSB+bm90X2ZvdW5kIGRlbGltIGluXG4gICAgc3ViIGxpbmUgfnBvczowIH5sZW46cG9zLCBzdWIgbGluZSB+cG9zOihwb3MgKyAxKSB+bGVuOihsZW5ndGggbGluZSAtIHBvcyAtIDEpXG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgbHNwbGl0Ml9leG5cbjs7XG5cbmxldCByc3BsaXQyX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIlN0cmluZy5yc3BsaXQyX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCByc3BsaXQyX2V4biBsaW5lIH5vbjpkZWxpbSA9XG4gICAgbGV0IHBvcyA9IHJpbmRleF9leG5faW50ZXJuYWwgbGluZSB+bm90X2ZvdW5kIGRlbGltIGluXG4gICAgc3ViIGxpbmUgfnBvczowIH5sZW46cG9zLCBzdWIgbGluZSB+cG9zOihwb3MgKyAxKSB+bGVuOihsZW5ndGggbGluZSAtIHBvcyAtIDEpXG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgcnNwbGl0Ml9leG5cbjs7XG5cbmxldCBsc3BsaXQyIGxpbmUgfm9uID1cbiAgdHJ5IFNvbWUgKGxzcGxpdDJfZXhuIGxpbmUgfm9uKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmxldCByc3BsaXQyIGxpbmUgfm9uID1cbiAgdHJ5IFNvbWUgKHJzcGxpdDJfZXhuIGxpbmUgfm9uKSB3aXRoXG4gIHwgTm90X2ZvdW5kX3MgXyB8IENhbWwuTm90X2ZvdW5kIC0+IE5vbmVcbjs7XG5cbmxldCByZWMgY2hhcl9saXN0X21lbSBsIChjIDogY2hhcikgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBmYWxzZVxuICB8IGhkIDo6IHRsIC0+IENoYXIuZXF1YWwgaGQgYyB8fCBjaGFyX2xpc3RfbWVtIHRsIGNcbjs7XG5cbmxldCBzcGxpdF9nZW4gc3RyIH5vbiA9XG4gIGxldCBpc19kZWxpbSA9XG4gICAgbWF0Y2ggb24gd2l0aFxuICAgIHwgYGNoYXIgYycgLT4gZnVuIGMgLT4gQ2hhci5lcXVhbCBjIGMnXG4gICAgfCBgY2hhcl9saXN0IGwgLT4gZnVuIGMgLT4gY2hhcl9saXN0X21lbSBsIGNcbiAgaW5cbiAgbGV0IGxlbiA9IGxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlYyBsb29wIGFjYyBsYXN0X3BvcyBwb3MgPVxuICAgIGlmIHBvcyA9IC0xXG4gICAgdGhlbiBzdWIgc3RyIH5wb3M6MCB+bGVuOmxhc3RfcG9zIDo6IGFjY1xuICAgIGVsc2UgaWYgaXNfZGVsaW0gc3RyLltwb3NdXG4gICAgdGhlbiAoXG4gICAgICBsZXQgcG9zMSA9IHBvcyArIDEgaW5cbiAgICAgIGxldCBzdWJfc3RyID0gc3ViIHN0ciB+cG9zOnBvczEgfmxlbjoobGFzdF9wb3MgLSBwb3MxKSBpblxuICAgICAgbG9vcCAoc3ViX3N0ciA6OiBhY2MpIHBvcyAocG9zIC0gMSkpXG4gICAgZWxzZSBsb29wIGFjYyBsYXN0X3BvcyAocG9zIC0gMSlcbiAgaW5cbiAgbG9vcCBbXSBsZW4gKGxlbiAtIDEpXG47O1xuXG5sZXQgc3BsaXQgc3RyIH5vbiA9IHNwbGl0X2dlbiBzdHIgfm9uOihgY2hhciBvbilcbmxldCBzcGxpdF9vbl9jaGFycyBzdHIgfm9uOmNoYXJzID0gc3BsaXRfZ2VuIHN0ciB+b246KGBjaGFyX2xpc3QgY2hhcnMpXG5cbmxldCBzcGxpdF9saW5lcyA9XG4gIGxldCBiYWNrX3VwX2F0X25ld2xpbmUgfnQgfnBvcyB+ZW9sID1cbiAgICBwb3MgOj0gIXBvcyAtIGlmICFwb3MgPiAwICYmIENoYXIuZXF1YWwgdC5bIXBvcyAtIDFdICdcXHInIHRoZW4gMiBlbHNlIDE7XG4gICAgZW9sIDo9ICFwb3MgKyAxXG4gIGluXG4gIGZ1biB0IC0+XG4gICAgbGV0IG4gPSBsZW5ndGggdCBpblxuICAgIGlmIG4gPSAwXG4gICAgdGhlbiBbXVxuICAgIGVsc2UgKFxuICAgICAgKCogSW52YXJpYW50OiBbLTEgPD0gcG9zIDwgZW9sXS4gKilcbiAgICAgIGxldCBwb3MgPSByZWYgKG4gLSAxKSBpblxuICAgICAgbGV0IGVvbCA9IHJlZiBuIGluXG4gICAgICBsZXQgYWMgPSByZWYgW10gaW5cbiAgICAgICgqIFdlIHRyZWF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBzcGVjaWFsbHksIGJlY2F1c2UgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggYVxuICAgICAgICAgbmV3bGluZSwgd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSBlbXB0eSBzdHJpbmcgYXQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0LiAqKVxuICAgICAgaWYgQ2hhci5lcXVhbCB0LlshcG9zXSAnXFxuJyB0aGVuIGJhY2tfdXBfYXRfbmV3bGluZSB+dCB+cG9zIH5lb2w7XG4gICAgICB3aGlsZSAhcG9zID49IDAgZG9cbiAgICAgICAgaWYgQ2hhci4oIDw+ICkgdC5bIXBvc10gJ1xcbidcbiAgICAgICAgdGhlbiBkZWNyIHBvc1xuICAgICAgICBlbHNlIChcbiAgICAgICAgICAoKiBCZWNhdXNlIFtwb3MgPCBlb2xdLCB3ZSBrbm93IHRoYXQgW3N0YXJ0IDw9IGVvbF0uICopXG4gICAgICAgICAgbGV0IHN0YXJ0ID0gIXBvcyArIDEgaW5cbiAgICAgICAgICBhYyA6PSBzdWIgdCB+cG9zOnN0YXJ0IH5sZW46KCFlb2wgLSBzdGFydCkgOjogIWFjO1xuICAgICAgICAgIGJhY2tfdXBfYXRfbmV3bGluZSB+dCB+cG9zIH5lb2wpXG4gICAgICBkb25lO1xuICAgICAgc3ViIHQgfnBvczowIH5sZW46IWVvbCA6OiAhYWMpXG47O1xuXG5sZXQgaXNfc3VmZml4IHMgfnN1ZmZpeCA9IGlzX3N1ZmZpeF9nZW4gcyB+c3VmZml4IH5jaGFyX2VxdWFsOkNoYXIuZXF1YWxcbmxldCBpc19wcmVmaXggcyB+cHJlZml4ID0gaXNfcHJlZml4X2dlbiBzIH5wcmVmaXggfmNoYXJfZXF1YWw6Q2hhci5lcXVhbFxuXG5sZXQgaXNfc3Vic3RyaW5nX2F0IHMgfnBvcyB+c3Vic3RyaW5nID1cbiAgaXNfc3Vic3RyaW5nX2F0X2dlbiBzIH5wb3MgfnN1YnN0cmluZyB+Y2hhcl9lcXVhbDpDaGFyLmVxdWFsXG47O1xuXG5sZXQgd3JhcF9zdWJfbiB0IG4gfm5hbWUgfnBvcyB+bGVuIH5vbl9lcnJvciA9XG4gIGlmIG4gPCAwXG4gIHRoZW4gaW52YWxpZF9hcmcgKG5hbWUgXiBcIiBleHBlY3Rpbmcgbm9ubmVnYXRpdmUgYXJndW1lbnRcIilcbiAgZWxzZSAoXG4gICAgdHJ5IHN1YiB0IH5wb3MgfmxlbiB3aXRoXG4gICAgfCBfIC0+IG9uX2Vycm9yKVxuOztcblxubGV0IGRyb3BfcHJlZml4IHQgbiA9XG4gIHdyYXBfc3ViX24gfm5hbWU6XCJkcm9wX3ByZWZpeFwiIHQgbiB+cG9zOm4gfmxlbjoobGVuZ3RoIHQgLSBuKSB+b25fZXJyb3I6XCJcIlxuOztcblxubGV0IGRyb3Bfc3VmZml4IHQgbiA9XG4gIHdyYXBfc3ViX24gfm5hbWU6XCJkcm9wX3N1ZmZpeFwiIHQgbiB+cG9zOjAgfmxlbjoobGVuZ3RoIHQgLSBuKSB+b25fZXJyb3I6XCJcIlxuOztcblxubGV0IHByZWZpeCB0IG4gPSB3cmFwX3N1Yl9uIH5uYW1lOlwicHJlZml4XCIgdCBuIH5wb3M6MCB+bGVuOm4gfm9uX2Vycm9yOnRcbmxldCBzdWZmaXggdCBuID0gd3JhcF9zdWJfbiB+bmFtZTpcInN1ZmZpeFwiIHQgbiB+cG9zOihsZW5ndGggdCAtIG4pIH5sZW46biB+b25fZXJyb3I6dFxuXG5sZXQgbGZpbmRpID8ocG9zID0gMCkgdCB+ZiA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgbGV0IHJlYyBsb29wIGkgPSBpZiBpID0gbiB0aGVuIE5vbmUgZWxzZSBpZiBmIGkgdC5baV0gdGhlbiBTb21lIGkgZWxzZSBsb29wIChpICsgMSkgaW5cbiAgbG9vcCBwb3Ncbjs7XG5cbmxldCBmaW5kIHQgfmYgPVxuICBtYXRjaCBsZmluZGkgdCB+ZjooZnVuIF8gYyAtPiBmIGMpIHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIGkgLT4gU29tZSB0LltpXVxuOztcblxubGV0IGZpbmRfbWFwIHQgfmYgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gblxuICAgIHRoZW4gTm9uZVxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggZiB0LltpXSB3aXRoXG4gICAgICB8IE5vbmUgLT4gbG9vcCAoaSArIDEpXG4gICAgICB8IFNvbWUgXyBhcyByZXMgLT4gcmVzKVxuICBpblxuICBsb29wIDBcbjs7XG5cbmxldCByZmluZGkgP3BvcyB0IH5mID1cbiAgbGV0IHJlYyBsb29wIGkgPSBpZiBpIDwgMCB0aGVuIE5vbmUgZWxzZSBpZiBmIGkgdC5baV0gdGhlbiBTb21lIGkgZWxzZSBsb29wIChpIC0gMSkgaW5cbiAgbGV0IHBvcyA9XG4gICAgbWF0Y2ggcG9zIHdpdGhcbiAgICB8IFNvbWUgcG9zIC0+IHBvc1xuICAgIHwgTm9uZSAtPiBsZW5ndGggdCAtIDFcbiAgaW5cbiAgbG9vcCBwb3Ncbjs7XG5cbmxldCBsYXN0X25vbl9kcm9wIH5kcm9wIHQgPSByZmluZGkgdCB+ZjooZnVuIF8gYyAtPiBub3QgKGRyb3AgYykpXG5cbmxldCByc3RyaXAgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0ID1cbiAgbWF0Y2ggbGFzdF9ub25fZHJvcCB0IH5kcm9wIHdpdGhcbiAgfCBOb25lIC0+IFwiXCJcbiAgfCBTb21lIGkgLT4gaWYgaSA9IGxlbmd0aCB0IC0gMSB0aGVuIHQgZWxzZSBwcmVmaXggdCAoaSArIDEpXG47O1xuXG5sZXQgZmlyc3Rfbm9uX2Ryb3AgfmRyb3AgdCA9IGxmaW5kaSB0IH5mOihmdW4gXyBjIC0+IG5vdCAoZHJvcCBjKSlcblxubGV0IGxzdHJpcCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgPVxuICBtYXRjaCBmaXJzdF9ub25fZHJvcCB0IH5kcm9wIHdpdGhcbiAgfCBOb25lIC0+IFwiXCJcbiAgfCBTb21lIDAgLT4gdFxuICB8IFNvbWUgbiAtPiBkcm9wX3ByZWZpeCB0IG5cbjs7XG5cbigqIFtzdHJpcCB0XSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBbbHN0cmlwIChyc3RyaXAgdCldLiAgVGhlIGltcGxlbWVudGF0aW9uXG4gICBiZWxvdyBzYXZlcyAoYXQgbGVhc3QpIGEgZmFjdG9yIG9mIHR3byBhbGxvY2F0aW9uLCBieSBvbmx5IGFsbG9jYXRpbmcgdGhlXG4gICBmaW5hbCByZXN1bHQuICBUaGlzIGFsc28gc2F2ZXMgc29tZSBhbW91bnQgb2YgdGltZS4gKilcbmxldCBzdHJpcCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgPVxuICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgaWYgbGVuZ3RoID0gMCB8fCBub3QgKGRyb3AgdC5bMF0gfHwgZHJvcCB0LltsZW5ndGggLSAxXSlcbiAgdGhlbiB0XG4gIGVsc2UgKFxuICAgIG1hdGNoIGZpcnN0X25vbl9kcm9wIHQgfmRyb3Agd2l0aFxuICAgIHwgTm9uZSAtPiBcIlwiXG4gICAgfCBTb21lIGZpcnN0IC0+XG4gICAgICAobWF0Y2ggbGFzdF9ub25fZHJvcCB0IH5kcm9wIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgfCBTb21lIGxhc3QgLT4gc3ViIHQgfnBvczpmaXJzdCB+bGVuOihsYXN0IC0gZmlyc3QgKyAxKSkpXG47O1xuXG5sZXQgbWFwaSB0IH5mID1cbiAgbGV0IGwgPSBsZW5ndGggdCBpblxuICBsZXQgdCcgPSBCeXRlcy5jcmVhdGUgbCBpblxuICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICBCeXRlcy51bnNhZmVfc2V0IHQnIGkgKGYgaSB0LltpXSlcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp0J1xuOztcblxuKCogcmVwZWF0ZWQgY29kZSB0byBhdm9pZCByZXF1aXJpbmcgYW4gZXh0cmEgYWxsb2NhdGlvbiBmb3IgYSBjbG9zdXJlIG9uIGVhY2ggY2FsbC4gKilcbmxldCBtYXAgdCB+ZiA9XG4gIGxldCBsID0gbGVuZ3RoIHQgaW5cbiAgbGV0IHQnID0gQnl0ZXMuY3JlYXRlIGwgaW5cbiAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgQnl0ZXMudW5zYWZlX3NldCB0JyBpIChmIHQuW2ldKVxuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnQnXG47O1xuXG5sZXQgdG9fYXJyYXkgcyA9IEFycmF5LmluaXQgKGxlbmd0aCBzKSB+ZjooZnVuIGkgLT4gcy5baV0pXG5cbmxldCBleGlzdHMgPVxuICBsZXQgcmVjIGxvb3AgcyBpIH5sZW4gfmYgPSBpIDwgbGVuICYmIChmIHMuW2ldIHx8IGxvb3AgcyAoaSArIDEpIH5sZW4gfmYpIGluXG4gIGZ1biBzIH5mIC0+IGxvb3AgcyAwIH5sZW46KGxlbmd0aCBzKSB+ZlxuOztcblxubGV0IGZvcl9hbGwgPVxuICBsZXQgcmVjIGxvb3AgcyBpIH5sZW4gfmYgPSBpID0gbGVuIHx8IChmIHMuW2ldICYmIGxvb3AgcyAoaSArIDEpIH5sZW4gfmYpIGluXG4gIGZ1biBzIH5mIC0+IGxvb3AgcyAwIH5sZW46KGxlbmd0aCBzKSB+ZlxuOztcblxubGV0IGZvbGQgPVxuICBsZXQgcmVjIGxvb3AgdCBpIGFjIH5mIH5sZW4gPVxuICAgIGlmIGkgPSBsZW4gdGhlbiBhYyBlbHNlIGxvb3AgdCAoaSArIDEpIChmIGFjIHQuW2ldKSB+ZiB+bGVuXG4gIGluXG4gIGZ1biB0IH5pbml0IH5mIC0+IGxvb3AgdCAwIGluaXQgfmYgfmxlbjoobGVuZ3RoIHQpXG47O1xuXG5sZXQgZm9sZGkgPVxuICBsZXQgcmVjIGxvb3AgdCBpIGFjIH5mIH5sZW4gPVxuICAgIGlmIGkgPSBsZW4gdGhlbiBhYyBlbHNlIGxvb3AgdCAoaSArIDEpIChmIGkgYWMgdC5baV0pIH5mIH5sZW5cbiAgaW5cbiAgZnVuIHQgfmluaXQgfmYgLT4gbG9vcCB0IDAgaW5pdCB+ZiB+bGVuOihsZW5ndGggdClcbjs7XG5cbmxldCBpdGVyaSB0IH5mID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIGYgaSAodW5zYWZlX2dldCB0IGkpXG4gIGRvbmVcbjs7XG5cbmxldCBjb3VudCB0IH5mID0gQ29udGFpbmVyLmNvdW50IH5mb2xkIHQgfmZcbmxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcbmxldCBtaW5fZWx0IHQgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0XG5sZXQgbWF4X2VsdCB0ID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdFxubGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxubGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIHRcbmxldCBmaW5kX21hcGkgdCB+ZiA9IEluZGV4ZWRfY29udGFpbmVyLmZpbmRfbWFwaSB+aXRlcmkgdCB+ZlxubGV0IGZpbmRpIHQgfmYgPSBJbmRleGVkX2NvbnRhaW5lci5maW5kaSB+aXRlcmkgdCB+ZlxubGV0IGNvdW50aSB0IH5mID0gSW5kZXhlZF9jb250YWluZXIuY291bnRpIH5mb2xkaSB0IH5mXG5sZXQgZm9yX2FsbGkgdCB+ZiA9IEluZGV4ZWRfY29udGFpbmVyLmZvcl9hbGxpIH5pdGVyaSB0IH5mXG5sZXQgZXhpc3RzaSB0IH5mID0gSW5kZXhlZF9jb250YWluZXIuZXhpc3RzaSB+aXRlcmkgdCB+ZlxuXG5sZXQgbWVtID1cbiAgbGV0IHJlYyBsb29wIHQgYyB+cG9zOmkgfmxlbiA9XG4gICAgaSA8IGxlbiAmJiAoQ2hhci5lcXVhbCBjICh1bnNhZmVfZ2V0IHQgaSkgfHwgbG9vcCB0IGMgfnBvczooaSArIDEpIH5sZW4pXG4gIGluXG4gIGZ1biB0IGMgLT4gbG9vcCB0IGMgfnBvczowIH5sZW46KGxlbmd0aCB0KVxuOztcblxubGV0IHRyIH50YXJnZXQgfnJlcGxhY2VtZW50IHMgPVxuICBpZiBDaGFyLmVxdWFsIHRhcmdldCByZXBsYWNlbWVudFxuICB0aGVuIHNcbiAgZWxzZSBpZiBtZW0gcyB0YXJnZXRcbiAgdGhlbiBtYXAgcyB+ZjooZnVuIGMgLT4gaWYgQ2hhci5lcXVhbCBjIHRhcmdldCB0aGVuIHJlcGxhY2VtZW50IGVsc2UgYylcbiAgZWxzZSBzXG47O1xuXG5sZXQgdHJfbXVsdGkgfnRhcmdldCB+cmVwbGFjZW1lbnQgPVxuICBpZiBpc19lbXB0eSB0YXJnZXRcbiAgdGhlbiBzdGFnZSBGbi5pZFxuICBlbHNlIGlmIGlzX2VtcHR5IHJlcGxhY2VtZW50XG4gIHRoZW4gaW52YWxpZF9hcmcgXCJ0cl9tdWx0aSByZXBsYWNlbWVudCBpcyBlbXB0eSBzdHJpbmdcIlxuICBlbHNlIChcbiAgICBtYXRjaCBCeXRlc190ci50cl9jcmVhdGVfbWFwIH50YXJnZXQgfnJlcGxhY2VtZW50IHdpdGhcbiAgICB8IE5vbmUgLT4gc3RhZ2UgRm4uaWRcbiAgICB8IFNvbWUgdHJfbWFwIC0+XG4gICAgICBzdGFnZSAoZnVuIHMgLT5cbiAgICAgICAgaWYgZXhpc3RzIHMgfmY6KGZ1biBjIC0+IENoYXIuKCA8PiApIGMgKHVuc2FmZV9nZXQgdHJfbWFwIChDaGFyLnRvX2ludCBjKSkpXG4gICAgICAgIHRoZW4gbWFwIHMgfmY6KGZ1biBjIC0+IHVuc2FmZV9nZXQgdHJfbWFwIChDaGFyLnRvX2ludCBjKSlcbiAgICAgICAgZWxzZSBzKSlcbjs7XG5cbigqIGZhc3QgdmVyc2lvbiwgaWYgd2UgZXZlciBuZWVkIGl0OlxuICAge1tcbiAgICAgbGV0IGNvbmNhdF9hcnJheSB+c2VwIGFyID1cbiAgICAgICBsZXQgYXJfbGVuID0gQXJyYXkubGVuZ3RoIGFyIGluXG4gICAgICAgaWYgYXJfbGVuID0gMCB0aGVuIFwiXCJcbiAgICAgICBlbHNlXG4gICAgICAgICBsZXQgc2VwX2xlbiA9IGxlbmd0aCBzZXAgaW5cbiAgICAgICAgIGxldCByZXNfbGVuX3JlZiA9IHJlZiAoc2VwX2xlbiAqIChhcl9sZW4gLSAxKSkgaW5cbiAgICAgICAgIGZvciBpID0gMCB0byBhcl9sZW4gLSAxIGRvXG4gICAgICAgICAgIHJlc19sZW5fcmVmIDo9ICFyZXNfbGVuX3JlZiArIGxlbmd0aCBhci4oaSlcbiAgICAgICAgIGRvbmU7XG4gICAgICAgICBsZXQgcmVzID0gY3JlYXRlICFyZXNfbGVuX3JlZiBpblxuICAgICAgICAgbGV0IHN0cl8wID0gYXIuKDApIGluXG4gICAgICAgICBsZXQgbGVuXzAgPSBsZW5ndGggc3RyXzAgaW5cbiAgICAgICAgIGJsaXQgfnNyYzpzdHJfMCB+c3JjX3BvczowIH5kc3Q6cmVzIH5kc3RfcG9zOjAgfmxlbjpsZW5fMDtcbiAgICAgICAgIGxldCBwb3NfcmVmID0gcmVmIGxlbl8wIGluXG4gICAgICAgICBmb3IgaSA9IDEgdG8gYXJfbGVuIC0gMSBkb1xuICAgICAgICAgICBsZXQgcG9zID0gIXBvc19yZWYgaW5cbiAgICAgICAgICAgYmxpdCB+c3JjOnNlcCB+c3JjX3BvczowIH5kc3Q6cmVzIH5kc3RfcG9zOnBvcyB+bGVuOnNlcF9sZW47XG4gICAgICAgICAgIGxldCBuZXdfcG9zID0gcG9zICsgc2VwX2xlbiBpblxuICAgICAgICAgICBsZXQgc3RyX2kgPSBhci4oaSkgaW5cbiAgICAgICAgICAgbGV0IGxlbl9pID0gbGVuZ3RoIHN0cl9pIGluXG4gICAgICAgICAgIGJsaXQgfnNyYzpzdHJfaSB+c3JjX3BvczowIH5kc3Q6cmVzIH5kc3RfcG9zOm5ld19wb3MgfmxlbjpsZW5faTtcbiAgICAgICAgICAgcG9zX3JlZiA6PSBuZXdfcG9zICsgbGVuX2lcbiAgICAgICAgIGRvbmU7XG4gICAgICAgICByZXNcbiAgIF19ICopXG5cbmxldCBjb25jYXRfYXJyYXkgP3NlcCBhciA9IGNvbmNhdCA/c2VwIChBcnJheS50b19saXN0IGFyKVxubGV0IGNvbmNhdF9tYXAgP3NlcCBzIH5mID0gY29uY2F0X2FycmF5ID9zZXAgKEFycmF5Lm1hcCAodG9fYXJyYXkgcykgfmYpXG5cbigqIFtmaWx0ZXIgdCBmXSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobS5cblxuICAgTGV0IFtuID0gbGVuZ3RoIHRdLlxuXG4gICAxLiBGaW5kIHRoZSBsb3dlc3QgW2ldIHN1Y2ggdGhhdCBbbm90IChmIHQuW2ldKV0uXG5cbiAgIDIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggW2ldLCB0aGVuIHJldHVybiBbdF0uXG5cbiAgIDMuIElmIHRoZXJlIGlzIHN1Y2ggYW4gW2ldLCBhbGxvY2F0ZSBhIHN0cmluZywgW291dF0sIHRvIGhvbGQgdGhlIHJlc3VsdC4gIFtvdXRdIGhhc1xuICAgbGVuZ3RoIFtuIC0gMV0sIHdoaWNoIGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIG91dHB1dCBzaXplIGdpdmVuIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3RcbiAgIG9uZSBjaGFyYWN0ZXIgbm90IHNhdGlzZnlpbmcgW2ZdLlxuXG4gICA0LiBDb3B5IGNoYXJhY3RlcnMgYXQgaW5kaWNlcyAwIC4uLiBbaSAtIDFdIGZyb20gW3RdIHRvIFtvdXRdLlxuXG4gICA1LiBXYWxrIHRocm91Z2ggY2hhcmFjdGVycyBhdCBpbmRpY2VzIFtpKzFdIC4uLiBbbi0xXSBvZiBbdF0sIGNvcHlpbmcgdGhvc2UgdGhhdFxuICAgc2F0aXNmeSBbZl0gZnJvbSBbdF0gdG8gW291dF0uXG5cbiAgIDYuIElmIHdlIGNvbXBsZXRlbHkgZmlsbGVkIFtvdXRdLCB0aGVuIHJldHVybiBpdC4gIElmIG5vdCwgcmV0dXJuIHRoZSBwcmVmaXggb2YgW291dF1cbiAgIHRoYXQgd2UgZGlkIGZpbGwgaW4uXG5cbiAgIFRoaXMgYWxnb3JpdGhtIGhhcyB0aGUgcHJvcGVydHkgdGhhdCBpdCBkb2Vzbid0IGFsbG9jYXRlIGEgbmV3IHN0cmluZyBpZiB0aGVyZSdzXG4gICBub3RoaW5nIHRvIGZpbHRlciwgd2hpY2ggaXMgYSBjb21tb24gY2FzZS4gKilcbmxldCBmaWx0ZXIgdCB+ZiA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IG4gJiYgZiB0LlshaV0gZG9cbiAgICBpbmNyIGlcbiAgZG9uZTtcbiAgaWYgIWkgPSBuXG4gIHRoZW4gdFxuICBlbHNlIChcbiAgICBsZXQgb3V0ID0gQnl0ZXMuY3JlYXRlIChuIC0gMSkgaW5cbiAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjOnQgfnNyY19wb3M6MCB+ZHN0Om91dCB+ZHN0X3BvczowIH5sZW46IWk7XG4gICAgbGV0IG91dF9wb3MgPSByZWYgIWkgaW5cbiAgICBpbmNyIGk7XG4gICAgd2hpbGUgIWkgPCBuIGRvXG4gICAgICBsZXQgYyA9IHQuWyFpXSBpblxuICAgICAgaWYgZiBjXG4gICAgICB0aGVuIChcbiAgICAgICAgQnl0ZXMuc2V0IG91dCAhb3V0X3BvcyBjO1xuICAgICAgICBpbmNyIG91dF9wb3MpO1xuICAgICAgaW5jciBpXG4gICAgZG9uZTtcbiAgICBsZXQgb3V0ID0gQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpvdXQgaW5cbiAgICBpZiAhb3V0X3BvcyA9IG4gLSAxIHRoZW4gb3V0IGVsc2Ugc3ViIG91dCB+cG9zOjAgfmxlbjohb3V0X3Bvcylcbjs7XG5cbigqIHJlcGVhdGVkIGNvZGUgdG8gYXZvaWQgcmVxdWlyaW5nIGFuIGV4dHJhIGFsbG9jYXRpb24gZm9yIGEgY2xvc3VyZSBvbiBlYWNoIGNhbGwuICopXG5sZXQgZmlsdGVyaSB0IH5mID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBsZXQgaSA9IHJlZiAwIGluXG4gIHdoaWxlICFpIDwgbiAmJiBmICFpIHQuWyFpXSBkb1xuICAgIGluY3IgaVxuICBkb25lO1xuICBpZiAhaSA9IG5cbiAgdGhlbiB0XG4gIGVsc2UgKFxuICAgIGxldCBvdXQgPSBCeXRlcy5jcmVhdGUgKG4gLSAxKSBpblxuICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmM6dCB+c3JjX3BvczowIH5kc3Q6b3V0IH5kc3RfcG9zOjAgfmxlbjohaTtcbiAgICBsZXQgb3V0X3BvcyA9IHJlZiAhaSBpblxuICAgIGluY3IgaTtcbiAgICB3aGlsZSAhaSA8IG4gZG9cbiAgICAgIGxldCBjID0gdC5bIWldIGluXG4gICAgICBpZiBmICFpIGNcbiAgICAgIHRoZW4gKFxuICAgICAgICBCeXRlcy5zZXQgb3V0ICFvdXRfcG9zIGM7XG4gICAgICAgIGluY3Igb3V0X3Bvcyk7XG4gICAgICBpbmNyIGlcbiAgICBkb25lO1xuICAgIGxldCBvdXQgPSBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOm91dCBpblxuICAgIGlmICFvdXRfcG9zID0gbiAtIDEgdGhlbiBvdXQgZWxzZSBzdWIgb3V0IH5wb3M6MCB+bGVuOiFvdXRfcG9zKVxuOztcblxubGV0IGNob3BfcHJlZml4IHMgfnByZWZpeCA9XG4gIGlmIGlzX3ByZWZpeCBzIH5wcmVmaXggdGhlbiBTb21lIChkcm9wX3ByZWZpeCBzIChsZW5ndGggcHJlZml4KSkgZWxzZSBOb25lXG47O1xuXG5sZXQgY2hvcF9wcmVmaXhfaWZfZXhpc3RzIHMgfnByZWZpeCA9XG4gIGlmIGlzX3ByZWZpeCBzIH5wcmVmaXggdGhlbiBkcm9wX3ByZWZpeCBzIChsZW5ndGggcHJlZml4KSBlbHNlIHNcbjs7XG5cbmxldCBjaG9wX3ByZWZpeF9leG4gcyB+cHJlZml4ID1cbiAgbWF0Y2ggY2hvcF9wcmVmaXggcyB+cHJlZml4IHdpdGhcbiAgfCBTb21lIHN0ciAtPiBzdHJcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnZiBcIlN0cmluZy5jaG9wX3ByZWZpeF9leG4gJVMgJVNcIiBzIHByZWZpeCAoKVxuOztcblxubGV0IGNob3Bfc3VmZml4IHMgfnN1ZmZpeCA9XG4gIGlmIGlzX3N1ZmZpeCBzIH5zdWZmaXggdGhlbiBTb21lIChkcm9wX3N1ZmZpeCBzIChsZW5ndGggc3VmZml4KSkgZWxzZSBOb25lXG47O1xuXG5sZXQgY2hvcF9zdWZmaXhfaWZfZXhpc3RzIHMgfnN1ZmZpeCA9XG4gIGlmIGlzX3N1ZmZpeCBzIH5zdWZmaXggdGhlbiBkcm9wX3N1ZmZpeCBzIChsZW5ndGggc3VmZml4KSBlbHNlIHNcbjs7XG5cbmxldCBjaG9wX3N1ZmZpeF9leG4gcyB+c3VmZml4ID1cbiAgbWF0Y2ggY2hvcF9zdWZmaXggcyB+c3VmZml4IHdpdGhcbiAgfCBTb21lIHN0ciAtPiBzdHJcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnZiBcIlN0cmluZy5jaG9wX3N1ZmZpeF9leG4gJVMgJVNcIiBzIHN1ZmZpeCAoKVxuOztcblxubW9kdWxlIEZvcl9jb21tb25fcHJlZml4X2FuZF9zdWZmaXggPSBzdHJ1Y3RcbiAgKCogV2hlbiB0YWtpbmcgYSBzdHJpbmcgcHJlZml4IG9yIHN1ZmZpeCwgd2UgZXh0cmFjdCBmcm9tIHRoZSBzaG9ydGVzdCBpbnB1dCBhdmFpbGFibGVcbiAgICAgaW4gY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gb25lIG9mIG91ciBpbnB1dHMgd2l0aG91dCBhbGxvY2F0aW5nIGEgbmV3IHN0cmluZy4gKilcblxuICBsZXQgc2hvcnRlciBhIGIgPSBpZiBsZW5ndGggYSA8PSBsZW5ndGggYiB0aGVuIGEgZWxzZSBiXG5cbiAgbGV0IHNob3J0ZXN0IGxpc3QgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gXCJcIlxuICAgIHwgZmlyc3QgOjogcmVzdCAtPiBMaXN0LmZvbGQgcmVzdCB+aW5pdDpmaXJzdCB+ZjpzaG9ydGVyXG4gIDs7XG5cbiAgKCogT3VyIGdlbmVyaWMgYWNjZXNzb3JzIGZvciBjb21tb24gcHJlZml4L3N1ZmZpeCBhYnN0cmFjdCBvdmVyIFtnZXRfcG9zXSwgd2hpY2ggaXNcbiAgICAgZWl0aGVyIFtwb3NfZnJvbV9sZWZ0XSBvciBbcG9zX2Zyb21fcmlnaHRdLiAqKVxuXG4gIGxldCBwb3NfZnJvbV9sZWZ0IChfIDogdCkgKGkgOiBpbnQpID0gaVxuICBsZXQgcG9zX2Zyb21fcmlnaHQgdCBpID0gbGVuZ3RoIHQgLSBpIC0gMVxuXG4gIGxldCByZWMgY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wIGEgYiB+Z2V0X3BvcyB+bWF4X2xlbiB+bGVuX3NvX2ZhciA9XG4gICAgaWYgbGVuX3NvX2ZhciA+PSBtYXhfbGVuXG4gICAgdGhlbiBtYXhfbGVuXG4gICAgZWxzZSBpZiBDaGFyLmVxdWFsXG4gICAgICAgICAgICAgICh1bnNhZmVfZ2V0IGEgKGdldF9wb3MgYSBsZW5fc29fZmFyKSlcbiAgICAgICAgICAgICAgKHVuc2FmZV9nZXQgYiAoZ2V0X3BvcyBiIGxlbl9zb19mYXIpKVxuICAgIHRoZW4gY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wIGEgYiB+Z2V0X3BvcyB+bWF4X2xlbiB+bGVuX3NvX2ZhcjoobGVuX3NvX2ZhciArIDEpXG4gICAgZWxzZSBsZW5fc29fZmFyXG4gIDs7XG5cbiAgbGV0IGNvbW1vbl9nZW5lcmljMl9sZW5ndGggYSBiIH5nZXRfcG9zID1cbiAgICBsZXQgbWF4X2xlbiA9IG1pbiAobGVuZ3RoIGEpIChsZW5ndGggYikgaW5cbiAgICBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3AgYSBiIH5nZXRfcG9zIH5tYXhfbGVuIH5sZW5fc29fZmFyOjBcbiAgOztcblxuICBsZXQgcmVjIGNvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wIGZpcnN0IGxpc3QgfmdldF9wb3Mgfm1heF9sZW4gPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gbWF4X2xlblxuICAgIHwgc2Vjb25kIDo6IHJlc3QgLT5cbiAgICAgIGxldCBtYXhfbGVuID1cbiAgICAgICAgKCogV2UgY2FsbCBbY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wXSByYXRoZXIgdGhhbiBbY29tbW9uX2dlbmVyaWMyX2xlbmd0aF0gc29cbiAgICAgICAgICAgdGhhdCBbbWF4X2xlbl0gbGltaXRzIG91ciB0cmF2ZXJzYWwgb2YgW2ZpcnN0XSBhbmQgW3NlY29uZF0uICopXG4gICAgICAgIGNvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcCBmaXJzdCBzZWNvbmQgfmdldF9wb3Mgfm1heF9sZW4gfmxlbl9zb19mYXI6MFxuICAgICAgaW5cbiAgICAgIGNvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wIHNlY29uZCByZXN0IH5nZXRfcG9zIH5tYXhfbGVuXG4gIDs7XG5cbiAgbGV0IGNvbW1vbl9nZW5lcmljX2xlbmd0aCBsaXN0IH5nZXRfcG9zID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IDBcbiAgICB8IGZpcnN0IDo6IHJlc3QgLT5cbiAgICAgICgqIFByZWNvbXB1dGluZyBbbWF4X2xlbl0gYmFzZWQgb24gW3Nob3J0ZXN0IGxpc3RdIHNhdmVzIHVzIHdvcmsgaW4gbG9uZ2VyIHN0cmluZ3MsXG4gICAgICAgICBhdCB0aGUgY29zdCBvZiBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIHNwaW5lIG9mIFtsaXN0XS5cblxuICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSdyZSBsb29raW5nIGZvciB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgdGhlIHN0cmluZ3M6XG5cbiAgICAgICAgIHt2XG4gICAgICAgICAgICBsZXQgbG9uZ19hID0gTGlzdC5pbml0IDEwMDAgfmY6KEZuLmNvbnN0ICdhJylcbiAgICAgICAgICAgIFsgbG9uZ19hOyBsb25nX2E7ICdhYScgXVxuICAgICAgICAgdn1cblxuICAgICAgICAgdGhlIGFwcHJvYWNoIGJlbG93IHdpbGwganVzdCBjaGVjayB0aGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgb2YgYWxsIHRoZSBzdHJpbmdzLlxuICAgICAgKilcbiAgICAgIGxldCBtYXhfbGVuID0gbGVuZ3RoIChzaG9ydGVzdCBsaXN0KSBpblxuICAgICAgY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3AgZmlyc3QgcmVzdCB+Z2V0X3BvcyB+bWF4X2xlblxuICA7O1xuXG4gICgqIE91ciBnZW5lcmljIGFjY2Vzc29ycyB0aGF0IHByb2R1Y2UgYSBzdHJpbmcgYWJzdHJhY3Qgb3ZlciBbdGFrZV0sIHdoaWNoIGlzIGVpdGhlclxuICAgICBbcHJlZml4XSBvciBbc3VmZml4XS4gKilcblxuICBsZXQgY29tbW9uX2dlbmVyaWMyIGEgYiB+Z2V0X3BvcyB+dGFrZSA9XG4gICAgbGV0IGxlbiA9IGNvbW1vbl9nZW5lcmljMl9sZW5ndGggYSBiIH5nZXRfcG9zIGluXG4gICAgKCogVXNlIHRoZSBzaG9ydGVyIG9mIHRoZSB0d28gc3RyaW5ncywgc28gdGhhdCBpZiB0aGUgc2hvcnRlciBvbmUgaXMgdGhlIHNoYXJlZFxuICAgICAgIHByZWZpeCwgW3Rha2VdIHdvbid0IGFsbG9jYXRlIGFub3RoZXIgc3RyaW5nLiAqKVxuICAgIHRha2UgKHNob3J0ZXIgYSBiKSBsZW5cbiAgOztcblxuICBsZXQgY29tbW9uX2dlbmVyaWMgbGlzdCB+Z2V0X3BvcyB+dGFrZSA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBcIlwiXG4gICAgfCBmaXJzdCA6OiByZXN0IC0+XG4gICAgICAoKiBBcyB3aXRoIFtjb21tb25fZ2VuZXJpY19sZW5ndGhdLCB3ZSBiYXNlIFttYXhfbGVuXSBvbiBbc2hvcnRlc3QgbGlzdF0uIFdlIGFsc29cbiAgICAgICAgIHVzZSB0aGlzIHJlc3VsdCBmb3IgW3Rha2VdLCBiZWxvdywgdG8gcG90ZW50aWFsbHkgYXZvaWQgYWxsb2NhdGluZyBhIHN0cmluZy4gKilcbiAgICAgIGxldCBzID0gc2hvcnRlc3QgbGlzdCBpblxuICAgICAgbGV0IG1heF9sZW4gPSBsZW5ndGggcyBpblxuICAgICAgaWYgbWF4X2xlbiA9IDBcbiAgICAgIHRoZW4gXCJcIlxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBsZW4gPVxuICAgICAgICAgICgqIFdlIGNhbGwgZGlyZWN0bHkgaW50byBbY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3BdIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgW2NvbW1vbl9nZW5lcmljX2xlbmd0aF0gdG8gYXZvaWQgcmVjb21wdXRpbmcgW3Nob3J0ZXN0IGxpc3RdLiAqKVxuICAgICAgICAgIGNvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wIGZpcnN0IHJlc3QgfmdldF9wb3Mgfm1heF9sZW5cbiAgICAgICAgaW5cbiAgICAgICAgdGFrZSBzIGxlbilcbiAgOztcbmVuZFxuXG5pbmNsdWRlIHN0cnVjdFxuICBvcGVuIEZvcl9jb21tb25fcHJlZml4X2FuZF9zdWZmaXhcblxuICBsZXQgY29tbW9uX3ByZWZpeCBsaXN0ID0gY29tbW9uX2dlbmVyaWMgbGlzdCB+dGFrZTpwcmVmaXggfmdldF9wb3M6cG9zX2Zyb21fbGVmdFxuICBsZXQgY29tbW9uX3N1ZmZpeCBsaXN0ID0gY29tbW9uX2dlbmVyaWMgbGlzdCB+dGFrZTpzdWZmaXggfmdldF9wb3M6cG9zX2Zyb21fcmlnaHRcbiAgbGV0IGNvbW1vbl9wcmVmaXgyIGEgYiA9IGNvbW1vbl9nZW5lcmljMiBhIGIgfnRha2U6cHJlZml4IH5nZXRfcG9zOnBvc19mcm9tX2xlZnRcbiAgbGV0IGNvbW1vbl9zdWZmaXgyIGEgYiA9IGNvbW1vbl9nZW5lcmljMiBhIGIgfnRha2U6c3VmZml4IH5nZXRfcG9zOnBvc19mcm9tX3JpZ2h0XG4gIGxldCBjb21tb25fcHJlZml4X2xlbmd0aCBsaXN0ID0gY29tbW9uX2dlbmVyaWNfbGVuZ3RoIGxpc3QgfmdldF9wb3M6cG9zX2Zyb21fbGVmdFxuICBsZXQgY29tbW9uX3N1ZmZpeF9sZW5ndGggbGlzdCA9IGNvbW1vbl9nZW5lcmljX2xlbmd0aCBsaXN0IH5nZXRfcG9zOnBvc19mcm9tX3JpZ2h0XG4gIGxldCBjb21tb25fcHJlZml4Ml9sZW5ndGggYSBiID0gY29tbW9uX2dlbmVyaWMyX2xlbmd0aCBhIGIgfmdldF9wb3M6cG9zX2Zyb21fbGVmdFxuICBsZXQgY29tbW9uX3N1ZmZpeDJfbGVuZ3RoIGEgYiA9IGNvbW1vbl9nZW5lcmljMl9sZW5ndGggYSBiIH5nZXRfcG9zOnBvc19mcm9tX3JpZ2h0XG5lbmRcblxuKCogVGhlcmUgdXNlZCB0byBiZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdhcyBmYXN0ZXIgZm9yIHZlcnkgc2hvcnQgc3RyaW5nc1xuICAgKHBlYWtpbmcgYXQgNDAlIGZhc3RlciBmb3IgNC02IGNoYXIgbG9uZyBzdHJpbmdzKS5cbiAgIFRoaXMgbmV3IGZ1bmN0aW9uIGlzIGFyb3VuZCAyMCUgZmFzdGVyIHRoYW4gdGhlIGRlZmF1bHQgaGFzaCBmdW5jdGlvbiwgYnV0IHNsb3dlclxuICAgdGhhbiB0aGUgcHJldmlvdXMgY3VzdG9tIGltcGxlbWVudGF0aW9uLiBIb3dldmVyLCB0aGUgbmV3IE9DYW1sIGZ1bmN0aW9uIGlzIHdlbGxcbiAgIGJlaGF2ZWQsIGFuZCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGxlc3MgbGlrZWx5IHRvIGRpdmVyZ2UgZnJvbSB0aGUgZGVmYXVsdCBPQ2FtbFxuICAgaW1wbGVtZW50YXRpb24gZG9lcywgd2hpY2ggaXMgYSBkZXNpcmFibGUgcHJvcGVydHkuIChUaGUgb25seSB3YXkgdG8gYXZvaWQgdGhlXG4gICBkaXZlcmdlbmNlIGlzIHRvIGV4cG9zZSB0aGUgbWFjcm8gcmVkZWZpbmVkIGluIGhhc2hfc3R1YnMuYyBpbiB0aGUgaGFzaC5oIGhlYWRlciBvZlxuICAgdGhlIE9DYW1sIGNvbXBpbGVyLikgKilcbm1vZHVsZSBIYXNoID0gc3RydWN0XG4gIGV4dGVybmFsIGhhc2ggOiBzdHJpbmcgLT4gaW50ID0gXCJCYXNlX2hhc2hfc3RyaW5nXCIgW0BAbm9hbGxvY11cbmVuZFxuXG4oKiBbaW5jbHVkZSBIYXNoXSB0byBtYWtlIHRoZSBbZXh0ZXJuYWxdIHZlcnNpb24gb3ZlcnJpZGUgdGhlIFtoYXNoXSBmcm9tXG4gICBbSGFzaGFibGUuTWFrZV9iaW5hYmxlXSwgc28gdGhhdCB3ZSBnZXQgYSBsaXR0bGUgYml0IG9mIGEgc3BlZWR1cCBieSBleHBvc2luZyBpdCBhc1xuICAgZXh0ZXJuYWwgaW4gdGhlIG1saS4gKilcbmxldCBfID0gaGFzaFxuXG5pbmNsdWRlIEhhc2hcblxuKCogZm9yIGludGVyYWN0aXZlIHRvcC1sZXZlbHMgLS0gbW9kdWxlcyBkZXJpdmluZyBmcm9tIFN0cmluZyBzaG91bGQgaGF2ZSBTdHJpbmcncyBwcmV0dHlcbiAgIHByaW50ZXIuICopXG5sZXQgcHAgcHBmIHN0cmluZyA9IENhbWwuRm9ybWF0LmZwcmludGYgcHBmIFwiJVNcIiBzdHJpbmdcbmxldCBvZl9jaGFyIGMgPSBtYWtlIDEgY1xuXG5sZXQgb2ZfY2hhcl9saXN0IGwgPVxuICBsZXQgdCA9IEJ5dGVzLmNyZWF0ZSAoTGlzdC5sZW5ndGggbCkgaW5cbiAgTGlzdC5pdGVyaSBsIH5mOihmdW4gaSBjIC0+IEJ5dGVzLnNldCB0IGkgYyk7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6dFxuOztcblxubW9kdWxlIEVzY2FwaW5nID0gc3RydWN0XG4gICgqIElmIHRoaXMgaXMgY2hhbmdlZCwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBbZXNjYXBlXSwgd2hpY2ggYXR0ZW1wdHMgdG8gZW5zdXJlIGFsbCB0aGVcbiAgICAgaW52YXJpYW50cyBjaGVja2VkIGhlcmUuICAqKVxuICBsZXQgYnVpbGRfYW5kX3ZhbGlkYXRlX2VzY2FwZXdvcnRoeV9tYXAgZXNjYXBld29ydGh5X21hcCBlc2NhcGVfY2hhciBmdW5jID1cbiAgICBsZXQgZXNjYXBld29ydGh5X21hcCA9XG4gICAgICBpZiBMaXN0LkFzc29jLm1lbSBlc2NhcGV3b3J0aHlfbWFwIH5lcXVhbDpDaGFyLmVxdWFsIGVzY2FwZV9jaGFyXG4gICAgICB0aGVuIGVzY2FwZXdvcnRoeV9tYXBcbiAgICAgIGVsc2UgKGVzY2FwZV9jaGFyLCBlc2NhcGVfY2hhcikgOjogZXNjYXBld29ydGh5X21hcFxuICAgIGluXG4gICAgbGV0IGFyciA9IEFycmF5LmNyZWF0ZSB+bGVuOjI1NiAoLTEpIGluXG4gICAgbGV0IHZhbHMgPSBBcnJheS5jcmVhdGUgfmxlbjoyNTYgZmFsc2UgaW5cbiAgICBsZXQgcmVjIGxvb3AgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBPayBhcnJcbiAgICAgIHwgKGNfZnJvbSwgY190bykgOjogbCAtPlxuICAgICAgICBsZXQgaywgdiA9XG4gICAgICAgICAgbWF0Y2ggZnVuYyB3aXRoXG4gICAgICAgICAgfCBgRXNjYXBlIC0+IENoYXIudG9faW50IGNfZnJvbSwgY190b1xuICAgICAgICAgIHwgYFVuZXNjYXBlIC0+IENoYXIudG9faW50IGNfdG8sIGNfZnJvbVxuICAgICAgICBpblxuICAgICAgICBpZiBhcnIuKGspIDw+IC0xIHx8IHZhbHMuKENoYXIudG9faW50IHYpXG4gICAgICAgIHRoZW5cbiAgICAgICAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgICAgICBcImVzY2FwZXdvcnRoeV9tYXAgbm90IG9uZS10by1vbmVcIlxuICAgICAgICAgICAgICAgWyBcImNfZnJvbVwiLCBzZXhwX29mX2NoYXIgY19mcm9tXG4gICAgICAgICAgICAgICA7IFwiY190b1wiLCBzZXhwX29mX2NoYXIgY190b1xuICAgICAgICAgICAgICAgOyAoIFwiZXNjYXBld29ydGh5X21hcFwiXG4gICAgICAgICAgICAgICAgICwgc2V4cF9vZl9saXN0IChzZXhwX29mX3BhaXIgc2V4cF9vZl9jaGFyIHNleHBfb2ZfY2hhcikgZXNjYXBld29ydGh5X21hcFxuICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICBdKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBhcnIuKGspIDwtIENoYXIudG9faW50IHY7XG4gICAgICAgICAgdmFscy4oQ2hhci50b19pbnQgdikgPC0gdHJ1ZTtcbiAgICAgICAgICBsb29wIGwpXG4gICAgaW5cbiAgICBsb29wIGVzY2FwZXdvcnRoeV9tYXBcbiAgOztcblxuICBsZXQgZXNjYXBlX2dlbiB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIgPVxuICAgIG1hdGNoIGJ1aWxkX2FuZF92YWxpZGF0ZV9lc2NhcGV3b3J0aHlfbWFwIGVzY2FwZXdvcnRoeV9tYXAgZXNjYXBlX2NoYXIgYEVzY2FwZSB3aXRoXG4gICAgfCBFcnJvciBfIGFzIHggLT4geFxuICAgIHwgT2sgZXNjYXBld29ydGh5IC0+XG4gICAgICBPa1xuICAgICAgICAoZnVuIHNyYyAtPlxuICAgICAgICAgICAoKiBjYWxjdWxhdGUgYSBsaXN0IG9mIChpbmRleCBvZiBjaGFyIHRvIGVzY2FwZSAqIGVzY2FwZWQgY2hhcikgZmlyc3QsIHRoZSBvcmRlclxuICAgICAgICAgICAgICBpcyBmcm9tIHRhaWwgdG8gaGVhZCAqKVxuICAgICAgICAgICBsZXQgdG9fZXNjYXBlX2xlbiA9IHJlZiAwIGluXG4gICAgICAgICAgIGxldCB0b19lc2NhcGUgPVxuICAgICAgICAgICAgIGZvbGRpIHNyYyB+aW5pdDpbXSB+ZjooZnVuIGkgYWNjIGMgLT5cbiAgICAgICAgICAgICAgIG1hdGNoIGVzY2FwZXdvcnRoeS4oQ2hhci50b19pbnQgYykgd2l0aFxuICAgICAgICAgICAgICAgfCAtMSAtPiBhY2NcbiAgICAgICAgICAgICAgIHwgbiAtPlxuICAgICAgICAgICAgICAgICAoKiAoaW5kZXggb2YgY2hhciB0byBlc2NhcGUgKiBlc2NhcGVkIGNoYXIpICopXG4gICAgICAgICAgICAgICAgIGluY3IgdG9fZXNjYXBlX2xlbjtcbiAgICAgICAgICAgICAgICAgKGksIENoYXIudW5zYWZlX29mX2ludCBuKSA6OiBhY2MpXG4gICAgICAgICAgIGluXG4gICAgICAgICAgIG1hdGNoIHRvX2VzY2FwZSB3aXRoXG4gICAgICAgICAgIHwgW10gLT4gc3JjXG4gICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICgqIFt0b19lc2NhcGVdIGRpdmlkZSBbc3JjXSB0byBbTGlzdC5sZW5ndGggdG9fZXNjYXBlICsgMV0gcGllY2VzIHNlcGFyYXRlZCBieVxuICAgICAgICAgICAgICAgIHRoZSBjaGFycyB0byBlc2NhcGUuXG5cbiAgICAgICAgICAgICAgICBMZXRzIHRha2VcbiAgICAgICAgICAgICAgICB7W1xuICAgICAgICAgICAgICAgICAgZXNjYXBlX2dlbl9leG5cbiAgICAgICAgICAgICAgICAgICAgfmVzY2FwZXdvcnRoeV9tYXA6WygnYScsICdBJyk7ICgnYicsICdCJyk7ICgnYycsICdDJyldXG4gICAgICAgICAgICAgICAgICAgIH5lc2NhcGVfY2hhcjonXydcbiAgICAgICAgICAgICAgICBdfVxuICAgICAgICAgICAgICAgIGZvciBleGFtcGxlLCBhbmQgYXNzdW1lIHRoZSBzdHJpbmcgdG8gZXNjYXBlIGlzXG5cbiAgICAgICAgICAgICAgICBcIjAwMGExMTFiMjIyYzMzM1wiXG5cbiAgICAgICAgICAgICAgICB0aGVuIFt0b19lc2NhcGVdIGlzIFsoMTEsICdDJyk7ICg3LCAnQicpOyAoMywgJ0EnKV0uXG5cbiAgICAgICAgICAgICAgICBUaGVuIHdlIGNyZWF0ZSBhIFtkc3RdIG9mIGxlbmd0aCBbbGVuZ3RoIHNyYyArIDNdIHRvIHN0b3JlIHRoZVxuICAgICAgICAgICAgICAgIHJlc3VsdCwgY29weSBwaWVjZSBcIjMzM1wiIHRvIFtkc3RdIGRpcmVjdGx5LCB0aGVuIGNvcHkgJ18nIGFuZCAnQycgdG8gW2RzdF07XG4gICAgICAgICAgICAgICAgdGhlbiBtb3ZlIG9uIHRvIG5leHQ7IGFmdGVyIDMgaXRlcmF0aW9ucywgY29weSBwaWVjZSBcIjAwMFwiIGFuZCB3ZSBhcmUgZG9uZS5cblxuICAgICAgICAgICAgICAgIEZpbmFsbHkgdGhlIHJlc3VsdCB3aWxsIGJlXG5cbiAgICAgICAgICAgICAgICBcIjAwMF9BMTExX0IyMjJfQzMzM1wiICopXG4gICAgICAgICAgICAgbGV0IHNyY19sZW4gPSBsZW5ndGggc3JjIGluXG4gICAgICAgICAgICAgbGV0IGRzdF9sZW4gPSBzcmNfbGVuICsgIXRvX2VzY2FwZV9sZW4gaW5cbiAgICAgICAgICAgICBsZXQgZHN0ID0gQnl0ZXMuY3JlYXRlIGRzdF9sZW4gaW5cbiAgICAgICAgICAgICBsZXQgcmVjIGxvb3AgbGFzdF9pZHggbGFzdF9kc3RfcG9zID0gZnVuY3Rpb25cbiAgICAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICAgKCogY29weSBcIjAwMFwiIGF0IGxhc3QgKilcbiAgICAgICAgICAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3BvczowIH5kc3QgfmRzdF9wb3M6MCB+bGVuOmxhc3RfaWR4XG4gICAgICAgICAgICAgICB8IChpZHgsIGVzY2FwZWRfY2hhcikgOjogdG9fZXNjYXBlIC0+XG4gICAgICAgICAgICAgICAgICgqW2lkeF0gPSB0aGUgY2hhciB0byBlc2NhcGUqKVxuICAgICAgICAgICAgICAgICAoKiB0YWtlIGZpcnN0IGl0ZXJhdGlvbiBmb3IgZXhhbXBsZSAqKVxuICAgICAgICAgICAgICAgICAoKiBjYWxjdWxhdGUgbGVuZ3RoIG9mIFwiMzMzXCIsIG1pbnVzIDEgYmVjYXVzZSB3ZSBkb24ndCBjb3B5ICdjJyAqKVxuICAgICAgICAgICAgICAgICBsZXQgbGVuID0gbGFzdF9pZHggLSBpZHggLSAxIGluXG4gICAgICAgICAgICAgICAgICgqIHNldCB0aGUgZHN0X3BvcyB0byBjb3B5IHRvICopXG4gICAgICAgICAgICAgICAgIGxldCBkc3RfcG9zID0gbGFzdF9kc3RfcG9zIC0gbGVuIGluXG4gICAgICAgICAgICAgICAgICgqIGNvcHkgXCIzMzNcIiwgc2V0IFtzcmNfcG9zXSB0byBbaWR4ICsgMV0gdG8gc2tpcCAnYycgKilcbiAgICAgICAgICAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3BvczooaWR4ICsgMSkgfmRzdCB+ZHN0X3BvcyB+bGVuO1xuICAgICAgICAgICAgICAgICAoKiBiYWNrb2ZmIFtkc3RfcG9zXSBieSAyIHRvIGNvcHkgJ18nIGFuZCAnQycgKilcbiAgICAgICAgICAgICAgICAgbGV0IGRzdF9wb3MgPSBkc3RfcG9zIC0gMiBpblxuICAgICAgICAgICAgICAgICBCeXRlcy5zZXQgZHN0IGRzdF9wb3MgZXNjYXBlX2NoYXI7XG4gICAgICAgICAgICAgICAgIEJ5dGVzLnNldCBkc3QgKGRzdF9wb3MgKyAxKSBlc2NhcGVkX2NoYXI7XG4gICAgICAgICAgICAgICAgIGxvb3AgaWR4IGRzdF9wb3MgdG9fZXNjYXBlXG4gICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAoKiBzZXQgW2xhc3RfZHN0X3Bvc10gYW5kIFtsYXN0X2lkeF0gdG8gbGVuZ3RoIG9mIFtkc3RdIGFuZCBbc3JjXSBmaXJzdCAqKVxuICAgICAgICAgICAgIGxvb3Agc3JjX2xlbiBkc3RfbGVuIHRvX2VzY2FwZTtcbiAgICAgICAgICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOmRzdClcbiAgOztcblxuICBsZXQgZXNjYXBlX2dlbl9leG4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyID1cbiAgICBPcl9lcnJvci5va19leG4gKGVzY2FwZV9nZW4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyKSB8PiBzdGFnZVxuICA7O1xuXG4gIGxldCBlc2NhcGUgfmVzY2FwZXdvcnRoeSB+ZXNjYXBlX2NoYXIgPVxuICAgICgqIEZvciBbZXNjYXBlX2dlbl9leG5dLCB3ZSBkb24ndCBrbm93IGhvdyB0byBmaXggaW52YWxpZCBlc2NhcGV3b3J0aHlfbWFwIHNvIHdlIGhhdmVcbiAgICAgICB0byByYWlzZSBleGNlcHRpb247IGJ1dCBpbiB0aGlzIGNhc2UsIHdlIGtub3cgaG93IHRvIGZpeCBkdXBsaWNhdGVkIGVsZW1lbnRzIGluXG4gICAgICAgZXNjYXBld29ydGh5IGxpc3QsIHNvIHdlIGp1c3QgZml4IGl0IGluc3RlYWQgb2YgcmFpc2luZyBleGNlcHRpb24gdG8gbWFrZSB0aGlzXG4gICAgICAgZnVuY3Rpb24gZWFzaWVyIHRvIHVzZS4gICopXG4gICAgbGV0IGVzY2FwZXdvcnRoeV9tYXAgPVxuICAgICAgZXNjYXBld29ydGh5XG4gICAgICB8PiBMaXN0LmRlZHVwX2FuZF9zb3J0IH5jb21wYXJlOkNoYXIuY29tcGFyZVxuICAgICAgfD4gTGlzdC5tYXAgfmY6KGZ1biBjIC0+IGMsIGMpXG4gICAgaW5cbiAgICBlc2NhcGVfZ2VuX2V4biB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXJcbiAgOztcblxuICAoKiBJbiBhbiBlc2NhcGVkIHN0cmluZywgYW55IGNoYXIgaXMgZWl0aGVyIGBFc2NhcGluZywgYEVzY2FwZWQgb3IgYExpdGVyYWwuIEZvclxuICAgICBleGFtcGxlLCB0aGUgZXNjYXBlIHN0YXR1c2VzIG9mIGNoYXJzIGluIHN0cmluZyBcImFfYV9fXCIgd2l0aCBlc2NhcGVfY2hhciA9ICdfJyBhcmVcblxuICAgICBhIDogYExpdGVyYWxcbiAgICAgXyA6IGBFc2NhcGluZ1xuICAgICBhIDogYEVzY2FwZWRcbiAgICAgXyA6IGBFc2NhcGluZ1xuICAgICBfIDogYEVzY2FwZWRcblxuICAgICBbdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBpIHByZXZpb3VzX3N0YXR1c10gZ2V0cyBlc2NhcGUgc3RhdHVzIG9mXG4gICAgIHN0ci5baV0gYmFzaW5nIG9uIGVzY2FwZSBzdGF0dXMgb2Ygc3RyLltpIC0gMV0gKilcbiAgbGV0IHVwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgaSA9IGZ1bmN0aW9uXG4gICAgfCBgRXNjYXBpbmcgLT4gYEVzY2FwZWRcbiAgICB8IGBMaXRlcmFsIHwgYEVzY2FwZWQgLT5cbiAgICAgIGlmIENoYXIuZXF1YWwgc3RyLltpXSBlc2NhcGVfY2hhciB0aGVuIGBFc2NhcGluZyBlbHNlIGBMaXRlcmFsXG4gIDs7XG5cbiAgbGV0IHVuZXNjYXBlX2dlbiB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIgPVxuICAgIG1hdGNoIGJ1aWxkX2FuZF92YWxpZGF0ZV9lc2NhcGV3b3J0aHlfbWFwIGVzY2FwZXdvcnRoeV9tYXAgZXNjYXBlX2NoYXIgYFVuZXNjYXBlIHdpdGhcbiAgICB8IEVycm9yIF8gYXMgeCAtPiB4XG4gICAgfCBPayBlc2NhcGV3b3J0aHkgLT5cbiAgICAgIE9rXG4gICAgICAgIChmdW4gc3JjIC0+XG4gICAgICAgICAgICgqIENvbnRpbnVlIHRoZSBleGFtcGxlIGluIFtlc2NhcGVfZ2VuX2V4bl0sIG5vdyB3ZSB1bmVzY2FwZVxuXG4gICAgICAgICAgICAgIFwiMDAwX0ExMTFfQjIyMl9DMzMzXCJcblxuICAgICAgICAgICAgICBiYWNrIHRvXG5cbiAgICAgICAgICAgICAgXCIwMDBhMTExYjIyMmMzMzNcIlxuXG4gICAgICAgICAgICAgIFRoZW4gW3RvX3VuZXNjYXBlXSBpcyBbMTQ7IDk7IDRdLCB3aGljaCBpcyBpbmRleGVzIG9mICdfJ3MuXG5cbiAgICAgICAgICAgICAgVGhlbiB3ZSBjcmVhdGUgYSBzdHJpbmcgW2RzdF0gdG8gc3RvcmUgdGhlIHJlc3VsdCwgY29weSBcIjMzM1wiIHRvIGl0LCB0aGVuIGNvcHlcbiAgICAgICAgICAgICAgJ2MnLCB0aGVuIG1vdmUgb24gdG8gbmV4dCBpdGVyYXRpb24uIEFmdGVyIDMgaXRlcmF0aW9ucyBjb3B5IFwiMDAwXCIgYW5kIHdlIGFyZVxuICAgICAgICAgICAgICBkb25lLiAgKilcbiAgICAgICAgICAgKCogaW5kZXhlcyBvZiBlc2NhcGUgY2hhcnMgKilcbiAgICAgICAgICAgbGV0IHRvX3VuZXNjYXBlID1cbiAgICAgICAgICAgICBsZXQgcmVjIGxvb3AgaSBzdGF0dXMgYWNjID1cbiAgICAgICAgICAgICAgIGlmIGkgPj0gbGVuZ3RoIHNyY1xuICAgICAgICAgICAgICAgdGhlbiBhY2NcbiAgICAgICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3JjIH5lc2NhcGVfY2hhciBpIHN0YXR1cyBpblxuICAgICAgICAgICAgICAgICBsb29wXG4gICAgICAgICAgICAgICAgICAgKGkgKyAxKVxuICAgICAgICAgICAgICAgICAgIHN0YXR1c1xuICAgICAgICAgICAgICAgICAgIChtYXRjaCBzdGF0dXMgd2l0aFxuICAgICAgICAgICAgICAgICAgICB8IGBFc2NhcGluZyAtPiBpIDo6IGFjY1xuICAgICAgICAgICAgICAgICAgICB8IGBFc2NhcGVkIHwgYExpdGVyYWwgLT4gYWNjKSlcbiAgICAgICAgICAgICBpblxuICAgICAgICAgICAgIGxvb3AgMCBgTGl0ZXJhbCBbXVxuICAgICAgICAgICBpblxuICAgICAgICAgICBtYXRjaCB0b191bmVzY2FwZSB3aXRoXG4gICAgICAgICAgIHwgW10gLT4gc3JjXG4gICAgICAgICAgIHwgaWR4IDo6IHRvX3VuZXNjYXBlJyAtPlxuICAgICAgICAgICAgIGxldCBkc3QgPSBCeXRlcy5jcmVhdGUgKGxlbmd0aCBzcmMgLSBMaXN0Lmxlbmd0aCB0b191bmVzY2FwZSkgaW5cbiAgICAgICAgICAgICBsZXQgcmVjIGxvb3AgbGFzdF9pZHggbGFzdF9kc3RfcG9zID0gZnVuY3Rpb25cbiAgICAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICAgKCogY29weSBcIjAwMFwiIGF0IGxhc3QgKilcbiAgICAgICAgICAgICAgICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3BvczowIH5kc3QgfmRzdF9wb3M6MCB+bGVuOmxhc3RfaWR4XG4gICAgICAgICAgICAgICB8IGlkeCA6OiB0b191bmVzY2FwZSAtPlxuICAgICAgICAgICAgICAgICAoKiBbaWR4XSA9IGluZGV4IG9mIGVzY2FwaW5nIGNoYXIgKilcbiAgICAgICAgICAgICAgICAgKCogdGFrZSAxc3QgaXRlcmF0aW9uIGFzIGV4YW1wbGUsIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIFwiMzMzXCIsIG1pbnVzIDIgdG9cbiAgICAgICAgICAgICAgICAgICAgc2tpcCAnX0MnICopXG4gICAgICAgICAgICAgICAgIGxldCBsZW4gPSBsYXN0X2lkeCAtIGlkeCAtIDIgaW5cbiAgICAgICAgICAgICAgICAgKCogcG9pbnQgW2RzdF9wb3NdIHRvIHRoZSBwb3NpdGlvbiB0byBjb3B5IFwiMzMzXCIgdG8gKilcbiAgICAgICAgICAgICAgICAgbGV0IGRzdF9wb3MgPSBsYXN0X2RzdF9wb3MgLSBsZW4gaW5cbiAgICAgICAgICAgICAgICAgKCogY29weSBcIjMzM1wiICopXG4gICAgICAgICAgICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3M6KGlkeCArIDIpIH5kc3QgfmRzdF9wb3MgfmxlbjtcbiAgICAgICAgICAgICAgICAgKCogYmFja29mZiBbZHN0X3Bvc10gYnkgMSB0byBjb3B5ICdjJyAqKVxuICAgICAgICAgICAgICAgICBsZXQgZHN0X3BvcyA9IGRzdF9wb3MgLSAxIGluXG4gICAgICAgICAgICAgICAgIEJ5dGVzLnNldFxuICAgICAgICAgICAgICAgICAgIGRzdFxuICAgICAgICAgICAgICAgICAgIGRzdF9wb3NcbiAgICAgICAgICAgICAgICAgICAobWF0Y2ggZXNjYXBld29ydGh5LihDaGFyLnRvX2ludCBzcmMuW2lkeCArIDFdKSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHwgLTEgLT4gc3JjLltpZHggKyAxXVxuICAgICAgICAgICAgICAgICAgICB8IG4gLT4gQ2hhci51bnNhZmVfb2ZfaW50IG4pO1xuICAgICAgICAgICAgICAgICAoKiB1cGRhdGUgW2xhc3RfZHN0X3Bvc10gYW5kIFtsYXN0X2lkeF0gKilcbiAgICAgICAgICAgICAgICAgbG9vcCBpZHggZHN0X3BvcyB0b191bmVzY2FwZVxuICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgaWYgaWR4IDwgbGVuZ3RoIHNyYyAtIDFcbiAgICAgICAgICAgICB0aGVuXG4gICAgICAgICAgICAgICAoKiBzZXQgW2xhc3RfZHN0X3Bvc10gYW5kIFtsYXN0X2lkeF0gdG8gbGVuZ3RoIG9mIFtkc3RdIGFuZCBbc3JjXSAqKVxuICAgICAgICAgICAgICAgbG9vcCAobGVuZ3RoIHNyYykgKEJ5dGVzLmxlbmd0aCBkc3QpIHRvX3VuZXNjYXBlXG4gICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgKCogZm9yIGVzY2FwZWQgc3RyaW5nIGVuZGluZyB3aXRoIGFuIGVzY2FwaW5nIGNoYXIgbGlrZSBcIjAwMF9cIiwganVzdCBpZ25vcmVcbiAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IGVzY2FwaW5nIGNoYXIgKilcbiAgICAgICAgICAgICAgIGxvb3AgKGxlbmd0aCBzcmMgLSAxKSAoQnl0ZXMubGVuZ3RoIGRzdCkgdG9fdW5lc2NhcGUnO1xuICAgICAgICAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6ZHN0KVxuICA7O1xuXG4gIGxldCB1bmVzY2FwZV9nZW5fZXhuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhciA9XG4gICAgT3JfZXJyb3Iub2tfZXhuICh1bmVzY2FwZV9nZW4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyKSB8PiBzdGFnZVxuICA7O1xuXG4gIGxldCB1bmVzY2FwZSB+ZXNjYXBlX2NoYXIgPSB1bmVzY2FwZV9nZW5fZXhuIH5lc2NhcGV3b3J0aHlfbWFwOltdIH5lc2NhcGVfY2hhclxuXG4gIGxldCBwcmVjZWRpbmdfZXNjYXBlX2NoYXJzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zID1cbiAgICBsZXQgcmVjIGxvb3AgcCBjbnQgPVxuICAgICAgaWYgcCA8IDAgfHwgQ2hhci4oIDw+ICkgc3RyLltwXSBlc2NhcGVfY2hhciB0aGVuIGNudCBlbHNlIGxvb3AgKHAgLSAxKSAoY250ICsgMSlcbiAgICBpblxuICAgIGxvb3AgKHBvcyAtIDEpIDBcbiAgOztcblxuICAoKiBJbiBhbiBlc2NhcGVkIHN0cmluZywgYW55IGNoYXIgaXMgZWl0aGVyIGBFc2NhcGluZywgYEVzY2FwZWQgb3IgYExpdGVyYWwuIEZvclxuICAgICBleGFtcGxlLCB0aGUgZXNjYXBlIHN0YXR1c2VzIG9mIGNoYXJzIGluIHN0cmluZyBcImFfYV9fXCIgd2l0aCBlc2NhcGVfY2hhciA9ICdfJyBhcmVcblxuICAgICBhIDogYExpdGVyYWxcbiAgICAgXyA6IGBFc2NhcGluZ1xuICAgICBhIDogYEVzY2FwZWRcbiAgICAgXyA6IGBFc2NhcGluZ1xuICAgICBfIDogYEVzY2FwZWRcblxuICAgICBbdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBpIHByZXZpb3VzX3N0YXR1c10gZ2V0cyBlc2NhcGUgc3RhdHVzIG9mXG4gICAgIHN0ci5baV0gYmFzaW5nIG9uIGVzY2FwZSBzdGF0dXMgb2Ygc3RyLltpIC0gMV0gKilcbiAgbGV0IHVwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgaSA9IGZ1bmN0aW9uXG4gICAgfCBgRXNjYXBpbmcgLT4gYEVzY2FwZWRcbiAgICB8IGBMaXRlcmFsIHwgYEVzY2FwZWQgLT5cbiAgICAgIGlmIENoYXIuZXF1YWwgc3RyLltpXSBlc2NhcGVfY2hhciB0aGVuIGBFc2NhcGluZyBlbHNlIGBMaXRlcmFsXG4gIDs7XG5cbiAgbGV0IGVzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3MgPVxuICAgIGxldCBvZGQgPSBwcmVjZWRpbmdfZXNjYXBlX2NoYXJzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIG1vZCAyID0gMSBpblxuICAgIG1hdGNoIG9kZCwgQ2hhci5lcXVhbCBzdHIuW3Bvc10gZXNjYXBlX2NoYXIgd2l0aFxuICAgIHwgdHJ1ZSwgKHRydWUgfCBmYWxzZSkgLT4gYEVzY2FwZWRcbiAgICB8IGZhbHNlLCB0cnVlIC0+IGBFc2NhcGluZ1xuICAgIHwgZmFsc2UsIGZhbHNlIC0+IGBMaXRlcmFsXG4gIDs7XG5cbiAgbGV0IGNoZWNrX2JvdW5kIHN0ciBwb3MgZnVuY3Rpb25fbmFtZSA9XG4gICAgaWYgcG9zID49IGxlbmd0aCBzdHIgfHwgcG9zIDwgMCB0aGVuIGludmFsaWRfYXJnZiBcIiVzOiBvdXQgb2YgYm91bmRzXCIgZnVuY3Rpb25fbmFtZSAoKVxuICA7O1xuXG4gIGxldCBpc19jaGFyX2VzY2FwaW5nIHN0ciB+ZXNjYXBlX2NoYXIgcG9zID1cbiAgICBjaGVja19ib3VuZCBzdHIgcG9zIFwiaXNfY2hhcl9lc2NhcGluZ1wiO1xuICAgIG1hdGNoIGVzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3Mgd2l0aFxuICAgIHwgYEVzY2FwaW5nIC0+IHRydWVcbiAgICB8IGBFc2NhcGVkIHwgYExpdGVyYWwgLT4gZmFsc2VcbiAgOztcblxuICBsZXQgaXNfY2hhcl9lc2NhcGVkIHN0ciB+ZXNjYXBlX2NoYXIgcG9zID1cbiAgICBjaGVja19ib3VuZCBzdHIgcG9zIFwiaXNfY2hhcl9lc2NhcGVkXCI7XG4gICAgbWF0Y2ggZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcyB3aXRoXG4gICAgfCBgRXNjYXBlZCAtPiB0cnVlXG4gICAgfCBgRXNjYXBpbmcgfCBgTGl0ZXJhbCAtPiBmYWxzZVxuICA7O1xuXG4gIGxldCBpc19jaGFyX2xpdGVyYWwgc3RyIH5lc2NhcGVfY2hhciBwb3MgPVxuICAgIGNoZWNrX2JvdW5kIHN0ciBwb3MgXCJpc19jaGFyX2xpdGVyYWxcIjtcbiAgICBtYXRjaCBlc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIHdpdGhcbiAgICB8IGBMaXRlcmFsIC0+IHRydWVcbiAgICB8IGBFc2NhcGVkIHwgYEVzY2FwaW5nIC0+IGZhbHNlXG4gIDs7XG5cbiAgbGV0IGluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciA9XG4gICAgY2hlY2tfYm91bmQgc3RyIHBvcyBcImluZGV4X2Zyb21cIjtcbiAgICBsZXQgcmVjIGxvb3AgaSBzdGF0dXMgPVxuICAgICAgaWYgaSA+PSBwb3NcbiAgICAgICYmIChtYXRjaCBzdGF0dXMgd2l0aFxuICAgICAgICAgIHwgYExpdGVyYWwgLT4gdHJ1ZVxuICAgICAgICAgIHwgYEVzY2FwZWQgfCBgRXNjYXBpbmcgLT4gZmFsc2UpXG4gICAgICAmJiBDaGFyLmVxdWFsIHN0ci5baV0gY2hhclxuICAgICAgdGhlbiBTb21lIGlcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgaSA9IGkgKyAxIGluXG4gICAgICAgIGlmIGkgPj0gbGVuZ3RoIHN0clxuICAgICAgICB0aGVuIE5vbmVcbiAgICAgICAgZWxzZSBsb29wIGkgKHVwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgaSBzdGF0dXMpKVxuICAgIGluXG4gICAgbG9vcCBwb3MgKGVzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3MpXG4gIDs7XG5cbiAgbGV0IGluZGV4X2Zyb21fZXhuIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgPVxuICAgIG1hdGNoIGluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJpbmRleF9mcm9tX2V4bjogbm90IGZvdW5kXCJcbiAgICAgICAgICAgWyBcInN0clwiLCBzZXhwX29mX3Qgc3RyXG4gICAgICAgICAgIDsgXCJlc2NhcGVfY2hhclwiLCBzZXhwX29mX2NoYXIgZXNjYXBlX2NoYXJcbiAgICAgICAgICAgOyBcInBvc1wiLCBzZXhwX29mX2ludCBwb3NcbiAgICAgICAgICAgOyBcImNoYXJcIiwgc2V4cF9vZl9jaGFyIGNoYXJcbiAgICAgICAgICAgXSlcbiAgICB8IFNvbWUgcG9zIC0+IHBvc1xuICA7O1xuXG4gIGxldCBpbmRleCBzdHIgfmVzY2FwZV9jaGFyIGNoYXIgPSBpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgMCBjaGFyXG4gIGxldCBpbmRleF9leG4gc3RyIH5lc2NhcGVfY2hhciBjaGFyID0gaW5kZXhfZnJvbV9leG4gc3RyIH5lc2NhcGVfY2hhciAwIGNoYXJcblxuICBsZXQgcmluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciA9XG4gICAgY2hlY2tfYm91bmQgc3RyIHBvcyBcInJpbmRleF9mcm9tXCI7XG4gICAgKCogaWYgdGhlIHRhcmdldCBjaGFyIGlzIHRoZSBzYW1lIGFzIFtlc2NhcGVfY2hhcl0sIHdlIGhhdmUgbm8gd2F5IHRvIGRldGVybWluZSB3aGljaFxuICAgICAgIGVzY2FwZV9jaGFyIGlzIGxpdGVyYWwsIHNvIGp1c3QgcmV0dXJuIE5vbmUgKilcbiAgICBpZiBDaGFyLmVxdWFsIGNoYXIgZXNjYXBlX2NoYXJcbiAgICB0aGVuIE5vbmVcbiAgICBlbHNlIChcbiAgICAgIGxldCByZWMgbG9vcCBwb3MgPVxuICAgICAgICBpZiBwb3MgPCAwXG4gICAgICAgIHRoZW4gTm9uZVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgZXNjYXBlX2NoYXJzID0gcHJlY2VkaW5nX2VzY2FwZV9jaGFycyBzdHIgfmVzY2FwZV9jaGFyIHBvcyBpblxuICAgICAgICAgIGlmIGVzY2FwZV9jaGFycyBtb2QgMiA9IDAgJiYgQ2hhci5lcXVhbCBzdHIuW3Bvc10gY2hhclxuICAgICAgICAgIHRoZW4gU29tZSBwb3NcbiAgICAgICAgICBlbHNlIGxvb3AgKHBvcyAtIGVzY2FwZV9jaGFycyAtIDEpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgcG9zKVxuICA7O1xuXG4gIGxldCByaW5kZXhfZnJvbV9leG4gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciA9XG4gICAgbWF0Y2ggcmluZGV4X2Zyb20gc3RyIH5lc2NhcGVfY2hhciBwb3MgY2hhciB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJyaW5kZXhfZnJvbV9leG46IG5vdCBmb3VuZFwiXG4gICAgICAgICAgIFsgXCJzdHJcIiwgc2V4cF9vZl90IHN0clxuICAgICAgICAgICA7IFwiZXNjYXBlX2NoYXJcIiwgc2V4cF9vZl9jaGFyIGVzY2FwZV9jaGFyXG4gICAgICAgICAgIDsgXCJwb3NcIiwgc2V4cF9vZl9pbnQgcG9zXG4gICAgICAgICAgIDsgXCJjaGFyXCIsIHNleHBfb2ZfY2hhciBjaGFyXG4gICAgICAgICAgIF0pXG4gICAgfCBTb21lIHBvcyAtPiBwb3NcbiAgOztcblxuICBsZXQgcmluZGV4IHN0ciB+ZXNjYXBlX2NoYXIgY2hhciA9XG4gICAgaWYgaXNfZW1wdHkgc3RyIHRoZW4gTm9uZSBlbHNlIHJpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgKGxlbmd0aCBzdHIgLSAxKSBjaGFyXG4gIDs7XG5cbiAgbGV0IHJpbmRleF9leG4gc3RyIH5lc2NhcGVfY2hhciBjaGFyID1cbiAgICByaW5kZXhfZnJvbV9leG4gc3RyIH5lc2NhcGVfY2hhciAobGVuZ3RoIHN0ciAtIDEpIGNoYXJcbiAgOztcblxuICAoKiBbc3BsaXRfZ2VuIHN0ciB+ZXNjYXBlX2NoYXIgfm9uXSB3b3JrcyBzaW1pbGFybHkgdG8gW1N0cmluZy5zcGxpdF9nZW5dLCB3aXRoIGFuXG4gICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnQ6IG9ubHkgc3BsaXQgb24gbGl0ZXJhbCBjaGFycywgbm90IGVzY2FwaW5nIG9yIGVzY2FwZWQgKilcbiAgbGV0IHNwbGl0X2dlbiBzdHIgfmVzY2FwZV9jaGFyIH5vbiA9XG4gICAgbGV0IGlzX2RlbGltID1cbiAgICAgIG1hdGNoIG9uIHdpdGhcbiAgICAgIHwgYGNoYXIgYycgLT4gZnVuIGMgLT4gQ2hhci5lcXVhbCBjIGMnXG4gICAgICB8IGBjaGFyX2xpc3QgbCAtPiBmdW4gYyAtPiBjaGFyX2xpc3RfbWVtIGwgY1xuICAgIGluXG4gICAgbGV0IGxlbiA9IGxlbmd0aCBzdHIgaW5cbiAgICBsZXQgcmVjIGxvb3AgYWNjIHN0YXR1cyBsYXN0X3BvcyBwb3MgPVxuICAgICAgaWYgcG9zID0gbGVuXG4gICAgICB0aGVuIExpc3QucmV2IChzdWIgc3RyIH5wb3M6bGFzdF9wb3MgfmxlbjoobGVuIC0gbGFzdF9wb3MpIDo6IGFjYylcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgc3RhdHVzID0gdXBkYXRlX2VzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3Mgc3RhdHVzIGluXG4gICAgICAgIGlmIChtYXRjaCBzdGF0dXMgd2l0aFxuICAgICAgICAgIHwgYExpdGVyYWwgLT4gdHJ1ZVxuICAgICAgICAgIHwgYEVzY2FwZWQgfCBgRXNjYXBpbmcgLT4gZmFsc2UpXG4gICAgICAgICYmIGlzX2RlbGltIHN0ci5bcG9zXVxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgc3ViX3N0ciA9IHN1YiBzdHIgfnBvczpsYXN0X3BvcyB+bGVuOihwb3MgLSBsYXN0X3BvcykgaW5cbiAgICAgICAgICBsb29wIChzdWJfc3RyIDo6IGFjYykgc3RhdHVzIChwb3MgKyAxKSAocG9zICsgMSkpXG4gICAgICAgIGVsc2UgbG9vcCBhY2Mgc3RhdHVzIGxhc3RfcG9zIChwb3MgKyAxKSlcbiAgICBpblxuICAgIGxvb3AgW10gYExpdGVyYWwgMCAwXG4gIDs7XG5cbiAgbGV0IHNwbGl0IHN0ciB+b24gPSBzcGxpdF9nZW4gc3RyIH5vbjooYGNoYXIgb24pXG4gIGxldCBzcGxpdF9vbl9jaGFycyBzdHIgfm9uOmNoYXJzID0gc3BsaXRfZ2VuIHN0ciB+b246KGBjaGFyX2xpc3QgY2hhcnMpXG5cbiAgbGV0IHNwbGl0X2F0IHN0ciBwb3MgPVxuICAgIHN1YiBzdHIgfnBvczowIH5sZW46cG9zLCBzdWIgc3RyIH5wb3M6KHBvcyArIDEpIH5sZW46KGxlbmd0aCBzdHIgLSBwb3MgLSAxKVxuICA7O1xuXG4gIGxldCBsc3BsaXQyIHN0ciB+b24gfmVzY2FwZV9jaGFyID1cbiAgICBPcHRpb24ubWFwIChpbmRleCBzdHIgfmVzY2FwZV9jaGFyIG9uKSB+ZjooZnVuIHggLT4gc3BsaXRfYXQgc3RyIHgpXG4gIDs7XG5cbiAgbGV0IHJzcGxpdDIgc3RyIH5vbiB+ZXNjYXBlX2NoYXIgPVxuICAgIE9wdGlvbi5tYXAgKHJpbmRleCBzdHIgfmVzY2FwZV9jaGFyIG9uKSB+ZjooZnVuIHggLT4gc3BsaXRfYXQgc3RyIHgpXG4gIDs7XG5cbiAgbGV0IGxzcGxpdDJfZXhuIHN0ciB+b24gfmVzY2FwZV9jaGFyID0gc3BsaXRfYXQgc3RyIChpbmRleF9leG4gc3RyIH5lc2NhcGVfY2hhciBvbilcbiAgbGV0IHJzcGxpdDJfZXhuIHN0ciB+b24gfmVzY2FwZV9jaGFyID0gc3BsaXRfYXQgc3RyIChyaW5kZXhfZXhuIHN0ciB+ZXNjYXBlX2NoYXIgb24pXG5cbiAgKCogW2xhc3Rfbm9uX2Ryb3BfbGl0ZXJhbF0gYW5kIFtmaXJzdF9ub25fZHJvcF9saXRlcmFsXSBhcmUgZWl0aGVyIGJvdGggW05vbmVdIG9yIGJvdGhcbiAgICAgW1NvbWVdLiBJZiBbU29tZV0sIHRoZW4gdGhlIGZvcm1lciBpcyA+PSB0aGUgbGF0dGVyLiAqKVxuICBsZXQgbGFzdF9ub25fZHJvcF9saXRlcmFsIH5kcm9wIH5lc2NhcGVfY2hhciB0ID1cbiAgICByZmluZGkgdCB+ZjooZnVuIGkgYyAtPlxuICAgICAgKG5vdCAoZHJvcCBjKSlcbiAgICAgIHx8IGlzX2NoYXJfZXNjYXBpbmcgdCB+ZXNjYXBlX2NoYXIgaVxuICAgICAgfHwgaXNfY2hhcl9lc2NhcGVkIHQgfmVzY2FwZV9jaGFyIGkpXG4gIDs7XG5cbiAgbGV0IGZpcnN0X25vbl9kcm9wX2xpdGVyYWwgfmRyb3AgfmVzY2FwZV9jaGFyIHQgPVxuICAgIGxmaW5kaSB0IH5mOihmdW4gaSBjIC0+XG4gICAgICAobm90IChkcm9wIGMpKVxuICAgICAgfHwgaXNfY2hhcl9lc2NhcGluZyB0IH5lc2NhcGVfY2hhciBpXG4gICAgICB8fCBpc19jaGFyX2VzY2FwZWQgdCB+ZXNjYXBlX2NoYXIgaSlcbiAgOztcblxuICBsZXQgcnN0cmlwX2xpdGVyYWwgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0IH5lc2NhcGVfY2hhciA9XG4gICAgbWF0Y2ggbGFzdF9ub25fZHJvcF9saXRlcmFsIHQgfmRyb3AgfmVzY2FwZV9jaGFyIHdpdGhcbiAgICB8IE5vbmUgLT4gXCJcIlxuICAgIHwgU29tZSBpIC0+IGlmIGkgPSBsZW5ndGggdCAtIDEgdGhlbiB0IGVsc2UgcHJlZml4IHQgKGkgKyAxKVxuICA7O1xuXG4gIGxldCBsc3RyaXBfbGl0ZXJhbCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgfmVzY2FwZV9jaGFyID1cbiAgICBtYXRjaCBmaXJzdF9ub25fZHJvcF9saXRlcmFsIHQgfmRyb3AgfmVzY2FwZV9jaGFyIHdpdGhcbiAgICB8IE5vbmUgLT4gXCJcIlxuICAgIHwgU29tZSAwIC0+IHRcbiAgICB8IFNvbWUgbiAtPiBkcm9wX3ByZWZpeCB0IG5cbiAgOztcblxuICAoKiBbc3RyaXAgdF0gY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgW2xzdHJpcCAocnN0cmlwIHQpXS4gIFRoZSBpbXBsZW1lbnRhdGlvblxuICAgICBiZWxvdyBzYXZlcyAoYXQgbGVhc3QpIGEgZmFjdG9yIG9mIHR3byBhbGxvY2F0aW9uLCBieSBvbmx5IGFsbG9jYXRpbmcgdGhlXG4gICAgIGZpbmFsIHJlc3VsdC4gIFRoaXMgYWxzbyBzYXZlcyBzb21lIGFtb3VudCBvZiB0aW1lLiAqKVxuICBsZXQgc3RyaXBfbGl0ZXJhbCA/KGRyb3AgPSBDaGFyLmlzX3doaXRlc3BhY2UpIHQgfmVzY2FwZV9jaGFyID1cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoIHQgaW5cbiAgICAoKiBwZXJmb3JtYW5jZSBoYWNrOiBhdm9pZCBjb3B5aW5nIFt0XSBpbiBjb21tb24gY2FzZXMgKilcbiAgICBpZiBsZW5ndGggPSAwIHx8IG5vdCAoZHJvcCB0LlswXSB8fCBkcm9wIHQuW2xlbmd0aCAtIDFdKVxuICAgIHRoZW4gdFxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggZmlyc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB0IH5kcm9wIH5lc2NhcGVfY2hhciB3aXRoXG4gICAgICB8IE5vbmUgLT4gXCJcIlxuICAgICAgfCBTb21lIGZpcnN0IC0+XG4gICAgICAgIChtYXRjaCBsYXN0X25vbl9kcm9wX2xpdGVyYWwgdCB+ZHJvcCB+ZXNjYXBlX2NoYXIgd2l0aFxuICAgICAgICAgfCBOb25lIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgfCBTb21lIGxhc3QgLT4gc3ViIHQgfnBvczpmaXJzdCB+bGVuOihsYXN0IC0gZmlyc3QgKyAxKSkpXG4gIDs7XG5lbmRcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgU3RyaW5nX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG4oKiBPdmVycmlkZSBbU2VhcmNoX3BhdHRlcm5dIHdpdGggZGVmYXVsdCBjYXNlLXNlbnNpdGl2aXR5IGFyZ3VtZW50IGF0IHRoZSBlbmQgb2YgdGhlXG4gICBmaWxlLCBzbyB0aGF0IGNhbGwgc2l0ZXMgYWJvdmUgYXJlIGZvcmNlZCB0byBzdXBwbHkgY2FzZS1zZW5zaXRpdml0eSBleHBsaWNpdGx5LiAqKVxubW9kdWxlIFNlYXJjaF9wYXR0ZXJuID0gc3RydWN0XG4gIGluY2x1ZGUgU2VhcmNoX3BhdHRlcm4wXG5cbiAgbGV0IGNyZWF0ZSA/KGNhc2Vfc2Vuc2l0aXZlID0gdHJ1ZSkgcGF0dGVybiA9IGNyZWF0ZSBwYXR0ZXJuIH5jYXNlX3NlbnNpdGl2ZVxuZW5kXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBTdHJpbmdfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxuXG5sZXQgc3RhZ2UgPSBTdGFnZWQuc3RhZ2VcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gYnl0ZXMgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgdF9vZl9zZXhwID0gKGJ5dGVzX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2J5dGVzIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGJ5dGVzX3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgaW5jbHVkZSBCeXRlczBcblxuICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuQnl0ZXNcIlxuICBsZXQgcHAgZm10IHQgPSBDYW1sLkZvcm1hdC5mcHJpbnRmIGZtdCBcIiVTXCIgKHRvX3N0cmluZyB0KVxuZW5kXG5cbmluY2x1ZGUgVFxuXG5tb2R1bGUgVG9fYnl0ZXMgPSBCbGl0Lk1ha2UgKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IGNyZWF0ZSB+bGVuID0gY3JlYXRlIGxlblxuICBlbmQpXG5cbmluY2x1ZGUgVG9fYnl0ZXNcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3Rlcl9wcCAoVClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgQnl0ZXNfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5tb2R1bGUgVG9fc3RyaW5nID0gQmxpdC5NYWtlX3RvX3N0cmluZyAoVCkgKFRvX2J5dGVzKVxuXG5tb2R1bGUgRnJvbV9zdHJpbmcgPVxuICBCbGl0Lk1ha2VfZGlzdGluY3RcbiAgICAoc3RydWN0XG4gICAgICB0eXBlIHQgPSBzdHJpbmdcblxuICAgICAgbGV0IGxlbmd0aCA9IFN0cmluZy5sZW5ndGhcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgbGV0IGNyZWF0ZSB+bGVuID0gY3JlYXRlIGxlblxuICAgICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgICAgbGV0IHVuc2FmZV9ibGl0ID0gdW5zYWZlX2JsaXRfc3RyaW5nXG4gICAgZW5kKVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxuXG5sZXQgaW5pdCBuIH5mID1cbiAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSBuIDBcbiAgdGhlbiBQcmludGYuaW52YWxpZF9hcmdmIFwiQnl0ZXMuaW5pdCAlZFwiIG4gKCk7XG4gIGxldCB0ID0gY3JlYXRlIG4gaW5cbiAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgdW5zYWZlX3NldCB0IGkgKGYgaSlcbiAgZG9uZTtcbiAgdFxuOztcblxubGV0IG9mX2NoYXJfbGlzdCBsID1cbiAgbGV0IHQgPSBjcmVhdGUgKExpc3QubGVuZ3RoIGwpIGluXG4gIExpc3QuaXRlcmkgbCB+ZjooZnVuIGkgYyAtPiBzZXQgdCBpIGMpO1xuICB0XG47O1xuXG5sZXQgdG9fbGlzdCB0ID1cbiAgbGV0IHJlYyBsb29wIHQgaSBhY2MgPVxuICAgIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgaSAwXG4gICAgdGhlbiBhY2NcbiAgICBlbHNlIGxvb3AgdCAoaSAtIDEpICh1bnNhZmVfZ2V0IHQgaSA6OiBhY2MpXG4gIGluXG4gIGxvb3AgdCAobGVuZ3RoIHQgLSAxKSBbXVxuOztcblxubGV0IHRvX2FycmF5IHQgPSBBcnJheS5pbml0IChsZW5ndGggdCkgfmY6KGZ1biBpIC0+IHVuc2FmZV9nZXQgdCBpKVxubGV0IG1hcCB0IH5mID0gbWFwIHQgfmZcbmxldCBtYXBpIHQgfmYgPSBtYXBpIHQgfmZcblxubGV0IGZvbGQgPVxuICBsZXQgcmVjIGxvb3AgdCB+ZiB+bGVuIH5wb3MgYWNjID1cbiAgICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmVxdWFsIHBvcyBsZW5cbiAgICB0aGVuIGFjY1xuICAgIGVsc2UgbG9vcCB0IH5mIH5sZW4gfnBvczoocG9zICsgMSkgKGYgYWNjICh1bnNhZmVfZ2V0IHQgcG9zKSlcbiAgaW5cbiAgZnVuIHQgfmluaXQgfmYgLT4gbG9vcCB0IH5mIH5sZW46KGxlbmd0aCB0KSB+cG9zOjAgaW5pdFxuOztcblxubGV0IGZvbGRpID1cbiAgbGV0IHJlYyBsb29wIHQgfmYgfmxlbiB+cG9zIGFjYyA9XG4gICAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5lcXVhbCBwb3MgbGVuXG4gICAgdGhlbiBhY2NcbiAgICBlbHNlIGxvb3AgdCB+ZiB+bGVuIH5wb3M6KHBvcyArIDEpIChmIHBvcyBhY2MgKHVuc2FmZV9nZXQgdCBwb3MpKVxuICBpblxuICBmdW4gdCB+aW5pdCB+ZiAtPiBsb29wIHQgfmYgfmxlbjoobGVuZ3RoIHQpIH5wb3M6MCBpbml0XG47O1xuXG5sZXQgdHIgfnRhcmdldCB+cmVwbGFjZW1lbnQgcyA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICBpZiBDaGFyLmVxdWFsICh1bnNhZmVfZ2V0IHMgaSkgdGFyZ2V0IHRoZW4gdW5zYWZlX3NldCBzIGkgcmVwbGFjZW1lbnRcbiAgZG9uZVxuOztcblxubGV0IHRyX211bHRpIH50YXJnZXQgfnJlcGxhY2VtZW50ID1cbiAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID0gKSAoU3RyaW5nLmxlbmd0aCB0YXJnZXQpIDBcbiAgdGhlbiBzdGFnZSBpZ25vcmVcbiAgZWxzZSBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPSApIChTdHJpbmcubGVuZ3RoIHJlcGxhY2VtZW50KSAwXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJ0cl9tdWx0aTogcmVwbGFjZW1lbnQgaXMgdGhlIGVtcHR5IHN0cmluZ1wiXG4gIGVsc2UgKFxuICAgIG1hdGNoIEJ5dGVzX3RyLnRyX2NyZWF0ZV9tYXAgfnRhcmdldCB+cmVwbGFjZW1lbnQgd2l0aFxuICAgIHwgTm9uZSAtPiBzdGFnZSBpZ25vcmVcbiAgICB8IFNvbWUgdHJfbWFwIC0+XG4gICAgICBzdGFnZSAoZnVuIHMgLT5cbiAgICAgICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgcyBpIChTdHJpbmcudW5zYWZlX2dldCB0cl9tYXAgKENoYXIudG9faW50ICh1bnNhZmVfZ2V0IHMgaSkpKVxuICAgICAgICBkb25lKSlcbjs7XG5cbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmxldCBjb250YWlucyA/cG9zID9sZW4gdCBjaGFyID1cbiAgbGV0IHBvcywgbGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmdldF9wb3NfbGVuX2V4biAoKSA/cG9zID9sZW4gfnRvdGFsX2xlbmd0aDoobGVuZ3RoIHQpXG4gIGluXG4gIGxldCBsYXN0ID0gcG9zICsgbGVuIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIGkgbGFzdFxuICAgICYmIChDaGFyLmVxdWFsIChnZXQgdCBpKSBjaGFyIHx8IGxvb3AgKGkgKyAxKSlcbiAgaW5cbiAgbG9vcCBwb3Ncbjs7XG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBCeXRlc19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIiMgMSBcInNyYy9oZXhfbGV4ZXIubWxsXCJcbiBcbnR5cGUgcmVzdWx0ID1cbnwgTmVnIG9mIHN0cmluZ1xufCBQb3Mgb2Ygc3RyaW5nXG5cbiMgOCBcInNyYy9oZXhfbGV4ZXIubWxcIlxubGV0IF9fb2NhbWxfbGV4X3RhYmxlcyA9IHtcbiAgTGV4aW5nLmxleF9iYXNlID1cbiAgIFwiXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMVxcMDAwXFwwMDFcXDAwMFxcMDAyXFwwMDBcXDAyN1xcMDAwXFwwODJcXDAwMFxcMTA1XFwwMDBcXFxuICAgIFwiO1xuICBMZXhpbmcubGV4X2JhY2t0cmsgPVxuICAgXCJcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDAwXFwwMDBcXDI1NVxcMjU1XFwwMDFcXDAwMFxcXG4gICAgXCI7XG4gIExleGluZy5sZXhfZGVmYXVsdCA9XG4gICBcIlxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcIjtcbiAgTGV4aW5nLmxleF90cmFucyA9XG4gICBcIlxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMlxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAxXFwwMDBcXDAwM1xcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDZcXDAwMFxcMDA0XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDA2XFwwMDBcXDAwNFxcMDAwXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDBcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXCI7XG4gIExleGluZy5sZXhfY2hlY2sgPVxuICAgXCJcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDBcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDAwMFxcMDAwXFwwMDJcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcXG4gICAgXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFxcbiAgICBcXDAwNFxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMDAxXFwwMDBcXDAwM1xcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMjU1XFwyNTVcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcXG4gICAgXFwwMDRcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDAwMVxcMDAwXFwwMDNcXDAwMFxcMDA1XFwwMDBcXDI1NVxcMjU1XFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXFxuICAgIFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcXG4gICAgXFwwMDZcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXFxuICAgIFxcMDA2XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwwMDdcXDAwMFxcMjU1XFwyNTVcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVwiO1xuICBMZXhpbmcubGV4X2Jhc2VfY29kZSA9XG4gICBcIlwiO1xuICBMZXhpbmcubGV4X2JhY2t0cmtfY29kZSA9XG4gICBcIlwiO1xuICBMZXhpbmcubGV4X2RlZmF1bHRfY29kZSA9XG4gICBcIlwiO1xuICBMZXhpbmcubGV4X3RyYW5zX2NvZGUgPVxuICAgXCJcIjtcbiAgTGV4aW5nLmxleF9jaGVja19jb2RlID1cbiAgIFwiXCI7XG4gIExleGluZy5sZXhfY29kZSA9XG4gICBcIlwiO1xufVxuXG5sZXQgcmVjIHBhcnNlX2hleCBsZXhidWYgPVxuICAgX19vY2FtbF9sZXhfcGFyc2VfaGV4X3JlYyBsZXhidWYgMFxuYW5kIF9fb2NhbWxfbGV4X3BhcnNlX2hleF9yZWMgbGV4YnVmIF9fb2NhbWxfbGV4X3N0YXRlID1cbiAgbWF0Y2ggTGV4aW5nLmVuZ2luZSBfX29jYW1sX2xleF90YWJsZXMgX19vY2FtbF9sZXhfc3RhdGUgbGV4YnVmIHdpdGhcbiAgICAgIHwgMCAtPlxubGV0XG4jIDggXCJzcmMvaGV4X2xleGVyLm1sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5XG4jIDEzNSBcInNyYy9oZXhfbGV4ZXIubWxcIlxuPSBMZXhpbmcuc3ViX2xleGVtZSBsZXhidWYgKGxleGJ1Zi5MZXhpbmcubGV4X3N0YXJ0X3BvcyArIDMpIGxleGJ1Zi5MZXhpbmcubGV4X2N1cnJfcG9zIGluXG4jIDE0IFwic3JjL2hleF9sZXhlci5tbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoIE5lZyBib2R5IClcbiMgMTM5IFwic3JjL2hleF9sZXhlci5tbFwiXG5cbiAgfCAxIC0+XG5sZXRcbiMgOCBcInNyYy9oZXhfbGV4ZXIubWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlcbiMgMTQ1IFwic3JjL2hleF9sZXhlci5tbFwiXG49IExleGluZy5zdWJfbGV4ZW1lIGxleGJ1ZiAobGV4YnVmLkxleGluZy5sZXhfc3RhcnRfcG9zICsgMikgbGV4YnVmLkxleGluZy5sZXhfY3Vycl9wb3MgaW5cbiMgMTUgXCJzcmMvaGV4X2xleGVyLm1sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICggUG9zIGJvZHkgKVxuIyAxNDkgXCJzcmMvaGV4X2xleGVyLm1sXCJcblxuICB8IF9fb2NhbWxfbGV4X3N0YXRlIC0+IGxleGJ1Zi5MZXhpbmcucmVmaWxsX2J1ZmYgbGV4YnVmO1xuICAgICAgX19vY2FtbF9sZXhfcGFyc2VfaGV4X3JlYyBsZXhidWYgX19vY2FtbF9sZXhfc3RhdGVcblxuOztcblxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgSW50ID0gSW50MFxubW9kdWxlIFN5cyA9IFN5czBcblxubGV0IGNvbnZlcnRfZmFpbHVyZSB4IGEgYiB0b19zdHJpbmcgPVxuICBQcmludGYuZmFpbHdpdGhmXG4gICAgXCJjb252ZXJzaW9uIGZyb20gJXMgdG8gJXMgZmFpbGVkOiAlcyBpcyBvdXQgb2YgcmFuZ2VcIlxuICAgIGFcbiAgICBiXG4gICAgKHRvX3N0cmluZyB4KVxuICAgICgpXG5bQEBjb2xkXSBbQEBpbmxpbmUgbmV2ZXJdIFtAQGxvY2FsIG5ldmVyXSBbQEBzcGVjaWFsaXNlIG5ldmVyXVxuOztcblxubGV0IG51bV9iaXRzX2ludCA9IFN5cy5pbnRfc2l6ZV9pbl9iaXRzXG5sZXQgbnVtX2JpdHNfaW50MzIgPSAzMlxubGV0IG51bV9iaXRzX2ludDY0ID0gNjRcbmxldCBudW1fYml0c19uYXRpdmVpbnQgPSBXb3JkX3NpemUubnVtX2JpdHMgV29yZF9zaXplLndvcmRfc2l6ZVxubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQgPSA2MyB8fCBudW1fYml0c19pbnQgPSAzMSB8fCBudW1fYml0c19pbnQgPSAzMilcbmxldCBtaW5faW50MzIgPSBDYW1sLkludDMyLm1pbl9pbnRcbmxldCBtYXhfaW50MzIgPSBDYW1sLkludDMyLm1heF9pbnRcbmxldCBtaW5faW50NjQgPSBDYW1sLkludDY0Lm1pbl9pbnRcbmxldCBtYXhfaW50NjQgPSBDYW1sLkludDY0Lm1heF9pbnRcbmxldCBtaW5fbmF0aXZlaW50ID0gQ2FtbC5OYXRpdmVpbnQubWluX2ludFxubGV0IG1heF9uYXRpdmVpbnQgPSBDYW1sLk5hdGl2ZWludC5tYXhfaW50XG5sZXQgaW50X3RvX3N0cmluZyA9IENhbWwuc3RyaW5nX29mX2ludFxubGV0IGludDMyX3RvX3N0cmluZyA9IENhbWwuSW50MzIudG9fc3RyaW5nXG5sZXQgaW50NjRfdG9fc3RyaW5nID0gQ2FtbC5JbnQ2NC50b19zdHJpbmdcbmxldCBuYXRpdmVpbnRfdG9fc3RyaW5nID0gQ2FtbC5OYXRpdmVpbnQudG9fc3RyaW5nXG5cbigqIGludCA8LT4gaW50MzIgKilcblxubGV0IGludF90b19pbnQzMl9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludFwiIFwiaW50MzJcIiBpbnRfdG9fc3RyaW5nXG5sZXQgaW50MzJfdG9faW50X2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50MzJcIiBcImludFwiIGludDMyX3RvX3N0cmluZ1xubGV0IGludDMyX3RvX2ludF90cnVuYyA9IENhbWwuSW50MzIudG9faW50XG5sZXQgaW50X3RvX2ludDMyX3RydW5jID0gQ2FtbC5JbnQzMi5vZl9pbnRcblxubGV0IGludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyID1cbiAgaWYgbnVtX2JpdHNfaW50IDw9IG51bV9iaXRzX2ludDMyXG4gIHRoZW4gZnVuIF8gLT4gdHJ1ZVxuICBlbHNlIChcbiAgICBsZXQgbWluID0gaW50MzJfdG9faW50X3RydW5jIG1pbl9pbnQzMiBpblxuICAgIGxldCBtYXggPSBpbnQzMl90b19pbnRfdHJ1bmMgbWF4X2ludDMyIGluXG4gICAgZnVuIHggLT4gY29tcGFyZV9pbnQgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludCB4IG1heCA8PSAwKVxuOztcblxubGV0IGludDMyX2lzX3JlcHJlc2VudGFibGVfYXNfaW50ID1cbiAgaWYgbnVtX2JpdHNfaW50MzIgPD0gbnVtX2JpdHNfaW50XG4gIHRoZW4gZnVuIF8gLT4gdHJ1ZVxuICBlbHNlIChcbiAgICBsZXQgbWluID0gaW50X3RvX2ludDMyX3RydW5jIEludC5taW5fdmFsdWUgaW5cbiAgICBsZXQgbWF4ID0gaW50X3RvX2ludDMyX3RydW5jIEludC5tYXhfdmFsdWUgaW5cbiAgICBmdW4geCAtPiBjb21wYXJlX2ludDMyIG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQzMiB4IG1heCA8PSAwKVxuOztcblxubGV0IGludF90b19pbnQzMiB4ID1cbiAgaWYgaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeCB0aGVuIFNvbWUgKGludF90b19pbnQzMl90cnVuYyB4KSBlbHNlIE5vbmVcbjs7XG5cbmxldCBpbnQzMl90b19pbnQgeCA9XG4gIGlmIGludDMyX2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHggdGhlbiBTb21lIChpbnQzMl90b19pbnRfdHJ1bmMgeCkgZWxzZSBOb25lXG47O1xuXG5sZXQgaW50X3RvX2ludDMyX2V4biB4ID1cbiAgaWYgaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeCB0aGVuIGludF90b19pbnQzMl90cnVuYyB4IGVsc2UgaW50X3RvX2ludDMyX2ZhaWx1cmUgeFxuOztcblxubGV0IGludDMyX3RvX2ludF9leG4geCA9XG4gIGlmIGludDMyX2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHggdGhlbiBpbnQzMl90b19pbnRfdHJ1bmMgeCBlbHNlIGludDMyX3RvX2ludF9mYWlsdXJlIHhcbjs7XG5cbigqIGludCA8LT4gaW50NjQgKilcblxubGV0IGludDY0X3RvX2ludF9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludDY0XCIgXCJpbnRcIiBpbnQ2NF90b19zdHJpbmdcbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50IDwgbnVtX2JpdHNfaW50NjQpXG5sZXQgaW50X3RvX2ludDY0ID0gQ2FtbC5JbnQ2NC5vZl9pbnRcbmxldCBpbnQ2NF90b19pbnRfdHJ1bmMgPSBDYW1sLkludDY0LnRvX2ludFxuXG5sZXQgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgPVxuICBsZXQgbWluID0gaW50X3RvX2ludDY0IEludC5taW5fdmFsdWUgaW5cbiAgbGV0IG1heCA9IGludF90b19pbnQ2NCBJbnQubWF4X3ZhbHVlIGluXG4gIGZ1biB4IC0+IGNvbXBhcmVfaW50NjQgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludDY0IHggbWF4IDw9IDBcbjs7XG5cbmxldCBpbnQ2NF90b19pbnQgeCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHggdGhlbiBTb21lIChpbnQ2NF90b19pbnRfdHJ1bmMgeCkgZWxzZSBOb25lXG47O1xuXG5sZXQgaW50NjRfdG9faW50X2V4biB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeCB0aGVuIGludDY0X3RvX2ludF90cnVuYyB4IGVsc2UgaW50NjRfdG9faW50X2ZhaWx1cmUgeFxuOztcblxuKCogaW50IDwtPiBuYXRpdmVpbnQgKilcblxubGV0IG5hdGl2ZWludF90b19pbnRfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJuYXRpdmVpbnRcIiBcImludFwiIG5hdGl2ZWludF90b19zdHJpbmdcbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50IDw9IG51bV9iaXRzX25hdGl2ZWludClcbmxldCBpbnRfdG9fbmF0aXZlaW50ID0gQ2FtbC5OYXRpdmVpbnQub2ZfaW50XG5sZXQgbmF0aXZlaW50X3RvX2ludF90cnVuYyA9IENhbWwuTmF0aXZlaW50LnRvX2ludFxuXG5sZXQgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50ID1cbiAgaWYgbnVtX2JpdHNfbmF0aXZlaW50IDw9IG51bV9iaXRzX2ludFxuICB0aGVuIGZ1biBfIC0+IHRydWVcbiAgZWxzZSAoXG4gICAgbGV0IG1pbiA9IGludF90b19uYXRpdmVpbnQgSW50Lm1pbl92YWx1ZSBpblxuICAgIGxldCBtYXggPSBpbnRfdG9fbmF0aXZlaW50IEludC5tYXhfdmFsdWUgaW5cbiAgICBmdW4geCAtPiBjb21wYXJlX25hdGl2ZWludCBtaW4geCA8PSAwICYmIGNvbXBhcmVfbmF0aXZlaW50IHggbWF4IDw9IDApXG47O1xuXG5sZXQgbmF0aXZlaW50X3RvX2ludCB4ID1cbiAgaWYgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHggdGhlbiBTb21lIChuYXRpdmVpbnRfdG9faW50X3RydW5jIHgpIGVsc2UgTm9uZVxuOztcblxubGV0IG5hdGl2ZWludF90b19pbnRfZXhuIHggPVxuICBpZiBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQgeFxuICB0aGVuIG5hdGl2ZWludF90b19pbnRfdHJ1bmMgeFxuICBlbHNlIG5hdGl2ZWludF90b19pbnRfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQzMiA8LT4gaW50NjQgKilcblxubGV0IGludDY0X3RvX2ludDMyX2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50NjRcIiBcImludDMyXCIgaW50NjRfdG9fc3RyaW5nXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludDMyIDwgbnVtX2JpdHNfaW50NjQpXG5sZXQgaW50MzJfdG9faW50NjQgPSBDYW1sLkludDY0Lm9mX2ludDMyXG5sZXQgaW50NjRfdG9faW50MzJfdHJ1bmMgPSBDYW1sLkludDY0LnRvX2ludDMyXG5cbmxldCBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyID1cbiAgbGV0IG1pbiA9IGludDMyX3RvX2ludDY0IG1pbl9pbnQzMiBpblxuICBsZXQgbWF4ID0gaW50MzJfdG9faW50NjQgbWF4X2ludDMyIGluXG4gIGZ1biB4IC0+IGNvbXBhcmVfaW50NjQgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludDY0IHggbWF4IDw9IDBcbjs7XG5cbmxldCBpbnQ2NF90b19pbnQzMiB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4IHRoZW4gU29tZSAoaW50NjRfdG9faW50MzJfdHJ1bmMgeCkgZWxzZSBOb25lXG47O1xuXG5sZXQgaW50NjRfdG9faW50MzJfZXhuIHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHhcbiAgdGhlbiBpbnQ2NF90b19pbnQzMl90cnVuYyB4XG4gIGVsc2UgaW50NjRfdG9faW50MzJfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQzMiA8LT4gbmF0aXZlaW50ICopXG5cbmxldCBuYXRpdmVpbnRfdG9faW50MzJfZmFpbHVyZSB4ID1cbiAgY29udmVydF9mYWlsdXJlIHggXCJuYXRpdmVpbnRcIiBcImludDMyXCIgbmF0aXZlaW50X3RvX3N0cmluZ1xuOztcblxubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQzMiA8PSBudW1fYml0c19uYXRpdmVpbnQpXG5sZXQgaW50MzJfdG9fbmF0aXZlaW50ID0gQ2FtbC5OYXRpdmVpbnQub2ZfaW50MzJcbmxldCBuYXRpdmVpbnRfdG9faW50MzJfdHJ1bmMgPSBDYW1sLk5hdGl2ZWludC50b19pbnQzMlxuXG5sZXQgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgPVxuICBpZiBudW1fYml0c19uYXRpdmVpbnQgPD0gbnVtX2JpdHNfaW50MzJcbiAgdGhlbiBmdW4gXyAtPiB0cnVlXG4gIGVsc2UgKFxuICAgIGxldCBtaW4gPSBpbnQzMl90b19uYXRpdmVpbnQgbWluX2ludDMyIGluXG4gICAgbGV0IG1heCA9IGludDMyX3RvX25hdGl2ZWludCBtYXhfaW50MzIgaW5cbiAgICBmdW4geCAtPiBjb21wYXJlX25hdGl2ZWludCBtaW4geCA8PSAwICYmIGNvbXBhcmVfbmF0aXZlaW50IHggbWF4IDw9IDApXG47O1xuXG5sZXQgbmF0aXZlaW50X3RvX2ludDMyIHggPVxuICBpZiBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4XG4gIHRoZW4gU29tZSAobmF0aXZlaW50X3RvX2ludDMyX3RydW5jIHgpXG4gIGVsc2UgTm9uZVxuOztcblxubGV0IG5hdGl2ZWludF90b19pbnQzMl9leG4geCA9XG4gIGlmIG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHhcbiAgdGhlbiBuYXRpdmVpbnRfdG9faW50MzJfdHJ1bmMgeFxuICBlbHNlIG5hdGl2ZWludF90b19pbnQzMl9mYWlsdXJlIHhcbjs7XG5cbigqIGludDY0IDwtPiBuYXRpdmVpbnQgKilcblxubGV0IGludDY0X3RvX25hdGl2ZWludF9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludDY0XCIgXCJuYXRpdmVpbnRcIiBpbnQ2NF90b19zdHJpbmdcbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50NjQgPj0gbnVtX2JpdHNfbmF0aXZlaW50KVxubGV0IGludDY0X3RvX25hdGl2ZWludF90cnVuYyA9IENhbWwuSW50NjQudG9fbmF0aXZlaW50XG5sZXQgbmF0aXZlaW50X3RvX2ludDY0ID0gQ2FtbC5JbnQ2NC5vZl9uYXRpdmVpbnRcblxubGV0IGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfbmF0aXZlaW50ID1cbiAgaWYgbnVtX2JpdHNfaW50NjQgPD0gbnVtX2JpdHNfbmF0aXZlaW50XG4gIHRoZW4gZnVuIF8gLT4gdHJ1ZVxuICBlbHNlIChcbiAgICBsZXQgbWluID0gbmF0aXZlaW50X3RvX2ludDY0IG1pbl9uYXRpdmVpbnQgaW5cbiAgICBsZXQgbWF4ID0gbmF0aXZlaW50X3RvX2ludDY0IG1heF9uYXRpdmVpbnQgaW5cbiAgICBmdW4geCAtPiBjb21wYXJlX2ludDY0IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQ2NCB4IG1heCA8PSAwKVxuOztcblxubGV0IGludDY0X3RvX25hdGl2ZWludCB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19uYXRpdmVpbnQgeFxuICB0aGVuIFNvbWUgKGludDY0X3RvX25hdGl2ZWludF90cnVuYyB4KVxuICBlbHNlIE5vbmVcbjs7XG5cbmxldCBpbnQ2NF90b19uYXRpdmVpbnRfZXhuIHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX25hdGl2ZWludCB4XG4gIHRoZW4gaW50NjRfdG9fbmF0aXZlaW50X3RydW5jIHhcbiAgZWxzZSBpbnQ2NF90b19uYXRpdmVpbnRfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQ2NCA8LT4gaW50NjMgKilcblxubGV0IGludDY0X3RvX2ludDYzX2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwiaW50NjRcIiBcImludDYzXCIgaW50NjRfdG9fc3RyaW5nXG5cbmxldCBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDYzID1cbiAgbGV0IG1pbiA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHQgbWluX2ludDY0IDEgaW5cbiAgbGV0IG1heCA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHQgbWF4X2ludDY0IDEgaW5cbiAgZnVuIHggLT4gY29tcGFyZV9pbnQ2NCBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50NjQgeCBtYXggPD0gMFxuOztcblxubGV0IGludDY0X2ZpdF9vbl9pbnQ2M19leG4geCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50NjMgeCB0aGVuICgpIGVsc2UgaW50NjRfdG9faW50NjNfZmFpbHVyZSB4XG47O1xuXG4oKiBzdHJpbmcgY29udmVyc2lvbnMgKilcblxubGV0IGluc2VydF9kZWxpbWl0ZXJfZXZlcnkgaW5wdXQgfmRlbGltaXRlciB+Y2hhcnNfcGVyX2RlbGltaXRlciA9XG4gIGxldCBpbnB1dF9sZW5ndGggPSBTdHJpbmcubGVuZ3RoIGlucHV0IGluXG4gIGlmIGlucHV0X2xlbmd0aCA8PSBjaGFyc19wZXJfZGVsaW1pdGVyXG4gIHRoZW4gaW5wdXRcbiAgZWxzZSAoXG4gICAgbGV0IGhhc19zaWduID1cbiAgICAgIG1hdGNoIGlucHV0LlswXSB3aXRoXG4gICAgICB8ICcrJyB8ICctJyAtPiB0cnVlXG4gICAgICB8IF8gLT4gZmFsc2VcbiAgICBpblxuICAgIGxldCBudW1fZGlnaXRzID0gaWYgaGFzX3NpZ24gdGhlbiBpbnB1dF9sZW5ndGggLSAxIGVsc2UgaW5wdXRfbGVuZ3RoIGluXG4gICAgbGV0IG51bV9kZWxpbWl0ZXJzID0gKG51bV9kaWdpdHMgLSAxKSAvIGNoYXJzX3Blcl9kZWxpbWl0ZXIgaW5cbiAgICBsZXQgb3V0cHV0X2xlbmd0aCA9IGlucHV0X2xlbmd0aCArIG51bV9kZWxpbWl0ZXJzIGluXG4gICAgbGV0IG91dHB1dCA9IEJ5dGVzLmNyZWF0ZSBvdXRwdXRfbGVuZ3RoIGluXG4gICAgbGV0IGlucHV0X3BvcyA9IHJlZiAoaW5wdXRfbGVuZ3RoIC0gMSkgaW5cbiAgICBsZXQgb3V0cHV0X3BvcyA9IHJlZiAob3V0cHV0X2xlbmd0aCAtIDEpIGluXG4gICAgbGV0IG51bV9jaGFyc191bnRpbF9kZWxpbWl0ZXIgPSByZWYgY2hhcnNfcGVyX2RlbGltaXRlciBpblxuICAgIGxldCBmaXJzdF9kaWdpdF9wb3MgPSBpZiBoYXNfc2lnbiB0aGVuIDEgZWxzZSAwIGluXG4gICAgd2hpbGUgIWlucHV0X3BvcyA+PSBmaXJzdF9kaWdpdF9wb3MgZG9cbiAgICAgIGlmICFudW1fY2hhcnNfdW50aWxfZGVsaW1pdGVyID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIEJ5dGVzLnNldCBvdXRwdXQgIW91dHB1dF9wb3MgZGVsaW1pdGVyO1xuICAgICAgICBkZWNyIG91dHB1dF9wb3M7XG4gICAgICAgIG51bV9jaGFyc191bnRpbF9kZWxpbWl0ZXIgOj0gY2hhcnNfcGVyX2RlbGltaXRlcik7XG4gICAgICBCeXRlcy5zZXQgb3V0cHV0ICFvdXRwdXRfcG9zIGlucHV0LlshaW5wdXRfcG9zXTtcbiAgICAgIGRlY3IgaW5wdXRfcG9zO1xuICAgICAgZGVjciBvdXRwdXRfcG9zO1xuICAgICAgZGVjciBudW1fY2hhcnNfdW50aWxfZGVsaW1pdGVyXG4gICAgZG9uZTtcbiAgICBpZiBoYXNfc2lnbiB0aGVuIEJ5dGVzLnNldCBvdXRwdXQgMCBpbnB1dC5bMF07XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpvdXRwdXQpXG47O1xuXG5sZXQgaW5zZXJ0X2RlbGltaXRlciBpbnB1dCB+ZGVsaW1pdGVyID1cbiAgaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSBpbnB1dCB+ZGVsaW1pdGVyIH5jaGFyc19wZXJfZGVsaW1pdGVyOjNcbjs7XG5cbmxldCBpbnNlcnRfdW5kZXJzY29yZXMgaW5wdXQgPSBpbnNlcnRfZGVsaW1pdGVyIGlucHV0IH5kZWxpbWl0ZXI6J18nXG5sZXQgc2V4cF9vZl9pbnRfc3R5bGUgPSBTZXhwLm9mX2ludF9zdHlsZVxuXG5tb2R1bGUgTWFrZSAoSSA6IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIHRvX3N0cmluZyA6IHQgLT4gc3RyaW5nXG4gIGVuZCkgPVxuc3RydWN0XG4gIG9wZW4gSVxuXG4gIGxldCBjaGFyc19wZXJfZGVsaW1pdGVyID0gM1xuXG4gIGxldCB0b19zdHJpbmdfaHVtID8oZGVsaW1pdGVyID0gJ18nKSB0ID1cbiAgICBpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5ICh0b19zdHJpbmcgdCkgfmRlbGltaXRlciB+Y2hhcnNfcGVyX2RlbGltaXRlclxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgdCA9XG4gICAgbGV0IHMgPSB0b19zdHJpbmcgdCBpblxuICAgIFNleHAuQXRvbVxuICAgICAgKG1hdGNoICFzZXhwX29mX2ludF9zdHlsZSB3aXRoXG4gICAgICAgfCBgVW5kZXJzY29yZXMgLT4gaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSBzIH5jaGFyc19wZXJfZGVsaW1pdGVyIH5kZWxpbWl0ZXI6J18nXG4gICAgICAgfCBgTm9fdW5kZXJzY29yZXMgLT4gcylcbiAgOztcbmVuZFxuXG5tb2R1bGUgTWFrZV9oZXggKEkgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuICAgIGluY2x1ZGUgUHB4X2hhc2hfbGliLkhhc2hhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgW0BAQGVuZF1cblxuICAgIHZhbCB0b19zdHJpbmcgOiB0IC0+IHN0cmluZ1xuICAgIHZhbCBvZl9zdHJpbmcgOiBzdHJpbmcgLT4gdFxuICAgIHZhbCB6ZXJvIDogdFxuICAgIHZhbCAoIDwgKSA6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIG5lZyA6IHQgLT4gdFxuICAgIHZhbCBtb2R1bGVfbmFtZSA6IHN0cmluZ1xuICBlbmQpID1cbnN0cnVjdFxuICBtb2R1bGUgVF9oZXggPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBJLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChJLmNvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgSS5oYXNoX2ZvbGRfdFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBJLmhhc2ggaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IGNoYXJzX3Blcl9kZWxpbWl0ZXIgPSA0XG5cbiAgICBsZXQgdG9fc3RyaW5nJyA/ZGVsaW1pdGVyIHQgPVxuICAgICAgbGV0IG1ha2Vfc3VmZml4ID1cbiAgICAgICAgbWF0Y2ggZGVsaW1pdGVyIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IEkudG9fc3RyaW5nXG4gICAgICAgIHwgU29tZSBkZWxpbWl0ZXIgLT5cbiAgICAgICAgICBmdW4gdCAtPiBpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5IChJLnRvX3N0cmluZyB0KSB+ZGVsaW1pdGVyIH5jaGFyc19wZXJfZGVsaW1pdGVyXG4gICAgICBpblxuICAgICAgaWYgSS4oIDwgKSB0IEkuemVybyB0aGVuIFwiLTB4XCIgXiBtYWtlX3N1ZmZpeCAoSS5uZWcgdCkgZWxzZSBcIjB4XCIgXiBtYWtlX3N1ZmZpeCB0XG4gICAgOztcblxuICAgIGxldCB0b19zdHJpbmcgdCA9IHRvX3N0cmluZycgdCA/ZGVsaW1pdGVyOk5vbmVcbiAgICBsZXQgdG9fc3RyaW5nX2h1bSA/KGRlbGltaXRlciA9ICdfJykgdCA9IHRvX3N0cmluZycgdCB+ZGVsaW1pdGVyXG5cbiAgICBsZXQgaW52YWxpZCBzdHIgPVxuICAgICAgUHJpbnRmLmZhaWx3aXRoZiBcIiVzLm9mX3N0cmluZzogaW52YWxpZCBpbnB1dCAlU1wiIEkubW9kdWxlX25hbWUgc3RyICgpXG4gICAgOztcblxuICAgIGxldCBvZl9zdHJpbmdfd2l0aF9kZWxpbWl0ZXIgc3RyID1cbiAgICAgIEkub2Zfc3RyaW5nIChTdHJpbmcuZmlsdGVyIHN0ciB+ZjooZnVuIGMgLT4gQ2hhci4oIDw+ICkgYyAnXycpKVxuICAgIDs7XG5cbiAgICBsZXQgb2Zfc3RyaW5nIHN0ciA9XG4gICAgICBsZXQgbW9kdWxlIEwgPSBIZXhfbGV4ZXIgaW5cbiAgICAgIGxldCBsZXggPSBDYW1sLkxleGluZy5mcm9tX3N0cmluZyBzdHIgaW5cbiAgICAgIGxldCByZXN1bHQgPSBPcHRpb24udHJ5X3dpdGggKGZ1biAoKSAtPiBMLnBhcnNlX2hleCBsZXgpIGluXG4gICAgICBpZiBsZXgubGV4X2N1cnJfcG9zID0gbGV4LmxleF9idWZmZXJfbGVuXG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggcmVzdWx0IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGludmFsaWQgc3RyXG4gICAgICAgIHwgU29tZSAoTmVnIGJvZHkpIC0+IEkubmVnIChvZl9zdHJpbmdfd2l0aF9kZWxpbWl0ZXIgYm9keSlcbiAgICAgICAgfCBTb21lIChQb3MgYm9keSkgLT4gb2Zfc3RyaW5nX3dpdGhfZGVsaW1pdGVyIGJvZHkpXG4gICAgICBlbHNlIGludmFsaWQgc3RyXG4gICAgOztcblxuICAgIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIFN0cmluZy50X3NleHBfZ3JhbW1hclxuICAgIDs7XG4gIGVuZFxuXG4gIG1vZHVsZSBIZXggPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFRfaGV4XG4gICAgaW5jbHVkZSBTZXhwYWJsZS5PZl9zdHJpbmdhYmxlIChUX2hleClcbiAgZW5kXG5lbmRcbiIsIigqIFRoaXMgZmlsZSB3YXMgYXV0b2dlbmVyYXRlZCBieSAuLi9nZW5lcmF0ZS9nZW5lcmF0ZV9wb3dfb3ZlcmZsb3dfYm91bmRzLmV4ZSAqKVxuXG5vcGVuISBJbXBvcnRcblxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5cbigqIFdlIGhhdmUgdG8gdXNlIEludDY0LnRvX2ludF9leG4gaW5zdGVhZCBvZiBpbnQgY29uc3RhbnRzIHRvIG1ha2VcbiAgIHN1cmUgdGhhdCBmaWxlIGNhbiBiZSBwcmVwcm9jZXNzZWQgb24gMzItYml0IG1hY2hpbmVzLiAqKVxuXG5sZXQgb3ZlcmZsb3dfYm91bmRfbWF4X2ludDMyX3ZhbHVlIDogaW50MzIgPVxuICAyMTQ3NDgzNjQ3bFxuXG5sZXQgaW50MzJfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIDogaW50MzIgYXJyYXkgPVxuICBbfCAyMTQ3NDgzNjQ3bFxuICA7ICAyMTQ3NDgzNjQ3bFxuICA7ICA0NjM0MGxcbiAgOyAgMTI5MGxcbiAgOyAgMjE1bFxuICA7ICA3M2xcbiAgOyAgMzVsXG4gIDsgIDIxbFxuICA7ICAxNGxcbiAgOyAgMTBsXG4gIDsgIDhsXG4gIDsgIDdsXG4gIDsgIDVsXG4gIDsgIDVsXG4gIDsgIDRsXG4gIDsgIDRsXG4gIDsgIDNsXG4gIDsgIDNsXG4gIDsgIDNsXG4gIDsgIDNsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDJsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIDsgIDFsXG4gIHxdXG5cbmxldCBvdmVyZmxvd19ib3VuZF9tYXhfaW50X3ZhbHVlIDogaW50ID1cbiAgKC0xKSBsc3IgMVxuXG5sZXQgaW50X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyA6IGludCBhcnJheSA9XG4gIG1hdGNoIEludF9jb252ZXJzaW9ucy5udW1fYml0c19pbnQgd2l0aFxuICB8IDMyIC0+IEFycmF5Lm1hcCBpbnQzMl9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMgfmY6Q2FtbC5JbnQzMi50b19pbnRcbiAgfCA2MyAtPlxuICAgIFt8IENhbWwuSW50NjQudG9faW50IDQ2MTE2ODYwMTg0MjczODc5MDNMXG4gICAgOyAgQ2FtbC5JbnQ2NC50b19pbnQgNDYxMTY4NjAxODQyNzM4NzkwM0xcbiAgICA7ICBDYW1sLkludDY0LnRvX2ludCAyMTQ3NDgzNjQ3TFxuICAgIDsgIDE2NjQ1MTBcbiAgICA7ICA0NjM0MFxuICAgIDsgIDU0MDRcbiAgICA7ICAxMjkwXG4gICAgOyAgNDYzXG4gICAgOyAgMjE1XG4gICAgOyAgMTE4XG4gICAgOyAgNzNcbiAgICA7ICA0OVxuICAgIDsgIDM1XG4gICAgOyAgMjdcbiAgICA7ICAyMVxuICAgIDsgIDE3XG4gICAgOyAgMTRcbiAgICA7ICAxMlxuICAgIDsgIDEwXG4gICAgOyAgOVxuICAgIDsgIDhcbiAgICA7ICA3XG4gICAgOyAgN1xuICAgIDsgIDZcbiAgICA7ICA1XG4gICAgOyAgNVxuICAgIDsgIDVcbiAgICA7ICA0XG4gICAgOyAgNFxuICAgIDsgIDRcbiAgICA7ICA0XG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgfF1cbiAgfCAzMSAtPlxuICAgIFt8IDEwNzM3NDE4MjNcbiAgICA7ICAxMDczNzQxODIzXG4gICAgOyAgMzI3NjdcbiAgICA7ICAxMDIzXG4gICAgOyAgMTgxXG4gICAgOyAgNjNcbiAgICA7ICAzMVxuICAgIDsgIDE5XG4gICAgOyAgMTNcbiAgICA7ICAxMFxuICAgIDsgIDdcbiAgICA7ICA2XG4gICAgOyAgNVxuICAgIDsgIDRcbiAgICA7ICA0XG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIHxdXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxubGV0IG92ZXJmbG93X2JvdW5kX21heF9pbnQ2M19vbl9pbnQ2NF92YWx1ZSA6IGludDY0ID1cbiAgNDYxMTY4NjAxODQyNzM4NzkwM0xcblxubGV0IGludDYzX29uX2ludDY0X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyA6IGludDY0IGFycmF5ID1cbiAgW3wgNDYxMTY4NjAxODQyNzM4NzkwM0xcbiAgOyAgNDYxMTY4NjAxODQyNzM4NzkwM0xcbiAgOyAgMjE0NzQ4MzY0N0xcbiAgOyAgMTY2NDUxMExcbiAgOyAgNDYzNDBMXG4gIDsgIDU0MDRMXG4gIDsgIDEyOTBMXG4gIDsgIDQ2M0xcbiAgOyAgMjE1TFxuICA7ICAxMThMXG4gIDsgIDczTFxuICA7ICA0OUxcbiAgOyAgMzVMXG4gIDsgIDI3TFxuICA7ICAyMUxcbiAgOyAgMTdMXG4gIDsgIDE0TFxuICA7ICAxMkxcbiAgOyAgMTBMXG4gIDsgIDlMXG4gIDsgIDhMXG4gIDsgIDdMXG4gIDsgIDdMXG4gIDsgIDZMXG4gIDsgIDVMXG4gIDsgIDVMXG4gIDsgIDVMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDRMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDNMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDJMXG4gIDsgIDFMXG4gIDsgIDFMXG4gIHxdXG5cbmxldCBvdmVyZmxvd19ib3VuZF9tYXhfaW50NjRfdmFsdWUgOiBpbnQ2NCA9XG4gIDkyMjMzNzIwMzY4NTQ3NzU4MDdMXG5cbmxldCBpbnQ2NF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMgOiBpbnQ2NCBhcnJheSA9XG4gIFt8IDkyMjMzNzIwMzY4NTQ3NzU4MDdMXG4gIDsgIDkyMjMzNzIwMzY4NTQ3NzU4MDdMXG4gIDsgIDMwMzcwMDA0OTlMXG4gIDsgIDIwOTcxNTFMXG4gIDsgIDU1MTA4TFxuICA7ICA2MjA4TFxuICA7ICAxNDQ4TFxuICA7ICA1MTFMXG4gIDsgIDIzNExcbiAgOyAgMTI3TFxuICA7ICA3OExcbiAgOyAgNTJMXG4gIDsgIDM4TFxuICA7ICAyOExcbiAgOyAgMjJMXG4gIDsgIDE4TFxuICA7ICAxNUxcbiAgOyAgMTNMXG4gIDsgIDExTFxuICA7ICA5TFxuICA7ICA4TFxuICA7ICA3TFxuICA7ICA3TFxuICA7ICA2TFxuICA7ICA2TFxuICA7ICA1TFxuICA7ICA1TFxuICA7ICA1TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAxTFxuICB8XVxuXG5sZXQgaW50NjRfbmVnYXRpdmVfb3ZlcmZsb3dfYm91bmRzIDogaW50NjQgYXJyYXkgPVxuICBbfCAtOTIyMzM3MjAzNjg1NDc3NTgwN0xcbiAgOyAgLTkyMjMzNzIwMzY4NTQ3NzU4MDdMXG4gIDsgIC0zMDM3MDAwNDk5TFxuICA7ICAtMjA5NzE1MUxcbiAgOyAgLTU1MTA4TFxuICA7ICAtNjIwOExcbiAgOyAgLTE0NDhMXG4gIDsgIC01MTFMXG4gIDsgIC0yMzRMXG4gIDsgIC0xMjdMXG4gIDsgIC03OExcbiAgOyAgLTUyTFxuICA7ICAtMzhMXG4gIDsgIC0yOExcbiAgOyAgLTIyTFxuICA7ICAtMThMXG4gIDsgIC0xNUxcbiAgOyAgLTEzTFxuICA7ICAtMTFMXG4gIDsgIC05TFxuICA7ICAtOExcbiAgOyAgLTdMXG4gIDsgIC03TFxuICA7ICAtNkxcbiAgOyAgLTZMXG4gIDsgIC01TFxuICA7ICAtNUxcbiAgOyAgLTVMXG4gIDsgIC00TFxuICA7ICAtNExcbiAgOyAgLTRMXG4gIDsgIC00TFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTFMXG4gIHxdXG4iLCJvcGVuISBJbXBvcnRcblxubGV0IGludmFsaWRfYXJnZiA9IFByaW50Zi5pbnZhbGlkX2FyZ2ZcbmxldCBuZWdhdGl2ZV9leHBvbmVudCAoKSA9IFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJleHBvbmVudCBjYW4gbm90IGJlIG5lZ2F0aXZlXCIgKClcbmxldCBvdmVyZmxvdyAoKSA9IFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJpbnRlZ2VyIG92ZXJmbG93IGluIHBvd1wiICgpXG5cbigqIFRvIGltcGxlbWVudCBbaW50NjRfcG93XSwgd2UgdXNlIEMgY29kZSByYXRoZXIgdGhhbiBPQ2FtbCB0byBlbGltaW5hdGUgYWxsb2NhdGlvbi4gKilcbmV4dGVybmFsIGludF9tYXRoX2ludF9wb3cgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiQmFzZV9pbnRfbWF0aF9pbnRfcG93X3N0dWJcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgaW50X21hdGhfaW50NjRfcG93IDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIkJhc2VfaW50X21hdGhfaW50NjRfcG93X3N0dWJcIlxuXG5sZXQgaW50X3BvdyBiYXNlIGV4cG9uZW50ID1cbiAgaWYgZXhwb25lbnQgPCAwIHRoZW4gbmVnYXRpdmVfZXhwb25lbnQgKCk7XG4gIGlmIGFicyBiYXNlID4gMVxuICAmJiAoZXhwb25lbnQgPiA2M1xuICAgICAgfHwgYWJzIGJhc2UgPiBQb3dfb3ZlcmZsb3dfYm91bmRzLmludF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMuKGV4cG9uZW50KSlcbiAgdGhlbiBvdmVyZmxvdyAoKTtcbiAgaW50X21hdGhfaW50X3BvdyBiYXNlIGV4cG9uZW50XG47O1xuXG5tb2R1bGUgSW50NjRfd2l0aF9jb21wYXJpc29ucyA9IHN0cnVjdFxuICBpbmNsdWRlIENhbWwuSW50NjRcblxuICBleHRlcm5hbCAoIDwgKSA6IGludDY0IC0+IGludDY0IC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG4gIGV4dGVybmFsICggPiApIDogaW50NjQgLT4gaW50NjQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbiAgZXh0ZXJuYWwgKCA+PSApIDogaW50NjQgLT4gaW50NjQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5lbmRcblxuKCogd2UgZG9uJ3QgZG8gW2Fic10gaW4gaW50NjQgY2FzZSB0byBhdm9pZCBhbGxvY2F0aW9uICopXG5sZXQgaW50NjRfcG93IGJhc2UgZXhwb25lbnQgPVxuICBsZXQgb3BlbiBJbnQ2NF93aXRoX2NvbXBhcmlzb25zIGluXG4gIGlmIGV4cG9uZW50IDwgMEwgdGhlbiBuZWdhdGl2ZV9leHBvbmVudCAoKTtcbiAgaWYgKGJhc2UgPiAxTCB8fCBiYXNlIDwgLTFMKVxuICAmJiAoZXhwb25lbnQgPiA2M0xcbiAgICAgIHx8IChiYXNlID49IDBMXG4gICAgICAgICAgJiYgYmFzZSA+IFBvd19vdmVyZmxvd19ib3VuZHMuaW50NjRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzLih0b19pbnQgZXhwb25lbnQpXG4gICAgICAgICApXG4gICAgICB8fCAoYmFzZSA8IDBMXG4gICAgICAgICAgJiYgYmFzZSA8IFBvd19vdmVyZmxvd19ib3VuZHMuaW50NjRfbmVnYXRpdmVfb3ZlcmZsb3dfYm91bmRzLih0b19pbnQgZXhwb25lbnQpXG4gICAgICAgICApKVxuICB0aGVuIG92ZXJmbG93ICgpO1xuICBpbnRfbWF0aF9pbnQ2NF9wb3cgYmFzZSBleHBvbmVudFxuOztcblxubGV0IGludDYzX3Bvd19vbl9pbnQ2NCBiYXNlIGV4cG9uZW50ID1cbiAgbGV0IG9wZW4gSW50NjRfd2l0aF9jb21wYXJpc29ucyBpblxuICBpZiBleHBvbmVudCA8IDBMIHRoZW4gbmVnYXRpdmVfZXhwb25lbnQgKCk7XG4gIGlmIGFicyBiYXNlID4gMUxcbiAgJiYgKGV4cG9uZW50ID4gNjNMXG4gICAgICB8fCBhYnMgYmFzZVxuICAgICAgICAgPiBQb3dfb3ZlcmZsb3dfYm91bmRzLmludDYzX29uX2ludDY0X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcy4odG9faW50IGV4cG9uZW50KVxuICAgICApXG4gIHRoZW4gb3ZlcmZsb3cgKCk7XG4gIGludF9tYXRoX2ludDY0X3BvdyBiYXNlIGV4cG9uZW50XG47O1xuXG5tb2R1bGUgdHlwZSBNYWtlX2FyZyA9IHNpZ1xuICB0eXBlIHRcblxuICBpbmNsdWRlIEZsb2F0YWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcbiAgaW5jbHVkZSBTdHJpbmdhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gIHZhbCAoICsgKSA6IHQgLT4gdCAtPiB0XG4gIHZhbCAoIC0gKSA6IHQgLT4gdCAtPiB0XG4gIHZhbCAoICogKSA6IHQgLT4gdCAtPiB0XG4gIHZhbCAoIC8gKSA6IHQgLT4gdCAtPiB0XG4gIHZhbCAoIH4tICkgOiB0IC0+IHRcblxuICBpbmNsdWRlIENvbXBhcmlzb25zLkluZml4IHdpdGggdHlwZSB0IDo9IHRcblxuICB2YWwgYWJzIDogdCAtPiB0XG4gIHZhbCBuZWcgOiB0IC0+IHRcbiAgdmFsIHplcm8gOiB0XG4gIHZhbCBvZl9pbnRfZXhuIDogaW50IC0+IHRcbiAgdmFsIHJlbSA6IHQgLT4gdCAtPiB0XG5lbmRcblxubW9kdWxlIE1ha2UgKFggOiBNYWtlX2FyZykgPSBzdHJ1Y3RcbiAgb3BlbiBYXG5cbiAgbGV0ICggJSApIHggeSA9XG4gICAgaWYgeSA8PSB6ZXJvXG4gICAgdGhlblxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiJXMgJSUgJXMgaW4gY29yZV9pbnQubWw6IG1vZHVsdXMgc2hvdWxkIGJlIHBvc2l0aXZlXCJcbiAgICAgICAgKHRvX3N0cmluZyB4KVxuICAgICAgICAodG9fc3RyaW5nIHkpXG4gICAgICAgICgpO1xuICAgIGxldCBydmFsID0gWC5yZW0geCB5IGluXG4gICAgaWYgcnZhbCA8IHplcm8gdGhlbiBydmFsICsgeSBlbHNlIHJ2YWxcbiAgOztcblxuICBsZXQgb25lID0gb2ZfaW50X2V4biAxXG5cbiAgbGV0ICggLyUgKSB4IHkgPVxuICAgIGlmIHkgPD0gemVyb1xuICAgIHRoZW5cbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIiVzIC8lJSAlcyBpbiBjb3JlX2ludC5tbDogZGl2aXNvciBzaG91bGQgYmUgcG9zaXRpdmVcIlxuICAgICAgICAodG9fc3RyaW5nIHgpXG4gICAgICAgICh0b19zdHJpbmcgeSlcbiAgICAgICAgKCk7XG4gICAgaWYgeCA8IHplcm8gdGhlbiAoKHggKyBvbmUpIC8geSkgLSBvbmUgZWxzZSB4IC8geVxuICA7O1xuXG4gICgqKiBmbG9hdCBkaXZpc2lvbiBvZiBpbnRlZ2VycyAqKVxuICBsZXQgKCAvLyApIHggeSA9IHRvX2Zsb2F0IHggLy4gdG9fZmxvYXQgeVxuXG4gIGxldCByb3VuZF9kb3duIGkgfnRvX211bHRpcGxlX29mOm1vZHVsdXMgPSBpIC0gKGkgJSBtb2R1bHVzKVxuXG4gIGxldCByb3VuZF91cCBpIH50b19tdWx0aXBsZV9vZjptb2R1bHVzID1cbiAgICBsZXQgcmVtYWluZGVyID0gaSAlIG1vZHVsdXMgaW5cbiAgICBpZiByZW1haW5kZXIgPSB6ZXJvIHRoZW4gaSBlbHNlIGkgKyBtb2R1bHVzIC0gcmVtYWluZGVyXG4gIDs7XG5cbiAgbGV0IHJvdW5kX3Rvd2FyZHNfemVybyBpIH50b19tdWx0aXBsZV9vZiA9XG4gICAgaWYgaSA9IHplcm9cbiAgICB0aGVuIHplcm9cbiAgICBlbHNlIGlmIGkgPiB6ZXJvXG4gICAgdGhlbiByb3VuZF9kb3duIGkgfnRvX211bHRpcGxlX29mXG4gICAgZWxzZSByb3VuZF91cCBpIH50b19tdWx0aXBsZV9vZlxuICA7O1xuXG4gIGxldCByb3VuZF9uZWFyZXN0IGkgfnRvX211bHRpcGxlX29mOm1vZHVsdXMgPVxuICAgIGxldCByZW1haW5kZXIgPSBpICUgbW9kdWx1cyBpblxuICAgIGxldCBtb2R1bHVzX21pbnVzX3JlbWFpbmRlciA9IG1vZHVsdXMgLSByZW1haW5kZXIgaW5cbiAgICBpZiBtb2R1bHVzX21pbnVzX3JlbWFpbmRlciA8PSByZW1haW5kZXJcbiAgICB0aGVuIGkgKyBtb2R1bHVzX21pbnVzX3JlbWFpbmRlclxuICAgIGVsc2UgaSAtIHJlbWFpbmRlclxuICA7O1xuXG4gIGxldCByb3VuZCA/KGRpciA9IGBOZWFyZXN0KSBpIH50b19tdWx0aXBsZV9vZiA9XG4gICAgbWF0Y2ggZGlyIHdpdGhcbiAgICB8IGBOZWFyZXN0IC0+IHJvdW5kX25lYXJlc3QgaSB+dG9fbXVsdGlwbGVfb2ZcbiAgICB8IGBEb3duIC0+IHJvdW5kX2Rvd24gaSB+dG9fbXVsdGlwbGVfb2ZcbiAgICB8IGBVcCAtPiByb3VuZF91cCBpIH50b19tdWx0aXBsZV9vZlxuICAgIHwgYFplcm8gLT4gcm91bmRfdG93YXJkc196ZXJvIGkgfnRvX211bHRpcGxlX29mXG4gIDs7XG5lbmRcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbGV0IGludF9wb3cgPSBpbnRfcG93XG4gIGxldCBpbnQ2NF9wb3cgPSBpbnQ2NF9wb3dcbiAgbGV0IGludDYzX3Bvd19vbl9pbnQ2NCA9IGludDYzX3Bvd19vbl9pbnQ2NFxuXG4gIG1vZHVsZSBQb3dfb3ZlcmZsb3dfYm91bmRzID0gUG93X292ZXJmbG93X2JvdW5kc1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxuKCogQyBzdHViIGZvciBpbnQgcG9wY291bnQgdG8gdXNlIHRoZSBQT1BDTlQgaW5zdHJ1Y3Rpb24gd2hlcmUgcG9zc2libGUgKilcbmV4dGVybmFsIGludF9wb3Bjb3VudCA6IGludCAtPiBpbnQgPSBcIkJhc2VfaW50X21hdGhfaW50X3BvcGNvdW50XCIgW0BAbm9hbGxvY11cblxuKCogVG8gbWFpbnRhaW4gamF2YXNjcmlwdCBjb21wYXRpYmlsaXR5IGFuZCBlbmFibGUgdW5ib3hpbmcsIHdlIGltcGxlbWVudCBwb3Bjb3VudCBpblxuICAgT0NhbWwgcmF0aGVyIHRoYW4gdXNlIEMgc3R1YnMuIEltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbTpcbiAgIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhbW1pbmdfd2VpZ2h0I0VmZmljaWVudF9pbXBsZW1lbnRhdGlvbiAqKVxubGV0IGludDY0X3BvcGNvdW50ID1cbiAgbGV0IG9wZW4gQ2FtbC5JbnQ2NCBpblxuICBsZXQgKCArICkgPSBhZGQgaW5cbiAgbGV0ICggLSApID0gc3ViIGluXG4gIGxldCAoICogKSA9IG11bCBpblxuICBsZXQgKCBsc3IgKSA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgaW5cbiAgbGV0ICggbGFuZCApID0gbG9nYW5kIGluXG4gIGxldCBtMSA9IDB4NTU1NTU1NTU1NTU1NTU1NUwgaW5cbiAgKCogMGIwMTAxMDEwMS4uLiAqKVxuICBsZXQgbTIgPSAweDMzMzMzMzMzMzMzMzMzMzNMIGluXG4gICgqIDBiMDAxMTAwMTEuLi4gKilcbiAgbGV0IG00ID0gMHgwZjBmMGYwZjBmMGYwZjBmTCBpblxuICAoKiAwYjAwMDAxMTExLi4uICopXG4gIGxldCBoMDEgPSAweDAxMDEwMTAxMDEwMTAxMDFMIGluXG4gICgqIDEgYml0IHNldCBwZXIgYnl0ZSAqKVxuICBmdW4gW0BpbmxpbmVdIHggLT5cbiAgICAoKiBnYXRoZXIgdGhlIGJpdCBjb3VudCBmb3IgZXZlcnkgcGFpciBvZiBiaXRzICopXG4gICAgbGV0IHggPSB4IC0gKCh4IGxzciAxKSBsYW5kIG0xKSBpblxuICAgICgqIGdhdGhlciB0aGUgYml0IGNvdW50IGZvciBldmVyeSA0IGJpdHMgKilcbiAgICBsZXQgeCA9ICh4IGxhbmQgbTIpICsgKCh4IGxzciAyKSBsYW5kIG0yKSBpblxuICAgICgqIGdhdGhlciB0aGUgYml0IGNvdW50IGZvciBldmVyeSBieXRlICopXG4gICAgbGV0IHggPSAoeCArICh4IGxzciA0KSkgbGFuZCBtNCBpblxuICAgICgqIHN1bSB0aGUgYml0IGNvdW50cyBpbiB0aGUgdG9wIGJ5dGUgYW5kIHNoaWZ0IGl0IGRvd24gKilcbiAgICB0b19pbnQgKCh4ICogaDAxKSBsc3IgNTYpXG47O1xuXG5sZXQgaW50MzJfcG9wY291bnQgPVxuICAoKiBPbiA2NC1iaXQgc3lzdGVtcywgdGhpcyBpcyBmYXN0ZXIgdGhhbiBpbXBsZW1lbnRpbmcgdXNpbmcgW2ludDMyXSBhcml0aG1ldGljLiAqKVxuICBsZXQgbWFzayA9IDB4ZmZmZl9mZmZmTCBpblxuICBmdW4gW0BpbmxpbmVdIHggLT4gaW50NjRfcG9wY291bnQgKENhbWwuSW50NjQubG9nYW5kIChDYW1sLkludDY0Lm9mX2ludDMyIHgpIG1hc2spXG47O1xuXG5sZXQgbmF0aXZlaW50X3BvcGNvdW50ID1cbiAgbWF0Y2ggQ2FtbC5OYXRpdmVpbnQuc2l6ZSB3aXRoXG4gIHwgMzIgLT4gZnVuIFtAaW5saW5lXSB4IC0+IGludDMyX3BvcGNvdW50IChDYW1sLk5hdGl2ZWludC50b19pbnQzMiB4KVxuICB8IDY0IC0+IGZ1biBbQGlubGluZV0geCAtPiBpbnQ2NF9wb3Bjb3VudCAoQ2FtbC5JbnQ2NC5vZl9uYXRpdmVpbnQgeClcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuOztcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBTaWduMFxuaW5jbHVkZSBJZGVudGlmaWFibGUuTWFrZSAoU2lnbjApXG5cbigqIE9wZW4gW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb25zIHNvXG4gICB0aGV5IGRvIG5vdCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnNcbiAgIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgdG9fZmxvYXQgPSBmdW5jdGlvblxuICB8IE5lZyAtPiAtMS5cbiAgfCBaZXJvIC0+IDAuXG4gIHwgUG9zIC0+IDEuXG47O1xuXG5sZXQgZmxpcCA9IGZ1bmN0aW9uXG4gIHwgTmVnIC0+IFBvc1xuICB8IFplcm8gLT4gWmVyb1xuICB8IFBvcyAtPiBOZWdcbjs7XG5cbmxldCAoICogKSB0IHQnID0gb2ZfaW50ICh0b19pbnQgdCAqIHRvX2ludCB0JylcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYXQgdGhlIGVuZCwgYWZ0ZXIgYW55XG4gICBmdW5jdG9yIGFwcGxpY2F0aW9ucyB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzb1xuICAgdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSB0aGlzXG4gICBtb2R1bGUuICopXG5pbmNsdWRlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEludF9pbnRmXG5pbmNsdWRlIEludDBcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50IFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9pbnRcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2ludCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoaW50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2ludCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBpbnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBjb21wYXJlIHggeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuY29tcGFyZSB4IHlcblxuICBsZXQgb2Zfc3RyaW5nIHMgPVxuICAgIHRyeSBvZl9zdHJpbmcgcyB3aXRoXG4gICAgfCBfIC0+IFByaW50Zi5mYWlsd2l0aGYgXCJJbnQub2Zfc3RyaW5nOiAlU1wiIHMgKClcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG5lbmRcblxubGV0IG51bV9iaXRzID0gSW50X2NvbnZlcnNpb25zLm51bV9iaXRzX2ludFxubGV0IGZsb2F0X2xvd2VyX2JvdW5kID0gRmxvYXQwLmxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF91cHBlcl9ib3VuZCA9IEZsb2F0MC51cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgdG9fZmxvYXQgPSBDYW1sLmZsb2F0X29mX2ludFxubGV0IG9mX2Zsb2F0X3VuY2hlY2tlZCA9IENhbWwuaW50X29mX2Zsb2F0XG5cbmxldCBvZl9mbG9hdCBmID1cbiAgaWYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSBmIGZsb2F0X2xvd2VyX2JvdW5kXG4gICYmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgZiBmbG9hdF91cHBlcl9ib3VuZFxuICB0aGVuIENhbWwuaW50X29mX2Zsb2F0IGZcbiAgZWxzZVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgIFwiSW50Lm9mX2Zsb2F0OiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggZilcbiAgICAgICgpXG47O1xuXG5sZXQgemVybyA9IDBcbmxldCBvbmUgPSAxXG5sZXQgbWludXNfb25lID0gLTFcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG5tb2R1bGUgQ29udiA9IEludF9jb252ZXJzaW9uc1xuaW5jbHVkZSBDb252Lk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29udi5NYWtlX2hleCAoc3RydWN0XG4gICAgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgICB0eXBlIHQgPSBpbnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2ludCA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBoYXNoX2ZvbGRfaW50XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IGhhc2hfaW50IGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCB6ZXJvID0gemVyb1xuICAgIGxldCBuZWcgPSAoIH4tIClcbiAgICBsZXQgKCA8ICkgPSAoIDwgKVxuICAgIGxldCB0b19zdHJpbmcgaSA9IFByaW50Zi5zcHJpbnRmIFwiJXhcIiBpXG4gICAgbGV0IG9mX3N0cmluZyBzID0gQ2FtbC5TY2FuZi5zc2NhbmYgcyBcIiV4XCIgRm4uaWRcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50LkhleFwiXG4gIGVuZClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50XCJcbiAgZW5kKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzb1xuICAgdGhleSBkbyBub3Qgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zXG4gICBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5leHRlcm5hbCB0b19pbnQzMl90cnVuYyA6IHQgLT4gaW50MzIgPSBcIiVpbnQzMl9vZl9pbnRcIlxuZXh0ZXJuYWwgb2ZfaW50MzJfdHJ1bmMgOiBpbnQzMiAtPiB0ID0gXCIlaW50MzJfdG9faW50XCJcbmV4dGVybmFsIG9mX2ludDY0X3RydW5jIDogaW50NjQgLT4gdCA9IFwiJWludDY0X3RvX2ludFwiXG5leHRlcm5hbCBvZl9uYXRpdmVpbnRfdHJ1bmMgOiBuYXRpdmVpbnQgLT4gdCA9IFwiJW5hdGl2ZWludF90b19pbnRcIlxuXG5sZXQgcHJlZCBpID0gaSAtIDFcbmxldCBzdWNjIGkgPSBpICsgMVxubGV0IHRvX2ludCBpID0gaVxubGV0IHRvX2ludF9leG4gPSB0b19pbnRcbmxldCBvZl9pbnQgaSA9IGlcbmxldCBvZl9pbnRfZXhuID0gb2ZfaW50XG5sZXQgbWF4X3ZhbHVlID0gQ2FtbC5tYXhfaW50XG5sZXQgbWluX3ZhbHVlID0gQ2FtbC5taW5faW50XG5sZXQgbWF4X3ZhbHVlXzMwX2JpdHMgPSAweDNGRkZfRkZGRlxubGV0IG9mX2ludDMyID0gQ29udi5pbnQzMl90b19pbnRcbmxldCBvZl9pbnQzMl9leG4gPSBDb252LmludDMyX3RvX2ludF9leG5cbmxldCB0b19pbnQzMiA9IENvbnYuaW50X3RvX2ludDMyXG5sZXQgdG9faW50MzJfZXhuID0gQ29udi5pbnRfdG9faW50MzJfZXhuXG5sZXQgb2ZfaW50NjQgPSBDb252LmludDY0X3RvX2ludFxubGV0IG9mX2ludDY0X2V4biA9IENvbnYuaW50NjRfdG9faW50X2V4blxubGV0IHRvX2ludDY0ID0gQ29udi5pbnRfdG9faW50NjRcbmxldCBvZl9uYXRpdmVpbnQgPSBDb252Lm5hdGl2ZWludF90b19pbnRcbmxldCBvZl9uYXRpdmVpbnRfZXhuID0gQ29udi5uYXRpdmVpbnRfdG9faW50X2V4blxubGV0IHRvX25hdGl2ZWludCA9IENvbnYuaW50X3RvX25hdGl2ZWludFxubGV0IHRvX25hdGl2ZWludF9leG4gPSB0b19uYXRpdmVpbnRcbmxldCBhYnMgeCA9IGFicyB4XG5cbigqIG5vdGUgdGhhdCByZW0gaXMgbm90IHNhbWUgYXMgJSAqKVxubGV0IHJlbSBhIGIgPSBhIG1vZCBiXG5sZXQgaW5jciA9IENhbWwuaW5jclxubGV0IGRlY3IgPSBDYW1sLmRlY3JcbmxldCBzaGlmdF9yaWdodCBhIGIgPSBhIGFzciBiXG5sZXQgc2hpZnRfcmlnaHRfbG9naWNhbCBhIGIgPSBhIGxzciBiXG5sZXQgc2hpZnRfbGVmdCBhIGIgPSBhIGxzbCBiXG5sZXQgYml0X25vdCBhID0gbG5vdCBhXG5sZXQgYml0X29yIGEgYiA9IGEgbG9yIGJcbmxldCBiaXRfYW5kIGEgYiA9IGEgbGFuZCBiXG5sZXQgYml0X3hvciBhIGIgPSBhIGx4b3IgYlxubGV0IHBvdyA9IEludF9tYXRoLlByaXZhdGUuaW50X3Bvd1xubGV0ICggKiogKSBiIGUgPSBwb3cgYiBlXG5cbm1vZHVsZSBQb3cyID0gc3RydWN0XG4gIG9wZW4hIEltcG9ydFxuXG4gIGxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4gIGxldCBub25fcG9zaXRpdmVfYXJndW1lbnQgKCkgPVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJhcmd1bWVudCBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlXCIgKClcbiAgOztcblxuXG4gICgqKiBcImNlaWxpbmcgcG93ZXIgb2YgMlwiIC0gTGVhc3QgcG93ZXIgb2YgMiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGNlaWxfcG93MiB4ID1cbiAgICBpZiB4IDw9IDAgdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSB4IC0gMSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgKCogVGhlIG5leHQgbGluZSBpcyBzdXBlcmZsdW91cyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgYnV0IGl0J3MgZmFzdGVyIHRvIGRvIGl0XG4gICAgICAgYW55d2F5IHRoYW4gdG8gYnJhbmNoICopXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgeCArIDFcbiAgOztcblxuICAoKiogXCJmbG9vciBwb3dlciBvZiAyXCIgLSBMYXJnZXN0IHBvd2VyIG9mIDIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBmbG9vcl9wb3cyIHggPVxuICAgIGlmIHggPD0gMCB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgICgqIFRoZSBuZXh0IGxpbmUgaXMgc3VwZXJmbHVvdXMgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdFxuICAgICAgIGFueXdheSB0aGFuIHRvIGJyYW5jaCAqKVxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIHggLSAoeCBsc3IgMSlcbiAgOztcblxuICBsZXQgaXNfcG93MiB4ID1cbiAgICBpZiB4IDw9IDAgdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgeCBsYW5kICh4IC0gMSkgPSAwXG4gIDs7XG5cbiAgKCogQyBzdHVicyBmb3IgaW50IGNseiBhbmQgY3R6IHRvIHVzZSB0aGUgQ0xaL0JTUi9DVFovQlNGIGluc3RydWN0aW9uIHdoZXJlIHBvc3NpYmxlICopXG4gIGV4dGVybmFsIGNselxuICAgIDogICgqIE5vdGUgdGhhdCB3ZSBwYXNzIHRoZSB0YWdnZWQgaW50IGhlcmUuIFNlZSBpbnRfbWF0aF9zdHVicy5jIGZvciBkZXRhaWxzIG9uIHdoeVxuICAgICAgICAgIHRoaXMgaXMgY29ycmVjdC4gKilcbiAgICBpbnRcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50X2NselwiIFwiQmFzZV9pbnRfbWF0aF9pbnRfY2x6X3VudGFnZ2VkXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBjdHpcbiAgICA6ICAoaW50W0B1bnRhZ2dlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludF9jdHpcIiBcIkJhc2VfaW50X21hdGhfaW50X2N0el91bnRhZ2dlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgZmxvb3JfbG9nMiBpID1cbiAgICBpZiBpIDw9IDBcbiAgICB0aGVuIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltJbnQuZmxvb3JfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50IGkgXSk7XG4gICAgbnVtX2JpdHMgLSAxIC0gY2x6IGlcbiAgOztcblxuICBsZXQgY2VpbF9sb2cyIGkgPVxuICAgIGlmIGkgPD0gMFxuICAgIHRoZW4gcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0ludC5jZWlsX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludCBpIF0pO1xuICAgIGlmIGkgPSAxIHRoZW4gMCBlbHNlIG51bV9iaXRzIC0gY2x6IChpIC0gMSlcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFBvdzJcblxubGV0IHNpZ24gPSBTaWduLm9mX2ludFxubGV0IHBvcGNvdW50ID0gUG9wY291bnQuaW50X3BvcGNvdW50XG5cbm1vZHVsZSBQcmVfTyA9IHN0cnVjdFxuICBleHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbiAgZXh0ZXJuYWwgKCAtICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXN1YmludFwiXG4gIGV4dGVybmFsICggKiApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuICBleHRlcm5hbCAoIC8gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbiAgZXh0ZXJuYWwgKCB+LSApIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5cbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCBhYnMgPSBhYnNcblxuICBleHRlcm5hbCBuZWcgOiB0IC0+IHQgPSBcIiVuZWdpbnRcIlxuXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50X2V4biA9IG9mX2ludF9leG5cbmVuZFxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBpbmNsdWRlIFByZV9PXG5cbiAgbW9kdWxlIEYgPSBJbnRfbWF0aC5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGluY2x1ZGUgUHJlX09cblxuICAgICAgbGV0IHJlbSA9IHJlbVxuICAgICAgbGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbiAgICAgIGxldCBvZl9mbG9hdCA9IG9mX2Zsb2F0XG4gICAgICBsZXQgb2Zfc3RyaW5nID0gVC5vZl9zdHJpbmdcbiAgICAgIGxldCB0b19zdHJpbmcgPSBULnRvX3N0cmluZ1xuICAgIGVuZClcblxuICBpbmNsdWRlIEZcblxuICBleHRlcm5hbCBic3dhcDE2IDogaW50IC0+IGludCA9IFwiJWJzd2FwMTZcIlxuXG4gICgqIFRoZXNlIGlubGluZWQgdmVyc2lvbnMgb2YgKCUpLCAoLyUpLCBhbmQgKC8vKSBwZXJmb3JtIGJldHRlciB0aGFuIHRoZWlyIGZ1bmN0b3JpemVkXG4gICAgIGNvdW50ZXJwYXJ0cyBpbiBbRl0gKHNlZSBiZW5jaG1hcmtzIGJlbG93KS5cblxuICAgICBUaGUgcmVhc29uIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW5saW5lZCBpbiBbSW50XSBidXQgbm90IGluIGFueSBvZiB0aGUgb3RoZXIgaW50ZWdlclxuICAgICBtb2R1bGVzIGlzIHRoYXQgdGhleSBleGlzdGVkIGluIFtJbnRdIGFuZCBbSW50XSBhbG9uZSBwcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mXG4gICAgIHRoZSBbSW50X21hdGguTWFrZV0gZnVuY3RvciwgYW5kIHdlIGRpZG4ndCB3YW50IHRvIGRlZ3JhZGUgdGhlaXIgcGVyZm9ybWFuY2UuXG5cbiAgICAgV2Ugd29uJ3QgcHJlLWVtcHRpdmVseSBkbyB0aGUgc2FtZSBmb3IgbmV3IGZ1bmN0aW9ucywgdW5sZXNzIHNvbWVvbmUgY2FyZXMsIG9uIGEgY2FzZVxuICAgICBieSBjYXNlIGZhc2hpb24uICAqKVxuXG4gIGxldCAoICUgKSB4IHkgPVxuICAgIGlmIHkgPD0gemVyb1xuICAgIHRoZW5cbiAgICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCIlcyAlJSAlcyBpbiBjb3JlX2ludC5tbDogbW9kdWx1cyBzaG91bGQgYmUgcG9zaXRpdmVcIlxuICAgICAgICAodG9fc3RyaW5nIHgpXG4gICAgICAgICh0b19zdHJpbmcgeSlcbiAgICAgICAgKCk7XG4gICAgbGV0IHJ2YWwgPSByZW0geCB5IGluXG4gICAgaWYgcnZhbCA8IHplcm8gdGhlbiBydmFsICsgeSBlbHNlIHJ2YWxcbiAgOztcblxuICBsZXQgKCAvJSApIHggeSA9XG4gICAgaWYgeSA8PSB6ZXJvXG4gICAgdGhlblxuICAgICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgICBcIiVzIC8lJSAlcyBpbiBjb3JlX2ludC5tbDogZGl2aXNvciBzaG91bGQgYmUgcG9zaXRpdmVcIlxuICAgICAgICAodG9fc3RyaW5nIHgpXG4gICAgICAgICh0b19zdHJpbmcgeSlcbiAgICAgICAgKCk7XG4gICAgaWYgeCA8IHplcm8gdGhlbiAoKHggKyBvbmUpIC8geSkgLSBvbmUgZWxzZSB4IC8geVxuICA7O1xuXG4gIGxldCAoIC8vICkgeCB5ID0gdG9fZmxvYXQgeCAvLiB0b19mbG9hdCB5XG5cbiAgZXh0ZXJuYWwgKCBsYW5kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFuZGludFwiXG4gIGV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbiAgZXh0ZXJuYWwgKCBseG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJXhvcmludFwiXG5cbiAgbGV0IGxub3QgPSBsbm90XG5cbiAgZXh0ZXJuYWwgKCBsc2wgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbiAgZXh0ZXJuYWwgKCBsc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNyaW50XCJcbiAgZXh0ZXJuYWwgKCBhc3IgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcbmVuZFxuXG5pbmNsdWRlIE9cblxuKCogW0ludF0gYW5kIFtJbnQuT10gYWdyZWUgdmFsdWUtd2lzZSAqKVxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBtb2R1bGUgT19GID0gTy5GXG5lbmRcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yXG4gICBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9uc1xuICAgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5cbmxldCBmYWlsd2l0aGYgPSBQcmludGYuZmFpbHdpdGhmXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIGluY2x1ZGUgVWNoYXIwXG5cbiAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLlVjaGFyXCJcbiAgbGV0IGhhc2hfZm9sZF90IHN0YXRlIHQgPSBIYXNoLmZvbGRfaW50IHN0YXRlICh0b19pbnQgdClcbiAgbGV0IGhhc2ggdCA9IEhhc2gucnVuIGhhc2hfZm9sZF90IHRcbiAgbGV0IHRvX3N0cmluZyB0ID0gUHJpbnRmLnNwcmludGYgXCJVKyUwNFhcIiAodG9faW50IHQpXG5cbiAgKCogRG8gbm90IGFjdHVhbGx5IGV4cG9ydCB0aGlzLiBTZWUgZGlzY3Vzc2lvbiBpbiB0aGUgLm1saSAqKVxuXG4gIGxldCBzZXhwX29mX3QgdCA9IFNleHAuQXRvbSAodG9fc3RyaW5nIHQpXG5cbiAgbGV0IHRfb2Zfc2V4cCBzZXhwID1cbiAgICBtYXRjaCBzZXhwIHdpdGhcbiAgICB8IFNleHAuTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJVY2hhci50X29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuICAgIHwgU2V4cC5BdG9tIHMgLT5cbiAgICAgICh0cnkgQ2FtbC5TY2FuZi5zc2NhbmYgcyBcIlUrJVhcIiAoZnVuIGkgLT4gVWNoYXIwLm9mX2ludCBpKSB3aXRoXG4gICAgICAgfCBfIC0+IG9mX3NleHBfZXJyb3IgXCJVY2hhci50X29mX3NleHA6IGF0b20gb2YgdGhlIGZvcm0gVStYWFhYIG5lZWRlZFwiIHNleHApXG4gIDs7XG5cbiAgbGV0IHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCA9XG4gICAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSBTdHJpbmcudF9zZXhwX2dyYW1tYXJcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKFQpXG5pbmNsdWRlIENvbXBhcmFibGUuTWFrZSAoVClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgVWNoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgaW50X2lzX3NjYWxhciA9IGlzX3ZhbGlkXG5cbmxldCBzdWNjX2V4biBjID1cbiAgdHJ5IFVjaGFyMC5zdWNjIGMgd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgbXNnIC0+IGZhaWx3aXRoZiBcIlVjaGFyLnN1Y2NfZXhuOiAlc1wiIG1zZyAoKVxuOztcblxubGV0IHN1Y2MgYyA9XG4gIHRyeSBTb21lIChVY2hhcjAuc3VjYyBjKSB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBfIC0+IE5vbmVcbjs7XG5cbmxldCBwcmVkX2V4biBjID1cbiAgdHJ5IFVjaGFyMC5wcmVkIGMgd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgbXNnIC0+IGZhaWx3aXRoZiBcIlVjaGFyLnByZWRfZXhuOiAlc1wiIG1zZyAoKVxuOztcblxubGV0IHByZWQgYyA9XG4gIHRyeSBTb21lIChVY2hhcjAucHJlZCBjKSB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBfIC0+IE5vbmVcbjs7XG5cbmxldCBvZl9zY2FsYXIgaSA9IGlmIGludF9pc19zY2FsYXIgaSB0aGVuIFNvbWUgKHVuc2FmZV9vZl9pbnQgaSkgZWxzZSBOb25lXG5cbmxldCBvZl9zY2FsYXJfZXhuIGkgPVxuICBpZiBpbnRfaXNfc2NhbGFyIGlcbiAgdGhlbiB1bnNhZmVfb2ZfaW50IGlcbiAgZWxzZSBmYWlsd2l0aGYgXCJVY2hhci5vZl9pbnRfZXhuIGdvdCBhIGludmFsaWQgVW5pY29kZSBzY2FsYXIgdmFsdWU6ICUwNFhcIiBpICgpXG47O1xuXG5sZXQgdG9fc2NhbGFyIHQgPSBVY2hhcjAudG9faW50IHRcbmxldCB0b19jaGFyIGMgPSBpZiBpc19jaGFyIGMgdGhlbiBTb21lICh1bnNhZmVfdG9fY2hhciBjKSBlbHNlIE5vbmVcblxubGV0IHRvX2NoYXJfZXhuIGMgPVxuICBpZiBpc19jaGFyIGNcbiAgdGhlbiB1bnNhZmVfdG9fY2hhciBjXG4gIGVsc2UgZmFpbHdpdGhmIFwiVWNoYXIudG9fY2hhcl9leG4gZ290IGEgbm9uIGxhdGluLTEgY2hhcmFjdGVyOiBVKyUwNFhcIiAodG9faW50IGMpICgpXG47O1xuXG5sZXQgdXRmOF9ieXRlX2xlbmd0aCB1Y2hhciA9XG4gIGxldCBjb2RlcG9pbnQgPSB0b19zY2FsYXIgdWNoYXIgaW5cbiAgaWYgSW50LiggPCApIGNvZGVwb2ludCAweDgwXG4gIHRoZW4gMVxuICBlbHNlIGlmIEludC4oIDwgKSBjb2RlcG9pbnQgMHg4MDBcbiAgdGhlbiAyXG4gIGVsc2UgaWYgSW50LiggPCApIGNvZGVwb2ludCAweDEwMDAwXG4gIHRoZW4gM1xuICBlbHNlIDRcbjs7XG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBVY2hhcl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlICgnYSwgJ2IpIHQgPSBUIDogKCdhLCAnYSkgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxubGV0IHNleHBfb2ZfdCA6XG4gICdhICdiLlxuICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ2IgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoJ2EsICdiKSB0IC0+IFNleHBsaWIwLlNleHAudFxuICA9XG4gIGZ1biAodHlwZSBhX18wMDNfIGJfXzAwNF8pXG4gICAgICA6ICAoKGFfXzAwM18gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoYl9fMDA0XyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgICAgLT4gKGFfXzAwM18sIGJfXzAwNF8pIHQgLT4gU2V4cGxpYjAuU2V4cC50KSAtPlxuICAgIGZ1biBfb2ZfYV9fMDAxXyBfb2ZfYl9fMDAyXyBUIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlRcIlxuOztcblxuW0BAQGVuZF1cblxudHlwZSAoJ2EsICdiKSBlcXVhbCA9ICgnYSwgJ2IpIHRcblxubGV0IHJlZmwgPSBUXG5sZXQgc3ltICh0eXBlIGEgYikgKFQgOiAoYSwgYikgdCkgOiAoYiwgYSkgdCA9IFRcbmxldCB0cmFucyAodHlwZSBhIGIgYykgKFQgOiAoYSwgYikgdCkgKFQgOiAoYiwgYykgdCkgOiAoYSwgYykgdCA9IFRcbmxldCBjb252ICh0eXBlIGEgYikgKFQgOiAoYSwgYikgdCkgKGEgOiBhKSA6IGIgPSBhXG5cbm1vZHVsZSBMaWZ0IChYIDogc2lnXG4gICAgdHlwZSAnYSB0XG4gIGVuZCkgPVxuc3RydWN0XG4gIGxldCBsaWZ0ICh0eXBlIGEgYikgKFQgOiAoYSwgYikgdCkgOiAoYSBYLnQsIGIgWC50KSB0ID0gVFxuZW5kXG5cbm1vZHVsZSBMaWZ0MiAoWCA6IHNpZ1xuICAgIHR5cGUgKCdhMSwgJ2EyKSB0XG4gIGVuZCkgPVxuc3RydWN0XG4gIGxldCBsaWZ0ICh0eXBlIGExIGIxIGEyIGIyKSAoVCA6IChhMSwgYjEpIHQpIChUIDogKGEyLCBiMikgdClcbiAgICA6ICgoYTEsIGEyKSBYLnQsIChiMSwgYjIpIFgudCkgdFxuICAgID1cbiAgICBUXG4gIDs7XG5lbmRcblxubW9kdWxlIExpZnQzIChYIDogc2lnXG4gICAgdHlwZSAoJ2ExLCAnYTIsICdhMykgdFxuICBlbmQpID1cbnN0cnVjdFxuICBsZXQgbGlmdCAodHlwZSBhMSBiMSBhMiBiMiBhMyBiMykgKFQgOiAoYTEsIGIxKSB0KSAoVCA6IChhMiwgYjIpIHQpIChUIDogKGEzLCBiMykgdClcbiAgICA6ICgoYTEsIGEyLCBhMykgWC50LCAoYjEsIGIyLCBiMykgWC50KSB0XG4gICAgPVxuICAgIFRcbiAgOztcbmVuZFxuXG5sZXQgZGV0dXBsZTIgKHR5cGUgYTEgYTIgYjEgYjIpIChUIDogKGExICogYTIsIGIxICogYjIpIHQpIDogKGExLCBiMSkgdCAqIChhMiwgYjIpIHQgPVxuICBULCBUXG47O1xuXG5sZXQgdHVwbGUyICh0eXBlIGExIGEyIGIxIGIyKSAoVCA6IChhMSwgYjEpIHQpIChUIDogKGEyLCBiMikgdCkgOiAoYTEgKiBhMiwgYjEgKiBiMikgdCA9IFRcblxubW9kdWxlIHR5cGUgSW5qZWN0aXZlID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIHZhbCBzdHJpcCA6ICgnYSB0LCAnYiB0KSBlcXVhbCAtPiAoJ2EsICdiKSBlcXVhbFxuZW5kXG5cbm1vZHVsZSB0eXBlIEluamVjdGl2ZTIgPSBzaWdcbiAgdHlwZSAoJ2ExLCAnYTIpIHRcblxuICB2YWwgc3RyaXAgOiAoKCdhMSwgJ2EyKSB0LCAoJ2IxLCAnYjIpIHQpIGVxdWFsIC0+ICgnYTEsICdiMSkgZXF1YWwgKiAoJ2EyLCAnYjIpIGVxdWFsXG5lbmRcblxubW9kdWxlIENvbXBvc2l0aW9uX3ByZXNlcnZlc19pbmplY3Rpdml0eSAoTTEgOiBJbmplY3RpdmUpIChNMiA6IEluamVjdGl2ZSkgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgTTEudCBNMi50XG5cbiAgbGV0IHN0cmlwIGUgPSBNMS5zdHJpcCAoTTIuc3RyaXAgZSlcbmVuZFxuXG5tb2R1bGUgSWQgPSBzdHJ1Y3RcbiAgbW9kdWxlIFVpZCA9IEludFxuXG4gIG1vZHVsZSBXaXRuZXNzID0gc3RydWN0XG4gICAgbW9kdWxlIEtleSA9IHN0cnVjdFxuICAgICAgdHlwZSBfIHQgPSAuLlxuICAgICAgdHlwZSB0eXBlX3dpdG5lc3NfaW50ID0gWyBgdHlwZV93aXRuZXNzIG9mIGludCBdIFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgICBsZXQgc2V4cF9vZl90eXBlX3dpdG5lc3NfaW50ID1cbiAgICAgICAgKGZ1biAoYHR5cGVfd2l0bmVzcyB2X18wMDVfKSAtPlxuICAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJ0eXBlX3dpdG5lc3NcIjsgc2V4cF9vZl9pbnQgdl9fMDA1XyBdXG4gICAgICAgICAgIDogdHlwZV93aXRuZXNzX2ludCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICA7O1xuXG4gICAgICBbQEBAZW5kXVxuXG4gICAgICBsZXQgc2V4cF9vZl90IF9zZXhwX29mX2EgdCA9XG4gICAgICAgIGB0eXBlX3dpdG5lc3NcbiAgICAgICAgICAoQ2FtbC5PYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLmlkIChDYW1sLk9iai5FeHRlbnNpb25fY29uc3RydWN0b3Iub2ZfdmFsIHQpKVxuICAgICAgICB8PiBzZXhwX29mX3R5cGVfd2l0bmVzc19pbnRcbiAgICAgIDs7XG4gICAgZW5kXG5cbiAgICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgICB0eXBlIHRcbiAgICAgIHR5cGUgXyBLZXkudCArPSBLZXkgOiB0IEtleS50XG4gICAgZW5kXG5cbiAgICB0eXBlICdhIHQgPSAobW9kdWxlIFMgd2l0aCB0eXBlIHQgPSAnYSlcblxuICAgIGxldCBzZXhwX29mX3QgKHR5cGUgYSkgc2V4cF9vZl9hIChtb2R1bGUgTSA6IFMgd2l0aCB0eXBlIHQgPSBhKSA9XG4gICAgICBNLktleSB8PiBLZXkuc2V4cF9vZl90IHNleHBfb2ZfYVxuICAgIDs7XG5cbiAgICBsZXQgY3JlYXRlICh0eXBlIHQpICgpID1cbiAgICAgIGxldCBtb2R1bGUgTSA9IHN0cnVjdFxuICAgICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuICAgICAgICB0eXBlIF8gS2V5LnQgKz0gS2V5IDogdCBLZXkudFxuICAgICAgZW5kXG4gICAgICBpblxuICAgICAgKG1vZHVsZSBNIDogUyB3aXRoIHR5cGUgdCA9IHQpXG4gICAgOztcblxuICAgIGxldCB1aWQgKHR5cGUgYSkgKG1vZHVsZSBNIDogUyB3aXRoIHR5cGUgdCA9IGEpID1cbiAgICAgIENhbWwuT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5pZCAoQ2FtbC5PYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLm9mX3ZhbCBNLktleSlcbiAgICA7O1xuXG4gICAgKCogV2Ugd2FudCBhIGNvbnN0YW50IGFsbG9jYXRlZCBvbmNlIHRoYXQgW3NhbWVdIGNhbiByZXR1cm4gd2hlbmV2ZXIgaXQgZ2V0cyB0aGUgc2FtZVxuICAgICAgIHdpdG5lc3Nlcy4gIElmIHdlIHdyaXRlIHRoZSBjb25zdGFudCBpbnNpZGUgdGhlIGJvZHkgb2YgW3NhbWVdLCB0aGUgbmF0aXZlLWNvZGVcbiAgICAgICBjb21waWxlciB3aWxsIGRvIHRoZSByaWdodCB0aGluZyBhbmQgbGlmdCBpdCBvdXQuICBCdXQgZm9yIGNsYXJpdHkgYW5kIHJvYnVzdG5lc3MsXG4gICAgICAgd2UgZG8gaXQgb3Vyc2VsdmVzLiAqKVxuICAgIGxldCBzb21lX3QgPSBTb21lIFRcblxuICAgIGxldCBzYW1lICh0eXBlIGEgYikgKGEgOiBhIHQpIChiIDogYiB0KSA6IChhLCBiKSBlcXVhbCBvcHRpb24gPVxuICAgICAgbGV0IG1vZHVsZSBBID0gKHZhbCBhIDogUyB3aXRoIHR5cGUgdCA9IGEpIGluXG4gICAgICBsZXQgbW9kdWxlIEIgPSAodmFsIGIgOiBTIHdpdGggdHlwZSB0ID0gYikgaW5cbiAgICAgIG1hdGNoIEEuS2V5IHdpdGhcbiAgICAgIHwgQi5LZXkgLT4gc29tZV90XG4gICAgICB8IF8gLT4gTm9uZVxuICAgIDs7XG4gIGVuZFxuXG5cbiAgdHlwZSAnYSB0ID1cbiAgICB7IHdpdG5lc3MgOiAnYSBXaXRuZXNzLnRcbiAgICA7IG5hbWUgOiBzdHJpbmdcbiAgICA7IHRvX3NleHAgOiAnYSAtPiBTZXhwLnRcbiAgICB9XG5cbiAgbGV0IHNleHBfb2ZfdCBfIHsgd2l0bmVzczsgbmFtZTsgdG9fc2V4cCB9IDogU2V4cC50ID1cbiAgICBpZiBhbV90ZXN0aW5nXG4gICAgdGhlbiBBdG9tIG5hbWVcbiAgICBlbHNlXG4gICAgICBMaXN0XG4gICAgICAgIFsgTGlzdCBbIEF0b20gXCJuYW1lXCI7IEF0b20gbmFtZSBdXG4gICAgICAgIDsgTGlzdCBbIEF0b20gXCJ3aXRuZXNzXCI7IHdpdG5lc3MgfD4gV2l0bmVzcy5zZXhwX29mX3QgdG9fc2V4cCBdXG4gICAgICAgIF1cbiAgOztcblxuICBsZXQgdG9fc2V4cCB0ID0gdC50b19zZXhwXG4gIGxldCBuYW1lIHQgPSB0Lm5hbWVcbiAgbGV0IGNyZWF0ZSB+bmFtZSB0b19zZXhwID0geyB3aXRuZXNzID0gV2l0bmVzcy5jcmVhdGUgKCk7IG5hbWU7IHRvX3NleHAgfVxuICBsZXQgdWlkIHQgPSBXaXRuZXNzLnVpZCB0LndpdG5lc3NcbiAgbGV0IGhhc2ggdCA9IHVpZCB0XG4gIGxldCBoYXNoX2ZvbGRfdCBzIHQgPSBoYXNoX2ZvbGRfaW50IHMgKHVpZCB0KVxuICBsZXQgc2FtZV93aXRuZXNzIHQxIHQyID0gV2l0bmVzcy5zYW1lIHQxLndpdG5lc3MgdDIud2l0bmVzc1xuICBsZXQgc2FtZSB0MSB0MiA9IE9wdGlvbi5pc19zb21lIChzYW1lX3dpdG5lc3MgdDEgdDIpXG5cbiAgbGV0IHNhbWVfd2l0bmVzc19leG4gdDEgdDIgPVxuICAgIG1hdGNoIHNhbWVfd2l0bmVzcyB0MSB0MiB3aXRoXG4gICAgfCBTb21lIHcgLT4gd1xuICAgIHwgTm9uZSAtPlxuICAgICAgRXJyb3IucmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiVHlwZV9lcXVhbC5JZC5zYW1lX3dpdG5lc3NfZXhuIGdvdCBkaWZmZXJlbnQgaWRzXCJcbiAgICAgICAgICAgWyAoIFwiXCJcbiAgICAgICAgICAgICAsIHNleHBfb2ZfcGFpciAoc2V4cF9vZl90IHNleHBfb2Zfb3BhcXVlKSAoc2V4cF9vZl90IHNleHBfb2Zfb3BhcXVlKSAodDEsIHQyKVxuICAgICAgICAgICAgIClcbiAgICAgICAgICAgXSlcbiAgOztcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbigqKiBbJ2EgQ2hlYXBfb3B0aW9uLnRdIGlzIGxpa2UgWydhIG9wdGlvbl0sIGJ1dCBpdCBkb2Vzbid0IGJveCBbc29tZSBfXSB2YWx1ZXMuXG5cbiAgICBUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdGhhdCBhcmUgdW5zYWZlIGFib3V0IGl0OlxuXG4gICAgLSBbZmxvYXQgdCBhcnJheV0gKG9yIGFueSBhcnJheS1iYWNrZWQgY29udGFpbmVyKSBpcyBub3QgbWVtb3J5LXNhZmVcbiAgICAgIGJlY2F1c2UgZmxvYXQgYXJyYXkgb3B0aW1pemF0aW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHVuYm94ZWQgb3B0aW9uXG4gICAgICBvcHRpbWl6YXRpb24uIFlvdSBoYXZlIHRvIHVzZSBbVW5pZm9ybV9hcnJheS50XSBpbnN0ZWFkIG9mIFthcnJheV0uXG5cbiAgICAtIE5lc3RlZCBvcHRpb25zIChbJ2EgdCB0XSkgZG9uJ3Qgd29yay4gVGhleSBhcmUgYmVsaWV2ZWQgdG8gYmVcbiAgICAgIG1lbW9yeS1zYWZlLCBidXQgbm90IHBhcmFtZXRyaWMuXG5cbiAgICAtIEEgcmVjb3JkIHdpdGggW2Zsb2F0IHRdcyBpbiBpdCBzaG91bGQgYmUgc2FmZSwgYnV0IGl0J3Mgb25seSBbdF0gYmVpbmdcbiAgICAgIGFic3RyYWN0IHRoYXQgZ2l2ZXMgeW91IHNhZmV0eS4gSWYgdGhlIGNvbXBpbGVyIHdhcyBzbWFydCBlbm91Z2ggdG8gcGVla1xuICAgICAgdGhyb3VnaCB0aGUgbW9kdWxlIHNpZ25hdHVyZSB0aGVuIGl0IGNvdWxkIGRlY2lkZSB0byBjb25zdHJ1Y3QgYSBmbG9hdFxuICAgICAgYXJyYXkgaW5zdGVhZC4gKilcbm1vZHVsZSBDaGVhcF9vcHRpb24gPSBzdHJ1Y3RcbiAgKCogVGhpcyBpcyB0YWtlbiBmcm9tIGNvcmUuIFJhdGhlciB0aGFuIGV4cG9zZSBpdCBpbiB0aGUgcHVibGljIGludGVyZmFjZSBvZiBiYXNlLCBqdXN0XG4gICAgIGtlZXAgYSBjb3B5IGFyb3VuZCBoZXJlLiAqKVxuICBsZXQgcGh5c19zYW1lICh0eXBlIGEgYikgKGEgOiBhKSAoYiA6IGIpID0gcGh5c19lcXVhbCBhIChDYW1sLk9iai5tYWdpYyBiIDogYSlcblxuICBtb2R1bGUgVDAgOiBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBub25lIDogXyB0XG4gICAgdmFsIHNvbWUgOiAnYSAtPiAnYSB0XG4gICAgdmFsIGlzX25vbmUgOiBfIHQgLT4gYm9vbFxuICAgIHZhbCBpc19zb21lIDogXyB0IC0+IGJvb2xcbiAgICB2YWwgdmFsdWVfZXhuIDogJ2EgdCAtPiAnYVxuICAgIHZhbCB2YWx1ZV91bnNhZmUgOiAnYSB0IC0+ICdhXG4gICAgdmFsIGl0ZXJfc29tZSA6ICdhIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICBlbmQgPSBzdHJ1Y3RcbiAgICB0eXBlICsnYSB0XG5cbiAgICAoKiBCZWluZyBhIHBvaW50ZXIsIG5vIG9uZSBvdXRzaWRlIHRoaXMgbW9kdWxlIGNhbiBjb25zdHJ1Y3QgYSB2YWx1ZSB0aGF0IGlzXG4gICAgICAgW3BoeXNfc2FtZV0gYXMgdGhpcyBvbmUuXG5cbiAgICAgICBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIHVzZSB0aGlzIHZhbHVlIGFzIFtub25lXSwgYnV0IHdlIHVzZSBhbiBpbW1lZGlhdGUgaW5zdGVhZFxuICAgICAgIGJlY2F1c2UgaXQgbGV0cyB1cyBhdm9pZCBjYW1sX21vZGlmeSB3aGVuIHNldHRpbmcgdG8gW25vbmVdLCBtYWtpbmcgY2VydGFpblxuICAgICAgIGJlbmNobWFya3Mgc2lnbmlmaWNhbnRseSBmYXN0ZXIgKGUuZy4gLi4vYmVuY2gvYXJyYXlfcXVldWUuZXhlKS5cblxuICAgICAgIHRoaXMgY29kZSBpcyBkdXBsaWNhdGVkIGluIE1vcHRpb24sIGFuZCBpZiB3ZSBmaW5kIHlldCBhbm90aGVyIHBsYWNlIHdoZXJlIHdlIHdhbnRcbiAgICAgICBpdCB3ZSBzaG91bGQgcmVjb25zaWRlciBtYWtpbmcgaXQgc2hhcmVkLiAqKVxuICAgIGxldCBub25lX3N1YnN0aXR1dGUgOiBfIHQgPSBDYW1sLk9iai5vYmogKENhbWwuT2JqLm5ld19ibG9jayBDYW1sLk9iai5hYnN0cmFjdF90YWcgMSlcblxuICAgIGxldCBub25lIDogXyB0ID1cbiAgICAgICgqIFRoZSBudW1iZXIgd2FzIHByb2R1Y2VkIGJ5XG4gICAgICAgICBbPCAvZGV2L3VyYW5kb20gdHIgLWMgLWQgJzEyMzQ1Njc4OTBhYmNkZWYnIHwgaGVhZCAtYyAxNl0uXG5cbiAgICAgICAgIFRoZSBpZGVhIGlzIHRoYXQgYSByYW5kb20gbnVtYmVyIHdpbGwgaGF2ZSBsb3dlciBwcm9iYWJpbGl0eSB0byBjb2xsaWRlIHdpdGhcbiAgICAgICAgIGFueXRoaW5nIHRoYW4gYW55IG51bWJlciB3ZSBjYW4gY2hvb3NlIG91cnNlbHZlcy5cblxuICAgICAgICAgV2UgYXJlIHVzaW5nIGEgcG9seW1vcnBoaWMgdmFyaWFudCBpbnN0ZWFkIG9mIGFuIGludGVnZXIgY29uc3RhbnQgYmVjYXVzZSB0aGVyZVxuICAgICAgICAgaXMgYSBjb21waWxlciBidWcgd2hlcmUgaXQgd3JvbmdseSBhc3N1bWVzIHRoYXQgdGhlIHJlc3VsdCBvZiBbaWYgXyB0aGVuIGMgZWxzZVxuICAgICAgICAgeV0gaXMgbm90IGEgcG9pbnRlciBpZiBbY10gaXMgYW4gaW50ZWdlciBjb21waWxlLXRpbWUgY29uc3RhbnQuICBUaGlzIGlzIGJlaW5nXG4gICAgICAgICBmaXhlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC81NTUuICBUaGUgXCJtZW1vcnkgY29ycnVwdGlvblwiIHRlc3RcbiAgICAgICAgIGJlbG93IGRlbW9uc3RyYXRlcyB0aGUgaXNzdWUuICAqKVxuICAgICAgQ2FtbC5PYmoubWFnaWMgYHg2ZThlZTM0NzhlMWQ3NDQ5XG4gICAgOztcblxuICAgIGxldCBpc19ub25lIHggPSBwaHlzX2VxdWFsIHggbm9uZVxuICAgIGxldCBpc19zb21lIHggPSBub3QgKHBoeXNfZXF1YWwgeCBub25lKVxuXG4gICAgbGV0IHNvbWUgKHR5cGUgYSkgKHggOiBhKSA6IGEgdCA9XG4gICAgICBpZiBwaHlzX3NhbWUgeCBub25lIHRoZW4gbm9uZV9zdWJzdGl0dXRlIGVsc2UgQ2FtbC5PYmoubWFnaWMgeFxuICAgIDs7XG5cbiAgICBsZXQgdmFsdWVfdW5zYWZlICh0eXBlIGEpICh4IDogYSB0KSA6IGEgPVxuICAgICAgaWYgcGh5c19lcXVhbCB4IG5vbmVfc3Vic3RpdHV0ZSB0aGVuIENhbWwuT2JqLm1hZ2ljIG5vbmUgZWxzZSBDYW1sLk9iai5tYWdpYyB4XG4gICAgOztcblxuICAgIGxldCB2YWx1ZV9leG4geCA9XG4gICAgICBpZiBpc19zb21lIHhcbiAgICAgIHRoZW4gdmFsdWVfdW5zYWZlIHhcbiAgICAgIGVsc2UgZmFpbHdpdGggXCJPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuOiB0aGUgZWxlbWVudCBpcyBbTm9uZV1cIlxuICAgIDs7XG5cbiAgICBsZXQgaXRlcl9zb21lIHQgfmYgPSBpZiBpc19zb21lIHQgdGhlbiBmICh2YWx1ZV91bnNhZmUgdClcbiAgZW5kXG5cbiAgbW9kdWxlIFQxID0gc3RydWN0XG4gICAgaW5jbHVkZSBUMFxuXG4gICAgbGV0IG9mX29wdGlvbiA9IGZ1bmN0aW9uXG4gICAgICB8IE5vbmUgLT4gbm9uZVxuICAgICAgfCBTb21lIHggLT4gc29tZSB4XG4gICAgOztcblxuICAgIGxldFtAaW5saW5lXSB0b19vcHRpb24geCA9IGlmIGlzX3NvbWUgeCB0aGVuIFNvbWUgKHZhbHVlX3Vuc2FmZSB4KSBlbHNlIE5vbmVcbiAgICBsZXQgdG9fc2V4cGFibGUgPSB0b19vcHRpb25cbiAgICBsZXQgb2Zfc2V4cGFibGUgPSBvZl9vcHRpb25cblxuICAgIGxldCB0X3NleHBfZ3JhbW1hciAodHlwZSBhKSAoZ3JhbW1hciA6IGEgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgICA6IGEgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgPVxuICAgICAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoT3B0aW9uLnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG4gICAgOztcbiAgZW5kXG5cbiAgaW5jbHVkZSBUMVxuICBpbmNsdWRlIFNleHBhYmxlLk9mX3NleHBhYmxlMSAoT3B0aW9uKSAoVDEpXG5lbmRcblxudHlwZSAnYSB0ID0gJ2EgQ2hlYXBfb3B0aW9uLnQgVW5pZm9ybV9hcnJheS50IFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPVxuICBmdW4gX29mX2FfXzAwMV8geF9fMDAzXyAtPlxuICBVbmlmb3JtX2FycmF5LnRfb2Zfc2V4cCAoQ2hlYXBfb3B0aW9uLnRfb2Zfc2V4cCBfb2ZfYV9fMDAxXykgeF9fMDAzX1xuOztcblxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gIGZ1biBfb2ZfYV9fMDA0XyB4X18wMDVfIC0+XG4gIFVuaWZvcm1fYXJyYXkuc2V4cF9vZl90IChDaGVhcF9vcHRpb24uc2V4cF9vZl90IF9vZl9hX18wMDRfKSB4X18wMDVfXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPlxuICBVbmlmb3JtX2FycmF5LnRfc2V4cF9ncmFtbWFyIChDaGVhcF9vcHRpb24udF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hcilcbjs7XG5cbltAQEBlbmRdXG5cbmxldCBlbXB0eSA9IFVuaWZvcm1fYXJyYXkuZW1wdHlcbmxldCBjcmVhdGUgfmxlbiA9IFVuaWZvcm1fYXJyYXkuY3JlYXRlIH5sZW4gQ2hlYXBfb3B0aW9uLm5vbmVcbmxldCBpbml0IG4gfmYgPSBVbmlmb3JtX2FycmF5LmluaXQgbiB+ZjooZnVuIGkgLT4gQ2hlYXBfb3B0aW9uLm9mX29wdGlvbiAoZiBpKSlcbmxldCBpbml0X3NvbWUgbiB+ZiA9IFVuaWZvcm1fYXJyYXkuaW5pdCBuIH5mOihmdW4gaSAtPiBDaGVhcF9vcHRpb24uc29tZSAoZiBpKSlcbmxldCBsZW5ndGggPSBVbmlmb3JtX2FycmF5Lmxlbmd0aFxubGV0W0BpbmxpbmVdIGdldCB0IGkgPSBDaGVhcF9vcHRpb24udG9fb3B0aW9uIChVbmlmb3JtX2FycmF5LmdldCB0IGkpXG5sZXQgZ2V0X3NvbWVfZXhuIHQgaSA9IENoZWFwX29wdGlvbi52YWx1ZV9leG4gKFVuaWZvcm1fYXJyYXkuZ2V0IHQgaSlcbmxldCBpc19ub25lIHQgaSA9IENoZWFwX29wdGlvbi5pc19ub25lIChVbmlmb3JtX2FycmF5LmdldCB0IGkpXG5sZXQgaXNfc29tZSB0IGkgPSBDaGVhcF9vcHRpb24uaXNfc29tZSAoVW5pZm9ybV9hcnJheS5nZXQgdCBpKVxubGV0IHNldCB0IGkgeCA9IFVuaWZvcm1fYXJyYXkuc2V0IHQgaSAoQ2hlYXBfb3B0aW9uLm9mX29wdGlvbiB4KVxubGV0IHNldF9zb21lIHQgaSB4ID0gVW5pZm9ybV9hcnJheS5zZXQgdCBpIChDaGVhcF9vcHRpb24uc29tZSB4KVxubGV0IHNldF9ub25lIHQgaSA9IFVuaWZvcm1fYXJyYXkuc2V0IHQgaSBDaGVhcF9vcHRpb24ubm9uZVxubGV0IHN3YXAgdCBpIGogPSBVbmlmb3JtX2FycmF5LnN3YXAgdCBpIGpcbmxldCB1bnNhZmVfZ2V0IHQgaSA9IENoZWFwX29wdGlvbi50b19vcHRpb24gKFVuaWZvcm1fYXJyYXkudW5zYWZlX2dldCB0IGkpXG5sZXQgdW5zYWZlX2dldF9zb21lX2V4biB0IGkgPSBDaGVhcF9vcHRpb24udmFsdWVfZXhuIChVbmlmb3JtX2FycmF5LnVuc2FmZV9nZXQgdCBpKVxuXG5sZXQgdW5zYWZlX2dldF9zb21lX2Fzc3VtaW5nX3NvbWUgdCBpID1cbiAgQ2hlYXBfb3B0aW9uLnZhbHVlX3Vuc2FmZSAoVW5pZm9ybV9hcnJheS51bnNhZmVfZ2V0IHQgaSlcbjs7XG5cbmxldCB1bnNhZmVfaXNfc29tZSB0IGkgPSBDaGVhcF9vcHRpb24uaXNfc29tZSAoVW5pZm9ybV9hcnJheS51bnNhZmVfZ2V0IHQgaSlcbmxldCB1bnNhZmVfc2V0IHQgaSB4ID0gVW5pZm9ybV9hcnJheS51bnNhZmVfc2V0IHQgaSAoQ2hlYXBfb3B0aW9uLm9mX29wdGlvbiB4KVxubGV0IHVuc2FmZV9zZXRfc29tZSB0IGkgeCA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX3NldCB0IGkgKENoZWFwX29wdGlvbi5zb21lIHgpXG5sZXQgdW5zYWZlX3NldF9ub25lIHQgaSA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX3NldCB0IGkgQ2hlYXBfb3B0aW9uLm5vbmVcblxubGV0IGNsZWFyIHQgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHQgLSAxIGRvXG4gICAgdW5zYWZlX3NldF9ub25lIHQgaVxuICBkb25lXG47O1xuXG5sZXQgaXRlcmkgaW5wdXQgfmYgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGlucHV0IC0gMSBkb1xuICAgIGYgaSAodW5zYWZlX2dldCBpbnB1dCBpKVxuICBkb25lXG47O1xuXG5sZXQgaXRlciBpbnB1dCB+ZiA9IGl0ZXJpIGlucHV0IH5mOihmdW4gKF8gOiBpbnQpIHggLT4gZiB4KVxuXG5sZXQgZm9sZGkgaW5wdXQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgaXRlcmkgaW5wdXQgfmY6KGZ1biBpIGVsZW0gLT4gYWNjIDo9IGYgaSAhYWNjIGVsZW0pO1xuICAhYWNjXG47O1xuXG5sZXQgZm9sZCBpbnB1dCB+aW5pdCB+ZiA9IGZvbGRpIGlucHV0IH5pbml0IH5mOihmdW4gKF8gOiBpbnQpIGFjYyB4IC0+IGYgYWNjIHgpXG5cbmluY2x1ZGUgSW5kZXhlZF9jb250YWluZXIuTWFrZV9nZW4gKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG4gICAgdHlwZSAnYSBlbHQgPSAnYSBvcHRpb25cblxuICAgIGxldCBmb2xkID0gZm9sZFxuICAgIGxldCBmb2xkaSA9IGBDdXN0b20gZm9sZGlcbiAgICBsZXQgaXRlciA9IGBDdXN0b20gaXRlclxuICAgIGxldCBpdGVyaSA9IGBDdXN0b20gaXRlcmlcbiAgICBsZXQgbGVuZ3RoID0gYEN1c3RvbSBsZW5ndGhcbiAgZW5kKVxuXG5sZXQgbWFwaSBpbnB1dCB+ZiA9XG4gIGxldCBvdXRwdXQgPSBjcmVhdGUgfmxlbjoobGVuZ3RoIGlucHV0KSBpblxuICBpdGVyaSBpbnB1dCB+ZjooZnVuIGkgZWxlbSAtPiB1bnNhZmVfc2V0IG91dHB1dCBpIChmIGkgZWxlbSkpO1xuICBvdXRwdXRcbjs7XG5cbmxldCBtYXAgaW5wdXQgfmYgPSBtYXBpIGlucHV0IH5mOihmdW4gKF8gOiBpbnQpIGVsZW0gLT4gZiBlbGVtKVxuXG5sZXQgbWFwX3NvbWUgaW5wdXQgfmYgPVxuICBsZXQgbGVuID0gbGVuZ3RoIGlucHV0IGluXG4gIGxldCBvdXRwdXQgPSBjcmVhdGUgfmxlbiBpblxuICBsZXQgKCkgPVxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICBsZXQgb3B0ID0gVW5pZm9ybV9hcnJheS51bnNhZmVfZ2V0IGlucHV0IGkgaW5cbiAgICAgIENoZWFwX29wdGlvbi5pdGVyX3NvbWUgb3B0IH5mOihmdW4geCAtPiB1bnNhZmVfc2V0X3NvbWUgb3V0cHV0IGkgKGYgeCkpXG4gICAgZG9uZVxuICBpblxuICBvdXRwdXRcbjs7XG5cbmxldCBvZl9hcnJheSBhcnJheSA9IGluaXQgKEFycmF5Lmxlbmd0aCBhcnJheSkgfmY6KGZ1biBpIC0+IEFycmF5LnVuc2FmZV9nZXQgYXJyYXkgaSlcblxubGV0IG9mX2FycmF5X3NvbWUgYXJyYXkgPVxuICBpbml0X3NvbWUgKEFycmF5Lmxlbmd0aCBhcnJheSkgfmY6KGZ1biBpIC0+IEFycmF5LnVuc2FmZV9nZXQgYXJyYXkgaSlcbjs7XG5cbmxldCB0b19hcnJheSB0ID0gQXJyYXkuaW5pdCAobGVuZ3RoIHQpIH5mOihmdW4gaSAtPiB1bnNhZmVfZ2V0IHQgaSlcblxuaW5jbHVkZSBCbGl0Lk1ha2UxX2dlbmVyaWMgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgbGV0IGNyZWF0ZV9saWtlIH5sZW4gXyA9IGNyZWF0ZSB+bGVuXG4gICAgbGV0IHVuc2FmZV9ibGl0ID0gVW5pZm9ybV9hcnJheS51bnNhZmVfYmxpdFxuICBlbmQpXG5cbmxldCBjb3B5ID0gVW5pZm9ybV9hcnJheS5jb3B5XG5cbm1vZHVsZSBGb3JfdGVzdGluZyA9IHN0cnVjdFxuICBtb2R1bGUgVW5zYWZlX2NoZWFwX29wdGlvbiA9IENoZWFwX29wdGlvblxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgU3RhY2tfaW50ZlxuXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuKCogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzaW1pbGFyIHRvIFtEZXF1ZV0gaW4gdGhhdCBpdCB1c2VzIGFuIGFycmF5IG9mIFsnYV0gYW5kXG4gICBhIG11dGFibGUgW2ludF0gdG8gaW5kaWNhdGUgd2hhdCBpbiB0aGUgYXJyYXkgaXMgdXNlZC4gIFdlIGNob29zZSB0byBpbXBsZW1lbnQgW1N0YWNrXVxuICAgZGlyZWN0bHkgcmF0aGVyIHRoYW4gb24gdG9wIG9mIFtEZXF1ZV0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuICBFLmcuIGEgc2ltcGxlXG4gICBtaWNyb2JlbmNobWFyayBzaG93cyB0aGF0IHB1c2gvcG9wIGlzIGFib3V0IDIwJSBmYXN0ZXIuICopXG50eXBlICdhIHQgPVxuICB7IG11dGFibGUgbGVuZ3RoIDogaW50XG4gIDsgbXV0YWJsZSBlbHRzIDogJ2EgT3B0aW9uX2FycmF5LnRcbiAgfVxuW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICBmdW4gX29mX2FfXzAwMV8geyBsZW5ndGggPSBsZW5ndGhfXzAwM187IGVsdHMgPSBlbHRzX18wMDVfIH0gLT5cbiAgbGV0IGJuZHNfXzAwMl8gPSBbXSBpblxuICBsZXQgYm5kc19fMDAyXyA9XG4gICAgbGV0IGFyZ19fMDA2XyA9IE9wdGlvbl9hcnJheS5zZXhwX29mX3QgX29mX2FfXzAwMV8gZWx0c19fMDA1XyBpblxuICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImVsdHNcIjsgYXJnX18wMDZfIF0gOjogYm5kc19fMDAyX1xuICBpblxuICBsZXQgYm5kc19fMDAyXyA9XG4gICAgbGV0IGFyZ19fMDA0XyA9IHNleHBfb2ZfaW50IGxlbmd0aF9fMDAzXyBpblxuICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImxlbmd0aFwiOyBhcmdfXzAwNF8gXSA6OiBibmRzX18wMDJfXG4gIGluXG4gIFNleHBsaWIwLlNleHAuTGlzdCBibmRzX18wMDJfXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgc2V4cF9vZl90X2ludGVybmFsID0gc2V4cF9vZl90XG5sZXQgc2V4cF9vZl90ID0gYFJlYm91bmRfbGF0ZXJcbmxldCBfID0gc2V4cF9vZl90XG5sZXQgY2FwYWNpdHkgdCA9IE9wdGlvbl9hcnJheS5sZW5ndGggdC5lbHRzXG5cbmxldCBpbnZhcmlhbnQgaW52YXJpYW50X2EgKHsgbGVuZ3RoOyBlbHRzIH0gYXMgdCkgOiB1bml0ID1cbiAgdHJ5XG4gICAgYXNzZXJ0ICgwIDw9IGxlbmd0aCAmJiBsZW5ndGggPD0gT3B0aW9uX2FycmF5Lmxlbmd0aCBlbHRzKTtcbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIC0gMSBkb1xuICAgICAgaW52YXJpYW50X2EgKE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gZWx0cyBpKVxuICAgIGRvbmU7XG4gICAgKCogV2UgbWFpbnRhaW4gdGhlIGludmFyaWFudCB0aGF0IHVudXNlZCBlbGVtZW50cyBhcmUgdW5zZXQgdG8gYXZvaWQgYSBzcGFjZVxuICAgICAgIGxlYWsuICopXG4gICAgZm9yIGkgPSBsZW5ndGggdG8gT3B0aW9uX2FycmF5Lmxlbmd0aCBlbHRzIC0gMSBkb1xuICAgICAgYXNzZXJ0IChub3QgKE9wdGlvbl9hcnJheS5pc19zb21lIGVsdHMgaSkpXG4gICAgZG9uZVxuICB3aXRoXG4gIHwgZXhuIC0+XG4gICAgcmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJTdGFjay5pbnZhcmlhbnQgZmFpbGVkXCJcbiAgICAgICAgIFsgXCJleG5cIiwgZXhuIHw+IEV4bi5zZXhwX29mX3Q7IFwic3RhY2tcIiwgdCB8PiBzZXhwX29mX3RfaW50ZXJuYWwgc2V4cF9vZl9vcGFxdWUgXSlcbjs7XG5cbmxldCBjcmVhdGUgKHR5cGUgYSkgKCkgOiBhIHQgPSB7IGxlbmd0aCA9IDA7IGVsdHMgPSBPcHRpb25fYXJyYXkuZW1wdHkgfVxubGV0IGxlbmd0aCB0ID0gdC5sZW5ndGhcbmxldCBpc19lbXB0eSB0ID0gbGVuZ3RoIHQgPSAwXG5cbigqIFRoZSBvcmRlciBpbiB3aGljaCBlbGVtZW50cyBhcmUgdmlzaXRlZCBoYXMgYmVlbiBjaG9zZW4gc28gYXMgdG8gYmUgYmFja3dhcmRzXG4gICBjb21wYXRpYmxlIHdpdGggW0NhbWwuU3RhY2tdICopXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgbGV0IHIgPSByZWYgaW5pdCBpblxuICBmb3IgaSA9IHQubGVuZ3RoIC0gMSBkb3dudG8gMCBkb1xuICAgIHIgOj0gZiAhciAoT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biB0LmVsdHMgaSlcbiAgZG9uZTtcbiAgIXJcbjs7XG5cbmxldCBpdGVyIHQgfmYgPVxuICBmb3IgaSA9IHQubGVuZ3RoIC0gMSBkb3dudG8gMCBkb1xuICAgIGYgKE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gdC5lbHRzIGkpXG4gIGRvbmVcbjs7XG5cbm1vZHVsZSBDID0gQ29udGFpbmVyLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgZm9sZCA9IGZvbGRcbiAgICBsZXQgaXRlciA9IGBDdXN0b20gaXRlclxuICAgIGxldCBsZW5ndGggPSBgQ3VzdG9tIGxlbmd0aFxuICBlbmQpXG5cbmxldCBtZW0gPSBDLm1lbVxubGV0IGV4aXN0cyA9IEMuZXhpc3RzXG5sZXQgZm9yX2FsbCA9IEMuZm9yX2FsbFxubGV0IGNvdW50ID0gQy5jb3VudFxubGV0IHN1bSA9IEMuc3VtXG5sZXQgZmluZCA9IEMuZmluZFxubGV0IGZpbmRfbWFwID0gQy5maW5kX21hcFxubGV0IHRvX2xpc3QgPSBDLnRvX2xpc3RcbmxldCB0b19hcnJheSA9IEMudG9fYXJyYXlcbmxldCBtaW5fZWx0ID0gQy5taW5fZWx0XG5sZXQgbWF4X2VsdCA9IEMubWF4X2VsdFxubGV0IGZvbGRfcmVzdWx0ID0gQy5mb2xkX3Jlc3VsdFxubGV0IGZvbGRfdW50aWwgPSBDLmZvbGRfdW50aWxcblxubGV0IG9mX2xpc3QgKHR5cGUgYSkgKGwgOiBhIGxpc3QpID1cbiAgaWYgTGlzdC5pc19lbXB0eSBsXG4gIHRoZW4gY3JlYXRlICgpXG4gIGVsc2UgKFxuICAgIGxldCBsZW5ndGggPSBMaXN0Lmxlbmd0aCBsIGluXG4gICAgbGV0IGVsdHMgPSBPcHRpb25fYXJyYXkuY3JlYXRlIH5sZW46KDIgKiBsZW5ndGgpIGluXG4gICAgbGV0IHIgPSByZWYgbCBpblxuICAgIGZvciBpID0gbGVuZ3RoIC0gMSBkb3dudG8gMCBkb1xuICAgICAgbWF0Y2ggIXIgd2l0aFxuICAgICAgfCBbXSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgYSA6OiBsIC0+XG4gICAgICAgIE9wdGlvbl9hcnJheS5zZXRfc29tZSBlbHRzIGkgYTtcbiAgICAgICAgciA6PSBsXG4gICAgZG9uZTtcbiAgICB7IGxlbmd0aDsgZWx0cyB9KVxuOztcblxubGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9IExpc3Quc2V4cF9vZl90IHNleHBfb2ZfYSAodG9fbGlzdCB0KVxubGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCA9IG9mX2xpc3QgKExpc3QudF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwKVxuXG5sZXQgdF9zZXhwX2dyYW1tYXIgKHR5cGUgYSkgKGdyYW1tYXIgOiBhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IGEgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKExpc3QudF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbjs7XG5cbmxldCByZXNpemUgdCBzaXplID1cbiAgbGV0IGFyciA9IE9wdGlvbl9hcnJheS5jcmVhdGUgfmxlbjpzaXplIGluXG4gIE9wdGlvbl9hcnJheS5ibGl0IH5zcmM6dC5lbHRzIH5kc3Q6YXJyIH5zcmNfcG9zOjAgfmRzdF9wb3M6MCB+bGVuOnQubGVuZ3RoO1xuICB0LmVsdHMgPC0gYXJyXG47O1xuXG5sZXQgc2V0X2NhcGFjaXR5IHQgbmV3X2NhcGFjaXR5ID1cbiAgbGV0IG5ld19jYXBhY2l0eSA9IG1heCBuZXdfY2FwYWNpdHkgKGxlbmd0aCB0KSBpblxuICBpZiBuZXdfY2FwYWNpdHkgPD4gY2FwYWNpdHkgdCB0aGVuIHJlc2l6ZSB0IG5ld19jYXBhY2l0eVxuOztcblxubGV0IHB1c2ggdCBhID1cbiAgaWYgdC5sZW5ndGggPSBPcHRpb25fYXJyYXkubGVuZ3RoIHQuZWx0cyB0aGVuIHJlc2l6ZSB0ICgyICogKHQubGVuZ3RoICsgMSkpO1xuICBPcHRpb25fYXJyYXkuc2V0X3NvbWUgdC5lbHRzIHQubGVuZ3RoIGE7XG4gIHQubGVuZ3RoIDwtIHQubGVuZ3RoICsgMVxuOztcblxubGV0IHBvcF9ub25lbXB0eSB0ID1cbiAgbGV0IGkgPSB0Lmxlbmd0aCAtIDEgaW5cbiAgbGV0IHJlc3VsdCA9IE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gdC5lbHRzIGkgaW5cbiAgT3B0aW9uX2FycmF5LnNldF9ub25lIHQuZWx0cyBpO1xuICB0Lmxlbmd0aCA8LSBpO1xuICByZXN1bHRcbjs7XG5cbmxldCBwb3BfZXJyb3IgPSBFcnJvci5vZl9zdHJpbmcgXCJTdGFjay5wb3Agb2YgZW1wdHkgc3RhY2tcIlxubGV0IHBvcCB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChwb3Bfbm9uZW1wdHkgdClcbmxldCBwb3BfZXhuIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gRXJyb3IucmFpc2UgcG9wX2Vycm9yIGVsc2UgcG9wX25vbmVtcHR5IHRcbmxldCB0b3Bfbm9uZW1wdHkgdCA9IE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gdC5lbHRzICh0Lmxlbmd0aCAtIDEpXG5sZXQgdG9wX2Vycm9yID0gRXJyb3Iub2Zfc3RyaW5nIFwiU3RhY2sudG9wIG9mIGVtcHR5IHN0YWNrXCJcbmxldCB0b3AgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAodG9wX25vbmVtcHR5IHQpXG5sZXQgdG9wX2V4biB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIEVycm9yLnJhaXNlIHRvcF9lcnJvciBlbHNlIHRvcF9ub25lbXB0eSB0XG5sZXQgY29weSB7IGxlbmd0aDsgZWx0cyB9ID0geyBsZW5ndGg7IGVsdHMgPSBPcHRpb25fYXJyYXkuY29weSBlbHRzIH1cblxubGV0IGNsZWFyIHQgPVxuICBpZiB0Lmxlbmd0aCA+IDBcbiAgdGhlbiAoXG4gICAgZm9yIGkgPSAwIHRvIHQubGVuZ3RoIC0gMSBkb1xuICAgICAgT3B0aW9uX2FycmF5LnNldF9ub25lIHQuZWx0cyBpXG4gICAgZG9uZTtcbiAgICB0Lmxlbmd0aCA8LSAwKVxuOztcblxubGV0IHVudGlsX2VtcHR5IHQgZiA9XG4gIGxldCByZWMgbG9vcCAoKSA9XG4gICAgaWYgdC5sZW5ndGggPiAwXG4gICAgdGhlbiAoXG4gICAgICBmIChwb3Bfbm9uZW1wdHkgdCk7XG4gICAgICBsb29wICgpKVxuICBpblxuICBsb29wICgpXG47O1xuXG5sZXQgc2luZ2xldG9uIHggPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBwdXNoIHQgeDtcbiAgdFxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiBUaGlzIGlzIGxpZnRlZCBvdXQgb2YgW01dIGJlY2F1c2UgW1NvdXJjZV9jb2RlX3Bvc2l0aW9uMF0gZXhwb3J0cyBbU3RyaW5nMF1cbiAgIGFzIFtTdHJpbmddLCB3aGljaCBkb2VzIG5vdCBleHBvcnQgYSBoYXNoIGZ1bmN0aW9uLiAqKVxubGV0IGhhc2hfb3ZlcnJpZGUgeyBDYW1sLkxleGluZy5wb3NfZm5hbWU7IHBvc19sbnVtOyBwb3NfYm9sOyBwb3NfY251bSB9ID1cbiAgU3RyaW5nLmhhc2ggcG9zX2ZuYW1lXG4gIGx4b3IgSW50Lmhhc2ggcG9zX2xudW1cbiAgbHhvciBJbnQuaGFzaCBwb3NfYm9sXG4gIGx4b3IgSW50Lmhhc2ggcG9zX2NudW1cbjs7XG5cbm1vZHVsZSBNID0gc3RydWN0XG4gIGluY2x1ZGUgU291cmNlX2NvZGVfcG9zaXRpb24wXG5cbiAgbGV0IGhhc2ggPSBoYXNoX292ZXJyaWRlXG5lbmRcblxuaW5jbHVkZSBNXG5pbmNsdWRlIENvbXBhcmFibGUuTWFrZV91c2luZ19jb21wYXJhdG9yIChNKVxuXG5sZXQgb2ZfcG9zIChwb3NfZm5hbWUsIHBvc19sbnVtLCBwb3NfY251bSwgXykgPVxuICB7IHBvc19mbmFtZTsgcG9zX2xudW07IHBvc19jbnVtOyBwb3NfYm9sID0gMCB9XG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBOZWdcbiAgICB8IFplcm9cbiAgICB8IFBvc1xuICAgIHwgTmFuXG4gIFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXIsIGNvbXBhcmUsIGhhc2gsIGVudW1lcmF0ZV1cblxuICBsZXQgdF9vZl9zZXhwID1cbiAgICAobGV0IGVycm9yX3NvdXJjZV9fMDAzXyA9IFwic2lnbl9vcl9uYW4ubWwuVC50XCIgaW5cbiAgICAgZnVuY3Rpb25cbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibmVnXCIgfCBcIk5lZ1wiKSAtPiBOZWdcbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIC0+IFplcm9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwicG9zXCIgfCBcIlBvc1wiKSAtPiBQb3NcbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibmFuXCIgfCBcIk5hblwiKSAtPiBOYW5cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJuZWdcIiB8IFwiTmVnXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwicG9zXCIgfCBcIlBvc1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5hblwiIHwgXCJOYW5cIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwMl8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDAyXyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICAgIHwgc2V4cF9fMDAyXyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgICAgICA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgPVxuICAgIChmdW5jdGlvblxuICAgICAgfCBOZWcgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTmVnXCJcbiAgICAgIHwgWmVybyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJaZXJvXCJcbiAgICAgIHwgUG9zIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlBvc1wiXG4gICAgICB8IE5hbiAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJOYW5cIlxuICAgICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIHsgdW50eXBlZCA9XG4gICAgICAgIFZhcmlhbnRcbiAgICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgWyBOb190YWcgeyBuYW1lID0gXCJOZWdcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiWmVyb1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJQb3NcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiTmFuXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgIH1cbiAgOztcblxuICBsZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIChmdW4gaHN2IGFyZyAtPlxuICAgICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgICAgfCBOZWcgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwXG4gICAgICAgfCBaZXJvIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMVxuICAgICAgIHwgUG9zIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMlxuICAgICAgIHwgTmFuIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgM1xuICAgICAgICAgICAgICAgIDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICA7O1xuXG4gIGxldCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyBhcmcgPVxuICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgICAgaGFzaF9mb2xkX3QgaHN2IGFyZylcbiAgICBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBhbGwgPSAoWyBOZWc7IFplcm87IFBvczsgTmFuIF0gOiB0IGxpc3QpXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgb2Zfc3RyaW5nIHMgPSB0X29mX3NleHAgKHNleHBfb2Zfc3RyaW5nIHMpXG4gIGxldCB0b19zdHJpbmcgdCA9IHN0cmluZ19vZl9zZXhwIChzZXhwX29mX3QgdClcbiAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLlNpZ25fb3JfbmFuXCJcbmVuZFxuXG5tb2R1bGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogVC50KSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBULnQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBULnQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogVC50KSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBULnQpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogVC50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IFQudCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIElkZW50aWZpYWJsZS5NYWtlIChUKVxuXG4oKiBPcGVuIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IG9mX3NpZ24gPSBmdW5jdGlvblxuICB8IFNpZ24uTmVnIC0+IE5lZ1xuICB8IFNpZ24uWmVybyAtPiBaZXJvXG4gIHwgU2lnbi5Qb3MgLT4gUG9zXG47O1xuXG5sZXQgdG9fc2lnbl9leG4gPSBmdW5jdGlvblxuICB8IE5lZyAtPiBTaWduLk5lZ1xuICB8IFplcm8gLT4gU2lnbi5aZXJvXG4gIHwgUG9zIC0+IFNpZ24uUG9zXG4gIHwgTmFuIC0+IGludmFsaWRfYXJnIFwiQmFzZS5TaWduX29yX25hbi50b19zaWduX2V4bjogTmFuXCJcbjs7XG5cbmxldCBvZl9pbnQgbiA9IG9mX3NpZ24gKFNpZ24ub2ZfaW50IG4pXG5sZXQgdG9faW50X2V4biB0ID0gU2lnbi50b19pbnQgKHRvX3NpZ25fZXhuIHQpXG5cbmxldCBmbGlwID0gZnVuY3Rpb25cbiAgfCBOZWcgLT4gUG9zXG4gIHwgWmVybyAtPiBaZXJvXG4gIHwgUG9zIC0+IE5lZ1xuICB8IE5hbiAtPiBOYW5cbjs7XG5cbmxldCAoICogKSB0IHQnID1cbiAgbWF0Y2ggdCwgdCcgd2l0aFxuICB8IE5hbiwgXyB8IF8sIE5hbiAtPiBOYW5cbiAgfCBfIC0+IG9mX3NpZ24gKFNpZ24uKCAqICkgKHRvX3NpZ25fZXhuIHQpICh0b19zaWduX2V4biB0JykpXG47O1xuXG4oKiBJbmNsdWRlIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyIGFueSBmdW5jdG9yIGFwcGxpY2F0aW9ucyB0aGF0XG4gICBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgJ2EgdCA9XG4gIHwgSW5jbCBvZiAnYVxuICB8IEV4Y2wgb2YgJ2FcbiAgfCBVbmJvdW5kZWRcbltAQGRlcml2aW5nX2lubGluZSBlbnVtZXJhdGUsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxubGV0IGFsbCA6ICdhLiAnYSBsaXN0IC0+ICdhIHQgbGlzdCA9XG4gIGZ1biBfYWxsX29mX2EgLT5cbiAgUHB4X2VudW1lcmF0ZV9saWIuTGlzdC5hcHBlbmRcbiAgICAobGV0IHJlYyBtYXAgbCBhY2MgPVxuICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgIHwgW10gLT4gUHB4X2VudW1lcmF0ZV9saWIuTGlzdC5yZXYgYWNjXG4gICAgICAgfCBlbnVtZXJhdGVfXzAwMV8gOjogbCAtPiBtYXAgbCAoSW5jbCBlbnVtZXJhdGVfXzAwMV8gOjogYWNjKVxuICAgICBpblxuICAgICBtYXAgX2FsbF9vZl9hIFtdKVxuICAgIChQcHhfZW51bWVyYXRlX2xpYi5MaXN0LmFwcGVuZFxuICAgICAgIChsZXQgcmVjIG1hcCBsIGFjYyA9XG4gICAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgICAgfCBbXSAtPiBQcHhfZW51bWVyYXRlX2xpYi5MaXN0LnJldiBhY2NcbiAgICAgICAgICB8IGVudW1lcmF0ZV9fMDAyXyA6OiBsIC0+IG1hcCBsIChFeGNsIGVudW1lcmF0ZV9fMDAyXyA6OiBhY2MpXG4gICAgICAgIGluXG4gICAgICAgIG1hcCBfYWxsX29mX2EgW10pXG4gICAgICAgWyBVbmJvdW5kZWQgXSlcbjs7XG5cbmxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPVxuICBmdW4gKHR5cGUgYV9fMDE4XykgOiAoKFNleHBsaWIwLlNleHAudCAtPiBhX18wMThfKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gYV9fMDE4XyB0KSAtPlxuICBsZXQgZXJyb3Jfc291cmNlX18wMDZfID0gXCJtYXliZV9ib3VuZC5tbC50XCIgaW5cbiAgZnVuIF9vZl9hX18wMDNfIC0+IGZ1bmN0aW9uXG4gICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwiaW5jbFwiIHwgXCJJbmNsXCIpIGFzIF90YWdfXzAwOV8pIDo6IHNleHBfYXJnc19fMDEwXykgYXNcbiAgICAgIF9zZXhwX18wMDhfIC0+XG4gICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMTBfIHdpdGhcbiAgICAgICB8IFsgYXJnMF9fMDExXyBdIC0+XG4gICAgICAgICBsZXQgcmVzMF9fMDEyXyA9IF9vZl9hX18wMDNfIGFyZzBfXzAxMV8gaW5cbiAgICAgICAgIEluY2wgcmVzMF9fMDEyX1xuICAgICAgIHwgXyAtPlxuICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAwNl9cbiAgICAgICAgICAgX3RhZ19fMDA5X1xuICAgICAgICAgICBfc2V4cF9fMDA4XylcbiAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJleGNsXCIgfCBcIkV4Y2xcIikgYXMgX3RhZ19fMDE0XykgOjogc2V4cF9hcmdzX18wMTVfKSBhc1xuICAgICAgX3NleHBfXzAxM18gLT5cbiAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAxNV8gd2l0aFxuICAgICAgIHwgWyBhcmcwX18wMTZfIF0gLT5cbiAgICAgICAgIGxldCByZXMwX18wMTdfID0gX29mX2FfXzAwM18gYXJnMF9fMDE2XyBpblxuICAgICAgICAgRXhjbCByZXMwX18wMTdfXG4gICAgICAgfCBfIC0+XG4gICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDA2X1xuICAgICAgICAgICBfdGFnX18wMTRfXG4gICAgICAgICAgIF9zZXhwX18wMTNfKVxuICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInVuYm91bmRlZFwiIHwgXCJVbmJvdW5kZWRcIikgLT4gVW5ib3VuZGVkXG4gICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiaW5jbFwiIHwgXCJJbmNsXCIpIGFzIHNleHBfXzAwN18gLT5cbiAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJleGNsXCIgfCBcIkV4Y2xcIikgYXMgc2V4cF9fMDA3XyAtPlxuICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwidW5ib3VuZGVkXCIgfCBcIlVuYm91bmRlZFwiKSA6OiBfKSBhc1xuICAgICAgc2V4cF9fMDA3XyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwNV8gLT5cbiAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwNV8gLT5cbiAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG4gICAgfCBzZXhwX18wMDVfIC0+XG4gICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG47O1xuXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgZnVuICh0eXBlIGFfXzAyNF8pIDogKChhX18wMjRfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gYV9fMDI0XyB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgZnVuIF9vZl9hX18wMTlfIC0+IGZ1bmN0aW9uXG4gICAgfCBJbmNsIGFyZzBfXzAyMF8gLT5cbiAgICAgIGxldCByZXMwX18wMjFfID0gX29mX2FfXzAxOV8gYXJnMF9fMDIwXyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiSW5jbFwiOyByZXMwX18wMjFfIF1cbiAgICB8IEV4Y2wgYXJnMF9fMDIyXyAtPlxuICAgICAgbGV0IHJlczBfXzAyM18gPSBfb2ZfYV9fMDE5XyBhcmcwX18wMjJfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJFeGNsXCI7IHJlczBfXzAyM18gXVxuICAgIHwgVW5ib3VuZGVkIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlVuYm91bmRlZFwiXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPlxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiSW5jbFwiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiRXhjbFwiXG4gICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlIHsgYXJncyA9IENvbnMgKF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlVuYm91bmRlZFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5bQEBAZW5kXVxuXG50eXBlIGludGVydmFsX2NvbXBhcmlzb24gPVxuICB8IEJlbG93X2xvd2VyX2JvdW5kXG4gIHwgSW5fcmFuZ2VcbiAgfCBBYm92ZV91cHBlcl9ib3VuZFxuW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hciwgY29tcGFyZSwgaGFzaF1cblxubGV0IGludGVydmFsX2NvbXBhcmlzb25fb2Zfc2V4cCA9XG4gIChsZXQgZXJyb3Jfc291cmNlX18wMjdfID0gXCJtYXliZV9ib3VuZC5tbC5pbnRlcnZhbF9jb21wYXJpc29uXCIgaW5cbiAgIGZ1bmN0aW9uXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJiZWxvd19sb3dlcl9ib3VuZFwiIHwgXCJCZWxvd19sb3dlcl9ib3VuZFwiKSAtPiBCZWxvd19sb3dlcl9ib3VuZFxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiaW5fcmFuZ2VcIiB8IFwiSW5fcmFuZ2VcIikgLT4gSW5fcmFuZ2VcbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImFib3ZlX3VwcGVyX2JvdW5kXCIgfCBcIkFib3ZlX3VwcGVyX2JvdW5kXCIpIC0+IEFib3ZlX3VwcGVyX2JvdW5kXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKFwiYmVsb3dfbG93ZXJfYm91bmRcIiB8IFwiQmVsb3dfbG93ZXJfYm91bmRcIikgOjogXykgYXMgc2V4cF9fMDI4X1xuICAgICAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjhfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImluX3JhbmdlXCIgfCBcIkluX3JhbmdlXCIpIDo6IF8pIGFzIHNleHBfXzAyOF9cbiAgICAgLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI4X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImFib3ZlX3VwcGVyX2JvdW5kXCIgfCBcIkFib3ZlX3VwcGVyX2JvdW5kXCIpIDo6IF8pIGFzIHNleHBfXzAyOF9cbiAgICAgLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI4X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAyNl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjZfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMjZfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDI3XyBzZXhwX18wMjZfXG4gICB8IHNleHBfXzAyNl8gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI2X1xuICAgICAgICAgICAgICAgICAgIDogU2V4cGxpYjAuU2V4cC50IC0+IGludGVydmFsX2NvbXBhcmlzb24pXG47O1xuXG5sZXQgc2V4cF9vZl9pbnRlcnZhbF9jb21wYXJpc29uID1cbiAgKGZ1bmN0aW9uXG4gICAgfCBCZWxvd19sb3dlcl9ib3VuZCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJCZWxvd19sb3dlcl9ib3VuZFwiXG4gICAgfCBJbl9yYW5nZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJJbl9yYW5nZVwiXG4gICAgfCBBYm92ZV91cHBlcl9ib3VuZCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJBYm92ZV91cHBlcl9ib3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludGVydmFsX2NvbXBhcmlzb24gLT4gU2V4cGxpYjAuU2V4cC50KVxuOztcblxubGV0IChpbnRlcnZhbF9jb21wYXJpc29uX3NleHBfZ3JhbW1hciA6IGludGVydmFsX2NvbXBhcmlzb24gU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWcgeyBuYW1lID0gXCJCZWxvd19sb3dlcl9ib3VuZFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiSW5fcmFuZ2VcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIkFib3ZlX3VwcGVyX2JvdW5kXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbmxldCBjb21wYXJlX2ludGVydmFsX2NvbXBhcmlzb24gPVxuICAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmVcbiAgIDogaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IGludClcbjs7XG5cbmxldCAoaGFzaF9mb2xkX2ludGVydmFsX2NvbXBhcmlzb24gOlxuICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgPVxuICAoZnVuIGhzdiBhcmcgLT5cbiAgICAgbWF0Y2ggYXJnIHdpdGhcbiAgICAgfCBCZWxvd19sb3dlcl9ib3VuZCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDBcbiAgICAgfCBJbl9yYW5nZSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDFcbiAgICAgfCBBYm92ZV91cHBlcl9ib3VuZCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbjs7XG5cbmxldCAoaGFzaF9pbnRlcnZhbF9jb21wYXJpc29uIDogaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICBsZXQgZnVuYyBhcmcgPVxuICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgKGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guY3JlYXRlICgpIGluXG4gICAgICAgaGFzaF9mb2xkX2ludGVydmFsX2NvbXBhcmlzb24gaHN2IGFyZylcbiAgaW5cbiAgZnVuIHggLT4gZnVuYyB4XG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgbWFwIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBJbmNsIGluY2wgLT4gSW5jbCAoZiBpbmNsKVxuICB8IEV4Y2wgZXhjbCAtPiBFeGNsIChmIGV4Y2wpXG4gIHwgVW5ib3VuZGVkIC0+IFVuYm91bmRlZFxuOztcblxubGV0IGlzX2xvd2VyX2JvdW5kIHQgfm9mXzphIH5jb21wYXJlID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgSW5jbCBpbmNsIC0+IGNvbXBhcmUgaW5jbCBhIDw9IDBcbiAgfCBFeGNsIGV4Y2wgLT4gY29tcGFyZSBleGNsIGEgPCAwXG4gIHwgVW5ib3VuZGVkIC0+IHRydWVcbjs7XG5cbmxldCBpc191cHBlcl9ib3VuZCB0IH5vZl86YSB+Y29tcGFyZSA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEluY2wgaW5jbCAtPiBjb21wYXJlIGEgaW5jbCA8PSAwXG4gIHwgRXhjbCBleGNsIC0+IGNvbXBhcmUgYSBleGNsIDwgMFxuICB8IFVuYm91bmRlZCAtPiB0cnVlXG47O1xuXG5sZXQgYm91bmRzX2Nyb3NzZWQgfmxvd2VyIH51cHBlciB+Y29tcGFyZSA9XG4gIG1hdGNoIGxvd2VyIHdpdGhcbiAgfCBVbmJvdW5kZWQgLT4gZmFsc2VcbiAgfCBJbmNsIGxvd2VyIHwgRXhjbCBsb3dlciAtPlxuICAgIChtYXRjaCB1cHBlciB3aXRoXG4gICAgIHwgVW5ib3VuZGVkIC0+IGZhbHNlXG4gICAgIHwgSW5jbCB1cHBlciB8IEV4Y2wgdXBwZXIgLT4gY29tcGFyZSBsb3dlciB1cHBlciA+IDApXG47O1xuXG5sZXQgY2hlY2tfaW50ZXJ2YWxfZXhuIH5sb3dlciB+dXBwZXIgfmNvbXBhcmUgPVxuICBpZiBib3VuZHNfY3Jvc3NlZCB+bG93ZXIgfnVwcGVyIH5jb21wYXJlXG4gIHRoZW4gZmFpbHdpdGggXCJNYXliZV9ib3VuZC5jb21wYXJlX3RvX2ludGVydmFsX2V4bjogbG93ZXIgYm91bmQgPiB1cHBlciBib3VuZFwiXG47O1xuXG5sZXQgY29tcGFyZV90b19pbnRlcnZhbF9leG4gfmxvd2VyIH51cHBlciBhIH5jb21wYXJlID1cbiAgY2hlY2tfaW50ZXJ2YWxfZXhuIH5sb3dlciB+dXBwZXIgfmNvbXBhcmU7XG4gIGlmIG5vdCAoaXNfbG93ZXJfYm91bmQgbG93ZXIgfm9mXzphIH5jb21wYXJlKVxuICB0aGVuIEJlbG93X2xvd2VyX2JvdW5kXG4gIGVsc2UgaWYgbm90IChpc191cHBlcl9ib3VuZCB1cHBlciB+b2ZfOmEgfmNvbXBhcmUpXG4gIHRoZW4gQWJvdmVfdXBwZXJfYm91bmRcbiAgZWxzZSBJbl9yYW5nZVxuOztcblxubGV0IGludGVydmFsX2NvbnRhaW5zX2V4biB+bG93ZXIgfnVwcGVyIGEgfmNvbXBhcmUgPVxuICBtYXRjaCBjb21wYXJlX3RvX2ludGVydmFsX2V4biB+bG93ZXIgfnVwcGVyIGEgfmNvbXBhcmUgd2l0aFxuICB8IEluX3JhbmdlIC0+IHRydWVcbiAgfCBCZWxvd19sb3dlcl9ib3VuZCB8IEFib3ZlX3VwcGVyX2JvdW5kIC0+IGZhbHNlXG47O1xuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBUXG5cbm1vZHVsZSBPcl9kdXBsaWNhdGUgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID1cbiAgICBbIGBPayBvZiAnYVxuICAgIHwgYER1cGxpY2F0ZVxuICAgIF1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPVxuICAgIGZ1biBfY21wX19hIGFfXzAwMV8gYl9fMDAyXyAtPlxuICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwMV8gYl9fMDAyX1xuICAgIHRoZW4gMFxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggYV9fMDAxXywgYl9fMDAyXyB3aXRoXG4gICAgICB8IGBPayBfbGVmdF9fMDAzXywgYE9rIF9yaWdodF9fMDA0XyAtPiBfY21wX19hIF9sZWZ0X18wMDNfIF9yaWdodF9fMDA0X1xuICAgICAgfCBgRHVwbGljYXRlLCBgRHVwbGljYXRlIC0+IDBcbiAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSB4IHkpXG4gIDs7XG5cbiAgbGV0IGVxdWFsIDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgLT4gYm9vbCA9XG4gICAgZnVuIF9jbXBfX2EgYV9fMDA1XyBiX18wMDZfIC0+XG4gICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDVfIGJfXzAwNl9cbiAgICAgIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIGFfXzAwNV8sIGJfXzAwNl8gd2l0aFxuICAgICAgICB8IGBPayBfbGVmdF9fMDA3XywgYE9rIF9yaWdodF9fMDA4XyAtPiBfY21wX19hIF9sZWZ0X18wMDdfIF9yaWdodF9fMDA4X1xuICAgICAgICB8IGBEdXBsaWNhdGUsIGBEdXBsaWNhdGUgLT4gdHJ1ZVxuICAgICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2VxdWFsIHggeSlcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBmdW4gX29mX2FfXzAwOV8gLT4gZnVuY3Rpb25cbiAgICAgIHwgYE9rIHZfXzAxMF8gLT4gU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiT2tcIjsgX29mX2FfXzAwOV8gdl9fMDEwXyBdXG4gICAgICB8IGBEdXBsaWNhdGUgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiRHVwbGljYXRlXCJcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSBXaXRob3V0X2NvbXBhcmF0b3IgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2tleSwgJ2NtcCwgJ3opIHQgPSAnelxuZW5kXG5cbm1vZHVsZSBXaXRoX2NvbXBhcmF0b3IgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2tleSwgJ2NtcCwgJ3opIHQgPSBjb21wYXJhdG9yOigna2V5LCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ3pcbmVuZFxuXG5tb2R1bGUgV2l0aF9maXJzdF9jbGFzc19tb2R1bGUgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2tleSwgJ2NtcCwgJ3opIHQgPSAoJ2tleSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnelxuZW5kXG5cbm1vZHVsZSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50ID0gc3RydWN0XG4gIHR5cGUgKCdrLCAndikgdCA9ICdrICogWyBgTGVmdCBvZiAndiB8IGBSaWdodCBvZiAndiB8IGBVbmVxdWFsIG9mICd2ICogJ3YgXVxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA6XG4gICAgJ2sgJ3YuICgnayAtPiAnayAtPiBpbnQpIC0+ICgndiAtPiAndiAtPiBpbnQpIC0+ICgnaywgJ3YpIHQgLT4gKCdrLCAndikgdCAtPiBpbnRcbiAgICA9XG4gICAgZnVuIF9jbXBfX2sgX2NtcF9fdiBhX18wMTFfIGJfXzAxMl8gLT5cbiAgICBsZXQgdF9fMDEzXywgdF9fMDE0XyA9IGFfXzAxMV8gaW5cbiAgICBsZXQgdF9fMDE1XywgdF9fMDE2XyA9IGJfXzAxMl8gaW5cbiAgICBtYXRjaCBfY21wX19rIHRfXzAxM18gdF9fMDE1XyB3aXRoXG4gICAgfCAwIC0+XG4gICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCB0X18wMTRfIHRfXzAxNl9cbiAgICAgIHRoZW4gMFxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHRfXzAxNF8sIHRfXzAxNl8gd2l0aFxuICAgICAgICB8IGBMZWZ0IF9sZWZ0X18wMTdfLCBgTGVmdCBfcmlnaHRfXzAxOF8gLT4gX2NtcF9fdiBfbGVmdF9fMDE3XyBfcmlnaHRfXzAxOF9cbiAgICAgICAgfCBgUmlnaHQgX2xlZnRfXzAxOV8sIGBSaWdodCBfcmlnaHRfXzAyMF8gLT4gX2NtcF9fdiBfbGVmdF9fMDE5XyBfcmlnaHRfXzAyMF9cbiAgICAgICAgfCBgVW5lcXVhbCBfbGVmdF9fMDIxXywgYFVuZXF1YWwgX3JpZ2h0X18wMjJfIC0+XG4gICAgICAgICAgbGV0IHRfXzAyM18sIHRfXzAyNF8gPSBfbGVmdF9fMDIxXyBpblxuICAgICAgICAgIGxldCB0X18wMjVfLCB0X18wMjZfID0gX3JpZ2h0X18wMjJfIGluXG4gICAgICAgICAgKG1hdGNoIF9jbXBfX3YgdF9fMDIzXyB0X18wMjVfIHdpdGhcbiAgICAgICAgICAgfCAwIC0+IF9jbXBfX3YgdF9fMDI0XyB0X18wMjZfXG4gICAgICAgICAgIHwgbiAtPiBuKVxuICAgICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgeCB5KVxuICAgIHwgbiAtPiBuXG4gIDs7XG5cbiAgbGV0IGVxdWFsIDpcbiAgICAnayAndi5cbiAgICAoJ2sgLT4gJ2sgLT4gYm9vbCkgLT4gKCd2IC0+ICd2IC0+IGJvb2wpIC0+ICgnaywgJ3YpIHQgLT4gKCdrLCAndikgdCAtPiBib29sXG4gICAgPVxuICAgIGZ1biBfY21wX19rIF9jbXBfX3YgYV9fMDI3XyBiX18wMjhfIC0+XG4gICAgICBsZXQgdF9fMDI5XywgdF9fMDMwXyA9IGFfXzAyN18gaW5cbiAgICAgIGxldCB0X18wMzFfLCB0X18wMzJfID0gYl9fMDI4XyBpblxuICAgICAgUHB4X2NvbXBhcmVfbGliLiggJiYgKVxuICAgICAgICAoX2NtcF9fayB0X18wMjlfIHRfXzAzMV8pXG4gICAgICAgIChpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCB0X18wMzBfIHRfXzAzMl9cbiAgICAgICAgIHRoZW4gdHJ1ZVxuICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgIG1hdGNoIHRfXzAzMF8sIHRfXzAzMl8gd2l0aFxuICAgICAgICAgICB8IGBMZWZ0IF9sZWZ0X18wMzNfLCBgTGVmdCBfcmlnaHRfXzAzNF8gLT4gX2NtcF9fdiBfbGVmdF9fMDMzXyBfcmlnaHRfXzAzNF9cbiAgICAgICAgICAgfCBgUmlnaHQgX2xlZnRfXzAzNV8sIGBSaWdodCBfcmlnaHRfXzAzNl8gLT4gX2NtcF9fdiBfbGVmdF9fMDM1XyBfcmlnaHRfXzAzNl9cbiAgICAgICAgICAgfCBgVW5lcXVhbCBfbGVmdF9fMDM3XywgYFVuZXF1YWwgX3JpZ2h0X18wMzhfIC0+XG4gICAgICAgICAgICAgbGV0IHRfXzAzOV8sIHRfXzA0MF8gPSBfbGVmdF9fMDM3XyBpblxuICAgICAgICAgICAgIGxldCB0X18wNDFfLCB0X18wNDJfID0gX3JpZ2h0X18wMzhfIGluXG4gICAgICAgICAgICAgUHB4X2NvbXBhcmVfbGliLiggJiYgKSAoX2NtcF9fdiB0X18wMzlfIHRfXzA0MV8pIChfY21wX192IHRfXzA0MF8gdF9fMDQyXylcbiAgICAgICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19lcXVhbCB4IHkpKVxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgOlxuICAgICdrICd2LlxuICAgIChTZXhwbGliMC5TZXhwLnQgLT4gJ2spXG4gICAgLT4gKFNleHBsaWIwLlNleHAudCAtPiAndilcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgPVxuICAgIGxldCBlcnJvcl9zb3VyY2VfXzA1N18gPSBcIm1hcF9pbnRmLm1sLlN5bW1ldHJpY19kaWZmX2VsZW1lbnQudFwiIGluXG4gICAgZnVuIF9vZl9rX18wNDNfIF9vZl92X18wNDRfIC0+IGZ1bmN0aW9uXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbIGFyZzBfXzA2N187IGFyZzFfXzA2OF8gXSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDY5XyA9IF9vZl9rX18wNDNfIGFyZzBfXzA2N19cbiAgICAgICAgYW5kIHJlczFfXzA3MF8gPVxuICAgICAgICAgIGxldCBzZXhwX18wNjZfID0gYXJnMV9fMDY4XyBpblxuICAgICAgICAgIHRyeVxuICAgICAgICAgICAgbWF0Y2ggc2V4cF9fMDY2XyB3aXRoXG4gICAgICAgICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSBhdG9tX18wNDdfIGFzIF9zZXhwX18wNDlfIC0+XG4gICAgICAgICAgICAgIChtYXRjaCBhdG9tX18wNDdfIHdpdGhcbiAgICAgICAgICAgICAgIHwgXCJMZWZ0XCIgLT5cbiAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzA1N18gX3NleHBfXzA0OV9cbiAgICAgICAgICAgICAgIHwgXCJSaWdodFwiIC0+XG4gICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wNTdfIF9zZXhwX18wNDlfXG4gICAgICAgICAgICAgICB8IFwiVW5lcXVhbFwiIC0+XG4gICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wNTdfIF9zZXhwX18wNDlfXG4gICAgICAgICAgICAgICB8IF8gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5vX3ZhcmlhbnRfbWF0Y2ggKCkpXG4gICAgICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIGF0b21fXzA0N18gOjogc2V4cF9hcmdzX18wNTBfKSBhc1xuICAgICAgICAgICAgICBfc2V4cF9fMDQ5XyAtPlxuICAgICAgICAgICAgICAobWF0Y2ggYXRvbV9fMDQ3XyB3aXRoXG4gICAgICAgICAgICAgICB8IFwiTGVmdFwiIGFzIF90YWdfXzA2M18gLT5cbiAgICAgICAgICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDUwXyB3aXRoXG4gICAgICAgICAgICAgICAgICB8IFsgYXJnMF9fMDY0XyBdIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXMwX18wNjVfID0gX29mX3ZfXzA0NF8gYXJnMF9fMDY0XyBpblxuICAgICAgICAgICAgICAgICAgICBgTGVmdCByZXMwX18wNjVfXG4gICAgICAgICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgICAgICAgIF90YWdfXzA2M19cbiAgICAgICAgICAgICAgICAgICAgICBfc2V4cF9fMDQ5XylcbiAgICAgICAgICAgICAgIHwgXCJSaWdodFwiIGFzIF90YWdfXzA2MF8gLT5cbiAgICAgICAgICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDUwXyB3aXRoXG4gICAgICAgICAgICAgICAgICB8IFsgYXJnMF9fMDYxXyBdIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXMwX18wNjJfID0gX29mX3ZfXzA0NF8gYXJnMF9fMDYxXyBpblxuICAgICAgICAgICAgICAgICAgICBgUmlnaHQgcmVzMF9fMDYyX1xuICAgICAgICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICAgICAgICBfdGFnX18wNjBfXG4gICAgICAgICAgICAgICAgICAgICAgX3NleHBfXzA0OV8pXG4gICAgICAgICAgICAgICB8IFwiVW5lcXVhbFwiIGFzIF90YWdfXzA1MV8gLT5cbiAgICAgICAgICAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDUwXyB3aXRoXG4gICAgICAgICAgICAgICAgICB8IFsgYXJnMF9fMDU4XyBdIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXMwX18wNTlfID1cbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBhcmcwX18wNThfIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbIGFyZzBfXzA1Ml87IGFyZzFfXzA1M18gXSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlczBfXzA1NF8gPSBfb2Zfdl9fMDQ0XyBhcmcwX18wNTJfXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzMV9fMDU1XyA9IF9vZl92X18wNDRfIGFyZzFfXzA1M18gaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlczBfXzA1NF8sIHJlczFfXzA1NV9cbiAgICAgICAgICAgICAgICAgICAgICB8IHNleHBfXzA1Nl8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci50dXBsZV9vZl9zaXplX25fZXhwZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V4cF9fMDU2X1xuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBgVW5lcXVhbCByZXMwX18wNTlfXG4gICAgICAgICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnB0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgICAgICAgIF90YWdfXzA1MV9cbiAgICAgICAgICAgICAgICAgICAgICBfc2V4cF9fMDQ5XylcbiAgICAgICAgICAgICAgIHwgXyAtPiBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iubm9fdmFyaWFudF9tYXRjaCAoKSlcbiAgICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wNDhfIC0+XG4gICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3BvbHlfdmFyXG4gICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgc2V4cF9fMDQ4X1xuICAgICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDQ4XyAtPlxuICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3BvbHlfdmFyXG4gICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgc2V4cF9fMDQ4X1xuICAgICAgICAgIHdpdGhcbiAgICAgICAgICB8IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5Ob192YXJpYW50X21hdGNoIC0+XG4gICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iubm9fbWF0Y2hpbmdfdmFyaWFudF9mb3VuZFxuICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgc2V4cF9fMDY2X1xuICAgICAgICBpblxuICAgICAgICByZXMwX18wNjlfLCByZXMxX18wNzBfXG4gICAgICB8IHNleHBfXzA3MV8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnR1cGxlX29mX3NpemVfbl9leHBlY3RlZCBlcnJvcl9zb3VyY2VfXzA1N18gMiBzZXhwX18wNzFfXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6XG4gICAgJ2sgJ3YuXG4gICAgKCdrIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ3YgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICA9XG4gICAgZnVuIF9vZl9rX18wNzJfIF9vZl92X18wNzNfIChhcmcwX18wODFfLCBhcmcxX18wODJfKSAtPlxuICAgICAgbGV0IHJlczBfXzA4M18gPSBfb2Zfa19fMDcyXyBhcmcwX18wODFfXG4gICAgICBhbmQgcmVzMV9fMDg0XyA9XG4gICAgICAgIG1hdGNoIGFyZzFfXzA4Ml8gd2l0aFxuICAgICAgICB8IGBMZWZ0IHZfXzA3NF8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJMZWZ0XCI7IF9vZl92X18wNzNfIHZfXzA3NF8gXVxuICAgICAgICB8IGBSaWdodCB2X18wNzVfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiUmlnaHRcIjsgX29mX3ZfXzA3M18gdl9fMDc1XyBdXG4gICAgICAgIHwgYFVuZXF1YWwgdl9fMDc2XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJVbmVxdWFsXCJcbiAgICAgICAgICAgIDsgKGxldCBhcmcwX18wNzdfLCBhcmcxX18wNzhfID0gdl9fMDc2XyBpblxuICAgICAgICAgICAgICAgbGV0IHJlczBfXzA3OV8gPSBfb2Zfdl9fMDczXyBhcmcwX18wNzdfXG4gICAgICAgICAgICAgICBhbmQgcmVzMV9fMDgwXyA9IF9vZl92X18wNzNfIGFyZzFfXzA3OF8gaW5cbiAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIHJlczBfXzA3OV87IHJlczFfXzA4MF8gXSlcbiAgICAgICAgICAgIF1cbiAgICAgIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyByZXMwX18wODNfOyByZXMxX18wODRfIF1cbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAgICdrIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gJ3YgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgICAtPiAoJ2ssICd2KSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgID1cbiAgICBmdW4gXydrX3NleHBfZ3JhbW1hciBfJ3Zfc2V4cF9ncmFtbWFyIC0+XG4gICAgICB7IHVudHlwZWQgPVxuICAgICAgICAgIExpc3RcbiAgICAgICAgICAgIChDb25zXG4gICAgICAgICAgICAgICAoIF8na19zZXhwX2dyYW1tYXIudW50eXBlZFxuICAgICAgICAgICAgICAgLCBDb25zXG4gICAgICAgICAgICAgICAgICAgKCBWYXJpYW50XG4gICAgICAgICAgICAgICAgICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbIE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiTGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhcmdzID0gQ29ucyAoXyd2X3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJSaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhcmdzID0gQ29ucyAoXyd2X3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJVbmVxdWFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFyZ3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBMaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggXyd2X3NleHBfZ3JhbW1hci51bnR5cGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgQ29ucyAoXyd2X3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIEVtcHR5IClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgLCBFbXB0eSApICkpXG4gICAgICB9XG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgTWVyZ2VfZWxlbWVudCA9IHN0cnVjdFxuICB0eXBlICgnbGVmdCwgJ3JpZ2h0KSB0ID1cbiAgICBbIGBMZWZ0IG9mICdsZWZ0XG4gICAgfCBgUmlnaHQgb2YgJ3JpZ2h0XG4gICAgfCBgQm90aCBvZiAnbGVmdCAqICdyaWdodFxuICAgIF1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlIDpcbiAgICAnbGVmdCAncmlnaHQuXG4gICAgKCdsZWZ0IC0+ICdsZWZ0IC0+IGludClcbiAgICAtPiAoJ3JpZ2h0IC0+ICdyaWdodCAtPiBpbnQpXG4gICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgIC0+IGludFxuICAgID1cbiAgICBmdW4gX2NtcF9fbGVmdCBfY21wX19yaWdodCBhX18wODVfIGJfXzA4Nl8gLT5cbiAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wODVfIGJfXzA4Nl9cbiAgICB0aGVuIDBcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGFfXzA4NV8sIGJfXzA4Nl8gd2l0aFxuICAgICAgfCBgTGVmdCBfbGVmdF9fMDg3XywgYExlZnQgX3JpZ2h0X18wODhfIC0+IF9jbXBfX2xlZnQgX2xlZnRfXzA4N18gX3JpZ2h0X18wODhfXG4gICAgICB8IGBSaWdodCBfbGVmdF9fMDg5XywgYFJpZ2h0IF9yaWdodF9fMDkwXyAtPiBfY21wX19yaWdodCBfbGVmdF9fMDg5XyBfcmlnaHRfXzA5MF9cbiAgICAgIHwgYEJvdGggX2xlZnRfXzA5MV8sIGBCb3RoIF9yaWdodF9fMDkyXyAtPlxuICAgICAgICBsZXQgdF9fMDkzXywgdF9fMDk0XyA9IF9sZWZ0X18wOTFfIGluXG4gICAgICAgIGxldCB0X18wOTVfLCB0X18wOTZfID0gX3JpZ2h0X18wOTJfIGluXG4gICAgICAgIChtYXRjaCBfY21wX19sZWZ0IHRfXzA5M18gdF9fMDk1XyB3aXRoXG4gICAgICAgICB8IDAgLT4gX2NtcF9fcmlnaHQgdF9fMDk0XyB0X18wOTZfXG4gICAgICAgICB8IG4gLT4gbilcbiAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSB4IHkpXG4gIDs7XG5cbiAgbGV0IGVxdWFsIDpcbiAgICAnbGVmdCAncmlnaHQuXG4gICAgKCdsZWZ0IC0+ICdsZWZ0IC0+IGJvb2wpXG4gICAgLT4gKCdyaWdodCAtPiAncmlnaHQgLT4gYm9vbClcbiAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgLT4gYm9vbFxuICAgID1cbiAgICBmdW4gX2NtcF9fbGVmdCBfY21wX19yaWdodCBhX18wOTdfIGJfXzA5OF8gLT5cbiAgICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzA5N18gYl9fMDk4X1xuICAgICAgdGhlbiB0cnVlXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggYV9fMDk3XywgYl9fMDk4XyB3aXRoXG4gICAgICAgIHwgYExlZnQgX2xlZnRfXzA5OV8sIGBMZWZ0IF9yaWdodF9fMTAwXyAtPiBfY21wX19sZWZ0IF9sZWZ0X18wOTlfIF9yaWdodF9fMTAwX1xuICAgICAgICB8IGBSaWdodCBfbGVmdF9fMTAxXywgYFJpZ2h0IF9yaWdodF9fMTAyXyAtPiBfY21wX19yaWdodCBfbGVmdF9fMTAxXyBfcmlnaHRfXzEwMl9cbiAgICAgICAgfCBgQm90aCBfbGVmdF9fMTAzXywgYEJvdGggX3JpZ2h0X18xMDRfIC0+XG4gICAgICAgICAgbGV0IHRfXzEwNV8sIHRfXzEwNl8gPSBfbGVmdF9fMTAzXyBpblxuICAgICAgICAgIGxldCB0X18xMDdfLCB0X18xMDhfID0gX3JpZ2h0X18xMDRfIGluXG4gICAgICAgICAgUHB4X2NvbXBhcmVfbGliLiggJiYgKSAoX2NtcF9fbGVmdCB0X18xMDVfIHRfXzEwN18pIChfY21wX19yaWdodCB0X18xMDZfIHRfXzEwOF8pXG4gICAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfZXF1YWwgeCB5KVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOlxuICAgICdsZWZ0ICdyaWdodC5cbiAgICAoJ2xlZnQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgncmlnaHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgPVxuICAgIGZ1biBfb2ZfbGVmdF9fMTA5XyBfb2ZfcmlnaHRfXzExMF8gLT4gZnVuY3Rpb25cbiAgICAgIHwgYExlZnQgdl9fMTExXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJMZWZ0XCI7IF9vZl9sZWZ0X18xMDlfIHZfXzExMV8gXVxuICAgICAgfCBgUmlnaHQgdl9fMTEyXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJSaWdodFwiOyBfb2ZfcmlnaHRfXzExMF8gdl9fMTEyXyBdXG4gICAgICB8IGBCb3RoIHZfXzExM18gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJCb3RoXCJcbiAgICAgICAgICA7IChsZXQgYXJnMF9fMTE0XywgYXJnMV9fMTE1XyA9IHZfXzExM18gaW5cbiAgICAgICAgICAgICBsZXQgcmVzMF9fMTE2XyA9IF9vZl9sZWZ0X18xMDlfIGFyZzBfXzExNF9cbiAgICAgICAgICAgICBhbmQgcmVzMV9fMTE3XyA9IF9vZl9yaWdodF9fMTEwXyBhcmcxX18xMTVfIGluXG4gICAgICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgcmVzMF9fMTE2XzsgcmVzMV9fMTE3XyBdKVxuICAgICAgICAgIF1cbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbigqKiBAY2Fub25pY2FsIEJhc2UuTWFwLkNvbnRpbnVlX29yX3N0b3AgKilcbm1vZHVsZSBDb250aW51ZV9vcl9zdG9wID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBDb250aW51ZVxuICAgIHwgU3RvcFxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZW51bWVyYXRlLCBlcXVhbCwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG4gIGxldCBhbGwgPSAoWyBDb250aW51ZTsgU3RvcCBdIDogdCBsaXN0KVxuICBsZXQgZXF1YWwgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2VxdWFsIDogdCAtPiB0IC0+IGJvb2wpXG5cbiAgbGV0IHNleHBfb2ZfdCA9XG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IENvbnRpbnVlIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkNvbnRpbnVlXCJcbiAgICAgIHwgU3RvcCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJTdG9wXCJcbiAgICAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5NYXAuRmluaXNoZWRfb3JfdW5maW5pc2hlZCAqKVxubW9kdWxlIEZpbmlzaGVkX29yX3VuZmluaXNoZWQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IEZpbmlzaGVkXG4gICAgfCBVbmZpbmlzaGVkXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlbnVtZXJhdGUsIGVxdWFsLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIDogdCAtPiB0IC0+IGludClcbiAgbGV0IGFsbCA9IChbIEZpbmlzaGVkOyBVbmZpbmlzaGVkIF0gOiB0IGxpc3QpXG4gIGxldCBlcXVhbCA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfZXF1YWwgOiB0IC0+IHQgLT4gYm9vbClcblxuICBsZXQgc2V4cF9vZl90ID1cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgRmluaXNoZWQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiRmluaXNoZWRcIlxuICAgICAgfCBVbmZpbmlzaGVkIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlVuZmluaXNoZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnNfZ2VuZXJpYyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0cmVlXG4gIHR5cGUgJ2Ega2V5XG4gIHR5cGUgJ2NtcCBjbXBcbiAgdHlwZSAoJ2EsICdjbXAsICd6KSBvcHRpb25zXG5cbiAgdmFsIGludmFyaWFudHMgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gYm9vbCkgb3B0aW9uc1xuICB2YWwgaXNfZW1wdHkgOiAoXywgXywgXykgdCAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAoXywgXywgXykgdCAtPiBpbnRcblxuICB2YWwgYWRkXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9kdXBsaWNhdGUudCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYWRkX2V4blxuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayBrZXkgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIHNldFxuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayBrZXkgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGFkZF9tdWx0aVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiBrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCByZW1vdmVfbXVsdGlcbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+ICdrIGtleSAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgZmluZF9tdWx0aSA6ICgnaywgJ2NtcCwgKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+ICdrIGtleSAtPiAndiBsaXN0KSBvcHRpb25zXG5cbiAgdmFsIGNoYW5nZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4gJ2sga2V5IC0+IGY6KCd2IG9wdGlvbiAtPiAndiBvcHRpb24pIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHVwZGF0ZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4gJ2sga2V5IC0+IGY6KCd2IG9wdGlvbiAtPiAndikgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZmluZCA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gJ3Ygb3B0aW9uKSBvcHRpb25zXG4gIHZhbCBmaW5kX2V4biA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gJ3YpIG9wdGlvbnNcbiAgdmFsIHJlbW92ZSA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgbWVtIDogKCdrLCAnY21wLCAoJ2ssIF8sICdjbXApIHQgLT4gJ2sga2V5IC0+IGJvb2wpIG9wdGlvbnNcbiAgdmFsIGl0ZXJfa2V5cyA6ICgnaywgXywgXykgdCAtPiBmOignayBrZXkgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAndiwgXykgdCAtPiBmOigndiAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICB2YWwgaXRlcjJcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTooJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KVxuICAgICAgLT4gdW5pdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbWFwIDogKCdrLCAndjEsICdjbXApIHQgLT4gZjooJ3YxIC0+ICd2MikgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgdmFsIG1hcGkgOiAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YxIC0+ICd2MikgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgdmFsIGZvbGQgOiAoJ2ssICd2LCBfKSB0IC0+IGluaXQ6J2EgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKSAtPiAnYVxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2EgLT4gKCdhLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2ssICd2LCBfKSB0IC0+IGluaXQ6J2EgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKSAtPiAnYVxuXG4gIHZhbCBmb2xkMlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgICAgLT4gaW5pdDonYVxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOigndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+ICdhIC0+ICdhKVxuICAgICAgLT4gJ2EgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZpbHRlcl9rZXlzXG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gZjooJ2sga2V5IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyaVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZpbHRlcl9tYXBcbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndjEsICdjbXApIHQgLT4gZjooJ3YxIC0+ICd2MiBvcHRpb24pIC0+ICgnaywgJ3YyLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGZpbHRlcl9tYXBpXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2MSAtPiAndjIgb3B0aW9uKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgICAgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHRcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondjEgLT4gKCd2MiwgJ3YzKSBFaXRoZXIudClcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0ICogKCdrLCAndjMsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgICAgLT4gZjooJ3YxIC0+ICgndjIsICd2MykgRWl0aGVyLnQpXG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdCAqICgnaywgJ3YzLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IGJvb2wpXG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiBmOigndiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgY29tYmluZV9lcnJvcnNcbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndiBPcl9lcnJvci50LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gIHZhbCBjb21wYXJlX2RpcmVjdFxuICAgIDogKCdrLCAnY21wLCAoJ3YgLT4gJ3YgLT4gaW50KSAtPiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgLT4gaW50KSBvcHRpb25zXG5cbiAgdmFsIGVxdWFsXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCd2IC0+ICd2IC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiBib29sIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBrZXlzIDogKCdrLCBfLCBfKSB0IC0+ICdrIGtleSBsaXN0XG4gIHZhbCBkYXRhIDogKF8sICd2LCBfKSB0IC0+ICd2IGxpc3RcblxuICB2YWwgdG9fYWxpc3RcbiAgICA6ICA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gKCdrLCAndiwgXykgdFxuICAgIC0+ICgnayBrZXkgKiAndikgbGlzdFxuXG4gIHZhbCBtZXJnZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiAoJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiAndjMgb3B0aW9uKVxuICAgICAgLT4gKCdrLCAndjMsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG1lcmdlX3NrZXdlZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGNvbWJpbmU6KGtleTonayBrZXkgLT4gJ3YgLT4gJ3YgLT4gJ3YpXG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGRhdGFfZXF1YWw6KCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgICAtPiAoJ2sga2V5LCAndikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBkYXRhX2VxdWFsOigndiAtPiAndiAtPiBib29sKVxuICAgICAgLT4gaW5pdDonYVxuICAgICAgLT4gZjooJ2EgLT4gKCdrIGtleSwgJ3YpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYSlcbiAgICAgIC0+ICdhIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBtaW5fZWx0IDogKCdrLCAndiwgXykgdCAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2ssICd2LCBfKSB0IC0+ICdrIGtleSAqICd2XG4gIHZhbCBtYXhfZWx0IDogKCdrLCAndiwgXykgdCAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2ssICd2LCBfKSB0IC0+ICdrIGtleSAqICd2XG4gIHZhbCBmb3JfYWxsIDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGludFxuXG4gIHZhbCBzcGxpdFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+ICdrIGtleVxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnayBrZXkgKiAndikgb3B0aW9uICogKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYXBwZW5kXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgbG93ZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiB1cHBlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGxvd2VyX2JvdW5kOidrIGtleSBNYXliZV9ib3VuZC50XG4gICAgICAtPiB1cHBlcl9ib3VuZDonayBrZXkgTWF5YmVfYm91bmQudFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBtaW46J2sga2V5XG4gICAgICAtPiBtYXg6J2sga2V5XG4gICAgICAtPiBpbml0OidhXG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpXG4gICAgICAtPiAnYSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcmFuZ2VfdG9fYWxpc3RcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+IG1pbjonayBrZXkgLT4gbWF4OidrIGtleSAtPiAoJ2sga2V5ICogJ3YpIGxpc3QgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgICAgLT4gJ2sga2V5XG4gICAgICAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvbiApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbnRoIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBpbnQgLT4gKCdrIGtleSAqICd2KSBvcHRpb25cbiAgdmFsIG50aF9leG4gOiAoJ2ssICd2LCAnY21wKSB0IC0+IGludCAtPiAnayBrZXkgKiAndlxuICB2YWwgcmFuayA6ICgnaywgJ2NtcCwgKCdrLCBfLCAnY21wKSB0IC0+ICdrIGtleSAtPiBpbnQgb3B0aW9uKSBvcHRpb25zXG4gIHZhbCB0b190cmVlIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2sga2V5LCAndiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOidrIGtleVxuICAgICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzonayBrZXlcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+ICgnayBrZXkgKiAndikgU2VxdWVuY2UudCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGNvbXBhcmU6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAna2V5IC0+IGludClcbiAgICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgICAgLT4gJ2tleVxuICAgICAgLT4gKCdrIGtleSAqICd2KSBvcHRpb24gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gc2VnbWVudF9vZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAgIC0+ICgnayBrZXkgKiAndikgb3B0aW9uIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gY29tcGFyZTooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdib3VuZCAtPiBpbnQpXG4gICAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMSA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSAnYSB0cmVlXG4gIHR5cGUga2V5XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGludmFyaWFudHMgOiBfIHQgLT4gYm9vbFxuICB2YWwgaXNfZW1wdHkgOiBfIHQgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuICB2YWwgYWRkIDogJ2EgdCAtPiBrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2EgdCBPcl9kdXBsaWNhdGUudFxuICB2YWwgYWRkX2V4biA6ICdhIHQgLT4ga2V5OmtleSAtPiBkYXRhOidhIC0+ICdhIHRcbiAgdmFsIHNldCA6ICdhIHQgLT4ga2V5OmtleSAtPiBkYXRhOidhIC0+ICdhIHRcbiAgdmFsIGFkZF9tdWx0aSA6ICdhIGxpc3QgdCAtPiBrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2EgbGlzdCB0XG4gIHZhbCByZW1vdmVfbXVsdGkgOiAnYSBsaXN0IHQgLT4ga2V5IC0+ICdhIGxpc3QgdFxuICB2YWwgZmluZF9tdWx0aSA6ICdhIGxpc3QgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICB2YWwgY2hhbmdlIDogJ2EgdCAtPiBrZXkgLT4gZjooJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgLT4gJ2EgdFxuICB2YWwgdXBkYXRlIDogJ2EgdCAtPiBrZXkgLT4gZjooJ2Egb3B0aW9uIC0+ICdhKSAtPiAnYSB0XG4gIHZhbCBmaW5kIDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gIHZhbCBmaW5kX2V4biA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiAnYSB0XG4gIHZhbCBtZW0gOiBfIHQgLT4ga2V5IC0+IGJvb2xcbiAgdmFsIGl0ZXJfa2V5cyA6IF8gdCAtPiBmOihrZXkgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6ICdhIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgJ2EgdFxuICAgIC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgdmFsIGl0ZXIyIDogJ2EgdCAtPiAnYiB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTooJ2EsICdiKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgbWFwIDogJ2EgdCAtPiBmOignYSAtPiAnYikgLT4gJ2IgdFxuICB2YWwgbWFwaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdiKSAtPiAnYiB0XG4gIHZhbCBmb2xkIDogJ2EgdCAtPiBpbml0OidiIC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidhY2NcbiAgICAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2FjYyAtPiAoJ2FjYywgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjYyAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAnYSB0IC0+IGluaXQ6J2IgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBmb2xkMlxuICAgIDogICdhIHRcbiAgICAtPiAnYiB0XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KGtleTprZXkgLT4gZGF0YTooJ2EsICdiKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2MgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgZmlsdGVyX2tleXMgOiAnYSB0IC0+IGY6KGtleSAtPiBib29sKSAtPiAnYSB0XG4gIHZhbCBmaWx0ZXIgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIHRcbiAgdmFsIGZpbHRlcmkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiBib29sKSAtPiAnYSB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogJ2EgdCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIHRcbiAgdmFsIGZpbHRlcl9tYXBpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiB0XG4gIHZhbCBwYXJ0aXRpb25fbWFwaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICgnYiwgJ2MpIEVpdGhlci50KSAtPiAnYiB0ICogJ2MgdFxuICB2YWwgcGFydGl0aW9uX21hcCA6ICdhIHQgLT4gZjooJ2EgLT4gKCdiLCAnYykgRWl0aGVyLnQpIC0+ICdiIHQgKiAnYyB0XG4gIHZhbCBwYXJ0aXRpb25pX3RmIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gYm9vbCkgLT4gJ2EgdCAqICdhIHRcbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2EgdCAqICdhIHRcbiAgdmFsIGNvbWJpbmVfZXJyb3JzIDogJ2EgT3JfZXJyb3IudCB0IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6ICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgLT4gYm9vbFxuICB2YWwga2V5cyA6IF8gdCAtPiBrZXkgbGlzdFxuICB2YWwgZGF0YSA6ICdhIHQgLT4gJ2EgbGlzdFxuICB2YWwgdG9fYWxpc3QgOiA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdIC0+ICdhIHQgLT4gKGtleSAqICdhKSBsaXN0XG4gIHZhbCBtZXJnZSA6ICdhIHQgLT4gJ2IgdCAtPiBmOihrZXk6a2V5IC0+ICgnYSwgJ2IpIE1lcmdlX2VsZW1lbnQudCAtPiAnYyBvcHRpb24pIC0+ICdjIHRcbiAgdmFsIG1lcmdlX3NrZXdlZCA6ICd2IHQgLT4gJ3YgdCAtPiBjb21iaW5lOihrZXk6a2V5IC0+ICd2IC0+ICd2IC0+ICd2KSAtPiAndiB0XG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgJ2EgdFxuICAgIC0+ICdhIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYSAtPiAnYSAtPiBib29sKVxuICAgIC0+IChrZXksICdhKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAgJ2EgdFxuICAgIC0+ICdhIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYSAtPiAnYSAtPiBib29sKVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAoa2V5LCAnYSkgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIG1pbl9lbHQgOiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICdhIHQgLT4ga2V5ICogJ2FcbiAgdmFsIG1heF9lbHQgOiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICdhIHQgLT4ga2V5ICogJ2FcbiAgdmFsIGZvcl9hbGwgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBzcGxpdCA6ICdhIHQgLT4ga2V5IC0+ICdhIHQgKiAoa2V5ICogJ2EpIG9wdGlvbiAqICdhIHRcblxuICB2YWwgYXBwZW5kXG4gICAgOiAgbG93ZXJfcGFydDonYSB0XG4gICAgLT4gdXBwZXJfcGFydDonYSB0XG4gICAgLT4gWyBgT2sgb2YgJ2EgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF1cblxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICAnYSB0XG4gICAgLT4gbG93ZXJfYm91bmQ6a2V5IE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDprZXkgTWF5YmVfYm91bmQudFxuICAgIC0+ICdhIHRcblxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICAnYSB0XG4gICAgLT4gbWluOmtleVxuICAgIC0+IG1heDprZXlcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdiIC0+ICdiKVxuICAgIC0+ICdiXG5cbiAgdmFsIHJhbmdlX3RvX2FsaXN0IDogJ2EgdCAtPiBtaW46a2V5IC0+IG1heDprZXkgLT4gKGtleSAqICdhKSBsaXN0XG5cbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAgJ2EgdFxuICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAtPiBrZXlcbiAgICAtPiAoa2V5ICogJ2EpIG9wdGlvblxuXG4gIHZhbCBudGggOiAnYSB0IC0+IGludCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICB2YWwgbnRoX2V4biA6ICdhIHQgLT4gaW50IC0+IGtleSAqICdhXG4gIHZhbCByYW5rIDogXyB0IC0+IGtleSAtPiBpbnQgb3B0aW9uXG4gIHZhbCB0b190cmVlIDogJ2EgdCAtPiAnYSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5IHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOmtleVxuICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86a2V5XG4gICAgLT4gJ2EgdFxuICAgIC0+IChrZXkgKiAnYSkgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgJ2EgdFxuICAgIC0+IGNvbXBhcmU6KGtleTprZXkgLT4gZGF0YTonYSAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gKGtleSAqICdhKSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAnYSB0XG4gICAgLT4gc2VnbWVudF9vZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gKGtleSAqICdhKSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogICdhIHRcbiAgICAtPiBjb21wYXJlOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2JvdW5kIC0+IGludClcbiAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gJ2EgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczIgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgKCdhLCAnYikgdHJlZVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBpbnZhcmlhbnRzIDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgaXNfZW1wdHkgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAoXywgXykgdCAtPiBpbnRcbiAgdmFsIGFkZCA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYikgdCBPcl9kdXBsaWNhdGUudFxuICB2YWwgYWRkX2V4biA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYikgdFxuICB2YWwgc2V0IDogKCdhLCAnYikgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiKSB0XG4gIHZhbCBhZGRfbXVsdGkgOiAoJ2EsICdiIGxpc3QpIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYiBsaXN0KSB0XG4gIHZhbCByZW1vdmVfbXVsdGkgOiAoJ2EsICdiIGxpc3QpIHQgLT4gJ2EgLT4gKCdhLCAnYiBsaXN0KSB0XG4gIHZhbCBmaW5kX211bHRpIDogKCdhLCAnYiBsaXN0KSB0IC0+ICdhIC0+ICdiIGxpc3RcbiAgdmFsIGNoYW5nZSA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gZjooJ2Igb3B0aW9uIC0+ICdiIG9wdGlvbikgLT4gKCdhLCAnYikgdFxuICB2YWwgdXBkYXRlIDogKCdhLCAnYikgdCAtPiAnYSAtPiBmOignYiBvcHRpb24gLT4gJ2IpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbmQgOiAoJ2EsICdiKSB0IC0+ICdhIC0+ICdiIG9wdGlvblxuICB2YWwgZmluZF9leG4gOiAoJ2EsICdiKSB0IC0+ICdhIC0+ICdiXG4gIHZhbCByZW1vdmUgOiAoJ2EsICdiKSB0IC0+ICdhIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG1lbSA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgaXRlcl9rZXlzIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gIHZhbCBpdGVyMlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EsICdjKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBtYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICdjKSAtPiAoJ2EsICdjKSB0XG4gIHZhbCBtYXBpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYykgLT4gKCdhLCAnYykgdFxuICB2YWwgZm9sZCA6ICgnYSwgJ2IpIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnaywgJ3YpIHRcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gKCdhLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsICdiKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGQyXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICgnYSwgJ2MpIHRcbiAgICAtPiBpbml0OidkXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIC0+ICdkKVxuICAgIC0+ICdkXG5cbiAgdmFsIGZpbHRlcl9rZXlzIDogKCdhLCAnYikgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbHRlcmkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICdjIG9wdGlvbikgLT4gKCdhLCAnYykgdFxuICB2YWwgZmlsdGVyX21hcGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIG9wdGlvbikgLT4gKCdhLCAnYykgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjKSB0ICogKCdhLCAnZCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAoJ2MsICdkKSBFaXRoZXIudCkgLT4gKCdhLCAnYykgdCAqICgnYSwgJ2QpIHRcblxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IpIHQgKiAoJ2EsICdiKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdCAqICgnYSwgJ2IpIHRcbiAgdmFsIGNvbWJpbmVfZXJyb3JzIDogKCdhLCAnYiBPcl9lcnJvci50KSB0IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2IgLT4gJ2IgLT4gaW50KSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6ICgnYiAtPiAnYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gYm9vbFxuICB2YWwga2V5cyA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCBkYXRhIDogKF8sICdiKSB0IC0+ICdiIGxpc3RcbiAgdmFsIHRvX2FsaXN0IDogP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXSAtPiAoJ2EsICdiKSB0IC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIG1lcmdlXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICgnYSwgJ2MpIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gKCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIG9wdGlvbilcbiAgICAtPiAoJ2EsICdkKSB0XG5cbiAgdmFsIG1lcmdlX3NrZXdlZFxuICAgIDogICgnaywgJ3YpIHRcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgLT4gY29tYmluZTooa2V5OidrIC0+ICd2IC0+ICd2IC0+ICd2KVxuICAgIC0+ICgnaywgJ3YpIHRcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gKCdhLCAnYikgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EsICdiKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIG1pbl9lbHQgOiAoJ2EsICdiKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCAnYikgdCAtPiAnYSAqICdiXG4gIHZhbCBtYXhfZWx0IDogKCdhLCAnYikgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgJ2IpIHQgLT4gJ2EgKiAnYlxuICB2YWwgZm9yX2FsbCA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIHNwbGl0IDogKCdhLCAnYikgdCAtPiAnYSAtPiAoJ2EsICdiKSB0ICogKCdhICogJ2IpIG9wdGlvbiAqICgnYSwgJ2IpIHRcblxuICB2YWwgYXBwZW5kXG4gICAgOiAgbG93ZXJfcGFydDooJ2EsICdiKSB0XG4gICAgLT4gdXBwZXJfcGFydDooJ2EsICdiKSB0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF1cblxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gbG93ZXJfYm91bmQ6J2EgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidhIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2EsICdiKSB0XG5cbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IG1pbjonYVxuICAgIC0+IG1heDonYVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCByYW5nZV90b19hbGlzdCA6ICgnYSwgJ2IpIHQgLT4gbWluOidhIC0+IG1heDonYSAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EgKiAnYikgb3B0aW9uXG5cbiAgdmFsIG50aCA6ICgnYSwgJ2IpIHQgLT4gaW50IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG50aF9leG4gOiAoJ2EsICdiKSB0IC0+IGludCAtPiAnYSAqICdiXG4gIHZhbCByYW5rIDogKCdhLCBfKSB0IC0+ICdhIC0+IGludCBvcHRpb25cbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnYikgdFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAoJ2ssICd2KSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAoJ2ssICd2KSB0XG4gICAgLT4gc2VnbWVudF9vZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICAoJ2ssICd2KSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2JvdW5kIC0+IGludClcbiAgICAtPiBsb3dlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczMgPSBzaWdcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBpbnZhcmlhbnRzIDogKF8sIF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgaXNfZW1wdHkgOiAoXywgXywgXykgdCAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAoXywgXywgXykgdCAtPiBpbnRcbiAgdmFsIGFkZCA6ICgnYSwgJ2IsICdjbXApIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9kdXBsaWNhdGUudFxuICB2YWwgYWRkX2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgc2V0IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBhZGRfbXVsdGkgOiAoJ2EsICdiIGxpc3QsICdjbXApIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG4gIHZhbCByZW1vdmVfbXVsdGkgOiAoJ2EsICdiIGxpc3QsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG4gIHZhbCBmaW5kX211bHRpIDogKCdhLCAnYiBsaXN0LCAnY21wKSB0IC0+ICdhIC0+ICdiIGxpc3RcbiAgdmFsIGNoYW5nZSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gZjooJ2Igb3B0aW9uIC0+ICdiIG9wdGlvbikgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgdXBkYXRlIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiBmOignYiBvcHRpb24gLT4gJ2IpIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIGZpbmQgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+ICdiIG9wdGlvblxuICB2YWwgZmluZF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+ICdiXG4gIHZhbCByZW1vdmUgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIG1lbSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgaXRlcl9rZXlzIDogKCdhLCBfLCAnY21wKSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gIHZhbCBpdGVyMlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBtYXAgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+ICdjKSAtPiAoJ2EsICdjLCAnY21wKSB0XG4gIHZhbCBtYXBpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYykgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICB2YWwgZm9sZCA6ICgnYSwgJ2IsIF8pIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gKCdhLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsICdiLCBfKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGQyXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBpbml0OidkXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIC0+ICdkKVxuICAgIC0+ICdkXG5cbiAgdmFsIGZpbHRlcl9rZXlzIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIGZpbHRlcmkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+ICdjIG9wdGlvbikgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJfbWFwaVxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyBvcHRpb24pXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0ICogKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHQgKiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0ICogKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0ICogKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBjb21iaW5lX2Vycm9ycyA6ICgnYSwgJ2IgT3JfZXJyb3IudCwgJ2NtcCkgdCAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdiIC0+ICdiIC0+IGludCkgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+IGludFxuICB2YWwgZXF1YWwgOiAoJ2IgLT4gJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIGtleXMgOiAoJ2EsIF8sIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgZGF0YSA6IChfLCAnYiwgXykgdCAtPiAnYiBsaXN0XG5cbiAgdmFsIHRvX2FsaXN0XG4gICAgOiAgP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ICgnYSwgJ2IsIF8pIHRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBtZXJnZVxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+ICgnYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCBvcHRpb24pXG4gICAgLT4gKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBtZXJnZV9za2V3ZWRcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbWJpbmU6KGtleTonayAtPiAndiAtPiAndiAtPiAndilcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBtaW5fZWx0IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgKiAnYlxuICB2YWwgbWF4X2VsdCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhICogJ2JcbiAgdmFsIGZvcl9hbGwgOiAoXywgJ2IsIF8pIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2EsICdiLCBfKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6IChfLCAnYiwgXykgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogKCdhLCAnYiwgXykgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6IChfLCAnYiwgXykgdCAtPiBmOignYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICgnYSwgJ2IsIF8pIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gaW50XG5cbiAgdmFsIHNwbGl0XG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICdrXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnayAqICd2KSBvcHRpb24gKiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIGFwcGVuZFxuICAgIDogIGxvd2VyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IHVwcGVyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdXG5cbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGxvd2VyX2JvdW5kOidrIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonayBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogICgnYSwgJ2IsIF8pIHRcbiAgICAtPiBtaW46J2FcbiAgICAtPiBtYXg6J2FcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgcmFuZ2VfdG9fYWxpc3QgOiAoJ2EsICdiLCBfKSB0IC0+IG1pbjonYSAtPiBtYXg6J2EgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICAoJ2EsICdiLCBfKSB0XG4gICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgIC0+ICdhXG4gICAgLT4gKCdhICogJ2IpIG9wdGlvblxuXG4gIHZhbCBudGggOiAoJ2EsICdiLCBfKSB0IC0+IGludCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBudGhfZXhuIDogKCdhLCAnYiwgXykgdCAtPiBpbnQgLT4gJ2EgKiAnYlxuICB2YWwgcmFuayA6ICgnYSwgXywgXykgdCAtPiAnYSAtPiBpbnQgb3B0aW9uXG4gIHZhbCB0b190cmVlIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EsICdiLCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5IHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2IsIF8pIHRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGtleTonayAtPiBkYXRhOid2IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdib3VuZCAtPiBpbnQpXG4gICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICB0eXBlICgnYSwgJ2IsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0cmVlXG5cbiAgdmFsIGludmFyaWFudHMgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gYm9vbFxuICB2YWwgaXNfZW1wdHkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gaW50XG5cbiAgdmFsIGFkZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4ga2V5OidhXG4gICAgLT4gZGF0YTonYlxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZHVwbGljYXRlLnRcblxuICB2YWwgYWRkX2V4blxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4ga2V5OidhXG4gICAgLT4gZGF0YTonYlxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgc2V0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBrZXk6J2FcbiAgICAtPiBkYXRhOidiXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBhZGRfbXVsdGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG4gICAgLT4ga2V5OidhXG4gICAgLT4gZGF0YTonYlxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gIHZhbCByZW1vdmVfbXVsdGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICB2YWwgZmluZF9tdWx0aVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+ICdiIGxpc3RcblxuICB2YWwgY2hhbmdlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+IGY6KCdiIG9wdGlvbiAtPiAnYiBvcHRpb24pXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCB1cGRhdGVcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gZjooJ2Igb3B0aW9uIC0+ICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgZmluZCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiAnYiBvcHRpb25cbiAgdmFsIGZpbmRfZXhuIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+ICdiXG5cbiAgdmFsIHJlbW92ZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG1lbSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2EsIF8sICdjbXApIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6KCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBtYXAgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+ICdjKSAtPiAoJ2EsICdjLCAnY21wKSB0XG4gIHZhbCBtYXBpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYykgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICB2YWwgZm9sZCA6ICgnYSwgJ2IsIF8pIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyAtPiAnYykgLT4gJ2NcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gKCdhLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsICdiLCBfKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGQyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gaW5pdDonZFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCAtPiAnZClcbiAgICAtPiAnZFxuXG4gIHZhbCBmaWx0ZXJfa2V5c1xuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2EgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlclxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlcmlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJfbWFwXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiAnYyBvcHRpb24pXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJfbWFwaVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2Mgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHQgKiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHQgKiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCAqICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgKiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGNvbWJpbmVfZXJyb3JzXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IgT3JfZXJyb3IudCwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBjb21wYXJlX2RpcmVjdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2IgLT4gJ2IgLT4gaW50KVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gaW50XG5cbiAgdmFsIGVxdWFsXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYiAtPiAnYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gYm9vbFxuXG4gIHZhbCBrZXlzIDogKCdhLCBfLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIGRhdGEgOiAoXywgJ2IsIF8pIHQgLT4gJ2IgbGlzdFxuXG4gIHZhbCB0b19hbGlzdFxuICAgIDogID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiAoJ2EsICdiLCBfKSB0XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgbWVyZ2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gKCdiLCAnYykgTWVyZ2VfZWxlbWVudC50IC0+ICdkIG9wdGlvbilcbiAgICAtPiAoJ2EsICdkLCAnY21wKSB0XG5cbiAgdmFsIG1lcmdlX3NrZXdlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbWJpbmU6KGtleTonayAtPiAndiAtPiAndiAtPiAndilcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIG1pbl9lbHQgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAqICdiXG4gIHZhbCBtYXhfZWx0IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgKiAnYlxuICB2YWwgZm9yX2FsbCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnRpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBpbnRcblxuICB2YWwgc3BsaXRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCAqICgnYSAqICdiKSBvcHRpb24gKiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGFwcGVuZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiBsb3dlcl9wYXJ0OignYSwgJ2IsICdjbXApIHRcbiAgICAtPiB1cHBlcl9wYXJ0OignYSwgJ2IsICdjbXApIHRcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXVxuXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gbG93ZXJfYm91bmQ6J2EgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidhIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBtaW46J2FcbiAgICAtPiBtYXg6J2FcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgcmFuZ2VfdG9fYWxpc3RcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IG1pbjonYVxuICAgIC0+IG1heDonYVxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EgKiAnYikgb3B0aW9uXG5cbiAgdmFsIG50aCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gaW50IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG50aF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+IGludCAtPiAnYSAqICdiXG4gIHZhbCByYW5rIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+IGludCBvcHRpb25cbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSwgJ2IsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5IHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gc2VnbWVudF9vZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdib3VuZCAtPiBpbnQpXG4gICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbmVuZFxuXG4oKiogQ29uc2lzdGVuY3kgY2hlY2tzIChzYW1lIGFzIGluIFtDb250YWluZXJdKS4gKilcbm1vZHVsZSBDaGVja19hY2Nlc3NvcnNcbiAgICAoVCA6IFQzKVxuICAgIChUcmVlIDogVDMpXG4gICAgKEtleSA6IFQxKVxuICAgIChDbXAgOiBUMSlcbiAgICAoT3B0aW9ucyA6IFQzKVxuICAgIChfIDogQWNjZXNzb3JzX2dlbmVyaWNcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBPcHRpb25zLnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSBULnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSBUcmVlLnRcbiAgICAgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBLZXkudFxuICAgICB3aXRoIHR5cGUgJ2NtcCBjbXAgOj0gJ2NtcCBDbXAudCkgPVxuc3RydWN0IGVuZFxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMSAoTSA6IEFjY2Vzc29yczEpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICdiIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gJ2IgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0ua2V5XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMyIChNIDogQWNjZXNzb3JzMikgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczMgKE0gOiBBY2Nlc3NvcnMzKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvciAoTSA6IEFjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChXaXRoX2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBzaWdcbiAgdHlwZSAoJ2ssICd2LCAnY21wKSB0XG4gIHR5cGUgKCdrLCAndiwgJ2NtcCkgdHJlZVxuICB0eXBlICdrIGtleVxuICB0eXBlICgnYSwgJ2NtcCwgJ3opIG9wdGlvbnNcbiAgdHlwZSAnY21wIGNtcFxuXG4gIHZhbCBlbXB0eSA6ICgnaywgJ2NtcCwgKCdrLCBfLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBzaW5nbGV0b24gOiAoJ2ssICdjbXAsICdrIGtleSAtPiAndiAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG1hcF9rZXlzXG4gICAgOiAoICdrMlxuICAgICAgLCAnY21wMlxuICAgICAgLCAoJ2sxLCAndiwgJ2NtcDEpIHRcbiAgICAgIC0+IGY6KCdrMSBrZXkgLT4gJ2syIGtleSlcbiAgICAgIC0+IFsgYE9rIG9mICgnazIsICd2LCAnY21wMikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrMiBrZXkgXSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbWFwX2tleXNfZXhuXG4gICAgOiAoICdrMlxuICAgICAgLCAnY21wMlxuICAgICAgLCAoJ2sxLCAndiwgJ2NtcDEpIHQgLT4gZjooJ2sxIGtleSAtPiAnazIga2V5KSAtPiAoJ2syLCAndiwgJ2NtcDIpIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheVxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGFycmF5IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgYXJyYXkgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogKCdrLCAnY21wLCBsZW46aW50IC0+IGY6KGludCAtPiAnayBrZXkgKiAndikgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnayBrZXkgKiAndikgbGlzdCAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2sga2V5IF0gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgbGlzdCAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfZXhuIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGxpc3QgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgb2ZfYWxpc3RfbXVsdGkgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgbGlzdCAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfZm9sZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnayBrZXkgKiAndjEpIGxpc3QgLT4gaW5pdDondjIgLT4gZjooJ3YyIC0+ICd2MSAtPiAndjIpIC0+ICgnaywgJ3YyLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9yZWR1Y2VcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBsaXN0IC0+IGY6KCd2IC0+ICd2IC0+ICd2KSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfc2VxdWVuY2VcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2sga2V5IF1cbiAgICAgIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZV9vcl9lcnJvclxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlX2V4biA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2VfbXVsdGlcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZV9mb2xkXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrIGtleSAqICd2MSkgU2VxdWVuY2UudFxuICAgICAgLT4gaW5pdDondjJcbiAgICAgIC0+IGY6KCd2MiAtPiAndjEgLT4gJ3YyKVxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlX3JlZHVjZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiBmOigndiAtPiAndiAtPiAndikgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2ZfaXRlcmlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCBpdGVyaTooZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgICAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2sga2V5IF0gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX2l0ZXJpX2V4blxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsIGl0ZXJpOihmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdCkgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2ZfdHJlZSA6ICgnaywgJ2NtcCwgKCdrIGtleSwgJ3YsICdjbXApIHRyZWUgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMSA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSAnYSB0cmVlXG4gIHR5cGUga2V5XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGVtcHR5IDogXyB0XG4gIHZhbCBzaW5nbGV0b24gOiBrZXkgLT4gJ2EgLT4gJ2EgdFxuICB2YWwgbWFwX2tleXMgOiAndiB0IC0+IGY6KGtleSAtPiBrZXkpIC0+IFsgYE9rIG9mICd2IHQgfCBgRHVwbGljYXRlX2tleSBvZiBrZXkgXVxuICB2YWwgbWFwX2tleXNfZXhuIDogJ3YgdCAtPiBmOihrZXkgLT4ga2V5KSAtPiAndiB0XG4gIHZhbCBvZl9hbGlzdCA6IChrZXkgKiAnYSkgbGlzdCAtPiBbIGBPayBvZiAnYSB0IHwgYER1cGxpY2F0ZV9rZXkgb2Yga2V5IF1cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yIDogKGtleSAqICdhKSBsaXN0IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgb2ZfYWxpc3RfZXhuIDogKGtleSAqICdhKSBsaXN0IC0+ICdhIHRcbiAgdmFsIG9mX2FsaXN0X211bHRpIDogKGtleSAqICdhKSBsaXN0IC0+ICdhIGxpc3QgdFxuICB2YWwgb2ZfYWxpc3RfZm9sZCA6IChrZXkgKiAnYSkgbGlzdCAtPiBpbml0OidiIC0+IGY6KCdiIC0+ICdhIC0+ICdiKSAtPiAnYiB0XG4gIHZhbCBvZl9hbGlzdF9yZWR1Y2UgOiAoa2V5ICogJ2EpIGxpc3QgLT4gZjooJ2EgLT4gJ2EgLT4gJ2EpIC0+ICdhIHRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6IChrZXkgKiAnYSkgYXJyYXkgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogKGtleSAqICdhKSBhcnJheSAtPiAnYSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCA6IGxlbjppbnQgLT4gZjooaW50IC0+IGtleSAqICdhKSAtPiAnYSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc2VxdWVuY2UgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gWyBgT2sgb2YgJ2EgdCB8IGBEdXBsaWNhdGVfa2V5IG9mIGtleSBdXG4gIHZhbCBvZl9zZXF1ZW5jZV9vcl9lcnJvciA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NlcXVlbmNlX2V4biA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiAnYSB0XG4gIHZhbCBvZl9zZXF1ZW5jZV9tdWx0aSA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiAnYSBsaXN0IHRcbiAgdmFsIG9mX3NlcXVlbmNlX2ZvbGQgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gaW5pdDonYiAtPiBmOignYiAtPiAnYSAtPiAnYikgLT4gJ2IgdFxuICB2YWwgb2Zfc2VxdWVuY2VfcmVkdWNlIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+IGY6KCdhIC0+ICdhIC0+ICdhKSAtPiAnYSB0XG5cbiAgdmFsIG9mX2l0ZXJpXG4gICAgOiAgaXRlcmk6KGY6KGtleTprZXkgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+IFsgYE9rIG9mICd2IHQgfCBgRHVwbGljYXRlX2tleSBvZiBrZXkgXVxuXG4gIHZhbCBvZl9pdGVyaV9leG4gOiBpdGVyaTooZjooa2V5OmtleSAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXQpIC0+ICd2IHRcbiAgdmFsIG9mX3RyZWUgOiAnYSB0cmVlIC0+ICdhIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczIgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgKCdhLCAnYikgdHJlZVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBlbXB0eSA6IChfLCBfKSB0XG4gIHZhbCBzaW5nbGV0b24gOiAnYSAtPiAnYiAtPiAoJ2EsICdiKSB0XG5cbiAgdmFsIG1hcF9rZXlzXG4gICAgOiAgKCdrMSwgJ3YpIHRcbiAgICAtPiBmOignazEgLT4gJ2syKVxuICAgIC0+IFsgYE9rIG9mICgnazIsICd2KSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2syIF1cblxuICB2YWwgbWFwX2tleXNfZXhuIDogKCdrMSwgJ3YpIHQgLT4gZjooJ2sxIC0+ICdrMikgLT4gKCdrMiwgJ3YpIHRcbiAgdmFsIG9mX2FsaXN0IDogKCdhICogJ2IpIGxpc3QgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yIDogKCdhICogJ2IpIGxpc3QgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9hbGlzdF9leG4gOiAoJ2EgKiAnYikgbGlzdCAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl9hbGlzdF9tdWx0aSA6ICgnYSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IgbGlzdCkgdFxuICB2YWwgb2ZfYWxpc3RfZm9sZCA6ICgnYSAqICdiKSBsaXN0IC0+IGluaXQ6J2MgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpIC0+ICgnYSwgJ2MpIHRcbiAgdmFsIG9mX2FsaXN0X3JlZHVjZSA6ICgnYSAqICdiKSBsaXN0IC0+IGY6KCdiIC0+ICdiIC0+ICdiKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiAoJ2EgKiAnYikgYXJyYXkgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogKCdhICogJ2IpIGFycmF5IC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIDogbGVuOmludCAtPiBmOihpbnQgLT4gJ2EgKiAnYikgLT4gKCdhLCAnYikgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc2VxdWVuY2UgOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuICB2YWwgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NlcXVlbmNlX2V4biA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX3NlcXVlbmNlX211bHRpIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gKCdhLCAnYiBsaXN0KSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlX2ZvbGRcbiAgICA6ICAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAnYiAtPiAnYylcbiAgICAtPiAoJ2EsICdjKSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlX3JlZHVjZSA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+IGY6KCdiIC0+ICdiIC0+ICdiKSAtPiAoJ2EsICdiKSB0XG5cbiAgdmFsIG9mX2l0ZXJpXG4gICAgOiAgaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICB2YWwgb2ZfaXRlcmlfZXhuIDogaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX3RyZWUgOiAoJ2EsICdiKSB0cmVlIC0+ICgnYSwgJ2IpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2IsICdjbXApIHRyZWVcblxuICB2YWwgZW1wdHkgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgXywgJ2NtcCkgdFxuICB2YWwgc2luZ2xldG9uIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSAtPiAnYiAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG1hcF9rZXlzXG4gICAgOiAgY29tcGFyYXRvcjooJ2syLCAnY21wMikgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrMSwgJ3YsICdjbXAxKSB0XG4gICAgLT4gZjooJ2sxIC0+ICdrMilcbiAgICAtPiBbIGBPayBvZiAoJ2syLCAndiwgJ2NtcDIpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnazIgXVxuXG4gIHZhbCBtYXBfa2V5c19leG5cbiAgICA6ICBjb21wYXJhdG9yOignazIsICdjbXAyKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2sxLCAndiwgJ2NtcDEpIHRcbiAgICAtPiBmOignazEgLT4gJ2syKVxuICAgIC0+ICgnazIsICd2LCAnY21wMikgdFxuXG4gIHZhbCBvZl9hbGlzdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX2FsaXN0X2V4blxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfYWxpc3RfbXVsdGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICB2YWwgb2ZfYWxpc3RfZm9sZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAnYiAtPiAnYylcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIG9mX2FsaXN0X3JlZHVjZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IGY6KCdiIC0+ICdiIC0+ICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBhcnJheVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBhcnJheVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IGY6KGludCAtPiAnYSAqICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9zZXF1ZW5jZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgdmFsIG9mX3NlcXVlbmNlX29yX2Vycm9yXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX3NlcXVlbmNlX2V4blxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2Zfc2VxdWVuY2VfbXVsdGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICB2YWwgb2Zfc2VxdWVuY2VfZm9sZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAnYiAtPiAnYylcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlX3JlZHVjZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+IGY6KCdiIC0+ICdiIC0+ICdiKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfaXRlcmlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICB2YWwgb2ZfaXRlcmlfZXhuXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+IGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgb2ZfdHJlZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0cmVlXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuZW5kXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yc1xuICAgIChUIDogVDMpXG4gICAgKFRyZWUgOiBUMylcbiAgICAoS2V5IDogVDEpXG4gICAgKENtcCA6IFQxKVxuICAgIChPcHRpb25zIDogVDMpXG4gICAgKF8gOiBDcmVhdG9yc19nZW5lcmljXG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgT3B0aW9ucy50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgVC50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgVHJlZS50XG4gICAgIHdpdGggdHlwZSAnYSBrZXkgOj0gJ2EgS2V5LnRcbiAgICAgd2l0aCB0eXBlICdhIGNtcCA6PSAnYSBDbXAudCkgPVxuc3RydWN0IGVuZFxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMxIChNIDogQ3JlYXRvcnMxKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICdiIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gJ2IgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0ua2V5XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczIgKE0gOiBDcmVhdG9yczIpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzM193aXRoX2NvbXBhcmF0b3IgKE0gOiBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IsICdjKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKFdpdGhfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yc19nZW5lcmljID0gc2lnXG4gIGluY2x1ZGUgQ3JlYXRvcnNfZ2VuZXJpY1xuXG4gIGluY2x1ZGVcbiAgICBBY2Nlc3NvcnNfZ2VuZXJpY1xuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgdFxuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgdHJlZVxuICAgIHdpdGggdHlwZSAnYSBrZXkgOj0gJ2Ega2V5XG4gICAgd2l0aCB0eXBlICdhIGNtcCA6PSAnYSBjbXBcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIG9wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMSA9IHNpZ1xuICBpbmNsdWRlIENyZWF0b3JzMVxuXG4gIGluY2x1ZGVcbiAgICBBY2Nlc3NvcnMxXG4gICAgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICAgIHdpdGggdHlwZSAnYSB0cmVlIDo9ICdhIHRyZWVcbiAgICB3aXRoIHR5cGUga2V5IDo9IGtleVxuICAgIHdpdGggdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgOj0gY29tcGFyYXRvcl93aXRuZXNzXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczIgPSBzaWdcbiAgaW5jbHVkZSBDcmVhdG9yczJcblxuICBpbmNsdWRlXG4gICAgQWNjZXNzb3JzMlxuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSB0cmVlXG4gICAgd2l0aCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA6PSBjb21wYXJhdG9yX3dpdG5lc3NcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgaW5jbHVkZSBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yXG5cbiAgaW5jbHVkZVxuICAgIEFjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSB0cmVlXG5lbmRcblxubW9kdWxlIHR5cGUgU19wb2x5ID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJcblxubW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gc2lnXG4gIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICBtb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICAgIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gICAgW0BAQGVuZF1cblxuICAgIGluY2x1ZGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0IDo9IHRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICAgIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIENvbXBhcmVfbSA9IHNpZyBlbmRcbiAgbW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcbiAgbW9kdWxlIHR5cGUgSGFzaF9mb2xkX20gPSBIYXNoZXIuU1xuXG4gIHZhbCBzZXhwX29mX21fX3RcbiAgICA6ICAobW9kdWxlIFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+ICgndiAtPiBTZXhwLnQpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IFNleHAudFxuXG4gIHZhbCBtX190X29mX3NleHBcbiAgICA6ICAobW9kdWxlIE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9ICdrIGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9ICdjbXApXG4gICAgLT4gKFNleHAudCAtPiAndilcbiAgICAtPiBTZXhwLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIG1fX3Rfc2V4cF9ncmFtbWFyXG4gICAgOiAgKG1vZHVsZSBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+ICd2IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIHZhbCBjb21wYXJlX21fX3RcbiAgICA6ICAobW9kdWxlIENvbXBhcmVfbSlcbiAgICAtPiAoJ3YgLT4gJ3YgLT4gaW50KVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gaW50XG5cbiAgdmFsIGVxdWFsX21fX3RcbiAgICA6ICAobW9kdWxlIEVxdWFsX20pXG4gICAgLT4gKCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBib29sXG5cbiAgdmFsIGhhc2hfZm9sZF9tX190XG4gICAgOiAgKG1vZHVsZSBIYXNoX2ZvbGRfbSB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+IChIYXNoLnN0YXRlIC0+ICd2IC0+IEhhc2guc3RhdGUpXG4gICAgLT4gSGFzaC5zdGF0ZVxuICAgIC0+ICgnaywgJ3YsIF8pIHRcbiAgICAtPiBIYXNoLnN0YXRlXG5lbmRcblxubW9kdWxlIHR5cGUgTWFwID0gc2lnXG4gICgqKiBbTWFwXSBpcyBhIGZ1bmN0aW9uYWwgZGF0YSBzdHJ1Y3R1cmUgKGJhbGFuY2VkIGJpbmFyeSB0cmVlKSBpbXBsZW1lbnRpbmcgZmluaXRlIG1hcHNcbiAgICAgIG92ZXIgYSB0b3RhbGx5LW9yZGVyZWQgZG9tYWluLCBjYWxsZWQgYSBcImtleVwiLiAqKVxuXG4gIHR5cGUgKCdrZXksICsndmFsdWUsICdjbXApIHRcblxuICBtb2R1bGUgT3JfZHVwbGljYXRlID0gT3JfZHVwbGljYXRlXG4gIG1vZHVsZSBDb250aW51ZV9vcl9zdG9wID0gQ29udGludWVfb3Jfc3RvcFxuXG4gIG1vZHVsZSBGaW5pc2hlZF9vcl91bmZpbmlzaGVkIDogc2lnXG4gICAgdHlwZSB0ID0gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50ID1cbiAgICAgIHwgRmluaXNoZWRcbiAgICAgIHwgVW5maW5pc2hlZFxuICAgIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlbnVtZXJhdGUsIGVxdWFsLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcbiAgICBpbmNsdWRlIFBweF9lbnVtZXJhdGVfbGliLkVudW1lcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuRXF1YWwuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICAoKiogTWFwcyBbQ29udGludWVdIHRvIFtGaW5pc2hlZF0gYW5kIFtTdG9wXSB0byBbVW5maW5pc2hlZF0uICopXG4gICAgdmFsIG9mX2NvbnRpbnVlX29yX3N0b3AgOiBDb250aW51ZV9vcl9zdG9wLnQgLT4gdFxuXG4gICAgKCoqIE1hcHMgW0ZpbmlzaGVkXSB0byBbQ29udGludWVdIGFuZCBbVW5maW5pc2hlZF0gdG8gW1N0b3BdLiAqKVxuICAgIHZhbCB0b19jb250aW51ZV9vcl9zdG9wIDogdCAtPiBDb250aW51ZV9vcl9zdG9wLnRcbiAgZW5kXG5cbiAgbW9kdWxlIE1lcmdlX2VsZW1lbnQgOiBzaWdcbiAgICB0eXBlICgnbGVmdCwgJ3JpZ2h0KSB0ID1cbiAgICAgIFsgYExlZnQgb2YgJ2xlZnRcbiAgICAgIHwgYFJpZ2h0IG9mICdyaWdodFxuICAgICAgfCBgQm90aCBvZiAnbGVmdCAqICdyaWdodFxuICAgICAgXVxuICAgIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cF9vZl1cblxuICAgIHZhbCBjb21wYXJlXG4gICAgICA6ICAoJ2xlZnQgLT4gJ2xlZnQgLT4gaW50KVxuICAgICAgLT4gKCdyaWdodCAtPiAncmlnaHQgLT4gaW50KVxuICAgICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiBpbnRcblxuICAgIHZhbCBlcXVhbFxuICAgICAgOiAgKCdsZWZ0IC0+ICdsZWZ0IC0+IGJvb2wpXG4gICAgICAtPiAoJ3JpZ2h0IC0+ICdyaWdodCAtPiBib29sKVxuICAgICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiBib29sXG5cbiAgICB2YWwgc2V4cF9vZl90XG4gICAgICA6ICAoJ2xlZnQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdyaWdodCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgdmFsIGxlZnQgOiAoJ2xlZnQsIF8pIHQgLT4gJ2xlZnQgb3B0aW9uXG4gICAgdmFsIHJpZ2h0IDogKF8sICdyaWdodCkgdCAtPiAncmlnaHQgb3B0aW9uXG4gICAgdmFsIGxlZnRfdmFsdWUgOiAoJ2xlZnQsIF8pIHQgLT4gZGVmYXVsdDonbGVmdCAtPiAnbGVmdFxuICAgIHZhbCByaWdodF92YWx1ZSA6IChfLCAncmlnaHQpIHQgLT4gZGVmYXVsdDoncmlnaHQgLT4gJ3JpZ2h0XG5cbiAgICB2YWwgdmFsdWVzXG4gICAgICA6ICAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gbGVmdF9kZWZhdWx0OidsZWZ0XG4gICAgICAtPiByaWdodF9kZWZhdWx0OidyaWdodFxuICAgICAgLT4gJ2xlZnQgKiAncmlnaHRcbiAgZW5kXG5cbiAgdHlwZSAoJ2ssICdjbXApIGNvbXBhcmF0b3IgPSAoJ2ssICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgW0BAZGVwcmVjYXRlZCBcIltzaW5jZSAyMDIxLTEyXSB1c2UgW0NvbXBhcmF0b3IuTW9kdWxlLnRdIGluc3RlYWRcIl1cblxuICAoKiogVGVzdCBpZiB0aGUgaW52YXJpYW50cyBvZiB0aGUgaW50ZXJuYWwgQVZMIHNlYXJjaCB0cmVlIGhvbGQuICopXG4gIHZhbCBpbnZhcmlhbnRzIDogKF8sIF8sIF8pIHQgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIGEgZmlyc3QtY2xhc3MgbW9kdWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgbWFwL3NldC9ldGMuXG4gICAgICB3aXRoIHRoZSBzYW1lIG5vdGlvbiBvZiBjb21wYXJpc29uLiAqKVxuICB2YWwgY29tcGFyYXRvcl9zIDogKCdhLCBfLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuXG4gIHZhbCBjb21wYXJhdG9yIDogKCdhLCBfLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci50XG5cbiAgKCoqIFRoZSBlbXB0eSBtYXAuICopXG4gIHZhbCBlbXB0eSA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIEEgbWFwIHdpdGggb25lIChrZXksIGRhdGEpIHBhaXIuICopXG4gIHZhbCBzaW5nbGV0b24gOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgLT4gJ2IgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gbGlzdCB3aXRoIHVuaXF1ZSBrZXlzLiAqKVxuICB2YWwgb2ZfYWxpc3RcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBsaXN0IHdpdGggdW5pcXVlIGtleXMsIHJldHVybmluZyBhbiBlcnJvciBpZlxuICAgICAgZHVwbGljYXRlIFsnYV0ga2V5cyBhcmUgZm91bmQuICopXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvclxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBsaXN0IHdpdGggdW5pcXVlIGtleXMsIHJhaXNpbmcgYW4gZXhjZXB0aW9uIGlmXG4gICAgICBkdXBsaWNhdGUgWydhXSBrZXlzIGFyZSBmb3VuZC4gKilcbiAgdmFsIG9mX2FsaXN0X2V4biA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAoJ2EgKiAnYikgbGlzdCAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBsaXN0IHdpdGggcG9zc2libHkgcmVwZWF0ZWQga2V5cy4gVGhlIHZhbHVlcyBpblxuICAgICAgdGhlIG1hcCBmb3IgYSBnaXZlbiBrZXkgYXBwZWFyIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgZGlkIGluIHRoZSBhc3NvY2lhdGlvblxuICAgICAgbGlzdC4gKilcbiAgdmFsIG9mX2FsaXN0X211bHRpXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICAoKiogQ29tYmluZXMgYW4gYXNzb2NpYXRpb24gbGlzdCBpbnRvIGEgbWFwLCBmb2xkaW5nIHRvZ2V0aGVyIGJvdW5kIHZhbHVlcyB3aXRoIGNvbW1vblxuICAgICAga2V5cy4gVGhlIGFjY3VtdWxhdG9yIGlzIHBlci1rZXkuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHtbXG4gICAgICAgICMgbGV0IG1hcCA9IFN0cmluZy5NYXAub2ZfYWxpc3RfZm9sZFxuICAgICAgICAgICAgICAgICAgICAgIFsgXCJhXCIsIDE7IFwiYVwiLCAxMDsgXCJiXCIsIDI7IFwiYlwiLCAyMDsgXCJiXCIsIDIwMCBdXG4gICAgICAgICAgICAgICAgICAgICAgfmluaXQ6SW50LlNldC5lbXB0eVxuICAgICAgICAgICAgICAgICAgICAgIH5mOlNldC5hZGRcbiAgICAgICAgICBpblxuICAgICAgICAgIHByaW50X3MgWyVzZXhwIChtYXAgOiBJbnQuU2V0LnQgU3RyaW5nLk1hcC50KV07O1xuICAgICAgICAoKGEgKDEgMTApKSAoYiAoMiAyMCAyMDApKSlcbiAgICAgICAgLSA6IHVuaXQgPSAoKVxuICAgICAgXX1cbiAgKilcbiAgdmFsIG9mX2FsaXN0X2ZvbGRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAnYiAtPiAnYylcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgKCoqIENvbWJpbmVzIGFuIGFzc29jaWF0aW9uIGxpc3QgaW50byBhIG1hcCwgcmVkdWNpbmcgdG9nZXRoZXIgYm91bmQgdmFsdWVzIHdpdGggY29tbW9uXG4gICAgICBrZXlzLiAqKVxuICB2YWwgb2ZfYWxpc3RfcmVkdWNlXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBmOignYiAtPiAnYiAtPiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIFtvZl9pdGVyaSB+aXRlcmldIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3RdLCBleGNlcHQgdGhhdCBpbnN0ZWFkIG9mIHRha2luZyBhIGNvbmNyZXRlXG4gICAgICBkYXRhIHN0cnVjdHVyZSwgaXQgdGFrZXMgYW4gaXRlcmF0aW9uIGZ1bmN0aW9uLiAgRm9yIGluc3RhbmNlLCB0byBjb252ZXJ0IGEgc3RyaW5nIHRhYmxlXG4gICAgICBpbnRvIGEgbWFwOiBbb2ZfaXRlcmkgKG1vZHVsZSBTdHJpbmcpIH5mOihIYXNodGJsLml0ZXJpIHRhYmxlKV0uICBJdCBpcyBmYXN0ZXIgdGhhblxuICAgICAgYWRkaW5nIHRoZSBlbGVtZW50cyBvbmUgYnkgb25lLiAqKVxuICB2YWwgb2ZfaXRlcmlcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gICgqKiBMaWtlIFtvZl9pdGVyaV0gZXhjZXB0IHRoYXQgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiBkdXBsaWNhdGUgWydhXSBrZXlzIGFyZSBmb3VuZC4gKilcbiAgdmFsIG9mX2l0ZXJpX2V4blxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+IGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGEgc29ydGVkIGFycmF5IG9mIGtleS1kYXRhIHBhaXJzLiBUaGUgaW5wdXQgYXJyYXkgbXVzdCBiZSBzb3J0ZWRcbiAgICAgIChlaXRoZXIgaW4gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgb3JkZXIpLCBhcyBnaXZlbiBieSB0aGUgcmVsZXZhbnQgY29tcGFyYXRvciwgYW5kXG4gICAgICBtdXN0IG5vdCBjb250YWluIGR1cGxpY2F0ZSBrZXlzLiBJZiBlaXRoZXIgb2YgdGhlc2UgY29uZGl0aW9ucyBkb2VzIG5vdCBob2xkLFxuICAgICAgYW4gZXJyb3IgaXMgcmV0dXJuZWQuICAqKVxuICB2YWwgb2Zfc29ydGVkX2FycmF5XG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGFycmF5XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIExpa2UgW29mX3NvcnRlZF9hcnJheV0gZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBhIG1hcCB3aXRoIGJyb2tlbiBpbnZhcmlhbnRzIHdoZW4gYW5cbiAgICAgIFtFcnJvcl0gd291bGQgaGF2ZSBiZWVuIHJldHVybmVkLiAqKVxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBhcnJheVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogW29mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIGMgfmxlbiB+Zl0gYmVoYXZlcyBsaWtlIFtvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGNcbiAgICAgIChBcnJheS5pbml0IGxlbiB+ZildLCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYSBkZWNyZWFzaW5nIG9yZGVyIGlzIG5vdFxuICAgICAgc3VwcG9ydGVkLiAgVGhlIGFkdmFudGFnZSBpcyBub3QgcmVxdWlyaW5nIHlvdSB0byBhbGxvY2F0ZSBhbiBpbnRlcm1lZGlhdGUgYXJyYXkuICBbZl1cbiAgICAgIHdpbGwgYmUgY2FsbGVkIHdpdGggMCwgMSwgLi4uIFtsZW4gLSAxXSwgaW4gb3JkZXIuICopXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiBmOihpbnQgLT4gJ2EgKiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIFtvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIGMgc2VxXSBiZWhhdmVzIGxpa2UgW29mX3NvcnRlZF9hcnJheSBjIChTZXF1ZW5jZS50b19hcnJheVxuICAgICAgc2VxKV0sIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGFycmF5LlxuXG4gICAgICBUaGUgc2VxdWVuY2Ugd2lsbCBiZSBmb2xkZWQgb3ZlciBvbmNlLCBhbmQgdGhlIGFkZGl0aW9uYWwgdGltZSBjb21wbGV4aXR5IGlzIHtlIE8obil9LlxuICAqKVxuICB2YWwgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZVxuICAgIDogICgnaywgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnayAqICd2KSBTZXF1ZW5jZS50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSB3aXRoIHVuaXF1ZSBrZXlzLlxuXG4gICAgICBbb2Zfc2VxdWVuY2UgYyBzZXFdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3QgYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpXSBidXRcbiAgICAgIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC5cblxuICAgICAgSWYgeW91ciBzZXF1ZW5jZSBpcyBpbmNyZWFzaW5nLCB1c2UgW29mX2luY3JlYXNpbmdfc2VxdWVuY2VdLlxuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2VcbiAgICA6ICAoJ2ssICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2sgKiAndikgU2VxdWVuY2UudFxuICAgIC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnayBdXG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSB3aXRoIHVuaXF1ZSBrZXlzLCByZXR1cm5pbmcgYW4gZXJyb3IgaWZcbiAgICAgIGR1cGxpY2F0ZSBbJ2FdIGtleXMgYXJlIGZvdW5kLlxuXG4gICAgICBbb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgYyBzZXFdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3Rfb3JfZXJyb3IgYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpXVxuICAgICAgYnV0IGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC5cbiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlX29yX2Vycm9yXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIHdpdGggdW5pcXVlIGtleXMsIHJhaXNpbmcgYW4gZXhjZXB0aW9uIGlmXG4gICAgICBkdXBsaWNhdGUgWydhXSBrZXlzIGFyZSBmb3VuZC5cblxuICAgICAgW29mX3NlcXVlbmNlX2V4biBjIHNlcV0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF9leG4gYyAoU2VxdWVuY2UudG9fbGlzdCBzZXEpXSBidXRcbiAgICAgIGRvZXMgbm90IGFsbG9jYXRlIHRoZSBpbnRlcm1lZGlhdGUgbGlzdC5cbiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlX2V4blxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gc2VxdWVuY2Ugd2l0aCBwb3NzaWJseSByZXBlYXRlZCBrZXlzLiBUaGUgdmFsdWVzIGluXG4gICAgICB0aGUgbWFwIGZvciBhIGdpdmVuIGtleSBhcHBlYXIgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBkaWQgaW4gdGhlIGFzc29jaWF0aW9uXG4gICAgICBsaXN0LlxuXG4gICAgICBbb2Zfc2VxdWVuY2VfbXVsdGkgYyBzZXFdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3RfZXhuIGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKV0gYnV0XG4gICAgICBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuXG4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZV9tdWx0aVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgKCoqIENvbWJpbmVzIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIGludG8gYSBtYXAsIGZvbGRpbmcgdG9nZXRoZXIgYm91bmQgdmFsdWVzIHdpdGggY29tbW9uXG4gICAgICBrZXlzLlxuXG4gICAgICBbb2Zfc2VxdWVuY2VfZm9sZCBjIHNlcSB+aW5pdCB+Zl0gYmVoYXZlcyBsaWtlIFtvZl9hbGlzdF9mb2xkIGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKSB+aW5pdCB+Zl1cbiAgICAgIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuXG4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZV9mb2xkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gICgqKiBDb21iaW5lcyBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSBpbnRvIGEgbWFwLCByZWR1Y2luZyB0b2dldGhlciBib3VuZCB2YWx1ZXMgd2l0aCBjb21tb25cbiAgICAgIGtleXMuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZV9yZWR1Y2UgYyBzZXEgfmZdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3RfcmVkdWNlIGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKSB+Zl1cbiAgICAgIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2VfcmVkdWNlXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBmOignYiAtPiAnYiAtPiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIFRlc3RzIHdoZXRoZXIgYSBtYXAgaXMgZW1wdHkuICopXG4gIHZhbCBpc19lbXB0eSA6IChfLCBfLCBfKSB0IC0+IGJvb2xcblxuICAoKiogW2xlbmd0aCBtYXBdIHJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBbbWFwXS4gIE8oMSksIGJ1dCBbVHJlZS5sZW5ndGhdIGlzXG4gICAgICBPKG4pLiAqKVxuICB2YWwgbGVuZ3RoIDogKF8sIF8sIF8pIHQgLT4gaW50XG5cbiAgKCoqIFJldHVybnMgYSBuZXcgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgYmluZGluZzsgaWYgdGhlIGtleSB3YXMgYWxyZWFkeSBib3VuZCwgaXRzXG4gICAgICBwcmV2aW91cyBiaW5kaW5nIGRpc2FwcGVhcnMuICopXG4gIHZhbCBzZXQgOiAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW2FkZCB0IH5rZXkgfmRhdGFdIGFkZHMgYSBuZXcgZW50cnkgdG8gW3RdIG1hcHBpbmcgW2tleV0gdG8gW2RhdGFdIGFuZCByZXR1cm5zIFtgT2tdXG4gICAgICB3aXRoIHRoZSBuZXcgbWFwLCBvciBpZiBba2V5XSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gW3RdLCByZXR1cm5zIFtgRHVwbGljYXRlXS4gKilcbiAgdmFsIGFkZCA6ICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9kdXBsaWNhdGUudFxuXG4gIHZhbCBhZGRfZXhuIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIElmIFtrZXldIGlzIG5vdCBwcmVzZW50IHRoZW4gYWRkIGEgc2luZ2xldG9uIGxpc3QsIG90aGVyd2lzZSwgY29ucyBkYXRhIG9udG8gdGhlXG4gICAgICBoZWFkIG9mIHRoZSBleGlzdGluZyBsaXN0LiAqKVxuICB2YWwgYWRkX211bHRpIDogKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+IGtleTonayAtPiBkYXRhOid2IC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdFxuXG4gICgqKiBJZiB0aGUga2V5IGlzIHByZXNlbnQsIHRoZW4gcmVtb3ZlIGl0cyBoZWFkIGVsZW1lbnQ7IGlmIHRoZSByZXN1bHQgaXMgZW1wdHksIHJlbW92ZVxuICAgICAgdGhlIGtleS4gKilcbiAgdmFsIHJlbW92ZV9tdWx0aSA6ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiAnayAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHRcblxuICAoKiogUmV0dXJucyB0aGUgdmFsdWUgYm91bmQgdG8gdGhlIGdpdmVuIGtleSwgb3IgdGhlIGVtcHR5IGxpc3QgaWYgdGhlcmUgaXMgbm9uZS4gKilcbiAgdmFsIGZpbmRfbXVsdGkgOiAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4gJ2sgLT4gJ3YgbGlzdFxuXG4gICgqKiBbY2hhbmdlIHQga2V5IH5mXSByZXR1cm5zIGEgbmV3IG1hcCBbbV0gdGhhdCBpcyB0aGUgc2FtZSBhcyBbdF0gb24gYWxsIGtleXMgZXhjZXB0XG4gICAgICBmb3IgW2tleV0sIGFuZCB3aG9zZSB2YWx1ZSBmb3IgW2tleV0gaXMgZGVmaW5lZCBieSBbZl0sIGkuZS4sIFtmaW5kIG0ga2V5ID0gZiAoZmluZFxuICAgICAgdCBrZXkpXS4gKilcbiAgdmFsIGNoYW5nZSA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gZjooJ3Ygb3B0aW9uIC0+ICd2IG9wdGlvbikgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbdXBkYXRlIHQga2V5IH5mXSBpcyBbY2hhbmdlIHQga2V5IH5mOihmdW4gbyAtPiBTb21lIChmIG8pKV0uICopXG4gIHZhbCB1cGRhdGUgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+IGY6KCd2IG9wdGlvbiAtPiAndikgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG5cbiAgKCoqIFJldHVybnMgW1NvbWUgdmFsdWVdIGJvdW5kIHRvIHRoZSBnaXZlbiBrZXksIG9yIFtOb25lXSBpZiBub25lIGV4aXN0cy4gKilcbiAgdmFsIGZpbmQgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+ICd2IG9wdGlvblxuXG4gICgqKiBSZXR1cm5zIHRoZSB2YWx1ZSBib3VuZCB0byB0aGUgZ2l2ZW4ga2V5LCByYWlzaW5nIFtDYW1sLk5vdF9mb3VuZF0gb3IgW05vdF9mb3VuZF9zXVxuICAgICAgaWYgbm9uZSBleGlzdHMuICopXG4gIHZhbCBmaW5kX2V4biA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gJ3ZcblxuICAoKiogUmV0dXJucyBhIG5ldyBtYXAgd2l0aCBhbnkgYmluZGluZyBmb3IgdGhlIGtleSBpbiBxdWVzdGlvbiByZW1vdmVkLiAqKVxuICB2YWwgcmVtb3ZlIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFttZW0gbWFwIGtleV0gdGVzdHMgd2hldGhlciBbbWFwXSBjb250YWlucyBhIGJpbmRpbmcgZm9yIFtrZXldLiAqKVxuICB2YWwgbWVtIDogKCdrLCBfLCAnY21wKSB0IC0+ICdrIC0+IGJvb2xcblxuICB2YWwgaXRlcl9rZXlzIDogKCdrLCBfLCBfKSB0IC0+IGY6KCdrIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogSXRlcmF0ZXMgdW50aWwgdGhlIGZpcnN0IHRpbWUgW2ZdIHJldHVybnMgW1N0b3BdLiBJZiBbZl0gcmV0dXJucyBbU3RvcF0sIHRoZSBmaW5hbFxuICAgICAgcmVzdWx0IGlzIFtVbmZpbmlzaGVkXS4gT3RoZXJ3aXNlLCB0aGUgZmluYWwgcmVzdWx0IGlzIFtGaW5pc2hlZF0uICopXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgKCoqIEl0ZXJhdGVzIHR3byBtYXBzIHNpZGUgYnkgc2lkZS4gVGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBmdW5jdGlvbiBpcyBPKE0gKyBOKS4gIElmIHR3b1xuICAgICAgaW5wdXRzIGFyZSBbWygwLCBhKTsgKDEsIGEpXV0gYW5kIFtbKDEsIGIpOyAoMiwgYildXSwgW2ZdIHdpbGwgYmUgY2FsbGVkIHdpdGggW1soMCxcbiAgICAgIGBMZWZ0IGEpOyAoMSwgYEJvdGggKGEsIGIpKTsgKDIsIGBSaWdodCBiKV1dLiAqKVxuICB2YWwgaXRlcjJcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6KCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgKCoqIFJldHVybnMgYSBuZXcgbWFwIHdpdGggYm91bmQgdmFsdWVzIHJlcGxhY2VkIGJ5IFtmXSBhcHBsaWVkIHRvIHRoZSBib3VuZCB2YWx1ZXMuKilcbiAgdmFsIG1hcCA6ICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KCd2MSAtPiAndjIpIC0+ICgnaywgJ3YyLCAnY21wKSB0XG5cbiAgKCoqIExpa2UgW21hcF0sIGJ1dCB0aGUgcGFzc2VkIGZ1bmN0aW9uIHRha2VzIGJvdGggW2tleV0gYW5kIFtkYXRhXSBhcyBhcmd1bWVudHMuICopXG4gIHZhbCBtYXBpIDogKCdrLCAndjEsICdjbXApIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YxIC0+ICd2MikgLT4gKCdrLCAndjIsICdjbXApIHRcblxuICAoKiogQ29udmVydCBtYXAgd2l0aCBrZXlzIG9mIHR5cGUgWydrMl0gdG8gYSBtYXAgd2l0aCBrZXlzIG9mIHR5cGUgWydrMl0gdXNpbmcgW2ZdLiAqKVxuICB2YWwgbWFwX2tleXNcbiAgICA6ICAoJ2syLCAnY21wMikgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnazEsICd2LCAnY21wMSkgdFxuICAgIC0+IGY6KCdrMSAtPiAnazIpXG4gICAgLT4gWyBgT2sgb2YgKCdrMiwgJ3YsICdjbXAyKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2syIF1cblxuICAoKiogTGlrZSBbbWFwX2tleXNdLCBidXQgcmFpc2VzIG9uIGR1cGxpY2F0ZSBrZXkuICopXG4gIHZhbCBtYXBfa2V5c19leG5cbiAgICA6ICAoJ2syLCAnY21wMikgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnazEsICd2LCAnY21wMSkgdFxuICAgIC0+IGY6KCdrMSAtPiAnazIpXG4gICAgLT4gKCdrMiwgJ3YsICdjbXAyKSB0XG5cbiAgKCoqIEZvbGRzIG92ZXIga2V5cyBhbmQgZGF0YSBpbiB0aGUgbWFwIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgW2tleV0uICopXG4gIHZhbCBmb2xkIDogKCdrLCAndiwgXykgdCAtPiBpbml0OidhIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKSAtPiAnYVxuXG4gICgqKiBGb2xkcyBvdmVyIGtleXMgYW5kIGRhdGEgaW4gdGhlIG1hcCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIFtrZXldLCB1bnRpbCB0aGUgZmlyc3RcbiAgICAgIHRpbWUgdGhhdCBbZl0gcmV0dXJucyBbU3RvcCBfXS4gSWYgW2ZdIHJldHVybnMgW1N0b3AgZmluYWxdLCB0aGlzIGZ1bmN0aW9uIHJldHVybnNcbiAgICAgIGltbWVkaWF0ZWx5IHdpdGggdGhlIHZhbHVlIFtmaW5hbF0uIElmIFtmXSBuZXZlciByZXR1cm5zIFtTdG9wIF9dLCBhbmQgdGhlIGZpbmFsXG4gICAgICBjYWxsIHRvIFtmXSByZXR1cm5zIFtDb250aW51ZSBsYXN0XSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIFtmaW5pc2ggbGFzdF0uICopXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGluaXQ6J2FjY1xuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhY2MgLT4gKCdhY2MsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2MgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBGb2xkcyBvdmVyIGtleXMgYW5kIGRhdGEgaW4gdGhlIG1hcCBpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIFtrZXldLiAqKVxuICB2YWwgZm9sZF9yaWdodCA6ICgnaywgJ3YsIF8pIHQgLT4gaW5pdDonYSAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAnYSkgLT4gJ2FcblxuICAoKiogRm9sZHMgb3ZlciB0d28gbWFwcyBzaWRlIGJ5IHNpZGUsIGxpa2UgW2l0ZXIyXS4gKilcbiAgdmFsIGZvbGQyXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTooJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiAnYSAtPiAnYSlcbiAgICAtPiAnYVxuXG4gICgqKiBbZmlsdGVyXSwgW2ZpbHRlcmldLCBbZmlsdGVyX2tleXNdLCBbZmlsdGVyX21hcF0sIGFuZCBbZmlsdGVyX21hcGldIHJ1biBpbiBPKG4gKiBsZ1xuICAgICAgbikgdGltZTsgdGhleSBzaW1wbHkgYWNjdW11bGF0ZSBlYWNoIGtleSAmIGRhdGEgcGFpciByZXRhaW5lZCBieSBbZl0gaW50byBhIG5ldyBtYXBcbiAgICAgIHVzaW5nIFthZGRdLiAqKVxuICB2YWwgZmlsdGVyX2tleXMgOiAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KCdrIC0+IGJvb2wpIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgZmlsdGVyIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBmOigndiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0XG4gIHZhbCBmaWx0ZXJpIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFJldHVybnMgYSBuZXcgbWFwIHdpdGggYm91bmQgdmFsdWVzIGZpbHRlcmVkIGJ5IFtmXSBhcHBsaWVkIHRvIHRoZSBib3VuZCB2YWx1ZXMuICopXG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdrLCAndjEsICdjbXApIHQgLT4gZjooJ3YxIC0+ICd2MiBvcHRpb24pIC0+ICgnaywgJ3YyLCAnY21wKSB0XG5cbiAgKCoqIExpa2UgW2ZpbHRlcl9tYXBdLCBidXQgdGhlIHBhc3NlZCBmdW5jdGlvbiB0YWtlcyBib3RoIFtrZXldIGFuZCBbZGF0YV0gYXNcbiAgICAgIGFyZ3VtZW50cy4gKilcbiAgdmFsIGZpbHRlcl9tYXBpXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondjEgLT4gJ3YyIG9wdGlvbilcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuXG4gICgqKiBbcGFydGl0aW9uX21hcGkgdCB+Zl0gcmV0dXJucyB0d28gbmV3IFt0XXMsIHdpdGggZWFjaCBrZXkgaW4gW3RdIGFwcGVhcmluZyBpblxuICAgICAgZXhhY3RseSBvbmUgb2YgdGhlIHJlc3VsdGluZyBtYXBzIGRlcGVuZGluZyBvbiBpdHMgbWFwcGluZyBpbiBbZl0uICopXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YxIC0+ICgndjIsICd2MykgRWl0aGVyLnQpXG4gICAgLT4gKCdrLCAndjIsICdjbXApIHQgKiAoJ2ssICd2MywgJ2NtcCkgdFxuXG4gICgqKiBbcGFydGl0aW9uX21hcCB0IH5mID0gcGFydGl0aW9uX21hcGkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXSAqKVxuICB2YWwgcGFydGl0aW9uX21hcFxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gZjooJ3YxIC0+ICgndjIsICd2MykgRWl0aGVyLnQpXG4gICAgLT4gKCdrLCAndjIsICdjbXApIHQgKiAoJ2ssICd2MywgJ2NtcCkgdFxuXG4gICgqKlxuICAgICB7W1xuICAgICAgIHBhcnRpdGlvbmlfdGYgdCB+ZlxuICAgICAgID1cbiAgICAgICBwYXJ0aXRpb25fbWFwaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgICAgICAgaWYgZiB+a2V5IH5kYXRhXG4gICAgICAgICB0aGVuIEZpcnN0IGRhdGFcbiAgICAgICAgIGVsc2UgU2Vjb25kIGRhdGEpXG4gICAgIF19ICopXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IGJvb2wpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW3BhcnRpdGlvbl90ZiB0IH5mID0gcGFydGl0aW9uaV90ZiB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSldICopXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gZjooJ3YgLT4gYm9vbClcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBQcm9kdWNlcyBbT2tdIG9mIGEgbWFwIGluY2x1ZGluZyBhbGwga2V5cyBpZiBhbGwgZGF0YSBpcyBbT2tdLCBvciBhbiBbRXJyb3JdXG4gICAgICBpbmNsdWRpbmcgYWxsIGVycm9ycyBvdGhlcndpc2UuICopXG4gIHZhbCBjb21iaW5lX2Vycm9ycyA6ICgnaywgJ3YgT3JfZXJyb3IudCwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICAoKiogUmV0dXJucyBhIHRvdGFsIG9yZGVyaW5nIGJldHdlZW4gbWFwcy4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgdG90YWwgb3JkZXJpbmcgdXNlZFxuICAgICAgdG8gY29tcGFyZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlcXVhbCBrZXlzIGluIHRoZSB0d28gbWFwcy4gKilcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCd2IC0+ICd2IC0+IGludCkgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IC0+IGludFxuXG4gICgqKiBIYXNoIGZ1bmN0aW9uOiBhIGJ1aWxkaW5nIGJsb2NrIHRvIHVzZSB3aGVuIGhhc2hpbmcgZGF0YSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgbWFwcyBpblxuICAgICAgdGhlbS4gW2hhc2hfZm9sZF9kaXJlY3QgaGFzaF9mb2xkX2tleV0gaXMgY29tcGF0aWJsZSB3aXRoIFtjb21wYXJlX2RpcmVjdF0gaWZmXG4gICAgICBbaGFzaF9mb2xkX2tleV0gaXMgY29tcGF0aWJsZSB3aXRoIFsoY29tcGFyYXRvciBtKS5jb21wYXJlXSBvZiB0aGUgbWFwIFttXSBiZWluZ1xuICAgICAgaGFzaGVkLiAqKVxuICB2YWwgaGFzaF9mb2xkX2RpcmVjdCA6ICdrIEhhc2guZm9sZGVyIC0+ICd2IEhhc2guZm9sZGVyIC0+ICgnaywgJ3YsICdjbXApIHQgSGFzaC5mb2xkZXJcblxuICAoKiogW2VxdWFsIGNtcCBtMSBtMl0gdGVzdHMgd2hldGhlciB0aGUgbWFwcyBbbTFdIGFuZCBbbTJdIGFyZSBlcXVhbCwgdGhhdCBpcywgY29udGFpblxuICAgICAgdGhlIHNhbWUga2V5cyBhbmQgYXNzb2NpYXRlIGVhY2gga2V5IHdpdGggdGhlIHNhbWUgdmFsdWUuICBbY21wXSBpcyB0aGUgZXF1YWxpdHlcbiAgICAgIHByZWRpY2F0ZSB1c2VkIHRvIGNvbXBhcmUgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGtleXMuICopXG4gIHZhbCBlcXVhbCA6ICgndiAtPiAndiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUga2V5cyBpbiB0aGUgZ2l2ZW4gbWFwLiAqKVxuICB2YWwga2V5cyA6ICgnaywgXywgXykgdCAtPiAnayBsaXN0XG5cbiAgKCoqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBkYXRhIGluIHRoZSBnaXZlbiBtYXAuICopXG4gIHZhbCBkYXRhIDogKF8sICd2LCBfKSB0IC0+ICd2IGxpc3RcblxuICAoKiogQ3JlYXRlcyBhbiBhc3NvY2lhdGlvbiBsaXN0IGZyb20gdGhlIGdpdmVuIG1hcC4gKilcbiAgdmFsIHRvX2FsaXN0XG4gICAgOiAgP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXSAoKiogZGVmYXVsdCBpcyBbYEluY3JlYXNpbmddICopXG4gICAgLT4gKCdrLCAndiwgXykgdFxuICAgIC0+ICgnayAqICd2KSBsaXN0XG5cbiAgKCoqIHsyIEFkZGl0aW9uYWwgb3BlcmF0aW9ucyBvbiBtYXBzfSAqKVxuXG4gICgqKiBNZXJnZXMgdHdvIG1hcHMuIFRoZSBydW50aW1lIGlzIE8obGVuZ3RoKHQxKSArIGxlbmd0aCh0MikpLiBZb3Ugc2hvdWxkbid0IHVzZSB0aGlzXG4gICAgICBmdW5jdGlvbiB0byBtZXJnZSBhIGxpc3Qgb2YgbWFwczsgY29uc2lkZXIgdXNpbmcgW21lcmdlX3NrZXdlZF0gaW5zdGVhZC4gKilcbiAgdmFsIG1lcmdlXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonayAtPiAoJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiAndjMgb3B0aW9uKVxuICAgIC0+ICgnaywgJ3YzLCAnY21wKSB0XG5cbiAgKCoqIEEgc3BlY2lhbCBjYXNlIG9mIFttZXJnZV0sIFttZXJnZV9za2V3ZWQgdDEgdDJdIGlzIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZVxuICAgICAgYmluZGluZ3Mgb2YgW3QxXSBhbmQgW3QyXS4gQmluZGluZ3MgdGhhdCBhcHBlYXIgaW4gYm90aCBbdDFdIGFuZCBbdDJdIGFyZVxuICAgICAgY29tYmluZWQgaW50byBhIHNpbmdsZSB2YWx1ZSB1c2luZyB0aGUgW2NvbWJpbmVdIGZ1bmN0aW9uLiBJbiBhIGNhbGxcbiAgICAgIFtjb21iaW5lIH5rZXkgdjEgdjJdLCB0aGUgdmFsdWUgW3YxXSBjb21lcyBmcm9tIFt0MV0gYW5kIFt2Ml0gZnJvbSBbdDJdLlxuXG4gICAgICBUaGUgcnVudGltZSBvZiBbbWVyZ2Vfc2tld2VkXSBpcyBbTyhtaW4obDEsIGwyKSAqIGxvZyhtYXgobDEsIGwyKSkpXSwgd2hlcmUgW2wxXSBpc1xuICAgICAgdGhlIGxlbmd0aCBvZiBbdDFdIGFuZCBbbDJdIHRoZSBsZW5ndGggb2YgW3QyXS4gVGhpcyBpcyBsaWtlbHkgdG8gYmUgZmFzdGVyIHRoYW5cbiAgICAgIFttZXJnZV0gd2hlbiBvbmUgb2YgdGhlIG1hcHMgaXMgYSBsb3Qgc21hbGxlciwgb3Igd2hlbiB5b3UgbWVyZ2UgYSBsaXN0IG9mIG1hcHMuICopXG4gIHZhbCBtZXJnZV9za2V3ZWRcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbWJpbmU6KGtleTonayAtPiAndiAtPiAndiAtPiAndilcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgbW9kdWxlIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQgOiBzaWdcbiAgICB0eXBlICgnaywgJ3YpIHQgPSAnayAqIFsgYExlZnQgb2YgJ3YgfCBgUmlnaHQgb2YgJ3YgfCBgVW5lcXVhbCBvZiAndiAqICd2IF1cbiAgICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzIgd2l0aCB0eXBlICgnaywgJ3YpIHQgOj0gKCdrLCAndikgdFxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkVxdWFsLlMyIHdpdGggdHlwZSAoJ2ssICd2KSB0IDo9ICgnaywgJ3YpIHRcbiAgICBpbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlLlMyIHdpdGggdHlwZSAoJ2ssICd2KSB0IDo9ICgnaywgJ3YpIHRcblxuICAgIHZhbCB0X3NleHBfZ3JhbW1hclxuICAgICAgOiAgJ2sgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgIC0+ICd2IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAtPiAoJ2ssICd2KSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICAoKiogW3N5bW1ldHJpY19kaWZmIHQxIHQyIH5kYXRhX2VxdWFsXSByZXR1cm5zIGEgbGlzdCBvZiBjaGFuZ2VzIGJldHdlZW4gW3QxXSBhbmQgW3QyXS5cbiAgICAgIEl0IGlzIGludGVuZGVkIHRvIGJlIGVmZmljaWVudCBpbiB0aGUgY2FzZSB3aGVyZSBbdDFdIGFuZCBbdDJdIHNoYXJlIGEgbGFyZ2UgYW1vdW50XG4gICAgICBvZiBzdHJ1Y3R1cmUuIFRoZSBrZXlzIGluIHRoZSBvdXRwdXQgc2VxdWVuY2Ugd2lsbCBiZSBpbiBzb3J0ZWQgb3JkZXIuXG5cbiAgICAgIEl0IGlzIGFzc3VtZWQgdGhhdCBbZGF0YV9lcXVhbF0gaXMgYXQgbGVhc3QgYXMgZXF1YXRpbmcgYXMgcGh5c2ljYWwgZXF1YWxpdHk6IHRoYXRcbiAgICAgIFtwaHlzX2VxdWFsIHggeV0gaW1wbGllcyBbZGF0YV9lcXVhbCB4IHldLiBPdGhlcndpc2UsIFtzeW1tZXRyaWNfZGlmZl0gbWF5IGJlaGF2ZSBpblxuICAgICAgdW5leHBlY3RlZCB3YXlzLiBGb3IgZXhhbXBsZSwgd2l0aCBbfmRhdGFfZXF1YWw6KGZ1biBfIF8gLT4gZmFsc2UpXSBpdCBpcyBOT1RcbiAgICAgIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIHRoZSByZXN1bHRpbmcgY2hhbmdlIHNlcXVlbmNlIHdpbGwgY29udGFpbiBhbiBlbGVtZW50XG4gICAgICBbKGssIGBVbmVxdWFsIF8pXSBmb3IgZXZlcnkga2V5IFtrXSBzaGFyZWQgYnkgYm90aCBtYXBzLlxuXG4gICAgICBXYXJuaW5nOiBGbG9hdCBlcXVhbGl0eSB2aW9sYXRlcyB0aGlzIHByb3BlcnR5ISBbcGh5c19lcXVhbCBGbG9hdC5uYW4gRmxvYXQubmFuXSBpc1xuICAgICAgdHJ1ZSwgYnV0IFtGbG9hdC4oPSkgRmxvYXQubmFuIEZsb2F0Lm5hbl0gaXMgZmFsc2UuICopXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAtPiAoJ2ssICd2KSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gICgqKiBbZm9sZF9zeW1tZXRyaWNfZGlmZiB0MSB0MiB+ZGF0YV9lcXVhbF0gZm9sZHMgYWNyb3NzIGFuIGltcGxpY2l0IHNlcXVlbmNlIG9mIGNoYW5nZXNcbiAgICAgIGJldHdlZW4gW3QxXSBhbmQgW3QyXSwgaW4gc29ydGVkIG9yZGVyIGJ5IGtleXMuIEVxdWl2YWxlbnQgdG9cbiAgICAgIFtTZXF1ZW5jZS5mb2xkIChzeW1tZXRyaWNfZGlmZiB0MSB0MiB+ZGF0YV9lcXVhbCldLCBhbmQgbW9yZSBlZmZpY2llbnQuICopXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOigndiAtPiAndiAtPiBib29sKVxuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOignYSAtPiAoJ2ssICd2KSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2EpXG4gICAgLT4gJ2FcblxuICAoKiogW21pbl9lbHQgbWFwXSByZXR1cm5zIFtTb21lIChrZXksIGRhdGEpXSBwYWlyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltdW0ga2V5IGluXG4gICAgICBbbWFwXSwgb3IgW05vbmVdIGlmIGVtcHR5LiAqKVxuICB2YWwgbWluX2VsdCA6ICgnaywgJ3YsIF8pIHQgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnaywgJ3YsIF8pIHQgLT4gJ2sgKiAndlxuXG4gICgqKiBbbWF4X2VsdCBtYXBdIHJldHVybnMgW1NvbWUgKGtleSwgZGF0YSldIHBhaXIgY29ycmVzcG9uZGluZyB0byB0aGUgbWF4aW11bSBrZXkgaW5cbiAgICAgIFttYXBdLCBvciBbTm9uZV0gaWYgW21hcF0gaXMgZW1wdHkuICopXG4gIHZhbCBtYXhfZWx0IDogKCdrLCAndiwgXykgdCAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdrLCAndiwgXykgdCAtPiAnayAqICd2XG5cbiAgKCoqIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBzaW1pbGFyIGZ1bmN0aW9ucyBpbiBbTGlzdF0uICopXG5cbiAgdmFsIGZvcl9hbGwgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gaW50XG5cblxuICAoKiogW3NwbGl0IHQga2V5XSByZXR1cm5zIGEgbWFwIG9mIGtleXMgc3RyaWN0bHkgbGVzcyB0aGFuIFtrZXldLCB0aGUgbWFwcGluZyBvZiBba2V5XSBpZlxuICAgICAgYW55LCBhbmQgYSBtYXAgb2Yga2V5cyBzdHJpY3RseSBncmVhdGVyIHRoYW4gW2tleV0uXG5cbiAgICAgIFJ1bnRpbWUgaXMgTyhtICsgbG9nIG4pLCB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBtYXAgYW5kIG0gaXMgdGhlIHNpemUgb2ZcbiAgICAgIHRoZSBzbWFsbGVyIG9mIHRoZSB0d28gb3V0cHV0IG1hcHMuICBUaGUgTyhtKSB0ZXJtIGlzIGR1ZSB0byB0aGUgbmVlZCB0byBjYWxjdWxhdGVcbiAgICAgIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBtYXBzLiAqKVxuICB2YWwgc3BsaXRcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gJ2tcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0ICogKCdrICogJ3YpIG9wdGlvbiAqICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW2FwcGVuZCB+bG93ZXJfcGFydCB+dXBwZXJfcGFydF0gcmV0dXJucyBbYE9rIG1hcF0gd2hlcmUgW21hcF0gY29udGFpbnMgYWxsIHRoZVxuICAgICAgWyhrZXksIHZhbHVlKV0gcGFpcnMgZnJvbSB0aGUgdHdvIGlucHV0IG1hcHMgaWYgYWxsIHRoZSBrZXlzIGZyb20gW2xvd2VyX3BhcnRdIGFyZVxuICAgICAgbGVzcyB0aGFuIGFsbCB0aGUga2V5cyBmcm9tIFt1cHBlcl9wYXJ0XS4gIE90aGVyd2lzZSBpdCByZXR1cm5zXG4gICAgICBbYE92ZXJsYXBwaW5nX2tleV9yYW5nZXNdLlxuXG4gICAgICBSdW50aW1lIGlzIE8obG9nIG4pIHdoZXJlIG4gaXMgdGhlIHNpemUgb2YgdGhlIGxhcmdlciBpbnB1dCBtYXAuICBUaGlzIGNhbiBiZVxuICAgICAgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBbTWFwLm1lcmdlXSBvciByZXBlYXRlZCBbTWFwLmFkZF0uXG5cbiAgICAgIHtbXG4gICAgICAgIGFzc2VydCAobWF0Y2ggTWFwLmFwcGVuZCB+bG93ZXJfcGFydCB+dXBwZXJfcGFydCB3aXRoXG4gICAgICAgICAgfCBgT2sgd2hvbGVfbWFwIC0+XG4gICAgICAgICAgICBNYXAudG9fYWxpc3Qgd2hvbGVfbWFwXG4gICAgICAgICAgICA9IExpc3QuYXBwZW5kICh0b19hbGlzdCBsb3dlcl9wYXJ0KSAodG9fYWxpc3QgdXBwZXJfcGFydClcbiAgICAgICAgICB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIC0+IHRydWUpO1xuICAgICAgXX0gKilcbiAgdmFsIGFwcGVuZFxuICAgIDogIGxvd2VyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IHVwcGVyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IFsgYE9rIG9mICgnaywgJ3YsICdjbXApIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdXG5cbiAgKCoqIFtzdWJyYW5nZSB0IH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmRdIHJldHVybnMgYSBtYXAgY29udGFpbmluZyBhbGwgdGhlIGVudHJpZXMgZnJvbVxuICAgICAgW3RdIHdob3NlIGtleXMgbGllIGluc2lkZSB0aGUgaW50ZXJ2YWwgaW5kaWNhdGVkIGJ5IFt+bG93ZXJfYm91bmRdIGFuZFxuICAgICAgW351cHBlcl9ib3VuZF0uICBJZiB0aGlzIGludGVydmFsIGlzIGVtcHR5LCBhbiBlbXB0eSBtYXAgaXMgcmV0dXJuZWQuXG5cbiAgICAgIFJ1bnRpbWUgaXMgTyhtICsgbG9nIG4pLCB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBtYXAgYW5kIG0gaXMgdGhlIHNpemUgb2ZcbiAgICAgIHRoZSBvdXRwdXQgbWFwLiAgVGhlIE8obSkgdGVybSBpcyBkdWUgdG8gdGhlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlXG4gICAgICBvdXRwdXQgbWFwLiAqKVxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gbG93ZXJfYm91bmQ6J2sgTWF5YmVfYm91bmQudFxuICAgIC0+IHVwcGVyX2JvdW5kOidrIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFtmb2xkX3JhbmdlX2luY2x1c2l2ZSB0IH5taW4gfm1heCB+aW5pdCB+Zl0gZm9sZHMgW2ZdICh3aXRoIGluaXRpYWwgdmFsdWUgW35pbml0XSlcbiAgICAgIG92ZXIgYWxsIGtleXMgKGFuZCB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcykgdGhhdCBhcmUgaW4gdGhlIHJhbmdlIFtbbWluLCBtYXhdXVxuICAgICAgKGluY2x1c2l2ZSkuICAqKVxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gbWluOidrXG4gICAgLT4gbWF4OidrXG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKVxuICAgIC0+ICdhXG5cbiAgKCoqIFtyYW5nZV90b19hbGlzdCB0IH5taW4gfm1heF0gcmV0dXJucyBhbiBhc3NvY2lhdGl2ZSBsaXN0IG9mIHRoZSBlbGVtZW50cyB3aG9zZSBrZXlzXG4gICAgICBsaWUgaW4gW1ttaW4sIG1heF1dIChpbmNsdXNpdmUpLCB3aXRoIHRoZSBzbWFsbGVzdCBrZXkgYmVpbmcgYXQgdGhlIGhlYWQgb2YgdGhlXG4gICAgICBsaXN0LiAqKVxuICB2YWwgcmFuZ2VfdG9fYWxpc3QgOiAoJ2ssICd2LCAnY21wKSB0IC0+IG1pbjonayAtPiBtYXg6J2sgLT4gKCdrICogJ3YpIGxpc3RcblxuICAoKiogW2Nsb3Nlc3Rfa2V5IHQgZGlyIGtdIHJldHVybnMgdGhlIFsoa2V5LCB2YWx1ZSldIHBhaXIgaW4gW3RdIHdpdGggW2tleV0gY2xvc2VzdCB0b1xuICAgICAgW2tdIHRoYXQgc2F0aXNmaWVzIHRoZSBnaXZlbiBpbmVxdWFsaXR5IGJvdW5kLlxuXG4gICAgICBGb3IgZXhhbXBsZSwgW2Nsb3Nlc3Rfa2V5IHQgYExlc3NfdGhhbiBrXSB3b3VsZCBiZSB0aGUgcGFpciB3aXRoIHRoZSBjbG9zZXN0IGtleSB0b1xuICAgICAgW2tdIHdoZXJlIFtrZXkgPCBrXS5cblxuICAgICAgW3RvX3NlcXVlbmNlXSBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIHNhbWUgcmVzdWx0cyBhcyBbY2xvc2VzdF9rZXldLiAgSXQgaXMgbGVzc1xuICAgICAgZWZmaWNpZW50IGZvciBpbmRpdmlkdWFsIGxvb2t1cHMgYnV0IG1vcmUgZWZmaWNpZW50IGZvciBmaW5kaW5nIG1hbnkgZWxlbWVudHMgc3RhcnRpbmdcbiAgICAgIGF0IHNvbWUgdmFsdWUuICopXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgLT4gJ2tcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgKCoqIFtudGggdCBuXSBmaW5kcyB0aGUgKGtleSwgdmFsdWUpIHBhaXIgb2YgcmFuayBuIChpLmUuLCBzdWNoIHRoYXQgdGhlcmUgYXJlIGV4YWN0bHkgblxuICAgICAga2V5cyBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIGZvdW5kIGtleSksIGlmIG9uZSBleGlzdHMuICBPKGxvZyhsZW5ndGggdCkgKyBuKSB0aW1lLiAqKVxuICB2YWwgbnRoIDogKCdrLCAndiwgXykgdCAtPiBpbnQgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBudGhfZXhuIDogKCdrLCAndiwgXykgdCAtPiBpbnQgLT4gJ2sgKiAndlxuXG4gICgqKiBbcmFuayB0IGtdIElmIFtrXSBpcyBpbiBbdF0sIHJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIHN0cmljdGx5IGxlc3MgdGhhbiBba10gaW5cbiAgICAgIFt0XSwgYW5kIFtOb25lXSBvdGhlcndpc2UuICopXG4gIHZhbCByYW5rIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiBpbnQgb3B0aW9uXG5cblxuXG4gICgqKiBbdG9fc2VxdWVuY2UgP29yZGVyID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2tleXNfbGVzc19vcl9lcXVhbF90byB0XVxuICAgICAgZ2l2ZXMgYSBzZXF1ZW5jZSBvZiBrZXktdmFsdWUgcGFpcnMgYmV0d2VlbiBba2V5c19sZXNzX29yX2VxdWFsX3RvXSBhbmRcbiAgICAgIFtrZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG9dIGluY2x1c2l2ZSwgcHJlc2VudGVkIGluIFtvcmRlcl0uICBJZlxuICAgICAgW2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90byA+IGtleXNfbGVzc19vcl9lcXVhbF90b10sIHRoZSBzZXF1ZW5jZSBpc1xuICAgICAgZW1wdHkuXG5cbiAgICAgIFdoZW4gbmVpdGhlciBba2V5c19ncmVhdGVyX29yX2VxdWFsX3RvXSBub3IgW2tleXNfbGVzc19vcl9lcXVhbF90b10gYXJlXG4gICAgICBwcm92aWRlZCwgdGhlIGNvc3QgaXMgTyhsb2cgbikgdXAgZnJvbnQgYW5kIGFtb3J0aXplZCBPKDEpIHRvIHByb2R1Y2VcbiAgICAgIGVhY2ggZWxlbWVudC4gSWYgZWl0aGVyIGlzIHByb3ZpZGVkIChhbmQgaXMgdXNlZCBieSB0aGUgb3JkZXIgcGFyYW1ldGVyXG4gICAgICBwcm92aWRlZCksIHRoZW4gdGhlIHRoZSBjb3N0IGlzIE8obikgdXAgZnJvbnQsIGFuZCBhbW9ydGl6ZWQgTygxKSB0b1xuICAgICAgcHJvZHVjZSBlYWNoIGVsZW1lbnQuICopXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSAoKiogZGVmYXVsdCAqKSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzona1xuICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86J2tcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrICogJ3YpIFNlcXVlbmNlLnRcblxuICAoKiogW2JpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSB3aGljaCBlbHRdIHJldHVybnMgdGhlIFsoa2V5LCB2YWx1ZSldIHBhaXIgaW4gW3RdXG4gICAgICBzcGVjaWZpZWQgYnkgW2NvbXBhcmVdIGFuZCBbd2hpY2hdLCBpZiBvbmUgZXhpc3RzLlxuXG4gICAgICBbdF0gbXVzdCBiZSBzb3J0ZWQgaW4gaW5jcmVhc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gW2NvbXBhcmVdLCB3aGVyZSBbY29tcGFyZV0gYW5kXG4gICAgICBbZWx0XSBkaXZpZGUgW3RdIGludG8gdGhyZWUgKHBvc3NpYmx5IGVtcHR5KSBzZWdtZW50czpcblxuICAgICAge3ZcbiAgICAgICAgfCAgPCBlbHQgIHwgID0gZWx0ICB8ICA+IGVsdCAgfFxuICAgICAgdn1cblxuICAgICAgW2JpbmFyeV9zZWFyY2hdIHJldHVybnMgYW4gZWxlbWVudCBvbiB0aGUgYm91bmRhcnkgb2Ygc2VnbWVudHMgYXMgc3BlY2lmaWVkIGJ5XG4gICAgICBbd2hpY2hdLiAgU2VlIHRoZSBkaWFncmFtIGJlbG93IG5leHQgdG8gdGhlIFt3aGljaF0gdmFyaWFudHMuXG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoXSBkb2VzIG5vdCBjaGVjayB0aGF0IFtjb21wYXJlXSBvcmRlcnMgW3RdLCBhbmQgYmVoYXZpb3IgaXNcbiAgICAgIHVuc3BlY2lmaWVkIGlmIFtjb21wYXJlXSBkb2Vzbid0IG9yZGVyIFt0XS4gIEJlaGF2aW9yIGlzIGFsc28gdW5zcGVjaWZpZWQgaWZcbiAgICAgIFtjb21wYXJlXSBtdXRhdGVzIFt0XS4gKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gWyBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gKCoqICAgICAgICB7diB8IDwgZWx0IFggfCAgICAgICAgICAgICAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAoKiogICAgIHt2IHwgICAgICA8PSBlbHQgICAgICAgWCB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYExhc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgICA9IGVsdCBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgRmlyc3RfZXF1YWxfdG8gKCoqICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCBYID0gZWx0ICAgfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gKCoqIHt2ICAgICAgICAgICB8IFggICAgICAgPj0gZWx0ICAgICAgfCB2fSAqKVxuICAgICAgIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAoKiogICAge3YgICAgICAgICAgICAgICAgICAgICAgIHwgWCA+IGVsdCB8IHZ9ICopXG4gICAgICAgXVxuICAgIC0+ICdrZXlcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgKCoqIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIHdoaWNoXSB0YWtlcyBhIFtzZWdtZW50X29mXSBmdW5jdGlvbiB0aGF0XG4gICAgICBkaXZpZGVzIFt0XSBpbnRvIHR3byAocG9zc2libHkgZW1wdHkpIHNlZ21lbnRzOlxuXG4gICAgICB7dlxuICAgICAgICB8IHNlZ21lbnRfb2YgZWx0ID0gYExlZnQgfCBzZWdtZW50X29mIGVsdCA9IGBSaWdodCB8XG4gICAgICB2fVxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIHJldHVybnMgdGhlIFsoa2V5LCB2YWx1ZSldIHBhaXIgb24gdGhlIGJvdW5kYXJ5IG9mIHRoZVxuICAgICAgc2VnbWVudHMgYXMgc3BlY2lmaWVkIGJ5IFt3aGljaF06IFtgTGFzdF9vbl9sZWZ0XSB5aWVsZHMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGVcbiAgICAgIGxlZnQgc2VnbWVudCwgd2hpbGUgW2BGaXJzdF9vbl9yaWdodF0geWllbGRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSByaWdodCBzZWdtZW50LlxuICAgICAgSXQgcmV0dXJucyBbTm9uZV0gaWYgdGhlIHNlZ21lbnQgaXMgZW1wdHkuXG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZF0gZG9lcyBub3QgY2hlY2sgdGhhdCBbc2VnbWVudF9vZl0gc2VnbWVudHMgW3RdIGFzIGluIHRoZVxuICAgICAgZGlhZ3JhbSwgYW5kIGJlaGF2aW9yIGlzIHVuc3BlY2lmaWVkIGlmIFtzZWdtZW50X29mXSBkb2Vzbid0IHNlZ21lbnQgW3RdLiAgQmVoYXZpb3JcbiAgICAgIGlzIGFsc28gdW5zcGVjaWZpZWQgaWYgW3NlZ21lbnRfb2ZdIG11dGF0ZXMgW3RdLiAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gc2VnbWVudF9vZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IFsgYExhc3Rfb25fbGVmdCB8IGBGaXJzdF9vbl9yaWdodCBdXG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gICgqKiBbYmluYXJ5X3NlYXJjaF9zdWJyYW5nZV0gdGFrZXMgYSBbY29tcGFyZV0gZnVuY3Rpb24gdGhhdCBkaXZpZGVzIFt0XSBpbnRvIHRocmVlXG4gICAgICAocG9zc2libHkgZW1wdHkpIHNlZ21lbnRzIHdpdGggcmVzcGVjdCB0byBbbG93ZXJfYm91bmRdIGFuZCBbdXBwZXJfYm91bmRdOlxuXG4gICAgICB7dlxuICAgICAgICB8IEJlbG93X2xvd2VyX2JvdW5kIHwgSW5fcmFuZ2UgfCBBYm92ZV91cHBlcl9ib3VuZCB8XG4gICAgICB2fVxuXG4gICAgICBhbmQgcmV0dXJucyBhIG1hcCBvZiB0aGUgW0luX3JhbmdlXSBzZWdtZW50LlxuXG4gICAgICBSdW50aW1lIGlzIE8obG9nIG0gKyBuKSB3aGVyZSBbbV0gaXMgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgbWFwIGFuZCBbbl0gaXMgdGhlXG4gICAgICBsZW5ndGggb2YgdGhlIG91dHB1dC4gVGhlIGxpbmVhciB0ZXJtIGluIFtuXSBpcyB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dC5cblxuICAgICAgQmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIFtjb21wYXJlXSBkb2VzIG5vdCBzZWdtZW50IFt0XSBhcyBzaG93biBhYm92ZSwgb3IgaWZcbiAgICAgIFtjb21wYXJlXSBtdXRhdGVzIGl0cyBpbnB1dHMuICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdib3VuZCAtPiBpbnQpXG4gICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW01dIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBPQ2FtbCBhcHBsaWNhdGl2ZSBmdW5jdG9yIHR5cGVzOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ190b19pbnRfbWFwID0gaW50IE1hcC5NKFN0cmluZykudFxuICAgICAgXX1cblxuICAgICAgd2hpY2ggc3RhbmRzIGZvcjpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfdG9faW50X21hcCA9IChTdHJpbmcudCwgaW50LCBTdHJpbmcuY29tcGFyYXRvcl93aXRuZXNzKSBNYXAudFxuICAgICAgXX1cblxuICAgICAgVGhlIHBvaW50IGlzIHRoYXQgW2ludCBNYXAuTShTdHJpbmcpLnRdIHN1cHBvcnRzIGRlcml2aW5nLCB3aGVyZWFzIHRoZSBzZWNvbmQgc3ludGF4XG4gICAgICBkb2Vzbid0IChiZWNhdXNlIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMsIHNheSwgW1N0cmluZy5zZXhwX29mX2NvbXBhcmF0b3Jfd2l0bmVzc11cbiAgICAgIC0tIGluc3RlYWQgeW91IHdvdWxkIHdhbnQgdG8gcGFzcyB0aGUgY29tcGFyYXRvciBkaXJlY3RseSkuXG5cbiAgICAgIEluIGFkZGl0aW9uLCB3aGVuIHVzaW5nIFtAQGRlcml2aW5nXSwgdGhlIHJlcXVpcmVtZW50cyBvbiB0aGUga2V5IG1vZHVsZSBhcmUgb25seVxuICAgICAgdGhvc2UgbmVlZGVkIHRvIHNhdGlzZnkgd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkZXJpdmUgb24gdGhlIG1hcCBpdHNlbGYuIFNheSB5b3VcbiAgICAgIHdyaXRlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHQgPSBpbnQgTWFwLk0oWCkudCBbQEBkZXJpdmluZyBoYXNoXVxuICAgICAgXX1cblxuICAgICAgdGhlbiB0aGlzIHdpbGwgYmUgd2VsbCB0eXBlZCBleGFjdGx5IGlmIFtYXSBjb250YWlucyBhdCBsZWFzdDpcbiAgICAgIC0gYSB0eXBlIFt0XSB3aXRoIG5vIHBhcmFtZXRlcnNcbiAgICAgIC0gYSBjb21wYXJhdG9yIHdpdG5lc3NcbiAgICAgIC0gYSBbaGFzaF9mb2xkX3RdIGZ1bmN0aW9uIHdpdGggdGhlIHJpZ2h0IHR5cGUgKilcbiAgbW9kdWxlIE0gKEsgOiBzaWdcbiAgICAgIHR5cGUgdFxuICAgICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpIDogc2lnXG4gICAgdHlwZSBub25yZWMgJ3YgdCA9IChLLnQsICd2LCBLLmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICBlbmRcblxuICBpbmNsdWRlIEZvcl9kZXJpdmluZyB3aXRoIHR5cGUgKCdrZXksICd2YWx1ZSwgJ2NtcCkgdCA6PSAoJ2tleSwgJ3ZhbHVlLCAnY21wKSB0XG5cbiAgKCoqIFtVc2luZ19jb21wYXJhdG9yXSBpcyBhIHNpbWlsYXIgaW50ZXJmYWNlIGFzIHRoZSB0b3BsZXZlbCBvZiBbTWFwXSwgZXhjZXB0IHRoZVxuICAgICAgZnVuY3Rpb25zIHRha2UgYSBbfmNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRdLCB3aGVyZWFzIHRoZSBmdW5jdGlvbnMgYXQgdGhlXG4gICAgICB0b3BsZXZlbCBvZiBbTWFwXSB0YWtlIGEgWygnaywgJ2NtcCkgY29tcGFyYXRvcl0uICopXG4gIG1vZHVsZSBVc2luZ19jb21wYXJhdG9yIDogc2lnXG4gICAgdHlwZSBub25yZWMgKCdrLCArJ3YsICdjbXApIHQgPSAoJ2ssICd2LCAnY21wKSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdFxuICAgICAgOiAgKCdrIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgndiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2NtcCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICB2YWwgdF9vZl9zZXhwX2RpcmVjdFxuICAgICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgLT4gKFNleHAudCAtPiAnaylcbiAgICAgIC0+IChTZXhwLnQgLT4gJ3YpXG4gICAgICAtPiBTZXhwLnRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAgIG1vZHVsZSBUcmVlIDogc2lnXG4gICAgICB0eXBlICgrJ2ssICsndiwgJ2NtcCkgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgICAgdmFsIHNleHBfb2ZfdFxuICAgICAgICA6ICAoJ2sgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAtPiAoJ3YgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAtPiAoJ2NtcCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICAgIFtAQEBlbmRdXG5cbiAgICAgIHZhbCB0X29mX3NleHBfZGlyZWN0XG4gICAgICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgICAgLT4gKFNleHAudCAtPiAnaylcbiAgICAgICAgLT4gKFNleHAudCAtPiAndilcbiAgICAgICAgLT4gU2V4cC50XG4gICAgICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAgICAgaW5jbHVkZVxuICAgICAgICBDcmVhdG9yc19hbmRfYWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3JcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgdFxuXG4gICAgICB2YWwgZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiA6IChfLCBfLCBfKSB0XG5cbiAgICAgICgqKiBbQnVpbGRfaW5jcmVhc2luZ10gY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGEgbWFwIGluY3JlbWVudGFsbHkgZnJvbSBhXG4gICAgICAgICAgc2VxdWVuY2UgdGhhdCBpcyBrbm93biB0byBiZSBpbmNyZWFzaW5nLlxuXG4gICAgICAgICAgVGhlIHRvdGFsIHRpbWUgY29tcGxleGl0eSBvZiBjb25zdHJ1Y3RpbmcgYSBtYXAgdGhpcyB3YXkgaXMgTyhuKSwgd2hpY2ggaXMgbW9yZVxuICAgICAgICAgIGVmZmljaWVudCB0aGFuIHVzaW5nIFtNYXAuYWRkXSBieSBhIGxvZ2FyaXRobWljIGZhY3Rvci5cblxuICAgICAgICAgIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgZHVhbCBvZiBbdG9fc2VxdWVuY2VdLCBidXQgd2UgZG9uJ3QgaGF2ZVxuICAgICAgICAgIGFuIGVxdWFsbHkgbmVhdCBpZGlvbSBmb3IgdGhlIGR1YWxzIG9mIHNlcXVlbmNlcyAoW29mX3NlcXVlbmNlXSBpcyBtdWNoIGxlc3NcbiAgICAgICAgICBnZW5lcmFsIGJlY2F1c2UgaXQgZG9lcyBub3QgYWxsb3cgdGhlIHNlcXVlbmNlIHRvIGJlIHByb2R1Y2VkIGFzeW5jaHJvbm91c2x5KS4gKilcbiAgICAgIG1vZHVsZSBCdWlsZF9pbmNyZWFzaW5nIDogc2lnXG4gICAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICAgICAgdHlwZSAoJ2ssICd2LCAndykgdFxuXG4gICAgICAgIHZhbCBlbXB0eSA6ICgnaywgJ3YsICd3KSB0XG5cbiAgICAgICAgKCoqIFRpbWUgY29tcGxleGl0eSBvZiBbYWRkX2V4bl0gaXMgYW1vcnRpemVkIGNvbnN0YW50LXRpbWUgKGlmIFt0XSBpcyB1c2VkXG4gICAgICAgICAgICBsaW5lYXJseSksIHdpdGggYSB3b3JzdC1jYXNlIE8obG9nKG4pKSB0aW1lLiAqKVxuICAgICAgICB2YWwgYWRkX2V4blxuICAgICAgICAgIDogICgnaywgJ3YsICd3KSB0XG4gICAgICAgICAgLT4gY29tcGFyYXRvcjooJ2ssICd3KSBDb21wYXJhdG9yLnRcbiAgICAgICAgICAtPiBrZXk6J2tcbiAgICAgICAgICAtPiBkYXRhOid2XG4gICAgICAgICAgLT4gKCdrLCAndiwgJ3cpIHRcblxuICAgICAgICAoKiogVGltZSBjb21wbGV4aXR5IGlzIE8obG9nKG4pKS4gKilcbiAgICAgICAgdmFsIHRvX3RyZWUgOiAoJ2ssICd2LCAndykgdCAtPiAoJ2ssICd2LCAndykgdHJlZVxuICAgICAgZW5kXG4gICAgZW5kXG5cbiAgICBpbmNsdWRlXG4gICAgICBBY2Nlc3NvcnMzXG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgVHJlZS50XG5cbiAgICBpbmNsdWRlXG4gICAgICBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yXG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgVHJlZS50XG5cbiAgICB2YWwgY29tcGFyYXRvciA6ICgnYSwgXywgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IudFxuXG4gICAgdmFsIGhhc2hfZm9sZF9kaXJlY3RcbiAgICAgIDogICdrIEhhc2guZm9sZGVyXG4gICAgICAtPiAndiBIYXNoLmZvbGRlclxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCBIYXNoLmZvbGRlclxuXG4gICAgKCoqIFRvIGdldCBhcm91bmQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uLCBhcHBseSB0aGUgZnVuY3RvciBhbmQgaW5jbHVkZSBpdC4gWW91XG4gICAgICAgIGNhbiBzZWUgYW4gZXhhbXBsZSBvZiB0aGlzIGluIHRoZSBbUG9seV0gc3VibW9kdWxlIGJlbG93LiAqKVxuICAgIG1vZHVsZSBFbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChLIDogQ29tcGFyYXRvci5TMSkgOiBzaWdcbiAgICAgIHZhbCBlbXB0eSA6ICgnYSBLLnQsICd2LCBLLmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICAgIGVuZFxuICBlbmRcblxuICAoKiogQSBwb2x5bW9ycGhpYyBNYXAuICopXG4gIG1vZHVsZSBQb2x5IDpcbiAgICBTX3BvbHlcbiAgICB3aXRoIHR5cGUgKCdrZXksICsndmFsdWUpIHQgPSAoJ2tleSwgJ3ZhbHVlLCBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gICAgIGFuZCB0eXBlICgna2V5LCArJ3ZhbHVlKSB0cmVlID1cbiAgICAgICAgICAgKCdrZXksICd2YWx1ZSwgQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzcykgVXNpbmdfY29tcGFyYXRvci5UcmVlLnRcbiAgICAgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gICgqKiBDcmVhdGUgYSBtYXAgZnJvbSBhIHRyZWUgdXNpbmcgdGhlIGdpdmVuIGNvbXBhcmF0b3IuICopXG4gIHZhbCBvZl90cmVlXG4gICAgOiAgKCdrLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgVXNpbmdfY29tcGFyYXRvci5UcmVlLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIEV4dHJhY3QgYSB0cmVlIGZyb20gYSBtYXAuICopXG4gIHZhbCB0b190cmVlIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSBVc2luZ19jb21wYXJhdG9yLlRyZWUudFxuXG5cbiAgKCoqIHsyIE1vZHVsZXMgYW5kIG1vZHVsZSB0eXBlcyBmb3IgZXh0ZW5kaW5nIFtNYXBdfVxuXG4gICAgICBGb3IgdXNlIGluIGV4dGVuc2lvbnMgb2YgQmFzZSwgbGlrZSBbQ29yZV0uICopXG5cbiAgbW9kdWxlIFdpdGhfY29tcGFyYXRvciA9IFdpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgV2l0aF9maXJzdF9jbGFzc19tb2R1bGUgPSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZVxuICBtb2R1bGUgV2l0aG91dF9jb21wYXJhdG9yID0gV2l0aG91dF9jb21wYXJhdG9yXG5cbiAgbW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gRm9yX2Rlcml2aW5nXG4gIG1vZHVsZSB0eXBlIFNfcG9seSA9IFNfcG9seVxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMxID0gQWNjZXNzb3JzMVxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMyID0gQWNjZXNzb3JzMlxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMzID0gQWNjZXNzb3JzM1xuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvciA9IEFjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yc19nZW5lcmljID0gQWNjZXNzb3JzX2dlbmVyaWNcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMxID0gQ3JlYXRvcnMxXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMiA9IENyZWF0b3JzMlxuICBtb2R1bGUgdHlwZSBDcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yID0gQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMSA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJcblxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IgPVxuICAgIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvclxuXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnNfZ2VuZXJpYyA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnNfZ2VuZXJpY1xuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gQ3JlYXRvcnNfZ2VuZXJpY1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIFRcblxubW9kdWxlIHR5cGUgRWx0X3BsYWluID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIFdpdGhvdXRfY29tcGFyYXRvciA9IE1hcF9pbnRmLldpdGhvdXRfY29tcGFyYXRvclxubW9kdWxlIFdpdGhfY29tcGFyYXRvciA9IE1hcF9pbnRmLldpdGhfY29tcGFyYXRvclxubW9kdWxlIFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlID0gTWFwX2ludGYuV2l0aF9maXJzdF9jbGFzc19tb2R1bGVcbm1vZHVsZSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50ID0gU2VxdWVuY2UuTWVyZ2Vfd2l0aF9kdXBsaWNhdGVzX2VsZW1lbnRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzX2dlbmVyaWMgPSBzaWdcbiAgaW5jbHVkZSBDb250YWluZXIuR2VuZXJpY19waGFudG9tXG5cbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcblxuICAoKiogVGhlIFtvcHRpb25zXSB0eXBlIGlzIHVzZWQgdG8gbWFrZSBbQWNjZXNzb3JzX2dlbmVyaWNdIGZsZXhpYmxlIGFzIHRvIHdoZXRoZXIgYVxuICAgICAgY29tcGFyYXRvciBpcyByZXF1aXJlZCB0byBiZSBwYXNzZWQgdG8gY2VydGFpbiBmdW5jdGlvbnMuICopXG4gIHR5cGUgKCdhLCAnY21wLCAneikgb3B0aW9uc1xuXG4gIHR5cGUgJ2NtcCBjbXBcblxuICB2YWwgaW52YXJpYW50cyA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+IGJvb2wpIG9wdGlvbnNcblxuICAoKiogb3ZlcnJpZGUgW0NvbnRhaW5lcl0ncyBbbWVtXSAqKVxuICB2YWwgbWVtIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gJ2EgZWx0IC0+IGJvb2wpIG9wdGlvbnNcblxuICB2YWwgYWRkIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gJ2EgZWx0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgcmVtb3ZlIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gJ2EgZWx0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgdW5pb24gOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBpbnRlciA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIGRpZmYgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EgZWx0LCAnYSBlbHQpIEVpdGhlci50IFNlcXVlbmNlLnQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGludCkgb3B0aW9uc1xuICB2YWwgZXF1YWwgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbCkgb3B0aW9uc1xuICB2YWwgaXNfc3Vic2V0IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gb2ZfOignYSwgJ2NtcCkgdCAtPiBib29sKSBvcHRpb25zXG4gIHZhbCBhcmVfZGlzam9pbnQgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbCkgb3B0aW9uc1xuXG4gIHR5cGUgKCdhLCAnY21wKSBuYW1lZFxuXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHZhbCBpc19zdWJzZXRcbiAgICAgIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIG5hbWVkIC0+IG9mXzooJ2EsICdjbXApIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gICAgdmFsIGVxdWFsXG4gICAgICA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSBuYW1lZCAtPiAoJ2EsICdjbXApIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudCkgb3B0aW9uc1xuICBlbmRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiAnYSBlbHQgLT4gKCdiLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYiAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYiAtPiBmOignYSBlbHQgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0XG4gICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgIC0+IGY6KFsgYExlZnQgb2YgJ2EgZWx0IHwgYFJpZ2h0IG9mICdhIGVsdCB8IGBCb3RoIG9mICdhIGVsdCAqICdhIGVsdCBdIC0+IHVuaXQpXG4gICAgICAtPiB1bml0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0ICogKCdhLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBlbGVtZW50cyA6ICgnYSwgXykgdCAtPiAnYSBlbHQgbGlzdFxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYSBlbHRcbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0XG4gIHZhbCBjaG9vc2UgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6ICgnYSwgXykgdCAtPiAnYSBlbHRcblxuICB2YWwgc3BsaXRcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHQgLT4gJ2EgZWx0IC0+ICgnYSwgJ2NtcCkgdCAqICdhIGVsdCBvcHRpb24gKiAoJ2EsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGdyb3VwX2J5XG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0IC0+IGVxdWl2OignYSBlbHQgLT4gJ2EgZWx0IC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCBsaXN0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gJ2EgZWx0XG4gIHZhbCBudGggOiAoJ2EsIF8pIHQgLT4gaW50IC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIHJlbW92ZV9pbmRleCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+IGludCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdjbXApIHQgLT4gKCdhIGVsdCwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2EgZWx0XG4gICAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYSBlbHRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gJ2EgZWx0IFNlcXVlbmNlLnQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHRcbiAgICAgIC0+IGNvbXBhcmU6KCdhIGVsdCAtPiAna2V5IC0+IGludClcbiAgICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgICAgLT4gJ2tleVxuICAgICAgLT4gJ2EgZWx0IG9wdGlvbiApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHRcbiAgICAgIC0+IHNlZ21lbnRfb2Y6KCdhIGVsdCAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgICAtPiAnYSBlbHQgb3B0aW9uIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2EgZWx0XG4gICAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYSBlbHRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAtPiAoJ2EgZWx0LCAnYSBlbHQpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50IClcbiAgICAgICAgb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczAgPSBzaWdcbiAgaW5jbHVkZSBDb250YWluZXIuUzBcblxuICB0eXBlIHRyZWVcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgaW52YXJpYW50cyA6IHQgLT4gYm9vbFxuICB2YWwgbWVtIDogdCAtPiBlbHQgLT4gYm9vbFxuICB2YWwgYWRkIDogdCAtPiBlbHQgLT4gdFxuICB2YWwgcmVtb3ZlIDogdCAtPiBlbHQgLT4gdFxuICB2YWwgdW5pb24gOiB0IC0+IHQgLT4gdFxuICB2YWwgaW50ZXIgOiB0IC0+IHQgLT4gdFxuICB2YWwgZGlmZiA6IHQgLT4gdCAtPiB0XG4gIHZhbCBzeW1tZXRyaWNfZGlmZiA6IHQgLT4gdCAtPiAoZWx0LCBlbHQpIEVpdGhlci50IFNlcXVlbmNlLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogdCAtPiB0IC0+IGludFxuICB2YWwgZXF1YWwgOiB0IC0+IHQgLT4gYm9vbFxuICB2YWwgaXNfc3Vic2V0IDogdCAtPiBvZl86dCAtPiBib29sXG4gIHZhbCBhcmVfZGlzam9pbnQgOiB0IC0+IHQgLT4gYm9vbFxuXG4gIHR5cGUgbmFtZWRcblxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB2YWwgaXNfc3Vic2V0IDogbmFtZWQgLT4gb2ZfOm5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICAgIHZhbCBlcXVhbCA6IG5hbWVkIC0+IG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICBlbmRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogIHRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gZWx0IC0+ICgnYiwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2IgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogdCAtPiBpbml0OidiIC0+IGY6KGVsdCAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgaXRlcjJcbiAgICA6ICB0XG4gICAgLT4gdFxuICAgIC0+IGY6KFsgYExlZnQgb2YgZWx0IHwgYFJpZ2h0IG9mIGVsdCB8IGBCb3RoIG9mIGVsdCAqIGVsdCBdIC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXIgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiB0XG4gIHZhbCBwYXJ0aXRpb25fdGYgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiB0ICogdFxuICB2YWwgZWxlbWVudHMgOiB0IC0+IGVsdCBsaXN0XG4gIHZhbCBtaW5fZWx0IDogdCAtPiBlbHQgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6IHQgLT4gZWx0XG4gIHZhbCBtYXhfZWx0IDogdCAtPiBlbHQgb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6IHQgLT4gZWx0XG4gIHZhbCBjaG9vc2UgOiB0IC0+IGVsdCBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiB0IC0+IGVsdFxuICB2YWwgc3BsaXQgOiB0IC0+IGVsdCAtPiB0ICogZWx0IG9wdGlvbiAqIHRcbiAgdmFsIGdyb3VwX2J5IDogdCAtPiBlcXVpdjooZWx0IC0+IGVsdCAtPiBib29sKSAtPiB0IGxpc3RcbiAgdmFsIGZpbmRfZXhuIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gZWx0XG4gIHZhbCBudGggOiB0IC0+IGludCAtPiBlbHQgb3B0aW9uXG4gIHZhbCByZW1vdmVfaW5kZXggOiB0IC0+IGludCAtPiB0XG4gIHZhbCB0b190cmVlIDogdCAtPiB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86ZWx0XG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86ZWx0XG4gICAgLT4gdFxuICAgIC0+IGVsdCBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICB0XG4gICAgLT4gY29tcGFyZTooZWx0IC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiBlbHQgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGVsdCAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+IGVsdCBvcHRpb25cblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzplbHRcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzplbHRcbiAgICAtPiB0XG4gICAgLT4gdFxuICAgIC0+IChlbHQsIGVsdCkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMxID0gc2lnXG4gIGluY2x1ZGUgQ29udGFpbmVyLlMxXG5cbiAgdHlwZSAnYSB0cmVlXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGludmFyaWFudHMgOiBfIHQgLT4gYm9vbFxuICB2YWwgbWVtIDogJ2EgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBhZGQgOiAnYSB0IC0+ICdhIC0+ICdhIHRcbiAgdmFsIHJlbW92ZSA6ICdhIHQgLT4gJ2EgLT4gJ2EgdFxuICB2YWwgdW5pb24gOiAnYSB0IC0+ICdhIHQgLT4gJ2EgdFxuICB2YWwgaW50ZXIgOiAnYSB0IC0+ICdhIHQgLT4gJ2EgdFxuICB2YWwgZGlmZiA6ICdhIHQgLT4gJ2EgdCAtPiAnYSB0XG4gIHZhbCBzeW1tZXRyaWNfZGlmZiA6ICdhIHQgLT4gJ2EgdCAtPiAoJ2EsICdhKSBFaXRoZXIudCBTZXF1ZW5jZS50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICdhIHQgLT4gJ2EgdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogJ2EgdCAtPiAnYSB0IC0+IGJvb2xcbiAgdmFsIGlzX3N1YnNldCA6ICdhIHQgLT4gb2ZfOidhIHQgLT4gYm9vbFxuICB2YWwgYXJlX2Rpc2pvaW50IDogJ2EgdCAtPiAnYSB0IC0+IGJvb2xcblxuICB0eXBlICdhIG5hbWVkXG5cbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdmFsIGlzX3N1YnNldCA6ICdhIG5hbWVkIC0+IG9mXzonYSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgICB2YWwgZXF1YWwgOiAnYSBuYW1lZCAtPiAnYSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgZW5kXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+ICdhIC0+ICgnYiwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2IgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogJ2EgdCAtPiBpbml0OidiIC0+IGY6KCdhIC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBpdGVyMlxuICAgIDogICdhIHRcbiAgICAtPiAnYSB0XG4gICAgLT4gZjooWyBgTGVmdCBvZiAnYSB8IGBSaWdodCBvZiAnYSB8IGBCb3RoIG9mICdhICogJ2EgXSAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSB0XG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIHQgKiAnYSB0XG4gIHZhbCBlbGVtZW50cyA6ICdhIHQgLT4gJ2EgbGlzdFxuICB2YWwgbWluX2VsdCA6ICdhIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICdhIHQgLT4gJ2FcbiAgdmFsIG1heF9lbHQgOiAnYSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAnYSB0IC0+ICdhXG4gIHZhbCBjaG9vc2UgOiAnYSB0IC0+ICdhIG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6ICdhIHQgLT4gJ2FcbiAgdmFsIHNwbGl0IDogJ2EgdCAtPiAnYSAtPiAnYSB0ICogJ2Egb3B0aW9uICogJ2EgdFxuICB2YWwgZ3JvdXBfYnkgOiAnYSB0IC0+IGVxdWl2OignYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IGxpc3RcbiAgdmFsIGZpbmRfZXhuIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYVxuICB2YWwgbnRoIDogJ2EgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uXG4gIHZhbCByZW1vdmVfaW5kZXggOiAnYSB0IC0+IGludCAtPiAnYSB0XG4gIHZhbCB0b190cmVlIDogJ2EgdCAtPiAnYSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICdhIHRcbiAgICAtPiAnYSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAnYSB0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICdhIHRcbiAgICAtPiBzZWdtZW50X29mOignYSAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAnYSB0XG4gICAgLT4gJ2EgdFxuICAgIC0+ICgnYSwgJ2EpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMiA9IHNpZ1xuICBpbmNsdWRlIENvbnRhaW5lci5TMV9waGFudG9tX2ludmFyaWFudFxuXG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIGludmFyaWFudHMgOiAoXywgXykgdCAtPiBib29sXG4gIHZhbCBtZW0gOiAoJ2EsIF8pIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgYWRkIDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgcmVtb3ZlIDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgdW5pb24gOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgaW50ZXIgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgZGlmZiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBzeW1tZXRyaWNfZGlmZiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnYSkgRWl0aGVyLnQgU2VxdWVuY2UudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGludFxuICB2YWwgZXF1YWwgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIGlzX3N1YnNldCA6ICgnYSwgJ2NtcCkgdCAtPiBvZl86KCdhLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIGFyZV9kaXNqb2ludCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuXG4gIHR5cGUgKCdhLCAnY21wKSBuYW1lZFxuXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHZhbCBpc19zdWJzZXQgOiAoJ2EsICdjbXApIG5hbWVkIC0+IG9mXzooJ2EsICdjbXApIG5hbWVkIC0+IHVuaXQgT3JfZXJyb3IudFxuICAgIHZhbCBlcXVhbCA6ICgnYSwgJ2NtcCkgbmFtZWQgLT4gKCdhLCAnY21wKSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgZW5kXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gJ2EgLT4gKCdiLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYiAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYiAtPiBmOignYSAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgaXRlcjJcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBmOihbIGBMZWZ0IG9mICdhIHwgYFJpZ2h0IG9mICdhIHwgYEJvdGggb2YgJ2EgKiAnYSBdIC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdjbXApIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAoJ2EsICdjbXApIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0ICogKCdhLCAnY21wKSB0XG4gIHZhbCBlbGVtZW50cyA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuICB2YWwgY2hvb3NlIDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgY2hvb3NlX2V4biA6ICgnYSwgXykgdCAtPiAnYVxuICB2YWwgc3BsaXQgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0ICogJ2Egb3B0aW9uICogKCdhLCAnY21wKSB0XG4gIHZhbCBncm91cF9ieSA6ICgnYSwgJ2NtcCkgdCAtPiBlcXVpdjooJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0IGxpc3RcbiAgdmFsIGZpbmRfZXhuIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhXG4gIHZhbCBudGggOiAoJ2EsIF8pIHQgLT4gaW50IC0+ICdhIG9wdGlvblxuICB2YWwgcmVtb3ZlX2luZGV4IDogKCdhLCAnY21wKSB0IC0+IGludCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICdhIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiBzZWdtZW50X29mOignYSAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdhKSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIGluY2x1ZGUgQ29udGFpbmVyLlMxX3BoYW50b21faW52YXJpYW50XG5cbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgaW52YXJpYW50cyA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIG1lbSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGFkZCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgcmVtb3ZlIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIHVuaW9uXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBpbnRlclxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgZGlmZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYSkgRWl0aGVyLnQgU2VxdWVuY2UudFxuXG4gIHZhbCBjb21wYXJlX2RpcmVjdFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBpbnRcblxuICB2YWwgZXF1YWwgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuXG4gIHZhbCBpc19zdWJzZXRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gb2ZfOignYSwgJ2NtcCkgdFxuICAgIC0+IGJvb2xcblxuICB2YWwgYXJlX2Rpc2pvaW50XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGJvb2xcblxuICB0eXBlICgnYSwgJ2NtcCkgbmFtZWRcblxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB2YWwgaXNfc3Vic2V0XG4gICAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAtPiAoJ2EsICdjbXApIG5hbWVkXG4gICAgICAtPiBvZl86KCdhLCAnY21wKSBuYW1lZFxuICAgICAgLT4gdW5pdCBPcl9lcnJvci50XG5cbiAgICB2YWwgZXF1YWxcbiAgICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgbmFtZWRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgbmFtZWRcbiAgICAgIC0+IHVuaXQgT3JfZXJyb3IudFxuICBlbmRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2EgLT4gJ2FjY3VtIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGY6KFsgYExlZnQgb2YgJ2EgfCBgUmlnaHQgb2YgJ2EgfCBgQm90aCBvZiAnYSAqICdhIF0gLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIGZpbHRlclxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBmOignYSAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZjooJ2EgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdjbXApIHQgKiAoJ2EsICdjbXApIHRcblxuICB2YWwgZWxlbWVudHMgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcbiAgdmFsIGNob29zZSA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcblxuICB2YWwgc3BsaXRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiAoJ2EsICdjbXApIHQgKiAnYSBvcHRpb24gKiAoJ2EsICdjbXApIHRcblxuICB2YWwgZ3JvdXBfYnlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZXF1aXY6KCdhIC0+ICdhIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnY21wKSB0IGxpc3RcblxuICB2YWwgZmluZF9leG4gOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2FcbiAgdmFsIG50aCA6ICgnYSwgXykgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIHJlbW92ZV9pbmRleFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBpbnRcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICdhIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOignYSAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KCdhIC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdhKSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudFxuZW5kXG5cbigqKiBDb25zaXN0ZW5jeSBjaGVja3MgKHNhbWUgYXMgaW4gW0NvbnRhaW5lcl0pLiAqKVxubW9kdWxlIENoZWNrX2FjY2Vzc29yc1xuICAgIChUIDogVDIpXG4gICAgKFRyZWUgOiBUMilcbiAgICAoRWx0IDogVDEpXG4gICAgKE5hbWVkIDogVDIpXG4gICAgKENtcCA6IFQxKVxuICAgIChPcHRpb25zIDogVDMpXG4gICAgKF8gOiBBY2Nlc3NvcnNfZ2VuZXJpY1xuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIE9wdGlvbnMudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSBULnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgVHJlZS50XG4gICAgIHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgRWx0LnRcbiAgICAgd2l0aCB0eXBlICdjbXAgY21wIDo9ICdjbXAgQ21wLnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIG5hbWVkIDo9ICgnYSwgJ2IpIE5hbWVkLnQpID1cbnN0cnVjdCBlbmRcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczAgKE0gOiBBY2Nlc3NvcnMwKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9IE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5lbHRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gTS5uYW1lZFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMSAoTSA6IEFjY2Vzc29yczEpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gJ2EgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICdhIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAnYSBNLm5hbWVkXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMyIChNIDogQWNjZXNzb3JzMikgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0ubmFtZWRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yIChNIDogQWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLm5hbWVkXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChXaXRoX2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBzaWdcbiAgdHlwZSAoJ2EsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdjbXApIHNldFxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuICB0eXBlICdhIGVsdFxuICB0eXBlICgnYSwgJ2NtcCwgJ3opIG9wdGlvbnNcbiAgdHlwZSAnY21wIGNtcFxuXG4gIHZhbCBlbXB0eSA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBzaW5nbGV0b24gOiAoJ2EsICdjbXAsICdhIGVsdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHVuaW9uX2xpc3QgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCBsaXN0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgb2ZfbGlzdCA6ICgnYSwgJ2NtcCwgJ2EgZWx0IGxpc3QgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBvZl9zZXF1ZW5jZSA6ICgnYSwgJ2NtcCwgJ2EgZWx0IFNlcXVlbmNlLnQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBvZl9hcnJheSA6ICgnYSwgJ2NtcCwgJ2EgZWx0IGFycmF5IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogKCdhLCAnY21wLCAnYSBlbHQgYXJyYXkgLT4gKCdhLCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiAoJ2EsICdjbXAsICdhIGVsdCBhcnJheSAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICgnYSwgJ2NtcCwgbGVuOmludCAtPiBmOihpbnQgLT4gJ2EgZWx0KSAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiAoJ2EsIF8sICdhIGVsdCBsaXN0IC0+ICdhIGVsdCBsaXN0KSBvcHRpb25zXG5cbiAgKCoqIFRoZSB0eXBlcyBvZiBbbWFwXSBhbmQgW2ZpbHRlcl9tYXBdIGFyZSBzdWJ0bGUuICBUaGUgaW5wdXQgc2V0LCBbKCdhLCBfKSBzZXRdLFxuICAgICAgcmVmbGVjdHMgdGhlIGZhY3QgdGhhdCB0aGVzZSBmdW5jdGlvbnMgdGFrZSBhIHNldCBvZiAqYW55KiB0eXBlLCB3aXRoIGFueVxuICAgICAgY29tcGFyYXRvciwgd2hpbGUgdGhlIG91dHB1dCBzZXQsIFsoJ2IsICdjbXApIHRdLCByZWZsZWN0cyB0aGF0IHRoZSBvdXRwdXQgc2V0IGhhc1xuICAgICAgdGhlIHBhcnRpY3VsYXIgWydjbXBdIG9mIHRoZSBjcmVhdGlvbiBmdW5jdGlvbi4gIFRoZSBjb21wYXJhdG9yIGNhbiBjb21lIGluIG9uZSBvZlxuICAgICAgdGhyZWUgd2F5cywgZGVwZW5kaW5nIG9uIHdoaWNoIHNldCBtb2R1bGUgaXMgdXNlZFxuXG4gICAgICAtIFtTZXQubWFwXSAtLSBjb21wYXJhdG9yIGNvbWVzIGFzIGFuIGFyZ3VtZW50XG4gICAgICAtIFtTZXQuUG9seS5tYXBdIC0tIGNvbXBhcmF0b3IgaXMgcG9seW1vcnBoaWMgY29tcGFyaXNvblxuICAgICAgLSBbRm9vLlNldC5tYXBdIC0tIGNvbXBhcmF0b3IgaXMgW0Zvby5jb21wYXJhdG9yXSAqKVxuICB2YWwgbWFwIDogKCdiLCAnY21wLCAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYiBlbHQpIC0+ICgnYiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXJfbWFwXG4gICAgOiAoJ2IsICdjbXAsICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiIGVsdCBvcHRpb24pIC0+ICgnYiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl90cmVlIDogKCdhLCAnY21wLCAoJ2EgZWx0LCAnY21wKSB0cmVlIC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMCA9IHNpZ1xuICB0eXBlICgnYSwgJ2NtcCkgc2V0XG4gIHR5cGUgdFxuICB0eXBlIHRyZWVcbiAgdHlwZSBlbHRcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgZW1wdHkgOiB0XG4gIHZhbCBzaW5nbGV0b24gOiBlbHQgLT4gdFxuICB2YWwgdW5pb25fbGlzdCA6IHQgbGlzdCAtPiB0XG4gIHZhbCBvZl9saXN0IDogZWx0IGxpc3QgLT4gdFxuICB2YWwgb2Zfc2VxdWVuY2UgOiBlbHQgU2VxdWVuY2UudCAtPiB0XG4gIHZhbCBvZl9hcnJheSA6IGVsdCBhcnJheSAtPiB0XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiBlbHQgYXJyYXkgLT4gdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogZWx0IGFycmF5IC0+IHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIDogbGVuOmludCAtPiBmOihpbnQgLT4gZWx0KSAtPiB0XG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6IGVsdCBsaXN0IC0+IGVsdCBsaXN0XG4gIHZhbCBtYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiBlbHQpIC0+IHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiBlbHQgb3B0aW9uKSAtPiB0XG4gIHZhbCBvZl90cmVlIDogdHJlZSAtPiB0XG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMxID0gc2lnXG4gIHR5cGUgKCdhLCAnY21wKSBzZXRcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2EgdHJlZVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBlbXB0eSA6ICdhIHRcbiAgdmFsIHNpbmdsZXRvbiA6ICdhIC0+ICdhIHRcbiAgdmFsIHVuaW9uX2xpc3QgOiAnYSB0IGxpc3QgLT4gJ2EgdFxuICB2YWwgb2ZfbGlzdCA6ICdhIGxpc3QgLT4gJ2EgdFxuICB2YWwgb2Zfc2VxdWVuY2UgOiAnYSBTZXF1ZW5jZS50IC0+ICdhIHRcbiAgdmFsIG9mX2FycmF5IDogJ2EgYXJyYXkgLT4gJ2EgdFxuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogJ2EgYXJyYXkgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogJ2EgYXJyYXkgLT4gJ2EgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgOiBsZW46aW50IC0+IGY6KGludCAtPiAnYSkgLT4gJ2EgdFxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiAnYSBsaXN0IC0+ICdhIGxpc3RcbiAgdmFsIG1hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiKSAtPiAnYiB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiB0XG4gIHZhbCBvZl90cmVlIDogJ2EgdHJlZSAtPiAnYSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMyID0gc2lnXG4gIHR5cGUgKCdhLCAnY21wKSBzZXRcbiAgdHlwZSAoJ2EsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgZW1wdHkgOiAoJ2EsICdjbXApIHRcbiAgdmFsIHNpbmdsZXRvbiA6ICdhIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgdW5pb25fbGlzdCA6ICgnYSwgJ2NtcCkgdCBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfbGlzdCA6ICdhIGxpc3QgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9zZXF1ZW5jZSA6ICdhIFNlcXVlbmNlLnQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9hcnJheSA6ICdhIGFycmF5IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogJ2EgYXJyYXkgLT4gKCdhLCAnY21wKSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgOiAnYSBhcnJheSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIDogbGVuOmludCAtPiBmOihpbnQgLT4gJ2EpIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiAnYSBsaXN0IC0+ICdhIGxpc3RcbiAgdmFsIG1hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdjbXApIHRcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICgnYiwgJ2NtcCkgdFxuICB2YWwgb2ZfdHJlZSA6ICgnYSwgJ2NtcCkgdHJlZSAtPiAoJ2EsICdjbXApIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIHR5cGUgKCdhLCAnY21wKSBzZXRcbiAgdHlwZSAoJ2EsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcblxuICB2YWwgZW1wdHkgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgc2luZ2xldG9uIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHVuaW9uX2xpc3QgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfbGlzdCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgbGlzdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX3NlcXVlbmNlIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfYXJyYXkgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIGFycmF5IC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gJ2EgYXJyYXlcbiAgICAtPiAoJ2EsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICdhIGFycmF5XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiBmOihpbnQgLT4gJ2EpXG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSBsaXN0IC0+ICdhIGxpc3RcblxuICB2YWwgbWFwXG4gICAgOiAgY29tcGFyYXRvcjooJ2IsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgXykgc2V0XG4gICAgLT4gZjooJ2EgLT4gJ2IpXG4gICAgLT4gKCdiLCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlcl9tYXBcbiAgICA6ICBjb21wYXJhdG9yOignYiwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCBfKSBzZXRcbiAgICAtPiBmOignYSAtPiAnYiBvcHRpb24pXG4gICAgLT4gKCdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX3RyZWUgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdHJlZSAtPiAoJ2EsICdjbXApIHRcbmVuZFxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnNcbiAgICAoVCA6IFQyKVxuICAgIChUcmVlIDogVDIpXG4gICAgKEVsdCA6IFQxKVxuICAgIChDbXAgOiBUMSlcbiAgICAoT3B0aW9ucyA6IFQzKVxuICAgIChfIDogQ3JlYXRvcnNfZ2VuZXJpY1xuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIE9wdGlvbnMudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSBULnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgVHJlZS50XG4gICAgIHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgRWx0LnRcbiAgICAgd2l0aCB0eXBlICdjbXAgY21wIDo9ICdjbXAgQ21wLnQpID1cbnN0cnVjdCBlbmRcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMCAoTSA6IENyZWF0b3JzMCkgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9IE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5lbHRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnY21wIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMxIChNIDogQ3JlYXRvcnMxKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gJ2EgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICdhIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdjbXAgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczIgKE0gOiBDcmVhdG9yczIpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2NtcCB0ID0gJ2NtcFxuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvciAoTSA6IENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3IpID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2NtcCB0ID0gJ2NtcFxuICAgIGVuZClcbiAgICAoV2l0aF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzX2dlbmVyaWMgPSBzaWdcbiAgaW5jbHVkZSBBY2Nlc3NvcnNfZ2VuZXJpY1xuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yc19nZW5lcmljXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBvcHRpb25zXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIHRyZWVcbiAgICB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIGVsdFxuICAgIHdpdGggdHlwZSAnY21wIGNtcCA6PSAnY21wIGNtcFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMwID0gc2lnXG4gIGluY2x1ZGUgQWNjZXNzb3JzMFxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yczBcbiAgICB3aXRoIHR5cGUgdCA6PSB0XG4gICAgd2l0aCB0eXBlIHRyZWUgOj0gdHJlZVxuICAgIHdpdGggdHlwZSBlbHQgOj0gZWx0XG4gICAgd2l0aCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA6PSBjb21wYXJhdG9yX3dpdG5lc3NcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMSA9IHNpZ1xuICBpbmNsdWRlIEFjY2Vzc29yczFcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnMxXG4gICAgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICAgIHdpdGggdHlwZSAnYSB0cmVlIDo9ICdhIHRyZWVcbiAgICB3aXRoIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzIDo9IGNvbXBhcmF0b3Jfd2l0bmVzc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyID0gc2lnXG4gIGluY2x1ZGUgQWNjZXNzb3JzMlxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yczIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSB0cmVlXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIGluY2x1ZGUgQWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3JcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvclxuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSB0cmVlXG5lbmRcblxubW9kdWxlIHR5cGUgU19wb2x5ID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczFcblxubW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuXG4gIG1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gICAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgaW5jbHVkZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgOj0gdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gICAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgQ29tcGFyZV9tID0gc2lnIGVuZFxuICBtb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxuICBtb2R1bGUgdHlwZSBIYXNoX2ZvbGRfbSA9IEhhc2hlci5TXG5cbiAgdmFsIHNleHBfb2ZfbV9fdCA6IChtb2R1bGUgU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gJ2VsdCkgLT4gKCdlbHQsICdjbXApIHQgLT4gU2V4cC50XG5cbiAgdmFsIG1fX3Rfb2Zfc2V4cFxuICAgIDogIChtb2R1bGUgTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gJ2VsdCBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSAnY21wKVxuICAgIC0+IFNleHAudFxuICAgIC0+ICgnZWx0LCAnY21wKSB0XG5cbiAgdmFsIG1fX3Rfc2V4cF9ncmFtbWFyXG4gICAgOiAgKG1vZHVsZSBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9ICdlbHQpXG4gICAgLT4gKCdlbHQsICdjbXApIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICB2YWwgY29tcGFyZV9tX190IDogKG1vZHVsZSBDb21wYXJlX20pIC0+ICgnZWx0LCAnY21wKSB0IC0+ICgnZWx0LCAnY21wKSB0IC0+IGludFxuICB2YWwgZXF1YWxfbV9fdCA6IChtb2R1bGUgRXF1YWxfbSkgLT4gKCdlbHQsICdjbXApIHQgLT4gKCdlbHQsICdjbXApIHQgLT4gYm9vbFxuXG4gIHZhbCBoYXNoX2ZvbGRfbV9fdFxuICAgIDogIChtb2R1bGUgSGFzaF9mb2xkX20gd2l0aCB0eXBlIHQgPSAnZWx0KVxuICAgIC0+IEhhc2guc3RhdGVcbiAgICAtPiAoJ2VsdCwgXykgdFxuICAgIC0+IEhhc2guc3RhdGVcblxuICB2YWwgaGFzaF9tX190IDogKG1vZHVsZSBIYXNoX2ZvbGRfbSB3aXRoIHR5cGUgdCA9ICdlbHQpIC0+ICgnZWx0LCBfKSB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNldCA9IHNpZ1xuICAoKiogU2V0cyBiYXNlZCBvbiB7IUNvbXBhcmF0b3IuU30uXG5cbiAgICAgIENyZWF0b3JzIHJlcXVpcmUgYSBjb21wYXJhdG9yIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCBpbiwgd2hlcmVhcyBhY2Nlc3NvcnMgdXNlIHRoZVxuICAgICAgY29tcGFyYXRvciBwcm92aWRlZCBieSB0aGUgaW5wdXQgc2V0LiAqKVxuXG4gICgqKiBUaGUgdHlwZSBvZiBhIHNldC4gIFRoZSBmaXJzdCB0eXBlIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50LCBhbmRcbiAgICAgIHRoZSBzZWNvbmQgaWRlbnRpZmllcyB0aGUgY29tcGFyYXRvciwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB0aGF0XG4gICAgICBpcyB1c2VkIGZvciBvcmRlcmluZyBlbGVtZW50cyBpbiB0aGlzIHNldC4gIE1hbnkgb3BlcmF0aW9ucyAoZS5nLiwgeyF1bmlvbn0pLFxuICAgICAgcmVxdWlyZSB0aGF0IHRoZXkgYmUgcGFzc2VkIHNldHMgd2l0aCB0aGUgc2FtZSBlbGVtZW50IHR5cGUgYW5kIHRoZSBzYW1lIGNvbXBhcmF0b3JcbiAgICAgIHR5cGUuICopXG4gIHR5cGUgKCdlbHQsICdjbXApIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmVdXG5cbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMiB3aXRoIHR5cGUgKCdlbHQsICdjbXApIHQgOj0gKCdlbHQsICdjbXApIHRcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgKCdrLCAnY21wKSBjb21wYXJhdG9yID0gKCdrLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gIFtAQGRlcHJlY2F0ZWQgXCJbc2luY2UgMjAyMS0xMl0gdXNlIFtDb21wYXJhdG9yLk1vZHVsZS50XSBpbnN0ZWFkXCJdXG5cbiAgKCoqIFRlc3RzIGludGVybmFsIGludmFyaWFudHMgb2YgdGhlIHNldCBkYXRhIHN0cnVjdHVyZS4gIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqKVxuICB2YWwgaW52YXJpYW50cyA6IChfLCBfKSB0IC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBhIGZpcnN0LWNsYXNzIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIG90aGVyIG1hcC9zZXQvZXRjXG4gICAgICB3aXRoIHRoZSBzYW1lIG5vdGlvbiBvZiBjb21wYXJpc29uLiAqKVxuICB2YWwgY29tcGFyYXRvcl9zIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuXG4gIHZhbCBjb21wYXJhdG9yIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci50XG5cbiAgKCoqIENyZWF0ZXMgYW4gZW1wdHkgc2V0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb21wYXJhdG9yLiAqKVxuICB2YWwgZW1wdHkgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSBzZXQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbXBhcmF0b3IgdGhhdCBjb250YWlucyBvbmx5IHRoZSBwcm92aWRlZFxuICAgICAgZWxlbWVudC4gKilcbiAgdmFsIHNpbmdsZXRvbiA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogUmV0dXJucyB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHNldC4gW08oMSldLiAqKVxuICB2YWwgbGVuZ3RoIDogKF8sIF8pIHQgLT4gaW50XG5cbiAgKCoqIFtpc19lbXB0eSB0XSBpcyBbdHJ1ZV0gaWZmIFt0XSBpcyBlbXB0eS4gIFtPKDEpXS4gKilcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8pIHQgLT4gYm9vbFxuXG4gICgqKiBbbWVtIHQgYV0gcmV0dXJucyBbdHJ1ZV0gaWZmIFthXSBpcyBpbiBbdF0uICBbTyhsb2cgbildLiAqKVxuICB2YWwgbWVtIDogKCdhLCBfKSB0IC0+ICdhIC0+IGJvb2xcblxuICAoKiogW2FkZCB0IGFdIHJldHVybnMgYSBuZXcgc2V0IHdpdGggW2FdIGFkZGVkIHRvIFt0XSwgb3IgcmV0dXJucyBbdF0gaWYgW21lbSB0IGFdLlxuICAgICAgW08obG9nIG4pXS4gKilcbiAgdmFsIGFkZCA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3JlbW92ZSB0IGFdIHJldHVybnMgYSBuZXcgc2V0IHdpdGggW2FdIHJlbW92ZWQgZnJvbSBbdF0gaWYgW21lbSB0IGFdLCBvciByZXR1cm5zIFt0XVxuICAgICAgb3RoZXJ3aXNlLiAgW08obG9nIG4pXS4gKilcbiAgdmFsIHJlbW92ZSA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3VuaW9uIHQxIHQyXSByZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGUgdHdvIHNldHMuICBbTyhsZW5ndGggdDEgKyBsZW5ndGggdDIpXS4gKilcbiAgdmFsIHVuaW9uIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3VuaW9uIGMgbGlzdF0gcmV0dXJucyB0aGUgdW5pb24gb2YgYWxsIHRoZSBzZXRzIGluIFtsaXN0XS4gIFRoZVxuICAgICAgW2NvbXBhcmF0b3JdIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGZvciB0aGUgY2FzZSB3aGVyZSBbbGlzdF0gaXMgZW1wdHkuXG4gICAgICBbTyhtYXgoTGlzdC5sZW5ndGggbGlzdCwgbiBsb2cgbikpXSwgd2hlcmUgW25dIGlzIHRoZSBzdW0gb2Ygc2l6ZXMgb2YgdGhlIGlucHV0IHNldHMuICopXG4gIHZhbCB1bmlvbl9saXN0IDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICgnYSwgJ2NtcCkgdCBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbaW50ZXIgdDEgdDJdIGNvbXB1dGVzIHRoZSBpbnRlcnNlY3Rpb24gb2Ygc2V0cyBbdDFdIGFuZCBbdDJdLiAgW08obGVuZ3RoIHQxICtcbiAgICAgIGxlbmd0aCB0MildLiAqKVxuICB2YWwgaW50ZXIgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbZGlmZiB0MSB0Ml0gY29tcHV0ZXMgdGhlIHNldCBkaWZmZXJlbmNlIFt0MSAtIHQyXSwgaS5lLiwgdGhlIHNldCBjb250YWluaW5nIGFsbFxuICAgICAgZWxlbWVudHMgaW4gW3QxXSB0aGF0IGFyZSBub3QgaW4gW3QyXS4gIFtPKGxlbmd0aCB0MSArIGxlbmd0aCB0MildLiAqKVxuICB2YWwgZGlmZiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtzeW1tZXRyaWNfZGlmZiB0MSB0Ml0gcmV0dXJucyBhIHNlcXVlbmNlIG9mIGNoYW5nZXMgYmV0d2VlbiBbdDFdIGFuZCBbdDJdLiBJdCBpc1xuICAgICAgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50IGluIHRoZSBjYXNlIHdoZXJlIFt0MV0gYW5kIFt0Ml0gc2hhcmUgYSBsYXJnZSBhbW91bnQgb2ZcbiAgICAgIHN0cnVjdHVyZS4gKilcbiAgdmFsIHN5bW1ldHJpY19kaWZmIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdhKSBFaXRoZXIudCBTZXF1ZW5jZS50XG5cbiAgKCoqIFtjb21wYXJlX2RpcmVjdCB0MSB0Ml0gY29tcGFyZXMgdGhlIHNldHMgW3QxXSBhbmQgW3QyXS4gIEl0IHJldHVybnMgdGhlIHNhbWUgcmVzdWx0XG4gICAgICBhcyBbY29tcGFyZV0sIGJ1dCB1bmxpa2UgY29tcGFyZSwgZG9lc24ndCByZXF1aXJlIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgaW4gZm9yIHRoZVxuICAgICAgdHlwZSBwYXJhbWV0ZXJzIG9mIHRoZSBzZXQuICBbTyhsZW5ndGggdDEgKyBsZW5ndGggdDIpXS4gKilcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBpbnRcblxuICAoKiogSGFzaCBmdW5jdGlvbjogYSBidWlsZGluZyBibG9jayB0byB1c2Ugd2hlbiBoYXNoaW5nIGRhdGEgc3RydWN0dXJlcyBjb250YWluaW5nIHNldHMgaW5cbiAgICAgIHRoZW0uIFtoYXNoX2ZvbGRfZGlyZWN0IGhhc2hfZm9sZF9rZXldIGlzIGNvbXBhdGlibGUgd2l0aCBbY29tcGFyZV9kaXJlY3RdIGlmZlxuICAgICAgW2hhc2hfZm9sZF9rZXldIGlzIGNvbXBhdGlibGUgd2l0aCBbKGNvbXBhcmF0b3IgcykuY29tcGFyZV0gb2YgdGhlIHNldCBbc10gYmVpbmdcbiAgICAgIGhhc2hlZC4gKilcbiAgdmFsIGhhc2hfZm9sZF9kaXJlY3QgOiAnYSBIYXNoLmZvbGRlciAtPiAoJ2EsICdjbXApIHQgSGFzaC5mb2xkZXJcblxuICAoKiogW2VxdWFsIHQxIHQyXSByZXR1cm5zIFt0cnVlXSBpZmYgdGhlIHR3byBzZXRzIGhhdmUgdGhlIHNhbWUgZWxlbWVudHMuICBbTyhsZW5ndGggdDEgK1xuICAgICAgbGVuZ3RoIHQyKV0gKilcbiAgdmFsIGVxdWFsIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG5cbiAgKCoqIFtleGlzdHMgdCB+Zl0gcmV0dXJucyBbdHJ1ZV0gaWZmIHRoZXJlIGV4aXN0cyBhbiBbYV0gaW4gW3RdIGZvciB3aGljaCBbZiBhXS4gIFtPKG4pXSxcbiAgICAgIGJ1dCByZXR1cm5zIGFzIHNvb24gYXMgaXQgZmluZHMgYW4gW2FdIGZvciB3aGljaCBbZiBhXS4gKilcbiAgdmFsIGV4aXN0cyA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFtmb3JfYWxsIHQgfmZdIHJldHVybnMgW3RydWVdIGlmZiBmb3IgYWxsIFthXSBpbiBbdF0sIFtmIGFdLiAgW08obildLCBidXQgcmV0dXJucyBhc1xuICAgICAgc29vbiBhcyBpdCBmaW5kcyBhbiBbYV0gZm9yIHdoaWNoIFtub3QgKGYgYSldLiAqKVxuICB2YWwgZm9yX2FsbCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFtjb3VudCB0XSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgW3RdIGZvciB3aGljaCBbZl0gcmV0dXJucyBbdHJ1ZV0uXG4gICAgICBbTyhuKV0uICopXG4gIHZhbCBjb3VudCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBpbnRcblxuICAoKiogW3N1bSB0XSByZXR1cm5zIHRoZSBzdW0gb2YgW2YgdF0gZm9yIGVhY2ggW3RdIGluIHRoZSBzZXQuXG4gICAgICBbTyhuKV0uICopXG4gIHZhbCBzdW1cbiAgICA6ICAobW9kdWxlIENvbnRhaW5lci5TdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pXG4gICAgLT4gKCdhLCBfKSB0XG4gICAgLT4gZjooJ2EgLT4gJ3N1bSlcbiAgICAtPiAnc3VtXG5cbiAgKCoqIFtmaW5kIHQgZl0gcmV0dXJucyBhbiBlbGVtZW50IG9mIFt0XSBmb3Igd2hpY2ggW2ZdIHJldHVybnMgdHJ1ZSwgd2l0aCBubyBndWFyYW50ZWUgYXNcbiAgICAgIHRvIHdoaWNoIGVsZW1lbnQgaXMgcmV0dXJuZWQuICBbTyhuKV0sIGJ1dCByZXR1cm5zIGFzIHNvb24gYXMgYSBzdWl0YWJsZSBlbGVtZW50IGlzXG4gICAgICBmb3VuZC4gKilcbiAgdmFsIGZpbmQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFtmaW5kX21hcCB0IGZdIHJldHVybnMgW2JdIGZvciBzb21lIFthXSBpbiBbdF0gZm9yIHdoaWNoIFtmIGEgPSBTb21lIGJdLiAgSWYgbm8gc3VjaFxuICAgICAgW2FdIGV4aXN0cywgdGhlbiBbZmluZF0gcmV0dXJucyBbTm9uZV0uICBbTyhuKV0sIGJ1dCByZXR1cm5zIGFzIHNvb24gYXMgYSBzdWl0YWJsZVxuICAgICAgZWxlbWVudCBpcyBmb3VuZC4gKilcbiAgdmFsIGZpbmRfbWFwIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG5cbiAgKCoqIExpa2UgW2ZpbmRdLCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAqKVxuICB2YWwgZmluZF9leG4gOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2FcblxuICAoKiogW250aCB0IGldIHJldHVybnMgdGhlIFtpXXRoIHNtYWxsZXN0IGVsZW1lbnQgb2YgW3RdLCBpbiBbTyhsb2cgbildIHRpbWUuICBUaGVcbiAgICAgIHNtYWxsZXN0IGVsZW1lbnQgaGFzIFtpID0gMF0uICBSZXR1cm5zIFtOb25lXSBpZiBbaSA8IDBdIG9yIFtpID49IGxlbmd0aCB0XS4gKilcbiAgdmFsIG50aCA6ICgnYSwgXykgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFtyZW1vdmVfaW5kZXggdCBpXSByZXR1cm5zIGEgdmVyc2lvbiBvZiBbdF0gd2l0aCB0aGUgW2lddGggc21hbGxlc3QgZWxlbWVudCByZW1vdmVkLFxuICAgICAgaW4gW08obG9nIG4pXSB0aW1lLiAgVGhlIHNtYWxsZXN0IGVsZW1lbnQgaGFzIFtpID0gMF0uICBSZXR1cm5zIFt0XSBpZiBbaSA8IDBdIG9yXG4gICAgICBbaSA+PSBsZW5ndGggdF0uICopXG4gIHZhbCByZW1vdmVfaW5kZXggOiAoJ2EsICdjbXApIHQgLT4gaW50IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbaXNfc3Vic2V0IHQxIH5vZl86dDJdIHJldHVybnMgdHJ1ZSBpZmYgW3QxXSBpcyBhIHN1YnNldCBvZiBbdDJdLiAqKVxuICB2YWwgaXNfc3Vic2V0IDogKCdhLCAnY21wKSB0IC0+IG9mXzooJ2EsICdjbXApIHQgLT4gYm9vbFxuXG4gICgqKiBbYXJlX2Rpc2pvaW50IHQxIHQyXSByZXR1cm5zIFt0cnVlXSBpZmYgW2lzX2VtcHR5IChpbnRlciB0MSB0MildLCBidXQgaXMgbW9yZVxuICAgICAgZWZmaWNpZW50LiAqKVxuICB2YWwgYXJlX2Rpc2pvaW50IDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG5cbiAgKCoqIFtOYW1lZF0gYWxsb3dzIHRoZSB2YWxpZGF0aW9uIG9mIHN1YnNldCBhbmQgZXF1YWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHNldHMuICBBXG4gICAgICBbTmFtZWQudF0gaXMgYSByZWNvcmQgb2YgYSBzZXQgYW5kIGEgbmFtZSwgd2hlcmUgdGhlIG5hbWUgaXMgdXNlZCBpbiBlcnJvciBtZXNzYWdlcyxcbiAgICAgIGFuZCBbTmFtZWQuaXNfc3Vic2V0XSBhbmQgW05hbWVkLmVxdWFsXSB2YWxpZGF0ZSBzdWJzZXQgYW5kIGVxdWFsaXR5IHJlbGF0aW9uc2hpcHNcbiAgICAgIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgZm9yLCBlLmcuLFxuICAgICAge1tcbiAgICAgICAgTmFtZWQuaXNfc3Vic2V0IHsgc2V0ID0gc2V0MTsgbmFtZSA9IFwic2V0MVwiIH0gfm9mXzp7c2V0ID0gc2V0MjsgbmFtZSA9IFwic2V0MlwiIH1cbiAgICAgIF19XG5cbiAgICAgIGxvb2tzIGxpa2VcbiAgICAgIHt2XG4gICAgICAgIChcInNldDEgaXMgbm90IGEgc3Vic2V0IG9mIHNldDJcIiAoaW52YWxpZF9lbGVtZW50cyAoLi4uZWxlbWVudHMgb2Ygc2V0MSAtIHNldDIuLi4pKSlcbiAgICAgdn1cblxuICAgICAgc28gW25hbWVdIHNob3VsZCBiZSBhIG5vdW4gcGhyYXNlIHRoYXQgZG9lc24ndCBzb3VuZCBhd2t3YXJkIGluIHRoZSBhYm92ZSBlcnJvclxuICAgICAgbWVzc2FnZS4gIEV2ZW4gdGhvdWdoIGl0IGFkZHMgdmVyYm9zaXR5LCBjaG9vc2luZyBbbmFtZV1zIHRoYXQgc3RhcnQgd2l0aCB0aGUgcGhyYXNlXG4gICAgICBcInRoZSBzZXQgb2ZcIiBvZnRlbiBtYWtlcyB0aGUgZXJyb3IgbWVzc2FnZSBzb3VuZCBtb3JlIG5hdHVyYWwuXG4gICopXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2NtcCkgdCA9XG4gICAgICB7IHNldCA6ICgnYSwgJ2NtcCkgdFxuICAgICAgOyBuYW1lIDogc3RyaW5nXG4gICAgICB9XG5cbiAgICAoKiogW2lzX3N1YnNldCB0MSB+b2ZfOnQyXSByZXR1cm5zIFtPayAoKV0gaWYgW3QxXSBpcyBhIHN1YnNldCBvZiBbdDJdIGFuZCBhXG4gICAgICAgIGh1bWFuLXJlYWRhYmxlIGVycm9yIG90aGVyd2lzZS4gICopXG4gICAgdmFsIGlzX3N1YnNldCA6ICgnYSwgJ2NtcCkgdCAtPiBvZl86KCdhLCAnY21wKSB0IC0+IHVuaXQgT3JfZXJyb3IudFxuXG4gICAgKCoqIFtlcXVhbCB0MSB0Ml0gcmV0dXJucyBbT2sgKCldIGlmIFt0MV0gaXMgZXF1YWwgdG8gW3QyXSBhbmQgYSBodW1hbi1yZWFkYWJsZVxuICAgICAgICBlcnJvciBvdGhlcndpc2UuICAqKVxuICAgIHZhbCBlcXVhbCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gdW5pdCBPcl9lcnJvci50XG4gIGVuZFxuXG4gICgqKiBUaGUgbGlzdCBvciBhcnJheSBnaXZlbiB0byBbb2ZfbGlzdF0gYW5kIFtvZl9hcnJheV0gbmVlZCBub3QgYmUgc29ydGVkLiAqKVxuICB2YWwgb2ZfbGlzdCA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZSA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfYXJyYXkgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgYXJyYXkgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFt0b19saXN0XSBhbmQgW3RvX2FycmF5XSBwcm9kdWNlIHNlcXVlbmNlcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byB0aGVcbiAgICAgIGNvbXBhcmF0b3IuICopXG4gIHZhbCB0b19saXN0IDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcblxuICB2YWwgdG9fYXJyYXkgOiAoJ2EsIF8pIHQgLT4gJ2EgYXJyYXlcblxuICAoKiogQ3JlYXRlIHNldCBmcm9tIHNvcnRlZCBhcnJheS4gIFRoZSBpbnB1dCBtdXN0IGJlIHNvcnRlZCAoZWl0aGVyIGluIGFzY2VuZGluZyBvclxuICAgICAgZGVzY2VuZGluZyBvcmRlciBhcyBnaXZlbiBieSB0aGUgY29tcGFyYXRvcikgYW5kIGNvbnRhaW4gbm8gZHVwbGljYXRlcywgb3RoZXJ3aXNlIHRoZVxuICAgICAgcmVzdWx0IGlzIGFuIGVycm9yLiAgVGhlIGNvbXBsZXhpdHkgb2YgdGhpcyBmdW5jdGlvbiBpcyBbTyhuKV0uICopXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAnYSBhcnJheVxuICAgIC0+ICgnYSwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIFNpbWlsYXIgdG8gW29mX3NvcnRlZF9hcnJheV0sIGJ1dCB3aXRob3V0IGNoZWNraW5nIHRoZSBpbnB1dCBhcnJheS4gKilcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAnYSBhcnJheVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgYyB+bGVuIH5mXSBiZWhhdmVzIGxpa2UgW29mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgY1xuICAgICAgKEFycmF5LmluaXQgbGVuIH5mKV0sIHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhIGRlY3JlYXNpbmcgb3JkZXIgaXMgbm90XG4gICAgICBzdXBwb3J0ZWQuICBUaGUgYWR2YW50YWdlIGlzIG5vdCByZXF1aXJpbmcgeW91IHRvIGFsbG9jYXRlIGFuIGludGVybWVkaWF0ZSBhcnJheS4gIFtmXVxuICAgICAgd2lsbCBiZSBjYWxsZWQgd2l0aCAwLCAxLCAuLi4gW2xlbiAtIDFdLCBpbiBvcmRlci4gKilcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gbGVuOmludFxuICAgIC0+IGY6KGludCAtPiAnYSlcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW3N0YWJsZV9kZWR1cF9saXN0XSBpcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBbTGlzdF0gbW9kdWxlIGJlY2F1c2UgdGhlXG4gICAgICBpbXBsZW1lbnRhdGlvbiByZWxpZXMgY3J1Y2lhbGx5IG9uIHNldHMsIGFuZCBiZWNhdXNlIGRvaW5nIHNvIGFsbG93cyBvbmUgdG8gYXZvaWQgdXNlc1xuICAgICAgb2YgcG9seW1vcnBoaWMgY29tcGFyaXNvbiBieSBpbnN0YW50aWF0aW5nIHRoZSBmdW5jdG9yIGF0IGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uXG4gICAgICBvZiBbQ29tcGFyYXRvcl0gYW5kIHVzaW5nIHRoZSByZXN1bHRpbmcgW3N0YWJsZV9kZWR1cF9saXN0XS4gKilcbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogKCdhLCBfKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIGxpc3QgLT4gJ2EgbGlzdFxuXG4gICgqKiBbbWFwIGMgdCB+Zl0gcmV0dXJucyBhIG5ldyBzZXQgY3JlYXRlZCBieSBhcHBseWluZyBbZl0gdG8gZXZlcnkgZWxlbWVudCBpblxuICAgICAgW3RdLiAgVGhlIHJldHVybmVkIHNldCBpcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgW2NvbXBhcmF0b3JdLiAgW08obiBsb2cgbildLiAqKVxuICB2YWwgbWFwIDogKCdiLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICgnYSwgXykgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnY21wKSB0XG5cbiAgKCoqIExpa2UgeyFtYXB9LCBleGNlcHQgZWxlbWVudHMgZm9yIHdoaWNoIFtmXSByZXR1cm5zIFtOb25lXSB3aWxsIGJlIGRyb3BwZWQuICAqKVxuICB2YWwgZmlsdGVyX21hcFxuICAgIDogICgnYiwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSwgXykgdFxuICAgIC0+IGY6KCdhIC0+ICdiIG9wdGlvbilcbiAgICAtPiAoJ2IsICdjbXApIHRcblxuICAoKiogW2ZpbHRlciB0IH5mXSByZXR1cm5zIHRoZSBzdWJzZXQgb2YgW3RdIGZvciB3aGljaCBbZl0gZXZhbHVhdGVzIHRvIHRydWUuICBbTyhuIGxvZ1xuICAgICAgbildLiAqKVxuICB2YWwgZmlsdGVyIDogKCdhLCAnY21wKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbZm9sZCB0IH5pbml0IH5mXSBmb2xkcyBvdmVyIHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0IGZyb20gc21hbGxlc3QgdG8gbGFyZ2VzdC4gKilcbiAgdmFsIGZvbGQgOiAoJ2EsIF8pIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFtmb2xkX3Jlc3VsdCB+aW5pdCB+Zl0gZm9sZHMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHNldCBmcm9tIHNtYWxsZXN0IHRvXG4gICAgICBsYXJnZXN0LCBzaG9ydCBjaXJjdWl0aW5nIHRoZSBmb2xkIGlmIFtmIGFjY3VtIHhdIGlzIGFuIFtFcnJvciBfXSAqKVxuICB2YWwgZm9sZF9yZXN1bHRcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgKCoqIFtmb2xkX3VudGlsIHQgfmluaXQgfmZdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXS4gSWYgW2ZdXG4gICAgICByZXR1cm5zIFtTdG9wIF9dIHRoZSBjb21wdXRhdGlvbiBjZWFzZXMgYW5kIHJlc3VsdHMgaW4gdGhhdCB2YWx1ZS4gSWYgW2ZdIHJldHVybnNcbiAgICAgIFtDb250aW51ZSBfXSwgdGhlIGZvbGQgd2lsbCBwcm9jZWVkLiAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cblxuICAoKiogTGlrZSB7IWZvbGR9LCBleGNlcHQgdGhhdCBpdCBnb2VzIGZyb20gdGhlIGxhcmdlc3QgdG8gdGhlIHNtYWxsZXN0IGVsZW1lbnQuICopXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCBfKSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhIC0+ICdhY2N1bSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbaXRlciB0IH5mXSBjYWxscyBbZl0gb24gZXZlcnkgZWxlbWVudCBvZiBbdF0sIGdvaW5nIGluIG9yZGVyIGZyb20gdGhlIHNtYWxsZXN0IHRvXG4gICAgICBsYXJnZXN0LiAgKilcbiAgdmFsIGl0ZXIgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBJdGVyYXRlIHR3byBzZXRzIHNpZGUgYnkgc2lkZS4gIENvbXBsZXhpdHkgaXMgW08obStuKV0gd2hlcmUgW21dIGFuZCBbbl0gYXJlIHRoZSBzaXplc1xuICAgICAgb2YgdGhlIHR3byBpbnB1dCBzZXRzLiAgQXMgYW4gZXhhbXBsZSwgd2l0aCB0aGUgaW5wdXRzIFswOyAxXSBhbmQgWzE7IDJdLCBbZl0gd2lsbCBiZVxuICAgICAgY2FsbGVkIHdpdGggW2BMZWZ0IDBdOyBbYEJvdGggKDEsIDEpXTsgYW5kIFtgUmlnaHQgMl0uICopXG4gIHZhbCBpdGVyMlxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGY6KFsgYExlZnQgb2YgJ2EgfCBgUmlnaHQgb2YgJ2EgfCBgQm90aCBvZiAnYSAqICdhIF0gLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgKCoqIGlmIFthLCBiID0gcGFydGl0aW9uX3RmIHNldCB+Zl0gdGhlbiBbYV0gaXMgdGhlIGVsZW1lbnRzIG9uIHdoaWNoIFtmXSBwcm9kdWNlZCBbdHJ1ZV0sXG4gICAgICBhbmQgW2JdIGlzIHRoZSBlbGVtZW50cyBvbiB3aGljaCBbZl0gcHJvZHVjZXMgW2ZhbHNlXS4gKilcbiAgdmFsIHBhcnRpdGlvbl90ZiA6ICgnYSwgJ2NtcCkgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgKiAoJ2EsICdjbXApIHRcblxuICAoKiogU2FtZSBhcyB7IXRvX2xpc3R9LiAqKVxuICB2YWwgZWxlbWVudHMgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuXG4gICgqKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBlbGVtZW50IG9mIHRoZSBzZXQuICBbTyhsb2cgbildLiAqKVxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cblxuICAoKiogTGlrZSB7IW1pbl9lbHR9LCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGFuIGVtcHR5IHNldC4gKilcbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG5cbiAgKCoqIFJldHVybnMgdGhlIGxhcmdlc3QgZWxlbWVudCBvZiB0aGUgc2V0LiAgW08obG9nIG4pXS4gICopXG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuXG4gICgqKiBMaWtlIHshbWF4X2VsdH0sIGJ1dCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYW4gZW1wdHkgc2V0LiAqKVxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcblxuICAoKiogcmV0dXJucyBhbiBhcmJpdHJhcnkgZWxlbWVudCwgb3IgW05vbmVdIGlmIHRoZSBzZXQgaXMgZW1wdHkuICopXG4gIHZhbCBjaG9vc2UgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIExpa2UgeyFjaG9vc2V9LCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBhbiBlbXB0eSBzZXQuICopXG4gIHZhbCBjaG9vc2VfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG5cbiAgKCoqIFtzcGxpdCB0IHhdIHByb2R1Y2VzIGEgdHJpcGxlIFsodDEsIG1heWJlX3gsIHQyKV0gd2hlcmUgW3QxXSBpcyB0aGUgc2V0IG9mIGVsZW1lbnRzXG4gICAgICBzdHJpY3RseSBsZXNzIHRoYW4gW3hdLCBbbWF5YmVfeF0gaXMgdGhlIG1lbWJlciAoaWYgYW55KSBvZiBbdF0gd2hpY2ggY29tcGFyZXMgZXF1YWxcbiAgICAgIHRvIFt4XSwgYW5kIFt0Ml0gaXMgdGhlIHNldCBvZiBlbGVtZW50cyBzdHJpY3RseSBsYXJnZXIgdGhhbiBbeF0uICopXG4gIHZhbCBzcGxpdCA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHQgKiAnYSBvcHRpb24gKiAoJ2EsICdjbXApIHRcblxuICAoKiogaWYgW2VxdWl2XSBpcyBhbiBlcXVpdmFsZW5jZSBwcmVkaWNhdGUsIHRoZW4gW2dyb3VwX2J5IHNldCB+ZXF1aXZdIHByb2R1Y2VzIGEgbGlzdFxuICAgICAgb2YgZXF1aXZhbGVuY2UgY2xhc3NlcyAoaS5lLiwgYSBzZXQtdGhlb3JldGljIHF1b3RpZW50KS4gIEUuZy4sXG5cbiAgICAgIHtbXG4gICAgICAgIGxldCBjaGFycyA9IFNldC5vZl9saXN0IFsnQSc7ICdhJzsgJ2InOyAnYyddIGluXG4gICAgICAgIGxldCBlcXVpdiBjIGMnID0gQ2hhci5lcXVhbCAoQ2hhci51cHBlcmNhc2UgYykgKENoYXIudXBwZXJjYXNlIGMnKSBpblxuICAgICAgICBncm91cF9ieSBjaGFycyB+ZXF1aXZcbiAgICAgIF19XG5cbiAgICAgIHByb2R1Y2VzOlxuXG4gICAgICB7W1xuICAgICAgICBbU2V0Lm9mX2xpc3QgWydBJzsnYSddOyBTZXQuc2luZ2xldG9uICdiJzsgU2V0LnNpbmdsZXRvbiAnYyddXG4gICAgICBdfVxuXG4gICAgICBbZ3JvdXBfYnldIHJ1bnMgaW4gTyhuXjIpIHRpbWUsIHNvIGlmIHlvdSBoYXZlIGEgY29tcGFyaXNvbiBmdW5jdGlvbiwgaXQncyB1c3VhbGx5XG4gICAgICBtdWNoIGZhc3RlciB0byB1c2UgW1NldC5vZl9saXN0XS4gKilcbiAgdmFsIGdyb3VwX2J5IDogKCdhLCAnY21wKSB0IC0+IGVxdWl2OignYSAtPiAnYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgbGlzdFxuXG4gICgqKiBbdG9fc2VxdWVuY2UgdF0gY29udmVydHMgdGhlIHNldCBbdF0gdG8gYSBzZXF1ZW5jZSBvZiB0aGUgZWxlbWVudHMgYmV0d2VlblxuICAgICAgW2dyZWF0ZXJfb3JfZXF1YWxfdG9dIGFuZCBbbGVzc19vcl9lcXVhbF90b10gaW5jbHVzaXZlIGluIHRoZSBvcmRlciBpbmRpY2F0ZWQgYnlcbiAgICAgIFtvcmRlcl0uICBJZiBbZ3JlYXRlcl9vcl9lcXVhbF90byA+IGxlc3Nfb3JfZXF1YWxfdG9dIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eS4gIENvc3QgaXNcbiAgICAgIE8obG9nIG4pIHVwIGZyb250IGFuZCBhbW9ydGl6ZWQgTygxKSBmb3IgZWFjaCBlbGVtZW50IHByb2R1Y2VkLiAqKVxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyAoKiogZGVmYXVsdCAqKSB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gJ2EgU2VxdWVuY2UudFxuXG4gICgqKiBbYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIHdoaWNoIGVsdF0gcmV0dXJucyB0aGUgZWxlbWVudCBpbiBbdF0gc3BlY2lmaWVkIGJ5XG4gICAgICBbY29tcGFyZV0gYW5kIFt3aGljaF0sIGlmIG9uZSBleGlzdHMuXG5cbiAgICAgIFt0XSBtdXN0IGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5nIG9yZGVyIGFjY29yZGluZyB0byBbY29tcGFyZV0sIHdoZXJlIFtjb21wYXJlXSBhbmRcbiAgICAgIFtlbHRdIGRpdmlkZSBbdF0gaW50byB0aHJlZSAocG9zc2libHkgZW1wdHkpIHNlZ21lbnRzOlxuXG4gICAgICB7dlxuICAgICAgICB8ICA8IGVsdCAgfCAgPSBlbHQgIHwgID4gZWx0ICB8XG4gICAgICB2fVxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF0gcmV0dXJucyBhbiBlbGVtZW50IG9uIHRoZSBib3VuZGFyeSBvZiBzZWdtZW50cyBhcyBzcGVjaWZpZWQgYnlcbiAgICAgIFt3aGljaF0uICBTZWUgdGhlIGRpYWdyYW0gYmVsb3cgbmV4dCB0byB0aGUgW3doaWNoXSB2YXJpYW50cy5cblxuICAgICAgW2JpbmFyeV9zZWFyY2hdIGRvZXMgbm90IGNoZWNrIHRoYXQgW2NvbXBhcmVdIG9yZGVycyBbdF0sIGFuZCBiZWhhdmlvciBpc1xuICAgICAgdW5zcGVjaWZpZWQgaWYgW2NvbXBhcmVdIGRvZXNuJ3Qgb3JkZXIgW3RdLiAgQmVoYXZpb3IgaXMgYWxzbyB1bnNwZWNpZmllZCBpZlxuICAgICAgW2NvbXBhcmVdIG11dGF0ZXMgW3RdLiAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IFsgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuICgqKiAgICAgICAge3YgfCA8IGVsdCBYIHwgICAgICAgICAgICAgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gKCoqICAgICB7diB8ICAgICAgPD0gZWx0ICAgICAgIFggfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBMYXN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8ICAgPSBlbHQgWCB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYEZpcnN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgWCA9IGVsdCAgIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvICgqKiB7diAgICAgICAgICAgfCBYICAgICAgID49IGVsdCAgICAgIHwgdn0gKilcbiAgICAgICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gKCoqICAgIHt2ICAgICAgICAgICAgICAgICAgICAgICB8IFggPiBlbHQgfCB2fSAqKVxuICAgICAgIF1cbiAgICAtPiAna2V5XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFtiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIHdoaWNoXSB0YWtlcyBhIFtzZWdtZW50X29mXSBmdW5jdGlvbiB0aGF0XG4gICAgICBkaXZpZGVzIFt0XSBpbnRvIHR3byAocG9zc2libHkgZW1wdHkpIHNlZ21lbnRzOlxuXG4gICAgICB7dlxuICAgICAgICB8IHNlZ21lbnRfb2YgZWx0ID0gYExlZnQgfCBzZWdtZW50X29mIGVsdCA9IGBSaWdodCB8XG4gICAgICB2fVxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIHJldHVybnMgdGhlIGVsZW1lbnQgb24gdGhlIGJvdW5kYXJ5IG9mIHRoZSBzZWdtZW50cyBhc1xuICAgICAgc3BlY2lmaWVkIGJ5IFt3aGljaF06IFtgTGFzdF9vbl9sZWZ0XSB5aWVsZHMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbGVmdCBzZWdtZW50LFxuICAgICAgd2hpbGUgW2BGaXJzdF9vbl9yaWdodF0geWllbGRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSByaWdodCBzZWdtZW50LiAgSXQgcmV0dXJuc1xuICAgICAgW05vbmVdIGlmIHRoZSBzZWdtZW50IGlzIGVtcHR5LlxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIGRvZXMgbm90IGNoZWNrIHRoYXQgW3NlZ21lbnRfb2ZdIHNlZ21lbnRzIFt0XSBhcyBpbiB0aGVcbiAgICAgIGRpYWdyYW0sIGFuZCBiZWhhdmlvciBpcyB1bnNwZWNpZmllZCBpZiBbc2VnbWVudF9vZl0gZG9lc24ndCBzZWdtZW50IFt0XS4gIEJlaGF2aW9yXG4gICAgICBpcyBhbHNvIHVuc3BlY2lmaWVkIGlmIFtzZWdtZW50X29mXSBtdXRhdGVzIFt0XS4gKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gc2VnbWVudF9vZjooJ2EgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IFsgYExhc3Rfb25fbGVmdCB8IGBGaXJzdF9vbl9yaWdodCBdXG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFByb2R1Y2VzIHRoZSBlbGVtZW50cyBvZiB0aGUgdHdvIHNldHMgYmV0d2VlbiBbZ3JlYXRlcl9vcl9lcXVhbF90b10gYW5kXG4gICAgICBbbGVzc19vcl9lcXVhbF90b10gaW4gW29yZGVyXSwgbm90aW5nIHdoZXRoZXIgZWFjaCBlbGVtZW50IGFwcGVhcnMgaW4gdGhlIGxlZnQgc2V0LFxuICAgICAgdGhlIHJpZ2h0IHNldCwgb3IgYm90aC4gIEluIHRoZSBib3RoIGNhc2UsIGJvdGggZWxlbWVudHMgYXJlIHJldHVybmVkLCBpbiBjYXNlIHRoZVxuICAgICAgY2FsbGVyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVsZW1lbnRzIHRoYXQgYXJlIGVxdWFsIHRvIHRoZSBzZXRzJyBjb21wYXJhdG9yLiAgUnVuc1xuICAgICAgaW4gTyhsZW5ndGggdCArIGxlbmd0aCB0JykuICopXG4gIG1vZHVsZSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50IDogc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgU2VxdWVuY2UuTWVyZ2Vfd2l0aF9kdXBsaWNhdGVzX2VsZW1lbnQudCA9XG4gICAgICB8IExlZnQgb2YgJ2FcbiAgICAgIHwgUmlnaHQgb2YgJ2JcbiAgICAgIHwgQm90aCBvZiAnYSAqICdiXG4gICAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICBpbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlLlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nICgqKiBkZWZhdWx0ICopIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdhKSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gICgqKiBbTV0gaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIE9DYW1sIGFwcGxpY2F0aXZlIGZ1bmN0b3IgdHlwZXM6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3NldCA9IFNldC5NKFN0cmluZykudFxuICAgICAgXX1cblxuICAgICAgd2hpY2ggc3RhbmRzIGZvcjpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfc2V0ID0gKFN0cmluZy50LCBTdHJpbmcuY29tcGFyYXRvcl93aXRuZXNzKSBTZXQudFxuICAgICAgXX1cblxuICAgICAgVGhlIHBvaW50IGlzIHRoYXQgW1NldC5NKFN0cmluZykudF0gc3VwcG9ydHMgZGVyaXZpbmcsIHdoZXJlYXMgdGhlIHNlY29uZCBzeW50YXhcbiAgICAgIGRvZXNuJ3QgKGJlY2F1c2UgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcywgc2F5LCBTdHJpbmcuc2V4cF9vZl9jb21wYXJhdG9yX3dpdG5lc3MsXG4gICAgICBpbnN0ZWFkIHlvdSB3b3VsZCB3YW50IHRvIHBhc3MgdGhlIGNvbXBhcmF0b3IgZGlyZWN0bHkpLiAqKVxuICBtb2R1bGUgTSAoRWx0IDogc2lnXG4gICAgICB0eXBlIHRcbiAgICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKSA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjIHQgPSAoRWx0LnQsIEVsdC5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgZW5kXG5cbiAgaW5jbHVkZSBGb3JfZGVyaXZpbmcgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gICgqKiBBIHBvbHltb3JwaGljIFNldC4gKilcbiAgbW9kdWxlIFBvbHkgOiBTX3BvbHkgd2l0aCB0eXBlICdlbHQgdCA9ICgnZWx0LCBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzKSB0XG5cbiAgKCoqIFVzaW5nIGNvbXBhcmF0b3IgaXMgYSBzaW1pbGFyIGludGVyZmFjZSBhcyB0aGUgdG9wbGV2ZWwgb2YgW1NldF0sIGV4Y2VwdCB0aGUgZnVuY3Rpb25zXG4gICAgICB0YWtlIGEgW35jb21wYXJhdG9yOignZWx0LCAnY21wKSBDb21wYXJhdG9yLnRdIHdoZXJlIHRoZSBmdW5jdGlvbnMgYXQgdGhlIHRvcGxldmVsIG9mXG4gICAgICBbU2V0XSB0YWtlcyBhIFsoJ2VsdCwgJ2NtcCkgY29tcGFyYXRvcl0uICopXG4gIG1vZHVsZSBVc2luZ19jb21wYXJhdG9yIDogc2lnXG4gICAgdHlwZSBub25yZWMgKCdlbHQsICdjbXApIHQgPSAoJ2VsdCwgJ2NtcCkgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3RcbiAgICAgIDogICgnZWx0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnY21wIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgnZWx0LCAnY21wKSB0XG4gICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG5cbiAgICB2YWwgdF9vZl9zZXhwX2RpcmVjdFxuICAgICAgOiAgY29tcGFyYXRvcjooJ2VsdCwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAtPiAoU2V4cC50IC0+ICdlbHQpXG4gICAgICAtPiBTZXhwLnRcbiAgICAgIC0+ICgnZWx0LCAnY21wKSB0XG5cbiAgICBtb2R1bGUgVHJlZSA6IHNpZ1xuICAgICAgKCoqIEEgW1RyZWUudF0gY29udGFpbnMganVzdCB0aGUgdHJlZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGEgc2V0IGlzIGJhc2VkIG9uLCB3aXRob3V0XG4gICAgICAgICAgaW5jbHVkaW5nIHRoZSBjb21wYXJhdG9yLiAgQWNjb3JkaW5nbHksIGFueSBvcGVyYXRpb24gb24gYSBbVHJlZS50XSBtdXN0IGFsc28gdGFrZVxuICAgICAgICAgIGFzIGFuIGFyZ3VtZW50IHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmF0b3IuICopXG4gICAgICB0eXBlICgnYSwgJ2NtcCkgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgICAgdmFsIHNleHBfb2ZfdFxuICAgICAgICA6ICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAtPiAoJ2NtcCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgICAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgICAgW0BAQGVuZF1cblxuICAgICAgdmFsIHRfb2Zfc2V4cF9kaXJlY3RcbiAgICAgICAgOiAgY29tcGFyYXRvcjooJ2VsdCwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAgIC0+IChTZXhwLnQgLT4gJ2VsdClcbiAgICAgICAgLT4gU2V4cC50XG4gICAgICAgIC0+ICgnZWx0LCAnY21wKSB0XG5cbiAgICAgIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgICAgICB0eXBlIG5vbnJlYyAoJ2EsICdjbXApIHQgPVxuICAgICAgICAgIHsgdHJlZSA6ICgnYSwgJ2NtcCkgdFxuICAgICAgICAgIDsgbmFtZSA6IHN0cmluZ1xuICAgICAgICAgIH1cblxuICAgICAgICB2YWwgaXNfc3Vic2V0XG4gICAgICAgICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgICAgIC0+IG9mXzooJ2EsICdjbXApIHRcbiAgICAgICAgICAtPiB1bml0IE9yX2Vycm9yLnRcblxuICAgICAgICB2YWwgZXF1YWxcbiAgICAgICAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAgICAgLT4gdW5pdCBPcl9lcnJvci50XG4gICAgICBlbmRcblxuICAgICAgaW5jbHVkZVxuICAgICAgICBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3JcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHNldCA6PSAoJ2EsICdiKSB0XG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgdFxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYikgbmFtZWQgOj0gKCdhLCAnYikgTmFtZWQudFxuICAgICAgICB3aXRoIG1vZHVsZSBOYW1lZCA6PSBOYW1lZFxuXG4gICAgICB2YWwgZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiA6IChfLCBfKSB0XG4gICAgZW5kXG5cbiAgICBpbmNsdWRlXG4gICAgICBBY2Nlc3NvcnMyXG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSBUcmVlLnRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSBuYW1lZCA6PSAoJ2EsICdiKSBOYW1lZC50XG5cbiAgICBpbmNsdWRlXG4gICAgICBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yXG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSBUcmVlLnRcbiAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSBzZXQgOj0gKCdhLCAnYikgdFxuXG4gICAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICB2YWwgaGFzaF9mb2xkX2RpcmVjdCA6ICdlbHQgSGFzaC5mb2xkZXIgLT4gKCdlbHQsICdjbXApIHQgSGFzaC5mb2xkZXJcblxuICAgIG1vZHVsZSBFbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChFbHQgOiBDb21wYXJhdG9yLlMxKSA6IHNpZ1xuICAgICAgdmFsIGVtcHR5IDogKCdhIEVsdC50LCBFbHQuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gICAgZW5kXG4gIGVuZFxuXG4gICgqKiB7MiBNb2R1bGVzIGFuZCBtb2R1bGUgdHlwZXMgZm9yIGV4dGVuZGluZyBbU2V0XX1cblxuICAgICAgRm9yIHVzZSBpbiBleHRlbnNpb25zIG9mIEJhc2UsIGxpa2UgW0NvcmVdLiAqKVxuXG4gIG1vZHVsZSBXaXRoX2NvbXBhcmF0b3IgPSBXaXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlID0gV2l0aF9maXJzdF9jbGFzc19tb2R1bGVcbiAgbW9kdWxlIFdpdGhvdXRfY29tcGFyYXRvciA9IFdpdGhvdXRfY29tcGFyYXRvclxuXG4gIG1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IEZvcl9kZXJpdmluZ1xuICBtb2R1bGUgdHlwZSBTX3BvbHkgPSBTX3BvbHlcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMCA9IEFjY2Vzc29yczBcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMSA9IEFjY2Vzc29yczFcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMiA9IEFjY2Vzc29yczJcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3IgPSBBY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnNfZ2VuZXJpYyA9IEFjY2Vzc29yc19nZW5lcmljXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMCA9IENyZWF0b3JzMFxuICBtb2R1bGUgdHlwZSBDcmVhdG9yczEgPSBDcmVhdG9yczFcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMyID0gQ3JlYXRvcnMyXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3IgPSBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMwID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczBcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczEgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMVxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMiA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyXG5cbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yID1cbiAgICBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3JcblxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gQ3JlYXRvcnNfZ2VuZXJpY1xuICBtb2R1bGUgdHlwZSBFbHRfcGxhaW4gPSBFbHRfcGxhaW5cbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RpdmUgQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAqKVxuKCogIGVuIEF1dG9tYXRpcXVlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCAgICAqKVxuKCogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlLiBTZWUgLi4vVEhJUkQtUEFSVFkudHh0ICAqKVxuKCogIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBTZXRzIG92ZXIgb3JkZXJlZCB0eXBlcyAqKVxuXG5vcGVuISBJbXBvcnRcbmluY2x1ZGUgU2V0X2ludGZcblxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cblxuXG5tb2R1bGUgVHJlZTAgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID1cbiAgICB8IEVtcHR5XG4gICAgKCogKExlYWYgeCkgaXMgdGhlIHNhbWUgYXMgKE5vZGUgKEVtcHR5LCB4LCBFbXB0eSwgMSwgMSkpIGJ1dCB1c2VzIGxlc3Mgc3BhY2UuICopXG4gICAgfCBMZWFmIG9mICdhXG4gICAgKCogZmlyc3QgaW50IGlzIGhlaWdodCwgc2Vjb25kIGlzIHN1Yi10cmVlIHNpemUgKilcbiAgICB8IE5vZGUgb2YgJ2EgdCAqICdhICogJ2EgdCAqIGludCAqIGludFxuXG4gIHR5cGUgJ2EgdHJlZSA9ICdhIHRcblxuICAoKiBTZXRzIGFyZSByZXByZXNlbnRlZCBieSBiYWxhbmNlZCBiaW5hcnkgdHJlZXMgKHRoZSBoZWlnaHRzIG9mIHRoZSBjaGlsZHJlbiBkaWZmZXIgYnlcbiAgICAgYXQgbW9zdCAyLiAqKVxuICBsZXQgaGVpZ2h0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IDBcbiAgICB8IExlYWYgXyAtPiAxXG4gICAgfCBOb2RlIChfLCBfLCBfLCBoLCBfKSAtPiBoXG4gIDs7XG5cbiAgbGV0IGxlbmd0aCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAwXG4gICAgfCBMZWFmIF8gLT4gMVxuICAgIHwgTm9kZSAoXywgXywgXywgXywgcykgLT4gc1xuICA7O1xuXG4gIGxldCBpbnZhcmlhbnRzID1cbiAgICBsZXQgaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9lbHQgdiA9XG4gICAgICAobWF0Y2ggbG93ZXIgd2l0aFxuICAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICAgfCBTb21lIGxvd2VyIC0+IGNvbXBhcmVfZWx0IGxvd2VyIHYgPCAwKVxuICAgICAgJiZcbiAgICAgIG1hdGNoIHVwcGVyIHdpdGhcbiAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICB8IFNvbWUgdXBwZXIgLT4gY29tcGFyZV9lbHQgdiB1cHBlciA8IDBcbiAgICBpblxuICAgIGxldCByZWMgbG9vcCBsb3dlciB1cHBlciBjb21wYXJlX2VsdCB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiB0cnVlXG4gICAgICB8IExlYWYgdiAtPiBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2VsdCB2XG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIGgsIG4pIC0+XG4gICAgICAgIGxldCBobCA9IGhlaWdodCBsXG4gICAgICAgIGFuZCBociA9IGhlaWdodCByIGluXG4gICAgICAgIGFicyAoaGwgLSBocikgPD0gMlxuICAgICAgICAmJiBoID0gbWF4IGhsIGhyICsgMVxuICAgICAgICAmJiBuID0gbGVuZ3RoIGwgKyBsZW5ndGggciArIDFcbiAgICAgICAgJiYgaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9lbHQgdlxuICAgICAgICAmJiBsb29wIGxvd2VyIChTb21lIHYpIGNvbXBhcmVfZWx0IGxcbiAgICAgICAgJiYgbG9vcCAoU29tZSB2KSB1cHBlciBjb21wYXJlX2VsdCByXG4gICAgaW5cbiAgICBmdW4gdCB+Y29tcGFyZV9lbHQgLT4gbG9vcCBOb25lIE5vbmUgY29tcGFyZV9lbHQgdFxuICA7O1xuXG4gIGxldCBpc19lbXB0eSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiB0cnVlXG4gICAgfCBMZWFmIF8gfCBOb2RlIF8gLT4gZmFsc2VcbiAgOztcblxuICAoKiBDcmVhdGVzIGEgbmV3IG5vZGUgd2l0aCBsZWZ0IHNvbiBsLCB2YWx1ZSB2IGFuZCByaWdodCBzb24gci5cbiAgICAgV2UgbXVzdCBoYXZlIGFsbCBlbGVtZW50cyBvZiBsIDwgdiA8IGFsbCBlbGVtZW50cyBvZiByLlxuICAgICBsIGFuZCByIG11c3QgYmUgYmFsYW5jZWQgYW5kIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDIuXG4gICAgIElubGluZSBleHBhbnNpb24gb2YgaGVpZ2h0IGZvciBiZXR0ZXIgc3BlZWQuICopXG5cbiAgbGV0IGNyZWF0ZSBsIHYgciA9XG4gICAgbGV0IGhsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICB8IExlYWYgXyAtPiAxXG4gICAgICB8IE5vZGUgKF8sIF8sIF8sIGgsIF8pIC0+IGhcbiAgICBpblxuICAgIGxldCBociA9XG4gICAgICBtYXRjaCByIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgfCBOb2RlIChfLCBfLCBfLCBoLCBfKSAtPiBoXG4gICAgaW5cbiAgICBsZXQgaCA9IGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxIGluXG4gICAgaWYgaCA9IDFcbiAgICB0aGVuIExlYWYgdlxuICAgIGVsc2UgKFxuICAgICAgbGV0IHNsID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgICB8IExlYWYgXyAtPiAxXG4gICAgICAgIHwgTm9kZSAoXywgXywgXywgXywgcykgLT4gc1xuICAgICAgaW5cbiAgICAgIGxldCBzciA9XG4gICAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IDBcbiAgICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIHMpIC0+IHNcbiAgICAgIGluXG4gICAgICBOb2RlIChsLCB2LCByLCBoLCBzbCArIHNyICsgMSkpXG4gIDs7XG5cbiAgKCogV2UgbXVzdCBjYWxsIFtmXSB3aXRoIGluY3JlYXNpbmcgaW5kZXhlcywgYmVjYXVzZSB0aGUgYmluX3Byb3QgcmVhZGVyIGluXG4gICAgIENvcmUuU2V0IG5lZWRzIGl0LiAqKVxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiA9XG4gICAgbGV0IHJlYyBsb29wIG4gfmYgaSA9XG4gICAgICBtYXRjaCBuIHdpdGhcbiAgICAgIHwgMCAtPiBFbXB0eVxuICAgICAgfCAxIC0+XG4gICAgICAgIGxldCBrID0gZiBpIGluXG4gICAgICAgIExlYWYga1xuICAgICAgfCAyIC0+XG4gICAgICAgIGxldCBrbCA9IGYgaSBpblxuICAgICAgICBsZXQgayA9IGYgKGkgKyAxKSBpblxuICAgICAgICBjcmVhdGUgKExlYWYga2wpIGsgRW1wdHlcbiAgICAgIHwgMyAtPlxuICAgICAgICBsZXQga2wgPSBmIGkgaW5cbiAgICAgICAgbGV0IGsgPSBmIChpICsgMSkgaW5cbiAgICAgICAgbGV0IGtyID0gZiAoaSArIDIpIGluXG4gICAgICAgIGNyZWF0ZSAoTGVhZiBrbCkgayAoTGVhZiBrcilcbiAgICAgIHwgbiAtPlxuICAgICAgICBsZXQgbGVmdF9sZW5ndGggPSBuIGxzciAxIGluXG4gICAgICAgIGxldCByaWdodF9sZW5ndGggPSBuIC0gbGVmdF9sZW5ndGggLSAxIGluXG4gICAgICAgIGxldCBsZWZ0ID0gbG9vcCBsZWZ0X2xlbmd0aCB+ZiBpIGluXG4gICAgICAgIGxldCBrID0gZiAoaSArIGxlZnRfbGVuZ3RoKSBpblxuICAgICAgICBsZXQgcmlnaHQgPSBsb29wIHJpZ2h0X2xlbmd0aCB+ZiAoaSArIGxlZnRfbGVuZ3RoICsgMSkgaW5cbiAgICAgICAgY3JlYXRlIGxlZnQgayByaWdodFxuICAgIGluXG4gICAgbG9vcCBsZW4gfmYgMFxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IGFycmF5X2xlbmd0aCA9IEFycmF5Lmxlbmd0aCBhcnJheSBpblxuICAgIGxldCBuZXh0ID1cbiAgICAgICgqIFdlIGRvbid0IGNoZWNrIGlmIHRoZSBhcnJheSBpcyBzb3J0ZWQgb3Iga2V5cyBhcmUgZHVwbGljYXRlZCwgYmVjYXVzZSB0aGF0XG4gICAgICAgICBjaGVja2luZyBpcyBzbG93ZXIgdGhhbiB0aGUgd2hvbGUgW29mX3NvcnRlZF9hcnJheV0gZnVuY3Rpb24gKilcbiAgICAgIGlmIGFycmF5X2xlbmd0aCA8IDIgfHwgY29tcGFyZV9lbHQgYXJyYXkuKDApIGFycmF5LigxKSA8IDBcbiAgICAgIHRoZW4gZnVuIGkgLT4gYXJyYXkuKGkpXG4gICAgICBlbHNlIGZ1biBpIC0+IGFycmF5LihhcnJheV9sZW5ndGggLSAxIC0gaSlcbiAgICBpblxuICAgIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW46YXJyYXlfbGVuZ3RoIH5mOm5leHRcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IGFycmF5IH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggYXJyYXkgd2l0aFxuICAgIHwgW3x8XSB8IFt8IF8gfF0gLT4gUmVzdWx0Lk9rIChvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2VsdClcbiAgICB8IF8gLT5cbiAgICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgICBsZXQgaW5jcmVhc2luZyA9XG4gICAgICAgICAgbWF0Y2ggY29tcGFyZV9lbHQgYXJyYXkuKDApIGFycmF5LigxKSB3aXRoXG4gICAgICAgICAgfCAwIC0+IHIucmV0dXJuIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGR1cGxpY2F0ZWQgZWxlbWVudHNcIilcbiAgICAgICAgICB8IGkgLT4gaSA8IDBcbiAgICAgICAgaW5cbiAgICAgICAgZm9yIGkgPSAxIHRvIEFycmF5Lmxlbmd0aCBhcnJheSAtIDIgZG9cbiAgICAgICAgICBtYXRjaCBjb21wYXJlX2VsdCBhcnJheS4oaSkgYXJyYXkuKGkgKyAxKSB3aXRoXG4gICAgICAgICAgfCAwIC0+IHIucmV0dXJuIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGR1cGxpY2F0ZWQgZWxlbWVudHNcIilcbiAgICAgICAgICB8IGkgLT5cbiAgICAgICAgICAgIGlmIFBvbHkuKCA8PiApIChpIDwgMCkgaW5jcmVhc2luZ1xuICAgICAgICAgICAgdGhlblxuICAgICAgICAgICAgICByLnJldHVyblxuICAgICAgICAgICAgICAgIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9zb3J0ZWRfYXJyYXk6IGVsZW1lbnRzIGFyZSBub3Qgb3JkZXJlZFwiKVxuICAgICAgICBkb25lO1xuICAgICAgICBSZXN1bHQuT2sgKG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfZWx0KSlcbiAgOztcblxuICAoKiBTYW1lIGFzIGNyZWF0ZSwgYnV0IHBlcmZvcm1zIG9uZSBzdGVwIG9mIHJlYmFsYW5jaW5nIGlmIG5lY2Vzc2FyeS5cbiAgICAgQXNzdW1lcyBsIGFuZCByIGJhbGFuY2VkIGFuZCB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAzLlxuICAgICBJbmxpbmUgZXhwYW5zaW9uIG9mIGNyZWF0ZSBmb3IgYmV0dGVyIHNwZWVkIGluIHRoZSBtb3N0IGZyZXF1ZW50IGNhc2VcbiAgICAgd2hlcmUgbm8gcmViYWxhbmNpbmcgaXMgcmVxdWlyZWQuICopXG5cbiAgbGV0IGJhbCBsIHYgciA9XG4gICAgbGV0IGhsID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICB8IExlYWYgXyAtPiAxXG4gICAgICB8IE5vZGUgKF8sIF8sIF8sIGgsIF8pIC0+IGhcbiAgICBpblxuICAgIGxldCBociA9XG4gICAgICBtYXRjaCByIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgfCBOb2RlIChfLCBfLCBfLCBoLCBfKSAtPiBoXG4gICAgaW5cbiAgICBpZiBobCA+IGhyICsgMlxuICAgIHRoZW4gKFxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlICgqIGJlY2F1c2UgaChsKT5oKHIpKzIgYW5kIGgobGVhZik9MSAqKVxuICAgICAgfCBOb2RlIChsbCwgbHYsIGxyLCBfLCBfKSAtPlxuICAgICAgICBpZiBoZWlnaHQgbGwgPj0gaGVpZ2h0IGxyXG4gICAgICAgIHRoZW4gY3JlYXRlIGxsIGx2IChjcmVhdGUgbHIgdiByKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBsciB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICB8IExlYWYgbHJ2IC0+XG4gICAgICAgICAgICBhc3NlcnQgKGlzX2VtcHR5IGxsKTtcbiAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGxsIGx2IEVtcHR5KSBscnYgKGNyZWF0ZSBFbXB0eSB2IHIpXG4gICAgICAgICAgfCBOb2RlIChscmwsIGxydiwgbHJyLCBfLCBfKSAtPiBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBscmwpIGxydiAoY3JlYXRlIGxyciB2IHIpKSlcbiAgICBlbHNlIGlmIGhyID4gaGwgKyAyXG4gICAgdGhlbiAoXG4gICAgICBtYXRjaCByIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2UgKCogYmVjYXVzZSBoKHIpPmgobCkrMiBhbmQgaChsZWFmKT0xICopXG4gICAgICB8IE5vZGUgKHJsLCBydiwgcnIsIF8sIF8pIC0+XG4gICAgICAgIGlmIGhlaWdodCByciA+PSBoZWlnaHQgcmxcbiAgICAgICAgdGhlbiBjcmVhdGUgKGNyZWF0ZSBsIHYgcmwpIHJ2IHJyXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIG1hdGNoIHJsIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgTGVhZiBybHYgLT5cbiAgICAgICAgICAgIGFzc2VydCAoaXNfZW1wdHkgcnIpO1xuICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB2IEVtcHR5KSBybHYgKGNyZWF0ZSBFbXB0eSBydiBycilcbiAgICAgICAgICB8IE5vZGUgKHJsbCwgcmx2LCBybHIsIF8sIF8pIC0+IGNyZWF0ZSAoY3JlYXRlIGwgdiBybGwpIHJsdiAoY3JlYXRlIHJsciBydiBycikpKVxuICAgIGVsc2UgKFxuICAgICAgbGV0IGggPSBpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSBpblxuICAgICAgbGV0IHNsID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgICB8IExlYWYgXyAtPiAxXG4gICAgICAgIHwgTm9kZSAoXywgXywgXywgXywgcykgLT4gc1xuICAgICAgaW5cbiAgICAgIGxldCBzciA9XG4gICAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IDBcbiAgICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIHMpIC0+IHNcbiAgICAgIGluXG4gICAgICBpZiBoID0gMSB0aGVuIExlYWYgdiBlbHNlIE5vZGUgKGwsIHYsIHIsIGgsIHNsICsgc3IgKyAxKSlcbiAgOztcblxuICAoKiBJbnNlcnRpb24gb2Ygb25lIGVsZW1lbnQgKilcblxuICBleGNlcHRpb24gU2FtZVxuXG4gIGxldCBhZGQgdCB4IH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBhdXggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBMZWFmIHhcbiAgICAgIHwgTGVhZiB2IC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gcmFpc2UgU2FtZVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gY3JlYXRlIChMZWFmIHgpIHYgRW1wdHlcbiAgICAgICAgZWxzZSBjcmVhdGUgRW1wdHkgdiAoTGVhZiB4KVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJhaXNlIFNhbWUgZWxzZSBpZiBjIDwgMCB0aGVuIGJhbCAoYXV4IGwpIHYgciBlbHNlIGJhbCBsIHYgKGF1eCByKVxuICAgIGluXG4gICAgdHJ5IGF1eCB0IHdpdGhcbiAgICB8IFNhbWUgLT4gdFxuICA7O1xuXG4gICgqIFNhbWUgYXMgY3JlYXRlIGFuZCBiYWwsIGJ1dCBubyBhc3N1bXB0aW9ucyBhcmUgbWFkZSBvbiB0aGUgcmVsYXRpdmUgaGVpZ2h0cyBvZiBsIGFuZFxuICAgICByLiAqKVxuICBsZXQgcmVjIGpvaW4gbCB2IHIgfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCBsLCByIHdpdGhcbiAgICB8IEVtcHR5LCBfIC0+IGFkZCByIHYgfmNvbXBhcmVfZWx0XG4gICAgfCBfLCBFbXB0eSAtPiBhZGQgbCB2IH5jb21wYXJlX2VsdFxuICAgIHwgTGVhZiBsdiwgXyAtPiBhZGQgKGFkZCByIHYgfmNvbXBhcmVfZWx0KSBsdiB+Y29tcGFyZV9lbHRcbiAgICB8IF8sIExlYWYgcnYgLT4gYWRkIChhZGQgbCB2IH5jb21wYXJlX2VsdCkgcnYgfmNvbXBhcmVfZWx0XG4gICAgfCBOb2RlIChsbCwgbHYsIGxyLCBsaCwgXyksIE5vZGUgKHJsLCBydiwgcnIsIHJoLCBfKSAtPlxuICAgICAgaWYgbGggPiByaCArIDJcbiAgICAgIHRoZW4gYmFsIGxsIGx2IChqb2luIGxyIHYgciB+Y29tcGFyZV9lbHQpXG4gICAgICBlbHNlIGlmIHJoID4gbGggKyAyXG4gICAgICB0aGVuIGJhbCAoam9pbiBsIHYgcmwgfmNvbXBhcmVfZWx0KSBydiByclxuICAgICAgZWxzZSBjcmVhdGUgbCB2IHJcbiAgOztcblxuICAoKiBTbWFsbGVzdCBhbmQgZ3JlYXRlc3QgZWxlbWVudCBvZiBhIHNldCAqKVxuICBsZXQgcmVjIG1pbl9lbHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IHwgTm9kZSAoRW1wdHksIHYsIF8sIF8sIF8pIC0+IFNvbWUgdlxuICAgIHwgTm9kZSAobCwgXywgXywgXywgXykgLT4gbWluX2VsdCBsXG4gIDs7XG5cbiAgZXhjZXB0aW9uIFNldF9taW5fZWx0X2V4bl9vZl9lbXB0eV9zZXQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbiAgbGV0ICgpID1cbiAgICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGRcbiAgICAgIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFNldF9taW5fZWx0X2V4bl9vZl9lbXB0eV9zZXRdXG4gICAgICAoZnVuY3Rpb25cbiAgICAgICAgfCBTZXRfbWluX2VsdF9leG5fb2ZfZW1wdHlfc2V0IC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5BdG9tIFwic2V0Lm1sLlRyZWUwLlNldF9taW5fZWx0X2V4bl9vZl9lbXB0eV9zZXRcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgZXhjZXB0aW9uIFNldF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9zZXQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbiAgbGV0ICgpID1cbiAgICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGRcbiAgICAgIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFNldF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9zZXRdXG4gICAgICAoZnVuY3Rpb25cbiAgICAgICAgfCBTZXRfbWF4X2VsdF9leG5fb2ZfZW1wdHlfc2V0IC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5BdG9tIFwic2V0Lm1sLlRyZWUwLlNldF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9zZXRcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IG1pbl9lbHRfZXhuIHQgPVxuICAgIG1hdGNoIG1pbl9lbHQgdCB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIFNldF9taW5fZWx0X2V4bl9vZl9lbXB0eV9zZXRcbiAgICB8IFNvbWUgdiAtPiB2XG4gIDs7XG5cbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoID1cbiAgICBsZXQgcmVjIGZvbGRfdW50aWxfaGVscGVyIH5mIHQgYWNjID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC5Db250aW51ZSBhY2NcbiAgICAgIHwgTGVhZiB2YWx1ZSAtPiBmIGFjYyB2YWx1ZVxuICAgICAgfCBOb2RlIChsZWZ0LCB2YWx1ZSwgcmlnaHQsIF8sIF8pIC0+XG4gICAgICAgIChtYXRjaCBmb2xkX3VudGlsX2hlbHBlciB+ZiBsZWZ0IGFjYyB3aXRoXG4gICAgICAgICB8IFN0b3AgX2EgYXMgeCAtPiB4XG4gICAgICAgICB8IENvbnRpbnVlIGFjYyAtPlxuICAgICAgICAgICAobWF0Y2ggZiBhY2MgdmFsdWUgd2l0aFxuICAgICAgICAgICAgfCBTdG9wIF9hIGFzIHggLT4geFxuICAgICAgICAgICAgfCBDb250aW51ZSBhIC0+IGZvbGRfdW50aWxfaGVscGVyIH5mIHJpZ2h0IGEpKVxuICAgIGluXG4gICAgbWF0Y2ggZm9sZF91bnRpbF9oZWxwZXIgfmYgdCBpbml0IHdpdGhcbiAgICB8IENvbnRpbnVlIHggLT4gZmluaXNoIHhcbiAgICB8IFN0b3AgeCAtPiB4XG4gIDs7XG5cbiAgbGV0IHJlYyBtYXhfZWx0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiB8IE5vZGUgKF8sIHYsIEVtcHR5LCBfLCBfKSAtPiBTb21lIHZcbiAgICB8IE5vZGUgKF8sIF8sIHIsIF8sIF8pIC0+IG1heF9lbHQgclxuICA7O1xuXG4gIGxldCBtYXhfZWx0X2V4biB0ID1cbiAgICBtYXRjaCBtYXhfZWx0IHQgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBTZXRfbWF4X2VsdF9leG5fb2ZfZW1wdHlfc2V0XG4gICAgfCBTb21lIHYgLT4gdlxuICA7O1xuXG4gICgqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gc2V0ICopXG5cbiAgbGV0IHJlYyByZW1vdmVfbWluX2VsdCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIlNldC5yZW1vdmVfbWluX2VsdFwiXG4gICAgfCBMZWFmIF8gLT4gRW1wdHlcbiAgICB8IE5vZGUgKEVtcHR5LCBfLCByLCBfLCBfKSAtPiByXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBiYWwgKHJlbW92ZV9taW5fZWx0IGwpIHYgclxuICA7O1xuXG4gICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLiAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICBBc3N1bWUgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi4gKilcbiAgbGV0IG1lcmdlIHQxIHQyID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgRW1wdHksIHQgLT4gdFxuICAgIHwgdCwgRW1wdHkgLT4gdFxuICAgIHwgXywgXyAtPiBiYWwgdDEgKG1pbl9lbHRfZXhuIHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpXG4gIDs7XG5cbiAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuICBBbGwgZWxlbWVudHMgb2YgbCBtdXN0IHByZWNlZGUgdGhlIGVsZW1lbnRzIG9mIHIuXG4gICAgIE5vIGFzc3VtcHRpb24gb24gdGhlIGhlaWdodHMgb2YgbCBhbmQgci4gKilcbiAgbGV0IGNvbmNhdCB0MSB0MiB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBFbXB0eSwgdCB8IHQsIEVtcHR5IC0+IHRcbiAgICB8IF8sIF8gLT4gam9pbiB0MSAobWluX2VsdF9leG4gdDIpIChyZW1vdmVfbWluX2VsdCB0MikgfmNvbXBhcmVfZWx0XG4gIDs7XG5cbiAgbGV0IHNwbGl0IHQgeCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgc3BsaXQgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gRW1wdHksIE5vbmUsIEVtcHR5XG4gICAgICB8IExlYWYgdiAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIEVtcHR5LCBTb21lIHYsIEVtcHR5XG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiBFbXB0eSwgTm9uZSwgTGVhZiB2XG4gICAgICAgIGVsc2UgTGVhZiB2LCBOb25lLCBFbXB0eVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIGwsIFNvbWUgdiwgclxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsbCwgbWF5YmVfZWx0LCBybCA9IHNwbGl0IGwgaW5cbiAgICAgICAgICBsbCwgbWF5YmVfZWx0LCBqb2luIHJsIHYgciB+Y29tcGFyZV9lbHQpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCBsciwgbWF5YmVfZWx0LCByciA9IHNwbGl0IHIgaW5cbiAgICAgICAgICBqb2luIGwgdiBsciB+Y29tcGFyZV9lbHQsIG1heWJlX2VsdCwgcnIpXG4gICAgaW5cbiAgICBzcGxpdCB0XG4gIDs7XG5cbiAgKCogSW1wbGVtZW50YXRpb24gb2YgdGhlIHNldCBvcGVyYXRpb25zICopXG5cbiAgbGV0IGVtcHR5ID0gRW1wdHlcblxuICBsZXQgcmVjIG1lbSB0IHggfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IGZhbHNlXG4gICAgfCBMZWFmIHYgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICBjID0gMFxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICBjID0gMCB8fCBtZW0gKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpIHggfmNvbXBhcmVfZWx0XG4gIDs7XG5cbiAgbGV0IHNpbmdsZXRvbiB4ID0gTGVhZiB4XG5cbiAgbGV0IHJlbW92ZSB0IHggfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGF1eCB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiByYWlzZSBTYW1lXG4gICAgICB8IExlYWYgdiAtPiBpZiBjb21wYXJlX2VsdCB4IHYgPSAwIHRoZW4gRW1wdHkgZWxzZSByYWlzZSBTYW1lXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gbWVyZ2UgbCByIGVsc2UgaWYgYyA8IDAgdGhlbiBiYWwgKGF1eCBsKSB2IHIgZWxzZSBiYWwgbCB2IChhdXggcilcbiAgICBpblxuICAgIHRyeSBhdXggdCB3aXRoXG4gICAgfCBTYW1lIC0+IHRcbiAgOztcblxuICBsZXQgcmVtb3ZlX2luZGV4IHQgaSB+Y29tcGFyZV9lbHQ6XyA9XG4gICAgbGV0IHJlYyBhdXggdCBpID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiByYWlzZSBTYW1lXG4gICAgICB8IExlYWYgXyAtPiBpZiBpID0gMCB0aGVuIEVtcHR5IGVsc2UgcmFpc2UgU2FtZVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBsZXQgbF9zaXplID0gbGVuZ3RoIGwgaW5cbiAgICAgICAgbGV0IGMgPSBQb2x5LmNvbXBhcmUgaSBsX3NpemUgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiBtZXJnZSBsIHJcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIGJhbCAoYXV4IGwgaSkgdiByXG4gICAgICAgIGVsc2UgYmFsIGwgdiAoYXV4IHIgKGkgLSBsX3NpemUgLSAxKSlcbiAgICBpblxuICAgIHRyeSBhdXggdCBpIHdpdGhcbiAgICB8IFNhbWUgLT4gdFxuICA7O1xuXG4gIGxldCB1bmlvbiBzMSBzMiB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgdW5pb24gczEgczIgPVxuICAgICAgaWYgcGh5c19lcXVhbCBzMSBzMlxuICAgICAgdGhlbiBzMVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHMxLCBzMiB3aXRoXG4gICAgICAgIHwgRW1wdHksIHQgfCB0LCBFbXB0eSAtPiB0XG4gICAgICAgIHwgTGVhZiB2MSwgXyAtPiB1bmlvbiAoTm9kZSAoRW1wdHksIHYxLCBFbXB0eSwgMSwgMSkpIHMyXG4gICAgICAgIHwgXywgTGVhZiB2MiAtPiB1bmlvbiBzMSAoTm9kZSAoRW1wdHksIHYyLCBFbXB0eSwgMSwgMSkpXG4gICAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwgaDEsIF8pLCBOb2RlIChsMiwgdjIsIHIyLCBoMiwgXykgLT5cbiAgICAgICAgICBpZiBoMSA+PSBoMlxuICAgICAgICAgIHRoZW5cbiAgICAgICAgICAgIGlmIGgyID0gMVxuICAgICAgICAgICAgdGhlbiBhZGQgczEgdjIgfmNvbXBhcmVfZWx0XG4gICAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgICAgbGV0IGwyLCBfLCByMiA9IHNwbGl0IHMyIHYxIH5jb21wYXJlX2VsdCBpblxuICAgICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikgdjEgKHVuaW9uIHIxIHIyKSB+Y29tcGFyZV9lbHQpXG4gICAgICAgICAgZWxzZSBpZiBoMSA9IDFcbiAgICAgICAgICB0aGVuIGFkZCBzMiB2MSB+Y29tcGFyZV9lbHRcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCBsMSwgXywgcjEgPSBzcGxpdCBzMSB2MiB+Y29tcGFyZV9lbHQgaW5cbiAgICAgICAgICAgIGpvaW4gKHVuaW9uIGwxIGwyKSB2MiAodW5pb24gcjEgcjIpIH5jb21wYXJlX2VsdCkpXG4gICAgaW5cbiAgICB1bmlvbiBzMSBzMlxuICA7O1xuXG4gIGxldCB1bmlvbl9saXN0IH5jb21wYXJhdG9yIH50b190cmVlIHhzID1cbiAgICBsZXQgY29tcGFyZV9lbHQgPSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBpblxuICAgIExpc3QuZm9sZCB4cyB+aW5pdDplbXB0eSB+ZjooZnVuIGFjIHggLT4gdW5pb24gYWMgKHRvX3RyZWUgeCkgfmNvbXBhcmVfZWx0KVxuICA7O1xuXG4gIGxldCBpbnRlciBzMSBzMiB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgaW50ZXIgczEgczIgPVxuICAgICAgaWYgcGh5c19lcXVhbCBzMSBzMlxuICAgICAgdGhlbiBzMVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHMxLCBzMiB3aXRoXG4gICAgICAgIHwgRW1wdHksIF8gfCBfLCBFbXB0eSAtPiBFbXB0eVxuICAgICAgICB8IChMZWFmIGVsdCBhcyBzaW5nbGV0b24pLCBvdGhlcl9zZXQgfCBvdGhlcl9zZXQsIChMZWFmIGVsdCBhcyBzaW5nbGV0b24pIC0+XG4gICAgICAgICAgaWYgbWVtIG90aGVyX3NldCBlbHQgfmNvbXBhcmVfZWx0IHRoZW4gc2luZ2xldG9uIGVsc2UgRW1wdHlcbiAgICAgICAgfCBOb2RlIChsMSwgdjEsIHIxLCBfLCBfKSwgdDIgLT5cbiAgICAgICAgICAobWF0Y2ggc3BsaXQgdDIgdjEgfmNvbXBhcmVfZWx0IHdpdGhcbiAgICAgICAgICAgfCBsMiwgTm9uZSwgcjIgLT4gY29uY2F0IChpbnRlciBsMSBsMikgKGludGVyIHIxIHIyKSB+Y29tcGFyZV9lbHRcbiAgICAgICAgICAgfCBsMiwgU29tZSB2MSwgcjIgLT4gam9pbiAoaW50ZXIgbDEgbDIpIHYxIChpbnRlciByMSByMikgfmNvbXBhcmVfZWx0KSlcbiAgICBpblxuICAgIGludGVyIHMxIHMyXG4gIDs7XG5cbiAgbGV0IGRpZmYgczEgczIgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGRpZmYgczEgczIgPVxuICAgICAgaWYgcGh5c19lcXVhbCBzMSBzMlxuICAgICAgdGhlbiBFbXB0eVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHMxLCBzMiB3aXRoXG4gICAgICAgIHwgRW1wdHksIF8gLT4gRW1wdHlcbiAgICAgICAgfCB0MSwgRW1wdHkgLT4gdDFcbiAgICAgICAgfCBMZWFmIHYxLCB0MiAtPiBkaWZmIChOb2RlIChFbXB0eSwgdjEsIEVtcHR5LCAxLCAxKSkgdDJcbiAgICAgICAgfCBOb2RlIChsMSwgdjEsIHIxLCBfLCBfKSwgdDIgLT5cbiAgICAgICAgICAobWF0Y2ggc3BsaXQgdDIgdjEgfmNvbXBhcmVfZWx0IHdpdGhcbiAgICAgICAgICAgfCBsMiwgTm9uZSwgcjIgLT4gam9pbiAoZGlmZiBsMSBsMikgdjEgKGRpZmYgcjEgcjIpIH5jb21wYXJlX2VsdFxuICAgICAgICAgICB8IGwyLCBTb21lIF8sIHIyIC0+IGNvbmNhdCAoZGlmZiBsMSBsMikgKGRpZmYgcjEgcjIpIH5jb21wYXJlX2VsdCkpXG4gICAgaW5cbiAgICBkaWZmIHMxIHMyXG4gIDs7XG5cbiAgbW9kdWxlIEVudW0gPSBzdHJ1Y3RcbiAgICB0eXBlIGluY3JlYXNpbmdcbiAgICB0eXBlIGRlY3JlYXNpbmdcblxuICAgIHR5cGUgKCdhLCAnZGlyZWN0aW9uKSB0ID1cbiAgICAgIHwgRW5kXG4gICAgICB8IE1vcmUgb2YgJ2EgKiAnYSB0cmVlICogKCdhLCAnZGlyZWN0aW9uKSB0XG5cbiAgICBsZXQgcmVjIGNvbnMgcyAoZSA6IChfLCBpbmNyZWFzaW5nKSB0KSA6IChfLCBpbmNyZWFzaW5nKSB0ID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICB8IExlYWYgdiAtPiBNb3JlICh2LCBFbXB0eSwgZSlcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gY29ucyBsIChNb3JlICh2LCByLCBlKSlcbiAgICA7O1xuXG4gICAgbGV0IHJlYyBjb25zX3JpZ2h0IHMgKGUgOiAoXywgZGVjcmVhc2luZykgdCkgOiAoXywgZGVjcmVhc2luZykgdCA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgfCBMZWFmIHYgLT4gTW9yZSAodiwgRW1wdHksIGUpXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGNvbnNfcmlnaHQgciAoTW9yZSAodiwgbCwgZSkpXG4gICAgOztcblxuICAgIGxldCBvZl9zZXQgcyA6IChfLCBpbmNyZWFzaW5nKSB0ID0gY29ucyBzIEVuZFxuICAgIGxldCBvZl9zZXRfcmlnaHQgcyA6IChfLCBkZWNyZWFzaW5nKSB0ID0gY29uc19yaWdodCBzIEVuZFxuXG4gICAgbGV0IHN0YXJ0aW5nX2F0X2luY3JlYXNpbmcgdCBrZXkgY29tcGFyZSA6IChfLCBpbmNyZWFzaW5nKSB0ID1cbiAgICAgIGxldCByZWMgbG9vcCB0IGUgPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBlXG4gICAgICAgIHwgTGVhZiB2IC0+IGxvb3AgKE5vZGUgKEVtcHR5LCB2LCBFbXB0eSwgMSwgMSkpIGVcbiAgICAgICAgfCBOb2RlIChfLCB2LCByLCBfLCBfKSB3aGVuIGNvbXBhcmUgdiBrZXkgPCAwIC0+IGxvb3AgciBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gbG9vcCBsIChNb3JlICh2LCByLCBlKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQgRW5kXG4gICAgOztcblxuICAgIGxldCBzdGFydGluZ19hdF9kZWNyZWFzaW5nIHQga2V5IGNvbXBhcmUgOiAoXywgZGVjcmVhc2luZykgdCA9XG4gICAgICBsZXQgcmVjIGxvb3AgdCBlID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgICB8IExlYWYgdiAtPiBsb29wIChOb2RlIChFbXB0eSwgdiwgRW1wdHksIDEsIDEpKSBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgXywgXywgXykgd2hlbiBjb21wYXJlIHYga2V5ID4gMCAtPiBsb29wIGwgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGxvb3AgciAoTW9yZSAodiwgbCwgZSkpXG4gICAgICBpblxuICAgICAgbG9vcCB0IEVuZFxuICAgIDs7XG5cbiAgICBsZXQgY29tcGFyZSBjb21wYXJlX2VsdCBlMSBlMiA9XG4gICAgICBsZXQgcmVjIGxvb3AgZTEgZTIgPVxuICAgICAgICBtYXRjaCBlMSwgZTIgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IDBcbiAgICAgICAgfCBFbmQsIF8gLT4gLTFcbiAgICAgICAgfCBfLCBFbmQgLT4gMVxuICAgICAgICB8IE1vcmUgKHYxLCByMSwgZTEpLCBNb3JlICh2MiwgcjIsIGUyKSAtPlxuICAgICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgdjEgdjIgaW5cbiAgICAgICAgICBpZiBjIDw+IDBcbiAgICAgICAgICB0aGVuIGNcbiAgICAgICAgICBlbHNlIGlmIHBoeXNfZXF1YWwgcjEgcjJcbiAgICAgICAgICB0aGVuIGxvb3AgZTEgZTJcbiAgICAgICAgICBlbHNlIGxvb3AgKGNvbnMgcjEgZTEpIChjb25zIHIyIGUyKVxuICAgICAgaW5cbiAgICAgIGxvb3AgZTEgZTJcbiAgICA7O1xuXG4gICAgbGV0IHJlYyBpdGVyIH5mID0gZnVuY3Rpb25cbiAgICAgIHwgRW5kIC0+ICgpXG4gICAgICB8IE1vcmUgKGEsIHRyZWUsIGVudW0pIC0+XG4gICAgICAgIGYgYTtcbiAgICAgICAgaXRlciAoY29ucyB0cmVlIGVudW0pIH5mXG4gICAgOztcblxuICAgIGxldCBpdGVyMiBjb21wYXJlX2VsdCB0MSB0MiB+ZiA9XG4gICAgICBsZXQgcmVjIGxvb3AgdDEgdDIgPVxuICAgICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+ICgpXG4gICAgICAgIHwgRW5kLCBfIC0+IGl0ZXIgdDIgfmY6KGZ1biBhIC0+IGYgKGBSaWdodCBhKSlcbiAgICAgICAgfCBfLCBFbmQgLT4gaXRlciB0MSB+ZjooZnVuIGEgLT4gZiAoYExlZnQgYSkpXG4gICAgICAgIHwgTW9yZSAoYTEsIHRyZWUxLCBlbnVtMSksIE1vcmUgKGEyLCB0cmVlMiwgZW51bTIpIC0+XG4gICAgICAgICAgbGV0IGNvbXBhcmVfcmVzdWx0ID0gY29tcGFyZV9lbHQgYTEgYTIgaW5cbiAgICAgICAgICBpZiBjb21wYXJlX3Jlc3VsdCA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGYgKGBCb3RoIChhMSwgYTIpKTtcbiAgICAgICAgICAgIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIChjb25zIHRyZWUyIGVudW0yKSlcbiAgICAgICAgICBlbHNlIGlmIGNvbXBhcmVfcmVzdWx0IDwgMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgZiAoYExlZnQgYTEpO1xuICAgICAgICAgICAgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgdDIpXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBmIChgUmlnaHQgYTIpO1xuICAgICAgICAgICAgbG9vcCB0MSAoY29ucyB0cmVlMiBlbnVtMikpXG4gICAgICBpblxuICAgICAgbG9vcCB0MSB0MlxuICAgIDs7XG5cbiAgICBsZXQgc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfZWx0ID1cbiAgICAgIGxldCBzdGVwIHN0YXRlIDogKChfLCBfKSBFaXRoZXIudCwgXykgU2VxdWVuY2UuU3RlcC50ID1cbiAgICAgICAgbWF0Y2ggc3RhdGUgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IERvbmVcbiAgICAgICAgfCBFbmQsIE1vcmUgKGVsdCwgdHJlZSwgZW51bSkgLT4gWWllbGQgKFNlY29uZCBlbHQsIChFbmQsIGNvbnMgdHJlZSBlbnVtKSlcbiAgICAgICAgfCBNb3JlIChlbHQsIHRyZWUsIGVudW0pLCBFbmQgLT4gWWllbGQgKEZpcnN0IGVsdCwgKGNvbnMgdHJlZSBlbnVtLCBFbmQpKVxuICAgICAgICB8IChNb3JlIChhMSwgdHJlZTEsIGVudW0xKSBhcyBsZWZ0KSwgKE1vcmUgKGEyLCB0cmVlMiwgZW51bTIpIGFzIHJpZ2h0KSAtPlxuICAgICAgICAgIGxldCBjb21wYXJlX3Jlc3VsdCA9IGNvbXBhcmVfZWx0IGExIGEyIGluXG4gICAgICAgICAgaWYgY29tcGFyZV9yZXN1bHQgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgbmV4dF9zdGF0ZSA9XG4gICAgICAgICAgICAgIGlmIHBoeXNfZXF1YWwgdHJlZTEgdHJlZTJcbiAgICAgICAgICAgICAgdGhlbiBlbnVtMSwgZW51bTJcbiAgICAgICAgICAgICAgZWxzZSBjb25zIHRyZWUxIGVudW0xLCBjb25zIHRyZWUyIGVudW0yXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgU2tpcCBuZXh0X3N0YXRlKVxuICAgICAgICAgIGVsc2UgaWYgY29tcGFyZV9yZXN1bHQgPCAwXG4gICAgICAgICAgdGhlbiBZaWVsZCAoRmlyc3QgYTEsIChjb25zIHRyZWUxIGVudW0xLCByaWdodCkpXG4gICAgICAgICAgZWxzZSBZaWVsZCAoU2Vjb25kIGEyLCAobGVmdCwgY29ucyB0cmVlMiBlbnVtMikpXG4gICAgICBpblxuICAgICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQ6KG9mX3NldCB0MSwgb2Zfc2V0IHQyKSB+ZjpzdGVwXG4gICAgOztcbiAgZW5kXG5cbiAgbGV0IHRvX3NlcXVlbmNlX2luY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9lbHQgdCA9XG4gICAgbGV0IG5leHQgZW51bSA9XG4gICAgICBtYXRjaCBlbnVtIHdpdGhcbiAgICAgIHwgRW51bS5FbmQgLT4gU2VxdWVuY2UuU3RlcC5Eb25lXG4gICAgICB8IEVudW0uTW9yZSAoaywgdCwgZSkgLT4gU2VxdWVuY2UuU3RlcC5ZaWVsZCAoaywgRW51bS5jb25zIHQgZSlcbiAgICBpblxuICAgIGxldCBpbml0ID1cbiAgICAgIG1hdGNoIGZyb21fZWx0IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBFbnVtLm9mX3NldCB0XG4gICAgICB8IFNvbWUga2V5IC0+IEVudW0uc3RhcnRpbmdfYXRfaW5jcmVhc2luZyB0IGtleSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQgfmY6bmV4dFxuICA7O1xuXG4gIGxldCB0b19zZXF1ZW5jZV9kZWNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fZWx0IHQgPVxuICAgIGxldCBuZXh0IGVudW0gPVxuICAgICAgbWF0Y2ggZW51bSB3aXRoXG4gICAgICB8IEVudW0uRW5kIC0+IFNlcXVlbmNlLlN0ZXAuRG9uZVxuICAgICAgfCBFbnVtLk1vcmUgKGssIHQsIGUpIC0+IFNlcXVlbmNlLlN0ZXAuWWllbGQgKGssIEVudW0uY29uc19yaWdodCB0IGUpXG4gICAgaW5cbiAgICBsZXQgaW5pdCA9XG4gICAgICBtYXRjaCBmcm9tX2VsdCB3aXRoXG4gICAgICB8IE5vbmUgLT4gRW51bS5vZl9zZXRfcmlnaHQgdFxuICAgICAgfCBTb21lIGtleSAtPiBFbnVtLnN0YXJ0aW5nX2F0X2RlY3JlYXNpbmcgdCBrZXkgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0IH5mOm5leHRcbiAgOztcblxuICBsZXQgdG9fc2VxdWVuY2VcbiAgICAgICAgY29tcGFyYXRvclxuICAgICAgICA/KG9yZGVyID0gYEluY3JlYXNpbmcpXG4gICAgICAgID9ncmVhdGVyX29yX2VxdWFsX3RvXG4gICAgICAgID9sZXNzX29yX2VxdWFsX3RvXG4gICAgICAgIHRcbiAgICA9XG4gICAgbGV0IGluY2x1c2l2ZV9ib3VuZCBzaWRlIHQgYm91bmQgPVxuICAgICAgbGV0IGNvbXBhcmVfZWx0ID0gY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgaW5cbiAgICAgIGxldCBsLCBtYXliZSwgciA9IHNwbGl0IHQgYm91bmQgfmNvbXBhcmVfZWx0IGluXG4gICAgICBsZXQgdCA9IHNpZGUgKGwsIHIpIGluXG4gICAgICBtYXRjaCBtYXliZSB3aXRoXG4gICAgICB8IE5vbmUgLT4gdFxuICAgICAgfCBTb21lIGVsdCAtPiBhZGQgdCBlbHQgfmNvbXBhcmVfZWx0XG4gICAgaW5cbiAgICBtYXRjaCBvcmRlciB3aXRoXG4gICAgfCBgSW5jcmVhc2luZyAtPlxuICAgICAgbGV0IHQgPSBPcHRpb24uZm9sZCBsZXNzX29yX2VxdWFsX3RvIH5pbml0OnQgfmY6KGluY2x1c2l2ZV9ib3VuZCBmc3QpIGluXG4gICAgICB0b19zZXF1ZW5jZV9pbmNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fZWx0OmdyZWF0ZXJfb3JfZXF1YWxfdG8gdFxuICAgIHwgYERlY3JlYXNpbmcgLT5cbiAgICAgIGxldCB0ID0gT3B0aW9uLmZvbGQgZ3JlYXRlcl9vcl9lcXVhbF90byB+aW5pdDp0IH5mOihpbmNsdXNpdmVfYm91bmQgc25kKSBpblxuICAgICAgdG9fc2VxdWVuY2VfZGVjcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2VsdDpsZXNzX29yX2VxdWFsX3RvIHRcbiAgOztcblxuXG4gIGxldCByZWMgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IGlmIGYgdiB0aGVuIFNvbWUgdiBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICBpZiBmIHZcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgbCB+ZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBTb21lIHZcbiAgICAgICAgfCBTb21lIF8gYXMgeCAtPiB4KVxuICAgICAgZWxzZSBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgciB+ZlxuICA7O1xuXG4gIGxldCByZWMgZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gaWYgZiB2IHRoZW4gU29tZSB2IGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgIGlmIGYgdlxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHIgfmYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gU29tZSB2XG4gICAgICAgIHwgU29tZSBfIGFzIHggLT4geClcbiAgICAgIGVsc2UgZmluZF9sYXN0X3NhdGlzZnlpbmcgbCB+ZlxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHYgPVxuICAgIG1hdGNoIGhvdyB3aXRoXG4gICAgfCBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gLT4gZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPCAwKVxuICAgIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvIC0+IGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDw9IDApXG4gICAgfCBgRmlyc3RfZXF1YWxfdG8gLT5cbiAgICAgIChtYXRjaCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPj0gMCkgd2l0aFxuICAgICAgIHwgU29tZSB4IGFzIGVsdCB3aGVuIGNvbXBhcmUgeCB2ID0gMCAtPiBlbHRcbiAgICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgICB8IGBMYXN0X2VxdWFsX3RvIC0+XG4gICAgICAobWF0Y2ggZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPD0gMCkgd2l0aFxuICAgICAgIHwgU29tZSB4IGFzIGVsdCB3aGVuIGNvbXBhcmUgeCB2ID0gMCAtPiBlbHRcbiAgICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gLT5cbiAgICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA+PSAwKVxuICAgIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAtPlxuICAgICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID4gMClcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIGxldCBpc19sZWZ0IHggPVxuICAgICAgbWF0Y2ggc2VnbWVudF9vZiB4IHdpdGhcbiAgICAgIHwgYExlZnQgLT4gdHJ1ZVxuICAgICAgfCBgUmlnaHQgLT4gZmFsc2VcbiAgICBpblxuICAgIGxldCBpc19yaWdodCB4ID0gbm90IChpc19sZWZ0IHgpIGluXG4gICAgbWF0Y2ggaG93IHdpdGhcbiAgICB8IGBMYXN0X29uX2xlZnQgLT4gZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+Zjppc19sZWZ0XG4gICAgfCBgRmlyc3Rfb25fcmlnaHQgLT4gZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6aXNfcmlnaHRcbiAgOztcblxuICBsZXQgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICAgICAgY29tcGFyYXRvclxuICAgICAgICA/KG9yZGVyID0gYEluY3JlYXNpbmcpXG4gICAgICAgID9ncmVhdGVyX29yX2VxdWFsX3RvXG4gICAgICAgID9sZXNzX29yX2VxdWFsX3RvXG4gICAgICAgIHRcbiAgICAgICAgdCdcbiAgICA9XG4gICAgU2VxdWVuY2UubWVyZ2Vfd2l0aF9kdXBsaWNhdGVzXG4gICAgICAodG9fc2VxdWVuY2UgY29tcGFyYXRvciB+b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdClcbiAgICAgICh0b19zZXF1ZW5jZSBjb21wYXJhdG9yIH5vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0JylcbiAgICAgIH5jb21wYXJlOlxuICAgICAgICAobWF0Y2ggb3JkZXIgd2l0aFxuICAgICAgICAgfCBgSW5jcmVhc2luZyAtPiBjb21wYXJhdG9yLmNvbXBhcmVcbiAgICAgICAgIHwgYERlY3JlYXNpbmcgLT4gRm4uZmxpcCBjb21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmUgY29tcGFyZV9lbHQgczEgczIgPVxuICAgIEVudW0uY29tcGFyZSBjb21wYXJlX2VsdCAoRW51bS5vZl9zZXQgczEpIChFbnVtLm9mX3NldCBzMilcbiAgOztcblxuICBsZXQgaXRlcjIgczEgczIgfmNvbXBhcmVfZWx0ID0gRW51bS5pdGVyMiBjb21wYXJlX2VsdCAoRW51bS5vZl9zZXQgczEpIChFbnVtLm9mX3NldCBzMilcbiAgbGV0IGVxdWFsIHMxIHMyIH5jb21wYXJlX2VsdCA9IGNvbXBhcmUgY29tcGFyZV9lbHQgczEgczIgPSAwXG5cbiAgbGV0IGlzX3N1YnNldCBzMSB+b2ZfOnMyIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBpc19zdWJzZXQgczEgfm9mXzpzMiA9XG4gICAgICBtYXRjaCBzMSwgczIgd2l0aFxuICAgICAgfCBFbXB0eSwgXyAtPiB0cnVlXG4gICAgICB8IF8sIEVtcHR5IC0+IGZhbHNlXG4gICAgICB8IExlYWYgdjEsIHQyIC0+IG1lbSB0MiB2MSB+Y29tcGFyZV9lbHRcbiAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwgXywgXyksIExlYWYgdjIgLT5cbiAgICAgICAgKG1hdGNoIGwxLCByMSB3aXRoXG4gICAgICAgICB8IEVtcHR5LCBFbXB0eSAtPlxuICAgICAgICAgICAoKiBUaGlzIGNhc2Ugc2hvdWxkbid0IG9jY3VyIGluIHByYWN0aWNlIGJlY2F1c2Ugd2Ugc2hvdWxkIGhhdmUgY29uc3RydWN0ZWRcbiAgICAgICAgICAgICAgYSBMZWFmIHJhdGhlciB0aGFuIGEgTm9kZSB3aXRoIHR3byBFbXB0eSBzdWJ0cmVlcyAqKVxuICAgICAgICAgICBjb21wYXJlX2VsdCB2MSB2MiA9IDBcbiAgICAgICAgIHwgXywgXyAtPiBmYWxzZSlcbiAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwgXywgXyksIChOb2RlIChsMiwgdjIsIHIyLCBfLCBfKSBhcyB0MikgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB2MSB2MiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuXG4gICAgICAgICAgcGh5c19lcXVhbCBzMSBzMiB8fCAoaXNfc3Vic2V0IGwxIH5vZl86bDIgJiYgaXNfc3Vic2V0IHIxIH5vZl86cjIpXG4gICAgICAgICAgKCogTm90ZSB0aGF0IGhlaWdodCBhbmQgc2l6ZSBkb24ndCBtYXR0ZXIgaGVyZS4gKilcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIGlzX3N1YnNldCAoTm9kZSAobDEsIHYxLCBFbXB0eSwgMCwgMCkpIH5vZl86bDIgJiYgaXNfc3Vic2V0IHIxIH5vZl86dDJcbiAgICAgICAgZWxzZSBpc19zdWJzZXQgKE5vZGUgKEVtcHR5LCB2MSwgcjEsIDAsIDApKSB+b2ZfOnIyICYmIGlzX3N1YnNldCBsMSB+b2ZfOnQyXG4gICAgaW5cbiAgICBpc19zdWJzZXQgczEgfm9mXzpzMlxuICA7O1xuXG4gIGxldCByZWMgYXJlX2Rpc2pvaW50IHMxIHMyIH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgICB8IEVtcHR5LCBfIHwgXywgRW1wdHkgLT4gdHJ1ZVxuICAgIHwgTGVhZiBlbHQsIG90aGVyX3NldCB8IG90aGVyX3NldCwgTGVhZiBlbHQgLT4gbm90IChtZW0gb3RoZXJfc2V0IGVsdCB+Y29tcGFyZV9lbHQpXG4gICAgfCBOb2RlIChsMSwgdjEsIHIxLCBfLCBfKSwgdDIgLT5cbiAgICAgIGlmIHBoeXNfZXF1YWwgczEgczJcbiAgICAgIHRoZW4gZmFsc2VcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBzcGxpdCB0MiB2MSB+Y29tcGFyZV9lbHQgd2l0aFxuICAgICAgICB8IGwyLCBOb25lLCByMiAtPlxuICAgICAgICAgIGFyZV9kaXNqb2ludCBsMSBsMiB+Y29tcGFyZV9lbHQgJiYgYXJlX2Rpc2pvaW50IHIxIHIyIH5jb21wYXJlX2VsdFxuICAgICAgICB8IF8sIFNvbWUgXywgXyAtPiBmYWxzZSlcbiAgOztcblxuICBsZXQgaXRlciB0IH5mID1cbiAgICBsZXQgcmVjIGl0ZXIgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiAoKVxuICAgICAgfCBMZWFmIHYgLT4gZiB2XG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGl0ZXIgbDtcbiAgICAgICAgZiB2O1xuICAgICAgICBpdGVyIHJcbiAgICBpblxuICAgIGl0ZXIgdFxuICA7O1xuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiA9IEVudW0uc3ltbWV0cmljX2RpZmZcblxuICBsZXQgcmVjIGZvbGQgcyB+aW5pdDphY2N1IH5mID1cbiAgICBtYXRjaCBzIHdpdGhcbiAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICB8IExlYWYgdiAtPiBmIGFjY3UgdlxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gZm9sZCB+ZiByIH5pbml0OihmIChmb2xkIH5mIGwgfmluaXQ6YWNjdSkgdilcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX3RfaWdub3Jpbmdfc3RydWN0dXJlIGhhc2hfZm9sZF9lbGVtIHN0YXRlIHQgPVxuICAgIGZvbGQgdCB+aW5pdDooaGFzaF9mb2xkX2ludCBzdGF0ZSAobGVuZ3RoIHQpKSB+ZjpoYXNoX2ZvbGRfZWxlbVxuICA7O1xuXG4gIGxldCBjb3VudCB0IH5mID0gQ29udGFpbmVyLmNvdW50IH5mb2xkIHQgfmZcbiAgbGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxuXG4gIGxldCByZWMgZm9sZF9yaWdodCBzIH5pbml0OmFjY3UgfmYgPVxuICAgIG1hdGNoIHMgd2l0aFxuICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgIHwgTGVhZiB2IC0+IGYgdiBhY2N1XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBmb2xkX3JpZ2h0IH5mIGwgfmluaXQ6KGYgdiAoZm9sZF9yaWdodCB+ZiByIH5pbml0OmFjY3UpKVxuICA7O1xuXG4gIGxldCByZWMgZm9yX2FsbCB0IH5mOnAgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gdHJ1ZVxuICAgIHwgTGVhZiB2IC0+IHAgdlxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gcCB2ICYmIGZvcl9hbGwgfmY6cCBsICYmIGZvcl9hbGwgfmY6cCByXG4gIDs7XG5cbiAgbGV0IHJlYyBleGlzdHMgdCB+ZjpwID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IGZhbHNlXG4gICAgfCBMZWFmIHYgLT4gcCB2XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBwIHYgfHwgZXhpc3RzIH5mOnAgbCB8fCBleGlzdHMgfmY6cCByXG4gIDs7XG5cbiAgbGV0IGZpbHRlciBzIH5mOnAgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGZpbHQgYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTGVhZiB2IC0+IGlmIHAgdiB0aGVuIGFkZCBhY2N1IHYgfmNvbXBhcmVfZWx0IGVsc2UgYWNjdVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBmaWx0IChmaWx0IChpZiBwIHYgdGhlbiBhZGQgYWNjdSB2IH5jb21wYXJlX2VsdCBlbHNlIGFjY3UpIGwpIHJcbiAgICBpblxuICAgIGZpbHQgRW1wdHkgc1xuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwIHMgfmY6cCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgZmlsdCBhY2N1ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBMZWFmIHYgLT5cbiAgICAgICAgKG1hdGNoIHAgdiB3aXRoXG4gICAgICAgICB8IE5vbmUgLT4gYWNjdVxuICAgICAgICAgfCBTb21lIHYgLT4gYWRkIGFjY3UgdiB+Y29tcGFyZV9lbHQpXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIGZpbHRcbiAgICAgICAgICAoZmlsdFxuICAgICAgICAgICAgIChtYXRjaCBwIHYgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT4gYWNjdVxuICAgICAgICAgICAgICB8IFNvbWUgdiAtPiBhZGQgYWNjdSB2IH5jb21wYXJlX2VsdClcbiAgICAgICAgICAgICBsKVxuICAgICAgICAgIHJcbiAgICBpblxuICAgIGZpbHQgRW1wdHkgc1xuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fdGYgcyB+ZjpwIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBwYXJ0ICgodCwgZikgYXMgYWNjdSkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgICB8IExlYWYgdiAtPiBpZiBwIHYgdGhlbiBhZGQgdCB2IH5jb21wYXJlX2VsdCwgZiBlbHNlIHQsIGFkZCBmIHYgfmNvbXBhcmVfZWx0XG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgIHBhcnQgKHBhcnQgKGlmIHAgdiB0aGVuIGFkZCB0IHYgfmNvbXBhcmVfZWx0LCBmIGVsc2UgdCwgYWRkIGYgdiB+Y29tcGFyZV9lbHQpIGwpIHJcbiAgICBpblxuICAgIHBhcnQgKEVtcHR5LCBFbXB0eSkgc1xuICA7O1xuXG4gIGxldCByZWMgZWxlbWVudHNfYXV4IGFjY3UgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgIHwgTGVhZiB2IC0+IHYgOjogYWNjdVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gZWxlbWVudHNfYXV4ICh2IDo6IGVsZW1lbnRzX2F1eCBhY2N1IHIpIGxcbiAgOztcblxuICBsZXQgZWxlbWVudHMgcyA9IGVsZW1lbnRzX2F1eCBbXSBzXG5cbiAgbGV0IGNob29zZSB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBTb21lIHZcbiAgICB8IE5vZGUgKF8sIHYsIF8sIF8sIF8pIC0+IFNvbWUgdlxuICA7O1xuXG4gIGxldCBjaG9vc2VfZXhuID1cbiAgICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTZXQuY2hvb3NlX2V4bjogZW1wdHkgc2V0XCIpIGluXG4gICAgbGV0IGNob29zZV9leG4gdCA9XG4gICAgICBtYXRjaCBjaG9vc2UgdCB3aXRoXG4gICAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgICB8IFNvbWUgdiAtPiB2XG4gICAgaW5cbiAgICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gICAgY2hvb3NlX2V4blxuICA7O1xuXG4gIGxldCBvZl9saXN0IGxzdCB+Y29tcGFyZV9lbHQgPVxuICAgIExpc3QuZm9sZCBsc3QgfmluaXQ6ZW1wdHkgfmY6KGZ1biB0IHggLT4gYWRkIHQgeCB+Y29tcGFyZV9lbHQpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlIHNlcXVlbmNlIH5jb21wYXJlX2VsdCA9XG4gICAgU2VxdWVuY2UuZm9sZCBzZXF1ZW5jZSB+aW5pdDplbXB0eSB+ZjooZnVuIHQgeCAtPiBhZGQgdCB4IH5jb21wYXJlX2VsdClcbiAgOztcblxuICBsZXQgdG9fbGlzdCBzID0gZWxlbWVudHMgc1xuXG4gIGxldCBvZl9hcnJheSBhIH5jb21wYXJlX2VsdCA9XG4gICAgQXJyYXkuZm9sZCBhIH5pbml0OmVtcHR5IH5mOihmdW4gdCB4IC0+IGFkZCB0IHggfmNvbXBhcmVfZWx0KVxuICA7O1xuXG4gICgqIGZhc3RlciBidXQgZXF1aXZhbGVudCB0byBbQXJyYXkub2ZfbGlzdCAodG9fbGlzdCB0KV0gKilcbiAgbGV0IHRvX2FycmF5ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IFt8fF1cbiAgICB8IExlYWYgdiAtPiBbfCB2IHxdXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBzKSAtPlxuICAgICAgbGV0IHJlcyA9IEFycmF5LmNyZWF0ZSB+bGVuOnMgdiBpblxuICAgICAgbGV0IHBvc19yZWYgPSByZWYgMCBpblxuICAgICAgbGV0IHJlYyBsb29wID0gZnVuY3Rpb25cbiAgICAgICAgKCogSW52YXJpYW50OiBvbiBlbnRyeSBhbmQgb24gZXhpdCB0byBbbG9vcF0sICFwb3NfcmVmIGlzIHRoZSBuZXh0XG4gICAgICAgICAgIGF2YWlsYWJsZSBjZWxsIGluIHRoZSBhcnJheS4gKilcbiAgICAgICAgfCBFbXB0eSAtPiAoKVxuICAgICAgICB8IExlYWYgdiAtPlxuICAgICAgICAgIHJlcy4oIXBvc19yZWYpIDwtIHY7XG4gICAgICAgICAgaW5jciBwb3NfcmVmXG4gICAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgICBsb29wIGw7XG4gICAgICAgICAgcmVzLighcG9zX3JlZikgPC0gdjtcbiAgICAgICAgICBpbmNyIHBvc19yZWY7XG4gICAgICAgICAgbG9vcCByXG4gICAgICBpblxuICAgICAgbG9vcCBsO1xuICAgICAgKCogcmVzLighcG9zX3JlZikgaXMgYWxyZWFkeSBpbml0aWFsaXplZCAoYnkgQXJyYXkuY3JlYXRlIH5sZW46YWJvdmUpLiAqKVxuICAgICAgaW5jciBwb3NfcmVmO1xuICAgICAgbG9vcCByO1xuICAgICAgcmVzXG4gIDs7XG5cbiAgbGV0IG1hcCB0IH5mIH5jb21wYXJlX2VsdCA9IGZvbGQgdCB+aW5pdDplbXB0eSB+ZjooZnVuIHQgeCAtPiBhZGQgdCAoZiB4KSB+Y29tcGFyZV9lbHQpXG5cbiAgbGV0IGdyb3VwX2J5IHNldCB+ZXF1aXYgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGxvb3Agc2V0IGVxdWl2X2NsYXNzZXMgPVxuICAgICAgaWYgaXNfZW1wdHkgc2V0XG4gICAgICB0aGVuIGVxdWl2X2NsYXNzZXNcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgeCA9IGNob29zZV9leG4gc2V0IGluXG4gICAgICAgIGxldCBlcXVpdl94LCBub3RfZXF1aXZfeCA9XG4gICAgICAgICAgcGFydGl0aW9uX3RmIHNldCB+ZjooZnVuIGVsdCAtPiBwaHlzX2VxdWFsIHggZWx0IHx8IGVxdWl2IHggZWx0KSB+Y29tcGFyZV9lbHRcbiAgICAgICAgaW5cbiAgICAgICAgbG9vcCBub3RfZXF1aXZfeCAoZXF1aXZfeCA6OiBlcXVpdl9jbGFzc2VzKSlcbiAgICBpblxuICAgIGxvb3Agc2V0IFtdXG4gIDs7XG5cbiAgbGV0IHJlYyBmaW5kIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IGlmIGYgdiB0aGVuIFNvbWUgdiBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICBpZiBmIHZcbiAgICAgIHRoZW4gU29tZSB2XG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggZmluZCBsIH5mIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGZpbmQgciB+ZlxuICAgICAgICB8IFNvbWUgXyBhcyByIC0+IHIpXG4gIDs7XG5cbiAgbGV0IHJlYyBmaW5kX21hcCB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBmIHZcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAobWF0Y2ggZiB2IHdpdGhcbiAgICAgICB8IFNvbWUgXyBhcyByIC0+IHJcbiAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgIChtYXRjaCBmaW5kX21hcCBsIH5mIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gZmluZF9tYXAgciB+ZlxuICAgICAgICAgIHwgU29tZSBfIGFzIHIgLT4gcikpXG4gIDs7XG5cbiAgbGV0IGZpbmRfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmQgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IGZhaWx3aXRoIFwiU2V0LmZpbmRfZXhuIGZhaWxlZCB0byBmaW5kIGEgbWF0Y2hpbmcgZWxlbWVudFwiXG4gICAgfCBTb21lIGUgLT4gZVxuICA7O1xuXG4gIGxldCByZWMgbnRoIHQgaSA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gaWYgaSA9IDAgdGhlbiBTb21lIHYgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBzKSAtPlxuICAgICAgaWYgaSA+PSBzXG4gICAgICB0aGVuIE5vbmVcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgbF9zaXplID0gbGVuZ3RoIGwgaW5cbiAgICAgICAgbGV0IGMgPSBQb2x5LmNvbXBhcmUgaSBsX3NpemUgaW5cbiAgICAgICAgaWYgYyA8IDAgdGhlbiBudGggbCBpIGVsc2UgaWYgYyA9IDAgdGhlbiBTb21lIHYgZWxzZSBudGggciAoaSAtIGxfc2l6ZSAtIDEpKVxuICA7O1xuXG4gIGxldCBzdGFibGVfZGVkdXBfbGlzdCB4cyB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgbG9vcCB4cyBsZWZ0b3ZlcnMgYWxyZWFkeV9zZWVuID1cbiAgICAgIG1hdGNoIHhzIHdpdGhcbiAgICAgIHwgW10gLT4gTGlzdC5yZXYgbGVmdG92ZXJzXG4gICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIGlmIG1lbSBhbHJlYWR5X3NlZW4gaGQgfmNvbXBhcmVfZWx0XG4gICAgICAgIHRoZW4gbG9vcCB0bCBsZWZ0b3ZlcnMgYWxyZWFkeV9zZWVuXG4gICAgICAgIGVsc2UgbG9vcCB0bCAoaGQgOjogbGVmdG92ZXJzKSAoYWRkIGFscmVhZHlfc2VlbiBoZCB+Y29tcGFyZV9lbHQpXG4gICAgaW5cbiAgICBsb29wIHhzIFtdIGVtcHR5XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3QgYV9vZl9zZXhwIHNleHAgfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCBzZXhwIHdpdGhcbiAgICB8IFNleHAuTGlzdCBsc3QgLT5cbiAgICAgIGxldCBlbHRfbHN0ID0gTGlzdC5tYXAgbHN0IH5mOmFfb2Zfc2V4cCBpblxuICAgICAgbGV0IHNldCA9IG9mX2xpc3QgZWx0X2xzdCB+Y29tcGFyZV9lbHQgaW5cbiAgICAgIGlmIGxlbmd0aCBzZXQgPSBMaXN0Lmxlbmd0aCBsc3RcbiAgICAgIHRoZW4gc2V0XG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHNldCA9IHJlZiBlbXB0eSBpblxuICAgICAgICBMaXN0Lml0ZXIyX2V4biBsc3QgZWx0X2xzdCB+ZjooZnVuIGVsX3NleHAgZWwgLT5cbiAgICAgICAgICBpZiBtZW0gIXNldCBlbCB+Y29tcGFyZV9lbHRcbiAgICAgICAgICB0aGVuIG9mX3NleHBfZXJyb3IgXCJTZXQudF9vZl9zZXhwOiBkdXBsaWNhdGUgZWxlbWVudCBpbiBzZXRcIiBlbF9zZXhwXG4gICAgICAgICAgZWxzZSBzZXQgOj0gYWRkICFzZXQgZWwgfmNvbXBhcmVfZWx0KTtcbiAgICAgICAgYXNzZXJ0IGZhbHNlKVxuICAgIHwgc2V4cCAtPiBvZl9zZXhwX2Vycm9yIFwiU2V0LnRfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9XG4gICAgU2V4cC5MaXN0IChmb2xkX3JpZ2h0IHQgfmluaXQ6W10gfmY6KGZ1biBlbCBhY2MgLT4gc2V4cF9vZl9hIGVsIDo6IGFjYykpXG4gIDs7XG5cbiAgbW9kdWxlIE5hbWVkID0gc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnY21wKSB0ID1cbiAgICAgIHsgdHJlZSA6ICdhIHRcbiAgICAgIDsgbmFtZSA6IHN0cmluZ1xuICAgICAgfVxuXG4gICAgbGV0IGlzX3N1YnNldCAoc3Vic2V0IDogXyB0KSB+b2ZfOihzdXBlcnNldCA6IF8gdCkgfnNleHBfb2ZfZWx0IH5jb21wYXJlX2VsdCA9XG4gICAgICBsZXQgaW52YWxpZF9lbGVtZW50cyA9IGRpZmYgc3Vic2V0LnRyZWUgc3VwZXJzZXQudHJlZSB+Y29tcGFyZV9lbHQgaW5cbiAgICAgIGlmIGlzX2VtcHR5IGludmFsaWRfZWxlbWVudHNcbiAgICAgIHRoZW4gT2sgKClcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgaW52YWxpZF9lbGVtZW50c19zZXhwID0gc2V4cF9vZl90IHNleHBfb2ZfZWx0IGludmFsaWRfZWxlbWVudHMgaW5cbiAgICAgICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgICAoc3Vic2V0Lm5hbWUgXiBcIiBpcyBub3QgYSBzdWJzZXQgb2YgXCIgXiBzdXBlcnNldC5uYW1lKVxuICAgICAgICAgICAgIFsgXCJpbnZhbGlkX2VsZW1lbnRzXCIsIGludmFsaWRfZWxlbWVudHNfc2V4cCBdKSlcbiAgICA7O1xuXG4gICAgbGV0IGVxdWFsIHMxIHMyIH5zZXhwX29mX2VsdCB+Y29tcGFyZV9lbHQgPVxuICAgICAgT3JfZXJyb3IuY29tYmluZV9lcnJvcnNfdW5pdFxuICAgICAgICBbIGlzX3N1YnNldCBzMSB+b2ZfOnMyIH5zZXhwX29mX2VsdCB+Y29tcGFyZV9lbHRcbiAgICAgICAgOyBpc19zdWJzZXQgczIgfm9mXzpzMSB+c2V4cF9vZl9lbHQgfmNvbXBhcmVfZWx0XG4gICAgICAgIF1cbiAgICA7O1xuICBlbmRcbmVuZFxuXG50eXBlICgnYSwgJ2NvbXBhcmF0b3IpIHQgPVxuICB7ICgqIFtjb21wYXJhdG9yXSBpcyB0aGUgZmlyc3QgZmllbGQgc28gdGhhdCBwb2x5bW9ycGhpYyBlcXVhbGl0eSBmYWlscyBvbiBhIG1hcCBkdWVcbiAgICAgICB0byB0aGUgZnVuY3Rpb25hbCB2YWx1ZSBpbiB0aGUgY29tcGFyYXRvci5cbiAgICAgICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgcG9seW1vcnBoaWMgW2NvbXBhcmVdOiB0aGF0IHN0aWxsIHByb2R1Y2VzXG4gICAgICAgbm9uc2Vuc2UuICopXG4gICAgY29tcGFyYXRvciA6ICgnYSwgJ2NvbXBhcmF0b3IpIENvbXBhcmF0b3IudFxuICA7IHRyZWUgOiAnYSBUcmVlMC50XG4gIH1cblxudHlwZSAoJ2EsICdjb21wYXJhdG9yKSB0cmVlID0gJ2EgVHJlZTAudFxuXG5sZXQgbGlrZSB7IHRyZWUgPSBfOyBjb21wYXJhdG9yIH0gdHJlZSA9IHsgdHJlZTsgY29tcGFyYXRvciB9XG5sZXQgY29tcGFyZV9lbHQgdCA9IHQuY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcblxubW9kdWxlIEFjY2Vzc29ycyA9IHN0cnVjdFxuICBsZXQgY29tcGFyYXRvciB0ID0gdC5jb21wYXJhdG9yXG4gIGxldCBpbnZhcmlhbnRzIHQgPSBUcmVlMC5pbnZhcmlhbnRzIHQudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpXG4gIGxldCBsZW5ndGggdCA9IFRyZWUwLmxlbmd0aCB0LnRyZWVcbiAgbGV0IGlzX2VtcHR5IHQgPSBUcmVlMC5pc19lbXB0eSB0LnRyZWVcbiAgbGV0IGVsZW1lbnRzIHQgPSBUcmVlMC5lbGVtZW50cyB0LnRyZWVcbiAgbGV0IG1pbl9lbHQgdCA9IFRyZWUwLm1pbl9lbHQgdC50cmVlXG4gIGxldCBtaW5fZWx0X2V4biB0ID0gVHJlZTAubWluX2VsdF9leG4gdC50cmVlXG4gIGxldCBtYXhfZWx0IHQgPSBUcmVlMC5tYXhfZWx0IHQudHJlZVxuICBsZXQgbWF4X2VsdF9leG4gdCA9IFRyZWUwLm1heF9lbHRfZXhuIHQudHJlZVxuICBsZXQgY2hvb3NlIHQgPSBUcmVlMC5jaG9vc2UgdC50cmVlXG4gIGxldCBjaG9vc2VfZXhuIHQgPSBUcmVlMC5jaG9vc2VfZXhuIHQudHJlZVxuICBsZXQgdG9fbGlzdCB0ID0gVHJlZTAudG9fbGlzdCB0LnRyZWVcbiAgbGV0IHRvX2FycmF5IHQgPSBUcmVlMC50b19hcnJheSB0LnRyZWVcbiAgbGV0IGZvbGQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGQgdC50cmVlIH5pbml0IH5mXG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3VudGlsIHQudHJlZSB+aW5pdCB+ZlxuICBsZXQgZm9sZF9yaWdodCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF9yaWdodCB0LnRyZWUgfmluaXQgfmZcbiAgbGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxuICBsZXQgaXRlciB0IH5mID0gVHJlZTAuaXRlciB0LnRyZWUgfmZcbiAgbGV0IGl0ZXIyIGEgYiB+ZiA9IFRyZWUwLml0ZXIyIGEudHJlZSBiLnRyZWUgfmYgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCBhKVxuICBsZXQgZXhpc3RzIHQgfmYgPSBUcmVlMC5leGlzdHMgdC50cmVlIH5mXG4gIGxldCBmb3JfYWxsIHQgfmYgPSBUcmVlMC5mb3JfYWxsIHQudHJlZSB+ZlxuICBsZXQgY291bnQgdCB+ZiA9IFRyZWUwLmNvdW50IHQudHJlZSB+ZlxuICBsZXQgc3VtIG0gdCB+ZiA9IFRyZWUwLnN1bSBtIHQudHJlZSB+ZlxuICBsZXQgZmluZCB0IH5mID0gVHJlZTAuZmluZCB0LnRyZWUgfmZcbiAgbGV0IGZpbmRfZXhuIHQgfmYgPSBUcmVlMC5maW5kX2V4biB0LnRyZWUgfmZcbiAgbGV0IGZpbmRfbWFwIHQgfmYgPSBUcmVlMC5maW5kX21hcCB0LnRyZWUgfmZcbiAgbGV0IG1lbSB0IGEgPSBUcmVlMC5tZW0gdC50cmVlIGEgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KVxuICBsZXQgZmlsdGVyIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlciB0LnRyZWUgfmYgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSlcbiAgbGV0IGFkZCB0IGEgPSBsaWtlIHQgKFRyZWUwLmFkZCB0LnRyZWUgYSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpKVxuICBsZXQgcmVtb3ZlIHQgYSA9IGxpa2UgdCAoVHJlZTAucmVtb3ZlIHQudHJlZSBhIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkpXG4gIGxldCB1bmlvbiB0MSB0MiA9IGxpa2UgdDEgKFRyZWUwLnVuaW9uIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKSlcbiAgbGV0IGludGVyIHQxIHQyID0gbGlrZSB0MSAoVHJlZTAuaW50ZXIgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpKVxuICBsZXQgZGlmZiB0MSB0MiA9IGxpa2UgdDEgKFRyZWUwLmRpZmYgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpKVxuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiB0MSB0MiA9XG4gICAgVHJlZTAuc3ltbWV0cmljX2RpZmYgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfZGlyZWN0IHQxIHQyID0gVHJlZTAuY29tcGFyZSAoY29tcGFyZV9lbHQgdDEpIHQxLnRyZWUgdDIudHJlZVxuICBsZXQgZXF1YWwgdDEgdDIgPSBUcmVlMC5lcXVhbCB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSlcbiAgbGV0IGlzX3N1YnNldCB0IH5vZl8gPSBUcmVlMC5pc19zdWJzZXQgdC50cmVlIH5vZl86b2ZfLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KVxuXG4gIGxldCBhcmVfZGlzam9pbnQgdDEgdDIgPVxuICAgIFRyZWUwLmFyZV9kaXNqb2ludCB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSlcbiAgOztcblxuICBtb2R1bGUgTmFtZWQgPSBzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdjbXApIHQgPVxuICAgICAgeyBzZXQgOiAoJ2EsICdjbXApIHRcbiAgICAgIDsgbmFtZSA6IHN0cmluZ1xuICAgICAgfVxuXG4gICAgbGV0IHRvX25hbWVkX3RyZWUgeyBzZXQ7IG5hbWUgfSA9IHsgVHJlZTAuTmFtZWQudHJlZSA9IHNldC50cmVlOyBuYW1lIH1cblxuICAgIGxldCBpc19zdWJzZXQgKHN1YnNldCA6IChfLCBfKSB0KSB+b2ZfOihzdXBlcnNldCA6IChfLCBfKSB0KSA9XG4gICAgICBUcmVlMC5OYW1lZC5pc19zdWJzZXRcbiAgICAgICAgKHRvX25hbWVkX3RyZWUgc3Vic2V0KVxuICAgICAgICB+b2ZfOih0b19uYW1lZF90cmVlIHN1cGVyc2V0KVxuICAgICAgICB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHN1YnNldC5zZXQpXG4gICAgICAgIH5zZXhwX29mX2VsdDpzdWJzZXQuc2V0LmNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgOztcblxuICAgIGxldCBlcXVhbCB0MSB0MiA9XG4gICAgICBPcl9lcnJvci5jb21iaW5lX2Vycm9yc191bml0IFsgaXNfc3Vic2V0IHQxIH5vZl86dDI7IGlzX3N1YnNldCB0MiB+b2ZfOnQxIF1cbiAgICA7O1xuICBlbmRcblxuICBsZXQgcGFydGl0aW9uX3RmIHQgfmYgPVxuICAgIGxldCB0cmVlX3QsIHRyZWVfZiA9IFRyZWUwLnBhcnRpdGlvbl90ZiB0LnRyZWUgfmYgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSBpblxuICAgIGxpa2UgdCB0cmVlX3QsIGxpa2UgdCB0cmVlX2ZcbiAgOztcblxuICBsZXQgc3BsaXQgdCBhID1cbiAgICBsZXQgdHJlZTEsIGIsIHRyZWUyID0gVHJlZTAuc3BsaXQgdC50cmVlIGEgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSBpblxuICAgIGxpa2UgdCB0cmVlMSwgYiwgbGlrZSB0IHRyZWUyXG4gIDs7XG5cbiAgbGV0IGdyb3VwX2J5IHQgfmVxdWl2ID1cbiAgICBMaXN0Lm1hcCAoVHJlZTAuZ3JvdXBfYnkgdC50cmVlIH5lcXVpdiB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpKSB+ZjoobGlrZSB0KVxuICA7O1xuXG4gIGxldCBudGggdCBpID0gVHJlZTAubnRoIHQudHJlZSBpXG4gIGxldCByZW1vdmVfaW5kZXggdCBpID0gbGlrZSB0IChUcmVlMC5yZW1vdmVfaW5kZXggdC50cmVlIGkgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSlcbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgXyB0ID0gVHJlZTAuc2V4cF9vZl90IHNleHBfb2ZfYSB0LnRyZWVcblxuICBsZXQgdG9fc2VxdWVuY2UgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQgPVxuICAgIFRyZWUwLnRvX3NlcXVlbmNlIHQuY29tcGFyYXRvciA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdC50cmVlXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdiA9IFRyZWUwLmJpbmFyeV9zZWFyY2ggdC50cmVlIH5jb21wYXJlIGhvdyB2XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBUcmVlMC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0LnRyZWUgfnNlZ21lbnRfb2YgaG93XG4gIDs7XG5cbiAgbGV0IG1lcmdlX3RvX3NlcXVlbmNlID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0IHQnID1cbiAgICBUcmVlMC5tZXJnZV90b19zZXF1ZW5jZVxuICAgICAgdC5jb21wYXJhdG9yXG4gICAgICA/b3JkZXJcbiAgICAgID9ncmVhdGVyX29yX2VxdWFsX3RvXG4gICAgICA/bGVzc19vcl9lcXVhbF90b1xuICAgICAgdC50cmVlXG4gICAgICB0Jy50cmVlXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9kaXJlY3QgaGFzaF9mb2xkX2tleSBzdGF0ZSB0ID1cbiAgICBUcmVlMC5oYXNoX2ZvbGRfdF9pZ25vcmluZ19zdHJ1Y3R1cmUgaGFzaF9mb2xkX2tleSBzdGF0ZSB0LnRyZWVcbiAgOztcbmVuZFxuXG5pbmNsdWRlIEFjY2Vzc29yc1xuXG5sZXQgY29tcGFyZSBfIF8gdDEgdDIgPSBjb21wYXJlX2RpcmVjdCB0MSB0MlxuXG5tb2R1bGUgVHJlZSA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2NvbXBhcmF0b3IpIHQgPSAoJ2EsICdjb21wYXJhdG9yKSB0cmVlXG5cbiAgbGV0IGNlIGNvbXBhcmF0b3IgPSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yIGFfb2Zfc2V4cCBzZXhwID1cbiAgICBUcmVlMC50X29mX3NleHBfZGlyZWN0IH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcikgYV9vZl9zZXhwIHNleHBcbiAgOztcblxuICBsZXQgZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiA9IFRyZWUwLmVtcHR5XG4gIGxldCBlbXB0eSB+Y29tcGFyYXRvcjpfID0gZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvblxuICBsZXQgc2luZ2xldG9uIH5jb21wYXJhdG9yOl8gZSA9IFRyZWUwLnNpbmdsZXRvbiBlXG4gIGxldCBsZW5ndGggdCA9IFRyZWUwLmxlbmd0aCB0XG4gIGxldCBpbnZhcmlhbnRzIH5jb21wYXJhdG9yIHQgPSBUcmVlMC5pbnZhcmlhbnRzIHQgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgaXNfZW1wdHkgdCA9IFRyZWUwLmlzX2VtcHR5IHRcbiAgbGV0IGVsZW1lbnRzIHQgPSBUcmVlMC5lbGVtZW50cyB0XG4gIGxldCBtaW5fZWx0IHQgPSBUcmVlMC5taW5fZWx0IHRcbiAgbGV0IG1pbl9lbHRfZXhuIHQgPSBUcmVlMC5taW5fZWx0X2V4biB0XG4gIGxldCBtYXhfZWx0IHQgPSBUcmVlMC5tYXhfZWx0IHRcbiAgbGV0IG1heF9lbHRfZXhuIHQgPSBUcmVlMC5tYXhfZWx0X2V4biB0XG4gIGxldCBjaG9vc2UgdCA9IFRyZWUwLmNob29zZSB0XG4gIGxldCBjaG9vc2VfZXhuIHQgPSBUcmVlMC5jaG9vc2VfZXhuIHRcbiAgbGV0IHRvX2xpc3QgdCA9IFRyZWUwLnRvX2xpc3QgdFxuICBsZXQgdG9fYXJyYXkgdCA9IFRyZWUwLnRvX2FycmF5IHRcbiAgbGV0IGl0ZXIgdCB+ZiA9IFRyZWUwLml0ZXIgdCB+ZlxuICBsZXQgZXhpc3RzIHQgfmYgPSBUcmVlMC5leGlzdHMgdCB+ZlxuICBsZXQgZm9yX2FsbCB0IH5mID0gVHJlZTAuZm9yX2FsbCB0IH5mXG4gIGxldCBjb3VudCB0IH5mID0gVHJlZTAuY291bnQgdCB+ZlxuICBsZXQgc3VtIG0gdCB+ZiA9IFRyZWUwLnN1bSBtIHQgfmZcbiAgbGV0IGZpbmQgdCB+ZiA9IFRyZWUwLmZpbmQgdCB+ZlxuICBsZXQgZmluZF9leG4gdCB+ZiA9IFRyZWUwLmZpbmRfZXhuIHQgfmZcbiAgbGV0IGZpbmRfbWFwIHQgfmYgPSBUcmVlMC5maW5kX21hcCB0IH5mXG4gIGxldCBmb2xkIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkIHQgfmluaXQgfmZcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfdW50aWwgdCB+aW5pdCB+ZlxuICBsZXQgZm9sZF9yaWdodCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF9yaWdodCB0IH5pbml0IH5mXG4gIGxldCBtYXAgfmNvbXBhcmF0b3IgdCB+ZiA9IFRyZWUwLm1hcCB0IH5mIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGZpbHRlciB+Y29tcGFyYXRvciB0IH5mID0gVHJlZTAuZmlsdGVyIHQgfmYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgZmlsdGVyX21hcCB+Y29tcGFyYXRvciB0IH5mID0gVHJlZTAuZmlsdGVyX21hcCB0IH5mIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHBhcnRpdGlvbl90ZiB+Y29tcGFyYXRvciB0IH5mID0gVHJlZTAucGFydGl0aW9uX3RmIHQgfmYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgaXRlcjIgfmNvbXBhcmF0b3IgYSBiIH5mID0gVHJlZTAuaXRlcjIgYSBiIH5mIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IG1lbSB+Y29tcGFyYXRvciB0IGEgPSBUcmVlMC5tZW0gdCBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGFkZCB+Y29tcGFyYXRvciB0IGEgPSBUcmVlMC5hZGQgdCBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHJlbW92ZSB+Y29tcGFyYXRvciB0IGEgPSBUcmVlMC5yZW1vdmUgdCBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHVuaW9uIH5jb21wYXJhdG9yIHQxIHQyID0gVHJlZTAudW5pb24gdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgaW50ZXIgfmNvbXBhcmF0b3IgdDEgdDIgPSBUcmVlMC5pbnRlciB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBkaWZmIH5jb21wYXJhdG9yIHQxIHQyID0gVHJlZTAuZGlmZiB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmIH5jb21wYXJhdG9yIHQxIHQyID1cbiAgICBUcmVlMC5zeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfZGlyZWN0IH5jb21wYXJhdG9yIHQxIHQyID0gVHJlZTAuY29tcGFyZSAoY2UgY29tcGFyYXRvcikgdDEgdDJcbiAgbGV0IGVxdWFsIH5jb21wYXJhdG9yIHQxIHQyID0gVHJlZTAuZXF1YWwgdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgaXNfc3Vic2V0IH5jb21wYXJhdG9yIHQgfm9mXyA9IFRyZWUwLmlzX3N1YnNldCB0IH5vZl8gfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuXG4gIGxldCBhcmVfZGlzam9pbnQgfmNvbXBhcmF0b3IgdDEgdDIgPVxuICAgIFRyZWUwLmFyZV9kaXNqb2ludCB0MSB0MiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IG9mX2xpc3QgfmNvbXBhcmF0b3IgbCA9IFRyZWUwLm9mX2xpc3QgbCB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBvZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBzID0gVHJlZTAub2Zfc2VxdWVuY2UgcyB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBvZl9hcnJheSB+Y29tcGFyYXRvciBhID0gVHJlZTAub2ZfYXJyYXkgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYSA9XG4gICAgVHJlZTAub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3I6XyB+bGVuIH5mID1cbiAgICBUcmVlMC5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhID0gVHJlZTAub2Zfc29ydGVkX2FycmF5IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgdW5pb25fbGlzdCB+Y29tcGFyYXRvciBsID0gVHJlZTAudW5pb25fbGlzdCBsIH50b190cmVlOkZuLmlkIH5jb21wYXJhdG9yXG5cbiAgbGV0IHN0YWJsZV9kZWR1cF9saXN0IH5jb21wYXJhdG9yIHhzID1cbiAgICBUcmVlMC5zdGFibGVfZGVkdXBfbGlzdCB4cyB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IGdyb3VwX2J5IH5jb21wYXJhdG9yIHQgfmVxdWl2ID0gVHJlZTAuZ3JvdXBfYnkgdCB+ZXF1aXYgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgc3BsaXQgfmNvbXBhcmF0b3IgdCBhID0gVHJlZTAuc3BsaXQgdCBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IG50aCB0IGkgPSBUcmVlMC5udGggdCBpXG4gIGxldCByZW1vdmVfaW5kZXggfmNvbXBhcmF0b3IgdCBpID0gVHJlZTAucmVtb3ZlX2luZGV4IHQgaSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIF8gdCA9IFRyZWUwLnNleHBfb2ZfdCBzZXhwX29mX2EgdFxuICBsZXQgdG9fdHJlZSB0ID0gdFxuICBsZXQgb2ZfdHJlZSB+Y29tcGFyYXRvcjpfIHQgPSB0XG5cbiAgbGV0IHRvX3NlcXVlbmNlIH5jb21wYXJhdG9yID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0ID1cbiAgICBUcmVlMC50b19zZXF1ZW5jZSBjb21wYXJhdG9yID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0XG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggfmNvbXBhcmF0b3I6XyB0IH5jb21wYXJlIGhvdyB2ID0gVHJlZTAuYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIH5jb21wYXJhdG9yOl8gdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIFRyZWUwLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93XG4gIDs7XG5cbiAgbGV0IG1lcmdlX3RvX3NlcXVlbmNlIH5jb21wYXJhdG9yID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0IHQnID1cbiAgICBUcmVlMC5tZXJnZV90b19zZXF1ZW5jZSBjb21wYXJhdG9yID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0IHQnXG4gIDs7XG5cbiAgbGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxuXG4gIG1vZHVsZSBOYW1lZCA9IHN0cnVjdFxuICAgIGluY2x1ZGUgVHJlZTAuTmFtZWRcblxuICAgIGxldCBpc19zdWJzZXQgfmNvbXBhcmF0b3IgdDEgfm9mXzp0MiA9XG4gICAgICBUcmVlMC5OYW1lZC5pc19zdWJzZXRcbiAgICAgICAgdDFcbiAgICAgICAgfm9mXzp0MlxuICAgICAgICB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gICAgICAgIH5zZXhwX29mX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgOztcblxuICAgIGxldCBlcXVhbCB+Y29tcGFyYXRvciB0MSB0MiA9XG4gICAgICBUcmVlMC5OYW1lZC5lcXVhbFxuICAgICAgICB0MVxuICAgICAgICB0MlxuICAgICAgICB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gICAgICAgIH5zZXhwX29mX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgOztcbiAgZW5kXG5lbmRcblxubW9kdWxlIFVzaW5nX2NvbXBhcmF0b3IgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgKCdlbHQsICdjbXApIHQgPSAoJ2VsdCwgJ2NtcCkgdFxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IHRvX3RyZWUgdCA9IHQudHJlZVxuICBsZXQgb2ZfdHJlZSB+Y29tcGFyYXRvciB0cmVlID0geyBjb21wYXJhdG9yOyB0cmVlIH1cblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvciBhX29mX3NleHAgc2V4cCA9XG4gICAgb2ZfdHJlZVxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC50X29mX3NleHBfZGlyZWN0IH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLmNvbXBhcmUgYV9vZl9zZXhwIHNleHApXG4gIDs7XG5cbiAgbGV0IGVtcHR5IH5jb21wYXJhdG9yID0geyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAuZW1wdHkgfVxuXG4gIG1vZHVsZSBFbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChFbHQgOiBDb21wYXJhdG9yLlMxKSA9IHN0cnVjdFxuICAgIGxldCBlbXB0eSA9IHsgY29tcGFyYXRvciA9IEVsdC5jb21wYXJhdG9yOyB0cmVlID0gVHJlZTAuZW1wdHkgfVxuICBlbmRcblxuICBsZXQgc2luZ2xldG9uIH5jb21wYXJhdG9yIGUgPSB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5zaW5nbGV0b24gZSB9XG5cbiAgbGV0IHVuaW9uX2xpc3QgfmNvbXBhcmF0b3IgbCA9XG4gICAgb2ZfdHJlZSB+Y29tcGFyYXRvciAoVHJlZTAudW5pb25fbGlzdCB+Y29tcGFyYXRvciB+dG9fdHJlZSBsKVxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBsZXQgdHJlZSA9XG4gICAgICBUcmVlMC5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgeyBjb21wYXJhdG9yOyB0cmVlIH1cbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3IgfmxlbiB+ZiA9XG4gICAgb2ZfdHJlZSB+Y29tcGFyYXRvciAoVHJlZTAub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZilcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBPcl9lcnJvci5Nb25hZF9pbmZpeC4oXG4gICAgICBUcmVlMC5vZl9zb3J0ZWRfYXJyYXkgYXJyYXkgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgICA+PnwgZnVuIHRyZWUgLT4geyBjb21wYXJhdG9yOyB0cmVlIH0pXG4gIDs7XG5cbiAgbGV0IG9mX2xpc3QgfmNvbXBhcmF0b3IgbCA9XG4gICAgeyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAub2ZfbGlzdCBsIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB9XG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIHMgPVxuICAgIHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLm9mX3NlcXVlbmNlIHMgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH1cbiAgOztcblxuICBsZXQgb2ZfYXJyYXkgfmNvbXBhcmF0b3IgYSA9XG4gICAgeyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAub2ZfYXJyYXkgYSB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfVxuICA7O1xuXG4gIGxldCBzdGFibGVfZGVkdXBfbGlzdCB+Y29tcGFyYXRvciB4cyA9XG4gICAgVHJlZTAuc3RhYmxlX2RlZHVwX2xpc3QgeHMgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IG1hcCB+Y29tcGFyYXRvciB0IH5mID1cbiAgICB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5tYXAgdC50cmVlIH5mIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB9XG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXAgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgeyBjb21wYXJhdG9yXG4gICAgOyB0cmVlID0gVHJlZTAuZmlsdGVyX21hcCB0LnRyZWUgfmYgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgfVxuICA7O1xuXG4gIG1vZHVsZSBUcmVlID0gVHJlZVxuZW5kXG5cbnR5cGUgKCdlbHQsICdjbXApIGNvbXBhcmF0b3IgPVxuICAobW9kdWxlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA9ICdlbHQgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gJ2NtcClcblxubGV0IGNvbXBhcmF0b3JfcyAodHlwZSBrIGNtcCkgdCA6IChrLCBjbXApIGNvbXBhcmF0b3IgPVxuICAobW9kdWxlIHN0cnVjdFxuICAgIHR5cGUgdCA9IGtcbiAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IGNtcFxuXG4gICAgbGV0IGNvbXBhcmF0b3IgPSB0LmNvbXBhcmF0b3JcbiAgZW5kKVxuOztcblxubGV0IHRvX2NvbXBhcmF0b3IgKHR5cGUgZWx0IGNtcCkgKChtb2R1bGUgTSkgOiAoZWx0LCBjbXApIGNvbXBhcmF0b3IpID0gTS5jb21wYXJhdG9yXG5sZXQgZW1wdHkgbSA9IFVzaW5nX2NvbXBhcmF0b3IuZW1wdHkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSlcbmxldCBzaW5nbGV0b24gbSBhID0gVXNpbmdfY29tcGFyYXRvci5zaW5nbGV0b24gfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IHVuaW9uX2xpc3QgbSBhID0gVXNpbmdfY29tcGFyYXRvci51bmlvbl9saXN0IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcblxubGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgbSBhID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbjs7XG5cbmxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCBtIH5sZW4gfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIH5sZW4gfmZcbjs7XG5cbmxldCBvZl9zb3J0ZWRfYXJyYXkgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX2xpc3QgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9saXN0IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9zZXF1ZW5jZSBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9hcnJheSBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FycmF5IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcblxubGV0IHN0YWJsZV9kZWR1cF9saXN0IG0gYSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iuc3RhYmxlX2RlZHVwX2xpc3QgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuOztcblxubGV0IG1hcCBtIGEgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhIH5mXG5sZXQgZmlsdGVyX21hcCBtIGEgfmYgPSBVc2luZ19jb21wYXJhdG9yLmZpbHRlcl9tYXAgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYSB+ZlxuXG5tb2R1bGUgTSAoRWx0IDogc2lnXG4gICAgdHlwZSB0XG4gICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSBub25yZWMgdCA9IChFbHQudCwgRWx0LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gIFtAQEBlbmRdXG5cbiAgaW5jbHVkZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgOj0gdFxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIENvbXBhcmVfbSA9IHNpZyBlbmRcbm1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG5tb2R1bGUgdHlwZSBIYXNoX2ZvbGRfbSA9IEhhc2hlci5TXG5cbmxldCBzZXhwX29mX21fX3QgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9IGVsdCkgdCA9XG4gIHNleHBfb2ZfdCBFbHQuc2V4cF9vZl90IChmdW4gXyAtPiBTZXhwLkF0b20gXCJfXCIpIHRcbjs7XG5cbmxldCBtX190X29mX3NleHBcbiAgICAgICh0eXBlIGVsdCBjbXApXG4gICAgICAobW9kdWxlIEVsdCA6IE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9IGVsdCBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBjbXApXG4gICAgICBzZXhwXG4gID1cbiAgVXNpbmdfY29tcGFyYXRvci50X29mX3NleHBfZGlyZWN0IH5jb21wYXJhdG9yOkVsdC5jb21wYXJhdG9yIEVsdC50X29mX3NleHAgc2V4cFxuOztcblxubGV0IG1fX3Rfc2V4cF9ncmFtbWFyICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9IGVsdClcbiAgOiAoZWx0LCBfKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAobGlzdF9zZXhwX2dyYW1tYXIgRWx0LnRfc2V4cF9ncmFtbWFyKVxuOztcblxubGV0IGNvbXBhcmVfbV9fdCAobW9kdWxlIF8gOiBDb21wYXJlX20pIHQxIHQyID0gY29tcGFyZV9kaXJlY3QgdDEgdDJcbmxldCBlcXVhbF9tX190IChtb2R1bGUgXyA6IEVxdWFsX20pIHQxIHQyID0gZXF1YWwgdDEgdDJcblxubGV0IGhhc2hfZm9sZF9tX190ICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBIYXNoX2ZvbGRfbSB3aXRoIHR5cGUgdCA9IGVsdCkgc3RhdGUgPVxuICBoYXNoX2ZvbGRfZGlyZWN0IEVsdC5oYXNoX2ZvbGRfdCBzdGF0ZVxuOztcblxubGV0IGhhc2hfbV9fdCBmb2xkZXIgdCA9XG4gIGxldCBzdGF0ZSA9IGhhc2hfZm9sZF9tX190IGZvbGRlciAoSGFzaC5jcmVhdGUgKCkpIHQgaW5cbiAgSGFzaC5nZXRfaGFzaF92YWx1ZSBzdGF0ZVxuOztcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzXG4gIHR5cGUgbm9ucmVjICgnZWx0LCAnY21wKSBzZXQgPSAoJ2VsdCwgY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gIHR5cGUgbm9ucmVjICdlbHQgdCA9ICgnZWx0LCBjb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgdHlwZSBub25yZWMgJ2VsdCB0cmVlID0gKCdlbHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgdHJlZVxuICB0eXBlIG5vbnJlYyAnZWx0IG5hbWVkID0gKCdlbHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgTmFtZWQudFxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvclxuXG4gIGluY2x1ZGUgVXNpbmdfY29tcGFyYXRvci5FbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChDb21wYXJhdG9yLlBvbHkpXG5cbiAgbGV0IHNpbmdsZXRvbiBhID0gVXNpbmdfY29tcGFyYXRvci5zaW5nbGV0b24gfmNvbXBhcmF0b3IgYVxuICBsZXQgdW5pb25fbGlzdCBhID0gVXNpbmdfY29tcGFyYXRvci51bmlvbl9saXN0IH5jb21wYXJhdG9yIGFcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhID1cbiAgICBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYVxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mID1cbiAgICBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yIH5sZW4gfmZcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9saXN0IGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2xpc3QgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2Zfc2VxdWVuY2UgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYXJyYXkgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYXJyYXkgfmNvbXBhcmF0b3IgYVxuICBsZXQgc3RhYmxlX2RlZHVwX2xpc3QgYSA9IFVzaW5nX2NvbXBhcmF0b3Iuc3RhYmxlX2RlZHVwX2xpc3QgfmNvbXBhcmF0b3IgYVxuICBsZXQgbWFwIGEgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcCB+Y29tcGFyYXRvciBhIH5mXG4gIGxldCBmaWx0ZXJfbWFwIGEgfmYgPSBVc2luZ19jb21wYXJhdG9yLmZpbHRlcl9tYXAgfmNvbXBhcmF0b3IgYSB+ZlxuICBsZXQgb2ZfdHJlZSB0cmVlID0geyBjb21wYXJhdG9yOyB0cmVlIH1cbiAgbGV0IHRvX3RyZWUgdCA9IHQudHJlZVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxuaW5jbHVkZSAoXG5zdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgcmVmIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPSBjb21wYXJlX3JlZlxuICBsZXQgZXF1YWwgOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gJ2EgdCAtPiBib29sID0gZXF1YWxfcmVmXG4gIGxldCB0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHQgPSByZWZfb2Zfc2V4cFxuICBsZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID0gc2V4cF9vZl9yZWZcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IHJlZl9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmQgOlxuc2lnXG4gIHR5cGUgJ2EgdCA9ICdhIHJlZiBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuRXF1YWwuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBpbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcblxuICB2YWwgdF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cbmVuZClcblxuKCogSW4gdGhlIGRlZmluaXRpb24gb2YgW3RdLCB3ZSBkbyBub3QgaGF2ZSBbW0BAZGVyaXZpbmcgY29tcGFyZSwgc2V4cF1dIGJlY2F1c2VcbiAgIGluIGdlbmVyYWwsIHN5bnRheCBleHRlbnNpb25zIHRlbmQgdG8gdXNlIHRoZSBpbXBsZW1lbnRhdGlvbiB3aGVuIGF2YWlsYWJsZSByYXRoZXIgdGhhblxuICAgdXNpbmcgdGhlIGFsaWFzLiAgSGVyZSB0aGF0IHdvdWxkIGxlYWQgdG8gdXNlIHRoZSByZWNvcmQgcmVwcmVzZW50YXRpb24gWyB7IG11dGFibGVcbiAgIGNvbnRlbnRzIDogJ2EgfSBdIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBkaWZmZXJlbnQgKGFuZCB1bndhbnRlZCkgYmVoYXZpb3IuICAqKVxudHlwZSAnYSB0ID0gJ2EgcmVmID0geyBtdXRhYmxlIGNvbnRlbnRzIDogJ2EgfVxuXG5leHRlcm5hbCBjcmVhdGUgOiAnYSAtPiAnYSB0ID0gXCIlbWFrZW11dGFibGVcIlxuZXh0ZXJuYWwgKCAhICkgOiAnYSB0IC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsICggOj0gKSA6ICdhIHQgLT4gJ2EgLT4gdW5pdCA9IFwiJXNldGZpZWxkMFwiXG5cbmxldCBzd2FwIHQxIHQyID1cbiAgbGV0IHRtcCA9ICF0MSBpblxuICB0MSA6PSAhdDI7XG4gIHQyIDo9IHRtcFxuOztcblxubGV0IHJlcGxhY2UgdCBmID0gdCA6PSBmICF0XG5cbmxldCBzZXRfdGVtcG9yYXJpbHkgdCBhIH5mID1cbiAgbGV0IHJlc3RvcmVfdG8gPSAhdCBpblxuICB0IDo9IGE7XG4gIEV4bi5wcm90ZWN0IH5mIH5maW5hbGx5OihmdW4gKCkgLT4gdCA6PSByZXN0b3JlX3RvKVxuOztcblxubW9kdWxlIEFuZF92YWx1ZSA9IHN0cnVjdFxuICB0eXBlIHQgPSBUIDogJ2EgcmVmICogJ2EgLT4gdCBbQEBkZXJpdmluZyBzZXhwX29mXVxuXG4gIGxldCBzZXQgKFQgKHIsIGEpKSA9IHIgOj0gYVxuICBsZXQgc2V0cyB0cyA9IExpc3QuaXRlciB0cyB+ZjpzZXRcbiAgbGV0IHNuYXBzaG90IChUIChyLCBfKSkgPSBUIChyLCAhcilcbiAgbGV0IHNuYXBzaG90cyB0cyA9IExpc3QubWFwIHRzIH5mOnNuYXBzaG90XG5lbmRcblxubGV0IHNldHNfdGVtcG9yYXJpbHkgYW5kX3ZhbHVlcyB+ZiA9XG4gIGxldCByZXN0b3JlX3RvID0gQW5kX3ZhbHVlLnNuYXBzaG90cyBhbmRfdmFsdWVzIGluXG4gIEFuZF92YWx1ZS5zZXRzIGFuZF92YWx1ZXM7XG4gIEV4bi5wcm90ZWN0IH5mIH5maW5hbGx5OihmdW4gKCkgLT4gQW5kX3ZhbHVlLnNldHMgcmVzdG9yZV90bylcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuXG4oKiBbdF0gc3RvcmVzIHRoZSBbdC5sZW5ndGhdIHF1ZXVlIGVsZW1lbnRzIGF0IGNvbnNlY3V0aXZlIGluY3JlYXNpbmcgaW5kaWNlcyBvZiBbdC5lbHRzXSxcbiAgIG1vZCB0aGUgY2FwYWNpdHkgb2YgW3RdLCB3aGljaCBpcyBbT3B0aW9uX2FycmF5Lmxlbmd0aCB0LmVsdHNdLiAgVGhlIGNhcGFjaXR5IGlzXG4gICByZXF1aXJlZCB0byBiZSBhIHBvd2VyIG9mIHR3byAodXNlci1yZXF1ZXN0ZWQgY2FwYWNpdGllcyBhcmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdFxuICAgcG93ZXIpLCBzbyB0aGF0IG1vZCBjYW4gcXVpY2tseSBiZSBjb21wdXRlZCB1c2luZyBbbGFuZCB0Lm1hc2tdLCB3aGVyZSBbdC5tYXNrID1cbiAgIGNhcGFjaXR5IHQgLSAxXS4gIFNvLCBxdWV1ZSBlbGVtZW50IFtpXSBpcyBhdCBbdC5lbHRzLiggKHQuZnJvbnQgKyBpKSBsYW5kIHQubWFzayApXS5cblxuICAgW251bV9tdXRhdGlvbnNdIGlzIHVzZWQgdG8gZGV0ZWN0IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiAqKVxudHlwZSAnYSB0ID1cbiAgeyBtdXRhYmxlIG51bV9tdXRhdGlvbnMgOiBpbnRcbiAgOyBtdXRhYmxlIGZyb250IDogaW50XG4gIDsgbXV0YWJsZSBtYXNrIDogaW50XG4gIDsgbXV0YWJsZSBsZW5ndGggOiBpbnRcbiAgOyBtdXRhYmxlIGVsdHMgOiAnYSBPcHRpb25fYXJyYXkudFxuICB9XG5bQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gIGZ1biBfb2ZfYV9fMDAxX1xuICAgIHsgbnVtX211dGF0aW9ucyA9IG51bV9tdXRhdGlvbnNfXzAwM19cbiAgICA7IGZyb250ID0gZnJvbnRfXzAwNV9cbiAgICA7IG1hc2sgPSBtYXNrX18wMDdfXG4gICAgOyBsZW5ndGggPSBsZW5ndGhfXzAwOV9cbiAgICA7IGVsdHMgPSBlbHRzX18wMTFfXG4gICAgfSAtPlxuICAgIGxldCBibmRzX18wMDJfID0gW10gaW5cbiAgICBsZXQgYm5kc19fMDAyXyA9XG4gICAgICBsZXQgYXJnX18wMTJfID0gT3B0aW9uX2FycmF5LnNleHBfb2ZfdCBfb2ZfYV9fMDAxXyBlbHRzX18wMTFfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJlbHRzXCI7IGFyZ19fMDEyXyBdIDo6IGJuZHNfXzAwMl9cbiAgICBpblxuICAgIGxldCBibmRzX18wMDJfID1cbiAgICAgIGxldCBhcmdfXzAxMF8gPSBzZXhwX29mX2ludCBsZW5ndGhfXzAwOV8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImxlbmd0aFwiOyBhcmdfXzAxMF8gXSA6OiBibmRzX18wMDJfXG4gICAgaW5cbiAgICBsZXQgYm5kc19fMDAyXyA9XG4gICAgICBsZXQgYXJnX18wMDhfID0gc2V4cF9vZl9pbnQgbWFza19fMDA3XyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwibWFza1wiOyBhcmdfXzAwOF8gXSA6OiBibmRzX18wMDJfXG4gICAgaW5cbiAgICBsZXQgYm5kc19fMDAyXyA9XG4gICAgICBsZXQgYXJnX18wMDZfID0gc2V4cF9vZl9pbnQgZnJvbnRfXzAwNV8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImZyb250XCI7IGFyZ19fMDA2XyBdIDo6IGJuZHNfXzAwMl9cbiAgICBpblxuICAgIGxldCBibmRzX18wMDJfID1cbiAgICAgIGxldCBhcmdfXzAwNF8gPSBzZXhwX29mX2ludCBudW1fbXV0YXRpb25zX18wMDNfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJudW1fbXV0YXRpb25zXCI7IGFyZ19fMDA0XyBdIDo6IGJuZHNfXzAwMl9cbiAgICBpblxuICAgIFNleHBsaWIwLlNleHAuTGlzdCBibmRzX18wMDJfXG47O1xuXG5bQEBAZW5kXVxuXG5tb2R1bGUgdHlwZSBTID0gUXVldWVfaW50Zi5TXG5cbmxldCBpbmNfbnVtX211dGF0aW9ucyB0ID0gdC5udW1fbXV0YXRpb25zIDwtIHQubnVtX211dGF0aW9ucyArIDFcbmxldCBjYXBhY2l0eSB0ID0gdC5tYXNrICsgMVxubGV0IGVsdHNfaW5kZXggdCBpID0gKHQuZnJvbnQgKyBpKSBsYW5kIHQubWFza1xubGV0IHVuc2FmZV9nZXQgdCBpID0gT3B0aW9uX2FycmF5LnVuc2FmZV9nZXRfc29tZV9leG4gdC5lbHRzIChlbHRzX2luZGV4IHQgaSlcbmxldCB1bnNhZmVfaXNfc2V0IHQgaSA9IE9wdGlvbl9hcnJheS51bnNhZmVfaXNfc29tZSB0LmVsdHMgKGVsdHNfaW5kZXggdCBpKVxubGV0IHVuc2FmZV9zZXQgdCBpIGEgPSBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9zb21lIHQuZWx0cyAoZWx0c19pbmRleCB0IGkpIGFcbmxldCB1bnNhZmVfdW5zZXQgdCBpID0gT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfbm9uZSB0LmVsdHMgKGVsdHNfaW5kZXggdCBpKVxuXG5sZXQgY2hlY2tfaW5kZXhfZXhuIHQgaSA9XG4gIGlmIGkgPCAwIHx8IGkgPj0gdC5sZW5ndGhcbiAgdGhlblxuICAgIEVycm9yLnJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiUXVldWUgaW5kZXggb3V0IG9mIGJvdW5kc1wiXG4gICAgICAgICBbIFwiaW5kZXhcIiwgaSB8PiBJbnQuc2V4cF9vZl90OyBcImxlbmd0aFwiLCB0Lmxlbmd0aCB8PiBJbnQuc2V4cF9vZl90IF0pXG47O1xuXG5sZXQgZ2V0IHQgaSA9XG4gIGNoZWNrX2luZGV4X2V4biB0IGk7XG4gIHVuc2FmZV9nZXQgdCBpXG47O1xuXG5sZXQgc2V0IHQgaSBhID1cbiAgY2hlY2tfaW5kZXhfZXhuIHQgaTtcbiAgaW5jX251bV9tdXRhdGlvbnMgdDtcbiAgdW5zYWZlX3NldCB0IGkgYVxuOztcblxubGV0IGlzX2VtcHR5IHQgPSB0Lmxlbmd0aCA9IDBcbmxldCBsZW5ndGggeyBsZW5ndGg7IF8gfSA9IGxlbmd0aFxuXG5sZXQgZW5zdXJlX25vX211dGF0aW9uIHQgbnVtX211dGF0aW9ucyA9XG4gIGlmIHQubnVtX211dGF0aW9ucyA8PiBudW1fbXV0YXRpb25zXG4gIHRoZW5cbiAgICBFcnJvci5yYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcIm11dGF0aW9uIG9mIHF1ZXVlIGR1cmluZyBpdGVyYXRpb25cIlxuICAgICAgICAgWyBcIlwiLCB0IHw+IHNleHBfb2ZfdCAoZnVuIF8gLT4gU2V4cC5BdG9tIFwiX1wiKSBdKVxuOztcblxubGV0IGNvbXBhcmUgPVxuICBsZXQgcmVjIHVuc2FmZV9jb21wYXJlX2Zyb20gY29tcGFyZV9lbHQgcG9zIH50MSB+dDIgfmxlbjEgfmxlbjIgfm11dDEgfm11dDIgPVxuICAgIG1hdGNoIHBvcyA9IGxlbjEsIHBvcyA9IGxlbjIgd2l0aFxuICAgIHwgdHJ1ZSwgdHJ1ZSAtPiAwXG4gICAgfCB0cnVlLCBmYWxzZSAtPiAtMVxuICAgIHwgZmFsc2UsIHRydWUgLT4gMVxuICAgIHwgZmFsc2UsIGZhbHNlIC0+XG4gICAgICBsZXQgeCA9IGNvbXBhcmVfZWx0ICh1bnNhZmVfZ2V0IHQxIHBvcykgKHVuc2FmZV9nZXQgdDIgcG9zKSBpblxuICAgICAgZW5zdXJlX25vX211dGF0aW9uIHQxIG11dDE7XG4gICAgICBlbnN1cmVfbm9fbXV0YXRpb24gdDIgbXV0MjtcbiAgICAgIChtYXRjaCB4IHdpdGhcbiAgICAgICB8IDAgLT4gdW5zYWZlX2NvbXBhcmVfZnJvbSBjb21wYXJlX2VsdCAocG9zICsgMSkgfnQxIH50MiB+bGVuMSB+bGVuMiB+bXV0MSB+bXV0MlxuICAgICAgIHwgbiAtPiBuKVxuICBpblxuICBmdW4gY29tcGFyZV9lbHQgdDEgdDIgLT5cbiAgICBpZiBwaHlzX2VxdWFsIHQxIHQyXG4gICAgdGhlbiAwXG4gICAgZWxzZVxuICAgICAgdW5zYWZlX2NvbXBhcmVfZnJvbVxuICAgICAgICBjb21wYXJlX2VsdFxuICAgICAgICAwXG4gICAgICAgIH50MVxuICAgICAgICB+dDJcbiAgICAgICAgfmxlbjE6dDEubGVuZ3RoXG4gICAgICAgIH5sZW4yOnQyLmxlbmd0aFxuICAgICAgICB+bXV0MTp0MS5udW1fbXV0YXRpb25zXG4gICAgICAgIH5tdXQyOnQyLm51bV9tdXRhdGlvbnNcbjs7XG5cbmxldCBlcXVhbCA9XG4gIGxldCByZWMgdW5zYWZlX2VxdWFsX2Zyb20gZXF1YWxfZWx0IHBvcyB+dDEgfnQyIH5tdXQxIH5tdXQyIH5sZW4gPVxuICAgIHBvcyA9IGxlblxuICAgIHx8XG4gICAgbGV0IGIgPSBlcXVhbF9lbHQgKHVuc2FmZV9nZXQgdDEgcG9zKSAodW5zYWZlX2dldCB0MiBwb3MpIGluXG4gICAgZW5zdXJlX25vX211dGF0aW9uIHQxIG11dDE7XG4gICAgZW5zdXJlX25vX211dGF0aW9uIHQyIG11dDI7XG4gICAgYiAmJiB1bnNhZmVfZXF1YWxfZnJvbSBlcXVhbF9lbHQgKHBvcyArIDEpIH50MSB+dDIgfm11dDEgfm11dDIgfmxlblxuICBpblxuICBmdW4gZXF1YWxfZWx0IHQxIHQyIC0+XG4gICAgcGh5c19lcXVhbCB0MSB0MlxuICAgIHx8XG4gICAgbGV0IGxlbjEgPSB0MS5sZW5ndGggaW5cbiAgICBsZXQgbGVuMiA9IHQyLmxlbmd0aCBpblxuICAgIGxlbjEgPSBsZW4yXG4gICAgJiYgdW5zYWZlX2VxdWFsX2Zyb21cbiAgICAgICAgIGVxdWFsX2VsdFxuICAgICAgICAgMFxuICAgICAgICAgfnQxXG4gICAgICAgICB+dDJcbiAgICAgICAgIH5sZW46bGVuMVxuICAgICAgICAgfm11dDE6dDEubnVtX211dGF0aW9uc1xuICAgICAgICAgfm11dDI6dDIubnVtX211dGF0aW9uc1xuOztcblxubGV0IGludmFyaWFudCBpbnZhcmlhbnRfYSB0ID1cbiAgbGV0IHsgbnVtX211dGF0aW9uczsgbWFzayA9IF87IGVsdHM7IGZyb250OyBsZW5ndGggfSA9IHQgaW5cbiAgYXNzZXJ0IChmcm9udCA+PSAwKTtcbiAgYXNzZXJ0IChmcm9udCA8IGNhcGFjaXR5IHQpO1xuICBsZXQgY2FwYWNpdHkgPSBjYXBhY2l0eSB0IGluXG4gIGFzc2VydCAoY2FwYWNpdHkgPSBPcHRpb25fYXJyYXkubGVuZ3RoIGVsdHMpO1xuICBhc3NlcnQgKGNhcGFjaXR5ID49IDEpO1xuICBhc3NlcnQgKEludC5pc19wb3cyIGNhcGFjaXR5KTtcbiAgYXNzZXJ0IChsZW5ndGggPj0gMCk7XG4gIGFzc2VydCAobGVuZ3RoIDw9IGNhcGFjaXR5KTtcbiAgZm9yIGkgPSAwIHRvIGNhcGFjaXR5IC0gMSBkb1xuICAgIGlmIGkgPCB0Lmxlbmd0aFxuICAgIHRoZW4gKFxuICAgICAgaW52YXJpYW50X2EgKHVuc2FmZV9nZXQgdCBpKTtcbiAgICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0IG51bV9tdXRhdGlvbnMpXG4gICAgZWxzZSBhc3NlcnQgKG5vdCAodW5zYWZlX2lzX3NldCB0IGkpKVxuICBkb25lXG47O1xuXG5sZXQgY3JlYXRlICh0eXBlIGEpID9jYXBhY2l0eSAoKSA6IGEgdCA9XG4gIGxldCBjYXBhY2l0eSA9XG4gICAgbWF0Y2ggY2FwYWNpdHkgd2l0aFxuICAgIHwgTm9uZSAtPiAxXG4gICAgfCBTb21lIGNhcGFjaXR5IC0+XG4gICAgICBpZiBjYXBhY2l0eSA8IDBcbiAgICAgIHRoZW5cbiAgICAgICAgRXJyb3IucmFpc2Vfc1xuICAgICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgICBcImNhbm5vdCBoYXZlIHF1ZXVlIHdpdGggbmVnYXRpdmUgY2FwYWNpdHlcIlxuICAgICAgICAgICAgIFsgXCJjYXBhY2l0eVwiLCBjYXBhY2l0eSB8PiBJbnQuc2V4cF9vZl90IF0pXG4gICAgICBlbHNlIGlmIGNhcGFjaXR5ID0gMFxuICAgICAgdGhlbiAxXG4gICAgICBlbHNlIEludC5jZWlsX3BvdzIgY2FwYWNpdHlcbiAgaW5cbiAgeyBudW1fbXV0YXRpb25zID0gMFxuICA7IGZyb250ID0gMFxuICA7IG1hc2sgPSBjYXBhY2l0eSAtIDFcbiAgOyBsZW5ndGggPSAwXG4gIDsgZWx0cyA9IE9wdGlvbl9hcnJheS5jcmVhdGUgfmxlbjpjYXBhY2l0eVxuICB9XG47O1xuXG5sZXQgYmxpdF90b19hcnJheSB+c3JjIGRzdCA9XG4gIGFzc2VydCAoc3JjLmxlbmd0aCA8PSBPcHRpb25fYXJyYXkubGVuZ3RoIGRzdCk7XG4gIGxldCBmcm9udF9sZW4gPSBJbnQubWluIHNyYy5sZW5ndGggKGNhcGFjaXR5IHNyYyAtIHNyYy5mcm9udCkgaW5cbiAgbGV0IHJlc3RfbGVuID0gc3JjLmxlbmd0aCAtIGZyb250X2xlbiBpblxuICBPcHRpb25fYXJyYXkuYmxpdCB+bGVuOmZyb250X2xlbiB+c3JjOnNyYy5lbHRzIH5zcmNfcG9zOnNyYy5mcm9udCB+ZHN0IH5kc3RfcG9zOjA7XG4gIE9wdGlvbl9hcnJheS5ibGl0IH5sZW46cmVzdF9sZW4gfnNyYzpzcmMuZWx0cyB+c3JjX3BvczowIH5kc3QgfmRzdF9wb3M6ZnJvbnRfbGVuXG47O1xuXG5sZXQgc2V0X2NhcGFjaXR5IHQgZGVzaXJlZF9jYXBhY2l0eSA9XG4gICgqIFdlIGFsbG93IGFyZ3VtZW50cyBsZXNzIHRoYW4gMSB0byBbc2V0X2NhcGFjaXR5XSwgYnV0IHRyYW5zbGF0ZSB0aGVtIHRvIDEgdG8gc2ltcGxpZnlcbiAgICAgdGhlIGNvZGUgdGhhdCByZWxpZXMgb24gdGhlIGFycmF5IGxlbmd0aCBiZWluZyBhIHBvd2VyIG9mIDIuICopXG4gIGluY19udW1fbXV0YXRpb25zIHQ7XG4gIGxldCBuZXdfY2FwYWNpdHkgPSBJbnQuY2VpbF9wb3cyIChtYXggMSAobWF4IGRlc2lyZWRfY2FwYWNpdHkgdC5sZW5ndGgpKSBpblxuICBpZiBuZXdfY2FwYWNpdHkgPD4gY2FwYWNpdHkgdFxuICB0aGVuIChcbiAgICBsZXQgZHN0ID0gT3B0aW9uX2FycmF5LmNyZWF0ZSB+bGVuOm5ld19jYXBhY2l0eSBpblxuICAgIGJsaXRfdG9fYXJyYXkgfnNyYzp0IGRzdDtcbiAgICB0LmZyb250IDwtIDA7XG4gICAgdC5tYXNrIDwtIG5ld19jYXBhY2l0eSAtIDE7XG4gICAgdC5lbHRzIDwtIGRzdClcbjs7XG5cbmxldCBlbnF1ZXVlIHQgYSA9XG4gIGluY19udW1fbXV0YXRpb25zIHQ7XG4gIGlmIHQubGVuZ3RoID0gY2FwYWNpdHkgdCB0aGVuIHNldF9jYXBhY2l0eSB0ICgyICogdC5sZW5ndGgpO1xuICB1bnNhZmVfc2V0IHQgdC5sZW5ndGggYTtcbiAgdC5sZW5ndGggPC0gdC5sZW5ndGggKyAxXG47O1xuXG5sZXQgZGVxdWV1ZV9ub25lbXB0eSB0ID1cbiAgaW5jX251bV9tdXRhdGlvbnMgdDtcbiAgbGV0IGVsdHMgPSB0LmVsdHMgaW5cbiAgbGV0IGZyb250ID0gdC5mcm9udCBpblxuICBsZXQgcmVzID0gT3B0aW9uX2FycmF5LmdldF9zb21lX2V4biBlbHRzIGZyb250IGluXG4gIE9wdGlvbl9hcnJheS5zZXRfbm9uZSBlbHRzIGZyb250O1xuICB0LmZyb250IDwtIGVsdHNfaW5kZXggdCAxO1xuICB0Lmxlbmd0aCA8LSB0Lmxlbmd0aCAtIDE7XG4gIHJlc1xuOztcblxubGV0IGRlcXVldWVfZXhuIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gcmFpc2UgQ2FtbC5RdWV1ZS5FbXB0eSBlbHNlIGRlcXVldWVfbm9uZW1wdHkgdFxubGV0IGRlcXVldWUgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAoZGVxdWV1ZV9ub25lbXB0eSB0KVxubGV0IGZyb250X25vbmVtcHR5IHQgPSBPcHRpb25fYXJyYXkudW5zYWZlX2dldF9zb21lX2V4biB0LmVsdHMgdC5mcm9udFxubGV0IGxhc3Rfbm9uZW1wdHkgdCA9IHVuc2FmZV9nZXQgdCAodC5sZW5ndGggLSAxKVxubGV0IHBlZWsgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAoZnJvbnRfbm9uZW1wdHkgdClcbmxldCBwZWVrX2V4biB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIHJhaXNlIENhbWwuUXVldWUuRW1wdHkgZWxzZSBmcm9udF9ub25lbXB0eSB0XG5sZXQgbGFzdCB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChsYXN0X25vbmVtcHR5IHQpXG5sZXQgbGFzdF9leG4gdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiByYWlzZSBDYW1sLlF1ZXVlLkVtcHR5IGVsc2UgbGFzdF9ub25lbXB0eSB0XG5cbmxldCBjbGVhciB0ID1cbiAgaW5jX251bV9tdXRhdGlvbnMgdDtcbiAgaWYgdC5sZW5ndGggPiAwXG4gIHRoZW4gKFxuICAgIGZvciBpID0gMCB0byB0Lmxlbmd0aCAtIDEgZG9cbiAgICAgIHVuc2FmZV91bnNldCB0IGlcbiAgICBkb25lO1xuICAgIHQubGVuZ3RoIDwtIDA7XG4gICAgdC5mcm9udCA8LSAwKVxuOztcblxubGV0IGJsaXRfdHJhbnNmZXIgfnNyYyB+ZHN0ID9sZW4gKCkgPVxuICBpbmNfbnVtX211dGF0aW9ucyBzcmM7XG4gIGluY19udW1fbXV0YXRpb25zIGRzdDtcbiAgbGV0IGxlbiA9XG4gICAgbWF0Y2ggbGVuIHdpdGhcbiAgICB8IE5vbmUgLT4gc3JjLmxlbmd0aFxuICAgIHwgU29tZSBsZW4gLT5cbiAgICAgIGlmIGxlbiA8IDBcbiAgICAgIHRoZW5cbiAgICAgICAgRXJyb3IucmFpc2Vfc1xuICAgICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgICBcIlF1ZXVlLmJsaXRfdHJhbnNmZXI6IG5lZ2F0aXZlIGxlbmd0aFwiXG4gICAgICAgICAgICAgWyBcImxlbmd0aFwiLCBsZW4gfD4gSW50LnNleHBfb2ZfdCBdKTtcbiAgICAgIG1pbiBsZW4gc3JjLmxlbmd0aFxuICBpblxuICBpZiBsZW4gPiAwXG4gIHRoZW4gKFxuICAgIHNldF9jYXBhY2l0eSBkc3QgKG1heCAoY2FwYWNpdHkgZHN0KSAoZHN0Lmxlbmd0aCArIGxlbikpO1xuICAgIGxldCBkc3Rfc3RhcnQgPSBkc3QuZnJvbnQgKyBkc3QubGVuZ3RoIGluXG4gICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICgqIFRoaXMgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBzaW1wbHkgW2VucXVldWUgZHN0IChkZXF1ZXVlX25vbmVtcHR5IHNyYyldICopXG4gICAgICBsZXQgc3JjX2kgPSAoc3JjLmZyb250ICsgaSkgbGFuZCBzcmMubWFzayBpblxuICAgICAgbGV0IGRzdF9pID0gKGRzdF9zdGFydCArIGkpIGxhbmQgZHN0Lm1hc2sgaW5cbiAgICAgIE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X3NvbWVcbiAgICAgICAgZHN0LmVsdHNcbiAgICAgICAgZHN0X2lcbiAgICAgICAgKE9wdGlvbl9hcnJheS51bnNhZmVfZ2V0X3NvbWVfZXhuIHNyYy5lbHRzIHNyY19pKTtcbiAgICAgIE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X25vbmUgc3JjLmVsdHMgc3JjX2lcbiAgICBkb25lO1xuICAgIGRzdC5sZW5ndGggPC0gZHN0Lmxlbmd0aCArIGxlbjtcbiAgICBzcmMuZnJvbnQgPC0gKHNyYy5mcm9udCArIGxlbikgbGFuZCBzcmMubWFzaztcbiAgICBzcmMubGVuZ3RoIDwtIHNyYy5sZW5ndGggLSBsZW4pXG47O1xuXG5sZXQgZW5xdWV1ZV9hbGwgdCBsID1cbiAgKCogVHJhdmVyc2luZyB0aGUgbGlzdCB1cCBmcm9udCB0byBjb21wdXRlIGl0cyBsZW5ndGggaXMgcHJvYmFibHkgKGJ1dCBub3QgZGVmaW5pdGVseSlcbiAgICAgYmV0dGVyIHRoYW4gZG91YmxpbmcgdGhlIHVuZGVybHlpbmcgYXJyYXkgc2l6ZSBzZXZlcmFsIHRpbWVzIGZvciBsYXJnZSBxdWV1ZXMuICopXG4gIHNldF9jYXBhY2l0eSB0IChJbnQubWF4IChjYXBhY2l0eSB0KSAodC5sZW5ndGggKyBMaXN0Lmxlbmd0aCBsKSk7XG4gIExpc3QuaXRlciBsIH5mOihmdW4geCAtPiBlbnF1ZXVlIHQgeClcbjs7XG5cbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBpZiB0Lmxlbmd0aCA9IDBcbiAgdGhlbiBpbml0XG4gIGVsc2UgKFxuICAgIGxldCBudW1fbXV0YXRpb25zID0gdC5udW1fbXV0YXRpb25zIGluXG4gICAgbGV0IHIgPSByZWYgaW5pdCBpblxuICAgIGZvciBpID0gMCB0byB0Lmxlbmd0aCAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCB0IGkpO1xuICAgICAgZW5zdXJlX25vX211dGF0aW9uIHQgbnVtX211dGF0aW9uc1xuICAgIGRvbmU7XG4gICAgIXIpXG47O1xuXG5sZXQgZm9sZGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBpID0gcmVmIDAgaW5cbiAgZm9sZCB0IH5pbml0IH5mOihmdW4gYWNjIGEgLT5cbiAgICBsZXQgYWNjID0gZiAhaSBhY2MgYSBpblxuICAgIGkgOj0gIWkgKyAxO1xuICAgIGFjYylcbjs7XG5cblxuKCogW2l0ZXJdIGlzIGltcGxlbWVudGVkIGRpcmVjdGx5IGJlY2F1c2UgaW1wbGVtZW50aW5nIGl0IGluIHRlcm1zIG9mIFtmb2xkXSBpc1xuICAgc2xvd2VyLiAqKVxubGV0IGl0ZXIgdCB+ZiA9XG4gIGxldCBudW1fbXV0YXRpb25zID0gdC5udW1fbXV0YXRpb25zIGluXG4gIGZvciBpID0gMCB0byB0Lmxlbmd0aCAtIDEgZG9cbiAgICBmICh1bnNhZmVfZ2V0IHQgaSk7XG4gICAgZW5zdXJlX25vX211dGF0aW9uIHQgbnVtX211dGF0aW9uc1xuICBkb25lXG47O1xuXG5sZXQgaXRlcmkgdCB+ZiA9XG4gIGxldCBudW1fbXV0YXRpb25zID0gdC5udW1fbXV0YXRpb25zIGluXG4gIGZvciBpID0gMCB0byB0Lmxlbmd0aCAtIDEgZG9cbiAgICBmIGkgKHVuc2FmZV9nZXQgdCBpKTtcbiAgICBlbnN1cmVfbm9fbXV0YXRpb24gdCBudW1fbXV0YXRpb25zXG4gIGRvbmVcbjs7XG5cbmxldCB0b19saXN0IHQgPVxuICBsZXQgcmVzdWx0ID0gcmVmIFtdIGluXG4gIGZvciBpID0gdC5sZW5ndGggLSAxIGRvd250byAwIGRvXG4gICAgcmVzdWx0IDo9IHVuc2FmZV9nZXQgdCBpIDo6ICFyZXN1bHRcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubW9kdWxlIEMgPSBJbmRleGVkX2NvbnRhaW5lci5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGl0ZXIgPSBgQ3VzdG9tIGl0ZXJcbiAgICBsZXQgbGVuZ3RoID0gYEN1c3RvbSBsZW5ndGhcbiAgICBsZXQgZm9sZGkgPSBgQ3VzdG9tIGZvbGRpXG4gICAgbGV0IGl0ZXJpID0gYEN1c3RvbSBpdGVyaVxuICBlbmQpXG5cbmxldCBjb3VudCA9IEMuY291bnRcbmxldCBleGlzdHMgPSBDLmV4aXN0c1xubGV0IGZpbmQgPSBDLmZpbmRcbmxldCBmaW5kX21hcCA9IEMuZmluZF9tYXBcbmxldCBmb2xkX3Jlc3VsdCA9IEMuZm9sZF9yZXN1bHRcbmxldCBmb2xkX3VudGlsID0gQy5mb2xkX3VudGlsXG5sZXQgZm9yX2FsbCA9IEMuZm9yX2FsbFxubGV0IG1heF9lbHQgPSBDLm1heF9lbHRcbmxldCBtZW0gPSBDLm1lbVxubGV0IG1pbl9lbHQgPSBDLm1pbl9lbHRcbmxldCBzdW0gPSBDLnN1bVxubGV0IGNvdW50aSA9IEMuY291bnRpXG5sZXQgZXhpc3RzaSA9IEMuZXhpc3RzaVxubGV0IGZpbmRfbWFwaSA9IEMuZmluZF9tYXBpXG5sZXQgZmluZGkgPSBDLmZpbmRpXG5sZXQgZm9yX2FsbGkgPSBDLmZvcl9hbGxpXG5cblxuKCogRm9yIFtjb25jYXRfbWFwXSwgW2ZpbHRlcl9tYXBdLCBhbmQgW2ZpbHRlcl0sIHdlIGRvbid0IGNyZWF0ZSBbdF9yZXN1bHRdIHdpdGggW3RdJ3NcbiAgIGNhcGFjaXR5IGJlY2F1c2Ugd2UgaGF2ZSBubyBpZGVhIGhvdyBtYW55IGVsZW1lbnRzIFt0X3Jlc3VsdF0gd2lsbCB1bHRpbWF0ZWx5IGhvbGQuICopXG5sZXQgY29uY2F0X21hcCB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT4gTGlzdC5pdGVyIChmIGEpIH5mOihmdW4gYiAtPiBlbnF1ZXVlIHRfcmVzdWx0IGIpKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBjb25jYXRfbWFwaSB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT4gTGlzdC5pdGVyIChmIGkgYSkgfmY6KGZ1biBiIC0+IGVucXVldWUgdF9yZXN1bHQgYikpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGZpbHRlcl9tYXAgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+XG4gICAgbWF0Y2ggZiBhIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYiAtPiBlbnF1ZXVlIHRfcmVzdWx0IGIpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGZpbHRlcl9tYXBpIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPlxuICAgIG1hdGNoIGYgaSBhIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYiAtPiBlbnF1ZXVlIHRfcmVzdWx0IGIpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGZpbHRlciB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT4gaWYgZiBhIHRoZW4gZW5xdWV1ZSB0X3Jlc3VsdCBhKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBmaWx0ZXJpIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPiBpZiBmIGkgYSB0aGVuIGVucXVldWUgdF9yZXN1bHQgYSk7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgZmlsdGVyX2lucGxhY2UgdCB+ZiA9XG4gIGxldCB0MiA9IGZpbHRlciB0IH5mIGluXG4gIGNsZWFyIHQ7XG4gIGJsaXRfdHJhbnNmZXIgfnNyYzp0MiB+ZHN0OnQgKClcbjs7XG5cbmxldCBmaWx0ZXJpX2lucGxhY2UgdCB+ZiA9XG4gIGxldCB0MiA9IGZpbHRlcmkgdCB+ZiBpblxuICBjbGVhciB0O1xuICBibGl0X3RyYW5zZmVyIH5zcmM6dDIgfmRzdDp0ICgpXG47O1xuXG5sZXQgY29weSBzcmMgPVxuICBsZXQgZHN0ID0gY3JlYXRlIH5jYXBhY2l0eTpzcmMubGVuZ3RoICgpIGluXG4gIGJsaXRfdG9fYXJyYXkgfnNyYyBkc3QuZWx0cztcbiAgZHN0Lmxlbmd0aCA8LSBzcmMubGVuZ3RoO1xuICBkc3Rcbjs7XG5cbmxldCBvZl9saXN0IGwgPVxuICAoKiBUcmF2ZXJzaW5nIHRoZSBsaXN0IHVwIGZyb250IHRvIGNvbXB1dGUgaXRzIGxlbmd0aCBpcyBwcm9iYWJseSAoYnV0IG5vdCBkZWZpbml0ZWx5KVxuICAgICBiZXR0ZXIgdGhhbiBkb3VibGluZyB0aGUgdW5kZXJseWluZyBhcnJheSBzaXplIHNldmVyYWwgdGltZXMgZm9yIGxhcmdlIHF1ZXVlcy4gKilcbiAgbGV0IHQgPSBjcmVhdGUgfmNhcGFjaXR5OihMaXN0Lmxlbmd0aCBsKSAoKSBpblxuICBMaXN0Lml0ZXIgbCB+ZjooZnVuIHggLT4gZW5xdWV1ZSB0IHgpO1xuICB0XG47O1xuXG4oKiBUaGUgcXVldWUgW3RdIHJldHVybmVkIGJ5IFtjcmVhdGVdIHdpbGwgaGF2ZSBbdC5sZW5ndGggPSAwXSwgW3QuZnJvbnQgPSAwXSwgYW5kXG4gICBbY2FwYWNpdHkgdCA9IEludC5jZWlsX3BvdzIgbGVuXS4gIFNvLCB3ZSBvbmx5IGhhdmUgdG8gc2V0IFt0Lmxlbmd0aF0gdG8gW2xlbl0gYWZ0ZXJcbiAgIHRoZSBibGl0IHRvIG1haW50YWluIGFsbCB0aGUgaW52YXJpYW50czogW3QubGVuZ3RoXSBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICBpbiB0aGUgcXVldWUsIFt0LmZyb250XSBpcyB0aGUgYXJyYXkgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlLCBhbmRcbiAgIFtjYXBhY2l0eSB0ID0gT3B0aW9uX2FycmF5Lmxlbmd0aCB0LmVsdHNdLiAqKVxubGV0IGluaXQgbGVuIH5mID1cbiAgaWYgbGVuIDwgMFxuICB0aGVuXG4gICAgRXJyb3IucmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZSBcIlF1ZXVlLmluaXQ6IG5lZ2F0aXZlIGxlbmd0aFwiIFsgXCJsZW5ndGhcIiwgbGVuIHw+IEludC5zZXhwX29mX3QgXSk7XG4gIGxldCB0ID0gY3JlYXRlIH5jYXBhY2l0eTpsZW4gKCkgaW5cbiAgYXNzZXJ0IChPcHRpb25fYXJyYXkubGVuZ3RoIHQuZWx0cyA+PSBsZW4pO1xuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgIE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X3NvbWUgdC5lbHRzIGkgKGYgaSlcbiAgZG9uZTtcbiAgdC5sZW5ndGggPC0gbGVuO1xuICB0XG47O1xuXG5sZXQgb2ZfYXJyYXkgYSA9IGluaXQgKEFycmF5Lmxlbmd0aCBhKSB+ZjooQXJyYXkudW5zYWZlX2dldCBhKVxubGV0IHRvX2FycmF5IHQgPSBBcnJheS5pbml0IHQubGVuZ3RoIH5mOihmdW4gaSAtPiB1bnNhZmVfZ2V0IHQgaSlcblxubGV0IG1hcCB0YSB+ZiA9XG4gIGxldCBudW1fbXV0YXRpb25zID0gdGEubnVtX211dGF0aW9ucyBpblxuICBsZXQgdGIgPSBjcmVhdGUgfmNhcGFjaXR5OnRhLmxlbmd0aCAoKSBpblxuICB0Yi5sZW5ndGggPC0gdGEubGVuZ3RoO1xuICBmb3IgaSA9IDAgdG8gdGEubGVuZ3RoIC0gMSBkb1xuICAgIGxldCBiID0gZiAodW5zYWZlX2dldCB0YSBpKSBpblxuICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0YSBudW1fbXV0YXRpb25zO1xuICAgIE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X3NvbWUgdGIuZWx0cyBpIGJcbiAgZG9uZTtcbiAgdGJcbjs7XG5cbmxldCBtYXBpIHQgfmYgPVxuICBsZXQgaSA9IHJlZiAwIGluXG4gIG1hcCB0IH5mOihmdW4gYSAtPlxuICAgIGxldCByZXN1bHQgPSBmICFpIGEgaW5cbiAgICBpIDo9ICFpICsgMTtcbiAgICByZXN1bHQpXG47O1xuXG5sZXQgc2luZ2xldG9uIHggPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBlbnF1ZXVlIHQgeDtcbiAgdFxuOztcblxubGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9IHRvX2xpc3QgdCB8PiBMaXN0LnNleHBfb2ZfdCBzZXhwX29mX2FcbmxldCB0X29mX3NleHAgYV9vZl9zZXhwIHNleHAgPSBMaXN0LnRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCB8PiBvZl9saXN0XG5cbmxldCB0X3NleHBfZ3JhbW1hciAodHlwZSBhKSAoZ3JhbW1hciA6IGEgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoTGlzdC50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSB8XG5cbiAgbGV0IHVucmVhY2hhYmxlX2NvZGUgPSBmdW5jdGlvblxuICAgIHwgKF8gOiB0KSAtPiAuXG4gIDs7XG5cbiAgbGV0IGFsbCA9IFtdXG4gIGxldCBoYXNoX2ZvbGRfdCBfIHQgPSB1bnJlYWNoYWJsZV9jb2RlIHRcbiAgbGV0IGhhc2ggPSB1bnJlYWNoYWJsZV9jb2RlXG4gIGxldCBjb21wYXJlIGEgXyA9IHVucmVhY2hhYmxlX2NvZGUgYVxuICBsZXQgc2V4cF9vZl90ID0gdW5yZWFjaGFibGVfY29kZVxuICBsZXQgdF9vZl9zZXhwIHNleHAgPSBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfdHlwZSBcIkJhc2UuTm90aGluZy50XCIgc2V4cFxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSB7IHVudHlwZWQgPSBVbmlvbiBbXSB9XG4gIGxldCB0b19zdHJpbmcgPSB1bnJlYWNoYWJsZV9jb2RlXG4gIGxldCBvZl9zdHJpbmcgKF8gOiBzdHJpbmcpID0gZmFpbHdpdGggXCJCYXNlLk5vdGhpbmcub2Zfc3RyaW5nOiBub3Qgc3VwcG9ydGVkXCJcbmVuZFxuXG5pbmNsdWRlIFRcblxuaW5jbHVkZSBJZGVudGlmaWFibGUuTWFrZSAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuTm90aGluZ1wiXG4gIGVuZClcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgQ2FtbC5OYXRpdmVpbnRcbmluY2x1ZGUgTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBuYXRpdmVpbnQgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX25hdGl2ZWludFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfbmF0aXZlaW50IGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChuYXRpdmVpbnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfbmF0aXZlaW50IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IG5hdGl2ZWludF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGNvbXBhcmUgPSBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmNvbXBhcmVcbiAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICBsZXQgb2Zfc3RyaW5nID0gb2Zfc3RyaW5nXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG5tb2R1bGUgQ29udiA9IEludF9jb252ZXJzaW9uc1xuaW5jbHVkZSBDb252Lk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29udi5NYWtlX2hleCAoc3RydWN0XG4gICAgb3BlbiBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgICB0eXBlIHQgPSBuYXRpdmVpbnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChjb21wYXJlX25hdGl2ZWludCA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBoYXNoX2ZvbGRfbmF0aXZlaW50XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IGhhc2hfbmF0aXZlaW50IGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCB6ZXJvID0gemVyb1xuICAgIGxldCBuZWcgPSBuZWdcbiAgICBsZXQgKCA8ICkgPSAoIDwgKVxuICAgIGxldCB0b19zdHJpbmcgaSA9IFByaW50Zi5zcHJpbnRmIFwiJW54XCIgaVxuICAgIGxldCBvZl9zdHJpbmcgcyA9IENhbWwuU2NhbmYuc3NjYW5mIHMgXCIlbnhcIiBGbi5pZFxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5OYXRpdmVpbnQuSGV4XCJcbiAgZW5kKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5OYXRpdmVpbnRcIlxuICBlbmQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBudW1fYml0cyA9IFdvcmRfc2l6ZS5udW1fYml0cyBXb3JkX3NpemUud29yZF9zaXplXG5sZXQgZmxvYXRfbG93ZXJfYm91bmQgPSBGbG9hdDAubG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X3VwcGVyX2JvdW5kID0gRmxvYXQwLnVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBzaGlmdF9yaWdodF9sb2dpY2FsID0gc2hpZnRfcmlnaHRfbG9naWNhbFxubGV0IHNoaWZ0X3JpZ2h0ID0gc2hpZnRfcmlnaHRcbmxldCBzaGlmdF9sZWZ0ID0gc2hpZnRfbGVmdFxubGV0IGJpdF9ub3QgPSBsb2dub3RcbmxldCBiaXRfeG9yID0gbG9neG9yXG5sZXQgYml0X29yID0gbG9nb3JcbmxldCBiaXRfYW5kID0gbG9nYW5kXG5sZXQgbWluX3ZhbHVlID0gbWluX2ludFxubGV0IG1heF92YWx1ZSA9IG1heF9pbnRcbmxldCBhYnMgPSBhYnNcbmxldCBwcmVkID0gcHJlZFxubGV0IHN1Y2MgPSBzdWNjXG5sZXQgcmVtID0gcmVtXG5sZXQgbmVnID0gbmVnXG5sZXQgbWludXNfb25lID0gbWludXNfb25lXG5sZXQgb25lID0gb25lXG5sZXQgemVybyA9IHplcm9cbmxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG5sZXQgb2ZfZmxvYXRfdW5jaGVja2VkID0gb2ZfZmxvYXRcblxubGV0IG9mX2Zsb2F0IGYgPVxuICBpZiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIGYgZmxvYXRfbG93ZXJfYm91bmRcbiAgJiYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSBmIGZsb2F0X3VwcGVyX2JvdW5kXG4gIHRoZW4gb2ZfZmxvYXQgZlxuICBlbHNlXG4gICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgXCJOYXRpdmVpbnQub2ZfZmxvYXQ6IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCBmKVxuICAgICAgKClcbjs7XG5cbm1vZHVsZSBQb3cyID0gc3RydWN0XG4gIG9wZW4hIEltcG9ydFxuICBvcGVuIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuICBsZXQgbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpID1cbiAgICBQcmludGYuaW52YWxpZF9hcmdmIFwiYXJndW1lbnQgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZVwiICgpXG4gIDs7XG5cbiAgbGV0ICggbG9yICkgPSBDYW1sLk5hdGl2ZWludC5sb2dvclxuICBsZXQgKCBsc3IgKSA9IENhbWwuTmF0aXZlaW50LnNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbiAgbGV0ICggbGFuZCApID0gQ2FtbC5OYXRpdmVpbnQubG9nYW5kXG5cbiAgKCoqIFwiY2VpbGluZyBwb3dlciBvZiAyXCIgLSBMZWFzdCBwb3dlciBvZiAyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgY2VpbF9wb3cyICh4IDogbmF0aXZlaW50KSA9XG4gICAgaWYgeCA8PSAwbiB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IENhbWwuTmF0aXZlaW50LnByZWQgeCBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgKCogVGhlIG5leHQgbGluZSBpcyBzdXBlcmZsdW91cyBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcywgYnV0IGl0J3MgZmFzdGVyIHRvIGRvIGl0XG4gICAgICAgYW55d2F5IHRoYW4gdG8gYnJhbmNoICopXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgQ2FtbC5OYXRpdmVpbnQuc3VjYyB4XG4gIDs7XG5cbiAgKCoqIFwiZmxvb3IgcG93ZXIgb2YgMlwiIC0gTGFyZ2VzdCBwb3dlciBvZiAyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgZmxvb3JfcG93MiB4ID1cbiAgICBpZiB4IDw9IDBuIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgQ2FtbC5OYXRpdmVpbnQuc3ViIHggKHggbHNyIDEpXG4gIDs7XG5cbiAgbGV0IGlzX3BvdzIgeCA9XG4gICAgaWYgeCA8PSAwbiB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICB4IGxhbmQgQ2FtbC5OYXRpdmVpbnQucHJlZCB4ID0gMG5cbiAgOztcblxuICAoKiBDIHN0dWJzIGZvciBuYXRpdmVpbnQgY2x6IGFuZCBjdHogdG8gdXNlIHRoZSBDTFovQlNSL0NUWi9CU0YgaW5zdHJ1Y3Rpb24gd2hlcmUgcG9zc2libGUgKilcbiAgZXh0ZXJuYWwgY2x6XG4gICAgOiAgKG5hdGl2ZWludFtAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jbHpcIiBcIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2Nsel91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBjdHpcbiAgICA6ICAobmF0aXZlaW50W0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2N0elwiIFwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY3R6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGZsb29yX2xvZzIgaSA9XG4gICAgaWYgUG9seS4oIDw9ICkgaSBDYW1sLk5hdGl2ZWludC56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiW05hdGl2ZWludC5mbG9vcl9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiXG4gICAgICAgICAgIFsgXCJcIiwgc2V4cF9vZl9uYXRpdmVpbnQgaSBdKTtcbiAgICBudW1fYml0cyAtIDEgLSBjbHogaVxuICA7O1xuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGNlaWxfbG9nMiBpID1cbiAgICBpZiBQb2x5LiggPD0gKSBpIENhbWwuTmF0aXZlaW50Lnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJbTmF0aXZlaW50LmNlaWxfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIlxuICAgICAgICAgICBbIFwiXCIsIHNleHBfb2ZfbmF0aXZlaW50IGkgXSk7XG4gICAgaWYgQ2FtbC5OYXRpdmVpbnQuZXF1YWwgaSBDYW1sLk5hdGl2ZWludC5vbmVcbiAgICB0aGVuIDBcbiAgICBlbHNlIG51bV9iaXRzIC0gY2x6IChDYW1sLk5hdGl2ZWludC5wcmVkIGkpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBQb3cyXG5cbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmxldCAoIC8gKSA9IGRpdlxubGV0ICggKiApID0gbXVsXG5sZXQgKCAtICkgPSBzdWJcbmxldCAoICsgKSA9IGFkZFxubGV0ICggfi0gKSA9IG5lZ1xubGV0IGluY3IgciA9IHIgOj0gIXIgKyBvbmVcbmxldCBkZWNyIHIgPSByIDo9ICFyIC0gb25lXG5sZXQgb2ZfbmF0aXZlaW50IHQgPSB0XG5sZXQgb2ZfbmF0aXZlaW50X2V4biA9IG9mX25hdGl2ZWludFxubGV0IHRvX25hdGl2ZWludCB0ID0gdFxubGV0IHRvX25hdGl2ZWludF9leG4gPSB0b19uYXRpdmVpbnRcbmxldCBwb3Bjb3VudCA9IFBvcGNvdW50Lm5hdGl2ZWludF9wb3Bjb3VudFxubGV0IG9mX2ludCA9IENvbnYuaW50X3RvX25hdGl2ZWludFxubGV0IG9mX2ludF9leG4gPSBvZl9pbnRcbmxldCB0b19pbnQgPSBDb252Lm5hdGl2ZWludF90b19pbnRcbmxldCB0b19pbnRfZXhuID0gQ29udi5uYXRpdmVpbnRfdG9faW50X2V4blxubGV0IHRvX2ludF90cnVuYyA9IENvbnYubmF0aXZlaW50X3RvX2ludF90cnVuY1xubGV0IG9mX2ludDMyID0gQ29udi5pbnQzMl90b19uYXRpdmVpbnRcbmxldCBvZl9pbnQzMl9leG4gPSBvZl9pbnQzMlxubGV0IHRvX2ludDMyID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJcbmxldCB0b19pbnQzMl9leG4gPSBDb252Lm5hdGl2ZWludF90b19pbnQzMl9leG5cbmxldCB0b19pbnQzMl90cnVuYyA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyX3RydW5jXG5sZXQgb2ZfaW50NjQgPSBDb252LmludDY0X3RvX25hdGl2ZWludFxubGV0IG9mX2ludDY0X2V4biA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50X2V4blxubGV0IG9mX2ludDY0X3RydW5jID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmNcbmxldCB0b19pbnQ2NCA9IENvbnYubmF0aXZlaW50X3RvX2ludDY0XG5sZXQgcG93IGIgZSA9IG9mX2ludF9leG4gKEludF9tYXRoLlByaXZhdGUuaW50X3BvdyAodG9faW50X2V4biBiKSAodG9faW50X2V4biBlKSlcbmxldCAoICoqICkgYiBlID0gcG93IGIgZVxuXG5tb2R1bGUgUHJlX08gPSBzdHJ1Y3RcbiAgbGV0ICggKyApID0gKCArIClcbiAgbGV0ICggLSApID0gKCAtIClcbiAgbGV0ICggKiApID0gKCAqIClcbiAgbGV0ICggLyApID0gKCAvIClcbiAgbGV0ICggfi0gKSA9ICggfi0gKVxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSAoTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA6IENvbXBhcmlzb25zLkluZml4IHdpdGggdHlwZSB0IDo9IHQpXG5cbiAgbGV0IGFicyA9IGFic1xuICBsZXQgbmVnID0gbmVnXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50X2V4biA9IG9mX2ludF9leG5cbmVuZFxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBpbmNsdWRlIFByZV9PXG5cbiAgaW5jbHVkZSBJbnRfbWF0aC5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGluY2x1ZGUgUHJlX09cblxuICAgICAgbGV0IHJlbSA9IHJlbVxuICAgICAgbGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbiAgICAgIGxldCBvZl9mbG9hdCA9IG9mX2Zsb2F0XG4gICAgICBsZXQgb2Zfc3RyaW5nID0gVC5vZl9zdHJpbmdcbiAgICAgIGxldCB0b19zdHJpbmcgPSBULnRvX3N0cmluZ1xuICAgIGVuZClcblxuICBsZXQgKCBsYW5kICkgPSBiaXRfYW5kXG4gIGxldCAoIGxvciApID0gYml0X29yXG4gIGxldCAoIGx4b3IgKSA9IGJpdF94b3JcbiAgbGV0IGxub3QgPSBiaXRfbm90XG4gIGxldCAoIGxzbCApID0gc2hpZnRfbGVmdFxuICBsZXQgKCBhc3IgKSA9IHNoaWZ0X3JpZ2h0XG4gIGxldCAoIGxzciApID0gc2hpZnRfcmlnaHRfbG9naWNhbFxuZW5kXG5cbmluY2x1ZGUgT1xuXG4oKiBbTmF0aXZlaW50XSBhbmQgW05hdGl2ZWludC5PXSBhZ3JlZSB2YWx1ZS13aXNlICopXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmV4dGVybmFsIGJzd2FwIDogdCAtPiB0ID0gXCIlYnN3YXBfbmF0aXZlXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKilcbigqICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKilcbigqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgbGljZW5zZS4gU2VlIC4uL1RISVJELVBBUlRZLnR4dCAgKilcbigqICBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiEgSW1wb3J0XG5tb2R1bGUgTGlzdCA9IExpc3QwXG5pbmNsdWRlIE1hcF9pbnRmXG5cbm1vZHVsZSBGaW5pc2hlZF9vcl91bmZpbmlzaGVkID0gc3RydWN0XG4gIGluY2x1ZGUgTWFwX2ludGYuRmluaXNoZWRfb3JfdW5maW5pc2hlZFxuXG4gICgqIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHRlc3RlZCBpbiBbdGVzdF9tYXAubWxdIHRvIG1ha2Ugc3VyZSBvdXIgdXNlIG9mXG4gICAgIFtDYW1sLk9iai5tYWdpY10gaXMgY29ycmVjdCBhbmQgc2FmZS4gKilcbiAgbGV0IG9mX2NvbnRpbnVlX29yX3N0b3AgOiBDb250aW51ZV9vcl9zdG9wLnQgLT4gdCA9IENhbWwuT2JqLm1hZ2ljXG4gIGxldCB0b19jb250aW51ZV9vcl9zdG9wIDogdCAtPiBDb250aW51ZV9vcl9zdG9wLnQgPSBDYW1sLk9iai5tYWdpY1xuZW5kXG5cbm1vZHVsZSBNZXJnZV9lbGVtZW50ID0gc3RydWN0XG4gIGluY2x1ZGUgTWFwX2ludGYuTWVyZ2VfZWxlbWVudFxuXG4gIGxldCBsZWZ0ID0gZnVuY3Rpb25cbiAgICB8IGBSaWdodCBfIC0+IE5vbmVcbiAgICB8IGBMZWZ0IGxlZnQgfCBgQm90aCAobGVmdCwgXykgLT4gU29tZSBsZWZ0XG4gIDs7XG5cbiAgbGV0IHJpZ2h0ID0gZnVuY3Rpb25cbiAgICB8IGBMZWZ0IF8gLT4gTm9uZVxuICAgIHwgYFJpZ2h0IHJpZ2h0IHwgYEJvdGggKF8sIHJpZ2h0KSAtPiBTb21lIHJpZ2h0XG4gIDs7XG5cbiAgbGV0IGxlZnRfdmFsdWUgdCB+ZGVmYXVsdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBgUmlnaHQgXyAtPiBkZWZhdWx0XG4gICAgfCBgTGVmdCBsZWZ0IHwgYEJvdGggKGxlZnQsIF8pIC0+IGxlZnRcbiAgOztcblxuICBsZXQgcmlnaHRfdmFsdWUgdCB+ZGVmYXVsdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBgTGVmdCBfIC0+IGRlZmF1bHRcbiAgICB8IGBSaWdodCByaWdodCB8IGBCb3RoIChfLCByaWdodCkgLT4gcmlnaHRcbiAgOztcblxuICBsZXQgdmFsdWVzIHQgfmxlZnRfZGVmYXVsdCB+cmlnaHRfZGVmYXVsdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBgTGVmdCBsZWZ0IC0+IGxlZnQsIHJpZ2h0X2RlZmF1bHRcbiAgICB8IGBSaWdodCByaWdodCAtPiBsZWZ0X2RlZmF1bHQsIHJpZ2h0XG4gICAgfCBgQm90aCAobGVmdCwgcmlnaHQpIC0+IGxlZnQsIHJpZ2h0XG4gIDs7XG5lbmRcblxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cblxuZXhjZXB0aW9uIER1cGxpY2F0ZSBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxubGV0ICgpID1cbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIER1cGxpY2F0ZV0gKGZ1bmN0aW9uXG4gICAgfCBEdXBsaWNhdGUgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwibWFwLm1sLkR1cGxpY2F0ZVwiXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbjs7XG5cbltAQEBlbmRdXG5cbm1vZHVsZSBUcmVlMCA9IHN0cnVjdFxuICB0eXBlICgnaywgJ3YpIHQgPVxuICAgIHwgRW1wdHlcbiAgICB8IExlYWYgb2YgJ2sgKiAndlxuICAgIHwgTm9kZSBvZiAoJ2ssICd2KSB0ICogJ2sgKiAndiAqICgnaywgJ3YpIHQgKiBpbnRcblxuICB0eXBlICgnaywgJ3YpIHRyZWUgPSAoJ2ssICd2KSB0XG5cbiAgbGV0IGhlaWdodCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAwXG4gICAgfCBMZWFmIF8gLT4gMVxuICAgIHwgTm9kZSAoXywgXywgXywgXywgaCkgLT4gaFxuICA7O1xuXG4gIGxldCBpbnZhcmlhbnRzID1cbiAgICBsZXQgaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9rZXkgayA9XG4gICAgICAobWF0Y2ggbG93ZXIgd2l0aFxuICAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICAgfCBTb21lIGxvd2VyIC0+IGNvbXBhcmVfa2V5IGxvd2VyIGsgPCAwKVxuICAgICAgJiZcbiAgICAgIG1hdGNoIHVwcGVyIHdpdGhcbiAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICB8IFNvbWUgdXBwZXIgLT4gY29tcGFyZV9rZXkgayB1cHBlciA8IDBcbiAgICBpblxuICAgIGxldCByZWMgbG9vcCBsb3dlciB1cHBlciBjb21wYXJlX2tleSB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiB0cnVlXG4gICAgICB8IExlYWYgKGssIF8pIC0+IGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfa2V5IGtcbiAgICAgIHwgTm9kZSAobCwgaywgXywgciwgaCkgLT5cbiAgICAgICAgbGV0IGhsID0gaGVpZ2h0IGxcbiAgICAgICAgYW5kIGhyID0gaGVpZ2h0IHIgaW5cbiAgICAgICAgYWJzIChobCAtIGhyKSA8PSAyXG4gICAgICAgICYmIGggPSBtYXggaGwgaHIgKyAxXG4gICAgICAgICYmIGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfa2V5IGtcbiAgICAgICAgJiYgbG9vcCBsb3dlciAoU29tZSBrKSBjb21wYXJlX2tleSBsXG4gICAgICAgICYmIGxvb3AgKFNvbWUgaykgdXBwZXIgY29tcGFyZV9rZXkgclxuICAgIGluXG4gICAgZnVuIHQgfmNvbXBhcmVfa2V5IC0+IGxvb3AgTm9uZSBOb25lIGNvbXBhcmVfa2V5IHRcbiAgOztcblxuICAoKiBwcmVjb25kaXRpb246IHxoZWlnaHQobCkgLSBoZWlnaHQocil8IDw9IDIgKilcbiAgbGV0IGNyZWF0ZSBsIHggZCByID1cbiAgICBsZXQgaGwgPSBoZWlnaHQgbFxuICAgIGFuZCBociA9IGhlaWdodCByIGluXG4gICAgaWYgaGwgPSAwICYmIGhyID0gMFxuICAgIHRoZW4gTGVhZiAoeCwgZClcbiAgICBlbHNlIE5vZGUgKGwsIHgsIGQsIHIsIGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKVxuICA7O1xuXG4gIGxldCBzaW5nbGV0b24ga2V5IGRhdGEgPSBMZWFmIChrZXksIGRhdGEpXG5cbiAgKCogV2UgbXVzdCBjYWxsIFtmXSB3aXRoIGluY3JlYXNpbmcgaW5kZXhlcywgYmVjYXVzZSB0aGUgYmluX3Byb3QgcmVhZGVyIGluXG4gICAgIENvcmUuTWFwIG5lZWRzIGl0LiAqKVxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiA9XG4gICAgbGV0IHJlYyBsb29wIG4gfmYgaSA6IChfLCBfKSB0ID1cbiAgICAgIG1hdGNoIG4gd2l0aFxuICAgICAgfCAwIC0+IEVtcHR5XG4gICAgICB8IDEgLT5cbiAgICAgICAgbGV0IGssIHYgPSBmIGkgaW5cbiAgICAgICAgTGVhZiAoaywgdilcbiAgICAgIHwgMiAtPlxuICAgICAgICBsZXQga2wsIHZsID0gZiBpIGluXG4gICAgICAgIGxldCBrLCB2ID0gZiAoaSArIDEpIGluXG4gICAgICAgIE5vZGUgKExlYWYgKGtsLCB2bCksIGssIHYsIEVtcHR5LCAyKVxuICAgICAgfCAzIC0+XG4gICAgICAgIGxldCBrbCwgdmwgPSBmIGkgaW5cbiAgICAgICAgbGV0IGssIHYgPSBmIChpICsgMSkgaW5cbiAgICAgICAgbGV0IGtyLCB2ciA9IGYgKGkgKyAyKSBpblxuICAgICAgICBOb2RlIChMZWFmIChrbCwgdmwpLCBrLCB2LCBMZWFmIChrciwgdnIpLCAyKVxuICAgICAgfCBuIC0+XG4gICAgICAgIGxldCBsZWZ0X2xlbmd0aCA9IG4gbHNyIDEgaW5cbiAgICAgICAgbGV0IHJpZ2h0X2xlbmd0aCA9IG4gLSBsZWZ0X2xlbmd0aCAtIDEgaW5cbiAgICAgICAgbGV0IGxlZnQgPSBsb29wIGxlZnRfbGVuZ3RoIH5mIGkgaW5cbiAgICAgICAgbGV0IGssIHYgPSBmIChpICsgbGVmdF9sZW5ndGgpIGluXG4gICAgICAgIGxldCByaWdodCA9IGxvb3AgcmlnaHRfbGVuZ3RoIH5mIChpICsgbGVmdF9sZW5ndGggKyAxKSBpblxuICAgICAgICBjcmVhdGUgbGVmdCBrIHYgcmlnaHRcbiAgICBpblxuICAgIGxvb3AgbGVuIH5mIDBcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBhcnJheV9sZW5ndGggPSBBcnJheS5sZW5ndGggYXJyYXkgaW5cbiAgICBsZXQgbmV4dCA9XG4gICAgICBpZiBhcnJheV9sZW5ndGggPCAyXG4gICAgICAgICB8fFxuICAgICAgICAgbGV0IGswLCBfID0gYXJyYXkuKDApIGluXG4gICAgICAgICBsZXQgazEsIF8gPSBhcnJheS4oMSkgaW5cbiAgICAgICAgIGNvbXBhcmVfa2V5IGswIGsxIDwgMFxuICAgICAgdGhlbiBmdW4gaSAtPiBhcnJheS4oaSlcbiAgICAgIGVsc2UgZnVuIGkgLT4gYXJyYXkuKGFycmF5X2xlbmd0aCAtIDEgLSBpKVxuICAgIGluXG4gICAgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbjphcnJheV9sZW5ndGggfmY6bmV4dCwgYXJyYXlfbGVuZ3RoXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSBhcnJheSB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIGFycmF5IHdpdGhcbiAgICB8IFt8fF0gfCBbfCBfIHxdIC0+IFJlc3VsdC5PayAob2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9rZXkpXG4gICAgfCBfIC0+XG4gICAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgICAgbGV0IGluY3JlYXNpbmcgPVxuICAgICAgICAgIG1hdGNoIGNvbXBhcmVfa2V5IChmc3QgYXJyYXkuKDApKSAoZnN0IGFycmF5LigxKSkgd2l0aFxuICAgICAgICAgIHwgMCAtPiByLnJldHVybiAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBkdXBsaWNhdGVkIGVsZW1lbnRzXCIpXG4gICAgICAgICAgfCBpIC0+IGkgPCAwXG4gICAgICAgIGluXG4gICAgICAgIGZvciBpID0gMSB0byBBcnJheS5sZW5ndGggYXJyYXkgLSAyIGRvXG4gICAgICAgICAgbWF0Y2ggY29tcGFyZV9rZXkgKGZzdCBhcnJheS4oaSkpIChmc3QgYXJyYXkuKGkgKyAxKSkgd2l0aFxuICAgICAgICAgIHwgMCAtPiByLnJldHVybiAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBkdXBsaWNhdGVkIGVsZW1lbnRzXCIpXG4gICAgICAgICAgfCBpIC0+XG4gICAgICAgICAgICBpZiBQb2x5LiggPD4gKSAoaSA8IDApIGluY3JlYXNpbmdcbiAgICAgICAgICAgIHRoZW5cbiAgICAgICAgICAgICAgci5yZXR1cm5cbiAgICAgICAgICAgICAgICAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBlbGVtZW50cyBhcmUgbm90IG9yZGVyZWRcIilcbiAgICAgICAgZG9uZTtcbiAgICAgICAgUmVzdWx0Lk9rIChvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2tleSkpXG4gIDs7XG5cbiAgKCogcHJlY29uZGl0aW9uOiB8aGVpZ2h0KGwpIC0gaGVpZ2h0KHIpfCA8PSAzICopXG4gIGxldCBiYWwgbCB4IGQgciA9XG4gICAgbGV0IGhsID0gaGVpZ2h0IGwgaW5cbiAgICBsZXQgaHIgPSBoZWlnaHQgciBpblxuICAgIGlmIGhsID4gaHIgKyAyXG4gICAgdGhlbiAoXG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgIHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZSAoKiBoZWlnaHQoTGVhZikgPSAxICYmIDEgaXMgbm90IGxhcmdlciB0aGFuIGhyICsgMiAqKVxuICAgICAgfCBOb2RlIChsbCwgbHYsIGxkLCBsciwgXykgLT5cbiAgICAgICAgaWYgaGVpZ2h0IGxsID49IGhlaWdodCBsclxuICAgICAgICB0aGVuIGNyZWF0ZSBsbCBsdiBsZCAoY3JlYXRlIGxyIHggZCByKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBsciB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICAgIHwgTGVhZiAobHJ2LCBscmQpIC0+IGNyZWF0ZSAoY3JlYXRlIGxsIGx2IGxkIEVtcHR5KSBscnYgbHJkIChjcmVhdGUgRW1wdHkgeCBkIHIpXG4gICAgICAgICAgfCBOb2RlIChscmwsIGxydiwgbHJkLCBscnIsIF8pIC0+XG4gICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBsZCBscmwpIGxydiBscmQgKGNyZWF0ZSBscnIgeCBkIHIpKSlcbiAgICBlbHNlIGlmIGhyID4gaGwgKyAyXG4gICAgdGhlbiAoXG4gICAgICBtYXRjaCByIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgIHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZSAoKiBoZWlnaHQoTGVhZikgPSAxICYmIDEgaXMgbm90IGxhcmdlciB0aGFuIGhsICsgMiAqKVxuICAgICAgfCBOb2RlIChybCwgcnYsIHJkLCByciwgXykgLT5cbiAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybFxuICAgICAgICB0aGVuIGNyZWF0ZSAoY3JlYXRlIGwgeCBkIHJsKSBydiByZCByclxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBybCB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICAgIHwgTGVhZiAocmx2LCBybGQpIC0+IGNyZWF0ZSAoY3JlYXRlIGwgeCBkIEVtcHR5KSBybHYgcmxkIChjcmVhdGUgRW1wdHkgcnYgcmQgcnIpXG4gICAgICAgICAgfCBOb2RlIChybGwsIHJsdiwgcmxkLCBybHIsIF8pIC0+XG4gICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHggZCBybGwpIHJsdiBybGQgKGNyZWF0ZSBybHIgcnYgcmQgcnIpKSlcbiAgICBlbHNlIGNyZWF0ZSBsIHggZCByXG4gIDs7XG5cbiAgbGV0IGVtcHR5ID0gRW1wdHlcblxuICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gdHJ1ZVxuICAgIHwgXyAtPiBmYWxzZVxuICA7O1xuXG4gIGxldCByYWlzZV9rZXlfYWxyZWFkeV9wcmVzZW50IH5rZXkgfnNleHBfb2Zfa2V5ID1cbiAgICBFcnJvci5yYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlIFwiW01hcC5hZGRfZXhuXSBnb3Qga2V5IGFscmVhZHkgcHJlc2VudFwiIFsgXCJrZXlcIiwga2V5IHw+IHNleHBfb2Zfa2V5IF0pXG4gIDs7XG5cbiAgbW9kdWxlIEFkZF9vcl9zZXQgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPVxuICAgICAgfCBBZGRfZXhuX2ludGVybmFsXG4gICAgICB8IEFkZF9leG5cbiAgICAgIHwgU2V0XG4gIGVuZFxuXG5cbiAgbGV0IHJlYyBmaW5kX2FuZF9hZGRfb3Jfc2V0XG4gICAgICAgICAgICB0XG4gICAgICAgICAgICB+bGVuZ3RoXG4gICAgICAgICAgICB+a2V5OnhcbiAgICAgICAgICAgIH5kYXRhXG4gICAgICAgICAgICB+Y29tcGFyZV9rZXlcbiAgICAgICAgICAgIH5zZXhwX29mX2tleVxuICAgICAgICAgICAgfihhZGRfb3Jfc2V0IDogQWRkX29yX3NldC50KVxuICAgID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IExlYWYgKHgsIGRhdGEpLCBsZW5ndGggKyAxXG4gICAgfCBMZWFmICh2LCBkKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB4IHYgaW5cbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggYWRkX29yX3NldCB3aXRoXG4gICAgICAgIHwgQWRkX2V4bl9pbnRlcm5hbCAtPiBFeG4ucmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgRHVwbGljYXRlXG4gICAgICAgIHwgQWRkX2V4biAtPiByYWlzZV9rZXlfYWxyZWFkeV9wcmVzZW50IH5rZXk6eCB+c2V4cF9vZl9rZXlcbiAgICAgICAgfCBTZXQgLT4gTGVhZiAoeCwgZGF0YSksIGxlbmd0aClcbiAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgIHRoZW4gTm9kZSAoTGVhZiAoeCwgZGF0YSksIHYsIGQsIEVtcHR5LCAyKSwgbGVuZ3RoICsgMVxuICAgICAgZWxzZSBOb2RlIChFbXB0eSwgdiwgZCwgTGVhZiAoeCwgZGF0YSksIDIpLCBsZW5ndGggKyAxXG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBoKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB4IHYgaW5cbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggYWRkX29yX3NldCB3aXRoXG4gICAgICAgIHwgQWRkX2V4bl9pbnRlcm5hbCAtPiBFeG4ucmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgRHVwbGljYXRlXG4gICAgICAgIHwgQWRkX2V4biAtPiByYWlzZV9rZXlfYWxyZWFkeV9wcmVzZW50IH5rZXk6eCB+c2V4cF9vZl9rZXlcbiAgICAgICAgfCBTZXQgLT4gTm9kZSAobCwgeCwgZGF0YSwgciwgaCksIGxlbmd0aClcbiAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBsZXQgbCwgbGVuZ3RoID1cbiAgICAgICAgICBmaW5kX2FuZF9hZGRfb3Jfc2V0IH5sZW5ndGggfmtleTp4IH5kYXRhIGwgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSB+YWRkX29yX3NldFxuICAgICAgICBpblxuICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCByLCBsZW5ndGggPVxuICAgICAgICAgIGZpbmRfYW5kX2FkZF9vcl9zZXQgfmxlbmd0aCB+a2V5OnggfmRhdGEgciB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5IH5hZGRfb3Jfc2V0XG4gICAgICAgIGluXG4gICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gIDs7XG5cbiAgbGV0IGFkZF9leG4gdCB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSA9XG4gICAgZmluZF9hbmRfYWRkX29yX3NldCB0IH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5IH5hZGRfb3Jfc2V0OkFkZF9leG5cbiAgOztcblxuICBsZXQgYWRkX2V4bl9pbnRlcm5hbCB0IH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5ID1cbiAgICBmaW5kX2FuZF9hZGRfb3Jfc2V0XG4gICAgICB0XG4gICAgICB+bGVuZ3RoXG4gICAgICB+a2V5XG4gICAgICB+ZGF0YVxuICAgICAgfmNvbXBhcmVfa2V5XG4gICAgICB+c2V4cF9vZl9rZXlcbiAgICAgIH5hZGRfb3Jfc2V0OkFkZF9leG5faW50ZXJuYWxcbiAgOztcblxuICBsZXQgc2V0IHQgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSA9XG4gICAgZmluZF9hbmRfYWRkX29yX3NldFxuICAgICAgdFxuICAgICAgfmxlbmd0aFxuICAgICAgfmtleVxuICAgICAgfmRhdGFcbiAgICAgIH5jb21wYXJlX2tleVxuICAgICAgfnNleHBfb2Zfa2V5OihmdW4gXyAtPiBMaXN0IFtdKVxuICAgICAgfmFkZF9vcl9zZXQ6U2V0XG4gIDs7XG5cbiAgbGV0IHNldCcgdCBrZXkgZGF0YSB+Y29tcGFyZV9rZXkgPSBmc3QgKHNldCB0IH5sZW5ndGg6MCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSlcblxuICBtb2R1bGUgQnVpbGRfaW5jcmVhc2luZyA9IHN0cnVjdFxuICAgIG1vZHVsZSBGcmFnbWVudCA9IHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgKCdrLCAndikgdCA9XG4gICAgICAgIHsgbGVmdF9zdWJ0cmVlIDogKCdrLCAndikgdFxuICAgICAgICA7IGtleSA6ICdrXG4gICAgICAgIDsgZGF0YSA6ICd2XG4gICAgICAgIH1cblxuICAgICAgbGV0IHNpbmdsZXRvbl90b190cmVlX2V4biA9IGZ1bmN0aW9uXG4gICAgICAgIHwgeyBsZWZ0X3N1YnRyZWUgPSBFbXB0eTsga2V5OyBkYXRhIH0gLT4gc2luZ2xldG9uIGtleSBkYXRhXG4gICAgICAgIHwgXyAtPiBmYWlsd2l0aCBcIk1hcC5zaW5nbGV0b25fdG9fdHJlZV9leG46IG5vdCBhIHNpbmdsZXRvblwiXG4gICAgICA7O1xuXG4gICAgICBsZXQgc2luZ2xldG9uIH5rZXkgfmRhdGEgPSB7IGxlZnRfc3VidHJlZSA9IEVtcHR5OyBrZXk7IGRhdGEgfVxuXG4gICAgICAoKiBwcmVjb25kaXRpb246IHxoZWlnaHQobC5sZWZ0X3N1YnRyZWUpIC0gaGVpZ2h0KHIpfCA8PSAyLFxuICAgICAgICAgbWF4X2tleShsKSA8IG1pbl9rZXkocilcbiAgICAgICopXG4gICAgICBsZXQgY29sbGFwc2UgbCByID0gY3JlYXRlIGwubGVmdF9zdWJ0cmVlIGwua2V5IGwuZGF0YSByXG5cbiAgICAgICgqIHByZWNvbmRpdGlvbjogfGhlaWdodChsLmxlZnRfc3VidHJlZSkgLSBoZWlnaHQoci5sZWZ0X3N1YnRyZWUpfCA8PSAyLFxuICAgICAgICAgbWF4X2tleShsKSA8IG1pbl9rZXkocilcbiAgICAgICopXG4gICAgICBsZXQgam9pbiBsIHIgPSB7IHIgd2l0aCBsZWZ0X3N1YnRyZWUgPSBjb2xsYXBzZSBsIHIubGVmdF9zdWJ0cmVlIH1cbiAgICAgIGxldCBtYXhfa2V5IHQgPSB0LmtleVxuICAgIGVuZFxuXG4gICAgKCoqIEJ1aWxkIHRyZWVzIGZyb20gc2luZ2xldG9ucyBpbiBhIGJhbGFuY2VkIHdheSBieSB1c2luZyBza2V3IGJpbmFyeSBlbmNvZGluZy5cbiAgICAgICAgRWFjaCBsZXZlbCBjb250YWlucyB0cmVlcyBvZiB0aGUgc2FtZSBoZWlnaHQsIGNvbnNlY3V0aXZlIGxldmVscyBoYXZlIGNvbnNlY3V0aXZlXG4gICAgICAgIGhlaWdodHMuIFRoZXJlIGFyZSBubyBnYXBzLiBUaGUgZmlyc3QgbGV2ZWwgYXJlIHNpbmdsZSBrZXlzLlxuICAgICopXG4gICAgdHlwZSAoJ2ssICd2KSB0ID1cbiAgICAgIHwgWmVybyBvZiB1bml0XG4gICAgICAoKiBbdW5pdF0gdG8gbWFrZSBwYXR0ZXJuIG1hdGNoaW5nIGZhc3RlciAqKVxuICAgICAgfCBPbmUgb2YgKCdrLCAndikgdCAqICgnaywgJ3YpIEZyYWdtZW50LnRcbiAgICAgIHwgVHdvIG9mICgnaywgJ3YpIHQgKiAoJ2ssICd2KSBGcmFnbWVudC50ICogKCdrLCAndikgRnJhZ21lbnQudFxuXG4gICAgbGV0IGVtcHR5ID0gWmVybyAoKVxuXG4gICAgbGV0IGFkZF91bmNoZWNrZWQgPVxuICAgICAgbGV0IHJlYyBnbyB0IHggPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBaZXJvICgpIC0+IE9uZSAodCwgeClcbiAgICAgICAgfCBPbmUgKHQsIHkpIC0+IFR3byAodCwgeSwgeClcbiAgICAgICAgfCBUd28gKHQsIHosIHkpIC0+IE9uZSAoZ28gdCAoRnJhZ21lbnQuam9pbiB6IHkpLCB4KVxuICAgICAgaW5cbiAgICAgIGZ1biB0IH5rZXkgfmRhdGEgLT4gZ28gdCAoRnJhZ21lbnQuc2luZ2xldG9uIH5rZXkgfmRhdGEpXG4gICAgOztcblxuICAgIGxldCB0b190cmVlX3VuY2hlY2tlZCA9XG4gICAgICBsZXQgcmVjIGdvIHQgciA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IFplcm8gKCkgLT4gclxuICAgICAgICB8IE9uZSAodCwgbCkgLT4gZ28gdCAoRnJhZ21lbnQuY29sbGFwc2UgbCByKVxuICAgICAgICB8IFR3byAodCwgbGwsIGwpIC0+IGdvIHQgKEZyYWdtZW50LmNvbGxhcHNlIChGcmFnbWVudC5qb2luIGxsIGwpIHIpXG4gICAgICBpblxuICAgICAgZnVuY3Rpb25cbiAgICAgIHwgWmVybyAoKSAtPiBFbXB0eVxuICAgICAgfCBPbmUgKHQsIHIpIC0+IGdvIHQgKEZyYWdtZW50LnNpbmdsZXRvbl90b190cmVlX2V4biByKVxuICAgICAgfCBUd28gKHQsIGwsIHIpIC0+IGdvIChPbmUgKHQsIGwpKSAoRnJhZ21lbnQuc2luZ2xldG9uX3RvX3RyZWVfZXhuIHIpXG4gICAgOztcblxuICAgIGxldCBtYXhfa2V5ID0gZnVuY3Rpb25cbiAgICAgIHwgWmVybyAoKSAtPiBOb25lXG4gICAgICB8IE9uZSAoXywgcikgfCBUd28gKF8sIF8sIHIpIC0+IFNvbWUgKEZyYWdtZW50Lm1heF9rZXkgcilcbiAgICA7O1xuICBlbmRcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBzZXEgfmNvbXBhcmVfa2V5ID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHsgcmV0dXJuIH0gLT5cbiAgICAgIGxldCBidWlsZGVyLCBsZW5ndGggPVxuICAgICAgICBTZXF1ZW5jZS5mb2xkXG4gICAgICAgICAgc2VxXG4gICAgICAgICAgfmluaXQ6KEJ1aWxkX2luY3JlYXNpbmcuZW1wdHksIDApXG4gICAgICAgICAgfmY6KGZ1biAoYnVpbGRlciwgbGVuZ3RoKSAoa2V5LCBkYXRhKSAtPlxuICAgICAgICAgICAgbWF0Y2ggQnVpbGRfaW5jcmVhc2luZy5tYXhfa2V5IGJ1aWxkZXIgd2l0aFxuICAgICAgICAgICAgfCBTb21lIHByZXZfa2V5IHdoZW4gY29tcGFyZV9rZXkgcHJldl9rZXkga2V5ID49IDAgLT5cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX2luY3JlYXNpbmdfc2VxdWVuY2U6IG5vbi1pbmNyZWFzaW5nIGtleVwiKVxuICAgICAgICAgICAgfCBfIC0+IEJ1aWxkX2luY3JlYXNpbmcuYWRkX3VuY2hlY2tlZCBidWlsZGVyIH5rZXkgfmRhdGEsIGxlbmd0aCArIDEpXG4gICAgICBpblxuICAgICAgT2sgKEJ1aWxkX2luY3JlYXNpbmcudG9fdHJlZV91bmNoZWNrZWQgYnVpbGRlciwgbGVuZ3RoKSlcbiAgOztcblxuICAoKiBMaWtlIFtiYWxdIGJ1dCBhbGxvd3MgYW55IGRpZmZlcmVuY2UgaW4gaGVpZ2h0IGJldHdlZW4gW2xdIGFuZCBbcl0uXG5cbiAgICAgTyh8aGVpZ2h0IGwgLSBoZWlnaHQgcnwpICopXG4gIGxldCByZWMgam9pbiBsIGsgZCByIH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggbCwgciB3aXRoXG4gICAgfCBFbXB0eSwgXyAtPiBzZXQnIHIgayBkIH5jb21wYXJlX2tleVxuICAgIHwgXywgRW1wdHkgLT4gc2V0JyBsIGsgZCB+Y29tcGFyZV9rZXlcbiAgICB8IExlYWYgKGxrLCBsZCksIF8gLT4gc2V0JyAoc2V0JyByIGsgZCB+Y29tcGFyZV9rZXkpIGxrIGxkIH5jb21wYXJlX2tleVxuICAgIHwgXywgTGVhZiAocmssIHJkKSAtPiBzZXQnIChzZXQnIGwgayBkIH5jb21wYXJlX2tleSkgcmsgcmQgfmNvbXBhcmVfa2V5XG4gICAgfCBOb2RlIChsbCwgbGssIGxkLCBsciwgbGgpLCBOb2RlIChybCwgcmssIHJkLCByciwgcmgpIC0+XG4gICAgICAoKiBbYmFsXSByZXF1aXJlcyBoZWlnaHQgZGlmZmVyZW5jZSA8PSAzLiAqKVxuICAgICAgaWYgbGggPiByaCArIDNcbiAgICAgICgqIFtoZWlnaHQgbHIgPj0gaGVpZ2h0IHJdLFxuICAgICAgICAgdGhlcmVmb3JlIFtoZWlnaHQgKGpvaW4gbHIgayBkIHIgLi4uKV0gaXMgW2hlaWdodCBybCArIDFdIG9yIFtoZWlnaHQgcmxdXG4gICAgICAgICB0aGVyZWZvcmUgdGhlIGhlaWdodCBkaWZmZXJlbmNlIHdpdGggW2xsXSB3aWxsIGJlIDw9IDMgKilcbiAgICAgIHRoZW4gYmFsIGxsIGxrIGxkIChqb2luIGxyIGsgZCByIH5jb21wYXJlX2tleSlcbiAgICAgIGVsc2UgaWYgcmggPiBsaCArIDNcbiAgICAgIHRoZW4gYmFsIChqb2luIGwgayBkIHJsIH5jb21wYXJlX2tleSkgcmsgcmQgcnJcbiAgICAgIGVsc2UgYmFsIGwgayBkIHJcbiAgOztcblxuICBsZXQgcmVjIHNwbGl0IHQgeCB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gRW1wdHksIE5vbmUsIEVtcHR5XG4gICAgfCBMZWFmIChrLCBkKSAtPlxuICAgICAgbGV0IGNtcCA9IGNvbXBhcmVfa2V5IHggayBpblxuICAgICAgaWYgY21wID0gMFxuICAgICAgdGhlbiBFbXB0eSwgU29tZSAoaywgZCksIEVtcHR5XG4gICAgICBlbHNlIGlmIGNtcCA8IDBcbiAgICAgIHRoZW4gRW1wdHksIE5vbmUsIHRcbiAgICAgIGVsc2UgdCwgTm9uZSwgRW1wdHlcbiAgICB8IE5vZGUgKGwsIGssIGQsIHIsIF8pIC0+XG4gICAgICBsZXQgY21wID0gY29tcGFyZV9rZXkgeCBrIGluXG4gICAgICBpZiBjbXAgPSAwXG4gICAgICB0aGVuIGwsIFNvbWUgKGssIGQpLCByXG4gICAgICBlbHNlIGlmIGNtcCA8IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBsZXQgbGwsIG1heWJlLCBsciA9IHNwbGl0IGwgeCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgbGwsIG1heWJlLCBqb2luIGxyIGsgZCByIH5jb21wYXJlX2tleSlcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgcmwsIG1heWJlLCByciA9IHNwbGl0IHIgeCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgam9pbiBsIGsgZCBybCB+Y29tcGFyZV9rZXksIG1heWJlLCBycilcbiAgOztcblxuICBsZXQgc3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IHQgfmludG8geCB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBsZWZ0LCBib3VuZGFyeV9vcHQsIHJpZ2h0ID0gc3BsaXQgdCB4IH5jb21wYXJlX2tleSBpblxuICAgIG1hdGNoIGJvdW5kYXJ5X29wdCB3aXRoXG4gICAgfCBOb25lIC0+IGxlZnQsIHJpZ2h0XG4gICAgfCBTb21lIChrZXksIGRhdGEpIC0+XG4gICAgICBsZXQgaW5zZXJ0X2ludG8gdHJlZSA9IGZzdCAoc2V0IHRyZWUgfmtleSB+ZGF0YSB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5KSBpblxuICAgICAgKG1hdGNoIGludG8gd2l0aFxuICAgICAgIHwgYExlZnQgLT4gaW5zZXJ0X2ludG8gbGVmdCwgcmlnaHRcbiAgICAgICB8IGBSaWdodCAtPiBsZWZ0LCBpbnNlcnRfaW50byByaWdodClcbiAgOztcblxuICBsZXQgc3BsaXRfcmFuZ2VcbiAgICAgICAgdFxuICAgICAgICB+KGxvd2VyX2JvdW5kIDogJ2EgTWF5YmVfYm91bmQudClcbiAgICAgICAgfih1cHBlcl9ib3VuZCA6ICdhIE1heWJlX2JvdW5kLnQpXG4gICAgICAgIH5jb21wYXJlX2tleVxuICAgID1cbiAgICBpZiBNYXliZV9ib3VuZC5ib3VuZHNfY3Jvc3NlZFxuICAgICAgICAgfmNvbXBhcmU6Y29tcGFyZV9rZXlcbiAgICAgICAgIH5sb3dlcjpsb3dlcl9ib3VuZFxuICAgICAgICAgfnVwcGVyOnVwcGVyX2JvdW5kXG4gICAgdGhlbiBlbXB0eSwgZW1wdHksIGVtcHR5XG4gICAgZWxzZSAoXG4gICAgICBsZXQgbGVmdCwgbWlkX2FuZF9yaWdodCA9XG4gICAgICAgIG1hdGNoIGxvd2VyX2JvdW5kIHdpdGhcbiAgICAgICAgfCBVbmJvdW5kZWQgLT4gZW1wdHksIHRcbiAgICAgICAgfCBJbmNsIGxiIC0+IHNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSB+aW50bzpgUmlnaHQgdCBsYiB+Y29tcGFyZV9rZXlcbiAgICAgICAgfCBFeGNsIGxiIC0+IHNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSB+aW50bzpgTGVmdCB0IGxiIH5jb21wYXJlX2tleVxuICAgICAgaW5cbiAgICAgIGxldCBtaWQsIHJpZ2h0ID1cbiAgICAgICAgbWF0Y2ggdXBwZXJfYm91bmQgd2l0aFxuICAgICAgICB8IFVuYm91bmRlZCAtPiBtaWRfYW5kX3JpZ2h0LCBlbXB0eVxuICAgICAgICB8IEluY2wgbGIgLT4gc3BsaXRfYW5kX3JlaW5zZXJ0X2JvdW5kYXJ5IH5pbnRvOmBMZWZ0IG1pZF9hbmRfcmlnaHQgbGIgfmNvbXBhcmVfa2V5XG4gICAgICAgIHwgRXhjbCBsYiAtPlxuICAgICAgICAgIHNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSB+aW50bzpgUmlnaHQgbWlkX2FuZF9yaWdodCBsYiB+Y29tcGFyZV9rZXlcbiAgICAgIGluXG4gICAgICBsZWZ0LCBtaWQsIHJpZ2h0KVxuICA7O1xuXG4gIGxldCByZWMgZmluZCB0IHggfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKHYsIGQpIC0+IGlmIGNvbXBhcmVfa2V5IHggdiA9IDAgdGhlbiBTb21lIGQgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB4IHYgaW5cbiAgICAgIGlmIGMgPSAwIHRoZW4gU29tZSBkIGVsc2UgZmluZCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcikgeCB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBsZXQgYWRkX211bHRpIHQgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGRhdGEgPSBkYXRhIDo6IE9wdGlvbi52YWx1ZSAoZmluZCB0IGtleSB+Y29tcGFyZV9rZXkpIH5kZWZhdWx0OltdIGluXG4gICAgc2V0IH5sZW5ndGggfmtleSB+ZGF0YSB0IH5jb21wYXJlX2tleVxuICA7O1xuXG4gIGxldCBmaW5kX211bHRpIHQgeCB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIGZpbmQgdCB4IH5jb21wYXJlX2tleSB3aXRoXG4gICAgfCBOb25lIC0+IFtdXG4gICAgfCBTb21lIGwgLT4gbFxuICA7O1xuXG4gIGxldCBmaW5kX2V4biA9XG4gICAgbGV0IGlmX25vdF9mb3VuZCBrZXkgfnNleHBfb2Zfa2V5ID1cbiAgICAgIHJhaXNlIChOb3RfZm91bmRfcyAoTGlzdCBbIEF0b20gXCJNYXAuZmluZF9leG46IG5vdCBmb3VuZFwiOyBzZXhwX29mX2tleSBrZXkgXSkpXG4gICAgaW5cbiAgICBsZXQgcmVjIGZpbmRfZXhuIHQgeCB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBpZl9ub3RfZm91bmQgeCB+c2V4cF9vZl9rZXlcbiAgICAgIHwgTGVhZiAodiwgZCkgLT4gaWYgY29tcGFyZV9rZXkgeCB2ID0gMCB0aGVuIGQgZWxzZSBpZl9ub3RfZm91bmQgeCB+c2V4cF9vZl9rZXlcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiBkIGVsc2UgZmluZF9leG4gKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpIHggfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleVxuICAgIGluXG4gICAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICAgIGZpbmRfZXhuXG4gIDs7XG5cbiAgbGV0IG1lbSB0IHggfmNvbXBhcmVfa2V5ID0gT3B0aW9uLmlzX3NvbWUgKGZpbmQgdCB4IH5jb21wYXJlX2tleSlcblxuICBsZXQgcmVjIG1pbl9lbHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaywgZCkgLT4gU29tZSAoaywgZClcbiAgICB8IE5vZGUgKEVtcHR5LCBrLCBkLCBfLCBfKSAtPiBTb21lIChrLCBkKVxuICAgIHwgTm9kZSAobCwgXywgXywgXywgXykgLT4gbWluX2VsdCBsXG4gIDs7XG5cbiAgZXhjZXB0aW9uIE1hcF9taW5fZWx0X2V4bl9vZl9lbXB0eV9tYXAgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbiAgbGV0ICgpID1cbiAgICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGRcbiAgICAgIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE1hcF9taW5fZWx0X2V4bl9vZl9lbXB0eV9tYXBdXG4gICAgICAoZnVuY3Rpb25cbiAgICAgICAgfCBNYXBfbWluX2VsdF9leG5fb2ZfZW1wdHlfbWFwIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5BdG9tIFwibWFwLm1sLlRyZWUwLk1hcF9taW5fZWx0X2V4bl9vZl9lbXB0eV9tYXBcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgZXhjZXB0aW9uIE1hcF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9tYXAgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbiAgbGV0ICgpID1cbiAgICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGRcbiAgICAgIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE1hcF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9tYXBdXG4gICAgICAoZnVuY3Rpb25cbiAgICAgICAgfCBNYXBfbWF4X2VsdF9leG5fb2ZfZW1wdHlfbWFwIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5BdG9tIFwibWFwLm1sLlRyZWUwLk1hcF9tYXhfZWx0X2V4bl9vZl9lbXB0eV9tYXBcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IG1pbl9lbHRfZXhuIHQgPVxuICAgIG1hdGNoIG1pbl9lbHQgdCB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIE1hcF9taW5fZWx0X2V4bl9vZl9lbXB0eV9tYXBcbiAgICB8IFNvbWUgdiAtPiB2XG4gIDs7XG5cbiAgbGV0IHJlYyBtYXhfZWx0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGssIGQpIC0+IFNvbWUgKGssIGQpXG4gICAgfCBOb2RlIChfLCBrLCBkLCBFbXB0eSwgXykgLT4gU29tZSAoaywgZClcbiAgICB8IE5vZGUgKF8sIF8sIF8sIHIsIF8pIC0+IG1heF9lbHQgclxuICA7O1xuXG4gIGxldCBtYXhfZWx0X2V4biB0ID1cbiAgICBtYXRjaCBtYXhfZWx0IHQgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBNYXBfbWF4X2VsdF9leG5fb2ZfZW1wdHlfbWFwXG4gICAgfCBTb21lIHYgLT4gdlxuICA7O1xuXG4gIGxldCByZWMgcmVtb3ZlX21pbl9lbHQgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5yZW1vdmVfbWluX2VsdFwiXG4gICAgfCBMZWFmIF8gLT4gRW1wdHlcbiAgICB8IE5vZGUgKEVtcHR5LCBfLCBfLCByLCBfKSAtPiByXG4gICAgfCBOb2RlIChsLCB4LCBkLCByLCBfKSAtPiBiYWwgKHJlbW92ZV9taW5fZWx0IGwpIHggZCByXG4gIDs7XG5cbiAgbGV0IGFwcGVuZCB+bG93ZXJfcGFydCB+dXBwZXJfcGFydCB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIG1heF9lbHQgbG93ZXJfcGFydCwgbWluX2VsdCB1cHBlcl9wYXJ0IHdpdGhcbiAgICB8IE5vbmUsIF8gLT4gYE9rIHVwcGVyX3BhcnRcbiAgICB8IF8sIE5vbmUgLT4gYE9rIGxvd2VyX3BhcnRcbiAgICB8IFNvbWUgKG1heF9sb3dlciwgXyksIFNvbWUgKG1pbl91cHBlciwgdikgd2hlbiBjb21wYXJlX2tleSBtYXhfbG93ZXIgbWluX3VwcGVyIDwgMCAtPlxuICAgICAgbGV0IHVwcGVyX3BhcnRfd2l0aG91dF9taW4gPSByZW1vdmVfbWluX2VsdCB1cHBlcl9wYXJ0IGluXG4gICAgICBgT2sgKGpvaW4gfmNvbXBhcmVfa2V5IGxvd2VyX3BhcnQgbWluX3VwcGVyIHYgdXBwZXJfcGFydF93aXRob3V0X21pbilcbiAgICB8IF8gLT4gYE92ZXJsYXBwaW5nX2tleV9yYW5nZXNcbiAgOztcblxuICBsZXQgZm9sZF9yYW5nZV9pbmNsdXNpdmUgPVxuICAgICgqIFRoaXMgYXNzdW1lcyB0aGF0IG1pbiA8PSBtYXgsIHdoaWNoIGlzIGNoZWNrZWQgYnkgdGhlIG91dGVyIGZ1bmN0aW9uLiAqKVxuICAgIGxldCByZWMgZ28gdCB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBpbml0XG4gICAgICB8IExlYWYgKGssIGQpIC0+XG4gICAgICAgIGlmIGNvbXBhcmVfa2V5IGsgbWluIDwgMCB8fCBjb21wYXJlX2tleSBrIG1heCA+IDBcbiAgICAgICAgdGhlbiAoKiBrIDwgbWluIHx8IGsgPiBtYXggKilcbiAgICAgICAgICBpbml0XG4gICAgICAgIGVsc2UgZiB+a2V5OmsgfmRhdGE6ZCBpbml0XG4gICAgICB8IE5vZGUgKGwsIGssIGQsIHIsIF8pIC0+XG4gICAgICAgIGxldCBjX21pbiA9IGNvbXBhcmVfa2V5IGsgbWluIGluXG4gICAgICAgIGlmIGNfbWluIDwgMFxuICAgICAgICB0aGVuXG4gICAgICAgICAgKCogaWYgayA8IG1pbiwgdGhlbiB0aGlzIG5vZGUgYW5kIGl0cyBsZWZ0IGJyYW5jaCBhcmUgb3V0c2lkZSBvdXIgcmFuZ2UgKilcbiAgICAgICAgICBnbyByIH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXlcbiAgICAgICAgZWxzZSBpZiBjX21pbiA9IDBcbiAgICAgICAgdGhlblxuICAgICAgICAgICgqIGlmIGsgPSBtaW4sIHRoZW4gdGhpcyBub2RlJ3MgbGVmdCBicmFuY2ggaXMgb3V0c2lkZSBvdXIgcmFuZ2UgKilcbiAgICAgICAgICBnbyByIH5taW4gfm1heCB+aW5pdDooZiB+a2V5OmsgfmRhdGE6ZCBpbml0KSB+ZiB+Y29tcGFyZV9rZXlcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgKCogayA+IG1pbiAqKVxuICAgICAgICAgIGxldCB6ID0gZ28gbCB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5IGluXG4gICAgICAgICAgbGV0IGNfbWF4ID0gY29tcGFyZV9rZXkgayBtYXggaW5cbiAgICAgICAgICAoKiBpZiBrID4gbWF4LCB3ZSdyZSBkb25lICopXG4gICAgICAgICAgaWYgY19tYXggPiAwXG4gICAgICAgICAgdGhlbiB6XG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgeiA9IGYgfmtleTprIH5kYXRhOmQgeiBpblxuICAgICAgICAgICAgKCogaWYgayA9IG1heCwgdGhlbiB3ZSBmb2xkIGluIHRoaXMgb25lIGxhc3QgdmFsdWUgYW5kIHdlJ3JlIGRvbmUgKilcbiAgICAgICAgICAgIGlmIGNfbWF4ID0gMCB0aGVuIHogZWxzZSBnbyByIH5taW4gfm1heCB+aW5pdDp6IH5mIH5jb21wYXJlX2tleSkpXG4gICAgaW5cbiAgICBmdW4gdCB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5IC0+XG4gICAgICBpZiBjb21wYXJlX2tleSBtaW4gbWF4IDw9IDAgdGhlbiBnbyB0IH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgZWxzZSBpbml0XG4gIDs7XG5cbiAgbGV0IHJhbmdlX3RvX2FsaXN0IHQgfm1pbiB+bWF4IH5jb21wYXJlX2tleSA9XG4gICAgTGlzdC5yZXZcbiAgICAgIChmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgICAgICAgdFxuICAgICAgICAgfm1pblxuICAgICAgICAgfm1heFxuICAgICAgICAgfmluaXQ6W11cbiAgICAgICAgIH5mOihmdW4gfmtleSB+ZGF0YSBsIC0+IChrZXksIGRhdGEpIDo6IGwpXG4gICAgICAgICB+Y29tcGFyZV9rZXkpXG4gIDs7XG5cbiAgbGV0IGNvbmNhdF91bmNoZWNrZWQgdDEgdDIgPVxuICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgfCBFbXB0eSwgdCAtPiB0XG4gICAgfCB0LCBFbXB0eSAtPiB0XG4gICAgfCBfLCBfIC0+XG4gICAgICBsZXQgeCwgZCA9IG1pbl9lbHRfZXhuIHQyIGluXG4gICAgICBiYWwgdDEgeCBkIChyZW1vdmVfbWluX2VsdCB0MilcbiAgOztcblxuICBleGNlcHRpb24gUmVtb3ZlX25vX29wXG5cbiAgbGV0IHJlbW92ZSB0IHggfmxlbmd0aCB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCByZWMgcmVtb3ZlX2xvb3AgdCB4IH5sZW5ndGggfmNvbXBhcmVfa2V5ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBFeG4ucmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgUmVtb3ZlX25vX29wXG4gICAgICB8IExlYWYgKHYsIF8pIC0+XG4gICAgICAgIGlmIGNvbXBhcmVfa2V5IHggdiA9IDBcbiAgICAgICAgdGhlbiBFbXB0eSwgbGVuZ3RoIC0gMVxuICAgICAgICBlbHNlIEV4bi5yYWlzZV93aXRob3V0X2JhY2t0cmFjZSBSZW1vdmVfbm9fb3BcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiBjb25jYXRfdW5jaGVja2VkIGwgciwgbGVuZ3RoIC0gMVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsLCBsZW5ndGggPSByZW1vdmVfbG9vcCBsIHggfmxlbmd0aCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgciwgbGVuZ3RoID0gcmVtb3ZlX2xvb3AgciB4IH5sZW5ndGggfmNvbXBhcmVfa2V5IGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICBpblxuICAgIHRyeSByZW1vdmVfbG9vcCB0IHggfmxlbmd0aCB+Y29tcGFyZV9rZXkgd2l0aFxuICAgIHwgUmVtb3ZlX25vX29wIC0+IHQsIGxlbmd0aFxuICA7O1xuXG4gICgqIFVzZSBleGNlcHRpb24gdG8gYXZvaWQgdHJlZS1yZWJ1aWxkIGluIG5vLW9wIGNhc2UgKilcbiAgZXhjZXB0aW9uIENoYW5nZV9ub19vcFxuXG4gIGxldCBjaGFuZ2UgdCBrZXkgfmYgfmxlbmd0aCB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCByZWMgY2hhbmdlX2NvcmUgdCBrZXkgZiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgKG1hdGNoIGYgTm9uZSB3aXRoXG4gICAgICAgICB8IE5vbmUgLT4gcmFpc2UgQ2hhbmdlX25vX29wICgqIGVxdWl2YWxlbnQgdG8gcmV0dXJuaW5nOiBFbXB0eSAqKVxuICAgICAgICAgfCBTb21lIGRhdGEgLT4gTGVhZiAoa2V5LCBkYXRhKSwgbGVuZ3RoICsgMSlcbiAgICAgIHwgTGVhZiAodiwgZCkgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrZXkgdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBtYXRjaCBmIChTb21lIGQpIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gRW1wdHksIGxlbmd0aCAtIDFcbiAgICAgICAgICB8IFNvbWUgZCcgLT4gTGVhZiAodiwgZCcpLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGwsIGxlbmd0aCA9IGNoYW5nZV9jb3JlIEVtcHR5IGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIEVtcHR5LCBsZW5ndGgpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCByLCBsZW5ndGggPSBjaGFuZ2VfY29yZSBFbXB0eSBrZXkgZiBpblxuICAgICAgICAgIGJhbCBFbXB0eSB2IGQgciwgbGVuZ3RoKVxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBoKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGtleSB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIG1hdGNoIGYgKFNvbWUgZCkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBjb25jYXRfdW5jaGVja2VkIGwgciwgbGVuZ3RoIC0gMVxuICAgICAgICAgIHwgU29tZSBkYXRhIC0+IE5vZGUgKGwsIGtleSwgZGF0YSwgciwgaCksIGxlbmd0aClcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbCwgbGVuZ3RoID0gY2hhbmdlX2NvcmUgbCBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCByLCBsZW5ndGggPSBjaGFuZ2VfY29yZSByIGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICBpblxuICAgIHRyeSBjaGFuZ2VfY29yZSB0IGtleSBmIHdpdGhcbiAgICB8IENoYW5nZV9ub19vcCAtPiB0LCBsZW5ndGhcbiAgOztcblxuICBsZXQgdXBkYXRlIHQga2V5IH5mIH5sZW5ndGggfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgcmVjIHVwZGF0ZV9jb3JlIHQga2V5IGYgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgIGxldCBkYXRhID0gZiBOb25lIGluXG4gICAgICAgIExlYWYgKGtleSwgZGF0YSksIGxlbmd0aCArIDFcbiAgICAgIHwgTGVhZiAodiwgZCkgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrZXkgdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgZCcgPSBmIChTb21lIGQpIGluXG4gICAgICAgICAgTGVhZiAodiwgZCcpLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGwsIGxlbmd0aCA9IHVwZGF0ZV9jb3JlIEVtcHR5IGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIEVtcHR5LCBsZW5ndGgpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCByLCBsZW5ndGggPSB1cGRhdGVfY29yZSBFbXB0eSBrZXkgZiBpblxuICAgICAgICAgIGJhbCBFbXB0eSB2IGQgciwgbGVuZ3RoKVxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBoKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGtleSB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBkYXRhID0gZiAoU29tZSBkKSBpblxuICAgICAgICAgIE5vZGUgKGwsIGtleSwgZGF0YSwgciwgaCksIGxlbmd0aClcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbCwgbGVuZ3RoID0gdXBkYXRlX2NvcmUgbCBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgIGxldCByLCBsZW5ndGggPSB1cGRhdGVfY29yZSByIGtleSBmIGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICBpblxuICAgIHVwZGF0ZV9jb3JlIHQga2V5IGZcbiAgOztcblxuICBsZXQgcmVtb3ZlX211bHRpIHQga2V5IH5sZW5ndGggfmNvbXBhcmVfa2V5ID1cbiAgICBjaGFuZ2UgdCBrZXkgfmxlbmd0aCB+Y29tcGFyZV9rZXkgfmY6KGZ1bmN0aW9uXG4gICAgICB8IE5vbmUgfCBTb21lIChbXSB8IFsgXyBdKSAtPiBOb25lXG4gICAgICB8IFNvbWUgKF8gOjogKF8gOjogXyBhcyBub25fZW1wdHlfdGFpbCkpIC0+IFNvbWUgbm9uX2VtcHR5X3RhaWwpXG4gIDs7XG5cbiAgbGV0IHJlYyBpdGVyX2tleXMgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgTGVhZiAodiwgXykgLT4gZiB2XG4gICAgfCBOb2RlIChsLCB2LCBfLCByLCBfKSAtPlxuICAgICAgaXRlcl9rZXlzIH5mIGw7XG4gICAgICBmIHY7XG4gICAgICBpdGVyX2tleXMgfmYgclxuICA7O1xuXG4gIGxldCByZWMgaXRlciB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBMZWFmIChfLCBkKSAtPiBmIGRcbiAgICB8IE5vZGUgKGwsIF8sIGQsIHIsIF8pIC0+XG4gICAgICBpdGVyIH5mIGw7XG4gICAgICBmIGQ7XG4gICAgICBpdGVyIH5mIHJcbiAgOztcblxuICBsZXQgcmVjIGl0ZXJpIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IExlYWYgKHYsIGQpIC0+IGYgfmtleTp2IH5kYXRhOmRcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICBpdGVyaSB+ZiBsO1xuICAgICAgZiB+a2V5OnYgfmRhdGE6ZDtcbiAgICAgIGl0ZXJpIH5mIHJcbiAgOztcblxuICBsZXQgaXRlcmlfdW50aWwgPVxuICAgIGxldCByZWMgaXRlcmlfdW50aWxfbG9vcCB0IH5mIDogQ29udGludWVfb3Jfc3RvcC50ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBDb250aW51ZVxuICAgICAgfCBMZWFmICh2LCBkKSAtPiBmIH5rZXk6diB+ZGF0YTpkXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICAgIChtYXRjaCBpdGVyaV91bnRpbF9sb29wIH5mIGwgd2l0aFxuICAgICAgICAgfCBTdG9wIC0+IFN0b3BcbiAgICAgICAgIHwgQ29udGludWUgLT5cbiAgICAgICAgICAgKG1hdGNoIGYgfmtleTp2IH5kYXRhOmQgd2l0aFxuICAgICAgICAgICAgfCBTdG9wIC0+IFN0b3BcbiAgICAgICAgICAgIHwgQ29udGludWUgLT4gaXRlcmlfdW50aWxfbG9vcCB+ZiByKSlcbiAgICBpblxuICAgIGZ1biB0IH5mIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQub2ZfY29udGludWVfb3Jfc3RvcCAoaXRlcmlfdW50aWxfbG9vcCB0IH5mKVxuICA7O1xuXG4gIGxldCByZWMgbWFwIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICB8IExlYWYgKHYsIGQpIC0+IExlYWYgKHYsIGYgZClcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIGgpIC0+XG4gICAgICBsZXQgbCcgPSBtYXAgfmYgbCBpblxuICAgICAgbGV0IGQnID0gZiBkIGluXG4gICAgICBsZXQgcicgPSBtYXAgfmYgciBpblxuICAgICAgTm9kZSAobCcsIHYsIGQnLCByJywgaClcbiAgOztcblxuICBsZXQgcmVjIG1hcGkgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgIHwgTGVhZiAodiwgZCkgLT4gTGVhZiAodiwgZiB+a2V5OnYgfmRhdGE6ZClcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIGgpIC0+XG4gICAgICBsZXQgbCcgPSBtYXBpIH5mIGwgaW5cbiAgICAgIGxldCBkJyA9IGYgfmtleTp2IH5kYXRhOmQgaW5cbiAgICAgIGxldCByJyA9IG1hcGkgfmYgciBpblxuICAgICAgTm9kZSAobCcsIHYsIGQnLCByJywgaClcbiAgOztcblxuICBsZXQgcmVjIGZvbGQgdCB+aW5pdDphY2N1IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICB8IExlYWYgKHYsIGQpIC0+IGYgfmtleTp2IH5kYXRhOmQgYWNjdVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT4gZm9sZCB+ZiByIH5pbml0OihmIH5rZXk6diB+ZGF0YTpkIChmb2xkIH5mIGwgfmluaXQ6YWNjdSkpXG4gIDs7XG5cbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoID1cbiAgICBsZXQgcmVjIGZvbGRfdW50aWxfbG9vcCB0IH5hY2MgfmYgOiAoXywgXykgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gQ29udGludWUgYWNjXG4gICAgICB8IExlYWYgKHYsIGQpIC0+IGYgfmtleTp2IH5kYXRhOmQgYWNjXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICAgIChtYXRjaCBmb2xkX3VudGlsX2xvb3AgbCB+YWNjIH5mIHdpdGhcbiAgICAgICAgIHwgU3RvcCBmaW5hbCAtPiBTdG9wIGZpbmFsXG4gICAgICAgICB8IENvbnRpbnVlIGFjYyAtPlxuICAgICAgICAgICAobWF0Y2ggZiB+a2V5OnYgfmRhdGE6ZCBhY2Mgd2l0aFxuICAgICAgICAgICAgfCBTdG9wIGZpbmFsIC0+IFN0b3AgZmluYWxcbiAgICAgICAgICAgIHwgQ29udGludWUgYWNjIC0+IGZvbGRfdW50aWxfbG9vcCByIH5hY2MgfmYpKVxuICAgIGluXG4gICAgbWF0Y2ggZm9sZF91bnRpbF9sb29wIHQgfmFjYzppbml0IH5mIHdpdGhcbiAgICB8IENvbnRpbnVlIGFjYyAtPiBmaW5pc2ggYWNjXG4gICAgfCBTdG9wIHN0b3AgLT4gc3RvcFxuICA7O1xuXG4gIGxldCByZWMgZm9sZF9yaWdodCB0IH5pbml0OmFjY3UgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgIHwgTGVhZiAodiwgZCkgLT4gZiB+a2V5OnYgfmRhdGE6ZCBhY2N1XG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgZm9sZF9yaWdodCB+ZiBsIH5pbml0OihmIH5rZXk6diB+ZGF0YTpkIChmb2xkX3JpZ2h0IH5mIHIgfmluaXQ6YWNjdSkpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9rZXlzIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkIH5pbml0OihFbXB0eSwgMCkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgKGFjY3UsIGxlbmd0aCkgLT5cbiAgICAgIGlmIGYga2V5IHRoZW4gc2V0IH5sZW5ndGggfmtleSB+ZGF0YSBhY2N1IH5jb21wYXJlX2tleSBlbHNlIGFjY3UsIGxlbmd0aClcbiAgOztcblxuXG4gIGxldCBmaWx0ZXIgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGQgfmluaXQ6KEVtcHR5LCAwKSB0IH5mOihmdW4gfmtleSB+ZGF0YSAoYWNjdSwgbGVuZ3RoKSAtPlxuICAgICAgaWYgZiBkYXRhIHRoZW4gc2V0IH5sZW5ndGggfmtleSB+ZGF0YSBhY2N1IH5jb21wYXJlX2tleSBlbHNlIGFjY3UsIGxlbmd0aClcbiAgOztcblxuICBsZXQgZmlsdGVyaSB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZCB+aW5pdDooRW1wdHksIDApIHQgfmY6KGZ1biB+a2V5IH5kYXRhIChhY2N1LCBsZW5ndGgpIC0+XG4gICAgICBpZiBmIH5rZXkgfmRhdGEgdGhlbiBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIGFjY3UgfmNvbXBhcmVfa2V5IGVsc2UgYWNjdSwgbGVuZ3RoKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkIH5pbml0OihFbXB0eSwgMCkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgKGFjY3UsIGxlbmd0aCkgLT5cbiAgICAgIG1hdGNoIGYgZGF0YSB3aXRoXG4gICAgICB8IE5vbmUgLT4gYWNjdSwgbGVuZ3RoXG4gICAgICB8IFNvbWUgYiAtPiBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhOmIgYWNjdSB+Y29tcGFyZV9rZXkpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXBpIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkIH5pbml0OihFbXB0eSwgMCkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgKGFjY3UsIGxlbmd0aCkgLT5cbiAgICAgIG1hdGNoIGYgfmtleSB+ZGF0YSB3aXRoXG4gICAgICB8IE5vbmUgLT4gYWNjdSwgbGVuZ3RoXG4gICAgICB8IFNvbWUgYiAtPiBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhOmIgYWNjdSB+Y29tcGFyZV9rZXkpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl9tYXBpIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkXG4gICAgICB0XG4gICAgICB+aW5pdDooKEVtcHR5LCAwKSwgKEVtcHR5LCAwKSlcbiAgICAgIH5mOihmdW4gfmtleSB+ZGF0YSAocGFpcjEsIHBhaXIyKSAtPlxuICAgICAgICBtYXRjaCAoZiB+a2V5IH5kYXRhIDogXyBFaXRoZXIudCkgd2l0aFxuICAgICAgICB8IEZpcnN0IHggLT5cbiAgICAgICAgICBsZXQgdCwgbGVuZ3RoID0gcGFpcjEgaW5cbiAgICAgICAgICBzZXQgdCB+a2V5IH5kYXRhOnggfmNvbXBhcmVfa2V5IH5sZW5ndGgsIHBhaXIyXG4gICAgICAgIHwgU2Vjb25kIHkgLT5cbiAgICAgICAgICBsZXQgdCwgbGVuZ3RoID0gcGFpcjIgaW5cbiAgICAgICAgICBwYWlyMSwgc2V0IHQgfmtleSB+ZGF0YTp5IH5jb21wYXJlX2tleSB+bGVuZ3RoKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fbWFwIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBwYXJ0aXRpb25fbWFwaSB0IH5jb21wYXJlX2tleSB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbmlfdGYgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIHBhcnRpdGlvbl9tYXBpIHQgfmNvbXBhcmVfa2V5IH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgICAgaWYgZiB+a2V5IH5kYXRhIHRoZW4gRmlyc3QgZGF0YSBlbHNlIFNlY29uZCBkYXRhKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fdGYgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIHBhcnRpdGlvbl9tYXBpIHQgfmNvbXBhcmVfa2V5IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+XG4gICAgICBpZiBmIGRhdGEgdGhlbiBGaXJzdCBkYXRhIGVsc2UgU2Vjb25kIGRhdGEpXG4gIDs7XG5cbiAgbW9kdWxlIEVudW0gPSBzdHJ1Y3RcbiAgICB0eXBlIGluY3JlYXNpbmdcbiAgICB0eXBlIGRlY3JlYXNpbmdcblxuICAgIHR5cGUgKCdrLCAndiwgJ2RpcmVjdGlvbikgdCA9XG4gICAgICB8IEVuZFxuICAgICAgfCBNb3JlIG9mICdrICogJ3YgKiAoJ2ssICd2KSB0cmVlICogKCdrLCAndiwgJ2RpcmVjdGlvbikgdFxuXG4gICAgbGV0IHJlYyBjb25zIHQgKGUgOiAoXywgXywgaW5jcmVhc2luZykgdCkgOiAoXywgXywgaW5jcmVhc2luZykgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgfCBMZWFmICh2LCBkKSAtPiBNb3JlICh2LCBkLCBFbXB0eSwgZSlcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT4gY29ucyBsIChNb3JlICh2LCBkLCByLCBlKSlcbiAgICA7O1xuXG4gICAgbGV0IHJlYyBjb25zX3JpZ2h0IHQgKGUgOiAoXywgXywgZGVjcmVhc2luZykgdCkgOiAoXywgXywgZGVjcmVhc2luZykgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgfCBMZWFmICh2LCBkKSAtPiBNb3JlICh2LCBkLCBFbXB0eSwgZSlcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT4gY29uc19yaWdodCByIChNb3JlICh2LCBkLCBsLCBlKSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX3RyZWUgdHJlZSA6IChfLCBfLCBpbmNyZWFzaW5nKSB0ID0gY29ucyB0cmVlIEVuZFxuICAgIGxldCBvZl90cmVlX3JpZ2h0IHRyZWUgOiAoXywgXywgZGVjcmVhc2luZykgdCA9IGNvbnNfcmlnaHQgdHJlZSBFbmRcblxuICAgIGxldCBzdGFydGluZ19hdF9pbmNyZWFzaW5nIHQga2V5IGNvbXBhcmUgOiAoXywgXywgaW5jcmVhc2luZykgdCA9XG4gICAgICBsZXQgcmVjIGxvb3AgdCBlID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgICB8IExlYWYgKHYsIGQpIC0+IGxvb3AgKE5vZGUgKEVtcHR5LCB2LCBkLCBFbXB0eSwgMSkpIGVcbiAgICAgICAgfCBOb2RlIChfLCB2LCBfLCByLCBfKSB3aGVuIGNvbXBhcmUgdiBrZXkgPCAwIC0+IGxvb3AgciBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT4gbG9vcCBsIChNb3JlICh2LCBkLCByLCBlKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQgRW5kXG4gICAgOztcblxuICAgIGxldCBzdGFydGluZ19hdF9kZWNyZWFzaW5nIHQga2V5IGNvbXBhcmUgOiAoXywgXywgZGVjcmVhc2luZykgdCA9XG4gICAgICBsZXQgcmVjIGxvb3AgdCBlID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgICB8IExlYWYgKHYsIGQpIC0+IGxvb3AgKE5vZGUgKEVtcHR5LCB2LCBkLCBFbXB0eSwgMSkpIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCBfLCBfLCBfKSB3aGVuIGNvbXBhcmUgdiBrZXkgPiAwIC0+IGxvb3AgbCBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT4gbG9vcCByIChNb3JlICh2LCBkLCBsLCBlKSlcbiAgICAgIGluXG4gICAgICBsb29wIHQgRW5kXG4gICAgOztcblxuICAgIGxldCBjb21wYXJlIGNvbXBhcmVfa2V5IGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgICBsZXQgcmVjIGxvb3AgdDEgdDIgPVxuICAgICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IDBcbiAgICAgICAgfCBFbmQsIF8gLT4gLTFcbiAgICAgICAgfCBfLCBFbmQgLT4gMVxuICAgICAgICB8IE1vcmUgKHYxLCBkMSwgcjEsIGUxKSwgTW9yZSAodjIsIGQyLCByMiwgZTIpIC0+XG4gICAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSB2MSB2MiBpblxuICAgICAgICAgIGlmIGMgPD4gMFxuICAgICAgICAgIHRoZW4gY1xuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IGMgPSBjb21wYXJlX2RhdGEgZDEgZDIgaW5cbiAgICAgICAgICAgIGlmIGMgPD4gMFxuICAgICAgICAgICAgdGhlbiBjXG4gICAgICAgICAgICBlbHNlIGlmIHBoeXNfZXF1YWwgcjEgcjJcbiAgICAgICAgICAgIHRoZW4gbG9vcCBlMSBlMlxuICAgICAgICAgICAgZWxzZSBsb29wIChjb25zIHIxIGUxKSAoY29ucyByMiBlMikpXG4gICAgICBpblxuICAgICAgbG9vcCB0MSB0MlxuICAgIDs7XG5cbiAgICBsZXQgZXF1YWwgY29tcGFyZV9rZXkgZGF0YV9lcXVhbCB0MSB0MiA9XG4gICAgICBsZXQgcmVjIGxvb3AgdDEgdDIgPVxuICAgICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IHRydWVcbiAgICAgICAgfCBFbmQsIF8gfCBfLCBFbmQgLT4gZmFsc2VcbiAgICAgICAgfCBNb3JlICh2MSwgZDEsIHIxLCBlMSksIE1vcmUgKHYyLCBkMiwgcjIsIGUyKSAtPlxuICAgICAgICAgIGNvbXBhcmVfa2V5IHYxIHYyID0gMFxuICAgICAgICAgICYmIGRhdGFfZXF1YWwgZDEgZDJcbiAgICAgICAgICAmJiBpZiBwaHlzX2VxdWFsIHIxIHIyIHRoZW4gbG9vcCBlMSBlMiBlbHNlIGxvb3AgKGNvbnMgcjEgZTEpIChjb25zIHIyIGUyKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdDEgdDJcbiAgICA7O1xuXG4gICAgbGV0IHJlYyBmb2xkIH5pbml0IH5mID0gZnVuY3Rpb25cbiAgICAgIHwgRW5kIC0+IGluaXRcbiAgICAgIHwgTW9yZSAoa2V5LCBkYXRhLCB0cmVlLCBlbnVtKSAtPlxuICAgICAgICBsZXQgbmV4dCA9IGYgfmtleSB+ZGF0YSBpbml0IGluXG4gICAgICAgIGZvbGQgKGNvbnMgdHJlZSBlbnVtKSB+aW5pdDpuZXh0IH5mXG4gICAgOztcblxuICAgIGxldCBmb2xkMiBjb21wYXJlX2tleSB0MSB0MiB+aW5pdCB+ZiA9XG4gICAgICBsZXQgcmVjIGxvb3AgdDEgdDIgY3VyciA9XG4gICAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICAgIHwgRW5kLCBFbmQgLT4gY3VyclxuICAgICAgICB8IEVuZCwgXyAtPlxuICAgICAgICAgIGZvbGQgdDIgfmluaXQ6Y3VyciB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGYgfmtleSB+ZGF0YTooYFJpZ2h0IGRhdGEpIGFjYylcbiAgICAgICAgfCBfLCBFbmQgLT5cbiAgICAgICAgICBmb2xkIHQxIH5pbml0OmN1cnIgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBmIH5rZXkgfmRhdGE6KGBMZWZ0IGRhdGEpIGFjYylcbiAgICAgICAgfCBNb3JlIChrMSwgdjEsIHRyZWUxLCBlbnVtMSksIE1vcmUgKGsyLCB2MiwgdHJlZTIsIGVudW0yKSAtPlxuICAgICAgICAgIGxldCBjb21wYXJlX3Jlc3VsdCA9IGNvbXBhcmVfa2V5IGsxIGsyIGluXG4gICAgICAgICAgaWYgY29tcGFyZV9yZXN1bHQgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgbmV4dCA9IGYgfmtleTprMSB+ZGF0YTooYEJvdGggKHYxLCB2MikpIGN1cnIgaW5cbiAgICAgICAgICAgIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIChjb25zIHRyZWUyIGVudW0yKSBuZXh0KVxuICAgICAgICAgIGVsc2UgaWYgY29tcGFyZV9yZXN1bHQgPCAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgbmV4dCA9IGYgfmtleTprMSB+ZGF0YTooYExlZnQgdjEpIGN1cnIgaW5cbiAgICAgICAgICAgIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIHQyIG5leHQpXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgbmV4dCA9IGYgfmtleTprMiB+ZGF0YTooYFJpZ2h0IHYyKSBjdXJyIGluXG4gICAgICAgICAgICBsb29wIHQxIChjb25zIHRyZWUyIGVudW0yKSBuZXh0KVxuICAgICAgaW5cbiAgICAgIGxvb3AgdDEgdDIgaW5pdFxuICAgIDs7XG5cbiAgICBsZXQgc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfa2V5IH5kYXRhX2VxdWFsID1cbiAgICAgIGxldCBzdGVwIHN0YXRlID1cbiAgICAgICAgbWF0Y2ggc3RhdGUgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IFNlcXVlbmNlLlN0ZXAuRG9uZVxuICAgICAgICB8IEVuZCwgTW9yZSAoa2V5LCBkYXRhLCB0cmVlLCBlbnVtKSAtPlxuICAgICAgICAgIFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrZXksIGBSaWdodCBkYXRhKSwgKEVuZCwgY29ucyB0cmVlIGVudW0pKVxuICAgICAgICB8IE1vcmUgKGtleSwgZGF0YSwgdHJlZSwgZW51bSksIEVuZCAtPlxuICAgICAgICAgIFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrZXksIGBMZWZ0IGRhdGEpLCAoY29ucyB0cmVlIGVudW0sIEVuZCkpXG4gICAgICAgIHwgKE1vcmUgKGsxLCB2MSwgdHJlZTEsIGVudW0xKSBhcyBsZWZ0KSwgKE1vcmUgKGsyLCB2MiwgdHJlZTIsIGVudW0yKSBhcyByaWdodCkgLT5cbiAgICAgICAgICBsZXQgY29tcGFyZV9yZXN1bHQgPSBjb21wYXJlX2tleSBrMSBrMiBpblxuICAgICAgICAgIGlmIGNvbXBhcmVfcmVzdWx0ID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IG5leHRfc3RhdGUgPVxuICAgICAgICAgICAgICBpZiBwaHlzX2VxdWFsIHRyZWUxIHRyZWUyXG4gICAgICAgICAgICAgIHRoZW4gZW51bTEsIGVudW0yXG4gICAgICAgICAgICAgIGVsc2UgY29ucyB0cmVlMSBlbnVtMSwgY29ucyB0cmVlMiBlbnVtMlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGlmIGRhdGFfZXF1YWwgdjEgdjJcbiAgICAgICAgICAgIHRoZW4gU2VxdWVuY2UuU3RlcC5Ta2lwIG5leHRfc3RhdGVcbiAgICAgICAgICAgIGVsc2UgU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGsxLCBgVW5lcXVhbCAodjEsIHYyKSksIG5leHRfc3RhdGUpKVxuICAgICAgICAgIGVsc2UgaWYgY29tcGFyZV9yZXN1bHQgPCAwXG4gICAgICAgICAgdGhlbiBTZXF1ZW5jZS5TdGVwLllpZWxkICgoazEsIGBMZWZ0IHYxKSwgKGNvbnMgdHJlZTEgZW51bTEsIHJpZ2h0KSlcbiAgICAgICAgICBlbHNlIFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrMiwgYFJpZ2h0IHYyKSwgKGxlZnQsIGNvbnMgdHJlZTIgZW51bTIpKVxuICAgICAgaW5cbiAgICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0OihvZl90cmVlIHQxLCBvZl90cmVlIHQyKSB+ZjpzdGVwXG4gICAgOztcblxuICAgIGxldCBmb2xkX3N5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2tleSB+ZGF0YV9lcXVhbCB+aW5pdCB+ZiA9XG4gICAgICBsZXQgYWRkIGFjYyBrIHYgPSBmIGFjYyAoaywgYFJpZ2h0IHYpIGluXG4gICAgICBsZXQgcmVtb3ZlIGFjYyBrIHYgPSBmIGFjYyAoaywgYExlZnQgdikgaW5cbiAgICAgIGxldCByZWMgbG9vcCBsZWZ0IHJpZ2h0IGFjYyA9XG4gICAgICAgIG1hdGNoIGxlZnQsIHJpZ2h0IHdpdGhcbiAgICAgICAgfCBFbmQsIGVudW0gLT4gZm9sZCBlbnVtIH5pbml0OmFjYyB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGFkZCBhY2Mga2V5IGRhdGEpXG4gICAgICAgIHwgZW51bSwgRW5kIC0+IGZvbGQgZW51bSB+aW5pdDphY2MgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiByZW1vdmUgYWNjIGtleSBkYXRhKVxuICAgICAgICB8IChNb3JlIChrMSwgdjEsIHRyZWUxLCBlbnVtMSkgYXMgbGVmdCksIChNb3JlIChrMiwgdjIsIHRyZWUyLCBlbnVtMikgYXMgcmlnaHQpIC0+XG4gICAgICAgICAgbGV0IGNvbXBhcmVfcmVzdWx0ID0gY29tcGFyZV9rZXkgazEgazIgaW5cbiAgICAgICAgICBpZiBjb21wYXJlX3Jlc3VsdCA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBhY2MgPSBpZiBkYXRhX2VxdWFsIHYxIHYyIHRoZW4gYWNjIGVsc2UgZiBhY2MgKGsxLCBgVW5lcXVhbCAodjEsIHYyKSkgaW5cbiAgICAgICAgICAgIGlmIHBoeXNfZXF1YWwgdHJlZTEgdHJlZTJcbiAgICAgICAgICAgIHRoZW4gbG9vcCBlbnVtMSBlbnVtMiBhY2NcbiAgICAgICAgICAgIGVsc2UgbG9vcCAoY29ucyB0cmVlMSBlbnVtMSkgKGNvbnMgdHJlZTIgZW51bTIpIGFjYylcbiAgICAgICAgICBlbHNlIGlmIGNvbXBhcmVfcmVzdWx0IDwgMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IGFjYyA9IHJlbW92ZSBhY2MgazEgdjEgaW5cbiAgICAgICAgICAgIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIHJpZ2h0IGFjYylcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCBhY2MgPSBhZGQgYWNjIGsyIHYyIGluXG4gICAgICAgICAgICBsb29wIGxlZnQgKGNvbnMgdHJlZTIgZW51bTIpIGFjYylcbiAgICAgIGluXG4gICAgICBsb29wIChvZl90cmVlIHQxKSAob2ZfdHJlZSB0MikgaW5pdFxuICAgIDs7XG4gIGVuZFxuXG4gIGxldCB0b19zZXF1ZW5jZV9pbmNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fa2V5IHQgPVxuICAgIGxldCBuZXh0IGVudW0gPVxuICAgICAgbWF0Y2ggZW51bSB3aXRoXG4gICAgICB8IEVudW0uRW5kIC0+IFNlcXVlbmNlLlN0ZXAuRG9uZVxuICAgICAgfCBFbnVtLk1vcmUgKGssIHYsIHQsIGUpIC0+IFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrLCB2KSwgRW51bS5jb25zIHQgZSlcbiAgICBpblxuICAgIGxldCBpbml0ID1cbiAgICAgIG1hdGNoIGZyb21fa2V5IHdpdGhcbiAgICAgIHwgTm9uZSAtPiBFbnVtLm9mX3RyZWUgdFxuICAgICAgfCBTb21lIGtleSAtPiBFbnVtLnN0YXJ0aW5nX2F0X2luY3JlYXNpbmcgdCBrZXkgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0IH5mOm5leHRcbiAgOztcblxuICBsZXQgdG9fc2VxdWVuY2VfZGVjcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2tleSB0ID1cbiAgICBsZXQgbmV4dCBlbnVtID1cbiAgICAgIG1hdGNoIGVudW0gd2l0aFxuICAgICAgfCBFbnVtLkVuZCAtPiBTZXF1ZW5jZS5TdGVwLkRvbmVcbiAgICAgIHwgRW51bS5Nb3JlIChrLCB2LCB0LCBlKSAtPiBTZXF1ZW5jZS5TdGVwLllpZWxkICgoaywgdiksIEVudW0uY29uc19yaWdodCB0IGUpXG4gICAgaW5cbiAgICBsZXQgaW5pdCA9XG4gICAgICBtYXRjaCBmcm9tX2tleSB3aXRoXG4gICAgICB8IE5vbmUgLT4gRW51bS5vZl90cmVlX3JpZ2h0IHRcbiAgICAgIHwgU29tZSBrZXkgLT4gRW51bS5zdGFydGluZ19hdF9kZWNyZWFzaW5nIHQga2V5IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdCB+ZjpuZXh0XG4gIDs7XG5cbiAgbGV0IHRvX3NlcXVlbmNlXG4gICAgICAgIGNvbXBhcmF0b3JcbiAgICAgICAgPyhvcmRlciA9IGBJbmNyZWFzaW5nX2tleSlcbiAgICAgICAgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90b1xuICAgICAgICA/a2V5c19sZXNzX29yX2VxdWFsX3RvXG4gICAgICAgIHRcbiAgICA9XG4gICAgbGV0IGluY2x1c2l2ZV9ib3VuZCBzaWRlIHQgYm91bmQgPVxuICAgICAgbGV0IGNvbXBhcmVfa2V5ID0gY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgaW5cbiAgICAgIGxldCBsLCBtYXliZSwgciA9IHNwbGl0IHQgYm91bmQgfmNvbXBhcmVfa2V5IGluXG4gICAgICBsZXQgdCA9IHNpZGUgKGwsIHIpIGluXG4gICAgICBtYXRjaCBtYXliZSB3aXRoXG4gICAgICB8IE5vbmUgLT4gdFxuICAgICAgfCBTb21lIChrZXksIGRhdGEpIC0+IHNldCcgdCBrZXkgZGF0YSB+Y29tcGFyZV9rZXlcbiAgICBpblxuICAgIG1hdGNoIG9yZGVyIHdpdGhcbiAgICB8IGBJbmNyZWFzaW5nX2tleSAtPlxuICAgICAgbGV0IHQgPSBPcHRpb24uZm9sZCBrZXlzX2xlc3Nfb3JfZXF1YWxfdG8gfmluaXQ6dCB+ZjooaW5jbHVzaXZlX2JvdW5kIGZzdCkgaW5cbiAgICAgIHRvX3NlcXVlbmNlX2luY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9rZXk6a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvIHRcbiAgICB8IGBEZWNyZWFzaW5nX2tleSAtPlxuICAgICAgbGV0IHQgPSBPcHRpb24uZm9sZCBrZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gfmluaXQ6dCB+ZjooaW5jbHVzaXZlX2JvdW5kIHNuZCkgaW5cbiAgICAgIHRvX3NlcXVlbmNlX2RlY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9rZXk6a2V5c19sZXNzX29yX2VxdWFsX3RvIHRcbiAgOztcblxuICBsZXQgY29tcGFyZSBjb21wYXJlX2tleSBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgIEVudW0uY29tcGFyZSBjb21wYXJlX2tleSBjb21wYXJlX2RhdGEgKEVudW0ub2ZfdHJlZSB0MSkgKEVudW0ub2ZfdHJlZSB0MilcbiAgOztcblxuICBsZXQgZXF1YWwgY29tcGFyZV9rZXkgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICBFbnVtLmVxdWFsIGNvbXBhcmVfa2V5IGNvbXBhcmVfZGF0YSAoRW51bS5vZl90cmVlIHQxKSAoRW51bS5vZl90cmVlIHQyKVxuICA7O1xuXG4gIGxldCBpdGVyMiB0MSB0MiB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIEVudW0uZm9sZDJcbiAgICAgIGNvbXBhcmVfa2V5XG4gICAgICAoRW51bS5vZl90cmVlIHQxKVxuICAgICAgKEVudW0ub2ZfdHJlZSB0MilcbiAgICAgIH5pbml0OigpXG4gICAgICB+ZjooZnVuIH5rZXkgfmRhdGEgKCkgLT4gZiB+a2V5IH5kYXRhKVxuICA7O1xuXG4gIGxldCBmb2xkMiB0MSB0MiB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIEVudW0uZm9sZDIgY29tcGFyZV9rZXkgKEVudW0ub2ZfdHJlZSB0MSkgKEVudW0ub2ZfdHJlZSB0MikgfmYgfmluaXRcbiAgOztcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgPSBFbnVtLnN5bW1ldHJpY19kaWZmXG5cbiAgbGV0IGZvbGRfc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfa2V5IH5kYXRhX2VxdWFsIH5pbml0IH5mID1cbiAgICAoKiBbRW51bS5mb2xkX2RpZmZzXSBpcyBhIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiwgYnV0IGlzIGNvbnNpZGVyYWJseVxuICAgICAgIHNsb3dlciwgYXMgd2UgaGF2ZSB0byBhbGxvY2F0ZSBxdWl0ZSBhIGxvdCBvZiBzdGF0ZSB0byB0cmFjayBlbnVtZXJhdGlvbiBvZiBhIHRyZWUuXG4gICAgICAgQXZvaWQgaWYgd2UgY2FuLlxuICAgICopXG4gICAgbGV0IHNsb3cgeCB5IH5pbml0ID0gRW51bS5mb2xkX3N5bW1ldHJpY19kaWZmIHggeSB+Y29tcGFyZV9rZXkgfmRhdGFfZXF1YWwgfmYgfmluaXQgaW5cbiAgICBsZXQgYWRkIGFjYyBrIHYgPSBmIGFjYyAoaywgYFJpZ2h0IHYpIGluXG4gICAgbGV0IHJlbW92ZSBhY2MgayB2ID0gZiBhY2MgKGssIGBMZWZ0IHYpIGluXG4gICAgbGV0IGRlbHRhIGFjYyBrIHYgdicgPSBpZiBkYXRhX2VxdWFsIHYgdicgdGhlbiBhY2MgZWxzZSBmIGFjYyAoaywgYFVuZXF1YWwgKHYsIHYnKSkgaW5cbiAgICAoKiBJZiB0d28gdHJlZXMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXQgdGhlIHJvb3QgKGFuZCB0aGUgc2FtZSBrZXksIGlmIHRoZXkncmVcbiAgICAgICBbTm9kZV1zKSB3ZSBjYW4gdHJpdmlhbGx5IGRpZmYgZWFjaCBzdWJwYXJ0IGluIG9idmlvdXMgd2F5cy4gKilcbiAgICBsZXQgcmVjIGxvb3AgdCB0JyBhY2MgPVxuICAgICAgaWYgcGh5c19lcXVhbCB0IHQnXG4gICAgICB0aGVuIGFjY1xuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHQsIHQnIHdpdGhcbiAgICAgICAgfCBFbXB0eSwgbmV3X3ZhbHMgLT5cbiAgICAgICAgICBmb2xkIG5ld192YWxzIH5pbml0OmFjYyB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGFkZCBhY2Mga2V5IGRhdGEpXG4gICAgICAgIHwgb2xkX3ZhbHMsIEVtcHR5IC0+XG4gICAgICAgICAgZm9sZCBvbGRfdmFscyB+aW5pdDphY2MgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiByZW1vdmUgYWNjIGtleSBkYXRhKVxuICAgICAgICB8IExlYWYgKGssIHYpLCBMZWFmIChrJywgdicpIC0+XG4gICAgICAgICAgKG1hdGNoIGNvbXBhcmVfa2V5IGsgaycgd2l0aFxuICAgICAgICAgICB8IHggd2hlbiB4ID0gMCAtPiBkZWx0YSBhY2MgayB2IHYnXG4gICAgICAgICAgIHwgeCB3aGVuIHggPCAwIC0+XG4gICAgICAgICAgICAgbGV0IGFjYyA9IHJlbW92ZSBhY2MgayB2IGluXG4gICAgICAgICAgICAgYWRkIGFjYyBrJyB2J1xuICAgICAgICAgICB8IF8gKCogd2hlbiB4ID4gMCAqKSAtPlxuICAgICAgICAgICAgIGxldCBhY2MgPSBhZGQgYWNjIGsnIHYnIGluXG4gICAgICAgICAgICAgcmVtb3ZlIGFjYyBrIHYpXG4gICAgICAgIHwgTm9kZSAobCwgaywgdiwgciwgXyksIE5vZGUgKGwnLCBrJywgdicsIHInLCBfKSB3aGVuIGNvbXBhcmVfa2V5IGsgaycgPSAwIC0+XG4gICAgICAgICAgbGV0IGFjYyA9IGxvb3AgbCBsJyBhY2MgaW5cbiAgICAgICAgICBsZXQgYWNjID0gZGVsdGEgYWNjIGsgdiB2JyBpblxuICAgICAgICAgIGxvb3AgciByJyBhY2NcbiAgICAgICAgKCogT3VyIHJvb3RzIGFyZW4ndCB0aGUgc2FtZSBrZXkuIEZhbGxiYWNrIHRvIHRoZSBzbG93IG1vZGUuIFRyZWVzIHdpdGggc21hbGxcbiAgICAgICAgICAgZGlmZnMgd2lsbCBvbmx5IGRvIHRoaXMgb24gdmVyeSBzbWFsbCBwYXJ0cyBvZiB0aGUgdHJlZSAoaG9wZWZ1bGx5IC0gaWYgdGhlXG4gICAgICAgICAgIG92ZXJhbGwgcm9vdCBpcyByZWJhbGFuY2VkLCB3ZSdsbCBlYXQgdGhlIHdob2xlIGNvc3QsIHVuZm9ydHVuYXRlbHkuKSAqKVxuICAgICAgICB8IE5vZGUgXywgTm9kZSBfIHwgTm9kZSBfLCBMZWFmIF8gfCBMZWFmIF8sIE5vZGUgXyAtPiBzbG93IHQgdCcgfmluaXQ6YWNjKVxuICAgIGluXG4gICAgbG9vcCB0MSB0MiBpbml0XG4gIDs7XG5cbiAgbGV0IHJlYyBsZW5ndGggPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gMFxuICAgIHwgTGVhZiBfIC0+IDFcbiAgICB8IE5vZGUgKGwsIF8sIF8sIHIsIF8pIC0+IGxlbmd0aCBsICsgbGVuZ3RoIHIgKyAxXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF90X2lnbm9yaW5nX3N0cnVjdHVyZSBoYXNoX2ZvbGRfa2V5IGhhc2hfZm9sZF9kYXRhIHN0YXRlIHQgPVxuICAgIGZvbGRcbiAgICAgIHRcbiAgICAgIH5pbml0OihoYXNoX2ZvbGRfaW50IHN0YXRlIChsZW5ndGggdCkpXG4gICAgICB+ZjooZnVuIH5rZXkgfmRhdGEgc3RhdGUgLT4gaGFzaF9mb2xkX2RhdGEgKGhhc2hfZm9sZF9rZXkgc3RhdGUga2V5KSBkYXRhKVxuICA7O1xuXG4gIGxldCBrZXlzIHQgPSBmb2xkX3JpZ2h0IH5mOihmdW4gfmtleSB+ZGF0YTpfIGxpc3QgLT4ga2V5IDo6IGxpc3QpIHQgfmluaXQ6W11cbiAgbGV0IGRhdGEgdCA9IGZvbGRfcmlnaHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgbGlzdCAtPiBkYXRhIDo6IGxpc3QpIHQgfmluaXQ6W11cblxuICBtb2R1bGUgdHlwZSBGb2xkYWJsZSA9IHNpZ1xuICAgIHZhbCBuYW1lIDogc3RyaW5nXG5cbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBmb2xkIDogJ2EgdCAtPiBpbml0OidiIC0+IGY6KCdiIC0+ICdhIC0+ICdiKSAtPiAnYlxuICBlbmRcblxuICBtb2R1bGUgT2ZfZm9sZGFibGUgKE0gOiBGb2xkYWJsZSkgPSBzdHJ1Y3RcbiAgICBsZXQgb2ZfZm9sZGFibGVfZm9sZCBmb2xkYWJsZSB+aW5pdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgICAgTS5mb2xkIGZvbGRhYmxlIH5pbml0OihlbXB0eSwgMCkgfmY6KGZ1biAoYWNjdW0sIGxlbmd0aCkgKGtleSwgZGF0YSkgLT5cbiAgICAgICAgbGV0IHByZXZfZGF0YSA9XG4gICAgICAgICAgbWF0Y2ggZmluZCBhY2N1bSBrZXkgfmNvbXBhcmVfa2V5IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gaW5pdFxuICAgICAgICAgIHwgU29tZSBwcmV2IC0+IHByZXZcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGRhdGEgPSBmIHByZXZfZGF0YSBkYXRhIGluXG4gICAgICAgIHNldCBhY2N1bSB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5KVxuICAgIDs7XG5cbiAgICBsZXQgb2ZfZm9sZGFibGVfcmVkdWNlIGZvbGRhYmxlIH5mIH5jb21wYXJlX2tleSA9XG4gICAgICBNLmZvbGQgZm9sZGFibGUgfmluaXQ6KGVtcHR5LCAwKSB+ZjooZnVuIChhY2N1bSwgbGVuZ3RoKSAoa2V5LCBkYXRhKSAtPlxuICAgICAgICBsZXQgbmV3X2RhdGEgPVxuICAgICAgICAgIG1hdGNoIGZpbmQgYWNjdW0ga2V5IH5jb21wYXJlX2tleSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGRhdGFcbiAgICAgICAgICB8IFNvbWUgcHJldiAtPiBmIHByZXYgZGF0YVxuICAgICAgICBpblxuICAgICAgICBzZXQgYWNjdW0gfmxlbmd0aCB+a2V5IH5kYXRhOm5ld19kYXRhIH5jb21wYXJlX2tleSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX2ZvbGRhYmxlIGZvbGRhYmxlIH5jb21wYXJlX2tleSA9XG4gICAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgICAgbGV0IG1hcCA9XG4gICAgICAgICAgTS5mb2xkIGZvbGRhYmxlIH5pbml0OihlbXB0eSwgMCkgfmY6KGZ1biAodCwgbGVuZ3RoKSAoa2V5LCBkYXRhKSAtPlxuICAgICAgICAgICAgbGV0ICgoXywgbGVuZ3RoJykgYXMgYWNjKSA9IHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgdCB+Y29tcGFyZV9rZXkgaW5cbiAgICAgICAgICAgIGlmIGxlbmd0aCA9IGxlbmd0aCcgdGhlbiByLnJldHVybiAoYER1cGxpY2F0ZV9rZXkga2V5KSBlbHNlIGFjYylcbiAgICAgICAgaW5cbiAgICAgICAgYE9rIG1hcClcbiAgICA7O1xuXG4gICAgbGV0IG9mX2ZvbGRhYmxlX29yX2Vycm9yIGZvbGRhYmxlIH5jb21wYXJhdG9yID1cbiAgICAgIG1hdGNoIG9mX2ZvbGRhYmxlIGZvbGRhYmxlIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgICB8IGBPayB4IC0+IFJlc3VsdC5PayB4XG4gICAgICB8IGBEdXBsaWNhdGVfa2V5IGtleSAtPlxuICAgICAgICBPcl9lcnJvci5lcnJvclxuICAgICAgICAgIChcIk1hcC5vZl9cIiBeIE0ubmFtZSBeIFwiX29yX2Vycm9yOiBkdXBsaWNhdGUga2V5XCIpXG4gICAgICAgICAga2V5XG4gICAgICAgICAgY29tcGFyYXRvci5zZXhwX29mX3RcbiAgICA7O1xuXG4gICAgbGV0IG9mX2ZvbGRhYmxlX2V4biBmb2xkYWJsZSB+Y29tcGFyYXRvciA9XG4gICAgICBtYXRjaCBvZl9mb2xkYWJsZSBmb2xkYWJsZSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgICAgfCBgT2sgeCAtPiB4XG4gICAgICB8IGBEdXBsaWNhdGVfa2V5IGtleSAtPlxuICAgICAgICBFcnJvci5jcmVhdGUgKFwiTWFwLm9mX1wiIF4gTS5uYW1lIF4gXCJfZXhuOiBkdXBsaWNhdGUga2V5XCIpIGtleSBjb21wYXJhdG9yLnNleHBfb2ZfdFxuICAgICAgICB8PiBFcnJvci5yYWlzZVxuICAgIDs7XG4gIGVuZFxuXG4gIG1vZHVsZSBPZl9hbGlzdCA9IE9mX2ZvbGRhYmxlIChzdHJ1Y3RcbiAgICAgIGxldCBuYW1lID0gXCJhbGlzdFwiXG5cbiAgICAgIHR5cGUgJ2EgdCA9ICdhIGxpc3RcblxuICAgICAgbGV0IGZvbGQgPSBMaXN0LmZvbGRcbiAgICBlbmQpXG5cbiAgbGV0IG9mX2FsaXN0X2ZvbGQgPSBPZl9hbGlzdC5vZl9mb2xkYWJsZV9mb2xkXG4gIGxldCBvZl9hbGlzdF9yZWR1Y2UgPSBPZl9hbGlzdC5vZl9mb2xkYWJsZV9yZWR1Y2VcbiAgbGV0IG9mX2FsaXN0ID0gT2ZfYWxpc3Qub2ZfZm9sZGFibGVcbiAgbGV0IG9mX2FsaXN0X29yX2Vycm9yID0gT2ZfYWxpc3Qub2ZfZm9sZGFibGVfb3JfZXJyb3JcbiAgbGV0IG9mX2FsaXN0X2V4biA9IE9mX2FsaXN0Lm9mX2ZvbGRhYmxlX2V4blxuXG4gICgqIFJldmVyc2UgdGhlIGlucHV0LCB0aGVuIGZvbGQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBUaGUgcmVzdWx0aW5nIG1hcCB1c2VzIHRoZSBmaXJzdFxuICAgICBpbnN0YW5jZSBvZiBlYWNoIGtleSBmcm9tIHRoZSBpbnB1dCBsaXN0LiBUaGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgZWxlbWVudHMgaW4gZWFjaFxuICAgICBvdXRwdXQgbGlzdCBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgaW5wdXQgbGlzdC4gKilcbiAgbGV0IG9mX2ZvbGRhYmxlX211bHRpIGZvbGRhYmxlIH5mb2xkIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGFsaXN0ID0gZm9sZCBmb2xkYWJsZSB+aW5pdDpbXSB+ZjooZnVuIGwgeCAtPiB4IDo6IGwpIGluXG4gICAgb2ZfYWxpc3RfZm9sZCBhbGlzdCB+aW5pdDpbXSB+ZjooZnVuIGwgeCAtPiB4IDo6IGwpIH5jb21wYXJlX2tleVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9tdWx0aSBhbGlzdCB+Y29tcGFyZV9rZXkgPVxuICAgIG9mX2ZvbGRhYmxlX211bHRpIGFsaXN0IH5mb2xkOkxpc3QuZm9sZCB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBtb2R1bGUgT2Zfc2VxdWVuY2UgPSBPZl9mb2xkYWJsZSAoc3RydWN0XG4gICAgICBsZXQgbmFtZSA9IFwic2VxdWVuY2VcIlxuXG4gICAgICB0eXBlICdhIHQgPSAnYSBTZXF1ZW5jZS50XG5cbiAgICAgIGxldCBmb2xkID0gU2VxdWVuY2UuZm9sZFxuICAgIGVuZClcblxuICBsZXQgb2Zfc2VxdWVuY2VfZm9sZCA9IE9mX3NlcXVlbmNlLm9mX2ZvbGRhYmxlX2ZvbGRcbiAgbGV0IG9mX3NlcXVlbmNlX3JlZHVjZSA9IE9mX3NlcXVlbmNlLm9mX2ZvbGRhYmxlX3JlZHVjZVxuICBsZXQgb2Zfc2VxdWVuY2UgPSBPZl9zZXF1ZW5jZS5vZl9mb2xkYWJsZVxuICBsZXQgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgPSBPZl9zZXF1ZW5jZS5vZl9mb2xkYWJsZV9vcl9lcnJvclxuICBsZXQgb2Zfc2VxdWVuY2VfZXhuID0gT2Zfc2VxdWVuY2Uub2ZfZm9sZGFibGVfZXhuXG5cbiAgbGV0IG9mX3NlcXVlbmNlX211bHRpIHNlcXVlbmNlIH5jb21wYXJlX2tleSA9XG4gICAgb2ZfZm9sZGFibGVfbXVsdGkgc2VxdWVuY2UgfmZvbGQ6U2VxdWVuY2UuZm9sZCB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBsZXQgZm9yX2FsbCB0IH5mID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgIGl0ZXIgdCB+ZjooZnVuIGRhdGEgLT4gaWYgbm90IChmIGRhdGEpIHRoZW4gci5yZXR1cm4gZmFsc2UpO1xuICAgICAgdHJ1ZSlcbiAgOztcblxuICBsZXQgZm9yX2FsbGkgdCB+ZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBpZiBub3QgKGYgfmtleSB+ZGF0YSkgdGhlbiByLnJldHVybiBmYWxzZSk7XG4gICAgICB0cnVlKVxuICA7O1xuXG4gIGxldCBleGlzdHMgdCB+ZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICBpdGVyIHQgfmY6KGZ1biBkYXRhIC0+IGlmIGYgZGF0YSB0aGVuIHIucmV0dXJuIHRydWUpO1xuICAgICAgZmFsc2UpXG4gIDs7XG5cbiAgbGV0IGV4aXN0c2kgdCB+ZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiByLnJldHVybiB0cnVlKTtcbiAgICAgIGZhbHNlKVxuICA7O1xuXG4gIGxldCBjb3VudCB0IH5mID1cbiAgICBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSBhY2MgLT4gaWYgZiBkYXRhIHRoZW4gYWNjICsgMSBlbHNlIGFjYylcbiAgOztcblxuICBsZXQgY291bnRpIHQgfmYgPVxuICAgIGZvbGQgdCB+aW5pdDowIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gYWNjICsgMSBlbHNlIGFjYylcbiAgOztcblxuICBsZXQgdG9fYWxpc3QgPyhrZXlfb3JkZXIgPSBgSW5jcmVhc2luZykgdCA9XG4gICAgbWF0Y2gga2V5X29yZGVyIHdpdGhcbiAgICB8IGBJbmNyZWFzaW5nIC0+IGZvbGRfcmlnaHQgdCB+aW5pdDpbXSB+ZjooZnVuIH5rZXkgfmRhdGEgeCAtPiAoa2V5LCBkYXRhKSA6OiB4KVxuICAgIHwgYERlY3JlYXNpbmcgLT4gZm9sZCB0IH5pbml0OltdIH5mOihmdW4gfmtleSB+ZGF0YSB4IC0+IChrZXksIGRhdGEpIDo6IHgpXG4gIDs7XG5cbiAgbGV0IG1lcmdlIHQxIHQyIH5mIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IGVsdHMgPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCB+bGVuOihsZW5ndGggdDEgKyBsZW5ndGggdDIpIGluXG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGl0ZXIyIHQxIHQyIH5jb21wYXJlX2tleSB+ZjooZnVuIH5rZXkgfmRhdGE6dmFsdWVzIC0+XG4gICAgICBtYXRjaCBmIH5rZXkgdmFsdWVzIHdpdGhcbiAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICBVbmlmb3JtX2FycmF5LnNldCBlbHRzICFpIChrZXksIHZhbHVlKTtcbiAgICAgICAgaW5jciBpXG4gICAgICB8IE5vbmUgLT4gKCkpO1xuICAgIGxldCBsZW4gPSAhaSBpblxuICAgIGxldCBnZXQgaSA9IFVuaWZvcm1fYXJyYXkuZ2V0IGVsdHMgaSBpblxuICAgIGxldCB0cmVlID0gb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZjpnZXQgaW5cbiAgICB0cmVlLCBsZW5cbiAgOztcblxuICBsZXQgbWVyZ2Vfc2tld2VkID1cbiAgICBsZXQgbWVyZ2VfbGFyZ2VfZmlyc3QgbGVuZ3RoX2xhcmdlIHRfbGFyZ2UgdF9zbWFsbCB+Y2FsbCB+Y29tYmluZSB+Y29tcGFyZV9rZXkgPVxuICAgICAgZm9sZCB0X3NtYWxsIH5pbml0Oih0X2xhcmdlLCBsZW5ndGhfbGFyZ2UpIH5mOihmdW4gfmtleSB+ZGF0YTpkYXRhJyAodCwgbGVuZ3RoKSAtPlxuICAgICAgICB1cGRhdGUgdCBrZXkgfmxlbmd0aCB+Y29tcGFyZV9rZXkgfmY6KGZ1bmN0aW9uXG4gICAgICAgICAgfCBOb25lIC0+IGRhdGEnXG4gICAgICAgICAgfCBTb21lIGRhdGEgLT4gY2FsbCBjb21iaW5lIH5rZXkgZGF0YSBkYXRhJykpXG4gICAgaW5cbiAgICBsZXQgY2FsbCBmIH5rZXkgeCB5ID0gZiB+a2V5IHggeSBpblxuICAgIGxldCBzd2FwIGYgfmtleSB4IHkgPSBmIH5rZXkgeSB4IGluXG4gICAgZnVuIHQxIHQyIH5sZW5ndGgxIH5sZW5ndGgyIH5jb21iaW5lIH5jb21wYXJlX2tleSAtPlxuICAgICAgaWYgbGVuZ3RoMiA8PSBsZW5ndGgxXG4gICAgICB0aGVuIG1lcmdlX2xhcmdlX2ZpcnN0IGxlbmd0aDEgdDEgdDIgfmNhbGwgfmNvbWJpbmUgfmNvbXBhcmVfa2V5XG4gICAgICBlbHNlIG1lcmdlX2xhcmdlX2ZpcnN0IGxlbmd0aDIgdDIgdDEgfmNhbGw6c3dhcCB+Y29tYmluZSB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBtb2R1bGUgQ2xvc2VzdF9rZXlfaW1wbCA9IHN0cnVjdFxuICAgICgqIFttYXJrZXJdIGFuZCBbcmVwYWNrYWdlXSBhbGxvdyB1cyB0byBjcmVhdGUgXCJsb2dpY2FsXCIgb3B0aW9ucyB3aXRob3V0IGFjdHVhbGx5XG4gICAgICAgYWxsb2NhdGluZyBhbnkgb3B0aW9ucy4gUGFzc2luZyBbRm91bmQga2V5IHZhbHVlXSB0byBhIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgICBwYXNzaW5nIFtTb21lIChrZXksIHZhbHVlKV07IHBhc3NpbmcgW01pc3NpbmcgKCkgKCldIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZ1xuICAgICAgIFtOb25lXS4gKilcbiAgICB0eXBlICgnaywgJ3YsICdrX29wdCwgJ3Zfb3B0KSBtYXJrZXIgPVxuICAgICAgfCBNaXNzaW5nIDogKCdrLCAndiwgdW5pdCwgdW5pdCkgbWFya2VyXG4gICAgICB8IEZvdW5kIDogKCdrLCAndiwgJ2ssICd2KSBtYXJrZXJcblxuICAgIGxldCByZXBhY2thZ2VcbiAgICAgICAgICAodHlwZSBrIHYga19vcHQgdl9vcHQpXG4gICAgICAgICAgKG1hcmtlciA6IChrLCB2LCBrX29wdCwgdl9vcHQpIG1hcmtlcilcbiAgICAgICAgICAoayA6IGtfb3B0KVxuICAgICAgICAgICh2IDogdl9vcHQpXG4gICAgICA6IChrICogdikgb3B0aW9uXG4gICAgICA9XG4gICAgICBtYXRjaCBtYXJrZXIgd2l0aFxuICAgICAgfCBNaXNzaW5nIC0+IE5vbmVcbiAgICAgIHwgRm91bmQgLT4gU29tZSAoaywgdilcbiAgICA7O1xuXG4gICAgKCogVGhlIHR5cGUgc2lnbmF0dXJlIGlzIGV4cGxpY2l0IGhlcmUgdG8gYWxsb3cgcG9seW1vcnBoaWMgcmVjdXJzaW9uLiAqKVxuICAgIGxldCByZWMgbG9vcCA6XG4gICAgICAnayAndiAna19vcHQgJ3Zfb3B0LlxuICAgICAgKCdrLCAndikgdHJlZVxuICAgICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgICAgLT4gJ2tcbiAgICAgIC0+IGNvbXBhcmVfa2V5OignayAtPiAnayAtPiBpbnQpXG4gICAgICAtPiAoJ2ssICd2LCAna19vcHQsICd2X29wdCkgbWFya2VyXG4gICAgICAtPiAna19vcHRcbiAgICAgIC0+ICd2X29wdFxuICAgICAgLT4gKCdrICogJ3YpIG9wdGlvblxuICAgICAgPVxuICAgICAgZnVuIHQgZGlyIGsgfmNvbXBhcmVfa2V5IGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWUgLT5cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gcmVwYWNrYWdlIGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWVcbiAgICAgICAgfCBMZWFmIChrJywgdicpIC0+XG4gICAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrJyBrIGluXG4gICAgICAgICAgaWYgbWF0Y2ggZGlyIHdpdGhcbiAgICAgICAgICAgIHwgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gLT4gYyA+PSAwXG4gICAgICAgICAgICB8IGBHcmVhdGVyX3RoYW4gLT4gYyA+IDBcbiAgICAgICAgICAgIHwgYExlc3Nfb3JfZXF1YWxfdG8gLT4gYyA8PSAwXG4gICAgICAgICAgICB8IGBMZXNzX3RoYW4gLT4gYyA8IDBcbiAgICAgICAgICB0aGVuIFNvbWUgKGsnLCB2JylcbiAgICAgICAgICBlbHNlIHJlcGFja2FnZSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlXG4gICAgICAgIHwgTm9kZSAobCwgaycsIHYnLCByLCBfKSAtPlxuICAgICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgaycgayBpblxuICAgICAgICAgIGlmIGMgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICAoKiBUaGlzIGlzIGEgYmFzZSBjYXNlIChubyByZWN1cnNpdmUgY2FsbCkuICopXG4gICAgICAgICAgICBtYXRjaCBkaXIgd2l0aFxuICAgICAgICAgICAgfCBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBMZXNzX29yX2VxdWFsX3RvIC0+IFNvbWUgKGsnLCB2JylcbiAgICAgICAgICAgIHwgYEdyZWF0ZXJfdGhhbiAtPlxuICAgICAgICAgICAgICBpZiBpc19lbXB0eSByIHRoZW4gcmVwYWNrYWdlIGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWUgZWxzZSBtaW5fZWx0IHJcbiAgICAgICAgICAgIHwgYExlc3NfdGhhbiAtPlxuICAgICAgICAgICAgICBpZiBpc19lbXB0eSBsIHRoZW4gcmVwYWNrYWdlIGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWUgZWxzZSBtYXhfZWx0IGwpXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICAoKiBXZSBhcmUgZ3VhcmFudGVlZCBoZXJlIHRoYXQgaycgPD4gay4gKilcbiAgICAgICAgICAgICgqIFRoaXMgaXMgdGhlIG9ubHkgcmVjdXJzaXZlIGNhc2UuICopXG4gICAgICAgICAgICBtYXRjaCBkaXIgd2l0aFxuICAgICAgICAgICAgfCBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gLT5cbiAgICAgICAgICAgICAgaWYgYyA+IDBcbiAgICAgICAgICAgICAgdGhlbiBsb29wIGwgZGlyIGsgfmNvbXBhcmVfa2V5IEZvdW5kIGsnIHYnXG4gICAgICAgICAgICAgIGVsc2UgbG9vcCByIGRpciBrIH5jb21wYXJlX2tleSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlXG4gICAgICAgICAgICB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiAtPlxuICAgICAgICAgICAgICBpZiBjIDwgMFxuICAgICAgICAgICAgICB0aGVuIGxvb3AgciBkaXIgayB+Y29tcGFyZV9rZXkgRm91bmQgaycgdidcbiAgICAgICAgICAgICAgZWxzZSBsb29wIGwgZGlyIGsgfmNvbXBhcmVfa2V5IGZvdW5kX21hcmtlciBmb3VuZF9rZXkgZm91bmRfdmFsdWUpXG4gICAgOztcblxuICAgIGxldCBjbG9zZXN0X2tleSB0IGRpciBrIH5jb21wYXJlX2tleSA9IGxvb3AgdCBkaXIgayB+Y29tcGFyZV9rZXkgTWlzc2luZyAoKSAoKVxuICBlbmRcblxuICBsZXQgY2xvc2VzdF9rZXkgPSBDbG9zZXN0X2tleV9pbXBsLmNsb3Nlc3Rfa2V5XG5cbiAgbGV0IHJlYyByYW5rIHQgayB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaycsIF8pIC0+IGlmIGNvbXBhcmVfa2V5IGsnIGsgPSAwIHRoZW4gU29tZSAwIGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgaycsIF8sIHIsIF8pIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGsnIGsgaW5cbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIFNvbWUgKGxlbmd0aCBsKVxuICAgICAgZWxzZSBpZiBjID4gMFxuICAgICAgdGhlbiByYW5rIGwgayB+Y29tcGFyZV9rZXlcbiAgICAgIGVsc2UgT3B0aW9uLm1hcCAocmFuayByIGsgfmNvbXBhcmVfa2V5KSB+ZjooZnVuIHJhbmsgLT4gcmFuayArIDEgKyBsZW5ndGggbClcbiAgOztcblxuICAoKiB0aGlzIGNvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIFtTZXF1ZW5jZV0gaW50ZXJmYWNlIGJ1dCB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9uXG4gICAgIGFsbG9jYXRlcyBvbmx5IDIgd29yZHMgYW5kIGRvZXNuJ3QgcmVxdWlyZSB3cml0ZS1iYXJyaWVyICopXG4gIGxldCByZWMgbnRoJyBudW1fdG9fc2VhcmNoID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGssIHYpIC0+XG4gICAgICBpZiAhbnVtX3RvX3NlYXJjaCA9IDBcbiAgICAgIHRoZW4gU29tZSAoaywgdilcbiAgICAgIGVsc2UgKFxuICAgICAgICBkZWNyIG51bV90b19zZWFyY2g7XG4gICAgICAgIE5vbmUpXG4gICAgfCBOb2RlIChsLCBrLCB2LCByLCBfKSAtPlxuICAgICAgKG1hdGNoIG50aCcgbnVtX3RvX3NlYXJjaCBsIHdpdGhcbiAgICAgICB8IFNvbWUgXyBhcyBzb21lIC0+IHNvbWVcbiAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgIGlmICFudW1fdG9fc2VhcmNoID0gMFxuICAgICAgICAgdGhlbiBTb21lIChrLCB2KVxuICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgIGRlY3IgbnVtX3RvX3NlYXJjaDtcbiAgICAgICAgICAgbnRoJyBudW1fdG9fc2VhcmNoIHIpKVxuICA7O1xuXG4gIGxldCBudGggdCBuID0gbnRoJyAocmVmIG4pIHRcblxuXG4gIGxldCByZWMgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiAoaywgdikgLT4gaWYgZiB+a2V5OmsgfmRhdGE6diB0aGVuIFNvbWUgKGssIHYpIGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgaywgdiwgciwgXykgLT5cbiAgICAgIGlmIGYgfmtleTprIH5kYXRhOnZcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgbCB+ZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBTb21lIChrLCB2KVxuICAgICAgICB8IFNvbWUgXyBhcyB4IC0+IHgpXG4gICAgICBlbHNlIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyByIH5mXG4gIDs7XG5cbiAgbGV0IHJlYyBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGssIHYpIC0+IGlmIGYgfmtleTprIH5kYXRhOnYgdGhlbiBTb21lIChrLCB2KSBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIGssIHYsIHIsIF8pIC0+XG4gICAgICBpZiBmIH5rZXk6ayB+ZGF0YTp2XG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggZmluZF9sYXN0X3NhdGlzZnlpbmcgciB+ZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBTb21lIChrLCB2KVxuICAgICAgICB8IFNvbWUgXyBhcyB4IC0+IHgpXG4gICAgICBlbHNlIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIGwgfmZcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2ID1cbiAgICBtYXRjaCBob3cgd2l0aFxuICAgIHwgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuIC0+XG4gICAgICBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA8IDApXG4gICAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gLT5cbiAgICAgIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2IDw9IDApXG4gICAgfCBgRmlyc3RfZXF1YWxfdG8gLT5cbiAgICAgIChtYXRjaCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPj0gMCkgd2l0aFxuICAgICAgIHwgU29tZSAoa2V5LCBkYXRhKSBhcyBwYWlyIHdoZW4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPSAwIC0+IHBhaXJcbiAgICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgICB8IGBMYXN0X2VxdWFsX3RvIC0+XG4gICAgICAobWF0Y2ggZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPD0gMCkgd2l0aFxuICAgICAgIHwgU29tZSAoa2V5LCBkYXRhKSBhcyBwYWlyIHdoZW4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPSAwIC0+IHBhaXJcbiAgICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgICB8IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG8gLT5cbiAgICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA+PSAwKVxuICAgIHwgYEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhbiAtPlxuICAgICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2ID4gMClcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIGxldCBpc19sZWZ0IH5rZXkgfmRhdGEgPVxuICAgICAgbWF0Y2ggc2VnbWVudF9vZiB+a2V5IH5kYXRhIHdpdGhcbiAgICAgIHwgYExlZnQgLT4gdHJ1ZVxuICAgICAgfCBgUmlnaHQgLT4gZmFsc2VcbiAgICBpblxuICAgIGxldCBpc19yaWdodCB+a2V5IH5kYXRhID0gbm90IChpc19sZWZ0IH5rZXkgfmRhdGEpIGluXG4gICAgbWF0Y2ggaG93IHdpdGhcbiAgICB8IGBMYXN0X29uX2xlZnQgLT4gZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+Zjppc19sZWZ0XG4gICAgfCBgRmlyc3Rfb25fcmlnaHQgLT4gZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6aXNfcmlnaHRcbiAgOztcblxuICAoKiBbYmluYXJ5X3NlYXJjaF9vbmVfc2lkZWRfYm91bmRdIGZpbmRzIHRoZSBrZXkgaW4gW3RdIHdoaWNoIHNhdGlzZmllcyBbbWF5YmVfYm91bmRdXG4gICAgIGFuZCB0aGUgcmVsZXZhbnQgb25lIG9mIFtpZl9leGNsdXNpdmVdIG9yIFtpZl9pbmNsdXNpdmVdLCBhcyBqdWRnZWQgYnkgW2NvbXBhcmVdLiAqKVxuICBsZXQgYmluYXJ5X3NlYXJjaF9vbmVfc2lkZWRfYm91bmQgdCBtYXliZV9ib3VuZCB+Y29tcGFyZSB+aWZfZXhjbHVzaXZlIH5pZl9pbmNsdXNpdmUgPVxuICAgIGxldCBmaW5kX2JvdW5kIHQgaG93IGJvdW5kIH5jb21wYXJlIDogXyBNYXliZV9ib3VuZC50IG9wdGlvbiA9XG4gICAgICBtYXRjaCBiaW5hcnlfc2VhcmNoIHQgaG93IGJvdW5kIH5jb21wYXJlIHdpdGhcbiAgICAgIHwgU29tZSAoYm91bmQsIF8pIC0+IFNvbWUgKEluY2wgYm91bmQpXG4gICAgICB8IE5vbmUgLT4gTm9uZVxuICAgIGluXG4gICAgbWF0Y2ggKG1heWJlX2JvdW5kIDogXyBNYXliZV9ib3VuZC50KSB3aXRoXG4gICAgfCBFeGNsIGJvdW5kIC0+IGZpbmRfYm91bmQgdCBpZl9leGNsdXNpdmUgYm91bmQgfmNvbXBhcmVcbiAgICB8IEluY2wgYm91bmQgLT4gZmluZF9ib3VuZCB0IGlmX2luY2x1c2l2ZSBib3VuZCB+Y29tcGFyZVxuICAgIHwgVW5ib3VuZGVkIC0+IFNvbWUgVW5ib3VuZGVkXG4gIDs7XG5cbiAgKCogW2JpbmFyeV9zZWFyY2hfdHdvX3NpZGVkX2JvdW5kc10gZmluZHMgdGhlIChub3QgbmVjZXNzYXJpbHkgZGlzdGluY3QpIGtleXMgaW4gW3RdXG4gICAgIHdoaWNoIG1vc3QgY2xvc2VseSBhcHByb2FjaCAoYnV0IGRvIG5vdCBjcm9zcykgW2xvd2VyX2JvdW5kXSBhbmQgW3VwcGVyX2JvdW5kXSwgYXNcbiAgICAganVkZ2VkIGJ5IFtjb21wYXJlXS4gSXQgcmV0dXJucyBbTm9uZV0gaWYgbm8ga2V5cyBpbiBbdF0gYXJlIHdpdGhpbiB0aGF0IHJhbmdlLiAqKVxuICBsZXQgYmluYXJ5X3NlYXJjaF90d29fc2lkZWRfYm91bmRzIHQgfmNvbXBhcmUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCA9XG4gICAgbGV0IGZpbmRfbG93ZXJfYm91bmQgdCBtYXliZV9ib3VuZCB+Y29tcGFyZSA9XG4gICAgICBiaW5hcnlfc2VhcmNoX29uZV9zaWRlZF9ib3VuZFxuICAgICAgICB0XG4gICAgICAgIG1heWJlX2JvdW5kXG4gICAgICAgIH5jb21wYXJlXG4gICAgICAgIH5pZl9leGNsdXNpdmU6YEZpcnN0X3N0cmljdGx5X2dyZWF0ZXJfdGhhblxuICAgICAgICB+aWZfaW5jbHVzaXZlOmBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG9cbiAgICBpblxuICAgIGxldCBmaW5kX3VwcGVyX2JvdW5kIHQgbWF5YmVfYm91bmQgfmNvbXBhcmUgPVxuICAgICAgYmluYXJ5X3NlYXJjaF9vbmVfc2lkZWRfYm91bmRcbiAgICAgICAgdFxuICAgICAgICBtYXliZV9ib3VuZFxuICAgICAgICB+Y29tcGFyZVxuICAgICAgICB+aWZfZXhjbHVzaXZlOmBMYXN0X3N0cmljdGx5X2xlc3NfdGhhblxuICAgICAgICB+aWZfaW5jbHVzaXZlOmBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90b1xuICAgIGluXG4gICAgbWF0Y2ggZmluZF9sb3dlcl9ib3VuZCB0IGxvd2VyX2JvdW5kIH5jb21wYXJlIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBsb3dlcl9ib3VuZCAtPlxuICAgICAgKG1hdGNoIGZpbmRfdXBwZXJfYm91bmQgdCB1cHBlcl9ib3VuZCB+Y29tcGFyZSB3aXRoXG4gICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICB8IFNvbWUgdXBwZXJfYm91bmQgLT4gU29tZSAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kKSlcbiAgOztcblxuICB0eXBlICgnaywgJ3YpIGFjYyA9XG4gICAgeyBtdXRhYmxlIGJhZF9rZXkgOiAnayBvcHRpb25cbiAgICA7IG11dGFibGUgbWFwX2xlbmd0aCA6ICgnaywgJ3YpIHQgKiBpbnRcbiAgICB9XG5cbiAgbGV0IG9mX2l0ZXJpIH5pdGVyaSB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBhY2MgPSB7IGJhZF9rZXkgPSBOb25lOyBtYXBfbGVuZ3RoID0gZW1wdHksIDAgfSBpblxuICAgIGl0ZXJpIH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgICAgbGV0IG1hcCwgbGVuZ3RoID0gYWNjLm1hcF9sZW5ndGggaW5cbiAgICAgIGxldCAoKF8sIGxlbmd0aCcpIGFzIHBhaXIpID0gc2V0IH5sZW5ndGggfmtleSB+ZGF0YSBtYXAgfmNvbXBhcmVfa2V5IGluXG4gICAgICBpZiBsZW5ndGggPSBsZW5ndGgnICYmIE9wdGlvbi5pc19ub25lIGFjYy5iYWRfa2V5XG4gICAgICB0aGVuIGFjYy5iYWRfa2V5IDwtIFNvbWUga2V5XG4gICAgICBlbHNlIGFjYy5tYXBfbGVuZ3RoIDwtIHBhaXIpO1xuICAgIG1hdGNoIGFjYy5iYWRfa2V5IHdpdGhcbiAgICB8IE5vbmUgLT4gYE9rIGFjYy5tYXBfbGVuZ3RoXG4gICAgfCBTb21lIGtleSAtPiBgRHVwbGljYXRlX2tleSBrZXlcbiAgOztcblxuICBsZXQgb2ZfaXRlcmlfZXhuIH5pdGVyaSB+KGNvbXBhcmF0b3IgOiBfIENvbXBhcmF0b3IudCkgPVxuICAgIG1hdGNoIG9mX2l0ZXJpIH5pdGVyaSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBPayB2IC0+IHZcbiAgICB8IGBEdXBsaWNhdGVfa2V5IGtleSAtPlxuICAgICAgRXJyb3IuY3JlYXRlIFwiTWFwLm9mX2l0ZXJpX2V4bjogZHVwbGljYXRlIGtleVwiIGtleSBjb21wYXJhdG9yLnNleHBfb2ZfdFxuICAgICAgfD4gRXJyb3IucmFpc2VcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCBrZXlfb2Zfc2V4cCB2YWx1ZV9vZl9zZXhwIHNleHAgfihjb21wYXJhdG9yIDogXyBDb21wYXJhdG9yLnQpID1cbiAgICBsZXQgYWxpc3QgPSBsaXN0X29mX3NleHAgKHBhaXJfb2Zfc2V4cCBrZXlfb2Zfc2V4cCB2YWx1ZV9vZl9zZXhwKSBzZXhwIGluXG4gICAgbGV0IGNvbXBhcmVfa2V5ID0gY29tcGFyYXRvci5jb21wYXJlIGluXG4gICAgbWF0Y2ggb2ZfYWxpc3QgYWxpc3QgfmNvbXBhcmVfa2V5IHdpdGhcbiAgICB8IGBPayB2IC0+IHZcbiAgICB8IGBEdXBsaWNhdGVfa2V5IGsgLT5cbiAgICAgICgqIGZpbmQgdGhlIHNleHAgb2YgYSBkdXBsaWNhdGUga2V5LCBzbyB0aGUgZXJyb3IgaXMgbmFycm93ZWQgdG8gYSBrZXkgYW5kIG5vdFxuICAgICAgICAgdGhlIHdob2xlIG1hcCAqKVxuICAgICAgbGV0IGFsaXN0X3NleHBzID0gbGlzdF9vZl9zZXhwIChwYWlyX29mX3NleHAgRm4uaWQgRm4uaWQpIHNleHAgaW5cbiAgICAgIGxldCBmb3VuZF9maXJzdF9rID0gcmVmIGZhbHNlIGluXG4gICAgICBMaXN0Lml0ZXIyX29rIGFsaXN0IGFsaXN0X3NleHBzIH5mOihmdW4gKGsyLCBfKSAoazJfc2V4cCwgXykgLT5cbiAgICAgICAgaWYgY29tcGFyZV9rZXkgayBrMiA9IDBcbiAgICAgICAgdGhlblxuICAgICAgICAgIGlmICFmb3VuZF9maXJzdF9rXG4gICAgICAgICAgdGhlbiBvZl9zZXhwX2Vycm9yIFwiTWFwLnRfb2Zfc2V4cF9kaXJlY3Q6IGR1cGxpY2F0ZSBrZXlcIiBrMl9zZXhwXG4gICAgICAgICAgZWxzZSBmb3VuZF9maXJzdF9rIDo9IHRydWUpO1xuICAgICAgYXNzZXJ0IGZhbHNlXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2tleSBzZXhwX29mX3ZhbHVlIHQgPVxuICAgIGxldCBmIH5rZXkgfmRhdGEgYWNjID0gU2V4cC5MaXN0IFsgc2V4cF9vZl9rZXkga2V5OyBzZXhwX29mX3ZhbHVlIGRhdGEgXSA6OiBhY2MgaW5cbiAgICBTZXhwLkxpc3QgKGZvbGRfcmlnaHQgfmYgdCB+aW5pdDpbXSlcbiAgOztcblxuICBsZXQgY29tYmluZV9lcnJvcnMgdCB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5ID1cbiAgICBsZXQgb2tzLCAoZXJyb3JfdHJlZSwgXykgPSBwYXJ0aXRpb25fbWFwIHQgfmNvbXBhcmVfa2V5IH5mOlJlc3VsdC50b19laXRoZXIgaW5cbiAgICBpZiBpc19lbXB0eSBlcnJvcl90cmVlXG4gICAgdGhlbiBPayBva3NcbiAgICBlbHNlIE9yX2Vycm9yLmVycm9yX3MgKHNleHBfb2ZfdCBzZXhwX29mX2tleSBFcnJvci5zZXhwX29mX3QgZXJyb3JfdHJlZSlcbiAgOztcblxuICBsZXQgbWFwX2tleXNcbiAgICAgICAgdDFcbiAgICAgICAgfmZcbiAgICAgICAgfmNvbXBhcmF0b3I6KHsgY29tcGFyZSA9IGNvbXBhcmVfa2V5OyBzZXhwX29mX3QgPSBzZXhwX29mX2tleSB9IDogXyBDb21wYXJhdG9yLnQpXG4gICAgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4geyByZXR1cm4gfSAtPlxuICAgICAgYE9rXG4gICAgICAgIChmb2xkIHQxIH5pbml0OihlbXB0eSwgMCkgfmY6KGZ1biB+a2V5IH5kYXRhICh0MiwgbGVuZ3RoKSAtPlxuICAgICAgICAgICBsZXQga2V5ID0gZiBrZXkgaW5cbiAgICAgICAgICAgdHJ5IGFkZF9leG5faW50ZXJuYWwgdDIgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgd2l0aFxuICAgICAgICAgICB8IER1cGxpY2F0ZSAtPiByZXR1cm4gKGBEdXBsaWNhdGVfa2V5IGtleSkpKSlcbiAgOztcblxuICBsZXQgbWFwX2tleXNfZXhuIHQgfmYgfmNvbXBhcmF0b3IgPVxuICAgIG1hdGNoIG1hcF9rZXlzIHQgfmYgfmNvbXBhcmF0b3Igd2l0aFxuICAgIHwgYE9rIHJlc3VsdCAtPiByZXN1bHRcbiAgICB8IGBEdXBsaWNhdGVfa2V5IGtleSAtPlxuICAgICAgbGV0IHNleHBfb2Zfa2V5ID0gY29tcGFyYXRvci5Db21wYXJhdG9yLnNleHBfb2ZfdCBpblxuICAgICAgRXJyb3IucmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlIFwiTWFwLm1hcF9rZXlzX2V4bjogZHVwbGljYXRlIGtleVwiIFsgXCJrZXlcIiwga2V5IHw+IHNleHBfb2Zfa2V5IF0pXG4gIDs7XG5lbmRcblxudHlwZSAoJ2ssICd2LCAnY29tcGFyYXRvcikgdCA9XG4gIHsgKCogW2NvbXBhcmF0b3JdIGlzIHRoZSBmaXJzdCBmaWVsZCBzbyB0aGF0IHBvbHltb3JwaGljIGVxdWFsaXR5IGZhaWxzIG9uIGEgbWFwIGR1ZVxuICAgICAgIHRvIHRoZSBmdW5jdGlvbmFsIHZhbHVlIGluIHRoZSBjb21wYXJhdG9yLlxuICAgICAgIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFmZmVjdCBwb2x5bW9ycGhpYyBbY29tcGFyZV06IHRoYXQgc3RpbGwgcHJvZHVjZXNcbiAgICAgICBub25zZW5zZS4gKilcbiAgICBjb21wYXJhdG9yIDogKCdrLCAnY29tcGFyYXRvcikgQ29tcGFyYXRvci50XG4gIDsgdHJlZSA6ICgnaywgJ3YpIFRyZWUwLnRcbiAgOyBsZW5ndGggOiBpbnRcbiAgfVxuXG50eXBlICgnaywgJ3YsICdjb21wYXJhdG9yKSB0cmVlID0gKCdrLCAndikgVHJlZTAudFxuXG5sZXQgY29tcGFyZV9rZXkgdCA9IHQuY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcblxuXG5sZXQgbGlrZSB7IHRyZWUgPSBfOyBsZW5ndGggPSBfOyBjb21wYXJhdG9yIH0gKHRyZWUsIGxlbmd0aCkgPVxuICB7IHRyZWU7IGxlbmd0aDsgY29tcGFyYXRvciB9XG47O1xuXG5sZXQgbGlrZTIgeCAoeSwgeikgPSBsaWtlIHggeSwgbGlrZSB4IHpcblxubGV0IGxpa2VfbWF5YmVfbm9fb3AgKHsgdHJlZSA9IG9sZF90cmVlOyBsZW5ndGggPSBfOyBjb21wYXJhdG9yIH0gYXMgb2xkX3QpICh0cmVlLCBsZW5ndGgpXG4gID1cbiAgaWYgcGh5c19lcXVhbCBvbGRfdHJlZSB0cmVlIHRoZW4gb2xkX3QgZWxzZSB7IHRyZWU7IGxlbmd0aDsgY29tcGFyYXRvciB9XG47O1xuXG5sZXQgd2l0aF9zYW1lX2xlbmd0aCB7IHRyZWUgPSBfOyBjb21wYXJhdG9yOyBsZW5ndGggfSB0cmVlID0geyB0cmVlOyBjb21wYXJhdG9yOyBsZW5ndGggfVxubGV0IG9mX3RyZWUgfmNvbXBhcmF0b3IgdHJlZSA9IHsgdHJlZTsgY29tcGFyYXRvcjsgbGVuZ3RoID0gVHJlZTAubGVuZ3RoIHRyZWUgfVxuXG4oKiBFeHBvc2luZyB0aGlzIGZ1bmN0aW9uIHdvdWxkIG1ha2UgaXQgdmVyeSBlYXN5IGZvciB0aGUgaW52YXJpYW50c1xuICAgb2YgdGhpcyBtb2R1bGUgdG8gYmUgYnJva2VuLiAqKVxubGV0IG9mX3RyZWVfdW5zYWZlIH5jb21wYXJhdG9yIH5sZW5ndGggdHJlZSA9IHsgdHJlZTsgY29tcGFyYXRvcjsgbGVuZ3RoIH1cblxubW9kdWxlIEFjY2Vzc29ycyA9IHN0cnVjdFxuICBsZXQgY29tcGFyYXRvciB0ID0gdC5jb21wYXJhdG9yXG4gIGxldCB0b190cmVlIHQgPSB0LnRyZWVcblxuICBsZXQgaW52YXJpYW50cyB0ID1cbiAgICBUcmVlMC5pbnZhcmlhbnRzIHQudHJlZSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpICYmIFRyZWUwLmxlbmd0aCB0LnRyZWUgPSB0Lmxlbmd0aFxuICA7O1xuXG4gIGxldCBpc19lbXB0eSB0ID0gVHJlZTAuaXNfZW1wdHkgdC50cmVlXG4gIGxldCBsZW5ndGggdCA9IHQubGVuZ3RoXG5cbiAgbGV0IHNldCB0IH5rZXkgfmRhdGEgPVxuICAgIGxpa2UgdCAoVHJlZTAuc2V0IHQudHJlZSB+bGVuZ3RoOnQubGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgYWRkX2V4biB0IH5rZXkgfmRhdGEgPVxuICAgIGxpa2VcbiAgICAgIHRcbiAgICAgIChUcmVlMC5hZGRfZXhuXG4gICAgICAgICB0LnRyZWVcbiAgICAgICAgIH5sZW5ndGg6dC5sZW5ndGhcbiAgICAgICAgIH5rZXlcbiAgICAgICAgIH5kYXRhXG4gICAgICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gICAgICAgICB+c2V4cF9vZl9rZXk6dC5jb21wYXJhdG9yLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgYWRkX2V4bl9pbnRlcm5hbCB0IH5rZXkgfmRhdGEgPVxuICAgIGxpa2VcbiAgICAgIHRcbiAgICAgIChUcmVlMC5hZGRfZXhuX2ludGVybmFsXG4gICAgICAgICB0LnRyZWVcbiAgICAgICAgIH5sZW5ndGg6dC5sZW5ndGhcbiAgICAgICAgIH5rZXlcbiAgICAgICAgIH5kYXRhXG4gICAgICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gICAgICAgICB+c2V4cF9vZl9rZXk6dC5jb21wYXJhdG9yLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgYWRkIHQgfmtleSB+ZGF0YSA9XG4gICAgbWF0Y2ggYWRkX2V4bl9pbnRlcm5hbCB0IH5rZXkgfmRhdGEgd2l0aFxuICAgIHwgcmVzdWx0IC0+IGBPayByZXN1bHRcbiAgICB8IGV4Y2VwdGlvbiBEdXBsaWNhdGUgLT4gYER1cGxpY2F0ZVxuICA7O1xuXG4gIGxldCBhZGRfbXVsdGkgdCB+a2V5IH5kYXRhID1cbiAgICBsaWtlXG4gICAgICB0XG4gICAgICAoVHJlZTAuYWRkX211bHRpIHQudHJlZSB+bGVuZ3RoOnQubGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgcmVtb3ZlX211bHRpIHQga2V5ID1cbiAgICBsaWtlIHQgKFRyZWUwLnJlbW92ZV9tdWx0aSB0LnRyZWUgfmxlbmd0aDp0Lmxlbmd0aCBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgZmluZF9tdWx0aSB0IGtleSA9IFRyZWUwLmZpbmRfbXVsdGkgdC50cmVlIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG5cbiAgbGV0IGNoYW5nZSB0IGtleSB+ZiA9XG4gICAgbGlrZSB0IChUcmVlMC5jaGFuZ2UgdC50cmVlIGtleSB+ZiB+bGVuZ3RoOnQubGVuZ3RoIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IHVwZGF0ZSB0IGtleSB+ZiA9XG4gICAgbGlrZSB0IChUcmVlMC51cGRhdGUgdC50cmVlIGtleSB+ZiB+bGVuZ3RoOnQubGVuZ3RoIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IGZpbmRfZXhuIHQga2V5ID1cbiAgICBUcmVlMC5maW5kX2V4blxuICAgICAgdC50cmVlXG4gICAgICBrZXlcbiAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgICAgIH5zZXhwX29mX2tleTp0LmNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IGZpbmQgdCBrZXkgPSBUcmVlMC5maW5kIHQudHJlZSBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuXG4gIGxldCByZW1vdmUgdCBrZXkgPVxuICAgIGxpa2VfbWF5YmVfbm9fb3BcbiAgICAgIHRcbiAgICAgIChUcmVlMC5yZW1vdmUgdC50cmVlIGtleSB+bGVuZ3RoOnQubGVuZ3RoIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IG1lbSB0IGtleSA9IFRyZWUwLm1lbSB0LnRyZWUga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgbGV0IGl0ZXJfa2V5cyB0IH5mID0gVHJlZTAuaXRlcl9rZXlzIHQudHJlZSB+ZlxuICBsZXQgaXRlciB0IH5mID0gVHJlZTAuaXRlciB0LnRyZWUgfmZcbiAgbGV0IGl0ZXJpIHQgfmYgPSBUcmVlMC5pdGVyaSB0LnRyZWUgfmZcbiAgbGV0IGl0ZXJpX3VudGlsIHQgfmYgPSBUcmVlMC5pdGVyaV91bnRpbCB0LnRyZWUgfmZcbiAgbGV0IGl0ZXIyIHQxIHQyIH5mID0gVHJlZTAuaXRlcjIgdDEudHJlZSB0Mi50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpXG4gIGxldCBtYXAgdCB+ZiA9IHdpdGhfc2FtZV9sZW5ndGggdCAoVHJlZTAubWFwIHQudHJlZSB+ZilcbiAgbGV0IG1hcGkgdCB+ZiA9IHdpdGhfc2FtZV9sZW5ndGggdCAoVHJlZTAubWFwaSB0LnRyZWUgfmYpXG4gIGxldCBmb2xkIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkIHQudHJlZSB+ZiB+aW5pdFxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF91bnRpbCB0LnRyZWUgfmYgfmluaXRcbiAgbGV0IGZvbGRfcmlnaHQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfcmlnaHQgdC50cmVlIH5mIH5pbml0XG5cbiAgbGV0IGZvbGQyIHQxIHQyIH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkMiB0MS50cmVlIHQyLnRyZWUgfmluaXQgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSlcbiAgOztcblxuICBsZXQgZmlsdGVyX2tleXMgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyX2tleXMgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIGxldCBmaWx0ZXIgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICBsZXQgZmlsdGVyaSB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXJpIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICBsZXQgZmlsdGVyX21hcCB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXJfbWFwIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICBsZXQgZmlsdGVyX21hcGkgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyX21hcGkgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG5cbiAgbGV0IHBhcnRpdGlvbl9tYXBpIHQgfmYgPVxuICAgIGxpa2UyIHQgKFRyZWUwLnBhcnRpdGlvbl9tYXBpIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fbWFwIHQgfmYgPVxuICAgIGxpa2UyIHQgKFRyZWUwLnBhcnRpdGlvbl9tYXAgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbmlfdGYgdCB+ZiA9XG4gICAgbGlrZTIgdCAoVHJlZTAucGFydGl0aW9uaV90ZiB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX3RmIHQgfmYgPVxuICAgIGxpa2UyIHQgKFRyZWUwLnBhcnRpdGlvbl90ZiB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgY29tYmluZV9lcnJvcnMgdCA9XG4gICAgT3JfZXJyb3IubWFwXG4gICAgICB+ZjoobGlrZSB0KVxuICAgICAgKFRyZWUwLmNvbWJpbmVfZXJyb3JzXG4gICAgICAgICB0LnRyZWVcbiAgICAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgICAgICAgIH5zZXhwX29mX2tleTp0LmNvbXBhcmF0b3Iuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBjb21wYXJlX2RpcmVjdCBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgIFRyZWUwLmNvbXBhcmUgKGNvbXBhcmVfa2V5IHQxKSBjb21wYXJlX2RhdGEgdDEudHJlZSB0Mi50cmVlXG4gIDs7XG5cbiAgbGV0IGVxdWFsIGNvbXBhcmVfZGF0YSB0MSB0MiA9IFRyZWUwLmVxdWFsIChjb21wYXJlX2tleSB0MSkgY29tcGFyZV9kYXRhIHQxLnRyZWUgdDIudHJlZVxuICBsZXQga2V5cyB0ID0gVHJlZTAua2V5cyB0LnRyZWVcbiAgbGV0IGRhdGEgdCA9IFRyZWUwLmRhdGEgdC50cmVlXG4gIGxldCB0b19hbGlzdCA/a2V5X29yZGVyIHQgPSBUcmVlMC50b19hbGlzdCA/a2V5X29yZGVyIHQudHJlZVxuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiB0MSB0MiB+ZGF0YV9lcXVhbCA9XG4gICAgVHJlZTAuc3ltbWV0cmljX2RpZmYgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpIH5kYXRhX2VxdWFsXG4gIDs7XG5cbiAgbGV0IGZvbGRfc3ltbWV0cmljX2RpZmYgdDEgdDIgfmRhdGFfZXF1YWwgfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICAgIHQxLnRyZWVcbiAgICAgIHQyLnRyZWVcbiAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpXG4gICAgICB+ZGF0YV9lcXVhbFxuICAgICAgfmluaXRcbiAgICAgIH5mXG4gIDs7XG5cbiAgbGV0IG1lcmdlIHQxIHQyIH5mID1cbiAgICBsaWtlIHQxIChUcmVlMC5tZXJnZSB0MS50cmVlIHQyLnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSkpXG4gIDs7XG5cbiAgbGV0IG1lcmdlX3NrZXdlZCB0MSB0MiB+Y29tYmluZSA9XG4gICAgKCogVGhpcyBpcyBvbmx5IGEgbm8tb3AgaW4gdGhlIGNhc2Ugd2hlcmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBtYXBzIGlzIGVtcHR5LiAqKVxuICAgIGxpa2VfbWF5YmVfbm9fb3BcbiAgICAgIChpZiB0Mi5sZW5ndGggPD0gdDEubGVuZ3RoIHRoZW4gdDEgZWxzZSB0MilcbiAgICAgIChUcmVlMC5tZXJnZV9za2V3ZWRcbiAgICAgICAgIHQxLnRyZWVcbiAgICAgICAgIHQyLnRyZWVcbiAgICAgICAgIH5sZW5ndGgxOnQxLmxlbmd0aFxuICAgICAgICAgfmxlbmd0aDI6dDIubGVuZ3RoXG4gICAgICAgICB+Y29tYmluZVxuICAgICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0MSkpXG4gIDs7XG5cbiAgbGV0IG1pbl9lbHQgdCA9IFRyZWUwLm1pbl9lbHQgdC50cmVlXG4gIGxldCBtaW5fZWx0X2V4biB0ID0gVHJlZTAubWluX2VsdF9leG4gdC50cmVlXG4gIGxldCBtYXhfZWx0IHQgPSBUcmVlMC5tYXhfZWx0IHQudHJlZVxuICBsZXQgbWF4X2VsdF9leG4gdCA9IFRyZWUwLm1heF9lbHRfZXhuIHQudHJlZVxuICBsZXQgZm9yX2FsbCB0IH5mID0gVHJlZTAuZm9yX2FsbCB0LnRyZWUgfmZcbiAgbGV0IGZvcl9hbGxpIHQgfmYgPSBUcmVlMC5mb3JfYWxsaSB0LnRyZWUgfmZcbiAgbGV0IGV4aXN0cyB0IH5mID0gVHJlZTAuZXhpc3RzIHQudHJlZSB+ZlxuICBsZXQgZXhpc3RzaSB0IH5mID0gVHJlZTAuZXhpc3RzaSB0LnRyZWUgfmZcbiAgbGV0IGNvdW50IHQgfmYgPSBUcmVlMC5jb3VudCB0LnRyZWUgfmZcbiAgbGV0IGNvdW50aSB0IH5mID0gVHJlZTAuY291bnRpIHQudHJlZSB+ZlxuXG4gIGxldCBzcGxpdCB0IGsgPVxuICAgIGxldCBsLCBtYXliZSwgciA9IFRyZWUwLnNwbGl0IHQudHJlZSBrIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkgaW5cbiAgICBsZXQgY29tcGFyYXRvciA9IGNvbXBhcmF0b3IgdCBpblxuICAgICgqIFRyeSB0byB0cmF2ZXJzZSB0aGUgbGVhc3QgYW1vdW50IHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoLFxuICAgICAgIHVzaW5nIGhlaWdodCBhcyBhIGhldXJpc3RpYy4gKilcbiAgICBsZXQgYm90aF9sZW4gPSBpZiBPcHRpb24uaXNfc29tZSBtYXliZSB0aGVuIHQubGVuZ3RoIC0gMSBlbHNlIHQubGVuZ3RoIGluXG4gICAgaWYgVHJlZTAuaGVpZ2h0IGwgPCBUcmVlMC5oZWlnaHQgclxuICAgIHRoZW4gKFxuICAgICAgbGV0IGwgPSBvZl90cmVlIGwgfmNvbXBhcmF0b3IgaW5cbiAgICAgIGwsIG1heWJlLCBvZl90cmVlX3Vuc2FmZSByIH5jb21wYXJhdG9yIH5sZW5ndGg6KGJvdGhfbGVuIC0gbGVuZ3RoIGwpKVxuICAgIGVsc2UgKFxuICAgICAgbGV0IHIgPSBvZl90cmVlIHIgfmNvbXBhcmF0b3IgaW5cbiAgICAgIG9mX3RyZWVfdW5zYWZlIGwgfmNvbXBhcmF0b3Igfmxlbmd0aDooYm90aF9sZW4gLSBsZW5ndGggciksIG1heWJlLCByKVxuICA7O1xuXG4gIGxldCBzdWJyYW5nZSB0IH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgPVxuICAgIGxldCBsZWZ0LCBtaWQsIHJpZ2h0ID1cbiAgICAgIFRyZWUwLnNwbGl0X3JhbmdlIHQudHJlZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgICBpblxuICAgICgqIFRyeSB0byB0cmF2ZXJzZSB0aGUgbGVhc3QgYW1vdW50IHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoLFxuICAgICAgIHVzaW5nIGhlaWdodCBhcyBhIGhldXJpc3RpYy4gKilcbiAgICBsZXQgb3V0ZXJfam9pbmVkX2hlaWdodCA9XG4gICAgICBsZXQgaF9sID0gVHJlZTAuaGVpZ2h0IGxlZnRcbiAgICAgIGFuZCBoX3IgPSBUcmVlMC5oZWlnaHQgcmlnaHQgaW5cbiAgICAgIGlmIGhfbCA9IGhfciB0aGVuIGhfbCArIDEgZWxzZSBtYXggaF9sIGhfclxuICAgIGluXG4gICAgaWYgb3V0ZXJfam9pbmVkX2hlaWdodCA8IFRyZWUwLmhlaWdodCBtaWRcbiAgICB0aGVuIChcbiAgICAgIGxldCBtaWRfbGVuZ3RoID0gdC5sZW5ndGggLSAoVHJlZTAubGVuZ3RoIGxlZnQgKyBUcmVlMC5sZW5ndGggcmlnaHQpIGluXG4gICAgICBvZl90cmVlX3Vuc2FmZSBtaWQgfmNvbXBhcmF0b3I6KGNvbXBhcmF0b3IgdCkgfmxlbmd0aDptaWRfbGVuZ3RoKVxuICAgIGVsc2Ugb2ZfdHJlZSBtaWQgfmNvbXBhcmF0b3I6KGNvbXBhcmF0b3IgdClcbiAgOztcblxuICBsZXQgYXBwZW5kIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0ID1cbiAgICBtYXRjaFxuICAgICAgVHJlZTAuYXBwZW5kXG4gICAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgbG93ZXJfcGFydClcbiAgICAgICAgfmxvd2VyX3BhcnQ6bG93ZXJfcGFydC50cmVlXG4gICAgICAgIH51cHBlcl9wYXJ0OnVwcGVyX3BhcnQudHJlZVxuICAgIHdpdGhcbiAgICB8IGBPayB0cmVlIC0+XG4gICAgICBgT2tcbiAgICAgICAgKG9mX3RyZWVfdW5zYWZlXG4gICAgICAgICAgIHRyZWVcbiAgICAgICAgICAgfmNvbXBhcmF0b3I6KGNvbXBhcmF0b3IgbG93ZXJfcGFydClcbiAgICAgICAgICAgfmxlbmd0aDoobG93ZXJfcGFydC5sZW5ndGggKyB1cHBlcl9wYXJ0Lmxlbmd0aCkpXG4gICAgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyAtPiBgT3ZlcmxhcHBpbmdfa2V5X3Jhbmdlc1xuICA7O1xuXG4gIGxldCBmb2xkX3JhbmdlX2luY2x1c2l2ZSB0IH5taW4gfm1heCB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZF9yYW5nZV9pbmNsdXNpdmUgdC50cmVlIH5taW4gfm1heCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gIDs7XG5cbiAgbGV0IHJhbmdlX3RvX2FsaXN0IHQgfm1pbiB+bWF4ID1cbiAgICBUcmVlMC5yYW5nZV90b19hbGlzdCB0LnRyZWUgfm1pbiB+bWF4IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgOztcblxuICBsZXQgY2xvc2VzdF9rZXkgdCBkaXIga2V5ID1cbiAgICBUcmVlMC5jbG9zZXN0X2tleSB0LnRyZWUgZGlyIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gIDs7XG5cbiAgbGV0IG50aCB0IG4gPSBUcmVlMC5udGggdC50cmVlIG5cbiAgbGV0IG50aF9leG4gdCBuID0gT3B0aW9uLnZhbHVlX2V4biAobnRoIHQgbilcbiAgbGV0IHJhbmsgdCBrZXkgPSBUcmVlMC5yYW5rIHQudHJlZSBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfayBzZXhwX29mX3YgXyB0ID0gVHJlZTAuc2V4cF9vZl90IHNleHBfb2ZfayBzZXhwX29mX3YgdC50cmVlXG5cbiAgbGV0IHRvX3NlcXVlbmNlID9vcmRlciA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG8gdCA9XG4gICAgVHJlZTAudG9fc2VxdWVuY2VcbiAgICAgIHQuY29tcGFyYXRvclxuICAgICAgP29yZGVyXG4gICAgICA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvXG4gICAgICA/a2V5c19sZXNzX29yX2VxdWFsX3RvXG4gICAgICB0LnRyZWVcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2ID0gVHJlZTAuYmluYXJ5X3NlYXJjaCB0LnRyZWUgfmNvbXBhcmUgaG93IHZcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIFRyZWUwLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQudHJlZSB+c2VnbWVudF9vZiBob3dcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX2RpcmVjdCBoYXNoX2ZvbGRfa2V5IGhhc2hfZm9sZF9kYXRhIHN0YXRlIHQgPVxuICAgIFRyZWUwLmhhc2hfZm9sZF90X2lnbm9yaW5nX3N0cnVjdHVyZSBoYXNoX2ZvbGRfa2V5IGhhc2hfZm9sZF9kYXRhIHN0YXRlIHQudHJlZVxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlIHQgfmNvbXBhcmUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCA9XG4gICAgbWF0Y2hcbiAgICAgIFRyZWUwLmJpbmFyeV9zZWFyY2hfdHdvX3NpZGVkX2JvdW5kcyB0LnRyZWUgfmNvbXBhcmUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZFxuICAgIHdpdGhcbiAgICB8IFNvbWUgKGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCkgLT4gc3VicmFuZ2UgdCB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kXG4gICAgfCBOb25lIC0+IGxpa2VfbWF5YmVfbm9fb3AgdCAoRW1wdHksIDApXG4gIDs7XG5lbmRcblxuKCogWzBdIGlzIHVzZWQgYXMgdGhlIFtsZW5ndGhdIGFyZ3VtZW50IGV2ZXJ5d2hlcmUgaW4gdGhpcyBtb2R1bGUsIHNpbmNlIHRyZWVzIGRvIG5vdFxuICAgaGF2ZSB0aGVpciBsZW5ndGhzIHN0b3JlZCBhdCB0aGUgcm9vdCwgdW5saWtlIG1hcHMuIFRoZSB2YWx1ZXMgYXJlIGRpc2NhcmRlZCBhbHdheXMuICopXG5tb2R1bGUgVHJlZSA9IHN0cnVjdFxuICB0eXBlICgnaywgJ3YsICdjb21wYXJhdG9yKSB0ID0gKCdrLCAndiwgJ2NvbXBhcmF0b3IpIHRyZWVcblxuICBsZXQgZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiA9IFRyZWUwLmVtcHR5XG4gIGxldCBlbXB0eSB+Y29tcGFyYXRvcjpfID0gZW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvblxuICBsZXQgb2ZfdHJlZSB+Y29tcGFyYXRvcjpfIHRyZWUgPSB0cmVlXG4gIGxldCBzaW5nbGV0b24gfmNvbXBhcmF0b3I6XyBrIHYgPSBUcmVlMC5zaW5nbGV0b24gayB2XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIGZzdCAoVHJlZTAub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgVHJlZTAub2Zfc29ydGVkX2FycmF5IGFycmF5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIHw+IE9yX2Vycm9yLm1hcCB+Zjpmc3RcbiAgOztcblxuICBsZXQgb2ZfYWxpc3QgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIG1hdGNoIFRyZWUwLm9mX2FsaXN0IGFsaXN0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIGQgLT4gZFxuICAgIHwgYE9rICh0cmVlLCBfc2l6ZSkgLT4gYE9rIHRyZWVcbiAgOztcblxuICBsZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIFRyZWUwLm9mX2FsaXN0X29yX2Vycm9yIGFsaXN0IH5jb21wYXJhdG9yIHw+IE9yX2Vycm9yLm1hcCB+Zjpmc3RcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfZXhuIH5jb21wYXJhdG9yIGFsaXN0ID0gZnN0IChUcmVlMC5vZl9hbGlzdF9leG4gYWxpc3QgfmNvbXBhcmF0b3IpXG5cbiAgbGV0IG9mX2FsaXN0X211bHRpIH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBmc3QgKFRyZWUwLm9mX2FsaXN0X211bHRpIGFsaXN0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfZm9sZCB+Y29tcGFyYXRvciBhbGlzdCB+aW5pdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5vZl9hbGlzdF9mb2xkIGFsaXN0IH5pbml0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfcmVkdWNlIH5jb21wYXJhdG9yIGFsaXN0IH5mID1cbiAgICBmc3QgKFRyZWUwLm9mX2FsaXN0X3JlZHVjZSBhbGlzdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2l0ZXJpIH5jb21wYXJhdG9yIH5pdGVyaSA9XG4gICAgbWF0Y2ggVHJlZTAub2ZfaXRlcmkgfml0ZXJpIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgT2sgKHRyZWUsIF9zaXplKSAtPiBgT2sgdHJlZVxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyBkIC0+IGRcbiAgOztcblxuICBsZXQgb2ZfaXRlcmlfZXhuIH5jb21wYXJhdG9yIH5pdGVyaSA9IGZzdCAoVHJlZTAub2ZfaXRlcmlfZXhuIH5pdGVyaSB+Y29tcGFyYXRvcilcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3I6X3JlcXVpcmVkX2J5X2ludGYgfmxlbiB+ZiA9XG4gICAgVHJlZTAub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZlxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgT3JfZXJyb3IubWFwXG4gICAgICB+Zjpmc3RcbiAgICAgIChUcmVlMC5vZl9pbmNyZWFzaW5nX3NlcXVlbmNlIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgbWF0Y2ggVHJlZTAub2Zfc2VxdWVuY2Ugc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIGQgLT4gZFxuICAgIHwgYE9rICh0cmVlLCBfc2l6ZSkgLT4gYE9rIHRyZWVcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBUcmVlMC5vZl9zZXF1ZW5jZV9vcl9lcnJvciBzZXEgfmNvbXBhcmF0b3IgfD4gT3JfZXJyb3IubWFwIH5mOmZzdFxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9leG4gfmNvbXBhcmF0b3Igc2VxID0gZnN0IChUcmVlMC5vZl9zZXF1ZW5jZV9leG4gc2VxIH5jb21wYXJhdG9yKVxuXG4gIGxldCBvZl9zZXF1ZW5jZV9tdWx0aSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIGZzdCAoVHJlZTAub2Zfc2VxdWVuY2VfbXVsdGkgc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfZm9sZCB+Y29tcGFyYXRvciBzZXEgfmluaXQgfmYgPVxuICAgIGZzdCAoVHJlZTAub2Zfc2VxdWVuY2VfZm9sZCBzZXEgfmluaXQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9yZWR1Y2UgfmNvbXBhcmF0b3Igc2VxIH5mID1cbiAgICBmc3QgKFRyZWUwLm9mX3NlcXVlbmNlX3JlZHVjZSBzZXEgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCB0b190cmVlIHQgPSB0XG5cbiAgbGV0IGludmFyaWFudHMgfmNvbXBhcmF0b3IgdCA9XG4gICAgVHJlZTAuaW52YXJpYW50cyB0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBpc19lbXB0eSB0ID0gVHJlZTAuaXNfZW1wdHkgdFxuICBsZXQgbGVuZ3RoIHQgPSBUcmVlMC5sZW5ndGggdFxuXG4gIGxldCBzZXQgfmNvbXBhcmF0b3IgdCB+a2V5IH5kYXRhID1cbiAgICBmc3QgKFRyZWUwLnNldCB0IH5rZXkgfmRhdGEgfmxlbmd0aDowIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgYWRkX2V4biB+Y29tcGFyYXRvciB0IH5rZXkgfmRhdGEgPVxuICAgIGZzdFxuICAgICAgKFRyZWUwLmFkZF9leG5cbiAgICAgICAgIHRcbiAgICAgICAgIH5rZXlcbiAgICAgICAgIH5kYXRhXG4gICAgICAgICB+bGVuZ3RoOjBcbiAgICAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgICAgfnNleHBfb2Zfa2V5OmNvbXBhcmF0b3Iuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBhZGQgfmNvbXBhcmF0b3IgdCB+a2V5IH5kYXRhID1cbiAgICB0cnkgYE9rIChhZGRfZXhuIHQgfmNvbXBhcmF0b3IgfmtleSB+ZGF0YSkgd2l0aFxuICAgIHwgXyAtPiBgRHVwbGljYXRlXG4gIDs7XG5cbiAgbGV0IGFkZF9tdWx0aSB+Y29tcGFyYXRvciB0IH5rZXkgfmRhdGEgPVxuICAgIFRyZWUwLmFkZF9tdWx0aSB0IH5rZXkgfmRhdGEgfmxlbmd0aDowIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIHw+IGZzdFxuICA7O1xuXG4gIGxldCByZW1vdmVfbXVsdGkgfmNvbXBhcmF0b3IgdCBrZXkgPVxuICAgIFRyZWUwLnJlbW92ZV9tdWx0aSB0IGtleSB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHw+IGZzdFxuICA7O1xuXG4gIGxldCBmaW5kX211bHRpIH5jb21wYXJhdG9yIHQga2V5ID1cbiAgICBUcmVlMC5maW5kX211bHRpIHQga2V5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBjaGFuZ2UgfmNvbXBhcmF0b3IgdCBrZXkgfmYgPVxuICAgIGZzdCAoVHJlZTAuY2hhbmdlIHQga2V5IH5mIH5sZW5ndGg6MCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IHVwZGF0ZSB+Y29tcGFyYXRvciB0IGtleSB+ZiA9XG4gICAgY2hhbmdlIH5jb21wYXJhdG9yIHQga2V5IH5mOihmdW4gZGF0YSAtPiBTb21lIChmIGRhdGEpKVxuICA7O1xuXG4gIGxldCBmaW5kX2V4biB+Y29tcGFyYXRvciB0IGtleSA9XG4gICAgVHJlZTAuZmluZF9leG5cbiAgICAgIHRcbiAgICAgIGtleVxuICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgICB+c2V4cF9vZl9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCBmaW5kIH5jb21wYXJhdG9yIHQga2V5ID0gVHJlZTAuZmluZCB0IGtleSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcblxuICBsZXQgcmVtb3ZlIH5jb21wYXJhdG9yIHQga2V5ID1cbiAgICBmc3QgKFRyZWUwLnJlbW92ZSB0IGtleSB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBtZW0gfmNvbXBhcmF0b3IgdCBrZXkgPSBUcmVlMC5tZW0gdCBrZXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIGxldCBpdGVyX2tleXMgdCB+ZiA9IFRyZWUwLml0ZXJfa2V5cyB0IH5mXG4gIGxldCBpdGVyIHQgfmYgPSBUcmVlMC5pdGVyIHQgfmZcbiAgbGV0IGl0ZXJpIHQgfmYgPSBUcmVlMC5pdGVyaSB0IH5mXG4gIGxldCBpdGVyaV91bnRpbCB0IH5mID0gVHJlZTAuaXRlcmlfdW50aWwgdCB+ZlxuXG4gIGxldCBpdGVyMiB+Y29tcGFyYXRvciB0MSB0MiB+ZiA9XG4gICAgVHJlZTAuaXRlcjIgdDEgdDIgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IG1hcCB0IH5mID0gVHJlZTAubWFwIHQgfmZcbiAgbGV0IG1hcGkgdCB+ZiA9IFRyZWUwLm1hcGkgdCB+ZlxuICBsZXQgZm9sZCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZCB0IH5mIH5pbml0XG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaCA9IFRyZWUwLmZvbGRfdW50aWwgdCB+ZiB+aW5pdCB+ZmluaXNoXG4gIGxldCBmb2xkX3JpZ2h0IHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3JpZ2h0IHQgfmYgfmluaXRcblxuICBsZXQgZm9sZDIgfmNvbXBhcmF0b3IgdDEgdDIgfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGQyIHQxIHQyIH5pbml0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfa2V5cyB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBmc3QgKFRyZWUwLmZpbHRlcl9rZXlzIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBmaWx0ZXIgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5maWx0ZXIgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcmkgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5maWx0ZXJpIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGZzdCAoVHJlZTAuZmlsdGVyX21hcCB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgZmlsdGVyX21hcGkgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5maWx0ZXJfbWFwaSB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX21hcGkgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbGV0IChhLCBfKSwgKGIsIF8pID1cbiAgICAgIFRyZWUwLnBhcnRpdGlvbl9tYXBpIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBhLCBiXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl9tYXAgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbGV0IChhLCBfKSwgKGIsIF8pID1cbiAgICAgIFRyZWUwLnBhcnRpdGlvbl9tYXAgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIGEsIGJcbiAgOztcblxuICBsZXQgcGFydGl0aW9uaV90ZiB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBsZXQgKGEsIF8pLCAoYiwgXykgPVxuICAgICAgVHJlZTAucGFydGl0aW9uaV90ZiB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgYSwgYlxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fdGYgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbGV0IChhLCBfKSwgKGIsIF8pID1cbiAgICAgIFRyZWUwLnBhcnRpdGlvbl90ZiB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgYSwgYlxuICA7O1xuXG4gIGxldCBjb21iaW5lX2Vycm9ycyB+Y29tcGFyYXRvciB0ID1cbiAgICBPcl9lcnJvci5tYXBcbiAgICAgIH5mOmZzdFxuICAgICAgKFRyZWUwLmNvbWJpbmVfZXJyb3JzXG4gICAgICAgICB0XG4gICAgICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICAgICAgIH5zZXhwX29mX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3Iuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBjb21wYXJlX2RpcmVjdCB+Y29tcGFyYXRvciBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgIFRyZWUwLmNvbXBhcmUgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgY29tcGFyZV9kYXRhIHQxIHQyXG4gIDs7XG5cbiAgbGV0IGVxdWFsIH5jb21wYXJhdG9yIGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgVHJlZTAuZXF1YWwgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgY29tcGFyZV9kYXRhIHQxIHQyXG4gIDs7XG5cbiAgbGV0IGtleXMgdCA9IFRyZWUwLmtleXMgdFxuICBsZXQgZGF0YSB0ID0gVHJlZTAuZGF0YSB0XG4gIGxldCB0b19hbGlzdCA/a2V5X29yZGVyIHQgPSBUcmVlMC50b19hbGlzdCA/a2V5X29yZGVyIHRcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgfmNvbXBhcmF0b3IgdDEgdDIgfmRhdGFfZXF1YWwgPVxuICAgIFRyZWUwLnN5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB+ZGF0YV9lcXVhbFxuICA7O1xuXG4gIGxldCBmb2xkX3N5bW1ldHJpY19kaWZmIH5jb21wYXJhdG9yIHQxIHQyIH5kYXRhX2VxdWFsIH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgICB0MVxuICAgICAgdDJcbiAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgfmRhdGFfZXF1YWxcbiAgICAgIH5pbml0XG4gICAgICB+ZlxuICA7O1xuXG4gIGxldCBtZXJnZSB+Y29tcGFyYXRvciB0MSB0MiB+ZiA9XG4gICAgZnN0IChUcmVlMC5tZXJnZSB0MSB0MiB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG1lcmdlX3NrZXdlZCB+Y29tcGFyYXRvciB0MSB0MiB+Y29tYmluZSA9XG4gICAgKCogTGVuZ3RoIGNvbXB1dGF0aW9uIG1ha2VzIHRoaXMgc2lnbmlmaWNhbnRseSBzbG93ZXIgdGhhbiBbbWVyZ2Vfc2tld2VkXSBvbiBhIG1hcFxuICAgICAgIHdpdGggYSBbbGVuZ3RoXSBmaWVsZCwgYnV0IGRvZXMgcHJlc2VydmUgYW1vdW50IG9mIGFsbG9jYXRpb24uICopXG4gICAgZnN0XG4gICAgICAoVHJlZTAubWVyZ2Vfc2tld2VkXG4gICAgICAgICB0MVxuICAgICAgICAgdDJcbiAgICAgICAgIH5sZW5ndGgxOihsZW5ndGggdDEpXG4gICAgICAgICB+bGVuZ3RoMjoobGVuZ3RoIHQyKVxuICAgICAgICAgfmNvbWJpbmVcbiAgICAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgbWluX2VsdCB0ID0gVHJlZTAubWluX2VsdCB0XG4gIGxldCBtaW5fZWx0X2V4biB0ID0gVHJlZTAubWluX2VsdF9leG4gdFxuICBsZXQgbWF4X2VsdCB0ID0gVHJlZTAubWF4X2VsdCB0XG4gIGxldCBtYXhfZWx0X2V4biB0ID0gVHJlZTAubWF4X2VsdF9leG4gdFxuICBsZXQgZm9yX2FsbCB0IH5mID0gVHJlZTAuZm9yX2FsbCB0IH5mXG4gIGxldCBmb3JfYWxsaSB0IH5mID0gVHJlZTAuZm9yX2FsbGkgdCB+ZlxuICBsZXQgZXhpc3RzIHQgfmYgPSBUcmVlMC5leGlzdHMgdCB+ZlxuICBsZXQgZXhpc3RzaSB0IH5mID0gVHJlZTAuZXhpc3RzaSB0IH5mXG4gIGxldCBjb3VudCB0IH5mID0gVHJlZTAuY291bnQgdCB+ZlxuICBsZXQgY291bnRpIHQgfmYgPSBUcmVlMC5jb3VudGkgdCB+ZlxuICBsZXQgc3BsaXQgfmNvbXBhcmF0b3IgdCBrID0gVHJlZTAuc3BsaXQgdCBrIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuXG4gIGxldCBhcHBlbmQgfmNvbXBhcmF0b3Igfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnQgPVxuICAgIFRyZWUwLmFwcGVuZCB+bG93ZXJfcGFydCB+dXBwZXJfcGFydCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgc3VicmFuZ2UgfmNvbXBhcmF0b3IgdCB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kID1cbiAgICBsZXQgXywgcmV0LCBfID1cbiAgICAgIFRyZWUwLnNwbGl0X3JhbmdlXG4gICAgICAgIHRcbiAgICAgICAgfmxvd2VyX2JvdW5kXG4gICAgICAgIH51cHBlcl9ib3VuZFxuICAgICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIHJldFxuICA7O1xuXG4gIGxldCBmb2xkX3JhbmdlX2luY2x1c2l2ZSB+Y29tcGFyYXRvciB0IH5taW4gfm1heCB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICAgIHRcbiAgICAgIH5taW5cbiAgICAgIH5tYXhcbiAgICAgIH5pbml0XG4gICAgICB+ZlxuICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IHJhbmdlX3RvX2FsaXN0IH5jb21wYXJhdG9yIHQgfm1pbiB+bWF4ID1cbiAgICBUcmVlMC5yYW5nZV90b19hbGlzdCB0IH5taW4gfm1heCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgY2xvc2VzdF9rZXkgfmNvbXBhcmF0b3IgdCBkaXIga2V5ID1cbiAgICBUcmVlMC5jbG9zZXN0X2tleSB0IGRpciBrZXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IG50aCB0IG4gPSBUcmVlMC5udGggdCBuXG4gIGxldCBudGhfZXhuIHQgbiA9IE9wdGlvbi52YWx1ZV9leG4gKG50aCB0IG4pXG4gIGxldCByYW5rIH5jb21wYXJhdG9yIHQga2V5ID0gVHJlZTAucmFuayB0IGtleSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2sgc2V4cF9vZl92IF8gdCA9IFRyZWUwLnNleHBfb2ZfdCBzZXhwX29mX2sgc2V4cF9vZl92IHRcblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvciBrX29mX3NleHAgdl9vZl9zZXhwIHNleHAgPVxuICAgIGZzdCAoVHJlZTAudF9vZl9zZXhwX2RpcmVjdCBrX29mX3NleHAgdl9vZl9zZXhwIHNleHAgfmNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IHRvX3NlcXVlbmNlIH5jb21wYXJhdG9yID9vcmRlciA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG8gdCA9XG4gICAgVHJlZTAudG9fc2VxdWVuY2UgY29tcGFyYXRvciA/b3JkZXIgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90byA/a2V5c19sZXNzX29yX2VxdWFsX3RvIHRcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB+Y29tcGFyYXRvcjpfIHQgfmNvbXBhcmUgaG93IHYgPSBUcmVlMC5iaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHZcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgfmNvbXBhcmF0b3I6XyB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgVHJlZTAuYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiBob3dcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZSB+Y29tcGFyYXRvciB0IH5jb21wYXJlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgPVxuICAgIG1hdGNoIFRyZWUwLmJpbmFyeV9zZWFyY2hfdHdvX3NpZGVkX2JvdW5kcyB0IH5jb21wYXJlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgd2l0aFxuICAgIHwgU29tZSAobG93ZXJfYm91bmQsIHVwcGVyX2JvdW5kKSAtPiBzdWJyYW5nZSB+Y29tcGFyYXRvciB0IH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmRcbiAgICB8IE5vbmUgLT4gRW1wdHlcbiAgOztcblxuICBsZXQgbWFwX2tleXMgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbWF0Y2ggVHJlZTAubWFwX2tleXMgfmNvbXBhcmF0b3IgdCB+ZiB3aXRoXG4gICAgfCBgT2sgKHQsIF8pIC0+IGBPayB0XG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIGR1cCAtPiBkdXBcbiAgOztcblxuICBsZXQgbWFwX2tleXNfZXhuIH5jb21wYXJhdG9yIHQgfmYgPSBmc3QgKFRyZWUwLm1hcF9rZXlzX2V4biB+Y29tcGFyYXRvciB0IH5mKVxuXG4gIG1vZHVsZSBCdWlsZF9pbmNyZWFzaW5nID0gc3RydWN0XG4gICAgdHlwZSAoJ2ssICd2LCAndykgdCA9ICgnaywgJ3YpIFRyZWUwLkJ1aWxkX2luY3JlYXNpbmcudFxuXG4gICAgbGV0IGVtcHR5ID0gVHJlZTAuQnVpbGRfaW5jcmVhc2luZy5lbXB0eVxuXG4gICAgbGV0IGFkZF9leG4gdCB+Y29tcGFyYXRvciB+a2V5IH5kYXRhID1cbiAgICAgIG1hdGNoIFRyZWUwLkJ1aWxkX2luY3JlYXNpbmcubWF4X2tleSB0IHdpdGhcbiAgICAgIHwgU29tZSBwcmV2X2tleSB3aGVuIGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHByZXZfa2V5IGtleSA+PSAwIC0+XG4gICAgICAgIEVycm9yLnJhaXNlX3MgKFNleHAuQXRvbSBcIk1hcC5CdWlsZF9pbmNyZWFzaW5nLmFkZDogbm9uLWluY3JlYXNpbmcga2V5XCIpXG4gICAgICB8IF8gLT4gVHJlZTAuQnVpbGRfaW5jcmVhc2luZy5hZGRfdW5jaGVja2VkIHQgfmtleSB+ZGF0YVxuICAgIDs7XG5cbiAgICBsZXQgdG9fdHJlZSB0ID0gVHJlZTAuQnVpbGRfaW5jcmVhc2luZy50b190cmVlX3VuY2hlY2tlZCB0XG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBVc2luZ19jb21wYXJhdG9yID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICgnaywgJ3YsICdjbXApIHQgPSAoJ2ssICd2LCAnY21wKSB0XG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgZW1wdHkgfmNvbXBhcmF0b3IgPSB7IHRyZWUgPSBUcmVlMC5lbXB0eTsgY29tcGFyYXRvcjsgbGVuZ3RoID0gMCB9XG4gIGxldCBzaW5nbGV0b24gfmNvbXBhcmF0b3IgayB2ID0geyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAuc2luZ2xldG9uIGsgdjsgbGVuZ3RoID0gMSB9XG4gIGxldCBvZl90cmVlMCB+Y29tcGFyYXRvciAodHJlZSwgbGVuZ3RoKSA9IHsgY29tcGFyYXRvcjsgdHJlZTsgbGVuZ3RoIH1cbiAgbGV0IG9mX3RyZWUgfmNvbXBhcmF0b3IgdHJlZSA9IG9mX3RyZWUwIH5jb21wYXJhdG9yICh0cmVlLCBUcmVlMC5sZW5ndGggdHJlZSlcbiAgbGV0IHRvX3RyZWUgPSB0b190cmVlXG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIE9yX2Vycm9yLm1hcFxuICAgICAgKFRyZWUwLm9mX3NvcnRlZF9hcnJheSBhcnJheSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gICAgICB+ZjooZnVuIHRyZWUgLT4gb2ZfdHJlZTAgfmNvbXBhcmF0b3IgdHJlZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3QgfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIG1hdGNoIFRyZWUwLm9mX2FsaXN0IGFsaXN0IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgT2sgKHRyZWUsIGxlbmd0aCkgLT4gYE9rIHsgY29tcGFyYXRvcjsgdHJlZTsgbGVuZ3RoIH1cbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgeiAtPiB6XG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X29yX2Vycm9yIH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBSZXN1bHQubWFwIChUcmVlMC5vZl9hbGlzdF9vcl9lcnJvciBhbGlzdCB+Y29tcGFyYXRvcikgfmY6KGZ1biB0cmVlIC0+XG4gICAgICBvZl90cmVlMCB+Y29tcGFyYXRvciB0cmVlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9leG4gfmNvbXBhcmF0b3IgYWxpc3QgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC5vZl9hbGlzdF9leG4gYWxpc3QgfmNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X211bHRpIH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9hbGlzdF9tdWx0aSBhbGlzdCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X2ZvbGQgfmNvbXBhcmF0b3IgYWxpc3QgfmluaXQgfmYgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX2FsaXN0X2ZvbGQgYWxpc3QgfmluaXQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9yZWR1Y2UgfmNvbXBhcmF0b3IgYWxpc3QgfmYgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX2FsaXN0X3JlZHVjZSBhbGlzdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2l0ZXJpIH5jb21wYXJhdG9yIH5pdGVyaSA9XG4gICAgbWF0Y2ggVHJlZTAub2ZfaXRlcmkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH5pdGVyaSB3aXRoXG4gICAgfCBgT2sgdHJlZV9sZW5ndGggLT4gYE9rIChvZl90cmVlMCB+Y29tcGFyYXRvciB0cmVlX2xlbmd0aClcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgeiAtPiB6XG4gIDs7XG5cbiAgbGV0IG9mX2l0ZXJpX2V4biB+Y29tcGFyYXRvciB+aXRlcmkgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC5vZl9pdGVyaV9leG4gfmNvbXBhcmF0b3Igfml0ZXJpKVxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvciB+bGVuIH5mID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiwgbGVuKVxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgT3JfZXJyb3IubWFwXG4gICAgICB+Zjoob2ZfdHJlZTAgfmNvbXBhcmF0b3IpXG4gICAgICAoVHJlZTAub2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIG1hdGNoIFRyZWUwLm9mX3NlcXVlbmNlIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYE9rICh0cmVlLCBsZW5ndGgpIC0+IGBPayB7IGNvbXBhcmF0b3I7IHRyZWU7IGxlbmd0aCB9XG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIHogLT4gelxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9vcl9lcnJvciB+Y29tcGFyYXRvciBzZXEgPVxuICAgIFJlc3VsdC5tYXAgKFRyZWUwLm9mX3NlcXVlbmNlX29yX2Vycm9yIHNlcSB+Y29tcGFyYXRvcikgfmY6KGZ1biB0cmVlIC0+XG4gICAgICBvZl90cmVlMCB+Y29tcGFyYXRvciB0cmVlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9leG4gfmNvbXBhcmF0b3Igc2VxID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAub2Zfc2VxdWVuY2VfZXhuIHNlcSB+Y29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfbXVsdGkgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9zZXF1ZW5jZV9tdWx0aSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9mb2xkIH5jb21wYXJhdG9yIHNlcSB+aW5pdCB+ZiA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2Zfc2VxdWVuY2VfZm9sZCBzZXEgfmluaXQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9yZWR1Y2UgfmNvbXBhcmF0b3Igc2VxIH5mID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9zZXF1ZW5jZV9yZWR1Y2Ugc2VxIH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvciBrX29mX3NleHAgdl9vZl9zZXhwIHNleHAgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC50X29mX3NleHBfZGlyZWN0IGtfb2Zfc2V4cCB2X29mX3NleHAgc2V4cCB+Y29tcGFyYXRvcilcbiAgOztcblxuICBsZXQgbWFwX2tleXMgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbWF0Y2ggVHJlZTAubWFwX2tleXMgdC50cmVlIH5mIH5jb21wYXJhdG9yIHdpdGhcbiAgICB8IGBPayBwYWlyIC0+IGBPayAob2ZfdHJlZTAgfmNvbXBhcmF0b3IgcGFpcilcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgZHVwIC0+IGR1cFxuICA7O1xuXG4gIGxldCBtYXBfa2V5c19leG4gfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLm1hcF9rZXlzX2V4biB0LnRyZWUgfmYgfmNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbW9kdWxlIEVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKEsgOiBDb21wYXJhdG9yLlMxKSA9IHN0cnVjdFxuICAgIGxldCBlbXB0eSA9IHsgdHJlZSA9IFRyZWUwLmVtcHR5OyBjb21wYXJhdG9yID0gSy5jb21wYXJhdG9yOyBsZW5ndGggPSAwIH1cbiAgZW5kXG5cbiAgbW9kdWxlIFRyZWUgPSBUcmVlXG5lbmRcblxuaW5jbHVkZSBBY2Nlc3NvcnNcblxudHlwZSAoJ2ssICdjbXApIGNvbXBhcmF0b3IgPVxuICAobW9kdWxlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA9ICdrIGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9ICdjbXApXG5cbmxldCBjb21wYXJhdG9yX3MgKHR5cGUgayBjbXApIHQgOiAoaywgY21wKSBjb21wYXJhdG9yID1cbiAgKG1vZHVsZSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBrXG4gICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBjbXBcblxuICAgIGxldCBjb21wYXJhdG9yID0gdC5jb21wYXJhdG9yXG4gIGVuZClcbjs7XG5cbmxldCB0b19jb21wYXJhdG9yICh0eXBlIGsgY21wKSAoKG1vZHVsZSBNKSA6IChrLCBjbXApIGNvbXBhcmF0b3IpID0gTS5jb21wYXJhdG9yXG5cbmxldCBvZl90cmVlICh0eXBlIGsgY21wKSAoKG1vZHVsZSBNKSA6IChrLCBjbXApIGNvbXBhcmF0b3IpIHRyZWUgPVxuICBvZl90cmVlIH5jb21wYXJhdG9yOk0uY29tcGFyYXRvciB0cmVlXG47O1xuXG5sZXQgZW1wdHkgbSA9IFVzaW5nX2NvbXBhcmF0b3IuZW1wdHkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSlcbmxldCBzaW5nbGV0b24gbSBhID0gVXNpbmdfY29tcGFyYXRvci5zaW5nbGV0b24gfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX2FsaXN0IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3QgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuXG5sZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgbSBhID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9vcl9lcnJvciB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG47O1xuXG5sZXQgb2ZfYWxpc3RfZXhuIG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfZXhuIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9hbGlzdF9tdWx0aSBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X211bHRpIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcblxubGV0IG9mX2FsaXN0X2ZvbGQgbSBhIH5pbml0IH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9mb2xkIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGEgfmluaXQgfmZcbjs7XG5cbmxldCBvZl9hbGlzdF9yZWR1Y2UgbSBhIH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9yZWR1Y2UgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYSB+ZlxuOztcblxubGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgbSBhID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbjs7XG5cbmxldCBvZl9zb3J0ZWRfYXJyYXkgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxubGV0IG9mX2l0ZXJpIG0gfml0ZXJpID0gVXNpbmdfY29tcGFyYXRvci5vZl9pdGVyaSB+aXRlcmkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSlcblxubGV0IG9mX2l0ZXJpX2V4biBtIH5pdGVyaSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaXRlcmlfZXhuIH5pdGVyaSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKVxuOztcblxubGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIG0gfmxlbiB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKVxuOztcblxubGV0IG9mX2luY3JlYXNpbmdfc2VxdWVuY2UgbSBzZXEgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfc2VxdWVuY2UgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgc2VxXG47O1xuXG5sZXQgb2Zfc2VxdWVuY2UgbSBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzXG5cbmxldCBvZl9zZXF1ZW5jZV9vcl9lcnJvciBtIHMgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX29yX2Vycm9yIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHNcbjs7XG5cbmxldCBvZl9zZXF1ZW5jZV9leG4gbSBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9leG4gfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgc1xuXG5sZXQgb2Zfc2VxdWVuY2VfbXVsdGkgbSBzID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9tdWx0aSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzXG47O1xuXG5sZXQgb2Zfc2VxdWVuY2VfZm9sZCBtIHMgfmluaXQgfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX2ZvbGQgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgcyB+aW5pdCB+ZlxuOztcblxubGV0IG9mX3NlcXVlbmNlX3JlZHVjZSBtIHMgfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX3JlZHVjZSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzIH5mXG47O1xuXG5sZXQgbWFwX2tleXMgbSB0IH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXBfa2V5cyB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSB0IH5mXG5sZXQgbWFwX2tleXNfZXhuIG0gdCB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwX2tleXNfZXhuIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHQgfmZcblxubW9kdWxlIE0gKEsgOiBzaWdcbiAgICB0eXBlIHRcbiAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlIG5vbnJlYyAndiB0ID0gKEsudCwgJ3YsIEsuY29tcGFyYXRvcl93aXRuZXNzKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgW0BAQGVuZF1cblxuICBpbmNsdWRlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA6PSB0XG5lbmRcblxubW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgQ29tcGFyZV9tID0gc2lnIGVuZFxubW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcbm1vZHVsZSB0eXBlIEhhc2hfZm9sZF9tID0gSGFzaGVyLlNcblxubGV0IHNleHBfb2ZfbV9fdCAodHlwZSBrKSAobW9kdWxlIEsgOiBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSBrKSBzZXhwX29mX3YgdCA9XG4gIHNleHBfb2ZfdCBLLnNleHBfb2ZfdCBzZXhwX29mX3YgKGZ1biBfIC0+IFNleHAuQXRvbSBcIl9cIikgdFxuOztcblxubGV0IG1fX3Rfb2Zfc2V4cFxuICAgICAgKHR5cGUgayBjbXApXG4gICAgICAobW9kdWxlIEsgOiBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSBrIGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IGNtcClcbiAgICAgIHZfb2Zfc2V4cFxuICAgICAgc2V4cFxuICA9XG4gIFVzaW5nX2NvbXBhcmF0b3IudF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvcjpLLmNvbXBhcmF0b3IgSy50X29mX3NleHAgdl9vZl9zZXhwIHNleHBcbjs7XG5cbmxldCBtX190X3NleHBfZ3JhbW1hclxuICAgICAgKHR5cGUgaylcbiAgICAgIChtb2R1bGUgSyA6IE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gaylcbiAgICAgICh2X2dyYW1tYXIgOiBfIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IF8gU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICB7IHVudHlwZWQgPVxuICAgICAgTGlzdFxuICAgICAgICAoTWFueSAoTGlzdCAoQ29ucyAoSy50X3NleHBfZ3JhbW1hci51bnR5cGVkLCBDb25zICh2X2dyYW1tYXIudW50eXBlZCwgRW1wdHkpKSkpKVxuICB9XG47O1xuXG5sZXQgY29tcGFyZV9tX190IChtb2R1bGUgXyA6IENvbXBhcmVfbSkgY29tcGFyZV92IHQxIHQyID0gY29tcGFyZV9kaXJlY3QgY29tcGFyZV92IHQxIHQyXG5sZXQgZXF1YWxfbV9fdCAobW9kdWxlIF8gOiBFcXVhbF9tKSBlcXVhbF92IHQxIHQyID0gZXF1YWwgZXF1YWxfdiB0MSB0MlxuXG5sZXQgaGFzaF9mb2xkX21fX3QgKHR5cGUgaykgKG1vZHVsZSBLIDogSGFzaF9mb2xkX20gd2l0aCB0eXBlIHQgPSBrKSBoYXNoX2ZvbGRfdiBzdGF0ZSA9XG4gIGhhc2hfZm9sZF9kaXJlY3QgSy5oYXNoX2ZvbGRfdCBoYXNoX2ZvbGRfdiBzdGF0ZVxuOztcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgKCdrLCAndikgdCA9ICgnaywgJ3YsIENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgdHlwZSBub25yZWMgKCdrLCAndikgdHJlZSA9ICgnaywgJ3YpIFRyZWUwLnRcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgY29tcGFyYXRvciA9IENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yXG4gIGxldCBvZl90cmVlIHRyZWUgPSB7IHRyZWU7IGNvbXBhcmF0b3I7IGxlbmd0aCA9IFRyZWUwLmxlbmd0aCB0cmVlIH1cblxuICBpbmNsdWRlIFVzaW5nX2NvbXBhcmF0b3IuRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoQ29tcGFyYXRvci5Qb2x5KVxuXG4gIGxldCBzaW5nbGV0b24gYSA9IFVzaW5nX2NvbXBhcmF0b3Iuc2luZ2xldG9uIH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FsaXN0IGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0IH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FsaXN0X29yX2Vycm9yIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X29yX2Vycm9yIH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FsaXN0X2V4biBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9leG4gfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYWxpc3RfbXVsdGkgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfbXVsdGkgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfYWxpc3RfZm9sZCBhIH5pbml0IH5mID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9mb2xkIH5jb21wYXJhdG9yIGEgfmluaXQgfmZcbiAgbGV0IG9mX2FsaXN0X3JlZHVjZSBhIH5mID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9yZWR1Y2UgfmNvbXBhcmF0b3IgYSB+ZlxuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGEgPVxuICAgIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfaXRlcmkgfml0ZXJpID0gVXNpbmdfY29tcGFyYXRvci5vZl9pdGVyaSB+aXRlcmkgfmNvbXBhcmF0b3JcbiAgbGV0IG9mX2l0ZXJpX2V4biB+aXRlcmkgPSBVc2luZ19jb21wYXJhdG9yLm9mX2l0ZXJpX2V4biB+aXRlcmkgfmNvbXBhcmF0b3JcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiA9XG4gICAgVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuIH5mIH5jb21wYXJhdG9yXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfc2VxdWVuY2Ugc2VxID0gVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNlcVxuICBsZXQgb2Zfc2VxdWVuY2UgcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc1xuICBsZXQgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2Vfb3JfZXJyb3IgfmNvbXBhcmF0b3Igc1xuICBsZXQgb2Zfc2VxdWVuY2VfZXhuIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX2V4biB+Y29tcGFyYXRvciBzXG4gIGxldCBvZl9zZXF1ZW5jZV9tdWx0aSBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9tdWx0aSB+Y29tcGFyYXRvciBzXG5cbiAgbGV0IG9mX3NlcXVlbmNlX2ZvbGQgcyB+aW5pdCB+ZiA9XG4gICAgVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9mb2xkIH5jb21wYXJhdG9yIHMgfmluaXQgfmZcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfcmVkdWNlIHMgfmYgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX3JlZHVjZSB+Y29tcGFyYXRvciBzIH5mXG4gIGxldCBtYXBfa2V5cyB0IH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXBfa2V5cyB+Y29tcGFyYXRvciB0IH5mXG4gIGxldCBtYXBfa2V5c19leG4gdCB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwX2tleXNfZXhuIH5jb21wYXJhdG9yIHQgfmZcbmVuZFxuIiwib3BlbiEgSW1wb3J0MFxuXG50eXBlICdhIHQgPSAnYSBDYW1sLlF1ZXVlLnRcblxubGV0IGNyZWF0ZSA9IENhbWwuUXVldWUuY3JlYXRlXG5sZXQgY2xlYXIgPSBDYW1sLlF1ZXVlLmNsZWFyXG5sZXQgY29weSA9IENhbWwuUXVldWUuY29weVxubGV0IGlzX2VtcHR5ID0gQ2FtbC5RdWV1ZS5pc19lbXB0eVxubGV0IGxlbmd0aCA9IENhbWwuUXVldWUubGVuZ3RoXG5sZXQgcGVlayA9IENhbWwuUXVldWUucGVla1xubGV0IHBvcCA9IENhbWwuUXVldWUucG9wXG5sZXQgcHVzaCA9IENhbWwuUXVldWUucHVzaFxubGV0IHRyYW5zZmVyID0gQ2FtbC5RdWV1ZS50cmFuc2ZlclxubGV0IGl0ZXIgdCB+ZiA9IENhbWwuUXVldWUuaXRlciBmIHRcbmxldCBmb2xkIHQgfmluaXQgfmYgPSBDYW1sLlF1ZXVlLmZvbGQgZiBpbml0IHRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBMaW5rZWRfcXVldWUwXG5cbmxldCBlbnF1ZXVlIHQgeCA9IExpbmtlZF9xdWV1ZTAucHVzaCB4IHRcbmxldCBkZXF1ZXVlIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKExpbmtlZF9xdWV1ZTAucG9wIHQpXG5sZXQgZGVxdWV1ZV9leG4gPSBMaW5rZWRfcXVldWUwLnBvcFxubGV0IHBlZWsgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAoTGlua2VkX3F1ZXVlMC5wZWVrIHQpXG5sZXQgcGVla19leG4gPSBMaW5rZWRfcXVldWUwLnBlZWtcblxubW9kdWxlIEMgPSBJbmRleGVkX2NvbnRhaW5lci5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGl0ZXIgPSBgQ3VzdG9tIGl0ZXJcbiAgICBsZXQgbGVuZ3RoID0gYEN1c3RvbSBsZW5ndGhcbiAgICBsZXQgZm9sZGkgPSBgRGVmaW5lX3VzaW5nX2ZvbGRcbiAgICBsZXQgaXRlcmkgPSBgRGVmaW5lX3VzaW5nX2ZvbGRcbiAgZW5kKVxuXG5sZXQgY291bnQgPSBDLmNvdW50XG5sZXQgZXhpc3RzID0gQy5leGlzdHNcbmxldCBmaW5kID0gQy5maW5kXG5sZXQgZmluZF9tYXAgPSBDLmZpbmRfbWFwXG5sZXQgZm9sZF9yZXN1bHQgPSBDLmZvbGRfcmVzdWx0XG5sZXQgZm9sZF91bnRpbCA9IEMuZm9sZF91bnRpbFxubGV0IGZvcl9hbGwgPSBDLmZvcl9hbGxcbmxldCBtYXhfZWx0ID0gQy5tYXhfZWx0XG5sZXQgbWVtID0gQy5tZW1cbmxldCBtaW5fZWx0ID0gQy5taW5fZWx0XG5sZXQgc3VtID0gQy5zdW1cbmxldCB0b19saXN0ID0gQy50b19saXN0XG5sZXQgY291bnRpID0gQy5jb3VudGlcbmxldCBleGlzdHNpID0gQy5leGlzdHNpXG5sZXQgZmluZF9tYXBpID0gQy5maW5kX21hcGlcbmxldCBmaW5kaSA9IEMuZmluZGlcbmxldCBmb2xkaSA9IEMuZm9sZGlcbmxldCBmb3JfYWxsaSA9IEMuZm9yX2FsbGlcbmxldCBpdGVyaSA9IEMuaXRlcmlcbmxldCB0cmFuc2ZlciB+c3JjIH5kc3QgPSBMaW5rZWRfcXVldWUwLnRyYW5zZmVyIHNyYyBkc3RcblxubGV0IGNvbmNhdF9tYXAgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPiBMaXN0Lml0ZXIgKGYgYSkgfmY6KGZ1biBiIC0+IGVucXVldWUgcmVzIGIpKTtcbiAgcmVzXG47O1xuXG5sZXQgY29uY2F0X21hcGkgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPiBMaXN0Lml0ZXIgKGYgaSBhKSB+ZjooZnVuIGIgLT4gZW5xdWV1ZSByZXMgYikpO1xuICByZXNcbjs7XG5cbmxldCBmaWx0ZXJfbWFwIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT5cbiAgICBtYXRjaCBmIGEgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBiIC0+IGVucXVldWUgcmVzIGIpO1xuICByZXNcbjs7XG5cbmxldCBmaWx0ZXJfbWFwaSB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+XG4gICAgbWF0Y2ggZiBpIGEgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSBiIC0+IGVucXVldWUgcmVzIGIpO1xuICByZXNcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPiBpZiBmIGEgdGhlbiBlbnF1ZXVlIHJlcyBhKTtcbiAgcmVzXG47O1xuXG5sZXQgZmlsdGVyaSB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+IGlmIGYgaSBhIHRoZW4gZW5xdWV1ZSByZXMgYSk7XG4gIHJlc1xuOztcblxubGV0IG1hcCB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+IGVucXVldWUgcmVzIChmIGEpKTtcbiAgcmVzXG47O1xuXG5sZXQgbWFwaSB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+IGVucXVldWUgcmVzIChmIGkgYSkpO1xuICByZXNcbjs7XG5cbmxldCBmaWx0ZXJfaW5wbGFjZSBxIH5mID1cbiAgbGV0IHEnID0gZmlsdGVyIHEgfmYgaW5cbiAgY2xlYXIgcTtcbiAgdHJhbnNmZXIgfnNyYzpxJyB+ZHN0OnFcbjs7XG5cbmxldCBmaWx0ZXJpX2lucGxhY2UgcSB+ZiA9XG4gIGxldCBxJyA9IGZpbHRlcmkgcSB+ZiBpblxuICBjbGVhciBxO1xuICB0cmFuc2ZlciB+c3JjOnEnIH5kc3Q6cVxuOztcblxubGV0IGVucXVldWVfYWxsIHQgbGlzdCA9IExpc3QuaXRlciBsaXN0IH5mOihmdW4geCAtPiBlbnF1ZXVlIHQgeClcblxubGV0IG9mX2xpc3QgbGlzdCA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIExpc3QuaXRlciBsaXN0IH5mOihmdW4geCAtPiBlbnF1ZXVlIHQgeCk7XG4gIHRcbjs7XG5cbmxldCBvZl9hcnJheSBhcnJheSA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIEFycmF5Lml0ZXIgYXJyYXkgfmY6KGZ1biB4IC0+IGVucXVldWUgdCB4KTtcbiAgdFxuOztcblxubGV0IGluaXQgbGVuIH5mID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBlbnF1ZXVlIHQgKGYgaSlcbiAgZG9uZTtcbiAgdFxuOztcblxubGV0IHRvX2FycmF5IHQgPVxuICBtYXRjaCBsZW5ndGggdCB3aXRoXG4gIHwgMCAtPiBbfHxdXG4gIHwgbGVuIC0+XG4gICAgbGV0IGFyciA9IEFycmF5LmNyZWF0ZSB+bGVuIChwZWVrX2V4biB0KSBpblxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBpdGVyIHQgfmY6KGZ1biB2IC0+XG4gICAgICBhcnIuKCFpKSA8LSB2O1xuICAgICAgaW5jciBpKTtcbiAgICBhcnJcbjs7XG5cbmxldCB0X29mX3NleHAgYV9vZl9zZXhwIHNleHAgPSBvZl9saXN0IChsaXN0X29mX3NleHAgYV9vZl9zZXhwIHNleHApXG5sZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID0gc2V4cF9vZl9saXN0IHNleHBfb2ZfYSAodG9fbGlzdCB0KVxuXG5sZXQgdF9zZXhwX2dyYW1tYXIgKHR5cGUgYSkgKGdyYW1tYXIgOiBhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IGEgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKExpc3QudF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbjs7XG5cbmxldCBzaW5nbGV0b24gYSA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIGVucXVldWUgdCBhO1xuICB0XG47O1xuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBDYW1sLkludDY0XG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGludDY0IFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9pbnQ2NFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfaW50NjQgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGludDY0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2ludDY0IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGludDY0X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuXG4gIGxldCBjb21wYXJlID0gSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmNvbXBhcmVcbiAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICBsZXQgb2Zfc3RyaW5nID0gb2Zfc3RyaW5nXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxubGV0IG51bV9iaXRzID0gNjRcbmxldCBmbG9hdF9sb3dlcl9ib3VuZCA9IEZsb2F0MC5sb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfdXBwZXJfYm91bmQgPSBGbG9hdDAudXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X29mX2JpdHMgPSBmbG9hdF9vZl9iaXRzXG5sZXQgYml0c19vZl9mbG9hdCA9IGJpdHNfb2ZfZmxvYXRcbmxldCBzaGlmdF9yaWdodF9sb2dpY2FsID0gc2hpZnRfcmlnaHRfbG9naWNhbFxubGV0IHNoaWZ0X3JpZ2h0ID0gc2hpZnRfcmlnaHRcbmxldCBzaGlmdF9sZWZ0ID0gc2hpZnRfbGVmdFxubGV0IGJpdF9ub3QgPSBsb2dub3RcbmxldCBiaXRfeG9yID0gbG9neG9yXG5sZXQgYml0X29yID0gbG9nb3JcbmxldCBiaXRfYW5kID0gbG9nYW5kXG5sZXQgbWluX3ZhbHVlID0gbWluX2ludFxubGV0IG1heF92YWx1ZSA9IG1heF9pbnRcbmxldCBhYnMgPSBhYnNcbmxldCBwcmVkID0gcHJlZFxubGV0IHN1Y2MgPSBzdWNjXG5sZXQgcG93ID0gSW50X21hdGguUHJpdmF0ZS5pbnQ2NF9wb3dcbmxldCByZW0gPSByZW1cbmxldCBuZWcgPSBuZWdcbmxldCBtaW51c19vbmUgPSBtaW51c19vbmVcbmxldCBvbmUgPSBvbmVcbmxldCB6ZXJvID0gemVyb1xubGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbmxldCBvZl9mbG9hdF91bmNoZWNrZWQgPSBDYW1sLkludDY0Lm9mX2Zsb2F0XG5cbmxldCBvZl9mbG9hdCBmID1cbiAgaWYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSBmIGZsb2F0X2xvd2VyX2JvdW5kXG4gICYmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgZiBmbG9hdF91cHBlcl9ib3VuZFxuICB0aGVuIENhbWwuSW50NjQub2ZfZmxvYXQgZlxuICBlbHNlXG4gICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgXCJJbnQ2NC5vZl9mbG9hdDogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IGYpXG4gICAgICAoKVxuOztcblxubGV0ICggKiogKSBiIGUgPSBwb3cgYiBlXG5cbmV4dGVybmFsIGJzd2FwNjQgOiB0IC0+IHQgPSBcIiVic3dhcF9pbnQ2NFwiXG5cbmxldFtAaW5saW5lIGFsd2F5c10gYnN3YXAxNiB4ID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChic3dhcDY0IHgpIDQ4XG5cbmxldFtAaW5saW5lIGFsd2F5c10gYnN3YXAzMiB4ID1cbiAgKCogVGhpcyBpcyBzdHJpY3RseSBiZXR0ZXIgdGhhbiBjb2VyY2luZyB0byBhbiBpbnQzMiB0byBwZXJmb3JtIGJ5dGVzd2FwLiBDb2VyY2luZ1xuICAgICBmcm9tIGFuIGludDMyIHdpbGwgYWRkIHVubmVjZXNzYXJ5IHNoaWZ0IG9wZXJhdGlvbnMgdG8gc2lnbiBleHRlbmQgdGhlIG51bWJlclxuICAgICBhcHByb3ByaWF0ZWx5LlxuICAqKVxuICBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgKGJzd2FwNjQgeCkgMzJcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gYnN3YXA0OCB4ID0gQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChic3dhcDY0IHgpIDE2XG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmxldCBpbmNyIHIgPSByIDo9IGFkZCAhciBvbmVcbmxldCBkZWNyIHIgPSByIDo9IHN1YiAhciBvbmVcblxuZXh0ZXJuYWwgb2ZfaW50NjQgOiB0IC0+IHQgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBvZl9pbnQ2NF9leG4gPSBvZl9pbnQ2NFxubGV0IHRvX2ludDY0IHQgPSB0XG5sZXQgcG9wY291bnQgPSBQb3Bjb3VudC5pbnQ2NF9wb3Bjb3VudFxuXG5tb2R1bGUgQ29udiA9IEludF9jb252ZXJzaW9uc1xuXG5leHRlcm5hbCB0b19pbnRfdHJ1bmMgOiB0IC0+IGludCA9IFwiJWludDY0X3RvX2ludFwiXG5leHRlcm5hbCB0b19pbnQzMl90cnVuYyA6IGludDY0IC0+IGludDMyID0gXCIlaW50NjRfdG9faW50MzJcIlxuZXh0ZXJuYWwgdG9fbmF0aXZlaW50X3RydW5jIDogaW50NjQgLT4gbmF0aXZlaW50ID0gXCIlaW50NjRfdG9fbmF0aXZlaW50XCJcbmV4dGVybmFsIG9mX2ludCA6IGludCAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludFwiXG5leHRlcm5hbCBvZl9pbnQzMiA6IGludDMyIC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50MzJcIlxuXG5sZXQgb2ZfaW50X2V4biA9IG9mX2ludFxubGV0IHRvX2ludCA9IENvbnYuaW50NjRfdG9faW50XG5sZXQgdG9faW50X2V4biA9IENvbnYuaW50NjRfdG9faW50X2V4blxubGV0IG9mX2ludDMyX2V4biA9IG9mX2ludDMyXG5sZXQgdG9faW50MzIgPSBDb252LmludDY0X3RvX2ludDMyXG5sZXQgdG9faW50MzJfZXhuID0gQ29udi5pbnQ2NF90b19pbnQzMl9leG5cbmxldCBvZl9uYXRpdmVpbnQgPSBDb252Lm5hdGl2ZWludF90b19pbnQ2NFxubGV0IG9mX25hdGl2ZWludF9leG4gPSBvZl9uYXRpdmVpbnRcbmxldCB0b19uYXRpdmVpbnQgPSBDb252LmludDY0X3RvX25hdGl2ZWludFxubGV0IHRvX25hdGl2ZWludF9leG4gPSBDb252LmludDY0X3RvX25hdGl2ZWludF9leG5cblxubW9kdWxlIFBvdzIgPSBzdHJ1Y3RcbiAgb3BlbiEgSW1wb3J0XG4gIG9wZW4gSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbiAgbGV0IG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKSA9XG4gICAgUHJpbnRmLmludmFsaWRfYXJnZiBcImFyZ3VtZW50IG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmVcIiAoKVxuICA7O1xuXG4gIGxldCAoIGxvciApID0gQ2FtbC5JbnQ2NC5sb2dvclxuICBsZXQgKCBsc3IgKSA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbFxuICBsZXQgKCBsYW5kICkgPSBDYW1sLkludDY0LmxvZ2FuZFxuXG4gICgqKiBcImNlaWxpbmcgcG93ZXIgb2YgMlwiIC0gTGVhc3QgcG93ZXIgb2YgMiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGNlaWxfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50NjQuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IENhbWwuSW50NjQucHJlZCB4IGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICBDYW1sLkludDY0LnN1Y2MgeFxuICA7O1xuXG4gICgqKiBcImZsb29yIHBvd2VyIG9mIDJcIiAtIExhcmdlc3QgcG93ZXIgb2YgMiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGZsb29yX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDY0Lnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICBDYW1sLkludDY0LnN1YiB4ICh4IGxzciAxKVxuICA7O1xuXG4gIGxldCBpc19wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQ2NC56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIHggbGFuZCBDYW1sLkludDY0LnByZWQgeCA9IENhbWwuSW50NjQuemVyb1xuICA7O1xuXG4gICgqIEMgc3R1YnMgZm9yIGludCBjbHogYW5kIGN0eiB0byB1c2UgdGhlIENMWi9CU1IvQ1RaL0JTRiBpbnN0cnVjdGlvbiB3aGVyZSBwb3NzaWJsZSAqKVxuICBleHRlcm5hbCBjbHpcbiAgICA6ICAoaW50NjRbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jbHpcIiBcIkJhc2VfaW50X21hdGhfaW50NjRfY2x6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGN0elxuICAgIDogIChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludDY0X2N0elwiIFwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jdHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgZmxvb3JfbG9nMiBpID1cbiAgICBpZiBpIDw9IENhbWwuSW50NjQuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZSBcIltJbnQ2NC5mbG9vcl9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQ2NCBpIF0pO1xuICAgIG51bV9iaXRzIC0gMSAtIGNseiBpXG4gIDs7XG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgY2VpbF9sb2cyIGkgPVxuICAgIGlmIFBvbHkuKCA8PSApIGkgQ2FtbC5JbnQ2NC56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0ludDY0LmNlaWxfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50NjQgaSBdKTtcbiAgICBpZiBDYW1sLkludDY0LmVxdWFsIGkgQ2FtbC5JbnQ2NC5vbmUgdGhlbiAwIGVsc2UgbnVtX2JpdHMgLSBjbHogKENhbWwuSW50NjQucHJlZCBpKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgUG93MlxuaW5jbHVkZSBDb252Lk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29udi5NYWtlX2hleCAoc3RydWN0XG4gICAgdHlwZSB0ID0gaW50NjQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2ludDY0IDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIGhhc2hfZm9sZF9pbnQ2NFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBoYXNoX2ludDY0IGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCB6ZXJvID0gemVyb1xuICAgIGxldCBuZWcgPSBuZWdcbiAgICBsZXQgKCA8ICkgPSAoIDwgKVxuICAgIGxldCB0b19zdHJpbmcgaSA9IFByaW50Zi5zcHJpbnRmIFwiJUx4XCIgaVxuICAgIGxldCBvZl9zdHJpbmcgcyA9IENhbWwuU2NhbmYuc3NjYW5mIHMgXCIlTHhcIiBGbi5pZFxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQ2NC5IZXhcIlxuICBlbmQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDY0XCJcbiAgZW5kKVxuXG5tb2R1bGUgUHJlX08gPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCArICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X2FkZFwiXG4gIGV4dGVybmFsICggLSApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9zdWJcIlxuICBleHRlcm5hbCAoICogKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfbXVsXCJcbiAgZXh0ZXJuYWwgKCAvICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X2RpdlwiXG4gIGV4dGVybmFsICggfi0gKSA6IHQgLT4gdCA9IFwiJWludDY0X25lZ1wiXG5cbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IGFicyA9IGFic1xuXG4gIGV4dGVybmFsIG5lZyA6IHQgLT4gdCA9IFwiJWludDY0X25lZ1wiXG5cbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnRfZXhuID0gb2ZfaW50X2V4blxuZW5kXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGluY2x1ZGUgUHJlX09cblxuICBpbmNsdWRlIEludF9tYXRoLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgaW5jbHVkZSBQcmVfT1xuXG4gICAgICBsZXQgcmVtID0gcmVtXG4gICAgICBsZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxuICAgICAgbGV0IG9mX2Zsb2F0ID0gb2ZfZmxvYXRcbiAgICAgIGxldCBvZl9zdHJpbmcgPSBULm9mX3N0cmluZ1xuICAgICAgbGV0IHRvX3N0cmluZyA9IFQudG9fc3RyaW5nXG4gICAgZW5kKVxuXG4gIGV4dGVybmFsICggbGFuZCApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9hbmRcIlxuICBleHRlcm5hbCAoIGxvciApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9vclwiXG4gIGV4dGVybmFsICggbHhvciApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF94b3JcIlxuXG4gIGxldCBsbm90ID0gYml0X25vdFxuXG4gIGV4dGVybmFsICggbHNsICkgOiB0IC0+IGludCAtPiB0ID0gXCIlaW50NjRfbHNsXCJcbiAgZXh0ZXJuYWwgKCBhc3IgKSA6IHQgLT4gaW50IC0+IHQgPSBcIiVpbnQ2NF9hc3JcIlxuICBleHRlcm5hbCAoIGxzciApIDogdCAtPiBpbnQgLT4gdCA9IFwiJWludDY0X2xzclwiXG5lbmRcblxuaW5jbHVkZSBPXG5cbigqIFtJbnQ2NF0gYW5kIFtJbnQ2NC5PXSBhZ3JlZSB2YWx1ZS13aXNlICopXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIigqIEEgNjNiaXQgaW50ZWdlciBpcyBhIDY0Yml0IGludGVnZXIgd2l0aCBpdHMgYml0cyBzaGlmdGVkIHRvIHRoZSBsZWZ0XG4gICBhbmQgaXRzIGxvd2VzdCBiaXQgc2V0IHRvIDAuXG4gICBUaGlzIGlzIHRoZSBzYW1lIGtpbmQgb2YgZW5jb2RpbmcgYXMgT0NhbWwgaW50IG9uIDY0Yml0IGFyY2hpdGVjdHVyZS5cbiAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmVpbmcgdGhlIGxvd2VzdCBiaXQgKGltbWVkaWF0ZSBiaXQpIHNldCB0byAxLiAqKVxuXG5vcGVuISBJbXBvcnRcbmluY2x1ZGUgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cblxubW9kdWxlIFQwID0gc3RydWN0XG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgdHlwZSB0ID0gaW50NjQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICAgIGxldCBjb21wYXJlID0gKGNvbXBhcmVfaW50NjQgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgaGFzaF9mb2xkX2ludDY0XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IGhhc2hfaW50NjQgaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBsZXQgdF9vZl9zZXhwID0gKGludDY0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfaW50NjQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBpbnQ2NF9zZXhwX2dyYW1tYXJcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGVuZFxuXG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcbmVuZFxuXG5tb2R1bGUgQ29udiA9IEludF9jb252ZXJzaW9uc1xuXG5tb2R1bGUgVyA6IHNpZ1xuXG4gIGluY2x1ZGUgbW9kdWxlIHR5cGUgb2Ygc3RydWN0XG4gICAgaW5jbHVkZSBUMFxuICBlbmRcblxuICB0eXBlIHQgPSBpbnQ2NFxuXG4gIHZhbCB3cmFwX2V4biA6IENhbWwuSW50NjQudCAtPiB0XG4gIHZhbCB3cmFwX21vZHVsbyA6IENhbWwuSW50NjQudCAtPiB0XG4gIHZhbCB1bndyYXAgOiB0IC0+IENhbWwuSW50NjQudFxuXG4gICgqKiBSZXR1cm5zIGEgbm9uLW5lZ2F0aXZlIGludDY0IHRoYXQgaXMgZXF1YWwgdG8gdGhlIGlucHV0IGludDYzIG1vZHVsbyAyXjYzLiAqKVxuICB2YWwgdW53cmFwX3Vuc2lnbmVkIDogdCAtPiBDYW1sLkludDY0LnRcblxuICB2YWwgaW52YXJpYW50IDogdCAtPiB1bml0XG4gIHZhbCBhZGQgOiB0IC0+IHQgLT4gdFxuICB2YWwgc3ViIDogdCAtPiB0IC0+IHRcbiAgdmFsIG5lZyA6IHQgLT4gdFxuICB2YWwgYWJzIDogdCAtPiB0XG4gIHZhbCBzdWNjIDogdCAtPiB0XG4gIHZhbCBwcmVkIDogdCAtPiB0XG4gIHZhbCBtdWwgOiB0IC0+IHQgLT4gdFxuICB2YWwgcG93IDogdCAtPiB0IC0+IHRcbiAgdmFsIGRpdiA6IHQgLT4gdCAtPiB0XG4gIHZhbCByZW0gOiB0IC0+IHQgLT4gdFxuICB2YWwgcG9wY291bnQgOiB0IC0+IGludFxuICB2YWwgYml0X25vdCA6IHQgLT4gdFxuICB2YWwgYml0X3hvciA6IHQgLT4gdCAtPiB0XG4gIHZhbCBiaXRfb3IgOiB0IC0+IHQgLT4gdFxuICB2YWwgYml0X2FuZCA6IHQgLT4gdCAtPiB0XG4gIHZhbCBzaGlmdF9sZWZ0IDogdCAtPiBpbnQgLT4gdFxuICB2YWwgc2hpZnRfcmlnaHQgOiB0IC0+IGludCAtPiB0XG4gIHZhbCBzaGlmdF9yaWdodF9sb2dpY2FsIDogdCAtPiBpbnQgLT4gdFxuICB2YWwgbWluX3ZhbHVlIDogdFxuICB2YWwgbWF4X3ZhbHVlIDogdFxuICB2YWwgdG9faW50NjQgOiB0IC0+IENhbWwuSW50NjQudFxuICB2YWwgb2ZfaW50NjQgOiBDYW1sLkludDY0LnQgLT4gdCBvcHRpb25cbiAgdmFsIG9mX2ludDY0X2V4biA6IENhbWwuSW50NjQudCAtPiB0XG4gIHZhbCBvZl9pbnQ2NF90cnVuYyA6IENhbWwuSW50NjQudCAtPiB0XG4gIHZhbCBjb21wYXJlIDogdCAtPiB0IC0+IGludFxuICB2YWwgY2VpbF9wb3cyIDogdCAtPiB0XG4gIHZhbCBmbG9vcl9wb3cyIDogdCAtPiB0XG4gIHZhbCBjZWlsX2xvZzIgOiB0IC0+IGludFxuICB2YWwgZmxvb3JfbG9nMiA6IHQgLT4gaW50XG4gIHZhbCBpc19wb3cyIDogdCAtPiBib29sXG4gIHZhbCBjbHogOiB0IC0+IGludFxuICB2YWwgY3R6IDogdCAtPiBpbnRcbmVuZCA9IHN0cnVjdFxuICBpbmNsdWRlIFQwXG5cbiAgdHlwZSB0ID0gaW50NjRcblxuICBsZXQgd3JhcF9leG4geCA9XG4gICAgKCogUmFpc2VzIGlmIHRoZSBpbnQ2NCB2YWx1ZSBkb2VzIG5vdCBmaXQgb24gaW50NjMuICopXG4gICAgQ29udi5pbnQ2NF9maXRfb25faW50NjNfZXhuIHg7XG4gICAgQ2FtbC5JbnQ2NC5tdWwgeCAyTFxuICA7O1xuXG4gIGxldCB3cmFwIHggPVxuICAgIGlmIENvbnYuaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQ2MyB4IHRoZW4gU29tZSAoQ2FtbC5JbnQ2NC5tdWwgeCAyTCkgZWxzZSBOb25lXG4gIDs7XG5cbiAgbGV0IHdyYXBfbW9kdWxvIHggPSBDYW1sLkludDY0Lm11bCB4IDJMXG4gIGxldCB1bndyYXAgeCA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHQgeCAxXG4gIGxldCB1bndyYXBfdW5zaWduZWQgeCA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCB4IDFcblxuICAoKiBUaGlzIGRvZXMgbm90IHVzZSB3cmFwIG9yIHVud3JhcCB0byBhdm9pZCBnZW5lcmF0aW5nIGV4Y2VwdGlvbnMgaW4gdGhlIGNhc2Ugb2ZcbiAgICAgb3ZlcmZsb3dzLiBUaGlzIGlzIHRvIHByZXNlcnZlIHRoZSBzZW1hbnRpY3Mgb2YgaW50IHR5cGUgb24gNjQgYml0IGFyY2hpdGVjdHVyZS4gKilcbiAgbGV0IGYyIGYgYSBiID1cbiAgICBDYW1sLkludDY0Lm11bCAoZiAoQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCBhIDEpIChDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IGIgMSkpIDJMXG4gIDs7XG5cbiAgbGV0IG1hc2sgPSAweGZmZmZfZmZmZl9mZmZmX2ZmZmVMXG4gIGxldCBtIHggPSBDYW1sLkludDY0LmxvZ2FuZCB4IG1hc2tcbiAgbGV0IGludmFyaWFudCB0ID0gYXNzZXJ0IChtIHQgPSB0KVxuICBsZXQgYWRkIHggeSA9IENhbWwuSW50NjQuYWRkIHggeVxuICBsZXQgc3ViIHggeSA9IENhbWwuSW50NjQuc3ViIHggeVxuICBsZXQgbmVnIHggPSBDYW1sLkludDY0Lm5lZyB4XG4gIGxldCBhYnMgeCA9IENhbWwuSW50NjQuYWJzIHhcbiAgbGV0IG9uZSA9IHdyYXBfZXhuIDFMXG4gIGxldCBzdWNjIGEgPSBhZGQgYSBvbmVcbiAgbGV0IHByZWQgYSA9IHN1YiBhIG9uZVxuICBsZXQgbWluX3ZhbHVlID0gbSBDYW1sLkludDY0Lm1pbl9pbnRcbiAgbGV0IG1heF92YWx1ZSA9IG0gQ2FtbC5JbnQ2NC5tYXhfaW50XG4gIGxldCBiaXRfbm90IHggPSBtIChDYW1sLkludDY0LmxvZ25vdCB4KVxuICBsZXQgYml0X2FuZCA9IENhbWwuSW50NjQubG9nYW5kXG4gIGxldCBiaXRfeG9yID0gQ2FtbC5JbnQ2NC5sb2d4b3JcbiAgbGV0IGJpdF9vciA9IENhbWwuSW50NjQubG9nb3JcbiAgbGV0IHNoaWZ0X2xlZnQgeCBpID0gQ2FtbC5JbnQ2NC5zaGlmdF9sZWZ0IHggaVxuICBsZXQgc2hpZnRfcmlnaHQgeCBpID0gbSAoQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCB4IGkpXG4gIGxldCBzaGlmdF9yaWdodF9sb2dpY2FsIHggaSA9IG0gKENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCB4IGkpXG4gIGxldCBwb3cgPSBmMiBJbnRfbWF0aC5Qcml2YXRlLmludDYzX3Bvd19vbl9pbnQ2NFxuICBsZXQgbXVsIGEgYiA9IENhbWwuSW50NjQubXVsIGEgKENhbWwuSW50NjQuc2hpZnRfcmlnaHQgYiAxKVxuICBsZXQgZGl2IGEgYiA9IHdyYXBfbW9kdWxvIChDYW1sLkludDY0LmRpdiBhIGIpXG4gIGxldCByZW0gYSBiID0gQ2FtbC5JbnQ2NC5yZW0gYSBiXG4gIGxldCBwb3Bjb3VudCB4ID0gUG9wY291bnQuaW50NjRfcG9wY291bnQgeFxuICBsZXQgdG9faW50NjQgdCA9IHVud3JhcCB0XG4gIGxldCBvZl9pbnQ2NCB0ID0gd3JhcCB0XG4gIGxldCBvZl9pbnQ2NF9leG4gdCA9IHdyYXBfZXhuIHRcbiAgbGV0IG9mX2ludDY0X3RydW5jIHQgPSB3cmFwX21vZHVsbyB0XG4gIGxldCB0X29mX3NleHAgeCA9IHdyYXBfZXhuIChpbnQ2NF9vZl9zZXhwIHgpXG4gIGxldCBzZXhwX29mX3QgeCA9IHNleHBfb2ZfaW50NjQgKHVud3JhcCB4KVxuICBsZXQgY29tcGFyZSAoeCA6IHQpIHkgPSBjb21wYXJlIHggeVxuICBsZXQgaXNfcG93MiB4ID0gSW50NjQuaXNfcG93MiAodW53cmFwIHgpXG5cbiAgbGV0IGNseiB4ID1cbiAgICAoKiBXZSBydW4gSW50NjQuY2x6IGRpcmVjdGx5IG9uIHRoZSB3cmFwcGVkIGludDYzIHZhbHVlLiBUaGlzIGlzIGNvcnJlY3QgYmVjYXVzZSB0aGVcbiAgICAgICBiaXRzIG9mIHRoZSBpbnQ2M19lbXVsIGFyZSBsZWZ0LWFsaWduZWQgaW4gdGhlIEludDY0LiAqKVxuICAgIEludDY0LmNseiB4XG4gIDs7XG5cbiAgbGV0IGN0eiB4ID0gSW50NjQuY3R6ICh1bndyYXAgeClcbiAgbGV0IGZsb29yX3BvdzIgeCA9IEludDY0LmZsb29yX3BvdzIgKHVud3JhcCB4KSB8PiB3cmFwX2V4blxuICBsZXQgY2VpbF9wb3cyIHggPSBJbnQ2NC5mbG9vcl9wb3cyICh1bndyYXAgeCkgfD4gd3JhcF9leG5cbiAgbGV0IGZsb29yX2xvZzIgeCA9IEludDY0LmZsb29yX2xvZzIgKHVud3JhcCB4KVxuICBsZXQgY2VpbF9sb2cyIHggPSBJbnQ2NC5jZWlsX2xvZzIgKHVud3JhcCB4KVxuZW5kXG5cbm9wZW4gV1xuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBXLnQgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgVy5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IFcuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoVy50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChXLnNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBXLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IFcuY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBXLmNvbXBhcmF0b3JcbiAgbGV0IGNvbXBhcmUgPSBXLmNvbXBhcmVcbiAgbGV0IGludmFyaWFudCA9IFcuaW52YXJpYW50XG5cbiAgKCogV2UgZG9uJ3QgZXhwZWN0IFtoYXNoXSB0byBmb2xsb3cgdGhlIGJlaGF2aW9yIG9mIGludCBpbiA2NGJpdCBhcmNoaXRlY3R1cmUgKilcbiAgbGV0IF8gPSBoYXNoXG4gIGxldCBoYXNoICh4IDogdCkgPSBDYW1sLkhhc2h0YmwuaGFzaCB4XG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGludmFsaWRfc3RyIHggPSBQcmludGYuZmFpbHdpdGhmIFwiSW50NjMub2Zfc3RyaW5nOiBpbnZhbGlkIGlucHV0ICVTXCIgeCAoKVxuXG4gICgqXG4gICAgIFwic2lnblwiIHJlZmVycyB0byB3aGV0aGVyIHRoZSBudW1iZXIgc3RhcnRzIHdpdGggYSAnLSdcbiAgICAgXCJzaWduZWRuZXNzID0gZmFsc2VcIiBtZWFucyB0aGUgcmVzdCBvZiB0aGUgbnVtYmVyIGlzIHBhcnNlZCBhcyB1bnNpZ25lZCBhbmQgdGhlbiBjYXN0XG4gICAgIHRvIHNpZ25lZCB3aXRoIHdyYXAtYXJvdW5kIG1vZHVsbyAyXmlcbiAgICAgXCJzaWduZWRuZXNzID0gdHJ1ZVwiIG1lYW5zIG5vIHN1Y2ggY3JhemluZXNzIGhhcHBlbnNcblxuICAgICBUaGUgdGVybWlub2xvZ3kgYW5kIHRoZSBsb2dpYyBpcyBkdWUgdG8gdGhlIGNvZGUgaW4gYnl0ZXJ1bi9pbnRzLmMgaW4gb2NhbWwgNC4wM1xuICAgICAoW3BhcnNlX3NpZ25fYW5kX2Jhc2VdIGZ1bmN0aW9uKS5cblxuICAgICBTaWduZWRuZXNzIGVxdWFscyB0cnVlIGZvciBwbGFpbiBkZWNpbWFsIG51bWJlciAoZS5nLiAxMjM1LCAtNjc4OSlcblxuICAgICBTaWduZWRuZXNzIGVxdWFscyBmYWxzZSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuICAgICAtIFsweGZmZmZdLCBbLTB4ZmZmZl0gKGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uKVxuICAgICAtIFswYjAxMDFdLCBbLTBiMDEwMV0gKGJpbmFyeSByZXByZXNlbnRhdGlvbilcbiAgICAgLSBbMG8xMjM3XSwgWy0wbzEyMzddIChvY3RhbCByZXByZXNlbnRhdGlvbilcbiAgICAgLSBbMHU5ODEyXSwgWy0wdTk4MTJdICh1bnNpZ25lZCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIC0gYXZhaWxhYmxlIGZyb20gT0NhbWwgNC4wMykgKilcbiAgbGV0IHNpZ25fYW5kX3NpZ25lZG5lc3MgeCA9XG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggeCBpblxuICAgIGxldCBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBsZXQgcG9zLCBzaWduID1cbiAgICAgIGlmIDAgPCBsZW5cbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCB4LlswXSB3aXRoXG4gICAgICAgIHwgJy0nIC0+IDEsIGBOZWdcbiAgICAgICAgfCAnKycgLT4gMSwgYFBvc1xuICAgICAgICB8IF8gLT4gMCwgYFBvcylcbiAgICAgIGVsc2UgMCwgYFBvc1xuICAgIGluXG4gICAgaWYgcG9zICsgMiA8IGxlblxuICAgIHRoZW4gKFxuICAgICAgbGV0IGMxID0geC5bcG9zXSBpblxuICAgICAgbGV0IGMyID0geC5bcG9zICsgMV0gaW5cbiAgICAgIG1hdGNoIGMxLCBjMiB3aXRoXG4gICAgICB8ICcwJywgJzAnIC4uICc5JyAtPiBzaWduLCB0cnVlXG4gICAgICB8ICcwJywgXyAtPiBzaWduLCBmYWxzZVxuICAgICAgfCBfIC0+IHNpZ24sIHRydWUpXG4gICAgZWxzZSBzaWduLCB0cnVlXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyB4ID0gQ2FtbC5JbnQ2NC50b19zdHJpbmcgKHVud3JhcCB4KVxuXG4gIGxldCBvZl9zdHJpbmcgc3RyID1cbiAgICB0cnlcbiAgICAgIGxldCBzaWduLCBzaWduZWRuZXNzID0gc2lnbl9hbmRfc2lnbmVkbmVzcyBzdHIgaW5cbiAgICAgIGlmIHNpZ25lZG5lc3NcbiAgICAgIHRoZW4gb2ZfaW50NjRfZXhuIChDYW1sLkludDY0Lm9mX3N0cmluZyBzdHIpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHBvc19zdHIgPVxuICAgICAgICAgIG1hdGNoIHNpZ24gd2l0aFxuICAgICAgICAgIHwgYE5lZyAtPiBTdHJpbmcuc3ViIHN0ciB+cG9zOjEgfmxlbjooU3RyaW5nLmxlbmd0aCBzdHIgLSAxKVxuICAgICAgICAgIHwgYFBvcyAtPiBzdHJcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGludDY0ID0gQ2FtbC5JbnQ2NC5vZl9zdHJpbmcgcG9zX3N0ciBpblxuICAgICAgICAoKiB1bnNpZ25lZCA2My1iaXQgaW50IG11c3QgcGFyc2UgYXMgYSBwb3NpdGl2ZSBzaWduZWQgNjQtYml0IGludCAqKVxuICAgICAgICBpZiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgaW50NjQgMEwgdGhlbiBpbnZhbGlkX3N0ciBzdHI7XG4gICAgICAgIGxldCBpbnQ2MyA9IHdyYXBfbW9kdWxvIGludDY0IGluXG4gICAgICAgIG1hdGNoIHNpZ24gd2l0aFxuICAgICAgICB8IGBOZWcgLT4gbmVnIGludDYzXG4gICAgICAgIHwgYFBvcyAtPiBpbnQ2MylcbiAgICB3aXRoXG4gICAgfCBfIC0+IGludmFsaWRfc3RyIHN0clxuICA7O1xuXG4gIGxldCBic3dhcDE2IHQgPSB3cmFwX21vZHVsbyAoSW50NjQuYnN3YXAxNiAodW53cmFwIHQpKVxuICBsZXQgYnN3YXAzMiB0ID0gd3JhcF9tb2R1bG8gKEludDY0LmJzd2FwMzIgKHVud3JhcCB0KSlcbiAgbGV0IGJzd2FwNDggdCA9IHdyYXBfbW9kdWxvIChJbnQ2NC5ic3dhcDQ4ICh1bndyYXAgdCkpXG5lbmRcblxuaW5jbHVkZSBUXG5cbmxldCBudW1fYml0cyA9IDYzXG5sZXQgZmxvYXRfbG93ZXJfYm91bmQgPSBGbG9hdDAubG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X3VwcGVyX2JvdW5kID0gRmxvYXQwLnVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBzaGlmdF9yaWdodF9sb2dpY2FsID0gc2hpZnRfcmlnaHRfbG9naWNhbFxubGV0IHNoaWZ0X3JpZ2h0ID0gc2hpZnRfcmlnaHRcbmxldCBzaGlmdF9sZWZ0ID0gc2hpZnRfbGVmdFxubGV0IGJpdF9ub3QgPSBiaXRfbm90XG5sZXQgYml0X3hvciA9IGJpdF94b3JcbmxldCBiaXRfb3IgPSBiaXRfb3JcbmxldCBiaXRfYW5kID0gYml0X2FuZFxubGV0IHBvcGNvdW50ID0gcG9wY291bnRcbmxldCBhYnMgPSBhYnNcbmxldCBwcmVkID0gcHJlZFxubGV0IHN1Y2MgPSBzdWNjXG5sZXQgcG93ID0gcG93XG5sZXQgcmVtID0gcmVtXG5sZXQgbmVnID0gbmVnXG5sZXQgbWF4X3ZhbHVlID0gbWF4X3ZhbHVlXG5sZXQgbWluX3ZhbHVlID0gbWluX3ZhbHVlXG5sZXQgbWludXNfb25lID0gd3JhcF9leG4gQ2FtbC5JbnQ2NC5taW51c19vbmVcbmxldCBvbmUgPSB3cmFwX2V4biBDYW1sLkludDY0Lm9uZVxubGV0IHplcm8gPSB3cmFwX2V4biBDYW1sLkludDY0Lnplcm9cbmxldCBpc19wb3cyID0gaXNfcG93MlxubGV0IGZsb29yX3BvdzIgPSBmbG9vcl9wb3cyXG5sZXQgY2VpbF9wb3cyID0gY2VpbF9wb3cyXG5sZXQgZmxvb3JfbG9nMiA9IGZsb29yX2xvZzJcbmxldCBjZWlsX2xvZzIgPSBjZWlsX2xvZzJcbmxldCBjbHogPSBjbHpcbmxldCBjdHogPSBjdHpcbmxldCB0b19mbG9hdCB4ID0gQ2FtbC5JbnQ2NC50b19mbG9hdCAodW53cmFwIHgpXG5sZXQgb2ZfZmxvYXRfdW5jaGVja2VkIHggPSB3cmFwX21vZHVsbyAoQ2FtbC5JbnQ2NC5vZl9mbG9hdCB4KVxuXG5sZXQgb2ZfZmxvYXQgdCA9XG4gIGxldCBvcGVuIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICBpZiB0ID49IGZsb2F0X2xvd2VyX2JvdW5kICYmIHQgPD0gZmxvYXRfdXBwZXJfYm91bmRcbiAgdGhlbiB3cmFwX21vZHVsbyAoQ2FtbC5JbnQ2NC5vZl9mbG9hdCB0KVxuICBlbHNlXG4gICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgXCJJbnQ2My5vZl9mbG9hdDogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IHQpXG4gICAgICAoKVxuOztcblxubGV0IG9mX2ludDY0ID0gb2ZfaW50NjRcbmxldCBvZl9pbnQ2NF9leG4gPSBvZl9pbnQ2NF9leG5cbmxldCBvZl9pbnQ2NF90cnVuYyA9IG9mX2ludDY0X3RydW5jXG5sZXQgdG9faW50NjQgPSB0b19pbnQ2NFxuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbmxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxubGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgaWYgbWluID4gbWF4XG4gIHRoZW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbjs7XG5cbmxldCAoIC8gKSA9IGRpdlxubGV0ICggKiApID0gbXVsXG5sZXQgKCAtICkgPSBzdWJcbmxldCAoICsgKSA9IGFkZFxubGV0ICggfi0gKSA9IG5lZ1xubGV0ICggKiogKSBiIGUgPSBwb3cgYiBlXG5sZXQgaW5jciByID0gciA6PSAhciArIG9uZVxubGV0IGRlY3IgciA9IHIgOj0gIXIgLSBvbmVcblxuKCogV2UgY2FuIHJldXNlIGNvbnZlcnNpb24gZnVuY3Rpb24gZnJvbS90byBpbnQ2NCBoZXJlLiAqKVxubGV0IG9mX2ludCB4ID0gd3JhcF9leG4gKENvbnYuaW50X3RvX2ludDY0IHgpXG5sZXQgb2ZfaW50X2V4biB4ID0gb2ZfaW50IHhcbmxldCB0b19pbnQgeCA9IENvbnYuaW50NjRfdG9faW50ICh1bndyYXAgeClcbmxldCB0b19pbnRfZXhuIHggPSBDb252LmludDY0X3RvX2ludF9leG4gKHVud3JhcCB4KVxubGV0IHRvX2ludF90cnVuYyB4ID0gQ29udi5pbnQ2NF90b19pbnRfdHJ1bmMgKHVud3JhcCB4KVxubGV0IG9mX2ludDMyIHggPSB3cmFwX2V4biAoQ29udi5pbnQzMl90b19pbnQ2NCB4KVxubGV0IG9mX2ludDMyX2V4biB4ID0gb2ZfaW50MzIgeFxubGV0IHRvX2ludDMyIHggPSBDb252LmludDY0X3RvX2ludDMyICh1bndyYXAgeClcbmxldCB0b19pbnQzMl9leG4geCA9IENvbnYuaW50NjRfdG9faW50MzJfZXhuICh1bndyYXAgeClcbmxldCB0b19pbnQzMl90cnVuYyB4ID0gQ29udi5pbnQ2NF90b19pbnQzMl90cnVuYyAodW53cmFwIHgpXG5sZXQgb2ZfbmF0aXZlaW50IHggPSBvZl9pbnQ2NCAoQ29udi5uYXRpdmVpbnRfdG9faW50NjQgeClcbmxldCBvZl9uYXRpdmVpbnRfZXhuIHggPSB3cmFwX2V4biAoQ29udi5uYXRpdmVpbnRfdG9faW50NjQgeClcbmxldCBvZl9uYXRpdmVpbnRfdHJ1bmMgeCA9IG9mX2ludDY0X3RydW5jIChDb252Lm5hdGl2ZWludF90b19pbnQ2NCB4KVxubGV0IHRvX25hdGl2ZWludCB4ID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnQgKHVud3JhcCB4KVxubGV0IHRvX25hdGl2ZWludF9leG4geCA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50X2V4biAodW53cmFwIHgpXG5sZXQgdG9fbmF0aXZlaW50X3RydW5jIHggPSBDb252LmludDY0X3RvX25hdGl2ZWludF90cnVuYyAodW53cmFwIHgpXG5cbmluY2x1ZGUgQ29udi5NYWtlIChUKVxuXG5pbmNsdWRlIENvbnYuTWFrZV9oZXggKHN0cnVjdFxuICAgIHR5cGUgdCA9IFQudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKFQuY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBULmhhc2hfZm9sZF90XG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IFQuaGFzaCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgICBsZXQgbmVnID0gKCB+LSApXG4gICAgbGV0ICggPCApID0gKCA8IClcblxuICAgIGxldCB0b19zdHJpbmcgaSA9XG4gICAgICAoKiB0aGUgdXNlIG9mIFt1bndyYXBfdW5zaWduZWRdIGhlcmUgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZSBvZiBbbWluX3ZhbHVlXSAqKVxuICAgICAgUHJpbnRmLnNwcmludGYgXCIlTHhcIiAodW53cmFwX3Vuc2lnbmVkIGkpXG4gICAgOztcblxuICAgIGxldCBvZl9zdHJpbmcgcyA9IG9mX3N0cmluZyAoXCIweFwiIF4gcylcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50NjMuSGV4XCJcbiAgZW5kKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyB4ID0gdG9fc3RyaW5nIHhcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50NjNcIlxuICBlbmQpXG5cbm1vZHVsZSBQcmVfTyA9IHN0cnVjdFxuICBsZXQgKCArICkgPSAoICsgKVxuICBsZXQgKCAtICkgPSAoIC0gKVxuICBsZXQgKCAqICkgPSAoICogKVxuICBsZXQgKCAvICkgPSAoIC8gKVxuICBsZXQgKCB+LSApID0gKCB+LSApXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIChJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgOiBDb21wYXJpc29ucy5JbmZpeCB3aXRoIHR5cGUgdCA6PSB0KVxuXG4gIGxldCBhYnMgPSBhYnNcbiAgbGV0IG5lZyA9IG5lZ1xuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludF9leG4gPSBvZl9pbnRfZXhuXG5lbmRcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmVfT1xuXG4gIGluY2x1ZGUgSW50X21hdGguTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBpbmNsdWRlIFByZV9PXG5cbiAgICAgIGxldCByZW0gPSByZW1cbiAgICAgIGxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG4gICAgICBsZXQgb2ZfZmxvYXQgPSBvZl9mbG9hdFxuICAgICAgbGV0IG9mX3N0cmluZyA9IFQub2Zfc3RyaW5nXG4gICAgICBsZXQgdG9fc3RyaW5nID0gVC50b19zdHJpbmdcbiAgICBlbmQpXG5cbiAgbGV0ICggbGFuZCApID0gYml0X2FuZFxuICBsZXQgKCBsb3IgKSA9IGJpdF9vclxuICBsZXQgKCBseG9yICkgPSBiaXRfeG9yXG4gIGxldCBsbm90ID0gYml0X25vdFxuICBsZXQgKCBsc2wgKSA9IHNoaWZ0X2xlZnRcbiAgbGV0ICggYXNyICkgPSBzaGlmdF9yaWdodFxuICBsZXQgKCBsc3IgKSA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmVuZFxuXG5pbmNsdWRlIE9cblxuKCogW0ludDYzXSBhbmQgW0ludDYzLk9dIGFncmVlIHZhbHVlLXdpc2UgKilcblxubW9kdWxlIFJlcHIgPSBzdHJ1Y3RcbiAgdHlwZSBlbXVsYXRlZCA9IHRcblxuICB0eXBlICgndW5kZXJseWluZ190eXBlLCAnaW50ZXJtZWRpYXRlX3R5cGUpIHQgPVxuICAgIHwgSW50IDogKGludCwgaW50KSB0XG4gICAgfCBJbnQ2NCA6IChpbnQ2NCwgZW11bGF0ZWQpIHRcbmVuZFxuXG5sZXQgcmVwciA9IFJlcHIuSW50NjRcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGJvb2wgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVudW1lcmF0ZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlID0gKGNvbXBhcmVfYm9vbCA6IHQgLT4gdCAtPiBpbnQpXG4gIGxldCBhbGwgPSAoWyBmYWxzZTsgdHJ1ZSBdIDogdCBsaXN0KVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfYm9vbFxuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfYm9vbCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoYm9vbF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9ib29sIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGJvb2xfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5cbiAgbGV0IG9mX3N0cmluZyA9IGZ1bmN0aW9uXG4gICAgfCBcInRydWVcIiAtPiB0cnVlXG4gICAgfCBcImZhbHNlXCIgLT4gZmFsc2VcbiAgICB8IHMgLT4gaW52YWxpZF9hcmdmIFwiQm9vbC5vZl9zdHJpbmc6IGV4cGVjdGVkIHRydWUgb3IgZmFsc2UgYnV0IGdvdCAlc1wiIHMgKClcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nID0gQ2FtbC5zdHJpbmdfb2ZfYm9vbFxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkJvb2xcIlxuICBlbmQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIEJvb2xfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5sZXQgdG9faW50IHggPSBib29sX3RvX2ludCB4XG5cbm1vZHVsZSBOb25fc2hvcnRfY2lyY3VpdGluZyA9IHN0cnVjdFxuICAoKiBXZSBkb24ndCBleHBvc2UgdGhpcywgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBicmVhayB0aGUgaW52YXJpYW50IG1lbnRpb25lZCBiZWxvdyBvZlxuICAgICAodG9faW50IHRydWUgPSAxKSBhbmQgKHRvX2ludCBmYWxzZSA9IDApLiAqKVxuICBsZXQgdW5zYWZlX29mX2ludCAoeCA6IGludCkgOiBib29sID0gQ2FtbC5PYmoubWFnaWMgeFxuICBsZXQgKCB8fCApIGEgYiA9IHVuc2FmZV9vZl9pbnQgKHRvX2ludCBhIGxvciB0b19pbnQgYilcbiAgbGV0ICggJiYgKSBhIGIgPSB1bnNhZmVfb2ZfaW50ICh0b19pbnQgYSBsYW5kIHRvX2ludCBiKVxuZW5kXG5cbigqIFdlIGRvIHRoaXMgYXMgYSBkaXJlY3QgYXNzZXJ0IG9uIHRoZSB0aGVvcnkgdGhhdCBpdCdzIGEgY2hlYXAgdGhpbmcgdG8gdGVzdCBhbmQgYVxuICAgcmVhbGx5IGNvcmUgaW52YXJpYW50IHRoYXQgd2UgbmV2ZXIgZXhwZWN0IHRvIGJyZWFrLCBhbmQgd2Ugc2hvdWxkIGJlIGhhcHB5IGZvciBhXG4gICBwcm9ncmFtIHRvIGZhaWwgaW1tZWRpYXRlbHkgaWYgdGhpcyBpcyB2aW9sYXRlZC4gKilcbmxldCAoKSA9IGFzc2VydCAoUG9seS4oID0gKSAodG9faW50IHRydWUpIDEgJiYgUG9seS4oID0gKSAodG9faW50IGZhbHNlKSAwKVxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgQm9vbF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgQ2FtbC5JbnQzMlxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnQzMiBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfaW50MzJcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2ludDMyIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChpbnQzMl9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9pbnQzMiA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBpbnQzMl9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGNvbXBhcmUgKHggOiB0KSB5ID0gY29tcGFyZSB4IHlcbiAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICBsZXQgb2Zfc3RyaW5nID0gb2Zfc3RyaW5nXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxubGV0IG51bV9iaXRzID0gMzJcbmxldCBmbG9hdF9sb3dlcl9ib3VuZCA9IEZsb2F0MC5sb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfdXBwZXJfYm91bmQgPSBGbG9hdDAudXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X29mX2JpdHMgPSBmbG9hdF9vZl9iaXRzXG5sZXQgYml0c19vZl9mbG9hdCA9IGJpdHNfb2ZfZmxvYXRcbmxldCBzaGlmdF9yaWdodF9sb2dpY2FsID0gc2hpZnRfcmlnaHRfbG9naWNhbFxubGV0IHNoaWZ0X3JpZ2h0ID0gc2hpZnRfcmlnaHRcbmxldCBzaGlmdF9sZWZ0ID0gc2hpZnRfbGVmdFxubGV0IGJpdF9ub3QgPSBsb2dub3RcbmxldCBiaXRfeG9yID0gbG9neG9yXG5sZXQgYml0X29yID0gbG9nb3JcbmxldCBiaXRfYW5kID0gbG9nYW5kXG5sZXQgbWluX3ZhbHVlID0gbWluX2ludFxubGV0IG1heF92YWx1ZSA9IG1heF9pbnRcbmxldCBhYnMgPSBhYnNcbmxldCBwcmVkID0gcHJlZFxubGV0IHN1Y2MgPSBzdWNjXG5sZXQgcmVtID0gcmVtXG5sZXQgbmVnID0gbmVnXG5sZXQgbWludXNfb25lID0gbWludXNfb25lXG5sZXQgb25lID0gb25lXG5sZXQgemVybyA9IHplcm9cbmxldCBjb21wYXJlID0gY29tcGFyZVxubGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbmxldCBvZl9mbG9hdF91bmNoZWNrZWQgPSBvZl9mbG9hdFxuXG5sZXQgb2ZfZmxvYXQgZiA9XG4gIGlmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgZiBmbG9hdF9sb3dlcl9ib3VuZFxuICAmJiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIGYgZmxvYXRfdXBwZXJfYm91bmRcbiAgdGhlbiBvZl9mbG9hdCBmXG4gIGVsc2VcbiAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICBcIkludDMyLm9mX2Zsb2F0OiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggZilcbiAgICAgICgpXG47O1xuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbm1vZHVsZSBJbmZpeF9jb21wYXJlID0gc3RydWN0XG4gIG9wZW4gUG9seVxuXG4gIGxldCAoID49ICkgKHggOiB0KSB5ID0geCA+PSB5XG4gIGxldCAoIDw9ICkgKHggOiB0KSB5ID0geCA8PSB5XG4gIGxldCAoID0gKSAoeCA6IHQpIHkgPSB4ID0geVxuICBsZXQgKCA+ICkgKHggOiB0KSB5ID0geCA+IHlcbiAgbGV0ICggPCApICh4IDogdCkgeSA9IHggPCB5XG4gIGxldCAoIDw+ICkgKHggOiB0KSB5ID0geCA8PiB5XG5lbmRcblxubW9kdWxlIENvbXBhcmUgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBJbmZpeF9jb21wYXJlXG5cbiAgbGV0IGNvbXBhcmUgPSBjb21wYXJlXG4gIGxldCBhc2NlbmRpbmcgPSBjb21wYXJlXG4gIGxldCBkZXNjZW5kaW5nIHggeSA9IGNvbXBhcmUgeSB4XG4gIGxldCBtaW4gKHggOiB0KSB5ID0gaWYgeCA8IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWF4ICh4IDogdCkgeSA9IGlmIHggPiB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IGVxdWFsICh4IDogdCkgeSA9IHggPSB5XG4gIGxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxuICBsZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG4gIGxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICAgIGFzc2VydCAobWluIDw9IG1heCk7XG4gICAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG4gIDs7XG5cbiAgbGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXhcbiAgICB0aGVuXG4gICAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gICAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgQ29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0ICggLyApID0gZGl2XG5sZXQgKCAqICkgPSBtdWxcbmxldCAoIC0gKSA9IHN1YlxubGV0ICggKyApID0gYWRkXG5sZXQgKCB+LSApID0gbmVnXG5sZXQgaW5jciByID0gciA6PSAhciArIG9uZVxubGV0IGRlY3IgciA9IHIgOj0gIXIgLSBvbmVcbmxldCBvZl9pbnQzMiB0ID0gdFxubGV0IG9mX2ludDMyX2V4biA9IG9mX2ludDMyXG5sZXQgdG9faW50MzIgdCA9IHRcbmxldCB0b19pbnQzMl9leG4gPSB0b19pbnQzMlxubGV0IHBvcGNvdW50ID0gUG9wY291bnQuaW50MzJfcG9wY291bnRcblxubW9kdWxlIENvbnYgPSBJbnRfY29udmVyc2lvbnNcblxubGV0IG9mX2ludCA9IENvbnYuaW50X3RvX2ludDMyXG5sZXQgb2ZfaW50X2V4biA9IENvbnYuaW50X3RvX2ludDMyX2V4blxubGV0IG9mX2ludF90cnVuYyA9IENvbnYuaW50X3RvX2ludDMyX3RydW5jXG5sZXQgdG9faW50ID0gQ29udi5pbnQzMl90b19pbnRcbmxldCB0b19pbnRfZXhuID0gQ29udi5pbnQzMl90b19pbnRfZXhuXG5sZXQgdG9faW50X3RydW5jID0gQ29udi5pbnQzMl90b19pbnRfdHJ1bmNcbmxldCBvZl9pbnQ2NCA9IENvbnYuaW50NjRfdG9faW50MzJcbmxldCBvZl9pbnQ2NF9leG4gPSBDb252LmludDY0X3RvX2ludDMyX2V4blxubGV0IG9mX2ludDY0X3RydW5jID0gQ29udi5pbnQ2NF90b19pbnQzMl90cnVuY1xubGV0IHRvX2ludDY0ID0gQ29udi5pbnQzMl90b19pbnQ2NFxubGV0IG9mX25hdGl2ZWludCA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyXG5sZXQgb2ZfbmF0aXZlaW50X2V4biA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyX2V4blxubGV0IG9mX25hdGl2ZWludF90cnVuYyA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyX3RydW5jXG5sZXQgdG9fbmF0aXZlaW50ID0gQ29udi5pbnQzMl90b19uYXRpdmVpbnRcbmxldCB0b19uYXRpdmVpbnRfZXhuID0gdG9fbmF0aXZlaW50XG5sZXQgcG93IGIgZSA9IG9mX2ludF9leG4gKEludF9tYXRoLlByaXZhdGUuaW50X3BvdyAodG9faW50X2V4biBiKSAodG9faW50X2V4biBlKSlcbmxldCAoICoqICkgYiBlID0gcG93IGIgZVxuXG5leHRlcm5hbCBic3dhcDMyIDogdCAtPiB0ID0gXCIlYnN3YXBfaW50MzJcIlxuXG5sZXQgYnN3YXAxNiB4ID0gQ2FtbC5JbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIChic3dhcDMyIHgpIDE2XG5cbm1vZHVsZSBQb3cyID0gc3RydWN0XG4gIG9wZW4hIEltcG9ydFxuICBvcGVuIEludDMyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4gIGxldCBub25fcG9zaXRpdmVfYXJndW1lbnQgKCkgPVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJhcmd1bWVudCBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlXCIgKClcbiAgOztcblxuICBsZXQgKCBsb3IgKSA9IENhbWwuSW50MzIubG9nb3JcbiAgbGV0ICggbHNyICkgPSBDYW1sLkludDMyLnNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbiAgbGV0ICggbGFuZCApID0gQ2FtbC5JbnQzMi5sb2dhbmRcblxuICAoKiogXCJjZWlsaW5nIHBvd2VyIG9mIDJcIiAtIExlYXN0IHBvd2VyIG9mIDIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBjZWlsX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDMyLnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSBDYW1sLkludDMyLnByZWQgeCBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgQ2FtbC5JbnQzMi5zdWNjIHhcbiAgOztcblxuICAoKiogXCJmbG9vciBwb3dlciBvZiAyXCIgLSBMYXJnZXN0IHBvd2VyIG9mIDIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBmbG9vcl9wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQzMi56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgQ2FtbC5JbnQzMi5zdWIgeCAoeCBsc3IgMSlcbiAgOztcblxuICBsZXQgaXNfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50MzIuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICB4IGxhbmQgQ2FtbC5JbnQzMi5wcmVkIHggPSBDYW1sLkludDMyLnplcm9cbiAgOztcblxuICAoKiBDIHN0dWJzIGZvciBpbnQzMiBjbHogYW5kIGN0eiB0byB1c2UgdGhlIENMWi9CU1IvQ1RaL0JTRiBpbnN0cnVjdGlvbiB3aGVyZSBwb3NzaWJsZSAqKVxuICBleHRlcm5hbCBjbHpcbiAgICA6ICAoaW50MzJbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHpcIiBcIkJhc2VfaW50X21hdGhfaW50MzJfY2x6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGN0elxuICAgIDogIChpbnQzMltAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludDMyX2N0elwiIFwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgZmxvb3JfbG9nMiBpID1cbiAgICBpZiBpIDw9IENhbWwuSW50MzIuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZSBcIltJbnQzMi5mbG9vcl9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQzMiBpIF0pO1xuICAgIG51bV9iaXRzIC0gMSAtIGNseiBpXG4gIDs7XG5cbiAgKCoqIEhhY2tlcidzIERlbGlnaHQgU2Vjb25kIEVkaXRpb24gcDEwNiAqKVxuICBsZXQgY2VpbF9sb2cyIGkgPVxuICAgIGlmIGkgPD0gQ2FtbC5JbnQzMi56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0ludDMyLmNlaWxfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50MzIgaSBdKTtcbiAgICAoKiBUaGUgW2kgPSAxXSBjaGVjayBpcyBuZWVkZWQgYmVjYXVzZSBjbHooMCkgaXMgdW5kZWZpbmVkICopXG4gICAgaWYgQ2FtbC5JbnQzMi5lcXVhbCBpIENhbWwuSW50MzIub25lIHRoZW4gMCBlbHNlIG51bV9iaXRzIC0gY2x6IChDYW1sLkludDMyLnByZWQgaSlcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFBvdzJcbmluY2x1ZGUgQ29udi5NYWtlIChUKVxuXG5pbmNsdWRlIENvbnYuTWFrZV9oZXggKHN0cnVjdFxuICAgIHR5cGUgdCA9IGludDMyIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9pbnQzMiA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBoYXNoX2ZvbGRfaW50MzJcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gaGFzaF9pbnQzMiBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgICBsZXQgbmVnID0gKCB+LSApXG4gICAgbGV0ICggPCApID0gKCA8IClcbiAgICBsZXQgdG9fc3RyaW5nIGkgPSBQcmludGYuc3ByaW50ZiBcIiVseFwiIGlcbiAgICBsZXQgb2Zfc3RyaW5nIHMgPSBDYW1sLlNjYW5mLnNzY2FuZiBzIFwiJWx4XCIgRm4uaWRcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50MzIuSGV4XCJcbiAgZW5kKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQzMlwiXG4gIGVuZClcblxubW9kdWxlIFByZV9PID0gc3RydWN0XG4gIGxldCAoICsgKSA9ICggKyApXG4gIGxldCAoIC0gKSA9ICggLSApXG4gIGxldCAoICogKSA9ICggKiApXG4gIGxldCAoIC8gKSA9ICggLyApXG4gIGxldCAoIH4tICkgPSAoIH4tIClcbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgKENvbXBhcmUgOiBDb21wYXJpc29ucy5JbmZpeCB3aXRoIHR5cGUgdCA6PSB0KVxuXG4gIGxldCBhYnMgPSBhYnNcbiAgbGV0IG5lZyA9IG5lZ1xuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludF9leG4gPSBvZl9pbnRfZXhuXG5lbmRcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmVfT1xuXG4gIGluY2x1ZGUgSW50X21hdGguTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBpbmNsdWRlIFByZV9PXG5cbiAgICAgIGxldCByZW0gPSByZW1cbiAgICAgIGxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG4gICAgICBsZXQgb2ZfZmxvYXQgPSBvZl9mbG9hdFxuICAgICAgbGV0IG9mX3N0cmluZyA9IFQub2Zfc3RyaW5nXG4gICAgICBsZXQgdG9fc3RyaW5nID0gVC50b19zdHJpbmdcbiAgICBlbmQpXG5cbiAgbGV0ICggbGFuZCApID0gYml0X2FuZFxuICBsZXQgKCBsb3IgKSA9IGJpdF9vclxuICBsZXQgKCBseG9yICkgPSBiaXRfeG9yXG4gIGxldCBsbm90ID0gYml0X25vdFxuICBsZXQgKCBsc2wgKSA9IHNoaWZ0X2xlZnRcbiAgbGV0ICggYXNyICkgPSBzaGlmdF9yaWdodFxuICBsZXQgKCBsc3IgKSA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmVuZFxuXG5pbmNsdWRlIE9cblxuKCogW0ludDMyXSBhbmQgW0ludDMyLk9dIGFncmVlIHZhbHVlLXdpc2UgKilcbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxubW9kdWxlIFJlcHIgPSBJbnQ2M19lbXVsLlJlcHJcblxuKCogSW4gYSB3b3JsZCB3aGVyZSB0aGUgY29tcGlsZXIgd291bGQgdW5kZXJzdGFuZCBbQEBpbW1lZGlhdGU2NF0gYXR0cmlidXRlcyBvbiB0eXBlXG4gICBkZWNsYXJhdGlvbnMsIHRoaXMgbW9kdWxlIGlzIGhvdyBvbmUgd291bGQgcHJvZHVjZSBhIFt0eXBlIHRdIHdpdGggdGhpcyBhdHRyaWJ1dGUuICopXG5tb2R1bGUgSW1tZWRpYXRlNjQgOiBzaWdcbiAgbW9kdWxlIHR5cGUgTm9uX2ltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBJbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlXVxuICBlbmRcblxuICBtb2R1bGUgTWFrZSAoSW1tZWRpYXRlIDogSW1tZWRpYXRlKSAoTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUpIDogc2lnXG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZTY0XVxuXG4gICAgdHlwZSAnYSByZXByID1cbiAgICAgIHwgSW1tZWRpYXRlIDogSW1tZWRpYXRlLnQgcmVwclxuICAgICAgfCBOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZS50IHJlcHJcblxuICAgIHZhbCByZXByIDogdCByZXByXG4gIGVuZFxuZW5kID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIE5vbl9pbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgSW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZV1cbiAgZW5kXG5cbiAgbW9kdWxlIE1ha2UgKEltbWVkaWF0ZSA6IEltbWVkaWF0ZSkgKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA9IHN0cnVjdFxuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cblxuICAgIHR5cGUgJ2EgcmVwciA9XG4gICAgICB8IEltbWVkaWF0ZSA6IEltbWVkaWF0ZS50IHJlcHJcbiAgICAgIHwgTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUudCByZXByXG5cbiAgICBsZXQgcmVwciA9XG4gICAgICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgICAgIHwgVzY0IC0+IChDYW1sLk9iai5tYWdpYyBJbW1lZGlhdGUgOiB0IHJlcHIpXG4gICAgICB8IFczMiAtPiAoQ2FtbC5PYmoubWFnaWMgTm9uX2ltbWVkaWF0ZSA6IHQgcmVwcilcbiAgICA7O1xuICBlbmRcbmVuZFxuXG5pbmNsdWRlIEltbWVkaWF0ZTY0Lk1ha2UgKEludCkgKEludDYzX2VtdWwpXG5cbm1vZHVsZSBCYWNrZW5kID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIGluY2x1ZGUgSW50X2ludGYuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICB2YWwgb2ZfaW50IDogaW50IC0+IHRcbiAgICB2YWwgdG9faW50IDogdCAtPiBpbnQgb3B0aW9uXG4gICAgdmFsIHRvX2ludF90cnVuYyA6IHQgLT4gaW50XG4gICAgdmFsIG9mX2ludDMyIDogaW50MzIgLT4gdFxuICAgIHZhbCB0b19pbnQzMiA6IHQgLT4gSW50MzIudCBvcHRpb25cbiAgICB2YWwgdG9faW50MzJfdHJ1bmMgOiB0IC0+IEludDMyLnRcbiAgICB2YWwgb2ZfaW50NjQgOiBJbnQ2NC50IC0+IHQgb3B0aW9uXG4gICAgdmFsIG9mX2ludDY0X3RydW5jIDogSW50NjQudCAtPiB0XG4gICAgdmFsIG9mX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiB0IG9wdGlvblxuICAgIHZhbCB0b19uYXRpdmVpbnQgOiB0IC0+IG5hdGl2ZWludCBvcHRpb25cbiAgICB2YWwgb2ZfbmF0aXZlaW50X3RydW5jIDogbmF0aXZlaW50IC0+IHRcbiAgICB2YWwgdG9fbmF0aXZlaW50X3RydW5jIDogdCAtPiBuYXRpdmVpbnRcbiAgICB2YWwgb2ZfZmxvYXRfdW5jaGVja2VkIDogZmxvYXQgLT4gdFxuICAgIHZhbCByZXByIDogKHQsIHQpIEludDYzX2VtdWwuUmVwci50XG4gICAgdmFsIGJzd2FwMTYgOiB0IC0+IHRcbiAgICB2YWwgYnN3YXAzMiA6IHQgLT4gdFxuICAgIHZhbCBic3dhcDQ4IDogdCAtPiB0XG4gIGVuZFxuICB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgbW9kdWxlIE5hdGl2ZSA9IHN0cnVjdFxuICAgIGluY2x1ZGUgSW50XG5cbiAgICBsZXQgdG9faW50IHggPSBTb21lIHhcbiAgICBsZXQgdG9faW50X3RydW5jIHggPSB4XG5cbiAgICAoKiBbb2ZfaW50MzJfZXhuXSBpcyBhIHNhZmUgb3BlcmF0aW9uIG9uIHBsYXRmb3JtcyB3aXRoIDY0LWJpdCB3b3JkIHNpemVzLiAqKVxuICAgIGxldCBvZl9pbnQzMiA9IG9mX2ludDMyX2V4blxuICAgIGxldCB0b19uYXRpdmVpbnRfdHJ1bmMgeCA9IHRvX25hdGl2ZWludCB4XG4gICAgbGV0IHRvX25hdGl2ZWludCB4ID0gU29tZSAodG9fbmF0aXZlaW50IHgpXG4gICAgbGV0IHJlcHIgPSBJbnQ2M19lbXVsLlJlcHIuSW50XG4gICAgbGV0IGJzd2FwMzIgdCA9IEludDY0LnRvX2ludF90cnVuYyAoSW50NjQuYnN3YXAzMiAoSW50NjQub2ZfaW50IHQpKVxuICAgIGxldCBic3dhcDQ4IHQgPSBJbnQ2NC50b19pbnRfdHJ1bmMgKEludDY0LmJzd2FwNDggKEludDY0Lm9mX2ludCB0KSlcbiAgZW5kXG5cbiAgbGV0IGltcGwgOiAobW9kdWxlIFMpID1cbiAgICBtYXRjaCByZXByIHdpdGhcbiAgICB8IEltbWVkaWF0ZSAtPiAobW9kdWxlIE5hdGl2ZSA6IFMpXG4gICAgfCBOb25faW1tZWRpYXRlIC0+IChtb2R1bGUgSW50NjNfZW11bCA6IFMpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSAodmFsIEJhY2tlbmQuaW1wbCA6IEJhY2tlbmQuUylcblxubW9kdWxlIE92ZXJmbG93X2V4biA9IHN0cnVjdFxuICBsZXQgKCArICkgdCB1ID1cbiAgICBsZXQgc3VtID0gdCArIHUgaW5cbiAgICBpZiBiaXRfb3IgKGJpdF94b3IgdCB1KSAoYml0X3hvciB0IChiaXRfbm90IHN1bSkpIDwgemVyb1xuICAgIHRoZW4gc3VtXG4gICAgZWxzZVxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiKCArICkgb3ZlcmZsb3dcIlxuICAgICAgICAgICBbIFwidFwiLCBzZXhwX29mX3QgdDsgXCJ1XCIsIHNleHBfb2ZfdCB1OyBcInN1bVwiLCBzZXhwX29mX3Qgc3VtIF0pXG4gIDs7XG5cbiAgbGV0ICggLSApIHQgdSA9XG4gICAgbGV0IGRpZmYgPSB0IC0gdSBpblxuICAgIGxldCBwb3NfZGlmZiA9IHQgPiB1IGluXG4gICAgaWYgdCA8PiB1ICYmIEJvb2wuKCA8PiApIHBvc19kaWZmIChpc19wb3NpdGl2ZSBkaWZmKVxuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIiggLSApIG92ZXJmbG93XCJcbiAgICAgICAgICAgWyBcInRcIiwgc2V4cF9vZl90IHQ7IFwidVwiLCBzZXhwX29mX3QgdTsgXCJkaWZmXCIsIHNleHBfb2ZfdCBkaWZmIF0pXG4gICAgZWxzZSBkaWZmXG4gIDs7XG5cbiAgbGV0IG5lZ2F0aXZlX29uZSA9IG9mX2ludCAoLTEpXG4gIGxldCBkaXZfd291bGRfb3ZlcmZsb3cgdCB1ID0gdCA9IG1pbl92YWx1ZSAmJiB1ID0gbmVnYXRpdmVfb25lXG5cbiAgbGV0ICggKiApIHQgdSA9XG4gICAgbGV0IHByb2R1Y3QgPSB0ICogdSBpblxuICAgIGlmIHUgPD4gemVybyAmJiAoZGl2X3dvdWxkX292ZXJmbG93IHByb2R1Y3QgdSB8fCBwcm9kdWN0IC8gdSA8PiB0KVxuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIiggKiApIG92ZXJmbG93XCJcbiAgICAgICAgICAgWyBcInRcIiwgc2V4cF9vZl90IHQ7IFwidVwiLCBzZXhwX29mX3QgdTsgXCJwcm9kdWN0XCIsIHNleHBfb2ZfdCBwcm9kdWN0IF0pXG4gICAgZWxzZSBwcm9kdWN0XG4gIDs7XG5cbiAgbGV0ICggLyApIHQgdSA9XG4gICAgaWYgZGl2X3dvdWxkX292ZXJmbG93IHQgdVxuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIiggLyApIG92ZXJmbG93XCJcbiAgICAgICAgICAgWyBcInRcIiwgc2V4cF9vZl90IHQ7IFwidVwiLCBzZXhwX29mX3QgdTsgXCJwcm9kdWN0XCIsIHNleHBfb2ZfdCAodCAvIHUpIF0pXG4gICAgZWxzZSB0IC8gdVxuICA7O1xuXG4gIGxldCBhYnMgdCA9IGlmIHQgPSBtaW5fdmFsdWUgdGhlbiBmYWlsd2l0aCBcImFicyBvdmVyZmxvd1wiIGVsc2UgYWJzIHRcbiAgbGV0IG5lZyB0ID0gaWYgdCA9IG1pbl92YWx1ZSB0aGVuIGZhaWx3aXRoIFwibmVnIG92ZXJmbG93XCIgZWxzZSBuZWcgdFxuZW5kXG5cbmxldCAoKSA9IGFzc2VydCAoSW50LiggPSApIG51bV9iaXRzIDYzKVxuXG5sZXQgcmFuZG9tX29mX2ludCA/KHN0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGJvdW5kID1cbiAgb2ZfaW50IChSYW5kb20uU3RhdGUuaW50IHN0YXRlICh0b19pbnRfZXhuIGJvdW5kKSlcbjs7XG5cbmxldCByYW5kb21fb2ZfaW50NjQgPyhzdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBib3VuZCA9XG4gIG9mX2ludDY0X2V4biAoUmFuZG9tLlN0YXRlLmludDY0IHN0YXRlICh0b19pbnQ2NCBib3VuZCkpXG47O1xuXG5sZXQgcmFuZG9tID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IHJhbmRvbV9vZl9pbnRcbiAgfCBXMzIgLT4gcmFuZG9tX29mX2ludDY0XG47O1xuXG5sZXQgcmFuZG9tX2luY2xfb2ZfaW50ID8oc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgbG8gaGkgPVxuICBvZl9pbnQgKFJhbmRvbS5TdGF0ZS5pbnRfaW5jbCBzdGF0ZSAodG9faW50X2V4biBsbykgKHRvX2ludF9leG4gaGkpKVxuOztcblxubGV0IHJhbmRvbV9pbmNsX29mX2ludDY0ID8oc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgbG8gaGkgPVxuICBvZl9pbnQ2NF9leG4gKFJhbmRvbS5TdGF0ZS5pbnQ2NF9pbmNsIHN0YXRlICh0b19pbnQ2NCBsbykgKHRvX2ludDY0IGhpKSlcbjs7XG5cbmxldCByYW5kb21faW5jbCA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiByYW5kb21faW5jbF9vZl9pbnRcbiAgfCBXMzIgLT4gcmFuZG9tX2luY2xfb2ZfaW50NjRcbjs7XG5cbmxldCBmbG9vcl9sb2cyIHQgPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gdCB8PiB0b19pbnRfZXhuIHw+IEludC5mbG9vcl9sb2cyXG4gIHwgVzMyIC0+XG4gICAgaWYgdCA8PSB6ZXJvXG4gICAgdGhlbiByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSW50LmZsb29yX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX3QgdCBdKTtcbiAgICBsZXQgZmxvb3JfbG9nMiA9IHJlZiAoSW50LiggLSApIG51bV9iaXRzIDIpIGluXG4gICAgd2hpbGUgZXF1YWwgemVybyAoYml0X2FuZCB0IChzaGlmdF9sZWZ0IG9uZSAhZmxvb3JfbG9nMikpIGRvXG4gICAgICBmbG9vcl9sb2cyIDo9IEludC4oIC0gKSAhZmxvb3JfbG9nMiAxXG4gICAgZG9uZTtcbiAgICAhZmxvb3JfbG9nMlxuOztcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIFJlcHIgPSBSZXByXG5cbiAgbGV0IHJlcHIgPSByZXByXG5cbiAgbW9kdWxlIEVtdWwgPSBJbnQ2M19lbXVsXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLkhhc2h0YmwuS2V5ICopXG5tb2R1bGUgS2V5ID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgKCoqIFR3byBbdF1zIHRoYXQgW2NvbXBhcmVdIGVxdWFsIG11c3QgaGF2ZSBlcXVhbCBoYXNoZXMgZm9yIHRoZSBoYXNodGFibGVcbiAgICAgICAgdG8gYmVoYXZlIHByb3Blcmx5LiAqKVxuICAgIHZhbCBoYXNoIDogdCAtPiBpbnRcbiAgZW5kXG5cbiAgdHlwZSAnYSB0ID0gKG1vZHVsZSBTIHdpdGggdHlwZSB0ID0gJ2EpXG5lbmRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5IYXNodGJsLk1lcmdlX2ludG9fYWN0aW9uICopXG5tb2R1bGUgTWVyZ2VfaW50b19hY3Rpb24gPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID1cbiAgICB8IFJlbW92ZVxuICAgIHwgU2V0X3RvIG9mICdhXG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzID0gc2lnXG4gICgqKiB7MiBBY2Nlc3NvcnN9ICopXG5cbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgJ2Ega2V5XG5cbiAgdmFsIHNleHBfb2Zfa2V5IDogKCdhLCBfKSB0IC0+ICdhIGtleSAtPiBTZXhwLnRcbiAgdmFsIGNsZWFyIDogKF8sIF8pIHQgLT4gdW5pdFxuICB2YWwgY29weSA6ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgdFxuXG4gICgqKiBBdHRlbXB0aW5nIHRvIG1vZGlmeSAoW3NldF0sIFtyZW1vdmVdLCBldGMuKSB0aGUgaGFzaHRhYmxlIGR1cmluZyBpdGVyYXRpb24gKFtmb2xkXSxcbiAgICAgIFtpdGVyXSwgW2l0ZXJfa2V5c10sIFtpdGVyaV0pIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLiAqKVxuICB2YWwgZm9sZCA6ICgnYSwgJ2IpIHQgLT4gaW5pdDonYyAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGl0ZXJfa2V5cyA6ICgnYSwgXykgdCAtPiBmOignYSBrZXkgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlciA6IChfLCAnYikgdCAtPiBmOignYiAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIEl0ZXJhdGVzIG92ZXIgYm90aCBrZXlzIGFuZCB2YWx1ZXMuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaCA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDQpOyAoNSwgNildIGluXG4gICAgICBIYXNodGJsLml0ZXJpIGggfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgICAgIHByaW50X2VuZGxpbmUgKFByaW50Zi5zcHJpbnRmIFwiJWQtJWRcIiBrZXkgZGF0YSkpOztcbiAgICAgIDEtNFxuICAgICAgNS02XG4gICAgICAtIDogdW5pdCA9ICgpXG4gICAgICB2fSAqKVxuICB2YWwgaXRlcmkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGV4aXN0c2kgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50aSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgY291bnQgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBsZW5ndGggOiAoXywgXykgdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgbWVtIDogKCdhLCBfKSB0IC0+ICdhIGtleSAtPiBib29sXG4gIHZhbCByZW1vdmUgOiAoJ2EsIF8pIHQgLT4gJ2Ega2V5IC0+IHVuaXRcbiAgdmFsIGNob29zZSA6ICgnYSwgJ2IpIHQgLT4gKCdhIGtleSAqICdiKSBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAqICdiXG5cbiAgKCoqIFNldHMgdGhlIGdpdmVuIFtrZXldIHRvIFtkYXRhXS4gKilcbiAgdmFsIHNldCA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIGtleSAtPiBkYXRhOidiIC0+IHVuaXRcblxuICAoKiogW2FkZF0gYW5kIFthZGRfZXhuXSBsZWF2ZSB0aGUgdGFibGUgdW5jaGFuZ2VkIGlmIHRoZSBrZXkgd2FzIGFscmVhZHkgcHJlc2VudC4gKilcbiAgdmFsIGFkZCA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIGtleSAtPiBkYXRhOidiIC0+IFsgYE9rIHwgYER1cGxpY2F0ZSBdXG5cbiAgdmFsIGFkZF9leG4gOiAoJ2EsICdiKSB0IC0+IGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiB1bml0XG5cbiAgKCoqIFtjaGFuZ2UgdCBrZXkgfmZdIGNoYW5nZXMgW3RdJ3MgdmFsdWUgZm9yIFtrZXldIHRvIGJlIFtmIChmaW5kIHQga2V5KV0uICopXG4gIHZhbCBjaGFuZ2UgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiBmOignYiBvcHRpb24gLT4gJ2Igb3B0aW9uKSAtPiB1bml0XG5cbiAgKCoqIFt1cGRhdGUgdCBrZXkgfmZdIGlzIFtjaGFuZ2UgdCBrZXkgfmY6KGZ1biBvIC0+IFNvbWUgKGYgbykpXS4gKilcbiAgdmFsIHVwZGF0ZSA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+IGY6KCdiIG9wdGlvbiAtPiAnYikgLT4gdW5pdFxuXG4gICgqKiBbdXBkYXRlX2FuZF9yZXR1cm4gdCBrZXkgfmZdIGlzIFt1cGRhdGVdLCBidXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIFtmIG9dLiAqKVxuICB2YWwgdXBkYXRlX2FuZF9yZXR1cm4gOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiBmOignYiBvcHRpb24gLT4gJ2IpIC0+ICdiXG5cbiAgKCoqIFttYXAgdCBmXSByZXR1cm5zIGEgbmV3IHRhYmxlIHdpdGggdmFsdWVzIHJlcGxhY2VkIGJ5IHRoZSByZXN1bHQgb2YgYXBwbHlpbmcgW2ZdXG4gICAgICB0byB0aGUgY3VycmVudCB2YWx1ZXMuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaCA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDQpOyAoNSwgNildIGluXG4gICAgICBsZXQgaCcgPSBIYXNodGJsLm1hcCBoIH5mOihmdW4geCAtPiB4ICogMikgaW5cbiAgICAgIEhhc2h0YmwudG9fYWxpc3QgaCc7O1xuICAgICAgLSA6IChpbnQgKiBpbnQpIGxpc3QgPSBbKDUsIDEyKTsgKDEsIDgpXVxuICAgICAgdn0gKilcbiAgdmFsIG1hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gJ2MpIC0+ICgnYSwgJ2MpIHRcblxuICAoKiogTGlrZSBbbWFwXSwgYnV0IHRoZSBmdW5jdGlvbiBbZl0gdGFrZXMgYm90aCBrZXkgYW5kIGRhdGEgYXMgYXJndW1lbnRzLiAqKVxuICB2YWwgbWFwaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdjKSAtPiAoJ2EsICdjKSB0XG5cbiAgKCoqIFJldHVybnMgYSBuZXcgdGFibGUgYnkgZmlsdGVyaW5nIHRoZSBnaXZlbiB0YWJsZSdzIHZhbHVlcyBieSBbZl06IHRoZSBrZXlzIGZvciB3aGljaFxuICAgICAgW2ZdIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcmV0dXJucyBbU29tZV0gYXJlIGtlcHQsIGFuZCB0aG9zZSBmb3Igd2hpY2ggaXRcbiAgICAgIHJldHVybnMgW05vbmVdIGFyZSBkaXNjYXJkZWQuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaCA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDQpOyAoNSwgNildIGluXG4gICAgICBIYXNodGJsLmZpbHRlcl9tYXAgaCB+ZjooZnVuIHggLT4gaWYgeCA+IDUgdGhlbiBTb21lIHggZWxzZSBOb25lKVxuICAgICAgfD4gSGFzaHRibC50b19hbGlzdDs7XG4gICAgICAtIDogKGludCAqIGludCkgbGlzdCA9IFsoNSwgNildXG4gICAgICB2fSAqKVxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gJ2Mgb3B0aW9uKSAtPiAoJ2EsICdjKSB0XG5cbiAgKCoqIExpa2UgW2ZpbHRlcl9tYXBdLCBidXQgdGhlIGZ1bmN0aW9uIFtmXSB0YWtlcyBib3RoIGtleSBhbmQgZGF0YSBhcyBhcmd1bWVudHMuICopXG4gIHZhbCBmaWx0ZXJfbWFwaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdjIG9wdGlvbikgLT4gKCdhLCAnYykgdFxuXG4gIHZhbCBmaWx0ZXJfa2V5cyA6ICgnYSwgJ2IpIHQgLT4gZjooJ2Ega2V5IC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuICB2YWwgZmlsdGVyaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcblxuICAoKiogUmV0dXJucyBuZXcgdGFibGVzIHdpdGggYm91bmQgdmFsdWVzIHBhcnRpdGlvbmVkIGJ5IFtmXSBhcHBsaWVkIHRvIHRoZSBib3VuZFxuICAgICAgdmFsdWVzLiAqKVxuICB2YWwgcGFydGl0aW9uX21hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpIC0+ICgnYSwgJ2MpIHQgKiAoJ2EsICdkKSB0XG5cbiAgKCoqIExpa2UgW3BhcnRpdGlvbl9tYXBdLCBidXQgdGhlIGZ1bmN0aW9uIFtmXSB0YWtlcyBib3RoIGtleSBhbmQgZGF0YSBhcyBhcmd1bWVudHMuICopXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYykgdCAqICgnYSwgJ2QpIHRcblxuICAoKiogUmV0dXJucyBhIHBhaXIgb2YgdGFibGVzIFsodDEsIHQyKV0sIHdoZXJlIFt0MV0gY29udGFpbnMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGVcbiAgICAgIGluaXRpYWwgdGFibGUgd2hpY2ggc2F0aXNmeSB0aGUgcHJlZGljYXRlIFtmXSwgYW5kIFt0Ml0gY29udGFpbnMgdGhlIHJlc3QuICopXG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHQgKiAoJ2EsICdiKSB0XG5cbiAgKCoqIExpa2UgW3BhcnRpdGlvbl90Zl0sIGJ1dCB0aGUgZnVuY3Rpb24gW2ZdIHRha2VzIGJvdGgga2V5IGFuZCBkYXRhIGFzIGFyZ3VtZW50cy4gKilcbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYikgdCAqICgnYSwgJ2IpIHRcblxuICAoKiogW2ZpbmRfb3JfYWRkIHQgayB+ZGVmYXVsdF0gcmV0dXJucyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGgga2V5IFtrXSBpZiBpdCBpcyBpbiB0aGVcbiAgICAgIHRhYmxlIFt0XSwgYW5kIG90aGVyd2lzZSBhc3NpZ25zIFtrXSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgW2RlZmF1bHQgKCldLiAqKVxuICB2YWwgZmluZF9vcl9hZGQgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiBkZWZhdWx0Oih1bml0IC0+ICdiKSAtPiAnYlxuXG4gICgqKiBMaWtlIFtmaW5kX29yX2FkZF0gYnV0IFtkZWZhdWx0XSB0YWtlcyB0aGUga2V5IGFzIGFuIGFyZ3VtZW50LiAqKVxuICB2YWwgZmluZGlfb3JfYWRkIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gZGVmYXVsdDooJ2Ega2V5IC0+ICdiKSAtPiAnYlxuXG4gICgqKiBbZmluZCB0IGtdIHJldHVybnMgW1NvbWVdICh0aGUgY3VycmVudCBiaW5kaW5nKSBvZiBba10gaW4gW3RdLCBvciBbTm9uZV0gaWYgbm8gc3VjaFxuICAgICAgYmluZGluZyBleGlzdHMuICopXG4gIHZhbCBmaW5kIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gJ2Igb3B0aW9uXG5cbiAgKCoqIFtmaW5kX2V4biB0IGtdIHJldHVybnMgdGhlIGN1cnJlbnQgYmluZGluZyBvZiBba10gaW4gW3RdLCBvciByYWlzZXMgW0NhbWwuTm90X2ZvdW5kXVxuICAgICAgb3IgW05vdF9mb3VuZF9zXSBpZiBubyBzdWNoIGJpbmRpbmcgZXhpc3RzLiAqKVxuICB2YWwgZmluZF9leG4gOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiAnYlxuXG4gICgqKiBbZmluZF9hbmRfY2FsbCB0IGsgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRdXG5cbiAgICAgIGlzIGVxdWl2YWxlbnQgdG86XG5cbiAgICAgIFttYXRjaCBmaW5kIHQgayB3aXRoIFNvbWUgdiAtPiBpZl9mb3VuZCB2IHwgTm9uZSAtPiBpZl9ub3RfZm91bmQga11cblxuICAgICAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhbGxvY2F0ZSB0aGUgb3B0aW9uLiAqKVxuICB2YWwgZmluZF9hbmRfY2FsbFxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBpZl9mb3VuZDooJ2IgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICAoKiogSnVzdCBsaWtlIFtmaW5kX2FuZF9jYWxsXSwgYnV0IHRha2VzIGFuIGV4dHJhIGFyZ3VtZW50IHdoaWNoIGlzIHBhc3NlZCB0byBbaWZfZm91bmRdXG4gICAgICBhbmQgW2lmX25vdF9mb3VuZF0sIHNvIHRoYXQgdGhlIGNsaWVudCBjb2RlIGNhbiBhdm9pZCBhbGxvY2F0aW5nIGNsb3N1cmVzIG9yIHVzaW5nXG4gICAgICByZWZzIHRvIHBhc3MgdGhpcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCBpbiBjb2RlXG4gICAgICB3aGljaCB0cmllcyB0byBtaW5pbWl6ZSBoZWFwIGFsbG9jYXRpb24uICopXG4gIHZhbCBmaW5kX2FuZF9jYWxsMVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBhOidkXG4gICAgLT4gaWZfZm91bmQ6KCdiIC0+ICdkIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdkIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIGZpbmRfYW5kX2NhbGwyXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGE6J2RcbiAgICAtPiBiOidlXG4gICAgLT4gaWZfZm91bmQ6KCdiIC0+ICdkIC0+ICdlIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdkIC0+ICdlIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIGZpbmRpX2FuZF9jYWxsXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGlmX2ZvdW5kOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgZmluZGlfYW5kX2NhbGwxXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICdhIGtleVxuICAgIC0+IGE6J2RcbiAgICAtPiBpZl9mb3VuZDooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdkIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdkIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIGZpbmRpX2FuZF9jYWxsMlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBhOidkXG4gICAgLT4gYjonZVxuICAgIC0+IGlmX2ZvdW5kOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2QgLT4gJ2UgLT4gJ2MpXG4gICAgLT4gaWZfbm90X2ZvdW5kOignYSBrZXkgLT4gJ2QgLT4gJ2UgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICAoKiogW2ZpbmRfYW5kX3JlbW92ZSB0IGtdIHJldHVybnMgU29tZSAodGhlIGN1cnJlbnQgYmluZGluZykgb2YgayBpbiB0IGFuZCByZW1vdmVzIGl0LFxuICAgICAgb3IgTm9uZSBpcyBubyBzdWNoIGJpbmRpbmcgZXhpc3RzLiAqKVxuICB2YWwgZmluZF9hbmRfcmVtb3ZlIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gJ2Igb3B0aW9uXG5cbiAgKCoqIE1lcmdlcyB0d28gaGFzaHRhYmxlcy5cblxuICAgICAgVGhlIHJlc3VsdCBvZiBbbWVyZ2UgZiBoMSBoMl0gaGFzIGFzIGtleXMgdGhlIHNldCBvZiBhbGwgW2tdIGluIHRoZSB1bmlvbiBvZiB0aGVcbiAgICAgIHNldHMgb2Yga2V5cyBvZiBbaDFdIGFuZCBbaDJdIGZvciB3aGljaCBbZChrKV0gaXMgbm90IE5vbmUsIHdoZXJlOlxuXG4gICAgICBkKGspID1cbiAgICAgIC0gW2YgfmtleTprIChgTGVmdCBkMSldXG4gICAgICAgIGlmIFtrXSBpbiBbaDFdIG1hcHMgdG8gZDEsIGFuZCBbaDJdIGRvZXMgbm90IGhhdmUgZGF0YSBmb3IgW2tdO1xuXG4gICAgICAtIFtmIH5rZXk6ayAoYFJpZ2h0IGQyKV1cbiAgICAgICAgaWYgW2tdIGluIFtoMl0gbWFwcyB0byBkMiwgYW5kIFtoMV0gZG9lcyBub3QgaGF2ZSBkYXRhIGZvciBba107XG5cbiAgICAgIC0gW2YgfmtleTprIChgQm90aCAoZDEsIGQyKSldXG4gICAgICAgIG90aGVyd2lzZSwgd2hlcmUgW2tdIGluIFtoMV0gbWFwcyB0byBbZDFdIGFuZCBba10gaW4gW2gyXSBtYXBzIHRvIFtkMl0uXG5cbiAgICAgIEVhY2gga2V5IFtrXSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgcGllY2Ugb2YgZGF0YSBbeF0sIHdoZXJlIFtkKGspID0gU29tZSB4XS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoMSA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDUpOyAoMiwgMzIzMildIGluXG4gICAgICBsZXQgaDIgPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCAzKV0gaW5cbiAgICAgIEhhc2h0YmwubWVyZ2UgaDEgaDIgfmY6KGZ1biB+a2V5Ol8gLT4gZnVuY3Rpb25cbiAgICAgICAgfCBgTGVmdCB4IC0+IFNvbWUgKGBMZWZ0IHgpXG4gICAgICAgIHwgYFJpZ2h0IHggLT4gU29tZSAoYFJpZ2h0IHgpXG4gICAgICAgIHwgYEJvdGggKHgsIHkpIC0+IGlmIHg9eSB0aGVuIE5vbmUgZWxzZSBTb21lIChgQm90aCAoeCx5KSlcbiAgICAgICkgfD4gSGFzaHRibC50b19hbGlzdDs7XG4gICAgICAtIDogKGludCAqIFs+IGBCb3RoIG9mIGludCAqIGludCB8IGBMZWZ0IG9mIGludCB8IGBSaWdodCBvZiBpbnQgXSkgbGlzdCA9XG4gICAgICBbKDIsIGBMZWZ0IDMyMzIpOyAoMSwgYEJvdGggKDUsIDMpKV1cbiAgICAgIHZ9ICopXG4gIHZhbCBtZXJnZVxuICAgIDogICgnaywgJ2EpIHRcbiAgICAtPiAoJ2ssICdiKSB0XG4gICAgLT4gZjooa2V5OidrIGtleSAtPiBbIGBMZWZ0IG9mICdhIHwgYFJpZ2h0IG9mICdiIHwgYEJvdGggb2YgJ2EgKiAnYiBdIC0+ICdjIG9wdGlvbilcbiAgICAtPiAoJ2ssICdjKSB0XG5cblxuICAoKiogRXZlcnkgW2tleV0gaW4gW3NyY10gd2lsbCBiZSByZW1vdmVkIG9yIHNldCBpbiBbZHN0XSBhY2NvcmRpbmcgdG8gdGhlIHJldHVybiB2YWx1ZVxuICAgICAgb2YgW2ZdLiAqKVxuICB2YWwgbWVyZ2VfaW50b1xuICAgIDogIHNyYzooJ2ssICdhKSB0XG4gICAgLT4gZHN0OignaywgJ2IpIHRcbiAgICAtPiBmOihrZXk6J2sga2V5IC0+ICdhIC0+ICdiIG9wdGlvbiAtPiAnYiBNZXJnZV9pbnRvX2FjdGlvbi50KVxuICAgIC0+IHVuaXRcblxuICAoKiogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwga2V5cyBmb3IgZ2l2ZW4gaGFzaHRhYmxlLiAqKVxuICB2YWwga2V5cyA6ICgnYSwgXykgdCAtPiAnYSBrZXkgbGlzdFxuXG4gICgqKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBkYXRhIGZvciBnaXZlbiBoYXNodGFibGUuICopXG4gIHZhbCBkYXRhIDogKF8sICdiKSB0IC0+ICdiIGxpc3RcblxuICAoKiogW2ZpbHRlcl9pbnBsYWNlIHQgfmZdIHJlbW92ZXMgYWxsIHRoZSBlbGVtZW50cyBmcm9tIFt0XSB0aGF0IGRvbid0IHNhdGlzZnkgW2ZdLiAqKVxuICB2YWwgZmlsdGVyX2tleXNfaW5wbGFjZSA6ICgnYSwgXykgdCAtPiBmOignYSBrZXkgLT4gYm9vbCkgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXJfaW5wbGFjZSA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiB1bml0XG4gIHZhbCBmaWx0ZXJpX2lucGxhY2UgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKSAtPiB1bml0XG5cbiAgKCoqIFttYXBfaW5wbGFjZSB0IH5mXSBhcHBsaWVzIFtmXSB0byBhbGwgZWxlbWVudHMgaW4gW3RdLCB0cmFuc2Zvcm1pbmcgdGhlbSBpblxuICAgICAgcGxhY2UuICopXG4gIHZhbCBtYXBfaW5wbGFjZSA6IChfLCAnYikgdCAtPiBmOignYiAtPiAnYikgLT4gdW5pdFxuXG4gIHZhbCBtYXBpX2lucGxhY2UgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYikgLT4gdW5pdFxuXG4gICgqKiBbZmlsdGVyX21hcF9pbnBsYWNlXSBjb21iaW5lcyB0aGUgZWZmZWN0cyBvZiBbbWFwX2lucGxhY2VdIGFuZCBbZmlsdGVyX2lucGxhY2VdLiAqKVxuICB2YWwgZmlsdGVyX21hcF9pbnBsYWNlIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+ICdiIG9wdGlvbikgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXJfbWFwaV9pbnBsYWNlIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2Igb3B0aW9uKSAtPiB1bml0XG5cbiAgKCoqIFtlcXVhbCBmIHQxIHQyXSBhbmQgW3NpbWlsYXIgZiB0MSB0Ml0gYm90aCByZXR1cm4gdHJ1ZSBpZmYgW3QxXSBhbmQgW3QyXSBoYXZlIHRoZVxuICAgICAgc2FtZSBrZXlzIGFuZCBmb3IgYWxsIGtleXMgW2tdLCBbZiAoZmluZF9leG4gdDEgaykgKGZpbmRfZXhuIHQyIGspXS4gIFtlcXVhbF0gYW5kXG4gICAgICBbc2ltaWxhcl0gb25seSBkaWZmZXIgaW4gdGhlaXIgdHlwZXMuICopXG4gIHZhbCBlcXVhbCA6ICgnYiAtPiAnYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gYm9vbFxuXG4gIHZhbCBzaW1pbGFyIDogKCdiMSAtPiAnYjIgLT4gYm9vbCkgLT4gKCdhLCAnYjEpIHQgLT4gKCdhLCAnYjIpIHQgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCAoa2V5LCBkYXRhKSBwYWlycyBmb3IgZ2l2ZW4gaGFzaHRhYmxlLiAqKVxuICB2YWwgdG9fYWxpc3QgOiAoJ2EsICdiKSB0IC0+ICgnYSBrZXkgKiAnYikgbGlzdFxuXG5cbiAgKCoqIFtyZW1vdmVfaWZfemVyb10ncyBkZWZhdWx0IGlzIFtmYWxzZV0uICopXG4gIHZhbCBpbmNyIDogP2J5OmludCAtPiA/cmVtb3ZlX2lmX3plcm86Ym9vbCAtPiAoJ2EsIGludCkgdCAtPiAnYSBrZXkgLT4gdW5pdFxuXG4gIHZhbCBkZWNyIDogP2J5OmludCAtPiA/cmVtb3ZlX2lmX3plcm86Ym9vbCAtPiAoJ2EsIGludCkgdCAtPiAnYSBrZXkgLT4gdW5pdFxuZW5kXG5cbm1vZHVsZSB0eXBlIE11bHRpID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICdhIGtleVxuXG4gICgqKiBbYWRkX211bHRpIHQgfmtleSB+ZGF0YV0gaWYgW2tleV0gaXMgcHJlc2VudCBpbiB0aGUgdGFibGUgdGhlbiBjb25zXG4gICAgICBbZGF0YV0gb24gdGhlIGxpc3QsIG90aGVyd2lzZSBhZGQgW2tleV0gd2l0aCBhIHNpbmdsZSBlbGVtZW50IGxpc3QuICopXG4gIHZhbCBhZGRfbXVsdGkgOiAoJ2EsICdiIGxpc3QpIHQgLT4ga2V5OidhIGtleSAtPiBkYXRhOidiIC0+IHVuaXRcblxuICAoKiogW3JlbW92ZV9tdWx0aSB0IGtleV0gdXBkYXRlcyB0aGUgdGFibGUsIHJlbW92aW5nIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGJvdW5kIHRvXG4gICAgICBba2V5XS4gSWYgdGhlIGxpc3QgaGFzIG9ubHkgb25lIGVsZW1lbnQgKG9yIGlzIGVtcHR5KSB0aGVuIHRoZSBiaW5kaW5nIGlzXG4gICAgICByZW1vdmVkLiAqKVxuICB2YWwgcmVtb3ZlX211bHRpIDogKCdhLCBfIGxpc3QpIHQgLT4gJ2Ega2V5IC0+IHVuaXRcblxuICAoKiogW2ZpbmRfbXVsdGkgdCBrZXldIHJldHVybnMgdGhlIGVtcHR5IGxpc3QgaWYgW2tleV0gaXMgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlLFxuICAgICAgcmV0dXJucyBbdF0ncyB2YWx1ZXMgZm9yIFtrZXldIG90aGVyd2lzZS4gKilcbiAgdmFsIGZpbmRfbXVsdGkgOiAoJ2EsICdiIGxpc3QpIHQgLT4gJ2Ega2V5IC0+ICdiIGxpc3RcbmVuZFxuXG50eXBlICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zID1cbiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgLT4gJ2tleSBLZXkudFxuICAtPiAnelxuXG50eXBlICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlID1cbiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgLT4gJ3pcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAnYSBrZXlcbiAgdHlwZSAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBjcmVhdGUgOiAoJ2Ega2V5LCAnYiwgdW5pdCAtPiAoJ2EsICdiKSB0KSBjcmVhdGVfb3B0aW9uc1xuXG5cbiAgdmFsIG9mX2FsaXN0XG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnYlxuICAgICAgLCAoJ2Ega2V5ICogJ2IpIGxpc3QgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIGtleSBdIClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzXG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnYlxuICAgICAgLCAoJ2Ega2V5ICogJ2IpIGxpc3QgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBrZXkgbGlzdCBdIClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3JcbiAgICA6ICgnYSBrZXksICdiLCAoJ2Ega2V5ICogJ2IpIGxpc3QgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50KSBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9leG4gOiAoJ2Ega2V5LCAnYiwgKCdhIGtleSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IpIHQpIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X211bHRpXG4gICAgOiAoJ2Ega2V5LCAnYiBsaXN0LCAoJ2Ega2V5ICogJ2IpIGxpc3QgLT4gKCdhLCAnYiBsaXN0KSB0KSBjcmVhdGVfb3B0aW9uc1xuXG5cbiAgKCoqIHtbIGNyZWF0ZV9tYXBwZWQgZ2V0X2tleSBnZXRfZGF0YSBbeDEsLi4uLHhuXVxuICAgICAgICAgPSBvZl9hbGlzdCBbZ2V0X2tleSB4MSwgZ2V0X2RhdGEgeDE7IC4uLjsgZ2V0X2tleSB4biwgZ2V0X2RhdGEgeG5dIF19ICopXG4gIHZhbCBjcmVhdGVfbWFwcGVkXG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnYlxuICAgICAgLCBnZXRfa2V5OignciAtPiAnYSBrZXkpXG4gICAgICAgIC0+IGdldF9kYXRhOignciAtPiAnYilcbiAgICAgICAgLT4gJ3IgbGlzdFxuICAgICAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGtleSBsaXN0IF0gKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuXG5cbiAgKCoqIHtbIGNyZWF0ZV93aXRoX2tleSB+Z2V0X2tleSBbeDEsLi4uLHhuXVxuICAgICAgICAgPSBvZl9hbGlzdCBbZ2V0X2tleSB4MSwgeDE7IC4uLjsgZ2V0X2tleSB4biwgeG5dIF19ICopXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdyXG4gICAgICAsIGdldF9rZXk6KCdyIC0+ICdhIGtleSlcbiAgICAgICAgLT4gJ3IgbGlzdFxuICAgICAgICAtPiBbIGBPayBvZiAoJ2EsICdyKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGtleSBsaXN0IF0gKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3JcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdyXG4gICAgICAsIGdldF9rZXk6KCdyIC0+ICdhIGtleSkgLT4gJ3IgbGlzdCAtPiAoJ2EsICdyKSB0IE9yX2Vycm9yLnQgKVxuICAgICAgICBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlfZXhuXG4gICAgOiAoJ2Ega2V5LCAnciwgZ2V0X2tleTooJ3IgLT4gJ2Ega2V5KSAtPiAnciBsaXN0IC0+ICgnYSwgJ3IpIHQpIGNyZWF0ZV9vcHRpb25zXG5cblxuICB2YWwgZ3JvdXBcbiAgICA6ICggJ2Ega2V5XG4gICAgICAsICdiXG4gICAgICAsIGdldF9rZXk6KCdyIC0+ICdhIGtleSlcbiAgICAgICAgLT4gZ2V0X2RhdGE6KCdyIC0+ICdiKVxuICAgICAgICAtPiBjb21iaW5lOignYiAtPiAnYiAtPiAnYilcbiAgICAgICAgLT4gJ3IgbGlzdFxuICAgICAgICAtPiAoJ2EsICdiKSB0IClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9ycyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcblxuICAoKiogezIgQ3JlYXRvcnN9ICopXG5cbiAgKCoqIFRoZSBtb2R1bGUgeW91IHBhc3MgdG8gW2NyZWF0ZV0gbXVzdCBoYXZlIGEgdHlwZSB0aGF0IGlzIGhhc2hhYmxlLCBzZXhwYWJsZSwgYW5kXG4gICAgICBjb21wYXJhYmxlLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgICBIYXNodGJsLmNyZWF0ZSAobW9kdWxlIEludCk7O1xuICAgICAgICAtIDogKGludCwgJ19hKSBIYXNodGJsLnQgPSA8YWJzdHI+OztcbiAgICAgIHZ9ICopXG4gIHZhbCBjcmVhdGVcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EsICdiKSB0XG5cbiAgKCoqIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICAgICBIYXNodGJsLm9mX2FsaXN0IChtb2R1bGUgSW50KSBbKDMsIFwic29tZXRoaW5nXCIpOyAoMiwgXCJ3aGF0ZXZlclwiKV1cbiAgICAgICAgIC0gOiBbIGBEdXBsaWNhdGVfa2V5IG9mIGludCB8IGBPayBvZiAoaW50LCBzdHJpbmcpIEhhc2h0YmwudCBdID0gYE9rIDxhYnN0cj5cbiAgICAgIHZ9ICopXG4gIHZhbCBvZl9hbGlzdFxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICAoKiogV2hlcmVhcyBbb2ZfYWxpc3RdIHdpbGwgcmVwb3J0IFtEdXBsaWNhdGVfa2V5XSBubyBtYXR0ZXIgaG93IG1hbnkgZHVwcyB0aGVyZSBhcmUgaW5cbiAgICAgIHlvdXIgbGlzdCwgW29mX2FsaXN0X3JlcG9ydF9hbGxfZHVwc10gd2lsbCByZXBvcnQgZWFjaCBhbmQgZXZlcnkgZHVwbGljYXRlIGVudHJ5LlxuXG4gICAgICBGb3IgZXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgICAgSGFzaHRibC5vZl9hbGlzdCAobW9kdWxlIEludCkgWygxLCBcImZvb1wiKTsgKDEsIFwiYmFyXCIpOyAoMiwgXCJmb29cIik7ICgyLCBcImJhclwiKV07O1xuICAgICAgICAtIDogWyBgRHVwbGljYXRlX2tleSBvZiBpbnQgfCBgT2sgb2YgKGludCwgc3RyaW5nKSBIYXNodGJsLnQgXSA9IGBEdXBsaWNhdGVfa2V5IDFcblxuICAgICAgICBIYXNodGJsLm9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyAobW9kdWxlIEludCkgWygxLCBcImZvb1wiKTsgKDEsIFwiYmFyXCIpOyAoMiwgXCJmb29cIik7ICgyLCBcImJhclwiKV07O1xuICAgICAgICAtIDogWyBgRHVwbGljYXRlX2tleXMgb2YgaW50IGxpc3QgfCBgT2sgb2YgKGludCwgc3RyaW5nKSBIYXNodGJsLnQgXSA9IGBEdXBsaWNhdGVfa2V5cyBbMTsgMl1cbiAgICAgIHZ9ICopXG4gIHZhbCBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHNcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2EgbGlzdCBdXG5cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2ZfYWxpc3RfZXhuXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSB7eyFNdWx0aX0gXCJtdWx0aVwifSBoYXNodGFibGUsIGkuZS4sIGEgaGFzaHRhYmxlIHdoZXJlIGVhY2gga2V5IHBvaW50cyB0byBhXG4gICAgICBsaXN0IHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgdmFsdWVzLiBTbyBpbnN0ZWFkIG9mIHNob3J0LWNpcmN1aXRpbmcgd2l0aCBhXG4gICAgICBbYER1cGxpY2F0ZV9rZXldIHZhcmlhbnQgb24gZHVwbGljYXRlcywgYXMgaW4gW29mX2FsaXN0XSwgW29mX2FsaXN0X211bHRpXSBmb2xkc1xuICAgICAgdGhvc2UgdmFsdWVzIGludG8gYSBsaXN0IGZvciB0aGUgZ2l2ZW4ga2V5OlxuXG4gICAgICB7dlxuICAgICAgbGV0IGggPSBIYXNodGJsLm9mX2FsaXN0X211bHRpIChtb2R1bGUgSW50KSBbKDEsIFwiYVwiKTsgKDEsIFwiYlwiKTsgKDIsIFwiY1wiKTsgKDIsIFwiZFwiKV07O1xuICAgICAgdmFsIGggOiAoaW50LCBzdHJpbmcgbGlzdCkgSGFzaHRibC50ID0gPGFic3RyPlxuXG4gICAgICBIYXNodGJsLmZpbmRfZXhuIGggMTs7XG4gICAgICAtIDogc3RyaW5nIGxpc3QgPSBbXCJiXCI7IFwiYVwiXVxuICAgICAgdn0gKilcbiAgdmFsIG9mX2FsaXN0X211bHRpXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiIGxpc3QpIHRcblxuICAoKiogQXBwbGllcyB0aGUgW2dldF9rZXldIGFuZCBbZ2V0X2RhdGFdIGZ1bmN0aW9ucyB0byB0aGUgWydyIGxpc3RdIHRvIGNyZWF0ZSB0aGVcbiAgICAgIGluaXRpYWwga2V5cyBhbmQgdmFsdWVzLCByZXNwZWN0aXZlbHksIGZvciB0aGUgbmV3IGhhc2h0YWJsZS5cblxuICAgICAge1sgY3JlYXRlX21hcHBlZCBnZXRfa2V5IGdldF9kYXRhIFt4MTsuLi47eG5dXG4gICAgICAgICA9IG9mX2FsaXN0IFtnZXRfa2V5IHgxLCBnZXRfZGF0YSB4MTsgLi4uOyBnZXRfa2V5IHhuLCBnZXRfZGF0YSB4bl1cbiAgICAgIF19XG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICAgIGxldCBoID1cbiAgICAgICAgICBIYXNodGJsLmNyZWF0ZV9tYXBwZWQgKG1vZHVsZSBJbnQpXG4gICAgICAgICAgICB+Z2V0X2tleTooZnVuIHggLT4geClcbiAgICAgICAgICAgIH5nZXRfZGF0YTooZnVuIHggLT4geCArIDEpXG4gICAgICAgICAgIFsxOyAyOyAzXTs7XG4gICAgICAgIHZhbCBoIDogWyBgRHVwbGljYXRlX2tleXMgb2YgaW50IGxpc3QgfCBgT2sgb2YgKGludCwgaW50KSBIYXNodGJsLnQgXSA9IGBPayA8YWJzdHI+XG5cbiAgICAgICAgbGV0IGggPVxuICAgICAgICAgIG1hdGNoIGggd2l0aFxuICAgICAgICAgIHwgYE9rIHggLT4geFxuICAgICAgICAgIHwgYER1cGxpY2F0ZV9rZXlzIF8gLT4gZmFpbHdpdGggXCJcIlxuICAgICAgICBpblxuICAgICAgICBIYXNodGJsLmZpbmRfZXhuIGggMTs7XG4gICAgICAgIC0gOiBpbnQgPSAyXG4gICAgICB2fSAqKVxuICB2YWwgY3JlYXRlX21hcHBlZFxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+IGdldF9rZXk6KCdyIC0+ICdhKVxuICAgIC0+IGdldF9kYXRhOignciAtPiAnYilcbiAgICAtPiAnciBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBsaXN0IF1cblxuICAoKioge1sgY3JlYXRlX3dpdGhfa2V5IH5nZXRfa2V5IFt4MTsuLi47eG5dXG4gICAgICAgICA9IG9mX2FsaXN0IFtnZXRfa2V5IHgxLCB4MTsgLi4uOyBnZXRfa2V5IHhuLCB4bl0gXX0gKilcbiAgdmFsIGNyZWF0ZV93aXRoX2tleVxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+IGdldF9rZXk6KCdyIC0+ICdhKVxuICAgIC0+ICdyIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdyKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGxpc3QgXVxuXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3JcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiBnZXRfa2V5OignciAtPiAnYSlcbiAgICAtPiAnciBsaXN0XG4gICAgLT4gKCdhLCAncikgdCBPcl9lcnJvci50XG5cbiAgdmFsIGNyZWF0ZV93aXRoX2tleV9leG5cbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiBnZXRfa2V5OignciAtPiAnYSlcbiAgICAtPiAnciBsaXN0XG4gICAgLT4gKCdhLCAncikgdFxuXG4gICgqKiBMaWtlIFtjcmVhdGVfbWFwcGVkXSwgYXBwbGllcyB0aGUgW2dldF9rZXldIGFuZCBbZ2V0X2RhdGFdIGZ1bmN0aW9ucyB0byB0aGUgWydyXG4gICAgICBsaXN0XSB0byBjcmVhdGUgdGhlIGluaXRpYWwga2V5cyBhbmQgdmFsdWVzLCByZXNwZWN0aXZlbHksIGZvciB0aGUgbmV3IGhhc2h0YWJsZSAtLVxuICAgICAgYW5kIHRoZW4sIGxpa2UgW2FkZF9tdWx0aV0sIGZvbGRzIHRvZ2V0aGVyIHZhbHVlcyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUga2V5cy4gSGVyZSxcbiAgICAgIHRob3VnaCwgdGhlIGZ1bmN0aW9uIHVzZWQgZm9yIHRoZSBmb2xkaW5nIGlzIGdpdmVuIGJ5IFtjb21iaW5lXSAoaW5zdGVhZCBvZiBqdXN0XG4gICAgICBiZWluZyBhIFtjb25zXSkuXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICAgICBIYXNodGJsLmdyb3VwIChtb2R1bGUgSW50KVxuICAgICAgICAgICB+Z2V0X2tleTooZnVuIHggLT4geCAvIDIpXG4gICAgICAgICAgIH5nZXRfZGF0YTooZnVuIHggLT4geClcbiAgICAgICAgICAgfmNvbWJpbmU6KGZ1biB4IHkgLT4geCAqIHkpXG4gICAgICAgICAgICBbIDE7IDI7IDM7IDRdXG4gICAgICAgICB8PiBIYXNodGJsLnRvX2FsaXN0OztcbiAgICAgICAgIC0gOiAoaW50ICogaW50KSBsaXN0ID0gWygyLCA0KTsgKDEsIDYpOyAoMCwgMSldXG4gICAgICAgdn0gKilcbiAgdmFsIGdyb3VwXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gZ2V0X2tleTooJ3IgLT4gJ2EpXG4gICAgLT4gZ2V0X2RhdGE6KCdyIC0+ICdiKVxuICAgIC0+IGNvbWJpbmU6KCdiIC0+ICdiIC0+ICdiKVxuICAgIC0+ICdyIGxpc3RcbiAgICAtPiAoJ2EsICdiKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU193aXRob3V0X3N1Ym1vZHVsZXMgPSBzaWdcbiAgdmFsIGhhc2ggOiAnYSAtPiBpbnRcbiAgdmFsIGhhc2hfcGFyYW0gOiBpbnQgLT4gaW50IC0+ICdhIC0+IGludFxuXG4gIHR5cGUgKCdhLCAnYikgdFxuXG4gICgqKiBXZSBwcm92aWRlIGEgW3NleHBfb2ZfdF0gYnV0IG5vdCBhIFt0X29mX3NleHBdIGZvciB0aGlzIHR5cGUgYmVjYXVzZSBvbmUgbmVlZHMgdG8gYmVcbiAgICAgIGV4cGxpY2l0IGFib3V0IHRoZSBoYXNoIGFuZCBjb21wYXJpc29uIGZ1bmN0aW9ucyB1c2VkIHdoZW4gY3JlYXRpbmcgYSBoYXNodGFibGUuXG4gICAgICBOb3RlIHRoYXQgW0hhc2h0YmwuUG9seS50XSBkb2VzIGhhdmUgW1tAQGRlcml2aW5nIHNleHBdXSwgYW5kIHVzZXMgT0NhbWwncyBidWlsdC1pblxuICAgICAgcG9seW1vcnBoaWMgY29tcGFyaXNvbiBhbmQgYW5kIHBvbHltb3JwaGljIGhhc2hpbmcuICopXG4gIHZhbCBzZXhwX29mX3QgOiAoJ2EgLT4gU2V4cC50KSAtPiAoJ2IgLT4gU2V4cC50KSAtPiAoJ2EsICdiKSB0IC0+IFNleHAudFxuXG4gIGluY2x1ZGUgQ3JlYXRvcnMgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCAoKiogQGlubGluZSAqKVxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgd2l0aCB0eXBlICdhIGtleSA9ICdhXG4gICgqKiBAaW5saW5lICopXG5cblxuICBpbmNsdWRlIE11bHRpIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBrZXlcbiAgKCoqIEBpbmxpbmUgKilcblxuICB2YWwgaGFzaGFibGVfcyA6ICgna2V5LCBfKSB0IC0+ICdrZXkgS2V5LnRcblxuICBpbmNsdWRlIEludmFyaWFudC5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU19wb2x5ID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGluY2x1ZGUgU2V4cGxpYjAuU2V4cGFibGUuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hclxuICAgIDogICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgLT4gJ2IgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAtPiAoJ2EsICdiKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cblxuICB2YWwgaGFzaGFibGUgOiAnYSBIYXNoYWJsZS50XG5cbiAgaW5jbHVkZSBJbnZhcmlhbnQuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yc19nZW5lcmljXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgIHdpdGggdHlwZSAnYSBrZXkgPSAnYVxuICAgIHdpdGggdHlwZSAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9ucyA6PVxuICAgICAgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcblxuICBpbmNsdWRlIEFjY2Vzc29ycyB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0IHdpdGggdHlwZSAnYSBrZXkgOj0gJ2Ega2V5XG4gIGluY2x1ZGUgTXVsdGkgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIGtleVxuZW5kXG5cbm1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IHNpZ1xuICB0eXBlICgnaywgJ3YpIHRcblxuICBtb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICAgIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gICAgW0BAQGVuZF1cblxuICAgIGluY2x1ZGUgS2V5LlMgd2l0aCB0eXBlIHQgOj0gdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gICAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcblxuICB2YWwgc2V4cF9vZl9tX190XG4gICAgOiAgKG1vZHVsZSBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAoJ3YgLT4gU2V4cC50KVxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICAtPiBTZXhwLnRcblxuICB2YWwgbV9fdF9vZl9zZXhwXG4gICAgOiAgKG1vZHVsZSBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAoU2V4cC50IC0+ICd2KVxuICAgIC0+IFNleHAudFxuICAgIC0+ICgnaywgJ3YpIHRcblxuICB2YWwgbV9fdF9zZXhwX2dyYW1tYXJcbiAgICA6ICAobW9kdWxlIE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gJ3YgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAtPiAoJ2ssICd2KSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgdmFsIGVxdWFsX21fX3RcbiAgICA6ICAobW9kdWxlIEVxdWFsX20pXG4gICAgLT4gKCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgLT4gKCdrLCAndikgdFxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICAtPiBib29sXG5lbmRcblxubW9kdWxlIHR5cGUgSGFzaHRibCA9IHNpZ1xuICAoKiogQSBoYXNoIHRhYmxlIGlzIGEgbXV0YWJsZSBkYXRhIHN0cnVjdHVyZSBpbXBsZW1lbnRpbmcgYSBtYXAgYmV0d2VlbiBrZXlzIGFuZCB2YWx1ZXMuXG4gICAgICBJdCBzdXBwb3J0cyBjb25zdGFudC10aW1lIGxvb2t1cCBhbmQgaW4tcGxhY2UgbW9kaWZpY2F0aW9uLlxuXG4gICAgICB7MSBVc2FnZX1cblxuICAgICAgQXMgYSBzaW1wbGUgZXhhbXBsZSwgd2UnbGwgY3JlYXRlIGEgaGFzaCB0YWJsZSB3aXRoIHN0cmluZyBrZXlzIHVzaW5nIHRoZVxuICAgICAge3shY3JlYXRlfVtjcmVhdGVdfSBjb25zdHJ1Y3Rvciwgd2hpY2ggZXhwZWN0cyBhIG1vZHVsZSBkZWZpbmluZyB0aGUga2V5J3MgdHlwZTpcblxuICAgICAge1tcbiAgICAgICAgbGV0IGggPSBIYXNodGJsLmNyZWF0ZSAobW9kdWxlIFN0cmluZyk7O1xuICAgICAgICB2YWwgaCA6IChzdHJpbmcsICdfYSkgSGFzaHRibC50ID0gPGFic3RyPlxuICAgICAgXX1cblxuICAgICAgV2UgY2FuIHNldCB0aGUgdmFsdWVzIG9mIGluZGl2aWR1YWwga2V5cyB3aXRoIHt7IXNldH1bc2V0XX0uIElmIHRoZSBrZXkgYWxyZWFkeSBoYXNcbiAgICAgIGEgdmFsdWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG5cbiAgICAgIHt2XG4gICAgICBIYXNodGJsLnNldCBoIH5rZXk6XCJmb29cIiB+ZGF0YTo1OztcbiAgICAgIC0gOiB1bml0ID0gKClcblxuICAgICAgSGFzaHRibC5zZXQgaCB+a2V5OlwiZm9vXCIgfmRhdGE6Njs7XG4gICAgICAtIDogdW5pdCA9ICgpXG5cbiAgICAgIEhhc2h0Ymwuc2V0IGggfmtleTpcImJhclwiIH5kYXRhOjY7O1xuICAgICAgLSA6IHVuaXQgPSAoKVxuICAgICAgdn1cblxuICAgICAgV2UgY2FuIGFjY2VzcyB2YWx1ZXMgYnkga2V5LCBvciBkdW1wIGFsbCBvZiB0aGUgaGFzaCB0YWJsZSdzIGRhdGE6XG5cbiAgICAgIHt2XG4gICAgICBIYXNodGJsLmZpbmQgaCBcImZvb1wiOztcbiAgICAgIC0gOiBpbnQgb3B0aW9uID0gU29tZSA2XG5cbiAgICAgIEhhc2h0YmwuZmluZF9leG4gaCBcImZvb1wiOztcbiAgICAgIC0gOiBpbnQgPSA2XG5cbiAgICAgIEhhc2h0YmwudG9fYWxpc3QgaDs7XG4gICAgICAtIDogKHN0cmluZyAqIGludCkgbGlzdCA9IFsoXCJmb29cIiwgNik7IChcImJhclwiLCA2KV1cbiAgICAgIHZ9XG5cbiAgICAgIHt7IWNoYW5nZX1bY2hhbmdlXX0gbGV0cyB1cyBjaGFuZ2UgYSBrZXkncyB2YWx1ZSBieSBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb246XG5cbiAgICAgIHt2XG4gICAgICBIYXNodGJsLmNoYW5nZSBoIFwiZm9vXCIgKGZ1biB4IC0+XG4gICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICAgfCBTb21lIHggLT4gU29tZSAoeCAqIDIpXG4gICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICk7O1xuICAgICAgLSA6IHVuaXQgPSAoKVxuXG4gICAgICBIYXNodGJsLnRvX2FsaXN0IGg7O1xuICAgICAgLSA6IChzdHJpbmcgKiBpbnQpIGxpc3QgPSBbKFwiZm9vXCIsIDEyKTsgKFwiYmFyXCIsIDYpXVxuICAgICAgdn1cblxuXG4gICAgICBXZSBjYW4gdXNlIHt7IW1lcmdlfVttZXJnZV19IHRvIG1lcmdlIHR3byBoYXNodGFibGVzIHdpdGggZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlclxuICAgICAgaG93IHdlIGNob29zZSB2YWx1ZXMgd2hlbiBhIGtleSBpcyBwcmVzZW50IGluIHRoZSBmaXJzdCAoXCJsZWZ0XCIpIGhhc2h0YWJsZSwgdGhlXG4gICAgICBzZWNvbmQgKFwicmlnaHRcIiksIG9yIGJvdGguIEhlcmUsIHdlJ2xsIGNvbnMgdGhlIHZhbHVlcyB3aGVuIGJvdGggaGFzaHRhYmxlcyBoYXZlIGFcbiAgICAgIGtleTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoMSA9IEhhc2h0Ymwub2ZfYWxpc3RfZXhuIChtb2R1bGUgSW50KSBbKDEsIDUpOyAoMiwgMzIzMildIGluXG4gICAgICBsZXQgaDIgPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCAzKV0gaW5cbiAgICAgIEhhc2h0YmwubWVyZ2UgaDEgaDIgfmY6KGZ1biB+a2V5Ol8gLT4gZnVuY3Rpb25cbiAgICAgICAgfCBgTGVmdCB4IC0+IFNvbWUgKGBMZWZ0IHgpXG4gICAgICAgIHwgYFJpZ2h0IHggLT4gU29tZSAoYFJpZ2h0IHgpXG4gICAgICAgIHwgYEJvdGggKHgsIHkpIC0+IGlmIHg9eSB0aGVuIE5vbmUgZWxzZSBTb21lIChgQm90aCAoeCx5KSlcbiAgICAgICkgfD4gSGFzaHRibC50b19hbGlzdDs7XG4gICAgICAtIDogKGludCAqIFs+IGBCb3RoIG9mIGludCAqIGludCB8IGBMZWZ0IG9mIGludCB8IGBSaWdodCBvZiBpbnQgXSkgbGlzdCA9XG4gICAgICBbKDIsIGBMZWZ0IDMyMzIpOyAoMSwgYEJvdGggKDUsIDMpKV1cbiAgICAgIHZ9XG5cbiAgICAgIHsxIEludGVyZmFjZX0gKilcblxuICBpbmNsdWRlIFNfd2l0aG91dF9zdWJtb2R1bGVzICgqKiBAaW5saW5lICopXG5cbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzID0gQWNjZXNzb3JzXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzID0gQ3JlYXRvcnNcbiAgbW9kdWxlIHR5cGUgTXVsdGkgPSBNdWx0aVxuICBtb2R1bGUgdHlwZSBTX3BvbHkgPSBTX3BvbHlcbiAgbW9kdWxlIHR5cGUgU193aXRob3V0X3N1Ym1vZHVsZXMgPSBTX3dpdGhvdXRfc3VibW9kdWxlc1xuICBtb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBGb3JfZGVyaXZpbmdcblxuICBtb2R1bGUgS2V5ID0gS2V5XG4gIG1vZHVsZSBNZXJnZV9pbnRvX2FjdGlvbiA9IE1lcmdlX2ludG9fYWN0aW9uXG5cbiAgdHlwZSBub25yZWMgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnMgPSAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc1xuXG4gIG1vZHVsZSBDcmVhdG9ycyAoS2V5IDogc2lnXG4gICAgICB0eXBlICdhIHRcblxuICAgICAgdmFsIGhhc2hhYmxlIDogJ2EgdCBIYXNoYWJsZS50XG4gICAgZW5kKSA6IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdF8gPSAoJ2EgS2V5LnQsICdiKSB0XG5cbiAgICB2YWwgdF9vZl9zZXhwIDogKFNleHAudCAtPiAnYSBLZXkudCkgLT4gKFNleHAudCAtPiAnYikgLT4gU2V4cC50IC0+ICgnYSwgJ2IpIHRfXG5cbiAgICBpbmNsdWRlXG4gICAgICBDcmVhdG9yc19nZW5lcmljXG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0X1xuICAgICAgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBLZXkudFxuICAgICAgd2l0aCB0eXBlICgna2V5LCAnZGF0YSwgJ2EpIGNyZWF0ZV9vcHRpb25zIDo9XG4gICAgICAgICgna2V5LCAnZGF0YSwgJ2EpIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG4gIGVuZFxuXG4gIG1vZHVsZSBQb2x5IDogU19wb2x5IHdpdGggdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuXG4gICgqKiBbTV0gaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIE9DYW1sIGFwcGxpY2F0aXZlIGZ1bmN0b3IgdHlwZXM6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3RvX2ludF90YWJsZSA9IGludCBIYXNodGJsLk0oU3RyaW5nKS50XG4gICAgICBdfVxuXG4gICAgICB3aGljaCBzdGFuZHMgZm9yOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ190b19pbnRfdGFibGUgPSAoU3RyaW5nLnQsIGludCkgSGFzaHRibC50XG4gICAgICBdfVxuXG4gICAgICBUaGUgcG9pbnQgaXMgdGhhdCBbaW50IEhhc2h0YmwuTShTdHJpbmcpLnRdIHN1cHBvcnRzIGRlcml2aW5nLCB3aGVyZWFzIHRoZSBzZWNvbmRcbiAgICAgIHN5bnRheCBkb2Vzbid0IChiZWNhdXNlIFt0X29mX3NleHBdIGRvZXNuJ3Qga25vdyB3aGF0IGNvbXBhcmlzb24vaGFzaCBmdW5jdGlvbiB0b1xuICAgICAgdXNlKS4gKilcbiAgbW9kdWxlIE0gKEsgOiBULlQpIDogc2lnXG4gICAgdHlwZSBub25yZWMgJ3YgdCA9IChLLnQsICd2KSB0XG4gIGVuZFxuXG4gIGluY2x1ZGUgRm9yX2Rlcml2aW5nIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICAoKiovKiopXG5cbiAgKCpfIFNlZSB0aGUgSmFuZSBTdHJlZXQgU3R5bGUgR3VpZGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIFtQcml2YXRlXSBzdWJtb2R1bGVzOlxuXG4gICAgaHR0cHM6Ly9vcGVuc291cmNlLmphbmVzdHJlZXQuY29tL3N0YW5kYXJkcy8jcHJpdmF0ZS1zdWJtb2R1bGVzICopXG4gIG1vZHVsZSBQcml2YXRlIDogc2lnXG4gICAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IENyZWF0b3JzX2dlbmVyaWNcblxuICAgIHR5cGUgbm9ucmVjICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlID1cbiAgICAgICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG5cbiAgICB2YWwgaGFzaGFibGUgOiAoJ2tleSwgXykgdCAtPiAna2V5IEhhc2hhYmxlLnRcbiAgZW5kXG5lbmRcbiIsIigqIEEgZmV3IHNtYWxsIHRoaW5ncyBjb3BpZWQgZnJvbSBvdGhlciBwYXJ0cyBvZiBCYXNlIGJlY2F1c2UgdGhleSBkZXBlbmQgb24gdXMsIHNvIHdlXG4gICBjYW4ndCB1c2UgdGhlbS4gKilcblxub3BlbiEgSW1wb3J0XG5cbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG5tb2R1bGUgSW50ID0gc3RydWN0XG4gIHR5cGUgdCA9IGludFxuXG4gIGxldCBtYXggKHggOiB0KSB5ID0gaWYgeCA+IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbigqIEl0cyBpbXBvcnRhbnQgdGhhdCBFbXB0eSBoYXZlIG5vIGFyZ3MuIEl0J3MgdGVtcHRpbmcgdG8gbWFrZSB0aGlzIHR5cGUgYSByZWNvcmRcbiAgIChlLmcuIHRvIGhvbGQgdGhlIGNvbXBhcmUgZnVuY3Rpb24pLCBidXQgYSBsb3Qgb2YgbWVtb3J5IGlzIHNhdmVkIGJ5IEVtcHR5IGJlaW5nIGFuXG4gICBpbW1lZGlhdGUsIHNpbmNlIGFsbCB1bnVzZWQgYnVja2V0cyBpbiB0aGUgaGFzaHRibCBkb24ndCB1c2UgYW55IG1lbW9yeSAoYmVzaWRlcyB0aGVcbiAgIGFycmF5IGNlbGwpICopXG50eXBlICgnaywgJ3YpIHQgPVxuICB8IEVtcHR5XG4gIHwgTm9kZSBvZlxuICAgICAgeyBtdXRhYmxlIGxlZnQgOiAoJ2ssICd2KSB0XG4gICAgICA7IGtleSA6ICdrXG4gICAgICA7IG11dGFibGUgdmFsdWUgOiAndlxuICAgICAgOyBtdXRhYmxlIGhlaWdodCA6IGludFxuICAgICAgOyBtdXRhYmxlIHJpZ2h0IDogKCdrLCAndikgdFxuICAgICAgfVxuICB8IExlYWYgb2ZcbiAgICAgIHsga2V5IDogJ2tcbiAgICAgIDsgbXV0YWJsZSB2YWx1ZSA6ICd2XG4gICAgICB9XG5cbmxldCBlbXB0eSA9IEVtcHR5XG5cbmxldCBpc19lbXB0eSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gdHJ1ZVxuICB8IExlYWYgXyB8IE5vZGUgXyAtPiBmYWxzZVxuOztcblxubGV0IGhlaWdodCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gMFxuICB8IExlYWYgXyAtPiAxXG4gIHwgTm9kZSB7IGxlZnQgPSBfOyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodDsgcmlnaHQgPSBfIH0gLT4gaGVpZ2h0XG47O1xuXG5sZXQgaW52YXJpYW50IGNvbXBhcmUgPVxuICBsZXQgbGVnYWxfbGVmdF9rZXkga2V5ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBMZWFmIHsga2V5ID0gbGVmdF9rZXk7IHZhbHVlID0gXyB9XG4gICAgfCBOb2RlIHsgbGVmdCA9IF87IGtleSA9IGxlZnRfa2V5OyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+XG4gICAgICBhc3NlcnQgKGNvbXBhcmUgbGVmdF9rZXkga2V5IDwgMClcbiAgaW5cbiAgbGV0IGxlZ2FsX3JpZ2h0X2tleSBrZXkgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IExlYWYgeyBrZXkgPSByaWdodF9rZXk7IHZhbHVlID0gXyB9XG4gICAgfCBOb2RlIHsgbGVmdCA9IF87IGtleSA9IHJpZ2h0X2tleTsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPlxuICAgICAgYXNzZXJ0IChjb21wYXJlIHJpZ2h0X2tleSBrZXkgPiAwKVxuICBpblxuICBsZXQgcmVjIGludiA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSB8IExlYWYgXyAtPiAoKVxuICAgIHwgTm9kZSB7IGxlZnQ7IGtleSA9IGs7IHZhbHVlID0gXzsgaGVpZ2h0ID0gaDsgcmlnaHQgfSAtPlxuICAgICAgbGV0IGhsLCBociA9IGhlaWdodCBsZWZ0LCBoZWlnaHQgcmlnaHQgaW5cbiAgICAgIGludiBsZWZ0O1xuICAgICAgaW52IHJpZ2h0O1xuICAgICAgbGVnYWxfbGVmdF9rZXkgayBsZWZ0O1xuICAgICAgbGVnYWxfcmlnaHRfa2V5IGsgcmlnaHQ7XG4gICAgICBhc3NlcnQgKGggPSBJbnQubWF4IGhsIGhyICsgMSk7XG4gICAgICBhc3NlcnQgKGFicyAoaGwgLSBocikgPD0gMilcbiAgaW5cbiAgaW52XG47O1xuXG5sZXQgaW52YXJpYW50IHQgfmNvbXBhcmUgPSBpbnZhcmlhbnQgY29tcGFyZSB0XG5cbigqIEluIHRoZSBmb2xsb3dpbmcgY29tbWVudHMsXG4gICAndCBpcyBiYWxhbmNlZCcgbWVhbnMgdGhhdCAnaW52YXJpYW50IHQnIGRvZXMgbm90XG4gICByYWlzZSBhbiBleGNlcHRpb24uICBUaGlzIGltcGxpZXMgb2YgY291cnNlIHRoYXQgZWFjaCBub2RlJ3MgaGVpZ2h0IGZpZWxkIGlzXG4gICBjb3JyZWN0LlxuICAgJ3QgaXMgYmFsYW5jZWFibGUnIG1lYW5zIHRoYXQgaGVpZ2h0IG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlcyBvZiB0XG4gICBkaWZmZXIgYnkgYXQgbW9zdCAzLiAqKVxuXG4oKiBAcHJlOiBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlcyBoYXZlIGNvcnJlY3QgaGVpZ2h0c1xuICAgQHBvc3Q6IG91dHB1dCBoYXMgdGhlIGNvcnJlY3QgaGVpZ2h0ICopXG5sZXQgdXBkYXRlX2hlaWdodCA9IGZ1bmN0aW9uXG4gIHwgTm9kZSAoeyBsZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IG9sZF9oZWlnaHQ7IHJpZ2h0IH0gYXMgeCkgLT5cbiAgICBsZXQgbmV3X2hlaWdodCA9IEludC5tYXggKGhlaWdodCBsZWZ0KSAoaGVpZ2h0IHJpZ2h0KSArIDEgaW5cbiAgICBpZiBuZXdfaGVpZ2h0IDw+IG9sZF9oZWlnaHQgdGhlbiB4LmhlaWdodCA8LSBuZXdfaGVpZ2h0XG4gIHwgRW1wdHkgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlXG47O1xuXG4oKiBAcHJlOiBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlcyBhcmUgYmFsYW5jZWRcbiAgIEBwcmU6IHRyZWUgaXMgYmFsYW5jZWFibGVcbiAgIEBwb3N0OiBvdXRwdXQgaXMgYmFsYW5jZWQgKGluIHBhcnRpY3VsYXIsIGhlaWdodCBpcyBjb3JyZWN0KSAqKVxubGV0IGJhbGFuY2UgdHJlZSA9XG4gIG1hdGNoIHRyZWUgd2l0aFxuICB8IEVtcHR5IHwgTGVhZiBfIC0+IHRyZWVcbiAgfCBOb2RlICh7IGxlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgfSBhcyByb290X25vZGUpIC0+XG4gICAgbGV0IGhsID0gaGVpZ2h0IGxlZnRcbiAgICBhbmQgaHIgPSBoZWlnaHQgcmlnaHQgaW5cbiAgICAoKiArIDIgaXMgY3JpdGljYWxseSBpbXBvcnRhbnQsIGxvd2VyaW5nIGl0IHRvIDEgd2lsbCBicmVhayB0aGUgTGVhZlxuICAgICAgIGFzc3VtcHRpb25zIGluIHRoZSBjb2RlIGJlbG93LCBhbmQgd2lsbCBmb3JjZSB1cyB0byBwcm9tb3RlIGxlYWYgbm9kZXMgaW5cbiAgICAgICB0aGUgYmFsYW5jZSByb3V0aW5lLiBJdCdzIGFsc28gZmFzdGVyLCBzaW5jZSBpdCB3aWxsIGJhbGFuY2UgbGVzcyBvZnRlbi5cbiAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGRlbGljYXRlLiAgVGhlIHVwZGF0ZV9oZWlnaHQgY2FsbHMgbXVzdFxuICAgICAgIG9jY3VyIGluIHRoZSBjb3JyZWN0IG9yZGVyLCBzaW5jZSB1cGRhdGVfaGVpZ2h0IGFzc3VtZXMgaXRzIGNoaWxkcmVuIGhhdmVcbiAgICAgICB0aGUgY29ycmVjdCBoZWlnaHRzLiAgKilcbiAgICBpZiBobCA+IGhyICsgMlxuICAgIHRoZW4gKFxuICAgICAgbWF0Y2ggbGVmdCB3aXRoXG4gICAgICAoKiBJdCBjYW5ub3QgYmUgYSBsZWFmLCBiZWNhdXNlIGV2ZW4gaWYgcmlnaHQgaXMgZW1wdHksIGEgbGVhZlxuICAgICAgICAgaXMgb25seSBoZWlnaHQgMSAqKVxuICAgICAgfCBFbXB0eSB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgTm9kZVxuICAgICAgICAgICh7IGxlZnQgPSBsZWZ0X25vZGVfbGVmdFxuICAgICAgICAgICA7IGtleSA9IF9cbiAgICAgICAgICAgOyB2YWx1ZSA9IF9cbiAgICAgICAgICAgOyBoZWlnaHQgPSBfXG4gICAgICAgICAgIDsgcmlnaHQgPSBsZWZ0X25vZGVfcmlnaHRcbiAgICAgICAgICAgfSBhcyBsZWZ0X25vZGUpIC0+XG4gICAgICAgIGlmIGhlaWdodCBsZWZ0X25vZGVfbGVmdCA+PSBoZWlnaHQgbGVmdF9ub2RlX3JpZ2h0XG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIHJvb3Rfbm9kZS5sZWZ0IDwtIGxlZnRfbm9kZV9yaWdodDtcbiAgICAgICAgICBsZWZ0X25vZGUucmlnaHQgPC0gdHJlZTtcbiAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHRyZWU7XG4gICAgICAgICAgdXBkYXRlX2hlaWdodCBsZWZ0O1xuICAgICAgICAgIGxlZnQpXG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgICgqIGlmIHJpZ2h0IGlzIGEgbGVhZiwgdGhlbiBsZWZ0IG11c3QgYmUgZW1wdHkuIFRoYXQgbWVhbnNcbiAgICAgICAgICAgICBoZWlnaHQgaXMgMi4gRXZlbiBpZiBociBpcyBlbXB0eSB3ZSBzdGlsbCBjYW4ndCBnZXQgaGVyZS4gKilcbiAgICAgICAgICBtYXRjaCBsZWZ0X25vZGVfcmlnaHQgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgfCBOb2RlXG4gICAgICAgICAgICAgICh7IGxlZnQgPSBscl9sZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gbHJfcmlnaHQgfSBhc1xuICAgICAgICAgICAgICAgbHJfbm9kZSkgLT5cbiAgICAgICAgICAgIGxlZnRfbm9kZS5yaWdodCA8LSBscl9sZWZ0O1xuICAgICAgICAgICAgcm9vdF9ub2RlLmxlZnQgPC0gbHJfcmlnaHQ7XG4gICAgICAgICAgICBscl9ub2RlLnJpZ2h0IDwtIHRyZWU7XG4gICAgICAgICAgICBscl9ub2RlLmxlZnQgPC0gbGVmdDtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgbGVmdDtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgdHJlZTtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgbGVmdF9ub2RlX3JpZ2h0O1xuICAgICAgICAgICAgbGVmdF9ub2RlX3JpZ2h0KSlcbiAgICBlbHNlIGlmIGhyID4gaGwgKyAyXG4gICAgdGhlbiAoXG4gICAgICAoKiBzZWUgYWJvdmUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSByaWdodCBjYW5ub3QgYmUgYSBsZWFmICopXG4gICAgICBtYXRjaCByaWdodCB3aXRoXG4gICAgICB8IEVtcHR5IHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBOb2RlXG4gICAgICAgICAgKHsgbGVmdCA9IHJpZ2h0X25vZGVfbGVmdFxuICAgICAgICAgICA7IGtleSA9IF9cbiAgICAgICAgICAgOyB2YWx1ZSA9IF9cbiAgICAgICAgICAgOyBoZWlnaHQgPSBfXG4gICAgICAgICAgIDsgcmlnaHQgPSByaWdodF9ub2RlX3JpZ2h0XG4gICAgICAgICAgIH0gYXMgcmlnaHRfbm9kZSkgLT5cbiAgICAgICAgaWYgaGVpZ2h0IHJpZ2h0X25vZGVfcmlnaHQgPj0gaGVpZ2h0IHJpZ2h0X25vZGVfbGVmdFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICByb290X25vZGUucmlnaHQgPC0gcmlnaHRfbm9kZV9sZWZ0O1xuICAgICAgICAgIHJpZ2h0X25vZGUubGVmdCA8LSB0cmVlO1xuICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgdHJlZTtcbiAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHJpZ2h0O1xuICAgICAgICAgIHJpZ2h0KVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICAoKiBzZWUgYWJvdmUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIGNhbm5vdCBiZSBhIGxlYWYgKilcbiAgICAgICAgICBtYXRjaCByaWdodF9ub2RlX2xlZnQgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgfCBOb2RlXG4gICAgICAgICAgICAgICh7IGxlZnQgPSBybF9sZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gcmxfcmlnaHQgfSBhc1xuICAgICAgICAgICAgICAgcmxfbm9kZSkgLT5cbiAgICAgICAgICAgIHJpZ2h0X25vZGUubGVmdCA8LSBybF9yaWdodDtcbiAgICAgICAgICAgIHJvb3Rfbm9kZS5yaWdodCA8LSBybF9sZWZ0O1xuICAgICAgICAgICAgcmxfbm9kZS5sZWZ0IDwtIHRyZWU7XG4gICAgICAgICAgICBybF9ub2RlLnJpZ2h0IDwtIHJpZ2h0O1xuICAgICAgICAgICAgdXBkYXRlX2hlaWdodCByaWdodDtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgdHJlZTtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgcmlnaHRfbm9kZV9sZWZ0O1xuICAgICAgICAgICAgcmlnaHRfbm9kZV9sZWZ0KSlcbiAgICBlbHNlIChcbiAgICAgIHVwZGF0ZV9oZWlnaHQgdHJlZTtcbiAgICAgIHRyZWUpXG47O1xuXG4oKiBAcHJlOiB0cmVlIGlzIGJhbGFuY2VhYmxlXG4gICBAcHJlOiBhYnMgKGhlaWdodCAocmlnaHQgbm9kZSkgLSBoZWlnaHQgKGJhbGFuY2UgdHJlZSkpIDw9IDNcbiAgIEBwb3N0OiByZXN1bHQgaXMgYmFsYW5jZWFibGUgKilcblxuKCogQHByZTogdHJlZSBpcyBiYWxhbmNlYWJsZVxuICAgQHByZTogYWJzIChoZWlnaHQgKHJpZ2h0IG5vZGUpIC0gaGVpZ2h0IChiYWxhbmNlIHRyZWUpKSA8PSAzXG4gICBAcG9zdDogcmVzdWx0IGlzIGJhbGFuY2VhYmxlICopXG5sZXQgc2V0X2xlZnQgbm9kZSB0cmVlID1cbiAgbGV0IHRyZWUgPSBiYWxhbmNlIHRyZWUgaW5cbiAgbWF0Y2ggbm9kZSB3aXRoXG4gIHwgTm9kZSAoeyBsZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IGFzIHIpIC0+XG4gICAgaWYgcGh5c19lcXVhbCBsZWZ0IHRyZWUgdGhlbiAoKSBlbHNlIHIubGVmdCA8LSB0cmVlO1xuICAgIHVwZGF0ZV9oZWlnaHQgbm9kZVxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG47O1xuXG4oKiBAcHJlOiB0cmVlIGlzIGJhbGFuY2VhYmxlXG4gICBAcHJlOiBhYnMgKGhlaWdodCAobGVmdCBub2RlKSAtIGhlaWdodCAoYmFsYW5jZSB0cmVlKSkgPD0gM1xuICAgQHBvc3Q6IHJlc3VsdCBpcyBiYWxhbmNlYWJsZSAqKVxubGV0IHNldF9yaWdodCBub2RlIHRyZWUgPVxuICBsZXQgdHJlZSA9IGJhbGFuY2UgdHJlZSBpblxuICBtYXRjaCBub2RlIHdpdGhcbiAgfCBOb2RlICh7IGxlZnQgPSBfOyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0IH0gYXMgcikgLT5cbiAgICBpZiBwaHlzX2VxdWFsIHJpZ2h0IHRyZWUgdGhlbiAoKSBlbHNlIHIucmlnaHQgPC0gdHJlZTtcbiAgICB1cGRhdGVfaGVpZ2h0IG5vZGVcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuOztcblxuKCogQHByZTogdCBpcyBiYWxhbmNlZC5cbiAgIEBwb3N0OiByZXN1bHQgaXMgYmFsYW5jZWQsIHdpdGggbmV3IG5vZGUgaW5zZXJ0ZWRcbiAgIEBwb3N0OiAhYWRkZWQgPSB0cnVlIGlmZiB0aGUgc2hhcGUgb2YgdGhlIGlucHV0IHRyZWUgY2hhbmdlZC4gICopXG5sZXQgYWRkID1cbiAgbGV0IHJlYyBhZGQgdCByZXBsYWNlIGFkZGVkIGNvbXBhcmUgayB2ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICBhZGRlZCA6PSB0cnVlO1xuICAgICAgTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9XG4gICAgfCBMZWFmICh7IGtleSA9IGsnOyB2YWx1ZSA9IF8gfSBhcyByKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlIGsnIGsgaW5cbiAgICAgICgqIFRoaXMgY29tcGFyZSBpcyByZXZlcnNlZCBvbiBwdXJwb3NlLCB3ZSBhcmUgcHJldGVuZGluZ1xuICAgICAgICAgdGhhdCB0aGUgbGVhZiB3YXMganVzdCBpbnNlcnRlZCBpbnN0ZWFkIG9mIHRoZSBvdGhlciB3YXlcbiAgICAgICAgIHJvdW5kLCB0aGF0IHdheSB3ZSBvbmx5IGFsbG9jYXRlIG9uZSBub2RlLiAqKVxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBhZGRlZCA6PSBmYWxzZTtcbiAgICAgICAgaWYgcmVwbGFjZSB0aGVuIHIudmFsdWUgPC0gdjtcbiAgICAgICAgdClcbiAgICAgIGVsc2UgKFxuICAgICAgICBhZGRlZCA6PSB0cnVlO1xuICAgICAgICBpZiBjIDwgMFxuICAgICAgICB0aGVuIE5vZGUgeyBsZWZ0ID0gdDsga2V5ID0gazsgdmFsdWUgPSB2OyBoZWlnaHQgPSAyOyByaWdodCA9IEVtcHR5IH1cbiAgICAgICAgZWxzZSBOb2RlIHsgbGVmdCA9IEVtcHR5OyBrZXkgPSBrOyB2YWx1ZSA9IHY7IGhlaWdodCA9IDI7IHJpZ2h0ID0gdCB9KVxuICAgIHwgTm9kZSAoeyBsZWZ0OyBrZXkgPSBrJzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCB9IGFzIHIpIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmUgayBrJyBpblxuICAgICAgaWYgYyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBhZGRlZCA6PSBmYWxzZTtcbiAgICAgICAgaWYgcmVwbGFjZSB0aGVuIHIudmFsdWUgPC0gdilcbiAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgIHRoZW4gc2V0X2xlZnQgdCAoYWRkIGxlZnQgcmVwbGFjZSBhZGRlZCBjb21wYXJlIGsgdilcbiAgICAgIGVsc2Ugc2V0X3JpZ2h0IHQgKGFkZCByaWdodCByZXBsYWNlIGFkZGVkIGNvbXBhcmUgayB2KTtcbiAgICAgIHRcbiAgaW5cbiAgZnVuIHQgfnJlcGxhY2UgfmNvbXBhcmUgfmFkZGVkIH5rZXkgfmRhdGEgLT5cbiAgICBsZXQgdCA9IGFkZCB0IHJlcGxhY2UgYWRkZWQgY29tcGFyZSBrZXkgZGF0YSBpblxuICAgIGlmICFhZGRlZCB0aGVuIGJhbGFuY2UgdCBlbHNlIHRcbjs7XG5cbmxldCByZWMgZmlyc3QgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBMZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH1cbiAgfCBOb2RlIHsgbGVmdCA9IEVtcHR5OyBrZXkgPSBrOyB2YWx1ZSA9IHY7IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+IFNvbWUgKGssIHYpXG4gIHwgTm9kZSB7IGxlZnQgPSBsOyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+IGZpcnN0IGxcbjs7XG5cbmxldCByZWMgbGFzdCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gTm9uZVxuICB8IExlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfVxuICB8IE5vZGUgeyBsZWZ0ID0gXzsga2V5ID0gazsgdmFsdWUgPSB2OyBoZWlnaHQgPSBfOyByaWdodCA9IEVtcHR5IH0gLT4gU29tZSAoaywgdilcbiAgfCBOb2RlIHsgbGVmdCA9IF87IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSByIH0gLT4gbGFzdCByXG47O1xuXG5cbmxldFtAaW5saW5lIGFsd2F5c10gcmVjIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdFxuICAgICAgICAgICAgICAgICAgICAgICAgICB+Y29tcGFyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBrXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMlxuICAgICAgICAgICAgICAgICAgICAgICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfmlmX2ZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH5pZl9ub3RfZm91bmRcbiAgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGsgYXJnMSBhcmcyXG4gIHwgTGVhZiB7IGtleSA9IGsnOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmUgayBrJyA9IDBcbiAgICB0aGVuIGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXk6aycgfmRhdGE6diBhcmcxIGFyZzJcbiAgICBlbHNlIGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQgayBhcmcxIGFyZzJcbiAgfCBOb2RlIHsgbGVmdDsga2V5ID0gayc7IHZhbHVlID0gdjsgaGVpZ2h0ID0gXzsgcmlnaHQgfSAtPlxuICAgIGxldCBjID0gY29tcGFyZSBrIGsnIGluXG4gICAgaWYgYyA9IDBcbiAgICB0aGVuIGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXk6aycgfmRhdGE6diBhcmcxIGFyZzJcbiAgICBlbHNlXG4gICAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICAgIChpZiBjIDwgMCB0aGVuIGxlZnQgZWxzZSByaWdodClcbiAgICAgICAgfmNvbXBhcmVcbiAgICAgICAga1xuICAgICAgICBhcmcxXG4gICAgICAgIGFyZzJcbiAgICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICAgIH5pZl9mb3VuZFxuICAgICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbCA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5Ol8gfmRhdGEgKCkgKCkgPSBpZl9mb3VuZCBkYXRhIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSAoKSAoKSA9IGlmX25vdF9mb3VuZCBrZXkgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICAoKVxuICAgICAgKClcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXkgfmRhdGEgKCkgKCkgPSBpZl9mb3VuZCB+a2V5IH5kYXRhIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSAoKSAoKSA9IGlmX25vdF9mb3VuZCBrZXkgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICAoKVxuICAgICAgKClcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwxID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXk6XyB+ZGF0YSBhcmcgKCkgPSBpZl9mb3VuZCBkYXRhIGFyZyBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgYXJnICgpID0gaWZfbm90X2ZvdW5kIGtleSBhcmcgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICBhXG4gICAgICAoKVxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwxID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXkgfmRhdGEgYXJnICgpID0gaWZfZm91bmQgfmtleSB+ZGF0YSBhcmcgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5IGFyZyAoKSA9IGlmX25vdF9mb3VuZCBrZXkgYXJnIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgYVxuICAgICAgKClcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwyID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXk6XyB+ZGF0YSBhcmcxIGFyZzIgPSBpZl9mb3VuZCBkYXRhIGFyZzEgYXJnMiBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgYXJnMSBhcmcyID0gaWZfbm90X2ZvdW5kIGtleSBhcmcxIGFyZzIgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+YSB+YiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICBhXG4gICAgICBiXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbDIgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleSB+ZGF0YSBhcmcxIGFyZzIgPSBpZl9mb3VuZCB+a2V5IH5kYXRhIGFyZzEgYXJnMiBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgYXJnMSBhcmcyID0gaWZfbm90X2ZvdW5kIGtleSBhcmcxIGFyZzIgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayB+YSB+YiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCAtPlxuICAgIGZpbmRpX2FuZF9jYWxsX2ltcGxcbiAgICAgIHRcbiAgICAgIH5jb21wYXJlXG4gICAgICBrXG4gICAgICBhXG4gICAgICBiXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kID1cbiAgbGV0IGlmX2ZvdW5kIHYgPSBTb21lIHYgaW5cbiAgbGV0IGlmX25vdF9mb3VuZCBfID0gTm9uZSBpblxuICBmdW4gdCB+Y29tcGFyZSBrIC0+IGZpbmRfYW5kX2NhbGwgdCB+Y29tcGFyZSBrIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgbWVtID1cbiAgbGV0IGlmX2ZvdW5kIF8gPSB0cnVlIGluXG4gIGxldCBpZl9ub3RfZm91bmQgXyA9IGZhbHNlIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgLT4gZmluZF9hbmRfY2FsbCB0IH5jb21wYXJlIGsgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCByZW1vdmUgPVxuICBsZXQgcmVjIG1pbl9lbHQgdHJlZSA9XG4gICAgbWF0Y2ggdHJlZSB3aXRoXG4gICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgIHwgTGVhZiBfIC0+IHRyZWVcbiAgICB8IE5vZGUgeyBsZWZ0ID0gRW1wdHk7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT4gdHJlZVxuICAgIHwgTm9kZSB7IGxlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT4gbWluX2VsdCBsZWZ0XG4gIGluXG4gIGxldCByZWMgcmVtb3ZlX21pbl9lbHQgdHJlZSA9XG4gICAgbWF0Y2ggdHJlZSB3aXRoXG4gICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICB8IExlYWYgXyAtPiBFbXB0eSAoKiBUaGlzIG11c3QgYmUgdGhlIHJvb3QgKilcbiAgICB8IE5vZGUgeyBsZWZ0ID0gRW1wdHk7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgfSAtPiByaWdodFxuICAgIHwgTm9kZSB7IGxlZnQgPSBMZWFmIF87IGtleSA9IGs7IHZhbHVlID0gdjsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBFbXB0eSB9IC0+XG4gICAgICBMZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH1cbiAgICB8IE5vZGUgeyBsZWZ0ID0gTGVhZiBfOyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IGFzIG5vZGUgLT5cbiAgICAgIHNldF9sZWZ0IG5vZGUgRW1wdHk7XG4gICAgICB0cmVlXG4gICAgfCBOb2RlIHsgbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSBhcyBub2RlIC0+XG4gICAgICBzZXRfbGVmdCBub2RlIChyZW1vdmVfbWluX2VsdCBsZWZ0KTtcbiAgICAgIHRyZWVcbiAgaW5cbiAgbGV0IG1lcmdlIHQxIHQyID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgRW1wdHksIHQgLT4gdFxuICAgIHwgdCwgRW1wdHkgLT4gdFxuICAgIHwgXywgXyAtPlxuICAgICAgbGV0IHRyZWUgPSBtaW5fZWx0IHQyIGluXG4gICAgICAobWF0Y2ggdHJlZSB3aXRoXG4gICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICB8IExlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgICAgICAgbGV0IHQyID0gYmFsYW5jZSAocmVtb3ZlX21pbl9lbHQgdDIpIGluXG4gICAgICAgICBOb2RlXG4gICAgICAgICAgIHsgbGVmdCA9IHQxXG4gICAgICAgICAgIDsga2V5ID0ga1xuICAgICAgICAgICA7IHZhbHVlID0gdlxuICAgICAgICAgICA7IGhlaWdodCA9IEludC5tYXggKGhlaWdodCB0MSkgKGhlaWdodCB0MikgKyAxXG4gICAgICAgICAgIDsgcmlnaHQgPSB0MlxuICAgICAgICAgICB9XG4gICAgICAgfCBOb2RlIF8gYXMgbm9kZSAtPlxuICAgICAgICAgc2V0X3JpZ2h0IG5vZGUgKHJlbW92ZV9taW5fZWx0IHQyKTtcbiAgICAgICAgIHNldF9sZWZ0IG5vZGUgdDE7XG4gICAgICAgICBub2RlKVxuICBpblxuICBsZXQgcmVjIHJlbW92ZSB0IHJlbW92ZWQgY29tcGFyZSBrID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICByZW1vdmVkIDo9IGZhbHNlO1xuICAgICAgRW1wdHlcbiAgICB8IExlYWYgeyBrZXkgPSBrJzsgdmFsdWUgPSBfIH0gLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrJyA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICByZW1vdmVkIDo9IHRydWU7XG4gICAgICAgIEVtcHR5KVxuICAgICAgZWxzZSAoXG4gICAgICAgIHJlbW92ZWQgOj0gZmFsc2U7XG4gICAgICAgIHQpXG4gICAgfCBOb2RlIHsgbGVmdDsga2V5ID0gayc7IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgfSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlIGsgaycgaW5cbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgcmVtb3ZlZCA6PSB0cnVlO1xuICAgICAgICBtZXJnZSBsZWZ0IHJpZ2h0KVxuICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgdGhlbiAoXG4gICAgICAgIHNldF9sZWZ0IHQgKHJlbW92ZSBsZWZ0IHJlbW92ZWQgY29tcGFyZSBrKTtcbiAgICAgICAgdClcbiAgICAgIGVsc2UgKFxuICAgICAgICBzZXRfcmlnaHQgdCAocmVtb3ZlIHJpZ2h0IHJlbW92ZWQgY29tcGFyZSBrKTtcbiAgICAgICAgdClcbiAgaW5cbiAgZnVuIHQgfnJlbW92ZWQgfmNvbXBhcmUgayAtPiBiYWxhbmNlIChyZW1vdmUgdCByZW1vdmVkIGNvbXBhcmUgaylcbjs7XG5cbmxldCByZWMgZm9sZCB0IH5pbml0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gaW5pdFxuICB8IExlYWYgeyBrZXk7IHZhbHVlID0gZGF0YSB9IC0+IGYgfmtleSB+ZGF0YSBpbml0XG4gIHwgTm9kZVxuICAgICAgeyBsZWZ0ID0gTGVhZiB7IGtleSA9IGxrZXk7IHZhbHVlID0gbGRhdGEgfVxuICAgICAgOyBrZXlcbiAgICAgIDsgdmFsdWUgPSBkYXRhXG4gICAgICA7IGhlaWdodCA9IF9cbiAgICAgIDsgcmlnaHQgPSBMZWFmIHsga2V5ID0gcmtleTsgdmFsdWUgPSByZGF0YSB9XG4gICAgICB9IC0+IGYgfmtleTpya2V5IH5kYXRhOnJkYXRhIChmIH5rZXkgfmRhdGEgKGYgfmtleTpsa2V5IH5kYXRhOmxkYXRhIGluaXQpKVxuICB8IE5vZGVcbiAgICAgIHsgbGVmdCA9IExlYWYgeyBrZXkgPSBsa2V5OyB2YWx1ZSA9IGxkYXRhIH1cbiAgICAgIDsga2V5XG4gICAgICA7IHZhbHVlID0gZGF0YVxuICAgICAgOyBoZWlnaHQgPSBfXG4gICAgICA7IHJpZ2h0ID0gRW1wdHlcbiAgICAgIH0gLT4gZiB+a2V5IH5kYXRhIChmIH5rZXk6bGtleSB+ZGF0YTpsZGF0YSBpbml0KVxuICB8IE5vZGVcbiAgICAgIHsgbGVmdCA9IEVtcHR5XG4gICAgICA7IGtleVxuICAgICAgOyB2YWx1ZSA9IGRhdGFcbiAgICAgIDsgaGVpZ2h0ID0gX1xuICAgICAgOyByaWdodCA9IExlYWYgeyBrZXkgPSBya2V5OyB2YWx1ZSA9IHJkYXRhIH1cbiAgICAgIH0gLT4gZiB+a2V5OnJrZXkgfmRhdGE6cmRhdGEgKGYgfmtleSB+ZGF0YSBpbml0KVxuICB8IE5vZGVcbiAgICAgIHsgbGVmdDsga2V5OyB2YWx1ZSA9IGRhdGE7IGhlaWdodCA9IF87IHJpZ2h0ID0gTGVhZiB7IGtleSA9IHJrZXk7IHZhbHVlID0gcmRhdGEgfSB9XG4gICAgLT4gZiB+a2V5OnJrZXkgfmRhdGE6cmRhdGEgKGYgfmtleSB+ZGF0YSAoZm9sZCBsZWZ0IH5pbml0IH5mKSlcbiAgfCBOb2RlXG4gICAgICB7IGxlZnQgPSBMZWFmIHsga2V5ID0gbGtleTsgdmFsdWUgPSBsZGF0YSB9OyBrZXk7IHZhbHVlID0gZGF0YTsgaGVpZ2h0ID0gXzsgcmlnaHQgfVxuICAgIC0+IGZvbGQgcmlnaHQgfmluaXQ6KGYgfmtleSB+ZGF0YSAoZiB+a2V5OmxrZXkgfmRhdGE6bGRhdGEgaW5pdCkpIH5mXG4gIHwgTm9kZSB7IGxlZnQ7IGtleTsgdmFsdWUgPSBkYXRhOyBoZWlnaHQgPSBfOyByaWdodCB9IC0+XG4gICAgZm9sZCByaWdodCB+aW5pdDooZiB+a2V5IH5kYXRhIChmb2xkIGxlZnQgfmluaXQgfmYpKSB+ZlxuOztcblxubGV0IHJlYyBpdGVyIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiAoKVxuICB8IExlYWYgeyBrZXk7IHZhbHVlID0gZGF0YSB9IC0+IGYgfmtleSB+ZGF0YVxuICB8IE5vZGUgeyBsZWZ0OyBrZXk7IHZhbHVlID0gZGF0YTsgaGVpZ2h0ID0gXzsgcmlnaHQgfSAtPlxuICAgIGl0ZXIgbGVmdCB+ZjtcbiAgICBmIH5rZXkgfmRhdGE7XG4gICAgaXRlciByaWdodCB+ZlxuOztcblxubGV0IHJlYyBtYXBpX2lucGxhY2UgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+ICgpXG4gIHwgTGVhZiAoeyBrZXk7IHZhbHVlIH0gYXMgdCkgLT4gdC52YWx1ZSA8LSBmIH5rZXkgfmRhdGE6dmFsdWVcbiAgfCBOb2RlICh7IGxlZnQ7IGtleTsgdmFsdWU7IGhlaWdodCA9IF87IHJpZ2h0IH0gYXMgdCkgLT5cbiAgICBtYXBpX2lucGxhY2UgfmYgbGVmdDtcbiAgICB0LnZhbHVlIDwtIGYgfmtleSB+ZGF0YTp2YWx1ZTtcbiAgICBtYXBpX2lucGxhY2UgfmYgcmlnaHRcbjs7XG5cbmxldCBjaG9vc2VfZXhuID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbQXZsdHJlZS5jaG9vc2VfZXhuXSBvZiBlbXB0eSBoYXNodGJsXCIgW10pXG4gIHwgTGVhZiB7IGtleTsgdmFsdWU7IF8gfSB8IE5vZGUgeyBrZXk7IHZhbHVlOyBfIH0gLT4ga2V5LCB2YWx1ZVxuOztcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBIYXNodGJsX2ludGZcblxubW9kdWxlIHR5cGUgS2V5ID0gS2V5LlNcblxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cbmxldCBoYXNoX3BhcmFtID0gSGFzaGFibGUuaGFzaF9wYXJhbVxubGV0IGhhc2ggPSBIYXNoYWJsZS5oYXNoXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxudHlwZSAoJ2ssICd2KSB0ID1cbiAgeyBtdXRhYmxlIHRhYmxlIDogKCdrLCAndikgQXZsdHJlZS50IGFycmF5XG4gIDsgbXV0YWJsZSBsZW5ndGggOiBpbnRcbiAgKCogW3JlY2VudGx5X2FkZGVkXSBpcyB0aGUgcmVmZXJlbmNlIHBhc3NlZCB0byBbQXZsdHJlZS5hZGRdLiBXZSBwdXQgaXQgaW4gdGhlIGhhc2hcbiAgICAgdGFibGUgdG8gYXZvaWQgYWxsb2NhdGluZyBpdCBhdCBldmVyeSBbc2V0XS4gKilcbiAgOyByZWNlbnRseV9hZGRlZCA6IGJvb2wgcmVmXG4gIDsgZ3Jvd3RoX2FsbG93ZWQgOiBib29sXG4gIDsgaGFzaGFibGUgOiAnayBIYXNoYWJsZS50XG4gIDsgbXV0YWJsZSBtdXRhdGlvbl9hbGxvd2VkIDogYm9vbCAoKiBTZXQgZHVyaW5nIGFsbCBpdGVyYXRpb24gb3BlcmF0aW9ucyAqKVxuICB9XG5cbnR5cGUgJ2Ega2V5ID0gJ2FcblxubGV0IHNleHBfb2Zfa2V5IHQgPSB0Lmhhc2hhYmxlLkhhc2hhYmxlLnNleHBfb2ZfdFxubGV0IGNvbXBhcmVfa2V5IHQgPSB0Lmhhc2hhYmxlLkhhc2hhYmxlLmNvbXBhcmVcblxubGV0IGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQgPVxuICBpZiBub3QgdC5tdXRhdGlvbl9hbGxvd2VkIHRoZW4gZmFpbHdpdGggXCJIYXNodGJsOiBtdXRhdGlvbiBub3QgYWxsb3dlZCBkdXJpbmcgaXRlcmF0aW9uXCJcbjs7XG5cbmxldCB3aXRob3V0X211dGF0aW5nIHQgZiA9XG4gIGlmIHQubXV0YXRpb25fYWxsb3dlZFxuICB0aGVuIChcbiAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gZmFsc2U7XG4gICAgbWF0Y2ggZiAoKSB3aXRoXG4gICAgfCB4IC0+XG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gdHJ1ZTtcbiAgICAgIHhcbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSB0cnVlO1xuICAgICAgcmFpc2UgZXhuKVxuICBlbHNlIGYgKClcbjs7XG5cbigqKiBJbnRlcm5hbGx5IHVzZSBhIG1heGltdW0gc2l6ZSB0aGF0IGlzIGEgcG93ZXIgb2YgMi4gUmV2ZXJzZXMgdGhlIGFib3ZlIHRvIGZpbmQgdGhlXG4gICAgZmxvb3IgcG93ZXIgb2YgMiBiZWxvdyB0aGUgc3lzdGVtIG1heCBhcnJheSBsZW5ndGggKilcbmxldCBtYXhfdGFibGVfbGVuZ3RoID0gSW50LmZsb29yX3BvdzIgQXJyYXkubWF4X2xlbmd0aFxuXG4oKiBUaGUgZGVmYXVsdCBzaXplIGlzIGNob3NlbiB0byBiZSAwIChhcyBvcHBvc2VkIHRvIDEyOCBhcyBpdCB3YXMgYmVmb3JlKSBiZWNhdXNlOlxuICAgLSAxMjggY2FuIGNyZWF0ZSBzdWJzdGFudGlhbCBtZW1vcnkgb3ZlcmhlYWQgKHgxMCkgd2hlbiBjcmVhdGluZyBtYW55IHRhYmxlcywgbW9zdFxuICAgICBvZiB3aGljaCBhcmUgbm90IGJpZyAoc2F5LCBpZiB5b3UgaGF2ZSBhIGhhc2h0Ymwgb2YgaGFzaHRibCkuIEFuZCBtZW1vcnkgb3ZlcmhlYWQgaXNcbiAgICAgbm90IHRoYXQgZWFzeSB0byBwcm9maWxlLlxuICAgLSBpZiBhIGhhc2h0YmwgaXMgZ29pbmcgdG8gZ3JvdywgaXQncyBub3QgY2xlYXIgd2h5IDEyOCBpcyBtYXJrZWRseSBiZXR0ZXIgdGhhbiBvdGhlclxuICAgICBzaXplcyAoaWYgeW91IGdvaW5nIHRvIHN0aWNrIDEwMDAgZWxlbWVudHMsIHlvdSdyZSBnb2luZyB0byBncm93IHRoZSBoYXNodGFibGUgb25jZVxuICAgICBvciB0d2ljZSBhbnl3YXkpXG4gICAtIGluIG90aGVyIGxhbmd1YWdlcyAobGlrZSBydXN0LCBweXRob24sIGFuZCBhcHBhcmVudGx5IGdvKSwgdGhlIGRlZmF1bHQgaXMgYWxzbyBhXG4gICAgIHNtYWxsIHNpemUuICopXG5sZXQgY3JlYXRlID8oZ3Jvd3RoX2FsbG93ZWQgPSB0cnVlKSA/KHNpemUgPSAwKSB+aGFzaGFibGUgKCkgPVxuICBsZXQgc2l6ZSA9IEludC5taW4gKEludC5tYXggMSBzaXplKSBtYXhfdGFibGVfbGVuZ3RoIGluXG4gIGxldCBzaXplID0gSW50LmNlaWxfcG93MiBzaXplIGluXG4gIHsgdGFibGUgPSBBcnJheS5jcmVhdGUgfmxlbjpzaXplIEF2bHRyZWUuZW1wdHlcbiAgOyBsZW5ndGggPSAwXG4gIDsgZ3Jvd3RoX2FsbG93ZWRcbiAgOyByZWNlbnRseV9hZGRlZCA9IHJlZiBmYWxzZVxuICA7IGhhc2hhYmxlXG4gIDsgbXV0YXRpb25fYWxsb3dlZCA9IHRydWVcbiAgfVxuOztcblxuKCoqIFN1cHBsZW1lbnRhbCBoYXNoLiBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5LCBpdCBpcyBpbnRlbmRlZCBhcyBhIGRlZmVuc2UgYWdhaW5zdCBwb29yXG4gICAgaGFzaCBmdW5jdGlvbnMsIGZvciB3aGljaCB0aGUgcG93ZXIgb2YgMiBzaXplZCB0YWJsZSB3aWxsIGJlIGVzcGVjaWFsbHkgc2Vuc2l0aXZlLlxuICAgIFdpdGggc29tZSB0ZXN0aW5nIHdlIG1heSBjaG9vc2UgdG8gYWRkIGl0LCBidXQgdGhpcyB0YWJsZSBpcyBkZXNpZ25lZCB0byBiZSByb2J1c3QgdG9cbiAgICBjb2xsaXNpb25zLCBhbmQgaW4gbW9zdCBvZiBteSB0ZXN0aW5nIHRoaXMgZGVncmFkZXMgcGVyZm9ybWFuY2UuICopXG5sZXQgX3N1cHBsZW1lbnRhbF9oYXNoIGggPVxuICBsZXQgaCA9IGggbHhvciAoKGggbHNyIDIwKSBseG9yIChoIGxzciAxMikpIGluXG4gIGggbHhvciAoaCBsc3IgNykgbHhvciAoaCBsc3IgNClcbjs7XG5cbmxldCBzbG90IHQga2V5ID1cbiAgbGV0IGhhc2ggPSB0Lmhhc2hhYmxlLkhhc2hhYmxlLmhhc2gga2V5IGluXG4gICgqIHRoaXMgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZSBiZWNhdXNlIHdlIGRvIFtsYW5kXSB3aXRoIG5vbi1uZWdhdGl2ZSBudW1iZXIgKilcbiAgaGFzaCBsYW5kIChBcnJheS5sZW5ndGggdC50YWJsZSAtIDEpXG47O1xuXG5sZXQgYWRkX3dvcmtlciB0IH5yZXBsYWNlIH5rZXkgfmRhdGEgPVxuICBsZXQgaSA9IHNsb3QgdCBrZXkgaW5cbiAgbGV0IHJvb3QgPSB0LnRhYmxlLihpKSBpblxuICBsZXQgYWRkZWQgPSB0LnJlY2VudGx5X2FkZGVkIGluXG4gIGFkZGVkIDo9IGZhbHNlO1xuICBsZXQgbmV3X3Jvb3QgPVxuICAgICgqIFRoZSBhdmwgdHJlZSBtaWdodCByZXBsYWNlIHRoZSB2YWx1ZSBbcmVwbGFjZT10cnVlXSBvciBkbyBub3RoaW5nIFtyZXBsYWNlPWZhbHNlXVxuICAgICAgIHRvIHRoZSBlbnRyeSwgaW4gdGhhdCBjYXNlIHRoZSB0YWJsZSBkaWQgbm90IGdldCBiaWdnZXIsIHNvIHdlIHNob3VsZCBub3RcbiAgICAgICBpbmNyZW1lbnQgbGVuZ3RoLCB3ZSBwYXNzIGluIHRoZSBib29sIHJlZiB0LmFkZGVkIHNvIHRoYXQgaXQgY2FuIHRlbGwgdXMgd2hldGhlclxuICAgICAgIGl0IGFkZGVkIG9yIHJlcGxhY2VkLiBXZSBkbyBpdCB0aGlzIHdheSB0byBhdm9pZCBleHRyYSBhbGxvY2F0aW9uLiBTaW5jZSB0aGUgYm9vbFxuICAgICAgIGlzIGFuIGltbWVkaWF0ZSBpdCBkb2VzIG5vdCBnbyB0aHJvdWdoIHRoZSB3cml0ZSBiYXJyaWVyLiAqKVxuICAgIEF2bHRyZWUuYWRkIH5yZXBsYWNlIHJvb3QgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIH5hZGRlZCB+a2V5IH5kYXRhXG4gIGluXG4gIGlmICFhZGRlZCB0aGVuIHQubGVuZ3RoIDwtIHQubGVuZ3RoICsgMTtcbiAgKCogVGhpcyBsaXR0bGUgb3B0aW1pemF0aW9uIHNhdmVzIGEgY2FtbF9tb2RpZnkgd2hlbiB0aGUgdHJlZVxuICAgICBoYXNuJ3QgYmVlbiByZWJhbGFuY2VkLiAqKVxuICBpZiBub3QgKHBoeXNfZXF1YWwgbmV3X3Jvb3Qgcm9vdCkgdGhlbiB0LnRhYmxlLihpKSA8LSBuZXdfcm9vdFxuOztcblxubGV0IG1heWJlX3Jlc2l6ZV90YWJsZSB0ID1cbiAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gIGxldCBzaG91bGRfZ3JvdyA9IHQubGVuZ3RoID4gbGVuIGluXG4gIGlmIHNob3VsZF9ncm93ICYmIHQuZ3Jvd3RoX2FsbG93ZWRcbiAgdGhlbiAoXG4gICAgbGV0IG5ld19hcnJheV9sZW5ndGggPSBJbnQubWluIChsZW4gKiAyKSBtYXhfdGFibGVfbGVuZ3RoIGluXG4gICAgaWYgbmV3X2FycmF5X2xlbmd0aCA+IGxlblxuICAgIHRoZW4gKFxuICAgICAgbGV0IG5ld190YWJsZSA9IEFycmF5LmNyZWF0ZSB+bGVuOm5ld19hcnJheV9sZW5ndGggQXZsdHJlZS5lbXB0eSBpblxuICAgICAgbGV0IG9sZF90YWJsZSA9IHQudGFibGUgaW5cbiAgICAgIHQudGFibGUgPC0gbmV3X3RhYmxlO1xuICAgICAgdC5sZW5ndGggPC0gMDtcbiAgICAgIGxldCBmIH5rZXkgfmRhdGEgPSBhZGRfd29ya2VyIH5yZXBsYWNlOnRydWUgdCB+a2V5IH5kYXRhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIG9sZF90YWJsZSAtIDEgZG9cbiAgICAgICAgQXZsdHJlZS5pdGVyIG9sZF90YWJsZS4oaSkgfmZcbiAgICAgIGRvbmUpKVxuOztcblxubGV0IHNldCB0IH5rZXkgfmRhdGEgPVxuICBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0O1xuICBhZGRfd29ya2VyIH5yZXBsYWNlOnRydWUgdCB+a2V5IH5kYXRhO1xuICBtYXliZV9yZXNpemVfdGFibGUgdFxuOztcblxubGV0IGFkZCB0IH5rZXkgfmRhdGEgPVxuICBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0O1xuICBhZGRfd29ya2VyIH5yZXBsYWNlOmZhbHNlIHQgfmtleSB+ZGF0YTtcbiAgaWYgISh0LnJlY2VudGx5X2FkZGVkKVxuICB0aGVuIChcbiAgICBtYXliZV9yZXNpemVfdGFibGUgdDtcbiAgICBgT2spXG4gIGVsc2UgYER1cGxpY2F0ZVxuOztcblxubGV0IGFkZF9leG4gdCB+a2V5IH5kYXRhID1cbiAgbWF0Y2ggYWRkIHQgfmtleSB+ZGF0YSB3aXRoXG4gIHwgYE9rIC0+ICgpXG4gIHwgYER1cGxpY2F0ZSAtPlxuICAgIGxldCBzZXhwX29mX2tleSA9IHNleHBfb2Zfa2V5IHQgaW5cbiAgICBsZXQgZXJyb3IgPSBFcnJvci5jcmVhdGUgXCJIYXNodGJsLmFkZF9leG4gZ290IGtleSBhbHJlYWR5IHByZXNlbnRcIiBrZXkgc2V4cF9vZl9rZXkgaW5cbiAgICBFcnJvci5yYWlzZSBlcnJvclxuOztcblxubGV0IGNsZWFyIHQgPVxuICBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0O1xuICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIHQudGFibGUgLSAxIGRvXG4gICAgdC50YWJsZS4oaSkgPC0gQXZsdHJlZS5lbXB0eVxuICBkb25lO1xuICB0Lmxlbmd0aCA8LSAwXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbCB0IGtleSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gICgqIHdpdGggYSBnb29kIGhhc2ggZnVuY3Rpb24gdGhlc2UgZmlyc3QgdHdvIGNhc2VzIHdpbGwgYmUgdGhlIG92ZXJ3aGVsbWluZyBtYWpvcml0eSxcbiAgICAgYW5kIEF2bHRyZWUuZmluZCBpcyByZWN1cnNpdmUsIHNvIGl0IGNhbid0IGJlIGlubGluZWQsIHNvIGRvaW5nIHRoaXMgYXZvaWRzIGFcbiAgICAgZnVuY3Rpb24gY2FsbCBpbiBtb3N0IGNhc2VzLiAqKVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5XG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIHYgZWxzZSBpZl9ub3RfZm91bmQga2V5XG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZF9hbmRfY2FsbCB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXkgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsMSB0IGtleSB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXkgYVxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB2IGEgZWxzZSBpZl9ub3RfZm91bmQga2V5IGFcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kX2FuZF9jYWxsMSB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXkgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsMiB0IGtleSB+YSB+YiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXkgYSBiXG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIHYgYSBiIGVsc2UgaWZfbm90X2ZvdW5kIGtleSBhIGJcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kX2FuZF9jYWxsMiB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXkgfmEgfmIgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbCB0IGtleSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gICgqIHdpdGggYSBnb29kIGhhc2ggZnVuY3Rpb24gdGhlc2UgZmlyc3QgdHdvIGNhc2VzIHdpbGwgYmUgdGhlIG92ZXJ3aGVsbWluZyBtYWpvcml0eSxcbiAgICAgYW5kIEF2bHRyZWUuZmluZCBpcyByZWN1cnNpdmUsIHNvIGl0IGNhbid0IGJlIGlubGluZWQsIHNvIGRvaW5nIHRoaXMgYXZvaWRzIGFcbiAgICAgZnVuY3Rpb24gY2FsbCBpbiBtb3N0IGNhc2VzLiAqKVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5XG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIH5rZXk6ayB+ZGF0YTp2IGVsc2UgaWZfbm90X2ZvdW5kIGtleVxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRpX2FuZF9jYWxsIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsMSB0IGtleSB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXkgYVxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB+a2V5OmsgfmRhdGE6diBhIGVsc2UgaWZfbm90X2ZvdW5kIGtleSBhXG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZGlfYW5kX2NhbGwxIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleSB+YSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsMiB0IGtleSB+YSB+YiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGlmX25vdF9mb3VuZCBrZXkgYSBiXG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlX2tleSB0IGsga2V5ID0gMCB0aGVuIGlmX2ZvdW5kIH5rZXk6ayB+ZGF0YTp2IGEgYiBlbHNlIGlmX25vdF9mb3VuZCBrZXkgYSBiXG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZGlfYW5kX2NhbGwyXG4gICAgICB0cmVlXG4gICAgICB+Y29tcGFyZTooY29tcGFyZV9rZXkgdClcbiAgICAgIGtleVxuICAgICAgfmFcbiAgICAgIH5iXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kID1cbiAgbGV0IGlmX2ZvdW5kIHYgPSBTb21lIHYgaW5cbiAgbGV0IGlmX25vdF9mb3VuZCBfID0gTm9uZSBpblxuICBmdW4gdCBrZXkgLT4gZmluZF9hbmRfY2FsbCB0IGtleSB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IG1lbSB0IGtleSA9XG4gIG1hdGNoIHQudGFibGUuKHNsb3QgdCBrZXkpIHdpdGhcbiAgfCBBdmx0cmVlLkVtcHR5IC0+IGZhbHNlXG4gIHwgQXZsdHJlZS5MZWFmIHsga2V5ID0gazsgdmFsdWUgPSBfIH0gLT4gY29tcGFyZV9rZXkgdCBrIGtleSA9IDBcbiAgfCB0cmVlIC0+IEF2bHRyZWUubWVtIHRyZWUgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleVxuOztcblxubGV0IHJlbW92ZSB0IGtleSA9XG4gIGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQ7XG4gIGxldCBpID0gc2xvdCB0IGtleSBpblxuICBsZXQgcm9vdCA9IHQudGFibGUuKGkpIGluXG4gIGxldCBhZGRlZF9vcl9yZW1vdmVkID0gdC5yZWNlbnRseV9hZGRlZCBpblxuICBhZGRlZF9vcl9yZW1vdmVkIDo9IGZhbHNlO1xuICBsZXQgbmV3X3Jvb3QgPVxuICAgIEF2bHRyZWUucmVtb3ZlIHJvb3QgfnJlbW92ZWQ6YWRkZWRfb3JfcmVtb3ZlZCB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5XG4gIGluXG4gIGlmIG5vdCAocGh5c19lcXVhbCByb290IG5ld19yb290KSB0aGVuIHQudGFibGUuKGkpIDwtIG5ld19yb290O1xuICBpZiAhYWRkZWRfb3JfcmVtb3ZlZCB0aGVuIHQubGVuZ3RoIDwtIHQubGVuZ3RoIC0gMVxuOztcblxubGV0IGxlbmd0aCB0ID0gdC5sZW5ndGhcbmxldCBpc19lbXB0eSB0ID0gbGVuZ3RoIHQgPSAwXG5cbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBpZiBsZW5ndGggdCA9IDBcbiAgdGhlbiBpbml0XG4gIGVsc2UgKFxuICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIHQudGFibGUgaW5cbiAgICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgICBsZXQgbSA9IHQubXV0YXRpb25fYWxsb3dlZCBpblxuICAgIG1hdGNoXG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gZmFsc2U7XG4gICAgICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICAgICAgbWF0Y2ggQXJyYXkudW5zYWZlX2dldCB0LnRhYmxlIGkgd2l0aFxuICAgICAgICB8IEF2bHRyZWUuRW1wdHkgLT4gKClcbiAgICAgICAgfCBBdmx0cmVlLkxlYWYgeyBrZXk7IHZhbHVlID0gZGF0YSB9IC0+IGFjYyA6PSBmIH5rZXkgfmRhdGEgIWFjY1xuICAgICAgICB8IGJ1Y2tldCAtPiBhY2MgOj0gQXZsdHJlZS5mb2xkIGJ1Y2tldCB+aW5pdDohYWNjIH5mXG4gICAgICBkb25lXG4gICAgd2l0aFxuICAgIHwgKCkgLT5cbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBtO1xuICAgICAgIWFjY1xuICAgIHwgZXhjZXB0aW9uIGV4biAtPlxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIG07XG4gICAgICByYWlzZSBleG4pXG47O1xuXG5sZXQgaXRlcmkgdCB+ZiA9XG4gIGlmIHQubGVuZ3RoID0gMFxuICB0aGVuICgpXG4gIGVsc2UgKFxuICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIHQudGFibGUgaW5cbiAgICBsZXQgbSA9IHQubXV0YXRpb25fYWxsb3dlZCBpblxuICAgIG1hdGNoXG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gZmFsc2U7XG4gICAgICBmb3IgaSA9IDAgdG8gbiAtIDEgZG9cbiAgICAgICAgbWF0Y2ggQXJyYXkudW5zYWZlX2dldCB0LnRhYmxlIGkgd2l0aFxuICAgICAgICB8IEF2bHRyZWUuRW1wdHkgLT4gKClcbiAgICAgICAgfCBBdmx0cmVlLkxlYWYgeyBrZXk7IHZhbHVlID0gZGF0YSB9IC0+IGYgfmtleSB+ZGF0YVxuICAgICAgICB8IGJ1Y2tldCAtPiBBdmx0cmVlLml0ZXIgYnVja2V0IH5mXG4gICAgICBkb25lXG4gICAgd2l0aFxuICAgIHwgKCkgLT4gdC5tdXRhdGlvbl9hbGxvd2VkIDwtIG1cbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBtO1xuICAgICAgcmFpc2UgZXhuKVxuOztcblxubGV0IGl0ZXIgdCB+ZiA9IGl0ZXJpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxubGV0IGl0ZXJfa2V5cyB0IH5mID0gaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGE6XyAtPiBmIGtleSlcblxubGV0IHJlYyBjaG9vc2Vfbm9uZW1wdHkgdGFibGUgaSA9XG4gIGxldCBhdmx0cmVlID0gdGFibGUuKGkpIGluXG4gIGlmIEF2bHRyZWUuaXNfZW1wdHkgYXZsdHJlZVxuICB0aGVuIGNob29zZV9ub25lbXB0eSB0YWJsZSAoaSArIDEpXG4gIGVsc2UgQXZsdHJlZS5jaG9vc2VfZXhuIGF2bHRyZWVcbjs7XG5cbmxldCBjaG9vc2VfZXhuIHQgPVxuICBpZiB0Lmxlbmd0aCA9IDAgdGhlbiByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSGFzaHRibC5jaG9vc2VfZXhuXSBvZiBlbXB0eSBoYXNodGJsXCIgW10pO1xuICBjaG9vc2Vfbm9uZW1wdHkgdC50YWJsZSAwXG47O1xuXG5sZXQgY2hvb3NlIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGNob29zZV9ub25lbXB0eSB0LnRhYmxlIDApXG5cbmxldCBpbnZhcmlhbnQgaW52YXJpYW50X2tleSBpbnZhcmlhbnRfZGF0YSB0ID1cbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCB0LnRhYmxlIC0gMSBkb1xuICAgIEF2bHRyZWUuaW52YXJpYW50IHQudGFibGUuKGkpIH5jb21wYXJlOihjb21wYXJlX2tleSB0KVxuICBkb25lO1xuICBsZXQgcmVhbF9sZW4gPVxuICAgIGZvbGQgdCB+aW5pdDowIH5mOihmdW4gfmtleSB+ZGF0YSBpIC0+XG4gICAgICBpbnZhcmlhbnRfa2V5IGtleTtcbiAgICAgIGludmFyaWFudF9kYXRhIGRhdGE7XG4gICAgICBpICsgMSlcbiAgaW5cbiAgYXNzZXJ0IChyZWFsX2xlbiA9IHQubGVuZ3RoKVxuOztcblxubGV0IGZpbmRfZXhuID1cbiAgbGV0IGlmX2ZvdW5kIHYgXyA9IHYgaW5cbiAgbGV0IGlmX25vdF9mb3VuZCBrIHQgPVxuICAgIHJhaXNlXG4gICAgICAoTm90X2ZvdW5kX3MgKExpc3QgWyBBdG9tIFwiSGFzaHRibC5maW5kX2V4bjogbm90IGZvdW5kXCI7IHQuaGFzaGFibGUuc2V4cF9vZl90IGsgXSkpXG4gIGluXG4gIGxldCBmaW5kX2V4biB0IGtleSA9IGZpbmRfYW5kX2NhbGwxIHQga2V5IH5hOnQgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX2V4blxuOztcblxubGV0IGV4aXN0c2kgdCB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIHIucmV0dXJuIHRydWUpO1xuICAgIGZhbHNlKVxuOztcblxubGV0IGV4aXN0cyB0IH5mID0gZXhpc3RzaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbmxldCBmb3JfYWxsaSB0IH5mID0gbm90IChleGlzdHNpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IG5vdCAoZiB+a2V5IH5kYXRhKSkpXG5sZXQgZm9yX2FsbCB0IH5mID0gbm90IChleGlzdHNpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gbm90IChmIGRhdGEpKSlcblxubGV0IGNvdW50aSB0IH5mID1cbiAgZm9sZCB0IH5pbml0OjAgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiBhY2MgKyAxIGVsc2UgYWNjKVxuOztcblxubGV0IGNvdW50IHQgfmYgPVxuICBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSBhY2MgLT4gaWYgZiBkYXRhIHRoZW4gYWNjICsgMSBlbHNlIGFjYylcbjs7XG5cbmxldCBtYXBpIHQgfmYgPVxuICBsZXQgbmV3X3QgPVxuICAgIGNyZWF0ZSB+Z3Jvd3RoX2FsbG93ZWQ6dC5ncm93dGhfYWxsb3dlZCB+aGFzaGFibGU6dC5oYXNoYWJsZSB+c2l6ZTp0Lmxlbmd0aCAoKVxuICBpblxuICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBzZXQgbmV3X3QgfmtleSB+ZGF0YTooZiB+a2V5IH5kYXRhKSk7XG4gIG5ld190XG47O1xuXG5sZXQgbWFwIHQgfmYgPSBtYXBpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxubGV0IGNvcHkgdCA9IG1hcCB0IH5mOkZuLmlkXG5cbmxldCBmaWx0ZXJfbWFwaSB0IH5mID1cbiAgbGV0IG5ld190ID1cbiAgICBjcmVhdGUgfmdyb3d0aF9hbGxvd2VkOnQuZ3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlOnQuaGFzaGFibGUgfnNpemU6dC5sZW5ndGggKClcbiAgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICBtYXRjaCBmIH5rZXkgfmRhdGEgd2l0aFxuICAgIHwgU29tZSBuZXdfZGF0YSAtPiBzZXQgbmV3X3QgfmtleSB+ZGF0YTpuZXdfZGF0YVxuICAgIHwgTm9uZSAtPiAoKSk7XG4gIG5ld190XG47O1xuXG5sZXQgZmlsdGVyX21hcCB0IH5mID0gZmlsdGVyX21hcGkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5cbmxldCBmaWx0ZXJpIHQgfmYgPVxuICBmaWx0ZXJfbWFwaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiBTb21lIGRhdGEgZWxzZSBOb25lKVxuOztcblxubGV0IGZpbHRlciB0IH5mID0gZmlsdGVyaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbmxldCBmaWx0ZXJfa2V5cyB0IH5mID0gZmlsdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YTpfIC0+IGYga2V5KVxuXG5sZXQgcGFydGl0aW9uX21hcGkgdCB+ZiA9XG4gIGxldCB0MCA9XG4gICAgY3JlYXRlIH5ncm93dGhfYWxsb3dlZDp0Lmdyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZTp0Lmhhc2hhYmxlIH5zaXplOnQubGVuZ3RoICgpXG4gIGluXG4gIGxldCB0MSA9XG4gICAgY3JlYXRlIH5ncm93dGhfYWxsb3dlZDp0Lmdyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZTp0Lmhhc2hhYmxlIH5zaXplOnQubGVuZ3RoICgpXG4gIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgbWF0Y2ggKGYgfmtleSB+ZGF0YSA6IF8gRWl0aGVyLnQpIHdpdGhcbiAgICB8IEZpcnN0IG5ld19kYXRhIC0+IHNldCB0MCB+a2V5IH5kYXRhOm5ld19kYXRhXG4gICAgfCBTZWNvbmQgbmV3X2RhdGEgLT4gc2V0IHQxIH5rZXkgfmRhdGE6bmV3X2RhdGEpO1xuICB0MCwgdDFcbjs7XG5cbmxldCBwYXJ0aXRpb25fbWFwIHQgfmYgPSBwYXJ0aXRpb25fbWFwaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcblxubGV0IHBhcnRpdGlvbmlfdGYgdCB+ZiA9XG4gIHBhcnRpdGlvbl9tYXBpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIEZpcnN0IGRhdGEgZWxzZSBTZWNvbmQgZGF0YSlcbjs7XG5cbmxldCBwYXJ0aXRpb25fdGYgdCB+ZiA9IHBhcnRpdGlvbmlfdGYgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5cbmxldCBmaW5kX29yX2FkZCB0IGlkIH5kZWZhdWx0ID1cbiAgZmluZF9hbmRfY2FsbDJcbiAgICB0XG4gICAgaWRcbiAgICB+YTp0XG4gICAgfmI6ZGVmYXVsdFxuICAgIH5pZl9mb3VuZDooZnVuIGRhdGEgXyBfIC0+IGRhdGEpXG4gICAgfmlmX25vdF9mb3VuZDooZnVuIGtleSB0IGRlZmF1bHQgLT5cbiAgICAgIGxldCBkZWZhdWx0ID0gZGVmYXVsdCAoKSBpblxuICAgICAgc2V0IHQgfmtleSB+ZGF0YTpkZWZhdWx0O1xuICAgICAgZGVmYXVsdClcbjs7XG5cbmxldCBmaW5kaV9vcl9hZGQgdCBpZCB+ZGVmYXVsdCA9XG4gIGZpbmRfYW5kX2NhbGwyXG4gICAgdFxuICAgIGlkXG4gICAgfmE6dFxuICAgIH5iOmRlZmF1bHRcbiAgICB+aWZfZm91bmQ6KGZ1biBkYXRhIF8gXyAtPiBkYXRhKVxuICAgIH5pZl9ub3RfZm91bmQ6KGZ1biBrZXkgdCBkZWZhdWx0IC0+XG4gICAgICBsZXQgZGVmYXVsdCA9IGRlZmF1bHQga2V5IGluXG4gICAgICBzZXQgdCB+a2V5IH5kYXRhOmRlZmF1bHQ7XG4gICAgICBkZWZhdWx0KVxuOztcblxuKCogU29tZSBoYXNodGJsIGltcGxlbWVudGF0aW9ucyBtYXkgYmUgYWJsZSB0byBwZXJmb3JtIHRoaXMgbW9yZSBlZmZpY2llbnRseSB0aGFuIHR3b1xuICAgc2VwYXJhdGUgbG9va3VwcyAqKVxubGV0IGZpbmRfYW5kX3JlbW92ZSB0IGlkID1cbiAgbGV0IHJlc3VsdCA9IGZpbmQgdCBpZCBpblxuICBpZiBPcHRpb24uaXNfc29tZSByZXN1bHQgdGhlbiByZW1vdmUgdCBpZDtcbiAgcmVzdWx0XG47O1xuXG5cbmxldCBjaGFuZ2UgdCBpZCB+ZiA9XG4gIG1hdGNoIGYgKGZpbmQgdCBpZCkgd2l0aFxuICB8IE5vbmUgLT4gcmVtb3ZlIHQgaWRcbiAgfCBTb21lIGRhdGEgLT4gc2V0IHQgfmtleTppZCB+ZGF0YVxuOztcblxubGV0IHVwZGF0ZV9hbmRfcmV0dXJuIHQgaWQgfmYgPVxuICBsZXQgZGF0YSA9IGYgKGZpbmQgdCBpZCkgaW5cbiAgc2V0IHQgfmtleTppZCB+ZGF0YTtcbiAgZGF0YVxuOztcblxubGV0IHVwZGF0ZSB0IGlkIH5mID0gaWdub3JlICh1cGRhdGVfYW5kX3JldHVybiB0IGlkIH5mIDogXylcblxubGV0IGluY3JfYnkgfnJlbW92ZV9pZl96ZXJvIHQga2V5IGJ5ID1cbiAgaWYgcmVtb3ZlX2lmX3plcm9cbiAgdGhlblxuICAgIGNoYW5nZSB0IGtleSB+ZjooZnVuIG9wdCAtPlxuICAgICAgbWF0Y2ggYnkgKyBPcHRpb24udmFsdWUgb3B0IH5kZWZhdWx0OjAgd2l0aFxuICAgICAgfCAwIC0+IE5vbmVcbiAgICAgIHwgbiAtPiBTb21lIG4pXG4gIGVsc2VcbiAgICB1cGRhdGUgdCBrZXkgfmY6KGZ1bmN0aW9uXG4gICAgICB8IE5vbmUgLT4gYnlcbiAgICAgIHwgU29tZSBpIC0+IGJ5ICsgaSlcbjs7XG5cbmxldCBpbmNyID8oYnkgPSAxKSA/KHJlbW92ZV9pZl96ZXJvID0gZmFsc2UpIHQga2V5ID0gaW5jcl9ieSB+cmVtb3ZlX2lmX3plcm8gdCBrZXkgYnlcbmxldCBkZWNyID8oYnkgPSAxKSA/KHJlbW92ZV9pZl96ZXJvID0gZmFsc2UpIHQga2V5ID0gaW5jcl9ieSB+cmVtb3ZlX2lmX3plcm8gdCBrZXkgKC1ieSlcblxubGV0IGFkZF9tdWx0aSB0IH5rZXkgfmRhdGEgPVxuICB1cGRhdGUgdCBrZXkgfmY6KGZ1bmN0aW9uXG4gICAgfCBOb25lIC0+IFsgZGF0YSBdXG4gICAgfCBTb21lIGwgLT4gZGF0YSA6OiBsKVxuOztcblxubGV0IHJlbW92ZV9tdWx0aSB0IGtleSA9XG4gIG1hdGNoIGZpbmQgdCBrZXkgd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIFtdIHwgU29tZSBbIF8gXSAtPiByZW1vdmUgdCBrZXlcbiAgfCBTb21lIChfIDo6IHRsKSAtPiBzZXQgdCB+a2V5IH5kYXRhOnRsXG47O1xuXG5sZXQgZmluZF9tdWx0aSB0IGtleSA9XG4gIG1hdGNoIGZpbmQgdCBrZXkgd2l0aFxuICB8IE5vbmUgLT4gW11cbiAgfCBTb21lIGwgLT4gbFxuOztcblxubGV0IGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSB+Z2V0X2RhdGEgcm93cyA9XG4gIGxldCBzaXplID1cbiAgICBtYXRjaCBzaXplIHdpdGhcbiAgICB8IFNvbWUgcyAtPiBzXG4gICAgfCBOb25lIC0+IExpc3QubGVuZ3RoIHJvd3NcbiAgaW5cbiAgbGV0IHJlcyA9IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlIH5zaXplICgpIGluXG4gIGxldCBkdXBlcyA9IHJlZiBbXSBpblxuICBMaXN0Lml0ZXIgcm93cyB+ZjooZnVuIHIgLT5cbiAgICBsZXQga2V5ID0gZ2V0X2tleSByIGluXG4gICAgbGV0IGRhdGEgPSBnZXRfZGF0YSByIGluXG4gICAgaWYgbWVtIHJlcyBrZXkgdGhlbiBkdXBlcyA6PSBrZXkgOjogIWR1cGVzIGVsc2Ugc2V0IHJlcyB+a2V5IH5kYXRhKTtcbiAgbWF0Y2ggIWR1cGVzIHdpdGhcbiAgfCBbXSAtPiBgT2sgcmVzXG4gIHwga2V5cyAtPiBgRHVwbGljYXRlX2tleXMgKExpc3QuZGVkdXBfYW5kX3NvcnQgfmNvbXBhcmU6aGFzaGFibGUuSGFzaGFibGUuY29tcGFyZSBrZXlzKVxuOztcblxubGV0IGNyZWF0ZV9tYXBwZWRfbXVsdGkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSB+Z2V0X2RhdGEgcm93cyA9XG4gIGxldCBzaXplID1cbiAgICBtYXRjaCBzaXplIHdpdGhcbiAgICB8IFNvbWUgcyAtPiBzXG4gICAgfCBOb25lIC0+IExpc3QubGVuZ3RoIHJvd3NcbiAgaW5cbiAgbGV0IHJlcyA9IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgfnNpemUgfmhhc2hhYmxlICgpIGluXG4gIExpc3QuaXRlciByb3dzIH5mOihmdW4gciAtPlxuICAgIGxldCBrZXkgPSBnZXRfa2V5IHIgaW5cbiAgICBsZXQgZGF0YSA9IGdldF9kYXRhIHIgaW5cbiAgICBhZGRfbXVsdGkgcmVzIH5rZXkgfmRhdGEpO1xuICByZXNcbjs7XG5cbmxldCBvZl9hbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCA9XG4gIG1hdGNoIGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleTpmc3QgfmdldF9kYXRhOnNuZCBsc3Qgd2l0aFxuICB8IGBPayB0IC0+IGBPayB0XG4gIHwgYER1cGxpY2F0ZV9rZXlzIGsgLT4gYER1cGxpY2F0ZV9rZXkgKExpc3QuaGRfZXhuIGspXG47O1xuXG5sZXQgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0ID1cbiAgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5OmZzdCB+Z2V0X2RhdGE6c25kIGxzdFxuOztcblxubGV0IG9mX2FsaXN0X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0ID1cbiAgbWF0Y2ggb2ZfYWxpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3Qgd2l0aFxuICB8IGBPayB2IC0+IFJlc3VsdC5PayB2XG4gIHwgYER1cGxpY2F0ZV9rZXkga2V5IC0+XG4gICAgbGV0IHNleHBfb2Zfa2V5ID0gaGFzaGFibGUuSGFzaGFibGUuc2V4cF9vZl90IGluXG4gICAgT3JfZXJyb3IuZXJyb3IgXCJIYXNodGJsLm9mX2FsaXN0X2V4bjogZHVwbGljYXRlIGtleVwiIGtleSBzZXhwX29mX2tleVxuOztcblxubGV0IG9mX2FsaXN0X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCA9XG4gIG1hdGNoIG9mX2FsaXN0X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0IHdpdGhcbiAgfCBSZXN1bHQuT2sgdiAtPiB2XG4gIHwgUmVzdWx0LkVycm9yIGUgLT4gRXJyb3IucmFpc2UgZVxuOztcblxubGV0IG9mX2FsaXN0X211bHRpID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0ID1cbiAgY3JlYXRlX21hcHBlZF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5OmZzdCB+Z2V0X2RhdGE6c25kIGxzdFxuOztcblxubGV0IHRvX2FsaXN0IHQgPSBmb2xkIH5mOihmdW4gfmtleSB+ZGF0YSBsaXN0IC0+IChrZXksIGRhdGEpIDo6IGxpc3QpIH5pbml0OltdIHRcblxubGV0IHNleHBfb2ZfdCBzZXhwX29mX2tleSBzZXhwX29mX2RhdGEgdCA9XG4gIHRcbiAgfD4gdG9fYWxpc3RcbiAgfD4gTGlzdC5zb3J0IH5jb21wYXJlOihmdW4gKGsxLCBfKSAoazIsIF8pIC0+IHQuaGFzaGFibGUuY29tcGFyZSBrMSBrMilcbiAgfD4gc2V4cF9vZl9saXN0IChzZXhwX29mX3BhaXIgc2V4cF9vZl9rZXkgc2V4cF9vZl9kYXRhKVxuOztcblxubGV0IHRfb2Zfc2V4cCB+aGFzaGFibGUga19vZl9zZXhwIGRfb2Zfc2V4cCBzZXhwID1cbiAgbGV0IGFsaXN0ID0gbGlzdF9vZl9zZXhwIChwYWlyX29mX3NleHAga19vZl9zZXhwIGRfb2Zfc2V4cCkgc2V4cCBpblxuICBtYXRjaCBvZl9hbGlzdCB+aGFzaGFibGUgYWxpc3QgfnNpemU6KExpc3QubGVuZ3RoIGFsaXN0KSB3aXRoXG4gIHwgYE9rIHYgLT4gdlxuICB8IGBEdXBsaWNhdGVfa2V5IGsgLT5cbiAgICAoKiBmaW5kIHRoZSBzZXhwIG9mIGEgZHVwbGljYXRlIGtleSwgc28gdGhlIGVycm9yIGlzIG5hcnJvd2VkIHRvIGEga2V5IGFuZCBub3RcbiAgICAgICB0aGUgd2hvbGUgbWFwICopXG4gICAgbGV0IGFsaXN0X3NleHBzID0gbGlzdF9vZl9zZXhwIChwYWlyX29mX3NleHAgRm4uaWQgRm4uaWQpIHNleHAgaW5cbiAgICBsZXQgZm91bmRfZmlyc3RfayA9IHJlZiBmYWxzZSBpblxuICAgIExpc3QuaXRlcjJfZXhuIGFsaXN0IGFsaXN0X3NleHBzIH5mOihmdW4gKGsyLCBfKSAoazJfc2V4cCwgXykgLT5cbiAgICAgIGlmIGhhc2hhYmxlLmNvbXBhcmUgayBrMiA9IDBcbiAgICAgIHRoZW5cbiAgICAgICAgaWYgIWZvdW5kX2ZpcnN0X2tcbiAgICAgICAgdGhlbiBvZl9zZXhwX2Vycm9yIFwiSGFzaHRibC50X29mX3NleHA6IGR1cGxpY2F0ZSBrZXlcIiBrMl9zZXhwXG4gICAgICAgIGVsc2UgZm91bmRfZmlyc3RfayA6PSB0cnVlKTtcbiAgICBhc3NlcnQgZmFsc2Vcbjs7XG5cbmxldCB0X3NleHBfZ3JhbW1hclxuICAgICAgKHR5cGUgayB2KVxuICAgICAgKGtfZ3JhbW1hciA6IGsgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgICAodl9ncmFtbWFyIDogdiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiAoaywgdikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKExpc3QuQXNzb2MudF9zZXhwX2dyYW1tYXIga19ncmFtbWFyIHZfZ3JhbW1hcilcbjs7XG5cbmxldCBrZXlzIHQgPSBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biB+a2V5IH5kYXRhOl8gYWNjIC0+IGtleSA6OiBhY2MpXG5sZXQgZGF0YSB0ID0gZm9sZCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSBsaXN0IC0+IGRhdGEgOjogbGlzdCkgfmluaXQ6W10gdFxuXG5sZXQgYWRkX3RvX2dyb3VwcyBncm91cHMgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIH5yb3dzID1cbiAgTGlzdC5pdGVyIHJvd3MgfmY6KGZ1biByb3cgLT5cbiAgICBsZXQga2V5ID0gZ2V0X2tleSByb3cgaW5cbiAgICBsZXQgZGF0YSA9IGdldF9kYXRhIHJvdyBpblxuICAgIGxldCBkYXRhID1cbiAgICAgIG1hdGNoIGZpbmQgZ3JvdXBzIGtleSB3aXRoXG4gICAgICB8IE5vbmUgLT4gZGF0YVxuICAgICAgfCBTb21lIG9sZCAtPiBjb21iaW5lIG9sZCBkYXRhXG4gICAgaW5cbiAgICBzZXQgZ3JvdXBzIH5rZXkgfmRhdGEpXG47O1xuXG5sZXQgZ3JvdXAgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgcm93cyA9XG4gIGxldCByZXMgPSBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSAoKSBpblxuICBhZGRfdG9fZ3JvdXBzIHJlcyB+Z2V0X2tleSB+Z2V0X2RhdGEgfmNvbWJpbmUgfnJvd3M7XG4gIHJlc1xuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IHJvd3MgPVxuICBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgfmdldF9kYXRhOkZuLmlkIHJvd3Ncbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSByb3dzID1cbiAgbWF0Y2ggY3JlYXRlX3dpdGhfa2V5ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgcm93cyB3aXRoXG4gIHwgYE9rIHQgLT4gUmVzdWx0Lk9rIHRcbiAgfCBgRHVwbGljYXRlX2tleXMga2V5cyAtPlxuICAgIGxldCBzZXhwX29mX2tleSA9IGhhc2hhYmxlLkhhc2hhYmxlLnNleHBfb2ZfdCBpblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiSGFzaHRibC5jcmVhdGVfd2l0aF9rZXk6IGR1cGxpY2F0ZSBrZXlzXCJcbiAgICAgICAgIFsgXCJrZXlzXCIsIHNleHBfb2ZfbGlzdCBzZXhwX29mX2tleSBrZXlzIF0pXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IHJvd3MgPVxuICBPcl9lcnJvci5va19leG4gKGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IHJvd3MpXG47O1xuXG5sZXQgbWVyZ2UgPVxuICBsZXQgbWF5YmVfc2V0IHQgfmtleSB+ZiBkID1cbiAgICBtYXRjaCBmIH5rZXkgZCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHYgLT4gc2V0IHQgfmtleSB+ZGF0YTp2XG4gIGluXG4gIGZ1biB0X2xlZnQgdF9yaWdodCB+ZiAtPlxuICAgIGlmIG5vdCAoSGFzaGFibGUuZXF1YWwgdF9sZWZ0Lmhhc2hhYmxlIHRfcmlnaHQuaGFzaGFibGUpXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIkhhc2h0YmwubWVyZ2U6IGRpZmZlcmVudCAnaGFzaGFibGUnIHZhbHVlc1wiO1xuICAgIGxldCBuZXdfdCA9XG4gICAgICBjcmVhdGVcbiAgICAgICAgfmdyb3d0aF9hbGxvd2VkOnRfbGVmdC5ncm93dGhfYWxsb3dlZFxuICAgICAgICB+aGFzaGFibGU6dF9sZWZ0Lmhhc2hhYmxlXG4gICAgICAgIH5zaXplOnRfbGVmdC5sZW5ndGhcbiAgICAgICAgKClcbiAgICBpblxuICAgIHdpdGhvdXRfbXV0YXRpbmcgdF9sZWZ0IChmdW4gKCkgLT5cbiAgICAgIHdpdGhvdXRfbXV0YXRpbmcgdF9yaWdodCAoZnVuICgpIC0+XG4gICAgICAgIGl0ZXJpIHRfbGVmdCB+ZjooZnVuIH5rZXkgfmRhdGE6bGVmdCAtPlxuICAgICAgICAgIG1hdGNoIGZpbmQgdF9yaWdodCBrZXkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBtYXliZV9zZXQgbmV3X3QgfmtleSB+ZiAoYExlZnQgbGVmdClcbiAgICAgICAgICB8IFNvbWUgcmlnaHQgLT4gbWF5YmVfc2V0IG5ld190IH5rZXkgfmYgKGBCb3RoIChsZWZ0LCByaWdodCkpKTtcbiAgICAgICAgaXRlcmkgdF9yaWdodCB+ZjooZnVuIH5rZXkgfmRhdGE6cmlnaHQgLT5cbiAgICAgICAgICBtYXRjaCBmaW5kIHRfbGVmdCBrZXkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBtYXliZV9zZXQgbmV3X3QgfmtleSB+ZiAoYFJpZ2h0IHJpZ2h0KVxuICAgICAgICAgIHwgU29tZSBfIC0+ICgpXG4gICAgICAgICAgKCogYWxyZWFkeSBkb25lIGFib3ZlICopKSkpO1xuICAgIG5ld190XG47O1xuXG5sZXQgbWVyZ2VfaW50byB+c3JjIH5kc3QgfmYgPVxuICBpdGVyaSBzcmMgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgbGV0IGRzdF9kYXRhID0gZmluZCBkc3Qga2V5IGluXG4gICAgbGV0IGFjdGlvbiA9IHdpdGhvdXRfbXV0YXRpbmcgZHN0IChmdW4gKCkgLT4gZiB+a2V5IGRhdGEgZHN0X2RhdGEpIGluXG4gICAgbWF0Y2ggKGFjdGlvbiA6IF8gTWVyZ2VfaW50b19hY3Rpb24udCkgd2l0aFxuICAgIHwgUmVtb3ZlIC0+IHJlbW92ZSBkc3Qga2V5XG4gICAgfCBTZXRfdG8gZGF0YSAtPlxuICAgICAgKG1hdGNoIGRzdF9kYXRhIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gc2V0IGRzdCB+a2V5IH5kYXRhXG4gICAgICAgfCBTb21lIGRzdF9kYXRhIC0+IGlmIG5vdCAocGh5c19lcXVhbCBkc3RfZGF0YSBkYXRhKSB0aGVuIHNldCBkc3QgfmtleSB+ZGF0YSkpXG47O1xuXG5sZXQgZmlsdGVyaV9pbnBsYWNlIHQgfmYgPVxuICBsZXQgdG9fcmVtb3ZlID1cbiAgICBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biB+a2V5IH5kYXRhIGFjIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIGFjIGVsc2Uga2V5IDo6IGFjKVxuICBpblxuICBMaXN0Lml0ZXIgdG9fcmVtb3ZlIH5mOihmdW4ga2V5IC0+IHJlbW92ZSB0IGtleSlcbjs7XG5cbmxldCBmaWx0ZXJfaW5wbGFjZSB0IH5mID0gZmlsdGVyaV9pbnBsYWNlIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxubGV0IGZpbHRlcl9rZXlzX2lucGxhY2UgdCB+ZiA9IGZpbHRlcmlfaW5wbGFjZSB0IH5mOihmdW4gfmtleSB+ZGF0YTpfIC0+IGYga2V5KVxuXG5sZXQgZmlsdGVyX21hcGlfaW5wbGFjZSB0IH5mID1cbiAgbGV0IG1hcF9yZXN1bHRzID0gZm9sZCB0IH5pbml0OltdIH5mOihmdW4gfmtleSB+ZGF0YSBhYyAtPiAoa2V5LCBmIH5rZXkgfmRhdGEpIDo6IGFjKSBpblxuICBMaXN0Lml0ZXIgbWFwX3Jlc3VsdHMgfmY6KGZ1biAoa2V5LCByZXN1bHQpIC0+XG4gICAgbWF0Y2ggcmVzdWx0IHdpdGhcbiAgICB8IE5vbmUgLT4gcmVtb3ZlIHQga2V5XG4gICAgfCBTb21lIGRhdGEgLT4gc2V0IHQgfmtleSB+ZGF0YSlcbjs7XG5cbmxldCBmaWx0ZXJfbWFwX2lucGxhY2UgdCB+ZiA9IGZpbHRlcl9tYXBpX2lucGxhY2UgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5cbmxldCBtYXBpX2lucGxhY2UgdCB+ZiA9XG4gIGVuc3VyZV9tdXRhdGlvbl9hbGxvd2VkIHQ7XG4gIHdpdGhvdXRfbXV0YXRpbmcgdCAoZnVuICgpIC0+IEFycmF5Lml0ZXIgdC50YWJsZSB+ZjooQXZsdHJlZS5tYXBpX2lucGxhY2UgfmYpKVxuOztcblxubGV0IG1hcF9pbnBsYWNlIHQgfmYgPSBtYXBpX2lucGxhY2UgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5cbmxldCBlcXVhbCBlcXVhbCB0IHQnID1cbiAgbGVuZ3RoIHQgPSBsZW5ndGggdCdcbiAgJiYgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgd2l0aG91dF9tdXRhdGluZyB0JyAoZnVuICgpIC0+XG4gICAgICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgICAgICBtYXRjaCBmaW5kIHQnIGtleSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiByLnJldHVybiBmYWxzZVxuICAgICAgICB8IFNvbWUgZGF0YScgLT4gaWYgbm90IChlcXVhbCBkYXRhIGRhdGEnKSB0aGVuIHIucmV0dXJuIGZhbHNlKSk7XG4gICAgdHJ1ZSlcbjs7XG5cbmxldCBzaW1pbGFyID0gZXF1YWxcblxubW9kdWxlIEFjY2Vzc29ycyA9IHN0cnVjdFxuICBsZXQgaW52YXJpYW50ID0gaW52YXJpYW50XG4gIGxldCBjaG9vc2UgPSBjaG9vc2VcbiAgbGV0IGNob29zZV9leG4gPSBjaG9vc2VfZXhuXG4gIGxldCBjbGVhciA9IGNsZWFyXG4gIGxldCBjb3B5ID0gY29weVxuICBsZXQgcmVtb3ZlID0gcmVtb3ZlXG4gIGxldCBzZXQgPSBzZXRcbiAgbGV0IGFkZCA9IGFkZFxuICBsZXQgYWRkX2V4biA9IGFkZF9leG5cbiAgbGV0IGNoYW5nZSA9IGNoYW5nZVxuICBsZXQgdXBkYXRlID0gdXBkYXRlXG4gIGxldCB1cGRhdGVfYW5kX3JldHVybiA9IHVwZGF0ZV9hbmRfcmV0dXJuXG4gIGxldCBhZGRfbXVsdGkgPSBhZGRfbXVsdGlcbiAgbGV0IHJlbW92ZV9tdWx0aSA9IHJlbW92ZV9tdWx0aVxuICBsZXQgZmluZF9tdWx0aSA9IGZpbmRfbXVsdGlcbiAgbGV0IG1lbSA9IG1lbVxuICBsZXQgaXRlcl9rZXlzID0gaXRlcl9rZXlzXG4gIGxldCBpdGVyID0gaXRlclxuICBsZXQgaXRlcmkgPSBpdGVyaVxuICBsZXQgZXhpc3RzID0gZXhpc3RzXG4gIGxldCBleGlzdHNpID0gZXhpc3RzaVxuICBsZXQgZm9yX2FsbCA9IGZvcl9hbGxcbiAgbGV0IGZvcl9hbGxpID0gZm9yX2FsbGlcbiAgbGV0IGNvdW50ID0gY291bnRcbiAgbGV0IGNvdW50aSA9IGNvdW50aVxuICBsZXQgZm9sZCA9IGZvbGRcbiAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICBsZXQgaXNfZW1wdHkgPSBpc19lbXB0eVxuICBsZXQgbWFwID0gbWFwXG4gIGxldCBtYXBpID0gbWFwaVxuICBsZXQgZmlsdGVyX21hcCA9IGZpbHRlcl9tYXBcbiAgbGV0IGZpbHRlcl9tYXBpID0gZmlsdGVyX21hcGlcbiAgbGV0IGZpbHRlcl9rZXlzID0gZmlsdGVyX2tleXNcbiAgbGV0IGZpbHRlciA9IGZpbHRlclxuICBsZXQgZmlsdGVyaSA9IGZpbHRlcmlcbiAgbGV0IHBhcnRpdGlvbl9tYXAgPSBwYXJ0aXRpb25fbWFwXG4gIGxldCBwYXJ0aXRpb25fbWFwaSA9IHBhcnRpdGlvbl9tYXBpXG4gIGxldCBwYXJ0aXRpb25fdGYgPSBwYXJ0aXRpb25fdGZcbiAgbGV0IHBhcnRpdGlvbmlfdGYgPSBwYXJ0aXRpb25pX3RmXG4gIGxldCBmaW5kX29yX2FkZCA9IGZpbmRfb3JfYWRkXG4gIGxldCBmaW5kaV9vcl9hZGQgPSBmaW5kaV9vcl9hZGRcbiAgbGV0IGZpbmQgPSBmaW5kXG4gIGxldCBmaW5kX2V4biA9IGZpbmRfZXhuXG4gIGxldCBmaW5kX2FuZF9jYWxsID0gZmluZF9hbmRfY2FsbFxuICBsZXQgZmluZF9hbmRfY2FsbDEgPSBmaW5kX2FuZF9jYWxsMVxuICBsZXQgZmluZF9hbmRfY2FsbDIgPSBmaW5kX2FuZF9jYWxsMlxuICBsZXQgZmluZGlfYW5kX2NhbGwgPSBmaW5kaV9hbmRfY2FsbFxuICBsZXQgZmluZGlfYW5kX2NhbGwxID0gZmluZGlfYW5kX2NhbGwxXG4gIGxldCBmaW5kaV9hbmRfY2FsbDIgPSBmaW5kaV9hbmRfY2FsbDJcbiAgbGV0IGZpbmRfYW5kX3JlbW92ZSA9IGZpbmRfYW5kX3JlbW92ZVxuICBsZXQgdG9fYWxpc3QgPSB0b19hbGlzdFxuICBsZXQgbWVyZ2UgPSBtZXJnZVxuICBsZXQgbWVyZ2VfaW50byA9IG1lcmdlX2ludG9cbiAgbGV0IGtleXMgPSBrZXlzXG4gIGxldCBkYXRhID0gZGF0YVxuICBsZXQgZmlsdGVyX2tleXNfaW5wbGFjZSA9IGZpbHRlcl9rZXlzX2lucGxhY2VcbiAgbGV0IGZpbHRlcl9pbnBsYWNlID0gZmlsdGVyX2lucGxhY2VcbiAgbGV0IGZpbHRlcmlfaW5wbGFjZSA9IGZpbHRlcmlfaW5wbGFjZVxuICBsZXQgbWFwX2lucGxhY2UgPSBtYXBfaW5wbGFjZVxuICBsZXQgbWFwaV9pbnBsYWNlID0gbWFwaV9pbnBsYWNlXG4gIGxldCBmaWx0ZXJfbWFwX2lucGxhY2UgPSBmaWx0ZXJfbWFwX2lucGxhY2VcbiAgbGV0IGZpbHRlcl9tYXBpX2lucGxhY2UgPSBmaWx0ZXJfbWFwaV9pbnBsYWNlXG4gIGxldCBlcXVhbCA9IGVxdWFsXG4gIGxldCBzaW1pbGFyID0gc2ltaWxhclxuICBsZXQgaW5jciA9IGluY3JcbiAgbGV0IGRlY3IgPSBkZWNyXG4gIGxldCBzZXhwX29mX2tleSA9IHNleHBfb2Zfa2V5XG5lbmRcblxubW9kdWxlIENyZWF0b3JzIChLZXkgOiBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBoYXNoYWJsZSA6ICdhIHQgSGFzaGFibGUudFxuICBlbmQpIDogc2lnXG4gIHR5cGUgKCdhLCAnYikgdF8gPSAoJ2EgS2V5LnQsICdiKSB0XG5cbiAgdmFsIHRfb2Zfc2V4cCA6IChTZXhwLnQgLT4gJ2EgS2V5LnQpIC0+IChTZXhwLnQgLT4gJ2IpIC0+IFNleHAudCAtPiAoJ2EsICdiKSB0X1xuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yc19nZW5lcmljXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdF9cbiAgICB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIEtleS50XG4gICAgd2l0aCB0eXBlICgna2V5LCAnZGF0YSwgJ2EpIGNyZWF0ZV9vcHRpb25zIDo9XG4gICAgICAoJ2tleSwgJ2RhdGEsICdhKSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuZW5kID0gc3RydWN0XG4gIGxldCBoYXNoYWJsZSA9IEtleS5oYXNoYWJsZVxuXG4gIHR5cGUgKCdhLCAnYikgdF8gPSAoJ2EgS2V5LnQsICdiKSB0XG5cbiAgbGV0IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgKCkgPSBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSAoKVxuICBsZXQgb2ZfYWxpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPSBvZl9hbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIGxcblxuICBsZXQgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID1cbiAgICBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSBsXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID1cbiAgICBvZl9hbGlzdF9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIGxcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID1cbiAgICBvZl9hbGlzdF9leG4gP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSBsXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCBrX29mX3NleHAgZF9vZl9zZXhwIHNleHAgPSB0X29mX3NleHAgfmhhc2hhYmxlIGtfb2Zfc2V4cCBkX29mX3NleHAgc2V4cFxuXG4gIGxldCBvZl9hbGlzdF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9XG4gICAgb2ZfYWxpc3RfbXVsdGkgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSBsXG4gIDs7XG5cbiAgbGV0IGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSBsID1cbiAgICBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIGxcbiAgOztcblxuICBsZXQgY3JlYXRlX3dpdGhfa2V5ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsID1cbiAgICBjcmVhdGVfd2l0aF9rZXkgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSB+Z2V0X2tleSBsXG4gIDs7XG5cbiAgbGV0IGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbCA9XG4gICAgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgfmdldF9rZXkgbFxuICA7O1xuXG4gIGxldCBjcmVhdGVfd2l0aF9rZXlfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsID1cbiAgICBjcmVhdGVfd2l0aF9rZXlfZXhuID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgfmdldF9rZXkgbFxuICA7O1xuXG4gIGxldCBncm91cCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIGwgPVxuICAgIGdyb3VwID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIGxcbiAgOztcbmVuZFxuXG5tb2R1bGUgUG9seSA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuICB0eXBlICdhIGtleSA9ICdhXG5cbiAgbGV0IGhhc2hhYmxlID0gSGFzaGFibGUucG9seVxuXG4gIGluY2x1ZGUgQ3JlYXRvcnMgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcblxuICAgICAgbGV0IGhhc2hhYmxlID0gaGFzaGFibGVcbiAgICBlbmQpXG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnNcblxuICBsZXQgc2V4cF9vZl90ID0gc2V4cF9vZl90XG4gIGxldCB0X3NleHBfZ3JhbW1hciA9IHRfc2V4cF9ncmFtbWFyXG5lbmRcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IENyZWF0b3JzX2dlbmVyaWNcbiAgbW9kdWxlIHR5cGUgSGFzaGFibGUgPSBIYXNoYWJsZS5IYXNoYWJsZVxuXG4gIHR5cGUgbm9ucmVjICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlID1cbiAgICAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuXG4gIGxldCBoYXNoYWJsZSB0ID0gdC5oYXNoYWJsZVxuZW5kXG5cbmxldCBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gPVxuICBjcmVhdGUgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplICgpXG47O1xuXG5sZXQgb2ZfYWxpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIG9mX2FsaXN0IH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsXG47O1xuXG5sZXQgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGxcbjs7XG5cbmxldCBvZl9hbGlzdF9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgb2ZfYWxpc3Rfb3JfZXJyb3Igfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGxcbjs7XG5cbmxldCBvZl9hbGlzdF9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIG9mX2FsaXN0X2V4biB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbFxuOztcblxubGV0IG9mX2FsaXN0X211bHRpID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBvZl9hbGlzdF9tdWx0aSB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbFxuOztcblxubGV0IGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gfmdldF9rZXkgfmdldF9kYXRhIGwgPVxuICBjcmVhdGVfbWFwcGVkIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgbFxuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSB+Z2V0X2tleSBsID1cbiAgY3JlYXRlX3dpdGhfa2V5IH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIH5nZXRfa2V5IGwgPVxuICBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3Igfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGxcbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXlfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIH5nZXRfa2V5IGwgPVxuICBjcmVhdGVfd2l0aF9rZXlfZXhuIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsXG47O1xuXG5sZXQgZ3JvdXAgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIGwgPVxuICBncm91cCB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIGxcbjs7XG5cbmxldCBoYXNoYWJsZV9zIHQgPSBIYXNoYWJsZS50b19rZXkgdC5oYXNoYWJsZVxuXG5tb2R1bGUgTSAoSyA6IFQuVCkgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgJ3YgdCA9IChLLnQsICd2KSB0XG5lbmRcblxubW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgdmFsIHRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0XG5cbiAgW0BAQGVuZF1cblxuICBpbmNsdWRlIEtleS5TIHdpdGggdHlwZSB0IDo9IHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxuXG5sZXQgc2V4cF9vZl9tX190ICh0eXBlIGspIChtb2R1bGUgSyA6IFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9IGspIHNleHBfb2ZfdiB0ID1cbiAgc2V4cF9vZl90IEsuc2V4cF9vZl90IHNleHBfb2ZfdiB0XG47O1xuXG5sZXQgbV9fdF9vZl9zZXhwICh0eXBlIGspIChtb2R1bGUgSyA6IE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9IGspIHZfb2Zfc2V4cCBzZXhwID1cbiAgdF9vZl9zZXhwIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IChtb2R1bGUgSykpIEsudF9vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwXG47O1xuXG5sZXQgbV9fdF9zZXhwX2dyYW1tYXIgKHR5cGUgaykgKG1vZHVsZSBLIDogTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSBrKSB2X2dyYW1tYXIgPVxuICB0X3NleHBfZ3JhbW1hciBLLnRfc2V4cF9ncmFtbWFyIHZfZ3JhbW1hclxuOztcblxubGV0IGVxdWFsX21fX3QgKG1vZHVsZSBfIDogRXF1YWxfbSkgZXF1YWxfdiB0MSB0MiA9IGVxdWFsIGVxdWFsX3YgdDEgdDJcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBIYXNoX3NldF9pbnRmXG5cbmxldCBoYXNoYWJsZV9zID0gSGFzaHRibC5oYXNoYWJsZV9zXG5sZXQgaGFzaGFibGUgPSBIYXNodGJsLlByaXZhdGUuaGFzaGFibGVcbmxldCBwb2x5X2hhc2hhYmxlID0gSGFzaHRibC5Qb2x5Lmhhc2hhYmxlXG5sZXQgd2l0aF9yZXR1cm4gPSBXaXRoX3JldHVybi53aXRoX3JldHVyblxuXG50eXBlICdhIHQgPSAoJ2EsIHVuaXQpIEhhc2h0YmwudFxudHlwZSAnYSBoYXNoX3NldCA9ICdhIHRcbnR5cGUgJ2EgZWx0ID0gJ2FcblxubW9kdWxlIEFjY2Vzc29ycyA9IHN0cnVjdFxuICBsZXQgaGFzaGFibGUgPSBoYXNoYWJsZVxuICBsZXQgY2xlYXIgPSBIYXNodGJsLmNsZWFyXG4gIGxldCBsZW5ndGggPSBIYXNodGJsLmxlbmd0aFxuICBsZXQgbWVtID0gSGFzaHRibC5tZW1cbiAgbGV0IGlzX2VtcHR5IHQgPSBIYXNodGJsLmlzX2VtcHR5IHRcblxuICBsZXQgZmluZF9tYXAgdCB+ZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICBIYXNodGJsLml0ZXJfa2V5cyB0IH5mOihmdW4gZWx0IC0+XG4gICAgICAgIG1hdGNoIGYgZWx0IHdpdGhcbiAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgIHwgU29tZSBfIGFzIG8gLT4gci5yZXR1cm4gbyk7XG4gICAgICBOb25lKVxuICA7O1xuXG4gIGxldCBmaW5kIHQgfmYgPSBmaW5kX21hcCB0IH5mOihmdW4gYSAtPiBpZiBmIGEgdGhlbiBTb21lIGEgZWxzZSBOb25lKVxuICBsZXQgYWRkIHQgayA9IEhhc2h0Ymwuc2V0IHQgfmtleTprIH5kYXRhOigpXG5cbiAgbGV0IHN0cmljdF9hZGQgdCBrID1cbiAgICBpZiBtZW0gdCBrXG4gICAgdGhlbiBPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJlbGVtZW50IGFscmVhZHkgZXhpc3RzXCJcbiAgICBlbHNlIChcbiAgICAgIEhhc2h0Ymwuc2V0IHQgfmtleTprIH5kYXRhOigpO1xuICAgICAgUmVzdWx0Lk9rICgpKVxuICA7O1xuXG4gIGxldCBzdHJpY3RfYWRkX2V4biB0IGsgPSBPcl9lcnJvci5va19leG4gKHN0cmljdF9hZGQgdCBrKVxuICBsZXQgcmVtb3ZlID0gSGFzaHRibC5yZW1vdmVcblxuICBsZXQgc3RyaWN0X3JlbW92ZSB0IGsgPVxuICAgIGlmIG1lbSB0IGtcbiAgICB0aGVuIChcbiAgICAgIHJlbW92ZSB0IGs7XG4gICAgICBSZXN1bHQuT2sgKCkpXG4gICAgZWxzZSBPcl9lcnJvci5lcnJvciBcImVsZW1lbnQgbm90IGluIHNldFwiIGsgKEhhc2h0Ymwuc2V4cF9vZl9rZXkgdClcbiAgOztcblxuICBsZXQgc3RyaWN0X3JlbW92ZV9leG4gdCBrID0gT3JfZXJyb3Iub2tfZXhuIChzdHJpY3RfcmVtb3ZlIHQgaylcbiAgbGV0IGZvbGQgdCB+aW5pdCB+ZiA9IEhhc2h0YmwuZm9sZCB0IH5pbml0IH5mOihmdW4gfmtleSB+ZGF0YTooKSBhY2MgLT4gZiBhY2Mga2V5KVxuICBsZXQgaXRlciB0IH5mID0gSGFzaHRibC5pdGVyX2tleXMgdCB+ZlxuICBsZXQgY291bnQgdCB+ZiA9IENvbnRhaW5lci5jb3VudCB+Zm9sZCB0IH5mXG4gIGxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcbiAgbGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbiAgbGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcbiAgbGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgdFxuICBsZXQgdG9fbGlzdCA9IEhhc2h0Ymwua2V5c1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9lIHQgPVxuICAgIHNleHBfb2ZfbGlzdCBzZXhwX29mX2UgKHRvX2xpc3QgdCB8PiBMaXN0LnNvcnQgfmNvbXBhcmU6KGhhc2hhYmxlIHQpLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IHRvX2FycmF5IHQgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICAgIGxldCBpbmRleCA9IHJlZiAobGVuIC0gMSkgaW5cbiAgICBmb2xkIHQgfmluaXQ6W3x8XSB+ZjooZnVuIGFjYyBrZXkgLT5cbiAgICAgIGlmIEFycmF5Lmxlbmd0aCBhY2MgPSAwXG4gICAgICB0aGVuIEFycmF5LmNyZWF0ZSB+bGVuIGtleVxuICAgICAgZWxzZSAoXG4gICAgICAgIGluZGV4IDo9ICFpbmRleCAtIDE7XG4gICAgICAgIGFjYy4oIWluZGV4KSA8LSBrZXk7XG4gICAgICAgIGFjYykpXG4gIDs7XG5cbiAgbGV0IGV4aXN0cyB0IH5mID0gSGFzaHRibC5leGlzdHNpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOigpIC0+IGYga2V5KVxuICBsZXQgZm9yX2FsbCB0IH5mID0gbm90IChIYXNodGJsLmV4aXN0c2kgdCB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgLT4gbm90IChmIGtleSkpKVxuICBsZXQgZXF1YWwgdDEgdDIgPSBIYXNodGJsLmVxdWFsIChmdW4gKCkgKCkgLT4gdHJ1ZSkgdDEgdDJcbiAgbGV0IGNvcHkgdCA9IEhhc2h0YmwuY29weSB0XG4gIGxldCBmaWx0ZXIgdCB+ZiA9IEhhc2h0YmwuZmlsdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YTooKSAtPiBmIGtleSlcbiAgbGV0IHVuaW9uIHQxIHQyID0gSGFzaHRibC5tZXJnZSB0MSB0MiB+ZjooZnVuIH5rZXk6XyBfIC0+IFNvbWUgKCkpXG4gIGxldCBkaWZmIHQxIHQyID0gZmlsdGVyIHQxIH5mOihmdW4ga2V5IC0+IG5vdCAoSGFzaHRibC5tZW0gdDIga2V5KSlcblxuICBsZXQgaW50ZXIgdDEgdDIgPVxuICAgIGxldCBzbWFsbGVyLCBsYXJnZXIgPSBpZiBsZW5ndGggdDEgPiBsZW5ndGggdDIgdGhlbiB0MiwgdDEgZWxzZSB0MSwgdDIgaW5cbiAgICBIYXNodGJsLmZpbHRlcmkgc21hbGxlciB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgLT4gSGFzaHRibC5tZW0gbGFyZ2VyIGtleSlcbiAgOztcblxuICBsZXQgZmlsdGVyX2lucGxhY2UgdCB+ZiA9XG4gICAgbGV0IHRvX3JlbW92ZSA9IGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIGFjIHggLT4gaWYgZiB4IHRoZW4gYWMgZWxzZSB4IDo6IGFjKSBpblxuICAgIExpc3QuaXRlciB0b19yZW1vdmUgfmY6KGZ1biB4IC0+IHJlbW92ZSB0IHgpXG4gIDs7XG5cbiAgbGV0IG9mX2hhc2h0Ymxfa2V5cyBoYXNodGJsID0gSGFzaHRibC5tYXAgaGFzaHRibCB+ZjppZ25vcmVcbiAgbGV0IHRvX2hhc2h0YmwgdCB+ZiA9IEhhc2h0YmwubWFwaSB0IH5mOihmdW4gfmtleSB+ZGF0YTooKSAtPiBmIGtleSlcbmVuZFxuXG5pbmNsdWRlIEFjY2Vzc29yc1xuXG5sZXQgY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtID0gSGFzaHRibC5jcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIG1cblxubGV0IG9mX2xpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIGxldCBzaXplID1cbiAgICBtYXRjaCBzaXplIHdpdGhcbiAgICB8IFNvbWUgeCAtPiB4XG4gICAgfCBOb25lIC0+IExpc3QubGVuZ3RoIGxcbiAgaW5cbiAgbGV0IHQgPSBIYXNodGJsLmNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgfnNpemUgbSBpblxuICBMaXN0Lml0ZXIgbCB+ZjooZnVuIGsgLT4gYWRkIHQgayk7XG4gIHRcbjs7XG5cbmxldCB0X29mX3NleHAgbSBlX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IFNleHAuQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJIYXNoX3NldC50X29mX3NleHAgcmVxdWlyZXMgYSBsaXN0XCIgc2V4cFxuICB8IFNleHAuTGlzdCBsaXN0IC0+XG4gICAgbGV0IHQgPSBjcmVhdGUgbSB+c2l6ZTooTGlzdC5sZW5ndGggbGlzdCkgaW5cbiAgICBMaXN0Lml0ZXIgbGlzdCB+ZjooZnVuIHNleHAgLT5cbiAgICAgIGxldCBlID0gZV9vZl9zZXhwIHNleHAgaW5cbiAgICAgIG1hdGNoIHN0cmljdF9hZGQgdCBlIHdpdGhcbiAgICAgIHwgT2sgKCkgLT4gKClcbiAgICAgIHwgRXJyb3IgXyAtPiBvZl9zZXhwX2Vycm9yIFwiSGFzaF9zZXQudF9vZl9zZXhwIGdvdCBhIGR1cGxpY2F0ZSBlbGVtZW50XCIgc2V4cCk7XG4gICAgdFxuOztcblxubW9kdWxlIENyZWF0b3JzIChFbHQgOiBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBoYXNoYWJsZSA6ICdhIHQgSGFzaGFibGUudFxuICBlbmQpIDogc2lnXG4gIHZhbCB0X29mX3NleHAgOiAoU2V4cC50IC0+ICdhIEVsdC50KSAtPiBTZXhwLnQgLT4gJ2EgRWx0LnQgdFxuXG4gIGluY2x1ZGVcbiAgICBDcmVhdG9yc19nZW5lcmljXG4gICAgd2l0aCB0eXBlICdhIHQgOj0gJ2EgRWx0LnQgdFxuICAgIHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgRWx0LnRcbiAgICB3aXRoIHR5cGUgKCdlbHQsICd6KSBjcmVhdGVfb3B0aW9ucyA6PVxuICAgICAgKCdlbHQsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuZW5kID0gc3RydWN0XG4gIGxldCBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplICgpID1cbiAgICBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplIChIYXNoYWJsZS50b19rZXkgRWx0Lmhhc2hhYmxlKVxuICA7O1xuXG4gIGxldCBvZl9saXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID1cbiAgICBvZl9saXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSAoSGFzaGFibGUudG9fa2V5IEVsdC5oYXNoYWJsZSkgbFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgZV9vZl9zZXhwIHNleHAgPSB0X29mX3NleHAgKEhhc2hhYmxlLnRvX2tleSBFbHQuaGFzaGFibGUpIGVfb2Zfc2V4cCBzZXhwXG5lbmRcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2EgaGFzaF9zZXRcbiAgdHlwZSAnYSBlbHQgPSAnYVxuXG4gIGxldCBoYXNoYWJsZSA9IHBvbHlfaGFzaGFibGVcblxuICBpbmNsdWRlIENyZWF0b3JzIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG5cbiAgICAgIGxldCBoYXNoYWJsZSA9IGhhc2hhYmxlXG4gICAgZW5kKVxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IHNleHBfb2ZfdCA9IHNleHBfb2ZfdFxuICBsZXQgdF9zZXhwX2dyYW1tYXIgZ3JhbW1hciA9IFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKExpc3QudF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbmVuZFxuXG5tb2R1bGUgTSAoRWx0IDogVC5UKSA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyB0ID0gRWx0LnQgdFxuZW5kXG5cbmxldCBzZXhwX29mX21fX3QgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9IGVsdCkgdCA9XG4gIHNleHBfb2ZfdCBFbHQuc2V4cF9vZl90IHRcbjs7XG5cbmxldCBtX190X29mX3NleHAgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9IGVsdCkgc2V4cCA9XG4gIHRfb2Zfc2V4cCAobW9kdWxlIEVsdCkgRWx0LnRfb2Zfc2V4cCBzZXhwXG47O1xuXG5sZXQgbV9fdF9zZXhwX2dyYW1tYXIgKHR5cGUgZWx0KSAobW9kdWxlIEVsdCA6IE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gZWx0KSA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKGxpc3Rfc2V4cF9ncmFtbWFyIEVsdC50X3NleHBfZ3JhbW1hcilcbjs7XG5cbmxldCBlcXVhbF9tX190IChtb2R1bGUgXyA6IEVxdWFsX20pIHQxIHQyID0gZXF1YWwgdDEgdDJcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbGV0IGhhc2hhYmxlID0gSGFzaHRibC5Qcml2YXRlLmhhc2hhYmxlXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgUHJpbnRmXG5tb2R1bGUgQnl0ZXMgPSBCeXRlczBcbmluY2x1ZGUgRmxvYXQwXG5cbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBmbG9hdCBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfZmxvYXRcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2Zsb2F0IGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChmbG9hdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9mbG9hdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBmbG9hdF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGNvbXBhcmUgPSBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuY29tcGFyZVxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4gRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgdG9fZmxvYXQgeCA9IHhcbmxldCBvZl9mbG9hdCB4ID0geFxuXG5sZXQgb2Zfc3RyaW5nIHMgPVxuICB0cnkgZmxvYXRfb2Zfc3RyaW5nIHMgd2l0aFxuICB8IF8gLT4gaW52YWxpZF9hcmdmIFwiRmxvYXQub2Zfc3RyaW5nICVzXCIgcyAoKVxuOztcblxuZXh0ZXJuYWwgZm9ybWF0X2Zsb2F0IDogc3RyaW5nIC0+IGZsb2F0IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfZmxvYXRcIlxuXG4oKiBTdG9sZW4gZnJvbSBbcGVydmFzaXZlcy5tbF0uICBBZGRzIGEgXCIuXCIgYXQgdGhlIGVuZCBpZiBuZWVkZWQuICBJdCBpcyBpblxuICAgW3BlcnZhc2l2ZXMubWxpXSwgYnV0IGl0IGFsc28gc2F5cyBub3QgdG8gdXNlIGl0IGRpcmVjdGx5LCBzbyB3ZSBjb3B5IGFuZCBwYXN0ZSB0aGVcbiAgIGNvZGUuIEl0IG1ha2VzIHRoZSBhc3N1bXB0aW9uIG9uIHRoZSBzdHJpbmcgcGFzc2VkIGluIGFyZ3VtZW50IHRoYXQgaXQgd2FzIHJldHVybmVkIGJ5XG4gICBbZm9ybWF0X2Zsb2F0XS4gKilcbmxldCB2YWxpZF9mbG9hdF9sZXhlbSBzID1cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIGkgbFxuICAgIHRoZW4gcyBeIFwiLlwiXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgfCAnLScgLT4gbG9vcCAoaSArIDEpXG4gICAgICB8IF8gLT4gcylcbiAgaW5cbiAgbG9vcCAwXG47O1xuXG4oKiBMZXQgW3ldIGJlIGEgcG93ZXIgb2YgMi4gIFRoZW4gdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdCBpczpcbiAgIFt6ID0geSAqICgxICsgMiAqKiAtNTIpXVxuICAgYW5kIHRoZSBwcmV2aW91cyBvbmUgaXNcbiAgIFt4ID0geSAqICgxIC0gMiAqKiAtNTMpXVxuXG4gICBJbiBnZW5lcmFsLCBldmVyeSB0d28gYWRqYWNlbnQgZmxvYXRzIGFyZSB3aXRoaW4gYSBmYWN0b3Igb2YgYmV0d2VlbiBbMSArIDIqKi01M11cbiAgIGFuZCBbMSArIDIqKi01Ml0gZnJvbSBlYWNoIG90aGVyLCB0aGF0IGlzIHdpdGhpbiBbMSArIDEuMWUtMTZdIGFuZCBbMSArIDIuM2UtMTZdLlxuXG4gICBTbyBpZiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIGZsb2F0IHN0YXJ0cyB3aXRoIFwiMVwiLCB0aGVuIGl0cyBhZGphY2VudCBmbG9hdHNcbiAgIHdpbGwgdXN1YWxseSBkaWZmZXIgZnJvbSBpdCBieSAxLCBhbmQgc29tZXRpbWVzIGJ5IDIsIGF0IHRoZSAxN3RoIHNpZ25pZmljYW50IGRpZ2l0XG4gICAoY291bnRpbmcgZnJvbSAxKS5cblxuICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIHN0YXJ0cyB3aXRoIFwiOVwiLCB0aGVuIHRoZSBhZGphY2VudFxuICAgZmxvYXRzIHdpbGwgYmUgb2ZmIGJ5IG5vIG1vcmUgdGhhbiAyMyBhdCB0aGUgMTZ0aCBhbmQgMTd0aCBzaWduaWZpY2FudCBkaWdpdHMuXG5cbiAgIEUuZy46XG5cbiAgIHt2XG4gICAgICMgc3ByaW50ZiBcIiUuMTdnXCIgKDEwMjQuICouICgxLiAtLiAyLioqICgtNTMuKSkpOztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExMTExMTFcbiAgICAgICAgICAgICAgICAgICAxMjM0IDU2Nzg5MDEyMzQ1NjdcbiAgICAgLSA6IHN0cmluZyA9IFwiMTAyMy45OTk5OTk5OTk5OTk5XCJcbiAgIHZ9XG4gICBQcmludGluZyBhIGNvdXBsZSBvZiBleHRyYSBkaWdpdHMgcmV2ZWFscyB0aGF0IHRoZSBkaWZmZXJlbmNlIGluZGVlZCBpcyByb3VnaGx5IDExIGF0XG4gICBkaWdpdHMgMTd0aCBhbmQgMTh0aCAodGhhdCBpcywgMTN0aCBhbmQgMTR0aCBhZnRlciBcIi5cIik6XG5cbiAgIHt2XG4gICAgICMgc3ByaW50ZiBcIiUuMTlnXCIgKDEwMjQuICouICgxLiAtLiAyLioqICgtNTMuKSkpOztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExMTExMTExMVxuICAgICAgICAgICAgICAgICAgIDEyMzQgNTY3ODkwMTIzNDU2Nzg5XG4gICAgIC0gOiBzdHJpbmcgPSBcIjEwMjMuOTk5OTk5OTk5OTk5ODg2XCJcbiAgIHZ9XG5cbiAgIFRoZSB1bHAgKHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWRqYWNlbnQgZmxvYXRzKSBpcyB0d2ljZSBhcyBiaWcgb24gdGhlIG90aGVyIHNpZGUgb2ZcbiAgIDEwMjQuOlxuXG4gICB7dlxuICAgICAjIHNwcmludGYgXCIlLjE5Z1wiICgxMDI0LiAqLiAoMS4gKy4gMi4qKiAoLTUyLikpKTs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTExMTExMTFcbiAgICAgICAgICAgICAgICAgICAxMjM0IDU2Nzg5MDEyMzQ1Njc4OVxuICAgICAtIDogc3RyaW5nID0gXCIxMDI0LjAwMDAwMDAwMDAwMDIyN1wiXG4gICB2fVxuXG4gICBOb3cgdGFrZSBhIHBvd2VyIG9mIDIgd2hpY2ggc3RhcnRzIHdpdGggOTk6XG5cbiAgIHt2XG4gICAgICMgMi4qKjkzLiA7O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMTExXG4gICAgICAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2NzhcbiAgICAgLSA6IGZsb2F0ID0gOS45MDM1MjAzMTQyODMwNDIyZSsyN1xuXG4gICAgICMgMi4qKjkzLiAqLiAoMS4gKy4gMi4qKiAoLTUyLikpOztcbiAgICAgLSA6IGZsb2F0ID0gOS45MDM1MjAzMTQyODMwNDQ0ZSsyN1xuXG4gICAgICMgMi4qKjkzLiAqLiAoMS4gLS4gMi4qKiAoLTUzLikpOztcbiAgICAgLSA6IGZsb2F0ID0gOS45MDM1MjAzMTQyODMwNDExZSsyN1xuICAgdn1cblxuICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyKio5MyBhbmQgaXRzIHR3byBuZWlnaGJvcnMgaXMgc2xpZ2h0bHkgbW9yZSB0aGFuLCByZXNwZWN0aXZlbHksXG4gICAxIGFuZCAyIGF0IHNpZ25pZmljYW50IGRpZ2l0IDE2LlxuXG4gICBUaG9zZSBleGFtcGxlcyBzaG93IHRoYXQ6XG4gICAtIDE3IHNpZ25pZmljYW50IGRpZ2l0cyBpcyBhbHdheXMgc3VmZmljaWVudCB0byByZXByZXNlbnQgYSBmbG9hdCB3aXRob3V0IGFtYmlndWl0eVxuICAgLSAxNXRoIHNpZ25pZmljYW50IGRpZ2l0IGNhbiBhbHdheXMgYmUgcmVwcmVzZW50ZWQgYWNjdXJhdGVseVxuICAgLSBjb252ZXJ0aW5nIGEgZGVjaW1hbCBudW1iZXIgd2l0aCAxNiBzaWduaWZpY2FudCBkaWdpdHMgdG8gaXRzIG5lYXJlc3QgZmxvYXQgYW5kIGJhY2tcbiAgICAgY2FuIGNoYW5nZSB0aGUgbGFzdCBkZWNpbWFsIGRpZ2l0IGJ5IG5vIG1vcmUgdGhhbiAxXG5cbiAgIFRvIG1ha2Ugc3VyZSB0aGF0IGZsb2F0cyBvYnRhaW5lZCBieSBjb252ZXJzaW9uIGZyb20gZGVjaW1hbCBmcmFjdGlvbnMgKGUuZy4gXCIzLjE0XCIpXG4gICBhcmUgcHJpbnRlZCB3aXRob3V0IHRyYWlsaW5nIG5vbi16ZXJvIGRpZ2l0cywgb25lIHNob3VsZCBjaG9vc2UgdGhlIGZpcnN0IGFtb25nIHRoZVxuICAgJyUuMTVnJywgJyUuMTZnJywgYW5kICclLjE3ZycgcmVwcmVzZW50YXRpb25zIHdoaWNoIGRvZXMgcm91bmQtdHJpcDpcblxuICAge3ZcbiAgICAgIyBzcHJpbnRmIFwiJS4xNWdcIiAzLjE0OztcbiAgICAgLSA6IHN0cmluZyA9IFwiMy4xNFwiICAgICAgICAgICAgICAgICAgICAgKCogcGljayB0aGlzIG9uZSAqKVxuICAgICAjIHNwcmludGYgXCIlLjE2Z1wiIDMuMTQ7O1xuICAgICAtIDogc3RyaW5nID0gXCIzLjE0XCJcbiAgICAgIyBzcHJpbnRmIFwiJS4xN2dcIiAzLjE0OztcbiAgICAgLSA6IHN0cmluZyA9IFwiMy4xNDAwMDAwMDAwMDAwMDAxXCIgICAgICAgKCogZG8gbm90IHBpY2sgdGhpcyBvbmUgKilcblxuICAgICAjIHNwcmludGYgXCIlLjE1Z1wiIDguMDAwMDAwMDAwMDAwMDAyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOFwiICAgICAgICAgICAgICAgICAgICAgICAgKCogZG8gbm90IHBpY2sgdGhpcyBvbmUtLWRvZXMgbm90IHJvdW5kLXRyaXAgKilcbiAgICAgIyBzcHJpbnRmIFwiJS4xNmdcIiA4LjAwMDAwMDAwMDAwMDAwMjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjguMDAwMDAwMDAwMDAwMDAyXCIgICAgICAgICgqIHByZWZlciB0aGlzIG9uZSAqKVxuICAgICAjIHNwcmludGYgXCIlLjE3Z1wiIDguMDAwMDAwMDAwMDAwMDAyOztcbiAgICAgLSA6IHN0cmluZyA9IFwiOC4wMDAwMDAwMDAwMDAwMDE4XCIgICAgICAgKCogdGhpcyBvbmUgaGFzIG9uZSBkaWdpdCBvZiBqdW5rIGF0IHRoZSBlbmQgKilcbiAgIHZ9XG5cbiAgIFNraXBwaW5nIHRoZSAnJS4xNmcnIGluIHRoZSBhYm92ZSBwcm9jZWR1cmUgc2F2ZXMgdXMgc29tZSB0aW1lLCBidXQgaXQgbWVhbnMgdGhhdCwgYXNcbiAgIHNlZW4gaW4gdGhlIHNlY29uZCBleGFtcGxlIGFib3ZlLCBvY2Nhc2lvbmFsbHkgbnVtYmVycyB3aXRoIGV4YWN0bHkgMTYgc2lnbmlmaWNhbnRcbiAgIGRpZ2l0cyB3aWxsIGhhdmUgYW4gZXJyb3IgaW50cm9kdWNlZCBhdCB0aGUgMTd0aCBkaWdpdC4gIFRoYXQgaXMgcHJvYmFibHkgT0sgZm9yXG4gICB0eXBpY2FsIHVzZSwgYmVjYXVzZSBhIG51bWJlciB3aXRoIDE2IHNpZ25pZmljYW50IGRpZ2l0cyBpcyBcInVnbHlcIiBhbHJlYWR5LiAgQWRkaW5nIG9uZVxuICAgbW9yZSBkb2Vzbid0IG1ha2UgaXQgbXVjaCB3b3JzZSBmb3IgYSBodW1hbiByZWFkZXIuXG5cbiAgIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBjYW5ub3Qgc2tpcCAnJS4xNWcnIGFuZCBvbmx5IGxvb2sgYXQgJyUuMTZnJyBhbmQgJyUuMTdnJywgc2luY2VcbiAgIHRoZSBpbmFjY3VyYWN5IGF0IHRoZSAxNnRoIGRpZ2l0IG1pZ2h0IGludHJvZHVjZSB0aGUgbm9pc2Ugd2Ugd2FudCB0byBhdm9pZDpcblxuICAge3ZcbiAgICAgIyBzcHJpbnRmIFwiJS4xNWdcIiA5Ljk5Mjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjkuOTkyXCIgICAgICAgICAgICAgICAgICAgICgqIHBpY2sgdGhpcyBvbmUgKilcbiAgICAgIyBzcHJpbnRmIFwiJS4xNmdcIiA5Ljk5Mjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjkuOTkyMDAwMDAwMDAwMDAxXCIgICAgICAgICgqIGRvIG5vdCBwaWNrIHRoaXMgb25lLS1qdW5rIGF0IHRoZSBlbmQgKilcbiAgICAgIyBzcHJpbnRmIFwiJS4xN2dcIiA5Ljk5Mjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjkuOTkyMDAwMDAwMDAwMDAwOVwiXG4gICB2fVxuKilcbmxldCB0b19zdHJpbmcgeCA9XG4gIHZhbGlkX2Zsb2F0X2xleGVtXG4gICAgKGxldCB5ID0gZm9ybWF0X2Zsb2F0IFwiJS4xNWdcIiB4IGluXG4gICAgIGlmIGZsb2F0X29mX3N0cmluZyB5ID0geCB0aGVuIHkgZWxzZSBmb3JtYXRfZmxvYXQgXCIlLjE3Z1wiIHgpXG47O1xuXG5sZXQgbWF4X3ZhbHVlID0gaW5maW5pdHlcbmxldCBtaW5fdmFsdWUgPSBuZWdfaW5maW5pdHlcbmxldCBtaW5fcG9zaXRpdmVfc3Vibm9ybWFsX3ZhbHVlID0gMi4gKiogLTEwNzQuXG5sZXQgbWluX3Bvc2l0aXZlX25vcm1hbF92YWx1ZSA9IDIuICoqIC0xMDIyLlxubGV0IHplcm8gPSAwLlxubGV0IG9uZSA9IDEuXG5sZXQgbWludXNfb25lID0gLTEuXG5sZXQgcGkgPSAweDMuMjQzRjZBODg4NUEzMDhEMzEzMTk4QTJFMDM3MDczXG5sZXQgc3FydF9waSA9IDB4MS5DNUJGODkxQjRFRjZBQTc5QzNCMDUyMEQ1REI5MzhcbmxldCBzcXJ0XzJwaSA9IDB4Mi44MUIyNjNGRUM0RTBCMkNBRjk0ODNGNUNFNDU5RENcbmxldCBldWxlciA9IDB4MC45M0M0NjdFMzdEQjBDN0E0RDFCRTNGODEwMTUyQ0JcbmxldCBvZl9pbnQgPSBJbnQudG9fZmxvYXRcbmxldCB0b19pbnQgPSBJbnQub2ZfZmxvYXRcbmxldCBvZl9pbnQ2MyBpID0gSW50NjMudG9fZmxvYXQgaVxubGV0IG9mX2ludDY0IGkgPSBDYW1sLkludDY0LnRvX2Zsb2F0IGlcbmxldCB0b19pbnQ2NCA9IENhbWwuSW50NjQub2ZfZmxvYXRcbmxldCBpcm91bmRfbGJvdW5kID0gbG93ZXJfYm91bmRfZm9yX2ludCBJbnQubnVtX2JpdHNcbmxldCBpcm91bmRfdWJvdW5kID0gdXBwZXJfYm91bmRfZm9yX2ludCBJbnQubnVtX2JpdHNcblxuKCogVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBcImV4blwiIHJvdW5kaW5nIGZ1bmN0aW9ucyBpcyBpbXBvcnRhbnQsIHNvIHRoZXkgYXJlIHdyaXR0ZW5cbiAgIG91dCBzZXBhcmF0ZWx5LCBhbmQgdHVuZWQgaW5kaXZpZHVhbGx5LiAgKFdlIGNvdWxkIGhhdmUgdGhlIG9wdGlvbiB2ZXJzaW9ucyBjYWxsXG4gICB0aGUgXCJleG5cIiB2ZXJzaW9ucywgYnV0IHRoYXQgaW1wb3NlcyBhcmd1YWJseSBncmF0dWl0b3VzIG92ZXJoZWFkLS0tZXNwZWNpYWxseVxuICAgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcHR1cmUgb2YgYmFja3RyYWNlcyBpcyBlbmFibGVkIHVwb24gXCJ3aXRoXCItLS1hbmQgdGhhdCBzZWVtc1xuICAgbm90IHdvcnRoIGl0IHdoZW4gY29tcGFyZWQgdG8gdGhlIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50IG9mIGNvZGUgZHVwbGljYXRpb24uKSAqKVxuXG4oKiBFcnJvciByZXBvcnRpbmcgYmVsb3cgaXMgdmVyeSBjYXJlZnVsbHkgYXJyYW5nZWQgc28gdGhhdCwgZS5nLiwgW2lyb3VuZF9uZWFyZXN0X2V4bl1cbiAgIGl0c2VsZiBjYW4gYmUgaW5saW5lZCBpbnRvIGNhbGxlcnMgc3VjaCB0aGF0IHRoZXkgZG9uJ3QgbmVlZCB0byBhbGxvY2F0ZSBhIGJveCBmb3IgdGhlXG4gICBbZmxvYXRdIGFyZ3VtZW50LiAgVGhpcyBpcyBkb25lIHdpdGggYSBib3ggW2JveF0gZnVuY3Rpb24gY2FyZWZ1bGx5IGNob3NlbiB0byBhbGxvdyB0aGVcbiAgIGNvbXBpbGVyIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGJveCBmb3IgdGhlIGZsb2F0IG9ubHkgaW4gZXJyb3IgY2FzZXMuICBTZWUsIGUuZy4sXG4gICBbLi4vLi4vemVyby90ZXN0L3ByaWNlX3Rlc3QubWxdIGZvciBhIG1lY2hhbmljYWwgdGVzdCBvZiB0aGlzIHByb3BlcnR5IHdoZW4gYnVpbGRpbmdcbiAgIHdpdGggW1hfTElCUkFSWV9JTkxJTklORz10cnVlXS4gKilcblxubGV0IGlyb3VuZF91cCB0ID1cbiAgaWYgdCA+IDAuMFxuICB0aGVuIChcbiAgICBsZXQgdCcgPSBjZWlsIHQgaW5cbiAgICBpZiB0JyA8PSBpcm91bmRfdWJvdW5kIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0JykgZWxzZSBOb25lKVxuICBlbHNlIGlmIHQgPj0gaXJvdW5kX2xib3VuZFxuICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdClcbiAgZWxzZSBOb25lXG47O1xuXG5sZXRbQG9jYW1sLmlubGluZSBhbHdheXNdIGlyb3VuZF91cF9leG4gdCA9XG4gIGlmIHQgPiAwLjBcbiAgdGhlbiAoXG4gICAgbGV0IHQnID0gY2VpbCB0IGluXG4gICAgaWYgdCcgPD0gaXJvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX3VwX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIiAoYm94IHQpICgpKVxuICBlbHNlIGlmIHQgPj0gaXJvdW5kX2xib3VuZFxuICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF91cF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiIChib3ggdCkgKClcbjs7XG5cbmxldCBpcm91bmRfZG93biB0ID1cbiAgaWYgdCA+PSAwLjBcbiAgdGhlbiBpZiB0IDw9IGlyb3VuZF91Ym91bmQgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQpIGVsc2UgTm9uZVxuICBlbHNlIChcbiAgICBsZXQgdCcgPSBmbG9vciB0IGluXG4gICAgaWYgdCcgPj0gaXJvdW5kX2xib3VuZCB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCcpIGVsc2UgTm9uZSlcbjs7XG5cbmxldFtAb2NhbWwuaW5saW5lIGFsd2F5c10gaXJvdW5kX2Rvd25fZXhuIHQgPVxuICBpZiB0ID49IDAuMFxuICB0aGVuXG4gICAgaWYgdCA8PSBpcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9kb3duX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIiAoYm94IHQpICgpXG4gIGVsc2UgKFxuICAgIGxldCB0JyA9IGZsb29yIHQgaW5cbiAgICBpZiB0JyA+PSBpcm91bmRfbGJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZVxuICAgICAgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX2Rvd25fZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIiAoYm94IHQpICgpKVxuOztcblxubGV0IGlyb3VuZF90b3dhcmRzX3plcm8gdCA9XG4gIGlmIHQgPj0gaXJvdW5kX2xib3VuZCAmJiB0IDw9IGlyb3VuZF91Ym91bmRcbiAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQpXG4gIGVsc2UgTm9uZVxuOztcblxubGV0W0BvY2FtbC5pbmxpbmUgYWx3YXlzXSBpcm91bmRfdG93YXJkc196ZXJvX2V4biB0ID1cbiAgaWYgdCA+PSBpcm91bmRfbGJvdW5kICYmIHQgPD0gaXJvdW5kX3Vib3VuZFxuICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICBlbHNlXG4gICAgaW52YWxpZF9hcmdmXG4gICAgICBcIkZsb2F0Lmlyb3VuZF90b3dhcmRzX3plcm9fZXhuOiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKGJveCB0KVxuICAgICAgKClcbjs7XG5cbigqIE91dHNpZGUgb2YgdGhlIHJhbmdlIChyb3VuZF9uZWFyZXN0X2xiLi5yb3VuZF9uZWFyZXN0X3ViKSwgYWxsIHJlcHJlc2VudGFibGUgZG91Ymxlc1xuICAgYXJlIGludGVnZXJzIGluIHRoZSBtYXRoZW1hdGljYWwgc2Vuc2UsIGFuZCBbcm91bmRfbmVhcmVzdF0gc2hvdWxkIGJlIGlkZW50aXR5LlxuXG4gICBIb3dldmVyLCBmb3Igb2RkIG51bWJlcnMgd2l0aCB0aGUgYWJzb2x1dGUgdmFsdWUgYmV0d2VlbiAyKio1MiBhbmQgMioqNTMsIHRoZSBmb3JtdWxhXG4gICBbcm91bmRfbmVhcmVzdCB4ID0gZmxvb3IgKHggKyAwLjUpXSBkb2VzIG5vdCBob2xkOlxuXG4gICB7dlxuICAgICAjIGxldCBuYWl2ZV9yb3VuZF9uZWFyZXN0IHggPSBmbG9vciAoeCArLiAwLjUpOztcbiAgICAgIyBsZXQgeCA9IDIuICoqIDUyLiArLiAxLjs7XG4gICAgIHZhbCB4IDogZmxvYXQgPSA0NTAzNTk5NjI3MzcwNDk3LlxuICAgICAjIG5haXZlX3JvdW5kX25lYXJlc3QgeDs7XG4gICAgIC0gOiAgICAgZmxvYXQgPSA0NTAzNTk5NjI3MzcwNDk4LlxuICAgdn1cbiopXG5cbmxldCByb3VuZF9uZWFyZXN0X2xiID0gLS4oMi4gKiogNTIuKVxubGV0IHJvdW5kX25lYXJlc3RfdWIgPSAyLiAqKiA1Mi5cblxuKCogRm9yIFt4ID0gb25lX3VscCBgRG93biAwLjVdLCB0aGUgZm9ybXVsYSBbZmxvb3IgKHggKy4gMC41KV0gZm9yIHJvdW5kaW5nIHRvIG5lYXJlc3RcbiAgIGRvZXMgbm90IHdvcmssIGJlY2F1c2UgdGhlIGV4YWN0IHJlc3VsdCBpcyBoYWxmd2F5IGJldHdlZW4gW29uZV91bHAgYERvd24gMS5dIGFuZCBbMS5dLFxuICAgYW5kIGl0IGdldHMgcm91bmRlZCB1cCB0byBbMS5dIGR1ZSB0byB0aGUgcm91bmQtdGllcy10by1ldmVuIHJ1bGUuICopXG5sZXQgb25lX3VscF9sZXNzX3RoYW5faGFsZiA9IG9uZV91bHAgYERvd24gMC41XG5cbmxldFtAb2NhbWwuaW5saW5lIGFsd2F5c10gYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdCA9XG4gIHRcbiAgKy5cbiAgaWYgdCA9IG9uZV91bHBfbGVzc190aGFuX2hhbGZcbiAgdGhlbiBvbmVfdWxwX2xlc3NfdGhhbl9oYWxmICgqIHNpbmNlIHQgPCAwLjUsIG1ha2Ugc3VyZSB0aGUgcmVzdWx0IGlzIDwgMS4wICopXG4gIGVsc2UgMC41XG47O1xuXG5sZXQgaXJvdW5kX25lYXJlc3RfMzIgdCA9XG4gIGlmIHQgPj0gMC5cbiAgdGhlbiAoXG4gICAgbGV0IHQnID0gYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdCBpblxuICAgIGlmIHQnIDw9IGlyb3VuZF91Ym91bmQgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnKSBlbHNlIE5vbmUpXG4gIGVsc2UgKFxuICAgIGxldCB0JyA9IGZsb29yICh0ICsuIDAuNSkgaW5cbiAgICBpZiB0JyA+PSBpcm91bmRfbGJvdW5kIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0JykgZWxzZSBOb25lKVxuOztcblxubGV0IGlyb3VuZF9uZWFyZXN0XzY0IHQgPVxuICBpZiB0ID49IDAuXG4gIHRoZW5cbiAgICBpZiB0IDwgcm91bmRfbmVhcmVzdF91YlxuICAgIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCAoYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdCkpXG4gICAgZWxzZSBpZiB0IDw9IGlyb3VuZF91Ym91bmRcbiAgICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdClcbiAgICBlbHNlIE5vbmVcbiAgZWxzZSBpZiB0ID4gcm91bmRfbmVhcmVzdF9sYlxuICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgKGZsb29yICh0ICsuIDAuNSkpKVxuICBlbHNlIGlmIHQgPj0gaXJvdW5kX2xib3VuZFxuICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdClcbiAgZWxzZSBOb25lXG47O1xuXG5sZXQgaXJvdW5kX25lYXJlc3QgPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gaXJvdW5kX25lYXJlc3RfNjRcbiAgfCBXMzIgLT4gaXJvdW5kX25lYXJlc3RfMzJcbjs7XG5cbmxldCBpcm91bmRfbmVhcmVzdF9leG5fMzIgdCA9XG4gIGlmIHQgPj0gMC5cbiAgdGhlbiAoXG4gICAgbGV0IHQnID0gYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdCBpblxuICAgIGlmIHQnIDw9IGlyb3VuZF91Ym91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9uZWFyZXN0X2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIiAoYm94IHQpICgpKVxuICBlbHNlIChcbiAgICBsZXQgdCcgPSBmbG9vciAodCArLiAwLjUpIGluXG4gICAgaWYgdCcgPj0gaXJvdW5kX2xib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX25lYXJlc3RfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbFwiIChib3ggdCkgKCkpXG47O1xuXG5sZXRbQG9jYW1sLmlubGluZSBhbHdheXNdIGlyb3VuZF9uZWFyZXN0X2V4bl82NCB0ID1cbiAgaWYgdCA+PSAwLlxuICB0aGVuXG4gICAgaWYgdCA8IHJvdW5kX25lYXJlc3RfdWJcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgKGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQpXG4gICAgZWxzZSBpZiB0IDw9IGlyb3VuZF91Ym91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICAgIGVsc2UgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX25lYXJlc3RfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBsYXJnZVwiIChib3ggdCkgKClcbiAgZWxzZSBpZiB0ID4gcm91bmRfbmVhcmVzdF9sYlxuICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgKGZsb29yICh0ICsuIDAuNSkpXG4gIGVsc2UgaWYgdCA+PSBpcm91bmRfbGJvdW5kXG4gIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gIGVsc2VcbiAgICBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfbmVhcmVzdF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiIChib3ggdCkgKClcbjs7XG5cbmxldCBpcm91bmRfbmVhcmVzdF9leG4gPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gaXJvdW5kX25lYXJlc3RfZXhuXzY0XG4gIHwgVzMyIC0+IGlyb3VuZF9uZWFyZXN0X2V4bl8zMlxuOztcblxuKCogVGhlIGZvbGxvd2luZyBbaXJvdW5kX2V4bl0gYW5kIFtpcm91bmRdIGZ1bmN0aW9ucyBhcmUgc2xvd2VyIHRoYW4gdGhlIG9uZXMgYWJvdmUuXG4gICBUaGVpciBlcXVpdmFsZW5jZSB0byB0aG9zZSBmdW5jdGlvbnMgaXMgdGVzdGVkIGluIHRoZSB1bml0IHRlc3RzIGJlbG93LiAqKVxuXG5sZXRbQGlubGluZV0gaXJvdW5kX2V4biA/KGRpciA9IGBOZWFyZXN0KSB0ID1cbiAgbWF0Y2ggZGlyIHdpdGhcbiAgfCBgWmVybyAtPiBpcm91bmRfdG93YXJkc196ZXJvX2V4biB0XG4gIHwgYE5lYXJlc3QgLT4gaXJvdW5kX25lYXJlc3RfZXhuIHRcbiAgfCBgVXAgLT4gaXJvdW5kX3VwX2V4biB0XG4gIHwgYERvd24gLT4gaXJvdW5kX2Rvd25fZXhuIHRcbjs7XG5cbmxldCBpcm91bmQgPyhkaXIgPSBgTmVhcmVzdCkgdCA9XG4gIHRyeSBTb21lIChpcm91bmRfZXhuIH5kaXIgdCkgd2l0aFxuICB8IF8gLT4gTm9uZVxuOztcblxubGV0IGlzX2luZiB0ID0gMS4gLy4gdCA9IDAuXG5sZXQgaXNfZmluaXRlIHQgPSB0IC0uIHQgPSAwLlxuXG5sZXQgbWluX2luYW4gKHggOiB0KSB5ID1cbiAgaWYgaXNfbmFuIHkgdGhlbiB4IGVsc2UgaWYgaXNfbmFuIHggdGhlbiB5IGVsc2UgaWYgeCA8IHkgdGhlbiB4IGVsc2UgeVxuOztcblxubGV0IG1heF9pbmFuICh4IDogdCkgeSA9XG4gIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIGlmIHggPiB5IHRoZW4geCBlbHNlIHlcbjs7XG5cbmxldCBhZGQgPSAoICsuIClcbmxldCBzdWIgPSAoIC0uIClcbmxldCBuZWcgPSAoIH4tLiApXG5sZXQgYWJzID0gYWJzX2Zsb2F0XG5sZXQgc2NhbGUgPSAoICouIClcbmxldCBzcXVhcmUgeCA9IHggKi4geFxuXG5tb2R1bGUgUGFydHMgOiBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIGZyYWN0aW9uYWwgOiB0IC0+IGZsb2F0XG4gIHZhbCBpbnRlZ3JhbCA6IHQgLT4gZmxvYXRcbiAgdmFsIG1vZGYgOiBmbG9hdCAtPiB0XG5lbmQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gZmxvYXQgKiBmbG9hdFxuXG4gIGxldCBmcmFjdGlvbmFsIHQgPSBmc3QgdFxuICBsZXQgaW50ZWdyYWwgdCA9IHNuZCB0XG4gIGxldCBtb2RmID0gbW9kZlxuZW5kXG5cbmxldCBtb2RmID0gUGFydHMubW9kZlxubGV0IHJvdW5kX2Rvd24gPSBmbG9vclxubGV0IHJvdW5kX3VwID0gY2VpbFxubGV0IHJvdW5kX3Rvd2FyZHNfemVybyB0ID0gaWYgdCA+PSAwLiB0aGVuIHJvdW5kX2Rvd24gdCBlbHNlIHJvdW5kX3VwIHRcblxuKCogc2VlIHRoZSBjb21tZW50IGFib3ZlIFtyb3VuZF9uZWFyZXN0X2xiXSBhbmQgW3JvdW5kX25lYXJlc3RfdWJdIGZvciBhbiBleHBsYW5hdGlvbiAqKVxubGV0W0BvY2FtbC5pbmxpbmVdIHJvdW5kX25lYXJlc3RfaW5saW5lIHQgPVxuICBpZiB0ID4gcm91bmRfbmVhcmVzdF9sYiAmJiB0IDwgcm91bmRfbmVhcmVzdF91YlxuICB0aGVuIGZsb29yIChhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0KVxuICBlbHNlIHQgKy4gMC5cbjs7XG5cbmxldCByb3VuZF9uZWFyZXN0IHQgPSAocm91bmRfbmVhcmVzdF9pbmxpbmUgW0BvY2FtbC5pbmxpbmVkIGFsd2F5c10pIHRcblxubGV0IHJvdW5kX25lYXJlc3RfaGFsZl90b19ldmVuIHQgPVxuICBpZiB0IDw9IHJvdW5kX25lYXJlc3RfbGIgfHwgdCA+PSByb3VuZF9uZWFyZXN0X3ViXG4gIHRoZW4gdCArLiAwLlxuICBlbHNlIChcbiAgICBsZXQgZmxvb3IgPSBmbG9vciB0IGluXG4gICAgKCogW2NlaWxfb3Jfc3VjYyA9IGlmIHQgaXMgYW4gaW50ZWdlciB0aGVuIHQgKy4gMS4gZWxzZSBjZWlsIHRdLiAgRmFzdGVyIHRoYW4gW2NlaWxdLiAqKVxuICAgIGxldCBjZWlsX29yX3N1Y2MgPSBmbG9vciArLiAxLiBpblxuICAgIGxldCBkaWZmX2Zsb29yID0gdCAtLiBmbG9vciBpblxuICAgIGxldCBkaWZmX2NlaWwgPSBjZWlsX29yX3N1Y2MgLS4gdCBpblxuICAgIGlmIGRpZmZfZmxvb3IgPCBkaWZmX2NlaWxcbiAgICB0aGVuIGZsb29yXG4gICAgZWxzZSBpZiBkaWZmX2Zsb29yID4gZGlmZl9jZWlsXG4gICAgdGhlbiBjZWlsX29yX3N1Y2NcbiAgICBlbHNlIGlmICgqIGV4YWN0IHRpZSwgcGljayB0aGUgZXZlbiAqKVxuICAgICAgbW9kX2Zsb2F0IGZsb29yIDIuID0gMC5cbiAgICB0aGVuIGZsb29yXG4gICAgZWxzZSBjZWlsX29yX3N1Y2MpXG47O1xuXG5sZXQgaW50NjNfcm91bmRfbGJvdW5kID0gbG93ZXJfYm91bmRfZm9yX2ludCBJbnQ2My5udW1fYml0c1xubGV0IGludDYzX3JvdW5kX3Vib3VuZCA9IHVwcGVyX2JvdW5kX2Zvcl9pbnQgSW50NjMubnVtX2JpdHNcblxubGV0IGludDYzX3JvdW5kX3VwX2V4biB0ID1cbiAgaWYgdCA+IDAuMFxuICB0aGVuIChcbiAgICBsZXQgdCcgPSBjZWlsIHQgaW5cbiAgICBpZiB0JyA8PSBpbnQ2M19yb3VuZF91Ym91bmRcbiAgICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2VcbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIkZsb2F0LmludDYzX3JvdW5kX3VwX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIlxuICAgICAgICAoRmxvYXQwLmJveCB0KVxuICAgICAgICAoKSlcbiAgZWxzZSBpZiB0ID49IGludDYzX3JvdW5kX2xib3VuZFxuICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gIGVsc2VcbiAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfdXBfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggdClcbiAgICAgICgpXG47O1xuXG5sZXQgaW50NjNfcm91bmRfZG93bl9leG4gdCA9XG4gIGlmIHQgPj0gMC4wXG4gIHRoZW5cbiAgICBpZiB0IDw9IGludDYzX3JvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgICBlbHNlXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF9kb3duX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIlxuICAgICAgICAoRmxvYXQwLmJveCB0KVxuICAgICAgICAoKVxuICBlbHNlIChcbiAgICBsZXQgdCcgPSBmbG9vciB0IGluXG4gICAgaWYgdCcgPj0gaW50NjNfcm91bmRfbGJvdW5kXG4gICAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF9kb3duX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCJcbiAgICAgICAgKEZsb2F0MC5ib3ggdClcbiAgICAgICAgKCkpXG47O1xuXG5sZXQgaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG4gdDAgPVxuICBsZXQgdCA9IChyb3VuZF9uZWFyZXN0X2lubGluZSBbQG9jYW1sLmlubGluZWQgYWx3YXlzXSkgdDAgaW5cbiAgaWYgdCA+IDAuXG4gIHRoZW5cbiAgICBpZiB0IDw9IGludDYzX3JvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgICBlbHNlXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIlxuICAgICAgICAoYm94IHQwKVxuICAgICAgICAoKVxuICBlbHNlIGlmIHQgPj0gaW50NjNfcm91bmRfbGJvdW5kXG4gIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgZWxzZVxuICAgIGludmFsaWRfYXJnZlxuICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCJcbiAgICAgIChib3ggdDApXG4gICAgICAoKVxuOztcblxubGV0IGludDYzX3JvdW5kX25lYXJlc3RfYXJjaDY0X25vYWxsb2NfZXhuIGYgPSBJbnQ2My5vZl9pbnQgKGlyb3VuZF9uZWFyZXN0X2V4biBmKVxuXG5sZXQgaW50NjNfcm91bmRfbmVhcmVzdF9leG4gPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gaW50NjNfcm91bmRfbmVhcmVzdF9hcmNoNjRfbm9hbGxvY19leG5cbiAgfCBXMzIgLT4gaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG5cbjs7XG5cbmxldCByb3VuZCA/KGRpciA9IGBOZWFyZXN0KSB0ID1cbiAgbWF0Y2ggZGlyIHdpdGhcbiAgfCBgTmVhcmVzdCAtPiByb3VuZF9uZWFyZXN0IHRcbiAgfCBgRG93biAtPiByb3VuZF9kb3duIHRcbiAgfCBgVXAgLT4gcm91bmRfdXAgdFxuICB8IGBaZXJvIC0+IHJvdW5kX3Rvd2FyZHNfemVybyB0XG47O1xuXG5tb2R1bGUgQ2xhc3MgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IEluZmluaXRlXG4gICAgfCBOYW5cbiAgICB8IE5vcm1hbFxuICAgIHwgU3Vibm9ybWFsXG4gICAgfCBaZXJvXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlbnVtZXJhdGUsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG4gIGxldCBhbGwgPSAoWyBJbmZpbml0ZTsgTmFuOyBOb3JtYWw7IFN1Ym5vcm1hbDsgWmVybyBdIDogdCBsaXN0KVxuXG4gIGxldCB0X29mX3NleHAgPVxuICAgIChsZXQgZXJyb3Jfc291cmNlX18wMDZfID0gXCJmbG9hdC5tbC5DbGFzcy50XCIgaW5cbiAgICAgZnVuY3Rpb25cbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiaW5maW5pdGVcIiB8IFwiSW5maW5pdGVcIikgLT4gSW5maW5pdGVcbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibmFuXCIgfCBcIk5hblwiKSAtPiBOYW5cbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwibm9ybWFsXCIgfCBcIk5vcm1hbFwiKSAtPiBOb3JtYWxcbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwic3Vibm9ybWFsXCIgfCBcIlN1Ym5vcm1hbFwiKSAtPiBTdWJub3JtYWxcbiAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIC0+IFplcm9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJpbmZpbml0ZVwiIHwgXCJJbmZpbml0ZVwiKSA6OiBfKSBhc1xuICAgICAgIHNleHBfXzAwN18gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5hblwiIHwgXCJOYW5cIikgOjogXykgYXMgc2V4cF9fMDA3XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJub3JtYWxcIiB8IFwiTm9ybWFsXCIpIDo6IF8pIGFzIHNleHBfXzAwN18gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwic3Vibm9ybWFsXCIgfCBcIlN1Ym5vcm1hbFwiKSA6OiBfKSBhc1xuICAgICAgIHNleHBfXzAwN18gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSA6OiBfKSBhcyBzZXhwX18wMDdfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDA1XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDVfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbiAgICAgfCBzZXhwX18wMDVfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuICAgICAgIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA9XG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IEluZmluaXRlIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkluZmluaXRlXCJcbiAgICAgIHwgTmFuIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIk5hblwiXG4gICAgICB8IE5vcm1hbCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJOb3JtYWxcIlxuICAgICAgfCBTdWJub3JtYWwgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiU3Vibm9ybWFsXCJcbiAgICAgIHwgWmVybyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJaZXJvXCJcbiAgICAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgeyB1bnR5cGVkID1cbiAgICAgICAgVmFyaWFudFxuICAgICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICBbIE5vX3RhZyB7IG5hbWUgPSBcIkluZmluaXRlXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIk5hblwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJOb3JtYWxcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiU3Vibm9ybWFsXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlplcm9cIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgfVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IHRvX3N0cmluZyB0ID0gc3RyaW5nX29mX3NleHAgKHNleHBfb2ZfdCB0KVxuICBsZXQgb2Zfc3RyaW5nIHMgPSB0X29mX3NleHAgKHNleHBfb2Zfc3RyaW5nIHMpXG5lbmRcblxubGV0IGNsYXNzaWZ5IHQgPVxuICBsZXQgbW9kdWxlIEMgPSBDbGFzcyBpblxuICBtYXRjaCBjbGFzc2lmeV9mbG9hdCB0IHdpdGhcbiAgfCBGUF9ub3JtYWwgLT4gQy5Ob3JtYWxcbiAgfCBGUF9zdWJub3JtYWwgLT4gQy5TdWJub3JtYWxcbiAgfCBGUF96ZXJvIC0+IEMuWmVyb1xuICB8IEZQX2luZmluaXRlIC0+IEMuSW5maW5pdGVcbiAgfCBGUF9uYW4gLT4gQy5OYW5cbjs7XG5cbmxldCBpbnNlcnRfdW5kZXJzY29yZXMgPyhkZWxpbWl0ZXIgPSAnXycpID8oc3RyaXBfemVybyA9IGZhbHNlKSBzdHJpbmcgPVxuICBtYXRjaCBTdHJpbmcubHNwbGl0MiBzdHJpbmcgfm9uOicuJyB3aXRoXG4gIHwgTm9uZSAtPiBJbnRfY29udmVyc2lvbnMuaW5zZXJ0X2RlbGltaXRlciBzdHJpbmcgfmRlbGltaXRlclxuICB8IFNvbWUgKGxlZnQsIHJpZ2h0KSAtPlxuICAgIGxldCBsZWZ0ID0gSW50X2NvbnZlcnNpb25zLmluc2VydF9kZWxpbWl0ZXIgbGVmdCB+ZGVsaW1pdGVyIGluXG4gICAgbGV0IHJpZ2h0ID1cbiAgICAgIGlmIHN0cmlwX3plcm8gdGhlbiBTdHJpbmcucnN0cmlwIHJpZ2h0IH5kcm9wOihmdW4gYyAtPiBDaGFyLiggPSApIGMgJzAnKSBlbHNlIHJpZ2h0XG4gICAgaW5cbiAgICAobWF0Y2ggcmlnaHQgd2l0aFxuICAgICB8IFwiXCIgLT4gbGVmdFxuICAgICB8IF8gLT4gbGVmdCBeIFwiLlwiIF4gcmlnaHQpXG47O1xuXG5sZXQgdG9fc3RyaW5nX2h1bSA/ZGVsaW1pdGVyID8oZGVjaW1hbHMgPSAzKSA/c3RyaXBfemVybyA/KGV4cGxpY2l0X3BsdXMgPSBmYWxzZSkgZiA9XG4gIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgZGVjaW1hbHMgMFxuICB0aGVuIGludmFsaWRfYXJnZiBcInRvX3N0cmluZ19odW06IGludmFsaWQgYXJndW1lbnQgfmRlY2ltYWxzPSVkXCIgZGVjaW1hbHMgKCk7XG4gIG1hdGNoIGNsYXNzaWZ5IGYgd2l0aFxuICB8IENsYXNzLkluZmluaXRlIC0+IGlmIGYgPiAwLiB0aGVuIFwiaW5mXCIgZWxzZSBcIi1pbmZcIlxuICB8IENsYXNzLk5hbiAtPiBcIm5hblwiXG4gIHwgQ2xhc3MuTm9ybWFsIHwgQ2xhc3MuU3Vibm9ybWFsIHwgQ2xhc3MuWmVybyAtPlxuICAgIGxldCBzID1cbiAgICAgIGlmIGV4cGxpY2l0X3BsdXMgdGhlbiBzcHJpbnRmIFwiJSsuKmZcIiBkZWNpbWFscyBmIGVsc2Ugc3ByaW50ZiBcIiUuKmZcIiBkZWNpbWFscyBmXG4gICAgaW5cbiAgICBpbnNlcnRfdW5kZXJzY29yZXMgcyA/ZGVsaW1pdGVyID9zdHJpcF96ZXJvXG47O1xuXG5sZXQgc2V4cF9vZl90IHQgPVxuICBsZXQgc2V4cCA9IHNleHBfb2ZfdCB0IGluXG4gIG1hdGNoICFTZXhwLm9mX2Zsb2F0X3N0eWxlIHdpdGhcbiAgfCBgTm9fdW5kZXJzY29yZXMgLT4gc2V4cFxuICB8IGBVbmRlcnNjb3JlcyAtPlxuICAgIChtYXRjaCBzZXhwIHdpdGhcbiAgICAgfCBMaXN0IF8gLT5cbiAgICAgICByYWlzZV9zXG4gICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgICBcIltzZXhwX29mX2Zsb2F0XSBwcm9kdWNlZCBzdHJhbmdlIHNleHBcIlxuICAgICAgICAgICAgWyBcInNleHBcIiwgU2V4cC5zZXhwX29mX3Qgc2V4cCBdKVxuICAgICB8IEF0b20gc3RyaW5nIC0+XG4gICAgICAgaWYgU3RyaW5nLmNvbnRhaW5zIHN0cmluZyAnRScgdGhlbiBzZXhwIGVsc2UgQXRvbSAoaW5zZXJ0X3VuZGVyc2NvcmVzIHN0cmluZykpXG47O1xuXG5sZXQgdG9fcGFkZGVkX2NvbXBhY3Rfc3RyaW5nX2N1c3RvbSB0ID8ocHJlZml4ID0gXCJcIikgfmtpbG8gfm1lZ2EgfmdpZ2EgfnRlcmEgP3BldGEgKCkgPVxuICAoKiBSb3VuZCBhIHJhdGlvIHRvd2FyZCB0aGUgbmVhcmVzdCBpbnRlZ2VyLCByZXNvbHZpbmcgdGllcyB0b3dhcmQgdGhlIG5lYXJlc3QgZXZlblxuICAgICBudW1iZXIuICBGb3Igc2FuZSBpbnB1dHMgKGluIHBhcnRpY3VsYXIsIHdoZW4gW2Rlbm9taW5hdG9yXSBpcyBhbiBpbnRlZ2VyIGFuZFxuICAgICBbYWJzIG51bWVyYXRvciA8IDJlNTJdKSB0aGlzIHNob3VsZCBiZSBhY2N1cmF0ZS4gIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBtaWdodCBiZSBhXG4gICAgIGxpdHRsZSBiaXQgb2ZmLCBidXQgd2UgZG9uJ3QgcmVhbGx5IHVzZSB0aGF0IGNhc2UuICopXG4gIGxldCBpcm91bmRfcmF0aW9fZXhuIH5udW1lcmF0b3IgfmRlbm9taW5hdG9yID1cbiAgICBsZXQgayA9IGZsb29yIChudW1lcmF0b3IgLy4gZGVub21pbmF0b3IpIGluXG4gICAgKCogaWYgW2FicyBrIDwgMmU1M10sIHRoZW4gYm90aCBba10gYW5kIFtrICsuIDEuXSBhcmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCwgYW5kIGluXG4gICAgICAgcGFydGljdWxhciBbayArLiAxLiA+IGtdLiAgSWYgW2Rlbm9taW5hdG9yXSBpcyBhbHNvIGFuIGludGVnZXIsIGFuZFxuICAgICAgIFthYnMgKGRlbm9taW5hdG9yICouIChrICsuIDEpKSA8IDJlNTNdIChhbmQgaW4gc29tZSBvdGhlciBjYXNlcywgdG9vKSwgdGhlbiBbbG93ZXJdXG4gICAgICAgYW5kIFtoaWdoZXJdIGFyZSBhY3R1YWxseSBib3RoIGFjY3VyYXRlLiAgU2luY2UgKHJvdWdobHkpXG4gICAgICAgW251bWVyYXRvciA9IGRlbm9taW5hdG9yICouIGtdIHRoZW4gZm9yIFthYnMgbnVtZXJhdG9yIDwgMmU1Ml0gd2Ugc2hvdWxkIGJlXG4gICAgICAgZmluZS4gKilcbiAgICBsZXQgbG93ZXIgPSBkZW5vbWluYXRvciAqLiBrIGluXG4gICAgbGV0IGhpZ2hlciA9IGRlbm9taW5hdG9yICouIChrICsuIDEuKSBpblxuICAgICgqIFN1YnRyYWN0aW5nIG51bWJlcnMgd2l0aGluIGEgZmFjdG9yIG9mIHR3byBmcm9tIGVhY2ggb3RoZXIgaXMgYWNjdXJhdGUuXG4gICAgICAgU28gZWl0aGVyIHRoZSB0d28gc3VidHJhY3Rpb25zIGJlbG93IGFyZSBhY2N1cmF0ZSwgb3IgayA9IDAsIG9yIGsgPSAtMS5cbiAgICAgICBJbiBjYXNlIG9mIGEgdGllLCByb3VuZCB0byBldmVuLiAqKVxuICAgIGxldCBkaWZmX3JpZ2h0ID0gaGlnaGVyIC0uIG51bWVyYXRvciBpblxuICAgIGxldCBkaWZmX2xlZnQgPSBudW1lcmF0b3IgLS4gbG93ZXIgaW5cbiAgICBsZXQgayA9IGlyb3VuZF9uZWFyZXN0X2V4biBrIGluXG4gICAgaWYgZGlmZl9yaWdodCA8IGRpZmZfbGVmdFxuICAgIHRoZW4gayArIDFcbiAgICBlbHNlIGlmIGRpZmZfcmlnaHQgPiBkaWZmX2xlZnRcbiAgICB0aGVuIGtcbiAgICBlbHNlIGlmICgqIGEgdGllICopXG4gICAgICBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPSApIChrIG1vZCAyKSAwXG4gICAgdGhlbiBrXG4gICAgZWxzZSBrICsgMVxuICBpblxuICBtYXRjaCBjbGFzc2lmeSB0IHdpdGhcbiAgfCBDbGFzcy5JbmZpbml0ZSAtPiBpZiB0IDwgMC4wIHRoZW4gXCItaW5mICBcIiBlbHNlIFwiaW5mICBcIlxuICB8IENsYXNzLk5hbiAtPiBcIm5hbiAgXCJcbiAgfCBDbGFzcy5TdWJub3JtYWwgfCBDbGFzcy5Ob3JtYWwgfCBDbGFzcy5aZXJvIC0+XG4gICAgbGV0IGdvIHQgPVxuICAgICAgbGV0IGNvbnZfb25lIHQgPVxuICAgICAgICBhc3NlcnQgKDAuIDw9IHQgJiYgdCA8IDk5OS45NSk7XG4gICAgICAgIGxldCB4ID0gcHJlZml4IF4gZm9ybWF0X2Zsb2F0IFwiJS4xZlwiIHQgaW5cbiAgICAgICAgKCogRml4IHRoZSBcIi4wXCIgc3VmZml4ICopXG4gICAgICAgIGlmIFN0cmluZy5pc19zdWZmaXggeCB+c3VmZml4OlwiLjBcIlxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgeCA9IEJ5dGVzLm9mX3N0cmluZyB4IGluXG4gICAgICAgICAgbGV0IG4gPSBCeXRlcy5sZW5ndGggeCBpblxuICAgICAgICAgIEJ5dGVzLnNldCB4IChuIC0gMSkgJyAnO1xuICAgICAgICAgIEJ5dGVzLnNldCB4IChuIC0gMikgJyAnO1xuICAgICAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6eClcbiAgICAgICAgZWxzZSB4XG4gICAgICBpblxuICAgICAgbGV0IGNvbnYgbWFnIHQgZGVub21pbmF0b3IgPVxuICAgICAgICBhc3NlcnQgKFxuICAgICAgICAgIChkZW5vbWluYXRvciA9IDEwMC4gJiYgdCA+PSA5OTkuOTUpXG4gICAgICAgICAgfHwgKGRlbm9taW5hdG9yID49IDEwMF8wMDAuICYmIHQgPj0gcm91bmRfbmVhcmVzdCAoZGVub21pbmF0b3IgKi4gOS45OTlfNSkpKTtcbiAgICAgICAgYXNzZXJ0ICh0IDwgcm91bmRfbmVhcmVzdCAoZGVub21pbmF0b3IgKi4gOV85OTkuNSkpO1xuICAgICAgICBsZXQgaSwgZCA9XG4gICAgICAgICAgbGV0IGsgPSBpcm91bmRfcmF0aW9fZXhuIH5udW1lcmF0b3I6dCB+ZGVub21pbmF0b3IgaW5cbiAgICAgICAgICAoKiBbbW9kXSBpcyBva2F5IGhlcmUgYmVjYXVzZSB3ZSBrbm93IGkgPj0gMC4gKilcbiAgICAgICAgICBrIC8gMTAsIGsgbW9kIDEwXG4gICAgICAgIGluXG4gICAgICAgIGxldCBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICAgICAgYXNzZXJ0ICgwIDw9IGkgJiYgaSA8IDEwMDApO1xuICAgICAgICBhc3NlcnQgKDAgPD0gZCAmJiBkIDwgMTApO1xuICAgICAgICBpZiBkID0gMFxuICAgICAgICB0aGVuIHNwcmludGYgXCIlcyVkJXMgXCIgcHJlZml4IGkgbWFnXG4gICAgICAgIGVsc2Ugc3ByaW50ZiBcIiVzJWQlcyVkXCIgcHJlZml4IGkgbWFnIGRcbiAgICAgIGluXG4gICAgICAoKiBXaGlsZSB0aGUgc3RhbmRhcmQgbWV0cmljIHByZWZpeGVzIChlLmcuIGNhcGl0YWwgXCJNXCIgcmF0aGVyIHRoYW4gXCJtXCIsIFsxXSkgYXJlXG4gICAgICAgICBub21pbmFsbHkgbW9yZSBjb3JyZWN0LCB0aGlzIGhpbmRlcnMgcmVhZGFiaWxpdHkgaW4gb3VyIGNhc2UuICBFLmcuLCAxMEc2IGFuZFxuICAgICAgICAgMTA2NiBsb29rIHRvbyBzaW1pbGFyLiAgVGhhdCdzIGFuIGV4dHJlbWUgZXhhbXBsZSwgYnV0IGluIGdlbmVyYWwgayxtLGcsdCxwXG4gICAgICAgICBwcm9iYWJseSBzdGFuZCBvdXQgYmV0dGVyIHRoYW4gSyxNLEcsVCxQIHdoZW4gaW50ZXJzcGVyc2VkIHdpdGggZGlnaXRzLlxuXG4gICAgICAgICBbMV0gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXRyaWNfcHJlZml4ICopXG4gICAgICAoKiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0OlxuICAgICAgICAgLSB0aGUgZmlyc3QgYm91bmRhcnkgKDk5OS45NSkgYXMgYSBmbG9hdCBpcyBzbGlnaHRseSBvdmVyLXJlcHJlc2VudGVkIChzbyBpdCBpc1xuICAgICAgICAgICBiZXR0ZXIgYXBwcm94aW1hdGVkIGFzIFwiMWtcIiB0aGFuIGFzIFwiOTk5LjlcIiksXG4gICAgICAgICAtIHRoZSBvdGhlciBib3VuZGFyaWVzIGFyZSBhY2N1cmF0ZWx5IHJlcHJlc2VudGVkLCBiZWNhdXNlIHRoZXkgYXJlIGludGVnZXJzLlxuICAgICAgICAgICBUaGF0J3Mgd2h5IHRoZSBzdHJpY3QgZXF1YWxpdGllcyBiZWxvdyBkbyBleGFjdGx5IHdoYXQgd2Ugd2FudC4gKilcbiAgICAgIGlmIHQgPCA5OTkuOTVFMFxuICAgICAgdGhlbiBjb252X29uZSB0XG4gICAgICBlbHNlIGlmIHQgPCA5OTkuOTVFM1xuICAgICAgdGhlbiBjb252IGtpbG8gdCAxMDAuXG4gICAgICBlbHNlIGlmIHQgPCA5OTkuOTVFNlxuICAgICAgdGhlbiBjb252IG1lZ2EgdCAxMDBfMDAwLlxuICAgICAgZWxzZSBpZiB0IDwgOTk5Ljk1RTlcbiAgICAgIHRoZW4gY29udiBnaWdhIHQgMTAwXzAwMF8wMDAuXG4gICAgICBlbHNlIGlmIHQgPCA5OTkuOTVFMTJcbiAgICAgIHRoZW4gY29udiB0ZXJhIHQgMTAwXzAwMF8wMDBfMDAwLlxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHBldGEgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gc3ByaW50ZiBcIiVzJS4xZVwiIHByZWZpeCB0XG4gICAgICAgIHwgU29tZSBwZXRhIC0+XG4gICAgICAgICAgaWYgdCA8IDk5OS45NUUxNVxuICAgICAgICAgIHRoZW4gY29udiBwZXRhIHQgMTAwXzAwMF8wMDBfMDAwXzAwMC5cbiAgICAgICAgICBlbHNlIHNwcmludGYgXCIlcyUuMWVcIiBwcmVmaXggdClcbiAgICBpblxuICAgIGlmIHQgPj0gMC4gdGhlbiBnbyB0IGVsc2UgXCItXCIgXiBnbyB+LS50XG47O1xuXG5sZXQgdG9fcGFkZGVkX2NvbXBhY3Rfc3RyaW5nIHQgPVxuICB0b19wYWRkZWRfY29tcGFjdF9zdHJpbmdfY3VzdG9tIHQgfmtpbG86XCJrXCIgfm1lZ2E6XCJtXCIgfmdpZ2E6XCJnXCIgfnRlcmE6XCJ0XCIgfnBldGE6XCJwXCIgKClcbjs7XG5cbigqIFBlcmZvcm1hbmNlIG5vdGU6IEluaXRpYWxpemluZyB0aGUgYWNjdW11bGF0b3IgdG8gMSByZXN1bHRzIGluIG9uZSBleHRyYVxuICAgbXVsdGlwbHk7IGUuZy4sIHRvIGNvbXB1dGUgeCAqKiA0LCB3ZSBpbiBwcmluY2lwbGUgb25seSBuZWVkIDIgbXVsdGlwbGllcyxcbiAgIGJ1dCB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSAzIG11bHRpcGxpZXMuICBIb3dldmVyLCBhdHRlbXB0cyB0byBhdm9pZCB0aGlzXG4gICAobGlrZSBkZWNyZW1lbnRpbmcgbiBhbmQgaW5pdGlhbGl6aW5nIGFjY3VtIHRvIGJlIHgsIG9yIGhhbmRsaW5nIHNtYWxsXG4gICBleHBvbmVudHMgYXMgYSBzcGVjaWFsIGNhc2UpIGhhdmUgbm90IHlpZWxkZWQgYW55dGhpbmcgdGhhdCBpcyBhIG5ldFxuICAgaW1wcm92ZW1lbnQuXG4qKVxubGV0IGludF9wb3cgeCBuID1cbiAgbGV0IG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICBpZiBuID0gMFxuICB0aGVuIDEuXG4gIGVsc2UgKFxuICAgICgqIFVzaW5nIFt4ICsuICgtMC4pXSBvbiB0aGUgZm9sbG93aW5nIGxpbmUgY29udmluY2VzIHRoZSBjb21waWxlciB0byBhdm9pZCBhIGNlcnRhaW5cbiAgICAgICBib3hpbmcgKHRoYXQgd291bGQgcmVzdWx0IGluIGFsbG9jYXRpb24gaW4gZWFjaCBpdGVyYXRpb24pLiAgU29vbiwgdGhlIGNvbXBpbGVyXG4gICAgICAgc2hvdWxkbid0IG5lZWQgdGhpcyBcImhpbnRcIiB0byBhdm9pZCB0aGUgYm94aW5nLiAgVGhlIHJlYXNvbiB3ZSBhZGQgLTAgcmF0aGVyIHRoYW4gMFxuICAgICAgIGlzIHRoYXQgW3ggKy4gKC0wLildIGlzIGFwcGFyZW50bHkgYWx3YXlzIHRoZSBzYW1lIGFzIFt4XSwgd2hlcmVhcyBbeCArLiAwLl0gaXNcbiAgICAgICBub3QsIGluIHRoYXQgaXQgc2VuZHMgWy0wLl0gdG8gWzAuXS4gIFRoaXMgbWFrZXMgYSBkaWZmZXJlbmNlIGJlY2F1c2Ugd2Ugd2FudFxuICAgICAgIFtpbnRfcG93ICgtMC4pICgtMSldIHRvIHJldHVybiBuZWdfaW5maW5pdHkganVzdCBsaWtlIFstMC4gKiogLTEuXSB3b3VsZC4gICopXG4gICAgbGV0IHggPSByZWYgKHggKy4gLTAuKSBpblxuICAgIGxldCBuID0gcmVmIG4gaW5cbiAgICBsZXQgYWNjdW0gPSByZWYgMS4gaW5cbiAgICBpZiAhbiA8IDBcbiAgICB0aGVuIChcbiAgICAgICgqIHggKiogbiA9ICgxL3gpICoqIC1uICopXG4gICAgICB4IDo9IDEuIC8uICF4O1xuICAgICAgbiA6PSB+LSAoIW4pO1xuICAgICAgaWYgIW4gPCAwXG4gICAgICB0aGVuIChcbiAgICAgICAgKCogbiBtdXN0IGhhdmUgYmVlbiBtaW5faW50LCBzbyBpdCBpcyBub3cgc28gYmlnIHRoYXQgaXQgaGFzIHdyYXBwZWQgYXJvdW5kLlxuICAgICAgICAgICBXZSBkZWNyZW1lbnQgaXQgc28gdGhhdCBpdCBsb29rcyBwb3NpdGl2ZSBhZ2FpbiwgYnV0IGFjY29yZGluZ2x5IGhhdmVcbiAgICAgICAgICAgdG8gcHV0IGFuIGV4dHJhIGZhY3RvciBvZiB4IGluIHRoZSBhY2N1bXVsYXRvci5cbiAgICAgICAgKilcbiAgICAgICAgYWNjdW0gOj0gIXg7XG4gICAgICAgIGRlY3IgbikpO1xuICAgICgqIExldHRpbmcgW2FdIGRlbm90ZSAodGhlIG9yaWdpbmFsIHZhbHVlIG9mKSBbeCAqKiBuXSwgd2UgbWFpbnRhaW5cbiAgICAgICB0aGUgaW52YXJpYW50IHRoYXQgWyh4ICoqIG4pICouIGFjY3VtID0gYV0uICopXG4gICAgd2hpbGUgIW4gPiAxIGRvXG4gICAgICBpZiAhbiBsYW5kIDEgPD4gMCB0aGVuIGFjY3VtIDo9ICF4ICouICFhY2N1bTtcbiAgICAgIHggOj0gIXggKi4gIXg7XG4gICAgICBuIDo9ICFuIGxzciAxXG4gICAgZG9uZTtcbiAgICAoKiBuIGlzIG5lY2Vzc2FyaWx5IDEgYXQgdGhpcyBwb2ludCwgc28gdGhlcmUgaXMgb25lIGFkZGl0aW9uYWxcbiAgICAgICBtdWx0aXBsaWNhdGlvbiBieSB4LiAqKVxuICAgICF4ICouICFhY2N1bSlcbjs7XG5cbmxldCByb3VuZF9nZW4geCB+aG93ID1cbiAgaWYgeCA9IDAuXG4gIHRoZW4gMC5cbiAgZWxzZSBpZiBub3QgKGlzX2Zpbml0ZSB4KVxuICB0aGVuIHhcbiAgZWxzZSAoXG4gICAgKCogU2lnbmlmaWNhbnQgZGlnaXRzIGFuZCBkZWNpbWFsIGRpZ2l0cy4gKilcbiAgICBsZXQgc2QsIGRkID1cbiAgICAgIG1hdGNoIGhvdyB3aXRoXG4gICAgICB8IGBzaWduaWZpY2FudF9kaWdpdHMgc2QgLT5cbiAgICAgICAgbGV0IGRkID0gc2QgLSB0b19pbnQgKHJvdW5kX3VwIChsb2cxMCAoYWJzIHgpKSkgaW5cbiAgICAgICAgc2QsIGRkXG4gICAgICB8IGBkZWNpbWFsX2RpZ2l0cyBkZCAtPlxuICAgICAgICBsZXQgc2QgPSBkZCArIHRvX2ludCAocm91bmRfdXAgKGxvZzEwIChhYnMgeCkpKSBpblxuICAgICAgICBzZCwgZGRcbiAgICBpblxuICAgIGxldCBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBpZiBzZCA8IDBcbiAgICB0aGVuIDAuXG4gICAgZWxzZSBpZiBzZCA+PSAxN1xuICAgIHRoZW4geFxuICAgIGVsc2UgKFxuICAgICAgKCogQ2hvb3NlIHRoZSBvcmRlciB0aGF0IGlzIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIGZsb2F0LiBTbWFsbCBwb3NpdGl2ZVxuICAgICAgICAgaW50ZWdlcnMgYXJlLCBidXQgdGhlaXIgaW52ZXJzZXMgaW4gbW9zdCBjYXNlcyBhcmUgbm90LiAqKVxuICAgICAgbGV0IGFic19kZCA9IEludC5hYnMgZGQgaW5cbiAgICAgIGlmIGFic19kZCA+IDIyIHx8IHNkID49IDE2XG4gICAgICAoKiAxMCoqMjIgaXMgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQsIGJ1dCAxMCoqMjMgaXMgbm90LCBzbyB1c2UgdGhlIHNsb3dcbiAgICAgICAgIHBhdGguICBTaW1pbGFybHksIGlmIHdlIG5lZWQgMTYgc2lnbmlmaWNhbnQgZGlnaXRzIGluIHRoZSByZXN1bHQsIHRoZW4gdGhlIGludGVnZXJcbiAgICAgICAgIFtyb3VuZF9uZWFyZXN0ICh4IDxvcD4gb3JkZXIpXSBtaWdodCBub3QgYmUgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQsIHNpbmNlXG4gICAgICAgICBmb3Igc29tZSByYW5nZXMgd2Ugb25seSBoYXZlIDE1IGRpZ2l0cyBvZiBwcmVjaXNpb24gZ3VhcmFudGVlZC5cblxuICAgICAgICAgVGhhdCBzYWlkLCB3ZSBhcmUgc3RpbGwgcm91bmRpbmcgdHdpY2UgaGVyZTpcblxuICAgICAgICAgMSkgZmlyc3QgdGltZSB3aGVuIHJvdW5kaW5nIFt4ICouIG9yZGVyXSBvciBbeCAvLiBvcmRlcl0gdG8gdGhlIG5lYXJlc3QgZmxvYXRcbiAgICAgICAgIChqdXN0IHRoZSBub3JtYWwgd2F5IGZsb2F0aW5nLXBvaW50IG11bHRpcGxpY2F0aW9uIG9yIGRpdmlzaW9uIHdvcmtzKSxcblxuICAgICAgICAgMikgc2Vjb25kIHRpbWUgd2hlbiBhcHBseWluZyBbcm91bmRfbmVhcmVzdF9oYWxmX3RvX2V2ZW5dIHRvIHRoZSByZXN1bHQgb2YgdGhlXG4gICAgICAgICBhYm92ZSBvcGVyYXRpb25cblxuICAgICAgICAgU28gZm9yIGFyZ3VtZW50cyB3aXRoaW4gYW4gdWxwIGZyb20gYSB0aWUgd2UgbWlnaHQgc3RpbGwgcHJvZHVjZSBhbiBvZmYtYnktb25lXG4gICAgICAgICByZXN1bHQuICopXG4gICAgICB0aGVuIG9mX3N0cmluZyAoc3ByaW50ZiBcIiUuKmdcIiBzZCB4KVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBvcmRlciA9IGludF9wb3cgMTAuIGFic19kZCBpblxuICAgICAgICBpZiBkZCA+PSAwXG4gICAgICAgIHRoZW4gcm91bmRfbmVhcmVzdF9oYWxmX3RvX2V2ZW4gKHggKi4gb3JkZXIpIC8uIG9yZGVyXG4gICAgICAgIGVsc2Ugcm91bmRfbmVhcmVzdF9oYWxmX3RvX2V2ZW4gKHggLy4gb3JkZXIpICouIG9yZGVyKSkpXG47O1xuXG5sZXQgcm91bmRfc2lnbmlmaWNhbnQgeCB+c2lnbmlmaWNhbnRfZGlnaXRzID1cbiAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgc2lnbmlmaWNhbnRfZGlnaXRzIDBcbiAgdGhlblxuICAgIGludmFsaWRfYXJnZlxuICAgICAgXCJGbG9hdC5yb3VuZF9zaWduaWZpY2FudDogaW52YWxpZCBhcmd1bWVudCBzaWduaWZpY2FudF9kaWdpdHM6JWRcIlxuICAgICAgc2lnbmlmaWNhbnRfZGlnaXRzXG4gICAgICAoKVxuICBlbHNlIHJvdW5kX2dlbiB4IH5ob3c6KGBzaWduaWZpY2FudF9kaWdpdHMgc2lnbmlmaWNhbnRfZGlnaXRzKVxuOztcblxubGV0IHJvdW5kX2RlY2ltYWwgeCB+ZGVjaW1hbF9kaWdpdHMgPSByb3VuZF9nZW4geCB+aG93OihgZGVjaW1hbF9kaWdpdHMgZGVjaW1hbF9kaWdpdHMpXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcblxubGV0IGNsYW1wX2V4biB0IH5taW4gfm1heCA9XG4gICgqIEFsc28gZmFpbHMgaWYgW21pbl0gb3IgW21heF0gaXMgbmFuICopXG4gIGFzc2VydCAobWluIDw9IG1heCk7XG4gICgqIGNsYW1wX3VuY2hlY2tlZCBpcyBpbiBmbG9hdDAubWwgKilcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICAoKiBBbHNvIGZhaWxzIGlmIFttaW5dIG9yIFttYXhdIGlzIG5hbiAqKVxuICBpZiBtaW4gPD0gbWF4XG4gIHRoZW4gT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbiAgZWxzZVxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbjs7XG5cbmxldCAoICsgKSA9ICggKy4gKVxubGV0ICggLSApID0gKCAtLiApXG5sZXQgKCAqICkgPSAoICouIClcbmxldCAoICoqICkgPSAoICoqIClcbmxldCAoIC8gKSA9ICggLy4gKVxubGV0ICggJSApID0gKCAlLiApXG5sZXQgKCB+LSApID0gKCB+LS4gKVxuXG5sZXQgc2lnbl9leG4gdCA6IFNpZ24udCA9XG4gIGlmIHQgPiAwLlxuICB0aGVuIFBvc1xuICBlbHNlIGlmIHQgPCAwLlxuICB0aGVuIE5lZ1xuICBlbHNlIGlmIHQgPSAwLlxuICB0aGVuIFplcm9cbiAgZWxzZSBFcnJvci5yYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJGbG9hdC5zaWduX2V4biBvZiBOQU5cIiBbIFwiXCIsIHNleHBfb2ZfdCB0IF0pXG47O1xuXG5sZXQgc2lnbl9vcl9uYW4gdCA6IFNpZ25fb3JfbmFuLnQgPVxuICBpZiB0ID4gMC4gdGhlbiBQb3MgZWxzZSBpZiB0IDwgMC4gdGhlbiBOZWcgZWxzZSBpZiB0ID0gMC4gdGhlbiBaZXJvIGVsc2UgTmFuXG47O1xuXG5sZXQgaWVlZV9uZWdhdGl2ZSB0ID1cbiAgbGV0IGJpdHMgPSBDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgdCBpblxuICBQb2x5LihiaXRzIDwgQ2FtbC5JbnQ2NC56ZXJvKVxuOztcblxubGV0IGV4cG9uZW50X2JpdHMgPSAxMVxubGV0IG1hbnRpc3NhX2JpdHMgPSA1MlxubGV0IGV4cG9uZW50X21hc2s2NCA9IEludDY0LihzaGlmdF9sZWZ0IG9uZSBleHBvbmVudF9iaXRzIC0gb25lKVxubGV0IGV4cG9uZW50X21hc2sgPSBJbnQ2NC50b19pbnRfZXhuIGV4cG9uZW50X21hc2s2NFxubGV0IG1hbnRpc3NhX21hc2sgPSBJbnQ2My4oc2hpZnRfbGVmdCBvbmUgbWFudGlzc2FfYml0cyAtIG9uZSlcbmxldCBtYW50aXNzYV9tYXNrNjQgPSBJbnQ2My50b19pbnQ2NCBtYW50aXNzYV9tYXNrXG5cbmxldCBpZWVlX2V4cG9uZW50IHQgPVxuICBsZXQgYml0cyA9IENhbWwuSW50NjQuYml0c19vZl9mbG9hdCB0IGluXG4gIEludDY0LihiaXRfYW5kIChzaGlmdF9yaWdodF9sb2dpY2FsIGJpdHMgbWFudGlzc2FfYml0cykgZXhwb25lbnRfbWFzazY0KVxuICB8PiBDYW1sLkludDY0LnRvX2ludFxuOztcblxubGV0IGllZWVfbWFudGlzc2EgdCA9XG4gIGxldCBiaXRzID0gQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0IHQgaW5cbiAgSW50NjMub2ZfaW50NjRfZXhuIENhbWwuSW50NjQuKGxvZ2FuZCBiaXRzIG1hbnRpc3NhX21hc2s2NClcbjs7XG5cbmxldCBjcmVhdGVfaWVlZV9leG4gfm5lZ2F0aXZlIH5leHBvbmVudCB+bWFudGlzc2EgPVxuICBpZiBJbnQuKGJpdF9hbmQgZXhwb25lbnQgZXhwb25lbnRfbWFzayA8PiBleHBvbmVudClcbiAgdGhlbiBmYWlsd2l0aGYgXCJleHBvbmVudCAlZCBvdXQgb2YgcmFuZ2UgWzAsICVkXVwiIGV4cG9uZW50IGV4cG9uZW50X21hc2sgKClcbiAgZWxzZSBpZiBJbnQ2My4oYml0X2FuZCBtYW50aXNzYSBtYW50aXNzYV9tYXNrIDw+IG1hbnRpc3NhKVxuICB0aGVuXG4gICAgZmFpbHdpdGhmXG4gICAgICBcIm1hbnRpc3NhICVzIG91dCBvZiByYW5nZSBbMCwgJXNdXCJcbiAgICAgIChJbnQ2My50b19zdHJpbmcgbWFudGlzc2EpXG4gICAgICAoSW50NjMudG9fc3RyaW5nIG1hbnRpc3NhX21hc2spXG4gICAgICAoKVxuICBlbHNlIChcbiAgICBsZXQgc2lnbl9iaXRzID0gaWYgbmVnYXRpdmUgdGhlbiBDYW1sLkludDY0Lm1pbl9pbnQgZWxzZSBDYW1sLkludDY0Lnplcm8gaW5cbiAgICBsZXQgZXhwdF9iaXRzID0gQ2FtbC5JbnQ2NC5zaGlmdF9sZWZ0IChDYW1sLkludDY0Lm9mX2ludCBleHBvbmVudCkgbWFudGlzc2FfYml0cyBpblxuICAgIGxldCBtYW50X2JpdHMgPSBJbnQ2My50b19pbnQ2NCBtYW50aXNzYSBpblxuICAgIGxldCBiaXRzID0gQ2FtbC5JbnQ2NC4obG9nb3Igc2lnbl9iaXRzIChsb2dvciBleHB0X2JpdHMgbWFudF9iaXRzKSkgaW5cbiAgICBDYW1sLkludDY0LmZsb2F0X29mX2JpdHMgYml0cylcbjs7XG5cbmxldCBjcmVhdGVfaWVlZSB+bmVnYXRpdmUgfmV4cG9uZW50IH5tYW50aXNzYSA9XG4gIE9yX2Vycm9yLnRyeV93aXRoIChmdW4gKCkgLT4gY3JlYXRlX2llZWVfZXhuIH5uZWdhdGl2ZSB+ZXhwb25lbnQgfm1hbnRpc3NhKVxuOztcblxubW9kdWxlIFRlcnNlID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IHRfb2Zfc2V4cFxuICBsZXQgdG9fc3RyaW5nIHggPSBQcmludGYuc3ByaW50ZiBcIiUuOEdcIiB4XG4gIGxldCBzZXhwX29mX3QgeCA9IFNleHAuQXRvbSAodG9fc3RyaW5nIHgpXG4gIGxldCBvZl9zdHJpbmcgeCA9IG9mX3N0cmluZyB4XG4gIGxldCB0X3NleHBfZ3JhbW1hciA9IHRfc2V4cF9ncmFtbWFyXG5lbmRcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG4oKiBUaGVzZSBhcmUgcGFydGx5IGhlcmUgYXMgYSBwZXJmb3JtYW5jZSBoYWNrIHRvIGF2b2lkIHNvbWUgYm94aW5nIHdlJ3JlIGdldHRpbmcgd2l0aFxuICAgdGhlIHZlcnNpb25zIHdlIGdldCBmcm9tIFtXaXRoX3plcm9dLiAgVGhleSBhbHNvIG1ha2UgW0Zsb2F0LmlzX25lZ2F0aXZlIG5hbl0gYW5kXG4gICBbRmxvYXQuaXNfbm9uX3Bvc2l0aXZlIG5hbl0gcmV0dXJuIFtmYWxzZV07IHRoZSB2ZXJzaW9ucyB3ZSBnZXQgZnJvbSBbV2l0aF96ZXJvXSByZXR1cm5cbiAgIFt0cnVlXS4gKilcbmxldCBpc19wb3NpdGl2ZSB0ID0gdCA+IDAuXG5sZXQgaXNfbm9uX25lZ2F0aXZlIHQgPSB0ID49IDAuXG5sZXQgaXNfbmVnYXRpdmUgdCA9IHQgPCAwLlxubGV0IGlzX25vbl9wb3NpdGl2ZSB0ID0gdCA8PSAwLlxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5GbG9hdFwiXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICBlbmQpXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGxldCAoICsgKSA9ICggKyApXG4gIGxldCAoIC0gKSA9ICggLSApXG4gIGxldCAoICogKSA9ICggKiApXG4gIGxldCAoIC8gKSA9ICggLyApXG4gIGxldCAoICUgKSA9ICggJSApXG4gIGxldCAoIH4tICkgPSAoIH4tIClcbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgKEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA6IENvbXBhcmlzb25zLkluZml4IHdpdGggdHlwZSB0IDo9IHQpXG5cbiAgbGV0IGFicyA9IGFic1xuICBsZXQgbmVnID0gbmVnXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50ID0gb2ZfaW50XG4gIGxldCBvZl9mbG9hdCB4ID0geFxuZW5kXG5cbm1vZHVsZSBPX2RvdCA9IHN0cnVjdFxuICBsZXQgKCAqLiApID0gKCAqIClcbiAgbGV0ICggKy4gKSA9ICggKyApXG4gIGxldCAoIC0uICkgPSAoIC0gKVxuICBsZXQgKCAvLiApID0gKCAvIClcbiAgbGV0ICggJS4gKSA9ICggJSApXG4gIGxldCAoIH4tLiApID0gKCB+LSApXG4gIGxldCAoICoqLiApID0gKCAqKiApXG5lbmRcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbGV0IGJveCA9IGJveFxuICBsZXQgY2xhbXBfdW5jaGVja2VkID0gY2xhbXBfdW5jaGVja2VkXG4gIGxldCBsb3dlcl9ib3VuZF9mb3JfaW50ID0gbG93ZXJfYm91bmRfZm9yX2ludFxuICBsZXQgdXBwZXJfYm91bmRfZm9yX2ludCA9IHVwcGVyX2JvdW5kX2Zvcl9pbnRcbiAgbGV0IHNwZWNpYWxpemVkX2hhc2ggPSBoYXNoX2Zsb2F0XG4gIGxldCBvbmVfdWxwX2xlc3NfdGhhbl9oYWxmID0gb25lX3VscF9sZXNzX3RoYW5faGFsZlxuICBsZXQgaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG4gPSBpbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2FsbG9jX2V4blxuICBsZXQgaW50NjNfcm91bmRfbmVhcmVzdF9hcmNoNjRfbm9hbGxvY19leG4gPSBpbnQ2M19yb3VuZF9uZWFyZXN0X2FyY2g2NF9ub2FsbG9jX2V4blxuICBsZXQgaXJvdW5kX25lYXJlc3RfZXhuXzY0ID0gaXJvdW5kX25lYXJlc3RfZXhuXzY0XG5lbmRcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4oKiBUaGVzZSBmdW5jdGlvbnMgc3BlY2lmaWNhbGx5IHJlcGxhY2UgZGVmYXVsdHMgaW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLlxuXG4gICBUaGUgZGVzaXJlZCBiZWhhdmlvciBoZXJlIGlzIHRvIHByb3BhZ2F0ZSBhIG5hbiBpZiBlaXRoZXIgYXJndW1lbnQgaXMgbmFuLiBCZWNhdXNlIHRoZVxuICAgZmlyc3QgY29tcGFyaXNvbiB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIG5hbiwgaXQgc3VmZmljZXMgdG9cbiAgIGNoZWNrIGlmIHggaXMgbmFuLiBUaGVuLCB3aGVuIHggaXMgbmFuIG9yIGJvdGggeCBhbmQgeSBhcmUgbmFuLCB3ZSByZXR1cm4geCA9IG5hbjsgYW5kXG4gICB3aGVuIHkgaXMgbmFuIGJ1dCBub3QgeCwgd2UgcmV0dXJuIHkgPSBuYW4uXG5cbiAgIFRoZXJlIGFyZSB2YXJpb3VzIHdheXMgdG8gaW1wbGVtZW50IHRoZXNlIGZ1bmN0aW9ucy4gIFRoZSBiZW5jaG1hcmsgYmVsb3cgc2hvd3MgYSBmZXdcbiAgIGRpZmZlcmVudCB2ZXJzaW9ucy4gIFRoaXMgYmVuY2htYXJrIHdhcyBydW4gb3ZlciBhbiBhcnJheSBvZiByYW5kb20gZmxvYXRzIChub25lIG9mXG4gICB3aGljaCBhcmUgbmFuKS5cblxuICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICDilIIgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgVGltZS9SdW4g4pSCXG4gICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgIOKUgiBpZiBpc19uYW4geCB0aGVuIHggZWxzZSBpZiB4IDwgeSB0aGVuIHggZWxzZSB5IOKUgiAgIDIuNDJ1cyDilIJcbiAgIOKUgiBpZiBpc19uYW4geCB8fCB4IDwgeSB0aGVuIHggZWxzZSB5ICAgICAgICAgICAgIOKUgiAgIDIuMDJ1cyDilIJcbiAgIOKUgiBpZiB4IDwgeSB8fCBpc19uYW4geCB0aGVuIHggZWxzZSB5ICAgICAgICAgICAgIOKUgiAgIDEuODh1cyDilIJcbiAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG4gICBUaGUgYmVuY2htYXJrIGJlbG93IHdhcyBydW4gd2hlbiB4ID4geSBpcyBhbHdheXMgdHJ1ZSAoYWdhaW4sIG5vIG5hbiB2YWx1ZXMpLlxuXG4gICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgIOKUgiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUgiBUaW1lL1J1biDilIJcbiAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAg4pSCIGlmIGlzX25hbiB4IHRoZW4geCBlbHNlIGlmIHggPCB5IHRoZW4geCBlbHNlIHkg4pSCICAgMi44M3VzIOKUglxuICAg4pSCIGlmIGlzX25hbiB4IHx8IHggPCB5IHRoZW4geCBlbHNlIHkgICAgICAgICAgICAg4pSCICAgMS45N3VzIOKUglxuICAg4pSCIGlmIHggPCB5IHx8IGlzX25hbiB4IHRoZW4geCBlbHNlIHkgICAgICAgICAgICAg4pSCICAgMS41NnVzIOKUglxuICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4qKVxubGV0IG1pbiAoeCA6IHQpIHkgPSBpZiB4IDwgeSB8fCBpc19uYW4geCB0aGVuIHggZWxzZSB5XG5sZXQgbWF4ICh4IDogdCkgeSA9IGlmIHggPiB5IHx8IGlzX25hbiB4IHRoZW4geCBlbHNlIHlcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBCdWZmZXJfaW50ZlxuaW5jbHVkZSBDYW1sLkJ1ZmZlclxuXG5sZXQgY29udGVudHNfYnl0ZXMgPSB0b19ieXRlc1xubGV0IGFkZF9zdWJzdHJpbmcgdCBzIH5wb3MgfmxlbiA9IGFkZF9zdWJzdHJpbmcgdCBzIHBvcyBsZW5cbmxldCBhZGRfc3ViYnl0ZXMgdCBzIH5wb3MgfmxlbiA9IGFkZF9zdWJieXRlcyB0IHMgcG9zIGxlblxubGV0IHNleHBfb2ZfdCB0ID0gc2V4cF9vZl9zdHJpbmcgKGNvbnRlbnRzIHQpXG5cbm1vZHVsZSBUb19ieXRlcyA9XG4gIEJsaXQuTWFrZV9kaXN0aW5jdFxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSB0ID0gQnl0ZXMudFxuXG4gICAgICBsZXQgY3JlYXRlIH5sZW4gPSBCeXRlcy5jcmVhdGUgbGVuXG4gICAgICBsZXQgbGVuZ3RoID0gQnl0ZXMubGVuZ3RoXG5cbiAgICAgIGxldCB1bnNhZmVfYmxpdCB+c3JjIH5zcmNfcG9zIH5kc3QgfmRzdF9wb3MgfmxlbiA9XG4gICAgICAgIENhbWwuQnVmZmVyLmJsaXQgc3JjIHNyY19wb3MgZHN0IGRzdF9wb3MgbGVuXG4gICAgICA7O1xuICAgIGVuZClcblxuaW5jbHVkZSBUb19ieXRlc1xubW9kdWxlIFRvX3N0cmluZyA9IEJsaXQuTWFrZV90b19zdHJpbmcgKENhbWwuQnVmZmVyKSAoVG9fYnl0ZXMpXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbnR5cGUgdCA9IENhbWwuUHJpbnRleGMucmF3X2JhY2t0cmFjZVxuXG5sZXQgZWxpZGUgPSByZWYgZmFsc2VcbmxldCBlbGlkZWRfbWVzc2FnZSA9IFwiPGJhY2t0cmFjZSBlbGlkZWQgaW4gdGVzdD5cIlxuXG5sZXQgZ2V0ID8oYXRfbW9zdF9udW1fZnJhbWVzID0gSW50Lm1heF92YWx1ZSkgKCkgPVxuICBDYW1sLlByaW50ZXhjLmdldF9jYWxsc3RhY2sgYXRfbW9zdF9udW1fZnJhbWVzXG47O1xuXG5sZXQgdG9fc3RyaW5nIHQgPVxuICBpZiAhZWxpZGUgdGhlbiBlbGlkZWRfbWVzc2FnZSBlbHNlIENhbWwuUHJpbnRleGMucmF3X2JhY2t0cmFjZV90b19zdHJpbmcgdFxuOztcblxubGV0IHRvX3N0cmluZ19saXN0IHQgPSBTdHJpbmcuc3BsaXRfbGluZXMgKHRvX3N0cmluZyB0KVxubGV0IHNleHBfb2ZfdCB0ID0gU2V4cC5MaXN0IChMaXN0Lm1hcCAodG9fc3RyaW5nX2xpc3QgdCkgfmY6KGZ1biB4IC0+IFNleHAuQXRvbSB4KSlcblxubW9kdWxlIEV4biA9IHN0cnVjdFxuICBsZXQgc2V0X3JlY29yZGluZyA9IENhbWwuUHJpbnRleGMucmVjb3JkX2JhY2t0cmFjZVxuICBsZXQgYW1fcmVjb3JkaW5nID0gQ2FtbC5QcmludGV4Yy5iYWNrdHJhY2Vfc3RhdHVzXG4gIGxldCBtb3N0X3JlY2VudCAoKSA9IENhbWwuUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKClcblxuICBsZXQgbW9zdF9yZWNlbnRfZm9yX2V4biBleG4gPVxuICAgIGlmIEV4bi5pc19waHlzX2VxdWFsX21vc3RfcmVjZW50IGV4biB0aGVuIFNvbWUgKG1vc3RfcmVjZW50ICgpKSBlbHNlIE5vbmVcbiAgOztcblxuICAoKiBXZSB0dXJuIG9uIGJhY2t0cmFjZXMgYnkgZGVmYXVsdCBpZiBPQ0FNTFJVTlBBUkFNIGRvZXNuJ3QgZXhwbGljaXRseSBtZW50aW9uIHRoZW0uICopXG4gIGxldCBtYXliZV9zZXRfcmVjb3JkaW5nICgpID1cbiAgICBsZXQgb2NhbWxydW5wYXJhbV9tZW50aW9uc19iYWNrdHJhY2VzID1cbiAgICAgIG1hdGNoIFN5cy5nZXRlbnYgXCJPQ0FNTFJVTlBBUkFNXCIgd2l0aFxuICAgICAgfCBOb25lIC0+IGZhbHNlXG4gICAgICB8IFNvbWUgeCAtPiBMaXN0LmV4aXN0cyAoU3RyaW5nLnNwbGl0IHggfm9uOicsJykgfmY6KFN0cmluZy5pc19wcmVmaXggfnByZWZpeDpcImJcIilcbiAgICBpblxuICAgIGlmIG5vdCBvY2FtbHJ1bnBhcmFtX21lbnRpb25zX2JhY2t0cmFjZXMgdGhlbiBzZXRfcmVjb3JkaW5nIHRydWVcbiAgOztcblxuICAoKiB0aGUgY2FsbGVyIHNldCBzb21ldGhpbmcsIHRoZXkgYXJlIHJlc3BvbnNpYmxlICopXG5cbiAgbGV0IHdpdGhfcmVjb3JkaW5nIGIgfmYgPVxuICAgIGxldCBzYXZlZCA9IGFtX3JlY29yZGluZyAoKSBpblxuICAgIHNldF9yZWNvcmRpbmcgYjtcbiAgICBFeG4ucHJvdGVjdCB+ZiB+ZmluYWxseTooZnVuICgpIC0+IHNldF9yZWNvcmRpbmcgc2F2ZWQpXG4gIDs7XG5lbmRcblxubGV0IGluaXRpYWxpemVfbW9kdWxlICgpID0gRXhuLm1heWJlX3NldF9yZWNvcmRpbmcgKClcbiIsIigqKiBUaGlzIG1vZHVsZSBpcyB0aGUgdG9wbGV2ZWwgb2YgdGhlIEJhc2UgbGlicmFyeTsgaXQncyB3aGF0IHlvdSBnZXQgd2hlbiB5b3Ugd3JpdGVcbiAgICBbb3BlbiBCYXNlXS5cblxuICAgIFRoZSBnb2FsIG9mIEJhc2UgaXMgYm90aCB0byBiZSBhIG1vcmUgY29tcGxldGUgc3RhbmRhcmQgbGlicmFyeSwgd2l0aCByaWNoZXIgQVBJcyxcbiAgICBhbmQgdG8gYmUgbW9yZSBjb25zaXN0ZW50IGluIGl0cyBkZXNpZ24uIEZvciBpbnN0YW5jZSwgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnlcbiAgICBzb21lIHRoaW5ncyBoYXZlIG1vZHVsZXMgYW5kIG90aGVycyBkb24ndDsgaW4gQmFzZSwgZXZlcnl0aGluZyBpcyBhIG1vZHVsZS5cblxuICAgIEJhc2UgZXh0ZW5kcyBzb21lIG1vZHVsZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBsaWtlIFtBcnJheV0sXG4gICAgW0J1ZmZlcl0sIFtCeXRlc10sIFtDaGFyXSwgW0hhc2h0YmxdLCBbSW50MzJdLCBbSW50NjRdLCBbTGF6eV0sIFtMaXN0XSwgW01hcF0sXG4gICAgW05hdGl2ZWludF0sIFtQcmludGZdLCBbUmFuZG9tXSwgW1NldF0sIFtTdHJpbmddLCBbU3lzXSwgYW5kIFtVY2hhcl0uIE9uZSBrZXlcbiAgICBkaWZmZXJlbmNlIGlzIHRoYXQgQmFzZSBkb2Vzbid0IHVzZSBleGNlcHRpb25zIGFzIG11Y2ggYXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYW5kXG4gICAgaW5zdGVhZCBtYWtlcyBoZWF2eSB1c2Ugb2YgdGhlIFtSZXN1bHRdIHR5cGUsIGFzIGluOlxuXG4gICAge1sgdHlwZSAoJ2EsJ2IpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2IgXX1cblxuICAgIEJhc2UgYWxzbyBhZGRzIGVudGlyZWx5IG5ldyBtb2R1bGVzLCBtb3N0IG5vdGFibHk6XG5cbiAgICAtIFtDb21wYXJhYmxlXSwgW0NvbXBhcmF0b3JdLCBhbmQgW0NvbXBhcmlzb25zXSBpbiBsaWV1IG9mIHBvbHltb3JwaGljIGNvbXBhcmUuXG4gICAgLSBbQ29udGFpbmVyXSwgd2hpY2ggcHJvdmlkZXMgYSBjb25zaXN0ZW50IGludGVyZmFjZSBhY3Jvc3MgY29udGFpbmVyLWxpa2UgZGF0YVxuICAgICAgc3RydWN0dXJlcyAoYXJyYXlzLCBsaXN0cywgc3RyaW5ncykuXG4gICAgLSBbUmVzdWx0XSwgW0Vycm9yXSwgYW5kIFtPcl9lcnJvcl0sIHN1cHBvcnRpbmcgdGhlIG9yLWVycm9yIHBhdHRlcm4uXG4qKVxuXG4oKl8gV2UgaGlkZSB0aGlzIGZyb20gdGhlIHdlYiBkb2NzIGJlY2F1c2UgdGhlIGxpbmUgd3JhcHBpbmcgaXMgYmFkLCBtYWtpbmcgaXRcbiAgcHJldHR5IG11Y2ggaW5zY3J1dGFibGUuICopXG4oKiovKiopXG5cbigqIFRoZSBpbnRlbnQgaXMgdG8gc2hhZG93IGFsbCBvZiBJTlJJQSdzIHN0YW5kYXJkIGxpYnJhcnkuICBNb2R1bGVzIGJlbG93IHdvdWxkIGNhdXNlXG4gICBjb21waWxhdGlvbiBlcnJvcnMgd2l0aG91dCBiZWluZyByZW1vdmVkIGZyb20gW1NoYWRvd19zdGRsaWJdIGJlZm9yZSBpbmNsdXNpb24uICopXG5cbmluY2x1ZGUgKFxuICBTaGFkb3dfc3RkbGliIDpcbiAgICBtb2R1bGUgdHlwZSBvZiBzdHJ1Y3RcbiAgICBpbmNsdWRlIFNoYWRvd19zdGRsaWJcbiAgZW5kXG4gICgqIE1vZHVsZXMgZGVmaW5lZCBpbiBCYXNlICopXG4gIHdpdGggbW9kdWxlIEFycmF5IDo9IFNoYWRvd19zdGRsaWIuQXJyYXlcbiAgd2l0aCBtb2R1bGUgQXRvbWljIDo9IFNoYWRvd19zdGRsaWIuQXRvbWljXG4gIHdpdGggbW9kdWxlIEJvb2wgOj0gU2hhZG93X3N0ZGxpYi5Cb29sXG4gIHdpdGggbW9kdWxlIEJ1ZmZlciA6PSBTaGFkb3dfc3RkbGliLkJ1ZmZlclxuICB3aXRoIG1vZHVsZSBCeXRlcyA6PSBTaGFkb3dfc3RkbGliLkJ5dGVzXG4gIHdpdGggbW9kdWxlIENoYXIgOj0gU2hhZG93X3N0ZGxpYi5DaGFyXG4gIHdpdGggbW9kdWxlIEVpdGhlciA6PSBTaGFkb3dfc3RkbGliLkVpdGhlclxuICB3aXRoIG1vZHVsZSBGbG9hdCA6PSBTaGFkb3dfc3RkbGliLkZsb2F0XG4gIHdpdGggbW9kdWxlIEhhc2h0YmwgOj0gU2hhZG93X3N0ZGxpYi5IYXNodGJsXG4gIHdpdGggbW9kdWxlIEluX2NoYW5uZWwgOj0gU2hhZG93X3N0ZGxpYi5Jbl9jaGFubmVsXG4gIHdpdGggbW9kdWxlIEludCA6PSBTaGFkb3dfc3RkbGliLkludFxuICB3aXRoIG1vZHVsZSBJbnQzMiA6PSBTaGFkb3dfc3RkbGliLkludDMyXG4gIHdpdGggbW9kdWxlIEludDY0IDo9IFNoYWRvd19zdGRsaWIuSW50NjRcbiAgd2l0aCBtb2R1bGUgTGF6eSA6PSBTaGFkb3dfc3RkbGliLkxhenlcbiAgd2l0aCBtb2R1bGUgTGlzdCA6PSBTaGFkb3dfc3RkbGliLkxpc3RcbiAgd2l0aCBtb2R1bGUgTWFwIDo9IFNoYWRvd19zdGRsaWIuTWFwXG4gIHdpdGggbW9kdWxlIE5hdGl2ZWludCA6PSBTaGFkb3dfc3RkbGliLk5hdGl2ZWludFxuICB3aXRoIG1vZHVsZSBPcHRpb24gOj0gU2hhZG93X3N0ZGxpYi5PcHRpb25cbiAgd2l0aCBtb2R1bGUgT3V0X2NoYW5uZWwgOj0gU2hhZG93X3N0ZGxpYi5PdXRfY2hhbm5lbFxuICB3aXRoIG1vZHVsZSBQcmludGYgOj0gU2hhZG93X3N0ZGxpYi5QcmludGZcbiAgd2l0aCBtb2R1bGUgUXVldWUgOj0gU2hhZG93X3N0ZGxpYi5RdWV1ZVxuICB3aXRoIG1vZHVsZSBSYW5kb20gOj0gU2hhZG93X3N0ZGxpYi5SYW5kb21cbiAgd2l0aCBtb2R1bGUgUmVzdWx0IDo9IFNoYWRvd19zdGRsaWIuUmVzdWx0XG4gIHdpdGggbW9kdWxlIFNldCA6PSBTaGFkb3dfc3RkbGliLlNldFxuICB3aXRoIG1vZHVsZSBTdGFjayA6PSBTaGFkb3dfc3RkbGliLlN0YWNrXG4gIHdpdGggbW9kdWxlIFN0cmluZyA6PSBTaGFkb3dfc3RkbGliLlN0cmluZ1xuICB3aXRoIG1vZHVsZSBTeXMgOj0gU2hhZG93X3N0ZGxpYi5TeXNcbiAgd2l0aCBtb2R1bGUgVWNoYXIgOj0gU2hhZG93X3N0ZGxpYi5VY2hhclxuICB3aXRoIG1vZHVsZSBVbml0IDo9IFNoYWRvd19zdGRsaWIuVW5pdFxuICAoKiBTdXBwb3J0IGZvciBnZW5lcmF0ZWQgbGV4ZXJzICopXG4gIHdpdGggbW9kdWxlIExleGluZyA6PSBTaGFkb3dfc3RkbGliLkxleGluZ1xuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIGZvcm1hdCA6PSAoJ2EsICdiLCAnYykgZm9ybWF0XG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDQgOj0gKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0XG4gIHdpdGggdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA6PSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NlxuICB3aXRoIHR5cGUgJ2EgcmVmIDo9ICdhIHJlZikgW0BvY2FtbC53YXJuaW5nIFwiLTNcIl1cblxuKCoqLyoqKVxuXG5vcGVuISBJbXBvcnRcbm1vZHVsZSBBcHBsaWNhdGl2ZSA9IEFwcGxpY2F0aXZlXG5tb2R1bGUgQXJyYXkgPSBBcnJheVxubW9kdWxlIEF2bHRyZWUgPSBBdmx0cmVlXG5tb2R1bGUgQmFja3RyYWNlID0gQmFja3RyYWNlXG5tb2R1bGUgQmluYXJ5X3NlYXJjaCA9IEJpbmFyeV9zZWFyY2hcbm1vZHVsZSBCaW5hcnlfc2VhcmNoYWJsZSA9IEJpbmFyeV9zZWFyY2hhYmxlXG5tb2R1bGUgQmxpdCA9IEJsaXRcbm1vZHVsZSBCb29sID0gQm9vbFxubW9kdWxlIEJ1ZmZlciA9IEJ1ZmZlclxubW9kdWxlIEJ5dGVzID0gQnl0ZXNcbm1vZHVsZSBDaGFyID0gQ2hhclxubW9kdWxlIENvbXBhcmFibGUgPSBDb21wYXJhYmxlXG5tb2R1bGUgQ29tcGFyYXRvciA9IENvbXBhcmF0b3Jcbm1vZHVsZSBDb21wYXJpc29ucyA9IENvbXBhcmlzb25zXG5tb2R1bGUgQ29udGFpbmVyID0gQ29udGFpbmVyXG5tb2R1bGUgRWl0aGVyID0gRWl0aGVyXG5tb2R1bGUgRXF1YWwgPSBFcXVhbFxubW9kdWxlIEVycm9yID0gRXJyb3Jcbm1vZHVsZSBFeG4gPSBFeG5cbm1vZHVsZSBGaWVsZCA9IEZpZWxkXG5tb2R1bGUgRmxvYXQgPSBGbG9hdFxubW9kdWxlIEZsb2F0YWJsZSA9IEZsb2F0YWJsZVxubW9kdWxlIEZuID0gRm5cbm1vZHVsZSBGb3JtYXR0ZXIgPSBGb3JtYXR0ZXJcbm1vZHVsZSBIYXNoID0gSGFzaFxubW9kdWxlIEhhc2hfc2V0ID0gSGFzaF9zZXRcbm1vZHVsZSBIYXNoYWJsZSA9IEhhc2hhYmxlXG5tb2R1bGUgSGFzaGVyID0gSGFzaGVyXG5tb2R1bGUgSGFzaHRibCA9IEhhc2h0Ymxcbm1vZHVsZSBJZGVudGlmaWFibGUgPSBJZGVudGlmaWFibGVcbm1vZHVsZSBJbmRleGVkX2NvbnRhaW5lciA9IEluZGV4ZWRfY29udGFpbmVyXG5tb2R1bGUgSW5mbyA9IEluZm9cbm1vZHVsZSBJbnQgPSBJbnRcbm1vZHVsZSBJbnRfY29udmVyc2lvbnMgPSBJbnRfY29udmVyc2lvbnNcbm1vZHVsZSBJbnQzMiA9IEludDMyXG5tb2R1bGUgSW50NjMgPSBJbnQ2M1xubW9kdWxlIEludDY0ID0gSW50NjRcbm1vZHVsZSBJbnRhYmxlID0gSW50YWJsZVxubW9kdWxlIEludF9tYXRoID0gSW50X21hdGhcbm1vZHVsZSBJbnZhcmlhbnQgPSBJbnZhcmlhbnRcbm1vZHVsZSBMYXp5ID0gTGF6eVxubW9kdWxlIExpc3QgPSBMaXN0XG5tb2R1bGUgTWFwID0gTWFwXG5tb2R1bGUgTWF5YmVfYm91bmQgPSBNYXliZV9ib3VuZFxubW9kdWxlIE1vbmFkID0gTW9uYWRcbm1vZHVsZSBOYXRpdmVpbnQgPSBOYXRpdmVpbnRcbm1vZHVsZSBOb3RoaW5nID0gTm90aGluZ1xubW9kdWxlIE9wdGlvbiA9IE9wdGlvblxubW9kdWxlIE9wdGlvbl9hcnJheSA9IE9wdGlvbl9hcnJheVxubW9kdWxlIE9yX2Vycm9yID0gT3JfZXJyb3Jcbm1vZHVsZSBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uID0gT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vblxubW9kdWxlIE9yZGVyaW5nID0gT3JkZXJpbmdcbm1vZHVsZSBQb2x5ID0gUG9seVxubW9kdWxlIFBvbHltb3JwaGljX2NvbXBhcmUgPSBQb2x5IFtAQGRlcHJlY2F0ZWQgXCJbc2luY2UgMjAxOC0xMV0gdXNlIFtQb2x5XSBpbnN0ZWFkXCJdXG5cbm1vZHVsZSBQb3Bjb3VudCA9IFBvcGNvdW50XG5bQEBkZXByZWNhdGVkIFwiW3NpbmNlIDIwMTgtMTBdIHVzZSBbcG9wY291bnRdIGZ1bmN0aW9ucyBpbiB0aGUgaW5kaXZpZHVhbCBpbnQgbW9kdWxlc1wiXVxuXG5tb2R1bGUgUHJldHR5X3ByaW50ZXIgPSBQcmV0dHlfcHJpbnRlclxubW9kdWxlIFByaW50ZiA9IFByaW50ZlxubW9kdWxlIExpbmtlZF9xdWV1ZSA9IExpbmtlZF9xdWV1ZVxubW9kdWxlIFF1ZXVlID0gUXVldWVcbm1vZHVsZSBSYW5kb20gPSBSYW5kb21cbm1vZHVsZSBSZWYgPSBSZWZcbm1vZHVsZSBSZXN1bHQgPSBSZXN1bHRcbm1vZHVsZSBTZXF1ZW5jZSA9IFNlcXVlbmNlXG5tb2R1bGUgU2V0ID0gU2V0XG5tb2R1bGUgU2V4cGFibGUgPSBTZXhwYWJsZVxubW9kdWxlIFNpZ24gPSBTaWduXG5tb2R1bGUgU2lnbl9vcl9uYW4gPSBTaWduX29yX25hblxubW9kdWxlIFNvdXJjZV9jb2RlX3Bvc2l0aW9uID0gU291cmNlX2NvZGVfcG9zaXRpb25cbm1vZHVsZSBTdGFjayA9IFN0YWNrXG5tb2R1bGUgU3RhZ2VkID0gU3RhZ2VkXG5tb2R1bGUgU3RyaW5nID0gU3RyaW5nXG5tb2R1bGUgU3RyaW5nYWJsZSA9IFN0cmluZ2FibGVcbm1vZHVsZSBTeXMgPSBTeXNcbm1vZHVsZSBUID0gVFxubW9kdWxlIFR5cGVfZXF1YWwgPSBUeXBlX2VxdWFsXG5tb2R1bGUgVW5pZm9ybV9hcnJheSA9IFVuaWZvcm1fYXJyYXlcbm1vZHVsZSBVbml0ID0gVW5pdFxubW9kdWxlIFVjaGFyID0gVWNoYXJcbm1vZHVsZSBWYXJpYW50ID0gVmFyaWFudFxubW9kdWxlIFdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm5cbm1vZHVsZSBXb3JkX3NpemUgPSBXb3JkX3NpemVcblxuKCogQXZvaWQgYSBsZXZlbCBvZiBpbmRpcmVjdGlvbiBmb3IgdXNlcyBvZiB0aGUgc2lnbmF0dXJlcyBkZWZpbmVkIGluIFtUXS4gKilcbmluY2x1ZGUgVFxuXG4oKiBUaGlzIGlzIGEgaGFjayBzbyB0aGF0IG9kb2MgY3JlYXRlcyBiZXR0ZXIgZG9jdW1lbnRhdGlvbi4gKilcbm1vZHVsZSBTZXhwID0gc3RydWN0XG4gIGluY2x1ZGUgU2V4cF93aXRoX2NvbXBhcmFibGUgKCoqIEBpbmxpbmUgKilcbmVuZFxuXG4oKiovKiopXG5cbm1vZHVsZSBFeHBvcnRlZF9mb3Jfc3BlY2lmaWNfdXNlcyA9IHN0cnVjdFxuICBtb2R1bGUgRmllbGRzbGliID0gRmllbGRzbGliXG4gIG1vZHVsZSBQcHhfaGFzaF9saWIgPSBQcHhfaGFzaF9saWJcbiAgbW9kdWxlIFZhcmlhbnRzbGliID0gVmFyaWFudHNsaWJcbiAgbW9kdWxlIFBweF9jb21wYXJlX2xpYiA9IFBweF9jb21wYXJlX2xpYlxuICBtb2R1bGUgUHB4X2VudW1lcmF0ZV9saWIgPSBQcHhfZW51bWVyYXRlX2xpYlxuXG4gIGxldCBhbV90ZXN0aW5nID0gYW1fdGVzdGluZ1xuZW5kXG5cbigqKi8qKilcblxubW9kdWxlIEV4cG9ydCA9IHN0cnVjdFxuICAoKiBbZGVyaXZpbmcgaGFzaF0gaXMgbWlzc2luZyBmb3IgW2FycmF5XSBhbmQgW3JlZl0gc2luY2UgdGhlc2UgdHlwZXMgYXJlIG11dGFibGUuICopXG4gIHR5cGUgJ2EgYXJyYXkgPSAnYSBBcnJheS50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2FycmF5IDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIGFycmF5IC0+ICdhIGFycmF5IC0+IGludCA9IEFycmF5LmNvbXBhcmVcbiAgbGV0IGVxdWFsX2FycmF5IDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSBhcnJheSAtPiAnYSBhcnJheSAtPiBib29sID0gQXJyYXkuZXF1YWxcblxuICBsZXQgYXJyYXlfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgYXJyYXkgPVxuICAgIEFycmF5LnRfb2Zfc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX2FycmF5IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIGFycmF5IC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgQXJyYXkuc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IChhcnJheV9zZXhwX2dyYW1tYXIgOlxuICAgICAgICAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgYXJyYXkgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gICAgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IEFycmF5LnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgYm9vbCA9IEJvb2wudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9ib29sID0gKEJvb2wuY29tcGFyZSA6IGJvb2wgLT4gYm9vbCAtPiBpbnQpXG4gIGxldCBlcXVhbF9ib29sID0gKEJvb2wuZXF1YWwgOiBib29sIC0+IGJvb2wgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9ib29sIDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBib29sIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgQm9vbC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9ib29sIDogYm9vbCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gQm9vbC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGJvb2xfb2Zfc2V4cCA9IChCb29sLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBib29sKVxuICBsZXQgc2V4cF9vZl9ib29sID0gKEJvb2wuc2V4cF9vZl90IDogYm9vbCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoYm9vbF9zZXhwX2dyYW1tYXIgOiBib29sIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEJvb2wudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgY2hhciA9IENoYXIudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9jaGFyID0gKENoYXIuY29tcGFyZSA6IGNoYXIgLT4gY2hhciAtPiBpbnQpXG4gIGxldCBlcXVhbF9jaGFyID0gKENoYXIuZXF1YWwgOiBjaGFyIC0+IGNoYXIgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9jaGFyIDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBjaGFyIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgQ2hhci5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9jaGFyIDogY2hhciAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gQ2hhci5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGNoYXJfb2Zfc2V4cCA9IChDaGFyLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBjaGFyKVxuICBsZXQgc2V4cF9vZl9jaGFyID0gKENoYXIuc2V4cF9vZl90IDogY2hhciAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoY2hhcl9zZXhwX2dyYW1tYXIgOiBjaGFyIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IENoYXIudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgZXhuID0gRXhuLnQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgbGV0IHNleHBfb2ZfZXhuID0gKEV4bi5zZXhwX29mX3QgOiBleG4gLT4gU2V4cGxpYjAuU2V4cC50KVxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBmbG9hdCA9IEZsb2F0LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfZmxvYXQgPSAoRmxvYXQuY29tcGFyZSA6IGZsb2F0IC0+IGZsb2F0IC0+IGludClcbiAgbGV0IGVxdWFsX2Zsb2F0ID0gKEZsb2F0LmVxdWFsIDogZmxvYXQgLT4gZmxvYXQgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9mbG9hdCA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gZmxvYXQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBGbG9hdC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9mbG9hdCA6IGZsb2F0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBGbG9hdC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGZsb2F0X29mX3NleHAgPSAoRmxvYXQudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGZsb2F0KVxuICBsZXQgc2V4cF9vZl9mbG9hdCA9IChGbG9hdC5zZXhwX29mX3QgOiBmbG9hdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoZmxvYXRfc2V4cF9ncmFtbWFyIDogZmxvYXQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gRmxvYXQudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgaW50ID0gSW50LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfaW50ID0gKEludC5jb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQpXG4gIGxldCBlcXVhbF9pbnQgPSAoSW50LmVxdWFsIDogaW50IC0+IGludCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2ludCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBpbnQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgSW50Lmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2ludCA6IGludCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gSW50Lmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgaW50X29mX3NleHAgPSAoSW50LnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBpbnQpXG4gIGxldCBzZXhwX29mX2ludCA9IChJbnQuc2V4cF9vZl90IDogaW50IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChpbnRfc2V4cF9ncmFtbWFyIDogaW50IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEludC50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBpbnQzMiA9IEludDMyLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfaW50MzIgPSAoSW50MzIuY29tcGFyZSA6IGludDMyIC0+IGludDMyIC0+IGludClcbiAgbGV0IGVxdWFsX2ludDMyID0gKEludDMyLmVxdWFsIDogaW50MzIgLT4gaW50MzIgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9pbnQzMiA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gaW50MzIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBJbnQzMi5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9pbnQzMiA6IGludDMyIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBJbnQzMi5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGludDMyX29mX3NleHAgPSAoSW50MzIudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGludDMyKVxuICBsZXQgc2V4cF9vZl9pbnQzMiA9IChJbnQzMi5zZXhwX29mX3QgOiBpbnQzMiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoaW50MzJfc2V4cF9ncmFtbWFyIDogaW50MzIgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gSW50MzIudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgaW50NjQgPSBJbnQ2NC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2ludDY0ID0gKEludDY0LmNvbXBhcmUgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQpXG4gIGxldCBlcXVhbF9pbnQ2NCA9IChJbnQ2NC5lcXVhbCA6IGludDY0IC0+IGludDY0IC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfaW50NjQgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGludDY0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgSW50NjQuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfaW50NjQgOiBpbnQ2NCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gSW50NjQuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBpbnQ2NF9vZl9zZXhwID0gKEludDY0LnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBpbnQ2NClcbiAgbGV0IHNleHBfb2ZfaW50NjQgPSAoSW50NjQuc2V4cF9vZl90IDogaW50NjQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGludDY0X3NleHBfZ3JhbW1hciA6IGludDY0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEludDY0LnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlICdhIGxpc3QgPSAnYSBMaXN0LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfbGlzdCA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBsaXN0IC0+ICdhIGxpc3QgLT4gaW50ID0gTGlzdC5jb21wYXJlXG4gIGxldCBlcXVhbF9saXN0IDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSBsaXN0IC0+ICdhIGxpc3QgLT4gYm9vbCA9IExpc3QuZXF1YWxcblxuICBsZXQgaGFzaF9mb2xkX2xpc3QgOlxuICAgICdhLlxuICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gJ2EgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgIC0+ICdhIGxpc3RcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICA9XG4gICAgTGlzdC5oYXNoX2ZvbGRfdFxuICA7O1xuXG4gIGxldCBsaXN0X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIGxpc3QgPVxuICAgIExpc3QudF9vZl9zZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfbGlzdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSBsaXN0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgTGlzdC5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgKGxpc3Rfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgbGlzdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IExpc3QudF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBuYXRpdmVpbnQgPSBOYXRpdmVpbnQudFxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9uYXRpdmVpbnQgPSAoTmF0aXZlaW50LmNvbXBhcmUgOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IGludClcbiAgbGV0IGVxdWFsX25hdGl2ZWludCA9IChOYXRpdmVpbnQuZXF1YWwgOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfbmF0aXZlaW50IDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBuYXRpdmVpbnQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgID1cbiAgICBOYXRpdmVpbnQuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfbmF0aXZlaW50IDogbmF0aXZlaW50IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBOYXRpdmVpbnQuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBuYXRpdmVpbnRfb2Zfc2V4cCA9IChOYXRpdmVpbnQudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IG5hdGl2ZWludClcbiAgbGV0IHNleHBfb2ZfbmF0aXZlaW50ID0gKE5hdGl2ZWludC5zZXhwX29mX3QgOiBuYXRpdmVpbnQgLT4gU2V4cGxpYjAuU2V4cC50KVxuXG4gIGxldCAobmF0aXZlaW50X3NleHBfZ3JhbW1hciA6IG5hdGl2ZWludCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIE5hdGl2ZWludC50X3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSAnYSBvcHRpb24gPSAnYSBPcHRpb24udFxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9vcHRpb24gOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbiAtPiBpbnQgPVxuICAgIE9wdGlvbi5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IGVxdWFsX29wdGlvbiA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbiAtPiBib29sID1cbiAgICBPcHRpb24uZXF1YWxcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX29wdGlvbiA6XG4gICAgJ2EuXG4gICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiAnYSAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgLT4gJ2Egb3B0aW9uXG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgPVxuICAgIE9wdGlvbi5oYXNoX2ZvbGRfdFxuICA7O1xuXG4gIGxldCBvcHRpb25fb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2Egb3B0aW9uID1cbiAgICBPcHRpb24udF9vZl9zZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2Zfb3B0aW9uIDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIG9wdGlvbiAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIE9wdGlvbi5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgKG9wdGlvbl9zZXhwX2dyYW1tYXIgOlxuICAgICAgICAgJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2Egb3B0aW9uIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBPcHRpb24udF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hclxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSAnYSByZWYgPSAnYSBSZWYudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9yZWYgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgcmVmIC0+ICdhIHJlZiAtPiBpbnQgPSBSZWYuY29tcGFyZVxuICBsZXQgZXF1YWxfcmVmIDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSByZWYgLT4gJ2EgcmVmIC0+IGJvb2wgPSBSZWYuZXF1YWxcblxuICBsZXQgcmVmX29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIHJlZiA9XG4gICAgUmVmLnRfb2Zfc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3JlZiA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSByZWYgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBSZWYuc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IChyZWZfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgcmVmIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gUmVmLnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgc3RyaW5nID0gU3RyaW5nLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfc3RyaW5nID0gKFN0cmluZy5jb21wYXJlIDogc3RyaW5nIC0+IHN0cmluZyAtPiBpbnQpXG4gIGxldCBlcXVhbF9zdHJpbmcgPSAoU3RyaW5nLmVxdWFsIDogc3RyaW5nIC0+IHN0cmluZyAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX3N0cmluZyA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gc3RyaW5nIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgU3RyaW5nLmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX3N0cmluZyA6IHN0cmluZyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gU3RyaW5nLmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgc3RyaW5nX29mX3NleHAgPSAoU3RyaW5nLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBzdHJpbmcpXG4gIGxldCBzZXhwX29mX3N0cmluZyA9IChTdHJpbmcuc2V4cF9vZl90IDogc3RyaW5nIC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChzdHJpbmdfc2V4cF9ncmFtbWFyIDogc3RyaW5nIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IFN0cmluZy50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBieXRlcyA9IEJ5dGVzLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfYnl0ZXMgPSAoQnl0ZXMuY29tcGFyZSA6IGJ5dGVzIC0+IGJ5dGVzIC0+IGludClcbiAgbGV0IGVxdWFsX2J5dGVzID0gKEJ5dGVzLmVxdWFsIDogYnl0ZXMgLT4gYnl0ZXMgLT4gYm9vbClcbiAgbGV0IGJ5dGVzX29mX3NleHAgPSAoQnl0ZXMudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IGJ5dGVzKVxuICBsZXQgc2V4cF9vZl9ieXRlcyA9IChCeXRlcy5zZXhwX29mX3QgOiBieXRlcyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoYnl0ZXNfc2V4cF9ncmFtbWFyIDogYnl0ZXMgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gQnl0ZXMudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgdW5pdCA9IFVuaXQudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV91bml0ID0gKFVuaXQuY29tcGFyZSA6IHVuaXQgLT4gdW5pdCAtPiBpbnQpXG4gIGxldCBlcXVhbF91bml0ID0gKFVuaXQuZXF1YWwgOiB1bml0IC0+IHVuaXQgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF91bml0IDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB1bml0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgVW5pdC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF91bml0IDogdW5pdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gVW5pdC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHVuaXRfb2Zfc2V4cCA9IChVbml0LnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB1bml0KVxuICBsZXQgc2V4cF9vZl91bml0ID0gKFVuaXQuc2V4cF9vZl90IDogdW5pdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodW5pdF9zZXhwX2dyYW1tYXIgOiB1bml0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IFVuaXQudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gICgqKiBGb3JtYXQgc3R1ZmYgKilcblxuICB0eXBlIG5vbnJlYyAoJ2EsICdiLCAnYykgZm9ybWF0ID0gKCdhLCAnYiwgJ2MpIGZvcm1hdFxuICB0eXBlIG5vbnJlYyAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDQgPSAoJ2EsICdiLCAnYywgJ2QpIGZvcm1hdDRcbiAgdHlwZSBub25yZWMgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgPSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NlxuXG4gICgqKiBMaXN0IG9wZXJhdG9ycyAqKVxuXG4gIGluY2x1ZGUgTGlzdC5JbmZpeFxuXG4gICgqKiBJbnQgb3BlcmF0b3JzIGFuZCBjb21wYXJpc29ucyAqKVxuXG4gIGluY2x1ZGUgSW50Lk9cbiAgaW5jbHVkZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgKCoqIEZsb2F0IG9wZXJhdG9ycyAqKVxuXG4gIGluY2x1ZGUgRmxvYXQuT19kb3RcblxuICAoKiBUaGlzIGlzIGRlY2xhcmVkIGFzIGFuIGV4dGVybmFsIHRvIGJlIG9wdGltaXplZCBhd2F5IGluIG1vcmUgY29udGV4dHMuICopXG5cbiAgKCoqIFJldmVyc2UgYXBwbGljYXRpb24gb3BlcmF0b3IuIFt4IHw+IGcgfD4gZl0gaXMgZXF1aXZhbGVudCB0byBbZiAoZyAoeCkpXS4gKilcbiAgZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcblxuICAoKiogQXBwbGljYXRpb24gb3BlcmF0b3IuIFtnIEBAIGYgQEAgeF0gaXMgZXF1aXZhbGVudCB0byBbZyAoZiAoeCkpXS4gKilcbiAgZXh0ZXJuYWwgKCBAQCApIDogKCdhIC0+ICdiKSAtPiAnYSAtPiAnYiA9IFwiJWFwcGx5XCJcblxuICAoKiogQm9vbGVhbiBvcGVyYXRpb25zICopXG5cbiAgKCogVGhlc2UgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyBhbiBleHRlcm5hbCB0byBnZXQgdGhlIGxhenkgYmVoYXZpb3IgKilcbiAgZXh0ZXJuYWwgKCAmJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcbiAgZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuICBleHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcblxuICAoKiBUaGlzIG11c3QgYmUgZGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgZm9yIHRoZSB3YXJuaW5ncyB0byB3b3JrIHByb3Blcmx5LiAqKVxuICBleHRlcm5hbCBpZ25vcmUgOiBfIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4gICgqKiBDb21tb24gc3RyaW5nIG9wZXJhdGlvbnMgKilcbiAgbGV0ICggXiApID0gU3RyaW5nLiggXiApXG5cbiAgKCoqIFJlZmVyZW5jZSBvcGVyYXRpb25zICopXG5cbiAgKCogRGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWxzIHNvIHRoYXQgdGhlIGNvbXBpbGVyIHNraXBzIHRoZSBjYW1sX21vZGlmeSB3aGVuIHBvc3NpYmxlIGFuZFxuICAgICB0byBrZWVwIHJlZmVyZW5jZSB1bmJveGluZyB3b3JraW5nICopXG4gIGV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbiAgZXh0ZXJuYWwgcmVmIDogJ2EgLT4gJ2EgcmVmID0gXCIlbWFrZW11dGFibGVcIlxuICBleHRlcm5hbCAoIDo9ICkgOiAnYSByZWYgLT4gJ2EgLT4gdW5pdCA9IFwiJXNldGZpZWxkMFwiXG5cbiAgKCoqIFBhaXIgb3BlcmF0aW9ucyAqKVxuXG4gIGxldCBmc3QgPSBmc3RcbiAgbGV0IHNuZCA9IHNuZFxuXG4gICgqKiBFeGNlcHRpb25zIHN0dWZmICopXG5cbiAgKCogRGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgc28gdGhhdCB0aGUgY29tcGlsZXIgbWF5IHJld3JpdGUgJyVyYWlzZScgYXMgJyVyZXJhaXNlJy4gKilcbiAgZXh0ZXJuYWwgcmFpc2UgOiBleG4gLT4gXyA9IFwiJXJhaXNlXCJcblxuICBsZXQgZmFpbHdpdGggPSBmYWlsd2l0aFxuICBsZXQgaW52YWxpZF9hcmcgPSBpbnZhbGlkX2FyZ1xuICBsZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuICAoKiogTWlzYyAqKVxuXG4gIGxldCBwaHlzX2VxdWFsID0gcGh5c19lcXVhbFxuXG4gIGV4dGVybmFsIGZvcmNlIDogJ2EgTGF6eS50IC0+ICdhID0gXCIlbGF6eV9mb3JjZVwiXG5lbmRcblxuaW5jbHVkZSBFeHBvcnRcblxuaW5jbHVkZSBDb250YWluZXJfaW50Zi5FeHBvcnQgKCoqIEBpbmxpbmUgKilcblxuZXhjZXB0aW9uIE5vdF9mb3VuZF9zID0gTm90X2ZvdW5kX3NcblxuKCogV2UgcGVyZm9ybSB0aGVzZSBzaWRlIGVmZmVjdHMgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdGhlbSB0byBydW4gZm9yIGFueSBjb2RlIHRoYXQgdXNlc1xuICAgW0Jhc2VdLiAgSWYgdGhpcyB3ZXJlIGluIGFub3RoZXIgbW9kdWxlIGluIFtCYXNlXSB0aGF0IHdhcyBub3QgdXNlZCBpbiBzb21lIHByb2dyYW0sXG4gICB0aGVuIHRoZSBzaWRlIGVmZmVjdHMgbWlnaHQgbm90IGJlIHJ1biBpbiB0aGF0IHByb2dyYW0uICBUaGlzIHdpbGwgcnVuIGFzIGxvbmcgYXMgdGhlXG4gICBwcm9ncmFtIHJlZmVycyB0byBhdCBsZWFzdCBvbmUgdmFsdWUgZGlyZWN0bHkgaW4gW0Jhc2VdOyByZWZlcnJpbmcgdG8gdmFsdWVzIGluXG4gICBbQmFzZS5Cb29sXSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBzdWZmaWNpZW50LiAqKVxubGV0ICgpID0gQmFja3RyYWNlLmluaXRpYWxpemVfbW9kdWxlICgpXG4iLCJtb2R1bGUgQ29udiA9IFNleHBsaWIwLlNleHBfY29udlxubW9kdWxlIENvbnZfZXJyb3IgPSBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Jcbm1vZHVsZSBTZXhwX2dyYW1tYXIgPSBTZXhwbGliMC5TZXhwX2dyYW1tYXJcblxubW9kdWxlIFNleHAgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTZXhwbGliMC5TZXhwXG5cbiAgbGV0IHRfc2V4cF9ncmFtbWFyID0gQ29udi5zZXhwX3Rfc2V4cF9ncmFtbWFyXG5lbmRcblxubW9kdWxlIFNleHBhYmxlID0gU2V4cGxpYjAuU2V4cGFibGVcbiIsIm1vZHVsZSBMaXN0ID0gTGlzdFxuXG5tb2R1bGUgRW51bWVyYWJsZSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgYWxsIDogdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMxID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYSB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzIgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdiIGxpc3QgLT4gKCdhLCAnYikgdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2IgbGlzdCAtPiAnYyBsaXN0IC0+ICgnYSwgJ2IsICdjKSB0IGxpc3RcbiAgZW5kXG5lbmRcbiIsIlslJWltcG9ydCBcImNvbmZpZy5oXCJdXG5cbm9wZW4hIEJhc2VcblxuWyUlaWZkZWYgSlNDX0FSQ0hfU0lYVFlGT1VSXVxuXG5leHRlcm5hbCBuYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm9cbiAgOiAgdW5pdFxuICAtPiBJbnQ2My50XG4gID0gXCJ0aW1lX25vd19uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm9cIlxuW0BAbm9hbGxvY11cblxuWyUlZWxzZV1cblxuZXh0ZXJuYWwgbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvXG4gIDogIHVuaXRcbiAgLT4gSW50NjMudFxuICA9IFwidGltZV9ub3dfbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvXCJcblxuWyUlZW5kaWZdXG5bJSVpZmRlZiBKU0NfUE9TSVhfVElNRVJTXVxuXG5sZXRbQGNvbGRdIGdldHRpbWVfZmFpbGVkICgpID0gZmFpbHdpdGggXCJjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FKSBmYWlsZWRcIlxuXG5bJSVlbHNlXVxuXG5sZXRbQGNvbGRdIGdldHRpbWVfZmFpbGVkICgpID0gZmFpbHdpdGggXCJnZXR0aW1lb2ZkYXkgZmFpbGVkXCJcblxuWyUlZW5kaWZdXG5cbmxldCBuYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoICgpID1cbiAgbGV0IHQgPSBuYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm8gKCkgaW5cbiAgaWYgSW50NjMuKCA8PiApIHQgSW50NjMuemVybyB0aGVuIHQgZWxzZSBnZXR0aW1lX2ZhaWxlZCAoKVxuOztcbiIsIm1vZHVsZSBUZXN0X3Jlc3VsdCA9IHN0cnVjdFxuICB0eXBlIHQgPSBTdWNjZXNzIHwgRmFpbHVyZSB8IEVycm9yXG5cbiAgbGV0IHRvX2V4aXRfY29kZSA9IGZ1bmN0aW9uXG4gICAgfCBTdWNjZXNzIC0+IDBcbiAgICB8IEZhaWx1cmUgLT4gMlxuICAgIHwgRXJyb3IgICAtPiAxXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyA9IGZ1bmN0aW9uXG4gICAgfCBTdWNjZXNzIC0+IFwic3VjY2Vzc1wiXG4gICAgfCBGYWlsdXJlIC0+IFwiZmFpbHVyZVwiXG4gICAgfCBFcnJvciAgIC0+IFwiZXJyb3JcIlxuICA7O1xuXG4gIGxldCBjb21iaW5lIHQxIHQyID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgU3VjY2VzcywgU3VjY2VzcyAgICAgICAgLT4gU3VjY2Vzc1xuICAgIHwgRXJyb3IgICwgXyB8IF8sIEVycm9yICAgLT4gRXJyb3JcbiAgICB8IEZhaWx1cmUsIF8gfCBfLCBGYWlsdXJlIC0+IEZhaWx1cmVcbiAgOztcblxuICBsZXQgY29tYmluZV9hbGwgdHMgPSBMaXN0LmZvbGRfbGVmdCBjb21iaW5lIFN1Y2Nlc3MgdHNcbmVuZFxuXG5sZXQgcGFyc2VfYXJndiBhcmd2IGwgZiBtc2cgPVxuICB0cnlcbiAgICBBcmcucGFyc2VfYXJndiBhcmd2IGwgZiBtc2dcbiAgd2l0aFxuICB8IEFyZy5CYWQgbXNnIC0+IFByaW50Zi5lcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMVxuICB8IEFyZy5IZWxwIG1zZyAtPiBQcmludGYucHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMFxuOztcblxudHlwZSBkZXNjciA9IHN0cmluZ1xubGV0IHRlc3RfbW9kdWxlc19yYW4gPSByZWYgMFxubGV0IHRlc3RfbW9kdWxlc19mYWlsZWQgPSByZWYgMFxubGV0IHRlc3RzX3JhbiA9IHJlZiAwXG5sZXQgdGVzdHNfZmFpbGVkID0gcmVmIDBcbmxldCBkeW5hbWljX2xpYiA6IHN0cmluZyBvcHRpb24gcmVmID0gcmVmIE5vbmVcbnR5cGUgZmlsZW5hbWUgPSBzdHJpbmdcbnR5cGUgbGluZV9udW1iZXIgPSBpbnRcbnR5cGUgc3RhcnRfcG9zID0gaW50XG50eXBlIGVuZF9wb3MgPSBpbnRcbnR5cGUgY29uZmlnID0gKG1vZHVsZSBJbmxpbmVfdGVzdF9jb25maWcuUylcbnR5cGUgJ2EgdGVzdF9mdW5jdGlvbl9hcmdzXG4gID0gY29uZmlnOmNvbmZpZ1xuICAtPiBkZXNjcjpkZXNjciBMYXp5LnRcbiAgLT4gdGFnczpzdHJpbmcgbGlzdFxuICAtPiBmaWxlbmFtZTpmaWxlbmFtZVxuICAtPiBsaW5lX251bWJlcjpsaW5lX251bWJlclxuICAtPiBzdGFydF9wb3M6c3RhcnRfcG9zXG4gIC0+IGVuZF9wb3M6ZW5kX3Bvc1xuICAtPiAnYVxuXG5tb2R1bGUgVGFnX3ByZWRpY2F0ZSA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHsgcmVxdWlyZWRfdGFncyAgOiBzdHJpbmcgbGlzdFxuICAgIDsgZHJvcHBlZF90YWdzIDogc3RyaW5nIGxpc3RcbiAgICB9XG5cbiAgbGV0IGVuYWJsZV9ldmVyeXRoaW5nID0geyByZXF1aXJlZF90YWdzID0gW107IGRyb3BwZWRfdGFncyA9IFtdIH1cblxuICBsZXQgZHJvcCB0IHRhZyA9XG4gICAgeyBkcm9wcGVkX3RhZ3MgPSB0YWcgOjogdC5kcm9wcGVkX3RhZ3NcbiAgICA7IHJlcXVpcmVkX3RhZ3MgPSBMaXN0LmZpbHRlciAoKDw+KSB0YWcpIHQucmVxdWlyZWRfdGFnc1xuICAgIH1cblxuICBsZXQgcmVxdWlyZSB0IHRhZyA9XG4gICAgeyBkcm9wcGVkX3RhZ3MgPSBMaXN0LmZpbHRlciAoKDw+KSB0YWcpIHQuZHJvcHBlZF90YWdzXG4gICAgOyByZXF1aXJlZF90YWdzID0gdGFnIDo6IHQucmVxdWlyZWRfdGFnc1xuICAgIH1cblxuICBsZXQgZW50aXJlX21vZHVsZV9kaXNhYmxlZCB0IH5wYXJ0aWFsX3RhZ3M6dGFncyA9XG4gICAgTGlzdC5leGlzdHMgKGZ1biBkcm9wcGVkIC0+IExpc3QubWVtIGRyb3BwZWQgdGFncykgdC5kcm9wcGVkX3RhZ3NcblxuICBsZXQgZGlzYWJsZWQgdCB+Y29tcGxldGVfdGFnczp0YWdzID1cbiAgICBMaXN0LmV4aXN0cyAoZnVuIHJlcSAtPiBub3QgKExpc3QubWVtIHJlcSB0YWdzKSkgdC5yZXF1aXJlZF90YWdzXG4gICAgfHwgTGlzdC5leGlzdHMgKGZ1biBkcm9wcGVkIC0+IExpc3QubWVtIGRyb3BwZWQgdGFncykgdC5kcm9wcGVkX3RhZ3NcbmVuZFxuXG5cbnR5cGUgd2hpY2hfdGVzdHMgPVxuICB7IGxpYm5hbWUgOiBzdHJpbmdcbiAgOyBvbmx5X3Rlc3RfbG9jYXRpb24gOiAoZmlsZW5hbWUgKiBsaW5lX251bWJlciBvcHRpb24gKiBib29sIHJlZikgbGlzdFxuICA7IG5hbWVfZmlsdGVyIDogc3RyaW5nIGxpc3RcbiAgOyB3aGljaF90YWdzIDogVGFnX3ByZWRpY2F0ZS50XG4gIH1cbnR5cGUgdGVzdF9tb2RlID1cbiAgeyB3aGljaF90ZXN0cyA6IHdoaWNoX3Rlc3RzXG4gIDsgd2hhdF90b19kbyA6XG4gICAgICBbIGBSdW5fcGFydGl0aW9uIG9mIHN0cmluZyBvcHRpb25cbiAgICAgIHwgYExpc3RfcGFydGl0aW9uc1xuICAgICAgXVxuICB9XG5cbm1vZHVsZSBBY3Rpb24gOiBzaWdcbiAgdHlwZSB0ID0gW1xuICAgIHwgYElnbm9yZVxuICAgIHwgYFRlc3RfbW9kZSBvZiB0ZXN0X21vZGVcbiAgXVxuICB2YWwgZ2V0IDogdW5pdCAtPiB0XG4gIHZhbCBzZXQgOiB0IC0+IHVuaXRcbmVuZCA9IHN0cnVjdFxuICB0eXBlIHQgPSBbXG4gICAgfCBgSWdub3JlXG4gICAgfCBgVGVzdF9tb2RlIG9mIHRlc3RfbW9kZVxuICBdXG4gIGxldCBhY3Rpb24gOiB0IHJlZiA9IHJlZiBgSWdub3JlXG4gIGxldCBmb3JjZV9kcm9wID1cbiAgICB0cnkgaWdub3JlIChTeXMuZ2V0ZW52IFwiRk9SQ0VfRFJPUF9JTkxJTkVfVEVTVFwiIDogc3RyaW5nKTsgdHJ1ZVxuICAgIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG4gIGxldCBnZXQgKCkgPVxuICAgICgqIFRoaXMgaXMgdXNlZnVsIHdoZW4gY29tcGlsaW5nIHRvIGphdmFzY3JpcHQuXG4gICAgICAgSnNfb2Zfb2NhbWwgY2FuIHN0YXRpY2FsbHkgZXZhbHVhdGUgW1N5cy5nZXRlbnYgXCJGT1JDRV9EUk9QX0lOTElORV9URVNUXCJdXG4gICAgICAgYW5kIGlubGluZSB0aGUgcmVzdWx0IChbYElnbm9yZV0pIHdoZW5ldmVyIFtnZXQgKCldIGlzIGNhbGxlZC5cbiAgICAgICBVbml0IHRlc3RzIGNhbiB0aGVuIGJlIHRyZWF0ZWQgYXMgZGVhZGNvZGUgc2luY2UgdGhlIGFyZ3VtZW50IFtmXSBvZiB0aGUgW3Rlc3RdXG4gICAgICAgZnVuY3Rpb24gYmVsb3cgaXMgbmV2ZXIgdXNlZC4gKilcbiAgICBpZiBmb3JjZV9kcm9wXG4gICAgdGhlbiBgSWdub3JlXG4gICAgZWxzZSAhYWN0aW9uXG5cbiAgbGV0IHNldCB2ID0gYWN0aW9uIDo9IHZcbmVuZFxuXG5tb2R1bGUgUGFydGl0aW9uIDogc2lnXG4gIHZhbCBmb3VuZF90ZXN0IDogdW5pdCAtPiB1bml0XG4gIHZhbCBzZXRfY3VycmVudCA6IHN0cmluZyAtPiB1bml0XG4gIHZhbCBpc19jdXJyZW50IDogc3RyaW5nIG9wdGlvbiAtPiBib29sXG4gIHZhbCBhbGwgOiB1bml0IC0+IHN0cmluZyBsaXN0XG5lbmQgPSBzdHJ1Y3RcbiAgbGV0IGFsbCA9IEhhc2h0YmwuY3JlYXRlIDIzXG4gIGxldCBjdXJyZW50ID0gcmVmIFwiXCIgIGxldCBzZXRfY3VycmVudCB4ID0gY3VycmVudCA6PSB4XG4gIGxldCBmb3VuZF90ZXN0ICgpID1cbiAgICBpZiAhY3VycmVudCA8PiBcIlwiICYmIG5vdCAoSGFzaHRibC5tZW0gYWxsICFjdXJyZW50KSB0aGVuXG4gICAgICBIYXNodGJsLmFkZCBhbGwgIWN1cnJlbnQgKClcbiAgOztcbiAgbGV0IGlzX2N1cnJlbnQgPSBmdW5jdGlvblxuICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgfCBTb21lIHAgLT4gcCA9ICFjdXJyZW50XG4gIDs7XG4gIGxldCBhbGwgKCkgPVxuICAgIExpc3Quc29ydCBTdHJpbmcuY29tcGFyZVxuICAgICAgKEhhc2h0YmwuZm9sZCAoZnVuIGsgKCkgYWNjIC0+IGsgOjogYWNjKSBhbGwgW10pXG4gIDs7XG5lbmRcblxubW9kdWxlIE1vZHVsZV9jb250ZXh0ID0gc3RydWN0XG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgdHlwZSBvbmVfbW9kdWxlID1cbiAgICAgIHsgZGVzY3IgOiBzdHJpbmdcbiAgICAgIDsgdGFncyA6IHN0cmluZyBsaXN0XG4gICAgICB9XG5cbiAgICB0eXBlIHQgPSBvbmVfbW9kdWxlIGxpc3RcblxuICAgIGxldCBkZXNjciB0ID0gTGlzdC5tYXAgKGZ1biBtIC0+IG0uZGVzY3IpIHRcbiAgICBsZXQgdGFncyB0ID0gTGlzdC5jb25jYXQgKExpc3QubWFwIChmdW4gbSAtPiBtLnRhZ3MpIHQpXG4gIGVuZFxuXG4gIGxldCBjdXJyZW50IDogVC50IHJlZiA9IHJlZiBbXVxuXG4gIGxldCB3aXRoXyB+ZGVzY3IgfnRhZ3MgZiA9XG4gICAgbGV0IHByZXYgPSAhY3VycmVudCBpblxuICAgIGN1cnJlbnQgOj0geyBULiBkZXNjcjsgdGFncyB9IDo6IHByZXY7XG4gICAgdHJ5XG4gICAgICBsZXQgeCA9IGYgKCkgaW5cbiAgICAgIGN1cnJlbnQgOj0gcHJldjtcbiAgICAgIHhcbiAgICB3aXRoIGUgLT5cbiAgICAgIGN1cnJlbnQgOj0gcHJldjtcbiAgICAgIHJhaXNlIGVcblxuICBsZXQgY3VycmVudF9kZXNjciAoKSA9IFQuZGVzY3IgIWN1cnJlbnRcbiAgbGV0IGN1cnJlbnRfdGFncyAgKCkgPSBULnRhZ3MgICFjdXJyZW50XG5lbmRcblxubGV0IHZlcmJvc2UgPSByZWYgZmFsc2VcbmxldCBzdHJpY3QgPSByZWYgZmFsc2VcbmxldCBzaG93X2NvdW50cyA9IHJlZiBmYWxzZVxubGV0IGxpc3RfdGVzdF9uYW1lcyA9IHJlZiBmYWxzZVxubGV0IGRlbGF5ZWRfZXJyb3JzID0gcmVmIFtdXG5sZXQgc3RvcF9vbl9lcnJvciA9IHJlZiBmYWxzZVxuXG5sZXQgbG9nID0gcmVmIE5vbmVcblxubGV0IHRpbWVfc2VjID0gcmVmIDAuXG5cbmxldCB1c2VfY29sb3IgPSByZWYgdHJ1ZVxubGV0IGluX3BsYWNlICA9IHJlZiBmYWxzZVxubGV0IGRpZmZfY29tbWFuZCA9IHJlZiBOb25lXG5sZXQgc291cmNlX3RyZWVfcm9vdCA9IHJlZiBOb25lXG5sZXQgYWxsb3dfb3V0cHV0X3BhdHRlcm5zID0gcmVmIGZhbHNlXG5cbmxldCBkaXNwbGF5ZWRfZGVzY3IgKGxhenkgZGVzY3IpIGZpbGVuYW1lIGxpbmUgc3RhcnRfcG9zIGVuZF9wb3MgPVxuICBQcmludGYuc3ByaW50ZiBcIkZpbGUgJVMsIGxpbmUgJWQsIGNoYXJhY3RlcnMgJWQtJWQlc1wiXG4gICAgZmlsZW5hbWUgbGluZSBzdGFydF9wb3MgZW5kX3Bvc1xuICAgIChpZiBkZXNjciA9IFwiXCIgdGhlbiBcIlwiIGVsc2UgXCI6IFwiIF4gZGVzY3IpXG5sZXQgcGFyc2VfZGVzY3Igc3RyID1cbiAgdHJ5IFNvbWUgKFNjYW5mLnNzY2FuZiBzdHIgXCIgRmlsZSAlUyAsIGxpbmUgJWQgLCBjaGFyYWN0ZXJzICVkIC0gJWQgJSFcIlxuICAgICAgICAgICAgICAoZnVuIGZpbGUgbGluZSBfc3RhcnRfcG9zIF9lbmRfcG9zIC0+IGZpbGUsIFNvbWUgbGluZSkpXG4gIHdpdGggXyAtPlxuICB0cnkgU29tZSAoU2NhbmYuc3NjYW5mIHN0ciBcIiBGaWxlICVTICwgbGluZSAlZCAlIVwiIChmdW4gZmlsZSBsaW5lIC0+IGZpbGUsIFNvbWUgbGluZSkpXG4gIHdpdGggXyAtPlxuICB0cnkgU29tZSAoU2NhbmYuc3NjYW5mIHN0ciBcIiBGaWxlICVTICUhXCIgKGZ1biBmaWxlIC0+IGZpbGUsIE5vbmUpKVxuICB3aXRoIF8gLT4gTm9uZVxuXG5sZXQgKCkgPVxuICBtYXRjaCBBcnJheS50b19saXN0IFN5cy5hcmd2IHdpdGhcbiAgfCBuYW1lIDo6IFwiaW5saW5lLXRlc3QtcnVubmVyXCIgOjogbGliIDo6IHJlc3RcbiAgICB3aGVuIEJhc2UuRXhwb3J0ZWRfZm9yX3NwZWNpZmljX3VzZXMuYW1fdGVzdGluZyAtPiBiZWdpblxuICAgICAgKCogd2hlbiB3ZSBzZWUgdGhpcyBhcmd1bWVudCwgd2Ugc3dpdGNoIHRvIHRlc3QgbW9kZSAqKVxuICAgICAgbGV0IHRlc3RzID0gcmVmIFtdIGluXG4gICAgICBsZXQgbGlzdF9wYXJ0aXRpb25zID0gcmVmIGZhbHNlIGluXG4gICAgICBsZXQgcGFydGl0aW9uID0gcmVmIE5vbmUgaW5cbiAgICAgIGxldCB0YWdfcHJlZGljYXRlID0gcmVmIFRhZ19wcmVkaWNhdGUuZW5hYmxlX2V2ZXJ5dGhpbmcgaW5cbiAgICAgIGxldCBuYW1lX2ZpbHRlciA9IHJlZiBbXSBpblxuICAgICAgcGFyc2VfYXJndiAoQXJyYXkub2ZfbGlzdCAobmFtZSA6OiByZXN0KSkgKEFyZy5hbGlnbiBbXG4gICAgICAgIFwiLWxpc3QtdGVzdC1uYW1lc1wiLCBBcmcuVW5pdCAoZnVuICgpIC0+IGxpc3RfdGVzdF9uYW1lcyA6PSB0cnVlOyB2ZXJib3NlIDo9IHRydWUpLFxuICAgICAgICBcIiBEbyBub3QgcnVuIHRlc3RzIGJ1dCBzaG93IHdoYXQgd291bGQgaGF2ZSBiZWVuIHJ1blwiO1xuICAgICAgICBcIi1saXN0LXBhcnRpdGlvbnNcIiwgQXJnLlVuaXQgKGZ1biAoKSAtPiBsaXN0X3BhcnRpdGlvbnMgOj0gdHJ1ZSksXG4gICAgICAgIFwiIExpc3RzIGFsbCB0aGUgcGFydGl0aW9ucyB0aGF0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHRlc3Qgb3IgdGVzdF9tb2R1bGVcIjtcbiAgICAgICAgXCItcGFydGl0aW9uXCIsIEFyZy5TdHJpbmcgKGZ1biBpIC0+IHBhcnRpdGlvbiA6PSBTb21lIGkpLFxuICAgICAgICBcIiBPbmx5IHJ1biB0aGUgdGVzdHMgaW4gdGhlIGdpdmVuIHBhcnRpdGlvblwiO1xuICAgICAgICBcIi12ZXJib3NlXCIsIEFyZy5TZXQgdmVyYm9zZSwgXCIgU2hvdyB0aGUgdGVzdHMgYXMgdGhleSBydW5cIjtcbiAgICAgICAgXCItc3RvcC1vbi1lcnJvclwiLCBBcmcuU2V0IHN0b3Bfb25fZXJyb3IsIFwiIFJ1biB0ZXN0cyBvbmx5IHVwIHRvIHRoZSBmaXJzdCBlcnJvciBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG9lc24ndCB3b3JrIGZvciBleHBlY3QgdGVzdHMpXCI7XG4gICAgICAgIFwiLXN0cmljdFwiLCBBcmcuU2V0IHN0cmljdCwgXCIgRW5kIHdpdGggYW4gZXJyb3IgaWYgbm8gdGVzdHMgd2VyZSBydW5cIjtcbiAgICAgICAgXCItc2hvdy1jb3VudHNcIiwgQXJnLlNldCBzaG93X2NvdW50cywgXCIgU2hvdyB0aGUgbnVtYmVyIG9mIHRlc3RzIHJhblwiO1xuICAgICAgICBcIi1sb2dcIiwgQXJnLlVuaXQgKGZ1biAoKSAtPlxuICAgICAgICAgICh0cnkgU3lzLnJlbW92ZSBcImlubGluZV90ZXN0cy5sb2dcIiB3aXRoIF8gLT4gKCkpO1xuICAgICAgICAgIGxvZyA6PSBTb21lIChvcGVuX291dCBcImlubGluZV90ZXN0cy5sb2dcIilcbiAgICAgICAgKSwgXCIgTG9nIHRoZSB0ZXN0cyBydW4gaW4gaW5saW5lX3Rlc3RzLmxvZ1wiO1xuICAgICAgICBcIi1kcm9wLXRhZ1wiLCBBcmcuU3RyaW5nIChmdW4gcyAtPlxuICAgICAgICAgIHRhZ19wcmVkaWNhdGUgOj0gVGFnX3ByZWRpY2F0ZS5kcm9wICF0YWdfcHJlZGljYXRlIHNcbiAgICAgICAgKSwgXCJ0YWcgT25seSBydW4gdGVzdHMgbm90IHRhZ2dlZCB3aXRoIFt0YWddIChvdmVycmlkZXMgcHJldmlvdXMgLXJlcXVpcmUtdGFnKVwiO1xuICAgICAgICBcIi1yZXF1aXJlLXRhZ1wiLCBBcmcuU3RyaW5nIChmdW4gcyAtPlxuICAgICAgICAgIHRhZ19wcmVkaWNhdGUgOj0gVGFnX3ByZWRpY2F0ZS5yZXF1aXJlICF0YWdfcHJlZGljYXRlIHNcbiAgICAgICAgKSwgXCJ0YWcgT25seSBydW4gdGVzdHMgdGFnZ2VkIHdpdGggW3RhZ10gKG92ZXJyaWRlcyBwcmV2aW91cyAtZHJvcC10YWcpXCI7XG4gICAgICAgIFwiLW1hdGNoaW5nXCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+IG5hbWVfZmlsdGVyIDo9IHMgOjogIW5hbWVfZmlsdGVyKSxcbiAgICAgICAgXCJzdWJzdHJpbmcgT25seSBydW4gdGVzdHMgd2hvc2UgbmFtZXMgY29udGFpbiB0aGUgZ2l2ZW4gc3Vic3RyaW5nXCI7XG4gICAgICAgIFwiLW9ubHktdGVzdFwiLCBBcmcuU3RyaW5nIChmdW4gcyAtPlxuICAgICAgICAgIGxldCBmaWxlbmFtZSwgaW5kZXggPVxuICAgICAgICAgICAgbWF0Y2ggcGFyc2VfZGVzY3IgcyB3aXRoXG4gICAgICAgICAgICB8IFNvbWUgKGZpbGUsIGluZGV4KSAtPiBmaWxlLCBpbmRleFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgIGlmIFN0cmluZy5jb250YWlucyBzICc6JyB0aGVuXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBTdHJpbmcuaW5kZXggcyAnOicgaW5cbiAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBTdHJpbmcuc3ViIHMgMCBpIGluXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4X3N0cmluZyA9IFN0cmluZy5zdWIgcyAoaSArIDEpIChTdHJpbmcubGVuZ3RoIHMgLSBpIC0gMSkgaW5cbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPVxuICAgICAgICAgICAgICAgICAgdHJ5IGludF9vZl9zdHJpbmcgaW5kZXhfc3RyaW5nXG4gICAgICAgICAgICAgICAgICB3aXRoIEZhaWx1cmUgXyAtPlxuICAgICAgICAgICAgICAgICAgICBQcmludGYuZXByaW50ZlxuICAgICAgICAgICAgICAgICAgICAgIFwiQXJndW1lbnQgJXMgZG9lc24ndCBmaXQgdGhlIGZvcm1hdCBmaWxlbmFtZVs6bGluZV9udW1iZXJdXFxuJSFcIiBzO1xuICAgICAgICAgICAgICAgICAgICBleGl0IDFcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBTb21lIGluZGV4XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzLCBOb25lXG4gICAgICAgICAgaW5cbiAgICAgICAgICB0ZXN0cyA6PSAoZmlsZW5hbWUsIGluZGV4LCByZWYgZmFsc2UpIDo6ICF0ZXN0c1xuICAgICAgICApLCBcImxvY2F0aW9uIFJ1biBvbmx5IHRoZSB0ZXN0cyBzcGVjaWZpZWQgYnkgYWxsIHRoZSAtb25seS10ZXN0IG9wdGlvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25zIGNhbiBiZSBvbmUgb2YgdGhlc2UgZm9ybXM6XG4gICAgICAgICAgICAgICAgICAgICAgLSBmaWxlLm1sXG4gICAgICAgICAgICAgICAgICAgICAgLSBmaWxlLm1sOmxpbmVfbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgLSBGaWxlIFxcXCJmaWxlLm1sXFxcIlxuICAgICAgICAgICAgICAgICAgICAgIC0gRmlsZSBcXFwiZmlsZS5tbFxcXCIsIGxpbmUgMjNcbiAgICAgICAgICAgICAgICAgICAgICAtIEZpbGUgXFxcImZpbGUubWxcXFwiLCBsaW5lIDIzLCBjaGFyYWN0ZXJzIDItM1wiO1xuICAgICAgICBcIi1uby1jb2xvclwiLCBBcmcuQ2xlYXIgdXNlX2NvbG9yLCBcIiBTdW1tYXJpemUgdGVzdHMgd2l0aG91dCB1c2luZyBjb2xvclwiO1xuICAgICAgICBcIi1pbi1wbGFjZVwiLCBBcmcuU2V0IGluX3BsYWNlLCBcIiBVcGRhdGUgZXhwZWN0IHRlc3RzIGluIHBsYWNlXCI7XG4gICAgICAgIFwiLWRpZmYtY21kXCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+IGRpZmZfY29tbWFuZCA6PSBTb21lIHMpLFxuICAgICAgICBcIiBEaWZmIGNvbW1hbmQgZm9yIHRlc3RzIHRoYXQgcmVxdWlyZSBkaWZmaW5nICh1c2UgLSB0byBkaXNhYmxlIGRpZmZpbmcpXCI7XG4gICAgICAgIFwiLWFsbG93LW91dHB1dC1wYXR0ZXJuc1wiLCBBcmcuU2V0IGFsbG93X291dHB1dF9wYXR0ZXJucyxcbiAgICAgICAgXCIgQWxsb3cgb3V0cHV0IHBhdHRlcm5zIGluIHRlc3RzIGV4cGVjdGF0aW9uc1wiO1xuICAgICAgICBcIi1zb3VyY2UtdHJlZS1yb290XCIsIEFyZy5TdHJpbmcgKGZ1biBzIC0+IHNvdXJjZV90cmVlX3Jvb3QgOj0gU29tZSBzKSxcbiAgICAgICAgXCIgUGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWVcIlxuICAgICAgXSkgKGZ1biBhbm9uIC0+XG4gICAgICAgIFByaW50Zi5lcHJpbnRmIFwiJXM6IHVuZXhwZWN0ZWQgYW5vbnltb3VzIGFyZ3VtZW50ICVzXFxuJSFcIiBuYW1lIGFub247XG4gICAgICAgIGV4aXQgMVxuICAgICAgKSAoUHJpbnRmLnNwcmludGYgXCIlcyAlcyAlcyBbYXJnc11cIiBuYW1lIFwiaW5saW5lLXRlc3QtcnVubmVyXCIgbGliKTtcbiAgICAgIEFjdGlvbi5zZXQgKFxuICAgICAgICBgVGVzdF9tb2RlXG4gICAgICAgICAgeyB3aGljaF90ZXN0cyA9XG4gICAgICAgICAgICAgIHsgbGlibmFtZSA9IGxpYlxuICAgICAgICAgICAgICA7IG9ubHlfdGVzdF9sb2NhdGlvbiA9ICF0ZXN0cztcbiAgICAgICAgICAgICAgICB3aGljaF90YWdzID0gIXRhZ19wcmVkaWNhdGU7XG4gICAgICAgICAgICAgICAgbmFtZV9maWx0ZXIgPSAhbmFtZV9maWx0ZXJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIDsgd2hhdF90b19kbyA9XG4gICAgICAgICAgICAgIGlmICFsaXN0X3BhcnRpdGlvbnNcbiAgICAgICAgICAgICAgdGhlbiBgTGlzdF9wYXJ0aXRpb25zXG4gICAgICAgICAgICAgIGVsc2UgYFJ1bl9wYXJ0aXRpb24gIXBhcnRpdGlvblxuICAgICAgICAgIH0pXG4gICAgZW5kXG4gIHwgXyAtPlxuICAgICgpXG5cbmxldCBhbV90ZXN0X3J1bm5lciA9XG4gIG1hdGNoIEFjdGlvbi5nZXQgKCkgd2l0aFxuICB8IGBUZXN0X21vZGUgXyAtPiB0cnVlXG4gIHwgYElnbm9yZSAtPiBmYWxzZVxuXG5sZXQgYW1fcnVubmluZ19pbmxpbmVfdGVzdF9lbnZfdmFyID1cbiAgKCogZm9yIGFwcHJveGltYXRlIGNvbXBhdGliaWxpdHksIGdpdmVuIHRoYXQgdGhlIHZhcmlhYmxlIGlzIG5vdCBleGFjdGx5IGVxdWl2YWxlbnRcbiAgICAgdG8gd2hhdCBQUFhfSU5MSU5FX1RFU1RfTElCX0FNX1JVTk5JTkdfSU5MSU5FX1RFU1QgdXNlZCB0byBiZSAqKVxuICBcIlRFU1RJTkdfRlJBTUVXT1JLXCJcblxuKCogVGhpcyB2YWx1ZSBpcyBkZXByZWNhdGVkIGluIHByaW5jaXBsZSwgaW4gZmF2b3Igb2YgQ29yZS5hbV9ydW5uaW5nX3Rlc3QsIHNvXG4gICB3ZSdyZSBnb2luZyB0byBsaXZlIHdpdGggdGhlIHVnbHkgcGF0dGVybiBtYXRjaC4gKilcbmxldCBhbV9ydW5uaW5nX2lubGluZV90ZXN0ID1cbiAgbWF0Y2ggU3lzLmdldGVudiBcIlBQWF9JTkxJTkVfVEVTVF9MSUJfQU1fUlVOTklOR19JTkxJTkVfVEVTVFwiIHdpdGhcbiAgfCAoXyA6IHN0cmluZykgLT4gdHJ1ZSAoKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHBlb3BsZSBzZXR0aW5nIHRoaXMgdmFyaWFibGUgZGlyZWN0bHkgKilcbiAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+XG4gICAgbWF0Y2ggU3lzLmdldGVudiBhbV9ydW5uaW5nX2lubGluZV90ZXN0X2Vudl92YXIgd2l0aFxuICAgIHwgXCJpbmxpbmUtdGVzdFwiIC0+IHRydWVcbiAgICB8IGV4Y2VwdGlvbiBOb3RfZm91bmQgLT4gZmFsc2VcbiAgICB8IF8gLT4gZmFsc2VcblxubGV0IHRlc3RpbmcgPVxuICBpZiBhbV90ZXN0X3J1bm5lclxuICB0aGVuIGBUZXN0aW5nIGBBbV90ZXN0X3J1bm5lclxuICBlbHNlXG4gICAgKGlmIGFtX3J1bm5pbmdfaW5saW5lX3Rlc3RcbiAgICAgdGhlbiBgVGVzdGluZyBgQW1fY2hpbGRfb2ZfdGVzdF9ydW5uZXJcbiAgICAgZWxzZSBgTm90X3Rlc3RpbmcpXG5cbmxldCB3YWxsX3RpbWVfY2xvY2tfbnMgKCkgPVxuICBUaW1lX25vdy5uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoICgpXG5cblxubGV0IHdoZXJlX3RvX2N1dF9iYWNrdHJhY2UgPSBsYXp5IChcbiAgQmFzZS5TdHJpbmcuU2VhcmNoX3BhdHRlcm4uY3JlYXRlIChfX01PRFVMRV9fIF4gXCIuXCIgXiBcInRpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tX3NlZWRzXCIpKVxuXG5sZXQgdGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fc2VlZHMgZiA9XG4gIGxldCBiZWZvcmVfbnMgPSB3YWxsX3RpbWVfY2xvY2tfbnMgKCkgaW5cbiAgbGV0IHJlcyA9XG4gICAgKCogVG8gYXZvaWQgbm9pc2UgaW4gYmFja3RyYWNlcywgd2UgZG8gdHdvIHRoaW5ncy5cblxuICAgICAgIFdlIHVzZSBbd2hlcmVfdG9fY3V0X2JhY2t0cmFjZV0gYWJvdmUgdG8gcmVtb3ZlIHRoZSBzdGFjayBmcmFtZXMgZm9yIHRoZSBjdXJyZW50XG4gICAgICAgZnVuY3Rpb24gYW5kIGFueSBmdW5jdGlvbiBpdCBnZXRzIGlubGluZWQgaW50bywgYXMgaXQncyBub3Qgb2YgYW55IGludGVyZXN0IHRvIHRoZVxuICAgICAgIHVzZXIsIHNpbmNlIGl0J3Mgbm90IHRhbGtpbmcgYWJvdXQgdGhlaXIgdGVzdCBidXQgaW5zdGVhZCB0YWxraW5nIGFib3V0IHRoZVxuICAgICAgIHBweF9pbmxpbmVfdGVzdCBtYWNoaW5lcnkuXG5cbiAgICAgICBXZSBhbHNvIGF2b2lkIGluc2VydGluZyBhbnkgY29kZSBiZXR3ZWVuIHRoZSBbZl0gdGhhdCBjb21lcyBmcm9tIHRoZSB1c2VyJ3MgZmlsZVxuICAgICAgIGFuZCBncmFiYmluZyB0aGUgYmFja3RyYWNlIGZyb20gaXRzIGV4Y2VwdGlvbnMgKG5vIHdyYXBwaW5nIG9mIFtmXSB3aXRoIGhpZ2ggb3JkZXJcbiAgICAgICBmdW5jdGlvbnMgbGlrZSBFeG4ucHJvdGVjdCwgb3IgKGZ1biAoKSAtPiBmICgpOyB0cnVlKSkuICopXG4gICAgdHJ5IE9rIChmICgpKVxuICAgIHdpdGggZXhuIC0+IEVycm9yIChleG4sIFByaW50ZXhjLmdldF9iYWNrdHJhY2UgKCkpXG4gIGluXG4gIHRpbWVfc2VjIDo9IEJhc2UuSW50NjMuKHdhbGxfdGltZV9jbG9ja19ucyAoKSAtIGJlZm9yZV9ucyB8PiB0b19mbG9hdCkgIC8uIDFlOTtcbiAgcmVzXG5cblxubGV0IHNhdmVkX2NhbWxfcmFuZG9tX3N0YXRlID0gbGF6eSAoU3RkbGliLlJhbmRvbS5TdGF0ZS5tYWtlIFt8IDEwMDsgMjAwOyAzMDAgfF0pXG5sZXQgc2F2ZWRfYmFzZV9yYW5kb21fc3RhdGUgPSBsYXp5IChCYXNlLlJhbmRvbS5TdGF0ZS5tYWtlIFt8IDExMTsgMjIyOyAzMzMgfF0pXG5cbmxldCB0aW1lX2FuZF9yZXNldF9yYW5kb21fc2VlZHMgZiA9XG4gIGxldCBjYW1sX3JhbmRvbV9zdGF0ZSA9IFN0ZGxpYi5SYW5kb20uZ2V0X3N0YXRlICgpIGluXG4gIGxldCBiYXNlX3JhbmRvbV9zdGF0ZSA9IEJhc2UuUmFuZG9tLlN0YXRlLmNvcHkgQmFzZS5SYW5kb20uU3RhdGUuZGVmYXVsdCBpblxuICBTdGRsaWIuUmFuZG9tLnNldF9zdGF0ZSAoTGF6eS5mb3JjZSBzYXZlZF9jYW1sX3JhbmRvbV9zdGF0ZSk7XG4gIEJhc2UuUmFuZG9tLnNldF9zdGF0ZSAoTGF6eS5mb3JjZSBzYXZlZF9iYXNlX3JhbmRvbV9zdGF0ZSk7XG4gIGxldCByZXN1bHQgPSB0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV9zZWVkcyBmIGluXG4gIFN0ZGxpYi5SYW5kb20uc2V0X3N0YXRlIGNhbWxfcmFuZG9tX3N0YXRlO1xuICBCYXNlLlJhbmRvbS5zZXRfc3RhdGUgYmFzZV9yYW5kb21fc3RhdGU7XG4gIHJlc3VsdFxuXG5sZXQgc3RyaW5nX29mX21vZHVsZV9kZXNjciAoKSA9XG4gIFN0cmluZy5jb25jYXQgXCJcIiAoXG4gICAgTGlzdC5tYXAgKGZ1biBzIC0+IFwiICBpbiBURVNcIiBeIFwiVF9NT0RVTEUgYXQgXCIgXiBTdHJpbmcudW5jYXBpdGFsaXplX2FzY2lpIHMgXiBcIlxcblwiKVxuICAgICAgKE1vZHVsZV9jb250ZXh0LmN1cnJlbnRfZGVzY3IgKCkpXG4gIClcblxubGV0IHBvc2l0aW9uX21hdGNoIGRlZl9maWxlbmFtZSBkZWZfbGluZV9udW1iZXIgbCA9XG4gIExpc3QuZXhpc3RzIChmdW4gKGZpbGVuYW1lLCBsaW5lX251bWJlcl9vcHQsIHVzZWQpIC0+XG4gICAgbGV0IHBvc2l0aW9uX3N0YXJ0ID1cbiAgICAgIFN0cmluZy5sZW5ndGggZGVmX2ZpbGVuYW1lIC0gU3RyaW5nLmxlbmd0aCBmaWxlbmFtZSBpblxuICAgIGxldCBmb3VuZCA9XG4gICAgICBwb3NpdGlvbl9zdGFydCA+PSAwICYmXG4gICAgICBsZXQgZW5kX29mX2RlZl9maWxlbmFtZSA9XG4gICAgICAgIFN0cmluZy5zdWIgZGVmX2ZpbGVuYW1lXG4gICAgICAgICAgcG9zaXRpb25fc3RhcnRcbiAgICAgICAgICAoU3RyaW5nLmxlbmd0aCBmaWxlbmFtZSkgaW5cbiAgICAgIGVuZF9vZl9kZWZfZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgICAgJiYgKHBvc2l0aW9uX3N0YXJ0ID0gMCB8fCBkZWZfZmlsZW5hbWUuW3Bvc2l0aW9uX3N0YXJ0IC0gMV0gPSAnLycpXG4gICAgICAmJiAobWF0Y2ggbGluZV9udW1iZXJfb3B0IHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHRydWVcbiAgICAgICAgfCBTb21lIGxpbmVfbnVtYmVyIC0+IGRlZl9saW5lX251bWJlciA9IGxpbmVfbnVtYmVyKVxuICAgIGluXG4gICAgaWYgZm91bmQgdGhlbiB1c2VkIDo9IHRydWU7XG4gICAgZm91bmRcbiAgKSBsXG5cbmxldCBuYW1lX2ZpbHRlcl9tYXRjaCB+bmFtZV9maWx0ZXIgZGVzY3IgPVxuICBtYXRjaCBuYW1lX2ZpbHRlciB3aXRoXG4gIHwgW10gLT4gdHJ1ZVxuICB8IF8gOjogXyAtPlxuICAgIExpc3QuZXhpc3RzIChmdW4gc3Vic3RyaW5nIC0+IEJhc2UuU3RyaW5nLmlzX3N1YnN0cmluZyB+c3Vic3RyaW5nIGRlc2NyKSBuYW1lX2ZpbHRlclxuXG5sZXQgcHJpbnRfZGVsYXllZF9lcnJvcnMgKCkgPVxuICBtYXRjaCBMaXN0LnJldiAhZGVsYXllZF9lcnJvcnMgd2l0aFxuICB8IFtdIC0+ICgpXG4gIHwgXyA6OiBfIGFzIGRlbGF5ZWRfZXJyb3JzIC0+XG4gICAgUHJpbnRmLmVwcmludGYgXCJcXG4lc1xcbiUhXCIgKFN0cmluZy5tYWtlIDcwICc9Jyk7XG4gICAgTGlzdC5pdGVyIChmdW4gbWVzc2FnZSAtPlxuICAgICAgUHJpbnRmLmVwcmludGYgXCIlcyUhXCIgbWVzc2FnZVxuICAgICkgZGVsYXllZF9lcnJvcnNcblxubGV0IGVwcmludGZfb3JfZGVsYXkgZm10ID1cbiAgUHJpbnRmLmtzcHJpbnRmIChmdW4gcyAtPlxuICAgIGlmICF2ZXJib3NlIHRoZW4gZGVsYXllZF9lcnJvcnMgOj0gcyA6OiAhZGVsYXllZF9lcnJvcnNcbiAgICBlbHNlIFByaW50Zi5lcHJpbnRmIFwiJXMlIVwiIHM7XG4gICAgaWYgIXN0b3Bfb25fZXJyb3IgdGhlbiBiZWdpblxuICAgICAgcHJpbnRfZGVsYXllZF9lcnJvcnMgKCk7XG4gICAgICBleGl0IDJcbiAgICBlbmRcbiAgKSBmbXRcblxubGV0IGFkZF9ob29rcyAoKG1vZHVsZSBDKSA6IGNvbmZpZykgZiA9XG4gIGZ1biAoKSAtPiBDLnByZV90ZXN0X2hvb2sgKCk7IGYgKClcblxubGV0IGh1bV9iYWNrdHJhY2UgYmFja3RyYWNlID1cbiAgbGV0IG9wZW4gQmFzZSBpblxuICBiYWNrdHJhY2VcbiAgfD4gU3RyaW5nLnNwbGl0X2xpbmVzXG4gIHw+IExpc3QudGFrZV93aGlsZSB+ZjooZnVuIHN0ciAtPlxuICAgIG5vdCAoU3RyaW5nLlNlYXJjaF9wYXR0ZXJuLm1hdGNoZXMgKGZvcmNlIHdoZXJlX3RvX2N1dF9iYWNrdHJhY2UpIHN0cikpXG4gIHw+IExpc3QubWFwIH5mOihmdW4gc3RyIC0+IFwiICBcIiBeIHN0ciBeIFwiXFxuXCIpXG4gIHw+IFN0cmluZy5jb25jYXRcblxubGV0W0BpbmxpbmUgbmV2ZXJdIHRlc3RfaW5uZXIgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lOmRlZl9maWxlbmFtZSB+bGluZV9udW1iZXI6ZGVmX2xpbmVfbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICB+c3RhcnRfcG9zIH5lbmRfcG9zIGYgYm9vbF9vZl9mID1cbiAgbWF0Y2ggQWN0aW9uLmdldCAoKSB3aXRoXG4gIHwgYElnbm9yZSAtPiAoKVxuICB8IGBUZXN0X21vZGUgeyB3aGljaF90ZXN0cyA9IHsgbGlibmFtZTsgb25seV90ZXN0X2xvY2F0aW9uOyB3aGljaF90YWdzOyBuYW1lX2ZpbHRlciB9OyB3aGF0X3RvX2RvIH0gLT5cbiAgICBsZXQgZiA9IGFkZF9ob29rcyBjb25maWcgZiBpblxuICAgIGxldCBkZXNjciA9IGxhenkgKGRpc3BsYXllZF9kZXNjciBkZXNjciBkZWZfZmlsZW5hbWUgZGVmX2xpbmVfbnVtYmVyIHN0YXJ0X3BvcyBlbmRfcG9zKSBpblxuICAgIGxldCBjb21wbGV0ZV90YWdzID0gdGFncyBAIE1vZHVsZV9jb250ZXh0LmN1cnJlbnRfdGFncyAoKSBpblxuICAgIGxldCBzaG91bGRfcnVuID1cbiAgICAgIFNvbWUgbGlibmFtZSA9ICFkeW5hbWljX2xpYlxuICAgICAgJiYgYmVnaW4gbWF0Y2ggb25seV90ZXN0X2xvY2F0aW9uIHdpdGhcbiAgICAgICAgfCBbXSAtPiB0cnVlXG4gICAgICAgIHwgXyA6OiBfIC0+IHBvc2l0aW9uX21hdGNoIGRlZl9maWxlbmFtZSBkZWZfbGluZV9udW1iZXIgb25seV90ZXN0X2xvY2F0aW9uXG4gICAgICBlbmRcbiAgICAgICYmIG5vdCAoVGFnX3ByZWRpY2F0ZS5kaXNhYmxlZCB3aGljaF90YWdzIH5jb21wbGV0ZV90YWdzKVxuICAgICAgJiYgbmFtZV9maWx0ZXJfbWF0Y2ggfm5hbWVfZmlsdGVyIChMYXp5LmZvcmNlIGRlc2NyKVxuICAgIGluXG4gICAgaWYgc2hvdWxkX3J1biB0aGVuIGJlZ2luXG4gICAgICBtYXRjaCB3aGF0X3RvX2RvIHdpdGhcbiAgICAgIHwgYExpc3RfcGFydGl0aW9ucyAtPiBQYXJ0aXRpb24uZm91bmRfdGVzdCAoKVxuICAgICAgfCBgUnVuX3BhcnRpdGlvbiBwYXJ0aXRpb24gLT5cbiAgICAgICAgaWYgUGFydGl0aW9uLmlzX2N1cnJlbnQgcGFydGl0aW9uIHRoZW4gYmVnaW5cbiAgICAgICAgICBsZXQgZGVzY3IgPSBMYXp5LmZvcmNlIGRlc2NyIGluXG4gICAgICAgICAgaW5jciB0ZXN0c19yYW47XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggIWxvZyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIGNoIC0+IFByaW50Zi5mcHJpbnRmIGNoIFwiJXNcXG4lc1wiIGRlc2NyIChzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyICgpKVxuICAgICAgICAgIGVuZDtcbiAgICAgICAgICBpZiAhdmVyYm9zZSB0aGVuIGJlZ2luXG4gICAgICAgICAgICBQcmludGYucHJpbnRmIFwiJXMlIVwiIGRlc2NyXG4gICAgICAgICAgZW5kO1xuICAgICAgICAgIGxldCByZXN1bHQgPVxuICAgICAgICAgICAgaWYgIWxpc3RfdGVzdF9uYW1lc1xuICAgICAgICAgICAgdGhlbiBPayB0cnVlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICgqIFNlZSBbdGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fc2VlZHNdIGZvciB3aHkgd2UgdXNlIFtib29sX29mX2ZdXG4gICAgICAgICAgICAgICAgIHJhdGhlciBoYXZlIHRoZSBjYWxsZXIgd3JhcCBbZl0gdG8gYWRqdXN0IGl0cyByZXR1cm4gdmFsdWUuICopXG4gICAgICAgICAgICAgIFJlc3VsdC5tYXAgYm9vbF9vZl9mICh0aW1lX2FuZF9yZXNldF9yYW5kb21fc2VlZHMgZilcbiAgICAgICAgICBpblxuICAgICAgICAgICgqIElmICFsaXN0X3Rlc3RfbmFtZXMsIHRoaXMgaXMgaXMgYSBoYXJtbGVzcyB6ZXJvLiAqKVxuICAgICAgICAgIGlmICF2ZXJib3NlIHRoZW4gUHJpbnRmLnByaW50ZiBcIiAoJS4zZiBzZWMpXFxuJSFcIiAhdGltZV9zZWM7XG4gICAgICAgICAgbWF0Y2ggcmVzdWx0IHdpdGhcbiAgICAgICAgICB8IE9rIHRydWUgLT4gKClcbiAgICAgICAgICB8IE9rIGZhbHNlIC0+XG4gICAgICAgICAgICBpbmNyIHRlc3RzX2ZhaWxlZDtcbiAgICAgICAgICAgIGVwcmludGZfb3JfZGVsYXkgXCIlcyBpcyBmYWxzZS5cXG4lc1xcbiUhXCIgZGVzY3JcbiAgICAgICAgICAgICAgKHN0cmluZ19vZl9tb2R1bGVfZGVzY3IgKCkpXG4gICAgICAgICAgfCBFcnJvciAoZXhuLCBiYWNrdHJhY2UpIC0+XG4gICAgICAgICAgICBpbmNyIHRlc3RzX2ZhaWxlZDtcbiAgICAgICAgICAgIGxldCBiYWNrdHJhY2UgPSBodW1fYmFja3RyYWNlIGJhY2t0cmFjZSBpblxuICAgICAgICAgICAgbGV0IGV4bl9zdHIgPSBTZXhwbGliMC5TZXhwX2NvbnYucHJpbnRleGNfcHJlZmVyX3NleHAgZXhuIGluXG4gICAgICAgICAgICBsZXQgc2VwID0gaWYgU3RyaW5nLmNvbnRhaW5zIGV4bl9zdHIgJ1xcbicgdGhlbiBcIlxcblwiIGVsc2UgXCIgXCIgaW5cbiAgICAgICAgICAgIGVwcmludGZfb3JfZGVsYXkgXCIlcyB0aHJldyVzJXMuXFxuJXMlc1xcbiUhXCIgZGVzY3Igc2VwIGV4bl9zdHJcbiAgICAgICAgICAgICAgYmFja3RyYWNlIChzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyICgpKVxuICAgICAgICBlbmRcbiAgICBlbmRcblxubGV0IHNldF9saWJfYW5kX3BhcnRpdGlvbiBzdGF0aWNfbGliIHBhcnRpdGlvbiA9XG4gIG1hdGNoICFkeW5hbWljX2xpYiB3aXRoXG4gIHwgU29tZSBfIC0+XG4gICAgKCogcG9zc2libGUgaWYgdGhlIGludGVyZmFjZSBpcyB1c2VkIGV4cGxpY2l0bHkgb3IgaWYgd2UgaGFwcGVuIHRvIGR5bmxpbmsgc29tZXRoaW5nXG4gICAgICAgdGhhdCBjb250YWluIHRlc3RzICopXG4gICAgKClcbiAgfCBOb25lIC0+XG4gICAgZHluYW1pY19saWIgOj0gU29tZSBzdGF0aWNfbGliO1xuICAgIG1hdGNoIEFjdGlvbi5nZXQgKCkgd2l0aFxuICAgIHwgYElnbm9yZSAtPiAoKVxuICAgIHwgYFRlc3RfbW9kZSB7IHdoaWNoX3Rlc3RzOyB3aGF0X3RvX2RvIH0gLT5cbiAgICAgIGlmIHdoaWNoX3Rlc3RzLmxpYm5hbWUgPSBzdGF0aWNfbGliIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IHJlcXVpcmVzX3BhcnRpdGlvbiA9XG4gICAgICAgICAgbWF0Y2ggd2hhdF90b19kbyB3aXRoXG4gICAgICAgICAgfCBgTGlzdF9wYXJ0aXRpb25zIHwgYFJ1bl9wYXJ0aXRpb24gKFNvbWUgXykgLT4gdHJ1ZVxuICAgICAgICAgIHwgYFJ1bl9wYXJ0aXRpb24gTm9uZSAtPiBmYWxzZVxuICAgICAgICBpblxuICAgICAgICBpZiBwYXJ0aXRpb24gPSBcIlwiICYmIHJlcXVpcmVzX3BhcnRpdGlvblxuICAgICAgICB0aGVuIGZhaWx3aXRoIFwicHB4X2lubGluZV90ZXN0OiBjYW5ub3QgdXNlIC1saXN0LXBhcnRpdGlvbiBvciAtcGFydGl0aW9uIFxcXG4gICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgc3BlY2lmeWluZyBhIHBhcnRpdGlvbiBhdCBwcmVwcm9jZXNzaW5nIHRpbWVcIlxuICAgICAgICBlbHNlIFBhcnRpdGlvbi5zZXRfY3VycmVudCBwYXJ0aXRpb25cbiAgICAgIGVuZFxuXG5sZXQgdW5zZXRfbGliIHN0YXRpY19saWIgPVxuICBtYXRjaCAhZHluYW1pY19saWIgd2l0aFxuICB8IE5vbmUgLT5cbiAgICAoKiBub3QgZ2l2aW5nIGFuIGVycm9yLCBiZWNhdXNlIHdoZW4gc29tZSBhbm5veWluZyBwZW9wbGUgcHV0IHBhX291bml0IGluIHRoZWlyIGxpc3RcbiAgICAgICBvZiBwcmVwcm9jZXNzb3JzLCBwYV9vdW5pdCBpcyBzZXQgdXAgdHdpY2UgYW5kIHdlIGhhdmUgdHdvIGNhbGxzIHRvIHVuc2V0X2xpYiBhdFxuICAgICAgIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCB0aGUgc2Vjb25kIG9uZSBjb21lcyBpbiB0aGlzIGJyYW5jaCAqKVxuICAgICgpXG4gIHwgU29tZSBsaWIgLT5cbiAgICBpZiBsaWIgPSBzdGF0aWNfbGliIHRoZW4gZHluYW1pY19saWIgOj0gTm9uZVxuXG5sZXQgdGVzdCB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWUgfmxpbmVfbnVtYmVyIH5zdGFydF9wb3MgfmVuZF9wb3MgZiA9XG4gIHRlc3RfaW5uZXIgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lIH5saW5lX251bWJlciB+c3RhcnRfcG9zIH5lbmRfcG9zXG4gICAgZiAoZnVuIGIgLT4gYilcblxubGV0IHRlc3RfdW5pdCB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWUgfmxpbmVfbnVtYmVyIH5zdGFydF9wb3MgfmVuZF9wb3MgZiA9XG4gIHRlc3RfaW5uZXIgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lIH5saW5lX251bWJlciB+c3RhcnRfcG9zIH5lbmRfcG9zXG4gICAgZiAoZnVuICgpIC0+IHRydWUpXG5cbmxldFtAaW5saW5lIG5ldmVyXSB0ZXN0X21vZHVsZSB+Y29uZmlnIH5kZXNjciB+dGFncyB+ZmlsZW5hbWU6ZGVmX2ZpbGVuYW1lIH5saW5lX251bWJlcjpkZWZfbGluZV9udW1iZXJcbiAgICAgICAgICAgICAgICAgICAgIH5zdGFydF9wb3MgfmVuZF9wb3MgZiA9XG4gIG1hdGNoIEFjdGlvbi5nZXQgKCkgd2l0aFxuICB8IGBJZ25vcmUgLT4gKClcbiAgfCBgVGVzdF9tb2RlIHsgd2hpY2hfdGVzdHMgPSB7IGxpYm5hbWU7IG9ubHlfdGVzdF9sb2NhdGlvbiA9IF87IG5hbWVfZmlsdGVyID0gXzsgd2hpY2hfdGFncyB9OyB3aGF0X3RvX2RvIH0gLT5cbiAgICBsZXQgZiA9IGFkZF9ob29rcyBjb25maWcgZiBpblxuICAgIGxldCBkZXNjciAoKSA9IGRpc3BsYXllZF9kZXNjciBkZXNjciBkZWZfZmlsZW5hbWUgZGVmX2xpbmVfbnVtYmVyIHN0YXJ0X3BvcyBlbmRfcG9zIGluXG4gICAgbGV0IHBhcnRpYWxfdGFncyA9IHRhZ3MgQCBNb2R1bGVfY29udGV4dC5jdXJyZW50X3RhZ3MgKCkgaW5cbiAgICBsZXQgc2hvdWxkX3J1biA9XG4gICAgICBTb21lIGxpYm5hbWUgPSAhZHluYW1pY19saWJcbiAgICAgICgqIElmLCBubyBtYXR0ZXIgd2hhdCB0YWdzIGEgdGVzdCBkZWZpbmVzLCB3ZSBjZXJ0YWlubHkgd2lsbCBkcm9wIGFsbCB0ZXN0cyB3aXRoaW5cbiAgICAgICAgIHRoaXMgbW9kdWxlLCB0aGVuIGRvbid0IHJ1biB0aGUgbW9kdWxlIGF0IGFsbC4gVGhpcyBtZWFucyBwZW9wbGUgY2FuIHdyaXRlXG4gICAgICAgICB0aGluZ3MgbGlrZSB0aGUgZm9sbG93aW5nIHdpdGhvdXQgYnJlYWtpbmcgdGhlIDMyLWJpdCBidWlsZDpcbiAgICAgICAgIGxldCV0ZXN0X21vZHVsZSBbQHRhZ3MgXCI2NC1iaXRzLW9ubHlcIl0gPSAobW9kdWxlIHN0cnVjdFxuICAgICAgICAgbGV0IGkgPSBJbnQ2NC50b19pbnRfZXhuIC4uLi5cbiAgICAgICAgIGVuZClcbiAgICAgICAgIFdlIGRvbid0IHNob3J0Y3V0IGJhc2VkIG9uIHBvc2l0aW9uLCBhcyB3ZSBjYW4ndCB0ZWxsIHdoYXQgcG9zaXRpb25zIHRoZVxuICAgICAgICAgaW5uZXIgdGVzdHMgd2lsbCBoYXZlLiAqKVxuICAgICAgJiYgbm90IChUYWdfcHJlZGljYXRlLmVudGlyZV9tb2R1bGVfZGlzYWJsZWQgd2hpY2hfdGFncyB+cGFydGlhbF90YWdzKVxuICAgIGluXG4gICAgaWYgc2hvdWxkX3J1biB0aGVuIGJlZ2luXG4gICAgICBtYXRjaCB3aGF0X3RvX2RvIHdpdGhcbiAgICAgIHwgYExpc3RfcGFydGl0aW9ucyAtPiBQYXJ0aXRpb24uZm91bmRfdGVzdCAoKVxuICAgICAgfCBgUnVuX3BhcnRpdGlvbiBwYXJ0aXRpb24gLT5cbiAgICAgICAgaWYgUGFydGl0aW9uLmlzX2N1cnJlbnQgcGFydGl0aW9uIHRoZW4gYmVnaW5cbiAgICAgICAgICBpbmNyIHRlc3RfbW9kdWxlc19yYW47XG4gICAgICAgICAgbGV0IGRlc2NyID0gZGVzY3IgKCkgaW5cbiAgICAgICAgICBtYXRjaFxuICAgICAgICAgICAgTW9kdWxlX2NvbnRleHQud2l0aF8gfmRlc2NyIH50YWdzIChmdW4gKCkgLT5cbiAgICAgICAgICAgICAgKCogV2UgZG8gbm90IHJlc2V0IHJhbmRvbSBzdGF0ZXMgdXBvbiBlbnRlcmluZyBbbGV0JXRlc3RfbW9kdWxlXS5cblxuICAgICAgICAgICAgICAgICBDb246IENvZGUgaW4gdGVzdCBtb2R1bGVzIGNhbiBhY2NpZGVudGFsbHkgZGVwZW5kIG9uIHRvcC1sZXZlbCByYW5kb21cbiAgICAgICAgICAgICAgICAgc3RhdGUgZWZmZWN0cy5cblxuICAgICAgICAgICAgICAgICBQcm9zOiAoMSkgV2UgZG9uJ3QgcmVzZXQgdG8gdGhlIHNhbWUgc2VlZCBvbiBlbnRlcmluZyBhIFtsZXQldGVzdF9tb2R1bGVdXG4gICAgICAgICAgICAgICAgIGFuZCB0aGVuIGEgW2xldCV0ZXN0XSBpbnNpZGUgdGhhdCBtb2R1bGUsIHdoaWNoIGNvdWxkIGxlYWQgdG9cbiAgICAgICAgICAgICAgICAgYWNjaWRlbnRhbGx5IHJhbmRvbWx5IGdlbmVyYXRpbmcgdGhlIHNhbWUgdmFsdWVzIGluIHNvbWUgdGVzdC4gKDIpIE1vdmluZ1xuICAgICAgICAgICAgICAgICBjb2RlIGludG8gYW5kIG91dCBvZiBbbGV0JXRlc3RfbW9kdWxlXSBkb2VzIG5vdCBjaGFuZ2UgaXRzIHJhbmRvbSBzZWVkLlxuICAgICAgICAgICAgICAqKVxuICAgICAgICAgICAgICB0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV9zZWVkcyBmKVxuICAgICAgICAgIHdpdGhcbiAgICAgICAgICB8IE9rICgpIC0+ICgpXG4gICAgICAgICAgfCBFcnJvciAoZXhuLCBiYWNrdHJhY2UpIC0+XG4gICAgICAgICAgICBpbmNyIHRlc3RfbW9kdWxlc19mYWlsZWQ7XG4gICAgICAgICAgICBsZXQgYmFja3RyYWNlID0gaHVtX2JhY2t0cmFjZSBiYWNrdHJhY2UgaW5cbiAgICAgICAgICAgIGxldCBleG5fc3RyID0gU2V4cGxpYjAuU2V4cF9jb252LnByaW50ZXhjX3ByZWZlcl9zZXhwIGV4biBpblxuICAgICAgICAgICAgbGV0IHNlcCA9IGlmIFN0cmluZy5jb250YWlucyBleG5fc3RyICdcXG4nIHRoZW4gXCJcXG5cIiBlbHNlIFwiIFwiIGluXG4gICAgICAgICAgICBlcHJpbnRmX29yX2RlbGF5IChcIlRFU1wiIF5eIFwiVF9NT0RVTEUgYXQgJXMgdGhyZXclcyVzLlxcbiVzJXNcXG4lIVwiKVxuICAgICAgICAgICAgICAoU3RyaW5nLnVuY2FwaXRhbGl6ZV9hc2NpaSBkZXNjcikgc2VwIGV4bl9zdHIgYmFja3RyYWNlIChzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyICgpKVxuICAgICAgICBlbmRcbiAgICBlbmRcblxubGV0IHN1bW1hcml6ZSAoKSA9XG4gIG1hdGNoIEFjdGlvbi5nZXQgKCkgd2l0aFxuICB8IGBJZ25vcmUgLT5cbiAgICBpZiBTeXMuYXJndiA8PiBbfHxdICYmIEZpbGVuYW1lLmJhc2VuYW1lIFN5cy5hcmd2LigwKSA9IFwiaW5saW5lX3Rlc3RzX3J1bm5lci5leGVcIiB0aGVuXG4gICAgICBQcmludGYuZXByaW50ZiBcImlubGluZV90ZXN0c19ydW5uZXIuZXhlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBydW4gYnkgaGFuZCwgeW91IFxcblxcXG4gICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHJ1biB0aGUgaW5saW5lX3Rlc3RzX3J1bm5lciBzY3JpcHQgaW5zdGVhZC5cXG4lIVwiXG4gICAgZWxzZVxuICAgICAgUHJpbnRmLmVwcmludGYgXCJZb3UgYXJlIGRvaW5nIHNvbWV0aGluZyB1bmV4cGVjdGVkIHdpdGggdGhlIHRlc3RzLiBObyB0ZXN0cyBoYXZlIFxcblxcXG4gICAgICAgICAgICAgICAgICAgICAgYmVlbiBydW4uIFlvdSBzaG91bGQgdXNlIHRoZSBpbmxpbmVfdGVzdHNfcnVubmVyIHNjcmlwdCB0byBydW4gXFxuXFxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy5cXG4lIVwiO1xuICAgIFRlc3RfcmVzdWx0LkVycm9yXG4gIHwgYFRlc3RfbW9kZSB7IHdoaWNoX3Rlc3RzID0gXzsgd2hhdF90b19kbyA9IGBMaXN0X3BhcnRpdGlvbnMgfSAtPlxuICAgIExpc3QuaXRlciAoUHJpbnRmLnByaW50ZiBcIiVzXFxuXCIpIChQYXJ0aXRpb24uYWxsICgpKTtcbiAgICBUZXN0X3Jlc3VsdC5TdWNjZXNzXG4gIHwgYFRlc3RfbW9kZSB7IHdoYXRfdG9fZG8gPSBgUnVuX3BhcnRpdGlvbiBfOyB3aGljaF90ZXN0cyB9IC0+IGJlZ2luXG4gICAgICBiZWdpbiBtYXRjaCAhbG9nIHdpdGhcbiAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgfCBTb21lIGNoIC0+IGNsb3NlX291dCBjaFxuICAgICAgZW5kO1xuICAgICAgcHJpbnRfZGVsYXllZF9lcnJvcnMgKCk7XG4gICAgICBtYXRjaCAhdGVzdHNfZmFpbGVkLCAhdGVzdF9tb2R1bGVzX2ZhaWxlZCB3aXRoXG4gICAgICB8IDAsIDAgLT4gYmVnaW5cbiAgICAgICAgICBpZiAhc2hvd19jb3VudHMgdGhlbiBiZWdpblxuICAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCIlZCB0ZXN0cyByYW4sICVkIHRlc3RfbW9kdWxlcyByYW5cXG4lIVwiICF0ZXN0c19yYW4gIXRlc3RfbW9kdWxlc19yYW5cbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgbGV0IGVycm9ycyA9XG4gICAgICAgICAgICBsZXQgdW51c2VkX3Rlc3RzID1cbiAgICAgICAgICAgICAgTGlzdC5maWx0ZXIgKGZ1biAoXywgXywgdXNlZCkgLT4gbm90ICF1c2VkKSB3aGljaF90ZXN0cy5vbmx5X3Rlc3RfbG9jYXRpb25cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBtYXRjaCB1bnVzZWRfdGVzdHMgd2l0aFxuICAgICAgICAgICAgfCBbXSAtPiBOb25lXG4gICAgICAgICAgICB8IF8gOjogXyAtPiBTb21lIHVudXNlZF90ZXN0c1xuICAgICAgICAgIGluXG4gICAgICAgICAgbWF0Y2ggZXJyb3JzIHdpdGhcbiAgICAgICAgICB8IFNvbWUgdGVzdHMgLT5cbiAgICAgICAgICAgIFByaW50Zi5lcHJpbnRmIFwicHB4X2lubGluZV90ZXN0IGVycm9yOiB0aGUgZm9sbG93aW5nIC1vbmx5LXRlc3QgZmxhZ3MgbWF0Y2hlZCBub3RoaW5nOlwiO1xuICAgICAgICAgICAgTGlzdC5pdGVyIChmdW4gKGZpbGVuYW1lLCBsaW5lX251bWJlcl9vcHQsIF8pIC0+XG4gICAgICAgICAgICAgIG1hdGNoIGxpbmVfbnVtYmVyX29wdCB3aXRoXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBQcmludGYuZXByaW50ZiBcIiAlc1wiIGZpbGVuYW1lXG4gICAgICAgICAgICAgIHwgU29tZSBsaW5lX251bWJlciAtPiBQcmludGYuZXByaW50ZiBcIiAlczolZFwiIGZpbGVuYW1lIGxpbmVfbnVtYmVyXG4gICAgICAgICAgICApIHRlc3RzO1xuICAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCIuXFxuJSFcIjtcbiAgICAgICAgICAgIFRlc3RfcmVzdWx0LkVycm9yXG4gICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBpZiAhdGVzdHNfcmFuID0gMCAmJiAhc3RyaWN0IHRoZW4gYmVnaW5cbiAgICAgICAgICAgICAgUHJpbnRmLmVwcmludGYgXCJwcHhfaW5saW5lX3Rlc3QgZXJyb3I6IG5vIHRlc3RzIGhhdmUgYmVlbiBydW4uXFxuJSFcIjtcbiAgICAgICAgICAgICAgVGVzdF9yZXN1bHQuRXJyb3JcbiAgICAgICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIFRlc3RfcmVzdWx0LlN1Y2Nlc3NcbiAgICAgICAgICAgIGVuZFxuICAgICAgICBlbmRcbiAgICAgIHwgY291bnQsIGNvdW50X3Rlc3RfbW9kdWxlcyAtPlxuICAgICAgICBQcmludGYuZXByaW50ZiBcIkZBSUxFRCAlZCAvICVkIHRlc3RzJXNcXG4lIVwiIGNvdW50ICF0ZXN0c19yYW5cbiAgICAgICAgICAoaWYgY291bnRfdGVzdF9tb2R1bGVzID0gMCB0aGVuIFwiXCIgZWxzZSBQcmludGYuc3ByaW50ZiAoXCIsICVkIFRFU1wiIF5eIFwiVF9NT0RVTEVTXCIpIGNvdW50X3Rlc3RfbW9kdWxlcyk7XG4gICAgICAgIFRlc3RfcmVzdWx0LkZhaWx1cmVcbiAgICBlbmRcblxubGV0IHVzZV9jb2xvciA9ICF1c2VfY29sb3JcbmxldCBpbl9wbGFjZSAgPSAhaW5fcGxhY2VcbmxldCBkaWZmX2NvbW1hbmQgPSAhZGlmZl9jb21tYW5kXG5sZXQgc291cmNlX3RyZWVfcm9vdCA9ICFzb3VyY2VfdHJlZV9yb290XG5sZXQgYWxsb3dfb3V0cHV0X3BhdHRlcm5zID0gIWFsbG93X291dHB1dF9wYXR0ZXJuc1xuXG5sZXQgZXZhbHVhdG9ycyA9IHJlZiBbc3VtbWFyaXplXVxubGV0IGFkZF9ldmFsdWF0b3IgfmYgPSBldmFsdWF0b3JzIDo9IGYgOjogIWV2YWx1YXRvcnNcbmxldCBleGl0ICgpID1cbiAgTGlzdC5tYXAgKGZ1biBmIC0+IGYgKCkpIChMaXN0LnJldiAhZXZhbHVhdG9ycylcbiAgfD4gVGVzdF9yZXN1bHQuY29tYmluZV9hbGxcbiAgfD4gVGVzdF9yZXN1bHQudG9fZXhpdF9jb2RlXG4gIHw+IGV4aXRcbiIsInR5cGUgdFxuXG5sZXQgYWJzdXJkIChfOiB0KTogJ2EgPVxuICAgIGFzc2VydCBmYWxzZVxuIiwiaW5jbHVkZSBTdGRsaWIuU3RyaW5nXG5cbmxldCBvbmUgKGM6Y2hhcik6IHN0cmluZyA9XG4gICAgbWFrZSAxIGNcblxuXG5cblxubGV0IGlzX3ByZWZpeCAoYTogc3RyaW5nKSAoYjpzdHJpbmcpOiBib29sID1cbiAgICBsZXQgbGVuX2EgPSBsZW5ndGggYSBpblxuICAgIGxlbl9hIDw9IGxlbmd0aCBiICYmIGEgPSBzdWIgYiAwIGxlbl9hXG5cblxuXG5sZXQgaXNfc3VmZml4IChhOiBzdHJpbmcpIChiOnN0cmluZyk6IGJvb2wgPVxuICAgIGxldCBsZW5fYSA9IGxlbmd0aCBhXG4gICAgYW5kIGxlbl9iID0gbGVuZ3RoIGJcbiAgICBpblxuICAgIGxlbl9hIDw9IGxlbl9iXG4gICAgJiYgYSA9IHN1YiBiICAobGVuX2IgLSBsZW5fYSkgbGVuX2FcblxuXG5cblxuXG5sZXQgZmluZCAoZjpjaGFyIC0+IGJvb2wpIChzdGFydDppbnQpIChzOnN0cmluZyk6IGludCA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCBzIGluXG4gICAgbGV0IHJlYyBmaW5kIGkgPVxuICAgICAgICBpZiBpID0gbGVuIHx8IGYgKGdldCBzIGkpIHRoZW5cbiAgICAgICAgICAgIGlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZCAoaSsxKVxuICAgIGluXG4gICAgZmluZCBzdGFydFxuXG5cbmxldCBoYXMgKGY6IGNoYXIgLT4gYm9vbCkgKHN0YXJ0OiBpbnQpIChzOiBzdHJpbmcpOiBib29sID1cbiAgICBmaW5kIGYgc3RhcnQgc1xuICAgIDxcbiAgICBsZW5ndGggc1xuXG5cbmxldCBmaW5kX2J3ZCAoZjogY2hhciAtPiBib29sKSAoYmV5b25kOiBpbnQpIChzOiBzdHJpbmcpOiBpbnQgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggc1xuICAgIGluXG4gICAgbGV0IGJleW9uZCA9XG4gICAgICAgIGlmIGJleW9uZCA8IDAgfHwgbGVuIDwgYmV5b25kIHRoZW5cbiAgICAgICAgICAgIGxlblxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBiZXlvbmRcbiAgICBpblxuICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSA9IDAgfHwgZiAoZ2V0IHMgKGkgLSAxKSkgdGhlblxuICAgICAgICAgICAgaSAtIDFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZCAoaSAtIDEpXG4gICAgaW5cbiAgICBmaW5kIGJleW9uZFxuXG5cblxubGV0IGxpc3QgKHM6c3RyaW5nKTogY2hhciBsaXN0ID1cbiAgICBsZXQgcmVjIGxpc3QgY3MgaSA9XG4gICAgICAgIGlmIGkgPSAwIHRoZW5cbiAgICAgICAgICAgIGNzXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBqID0gaSAtIDEgaW5cbiAgICAgICAgICAgIGxpc3QgKGdldCBzIGogOjogY3MpIGpcbiAgICBpblxuICAgIGxpc3QgW10gKGxlbmd0aCBzKVxuXG5cbmxldCBvZl9saXN0IChjczpjaGFyIGxpc3QpOiBzdHJpbmcgPVxuICAgIGxldCByZWMgc3RyIGNzIGkgPVxuICAgICAgICBtYXRjaCBjcyB3aXRoXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgIEJ5dGVzLmNyZWF0ZSBpXG4gICAgICAgIHwgYzo6Y3MgLT5cbiAgICAgICAgICAgIGxldCBicyA9IHN0ciBjcyAoaSsxKSBpblxuICAgICAgICAgICAgQnl0ZXMuc2V0IGJzIGkgYztcbiAgICAgICAgICAgIGJzXG4gICAgaW5cbiAgICBsZXQgYnMgPSBzdHIgY3MgMCBpblxuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnNcblxuXG5cbmxldCByZXZlcnNlIChzOiBzdHJpbmcpOiBzdHJpbmcgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggcyBpblxuICAgIGluaXQgbGVuIChmdW4gaSAtPiBnZXQgcyAobGVuIC0gMSAtIGkpKVxuXG5cbm1vZHVsZSBUb19zb3VyY2UgPVxuc3RydWN0XG4gICAgdHlwZSBpdGVtID0gY2hhclxuXG4gICAgdHlwZSB0ID0gaW50ICogc3RyaW5nXG5cbiAgICBsZXQgaGFzX21vcmUgKChpLHMpOiB0KTogYm9vbCA9XG4gICAgICAgIGkgPCBsZW5ndGggc1xuXG4gICAgbGV0IHBlZWsgKChpLHMpOiB0KTogY2hhciA9XG4gICAgICAgIGFzc2VydCAoaGFzX21vcmUgKGkscykpO1xuICAgICAgICBnZXQgcyBpXG5cbiAgICBsZXQgYWR2YW5jZSAoKGkscykpOiB0ID1cbiAgICAgICAgYXNzZXJ0IChoYXNfbW9yZSAoaSwgcykpO1xuICAgICAgICAoaSArIDEsIHMpXG5cbiAgICBsZXQgbWFrZSAoczogc3RyaW5nKTogdCA9XG4gICAgICAgICgwLCBzKVxuZW5kXG5cblxuXG5tb2R1bGUgRnJvbV9zb3VyY2UgKFI6IEludGVyZmFjZXMuU09VUkNFIHdpdGggdHlwZSBpdGVtID0gY2hhcikgPVxuc3RydWN0XG4gICAgbGV0IG1ha2Vfd2l0aF9zaXplIChlc3RpbWF0ZTogaW50KSAocjogUi50KTogdCA9XG4gICAgICAgIGxldCBlc3RpbWF0ZSA9XG4gICAgICAgICAgICBpZiBlc3RpbWF0ZSA8PSAwIHRoZW5cbiAgICAgICAgICAgICAgICA4MFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVzdGltYXRlXG4gICAgICAgIGluXG4gICAgICAgIGxldCBidWZmZXIgICA9IHJlZiAoQnl0ZXMuY3JlYXRlIGVzdGltYXRlKVxuICAgICAgICBhbmQgbGVuICAgICAgPSByZWYgMFxuICAgICAgICBhbmQgY2FwYWNpdHkgPSByZWYgZXN0aW1hdGVcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG1ha2Vfcm9vbSAoKSA9XG4gICAgICAgICAgICBpZiAhbGVuID0gIWNhcGFjaXR5IHRoZW5cbiAgICAgICAgICAgICAgICBsZXQgYm5ldyA9IEJ5dGVzLmNyZWF0ZSAoMiAqICFjYXBhY2l0eSkgaW5cbiAgICAgICAgICAgICAgICBiZWdpblxuICAgICAgICAgICAgICAgICAgICBCeXRlcy5ibGl0ICFidWZmZXIgMCBibmV3IDAgIWxlbjtcbiAgICAgICAgICAgICAgICAgICAgYnVmZmVyIDo9IGJuZXc7XG4gICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5IDo9IDIgKiAhY2FwYWNpdHlcbiAgICAgICAgICAgICAgICBlbmRcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHB1c2ggYyA9XG4gICAgICAgICAgICBtYWtlX3Jvb20gKCk7XG4gICAgICAgICAgICBCeXRlcy5zZXQgIWJ1ZmZlciAhbGVuIGM7XG4gICAgICAgICAgICBsZW4gOj0gIWxlbiArIDE7XG4gICAgICAgIGluXG4gICAgICAgIGxldCByZWMgcmVjdXJzZSByID1cbiAgICAgICAgICAgIGlmIFIuaGFzX21vcmUgciB0aGVuXG4gICAgICAgICAgICAgICAgYmVnaW5cbiAgICAgICAgICAgICAgICAgICAgcHVzaCAoUi5wZWVrIHIpO1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNlIChSLmFkdmFuY2UgcilcbiAgICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBCeXRlcy5zdWJfc3RyaW5nICFidWZmZXIgMCAhbGVuXG4gICAgICAgIGluXG4gICAgICAgIHJlY3Vyc2UgclxuXG4gICAgbGV0IG1ha2UgKHI6IFIudCk6IHQgPVxuICAgICAgICBtYWtlX3dpdGhfc2l6ZSAxMDAgclxuZW5kXG5cblxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHN0ciA9IFwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTJcIiBpblxuICAgIGxldCBtb2R1bGUgRnJvbSA9IEZyb21fc291cmNlIChUb19zb3VyY2UpIGluXG4gICAgc3RyID0gRnJvbS5tYWtlX3dpdGhfc2l6ZSAyIChUb19zb3VyY2UubWFrZSBzdHIpXG4iLCIoKiogQSBzbWFsbCB3cmFwcGVyIGFyb3VuZCBbU3RkbGliLlN0cmluZ10gd2l0aCBzb21lIGV4dHJhIGZ1bmN0aW9ucy5cblxuICAgIFVzZSBbU3RkbGliLlN0cmluZ10gaWYgeW91IG5lZWQgZnVuY3Rpb25zIGZyb20gdGhlIG9jYW1sIHN0YW5kYXJkIGxpYnJhcnlcbiAgICB3aGljaCBhcmUgbm90IGluIHRoaXMgbW9kdWxlLlxuKilcblxuXG5cblxudHlwZSB0ID0gc3RyaW5nXG4oKiogQSBzdGFuZGFyZCBvY2FtbCBzdHJpbmcuICopXG5cblxudmFsIGlzX3ByZWZpeDogdCAtPiB0IC0+IGJvb2xcbigqKiBbaXNfcHJlZml4IGEgYl0gSXMgW2FdIGEgcHJlZml4IG9mIFtiXT8gKilcblxudmFsIGlzX3N1ZmZpeDogdCAtPiB0IC0+IGJvb2xcbigqKiBbaXNfc3VmZml4IGEgYl0gSXMgW2FdIGEgc3VmZml4IG9mIFtiXT8gKilcblxuXG52YWwgcmV2ZXJzZTogdCAtPiB0XG4oKiogW3JldmVyc2Ugc10gcmV2ZXJzZXMgdGhlIHN0cmluZyBbc10uICopXG5cblxudmFsIGNvbXBhcmU6IHQgLT4gdCAtPiBpbnRcbigqKiBbY29tcGFyZSBzMSBzMl0gQ29tcGFyZSB0aGUgc3RyaW5ncyBbczFdIGFuZCBbczJdLlxuXG4gICAgUmV0dXJuIFstMV0sIGlmIFtzMV0gaXMgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlciB0aGFuIFtzMl1cbiAgICBSZXR1cm4gWzBdLCAgaWYgYm90aCBzdHJpbmcgYXJlIGVxdWFsXG4gICAgUmV0dXJuIFsrMV0sIGlmIFtzMV0gaXMgbGV4aWNvZ3JhcGhpY2FsbHkgZ3JlYXRlciB0aGFuIFtzMl1cbiopXG5cblxudmFsIG9uZTogY2hhciAtPiB0XG4oKiogW29uZSBjXSBBIHN0cmluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgW2NdIGFzIHRoZSBvbmx5IGNoYXJhY3Rlci4gKilcblxuXG5cbnZhbCBmaW5kOiAoY2hhciAtPiBib29sKSAtPiBpbnQgLT4gdCAtPiBpbnRcbigqKiBbZmluZCBwIHN0YXJ0IHN0cl0gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBzdGFydGluZyBmcm9tXG4gICAgW3N0YXJ0XSBpbiB0aGUgc3RyaW5nIFtzdHJdIHdoaWNoIHNhdGlzZmllcyB0aGUgcHJlZGljYXRlIFtwXS4gSWYgbm9cbiAgICBjaGFyYWN0ZXIgY2FuIGJlIGZvdW5kIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG4qKVxuXG5cbnZhbCBoYXM6ICAoY2hhciAtPiBib29sKSAtPiBpbnQgLT4gdCAtPiBib29sXG4oKiogW2hhcyBwIHN0YXJ0IHN0cl0gRG9lcyB0aGUgc3RyaW5nIFtzdHJdIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gW3N0YXJ0XSBoYXZlXG4gICAgYSBjaGFyYWN0ZXIgc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlIFtwXT8gKilcblxuXG52YWwgZmluZF9id2Q6IChjaGFyIC0+IGJvb2wpIC0+IGludCAtPiB0IC0+IGludFxuKCoqIFtmaW5kX2J3ZCBwIGJleW9uZCBzdHJdIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVmb3JlXG4gICAgW2JleW9uZF0gaW4gdGhlIHN0cmluZyBbc3RyXSB3aGljaCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSBbcF0uIFJldHVybiBbLTFdLFxuICAgIGlmIG5vIGNoYXJhY3RlciBjYW4gYmUgZm91bmQuICopXG5cblxudmFsIGxpc3Q6IHQgLT4gY2hhciBsaXN0XG4oKiogW2xpc3Qgc3RyXSBDb252ZXJ0IHRoZSBzdHJpbmcgW3N0cl0gdG8gYSBsaXN0IG9mIGNoYXJhY3RlcnMuICopXG5cbnZhbCBvZl9saXN0OiBjaGFyIGxpc3QgLT4gdFxuKCoqIFtvZl9saXN0IGxdIENvbnZlcnQgdGhlIGxpc3QgW2xdIG9mIGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcuICopXG5cblxudmFsIGxlbmd0aDogdCAtPiBpbnRcbigqKiBbbGVuZ3RoIHN0cl0gVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIFtzdHJdLiAqKVxuXG5cbnZhbCBnZXQ6IHQgLT4gaW50IC0+IGNoYXJcbigqKiBbZ2V0IHN0ciBpXSBUaGUgW2lddGggY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgW3N0cl0uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8IGxlbmd0aCBzdHJdXG4qKVxuXG5cbnZhbCBzdWI6IHQgLT4gaW50IC0+IGludCAtPiB0XG4oKiogW3N1YiBzdHIgc3RhcnQgbGVuXSBUaGUgc3Vic3RyaW5nIG9mIFtzdHJdIHN0YXJ0aW5nIGF0IFtzdGFydF0gd2l0aCBsZW5ndGhcbiAgICBbbGVuXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gc3RhcnQgPD0gc3RhcnQgKyBsZW4gPD0gbGVuZ3RoIHN0cl1cbiopXG5cblxudmFsIGNvbmNhdDogc3RyaW5nIC0+IHN0cmluZyBsaXN0IC0+IHN0cmluZ1xuKCoqIFtjb25jYXQgc2VwIHN0cl9saXN0XSBDb25jYXRlbmF0ZSB0aGUgc3RyaW5ncyBpbiB0aGUgc3RyaW5nIGxpc3QgW3N0cl9saXN0XVxuICAgIGFuZCBwdXQgdGhlIHNlcGFyYXRvciBbc2VwXSBiZXR3ZWVuIHRoZW0uXG4qKVxuXG5cbnZhbCBzcGxpdF9vbl9jaGFyOiBjaGFyIC0+IHN0cmluZyAtPiBzdHJpbmcgbGlzdFxuKCoqIFtzcGxpdF9vbl9jaGFyIGMgc3RyXSBTcGxpdCB0aGUgc3RyaW5nIFtzdHJdIG9uIGVhY2ggb2NjdXJyZW5jZSBvZiB0aGVcbiAgICBjaGFyYWN0ZXIgW2NdIGludG8gYSBsaXN0IG9mIHN0cmluZ3MuXG4qKVxuXG5cbnZhbCBtYWtlOiBpbnQgLT4gY2hhciAtPiB0XG4oKiogW21ha2UgbiBjXSBNYWtlIGEgc3RyaW5nIHdpdGggW25dIGNvcGllcyBvZiB0aGUgY2hhcmFjdGVyIFtjXS4gKilcblxuXG52YWwgaW5pdDogaW50IC0+IChpbnQgLT4gY2hhcikgLT4gdFxuKCoqIFtpbml0IG4gZl0gTWFrZSBhIHN0cmluZyBvZiBsZW5ndGggW25dIHdoZXJlIHRoZSBbaV10aCBjaGFyYWN0ZXIgaXMgW2YgaV0uXG4qKVxuXG5cblxuXG5cbigqKiBDb252ZXJzaW9uIG9mIGEgc3RyaW5nIHRvIGEgc291cmNlIG9mIGNoYXJhY3RlcnMuICopXG5tb2R1bGUgVG9fc291cmNlOlxuc2lnXG4gICAgaW5jbHVkZSBJbnRlcmZhY2VzLlNPVVJDRSB3aXRoIHR5cGUgaXRlbSA9IGNoYXJcblxuICAgIHZhbCBtYWtlOiBzdHJpbmcgLT4gdFxuICAgICgqKiBbbWFrZSBzdHJdIEEgY2hhcmFjdGVyIHN0cmVhbSBnZW5lcmF0ZWQgZnJvbSB0aGUgc3RyaW5nIFtzdHJdLiAqKVxuZW5kXG5cblxuXG4oKiogQ29udmVyc2lvbiBvZiBhIHNvdXJjZSBvZiBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nLiAqKVxubW9kdWxlIEZyb21fc291cmNlIChTOiBJbnRlcmZhY2VzLlNPVVJDRSB3aXRoIHR5cGUgaXRlbSA9IGNoYXIpOlxuc2lnXG4gICAgdmFsIG1ha2U6IFMudCAtPiB0XG4gICAgKCoqIFttYWtlIHNdIENvbnZlcnQgdGhlIHN0cmVhbSBbc10gb2YgY2hhcmFjdGVycyB0byBhIHN0cmluZy4gKilcblxuXG4gICAgdmFsIG1ha2Vfd2l0aF9zaXplOiBpbnQgLT4gUy50IC0+IHRcbiAgICAoKiogW21ha2Vfd2l0aF9zaXplIG4gc10gQ29udmVydCB0aGUgc3RyZWFtIFtzXSBvZiBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nXG4gICAgICAgIHdoZXJlIFtuXSBpcyBhbiBlc3RpbWF0ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuXG5cbiAgICAgICAgVGhlIGZ1bmN0aW9uIHdvcmtzIGludGVybmFsbHkgd2l0aCBhIGJ1ZmZlci4gW25dIGlzIHVzZWQgdG8gZ3VpZGUgdGhlXG4gICAgICAgIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCB0aGUgcmVzaXppbmcgb2YgdGhlIGJ1ZmZlci4gVGhlIGJldHRlciB0aGVcbiAgICAgICAgZXN0aW1hdGUsIHRoZSBmZXdlciBidWZmZXIgYWxsb2NhdGlvbnMgYW5kIHJlc2l6ZXMgYXJlIG5lY2Vzc2FyeS5cbiAgICAqKVxuZW5kXG4iLCJ0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlKSByZXN1bHRcblxuXG5sZXQgcmV0dXJuIChhOiAnYSk6ICgnYSwgJ2UpIHQgPVxuICAgIE9rIGFcblxuXG5sZXQgZmFpbCAoZTogJ2UpOiAoJ2EsICdlKSB0ID1cbiAgICBFcnJvciBlXG5cblxuXG5sZXQgdG9fb3B0aW9uIChyOiAoJ2EsIF8pIHQpOiAnYSBvcHRpb24gPVxuICAgIG1hdGNoIHIgd2l0aFxuICAgIHwgT2sgYSAtPlxuICAgICAgICBTb21lIGFcbiAgICB8IEVycm9yIF8gLT5cbiAgICAgICAgTm9uZVxuXG5cbmxldCAoPj49KSAobTogKCdhLCAnZSkgdCkgKGY6ICdhIC0+ICgnYiwgJ2UpIHQpOiAoJ2IsICdlKSB0ID1cbiAgICBtYXRjaCBtIHdpdGhcbiAgICB8IE9rIGEgLT5cbiAgICAgICAgZiBhXG4gICAgfCBFcnJvciBlIC0+XG4gICAgICAgIEVycm9yIGVcblxubGV0ICggbGV0KiApID0gKD4+PSlcblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYik6ICgnYSwgJ2UpIHQgLT4gKCdiLCAnZSkgdCA9IGZ1bmN0aW9uXG4gICAgfCBPayBhIC0+XG4gICAgICAgIE9rIChmIGEpXG5cbiAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgRXJyb3IgZVxuXG5cblxubGV0IG1hcF9lcnJvciAoZjogJ2UgLT4gJ2YpOiAoJ2EsICdlKSB0IC0+ICgnYSwgJ2YpIHQgPSBmdW5jdGlvblxuICAgIHwgT2sgYSAtPlxuICAgICAgICBPayBhXG5cbiAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgRXJyb3IgKGYgZSlcblxuXG5sZXQgZ2V0OiAoJ2EsIFZvaWQudCkgdCAtPiAnYSA9IGZ1bmN0aW9uXG4gICAgfCBPayBhIC0+XG4gICAgICAgIGFcblxuICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICBWb2lkLmFic3VyZCBlXG5cblxuXG5cblxubW9kdWxlIE1vbmFkIChFOiBJbnRlcmZhY2VzLkFOWSkgPVxuc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gKCdhLCBFLnQpIHJlc3VsdFxuXG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuXG4gICAgbGV0IGZhaWwgPSBmYWlsXG5cbiAgICBsZXQgdG9fb3B0aW9uID0gdG9fb3B0aW9uXG5cbiAgICBsZXQgKD4+PSkgID0gKD4+PSlcblxuICAgIGxldCAoIGxldCogKSA9ICg+Pj0pXG5lbmRcblxuXG5cbigqIFVuaXQgdGVzdHMgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAnYSByID0gKCdhLCBzdHJpbmcpIHJlc3VsdFxuXG5sZXQgYWRkIChhOiBpbnQgcikgKGI6IGludCByKTogaW50IHIgPVxuICAgIGxldCogeCA9IGEgaW5cbiAgICBsZXQqIHkgPSBiIGluXG4gICAgT2sgKHggKyB5KVxuXG5sZXQgZGl2aWRlIChhOiBpbnQgcikgKGI6IGludCByKTogaW50IHIgPVxuICAgIGxldCogeCA9IGEgaW5cbiAgICBsZXQqIHkgPSBiIGluXG4gICAgaWYgeSA9IDAgdGhlblxuICAgICAgICBFcnJvciBcIkRpdmlzaW9uIGJ5IFplcm9cIlxuICAgIGVsc2VcbiAgICAgICAgT2sgKHggLyB5KVxuXG5sZXQldGVzdCBfID1cbiAgICBhZGQgKE9rIDEpIChkaXZpZGUgKE9rIDIpIChPayAwKSlcbiAgICA9XG4gICAgRXJyb3IgXCJEaXZpc2lvbiBieSBaZXJvXCJcblxubGV0JXRlc3QgXyA9XG4gICAgYWRkIChPayAxKSAoZGl2aWRlIChPayAxMCkgKE9rIDIpKVxuICAgID1cbiAgICBPayA2XG4iLCJpbmNsdWRlIFN0ZGxpYi5JbnRcblxuXG5sZXQgaXRlcmF0ZSAobjogdCkgKGY6ICdhIC0+ICdhKSAoc3RhcnQ6ICdhKTogJ2EgPVxuICAgIGxldCByZWMgaXRlciBuIHYgPVxuICAgICAgICBpZiBuID0gMCB0aGVuXG4gICAgICAgICAgICB2XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGl0ZXIgKG4gLSAxKSAoZiB2KVxuICAgIGluXG4gICAgaXRlciBuIHN0YXJ0XG4iLCJ0eXBlICdhIHQgPSAnYSBvcHRpb25cblxubGV0IHJldHVybiAoYTogJ2EpOiAnYSB0ID1cbiAgICBTb21lIGFcblxubGV0IGZhaWw6ICdhIHQgPVxuICAgIE5vbmVcblxuXG5sZXQgKGxldCogKSAobTogJ2EgdCkgKGY6ICdhIC0+ICdiIHQpOiAnYiB0ID1cbiAgICBtYXRjaCBtIHdpdGhcbiAgICB8IFNvbWUgYSAtPlxuICAgICAgICBmIGFcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTm9uZVxuXG5cbmxldCAoPj49KSA9IChsZXQqIClcblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYikgKG06ICdhIHQpOiAnYiB0ID1cbiAgICBsZXQqIGEgPSBtIGluXG4gICAgcmV0dXJuIChmIGEpXG5cblxuXG5sZXQgdG9fbGlzdCAobTogJ2EgdCk6ICdhIGxpc3QgPVxuICAgIG1hdGNoIG0gd2l0aFxuICAgIHwgU29tZSBhIC0+XG4gICAgICAgIFthXVxuICAgIHwgTm9uZSAtPlxuICAgICAgICBbXVxuIiwiKCoqIEEgdGhpbiB3cmFwcGVyIGFyb3VuZCBbU3RkbGliLkFycmF5XSB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGFuZCBzZXRzIGFuZFxuICAgIG1hcHMgYmFzZWQgb24gYXJyYXlzXG5cbiAgICBVc2UgW1N0ZGxpYi5BcnJheV0gaW4gY2FzZSB5b3UgbmVlZCBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCBjb250YWluZWQgaW5cbiAgICB0aGlzIG1vZHVsZS4gVGhlcmUgYXJlIG5vIHByb2JsZW1zIHVzaW5nIFtGbWxpYl9zdGQuQXJyYXldIGFuZFxuICAgIFtTdGRsaWIuQXJyYXldLCBiZWNhdXNlIGJvdGggZGF0YXR5cGVzIGFyZSBpZGVudGljYWwuXG5cbiAgICBGdXRoZXJtb3JlIHRoZXJlIGFyZSB0aGUgbW9kdWxlcyBbU2V0XSBhbmQgW01hcF0gd2hpY2ggaW1wbGVtZW50IGZpbml0ZSBzZXRzXG4gICAgYW5kIGZpbml0ZSBtYXBzIGJhc2VkIG9uIHNvcnRlZCBhcnJheXMuIEZvciBzbWFsbCBzZXRzIGFuZCBtYXBzLCB0aGUgYXJyYXlcbiAgICBiYXNlZCBpbXBsZW1lbnRhdGlvbnMgYXJlIHN1cGVyaW9yIHRvIHRyZWUgYmFzZWQgaW1wbGVtZW50YXRpb25zIGxpa2UgYXZsXG4gICAgdHJlZXMgb3IgcmVkIGJsYWNrIHRyZWVzLCBiZWNhdXNlIHRoZXkgaGF2ZSBhIGJldHRlciBjYWNoZSBiZWhhdmlvdXIuXG4qKVxuXG5cblxuKCoqIHsxIEJhc2ljIEFycmF5IEZ1bmN0aW9uc30gKilcblxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxudmFsIGxlbmd0aDogJ2EgdCAtPiBpbnRcbigqKiBbbGVuZ3RoIGFycl0gVGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkgW2Fycl0uICopXG5cblxudmFsIHZhbGlkX2luZGV4OiBpbnQgLT4gJ2EgdCAtPiBib29sXG4oKiogW3ZhbGlkX2luZGV4IGkgYXJyXSBJcyBbaV0gYSB2YWxpZCBpbmRleCBpbnRvIHRoZSBhcnJheSBbYXJyXT8gKilcblxuXG52YWwgaXNfZW1wdHk6ICdhIHQgLT4gYm9vbFxuKCoqIElzIHRoZSBhcnJheSBlbXB0eT8gKilcblxuXG52YWwgaGFzX3NvbWU6ICdhIHQgLT4gYm9vbFxuKCoqIERvZXMgdGhlIGFycmF5IGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQ/ICopXG5cblxudmFsIGdldDogJ2EgdCAtPiBpbnQgLT4gJ2FcbigqKiBbZ2V0IGFyciBpXSBUaGUgW2lddGggZWxlbWVudCBvZiB0aGUgYXJyYXkgW2Fycl0uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8IGxlbmd0aCBbYXJyXV1cbiopXG5cblxudmFsIGZpcnN0OiAnYSB0IC0+ICdhXG4oKiogW2ZpcnN0IHhzXSBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgW3hzXS5cblxuICAgIFByZWNvbmRpdGlvbjogW2hhc19zb21lIHhzXVxuKilcblxuXG52YWwgbGFzdDogJ2EgdCAtPiAnYVxuKCoqIFtsYXN0IHhzXSBUaGUgbGFzdCBlbGVtZW50IG9mIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbaGFzX3NvbWUgeHNdXG4qKVxuXG5cblxuXG52YWwgc2V0OiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4oKiogW3NldCBhcnIgaSB2YWx1ZV0gU2V0IHRoZSBbaV10aCBlbGVtZW50IG9mIHRoZSBhcnJheSBbYXJyXSB0byBbdmFsdWVdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPCBsZW5ndGggW2Fycl1dXG4qKVxuXG5cbnZhbCBtYWtlOiBpbnQgLT4gJ2EgLT4gJ2EgdFxuKCoqIFNhbWUgYXMgU3RkbGliLkFycmF5Lm1ha2UgKilcblxuXG52YWwgaW5pdDogaW50IC0+IChpbnQgLT4gJ2EpIC0+ICdhIHRcbigqKiBTYW1lIGFzIFN0ZGxpYi5BcnJheS5pbml0ICopXG5cblxuXG52YWwgYXBwZW5kOiAnYSB0IC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFthcHBlbmQgeHMgeXNdIENvbmNhdGVuYXRlIHRoZSB0d28gYXJyYXlzIFt4c10gYW5kIFt5c10uICopXG5cblxuXG52YWwgaW5zZXJ0OiBpbnQgLT4gJ2EgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW2luc2VydCBpIHggeHNdIEluc2VydCB0aGUgZWxlbWVudCBbeF0gYXQgcG9zaXRpb24gW2ldIGludG8gdGhlIGFycmF5IFt4c10uXG5cbiAgICBNYWtlIHBsYWNlIGJ5IHB1c2hpbmcgdXAgdGhlIGVsZW1lbnRzIFtpXSwgW2kgKyAxXSwgLi4uIG9uZSBwb3NpdGlvbi5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDw9IGxlbmd0aCB4c10uXG4qKVxuXG5cblxudmFsIHJlcGxhY2U6IGludCAtPiAnYSAtPiAnYSB0IC0+ICdhIHRcbigqKiBbcmVwbGFjZSBpIHggeHNdIFJlcGxhY2UgdGhlIFtpXXRoIGVsZW1lbnQgb2YgW3hzXSBieSBbeF0uXG5cbiAgICBQcmVjb25kaXRpb24uIFswIDw9IGkgJiYgaSA8IGxlbmd0aCB4c11cbiopXG5cblxuXG52YWwgcmVtb3ZlOiBpbnQgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW3JlbW92ZSBpIHhzXSBSZW1vdmUgdGhlIFtpXXRoIGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkgW3hzXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDwgbGVuZ3RoIHhzXS5cbiopXG5cblxuXG52YWwgcmVtb3ZlX2ZpcnN0OiAnYSB0IC0+ICdhIHRcbigqKiBbcmVtb3ZlX2ZpcnN0IHhzXSBSZW1vdmUgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkgW3hzXS5cblxuICAgIFByZWNvbmRpdGlvbjogW2hhc19zb21lIHhzXVxuKilcblxuXG5cbnZhbCByZW1vdmVfbGFzdDogJ2EgdCAtPiAnYSB0XG4oKiogW3JlbW92ZV9sYXN0IHhzXSBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbaGFzX3NvbWUgeHNdXG4qKVxuXG5cblxudmFsIG1hcDogKCdhIC0+ICdiKSAtPiAnYSB0IC0+ICdiIHRcbigqKiBbbWFwIGYgYXJyXSBDcmVhdGUgYSBuZXcgYXJyYXkgYnkgbWFwcGluZyBhbGwgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgYnkgdGhlIGZ1bmN0aW9uIFtmXS5cbiopXG5cblxuXG52YWwgZm9sZF9sZWZ0OiAoJ2EgLT4gJ2IgLT4gJ2EpIC0+ICdhIC0+ICdiIHQgLT4gJ2FcbigqKiBbZm9sZF9sZWZ0IGYgc3RhcnQgYXJyXVxuXG4gICAgRm9sZCB0aGUgZm9sZGluZyBmdW5jdGlvbiBbZl0gd2l0aCBzdGFydCB2YWx1ZSBbc3RhcnRdIG92ZXIgdGhlIGFycmF5IFthcnJdLlxuXG4gICAgQ29tcHV0ZVxuICAgIHtbXG4gICAgICAgIChmICguLi4gKGYgKGYgc3RhcnQgYXJyLigwKSkgYXJyLigxKSkgLi4uKSBhcnIuKG4gLSAxKVxuICAgIF19XG5cbiAgICB3aGVyZSBbbiA9IGxlbmd0aCBhcnJdLlxuKilcblxuXG52YWwgZm9sZGlfbGVmdDogKCdhIC0+IGludCAtPiAnYiAtPiAnYSkgLT4gJ2EgLT4gJ2IgdCAtPiAnYVxuKCoqIFtmb2xkaV9sZWZ0IGYgc3RhcnQgYXJyXVxuXG4gICAgTGlrZSBbZm9sZF9sZWZ0XSB3aXRoIHRoZSBjdXJyZW50IGluZGV4IGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gdGhlXG4gICAgZm9sZGluZyBmdW5jdGlvbi5cbiopXG5cblxudmFsIGZvbGRfcmlnaHQ6ICgnYiAtPiAnYSAtPiAnYSkgLT4gJ2IgYXJyYXkgLT4gJ2EgLT4gJ2FcbigqKiBbZm9sZF9yaWdodCBmIGFyciBzdGFydF1cblxuICAgIENvbXB1dGVcbiAgICB7W1xuICAgICAgICBmIGFyci4oMCkgKGYgYXJyLigxKSAoIC4uLiAoZiBhcnIuKG4gLSAxKSBzdGFydCkgLi4uICkpXG4gICAgXX1cbiAgICB3aGVyZSBbbiA9IGxlbmd0aCBhcnJdXG4qKVxuXG5cbnZhbCBjb3B5OiAnYSB0IC0+ICdhIHRcbigqKiBNYWtlIGEgY29weSBvZiB0aGUgYXJyYXkuICopXG5cblxuXG52YWwgc3ViOiAnYSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgdFxuKCoqIFtzdWIgYXJyIHN0YXJ0IGxlbl0gVGhlIHN1YmFycmF5IG9mIFthcnJdIHN0YXJ0aW5nIGF0IFtzdGFydF0gd2l0aCBsZW5naHRcbiAgICBbbGVuXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gc3RhcnQgJiYgc3RhcnQgKyBsZW4gPD0gbGVuZ3RoIGFycl1cbiopXG5cblxuXG52YWwgYmxpdDogJ2EgdCAtPiBpbnQgLT4gJ2EgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbigqKiBbYmxpdCBzcmMgc3JjX3BvcyBkc3QgZHN0X3BvcyBsZW5dXG5cbiAgICBDb3B5IFtsZW5dIHZhbHVlcyBmcm9tIGFycmF5IFtzcmNdIHN0YXJ0aW5nIGF0IFtzcmNfcG9zXSB0byBhcnJheSBbZHN0XVxuICAgIHN0YXJ0aW5nIGF0IFtkc3RfcG9zXS5cbiopXG5cblxudmFsIGZpbmQ6ICgnYSAtPiBib29sKSAtPiAnYSB0IC0+IGludCBvcHRpb25cbigqKiBbZmluZCBwIGFycl1cblxuICAgIEZpbmQgdGhlIGVsZW1lbnQgc2F0aXNmeWluZyB0aGUgcHJlZGljYXRlIFtwXSBpbiB0aGUgYXJyYXkgW2Fycl0uIFJldHVyblxuICAgIFtOb25lXSBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxuKilcblxuXG52YWwgZm9yX2FsbDogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbFxuKCoqIFtmb3JfYWxsIHAgYXJyXVxuXG4gICAgRG8gYWxsIGVsZW1lbnRzIG9mIHRoZSBhcnJheSBbYXJyXSBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgW3BdP1xuKilcblxuXG5cbnZhbCBleGlzdHM6ICgnYSAtPiBib29sKSAtPiAnYSB0IC0+IGJvb2xcbigqKiBbZXhpc3RzIHAgYXJyXVxuXG4gICAgRXhpc3RzIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5IFthcnJdIHdoaWNoIHNhdGlzZmllcyB0aGUgcHJlZGljYXRlIFtwXT9cbiopXG5cblxuXG5cbnZhbCBwdXNoOiAnYSAtPiAnYSB0IC0+ICdhIHRcbigqKiBbcHVzaCBhIGFycl0gUHVzaCBlbGVtZW50IFthXSB0byB0aGUgcmVhciBlbmQgb2YgdGhlIGFycmF5IFthcnJdLiAqKVxuXG5cbnZhbCBwdXNoX2Zyb250OiAnYSAtPiAnYSB0IC0+ICdhIHRcbigqKiBbcHVzaF9mcm9udCBhIGFycl0gUHVzaCBlbGVtZW50IFthXSB0byB0aGUgZnJvbnQgZW5kIG9mIHRoZSBhcnJheSBbYXJyXS4gKilcblxuXG52YWwgdG9fbGlzdDogJ2EgdCAtPiAnYSBsaXN0XG4oKiogW3RvX2xpc3QgYXJyXSBDb252ZXJ0IHRoZSBhcnJheSBbYXJyXSB0byBhIGxpc3Qgd2l0aCB0aGUgc2FtZSBjb250ZW50LiAqKVxuXG5cbnZhbCBvZl9saXN0OiAnYSBsaXN0IC0+ICdhIGFycmF5XG4oKiogW29mX2xpc3QgbHN0XSBDb252ZXJ0IHRoZSBsaXN0IFtsc3RdIHRvIGFuIGFycmF5IHdpdGggdGhlIHNhbWUgY29udGVudC4gKilcblxuXG5cblxuXG4oKiogezEgQmluYXJ5IFNlYXJjaH0gKilcblxuXG52YWwgYmluc2VhcmNoOiAoJ2tleSAtPiAna2V5IC0+IGludCkgLT4gKCdhIC0+ICdrZXkpIC0+ICdrZXkgLT4gJ2EgdCAtPiBpbnQgKiBib29sXG4oKiogW2JpbnNlYXJjaCBjb21wYXJlIGtleV9vZiBrZXkgYXJyXVxuXG4gICAgU2VhcmNoIHRoZSBwb3NpdGlvbiBvZiBba2V5XSBpbiBbYXJyXS4gQXNzdW1lIHRoYXQgdGhlIGFycmF5IFthcnJdIGlzIHNvcnRlZFxuICAgIHdpdGhvdXQgZHVwbGljYXRlcy4gSXQgcmV0dXJucyB0aGUgcGFpciBbcG9zaXRpb24sIGV4YWN0X2ZsYWddIHdpdGggdGhlIG1lYW5pbmdcblxuICAgIHtbXG4gICAgICAgIGV4YWN0X2ZsYWcgICAgICAgICAgPT4gICAgICBrZXkgPSBrZXlfb2YgYXJyLihwb3NpdGlvbilcblxuICAgICAgICBub3QgZXhhY3RfZmxhZyAgICAgID0+ICAgICAga2V5IDwga2V5X29mIGFyci4ocG9zaXRpb24pXG4gICAgXX1cblxuICAgIENvcm5lciBjYXNlOiBbcG9zaXRpb24gPSBsZW5ndGggYXJyLCBleGFjdF9mbGcgPSBmYWxzZV0uIFRoaXMgY29ycmVzcG9uZHMgdG9cbiAgICBhIGZpY3RpdGlvdXMga2V5IG9mIFsraW5maW5pdHldIGF0IHRoZSBpbGxlZ2FsIHBvc2l0aW9uIFtsZW5ndGggYXJyXS5cblxuICAgIFRoZSBhcnJheSBbYXJyXSBjb25zaXN0cyBvZiBlbGVtZW50cyBvZiB0eXBlIFsnYV0uIFRoZSBmdW5jdGlvbiBba2V5X29mXVxuICAgIGV4dHJhY3RzIGEga2V5IGZyb20gYW4gZWxlbWVudCBvZiB0aGUgYXJyYXkuIFRoZSBrZXlzIGFyZSBjb21wYXJlZCB1c2luZyB0aGVcbiAgICBjb21wYXJpc29uIGZ1bmN0aW9uIFtjb21wYXJlXSB3aXRoIHRoZSB1c3VhbCBtZWFuaW5nOlxuXG4gICAgW2NvbXBhcmUgYSBiIDwgMF0gICAgICAgICAgICAgICBpZiBhbmQgb25seSBpZiBbYSA8IGJdXG5cbiAgICBbY29tcGFyZSBhIGIgPSAwXSAgICAgICAgICAgICAgIGlmIGFuZCBvbmx5IGlmIFthID0gYl1cblxuICAgIFtjb21wYXJlIGEgYiA+IDBdICAgICAgICAgICAgICAgaWYgYW5kIG9ubHkgaWYgW2EgPiBiXVxuKilcblxuXG5cblxuXG5cblxuKCoqIHsxIFNldHMgYW5kIE1hcHMgYmFzZWQgb24gYXJyYXlzfSAqKVxuXG5cblxuKCoqIEEgc2V0IGJhc2VkIG9uIGFycmF5cyAqKVxubW9kdWxlIFNldCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKTpcbnNpZ1xuICAgIGluY2x1ZGUgSW50ZXJmYWNlcy5TRVQgd2l0aCB0eXBlIGl0ZW0gPSBLZXkudFxuXG4gICAgdmFsIGVsZW1lbnQ6IGludCAtPiB0IC0+IEtleS50XG4gICAgKCoqIFtlbGVtZW50IGkgc2V0XSBUaGUgW2lddGggZWxlbWVudCBvZiB0aGUgc2V0LiAqKVxuXG5cbiAgICB2YWwgaW5kZXhfb2Y6IEtleS50IC0+IHQgLT4gaW50IG9wdGlvblxuICAgICgqKiBbaW5kZXhfb2YgZSBzZXRdIENvbXB1dGUgdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IFtlXSB3aXRoaW4gdGhlIHNldFxuICAgICAgICBbc2V0XSwgaWYgW2VdIGlzIGluIHRoZSBzZXQuICopXG5cblxuICAgIHZhbCBzaW5nbGV0b246IEtleS50IC0+IHRcbiAgICAoKiogW3NpbmdsZXRvbiBlXSBUaGUgc2luZ2xldG9uIHNldCB3aXRoIHRoZSBvbmx5IGVsZW1lbnQgW2VdLiAqKVxuZW5kXG5cblxuXG5cblxuXG4oKiogQSBtYXAgYmFzZWQgb24gYXJyYXlzICopXG5tb2R1bGUgTWFwIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpOlxuc2lnXG4gICAgaW5jbHVkZSBJbnRlcmZhY2VzLk1BUCB3aXRoIHR5cGUga2V5ID0gS2V5LnRcblxuXG4gICAgKCoqIFtwYWlyIGkgbWFwXSBUaGUgW2lddGgga2V5IHZhbHVlIHBhaXIgb2YgW21hcF0uXG5cbiAgICAgICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPCBjYXJkaW5hbCBtYXBdXG4gICAgKilcbiAgICB2YWwgcGFpcjogaW50IC0+ICdhIHQgLT4gS2V5LnQgKiAnYVxuXG5cbiAgICAoKiogW3NpbmdsZXRvbiBrZXkgdmFsdWVdIFRoZSBtYXAgd2l0aCB0aGUgb25seSBrZXkgdmFsdWUgcGFpclxuICAgICAgICBbKGtleSx2YWx1ZSldLiAqKVxuICAgIHZhbCBzaW5nbGV0b246IEtleS50IC0+ICdhIC0+ICdhIHRcbmVuZFxuIiwiaW5jbHVkZSBTdGRsaWIuQXJyYXlcblxuXG50eXBlICdhIHQgPSAnYSBhcnJheVxuXG5sZXQgaXNfZW1wdHkgKHhzOiAnYSB0KTogYm9vbCA9XG4gICAgbGVuZ3RoIHhzID0gMFxuXG5cbmxldCB2YWxpZF9pbmRleCAoaTogaW50KSAoeHM6ICdhIHQpOiBib29sID1cbiAgICAwIDw9IGkgJiYgaSA8IGxlbmd0aCB4c1xuXG5cbmxldCBoYXNfc29tZSAoeHM6ICdhIHQpOiBib29sID1cbiAgICAwIDwgbGVuZ3RoIHhzXG5cblxubGV0IGZpcnN0ICh4czogJ2EgdCk6ICdhID1cbiAgICBhc3NlcnQgKGhhc19zb21lIHhzKTtcbiAgICBnZXQgeHMgMFxuXG5cbmxldCBsYXN0ICh4czogJ2EgdCk6ICd0ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgYXNzZXJ0ICgwIDwgbGVuKTtcbiAgICBnZXQgeHMgKGxlbiAtIDEpXG5cblxuXG5sZXQgZm9sZGlfbGVmdCAoZjogJ2EgLT4gaW50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAoeHM6ICdiIHQpOiAnYSA9XG4gICAgZm9sZF9sZWZ0XG4gICAgICAgIChmdW4gKHN0YXJ0LCBpZHgpIGUgLT4gZiBzdGFydCBpZHggZSwgaWR4ICsgMSlcbiAgICAgICAgKHN0YXJ0LCAwKVxuICAgICAgICB4c1xuICAgIHw+XG4gICAgZnN0XG5cblxubGV0IHB1c2ggKHg6ICdhKSAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBsZXQgeHNfbmV3ID0gbWFrZSAobGVuICsgMSkgeCBpblxuICAgIGJsaXQgeHMgMCB4c19uZXcgMCBsZW47XG4gICAgeHNfbmV3XG5cblxubGV0IHB1c2hfZnJvbnQgKHg6ICdhKSAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBsZXQgeHNfbmV3ID0gbWFrZSAobGVuICsgMSkgeCBpblxuICAgIGJsaXQgeHMgMCB4c19uZXcgMSBsZW47XG4gICAgeHNfbmV3XG5cblxubGV0IGluc2VydCAoaTogaW50KSAoeDogJ2EpICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgIGFzc2VydCAoaSA8PSBsZW5ndGggeHMpO1xuICAgICgqIDAgMSAuLi4gKGktMSkgICBpIC4uLiAobGVuLTEpXG4gICAgICAgICAgICAgICAgICAgICBeIGluc2VydCBoZXJlXG4gICAgKilcbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgbGV0IGFyciA9IG1ha2UgKGxlbiArIDEpIHggaW5cbiAgICBibGl0IHhzIDAgYXJyIDAgaTtcbiAgICBibGl0IHhzIGkgYXJyIChpICsgMSkgKGxlbiAtIGkpO1xuICAgIGFyclxuXG5cbmxldCByZXBsYWNlIChpOiBpbnQpICh4OiAnYSkgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgYXNzZXJ0IChpIDwgbGVuZ3RoIHhzKTtcbiAgICAoKiAwIDEgLi4uIGkgLi4uIChsZW4tMSlcbiAgICAgICAgICAgICAgIF4gcmVwbGFjZVxuICAgICopXG4gICAgbGV0IGFyciA9IGNvcHkgeHMgaW5cbiAgICBzZXQgYXJyIGkgeDtcbiAgICBhcnJcblxuXG5cbmxldCByZW1vdmUgKGk6IGludCkgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgYXNzZXJ0IChpIDwgbGVuZ3RoIHhzKTtcbiAgICAoKiAwIDEgLi4uIGkgIChpICsgMSkgLi4uIChsZW4tMSlcbiAgICAgICAgICAgICAgIF4gcmVtb3ZlXG4gICAgKilcbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgYXNzZXJ0ICgwIDwgbGVuKTtcbiAgICBsZXQgYXJyID0gbWFrZSAobGVuIC0gMSkgKGdldCB4cyAwKSBpblxuICAgIGJsaXQgeHMgMCBhcnIgMCBpO1xuICAgIGJsaXQgeHMgKGkgKyAxKSBhcnIgaSAobGVuIC0gKGkgKyAxKSk7XG4gICAgYXJyXG5cblxubGV0IHJlbW92ZV9maXJzdCAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBhc3NlcnQgKDAgPCBsZW4pO1xuICAgIHN1YiB4cyAxIChsZW4gLSAxKVxuXG5cblxubGV0IHJlbW92ZV9sYXN0ICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGFzc2VydCAoMCA8IGxlbik7XG4gICAgc3ViIHhzIDAgKGxlbiAtIDEpXG5cblxuXG5sZXQgZmluZCAocDogJ2EgLT4gYm9vbCkgKGFycjogJ2EgYXJyYXkpOiBpbnQgb3B0aW9uID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIGFyclxuICAgIGluXG4gICAgbGV0IHJlYyBmaW5kX2Zyb20gaSA9XG4gICAgICAgIGlmIGkgPSBsZW4gdGhlblxuICAgICAgICAgICAgTm9uZVxuICAgICAgICBlbHNlIGlmIHAgKGdldCBhcnIgaSkgdGhlblxuICAgICAgICAgICAgU29tZSBpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZnJvbSAoaSArIDEpXG4gICAgaW5cbiAgICBmaW5kX2Zyb20gMFxuXG5cbmxldCBiaW5zZWFyY2hcbiAgICAgICAgKGNvbXBhcmU6ICdrZXkgLT4gJ2tleSAtPiBpbnQpXG4gICAgICAgIChrZXlfb2Y6ICdhIC0+ICdrZXkpXG4gICAgICAgIChrZXk6ICdrZXkpXG4gICAgICAgIChhcnI6ICdhIGFycmF5KVxuICAgIDogaW50ICogYm9vbCA9XG4gICAgKCogU2VhcmNoIHRoZSBwb3NpdGlvbiBvZiBba2V5XSBpbiBbYXJyXSB3aGljaCBpcyBzb3J0ZWQgd2l0aG91dFxuICAgICAgIGR1cGxpY2F0ZXMuXG5cbiAgICAgICAgUmVzdWx0OiBpLCBleGFjdF9mbGFnIHdpdGggW2tleSA8PSBwcm9qZWN0IGFyci4oaSldXG5cbiAgICAgICAgSWYgW2V4YWN0X2ZsYWddIGlzIHNldCwgdGhlIGtleSBpbiBwb3NpdGlvbiBbaV0gaXMgZXhhY3RseSBba2V5XSxcbiAgICAgICAgb3RoZXJ3aXNlIHRoZSBrZXkgaW4gcG9zaXRpb24gW2ldIGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBba2V5XS5cblxuICAgICAgICBDb3JuZXIgY2FzZTogW2kgPSBsZW5ndGggYXJyLCBleGFjdF9mbGFnID0gZmFsc2VdLiBUaGlzIGNvcnJlc3BvbmRzIHRvIGFcbiAgICAgICAgZmljdGl0aW91cyBrZXkgb2YgWysgaW5maW5pdHldIGF0IHBvc2l0aW9uIFtsZW5ndGggYXJyXS5cblxuICAgICAgICBQcmVjb25kaXRpb246XG4gICAgICAgICAgICBUaGUgYXJyYXkgbXVzdCBiZSBzb3J0ZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gZHVwbGljYXRlcy5cbiAgICAqKVxuICAgIGxldCBsZW4gPSBsZW5ndGggYXJyXG4gICAgaW5cbiAgICBpZiBsZW4gPSAwIHRoZW5cbiAgICAgICAgbGVuLCBmYWxzZVxuICAgIGVsc2UgaWYgbGVuID0gMSB0aGVuXG4gICAgICAgIGxldCBjbXAgPSBjb21wYXJlIGtleSAoZ2V0IGFyciAwIHw+IGtleV9vZikgaW5cbiAgICAgICAgaWYgY21wIDw9IDAgdGhlblxuICAgICAgICAgICAgMCwgY21wID0gMFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZW4sIGZhbHNlXG4gICAgZWxzZVxuICAgICAgICBsZXQgcmVjIHNlYXJjaCBsb3dlciB1cHBlciA9XG4gICAgICAgICAgICAoKiBJbnZhcmlhbnQ6XG5cbiAgICAgICAgICAgICAgICAwIDw9IGxvd2VyIDwgdXBwZXIgPCBsZW5cbiAgICAgICAgICAgICAgICBhcnIuKGxvd2VyKSA8IGtleSA8IGFyci4odXBwZXIpXG4gICAgICAgICAgICAqKVxuICAgICAgICAgICAgaWYgbG93ZXIgKyAxID0gdXBwZXIgdGhlblxuICAgICAgICAgICAgICAgIHVwcGVyLCBmYWxzZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxldCBtaWQgPSBsb3dlciArICh1cHBlciAtIGxvd2VyKSAvIDIgaW5cbiAgICAgICAgICAgICAgICBhc3NlcnQgKGxvd2VyIDwgbWlkKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQgKG1pZCA8IHVwcGVyKTtcbiAgICAgICAgICAgICAgICBsZXQgY21wID0gY29tcGFyZSBrZXkgKGdldCBhcnIgbWlkIHw+IGtleV9vZikgaW5cbiAgICAgICAgICAgICAgICBpZiBjbXAgPSAwIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbWlkLCB0cnVlXG4gICAgICAgICAgICAgICAgZWxzZSBpZiBjbXAgPCAwIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoIGxvd2VyIG1pZFxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoIG1pZCB1cHBlclxuICAgICAgICBpblxuICAgICAgICBsZXQgbG93ZXIsIHVwcGVyID0gMCwgbGVuIC0gMSBpblxuICAgICAgICBsZXQgY21wID0gY29tcGFyZSBrZXkgKGdldCBhcnIgbG93ZXIgfD4ga2V5X29mKSBpblxuICAgICAgICBpZiBjbXAgPD0gMCB0aGVuXG4gICAgICAgICAgICAoKiBrZXkgaXMgbGVzcyBvciBlcXVhbCB0aGUgZmlyc3QgZWxlbWVudCAqKVxuICAgICAgICAgICAgbG93ZXIsIGNtcCA9IDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgKCoga2V5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QgZWxlbWVudCAqKVxuICAgICAgICAgICAgbGV0IGNtcCA9IGNvbXBhcmUga2V5IChnZXQgYXJyIHVwcGVyIHw+IGtleV9vZikgaW5cbiAgICAgICAgICAgIGlmIGNtcCA8IDAgdGhlblxuICAgICAgICAgICAgICAgICgqIGludmFyaWFudCBmb3IgW3NlYXJjaF0gc2F0aXNmaWVkLiAqKVxuICAgICAgICAgICAgICAgIHNlYXJjaCBsb3dlciB1cHBlclxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgPSAwIHRoZW5cbiAgICAgICAgICAgICAgICAoKiBleGFjdCBtYXRjaCB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgKilcbiAgICAgICAgICAgICAgICB1cHBlciwgdHJ1ZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICgqIGtleSBpcyBncmVhdGVyIHRoYW4gYWxsIGVsZW1lbnRzICopXG4gICAgICAgICAgICAgICAgbGVuLCBmYWxzZVxuXG5cblxuXG5cblxubW9kdWxlIE1hcCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICB0eXBlIGtleSA9IEtleS50XG5cbiAgICB0eXBlICdhIHQgPSAoS2V5LnQgKiAnYSkgYXJyYXlcblxuXG4gICAgbGV0IGNhcmRpbmFsIChtYXA6ICdhIHQpOiBpbnQgPVxuICAgICAgICBsZW5ndGggbWFwXG5cblxuICAgIGxldCBpc19lbXB0eSAobWFwOiAnYSB0KTogYm9vbCA9XG4gICAgICAgIGNhcmRpbmFsIG1hcCA9IDBcblxuXG4gICAgbGV0IGJpbmRpbmdzIChtYXA6ICdhIHQpOiAoS2V5LnQgKiAnYSkgbGlzdCA9XG4gICAgICAgIHRvX2xpc3QgbWFwXG5cblxuICAgIGxldCBmb2xkX2xlZnQgKGY6ICdhIC0+IEtleS50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAobWFwOiAnYiB0KTogJ2EgPVxuICAgICAgICBTdGRsaWIuQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIGEgKGtleSwgdmFsdWUpIC0+IGYgYSBrZXkgdmFsdWUpXG4gICAgICAgICAgICBzdGFydFxuICAgICAgICAgICAgbWFwXG5cbiAgICBsZXQgZm9sZF9yaWdodCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpIChtYXA6ICdiIHQpID1cbiAgICAgICAgU3RkbGliLkFycmF5LmZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gKGtleSwgdmFsdWUpIHJlc3VsdCAtPiBmIHJlc3VsdCBrZXkgdmFsdWUpXG4gICAgICAgICAgICBtYXBcbiAgICAgICAgICAgIHN0YXJ0XG5cblxuICAgIGxldCBpbmRleF9vZiAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6IGludCBvcHRpb24gPVxuICAgICAgICBsZXQgbGVuID0gbGVuZ3RoIG1hcCBpblxuICAgICAgICBsZXQgaSwgZXhhY3QgPSBiaW5zZWFyY2ggS2V5LmNvbXBhcmUgZnN0IGtleSBtYXAgaW5cbiAgICAgICAgaWYgaSA9IGxlbiB8fCBub3QgZXhhY3QgdGhlblxuICAgICAgICAgICAgTm9uZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBTb21lIGlcblxuICAgIGxldCBwYWlyIChpOiBpbnQpIChtYXA6ICdhIHQpOiBLZXkudCAqICdhID1cbiAgICAgICAgYXNzZXJ0IChpIDwgY2FyZGluYWwgbWFwKTtcbiAgICAgICAgZ2V0IG1hcCBpXG5cblxuICAgIGxldCBmaW5kX29wdCAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6ICdhIG9wdGlvbiA9XG4gICAgICAgIE9wdGlvbi5tYXBcbiAgICAgICAgICAgIChmdW4gaSAtPiBzbmQgKGdldCBtYXAgaSkpXG4gICAgICAgICAgICAoaW5kZXhfb2Yga2V5IG1hcClcblxuXG4gICAgbGV0IG1lbSAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICBpbmRleF9vZiBrZXkgbWFwIDw+IE5vbmVcblxuXG4gICAgbGV0IGVtcHR5OiAnYSB0ID1cbiAgICAgICAgW3x8XVxuXG5cbiAgICBsZXQgc2luZ2xldG9uIChrZXk6IEtleS50KSAodmFsdWU6ICdhKTogJ2EgdCA9XG4gICAgICAgIFt8IGtleSwgdmFsdWUgfF1cblxuXG5cbiAgICBsZXQgYWRkIChrZXk6IEtleS50KSAodmFsdWU6ICdhKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGxldCBpLGV4YWN0ID0gYmluc2VhcmNoIEtleS5jb21wYXJlIGZzdCBrZXkgbWFwIGluXG4gICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgIHJlcGxhY2UgaSAoa2V5LCB2YWx1ZSkgbWFwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGluc2VydCBpIChrZXksIHZhbHVlKSBtYXBcblxuXG5cbiAgICBsZXQgdXBkYXRlIChrZXk6IEtleS50KSAoZjogJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBsZXQgaSwgZXhhY3QgPSBiaW5zZWFyY2ggS2V5LmNvbXBhcmUgZnN0IGtleSBtYXAgaW5cbiAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgbWF0Y2ggZiAoU29tZSAoZ2V0IG1hcCBpIHw+IHNuZCkpIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIHJlbW92ZSBpIG1hcFxuICAgICAgICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgcmVwbGFjZSBpIChrZXksIHZhbHVlKSBtYXBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF0Y2ggZiBOb25lIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIG1hcFxuICAgICAgICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgaW5zZXJ0IGkgKGtleSwgdmFsdWUpIG1hcFxuXG5cbiAgICBsZXQgcmVtb3ZlIChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGxldCBpLCBleGFjdCA9IGJpbnNlYXJjaCBLZXkuY29tcGFyZSBmc3Qga2V5IG1hcCBpblxuICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICByZW1vdmUgaSBtYXBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWFwXG5lbmRcblxuXG5cblxuXG5tb2R1bGUgU2V0IChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIG1vZHVsZSBNID0gIE1hcCAoS2V5KVxuXG4gICAgdHlwZSBpdGVtID0gS2V5LnRcblxuICAgIHR5cGUgdCA9IHVuaXQgTS50XG5cbiAgICBsZXQgY2FyZGluYWwgKHNldDogdCk6IGludCA9XG4gICAgICAgIE0uY2FyZGluYWwgc2V0XG5cblxuICAgIGxldCBpc19lbXB0eSA9IE0uaXNfZW1wdHlcblxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2EpIChzdGFydDogJ2EpIChzZXQ6IHQpOiAnYSA9XG4gICAgICAgIE0uZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIHJlcyBrZXkgXyAtPiBmIHJlcyBrZXkpXG4gICAgICAgICAgICBzdGFydFxuICAgICAgICAgICAgc2V0XG5cblxuICAgIGxldCBmb2xkX3JpZ2h0IChmOiAnYSAtPiBLZXkudCAtPiAnYSkgKHN0YXJ0OiAnYSkgKHNldDogdCk6ICdhID1cbiAgICAgICAgTS5mb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIHJlcyBrZXkgXyAtPiBmIHJlcyBrZXkpXG4gICAgICAgICAgICBzdGFydFxuICAgICAgICAgICAgc2V0XG5cblxuICAgIGxldCBlbGVtZW50cyAoc2V0OiB0KTogS2V5LnQgbGlzdCA9XG4gICAgICAgIGZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gbHN0IGtleSAtPiBrZXkgOjogbHN0KVxuICAgICAgICAgICAgW11cbiAgICAgICAgICAgIHNldFxuXG5cbiAgICBsZXQgZWxlbWVudCAoaTogaW50KSAoc2V0OiB0KTogS2V5LnQgPVxuICAgICAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgICAgIGFzc2VydCAoaSA8IGNhcmRpbmFsIHNldCk7XG4gICAgICAgIE0ucGFpciBpIHNldCB8PiBmc3RcblxuXG4gICAgbGV0IGluZGV4X29mID0gTS5pbmRleF9vZlxuXG5cbiAgICBsZXQgZW1wdHkgPSBNLmVtcHR5XG5cblxuICAgIGxldCBzaW5nbGV0b24gKGU6IEtleS50KTogdCA9XG4gICAgICAgIE0uc2luZ2xldG9uIGUgKClcblxuXG4gICAgbGV0IG1lbSA9IE0ubWVtXG5cblxuICAgIGxldCBhZGQgKGU6IEtleS50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIE0uYWRkIGUgKCkgc2V0XG5cblxuICAgIGxldCByZW1vdmUgPSBNLnJlbW92ZVxuZW5kXG5cblxuXG5cblxuXG5cblxuXG5cbigqIFVuaXQgVGVzdHNcbiAqID09PT09PT09PT1cbiAqKVxuXG5cbigqIEJpbmFyeSBzZWFyY2ggKilcbmxldCV0ZXN0IF8gPVxuICAgIGJpbnNlYXJjaCBJbnQuY29tcGFyZSBGdW4uaWQgMTAwIFt8fF0gPSAoMCwgZmFsc2UpXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBiaW5zZWFyY2ggSW50LmNvbXBhcmUgRnVuLmlkIDk5IFt8MTAwfF0gPSAoMCwgZmFsc2UpXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBiaW5zZWFyY2ggSW50LmNvbXBhcmUgRnVuLmlkIDEwMCBbfDEwMHxdID0gKDAsIHRydWUpXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBiaW5zZWFyY2ggSW50LmNvbXBhcmUgRnVuLmlkIDEwMSBbfDEwMHxdID0gKDEsIGZhbHNlKVxuXG5cblxuXG5cbigqIFNldCAqKVxubW9kdWxlIFNldEludCA9IFNldCAoSW50KVxuXG5sZXQgaW5zZXJ0X2Rvd253YXJkIChsb3dlcjogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IFNldEludC50KTogU2V0SW50LnQgPVxuICAgIGxldCByZWMgaW5zZXJ0IGkgc2V0ID1cbiAgICAgICAgaWYgaSA9IGxvd2VyIHRoZW5cbiAgICAgICAgICAgIHNldFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgaSA9IGkgLSAxIGluXG4gICAgICAgICAgICBpbnNlcnQgaSAoU2V0SW50LmFkZCBpIHNldClcbiAgICBpblxuICAgIGluc2VydCBiZXlvbmQgc2V0XG5cbmxldCBpbnNlcnRfdXB3YXJkIChsb3dlcjogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IFNldEludC50KTogU2V0SW50LnQgPVxuICAgIGxldCByZWMgaW5zZXJ0IGkgc2V0ID1cbiAgICAgICAgaWYgaSA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICBzZXRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgaW5zZXJ0IChpICsgMSkgKFNldEludC5hZGQgaSBzZXQpXG4gICAgaW5cbiAgICBpbnNlcnQgbG93ZXIgc2V0XG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBpbnNlcnRfdXB3YXJkIDAgMyBTZXRJbnQuZW1wdHkgPSBbfDAsKCk7IDEsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5ID0gW3wwLCgpOyAxLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICBpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSB8PiBTZXRJbnQucmVtb3ZlIDEgPSBbfDAsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5ICB8PiBTZXRJbnQucmVtb3ZlIDQgPSBbfDAsKCk7IDEsKCk7IDIsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIChpbnNlcnRfdXB3YXJkIDAgMyBTZXRJbnQuZW1wdHkgfD4gaW5zZXJ0X2Rvd253YXJkIDAgMylcbiAgICA9XG4gICAgW3wwLCgpOyAxLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICAoaW5zZXJ0X3Vwd2FyZCAwIDMgU2V0SW50LmVtcHR5IHw+IGluc2VydF9kb3dud2FyZCAzIDYpXG4gICAgPVxuICAgIFt8MCwoKTsgMSwoKTsgMiwoKTsgMywoKTsgNCwoKTsgNSwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgKGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5IHw+IFNldEludC5yZW1vdmUgMClcbiAgICA9XG4gICAgW3wxLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgaW5cbiAgICBTZXRJbnQuaW5kZXhfb2YgMyBzZXQgPSBOb25lXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5IGluXG4gICAgU2V0SW50LmluZGV4X29mIDAgc2V0ID0gU29tZSAwXG4iLCJtb2R1bGUgdHlwZSBCSVRTSVpFID1cbnNpZ1xuICAgIHZhbCBiaXRzaXplOiBpbnRcbmVuZFxuXG5cblxuXG5tb2R1bGUgTWFrZSAoQml0c2l6ZTogQklUU0laRSkgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBCaXRzaXplXG5cbiAgICBsZXQgYnJhbmNoaW5nOiBpbnQgPVxuICAgICAgICBhc3NlcnQgKDAgPCBiaXRzaXplKTtcbiAgICAgICAgMSBsc2wgYml0c2l6ZVxuXG5cbiAgICBsZXQgc2xvdCAoaTogaW50KSAobDogaW50KTogaW50ID1cbiAgICAgICAgKCogVGhlIHNsb3Qgb2YgaW5kZXggW2ldIGF0IGxldmVsIFtsXS5cblxuICAgICAgICAgICAgaS8gMl4obCAqIGJpdHNpemUpXG4gICAgICAgICAqKVxuICAgICAgICBpIGxzciAobCAqIGJpdHNpemUpXG5cblxuICAgIGxldCBvZmZzZXQgKGk6IGludCkgKHM6IGludCkgKGw6IGludCk6IGludCA9XG4gICAgICAgICgqIFRoZSBvZmZzZXQgb2YgaW5kZXggW2ldIGluIHNsb3QgW3NdIGluIGEgdHJlZSBhdCBsZXZlbCBbbF0uXG5cbiAgICAgICAgICAgIGktIHMgKiAyXihsICogYml0c2l6ZSlcbiAgICAgICAgICopXG4gICAgICAgIGkgLSBzIGxzbCAobCAqIGJpdHNpemUpXG5cblxuICAgIGxldCBmdWxsX3NpemUgKGw6IGludCk6IGludCA9XG4gICAgICAgICgqIFRoZSBzaXplIG9mIGEgZnVsbCByYWRpeCBiYWxhbmNlZCBhcnJheSBhdCBsZXZlbCBbbF0uICopXG4gICAgICAgIGFzc2VydCAoMCA8PSBsKTtcbiAgICAgICAgMSBsc2wgKChsICsgMSkgKiBiaXRzaXplKVxuXG5cbiAgICB0eXBlICdhIHQgPVxuICAgICAgICB8IExlYWYgb2ZcbiAgICAgICAgICAgICdhIGFycmF5XG4gICAgICAgIHwgTm9kZSBvZiB7XG4gICAgICAgICAgICBzaXplOiAgaW50O1xuICAgICAgICAgICAgbGV2ZWw6IGludDtcbiAgICAgICAgICAgIG5vZGVzOiAnYSB0IGFycmF5fVxuXG5cbiAgICBsZXQgbGV2ZWw6ICdhIHQgLT4gaW50ID0gZnVuY3Rpb25cbiAgICAgICAgfCBMZWFmIF8gLT5cbiAgICAgICAgICAgIDBcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIG5vZGUubGV2ZWxcblxuXG4gICAgbGV0IGlzX2Z1bGw6ICdhIHQgLT4gYm9vbCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIEFycmF5Lmxlbmd0aCBhcnIgPSBmdWxsX3NpemUgMFxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbm9kZS5zaXplID0gZnVsbF9zaXplIG5vZGUubGV2ZWxcblxuXG4gICAgbGV0IGxlbmd0aDogJ2EgdCAtPiBpbnQgPVxuICAgICAgICAoKiBUaGUgbGVuZ3RoIG9mIHRoZSByYWRpeCBiYWxhbmNlZCBhcnJheS4gKilcbiAgICAgICAgZnVuY3Rpb25cbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgQXJyYXkubGVuZ3RoIGFyclxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbm9kZS5zaXplXG5cblxuICAgIGxldCBoYXNfc29tZSAodDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICAwIDwgbGVuZ3RoIHRcblxuXG4gICAgbGV0IGlzX2VtcHR5ICh0OiAnYSB0KTogYm9vbCA9XG4gICAgICAgIDAgPSBsZW5ndGggdFxuXG5cblxuICAgIGxldCBjaGVja19pbnZhcmlhbnQgKHQ6ICdhIHQpOiAgYm9vbCA9XG4gICAgICAgIGxldCByZWMgY2hlY2sgaXNfcm9vdCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBhcnIgaW5cbiAgICAgICAgICAgICAgICBsZW4gPD0gYnJhbmNoaW5nXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICAoaXNfcm9vdCB8fCAwIDwgbGVuKVxuICAgICAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgICAgICBsZXQgbmNoaWxkcmVuID0gQXJyYXkubGVuZ3RoIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIEFycmF5LmZvcl9hbGwgKGNoZWNrIGZhbHNlKSBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5mb3JfYWxsXG4gICAgICAgICAgICAgICAgICAgIChmdW4gY2hpbGQgLT4gbGV2ZWwgY2hpbGQgKyAxID0gbm9kZS5sZXZlbClcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgbmNoaWxkcmVuIDw9IGJyYW5jaGluZ1xuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgMSA8PSBuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIChub3QgaXNfcm9vdCB8fCAyIDw9IG5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zaXplXG4gICAgICAgICAgICAgICAgICAgID1cbiAgICAgICAgICAgICAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAoZnVuIHNpemUgY2hpbGQgLT4gc2l6ZSArIGxlbmd0aCBjaGlsZClcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIGluXG4gICAgICAgIGNoZWNrIHRydWUgdFxuXG5cbiAgICBsZXQgZW1wdHk6ICdhIHQgPVxuICAgICAgICBMZWFmIFt8IHxdXG5cblxuXG4gICAgKCogRm9sZGluZ1xuICAgICAqKVxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjogJ2EgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpICh0OiAnYiB0KTogJ2EgPVxuICAgICAgICBsZXQgcmVjIGZvbGQgc3RhcnQgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgICAgIEFycmF5LmZvbGRfbGVmdCBmIHN0YXJ0IGFyclxuICAgICAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5mb2xkX2xlZnQgZm9sZCBzdGFydCBub2RlLm5vZGVzXG4gICAgICAgIGluXG4gICAgICAgIGZvbGQgc3RhcnQgdFxuXG5cblxuICAgIGxldCBmb2xkaV9sZWZ0IChmOiAnYSAtPiBpbnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpICh0OiAnYiB0KTogJ2EgPVxuICAgICAgICBmb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gKHN0YXJ0LGlkeCkgZSAtPiBmIHN0YXJ0IGlkeCBlLCAoaWR4ICsgMSkpXG4gICAgICAgICAgICAoc3RhcnQsIDApXG4gICAgICAgICAgICB0XG4gICAgICAgIHw+XG4gICAgICAgIGZzdFxuXG5cblxuICAgICgqIEVsZW1lbnQgUmV0cmlldmFsXG4gICAgICopXG5cbiAgICBsZXQgcmVjIGVsZW1lbnQgKGk6IGludCkgKHQ6ICdhIHQpOiAnYSA9XG4gICAgICAgICgqIFRoZSBlbGVtZW50IGF0IGluZGV4IFtpXSBpbiB0aGUgcmFkaXggYmFsYW5jZWQgYXJyYXkgW3RdLiAqKVxuICAgICAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgICAgIGFzc2VydCAoaSA8IGxlbmd0aCB0KTtcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIGFyci4oaSlcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIGxldCBzID0gc2xvdCBpIG5vZGUubGV2ZWwgaW5cbiAgICAgICAgICAgIGxldCBvID0gb2Zmc2V0IGkgcyBub2RlLmxldmVsIGluXG4gICAgICAgICAgICBlbGVtZW50IG8gbm9kZS5ub2Rlcy4ocylcblxuXG4gICAgbGV0IGZpcnN0ICh0OiAnYSB0KTogJ2EgPVxuICAgICAgICAoKiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbm9uIGVtcHR5IHJhZGl4IGJhbGFuY2VkIGFycmF5IFt0XS4gKilcbiAgICAgICAgYXNzZXJ0IChoYXNfc29tZSB0KTtcbiAgICAgICAgbGV0IHJlYyBmc3QgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgICAgIEFycmF5LmZpcnN0IGFyclxuICAgICAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgICAgICBmc3QgKEFycmF5LmZpcnN0IG5vZGUubm9kZXMpXG4gICAgICAgIGluXG4gICAgICAgIGZzdCB0XG5cblxuICAgIGxldCBsYXN0ICh0OiAnYSB0KTogJ2EgPVxuICAgICAgICAoKiBUaGUgbGFzdCBlbGVtZW50IG9mIHRoZSBub24gZW1wdHkgcmFkaXggYmFsYW5jZWQgYXJyYXkgW3RdLiAqKVxuICAgICAgICBhc3NlcnQgKGhhc19zb21lIHQpO1xuICAgICAgICBsZXQgcmVjIGZzdCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkubGFzdCBhcnJcbiAgICAgICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICAgICAgZnN0IChBcnJheS5sYXN0IG5vZGUubm9kZXMpXG4gICAgICAgIGluXG4gICAgICAgIGZzdCB0XG5cblxuXG4gICAgKCogRWxlbWVudCBSZXBsYWNlbWVudFxuICAgICAqKVxuXG5cbiAgICBsZXQgcmVjIHJlcGxhY2UgKGk6IGludCkgKGU6ICdhKSAodDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICAoKiBSZXBsYWNlIHRoZSBlbGVtZW50IGF0IGluZGV4IFtpXSBieSB0aGUgZWxlbWVudCBbZV0gd2l0aGluIHRoZSByYWRpeFxuICAgICAgICAgICBiYWxhbmNlZCBhcnJheSBbdF0uICopXG4gICAgICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICAgICAgYXNzZXJ0IChpIDwgbGVuZ3RoIHQpO1xuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgTGVhZiAoQXJyYXkucmVwbGFjZSBpIGUgYXJyKVxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbGV0IHMgPSBzbG90IGkgbm9kZS5sZXZlbCBpblxuICAgICAgICAgICAgbGV0IG8gPSBvZmZzZXQgaSBzIG5vZGUubGV2ZWwgaW5cbiAgICAgICAgICAgIE5vZGVcbiAgICAgICAgICAgICAgICB7bm9kZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIG5vZGVzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxhY2UgbyBlIG5vZGUubm9kZXMuKHMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICB9XG5cblxuXG5cblxuXG4gICAgKCogRWxlbWVudCBJbnNlcnRpb24gYXQgdGhlIFJlYXIgRW5kXG4gICAgICopXG5cbiAgICBsZXQgcmVjIHNpbmdsZXRvbl90cmVlIChsZXY6IGludCkgKGU6ICdhKTogJ2EgdCA9XG4gICAgICAgICgqIENvbnN0cnVjdCB0cmVlIGF0IGxldmVsIFtsZXZdIHdpdGggdGhlIGVsZW1lbnQgW2VdLiAqKVxuICAgICAgICBpZiBsZXYgPSAwIHRoZW5cbiAgICAgICAgICAgIExlYWYgW3wgZSB8XVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb2RlIHtcbiAgICAgICAgICAgICAgICBzaXplID0gMTtcbiAgICAgICAgICAgICAgICBsZXZlbCA9IGxldjtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFt8IHNpbmdsZXRvbl90cmVlIChsZXYgLSAxKSBlIHxdXG4gICAgICAgICAgICB9XG5cblxuICAgIGxldCByZWMgcHVzaF9ub3RfZnVsbCAoZTogJ2EpICh0OiAnYSB0KTogJ2EgdCA9XG4gICAgICAgICgqIEFwcGVuZCB0aGUgZWxlbWVudCBbZV0gYXQgdGhlIHJlYXIgZW5kIG9mIHRoZSByYWRpeCBiYWxhbmNlZCBhcnJheVxuICAgICAgICAgICBbdF0gd2hpY2ggaXMgbm90IGZ1bGwuICopXG4gICAgICAgIGFzc2VydCAobm90IChpc19mdWxsIHQpKTtcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIExlYWYgKEFycmF5LnB1c2ggZSBhcnIpXG5cbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIGxldCBzbG90ID0gQXJyYXkubGVuZ3RoIG5vZGUubm9kZXMgLSAxIGluXG4gICAgICAgICAgICBhc3NlcnQgKDAgPD0gc2xvdCk7XG4gICAgICAgICAgICBsZXQgbm9kZXMgPVxuICAgICAgICAgICAgICAgIGlmIGlzX2Z1bGwgbm9kZS5ub2Rlcy4oc2xvdCkgdGhlblxuICAgICAgICAgICAgICAgICAgICBBcnJheS5wdXNoXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2luZ2xldG9uX3RyZWUgKG5vZGUubGV2ZWwgLSAxKSBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2xvdFxuICAgICAgICAgICAgICAgICAgICAgICAgKHB1c2hfbm90X2Z1bGwgZSBub2RlLm5vZGVzLihzbG90KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZXNcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBOb2RlXG4gICAgICAgICAgICAgICAge25vZGUgd2l0aCBub2Rlczsgc2l6ZSA9IG5vZGUuc2l6ZSArIDF9XG5cblxuICAgIGxldCBwdXNoIChlOiAnYSkgKHQ6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgKCogQXBwZW5kIHRoZSBlbGVtZW50IFtlXSBhdCB0aGUgcmVhciBlbmQgb2YgdGhlIHJhZGl4IGJhbGFuY2VkIGFycmF5XG4gICAgICAgICAgIFt0XS4gKilcbiAgICAgICAgbGV0IGxldiA9IGxldmVsIHRcbiAgICAgICAgYW5kIGxlbiA9IGxlbmd0aCB0XG4gICAgICAgIGluXG4gICAgICAgIGlmIGxlbiA9IGZ1bGxfc2l6ZSBsZXYgdGhlblxuICAgICAgICAgICAgTm9kZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSAgPSBsZW4gKyAxO1xuICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ICsgMTtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFt8IHQ7IHNpbmdsZXRvbl90cmVlIGxldiBlfF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcHVzaF9ub3RfZnVsbCBlIHRcblxuXG5cblxuXG5cblxuICAgICgqIEVsZW1lbnQgUmVtb3ZhbCBmcm9tIHRoZSBSZWFyIEVuZFxuICAgICAqKVxuXG5cbiAgICBsZXQgcmVjIHBvcF9hdXggKGlzX3Jvb3Q6IGJvb2wpICh0OiAnYSB0KTogJ2EgKiAnYSB0ID1cbiAgICAgICAgKCogUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSBhIG5vbmVtcHR5IHRyZWUuICopXG4gICAgICAgIGFzc2VydCAoaGFzX3NvbWUgdCk7XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBBcnJheS4obGFzdCBhcnIsIExlYWYgKHJlbW92ZV9sYXN0IGFycikpXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBsZXQgaiA9IEFycmF5Lmxlbmd0aCBub2RlLm5vZGVzIC0gMSBpblxuICAgICAgICAgICAgYXNzZXJ0ICgwIDw9IGopO1xuICAgICAgICAgICAgbGV0IGNoaWxkID0gbm9kZS5ub2Rlcy4oaikgaW5cbiAgICAgICAgICAgIGxldCBsZW4gICA9IGxlbmd0aCBjaGlsZCBpblxuICAgICAgICAgICAgaWYgaXNfcm9vdCAmJiBqID0gMSAmJiBsZW4gPSAxIHRoZW5cbiAgICAgICAgICAgICAgICAoKiBMYXN0IGNoaWxkIG9mIHRoZSByb290IG5vZGUgaGFzIG9ubHkgb25lIGVsZW1lbnQuICopXG4gICAgICAgICAgICAgICAgbGFzdCBjaGlsZCxcbiAgICAgICAgICAgICAgICBub2RlLm5vZGVzLigwKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxldCBlLCBub2RlcyA9XG4gICAgICAgICAgICAgICAgICAgIGlmIGxlbiA9IDEgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgKCogTGFzdCBjaGlsZCBoYXMgb25seSBvbmUgZWxlbWVudC4gKilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5yZW1vdmVfbGFzdCBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICgqIE5vcm1hbCBjYXNlLiAqKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUsIGNoaWxkID0gcG9wX2F1eCBmYWxzZSBjaGlsZCBpblxuICAgICAgICAgICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnJlcGxhY2UgaiBjaGlsZCBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgIE5vZGUge1xuICAgICAgICAgICAgICAgICAgICBub2RlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG5vZGUuc2l6ZSAtIDE7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVzXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICBsZXQgcG9wICh0OiAnYSB0KTogJ2EgKiAnYSB0ID1cbiAgICAgICAgYXNzZXJ0IChoYXNfc29tZSB0KTtcbiAgICAgICAgcG9wX2F1eCB0cnVlIHRcblxuXG4gICAgbGV0IHBvcF9vcHQgKHQ6ICdhIHQpOiAoJ2EgKiAnYSB0KSBvcHRpb24gPVxuICAgICAgICBpZiBpc19lbXB0eSB0IHRoZW5cbiAgICAgICAgICAgIE5vbmVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgU29tZSAocG9wX2F1eCB0cnVlIHQpXG5lbmRcblxuXG5cblxubW9kdWxlIEJyYW5jaGluZzI6IEJJVFNJWkUgPVxuc3RydWN0XG4gICAgbGV0IGJpdHNpemU6IGludCA9IDFcbmVuZFxuXG5cbm1vZHVsZSBCcmFuY2hpbmczMjogQklUU0laRSA9XG5zdHJ1Y3RcbiAgICBsZXQgYml0c2l6ZTogaW50ID0gNVxuZW5kXG5cblxuXG5pbmNsdWRlIE1ha2UgKEJyYW5jaGluZzMyKVxuXG5cblxuXG5cblxuXG4oKiBVbml0IFRlc3RzXG4gKiAqKioqKioqKioqXG4gKilcbm1vZHVsZSBSYiA9IE1ha2UgKEJyYW5jaGluZzIpXG5cblxubGV0IGZpbGwgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCk6IGludCBSYi50ID1cbiAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgbGV0IHJlYyBmbCBzdGFydCB0ID1cbiAgICAgICAgaWYgc3RhcnQgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgdFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmbCAoc3RhcnQgKyAxKSAoUmIucHVzaCBzdGFydCB0KVxuICAgIGluXG4gICAgZmwgc3RhcnQgUmIuZW1wdHlcblxuXG5sZXQgY2hlY2tfZmlsbCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KTogYm9vbCA9XG4gICAgbGV0IHJlYyBjaGVjayBzdGFydCB0ID1cbiAgICAgICAgaWYgc3RhcnQgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgUmIuY2hlY2tfaW52YXJpYW50IHRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgUmIuY2hlY2tfaW52YXJpYW50IHRcbiAgICAgICAgICAgICYmXG4gICAgICAgICAgICBjaGVjayAoc3RhcnQgKyAxKSAoUmIucHVzaCBzdGFydCB0KVxuICAgIGluXG4gICAgY2hlY2sgc3RhcnQgUmIuZW1wdHlcblxuXG5sZXQgY2hlY2tfZm9sZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAodDogaW50IFJiLnQpOiBib29sID1cbiAgICBzdGFydCArIFJiLmxlbmd0aCB0ID0gYmV5b25kXG4gICAgJiZcbiAgICBSYi5mb2xkaV9sZWZ0XG4gICAgICAgIChmdW4gb2sgaWR4IGUgLT5cbiAgICAgICAgICAgICBvayAmJiBlID0gc3RhcnQgKyBpZHgpXG4gICAgICAgIHRydWVcbiAgICAgICAgdFxuXG5cbmxldCBjaGVja19lbGVtZW50IChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpICh0OiBpbnQgUmIudCk6IGJvb2wgPVxuICAgIGxldCByZWMgY2hlY2tfZnJvbSBpIHN0YXJ0ID1cbiAgICAgICAgaWYgc3RhcnQgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzdGFydCA9IFJiLmVsZW1lbnQgaSB0XG4gICAgICAgICAgICAmJlxuICAgICAgICAgICAgY2hlY2tfZnJvbSAoaSArIDEpIChzdGFydCArIDEpXG4gICAgaW5cbiAgICBjaGVja19mcm9tIDAgc3RhcnRcblxuXG5cbmxldCBjaGVja19wb3AgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHQ6IGludCBSYi50KTogYm9vbCA9XG4gICAgbGV0IHJlYyBjaGVjayBiZXlvbmQgdCA9XG4gICAgICAgIFJiLmNoZWNrX2ludmFyaWFudCB0XG4gICAgICAgICYmXG4gICAgICAgIChcbiAgICAgICAgICAgIGlmIGJleW9uZCA9IHN0YXJ0IHRoZW5cbiAgICAgICAgICAgICAgICBSYi5pc19lbXB0eSB0XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgUmIuaGFzX3NvbWUgdFxuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgbGV0IGUsIHQgPSBSYi5wb3AgdCBpblxuICAgICAgICAgICAgICAgIGUgKyAxID0gYmV5b25kXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICBjaGVjayAoYmV5b25kIC0gMSkgdFxuICAgICAgICApXG4gICAgaW5cbiAgICBjaGVjayBiZXlvbmQgdFxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHN0YXJ0ID0gMTBcbiAgICBhbmQgYmV5b25kID0gMTAwXG4gICAgaW5cbiAgICBjaGVja19maWxsIHN0YXJ0IGJleW9uZFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzdGFydCA9IDEwXG4gICAgYW5kIGJleW9uZCA9IDEwMFxuICAgIGluXG4gICAgY2hlY2tfZm9sZCBzdGFydCBiZXlvbmQgKGZpbGwgc3RhcnQgYmV5b25kKVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzdGFydCA9IDEwXG4gICAgYW5kIGJleW9uZCA9IDEwMFxuICAgIGluXG4gICAgY2hlY2tfcG9wIHN0YXJ0IGJleW9uZCAoZmlsbCBzdGFydCBiZXlvbmQpXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc3RhcnQgPSAxMFxuICAgIGFuZCBiZXlvbmQgPSAxMDBcbiAgICBpblxuICAgIGNoZWNrX2VsZW1lbnQgc3RhcnQgYmV5b25kIChmaWxsIHN0YXJ0IGJleW9uZClcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIFJiLihjaGVja19pbnZhcmlhbnQgZW1wdHkpXG5cblxubGV0JXRlc3QgXyA9XG4gICAgUmIuY2hlY2tfaW52YXJpYW50IChmaWxsIDAgMjUpXG4iLCJpbmNsdWRlIFN0ZGxpYi5MaXN0XG5pbmNsdWRlIEludGVyZmFjZXNcblxudHlwZSAnYSB0ID0gJ2EgbGlzdFxuXG5sZXQgcmV0dXJuIChhOidhKTogJ2EgdCA9IFthXVxuXG5sZXQgcmVjICg+Pj0pIChsOidhIHQpIChmOidhIC0+ICdiIHQpOiAnYiB0ID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT5cbiAgICAgW11cbiAgfCBoZCA6OiB0bCAtPlxuICAgICBmIGhkIEAgKHRsID4+PSBmKVxuXG5sZXQgKCBsZXQqICkgPSAoPj49KVxuXG5cbmxldCAoPj0+KSAoZjonYSAtPiAnYiB0KSAoZzonYiAtPiAnYyB0KSAoYTonYSk6ICdjIHQgPVxuICBmIGEgPj49IGdcblxuXG5sZXQgKDwqPikgKGZsc3Q6ICgnYSAtPiAnYikgdCkgKGxzdDonYSB0KTogJ2IgdCA9XG4gIGZsc3QgPj49IGZ1biBmIC0+IG1hcCBmIGxzdFxuXG5sZXQgam9pbiA9IGNvbmNhdFxuXG5sZXQgZmluZCAocDonYSAtPiBib29sKSAobDonYSB0KTogJ2Egb3B0aW9uID1cbiAgdHJ5XG4gICAgU29tZSAoZmluZCBwIGwpXG4gIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgTm9uZVxuXG5cblxuXG5sZXQgc3BsaXRfaGVhZF90YWlsIChsc3Q6ICdhIHQpOiAnYSAqICdhIHQgPVxuICAgIGFzc2VydCAobHN0IDw+IFtdKTtcbiAgICBtYXRjaCBsc3Qgd2l0aFxuICAgIHwgW10gLT5cbiAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbCEgKilcbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIGhkLCB0bFxuXG5cblxuXG5cbmxldCBtYXBfYW5kX2ZpbHRlciAoZjonYSAtPiAnYiBvcHRpb24pIChsOidhIGxpc3QpOiAnYiBsaXN0ID1cbiAgbGV0IHJlYyBtYXAgPSBmdW5jdGlvblxuICAgIHwgW10gLT5cbiAgICAgICBbXVxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgICBtYXRjaCBmIGhkIHdpdGhcbiAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICBtYXAgdGxcbiAgICAgICB8IFNvbWUgYiAtPlxuICAgICAgICAgIGIgOjogbWFwIHRsXG4gIGluXG4gIG1hcCBsXG5cblxuXG5sZXQgc3BsaXRfYXQgKHA6J2EgLT4gYm9vbCkgKGw6ICdhIHQpOiAnYSB0ICogJ2EgdCA9XG4gIGxldCByZWMgc3BsaXQgcHJlZml4IHJlc3QgPVxuICAgIG1hdGNoIHJlc3Qgd2l0aFxuICAgIHwgW10gLT5cbiAgICAgICByZXYgcHJlZml4LCByZXN0XG4gICAgfCBoZCA6OiB0bCAgLT5cbiAgICAgICBpZiBwIGhkIHRoZW5cbiAgICAgICAgIHJldiBwcmVmaXgsIHJlc3RcbiAgICAgICBlbHNlXG4gICAgICAgICBzcGxpdCAoaGQgOjogcHJlZml4KSB0bFxuICBpblxuICBzcGxpdCBbXSBsXG5cblxuXG5sZXQgdHJhbnNwb3NlIChyb3dfbGlzdDogJ2EgbGlzdCBsaXN0KTogJ2EgbGlzdCBsaXN0ID1cbiAgICBhc3NlcnQgKHJvd19saXN0IDw+IFtdKTtcbiAgICBsZXQgZmlyc3RfY29sdW1uIHJvd19saXN0ID1cbiAgICAgICAgKCogRXh0cmFjdCB0aGUgZmlyc3QgY29sdW1uIG9mIFtyb3dfbGlzdF0uICopXG4gICAgICAgIGZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gcm93IChjb2x1bW4sIHJvd19saXN0KS0+XG4gICAgICAgICAgICAgICAgbWF0Y2ggcm93IHdpdGhcbiAgICAgICAgICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZVxuICAgICAgICAgICAgICAgIHwgZWwgOjogcmVzdF9yb3cgLT5cbiAgICAgICAgICAgICAgICAgICAgZWwgOjogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICByZXN0X3JvdyA6OiByb3dfbGlzdFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgcm93X2xpc3RcbiAgICAgICAgICAgIChbXSwgW10pXG4gICAgaW5cbiAgICBsZXQgcmVjIGdldF9jb2x1bW5zIGNvbHVtbnMgcm93X2xpc3QgPVxuICAgICAgICBtYXRjaCByb3dfbGlzdCB3aXRoXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBObyByb3dzIGlzIG5vdCBhbGxvd2VkLiAqKVxuXG4gICAgICAgIHwgW10gOjogXyAtPlxuICAgICAgICAgICAgY29sdW1uc1xuXG4gICAgICAgIHwgKF8gOjogXykgOjogXyAtPlxuICAgICAgICAgICAgbGV0IGNvbHVtbiwgcm93X2xpc3QgPSBmaXJzdF9jb2x1bW4gcm93X2xpc3QgaW5cbiAgICAgICAgICAgIGdldF9jb2x1bW5zIChjb2x1bW4gOjogY29sdW1ucykgcm93X2xpc3RcbiAgICBpblxuICAgIHJldiAoZ2V0X2NvbHVtbnMgW10gcm93X2xpc3QpXG5cblxuXG5cblxubW9kdWxlIE1vbmFkaWMgKE06IE1PTkFEKSA9XG4gIHN0cnVjdFxuICAgIGxldCBmb2xkaV9sZWZ0IChmOmludCAtPiAnYSAtPiAnYiAtPiAnYiBNLnQpIChsOidhIHQpIChzdGFydDonYilcbiAgICAgICAgOiAnYiBNLnQgPVxuICAgICAgbGV0IHJlYyBmb2xkaSBpIGwgc3RhcnQgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICBNLnJldHVybiBzdGFydFxuICAgICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgICAgIE0uKGYgaSBoZCBzdGFydCA+Pj0gZm9sZGkgKGkrMSkgdGwpXG4gICAgICBpblxuICAgICAgZm9sZGkgMCBsIHN0YXJ0XG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOidhIC0+ICdiIC0+ICdiIE0udCkgKGw6J2EgdCkgKHN0YXJ0OidiKTogJ2IgTS50ID1cbiAgICAgIGZvbGRpX2xlZnQgKGZ1biBfIC0+IGYpIGwgc3RhcnRcblxuICAgIGxldCBmb2xkX3JpZ2h0IChmOidhIC0+ICdiIC0+ICdiIE0udCkgKGw6J2EgdCkgKHN0YXJ0OidiKTogJ2IgTS50ID1cbiAgICAgIGZvbGRfbGVmdCBmIChyZXYgbCkgc3RhcnRcbiAgZW5kXG5cblxuXG5cbigqIFVuaXQgVGVzdHMgKilcblxubGV0JXRlc3QgXyA9XG4gICAgdHJhbnNwb3NlIFsgWzFdIF0gPSBbIFsxXSBdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgdHJhbnNwb3NlXG4gICAgICAgIFsgWzE7MjszXSBdID0gWyBbMV07IFsyXTsgWzNdIF1cblxubGV0JXRlc3QgXyA9XG4gICAgdHJhbnNwb3NlXG4gICAgICAgIFsgWzE7MjszXTsgWzQ7NTs2XSBdID0gWyBbMTs0XTsgWzI7NV07IFszOzZdIF1cbiIsIm1vZHVsZSBCYXNpYyA9XG5zdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSB7XG4gICAgICAgIGZyb250OiAnYSBsaXN0O1xuICAgICAgICByZWFyOiAgJ2EgbGlzdDtcbiAgICB9XG5cblxuICAgIGxldCBlbXB0eTogJ2EgdCA9XG4gICAgICAgIHtmcm9udCA9IFtdOyByZWFyID0gW107fVxuXG5cbiAgICBsZXQgcHVzaF9mcm9udCAoZTogJ2EpIChmaWZvOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIHtmaWZvIHdpdGggZnJvbnQgPSBlIDo6IGZpZm8uZnJvbnR9XG5cblxuICAgIGxldCBwdXNoX3JlYXIgKGU6ICdhKSAoZmlmbzogJ2EgdCk6ICdhIHQgPVxuICAgICAgICB7ZmlmbyB3aXRoIHJlYXIgPSBlIDo6IGZpZm8ucmVhcn1cblxuXG4gICAgbGV0IHBvcF9mcm9udCAoZmlmbzogJ2EgdCk6ICgnYSAqICdhIHQpIG9wdGlvbiA9XG4gICAgICAgIG1hdGNoIGZpZm8uZnJvbnQgd2l0aFxuICAgICAgICB8IGhkIDo6IGZyb250IC0+XG4gICAgICAgICAgICBTb21lIChoZCwge2ZpZm8gd2l0aCBmcm9udH0pXG5cbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgbWF0Y2ggTGlzdC5yZXYgZmlmby5yZWFyIHdpdGhcbiAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICBOb25lXG5cbiAgICAgICAgICAgIHwgaGQgOjogZnJvbnQgLT5cbiAgICAgICAgICAgICAgICBTb21lIChoZCwge2Zyb250OyByZWFyID0gW119KVxuXG4gICAgbGV0IHByZXBlbmQgKGZpZm86ICdhIHQpIChsc3Q6ICdhIGxpc3QpOiAnYSBsaXN0ID1cbiAgICAgICAgZmlmby5mcm9udCBAIExpc3QucmV2X2FwcGVuZCBmaWZvLnJlYXIgbHN0XG5lbmRcblxuXG5cblxudHlwZSAnYSB0ID1cbiAgICB8IEVtcHR5XG4gICAgfCBOb25lbXB0eSBvZiAnYSBCYXNpYy50ICogJ2FcblxuXG5sZXQgaXNfZW1wdHkgKGY6ICdhIHQpOiBib29sID1cbiAgICBtYXRjaCBmIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIHRydWVcbiAgICB8IF8gLT5cbiAgICAgICAgZmFsc2VcblxuXG5sZXQgaGFzX3NvbWUgKGY6ICdhIHQpOiBib29sID1cbiAgICBub3QgKGlzX2VtcHR5IGYpXG5cblxubGV0IGVtcHR5OiAnYSB0ID1cbiAgICBFbXB0eVxuXG5cbmxldCBwdXNoX2Zyb250IChlOiAnYSkgKGY6ICdhIHQpOiAnYSB0ID1cbiAgICBtYXRjaCBmIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIE5vbmVtcHR5IChCYXNpYy5lbXB0eSwgZSlcbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgTm9uZW1wdHkgKEJhc2ljLnB1c2hfZnJvbnQgZSBsZiwgbGFzdClcblxuXG5sZXQgcHVzaF9yZWFyIChlOiAnYSkgKGY6ICdhIHQpOiAnYSB0ID1cbiAgICBtYXRjaCBmIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIE5vbmVtcHR5IChCYXNpYy5lbXB0eSwgZSlcbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgTm9uZW1wdHkgKEJhc2ljLnB1c2hfcmVhciBsYXN0IGxmLCBlKVxuXG5cbmxldCBwb3BfZnJvbnQgKGY6ICdhIHQpOiAoJ2EgKiAnYSB0KSBvcHRpb24gPVxuICAgIG1hdGNoIGYgd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgTm9uZVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBtYXRjaCBCYXNpYy5wb3BfZnJvbnQgbGYgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIFNvbWUgKGxhc3QsIGVtcHR5KVxuICAgICAgICB8IFNvbWUgKGZpcnN0LCBsZikgLT5cbiAgICAgICAgICAgIFNvbWUgKGZpcnN0LCBOb25lbXB0eSAobGYsIGxhc3QpKVxuXG5cbmxldCB1cGRhdGVfZmlyc3QgKGY6ICdhIC0+ICdhKSAoZmlmbzogJ2EgdCk6ICdhIHQgPVxuICAgIG1hdGNoIGZpZm8gd2l0aFxuICAgIHwgRW1wdHkgLT5cbiAgICAgICAgRW1wdHlcbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgbWF0Y2ggQmFzaWMucG9wX2Zyb250IGxmIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBOb25lbXB0eSAobGYsIGYgbGFzdClcbiAgICAgICAgfCBTb21lIChmaXJzdCwgbGYpIC0+XG4gICAgICAgICAgICBOb25lbXB0eSAoQmFzaWMucHVzaF9mcm9udCAoZiBmaXJzdCkgbGYsIGxhc3QpXG5cblxubGV0IHVwZGF0ZV9sYXN0IChmOiAnYSAtPiAnYSkgKGZpZm86ICdhIHQpOiAnYSB0ID1cbiAgICBtYXRjaCBmaWZvIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIEVtcHR5XG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIE5vbmVtcHR5IChsZiwgZiBsYXN0KVxuXG5cblxubGV0IHRvX2xpc3QgKGZpZm86ICdhIHQpOiAnYSBsaXN0ID1cbiAgICBtYXRjaCBmaWZvIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIFtdXG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIEJhc2ljLnByZXBlbmQgbGYgW2xhc3RdXG5cblxuXG5cblxuXG5cblxuXG5cbigqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKilcbigqIFVuaXQgVGVzdHMgKilcbigqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKilcblxubGV0JXRlc3QgXyA9XG4gICAgdG9fbGlzdFxuICAgICAgICAoZW1wdHkgfD4gcHVzaF9yZWFyIDAgfD4gcHVzaF9yZWFyIDEgfD4gcHVzaF9yZWFyIDIpXG4gICAgPVxuICAgIFswOyAxOyAyXVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGVtcHR5IHw+IHB1c2hfcmVhciAwIHw+IHBvcF9mcm9udFxuICAgID1cbiAgICBTb21lICgwLCBlbXB0eSlcblxuXG5sZXQldGVzdCBfID1cbiAgICBtYXRjaFxuICAgICAgICBlbXB0eVxuICAgICAgICB8PiBwdXNoX3JlYXIgMCB8PiBwdXNoX3JlYXIgMVxuICAgICAgICB8PiB1cGRhdGVfZmlyc3QgKGZ1biBfIC0+IDEwKSB8PiBwb3BfZnJvbnRcbiAgICB3aXRoXG4gICAgfCBTb21lICgxMCwgZmlmbyApIC0+XG4gICAgICAgIHBvcF9mcm9udCBmaWZvID0gU29tZSAoMSwgZW1wdHkpXG4gICAgfCBfIC0+XG4gICAgICAgIGZhbHNlXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbWF0Y2hcbiAgICAgICAgZW1wdHlcbiAgICAgICAgfD4gcHVzaF9yZWFyIDAgfD4gcHVzaF9yZWFyIDFcbiAgICAgICAgfD4gdXBkYXRlX2xhc3QgKGZ1biBfIC0+IDEwKSB8PiBwb3BfZnJvbnRcbiAgICB3aXRoXG4gICAgfCBTb21lICgwLCBmaWZvICkgLT5cbiAgICAgICAgcG9wX2Zyb250IGZpZm8gPSBTb21lICgxMCwgZW1wdHkpXG4gICAgfCBfIC0+XG4gICAgICAgIGZhbHNlXG4iLCJtb2R1bGUgdHlwZSBPUkRFUiA9XG5zaWdcbiAgICB2YWwgb3JkZXI6IGludFxuZW5kXG5cblxubW9kdWxlIE8zMjogT1JERVIgPVxuc3RydWN0XG4gICAgbGV0IG9yZGVyID0gMzJcbmVuZFxuXG5cblxuXG5tb2R1bGUgTWFwMCAoT3JkZXI6IE9SREVSKSAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSAgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBPcmRlclxuXG4gICAgbGV0IG9kZF9vcmRlcjogYm9vbCA9XG4gICAgICAgIGFzc2VydCAoMyA8PSBvcmRlcik7XG4gICAgICAgIG9yZGVyIC8gMiAqIDIgPCBvcmRlclxuXG4gICAgbGV0IG1heF9rZXlzOiBpbnQgPSBvcmRlciAtIDFcblxuICAgIGxldCBtaW5fa2V5czogaW50ID1cbiAgICAgICAgaWYgb2RkX29yZGVyIHRoZW5cbiAgICAgICAgICAgIChvcmRlciAtIDEpIC8gMlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBvcmRlciAvIDIgLSAxXG5cblxuICAgIHR5cGUga2V5ID0gS2V5LnRcblxuICAgIHR5cGUgJ2EgcGFpcnMgPSAoS2V5LnQgKiAnYSkgYXJyYXlcblxuICAgIHR5cGUgJ2EgdCA9XG4gICAgICAgIHwgTGVhZiBvZiAnYSBwYWlyc1xuICAgICAgICB8IE5vZGUgb2YgJ2EgcGFpcnMgKiAnYSB0IGFycmF5XG5cblxuXG5cblxuICAgICgqIEdlbmVyYWwgZnVuY3Rpb25zLiAqKVxuXG5cbiAgICBsZXQgaXNfZW1wdHkgKG1hcDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYga2V5cyAtPlxuICAgICAgICAgICAgQXJyYXkubGVuZ3RoIGtleXMgPSAwXG4gICAgICAgIHwgTm9kZSBfIC0+XG4gICAgICAgICAgICBmYWxzZVxuXG5cbiAgICBsZXQgcmVjIGNhcmRpbmFsIChtYXA6ICdhIHQpOiBpbnQgPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYga2V5cyAtPlxuICAgICAgICAgICAgQXJyYXkubGVuZ3RoIGtleXNcbiAgICAgICAgfCBOb2RlIChrZXlzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIEFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgICAgICAgIChmdW4gbiBjaGlsZCAtPiBuICsgY2FyZGluYWwgY2hpbGQpXG4gICAgICAgICAgICAgICAgKEFycmF5Lmxlbmd0aCBrZXlzKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuXG5cbiAgICBsZXQgZW1wdHk6ICdhIHQgPVxuICAgICAgICBMZWFmIFt8fF1cblxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpIChtYXA6ICdiIHQpOiAnYSA9XG4gICAgICAgIGxldCByZWMgZm9sZCBhY2N1IG1hcCA9XG4gICAgICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgICAgIChmdW4gYSAoa2V5LHZhbHVlKSAtPiBmIGEga2V5IHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICBhY2N1XG4gICAgICAgICAgICAgICAgICAgIHBhaXJzXG4gICAgICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgICAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgICAgIGFzc2VydCAobiArIDEgPSBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGxldCByZWMgZm9sZF9pbnRlcmlvciBhY2N1IGkgPVxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKGkgPCBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICBpZiBpID0gbiB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkIGFjY3UgY2hpbGRyZW4uKGkpXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRfaW50ZXJpb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbGQgYWNjdSBjaGlsZHJlbi4oaSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnN0IHBhaXJzLihpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzbmQgcGFpcnMuKGkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSArIDEpXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBmb2xkX2ludGVyaW9yIGFjY3UgMFxuICAgICAgICBpblxuICAgICAgICBmb2xkIHN0YXJ0IG1hcFxuXG5cbiAgICBsZXQgZm9sZF9yaWdodCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2IgLT4gJ2EpIChzdGFydDogJ2EpIChtYXA6ICdiIHQpOiAnYSA9XG4gICAgICAgIGxldCByZWMgZm9sZCBhY2N1IG1hcCA9XG4gICAgICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZm9sZF9yaWdodFxuICAgICAgICAgICAgICAgICAgICAoZnVuIChrZXksdmFsdWUpIGEgLT4gZiBhIGtleSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgcGFpcnNcbiAgICAgICAgICAgICAgICAgICAgYWNjdVxuICAgICAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICAgICAgbGV0IG4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgICAgICBhc3NlcnQgKG4gKyAxID0gQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVjIGZvbGRfaW50ZXJpb3IgYWNjdSBpID1cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgICAgICAgICAgICAgICAgICBpZiBpID0gMCB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2N1XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaSAtIDEgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoaSA8IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkX2ludGVyaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmIGFjY3UgKGZzdCBwYWlycy4oaSkpIChzbmQgcGFpcnMuKGkpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLihpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBmb2xkX2ludGVyaW9yIChmb2xkIGFjY3UgY2hpbGRyZW4uKG4pKSBuXG4gICAgICAgIGluXG4gICAgICAgIGZvbGQgc3RhcnQgbWFwXG5cblxuXG4gICAgbGV0IGJpbmRpbmdzIChtYXA6ICdhIHQpOiAoS2V5LnQgKiAnYSkgbGlzdCA9XG4gICAgICAgIGZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gbHN0IGtleSB2YWx1ZSAtPiAoa2V5LHZhbHVlKSA6OiBsc3QpXG4gICAgICAgICAgICBbXVxuICAgICAgICAgICAgbWFwXG5cblxuICAgIGxldCBrZXlzIChtYXA6ICdhIHQpOiBLZXkudCBsaXN0ID1cbiAgICAgICAgZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biBsc3Qga2V5IF8gLT4ga2V5IDo6IGxzdClcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgICBtYXBcblxuXG5cblxuXG5cblxuXG4gICAgKCogU2VhcmNoaW5nICopXG5cblxuICAgIGxldCBic2VhcmNoIChrZXk6IEtleS50KSAoYXJyOiAnYSBwYWlycyk6IGludCAqIGJvb2wgPVxuICAgICAgICBBcnJheS5iaW5zZWFyY2ggS2V5LmNvbXBhcmUgZnN0IGtleSBhcnJcblxuXG5cbiAgICBsZXQgcmVjIGZpbmRfb3B0IChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogJ2Egb3B0aW9uID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIFNvbWUgKHNuZCBwYWlycy4oaSkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgTm9uZVxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgU29tZSAoc25kIHBhaXJzLihpKSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBmaW5kX29wdCBrZXkgY2hpbGRyZW4uKGkpXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgKCogSW5zZXJ0aW9uXG4gICAgICogPT09PT09PT09XG4gICAgICopXG5cbiAgICB0eXBlICdhIGluc2VydCA9XG4gICAgICAgIHwgTm9ybWFsX2luc2VydCBvZiAnYSB0XG4gICAgICAgIHwgU3BsaXRfaW5zZXJ0IG9mICdhIHQgKiAoS2V5LnQgKiAnYSkgKiAnYSB0XG5cblxuICAgIGxldCBzdWJhcnJheSAoYXJyOiAnYSBhcnJheSkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCk6ICdhIGFycmF5ID1cbiAgICAgICAgKCogVGhlIHN1YmFycmF5IG9mIFthcnJdIHN0YXJ0aW5nIGF0IFtzdGFydF0gYW5kIGVuZGluZyBvbmUgYmVmb3JlIFtiZXlvbmRdLiAqKVxuICAgICAgICBhc3NlcnQgKDAgPD0gc3RhcnQpO1xuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgICAgIGFzc2VydCAoYmV5b25kIDw9IEFycmF5Lmxlbmd0aCBhcnIpO1xuICAgICAgICBBcnJheS5zdWIgYXJyIHN0YXJ0IChiZXlvbmQgLSBzdGFydClcblxuXG4gICAgbGV0IGluc2VydF9zdWJhcnJheVxuICAgICAgICAgICAgKGFycjogJ2EgYXJyYXkpIChpOiBpbnQpICh4OiAnYSkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludClcbiAgICAgICAgOiAnYSBhcnJheVxuICAgICAgICA9XG4gICAgICAgICgqIFRoZSBzdWJhcnJheSBvZiBbYXJyXSBzdGFydGluZyBhdCBbc3RhcnRdIGFuZCBlbmRpbmcgb25lIGJlZm9yZSBbYmV5b25kXVxuICAgICAgICAgICB3aXRoIFt4XSBpbnNlcnRlZCBhdCBwb3NpdGlvbiBbaV0uICopXG4gICAgICAgIGFzc2VydCAoMCA8PSBzdGFydCk7XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gaSk7XG4gICAgICAgIGFzc2VydCAoaSA8PSBiZXlvbmQpO1xuICAgICAgICBhc3NlcnQgKGJleW9uZCA8PSBBcnJheS5sZW5ndGggYXJyKTtcbiAgICAgICAgbGV0IGFycjIgPSBBcnJheS5tYWtlIChiZXlvbmQgLSBzdGFydCArIDEpIHggaW5cbiAgICAgICAgQXJyYXkuYmxpdCBhcnIgc3RhcnQgYXJyMiAwIChpIC0gc3RhcnQpO1xuICAgICAgICBBcnJheS5ibGl0IGFyciBpIGFycjIgKGkgLSBzdGFydCArIDEpIChiZXlvbmQgLSBpKTtcbiAgICAgICAgYXJyMlxuXG5cblxuICAgIGxldCBzcGxpdF9zdWJhcnJheVxuICAgICAgICAgICAgKGFycjogJ2EgYXJyYXkpIChpOiBpbnQpICh4OiAnYSkgKHk6ICdhKSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KVxuICAgICAgICA6ICdhIGFycmF5XG4gICAgICAgID1cbiAgICAgICAgKCogVGhlIHN1YmFycmF5IG9mIFthcnJdIHN0YXJ0aW5nIGF0IFtzdGFydF0gYW5kIGVuZGluZyBvbmUgYmVmb3JlIFtiZXlvbmRdXG4gICAgICAgICAgIHdpdGggW3hdIGluc2VydGVkIGF0IHBvc2l0aW9uIFtpXSBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIGF0IHBvc2l0aW9uXG4gICAgICAgICAgIFtpXSByZXBsYWNlZCBieSBbeV0uICopXG4gICAgICAgIGFzc2VydCAoaSA8IGJleW9uZCk7XG4gICAgICAgIGxldCBhcnIgPSBpbnNlcnRfc3ViYXJyYXkgYXJyIGkgeCBzdGFydCBiZXlvbmQgaW5cbiAgICAgICAgYXJyLihpIC0gc3RhcnQgKyAxKSA8LSB5O1xuICAgICAgICBhcnJcblxuXG5cblxuICAgIGxldCBhZGRfaW5fbGVhZiAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSkgKHBhaXJzOiAnYSBwYWlycyk6ICdhIGluc2VydCA9XG4gICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgTm9ybWFsX2luc2VydCAoTGVhZiAoQXJyYXkucmVwbGFjZSBpIChrZXksIHZhbHVlKSBwYWlycykpXG5cbiAgICAgICAgZWxzZSBpZiBsZW4gPCBtYXhfa2V5cyB0aGVuXG4gICAgICAgICAgICAoKiBMZWFmIGlzIG5vdCBmdWxsLiAqKVxuICAgICAgICAgICAgTm9ybWFsX2luc2VydCAoTGVhZiAoQXJyYXkuaW5zZXJ0IGkgKGtleSwgdmFsdWUpIHBhaXJzKSlcblxuICAgICAgICBlbHNlXG4gICAgICAgICAgICAoKiBMZWFmIGlzIGZ1bGwgKilcbiAgICAgICAgICAgIGxldCBpbnNlcnRfc3ViYXJyYXkgPSBpbnNlcnRfc3ViYXJyYXkgcGFpcnMgaSAoa2V5LCB2YWx1ZSlcbiAgICAgICAgICAgIGFuZCBrID0gb3JkZXIgLyAyXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgaWYgb2RkX29yZGVyIHRoZW5cbiAgICAgICAgICAgICAgICBpZiBpID0gayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ICA9IHN1YmFycmF5IHBhaXJzIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHQgPSBzdWJhcnJheSBwYWlycyBrIGxlblxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKExlYWYgbGVmdCwgKGtleSwgdmFsdWUpLCBMZWFmIHJpZ2h0KVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgaSA8IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCAgPSBpbnNlcnRfc3ViYXJyYXkgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodCA9IHN1YmFycmF5IHBhaXJzIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoTGVhZiBsZWZ0LCBwYWlycy4oayAtIDEpLCBMZWFmIHJpZ2h0KVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgID0gc3ViYXJyYXkgcGFpcnMgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodCA9IGluc2VydF9zdWJhcnJheSAoayArIDEpIGxlblxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKExlYWYgbGVmdCwgcGFpcnMuKGspLCBMZWFmIHJpZ2h0KVxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICAgICgqIGV2ZW4gb3JkZXIgKilcbiAgICAgICAgICAgICAgICBpZiBpIDwgayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ICA9IGluc2VydF9zdWJhcnJheSAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0ID0gc3ViYXJyYXkgcGFpcnMgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChMZWFmIGxlZnQsIHBhaXJzLihrIC0gMSksIExlYWYgcmlnaHQpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCAgPSBzdWJhcnJheSBwYWlycyAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0ID0gaW5zZXJ0X3N1YmFycmF5IGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoTGVhZiBsZWZ0LCBwYWlycy4oayAtIDEpLCBMZWFmIHJpZ2h0KVxuICAgICAgICAgICAgZW5kXG5cblxuXG5cbiAgICBsZXQgYWRkX2luX25vZGVcbiAgICAgICAgICAgIChpOiBpbnQpXG4gICAgICAgICAgICAobGVmdDogJ2EgdClcbiAgICAgICAgICAgIChwYWlyOiBLZXkudCAqICdhKVxuICAgICAgICAgICAgKHJpZ2h0OiAnYSB0KVxuICAgICAgICAgICAgKHBhaXJzOiAnYSBwYWlycylcbiAgICAgICAgICAgIChjaGlsZHJlbjogJ2EgdCBhcnJheSlcbiAgICAgICAgOiAnYSBpbnNlcnRcbiAgICAgICAgPVxuICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgIGlmIGxlbiA8IG1heF9rZXlzIHRoZW5cbiAgICAgICAgICAgIGxldCBwYWlycyA9IEFycmF5Lmluc2VydCBpIHBhaXIgcGFpcnNcbiAgICAgICAgICAgIGFuZCBjaGlsZHJlbiA9IEFycmF5Lmluc2VydCBpIGxlZnQgY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IChpICsgMSkgY2hpbGRyZW4pO1xuICAgICAgICAgICAgY2hpbGRyZW4uKGkgKyAxKSA8LSByaWdodDtcbiAgICAgICAgICAgIE5vcm1hbF9pbnNlcnQgKE5vZGUgKHBhaXJzLCBjaGlsZHJlbikpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgICgqIE5vZGUgaXMgZnVsbC4gKilcbiAgICAgICAgICAgIGxldCBrID0gb3JkZXIgLyAyXG4gICAgICAgICAgICBhbmQgaW5zZXJ0X3N1YmFycmF5ID0gaW5zZXJ0X3N1YmFycmF5IHBhaXJzIGkgcGFpclxuICAgICAgICAgICAgYW5kIHNwbGl0X3N1YmFycmF5IHN0YXJ0IGJleW9uZCA9XG4gICAgICAgICAgICAgICAgc3BsaXRfc3ViYXJyYXkgY2hpbGRyZW4gaSBsZWZ0IHJpZ2h0IHN0YXJ0IGJleW9uZFxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGlmIG9kZF9vcmRlciB0aGVuXG4gICAgICAgICAgICAgICAgaWYgaSA9IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdF9wYWlycyAgICAgPSBzdWJhcnJheSBwYWlycyAgICAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIGxlZnRfY2hpbGRyZW4gID0gc3ViYXJyYXkgY2hpbGRyZW4gMCAoayArIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9wYWlycyAgICA9IHN1YmFycmF5IHBhaXJzICAgIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9jaGlsZHJlbiA9IHN1YmFycmF5IGNoaWxkcmVuIGsgKGxlbiArIDEpXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggayBsZWZ0X2NoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAwIHJpZ2h0X2NoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgbGVmdF9jaGlsZHJlbi4oaykgIDwtIGxlZnQ7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0X2NoaWxkcmVuLigwKSA8LSByaWdodDtcbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKGxlZnRfcGFpcnMsIGxlZnRfY2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcixcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKHJpZ2h0X3BhaXJzLCByaWdodF9jaGlsZHJlbikpXG4gICAgICAgICAgICAgICAgZWxzZSBpZiBpIDwgayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0X3BhaXJzICAgICA9IGluc2VydF9zdWJhcnJheSAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIGxlZnRfY2hpbGRyZW4gID0gc3BsaXRfc3ViYXJyYXkgIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfcGFpcnMgICAgPSBzdWJhcnJheSBwYWlycyAgICBrIGxlblxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfY2hpbGRyZW4gPSBzdWJhcnJheSBjaGlsZHJlbiBrIChsZW4gKyAxKVxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IChrIC0gMSkgcGFpcnMpO1xuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAobGVmdF9wYWlycywgbGVmdF9jaGlsZHJlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlycy4oayAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAocmlnaHRfcGFpcnMsIHJpZ2h0X2NoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0X3BhaXJzICAgICA9IHN1YmFycmF5IHBhaXJzICAgIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgbGVmdF9jaGlsZHJlbiAgPSBzdWJhcnJheSBjaGlsZHJlbiAwIChrICsgMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X3BhaXJzICAgID0gaW5zZXJ0X3N1YmFycmF5IChrICsgMSkgbGVuXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9jaGlsZHJlbiA9IHNwbGl0X3N1YmFycmF5ICAoayArIDEpIChsZW4gKyAxKSBpblxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IGsgcGFpcnMpO1xuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAobGVmdF9wYWlycywgbGVmdF9jaGlsZHJlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlycy4oayksXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChyaWdodF9wYWlycywgcmlnaHRfY2hpbGRyZW4pKVxuICAgICAgICAgICAgICAgIGVuZFxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICAgICgqIGV2ZW4gb3JkZXIgKilcbiAgICAgICAgICAgICAgICBpZiBpIDwgayB0aGVuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0X3BhaXJzICAgICA9IGluc2VydF9zdWJhcnJheSAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIGxlZnRfY2hpbGRyZW4gID0gc3BsaXRfc3ViYXJyYXkgIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfcGFpcnMgICAgPSBzdWJhcnJheSBwYWlycyAgICBrIGxlblxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfY2hpbGRyZW4gPSBzdWJhcnJheSBjaGlsZHJlbiBrIChsZW4gKyAxKVxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IChrIC0gMSkgcGFpcnMpO1xuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAobGVmdF9wYWlycywgbGVmdF9jaGlsZHJlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlycy4oayAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAocmlnaHRfcGFpcnMsIHJpZ2h0X2NoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0X3BhaXJzICAgICA9IHN1YmFycmF5IHBhaXJzICAgIDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgbGVmdF9jaGlsZHJlbiAgPSBzdWJhcnJheSBjaGlsZHJlbiAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X3BhaXJzICAgID0gaW5zZXJ0X3N1YmFycmF5IGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9jaGlsZHJlbiA9IHNwbGl0X3N1YmFycmF5ICBrIChsZW4gKyAxKVxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IChrIC0gMSkgcGFpcnMpO1xuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAobGVmdF9wYWlycywgbGVmdF9jaGlsZHJlbiksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlycy4oayAtIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAocmlnaHRfcGFpcnMsIHJpZ2h0X2NoaWxkcmVuKSlcbiAgICAgICAgICAgIGVuZFxuXG5cblxuICAgIGxldCByZWMgYWRkX2F1eCAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSkgKG1hcDogJ2EgdCk6ICdhIGluc2VydCA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgYWRkX2luX2xlYWYga2V5IHZhbHVlIHBhaXJzXG5cbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgICgqIEFuIGV4YWN0IG1hdGNoIGhhcyBiZWVuIGZvdW5kLiBUaGVyZWZvcmUgdXBkYXRlIHRoZSB2YWx1ZS4gKilcbiAgICAgICAgICAgICAgICBsZXQgcGFpcnMgPSBBcnJheS5yZXBsYWNlIGkgKGtleSx2YWx1ZSkgcGFpcnMgaW5cbiAgICAgICAgICAgICAgICBOb3JtYWxfaW5zZXJ0IChOb2RlIChwYWlycywgY2hpbGRyZW4pKVxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICAgICgqKiBBZGQgdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gdGhlIFtpXXRoIGNoaWxkLiAqKVxuICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggaSBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgbWF0Y2ggYWRkX2F1eCBrZXkgdmFsdWUgY2hpbGRyZW4uKGkpIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vcm1hbF9pbnNlcnQgY2hpbGQgLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gQXJyYXkucmVwbGFjZSBpIGNoaWxkIGNoaWxkcmVuIGluXG4gICAgICAgICAgICAgICAgICAgIE5vcm1hbF9pbnNlcnQgKE5vZGUgKHBhaXJzLCBjaGlsZHJlbikpXG4gICAgICAgICAgICAgICAgfCBTcGxpdF9pbnNlcnQgKHUsIHksIHYpIC0+XG4gICAgICAgICAgICAgICAgICAgIGFkZF9pbl9ub2RlIGkgdSB5IHYgcGFpcnMgY2hpbGRyZW5cbiAgICAgICAgICAgIGVuZFxuXG5cblxuICAgIGxldCBhZGQgKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbWF0Y2ggYWRkX2F1eCBrZXkgdmFsdWUgbWFwIHdpdGhcbiAgICAgICAgfCBOb3JtYWxfaW5zZXJ0IG1hcCAtPlxuICAgICAgICAgICAgbWFwXG4gICAgICAgIHwgU3BsaXRfaW5zZXJ0IChsZWZ0LCBwYWlyLCByaWdodCkgLT5cbiAgICAgICAgICAgICgqIHRyZWUgZ3Jvd3MgYXQgdGhlIHJvb3QgKilcbiAgICAgICAgICAgIE5vZGUgKFt8cGFpcnxdLCBbfGxlZnQ7IHJpZ2h0fF0pXG5cblxuXG5cbiAgICAoKiBEZWxldGlvblxuICAgICAqID09PT09PT09XG4gICAgICopXG5cbiAgICB0eXBlICdhIGRlbGV0ZSA9IHtcbiAgICAgICAgdHJlZTogICdhIHQ7ICAgICAgICAoKiBUaGUgdHJlZSB3aXRoIHRoZSBkZWxldGVkIGtleSB2YWx1ZSBwYWlyLiAqKVxuICAgICAgICBwYWlyOiAgIEtleS50ICogJ2E7ICgqIFRoZSBkZWxldGVkIGtleSB2YWx1ZSBwYWlyLiAqKVxuICAgICAgICB1bmRlcmZsb3c6IGJvb2w7ICAgICgqIG9uZSBrZXkgbGVzcyB0aGFuIHRoZSBtaW5pbWFsIG51bWJlciAqKVxuICAgIH1cblxuXG4gICAgbGV0IG5vdF9taW5pbWFsIChwYWlyczogJ2EgcGFpcnMpOiBib29sID1cbiAgICAgICAgbWluX2tleXMgPCBBcnJheS5sZW5ndGggcGFpcnNcblxuXG4gICAgbGV0IHJlcGxhY2UyXG4gICAgICAgICAgICAoaTogaW50KSAobGVmdDogJ2EgdCkgKHJpZ2h0OiAnYSB0KSAoY2hpbGRyZW46ICdhIHQgYXJyYXkpXG4gICAgICAgIDogJ2EgdCBhcnJheVxuICAgICAgICA9XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IEFycmF5LmNvcHkgY2hpbGRyZW4gaW5cbiAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCBpIGNoaWxkcmVuKTtcbiAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAoaSArIDEpIGNoaWxkcmVuKTtcbiAgICAgICAgY2hpbGRyZW4uKGkpICAgICA8LSBsZWZ0O1xuICAgICAgICBjaGlsZHJlbi4oaSArIDEpIDwtIHJpZ2h0O1xuICAgICAgICBjaGlsZHJlblxuXG5cbiAgICBsZXQgcm90YXRlX2tleXNcbiAgICAgICAgICAgICh0b19sZWZ0OiBib29sKVxuICAgICAgICAgICAgKGk6IGludCkgKGxlZnQ6ICdhIHBhaXJzKSAocGFyZW50OiAnYSBwYWlycykgKHJpZ2h0OiAnYSBwYWlycylcbiAgICAgICAgOiAnYSBwYWlycyAqICdhIHBhaXJzICogJ2EgcGFpcnNcbiAgICAgICAgPVxuICAgICAgICBsZXQgb3BlbiBBcnJheSBpblxuICAgICAgICBhc3NlcnQgKHZhbGlkX2luZGV4IGkgcGFyZW50KTtcbiAgICAgICAgaWYgdG9fbGVmdCB0aGVuXG4gICAgICAgICAgICBwdXNoIHBhcmVudC4oaSkgbGVmdCxcbiAgICAgICAgICAgIHJlcGxhY2UgaSAoZmlyc3QgcmlnaHQpIHBhcmVudCxcbiAgICAgICAgICAgIHJlbW92ZV9maXJzdCByaWdodFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZW1vdmVfbGFzdCBsZWZ0LFxuICAgICAgICAgICAgcmVwbGFjZSBpIChsYXN0IGxlZnQpIHBhcmVudCxcbiAgICAgICAgICAgIHB1c2hfZnJvbnQgcGFyZW50LihpKSByaWdodFxuXG5cbiAgICBsZXQgcm90YXRlX2NoaWxkcmVuXG4gICAgICAgICAgICAodG9fbGVmdDogYm9vbClcbiAgICAgICAgICAgIChsZWZ0OiAnYSB0IGFycmF5KSAocmlnaHQ6ICdhIHQgYXJyYXkpXG4gICAgICAgIDogJ2EgdCBhcnJheSAqICdhIHQgYXJyYXlcbiAgICAgICAgPVxuICAgICAgICBsZXQgb3BlbiBBcnJheSBpblxuICAgICAgICBpZiB0b19sZWZ0IHRoZW5cbiAgICAgICAgICAgIHB1c2ggKGZpcnN0IHJpZ2h0KSBsZWZ0LFxuICAgICAgICAgICAgcmVtb3ZlX2ZpcnN0IHJpZ2h0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlbW92ZV9sYXN0IGxlZnQsXG4gICAgICAgICAgICBwdXNoX2Zyb250IChsYXN0IGxlZnQpIHJpZ2h0XG5cblxuXG4gICAgbGV0IG1lcmdlX2tleXNcbiAgICAgICAgICAgIChpOiBpbnQpIChsZWZ0OiAnYSBwYWlycykgKHBhcmVudDogJ2EgcGFpcnMpIChyaWdodDogJ2EgcGFpcnMpXG4gICAgICAgIDogJ2EgcGFpcnMgKiAnYSBwYWlyc1xuICAgICAgICA9XG4gICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggaSBwYXJlbnQpO1xuICAgICAgICBsZXQgbGVuX2xlZnQgID0gQXJyYXkubGVuZ3RoIGxlZnRcbiAgICAgICAgYW5kIGxlbl9yaWdodCA9IEFycmF5Lmxlbmd0aCByaWdodFxuICAgICAgICBpblxuICAgICAgICBsZXQgbWVyZ2VkID0gQXJyYXkubWFrZSAobGVuX2xlZnQgKyAxICsgbGVuX3JpZ2h0KSBwYXJlbnQuKGkpXG4gICAgICAgIGFuZCBwYXJlbnQgPSBBcnJheS5yZW1vdmUgaSBwYXJlbnRcbiAgICAgICAgaW5cbiAgICAgICAgQXJyYXkuYmxpdCBsZWZ0ICAwIG1lcmdlZCAwIGxlbl9sZWZ0O1xuICAgICAgICBBcnJheS5ibGl0IHJpZ2h0IDAgbWVyZ2VkIChsZW5fbGVmdCArIDEpIGxlbl9yaWdodDtcbiAgICAgICAgbWVyZ2VkLCBwYXJlbnRcblxuXG4gICAgbGV0IG1lcmdlX2xlYXZlc1xuICAgICAgICAgICAgKGk6IGludClcbiAgICAgICAgICAgIChwYWlyOiBLZXkudCAqICdhKVxuICAgICAgICAgICAgKHBhaXJzMTogJ2EgcGFpcnMpIChwYWlyczI6ICdhIHBhaXJzKVxuICAgICAgICAgICAgKHBhaXJzOiAnYSBwYWlycykgKGNoaWxkcmVuOiAnYSB0IGFycmF5KVxuICAgICAgICA6ICdhIGRlbGV0ZVxuICAgICAgICA9XG4gICAgICAgIGFzc2VydCAoaSArIDEgPCBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICBsZXQgbWVyZ2VkLCBwYWlycyA9IG1lcmdlX2tleXMgaSBwYWlyczEgcGFpcnMgcGFpcnMyXG4gICAgICAgIGFuZCBjaGlsZHJlbiAgICAgID0gQXJyYXkucmVtb3ZlIGkgY2hpbGRyZW5cbiAgICAgICAgYW5kIHVuZGVyZmxvdyAgICAgPSBBcnJheS5sZW5ndGggcGFpcnMgPD0gbWluX2tleXNcbiAgICAgICAgaW5cbiAgICAgICAgY2hpbGRyZW4uKGkpIDwtIExlYWYgbWVyZ2VkO1xuICAgICAgICB7dHJlZSA9IE5vZGUgKHBhaXJzLCBjaGlsZHJlbik7IHBhaXI7IHVuZGVyZmxvd31cblxuXG5cbiAgICBsZXQgbWVyZ2Vfbm9kZXNcbiAgICAgICAgICAgIChpOiBpbnQpXG4gICAgICAgICAgICAocGFpcjogS2V5LnQgKiAnYSlcbiAgICAgICAgICAgIChwYWlyczE6ICdhIHBhaXJzKSAoY2hpbGRyZW4xOiAnYSB0IGFycmF5KVxuICAgICAgICAgICAgKHBhaXJzMjogJ2EgcGFpcnMpIChjaGlsZHJlbjI6ICdhIHQgYXJyYXkpXG4gICAgICAgICAgICAocGFpcnM6ICdhIHBhaXJzKSAoY2hpbGRyZW46ICdhIHQgYXJyYXkpXG4gICAgICAgIDogJ2EgZGVsZXRlXG4gICAgICAgID1cbiAgICAgICAgYXNzZXJ0IChpICsgMSA8IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgIGxldCBwYWlyc19uZXcsIHBhaXJzID0gbWVyZ2Vfa2V5cyBpIHBhaXJzMSBwYWlycyBwYWlyczJcbiAgICAgICAgYW5kIGNoaWxkcmVuICAgICAgPSBBcnJheS5yZW1vdmUgaSBjaGlsZHJlblxuICAgICAgICBhbmQgdW5kZXJmbG93ICAgICA9IEFycmF5Lmxlbmd0aCBwYWlycyA8PSBtaW5fa2V5c1xuICAgICAgICBhbmQgY2hpbGRyZW5fbmV3ICA9IEFycmF5LmFwcGVuZCBjaGlsZHJlbjEgY2hpbGRyZW4yXG4gICAgICAgIGluXG4gICAgICAgIGNoaWxkcmVuLihpKSA8LSBOb2RlIChwYWlyc19uZXcsIGNoaWxkcmVuX25ldyk7XG4gICAgICAgIHt0cmVlID0gTm9kZSAocGFpcnMsIGNoaWxkcmVuKTsgcGFpcjsgdW5kZXJmbG93fVxuXG5cblxuICAgIGxldCBoYW5kbGVfdW5kZXJmbG93XG4gICAgICAgICAgICAoaTogaW50KSAgICAgICAgICAgICAgICAoKiBJbmRleCBvZiB0aGUgY2hpbGQgd2hlcmUgdGhlIGRlbGV0aW9uIG9jY3VycmVkLiAqKVxuICAgICAgICAgICAgKHVuZGVyZmxvd19sZWZ0OiBib29sKSAgKCogVW5kZXJmbG93IGhhcHBlbmQgaW4gdGhlIGxlZnQgY2hpbGQ/ICopXG4gICAgICAgICAgICAobGVmdF9jaGlsZDogJ2EgdClcbiAgICAgICAgICAgIChyaWdodF9jaGlsZDogJ2EgdClcbiAgICAgICAgICAgIChwYWlyOiBLZXkudCAqICdhKSAgICAgICgqIFRoZSBkZWxldGVkIGtleSB2YWx1ZSBwYWlyLiAqKVxuICAgICAgICAgICAgKHBhaXJzOiAnYSBwYWlycykgICAgICAgKCogVGhlIGtleSB2YWx1ZSBwYWlycyBvZiB0aGUgcGFyZW50LiAqKVxuICAgICAgICAgICAgKGNoaWxkcmVuOiAnYSB0IGFycmF5KSAgKCogVGhlIGNoaWxkcmVuIG9mIHRoZSBwYXJlbnQuICopXG4gICAgICAgIDogJ2EgZGVsZXRlXG4gICAgICAgID1cbiAgICAgICAgbGV0IG5vdF9taW5pbWFsIHBhaXJzMSBwYWlyczIgPVxuICAgICAgICAgICAgaWYgdW5kZXJmbG93X2xlZnQgdGhlblxuICAgICAgICAgICAgICAgIG5vdF9taW5pbWFsIHBhaXJzMlxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG5vdF9taW5pbWFsIHBhaXJzMVxuICAgICAgICBpblxuICAgICAgICBtYXRjaCBsZWZ0X2NoaWxkLCByaWdodF9jaGlsZCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlyczEsIExlYWYgcGFpcnMyIHdoZW4gbm90X21pbmltYWwgcGFpcnMxIHBhaXJzMiAtPlxuICAgICAgICAgICAgKCogUmlnaHQgc2libGluZyBpcyBub3QgbWluaW1hbCwgcm90YXRlICopXG4gICAgICAgICAgICBsZXQgcGFpcnMxLCBwYWlycywgcGFpcnMyID1cbiAgICAgICAgICAgICAgICByb3RhdGVfa2V5cyB1bmRlcmZsb3dfbGVmdCBpIHBhaXJzMSBwYWlycyBwYWlyczJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgIHJlcGxhY2UyIGkgKExlYWYgcGFpcnMxKSAoTGVhZiBwYWlyczIpIGNoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAge3RyZWUgPSBOb2RlIChwYWlycywgY2hpbGRyZW4pOyBwYWlyOyB1bmRlcmZsb3cgPSBmYWxzZX1cblxuICAgICAgICB8IExlYWYgcGFpcnMxLCBMZWFmIHBhaXJzMiAtPlxuICAgICAgICAgICAgKCogU2libGluZyBpcyBtaW5pbWFsLCBtZXJnZSAqKVxuICAgICAgICAgICAgbWVyZ2VfbGVhdmVzIGkgcGFpciBwYWlyczEgcGFpcnMyIHBhaXJzIGNoaWxkcmVuXG5cbiAgICAgICAgfCBOb2RlIChwYWlyczEsIGNoaWxkcmVuMSksIE5vZGUgKHBhaXJzMiwgY2hpbGRyZW4yKVxuICAgICAgICAgICAgd2hlbiBub3RfbWluaW1hbCBwYWlyczEgcGFpcnMyXG4gICAgICAgICAgICAtPlxuICAgICAgICAgICAgKCogU2libGluZyBpcyBub3QgbWluaW1hbCwgcm90YXRlICopXG4gICAgICAgICAgICBsZXQgcGFpcnMxLCBwYWlycywgcGFpcnMyID1cbiAgICAgICAgICAgICAgICByb3RhdGVfa2V5cyB1bmRlcmZsb3dfbGVmdCBpIHBhaXJzMSBwYWlycyBwYWlyczJcbiAgICAgICAgICAgIGFuZCBjaGlsZHJlbjEsIGNoaWxkcmVuMiA9XG4gICAgICAgICAgICAgICAgcm90YXRlX2NoaWxkcmVuIHVuZGVyZmxvd19sZWZ0IGNoaWxkcmVuMSBjaGlsZHJlbjJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgIHJlcGxhY2UyXG4gICAgICAgICAgICAgICAgICAgIGlcbiAgICAgICAgICAgICAgICAgICAgKE5vZGUgKHBhaXJzMSwgY2hpbGRyZW4xKSlcbiAgICAgICAgICAgICAgICAgICAgKE5vZGUgKHBhaXJzMiwgY2hpbGRyZW4yKSlcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICB7dHJlZSA9IE5vZGUgKHBhaXJzLCBjaGlsZHJlbik7IHBhaXI7IHVuZGVyZmxvdyA9IGZhbHNlfVxuXG4gICAgICAgIHwgTm9kZSAocGFpcnMxLCBjaGlsZHJlbjEpLCBOb2RlIChwYWlyczIsIGNoaWxkcmVuMikgLT5cbiAgICAgICAgICAgICgqIFNpYmxpbmcgaXMgbWluaW1hbCwgbWVyZ2UgKilcbiAgICAgICAgICAgIG1lcmdlX25vZGVzXG4gICAgICAgICAgICAgICAgaSBwYWlyXG4gICAgICAgICAgICAgICAgcGFpcnMxIGNoaWxkcmVuMVxuICAgICAgICAgICAgICAgIHBhaXJzMiBjaGlsZHJlbjJcbiAgICAgICAgICAgICAgICBwYWlycyBjaGlsZHJlblxuXG4gICAgICAgIHwgXywgXyAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIENhbm5vdCBoYXBwZW4sIHRyZWUgaXMgYmFsYW5jZWQuICopXG5cblxuXG4gICAgbGV0IGhhbmRsZV9kZWxldGVcbiAgICAgICAgICAgIChpOiBpbnQpICAgICAgICAgICAgICAgICgqIEluZGV4IG9mIHRoZSBjaGlsZCB3aGVyZSB0aGUgZGVsZXRpb24gb2NjdXJyZWQuICopXG4gICAgICAgICAgICAocGFpcjogS2V5LnQgKiAnYSkgICAgICAoKiBUaGUgZGVsZXRlZCBrZXkgdmFsdWUgcGFpci4gKilcbiAgICAgICAgICAgIChkOiAnYSBkZWxldGUpICAgICAgICAgICgqIFRoZSBuZXcgdHJlZSB3aXRoIHRoZSBrZXkgdmFsdWUgcGFpciBkZWxldGVkLiAqKVxuICAgICAgICAgICAgKHBhaXJzOiAnYSBwYWlycykgICAgICAgKCogVGhlIGtleSB2YWx1ZSBwYWlycyBvZiB0aGUgcGFyZW50LiAqKVxuICAgICAgICAgICAgKGNoaWxkcmVuOiAnYSB0IGFycmF5KSAgKCogVGhlIGNoaWxkcmVuIG9mIHRoZSBwYXJlbnQuICopXG4gICAgICAgIDogJ2EgZGVsZXRlXG4gICAgICAgID1cbiAgICAgICAgaWYgbm90IGQudW5kZXJmbG93IHRoZW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmVlID0gTm9kZSAocGFpcnMsIEFycmF5LnJlcGxhY2UgaSBkLnRyZWUgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIHBhaXI7XG4gICAgICAgICAgICAgICAgdW5kZXJmbG93ID0gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgaWYgaSA8IGxlbiB0aGVuXG4gICAgICAgICAgICAgICAgaGFuZGxlX3VuZGVyZmxvdyBpIHRydWUgZC50cmVlIGNoaWxkcmVuLihpICsgMSkgcGFpciBwYWlycyBjaGlsZHJlblxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxldCBpID0gaSAtIDEgaW5cbiAgICAgICAgICAgICAgICBoYW5kbGVfdW5kZXJmbG93IGkgZmFsc2UgY2hpbGRyZW4uKGkpIGQudHJlZSBwYWlyIHBhaXJzIGNoaWxkcmVuXG5cblxuXG4gICAgbGV0IHJlYyByZW1vdmVfbGFzdCAobWFwOiAnYSB0KTogJ2EgZGVsZXRlID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICBhc3NlcnQgKDAgPCBsZW4pO1xuICAgICAgICAgICAgbGV0IHBhaXIgID0gQXJyYXkubGFzdCBwYWlyc1xuICAgICAgICAgICAgYW5kIHBhaXJzID0gQXJyYXkucmVtb3ZlX2xhc3QgcGFpcnNcbiAgICAgICAgICAgIGFuZCB1bmRlcmZsb3cgPSBBcnJheS5sZW5ndGggcGFpcnMgPD0gbWluX2tleXNcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJlZSA9IExlYWYgcGFpcnM7XG4gICAgICAgICAgICAgICAgcGFpcjtcbiAgICAgICAgICAgICAgICB1bmRlcmZsb3dcbiAgICAgICAgICAgIH1cbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICBhc3NlcnQgKGxlbiArIDEgPSBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICAgICAgbGV0IGQgPSByZW1vdmVfbGFzdCBjaGlsZHJlbi4obGVuKSBpblxuICAgICAgICAgICAgaGFuZGxlX2RlbGV0ZSBsZW4gZC5wYWlyIGQgcGFpcnMgY2hpbGRyZW5cblxuXG5cblxuICAgIGxldCByZWMgcmVtb3ZlX2F1eCAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6ICdhIGRlbGV0ZSBvcHRpb24gPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSAgcGFpcnMuKGkpXG4gICAgICAgICAgICAgICAgYW5kIHBhaXJzID0gQXJyYXkucmVtb3ZlIGkgcGFpcnNcbiAgICAgICAgICAgICAgICBhbmQgdW5kZXJmbG93ID0gQXJyYXkubGVuZ3RoIHBhaXJzIDw9IG1pbl9rZXlzXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBTb21lIHtcbiAgICAgICAgICAgICAgICAgICAgdHJlZSA9IExlYWYgcGFpcnM7XG4gICAgICAgICAgICAgICAgICAgIHBhaXI7XG4gICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBOb25lXG5cbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIGxldCBkID0gcmVtb3ZlX2xhc3QgY2hpbGRyZW4uKGkpIGluXG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgID0gcGFpcnMuKGkpXG4gICAgICAgICAgICAgICAgYW5kIHBhaXJzID0gQXJyYXkucmVwbGFjZSBpIGQucGFpciBwYWlycyBpblxuICAgICAgICAgICAgICAgIFNvbWUgKGhhbmRsZV9kZWxldGUgaSBwYWlyIGQgcGFpcnMgY2hpbGRyZW4pXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgT3B0aW9uLm1hcFxuICAgICAgICAgICAgICAgICAgICAoZnVuIGQgLT4gaGFuZGxlX2RlbGV0ZSBpIGQucGFpciBkIHBhaXJzIGNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICAocmVtb3ZlX2F1eCBrZXkgY2hpbGRyZW4uKGkpKVxuXG5cblxuICAgIGxldCByZW1vdmUgKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbWF0Y2ggcmVtb3ZlX2F1eCBrZXkgbWFwIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBtYXBcbiAgICAgICAgfCBTb21lIGQgLT5cbiAgICAgICAgICAgIG1hdGNoIGQudHJlZSB3aXRoXG4gICAgICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgd2hlbiBBcnJheS5pc19lbXB0eSBwYWlycyAtPlxuICAgICAgICAgICAgICAgICgqIHRyZWUgc2hyaW5rcyBhdCB0aGUgcm9vdCAqKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLigwKVxuICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgZC50cmVlXG5cblxuXG5cbiAgICAoKiBVcGRhdGVcbiAgICAgKiA9PT09PT1cbiAgICAgKilcblxuICAgIHR5cGUgJ2EgdXBkYXRlID1cbiAgICAgICAgfCBJbnNlcnQgb2YgJ2EgaW5zZXJ0XG4gICAgICAgIHwgRGVsZXRlIG9mICdhIGRlbGV0ZVxuXG5cbiAgICBsZXQgcmVjIHVwZGF0ZV9hdXhcbiAgICAgICAgICAgIChrZXk6IEtleS50KSAoZjogJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgKG1hcDogJ2EgdClcbiAgICAgICAgOiAnYSB1cGRhdGVcbiAgICAgICAgPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICAgICAgbWF0Y2ggZiAoU29tZSAoc25kIHBhaXJzLihpKSkpIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXJzID0gQXJyYXkucmVtb3ZlIGkgcGFpcnNcbiAgICAgICAgICAgICAgICAgICAgYW5kIHBhaXIgID0gcGFpcnMuKGkpXG4gICAgICAgICAgICAgICAgICAgIGFuZCB1bmRlcmZsb3cgPSBtaW5fa2V5cyA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgICAgICAgICBEZWxldGUge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJlZSA9IExlYWYgcGFpcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlyO1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJmbG93fVxuICAgICAgICAgICAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgKExlYWYgKEFycmF5LnJlcGxhY2UgaSAoa2V5LHZhbHVlKSBwYWlycykpKVxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICAgIG1hdGNoIGYgTm9uZSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoTm9ybWFsX2luc2VydCBtYXApXG4gICAgICAgICAgICAgICAgfCBTb21lIHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoYWRkX2luX2xlYWYga2V5IHZhbHVlIHBhaXJzKVxuICAgICAgICAgICAgZW5kXG5cbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIG1hdGNoIGYgKFNvbWUgKHNuZCBwYWlycy4oaSkpKSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVtb3ZlX2xhc3QgY2hpbGRyZW4uKGkpIGluXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWlyICA9IHBhaXJzLihpKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcGFpcnMgPSBBcnJheS5yZXBsYWNlIGkgZC5wYWlyIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZSAoaGFuZGxlX2RlbGV0ZSBpIHBhaXIgZCBwYWlycyBjaGlsZHJlbilcblxuICAgICAgICAgICAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgKE5vZGUgKFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVwbGFjZSBpIChrZXksIHZhbHVlKSBwYWlycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1hdGNoIHVwZGF0ZV9hdXgga2V5IGYgY2hpbGRyZW4uKGkpIHdpdGhcbiAgICAgICAgICAgICAgICB8IEluc2VydCAoTm9ybWFsX2luc2VydCBjaGlsZCkgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IChOb2RlIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVwbGFjZSBpIGNoaWxkIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICkpKVxuXG4gICAgICAgICAgICAgICAgfCBJbnNlcnQgKFNwbGl0X2luc2VydCAodSwgeSwgdikpIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoYWRkX2luX25vZGUgaSB1IHkgdiBwYWlycyBjaGlsZHJlbilcblxuICAgICAgICAgICAgICAgIHwgRGVsZXRlIGQgLT5cbiAgICAgICAgICAgICAgICAgICAgRGVsZXRlIChoYW5kbGVfZGVsZXRlIGkgZC5wYWlyIGQgcGFpcnMgY2hpbGRyZW4pXG5cblxuXG5cbiAgICBsZXQgdXBkYXRlIChrZXk6IEtleS50KSAoZjogJ2Egb3B0aW9uIC0+ICdhIG9wdGlvbikgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBtYXRjaCB1cGRhdGVfYXV4IGtleSBmIG1hcCB3aXRoXG4gICAgICAgIHwgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IG1hcCkgLT5cbiAgICAgICAgICAgIG1hcFxuXG4gICAgICAgIHwgSW5zZXJ0IChTcGxpdF9pbnNlcnQgKHUsIHksIHYpKSAtPlxuICAgICAgICAgICAgTm9kZSAoIFt8IHkgfF0sIFt8IHU7IHYgfF0gKVxuXG4gICAgICAgIHwgRGVsZXRlIGQgLT5cbiAgICAgICAgICAgIG1hdGNoIGQudHJlZSB3aXRoXG4gICAgICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgd2hlbiBBcnJheS5sZW5ndGggcGFpcnMgPSAwIC0+XG4gICAgICAgICAgICAgICAgKCogdHJlZSBzaHJpbmtzIGF0IHRoZSByb290ICopXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uKDApXG4gICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICBkLnRyZWVcblxuXG5cblxuXG5cblxuXG4gICAgKCogU3RyZWFtIG9mIGtleSB2YWx1ZSBwYWlyc1xuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgKilcblxuICAgIHR5cGUgJ2EgZW50cnlcbiAgICAgICAgPVxuICAgICAgICAnYSBwYWlyc1xuICAgICAgICAqICdhIHQgYXJyYXlcbiAgICAgICAgKiBpbnRcblxuICAgIHR5cGUgJ2Egc291cmNlID0ge1xuICAgICAgICB0b3A6XG4gICAgICAgICAgICAnYSB0ICogaW50OyAgICAgICAgICgqIG5vZGUvbGVhZiBhbmQgcG9zaXRpb24gd2l0aGluIHRoZSBub2RlL2xlYWYgKilcblxuICAgICAgICBzdGFjazogJ2EgZW50cnkgbGlzdDtcbiAgICB9XG5cblxuICAgIGxldCBoYXNfbW9yZSAoc291cmNlOiAnYSBzb3VyY2UpOiBib29sID1cbiAgICAgICAgbWF0Y2ggc291cmNlLnRvcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycywgaSAtPlxuICAgICAgICAgICAgaSA8IEFycmF5Lmxlbmd0aCBwYWlyc1xuICAgICAgICB8IE5vZGUgKHBhaXJzLCBfICksIGkgLT5cbiAgICAgICAgICAgIGkgPCBBcnJheS5sZW5ndGggcGFpcnNcblxuXG4gICAgbGV0IHBlZWsgKHNvdXJjZTogJ2Egc291cmNlKTogS2V5LnQgKiAnYSA9XG4gICAgICAgIGFzc2VydCAoaGFzX21vcmUgc291cmNlKTtcbiAgICAgICAgbWF0Y2ggc291cmNlLnRvcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycywgaSAtPlxuICAgICAgICAgICAgcGFpcnMuKGkpXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIF8gKSwgaSAtPlxuICAgICAgICAgICAgcGFpcnMuKGkpXG5cblxuXG4gICAgbGV0IHJlYyBkb3duICh0cmVlOiAnYSB0KSAoc3RhY2s6ICdhIGVudHJ5IGxpc3QpOiAnYSBzb3VyY2UgPVxuICAgICAgICAoKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBrZXkgdmFsdWUgcGFpciBvZiBbdHJlZV0uICopXG4gICAgICAgIG1hdGNoIHRyZWUgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgICgqIFdlIGFyZSBhbHJlYWR5IG9uIGEgbGVhZi4gVGhlIG5leHQgaXRlbSBpcyB0aGUgZmlyc3Qga2V5IHZhbHVlXG4gICAgICAgICAgICAgKiBwYWlyLiAqKVxuICAgICAgICAgICAge3RvcCA9IExlYWYgcGFpcnMsIDA7IHN0YWNrfVxuXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgKCogU2VhcmNoIHRoZSBmaXJzdCBrZXkgdmFsdWUgcGFpciBpbiB0aGUgZmlyc3QgY2hpbGQuIFB1c2ggdGhlXG4gICAgICAgICAgICAgKiBmaXJzdCBrZXkgdmFsdWUgcGFpciBvZiB0aGUgbm9kZSBvbnRvIHRoZSBzdGFjay4gKilcbiAgICAgICAgICAgIGRvd24gY2hpbGRyZW4uKDApICgocGFpcnMsIGNoaWxkcmVuLCAwKSA6OiBzdGFjaylcblxuXG5cbiAgICBsZXQgcmVjIHVwIChzdGFjazogJ2EgZW50cnkgbGlzdCk6ICdhIHNvdXJjZSA9XG4gICAgICAgICgqIFNlYXJjaCB0aGUgc3RhY2sgZm9yIGEgbm9kZSB3aGljaCBpcyBwb3NpdGlvbmVkIG9uIGEga2V5IHZhbHVlIHBhaXIuXG4gICAgICAgICAqICopXG4gICAgICAgIG1hdGNoIHN0YWNrIHdpdGhcbiAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAge3RvcCA9IGVtcHR5LCAwOyBzdGFjayA9IFtdfVxuICAgICAgICB8IChwYWlycywgY2hpbGRyZW4sIGkpIDo6IHN0YWNrIC0+XG4gICAgICAgICAgICBpZiBpIDwgQXJyYXkubGVuZ3RoIHBhaXJzIHRoZW5cbiAgICAgICAgICAgICAgICB7dG9wID0gTm9kZSAocGFpcnMsIGNoaWxkcmVuKSwgaTsgc3RhY2t9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdXAgc3RhY2tcblxuXG4gICAgbGV0IGFkdmFuY2UgKHNvdXJjZTogJ2Egc291cmNlKTogJ2Egc291cmNlID1cbiAgICAgICAgYXNzZXJ0IChoYXNfbW9yZSBzb3VyY2UpO1xuICAgICAgICBtYXRjaCBzb3VyY2UudG9wIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzLCBpIC0+XG4gICAgICAgICAgICBpZiBpICsgMSA8IEFycmF5Lmxlbmd0aCBwYWlycyB0aGVuXG4gICAgICAgICAgICAgICAge3NvdXJjZSB3aXRoIHRvcCA9IExlYWYgcGFpcnMsIGkgKyAxfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHVwIHNvdXJjZS5zdGFja1xuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbiksIGkgLT5cbiAgICAgICAgICAgIGFzc2VydCAoaSA8IEFycmF5Lmxlbmd0aCBwYWlycyk7XG4gICAgICAgICAgICBkb3duXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4uKGkgKyAxKVxuICAgICAgICAgICAgICAgICgocGFpcnMsIGNoaWxkcmVuLCBpICsgMSkgOjogc291cmNlLnN0YWNrKVxuXG5cbiAgICBsZXQgbWFrZV9zb3VyY2UgKHRyZWU6ICAnYSB0KTogJ2Egc291cmNlID1cbiAgICAgICAgZG93biB0cmVlIFtdXG5cblxuXG5cblxuXG4gICAgbW9kdWxlIFNvdXJjZSAoVmFsdWU6IEludGVyZmFjZXMuQU5ZKSA9IHN0cnVjdFxuICAgICAgICB0eXBlICdhIG1hcCA9ICdhIHRcbiAgICAgICAgdHlwZSBpdGVtICAgPSBLZXkudCAqIFZhbHVlLnRcblxuICAgICAgICB0eXBlIHQgPSBWYWx1ZS50IHNvdXJjZVxuXG4gICAgICAgIGxldCBoYXNfbW9yZSA9IGhhc19tb3JlXG4gICAgICAgIGxldCBwZWVrICAgICA9IHBlZWtcbiAgICAgICAgbGV0IGFkdmFuY2UgID0gYWR2YW5jZVxuICAgICAgICBsZXQgbWFrZSAgICAgPSBtYWtlX3NvdXJjZVxuICAgIGVuZFxuZW5kXG5cblxuXG5cblxuXG5cblxubW9kdWxlIFNldDAgKE9yZGVyOiBPUkRFUikgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPSBzdHJ1Y3RcbiAgICBtb2R1bGUgTWFwID0gTWFwMCAoT3JkZXIpIChLZXkpXG5cbiAgICB0eXBlIGl0ZW0gPSBLZXkudFxuXG4gICAgdHlwZSB0ID0gdW5pdCBNYXAudFxuXG5cbiAgICBsZXQgaXNfZW1wdHkgPSBNYXAuaXNfZW1wdHlcblxuXG4gICAgbGV0IGNhcmRpbmFsID0gTWFwLmNhcmRpbmFsXG5cblxuICAgIGxldCBlbXB0eSA9IE1hcC5lbXB0eVxuXG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOiAnYSAtPiBLZXkudCAtPiAnYSkgKHN0YXJ0OiAnYSkgKHNldDogdCk6ICdhID1cbiAgICAgICAgTWFwLmZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biBhIGtleSBfIC0+IGYgYSBrZXkpXG4gICAgICAgICAgICBzdGFydFxuICAgICAgICAgICAgc2V0XG5cblxuICAgIGxldCBmb2xkX3JpZ2h0IChmOiAnYSAtPiBLZXkudCAtPiAnYSkgKHN0YXJ0OiAnYSkgKHNldDogdCk6ICdhID1cbiAgICAgICAgTWFwLmZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gYSBrZXkgXyAtPiBmIGEga2V5KVxuICAgICAgICAgICAgc3RhcnRcbiAgICAgICAgICAgIHNldFxuXG5cbiAgICBsZXQgbWVtIChrZXk6IEtleS50KSAoc2V0OiB0KTogYm9vbCA9XG4gICAgICAgIG1hdGNoIE1hcC5maW5kX29wdCBrZXkgc2V0IHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgdHJ1ZVxuXG5cbiAgICBsZXQgYWRkIChrZXk6IEtleS50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIE1hcC5hZGQga2V5ICgpIHNldFxuXG5cbiAgICBsZXQgcmVtb3ZlIChrZXk6IEtleS50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIE1hcC5yZW1vdmUga2V5IHNldFxuXG5cbiAgICBsZXQgZWxlbWVudHMgKHNldDogdCk6IEtleS50IGxpc3QgPVxuICAgICAgICBNYXAua2V5cyBzZXRcblxuXG5cbiAgICBtb2R1bGUgU291cmNlID0gc3RydWN0XG4gICAgICAgIHR5cGUgc2V0ID0gdFxuXG4gICAgICAgIG1vZHVsZSBNID0gIE1hcC5Tb3VyY2UgKFVuaXQpXG5cbiAgICAgICAgdHlwZSBpdGVtID0gS2V5LnRcbiAgICAgICAgdHlwZSB0ID0gTS50XG5cbiAgICAgICAgbGV0IGhhc19tb3JlID0gTS5oYXNfbW9yZVxuXG4gICAgICAgIGxldCBwZWVrIChzb3VyY2U6IHQpOiBLZXkudCA9IE0ucGVlayBzb3VyY2UgfD4gZnN0XG5cbiAgICAgICAgbGV0IGFkdmFuY2UgPSBNLmFkdmFuY2VcblxuICAgICAgICBsZXQgbWFrZSA9IE0ubWFrZVxuICAgIGVuZFxuZW5kXG5cblxuXG5cblxuXG5cblxuXG5tb2R1bGUgTWFwIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgTWFwMCAoTzMyKSAoS2V5KVxuZW5kXG5cblxuXG5cblxuXG5cblxubW9kdWxlIFNldCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFNldDAgKE8zMikgKEtleSlcbmVuZFxuXG5cblxuXG5cblxuXG5cbigqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFVuaXQgVGVzdHNcbiAqXG4gKiB3aXRoIHNldHNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5tb2R1bGUgU2V0X29yZGVyIChPcmRlcjogT1JERVIpID0gc3RydWN0XG4gICAgaW5jbHVkZSBTZXQwIChPcmRlcikgKEludClcblxuICAgIGxldCBkb191cHdhcmQgKGY6IGludCAtPiB0IC0+IHQpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgICAgICBsZXQgcmVjIGFjdGlvbiBpIHNldCA9XG4gICAgICAgICAgICBpZiBpID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgICAgICBzZXRcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhY3Rpb24gKGkgKyAxKSAoZiBpIHNldClcbiAgICAgICAgaW5cbiAgICAgICAgYWN0aW9uIHN0YXJ0IHNldFxuXG4gICAgbGV0IGRvX2Rvd253YXJkIChmOiBpbnQgLT4gdCAtPiB0KSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICAgICAgbGV0IHJlYyBhY3Rpb24gaSBzZXQgPVxuICAgICAgICAgICAgaWYgaSA9IHN0YXJ0IHRoZW5cbiAgICAgICAgICAgICAgICBzZXRcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGkgLSAxIGluXG4gICAgICAgICAgICAgICAgYWN0aW9uIGkgKGYgaSBzZXQpXG4gICAgICAgIGluXG4gICAgICAgIGFjdGlvbiBiZXlvbmQgc2V0XG5cblxuICAgIGxldCBhZGRfdXB3YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgZG9fdXB3YXJkIGFkZCBzdGFydCBiZXlvbmQgc2V0XG5cblxuICAgIGxldCBhZGRfZG93bndhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBkb19kb3dud2FyZCBhZGQgc3RhcnQgYmV5b25kIHNldFxuXG4gICAgbGV0IHJlbW92ZV91cHdhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBkb191cHdhcmQgcmVtb3ZlIHN0YXJ0IGJleW9uZCBzZXRcblxuICAgIGxldCByZW1vdmVfZG93bndhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBkb19kb3dud2FyZCByZW1vdmUgc3RhcnQgYmV5b25kIHNldFxuXG4gICAgbGV0IGNoZWNrX3JhbmdlIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiBib29sID1cbiAgICAgICAgbGV0IG4sIG9rID1cbiAgICAgICAgICAgIGZvbGRfbGVmdFxuICAgICAgICAgICAgICAgIChmdW4gKGksIG9rKSBrZXkgLT4gaSArIDEsIG9rICYmIGtleSA9IGkpXG4gICAgICAgICAgICAgICAgKHN0YXJ0LCB0cnVlKVxuICAgICAgICAgICAgICAgIHNldFxuICAgICAgICBpblxuICAgICAgICBuID0gYmV5b25kICYmIG9rXG5cbiAgICBtb2R1bGUgU291cmNlID0gc3RydWN0XG4gICAgICAgIGluY2x1ZGUgU291cmNlXG5cbiAgICAgICAgbGV0IHRvX2xpc3QgKHNvdXJjZTogdCk6IGludCBsaXN0ID1cbiAgICAgICAgICAgIGxldCByZWMgdG9fbGlzdCBzb3VyY2UgYWNjdSA9XG4gICAgICAgICAgICAgICAgaWYgaGFzX21vcmUgc291cmNlIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgdG9fbGlzdCAoYWR2YW5jZSBzb3VyY2UpIChwZWVrIHNvdXJjZSA6OiBhY2N1KVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgTGlzdC5yZXYgYWNjdVxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIHRvX2xpc3Qgc291cmNlIFtdXG4gICAgZW5kXG5lbmRcblxuXG5tb2R1bGUgU2V0MyA9IFNldF9vcmRlciAoc3RydWN0IGxldCBvcmRlciA9IDMgZW5kKVxubW9kdWxlIFNldDQgPSBTZXRfb3JkZXIgKHN0cnVjdCBsZXQgb3JkZXIgPSA0IGVuZClcblxubGV0IHN0cmluZ19vZiAobHN0OiBpbnQgbGlzdCk6IHN0cmluZyA9XG4gICAgXCJbXCJcbiAgICBeXG4gICAgU3RyaW5nLmNvbmNhdFxuICAgICAgICBcIiwgXCJcbiAgICAgICAgKExpc3QubWFwIHN0cmluZ19vZl9pbnQgbHN0KVxuICAgIF5cbiAgICBcIl1cIlxubGV0IF8gPSBzdHJpbmdfb2ZcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgbW9kdWxlIE1hcCA9IE1hcCAoSW50KSBpblxuICAgIE1hcC4oY2FyZGluYWwgZW1wdHkpID0gMFxuXG5cbigqIEluc2VydGlvbiAqKVxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0NC4oYWRkX3Vwd2FyZCAxMDAgMjAwIGVtcHR5KSBpblxuICAgIFNldDQuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDQuKGFkZF9kb3dud2FyZCAwIDEwMCBlbXB0eSkgaW5cbiAgICBTZXQ0LmNoZWNrX3JhbmdlIDAgMTAwIHNldFxuXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0My4oYWRkX3Vwd2FyZCAxMDAgMjAwIGVtcHR5KSBpblxuICAgIFNldDMuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDMuKGFkZF9kb3dud2FyZCAwIDEwMCBlbXB0eSkgaW5cbiAgICBTZXQzLmNoZWNrX3JhbmdlIDAgMTAwIHNldFxuXG5cblxuXG5cbigqIERlbGV0aW9uICopXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDMuKGFkZF91cHdhcmQgMCAyMDAgZW1wdHkgfD4gcmVtb3ZlX3Vwd2FyZCAwIDEwMCkgaW5cbiAgICBTZXQzLmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDMuKGFkZF91cHdhcmQgMCAyMDAgZW1wdHkgfD4gcmVtb3ZlX2Rvd253YXJkIDAgMTAwKSBpblxuICAgIFNldDMuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0NC4oYWRkX3Vwd2FyZCAwIDIwMCBlbXB0eSB8PiByZW1vdmVfdXB3YXJkIDAgMTAwKSBpblxuICAgIFNldDQuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc2V0ID0gU2V0NC4oYWRkX3Vwd2FyZCAwIDIwMCBlbXB0eSB8PiByZW1vdmVfZG93bndhcmQgMCAxMDApIGluXG4gICAgU2V0NC5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cblxuXG5cblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBVbml0IFRlc3RzXG4gKlxuICogd2l0aCBtYXBzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubW9kdWxlIE1hcF9vcmRlciAoT3JkZXI6IE9SREVSKSA9IHN0cnVjdFxuICAgIGluY2x1ZGUgTWFwMCAoT3JkZXIpIChJbnQpXG5cbiAgICBsZXQgZG9fdXB3YXJkXG4gICAgICAgICAgICAoZjogaW50IC0+ICdhIHQgLT4gJ2EgdCkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKG1hcDogJ2EgdClcbiAgICAgICAgOiAnYSB0XG4gICAgICAgID1cbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgICAgICBsZXQgcmVjIGFjdGlvbiBpIG1hcCA9XG4gICAgICAgICAgICBpZiBpID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgICAgICBtYXBcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBhY3Rpb24gKGkgKyAxKSAoZiBpIG1hcClcbiAgICAgICAgaW5cbiAgICAgICAgYWN0aW9uIHN0YXJ0IG1hcFxuXG4gICAgbGV0IGRvX2Rvd253YXJkXG4gICAgICAgICAgICAoZjogaW50IC0+ICdhIHQgLT4gJ2EgdCkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKG1hcDogJ2EgdClcbiAgICAgICAgOiAnYSB0XG4gICAgICAgID1cbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgICAgICBsZXQgcmVjIGFjdGlvbiBpIG1hcCA9XG4gICAgICAgICAgICBpZiBpID0gc3RhcnQgdGhlblxuICAgICAgICAgICAgICAgIG1hcFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGxldCBpID0gaSAtIDEgaW5cbiAgICAgICAgICAgICAgICBhY3Rpb24gaSAoZiBpIG1hcClcbiAgICAgICAgaW5cbiAgICAgICAgYWN0aW9uIGJleW9uZCBtYXBcblxuXG4gICAgbGV0IGFkZF91cHdhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKGY6IGludCAtPiAnYSkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBkb191cHdhcmQgKGZ1biBpIG1hcCAtPiBhZGQgaSAoZiBpKSBtYXApIHN0YXJ0IGJleW9uZCBtYXBcblxuXG4gICAgbGV0IGFkZF9kb3dud2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoZjogaW50IC0+ICdhKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGRvX2Rvd253YXJkIChmdW4gaSBtYXAgLT4gYWRkIGkgKGYgaSkgbWFwKSBzdGFydCBiZXlvbmQgbWFwXG5cblxuICAgIGxldCB1cGRhdGVfdXB3YXJkXG4gICAgICAgICAgICAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoZjogaW50IC0+ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIChtYXA6ICdhIHQpXG4gICAgICAgIDogJ2EgdFxuICAgICAgICA9XG4gICAgICAgIGRvX3Vwd2FyZCAoZnVuIGkgbWFwIC0+IHVwZGF0ZSBpIChmIGkpIG1hcCkgc3RhcnQgYmV5b25kIG1hcFxuXG5cbiAgICBsZXQgY2hlY2tfcmFuZ2UgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKGY6IGludCAtPiAnYSkgKG1hcDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICBsZXQgbiwgb2sgPVxuICAgICAgICAgICAgZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgKGZ1biAoaSwgb2spIGtleSB2YWx1ZSAtPiBpICsgMSwgb2sgJiYgZiBrZXkgPSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAoc3RhcnQsIHRydWUpXG4gICAgICAgICAgICAgICAgbWFwXG4gICAgICAgIGluXG4gICAgICAgIG4gPSBiZXlvbmQgJiYgb2tcbmVuZFxuXG5cbm1vZHVsZSBNYXAzID0gTWFwX29yZGVyIChzdHJ1Y3QgbGV0IG9yZGVyID0gMyBlbmQpXG5cblxuKCogSW5zZXJ0aW9uICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgbWFwID0gYWRkX3Vwd2FyZCAwIDEwMCBGdW4uaWQgZW1wdHkgaW5cbiAgICBjaGVja19yYW5nZSAwIDEwMCBGdW4uaWQgbWFwXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgbWFwID0gYWRkX2Rvd253YXJkIDAgMTAwIEZ1bi5pZCBlbXB0eSBpblxuICAgIGNoZWNrX3JhbmdlIDAgMTAwIEZ1bi5pZCBtYXBcblxuXG5cbigqIFVwZGF0ZSAqKVxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IG1hcCA9IHVwZGF0ZV91cHdhcmQgMCAxMDAgKGZ1biBpIF8gLT4gU29tZSBpKSBlbXB0eSBpblxuICAgIGNoZWNrX3JhbmdlIDAgMTAwIEZ1bi5pZCBtYXBcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IG1hcCA9XG4gICAgICAgIGFkZF91cHdhcmQgMCAxMDAgRnVuLmlkIGVtcHR5XG4gICAgICAgIHw+XG4gICAgICAgIHVwZGF0ZV91cHdhcmQgMCAxMDAgKGZ1biBfIC0+IE9wdGlvbi5tYXAgKGZ1biBpIC0+IDIgKiBpKSlcbiAgICBpblxuICAgIGNoZWNrX3JhbmdlIDAgMTAwIChmdW4gaSAtPiAyICogaSkgbWFwXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBtYXAgPVxuICAgICAgICBhZGRfdXB3YXJkIDAgMTAwIEZ1bi5pZCBlbXB0eVxuICAgICAgICB8PlxuICAgICAgICB1cGRhdGVfdXB3YXJkIDAgMTAwIChmdW4gXyBfIC0+IE5vbmUpXG4gICAgaW5cbiAgICBpc19lbXB0eSBtYXBcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgZiBpID0gaWYgaSAvIDIgKiAyID0gaSB0aGVuIGkgZWxzZSAyICogaVxuICAgIGluXG4gICAgbGV0IG1hcCA9XG4gICAgICAgIGFkZF91cHdhcmQgMCAxMDAgRnVuLmlkIGVtcHR5XG4gICAgICAgIHw+XG4gICAgICAgIGFkZF91cHdhcmQgMjAwIDMwMCBGdW4uaWRcbiAgICAgICAgfD5cbiAgICAgICAgdXBkYXRlX3Vwd2FyZCAwIDEwMCAoZnVuIF8gLT4gT3B0aW9uLm1hcCBmKVxuICAgICAgICB8PlxuICAgICAgICB1cGRhdGVfdXB3YXJkIDEwMCAyMDAgKGZ1biBpIF8gLT4gU29tZSAoZiBpKSlcbiAgICAgICAgfD5cbiAgICAgICAgdXBkYXRlX3Vwd2FyZCAwIDMwMFxuICAgICAgICAgICAgKGZ1biBpIC0+XG4gICAgICAgICAgICAgICAgIGlmIGkgPCAyMDAgdGhlblxuICAgICAgICAgICAgICAgICAgICAgT3B0aW9uLm1hcCBGdW4uaWRcbiAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgZnVuIF8gLT4gTm9uZSlcbiAgICBpblxuICAgIGNoZWNrX3JhbmdlIDAgMjAwIGYgbWFwXG5cblxuXG5cblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBVbml0IFRlc3RzXG4gKlxuICogd2l0aCBzdHJlYW1zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gU2V0MyBpblxuICAgIGxldCBtb2R1bGUgU291cmNlID0gU2V0My5Tb3VyY2UgaW5cbiAgICBsZXQgc2V0ID0gYWRkX3Vwd2FyZCAwIDIwIGVtcHR5IGluXG4gICAgU291cmNlLihtYWtlIHNldCB8PiB0b19saXN0KSA9IFswOyAxOyAyOyAzOyA0OyA1OyA2OyA3OyA4OyA5OyAxMDsgMTE7IDEyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM7IDE0OyAxNTsgMTY7IDE3OyAxODsgMTldXG4iLCJvcGVuIEpzX29mX29jYW1sXG5vcGVuIEZtbGliX3N0ZFxuXG5cbm1vZHVsZSBWYWx1ZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBKcy5VbnNhZmUuYW55XG5cbiAgICBsZXQgbnVsbDogdCA9XG4gICAgICAgIEpzLihVbnNhZmUuaW5qZWN0IG51bGwpXG5cbiAgICBsZXQgdW5kZWZpbmVkOiB0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5pbmplY3QgdW5kZWZpbmVkKVxuXG4gICAgbGV0IGludCAoaTogaW50KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgaVxuXG4gICAgbGV0IGZsb2F0ICh2OiBmbG9hdCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuaW5qZWN0IHZcblxuICAgIGxldCBib29sIChiOiBib29sKTogdCA9XG4gICAgICAgIEpzLihVbnNhZmUuY29lcmNlIChib29sIGIpKVxuXG4gICAgbGV0IHN0cmluZyAoczogc3RyaW5nKTogdCA9XG4gICAgICAgIEpzLihVbnNhZmUuY29lcmNlIChzdHJpbmcgcykpXG5cbiAgICBsZXQgX29iamVjdCAoYXJyOiAoc3RyaW5nICogdCkgYXJyYXkpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLm9iaiBhcnJcblxuICAgIGxldCBhcnJheSAoYXJyOiB0IGFycmF5KTogdCA9XG4gICAgICAgIEpzLihVbnNhZmUuY29lcmNlIChhcnJheSBhcnIpKVxuXG4gICAgbGV0IGZ1bmN0aW9uMSAoZjogdCAtPiB0KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgZlxuXG4gICAgbGV0IGZ1bmN0aW9uMiAoZjogdCAtPiB0IC0+IHQpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCBmXG5cbiAgICBsZXQgZnVuY3Rpb24zIChmOiB0IC0+IHQgLT4gdCAtPiB0KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgZlxuXG5cbiAgICBsZXQgc3RyaW5naWZ5ICh2OiB0KTogdCBvcHRpb24gPVxuICAgICAgICB0cnlcbiAgICAgICAgICAgIFNvbWUgSnMuKFVuc2FmZS5jb2VyY2UgKF9KU09OIyNzdHJpbmdpZnkgdikpXG4gICAgICAgIHdpdGggXyAtPlxuICAgICAgICAgICAgTm9uZVxuXG4gICAgbGV0IHBhcnNlICh2OiB0KTogdCBvcHRpb24gPVxuICAgICAgICB0cnlcbiAgICAgICAgICAgIFNvbWUgSnMuKF9KU09OIyNwYXJzZSAoVW5zYWZlLmNvZXJjZSB2KSlcbiAgICAgICAgd2l0aCBfIC0+XG4gICAgICAgICAgICBOb25lXG5lbmRcblxuXG5cblxubW9kdWxlIERlY29kZSA9XG5zdHJ1Y3RcbiAgICBsZXQgc3RyX2Jvb2xlYW46IEpzLmpzX3N0cmluZyBKcy50ID1cbiAgICAgICAgSnMuc3RyaW5nIFwiYm9vbGVhblwiXG5cbiAgICBsZXQgc3RyX2Z1bmN0aW9uOiBKcy5qc19zdHJpbmcgSnMudCA9XG4gICAgICAgIEpzLnN0cmluZyBcImZ1bmN0aW9uXCJcblxuICAgIGxldCBzdHJfc3RyaW5nOiBKcy5qc19zdHJpbmcgSnMudCA9XG4gICAgICAgIEpzLnN0cmluZyBcInN0cmluZ1wiXG5cbiAgICBsZXQgc3RyX251bWJlcjogSnMuanNfc3RyaW5nIEpzLnQgPVxuICAgICAgICBKcy5zdHJpbmcgXCJudW1iZXJcIlxuXG4gICAgbGV0IGlzX2Z1bmN0aW9uICh2OiBWYWx1ZS50KTogYm9vbCA9XG4gICAgICAgIEpzLih0eXBlb2YgdiA9PSBzdHJfZnVuY3Rpb24pXG5cbiAgICBsZXQgaXNfYm9vbGVhbiAodjogVmFsdWUudCk6IGJvb2wgPVxuICAgICAgICBKcy4odHlwZW9mIHYgPT0gc3RyX2Jvb2xlYW4pXG5cbiAgICBsZXQgaXNfc3RyaW5nICh2OiBWYWx1ZS50KTogYm9vbCA9XG4gICAgICAgIEpzLih0eXBlb2YgdiA9PSBzdHJfc3RyaW5nKVxuXG4gICAgbGV0IGlzX251bWJlciAodjogVmFsdWUudCk6IGJvb2wgPVxuICAgICAgICBKcy4odHlwZW9mIHYgPT0gc3RyX251bWJlcilcblxuXG4gICAgdHlwZSAnYSB0ID0gVmFsdWUudCAtPiAnYSBvcHRpb25cblxuXG4gICAgbGV0IHJldHVybiAoYTogJ2EpOiAnYSB0ID1cbiAgICAgICAgZnVuIF8gLT4gU29tZSBhXG5cblxuICAgIGxldCBmYWlsOiAnYSB0ID1cbiAgICAgICAgZnVuIF8gLT4gTm9uZVxuXG5cbiAgICBsZXQgdmFsdWU6IFZhbHVlLnQgdCA9XG4gICAgICAgIGZ1biB2IC0+IFNvbWUgdlxuXG5cbiAgICBsZXQgKGxldCogKSAobTogJ2EgdCkgKGY6ICdhIC0+ICdiIHQpOiAnYiB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgT3B0aW9uLihcbiAgICAgICAgICAgIGxldCogYSA9IG0gdiBpblxuICAgICAgICAgICAgZiBhIHZcbiAgICAgICAgKVxuXG5cbiAgICBsZXQgKD4+PSkgPSAobGV0KiApXG5cblxuICAgIGxldCAoPC8+KSAocDogJ2EgdCkgKHE6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgbWF0Y2ggcCB2IHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBxIHZcbiAgICAgICAgfCBTb21lIF8gYXMgciAtPlxuICAgICAgICAgICAgclxuXG5cbiAgICBsZXQgbWFwIChmOiAnYSAtPiAnYikgKG06ICdhIHQpOiAnYiB0ID1cbiAgICAgICAgbGV0KiBhID0gbSBpblxuICAgICAgICByZXR1cm4gKGYgYSlcblxuICAgIGxldCBudWxsIChhOiAnYSk6ICdhIHQgPVxuICAgICAgICBmdW4gb2JqIC0+XG4gICAgICAgIGlmIG9iaiA9PSBWYWx1ZS5udWxsIHRoZW5cbiAgICAgICAgICAgIFNvbWUgYVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCB1bmRlZmluZWQgKGE6ICdhKTogJ2EgdCA9XG4gICAgICAgIGZ1biBvYmogLT5cbiAgICAgICAgaWYgb2JqID09IFZhbHVlLnVuZGVmaW5lZCB0aGVuXG4gICAgICAgICAgICBTb21lIGFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgZmxvYXQ6IGZsb2F0IHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBpZiBpc19udW1iZXIgdiB0aGVuXG4gICAgICAgICAgICBTb21lIChKcy4oVW5zYWZlLmNvZXJjZSB2KSMjdmFsdWVPZiAoKSlcbiAgICAgICAgICAgICgqIFt2YWx1ZU9mXSByZXR1cm5zIGEgcHJpbWl0aXZlIHZhbHVlLiAqKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBpbnQ6IGludCB0ID1cbiAgICAgICAgbGV0KiB2ID0gZmxvYXQgaW5cbiAgICAgICAgbGV0IG9wZW4gRmxvYXQgaW5cbiAgICAgICAgbGV0IGkgPSB0b19pbnQgdiBpblxuICAgICAgICBpZiBlcXVhbCB2IChvZl9pbnQgaSkgdGhlblxuICAgICAgICAgICAgcmV0dXJuIGlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmFpbFxuXG5cbiAgICBsZXQgYm9vbDogYm9vbCB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgaWYgaXNfYm9vbGVhbiB2IHRoZW5cbiAgICAgICAgICAgIFNvbWUgSnMuKFVuc2FmZS5jb2VyY2UgdiB8PiB0b19ib29sKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBzdHJpbmc6IHN0cmluZyB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgaWYgaXNfc3RyaW5nIHYgdGhlblxuICAgICAgICAgICAgU29tZSBKcy4oVW5zYWZlLmNvZXJjZSB2IHw+IHRvX3N0cmluZylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgX2Z1bmN0aW9uOiAoVmFsdWUudCBhcnJheSAtPiBWYWx1ZS50KSB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgaWYgaXNfZnVuY3Rpb24gdiB0aGVuXG4gICAgICAgICAgICBTb21lIChmdW4gYXJncyAtPiBKcy5VbnNhZmUuZnVuX2NhbGwgdiBhcmdzKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBfbWV0aG9kOiAoVmFsdWUudCAtPiBWYWx1ZS50IGFycmF5IC0+IFZhbHVlLnQpIHQgPVxuICAgICAgICBmdW4gdiAtPlxuICAgICAgICBpZiBpc19mdW5jdGlvbiB2IHRoZW5cbiAgICAgICAgICAgIFNvbWUgKGZ1biBvYmogYXJncyAtPiBKcy5VbnNhZmUuY2FsbCB2IG9iaiBhcmdzKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOb25lXG5cblxuICAgIGxldCBmaWVsZCAobmFtZTogc3RyaW5nKSAoZGVjb2RlOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGZ1biBvYmogLT5cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgT3B0aW9uLihcbiAgICAgICAgICAgIGxldCogdiA9IE9wdGRlZi50b19vcHRpb24gKFVuc2FmZS5nZXQgb2JqIChzdHJpbmcgbmFtZSkpIGluXG4gICAgICAgICAgICBkZWNvZGUgdlxuICAgICAgICApXG5cblxuICAgIGxldCBhcnJheSAoZGVjb2RlOiAnYSB0KTogJ2EgYXJyYXkgdCA9XG4gICAgICAgIGZ1biBvYmogLT5cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgaWYgVW5zYWZlLmdsb2JhbCMjLl9BcnJheSMjaXNBcnJheSBvYmogdGhlblxuICAgICAgICAgICAgbGV0IGpzX2FyciA9IChVbnNhZmUuY29lcmNlIG9iaikgaW5cbiAgICAgICAgICAgIGxldCBsZW4gPSBqc19hcnIjIy5sZW5ndGggaW5cbiAgICAgICAgICAgIGxldCByZWMgZXh0cmFjdCBpIGxzdCA9XG4gICAgICAgICAgICAgICAgaWYgaSA9IGxlbiB0aGVuXG4gICAgICAgICAgICAgICAgICAgIFNvbWUgKEFycmF5Lm9mX2xpc3QgKExpc3QucmV2IGxzdCkpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBsZXQgb3BlbiBPcHRpb24gaW5cbiAgICAgICAgICAgICAgICAgICAgbGV0KiBlID0gYXJyYXlfZ2V0IGpzX2FyciBpIHw+IE9wdGRlZi50b19vcHRpb24gaW5cbiAgICAgICAgICAgICAgICAgICAgbGV0KiBhID0gZGVjb2RlIGUgaW5cbiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCAoaSArIDEpIChhIDo6IGxzdClcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBleHRyYWN0IDAgW11cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgb3B0aW9uIChkZWNvZGU6ICdhIHQpOiAnYSBvcHRpb24gdCA9XG4gICAgICAgIG1hcCBPcHRpb24ucmV0dXJuIGRlY29kZVxuICAgICAgICA8Lz5cbiAgICAgICAgbnVsbCBOb25lXG5cbmVuZFxuXG5cblxubW9kdWxlIE1haW4gPVxuc3RydWN0XG5cbiAgICAoKiBHZW5lcmFsIGZ1bmN0aW9uc1xuICAgICAqID09PT09PT09PT09PT09PT09XG4gICAgICopXG5cbiAgICB0eXBlIGpzX2Vycm9yID0gSnMuSnNfZXJyb3IudFxuXG5cbiAgICBsZXQgb2ZfZXhjZXB0aW9uIChleG46IGV4bik6IGpzX2Vycm9yIG9wdGlvbiA9XG4gICAgICAgIEpzLkpzX2Vycm9yLm9mX2V4biBleG5cblxuXG4gICAgbGV0IHJhaXNlX2pzX2Vycm9yIChqc19lcnJvcjoganNfZXJyb3IpOiAnYSA9XG4gICAgICAgIEpzLkpzX2Vycm9yLnJhaXNlXyBqc19lcnJvclxuXG5cbiAgICBsZXQgcmFpc2VfanMgKG1lc3NhZ2U6IHN0cmluZyk6ICdhID1cbiAgICAgICAgbGV0IGpzX21zZyA9IEpzLnN0cmluZyBtZXNzYWdlIGluXG4gICAgICAgIEpzLihcbiAgICAgICAgICAgIG5ldyVqc1xuICAgICAgICAgICAgICAgIGVycm9yX2NvbnN0clxuICAgICAgICAgICAgICAgIGpzX21zZ1xuICAgICAgICAgICAgfD4gSnNfZXJyb3Iub2ZfZXJyb3JcbiAgICAgICAgICAgIHw+IEpzX2Vycm9yLnJhaXNlX1xuICAgICAgICApXG5cblxuXG4gICAgbGV0IGxvZ19zdHJpbmcgKHN0cjogc3RyaW5nKTogdW5pdCA9XG4gICAgICAgIEpzLihVbnNhZmUuZ2xvYmFsIyMuY29uc29sZSMjbG9nIChzdHJpbmcgc3RyKSlcblxuXG4gICAgbGV0IGxvZ192YWx1ZSAodmFsdWU6IFZhbHVlLnQpOiB1bml0ID1cbiAgICAgICAgSnMuKFVuc2FmZS5nbG9iYWwjIy5jb25zb2xlIyNsb2cgdmFsdWUpXG5cblxuICAgIGxldCBleHBvcnQgKG9iajogKHN0cmluZyAqIFZhbHVlLnQpIGFycmF5KTogdW5pdCA9XG4gICAgICAgIEpzLmV4cG9ydF9hbGwgKFZhbHVlLl9vYmplY3Qgb2JqKVxuXG5cbiAgICBsZXQgbWFrZV9nbG9iYWwgKG5hbWU6IHN0cmluZykgKHY6IFZhbHVlLnQpOiB1bml0ID1cbiAgICAgICAgSnMuKFVuc2FmZS4oc2V0IGdsb2JhbCAoSnMuc3RyaW5nIG5hbWUpIHYpKVxuXG4gICAgbGV0IGdldF9nbG9iYWwgKG5hbWU6IHN0cmluZyk6IFZhbHVlLnQgb3B0aW9uID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgVW5zYWZlLihnZXQgZ2xvYmFsIChKcy5zdHJpbmcgbmFtZSkpIHw+IE9wdC50b19vcHRpb25cblxuXG4gICAgbGV0IG5ld19nbG9iYWwgKGNuYW1lOiBzdHJpbmcpIChhcmdzOiBWYWx1ZS50IGFycmF5KTogVmFsdWUudCA9XG4gICAgICAgIG1hdGNoIGdldF9nbG9iYWwgY25hbWUgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZVxuICAgICAgICB8IFNvbWUgY29uc3RyIC0+XG4gICAgICAgICAgICBKcy5VbnNhZmUubmV3X29iaiBjb25zdHIgYXJnc1xuXG5cblxuICAgICgqIEhlbHBlciBmdW5jdGlvbnMgZm9yIE5vZGUgbW9kdWxlIGFuZCBicm93c2VyIGFwcGxpY2F0aW9uXG4gICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgKilcblxuXG4gICAgbGV0IGRlY29kZV9jYWxsYmFjayAoY2I6IFZhbHVlLnQpIChlcnI6IHN0cmluZyk6IFZhbHVlLnQgLT4gdW5pdCA9XG4gICAgICAgIG1hdGNoIERlY29kZS5fZnVuY3Rpb24gY2Igd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHJhaXNlX2pzIGVyclxuICAgICAgICB8IFNvbWUgY2IgLT5cbiAgICAgICAgICAgIGZ1biB2IC0+IGNiIFt8dnxdIHw+IGlnbm9yZVxuXG5cbiAgICBsZXQgZGVjb2RlX2RhdGFcbiAgICAgICAgICAgIChkZWM6ICdhIERlY29kZS50KSAoZGF0YTogVmFsdWUudCkgKGVycjogc3RyaW5nKVxuICAgICAgICA6ICdhXG4gICAgICAgID1cbiAgICAgICAgbWF0Y2ggZGVjIGRhdGEgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHJhaXNlX2pzIGVyclxuICAgICAgICB8IFNvbWUgc3RhdGUgLT5cbiAgICAgICAgICAgIHN0YXRlXG5cblxuXG5cbiAgICAoKiBOb2RlIG1vZHVsZVxuICAgICAqID09PT09PT09PT09XG4gICAgICopXG5cblxuICAgIHR5cGUgKCdzdGF0ZSwnbXNnKSBub2RlX2Z1bmN0aW9uID1cbiAgICAgICAgJ3N0YXRlIC0+IChWYWx1ZS50IC0+IHVuaXQpIC0+ICdtc2cgLT4gdW5pdFxuXG5cbiAgICBsZXQgbm9kZV9tb2R1bGVcbiAgICAgICAgICAgIChkZWNvZGU6ICdzdGF0ZSBEZWNvZGUudClcbiAgICAgICAgICAgIChtc2dfZGVjb2RlOiAnbXNnIERlY29kZS50KVxuICAgICAgICAgICAgKG5vZGVfZnVuY3Rpb246ICgnc3RhdGUsICdtc2cpIG5vZGVfZnVuY3Rpb24pXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIGxldCBqc19mdW5jdGlvbiBkYXRhIGNhbGxiYWNrID1cbiAgICAgICAgICAgIGxldCBjYWxsYmFjayA9XG4gICAgICAgICAgICAgICAgZGVjb2RlX2NhbGxiYWNrIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgICAgIFwicHJvdmlkZWQgY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb25cIlxuICAgICAgICAgICAgYW5kIGRhdGEgPVxuICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhIGRlY29kZSBkYXRhXG4gICAgICAgICAgICAgICAgICAgIFwiY2Fubm90IGRlY29kZSBpbnB1dCBkYXRhXCJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgZiA9XG4gICAgICAgICAgICAgICAgbm9kZV9mdW5jdGlvbiBkYXRhIGNhbGxiYWNrXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgVmFsdWUuZnVuY3Rpb24xXG4gICAgICAgICAgICAgICAgKGZ1biBtc2cgLT5cbiAgICAgICAgICAgICAgICAgICAgIG1hdGNoIG1zZ19kZWNvZGUgbXNnIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19zdHJpbmcgXCJjYW5ub3QgZGVjb2RlIG1lc3NhZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfdmFsdWUgbXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgfCBTb21lIG1zZyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIGYgbXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZClcbiAgICAgICAgaW5cbiAgICAgICAgZXhwb3J0IFt8IFwiaW5pdFwiLCBWYWx1ZS5mdW5jdGlvbjIganNfZnVuY3Rpb24gfF1cblxuXG5cblxuXG5cblxuICAgICgqIEJyb3dzZXIgQXBwbGljYXRpb25cbiAgICAgKiA9PT09PT09PT09PT09PT09PT09XG4gICAgICopXG5cblxuICAgIHR5cGUgKCdzdGF0ZSwgJ21zZykgYnJvd3Nlcl9mdW5jdGlvbiA9XG4gICAgICAgICdzdGF0ZSAtPiBzdHJpbmcgb3B0aW9uIC0+IChWYWx1ZS50IC0+IHVuaXQpIC0+ICdtc2cgLT4gdW5pdFxuXG5cbiAgICBsZXQgYnJvd3Nlcl9hcHBsaWNhdGlvblxuICAgICAgICAgICAgKGFwcF9uYW1lOiBzdHJpbmcpXG4gICAgICAgICAgICAoc3RhdGVfZGVjb2RlOiAnc3RhdGUgRGVjb2RlLnQpXG4gICAgICAgICAgICAobXNnX2RlY29kZTogJ21zZyBEZWNvZGUudClcbiAgICAgICAgICAgIChicm93c2VyX2Z1bmN0aW9uOiAoJ3N0YXRlLCAnbXNnKSBicm93c2VyX2Z1bmN0aW9uKVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBsZXQganNfZnVuY3Rpb24gc3RhdGUgZWxlbWVudCBjYWxsYmFjayA9XG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPVxuICAgICAgICAgICAgICAgIGRlY29kZV9jYWxsYmFjayBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBcInByb3ZpZGVkIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgICAgICAgICAgIGFuZCBzdGF0ZSA9XG4gICAgICAgICAgICAgICAgZGVjb2RlX2RhdGEgc3RhdGVfZGVjb2RlIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIFwiY2Fubm90IGRlY29kZSBzdGF0ZVwiXG4gICAgICAgICAgICBhbmQgZWxlbWVudCA9XG4gICAgICAgICAgICAgICAgZGVjb2RlX2RhdGEgRGVjb2RlLihvcHRpb24gc3RyaW5nKSBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIFwiY2Fubm90IGRlY29kZSBhIG51bGxhYmxlIGVsZW1lbnQgaWRcIlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBmID1cbiAgICAgICAgICAgICAgICBicm93c2VyX2Z1bmN0aW9uIHN0YXRlIGVsZW1lbnQgY2FsbGJhY2tcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBWYWx1ZS5mdW5jdGlvbjFcbiAgICAgICAgICAgICAgICAoZnVuIG1zZyAtPlxuICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggbXNnX2RlY29kZSBtc2cgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgbG9nX3N0cmluZyBcImNhbm5vdCBkZWNvZGUgbWVzc2FnZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ192YWx1ZSBtc2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbXNnIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgZiBtc2c7XG4gICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkKVxuICAgICAgICBpblxuICAgICAgICBtYWtlX2dsb2JhbFxuICAgICAgICAgICAgYXBwX25hbWVcbiAgICAgICAgICAgIChWYWx1ZS5mdW5jdGlvbjMganNfZnVuY3Rpb24pXG5lbmRcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcblxuXG5jbGFzcyB0eXBlIGV2ZW50ID1cbm9iamVjdFxuICAgIG1ldGhvZCBzdG9wUHJvcGFnYXRpb246IHVuaXQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHByZXZlbnREZWZhdWx0OiAgdW5pdCAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG50eXBlIHQgPSBldmVudCBKcy50XG5cbmxldCB2YWx1ZSAoZTogdCk6IEJhc2UuVmFsdWUudCA9XG4gICAgT2JqLm1hZ2ljIGVcblxubGV0IHN0b3BfcHJvcGFnYXRpb24gKGU6IHQpOiB1bml0ID1cbiAgICBlIyNzdG9wUHJvcGFnYXRpb24gKClcblxubGV0IHByZXZlbnRfZGVmYXVsdCAoZTogdCk6IHVuaXQgPVxuICAgIGUjI3ByZXZlbnREZWZhdWx0ICgpXG4iLCJvcGVuIEpzX29mX29jYW1sXG5cbnR5cGUganNfc3RyaW5nID0gSnMuanNfc3RyaW5nIEpzLnRcblxuY2xhc3MgdHlwZSBldmVudF90YXJnZXQgPVxub2JqZWN0XG4gICAgbWV0aG9kIGFkZEV2ZW50TGlzdGVuZXI6ICAgIGpzX3N0cmluZyAtPiAoJ2EgLT4gdW5pdCkgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGpzX3N0cmluZyAtPiAoJ2EgLT4gdW5pdCkgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG50eXBlIHQgPSBldmVudF90YXJnZXQgSnMudFxuXG5sZXQgYWRkIChuYW1lOiBzdHJpbmcpIChoYW5kbGVyOiBFdmVudC50IC0+IHVuaXQpICh0Z3Q6IHQpOiB1bml0ID1cbiAgICB0Z3QjI2FkZEV2ZW50TGlzdGVuZXIgKEpzLnN0cmluZyBuYW1lKSBoYW5kbGVyXG5cbmxldCByZW1vdmUgKG5hbWU6IHN0cmluZykgKGhhbmRsZXI6IEV2ZW50LnQgLT4gdW5pdCkgKHRndDogdCk6IHVuaXQgPVxuICAgIHRndCMjcmVtb3ZlRXZlbnRMaXN0ZW5lciAoSnMuc3RyaW5nIG5hbWUpIGhhbmRsZXJcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcblxudHlwZSB0aW1lclxudHlwZSBpbnRlcnZhbFxuXG5sZXQgc2V0IChmOiB1bml0IC0+IHVuaXQpIChtczogaW50KTogdGltZXIgPVxuICAgIEpzLlVuc2FmZS5nbG9iYWwjI3NldFRpbWVvdXQgZiBtc1xuXG5sZXQgY2xlYXIgKHQ6IHRpbWVyKTogdW5pdCA9XG4gICAgSnMuVW5zYWZlLmdsb2JhbCMjY2xlYXJUaW1lb3V0IHRcblxuXG5sZXQgc2V0X2ludGVydmFsIChmOiB1bml0IC0+IHVuaXQpIChtczogaW50KTogaW50ZXJ2YWwgPVxuICAgIEpzLlVuc2FmZS5nbG9iYWwjI3NldEludGVydmFsIGYgbXNcblxuXG5sZXQgY2xlYXJfaW50ZXJ2YWwgKHQ6IGludGVydmFsKTogdW5pdCA9XG4gICAgSnMuVW5zYWZlLmdsb2JhbCMjY2xlYXJJbnRlcnZhbCB0XG4iLCJvcGVuIEpzX29mX29jYW1sXG5vcGVuIEJhc2VcblxuXG4oKiBIZWxwZXIgZnVuY3Rpb25zXG4gKiA9PT09PT09PT09PT09PT09XG4gKilcblxuXG5sZXQgZGVjb2RlX2NhbGxiYWNrIChlcnI6IHVuaXQgLT4gc3RyaW5nKSAoY2I6IFZhbHVlLnQpOiBWYWx1ZS50IC0+IHVuaXQgPVxuICAgIG1hdGNoIERlY29kZS5fZnVuY3Rpb24gY2Igd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBNYWluLnJhaXNlX2pzIChlcnIgKCkpXG4gICAgfCBTb21lIGNiIC0+XG4gICAgICAgIGZ1biB2IC0+IGNiIFt8dnxdIHw+IGlnbm9yZVxuXG5cbmxldCBzZW5kX21lc3NhZ2VcbiAgICAgICAgKGVycjogdW5pdCAtPiBzdHJpbmcpXG4gICAgICAgIChtc2c6IFZhbHVlLnQpIChkZWM6ICdtc2cgRGVjb2RlLnQpXG4gICAgICAgIChjYjogJ21zZyAtPiB1bml0KVxuICAgIDogdW5pdFxuICAgID1cbiAgICBtYXRjaCBkZWMgbXNnIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgbGV0IG9wZW4gTWFpbiBpblxuICAgICAgICBsb2dfc3RyaW5nIChlcnIgKCkpO1xuICAgICAgICBsb2dfdmFsdWUgbXNnXG4gICAgfCBTb21lIG1zZyAtPlxuICAgICAgICBjYiBtc2dcblxuXG5sZXQgZG9fYXN5bmMgKGY6IHVuaXQgLT4gdW5pdCk6IHVuaXQgPVxuICAgIFRpbWVyLnNldCBmIDAgfD4gaWdub3JlXG5cblxuXG4oKiBDcmVhdG9yIENvZGVcbiAgID09PT09PT09PT09PVxuKilcblxuXG5cbmNsYXNzIHR5cGUgd29ya2VyID1cbm9iamVjdFxuICAgIG1ldGhvZCBwb3N0TWVzc2FnZTogJ21zZyAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgdGVybWluYXRlOiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxudHlwZSB0ID0gd29ya2VyIEpzLnRcblxuXG5sZXQgc3RhcnQgKHVybDogc3RyaW5nKSAoZGVjOiAnbXNnIERlY29kZS50KSAoY2I6ICdtc2cgLT4gdW5pdCk6IHQgPVxuICAgIGxldCBvcGVuIE1haW4gaW5cbiAgICBsZXQgdyA9XG4gICAgICAgIG5ld19nbG9iYWwgXCJXb3JrZXJcIiBbfFZhbHVlLnN0cmluZyB1cmx8XVxuICAgIGFuZCBjYiBldmVudCA9XG4gICAgICAgIHNlbmRfbWVzc2FnZVxuICAgICAgICAgICAgKGZ1biBfIC0+IFwiY2Fubm90IGRlY29kZSBtZXNzYWdlIGZyb20gXCIgXiB1cmwgXiBcIlxcXCJcIilcbiAgICAgICAgICAgIChFdmVudC52YWx1ZSBldmVudClcbiAgICAgICAgICAgIGRlY1xuICAgICAgICAgICAgY2JcbiAgICBpblxuICAgIEV2ZW50X3RhcmdldC5hZGQgXCJtZXNzYWdlXCIgY2IgKE9iai5tYWdpYyB3KTsgKCogW3ddIGlzIGFuIGV2ZW50IHRhcmdldC4gKilcbiAgICBPYmoubWFnaWMgdyAoKiBbd10gaXMgYSB3b3JrZXIsIGJlY2F1c2UgaXQgaGFzIGJlZW4gY29uc3RydWNlZFxuICAgICAgICAgICAgICAgICAgIGJ5IFtXb3JrZXJdLiAqKVxuXG5cblxuXG5sZXQgcG9zdF9tZXNzYWdlIChtc2c6IFZhbHVlLnQpICh3OiB0KTogdW5pdCA9XG4gICAgdyMjcG9zdE1lc3NhZ2UgbXNnXG5cblxuXG5sZXQgdGVybWluYXRlICh3OiB0KTogdW5pdCA9XG4gICAgdyMjdGVybWluYXRlXG5cblxuXG5cbigqIEltcGxlbWVudGF0aW9uIENvZGVcbiAgID09PT09PT09PT09PT09PT09PT1cbiopXG5cblxudHlwZSAnbXNnIHdvcmtlcl9mdW5jdGlvbiA9IChWYWx1ZS50IC0+IHVuaXQpIC0+ICdtc2cgLT4gdW5pdFxuXG5sZXQgbWFrZSAoZGVjb2RlOiAnbXNnIERlY29kZS50KSAoZjogJ21zZyB3b3JrZXJfZnVuY3Rpb24pOiB1bml0ID1cbiAgICBsZXQgb3BlbiBNYWluIGluXG4gICAgbGV0IHBvc3QgPVxuICAgICAgICBtYXRjaCBnZXRfZ2xvYmFsIFwicG9zdE1lc3NhZ2VcIiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcmFpc2VfanMgXCJ3ZWJ3b3JrZXI6IDxwb3N0TWVzc2FnZT4gZnVuY3Rpb24gbm90IGF2YWlsYWJsZVwiXG4gICAgICAgIHwgU29tZSBwb3N0IC0+XG4gICAgICAgICAgICBwb3N0XG4gICAgaW5cbiAgICBsZXQgcG9zdCA9XG4gICAgICAgIGRlY29kZV9jYWxsYmFja1xuICAgICAgICAgICAgKGZ1biBfIC0+IFwid2Vid29ya2VyOiA8cG9zdE1lc3NhZ2U+IGlzIG5vdCBhIGZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBwb3N0XG4gICAgaW5cbiAgICBsZXQgZiA9IGYgcG9zdFxuICAgIGluXG4gICAgbWFrZV9nbG9iYWxcbiAgICAgICAgXCJvbm1lc3NhZ2VcIlxuICAgICAgICAoVmFsdWUuZnVuY3Rpb24xXG4gICAgICAgICAgICAgKGZ1biBtc2cgLT5cbiAgICAgICAgICAgICAgICAgIHNlbmRfbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgIChmdW4gXyAtPiBcIndlYndvcmtlcjogY2Fubm90IGRlY29kZSBtZXNzYWdlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgbXNnXG4gICAgICAgICAgICAgICAgICAgICAgZGVjb2RlXG4gICAgICAgICAgICAgICAgICAgICAgZjtcbiAgICAgICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZCkpXG5cblxuXG5cblxuXG4oKiBTaW11bGF0aW9uXG4gKiA9PT09PT09PT09XG4gKilcblxuXG5tb2R1bGUgU2ltdWxhdGUgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gKFZhbHVlLnQgLT4gdW5pdCkgb3B0aW9uIHJlZlxuXG5cbiAgICBsZXQgc3RhcnRcbiAgICAgICAgICAgIChkZWM6ICdyY3YgRGVjb2RlLnQpIChjYjogJ3JjdiAtPiB1bml0KVxuICAgICAgICAgICAgKHdvcmtlcl9kZWNvZGU6ICdtc2cgRGVjb2RlLnQpICh3b3JrZXI6ICdtc2cgd29ya2VyX2Z1bmN0aW9uKVxuICAgICAgICA6IHRcbiAgICAgICAgPVxuICAgICAgICBsZXQgcG9zdF90b19jcmVhdG9yIHYgPVxuICAgICAgICAgICAgc2VuZF9tZXNzYWdlXG4gICAgICAgICAgICAgICAgKGZ1biBfIC0+IFwibWFpbjogY2Fubm90IGRlY29kZSBtZXNzYWdlIGZyb20gd29ya2VyXCIpXG4gICAgICAgICAgICAgICAgdiBkZWMgY2JcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHBvc3RfdG9fY3JlYXRvciB2ID1cbiAgICAgICAgICAgIGRvX2FzeW5jIChmdW4gXyAtPiBwb3N0X3RvX2NyZWF0b3IgdilcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGYgPSB3b3JrZXIgcG9zdF90b19jcmVhdG9yXG4gICAgICAgIGluXG4gICAgICAgIGxldCBwb3N0X3RvX3dvcmtlciB2ID1cbiAgICAgICAgICAgIGRvX2FzeW5jXG4gICAgICAgICAgICAgICAgKGZ1biBfIC0+XG4gICAgICAgICAgICAgICAgICAgICBzZW5kX21lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuIF8gLT4gXCJ3ZWJ3b3JrZXI6IGNhbm5vdCBkZWNvZGUgbWVzc2FnZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgIHYgd29ya2VyX2RlY29kZSBmKVxuICAgICAgICBpblxuICAgICAgICByZWYgKFNvbWUgcG9zdF90b193b3JrZXIpXG5cblxuICAgIGxldCBwb3N0X21lc3NhZ2UgKG1zZzogVmFsdWUudCkgKHc6IHQpOiB1bml0ID1cbiAgICAgICAgbWF0Y2ggIXcgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcIndvcmtlciBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWRcIlxuICAgICAgICB8IFNvbWUgcG9zdCAtPlxuICAgICAgICAgICAgcG9zdCBtc2dcblxuXG4gICAgbGV0IHRlcm1pbmF0ZSAodzogdCk6IHVuaXQgPVxuICAgICAgICB3IDo9IE5vbmVcbmVuZFxuXG5cblxuXG5cbmxldCBzaW11bGF0ZV9qc1xuICAgICAgICAobmFtZTogc3RyaW5nKVxuICAgICAgICAoZGVjb2RlOiAnbXNnIERlY29kZS50KVxuICAgICAgICAod2Z1bjogJ21zZyB3b3JrZXJfZnVuY3Rpb24pXG4gICAgOiB1bml0XG4gICAgPVxuICAgIGxldCBvcGVuIE1haW4gaW5cbiAgICAoZnVuIHBvc3QgLT5cbiAgICAgICAgIGxldCBwb3N0X3RvX2NyZWF0b3IgPVxuICAgICAgICAgICAgIGRlY29kZV9jYWxsYmFja1xuICAgICAgICAgICAgICAgICAoZnVuIF8gLT4gXCJ3ZWJ3b3JrZXI6IDxwb3N0TWVzc2FnZT4gaXMgbm90IGEgZnVudGlvblwiKVxuICAgICAgICAgICAgICAgICBwb3N0XG4gICAgICAgICBpblxuICAgICAgICAgbGV0IHcgPVxuICAgICAgICAgICAgIFNpbXVsYXRlLnN0YXJ0XG4gICAgICAgICAgICAgICAgIChmdW4gdiAtPiBEZWNvZGUucmV0dXJuIHYgdilcbiAgICAgICAgICAgICAgICAgcG9zdF90b19jcmVhdG9yXG4gICAgICAgICAgICAgICAgIGRlY29kZVxuICAgICAgICAgICAgICAgICB3ZnVuXG4gICAgICAgICBpblxuICAgICAgICAgbGV0IHBvc3RfdG9fd29ya2VyIG1zZyA9XG4gICAgICAgICAgICAgIFNpbXVsYXRlLnBvc3RfbWVzc2FnZSBtc2cgdztcbiAgICAgICAgICAgICAgVmFsdWUudW5kZWZpbmVkXG4gICAgICAgICBhbmQgdGVybWluYXRlIF8gPVxuICAgICAgICAgICAgIFNpbXVsYXRlLnRlcm1pbmF0ZSB3O1xuICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZFxuICAgICAgICAgaW5cbiAgICAgICAgIFZhbHVlLl9vYmplY3QgW3xcbiAgICAgICAgICAgICBcInBvc3RNZXNzYWdlXCIsIFZhbHVlLmZ1bmN0aW9uMSBwb3N0X3RvX3dvcmtlcjtcbiAgICAgICAgICAgICBcInRlcm1pbmF0ZVwiLCAgIFZhbHVlLmZ1bmN0aW9uMSB0ZXJtaW5hdGVcbiAgICAgICAgIHxdXG4gICAgKVxuICAgIHw+IFZhbHVlLmZ1bmN0aW9uMVxuICAgIHw+IG1ha2VfZ2xvYmFsIG5hbWVcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcblxudHlwZSBqc19zdHJpbmcgPSBKcy5qc19zdHJpbmcgSnMudFxuXG5jbGFzcyB0eXBlIHhtbEh0dHBSZXF1ZXN0ID1cbm9iamVjdFxuICAgIG1ldGhvZCBvcGVuXzoganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBzZXRSZXF1ZXN0SGVhZGVyOiBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfc3RyaW5nOiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZTogaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICAoKlxuICAgICAgICAwOiByZXF1ZXN0IG5vdCBpbml0aWFsaXplZFxuICAgICAgICAxOiBvcGVuIGhhcyBiZWVuIGNhbGxlZFxuICAgICAgICAyOiBzZW5kIGhhcyBiZWVuIGNhbGxlZFxuICAgICAgICAzOiBsb2FkaW5nXG4gICAgICAgIDQ6IGNvbXBsZXRlXG4gICAgKilcblxuICAgIG1ldGhvZCBzdGF0dXM6IGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgKCogMjAwOiBPaywgNDAzOiBmb3JiaWRkZW4sIDQwNDogbm90IGZvdW5kLiAqKVxuXG4gICAgbWV0aG9kIHN0YXR1c1RleHQ6IGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVzcG9uc2VUZXh0OiBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuZW5kXG5cblxudHlwZSB0ID0geG1sSHR0cFJlcXVlc3QgSnMudFxuXG5cbmxldCBldmVudF90YXJnZXQgKHJlcTogdCk6IEV2ZW50X3RhcmdldC50ID1cbiAgICBPYmoubWFnaWMgcmVxXG5cblxubGV0IG1ha2VcbiAgICAgICAgKF9tZXRob2Q6IHN0cmluZylcbiAgICAgICAgKHVybDogc3RyaW5nKVxuICAgICAgICAoaGVhZGVyczogKHN0cmluZyAqIHN0cmluZykgbGlzdClcbiAgICAgICAgKGJvZHk6IHN0cmluZylcbiAgICA6IHRcbiAgICA9XG4gICAgbGV0IHJlcTogeG1sSHR0cFJlcXVlc3QgSnMudCA9XG4gICAgICAgIGxldCByZXF1ZXN0ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9YTUxIdHRwUmVxdWVzdFxuICAgICAgICBpblxuICAgICAgICBuZXclanMgcmVxdWVzdFxuICAgIGluXG4gICAgcmVxIyNvcGVuXyAoSnMuc3RyaW5nIF9tZXRob2QpIChKcy5zdHJpbmcgdXJsKTtcbiAgICBMaXN0Lml0ZXJcbiAgICAgICAgKGZ1biAobmFtZSwgdmFsdWUpIC0+XG4gICAgICAgICAgICAgcmVxIyNzZXRSZXF1ZXN0SGVhZGVyIChKcy5zdHJpbmcgbmFtZSkgKEpzLnN0cmluZyB2YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICBoZWFkZXJzO1xuICAgIHJlcSMjc2VuZF9zdHJpbmcgKEpzLnN0cmluZyBib2R5KTtcbiAgICByZXFcblxuXG5sZXQgcmVhZHlfc3RhdGUgKHJlcTogdCk6IGludCA9XG4gICAgcmVxIyMucmVhZHlTdGF0ZVxuXG5cbmxldCBzdGF0dXMgKHJlcTogdCk6IGludCA9XG4gICAgcmVxIyMuc3RhdHVzXG5cblxubGV0IHJlc3BvbnNlX3RleHRfdmFsdWUgKHJlcTogdCk6IEJhc2UuVmFsdWUudCA9XG4gICAgT2JqLm1hZ2ljIHJlcSMjLnJlc3BvbnNlVGV4dFxuXG5cbmxldCByZXNwb25zZV90ZXh0X3N0cmluZyAocmVxOiB0KTogc3RyaW5nID1cbiAgICBKcy50b19zdHJpbmcgcmVxIyMucmVzcG9uc2VUZXh0XG4iLCJvcGVuIEpzX29mX29jYW1sXG5vcGVuIEJhc2VcblxudHlwZSBqc19zdHJpbmcgPSBKcy5qc19zdHJpbmcgSnMudFxuXG5cblxuY2xhc3MgdHlwZSBzdHlsZSA9XG5vYmplY3RcbiAgICBtZXRob2Qgc2V0UHJvcGVydHk6ICAgIGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlbW92ZVByb3BlcnR5OiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxuY2xhc3MgdHlwZSBub2RlID1cbm9iamVjdFxuICAgIG1ldGhvZCBwYXJlbnROb2RlOiAgbm9kZSBKcy50IEpzLk9wdC50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgZmlyc3RDaGlsZDogIG5vZGUgSnMudCBKcy5PcHQudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIG5leHRTaWJsaW5nOiBub2RlIEpzLnQgSnMuT3B0LnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFwcGVuZENoaWxkOiAgbm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZW1vdmVDaGlsZDogIG5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVwbGFjZUNoaWxkOiBub2RlIEpzLnQgLT4gbm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCBub2RlVmFsdWU6ICAgIGpzX3N0cmluZyBKcy5wcm9wXG5lbmRcblxuXG5cblxuXG5cblxuY2xhc3MgdHlwZSBlbGVtZW50ID1cbm9iamVjdFxuICAgIG1ldGhvZCBzY3JvbGxXaWR0aDogICAgIGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHNjcm9sbEhlaWdodDogICAgaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgY2xpZW50V2lkdGg6ICAgICBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBjbGllbnRIZWlnaHQ6ICAgIGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHNjcm9sbExlZnQ6ICAgICAgaW50IEpzLnByb3BcbiAgICBtZXRob2Qgc2Nyb2xsVG9wOiAgICAgICBpbnQgSnMucHJvcFxuXG4gICAgbWV0aG9kIHN0eWxlOiAgICAgICAgICAgc3R5bGUgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHNldEF0dHJpYnV0ZTogICAganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVtb3ZlQXR0cmlidXRlOiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgZm9jdXM6IHVuaXQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIGJsdXI6ICB1bml0IC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cblxuXG5jbGFzcyB0eXBlIGRvY3VtZW50ID1cbm9iamVjdFxuICAgIG1ldGhvZCB0aXRsZTogICAgICAgICAganNfc3RyaW5nIEpzLnByb3BcbiAgICBtZXRob2QgYm9keTogICAgICAgICAgIGVsZW1lbnQgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGdldEVsZW1lbnRCeUlkOiBqc19zdHJpbmcgLT4gZWxlbWVudCBKcy50IEpzLk9wdC50IEpzLm1ldGhcbiAgICBtZXRob2QgY3JlYXRlVGV4dE5vZGU6IGpzX3N0cmluZyAtPiBub2RlIEpzLnQgSnMubWV0aFxuICAgIG1ldGhvZCBjcmVhdGVFbGVtZW50OiAganNfc3RyaW5nIC0+IGVsZW1lbnQgSnMudCBKcy5tZXRoXG4gICAgbWV0aG9kIGNyZWF0ZUVsZW1lbnROUzogIGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gZWxlbWVudCBKcy50IEpzLm1ldGhcbiAgICBtZXRob2QgY3JlYXRlRG9jdW1lbnRGcmFnbWVudDogIHVuaXQgLT4gbm9kZSBKcy50IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5cbmNsYXNzIHR5cGUgaGlzdG9yeSA9XG5vYmplY3RcbiAgICBtZXRob2QgZ286IGludCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcHVzaFN0YXRlOiAgICBCYXNlLlZhbHVlLnQgLT4ganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVwbGFjZVN0YXRlOiBCYXNlLlZhbHVlLnQgLT4ganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5jbGFzcyB0eXBlIGxvY2F0aW9uID1cbm9iamVjdFxuICAgIG1ldGhvZCBocmVmOiAgICAgICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgcHJvdG9jb2w6ICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGhvc3Q6ICAgICAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBwb3J0OiAgICAgICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgcGF0aG5hbWU6ICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHNlYXJjaDogICAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBoYXNoOiAgICAgICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhc3NpZ246IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVsb2FkOiB1bml0IC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cblxuY2xhc3MgdHlwZSB3aW5kb3cgPVxub2JqZWN0XG4gICAgbWV0aG9kIGhpc3Rvcnk6ICBoaXN0b3J5IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBsb2NhdGlvbjogbG9jYXRpb24gSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGRvY3VtZW50OiBkb2N1bWVudCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiAoZmxvYXQgLT4gdW5pdCkgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxuXG5cbm1vZHVsZSBTdHlsZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBzdHlsZSBKcy50XG5cbiAgICBsZXQgc2V0IChuYW1lOiBzdHJpbmcpICh2YWx1ZTogc3RyaW5nKSAoczogdCk6IHVuaXQgPVxuICAgICAgICBzIyNzZXRQcm9wZXJ0eSAoSnMuc3RyaW5nIG5hbWUpIChKcy5zdHJpbmcgdmFsdWUpXG5cbiAgICBsZXQgcmVtb3ZlIChuYW1lOiBzdHJpbmcpIChzOiB0KTogdW5pdCA9XG4gICAgICAgIHMjI3JlbW92ZVByb3BlcnR5IChKcy5zdHJpbmcgbmFtZSlcbmVuZFxuXG5cblxuXG5tb2R1bGUgTm9kZSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBub2RlIEpzLnRcblxuICAgIGxldCBldmVudF90YXJnZXQgKG5vZGU6IHQpOiBFdmVudF90YXJnZXQudCA9XG4gICAgICAgIE9iai5tYWdpYyBub2RlXG5cbiAgICBsZXQgcGFyZW50IChub2RlOiB0KTogdCBvcHRpb24gPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBPcHQudG9fb3B0aW9uIG5vZGUjIy5wYXJlbnROb2RlXG5cbiAgICBsZXQgZmlyc3QgKG5vZGU6IHQpOiB0IG9wdGlvbiA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIE9wdC50b19vcHRpb24gbm9kZSMjLmZpcnN0Q2hpbGRcblxuICAgIGxldCBuZXh0IChub2RlOiB0KTogdCBvcHRpb24gPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBPcHQudG9fb3B0aW9uIG5vZGUjIy5uZXh0U2libGluZ1xuXG4gICAgbGV0IGFwcGVuZCAoY2hpbGQ6IHQpIChub2RlOiB0KTogdW5pdCA9XG4gICAgICAgIGFzc2VydCAobm90IChub2RlID09IE9iai5tYWdpYyBWYWx1ZS5udWxsKSk7XG4gICAgICAgIG5vZGUjI2FwcGVuZENoaWxkIGNoaWxkXG5cbiAgICBsZXQgcmVtb3ZlIChjaGlsZDogdCkgKG5vZGU6IHQpOiB1bml0ID1cbiAgICAgICAgbm9kZSMjcmVtb3ZlQ2hpbGQgY2hpbGRcblxuICAgIGxldCByZXBsYWNlIChuZXdfY2hpbGQ6IHQpIChvbGRfY2hpbGQ6IHQpIChub2RlOiB0KTogdW5pdCA9XG4gICAgICAgIG5vZGUjI3JlcGxhY2VDaGlsZCBuZXdfY2hpbGQgb2xkX2NoaWxkXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9jaGlsZHJlbiAocGFyZW50OiB0KTogdW5pdCA9XG4gICAgICAgIG1hdGNoIGZpcnN0IHBhcmVudCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgKClcbiAgICAgICAgfCBTb21lIGNoaWxkIC0+XG4gICAgICAgICAgICByZW1vdmUgY2hpbGQgcGFyZW50O1xuICAgICAgICAgICAgcmVtb3ZlX2NoaWxkcmVuIHBhcmVudCAoKiB0YWlsIHJlY3Vyc2lvbiwgY29tcGlsZWQgdG8gamF2YXNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wLiAqKVxuXG4gICAgbGV0IG5vZGVfdmFsdWUgKG5vZGU6IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbm9kZSMjLm5vZGVWYWx1ZVxuXG4gICAgbGV0IHNldF9ub2RlX3ZhbHVlICh2YWx1ZTogc3RyaW5nKSAobm9kZTogdCk6IHVuaXQgPVxuICAgICAgICBub2RlIyMubm9kZVZhbHVlIDo9IChKcy5zdHJpbmcgdmFsdWUpXG5lbmRcblxuXG5cblxuXG5cblxubW9kdWxlIEVsZW1lbnQgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gZWxlbWVudCBKcy50XG5cbiAgICBsZXQgbm9kZSAoZWxlbWVudDogdCk6IE5vZGUudCA9XG4gICAgICAgIEpzLlVuc2FmZS5jb2VyY2UgZWxlbWVudFxuXG4gICAgbGV0IHNjcm9sbF93aWR0aCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxXaWR0aFxuXG4gICAgbGV0IHNjcm9sbF9oZWlnaHQgKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsSGVpZ2h0XG5cbiAgICBsZXQgY2xpZW50X3dpZHRoIChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLmNsaWVudFdpZHRoXG5cbiAgICBsZXQgY2xpZW50X2hlaWdodCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5jbGllbnRIZWlnaHRcblxuICAgIGxldCBzY3JvbGxfbGVmdCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxMZWZ0XG5cbiAgICBsZXQgc2Nyb2xsX3RvcCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxUb3BcblxuXG4gICAgbGV0IHNldF9zY3JvbGxfbGVmdCAodjogaW50KSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsTGVmdCA6PSB2XG5cbiAgICBsZXQgc2V0X3Njcm9sbF90b3AgKHY6IGludCkgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbFRvcCA6PSB2XG5cblxuXG5cbiAgICBsZXQgc3R5bGUgKGVsZW1lbnQ6IHQpOiBTdHlsZS50ID1cbiAgICAgICAgZWxlbWVudCMjLnN0eWxlXG5cbiAgICBsZXQgc2V0X2F0dHJpYnV0ZSAobmFtZTogc3RyaW5nKSAodmFsdWU6IHN0cmluZykgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjc2V0QXR0cmlidXRlIChKcy5zdHJpbmcgbmFtZSkgKEpzLnN0cmluZyB2YWx1ZSlcblxuICAgIGxldCByZW1vdmVfYXR0cmlidXRlIChuYW1lOiBzdHJpbmcpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjI3JlbW92ZUF0dHJpYnV0ZSAoSnMuc3RyaW5nIG5hbWUpXG5cblxuICAgIGxldCBzZXRfcHJvcGVydHkgKG5hbWU6IHN0cmluZykgKHZhbHVlOiBWYWx1ZS50KSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBKcy5VbnNhZmUuc2V0IGVsZW1lbnQgKEpzLnN0cmluZyBuYW1lKSB2YWx1ZVxuXG4gICAgbGV0IGRlbGV0ZV9wcm9wZXJ0eSAobmFtZTogc3RyaW5nKSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBKcy5VbnNhZmUuZGVsZXRlIGVsZW1lbnQgKEpzLnN0cmluZyBuYW1lKVxuXG5cbiAgICBsZXQgZm9jdXMgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjZm9jdXMgKClcblxuICAgIGxldCBibHVyIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjI2JsdXIgKClcbmVuZFxuXG5cblxuXG5cblxuXG5tb2R1bGUgRG9jdW1lbnQgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gZG9jdW1lbnQgSnMudFxuXG5cbiAgICBsZXQgdGl0bGUgKGRvYzogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBkb2MjIy50aXRsZVxuXG5cbiAgICBsZXQgc2V0X3RpdGxlICh0aXRsZTogc3RyaW5nKSAoZG9jOiB0KTogdW5pdCA9XG4gICAgICAgIGRvYyMjLnRpdGxlIDo9IEpzLnN0cmluZyB0aXRsZVxuXG5cbiAgICBsZXQgYm9keSAoZG9jOiB0KTogRWxlbWVudC50ID1cbiAgICAgICAgYXNzZXJ0IChkb2MjIy5ib2R5ICE9IEpzLlVuc2FmZS5qc19leHByIFwibnVsbFwiKTtcbiAgICAgICAgZG9jIyMuYm9keVxuXG4gICAgbGV0IGZpbmQgKG5hbWU6IHN0cmluZykgKGRvYzogdCk6IEVsZW1lbnQudCBvcHRpb24gPVxuICAgICAgICBKcy5PcHQudG9fb3B0aW9uIChkb2MjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgbmFtZSkpXG5cbiAgICBsZXQgY3JlYXRlX2VsZW1lbnQgKHRhZzogc3RyaW5nKSAoZG9jOiB0KTogRWxlbWVudC50ID1cbiAgICAgICAgZG9jIyNjcmVhdGVFbGVtZW50IChKcy5zdHJpbmcgdGFnKVxuXG4gICAgbGV0IGNyZWF0ZV90ZXh0X25vZGUgKHRleHQ6IHN0cmluZykgKGRvYzogdCk6IE5vZGUudCA9XG4gICAgICAgIGRvYyMjY3JlYXRlVGV4dE5vZGUgKEpzLnN0cmluZyB0ZXh0KVxuXG4gICAgbGV0IGNyZWF0ZV9lbGVtZW50X25zIChuYW1lc3BhY2U6IHN0cmluZykgKHRhZzogc3RyaW5nKSAoZG9jOiB0KTogRWxlbWVudC50ID1cbiAgICAgICAgZG9jIyNjcmVhdGVFbGVtZW50TlMgKEpzLnN0cmluZyBuYW1lc3BhY2UpIChKcy5zdHJpbmcgdGFnKVxuXG4gICAgbGV0IGNyZWF0ZV9kb2N1bWVudF9mcmFnbWVudCAoZG9jOiB0KTogTm9kZS50ID1cbiAgICAgICAgZG9jIyNjcmVhdGVEb2N1bWVudEZyYWdtZW50ICgpXG5lbmRcblxuXG5cbm1vZHVsZSBIaXN0b3J5ID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IGhpc3RvcnkgSnMudFxuXG5cbiAgICBsZXQgZ28gKGk6IGludCkgKGhpc3Rvcnk6IHQpOiB1bml0ID1cbiAgICAgICAgaGlzdG9yeSMjZ28gaVxuXG5cbiAgICBsZXQgcHVzaF9zdGF0ZVxuICAgICAgICAgICAgKHN0YXRlOiBWYWx1ZS50KVxuICAgICAgICAgICAgKHRpdGxlOiBzdHJpbmcpXG4gICAgICAgICAgICAodXJsOiBzdHJpbmcpXG4gICAgICAgICAgICAoaGlzdG9yeTogdClcbiAgICAgICAgOiB1bml0ID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgaGlzdG9yeSMjcHVzaFN0YXRlIHN0YXRlIChzdHJpbmcgdGl0bGUpIChzdHJpbmcgdXJsKVxuXG5cbiAgICBsZXQgcmVwbGFjZV9zdGF0ZVxuICAgICAgICAgICAgKHN0YXRlOiBWYWx1ZS50KVxuICAgICAgICAgICAgKHRpdGxlOiBzdHJpbmcpXG4gICAgICAgICAgICAodXJsOiBzdHJpbmcpXG4gICAgICAgICAgICAoaGlzdG9yeTogdClcbiAgICAgICAgOiB1bml0ID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgaGlzdG9yeSMjcmVwbGFjZVN0YXRlIHN0YXRlIChzdHJpbmcgdGl0bGUpIChzdHJpbmcgdXJsKVxuZW5kXG5cblxuXG5cblxubW9kdWxlIExvY2F0aW9uID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IGxvY2F0aW9uIEpzLnRcblxuICAgIGxldCBocmVmIChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLmhyZWZcblxuICAgIGxldCBwcm90b2NvbCAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5wcm90b2NvbFxuXG4gICAgbGV0IGhvc3QgKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMuaG9zdFxuXG4gICAgbGV0IHBvcnQgKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMucG9ydFxuXG4gICAgbGV0IHBhdGhuYW1lIChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLnBhdGhuYW1lXG5cbiAgICBsZXQgc2VhcmNoIChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLnNlYXJjaFxuXG4gICAgbGV0IGhhc2ggKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMuaGFzaFxuXG4gICAgbGV0IGFzc2lnbiAodXJsOiBzdHJpbmcpIChsb2NhdGlvbjogdCk6IHVuaXQgPVxuICAgICAgICBsb2NhdGlvbiMjYXNzaWduIChKcy5zdHJpbmcgdXJsKVxuXG5cbiAgICBsZXQgcmVsb2FkIChsb2NhdGlvbjogdCk6IHVuaXQgPVxuICAgICAgICBsb2NhdGlvbiMjcmVsb2FkICgpXG5lbmRcblxuXG5cblxubW9kdWxlIFdpbmRvdyA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSB3aW5kb3cgSnMudFxuXG5cbiAgICBsZXQgZ2V0ICgpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmdsb2JhbFxuXG4gICAgbGV0IGV2ZW50X3RhcmdldCAodzogdCk6IEV2ZW50X3RhcmdldC50ID1cbiAgICAgICAgT2JqLm1hZ2ljIHdcblxuXG4gICAgbGV0IGRvY3VtZW50ICh3OiB0KTogRG9jdW1lbnQudCA9XG4gICAgICAgIHcjIy5kb2N1bWVudFxuXG5cbiAgICBsZXQgaGlzdG9yeSAodzogdCk6IEhpc3RvcnkudCA9XG4gICAgICAgIHcjIy5oaXN0b3J5XG5cblxuICAgIGxldCBsb2NhdGlvbiAodzogdCk6IExvY2F0aW9uLnQgPVxuICAgICAgICB3IyMubG9jYXRpb25cblxuXG4gICAgbGV0IG9uX25leHRfYW5pbWF0aW9uIChjYWxsYmFjazogZmxvYXQgLT4gdW5pdCkgKHc6IHQpOiB1bml0ID1cbiAgICAgICAgdyMjcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGNhbGxiYWNrXG5lbmRcbiIsIm9wZW4gSnNfb2Zfb2NhbWxcblxudHlwZSB0ID0gSnMuZGF0ZSBKcy50XG5cblxubGV0IG5vdyAoKTogdCA9XG4gICAgbmV3JWpzIEpzLmRhdGVfbm93XG5cblxubGV0IG1ha2VcbiAgICAgICAgKHllYXI6IGludClcbiAgICAgICAgKG1vbnRoOiBpbnQpXG4gICAgICAgIChkYXk6IGludClcbiAgICAgICAgKGhvdXI6IGludClcbiAgICAgICAgKG1pbnV0ZTogaW50KVxuICAgICAgICAoc2Vjb25kOiBpbnQpXG4gICAgICAgIChtaWxsaTogaW50KVxuICAgIDogdFxuICAgID1cbiAgICBuZXclanMgSnMuZGF0ZV9tcyB5ZWFyIG1vbnRoIGRheSBob3VyIG1pbnV0ZSBzZWNvbmQgbWlsbGlcblxuXG5sZXQgb2ZfdmFsdWUgKHY6IGZsb2F0KTogdCA9XG4gICAgbmV3JWpzIEpzLmRhdGVfZnJvbVRpbWVWYWx1ZSB2XG5cblxubGV0IHZhbHVlIChkOiB0KTogZmxvYXQgPVxuICAgIGQjI3ZhbHVlT2ZcblxuXG5sZXQgem9uZV9vZmZzZXQgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldFRpbWV6b25lT2Zmc2V0XG5cblxubGV0IGFkZCAobXM6IGZsb2F0KSAoZDogdCk6IHQgPVxuICAgIG9mX3ZhbHVlICh2YWx1ZSBkICsuIG1zKVxuXG5cbmxldCBkYXkgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldERheVxuXG5cbmxldCBkYXRlIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXREYXRlXG5cblxubGV0IG1vbnRoIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRNb250aFxuXG5cbmxldCB5ZWFyIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRGdWxsWWVhclxuXG5cbmxldCBob3VycyAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0SG91cnNcblxuXG5sZXQgbWludXRlcyAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0TWludXRlc1xuXG5cbmxldCBzZWNvbmRzIChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRTZWNvbmRzXG5cblxubGV0IG1pbGxpc2Vjb25kcyAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0TWlsbGlzZWNvbmRzXG4iLCJvcGVuIEZtbGliX3N0ZFxuXG5tb2R1bGUgdHlwZSBESUNUID1cbnNpZ1xuICAgIHR5cGUga2V5XG5cbiAgICB0eXBlIF8gdFxuXG4gICAgdmFsIGVtcHR5OiAnYSB0XG5cbiAgICB2YWwgZmluZF9vcHQ6IGtleSAtPiAnYSB0IC0+ICdhIG9wdGlvblxuXG4gICAgdmFsIGFkZDoga2V5IC0+ICdhIC0+ICdhIHQgLT4gJ2EgdFxuXG4gICAgdmFsIHNldDoga2V5IC0+ICgnYSBvcHRpb24gLT4gJ2EpIC0+ICdhIHQgLT4gJ2EgdFxuXG4gICAgdmFsIG9mX2xpc3Q6IChrZXkgKiAnYSkgbGlzdCAtPiAnYSB0XG5cbiAgICB2YWwgZm9sZDogKCdhY2N1IC0+IGtleSAtPiAnYSAtPiAnYWNjdSkgLT4gJ2FjY3UgLT4gJ2EgdCAtPiAnYWNjdVxuXG4gICAgdmFsIGl0ZXI6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG5cbiAgICB2YWwgZGlmZjpcbiAgICAgICAgKGtleSAtPiAnYSAtPiB1bml0KVxuICAgICAgICAtPiAoa2V5IC0+ICdhIC0+IHVuaXQpXG4gICAgICAgIC0+IChrZXkgLT4gdW5pdClcbiAgICAgICAgLT4gJ2EgdFxuICAgICAgICAtPiAnYSB0XG4gICAgICAgIC0+IHVuaXRcbmVuZFxuXG5cbm1vZHVsZSBNYWtlIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIG1vZHVsZSBNYXAgICA9IEZtbGliX3N0ZC5CdHJlZS5NYXAgKEtleSlcblxuICAgIHR5cGUgJ2EgdCA9IHtcbiAgICAgICAgYXJyOiAoS2V5LnQgKiAnYSApIEFycmF5LnQ7XG4gICAgICAgIG1hcDogaW50IE1hcC50O1xuICAgIH1cblxuICAgIGxldCBlbXB0eTogJ2EgdCA9IHtcbiAgICAgICAgYXJyID0gW3x8XTtcbiAgICAgICAgbWFwID0gTWFwLmVtcHR5O1xuICAgIH1cblxuXG4gICAgbGV0IGZpbmRfb3B0IChrZXk6IEtleS50KSAoZDogJ2EgdCk6ICdhIG9wdGlvbiA9XG4gICAgICAgIE9wdGlvbi5tYXBcbiAgICAgICAgICAgIChmdW4gaSAtPlxuICAgICAgICAgICAgICAgICBhc3NlcnQgKGkgPCBBcnJheS5sZW5ndGggZC5hcnIpO1xuICAgICAgICAgICAgICAgICBsZXQgaywgdiA9IGQuYXJyLihpKSBpblxuICAgICAgICAgICAgICAgICBhc3NlcnQgKGsgPSBrZXkpO1xuICAgICAgICAgICAgICAgICB2KVxuICAgICAgICAgICAgKE1hcC5maW5kX29wdCBrZXkgZC5tYXApXG5cblxuICAgIGxldCBhZGQgKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpIChkOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIG1hdGNoIE1hcC5maW5kX29wdCBrZXkgZC5tYXAgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIGQuYXJyIGluXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFwID0gTWFwLmFkZCBrZXkgbiBkLm1hcDtcbiAgICAgICAgICAgICAgICBhcnIgPSBBcnJheS5wdXNoIChrZXksIHZhbHVlKSBkLmFycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgIGRcblxuXG5cbiAgICBsZXQgc2V0IChrZXk6IEtleS50KSAoZjogJ2Egb3B0aW9uIC0+ICdhKSAoZDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBtYXRjaCBNYXAuZmluZF9vcHQga2V5IGQubWFwIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBhZGQga2V5IChmIE5vbmUpIGRcbiAgICAgICAgfCBTb21lIGlkeCAtPlxuICAgICAgICAgICAgbGV0IChrLCB2KSA9IGQuYXJyLihpZHgpIGluXG4gICAgICAgICAgICBhc3NlcnQgKGsgPSBrZXkpO1xuICAgICAgICAgICAge2Qgd2l0aFxuICAgICAgICAgICAgIGFyciA9IEFycmF5LnJlcGxhY2UgaWR4IChrZXksIGYgKFNvbWUgdikpIGQuYXJyfVxuXG5cblxuICAgIGxldCBvZl9saXN0IChsc3Q6IChLZXkudCAqICdhKSBsaXN0KTogJ2EgdCA9XG4gICAgICAgIGxldCByZWMgb2ZfbGlzdCBkID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgICAgICBkXG4gICAgICAgICAgICB8IChrZXksIHZhbHVlKSA6OiB0bCAtPlxuICAgICAgICAgICAgICAgIG9mX2xpc3QgKGFkZCBrZXkgdmFsdWUgZCkgdGxcbiAgICAgICAgaW5cbiAgICAgICAgb2ZfbGlzdCBlbXB0eSBsc3RcblxuXG5cblxuICAgIGxldCBmb2xkIChmOiAnYWNjdSAtPiBLZXkudCAtPiAnYSAtPiAnYWNjdSkgKGFjY3U6ICdhY2N1KSAoZDogJ2EgdCk6ICdhY2N1ID1cbiAgICAgICAgQXJyYXkuZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIGFjY3UgKGtleSwgdmFsdWUpIC0+IGYgYWNjdSBrZXkgdmFsdWUpXG4gICAgICAgICAgICBhY2N1XG4gICAgICAgICAgICBkLmFyclxuXG5cbiAgICBsZXQgaXRlciAoZjogS2V5LnQgLT4gJ2EgLT4gdW5pdCkgKGRpY3Q6ICdhIHQpOiB1bml0ID1cbiAgICAgICAgU3RkbGliLkFycmF5Lml0ZXJcbiAgICAgICAgICAgIChmdW4gKGtleSwgdmFsdWUpIC0+IGYga2V5IHZhbHVlKVxuICAgICAgICAgICAgZGljdC5hcnJcblxuXG4gICAgbGV0IGRpZmZcbiAgICAgICAgICAgIChhZGQ6IEtleS50IC0+ICdhIC0+IHVuaXQpXG4gICAgICAgICAgICAoc2V0OiBLZXkudCAtPiAnYSAtPiB1bml0KVxuICAgICAgICAgICAgKHJlbW92ZTogS2V5LnQgLT4gdW5pdClcbiAgICAgICAgICAgIChkMTogJ2EgdClcbiAgICAgICAgICAgIChkMjogJ2EgdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgaXRlclxuICAgICAgICAgICAgKGZ1biBrZXkgXyAtPlxuICAgICAgICAgICAgICAgICBtYXRjaCBmaW5kX29wdCBrZXkgZDEgd2l0aFxuICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgICAgICAgICAgKClcbiAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICByZW1vdmUga2V5KVxuICAgICAgICAgICAgZDI7XG4gICAgICAgIGl0ZXJcbiAgICAgICAgICAgIChmdW4ga2V5IHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgIG1hdGNoIGZpbmRfb3B0IGtleSBkMiB3aXRoXG4gICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgYWRkIGtleSB2YWx1ZVxuXG4gICAgICAgICAgICAgICAgIHwgU29tZSB2YWx1ZTIgLT5cbiAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlID09IHZhbHVlMiB0aGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKClcbiAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICBzZXQga2V5IHZhbHVlKVxuICAgICAgICAgICAgZDFcbmVuZFxuXG5cblxuaW5jbHVkZSBNYWtlIChTdHJpbmcpXG4iLCJvcGVuIEZtbGliX2pzXG5cblxubW9kdWxlIFpvbmUgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gaW50ICgqIG9mZnNldCBpbiBtaW51dGVzIGZyb20gdXRjLCB3ZXN0d2FyZCBwb3NpdGl2ZSwgZWFzdHdhcmRcbiAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgKilcblxuICAgIGxldCB1dGM6IHQgPSAwXG5cbiAgICBsZXQgbWFrZSAobWludXRlczogaW50KTogdCA9XG4gICAgICAgIG1pbnV0ZXNcblxuICAgIGxldCBvZmZzZXQgKHpvbmU6IHQpOiBpbnQgPVxuICAgICAgICB6b25lXG5lbmRcblxuXG50eXBlIHQgPSBEYXRlLnRcblxubGV0IHplcm86IHQgPVxuICAgIERhdGUub2ZfdmFsdWUgKDAuMClcblxubGV0IGFkYXB0ICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogdCA9XG4gICAgRGF0ZS4oYWRkICg2MDAwMC4gKi4gZmxvYXRfb2ZfaW50ICh6b25lX29mZnNldCB0aW1lIC0gem9uZSkpIHRpbWUpXG4gICAgICAgICgqIG1vcmUgd2VzdHdhcmQgaXMgbm90IHlldCB0aGF0IGxhdGUgKilcblxuXG5sZXQgeWVhciAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS55ZWFyIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IG1vbnRoICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLm1vbnRoIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IGRheV9vZl9tb250aCAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5kYXRlIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IGhvdXIgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUuaG91cnMgKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgbWludXRlICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLm1pbnV0ZXMgKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgc2Vjb25kICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLnNlY29uZHMgKGFkYXB0IHRpbWUgem9uZSlcblxuXG5sZXQgbWlsbGlfc2Vjb25kICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLm1pbGxpc2Vjb25kcyAoYWRhcHQgdGltZSB6b25lKVxuIiwibW9kdWxlIExvY2FsID1cbnN0cnVjdFxuICAgIHR5cGUgdFxuXG4gICAgbGV0IHN0cmluZyAoXzogdCk6IHN0cmluZyA9XG4gICAgICAgIGFzc2VydCBmYWxzZSAoKiBueWkgKilcbmVuZFxuXG5cbnR5cGUgdCA9XG4gICAgfCBSYXcgb2Ygc3RyaW5nXG4gICAgfCBMb2NhbCBvZiBMb2NhbC50XG5cblxubGV0IHBhcnNlIChzdHI6IHN0cmluZyk6IHQgb3B0aW9uID1cbiAgICBTb21lIChSYXcgc3RyKVxuXG5cbmxldCBzdHJpbmc6IHQgLT4gc3RyaW5nID1cbiAgICBmdW5jdGlvblxuICAgIHwgUmF3IHN0ciAtPlxuICAgICAgICBzdHJcbiAgICB8IExvY2FsIGxvYyAtPlxuICAgICAgICBMb2NhbC5zdHJpbmcgbG9jXG5cbmxldCBpc19wYWdlOiB0IC0+IGJvb2wgPSBmdW5jdGlvblxuICAgIHwgUmF3IF8gLT5cbiAgICAgICAgdHJ1ZSAoKiBNSVNTSU5HISEhIGFzc2VydCBmYWxzZSAqKVxuICAgIHwgTG9jYWwgXyAtPlxuICAgICAgICB0cnVlXG4iLCJvcGVuIEZtbGliX2pzXG5cblxuXG5tb2R1bGUgQWN0dWFsID1cbnN0cnVjdFxuICAgICgqIFNlZSBOb3RlIFtGdW5jdGlvbnMgd2l0aCByZWZlcmVuY2VzXSAqKVxuICAgIHR5cGUgJ2UgdCA9IHtcbiAgICAgICAgcmVmOiAoJ2UgLT4gdW5pdCkgcmVmO1xuICAgICAgICByZWFsOiAnZSAtPiB1bml0O1xuICAgIH1cblxuICAgIGxldCBtYWtlIChoYW5kbGVyOiAnZSAtPiB1bml0KTogJ2UgdCA9XG4gICAgICAgIGxldCByZWYgPSByZWYgaGFuZGxlciBpblxuICAgICAgICBsZXQgZiByZWYgPVxuICAgICAgICAgICAgZnVuIGUgLT4gKCEgcmVmKSBlXG4gICAgICAgIGluXG4gICAgICAgIHsgcmVmOyByZWFsID0gZiByZWYgfVxuXG5cbiAgICBsZXQgdXBkYXRlIChoYW5kbGVyOiAnZSAtPiB1bml0KSAoYWN0dWFsOiAnZSB0KTogdW5pdCA9XG4gICAgICAgIGFjdHVhbC5yZWYgOj0gaGFuZGxlclxuXG4gICAgbGV0IGZpcmUgKGFjdHVhbDogJ2UgdCk6ICdlIC0+IHVuaXQgPVxuICAgICAgICBhY3R1YWwucmVhbFxuZW5kXG5cblxuXG5tb2R1bGUgQWN0dWFscyAoS2V5OiBGbWxpYl9zdGQuSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgbW9kdWxlIE1hcCAgPSBGbWxpYl9zdGQuQnRyZWUuTWFwIChLZXkpXG4gICAgbW9kdWxlIERpY3QgPSBEaWN0aW9uYXJ5Lk1ha2UgKEtleSlcblxuICAgIHR5cGUgKCdlLCAnYSkgdCA9ICgnZSBBY3R1YWwudCAqICdhKSBNYXAudCByZWZcblxuICAgIGxldCBlbXB0eSAoKTogKCdlLCAnYSkgdCA9IHJlZiBNYXAuZW1wdHlcblxuICAgIGxldCBzZXRcbiAgICAgICAgICAgIChtYWtlOiAndiAtPiAnZSAtPiB1bml0KVxuICAgICAgICAgICAgKGFkZDogIEtleS50IC0+ICgnZSAtPiB1bml0KSAtPiAnYSlcbiAgICAgICAgICAgIChkaWN0OiAndiBEaWN0LnQpXG4gICAgICAgICAgICAobWFwOiAoJ2UsICdhKSB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBEaWN0Lml0ZXJcbiAgICAgICAgICAgIChmdW4ga2V5IHYgLT5cbiAgICAgICAgICAgICAgICAgYXNzZXJ0IChNYXAuZmluZF9vcHQga2V5ICFtYXAgPSBOb25lKTtcbiAgICAgICAgICAgICAgICAgbGV0IGFjdHVhbCA9IEFjdHVhbC5tYWtlIChtYWtlIHYpXG4gICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgIGxldCBhID0gYWRkIGtleSAoQWN0dWFsLmZpcmUgYWN0dWFsKSBpblxuICAgICAgICAgICAgICAgICBtYXAgOj0gTWFwLmFkZCBrZXkgKGFjdHVhbCwgYSkgIW1hcFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZGljdFxuXG4gICAgbGV0IHVwZGF0ZVxuICAgICAgICAgICAgKG1ha2U6ICd2IC0+ICdlIC0+IHVuaXQpXG4gICAgICAgICAgICAoYWRkOiAgS2V5LnQgLT4gKCdlIC0+IHVuaXQpIC0+ICdhKVxuICAgICAgICAgICAgKHJlbW92ZTogS2V5LnQgLT4gKCdlIC0+IHVuaXQpIC0+ICdhIC0+IHVuaXQpXG4gICAgICAgICAgICAoZDE6ICd2IERpY3QudClcbiAgICAgICAgICAgIChkMjogJ3YgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogKCdlLCAnYSkgdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgRGljdC5kaWZmXG4gICAgICAgICAgICAoZnVuIGtleSB2IC0+XG4gICAgICAgICAgICAgICAgICgqIEhhbmRsZXIgZm9yIFtrZXldwqBuZXcgaW4gW2QxXS4gKilcbiAgICAgICAgICAgICAgICAgbWFwIDo9XG4gICAgICAgICAgICAgICAgICAgICBNYXAudXBkYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjdHVhbCA9IEFjdHVhbC5tYWtlIChtYWtlIHYpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBhZGQga2V5IChBY3R1YWwuZmlyZSBhY3R1YWwpIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lIChhY3R1YWwsIGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsLCBoYW5kbGVyIGlzIG5ldyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkMV0uICopXG4gICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIChmdW4ga2V5IHYgLT5cbiAgICAgICAgICAgICAgICAgKCogSGFuZGxlciBmb3IgW2tleV0gbmVlZHMgdXBkYXRlLiBJdCBpcyBwcmVzZW50IGluIFtkMV0gYW5kXG4gICAgICAgICAgICAgICAgICAgIFtkMl0gKilcbiAgICAgICAgICAgICAgICAgbWF0Y2ggTWFwLmZpbmRfb3B0IGtleSAhbWFwIHdpdGhcbiAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsLiBIYW5kbGVyIGlzIHByZXNlbnQgaW4gW2QxXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBbZDJdLiAqKVxuICAgICAgICAgICAgICAgICB8IFNvbWUgKGFjdHVhbCwgXykgLT5cbiAgICAgICAgICAgICAgICAgICAgIEFjdHVhbC51cGRhdGUgKG1ha2UgdikgYWN0dWFsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAoZnVuIGtleSAtPlxuICAgICAgICAgICAgICAgICAoKiBIYW5kbGVyIGZvciBba2V5XSBpcyBub3QgaW4gW2QxXSBidXQgaW4gW2QyXS4gSXQgaGFzIHRvIGJlXG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZWQuICopXG4gICAgICAgICAgICAgICAgIG1hcCA6PVxuICAgICAgICAgICAgICAgICAgICAgTWFwLnVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwuIEl0IGlzIGluIFtkMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmVmb3JlIGl0IGhhcyB0byBiZSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXBdLiAqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgKGFjdHVhbCwgYSkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSBrZXkgKEFjdHVhbC5maXJlIGFjdHVhbCkgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIW1hcFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZDFcbiAgICAgICAgICAgIGQyXG5lbmRcblxuXG5cblxuXG5cbigqIEEgdmlydHVhbCBoYW5kbGVyIGlzIGEgZGVjb2RlciB3aXRoIGZsYWdzIHRvIHN0b3AgcHJvcGFnYXRpb24gYW5kIHByZXZlbnRcbiAgIGRlZmF1bHQgaGFuZGxpbmcuXG4qKVxubW9kdWxlIFZpcnR1YWwgPVxuc3RydWN0XG4gICAgdHlwZSAnbSB0ID0gRXZlbnRfZmxhZy5zdG9wICogRXZlbnRfZmxhZy5wcmV2ZW50ICogJ20gQmFzZS5EZWNvZGUudFxuXG4gICAgbGV0IG1ha2Vfb25lXG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAoKEV2ZW50X2ZsYWcuU3RvcCBzdG9wLCBFdmVudF9mbGFnLlByZXZlbnQgcHJldmVudCwgZGVjb2RlKTogJ20gdClcbiAgICAgICAgOiBFdmVudC50IC0+IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBmdW4gZXZlbnQgLT5cblxuICAgICAgICBpZiBzdG9wIHRoZW5cbiAgICAgICAgICAgIEV2ZW50LnN0b3BfcHJvcGFnYXRpb24gZXZlbnQ7XG5cbiAgICAgICAgaWYgcHJldmVudCB0aGVuXG4gICAgICAgICAgICBFdmVudC5wcmV2ZW50X2RlZmF1bHQgZXZlbnQ7XG5cbiAgICAgICAgbWF0Y2ggZGVjb2RlIEV2ZW50Lih2YWx1ZSBldmVudCkgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIGxldCBvcGVuIEJhc2UuTWFpbiBpblxuICAgICAgICAgICAgbG9nX3N0cmluZyBcIkNhbm5vdCBkZWNvZGUgZXZlbnRcIjtcbiAgICAgICAgICAgIGxvZ192YWx1ZSAoRXZlbnQudmFsdWUgZXZlbnQpXG4gICAgICAgIHwgU29tZSBtIC0+XG4gICAgICAgICAgICBkaXNwYXRjaCBtXG5cbiAgICBsZXQgbWFrZV9saXN0IChkaXNwYXRjaDogJ20gLT4gdW5pdCkgKGxzdDogJ20gdCBsaXN0KTogRXZlbnQudCAtPiB1bml0ID1cbiAgICAgICAgZnVuIGV2ZW50IC0+XG4gICAgICAgIExpc3QuKGl0ZXJcbiAgICAgICAgICAgICAgICAgIChmdW4gdiAtPiBtYWtlX29uZSBkaXNwYXRjaCB2IGV2ZW50KVxuICAgICAgICAgICAgICAgICAgKHJldiBsc3QpKVxuXG4gICAgbGV0IG1hcCAoZjogJ2EgLT4gJ2IpICgoc3RvcCwgcHJldmVudCwgZGVjb2RlKTogJ2EgdCk6ICdiIHQgPVxuICAgICAgICBzdG9wLFxuICAgICAgICBwcmV2ZW50LFxuICAgICAgICBCYXNlLkRlY29kZS5tYXAgZiBkZWNvZGVcbmVuZFxuXG5cblxuXG5cblxuXG4oKiBTZXQgb2YgcmVhbCBoYW5kbGVycyBoYW5kbGluZyBqYXZhc2NyaXB0IGV2ZW50cyBmaXJlZCBvbiBldmVudCB0YXJnZXRzLiAqKVxubW9kdWxlIEV2ZW50SHMgPVxuc3RydWN0XG4gICAgbW9kdWxlIEFjdHVhbHMgPSBBY3R1YWxzIChTdHJpbmcpXG4gICAgbW9kdWxlIERpY3QgICAgPSBEaWN0aW9uYXJ5Lk1ha2UgKFN0cmluZylcblxuICAgIHR5cGUgdCA9IChFdmVudC50LCB1bml0KSBBY3R1YWxzLnRcblxuICAgIGxldCBlbXB0eSA9IEFjdHVhbHMuZW1wdHlcblxuICAgIGxldCBhZGQgdGFyZ2V0IGV2ZW50X3R5cGUgaGFuZGxlciA9XG4gICAgICAgIEV2ZW50X3RhcmdldC5hZGQgZXZlbnRfdHlwZSBoYW5kbGVyIHRhcmdldFxuXG4gICAgbGV0IHNldFxuICAgICAgICAgICAgKHRhcmdldDogICBFdmVudF90YXJnZXQudClcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgIChkaWN0OiAgICAgJ20gVmlydHVhbC50IGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogICAgICB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBBY3R1YWxzLnNldFxuICAgICAgICAgICAgKFZpcnR1YWwubWFrZV9saXN0IGRpc3BhdGNoKVxuICAgICAgICAgICAgKGFkZCB0YXJnZXQpXG4gICAgICAgICAgICBkaWN0XG4gICAgICAgICAgICBtYXBcblxuICAgIGxldCB1cGRhdGVcbiAgICAgICAgICAgICh0YXJnZXQ6ICAgRXZlbnRfdGFyZ2V0LnQpXG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAoZDE6ICAgICAgICdtIFZpcnR1YWwudCBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChkMjogICAgICAgJ20gVmlydHVhbC50IGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogICAgICB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBBY3R1YWxzLnVwZGF0ZVxuICAgICAgICAgICAgKFZpcnR1YWwubWFrZV9saXN0IGRpc3BhdGNoKVxuICAgICAgICAgICAgKGFkZCB0YXJnZXQpXG4gICAgICAgICAgICAoZnVuIGV2ZW50X3R5cGUgaGFuZGxlciBfIC0+XG4gICAgICAgICAgICAgICAgRXZlbnRfdGFyZ2V0LnJlbW92ZSBldmVudF90eXBlIGhhbmRsZXIgdGFyZ2V0KVxuICAgICAgICAgICAgZDFcbiAgICAgICAgICAgIGQyXG4gICAgICAgICAgICBtYXBcbmVuZFxuXG5cblxuXG5cblxuXG5tb2R1bGUgVGltZXJzID1cbnN0cnVjdFxuICAgIG1vZHVsZSBBY3R1YWxzID0gQWN0dWFscyAoSW50KVxuICAgIG1vZHVsZSBEaWN0ICAgID0gRGljdGlvbmFyeS5NYWtlIChJbnQpXG5cbiAgICB0eXBlIHQgPSAoVGltZS50LCBUaW1lci5pbnRlcnZhbCkgQWN0dWFscy50XG5cbiAgICBsZXQgZW1wdHkgPSBBY3R1YWxzLmVtcHR5XG5cbiAgICBsZXQgb2ZfbGlzdFxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKGxzdDogKFRpbWUudCAtPiAnbSkgbGlzdClcbiAgICAgICAgOiBUaW1lLnQgLT4gdW5pdFxuICAgICAgICA9XG4gICAgICAgIGZ1biB0aW1lIC0+XG4gICAgICAgIExpc3QuKGl0ZXIgKGZ1biBmIC0+IGRpc3BhdGNoIChmIHRpbWUpKSAocmV2IGxzdCkpXG5cbiAgICBsZXQgbWFrZV90aW1lciAobWlsbGlzOiBpbnQpIChoOiBUaW1lLnQgLT4gdW5pdCk6IFRpbWVyLmludGVydmFsID1cbiAgICAgICAgVGltZXIuc2V0X2ludGVydmFsXG4gICAgICAgICAgICAoZnVuICgpIC0+IGggKERhdGUubm93ICgpKSlcbiAgICAgICAgICAgIG1pbGxpc1xuXG4gICAgbGV0IHJlbW92ZV90aW1lclxuICAgICAgICAgICAgKF86IGludCkgKF86IFRpbWUudCAtPiB1bml0KSAodGltZXI6IFRpbWVyLmludGVydmFsKVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBUaW1lci5jbGVhcl9pbnRlcnZhbCB0aW1lclxuXG4gICAgbGV0IHNldFxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKGRpY3Q6IChUaW1lLnQgLT4gJ20pIGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgQWN0dWFscy5zZXRcbiAgICAgICAgICAgIChvZl9saXN0IGRpc3BhdGNoKVxuICAgICAgICAgICAgbWFrZV90aW1lclxuICAgICAgICAgICAgZGljdFxuICAgICAgICAgICAgbWFwXG5cblxuICAgIGxldCB1cGRhdGVcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgIChkMTogKFRpbWUudCAtPiAnbSkgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAoZDI6IChUaW1lLnQgLT4gJ20pIGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgQWN0dWFscy51cGRhdGVcbiAgICAgICAgICAgIChvZl9saXN0IGRpc3BhdGNoKVxuICAgICAgICAgICAgbWFrZV90aW1lclxuICAgICAgICAgICAgcmVtb3ZlX3RpbWVyXG4gICAgICAgICAgICBkMVxuICAgICAgICAgICAgZDJcbiAgICAgICAgICAgIG1hcFxuZW5kXG5cblxuXG5tb2R1bGUgVXJsX3JlcXVlc3QgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gRXZlbnQudCBBY3R1YWwudCBvcHRpb24gcmVmXG5cbiAgICBsZXQgZW1wdHkgKCk6IHQgPVxuICAgICAgICByZWYgTm9uZVxuXG5cbiAgICBsZXQgdGFyZ2V0ICgpOiBFdmVudF90YXJnZXQudCA9XG4gICAgICAgIERvbS5XaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSlcblxuICAgIGxldCBhZGQgKGg6IEV2ZW50LnQgLT4gdW5pdCk6IHVuaXQgPVxuICAgICAgICBFdmVudF90YXJnZXQuYWRkIFwiY2xpY2tcIiBoICh0YXJnZXQgKCkpXG5cbiAgICBsZXQgcmVtb3ZlIChoOiBFdmVudC50IC0+IHVuaXQpOiB1bml0ID1cbiAgICAgICAgRXZlbnRfdGFyZ2V0LnJlbW92ZSBcImNsaWNrXCIgaCAodGFyZ2V0ICgpKVxuXG5cbiAgICBsZXQgZGVjb2RlOiBVcmwudCBCYXNlLkRlY29kZS50ID1cbiAgICAgICAgbGV0IG9wZW4gQmFzZS5EZWNvZGUgaW5cbiAgICAgICAgbGV0KiB0YWcgID0gZmllbGQgXCJ0YXJnZXRcIiAoZmllbGQgXCJ0YWdOYW1lXCIgc3RyaW5nKSBpblxuICAgICAgICBsZXQqIGhyZWYgPSBmaWVsZCBcInRhcmdldFwiIChmaWVsZCBcImhyZWZcIiAgICBzdHJpbmcpIGluXG4gICAgICAgIG1hdGNoIFVybC5wYXJzZSBocmVmIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBmYWlsXG4gICAgICAgIHwgU29tZSB1cmwgLT5cbiAgICAgICAgICAgIGlmIHRhZyA8PiBcIkFcIiB8fCB0YWcgPD4gXCJhXCIgfHwgbm90IChVcmwuaXNfcGFnZSB1cmwpIHRoZW5cbiAgICAgICAgICAgICAgICBmYWlsXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVybFxuXG5cbiAgICBsZXQgbWFrZSAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpIChmOiBVcmwudCAtPiAnbSkgKGV2ZW50OiBFdmVudC50KTogdW5pdCA9XG4gICAgICAgIG1hdGNoIGRlY29kZSAoRXZlbnQudmFsdWUgZXZlbnQpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAoKVxuICAgICAgICB8IFNvbWUgdXJsIC0+XG4gICAgICAgICAgICBFdmVudC5wcmV2ZW50X2RlZmF1bHQgZXZlbnQ7XG4gICAgICAgICAgICBkaXNwYXRjaCAoZiB1cmwpXG5cblxuICAgIGxldCBzZXRcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgICh2aXJ0OiAoVXJsLnQgLT4gJ20pIG9wdGlvbilcbiAgICAgICAgICAgIChyZXE6IHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIG1hdGNoIHZpcnQgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHJlcSA6PSBOb25lXG4gICAgICAgIHwgU29tZSBmIC0+XG4gICAgICAgICAgICBsZXQgYWN0dWFsID0gQWN0dWFsLm1ha2UgKG1ha2UgZGlzcGF0Y2ggZikgaW5cbiAgICAgICAgICAgIGFkZCAoQWN0dWFsLmZpcmUgYWN0dWFsKTtcbiAgICAgICAgICAgIHJlcSA6PSBTb21lIGFjdHVhbFxuXG5cbiAgICBsZXQgdXBkYXRlXG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAodmlydDE6IChVcmwudCAtPiAnbSkgb3B0aW9uKVxuICAgICAgICAgICAgKHZpcnQyOiAoVXJsLnQgLT4gJ20pIG9wdGlvbilcbiAgICAgICAgICAgIChyZXE6IHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIG1hdGNoIHZpcnQxLCB2aXJ0MiwgIXJlcSB3aXRoXG4gICAgICAgIHwgTm9uZSwgTm9uZSwgTm9uZSAtPlxuICAgICAgICAgICAgKClcblxuICAgICAgICB8IFNvbWUgZjEsIE5vbmUsIE5vbmUgLT5cbiAgICAgICAgICAgICgqIFtmMV0gaXMgbmV3IGhhbmRsZXIsIG5vdCB5ZXQgYSBjdXJyZW50IGhhbmRsZXIgKilcbiAgICAgICAgICAgIGxldCBhY3R1YWwgPSBBY3R1YWwubWFrZSAobWFrZSBkaXNwYXRjaCBmMSkgaW5cbiAgICAgICAgICAgIGFkZCAoQWN0dWFsLmZpcmUgYWN0dWFsKTtcbiAgICAgICAgICAgIHJlcSA6PSBTb21lIGFjdHVhbFxuXG4gICAgICAgIHwgU29tZSBmMSwgU29tZSBfLCBTb21lIGFjdHVhbCAtPlxuICAgICAgICAgICAgKCogW2YxXSBpcyBoYW5kbGVyIHdoaWNoIGhhcyB0byB1cGRhdGUgdGhlIGN1cnJlbnQgaGFuZGxlci4gKilcbiAgICAgICAgICAgIGxldCBoYW5kbGVyID0gbWFrZSBkaXNwYXRjaCBmMSBpblxuICAgICAgICAgICAgQWN0dWFsLnVwZGF0ZSBoYW5kbGVyIGFjdHVhbFxuXG4gICAgICAgIHwgTm9uZSwgU29tZSBfLCBTb21lIGFjdHVhbCAtPlxuICAgICAgICAgICAgKCogTm8gbmV3IGhhbmRsZXIsIGN1cnJlbnQgaGFuZGxlciBoYXMgdG8gYmUgcmVtb3ZlZC4gKilcbiAgICAgICAgICAgIHJlbW92ZSAoQWN0dWFsLmZpcmUgYWN0dWFsKVxuXG4gICAgICAgIHwgXywgTm9uZSwgU29tZSBfIHwgXywgU29tZSBfLCBOb25lIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsLCBbdmlydDJdIGFuZCBbIXJlcV0gYXJlIGVpdGhlciBib3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgb3IgYm90aCBwcmVzZW50LiAqKVxuZW5kXG5cblxuXG5cblxuXG5cbigqXG4gICAgTm90ZSBbRnVuY3Rpb25zIHdpdGggcmVmZXJlbmNlc11cbiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuXG4gICAgVGhlIGNvZGUgaGFzIGJlZW4gdW5pdCB0ZXN0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHRlc3QgY2FzZS5cblxuICAgIHR5cGUgdCA9IHtcbiAgICAgICAgcmVmOiAodW5pdCAtPiBpbnQpIHJlZjtcbiAgICAgICAgYmFzZTogdW5pdCAtPiBpbnQ7XG4gICAgfVxuXG4gICAgbGV0IGYxICgpOiBpbnQgPSAxXG4gICAgbGV0IGYyICgpOiBpbnQgPSAyXG5cbiAgICBsZXQgbWFrZSAoZjogdW5pdCAtPiBpbnQpOiB0ID1cbiAgICAgICAgbGV0IHJlZiA9IHJlZiBmIGluXG4gICAgICAgIGxldCBnIHJlZiA9XG4gICAgICAgICAgICBmdW4gKCkgLT4gKCEgcmVmKSAoKVxuICAgICAgICBpblxuICAgICAgICB7XG4gICAgICAgICAgICByZWY7XG4gICAgICAgICAgICBiYXNlID0gZyByZWY7XG4gICAgICAgIH1cblxuICAgIGxldCB1cGRhdGUgKGY6IHVuaXQgLT4gaW50KSAoaDogdCk6IHVuaXQgPVxuICAgICAgICBoLnJlZiA6PSBmXG5cbiAgICBsZXQldGVzdCBfID1cbiAgICAgICAgbGV0IGggPSBtYWtlIGYxIGluXG4gICAgICAgIGguYmFzZSAoKSA9IDFcblxuXG4gICAgbGV0JXRlc3QgXyA9XG4gICAgICAgIGxldCBoID0gbWFrZSBmMSBpblxuICAgICAgICB1cGRhdGUgZjIgaDtcbiAgICAgICAgUHJpbnRmLnByaW50ZiBcImguYmFzZSAoKSA9ICVkXFxuXCIgKGguYmFzZSAoKSk7XG4gICAgICAgIGguYmFzZSAoKSA9IDJcbiAgICAqKVxuIiwib3BlbiBGbWxpYl9qcy5CYXNlXG5cbnR5cGUgJ21zZyBoYW5kbGVyID0gJ21zZyBIYW5kbGVyLlZpcnR1YWwudFxuXG50eXBlICdtc2cgdCA9XG4gICAgfCBTdHlsZSBvZiBzdHJpbmcgKiBzdHJpbmdcbiAgICB8IFByb3BlcnR5IG9mIHN0cmluZyAqIFZhbHVlLnRcbiAgICB8IEF0dHJpYnV0ZSBvZiBzdHJpbmcgKiBzdHJpbmdcbiAgICB8IEhhbmRsZXIgb2Ygc3RyaW5nICogJ21zZyBoYW5kbGVyXG5cblxubGV0IHN0eWxlIChrZXk6IHN0cmluZykgKHZhbHVlOiBzdHJpbmcpOiAnYSB0ID1cbiAgICBTdHlsZSAoa2V5LCB2YWx1ZSlcblxubGV0IHByb3BlcnR5IChrZXk6IHN0cmluZykgKHZhbHVlOiBWYWx1ZS50KTogJ2EgdCA9XG4gICAgUHJvcGVydHkgKGtleSwgdmFsdWUpXG5cbmxldCBhdHRyaWJ1dGUgKGtleTogc3RyaW5nKSAodmFsdWU6IHN0cmluZyk6ICdhIHQgPVxuICAgIEF0dHJpYnV0ZSAoa2V5LCB2YWx1ZSlcblxubGV0IGhhbmRsZXJcbiAgICAgICAgKGtleTogc3RyaW5nKVxuICAgICAgICAoc3RvcDogRXZlbnRfZmxhZy5zdG9wKVxuICAgICAgICAocHJldmVudDogRXZlbnRfZmxhZy5wcmV2ZW50KVxuICAgICAgICAoZGVjb2RlOiAnbXNnIERlY29kZS50KVxuICAgIDogJ2EgdFxuICAgID1cbiAgICBIYW5kbGVyIChrZXksIChzdG9wLCBwcmV2ZW50LCBkZWNvZGUpKVxuIiwib3BlbiBGbWxpYl9qcy5CYXNlXG5cbm1vZHVsZSBEaWN0aW9uYXJ5ID0gRGljdGlvbmFyeS5NYWtlIChTdHJpbmcpXG5cbnR5cGUgJ21zZyBoYW5kbGVycyA9ICdtc2cgSGFuZGxlci5WaXJ0dWFsLnQgbGlzdCBEaWN0aW9uYXJ5LnRcblxubW9kdWxlIEF0dHJpYnV0ZXMgPVxuc3RydWN0XG4gICAgdHlwZSAnbXNnIHQgPSB7XG4gICAgICAgIHN0eWxlczogICBzdHJpbmcgRGljdGlvbmFyeS50O1xuICAgICAgICBwcm9wczogICAgVmFsdWUudCBEaWN0aW9uYXJ5LnQ7XG4gICAgICAgIGF0dHJzOiAgICBzdHJpbmcgIERpY3Rpb25hcnkudDtcbiAgICAgICAgaGFuZGxlcnM6ICdtc2cgaGFuZGxlcnNcbiAgICB9XG5cbiAgICBsZXQgb2ZfbGlzdCAobHN0OiAnbXNnIEF0dHJpYnV0ZS50IGxpc3QpOiAnbXNnIHQgPVxuICAgICAgICBsZXQgb3BlbiBBdHRyaWJ1dGUgaW5cbiAgICAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gYXR0cnMgLT4gZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgfCBTdHlsZSAobmFtZSwgdmFsdWUpIC0+XG4gICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcyA9IERpY3Rpb25hcnkuYWRkIG5hbWUgdmFsdWUgYXR0cnMuc3R5bGVzXG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHwgUHJvcGVydHkgKG5hbWUsIHZhbHVlKSAtPlxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyA9IERpY3Rpb25hcnkuYWRkIG5hbWUgdmFsdWUgYXR0cnMucHJvcHNcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfCBBdHRyaWJ1dGUgKG5hbWUsIHZhbHVlKSAtPlxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyA9IERpY3Rpb25hcnkuYWRkIG5hbWUgdmFsdWUgYXR0cnMuYXR0cnNcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfCBIYW5kbGVyIChuYW1lLCBoYW5kbGVyKSAtPlxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkuc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gW2hhbmRsZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIGxzdCAtPiBoYW5kbGVyIDo6IGxzdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmhhbmRsZXJzXG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3R5bGVzICAgPSBEaWN0aW9uYXJ5LmVtcHR5O1xuICAgICAgICAgICAgICAgIHByb3BzICAgID0gRGljdGlvbmFyeS5lbXB0eTtcbiAgICAgICAgICAgICAgICBhdHRycyAgICA9IERpY3Rpb25hcnkuZW1wdHk7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBEaWN0aW9uYXJ5LmVtcHR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbHN0XG5lbmRcblxuXG5cblxuXG5cblxuXG5cblxudHlwZSAoJ21zZywgJ2VsKSB0MCA9XG4gICAgKCogUHVyZSB2aXJ0dWFsIGRvbSBlbGVtZW50IHdoZXJlIGFsbCBjaGlsZHJlbiBjb25zaXN0IG9mIHBhaXJzIG9mIGEgdmlydHVhbFxuICAgICAgIGRvbSBhbmQgcmVhbCBkb20gbm9kZS5cbiAgICAgKilcbiAgICB8IFRleHQgb2Ygc3RyaW5nXG4gICAgfCBOb2RlIG9mIHN0cmluZyAgKiAnbXNnIEF0dHJpYnV0ZXMudCAqICgnbXNnLCAnZWwpIHQxIGxpc3RcbiAgICB8IE5vZGVfbnMgb2Ygc3RyaW5nICAqIHN0cmluZyAqICdtc2cgQXR0cmlidXRlcy50ICogKCdtc2csICdlbCkgdDEgbGlzdFxuICAgIHwgS2V5ZWQgb2Ygc3RyaW5nICogJ21zZyBBdHRyaWJ1dGVzLnQgKiAoJ21zZywgJ2VsKSB0MSBEaWN0aW9uYXJ5LnRcblxuXG5hbmQgKCdtc2csICdlbCkgdDEgPVxuICAgICgqIFBhaXIgb2YgYSB2aXJ0dWFsIGRvbSBhbmQgYSBjb3JyZXNwb25kaW5nIHJlYWwgZG9tICopXG4gICAgKCdtc2csICdlbCkgdDAgKiAnZWxcblxuXG5cbnR5cGUgJ21zZyB0ID1cbiAgICAoKiBQdXJlIHZpcnR1YWwgZG9tIHdpdGhvdXQgYW55IHJlYWwgZG9tIGF0dGFjaGVkIHRvIGl0LiAqKVxuICAgICgnbXNnLCB1bml0KSB0MVxuXG5cblxuXG4oKiBDcmVhdGUgcHVyZSB2aXJ0dWFsIGRvbSBlbGVtZW50cyAqKVxuXG5sZXQgdGV4dCAoczogc3RyaW5nKTogJ21zZyB0ID1cbiAgICBUZXh0IHMsICgpXG5cblxubGV0IG5vZGVcbiAgICAgICAgKHRhZzogc3RyaW5nKVxuICAgICAgICAoYXR0cnM6ICdtc2cgQXR0cmlidXRlLnQgbGlzdClcbiAgICAgICAgKGxzdDogJ21zZyB0IGxpc3QpXG4gICAgOiAnbXNnIHRcbiAgICA9XG4gICAgTm9kZSAodGFnLCBBdHRyaWJ1dGVzLm9mX2xpc3QgYXR0cnMsIGxzdCksICgpXG5cblxubGV0IG5vZGVfbnNcbiAgICAgICAgKG5hbWVzcGFjZTogc3RyaW5nKVxuICAgICAgICAodGFnOiBzdHJpbmcpXG4gICAgICAgIChhdHRyczogJ21zZyBBdHRyaWJ1dGUudCBsaXN0KVxuICAgICAgICAobHN0OiAnbXNnIHQgbGlzdClcbiAgICA6ICdtc2cgdFxuICAgID1cbiAgICBOb2RlX25zIChuYW1lc3BhY2UsIHRhZywgQXR0cmlidXRlcy5vZl9saXN0IGF0dHJzLCBsc3QpLCAoKVxuXG5cblxubGV0IGtleWVkXG4gICAgICAgICh0YWc6IHN0cmluZylcbiAgICAgICAgKGF0dHJzOiAnbXNnIEF0dHJpYnV0ZS50IGxpc3QpXG4gICAgICAgIChsc3Q6IChzdHJpbmcgKiAnbXNnIHQpIGxpc3QpXG4gICAgOiAnbXNnIHRcbiAgICA9XG4gICAgS2V5ZWQgKHRhZywgQXR0cmlidXRlcy5vZl9saXN0IGF0dHJzLCBEaWN0aW9uYXJ5Lm9mX2xpc3QgbHN0KSwgKClcblxuXG5cblxuKCpcbiAgICBNYWtlIGFuZCB1cGRhdGUgcmVhbCBkb20gZnJvbSBhIHZpcnR1YWwgZG9tXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuKilcblxuXG5sZXQgZWxlbWVudDogKCdtc2csICdlbCkgdDEgLT4gJ2VsID1cbiAgICBzbmRcblxuXG50eXBlICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMgPSB7XG4gICAgbWFrZV90ZXh0OiAgICAgc3RyaW5nIC0+ICdlbDtcbiAgICBtYWtlX2VsZW1lbnQ6ICBzdHJpbmcgLT4gJ2VsIGxpc3QgLT4gJ2VsO1xuICAgIG1ha2VfZWxlbWVudF9uczogIHN0cmluZyAtPiBzdHJpbmcgLT4gJ2VsIGxpc3QgLT4gJ2VsO1xuXG4gICAgYWRkX2NoaWxkOiAgICAgJ2VsIC0+ICdlbCAtPiB1bml0O1xuICAgIHJlbW92ZV9jaGlsZDogICdlbCAtPiAnZWwgLT4gdW5pdDtcbiAgICByZXBsYWNlX2NoaWxkOiAnZWwgLT4gJ2VsIC0+ICdlbCAtPiB1bml0O1xuICAgIHJlbW92ZV9jaGlsZHJlbjogJ2VsIC0+IHVuaXQ7XG5cbiAgICBzZXRfdGV4dDogJ2VsIC0+IHN0cmluZyAtPiB1bml0O1xuXG4gICAgc2V0X3N0eWxlOiAgICAgJ2VsIC0+IHN0cmluZyAtPiBzdHJpbmcgLT4gdW5pdDtcbiAgICBzZXRfYXR0cmlidXRlOiAnZWwgLT4gc3RyaW5nIC0+IHN0cmluZyAtPiB1bml0O1xuICAgIHNldF9wcm9wZXJ0eTogICdlbCAtPiBzdHJpbmcgLT4gVmFsdWUudCAtPiB1bml0O1xuXG4gICAgcmVtb3ZlX3N0eWxlOiAgICAgJ2VsIC0+IHN0cmluZyAtPiB1bml0O1xuICAgIHJlbW92ZV9hdHRyaWJ1dGU6ICdlbCAtPiBzdHJpbmcgLT4gdW5pdDtcbiAgICByZW1vdmVfcHJvcGVydHk6ICAnZWwgLT4gc3RyaW5nIC0+IHVuaXQ7XG5cbiAgICBzZXRfaGFuZGxlcnM6ICAnZWwgLT4gJ21zZyBoYW5kbGVycyAtPiB1bml0O1xuICAgIHVwZGF0ZV9oYW5kbGVyczogICdlbCAtPiAnbXNnIGhhbmRsZXJzIC0+ICdtc2cgaGFuZGxlcnMgLT4gdW5pdDtcbn1cblxuXG5sZXQgYWRkX2F0dHJpYnV0ZXNcbiAgICAgICAgKG9wczogKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKGF0dHJzOiAnbXNnIEF0dHJpYnV0ZXMudClcbiAgICAgICAgKGVsOiAnZWwpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIERpY3Rpb25hcnkuKFxuICAgICAgICBpdGVyIChvcHMuc2V0X3N0eWxlIGVsKSAgICAgYXR0cnMuc3R5bGVzO1xuICAgICAgICBpdGVyIChvcHMuc2V0X2F0dHJpYnV0ZSBlbCkgYXR0cnMuYXR0cnM7XG4gICAgICAgIGl0ZXIgKG9wcy5zZXRfcHJvcGVydHkgZWwpICBhdHRycy5wcm9wcyk7XG4gICAgb3BzLnNldF9oYW5kbGVycyBlbCBhdHRycy5oYW5kbGVyc1xuXG5cblxuXG5sZXQgbWFrZVxuICAgICAgICAob3BzOiAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAodmRvbTogJ21zZyB0KVxuICAgIDogKCdtc2csICdlbCkgdDFcbiAgICA9XG4gICAgbGV0IHJlYyBtYWtlIHZkb20gPVxuICAgICAgICBtYXRjaCB2ZG9tIHdpdGhcbiAgICAgICAgfCBUZXh0IHMsICgpIC0+XG4gICAgICAgICAgICBUZXh0IHMsIG9wcy5tYWtlX3RleHQgc1xuXG4gICAgICAgIHwgTm9kZSAodGFnLCBhdHRycywgbHN0KSwgKCkgLT5cbiAgICAgICAgICAgIGxldCBjb21iaW5lZF9jaGlsZHJlbiwgcmVhbF9jaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgbWFrZV9jaGlsZHJlbiBsc3RcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gb3BzLm1ha2VfZWxlbWVudCB0YWcgcmVhbF9jaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGFkZF9hdHRyaWJ1dGVzIG9wcyBhdHRycyBwYXJlbnQ7XG4gICAgICAgICAgICBOb2RlICh0YWcsIGF0dHJzLCBjb21iaW5lZF9jaGlsZHJlbiksIHBhcmVudFxuXG4gICAgICAgIHwgTm9kZV9ucyAobmFtZXNwYWNlLCB0YWcsIGF0dHJzLCBsc3QpLCAoKSAtPlxuICAgICAgICAgICAgbGV0IGNvbWJpbmVkX2NoaWxkcmVuLCByZWFsX2NoaWxkcmVuID1cbiAgICAgICAgICAgICAgICBtYWtlX2NoaWxkcmVuIGxzdFxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBvcHMubWFrZV9lbGVtZW50X25zIG5hbWVzcGFjZSB0YWcgcmVhbF9jaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGFkZF9hdHRyaWJ1dGVzIG9wcyBhdHRycyBwYXJlbnQ7XG4gICAgICAgICAgICBOb2RlX25zIChuYW1lc3BhY2UsIHRhZywgYXR0cnMsIGNvbWJpbmVkX2NoaWxkcmVuKSwgcGFyZW50XG5cbiAgICAgICAgfCBLZXllZCAodGFnLCBhdHRycywgXyksICgpIC0+XG4gICAgICAgICAgICBsZXQgY29tYmluZWRfY2hpbGRyZW4sIHJlYWxfY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZVxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBvcHMubWFrZV9lbGVtZW50IHRhZyByZWFsX2NoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgYWRkX2F0dHJpYnV0ZXMgb3BzIGF0dHJzIHBhcmVudDtcbiAgICAgICAgICAgIEtleWVkICh0YWcsIGF0dHJzLCBjb21iaW5lZF9jaGlsZHJlbiksIHBhcmVudFxuXG5cbiAgICBhbmQgbWFrZV9jaGlsZHJlbiAobHN0OiAnbXNnIHQgbGlzdCk6ICgnbXNnLCAnZWwpIHQxIGxpc3QgKiAnZWwgbGlzdCA9XG4gICAgICAgIG1hdGNoIGxzdCB3aXRoXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgIFtdLCBbXVxuICAgICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgICAgICBsZXQgXywgaGQyIGFzIGhkID0gbWFrZSBoZFxuICAgICAgICAgICAgYW5kIHRsMSwgdGwyID0gbWFrZV9jaGlsZHJlbiB0bCBpblxuICAgICAgICAgICAgaGQgOjogdGwxLCBoZDIgOjogdGwyXG4gICAgaW5cbiAgICBtYWtlIHZkb21cblxuXG5cblxubGV0IHVwZGF0ZV9hdHRyaWJ1dGVzXG4gICAgICAgIChvcHM6ICAgICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgIChwYXI6ICAgICdlbClcbiAgICAgICAgKGF0dHJzMTogJ21zZyBBdHRyaWJ1dGVzLnQpXG4gICAgICAgIChhdHRyczI6ICdtc2cgQXR0cmlidXRlcy50KVxuICAgIDogdW5pdFxuICAgID1cbiAgICBsZXQgb3BlbiBEaWN0aW9uYXJ5IGluXG4gICAgbGV0IHNldCA9IG9wcy5zZXRfc3R5bGUgcGFyIGluXG4gICAgZGlmZlxuICAgICAgICBzZXQgc2V0IChvcHMucmVtb3ZlX3N0eWxlIHBhcilcbiAgICAgICAgYXR0cnMxLnN0eWxlcyBhdHRyczIuc3R5bGVzO1xuXG4gICAgbGV0IHNldCA9IG9wcy5zZXRfYXR0cmlidXRlIHBhciBpblxuICAgIGRpZmZcbiAgICAgICAgc2V0IHNldCAob3BzLnJlbW92ZV9hdHRyaWJ1dGUgcGFyKVxuICAgICAgICBhdHRyczEuYXR0cnMgYXR0cnMyLmF0dHJzO1xuXG4gICAgbGV0IHNldCA9IG9wcy5zZXRfcHJvcGVydHkgcGFyIGluXG4gICAgZGlmZlxuICAgICAgICBzZXQgc2V0IChvcHMucmVtb3ZlX3Byb3BlcnR5IHBhcilcbiAgICAgICAgYXR0cnMxLnByb3BzIGF0dHJzMi5wcm9wcztcblxuICAgIG9wcy51cGRhdGVfaGFuZGxlcnMgcGFyIGF0dHJzMS5oYW5kbGVycyBhdHRyczIuaGFuZGxlcnNcblxuXG5cbmxldCByZWMgdXBkYXRlXG4gICAgICAgIChvcHM6ICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgICh2ZG9tOiAnbXNnIHQpXG4gICAgICAgIChkb206ICgnbXNnLCAnZWwpIHQxKVxuICAgIDogKCdtc2csICdlbCkgdDEgKiBib29sXG4gICAgPVxuICAgIG1hdGNoIHZkb20sIGRvbSB3aXRoXG4gICAgfCAoVGV4dCBzMSwgKCkpLCAoVGV4dCBzMiwgZWwpIC0+XG5cbiAgICAgICAgaWYgczEgPSBzMiB0aGVuXG4gICAgICAgICAgICBkb20sIGZhbHNlXG4gICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgIG9wcy5zZXRfdGV4dCBlbCBzMTtcbiAgICAgICAgICAgIChUZXh0IHMxLCBlbCksIGZhbHNlXG4gICAgICAgIGVuZFxuXG4gICAgfCAoTm9kZSAodGFnMSwgYXR0cnMxLCBsc3QxKSwgKCkpLFxuICAgICAgKE5vZGUgKHRhZzIsIGF0dHJzMiwgbHN0MiksIHBhcikgd2hlbiB0YWcxID0gdGFnMiAtPlxuXG4gICAgICAgIHVwZGF0ZV9hdHRyaWJ1dGVzIG9wcyBwYXIgYXR0cnMxIGF0dHJzMjtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gTGlzdC5yZXYgKHVwZGF0ZV9jaGlsZHJlbiBvcHMgcGFyIGxzdDEgbHN0MiBbXSlcbiAgICAgICAgaW5cbiAgICAgICAgKE5vZGUgKHRhZzIsIGF0dHJzMSwgY2hpbGRyZW4pLCBwYXIpLCBmYWxzZVxuXG4gICAgfCAoTm9kZV9ucyAobnMxLCB0YWcxLCBhdHRyczEsIGxzdDEpLCAoKSksXG4gICAgICAoTm9kZV9ucyAobnMyLCB0YWcyLCBhdHRyczIsIGxzdDIpLCBwYXIpIHdoZW4gdGFnMSA9IHRhZzIgJiYgbnMxID0gbnMyIC0+XG5cbiAgICAgICAgdXBkYXRlX2F0dHJpYnV0ZXMgb3BzIHBhciBhdHRyczEgYXR0cnMyO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBMaXN0LnJldiAodXBkYXRlX2NoaWxkcmVuIG9wcyBwYXIgbHN0MSBsc3QyIFtdKVxuICAgICAgICBpblxuICAgICAgICAoTm9kZV9ucyAobnMyLCB0YWcyLCBhdHRyczEsIGNoaWxkcmVuKSwgcGFyKSwgZmFsc2VcblxuICAgIHwgKEtleWVkICh0YWcxLCBhdHRyczEsIGQxKSwgKCkpLFxuICAgICAgKEtleWVkICh0YWcyLCBhdHRyczIsIGQyKSwgcGFyKSB3aGVuIHRhZzEgPSB0YWcyIC0+XG5cbiAgICAgICAgdXBkYXRlX2F0dHJpYnV0ZXMgb3BzIHBhciBhdHRyczEgYXR0cnMyO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSB1cGRhdGVfa2V5ZWQgb3BzIHBhciBkMSBkMlxuICAgICAgICBpblxuICAgICAgICAoS2V5ZWQgKHRhZzIsIGF0dHJzMSwgY2hpbGRyZW4pLCBwYXIpLCBmYWxzZVxuXG4gICAgfCBfLCBfIC0+XG5cbiAgICAgICAgbWFrZSBvcHMgdmRvbSwgdHJ1ZVxuXG5cbmFuZCB1cGRhdGVfa2V5ZWRcbiAgICAgICAgKG9wczogKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKHBhcjogJ2VsKVxuICAgICAgICAoZDE6ICdtc2cgdCBEaWN0aW9uYXJ5LnQpXG4gICAgICAgIChkMjogKCdtc2csICdlbCkgdDEgRGljdGlvbmFyeS50KVxuICAgIDogKCdtc2csICdlbCkgdDEgRGljdGlvbmFyeS50XG4gICAgPVxuICAgIG9wcy5yZW1vdmVfY2hpbGRyZW4gcGFyO1xuICAgIGxldCBkID0gcmVmIERpY3Rpb25hcnkuZW1wdHlcbiAgICBpblxuICAgIERpY3Rpb25hcnkuaXRlclxuICAgICAgICAoZnVuIGtleSB2ZG9tIC0+XG4gICAgICAgICAgICAgbWF0Y2ggRGljdGlvbmFyeS5maW5kX29wdCBrZXkgZDIgd2l0aFxuICAgICAgICAgICAgIHwgTm9uZSAtPlxuXG4gICAgICAgICAgICAgICAgIGxldCAoXywgZWwpIGFzIGRvbSA9IG1ha2Ugb3BzIHZkb20gaW5cbiAgICAgICAgICAgICAgICAgb3BzLmFkZF9jaGlsZCBlbCBwYXI7XG4gICAgICAgICAgICAgICAgIGQgOj0gRGljdGlvbmFyeS5hZGQga2V5IGRvbSAhZDtcblxuICAgICAgICAgICAgIHwgU29tZSBkb20gLT5cblxuICAgICAgICAgICAgICAgICBsZXQgKChfLCBlbCkgYXMgZG9tKSwgXyA9IHVwZGF0ZSBvcHMgdmRvbSBkb20gaW5cbiAgICAgICAgICAgICAgICAgb3BzLmFkZF9jaGlsZCBlbCBwYXI7XG4gICAgICAgICAgICAgICAgIGQgOj0gRGljdGlvbmFyeS5hZGQga2V5IGRvbSAhZDtcbiAgICAgICAgKVxuICAgICAgICBkMTtcbiAgICAhZFxuXG5cblxuYW5kIHVwZGF0ZV9jaGlsZHJlblxuICAgICAgICAob3BzOiAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAocGFyOiAnZWwpXG4gICAgICAgIChsc3QxOiAnbXNnIHQgbGlzdClcbiAgICAgICAgKGxzdDI6ICgnbXNnLCAnZWwpIHQxIGxpc3QpXG4gICAgICAgIChubHN0MjogKCdtc2csICdlbCkgdDEgbGlzdClcbiAgICA6ICgnbXNnLCAnZWwpIHQxIGxpc3RcbiAgICA9XG4gICAgbWF0Y2ggbHN0MSwgbHN0MiB3aXRoXG4gICAgfCBbXSwgW10gLT5cbiAgICAgICAgbmxzdDJcblxuICAgIHwgW10sIChfLCBoZCkgOjogdGwgLT5cbiAgICAgICAgKCogT2xkIGRvbSBoYXMgdG9vIG1hbnkgY2hpbGRyZW4gKilcbiAgICAgICAgb3BzLnJlbW92ZV9jaGlsZCBoZCBwYXI7XG4gICAgICAgIHVwZGF0ZV9jaGlsZHJlbiBvcHMgcGFyIFtdIHRsIG5sc3QyXG5cbiAgICB8IGhkMSA6OiB0bDEsIFtdIC0+XG4gICAgICAgICgqIE5ldyB2ZG9tIGhhcyBtb3JlIGNoaWxkcmVuIHRoYW4gdGhlIG9sZCBkb20gKilcbiAgICAgICAgbGV0IChfLCBoZDExKSBhcyBoZDEgPSBtYWtlIG9wcyBoZDEgaW5cbiAgICAgICAgb3BzLmFkZF9jaGlsZCBoZDExIHBhcjtcbiAgICAgICAgdXBkYXRlX2NoaWxkcmVuIG9wcyBwYXIgdGwxIFtdIChoZDEgOjogbmxzdDIpXG5cbiAgICB8IGhkMSA6OiB0bDEsICAgKChfLCBvbGRfZWwpIGFzIGhkMikgOjogdGwyIC0+XG4gICAgICAgIGxldCAoXywgbmV3X2VsKSBhcyBoZDIgLCBjcmVhdGVkID0gdXBkYXRlIG9wcyBoZDEgaGQyIGluXG4gICAgICAgIGlmIGNyZWF0ZWQgdGhlblxuICAgICAgICAgICAgb3BzLnJlcGxhY2VfY2hpbGQgb2xkX2VsIG5ld19lbCBwYXI7XG4gICAgICAgIHVwZGF0ZV9jaGlsZHJlbiBvcHMgcGFyIHRsMSB0bDIgKGhkMiA6OiBubHN0MilcbiIsIm9wZW4gRm1saWJfanMuQmFzZS5NYWluXG5cbmxldCBhdHRlbXB0IChzdHI6IHN0cmluZykgKGY6IHVuaXQgLT4gJ2EpIChjbGVhbnVwOiB1bml0IC0+IHVuaXQpOiAnYSA9XG4gICAgdHJ5XG4gICAgICAgIGYgKClcbiAgICB3aXRoXG4gICAgfCBBc3NlcnRfZmFpbHVyZSAoZmlsZSwgbGluZSwgY29sKSAtPlxuICAgICAgICBsZXQgbXNnID1cbiAgICAgICAgICAgIFN0cmluZy5jb25jYXRcbiAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgW1wiYXNzZXJ0aW9uIGZhaWxlZCBmaWxlOiBcIlxuICAgICAgICAgICAgICAgIDsgZmlsZVxuICAgICAgICAgICAgICAgIDsgXCIgbGluZTogXCI7IHN0cmluZ19vZl9pbnQgbGluZVxuICAgICAgICAgICAgICAgIDsgXCIgY29sOiBcIjsgICBzdHJpbmdfb2ZfaW50IGNvbFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgaW5cbiAgICAgICAgY2xlYW51cCAoKTtcbiAgICAgICAgbG9nX3N0cmluZyBzdHI7XG4gICAgICAgIGxvZ19zdHJpbmcgbXNnO1xuICAgICAgICByYWlzZV9qcyBzdHJcblxuICAgIHwgZXhuIC0+XG4gICAgICAgIGNsZWFudXAgKCk7XG4gICAgICAgIGxvZ19zdHJpbmcgc3RyO1xuICAgICAgICBtYXRjaCBvZl9leGNlcHRpb24gZXhuIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBsb2dfc3RyaW5nIFwiVW5jYXVnaHQgb2NhbWwgZXhjZXB0aW9uXCI7XG4gICAgICAgICAgICByYWlzZSBleG5cbiAgICAgICAgfCBTb21lIGpzX2Vycm9yIC0+XG4gICAgICAgICAgICBsb2dfc3RyaW5nIFwiVW5jYXVnaHQgamF2YXNjcmlwdCBleGNlcHRpb25cIjtcbiAgICAgICAgICAgIHJhaXNlX2pzX2Vycm9yIGpzX2Vycm9yXG4iLCJtb2R1bGUgUiA9IFN0ZGxpYi5SYW5kb21cblxudHlwZSAnYSB0ID0gUi5TdGF0ZS50IC0+ICdhXG5cblxubGV0IHJ1biAocmFuZG9tOiAnYSB0KTogJ2EgPVxuICAgIHJhbmRvbSAoUi5TdGF0ZS5tYWtlX3NlbGZfaW5pdCAoKSlcblxuXG5sZXQgY29uc3RhbnQgKGE6ICdhKTogJ2EgdCA9XG4gICAgZnVuIF8gLT4gYVxuXG5sZXQgKD4+PSkgKG06ICdhIHQpIChmOiAnYSAtPiAnYiB0KTogJ2IgdCA9XG4gICAgZnVuIHN0YXRlIC0+IGYgKG0gc3RhdGUpIHN0YXRlICgqIHN0YXRlIGlzIG11dGFibGUuICopXG5cbmxldCAoIGxldCogKSA9ICg+Pj0pXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChtOiAnYSB0KTogJ2IgdCA9XG4gICAgbGV0KiBhID0gbSBpblxuICAgIGNvbnN0YW50IChmIGEpXG5cblxubGV0IGludCAoYm91bmQ6IGludCk6IGludCB0ID1cbiAgICBmdW4gc3RhdGUgLT5cbiAgICBhc3NlcnQgKDAgPCBib3VuZCk7XG4gICAgUi5TdGF0ZS5pbnQgc3RhdGUgYm91bmRcblxuXG5sZXQgZmxvYXQgKGJvdW5kOiBmbG9hdCk6IGZsb2F0IHQgPVxuICAgIGZ1biBzdGF0ZSAtPlxuICAgIGFzc2VydCAoMC4wIDw9IGJvdW5kKTtcbiAgICBSLlN0YXRlLmZsb2F0IHN0YXRlIGJvdW5kXG5cblxubGV0IGJvb2w6IGJvb2wgdCA9XG4gICAgUi5TdGF0ZS5ib29sXG5cblxubGV0IGNob29zZSAobHN0OiAnYSBsaXN0KTogJ2EgdCA9XG4gICAgbGV0IGFyciA9IEFycmF5Lm9mX2xpc3QgbHN0IGluXG4gICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBhcnIgaW5cbiAgICBsZXQqIGkgPSBpbnQgbGVuIGluXG4gICAgYXNzZXJ0IChpIDwgbGVuKTtcbiAgICBjb25zdGFudCBhcnIuKGkpXG4iLCJvcGVuIEZtbGliX2pzXG5cblxudHlwZSBlbXB0eSA9IFtdXG5cbnR5cGUgaHR0cF9lcnJvciA9IFtgSHR0cF9zdGF0dXMgb2YgaW50IHwgYEh0dHBfbm9fanNvbiB8IGBIdHRwX2RlY29kZV1cblxudHlwZSBub3RfZm91bmQgID0gW2BOb3RfZm91bmRdXG5cbmxldCBhYnN1cmQgKF86IGVtcHR5KTogJ2EgPVxuICAgIGFzc2VydCBmYWxzZSAoKiBPayEgV2lsbCBuZXZlciBiZSBjYWxsZWQsIGJlY2F1c2UgYW4gb2JqZWN0IG9mIHR5cGUgW2VtcHR5XVxuICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgY29uc3RydWN0ZWQuICopXG5cblxuXG5cblxudHlwZSAoJ2EsICsnZSkgdCA9XG4gICAgKEJhc2UuVmFsdWUudCAtPiB1bml0KSAtPiAoKCdhLCAnZSkgcmVzdWx0IC0+IHVuaXQpIC0+IHVuaXRcblxuXG5cbmxldCBjb250aW51ZSAoazogJ2EgLT4gdW5pdCkgKGE6ICdhKTogdW5pdCA9XG4gICAgQXNzZXJ0X2ZhaWx1cmUuYXR0ZW1wdFxuICAgICAgICBcIkV4Y2VwdGlvbiBpbiB0YXNrIGV4ZWN1dGlvblwiXG4gICAgICAgIChmdW4gKCkgLT4gayBhKVxuICAgICAgICAoZnVuICgpIC0+ICgpKVxuXG5cbmxldCBydW4gKHRhc2s6ICgnYSwgZW1wdHkpIHQpIChwb3N0OiBCYXNlLlZhbHVlLnQgLT4gdW5pdCkgKGs6ICdhIC0+IHVuaXQpOiB1bml0ID1cbiAgICB0YXNrXG4gICAgICAgIHBvc3RcbiAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICB8IE9rIGEgLT4gY29udGludWUgayBhXG4gICAgICAgICAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgICAgICAgICBhYnN1cmQgZVxuICAgICAgICApXG5cblxubGV0IHN1Y2NlZWQgKGE6ICdhKTogKCdhLCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgKE9rIGEpXG5cblxubGV0IHJldHVybjogJ2EgLT4gKCdhLCAnZSkgdCA9XG4gICAgc3VjY2VlZFxuXG5cbmxldCBmYWlsIChlOiAnZSk6ICgnYSwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIChFcnJvciBlKVxuXG5cblxubGV0IHJlc3VsdCAocjogKCdhLCAnZSkgcmVzdWx0KTogKCdhLCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgclxuXG5cblxubGV0ICg+Pj0pIChtOiAoJ2EsICdlKSB0KSAoZjogJ2EgLT4gKCdiLCAnZSkgdCk6ICgnYiwgJ2UpIHQgPVxuICAgIGZ1biBwb3N0IGsgLT5cbiAgICBtXG4gICAgICAgIHBvc3RcbiAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICB8IE9rIGEgLT5cbiAgICAgICAgICAgICAgICBmIGEgcG9zdCBrXG4gICAgICAgICAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgICAgICAgICBjb250aW51ZSBrIChFcnJvciBlKSlcblxubGV0ICggbGV0KiApID0gKD4+PSlcblxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKSAobTogKCdhLCAnZSkgdCk6ICgnYiwgJ2UpIHQgPVxuICAgIGxldCogYSA9IG0gaW5cbiAgICByZXR1cm4gKGYgYSlcblxuXG5sZXQgbWFrZV9zdWNjZWVkIChmOiAoJ2EsICdlKSByZXN1bHQgLT4gJ2IpIChtOiAoJ2EsICdlKSB0KTogKCdiLCBlbXB0eSkgdCA9XG4gICAgZnVuIHBvc3QgayAtPlxuICAgIG0gcG9zdCAoZnVuIHJlcyAtPiBjb250aW51ZSBrIChPayAoZiByZXMpKSlcblxuXG5cbmxldCBsb2dfc3RyaW5nIChzOiBzdHJpbmcpOiAodW5pdCwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBCYXNlLk1haW4ubG9nX3N0cmluZyBzO1xuICAgIGNvbnRpbnVlIGsgKE9rICgpKVxuXG5cblxubGV0IGxvZ192YWx1ZSAodjogQmFzZS5WYWx1ZS50KTogKHVuaXQsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgQmFzZS5NYWluLmxvZ192YWx1ZSB2O1xuICAgIGNvbnRpbnVlIGsgKE9rICgpKVxuXG5cblxubGV0IHNsZWVwIChtczogaW50KSAoYTogJ2EpIDogKCdhLCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGlnbm9yZSAoXG4gICAgICAgIFRpbWVyLnNldFxuICAgICAgICAgICAgKGZ1biAoKSAtPiBjb250aW51ZSBrIChPayBhKSlcbiAgICAgICAgICAgIG1zXG4gICAgKVxuXG5cbmxldCBuZXh0X3RpY2sgKGE6ICdhKTogKCdhLCAnZSkgdCA9XG4gICAgc2xlZXAgMCBhXG5cblxuXG5sZXQgc2VuZF90b19qYXZhc2NyaXB0ICh2OiBCYXNlLlZhbHVlLnQpOiAodW5pdCwgJ2UpIHQgPVxuICAgIGZ1biBwb3N0IGsgLT5cbiAgICBwb3N0IHY7XG4gICAgY29udGludWUgayAoT2sgKCkpXG5cblxuXG5sZXQgZm9jdXMgKGlkOiBzdHJpbmcpOiAodW5pdCwgbm90X2ZvdW5kKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgbWF0Y2ggRG9tLihEb2N1bWVudC5maW5kIGlkIFdpbmRvdy4oZG9jdW1lbnQgKGdldCAoKSkpKSB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICAgIGsgKEVycm9yIGBOb3RfZm91bmQpXG4gICAgfCBTb21lIGVsIC0+XG4gICAgICAgIERvbS5FbGVtZW50LmZvY3VzIGVsO1xuICAgICAgICBjb250aW51ZSBrIChPayAoKSlcblxuXG5sZXQgYmx1ciAoaWQ6IHN0cmluZyk6ICh1bml0LCBub3RfZm91bmQpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBtYXRjaCBEb20uKERvY3VtZW50LmZpbmQgaWQgV2luZG93Lihkb2N1bWVudCAoZ2V0ICgpKSkpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgY29udGludWUgayAoRXJyb3IgYE5vdF9mb3VuZClcbiAgICB8IFNvbWUgZWwgLT5cbiAgICAgICAgRG9tLkVsZW1lbnQuYmx1ciBlbDtcbiAgICAgICAgY29udGludWUgayAoT2sgKCkpXG5cblxuXG5cbmxldCByYW5kb20gKHJhbmQ6ICdhIFJhbmRvbS50KTogKCdhLCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIGNvbnRpbnVlIGsgKE9rIChSYW5kb20ucnVuIHJhbmQpKVxuXG5cblxubGV0IGh0dHBfdGV4dFxuICAgICAgICAobWV0aDogc3RyaW5nKVxuICAgICAgICAodXJsOiBzdHJpbmcpXG4gICAgICAgIChoZWFkZXJzOiAoc3RyaW5nICogc3RyaW5nKSBsaXN0KVxuICAgICAgICAoYm9keTogc3RyaW5nKVxuICAgIDogKHN0cmluZywgaHR0cF9lcnJvcikgdFxuICAgID1cbiAgICBmdW4gXyBrIC0+XG4gICAgbGV0IHJlcSA9IEh0dHBfcmVxdWVzdC5tYWtlIG1ldGggdXJsIGhlYWRlcnMgYm9keSBpblxuICAgIGxldCBoYW5kbGVyIF8gPVxuICAgICAgICBhc3NlcnQgKEh0dHBfcmVxdWVzdC5yZWFkeV9zdGF0ZSByZXEgPSA0KTtcbiAgICAgICAgbGV0IHN0YXR1cyA9IEh0dHBfcmVxdWVzdC5zdGF0dXMgcmVxIGluXG4gICAgICAgIGlmIHN0YXR1cyA8PiAyMDAgdGhlbiAoKiBub3Qgb2sgKilcbiAgICAgICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIChgSHR0cF9zdGF0dXMgc3RhdHVzKSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29udGludWUgayAoT2sgKEh0dHBfcmVxdWVzdC5yZXNwb25zZV90ZXh0X3N0cmluZyByZXEpKVxuICAgIGluXG4gICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICBcImxvYWRlbmRcIlxuICAgICAgICBoYW5kbGVyXG4gICAgICAgIChIdHRwX3JlcXVlc3QuZXZlbnRfdGFyZ2V0IHJlcSlcblxuXG5sZXQgaHR0cF9qc29uXG4gICAgICAgIChtZXRoOiBzdHJpbmcpXG4gICAgICAgICh1cmw6IHN0cmluZylcbiAgICAgICAgKGhlYWRlcnM6IChzdHJpbmcgKiBzdHJpbmcpIGxpc3QpXG4gICAgICAgIChib2R5OiBzdHJpbmcpXG4gICAgICAgIChkZWNvZGU6ICdhIEJhc2UuRGVjb2RlLnQpXG4gICAgOiAoJ2EsIGh0dHBfZXJyb3IpIHRcbiAgICA9XG4gICAgZnVuIF8gayAtPlxuICAgIGxldCByZXEgPSBIdHRwX3JlcXVlc3QubWFrZSBtZXRoIHVybCBoZWFkZXJzIGJvZHkgaW5cbiAgICBsZXQgaGFuZGxlciBfID1cbiAgICAgICAgYXNzZXJ0IChIdHRwX3JlcXVlc3QucmVhZHlfc3RhdGUgcmVxID0gNCk7XG4gICAgICAgIGxldCBzdGF0dXMgPSBIdHRwX3JlcXVlc3Quc3RhdHVzIHJlcSBpblxuICAgICAgICBpZiBzdGF0dXMgPD4gMjAwIHRoZW4gKCogbm90IG9rICopXG4gICAgICAgICAgICBjb250aW51ZSBrIChFcnJvciAoYEh0dHBfc3RhdHVzIHN0YXR1cykpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hdGNoXG4gICAgICAgICAgICAgICAgQmFzZS5WYWx1ZS5wYXJzZSAoSHR0cF9yZXF1ZXN0LnJlc3BvbnNlX3RleHRfdmFsdWUgcmVxKVxuICAgICAgICAgICAgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgY29udGludWUgayAoRXJyb3IgYEh0dHBfbm9fanNvbilcbiAgICAgICAgICAgIHwgU29tZSB2IC0+XG4gICAgICAgICAgICAgICAgbWF0Y2ggZGVjb2RlIHYgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBrIChFcnJvciBgSHR0cF9kZWNvZGUpXG4gICAgICAgICAgICAgICAgfCBTb21lIGEgLT5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgayAoT2sgYSlcbiAgICBpblxuICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgXCJsb2FkZW5kXCJcbiAgICAgICAgaGFuZGxlclxuICAgICAgICAoSHR0cF9yZXF1ZXN0LmV2ZW50X3RhcmdldCByZXEpXG5cblxubGV0IG5vdzogKFRpbWUudCwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIChPayAoRGF0ZS5ub3cgKCkpKVxuXG5cbmxldCB0aW1lX3pvbmU6IChUaW1lLlpvbmUudCwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIChPayAoRGF0ZS4oem9uZV9vZmZzZXQgKG5vdyAoKSkpKSlcbiIsIm9wZW4gRm1saWJfanNcblxudHlwZSAnbSB0ID1cbiAgICB8IE5vbmVcbiAgICB8IFdpbmRvdyBvZiBzdHJpbmcgKiAnbSBIYW5kbGVyLlZpcnR1YWwudFxuICAgIHwgSW50ZXJ2YWxfdGltZXIgIG9mIGludCAqIChUaW1lLnQgLT4gJ20pXG4gICAgfCBNZXNzYWdlIG9mICdtIEJhc2UuRGVjb2RlLnRcbiAgICB8IFVybF9yZXF1ZXN0IG9mIChVcmwudCAtPiAnbSlcbiAgICB8IEJhdGNoICBvZiAnbSB0IGxpc3RcblxuXG5sZXQgbm9uZTogJ20gdCA9XG4gICAgTm9uZVxuXG5cbmxldCBiYXRjaCAobHN0OiAnbSB0IGxpc3QpOiAnbSB0ID1cbiAgICBCYXRjaCBsc3RcblxuXG5cbmxldCBvbl93aW5kb3cgKGV2ZW50X3R5cGU6IHN0cmluZykgKGRlY29kZTogJ20gQmFzZS5EZWNvZGUudClcbiAgICA6ICdtIHRcbiAgICA9XG4gICAgV2luZG93IChldmVudF90eXBlLCBFdmVudF9mbGFnLihub19zdG9wLCBub19wcmV2ZW50LCBkZWNvZGUpKVxuXG5cblxubGV0IGV2ZXJ5IChtczogaW50KSAoY2FsbGJhY2s6IFRpbWUudCAtPiAnbSk6ICdtIHQgPVxuICAgIEludGVydmFsX3RpbWVyIChtcywgY2FsbGJhY2spXG5cblxubGV0IG9uX21lc3NhZ2UgKGRlY29kZTogJ20gQmFzZS5EZWNvZGUudCk6ICdtIHQgPVxuICAgIE1lc3NhZ2UgZGVjb2RlXG5cblxubGV0IG9uX3VybF9yZXF1ZXN0IChmOiBVcmwudCAtPiAnbSk6ICdtIHQgPVxuICAgIFVybF9yZXF1ZXN0IGZcblxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKSAoc3ViOidhIHQpOiAnYiB0ID1cbiAgICBsZXQgcmVjIG1hcCA9XG4gICAgICAgIGZ1bmN0aW9uXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgTm9uZVxuXG4gICAgICAgIHwgQmF0Y2ggbHN0IC0+XG4gICAgICAgICAgICBCYXRjaCAoTGlzdC5tYXAgbWFwIGxzdClcblxuICAgICAgICB8IFdpbmRvdyAoZXZlbnRfdHlwZSwgZGVjb2RlKSAtPlxuICAgICAgICAgICAgV2luZG93IChldmVudF90eXBlLCBIYW5kbGVyLlZpcnR1YWwubWFwIGYgZGVjb2RlKVxuXG4gICAgICAgIHwgSW50ZXJ2YWxfdGltZXIgKG1pbGxpcywgZykgLT5cbiAgICAgICAgICAgIEludGVydmFsX3RpbWVyIChtaWxsaXMsIGZ1biB0aW1lIC0+IGYgKGcgdGltZSkpXG5cbiAgICAgICAgfCBNZXNzYWdlIGRlY29kZSAtPlxuICAgICAgICAgICAgTWVzc2FnZSBCYXNlLkRlY29kZS4obWFwIGYgZGVjb2RlKVxuXG4gICAgICAgIHwgVXJsX3JlcXVlc3QgZyAtPlxuICAgICAgICAgICAgVXJsX3JlcXVlc3QgKGZ1biB1cmwgLT4gZiAoZyB1cmwpKVxuICAgIGluXG4gICAgbWFwIHN1YlxuXG5cblxubGV0IGRlY29kZV9rZXlfZXZlbnQgKGY6IHN0cmluZyAtPiAnbSk6ICdtIEJhc2UuRGVjb2RlLnQgPVxuICAgIEJhc2UuRGVjb2RlLihtYXAgZiAoZmllbGQgXCJrZXlcIiBzdHJpbmcpKVxuXG5sZXQgZGVjb2RlX21vdXNlX2V2ZW50IChmOiBpbnQgLT4gaW50IC0+ICdtKTogJ20gQmFzZS5EZWNvZGUudCA9XG4gICAgQmFzZS5EZWNvZGUuKFxuICAgICAgICBsZXQqIHggPSBmaWVsZCBcImNsaWVudFhcIiBpbnQgaW5cbiAgICAgICAgbGV0KiB5ID0gZmllbGQgXCJjbGllbnRZXCIgaW50IGluXG4gICAgICAgIHJldHVybiAoZiB4IHkpXG4gICAgKVxuXG5cbmxldCBvbl9rZXlkb3duIChmOiBzdHJpbmcgLT4gJ20pOiAnbSB0ID1cbiAgICBvbl93aW5kb3cgXCJrZXlkb3duXCIgKGRlY29kZV9rZXlfZXZlbnQgZilcblxubGV0IG9uX2tleXVwIChmOiBzdHJpbmcgLT4gJ20pOiAnbSB0ID1cbiAgICBvbl93aW5kb3cgXCJrZXl1cFwiIChkZWNvZGVfa2V5X2V2ZW50IGYpXG5cbmxldCBvbl9tb3VzZV9kb3duIChmOiBpbnQgLT4gaW50IC0+ICdtKTogJ20gdCA9XG4gICAgb25fd2luZG93IFwibW91c2Vkb3duXCIgKGRlY29kZV9tb3VzZV9ldmVudCBmKVxuXG5sZXQgb25fbW91c2VfbW92ZSAoZjogaW50IC0+IGludCAtPiAnbSk6ICdtIHQgPVxuICAgIG9uX3dpbmRvdyBcIm1vdXNlbW92ZVwiIChkZWNvZGVfbW91c2VfZXZlbnQgZilcblxubGV0IG9uX21vdXNlX3VwIChmOiBpbnQgLT4gaW50IC0+ICdtKTogJ20gdCA9XG4gICAgb25fd2luZG93IFwibW91c2V1cFwiIChkZWNvZGVfbW91c2VfZXZlbnQgZilcblxuXG5cbmxldCBvbl9yZXNpemUgKGY6IGludCAtPiBpbnQgLT4gJ20pOiAnbSB0ID1cbiAgICBsZXQgZGVjb2RlID0gQmFzZS5EZWNvZGUuKFxuICAgICAgICBsZXQqIF8gPSByZXR1cm4gKCkgaW5cbiAgICAgICAgZmllbGQgXCJjdXJyZW50VGFyZ2V0XCIgKFxuICAgICAgICAgICAgbGV0KiB3aWR0aCAgPSBmaWVsZCBcImlubmVyV2lkdGhcIiBpbnQgaW5cbiAgICAgICAgICAgIGxldCogaGVpZ2h0ID0gZmllbGQgXCJpbm5lckhlaWdodFwiIGludCBpblxuICAgICAgICAgICAgcmV0dXJuIChmIHdpZHRoIGhlaWdodClcbiAgICAgICAgKVxuICAgIClcbiAgICBpblxuICAgIG9uX3dpbmRvdyBcInJlc2l6ZVwiIGRlY29kZVxuXG5cbmxldCBvbl92aXNpYmlsaXR5X2NoYW5nZSAoZjogc3RyaW5nIC0+ICdtKTogJ20gdCA9XG4gICAgbGV0IGRlY29kZSA9IEJhc2UuRGVjb2RlLihcbiAgICAgICAgZmllbGQgXCJ0YXJnZXRcIiAoXG4gICAgICAgICAgICAoKiBUaGUgdGFyZ2V0IG9mIHRoZSB2aXNpYmlsaXR5IGNoYW5nZSBldmVudCBpcyBcImRvY3VtZW50XCIgYW5kXG4gICAgICAgICAgICAgICBcImRvY3VtZW50XCIgaGFzIHRoZSBcInZpc2liaWxpdHlTdGF0ZVwiIHByb3BlcnR5LiAqKVxuICAgICAgICAgICAgbGV0KiBzdGF0ZSA9IGZpZWxkIFwidmlzaWJpbGl0eVN0YXRlXCIgc3RyaW5nIGluXG4gICAgICAgICAgICByZXR1cm4gKGYgc3RhdGUpXG4gICAgICAgIClcbiAgICApXG4gICAgaW5cbiAgICBvbl93aW5kb3cgXCJ2aXNpYmlsaXR5Y2hhbmdlXCIgZGVjb2RlXG4iLCJvcGVuIEZtbGliX2pzXG5cbm1vZHVsZSBTdHJpbmdfbWFwID0gRm1saWJfc3RkLkJ0cmVlLk1hcCAoU3RyaW5nKVxubW9kdWxlIEludF9tYXAgID0gRm1saWJfc3RkLkJ0cmVlLk1hcCAoSW50KVxuXG5tb2R1bGUgSW50aW9uYXJ5ICA9IERpY3Rpb25hcnkuTWFrZSAoSW50KVxubW9kdWxlIERpY3Rpb25hcnkgPSBEaWN0aW9uYXJ5Lk1ha2UgKFN0cmluZylcblxubW9kdWxlIFN1YnMgPVxuc3RydWN0XG4gICAgdHlwZSAnbSBoYW5kbGVyID0gJ20gSGFuZGxlci5WaXJ0dWFsLnRcblxuICAgIHR5cGUgJ20gdCA9IHtcblxuICAgICAgICB3aW5kb3c6ICdtIGhhbmRsZXIgbGlzdCBEaWN0aW9uYXJ5LnQ7XG5cbiAgICAgICAgdGltZXJzOiAoVGltZS50IC0+ICdtKSBsaXN0IEludGlvbmFyeS50O1xuXG4gICAgICAgIG1lc3NhZ2U6ICdtIEJhc2UuRGVjb2RlLnQgb3B0aW9uO1xuXG4gICAgICAgIHVybF9yZXF1ZXN0OiAoVXJsLnQgLT4gJ20pIG9wdGlvblxuICAgIH1cblxuXG4gICAgbGV0IGVtcHR5OiAnbSB0ID0ge1xuICAgICAgICB3aW5kb3cgICAgICA9IERpY3Rpb25hcnkuZW1wdHk7XG4gICAgICAgIHRpbWVycyAgICAgID0gSW50aW9uYXJ5LmVtcHR5O1xuICAgICAgICBtZXNzYWdlICAgICA9IE5vbmU7XG4gICAgICAgIHVybF9yZXF1ZXN0ID0gTm9uZTtcbiAgICB9XG5cblxuICAgIGxldCBtYWtlIChzdWI6ICdtIFN1YnNjcmlwdGlvbi50KTogJ20gdCA9XG4gICAgICAgIGxldCBvcGVuIFN1YnNjcmlwdGlvbiBpblxuICAgICAgICBsZXQgcmVjIG1ha2Ugc3VicyA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBzdWJzXG5cbiAgICAgICAgICAgIHwgQmF0Y2ggbHN0IC0+XG4gICAgICAgICAgICAgICAgTGlzdC5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAgICAgbWFrZVxuICAgICAgICAgICAgICAgICAgICBzdWJzXG4gICAgICAgICAgICAgICAgICAgIGxzdFxuICAgICAgICAgICAgfCBXaW5kb3cgKGV2ZW50X3R5cGUsIGhhbmRsZXIpIC0+XG4gICAgICAgICAgICAgICAge3N1YnMgd2l0aFxuICAgICAgICAgICAgICAgICB3aW5kb3cgPVxuICAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeS5zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhbmRsZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBsc3QgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgOjogbHN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMud2luZG93fVxuXG4gICAgICAgICAgICB8IEludGVydmFsX3RpbWVyIChtaWxsaXMsIGNhbGxiYWNrKSAtPlxuICAgICAgICAgICAgICAgIHtzdWJzIHdpdGhcbiAgICAgICAgICAgICAgICAgdGltZXJzID1cbiAgICAgICAgICAgICAgICAgICAgIEludGlvbmFyeS5zZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsbGJhY2tdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBsc3QgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrIDo6IGxzdFxuICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzLnRpbWVyc31cblxuICAgICAgICAgICAgfCBNZXNzYWdlIGRlY29kZSAtPlxuICAgICAgICAgICAgICAgIHtzdWJzIHdpdGhcbiAgICAgICAgICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgICAgICBtYXRjaCBzdWJzLm1lc3NhZ2Ugd2l0aFxuICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgU29tZSBkZWNvZGVcbiAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3Vicy5tZXNzYWdlfVxuXG4gICAgICAgICAgICB8IFVybF9yZXF1ZXN0IGYgLT5cbiAgICAgICAgICAgICAgICB7c3VicyB3aXRoXG4gICAgICAgICAgICAgICAgIHVybF9yZXF1ZXN0ID1cbiAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHN1YnMudXJsX3JlcXVlc3Qgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgU29tZSBmXG4gICAgICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMudXJsX3JlcXVlc3R9XG4gICAgICAgIGluXG4gICAgICAgIG1ha2UgZW1wdHkgc3ViXG5lbmRcblxuXG5cblxuXG5cblxuXG50eXBlICdtIHQgPSB7XG4gICAgc3ViczogICAnbSBTdWJzLnQ7XG4gICAgd2luZG93OiBIYW5kbGVyLkV2ZW50SHMudDtcbiAgICB0aW1lcnM6IEhhbmRsZXIuVGltZXJzLnQ7XG4gICAgdXJsX3JlcXVlc3Q6IEhhbmRsZXIuVXJsX3JlcXVlc3QudFxufVxuXG5cblxuXG5sZXQgbWFrZSAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpIChzdWI6ICdtIFN1YnNjcmlwdGlvbi50KTogJ20gdCA9XG4gICAgbGV0IHN1YnMgICA9IFN1YnMubWFrZSBzdWIgaW5cbiAgICBsZXQgb3BlbiBIYW5kbGVyIGluXG5cbiAgICBsZXQgd2luZG93ID0gRXZlbnRIcy5lbXB0eSAoKSBpblxuICAgIEV2ZW50SHMuc2V0XG4gICAgICAgIEZtbGliX2pzLkRvbS5XaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSlcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgc3Vicy53aW5kb3dcbiAgICAgICAgd2luZG93O1xuXG4gICAgbGV0IHRpbWVycyA9IFRpbWVycy5lbXB0eSAoKSBpblxuICAgIFRpbWVycy5zZXQgZGlzcGF0Y2ggc3Vicy50aW1lcnMgdGltZXJzO1xuXG4gICAgbGV0IHVybF9yZXF1ZXN0ID0gVXJsX3JlcXVlc3QuZW1wdHkgKCkgaW5cbiAgICBVcmxfcmVxdWVzdC5zZXQgZGlzcGF0Y2ggc3Vicy51cmxfcmVxdWVzdCB1cmxfcmVxdWVzdDtcbiAgICB7IHN1YnM7IHdpbmRvdzsgdGltZXJzOyB1cmxfcmVxdWVzdCB9XG5cblxuXG5sZXQgdXBkYXRlIChkaXNwYXRjaDogJ20gLT4gdW5pdCkgKHN1YjogJ20gU3Vic2NyaXB0aW9uLnQpIChzOiAnbSB0KTogJ20gdCA9XG4gICAgbGV0IHN1YnMgICA9IFN1YnMubWFrZSBzdWIgaW5cbiAgICBsZXQgb3BlbiBIYW5kbGVyIGluXG4gICAgRXZlbnRIcy51cGRhdGVcbiAgICAgICAgRm1saWJfanMuRG9tLldpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKVxuICAgICAgICBkaXNwYXRjaFxuICAgICAgICBzdWJzLndpbmRvd1xuICAgICAgICBzLnN1YnMud2luZG93XG4gICAgICAgIHMud2luZG93O1xuICAgIFRpbWVycy51cGRhdGUgZGlzcGF0Y2ggc3Vicy50aW1lcnMgcy5zdWJzLnRpbWVycyBzLnRpbWVycztcbiAgICBVcmxfcmVxdWVzdC51cGRhdGVcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgc3Vicy51cmxfcmVxdWVzdFxuICAgICAgICBzLnN1YnMudXJsX3JlcXVlc3RcbiAgICAgICAgcy51cmxfcmVxdWVzdDtcbiAgICB7IHMgd2l0aCBzdWJzIH1cbiIsIm9wZW4gRm1saWJfanNcblxudHlwZSAnbSB0ID1cbiAgICB8IE5vbmVcbiAgICB8IFRhc2sgb2YgKCdtLCBUYXNrLmVtcHR5KSBUYXNrLnRcbiAgICB8IFRhc2tfd29fbWVzc2FnZSBvZiAodW5pdCwgVGFzay5lbXB0eSkgVGFzay50XG4gICAgfCBCYXRjaCBvZiAnbSB0IGxpc3RcblxuXG5sZXQgbm9uZTogJ20gdCA9XG4gICAgTm9uZVxuXG5cblxubGV0IGJhdGNoIChsc3Q6ICdtIHQgbGlzdCk6ICdtIHQgPVxuICAgIEJhdGNoIGxzdFxuXG5cblxubGV0IHBlcmZvcm0gKHRhc2s6ICgnYSwgVGFzay5lbXB0eSkgVGFzay50KTogJ20gdCA9XG4gICAgVGFzayB0YXNrXG5cblxubGV0IGp1c3RfZG8gKHRhc2s6ICh1bml0LCBUYXNrLmVtcHR5KSBUYXNrLnQpOiAnbSB0ID1cbiAgICBUYXNrX3dvX21lc3NhZ2UgdGFza1xuXG5cblxubGV0IGF0dGVtcHQgKGY6ICgnYSwgJ2UpIHJlc3VsdCAtPiAnbSkgKHRhc2s6ICgnYSwgJ2UpIFRhc2sudCk6ICdtIHQgPVxuICAgIFRhc2sgKFRhc2subWFrZV9zdWNjZWVkIGYgdGFzaylcblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYikgKGNtZDogJ2EgdCk6ICdiIHQgPVxuICAgIGxldCByZWMgbWFwID0gZnVuY3Rpb25cbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBOb25lXG4gICAgICAgIHwgVGFzayB0YXNrIC0+XG4gICAgICAgICAgICBUYXNrIChUYXNrLm1hcCBmIHRhc2spXG4gICAgICAgIHwgVGFza193b19tZXNzYWdlIF8gYXMgY21kIC0+XG4gICAgICAgICAgICBjbWRcbiAgICAgICAgfCBCYXRjaCBsc3QgLT5cbiAgICAgICAgICAgIEJhdGNoIChMaXN0Lm1hcCBtYXAgbHN0KVxuICAgIGluXG4gICAgbWFwIGNtZFxuXG5cblxuXG5sZXQgZXhlY3V0ZSAocG9zdDogQmFzZS5WYWx1ZS50IC0+IHVuaXQpIChkaXNwYXRjaDogJ20gLT4gdW5pdCkgKGNtZDogJ20gdCk6IHVuaXQgPVxuICAgIGxldCByZWMgZXhlID0gZnVuY3Rpb25cbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAoKVxuXG4gICAgICAgIHwgVGFzayB0YXNrIC0+XG4gICAgICAgICAgICBUYXNrLnJ1biB0YXNrIHBvc3QgZGlzcGF0Y2hcblxuICAgICAgICB8IFRhc2tfd29fbWVzc2FnZSB0YXNrIC0+XG4gICAgICAgICAgICBUYXNrLnJ1biB0YXNrIHBvc3QgKGZ1biBfIC0+ICgpKVxuXG4gICAgICAgIHwgQmF0Y2ggbHN0IC0+XG4gICAgICAgICAgICBMaXN0Lml0ZXIgZXhlIGxzdFxuICAgIGluXG4gICAgZXhlIGNtZFxuIiwiKCogVGhpcyBtb2R1bGUgaGFuZGxlcyBhbGwgY2FsbHMgdG8gamF2YXNjcmlwdFxuXG4qKVxuXG5vcGVuIEZtbGliX2pzXG5vcGVuIEZtbGliX2pzLkRvbVxuXG5cblxuXG4oKiBCYXNpYyBkZWZpbml0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4qKVxuXG5cblxudHlwZSBlbGVtZW50ICAgICAgICAgICAgID0gRWxlbWVudC50ICogSGFuZGxlci5FdmVudEhzLnRcblxudHlwZSBub2RlICAgICAgICAgICAgICAgID0gTm9kZS50ICogZWxlbWVudCBvcHRpb25cblxudHlwZSAnbXNnIGRvbSAgICAgICAgICAgID0gKCdtc2csIG5vZGUpIFZkb20udDFcblxudHlwZSAnbXNnIGRvbV9vcGVyYXRpb25zID0gKCdtc2csIG5vZGUpIFZkb20ub3BlcmF0aW9uc1xuXG5cbmxldCBkb2N1bWVudCAoKTogRG9jdW1lbnQudCA9IFdpbmRvdy4oZ2V0ICgpIHw+IGRvY3VtZW50KVxuXG50eXBlICgnc3RhdGUsICdtc2cpIHZpZXcxID0gJ3N0YXRlIC0+ICdtc2cgVmRvbS50XG50eXBlICgnc3RhdGUsICdtc2cpIHZpZXcyID0gJ3N0YXRlIC0+ICdtc2cgVmRvbS50ICogc3RyaW5nXG5cbnR5cGUgKCdzdGF0ZSwgJ21zZykgdXBkYXRlMSA9ICdzdGF0ZSAtPiAnbXNnIC0+ICdzdGF0ZVxudHlwZSAoJ3N0YXRlLCAnbXNnKSB1cGRhdGUyID0gJ3N0YXRlIC0+ICdtc2cgLT4gJ3N0YXRlICogJ21zZyBDb21tYW5kLnRcblxuXG5cbnR5cGUgKCdzLCAnbSkgb3BlcmF0aW9ucyA9XG4gICAgfCBTYW5kYm94IG9mXG4gICAgICAgICAgKCdzLCAnbSkgdmlldzFcbiAgICAgICAgICAqICgncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgICAqICgncywgJ20pIHVwZGF0ZTFcbiAgICB8IEVsZW1lbnQgb2ZcbiAgICAgICAgICAoJ3MsICdtKSB2aWV3MVxuICAgICAgICAgICogKCdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAgICogKCdzLCAnbSkgdXBkYXRlMlxuICAgICAgICAgICogKEJhc2UuVmFsdWUudCAtPiB1bml0KVxuICAgIHwgQXBwICAgICBvZlxuICAgICAgICAgICgncywgJ20pIHZpZXcyXG4gICAgICAgICAgKiAoJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICAgKiAoJ3MsICdtKSB1cGRhdGUyXG4gICAgICAgICAgKiAoQmFzZS5WYWx1ZS50IC0+IHVuaXQpXG5cblxuXG50eXBlICgnc3RhdGUsICdtc2cpIGRhdGEgPVxuICAgIHtcbiAgICAgICAgbXV0YWJsZSBzdGF0ZTogJ3N0YXRlO1xuICAgICAgICBtdXRhYmxlIGRpcnR5OiBib29sO1xuICAgICAgICBtdXRhYmxlIGRvbTogICAnbXNnIGRvbSBvcHRpb247XG4gICAgICAgIG11dGFibGUgc3ViczogICdtc2cgU3Vic2NyaXB0aW9ucy50IG9wdGlvbjtcbiAgICAgICAgcm9vdDogICAgICAgICAgRWxlbWVudC50O1xuICAgICAgICBvcGVyYXRpb25zOiAgICAoJ3N0YXRlLCAnbXNnKSBvcGVyYXRpb25zO1xuICAgIH1cblxuXG5cblxuXG4oKiBEb20gb3BlcmF0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgIEFjY2Vzc2luZyB0aGUgcmVhbCBkb20uXG5cbiAgIE9wZXJhdGlvbnMgYXJlIG5lZWRlZCBmb3IgdGhlIG1vZHVsZSBbVmRvbV0uXG4qKVxuXG5cbmxldCBkb21fb3BlcmF0aW9ucyAoZGlzcGF0Y2g6ICdtc2cgLT4gdW5pdCk6ICdtc2cgZG9tX29wZXJhdGlvbnMgPVxuICAgIGxldCBnZXRfYm90aDpcbiAgICAgICAgbm9kZSAtPiBlbGVtZW50XG4gICAgICAgID1cbiAgICAgICAgZnVuY3Rpb25cbiAgICAgICAgfCAoXywgU29tZSBlbCkgLT5cbiAgICAgICAgICBlbFxuICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwgKilcbiAgICBpblxuICAgIGxldCBnZXRfZWxlbWVudDpcbiAgICAgICAgTm9kZS50ICogZWxlbWVudCBvcHRpb24gLT4gRWxlbWVudC50XG4gICAgICAgID1cbiAgICAgICAgZnVuY3Rpb25cbiAgICAgICAgfCAoXywgU29tZSAoZWwsIF8pKSAtPlxuICAgICAgICAgIGVsXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbCAqKVxuICAgIGluXG4gICAge1xuICAgICAgICBtYWtlX3RleHQgPVxuICAgICAgICAgICAgKGZ1biBzIC0+IERvY3VtZW50LmNyZWF0ZV90ZXh0X25vZGUgcyAoZG9jdW1lbnQgKCkpLCBOb25lKTtcblxuICAgICAgICBtYWtlX2VsZW1lbnQgPVxuICAgICAgICAgICAgKGZ1biB0YWcgKGxzdDogbm9kZSBsaXN0KSAtPlxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBEb2N1bWVudCBpblxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBFbGVtZW50IGluXG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIE5vZGUgaW5cbiAgICAgICAgICAgICAgICAgbGV0IGRvYyA9IGRvY3VtZW50ICgpIGluXG4gICAgICAgICAgICAgICAgIGxldCBlbCAgPSBjcmVhdGVfZWxlbWVudCB0YWcgZG9jIGluXG4gICAgICAgICAgICAgICAgIExpc3QuaXRlclxuICAgICAgICAgICAgICAgICAgICAgKGZ1biAoY2hpbGQsIF8pIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjaGlsZCAobm9kZSBlbCkpXG4gICAgICAgICAgICAgICAgICAgICBsc3Q7XG4gICAgICAgICAgICAgICAgIG5vZGUgZWwsIFNvbWUgKGVsLCBIYW5kbGVyLkV2ZW50SHMuZW1wdHkgKCkpKTtcblxuICAgICAgICBtYWtlX2VsZW1lbnRfbnMgPVxuICAgICAgICAgICAgKGZ1biBuYW1lc3BhY2UgdGFnIChsc3Q6IG5vZGUgbGlzdCkgLT5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gRG9jdW1lbnQgaW5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gRWxlbWVudCBpblxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBOb2RlIGluXG4gICAgICAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudCAoKSBpblxuICAgICAgICAgICAgICAgICBsZXQgZWwgID0gY3JlYXRlX2VsZW1lbnRfbnMgbmFtZXNwYWNlIHRhZyBkb2MgaW5cbiAgICAgICAgICAgICAgICAgTGlzdC5pdGVyXG4gICAgICAgICAgICAgICAgICAgICAoZnVuIChjaGlsZCwgXykgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kIGNoaWxkIChub2RlIGVsKSlcbiAgICAgICAgICAgICAgICAgICAgIGxzdDtcbiAgICAgICAgICAgICAgICAgbm9kZSBlbCwgU29tZSAoZWwsIEhhbmRsZXIuRXZlbnRIcy5lbXB0eSAoKSkpO1xuXG4gICAgICAgIGFkZF9jaGlsZCA9XG4gICAgICAgICAgICAoZnVuIChjaGlsZCwgXykgKHBhciwgXykgLT5cbiAgICAgICAgICAgICAgICAgTm9kZS5hcHBlbmQgY2hpbGQgcGFyKTtcblxuICAgICAgICByZW1vdmVfY2hpbGQgPVxuICAgICAgICAgICAgKGZ1biAoY2hpbGQsIF8pIChwYXIsIF8pIC0+XG4gICAgICAgICAgICAgICAgIE5vZGUucmVtb3ZlIGNoaWxkIHBhcik7XG5cbiAgICAgICAgcmVtb3ZlX2NoaWxkcmVuID1cbiAgICAgICAgICAgIChmdW4gKHBhciwgXykgLT5cbiAgICAgICAgICAgICAgICAgTm9kZS5yZW1vdmVfY2hpbGRyZW4gcGFyKTtcblxuICAgICAgICByZXBsYWNlX2NoaWxkID1cbiAgICAgICAgICAgIChmdW4gKG9sZF9jaGlsZCwgXykgKG5ld19jaGlsZCwgXykgKHBhciwgXykgLT5cbiAgICAgICAgICAgICAgICAgTm9kZS5yZXBsYWNlIG5ld19jaGlsZCBvbGRfY2hpbGQgcGFyKTtcblxuICAgICAgICBzZXRfdGV4dCA9XG4gICAgICAgICAgICAoZnVuIChub2RlLCBfKSB0ZXh0IC0+IE5vZGUuc2V0X25vZGVfdmFsdWUgdGV4dCBub2RlKTtcblxuXG4gICAgICAgIHNldF9zdHlsZSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgIFN0eWxlLnNldCBrZXkgdmFsdWUgKEVsZW1lbnQuc3R5bGUgKGdldF9lbGVtZW50IGVsKSkpO1xuXG4gICAgICAgIHNldF9hdHRyaWJ1dGUgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgRWxlbWVudC5zZXRfYXR0cmlidXRlIGtleSB2YWx1ZSAoZ2V0X2VsZW1lbnQgZWwpKTtcblxuICAgICAgICBzZXRfcHJvcGVydHkgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgRWxlbWVudC5zZXRfcHJvcGVydHkga2V5IHZhbHVlIChnZXRfZWxlbWVudCBlbCkpO1xuXG5cbiAgICAgICAgcmVtb3ZlX3N0eWxlID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IC0+XG4gICAgICAgICAgICAgICAgIFN0eWxlLnJlbW92ZVxuICAgICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgICAgICAoRWxlbWVudC5zdHlsZSAoZ2V0X2VsZW1lbnQgZWwpKSk7XG5cblxuICAgICAgICByZW1vdmVfYXR0cmlidXRlID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IC0+XG4gICAgICAgICAgICAgICAgIEVsZW1lbnQucmVtb3ZlX2F0dHJpYnV0ZSBrZXkgKGdldF9lbGVtZW50IGVsKSk7XG5cblxuICAgICAgICByZW1vdmVfcHJvcGVydHkgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgLT5cbiAgICAgICAgICAgICAgICAgRWxlbWVudC5kZWxldGVfcHJvcGVydHkga2V5IChnZXRfZWxlbWVudCBlbCkpO1xuXG5cbiAgICAgICAgc2V0X2hhbmRsZXJzID1cbiAgICAgICAgICAgIChmdW4gZWwgZGljdCAtPlxuICAgICAgICAgICAgICAgICBsZXQgZWwsIHJlYWxzID0gZ2V0X2JvdGggZWwgaW5cbiAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IE5vZGUuZXZlbnRfdGFyZ2V0IChFbGVtZW50Lm5vZGUgZWwpIGluXG4gICAgICAgICAgICAgICAgIEhhbmRsZXIuRXZlbnRIcy5zZXQgdGFyZ2V0IGRpc3BhdGNoIGRpY3QgcmVhbHNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdXBkYXRlX2hhbmRsZXJzID1cbiAgICAgICAgICAgIChmdW4gZWwgZGljdDEgZGljdDIgLT5cbiAgICAgICAgICAgICAgICAgbGV0IGVsLCByZWFscyA9IGdldF9ib3RoIGVsIGluXG4gICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBOb2RlLmV2ZW50X3RhcmdldCAoRWxlbWVudC5ub2RlIGVsKSBpblxuICAgICAgICAgICAgICAgICBIYW5kbGVyLkV2ZW50SHMudXBkYXRlIHRhcmdldCBkaXNwYXRjaCBkaWN0MSBkaWN0MiByZWFscyk7XG4gICAgfVxuXG5cblxuXG5cbigqIERpc3BhdGNoaW5nIG1lc3NhZ2VzIHRvIHRoZSBhcHBsaWNhdGlvblxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgIC0gY2FsbCB0aGUgdXBkYXRlIGZ1bmN0aW9uXG5cbiAgICAgICAgc3RhdGUgLT4gbXNnIC0+IHN0YXRlICogY21kXG5cbiAgIC0gdXBkYXRlIHRoZSBzdWJzY3JpcHRpb25zXG5cbiAgICAgICAgc3RhdGUgbWlnaHQgaGF2ZSBjaGFuZ2VkLCB0aGVyZWZvcmUgc3Vic2NyaXB0aW9ucyBtaWdodCBoYXZlIGNoYW5nZWQuXG5cbiAgIC0gZXhlY3V0ZSBjb21tYW5kc1xuXG4qKVxuXG5sZXQgcmVjIGRpc3BhdGNoIChkYXRhOiAoJ3N0YXRlLCAnbXNnKSBkYXRhKSAobXNnOiAnbXNnKTogdW5pdCA9XG4gICAgbGV0IHVwZGF0ZV9kYXRhIHN0YXRlID1cbiAgICAgICAgbGV0IHN0YXRlX2RpZmZlcmVudCA9IG5vdCAoc3RhdGUgPT0gZGF0YS5zdGF0ZSlcbiAgICAgICAgaW5cbiAgICAgICAgZGF0YS5kaXJ0eSA8LSBkYXRhLmRpcnR5IHx8IHN0YXRlX2RpZmZlcmVudDtcbiAgICAgICAgaWYgc3RhdGVfZGlmZmVyZW50IHRoZW4gYmVnaW5cbiAgICAgICAgICAgIGRhdGEuc3RhdGUgPC0gc3RhdGU7XG4gICAgICAgICAgICB1cGRhdGVfc3Vic2NyaXB0aW9ucyBkYXRhXG4gICAgICAgIGVuZFxuICAgIGluXG4gICAgbWF0Y2ggZGF0YS5vcGVyYXRpb25zIHdpdGhcbiAgICB8IFNhbmRib3ggKF8sIF8sIHVwZGF0ZSkgLT5cbiAgICAgICAgdXBkYXRlX2RhdGEgKHVwZGF0ZSBkYXRhLnN0YXRlIG1zZyk7XG5cbiAgICB8IEVsZW1lbnQgKF8sIF8sIHVwZGF0ZSwgcG9zdCkgLT5cbiAgICAgICAgbGV0IHN0YXRlLCBjbWQgPSB1cGRhdGUgZGF0YS5zdGF0ZSBtc2cgaW5cbiAgICAgICAgdXBkYXRlX2RhdGEgc3RhdGU7XG4gICAgICAgIENvbW1hbmQuZXhlY3V0ZSBwb3N0IChkaXNwYXRjaF9uZXh0IGRhdGEpIGNtZFxuXG4gICAgfCBBcHAgKF8sIF8sIHVwZGF0ZSwgcG9zdCkgLT5cbiAgICAgICAgbGV0IHN0YXRlLCBjbWQgPSB1cGRhdGUgZGF0YS5zdGF0ZSBtc2cgaW5cbiAgICAgICAgdXBkYXRlX2RhdGEgc3RhdGU7XG4gICAgICAgIENvbW1hbmQuZXhlY3V0ZSBwb3N0IChkaXNwYXRjaF9uZXh0IGRhdGEpIGNtZFxuXG5cbmFuZCBkaXNwYXRjaF9uZXh0IChkYXRhOiAoJ3N0YXRlLCAnbXNnKSBkYXRhKSAobXNnOiAnbXNnKTogdW5pdCA9XG4gICAgaWdub3JlICggVGltZXIuc2V0IChmdW4gKCkgLT4gZGlzcGF0Y2ggZGF0YSBtc2cpIDAgKVxuXG5cbmFuZCB1cGRhdGVfc3Vic2NyaXB0aW9ucyAoZGF0YTogKCdzLCAnbSkgZGF0YSk6IHVuaXQgPVxuICAgICgqIGNyZWF0ZSBvciB1cGRhdGUgdGhlIHN1YnNjcmlwdGlvbnMsIGkuZS4gaW5zdGFsbCBhbGwgbmVjZXNzYXJ5IGhhbmRsZXJzLiAqKVxuICAgIGxldCB1cGRhdGUgKCkgPVxuICAgICAgICBtYXRjaCBkYXRhLm9wZXJhdGlvbnMsIGRhdGEuc3VicyB3aXRoXG4gICAgICAgIHwgU2FuZGJveCAoXywgc3ViLCBfKSwgICAgTm9uZVxuICAgICAgICB8IEFwcCAoXywgc3ViLCBfLCBfKSwgICAgIE5vbmVcbiAgICAgICAgfCBFbGVtZW50IChfLCBzdWIsIF8sIF8pLCBOb25lIC0+XG4gICAgICAgICAgICBkYXRhLnN1YnMgPC1cbiAgICAgICAgICAgICAgICBTb21lIChTdWJzY3JpcHRpb25zLm1ha2UgKGRpc3BhdGNoIGRhdGEpIChzdWIgZGF0YS5zdGF0ZSkpXG5cbiAgICAgICAgfCBTYW5kYm94IChfLCBzdWIsIF8pLCAgICBTb21lIHN1YnNcbiAgICAgICAgfCBBcHAgKF8sIHN1YiwgXywgXyksICAgICBTb21lIHN1YnNcbiAgICAgICAgfCBFbGVtZW50IChfLCBzdWIsIF8sIF8pLCBTb21lIHN1YnNcbiAgICAgICAgICAgIHdoZW4gZGF0YS5kaXJ0eSAtPlxuICAgICAgICAgICAgZGF0YS5zdWJzIDwtXG4gICAgICAgICAgICAgICAgU29tZSAoU3Vic2NyaXB0aW9ucy51cGRhdGUgKGRpc3BhdGNoIGRhdGEpIChzdWIgZGF0YS5zdGF0ZSkgc3VicylcblxuICAgICAgICB8IF8sIF8gLT5cbiAgICAgICAgICAgICgpXG4gICAgaW5cbiAgICBBc3NlcnRfZmFpbHVyZS5hdHRlbXB0XG4gICAgICAgIFwiRXhjZXB0aW9uIGluICd1cGRhdGVfc3Vic2NyaXB0aW9ucycgb2YgRm1saWJfYnJvd3NlclwiXG4gICAgICAgIHVwZGF0ZVxuICAgICAgICAoZnVuICgpIC0+ICgpKVxuXG5cblxuXG5cblxuXG5cblxuXG4oKiBQcm9kdWNlIHRoZSByZWFsIGRvbSBpLmUuIHJlbmRlciB0aGUgZG9tXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgVGhpcyBpcyB0aGVyZSB0aGUgYWNjZXNzIHRvIHRoZSByZWFsIGRvbSBvZiB0aGUgYnJvd3NlciBoYXBwZW5zLlxuKilcblxuXG5sZXQgcHV0X2JlbG93X3Jvb3QgKGRhdGE6ICgnc3RhdGUsICdtc2cpIGRhdGEpIChkb206ICdtc2cgZG9tKTogdW5pdCA9XG4gICAgbGV0IHJvb3Rfbm9kZSA9IEVsZW1lbnQubm9kZSBkYXRhLnJvb3QgaW5cbiAgICBOb2RlLnJlbW92ZV9jaGlsZHJlbiByb290X25vZGU7XG4gICAgTm9kZS5hcHBlbmQgKFZkb20uZWxlbWVudCBkb20gfD4gZnN0KSByb290X25vZGVcblxuXG5cblxuXG5sZXQgdmRvbSAoZGF0YTogKCdzLCAnbSkgZGF0YSk6ICdtIFZkb20udCAqICh1bml0IC0+IHVuaXQpID1cbiAgICAoKiBHZXQgdGhlIHZpcnR1YWwgZG9tIGZyb20gdGhlIHN0YXRlIGFuZCB0aGUgdGl0bGUgdXBkYXRlIGZ1bmN0aW9uLiAqKVxuICAgIG1hdGNoIGRhdGEub3BlcmF0aW9ucyB3aXRoXG4gICAgfCBTYW5kYm94ICh2aWV3LCBfLCBfKSAtPlxuICAgICAgICB2aWV3IGRhdGEuc3RhdGUsIChmdW4gKCkgLT4gKCkpXG4gICAgfCBFbGVtZW50ICh2aWV3LCBfLCBfLCBfKSAtPlxuICAgICAgICB2aWV3IGRhdGEuc3RhdGUsIChmdW4gKCkgLT4gKCkpXG4gICAgfCBBcHAgKHZpZXcsIF8sIF8sIF8pIC0+XG4gICAgICAgIGxldCB2ZG9tLCB0aXRsZSA9IHZpZXcgZGF0YS5zdGF0ZSBpblxuICAgICAgICB2ZG9tLCAoZnVuICgpIC0+IERvY3VtZW50LnNldF90aXRsZSB0aXRsZSAoZG9jdW1lbnQgKCkpKVxuXG5cblxuXG5sZXQgdXBkYXRlX2RvbSAoZGF0YTogKCdzdGF0ZSwgJ21zZykgZGF0YSk6IHVuaXQgPVxuICAgICgqIENyZWF0ZSBvciB1cGRhdGUgdGhlIHJlYWwgZG9tIGJhc2VkIG9uIHRoZSBzdGF0ZS4gRmlyc3QgY3JlYXRlIGEgdmlydHVhbFxuICAgICAgIGRvbSBmcm9tIHRoZSBzdGF0ZSBhbmQgdGhlbiBjcmVhdGUgb3IgdXBkYXRlIHRoZSByZWFsIGRvbS4gKilcbiAgICBsZXQgdXBkYXRlICgpID1cbiAgICAgICAgbGV0IHZkb20gZGF0YSA9XG4gICAgICAgICAgICBsZXQgdmRvbSwgc2V0X3RpdGxlID0gdmRvbSBkYXRhIGluXG4gICAgICAgICAgICBzZXRfdGl0bGUgKCk7XG4gICAgICAgICAgICB2ZG9tXG4gICAgICAgIGluXG4gICAgICAgIG1hdGNoIGRhdGEuZG9tIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBsZXQgZG9tID1cbiAgICAgICAgICAgICAgICBWZG9tLm1ha2VcbiAgICAgICAgICAgICAgICAgICAgKGRvbV9vcGVyYXRpb25zIChkaXNwYXRjaCBkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgKHZkb20gZGF0YSlcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBkYXRhLmRvbSA8LSBTb21lIGRvbTtcbiAgICAgICAgICAgIHB1dF9iZWxvd19yb290IGRhdGEgZG9tO1xuXG4gICAgICAgIHwgU29tZSBkb20gLT5cbiAgICAgICAgICAgIGlmIGRhdGEuZGlydHkgdGhlbiBiZWdpblxuICAgICAgICAgICAgICAgIGxldCBkb20sIGNyZWF0ZWQgPVxuICAgICAgICAgICAgICAgICAgICBWZG9tLnVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKGRvbV9vcGVyYXRpb25zIChkaXNwYXRjaCBkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh2ZG9tIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21cbiAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgIGlmIGNyZWF0ZWQgdGhlblxuICAgICAgICAgICAgICAgICAgICBwdXRfYmVsb3dfcm9vdCBkYXRhIGRvbTtcbiAgICAgICAgICAgICAgICBkYXRhLmRvbSA8LSBTb21lIGRvbTtcbiAgICAgICAgICAgIGVuZFxuICAgIGFuZCBjbGVhbnVwICgpID1cbiAgICAgICAgZGF0YS5kaXJ0eSA8LSBmYWxzZVxuICAgIGluXG4gICAgQXNzZXJ0X2ZhaWx1cmUuYXR0ZW1wdFxuICAgICAgICBcIkV4Y2VwdGlvbiBpbiAndXBkYXRlX2RvbScgb2YgRm1saWJfYnJvd3NlclwiXG4gICAgICAgIHVwZGF0ZVxuICAgICAgICBjbGVhbnVwO1xuICAgIGNsZWFudXAgKCk7XG4gICAgYXNzZXJ0IChub3QgZGF0YS5kaXJ0eSlcblxuXG5sZXQgb25fbmV4dF9hbmltYXRpb24gKGY6IGZsb2F0IC0+IHVuaXQpOiB1bml0ID1cbiAgICAoKiBDYWxsICdmJyBvbiBuZXh0IGFuaW1hdGlvbiBmcmFtZS4gKilcbiAgICBXaW5kb3cuKG9uX25leHRfYW5pbWF0aW9uIGYgKGdldCAoKSkpXG5cblxuXG5sZXQgcmVjIGFuaW1hdGUgKGRhdGE6ICgnc3RhdGUsICdtc2cpIGRhdGEpOiBmbG9hdCAtPiB1bml0ID1cbiAgICBmdW4gXyAtPlxuICAgIHVwZGF0ZV9kb20gZGF0YTtcbiAgICBhc3NlcnQgKG5vdCBkYXRhLmRpcnR5KTtcbiAgICBvbl9uZXh0X2FuaW1hdGlvbiAoYW5pbWF0ZSBkYXRhKVxuXG5cblxuXG5cbigqIEhlbHBlciBmdW5jdGlvbiB0byB3cmFwIHVzZXIgc3VwcGxpZWQgZnVuY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5sZXQgd3JhcF9zdGF0ZV9mdW4gKHN0cjogc3RyaW5nKSAoZjogJ3MgLT4gJ2EpIChzdGF0ZTogJ3MpOiAnYSA9XG4gICAgQXNzZXJ0X2ZhaWx1cmUuYXR0ZW1wdFxuICAgICAgICAoXCJFeGNlcHRpb24gaW4gJ1wiIF4gc3RyIF4gXCInXCIpXG4gICAgICAgIChmdW4gKCkgLT4gZiBzdGF0ZSlcbiAgICAgICAgKGZ1biAoKSAtPiAoKSlcblxuXG5sZXQgd3JhcF92aWV3ICh2aWV3OiAncyAtPiAnYSkgKHN0YXRlOiAncyk6ICdhID1cbiAgICB3cmFwX3N0YXRlX2Z1biBcInZpZXdcIiB2aWV3IHN0YXRlXG5cblxubGV0IHdyYXBfc3Vic2NyaXB0aW9uICh2aWV3OiAncyAtPiAnYSkgKHN0YXRlOiAncyk6ICdhID1cbiAgICB3cmFwX3N0YXRlX2Z1biBcInN1YnNjcmlwdGlvaW5cIiB2aWV3IHN0YXRlXG5cblxubGV0IHdyYXBfdXBkYXRlICh1cGRhdGU6ICdzIC0+ICdtIC0+ICdhKSAoc3RhdGU6ICdzKSAobWVzc2FnZTogJ20pOiAnYSA9XG4gICAgQXNzZXJ0X2ZhaWx1cmUuYXR0ZW1wdFxuICAgICAgICBcIkV4Y2VwdGlvbiBpbiAndXBkYXRlJ1wiXG4gICAgICAgIChmdW4gKCkgLT4gdXBkYXRlIHN0YXRlIG1lc3NhZ2UpXG4gICAgICAgIChmdW4gKCkgLT4gKCkpXG5cblxuXG5cblxuXG5cbigqIEhlbHBlciBmdW5jdGlvbiB0byByZWNlaXZlIG1lc3NhZ2VzIGZyb20gamF2YXNjcmlwdFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubGV0IHJlY2VpdmVfbWVzc2FnZVxuICAgICAgICAoZGF0YTogKCdzLCAnbSkgZGF0YSBvcHRpb24gcmVmKVxuICAgIDogQmFzZS5WYWx1ZS50XG4gICAgPVxuICAgICgqIEhhbmRsZXIgZm9yIGluY29taW5nIG1lc3NhZ2VzIGZyb20gamF2YXNjcmlwdC4gKilcbiAgICBsZXQgb3BlbiBCYXNlXG4gICAgaW5cbiAgICBsZXQgcG9zdCAodjogVmFsdWUudCk6IFZhbHVlLnQgPVxuICAgICAgICBtYXRjaCAhZGF0YSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwicmVjZWl2ZV9tZXNzYWdlOiBhcHBsaWNhdGlvbiBub3QgeWV0IGluaXRpYWxpemVkXCI7XG4gICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgIHwgU29tZSBkYXRhIC0+XG4gICAgICAgICAgICBtYXRjaCBkYXRhLnN1YnMgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIFwicmVjZWl2ZV9tZXNzYWdlOiBzdWJzY3JpcHRpb25zIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcIjtcbiAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgICAgICB8IFNvbWUgc3VicyAtPlxuICAgICAgICAgICAgICAgIG1hdGNoIHN1YnMuc3Vicy5tZXNzYWdlIHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBcInJlY2VpdmVfbWVzc2FnZTogZXZlbnQgbm90IHN1YnNjcmliZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICAgICAgICAgIHwgU29tZSBkZWNvZGUgLT5cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggZGVjb2RlIHYgd2l0aFxuICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVjZWl2ZV9tZXNzYWdlOiBjYW5ub3QgZGVjb2RlIG1lc3NhZ2UgZnJvbSBcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBNYWluLmxvZ192YWx1ZSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2ggZGF0YSBtO1xuICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgIGluXG4gICAgVmFsdWUuZnVuY3Rpb24xIHBvc3RcblxuXG5cblxuXG5cbigqIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBhbiBhcHBsaWNhdGlvbiAoZWxlbWVudCBvciBzaW5nbGUgcGFnZSBhcHApXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cblxuXG5sZXQgc3RhcnRfYXBwbGljYXRpb25cbiAgICAgICAgKGRhdGE6ICgncywgJ20pIGRhdGEpXG4gICAgICAgIChjb21tYW5kOiAnbSBDb21tYW5kLnQpXG4gICAgICAgIChwb3N0OiBCYXNlLlZhbHVlLnQgLT4gdW5pdCk6IHVuaXQgPVxuICAgIHVwZGF0ZV9zdWJzY3JpcHRpb25zIGRhdGE7XG4gICAgdXBkYXRlX2RvbSBkYXRhO1xuICAgIENvbW1hbmQuZXhlY3V0ZSBwb3N0IChkaXNwYXRjaF9uZXh0IGRhdGEpIGNvbW1hbmQ7XG4gICAgb25fbmV4dF9hbmltYXRpb24gKGFuaW1hdGUgZGF0YSlcblxuXG5cblxuXG5cblxuXG4oKiBTYW5kYm94IGFwcGxpY2F0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5sZXQgbWFrZV9zYW5kYm94XG4gICAgICAgIChzdGF0ZTogJ3MpXG4gICAgICAgICh2aWV3OiAgICgncywgJ20pIHZpZXcxKVxuICAgICAgICAoc3ViOiAgICAnc3RhdGUgLT4gJ21zZyBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogKCdzLCAnbSkgdXBkYXRlMSlcbiAgICAgICAgKF86ICdhKVxuICAgIDogdW5pdFxuICAgID1cbiAgICAoKiBUaGlzIGZ1bmN0aW9uIGlzIHByb2Nlc3NlZCB3aXRoaW4gdGhlIG9ubG9hZCBldmVudCBvZiB0aGUgYnJvd3NlclxuICAgICAgIHdpbmRvdy5cbiAgICAgKilcblxuICAgICgqIE1ha2UgdGhlIGRhdGEgZm9yIHRoZSBhcHBsaWNhdGlvbi4gKilcbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgc3RhdGU7XG4gICAgICAgIGRpcnR5ICAgICAgPSBmYWxzZTtcbiAgICAgICAgcm9vdCAgICAgICA9IERvY3VtZW50LmJvZHkgKGRvY3VtZW50ICgpKTtcbiAgICAgICAgZG9tICAgICAgICA9IE5vbmU7XG4gICAgICAgIHN1YnMgICAgICAgPSBOb25lO1xuICAgICAgICBvcGVyYXRpb25zID1cbiAgICAgICAgICAgIFNhbmRib3ggKHdyYXBfdmlldyB2aWV3LCB3cmFwX3N1YnNjcmlwdGlvbiBzdWIsIHdyYXBfdXBkYXRlIHVwZGF0ZSlcbiAgICB9XG4gICAgaW5cbiAgICB1cGRhdGVfc3Vic2NyaXB0aW9ucyBkYXRhOyAoKiBJbml0aWFsIHN1YnNjcmlwdGlvbnMgKilcbiAgICB1cGRhdGVfZG9tIGRhdGE7ICAgICAgICAgICAoKiBJbml0aWFsIGRvbS4gKilcblxuICAgICgqIFByb2Nlc3NpbmcgZm9yIHJlcXVlc3RBbmltYXRpb25GcmFtZSAqKVxuICAgIG9uX25leHRfYW5pbWF0aW9uIChhbmltYXRlIGRhdGEpXG5cblxuXG5sZXQgc2FuZGJveFxuICAgICAgICAoc3RhdGU6ICdzdGF0ZSlcbiAgICAgICAgKHZpZXc6ICgnc3RhdGUsICdtc2cpIHZpZXcxKVxuICAgICAgICAodXBkYXRlOiAoJ3N0YXRlLCAnbXNnKSB1cGRhdGUxKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgIFwibG9hZFwiXG4gICAgICAgIChtYWtlX3NhbmRib3ggc3RhdGUgdmlldyAoZnVuIF8gLT4gU3Vic2NyaXB0aW9uLm5vbmUpIHVwZGF0ZSlcbiAgICAgICAgV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpXG5cblxuXG5sZXQgc2FuZGJveF9wbHVzXG4gICAgICAgIChzdGF0ZTogICdzdGF0ZSlcbiAgICAgICAgKHZpZXc6ICAgKCdzdGF0ZSwgJ21zZykgdmlldzEpXG4gICAgICAgIChzdWI6ICAgICdzdGF0ZSAtPiAnbXNnIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAoJ3N0YXRlLCAnbXNnKSB1cGRhdGUxKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgIFwibG9hZFwiXG4gICAgICAgIChtYWtlX3NhbmRib3ggc3RhdGUgdmlldyBzdWIgdXBkYXRlKVxuICAgICAgICBXaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSlcblxuXG5cblxuXG5cblxuXG5cblxuKCogRWxlbWVudCBhcHBsaWNhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxuXG5cbmxldCBpbml0X2VsZW1lbnRcbiAgICAgICAgKGRhdGFyZWY6ICgncywgJ20pIGRhdGEgb3B0aW9uIHJlZilcbiAgICAgICAgKGRlY29kZTogICgncyAqICdtIENvbW1hbmQudCkgQmFzZS5EZWNvZGUudClcbiAgICAgICAgKHZpZXc6ICAgICgncywgJ20pIHZpZXcxKVxuICAgICAgICAoc3ViOiAgICAgJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICAoJ3MsICdtKSB1cGRhdGUyKVxuICAgIDogQmFzZS5WYWx1ZS50XG4gICAgPVxuICAgIGxldCBvcGVuIEJhc2UgaW5cbiAgICBsZXQgZGVjb2RlID1cbiAgICAgICAgbGV0IG9wZW4gRGVjb2RlIGluXG4gICAgICAgIGxldCogcG9zdCAgICAgICA9IGZpZWxkIFwib25NZXNzYWdlXCIgX2Z1bmN0aW9uIGluXG4gICAgICAgIGxldCogc3RhdGUsIGNtZCA9IGZpZWxkIFwiZGF0YVwiIGRlY29kZSBpblxuICAgICAgICBsZXQqIGVsZW1lbnRfaWQgPSBmaWVsZCBcImVsZW1lbnRfaWRcIiBzdHJpbmcgaW5cbiAgICAgICAgcmV0dXJuIChlbGVtZW50X2lkLCBzdGF0ZSwgY21kLCBmdW4gdiAtPiBpZ25vcmUgKHBvc3QgW3x2fF0pKVxuICAgIGluXG4gICAgbGV0IGluaXQgKHY6IFZhbHVlLnQpOiBWYWx1ZS50ID1cbiAgICAgICAgbWF0Y2ggIWRhdGFyZWYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gYmVnaW5cbiAgICAgICAgICAgIG1hdGNoIGRlY29kZSB2IHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcImNhbm5vdCBkZWNvZGUgaW5pdGlhbGlzYXRpb24gZGF0YVwiO1xuICAgICAgICAgICAgICAgIE1haW4ubG9nX3ZhbHVlIHY7XG4gICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICAgICAgfCBTb21lIChlbGVtZW50X2lkLCBzdGF0ZSwgY29tbWFuZCwgcG9zdCkgLT5cbiAgICAgICAgICAgICAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgICAgICAgICAgICAgIFwibG9hZFwiXG4gICAgICAgICAgICAgICAgICAgIChmdW4gXyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIERvbS5Eb2N1bWVudC5maW5kIGVsZW1lbnRfaWQgKGRvY3VtZW50ICgpKSB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFwiQ2Fubm90IGZpbmQgZWxlbWVudCBcIiBeIGVsZW1lbnRfaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIHJvb3QgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tICAgPSBOb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicyAgPSBOb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdmlldyB2aWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3N1YnNjcmlwdGlvbiBzdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdXBkYXRlIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXJlZiA6PSBTb21lIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2FwcGxpY2F0aW9uIGRhdGEgY29tbWFuZCBwb3N0XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpO1xuICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgZW5kXG4gICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJhcHBsaWNhdGlvbiBhbHJlYWR5IGluaXRpYWxpemVkXCI7XG4gICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgaW5cbiAgICBWYWx1ZS5mdW5jdGlvbjEgaW5pdFxuXG5cblxuXG5sZXQgZWxlbWVudFxuICAgICAgICAobmFtZTogc3RyaW5nKVxuICAgICAgICAoZGVjb2RlOiAoJ3MgKiAnbSBDb21tYW5kLnQpIEJhc2UuRGVjb2RlLnQpXG4gICAgICAgICh2aWV3OiAgICgncywgJ20pIHZpZXcxKVxuICAgICAgICAoc3ViczogICAncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogKCdzLCAnbSkgdXBkYXRlMilcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbGV0IF8gPSBkZWNvZGUsIHZpZXcsIHN1YnMsIHVwZGF0ZSBpblxuICAgIGxldCBhcHAgPSByZWYgTm9uZSBpblxuICAgIEJhc2UuTWFpbi5tYWtlX2dsb2JhbFxuICAgICAgICBuYW1lXG4gICAgICAgIEJhc2UuVmFsdWUuKFxuICAgICAgICAgICAgX29iamVjdFxuICAgICAgICAgICAgICAgIFt8IFwiaW5pdFwiLCBpbml0X2VsZW1lbnQgYXBwIGRlY29kZSB2aWV3IHN1YnMgdXBkYXRlXG4gICAgICAgICAgICAgICAgIDsgXCJwb3N0XCIsIHJlY2VpdmVfbWVzc2FnZSBhcHBcbiAgICAgICAgICAgICAgICB8XVxuICAgICAgICApXG5cblxuXG5cblxuXG5cbigqIFNpbmdsZSBQYWdlIEFwcGxpY2F0aW9uXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5cblxuXG5cbmxldCBpbml0X2FwcGxpY2F0aW9uXG4gICAgICAgIChkYXRhcmVmOiAoJ3MsICdtKSBkYXRhIG9wdGlvbiByZWYpXG4gICAgICAgIChkZWNvZGU6ICAoJ3MgKiAnbSBDb21tYW5kLnQpIEJhc2UuRGVjb2RlLnQpXG4gICAgICAgICh2aWV3OiAgICAoJ3MsICdtKSB2aWV3MilcbiAgICAgICAgKHN1YjogICAgICdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAgKCdzLCAnbSkgdXBkYXRlMilcbiAgICA6IEJhc2UuVmFsdWUudFxuICAgID1cbiAgICBsZXQgb3BlbiBCYXNlIGluXG4gICAgbGV0IGRlY29kZSA9XG4gICAgICAgIGxldCBvcGVuIERlY29kZSBpblxuICAgICAgICBsZXQqIHBvc3QgICAgICAgPSBmaWVsZCBcIm9uTWVzc2FnZVwiIF9mdW5jdGlvbiBpblxuICAgICAgICBsZXQqIHN0YXRlLCBjbWQgPSBmaWVsZCBcImRhdGFcIiBkZWNvZGUgaW5cbiAgICAgICAgcmV0dXJuIChzdGF0ZSwgY21kLCBmdW4gdiAtPiBpZ25vcmUgKHBvc3QgW3x2fF0pKVxuICAgIGluXG4gICAgbGV0IGluaXQgKHY6IFZhbHVlLnQpOiBWYWx1ZS50ID1cbiAgICAgICAgbWF0Y2ggIWRhdGFyZWYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gYmVnaW5cbiAgICAgICAgICAgIG1hdGNoIGRlY29kZSB2IHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcImNhbm5vdCBkZWNvZGUgaW5pdGlhbGlzYXRpb24gZGF0YVwiO1xuICAgICAgICAgICAgICAgIE1haW4ubG9nX3ZhbHVlIHY7XG4gICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICAgICAgfCBTb21lIChzdGF0ZSwgY29tbWFuZCwgcG9zdCkgLT5cbiAgICAgICAgICAgICAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgICAgICAgICAgICAgIFwibG9hZFwiXG4gICAgICAgICAgICAgICAgICAgIChmdW4gXyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCAgPSBEb2N1bWVudC5ib2R5IChkb2N1bWVudCAoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSAgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicyAgPSBOb25lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF92aWV3IHZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9zdWJzY3JpcHRpb24gc3ViLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdXBkYXRlIHVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcmVmIDo9IFNvbWUgZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hcHBsaWNhdGlvbiBkYXRhIGNvbW1hbmQgcG9zdFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIFdpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKTtcbiAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgIGVuZFxuICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwiYXBwbGljYXRpb24gYWxyZWFkeSBpbml0aWFsaXplZFwiO1xuICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgIGluXG4gICAgVmFsdWUuZnVuY3Rpb24xIGluaXRcblxuXG5cblxuXG5cbmxldCBhcHBsaWNhdGlvblxuICAgICAgICAobmFtZTogc3RyaW5nKVxuICAgICAgICAoZGVjb2RlOiAoJ3MgKiAnbSBDb21tYW5kLnQpIEJhc2UuRGVjb2RlLnQpXG4gICAgICAgICh2aWV3OiAgICgncywgJ20pIHZpZXcyKVxuICAgICAgICAoc3ViczogICAncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogKCdzLCAnbSkgdXBkYXRlMilcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbGV0IGFwcCA9IHJlZiBOb25lIGluXG4gICAgQmFzZS5NYWluLm1ha2VfZ2xvYmFsXG4gICAgICAgIG5hbWVcbiAgICAgICAgQmFzZS5WYWx1ZS4oXG4gICAgICAgICAgICBfb2JqZWN0XG4gICAgICAgICAgICAgICAgW3wgXCJpbml0XCIsIGluaXRfYXBwbGljYXRpb24gYXBwIGRlY29kZSB2aWV3IHN1YnMgdXBkYXRlXG4gICAgICAgICAgICAgICAgIDsgXCJwb3N0XCIsIHJlY2VpdmVfbWVzc2FnZSBhcHBcbiAgICAgICAgICAgICAgICB8XVxuICAgICAgICApXG5cblxuXG5cblxuXG5sZXQgYmFzaWNfYXBwbGljYXRpb25cbiAgICAgICAgKHN0YXRlOiAgICdzKVxuICAgICAgICAoY29tbWFuZDogJ20gQ29tbWFuZC50KVxuICAgICAgICAodmlldzogICAgKCdzLCAnbSkgdmlldzIpXG4gICAgICAgIChzdWI6ICAgICAncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogICgncywgJ20pIHVwZGF0ZTIpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIGxldCBwb3N0IF8gPSAoKVxuICAgIGluXG4gICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICBcImxvYWRcIlxuICAgICAgICAoZnVuIF8gLT5cbiAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgc3RhdGU7XG4gICAgICAgICAgICAgICAgIGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgIHJvb3QgID0gRG9jdW1lbnQuYm9keSAoZG9jdW1lbnQgKCkpO1xuICAgICAgICAgICAgICAgICBkb20gICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgIHN1YnMgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9XG4gICAgICAgICAgICAgICAgICAgICBBcHAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdmlldyB2aWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfc3Vic2NyaXB0aW9uIHN1YixcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3VwZGF0ZSB1cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgc3RhcnRfYXBwbGljYXRpb24gZGF0YSBjb21tYW5kIHBvc3RcbiAgICAgICAgKVxuICAgICAgICBXaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSk7XG4iLCJtb2R1bGUgUmFuZG9tID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgUmFuZG9tXG5lbmRcblxuXG5cblxuXG5cbm1vZHVsZSBUaW1lID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgVGltZVxuZW5kXG5cblxuXG5cblxuXG5cbm1vZHVsZSBUYXNrID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgVGFza1xuZW5kXG5cblxuXG5cblxubW9kdWxlIFZhbHVlID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgRm1saWJfanMuQmFzZS5WYWx1ZVxuXG4gICAgbGV0IHJlY29yZCA9IF9vYmplY3RcbmVuZFxuXG5cblxuXG5tb2R1bGUgRXZlbnRfZmxhZyA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIEV2ZW50X2ZsYWdcbmVuZFxuXG5cblxuXG5cblxubW9kdWxlIERlY29kZXIgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBGbWxpYl9qcy5CYXNlLkRlY29kZVxuXG5cbiAgICBsZXQgcnVuIChkZWNvZGU6ICdhIHQpICh2OiBWYWx1ZS50KTogJ2Egb3B0aW9uID1cbiAgICAgICAgZGVjb2RlIHZcbmVuZFxuXG5cblxuXG5cblxubW9kdWxlIENvbW1hbmQgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBDb21tYW5kXG5lbmRcblxuXG5cblxuXG5cbm1vZHVsZSBTdWJzY3JpcHRpb24gPVxuc3RydWN0XG4gICAgaW5jbHVkZSBTdWJzY3JpcHRpb25cbmVuZFxuXG5cblxubGV0IGRlYnVnIChzdHI6IHN0cmluZyk6IHVuaXQgPVxuICAgIGxldCBvcGVuIEZtbGliX2pzLkJhc2UuTWFpbiBpblxuICAgIGxvZ19zdHJpbmcgc3RyXG5cblxuXG5sZXQgZGVidWdfdmFsdWUgKHY6IFZhbHVlLnQpOiB1bml0ID1cbiAgICBsZXQgb3BlbiBGbWxpYl9qcy5CYXNlLk1haW4gaW5cbiAgICBsb2dfdmFsdWUgdlxuXG5cblxuXG5tb2R1bGUgQXR0cmlidXRlID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgQXR0cmlidXRlXG5cbiAgICBsZXQgb24gKGtleTogc3RyaW5nKSAoZGVjb2RlOiAnbXNnIERlY29kZXIudCk6ICdtc2cgdCA9XG4gICAgICAgIGhhbmRsZXJcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgRXZlbnRfZmxhZy5ub19zdG9wXG4gICAgICAgICAgICBFdmVudF9mbGFnLm5vX3ByZXZlbnRcbiAgICAgICAgICAgIGRlY29kZVxuXG4gICAgbGV0IG9uX2NsaWNrIChtc2c6ICdtc2cpOiAnbXNnIHQgPVxuICAgICAgICBvbiBcImNsaWNrXCIgKERlY29kZXIucmV0dXJuIG1zZylcblxuXG4gICAgKCogU3R5bGVzICopXG5cbiAgICBsZXQgZm9udF9zaXplIChzaXplOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJmb250LXNpemVcIiBzaXplXG5cbiAgICBsZXQgY29sb3IgKGNvbG9yOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJjb2xvclwiIGNvbG9yXG5cbiAgICBsZXQgYmFja2dyb3VuZF9jb2xvciAoY29sb3I6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImJhY2tncm91bmQtY29sb3JcIiBjb2xvclxuXG4gICAgbGV0IGhlaWdodCAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImhlaWdodFwiIHZhbHVlXG5cbiAgICBsZXQgd2lkdGggKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJ3aWR0aFwiIHZhbHVlXG5cbiAgICBsZXQgbWFyZ2luICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwibWFyZ2luXCIgdmFsdWVcblxuICAgIGxldCBwYWRkaW5nICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwicGFkZGluZ1wiIHZhbHVlXG5cbiAgICBsZXQgYm9yZGVyX3N0eWxlICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiYm9yZGVyLXN0eWxlXCIgdmFsdWVcblxuICAgIGxldCBib3JkZXJfd2lkdGggKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJib3JkZXItd2lkdGhcIiB2YWx1ZVxuXG4gICAgbGV0IGJvcmRlcl9jb2xvciAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImJvcmRlci1jb2xvclwiIHZhbHVlXG5cblxuICAgICgqIEF0dHJpYnV0ZXMgKilcblxuICAgIGxldCBpZCAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJpZFwiIHZhbHVlXG5cbiAgICBsZXQgY2xhc3NfICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcImNsYXNzXCIgdmFsdWVcblxuICAgIGxldCBocmVmICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcImhyZWZcIiB2YWx1ZVxuXG4gICAgbGV0IHNyYyAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJzcmNcIiB2YWx1ZVxuXG4gICAgbGV0IHRpdGxlICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIGF0dHJpYnV0ZSBcInRpdGxlXCIgdmFsdWVcblxuICAgIGxldCB2YWx1ZSAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBwcm9wZXJ0eSBcInZhbHVlXCIgVmFsdWUuKHN0cmluZyB2YWx1ZSlcblxuICAgIGxldCBwbGFjZWhvbGRlciAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJwbGFjZWhvbGRlclwiIHZhbHVlXG5cblxuICAgIGxldCBvbl9pbnB1dCAoZjogc3RyaW5nIC0+ICdtc2cpOiAnbXNnIHQgPVxuICAgICAgICBsZXQgZGVjb2RlID1cbiAgICAgICAgICAgIGxldCBvcGVuIERlY29kZXIgaW5cbiAgICAgICAgICAgIGZpZWxkIFwidGFyZ2V0XCIgKGZpZWxkIFwidmFsdWVcIiAobWFwIGYgc3RyaW5nKSlcbiAgICAgICAgaW5cbiAgICAgICAgaGFuZGxlclxuICAgICAgICAgICAgXCJpbnB1dFwiXG4gICAgICAgICAgICBFdmVudF9mbGFnLnN0b3BcbiAgICAgICAgICAgIEV2ZW50X2ZsYWcubm9fcHJldmVudFxuICAgICAgICAgICAgZGVjb2RlXG5lbmRcblxuXG5cblxuXG5cblxubW9kdWxlIEh0bWwgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBWZG9tXG5cblxuICAgIGxldCBoMSBhdHRycyBub2RlcyA9IG5vZGUgXCJoMVwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGgyIGF0dHJzIG5vZGVzID0gbm9kZSBcImgyXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaDMgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDNcIiBhdHRycyBub2Rlc1xuICAgIGxldCBoNCBhdHRycyBub2RlcyA9IG5vZGUgXCJoNFwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGg1IGF0dHJzIG5vZGVzID0gbm9kZSBcImg1XCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaDYgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDZcIiBhdHRycyBub2Rlc1xuXG4gICAgbGV0IGRpdiBhdHRycyBub2RlcyAgPSBub2RlIFwiZGl2XCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgc3BhbiBhdHRycyBub2RlcyA9IG5vZGUgXCJzcGFuXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgcHJlIGF0dHJzIG5vZGVzICA9IG5vZGUgXCJwcmVcIiBhdHRycyBub2Rlc1xuICAgIGxldCBwIGF0dHJzIG5vZGVzICAgID0gbm9kZSBcInBcIiBhdHRycyBub2Rlc1xuXG4gICAgbGV0IGJ1dHRvbiBhdHRycyBub2RlcyAgID0gbm9kZSBcImJ1dHRvblwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGlucHV0IGF0dHJzIG5vZGVzICAgID0gbm9kZSBcImlucHV0XCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgbGFiZWwgYXR0cnMgbm9kZXMgICAgPSBub2RlIFwibGFiZWxcIiBhdHRycyBub2Rlc1xuICAgIGxldCB0ZXh0YXJlYSBhdHRycyBub2RlcyA9IG5vZGUgXCJ0ZXh0YXJlYVwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHNlbGVjdCBhdHRycyBub2RlcyAgID0gbm9kZSBcInNlbGVjdFwiIGF0dHJzIG5vZGVzXG5cbiAgICBsZXQgb2wgYXR0cnMgbm9kZXMgID0gbm9kZSBcIm9sXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgdWwgYXR0cnMgbm9kZXMgID0gbm9kZSBcInVsXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgbGkgYXR0cnMgbm9kZXMgID0gbm9kZSBcImxpXCIgYXR0cnMgbm9kZXNcblxuICAgIGxldCBzdmdfbm9kZSB0YWcgYXR0cnMgbm9kZXMgPVxuICAgICAgICBub2RlX25zIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB0YWcgYXR0cnMgbm9kZXNcbmVuZFxuXG5cbmluY2x1ZGUgQnJvd3NlclxuIiwib3BlbiBGbWxpYl9icm93c2VyXG5cbnR5cGUgZGF0ZSA9IHtcbiAgICB5ZWFyOiBpbnQ7XG4gICAgbW9udGg6IGludDtcbiAgICBkYXk6IGludDtcbn1cblxuXG50eXBlIGtpbmQgPVxuICAgIHwgT25ld2F5XG4gICAgfCBSZXR1cm5cblxudHlwZSBzdGF0ZSA9XG4gICAgfCBCb29raW5nIG9mIGtpbmQgKiBkYXRlIG9wdGlvbiAqIGRhdGUgb3B0aW9uXG4gICAgfCBCb29rZWQgb2YgZGF0ZSAqIGRhdGUgb3B0aW9uXG5cblxudHlwZSBtc2cgPVxuICAgIHwgU2VsZWN0X29uZXdheVxuICAgIHwgU2VsZWN0X3JldHVyblxuICAgIHwgRmxpZ2h0X2RhdGUgb2YgZGF0ZSBvcHRpb25cbiAgICB8IFJldHVybl9kYXRlIG9mIGRhdGUgb3B0aW9uXG4gICAgfCBCb29rXG4gICAgfCBSZXNldFxuXG5cbmxldCBpbml0OiBzdGF0ZSA9XG4gICAgQm9va2luZyAoT25ld2F5LCBOb25lLCBOb25lKVxuXG5cblxubGV0IHVwZGF0ZSAoc3RhdGU6IHN0YXRlKSAobXNnOiBtc2cpOiBzdGF0ZSA9XG4gICAgbWF0Y2ggbXNnLCBzdGF0ZSB3aXRoXG4gICAgfCBSZXNldCwgXyAtPlxuICAgICAgICBpbml0XG5cbiAgICB8IFNlbGVjdF9vbmV3YXksIEJvb2tpbmcgKF8sIGZsaWdodCwgXykgLT5cbiAgICAgICAgQm9va2luZyAoT25ld2F5LCBmbGlnaHQsIE5vbmUpXG5cbiAgICB8IFNlbGVjdF9yZXR1cm4sIEJvb2tpbmcgKF8sIGZsaWdodCwgcmV0dXJuKSAtPlxuICAgICAgICBCb29raW5nIChSZXR1cm4sIGZsaWdodCwgcmV0dXJuKVxuXG4gICAgfCBCb29rLCBCb29raW5nIChfLCBTb21lIGZsaWdodCwgcmV0dXJuKSAtPlxuICAgICAgICBCb29rZWQgKGZsaWdodCwgcmV0dXJuKVxuXG4gICAgfCBGbGlnaHRfZGF0ZSBmbGlnaHQsIEJvb2tpbmcgKGtpbmQsIF8sIHJldHVybikgLT5cbiAgICAgICAgQm9va2luZyAoa2luZCwgZmxpZ2h0LCByZXR1cm4pXG5cbiAgICB8IFJldHVybl9kYXRlIHJldHVybiwgQm9va2luZyAoa2luZCwgZmxpZ2h0LCBfKSAtPlxuICAgICAgICBCb29raW5nIChraW5kLCBmbGlnaHQsIHJldHVybilcblxuICAgIHwgXyAtPlxuICAgICAgICBhc3NlcnQgZmFsc2UgKCogY2Fubm90IGhhcHBlbiAqKVxuXG5cblxuXG5cblxuXG5cbigqIEhlbHBlciBmdW5jdGlvbnMgZm9yIHZpZXcgZnVuY3Rpb25zXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5cbmxldCBjb21wYXJlIChkMTogZGF0ZSkgKGQyOiBkYXRlKTogaW50ID1cbiAgICBsZXQgY21wX3llYXIgPSBjb21wYXJlIGQxLnllYXIgZDIueWVhciBpblxuICAgIGlmIGNtcF95ZWFyIDw+IDAgdGhlblxuICAgICAgICBjbXBfeWVhclxuICAgIGVsc2VcbiAgICAgICAgbGV0IGNtcF9tb250aCA9IGNvbXBhcmUgZDEubW9udGggZDIubW9udGggaW5cbiAgICAgICAgaWYgY21wX21vbnRoIDw+IDAgdGhlblxuICAgICAgICAgICAgY21wX21vbnRoXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbXBhcmUgZDEuZGF5IGQyLmRheVxuXG5cbmxldCBzdHJpbmdfb2ZfZGF0ZSAoZGF0ZTogZGF0ZSk6IHN0cmluZyA9XG4gICAgbGV0IG9wZW4gUHJpbnRmIGluXG4gICAgKGlmIGRhdGUueWVhciA8IDEwMDAgdGhlblxuICAgICAgICAgc3ByaW50ZiBcIiUwNGRcIiBkYXRlLnllYXJcbiAgICAgZWxzZVxuICAgICAgICAgc3RyaW5nX29mX2ludCBkYXRlLnllYXJcbiAgICApXG4gICAgXiBcIi1cIiBeIHNwcmludGYgXCIlMDJkXCIgZGF0ZS5tb250aFxuICAgIF4gXCItXCIgXiBzcHJpbnRmIFwiJTAyZFwiIGRhdGUuZGF5XG5cblxubGV0IHN0cmluZ19vZl9kYXRlX29wdDogZGF0ZSBvcHRpb24gLT4gc3RyaW5nID1cbiAgICBmdW5jdGlvblxuICAgIHwgTm9uZSAtPlxuICAgICAgICBcIlwiXG4gICAgfCBTb21lIGRhdGUgLT5cbiAgICAgICAgc3RyaW5nX29mX2RhdGUgZGF0ZVxuXG5cbmxldCBkYXRlX29mX3N0cmluZyAoc3RyOiBzdHJpbmcpOiBkYXRlIG9wdGlvbiA9XG4gICAgbWF0Y2ggU3RyaW5nLnNwbGl0X29uX2NoYXIgJy0nIHN0ciB3aXRoXG4gICAgfCBbXCJcIl0gLT5cbiAgICAgICAgTm9uZVxuICAgIHwgW3llYXI7IG1vbnRoOyBkYXldIC0+XG4gICAgICAgIGxldCBvcGVuIEZtbGliX3N0ZC5PcHRpb24gaW5cbiAgICAgICAgbGV0KiB5ZWFyICA9IGludF9vZl9zdHJpbmdfb3B0IHllYXIgaW5cbiAgICAgICAgbGV0KiBtb250aCA9IGludF9vZl9zdHJpbmdfb3B0IG1vbnRoIGluXG4gICAgICAgIGxldCogZGF5ICAgPSBpbnRfb2Zfc3RyaW5nX29wdCBkYXkgaW5cbiAgICAgICAgcmV0dXJuIHt5ZWFyOyBtb250aDsgZGF5fVxuICAgIHwgXyAtPlxuICAgICAgICBhc3NlcnQgZmFsc2UgKCogY2Fubm90IGhhcHBlbiAqKVxuXG5cblxubGV0IGRlY29kZV9kYXRlOiBkYXRlIG9wdGlvbiBEZWNvZGVyLnQgPVxuICAgIGxldCBvcGVuIERlY29kZXIgaW5cbiAgICBmaWVsZCBcInRhcmdldFwiIChmaWVsZCBcInZhbHVlXCIgKG1hcCBkYXRlX29mX3N0cmluZyBzdHJpbmcpKVxuXG5cblxubGV0IGRlY29kZV9zZWxlY3Rpb246IG1zZyBEZWNvZGVyLnQgPVxuICAgIGxldCBvcGVuIERlY29kZXIgaW5cbiAgICBmaWVsZFxuICAgICAgICBcInRhcmdldFwiXG4gICAgICAgIChmaWVsZFxuICAgICAgICAgICAgIFwic2VsZWN0ZWRJbmRleFwiXG4gICAgICAgICAgICAgKG1hcFxuICAgICAgICAgICAgICAgICAgKGZ1biBpIC0+IGlmIGkgPSAwIHRoZW4gU2VsZWN0X29uZXdheSBlbHNlIFNlbGVjdF9yZXR1cm4pXG4gICAgICAgICAgICAgICAgICBpbnQpKVxuXG5cblxuXG5cblxuKCogVmlldyBmdW5jdGlvbnNcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbmxldCB2aWV3X2RhdGVfb3B0XG4gICAgICAgIChkYXRlOiBkYXRlIG9wdGlvbilcbiAgICAgICAgKHR4dDogc3RyaW5nKVxuICAgICAgICAoZGVjb2RlOiBtc2cgRGVjb2Rlci50KVxuICAgIDogbXNnIEh0bWwudFxuICAgID1cbiAgICBsZXQgb3BlbiBIdG1sIGluXG4gICAgbGV0IG9wZW4gQXR0cmlidXRlIGluXG4gICAgcCBbXSBbXG4gICAgICAgIGxhYmVsIFtdIFtcbiAgICAgICAgICAgIGlucHV0IFtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgXCJ0eXBlXCIgXCJkYXRlXCJcbiAgICAgICAgICAgICAgOyB2YWx1ZSAoc3RyaW5nX29mX2RhdGVfb3B0IGRhdGUpXG4gICAgICAgICAgICAgIDsgb24gXCJpbnB1dFwiIGRlY29kZVxuICAgICAgICAgICAgXSBbXVxuICAgICAgICAgIDsgdGV4dCB0eHRcbiAgICAgICAgXVxuICAgIF1cblxuXG5sZXQgdmlld19ib29raW5nXG4gICAgICAgIChraW5kOiBraW5kKVxuICAgICAgICAoZmxpZ2h0OiBkYXRlIG9wdGlvbilcbiAgICAgICAgKHJldHVybjogZGF0ZSBvcHRpb24pXG4gICAgOiBtc2cgSHRtbC50XG4gICAgPVxuICAgIGxldCBvcGVuIEh0bWwgaW5cbiAgICBsZXQgb3BlbiBBdHRyaWJ1dGUgaW5cbiAgICBsZXQgZGF0ZSBkIGxhYiBkZWMgPVxuICAgICAgICB2aWV3X2RhdGVfb3B0IGQgbGFiIGRlY1xuICAgIGFuZCBkZWNvZGVfZmxpZ2h0ID1cbiAgICAgICAgRGVjb2Rlci5tYXAgKGZ1biBkYXRlIC0+IEZsaWdodF9kYXRlIGRhdGUpIGRlY29kZV9kYXRlXG4gICAgYW5kIGRlY29kZV9yZXR1cm4gPVxuICAgICAgICBEZWNvZGVyLm1hcCAoZnVuIGRhdGUgLT4gUmV0dXJuX2RhdGUgZGF0ZSkgZGVjb2RlX2RhdGVcbiAgICBpblxuICAgIGxldCBkYXRlcyA9XG4gICAgICAgIG1hdGNoIGtpbmQgd2l0aFxuICAgICAgICB8IE9uZXdheSAtPlxuICAgICAgICAgICAgW2RhdGUgZmxpZ2h0IFwiXCIgZGVjb2RlX2ZsaWdodF1cbiAgICAgICAgfCBSZXR1cm4gLT5cbiAgICAgICAgICAgIFtkYXRlIGZsaWdodCBcIiBmbGlnaHRcIiBkZWNvZGVfZmxpZ2h0XG4gICAgICAgICAgICA7IGRhdGUgcmV0dXJuIFwiIHJldHVybiBmbGlnaHRcIiBkZWNvZGVfcmV0dXJuXVxuICAgIGFuZCBib29rX2J1dHRvbiA9XG4gICAgICAgIG1hdGNoIGtpbmQsIGZsaWdodCwgcmV0dXJuIHdpdGhcbiAgICAgICAgfCBPbmV3YXksIFNvbWUgXywgXyAtPlxuICAgICAgICAgICAgW3AgW10gW2J1dHRvbiBbb25fY2xpY2sgQm9va10gW3RleHQgXCJCb29rXCJdXV1cbiAgICAgICAgfCBSZXR1cm4sIFNvbWUgZDEsIFNvbWUgZDIgLT5cbiAgICAgICAgICAgIGlmIGNvbXBhcmUgZDEgZDIgPCAwIHRoZW5cbiAgICAgICAgICAgICAgICBbcCBbXSBbYnV0dG9uIFtvbl9jbGljayBCb29rXSBbdGV4dCBcIkJvb2tcIl1dXVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIFtwXG4gICAgICAgICAgICAgICAgICAgICBbY29sb3IgXCJyZWRcIl1cbiAgICAgICAgICAgICAgICAgICAgIFt0ZXh0IFwicmV0dXJuIGZsaWdodCBoYXMgdG8gYmUgYWZ0ZXIgdGhlIGZsaWdodFwiXVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICBbXVxuICAgIGFuZCBvbmVfd2F5ID1cbiAgICAgICAgbWF0Y2gga2luZCB3aXRoICBPbmV3YXkgLT4gdHJ1ZSB8IFJldHVybiAtPiBmYWxzZVxuICAgIGluXG4gICAgZGl2IFtdXG4gICAgICAgIChcbiAgICAgICAgICAgIGgxIFtdIFt0ZXh0IFwiQm9vayB5b3VyIGZsaWdodFwiXVxuICAgICAgICAgICAgOjpcbiAgICAgICAgICAgIHNlbGVjdFxuICAgICAgICAgICAgICAgIFtvbiBcImNoYW5nZVwiIGRlY29kZV9zZWxlY3Rpb25dXG4gICAgICAgICAgICAgICAgWyAgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICBcIm9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtwcm9wZXJ0eSBcInNlbGVjdGVkXCIgVmFsdWUuKGJvb2wgb25lX3dheSldXG4gICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0IFwiT25lIHdheVwiXVxuICAgICAgICAgICAgICAgIDsgbm9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Byb3BlcnR5IFwic2VsZWN0ZWRcIiBWYWx1ZS4oYm9vbCAobm90IG9uZV93YXkpKV1cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0IFwiUmV0dXJuXCJdXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOjpcbiAgICAgICAgICAgIChkYXRlcyBAIGJvb2tfYnV0dG9uKVxuICAgICAgICApXG5cblxuXG5sZXQgdmlld19ib29rZWRcbiAgICAgICAgKGZsaWdodDogZGF0ZSlcbiAgICAgICAgKHJldHVybjogZGF0ZSBvcHRpb24pXG4gICAgOiBtc2cgSHRtbC50XG4gICAgPVxuICAgIGxldCBvcGVuIEh0bWwgaW5cbiAgICBsZXQgb3BlbiBBdHRyaWJ1dGUgaW5cbiAgICBsZXQgZGF0ZV9lbGVtZW50IHR4dCBkYXRlID1cbiAgICAgICAgcCBbXSBbXG4gICAgICAgICAgICBsYWJlbCBbXSBbXG4gICAgICAgICAgICAgICAgaW5wdXQgWyBhdHRyaWJ1dGUgXCJ0eXBlXCIgXCJkYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICA7IGF0dHJpYnV0ZSBcInJlYWRPbmx5XCIgXCJcIlxuICAgICAgICAgICAgICAgICAgICAgIDsgdmFsdWUgKHN0cmluZ19vZl9kYXRlIGRhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgXVtdXG4gICAgICAgICAgICAgIDsgdGV4dCB0eHRcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIGluXG4gICAgbGV0IHJlc2V0ID1cbiAgICAgICAgW3AgW10gW2J1dHRvbiBbb25fY2xpY2sgUmVzZXRdIFt0ZXh0IFwiTmV3IGJvb2tpbmdcIl1dXVxuICAgIGluXG4gICAgbGV0IGxzdCA9XG4gICAgICAgIG1hdGNoIHJldHVybiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcmVzZXRcbiAgICAgICAgfCBTb21lIHJldHVybiAtPlxuICAgICAgICAgICAgZGF0ZV9lbGVtZW50IFwiIHJldHVybiBmbGlnaHRcIiByZXR1cm4gOjogcmVzZXRcbiAgICBpblxuXG4gICAgZGl2IFtdIChcbiAgICAgICAgaDEgW10gW3RleHQgXCJCb29raW5nIENvbmZpcm1hdGlvblwiXVxuICAgICAgICA6OlxuICAgICAgICBkYXRlX2VsZW1lbnQgXCIgZmxpZ2h0XCIgZmxpZ2h0XG4gICAgICAgIDo6XG4gICAgICAgIGxzdFxuICAgIClcblxuXG5cbmxldCB2aWV3OiBzdGF0ZSAtPiBtc2cgSHRtbC50ID1cbiAgICBmdW5jdGlvblxuICAgIHwgQm9va2luZyAoa2luZCwgZmxpZ2h0LCByZXR1cm4pIC0+XG4gICAgICAgIHZpZXdfYm9va2luZyBraW5kIGZsaWdodCByZXR1cm5cbiAgICB8IEJvb2tlZCAoZmxpZ2h0LCByZXR1cm4pIC0+XG4gICAgICAgIHZpZXdfYm9va2VkIGZsaWdodCByZXR1cm5cblxuXG5cbmxldCBfID1cbiAgICBzYW5kYm94IGluaXQgdmlldyB1cGRhdGVcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogRW5zdXJlIHRoYXQgW2F0X2V4aXRdIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgcHJvZ3JhbSAqKVxuXG5sZXQgXyA9IGRvX2F0X2V4aXQoKVxuIl19 diff --git a/webapp/index.html b/webapp/index.html new file mode 100644 index 00000000..5c757b70 --- /dev/null +++ b/webapp/index.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + diff --git a/webapp/temperature.html b/webapp/temperature.html new file mode 100644 index 00000000..f0e438ab --- /dev/null +++ b/webapp/temperature.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/webapp/temperature.js b/webapp/temperature.js new file mode 100644 index 00000000..14b45675 --- /dev/null +++ b/webapp/temperature.js @@ -0,0 +1,66479 @@ +//# 1 ".temperature.eobjs/jsoo/temperature.bc.runtime.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=runtime, use-js-string=true, version=5.1.1 + +//# 7 ".temperature.eobjs/jsoo/temperature.bc.runtime.js" +(function + (Object){ + typeof globalThis !== "object" + && + (this + ? get() + : (Object.defineProperty + (Object.prototype, "_T_", {configurable: true, get: get}), + _T_)); + function get(){ + var global = this || self; + global.globalThis = global; + delete Object.prototype._T_; + } + } + (Object)); +(function(globalThis){ + "use strict"; + function caml_int64_is_zero(x){return + x.isZero();} + function caml_str_repeat(n, s){ + if(n == 0) return ""; + if(s.repeat) return s.repeat(n); + var r = "", l = 0; + for(;;){ + if(n & 1) r += s; + n >>= 1; + if(n == 0) return r; + s += s; + l++; + if(l == 9) s.slice(0, 1); + } + } + var caml_int64_offset = Math.pow(2, - 24); + function caml_raise_constant(tag){throw tag;} + var caml_global_data = [0]; + function caml_raise_zero_divide(){ + caml_raise_constant(caml_global_data.Division_by_zero); + } + function MlInt64(lo, mi, hi){ + this.lo = lo & 0xffffff; + this.mi = mi & 0xffffff; + this.hi = hi & 0xffff; + } + MlInt64.prototype.caml_custom = "_j"; + MlInt64.prototype.copy = + function(){return new MlInt64(this.lo, this.mi, this.hi);}; + MlInt64.prototype.ucompare = + function(x){ + if(this.hi > x.hi) return 1; + if(this.hi < x.hi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.compare = + function(x){ + var hi = this.hi << 16, xhi = x.hi << 16; + if(hi > xhi) return 1; + if(hi < xhi) return - 1; + if(this.mi > x.mi) return 1; + if(this.mi < x.mi) return - 1; + if(this.lo > x.lo) return 1; + if(this.lo < x.lo) return - 1; + return 0; + }; + MlInt64.prototype.neg = + function(){ + var + lo = - this.lo, + mi = - this.mi + (lo >> 24), + hi = - this.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.add = + function(x){ + var + lo = this.lo + x.lo, + mi = this.mi + x.mi + (lo >> 24), + hi = this.hi + x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.sub = + function(x){ + var + lo = this.lo - x.lo, + mi = this.mi - x.mi + (lo >> 24), + hi = this.hi - x.hi + (mi >> 24); + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.mul = + function(x){ + var + lo = this.lo * x.lo, + mi = (lo * caml_int64_offset | 0) + this.mi * x.lo + this.lo * x.mi, + hi = + (mi * caml_int64_offset | 0) + this.hi * x.lo + this.mi * x.mi + + this.lo * x.hi; + return new MlInt64(lo, mi, hi); + }; + MlInt64.prototype.isZero = + function(){return (this.lo | this.mi | this.hi) == 0;}; + MlInt64.prototype.isNeg = function(){return this.hi << 16 < 0;}; + MlInt64.prototype.and = + function(x){ + return new MlInt64(this.lo & x.lo, this.mi & x.mi, this.hi & x.hi); + }; + MlInt64.prototype.or = + function(x){ + return new MlInt64(this.lo | x.lo, this.mi | x.mi, this.hi | x.hi); + }; + MlInt64.prototype.xor = + function(x){ + return new MlInt64(this.lo ^ x.lo, this.mi ^ x.mi, this.hi ^ x.hi); + }; + MlInt64.prototype.shift_left = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo << s, + this.mi << s | this.lo >> 24 - s, + this.hi << s | this.mi >> 24 - s); + if(s < 48) + return new + MlInt64 + (0, this.lo << s - 24, this.mi << s - 24 | this.lo >> 48 - s); + return new MlInt64(0, 0, this.lo << s - 48); + }; + MlInt64.prototype.shift_right_unsigned = + function(s){ + s = s & 63; + if(s == 0) return this; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | this.hi << 24 - s, + this.hi >> s); + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, this.hi >> s - 24, 0); + return new MlInt64(this.hi >> s - 48, 0, 0); + }; + MlInt64.prototype.shift_right = + function(s){ + s = s & 63; + if(s == 0) return this; + var h = this.hi << 16 >> 16; + if(s < 24) + return new + MlInt64 + (this.lo >> s | this.mi << 24 - s, + this.mi >> s | h << 24 - s, + this.hi << 16 >> s >>> 16); + var sign = this.hi << 16 >> 31; + if(s < 48) + return new + MlInt64 + (this.mi >> s - 24 | this.hi << 48 - s, + this.hi << 16 >> s - 24 >> 16, + sign & 0xffff); + return new MlInt64(this.hi << 16 >> s - 32, sign, sign); + }; + MlInt64.prototype.lsl1 = + function(){ + this.hi = this.hi << 1 | this.mi >> 23; + this.mi = (this.mi << 1 | this.lo >> 23) & 0xffffff; + this.lo = this.lo << 1 & 0xffffff; + }; + MlInt64.prototype.lsr1 = + function(){ + this.lo = (this.lo >>> 1 | this.mi << 23) & 0xffffff; + this.mi = (this.mi >>> 1 | this.hi << 23) & 0xffffff; + this.hi = this.hi >>> 1; + }; + MlInt64.prototype.udivmod = + function(x){ + var + offset = 0, + modulus = this.copy(), + divisor = x.copy(), + quotient = new MlInt64(0, 0, 0); + while(modulus.ucompare(divisor) > 0){offset++; divisor.lsl1();} + while(offset >= 0){ + offset--; + quotient.lsl1(); + if(modulus.ucompare(divisor) >= 0){ + quotient.lo++; + modulus = modulus.sub(divisor); + } + divisor.lsr1(); + } + return {quotient: quotient, modulus: modulus}; + }; + MlInt64.prototype.div = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi ^ y.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var q = x.udivmod(y).quotient; + if(sign & 0x8000) q = q.neg(); + return q; + }; + MlInt64.prototype.mod = + function(y){ + var x = this; + if(y.isZero()) caml_raise_zero_divide(); + var sign = x.hi; + if(x.hi & 0x8000) x = x.neg(); + if(y.hi & 0x8000) y = y.neg(); + var r = x.udivmod(y).modulus; + if(sign & 0x8000) r = r.neg(); + return r; + }; + MlInt64.prototype.toInt = function(){return this.lo | this.mi << 24;}; + MlInt64.prototype.toFloat = + function(){ + return (this.hi << 16) * Math.pow(2, 32) + this.mi * Math.pow(2, 24) + + this.lo; + }; + MlInt64.prototype.toArray = + function(){ + return [this.hi >> 8, + this.hi & 0xff, + this.mi >> 16, + this.mi >> 8 & 0xff, + this.mi & 0xff, + this.lo >> 16, + this.lo >> 8 & 0xff, + this.lo & 0xff]; + }; + MlInt64.prototype.lo32 = + function(){return this.lo | (this.mi & 0xff) << 24;}; + MlInt64.prototype.hi32 = + function(){return this.mi >>> 8 & 0xffff | this.hi << 16;}; + function caml_int64_of_int32(x){ + return new MlInt64(x & 0xffffff, x >> 24 & 0xffffff, x >> 31 & 0xffff); + } + function caml_int64_to_int32(x){return x.toInt();} + function caml_int64_is_negative(x){return + x.isNeg();} + function caml_int64_neg(x){return x.neg();} + function caml_jsbytes_of_string(x){return x;} + function jsoo_sys_getenv(n){ + var process = globalThis.process; + if(process && process.env && process.env[n] != undefined) + return process.env[n]; + if(globalThis.jsoo_static_env && globalThis.jsoo_static_env[n]) + return globalThis.jsoo_static_env[n]; + } + var caml_record_backtrace_flag = 0; + (function(){ + var r = jsoo_sys_getenv("OCAMLRUNPARAM"); + if(r !== undefined){ + var l = r.split(","); + for(var i = 0; i < l.length; i++) + if(l[i] == "b"){ + caml_record_backtrace_flag = 1; + break; + } + else if(l[i].startsWith("b=")) + caml_record_backtrace_flag = + l[i].slice(2); + else + continue; + } + } + ()); + function caml_exn_with_js_backtrace(exn, force){ + if(! exn.js_error || force || exn[0] == 248) + exn.js_error = new globalThis.Error("Js exception containing backtrace"); + return exn; + } + function caml_maybe_attach_backtrace(exn, force){ + return caml_record_backtrace_flag + ? caml_exn_with_js_backtrace(exn, force) + : exn; + } + function caml_raise_with_arg(tag, arg){ + throw caml_maybe_attach_backtrace([0, tag, arg]); + } + function caml_string_of_jsbytes(x){return x;} + function caml_raise_with_string(tag, msg){ + caml_raise_with_arg(tag, caml_string_of_jsbytes(msg)); + } + function caml_invalid_argument(msg){ + caml_raise_with_string(caml_global_data.Invalid_argument, msg); + } + function caml_parse_format(fmt){ + fmt = caml_jsbytes_of_string(fmt); + var len = fmt.length; + if(len > 31) caml_invalid_argument("format_int: format too long"); + var + f = + {justify: "+", + signstyle: "-", + filler: " ", + alternate: false, + base: 0, + signedconv: false, + width: 0, + uppercase: false, + sign: 1, + prec: - 1, + conv: "f"}; + for(var i = 0; i < len; i++){ + var c = fmt.charAt(i); + switch(c){ + case "-": + f.justify = "-"; break; + case "+": + case " ": + f.signstyle = c; break; + case "0": + f.filler = "0"; break; + case "#": + f.alternate = true; break; + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + f.width = 0; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.width = f.width * 10 + c; i++;} + i--; + break; + case ".": + f.prec = 0; + i++; + while(c = fmt.charCodeAt(i) - 48, c >= 0 && c <= 9){f.prec = f.prec * 10 + c; i++;} + i--; + case "d": + case "i": + f.signedconv = true; + case "u": + f.base = 10; break; + case "x": + f.base = 16; break; + case "X": + f.base = 16; f.uppercase = true; break; + case "o": + f.base = 8; break; + case "e": + case "f": + case "g": + f.signedconv = true; f.conv = c; break; + case "E": + case "F": + case "G": + f.signedconv = true; + f.uppercase = true; + f.conv = c.toLowerCase(); + break; + } + } + return f; + } + function caml_finish_formatting(f, rawbuffer){ + if(f.uppercase) rawbuffer = rawbuffer.toUpperCase(); + var len = rawbuffer.length; + if(f.signedconv && (f.sign < 0 || f.signstyle != "-")) len++; + if(f.alternate){if(f.base == 8) len += 1; if(f.base == 16) len += 2;} + var buffer = ""; + if(f.justify == "+" && f.filler == " ") + for(var i = len; i < f.width; i++) buffer += " "; + if(f.signedconv) + if(f.sign < 0) + buffer += "-"; + else if(f.signstyle != "-") buffer += f.signstyle; + if(f.alternate && f.base == 8) buffer += "0"; + if(f.alternate && f.base == 16) buffer += f.uppercase ? "0X" : "0x"; + if(f.justify == "+" && f.filler == "0") + for(var i = len; i < f.width; i++) buffer += "0"; + buffer += rawbuffer; + if(f.justify == "-") for(var i = len; i < f.width; i++) buffer += " "; + return caml_string_of_jsbytes(buffer); + } + function caml_int64_format(fmt, x){ + var f = caml_parse_format(fmt); + if(f.signedconv && caml_int64_is_negative(x)){f.sign = - 1; x = caml_int64_neg(x);} + var + buffer = "", + wbase = caml_int64_of_int32(f.base), + cvtbl = "0123456789abcdef"; + do{ + var p = x.udivmod(wbase); + x = p.quotient; + buffer = cvtbl.charAt(caml_int64_to_int32(p.modulus)) + buffer; + } + while + (! caml_int64_is_zero(x)); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - buffer.length; + if(n > 0) buffer = caml_str_repeat(n, "0") + buffer; + } + return caml_finish_formatting(f, buffer); + } + function caml_expm1_float(x){return Math.expm1(x);} + function caml_ml_condition_broadcast(t){return 0;} + function jsoo_is_ascii(s){ + if(s.length < 24){ + for(var i = 0; i < s.length; i++) if(s.charCodeAt(i) > 127) return false; + return true; + } + else + return ! /[^\x00-\x7f]/.test(s); + } + function caml_utf16_of_utf8(s){ + for(var b = "", t = "", c, c1, c2, v, i = 0, l = s.length; i < l; i++){ + c1 = s.charCodeAt(i); + if(c1 < 0x80){ + for(var j = i + 1; j < l && (c1 = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + v = 1; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c1 << 6); + if(c1 < 0xe0){ + v = c - 0x3080; + if(v < 0x80) v = 1; + } + else{ + v = 2; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128){ + c = c2 + (c << 6); + if(c1 < 0xf0){ + v = c - 0xe2080; + if(v < 0x800 || v >= 0xd7ff && v < 0xe000) v = 2; + } + else{ + v = 3; + if(++i < l && ((c2 = s.charCodeAt(i)) & - 64) == 128 && c1 < 0xf5){ + v = c2 - 0x3c82080 + (c << 6); + if(v < 0x10000 || v > 0x10ffff) v = 3; + } + } + } + } + } + if(v < 4){ + i -= v; + t += "\ufffd"; + } + else if(v > 0xffff) + t += String.fromCharCode(0xd7c0 + (v >> 10), 0xdc00 + (v & 0x3FF)); + else + t += String.fromCharCode(v); + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_jsstring_of_string(s){ + if(jsoo_is_ascii(s)) return s; + return caml_utf16_of_utf8(s); + } + function fs_node_supported(){ + return typeof globalThis.process !== "undefined" + && typeof globalThis.process.versions !== "undefined" + && typeof globalThis.process.versions.node !== "undefined"; + } + function make_path_is_absolute(){ + function posix(path){ + if(path.charAt(0) === "/") return ["", path.substring(1)]; + return; + } + function win32(path){ + var + splitDeviceRe = + /^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/, + result = splitDeviceRe.exec(path), + device = result[1] || "", + isUnc = Boolean(device && device.charAt(1) !== ":"); + if(Boolean(result[2] || isUnc)){ + var root = result[1] || "", sep = result[2] || ""; + return [root, path.substring(root.length + sep.length)]; + } + return; + } + return fs_node_supported() && globalThis.process + && globalThis.process.platform + ? globalThis.process.platform === "win32" ? win32 : posix + : posix; + } + var path_is_absolute = make_path_is_absolute(); + function caml_trailing_slash(name){ + return name.slice(- 1) !== "/" ? name + "/" : name; + } + if(fs_node_supported() && globalThis.process && globalThis.process.cwd) + var caml_current_dir = globalThis.process.cwd().replace(/\\/g, "/"); + else + var caml_current_dir = "/static"; + caml_current_dir = caml_trailing_slash(caml_current_dir); + function caml_make_path(name){ + name = caml_jsstring_of_string(name); + if(! path_is_absolute(name)) name = caml_current_dir + name; + var + comp0 = path_is_absolute(name), + comp = comp0[1].split("/"), + ncomp = []; + for(var i = 0; i < comp.length; i++) + switch(comp[i]){ + case "..": + if(ncomp.length > 1) ncomp.pop(); break; + case ".": break; + case "": break; + default: ncomp.push(comp[i]); break; + } + ncomp.unshift(comp0[0]); + ncomp.orig = name; + return ncomp; + } + function caml_utf8_of_utf16(s){ + for(var b = "", t = b, c, d, i = 0, l = s.length; i < l; i++){ + c = s.charCodeAt(i); + if(c < 0x80){ + for(var j = i + 1; j < l && (c = s.charCodeAt(j)) < 0x80; j++) ; + if(j - i > 512){ + t.substr(0, 1); + b += t; + t = ""; + b += s.slice(i, j); + } + else + t += s.slice(i, j); + if(j == l) break; + i = j; + } + if(c < 0x800){ + t += String.fromCharCode(0xc0 | c >> 6); + t += String.fromCharCode(0x80 | c & 0x3f); + } + else if(c < 0xd800 || c >= 0xdfff) + t += + String.fromCharCode + (0xe0 | c >> 12, 0x80 | c >> 6 & 0x3f, 0x80 | c & 0x3f); + else if + (c >= 0xdbff || i + 1 == l || (d = s.charCodeAt(i + 1)) < 0xdc00 + || d > 0xdfff) + t += "\xef\xbf\xbd"; + else{ + i++; + c = (c << 10) + d - 0x35fdc00; + t += + String.fromCharCode + (0xf0 | c >> 18, + 0x80 | c >> 12 & 0x3f, + 0x80 | c >> 6 & 0x3f, + 0x80 | c & 0x3f); + } + if(t.length > 1024){t.substr(0, 1); b += t; t = "";} + } + return b + t; + } + function caml_string_of_jsstring(s){ + return jsoo_is_ascii(s) + ? caml_string_of_jsbytes(s) + : caml_string_of_jsbytes(caml_utf8_of_utf16(s)); + } + var + unix_error = + ["E2BIG", + "EACCES", + "EAGAIN", + "EBADF", + "EBUSY", + "ECHILD", + "EDEADLK", + "EDOM", + "EEXIST", + "EFAULT", + "EFBIG", + "EINTR", + "EINVAL", + "EIO", + "EISDIR", + "EMFILE", + "EMLINK", + "ENAMETOOLONG", + "ENFILE", + "ENODEV", + "ENOENT", + "ENOEXEC", + "ENOLCK", + "ENOMEM", + "ENOSPC", + "ENOSYS", + "ENOTDIR", + "ENOTEMPTY", + "ENOTTY", + "ENXIO", + "EPERM", + "EPIPE", + "ERANGE", + "EROFS", + "ESPIPE", + "ESRCH", + "EXDEV", + "EWOULDBLOCK", + "EINPROGRESS", + "EALREADY", + "ENOTSOCK", + "EDESTADDRREQ", + "EMSGSIZE", + "EPROTOTYPE", + "ENOPROTOOPT", + "EPROTONOSUPPORT", + "ESOCKTNOSUPPORT", + "EOPNOTSUPP", + "EPFNOSUPPORT", + "EAFNOSUPPORT", + "EADDRINUSE", + "EADDRNOTAVAIL", + "ENETDOWN", + "ENETUNREACH", + "ENETRESET", + "ECONNABORTED", + "ECONNRESET", + "ENOBUFS", + "EISCONN", + "ENOTCONN", + "ESHUTDOWN", + "ETOOMANYREFS", + "ETIMEDOUT", + "ECONNREFUSED", + "EHOSTDOWN", + "EHOSTUNREACH", + "ELOOP", + "EOVERFLOW"]; + function make_unix_err_args(code, syscall, path, errno){ + var variant = unix_error.indexOf(code); + if(variant < 0){if(errno == null) errno = - 9999; variant = [0, errno];} + var + args = + [variant, + caml_string_of_jsstring(syscall || ""), + caml_string_of_jsstring(path || "")]; + return args; + } + var caml_named_values = {}; + function caml_named_value(nm){return caml_named_values[nm];} + function caml_raise_with_args(tag, args){ + throw caml_maybe_attach_backtrace([0, tag].concat(args)); + } + function caml_subarray_to_jsbytes(a, i, len){ + var f = String.fromCharCode; + if(i == 0 && len <= 4096 && len == a.length) return f.apply(null, a); + var s = ""; + for(; 0 < len; i += 1024, len -= 1024) + s += f.apply(null, a.slice(i, i + Math.min(len, 1024))); + return s; + } + function caml_convert_string_to_bytes(s){ + if(s.t == 2) + s.c += caml_str_repeat(s.l - s.c.length, "\0"); + else + s.c = caml_subarray_to_jsbytes(s.c, 0, s.c.length); + s.t = 0; + } + function MlBytes(tag, contents, length){ + this.t = tag; + this.c = contents; + this.l = length; + } + MlBytes.prototype.toString = + function(){ + switch(this.t){ + case 9: + return this.c; + default: caml_convert_string_to_bytes(this); + case 0: + if(jsoo_is_ascii(this.c)){this.t = 9; return this.c;} this.t = 8; + case 8: + return this.c; + } + }; + MlBytes.prototype.toUtf16 = + function(){ + var r = this.toString(); + if(this.t == 9) return r; + return caml_utf16_of_utf8(r); + }; + MlBytes.prototype.slice = + function(){ + var content = this.t == 4 ? this.c.slice() : this.c; + return new MlBytes(this.t, content, this.l); + }; + function caml_is_ml_bytes(s){return s instanceof MlBytes;} + function caml_is_ml_string(s){ + return typeof s === "string" && ! /[^\x00-\xff]/.test(s); + } + function caml_bytes_of_array(a){ + if(! (a instanceof Uint8Array)) a = new Uint8Array(a); + return new MlBytes(4, a, a.length); + } + function caml_bytes_of_jsbytes(s){return new MlBytes(0, s, s.length);} + function caml_bytes_of_string(s){ + return caml_bytes_of_jsbytes(caml_jsbytes_of_string(s)); + } + function caml_raise_sys_error(msg){ + caml_raise_with_string(caml_global_data.Sys_error, msg); + } + function caml_raise_no_such_file(name){ + caml_raise_sys_error(name + ": No such file or directory"); + } + function caml_convert_bytes_to_array(s){ + var a = new Uint8Array(s.l), b = s.c, l = b.length, i = 0; + for(; i < l; i++) a[i] = b.charCodeAt(i); + for(l = s.l; i < l; i++) a[i] = 0; + s.c = a; + s.t = 4; + return a; + } + function caml_uint8_array_of_bytes(s){ + if(s.t != 4) caml_convert_bytes_to_array(s); + return s.c; + } + function caml_create_bytes(len){ + if(len < 0) caml_invalid_argument("Bytes.create"); + return new MlBytes(len ? 2 : 9, "", len); + } + function caml_ml_bytes_length(s){return s.l;} + function caml_blit_bytes(s1, i1, s2, i2, len){ + if(len == 0) return 0; + if(i2 == 0 && (len >= s2.l || s2.t == 2 && len >= s2.c.length)){ + s2.c = + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else if(s2.t == 2 && i2 == s2.c.length){ + s2.c += + s1.t == 4 + ? caml_subarray_to_jsbytes(s1.c, i1, len) + : i1 == 0 && s1.c.length == len ? s1.c : s1.c.substr(i1, len); + s2.t = s2.c.length == s2.l ? 0 : 2; + } + else{ + if(s2.t != 4) caml_convert_bytes_to_array(s2); + var c1 = s1.c, c2 = s2.c; + if(s1.t == 4) + if(i2 <= i1) + for(var i = 0; i < len; i++) c2[i2 + i] = c1[i1 + i]; + else + for(var i = len - 1; i >= 0; i--) c2[i2 + i] = c1[i1 + i]; + else{ + var l = Math.min(len, c1.length - i1); + for(var i = 0; i < l; i++) c2[i2 + i] = c1.charCodeAt(i1 + i); + for(; i < len; i++) c2[i2 + i] = 0; + } + } + return 0; + } + function MlFile(){} + function MlFakeFile(content){this.data = content;} + MlFakeFile.prototype = new MlFile(); + MlFakeFile.prototype.constructor = MlFakeFile; + MlFakeFile.prototype.truncate = + function(len){ + var old = this.data; + this.data = caml_create_bytes(len | 0); + caml_blit_bytes(old, 0, this.data, 0, len); + }; + MlFakeFile.prototype.length = + function(){return caml_ml_bytes_length(this.data);}; + MlFakeFile.prototype.write = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen){ + var new_str = caml_create_bytes(offset + len), old_data = this.data; + this.data = new_str; + caml_blit_bytes(old_data, 0, this.data, 0, clen); + } + caml_blit_bytes(caml_bytes_of_array(buf), pos, this.data, offset, len); + return 0; + }; + MlFakeFile.prototype.read = + function(offset, buf, pos, len){ + var clen = this.length(); + if(offset + len >= clen) len = clen - offset; + if(len){ + var data = caml_create_bytes(len | 0); + caml_blit_bytes(this.data, offset, data, 0, len); + buf.set(caml_uint8_array_of_bytes(data), pos); + } + return len; + }; + function MlFakeFd(name, file, flags){ + this.file = file; + this.name = name; + this.flags = flags; + } + MlFakeFd.prototype.err_closed = + function(){ + caml_raise_sys_error(this.name + ": file descriptor already closed"); + }; + MlFakeFd.prototype.length = + function(){if(this.file) return this.file.length(); this.err_closed();}; + MlFakeFd.prototype.write = + function(offset, buf, pos, len){ + if(this.file) return this.file.write(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.read = + function(offset, buf, pos, len){ + if(this.file) return this.file.read(offset, buf, pos, len); + this.err_closed(); + }; + MlFakeFd.prototype.close = function(){this.file = undefined;}; + function MlFakeDevice(root, f){ + this.content = {}; + this.root = root; + this.lookupFun = f; + } + MlFakeDevice.prototype.nm = function(name){return this.root + name;}; + MlFakeDevice.prototype.create_dir_if_needed = + function(name){ + var comp = name.split("/"), res = ""; + for(var i = 0; i < comp.length - 1; i++){ + res += comp[i] + "/"; + if(this.content[res]) continue; + this.content[res] = Symbol("directory"); + } + }; + MlFakeDevice.prototype.slash = + function(name){return /\/$/.test(name) ? name : name + "/";}; + MlFakeDevice.prototype.lookup = + function(name){ + if(! this.content[name] && this.lookupFun){ + var + res = + this.lookupFun + (caml_string_of_jsbytes(this.root), caml_string_of_jsbytes(name)); + if(res !== 0){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_bytes_of_string(res[1])); + } + } + }; + MlFakeDevice.prototype.exists = + function(name){ + if(name == "") return 1; + var name_slash = this.slash(name); + if(this.content[name_slash]) return 1; + this.lookup(name); + return this.content[name] ? 1 : 0; + }; + MlFakeDevice.prototype.isFile = + function(name){return this.exists(name) && ! this.is_dir(name) ? 1 : 0;}; + MlFakeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + var unix_error = raise_unix && caml_named_value("Unix.Unix_error"); + if(this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("EEXIST", "mkdir", this.nm(name))); + else + caml_raise_sys_error(name + ": File exists"); + var parent = /^(.*)\/[^/]+/.exec(name); + parent = parent && parent[1] || ""; + if(! this.exists(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": No such file or directory"); + if(! this.is_dir(parent)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "mkdir", this.nm(parent))); + else + caml_raise_sys_error(parent + ": Not a directory"); + this.create_dir_if_needed(this.slash(name)); + }; + MlFakeDevice.prototype.rmdir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + name_slash = name == "" ? "" : this.slash(name), + r = new RegExp("^" + name_slash + "([^/]+)"); + if(! this.exists(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOENT", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTDIR", "rmdir", this.nm(name))); + else + caml_raise_sys_error(name + ": Not a directory"); + for(var n in this.content) + if(n.match(r)) + if(unix_error) + caml_raise_with_args + (unix_error, make_unix_err_args("ENOTEMPTY", "rmdir", this.nm(name))); + else + caml_raise_sys_error(this.nm(name) + ": Directory not empty"); + delete this.content[name_slash]; + }; + MlFakeDevice.prototype.readdir = + function(name){ + var name_slash = name == "" ? "" : this.slash(name); + if(! this.exists(name)) + caml_raise_sys_error(name + ": No such file or directory"); + if(! this.is_dir(name)) caml_raise_sys_error(name + ": Not a directory"); + var r = new RegExp("^" + name_slash + "([^/]+)"), seen = {}, a = []; + for(var n in this.content){ + var m = n.match(r); + if(m && ! seen[m[1]]){seen[m[1]] = true; a.push(m[1]);} + } + return a; + }; + MlFakeDevice.prototype.opendir = + function(name, raise_unix){ + var + unix_error = raise_unix && caml_named_value("Unix.Unix_error"), + a = this.readdir(name), + c = false, + i = 0; + return {readSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + if(i == a.length) return null; + var entry = a[i]; + i++; + return {name: entry}; + }, + closeSync: + function(){ + if(c) + if(unix_error) + caml_raise_with_args + (unix_error, + make_unix_err_args("EBADF", "closedir", this.nm(name))); + else + caml_raise_sys_error(name + ": closedir failed"); + c = true; + a = []; + }}; + }; + MlFakeDevice.prototype.is_dir = + function(name){ + if(name == "") return true; + var name_slash = this.slash(name); + return this.content[name_slash] ? 1 : 0; + }; + MlFakeDevice.prototype.unlink = + function(name){ + var ok = this.content[name] ? true : false; + delete this.content[name]; + return ok; + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.open = + function(name, f){ + var file; + if(f.rdonly && f.wronly) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (this.nm(name) + + " : flags Open_text and Open_binary are not compatible"); + this.lookup(name); + if(this.content[name]){ + if(this.is_dir(name)) + caml_raise_sys_error(this.nm(name) + " : is a directory"); + if(f.create && f.excl) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + file = this.content[name]; + if(f.truncate) file.truncate(); + } + else if(f.create){ + this.create_dir_if_needed(name); + this.content[name] = new MlFakeFile(caml_create_bytes(0)); + file = this.content[name]; + } + else + caml_raise_no_such_file(this.nm(name)); + return new MlFakeFd(this.nm(name), file, f); + }; + MlFakeDevice.prototype.register = + function(name, content){ + var file; + if(this.content[name]) + caml_raise_sys_error(this.nm(name) + " : file already exists"); + if(caml_is_ml_bytes(content)) file = new MlFakeFile(content); + if(caml_is_ml_string(content)) + file = new MlFakeFile(caml_bytes_of_string(content)); + else if(content instanceof Array) + file = new MlFakeFile(caml_bytes_of_array(content)); + else if(typeof content === "string") + file = new MlFakeFile(caml_bytes_of_jsbytes(content)); + else if(content.toString){ + var + bytes = + caml_bytes_of_string(caml_string_of_jsstring(content.toString())); + file = new MlFakeFile(bytes); + } + if(file){ + this.create_dir_if_needed(name); + this.content[name] = file; + } + else + caml_raise_sys_error + (this.nm(name) + " : registering file with invalid content type"); + }; + MlFakeDevice.prototype.constructor = MlFakeDevice; + function caml_ml_string_length(s){return s.length;} + function caml_string_unsafe_get(s, i){return s.charCodeAt(i);} + function caml_uint8_array_of_string(s){ + var l = caml_ml_string_length(s), a = new Array(l), i = 0; + for(; i < l; i++) a[i] = caml_string_unsafe_get(s, i); + return a; + } + function caml_bytes_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_bytes_unsafe_set(s, i, c){ + c &= 0xff; + if(s.t != 4){ + if(i == s.c.length){ + s.c += String.fromCharCode(c); + if(i + 1 == s.l) s.t = 0; + return 0; + } + caml_convert_bytes_to_array(s); + } + s.c[i] = c; + return 0; + } + function caml_bytes_set(s, i, c){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_set(s, i, c); + } + function MlNodeFd(fd, flags){ + this.fs = require("fs"); + this.fd = fd; + this.flags = flags; + } + MlNodeFd.prototype = new MlFile(); + MlNodeFd.prototype.constructor = MlNodeFd; + MlNodeFd.prototype.truncate = + function(len){ + try{this.fs.ftruncateSync(this.fd, len | 0);} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.length = + function(){ + try{return this.fs.fstatSync(this.fd).size;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.write = + function(offset, buf, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + this.fs.writeSync(this.fd, buf, buf_offset, len); + else + this.fs.writeSync(this.fd, buf, buf_offset, len, offset); + } + catch(err){caml_raise_sys_error(err.toString());} + return 0; + }; + MlNodeFd.prototype.read = + function(offset, a, buf_offset, len){ + try{ + if(this.flags.isCharacterDevice) + var read = this.fs.readSync(this.fd, a, buf_offset, len); + else + var read = this.fs.readSync(this.fd, a, buf_offset, len, offset); + return read; + } + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeFd.prototype.close = + function(){ + try{this.fs.closeSync(this.fd); return 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + function MlNodeDevice(root){this.fs = require("fs"); this.root = root;} + MlNodeDevice.prototype.nm = function(name){return this.root + name;}; + MlNodeDevice.prototype.exists = + function(name){ + try{return this.fs.existsSync(this.nm(name)) ? 1 : 0;} + catch(err){return 0;} + }; + MlNodeDevice.prototype.isFile = + function(name){ + try{return this.fs.statSync(this.nm(name)).isFile() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.mkdir = + function(name, mode, raise_unix){ + try{this.fs.mkdirSync(this.nm(name), {mode: mode}); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rmdir = + function(name, raise_unix){ + try{this.fs.rmdirSync(this.nm(name)); return 0;} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readdir = + function(name, raise_unix){ + try{return this.fs.readdirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.is_dir = + function(name){ + try{return this.fs.statSync(this.nm(name)).isDirectory() ? 1 : 0;} + catch(err){caml_raise_sys_error(err.toString());} + }; + MlNodeDevice.prototype.unlink = + function(name, raise_unix){ + try{ + var b = this.fs.existsSync(this.nm(name)) ? 1 : 0; + this.fs.unlinkSync(this.nm(name)); + return b; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.open = + function(name, f, raise_unix){ + var consts = require("constants"), res = 0; + for(var key in f) + switch(key){ + case "rdonly": + res |= consts.O_RDONLY; break; + case "wronly": + res |= consts.O_WRONLY; break; + case "append": + res |= consts.O_WRONLY | consts.O_APPEND; break; + case "create": + res |= consts.O_CREAT; break; + case "truncate": + res |= consts.O_TRUNC; break; + case "excl": + res |= consts.O_EXCL; break; + case "binary": + res |= consts.O_BINARY; break; + case "text": + res |= consts.O_TEXT; break; + case "nonblock": + res |= consts.O_NONBLOCK; break; + } + try{ + var + fd = this.fs.openSync(this.nm(name), res), + isCharacterDevice = + this.fs.lstatSync(this.nm(name)).isCharacterDevice(); + f.isCharacterDevice = isCharacterDevice; + return new MlNodeFd(fd, f); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.rename = + function(o, n, raise_unix){ + try{this.fs.renameSync(this.nm(o), this.nm(n));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.stat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.statSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.lstat = + function(name, raise_unix){ + try{ + var js_stats = this.fs.lstatSync(this.nm(name)); + return this.stats_from_js(js_stats); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.symlink = + function(to_dir, target, path, raise_unix){ + try{ + this.fs.symlinkSync + (this.nm(target), this.nm(path), to_dir ? "dir" : "file"); + return 0; + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.readlink = + function(name, raise_unix){ + try{ + var link = this.fs.readlinkSync(this.nm(name), "utf8"); + return caml_string_of_jsstring(link); + } + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.opendir = + function(name, raise_unix){ + try{return this.fs.opendirSync(this.nm(name));} + catch(err){this.raise_nodejs_error(err, raise_unix);} + }; + MlNodeDevice.prototype.raise_nodejs_error = + function(err, raise_unix){ + var unix_error = caml_named_value("Unix.Unix_error"); + if(raise_unix && unix_error){ + var + args = make_unix_err_args(err.code, err.syscall, err.path, err.errno); + caml_raise_with_args(unix_error, args); + } + else + caml_raise_sys_error(err.toString()); + }; + MlNodeDevice.prototype.stats_from_js = + function(js_stats){ + var file_kind; + if(js_stats.isFile()) + file_kind = 0; + else if(js_stats.isDirectory()) + file_kind = 1; + else if(js_stats.isCharacterDevice()) + file_kind = 2; + else if(js_stats.isBlockDevice()) + file_kind = 3; + else if(js_stats.isSymbolicLink()) + file_kind = 4; + else if(js_stats.isFIFO()) + file_kind = 5; + else if(js_stats.isSocket()) file_kind = 6; + return [0, + js_stats.dev, + js_stats.ino, + file_kind, + js_stats.mode, + js_stats.nlink, + js_stats.uid, + js_stats.gid, + js_stats.rdev, + js_stats.size, + js_stats.atimeMs, + js_stats.mtimeMs, + js_stats.ctimeMs]; + }; + MlNodeDevice.prototype.constructor = MlNodeDevice; + function caml_get_root(path){ + var x = path_is_absolute(path); + if(! x) return; + return x[0] + "/"; + } + function caml_failwith(msg){ + if(! caml_global_data.Failure) + caml_global_data.Failure = [248, caml_string_of_jsbytes("Failure"), - 3]; + caml_raise_with_string(caml_global_data.Failure, msg); + } + var + caml_root = + caml_get_root(caml_current_dir) + || caml_failwith("unable to compute caml_root"), + jsoo_mount_point = []; + if(fs_node_supported()) + jsoo_mount_point.push + ({path: caml_root, device: new MlNodeDevice(caml_root)}); + else + jsoo_mount_point.push + ({path: caml_root, device: new MlFakeDevice(caml_root)}); + jsoo_mount_point.push + ({path: "/static/", device: new MlFakeDevice("/static/")}); + function resolve_fs_device(name){ + var + path = caml_make_path(name), + name = path.join("/"), + name_slash = caml_trailing_slash(name), + res; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var m = jsoo_mount_point[i]; + if + (name_slash.search(m.path) == 0 + && (! res || res.path.length < m.path.length)) + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + if(! res && fs_node_supported()){ + var root = caml_get_root(name); + if(root && root.match(/^[a-zA-Z]:\/$/)){ + var m = {path: root, device: new MlNodeDevice(root)}; + jsoo_mount_point.push(m); + res = + {path: m.path, + device: m.device, + rest: name.substring(m.path.length, name.length)}; + } + } + if(res) return res; + caml_raise_sys_error("no device found for " + name_slash); + } + function caml_sys_is_directory(name){ + var root = resolve_fs_device(name), a = root.device.is_dir(root.rest); + return a ? 1 : 0; + } + function caml_raise_not_found(){ + caml_raise_constant(caml_global_data.Not_found); + } + function caml_sys_getenv(name){ + var r = jsoo_sys_getenv(caml_jsstring_of_string(name)); + if(r === undefined) caml_raise_not_found(); + return caml_string_of_jsstring(r); + } + function shift_right_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = len1 - 1; i >= 0; i--){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a >>> nbits | wrap; + wrap = a << 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + var caml_gr_state; + function caml_gr_state_get(){ + if(caml_gr_state) return caml_gr_state; + throw caml_maybe_attach_backtrace + ([0, + caml_named_value("Graphics.Graphic_failure"), + caml_string_of_jsbytes("Not initialized")]); + } + function caml_gr_point_color(x, y){ + var + s = caml_gr_state_get(), + im = s.context.getImageData(x, s.height - y, 1, 1), + d = im.data; + return (d[0] << 16) + (d[1] << 8) + d[2]; + } + function caml_runtime_events_user_resolve(){return 0;} + var MlObjectTable; + if(typeof globalThis.WeakMap === "undefined") + MlObjectTable = + function(){ + function NaiveLookup(objs){this.objs = objs;} + NaiveLookup.prototype.get = + function(v){ + for(var i = 0; i < this.objs.length; i++) + if(this.objs[i] === v) return i; + }; + NaiveLookup.prototype.set = function(){}; + return function(){ + this.objs = []; + this.lookup = new NaiveLookup(this.objs);}; + } + (); + else + MlObjectTable = + function(){this.objs = []; this.lookup = new globalThis.WeakMap();}; + MlObjectTable.prototype.store = + function(v){this.lookup.set(v, this.objs.length); this.objs.push(v);}; + MlObjectTable.prototype.recall = + function(v){ + var i = this.lookup.get(v); + return i === undefined ? undefined : this.objs.length - i; + }; + function caml_sys_rename(o, n){ + var o_root = resolve_fs_device(o), n_root = resolve_fs_device(n); + if(o_root.device != n_root.device) + caml_failwith("caml_sys_rename: cannot move file between two filesystem"); + if(! o_root.device.rename) + caml_failwith("caml_sys_rename: no implemented"); + o_root.device.rename(o_root.rest, n_root.rest); + } + function caml_log10_float(x){return Math.log10(x);} + var caml_runtime_warnings = 0; + function caml_ml_enable_runtime_warnings(bool){caml_runtime_warnings = bool; return 0; + } + function caml_classify_float(x){ + if(isFinite(x)){ + if(Math.abs(x) >= 2.2250738585072014e-308) return 0; + if(x != 0) return 1; + return 2; + } + return isNaN(x) ? 4 : 3; + } + var caml_ml_channels = new Array(); + function caml_refill(chan){ + if(chan.refill != null){ + var str = chan.refill(), str_a = caml_uint8_array_of_string(str); + if(str_a.length == 0) + chan.refill = null; + else{ + if(chan.buffer.length < chan.buffer_max + str_a.length){ + var b = new Uint8Array(chan.buffer_max + str_a.length); + b.set(chan.buffer); + chan.buffer = b; + } + chan.buffer.set(str_a, chan.buffer_max); + chan.offset += str_a.length; + chan.buffer_max += str_a.length; + } + } + else{ + var + nread = + chan.file.read + (chan.offset, + chan.buffer, + chan.buffer_max, + chan.buffer.length - chan.buffer_max); + chan.offset += nread; + chan.buffer_max += nread; + } + } + function caml_array_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_ml_input_scan_line(chanid){ + var chan = caml_ml_channels[chanid], p = chan.buffer_curr; + do + if(p >= chan.buffer_max){ + if(chan.buffer_curr > 0){ + chan.buffer.set(chan.buffer.subarray(chan.buffer_curr), 0); + p -= chan.buffer_curr; + chan.buffer_max -= chan.buffer_curr; + chan.buffer_curr = 0; + } + if(chan.buffer_max >= chan.buffer.length) return - chan.buffer_max | 0; + var prev_max = chan.buffer_max; + caml_refill(chan); + if(prev_max == chan.buffer_max) return - chan.buffer_max | 0; + } + while + (chan.buffer[p++] != 10); + return p - chan.buffer_curr | 0; + } + function caml_gc_minor(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(true); + return 0; + } + function caml_ml_condition_new(unit){return {condition: 1};} + function caml_int64_of_bytes(a){ + return new + MlInt64 + (a[7] << 0 | a[6] << 8 | a[5] << 16, + a[4] << 0 | a[3] << 8 | a[2] << 16, + a[1] << 0 | a[0] << 8); + } + function caml_ba_uint8_get64(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3), + b5 = ba.get(ofs + 4), + b6 = ba.get(ofs + 5), + b7 = ba.get(ofs + 6), + b8 = ba.get(ofs + 7); + return caml_int64_of_bytes([b8, b7, b6, b5, b4, b3, b2, b1]); + } + function caml_int64_to_bytes(x){return x.toArray();} + function caml_int64_marshal(writer, v, sizes){ + var b = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) writer.write(8, b[i]); + sizes[0] = 8; + sizes[1] = 8; + } + function caml_ba_num_dims(ba){return ba.dims.length;} + function caml_wrap_exception(e){ + { + if(e instanceof Array) return e; + var exn; + if + (globalThis.RangeError && e instanceof globalThis.RangeError + && e.message + && e.message.match(/maximum call stack/i)) + exn = caml_global_data.Stack_overflow; + else if + (globalThis.InternalError && e instanceof globalThis.InternalError + && e.message + && e.message.match(/too much recursion/i)) + exn = caml_global_data.Stack_overflow; + else if(e instanceof globalThis.Error && caml_named_value("jsError")) + exn = [0, caml_named_value("jsError"), e]; + else + exn = [0, caml_global_data.Failure, caml_string_of_jsstring(String(e))]; + if(e instanceof globalThis.Error) exn.js_error = e; + return exn; + } + } + function caml_create_file(name, content){ + var root = resolve_fs_device(name); + if(! root.device.register) caml_failwith("cannot register file"); + root.device.register(root.rest, content); + return 0; + } + function jsoo_create_file(name, content){ + var + name = caml_string_of_jsbytes(name), + content = caml_string_of_jsbytes(content); + return caml_create_file(name, content); + } + function caml_fs_init(){ + var tmp = globalThis.caml_fs_tmp; + if(tmp) + for(var i = 0; i < tmp.length; i++) + jsoo_create_file(tmp[i].name, tmp[i].content); + globalThis.jsoo_create_file = jsoo_create_file; + globalThis.caml_fs_tmp = []; + return 0; + } + function caml_mul(a, b){return Math.imul(a, b);} + function caml_hash_mix_int(h, d){ + d = caml_mul(d, 0xcc9e2d51 | 0); + d = d << 15 | d >>> 32 - 15; + d = caml_mul(d, 0x1b873593); + h ^= d; + h = h << 13 | h >>> 32 - 13; + return (h + (h << 2) | 0) + (0xe6546b64 | 0) | 0; + } + function caml_hash_mix_jsbytes(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = + s.charCodeAt(i) | s.charCodeAt(i + 1) << 8 | s.charCodeAt(i + 2) << 16 + | s.charCodeAt(i + 3) << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s.charCodeAt(i + 2) << 16; + case 2: + w |= s.charCodeAt(i + 1) << 8; + case 1: + w |= s.charCodeAt(i); h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_hash_mix_string(h, v){ + return caml_hash_mix_jsbytes(h, caml_jsbytes_of_string(v)); + } + var Base_internalhash_fold_string = caml_hash_mix_string; + function caml_get_continuation_callstack(){return [0];} + var caml_parser_trace = 0; + function caml_set_parser_trace(bool){ + var oldflag = caml_parser_trace; + caml_parser_trace = bool; + return oldflag; + } + function caml_list_of_js_array(a){ + var l = 0; + for(var i = a.length - 1; i >= 0; i--){var e = a[i]; l = [0, e, l];} + return l; + } + function num_digits_nat(nat, ofs, len){ + for(var i = len - 1; i >= 0; i--) if(nat.data[ofs + i] != 0) return i + 1; + return 1; + } + function caml_hash_nat(x){ + var len = num_digits_nat(x, 0, x.data.length), h = 0; + for(var i = 0; i < len; i++) h = caml_hash_mix_int(h, x.data[i]); + return h; + } + function caml_call_gen(f, args){ + var + n = f.l >= 0 ? f.l : f.l = f.length, + argsLen = args.length, + d = n - argsLen; + if(d == 0) + return f.apply(null, args); + else if(d < 0){ + var g = f.apply(null, args.slice(0, n)); + if(typeof g !== "function") return g; + return caml_call_gen(g, args.slice(n)); + } + else{ + switch(d){ + case 1: + { + var + g = + function(x){ + var nargs = new Array(argsLen + 1); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + return f.apply(null, nargs); + }; + break; + } + case 2: + { + var + g = + function(x, y){ + var nargs = new Array(argsLen + 2); + for(var i = 0; i < argsLen; i++) nargs[i] = args[i]; + nargs[argsLen] = x; + nargs[argsLen + 1] = y; + return f.apply(null, nargs); + }; + break; + } + default: + var + g = + function(){ + var + extra_args = arguments.length == 0 ? 1 : arguments.length, + nargs = new Array(args.length + extra_args); + for(var i = 0; i < args.length; i++) nargs[i] = args[i]; + for(var i = 0; i < arguments.length; i++) + nargs[args.length + i] = arguments[i]; + return caml_call_gen(f, nargs); + }; + } + g.l = d; + return g; + } + } + var caml_callback = caml_call_gen; + function caml_js_wrap_callback_arguments(f){ + return function(){ + var len = arguments.length, args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, [args]);}; + } + function caml_sys_chdir(dir){ + var root = resolve_fs_device(dir); + if(root.device.exists(root.rest)){ + if(root.rest) + caml_current_dir = caml_trailing_slash(root.path + root.rest); + else + caml_current_dir = root.path; + return 0; + } + else + caml_raise_no_such_file(caml_jsbytes_of_string(dir)); + } + function caml_obj_tag(x){ + if(x instanceof Array && x[0] == x[0] >>> 0) + return x[0]; + else if(caml_is_ml_bytes(x)) + return 252; + else if(caml_is_ml_string(x)) + return 252; + else if(x instanceof Function || typeof x == "function") + return 247; + else if(x && x.caml_custom) return 255; else return 1000; + } + function caml_obj_update_tag(b, o, n){ + if(b[0] == o){b[0] = n; return 1;} + return 0; + } + var caml_ml_domain_unique_token_ = [0]; + function caml_ml_domain_unique_token(unit){return caml_ml_domain_unique_token_; + } + function caml_lazy_update_to_forcing(o){ + var t = caml_obj_tag(o); + if(t != 246 && t != 250 && t != 244) return 4; + if(caml_obj_update_tag(o, 246, 244)) + return 0; + else{ + var field0 = o[1]; + t = o[0]; + if(t == 244) + return field0 == caml_ml_domain_unique_token(0) ? 1 : 2; + else if(t == 250) return 3; else return 2; + } + } + function caml_gc_counters(){return [254, 0, 0, 0];} + function caml_gr_synchronize(){ + caml_failwith("caml_gr_synchronize not Implemented"); + } + function caml_unix_closedir(dir_handle){ + try{dir_handle.pointer.closeSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "closedir", dir_handle.path)); + } + } + function caml_unix_opendir(path){ + var root = resolve_fs_device(path); + if(! root.device.opendir) + caml_failwith("caml_unix_opendir: not implemented"); + var dir_handle = root.device.opendir(root.rest, true); + return {pointer: dir_handle, path: path}; + } + function caml_unix_rewinddir(dir_handle){ + caml_unix_closedir(dir_handle); + var new_dir_handle = caml_unix_opendir(dir_handle.path); + dir_handle.pointer = new_dir_handle.pointer; + return 0; + } + function caml_raise_end_of_file(){ + caml_raise_constant(caml_global_data.End_of_file); + } + function caml_unix_readdir(dir_handle){ + var entry; + try{entry = dir_handle.pointer.readSync();} + catch(e){ + var unix_error = caml_named_value("Unix.Unix_error"); + caml_raise_with_args + (unix_error, make_unix_err_args("EBADF", "readdir", dir_handle.path)); + } + if(entry === null) + caml_raise_end_of_file(); + else + return caml_string_of_jsstring(entry.name); + } + function caml_unix_findfirst(path){ + var path_js = caml_jsstring_of_string(path); + path_js = path_js.replace(/(^|[\\\/])\*\.\*$/, ""); + path = caml_string_of_jsstring(path_js); + var + dir_handle = caml_unix_opendir(path), + first_entry = caml_unix_readdir(dir_handle); + return [0, first_entry, dir_handle]; + } + function caml_is_continuation_tag(t){return t == 245 ? 1 : 0;} + var log2_ok = Math.log2 && Math.log2(1.1235582092889474E+307) == 1020; + function jsoo_floor_log2(x){ + if(log2_ok) return Math.floor(Math.log2(x)); + var i = 0; + if(x == 0) return - Infinity; + if(x >= 1) while(x >= 2){x /= 2; i++;} else while(x < 1){x *= 2; i--;} + return i; + } + function caml_int32_bits_of_float(x){ + var float32a = new Float32Array(1); + float32a[0] = x; + var int32a = new Int32Array(float32a.buffer); + return int32a[0] | 0; + } + function caml_int64_create_lo_mi_hi(lo, mi, hi){return new MlInt64(lo, mi, hi); + } + function caml_int64_bits_of_float(x){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_int64_create_lo_mi_hi(1, 0, 0x7ff0); + return x > 0 + ? caml_int64_create_lo_mi_hi(0, 0, 0x7ff0) + : caml_int64_create_lo_mi_hi(0, 0, 0xfff0); + } + var sign = x == 0 && 1 / x == - Infinity ? 0x8000 : x >= 0 ? 0 : 0x8000; + if(sign) x = - x; + var exp = jsoo_floor_log2(x) + 1023; + if(exp <= 0){ + exp = 0; + x /= Math.pow(2, - 1026); + } + else{ + x /= Math.pow(2, exp - 1027); + if(x < 16){x *= 2; exp -= 1;} + if(exp == 0) x /= 2; + } + var k = Math.pow(2, 24), r3 = x | 0; + x = (x - r3) * k; + var r2 = x | 0; + x = (x - r2) * k; + var r1 = x | 0; + r3 = r3 & 0xf | sign | exp << 4; + return caml_int64_create_lo_mi_hi(r1, r2, r3); + } + function caml_ba_serialize(writer, ba, sz){ + writer.write(32, ba.dims.length); + writer.write(32, ba.kind | ba.layout << 8); + if(ba.caml_custom == "_bigarr02") + for(var i = 0; i < ba.dims.length; i++) + if(ba.dims[i] < 0xffff) + writer.write(16, ba.dims[i]); + else{ + writer.write(16, 0xffff); + writer.write(32, 0); + writer.write(32, ba.dims[i]); + } + else + for(var i = 0; i < ba.dims.length; i++) writer.write(32, ba.dims[i]); + switch(ba.kind){ + case 2: + case 3: + case 12: + for(var i = 0; i < ba.data.length; i++) writer.write(8, ba.data[i]); + break; + case 4: + case 5: + for(var i = 0; i < ba.data.length; i++) writer.write(16, ba.data[i]); + break; + case 6: + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 8: + case 9: + writer.write(8, 0); + for(var i = 0; i < ba.data.length; i++) writer.write(32, ba.data[i]); + break; + case 7: + for(var i = 0; i < ba.data.length / 2; i++){ + var b = caml_int64_to_bytes(ba.get(i)); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 1: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int64_to_bytes(caml_int64_bits_of_float(ba.get(i))); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + case 0: + for(var i = 0; i < ba.data.length; i++){ + var b = caml_int32_bits_of_float(ba.get(i)); + writer.write(32, b); + } + break; + case 10: + for(var i = 0; i < ba.data.length / 2; i++){ + var j = ba.get(i); + writer.write(32, caml_int32_bits_of_float(j[1])); + writer.write(32, caml_int32_bits_of_float(j[2])); + } + break; + case 11: + for(var i = 0; i < ba.data.length / 2; i++){ + var + complex = ba.get(i), + b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[1])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + var b = caml_int64_to_bytes(caml_int64_bits_of_float(complex[2])); + for(var j = 0; j < 8; j++) writer.write(8, b[j]); + } + break; + } + sz[0] = (4 + ba.dims.length) * 4; + sz[1] = (4 + ba.dims.length) * 8; + } + function caml_ba_get_size_per_element(kind){ + switch(kind){case 7:case 10:case 11: return 2;default: return 1; + } + } + function caml_ba_create_buffer(kind, size){ + var view; + switch(kind){ + case 0: + view = Float32Array; break; + case 1: + view = Float64Array; break; + case 2: + view = Int8Array; break; + case 3: + view = Uint8Array; break; + case 4: + view = Int16Array; break; + case 5: + view = Uint16Array; break; + case 6: + view = Int32Array; break; + case 7: + view = Int32Array; break; + case 8: + view = Int32Array; break; + case 9: + view = Int32Array; break; + case 10: + view = Float32Array; break; + case 11: + view = Float64Array; break; + case 12: + view = Uint8Array; break; + } + if(! view) caml_invalid_argument("Bigarray.create: unsupported kind"); + var data = new view(size * caml_ba_get_size_per_element(kind)); + return data; + } + function caml_int32_float_of_bits(x){ + var int32a = new Int32Array(1); + int32a[0] = x; + var float32a = new Float32Array(int32a.buffer); + return float32a[0]; + } + function caml_int64_float_of_bits(x){ + var lo = x.lo, mi = x.mi, hi = x.hi, exp = (hi & 0x7fff) >> 4; + if(exp == 2047) + return (lo | mi | hi & 0xf) == 0 + ? hi & 0x8000 ? - Infinity : Infinity + : NaN; + var k = Math.pow(2, - 24), res = (lo * k + mi) * k + (hi & 0xf); + if(exp > 0){ + res += 16; + res *= Math.pow(2, exp - 1027); + } + else + res *= Math.pow(2, - 1026); + if(hi & 0x8000) res = - res; + return res; + } + function caml_ba_get_size(dims){ + var n_dims = dims.length, size = 1; + for(var i = 0; i < n_dims; i++){ + if(dims[i] < 0) + caml_invalid_argument("Bigarray.create: negative dimension"); + size = size * dims[i]; + } + return size; + } + function caml_int64_create_lo_hi(lo, hi){ + return new + MlInt64 + (lo & 0xffffff, + lo >>> 24 & 0xff | (hi & 0xffff) << 8, + hi >>> 16 & 0xffff); + } + function caml_int64_hi32(v){return v.hi32();} + function caml_int64_lo32(v){return v.lo32();} + var caml_ba_custom_name = "_bigarr02"; + function Ml_Bigarray(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray.prototype.caml_custom = caml_ba_custom_name; + Ml_Bigarray.prototype.offset = + function(arg){ + var ofs = 0; + if(typeof arg === "number") arg = [arg]; + if(! (arg instanceof Array)) + caml_invalid_argument("bigarray.js: invalid offset"); + if(this.dims.length != arg.length) + caml_invalid_argument("Bigarray.get/set: bad number of dimensions"); + if(this.layout == 0) + for(var i = 0; i < this.dims.length; i++){ + if(arg[i] < 0 || arg[i] >= this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + arg[i]; + } + else + for(var i = this.dims.length - 1; i >= 0; i--){ + if(arg[i] < 1 || arg[i] > this.dims[i]) caml_array_bound_error(); + ofs = ofs * this.dims[i] + (arg[i] - 1); + } + return ofs; + }; + Ml_Bigarray.prototype.get = + function(ofs){ + switch(this.kind){ + case 7: + var l = this.data[ofs * 2 + 0], h = this.data[ofs * 2 + 1]; + return caml_int64_create_lo_hi(l, h); + case 10: + case 11: + var r = this.data[ofs * 2 + 0], i = this.data[ofs * 2 + 1]; + return [254, r, i]; + default: return this.data[ofs]; + } + }; + Ml_Bigarray.prototype.set = + function(ofs, v){ + switch(this.kind){ + case 7: + this.data[ofs * 2 + 0] = caml_int64_lo32(v); + this.data[ofs * 2 + 1] = caml_int64_hi32(v); + break; + case 10: + case 11: + this.data[ofs * 2 + 0] = v[1]; this.data[ofs * 2 + 1] = v[2]; break; + default: this.data[ofs] = v; break; + } + return 0; + }; + Ml_Bigarray.prototype.fill = + function(v){ + switch(this.kind){ + case 7: + var a = caml_int64_lo32(v), b = caml_int64_hi32(v); + if(a == b) + this.data.fill(a); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? a : b; + break; + case 10: + case 11: + var im = v[1], re = v[2]; + if(im == re) + this.data.fill(im); + else + for(var i = 0; i < this.data.length; i++) + this.data[i] = i % 2 == 0 ? im : re; + break; + default: this.data.fill(v); break; + } + }; + Ml_Bigarray.prototype.compare = + function(b, total){ + if(this.layout != b.layout || this.kind != b.kind){ + var k1 = this.kind | this.layout << 8, k2 = b.kind | b.layout << 8; + return k2 - k1; + } + if(this.dims.length != b.dims.length) + return b.dims.length - this.dims.length; + for(var i = 0; i < this.dims.length; i++) + if(this.dims[i] != b.dims[i]) return this.dims[i] < b.dims[i] ? - 1 : 1; + switch(this.kind){ + case 0: + case 1: + case 10: + case 11: + var x, y; + for(var i = 0; i < this.data.length; i++){ + x = this.data[i]; + y = b.data[i]; + if(x < y) return - 1; + if(x > y) return 1; + if(x != y){ + if(! total) return NaN; + if(x == x) return 1; + if(y == y) return - 1; + } + } + break; + case 7: + for(var i = 0; i < this.data.length; i += 2){ + if(this.data[i + 1] < b.data[i + 1]) return - 1; + if(this.data[i + 1] > b.data[i + 1]) return 1; + if(this.data[i] >>> 0 < b.data[i] >>> 0) return - 1; + if(this.data[i] >>> 0 > b.data[i] >>> 0) return 1; + } + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 8: + case 9: + case 12: + for(var i = 0; i < this.data.length; i++){ + if(this.data[i] < b.data[i]) return - 1; + if(this.data[i] > b.data[i]) return 1; + } + break; + } + return 0; + }; + function Ml_Bigarray_c_1_1(kind, layout, dims, buffer){ + this.kind = kind; + this.layout = layout; + this.dims = dims; + this.data = buffer; + } + Ml_Bigarray_c_1_1.prototype = new Ml_Bigarray(); + Ml_Bigarray_c_1_1.prototype.offset = + function(arg){ + if(typeof arg !== "number") + if(arg instanceof Array && arg.length == 1) + arg = arg[0]; + else + caml_invalid_argument("Ml_Bigarray_c_1_1.offset"); + if(arg < 0 || arg >= this.dims[0]) caml_array_bound_error(); + return arg; + }; + Ml_Bigarray_c_1_1.prototype.get = function(ofs){return this.data[ofs];}; + Ml_Bigarray_c_1_1.prototype.set = + function(ofs, v){this.data[ofs] = v; return 0;}; + Ml_Bigarray_c_1_1.prototype.fill = + function(v){this.data.fill(v); return 0;}; + function caml_ba_create_unsafe(kind, layout, dims, data){ + var size_per_element = caml_ba_get_size_per_element(kind); + if(caml_ba_get_size(dims) * size_per_element != data.length) + caml_invalid_argument("length doesn't match dims"); + if(layout == 0 && dims.length == 1 && size_per_element == 1) + return new Ml_Bigarray_c_1_1(kind, layout, dims, data); + return new Ml_Bigarray(kind, layout, dims, data); + } + function caml_ba_deserialize(reader, sz, name){ + var num_dims = reader.read32s(); + if(num_dims < 0 || num_dims > 16) + caml_failwith("input_value: wrong number of bigarray dimensions"); + var + tag = reader.read32s(), + kind = tag & 0xff, + layout = tag >> 8 & 1, + dims = []; + if(name == "_bigarr02") + for(var i = 0; i < num_dims; i++){ + var size_dim = reader.read16u(); + if(size_dim == 0xffff){ + var size_dim_hi = reader.read32u(), size_dim_lo = reader.read32u(); + if(size_dim_hi != 0) + caml_failwith("input_value: bigarray dimension overflow in 32bit"); + size_dim = size_dim_lo; + } + dims.push(size_dim); + } + else + for(var i = 0; i < num_dims; i++) dims.push(reader.read32u()); + var + size = caml_ba_get_size(dims), + data = caml_ba_create_buffer(kind, size), + ba = caml_ba_create_unsafe(kind, layout, dims, data); + switch(kind){ + case 2: + for(var i = 0; i < size; i++) data[i] = reader.read8s(); break; + case 3: + case 12: + for(var i = 0; i < size; i++) data[i] = reader.read8u(); break; + case 4: + for(var i = 0; i < size; i++) data[i] = reader.read16s(); break; + case 5: + for(var i = 0; i < size; i++) data[i] = reader.read16u(); break; + case 6: + for(var i = 0; i < size; i++) data[i] = reader.read32s(); break; + case 8: + case 9: + var sixty = reader.read8u(); + if(sixty) + caml_failwith + ("input_value: cannot read bigarray with 64-bit OCaml ints"); + for(var i = 0; i < size; i++) data[i] = reader.read32s(); + break; + case 7: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var int64 = caml_int64_of_bytes(t); + ba.set(i, int64); + } + break; + case 1: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var f = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, f); + } + break; + case 0: + for(var i = 0; i < size; i++){ + var f = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, f); + } + break; + case 10: + for(var i = 0; i < size; i++){ + var + re = caml_int32_float_of_bits(reader.read32s()), + im = caml_int32_float_of_bits(reader.read32s()); + ba.set(i, [254, re, im]); + } + break; + case 11: + var t = new Array(8); + for(var i = 0; i < size; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var re = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + var im = caml_int64_float_of_bits(caml_int64_of_bytes(t)); + ba.set(i, [254, re, im]); + } + break; + } + sz[0] = (4 + num_dims) * 4; + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_ba_compare(a, b, total){return a.compare(b, total);} + function caml_hash_mix_int64(h, v){ + h = caml_hash_mix_int(h, caml_int64_lo32(v)); + h = caml_hash_mix_int(h, caml_int64_hi32(v)); + return h; + } + function caml_hash_mix_float(h, v0){ + return caml_hash_mix_int64(h, caml_int64_bits_of_float(v0)); + } + function caml_ba_hash(ba){ + var num_elts = caml_ba_get_size(ba.dims), h = 0; + switch(ba.kind){ + case 2: + case 3: + case 12: + if(num_elts > 256) num_elts = 256; + var w = 0, i = 0; + for(i = 0; i + 4 <= ba.data.length; i += 4){ + w = + ba.data[i + 0] | ba.data[i + 1] << 8 | ba.data[i + 2] << 16 + | ba.data[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(num_elts & 3){ + case 3: + w = ba.data[i + 2] << 16; + case 2: + w |= ba.data[i + 1] << 8; + case 1: + w |= ba.data[i + 0]; h = caml_hash_mix_int(h, w); + } + break; + case 4: + case 5: + if(num_elts > 128) num_elts = 128; + var w = 0, i = 0; + for(i = 0; i + 2 <= ba.data.length; i += 2){ + w = ba.data[i + 0] | ba.data[i + 1] << 16; + h = caml_hash_mix_int(h, w); + } + if((num_elts & 1) != 0) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 6: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 8: + case 9: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 7: + if(num_elts > 32) num_elts = 32; + num_elts *= 2; + for(var i = 0; i < num_elts; i++) h = caml_hash_mix_int(h, ba.data[i]); + break; + case 10: + num_elts *= 2; + case 0: + if(num_elts > 64) num_elts = 64; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + case 11: + num_elts *= 2; + case 1: + if(num_elts > 32) num_elts = 32; + for(var i = 0; i < num_elts; i++) + h = caml_hash_mix_float(h, ba.data[i]); + break; + } + return h; + } + function caml_int32_unmarshal(reader, size){size[0] = 4; return reader.read32s(); + } + function caml_nativeint_unmarshal(reader, size){ + switch(reader.read8u()){ + case 1: + size[0] = 4; return reader.read32s(); + case 2: + caml_failwith("input_value: native integer value too large"); + default: caml_failwith("input_value: ill-formed native integer"); + } + } + function caml_int64_unmarshal(reader, size){ + var t = new Array(8); + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + size[0] = 8; + return caml_int64_of_bytes(t); + } + function caml_int64_compare(x, y, total){return x.compare(y);} + function caml_int64_hash(v){return v.lo32() ^ v.hi32();} + var + caml_custom_ops = + {"_j": + {deserialize: caml_int64_unmarshal, + serialize: caml_int64_marshal, + fixed_length: 8, + compare: caml_int64_compare, + hash: caml_int64_hash}, + "_i": {deserialize: caml_int32_unmarshal, fixed_length: 4}, + "_n": {deserialize: caml_nativeint_unmarshal, fixed_length: 4}, + "_bigarray": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarray"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}, + "_bigarr02": + {deserialize: + function(reader, sz){ + return caml_ba_deserialize(reader, sz, "_bigarr02"); + }, + serialize: caml_ba_serialize, + compare: caml_ba_compare, + hash: caml_ba_hash}}; + function caml_compare_val_get_custom(a){ + return caml_custom_ops[a.caml_custom] + && caml_custom_ops[a.caml_custom].compare; + } + function caml_compare_val_number_custom(num, custom, swap, total){ + var comp = caml_compare_val_get_custom(custom); + if(comp){ + var x = swap > 0 ? comp(custom, num, total) : comp(num, custom, total); + if(total && x != x) return swap; + if(+ x != + x) return + x; + if((x | 0) != 0) return x | 0; + } + return swap; + } + function caml_compare_val_tag(a){ + if(typeof a === "number") + return 1000; + else if(caml_is_ml_bytes(a)) + return 252; + else if(caml_is_ml_string(a)) + return 1252; + else if(a instanceof Array && a[0] === a[0] >>> 0 && a[0] <= 255){var tag = a[0] | 0; return tag == 254 ? 0 : tag;} + else if(a instanceof String) + return 12520; + else if(typeof a == "string") + return 12520; + else if(a instanceof Number) + return 1000; + else if(a && a.caml_custom) + return 1255; + else if(a && a.compare) + return 1256; + else if(typeof a == "function") + return 1247; + else if(typeof a == "symbol") return 1251; + return 1001; + } + function caml_int_compare(a, b){ + if(a < b) return - 1; + if(a == b) return 0; + return 1; + } + function caml_string_compare(s1, s2){ + return s1 < s2 ? - 1 : s1 > s2 ? 1 : 0; + } + function caml_bytes_compare(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? - 1 : s1.c > s2.c ? 1 : 0; + } + function caml_compare_val(a, b, total){ + var stack = []; + for(;;){ + if(! (total && a === b)){ + var tag_a = caml_compare_val_tag(a); + if(tag_a == 250){a = a[1]; continue;} + var tag_b = caml_compare_val_tag(b); + if(tag_b == 250){b = b[1]; continue;} + if(tag_a !== tag_b){ + if(tag_a == 1000){ + if(tag_b == 1255) + return caml_compare_val_number_custom(a, b, - 1, total); + return - 1; + } + if(tag_b == 1000){ + if(tag_a == 1255) + return caml_compare_val_number_custom(b, a, 1, total); + return 1; + } + return tag_a < tag_b ? - 1 : 1; + } + switch(tag_a){ + case 247: + caml_invalid_argument("compare: functional value"); break; + case 248: + var x = caml_int_compare(a[2], b[2]); if(x != 0) return x | 0; break; + case 249: + caml_invalid_argument("compare: functional value"); break; + case 250: + caml_invalid_argument("equal: got Forward_tag, should not happen"); + break; + case 251: + caml_invalid_argument("equal: abstract value"); break; + case 252: + if(a !== b){ + var x = caml_bytes_compare(a, b); + if(x != 0) return x | 0; + } + break; + case 253: + caml_invalid_argument("equal: got Double_tag, should not happen"); + break; + case 254: + caml_invalid_argument + ("equal: got Double_array_tag, should not happen"); + break; + case 255: + caml_invalid_argument("equal: got Custom_tag, should not happen"); + break; + case 1247: + caml_invalid_argument("compare: functional value"); break; + case 1255: + var comp = caml_compare_val_get_custom(a); + if(comp != caml_compare_val_get_custom(b)) + return a.caml_custom < b.caml_custom ? - 1 : 1; + if(! comp) caml_invalid_argument("compare: abstract value"); + var x = comp(a, b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1256: + var x = a.compare(b, total); + if(x != x) return total ? - 1 : x; + if(x !== (x | 0)) return - 1; + if(x != 0) return x | 0; + break; + case 1000: + a = + a; + b = + b; + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1001: + if(a < b) return - 1; + if(a > b) return 1; + if(a != b){ + if(! total) return NaN; + if(a == a) return 1; + if(b == b) return - 1; + } + break; + case 1251: + if(a !== b){if(! total) return NaN; return 1;} break; + case 1252: + var a = caml_jsbytes_of_string(a), b = caml_jsbytes_of_string(b); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 12520: + var a = a.toString(), b = b.toString(); + if(a !== b){if(a < b) return - 1; if(a > b) return 1;} + break; + case 246: + case 254: + default: + if(caml_is_continuation_tag(tag_a)){ + caml_invalid_argument("compare: continuation value"); + break; + } + if(a.length != b.length) return a.length < b.length ? - 1 : 1; + if(a.length > 1) stack.push(a, b, 1); + break; + } + } + if(stack.length == 0) return 0; + var i = stack.pop(); + b = stack.pop(); + a = stack.pop(); + if(i + 1 < a.length) stack.push(a, b, i + 1); + a = a[i]; + b = b[i]; + } + } + function caml_greaterthan(x, y){ + return + (caml_compare_val(x, y, false) > 0); + } + function div_helper(a, b, c){ + var + x = a * 65536 + (b >>> 16), + y = Math.floor(x / c) * 65536, + z = x % c * 65536, + w = z + (b & 0x0000FFFF); + return [y + Math.floor(w / c), w % c]; + } + function div_digit_nat(natq, ofsq, natr, ofsr, nat1, ofs1, len, nat2, ofs2){ + var rem = nat1.data[ofs1 + len - 1] >>> 0; + for(var i = len - 2; i >= 0; i--){ + var + x = div_helper(rem, nat1.data[ofs1 + i] >>> 0, nat2.data[ofs2] >>> 0); + natq.data[ofsq + i] = x[0]; + rem = x[1]; + } + natr.data[ofsr] = rem; + return 0; + } + function num_leading_zero_bits_in_digit(nat, ofs){ + var a = nat.data[ofs], b = 0; + if(a & 0xFFFF0000){b += 16; a >>>= 16;} + if(a & 0xFF00){b += 8; a >>>= 8;} + if(a & 0xF0){b += 4; a >>>= 4;} + if(a & 12){b += 2; a >>>= 2;} + if(a & 2){b += 1; a >>>= 1;} + if(a & 1) b += 1; + return 32 - b; + } + function shift_left_nat(nat1, ofs1, len1, nat2, ofs2, nbits){ + if(nbits == 0){nat2.data[ofs2] = 0; return 0;} + var wrap = 0; + for(var i = 0; i < len1; i++){ + var a = nat1.data[ofs1 + i] >>> 0; + nat1.data[ofs1 + i] = a << nbits | wrap; + wrap = a >>> 32 - nbits; + } + nat2.data[ofs2] = wrap; + return 0; + } + function MlNat(x){ + this.data = new Int32Array(x); + this.length = this.data.length + 2; + } + MlNat.prototype.caml_custom = "_nat"; + function create_nat(size){ + var arr = new MlNat(size); + for(var i = 0; i < size; i++) arr.data[i] = - 1; + return arr; + } + function set_to_zero_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) nat.data[ofs + i] = 0; + return 0; + } + function incr_nat(nat, ofs, len, carry_in){ + var carry = carry_in; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) + carry; + nat.data[ofs + i] = x | 0; + if(x == x >>> 0){carry = 0; break;} else carry = 1; + } + return carry; + } + function add_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var carry = carry_in; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) + (nat2.data[ofs2 + i] >>> 0) + carry; + nat1.data[ofs1 + i] = x; + if(x == x >>> 0) carry = 0; else carry = 1; + } + return incr_nat(nat1, ofs1 + len2, len1 - len2, carry); + } + function nat_of_array(l){return new MlNat(l);} + function mult_digit_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3){ + var carry = 0, a = nat3.data[ofs3] >>> 0; + for(var i = 0; i < len2; i++){ + var + x1 = + (nat1.data[ofs1 + i] >>> 0) + + (nat2.data[ofs2 + i] >>> 0) * (a & 0x0000FFFF) + + carry, + x2 = (nat2.data[ofs2 + i] >>> 0) * (a >>> 16); + carry = Math.floor(x2 / 65536); + var x3 = x1 + x2 % 65536 * 65536; + nat1.data[ofs1 + i] = x3; + carry += Math.floor(x3 / 4294967296); + } + return len2 < len1 && carry + ? add_nat + (nat1, ofs1 + len2, len1 - len2, nat_of_array([carry]), 0, 1, 0) + : carry; + } + function decr_nat(nat, ofs, len, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len; i++){ + var x = (nat.data[ofs + i] >>> 0) - borrow; + nat.data[ofs + i] = x; + if(x >= 0){borrow = 0; break;} else borrow = 1; + } + return borrow == 1 ? 0 : 1; + } + function sub_nat(nat1, ofs1, len1, nat2, ofs2, len2, carry_in){ + var borrow = carry_in == 1 ? 0 : 1; + for(var i = 0; i < len2; i++){ + var + x = (nat1.data[ofs1 + i] >>> 0) - (nat2.data[ofs2 + i] >>> 0) - borrow; + nat1.data[ofs1 + i] = x; + if(x >= 0) borrow = 0; else borrow = 1; + } + return decr_nat(nat1, ofs1 + len2, len1 - len2, borrow == 1 ? 0 : 1); + } + function compare_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var + a = num_digits_nat(nat1, ofs1, len1), + b = num_digits_nat(nat2, ofs2, len2); + if(a > b) return 1; + if(a < b) return - 1; + for(var i = len1 - 1; i >= 0; i--){ + if(nat1.data[ofs1 + i] >>> 0 > nat2.data[ofs2 + i] >>> 0) return 1; + if(nat1.data[ofs1 + i] >>> 0 < nat2.data[ofs2 + i] >>> 0) return - 1; + } + return 0; + } + function div_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + if(len2 == 1){ + div_digit_nat(nat1, ofs1 + 1, nat1, ofs1, nat1, ofs1, len1, nat2, ofs2); + return 0; + } + var s = num_leading_zero_bits_in_digit(nat2, ofs2 + len2 - 1); + shift_left_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + shift_left_nat(nat1, ofs1, len1, nat_of_array([0]), 0, s); + var d = (nat2.data[ofs2 + len2 - 1] >>> 0) + 1, a = create_nat(len2 + 1); + for(var i = len1 - 1; i >= len2; i--){ + var + quo = + d == 4294967296 + ? nat1.data[ofs1 + i] >>> 0 + : div_helper + (nat1.data[ofs1 + i] >>> 0, nat1.data[ofs1 + i - 1] >>> 0, d) + [0]; + set_to_zero_nat(a, 0, len2 + 1); + mult_digit_nat(a, 0, len2 + 1, nat2, ofs2, len2, nat_of_array([quo]), 0); + sub_nat(nat1, ofs1 + i - len2, len2 + 1, a, 0, len2 + 1, 1); + while + (nat1.data[ofs1 + i] != 0 + || compare_nat(nat1, ofs1 + i - len2, len2, nat2, ofs2, len2) >= 0){ + quo = quo + 1; + sub_nat(nat1, ofs1 + i - len2, len2 + 1, nat2, ofs2, len2, 1); + } + nat1.data[ofs1 + i] = quo; + } + shift_right_nat(nat1, ofs1, len2, nat_of_array([0]), 0, s); + shift_right_nat(nat2, ofs2, len2, nat_of_array([0]), 0, s); + return 0; + } + function caml_ba_blit(src, dst){ + if(dst.dims.length != src.dims.length) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + for(var i = 0; i < dst.dims.length; i++) + if(dst.dims[i] != src.dims[i]) + caml_invalid_argument("Bigarray.blit: dimension mismatch"); + dst.data.set(src.data); + return 0; + } + function is_digit_int(nat, ofs){if(nat.data[ofs] >= 0) return 1; return 0;} + function caml_int64_div(x, y){return x.div(y);} + function caml_js_html_entities(s){ + var entity = /^&#?[0-9a-zA-Z]+;$/; + if(s.match(entity)){ + var str, temp = document.createElement("p"); + temp.innerHTML = s; + str = temp.textContent || temp.innerText; + temp = null; + return str; + } + else + caml_failwith("Invalid entity " + s); + } + function caml_string_unsafe_set(s, i, c){ + caml_failwith("caml_string_unsafe_set"); + } + function caml_int64_of_float(x){ + if(x < 0) x = Math.ceil(x); + return new + MlInt64 + (x & 0xffffff, + Math.floor(x * caml_int64_offset) & 0xffffff, + Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff); + } + function caml_ml_channel_size_64(chanid){ + var chan = caml_ml_channels[chanid]; + return caml_int64_of_float(chan.file.length()); + } + function caml_ba_set_2(ba, i0, i1, v){ + ba.set(ba.offset([i0, i1]), v); + return 0; + } + var + caml_argv = + function(){ + var process = globalThis.process, main = "a.out", args = []; + if(process && process.argv && process.argv.length > 1){ + var argv = process.argv; + main = argv[1]; + args = argv.slice(2); + } + var p = caml_string_of_jsstring(main), args2 = [0, p]; + for(var i = 0; i < args.length; i++) + args2.push(caml_string_of_jsstring(args[i])); + return args2; + } + (), + caml_executable_name = caml_argv[1]; + function caml_js_eval_string(s){return eval(caml_jsstring_of_string(s));} + function serialize_nat(writer, nat, sz){ + var len = nat.data.length; + writer.write(32, len); + for(var i = 0; i < len; i++) writer.write(32, nat.data[i]); + sz[0] = len * 4; + sz[1] = len * 8; + } + function caml_memprof_set(_control){return 0;} + function caml_sys_exit(code){ + if(globalThis.quit) globalThis.quit(code); + if(globalThis.process && globalThis.process.exit) + globalThis.process.exit(code); + caml_invalid_argument("Function 'exit' not implemented"); + } + function caml_channel_descriptor(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.fd; + } + function caml_js_from_array(a){return a.slice(1);} + function caml_ba_reshape(ba, vind){ + vind = caml_js_from_array(vind); + var new_dim = [], num_dims = vind.length; + if(num_dims < 0 || num_dims > 16) + caml_invalid_argument("Bigarray.reshape: bad number of dimensions"); + var num_elts = 1; + for(var i = 0; i < num_dims; i++){ + new_dim[i] = vind[i]; + if(new_dim[i] < 0) + caml_invalid_argument("Bigarray.reshape: negative dimension"); + num_elts = num_elts * new_dim[i]; + } + var size = caml_ba_get_size(ba.dims); + if(num_elts != size) + caml_invalid_argument("Bigarray.reshape: size mismatch"); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dim, ba.data); + } + var caml_oo_last_id = 0; + function caml_set_oo_id(b){b[2] = caml_oo_last_id++; return b;} + function caml_gr_fill_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.fillRect(x, s.height - y, w, - h); + return 0; + } + function caml_bigstring_blit_string_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_string_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_string(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + function caml_gr_set_window_title(name){ + var s = caml_gr_state_get(); + s.title = name; + var jsname = caml_jsstring_of_string(name); + if(s.set_title) s.set_title(jsname); + return 0; + } + function caml_get_global_data(){return caml_global_data;} + function caml_int64_shift_right_unsigned(x, s){return x.shift_right_unsigned(s); + } + function caml_ba_uint8_get16(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + var b1 = ba.get(ofs), b2 = ba.get(ofs + 1); + return b1 | b2 << 8; + } + function caml_compare(a, b){return caml_compare_val(a, b, true);} + var + caml_MD5Transform = + function(){ + function add(x, y){return x + y | 0;} + function xx(q, a, b, x, s, t){ + a = add(add(a, q), add(x, t)); + return add(a << s | a >>> 32 - s, b); + } + function ff(a, b, c, d, x, s, t){ + return xx(b & c | ~ b & d, a, b, x, s, t); + } + function gg(a, b, c, d, x, s, t){ + return xx(b & d | c & ~ d, a, b, x, s, t); + } + function hh(a, b, c, d, x, s, t){return xx(b ^ c ^ d, a, b, x, s, t);} + function ii(a, b, c, d, x, s, t){ + return xx(c ^ (b | ~ d), a, b, x, s, t); + } + return function(w, buffer){ + var a = w[0], b = w[1], c = w[2], d = w[3]; + a = ff(a, b, c, d, buffer[0], 7, 0xD76AA478); + d = ff(d, a, b, c, buffer[1], 12, 0xE8C7B756); + c = ff(c, d, a, b, buffer[2], 17, 0x242070DB); + b = ff(b, c, d, a, buffer[3], 22, 0xC1BDCEEE); + a = ff(a, b, c, d, buffer[4], 7, 0xF57C0FAF); + d = ff(d, a, b, c, buffer[5], 12, 0x4787C62A); + c = ff(c, d, a, b, buffer[6], 17, 0xA8304613); + b = ff(b, c, d, a, buffer[7], 22, 0xFD469501); + a = ff(a, b, c, d, buffer[8], 7, 0x698098D8); + d = ff(d, a, b, c, buffer[9], 12, 0x8B44F7AF); + c = ff(c, d, a, b, buffer[10], 17, 0xFFFF5BB1); + b = ff(b, c, d, a, buffer[11], 22, 0x895CD7BE); + a = ff(a, b, c, d, buffer[12], 7, 0x6B901122); + d = ff(d, a, b, c, buffer[13], 12, 0xFD987193); + c = ff(c, d, a, b, buffer[14], 17, 0xA679438E); + b = ff(b, c, d, a, buffer[15], 22, 0x49B40821); + a = gg(a, b, c, d, buffer[1], 5, 0xF61E2562); + d = gg(d, a, b, c, buffer[6], 9, 0xC040B340); + c = gg(c, d, a, b, buffer[11], 14, 0x265E5A51); + b = gg(b, c, d, a, buffer[0], 20, 0xE9B6C7AA); + a = gg(a, b, c, d, buffer[5], 5, 0xD62F105D); + d = gg(d, a, b, c, buffer[10], 9, 0x02441453); + c = gg(c, d, a, b, buffer[15], 14, 0xD8A1E681); + b = gg(b, c, d, a, buffer[4], 20, 0xE7D3FBC8); + a = gg(a, b, c, d, buffer[9], 5, 0x21E1CDE6); + d = gg(d, a, b, c, buffer[14], 9, 0xC33707D6); + c = gg(c, d, a, b, buffer[3], 14, 0xF4D50D87); + b = gg(b, c, d, a, buffer[8], 20, 0x455A14ED); + a = gg(a, b, c, d, buffer[13], 5, 0xA9E3E905); + d = gg(d, a, b, c, buffer[2], 9, 0xFCEFA3F8); + c = gg(c, d, a, b, buffer[7], 14, 0x676F02D9); + b = gg(b, c, d, a, buffer[12], 20, 0x8D2A4C8A); + a = hh(a, b, c, d, buffer[5], 4, 0xFFFA3942); + d = hh(d, a, b, c, buffer[8], 11, 0x8771F681); + c = hh(c, d, a, b, buffer[11], 16, 0x6D9D6122); + b = hh(b, c, d, a, buffer[14], 23, 0xFDE5380C); + a = hh(a, b, c, d, buffer[1], 4, 0xA4BEEA44); + d = hh(d, a, b, c, buffer[4], 11, 0x4BDECFA9); + c = hh(c, d, a, b, buffer[7], 16, 0xF6BB4B60); + b = hh(b, c, d, a, buffer[10], 23, 0xBEBFBC70); + a = hh(a, b, c, d, buffer[13], 4, 0x289B7EC6); + d = hh(d, a, b, c, buffer[0], 11, 0xEAA127FA); + c = hh(c, d, a, b, buffer[3], 16, 0xD4EF3085); + b = hh(b, c, d, a, buffer[6], 23, 0x04881D05); + a = hh(a, b, c, d, buffer[9], 4, 0xD9D4D039); + d = hh(d, a, b, c, buffer[12], 11, 0xE6DB99E5); + c = hh(c, d, a, b, buffer[15], 16, 0x1FA27CF8); + b = hh(b, c, d, a, buffer[2], 23, 0xC4AC5665); + a = ii(a, b, c, d, buffer[0], 6, 0xF4292244); + d = ii(d, a, b, c, buffer[7], 10, 0x432AFF97); + c = ii(c, d, a, b, buffer[14], 15, 0xAB9423A7); + b = ii(b, c, d, a, buffer[5], 21, 0xFC93A039); + a = ii(a, b, c, d, buffer[12], 6, 0x655B59C3); + d = ii(d, a, b, c, buffer[3], 10, 0x8F0CCC92); + c = ii(c, d, a, b, buffer[10], 15, 0xFFEFF47D); + b = ii(b, c, d, a, buffer[1], 21, 0x85845DD1); + a = ii(a, b, c, d, buffer[8], 6, 0x6FA87E4F); + d = ii(d, a, b, c, buffer[15], 10, 0xFE2CE6E0); + c = ii(c, d, a, b, buffer[6], 15, 0xA3014314); + b = ii(b, c, d, a, buffer[13], 21, 0x4E0811A1); + a = ii(a, b, c, d, buffer[4], 6, 0xF7537E82); + d = ii(d, a, b, c, buffer[11], 10, 0xBD3AF235); + c = ii(c, d, a, b, buffer[2], 15, 0x2AD7D2BB); + b = ii(b, c, d, a, buffer[9], 21, 0xEB86D391); + w[0] = add(a, w[0]); + w[1] = add(b, w[1]); + w[2] = add(c, w[2]); + w[3] = add(d, w[3]);}; + } + (); + function caml_MD5Update(ctx, input, input_len){ + var in_buf = ctx.len & 0x3f, input_pos = 0; + ctx.len += input_len; + if(in_buf){ + var missing = 64 - in_buf; + if(input_len < missing){ + ctx.b8.set(input.subarray(0, input_len), in_buf); + return; + } + ctx.b8.set(input.subarray(0, missing), in_buf); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= missing; + input_pos += missing; + } + while(input_len >= 64){ + ctx.b8.set(input.subarray(input_pos, input_pos + 64), 0); + caml_MD5Transform(ctx.w, ctx.b32); + input_len -= 64; + input_pos += 64; + } + if(input_len) + ctx.b8.set(input.subarray(input_pos, input_pos + input_len), 0); + } + function caml_runtime_events_read_poll(cursor, callbacks, num){return 0;} + function caml_fresh_oo_id(){return caml_oo_last_id++;} + function caml_int64_to_float(x){return x.toFloat();} + function caml_ba_get_1(ba, i0){return ba.get(ba.offset(i0));} + function caml_bigstring_memcmp(s1, pos1, s2, pos2, len){ + for(var i = 0; i < len; i++){ + var a = caml_ba_get_1(s1, pos1 + i), b = caml_ba_get_1(s2, pos2 + i); + if(a < b) return - 1; + if(a > b) return 1; + } + return 0; + } + function caml_new_string(s){return caml_string_of_jsbytes(s);} + function caml_erf_float(x){ + var + a1 = 0.254829592, + a2 = - 0.284496736, + a3 = 1.421413741, + a4 = - 1.453152027, + a5 = 1.061405429, + p = 0.3275911, + sign = 1; + if(x < 0) sign = - 1; + x = Math.abs(x); + var + t = 1.0 / (1.0 + p * x), + y = + 1.0 + - + ((((a5 * t + a4) * t + a3) * t + a2) * t + a1) * t + * Math.exp(- (x * x)); + return sign * y; + } + function caml_ba_uint8_get32(ba, i0){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + var + b1 = ba.get(ofs + 0), + b2 = ba.get(ofs + 1), + b3 = ba.get(ofs + 2), + b4 = ba.get(ofs + 3); + return b1 << 0 | b2 << 8 | b3 << 16 | b4 << 24; + } + function caml_raw_backtrace_length(){return 0;} + function caml_str_initialize(unit){return 0;} + function caml_obj_block(tag, size){ + var o = new Array(size + 1); + o[0] = tag; + for(var i = 1; i <= size; i++) o[i] = 0; + return o; + } + function caml_gr_clear_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = s.width; + s.canvas.height = s.height; + return 0; + } + function bigstring_to_array_buffer(bs){return bs.data.buffer;} + function caml_sys_const_naked_pointers_checked(_unit){return 0;} + function lxor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] ^= nat2.data[ofs2]; return 0; + } + function caml_obj_add_offset(v, offset){ + caml_failwith("Obj.add_offset is not supported"); + } + function caml_final_release(){return 0;} + var caml_marshal_header_size = 20; + function caml_js_to_array(a){ + var len = a.length, b = new Array(len + 1); + b[0] = 0; + for(var i = 0; i < len; i++) b[i + 1] = a[i]; + return b; + } + function caml_sys_is_regular_file(name){ + var root = resolve_fs_device(name); + return root.device.isFile(root.rest); + } + function caml_gr_plot(x, y){ + var + s = caml_gr_state_get(), + im = s.context.createImageData(1, 1), + d = im.data, + color = s.color; + d[0] = color >> 16 & 0xff; + d[1] = color >> 8 & 0xff, d[2] = color >> 0 & 0xff; + d[3] = 0xFF; + s.x = x; + s.y = y; + s.context.putImageData(im, x, s.height - y); + return 0; + } + function caml_bytes_set64(s, i, i64){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = caml_int64_to_bytes(i64); + for(var j = 0; j < 8; j++) caml_bytes_unsafe_set(s, i + 7 - j, a[j]); + return 0; + } + function caml_string_set16(s, i, i16){caml_failwith("caml_string_set16");} + function caml_int64_bswap(x){ + var y = caml_int64_to_bytes(x); + return caml_int64_of_bytes + ([y[7], y[6], y[5], y[4], y[3], y[2], y[1], y[0]]); + } + function caml_gc_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_lex_array(s){ + s = caml_jsbytes_of_string(s); + var l = s.length / 2, a = new Array(l); + for(var i = 0; i < l; i++) + a[i] = (s.charCodeAt(2 * i) | s.charCodeAt(2 * i + 1) << 8) << 16 >> 16; + return a; + } + function caml_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0) return - base - 1; + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + function caml_sys_file_exists(name){ + var root = resolve_fs_device(name); + return root.device.exists(root.rest); + } + function caml_convert_raw_backtrace_slot(){ + caml_failwith("caml_convert_raw_backtrace_slot"); + } + function caml_array_sub(a, i, len){ + var a2 = new Array(len + 1); + a2[0] = 0; + for(var i2 = 1, i1 = i + 1; i2 <= len; i2++, i1++) a2[i2] = a[i1]; + return a2; + } + function caml_bytes_equal(s1, s2){ + if(s1 === s2) return 1; + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c == s2.c ? 1 : 0; + } + function caml_gr_size_x(){var s = caml_gr_state_get(); return s.width;} + function Base_int_math_int32_clz(x){ + var n = 32, y; + y = x >> 16; + if(y != 0){n = n - 16; x = y;} + y = x >> 8; + if(y != 0){n = n - 8; x = y;} + y = x >> 4; + if(y != 0){n = n - 4; x = y;} + y = x >> 2; + if(y != 0){n = n - 2; x = y;} + y = x >> 1; + if(y != 0) return n - 2; + return n - x; + } + function caml_ml_debug_info_status(){return 0;} + function caml_atomic_fetch_add(ref, i){ + var old = ref[1]; + ref[1] += i; + return old; + } + var + os_type = + globalThis.process && globalThis.process.platform + && globalThis.process.platform == "win32" + ? "Cygwin" + : "Unix"; + function caml_sys_const_ostype_cygwin(){return os_type == "Cygwin" ? 1 : 0; + } + function caml_cosh_float(x){return Math.cosh(x);} + function MlMutex(){this.locked = false;} + function caml_ml_mutex_new(unit){return new MlMutex();} + var caml_ephe_key_offset = 3; + function caml_ephe_check_key(x, i){ + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : 1; + } + function caml_hash_mix_final(h){ + h ^= h >>> 16; + h = caml_mul(h, 0x85ebca6b | 0); + h ^= h >>> 13; + h = caml_mul(h, 0xc2b2ae35 | 0); + h ^= h >>> 16; + return h; + } + function caml_gr_text_size(txt){ + var + s = caml_gr_state_get(), + w = s.context.measureText(caml_jsstring_of_string(txt)).width; + return [0, w, s.text_size]; + } + function caml_lex_run_mem(s, i, mem, curr_pos){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) + mem[dst + 1] = curr_pos; + else + mem[dst + 1] = mem[src + 1]; + } + } + function caml_lex_run_tag(s, i, mem){ + for(;;){ + var dst = s.charCodeAt(i); + i++; + if(dst == 0xff) return; + var src = s.charCodeAt(i); + i++; + if(src == 0xff) mem[dst + 1] = - 1; else mem[dst + 1] = mem[src + 1]; + } + } + function caml_new_lex_engine(tbl, start_state, lexbuf){ + var + lex_buffer = 2, + lex_buffer_len = 3, + lex_start_pos = 5, + lex_curr_pos = 6, + lex_last_pos = 7, + lex_last_action = 8, + lex_eof_reached = 9, + lex_mem = 10, + lex_base = 1, + lex_backtrk = 2, + lex_default = 3, + lex_trans = 4, + lex_check = 5, + lex_base_code = 6, + lex_backtrk_code = 7, + lex_default_code = 8, + lex_trans_code = 9, + lex_check_code = 10, + lex_code = 11; + if(! tbl.lex_default){ + tbl.lex_base = caml_lex_array(tbl[lex_base]); + tbl.lex_backtrk = caml_lex_array(tbl[lex_backtrk]); + tbl.lex_check = caml_lex_array(tbl[lex_check]); + tbl.lex_trans = caml_lex_array(tbl[lex_trans]); + tbl.lex_default = caml_lex_array(tbl[lex_default]); + } + if(! tbl.lex_default_code){ + tbl.lex_base_code = caml_lex_array(tbl[lex_base_code]); + tbl.lex_backtrk_code = caml_lex_array(tbl[lex_backtrk_code]); + tbl.lex_check_code = caml_lex_array(tbl[lex_check_code]); + tbl.lex_trans_code = caml_lex_array(tbl[lex_trans_code]); + tbl.lex_default_code = caml_lex_array(tbl[lex_default_code]); + } + if(tbl.lex_code == null) + tbl.lex_code = caml_jsbytes_of_string(tbl[lex_code]); + var + c, + state = start_state, + buffer = caml_uint8_array_of_bytes(lexbuf[lex_buffer]); + if(state >= 0){ + lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = - 1; + } + else + state = - state - 1; + for(;;){ + var base = tbl.lex_base[state]; + if(base < 0){ + var pc_off = tbl.lex_base_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + return - base - 1; + } + var backtrk = tbl.lex_backtrk[state]; + if(backtrk >= 0){ + var pc_off = tbl.lex_backtrk_code[state]; + caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]); + lexbuf[lex_last_pos] = lexbuf[lex_curr_pos]; + lexbuf[lex_last_action] = backtrk; + } + if(lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]) + if(lexbuf[lex_eof_reached] == 0) return - state - 1; else c = 256; + else{c = buffer[lexbuf[lex_curr_pos]]; lexbuf[lex_curr_pos]++;} + var pstate = state; + if(tbl.lex_check[base + c] == state) + state = tbl.lex_trans[base + c]; + else + state = tbl.lex_default[state]; + if(state < 0){ + lexbuf[lex_curr_pos] = lexbuf[lex_last_pos]; + if(lexbuf[lex_last_action] == - 1) + caml_failwith("lexing: empty token"); + else + return lexbuf[lex_last_action]; + } + else{ + var base_code = tbl.lex_base_code[pstate], pc_off; + if(tbl.lex_check_code[base_code + c] == pstate) + pc_off = tbl.lex_trans_code[base_code + c]; + else + pc_off = tbl.lex_default_code[pstate]; + if(pc_off > 0) + caml_lex_run_mem + (tbl.lex_code, pc_off, lexbuf[lex_mem], lexbuf[lex_curr_pos]); + if(c == 256) lexbuf[lex_eof_reached] = 0; + } + } + } + function caml_ba_uint8_set64(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 7 >= ba.data.length) caml_array_bound_error(); + var v = caml_int64_to_bytes(v); + for(var i = 0; i < 8; i++) ba.set(ofs + i, v[7 - i]); + return 0; + } + function caml_sys_executable_name(a){return caml_executable_name;} + function caml_lessequal(x, y){ + return + (caml_compare_val(x, y, false) <= 0); + } + function caml_acosh_float(x){return Math.acosh(x);} + function caml_MD5Init(){ + var + buffer = new ArrayBuffer(64), + b32 = new Uint32Array(buffer), + b8 = new Uint8Array(buffer); + return {len: 0, + w: + new Uint32Array([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476]), + b32: b32, + b8: b8}; + } + function caml_ml_flush(chanid){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) caml_raise_sys_error("Cannot flush a closed channel"); + if(! chan.buffer || chan.buffer_curr == 0) return 0; + if(chan.output) + chan.output(caml_subarray_to_jsbytes(chan.buffer, 0, chan.buffer_curr)); + else + chan.file.write(chan.offset, chan.buffer, 0, chan.buffer_curr); + chan.offset += chan.buffer_curr; + chan.buffer_curr = 0; + return 0; + } + function caml_seek_out(chanid, pos){ + caml_ml_flush(chanid); + var chan = caml_ml_channels[chanid]; + chan.offset = pos; + return 0; + } + function caml_ml_seek_out_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_out(chanid, pos); + } + function compare_nat_real(nat1, nat2){ + return compare_nat(nat1, 0, nat1.data.length, nat2, 0, nat2.data.length); + } + function caml_gc_set(_control){return 0;} + function caml_js_get(o, f){return o[f];} + function caml_unix_isatty(fileDescriptor){ + if(fs_node_supported()){ + var tty = require("tty"); + return tty.isatty(fileDescriptor) ? 1 : 0; + } + else + return 0; + } + function caml_ml_set_buffered(chanid, v){ + caml_ml_channels[chanid].buffered = v; + if(! v) caml_ml_flush(chanid); + return 0; + } + function caml_hash_mix_bytes_arr(h, s){ + var len = s.length, i, w; + for(i = 0; i + 4 <= len; i += 4){ + w = s[i] | s[i + 1] << 8 | s[i + 2] << 16 | s[i + 3] << 24; + h = caml_hash_mix_int(h, w); + } + w = 0; + switch(len & 3){ + case 3: + w = s[i + 2] << 16; + case 2: + w |= s[i + 1] << 8; + case 1: + w |= s[i]; h = caml_hash_mix_int(h, w); + } + h ^= len; + return h; + } + function caml_ml_bytes_content(s){ + switch(s.t & 6){ + default: caml_convert_string_to_bytes(s); + case 0: + return s.c; + case 4: + return s.c; + } + } + function caml_hash_mix_bytes(h, v){ + var content = caml_ml_bytes_content(v); + return typeof content === "string" + ? caml_hash_mix_jsbytes(h, content) + : caml_hash_mix_bytes_arr(h, content); + } + function caml_hash(count, limit, seed, obj){ + var queue, rd, wr, sz, num, h, v, i, len; + sz = limit; + if(sz < 0 || sz > 256) sz = 256; + num = count; + h = seed; + queue = [obj]; + rd = 0; + wr = 1; + while(rd < wr && num > 0){ + v = queue[rd++]; + if(v && v.caml_custom){ + if + (caml_custom_ops[v.caml_custom] && caml_custom_ops[v.caml_custom].hash){ + var hh = caml_custom_ops[v.caml_custom].hash(v); + h = caml_hash_mix_int(h, hh); + num--; + } + } + else if(v instanceof Array && v[0] === (v[0] | 0)) + switch(v[0]){ + case 248: + h = caml_hash_mix_int(h, v[2]); num--; break; + case 250: + queue[--rd] = v[1]; break; + default: + if(caml_is_continuation_tag(v[0])) break; + var tag = v.length - 1 << 10 | v[0]; + h = caml_hash_mix_int(h, tag); + for(i = 1, len = v.length; i < len; i++){if(wr >= sz) break; queue[wr++] = v[i]; + } + break; + } + else if(caml_is_ml_bytes(v)){ + h = caml_hash_mix_bytes(h, v); + num--; + } + else if(caml_is_ml_string(v)){ + h = caml_hash_mix_string(h, v); + num--; + } + else if(typeof v === "string"){ + h = caml_hash_mix_jsbytes(h, v); + num--; + } + else if(v === (v | 0)){ + h = caml_hash_mix_int(h, v + v + 1); + num--; + } + else if(v === + v){h = caml_hash_mix_float(h, v); num--;} + } + h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function Base_hash_string(s){return caml_hash(1, 1, 0, s);} + function caml_gc_compaction(){return 0;} + function caml_ephe_get_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_key"); + var weak = x[caml_ephe_key_offset + i]; + if(globalThis.WeakRef && weak instanceof globalThis.WeakRef) + weak = weak.deref(); + return weak === undefined ? 0 : [0, weak]; + } + function caml_unix_localtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(d.getFullYear(), 0, 1).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000), + jan = new Date(d.getFullYear(), 0, 1), + jul = new Date(d.getFullYear(), 6, 1), + stdTimezoneOffset = + Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset()); + return [0, + d.getSeconds(), + d.getMinutes(), + d.getHours(), + d.getDate(), + d.getMonth(), + d.getFullYear() - 1900, + d.getDay(), + doy, + d.getTimezoneOffset() < stdTimezoneOffset | 0]; + } + function caml_unix_mktime(tm){ + var + d = new Date(tm[6] + 1900, tm[5], tm[4], tm[3], tm[2], tm[1]).getTime(), + t = Math.floor(d / 1000), + tm2 = caml_unix_localtime(t); + return [0, t, tm2]; + } + function caml_bigstring_blit_bytes_to_ba(str1, pos1, ba2, pos2, len){ + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs2 = ba2.offset(pos2); + if(pos1 + len > caml_ml_bytes_length(str1)) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = caml_uint8_array_of_bytes(str1).slice(pos1, pos1 + len); + ba2.data.set(slice, ofs2); + return 0; + } + var caml_sys_fds = new Array(3); + function caml_sys_close(fd){ + var file = caml_sys_fds[fd]; + if(file) file.close(); + delete caml_sys_fds[fd]; + return 0; + } + function caml_ml_close_channel(chanid){ + var chan = caml_ml_channels[chanid]; + chan.opened = false; + caml_sys_close(chan.fd); + return 0; + } + function Base_int_math_int_pow_stub(base, exponent){ + var one = 1, mul = [one, base, one, one], res = one; + while(! exponent == 0){ + mul[1] = mul[1] * mul[3] | 0; + mul[2] = mul[1] * mul[1] | 0; + mul[3] = mul[2] * mul[1] | 0; + res = res * mul[exponent & 3] | 0; + exponent = exponent >> 2; + } + return res; + } + function caml_atomic_exchange(ref, v){ + var r = ref[1]; + ref[1] = v; + return r; + } + function caml_sys_isatty(_chan){return 0;} + function is_digit_zero(nat, ofs){ + if(nat.data[ofs] == 0) return 1; + return 0; + } + function caml_unix_lstat(name){ + var root = resolve_fs_device(name); + if(! root.device.lstat) caml_failwith("caml_unix_lstat: not implemented"); + return root.device.lstat(root.rest, true); + } + function caml_unix_lstat_64(name){ + var r = caml_unix_lstat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_js_set(o, f, v){o[f] = v; return 0;} + function caml_array_get(array, index){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + return array[index + 1]; + } + function caml_continuation_use_noexc(cont){ + var stack = cont[1]; + cont[1] = 0; + return stack; + } + function caml_unix_rmdir(name){ + var root = resolve_fs_device(name); + if(! root.device.rmdir) caml_failwith("caml_unix_rmdir: not implemented"); + return root.device.rmdir(root.rest, true); + } + function caml_log2_float(x){return Math.log2(x);} + function caml_gc_huge_fallback_count(unit){return 0;} + function caml_runtime_events_resume(){return 0;} + function caml_spacetime_only_works_for_native_code(){ + caml_failwith("Spacetime profiling only works for native code"); + } + function caml_int64_sub(x, y){return x.sub(y);} + function caml_seek_in(chanid, pos){ + var chan = caml_ml_channels[chanid]; + if(chan.refill != null) caml_raise_sys_error("Illegal seek"); + if + (pos >= chan.offset - chan.buffer_max && pos <= chan.offset + && chan.file.flags.binary) + chan.buffer_curr = chan.buffer_max - (chan.offset - pos); + else{chan.offset = pos; chan.buffer_curr = 0; chan.buffer_max = 0;} + return 0; + } + function caml_ml_seek_in_64(chanid, pos){ + var pos = caml_int64_to_float(pos); + return caml_seek_in(chanid, pos); + } + var caml_domain_id = 0; + function caml_ml_mutex_unlock(t){t.locked = false; return 0;} + var caml_domain_latest_idx = 1; + function caml_domain_spawn(f, mutex){ + var id = caml_domain_latest_idx++, old = caml_domain_id; + caml_domain_id = id; + caml_callback(f, [0]); + caml_domain_id = old; + caml_ml_mutex_unlock(mutex); + return id; + } + function caml_unix_mkdir(name, perm){ + var root = resolve_fs_device(name); + if(! root.device.mkdir) caml_failwith("caml_unix_mkdir: not implemented"); + return root.device.mkdir(root.rest, perm, true); + } + function caml_int64_shift_left(x, s){return x.shift_left(s);} + function caml_notequal(x, y){ + return + (caml_compare_val(x, y, false) != 0); + } + function caml_sys_const_int_size(){return 32;} + function caml_js_wrap_callback(f){ + return function(){ + var len = arguments.length; + if(len > 0){ + var args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + } + else + args = [undefined]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_js_wrap_meth_callback(f){ + return function(){ + var len = arguments.length, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + var res = caml_callback(f, args); + return res instanceof Function ? caml_js_wrap_callback(res) : res;}; + } + function caml_is_js(){return 1;} + var Base_internalhash_fold_float = caml_hash_mix_float; + function caml_lazy_update_to_forward(o){ + caml_obj_update_tag(o, 244, 250); + return 0; + } + function caml_ba_dim(ba, i){ + if(i < 0 || i >= ba.dims.length) caml_invalid_argument("Bigarray.dim"); + return ba.dims[i]; + } + function caml_ba_dim_1(ba){return caml_ba_dim(ba, 0);} + function caml_js_meth_call(o, f, args){ + return o[caml_jsstring_of_string(f)].apply(o, caml_js_from_array(args)); + } + var caml_ephe_data_offset = 2; + function caml_weak_create(n){ + if(n < 0) caml_invalid_argument("Weak.create"); + var x = [251, "caml_ephe_list_head"]; + x.length = caml_ephe_key_offset + n; + return x; + } + function caml_ephe_create(n){var x = caml_weak_create(n); return x;} + function caml_js_to_byte_string(s){return caml_string_of_jsbytes(s);} + function caml_trampoline(res){ + var c = 1; + while(res && res.joo_tramp){ + res = res.joo_tramp.apply(null, res.joo_args); + c++; + } + return res; + } + function caml_maybe_print_stats(unit){return 0;} + function caml_bytes_unsafe_get(s, i){ + switch(s.t & 6){ + default: if(i >= s.c.length) return 0; + case 0: + return s.c.charCodeAt(i); + case 4: + return s.c[i]; + } + } + function caml_bytes_get64(s, i){ + if(i >>> 0 >= s.l - 7) caml_bytes_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_bytes_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + var caml_custom_event_index = 0; + function caml_runtime_events_user_register + (event_name, event_tag, event_type){ + caml_custom_event_index += 1; + return [0, caml_custom_event_index, event_name, event_type, event_tag]; + } + function caml_unix_has_symlink(unit){return fs_node_supported() ? 1 : 0;} + function caml_ephe_set_key(x, i, v){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if(v instanceof Object && globalThis.WeakRef){ + if(x[1].register) x[1].register(v, undefined, v); + x[caml_ephe_key_offset + i] = new globalThis.WeakRef(v); + } + else + x[caml_ephe_key_offset + i] = v; + return 0; + } + function caml_ephe_unset_key(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.set"); + if + (globalThis.WeakRef + && x[caml_ephe_key_offset + i] instanceof globalThis.WeakRef + && x[1].unregister){ + var old = x[caml_ephe_key_offset + i].deref(); + if(old !== undefined){ + var count = 0; + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key === old) count++; + } + } + if(count == 1) x[1].unregister(old); + } + } + x[caml_ephe_key_offset + i] = undefined; + return 0; + } + function caml_weak_set(x, i, v){ + if(v == 0) caml_ephe_unset_key(x, i); else caml_ephe_set_key(x, i, v[1]); + return 0; + } + function caml_sys_remove(name){ + var root = resolve_fs_device(name), ok = root.device.unlink(root.rest); + if(ok == 0) caml_raise_no_such_file(caml_jsbytes_of_string(name)); + return 0; + } + function caml_string_bound_error(){ + caml_invalid_argument("index out of bounds"); + } + function caml_string_get32(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 3) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1), + b3 = caml_string_unsafe_get(s, i + 2), + b4 = caml_string_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_bytes_get(s, i){ + if(i >>> 0 >= s.l) caml_bytes_bound_error(); + return caml_bytes_unsafe_get(s, i); + } + function caml_hypot_float(x, y){return Math.hypot(x, y);} + function caml_js_call(f, o, args){ + return f.apply(o, caml_js_from_array(args)); + } + function caml_sys_const_max_wosize(){return 0x7FFFFFFF / 4 | 0;} + function caml_unix_inet_addr_of_string(){return 0;} + function Base_am_testing(x){return 0;} + function caml_bytes_lessthan(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c < s2.c ? 1 : 0; + } + function caml_erfc_float(x){return 1 - caml_erf_float(x);} + function caml_gr_fill_poly(ar){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(ar[1][1], s.height - ar[1][2]); + for(var i = 2; i < ar.length; i++) + s.context.lineTo(ar[i][1], s.height - ar[i][2]); + s.context.lineTo(ar[1][1], s.height - ar[1][2]); + s.context.fill(); + return 0; + } + function caml_gc_quick_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_ml_input_char(chanid){ + var chan = caml_ml_channels[chanid]; + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) caml_raise_end_of_file(); + var res = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + return res; + } + function caml_ml_input_int(chanid){ + var chan = caml_ml_channels[chanid], res = 0; + for(var i = 0; i < 4; i++) + res = (res << 8) + caml_ml_input_char(chanid) | 0; + return res | 0; + } + function caml_gr_display_mode(){ + caml_failwith("caml_gr_display_mode not Implemented"); + } + function caml_obj_reachable_words(o){return 0;} + function nth_digit_nat(nat, ofs){return nat.data[ofs];} + function caml_array_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_float_of_string(s){ + var res; + s = caml_jsbytes_of_string(s); + res = + s; + if(s.length > 0 && res === res) return res; + s = s.replace(/_/g, ""); + res = + s; + if(s.length > 0 && res === res || /^[+-]?nan$/i.test(s)) return res; + var m = /^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?/i.exec(s); + if(m){ + var + m3 = m[3].replace(/0+$/, ""), + mantissa = parseInt(m[1] + m[2] + m3, 16), + exponent = (m[5] | 0) - 4 * m3.length; + res = mantissa * Math.pow(2, exponent); + return res; + } + if(/^\+?inf(inity)?$/i.test(s)) return Infinity; + if(/^-inf(inity)?$/i.test(s)) return - Infinity; + caml_failwith("float_of_string"); + } + function caml_sys_getcwd(){ + return caml_string_of_jsbytes(caml_current_dir); + } + function caml_int64_add(x, y){return x.add(y);} + function caml_int64_mul(x, y){return x.mul(y);} + function caml_int64_ult(x, y){return x.ucompare(y) < 0;} + function caml_parse_sign_and_base(s){ + var i = 0, len = caml_ml_string_length(s), base = 10, sign = 1; + if(len > 0) + switch(caml_string_unsafe_get(s, i)){ + case 45: + i++; sign = - 1; break; + case 43: + i++; sign = 1; break; + } + if(i + 1 < len && caml_string_unsafe_get(s, i) == 48) + switch(caml_string_unsafe_get(s, i + 1)){ + case 120: + case 88: + base = 16; i += 2; break; + case 111: + case 79: + base = 8; i += 2; break; + case 98: + case 66: + base = 2; i += 2; break; + case 117: + case 85: + i += 2; break; + } + return [i, sign, base]; + } + function caml_parse_digit(c){ + if(c >= 48 && c <= 57) return c - 48; + if(c >= 65 && c <= 90) return c - 55; + if(c >= 97 && c <= 122) return c - 87; + return - 1; + } + function caml_int64_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + base64 = caml_int64_of_int32(base), + threshold = + new MlInt64(0xffffff, 0xfffffff, 0xffff).udivmod(base64).quotient, + c = caml_string_unsafe_get(s, i), + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = caml_int64_of_int32(d); + for(;;){ + i++; + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + if(caml_int64_ult(threshold, res)) caml_failwith("int_of_string"); + d = caml_int64_of_int32(d); + res = caml_int64_add(caml_int64_mul(base64, res), d); + if(caml_int64_ult(res, d)) caml_failwith("int_of_string"); + } + if(i != caml_ml_string_length(s)) caml_failwith("int_of_string"); + if(base == 10 && caml_int64_ult(new MlInt64(0, 0, 0x8000), res)) + caml_failwith("int_of_string"); + if(sign < 0) res = caml_int64_neg(res); + return res; + } + function caml_ba_set_1(ba, i0, v){ba.set(ba.offset(i0), v); return 0;} + function caml_int64_xor(x, y){return x.xor(y);} + function caml_int64_or(x, y){return x.or(y);} + function caml_lxm_next(v){ + function shift_l(x, k){return caml_int64_shift_left(x, k);} + function shift_r(x, k){return caml_int64_shift_right_unsigned(x, k);} + function or(a, b){return caml_int64_or(a, b);} + function xor(a, b){return caml_int64_xor(a, b);} + function add(a, b){return caml_int64_add(a, b);} + function mul(a, b){return caml_int64_mul(a, b);} + function rotl(x, k){return or(shift_l(x, k), shift_r(x, 64 - k));} + function get(a, i){return caml_ba_get_1(a, i);} + function set(a, i, x){return caml_ba_set_1(a, i, x);} + var + M = caml_int64_of_string(caml_new_string("0xd1342543de82ef95")), + daba = caml_int64_of_string(caml_new_string("0xdaba0b6eb09322e3")), + z, + q0, + q1, + st = v, + a = get(st, 0), + s = get(st, 1), + x0 = get(st, 2), + x1 = get(st, 3); + z = add(s, x0); + z = mul(xor(z, shift_r(z, 32)), daba); + z = mul(xor(z, shift_r(z, 32)), daba); + z = xor(z, shift_r(z, 32)); + set(st, 1, add(mul(s, M), a)); + var q0 = x0, q1 = x1; + q1 = xor(q1, q0); + q0 = rotl(q0, 24); + q0 = xor(xor(q0, q1), shift_l(q1, 16)); + q1 = rotl(q1, 37); + set(st, 2, q0); + set(st, 3, q1); + return z; + } + function caml_sys_const_big_endian(){return 0;} + function caml_list_to_js_array(l){ + var a = []; + for(; l !== 0; l = l[2]) a.push(l[1]); + return a; + } + var + caml_output_val = + function(){ + function Writer(){this.chunk = [];} + Writer.prototype = + {chunk_idx: 20, + block_len: 0, + obj_counter: 0, + size_32: 0, + size_64: 0, + write: + function(size, value){ + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_at: + function(pos, size, value){ + var pos = pos; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[pos++] = value >> i & 0xFF; + }, + write_code: + function(size, code, value){ + this.chunk[this.chunk_idx++] = code; + for(var i = size - 8; i >= 0; i -= 8) + this.chunk[this.chunk_idx++] = value >> i & 0xFF; + }, + write_shared: + function(offset){ + if(offset < 1 << 8) + this.write_code(8, 0x04, offset); + else if(offset < 1 << 16) + this.write_code(16, 0x05, offset); + else + this.write_code(32, 0x06, offset); + }, + pos: function(){return this.chunk_idx;}, + finalize: + function(){ + this.block_len = this.chunk_idx - 20; + this.chunk_idx = 0; + this.write(32, 0x8495A6BE); + this.write(32, this.block_len); + this.write(32, this.obj_counter); + this.write(32, this.size_32); + this.write(32, this.size_64); + return this.chunk; + }}; + return function(v, flags){ + flags = caml_list_to_js_array(flags); + var + no_sharing = flags.indexOf(0) !== - 1, + closures = flags.indexOf(1) !== - 1; + if(closures) + console.warn + ("in caml_output_val: flag Marshal.Closures is not supported."); + var + writer = new Writer(), + stack = [], + intern_obj_table = no_sharing ? null : new MlObjectTable(); + function memo(v){ + if(no_sharing) return false; + var existing_offset = intern_obj_table.recall(v); + if(existing_offset){ + writer.write_shared(existing_offset); + return true; + } + else{intern_obj_table.store(v); return false;} + } + function extern_rec(v){ + if(v.caml_custom){ + if(memo(v)) return; + var + name = v.caml_custom, + ops = caml_custom_ops[name], + sz_32_64 = [0, 0]; + if(! ops.serialize) + caml_invalid_argument("output_value: abstract value (Custom)"); + if(ops.fixed_length == undefined){ + writer.write(8, 0x18); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var header_pos = writer.pos(); + for(var i = 0; i < 12; i++) writer.write(8, 0); + ops.serialize(writer, v, sz_32_64); + writer.write_at(header_pos, 32, sz_32_64[0]); + writer.write_at(header_pos + 4, 32, 0); + writer.write_at(header_pos + 8, 32, sz_32_64[1]); + } + else{ + writer.write(8, 0x19); + for(var i = 0; i < name.length; i++) + writer.write(8, name.charCodeAt(i)); + writer.write(8, 0); + var old_pos = writer.pos(); + ops.serialize(writer, v, sz_32_64); + if(ops.fixed_length != writer.pos() - old_pos) + caml_failwith + ("output_value: incorrect fixed sizes specified by " + name); + } + writer.size_32 += 2 + (sz_32_64[0] + 3 >> 2); + writer.size_64 += 2 + (sz_32_64[1] + 7 >> 3); + } + else if(v instanceof Array && v[0] === (v[0] | 0)){ + if(v[0] == 251) + caml_failwith("output_value: abstract value (Abstract)"); + if(caml_is_continuation_tag(v[0])) + caml_invalid_argument("output_value: continuation value"); + if(v.length > 1 && memo(v)) return; + if(v[0] < 16 && v.length - 1 < 8) + writer.write(8, 0x80 + v[0] + (v.length - 1 << 4)); + else + writer.write_code(32, 0x08, v.length - 1 << 10 | v[0]); + writer.size_32 += v.length; + writer.size_64 += v.length; + if(v.length > 1) stack.push(v, 1); + } + else if(caml_is_ml_bytes(v)){ + if(! caml_is_ml_bytes(caml_string_of_jsbytes(""))) + caml_failwith + ("output_value: [Bytes.t] cannot safely be marshaled with [--enable use-js-string]"); + if(memo(v)) return; + var len = caml_ml_bytes_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_bytes_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(caml_is_ml_string(v)){ + var len = caml_ml_string_length(v); + if(len < 0x20) + writer.write(8, 0x20 + len); + else if(len < 0x100) + writer.write_code(8, 0x09, len); + else + writer.write_code(32, 0x0A, len); + for(var i = 0; i < len; i++) + writer.write(8, caml_string_unsafe_get(v, i)); + writer.size_32 += 1 + ((len + 4) / 4 | 0); + writer.size_64 += 1 + ((len + 8) / 8 | 0); + } + else if(v != (v | 0)){ + var type_of_v = typeof v; + caml_failwith("output_value: abstract value (" + type_of_v + ")"); + } + else if(v >= 0 && v < 0x40) + writer.write(8, 0X40 + v); + else if(v >= - (1 << 7) && v < 1 << 7) + writer.write_code(8, 0x00, v); + else if(v >= - (1 << 15) && v < 1 << 15) + writer.write_code(16, 0x01, v); + else + writer.write_code(32, 0x02, v); + } + extern_rec(v); + while(stack.length > 0){ + var i = stack.pop(), v = stack.pop(); + if(i + 1 < v.length) stack.push(v, i + 1); + extern_rec(v[i]); + } + if(intern_obj_table) + writer.obj_counter = intern_obj_table.objs.length; + writer.finalize(); + return writer.chunk;}; + } + (); + function caml_string_of_array(a){ + return caml_string_of_jsbytes(caml_subarray_to_jsbytes(a, 0, a.length)); + } + function caml_output_value_to_string(v, flags){ + return caml_string_of_array(caml_output_val(v, flags)); + } + function caml_raise_not_a_dir(name){ + caml_raise_sys_error(name + ": Not a directory"); + } + function caml_sys_system_command(cmd){ + var cmd = caml_jsstring_of_string(cmd); + if(typeof require != "undefined"){ + var child_process = require("child_process"); + if(child_process && child_process.execSync) + try{child_process.execSync(cmd, {stdio: "inherit"}); return 0;} + catch(e){return 1;} + } + else + return 127; + } + function caml_js_error_of_exception(exn){ + if(exn.js_error) return exn.js_error; + return null; + } + function caml_unix_getuid(unit){ + if(globalThis.process && globalThis.process.getuid) + return globalThis.process.getuid(); + caml_raise_not_found(); + } + function deserialize_nat(reader, sz){ + var len = reader.read32s(), nat = new MlNat(len); + for(var i = 0; i < len; i++) nat.data[i] = reader.read32s(); + sz[0] = len * 4; + return nat; + } + function initialize_nat(){ + caml_custom_ops["_nat"] = + {deserialize: deserialize_nat, + serialize: serialize_nat, + hash: caml_hash_nat}; + } + function caml_bytes_of_utf16_jsstring(s){ + var tag = 9; + if(! jsoo_is_ascii(s)) tag = 8, s = caml_utf8_of_utf16(s); + return new MlBytes(tag, s, s.length); + } + function caml_gr_open_subwindow(a, b, c, d){ + caml_failwith("caml_gr_open_subwindow not Implemented"); + } + function UInt8ArrayReader(s, i){this.s = s; this.i = i;} + UInt8ArrayReader.prototype = + {read8u: function(){return this.s[this.i++];}, + read8s: function(){return this.s[this.i++] << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 8 | s[i + 1]; + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s[i] << 24 >> 16 | s[i + 1]; + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]) >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s[i] << 24 | s[i + 1] << 16 | s[i + 2] << 8 | s[i + 3]; + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_array(this.s.subarray(i, i + len)); + }, + readuint8array: + function(len){ + var i = this.i; + this.i = i + len; + return this.s.subarray(i, i + len); + }}; + function caml_marshal_data_size(s, ofs){ + var r = new UInt8ArrayReader(caml_uint8_array_of_bytes(s), ofs); + function readvlq(overflow){ + var c = r.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = r.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + switch(r.read32u()){ + case 0x8495A6BE: + var header_len = 20, data_len = r.read32u(); break; + case 0x8495A6BD: + var + header_len = r.read8u() & 0x3F, + overflow = [false], + data_len = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("Marshal.data_size: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + default: caml_failwith("Marshal.data_size: bad object"); break; + } + return header_len - caml_marshal_header_size + data_len; + } + function MlStringReader(s, i){ + this.s = caml_jsbytes_of_string(s); + this.i = i; + } + MlStringReader.prototype = + {read8u: function(){return this.s.charCodeAt(this.i++);}, + read8s: function(){return this.s.charCodeAt(this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 8 | s.charCodeAt(i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return s.charCodeAt(i) << 24 >> 16 | s.charCodeAt(i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return s.charCodeAt(i) << 24 | s.charCodeAt(i + 1) << 16 + | s.charCodeAt(i + 2) << 8 + | s.charCodeAt(i + 3); + }, + readstr: + function(len){ + var i = this.i; + this.i = i + len; + return caml_string_of_jsbytes(this.s.substring(i, i + len)); + }, + readuint8array: + function(len){ + var b = new Uint8Array(len), s = this.s, i = this.i; + for(var j = 0; j < len; j++) b[j] = s.charCodeAt(i + j); + this.i = i + len; + return b; + }}; + var + zstd_decompress = + function(){ + "use strict"; + var + ab = ArrayBuffer, + u8 = Uint8Array, + u16 = Uint16Array, + i16 = Int16Array, + u32 = Uint32Array, + i32 = Int32Array; + function slc(v, s, e){ + if(u8.prototype.slice) return u8.prototype.slice.call(v, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + var n = new u8(e - s); + n.set(v.subarray(s, e)); + return n; + } + function fill(v, n, s, e){ + if(u8.prototype.fill) return u8.prototype.fill.call(v, n, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + for(; s < e; ++s) v[s] = n; + return v; + } + function cpw(v, t, s, e){ + if(u8.prototype.copyWithin) + return u8.prototype.copyWithin.call(v, t, s, e); + if(s == null || s < 0) s = 0; + if(e == null || e > v.length) e = v.length; + while(s < e) v[t++] = v[s++]; + } + var + ec = + ["invalid zstd data", + "window size too large (>2046MB)", + "invalid block type", + "FSE accuracy too high", + "match distance too far back", + "unexpected EOF"]; + function err(ind, msg, nt){ + var e = new Error(msg || ec[ind]); + e.code = ind; + if(! nt) throw e; + return e; + } + function rb(d, b, n){ + var i = 0, o = 0; + for(; i < n; ++i) o |= d[b++] << (i << 3); + return o; + } + function b4(d, b){ + return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0; + } + function rzfh(dat, w){ + var n3 = dat[0] | dat[1] << 8 | dat[2] << 16; + if(n3 == 0x2FB528 && dat[3] == 253){ + var + flg = dat[4], + ss = flg >> 5 & 1, + cc = flg >> 2 & 1, + df = flg & 3, + fcf = flg >> 6; + if(flg & 8) err(0); + var bt = 6 - ss, db = df == 3 ? 4 : df, di = rb(dat, bt, db); + bt += db; + var + fsb = fcf ? 1 << fcf : ss, + fss = rb(dat, bt, fsb) + (fcf == 1 && 256), + ws = fss; + if(! ss){ + var wb = 1 << 10 + (dat[5] >> 3); + ws = wb + (wb >> 3) * (dat[5] & 7); + } + if(ws > 2145386496) err(1); + var buf = new u8((w == 1 ? fss || ws : w ? 0 : ws) + 12); + buf[0] = 1, buf[4] = 4, buf[8] = 8; + return {b: bt + fsb, + y: 0, + l: 0, + d: di, + w: w && w != 1 ? w : buf.subarray(12), + e: ws, + o: new i32(buf.buffer, 0, 3), + u: fss, + c: cc, + m: Math.min(131072, ws)}; + } + else if((n3 >> 4 | dat[3] << 20) == 0x184D2A5) return b4(dat, 4) + 8; + err(0); + } + function msb(val){ + var bits = 0; + for(; 1 << bits <= val; ++bits) ; + return bits - 1; + } + function rfse(dat, bt, mal){ + var tpos = (bt << 3) + 4, al = (dat[bt] & 15) + 5; + if(al > mal) err(3); + var + sz = 1 << al, + probs = sz, + sym = - 1, + re = - 1, + i = - 1, + ht = sz, + buf = new ab(512 + (sz << 2)), + freq = new i16(buf, 0, 256), + dstate = new u16(buf, 0, 256), + nstate = new u16(buf, 512, sz), + bb1 = 512 + (sz << 1), + syms = new u8(buf, bb1, sz), + nbits = new u8(buf, bb1 + sz); + while(sym < 255 && probs > 0){ + var + bits = msb(probs + 1), + cbt = tpos >> 3, + msk = (1 << bits + 1) - 1, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7) + & msk, + msk1fb = (1 << bits) - 1, + msv = msk - probs - 1, + sval = val & msk1fb; + if(sval < msv) + tpos += bits, val = sval; + else{tpos += bits + 1; if(val > msk1fb) val -= msv;} + freq[++sym] = --val; + if(val == - 1){probs += val; syms[--ht] = sym;} else probs -= val; + if(! val) + do{ + var rbt = tpos >> 3; + re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3; + tpos += 2; + sym += re; + } + while + (re == 3); + } + if(sym > 255 || probs) err(0); + var sympos = 0, sstep = (sz >> 1) + (sz >> 3) + 3, smask = sz - 1; + for(var s = 0; s <= sym; ++s){ + var sf = freq[s]; + if(sf < 1){dstate[s] = - sf; continue;} + for(i = 0; i < sf; ++i){ + syms[sympos] = s; + do sympos = sympos + sstep & smask;while(sympos >= ht); + } + } + if(sympos) err(0); + for(i = 0; i < sz; ++i){ + var ns = dstate[syms[i]]++, nb = nbits[i] = al - msb(ns); + nstate[i] = (ns << nb) - sz; + } + return [tpos + 7 >> 3, {b: al, s: syms, n: nbits, t: nstate}]; + } + function rhu(dat, bt){ + var + i = 0, + wc = - 1, + buf = new u8(292), + hb = dat[bt], + hw = buf.subarray(0, 256), + rc = buf.subarray(256, 268), + ri = new u16(buf.buffer, 268); + if(hb < 128){ + var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1]; + bt += hb; + var epos = ebt << 3, lb = dat[bt]; + if(! lb) err(0); + var + st1 = 0, + st2 = 0, + btr1 = fdt.b, + btr2 = btr1, + fpos = (++bt << 3) - 8 + msb(lb); + for(;;){ + fpos -= btr1; + if(fpos < epos) break; + var cbt = fpos >> 3; + st1 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1; + hw[++wc] = fdt.s[st1]; + fpos -= btr2; + if(fpos < epos) break; + cbt = fpos >> 3; + st2 += + (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1; + hw[++wc] = fdt.s[st2]; + btr1 = fdt.n[st1]; + st1 = fdt.t[st1]; + btr2 = fdt.n[st2]; + st2 = fdt.t[st2]; + } + if(++wc > 255) err(0); + } + else{ + wc = hb - 127; + for(; i < wc; i += 2){ + var byte = dat[++bt]; + hw[i] = byte >> 4; + hw[i + 1] = byte & 15; + } + ++bt; + } + var wes = 0; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + if(wt > 11) err(0); + wes += wt && 1 << wt - 1; + } + var mb = msb(wes) + 1, ts = 1 << mb, rem = ts - wes; + if(rem & rem - 1) err(0); + hw[wc++] = msb(rem) + 1; + for(i = 0; i < wc; ++i){ + var wt = hw[i]; + ++rc[hw[i] = wt && mb + 1 - wt]; + } + var + hbuf = new u8(ts << 1), + syms = hbuf.subarray(0, ts), + nb = hbuf.subarray(ts); + ri[mb] = 0; + for(i = mb; i > 0; --i){ + var pv = ri[i]; + fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i)); + } + if(ri[0] != ts) err(0); + for(i = 0; i < wc; ++i){ + var bits = hw[i]; + if(bits){ + var code = ri[bits]; + fill(syms, i, code, ri[bits] = code + (1 << mb - bits)); + } + } + return [bt, {n: nb, b: mb, s: syms}]; + } + var + dllt = + rfse + (new + u8 + ([81, + 16, + 99, + 140, + 49, + 198, + 24, + 99, + 12, + 33, + 196, + 24, + 99, + 102, + 102, + 134, + 70, + 146, + 4]), + 0, + 6) + [1], + dmlt = + rfse + (new + u8 + ([33, + 20, + 196, + 24, + 99, + 140, + 33, + 132, + 16, + 66, + 8, + 33, + 132, + 16, + 66, + 8, + 33, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 68, + 36, + 9]), + 0, + 6) + [1], + doct = + rfse + (new u8([32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2]), + 0, + 5) + [1]; + function b2bl(b, s){ + var len = b.length, bl = new i32(len); + for(var i = 0; i < len; ++i){bl[i] = s; s += 1 << b[i];} + return bl; + } + var + llb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 16843009, + 50528770, + 134678020, + 202050057, + 269422093]).buffer, + 0, + 36), + llbl = b2bl(llb, 0), + mlb = + new + u8 + (new + i32 + ([0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 16843009, + 50528770, + 117769220, + 185207048, + 252579084, + 16]).buffer, + 0, + 53), + mlbl = b2bl(mlb, 3); + function dhu(dat, out, hu){ + var + len = dat.length, + ss = out.length, + lb = dat[len - 1], + msk = (1 << hu.b) - 1, + eb = - hu.b; + if(! lb) err(0); + var + st = 0, + btr = hu.b, + pos = (len << 3) - 8 + msb(lb) - btr, + i = - 1; + for(; pos > eb && i < ss;){ + var + cbt = pos >> 3, + val = + (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7); + st = (st << btr | val) & msk; + out[++i] = hu.s[st]; + pos -= btr = hu.n[st]; + } + if(pos != eb || i + 1 != ss) err(0); + } + function dhu4(dat, out, hu){ + var + bt = 6, + ss = out.length, + sz1 = ss + 3 >> 2, + sz2 = sz1 << 1, + sz3 = sz1 + sz2; + dhu + (dat.subarray(bt, bt += dat[0] | dat[1] << 8), + out.subarray(0, sz1), + hu); + dhu + (dat.subarray(bt, bt += dat[2] | dat[3] << 8), + out.subarray(sz1, sz2), + hu); + dhu + (dat.subarray(bt, bt += dat[4] | dat[5] << 8), + out.subarray(sz2, sz3), + hu); + dhu(dat.subarray(bt), out.subarray(sz3), hu); + } + function rzb(dat, st, out){ + var _a, bt = st.b, b0 = dat[bt], btype = b0 >> 1 & 3; + st.l = b0 & 1; + var + sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13, + ebt = (bt += 3) + sz; + if(btype == 1){ + if(bt >= dat.length) return; + st.b = bt + 1; + if(out){fill(out, dat[bt], st.y, st.y += sz); return out;} + return fill(new u8(sz), dat[bt]); + } + if(ebt > dat.length) return; + if(btype == 0){ + st.b = ebt; + if(out){ + out.set(dat.subarray(bt, ebt), st.y); + st.y += sz; + return out; + } + return slc(dat, bt, ebt); + } + if(btype == 2){ + var + b3 = dat[bt], + lbt = b3 & 3, + sf = b3 >> 2 & 3, + lss = b3 >> 4, + lcs = 0, + s4 = 0; + if(lbt < 2) + if(sf & 1) + lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12); + else + lss = b3 >> 3; + else{ + s4 = sf; + if(sf < 2) + lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2; + else if(sf == 2) + lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12, + lcs = dat[bt] >> 2 | dat[++bt] << 6; + else + lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12, + lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10; + } + ++bt; + var + buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m), + spl = buf.length - lss; + if(lbt == 0) + buf.set(dat.subarray(bt, bt += lss), spl); + else if(lbt == 1) + fill(buf, dat[bt++], spl); + else{ + var hu = st.h; + if(lbt == 2){ + var hud = rhu(dat, bt); + lcs += bt - (bt = hud[0]); + st.h = hu = hud[1]; + } + else if(! hu) err(0); + (s4 ? dhu4 : dhu) + (dat.subarray(bt, bt += lcs), buf.subarray(spl), hu); + } + var ns = dat[bt++]; + if(ns){ + if(ns == 255) + ns = (dat[bt++] | dat[bt++] << 8) + 0x7F00; + else if(ns > 127) ns = ns - 128 << 8 | dat[bt++]; + var scm = dat[bt++]; + if(scm & 3) err(0); + var dts = [dmlt, doct, dllt]; + for(var i = 2; i > - 1; --i){ + var md = scm >> (i << 1) + 2 & 3; + if(md == 1){ + var rbuf = new u8([0, 0, dat[bt++]]); + dts[i] = + {s: rbuf.subarray(2, 3), + n: rbuf.subarray(0, 1), + t: new u16(rbuf.buffer, 0, 1), + b: 0}; + } + else if(md == 2) + _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1]; + else if(md == 3){if(! st.t) err(0); dts[i] = st.t[i];} + } + var + _b = st.t = dts, + mlt = _b[0], + oct = _b[1], + llt = _b[2], + lb = dat[ebt - 1]; + if(! lb) err(0); + var + spos = (ebt << 3) - 8 + msb(lb) - llt.b, + cbt = spos >> 3, + oubt = 0, + lst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1; + cbt = (spos -= oct.b) >> 3; + var + ost = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1; + cbt = (spos -= mlt.b) >> 3; + var + mst = + (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1; + for(++ns; --ns;){ + var + llc = llt.s[lst], + lbtr = llt.n[lst], + mlc = mlt.s[mst], + mbtr = mlt.n[mst], + ofc = oct.s[ost], + obtr = oct.n[ost]; + cbt = (spos -= ofc) >> 3; + var + ofp = 1 << ofc, + off = + ofp + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16 + | dat[cbt + 3] << 24) + >>> (spos & 7) + & ofp - 1); + cbt = (spos -= mlb[mlc]) >> 3; + var + ml = + mlbl[mlc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << mlb[mlc]) - 1); + cbt = (spos -= llb[llc]) >> 3; + var + ll = + llbl[llc] + + + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) + >> (spos & 7) + & (1 << llb[llc]) - 1); + cbt = (spos -= lbtr) >> 3; + lst = + llt.t[lst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1); + cbt = (spos -= mbtr) >> 3; + mst = + mlt.t[mst] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1); + cbt = (spos -= obtr) >> 3; + ost = + oct.t[ost] + + + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1); + if(off > 3){ + st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off -= 3; + } + else{ + var idx = off - (ll != 0); + if(idx){ + off = idx == 3 ? st.o[0] - 1 : st.o[idx]; + if(idx > 1) st.o[2] = st.o[1]; + st.o[1] = st.o[0]; + st.o[0] = off; + } + else + off = st.o[0]; + } + for(var i = 0; i < ll; ++i) buf[oubt + i] = buf[spl + i]; + oubt += ll, spl += ll; + var stin = oubt - off; + if(stin < 0){ + var len = - stin, bs = st.e + stin; + if(len > ml) len = ml; + for(var i = 0; i < len; ++i) buf[oubt + i] = st.w[bs + i]; + oubt += len, ml -= len, stin = 0; + } + for(var i = 0; i < ml; ++i) buf[oubt + i] = buf[stin + i]; + oubt += ml; + } + if(oubt != spl) + while(spl < buf.length) buf[oubt++] = buf[spl++]; + else + oubt = buf.length; + if(out) st.y += oubt; else buf = slc(buf, 0, oubt); + } + else if(out){ + st.y += lss; + if(spl) for(var i = 0; i < lss; ++i) buf[i] = buf[spl + i]; + } + else if(spl) buf = slc(buf, spl); + st.b = ebt; + return buf; + } + err(2); + } + function cct(bufs, ol){ + if(bufs.length == 1) return bufs[0]; + var buf = new u8(ol); + for(var i = 0, b = 0; i < bufs.length; ++i){ + var chk = bufs[i]; + buf.set(chk, b); + b += chk.length; + } + return buf; + } + return function(dat, buf){ + var bt = 0, bufs = [], nb = + ! buf, ol = 0; + for(; dat.length;){ + var st = rzfh(dat, nb || buf); + if(typeof st == "object"){ + if(nb){ + buf = null; + if(st.w.length == st.u){bufs.push(buf = st.w); ol += st.u;} + } + else{bufs.push(buf); st.e = 0;} + for(; ! st.l;){ + var blk = rzb(dat, st, buf); + if(! blk) err(5); + if(buf) + st.e = st.y; + else{ + bufs.push(blk); + ol += blk.length; + cpw(st.w, 0, blk.length); + st.w.set(blk, st.w.length - blk.length); + } + } + bt = st.b + st.c * 4; + } + else + bt = st; + dat = dat.subarray(bt); + } + return cct(bufs, ol);}; + } + (); + function caml_float_of_bytes(a){ + return caml_int64_float_of_bits(caml_int64_of_bytes(a)); + } + function caml_input_value_from_reader(reader, ofs){ + function readvlq(overflow){ + var c = reader.read8u(), n = c & 0x7F; + while((c & 0x80) != 0){ + c = reader.read8u(); + var n7 = n << 7; + if(n != n7 >> 7) overflow[0] = true; + n = n7 | c & 0x7F; + } + return n; + } + var magic = reader.read32u(); + switch(magic){ + case 0x8495A6BE: + var + header_len = 20, + compressed = 0, + data_len = reader.read32u(), + uncompressed_data_len = data_len, + num_objects = reader.read32u(), + _size_32 = reader.read32u(), + _size_64 = reader.read32u(); + break; + case 0x8495A6BD: + var + header_len = reader.read8u() & 0x3F, + compressed = 1, + overflow = [false], + data_len = readvlq(overflow), + uncompressed_data_len = readvlq(overflow), + num_objects = readvlq(overflow), + _size_32 = readvlq(overflow), + _size_64 = readvlq(overflow); + if(overflow[0]) + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on this platform"); + break; + case 0x8495A6BF: + caml_failwith + ("caml_input_value_from_reader: object too large to be read back on a 32-bit platform"); + break; + default: + caml_failwith("caml_input_value_from_reader: bad object"); break; + } + var + stack = [], + intern_obj_table = num_objects > 0 ? [] : null, + obj_counter = 0; + function intern_rec(reader){ + var code = reader.read8u(); + if(code >= 0x40) + if(code >= 0x80){ + var tag = code & 0xF, size = code >> 4 & 0x7, v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + } + else + return code & 0x3F; + else if(code >= 0x20){ + var len = code & 0x1F, v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + } + else + switch(code){ + case 0x00: + return reader.read8s(); + case 0x01: + return reader.read16s(); + case 0x02: + return reader.read32s(); + case 0x03: + caml_failwith("input_value: integer too large"); break; + case 0x04: + var offset = reader.read8u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x05: + var offset = reader.read16u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x06: + var offset = reader.read32u(); + if(compressed == 0) offset = obj_counter - offset; + return intern_obj_table[offset]; + case 0x08: + var + header = reader.read32u(), + tag = header & 0xFF, + size = header >> 10, + v = [tag]; + if(size == 0) return v; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + stack.push(v, size); + return v; + case 0x13: + caml_failwith("input_value: data block too large"); break; + case 0x09: + var len = reader.read8u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0A: + var len = reader.read32u(), v = reader.readstr(len); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0C: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[7 - i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0B: + var t = new Array(8); + for(var i = 0; i < 8; i++) t[i] = reader.read8u(); + var v = caml_float_of_bytes(t); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + case 0x0E: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0D: + var len = reader.read8u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x07: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[7 - j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x0F: + var len = reader.read32u(), v = new Array(len + 1); + v[0] = 254; + var t = new Array(8); + for(var i = 1; i <= len; i++){ + for(var j = 0; j < 8; j++) t[j] = reader.read8u(); + v[i] = caml_float_of_bytes(t); + } + return v; + case 0x10: + case 0x11: + caml_failwith("input_value: code pointer"); break; + case 0x12: + case 0x18: + case 0x19: + var c, s = ""; + while((c = reader.read8u()) != 0) s += String.fromCharCode(c); + var ops = caml_custom_ops[s], expected_size; + if(! ops) + caml_failwith("input_value: unknown custom block identifier"); + switch(code){ + case 0x12: break; + case 0x19: + if(! ops.fixed_length) + caml_failwith("input_value: expected a fixed-size custom block"); + expected_size = ops.fixed_length; + break; + case 0x18: + expected_size = reader.read32u(); + reader.read32s(); + reader.read32s(); + break; + } + var + old_pos = reader.i, + size = [0], + v = ops.deserialize(reader, size); + if(expected_size != undefined) + if(expected_size != size[0]) + caml_failwith + ("input_value: incorrect length of serialized custom block"); + if(intern_obj_table) intern_obj_table[obj_counter++] = v; + return v; + default: caml_failwith("input_value: ill-formed message"); + } + } + if(compressed) + var + data = reader.readuint8array(data_len), + res = new Uint8Array(uncompressed_data_len), + res = zstd_decompress(data, res), + reader = new UInt8ArrayReader(res, 0); + var res = intern_rec(reader); + while(stack.length > 0){ + var size = stack.pop(), v = stack.pop(), d = v.length; + if(d < size) stack.push(v, size); + v[d] = intern_rec(reader); + } + if(typeof ofs != "number") ofs[0] = reader.i; + return res; + } + function caml_string_of_bytes(s){ + s.t & 6 && caml_convert_string_to_bytes(s); + return caml_string_of_jsbytes(s.c); + } + function caml_input_value_from_bytes(s, ofs){ + var + reader = + new + MlStringReader + (caml_string_of_bytes(s), typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_input_value(chanid){ + var + chan = caml_ml_channels[chanid], + header = new Uint8Array(caml_marshal_header_size); + function block(buffer, offset, n){ + var r = 0; + while(r < n){ + if(chan.buffer_curr >= chan.buffer_max){ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + } + if(chan.buffer_curr >= chan.buffer_max) break; + buffer[offset + r] = chan.buffer[chan.buffer_curr]; + chan.buffer_curr++; + r++; + } + return r; + } + var r = block(header, 0, caml_marshal_header_size); + if(r == 0) + caml_raise_end_of_file(); + else if(r < caml_marshal_header_size) + caml_failwith("input_value: truncated object"); + var + len = caml_marshal_data_size(caml_bytes_of_array(header), 0), + buf = new Uint8Array(len + caml_marshal_header_size); + buf.set(header, 0); + var r = block(buf, caml_marshal_header_size, len); + if(r < len) + caml_failwith("input_value: truncated object " + r + " " + len); + var + offset = [0], + res = caml_input_value_from_bytes(caml_bytes_of_array(buf), offset); + chan.offset = chan.offset + offset[0]; + return res; + } + function caml_input_value_to_outside_heap(c){return caml_input_value(c);} + function caml_atomic_cas(ref, o, n){ + if(ref[1] === o){ref[1] = n; return 1;} + return 0; + } + function caml_copysign_float(x, y){ + if(y == 0) y = 1 / y; + x = Math.abs(x); + return y < 0 ? - x : x; + } + function caml_gr_set_text_size(size){ + var s = caml_gr_state_get(); + s.text_size = size; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_atomic_load(ref){return ref[1];} + function caml_MD5Final(ctx){ + var in_buf = ctx.len & 0x3f; + ctx.b8[in_buf] = 0x80; + in_buf++; + if(in_buf > 56){ + for(var j = in_buf; j < 64; j++) ctx.b8[j] = 0; + caml_MD5Transform(ctx.w, ctx.b32); + for(var j = 0; j < 56; j++) ctx.b8[j] = 0; + } + else + for(var j = in_buf; j < 56; j++) ctx.b8[j] = 0; + ctx.b32[14] = ctx.len << 3; + ctx.b32[15] = ctx.len >> 29 & 0x1FFFFFFF; + caml_MD5Transform(ctx.w, ctx.b32); + var t = new Uint8Array(16); + for(var i = 0; i < 4; i++) + for(var j = 0; j < 4; j++) t[i * 4 + j] = ctx.w[i] >> 8 * j & 0xFF; + return t; + } + function caml_md5_bytes(s, ofs, len){ + var ctx = caml_MD5Init(), a = caml_uint8_array_of_bytes(s); + caml_MD5Update(ctx, a.subarray(ofs, ofs + len), len); + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_ba_set_generic(ba, i, v){ + ba.set(ba.offset(caml_js_from_array(i)), v); + return 0; + } + function caml_ml_condition_wait(t, mutext){return 0;} + function caml_string_lessequal(s1, s2){return s1 <= s2 ? 1 : 0;} + function caml_string_greaterequal(s1, s2){return caml_string_lessequal(s2, s1); + } + function caml_nextafter_float(x, y){ + if(isNaN(x) || isNaN(y)) return NaN; + if(x == y) return y; + if(x == 0) return y < 0 ? - Math.pow(2, - 1074) : Math.pow(2, - 1074); + var bits = caml_int64_bits_of_float(x), one = caml_int64_of_int32(1); + if(x < y == x > 0) + bits = caml_int64_add(bits, one); + else + bits = caml_int64_sub(bits, one); + return caml_int64_float_of_bits(bits); + } + function caml_gr_size_y(){var s = caml_gr_state_get(); return s.height;} + function caml_pos_in(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset - (chan.buffer_max - chan.buffer_curr) | 0; + } + function caml_ml_pos_in(chanid){return caml_pos_in(chanid);} + function caml_int64_and(x, y){return x.and(y);} + function Base_int_math_int64_pow_stub(base, exponent){ + var + one = caml_int64_create_lo_hi(1, 0), + mul = [one, base, one, one], + res = one; + while(! caml_int64_is_zero(exponent)){ + mul[1] = caml_int64_mul(mul[1], mul[3]); + mul[2] = caml_int64_mul(mul[1], mul[1]); + mul[3] = caml_int64_mul(mul[2], mul[1]); + res = caml_int64_mul(res, mul[caml_int64_lo32(exponent) & 3]); + exponent = caml_int64_shift_right_unsigned(exponent, 2); + } + return res; + } + function caml_sys_const_word_size(){return 32;} + function caml_runtime_events_pause(){return 0;} + function caml_unix_unlink(name){ + var root = resolve_fs_device(name); + if(! root.device.unlink) + caml_failwith("caml_unix_unlink: not implemented"); + return root.device.unlink(root.rest, true); + } + function caml_sys_open_for_node(fd, flags){ + if(flags.name) + try{ + var fs = require("fs"), fd2 = fs.openSync(flags.name, "rs"); + return new MlNodeFd(fd2, flags); + } + catch(e){} + return new MlNodeFd(fd, flags); + } + function MlFakeFd_out(fd, flags){ + MlFakeFile.call(this, caml_create_bytes(0)); + this.log = function(s){return 0;}; + if(fd == 1 && typeof console.log == "function") + this.log = console.log; + else if(fd == 2 && typeof console.error == "function") + this.log = console.error; + else if(typeof console.log == "function") this.log = console.log; + this.flags = flags; + } + MlFakeFd_out.prototype.length = function(){return 0;}; + MlFakeFd_out.prototype.write = + function(offset, buf, pos, len){ + if(this.log){ + if + (len > 0 && pos >= 0 && pos + len <= buf.length + && buf[pos + len - 1] == 10) + len--; + var src = caml_create_bytes(len); + caml_blit_bytes(caml_bytes_of_array(buf), pos, src, 0, len); + this.log(src.toUtf16()); + return 0; + } + caml_raise_sys_error(this.fd + ": file descriptor already closed"); + }; + MlFakeFd_out.prototype.read = + function(offset, buf, pos, len){ + caml_raise_sys_error(this.fd + ": file descriptor is write only"); + }; + MlFakeFd_out.prototype.close = function(){this.log = undefined;}; + function caml_sys_open_internal(file, idx){ + if(idx == undefined) idx = caml_sys_fds.length; + caml_sys_fds[idx] = file; + return idx | 0; + } + function caml_sys_open(name, flags, _perms){ + var f = {}; + while(flags){ + switch(flags[1]){ + case 0: + f.rdonly = 1; break; + case 1: + f.wronly = 1; break; + case 2: + f.append = 1; break; + case 3: + f.create = 1; break; + case 4: + f.truncate = 1; break; + case 5: + f.excl = 1; break; + case 6: + f.binary = 1; break; + case 7: + f.text = 1; break; + case 8: + f.nonblock = 1; break; + } + flags = flags[2]; + } + if(f.rdonly && f.wronly) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_rdonly and Open_wronly are not compatible"); + if(f.text && f.binary) + caml_raise_sys_error + (caml_jsbytes_of_string(name) + + " : flags Open_text and Open_binary are not compatible"); + var root = resolve_fs_device(name), file = root.device.open(root.rest, f); + return caml_sys_open_internal(file, undefined); + } + (function(){ + function file(fd, flags){ + return fs_node_supported() + ? caml_sys_open_for_node(fd, flags) + : new MlFakeFd_out(fd, flags); + } + caml_sys_open_internal + (file(0, {rdonly: 1, altname: "/dev/stdin", isCharacterDevice: true}), + 0); + caml_sys_open_internal + (file(1, {buffered: 2, wronly: 1, isCharacterDevice: true}), 1); + caml_sys_open_internal + (file(2, {buffered: 2, wronly: 1, isCharacterDevice: true}), 2); + } + ()); + function caml_string_get(s, i){ + if(i >>> 0 >= caml_ml_string_length(s)) caml_string_bound_error(); + return caml_string_unsafe_get(s, i); + } + var + re_match = + function(){ + var + re_word_letters = + [0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0x03, + 0xFE, + 0xFF, + 0xFF, + 0x87, + 0xFE, + 0xFF, + 0xFF, + 0x07, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFF, + 0xFF, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0x7F, + 0xFF], + opcodes = + {CHAR: 0, + CHARNORM: 1, + STRING: 2, + STRINGNORM: 3, + CHARCLASS: 4, + BOL: 5, + EOL: 6, + WORDBOUNDARY: 7, + BEGGROUP: 8, + ENDGROUP: 9, + REFGROUP: 10, + ACCEPT: 11, + SIMPLEOPT: 12, + SIMPLESTAR: 13, + SIMPLEPLUS: 14, + GOTO: 15, + PUSHBACK: 16, + SETMARK: 17, + CHECKPROGRESS: 18}; + function is_word_letter(c){ + return re_word_letters[c >> 3] >> (c & 7) & 1; + } + function in_bitset(s, i){ + return caml_string_get(s, i >> 3) >> (i & 7) & 1; + } + function re_match_impl(re, s, pos, partial){ + var + prog = caml_js_from_array(re[1]), + cpool = caml_js_from_array(re[2]), + normtable = caml_jsbytes_of_string(re[3]), + numgroups = re[4] | 0, + numregisters = re[5] | 0, + startchars = re[6] | 0, + s = caml_uint8_array_of_string(s), + pc = 0, + quit = false, + stack = [], + groups = new Array(numgroups), + re_register = new Array(numregisters); + for(var i = 0; i < groups.length; i++) + groups[i] = {start: - 1, end: - 1}; + groups[0].start = pos; + function backtrack(){ + while(stack.length){ + var item = stack.pop(); + if(item.undo) + item.undo.obj[item.undo.prop] = item.undo.value; + else if(item.pos){pc = item.pos.pc; pos = item.pos.txt; return;} + } + quit = true; + } + function push(item){stack.push(item);} + function accept(){ + groups[0].end = pos; + var result = new Array(1 + groups.length * 2); + result[0] = 0; + for(var i = 0; i < groups.length; i++){ + var g = groups[i]; + if(g.start < 0 || g.end < 0) g.start = g.end = - 1; + result[2 * i + 1] = g.start; + result[2 * i + 1 + 1] = g.end; + } + return result; + } + function prefix_match(){ + if(partial) return accept(); else backtrack(); + } + while(! quit){ + var + op = prog[pc] & 0xff, + sarg = prog[pc] >> 8, + uarg = sarg & 0xff, + c = s[pos], + group; + pc++; + switch(op){ + case opcodes.CHAR: + if(pos === s.length){prefix_match(); break;} + if(c === uarg) pos++; else backtrack(); + break; + case opcodes.CHARNORM: + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === uarg) pos++; else backtrack(); + break; + case opcodes.STRING: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(c === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.STRINGNORM: + for + (var arg = caml_jsbytes_of_string(cpool[uarg]), i = 0; + i < arg.length; + i++){ + if(pos === s.length){prefix_match(); break;} + if(normtable.charCodeAt(c) === arg.charCodeAt(i)) + c = s[++pos]; + else{backtrack(); break;} + } + break; + case opcodes.CHARCLASS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) pos++; else backtrack(); + break; + case opcodes.BOL: + if(pos > 0 && s[pos - 1] != 10) backtrack(); break; + case opcodes.EOL: + if(pos < s.length && s[pos] != 10) backtrack(); break; + case opcodes.WORDBOUNDARY: + if(pos == 0){ + if(pos === s.length){prefix_match(); break;} + if(is_word_letter(s[0])) break; + backtrack(); + } + else if(pos === s.length){ + if(is_word_letter(s[pos - 1])) break; + backtrack(); + } + else{ + if(is_word_letter(s[pos - 1]) != is_word_letter(s[pos])) break; + backtrack(); + } + break; + case opcodes.BEGGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "start", value: group.start}}); + group.start = pos; + break; + case opcodes.ENDGROUP: + group = groups[uarg]; + push({undo: {obj: group, prop: "end", value: group.end}}); + group.end = pos; + break; + case opcodes.REFGROUP: + group = groups[uarg]; + if(group.start < 0 || group.end < 0){backtrack(); break;} + for(var i = group.start; i < group.end; i++){ + if(pos === s.length){prefix_match(); break;} + if(s[i] != s[pos]){backtrack(); break;} + pos++; + } + break; + case opcodes.SIMPLEOPT: + if(in_bitset(cpool[uarg], c)) pos++; break; + case opcodes.SIMPLESTAR: + while(in_bitset(cpool[uarg], c)) c = s[++pos]; break; + case opcodes.SIMPLEPLUS: + if(pos === s.length){prefix_match(); break;} + if(in_bitset(cpool[uarg], c)) + do c = s[++pos];while(in_bitset(cpool[uarg], c)); + else + backtrack(); + break; + case opcodes.ACCEPT: return accept(); + case opcodes.GOTO: + pc = pc + sarg; break; + case opcodes.PUSHBACK: + push({pos: {pc: pc + sarg, txt: pos}}); break; + case opcodes.SETMARK: + push + ({undo: {obj: re_register, prop: uarg, value: re_register[uarg]}}); + re_register[uarg] = pos; + break; + case opcodes.CHECKPROGRESS: + if(re_register[uarg] === pos) backtrack(); break; + default: throw new Error("Invalid bytecode"); + } + } + return 0; + } + return re_match_impl; + } + (); + function re_search_backward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_backward"); + while(pos >= 0){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos--; + } + return [0]; + } + function caml_js_from_string(s){return caml_jsstring_of_string(s);} + function caml_ba_sub(ba, ofs, len){ + var changed_dim, mul = 1; + if(ba.layout == 0){ + for(var i = 1; i < ba.dims.length; i++) mul = mul * ba.dims[i]; + changed_dim = 0; + } + else{ + for(var i = 0; i < ba.dims.length - 1; i++) mul = mul * ba.dims[i]; + changed_dim = ba.dims.length - 1; + ofs = ofs - 1; + } + if(ofs < 0 || len < 0 || ofs + len > ba.dims[changed_dim]) + caml_invalid_argument("Bigarray.sub: bad sub-array"); + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) new_dims[i] = ba.dims[i]; + new_dims[changed_dim] = len; + mul *= caml_ba_get_size_per_element(ba.kind); + var new_data = ba.data.subarray(ofs * mul, (ofs + len) * mul); + return caml_ba_create_unsafe(ba.kind, ba.layout, new_dims, new_data); + } + function caml_gc_full_major(unit){ + if(typeof globalThis.gc == "function") globalThis.gc(); + return 0; + } + function caml_ml_mutex_try_lock(t){ + if(! t.locked){t.locked = true; return 1;} + return 0; + } + function caml_bytes_set32(s, i, i32){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b4 = 0xFF & i32 >> 24, + b3 = 0xFF & i32 >> 16, + b2 = 0xFF & i32 >> 8, + b1 = 0xFF & i32; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + caml_bytes_unsafe_set(s, i + 2, b3); + caml_bytes_unsafe_set(s, i + 3, b4); + return 0; + } + function caml_gr_sigio_signal(){return 0;} + function caml_ba_uint8_set32(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 3 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + ba.set(ofs + 2, v >>> 16 & 0xff); + ba.set(ofs + 3, v >>> 24 & 0xff); + return 0; + } + function caml_sys_const_ostype_unix(){return os_type == "Unix" ? 1 : 0;} + function caml_unix_gmtime(t){ + var + d = new Date(t * 1000), + d_num = d.getTime(), + januaryfirst = new Date(Date.UTC(d.getUTCFullYear(), 0, 1)).getTime(), + doy = Math.floor((d_num - januaryfirst) / 86400000); + return [0, + d.getUTCSeconds(), + d.getUTCMinutes(), + d.getUTCHours(), + d.getUTCDate(), + d.getUTCMonth(), + d.getUTCFullYear() - 1900, + d.getUTCDay(), + doy, + false | 0]; + } + function caml_signbit_float(x){if(x == 0) x = 1 / x; return x < 0 ? 1 : 0;} + function caml_gr_current_x(){var s = caml_gr_state_get(); return s.x;} + function caml_gr_set_line_width(w){ + var s = caml_gr_state_get(); + s.line_width = w; + s.context.lineWidth = w; + return 0; + } + function caml_gr_set_font(f){ + var s = caml_gr_state_get(); + s.font = f; + s.context.font = s.text_size + "px " + caml_jsstring_of_string(s.font); + return 0; + } + function caml_gr_set_color(color){ + var s = caml_gr_state_get(); + function convert(number){ + var str = "" + number.toString(16); + while(str.length < 2) str = "0" + str; + return str; + } + var r = color >> 16 & 0xff, g = color >> 8 & 0xff, b = color >> 0 & 0xff; + s.color = color; + var c_str = "#" + convert(r) + convert(g) + convert(b); + s.context.fillStyle = c_str; + s.context.strokeStyle = c_str; + return 0; + } + function caml_gr_moveto(x, y){ + var s = caml_gr_state_get(); + s.x = x; + s.y = y; + return 0; + } + function caml_gr_resize_window(w, h){ + var s = caml_gr_state_get(); + s.width = w; + s.height = h; + s.canvas.width = w; + s.canvas.height = h; + return 0; + } + function caml_gr_state_init(){ + caml_gr_moveto(caml_gr_state.x, caml_gr_state.y); + caml_gr_resize_window(caml_gr_state.width, caml_gr_state.height); + caml_gr_set_line_width(caml_gr_state.line_width); + caml_gr_set_text_size(caml_gr_state.text_size); + caml_gr_set_font(caml_gr_state.font); + caml_gr_set_color(caml_gr_state.color); + caml_gr_set_window_title(caml_gr_state.title); + caml_gr_state.context.textBaseline = "bottom"; + } + function caml_ba_kind_of_typed_array(ta){ + var kind; + if(ta instanceof Float32Array) + kind = 0; + else if(ta instanceof Float64Array) + kind = 1; + else if(ta instanceof Int8Array) + kind = 2; + else if(ta instanceof Uint8Array) + kind = 3; + else if(ta instanceof Int16Array) + kind = 4; + else if(ta instanceof Uint16Array) + kind = 5; + else if(ta instanceof Int32Array) + kind = 6; + else if(ta instanceof Uint32Array) + kind = 6; + else + caml_invalid_argument("caml_ba_kind_of_typed_array: unsupported kind"); + return kind; + } + function caml_ba_from_typed_array(ta){ + var kind = caml_ba_kind_of_typed_array(ta); + return caml_ba_create_unsafe(kind, 0, [ta.length], ta); + } + function caml_ml_seek_out(chanid, pos){return caml_seek_out(chanid, pos);} + function caml_js_typeof(o){return typeof o;} + function caml_string_hash(h, v){ + var h = caml_hash_mix_string(h, v), h = caml_hash_mix_final(h); + return h & 0x3FFFFFFF; + } + function caml_restore_raw_backtrace(exn, bt){return 0;} + function Base_int_math_int32_ctz(x){ + if(x === 0) return 32; + var n = 1; + if((x & 0x0000FFFF) === 0){n = n + 16; x = x >> 16;} + if((x & 0x000000FF) === 0){n = n + 8; x = x >> 8;} + if((x & 0x0000000F) === 0){n = n + 4; x = x >> 4;} + if((x & 0x00000003) === 0){n = n + 2; x = x >> 2;} + return n - (x & 1); + } + function Base_int_math_nativeint_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_gr_lineto(x, y){ + var s = caml_gr_state_get(); + s.context.beginPath(); + s.context.moveTo(s.x, s.height - s.y); + s.context.lineTo(x, s.height - y); + s.context.stroke(); + s.x = x; + s.y = y; + return 0; + } + function caml_js_function_arity(f){return f.l >= 0 ? f.l : f.l = f.length;} + function caml_js_wrap_meth_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f) - 1, args = new Array(len + 1); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_dim_3(ba){return caml_ba_dim(ba, 2);} + function caml_is_special_exception(exn){ + switch(exn[2]){case - 8:case - 11:case - 12: return 1;default: return 0; + } + } + function caml_format_exception(exn){ + var r = ""; + if(exn[0] == 0){ + r += exn[1][1]; + if + (exn.length == 3 && exn[2][0] == 0 && caml_is_special_exception(exn[1])) + var bucket = exn[2], start = 1; + else + var start = 2, bucket = exn; + r += "("; + for(var i = start; i < bucket.length; i++){ + if(i > start) r += ", "; + var v = bucket[i]; + if(typeof v == "number") + r += v.toString(); + else if(v instanceof MlBytes) + r += '"' + v.toString() + '"'; + else if(typeof v == "string") + r += '"' + v.toString() + '"'; + else + r += "_"; + } + r += ")"; + } + else if(exn[0] == 248) r += exn[1]; + return r; + } + function caml_fatal_uncaught_exception(err){ + if(err instanceof Array && (err[0] == 0 || err[0] == 248)){ + var handler = caml_named_value("Printexc.handle_uncaught_exception"); + if(handler) + caml_callback(handler, [err, false]); + else{ + var + msg = caml_format_exception(err), + at_exit = caml_named_value("Pervasives.do_at_exit"); + if(at_exit) caml_callback(at_exit, [0]); + console.error("Fatal error: exception " + msg + "\n"); + if(err.js_error) throw err.js_error; + } + } + else + throw err; + } + function caml_ephe_check_data(x){ + return x[caml_ephe_data_offset] === undefined ? 0 : 1; + } + function caml_bytes_get16(s, i){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_obj_make_forward(b, v){b[0] = 250; b[1] = v; return 0;} + function caml_js_from_bool(x){return ! ! x;} + function caml_ml_set_channel_name(chanid, name){ + var chan = caml_ml_channels[chanid]; + chan.name = name; + return 0; + } + function caml_exp2_float(x){return Math.pow(2, x);} + function caml_gr_close_graph(){ + var s = caml_gr_state_get(); + s.canvas.width = 0; + s.canvas.height = 0; + return 0; + } + var Base_internalhash_fold_int = caml_hash_mix_int; + function caml_ml_domain_cpu_relax(unit){return 0;} + function caml_create_string(len){caml_invalid_argument("String.create");} + function Base_int_math_nativeint_clz(x){return Base_int_math_int32_clz(x);} + function caml_ml_input_block(chanid, ba, i, l){ + var + chan = caml_ml_channels[chanid], + n = l, + avail = chan.buffer_max - chan.buffer_curr; + if(l <= avail){ + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + l), i); + chan.buffer_curr += l; + } + else if(avail > 0){ + ba.set + (chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + avail), i); + chan.buffer_curr += avail; + n = avail; + } + else{ + chan.buffer_curr = 0; + chan.buffer_max = 0; + caml_refill(chan); + var avail = chan.buffer_max - chan.buffer_curr; + if(n > avail) n = avail; + ba.set(chan.buffer.subarray(chan.buffer_curr, chan.buffer_curr + n), i); + chan.buffer_curr += n; + } + return n | 0; + } + function caml_md5_chan(chanid, toread){ + var ctx = caml_MD5Init(), buffer = new Uint8Array(4096); + if(toread < 0) + while(true){ + var read = caml_ml_input_block(chanid, buffer, 0, buffer.length); + if(read == 0) break; + caml_MD5Update(ctx, buffer.subarray(0, read), read); + } + else + while(toread > 0){ + var + read = + caml_ml_input_block + (chanid, buffer, 0, toread > buffer.length ? buffer.length : toread); + if(read == 0) caml_raise_end_of_file(); + caml_MD5Update(ctx, buffer.subarray(0, read), read); + toread -= read; + } + return caml_string_of_array(caml_MD5Final(ctx)); + } + function caml_atanh_float(x){return Math.atanh(x);} + function caml_ml_condition_signal(t){return 0;} + function caml_unix_findnext(dir_handle){return caml_unix_readdir(dir_handle); + } + function caml_ml_output_bytes(chanid, buffer, offset, len){ + var chan = caml_ml_channels[chanid]; + if(! chan.opened) + caml_raise_sys_error("Cannot output to a closed channel"); + var buffer = caml_uint8_array_of_bytes(buffer); + buffer = buffer.subarray(offset, offset + len); + if(chan.buffer_curr + buffer.length > chan.buffer.length){ + var b = new Uint8Array(chan.buffer_curr + buffer.length); + b.set(chan.buffer); + chan.buffer = b; + } + switch(chan.buffered){ + case 0: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + caml_ml_flush(chanid); + break; + case 1: + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + break; + case 2: + var id = buffer.lastIndexOf(10); + if(id < 0){ + chan.buffer.set(buffer, chan.buffer_curr); + chan.buffer_curr += buffer.length; + if(chan.buffer_curr >= chan.buffer.length) caml_ml_flush(chanid); + } + else{ + chan.buffer.set(buffer.subarray(0, id + 1), chan.buffer_curr); + chan.buffer_curr += id + 1; + caml_ml_flush(chanid); + chan.buffer.set(buffer.subarray(id + 1), chan.buffer_curr); + chan.buffer_curr += buffer.length - id - 1; + } + break; + } + return 0; + } + function caml_ml_output(chanid, buffer, offset, len){ + return caml_ml_output_bytes + (chanid, caml_bytes_of_string(buffer), offset, len); + } + function caml_ml_domain_id(unit){return caml_domain_id;} + function caml_ephe_get_data(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, x[caml_ephe_data_offset]]; + } + function caml_xmlhttprequest_create(unit){ + if(typeof globalThis.XMLHttpRequest !== "undefined") + try{return new globalThis.XMLHttpRequest();}catch(e){} + if(typeof globalThis.activeXObject !== "undefined"){ + try{return new globalThis.activeXObject("Msxml2.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Msxml3.XMLHTTP");}catch(e){} + try{return new globalThis.activeXObject("Microsoft.XMLHTTP");}catch(e){} + } + caml_failwith("Cannot create a XMLHttpRequest"); + } + function caml_trampoline_return(f, args){return {joo_tramp: f, joo_args: args}; + } + function caml_ml_is_buffered(chanid){ + return caml_ml_channels[chanid].buffered ? 1 : 0; + } + function Base_int_math_int64_clz(x){ + var n = 64, y; + y = caml_int64_shift_right_unsigned(x, 32); + if(! caml_int64_is_zero(y)){n = n - 32; x = y;} + y = caml_int64_shift_right_unsigned(x, 16); + if(! caml_int64_is_zero(y)){n = n - 16; x = y;} + y = caml_int64_shift_right_unsigned(x, 8); + if(! caml_int64_is_zero(y)){n = n - 8; x = y;} + y = caml_int64_shift_right_unsigned(x, 4); + if(! caml_int64_is_zero(y)){n = n - 4; x = y;} + y = caml_int64_shift_right_unsigned(x, 2); + if(! caml_int64_is_zero(y)){n = n - 2; x = y;} + y = caml_int64_shift_right_unsigned(x, 1); + if(! caml_int64_is_zero(y)) return n - 2; + return n - caml_int64_to_int32(x); + } + function caml_array_append(a1, a2){ + var l1 = a1.length, l2 = a2.length, l = l1 + l2 - 1, a = new Array(l); + a[0] = 0; + var i = 1, j = 1; + for(; i < l1; i++) a[i] = a1[i]; + for(; i < l; i++, j++) a[i] = a2[j]; + return a; + } + function caml_unix_gettimeofday(){return new Date().getTime() / 1000;} + function caml_unix_time(){return Math.floor(caml_unix_gettimeofday());} + function caml_ml_set_channel_refill(chanid, f){ + caml_ml_channels[chanid].refill = f; + return 0; + } + function caml_runtime_events_create_cursor(target){return {};} + function caml_fill_bytes(s, i, l, c){ + if(l > 0) + if(i == 0 && (l >= s.l || s.t == 2 && l >= s.c.length)) + if(c == 0){ + s.c = ""; + s.t = 2; + } + else{ + s.c = caml_str_repeat(l, String.fromCharCode(c)); + s.t = l == s.l ? 0 : 2; + } + else{ + if(s.t != 4) caml_convert_bytes_to_array(s); + for(l += i; i < l; i++) s.c[i] = c; + } + return 0; + } + function caml_js_expr(s){ + console.error("caml_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_ml_runtime_warnings_enabled(_unit){return caml_runtime_warnings; + } + function caml_output_value_to_bytes(v, flags){ + return caml_bytes_of_array(caml_output_val(v, flags)); + } + function caml_eventlog_resume(unit){return 0;} + function caml_md5_string(s, ofs, len){ + return caml_md5_bytes(caml_bytes_of_string(s), ofs, len); + } + function caml_array_of_string(x){return caml_uint8_array_of_string(x);} + function caml_string_equal(s1, s2){if(s1 === s2) return 1; return 0;} + function caml_jsoo_flags_use_js_string(unit){return 1;} + function caml_output_value_to_buffer(s, ofs, len, v, flags){ + var t = caml_output_val(v, flags); + if(t.length > len) caml_failwith("Marshal.to_buffer: buffer overflow"); + caml_blit_bytes(t, 0, s, ofs, t.length); + return 0; + } + function re_replacement_text(repl, groups, orig){ + var + repl = caml_jsbytes_of_string(repl), + len = repl.length, + orig = caml_jsbytes_of_string(orig), + res = "", + n = 0, + cur, + start, + end, + c; + while(n < len){ + cur = repl.charAt(n++); + if(cur != "\\") + res += cur; + else{ + if(n == len) caml_failwith("Str.replace: illegal backslash sequence"); + cur = repl.charAt(n++); + switch(cur){ + case "\\": + res += cur; break; + case "0": + case "1": + case "2": + case "3": + case "4": + case "5": + case "6": + case "7": + case "8": + case "9": + c = + cur; + if(c * 2 >= groups.length - 1) + caml_failwith("Str.replace: reference to unmatched group"); + start = caml_array_get(groups, c * 2); + end = caml_array_get(groups, c * 2 + 1); + if(start == - 1) + caml_failwith("Str.replace: reference to unmatched group"); + res += orig.slice(start, end); + break; + default: res += "\\" + cur; + } + } + } + return caml_string_of_jsbytes(res); + } + function caml_pure_js_expr(s){ + console.error("caml_pure_js_expr: fallback to runtime evaluation\n"); + return eval(caml_jsstring_of_string(s)); + } + function caml_blit_string(a, b, c, d, e){ + caml_blit_bytes(caml_bytes_of_string(a), b, c, d, e); + return 0; + } + function blit_nat(nat1, ofs1, nat2, ofs2, len){ + for(var i = 0; i < len; i++) nat1.data[ofs1 + i] = nat2.data[ofs2 + i]; + return 0; + } + function caml_bigstring_blit_ba_to_bytes(ba1, pos1, bytes2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_string_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(pos2 + len > caml_ml_bytes_length(bytes2)) caml_array_bound_error(); + var slice = ba1.data.slice(ofs1, ofs1 + len); + caml_blit_bytes(caml_bytes_of_array(slice), 0, bytes2, pos2, len); + return 0; + } + function caml_unix_stat(name){ + var root = resolve_fs_device(name); + if(! root.device.stat) caml_failwith("caml_unix_stat: not implemented"); + return root.device.stat(root.rest, true); + } + function caml_register_named_value(nm, v){ + caml_named_values[caml_jsbytes_of_string(nm)] = v; + return 0; + } + function jsoo_create_file_extern(name, content){ + if(globalThis.jsoo_create_file) + globalThis.jsoo_create_file(name, content); + else{ + if(! globalThis.caml_fs_tmp) globalThis.caml_fs_tmp = []; + globalThis.caml_fs_tmp.push({name: name, content: content}); + } + return 0; + } + function caml_unix_stat_64(name){ + var r = caml_unix_stat(name); + r[9] = caml_int64_of_int32(r[9]); + } + function caml_to_js_string(s){return caml_jsstring_of_string(s);} + function caml_ml_mutex_lock(t){ + if(t.locked) + caml_failwith("Mutex.lock: mutex already locked. Cannot wait."); + else + t.locked = true; + return 0; + } + function re_search_forward(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.search_forward"); + while(pos <= caml_ml_string_length(s)){ + var res = re_match(re, s, pos, 0); + if(res) return res; + pos++; + } + return [0]; + } + function caml_make_vect(len, init){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 0; + for(var i = 1; i < len; i++) b[i] = init; + return b; + } + function caml_ml_seek_in(chanid, pos){return caml_seek_in(chanid, pos);} + function caml_sys_read_directory(name){ + var + root = resolve_fs_device(name), + a = root.device.readdir(root.rest), + l = new Array(a.length + 1); + l[0] = 0; + for(var i = 0; i < a.length; i++) l[i + 1] = caml_string_of_jsbytes(a[i]); + return l; + } + function caml_ml_output_char(chanid, c){ + var s = caml_string_of_jsbytes(String.fromCharCode(c)); + caml_ml_output(chanid, s, 0, 1); + return 0; + } + function caml_sys_const_ostype_win32(){return os_type == "Win32" ? 1 : 0;} + function caml_obj_is_block(x){return + (x instanceof Array);} + function caml_obj_set_raw_field(o, i, v){return o[i + 1] = v;} + function caml_js_var(x){ + var x = caml_jsstring_of_string(x); + if(! x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/)) + console.error + ('caml_js_var: "' + x + + '" is not a valid JavaScript variable. continuing ..'); + return eval(x); + } + function caml_trunc_float(x){return Math.trunc(x);} + function caml_ephe_unset_data(x){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(x[1] instanceof globalThis.FinalizationRegistry) + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].unregister(key); + } + } + x[caml_ephe_data_offset] = undefined; + return 0; + } + function caml_ephe_set_data(x, data){ + if(globalThis.FinalizationRegistry && globalThis.WeakRef) + if(! (x[1] instanceof globalThis.FinalizationRegistry)){ + x[1] = + new + globalThis.FinalizationRegistry + (function(){caml_ephe_unset_data(x);}); + for(var j = caml_ephe_key_offset; j < x.length; j++){ + var key = x[j]; + if(key instanceof globalThis.WeakRef){ + key = key.deref(); + if(key) x[1].register(key, undefined, key); + } + } + } + x[caml_ephe_data_offset] = data; + return 0; + } + function caml_ephe_blit_data(src, dst){ + var n = src[caml_ephe_data_offset]; + if(n === undefined) + caml_ephe_unset_data(dst); + else + caml_ephe_set_data(dst, n); + return 0; + } + var Base_internalhash_fold_int64 = caml_hash_mix_int64; + function caml_is_printable(c){return + (c > 31 && c < 127);} + function caml_bytes_lessequal(s1, s2){ + s1.t & 6 && caml_convert_string_to_bytes(s1); + s2.t & 6 && caml_convert_string_to_bytes(s2); + return s1.c <= s2.c ? 1 : 0; + } + function caml_array_of_bytes(x){return caml_uint8_array_of_bytes(x);} + function caml_equal(x, y){return + (caml_compare_val(x, y, false) == 0);} + function re_partial_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.partial_match"); + var res = re_match(re, s, pos, 1); + return res ? res : [0]; + } + function caml_sys_random_seed(){ + if(globalThis.crypto) + if(typeof globalThis.crypto.getRandomValues === "function"){ + var a = new Uint32Array(1); + globalThis.crypto.getRandomValues(a); + return [0, a[0]]; + } + else if(globalThis.crypto.randomBytes === "function"){ + var buff = globalThis.crypto.randomBytes(4), a = new Uint32Array(buff); + return [0, a[0]]; + } + var now = new Date().getTime(), x = now ^ 0xffffffff * Math.random(); + return [0, x]; + } + var all_finalizers = new globalThis.Set(); + function caml_final_register_called_without_value(cb, a){ + if(globalThis.FinalizationRegistry && a instanceof Object){ + var + x = + new + globalThis.FinalizationRegistry + (function(x){all_finalizers.delete(x); cb(0); return;}); + x.register(a, x); + all_finalizers.add(x); + } + return 0; + } + function caml_ba_get_2(ba, i0, i1){return ba.get(ba.offset([i0, i1]));} + function caml_ba_uint8_set16(ba, i0, v){ + var ofs = ba.offset(i0); + if(ofs + 1 >= ba.data.length) caml_array_bound_error(); + ba.set(ofs + 0, v & 0xff); + ba.set(ofs + 1, v >>> 8 & 0xff); + return 0; + } + function caml_lazy_reset_to_lazy(o){ + caml_obj_update_tag(o, 244, 246); + return 0; + } + function caml_js_delete(o, f){delete o[f]; return 0;} + function caml_int_of_string(s){ + var + r = caml_parse_sign_and_base(s), + i = r[0], + sign = r[1], + base = r[2], + len = caml_ml_string_length(s), + threshold = - 1 >>> 0, + c = i < len ? caml_string_unsafe_get(s, i) : 0, + d = caml_parse_digit(c); + if(d < 0 || d >= base) caml_failwith("int_of_string"); + var res = d; + for(i++; i < len; i++){ + c = caml_string_unsafe_get(s, i); + if(c == 95) continue; + d = caml_parse_digit(c); + if(d < 0 || d >= base) break; + res = base * res + d; + if(res > threshold) caml_failwith("int_of_string"); + } + if(i != len) caml_failwith("int_of_string"); + res = sign * res; + if(base == 10 && (res | 0) != res) caml_failwith("int_of_string"); + return res | 0; + } + function caml_list_mount_point(){ + var prev = 0; + for(var i = 0; i < jsoo_mount_point.length; i++){ + var old = prev; + prev = [0, caml_string_of_jsbytes(jsoo_mount_point[i].path), old]; + } + return prev; + } + var + caml_marshal_constants = + {PREFIX_SMALL_BLOCK: 0x80, + PREFIX_SMALL_INT: 0x40, + PREFIX_SMALL_STRING: 0x20, + CODE_INT8: 0x00, + CODE_INT16: 0x01, + CODE_INT32: 0x02, + CODE_INT64: 0x03, + CODE_SHARED8: 0x04, + CODE_SHARED16: 0x05, + CODE_SHARED32: 0x06, + CODE_BLOCK32: 0x08, + CODE_BLOCK64: 0x13, + CODE_STRING8: 0x09, + CODE_STRING32: 0x0A, + CODE_DOUBLE_BIG: 0x0B, + CODE_DOUBLE_LITTLE: 0x0C, + CODE_DOUBLE_ARRAY8_BIG: 0x0D, + CODE_DOUBLE_ARRAY8_LITTLE: 0x0E, + CODE_DOUBLE_ARRAY32_BIG: 0x0F, + CODE_DOUBLE_ARRAY32_LITTLE: 0x07, + CODE_CODEPOINTER: 0x10, + CODE_INFIXPOINTER: 0x11, + CODE_CUSTOM: 0x12, + CODE_CUSTOM_LEN: 0x18, + CODE_CUSTOM_FIXED: 0x19}; + function caml_obj_raw_field(o, i){return o[i + 1];} + function caml_js_equals(x, y){return + (x == y);} + function caml_obj_compare_and_swap(x, i, old, n){ + if(x[i + 1] == old){x[i + 1] = n; return 1;} + return 0; + } + function bigstring_to_typed_array(bs){return bs.data;} + function caml_gr_arc_aux(ctx, cx, cy, ry, rx, a1, a2){ + while(a1 > a2) a2 += 360; + a1 /= 180; + a2 /= 180; + var + rot = 0, + xPos, + yPos, + xPos_prev, + yPos_prev, + space = 2, + num = (a2 - a1) * Math.PI * ((rx + ry) / 2) / space | 0, + delta = (a2 - a1) * Math.PI / num, + i = a1 * Math.PI; + for(var j = 0; j <= num; j++){ + xPos = + cx - rx * Math.sin(i) * Math.sin(rot * Math.PI) + + ry * Math.cos(i) * Math.cos(rot * Math.PI); + xPos = xPos.toFixed(2); + yPos = + cy + ry * Math.cos(i) * Math.sin(rot * Math.PI) + + rx * Math.sin(i) * Math.cos(rot * Math.PI); + yPos = yPos.toFixed(2); + if(j == 0) + ctx.moveTo(xPos, yPos); + else if(xPos_prev != xPos || yPos_prev != yPos) ctx.lineTo(xPos, yPos); + xPos_prev = xPos; + yPos_prev = yPos; + i -= delta; + } + return 0; + } + function caml_gr_fill_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.fill(); + return 0; + } + function caml_ba_slice(ba, vind){ + vind = caml_js_from_array(vind); + var num_inds = vind.length, index = [], sub_dims = [], ofs; + if(num_inds > ba.dims.length) + caml_invalid_argument("Bigarray.slice: too many indices"); + if(ba.layout == 0){ + for(var i = 0; i < num_inds; i++) index[i] = vind[i]; + for(; i < ba.dims.length; i++) index[i] = 0; + sub_dims = ba.dims.slice(num_inds); + } + else{ + for(var i = 0; i < num_inds; i++) + index[ba.dims.length - num_inds + i] = vind[i]; + for(var i = 0; i < ba.dims.length - num_inds; i++) index[i] = 1; + sub_dims = ba.dims.slice(0, ba.dims.length - num_inds); + } + ofs = ba.offset(index); + var + size = caml_ba_get_size(sub_dims), + size_per_element = caml_ba_get_size_per_element(ba.kind), + new_data = + ba.data.subarray + (ofs * size_per_element, (ofs + size) * size_per_element); + return caml_ba_create_unsafe(ba.kind, ba.layout, sub_dims, new_data); + } + function caml_js_wrap_callback_unsafe(f){ + return function(){ + var len = caml_js_function_arity(f), args = new Array(len); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_ba_kind(ba){return ba.kind;} + function caml_alloc_dummy_infix(){ + return function f(x){return caml_call_gen(f.fun, [x]);}; + } + function caml_js_fun_call(f, a){ + switch(a.length){ + case 1: + return f(); + case 2: + return f(a[1]); + case 3: + return f(a[1], a[2]); + case 4: + return f(a[1], a[2], a[3]); + case 5: + return f(a[1], a[2], a[3], a[4]); + case 6: + return f(a[1], a[2], a[3], a[4], a[5]); + case 7: + return f(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return f(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + return f.apply(null, caml_js_from_array(a)); + } + function caml_gc_major_slice(work){return 0;} + function caml_js_pure_expr(f){return caml_callback(f, [0]);} + function compare_digits_nat(nat1, ofs1, nat2, ofs2){ + if(nat1.data[ofs1] > nat2.data[ofs2]) return 1; + if(nat1.data[ofs1] < nat2.data[ofs2]) return - 1; + return 0; + } + function caml_ml_input(chanid, b, i, l){ + var ba = caml_uint8_array_of_bytes(b); + return caml_ml_input_block(chanid, ba, i, l); + } + function caml_gr_wait_event(_evl){ + caml_failwith + ("caml_gr_wait_event not Implemented: use Graphics_js instead"); + } + function caml_gr_sigio_handler(){return 0;} + function caml_hash_mix_bigstring(h, bs){ + return caml_hash_mix_bytes_arr(h, bs.data); + } + function caml_record_backtrace(b){ + caml_record_backtrace_flag = b; + return 0; + } + function caml_unix_cleanup(){} + function caml_sys_get_config(){ + return [0, caml_string_of_jsbytes(os_type), 32, 0]; + } + function caml_sys_const_backend_type(){ + return [0, caml_string_of_jsbytes("js_of_ocaml")]; + } + function caml_obj_is_shared(x){return 1;} + function caml_ml_out_channels_list(){ + var l = 0; + for(var c = 0; c < caml_ml_channels.length; c++) + if + (caml_ml_channels[c] && caml_ml_channels[c].opened + && caml_ml_channels[c].out) + l = [0, caml_ml_channels[c].fd, l]; + return l; + } + function caml_asinh_float(x){return Math.asinh(x);} + function caml_pos_out(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.offset + chan.buffer_curr; + } + function bigstring_of_array_buffer(ab){ + var ta = new Uint8Array(ab); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_mod(x, y){if(y == 0) caml_raise_zero_divide(); return x % y;} + function caml_ba_init(){return 0;} + function caml_unix_filedescr_of_fd(x){return x;} + function re_string_match(re, s, pos){ + if(pos < 0 || pos > caml_ml_string_length(s)) + caml_invalid_argument("Str.string_match"); + var res = re_match(re, s, pos, 0); + return res ? res : [0]; + } + function BigStringReader(bs, i){this.s = bs; this.i = i;} + BigStringReader.prototype = + {read8u: function(){return caml_ba_get_1(this.s, this.i++);}, + read8s: function(){return caml_ba_get_1(this.s, this.i++) << 24 >> 24;}, + read16u: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 8 | caml_ba_get_1(s, i + 1); + }, + read16s: + function(){ + var s = this.s, i = this.i; + this.i = i + 2; + return caml_ba_get_1(s, i) << 24 >> 16 | caml_ba_get_1(s, i + 1); + }, + read32u: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return (caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3)) + >>> 0; + }, + read32s: + function(){ + var s = this.s, i = this.i; + this.i = i + 4; + return caml_ba_get_1(s, i) << 24 | caml_ba_get_1(s, i + 1) << 16 + | caml_ba_get_1(s, i + 2) << 8 + | caml_ba_get_1(s, i + 3); + }, + readstr: + function(len){ + var i = this.i, arr = new Array(len); + for(var j = 0; j < len; j++) arr[j] = caml_ba_get_1(this.s, i + j); + this.i = i + len; + return caml_string_of_array(arr); + }, + readuint8array: + function(len){ + var i = this.i, offset = this.offset(i); + this.i = i + len; + return this.s.data.subarray(offset, offset + len); + }}; + function caml_gr_dump_image(im){ + var data = [0]; + for(var i = 0; i < im.height; i++){ + data[i + 1] = [0]; + for(var j = 0; j < im.width; j++){ + var + o = i * (im.width * 4) + j * 4, + r = im.data[o + 0], + g = im.data[o + 1], + b = im.data[o + 2]; + data[i + 1][j + 1] = (r << 16) + (g << 8) + b; + } + } + return data; + } + function caml_ba_get_generic(ba, i){ + var ofs = ba.offset(caml_js_from_array(i)); + return ba.get(ofs); + } + function caml_unix_startup(){} + function caml_get_exception_backtrace(){return 0;} + function caml_format_float(fmt, x){ + function toFixed(x, dp){ + if(Math.abs(x) < 1.0) + return x.toFixed(dp); + else{ + var e = parseInt(x.toString().split("+")[1]); + if(e > 20){ + e -= 20; + x /= Math.pow(10, e); + x += new Array(e + 1).join("0"); + if(dp > 0) x = x + "." + new Array(dp + 1).join("0"); + return x; + } + else + return x.toFixed(dp); + } + } + var s, f = caml_parse_format(fmt), prec = f.prec < 0 ? 6 : f.prec; + if(x < 0 || x == 0 && 1 / x == - Infinity){f.sign = - 1; x = - x;} + if(isNaN(x)){ + s = "nan"; + f.filler = " "; + } + else if(! isFinite(x)){ + s = "inf"; + f.filler = " "; + } + else + switch(f.conv){ + case "e": + var s = x.toExponential(prec), i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + case "f": + s = toFixed(x, prec); break; + case "g": + prec = prec ? prec : 1; + s = x.toExponential(prec - 1); + var j = s.indexOf("e"), exp = + s.slice(j + 1); + if(exp < - 4 || x >= 1e21 || x.toFixed(0).length > prec){ + var i = j - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1) + s.slice(j); + i = s.length; + if(s.charAt(i - 3) == "e") + s = s.slice(0, i - 1) + "0" + s.slice(i - 1); + break; + } + else{ + var p = prec; + if(exp < 0){ + p -= exp + 1; + s = x.toFixed(p); + } + else + while(s = x.toFixed(p), s.length > prec + 1) p--; + if(p){ + var i = s.length - 1; + while(s.charAt(i) == "0") i--; + if(s.charAt(i) == ".") i--; + s = s.slice(0, i + 1); + } + } + break; + } + return caml_finish_formatting(f, s); + } + function caml_mount_autoload(name, f){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")); + jsoo_mount_point.push({path: name, device: new MlFakeDevice(name, f)}); + return 0; + } + function Base_int_math_int_clz(x){return Base_int_math_int32_clz(x);} + function caml_string_lessthan(s1, s2){return s1 < s2 ? 1 : 0;} + function caml_string_greaterthan(s1, s2){return caml_string_lessthan(s2, s1); + } + function caml_div(x, y){ + if(y == 0) caml_raise_zero_divide(); + return x / y | 0; + } + function caml_obj_dup(x){ + var l = x.length, a = new Array(l); + for(var i = 0; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ephe_get_data_copy(x){ + return x[caml_ephe_data_offset] === undefined + ? 0 + : [0, caml_obj_dup(x[caml_ephe_data_offset])]; + } + function caml_memprof_start(rate, stack_size, tracker){return 0;} + function caml_sys_get_argv(a){return [0, caml_argv[1], caml_argv];} + function caml_ml_domain_set_name(_name){return 0;} + function caml_js_to_bool(x){return + x;} + function caml_gr_create_image(x, y){ + var s = caml_gr_state_get(); + return s.context.createImageData(x, y); + } + function caml_ephe_get_key_copy(x, i){ + if(i < 0 || caml_ephe_key_offset + i >= x.length) + caml_invalid_argument("Weak.get_copy"); + var y = caml_ephe_get_key(x, i); + if(y === 0) return y; + var z = y[1]; + if(z instanceof Array) return [0, caml_obj_dup(z)]; + return y; + } + function caml_lessthan(x, y){return + (caml_compare_val(x, y, false) < 0);} + function caml_raw_backtrace_next_slot(){return 0;} + function caml_build_symbols(toc){ + var symb; + while(toc) + if(caml_jsstring_of_string(toc[1][1]) == "SYJS"){symb = toc[1][2]; break;} + else + toc = toc[2]; + var r = {}; + if(symb) + for(var i = 1; i < symb.length; i++) + r[caml_jsstring_of_string(symb[i][1])] = symb[i][2]; + return r; + } + function caml_register_global(n, v, name_opt){ + if(name_opt){ + var name = name_opt; + if(globalThis.toplevelReloc) + n = caml_callback(globalThis.toplevelReloc, [name]); + else if(caml_global_data.toc){ + if(! caml_global_data.symbols) + caml_global_data.symbols = caml_build_symbols(caml_global_data.toc); + var nid = caml_global_data.symbols[name]; + if(nid >= 0) + n = nid; + else + caml_failwith("caml_register_global: cannot locate " + name); + } + } + caml_global_data[n + 1] = v; + if(name_opt) caml_global_data[name_opt] = v; + } + function mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat3, ofs3, len3){ + var carry = 0; + for(var i = 0; i < len3; i++) + carry += + mult_digit_nat + (nat1, ofs1 + i, len1 - i, nat2, ofs2, len2, nat3, ofs3 + i); + return carry; + } + function square_nat(nat1, ofs1, len1, nat2, ofs2, len2){ + var carry = 0; + carry += add_nat(nat1, ofs1, len1, nat1, ofs1, len1, 0); + carry += mult_nat(nat1, ofs1, len1, nat2, ofs2, len2, nat2, ofs2, len2); + return carry; + } + function caml_js_from_float(x){return x;} + function caml_floatarray_create(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_gc_stat(){ + return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + } + function caml_get_major_credit(n){return 0;} + function caml_sys_modify_argv(arg){caml_argv = arg; return 0;} + var caml_method_cache = []; + function caml_get_public_method(obj, tag, cacheid){ + var meths = obj[1], ofs = caml_method_cache[cacheid]; + if(ofs === undefined) + for(var i = caml_method_cache.length; i < cacheid; i++) + caml_method_cache[i] = 0; + else if(meths[ofs] === tag) return meths[ofs - 1]; + var li = 3, hi = meths[1] * 2 + 1, mi; + while(li < hi){ + mi = li + hi >> 1 | 1; + if(tag < meths[mi + 1]) hi = mi - 2; else li = mi; + } + caml_method_cache[cacheid] = li + 1; + return tag == meths[li + 1] ? meths[li] : 0; + } + function caml_js_get_console(){ + var + c = console, + m = + ["log", + "debug", + "info", + "warn", + "error", + "assert", + "dir", + "dirxml", + "trace", + "group", + "groupCollapsed", + "groupEnd", + "time", + "timeEnd"]; + function f(){} + for(var i = 0; i < m.length; i++) if(! c[m[i]]) c[m[i]] = f; + return c; + } + function caml_sys_unsafe_getenv(name){return caml_sys_getenv(name);} + function caml_ml_open_descriptor_in(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.wronly) caml_raise_sys_error("fd " + fd + " is writeonly"); + var + refill = null, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: false, + buffer_curr: 0, + buffer_max: 0, + buffer: new Uint8Array(65536), + refill: refill}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function bigstring_of_typed_array(ba){ + var + ta = + new + Uint8Array + (ba.buffer, ba.byteOffset, ba.length * ba.BYTES_PER_ELEMENT); + return caml_ba_create_unsafe(12, 0, [ta.length], ta); + } + function caml_round_float(x){return Math.round(x);} + function caml_ojs_new_arr(c, a){ + switch(a.length){ + case 0: + return new c(); + case 1: + return new c(a[0]); + case 2: + return new c(a[0], a[1]); + case 3: + return new c(a[0], a[1], a[2]); + case 4: + return new c(a[0], a[1], a[2], a[3]); + case 5: + return new c(a[0], a[1], a[2], a[3], a[4]); + case 6: + return new c(a[0], a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); + } + function F(){return c.apply(this, a);} + F.prototype = c.prototype; + return new F(); + } + function complement_nat(nat, ofs, len){ + for(var i = 0; i < len; i++) + nat.data[ofs + i] = (- 1 >>> 0) - (nat.data[ofs + i] >>> 0); + } + var caml_domain_dls = [0]; + function caml_domain_dls_set(a){caml_domain_dls = a;} + function caml_lazy_read_result(o){ + return caml_obj_tag(o) == 250 ? o[1] : o; + } + var caml_js_regexps = {amp: /&/g, lt: / 1023){ + exp -= 1023; + x *= Math.pow(2, 1023); + if(exp > 1023){exp -= 1023; x *= Math.pow(2, 1023);} + } + if(exp < - 1023){exp += 1023; x *= Math.pow(2, - 1023);} + x *= Math.pow(2, exp); + return x; + } + function caml_gr_state_set(ctx){ + caml_gr_state = ctx; + caml_gr_state_init(); + return 0; + } + function caml_js_wrap_callback_strict(arity, f){ + return function(){ + var + n = arguments.length, + args = new Array(arity), + len = Math.min(arguments.length, arity); + for(var i = 0; i < len; i++) args[i] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_gc_minor_words(unit){return 0;} + function caml_get_current_callstack(){return [0];} + function land_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] &= nat2.data[ofs2]; return 0; + } + function caml_int64_mod(x, y){return x.mod(y);} + function caml_obj_set_tag(x, tag){x[0] = tag; return 0;} + function caml_int32_bswap(x){ + return (x & 0x000000FF) << 24 | (x & 0x0000FF00) << 8 + | (x & 0x00FF0000) >>> 8 + | (x & 0xFF000000) >>> 24; + } + function caml_ba_set_3(ba, i0, i1, i2, v){ + ba.set(ba.offset([i0, i1, i2]), v); + return 0; + } + function caml_js_instanceof(o, c){return o instanceof c ? 1 : 0;} + function caml_get_major_bucket(n){return 0;} + function nth_digit_nat_native(nat, ofs){return nat.data[ofs];} + function set_digit_nat_native(nat, ofs, digit){nat.data[ofs] = digit; return 0; + } + function caml_string_set64(s, i, i64){caml_failwith("caml_string_set64");} + function caml_gr_state_create(canvas, w, h){ + var context = canvas.getContext("2d"); + return {context: context, + canvas: canvas, + x: 0, + y: 0, + width: w, + height: h, + line_width: 1, + font: caml_string_of_jsbytes("fixed"), + text_size: 26, + color: 0x000000, + title: caml_string_of_jsbytes("")}; + } + function caml_gr_draw_arc(x, y, rx, ry, a1, a2){ + var s = caml_gr_state_get(); + s.context.beginPath(); + caml_gr_arc_aux(s.context, x, s.height - y, rx, ry, a1, a2); + s.context.stroke(); + return 0; + } + function caml_ba_map_file(vfd, kind, layout, shared, dims, pos){caml_failwith("caml_ba_map_file not implemented"); + } + function caml_ba_map_file_bytecode(argv, argn){ + return caml_ba_map_file + (argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); + } + function caml_ba_create_from(data1, data2, jstyp, kind, layout, dims){ + if(data2 || caml_ba_get_size_per_element(kind) == 2) + caml_invalid_argument + ("caml_ba_create_from: use return caml_ba_create_unsafe"); + return caml_ba_create_unsafe(kind, layout, dims, data1); + } + function caml_tanh_float(x){return Math.tanh(x);} + function Base_int_math_int_ctz(x){return Base_int_math_int32_ctz(x);} + function caml_runtime_events_start(){return 0;} + function caml_gr_draw_str(str){ + var s = caml_gr_state_get(), m = s.context.measureText(str), dx = m.width; + s.context.fillText(str, s.x, s.height - s.y); + s.x += dx | 0; + return 0; + } + function caml_gr_draw_string(str){ + caml_gr_draw_str(caml_jsstring_of_string(str)); + return 0; + } + function caml_gr_draw_char(c){ + caml_gr_draw_str(String.fromCharCode(c)); + return 0; + } + function caml_unmount(name){ + var + path = caml_make_path(name), + name = caml_trailing_slash(path.join("/")), + idx = - 1; + for(var i = 0; i < jsoo_mount_point.length; i++) + if(jsoo_mount_point[i].path == name) idx = i; + if(idx > - 1) jsoo_mount_point.splice(idx, 1); + return 0; + } + function caml_bigstring_blit_ba_to_ba(ba1, pos1, ba2, pos2, len){ + if(12 != ba1.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(12 != ba2.kind) + caml_invalid_argument("caml_bigstring_blit_ba_to_ba: kind mismatch"); + if(len == 0) return 0; + var ofs1 = ba1.offset(pos1), ofs2 = ba2.offset(pos2); + if(ofs1 + len > ba1.data.length) caml_array_bound_error(); + if(ofs2 + len > ba2.data.length) caml_array_bound_error(); + var slice = ba1.data.subarray(ofs1, ofs1 + len); + ba2.data.set(slice, pos2); + return 0; + } + function caml_input_value_from_string(s, ofs){ + var reader = new MlStringReader(s, typeof ofs == "number" ? ofs : ofs[0]); + return caml_input_value_from_reader(reader, ofs); + } + function caml_ml_pos_in_64(chanid){ + return caml_int64_of_float(caml_pos_in(chanid)); + } + function caml_gr_draw_image(im, x, y){ + var s = caml_gr_state_get(); + if(! im.image){ + var canvas = document.createElement("canvas"); + canvas.width = s.width; + canvas.height = s.height; + canvas.getContext("2d").putImageData(im, 0, 0); + var image = new globalThis.Image(); + image.onload = + function(){ + s.context.drawImage(image, x, s.height - im.height - y); + im.image = image; + }; + image.src = canvas.toDataURL("image/png"); + } + else + s.context.drawImage(im.image, x, s.height - im.height - y); + return 0; + } + function caml_register_channel_for_spacetime(_channel){return 0;} + function caml_string_set(s, i, c){caml_failwith("caml_string_set");} + function caml_sys_rmdir(name){ + var root = resolve_fs_device(name); + root.device.rmdir(root.rest); + return 0; + } + function caml_unix_symlink(to_dir, src, dst){ + var src_root = resolve_fs_device(src), dst_root = resolve_fs_device(dst); + if(src_root.device != dst_root.device) + caml_failwith + ("caml_unix_symlink: cannot symlink between two filesystems"); + if(! src_root.device.symlink) + caml_failwith("caml_unix_symlink: not implemented"); + return src_root.device.symlink(to_dir, src_root.rest, dst_root.rest, true); + } + function Base_int_math_int64_ctz(x){ + if(caml_int64_is_zero(x)) return 64; + var n = 1; + function is_zero(x){return caml_int64_is_zero(x);} + function land(x, y){return caml_int64_and(x, y);} + function small_int64(x){return caml_int64_create_lo_mi_hi(x, 0, 0);} + if + (is_zero(land(x, caml_int64_create_lo_mi_hi(0xFFFFFF, 0x0000FF, 0x0000)))){n = n + 32; x = caml_int64_shift_right_unsigned(x, 32);} + if(is_zero(land(x, small_int64(0x00FFFF)))){ + n = n + 16; + x = caml_int64_shift_right_unsigned(x, 16); + } + if(is_zero(land(x, small_int64(0x0000FF)))){ + n = n + 8; + x = caml_int64_shift_right_unsigned(x, 8); + } + if(is_zero(land(x, small_int64(0x00000F)))){ + n = n + 4; + x = caml_int64_shift_right_unsigned(x, 4); + } + if(is_zero(land(x, small_int64(0x000003)))){ + n = n + 2; + x = caml_int64_shift_right_unsigned(x, 2); + } + return n - caml_int64_to_int32(caml_int64_and(x, small_int64(0x000001))); + } + function caml_ml_pos_out(chanid){return caml_pos_out(chanid);} + function Base_caml_exn_is_most_recent_exn(x){return 1;} + function caml_spacetime_enabled(_unit){return 0;} + function caml_bytes_notequal(s1, s2){return 1 - caml_bytes_equal(s1, s2);} + function caml_runtime_parameters(_unit){return caml_string_of_jsbytes("");} + function caml_js_object(a){ + var o = {}; + for(var i = 1; i < a.length; i++){ + var p = a[i]; + o[caml_jsstring_of_string(p[1])] = p[2]; + } + return o; + } + function caml_ba_create(kind, layout, dims_ml){ + var + dims = caml_js_from_array(dims_ml), + data = caml_ba_create_buffer(kind, caml_ba_get_size(dims)); + return caml_ba_create_unsafe(kind, layout, dims, data); + } + function caml_gr_remember_mode(){ + caml_failwith("caml_gr_remember_mode not Implemented"); + } + function Base_internalhash_get_hash_value(seed){ + var h = caml_hash_mix_final(seed); + return h & 0x3FFFFFFF; + } + function caml_fma_float(x, y, z){ + var + SPLIT = Math.pow(2, 27) + 1, + MIN_VALUE = Math.pow(2, - 1022), + EPSILON = Math.pow(2, - 52), + C = 416, + A = Math.pow(2, + C), + B = Math.pow(2, - C); + function multiply(a, b){ + var + at = SPLIT * a, + ahi = at - (at - a), + alo = a - ahi, + bt = SPLIT * b, + bhi = bt - (bt - b), + blo = b - bhi, + p = a * b, + e = ahi * bhi - p + ahi * blo + alo * bhi + alo * blo; + return {p: p, e: e}; + } + function add(a, b){ + var s = a + b, v = s - a, e = a - (s - v) + (b - v); + return {s: s, e: e}; + } + function adjust(x, y){ + return x !== 0 && y !== 0 && SPLIT * x - (SPLIT * x - x) === x + ? x * (1 + (x < 0 ? - 1 : + 1) * (y < 0 ? - 1 : + 1) * EPSILON) + : x; + } + if + (x === 0 || x !== x || x === + (1 / 0) || x === - (1 / 0) || y === 0 + || y !== y + || y === + (1 / 0) + || y === - (1 / 0)) + return x * y + z; + if(z === 0) return x * y; + if(z !== z || z === + (1 / 0) || z === - (1 / 0)) return z; + var scale = 1; + while(Math.abs(x) > A){scale *= A; x *= B;} + while(Math.abs(y) > A){scale *= A; y *= B;} + if(scale === 1 / 0) return x * y * scale; + while(Math.abs(x) < B){scale *= B; x *= A;} + while(Math.abs(y) < B){scale *= B; y *= A;} + if(scale === 0) return z; + var xs = x, ys = y, zs = z / scale; + if(Math.abs(zs) > Math.abs(xs * ys) * 4 / EPSILON) return z; + if(Math.abs(zs) < Math.abs(xs * ys) * EPSILON / 4 * EPSILON / 4) + zs = (z < 0 ? - 1 : + 1) * MIN_VALUE; + var + xy = multiply(xs, ys), + s = add(xy.p, zs), + u = add(xy.e, s.e), + i = add(s.s, u.s), + f = i.s + adjust(i.e, u.e); + if(f === 0) return f; + var fs = f * scale; + if(Math.abs(fs) > MIN_VALUE) return fs; + return fs + adjust(f - fs / scale, i.e) * scale; + } + function caml_recommended_domain_count(unit){return 1;} + function caml_bswap16(x){return (x & 0x00FF) << 8 | (x & 0xFF00) >> 8;} + function caml_ml_set_binary_mode(chanid, mode){ + var chan = caml_ml_channels[chanid]; + chan.file.flags.text = ! mode; + chan.file.flags.binary = mode; + return 0; + } + function caml_final_register(){return 0;} + function caml_gr_draw_rect(x, y, w, h){ + var s = caml_gr_state_get(); + s.context.strokeRect(x, s.height - y, w, - h); + return 0; + } + function caml_string_get16(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 1) caml_string_bound_error(); + var + b1 = caml_string_unsafe_get(s, i), + b2 = caml_string_unsafe_get(s, i + 1); + return b2 << 8 | b1; + } + function caml_output_value(chanid, v, flags){ + var s = caml_output_value_to_string(v, flags); + caml_ml_output(chanid, s, 0, caml_ml_string_length(s)); + return 0; + } + function caml_ba_get_3(ba, i0, i1, i2){ + return ba.get(ba.offset([i0, i1, i2])); + } + function caml_ephe_blit_key(a1, i1, a2, i2, len){ + caml_array_blit + (a1, + caml_ephe_key_offset + i1 - 1, + a2, + caml_ephe_key_offset + i2 - 1, + len); + return 0; + } + var caml_initial_time = new Date().getTime() * 0.001; + function caml_sys_time(){ + var now = new Date().getTime(); + return now * 0.001 - caml_initial_time; + } + function caml_sys_time_include_children(b){return caml_sys_time();} + function Base_clear_caml_backtrace_pos(x){return 0;} + function caml_check_bound(array, index){ + if(index >>> 0 >= array.length - 1) caml_array_bound_error(); + return array; + } + function caml_unix_getpwuid(unit){caml_raise_not_found();} + function caml_ba_to_typed_array(ba){return ba.data;} + function caml_domain_dls_get(unit){return caml_domain_dls;} + function caml_bytes_get32(s, i){ + if(i >>> 0 >= s.l - 3) caml_bytes_bound_error(); + var + b1 = caml_bytes_unsafe_get(s, i), + b2 = caml_bytes_unsafe_get(s, i + 1), + b3 = caml_bytes_unsafe_get(s, i + 2), + b4 = caml_bytes_unsafe_get(s, i + 3); + return b4 << 24 | b3 << 16 | b2 << 8 | b1; + } + function caml_frexp_float(x){ + if(x == 0 || ! isFinite(x)) return [0, x, 0]; + var neg = x < 0; + if(neg) x = - x; + var exp = Math.max(- 1023, jsoo_floor_log2(x) + 1); + x *= Math.pow(2, - exp); + while(x < 0.5){x *= 2; exp--;} + while(x >= 1){x *= 0.5; exp++;} + if(neg) x = - x; + return [0, x, exp]; + } + function caml_string_get64(s, i){ + if(i >>> 0 >= caml_ml_string_length(s) - 7) caml_string_bound_error(); + var a = new Array(8); + for(var j = 0; j < 8; j++) a[7 - j] = caml_string_unsafe_get(s, i + j); + return caml_int64_of_bytes(a); + } + function caml_js_error_option_of_exception(exn){ + if(exn.js_error) return [0, exn.js_error]; + return 0; + } + function caml_ml_pos_out_64(chanid){ + return caml_int64_of_float(caml_pos_out(chanid)); + } + function caml_unix_findclose(dir_handle){return caml_unix_closedir(dir_handle); + } + function caml_gr_close_subwindow(a){ + caml_failwith("caml_gr_close_subwindow not Implemented"); + } + function caml_floatarray_blit(a1, i1, a2, i2, len){ + if(i2 <= i1) + for(var j = 1; j <= len; j++) a2[i2 + j] = a1[i1 + j]; + else + for(var j = len; j >= 1; j--) a2[i2 + j] = a1[i1 + j]; + return 0; + } + function caml_get_minor_free(unit){return 0;} + function caml_set_static_env(k, v){ + if(! globalThis.jsoo_static_env) globalThis.jsoo_static_env = {}; + globalThis.jsoo_static_env[k] = v; + return 0; + } + function caml_ba_change_layout(ba, layout){ + if(ba.layout == layout) return ba; + var new_dims = []; + for(var i = 0; i < ba.dims.length; i++) + new_dims[i] = ba.dims[ba.dims.length - i - 1]; + return caml_ba_create_unsafe(ba.kind, layout, new_dims, ba.data); + } + function Base_hash_double(d){return caml_hash(1, 1, 0, d);} + function caml_js_new(c, a){ + switch(a.length){ + case 1: + return new c(); + case 2: + return new c(a[1]); + case 3: + return new c(a[1], a[2]); + case 4: + return new c(a[1], a[2], a[3]); + case 5: + return new c(a[1], a[2], a[3], a[4]); + case 6: + return new c(a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return new c(a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + } + function F(){return c.apply(this, caml_js_from_array(a));} + F.prototype = c.prototype; + return new F(); + } + function caml_gr_current_y(){var s = caml_gr_state_get(); return s.y;} + function caml_format_int(fmt, i){ + if(caml_jsbytes_of_string(fmt) == "%d") + return caml_string_of_jsbytes("" + i); + var f = caml_parse_format(fmt); + if(i < 0) if(f.signedconv){f.sign = - 1; i = - i;} else i >>>= 0; + var s = i.toString(f.base); + if(f.prec >= 0){ + f.filler = " "; + var n = f.prec - s.length; + if(n > 0) s = caml_str_repeat(n, "0") + s; + } + return caml_finish_formatting(f, s); + } + function jsoo_effect_not_supported(){ + caml_failwith("Effect handlers are not supported"); + } + function caml_continuation_use_and_update_handler_noexc + (cont, hval, hexn, heff){ + var stack = caml_continuation_use_noexc(cont); + stack[3] = [0, hval, hexn, heff]; + return stack; + } + function caml_obj_truncate(x, s){ + if(s <= 0 || s + 1 > x.length) caml_invalid_argument("Obj.truncate"); + if(x.length != s + 1) x.length = s + 1; + return 0; + } + function caml_js_to_string(s){return caml_string_of_jsstring(s);} + function is_digit_odd(nat, ofs){if(nat.data[ofs] & 1) return 1; return 0;} + function caml_runtime_variant(_unit){return caml_string_of_jsbytes("");} + function caml_ml_open_descriptor_out(fd){ + var file = caml_sys_fds[fd]; + if(file.flags.rdonly) caml_raise_sys_error("fd " + fd + " is readonly"); + var + buffered = file.flags.buffered !== undefined ? file.flags.buffered : 1, + channel = + {file: file, + offset: file.flags.append ? file.length() : 0, + fd: fd, + opened: true, + out: true, + buffer_curr: 0, + buffer: new Uint8Array(65536), + buffered: buffered}; + caml_ml_channels[channel.fd] = channel; + return channel.fd; + } + function caml_array_concat(l){ + var a = [0]; + while(l !== 0){ + var b = l[1]; + for(var i = 1; i < b.length; i++) a.push(b[i]); + l = l[2]; + } + return a; + } + function caml_gr_open_graph(info){ + var info = caml_jsstring_of_string(info); + function get(name){ + var res = info.match("(^|,) *" + name + " *= *([a-zA-Z0-9_]+) *(,|$)"); + if(res) return res[2]; + } + var specs = []; + if(! (info == "")) specs.push(info); + var target = get("target"); + if(! target) target = ""; + var status = get("status"); + if(! status) specs.push("status=1"); + var w = get("width"); + w = w ? parseInt(w) : 200; + specs.push("width=" + w); + var h = get("height"); + h = h ? parseInt(h) : 200; + specs.push("height=" + h); + var win = globalThis.open("about:blank", target, specs.join(",")); + if(! win) caml_failwith("Graphics.open_graph: cannot open the window"); + var doc = win.document, canvas = doc.createElement("canvas"); + canvas.width = w; + canvas.height = h; + var ctx = caml_gr_state_create(canvas, w, h); + ctx.set_title = function(title){doc.title = title;}; + caml_gr_state_set(ctx); + var body = doc.body; + body.style.margin = "0px"; + body.appendChild(canvas); + return 0; + } + function caml_make_float_vect(len){ + if(len < 0) caml_array_bound_error(); + var len = len + 1 | 0, b = new Array(len); + b[0] = 254; + for(var i = 1; i < len; i++) b[i] = 0; + return b; + } + function caml_cbrt_float(x){return Math.cbrt(x);} + function caml_eventlog_pause(unit){return 0;} + function caml_memprof_stop(unit){return 0;} + function caml_greaterequal(x, y){ + return + (caml_compare_val(x, y, false) >= 0); + } + function caml_get_exception_raw_backtrace(){return [0];} + function caml_log1p_float(x){return Math.log1p(x);} + var ms_to_nano = caml_int64_of_int32(1000 * 1000); + function time_now_nanoseconds_since_unix_epoch_or_zero(){ + var ms = Date.now(), ms_i63 = caml_int64_of_float(ms * 2); + return caml_int64_mul(ms_i63, ms_to_nano); + } + function caml_runtime_events_free_cursor(cursor){return 0;} + function caml_lazy_make_forward(v){return [250, v];} + function lor_digit_nat(nat1, ofs1, nat2, ofs2){nat1.data[ofs1] |= nat2.data[ofs2]; return 0; + } + function caml_gr_blit_image(im, x, y){ + var + s = caml_gr_state_get(), + im2 = + s.context.getImageData + (x, s.height - im.height - y, im.width, im.height); + for(var i = 0; i < im2.data.length; i += 4){ + im.data[i] = im2.data[i]; + im.data[i + 1] = im2.data[i + 1]; + im.data[i + 2] = im2.data[i + 2]; + im.data[i + 3] = im2.data[i + 3]; + } + return 0; + } + function caml_gr_window_id(a){ + caml_failwith("caml_gr_window_id not Implemented"); + } + function caml_js_on_ie(){ + var ua = globalThis.navigator ? globalThis.navigator.userAgent : ""; + return ua.indexOf("MSIE") != - 1 && ua.indexOf("Opera") != 0; + } + function caml_int64_shift_right(x, s){return x.shift_right(s);} + function caml_ba_layout(ba){return ba.layout;} + function caml_convert_raw_backtrace(){return [0];} + function caml_array_set(array, index, newval){ + if(index < 0 || index >= array.length - 1) caml_array_bound_error(); + array[index + 1] = newval; + return 0; + } + function caml_alloc_stack(hv, hx, hf){return 0;} + function caml_bytes_greaterequal(s1, s2){return caml_bytes_lessequal(s2, s1); + } + function set_digit_nat(nat, ofs, digit){nat.data[ofs] = digit; return 0;} + function caml_bytes_set16(s, i, i16){ + if(i >>> 0 >= s.l - 1) caml_bytes_bound_error(); + var b2 = 0xFF & i16 >> 8, b1 = 0xFF & i16; + caml_bytes_unsafe_set(s, i + 0, b1); + caml_bytes_unsafe_set(s, i + 1, b2); + return 0; + } + function caml_gr_doc_of_state(state){ + if(state.canvas.ownerDocument) return state.canvas.ownerDocument; + } + function caml_ml_output_int(chanid, i){ + var + arr = [i >> 24 & 0xFF, i >> 16 & 0xFF, i >> 8 & 0xFF, i & 0xFF], + s = caml_string_of_array(arr); + caml_ml_output(chanid, s, 0, 4); + return 0; + } + function caml_obj_with_tag(tag, x){ + var l = x.length, a = new Array(l); + a[0] = tag; + for(var i = 1; i < l; i++) a[i] = x[i]; + return a; + } + function caml_ml_channel_size(chanid){ + var chan = caml_ml_channels[chanid]; + return chan.file.length(); + } + function caml_raw_backtrace_slot(){ + caml_invalid_argument + ("Printexc.get_raw_backtrace_slot: index out of bounds"); + } + function caml_hexstring_of_float(x, prec, style){ + if(! isFinite(x)){ + if(isNaN(x)) return caml_string_of_jsstring("nan"); + return caml_string_of_jsstring(x > 0 ? "infinity" : "-infinity"); + } + var sign = x == 0 && 1 / x == - Infinity ? 1 : x >= 0 ? 0 : 1; + if(sign) x = - x; + var exp = 0; + if(x == 0) + ; + else if(x < 1) + while(x < 1 && exp > - 1022){x *= 2; exp--;} + else + while(x >= 2){x /= 2; exp++;} + var exp_sign = exp < 0 ? "" : "+", sign_str = ""; + if(sign) + sign_str = "-"; + else + switch(style){ + case 43: + sign_str = "+"; break; + case 32: + sign_str = " "; break; + default: break; + } + if(prec >= 0 && prec < 13){ + var cst = Math.pow(2, prec * 4); + x = Math.round(x * cst) / cst; + } + var x_str = x.toString(16); + if(prec >= 0){ + var idx = x_str.indexOf("."); + if(idx < 0) + x_str += "." + caml_str_repeat(prec, "0"); + else{ + var size = idx + 1 + prec; + if(x_str.length < size) + x_str += caml_str_repeat(size - x_str.length, "0"); + else + x_str = x_str.substr(0, size); + } + } + return caml_string_of_jsstring + (sign_str + "0x" + x_str + "p" + exp_sign + exp.toString(10)); + } + function caml_runtime_events_user_write(event, event_content){return 0;} + function caml_js_wrap_meth_callback_strict(arity, f){ + return function(){ + var args = new Array(arity + 1), len = Math.min(arguments.length, arity); + args[0] = this; + for(var i = 0; i < len; i++) args[i + 1] = arguments[i]; + return caml_callback(f, args);}; + } + function caml_unix_readlink(name){ + var root = resolve_fs_device(name); + if(! root.device.readlink) + caml_failwith("caml_unix_readlink: not implemented"); + return root.device.readlink(root.rest, true); + } + function caml_backtrace_status(_unit){ + return caml_record_backtrace_flag ? 1 : 0; + } + function caml_install_signal_handler(){return 0;} + function caml_sys_argv(a){return caml_argv;} + function caml_ba_fill(ba, v){ba.fill(v); return 0;} + function caml_modf_float(x){ + if(isFinite(x)){ + var neg = 1 / x < 0; + x = Math.abs(x); + var i = Math.floor(x), f = x - i; + if(neg){i = - i; f = - f;} + return [0, f, i]; + } + if(isNaN(x)) return [0, NaN, NaN]; + return [0, 1 / x, x]; + } + function caml_gc_get(){return [0, 0, 0, 0, 0, 0, 0, 0, 0];} + function caml_float_compare(x, y){ + if(x === y) return 0; + if(x < y) return - 1; + if(x > y) return 1; + if(x === x) return 1; + if(y === y) return - 1; + return 0; + } + function caml_string_set32(s, i, i32){caml_failwith("caml_string_set32");} + function caml_parse_engine(tables, env, cmd, arg){ + var + ERRCODE = 256, + loop = 6, + testshift = 7, + shift = 8, + shift_recover = 9, + reduce = 10, + READ_TOKEN = 0, + RAISE_PARSE_ERROR = 1, + GROW_STACKS_1 = 2, + GROW_STACKS_2 = 3, + COMPUTE_SEMANTIC_ACTION = 4, + CALL_ERROR_FUNCTION = 5, + env_s_stack = 1, + env_v_stack = 2, + env_symb_start_stack = 3, + env_symb_end_stack = 4, + env_stacksize = 5, + env_stackbase = 6, + env_curr_char = 7, + env_lval = 8, + env_symb_start = 9, + env_symb_end = 10, + env_asp = 11, + env_rule_len = 12, + env_rule_number = 13, + env_sp = 14, + env_state = 15, + env_errflag = 16, + tbl_transl_const = 2, + tbl_transl_block = 3, + tbl_lhs = 4, + tbl_len = 5, + tbl_defred = 6, + tbl_dgoto = 7, + tbl_sindex = 8, + tbl_rindex = 9, + tbl_gindex = 10, + tbl_tablesize = 11, + tbl_table = 12, + tbl_check = 13, + tbl_names_const = 15, + tbl_names_block = 16; + function log(x){ + var s = caml_string_of_jsbytes(x + "\n"); + caml_ml_output(2, s, 0, caml_ml_string_length(s)); + } + function token_name(names, number){ + var str = caml_jsstring_of_string(names); + if(str[0] == "\x00") return ""; + return str.split("\x00")[number]; + } + function print_token(state, tok){ + var token, kind; + if(tok instanceof Array){ + token = token_name(tables[tbl_names_block], tok[0]); + if(typeof tok[1] == "number") + kind = "" + tok[1]; + else if(typeof tok[1] == "string") + kind = tok[1]; + else if(tok[1] instanceof MlBytes) + kind = caml_jsbytes_of_string(tok[1]); + else + kind = "_"; + log("State " + state + ": read token " + token + "(" + kind + ")"); + } + else{ + token = token_name(tables[tbl_names_const], tok); + log("State " + state + ": read token " + token); + } + } + if(! tables.dgoto){ + tables.defred = caml_lex_array(tables[tbl_defred]); + tables.sindex = caml_lex_array(tables[tbl_sindex]); + tables.check = caml_lex_array(tables[tbl_check]); + tables.rindex = caml_lex_array(tables[tbl_rindex]); + tables.table = caml_lex_array(tables[tbl_table]); + tables.len = caml_lex_array(tables[tbl_len]); + tables.lhs = caml_lex_array(tables[tbl_lhs]); + tables.gindex = caml_lex_array(tables[tbl_gindex]); + tables.dgoto = caml_lex_array(tables[tbl_dgoto]); + } + var + res = 0, + n, + n1, + n2, + state1, + sp = env[env_sp], + state = env[env_state], + errflag = env[env_errflag]; + exit: + for(;;) + next: + switch(cmd){ + case 0: + state = 0; errflag = 0; + case 6: + n = tables.defred[state]; + if(n != 0){cmd = reduce; break;} + if(env[env_curr_char] >= 0){cmd = testshift; break;} + res = READ_TOKEN; + break exit; + case 1: + if(arg instanceof Array){ + env[env_curr_char] = tables[tbl_transl_block][arg[0] + 1]; + env[env_lval] = arg[1]; + } + else{ + env[env_curr_char] = tables[tbl_transl_const][arg + 1]; + env[env_lval] = 0; + } + if(caml_parser_trace) print_token(state, arg); + case 7: + n1 = tables.sindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){cmd = shift; break;} + n1 = tables.rindex[state]; + n2 = n1 + env[env_curr_char]; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == env[env_curr_char]){ + n = tables.table[n2]; + cmd = reduce; + break; + } + if(errflag <= 0){res = CALL_ERROR_FUNCTION; break exit;} + case 5: + if(errflag < 3){ + errflag = 3; + for(;;){ + state1 = env[env_s_stack][sp + 1]; + n1 = tables.sindex[state1]; + n2 = n1 + ERRCODE; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == ERRCODE){ + if(caml_parser_trace) log("Recovering in state " + state1); + cmd = shift_recover; + break next; + } + else{ + if(caml_parser_trace) log("Discarding state " + state1); + if(sp <= env[env_stackbase]){ + if(caml_parser_trace) log("No more states to discard"); + return RAISE_PARSE_ERROR; + } + sp--; + } + } + } + else{ + if(env[env_curr_char] == 0) return RAISE_PARSE_ERROR; + if(caml_parser_trace) log("Discarding last token read"); + env[env_curr_char] = - 1; + cmd = loop; + break; + } + case 8: + env[env_curr_char] = - 1; if(errflag > 0) errflag--; + case 9: + if(caml_parser_trace) + log("State " + state + ": shift to state " + tables.table[n2]); + state = tables.table[n2]; + sp++; + if(sp >= env[env_stacksize]){res = GROW_STACKS_1; break exit;} + case 2: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = env[env_lval]; + env[env_symb_start_stack][sp + 1] = env[env_symb_start]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end]; + cmd = loop; + break; + case 10: + if(caml_parser_trace) log("State " + state + ": reduce by rule " + n); + var m = tables.len[n]; + env[env_asp] = sp; + env[env_rule_number] = n; + env[env_rule_len] = m; + sp = sp - m + 1; + m = tables.lhs[n]; + state1 = env[env_s_stack][sp]; + n1 = tables.gindex[m]; + n2 = n1 + state1; + if + (n1 != 0 && n2 >= 0 && n2 <= tables[tbl_tablesize] + && tables.check[n2] == state1) + state = tables.table[n2]; + else + state = tables.dgoto[m]; + if(sp >= env[env_stacksize]){res = GROW_STACKS_2; break exit;} + case 3: + res = COMPUTE_SEMANTIC_ACTION; break exit; + case 4: + env[env_s_stack][sp + 1] = state; + env[env_v_stack][sp + 1] = arg; + var asp = env[env_asp]; + env[env_symb_end_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + if(sp > asp) + env[env_symb_start_stack][sp + 1] = env[env_symb_end_stack][asp + 1]; + cmd = loop; + break; + default: return RAISE_PARSE_ERROR; + } + env[env_sp] = sp; + env[env_state] = state; + env[env_errflag] = errflag; + return res; + } + function caml_jsoo_flags_effects(unit){return 0;} + function caml_update_dummy(x, y){ + if(typeof y === "function"){x.fun = y; return 0;} + if(y.fun){x.fun = y.fun; return 0;} + var i = y.length; + while(i--) x[i] = y[i]; + return 0; + } + function caml_array_fill(array, ofs, len, v){ + for(var i = 0; i < len; i++) array[ofs + i + 1] = v; + return 0; + } + function caml_sys_mkdir(name, perm){ + var root = resolve_fs_device(name); + root.device.mkdir(root.rest, perm); + return 0; + } + function caml_string_notequal(s1, s2){ + return 1 - caml_string_equal(s1, s2); + } + function caml_bytes_greaterthan(s1, s2){return caml_bytes_lessthan(s2, s1); + } + function caml_gr_make_image(arr){ + var + s = caml_gr_state_get(), + h = arr.length - 1, + w = arr[1].length - 1, + im = s.context.createImageData(w, h); + for(var i = 0; i < h; i++) + for(var j = 0; j < w; j++){ + var c = arr[i + 1][j + 1], o = i * (w * 4) + j * 4; + if(c == - 1){ + im.data[o + 0] = 0; + im.data[o + 1] = 0; + im.data[o + 2] = 0; + im.data[o + 3] = 0; + } + else{ + im.data[o + 0] = c >> 16 & 0xff; + im.data[o + 1] = c >> 8 & 0xff; + im.data[o + 2] = c >> 0 & 0Xff; + im.data[o + 3] = 0xff; + } + } + return im; + } + function Base_int_math_int_popcount(v){ + v = v - (v >>> 1 & 0x55555555); + v = (v & 0x33333333) + (v >>> 2 & 0x33333333); + return (v + (v >>> 4) & 0xF0F0F0F) * 0x1010101 >>> 24; + } + function caml_ml_set_channel_output(chanid, f){ + var chan = caml_ml_channels[chanid]; + chan.output = function(s){f(s);}; + return 0; + } + function caml_read_file_content(name){ + var + name = typeof name == "string" ? caml_string_of_jsbytes(name) : name, + root = resolve_fs_device(name); + if(root.device.exists(root.rest)){ + var + file = root.device.open(root.rest, {rdonly: 1}), + len = file.length(), + buf = new Uint8Array(len); + file.read(0, buf, 0, len); + return caml_string_of_array(buf); + } + caml_raise_no_such_file(caml_jsbytes_of_string(name)); + } + function caml_js_to_float(x){return x;} + function caml_setup_uncaught_exception_handler(){ + var process = globalThis.process; + if(process && process.on) + process.on + ("uncaughtException", + function(err, origin){ + caml_fatal_uncaught_exception(err); + process.exit(2); + }); + else if(globalThis.addEventListener) + globalThis.addEventListener + ("error", + function(event){ + if(event.error) caml_fatal_uncaught_exception(event.error); + }); + } + caml_setup_uncaught_exception_handler(); + globalThis.jsoo_runtime = + {time_now_nanoseconds_since_unix_epoch_or_zero: + time_now_nanoseconds_since_unix_epoch_or_zero, + Base_am_testing: Base_am_testing, + Base_hash_double: Base_hash_double, + Base_hash_string: Base_hash_string, + Base_int_math_int64_pow_stub: Base_int_math_int64_pow_stub, + Base_int_math_int_pow_stub: Base_int_math_int_pow_stub, + Base_int_math_int64_ctz: Base_int_math_int64_ctz, + Base_int_math_nativeint_ctz: Base_int_math_nativeint_ctz, + Base_int_math_int_ctz: Base_int_math_int_ctz, + Base_int_math_int32_ctz: Base_int_math_int32_ctz, + Base_int_math_int64_clz: Base_int_math_int64_clz, + Base_int_math_nativeint_clz: Base_int_math_nativeint_clz, + Base_int_math_int_clz: Base_int_math_int_clz, + Base_int_math_int32_clz: Base_int_math_int32_clz, + Base_caml_exn_is_most_recent_exn: Base_caml_exn_is_most_recent_exn, + Base_clear_caml_backtrace_pos: Base_clear_caml_backtrace_pos, + Base_int_math_int_popcount: Base_int_math_int_popcount, + Base_internalhash_get_hash_value: Base_internalhash_get_hash_value, + Base_internalhash_fold_string: Base_internalhash_fold_string, + Base_internalhash_fold_float: Base_internalhash_fold_float, + Base_internalhash_fold_int: Base_internalhash_fold_int, + Base_internalhash_fold_int64: Base_internalhash_fold_int64, + caml_runtime_events_read_poll: caml_runtime_events_read_poll, + caml_runtime_events_free_cursor: caml_runtime_events_free_cursor, + caml_runtime_events_create_cursor: caml_runtime_events_create_cursor, + caml_runtime_events_resume: caml_runtime_events_resume, + caml_runtime_events_pause: caml_runtime_events_pause, + caml_runtime_events_start: caml_runtime_events_start, + caml_runtime_events_user_resolve: caml_runtime_events_user_resolve, + caml_runtime_events_user_write: caml_runtime_events_user_write, + caml_runtime_events_user_register: caml_runtime_events_user_register, + caml_custom_event_index: caml_custom_event_index, + zstd_decompress: zstd_decompress, + jsoo_effect_not_supported: jsoo_effect_not_supported, + caml_ml_condition_signal: caml_ml_condition_signal, + caml_ml_condition_broadcast: caml_ml_condition_broadcast, + caml_ml_condition_wait: caml_ml_condition_wait, + caml_ml_condition_new: caml_ml_condition_new, + caml_get_continuation_callstack: caml_get_continuation_callstack, + caml_continuation_use_and_update_handler_noexc: + caml_continuation_use_and_update_handler_noexc, + caml_continuation_use_noexc: caml_continuation_use_noexc, + caml_alloc_stack: caml_alloc_stack, + caml_ml_mutex_unlock: caml_ml_mutex_unlock, + caml_ml_mutex_try_lock: caml_ml_mutex_try_lock, + caml_ml_mutex_lock: caml_ml_mutex_lock, + caml_ml_mutex_new: caml_ml_mutex_new, + MlMutex: MlMutex, + caml_lxm_next: caml_lxm_next, + caml_ml_domain_cpu_relax: caml_ml_domain_cpu_relax, + caml_ml_domain_id: caml_ml_domain_id, + caml_domain_spawn: caml_domain_spawn, + caml_domain_id: caml_domain_id, + caml_recommended_domain_count: caml_recommended_domain_count, + caml_ml_domain_set_name: caml_ml_domain_set_name, + caml_ml_domain_unique_token: caml_ml_domain_unique_token, + caml_atomic_exchange: caml_atomic_exchange, + caml_atomic_fetch_add: caml_atomic_fetch_add, + caml_atomic_cas: caml_atomic_cas, + caml_atomic_load: caml_atomic_load, + caml_domain_dls_get: caml_domain_dls_get, + caml_domain_dls_set: caml_domain_dls_set, + caml_domain_dls: caml_domain_dls, + caml_ephe_check_data: caml_ephe_check_data, + caml_ephe_unset_data: caml_ephe_unset_data, + caml_ephe_set_data: caml_ephe_set_data, + caml_ephe_get_data_copy: caml_ephe_get_data_copy, + caml_ephe_get_data: caml_ephe_get_data, + caml_ephe_blit_data: caml_ephe_blit_data, + caml_ephe_blit_key: caml_ephe_blit_key, + caml_ephe_check_key: caml_ephe_check_key, + caml_ephe_get_key_copy: caml_ephe_get_key_copy, + caml_ephe_get_key: caml_ephe_get_key, + caml_weak_set: caml_weak_set, + caml_weak_create: caml_weak_create, + caml_ephe_create: caml_ephe_create, + caml_ephe_unset_key: caml_ephe_unset_key, + caml_ephe_set_key: caml_ephe_set_key, + caml_ephe_data_offset: caml_ephe_data_offset, + caml_ephe_key_offset: caml_ephe_key_offset, + caml_unix_inet_addr_of_string: caml_unix_inet_addr_of_string, + caml_unix_findclose: caml_unix_findclose, + caml_unix_findnext: caml_unix_findnext, + caml_unix_findfirst: caml_unix_findfirst, + caml_unix_rewinddir: caml_unix_rewinddir, + caml_unix_closedir: caml_unix_closedir, + caml_unix_readdir: caml_unix_readdir, + caml_unix_opendir: caml_unix_opendir, + caml_unix_has_symlink: caml_unix_has_symlink, + caml_unix_getpwuid: caml_unix_getpwuid, + caml_unix_getuid: caml_unix_getuid, + caml_unix_unlink: caml_unix_unlink, + caml_unix_readlink: caml_unix_readlink, + caml_unix_symlink: caml_unix_symlink, + caml_unix_rmdir: caml_unix_rmdir, + caml_unix_mkdir: caml_unix_mkdir, + caml_unix_lstat_64: caml_unix_lstat_64, + caml_unix_lstat: caml_unix_lstat, + caml_unix_stat_64: caml_unix_stat_64, + caml_unix_stat: caml_unix_stat, + make_unix_err_args: make_unix_err_args, + caml_unix_isatty: caml_unix_isatty, + caml_unix_filedescr_of_fd: caml_unix_filedescr_of_fd, + caml_unix_cleanup: caml_unix_cleanup, + caml_unix_startup: caml_unix_startup, + caml_unix_mktime: caml_unix_mktime, + caml_unix_localtime: caml_unix_localtime, + caml_unix_gmtime: caml_unix_gmtime, + caml_unix_time: caml_unix_time, + caml_unix_gettimeofday: caml_unix_gettimeofday, + caml_str_initialize: caml_str_initialize, + re_replacement_text: re_replacement_text, + re_partial_match: re_partial_match, + re_string_match: re_string_match, + re_search_backward: re_search_backward, + re_search_forward: re_search_forward, + re_match: re_match, + caml_sys_is_regular_file: caml_sys_is_regular_file, + caml_spacetime_only_works_for_native_code: + caml_spacetime_only_works_for_native_code, + caml_register_channel_for_spacetime: caml_register_channel_for_spacetime, + caml_sys_const_naked_pointers_checked: + caml_sys_const_naked_pointers_checked, + caml_spacetime_enabled: caml_spacetime_enabled, + caml_ml_runtime_warnings_enabled: caml_ml_runtime_warnings_enabled, + caml_ml_enable_runtime_warnings: caml_ml_enable_runtime_warnings, + caml_runtime_warnings: caml_runtime_warnings, + caml_install_signal_handler: caml_install_signal_handler, + caml_runtime_parameters: caml_runtime_parameters, + caml_runtime_variant: caml_runtime_variant, + caml_sys_isatty: caml_sys_isatty, + caml_sys_get_config: caml_sys_get_config, + os_type: os_type, + caml_sys_const_backend_type: caml_sys_const_backend_type, + caml_sys_const_ostype_cygwin: caml_sys_const_ostype_cygwin, + caml_sys_const_ostype_win32: caml_sys_const_ostype_win32, + caml_sys_const_ostype_unix: caml_sys_const_ostype_unix, + caml_sys_const_max_wosize: caml_sys_const_max_wosize, + caml_sys_const_int_size: caml_sys_const_int_size, + caml_sys_const_word_size: caml_sys_const_word_size, + caml_sys_const_big_endian: caml_sys_const_big_endian, + caml_sys_random_seed: caml_sys_random_seed, + caml_sys_time_include_children: caml_sys_time_include_children, + caml_sys_time: caml_sys_time, + caml_sys_system_command: caml_sys_system_command, + caml_sys_executable_name: caml_sys_executable_name, + caml_sys_modify_argv: caml_sys_modify_argv, + caml_sys_argv: caml_sys_argv, + caml_sys_get_argv: caml_sys_get_argv, + caml_executable_name: caml_executable_name, + caml_argv: caml_argv, + caml_sys_unsafe_getenv: caml_sys_unsafe_getenv, + caml_sys_getenv: caml_sys_getenv, + jsoo_sys_getenv: jsoo_sys_getenv, + caml_set_static_env: caml_set_static_env, + caml_fatal_uncaught_exception: caml_fatal_uncaught_exception, + caml_format_exception: caml_format_exception, + caml_is_special_exception: caml_is_special_exception, + caml_sys_exit: caml_sys_exit, + caml_raise_sys_error: caml_raise_sys_error, + caml_maybe_print_stats: caml_maybe_print_stats, + caml_is_printable: caml_is_printable, + caml_get_global_data: caml_get_global_data, + caml_register_global: caml_register_global, + caml_build_symbols: caml_build_symbols, + caml_global_data: caml_global_data, + caml_named_value: caml_named_value, + caml_register_named_value: caml_register_named_value, + caml_named_values: caml_named_values, + caml_call_gen: caml_call_gen, + caml_set_parser_trace: caml_set_parser_trace, + caml_parse_engine: caml_parse_engine, + caml_parser_trace: caml_parser_trace, + caml_is_continuation_tag: caml_is_continuation_tag, + caml_lazy_read_result: caml_lazy_read_result, + caml_lazy_reset_to_lazy: caml_lazy_reset_to_lazy, + caml_lazy_update_to_forward: caml_lazy_update_to_forward, + caml_lazy_update_to_forcing: caml_lazy_update_to_forcing, + caml_obj_update_tag: caml_obj_update_tag, + caml_obj_add_offset: caml_obj_add_offset, + caml_obj_reachable_words: caml_obj_reachable_words, + caml_obj_set_raw_field: caml_obj_set_raw_field, + caml_obj_raw_field: caml_obj_raw_field, + caml_fresh_oo_id: caml_fresh_oo_id, + caml_set_oo_id: caml_set_oo_id, + caml_oo_last_id: caml_oo_last_id, + caml_get_public_method: caml_get_public_method, + caml_lazy_make_forward: caml_lazy_make_forward, + caml_obj_is_shared: caml_obj_is_shared, + caml_obj_compare_and_swap: caml_obj_compare_and_swap, + caml_obj_make_forward: caml_obj_make_forward, + caml_obj_truncate: caml_obj_truncate, + caml_obj_dup: caml_obj_dup, + caml_obj_with_tag: caml_obj_with_tag, + caml_obj_block: caml_obj_block, + caml_obj_set_tag: caml_obj_set_tag, + caml_obj_tag: caml_obj_tag, + caml_obj_is_block: caml_obj_is_block, + caml_alloc_dummy_infix: caml_alloc_dummy_infix, + caml_update_dummy: caml_update_dummy, + deserialize_nat: deserialize_nat, + serialize_nat: serialize_nat, + lxor_digit_nat: lxor_digit_nat, + lor_digit_nat: lor_digit_nat, + land_digit_nat: land_digit_nat, + compare_nat_real: compare_nat_real, + compare_nat: compare_nat, + compare_digits_nat: compare_digits_nat, + shift_right_nat: shift_right_nat, + div_nat: div_nat, + div_digit_nat: div_digit_nat, + div_helper: div_helper, + shift_left_nat: shift_left_nat, + square_nat: square_nat, + mult_nat: mult_nat, + mult_digit_nat: mult_digit_nat, + sub_nat: sub_nat, + decr_nat: decr_nat, + complement_nat: complement_nat, + add_nat: add_nat, + incr_nat: incr_nat, + is_digit_odd: is_digit_odd, + is_digit_zero: is_digit_zero, + is_digit_int: is_digit_int, + num_leading_zero_bits_in_digit: num_leading_zero_bits_in_digit, + num_digits_nat: num_digits_nat, + nth_digit_nat_native: nth_digit_nat_native, + set_digit_nat_native: set_digit_nat_native, + nth_digit_nat: nth_digit_nat, + set_digit_nat: set_digit_nat, + blit_nat: blit_nat, + set_to_zero_nat: set_to_zero_nat, + create_nat: create_nat, + nat_of_array: nat_of_array, + caml_hash_nat: caml_hash_nat, + MlNat: MlNat, + initialize_nat: initialize_nat, + caml_array_of_bytes: caml_array_of_bytes, + caml_array_of_string: caml_array_of_string, + caml_js_to_string: caml_js_to_string, + caml_to_js_string: caml_to_js_string, + caml_js_from_string: caml_js_from_string, + caml_new_string: caml_new_string, + caml_js_to_byte_string: caml_js_to_byte_string, + caml_is_ml_string: caml_is_ml_string, + caml_ml_bytes_content: caml_ml_bytes_content, + caml_is_ml_bytes: caml_is_ml_bytes, + caml_bytes_of_jsbytes: caml_bytes_of_jsbytes, + caml_string_of_jsstring: caml_string_of_jsstring, + caml_jsstring_of_string: caml_jsstring_of_string, + caml_jsbytes_of_string: caml_jsbytes_of_string, + caml_string_of_jsbytes: caml_string_of_jsbytes, + caml_bytes_of_string: caml_bytes_of_string, + caml_string_of_bytes: caml_string_of_bytes, + caml_string_lessthan: caml_string_lessthan, + caml_string_lessequal: caml_string_lessequal, + caml_string_equal: caml_string_equal, + caml_string_compare: caml_string_compare, + caml_ml_string_length: caml_ml_string_length, + caml_string_unsafe_set: caml_string_unsafe_set, + caml_string_unsafe_get: caml_string_unsafe_get, + caml_ml_bytes_length: caml_ml_bytes_length, + caml_blit_string: caml_blit_string, + caml_blit_bytes: caml_blit_bytes, + caml_fill_bytes: caml_fill_bytes, + caml_bytes_greaterthan: caml_bytes_greaterthan, + caml_string_greaterthan: caml_string_greaterthan, + caml_bytes_greaterequal: caml_bytes_greaterequal, + caml_string_greaterequal: caml_string_greaterequal, + caml_bytes_lessthan: caml_bytes_lessthan, + caml_bytes_lessequal: caml_bytes_lessequal, + caml_bytes_notequal: caml_bytes_notequal, + caml_string_notequal: caml_string_notequal, + caml_bytes_equal: caml_bytes_equal, + caml_bytes_compare: caml_bytes_compare, + caml_bytes_of_array: caml_bytes_of_array, + caml_string_of_array: caml_string_of_array, + caml_create_bytes: caml_create_bytes, + caml_create_string: caml_create_string, + caml_uint8_array_of_string: caml_uint8_array_of_string, + caml_uint8_array_of_bytes: caml_uint8_array_of_bytes, + caml_convert_bytes_to_array: caml_convert_bytes_to_array, + caml_convert_string_to_bytes: caml_convert_string_to_bytes, + MlBytes: MlBytes, + caml_bytes_of_utf16_jsstring: caml_bytes_of_utf16_jsstring, + caml_bytes_set: caml_bytes_set, + caml_string_set64: caml_string_set64, + caml_bytes_set64: caml_bytes_set64, + caml_string_set32: caml_string_set32, + caml_bytes_set32: caml_bytes_set32, + caml_string_set16: caml_string_set16, + caml_bytes_set16: caml_bytes_set16, + caml_string_set: caml_string_set, + caml_bytes_get: caml_bytes_get, + caml_bytes_get64: caml_bytes_get64, + caml_string_get64: caml_string_get64, + caml_bytes_get32: caml_bytes_get32, + caml_string_get32: caml_string_get32, + caml_bytes_get16: caml_bytes_get16, + caml_string_get16: caml_string_get16, + caml_string_get: caml_string_get, + caml_bytes_bound_error: caml_bytes_bound_error, + caml_string_bound_error: caml_string_bound_error, + caml_bytes_unsafe_set: caml_bytes_unsafe_set, + caml_bytes_unsafe_get: caml_bytes_unsafe_get, + jsoo_is_ascii: jsoo_is_ascii, + caml_utf16_of_utf8: caml_utf16_of_utf8, + caml_utf8_of_utf16: caml_utf8_of_utf16, + caml_subarray_to_jsbytes: caml_subarray_to_jsbytes, + caml_str_repeat: caml_str_repeat, + caml_md5_bytes: caml_md5_bytes, + caml_MD5Final: caml_MD5Final, + caml_MD5Update: caml_MD5Update, + caml_MD5Init: caml_MD5Init, + caml_MD5Transform: caml_MD5Transform, + caml_md5_string: caml_md5_string, + caml_md5_chan: caml_md5_chan, + caml_output_value_to_buffer: caml_output_value_to_buffer, + caml_output_value_to_bytes: caml_output_value_to_bytes, + caml_output_value_to_string: caml_output_value_to_string, + caml_output_val: caml_output_val, + MlObjectTable: MlObjectTable, + caml_marshal_data_size: caml_marshal_data_size, + caml_marshal_header_size: caml_marshal_header_size, + caml_input_value_from_reader: caml_input_value_from_reader, + caml_custom_ops: caml_custom_ops, + caml_nativeint_unmarshal: caml_nativeint_unmarshal, + caml_int32_unmarshal: caml_int32_unmarshal, + caml_int64_marshal: caml_int64_marshal, + caml_int64_unmarshal: caml_int64_unmarshal, + caml_input_value_from_bytes: caml_input_value_from_bytes, + caml_input_value_from_string: caml_input_value_from_string, + caml_float_of_bytes: caml_float_of_bytes, + BigStringReader: BigStringReader, + MlStringReader: MlStringReader, + UInt8ArrayReader: UInt8ArrayReader, + caml_marshal_constants: caml_marshal_constants, + caml_new_lex_engine: caml_new_lex_engine, + caml_lex_engine: caml_lex_engine, + caml_lex_array: caml_lex_array, + caml_js_error_of_exception: caml_js_error_of_exception, + caml_xmlhttprequest_create: caml_xmlhttprequest_create, + caml_js_get_console: caml_js_get_console, + caml_js_html_entities: caml_js_html_entities, + caml_js_html_escape: caml_js_html_escape, + caml_js_on_ie: caml_js_on_ie, + caml_js_object: caml_js_object, + caml_pure_js_expr: caml_pure_js_expr, + caml_js_expr: caml_js_expr, + caml_js_eval_string: caml_js_eval_string, + caml_js_equals: caml_js_equals, + caml_js_function_arity: caml_js_function_arity, + caml_js_wrap_meth_callback_unsafe: caml_js_wrap_meth_callback_unsafe, + caml_js_wrap_meth_callback_strict: caml_js_wrap_meth_callback_strict, + caml_js_wrap_meth_callback_arguments: + caml_js_wrap_meth_callback_arguments, + caml_js_wrap_meth_callback: caml_js_wrap_meth_callback, + caml_js_wrap_callback_unsafe: caml_js_wrap_callback_unsafe, + caml_js_wrap_callback_strict: caml_js_wrap_callback_strict, + caml_js_wrap_callback_arguments: caml_js_wrap_callback_arguments, + caml_js_wrap_callback: caml_js_wrap_callback, + caml_ojs_new_arr: caml_ojs_new_arr, + caml_js_new: caml_js_new, + caml_js_meth_call: caml_js_meth_call, + caml_js_fun_call: caml_js_fun_call, + caml_js_call: caml_js_call, + caml_js_var: caml_js_var, + caml_list_to_js_array: caml_list_to_js_array, + caml_list_of_js_array: caml_list_of_js_array, + caml_js_to_array: caml_js_to_array, + caml_js_from_array: caml_js_from_array, + caml_js_to_float: caml_js_to_float, + caml_js_from_float: caml_js_from_float, + caml_js_to_bool: caml_js_to_bool, + caml_js_from_bool: caml_js_from_bool, + caml_js_error_option_of_exception: caml_js_error_option_of_exception, + caml_exn_with_js_backtrace: caml_exn_with_js_backtrace, + caml_maybe_attach_backtrace: caml_maybe_attach_backtrace, + caml_wrap_exception: caml_wrap_exception, + caml_jsoo_flags_effects: caml_jsoo_flags_effects, + caml_jsoo_flags_use_js_string: caml_jsoo_flags_use_js_string, + caml_is_js: caml_is_js, + caml_callback: caml_callback, + caml_trampoline_return: caml_trampoline_return, + caml_trampoline: caml_trampoline, + caml_js_typeof: caml_js_typeof, + caml_js_instanceof: caml_js_instanceof, + caml_js_delete: caml_js_delete, + caml_js_get: caml_js_get, + caml_js_set: caml_js_set, + caml_js_pure_expr: caml_js_pure_expr, + caml_ml_set_buffered: caml_ml_set_buffered, + caml_ml_is_buffered: caml_ml_is_buffered, + caml_ml_output_int: caml_ml_output_int, + caml_ml_pos_out_64: caml_ml_pos_out_64, + caml_ml_pos_out: caml_ml_pos_out, + caml_pos_out: caml_pos_out, + caml_ml_seek_out_64: caml_ml_seek_out_64, + caml_ml_seek_out: caml_ml_seek_out, + caml_seek_out: caml_seek_out, + caml_output_value: caml_output_value, + caml_ml_output_char: caml_ml_output_char, + caml_ml_output: caml_ml_output, + caml_ml_output_bytes: caml_ml_output_bytes, + caml_ml_flush: caml_ml_flush, + caml_ml_input_scan_line: caml_ml_input_scan_line, + caml_ml_pos_in_64: caml_ml_pos_in_64, + caml_ml_pos_in: caml_ml_pos_in, + caml_pos_in: caml_pos_in, + caml_ml_seek_in_64: caml_ml_seek_in_64, + caml_ml_seek_in: caml_ml_seek_in, + caml_seek_in: caml_seek_in, + caml_ml_input_int: caml_ml_input_int, + caml_ml_input_char: caml_ml_input_char, + caml_input_value_to_outside_heap: caml_input_value_to_outside_heap, + caml_input_value: caml_input_value, + caml_ml_input_block: caml_ml_input_block, + caml_ml_input: caml_ml_input, + caml_refill: caml_refill, + caml_ml_set_channel_refill: caml_ml_set_channel_refill, + caml_ml_set_channel_output: caml_ml_set_channel_output, + caml_ml_channel_size_64: caml_ml_channel_size_64, + caml_ml_channel_size: caml_ml_channel_size, + caml_ml_close_channel: caml_ml_close_channel, + caml_ml_set_binary_mode: caml_ml_set_binary_mode, + caml_channel_descriptor: caml_channel_descriptor, + caml_ml_open_descriptor_in: caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out: caml_ml_open_descriptor_out, + caml_ml_out_channels_list: caml_ml_out_channels_list, + caml_ml_channels: caml_ml_channels, + caml_ml_set_channel_name: caml_ml_set_channel_name, + caml_sys_open: caml_sys_open, + caml_sys_close: caml_sys_close, + caml_sys_fds: caml_sys_fds, + caml_int64_bswap: caml_int64_bswap, + caml_int32_bswap: caml_int32_bswap, + caml_bswap16: caml_bswap16, + caml_mod: caml_mod, + caml_div: caml_div, + caml_mul: caml_mul, + caml_int_of_string: caml_int_of_string, + caml_parse_digit: caml_parse_digit, + caml_parse_sign_and_base: caml_parse_sign_and_base, + caml_format_int: caml_format_int, + caml_int64_hash: caml_int64_hash, + caml_int64_to_bytes: caml_int64_to_bytes, + caml_int64_of_bytes: caml_int64_of_bytes, + caml_int64_hi32: caml_int64_hi32, + caml_int64_lo32: caml_int64_lo32, + caml_int64_create_lo_hi: caml_int64_create_lo_hi, + caml_int64_create_lo_mi_hi: caml_int64_create_lo_mi_hi, + caml_int64_of_string: caml_int64_of_string, + caml_int64_format: caml_int64_format, + caml_int64_of_float: caml_int64_of_float, + caml_int64_to_float: caml_int64_to_float, + caml_int64_to_int32: caml_int64_to_int32, + caml_int64_of_int32: caml_int64_of_int32, + caml_int64_mod: caml_int64_mod, + caml_int64_div: caml_int64_div, + caml_int64_shift_right: caml_int64_shift_right, + caml_int64_shift_right_unsigned: caml_int64_shift_right_unsigned, + caml_int64_shift_left: caml_int64_shift_left, + caml_int64_xor: caml_int64_xor, + caml_int64_or: caml_int64_or, + caml_int64_and: caml_int64_and, + caml_int64_is_negative: caml_int64_is_negative, + caml_int64_is_zero: caml_int64_is_zero, + caml_int64_mul: caml_int64_mul, + caml_int64_sub: caml_int64_sub, + caml_int64_add: caml_int64_add, + caml_int64_neg: caml_int64_neg, + caml_int64_compare: caml_int64_compare, + caml_int64_ult: caml_int64_ult, + MlInt64: MlInt64, + caml_int64_offset: caml_int64_offset, + caml_float_of_string: caml_float_of_string, + caml_format_float: caml_format_float, + caml_fma_float: caml_fma_float, + caml_erfc_float: caml_erfc_float, + caml_erf_float: caml_erf_float, + caml_cbrt_float: caml_cbrt_float, + caml_round_float: caml_round_float, + caml_atanh_float: caml_atanh_float, + caml_tanh_float: caml_tanh_float, + caml_asinh_float: caml_asinh_float, + caml_sinh_float: caml_sinh_float, + caml_acosh_float: caml_acosh_float, + caml_cosh_float: caml_cosh_float, + caml_log10_float: caml_log10_float, + caml_hypot_float: caml_hypot_float, + caml_log2_float: caml_log2_float, + caml_log1p_float: caml_log1p_float, + caml_exp2_float: caml_exp2_float, + caml_expm1_float: caml_expm1_float, + caml_signbit_float: caml_signbit_float, + caml_copysign_float: caml_copysign_float, + caml_float_compare: caml_float_compare, + caml_frexp_float: caml_frexp_float, + caml_ldexp_float: caml_ldexp_float, + caml_modf_float: caml_modf_float, + caml_classify_float: caml_classify_float, + caml_int32_float_of_bits: caml_int32_float_of_bits, + caml_trunc_float: caml_trunc_float, + caml_nextafter_float: caml_nextafter_float, + caml_int64_float_of_bits: caml_int64_float_of_bits, + caml_hexstring_of_float: caml_hexstring_of_float, + caml_int32_bits_of_float: caml_int32_bits_of_float, + caml_int64_bits_of_float: caml_int64_bits_of_float, + jsoo_floor_log2: jsoo_floor_log2, + caml_string_hash: caml_string_hash, + caml_hash: caml_hash, + caml_hash_mix_string: caml_hash_mix_string, + caml_hash_mix_bytes: caml_hash_mix_bytes, + caml_hash_mix_bytes_arr: caml_hash_mix_bytes_arr, + caml_hash_mix_jsbytes: caml_hash_mix_jsbytes, + caml_hash_mix_int64: caml_hash_mix_int64, + caml_hash_mix_float: caml_hash_mix_float, + caml_hash_mix_final: caml_hash_mix_final, + caml_hash_mix_int: caml_hash_mix_int, + caml_gr_close_subwindow: caml_gr_close_subwindow, + caml_gr_open_subwindow: caml_gr_open_subwindow, + caml_gr_window_id: caml_gr_window_id, + caml_gr_display_mode: caml_gr_display_mode, + caml_gr_remember_mode: caml_gr_remember_mode, + caml_gr_synchronize: caml_gr_synchronize, + caml_gr_wait_event: caml_gr_wait_event, + caml_gr_sigio_signal: caml_gr_sigio_signal, + caml_gr_sigio_handler: caml_gr_sigio_handler, + caml_gr_blit_image: caml_gr_blit_image, + caml_gr_create_image: caml_gr_create_image, + caml_gr_draw_image: caml_gr_draw_image, + caml_gr_dump_image: caml_gr_dump_image, + caml_gr_make_image: caml_gr_make_image, + caml_gr_text_size: caml_gr_text_size, + caml_gr_set_text_size: caml_gr_set_text_size, + caml_gr_set_font: caml_gr_set_font, + caml_gr_draw_string: caml_gr_draw_string, + caml_gr_draw_char: caml_gr_draw_char, + caml_gr_draw_str: caml_gr_draw_str, + caml_gr_fill_arc: caml_gr_fill_arc, + caml_gr_fill_poly: caml_gr_fill_poly, + caml_gr_fill_rect: caml_gr_fill_rect, + caml_gr_set_line_width: caml_gr_set_line_width, + caml_gr_draw_arc: caml_gr_draw_arc, + caml_gr_arc_aux: caml_gr_arc_aux, + caml_gr_draw_rect: caml_gr_draw_rect, + caml_gr_lineto: caml_gr_lineto, + caml_gr_current_y: caml_gr_current_y, + caml_gr_current_x: caml_gr_current_x, + caml_gr_moveto: caml_gr_moveto, + caml_gr_point_color: caml_gr_point_color, + caml_gr_plot: caml_gr_plot, + caml_gr_set_color: caml_gr_set_color, + caml_gr_size_y: caml_gr_size_y, + caml_gr_size_x: caml_gr_size_x, + caml_gr_clear_graph: caml_gr_clear_graph, + caml_gr_resize_window: caml_gr_resize_window, + caml_gr_set_window_title: caml_gr_set_window_title, + caml_gr_close_graph: caml_gr_close_graph, + caml_gr_doc_of_state: caml_gr_doc_of_state, + caml_gr_state_create: caml_gr_state_create, + caml_gr_state_init: caml_gr_state_init, + caml_gr_open_graph: caml_gr_open_graph, + caml_gr_state_set: caml_gr_state_set, + caml_gr_state_get: caml_gr_state_get, + caml_gr_state: caml_gr_state, + caml_get_major_credit: caml_get_major_credit, + caml_get_major_bucket: caml_get_major_bucket, + caml_get_minor_free: caml_get_minor_free, + caml_gc_minor_words: caml_gc_minor_words, + caml_gc_major_slice: caml_gc_major_slice, + caml_gc_huge_fallback_count: caml_gc_huge_fallback_count, + caml_eventlog_pause: caml_eventlog_pause, + caml_eventlog_resume: caml_eventlog_resume, + caml_memprof_stop: caml_memprof_stop, + caml_memprof_start: caml_memprof_start, + caml_final_release: caml_final_release, + caml_final_register_called_without_value: + caml_final_register_called_without_value, + caml_final_register: caml_final_register, + caml_memprof_set: caml_memprof_set, + caml_gc_get: caml_gc_get, + caml_gc_set: caml_gc_set, + caml_gc_stat: caml_gc_stat, + caml_gc_quick_stat: caml_gc_quick_stat, + caml_gc_counters: caml_gc_counters, + caml_gc_compaction: caml_gc_compaction, + caml_gc_full_major: caml_gc_full_major, + caml_gc_major: caml_gc_major, + caml_gc_minor: caml_gc_minor, + caml_sys_open_for_node: caml_sys_open_for_node, + MlNodeFd: MlNodeFd, + MlNodeDevice: MlNodeDevice, + fs_node_supported: fs_node_supported, + MlFakeFd: MlFakeFd, + MlFakeFd_out: MlFakeFd_out, + MlFakeFile: MlFakeFile, + MlFakeDevice: MlFakeDevice, + caml_read_file_content: caml_read_file_content, + jsoo_create_file: jsoo_create_file, + caml_create_file: caml_create_file, + caml_fs_init: caml_fs_init, + jsoo_create_file_extern: jsoo_create_file_extern, + caml_ba_map_file_bytecode: caml_ba_map_file_bytecode, + caml_ba_map_file: caml_ba_map_file, + caml_sys_rmdir: caml_sys_rmdir, + caml_sys_mkdir: caml_sys_mkdir, + caml_sys_rename: caml_sys_rename, + caml_sys_is_directory: caml_sys_is_directory, + caml_sys_remove: caml_sys_remove, + caml_sys_read_directory: caml_sys_read_directory, + caml_sys_file_exists: caml_sys_file_exists, + caml_raise_not_a_dir: caml_raise_not_a_dir, + caml_raise_no_such_file: caml_raise_no_such_file, + caml_sys_chdir: caml_sys_chdir, + caml_sys_getcwd: caml_sys_getcwd, + caml_unmount: caml_unmount, + caml_mount_autoload: caml_mount_autoload, + resolve_fs_device: resolve_fs_device, + caml_list_mount_point: caml_list_mount_point, + jsoo_mount_point: jsoo_mount_point, + caml_make_path: caml_make_path, + path_is_absolute: path_is_absolute, + MlFile: MlFile, + caml_root: caml_root, + caml_get_root: caml_get_root, + caml_current_dir: caml_current_dir, + caml_trailing_slash: caml_trailing_slash, + caml_finish_formatting: caml_finish_formatting, + caml_parse_format: caml_parse_format, + caml_array_bound_error: caml_array_bound_error, + caml_raise_not_found: caml_raise_not_found, + caml_raise_zero_divide: caml_raise_zero_divide, + caml_raise_end_of_file: caml_raise_end_of_file, + caml_invalid_argument: caml_invalid_argument, + caml_failwith: caml_failwith, + caml_raise_with_string: caml_raise_with_string, + caml_raise_with_args: caml_raise_with_args, + caml_raise_with_arg: caml_raise_with_arg, + caml_raise_constant: caml_raise_constant, + caml_lessthan: caml_lessthan, + caml_lessequal: caml_lessequal, + caml_greaterthan: caml_greaterthan, + caml_greaterequal: caml_greaterequal, + caml_notequal: caml_notequal, + caml_equal: caml_equal, + caml_int_compare: caml_int_compare, + caml_compare: caml_compare, + caml_compare_val: caml_compare_val, + caml_compare_val_number_custom: caml_compare_val_number_custom, + caml_compare_val_get_custom: caml_compare_val_get_custom, + caml_compare_val_tag: caml_compare_val_tag, + caml_bigstring_blit_ba_to_bytes: caml_bigstring_blit_ba_to_bytes, + caml_bigstring_blit_bytes_to_ba: caml_bigstring_blit_bytes_to_ba, + caml_bigstring_blit_string_to_ba: caml_bigstring_blit_string_to_ba, + caml_bigstring_blit_ba_to_ba: caml_bigstring_blit_ba_to_ba, + caml_bigstring_memcmp: caml_bigstring_memcmp, + bigstring_of_typed_array: bigstring_of_typed_array, + bigstring_of_array_buffer: bigstring_of_array_buffer, + bigstring_to_typed_array: bigstring_to_typed_array, + bigstring_to_array_buffer: bigstring_to_array_buffer, + caml_hash_mix_bigstring: caml_hash_mix_bigstring, + caml_ba_from_typed_array: caml_ba_from_typed_array, + caml_ba_kind_of_typed_array: caml_ba_kind_of_typed_array, + caml_ba_to_typed_array: caml_ba_to_typed_array, + caml_ba_hash: caml_ba_hash, + caml_ba_create_from: caml_ba_create_from, + caml_ba_deserialize: caml_ba_deserialize, + caml_ba_serialize: caml_ba_serialize, + caml_ba_reshape: caml_ba_reshape, + caml_ba_slice: caml_ba_slice, + caml_ba_sub: caml_ba_sub, + caml_ba_blit: caml_ba_blit, + caml_ba_fill: caml_ba_fill, + caml_ba_set_3: caml_ba_set_3, + caml_ba_set_2: caml_ba_set_2, + caml_ba_set_1: caml_ba_set_1, + caml_ba_uint8_set64: caml_ba_uint8_set64, + caml_ba_uint8_set32: caml_ba_uint8_set32, + caml_ba_uint8_set16: caml_ba_uint8_set16, + caml_ba_set_generic: caml_ba_set_generic, + caml_ba_get_3: caml_ba_get_3, + caml_ba_get_2: caml_ba_get_2, + caml_ba_get_1: caml_ba_get_1, + caml_ba_uint8_get64: caml_ba_uint8_get64, + caml_ba_uint8_get32: caml_ba_uint8_get32, + caml_ba_uint8_get16: caml_ba_uint8_get16, + caml_ba_get_generic: caml_ba_get_generic, + caml_ba_dim_3: caml_ba_dim_3, + caml_ba_dim_2: caml_ba_dim_2, + caml_ba_dim_1: caml_ba_dim_1, + caml_ba_dim: caml_ba_dim, + caml_ba_num_dims: caml_ba_num_dims, + caml_ba_layout: caml_ba_layout, + caml_ba_kind: caml_ba_kind, + caml_ba_change_layout: caml_ba_change_layout, + caml_ba_create: caml_ba_create, + caml_ba_create_unsafe: caml_ba_create_unsafe, + caml_ba_compare: caml_ba_compare, + Ml_Bigarray_c_1_1: Ml_Bigarray_c_1_1, + Ml_Bigarray: Ml_Bigarray, + caml_ba_custom_name: caml_ba_custom_name, + caml_ba_create_buffer: caml_ba_create_buffer, + caml_ba_get_size_per_element: caml_ba_get_size_per_element, + caml_ba_get_size: caml_ba_get_size, + caml_ba_init: caml_ba_init, + caml_convert_raw_backtrace_slot: caml_convert_raw_backtrace_slot, + caml_get_current_callstack: caml_get_current_callstack, + caml_restore_raw_backtrace: caml_restore_raw_backtrace, + caml_raw_backtrace_slot: caml_raw_backtrace_slot, + caml_raw_backtrace_next_slot: caml_raw_backtrace_next_slot, + caml_raw_backtrace_length: caml_raw_backtrace_length, + caml_convert_raw_backtrace: caml_convert_raw_backtrace, + caml_record_backtrace: caml_record_backtrace, + caml_get_exception_raw_backtrace: caml_get_exception_raw_backtrace, + caml_get_exception_backtrace: caml_get_exception_backtrace, + caml_backtrace_status: caml_backtrace_status, + caml_ml_debug_info_status: caml_ml_debug_info_status, + caml_record_backtrace_flag: caml_record_backtrace_flag, + caml_floatarray_create: caml_floatarray_create, + caml_make_float_vect: caml_make_float_vect, + caml_make_vect: caml_make_vect, + caml_check_bound: caml_check_bound, + caml_array_fill: caml_array_fill, + caml_array_get: caml_array_get, + caml_array_set: caml_array_set, + caml_floatarray_blit: caml_floatarray_blit, + caml_array_blit: caml_array_blit, + caml_array_concat: caml_array_concat, + caml_array_append: caml_array_append, + caml_array_sub: caml_array_sub}; + var + cst_Assert_failure = "Assert_failure", + cst_Division_by_zero = "Division_by_zero", + cst_End_of_file = "End_of_file", + cst_Failure = "Failure", + cst_Invalid_argument = "Invalid_argument", + cst_Match_failure = "Match_failure", + cst_Not_found = "Not_found", + cst_Out_of_memory = "Out_of_memory", + cst_Stack_overflow = "Stack_overflow", + cst_Sys_blocked_io = "Sys_blocked_io", + cst_Sys_error = "Sys_error", + cst_Undefined_recursive_module = "Undefined_recursive_module"; + caml_fs_init(); + caml_register_global(0, [248, cst_Out_of_memory, -1], cst_Out_of_memory); + caml_register_global(1, [248, cst_Sys_error, -2], cst_Sys_error); + caml_register_global(2, [248, cst_Failure, -3], cst_Failure); + caml_register_global + (3, [248, cst_Invalid_argument, -4], cst_Invalid_argument); + caml_register_global(4, [248, cst_End_of_file, -5], cst_End_of_file); + caml_register_global + (5, [248, cst_Division_by_zero, -6], cst_Division_by_zero); + caml_register_global(6, [248, cst_Not_found, -7], cst_Not_found); + caml_register_global(7, [248, cst_Match_failure, -8], cst_Match_failure); + caml_register_global(8, [248, cst_Stack_overflow, -9], cst_Stack_overflow); + caml_register_global(9, [248, cst_Sys_blocked_io, -10], cst_Sys_blocked_io); + caml_register_global + (10, [248, cst_Assert_failure, -11], cst_Assert_failure); + caml_register_global + (11, + [248, cst_Undefined_recursive_module, -12], + cst_Undefined_recursive_module); + return; + } + (globalThis)); + + +(function(a){"use strict";var +dC="Fmlib_browser__Attribute",dB="Js_of_ocaml__EventSource",hf=271,hg="Base__String0",dz="Sexplib0",dA="Fmlib_browser__Task",hd=151,he=273,dy="Stdlib__Seq",dv="Base__Container_intf",dw="Js_of_ocaml__Url",dx="Base__List1",hc="Base__Blit_intf",dt=158,du=272,hb="Base__Binary_searchable",dr="Base__Map_intf",ds="Base__Int32",dq="Base__Hashable",dp="Stdlib__BytesLabels",dn=115,dm="Base__Equal",ha="Sexplib0__Sexp_conv",dl="Base__Int_intf",g9="Fmlib_std__Array",g_="Ppx_compare_lib",g$=239,g8=221,dk="Fmlib_std__Void",di="Stdlib__Printf",dj=299,g4=261,g5=241,g6=105,g7="Base__Comparable",dg="Ppx_inline_test_lib__Runtime",dh=102,g2="CamlinternalLazy",g3="Js_of_ocaml__Dom_svg",de="Stdlib__String",df=152,gZ="Sexplib0__Sexp",g0=213,g1=150,dd="Stdlib__Result",gX="Base__Linked_queue",gY=212,gV="Fmlib_std__Btree",gW=179,da=266,db="Base__Invariant_intf",dc="Base__Pretty_printer",c_="Js_of_ocaml__Import",c$=287,gU=247,c8="Base__Monad_intf",c9=167,gS="Stdlib__Random",gT="Base__Int63_emul",gQ=116,gR=161,c7="Base__Word_size",gO="Fmlib_browser__Time",gP=126,c6="Failure",gM="Stdlib__Oo",gN="Base__Sexp_with_comparable",gL=121,gJ="Base__Applicative_intf",gK="Base__Nothing",c3="CamlinternalOO",c4=214,c5=195,cZ="Stdlib__Array",c0=256,c1="Fmlib_browser__Event_flag",c2="Base__Uchar",gI="Base__Linked_queue0",cY="Fmlib_js__Event_target",cX="Base__Int64",gH=111,cW=293,gF=201,gG="Base__Comparable_intf",cV="Base__Import",gE=270,cU="Fmlib_std__Option",gC="Stdlib__Lazy",gD="Inline_test_config",cR="Stdlib__Map",cS="Stdlib__Char",cT=148,cP=193,cQ="Stdlib__Ephemeron",gA=252,gB="Base__Buffer_intf",cO="Base__List0",cN=259,gz="Fmlib_browser__Subscription",cL="Stdlib__In_channel",cM="Base__Int_math",gx="Stdlib",gy="Base__Map",gw="Base__Floatable",cK="Base__Sign",gv=125,cJ=211,gu="Base__Intable",cI=219,gt="Js_of_ocaml__Geolocation",cH=240,gq="Stdlib__Bytes",gr="Base__Ordered_collection_common0",gs=103,cG=178,gn="Stdlib__Unit",go="Stdlib__Option",gp="Js_of_ocaml__IntersectionObserver",cF="Base__Stringable",gl="Base__Unit",gm="Base__Set",cC=301,cD=297,cE=202,gj="Base__Or_error",gk=170,cA="Stdlib__Complex",cB="Stdlib__StdLabels",gi="Stdlib__Float",cz=295,gf="Js_of_ocaml__WebGL",gg="Base__Ordered_collection_common",gh="Base__Bytes",ge="Assert_failure",cy="Base__Info",gc="Base__Variant",gd="Base__Char",cx="Base__Hashable_intf",ga="Base__Stack_intf",gb=224,cw=145,cu=260,cv=204,ct="Js_of_ocaml__Worker",f$=222,cp=257,cq="Base__Result",cr="Std_exit",cs="Base__Sexpable",f8=123,f9=191,f_="Stdlib__MoreLabels",f7="Base__Ppx_enumerate_lib",f6="Fmlib_std__Deque",f5=281,f4="Base__Bytes_tr",f3="Stdlib__Obj",f2=249,co="Js_of_ocaml__Json",f1=248,fY="Sexplib0__",fZ=231,f0="Base",ck="Jsoo_runtime__",cl="CamlinternalMod",cm="Base__Error",cn="Base__Array_permute",cj="Base__Formatter",fX=133,ci=138,fU=277,fV="Js_of_ocaml__Js",fW=187,ch="Base__Hex_lexer",cf="Stdlib__Bigarray",cg=104,fT=253,ce=128,cb="Invalid_argument",cc="Fmlib_browser__Dictionary",cd="Fmlib_browser__Subscriptions",fS=122,ca=113,fR=106,fQ="Base__Uniform_array",b_=278,b$="Stdlib__Scanf",fP=119,b8="Base__Ppx_compare_lib",b9="Fmlib_browser__Random",fO="Fmlib_std__Interfaces",fN="Js_of_ocaml__Dom_html",fM="Base__Float",fL="Js_of_ocaml__",b4="Stdlib__Bool",b5="Division_by_zero",b6=292,b7="Base__Hash_set_intf",fJ=258,fK=101,b3=185,fI=199,b2="Base__Uchar0",fH=274,b1=140,fG=169,bZ=223,b0=208,fF="Stdlib__Domain",fD=175,fE="Base__Char0",bX=130,bY=242,fA="Stdlib__Mutex",fB=117,fC="Base__Sys0",fz="Fmlib_js__Dom",bW=107,fy=127,bU="Stdlib__StringLabels",bV="Base__Ordering",fw=114,fx="CamlinternalFormatBasics",bS="Js_of_ocaml__XmlHttpRequest",bT=244,bR=229,fu="Stdlib__Uchar",fv="Base__Queue",bQ=184,ft=153,bP=124,fr=109,fs=283,bL="Sys_error",bM=302,bN="Fmlib_browser__Command",bO="Base__Identifiable_intf",fq="Base__Binary_searchable_intf",bK="Ppx_hash_lib",fn="Stdlib__Lexing",fo="CamlinternalFormat",fp=171,bJ="Base__Blit",bI="Stdlib__Int",bG="Js_of_ocaml__Jstable",bH="Base__Field",fl=188,fm="End_of_file",bD="Base__Either0",bE=263,bF="Base__Hash_intf",fi=286,fj="Base__Hash_set",fk=251,bB=142,bC="Base__String",fh="Base__Avltree",bA="Fmlib_browser__Vdom",ff="Stack_overflow",fg="Base__Poly0",bz="Stdlib__Nativeint",by="Base__Monad",fe="Base__Pow_overflow_bounds",bx="Base__Int0",fc=118,fd="Base__Hashtbl",bw=216,bv="Js_of_ocaml__File",fb="Fmlib_browser",bu=282,fa="Stdlib__Fun",bs=159,bt=289,e_="Base__Sys",e$=149,e8=269,e9="Stdlib__Weak",e7="Fmlib_std__List",bq=238,br=132,e6=197,bp=176,e5="Base__Maybe_bound",bn="Stdlib__ArrayLabels",bo="Base__Binary_search",e4="Stdlib__Buffer",bl=144,bm="Js_of_ocaml__ResizeObserver",bj="Fmlib_std__String",bk="Base__Set_intf",bi="Base__Ppx_hash_lib",e3=290,bg="Stdlib__Out_channel",bh="Base__T",e2="Base__Fieldslib",bf="Base__",bb="Stdlib__Either",bc=183,bd=129,be=165,a$=215,ba=146,eZ="Fmlib_browser__Browser",e0=225,e1=182,a_="Base__Indexed_container",eY="Base__Bytes0",a9="Base__Sexp",eX="Stdlib__Sys",a7="Base__Queue_intf",a8="Base__Obj_array",eW=255,eV="Ppx_sexp_conv_lib",a5="Fmlib_js__Base",a6=235,eU=228,a4=163,eT="Base__Array0",eS=220,a3=168,a2=164,aY="Js_of_ocaml__Dom",aZ=218,a0="Fmlib_browser__Url",a1=205,eR="Fmlib_browser__Handler",aW="Fmlib_std__Int",aX=139,aU="Not_found",aV="Base__Lazy",eP="Sexplib0__Sexp_conv_grammar",eQ=254,aR="Js_of_ocaml__PerformanceObserver",aS="Base__Source_code_position",aT=246,aQ="Base__Int63",aP="Base__Option",eO="Stdlib__Digest",aN="Temperature",aO=233,eN="Stdlib__Callback",aM="Js_of_ocaml__Form",eM=294,aL=262,aK=276,aI="Base__Random_repr",aJ="Base__List",eL=134,aG="Stdlib__Printexc",aH=296,eK=131,eJ=196,aF=206,eI="Fmlib_js__Event",eG="Js_of_ocaml__CSS",eH=190,aC="Js_of_ocaml__Lib_version",aD=288,aE="Base__Container",eD="Js_of_ocaml__Typed_array",eE=194,eF="Base__Hash",aA="Base__Option_array",aB=236,az=298,eC="Base__Applicative",aw="Out_of_memory",ax=268,ay="Base__Identifiable",eB=177,at="Shadow_stdlib",au="Js_of_ocaml__Intl",av="Base__Sign0",aq="Js_of_ocaml__Sys_js",ar=267,as="Base__Int_conversions",eA=173,an="Base__With_return",ao=203,ap="Base__Bool",al="Stdlib__Filename",am="Base__Info_intf",ez="Stdlib__Semaphore",ai=156,aj="Js_of_ocaml__MutationObserver",ak="Base__Popcount",ey="Stdlib__Marshal",ag=280,ah="Base__Staged",ex="Js_of_ocaml__Regexp",ew="Stdlib__Set",af="Base__Exn",ae="Js_of_ocaml__Dom_events",ad="Sys_blocked_io",et="Base__Comparator",eu=275,ev="Base__Stack",es=110,er=217,eq="Fmlib_js__Date",ac="Base__Source_code_position0",eo="Stdlib__Queue",ep=143,$="Stdlib__Parsing",aa=198,ab="Fmlib_browser__",_="Fmlib_std__Rb_array",Y=210,Z=285,em=112,en="Base__Array",X=227,el="Base__Hasher",ek="Js_of_ocaml",W="Base__Int",U="Stdlib__Condition",V="Fmlib_browser__Assert_failure",ei="Ppx_enumerate_lib",ej=209,eh="Fmlib_js__Timer",eg=291,T=174,R=230,S="Sexplib0__Sexp_conv_error",ee="Caml",ef=237,Q="Fmlib_std__",ed="Fmlib_std__Result",O="Stdlib__Format",P="Base__Fn",eb="Match_failure",ec="Fmlib_js__Web_worker",d9=147,d_=192,d$="Base__Float0",ea="Base__Either",N=166,M="Sexplib0__Sexp_grammar",d8="Base__Invariant",d7=154,L="Base__Either_intf",J="Jsoo_runtime",K=172,H="Stdlib__Effect",I="Fmlib_js__Http_request",d6=186,G="Ppx_inline_test_lib",F=245,d3="Js_of_ocaml__Firebug",d4="Base__Buffer",d5="Base__Backtrace",D="Base__Variantslib",E=226,d2="Base__Nativeint",C="Base__Sign_or_nan",d1=120,B="Stdlib__Arg",dZ="Base__Import0",d0="Base__Indexed_container_intf",A=207,w=135,x=155,y="Jsoo_runtime__Runtime_version",z=136,dX="Stdlib__List",dY="Base__Sequence",dW="Stdlib__Atomic",v=100,dV=157,u=232,dU="Sexplib0__Sexpable",t=162,dT="Stdlib__Int64",dR="Base__Comparisons",dS=300,r=180,s=284,dQ="Fmlib_js__",q=189,dP="Stdlib__Gc",p=250,m="Base__Printf",n="Stdlib__ListLabels",o="Stdlib__Hashtbl",k="Base_internalhash_types",l="Base__Hashtbl_intf",dN="Stdlib__Int32",dO="Base__Random",dM=137,i="Base__Type_equal",j=234,dK=264,dL="Stdlib__Stack",g=279,h=141,dF="Js_of_ocaml__WebSockets",dG=108,dH="Jane_street_headers",dI="Base__Ref",dJ=243,e=160,f=200,dD="Undefined_recursive_module",dE=265,c="Time_now",d=181,hh=a.jsoo_runtime,b=hh.caml_get_global_data();b.prim_count=867;var +hi=[2,f0],hj=[2,eC],hk=[2,en],hl=[0,0,[2,fh],aT,[0,0,[2,d5],eQ,0,1],2],hm=[2,cn],hn=[0,0,[2,bJ],q,0,1],ho=[2,fq],hp=[0,0,[2,hb],fW,0,1],hq=[0,0,[2,gh],b0,0,1],hr=[2,gB],hs=[0,0,[2,ap],bY,[0,0,[2,d4],fT,0,1],2],ht=[2,gd],hu=[0,0,[2,f4],a1,0,1],hv=[2,gG],hw=[0,0,[2,g7],eB,0,1],hx=[2,aE],hy=[2,ea],hz=[0,0,[2,cm],K,0,1],hA=[2,dm],hB=[0,0,[2,L],eH,0,1],hC=[0,0,[2,P],c9,0,1],hD=[2,gw],hE=[0,[0,0,[2,bH],df,[0,0,[2,e2],fk,0,1],2],[2,fM],p,[0,0,[2,d$],cE,0,1],3],hF=[0,[0,[0,0,[2,fj],f2,0,1],[2,b7],f1,0,2],[2,dq],gW,0,3],hG=[2,bF],hH=[0,0,[2,eF],br,0,1],hI=[0,[0,0,[2,ay],e1,0,1],[2,bO],d,[0,0,[2,cV],z,0,1],2],hJ=[2,ch],hK=[0,0,[2,el],X,[0,[0,0,[2,fd],gU,0,1],[2,l],F,0,2],3],hL=[2,d0],hM=[0,0,[2,a_],c5,0,1],hN=[0,0,[2,W],er,0,1],hO=[2,am],hP=[0,0,[2,cX],cH,0,1],hQ=[2,gT],hR=[0,0,[2,ds],dJ,[0,0,[2,aQ],bT,0,1],2],hS=[0,0,[2,d8],eA,0,1],hT=[2,gu],hU=[0,0,[2,dl],gY,[0,0,[2,cM],c4,0,1],2],hV=[0,0,[2,gX],g$,0,1],hW=[2,aV],hX=[2,aJ],hY=[0,[0,0,[2,gy],ef,0,1],[2,dr],bR,0,2],hZ=[2,dx],h0=[2,by],h1=[2,a8],h2=[0,[0,0,[2,d2],aB,0,1],[2,gK],a6,0,2],h3=[2,aA],h4=[2,gg],h5=[2,bV],h6=[2,ak],h7=[2,f7],h8=[2,dc],h9=[2,dO],h_=[0,[0,0,[2,fv],j,0,1],[2,a7],aO,0,2],h$=[2,dI],ia=[2,bk],ib=[0,0,[2,gm],fZ,0,1],ic=[0,[0,0,[2,C],e0,0,1],[2,aS],gb,0,2],id=[2,av],ie=[0,[0,0,[2,gN],E,0,1],[2,cs],d_,[0,0,[2,cK],bw,0,1],2],ig=[0,0,[2,bC],A,0,1],ih=[2,ah],ii=[0,[0,0,[2,ev],bZ,0,1],[2,ga],g8,0,2],ij=[2,cF],ik=[0,0,[2,b2],f,0,1],il=[2,c2],im=[0,[0,0,[2,bh],eS,0,1],[2,i],cI,0,2],io=[2,gl],ip=[2,D],iq=[2,c7],ir=[2,ee],is=[2,fx],it=[2,c3],iu=[0,0,[2,cl],64,0,1],iv=[2,fm],iw=[0,[0,0,[2,eZ],dj,0,1],[2,bN],az,0,2],ix=[2,dC],iy=[0,[0,0,[2,fb],dS,0,1],[2,ab],Z,[0,0,[2,V],cW,0,1],2],iz=[0,[0,0,[2,b9],eM,0,1],[2,gz],aH,[0,[0,0,[2,cd],cD,0,1],[2,dA],cz,0,2],3],iA=[2,eR],iB=[0,0,[2,c1],c$,0,1],iC=[2,dQ],iD=[0,0,[2,a0],bt,[0,0,[2,bA],b6,0,1],2],iE=[2,eI],iF=[0,[0,0,[2,eq],s,0,1],[2,fz],fs,0,2],iG=[0,0,[2,ec],f5,0,1],iH=[2,eh],iI=[0,0,[2,I],bu,0,1],iJ=[2,f6],iK=[0,0,[2,gV],eu,0,1],iL=[0,0,[2,dk],dE,[0,0,[2,gD],es,0,1],2],iM=[2,bj],iN=[0,[0,[0,0,[2,e7],he,0,1],[2,cU],gE,[0,0,[2,_],du,0,1],2],[2,ed],ax,0,3],iO=[0,0,[2,eG],fK,0,1],iP=[2,fL],iQ=[0,[0,0,[2,dH],c0,0,1],[2,ek],fr,0,2],iR=[0,0,[2,g3],gs,[0,0,[2,dB],cg,0,1],2],iS=[2,fN],iT=[0,0,[2,ae],dh,0,1],iU=[0,0,[2,gt],fR,0,1],iV=[2,aM],iW=[0,0,[2,d3],g6,0,1],iX=[0,[0,0,[2,co],v,0,1],[2,bG],99,0,2],iY=[2,fV],iZ=[0,0,[2,gp],bW,[0,0,[2,au],dG,0,1],2],i0=[2,aR],i1=[0,0,[2,aj],98,0,1],i2=[2,bm],i3=[2,gf],i4=[0,0,[2,dw],93,0,1],i5=[2,y],i6=[2,g_],i7=[0,0,[2,G],aL,[0,0,[2,dg],bE,0,1],2],i8=[2,bK],i9=[2,fY],i_=[0,0,[2,S],fc,0,1],i$=[2,ha],ja=[0,0,[2,at],gL,0,1],jb=[2,dU],jc=[2,cr],jd=[2,dp],je=[2,eO],jf=[2,H],jg=[0,0,[2,al],66,0,1],jh=[2,cQ],ji=[2,O],jj=[0,0,[2,cL],74,0,1],jk=[2,o],jl=[2,n],jm=[2,f_],jn=[0,0,[2,bg],75,0,1],jo=[2,go],jp=[0,0,[2,gM],63,0,1],jq=[2,di],jr=[0,0,[2,aG],51,0,1],js=[2,gS],jt=[2,ez],ju=[0,0,[2,b$],60,0,1],jv=[0,0,[2,cB],73,0,1],jw=[2,dL],jx=[2,e9],jy=[2,aN];b.toc=[0,[0,"SYMB",[0,303,[0,[0,[0,[0,[0,[0,[0,0,[2,ge],0,[0,0,hi,eW,0,1],2],[2,bf],fS,[0,[0,0,hj,d9,0,1],[2,gJ],ba,[0,0,hk,e6,0,1],2],3],[2,eT],fy,[0,[0,[0,0,hm,be,hl,3],[2,bo],b3,[0,hp,ho,d6,hn,2],4],[2,hc],fl,[0,[0,hs,hr,gA,hq,3],[2,eY],cT,[0,hu,ht,ao,0,2],4],5],6],[2,fE],ce,[0,[0,[0,[0,hw,hv,bp,0,2],[2,et],e$,0,3],[2,dR],g1,[0,[0,0,hx,bs,0,1],[2,dv],dt,[0,0,hy,cP,0,1],2],4],[2,bD],hd,[0,[0,[0,hB,hA,N,hz,2],[2,af],b1,[0,hE,hD,gF,hC,4],5],[2,cj],ci,[0,[0,hH,hG,bd,hF,4],[2,cx],cG,[0,hK,hJ,ej,hI,4],5],6],7],8],[2,dZ],bP,[0,[0,[0,[0,[0,hM,hL,eE,0,2],[2,cy],fp,[0,0,hO,gR,hN,2],3],[2,bx],bX,[0,[0,hR,hQ,g5,hP,3],[2,as],Y,[0,hU,hT,cJ,hS,3],4],5],[2,db],x,[0,[0,[0,0,hW,e,hV,2],[2,gI],bq,[0,0,hX,gk,0,1],3],[2,cO],eK,[0,[0,0,hZ,ai,hY,3],[2,e5],eU,[0,0,h0,cw,0,1],4],5],6],[2,c8],bl,[0,[0,[0,[0,h2,h1,aa,0,3],[2,aP],f9,[0,0,h3,f$,0,1],4],[2,gj],T,[0,[0,0,h4,bQ,0,1],[2,gr],t,[0,0,h5,a3,0,1],2],5],[2,fg],f8,[0,[0,[0,0,h6,a$,0,1],[2,fe],g0,0,2],[2,b8],fX,[0,[0,0,h7,cv,0,1],[2,bi],eL,[0,0,h8,aX,0,1],2],3],6],7],9],[2,m],gv,[0,[0,[0,[0,[0,[0,h_,h9,a2,0,3],[2,aI],a4,[0,0,h$,u,0,1],4],[2,cq],dV,[0,0,[2,dY],eJ,[0,ib,ia,R,0,2],3],5],[2,a9],w,[0,[0,[0,ie,id,fD,ic,3],[2,ac],d7,[0,ii,ih,aF,ig,3],4],[2,hg],ft,[0,[0,0,ij,r,0,1],[2,e_],fG,0,2],5],6],[2,fC],gP,[0,[0,[0,[0,im,il,aZ,ik,3],[2,fQ],fI,[0,0,io,bc,0,1],4],[2,gc],bB,[0,[0,0,ip,ep,0,1],[2,an],h,[0,0,iq,dM,0,1],2],5],[2,k],gH,[0,[0,[0,0,ir,em,0,1],[2,fo],48,[0,0,is,12,0,1],2],[2,g2],18,[0,[0,iu,it,62,0,2],[2,b5],1,[0,0,iv,2,0,1],3],4],6],7],[2,c6],3,[0,[0,[0,[0,[0,iy,ix,eg,iw,3],[2,cc],fi,[0,iB,iA,e3,iz,4],5],[2,gO],aD,[0,[0,iD,iC,aK,0,3],[2,a5],fU,[0,iF,iE,b_,0,3],4],6],[2,cY],g,[0,[0,[0,iI,iH,ag,iG,2],[2,Q],dK,0,3],[2,g9],hf,[0,[0,iK,iJ,fH,0,2],[2,aW],e8,0,3],4],7],[2,fO],da,[0,[0,[0,[0,iN,iM,ar,iL,4],[2,cb],4,[0,iQ,iP,80,iO,3],5],[2,aY],83,[0,[0,iT,iS,86,iR,3],[2,bv],85,[0,iW,iV,87,iU,2],4],6],[2,c_],81,[0,[0,[0,iZ,iY,82,iX,3],[2,aC],94,[0,i1,i0,97,0,2],4],[2,ex],92,[0,[0,0,i2,96,0,1],[2,aq],95,0,2],5],7],8],9],10],[2,eD],84,[0,[0,[0,[0,[0,[0,[0,i4,i3,91,0,2],[2,dF],90,0,3],[2,ct],89,[0,0,[2,bS],88,0,1],4],[2,J],79,[0,[0,0,[2,ck],77,[0,0,i5,78,0,1],2],[2,eb],5,[0,0,[2,aU],6,0,1],3],5],[2,aw],7,[0,[0,[0,[0,0,i6,fJ,0,1],[2,ei],cN,[0,0,i8,cu,i7,3],4],[2,eV],cp,[0,0,[2,dz],d1,[0,0,i9,ca,0,1],2],5],[2,gZ],fw,[0,[0,[0,0,i$,fB,i_,2],[2,eP],gQ,0,3],[2,M],dn,[0,[0,0,jb,fP,ja,2],[2,ff],8,[0,0,jc,bM,0,1],3],4],6],7],[2,gx],13,[0,[0,[0,[0,0,[2,B],50,0,1],[2,cZ],32,[0,0,[2,bn],68,0,1],2],[2,dW],17,[0,0,[2,cf],55,0,1],3],[2,b4],23,[0,[0,[0,0,[2,e4],43,0,1],[2,gq],28,[0,[0,0,jd,70,0,1],[2,eN],61,0,2],3],[2,cS],24,[0,[0,0,[2,cA],67,0,1],[2,U],45,[0,[0,0,je,54,0,1],[2,fF],47,[0,0,jf,76,0,1],2],3],4],5],8],[2,bb],14,[0,[0,[0,[0,[0,[0,0,jh,65,jg,2],[2,gi],33,[0,0,ji,59,0,1],3],[2,fa],52,[0,0,[2,dP],53,[0,0,jk,57,jj,2],3],4],[2,bI],27,[0,0,[2,dN],34,[0,0,[2,dT],35,0,1],2],5],[2,gC],19,[0,[0,[0,0,[2,fn],37,0,1],[2,dX],26,[0,[0,0,jl,69,0,1],[2,cR],40,0,2],3],[2,ey],31,[0,[0,[0,0,jm,72,0,1],[2,fA],44,0,2],[2,bz],36,0,3],4],6],[2,f3],16,[0,[0,[0,[0,[0,jp,jo,21,jn,2],[2,$],38,[0,jr,jq,49,0,2],3],[2,eo],42,[0,[0,0,js,56,0,1],[2,dd],22,[0,ju,jt,46,0,2],3],4],[2,dy],20,[0,[0,0,[2,ew],39,[0,0,jw,41,jv,2],3],[2,de],29,[0,0,[2,bU],71,0,1],4],5],[2,eX],15,[0,[0,0,[2,fu],25,[0,0,[2,gn],30,[0,0,jx,58,0,1],2],3],[2,ad],9,[0,[0,0,[2,bL],10,[0,0,jy,cC,0,1],2],[2,c],g4,[0,0,[2,dD],11,0,1],3],4],6],7],9],11]]],[0,[0,"SYJS",[0,[0,dD,11],[0,c,g4],[0,aN,cC],[0,bL,10],[0,ad,9],[0,e9,58],[0,gn,30],[0,fu,25],[0,eX,15],[0,bU,71],[0,de,29],[0,cB,73],[0,dL,41],[0,ew,39],[0,dy,20],[0,ez,46],[0,b$,60],[0,dd,22],[0,gS,56],[0,eo,42],[0,di,49],[0,aG,51],[0,$,38],[0,bg,75],[0,go,21],[0,gM,63],[0,f3,16],[0,bz,36],[0,fA,44],[0,f_,72],[0,ey,31],[0,cR,40],[0,n,69],[0,dX,26],[0,fn,37],[0,gC,19],[0,dT,35],[0,dN,34],[0,bI,27],[0,cL,74],[0,o,57],[0,dP,53],[0,fa,52],[0,O,59],[0,gi,33],[0,al,66],[0,cQ,65],[0,bb,14],[0,H,76],[0,fF,47],[0,eO,54],[0,U,45],[0,cA,67],[0,cS,24],[0,eN,61],[0,dp,70],[0,gq,28],[0,e4,43],[0,b4,23],[0,cf,55],[0,dW,17],[0,bn,68],[0,cZ,32],[0,B,50],[0,gx,13],[0,cr,bM],[0,ff,8],[0,at,gL],[0,dU,fP],[0,M,dn],[0,eP,gQ],[0,S,fc],[0,ha,fB],[0,gZ,fw],[0,fY,ca],[0,dz,d1],[0,eV,cp],[0,dg,bE],[0,G,aL],[0,bK,cu],[0,ei,cN],[0,g_,fJ],[0,aw,7],[0,aU,6],[0,eb,5],[0,y,78],[0,ck,77],[0,J,79],[0,bS,88],[0,ct,89],[0,dF,90],[0,gf,91],[0,dw,93],[0,eD,84],[0,aq,95],[0,bm,96],[0,ex,92],[0,aR,97],[0,aj,98],[0,aC,94],[0,bG,99],[0,co,v],[0,fV,82],[0,au,dG],[0,gp,bW],[0,c_,81],[0,gt,fR],[0,aM,87],[0,d3,g6],[0,bv,85],[0,dB,cg],[0,g3,gs],[0,fN,86],[0,ae,dh],[0,aY,83],[0,eG,fK],[0,fL,80],[0,ek,fr],[0,dH,c0],[0,cb,4],[0,gD,es],[0,dk,dE],[0,bj,ar],[0,ed,ax],[0,_,du],[0,cU,gE],[0,e7,he],[0,fO,da],[0,aW,e8],[0,f6,fH],[0,gV,eu],[0,g9,hf],[0,Q,dK],[0,ec,f5],[0,eh,ag],[0,I,bu],[0,cY,g],[0,eI,b_],[0,fz,fs],[0,eq,s],[0,a5,fU],[0,dQ,aK],[0,bA,b6],[0,a0,bt],[0,gO,aD],[0,dA,cz],[0,cd,cD],[0,gz,aH],[0,b9,eM],[0,eR,e3],[0,c1,c$],[0,cc,fi],[0,bN,az],[0,eZ,dj],[0,dC,eg],[0,V,cW],[0,ab,Z],[0,fb,dS],[0,c6,3],[0,fm,2],[0,b5,1],[0,c3,62],[0,cl,64],[0,g2,18],[0,fx,12],[0,fo,48],[0,ee,em],[0,k,gH],[0,c7,dM],[0,an,h],[0,D,ep],[0,gc,bB],[0,gl,bc],[0,fQ,fI],[0,b2,f],[0,c2,aZ],[0,i,cI],[0,bh,eS],[0,fC,gP],[0,e_,fG],[0,cF,r],[0,hg,ft],[0,bC,A],[0,ah,aF],[0,ga,g8],[0,ev,bZ],[0,ac,d7],[0,aS,gb],[0,C,e0],[0,av,fD],[0,cK,bw],[0,cs,d_],[0,gN,E],[0,a9,w],[0,bk,R],[0,gm,fZ],[0,dY,eJ],[0,cq,dV],[0,dI,u],[0,aI,a4],[0,dO,a2],[0,a7,aO],[0,fv,j],[0,m,gv],[0,dc,aX],[0,bi,eL],[0,f7,cv],[0,b8,fX],[0,fe,g0],[0,ak,a$],[0,fg,f8],[0,bV,a3],[0,gr,t],[0,gg,bQ],[0,gj,T],[0,aA,f$],[0,aP,f9],[0,a8,aa],[0,gK,a6],[0,d2,aB],[0,c8,bl],[0,by,cw],[0,e5,eU],[0,dr,bR],[0,gy,ef],[0,dx,ai],[0,cO,eK],[0,aJ,gk],[0,gI,bq],[0,gX,g$],[0,aV,e],[0,db,x],[0,d8,eA],[0,gu,cJ],[0,cM,c4],[0,dl,gY],[0,as,Y],[0,cX,cH],[0,gT,g5],[0,aQ,bT],[0,ds,dJ],[0,bx,bX],[0,W,er],[0,am,gR],[0,cy,fp],[0,d0,eE],[0,a_,c5],[0,dZ,bP],[0,cV,z],[0,bO,d],[0,ay,e1],[0,ch,ej],[0,l,F],[0,fd,gU],[0,el,X],[0,cx,cG],[0,dq,gW],[0,b7,f1],[0,fj,f2],[0,bF,bd],[0,eF,br],[0,cj,ci],[0,P,c9],[0,gw,gF],[0,d$,cE],[0,fM,p],[0,e2,fk],[0,bH,df],[0,af,b1],[0,cm,K],[0,dm,N],[0,L,eH],[0,bD,hd],[0,ea,cP],[0,dv,dt],[0,aE,bs],[0,dR,g1],[0,et,e$],[0,gG,bp],[0,g7,eB],[0,fE,ce],[0,gd,ao],[0,f4,a1],[0,eY,cT],[0,gh,b0],[0,gB,gA],[0,d4,fT],[0,ap,bY],[0,hc,fl],[0,bJ,q],[0,fq,d6],[0,hb,fW],[0,bo,b3],[0,d5,eQ],[0,fh,aT],[0,cn,be],[0,eT,fy],[0,en,e6],[0,gJ,ba],[0,eC,d9],[0,bf,fS],[0,f0,eW],[0,ge,0]]],[0,[0,"CRCS",0],[0,[0,"PRIM","%caml_format_int_special\0%direct_int_div\0%direct_int_mod\0%direct_int_mul\0%identity\0%int_add\0%int_and\0%int_asr\0%int_div\0%int_lsl\0%int_lsr\0%int_mod\0%int_mul\0%int_neg\0%int_or\0%int_sub\0%int_xor\0Base_am_testing\0Base_caml_exn_is_most_recent_exn\0Base_clear_caml_backtrace_pos\0Base_hash_double\0Base_hash_string\0Base_int_math_int32_clz\0Base_int_math_int32_ctz\0Base_int_math_int64_clz\0Base_int_math_int64_ctz\0Base_int_math_int64_pow_stub\0Base_int_math_int_clz\0Base_int_math_int_ctz\0Base_int_math_int_popcount\0Base_int_math_int_pow_stub\0Base_int_math_nativeint_clz\0Base_int_math_nativeint_ctz\0Base_internalhash_fold_float\0Base_internalhash_fold_int\0Base_internalhash_fold_int64\0Base_internalhash_fold_string\0Base_internalhash_get_hash_value\0BigStringReader\0MlBytes\0MlFakeDevice\0MlFakeFd\0MlFakeFd_out\0MlFakeFile\0MlFile\0MlInt64\0MlMutex\0MlNat\0MlNodeDevice\0MlNodeFd\0MlObjectTable\0MlStringReader\0Ml_Bigarray\0Ml_Bigarray_c_1_1\0UInt8ArrayReader\0add_nat\0bigstring_of_array_buffer\0bigstring_of_typed_array\0bigstring_to_array_buffer\0bigstring_to_typed_array\0blit_nat\0caml_MD5Final\0caml_MD5Init\0caml_MD5Transform\0caml_MD5Update\0caml_abs_float\0caml_acos_float\0caml_acosh_float\0caml_add_float\0caml_alloc_dummy\0caml_alloc_dummy_float\0caml_alloc_dummy_infix\0caml_alloc_stack\0caml_argv\0caml_array_append\0caml_array_blit\0caml_array_bound_error\0caml_array_concat\0caml_array_fill\0caml_array_get\0caml_array_get_addr\0caml_array_get_float\0caml_array_of_bytes\0caml_array_of_string\0caml_array_set\0caml_array_set_addr\0caml_array_set_float\0caml_array_sub\0caml_array_unsafe_get\0caml_array_unsafe_get_float\0caml_array_unsafe_set\0caml_array_unsafe_set_float\0caml_asin_float\0caml_asinh_float\0caml_atan2_float\0caml_atan_float\0caml_atanh_float\0caml_atomic_cas\0caml_atomic_exchange\0caml_atomic_fetch_add\0caml_atomic_load\0caml_ba_blit\0caml_ba_change_layout\0caml_ba_compare\0caml_ba_create\0caml_ba_create_buffer\0caml_ba_create_from\0caml_ba_create_unsafe\0caml_ba_custom_name\0caml_ba_deserialize\0caml_ba_dim\0caml_ba_dim_1\0caml_ba_dim_2\0caml_ba_dim_3\0caml_ba_fill\0caml_ba_from_typed_array\0caml_ba_get_1\0caml_ba_get_2\0caml_ba_get_3\0caml_ba_get_generic\0caml_ba_get_size\0caml_ba_get_size_per_element\0caml_ba_hash\0caml_ba_init\0caml_ba_kind\0caml_ba_kind_of_typed_array\0caml_ba_layout\0caml_ba_map_file\0caml_ba_map_file_bytecode\0caml_ba_num_dims\0caml_ba_reshape\0caml_ba_serialize\0caml_ba_set_1\0caml_ba_set_2\0caml_ba_set_3\0caml_ba_set_generic\0caml_ba_slice\0caml_ba_sub\0caml_ba_to_typed_array\0caml_ba_uint8_get16\0caml_ba_uint8_get32\0caml_ba_uint8_get64\0caml_ba_uint8_set16\0caml_ba_uint8_set32\0caml_ba_uint8_set64\0caml_backtrace_status\0caml_bigstring_blit_ba_to_ba\0caml_bigstring_blit_ba_to_bytes\0caml_bigstring_blit_bytes_to_ba\0caml_bigstring_blit_string_to_ba\0caml_bigstring_memcmp\0caml_blit_bytes\0caml_blit_string\0caml_bswap16\0caml_build_symbols\0caml_bytes_bound_error\0caml_bytes_compare\0caml_bytes_equal\0caml_bytes_get\0caml_bytes_get16\0caml_bytes_get32\0caml_bytes_get64\0caml_bytes_greaterequal\0caml_bytes_greaterthan\0caml_bytes_lessequal\0caml_bytes_lessthan\0caml_bytes_notequal\0caml_bytes_of_array\0caml_bytes_of_jsbytes\0caml_bytes_of_string\0caml_bytes_of_utf16_jsstring\0caml_bytes_set\0caml_bytes_set16\0caml_bytes_set32\0caml_bytes_set64\0caml_bytes_unsafe_get\0caml_bytes_unsafe_set\0caml_call_gen\0caml_callback\0caml_cbrt_float\0caml_ceil_float\0caml_channel_descriptor\0caml_check_bound\0caml_classify_float\0caml_compare\0caml_compare_val\0caml_compare_val_get_custom\0caml_compare_val_number_custom\0caml_compare_val_tag\0caml_continuation_use_and_update_handler_noexc\0caml_continuation_use_noexc\0caml_convert_bytes_to_array\0caml_convert_raw_backtrace\0caml_convert_raw_backtrace_slot\0caml_convert_string_to_bytes\0caml_copysign_float\0caml_cos_float\0caml_cosh_float\0caml_create_bytes\0caml_create_file\0caml_create_string\0caml_current_dir\0caml_custom_event_index\0caml_custom_ops\0caml_div\0caml_div_float\0caml_domain_dls\0caml_domain_dls_get\0caml_domain_dls_set\0caml_domain_id\0caml_domain_spawn\0caml_ensure_stack_capacity\0caml_ephe_blit_data\0caml_ephe_blit_key\0caml_ephe_check_data\0caml_ephe_check_key\0caml_ephe_create\0caml_ephe_data_offset\0caml_ephe_get_data\0caml_ephe_get_data_copy\0caml_ephe_get_key\0caml_ephe_get_key_copy\0caml_ephe_key_offset\0caml_ephe_set_data\0caml_ephe_set_key\0caml_ephe_unset_data\0caml_ephe_unset_key\0caml_eq_float\0caml_equal\0caml_erf_float\0caml_erfc_float\0caml_eventlog_pause\0caml_eventlog_resume\0caml_executable_name\0caml_exn_with_js_backtrace\0caml_exp2_float\0caml_exp_float\0caml_expm1_float\0caml_failwith\0caml_fatal_uncaught_exception\0caml_fill_bytes\0caml_fill_string\0caml_final_register\0caml_final_register_called_without_value\0caml_final_release\0caml_finish_formatting\0caml_float_compare\0caml_float_of_bytes\0caml_float_of_int\0caml_float_of_string\0caml_floatarray_blit\0caml_floatarray_create\0caml_floatarray_get\0caml_floatarray_set\0caml_floatarray_unsafe_get\0caml_floatarray_unsafe_set\0caml_floor_float\0caml_fma_float\0caml_fmod_float\0caml_format_exception\0caml_format_float\0caml_format_int\0caml_fresh_oo_id\0caml_frexp_float\0caml_fs_init\0caml_gc_compaction\0caml_gc_counters\0caml_gc_full_major\0caml_gc_get\0caml_gc_huge_fallback_count\0caml_gc_major\0caml_gc_major_slice\0caml_gc_minor\0caml_gc_minor_words\0caml_gc_quick_stat\0caml_gc_set\0caml_gc_stat\0caml_ge_float\0caml_get_continuation_callstack\0caml_get_current_callstack\0caml_get_exception_backtrace\0caml_get_exception_raw_backtrace\0caml_get_global_data\0caml_get_major_bucket\0caml_get_major_credit\0caml_get_minor_free\0caml_get_public_method\0caml_get_root\0caml_global_data\0caml_gr_arc_aux\0caml_gr_blit_image\0caml_gr_clear_graph\0caml_gr_close_graph\0caml_gr_close_subwindow\0caml_gr_create_image\0caml_gr_current_x\0caml_gr_current_y\0caml_gr_display_mode\0caml_gr_doc_of_state\0caml_gr_draw_arc\0caml_gr_draw_char\0caml_gr_draw_image\0caml_gr_draw_rect\0caml_gr_draw_str\0caml_gr_draw_string\0caml_gr_dump_image\0caml_gr_fill_arc\0caml_gr_fill_poly\0caml_gr_fill_rect\0caml_gr_lineto\0caml_gr_make_image\0caml_gr_moveto\0caml_gr_open_graph\0caml_gr_open_subwindow\0caml_gr_plot\0caml_gr_point_color\0caml_gr_remember_mode\0caml_gr_resize_window\0caml_gr_set_color\0caml_gr_set_font\0caml_gr_set_line_width\0caml_gr_set_text_size\0caml_gr_set_window_title\0caml_gr_sigio_handler\0caml_gr_sigio_signal\0caml_gr_size_x\0caml_gr_size_y\0caml_gr_state\0caml_gr_state_create\0caml_gr_state_get\0caml_gr_state_init\0caml_gr_state_set\0caml_gr_synchronize\0caml_gr_text_size\0caml_gr_wait_event\0caml_gr_window_id\0caml_greaterequal\0caml_greaterthan\0caml_gt_float\0caml_hash\0caml_hash_mix_bigstring\0caml_hash_mix_bytes\0caml_hash_mix_bytes_arr\0caml_hash_mix_final\0caml_hash_mix_float\0caml_hash_mix_int\0caml_hash_mix_int64\0caml_hash_mix_jsbytes\0caml_hash_mix_string\0caml_hash_nat\0caml_hexstring_of_float\0caml_hypot_float\0caml_input_value\0caml_input_value_from_bytes\0caml_input_value_from_reader\0caml_input_value_from_string\0caml_input_value_to_outside_heap\0caml_install_signal_handler\0caml_int32_add\0caml_int32_and\0caml_int32_bits_of_float\0caml_int32_bswap\0caml_int32_compare\0caml_int32_div\0caml_int32_float_of_bits\0caml_int32_format\0caml_int32_mod\0caml_int32_mul\0caml_int32_neg\0caml_int32_of_float\0caml_int32_of_int\0caml_int32_of_string\0caml_int32_or\0caml_int32_shift_left\0caml_int32_shift_right\0caml_int32_shift_right_unsigned\0caml_int32_sub\0caml_int32_to_float\0caml_int32_to_int\0caml_int32_unmarshal\0caml_int32_xor\0caml_int64_add\0caml_int64_and\0caml_int64_bits_of_float\0caml_int64_bswap\0caml_int64_compare\0caml_int64_create_lo_hi\0caml_int64_create_lo_mi_hi\0caml_int64_div\0caml_int64_float_of_bits\0caml_int64_format\0caml_int64_hash\0caml_int64_hi32\0caml_int64_is_negative\0caml_int64_is_zero\0caml_int64_lo32\0caml_int64_marshal\0caml_int64_mod\0caml_int64_mul\0caml_int64_neg\0caml_int64_of_bytes\0caml_int64_of_float\0caml_int64_of_int\0caml_int64_of_int32\0caml_int64_of_nativeint\0caml_int64_of_string\0caml_int64_offset\0caml_int64_or\0caml_int64_shift_left\0caml_int64_shift_right\0caml_int64_shift_right_unsigned\0caml_int64_sub\0caml_int64_to_bytes\0caml_int64_to_float\0caml_int64_to_int\0caml_int64_to_int32\0caml_int64_to_nativeint\0caml_int64_ult\0caml_int64_unmarshal\0caml_int64_xor\0caml_int_compare\0caml_int_of_float\0caml_int_of_string\0caml_invalid_argument\0caml_is_continuation_tag\0caml_is_js\0caml_is_ml_bytes\0caml_is_ml_string\0caml_is_printable\0caml_is_special_exception\0caml_js_call\0caml_js_delete\0caml_js_equals\0caml_js_error_of_exception\0caml_js_error_option_of_exception\0caml_js_eval_string\0caml_js_expr\0caml_js_from_array\0caml_js_from_bool\0caml_js_from_float\0caml_js_from_string\0caml_js_fun_call\0caml_js_function_arity\0caml_js_get\0caml_js_get_console\0caml_js_html_entities\0caml_js_html_escape\0caml_js_instanceof\0caml_js_meth_call\0caml_js_new\0caml_js_object\0caml_js_on_ie\0caml_js_pure_expr\0caml_js_set\0caml_js_to_array\0caml_js_to_bool\0caml_js_to_byte_string\0caml_js_to_float\0caml_js_to_string\0caml_js_typeof\0caml_js_var\0caml_js_wrap_callback\0caml_js_wrap_callback_arguments\0caml_js_wrap_callback_strict\0caml_js_wrap_callback_unsafe\0caml_js_wrap_meth_callback\0caml_js_wrap_meth_callback_arguments\0caml_js_wrap_meth_callback_strict\0caml_js_wrap_meth_callback_unsafe\0caml_jsbytes_of_string\0caml_jsoo_flags_effects\0caml_jsoo_flags_use_js_string\0caml_jsstring_of_string\0caml_lazy_make_forward\0caml_lazy_read_result\0caml_lazy_reset_to_lazy\0caml_lazy_update_to_forcing\0caml_lazy_update_to_forward\0caml_ldexp_float\0caml_le_float\0caml_lessequal\0caml_lessthan\0caml_lex_array\0caml_lex_engine\0caml_list_mount_point\0caml_list_of_js_array\0caml_list_to_js_array\0caml_log10_float\0caml_log1p_float\0caml_log2_float\0caml_log_float\0caml_lt_float\0caml_lxm_next\0caml_make_array\0caml_make_float_vect\0caml_make_path\0caml_make_vect\0caml_marshal_constants\0caml_marshal_data_size\0caml_marshal_header_size\0caml_maybe_attach_backtrace\0caml_maybe_print_stats\0caml_md5_bytes\0caml_md5_chan\0caml_md5_string\0caml_memprof_set\0caml_memprof_start\0caml_memprof_stop\0caml_ml_bytes_content\0caml_ml_bytes_length\0caml_ml_channel_size\0caml_ml_channel_size_64\0caml_ml_channels\0caml_ml_close_channel\0caml_ml_condition_broadcast\0caml_ml_condition_new\0caml_ml_condition_signal\0caml_ml_condition_wait\0caml_ml_debug_info_status\0caml_ml_domain_cpu_relax\0caml_ml_domain_id\0caml_ml_domain_set_name\0caml_ml_domain_unique_token\0caml_ml_enable_runtime_warnings\0caml_ml_flush\0caml_ml_input\0caml_ml_input_block\0caml_ml_input_char\0caml_ml_input_int\0caml_ml_input_scan_line\0caml_ml_is_buffered\0caml_ml_mutex_lock\0caml_ml_mutex_new\0caml_ml_mutex_try_lock\0caml_ml_mutex_unlock\0caml_ml_open_descriptor_in\0caml_ml_open_descriptor_out\0caml_ml_out_channels_list\0caml_ml_output\0caml_ml_output_bytes\0caml_ml_output_char\0caml_ml_output_int\0caml_ml_pos_in\0caml_ml_pos_in_64\0caml_ml_pos_out\0caml_ml_pos_out_64\0caml_ml_runtime_warnings_enabled\0caml_ml_seek_in\0caml_ml_seek_in_64\0caml_ml_seek_out\0caml_ml_seek_out_64\0caml_ml_set_binary_mode\0caml_ml_set_buffered\0caml_ml_set_channel_name\0caml_ml_set_channel_output\0caml_ml_set_channel_refill\0caml_ml_string_length\0caml_mod\0caml_modf_float\0caml_mount_autoload\0caml_mul\0caml_mul_float\0caml_named_value\0caml_named_values\0caml_nativeint_add\0caml_nativeint_and\0caml_nativeint_bswap\0caml_nativeint_compare\0caml_nativeint_div\0caml_nativeint_format\0caml_nativeint_mod\0caml_nativeint_mul\0caml_nativeint_neg\0caml_nativeint_of_float\0caml_nativeint_of_int\0caml_nativeint_of_int32\0caml_nativeint_of_string\0caml_nativeint_or\0caml_nativeint_shift_left\0caml_nativeint_shift_right\0caml_nativeint_shift_right_unsigned\0caml_nativeint_sub\0caml_nativeint_to_float\0caml_nativeint_to_int\0caml_nativeint_to_int32\0caml_nativeint_unmarshal\0caml_nativeint_xor\0caml_neg_float\0caml_neq_float\0caml_new_lex_engine\0caml_new_string\0caml_nextafter_float\0caml_notequal\0caml_obj_add_offset\0caml_obj_block\0caml_obj_compare_and_swap\0caml_obj_dup\0caml_obj_is_block\0caml_obj_is_shared\0caml_obj_make_forward\0caml_obj_raw_field\0caml_obj_reachable_words\0caml_obj_set_raw_field\0caml_obj_set_tag\0caml_obj_tag\0caml_obj_truncate\0caml_obj_update_tag\0caml_obj_with_tag\0caml_ojs_new_arr\0caml_oo_last_id\0caml_output_val\0caml_output_value\0caml_output_value_to_buffer\0caml_output_value_to_bytes\0caml_output_value_to_string\0caml_parse_digit\0caml_parse_engine\0caml_parse_format\0caml_parse_sign_and_base\0caml_parser_trace\0caml_pos_in\0caml_pos_out\0caml_power_float\0caml_pure_js_expr\0caml_raise_constant\0caml_raise_end_of_file\0caml_raise_no_such_file\0caml_raise_not_a_dir\0caml_raise_not_found\0caml_raise_sys_error\0caml_raise_with_arg\0caml_raise_with_args\0caml_raise_with_string\0caml_raise_zero_divide\0caml_raw_backtrace_length\0caml_raw_backtrace_next_slot\0caml_raw_backtrace_slot\0caml_read_file_content\0caml_recommended_domain_count\0caml_record_backtrace\0caml_record_backtrace_flag\0caml_refill\0caml_register_channel_for_spacetime\0caml_register_global\0caml_register_named_value\0caml_restore_raw_backtrace\0caml_root\0caml_round_float\0caml_runtime_events_create_cursor\0caml_runtime_events_free_cursor\0caml_runtime_events_pause\0caml_runtime_events_read_poll\0caml_runtime_events_resume\0caml_runtime_events_start\0caml_runtime_events_user_register\0caml_runtime_events_user_resolve\0caml_runtime_events_user_write\0caml_runtime_parameters\0caml_runtime_variant\0caml_runtime_warnings\0caml_seek_in\0caml_seek_out\0caml_set_oo_id\0caml_set_parser_trace\0caml_set_static_env\0caml_signbit_float\0caml_sin_float\0caml_sinh_float\0caml_spacetime_enabled\0caml_spacetime_only_works_for_native_code\0caml_sqrt_float\0caml_str_initialize\0caml_str_repeat\0caml_string_bound_error\0caml_string_compare\0caml_string_equal\0caml_string_get\0caml_string_get16\0caml_string_get32\0caml_string_get64\0caml_string_greaterequal\0caml_string_greaterthan\0caml_string_hash\0caml_string_lessequal\0caml_string_lessthan\0caml_string_notequal\0caml_string_of_array\0caml_string_of_bytes\0caml_string_of_jsbytes\0caml_string_of_jsstring\0caml_string_set\0caml_string_set16\0caml_string_set32\0caml_string_set64\0caml_string_unsafe_get\0caml_string_unsafe_set\0caml_sub_float\0caml_subarray_to_jsbytes\0caml_sys_argv\0caml_sys_chdir\0caml_sys_close\0caml_sys_const_backend_type\0caml_sys_const_big_endian\0caml_sys_const_int_size\0caml_sys_const_max_wosize\0caml_sys_const_naked_pointers_checked\0caml_sys_const_ostype_cygwin\0caml_sys_const_ostype_unix\0caml_sys_const_ostype_win32\0caml_sys_const_word_size\0caml_sys_executable_name\0caml_sys_exit\0caml_sys_fds\0caml_sys_file_exists\0caml_sys_get_argv\0caml_sys_get_config\0caml_sys_getcwd\0caml_sys_getenv\0caml_sys_is_directory\0caml_sys_is_regular_file\0caml_sys_isatty\0caml_sys_mkdir\0caml_sys_modify_argv\0caml_sys_open\0caml_sys_open_for_node\0caml_sys_random_seed\0caml_sys_read_directory\0caml_sys_remove\0caml_sys_rename\0caml_sys_rmdir\0caml_sys_system_command\0caml_sys_time\0caml_sys_time_include_children\0caml_sys_unsafe_getenv\0caml_tan_float\0caml_tanh_float\0caml_to_js_string\0caml_trailing_slash\0caml_trampoline\0caml_trampoline_return\0caml_trunc_float\0caml_uint8_array_of_bytes\0caml_uint8_array_of_string\0caml_unix_cleanup\0caml_unix_closedir\0caml_unix_filedescr_of_fd\0caml_unix_findclose\0caml_unix_findfirst\0caml_unix_findnext\0caml_unix_getpwuid\0caml_unix_gettimeofday\0caml_unix_getuid\0caml_unix_gmtime\0caml_unix_has_symlink\0caml_unix_inet_addr_of_string\0caml_unix_isatty\0caml_unix_localtime\0caml_unix_lstat\0caml_unix_lstat_64\0caml_unix_mkdir\0caml_unix_mktime\0caml_unix_opendir\0caml_unix_readdir\0caml_unix_readlink\0caml_unix_rewinddir\0caml_unix_rmdir\0caml_unix_startup\0caml_unix_stat\0caml_unix_stat_64\0caml_unix_symlink\0caml_unix_time\0caml_unix_unlink\0caml_unmount\0caml_update_dummy\0caml_utf16_of_utf8\0caml_utf8_of_utf16\0caml_weak_blit\0caml_weak_check\0caml_weak_create\0caml_weak_get\0caml_weak_get_copy\0caml_weak_set\0caml_wrap_exception\0caml_xmlhttprequest_create\0compare_digits_nat\0compare_nat\0compare_nat_real\0complement_nat\0create_nat\0decr_nat\0deserialize_nat\0div_digit_nat\0div_helper\0div_nat\0fs_node_supported\0incr_nat\0initialize_nat\0is_digit_int\0is_digit_odd\0is_digit_zero\0jsoo_create_file\0jsoo_create_file_extern\0jsoo_effect_not_supported\0jsoo_floor_log2\0jsoo_is_ascii\0jsoo_mount_point\0jsoo_sys_getenv\0land_digit_nat\0lor_digit_nat\0lxor_digit_nat\0make_unix_err_args\0mult_digit_nat\0mult_nat\0nat_of_array\0nth_digit_nat\0nth_digit_nat_native\0num_digits_nat\0num_leading_zero_bits_in_digit\0os_type\0path_is_absolute\0re_match\0re_partial_match\0re_replacement_text\0re_search_backward\0re_search_forward\0re_string_match\0resolve_fs_device\0serialize_nat\0set_digit_nat\0set_digit_nat_native\0set_to_zero_nat\0shift_left_nat\0shift_right_nat\0square_nat\0sub_nat\0time_now_nanoseconds_since_unix_epoch_or_zero\0unix_closedir\0unix_getpwuid\0unix_gettimeofday\0unix_getuid\0unix_gmtime\0unix_has_symlink\0unix_inet_addr_of_string\0unix_isatty\0unix_localtime\0unix_lstat\0unix_lstat_64\0unix_mkdir\0unix_mktime\0unix_opendir\0unix_readdir\0unix_readlink\0unix_rewinddir\0unix_rmdir\0unix_stat\0unix_stat_64\0unix_symlink\0unix_time\0unix_unlink\0win_cleanup\0win_filedescr_of_channel\0win_findclose\0win_findfirst\0win_findnext\0win_handle_fd\0win_startup\0zstd_decompress\0"],0]]]];return}(globalThis)); + +//# 1 "../../../.js/default/stdlib/stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function erase_rel(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, erase_rel(rest)]; + case 1: + var rest$0 = param[1]; return [1, erase_rel(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, erase_rel(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, erase_rel(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, erase_rel(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, erase_rel(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, erase_rel(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, erase_rel(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; + return [8, ty, erase_rel(rest$7)]; + case 9: + var rest$8 = param[3], ty1 = param[1]; + return [9, ty1, ty1, erase_rel(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, erase_rel(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, erase_rel(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, erase_rel(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, erase_rel(rest$12)]; + default: var rest$13 = param[1]; return [14, erase_rel(rest$13)]; + } + } + function concat_fmtty(fmtty1, fmtty2){ + if(typeof fmtty1 === "number") return fmtty2; + switch(fmtty1[0]){ + case 0: + var rest = fmtty1[1]; return [0, concat_fmtty(rest, fmtty2)]; + case 1: + var rest$0 = fmtty1[1]; return [1, concat_fmtty(rest$0, fmtty2)]; + case 2: + var rest$1 = fmtty1[1]; return [2, concat_fmtty(rest$1, fmtty2)]; + case 3: + var rest$2 = fmtty1[1]; return [3, concat_fmtty(rest$2, fmtty2)]; + case 4: + var rest$3 = fmtty1[1]; return [4, concat_fmtty(rest$3, fmtty2)]; + case 5: + var rest$4 = fmtty1[1]; return [5, concat_fmtty(rest$4, fmtty2)]; + case 6: + var rest$5 = fmtty1[1]; return [6, concat_fmtty(rest$5, fmtty2)]; + case 7: + var rest$6 = fmtty1[1]; return [7, concat_fmtty(rest$6, fmtty2)]; + case 8: + var rest$7 = fmtty1[2], ty = fmtty1[1]; + return [8, ty, concat_fmtty(rest$7, fmtty2)]; + case 9: + var rest$8 = fmtty1[3], ty2 = fmtty1[2], ty1 = fmtty1[1]; + return [9, ty1, ty2, concat_fmtty(rest$8, fmtty2)]; + case 10: + var rest$9 = fmtty1[1]; return [10, concat_fmtty(rest$9, fmtty2)]; + case 11: + var rest$10 = fmtty1[1]; return [11, concat_fmtty(rest$10, fmtty2)]; + case 12: + var rest$11 = fmtty1[1]; return [12, concat_fmtty(rest$11, fmtty2)]; + case 13: + var rest$12 = fmtty1[1]; return [13, concat_fmtty(rest$12, fmtty2)]; + default: + var rest$13 = fmtty1[1]; return [14, concat_fmtty(rest$13, fmtty2)]; + } + } + function concat_fmt(fmt1, fmt2){ + if(typeof fmt1 === "number") return fmt2; + switch(fmt1[0]){ + case 0: + var rest = fmt1[1]; return [0, concat_fmt(rest, fmt2)]; + case 1: + var rest$0 = fmt1[1]; return [1, concat_fmt(rest$0, fmt2)]; + case 2: + var rest$1 = fmt1[2], pad = fmt1[1]; + return [2, pad, concat_fmt(rest$1, fmt2)]; + case 3: + var rest$2 = fmt1[2], pad$0 = fmt1[1]; + return [3, pad$0, concat_fmt(rest$2, fmt2)]; + case 4: + var rest$3 = fmt1[4], prec = fmt1[3], pad$1 = fmt1[2], iconv = fmt1[1]; + return [4, iconv, pad$1, prec, concat_fmt(rest$3, fmt2)]; + case 5: + var + rest$4 = fmt1[4], + prec$0 = fmt1[3], + pad$2 = fmt1[2], + iconv$0 = fmt1[1]; + return [5, iconv$0, pad$2, prec$0, concat_fmt(rest$4, fmt2)]; + case 6: + var + rest$5 = fmt1[4], + prec$1 = fmt1[3], + pad$3 = fmt1[2], + iconv$1 = fmt1[1]; + return [6, iconv$1, pad$3, prec$1, concat_fmt(rest$5, fmt2)]; + case 7: + var + rest$6 = fmt1[4], + prec$2 = fmt1[3], + pad$4 = fmt1[2], + iconv$2 = fmt1[1]; + return [7, iconv$2, pad$4, prec$2, concat_fmt(rest$6, fmt2)]; + case 8: + var + rest$7 = fmt1[4], + prec$3 = fmt1[3], + pad$5 = fmt1[2], + fconv = fmt1[1]; + return [8, fconv, pad$5, prec$3, concat_fmt(rest$7, fmt2)]; + case 9: + var rest$8 = fmt1[2], pad$6 = fmt1[1]; + return [9, pad$6, concat_fmt(rest$8, fmt2)]; + case 10: + var rest$9 = fmt1[1]; return [10, concat_fmt(rest$9, fmt2)]; + case 11: + var rest$10 = fmt1[2], str = fmt1[1]; + return [11, str, concat_fmt(rest$10, fmt2)]; + case 12: + var rest$11 = fmt1[2], chr = fmt1[1]; + return [12, chr, concat_fmt(rest$11, fmt2)]; + case 13: + var rest$12 = fmt1[3], fmtty = fmt1[2], pad$7 = fmt1[1]; + return [13, pad$7, fmtty, concat_fmt(rest$12, fmt2)]; + case 14: + var rest$13 = fmt1[3], fmtty$0 = fmt1[2], pad$8 = fmt1[1]; + return [14, pad$8, fmtty$0, concat_fmt(rest$13, fmt2)]; + case 15: + var rest$14 = fmt1[1]; return [15, concat_fmt(rest$14, fmt2)]; + case 16: + var rest$15 = fmt1[1]; return [16, concat_fmt(rest$15, fmt2)]; + case 17: + var rest$16 = fmt1[2], fmting_lit = fmt1[1]; + return [17, fmting_lit, concat_fmt(rest$16, fmt2)]; + case 18: + var rest$17 = fmt1[2], fmting_gen = fmt1[1]; + return [18, fmting_gen, concat_fmt(rest$17, fmt2)]; + case 19: + var rest$18 = fmt1[1]; return [19, concat_fmt(rest$18, fmt2)]; + case 20: + var rest$19 = fmt1[3], char_set = fmt1[2], width_opt = fmt1[1]; + return [20, width_opt, char_set, concat_fmt(rest$19, fmt2)]; + case 21: + var rest$20 = fmt1[2], counter = fmt1[1]; + return [21, counter, concat_fmt(rest$20, fmt2)]; + case 22: + var rest$21 = fmt1[1]; return [22, concat_fmt(rest$21, fmt2)]; + case 23: + var rest$22 = fmt1[2], ign = fmt1[1]; + return [23, ign, concat_fmt(rest$22, fmt2)]; + default: + var rest$23 = fmt1[3], f = fmt1[2], arity = fmt1[1]; + return [24, arity, f, concat_fmt(rest$23, fmt2)]; + } + } + var CamlinternalFormatBasics = [0, concat_fmtty, erase_rel, concat_fmt]; + runtime.caml_register_global + (0, CamlinternalFormatBasics, "CamlinternalFormatBasics"); + return; + } + (globalThis)); + +//# 180 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_false$0 = "false", + cst_true$0 = "true", + caml_atomic_cas = runtime.caml_atomic_cas, + caml_atomic_load = runtime.caml_atomic_load, + caml_blit_string = runtime.caml_blit_string, + caml_create_bytes = runtime.caml_create_bytes, + caml_float_of_string = runtime.caml_float_of_string, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_channel_size = runtime.caml_ml_channel_size, + caml_ml_channel_size_64 = runtime.caml_ml_channel_size_64, + caml_ml_close_channel = runtime.caml_ml_close_channel, + caml_ml_flush = runtime.caml_ml_flush, + caml_ml_input = runtime.caml_ml_input, + caml_ml_input_char = runtime.caml_ml_input_char, + caml_ml_open_descriptor_in = runtime.caml_ml_open_descriptor_in, + caml_ml_open_descriptor_out = runtime.caml_ml_open_descriptor_out, + caml_ml_output = runtime.caml_ml_output, + caml_ml_output_bytes = runtime.caml_ml_output_bytes, + caml_ml_output_char = runtime.caml_ml_output_char, + caml_ml_set_binary_mode = runtime.caml_ml_set_binary_mode, + caml_ml_set_channel_name = runtime.caml_ml_set_channel_name, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_sys_open = runtime.caml_sys_open, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = "%,", + cst = ".", + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Invalid_argument = global_data.Invalid_argument, + Failure = global_data.Failure, + Match_failure = global_data.Match_failure, + Assert_failure = global_data.Assert_failure, + Not_found = global_data.Not_found, + Out_of_memory = global_data.Out_of_memory, + Stack_overflow = global_data.Stack_overflow, + Sys_error = global_data.Sys_error, + End_of_file = global_data.End_of_file, + Division_by_zero = global_data.Division_by_zero, + Sys_blocked_io = global_data.Sys_blocked_io, + Undefined_recursive_module = global_data.Undefined_recursive_module, + cst_really_input = "really_input", + cst_input = "input", + _l_ = [0, 0, [0, 6, 0]], + _k_ = [0, 0, [0, 7, 0]], + cst_output_substring = "output_substring", + cst_output = "output", + _j_ = [0, 1, [0, 3, [0, 4, [0, 6, 0]]]], + _i_ = [0, 1, [0, 3, [0, 4, [0, 7, 0]]]], + _g_ = [0, 1], + _h_ = [0, 0], + cst_bool_of_string = "bool_of_string", + cst_true = cst_true$0, + cst_false = cst_false$0, + cst_char_of_int = "char_of_int", + cst_Stdlib_Exit = "Stdlib.Exit", + _a_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 32752), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 65520), + _c_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 32752), + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32751), + _e_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 16), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 15536); + function failwith(s){ + throw caml_maybe_attach_backtrace([0, Failure, s], 1); + } + function invalid_arg(s){ + throw caml_maybe_attach_backtrace([0, Invalid_argument, s], 1); + } + var Exit = [248, cst_Stdlib_Exit, runtime.caml_fresh_oo_id(0)]; + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return runtime.caml_greaterequal(x, y) ? x : y;} + function abs(x){return 0 <= x ? x : - x | 0;} + function lnot(x){return x ^ -1;} + var + infinity = caml_int64_float_of_bits(_a_), + neg_infinity = caml_int64_float_of_bits(_b_), + nan = caml_int64_float_of_bits(_c_), + max_float = caml_int64_float_of_bits(_d_), + min_float = caml_int64_float_of_bits(_e_), + epsilon_float = caml_int64_float_of_bits(_f_), + max_int = 2147483647, + min_int = -2147483648; + function symbol(s1, s2){ + var + l1 = caml_ml_string_length(s1), + l2 = caml_ml_string_length(s2), + s = caml_create_bytes(l1 + l2 | 0); + caml_blit_string(s1, 0, s, 0, l1); + caml_blit_string(s2, 0, s, l1, l2); + return caml_string_of_bytes(s); + } + function char_of_int(n){ + if(0 <= n && 255 >= n) return n; + return invalid_arg(cst_char_of_int); + } + function string_of_bool(b){return b ? cst_true : cst_false;} + function bool_of_string(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal + (param, cst_true$0) + ? invalid_arg(cst_bool_of_string) + : 1 + : 0; + } + function bool_of_string_opt(param){ + return caml_string_notequal(param, cst_false$0) + ? caml_string_notequal(param, cst_true$0) ? 0 : _g_ + : _h_; + } + function string_of_int(n){return "" + n;} + function int_of_string_opt(s){ + try{var _B_ = [0, caml_int_of_string(s)]; return _B_;} + catch(_C_){ + var _A_ = caml_wrap_exception(_C_); + if(_A_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_A_, 0); + } + } + function valid_float_lexem(s){ + var l = caml_ml_string_length(s), i = 0; + for(;;){ + if(l <= i) return symbol(s, cst); + var match = runtime.caml_string_get(s, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return s; + var i$0 = i + 1 | 0, i = i$0; + } + } + function string_of_float(f){ + return valid_float_lexem(runtime.caml_format_float("%.12g", f)); + } + function float_of_string_opt(s){ + try{var _y_ = [0, caml_float_of_string(s)]; return _y_;} + catch(_z_){ + var _x_ = caml_wrap_exception(_z_); + if(_x_[1] === Failure) return 0; + throw caml_maybe_attach_backtrace(_x_, 0); + } + } + function symbol$0(l1, l2){ + if(! l1) return l2; + var tl = l1[2], hd = l1[1]; + return [0, hd, symbol$0(tl, l2)]; + } + var + stdin = caml_ml_open_descriptor_in(0), + stdout = caml_ml_open_descriptor_out(1), + stderr = caml_ml_open_descriptor_out(2); + function open_out_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_out(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_out(name){return open_out_gen(_i_, 438, name);} + function open_out_bin(name){return open_out_gen(_j_, 438, name);} + function flush_all(param){ + var param$0 = runtime.caml_ml_out_channels_list(0); + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + try{caml_ml_flush(a);} + catch(_w_){ + var _v_ = caml_wrap_exception(_w_); + if(_v_[1] !== Sys_error) throw caml_maybe_attach_backtrace(_v_, 0); + } + var param$0 = l; + } + } + function output_bytes(oc, s){ + return caml_ml_output_bytes(oc, s, 0, caml_ml_bytes_length(s)); + } + function output_string(oc, s){ + return caml_ml_output(oc, s, 0, caml_ml_string_length(s)); + } + function output(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_output_bytes(oc, s, ofs, len); + return invalid_arg(cst_output); + } + function output_substring(oc, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(s) - len | 0) >= ofs) + return caml_ml_output(oc, s, ofs, len); + return invalid_arg(cst_output_substring); + } + function output_value(chan, v){ + return runtime.caml_output_value(chan, v, 0); + } + function close_out(oc){ + caml_ml_flush(oc); + return caml_ml_close_channel(oc); + } + function close_out_noerr(oc){ + try{caml_ml_flush(oc);}catch(_u_){} + try{var _s_ = caml_ml_close_channel(oc); return _s_;}catch(_t_){return 0;} + } + function open_in_gen(mode, perm, name){ + var c = caml_ml_open_descriptor_in(caml_sys_open(name, mode, perm)); + caml_ml_set_channel_name(c, name); + return c; + } + function open_in(name){return open_in_gen(_k_, 0, name);} + function open_in_bin(name){return open_in_gen(_l_, 0, name);} + function input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_ml_input(ic, s, ofs, len); + return invalid_arg(cst_input); + } + function unsafe_really_input(ic, s, ofs, len){ + var ofs$0 = ofs, len$0 = len; + for(;;){ + if(0 >= len$0) return 0; + var r = caml_ml_input(ic, s, ofs$0, len$0); + if(0 === r) throw caml_maybe_attach_backtrace(End_of_file, 1); + var + len$1 = len$0 - r | 0, + ofs$1 = ofs$0 + r | 0, + ofs$0 = ofs$1, + len$0 = len$1; + } + } + function really_input(ic, s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return unsafe_really_input(ic, s, ofs, len); + return invalid_arg(cst_really_input); + } + function really_input_string(ic, len){ + var s = caml_create_bytes(len); + really_input(ic, s, 0, len); + return caml_string_of_bytes(s); + } + function input_line(chan){ + function build_result(buf, pos, param){ + var pos$0 = pos, param$0 = param; + for(;;){ + if(! param$0) return buf; + var tl = param$0[2], hd = param$0[1], len = caml_ml_bytes_length(hd); + runtime.caml_blit_bytes(hd, 0, buf, pos$0 - len | 0, len); + var pos$1 = pos$0 - len | 0, pos$0 = pos$1, param$0 = tl; + } + } + var accu = 0, len = 0; + for(;;){ + var n = runtime.caml_ml_input_scan_line(chan); + if(0 === n){ + if(! accu) throw caml_maybe_attach_backtrace(End_of_file, 1); + var _r_ = build_result(caml_create_bytes(len), len, accu); + } + else{ + if(0 >= n){ + var beg = caml_create_bytes(- n | 0); + caml_ml_input(chan, beg, 0, - n | 0); + var + len$1 = len - n | 0, + accu$0 = [0, beg, accu], + accu = accu$0, + len = len$1; + continue; + } + var res = caml_create_bytes(n - 1 | 0); + caml_ml_input(chan, res, 0, n - 1 | 0); + caml_ml_input_char(chan); + if(accu) + var + len$0 = (len + n | 0) - 1 | 0, + _r_ = build_result(caml_create_bytes(len$0), len$0, [0, res, accu]); + else + var _r_ = res; + } + return caml_string_of_bytes(_r_); + } + } + function close_in_noerr(ic){ + try{var _p_ = caml_ml_close_channel(ic); return _p_;}catch(_q_){return 0;} + } + function print_char(c){return caml_ml_output_char(stdout, c);} + function print_string(s){return output_string(stdout, s);} + function print_bytes(s){return output_bytes(stdout, s);} + function print_int(i){return output_string(stdout, "" + i);} + function print_float(f){return output_string(stdout, string_of_float(f));} + function print_endline(s){ + output_string(stdout, s); + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function print_newline(param){ + caml_ml_output_char(stdout, 10); + return caml_ml_flush(stdout); + } + function prerr_char(c){return caml_ml_output_char(stderr, c);} + function prerr_string(s){return output_string(stderr, s);} + function prerr_bytes(s){return output_bytes(stderr, s);} + function prerr_int(i){return output_string(stderr, "" + i);} + function prerr_float(f){return output_string(stderr, string_of_float(f));} + function prerr_endline(s){ + output_string(stderr, s); + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function prerr_newline(param){ + caml_ml_output_char(stderr, 10); + return caml_ml_flush(stderr); + } + function read_line(param){caml_ml_flush(stdout); return input_line(stdin);} + function read_int(param){return caml_int_of_string(read_line(0));} + function read_int_opt(param){return int_of_string_opt(read_line(0));} + function read_float(param){return caml_float_of_string(read_line(0));} + function read_float_opt(param){return float_of_string_opt(read_line(0));} + function string_of_format(param){var str = param[2]; return str;} + function symbol$1(param, _n_){ + var + str2 = _n_[2], + fmt2 = _n_[1], + str1 = param[2], + fmt1 = param[1], + _o_ = symbol(str1, symbol(cst$0, str2)); + return [0, caml_call2(CamlinternalFormatBasics[3], fmt1, fmt2), _o_]; + } + var exit_function = [0, flush_all]; + function at_exit(f){ + for(;;){ + var + f_yet_to_run = [0, 1], + old_exit = caml_atomic_load(exit_function), + new_exit$0 = + function(f_yet_to_run, old_exit){ + function new_exit(param){ + if(caml_atomic_cas(f_yet_to_run, 1, 0)) caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return new_exit; + }, + new_exit = new_exit$0(f_yet_to_run, old_exit), + success = caml_atomic_cas(exit_function, old_exit, new_exit), + _m_ = 1 - success; + if(_m_) continue; + return _m_; + } + } + var do_domain_local_at_exit = [0, function(param){return 0;}]; + function do_at_exit(param){ + caml_call1(do_domain_local_at_exit[1], 0); + return caml_call1(caml_atomic_load(exit_function), 0); + } + function exit(retcode){ + do_at_exit(0); + return runtime.caml_sys_exit(retcode); + } + runtime.caml_register_named_value("Pervasives.do_at_exit", do_at_exit); + var + Stdlib = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + caml_ml_flush, + flush_all, + caml_ml_output_char, + output_string, + output_bytes, + output, + output_substring, + caml_ml_output_char, + runtime.caml_ml_output_int, + output_value, + runtime.caml_ml_seek_out, + runtime.caml_ml_pos_out, + caml_ml_channel_size, + close_out, + close_out_noerr, + caml_ml_set_binary_mode, + open_in, + open_in_bin, + open_in_gen, + caml_ml_input_char, + input_line, + input, + really_input, + really_input_string, + caml_ml_input_char, + runtime.caml_ml_input_int, + runtime.caml_input_value, + runtime.caml_ml_seek_in, + runtime.caml_ml_pos_in, + caml_ml_channel_size, + caml_ml_close_channel, + close_in_noerr, + caml_ml_set_binary_mode, + [0, + runtime.caml_ml_seek_out_64, + runtime.caml_ml_pos_out_64, + caml_ml_channel_size_64, + runtime.caml_ml_seek_in_64, + runtime.caml_ml_pos_in_64, + caml_ml_channel_size_64], + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(45, Stdlib, "Stdlib"); + return; + } + (globalThis)); + +//# 764 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + ocaml_version = "5.0.0", + ocaml_release = [0, 5, 0, 0, 0], + Stdlib = global_data.Stdlib, + executable_name = runtime.caml_sys_executable_name(0), + os_type = runtime.caml_sys_get_config(0)[1], + backend_type = [0, "js_of_ocaml"], + unix = runtime.caml_sys_const_ostype_unix(0), + win32 = runtime.caml_sys_const_ostype_win32(0), + cygwin = runtime.caml_sys_const_ostype_cygwin(0), + max_array_length = runtime.caml_sys_const_max_wosize(0), + max_floatarray_length = max_array_length / 2 | 0, + max_string_length = (4 * max_array_length | 0) - 1 | 0, + cst_Stdlib_Sys_Break = "Stdlib.Sys.Break", + big_endian = 0, + word_size = 32, + int_size = 32; + function getenv_opt(s){ + try{var _d_ = [0, runtime.caml_sys_getenv(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var interactive = [0, 0]; + function set_signal(sig_num, sig_beh){return 0;} + var + Break = [248, cst_Stdlib_Sys_Break, runtime.caml_fresh_oo_id(0)], + sigabrt = -1, + sigalrm = -2, + sigfpe = -3, + sighup = -4, + sigill = -5, + sigint = -6, + sigkill = -7, + sigpipe = -8, + sigquit = -9, + sigsegv = -10, + sigterm = -11, + sigusr1 = -12, + sigusr2 = -13, + sigchld = -14, + sigcont = -15, + sigstop = -16, + sigtstp = -17, + sigttin = -18, + sigttou = -19, + sigvtalrm = -20, + sigprof = -21, + sigbus = -22, + sigpoll = -23, + sigsys = -24, + sigtrap = -25, + sigurg = -26, + sigxcpu = -27, + sigxfsz = -28; + function catch_break(on){return on ? 0 : 0;} + var development_version = 0; + function Make(_b_, _a_){return [0, 1];} + var + Immediate64 = [0, Make], + Stdlib_Sys = + [0, + executable_name, + getenv_opt, + interactive, + os_type, + backend_type, + unix, + win32, + cygwin, + word_size, + int_size, + big_endian, + max_string_length, + max_array_length, + max_floatarray_length, + set_signal, + sigabrt, + sigalrm, + sigfpe, + sighup, + sigill, + sigint, + sigkill, + sigpipe, + sigquit, + sigsegv, + sigterm, + sigusr1, + sigusr2, + sigchld, + sigcont, + sigstop, + sigtstp, + sigttin, + sigttou, + sigvtalrm, + sigprof, + sigbus, + sigpoll, + sigsys, + sigtrap, + sigurg, + sigxcpu, + sigxfsz, + Break, + catch_break, + ocaml_version, + development_version, + ocaml_release, + runtime.caml_ml_enable_runtime_warnings, + runtime.caml_ml_runtime_warnings_enabled, + Immediate64]; + runtime.caml_register_global(4, Stdlib_Sys, "Stdlib__Sys"); + return; + } + (globalThis)); + +//# 893 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Obj_extension_constructor$1 = "Obj.extension_constructor", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Obj_Ephemeron_blit_key = "Obj.Ephemeron.blit_key", + cst_Obj_Ephemeron_check_key = "Obj.Ephemeron.check_key", + cst_Obj_Ephemeron_unset_key = "Obj.Ephemeron.unset_key", + cst_Obj_Ephemeron_set_key = "Obj.Ephemeron.set_key", + cst_Obj_Ephemeron_get_key_copy = "Obj.Ephemeron.get_key_copy", + cst_Obj_Ephemeron_get_key = "Obj.Ephemeron.get_key", + cst_Obj_Ephemeron_create = "Obj.Ephemeron.create", + cst_Obj_extension_constructor$0 = cst_Obj_extension_constructor$1, + cst_Obj_extension_constructor = cst_Obj_extension_constructor$1, + _a_ = [0, "obj.ml", 97, 4]; + function is_block(a){return 1 - (typeof a === "number" ? 1 : 0);} + var + double_field = runtime.caml_array_get, + set_double_field = runtime.caml_array_set, + first_non_constant_constructor = 0, + last_non_constant_constructor_ = 243, + forcing_tag = 244, + cont_tag = 245, + lazy_tag = 246, + closure_tag = 247, + object_tag = 248, + infix_tag = 249, + forward_tag = 250, + no_scan_tag = 251, + abstract_tag = 251, + string_tag = 252, + double_tag = 253, + double_array_tag = 254, + custom_tag = 255, + int_tag = 1000, + out_of_heap_tag = 1001, + unaligned_tag = 1002; + function info(obj){ + if(caml_obj_tag(obj) !== 247) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + info = runtime.caml_obj_raw_field(obj, 1), + arity = 64 === Stdlib_Sys[9] ? info >> 56 : info >> 24, + start_env = info << 8 >>> 9 | 0; + return [0, arity, start_env]; + } + function of_val(x){ + var switch$0 = 0; + if(is_block(x) && caml_obj_tag(x) !== 248 && 1 <= x.length - 1){var slot = x[1]; switch$0 = 1;} + if(! switch$0) var slot = x; + var switch$1 = 0; + if(is_block(slot) && caml_obj_tag(slot) === 248){var name = slot[1]; switch$1 = 1;} + if(! switch$1) + var name = caml_call1(Stdlib[1], cst_Obj_extension_constructor$0); + return caml_obj_tag(name) === 252 + ? slot + : caml_call1(Stdlib[1], cst_Obj_extension_constructor); + } + function name(slot){return slot[1];} + function id(slot){return slot[2];} + var + Extension_constructor = [0, of_val, name, id], + max_ephe_length = Stdlib_Sys[13] - 2 | 0; + function create(l){ + var _g_ = 0 <= l ? 1 : 0, _h_ = _g_ ? l <= max_ephe_length ? 1 : 0 : _g_; + if(1 - _h_) caml_call1(Stdlib[1], cst_Obj_Ephemeron_create); + return runtime.caml_ephe_create(l); + } + function length(x){return x.length - 1 - 2 | 0;} + function raise_if_invalid_offset(e, o, msg){ + var + _d_ = 0 <= o ? 1 : 0, + _e_ = _d_ ? o < length(e) ? 1 : 0 : _d_, + _f_ = 1 - _e_; + return _f_ ? caml_call1(Stdlib[1], msg) : _f_; + } + function get_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key); + return runtime.caml_ephe_get_key(e, o); + } + function get_key_copy(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_get_key_copy); + return runtime.caml_ephe_get_key_copy(e, o); + } + function set_key(e, o, x){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_set_key); + return runtime.caml_ephe_set_key(e, o, x); + } + function unset_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_unset_key); + return runtime.caml_ephe_unset_key(e, o); + } + function check_key(e, o){ + raise_if_invalid_offset(e, o, cst_Obj_Ephemeron_check_key); + return runtime.caml_ephe_check_key(e, o); + } + function blit_key(e1, o1, e2, o2, l){ + if + (0 <= l + && + 0 <= o1 + && (length(e1) - l | 0) >= o1 && 0 <= o2 && (length(e2) - l | 0) >= o2){ + var + _b_ = 0 !== l ? 1 : 0, + _c_ = _b_ ? runtime.caml_ephe_blit_key(e1, o1, e2, o2, l) : _b_; + return _c_; + } + return caml_call1(Stdlib[1], cst_Obj_Ephemeron_blit_key); + } + var + Stdlib_Obj = + [0, + is_block, + double_field, + set_double_field, + first_non_constant_constructor, + last_non_constant_constructor_, + forcing_tag, + cont_tag, + lazy_tag, + closure_tag, + object_tag, + infix_tag, + forward_tag, + no_scan_tag, + abstract_tag, + string_tag, + double_tag, + double_array_tag, + custom_tag, + int_tag, + out_of_heap_tag, + unaligned_tag, + [0, info], + Extension_constructor, + [0, + create, + length, + get_key, + get_key_copy, + set_key, + unset_key, + check_key, + blit_key, + runtime.caml_ephe_get_data, + runtime.caml_ephe_get_data_copy, + runtime.caml_ephe_set_data, + runtime.caml_ephe_unset_data, + runtime.caml_ephe_check_data, + runtime.caml_ephe_blit_data, + max_ephe_length]]; + runtime.caml_register_global(13, Stdlib_Obj, "Stdlib__Obj"); + return; + } + (globalThis)); + +//# 1063 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_atomic_exchange = runtime.caml_atomic_exchange, + caml_atomic_fetch_add = runtime.caml_atomic_fetch_add; + function set(r, x){caml_atomic_exchange(r, x); return 0;} + function incr(r){caml_atomic_fetch_add(r, 1); return 0;} + function decr(r){caml_atomic_fetch_add(r, -1); return 0;} + var + _a_ = caml_atomic_fetch_add, + _b_ = runtime.caml_atomic_cas, + _c_ = caml_atomic_exchange, + _d_ = runtime.caml_atomic_load, + Stdlib_Atomic = + [0, + function(_e_){return [0, _e_];}, + _d_, + set, + _c_, + _b_, + _a_, + incr, + decr]; + runtime.caml_register_global(0, Stdlib_Atomic, "Stdlib__Atomic"); + return; + } + (globalThis)); + +//# 1094 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_lazy_update_to_forward = runtime.caml_lazy_update_to_forward, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = + [248, "CamlinternalLazy.Undefined", runtime.caml_fresh_oo_id(0)]; + function force_gen_lazy_block(only_val, blk){ + if(0 !== runtime.caml_lazy_update_to_forcing(blk)) + throw caml_maybe_attach_backtrace(Undefined, 1); + if(only_val){ + var closure$0 = blk[1]; + blk[1] = 0; + var result$0 = caml_call1(closure$0, 0); + blk[1] = result$0; + caml_lazy_update_to_forward(blk); + return result$0; + } + var closure = blk[1]; + blk[1] = 0; + try{ + var result = caml_call1(closure, 0); + blk[1] = result; + caml_lazy_update_to_forward(blk); + return result; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + blk[1] = function(param){throw caml_maybe_attach_backtrace(e, 0);}; + runtime.caml_lazy_reset_to_lazy(blk); + throw caml_maybe_attach_backtrace(e, 0); + } + } + function force_lazy_block(blk){return force_gen_lazy_block(0, blk);} + function force_gen(only_val, lzv){ + var t = runtime.caml_obj_tag(lzv); + if(t === Stdlib_Obj[12]) return lzv[1]; + if(t === Stdlib_Obj[6]) throw caml_maybe_attach_backtrace(Undefined, 1); + return t !== Stdlib_Obj[8] ? lzv : force_gen_lazy_block(only_val, lzv); + } + var CamlinternalLazy = [0, Undefined, force_lazy_block, force_gen]; + runtime.caml_register_global(2, CamlinternalLazy, "CamlinternalLazy"); + return; + } + (globalThis)); + +//# 1153 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Obj = global_data.Stdlib__Obj, + Undefined = CamlinternalLazy[1]; + function force_val(l){return caml_call2(CamlinternalLazy[3], 1, l);} + function from_fun(f){ + var x = runtime.caml_obj_block(Stdlib_Obj[8], 1); + x[1] = f; + return x; + } + function from_val(v){ + var t = caml_obj_tag(v); + if + (t !== Stdlib_Obj[12] + && t !== Stdlib_Obj[8] && t !== Stdlib_Obj[6] && t !== Stdlib_Obj[16]) + return v; + return runtime.caml_lazy_make_forward(v); + } + function is_val(l){ + var _i_ = Stdlib_Obj[8]; + return caml_obj_tag(l) !== _i_ ? 1 : 0; + } + function map(f, x){ + return [246, + function(_f_){ + var _g_ = caml_obj_tag(x); + if(250 === _g_) + var _h_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _g_ && 244 !== _g_){var _h_ = x; switch$0 = 1;} + if(! switch$0) var _h_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _h_); + }]; + } + function map_val(f, x){ + if(! is_val(x)) + return [246, + function(_c_){ + var _d_ = caml_obj_tag(x); + if(250 === _d_) + var _e_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = x; switch$0 = 1;} + if(! switch$0) var _e_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call1(f, _e_); + }]; + var _a_ = caml_obj_tag(x); + if(250 === _a_) + var _b_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _a_ && 244 !== _a_){var _b_ = x; switch$0 = 1;} + if(! switch$0) var _b_ = caml_call1(CamlinternalLazy[2], x); + } + return from_val(caml_call1(f, _b_)); + } + var + Stdlib_Lazy = + [0, Undefined, map, is_val, from_val, map_val, from_fun, force_val]; + runtime.caml_register_global(2, Stdlib_Lazy, "Stdlib__Lazy"); + return; + } + (globalThis)); + +//# 1238 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Atomic = global_data.Stdlib__Atomic, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib = global_data.Stdlib, + Stdlib_Lazy = global_data.Stdlib__Lazy, + _a_ = [0, "seq.ml", 596, 4], + cst_Seq_drop = "Seq.drop", + cst_Seq_take = "Seq.take", + cst_Seq_init = "Seq.init", + cst_Stdlib_Seq_Forced_twice = "Stdlib.Seq.Forced_twice"; + function empty(param){return 0;} + function return$0(x, param){return [0, x, empty];} + function cons(x, next, param){return [0, x, next];} + function append(seq1, seq2, param){ + var match = caml_call1(seq1, 0); + if(! match) return caml_call1(seq2, 0); + var next = match[2], x = match[1]; + return [0, x, function(_aM_){return append(next, seq2, _aM_);}]; + } + function map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + function _aK_(_aL_){return map(f, next, _aL_);} + return [0, caml_call1(f, x), _aK_]; + } + function filter_map(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1], match$0 = caml_call1(f, x); + if(match$0){ + var y = match$0[1]; + return [0, y, function(_aJ_){return filter_map(f, next, _aJ_);}]; + } + var seq$0 = next; + } + } + function filter(f, seq, param){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + if(caml_call1(f, x)) + return [0, x, function(_aI_){return filter(f, next, _aI_);}]; + var seq$0 = next; + } + } + function concat(seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aG_ = 0; + return append(x, function(_aH_){return concat(next, _aH_);}, _aG_); + } + function flat_map(f, seq, param){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1], _aD_ = 0; + function _aE_(_aF_){return flat_map(f, next, _aF_);} + return append(caml_call1(f, x), _aE_, _aD_); + } + function fold_left(f, acc, seq){ + var acc$0 = acc, seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return acc$0; + var + next = match[2], + x = match[1], + acc$1 = caml_call2(f, acc$0, x), + acc$0 = acc$1, + seq$0 = next; + } + } + function iter(f, seq){ + var seq$0 = seq; + for(;;){ + var match = caml_call1(seq$0, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + caml_call1(f, x); + var seq$0 = next; + } + } + function unfold(f, u, param){ + var match = caml_call1(f, u); + if(! match) return 0; + var match$0 = match[1], u$0 = match$0[2], x = match$0[1]; + return [0, x, function(_aC_){return unfold(f, u$0, _aC_);}]; + } + function is_empty(xs){return caml_call1(xs, 0) ? 0 : 1;} + function uncons(xs){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, [0, x, xs$0]]; + } + function length(xs$1){ + var accu = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var xs$0 = match[2], accu$0 = accu + 1 | 0, accu = accu$0, xs = xs$0; + } + } + function iteri(f, xs$1){ + var i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + caml_call2(f, i, x); + var i$0 = i + 1 | 0, i = i$0, xs = xs$0; + } + } + function fold_lefti(f, accu$1, xs$1){ + var accu = accu$1, i = 0, xs = xs$1; + for(;;){ + var match = caml_call1(xs, 0); + if(! match) return accu; + var + xs$0 = match[2], + x = match[1], + accu$0 = caml_call3(f, accu, i, x), + i$0 = i + 1 | 0, + accu = accu$0, + i = i$0, + xs = xs$0; + } + } + function for_all(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], _aB_ = caml_call1(p, x); + if(! _aB_) return _aB_; + var xs$0 = xs$1; + } + } + function exists(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], _aA_ = caml_call1(p, x); + if(_aA_) return _aA_; + var xs$0 = xs$1; + } + } + function find(p, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1]; + if(caml_call1(p, x)) return [0, x]; + var xs$0 = xs$1; + } + } + function find_map(f, xs){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], result = caml_call1(f, x); + if(result) return result; + var xs$0 = xs$1; + } + } + function iter2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1]; + caml_call2(f, x, y); + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function fold_left2(f, accu, xs, ys){ + var accu$0 = accu, xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return accu$0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return accu$0; + var + ys$1 = match$0[2], + y = match$0[1], + accu$1 = caml_call3(f, accu$0, x, y), + accu$0 = accu$1, + xs$0 = xs$1, + ys$0 = ys$1; + } + } + function for_all2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 1; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], _az_ = caml_call2(f, x, y); + if(! _az_) return _az_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function exists2(f, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(ys$0, 0); + if(! match$0) return 0; + var ys$1 = match$0[2], y = match$0[1], _ay_ = caml_call2(f, x, y); + if(_ay_) return _ay_; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function equal(eq, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(match){ + if(match$0){ + var + ys$1 = match$0[2], + y = match$0[1], + xs$1 = match[2], + x = match[1], + _ax_ = caml_call2(eq, x, y); + if(! _ax_) return _ax_; + var xs$0 = xs$1, ys$0 = ys$1; + continue; + } + } + else if(! match$0) return 1; + return 0; + } + } + function compare(cmp, xs, ys){ + var xs$0 = xs, ys$0 = ys; + for(;;){ + var match = caml_call1(xs$0, 0), match$0 = caml_call1(ys$0, 0); + if(! match) return match$0 ? -1 : 0; + var xs$1 = match[2], x = match[1]; + if(! match$0) return 1; + var ys$1 = match$0[2], y = match$0[1], c = caml_call2(cmp, x, y); + if(0 !== c) return c; + var xs$0 = xs$1, ys$0 = ys$1; + } + } + function init_aux(f, i, j, param){ + if(i >= j) return 0; + var _au_ = i + 1 | 0; + function _av_(_aw_){return init_aux(f, _au_, j, _aw_);} + return [0, caml_call1(f, i), _av_]; + } + function init(n, f){ + if(0 > n) return caml_call1(Stdlib[1], cst_Seq_init); + var _as_ = 0; + return function(_at_){return init_aux(f, _as_, n, _at_);}; + } + function repeat(x, param){ + return [0, x, function(_ar_){return repeat(x, _ar_);}]; + } + function forever(f, param){ + function _ap_(_aq_){return forever(f, _aq_);} + return [0, caml_call1(f, 0), _ap_]; + } + function cycle_nonempty(xs, param){ + var _an_ = 0; + return append(xs, function(_ao_){return cycle_nonempty(xs, _ao_);}, _an_); + } + function cycle(xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + function _ak_(_am_){return cycle_nonempty(xs, _am_);} + return [0, x, function(_al_){return append(xs$0, _ak_, _al_);}]; + } + function iterate1(f, x, param){ + var y = caml_call1(f, x); + return [0, y, function(_aj_){return iterate1(f, y, _aj_);}]; + } + function iterate(f, x){ + function _ag_(_ai_){return iterate1(f, x, _ai_);} + return function(_ah_){return [0, x, _ag_];}; + } + function mapi_aux(f, i, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _ad_ = i + 1 | 0; + function _ae_(_af_){return mapi_aux(f, _ad_, xs$0, _af_);} + return [0, caml_call2(f, i, x), _ae_]; + } + function mapi(f, xs){ + var _ab_ = 0; + return function(_ac_){return mapi_aux(f, _ab_, xs, _ac_);}; + } + function tail_scan(f, s, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], s$0 = caml_call2(f, s, x); + return [0, s$0, function(_aa_){return tail_scan(f, s$0, xs$0, _aa_);}]; + } + function scan(f, s, xs){ + function _Z_(_$_){return tail_scan(f, s, xs, _$_);} + return function(___){return [0, s, _Z_];}; + } + function take_aux(n, xs){ + return 0 === n + ? empty + : function + (param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, take_aux(n - 1 | 0, xs$0)]; + }; + } + function take(n, xs){ + if(n < 0) caml_call1(Stdlib[1], cst_Seq_take); + return take_aux(n, xs); + } + function drop(n, xs){ + return 0 <= n + ? 0 + === n + ? xs + : function + (param){ + var n$0 = n, xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], n$1 = n$0 - 1 | 0; + if(0 === n$1) return caml_call1(xs$1, 0); + var n$0 = n$1, xs$0 = xs$1; + } + } + : caml_call1(Stdlib[1], cst_Seq_drop); + } + function take_while(p, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return caml_call1(p, x) + ? [0, x, function(_Y_){return take_while(p, xs$0, _Y_);}] + : 0; + } + function drop_while(p, xs, param){ + var xs$0 = xs; + for(;;){ + var node = caml_call1(xs$0, 0); + if(! node) return 0; + var xs$1 = node[2], x = node[1]; + if(! caml_call1(p, x)) return node; + var xs$0 = xs$1; + } + } + function group(eq, xs, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], _P_ = caml_call1(eq, x); + function _Q_(_X_){return drop_while(_P_, xs$0, _X_);} + function _R_(_W_){return group(eq, _Q_, _W_);} + var _S_ = caml_call1(eq, x); + function _T_(_V_){return take_while(_S_, xs$0, _V_);} + return [0, function(_U_){return [0, x, _T_];}, _R_]; + } + var + Forced_twice = + [248, cst_Stdlib_Seq_Forced_twice, runtime.caml_fresh_oo_id(0)], + to_lazy = Stdlib_Lazy[6]; + function failure(param){ + throw caml_maybe_attach_backtrace(Forced_twice, 1); + } + function memoize(xs){ + function s$0(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, memoize(xs$0)]; + } + var s = caml_call1(to_lazy, s$0); + return function(_O_){ + var _N_ = runtime.caml_obj_tag(s); + if(250 === _N_) return s[1]; + if(246 !== _N_ && 244 !== _N_) return s; + return caml_call1(CamlinternalLazy[2], s);}; + } + function once(xs){ + function f(param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1]; + return [0, x, once(xs$0)]; + } + var action = caml_call1(Stdlib_Atomic[1], f); + return function(param){ + var f = caml_call2(Stdlib_Atomic[4], action, failure); + return caml_call1(f, 0);}; + } + function zip(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + return [0, [0, x, y], function(_M_){return zip(xs$0, ys$0, _M_);}]; + } + function map2(f, xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return 0; + var xs$0 = match[2], x = match[1], match$0 = caml_call1(ys, 0); + if(! match$0) return 0; + var ys$0 = match$0[2], y = match$0[1]; + function _K_(_L_){return map2(f, xs$0, ys$0, _L_);} + return [0, caml_call2(f, x, y), _K_]; + } + function interleave(xs, ys, param){ + var match = caml_call1(xs, 0); + if(! match) return caml_call1(ys, 0); + var xs$0 = match[2], x = match[1]; + return [0, x, function(_J_){return interleave(ys, xs$0, _J_);}]; + } + function sorted_merge1(cmp, x, xs, y, ys){ + return 0 < caml_call2(cmp, x, y) + ? [0, + y, + function(_H_){ + var match = caml_call1(ys, 0); + if(! match) return [0, x, xs]; + var ys$0 = match[2], y = match[1]; + return sorted_merge1(cmp, x, xs, y, ys$0); + }] + : [0, + x, + function(_I_){ + var match = caml_call1(xs, 0); + if(! match) return [0, y, ys]; + var xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys); + }]; + } + function sorted_merge(cmp, xs, ys, param){ + var match = caml_call1(xs, 0), match$0 = caml_call1(ys, 0); + if(match){ + if(match$0){ + var ys$0 = match$0[2], y = match$0[1], xs$0 = match[2], x = match[1]; + return sorted_merge1(cmp, x, xs$0, y, ys$0); + } + var c = match; + } + else{if(! match$0) return 0; var c = match$0;} + return c; + } + function map_fst(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], x = match[1][1]; + return [0, x, function(_G_){return map_fst(xys$0, _G_);}]; + } + function map_snd(xys, param){ + var match = caml_call1(xys, 0); + if(! match) return 0; + var xys$0 = match[2], y = match[1][2]; + return [0, y, function(_F_){return map_snd(xys$0, _F_);}]; + } + function unzip(xys){ + function _C_(_E_){return map_snd(xys, _E_);} + return [0, function(_D_){return map_fst(xys, _D_);}, _C_]; + } + function filter_map_find_left_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){ + var y = match$0[1]; + return [0, + y, + function(_B_){return filter_map_find_left_map(f, xs$1, _B_);}]; + } + var xs$0 = xs$1; + } + } + function filter_map_find_right_map(f, xs, param){ + var xs$0 = xs; + for(;;){ + var match = caml_call1(xs$0, 0); + if(! match) return 0; + var xs$1 = match[2], x = match[1], match$0 = caml_call1(f, x); + if(0 === match$0[0]){var xs$0 = xs$1; continue;} + var z = match$0[1]; + return [0, + z, + function(_A_){return filter_map_find_right_map(f, xs$1, _A_);}]; + } + } + function partition_map(f, xs){ + function _x_(_z_){return filter_map_find_right_map(f, xs, _z_);} + return [0, + function(_y_){return filter_map_find_left_map(f, xs, _y_);}, + _x_]; + } + function partition(p, xs){ + function _t_(x){return 1 - caml_call1(p, x);} + function _u_(_w_){return filter(_t_, xs, _w_);} + return [0, function(_v_){return filter(p, xs, _v_);}, _u_]; + } + function peel(xss){ + return unzip(function(_s_){return filter_map(uncons, xss, _s_);}); + } + function transpose(xss, param){ + var match = peel(xss), tails = match[2], heads = match[1]; + if(! is_empty(heads)) + return [0, heads, function(_r_){return transpose(tails, _r_);}]; + if(is_empty(tails)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function _b_(remainders, xss, param){ + var match = caml_call1(xss, 0); + if(! match) return transpose(remainders, 0); + var xss$0 = match[2], xs = match[1], match$0 = caml_call1(xs, 0); + if(match$0){ + var + xs$0 = match$0[2], + x = match$0[1], + match$1 = peel(remainders), + tails = match$1[2], + heads = match$1[1], + _l_ = function(_q_){return [0, xs$0, tails];}, + _m_ = function(_p_){return _b_(_l_, xss$0, _p_);}; + return [0, function(_o_){return [0, x, heads];}, _m_]; + } + var + match$2 = peel(remainders), + tails$0 = match$2[2], + heads$0 = match$2[1]; + return [0, heads$0, function(_n_){return _b_(tails$0, xss$0, _n_);}]; + } + function map_product(f, xs, ys){ + function _f_(x){ + function _j_(y){return caml_call2(f, x, y);} + return function(_k_){return map(_j_, ys, _k_);}; + } + function xss(_i_){return map(_f_, xs, _i_);} + function _e_(_h_){return _b_(empty, xss, _h_);} + return function(_g_){return concat(_e_, _g_);}; + } + function product(xs, ys){ + return map_product(function(x, y){return [0, x, y];}, xs, ys); + } + function of_dispenser(it){ + function c(param){ + var match = caml_call1(it, 0); + if(! match) return 0; + var x = match[1]; + return [0, x, c]; + } + return c; + } + function to_dispenser(xs){ + var s = [0, xs]; + return function(param){ + var match = caml_call1(s[1], 0); + if(! match) return 0; + var xs = match[2], x = match[1]; + s[1] = xs; + return [0, x];}; + } + function ints(i, param){ + var _c_ = i + 1 | 0; + return [0, i, function(_d_){return ints(_c_, _d_);}]; + } + var + Stdlib_Seq = + [0, + is_empty, + uncons, + length, + iter, + fold_left, + iteri, + fold_lefti, + for_all, + exists, + find, + find_map, + iter2, + fold_left2, + for_all2, + exists2, + equal, + compare, + empty, + return$0, + cons, + init, + unfold, + repeat, + forever, + cycle, + iterate, + map, + mapi, + filter, + filter_map, + scan, + take, + drop, + take_while, + drop_while, + group, + memoize, + Forced_twice, + once, + transpose, + append, + concat, + flat_map, + flat_map, + zip, + map2, + interleave, + sorted_merge, + product, + map_product, + unzip, + unzip, + partition_map, + partition, + of_dispenser, + to_dispenser, + ints]; + runtime.caml_register_global(10, Stdlib_Seq, "Stdlib__Seq"); + return; + } + (globalThis)); + +//# 2020 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + cst_result_is_Ok = "result is Ok _", + cst_result_is_Error = "result is Error _"; + function ok(v){return [0, v];} + function error(e){return [1, e];} + function value(r, default$0){ + if(0 !== r[0]) return default$0; + var v = r[1]; + return v; + } + function get_ok(param){ + if(0 !== param[0]) return caml_call1(Stdlib[1], cst_result_is_Error); + var v = param[1]; + return v; + } + function get_error(param){ + if(0 === param[0]) return caml_call1(Stdlib[1], cst_result_is_Ok); + var e = param[1]; + return e; + } + function bind(r, f){ + if(0 !== r[0]) return r; + var v = r[1]; + return caml_call1(f, v); + } + function join(e){if(0 !== e[0]) return e; var r = e[1]; return r;} + function map(f, e){ + if(0 !== e[0]) return e; + var v = e[1]; + return [0, caml_call1(f, v)]; + } + function map_error(f, v){ + if(0 === v[0]) return v; + var e = v[1]; + return [1, caml_call1(f, e)]; + } + function fold(ok, error, param){ + if(0 === param[0]){var v = param[1]; return caml_call1(ok, v);} + var e = param[1]; + return caml_call1(error, e); + } + function iter(f, param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return caml_call1(f, v); + } + function iter_error(f, param){ + if(0 === param[0]) return 0; + var e = param[1]; + return caml_call1(f, e); + } + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function equal(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 === r1[0]){var v1 = r1[1]; return caml_call2(ok, v0, v1);} + } + else{ + var e0 = r0[1]; + if(0 !== r1[0]){var e1 = r1[1]; return caml_call2(error, e0, e1);} + } + return 0; + } + function compare(ok, error, r0, r1){ + if(0 === r0[0]){ + var v0 = r0[1]; + if(0 !== r1[0]) return -1; + var v1 = r1[1]; + return caml_call2(ok, v0, v1); + } + var e0 = r0[1]; + if(0 === r1[0]) return 1; + var e1 = r1[1]; + return caml_call2(error, e0, e1); + } + function to_option(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v]; + } + function to_list(param){ + if(0 !== param[0]) return 0; + var v = param[1]; + return [0, v, 0]; + } + function to_seq(param){ + if(0 !== param[0]) return Stdlib_Seq[18]; + var v = param[1]; + return caml_call1(Stdlib_Seq[19], v); + } + var + Stdlib_Result = + [0, + ok, + error, + value, + get_ok, + get_error, + bind, + join, + map, + map_error, + fold, + iter, + iter_error, + is_ok, + is_error, + equal, + compare, + to_option, + to_list, + to_seq]; + runtime.caml_register_global(4, Stdlib_Result, "Stdlib__Result"); + return; + } + (globalThis)); + +//# 2183 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_string_of_bytes = runtime.caml_string_of_bytes; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "\\\\", + cst$0 = "\\'", + Stdlib = global_data.Stdlib, + cst_b = "\\b", + cst_t = "\\t", + cst_n = "\\n", + cst_r = "\\r", + cst_Char_chr = "Char.chr"; + function chr(n){ + if(0 <= n && 255 >= n) return n; + return caml_call1(Stdlib[1], cst_Char_chr); + } + function escaped(c){ + var switch$0 = 0; + if(40 <= c){ + if(92 === c) return cst; + if(127 > c) switch$0 = 1; + } + else if(32 <= c){ + if(39 <= c) return cst$0; + switch$0 = 1; + } + else if(14 > c) + switch(c){ + case 8: + return cst_b; + case 9: + return cst_t; + case 10: + return cst_n; + case 13: + return cst_r; + } + if(switch$0){ + var s$0 = caml_create_bytes(1); + caml_bytes_unsafe_set(s$0, 0, c); + return caml_string_of_bytes(s$0); + } + var s = caml_create_bytes(4); + caml_bytes_unsafe_set(s, 0, 92); + caml_bytes_unsafe_set(s, 1, 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s, 2, 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s, 3, 48 + (c % 10 | 0) | 0); + return caml_string_of_bytes(s); + } + function lowercase_ascii(c){return 25 < c - 65 >>> 0 ? c : c + 32 | 0;} + function uppercase_ascii(c){return 25 < c - 97 >>> 0 ? c : c - 32 | 0;} + function compare(c1, c2){return c1 - c2 | 0;} + function equal(c1, c2){return 0 === (c1 - c2 | 0) ? 1 : 0;} + var + Stdlib_Char = + [0, chr, escaped, lowercase_ascii, uppercase_ascii, compare, equal]; + runtime.caml_register_global(8, Stdlib_Char, "Stdlib__Char"); + return; + } + (globalThis)); + +//# 2257 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_uchar_ml = "uchar.ml", + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + err_no_pred = "U+0000 has no predecessor", + err_no_succ = "U+10FFFF has no successor", + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + _d_ = [0, cst_uchar_ml, 88, 18], + _c_ = [0, cst_uchar_ml, 91, 7], + _b_ = [0, cst_uchar_ml, 80, 18], + _a_ = [0, cst_uchar_ml, 85, 7], + cst_is_not_a_latin1_character = " is not a latin1 character", + cst_U = "U+", + cst_is_not_an_Unicode_scalar_v = " is not an Unicode scalar value", + min = 0, + max = 1114111, + lo_bound = 55295, + hi_bound = 57344, + bom = 65279, + rep = 65533; + function succ(u){ + return u === 55295 + ? hi_bound + : u === 1114111 ? caml_call1(Stdlib[1], err_no_succ) : u + 1 | 0; + } + function pred(u){ + return u === 57344 + ? lo_bound + : u === 0 ? caml_call1(Stdlib[1], err_no_pred) : u - 1 | 0; + } + function is_valid(i){ + var _o_ = 0 <= i ? 1 : 0, _p_ = _o_ ? i <= 55295 ? 1 : 0 : _o_; + if(_p_) + var _q_ = _p_; + else + var _r_ = 57344 <= i ? 1 : 0, _q_ = _r_ ? i <= 1114111 ? 1 : 0 : _r_; + return _q_; + } + function of_int(i){ + if(is_valid(i)) return i; + var + _n_ = + caml_call2 + (Stdlib[28], caml_format_int("%X", i), cst_is_not_an_Unicode_scalar_v); + return caml_call1(Stdlib[1], _n_); + } + function is_char(u){return u < 256 ? 1 : 0;} + function of_char(c){return c;} + function to_char(u){ + if(255 >= u) return u; + var + _l_ = + caml_call2 + (Stdlib[28], + caml_format_int("%04X", u), + cst_is_not_a_latin1_character), + _m_ = caml_call2(Stdlib[28], cst_U, _l_); + return caml_call1(Stdlib[1], _m_); + } + function unsafe_to_char(_k_){return _k_;} + function equal(_j_, _i_){return _j_ === _i_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function hash(_h_){return _h_;} + function utf_decode_is_valid(d){return 1 === (d >>> 27 | 0) ? 1 : 0;} + function utf_decode_length(d){return (d >>> 24 | 0) & 7;} + function utf_decode_uchar(d){return d & 16777215;} + function utf_decode(n, u){return (8 | n) << 24 | u;} + function utf_decode_invalid(n){return n << 24 | 65533;} + function utf_8_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u) return 1; + if(2047 >= u) return 2; + if(65535 >= u) return 3; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return 4; + } + function utf_16_byte_length(u){ + if(0 > u) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u) return 2; + if(1114111 < u) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 4; + } + function _e_(_g_){return _g_;} + var + Stdlib_Uchar = + [0, + min, + max, + bom, + rep, + succ, + pred, + is_valid, + of_int, + function(_f_){return _f_;}, + _e_, + is_char, + of_char, + to_char, + unsafe_to_char, + equal, + compare, + hash, + utf_decode_is_valid, + utf_decode_uchar, + utf_decode_length, + utf_decode, + utf_decode_invalid, + utf_8_byte_length, + utf_16_byte_length]; + runtime.caml_register_global(13, Stdlib_Uchar, "Stdlib__Uchar"); + return; + } + (globalThis)); + +//# 2393 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_List_nth$1 = "List.nth", + caml_compare = runtime.caml_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_List_map2 = "List.map2", + cst_List_iter2 = "List.iter2", + cst_List_fold_left2 = "List.fold_left2", + cst_List_fold_right2 = "List.fold_right2", + cst_List_for_all2 = "List.for_all2", + cst_List_exists2 = "List.exists2", + _b_ = [0, 0, 0], + cst_List_combine = "List.combine", + cst_List_rev_map2 = "List.rev_map2", + cst_List_init = "List.init", + cst_List_nth$0 = cst_List_nth$1, + cst_nth = "nth", + cst_List_nth = cst_List_nth$1, + cst_tl = "tl", + cst_hd = "hd"; + function length(l$0){ + var len = 0, param = l$0; + for(;;){ + if(! param) return len; + var l = param[2], len$0 = len + 1 | 0, len = len$0, param = l; + } + } + function cons(a, l){return [0, a, l];} + function hd(param){ + if(! param) return caml_call1(Stdlib[2], cst_hd); + var a = param[1]; + return a; + } + function tl(param){ + if(! param) return caml_call1(Stdlib[2], cst_tl); + var l = param[2]; + return l; + } + function nth(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return caml_call1(Stdlib[2], cst_nth); + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return a; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function nth_opt(l, n){ + if(0 > n) return caml_call1(Stdlib[1], cst_List_nth$0); + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0; + var l$1 = l$0[2], a = l$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + var append = Stdlib[37]; + function rev_append(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + a = l1$0[1], + l2$1 = [0, a, l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function rev(l){return rev_append(l, 0);} + function init_aux(i, n, f){ + if(n <= i) return 0; + var r = caml_call1(f, i); + return [0, r, init_aux(i + 1 | 0, n, f)]; + } + var rev_init_threshold = typeof Stdlib_Sys[5] === "number" ? 10000 : 50; + function init(len, f){ + if(0 > len) return caml_call1(Stdlib[1], cst_List_init); + if(rev_init_threshold >= len) return init_aux(0, len, f); + var acc = 0, i = 0; + for(;;){ + if(len <= i) return rev(acc); + var + i$0 = i + 1 | 0, + acc$0 = [0, caml_call1(f, i), acc], + acc = acc$0, + i = i$0; + } + } + function flatten(param){ + if(! param) return 0; + var r = param[2], l = param[1], _J_ = flatten(r); + return caml_call2(Stdlib[37], l, _J_); + } + function map(f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call1(f, a); + return [0, r, map(f, l)]; + } + function _a_(i, f, param){ + if(! param) return 0; + var l = param[2], a = param[1], r = caml_call2(f, i, a); + return [0, r, _a_(i + 1 | 0, f, l)]; + } + function mapi(f, l){return _a_(0, f, l);} + function rev_map(f, l){ + var accu = 0, param = l; + for(;;){ + if(! param) return accu; + var + l$0 = param[2], + a = param[1], + accu$0 = [0, caml_call1(f, a), accu], + accu = accu$0, + param = l$0; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1]; + caml_call1(f, a); + var param$0 = l; + } + } + function iteri(f, l$0){ + var i = 0, param = l$0; + for(;;){ + if(! param) return 0; + var l = param[2], a = param[1]; + caml_call2(f, i, a); + var i$0 = i + 1 | 0, i = i$0, param = l; + } + } + function fold_left(f, accu, l){ + var accu$0 = accu, l$0 = l; + for(;;){ + if(! l$0) return accu$0; + var + l$1 = l$0[2], + a = l$0[1], + accu$1 = caml_call2(f, accu$0, a), + accu$0 = accu$1, + l$0 = l$1; + } + } + function fold_right(f, l, accu){ + if(! l) return accu; + var l$0 = l[2], a = l[1]; + return caml_call2(f, a, fold_right(f, l$0, accu)); + } + function map2(f, l1, l2){ + if(l1){ + if(l2){ + var + l2$0 = l2[2], + a2 = l2[1], + l1$0 = l1[2], + a1 = l1[1], + r = caml_call2(f, a1, a2); + return [0, r, map2(f, l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_map2); + } + function rev_map2(f, l1, l2){ + var accu = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$0 = [0, caml_call2(f, a1, a2), accu], + accu = accu$0, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu; + return caml_call1(Stdlib[1], cst_List_rev_map2); + } + } + function iter2(f, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var l2$1 = l2$0[2], a2 = l2$0[1], l1$1 = l1$0[2], a1 = l1$0[1]; + caml_call2(f, a1, a2); + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_iter2); + } + } + function fold_left2(f, accu, l1, l2){ + var accu$0 = accu, l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + accu$1 = caml_call3(f, accu$0, a1, a2), + accu$0 = accu$1, + l1$0 = l1$1, + l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return accu$0; + return caml_call1(Stdlib[1], cst_List_fold_left2); + } + } + function fold_right2(f, l1, l2, accu){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return caml_call3(f, a1, a2, fold_right2(f, l1$0, l2$0, accu)); + } + } + else if(! l2) return accu; + return caml_call1(Stdlib[1], cst_List_fold_right2); + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var l = param$0[2], a = param$0[1], _I_ = caml_call1(p, a); + if(! _I_) return _I_; + var param$0 = l; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _H_ = caml_call1(p, a); + if(_H_) return _H_; + var param$0 = l; + } + } + function for_all2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _G_ = caml_call2(p, a1, a2); + if(! _G_) return _G_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return caml_call1(Stdlib[1], cst_List_for_all2); + } + } + function exists2(p, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _F_ = caml_call2(p, a1, a2); + if(_F_) return _F_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 0; + return caml_call1(Stdlib[1], cst_List_exists2); + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1], + _E_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_E_) return _E_; + var param$0 = l; + } + } + function memq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1], _D_ = a === x ? 1 : 0; + if(_D_) return _D_; + var param$0 = l; + } + } + function assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return b; + var param$0 = l; + } + } + function assoc_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(0 === caml_compare(a, x)) return [0, b]; + var param$0 = l; + } + } + function assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return b; + var param$0 = l; + } + } + function assq_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], match = param$0[1], b = match[2], a = match[1]; + if(a === x) return [0, b]; + var param$0 = l; + } + } + function mem_assoc(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + l = param$0[2], + a = param$0[1][1], + _C_ = 0 === caml_compare(a, x) ? 1 : 0; + if(_C_) return _C_; + var param$0 = l; + } + } + function mem_assq(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], a = param$0[1][1], _B_ = a === x ? 1 : 0; + if(_B_) return _B_; + var param$0 = l; + } + } + function remove_assoc(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return 0 === caml_compare(a, x) ? l : [0, pair, remove_assoc(x, l)]; + } + function remove_assq(x, param){ + if(! param) return 0; + var l = param[2], pair = param[1], a = pair[1]; + return a === x ? l : [0, pair, remove_assq(x, l)]; + } + function find(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return x; + var param$0 = l; + } + } + function find_opt(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1]; + if(caml_call1(p, x)) return [0, x]; + var param$0 = l; + } + } + function find_map(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[2], x = param$0[1], result = caml_call1(f, x); + if(result) return result; + var param$0 = l; + } + } + function find_all(p){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1]; + if(caml_call1(p, x)){ + var accu$1 = [0, x, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function filteri(p, l){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + acc$0 = caml_call2(p, i, x) ? [0, x, acc] : acc, + i$0 = i + 1 | 0, + i = i$0, + acc = acc$0, + param = l$0; + } + } + function filter_map(f){ + var accu = 0; + return function(param$0){ + var accu$0 = accu, param = param$0; + for(;;){ + if(! param) return rev(accu$0); + var l = param[2], x = param[1], match = caml_call1(f, x); + if(match){ + var v = match[1], accu$1 = [0, v, accu$0], accu$0 = accu$1, param = l; + continue; + } + var param = l; + }}; + } + function concat_map(f, l){ + var acc = 0, param = l; + for(;;){ + if(! param) return rev(acc); + var + l$0 = param[2], + x = param[1], + xs = caml_call1(f, x), + acc$0 = rev_append(xs, acc), + acc = acc$0, + param = l$0; + } + } + function fold_left_map(f, accu, l){ + var accu$0 = accu, l_accu = 0, param = l; + for(;;){ + if(! param) return [0, accu$0, rev(l_accu)]; + var + l$0 = param[2], + x = param[1], + match = caml_call2(f, accu$0, x), + x$0 = match[2], + accu$1 = match[1], + l_accu$0 = [0, x$0, l_accu], + accu$0 = accu$1, + l_accu = l_accu$0, + param = l$0; + } + } + function partition(p, l){ + var yes = 0, no = 0, param = l; + for(;;){ + if(! param){var _A_ = rev(no); return [0, rev(yes), _A_];} + var l$0 = param[2], x = param[1]; + if(caml_call1(p, x)){ + var yes$0 = [0, x, yes], yes = yes$0, param = l$0; + continue; + } + var no$0 = [0, x, no], no = no$0, param = l$0; + } + } + function partition_map(p, l){ + var left = 0, right = 0, param = l; + for(;;){ + if(! param){var _z_ = rev(right); return [0, rev(left), _z_];} + var l$0 = param[2], x = param[1], match = caml_call1(p, x); + if(0 === match[0]){ + var v = match[1], left$0 = [0, v, left], left = left$0, param = l$0; + continue; + } + var + v$0 = match[1], + right$0 = [0, v$0, right], + right = right$0, + param = l$0; + } + } + function split(param){ + if(! param) return _b_; + var + l = param[2], + match = param[1], + y = match[2], + x = match[1], + match$0 = split(l), + ry = match$0[2], + rx = match$0[1]; + return [0, [0, x, rx], [0, y, ry]]; + } + function combine(l1, l2){ + if(l1){ + if(l2){ + var l2$0 = l2[2], a2 = l2[1], l1$0 = l1[2], a1 = l1[1]; + return [0, [0, a1, a2], combine(l1$0, l2$0)]; + } + } + else if(! l2) return 0; + return caml_call1(Stdlib[1], cst_List_combine); + } + function merge(cmp, l1, l2){ + if(! l1) return l2; + if(! l2) return l1; + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + return 0 < caml_call2(cmp, h1, h2) + ? [0, h2, merge(cmp, l1, t2)] + : [0, h1, merge(cmp, t1, l2)]; + } + function stable_sort(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x2, [0, x1, 0]] + : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _y_ = l[2]; + if(_y_){ + var match$2 = _y_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _y_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x1$0, [0, x2$0, [0, x3, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h1, accu], l1 = t1, accu = accu$0; + continue; + } + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var _x_ = rev_append(l1, accu); + } + else + var _x_ = rev_append(l2, accu); + return [0, _x_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + s = + 0 < caml_call2(cmp, x1, x2) + ? [0, x1, [0, x2, 0]] + : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _w_ = l[2]; + if(_w_){ + var match$2 = _w_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _w_[1], + x1$0 = l[1], + s$0 = + 0 < caml_call2(cmp, x1$0, x2$0) + ? 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x1$0, [0, x2$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]] + : 0 + < caml_call2(cmp, x1$0, x3) + ? [0, x2$0, [0, x1$0, [0, x3, 0]]] + : 0 + < caml_call2(cmp, x2$0, x3) + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]]; + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var t2 = l2[2], h2 = l2[1], t1 = l1[2], h1 = l1[1]; + if(0 < caml_call2(cmp, h1, h2)){ + var accu$0 = [0, h2, accu], l2 = t2, accu = accu$0; + continue; + } + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var _v_ = rev_append(l1, accu); + } + else + var _v_ = rev_append(l2, accu); + return [0, _v_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function sort_uniq(cmp, l){ + function sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 <= c$0 ? [0, x2, [0, x1, 0]] : [0, x1, [0, x2, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _p_ = l[2]; + if(_p_){ + var match$2 = _p_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _p_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _q_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 <= c$2 ? [0, x3, [0, x2$0, 0]] : [0, x2$0, [0, x3, 0]], + s$0 = _q_; + else if(0 <= c$1){ + var c$3 = caml_call2(cmp, x1$0, x3); + if(0 === c$3) + var _r_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 <= c$3) + var + c$4 = caml_call2(cmp, x2$0, x3), + _s_ = + 0 === c$4 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + <= c$4 + ? [0, x3, [0, x2$0, [0, x1$0, 0]]] + : [0, x2$0, [0, x3, [0, x1$0, 0]]], + _r_ = _s_; + else + var _r_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + var s$0 = _r_; + } + else{ + var c$5 = caml_call2(cmp, x2$0, x3); + if(0 === c$5) + var _t_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 <= c$5) + var + c$6 = caml_call2(cmp, x1$0, x3), + _u_ = + 0 === c$6 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + <= c$6 + ? [0, x3, [0, x1$0, [0, x2$0, 0]]] + : [0, x1$0, [0, x3, [0, x2$0, 0]]], + _t_ = _u_; + else + var _t_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + var s$0 = _t_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = rev_sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = rev_sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 < c){ + var accu$1 = [0, h1, accu], l1 = t1, accu = accu$1; + continue; + } + var accu$2 = [0, h2, accu], l2 = t2, accu = accu$2; + continue; + } + var _o_ = rev_append(l1, accu); + } + else + var _o_ = rev_append(l2, accu); + return [0, _o_, tl$0]; + } + } + function rev_sort(n, l){ + if(2 === n){ + if(l){ + var match = l[2]; + if(match){ + var + tl = match[2], + x2 = match[1], + x1 = l[1], + c$0 = caml_call2(cmp, x1, x2), + s = + 0 === c$0 + ? [0, x1, 0] + : 0 < c$0 ? [0, x1, [0, x2, 0]] : [0, x2, [0, x1, 0]]; + return [0, s, tl]; + } + } + } + else if(3 === n && l){ + var _i_ = l[2]; + if(_i_){ + var match$2 = _i_[2]; + if(match$2){ + var + tl$1 = match$2[2], + x3 = match$2[1], + x2$0 = _i_[1], + x1$0 = l[1], + c$1 = caml_call2(cmp, x1$0, x2$0); + if(0 === c$1) + var + c$2 = caml_call2(cmp, x2$0, x3), + _j_ = + 0 === c$2 + ? [0, x2$0, 0] + : 0 < c$2 ? [0, x2$0, [0, x3, 0]] : [0, x3, [0, x2$0, 0]], + s$0 = _j_; + else if(0 < c$1){ + var c$3 = caml_call2(cmp, x2$0, x3); + if(0 === c$3) + var _k_ = [0, x1$0, [0, x2$0, 0]]; + else if(0 < c$3) + var _k_ = [0, x1$0, [0, x2$0, [0, x3, 0]]]; + else + var + c$4 = caml_call2(cmp, x1$0, x3), + _l_ = + 0 === c$4 + ? [0, x1$0, [0, x2$0, 0]] + : 0 + < c$4 + ? [0, x1$0, [0, x3, [0, x2$0, 0]]] + : [0, x3, [0, x1$0, [0, x2$0, 0]]], + _k_ = _l_; + var s$0 = _k_; + } + else{ + var c$5 = caml_call2(cmp, x1$0, x3); + if(0 === c$5) + var _m_ = [0, x2$0, [0, x1$0, 0]]; + else if(0 < c$5) + var _m_ = [0, x2$0, [0, x1$0, [0, x3, 0]]]; + else + var + c$6 = caml_call2(cmp, x2$0, x3), + _n_ = + 0 === c$6 + ? [0, x2$0, [0, x1$0, 0]] + : 0 + < c$6 + ? [0, x2$0, [0, x3, [0, x1$0, 0]]] + : [0, x3, [0, x2$0, [0, x1$0, 0]]], + _m_ = _n_; + var s$0 = _m_; + } + return [0, s$0, tl$1]; + } + } + } + var + n1 = n >> 1, + n2 = n - n1 | 0, + match$0 = sort(n1, l), + l2$0 = match$0[2], + s1 = match$0[1], + match$1 = sort(n2, l2$0), + tl$0 = match$1[2], + s2 = match$1[1], + l1 = s1, + l2 = s2, + accu = 0; + for(;;){ + if(l1){ + if(l2){ + var + t2 = l2[2], + h2 = l2[1], + t1 = l1[2], + h1 = l1[1], + c = caml_call2(cmp, h1, h2); + if(0 === c){ + var accu$0 = [0, h1, accu], l1 = t1, l2 = t2, accu = accu$0; + continue; + } + if(0 <= c){ + var accu$1 = [0, h2, accu], l2 = t2, accu = accu$1; + continue; + } + var accu$2 = [0, h1, accu], l1 = t1, accu = accu$2; + continue; + } + var _h_ = rev_append(l1, accu); + } + else + var _h_ = rev_append(l2, accu); + return [0, _h_, tl$0]; + } + } + var len = length(l); + return 2 <= len ? sort(len, l)[1] : l; + } + function compare_lengths(l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + if(! l2$0) return 1; + var l2$1 = l2$0[2], l1$1 = l1$0[2], l1$0 = l1$1, l2$0 = l2$1; + } + } + function compare_length_with(l, n){ + var l$0 = l, n$0 = n; + for(;;){ + if(! l$0) return 0 === n$0 ? 0 : 0 < n$0 ? -1 : 1; + var l$1 = l$0[2]; + if(0 >= n$0) return 1; + var n$1 = n$0 - 1 | 0, l$0 = l$1, n$0 = n$1; + } + } + function equal(eq, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(l1$0){ + if(l2$0){ + var + l2$1 = l2$0[2], + a2 = l2$0[1], + l1$1 = l1$0[2], + a1 = l1$0[1], + _g_ = caml_call2(eq, a1, a2); + if(! _g_) return _g_; + var l1$0 = l1$1, l2$0 = l2$1; + continue; + } + } + else if(! l2$0) return 1; + return 0; + } + } + function compare(cmp, l1, l2){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0 ? -1 : 0; + var l1$1 = l1$0[2], a1 = l1$0[1]; + if(! l2$0) return 1; + var l2$1 = l2$0[2], a2 = l2$0[1], c = caml_call2(cmp, a1, a2); + if(0 !== c) return c; + var l1$0 = l1$1, l2$0 = l2$1; + } + } + function to_seq(l){ + function aux(l, param){ + if(! l) return 0; + var tail = l[2], x = l[1]; + return [0, x, function(_f_){return aux(tail, _f_);}]; + } + return function(_e_){return aux(l, _e_);}; + } + function of_seq(seq){ + function direct(depth, seq){ + if(0 === depth){ + var _c_ = 0, _d_ = function(acc, x){return [0, x, acc];}; + return rev(caml_call3(Stdlib_Seq[5], _d_, _c_, seq)); + } + var match = caml_call1(seq, 0); + if(! match) return 0; + var next = match[2], x = match[1]; + return [0, x, direct(depth - 1 | 0, next)]; + } + return direct(500, seq); + } + var + Stdlib_List = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + flatten, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + find_all, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + stable_sort, + stable_sort, + stable_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(18, Stdlib_List, "Stdlib__List"); + return; + } + (globalThis)); + +//# 3492 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, zero = 0, one = 1, minus_one = -1; + function abs(x){return 0 <= x ? x : - x | 0;} + var max_int = 2147483647, min_int = -2147483648; + function lognot(x){return x ^ -1;} + function equal(_b_, _a_){return _b_ === _a_ ? 1 : 0;} + var compare = runtime.caml_int_compare; + function min(x, y){return x <= y ? x : y;} + function max(x, y){return y <= x ? x : y;} + function to_string(x){return "" + x;} + var + Stdlib_Int = + [0, + zero, + one, + minus_one, + abs, + max_int, + min_int, + lognot, + equal, + compare, + min, + max, + to_string]; + runtime.caml_register_global(1, Stdlib_Int, "Stdlib__Int"); + return; + } + (globalThis)); + +//# 3525 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_bytes_ml = "bytes.ml", + cst_index_out_of_bounds$3 = "index out of bounds", + caml_blit_bytes = runtime.caml_blit_bytes, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_get16 = runtime.caml_bytes_get16, + caml_bytes_get32 = runtime.caml_bytes_get32, + caml_bytes_get64 = runtime.caml_bytes_get64, + caml_bytes_of_string = runtime.caml_bytes_of_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fill_bytes = runtime.caml_fill_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_string_of_bytes = runtime.caml_string_of_bytes, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Assert_failure = global_data.Assert_failure, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Char = global_data.Stdlib__Char, + cst_index_out_of_bounds$2 = cst_index_out_of_bounds$3, + _f_ = [0, cst_bytes_ml, 820, 20], + _e_ = [0, cst_bytes_ml, 831, 9], + cst_index_out_of_bounds$1 = cst_index_out_of_bounds$3, + cst_index_out_of_bounds$0 = cst_index_out_of_bounds$3, + _d_ = [0, cst_bytes_ml, 766, 20], + _c_ = [0, cst_bytes_ml, 777, 9], + cst_index_out_of_bounds = cst_index_out_of_bounds$3, + _b_ = [0, cst_bytes_ml, 654, 20], + _a_ = [0, cst_bytes_ml, 679, 9], + cst_Bytes_of_seq_cannot_grow_b = "Bytes.of_seq: cannot grow bytes", + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_Bytes_concat = "Bytes.concat", + cst_String_blit_Bytes_blit_str = "String.blit / Bytes.blit_string", + cst_Bytes_blit = "Bytes.blit", + cst_String_fill_Bytes_fill = "String.fill / Bytes.fill", + cst_Bytes_extend = "Bytes.extend", + cst_String_sub_Bytes_sub = "String.sub / Bytes.sub"; + function make(n, c){ + var s = caml_create_bytes(n); + caml_fill_bytes(s, 0, n, c); + return s; + } + function init(n, f){ + var s = caml_create_bytes(n), _aq_ = n - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + caml_bytes_unsafe_set(s, i, caml_call1(f, i)); + var _ar_ = i + 1 | 0; + if(_aq_ !== i){var i = _ar_; continue;} + break; + } + } + return s; + } + var empty = caml_create_bytes(0); + function copy(s){ + var len = caml_ml_bytes_length(s), r = caml_create_bytes(len); + caml_blit_bytes(s, 0, r, 0, len); + return r; + } + function to_string(b){return caml_string_of_bytes(copy(b));} + function of_string(s){return copy(caml_bytes_of_string(s));} + function sub(s, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs){ + var r = caml_create_bytes(len); + caml_blit_bytes(s, ofs, r, 0, len); + return r; + } + return caml_call1(Stdlib[1], cst_String_sub_Bytes_sub); + } + function sub_string(b, ofs, len){ + return caml_string_of_bytes(sub(b, ofs, len)); + } + function symbol(a, b){ + var + c = a + b | 0, + _ao_ = b < 0 ? 1 : 0, + match = c < 0 ? 1 : 0, + switch$0 = 0; + if(a < 0){ + if(_ao_ && ! match) switch$0 = 1; + } + else if(! _ao_ && match) switch$0 = 1; + return switch$0 ? caml_call1(Stdlib[1], cst_Bytes_extend) : c; + } + function extend(s, left, right){ + var + len = symbol(symbol(caml_ml_bytes_length(s), left), right), + r = caml_create_bytes(len); + if(0 <= left) + var dstoff = left, srcoff = 0; + else + var dstoff = 0, srcoff = - left | 0; + var + cpylen = + caml_call2 + (Stdlib_Int[10], + caml_ml_bytes_length(s) - srcoff | 0, + len - dstoff | 0); + if(0 < cpylen) caml_blit_bytes(s, srcoff, r, dstoff, cpylen); + return r; + } + function fill(s, ofs, len, c){ + if(0 <= ofs && 0 <= len && (caml_ml_bytes_length(s) - len | 0) >= ofs) + return caml_fill_bytes(s, ofs, len, c); + return caml_call1(Stdlib[1], cst_String_fill_Bytes_fill); + } + function blit(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (caml_ml_bytes_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return caml_blit_bytes(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_Bytes_blit); + } + function blit_string(s1, ofs1, s2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (runtime.caml_ml_string_length(s1) - len | 0) >= ofs1 + && 0 <= ofs2 && (caml_ml_bytes_length(s2) - len | 0) >= ofs2) + return runtime.caml_blit_string(s1, ofs1, s2, ofs2, len); + return caml_call1(Stdlib[1], cst_String_blit_Bytes_blit_str); + } + function iter(f, a){ + var _am_ = caml_ml_bytes_length(a) - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, caml_bytes_unsafe_get(a, i)); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iteri(f, a){ + var _aj_ = caml_ml_bytes_length(a) - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, i, caml_bytes_unsafe_get(a, i)); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function concat(sep, l){ + if(! l) return empty; + var seplen = caml_ml_bytes_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_bytes_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Bytes_concat), + acc = acc$0, + param = tl; + continue; + } + var _ah_ = caml_ml_bytes_length(hd) + acc | 0; + } + else + var _ah_ = acc; + var dst = caml_create_bytes(_ah_), pos = pos$1, param$0 = l; + for(;;){ + if(! param$0) return dst; + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + caml_blit_bytes + (sep, 0, dst, pos + caml_ml_bytes_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_bytes_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_bytes(hd$0, 0, dst, pos, caml_ml_bytes_length(hd$0)); + return dst; + } + } + } + function cat(s1, s2){ + var + l1 = caml_ml_bytes_length(s1), + l2 = caml_ml_bytes_length(s2), + r = caml_create_bytes(l1 + l2 | 0); + caml_blit_bytes(s1, 0, r, 0, l1); + caml_blit_bytes(s2, 0, r, l1, l2); + return r; + } + function is_space(param){ + var _ag_ = param - 9 | 0, switch$0 = 0; + if(4 < _ag_ >>> 0){ + if(23 === _ag_) switch$0 = 1; + } + else if(2 !== _ag_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + var len = caml_ml_bytes_length(s), i = [0, 0]; + for(;;){ + if(i[1] < len && is_space(caml_bytes_unsafe_get(s, i[1]))){i[1]++; continue;} + var j = [0, len - 1 | 0]; + for(;;){ + if(i[1] <= j[1] && is_space(caml_bytes_unsafe_get(s, j[1]))){j[1] += -1; continue;} + return i[1] <= j[1] ? sub(s, i[1], (j[1] - i[1] | 0) + 1 | 0) : empty; + } + } + } + function unsafe_escape(s){ + var n = [0, 0], _$_ = caml_ml_bytes_length(s) - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i$0 = ___; + for(;;){ + var match = caml_bytes_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _ad_ = match - 34 | 0, switch$1 = 0; + if(58 < _ad_ >>> 0){ + if(93 > _ad_) switch$1 = 1; + } + else if(56 < _ad_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _ae_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){ + case 0: + var _ae_ = 4; break; + case 1: + var _ae_ = 2; break; + } + n[1] = n[1] + _ae_ | 0; + var _af_ = i$0 + 1 | 0; + if(_$_ !== i$0){var i$0 = _af_; continue;} + break; + } + } + if(n[1] === caml_ml_bytes_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _ab_ = caml_ml_bytes_length(s) - 1 | 0, _aa_ = 0; + if(_ab_ >= 0){ + var i = _aa_; + for(;;){ + var c = caml_bytes_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c / 100 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 48 + (c % 10 | 0) | 0); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _ac_ = i + 1 | 0; + if(_ab_ !== i){var i = _ac_; continue;} + break; + } + } + return s$0; + } + function escaped(b){var b$0 = copy(b); return unsafe_escape(b$0);} + function map(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _Y_ = l - 1 | 0, _X_ = 0; + if(_Y_ >= 0){ + var i = _X_; + for(;;){ + caml_bytes_unsafe_set(r, i, caml_call1(f, caml_bytes_unsafe_get(s, i))); + var _Z_ = i + 1 | 0; + if(_Y_ !== i){var i = _Z_; continue;} + break; + } + } + return r; + } + function mapi(f, s){ + var l = caml_ml_bytes_length(s); + if(0 === l) return s; + var r = caml_create_bytes(l), _V_ = l - 1 | 0, _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + caml_bytes_unsafe_set + (r, i, caml_call2(f, i, caml_bytes_unsafe_get(s, i))); + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _S_ = caml_ml_bytes_length(a) - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + r[1] = caml_call2(f, r[1], caml_bytes_unsafe_get(a, i)); + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _P_ = caml_ml_bytes_length(a) - 1 | 0; + if(_P_ >= 0){ + var i = _P_; + for(;;){ + r[1] = caml_call2(f, caml_bytes_unsafe_get(a, i), r[1]); + var _Q_ = i - 1 | 0; + if(0 !== i){var i = _Q_; continue;} + break; + } + } + return r[1]; + } + function exists(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, caml_bytes_unsafe_get(s, i))) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, s){ + var n = caml_ml_bytes_length(s), i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, caml_bytes_unsafe_get(s, i))) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function uppercase_ascii(s){return map(Stdlib_Char[4], s);} + function lowercase_ascii(s){return map(Stdlib_Char[3], s);} + function apply1(f, s){ + if(0 === caml_ml_bytes_length(s)) return s; + var r = copy(s); + caml_bytes_unsafe_set(r, 0, caml_call1(f, caml_bytes_unsafe_get(s, 0))); + return r; + } + function capitalize_ascii(s){return apply1(Stdlib_Char[4], s);} + function uncapitalize_ascii(s){return apply1(Stdlib_Char[3], s);} + function starts_with(prefix, s){ + var + len_s = caml_ml_bytes_length(s), + len_pre = caml_ml_bytes_length(prefix), + _O_ = len_pre <= len_s ? 1 : 0; + if(! _O_) return _O_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_bytes_unsafe_get(s, i) !== caml_bytes_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_bytes_length(s), + len_suf = caml_ml_bytes_length(suffix), + diff = len_s - len_suf | 0, + _N_ = 0 <= diff ? 1 : 0; + if(! _N_) return _N_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_bytes_unsafe_get(s, diff + i | 0) + !== caml_bytes_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_bytes_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_bytes_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_bytes_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_bytes_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_bytes_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_bytes_length(s) > i) return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_bytes_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _L_ = 1; return _L_;} + catch(_M_){ + var _K_ = caml_wrap_exception(_M_); + if(_K_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_K_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_bytes_length(s) > i) + try{rindex_rec(s, i, c); var _I_ = 1; return _I_;} + catch(_J_){ + var _H_ = caml_wrap_exception(_J_); + if(_H_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_H_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + var compare = runtime.caml_bytes_compare; + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_bytes_length(s)], + _D_ = caml_ml_bytes_length(s) - 1 | 0; + if(_D_ >= 0){ + var i = _D_; + for(;;){ + if(caml_bytes_unsafe_get(s, i) === sep){ + var _F_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _F_]; + j[1] = i; + } + var _G_ = i - 1 | 0; + if(0 !== i){var i = _G_; continue;} + break; + } + } + var _E_ = r[1]; + return [0, sub(s, 0, j[1]), _E_]; + } + function to_seq(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _B_ = i + 1 | 0; + return [0, x, function(_C_){return aux(_B_, _C_);}]; + } + var _z_ = 0; + return function(_A_){return aux(_z_, _A_);}; + } + function to_seqi(s){ + function aux(i, param){ + if(i === caml_ml_bytes_length(s)) return 0; + var x = caml_bytes_get(s, i), _x_ = i + 1 | 0; + return [0, [0, i, x], function(_y_){return aux(_x_, _y_);}]; + } + var _v_ = 0; + return function(_w_){return aux(_v_, _w_);}; + } + function of_seq(i){ + var n = [0, 0], buf = [0, make(256, 0)]; + function _u_(c){ + if(n[1] === caml_ml_bytes_length(buf[1])){ + var + new_len = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(buf[1]) | 0, + Stdlib_Sys[12]); + if(caml_ml_bytes_length(buf[1]) === new_len) + caml_call1(Stdlib[2], cst_Bytes_of_seq_cannot_grow_b); + var new_buf = make(new_len, 0); + blit(buf[1], 0, new_buf, 0, n[1]); + buf[1] = new_buf; + } + caml_bytes_set(buf[1], n[1], c); + n[1]++; + return 0; + } + caml_call2(Stdlib_Seq[4], _u_, i); + return sub(buf[1], 0, n[1]); + } + function unsafe_get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function unsafe_get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int8(b, i){ + var _s_ = Stdlib_Sys[10] - 8 | 0, _t_ = Stdlib_Sys[10] - 8 | 0; + return caml_bytes_get(b, i) << _t_ >> _s_; + } + function get_uint16_le(b, i){ + return Stdlib_Sys[11] + ? caml_bswap16(caml_bytes_get16(b, i)) + : caml_bytes_get16(b, i); + } + function get_uint16_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get16(b, i) + : caml_bswap16(caml_bytes_get16(b, i)); + } + function get_int16_ne(b, i){ + var _q_ = Stdlib_Sys[10] - 16 | 0, _r_ = Stdlib_Sys[10] - 16 | 0; + return caml_bytes_get16(b, i) << _r_ >> _q_; + } + function get_int16_le(b, i){ + var _o_ = Stdlib_Sys[10] - 16 | 0, _p_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_le(b, i) << _p_ >> _o_; + } + function get_int16_be(b, i){ + var _m_ = Stdlib_Sys[10] - 16 | 0, _n_ = Stdlib_Sys[10] - 16 | 0; + return get_uint16_be(b, i) << _n_ >> _m_; + } + function get_int32_le(b, i){ + return Stdlib_Sys[11] + ? caml_int32_bswap(caml_bytes_get32(b, i)) + : caml_bytes_get32(b, i); + } + function get_int32_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get32(b, i) + : caml_int32_bswap(caml_bytes_get32(b, i)); + } + function get_int64_le(b, i){ + return Stdlib_Sys[11] + ? caml_int64_bswap(caml_bytes_get64(b, i)) + : caml_bytes_get64(b, i); + } + function get_int64_be(b, i){ + return Stdlib_Sys[11] + ? caml_bytes_get64(b, i) + : caml_int64_bswap(caml_bytes_get64(b, i)); + } + function unsafe_set_uint16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function unsafe_set_uint16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int16_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, caml_bswap16(x)) + : caml_bytes_set16(b, i, x); + } + function set_int16_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set16(b, i, x) + : caml_bytes_set16(b, i, caml_bswap16(x)); + } + function set_int32_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, caml_int32_bswap(x)) + : caml_bytes_set32(b, i, x); + } + function set_int32_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set32(b, i, x) + : caml_bytes_set32(b, i, caml_int32_bswap(x)); + } + function set_int64_le(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, caml_int64_bswap(x)) + : caml_bytes_set64(b, i, x); + } + function set_int64_be(b, i, x){ + return Stdlib_Sys[11] + ? caml_bytes_set64(b, i, x) + : caml_bytes_set64(b, i, caml_int64_bswap(x)); + } + var + set_uint8 = caml_bytes_set, + set_uint16_ne = caml_bytes_set16, + dec_invalid = Stdlib_Uchar[22]; + function dec_ret(n, u){ + var _l_ = caml_call1(Stdlib_Uchar[9], u); + return caml_call2(Stdlib_Uchar[21], n, _l_); + } + function not_in_x80_to_xBF(b){return 2 !== (b >>> 6 | 0) ? 1 : 0;} + function not_in_xA0_to_xBF(b){return 5 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x80_to_x9F(b){return 4 !== (b >>> 5 | 0) ? 1 : 0;} + function not_in_x90_to_xBF(b){ + var _j_ = b < 144 ? 1 : 0, _k_ = _j_ || (191 < b ? 1 : 0); + return _k_; + } + function not_in_x80_to_x8F(b){return 8 !== (b >>> 4 | 0) ? 1 : 0;} + function utf_8_uchar_3(b0, b1, b2){ + return (b0 & 15) << 12 | (b1 & 63) << 6 | b2 & 63; + } + function utf_8_uchar_4(b0, b1, b2, b3){ + return (b0 & 7) << 18 | (b1 & 63) << 12 | (b2 & 63) << 6 | b3 & 63; + } + function get_utf_8_uchar(b, i){ + var b0 = caml_bytes_get(b, i), max = caml_ml_bytes_length(b) - 1 | 0; + if(224 <= b0){ + var switch$0 = 0; + if(237 <= b0){ + if(245 > b0) + switch(b0 - 237 | 0){ + case 0: + var i$0 = i + 1 | 0; + if(max < i$0) return caml_call1(dec_invalid, 1); + var b1 = caml_bytes_unsafe_get(b, i$0); + if(not_in_x80_to_x9F(b1)) return caml_call1(dec_invalid, 1); + var i$1 = i$0 + 1 | 0; + if(max < i$1) return caml_call1(dec_invalid, 2); + var b2 = caml_bytes_unsafe_get(b, i$1); + return not_in_x80_to_xBF(b2) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1, b2)); + case 3: + var i$4 = i + 1 | 0; + if(max < i$4) return caml_call1(dec_invalid, 1); + var b1$1 = caml_bytes_unsafe_get(b, i$4); + if(not_in_x90_to_xBF(b1$1)) return caml_call1(dec_invalid, 1); + var i$5 = i$4 + 1 | 0; + if(max < i$5) return caml_call1(dec_invalid, 2); + var b2$1 = caml_bytes_unsafe_get(b, i$5); + if(not_in_x80_to_xBF(b2$1)) return caml_call1(dec_invalid, 2); + var i$6 = i$5 + 1 | 0; + if(max < i$6) return caml_call1(dec_invalid, 3); + var b3 = caml_bytes_unsafe_get(b, i$6); + return not_in_x80_to_xBF(b3) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$1, b2$1, b3)); + case 7: + var i$10 = i + 1 | 0; + if(max < i$10) return caml_call1(dec_invalid, 1); + var b1$3 = caml_bytes_unsafe_get(b, i$10); + if(not_in_x80_to_x8F(b1$3)) return caml_call1(dec_invalid, 1); + var i$11 = i$10 + 1 | 0; + if(max < i$11) return caml_call1(dec_invalid, 2); + var b2$3 = caml_bytes_unsafe_get(b, i$11); + if(not_in_x80_to_xBF(b2$3)) return caml_call1(dec_invalid, 2); + var i$12 = i$11 + 1 | 0; + if(max < i$12) return caml_call1(dec_invalid, 3); + var b3$1 = caml_bytes_unsafe_get(b, i$12); + return not_in_x80_to_xBF(b3$1) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$3, b2$3, b3$1)); + case 1: + case 2: + switch$0 = 1; break; + default: + var i$7 = i + 1 | 0; + if(max < i$7) return caml_call1(dec_invalid, 1); + var b1$2 = caml_bytes_unsafe_get(b, i$7); + if(not_in_x80_to_xBF(b1$2)) return caml_call1(dec_invalid, 1); + var i$8 = i$7 + 1 | 0; + if(max < i$8) return caml_call1(dec_invalid, 2); + var b2$2 = caml_bytes_unsafe_get(b, i$8); + if(not_in_x80_to_xBF(b2$2)) return caml_call1(dec_invalid, 2); + var i$9 = i$8 + 1 | 0; + if(max < i$9) return caml_call1(dec_invalid, 3); + var b3$0 = caml_bytes_unsafe_get(b, i$9); + return not_in_x80_to_xBF(b3$0) + ? caml_call1(dec_invalid, 3) + : dec_ret(4, utf_8_uchar_4(b0, b1$2, b2$2, b3$0)); + } + } + else{ + if(225 > b0){ + var i$13 = i + 1 | 0; + if(max < i$13) return caml_call1(dec_invalid, 1); + var b1$4 = caml_bytes_unsafe_get(b, i$13); + if(not_in_xA0_to_xBF(b1$4)) return caml_call1(dec_invalid, 1); + var i$14 = i$13 + 1 | 0; + if(max < i$14) return caml_call1(dec_invalid, 2); + var b2$4 = caml_bytes_unsafe_get(b, i$14); + return not_in_x80_to_xBF(b2$4) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$4, b2$4)); + } + switch$0 = 1; + } + if(switch$0){ + var i$2 = i + 1 | 0; + if(max < i$2) return caml_call1(dec_invalid, 1); + var b1$0 = caml_bytes_unsafe_get(b, i$2); + if(not_in_x80_to_xBF(b1$0)) return caml_call1(dec_invalid, 1); + var i$3 = i$2 + 1 | 0; + if(max < i$3) return caml_call1(dec_invalid, 2); + var b2$0 = caml_bytes_unsafe_get(b, i$3); + return not_in_x80_to_xBF(b2$0) + ? caml_call1(dec_invalid, 2) + : dec_ret(3, utf_8_uchar_3(b0, b1$0, b2$0)); + } + } + else{ + if(128 > b0) return dec_ret(1, b0); + if(194 <= b0){ + var i$15 = i + 1 | 0; + if(max < i$15) return caml_call1(dec_invalid, 1); + var b1$5 = caml_bytes_unsafe_get(b, i$15); + return not_in_x80_to_xBF(b1$5) + ? caml_call1(dec_invalid, 1) + : dec_ret(2, (b0 & 31) << 6 | b1$5 & 63); + } + } + return caml_call1(dec_invalid, 1); + } + function set_utf_8_uchar(b, i, u){ + function set(_i_, _h_, _g_){ + caml_bytes_unsafe_set(_i_, _h_, _g_); + return 0; + } + var + max = caml_ml_bytes_length(b) - 1 | 0, + u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(127 >= u$0){caml_bytes_set(b, i, u$0); return 1;} + if(2047 >= u$0){ + var last$1 = i + 1 | 0; + return max < last$1 + ? 0 + : (caml_bytes_set + (b, i, 192 | u$0 >>> 6 | 0), + set(b, last$1, 128 | u$0 & 63), + 2); + } + if(65535 >= u$0){ + var last$0 = i + 2 | 0; + return max < last$0 + ? 0 + : (caml_bytes_set + (b, i, 224 | u$0 >>> 12 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last$0, 128 | u$0 & 63), + 3); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var last = i + 3 | 0; + return max < last + ? 0 + : (caml_bytes_set + (b, i, 240 | u$0 >>> 18 | 0), + set(b, i + 1 | 0, 128 | (u$0 >>> 12 | 0) & 63), + set(b, i + 2 | 0, 128 | (u$0 >>> 6 | 0) & 63), + set(b, last, 128 | u$0 & 63), + 4); + } + function is_valid_utf_8(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + var match = caml_bytes_unsafe_get(b, i); + if(224 <= match){ + var switch$0 = 0; + if(237 <= match){ + if(245 > match) + switch(match - 237 | 0){ + case 0: + var last = i + 2 | 0; + if + (max >= last + && + ! + not_in_x80_to_x9F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last))){var i$0 = last + 1 | 0, i = i$0; continue;} + return 0; + case 3: + var last$1 = i + 3 | 0; + if + (max >= last$1 + && + ! + not_in_x90_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$1))){var i$2 = last$1 + 1 | 0, i = i$2; continue;} + return 0; + case 7: + var last$3 = i + 3 | 0; + if + (max >= last$3 + && + ! + not_in_x80_to_x8F(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$3))){var i$4 = last$3 + 1 | 0, i = i$4; continue;} + return 0; + case 1: + case 2: + switch$0 = 1; break; + default: + var last$2 = i + 3 | 0; + if + (max >= last$2 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 2 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$2))){var i$3 = last$2 + 1 | 0, i = i$3; continue;} + return 0; + } + } + else{ + if(225 > match){ + var last$4 = i + 2 | 0; + if + (max >= last$4 + && + ! + not_in_xA0_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$4))){var i$5 = last$4 + 1 | 0, i = i$5; continue;} + return 0; + } + switch$0 = 1; + } + if(switch$0){ + var last$0 = i + 2 | 0; + if + (max >= last$0 + && + ! + not_in_x80_to_xBF(caml_bytes_unsafe_get(b, i + 1 | 0)) + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$0))){var i$1 = last$0 + 1 | 0, i = i$1; continue;} + return 0; + } + } + else{ + if(128 > match){var i$7 = i + 1 | 0, i = i$7; continue;} + if(194 <= match){ + var last$5 = i + 1 | 0; + if + (max >= last$5 + && ! not_in_x80_to_xBF(caml_bytes_unsafe_get(b, last$5))){var i$6 = last$5 + 1 | 0, i = i$6; continue;} + return 0; + } + } + return 0; + } + } + function get_utf_16be_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_be(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds); + } + function set_utf_16be_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_be(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_be(b, i, hi); + unsafe_set_uint16_be(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$0); + } + function is_valid_utf_16be(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_be(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_be(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + function get_utf_16le_uchar(b, i){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + if(i === max) return caml_call1(dec_invalid, 1); + var hi = unsafe_get_uint16_le(b, i); + if(55296 <= hi && 57343 >= hi){ + if(56319 < hi) return caml_call1(dec_invalid, 2); + var last = i + 3 | 0; + if(max < last) return caml_call1(dec_invalid, (max - i | 0) + 1 | 0); + var lo = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= lo && 57343 >= lo){ + var u = ((hi & 1023) << 10 | lo & 1023) + 65536 | 0; + return dec_ret(4, u); + } + return caml_call1(dec_invalid, 2); + } + return dec_ret(2, hi); + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$1); + } + function set_utf_16le_uchar(b, i, u){ + var max = caml_ml_bytes_length(b) - 1 | 0; + if(0 <= i && max >= i){ + var u$0 = caml_call1(Stdlib_Uchar[10], u); + if(0 > u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(65535 >= u$0){ + var last$0 = i + 1 | 0; + return max < last$0 ? 0 : (unsafe_set_uint16_le(b, i, u$0), 2); + } + if(1114111 < u$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var last = i + 3 | 0; + if(max < last) return 0; + var + u$1 = u$0 - 65536 | 0, + hi = 55296 | u$1 >>> 10 | 0, + lo = 56320 | u$1 & 1023; + unsafe_set_uint16_le(b, i, hi); + unsafe_set_uint16_le(b, i + 2 | 0, lo); + return 4; + } + return caml_call1(Stdlib[1], cst_index_out_of_bounds$2); + } + function is_valid_utf_16le(b){ + var max = caml_ml_bytes_length(b) - 1 | 0, i = 0; + for(;;){ + if(max < i) return 1; + if(i === max) return 0; + var u = unsafe_get_uint16_le(b, i); + if(55296 <= u && 57343 >= u){ + if(56319 < u) return 0; + var last = i + 3 | 0; + if(max < last) return 0; + var u$0 = unsafe_get_uint16_le(b, i + 2 | 0); + if(56320 <= u$0 && 57343 >= u$0){ + var i$1 = i + 4 | 0, i = i$1; + continue; + } + return 0; + } + var i$0 = i + 2 | 0, i = i$0; + } + } + var + Stdlib_Bytes = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + runtime.caml_bytes_equal, + starts_with, + ends_with, + caml_string_of_bytes, + caml_bytes_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + caml_bytes_get, + get_int8, + caml_bytes_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + caml_bytes_get32, + get_int32_be, + get_int32_le, + caml_bytes_get64, + get_int64_be, + get_int64_le, + set_uint8, + caml_bytes_set, + set_uint16_ne, + set_int16_be, + set_int16_le, + caml_bytes_set16, + set_int16_be, + set_int16_le, + caml_bytes_set32, + set_int32_be, + set_int32_le, + caml_bytes_set64, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(30, Stdlib_Bytes, "Stdlib__Bytes"); + return; + } + (globalThis)); + +//# 4733 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$0 = "", + caml_blit_string = runtime.caml_blit_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_hash = runtime.caml_string_hash, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + empty = cst$0, + Stdlib = global_data.Stdlib, + Stdlib_Bytes = global_data.Stdlib__Bytes, + bts = Stdlib_Bytes[44], + bos = Stdlib_Bytes[45], + cst_String_rcontains_from_Byte = + "String.rcontains_from / Bytes.rcontains_from", + cst_String_contains_from_Bytes = + "String.contains_from / Bytes.contains_from", + cst_String_rindex_from_opt_Byt = + "String.rindex_from_opt / Bytes.rindex_from_opt", + cst_String_rindex_from_Bytes_r = "String.rindex_from / Bytes.rindex_from", + cst_String_index_from_opt_Byte = + "String.index_from_opt / Bytes.index_from_opt", + cst_String_index_from_Bytes_in = "String.index_from / Bytes.index_from", + cst_String_concat = "String.concat"; + function make(n, c){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[1], n, c)); + } + function init(n, f){ + return caml_call1(bts, caml_call2(Stdlib_Bytes[2], n, f)); + } + var of_bytes = Stdlib_Bytes[6], to_bytes = Stdlib_Bytes[5]; + function sub(s, ofs, len){ + var _X_ = caml_call1(bos, s); + return caml_call1(bts, caml_call3(Stdlib_Bytes[7], _X_, ofs, len)); + } + var blit = Stdlib_Bytes[12]; + function concat(sep, l){ + if(! l) return cst; + var seplen = caml_ml_string_length(sep), acc = 0, param = l, pos$1 = 0; + for(;;){ + if(param){ + var hd = param[1]; + if(param[2]){ + var + tl = param[2], + x = (caml_ml_string_length(hd) + seplen | 0) + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_String_concat), + acc = acc$0, + param = tl; + continue; + } + var _W_ = caml_ml_string_length(hd) + acc | 0; + } + else + var _W_ = acc; + var dst = runtime.caml_create_bytes(_W_), pos = pos$1, param$0 = l; + for(;;){ + if(param$0){ + var hd$0 = param$0[1]; + if(param$0[2]){ + var tl$0 = param$0[2]; + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + caml_blit_string + (sep, 0, dst, pos + caml_ml_string_length(hd$0) | 0, seplen); + var + pos$0 = (pos + caml_ml_string_length(hd$0) | 0) + seplen | 0, + pos = pos$0, + param$0 = tl$0; + continue; + } + caml_blit_string(hd$0, 0, dst, pos, caml_ml_string_length(hd$0)); + } + return caml_call1(bts, dst); + } + } + } + var cat = Stdlib[28]; + function iter(f, s){ + var _U_ = caml_ml_string_length(s) - 1 | 0, _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_call1(f, caml_string_unsafe_get(s, i)); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return 0; + } + function iteri(f, s){ + var _R_ = caml_ml_string_length(s) - 1 | 0, _Q_ = 0; + if(_R_ >= 0){ + var i = _Q_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(s, i)); + var _S_ = i + 1 | 0; + if(_R_ !== i){var i = _S_; continue;} + break; + } + } + return 0; + } + function map(f, s){ + var _P_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[17], f, _P_)); + } + function mapi(f, s){ + var _O_ = caml_call1(bos, s); + return caml_call1(bts, caml_call2(Stdlib_Bytes[18], f, _O_)); + } + function fold_right(f, x, a){ + var _N_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[20], f, _N_, a); + } + function fold_left(f, a, x){ + var _M_ = caml_call1(bos, x); + return caml_call3(Stdlib_Bytes[19], f, a, _M_); + } + function exists(f, s){ + var _L_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[22], f, _L_); + } + function for_all(f, s){ + var _K_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[21], f, _K_); + } + function is_space(param){ + var _J_ = param - 9 | 0, switch$0 = 0; + if(4 < _J_ >>> 0){ + if(23 === _J_) switch$0 = 1; + } + else if(2 !== _J_) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function trim(s){ + if(caml_string_equal(s, cst$0)) return s; + if + (! + is_space(caml_string_unsafe_get(s, 0)) + && + ! + is_space(caml_string_unsafe_get(s, caml_ml_string_length(s) - 1 | 0))) + return s; + var _I_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[23], _I_)); + } + function escaped(s){ + var b = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[87], b)); + } + function index_rec(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index(s, c){return index_rec(s, caml_ml_string_length(s), 0, c);} + function index_rec_opt(s, lim, i, c){ + var i$0 = i; + for(;;){ + if(lim <= i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + function index_opt(s, c){ + return index_rec_opt(s, caml_ml_string_length(s), 0, c); + } + function index_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_Bytes_in); + } + function index_from_opt(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) return index_rec_opt(s, l, i, c); + return caml_call1(Stdlib[1], cst_String_index_from_opt_Byte); + } + function rindex_rec(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_unsafe_get(s, i$0) === c) return i$0; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex(s, c){ + return rindex_rec(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) return rindex_rec(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_Bytes_r); + } + function rindex_rec_opt(s, i, c){ + var i$0 = i; + for(;;){ + if(0 > i$0) return 0; + if(caml_string_unsafe_get(s, i$0) === c) return [0, i$0]; + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + function rindex_opt(s, c){ + return rindex_rec_opt(s, caml_ml_string_length(s) - 1 | 0, c); + } + function rindex_from_opt(s, i, c){ + if(-1 <= i && caml_ml_string_length(s) > i) + return rindex_rec_opt(s, i, c); + return caml_call1(Stdlib[1], cst_String_rindex_from_opt_Byt); + } + function contains_from(s, i, c){ + var l = caml_ml_string_length(s); + if(0 <= i && l >= i) + try{index_rec(s, l, i, c); var _G_ = 1; return _G_;} + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_F_, 0); + } + return caml_call1(Stdlib[1], cst_String_contains_from_Bytes); + } + function contains(s, c){return contains_from(s, 0, c);} + function rcontains_from(s, i, c){ + if(0 <= i && caml_ml_string_length(s) > i) + try{rindex_rec(s, i, c); var _D_ = 1; return _D_;} + catch(_E_){ + var _C_ = caml_wrap_exception(_E_); + if(_C_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_C_, 0); + } + return caml_call1(Stdlib[1], cst_String_rcontains_from_Byte); + } + function uppercase_ascii(s){ + var _B_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[36], _B_)); + } + function lowercase_ascii(s){ + var _A_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[37], _A_)); + } + function capitalize_ascii(s){ + var _z_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[38], _z_)); + } + function uncapitalize_ascii(s){ + var _y_ = caml_call1(bos, s); + return caml_call1(bts, caml_call1(Stdlib_Bytes[39], _y_)); + } + function starts_with(prefix, s){ + var + len_s = caml_ml_string_length(s), + len_pre = caml_ml_string_length(prefix), + _x_ = len_pre <= len_s ? 1 : 0; + if(! _x_) return _x_; + var i = 0; + for(;;){ + if(i === len_pre) return 1; + if(caml_string_unsafe_get(s, i) !== caml_string_unsafe_get(prefix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function ends_with(suffix, s){ + var + len_s = caml_ml_string_length(s), + len_suf = caml_ml_string_length(suffix), + diff = len_s - len_suf | 0, + _w_ = 0 <= diff ? 1 : 0; + if(! _w_) return _w_; + var i = 0; + for(;;){ + if(i === len_suf) return 1; + if + (caml_string_unsafe_get(s, diff + i | 0) + !== caml_string_unsafe_get(suffix, i)) + return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function hash(x){return caml_string_hash(0, x);} + function split_on_char(sep, s){ + var + r = [0, 0], + j = [0, caml_ml_string_length(s)], + _s_ = caml_ml_string_length(s) - 1 | 0; + if(_s_ >= 0){ + var i = _s_; + for(;;){ + if(caml_string_unsafe_get(s, i) === sep){ + var _u_ = r[1]; + r[1] = [0, sub(s, i + 1 | 0, (j[1] - i | 0) - 1 | 0), _u_]; + j[1] = i; + } + var _v_ = i - 1 | 0; + if(0 !== i){var i = _v_; continue;} + break; + } + } + var _t_ = r[1]; + return [0, sub(s, 0, j[1]), _t_]; + } + var compare = runtime.caml_string_compare; + function to_seq(s){ + var _r_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[47], _r_); + } + function to_seqi(s){ + var _q_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[48], _q_); + } + function of_seq(g){ + return caml_call1(bts, caml_call1(Stdlib_Bytes[49], g)); + } + function get_utf_8_uchar(s, i){ + var _p_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[50], _p_, i); + } + function is_valid_utf_8(s){ + var _o_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[52], _o_); + } + function get_utf_16be_uchar(s, i){ + var _n_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[53], _n_, i); + } + function is_valid_utf_16be(s){ + var _m_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[55], _m_); + } + function get_utf_16le_uchar(s, i){ + var _l_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[56], _l_, i); + } + function is_valid_utf_16le(s){ + var _k_ = caml_call1(bos, s); + return caml_call1(Stdlib_Bytes[58], _k_); + } + function get_int8(s, i){ + var _j_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[60], _j_, i); + } + function get_uint16_le(s, i){ + var _i_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[63], _i_, i); + } + function get_uint16_be(s, i){ + var _h_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[62], _h_, i); + } + function get_int16_ne(s, i){ + var _g_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[64], _g_, i); + } + function get_int16_le(s, i){ + var _f_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[66], _f_, i); + } + function get_int16_be(s, i){ + var _e_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[65], _e_, i); + } + function get_int32_le(s, i){ + var _d_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[69], _d_, i); + } + function get_int32_be(s, i){ + var _c_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[68], _c_, i); + } + function get_int64_le(s, i){ + var _b_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[72], _b_, i); + } + function get_int64_be(s, i){ + var _a_ = caml_call1(bos, s); + return caml_call2(Stdlib_Bytes[71], _a_, i); + } + var + Stdlib_String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + caml_string_equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + runtime.caml_string_get, + get_int8, + runtime.caml_string_get16, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + runtime.caml_string_get32, + hash, + caml_string_hash, + get_int32_be, + get_int32_le, + runtime.caml_string_get64, + get_int64_be, + get_int64_le]; + runtime.caml_register_global(12, Stdlib_String, "Stdlib__String"); + return; + } + (globalThis)); + +//# 5208 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = "()"; + function equal(param, _b_){return 1;} + function compare(param, _a_){return 0;} + function to_string(param){return cst;} + var Stdlib_Unit = [0, equal, compare, to_string]; + runtime.caml_register_global(1, Stdlib_Unit, "Stdlib__Unit"); + return; + } + (globalThis)); + +//# 5286 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_array_sub = runtime.caml_array_sub, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Floatarray = [0], + _a_ = [0, "array.ml", 319, 4], + cst_Array_combine = "Array.combine", + cst_Array_exists2 = "Array.exists2", + cst_Array_for_all2 = "Array.for_all2", + cst_Array_map2_arrays_must_hav = + "Array.map2: arrays must have the same length", + cst_Array_iter2_arrays_must_ha = + "Array.iter2: arrays must have the same length", + cst_Array_blit = "Array.blit", + cst_Array_fill = "Array.fill", + cst_Array_sub = "Array.sub", + cst_Array_init = "Array.init", + cst_Stdlib_Array_Bottom = "Stdlib.Array.Bottom"; + function init(l, f){ + if(0 === l) return [0]; + if(0 > l) return caml_call1(Stdlib[1], cst_Array_init); + var res = caml_make_vect(l, caml_call1(f, 0)), _as_ = l - 1 | 0, _ar_ = 1; + if(_as_ >= 1){ + var i = _ar_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _at_ = i + 1 | 0; + if(_as_ !== i){var i = _at_; continue;} + break; + } + } + return res; + } + function make_matrix(sx, sy, init){ + var res = caml_make_vect(sx, [0]), _ap_ = sx - 1 | 0, _ao_ = 0; + if(_ap_ >= 0){ + var x = _ao_; + for(;;){ + res[1 + x] = caml_make_vect(sy, init); + var _aq_ = x + 1 | 0; + if(_ap_ !== x){var x = _aq_; continue;} + break; + } + } + return res; + } + function copy(a){ + var l = a.length - 1; + return 0 === l ? [0] : caml_array_sub(a, 0, l); + } + function append(a1, a2){ + var l1 = a1.length - 1; + return 0 === l1 + ? copy(a2) + : 0 + === a2.length - 1 + ? caml_array_sub(a1, 0, l1) + : runtime.caml_array_append(a1, a2); + } + function sub(a, ofs, len){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return caml_array_sub(a, ofs, len); + return caml_call1(Stdlib[1], cst_Array_sub); + } + function fill(a, ofs, len, v){ + if(0 <= ofs && 0 <= len && (a.length - 1 - len | 0) >= ofs) + return runtime.caml_array_fill(a, ofs, len, v); + return caml_call1(Stdlib[1], cst_Array_fill); + } + function blit(a1, ofs1, a2, ofs2, len){ + if + (0 <= len + && + 0 <= ofs1 + && + (a1.length - 1 - len | 0) >= ofs1 + && 0 <= ofs2 && (a2.length - 1 - len | 0) >= ofs2) + return runtime.caml_array_blit(a1, ofs1, a2, ofs2, len); + return caml_call1(Stdlib[1], cst_Array_blit); + } + function iter(f, a){ + var _am_ = a.length - 1 - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var i = _al_; + for(;;){ + caml_call1(f, a[1 + i]); + var _an_ = i + 1 | 0; + if(_am_ !== i){var i = _an_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Array_iter2_arrays_must_ha); + var _aj_ = a.length - 1 - 1 | 0, _ai_ = 0; + if(_aj_ >= 0){ + var i = _ai_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ak_ = i + 1 | 0; + if(_aj_ !== i){var i = _ak_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call1(f, a[1])), + _ag_ = l - 1 | 0, + _af_ = 1; + if(_ag_ >= 1){ + var i = _af_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _ah_ = i + 1 | 0; + if(_ag_ !== i){var i = _ah_; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Array_map2_arrays_must_hav); + if(0 === la) return [0]; + var + r = caml_make_vect(la, caml_call2(f, a[1], b[1])), + _ad_ = la - 1 | 0, + _ac_ = 1; + if(_ad_ >= 1){ + var i = _ac_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = caml_make_vect(l, caml_call2(f, 0, a[1])), + _Z_ = l - 1 | 0, + _Y_ = 1; + if(_Z_ >= 1){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function to_list(a){ + var i$1 = a.length - 1 - 1 | 0, i = i$1, res = 0; + for(;;){ + if(0 > i) return res; + var res$0 = [0, a[1 + i], res], i$0 = i - 1 | 0, i = i$0, res = res$0; + } + } + function list_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + t = param$0[2], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = t; + } + } + function of_list(l){ + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + a = caml_make_vect(list_length(0, l), hd), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i + 1 | 0, i = i$0, param = tl$0; + } + } + function fold_left(f, x, a){ + var r = [0, x], _W_ = a.length - 1 - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r[1]; + } + function fold_left_map(f, acc, input_array){ + var len = input_array.length - 1; + if(0 === len) return [0, acc, [0]]; + var + match = caml_call2(f, acc, input_array[1]), + elt = match[2], + acc$0 = match[1], + output_array = caml_make_vect(len, elt), + acc$1 = [0, acc$0], + _T_ = len - 1 | 0, + _S_ = 1; + if(_T_ >= 1){ + var i = _S_; + for(;;){ + var + match$0 = caml_call2(f, acc$1[1], input_array[1 + i]), + elt$0 = match$0[2], + acc$2 = match$0[1]; + acc$1[1] = acc$2; + output_array[1 + i] = elt$0; + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return [0, acc$1[1], output_array]; + } + function fold_right(f, a, x){ + var r = [0, x], _Q_ = a.length - 1 - 1 | 0; + if(_Q_ >= 0){ + var i = _Q_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _R_ = i - 1 | 0; + if(0 !== i){var i = _R_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_for_all2); + var i = 0; + for(;;){ + if(i === n1) return 1; + if(! caml_call2(p, l1[1 + i], l2[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function exists2(p, l1, l2){ + var n1 = l1.length - 1, n2 = l2.length - 1; + if(n1 !== n2) return caml_call1(Stdlib[1], cst_Array_exists2); + var i = 0; + for(;;){ + if(i === n1) return 0; + if(caml_call2(p, l1[1 + i], l2[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === runtime.caml_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function memq(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x === a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_opt(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var x = a[1 + i]; + if(caml_call1(p, x)) return [0, x]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function find_map(f, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + var r = caml_call1(f, a[1 + i]); + if(r) return r; + var i$0 = i + 1 | 0, i = i$0; + } + } + function split(x){ + if(runtime.caml_equal(x, [0])) return [0, [0], [0]]; + var + match = x[1], + b0 = match[2], + a0 = match[1], + n = x.length - 1, + a = caml_make_vect(n, a0), + b = caml_make_vect(n, b0), + _O_ = n - 1 | 0, + _N_ = 1; + if(_O_ >= 1){ + var i = _N_; + for(;;){ + var match$0 = x[1 + i], bi = match$0[2], ai = match$0[1]; + a[1 + i] = ai; + b[1 + i] = bi; + var _P_ = i + 1 | 0; + if(_O_ !== i){var i = _P_; continue;} + break; + } + } + return [0, a, b]; + } + function combine(a, b){ + var na = a.length - 1, nb = b.length - 1; + if(na !== nb) caml_call1(Stdlib[1], cst_Array_combine); + if(0 === na) return [0]; + var x = caml_make_vect(na, [0, a[1], b[1]]), _L_ = na - 1 | 0, _K_ = 1; + if(_L_ >= 1){ + var i = _K_; + for(;;){ + x[1 + i] = [0, a[1 + i], b[1 + i]]; + var _M_ = i + 1 | 0; + if(_L_ !== i){var i = _M_; continue;} + break; + } + } + return x; + } + var Bottom = [248, cst_Stdlib_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + var _D_ = i31 + 1 | 0, _E_ = caml_check_bound(a, _D_)[1 + _D_]; + if(caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _E_) < 0) + x[1] = i31 + 1 | 0; + var + _F_ = i31 + 2 | 0, + _G_ = caml_check_bound(a, _F_)[1 + _F_], + _H_ = x[1]; + if(caml_call2(cmp, caml_check_bound(a, _H_)[1 + _H_], _G_) < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if((i31 + 1 | 0) < l){ + var _I_ = i31 + 1 | 0, _J_ = caml_check_bound(a, _I_)[1 + _I_]; + if(0 > caml_call2(cmp, caml_check_bound(a, i31)[1 + i31], _J_)) + return i31 + 1 | 0; + } + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _x_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_x_ >= 0){ + var i$6 = _x_; + for(;;){ + var e$1 = caml_check_bound(a, i$6)[1 + i$6]; + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_check_bound(a, j)[1 + j], e$1)){ + var _u_ = caml_check_bound(a, j)[1 + j]; + caml_check_bound(a, i)[1 + i] = _u_; + var i = j; + continue; + } + caml_check_bound(a, i)[1 + i] = e$1; + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_check_bound(a, i$0)[1 + i$0] = e$1; + } + var _C_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _C_; continue;} + break; + } + } + var _y_ = l - 1 | 0; + if(_y_ >= 2){ + var i$4 = _y_; + a: + for(;;){ + var e$0 = caml_check_bound(a, i$4)[1 + i$4]; + a[1 + i$4] = caml_check_bound(a, 0)[1]; + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1), _v_ = caml_check_bound(a, j$0)[1 + j$0]; + caml_check_bound(a, i$1)[1 + i$1] = _v_; + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(0 <= caml_call2(cmp, caml_check_bound(a, father)[1 + father], e$0)) + caml_check_bound(a, i$3)[1 + i$3] = e$0; + else{ + var _w_ = caml_check_bound(a, father)[1 + father]; + caml_check_bound(a, i$3)[1 + i$3] = _w_; + if(0 < father){var i$3 = father; continue;} + caml_check_bound(a, 0)[1] = e$0; + } + var _B_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _B_; continue a;} + break; + } + } + break; + } + } + var _z_ = 1 < l ? 1 : 0; + if(_z_){ + var e = caml_check_bound(a, 1)[2]; + a[2] = caml_check_bound(a, 0)[1]; + a[1] = e; + var _A_ = 0; + } + else + var _A_ = _z_; + return _A_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_check_bound(src2, src2ofs)[1 + src2ofs], + s1$1 = caml_check_bound(a, src1ofs)[1 + src1ofs], + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_check_bound(dst, d)[1 + d] = s2; + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_check_bound(src2, i2$0)[1 + i2$0], + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_check_bound(dst, d)[1 + d] = s1; + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_check_bound(a, i1$0)[1 + i1$0], + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _m_ = len - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + a: + for(;;){ + var + _n_ = srcofs + i | 0, + e = caml_check_bound(a, _n_)[1 + _n_], + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if(dstofs <= j[1]){ + var _o_ = j[1]; + if(0 < caml_call2(cmp, caml_check_bound(dst, _o_)[1 + _o_], e)){ + var + _p_ = j[1], + _q_ = caml_check_bound(dst, _p_)[1 + _p_], + _r_ = j[1] + 1 | 0; + caml_check_bound(dst, _r_)[1 + _r_] = _q_; + j[1] += -1; + continue; + } + } + var _s_ = j[1] + 1 | 0; + caml_check_bound(dst, _s_)[1 + _s_] = e; + var _t_ = i + 1 | 0; + if(_m_ !== i){var i = _t_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var + l1 = l / 2 | 0, + l2 = l - l1 | 0, + t = caml_make_vect(l2, caml_check_bound(a, 0)[1]); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _j_ = i + 1 | 0; + return [0, x, function(_k_){return aux(_j_, _k_);}]; + } + var _h_ = 0; + return function(_i_){return aux(_h_, _i_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _f_ = i + 1 | 0; + return [0, [0, i, x], function(_g_){return aux(_f_, _g_);}]; + } + var _d_ = 0; + return function(_e_){return aux(_d_, _e_);}; + } + function of_seq(i$2){ + var _b_ = 0; + function _c_(acc, x){return [0, x, acc];} + var l = caml_call3(Stdlib_Seq[5], _c_, _b_, i$2); + if(! l) return [0]; + var + tl = l[2], + hd = l[1], + len = list_length(0, l), + a = caml_make_vect(len, hd), + i$1 = len - 2 | 0, + i = i$1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = hd$0; + var i$0 = i - 1 | 0, i = i$0, param = tl$0; + } + } + var + Stdlib_Array = + [0, + init, + make_matrix, + append, + runtime.caml_array_concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(14, Stdlib_Array, "Stdlib__Array"); + return; + } + (globalThis)); + +//# 5961 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Float_array_blit$1 = "Float.array.blit", + cst_float_ml = "float.ml", + caml_array_get = runtime.caml_array_get, + caml_array_set = runtime.caml_array_set, + caml_float_compare = runtime.caml_float_compare, + caml_floatarray_blit = runtime.caml_floatarray_blit, + caml_floatarray_create = runtime.caml_floatarray_create, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_nextafter_float = runtime.caml_nextafter_float, + caml_signbit_float = runtime.caml_signbit_float, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + _b_ = [0, cst_float_ml, 395, 6], + cst_Float_Array_map2_arrays_mu = + "Float.Array.map2: arrays must have the same length", + cst_Float_Array_iter2_arrays_m = + "Float.Array.iter2: arrays must have the same length", + cst_Float_array_blit = cst_Float_array_blit$1, + cst_Float_array_blit$0 = cst_Float_array_blit$1, + cst_Float_Array_fill = "Float.Array.fill", + cst_Float_Array_sub = "Float.Array.sub", + _a_ = [0, cst_float_ml, 222, 14], + cst_Float_Array_concat = "Float.Array.concat", + cst_Float_Array_init = "Float.Array.init", + cst_Stdlib_Float_Array_Bottom = "Stdlib.Float.Array.Bottom", + zero = 0., + one = 1., + minus_one = -1.; + function is_finite(x){return x - x == 0. ? 1 : 0;} + function is_infinite(x){return 1. / x == 0. ? 1 : 0;} + function is_nan(x){return x != x ? 1 : 0;} + var + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon = Stdlib[27], + of_string_opt = Stdlib[36], + to_string = Stdlib[35], + pi = 3.141592653589793; + function is_integer(x){ + var _aq_ = x == runtime.caml_trunc_float(x) ? 1 : 0; + return _aq_ ? is_finite(x) : _aq_; + } + function succ(x){return caml_nextafter_float(x, infinity);} + function pred(x){return caml_nextafter_float(x, neg_infinity);} + function equal(x, y){return 0 === caml_float_compare(x, y) ? 1 : 0;} + function min(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? x : y; + } + return y != y ? y : x; + } + function max(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? y : x; + } + return x != x ? x : y; + } + function min_max(x, y){ + if(x == x && y == y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + return [0, nan, nan]; + } + function min_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return y != y ? x : y; + } + return x != x ? y : x; + } + function max_num(x, y){ + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return x != x ? y : x; + } + return y != y ? x : y; + } + function min_max_num(x, y){ + if(x != x) return [0, y, y]; + if(y != y) return [0, x, x]; + if(! (x < y)){ + var switch$0 = 0; + if(! caml_signbit_float(y) && caml_signbit_float(x)) switch$0 = 1; + if(! switch$0) return [0, y, x]; + } + return [0, x, y]; + } + function hash(x){return runtime.caml_hash(10, 100, 0, x);} + function unsafe_fill(a, ofs, len, v){ + var _ao_ = (ofs + len | 0) - 1 | 0; + if(_ao_ >= ofs){ + var i = ofs; + for(;;){ + a[1 + i] = v; + var _ap_ = i + 1 | 0; + if(_ao_ !== i){var i = _ap_; continue;} + break; + } + } + return 0; + } + function check(a, ofs, len, msg){ + var _ak_ = ofs < 0 ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else{ + var _am_ = len < 0 ? 1 : 0; + if(_am_) + var _al_ = _am_; + else + var + _an_ = (ofs + len | 0) < 0 ? 1 : 0, + _al_ = _an_ || (a.length - 1 < (ofs + len | 0) ? 1 : 0); + } + return _al_ ? caml_call1(Stdlib[1], msg) : _al_; + } + function make(n, v){ + var result = caml_floatarray_create(n); + unsafe_fill(result, 0, n, v); + return result; + } + function init(l, f){ + if(0 > l) return caml_call1(Stdlib[1], cst_Float_Array_init); + var res = caml_floatarray_create(l), _ai_ = l - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + for(;;){ + res[1 + i] = caml_call1(f, i); + var _aj_ = i + 1 | 0; + if(_ai_ !== i){var i = _aj_; continue;} + break; + } + } + return res; + } + function append(a1, a2){ + var + l1 = a1.length - 1, + l2 = a2.length - 1, + result = caml_floatarray_create(l1 + l2 | 0); + caml_floatarray_blit(a1, 0, result, 0, l1); + caml_floatarray_blit(a2, 0, result, l1, l2); + return result; + } + function concat(l){ + var acc = 0, param = l; + for(;;){ + if(param){ + var + tl = param[2], + hd = param[1], + x = hd.length - 1 + acc | 0, + acc$0 = acc <= x ? x : caml_call1(Stdlib[1], cst_Float_Array_concat), + acc = acc$0, + param = tl; + continue; + } + var result = caml_floatarray_create(acc), l$0 = l, i = 0; + for(;;){ + if(l$0){ + var tl$0 = l$0[2], hd$0 = l$0[1], hlen = hd$0.length - 1; + caml_floatarray_blit(hd$0, 0, result, i, hlen); + var i$0 = i + hlen | 0, l$0 = tl$0, i = i$0; + continue; + } + if(i === acc) return result; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + } + function sub(a, ofs, len){ + check(a, ofs, len, cst_Float_Array_sub); + var result = caml_floatarray_create(len); + caml_floatarray_blit(a, ofs, result, 0, len); + return result; + } + function copy(a){ + var l = a.length - 1, result = caml_floatarray_create(l); + caml_floatarray_blit(a, 0, result, 0, l); + return result; + } + function fill(a, ofs, len, v){ + check(a, ofs, len, cst_Float_Array_fill); + return unsafe_fill(a, ofs, len, v); + } + function blit(src, sofs, dst, dofs, len){ + check(src, sofs, len, cst_Float_array_blit); + check(dst, dofs, len, cst_Float_array_blit$0); + return caml_floatarray_blit(src, sofs, dst, dofs, len); + } + function to_list(a){ + function _af_(_ag_){return a[1 + _ag_];} + return caml_call2(Stdlib_List[10], a.length - 1, _af_); + } + function of_list(l){ + var + result = caml_floatarray_create(caml_call1(Stdlib_List[1], l)), + i = 0, + l$0 = l; + for(;;){ + if(! l$0) return result; + var t = l$0[2], h = l$0[1]; + result[1 + i] = h; + var i$0 = i + 1 | 0, i = i$0, l$0 = t; + } + } + function iter(f, a){ + var _ad_ = a.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + caml_call1(f, a[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return 0; + } + function iter2(f, a, b){ + if(a.length - 1 !== b.length - 1) + return caml_call1(Stdlib[1], cst_Float_Array_iter2_arrays_m); + var _aa_ = a.length - 1 - 1 | 0, _$_ = 0; + if(_aa_ >= 0){ + var i = _$_; + for(;;){ + caml_call2(f, a[1 + i], b[1 + i]); + var _ab_ = i + 1 | 0; + if(_aa_ !== i){var i = _ab_; continue;} + break; + } + } + return 0; + } + function map(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Z_ = l - 1 | 0, + _Y_ = 0; + if(_Z_ >= 0){ + var i = _Y_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var ___ = i + 1 | 0; + if(_Z_ !== i){var i = ___; continue;} + break; + } + } + return r; + } + function map2(f, a, b){ + var la = a.length - 1, lb = b.length - 1; + if(la !== lb) + return caml_call1(Stdlib[1], cst_Float_Array_map2_arrays_mu); + var r = caml_floatarray_create(la), _W_ = la - 1 | 0, _V_ = 0; + if(_W_ >= 0){ + var i = _V_; + for(;;){ + r[1 + i] = caml_call2(f, a[1 + i], b[1 + i]); + var _X_ = i + 1 | 0; + if(_W_ !== i){var i = _X_; continue;} + break; + } + } + return r; + } + function iteri(f, a){ + var _T_ = a.length - 1 - 1 | 0, _S_ = 0; + if(_T_ >= 0){ + var i = _S_; + for(;;){ + caml_call2(f, i, a[1 + i]); + var _U_ = i + 1 | 0; + if(_T_ !== i){var i = _U_; continue;} + break; + } + } + return 0; + } + function mapi(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _Q_ = l - 1 | 0, + _P_ = 0; + if(_Q_ >= 0){ + var i = _P_; + for(;;){ + r[1 + i] = caml_call2(f, i, a[1 + i]); + var _R_ = i + 1 | 0; + if(_Q_ !== i){var i = _R_; continue;} + break; + } + } + return r; + } + function fold_left(f, x, a){ + var r = [0, x], _N_ = a.length - 1 - 1 | 0, _M_ = 0; + if(_N_ >= 0){ + var i = _M_; + for(;;){ + r[1] = caml_call2(f, r[1], a[1 + i]); + var _O_ = i + 1 | 0; + if(_N_ !== i){var i = _O_; continue;} + break; + } + } + return r[1]; + } + function fold_right(f, a, x){ + var r = [0, x], _K_ = a.length - 1 - 1 | 0; + if(_K_ >= 0){ + var i = _K_; + for(;;){ + r[1] = caml_call2(f, a[1 + i], r[1]); + var _L_ = i - 1 | 0; + if(0 !== i){var i = _L_; continue;} + break; + } + } + return r[1]; + } + function exists(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(caml_call1(p, a[1 + i])) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function for_all(p, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 1; + if(! caml_call1(p, a[1 + i])) return 0; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(0 === caml_float_compare(a[1 + i], x)) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + function mem_ieee(x, a){ + var n = a.length - 1, i = 0; + for(;;){ + if(i === n) return 0; + if(x == a[1 + i]) return 1; + var i$0 = i + 1 | 0, i = i$0; + } + } + var + Bottom = [248, cst_Stdlib_Float_Array_Bottom, runtime.caml_fresh_oo_id(0)]; + function sort(cmp, a){ + function maxson(l, i){ + var i31 = ((i + i | 0) + i | 0) + 1 | 0, x = [0, i31]; + if((i31 + 2 | 0) < l){ + if + (caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0)) + < 0) + x[1] = i31 + 1 | 0; + if + (caml_call2 + (cmp, caml_array_get(a, x[1]), caml_array_get(a, i31 + 2 | 0)) + < 0) + x[1] = i31 + 2 | 0; + return x[1]; + } + if + ((i31 + 1 | 0) < l + && + 0 + > + caml_call2 + (cmp, caml_array_get(a, i31), caml_array_get(a, i31 + 1 | 0))) + return i31 + 1 | 0; + if(i31 < l) return i31; + throw caml_maybe_attach_backtrace([0, Bottom, i], 1); + } + var l = a.length - 1, _E_ = ((l + 1 | 0) / 3 | 0) - 1 | 0; + if(_E_ >= 0){ + var i$6 = _E_; + for(;;){ + var e$1 = caml_array_get(a, i$6); + try{ + var i = i$6; + for(;;){ + var j = maxson(l, i); + if(0 < caml_call2(cmp, caml_array_get(a, j), e$1)){ + caml_array_set(a, i, caml_array_get(a, j)); + var i = j; + continue; + } + caml_array_set(a, i, e$1); + break; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Bottom) throw caml_maybe_attach_backtrace(exn, 0); + var i$0 = exn[2]; + caml_array_set(a, i$0, e$1); + } + var _J_ = i$6 - 1 | 0; + if(0 !== i$6){var i$6 = _J_; continue;} + break; + } + } + var _F_ = l - 1 | 0; + if(_F_ >= 2){ + var i$4 = _F_; + a: + for(;;){ + var e$0 = caml_array_get(a, i$4); + caml_array_set(a, i$4, caml_array_get(a, 0)); + var i$5 = 0; + try{ + var i$1 = i$5; + for(;;){ + var j$0 = maxson(i$4, i$1); + caml_array_set(a, i$1, caml_array_get(a, j$0)); + var i$1 = j$0; + } + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Bottom) throw caml_maybe_attach_backtrace(exn$0, 0); + var i$2 = exn$0[2], i$3 = i$2; + for(;;){ + var father = (i$3 - 1 | 0) / 3 | 0; + if(i$3 === father) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(0 <= caml_call2(cmp, caml_array_get(a, father), e$0)) + caml_array_set(a, i$3, e$0); + else{ + caml_array_set(a, i$3, caml_array_get(a, father)); + if(0 < father){var i$3 = father; continue;} + caml_array_set(a, 0, e$0); + } + var _I_ = i$4 - 1 | 0; + if(2 !== i$4){var i$4 = _I_; continue a;} + break; + } + } + break; + } + } + var _G_ = 1 < l ? 1 : 0; + if(_G_){ + var e = caml_array_get(a, 1); + caml_array_set(a, 1, caml_array_get(a, 0)); + var _H_ = caml_array_set(a, 0, e); + } + else + var _H_ = _G_; + return _H_; + } + function stable_sort(cmp, a){ + function merge(src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs){ + var + src1r = src1ofs + src1len | 0, + src2r = src2ofs + src2len | 0, + s2$1 = caml_array_get(src2, src2ofs), + s1$1 = caml_array_get(a, src1ofs), + i1 = src1ofs, + s1 = s1$1, + i2 = src2ofs, + s2 = s2$1, + d = dstofs; + for(;;){ + if(0 < caml_call2(cmp, s1, s2)){ + caml_array_set(dst, d, s2); + var i2$0 = i2 + 1 | 0; + if(i2$0 >= src2r) return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0); + var + d$0 = d + 1 | 0, + s2$0 = caml_array_get(src2, i2$0), + i2 = i2$0, + s2 = s2$0, + d = d$0; + continue; + } + caml_array_set(dst, d, s1); + var i1$0 = i1 + 1 | 0; + if(i1$0 >= src1r) return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); + var + d$1 = d + 1 | 0, + s1$0 = caml_array_get(a, i1$0), + i1 = i1$0, + s1 = s1$0, + d = d$1; + } + } + function isortto(srcofs, dst, dstofs, len){ + var _C_ = len - 1 | 0, _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + a: + for(;;){ + var + e = caml_array_get(a, srcofs + i | 0), + j = [0, (dstofs + i | 0) - 1 | 0]; + for(;;){ + if + (dstofs <= j[1] && 0 < caml_call2(cmp, caml_array_get(dst, j[1]), e)){ + caml_array_set(dst, j[1] + 1 | 0, caml_array_get(dst, j[1])); + j[1] += -1; + continue; + } + caml_array_set(dst, j[1] + 1 | 0, e); + var _D_ = i + 1 | 0; + if(_C_ !== i){var i = _D_; continue a;} + break; + } + break; + } + } + return 0; + } + function sortto(srcofs, dst, dstofs, len){ + if(len <= 5) return isortto(srcofs, dst, dstofs, len); + var l1 = len / 2 | 0, l2 = len - l1 | 0; + sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); + sortto(srcofs, a, srcofs + l2 | 0, l1); + return merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); + } + var l = a.length - 1; + if(l <= 5) return isortto(0, a, 0, l); + var l1 = l / 2 | 0, l2 = l - l1 | 0, t = caml_floatarray_create(l2); + sortto(l1, t, 0, l2); + sortto(0, a, l2, l1); + return merge(l2, l1, t, 0, l2, a, 0); + } + function to_seq(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _z_ = i + 1 | 0; + return [0, x, function(_A_){return aux(_z_, _A_);}]; + } + var _x_ = 0; + return function(_y_){return aux(_x_, _y_);}; + } + function to_seqi(a){ + function aux(i, param){ + if(i >= a.length - 1) return 0; + var x = a[1 + i], _v_ = i + 1 | 0; + return [0, [0, i, x], function(_w_){return aux(_v_, _w_);}]; + } + var _t_ = 0; + return function(_u_){return aux(_t_, _u_);}; + } + function of_seq(i$2){ + var _r_ = 0; + function _s_(acc, x){return [0, x, acc];} + var + l = caml_call3(Stdlib_Seq[5], _s_, _r_, i$2), + len = caml_call1(Stdlib_List[1], l), + a = caml_floatarray_create(len), + i$1 = len - 1 | 0, + i = i$1, + param = l; + for(;;){ + if(! param) return a; + var tl = param[2], hd = param[1]; + a[1 + i] = hd; + var i$0 = i - 1 | 0, i = i$0, param = tl; + } + } + function map_to_array(f, a){ + var l = a.length - 1; + if(0 === l) return [0]; + var + r = runtime.caml_make_vect(l, caml_call1(f, a[1])), + _p_ = l - 1 | 0, + _o_ = 1; + if(_p_ >= 1){ + var i = _o_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return r; + } + function map_from_array(f, a){ + var + l = a.length - 1, + r = caml_floatarray_create(l), + _m_ = l - 1 | 0, + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + r[1 + i] = caml_call1(f, a[1 + i]); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return r; + } + var + _c_ = caml_floatarray_create, + _d_ = caml_array_set, + _e_ = caml_array_get, + _f_ = + [0, + function(_k_){return _k_.length - 1;}, + _e_, + _d_, + make, + _c_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _g_ = caml_floatarray_create, + _h_ = caml_array_set, + _i_ = caml_array_get, + Stdlib_Float = + [0, + zero, + one, + minus_one, + succ, + pred, + infinity, + neg_infinity, + nan, + pi, + max_float, + min_float, + epsilon, + is_finite, + is_infinite, + is_nan, + is_integer, + of_string_opt, + to_string, + caml_float_compare, + equal, + min, + max, + min_max, + min_num, + max_num, + min_max_num, + hash, + [0, + function(_j_){return _j_.length - 1;}, + _i_, + _h_, + make, + _g_, + init, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + iter2, + map2, + for_all, + exists, + mem, + mem_ieee, + sort, + stable_sort, + stable_sort, + to_seq, + to_seqi, + of_seq, + map_to_array, + map_from_array], + _f_]; + runtime.caml_register_global(22, Stdlib_Float, "Stdlib__Float"); + return; + } + (globalThis)); + +//# 6723 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "int32.ml", 69, 6], + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var min_int = -2147483648, max_int = 2147483647; + function lognot(n){return n ^ -1;} + var _a_ = Stdlib_Sys[9]; + if(32 === _a_) + var + max_int$0 = Stdlib[19], + unsigned_to_int = + function(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + }; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var unsigned_to_int = function(n){return [0, n & -1];}; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _d_ = [0, runtime.caml_int_of_string(s)]; return _d_;} + catch(_e_){ + var _c_ = caml_wrap_exception(_e_); + if(_c_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_c_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n + 2147483648 | 0, m + 2147483648 | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Int32 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(14, Stdlib_Int32, "Stdlib__Int32"); + return; + } + (globalThis)); + +//# 6815 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_sub = runtime.caml_int64_sub, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + zero = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + one = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + minus_one = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + min_int = runtime.caml_int64_create_lo_mi_hi(0, 0, 32768), + max_int = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Stdlib = global_data.Stdlib, + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function succ(n){return runtime.caml_int64_add(n, _a_);} + function pred(n){return caml_int64_sub(n, _b_);} + function abs(n){ + return caml_greaterequal(n, _c_) ? n : runtime.caml_int64_neg(n); + } + function lognot(n){return runtime.caml_int64_xor(n, _d_);} + var max_int$0 = runtime.caml_int64_of_int32(Stdlib[19]); + function unsigned_to_int(n){ + if + (0 >= caml_int64_compare(zero, n) + && 0 >= caml_int64_compare(n, max_int$0)) + return [0, runtime.caml_int64_to_int32(n)]; + return 0; + } + function to_string(n){return runtime.caml_int64_format("%d", n);} + function of_string_opt(s){ + try{var _f_ = [0, runtime.caml_int64_of_string(s)]; return _f_;} + catch(_g_){ + var _e_ = caml_wrap_exception(_g_); + if(_e_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_e_, 0); + } + } + function compare(x, y){return caml_int64_compare(x, y);} + function equal(x, y){return 0 === caml_int64_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int64_compare + (caml_int64_sub(n, min_int), caml_int64_sub(m, min_int)); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, zero)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var + q = + runtime.caml_int64_shift_left + (runtime.caml_int64_div + (runtime.caml_int64_shift_right_unsigned(n, 1), d), + 1), + r = caml_int64_sub(n, caml_int64_mul(q, d)); + return 0 <= unsigned_compare(r, d) ? succ(q) : q; + } + function unsigned_rem(n, d){ + return caml_int64_sub(n, caml_int64_mul(unsigned_div(n, d), d)); + } + var + Stdlib_Int64 = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(11, Stdlib_Int64, "Stdlib__Int64"); + return; + } + (globalThis)); + +//# 6912 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul, + caml_wrap_exception = runtime.caml_wrap_exception, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + zero = 0, + one = 1, + minus_one = -1; + function succ(n){return n + 1 | 0;} + function pred(n){return n - 1 | 0;} + function abs(n){return caml_greaterequal(n, 0) ? n : - n | 0;} + var + size = Stdlib_Sys[9], + min_int = 1 << (size - 1 | 0), + max_int = min_int - 1 | 0; + function lognot(n){return n ^ -1;} + var max_int$0 = Stdlib[19]; + function unsigned_to_int(n){ + if(0 >= caml_int_compare(0, n) && 0 >= caml_int_compare(n, max_int$0)) + return [0, n]; + return 0; + } + function to_string(n){return runtime.caml_format_int("%d", n);} + function of_string_opt(s){ + try{var _b_ = [0, runtime.caml_int_of_string(s)]; return _b_;} + catch(_c_){ + var _a_ = caml_wrap_exception(_c_); + if(_a_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_a_, 0); + } + } + var compare = caml_int_compare; + function equal(x, y){return 0 === caml_int_compare(x, y) ? 1 : 0;} + function unsigned_compare(n, m){ + return caml_int_compare(n - min_int | 0, m - min_int | 0); + } + function min(x, y){return runtime.caml_lessequal(x, y) ? x : y;} + function max(x, y){return caml_greaterequal(x, y) ? x : y;} + function unsigned_div(n, d){ + if(runtime.caml_lessthan(d, 0)) + return 0 <= unsigned_compare(n, d) ? one : zero; + var q = runtime.caml_div(n >>> 1 | 0, d) << 1, r = n - caml_mul(q, d) | 0; + return 0 <= unsigned_compare(r, d) ? q + 1 | 0 : q; + } + function unsigned_rem(n, d){ + return n - caml_mul(unsigned_div(n, d), d) | 0; + } + var + Stdlib_Nativeint = + [0, + zero, + one, + minus_one, + unsigned_div, + unsigned_rem, + succ, + pred, + abs, + size, + max_int, + min_int, + lognot, + unsigned_to_int, + of_string_opt, + to_string, + compare, + unsigned_compare, + equal, + min, + max]; + runtime.caml_register_global(12, Stdlib_Nativeint, "Stdlib__Nativeint"); + return; + } + (globalThis)); + +//# 6997 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = "", + caml_bytes_get = runtime.caml_bytes_get, + caml_check_bound = runtime.caml_check_bound, + caml_create_bytes = runtime.caml_create_bytes, + caml_ml_bytes_length = runtime.caml_ml_bytes_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + dummy_pos = [0, cst, 0, 0, -1], + zero_pos = [0, cst, 1, 0, 0], + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib = global_data.Stdlib, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Int = global_data.Stdlib__Int, + cst_Lexing_lex_refill_cannot_g = "Lexing.lex_refill: cannot grow buffer"; + function engine(tbl, state, buf){ + var + result = runtime.caml_lex_engine(tbl, state, buf), + _F_ = 0 <= result ? 1 : 0, + _G_ = _F_ ? buf[12] !== dummy_pos ? 1 : 0 : _F_; + if(_G_){ + buf[11] = buf[12]; + var _H_ = buf[12]; + buf[12] = [0, _H_[1], _H_[2], _H_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function new_engine(tbl, state, buf){ + var + result = runtime.caml_new_lex_engine(tbl, state, buf), + _C_ = 0 <= result ? 1 : 0, + _D_ = _C_ ? buf[12] !== dummy_pos ? 1 : 0 : _C_; + if(_D_){ + buf[11] = buf[12]; + var _E_ = buf[12]; + buf[12] = [0, _E_[1], _E_[2], _E_[3], buf[4] + buf[6] | 0]; + } + return result; + } + function from_function(opt, read_fun){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _o_ = with_positions ? zero_pos : dummy_pos, + _p_ = with_positions ? zero_pos : dummy_pos, + aux_buffer = caml_create_bytes(512), + _q_ = [0], + _r_ = 0, + _s_ = 0, + _t_ = 0, + _u_ = 0, + _v_ = 0, + _w_ = 0, + _x_ = 0, + _y_ = caml_create_bytes(1024); + return [0, + function(lexbuf){ + var + read = + caml_call2 + (read_fun, aux_buffer, caml_ml_bytes_length(aux_buffer)), + n = 0 < read ? read : (lexbuf[9] = 1, 0); + if(caml_ml_bytes_length(lexbuf[2]) < (lexbuf[3] + n | 0)){ + if + (((lexbuf[3] - lexbuf[5] | 0) + n | 0) + <= caml_ml_bytes_length(lexbuf[2])) + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + lexbuf[2], + 0, + lexbuf[3] - lexbuf[5] | 0); + else{ + var + newlen = + caml_call2 + (Stdlib_Int[10], + 2 * caml_ml_bytes_length(lexbuf[2]) | 0, + Stdlib_Sys[12]); + if(newlen < ((lexbuf[3] - lexbuf[5] | 0) + n | 0)) + caml_call1(Stdlib[2], cst_Lexing_lex_refill_cannot_g); + var newbuf = caml_create_bytes(newlen); + caml_call5 + (Stdlib_Bytes[11], + lexbuf[2], + lexbuf[5], + newbuf, + 0, + lexbuf[3] - lexbuf[5] | 0); + lexbuf[2] = newbuf; + } + var s = lexbuf[5]; + lexbuf[4] = lexbuf[4] + s | 0; + lexbuf[6] = lexbuf[6] - s | 0; + lexbuf[5] = 0; + lexbuf[7] = lexbuf[7] - s | 0; + lexbuf[3] = lexbuf[3] - s | 0; + var t = lexbuf[10], _A_ = t.length - 1 - 1 | 0, _z_ = 0; + if(_A_ >= 0){ + var i = _z_; + for(;;){ + var v = caml_check_bound(t, i)[1 + i]; + if(0 <= v) caml_check_bound(t, i)[1 + i] = v - s | 0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + } + caml_call5 + (Stdlib_Bytes[11], aux_buffer, 0, lexbuf[2], lexbuf[3], n); + lexbuf[3] = lexbuf[3] + n | 0; + return 0; + }, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_]; + } + function from_channel(with_positions, ic){ + return from_function + (with_positions, + function(buf, n){return caml_call4(Stdlib[84], ic, buf, 0, n);}); + } + function from_string(opt, s){ + if(opt) + var sth = opt[1], with_positions = sth; + else + var with_positions = 1; + var + _d_ = with_positions ? zero_pos : dummy_pos, + _e_ = with_positions ? zero_pos : dummy_pos, + _f_ = [0], + _g_ = 1, + _h_ = 0, + _i_ = 0, + _j_ = 0, + _k_ = 0, + _l_ = 0, + _m_ = runtime.caml_ml_string_length(s), + _n_ = caml_call1(Stdlib_Bytes[5], s); + return [0, + function(lexbuf){lexbuf[9] = 1; return 0;}, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_, + _f_, + _e_, + _d_]; + } + function set_position(lexbuf, position){ + lexbuf[12] = [0, lexbuf[12][1], position[2], position[3], position[4]]; + lexbuf[4] = position[4]; + return 0; + } + function set_filename(lexbuf, fname){ + var _c_ = lexbuf[12]; + lexbuf[12] = [0, fname, _c_[2], _c_[3], _c_[4]]; + return 0; + } + function with_positions(lexbuf){return lexbuf[12] !== dummy_pos ? 1 : 0;} + function lexeme(lexbuf){ + var len = lexbuf[6] - lexbuf[5] | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], lexbuf[5], len); + } + function sub_lexeme(lexbuf, i1, i2){ + var len = i2 - i1 | 0; + return caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len); + } + function sub_lexeme_opt(lexbuf, i1, i2){ + if(0 > i1) return 0; + var len = i2 - i1 | 0; + return [0, caml_call3(Stdlib_Bytes[8], lexbuf[2], i1, len)]; + } + function sub_lexeme_char(lexbuf, i){return caml_bytes_get(lexbuf[2], i);} + function sub_lexeme_char_opt(lexbuf, i){ + return 0 <= i ? [0, caml_bytes_get(lexbuf[2], i)] : 0; + } + function lexeme_char(lexbuf, i){ + return caml_bytes_get(lexbuf[2], lexbuf[5] + i | 0); + } + function lexeme_start(lexbuf){return lexbuf[11][4];} + function lexeme_end(lexbuf){return lexbuf[12][4];} + function lexeme_start_p(lexbuf){return lexbuf[11];} + function lexeme_end_p(lexbuf){return lexbuf[12];} + function new_line(lexbuf){ + var + lcp = lexbuf[12], + _a_ = lcp !== dummy_pos ? 1 : 0, + _b_ = + _a_ + ? (lexbuf[12] = [0, lcp[1], lcp[2] + 1 | 0, lcp[4], lcp[4]], 0) + : _a_; + return _b_; + } + function flush_input(lb){ + lb[6] = 0; + lb[4] = 0; + var lcp = lb[12]; + if(lcp !== dummy_pos) + lb[12] = [0, lcp[1], zero_pos[2], zero_pos[3], zero_pos[4]]; + lb[3] = 0; + return 0; + } + var + Stdlib_Lexing = + [0, + dummy_pos, + from_channel, + from_string, + from_function, + set_position, + set_filename, + with_positions, + lexeme, + lexeme_char, + lexeme_start, + lexeme_end, + lexeme_start_p, + lexeme_end_p, + new_line, + flush_input, + sub_lexeme, + sub_lexeme_opt, + sub_lexeme_char, + sub_lexeme_char_opt, + engine, + new_engine]; + runtime.caml_register_global(7, Stdlib_Lexing, "Stdlib__Lexing"); + return; + } + (globalThis)); + +//# 7276 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Lexing = global_data.Stdlib__Lexing, + YYexit = [248, "Stdlib.Parsing.YYexit", caml_fresh_oo_id(0)], + Parse_error = [248, "Stdlib.Parsing.Parse_error", caml_fresh_oo_id(0)], + env = + [0, + caml_make_vect(100, 0), + caml_make_vect(100, 0), + caml_make_vect(100, Stdlib_Lexing[1]), + caml_make_vect(100, Stdlib_Lexing[1]), + 100, + 0, + 0, + 0, + Stdlib_Lexing[1], + Stdlib_Lexing[1], + 0, + 0, + 0, + 0, + 0, + 0], + cst_syntax_error = "syntax error"; + function grow_stacks(param){ + var + oldsize = env[5], + newsize = oldsize * 2 | 0, + new_s = caml_make_vect(newsize, 0), + new_v = caml_make_vect(newsize, 0), + new_start = caml_make_vect(newsize, Stdlib_Lexing[1]), + new_end = caml_make_vect(newsize, Stdlib_Lexing[1]); + caml_call5(Stdlib_Array[8], env[1], 0, new_s, 0, oldsize); + env[1] = new_s; + caml_call5(Stdlib_Array[8], env[2], 0, new_v, 0, oldsize); + env[2] = new_v; + caml_call5(Stdlib_Array[8], env[3], 0, new_start, 0, oldsize); + env[3] = new_start; + caml_call5(Stdlib_Array[8], env[4], 0, new_end, 0, oldsize); + env[4] = new_end; + env[5] = newsize; + return 0; + } + function clear_parser(param){ + caml_call4(Stdlib_Array[7], env[2], 0, env[5], 0); + env[8] = 0; + return 0; + } + var current_lookahead_fun = [0, function(param){return 0;}]; + function yyparse(tables, start, lexer, lexbuf){ + var + init_asp = env[11], + init_sp = env[14], + init_stackbase = env[6], + init_state = env[15], + init_curr_char = env[7], + init_lval = env[8], + init_errflag = env[16]; + env[6] = env[14] + 1 | 0; + env[7] = start; + env[10] = lexbuf[12]; + try{ + var cmd = 0, arg = 0; + for(;;) + switch(runtime.caml_parse_engine(tables, env, cmd, arg)){ + case 0: + var arg$0 = caml_call1(lexer, lexbuf); + env[9] = lexbuf[11]; + env[10] = lexbuf[12]; + var cmd = 1, arg = arg$0; + continue; + case 1: + throw caml_maybe_attach_backtrace(Parse_error, 1); + case 2: + grow_stacks(0); var cmd = 2, arg = 0; continue; + case 3: + grow_stacks(0); var cmd = 3, arg = 0; continue; + case 4: + try{ + var + _i_ = env[13], + _j_ = caml_call1(caml_check_bound(tables[1], _i_)[1 + _i_], env), + _k_ = 4, + value = _j_, + action = _k_; + } + catch(_m_){ + var _h_ = caml_wrap_exception(_m_); + if(_h_ !== Parse_error) throw caml_maybe_attach_backtrace(_h_, 0); + var value = 0, action = 5; + } + var cmd = action, arg = value; + continue; + default: + caml_call1(tables[14], cst_syntax_error); + var cmd = 5, arg = 0; + continue; + } + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), curr_char = env[7]; + env[11] = init_asp; + env[14] = init_sp; + env[6] = init_stackbase; + env[15] = init_state; + env[7] = init_curr_char; + env[8] = init_lval; + env[16] = init_errflag; + if(exn[1] === YYexit){var v = exn[2]; return v;} + current_lookahead_fun[1] = + function(tok){ + if(! caml_call1(Stdlib_Obj[1], tok)) + return caml_check_bound(tables[2], tok)[1 + tok] === curr_char ? 1 : 0; + var _l_ = runtime.caml_obj_tag(tok); + return caml_check_bound(tables[3], _l_)[1 + _l_] === curr_char ? 1 : 0; + }; + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function peek_val(env, n){ + var _g_ = env[11] - n | 0; + return caml_check_bound(env[2], _g_)[1 + _g_]; + } + function symbol_start_pos(param){ + var i$1 = env[12], i = i$1; + for(;;){ + if(0 >= i){ + var _f_ = env[11]; + return caml_check_bound(env[4], _f_)[1 + _f_]; + } + var + _d_ = (env[11] - i | 0) + 1 | 0, + st = caml_check_bound(env[3], _d_)[1 + _d_], + _e_ = (env[11] - i | 0) + 1 | 0, + en = caml_check_bound(env[4], _e_)[1 + _e_]; + if(runtime.caml_notequal(st, en)) return st; + var i$0 = i - 1 | 0, i = i$0; + } + } + function symbol_end_pos(param){ + var _c_ = env[11]; + return caml_check_bound(env[4], _c_)[1 + _c_]; + } + function rhs_start_pos(n){ + var _b_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[3], _b_)[1 + _b_]; + } + function rhs_end_pos(n){ + var _a_ = env[11] - (env[12] - n | 0) | 0; + return caml_check_bound(env[4], _a_)[1 + _a_]; + } + function symbol_start(param){return symbol_start_pos(0)[4];} + function symbol_end(param){return symbol_end_pos(0)[4];} + function rhs_start(n){return rhs_start_pos(n)[4];} + function rhs_end(n){return rhs_end_pos(n)[4];} + function is_current_lookahead(tok){ + return caml_call1(current_lookahead_fun[1], tok); + } + function parse_error(param){return 0;} + var + Stdlib_Parsing = + [0, + symbol_start, + symbol_end, + rhs_start, + rhs_end, + symbol_start_pos, + symbol_end_pos, + rhs_start_pos, + rhs_end_pos, + clear_parser, + Parse_error, + runtime.caml_set_parser_trace, + YYexit, + yyparse, + peek_val, + is_current_lookahead, + parse_error]; + runtime.caml_register_global(7, Stdlib_Parsing, "Stdlib__Parsing"); + return; + } + (globalThis)); + +//# 7488 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set_bal$3 = "Set.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + cst_Set_remove_min_elt = "Set.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, 0, 0], + _c_ = [0, "set.ml", 570, 18], + cst_Set_bal = cst_Set_bal$3, + cst_Set_bal$0 = cst_Set_bal$3, + cst_Set_bal$1 = cst_Set_bal$3, + cst_Set_bal$2 = cst_Set_bal$3, + Stdlib_Set = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[4]; + return h; + } + function create(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + var _Z_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Z_]; + } + function bal(l, v, r){ + if(l) var h = l[4], hl = h; else var hl = 0; + if(r) var h$0 = r[4], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Set_bal$0); + var lr = l[3], lv = l[2], ll = l[1], _U_ = height(lr); + if(_U_ <= height(ll)) return create(ll, lv, create(lr, v, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Set_bal); + var lrr = lr[3], lrv = lr[2], lrl = lr[1], _V_ = create(lrr, v, r); + return create(create(ll, lv, lrl), lrv, _V_); + } + if((hl + 2 | 0) >= hr){ + var _Y_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, v, r, _Y_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Set_bal$2); + var rr = r[3], rv = r[2], rl = r[1], _W_ = height(rl); + if(_W_ <= height(rr)) return create(create(l, v, rl), rv, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Set_bal$1); + var rlr = rl[3], rlv = rl[2], rll = rl[1], _X_ = create(rlr, rv, rr); + return create(create(l, v, rll), rlv, _X_); + } + function add(x, t){ + if(! t) return [0, 0, x, 0, 1]; + var r = t[3], v = t[2], l = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c) return t; + if(0 <= c){var rr = add(x, r); return r === rr ? t : bal(l, v, rr);} + var ll = add(x, l); + return l === ll ? t : bal(ll, v, r); + } + function singleton(x){return [0, 0, x, 0, 1];} + function add_min_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(add_min_element(x, l), v, r); + } + function add_max_element(x, param){ + if(! param) return singleton(x); + var r = param[3], v = param[2], l = param[1]; + return bal(l, v, add_max_element(x, r)); + } + function join(l, v, r){ + if(! l) return add_min_element(v, r); + if(! r) return add_max_element(v, l); + var + rh = r[4], + rr = r[3], + rv = r[2], + rl = r[1], + lh = l[4], + lr = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, join(lr, v, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, rl), rv, rr) + : create(l, v, r); + } + function min_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return v; + } + } + function min_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function max_elt(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return v; + } + } + function max_elt_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[3]){var r = param$0[3], param$0 = r; continue;} + var v = param$0[2]; + return [0, v]; + } + } + function remove_min_elt(param){ + if(! param) return caml_call1(Stdlib[1], cst_Set_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[3], v = param[2]; + return bal(remove_min_elt(l), v, r); + } + var r$0 = param[3]; + return r$0; + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var _T_ = remove_min_elt(t2); + return join(t1, min_elt(t2), _T_); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, 1, r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, r)]; + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _S_ = 0 === c ? 1 : 0; + if(_S_) return _S_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function remove(x, t){ + if(! t) return 0; + var t2 = t[3], v = t[2], t1 = t[1], c = caml_call2(Ord[1], x, v); + if(0 === c){ + if(! t1) return t2; + if(! t2) return t1; + var _R_ = remove_min_elt(t2); + return bal(t1, min_elt(t2), _R_); + } + if(0 <= c){ + var rr = remove(x, t2); + return t2 === rr ? t : bal(t1, v, rr); + } + var ll = remove(x, t1); + return t1 === ll ? t : bal(ll, v, t2); + } + function union(s1, s2){ + if(! s1) return s2; + if(! s2) return s1; + var + h2 = s2[4], + r2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[4], + r1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + if(1 === h2) return add(v2, s1); + var + match = split(v1, s2), + r2$0 = match[3], + l2$0 = match[1], + _P_ = union(r1, r2$0); + return join(union(l1, l2$0), v1, _P_); + } + if(1 === h1) return add(v1, s2); + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + l1$0 = match$0[1], + _Q_ = union(r1$0, r2); + return join(union(l1$0, l2), v2, _Q_); + } + function inter(s1, s2){ + if(! s1) return 0; + if(! s2) return 0; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _M_ = split(v1, s2), + l2 = _M_[1]; + if(_M_[2]){ + var r2 = _M_[3], _N_ = inter(r1, r2); + return join(inter(l1, l2), v1, _N_); + } + var r2$0 = _M_[3], _O_ = inter(r1, r2$0); + return concat(inter(l1, l2), _O_); + } + function split_bis(x, param){ + if(! param) return [0, 0, function(param){return 0;}]; + var + r = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return 0; + if(0 <= c){ + var match = split_bis(x, r); + if(! match) return 0; + var rr = match[2], lr = match[1]; + return [0, join(l, v, lr), rr]; + } + var match$0 = split_bis(x, l); + if(! match$0) return 0; + var rl = match$0[2], ll = match$0[1]; + return [0, + ll, + function(param){return join(caml_call1(rl, 0), v, r);}]; + } + function disjoint(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(s1$0 && s2$0){ + var r1 = s1$0[3], v1 = s1$0[2], l1 = s1$0[1]; + if(s1$0 === s2$0) return 0; + var match = split_bis(v1, s2$0); + if(! match) return 0; + var r2 = match[2], l2 = match[1], _L_ = disjoint(l1, l2); + if(! _L_) return _L_; + var s2$1 = caml_call1(r2, 0), s1$0 = r1, s2$0 = s2$1; + continue; + } + return 1; + } + } + function diff(s1, s2){ + if(! s1) return 0; + if(! s2) return s1; + var + r1 = s1[3], + v1 = s1[2], + l1 = s1[1], + _I_ = split(v1, s2), + l2 = _I_[1]; + if(_I_[2]){ + var r2 = _I_[3], _J_ = diff(r1, r2); + return concat(diff(l1, l2), _J_); + } + var r2$0 = _I_[3], _K_ = diff(r1, r2$0); + return join(diff(l1, l2), v1, _K_); + } + function cons_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, r, e$0], + s$0 = l, + e$0 = e$1; + } + } + function compare(s1, s2){ + var + e2$2 = cons_enum(s2, 0), + e1$2 = cons_enum(s1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[3], + r2 = e2[2], + v2 = e2[1], + e1$0 = e1[3], + r1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(s1, s2){return 0 === compare(s1, s2) ? 1 : 0;} + function subset(s1, s2){ + var s1$0 = s1, s2$0 = s2; + for(;;){ + if(! s1$0) return 1; + if(! s2$0) return 0; + var + r2 = s2$0[3], + v2 = s2$0[2], + l2 = s2$0[1], + r1 = s1$0[3], + v1 = s1$0[2], + l1 = s1$0[1], + c = caml_call2(Ord[1], v1, v2); + if(0 === c){ + var _F_ = subset(l1, l2); + if(! _F_) return _F_; + var s1$0 = r1, s2$0 = r2; + continue; + } + if(0 <= c){ + var _G_ = subset([0, 0, v1, r1, 0], r2); + if(! _G_) return _G_; + var s1$0 = l1; + continue; + } + var _H_ = subset([0, l1, v1, 0, 0], l2); + if(! _H_) return _H_; + var s1$0 = r1; + } + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call1(f, v); + var param$0 = r; + } + } + function fold(f, s, accu){ + var s$0 = s, accu$0 = accu; + for(;;){ + if(! s$0) return accu$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + accu$1 = caml_call2(f, v, fold(f, l, accu$0)), + s$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call1(p, v); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call1(p, v); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function filter(p, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = filter(p, l), + pv = caml_call1(p, v), + r$0 = filter(p, r); + if(! pv) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return t; + return join(l$0, v, r$0); + } + function partition(p, param){ + if(! param) return _b_; + var + r = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pv = caml_call1(p, v), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pv){var _x_ = concat(lf, rf); return [0, join(lt, v, rt), _x_];} + var _y_ = join(lf, v, rf); + return [0, concat(lt, rt), _y_]; + } + function cardinal(param){ + if(! param) return 0; + var r = param[3], l = param[1], _w_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _w_ | 0; + } + function elements_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, v, elements_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function elements(s){return elements_aux(0, s);} + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return v; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, param = l$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = l; continue;} + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return v0; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var r$0 = param$1[3], v0$1 = param$1[2], l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, param = r$0; + for(;;){ + if(! param) return [0, v0]; + var r = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){var v0 = v0$0, param = r; continue;} + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, v]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function try_join(l, v, r){ + var switch$0 = 0; + if(0 !== l){ + var _v_ = max_elt(l); + if(0 <= caml_call2(Ord[1], _v_, v)) switch$0 = 1; + } + if(! switch$0){ + var switch$1 = 0; + if(0 !== r){ + var _u_ = min_elt(r); + if(0 <= caml_call2(Ord[1], v, _u_)) switch$1 = 1; + } + if(! switch$1) return join(l, v, r); + } + return union(l, add(v, r)); + } + function map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + l$0 = map(f, l), + v$0 = caml_call1(f, v), + r$0 = map(f, r); + if(l === l$0 && v === v$0 && r === r$0) return t; + return try_join(l$0, v$0, r$0); + } + function filter_map(f, t){ + if(! t) return 0; + var + r = t[3], + v = t[2], + l = t[1], + t1 = filter_map(f, l), + v$0 = caml_call1(f, v), + t2 = filter_map(f, r); + if(v$0){ + var v$1 = v$0[1]; + if(l === t1 && v === v$1 && r === t2) return t; + return try_join(t1, v$1, t2); + } + if(! t1) return t2; + if(! t2) return t1; + var _t_ = remove_min_elt(t2); + return try_join(t1, min_elt(t2), _t_); + } + function of_list(l){ + if(! l) return empty; + var _o_ = l[2], x0 = l[1]; + if(! _o_) return singleton(x0); + var _p_ = _o_[2], x1 = _o_[1]; + if(! _p_) return add(x1, singleton(x0)); + var _q_ = _p_[2], x2 = _p_[1]; + if(! _q_) return add(x2, add(x1, singleton(x0))); + var _r_ = _q_[2], x3 = _q_[1]; + if(! _r_) return add(x3, add(x2, add(x1, singleton(x0)))); + if(_r_[2]){ + var + l$0 = caml_call2(Stdlib_List[59], Ord[1], l), + sub = + function(n, l){ + if(3 >= n >>> 0) + switch(n){ + case 0: + return [0, 0, l]; + case 1: + if(l){ + var l$3 = l[2], x0 = l[1]; + return [0, [0, 0, x0, 0, 1], l$3]; + } + break; + case 2: + if(l){ + var match$1 = l[2]; + if(match$1){ + var l$4 = match$1[2], x1 = match$1[1], x0$0 = l[1]; + return [0, [0, [0, 0, x0$0, 0, 1], x1, 0, 2], l$4]; + } + } + break; + default: + if(l){ + var _s_ = l[2]; + if(_s_){ + var match$2 = _s_[2]; + if(match$2){ + var + l$5 = match$2[2], + x2 = match$2[1], + x1$0 = _s_[1], + x0$1 = l[1]; + return [0, + [0, [0, 0, x0$1, 0, 1], x1$0, [0, 0, x2, 0, 1], 2], + l$5]; + } + } + } + } + var + nl = n / 2 | 0, + match = sub(nl, l), + l$0 = match[2], + left = match[1]; + if(! l$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + l$1 = l$0[2], + mid = l$0[1], + match$0 = sub((n - nl | 0) - 1 | 0, l$1), + l$2 = match$0[2], + right = match$0[1]; + return [0, create(left, mid, right), l$2]; + }; + return sub(caml_call1(Stdlib_List[1], l$0), l$0)[1]; + } + var x4 = _r_[1]; + return add(x4, add(x3, add(x2, add(x1, singleton(x0))))); + } + function add_seq(i, m){ + function _n_(s, x){return add(x, s);} + return caml_call3(Stdlib_Seq[5], _n_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _l_ = cons_enum(t, rest); + return [0, x, function(_m_){return seq_of_enum(_l_, _m_);}]; + } + function to_seq(c){ + var _j_ = cons_enum(c, 0); + return function(_k_){return seq_of_enum(_j_, _k_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var rest = c[3], t = c[2], x = c[1], _h_ = snoc_enum(t, rest); + return [0, x, function(_i_){return rev_seq_of_enum(_h_, _i_);}]; + } + function to_rev_seq(c){ + var _f_ = snoc_enum(c, 0); + return function(_g_){return rev_seq_of_enum(_f_, _g_);}; + } + function to_seq_from(low, s){ + var s$0 = s, c = 0; + for(;;){ + if(s$0){ + var + r = s$0[3], + v = s$0[2], + l = s$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, r, c], s$0 = l, c = c$0; continue;} + var s$0 = r; + continue; + } + var _d_ = [0, v, r, c]; + } + else + var _d_ = c; + return function(_e_){return seq_of_enum(_d_, _e_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + singleton, + remove, + union, + inter, + disjoint, + diff, + compare, + equal, + subset, + iter, + map, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + elements, + min_elt, + min_elt_opt, + max_elt, + max_elt_opt, + min_elt, + min_elt_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + of_list, + to_seq_from, + to_seq, + to_rev_seq, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(12, Stdlib_Set, "Stdlib__Set"); + return; + } + (globalThis)); + +//# 8299 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Map_bal$3 = "Map.bal", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Seq = global_data.Stdlib__Seq, + cst_Map_remove_min_elt = "Map.remove_min_elt", + _a_ = [0, 0, 0, 0], + _b_ = [0, "map.ml", 400, 10], + _c_ = [0, 0, 0], + cst_Map_bal = cst_Map_bal$3, + cst_Map_bal$0 = cst_Map_bal$3, + cst_Map_bal$1 = cst_Map_bal$3, + cst_Map_bal$2 = cst_Map_bal$3, + Stdlib_Map = + [0, + function(Ord){ + function height(param){ + if(! param) return 0; + var h = param[5]; + return h; + } + function create(l, x, d, r){ + var + hl = height(l), + hr = height(r), + _L_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _L_]; + } + function singleton(x, d){return [0, 0, x, d, 0, 1];} + function bal(l, x, d, r){ + if(l) var h = l[5], hl = h; else var hl = 0; + if(r) var h$0 = r[5], hr = h$0; else var hr = 0; + if((hr + 2 | 0) < hl){ + if(! l) return caml_call1(Stdlib[1], cst_Map_bal$0); + var lr = l[4], ld = l[3], lv = l[2], ll = l[1], _G_ = height(lr); + if(_G_ <= height(ll)) + return create(ll, lv, ld, create(lr, x, d, r)); + if(! lr) return caml_call1(Stdlib[1], cst_Map_bal); + var + lrr = lr[4], + lrd = lr[3], + lrv = lr[2], + lrl = lr[1], + _H_ = create(lrr, x, d, r); + return create(create(ll, lv, ld, lrl), lrv, lrd, _H_); + } + if((hl + 2 | 0) >= hr){ + var _K_ = hr <= hl ? hl + 1 | 0 : hr + 1 | 0; + return [0, l, x, d, r, _K_]; + } + if(! r) return caml_call1(Stdlib[1], cst_Map_bal$2); + var rr = r[4], rd = r[3], rv = r[2], rl = r[1], _I_ = height(rl); + if(_I_ <= height(rr)) return create(create(l, x, d, rl), rv, rd, rr); + if(! rl) return caml_call1(Stdlib[1], cst_Map_bal$1); + var + rlr = rl[4], + rld = rl[3], + rlv = rl[2], + rll = rl[1], + _J_ = create(rlr, rv, rd, rr); + return create(create(l, x, d, rll), rlv, rld, _J_); + } + var empty = 0; + function is_empty(param){return param ? 0 : 1;} + function add(x, data, m){ + if(! m) return [0, 0, x, data, 0, 1]; + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d === data ? m : [0, l, x, data, r, h]; + if(0 <= c){ + var rr = add(x, data, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = add(x, data, l); + return l === ll ? m : bal(ll, v, d, r); + } + function find(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return d; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function find_first(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_first_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = r$0; continue;} + var v0 = v0$1, d0 = d0$1, param = l$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = l; + continue; + } + var param = r; + } + } + } + function find_last(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, v0, d0]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_last_opt(f, param$0){ + var param$1 = param$0; + for(;;){ + if(! param$1) return 0; + var + r$0 = param$1[4], + d0$1 = param$1[3], + v0$1 = param$1[2], + l$0 = param$1[1]; + if(! caml_call1(f, v0$1)){var param$1 = l$0; continue;} + var v0 = v0$1, d0 = d0$1, param = r$0; + for(;;){ + if(! param) return [0, [0, v0, d0]]; + var r = param[4], d0$0 = param[3], v0$0 = param[2], l = param[1]; + if(caml_call1(f, v0$0)){ + var v0 = v0$0, d0 = d0$0, param = r; + continue; + } + var param = l; + } + } + } + function find_opt(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, d]; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function mem(x, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + v = param$0[2], + l = param$0[1], + c = caml_call2(Ord[1], x, v), + _F_ = 0 === c ? 1 : 0; + if(_F_) return _F_; + var r$0 = 0 <= c ? r : l, param$0 = r$0; + } + } + function min_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function min_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var l = param$0[1]; + if(l){var param$0 = l; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function max_binding(param){ + var param$0 = param; + for(;;){ + if(! param$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, v, d]; + } + } + function max_binding_opt(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + if(param$0[4]){var r = param$0[4], param$0 = r; continue;} + var d = param$0[3], v = param$0[2]; + return [0, [0, v, d]]; + } + } + function remove_min_binding(param){ + if(! param) return caml_call1(Stdlib[1], cst_Map_remove_min_elt); + var l = param[1]; + if(l){ + var r = param[4], d = param[3], v = param[2]; + return bal(remove_min_binding(l), v, d, r); + } + var r$0 = param[4]; + return r$0; + } + function _d_(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return bal(t1, x, d, remove_min_binding(t2)); + } + function remove(x, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return _d_(l, r); + if(0 <= c){ + var rr = remove(x, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = remove(x, l); + return l === ll ? m : bal(ll, v, d, r); + } + function update(x, f, m){ + if(! m){ + var match$0 = caml_call1(f, 0); + if(! match$0) return 0; + var data$0 = match$0[1]; + return [0, 0, x, data$0, 0, 1]; + } + var + h = m[5], + r = m[4], + d = m[3], + v = m[2], + l = m[1], + c = caml_call2(Ord[1], x, v); + if(0 === c){ + var match = caml_call1(f, [0, d]); + if(! match) return _d_(l, r); + var data = match[1]; + return d === data ? m : [0, l, x, data, r, h]; + } + if(0 <= c){ + var rr = update(x, f, r); + return r === rr ? m : bal(l, v, d, rr); + } + var ll = update(x, f, l); + return l === ll ? m : bal(ll, v, d, r); + } + function iter(f, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var r = param$0[4], d = param$0[3], v = param$0[2], l = param$0[1]; + iter(f, l); + caml_call2(f, v, d); + var param$0 = r; + } + } + function map(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = map(f, l), + d$0 = caml_call1(f, d), + r$0 = map(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function mapi(f, param){ + if(! param) return 0; + var + h = param[5], + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = mapi(f, l), + d$0 = caml_call2(f, v, d), + r$0 = mapi(f, r); + return [0, l$0, v, d$0, r$0, h]; + } + function fold(f, m, accu){ + var m$0 = m, accu$0 = accu; + for(;;){ + if(! m$0) return accu$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + accu$1 = caml_call3(f, v, d, fold(f, l, accu$0)), + m$0 = r, + accu$0 = accu$1; + } + } + function for_all(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 1; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _C_ = caml_call2(p, v, d); + if(_C_){ + var _D_ = for_all(p, l); + if(_D_){var param$0 = r; continue;} + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function exists(p, param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + _z_ = caml_call2(p, v, d); + if(_z_) + var _A_ = _z_; + else{ + var _B_ = exists(p, l); + if(! _B_){var param$0 = r; continue;} + var _A_ = _B_; + } + return _A_; + } + } + function add_min_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(add_min_binding(k, x, l), v, d, r); + } + function add_max_binding(k, x, param){ + if(! param) return singleton(k, x); + var r = param[4], d = param[3], v = param[2], l = param[1]; + return bal(l, v, d, add_max_binding(k, x, r)); + } + function join(l, v, d, r){ + if(! l) return add_min_binding(v, d, r); + if(! r) return add_max_binding(v, d, l); + var + rh = r[5], + rr = r[4], + rd = r[3], + rv = r[2], + rl = r[1], + lh = l[5], + lr = l[4], + ld = l[3], + lv = l[2], + ll = l[1]; + return (rh + 2 | 0) < lh + ? bal(ll, lv, ld, join(lr, v, d, r)) + : (lh + + 2 + | 0) + < rh + ? bal(join(l, v, d, rl), rv, rd, rr) + : create(l, v, d, r); + } + function concat(t1, t2){ + if(! t1) return t2; + if(! t2) return t1; + var match = min_binding(t2), d = match[2], x = match[1]; + return join(t1, x, d, remove_min_binding(t2)); + } + function concat_or_join(t1, v, d, t2){ + if(! d) return concat(t1, t2); + var d$0 = d[1]; + return join(t1, v, d$0, t2); + } + function split(x, param){ + if(! param) return _a_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + c = caml_call2(Ord[1], x, v); + if(0 === c) return [0, l, [0, d], r]; + if(0 <= c){ + var + match = split(x, r), + rr = match[3], + pres = match[2], + lr = match[1]; + return [0, join(l, v, d, lr), pres, rr]; + } + var + match$0 = split(x, l), + rl = match$0[3], + pres$0 = match$0[2], + ll = match$0[1]; + return [0, ll, pres$0, join(rl, v, d, r)]; + } + function merge(f, s1, s2){ + if(s1){ + var h1 = s1[5], r1 = s1[4], d1 = s1[3], v1 = s1[2], l1 = s1[1]; + if(height(s2) <= h1){ + var + match = split(v1, s2), + r2 = match[3], + d2 = match[2], + l2 = match[1], + _v_ = merge(f, r1, r2), + _w_ = caml_call3(f, v1, [0, d1], d2); + return concat_or_join(merge(f, l1, l2), v1, _w_, _v_); + } + } + else if(! s2) return 0; + if(! s2) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + r2$0 = s2[4], + d2$0 = s2[3], + v2 = s2[2], + l2$0 = s2[1], + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + _x_ = merge(f, r1$0, r2$0), + _y_ = caml_call3(f, v2, d1$0, [0, d2$0]); + return concat_or_join(merge(f, l1$0, l2$0), v2, _y_, _x_); + } + function union(f, s1, s2){ + if(s1){ + if(s2){ + var + h2 = s2[5], + r2 = s2[4], + d2 = s2[3], + v2 = s2[2], + l2 = s2[1], + h1 = s1[5], + r1 = s1[4], + d1 = s1[3], + v1 = s1[2], + l1 = s1[1]; + if(h2 <= h1){ + var + match = split(v1, s2), + r2$0 = match[3], + d2$0 = match[2], + l2$0 = match[1], + l = union(f, l1, l2$0), + r = union(f, r1, r2$0); + if(! d2$0) return join(l, v1, d1, r); + var d2$1 = d2$0[1]; + return concat_or_join(l, v1, caml_call3(f, v1, d1, d2$1), r); + } + var + match$0 = split(v2, s1), + r1$0 = match$0[3], + d1$0 = match$0[2], + l1$0 = match$0[1], + l$0 = union(f, l1$0, l2), + r$0 = union(f, r1$0, r2); + if(! d1$0) return join(l$0, v2, d2, r$0); + var d1$1 = d1$0[1]; + return concat_or_join(l$0, v2, caml_call3(f, v2, d1$1, d2), r$0); + } + var s = s1; + } + else + var s = s2; + return s; + } + function filter(p, m){ + if(! m) return 0; + var + r = m[4], + d = m[3], + v = m[2], + l = m[1], + l$0 = filter(p, l), + pvd = caml_call2(p, v, d), + r$0 = filter(p, r); + if(! pvd) return concat(l$0, r$0); + if(l === l$0 && r === r$0) return m; + return join(l$0, v, d, r$0); + } + function filter_map(f, param){ + if(! param) return 0; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + l$0 = filter_map(f, l), + fvd = caml_call2(f, v, d), + r$0 = filter_map(f, r); + if(! fvd) return concat(l$0, r$0); + var d$0 = fvd[1]; + return join(l$0, v, d$0, r$0); + } + function partition(p, param){ + if(! param) return _c_; + var + r = param[4], + d = param[3], + v = param[2], + l = param[1], + match = partition(p, l), + lf = match[2], + lt = match[1], + pvd = caml_call2(p, v, d), + match$0 = partition(p, r), + rf = match$0[2], + rt = match$0[1]; + if(pvd){ + var _t_ = concat(lf, rf); + return [0, join(lt, v, d, rt), _t_]; + } + var _u_ = join(lf, v, d, rf); + return [0, concat(lt, rt), _u_]; + } + function cons_enum(m, e){ + var m$0 = m, e$0 = e; + for(;;){ + if(! m$0) return e$0; + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + e$1 = [0, v, d, r, e$0], + m$0 = l, + e$0 = e$1; + } + } + function compare(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? -1 : 0; + if(! e2) return 1; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + c = caml_call2(Ord[1], v1, v2); + if(0 !== c) return c; + var c$0 = caml_call2(cmp, d1, d2); + if(0 !== c$0) return c$0; + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + } + } + function equal(cmp, m1, m2){ + var + e2$2 = cons_enum(m2, 0), + e1$2 = cons_enum(m1, 0), + e1 = e1$2, + e2 = e2$2; + for(;;){ + if(! e1) return e2 ? 0 : 1; + if(! e2) return 0; + var + e2$0 = e2[4], + r2 = e2[3], + d2 = e2[2], + v2 = e2[1], + e1$0 = e1[4], + r1 = e1[3], + d1 = e1[2], + v1 = e1[1], + _q_ = 0 === caml_call2(Ord[1], v1, v2) ? 1 : 0; + if(_q_){ + var _r_ = caml_call2(cmp, d1, d2); + if(_r_){ + var + e2$1 = cons_enum(r2, e2$0), + e1$1 = cons_enum(r1, e1$0), + e1 = e1$1, + e2 = e2$1; + continue; + } + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function cardinal(param){ + if(! param) return 0; + var r = param[4], l = param[1], _p_ = cardinal(r); + return (cardinal(l) + 1 | 0) + _p_ | 0; + } + function bindings_aux(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + r = param$0[4], + d = param$0[3], + v = param$0[2], + l = param$0[1], + accu$1 = [0, [0, v, d], bindings_aux(accu$0, r)], + accu$0 = accu$1, + param$0 = l; + } + } + function bindings(s){return bindings_aux(0, s);} + function add_seq(i, m){ + function _o_(m, param){ + var v = param[2], k = param[1]; + return add(k, v, m); + } + return caml_call3(Stdlib_Seq[5], _o_, m, i); + } + function of_seq(i){return add_seq(i, empty);} + function seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _m_ = cons_enum(t, rest); + return [0, [0, k, v], function(_n_){return seq_of_enum(_m_, _n_);}]; + } + function to_seq(m){ + var _k_ = cons_enum(m, 0); + return function(_l_){return seq_of_enum(_k_, _l_);}; + } + function snoc_enum(s, e){ + var s$0 = s, e$0 = e; + for(;;){ + if(! s$0) return e$0; + var + r = s$0[4], + d = s$0[3], + v = s$0[2], + l = s$0[1], + e$1 = [0, v, d, l, e$0], + s$0 = r, + e$0 = e$1; + } + } + function rev_seq_of_enum(c, param){ + if(! c) return 0; + var + rest = c[4], + t = c[3], + v = c[2], + k = c[1], + _i_ = snoc_enum(t, rest); + return [0, + [0, k, v], + function(_j_){return rev_seq_of_enum(_i_, _j_);}]; + } + function to_rev_seq(c){ + var _g_ = snoc_enum(c, 0); + return function(_h_){return rev_seq_of_enum(_g_, _h_);}; + } + function to_seq_from(low, m){ + var m$0 = m, c = 0; + for(;;){ + if(m$0){ + var + r = m$0[4], + d = m$0[3], + v = m$0[2], + l = m$0[1], + n = caml_call2(Ord[1], v, low); + if(0 !== n){ + if(0 <= n){var c$0 = [0, v, d, r, c], m$0 = l, c = c$0; continue;} + var m$0 = r; + continue; + } + var _e_ = [0, v, d, r, c]; + } + else + var _e_ = c; + return function(_f_){return seq_of_enum(_e_, _f_);}; + } + } + return [0, + empty, + is_empty, + mem, + add, + update, + singleton, + remove, + merge, + union, + compare, + equal, + iter, + fold, + for_all, + exists, + filter, + filter_map, + partition, + cardinal, + bindings, + min_binding, + min_binding_opt, + max_binding, + max_binding_opt, + min_binding, + min_binding_opt, + split, + find, + find_opt, + find_first, + find_first_opt, + find_last, + find_last_opt, + map, + mapi, + to_seq, + to_rev_seq, + to_seq_from, + add_seq, + of_seq]; + }]; + runtime.caml_register_global(11, Stdlib_Map, "Stdlib__Map"); + return; + } + (globalThis)); + +//# 9131 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_List = global_data.Stdlib__List, + Empty = [248, "Stdlib.Stack.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0];} + function clear(s){s[1] = 0; s[2] = 0; return 0;} + function copy(s){return [0, s[1], s[2]];} + function push(x, s){s[1] = [0, x, s[1]]; s[2] = s[2] + 1 | 0; return 0;} + function pop(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return hd; + } + function pop_opt(s){ + var match = s[1]; + if(! match) return 0; + var tl = match[2], hd = match[1]; + s[1] = tl; + s[2] = s[2] - 1 | 0; + return [0, hd]; + } + function top(s){ + var match = s[1]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var hd = match[1]; + return hd; + } + function top_opt(s){ + var match = s[1]; + if(! match) return 0; + var hd = match[1]; + return [0, hd]; + } + function is_empty(s){return 0 === s[1] ? 1 : 0;} + function length(s){return s[2];} + function iter(f, s){return caml_call2(Stdlib_List[17], f, s[1]);} + function fold(f, acc, s){return caml_call3(Stdlib_List[25], f, acc, s[1]);} + function to_seq(s){return caml_call1(Stdlib_List[61], s[1]);} + function add_seq(q, i){ + function _a_(x){return push(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var s = create(0); add_seq(s, g); return s;} + var + Stdlib_Stack = + [0, + Empty, + create, + push, + pop, + pop_opt, + top, + top_opt, + clear, + copy, + is_empty, + length, + iter, + fold, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(3, Stdlib_Stack, "Stdlib__Stack"); + return; + } + (globalThis)); + +//# 9225 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Seq = global_data.Stdlib__Seq, + Empty = [248, "Stdlib.Queue.Empty", runtime.caml_fresh_oo_id(0)]; + function create(param){return [0, 0, 0, 0];} + function clear(q){q[1] = 0; q[2] = 0; q[3] = 0; return 0;} + function add(x, q){ + var cell = [0, x, 0], match = q[3]; + return match + ? (q[1] = q[1] + 1 | 0, match[2] = cell, q[3] = cell, 0) + : (q[1] = 1, q[2] = cell, q[3] = cell, 0); + } + function peek(q){ + var match = q[2]; + if(! match) throw caml_maybe_attach_backtrace(Empty, 1); + var content = match[1]; + return content; + } + function peek_opt(q){ + var match = q[2]; + if(! match) return 0; + var content = match[1]; + return [0, content]; + } + function take(q){ + var _g_ = q[2]; + if(! _g_) throw caml_maybe_attach_backtrace(Empty, 1); + var content = _g_[1]; + if(_g_[2]){ + var next = _g_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return content; + } + clear(q); + return content; + } + function take_opt(q){ + var _f_ = q[2]; + if(! _f_) return 0; + var content = _f_[1]; + if(_f_[2]){ + var next = _f_[2]; + q[1] = q[1] - 1 | 0; + q[2] = next; + return [0, content]; + } + clear(q); + return [0, content]; + } + function copy(q){ + var cell$0 = q[2], q_res = [0, q[1], 0, 0], prev = 0, cell = cell$0; + for(;;){ + if(! cell){q_res[3] = prev; return q_res;} + var content = cell[1], next = cell[2], prev$0 = [0, content, 0]; + if(prev) prev[2] = prev$0; else q_res[2] = prev$0; + var prev = prev$0, cell = next; + } + } + function is_empty(q){return 0 === q[1] ? 1 : 0;} + function length(q){return q[1];} + function iter(f, q){ + var cell$0 = q[2], cell = cell$0; + for(;;){ + if(! cell) return 0; + var content = cell[1], next = cell[2]; + caml_call1(f, content); + var cell = next; + } + } + function fold(f, accu$1, q){ + var cell$0 = q[2], accu = accu$1, cell = cell$0; + for(;;){ + if(! cell) return accu; + var + content = cell[1], + next = cell[2], + accu$0 = caml_call2(f, accu, content), + accu = accu$0, + cell = next; + } + } + function transfer(q1, q2){ + var _e_ = 0 < q1[1] ? 1 : 0; + if(! _e_) return _e_; + var match = q2[3]; + return match + ? (q2 + [1] + = q2[1] + q1[1] | 0, + match[2] = q1[2], + q2[3] = q1[3], + clear(q1)) + : (q2[1] = q1[1], q2[2] = q1[2], q2[3] = q1[3], clear(q1)); + } + function to_seq(q){ + function aux(c, param){ + if(! c) return 0; + var x = c[1], next = c[2]; + return [0, x, function(_d_){return aux(next, _d_);}]; + } + var _b_ = q[2]; + return function(_c_){return aux(_b_, _c_);}; + } + function add_seq(q, i){ + function _a_(x){return add(x, q);} + return caml_call2(Stdlib_Seq[4], _a_, i); + } + function of_seq(g){var q = create(0); add_seq(q, g); return q;} + var + Stdlib_Queue = + [0, + Empty, + create, + add, + add, + take, + take_opt, + take, + peek, + peek_opt, + peek, + clear, + copy, + is_empty, + length, + iter, + fold, + transfer, + to_seq, + add_seq, + of_seq]; + runtime.caml_register_global(2, Stdlib_Queue, "Stdlib__Queue"); + return; + } + (globalThis)); + +//# 9380 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_blit_string = runtime.caml_blit_string, + caml_bswap16 = runtime.caml_bswap16, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_set16 = runtime.caml_bytes_set16, + caml_bytes_set32 = runtime.caml_bytes_set32, + caml_bytes_set64 = runtime.caml_bytes_set64, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Assert_failure = global_data.Assert_failure, + cst_Buffer_truncate = "Buffer.truncate", + _a_ = [0, "buffer.ml", 220, 9], + cst_Buffer_add_channel = "Buffer.add_channel", + cst_Buffer_add_substring_add_s = "Buffer.add_substring/add_subbytes", + cst_Buffer_add_cannot_grow_buf = "Buffer.add: cannot grow buffer", + cst_Buffer_nth = "Buffer.nth", + cst_Buffer_blit = "Buffer.blit", + cst_Buffer_sub = "Buffer.sub"; + function create(n){ + var + n$0 = 1 <= n ? n : 1, + n$1 = Stdlib_Sys[12] < n$0 ? Stdlib_Sys[12] : n$0, + s = caml_create_bytes(n$1); + return [0, [0, s, n$1], 0, s]; + } + function contents(b){return caml_call3(Stdlib_Bytes[8], b[1][1], 0, b[2]);} + function to_bytes(b){return caml_call3(Stdlib_Bytes[7], b[1][1], 0, b[2]);} + function sub(b, ofs, len){ + if(0 <= ofs && 0 <= len && (b[2] - len | 0) >= ofs) + return caml_call3(Stdlib_Bytes[8], b[1][1], ofs, len); + return caml_call1(Stdlib[1], cst_Buffer_sub); + } + function blit(src, srcoff, dst, dstoff, len){ + if + (0 <= len + && + 0 <= srcoff + && + (src[2] - len | 0) >= srcoff + && 0 <= dstoff && (caml_ml_bytes_length(dst) - len | 0) >= dstoff) + return caml_call5(Stdlib_Bytes[11], src[1][1], srcoff, dst, dstoff, len); + return caml_call1(Stdlib[1], cst_Buffer_blit); + } + function nth(b, ofs){ + var position = b[2], match = b[1], length = match[2], buffer = match[1]; + if(0 <= ofs && position > ofs && length >= position) + return runtime.caml_bytes_unsafe_get(buffer, ofs); + return caml_call1(Stdlib[1], cst_Buffer_nth); + } + function length(b){return b[2];} + function clear(b){b[2] = 0; return 0;} + function reset(b){ + b[2] = 0; + var inner = [0, b[3], caml_ml_bytes_length(b[3])]; + b[1] = inner; + return 0; + } + function resize(b, more){ + var old_pos = b[2], old_len = b[1][2], new_len = [0, old_len]; + for(;;){ + if(new_len[1] < (old_pos + more | 0)){ + new_len[1] = 2 * new_len[1] | 0; + continue; + } + if(Stdlib_Sys[12] < new_len[1]) + if((old_pos + more | 0) <= Stdlib_Sys[12]) + new_len[1] = Stdlib_Sys[12]; + else + caml_call1(Stdlib[2], cst_Buffer_add_cannot_grow_buf); + var new_buffer = caml_create_bytes(new_len[1]); + caml_call5(Stdlib_Bytes[11], b[1][1], 0, new_buffer, 0, b[2]); + b[1] = [0, new_buffer, new_len[1]]; + return 0; + } + } + function add_char(b, c){ + var pos = b[2], match = b[1], length = match[2], buffer = match[1]; + if(length <= pos){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], c); + } + else + caml_bytes_unsafe_set(buffer, pos, c); + b[2] = pos + 1 | 0; + return 0; + } + var uchar_utf_8_byte_length_max = 4, uchar_utf_16_byte_length_max = 4; + function add_utf_8_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_8_byte_length_max); + var n = caml_call3(Stdlib_Bytes[51], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_8_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16be_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[54], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_utf_16le_uchar(b, u){ + for(;;){ + var pos = b[2]; + if(b[1][2] <= pos) resize(b, uchar_utf_16_byte_length_max); + var n = caml_call3(Stdlib_Bytes[57], b[1][1], pos, u); + if(0 === n){resize(b, uchar_utf_16_byte_length_max); continue;} + b[2] = pos + n | 0; + return 0; + } + } + function add_substring(b, s, offset, len){ + var _r_ = offset < 0 ? 1 : 0; + if(_r_) + var _s_ = _r_; + else + var + _t_ = len < 0 ? 1 : 0, + _s_ = _t_ || ((caml_ml_string_length(s) - len | 0) < offset ? 1 : 0); + if(_s_) caml_call1(Stdlib[1], cst_Buffer_add_substring_add_s); + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, offset, b[1][1], b[2], len); + } + else + caml_blit_string(s, offset, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_subbytes(b, s, offset, len){ + return add_substring(b, caml_call1(Stdlib_Bytes[44], s), offset, len); + } + function add_string(b, s){ + var + len = caml_ml_string_length(s), + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = b[2] + len | 0; + if(length < new_position){ + resize(b, len); + caml_call5(Stdlib_Bytes[12], s, 0, b[1][1], b[2], len); + } + else + caml_blit_string(s, 0, buffer, position, len); + b[2] = new_position; + return 0; + } + function add_bytes(b, s){ + return add_string(b, caml_call1(Stdlib_Bytes[44], s)); + } + function add_buffer(b, bs){return add_subbytes(b, bs[1][1], 0, bs[2]);} + function add_channel(b, ic, to_read$1){ + var + _p_ = to_read$1 < 0 ? 1 : 0, + _q_ = _p_ || (Stdlib_Sys[12] < to_read$1 ? 1 : 0); + if(_q_) caml_call1(Stdlib[1], cst_Buffer_add_channel); + if(b[1][2] < (b[2] + to_read$1 | 0)) resize(b, to_read$1); + var + ofs$1 = b[2], + buf = b[1][1], + already_read = 0, + ofs = ofs$1, + to_read = to_read$1; + for(;;){ + if(0 !== to_read){ + var r = caml_call4(Stdlib[84], ic, buf, ofs, to_read); + if(0 !== r){ + var + already_read$0 = already_read + r | 0, + ofs$0 = ofs + r | 0, + to_read$0 = to_read - r | 0, + already_read = already_read$0, + ofs = ofs$0, + to_read = to_read$0; + continue; + } + } + b[2] = b[2] + already_read | 0; + if(already_read < to_read$1) + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return 0; + } + } + function output_buffer(oc, b){ + return caml_call4(Stdlib[68], oc, b[1][1], 0, b[2]); + } + function add_substitute(b, f, s){ + var lim$1 = caml_ml_string_length(s), previous = 32, i$4 = 0; + for(;;){ + if(i$4 >= lim$1){ + var _o_ = 92 === previous ? 1 : 0; + return _o_ ? add_char(b, previous) : _o_; + } + var previous$0 = caml_string_get(s, i$4); + if(36 !== previous$0){ + if(92 === previous){ + add_char(b, 92); + add_char(b, previous$0); + var i$6 = i$4 + 1 | 0, previous = 32, i$4 = i$6; + continue; + } + if(92 === previous$0){ + var i$7 = i$4 + 1 | 0, previous = previous$0, i$4 = i$7; + continue; + } + add_char(b, previous$0); + var i$8 = i$4 + 1 | 0, previous = previous$0, i$4 = i$8; + continue; + } + if(92 === previous){ + add_char(b, previous$0); + var i$5 = i$4 + 1 | 0, previous = 32, i$4 = i$5; + continue; + } + var start$0 = i$4 + 1 | 0; + if(lim$1 <= start$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var opening = caml_string_get(s, start$0), switch$0 = 0; + if(40 !== opening && 123 !== opening){ + var + start = start$0 + 1 | 0, + lim$0 = caml_ml_string_length(s), + i$2 = start; + for(;;){ + if(lim$0 <= i$2) + var stop$0 = lim$0; + else{ + var match = caml_string_get(s, i$2), switch$1 = 0; + if(91 <= match){ + if(97 <= match){ + if(123 > match) switch$1 = 1; + } + else if(95 === match) switch$1 = 1; + } + else + if(58 <= match){ + if(65 <= match) switch$1 = 1; + } + else if(48 <= match) switch$1 = 1; + if(switch$1){var i$3 = i$2 + 1 | 0, i$2 = i$3; continue;} + var stop$0 = i$2; + } + var + match$0 = + [0, + caml_call3(Stdlib_String[15], s, start$0, stop$0 - start$0 | 0), + stop$0]; + switch$0 = 1; + break; + } + } + if(! switch$0){ + var new_start = start$0 + 1 | 0, k$2 = 0; + if(40 === opening) + var closing = 41; + else{ + if(123 !== opening) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var closing = 125; + } + var lim = caml_ml_string_length(s), k = k$2, stop = new_start; + for(;;){ + if(lim <= stop) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(caml_string_get(s, stop) === opening){ + var i = stop + 1 | 0, k$0 = k + 1 | 0, k = k$0, stop = i; + continue; + } + if(caml_string_get(s, stop) !== closing){ + var i$1 = stop + 1 | 0, stop = i$1; + continue; + } + if(0 !== k){ + var i$0 = stop + 1 | 0, k$1 = k - 1 | 0, k = k$1, stop = i$0; + continue; + } + var + match$0 = + [0, + caml_call3 + (Stdlib_String[15], s, new_start, (stop - start$0 | 0) - 1 | 0), + stop + 1 | 0]; + break; + } + } + var next_i = match$0[2], ident = match$0[1]; + add_string(b, caml_call1(f, ident)); + var previous = 32, i$4 = next_i; + } + } + function truncate(b, len){ + if(0 <= len && b[2] >= len){b[2] = len; return 0;} + return caml_call1(Stdlib[1], cst_Buffer_truncate); + } + function to_seq(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _m_ = i + 1 | 0; + return [0, x, function(_n_){return aux(_m_, _n_);}]; + } + var _k_ = 0; + return function(_l_){return aux(_k_, _l_);}; + } + function to_seqi(b){ + function aux(i, param){ + if(b[2] <= i) return 0; + var x = caml_bytes_get(b[1][1], i), _i_ = i + 1 | 0; + return [0, [0, i, x], function(_j_){return aux(_i_, _j_);}]; + } + var _g_ = 0; + return function(_h_){return aux(_g_, _h_);}; + } + function add_seq(b, seq){ + function _e_(_f_){return add_char(b, _f_);} + return caml_call2(Stdlib_Seq[4], _e_, seq); + } + function of_seq(i){var b = create(32); add_seq(b, i); return b;} + function add_int8(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 1 | 0; + if(length < new_position){ + resize(b, 1); + caml_bytes_set(b[1][1], b[2], x); + } + else + caml_bytes_unsafe_set(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 2 | 0; + if(length < new_position){ + resize(b, 2); + caml_bytes_set16(b[1][1], b[2], x); + } + else + caml_bytes_set16(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int32_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 4 | 0; + if(length < new_position){ + resize(b, 4); + caml_bytes_set32(b[1][1], b[2], x); + } + else + caml_bytes_set32(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int64_ne(b, x){ + var + position = b[2], + match = b[1], + length = match[2], + buffer = match[1], + new_position = position + 8 | 0; + if(length < new_position){ + resize(b, 8); + caml_bytes_set64(b[1][1], b[2], x); + } + else + caml_bytes_set64(buffer, position, x); + b[2] = new_position; + return 0; + } + function add_int16_le(b, x){ + var _d_ = Stdlib_Sys[11] ? caml_bswap16(x) : x; + return add_int16_ne(b, _d_); + } + function add_int16_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_bswap16(x); + return add_int16_ne(b, x$0); + } + function add_int32_le(b, x){ + var _c_ = Stdlib_Sys[11] ? caml_int32_bswap(x) : x; + return add_int32_ne(b, _c_); + } + function add_int32_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int32_bswap(x); + return add_int32_ne(b, x$0); + } + function add_int64_le(b, x){ + var _b_ = Stdlib_Sys[11] ? caml_int64_bswap(x) : x; + return add_int64_ne(b, _b_); + } + function add_int64_be(b, x){ + var x$0 = Stdlib_Sys[11] ? x : caml_int64_bswap(x); + return add_int64_ne(b, x$0); + } + var + Stdlib_Buffer = + [0, + create, + contents, + to_bytes, + sub, + blit, + nth, + length, + clear, + reset, + output_buffer, + truncate, + add_char, + add_utf_8_uchar, + add_utf_16le_uchar, + add_utf_16be_uchar, + add_string, + add_bytes, + add_substring, + add_subbytes, + add_substitute, + add_buffer, + add_channel, + to_seq, + to_seqi, + add_seq, + of_seq, + add_int8, + add_int8, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int16_ne, + add_int16_be, + add_int16_le, + add_int32_ne, + add_int32_be, + add_int32_le, + add_int64_ne, + add_int64_be, + add_int64_le]; + runtime.caml_register_global(14, Stdlib_Buffer, "Stdlib__Buffer"); + return; + } + (globalThis)); + +//# 9889 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Mutex = + [0, + runtime.caml_ml_mutex_new, + runtime.caml_ml_mutex_lock, + runtime.caml_ml_mutex_try_lock, + runtime.caml_ml_mutex_unlock]; + runtime.caml_register_global(0, Stdlib_Mutex, "Stdlib__Mutex"); + return; + } + (globalThis)); + +//# 9905 "../../../.js/default/stdlib/stdlib.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Stdlib_Condition = + [0, + runtime.caml_ml_condition_new, + runtime.caml_ml_condition_wait, + runtime.caml_ml_condition_signal, + runtime.caml_ml_condition_broadcast]; + runtime.caml_register_global(0, Stdlib_Condition, "Stdlib__Condition"); + return; + } + (globalThis)); + +//# 10012 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_domain_dls_set = runtime.caml_domain_dls_set, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_domain_id = runtime.caml_ml_domain_id, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Mutex = global_data.Stdlib__Mutex, + Stdlib_Condition = global_data.Stdlib__Condition, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Array = global_data.Stdlib__Array, + cst_internal_error_Am_I_alread = "internal error: Am I already finished?", + cst_first_domain_already_spawn = "first domain already spawned"; + function cpu_relax(param){return runtime.caml_ml_domain_cpu_relax(0);} + var unique_value = [0, 0]; + function create_dls(param){ + var st = caml_make_vect(8, unique_value); + return caml_domain_dls_set(st); + } + create_dls(0); + var + key_counter = caml_call1(Stdlib_Atomic[1], 0), + parent_keys = caml_call1(Stdlib_Atomic[1], 0); + function new_key(split_from_parent, init_orphan){ + var + idx = caml_call2(Stdlib_Atomic[6], key_counter, 1), + k = [0, idx, init_orphan]; + if(split_from_parent){ + var split = split_from_parent[1], ki = [0, k, split]; + for(;;){ + var l = caml_call1(Stdlib_Atomic[2], parent_keys); + if(1 - caml_call3(Stdlib_Atomic[5], parent_keys, l, [0, ki, l])) + continue; + break; + } + } + return k; + } + function maybe_grow(idx){ + var st = runtime.caml_domain_dls_get(0), sz = st.length - 1; + if(idx < sz) return st; + var new_sz = sz; + for(;;){ + if(idx < new_sz){ + var new_st = caml_make_vect(new_sz, unique_value); + caml_call5(Stdlib_Array[8], st, 0, new_st, 0, sz); + caml_domain_dls_set(new_st); + return new_st; + } + var s = 2 * new_sz | 0, new_sz = s; + } + } + function set(param, x){ + var idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = x; + return 0; + } + function get(param){ + var + init = param[2], + idx = param[1], + st = maybe_grow(idx), + v = caml_check_bound(st, idx)[1 + idx]; + if(v !== unique_value) return v; + var v$0 = caml_call1(init, 0); + caml_check_bound(st, idx)[1 + idx] = v$0; + return v$0; + } + function get_id(param){var domain = param[1]; return domain;} + function self(param){return caml_ml_domain_id(0);} + function is_main_domain(param){return 0 === caml_ml_domain_id(0) ? 1 : 0;} + var + first_domain_spawned = caml_call1(Stdlib_Atomic[1], 0), + first_spawn_function = [0, function(param){return 0;}]; + function before_first_spawn(f){ + if(caml_call1(Stdlib_Atomic[2], first_domain_spawned)) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_first_domain_already_spawn], 1); + var old_f = first_spawn_function[1]; + function new_f(param){caml_call1(old_f, 0); return caml_call1(f, 0);} + first_spawn_function[1] = new_f; + return 0; + } + var at_exit_key = new_key(0, function(param, _e_){return 0;}); + function at_exit(f){ + var old_exit = get(at_exit_key); + function new_exit(param){ + caml_call1(f, 0); + return caml_call1(old_exit, 0); + } + return set(at_exit_key, new_exit); + } + function do_at_exit(param){ + var f = get(at_exit_key); + return caml_call1(f, 0); + } + Stdlib[104][1] = do_at_exit; + function spawn(f){ + if(1 - caml_call1(Stdlib_Atomic[2], first_domain_spawned)){ + caml_call2(Stdlib_Atomic[3], first_domain_spawned, 1); + caml_call1(first_spawn_function[1], 0); + first_spawn_function[1] = function(param){return 0;}; + } + var _a_ = caml_call1(Stdlib_Atomic[2], parent_keys); + function _b_(param){ + var split = param[2], k = param[1], idx = k[1]; + return [0, idx, caml_call1(split, get(k))]; + } + var + pk = caml_call2(Stdlib_List[19], _b_, _a_), + term_mutex = caml_call1(Stdlib_Mutex[1], 0), + term_condition = caml_call1(Stdlib_Condition[1], 0), + term_state = [0, 0]; + function body(param){ + var switch$0 = 0; + try{ + create_dls(0); + var + _c_ = + function(param){ + var v = param[2], idx = param[1], st = maybe_grow(idx); + caml_check_bound(st, idx)[1 + idx] = v; + return 0; + }; + caml_call2(Stdlib_List[17], _c_, pk); + var res = caml_call1(f, 0); + } + catch(ex$0){ + var ex = caml_wrap_exception(ex$0), result = [1, ex]; + switch$0 = 1; + } + if(! switch$0) var result = [0, res]; + try{do_at_exit(0); var result$0 = result;} + catch(ex){ + var + ex$0 = caml_wrap_exception(ex), + _d_ = 0 === result[0] ? [1, ex$0] : result, + result$0 = _d_; + } + caml_call1(Stdlib_Mutex[2], term_mutex); + return term_state[1] + ? caml_call1(Stdlib[2], cst_internal_error_Am_I_alread) + : (term_state + [1] + = [0, result$0], + caml_call1(Stdlib_Condition[4], term_condition)); + } + return [0, + runtime.caml_domain_spawn(body, term_mutex), + term_mutex, + term_condition, + term_state]; + } + function join(param){ + var + term_state = param[4], + term_condition = param[3], + term_mutex = param[2]; + caml_call1(Stdlib_Mutex[2], term_mutex); + for(;;){ + var match = term_state[1]; + if(! match){ + caml_call2(Stdlib_Condition[2], term_condition, term_mutex); + continue; + } + var res = match[1]; + caml_call1(Stdlib_Mutex[4], term_mutex); + if(0 === res[0]){var x = res[1]; return x;} + var ex = res[1]; + throw caml_maybe_attach_backtrace(ex, 1); + } + } + var + recommended_domain_count = runtime.caml_recommended_domain_count, + Stdlib_Domain = + [0, + spawn, + join, + get_id, + self, + before_first_spawn, + at_exit, + cpu_relax, + is_main_domain, + recommended_domain_count, + [0, new_key, get, set]]; + runtime.caml_register_global(8, Stdlib_Domain, "Stdlib__Domain"); + return; + } + (globalThis)); + +//# 10233 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$43 = "", + cst_and = " and ", + cst_Li$3 = "%Li", + cst_i$3 = "%i", + cst_li$3 = "%li", + cst_ni$3 = "%ni", + cst_u$0 = "%u", + cst$42 = "' '", + cst$41 = "'#'", + cst$39 = "'*'", + cst$40 = "'+'", + cst$44 = ", ", + cst_0$3 = "0", + cst_at_character_number = ": at character number ", + cst$38 = "@[", + cst$37 = "@{", + cst_bad_input_format_type_mism = + "bad input: format type mismatch between ", + cst_bad_input_format_type_mism$0 = + "bad input: format type mismatch between %S and %S", + cst_camlinternalFormat_ml = "camlinternalFormat.ml", + cst_invalid_format = "invalid format ", + cst_precision$3 = "precision", + caml_blit_string = runtime.caml_blit_string, + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_format_float = runtime.caml_format_float, + caml_format_int = runtime.caml_format_int, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$9 = "%{", + cst$10 = "%}", + cst$11 = "%(", + cst$12 = "%)", + cst$13 = "%?", + cst$18 = cst$37, + cst$19 = cst$38, + cst$20 = cst$37, + cst$21 = cst$38, + cst$22 = cst$37, + cst$23 = cst$38, + cst$26 = cst$39, + cst$24 = "'-'", + cst$25 = cst$39, + cst$27 = cst$40, + cst$28 = cst$41, + cst$29 = cst$42, + cst$30 = cst$40, + cst$31 = "'_'", + sub_format = [0, 0, cst$43], + formatting_lit = [0, "@;", 1, 0], + cst$35 = cst$41, + cst$32 = cst$40, + cst$33 = cst$40, + cst$34 = cst$42, + cst$36 = cst$40, + cst$17 = ".", + cst$14 = "%!", + cst$15 = cst$37, + cst$16 = cst$38, + cst$8 = "%%", + cst$0 = "@]", + cst$1 = "@}", + cst$2 = "@?", + cst$3 = "@\n", + cst$4 = "@.", + cst$5 = "@@", + cst$6 = "@%", + cst$7 = "@", + cst = ".*", + Assert_failure = global_data.Assert_failure, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Int = global_data.Stdlib__Int, + cst_c = "%c", + cst_s = "%s", + cst_i = cst_i$3, + cst_li = cst_li$3, + cst_ni = cst_ni$3, + cst_Li = cst_Li$3, + cst_f = "%f", + cst_B = "%B", + cst_a = "%a", + cst_t = "%t", + cst_r = "%r", + cst_r$0 = "%_r", + _b_ = [0, cst_camlinternalFormat_ml, 850, 23], + _m_ = [0, cst_camlinternalFormat_ml, 814, 21], + _e_ = [0, cst_camlinternalFormat_ml, 815, 21], + _n_ = [0, cst_camlinternalFormat_ml, 818, 21], + _f_ = [0, cst_camlinternalFormat_ml, 819, 21], + _o_ = [0, cst_camlinternalFormat_ml, 822, 19], + _g_ = [0, cst_camlinternalFormat_ml, 823, 19], + _p_ = [0, cst_camlinternalFormat_ml, 826, 22], + _h_ = [0, cst_camlinternalFormat_ml, 827, 22], + _q_ = [0, cst_camlinternalFormat_ml, 831, 30], + _i_ = [0, cst_camlinternalFormat_ml, 832, 30], + _k_ = [0, cst_camlinternalFormat_ml, 836, 26], + _c_ = [0, cst_camlinternalFormat_ml, 837, 26], + _l_ = [0, cst_camlinternalFormat_ml, 846, 28], + _d_ = [0, cst_camlinternalFormat_ml, 847, 28], + _j_ = [0, cst_camlinternalFormat_ml, 851, 23], + _s_ = [0, cst_camlinternalFormat_ml, 1558, 4], + cst_Printf_bad_conversion = "Printf: bad conversion %[", + _t_ = [0, cst_camlinternalFormat_ml, 1626, 39], + _u_ = [0, cst_camlinternalFormat_ml, 1649, 31], + _v_ = [0, cst_camlinternalFormat_ml, 1650, 31], + cst_Printf_bad_conversion$0 = "Printf: bad conversion %_", + _w_ = [0, cst_camlinternalFormat_ml, 1830, 8], + ___ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _Z_ = + [0, + [11, cst_bad_input_format_type_mism, [3, 0, [11, cst_and, [3, 0, 0]]]], + cst_bad_input_format_type_mism$0], + _C_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", duplicate flag ", [1, 0]]]]]], + "invalid format %S: at character number %d, duplicate flag %C"], + cst_0 = cst_0$3, + cst_padding = "padding", + _D_ = [0, 1, 0], + _E_ = [0, 0], + cst_precision = cst_precision$3, + _F_ = [1, 0], + _G_ = [1, 1], + cst_0$2 = "'0'", + cst_0$0 = cst_0$3, + _I_ = [1, 1], + cst_0$1 = cst_0$3, + cst_precision$0 = cst_precision$3, + _H_ = [1, 1], + cst_precision$1 = cst_precision$3, + _M_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + ", flag ", + [1, + [11, + " is only allowed after the '", + [12, 37, [11, "', before padding and precision", 0]]]]]]]]], + "invalid format %S: at character number %d, flag %C is only allowed after the '%%', before padding and precision"], + _J_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, ', invalid conversion "', [12, 37, [0, [12, 34, 0]]]]]]]], + 'invalid format %S: at character number %d, invalid conversion "%%%c"'], + _K_ = [0, 0], + cst_padding$0 = "`padding'", + _L_ = [0, 0], + cst_precision$2 = "`precision'", + _N_ = [0, [12, 64, 0]], + _O_ = [0, "@ ", 1, 0], + _P_ = [0, "@,", 0, 0], + _Q_ = [2, 60], + _R_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": '", + [12, + 37, + [11, + "' alone is not accepted in character sets, use ", + [12, + 37, + [12, + 37, + [11, " instead at position ", [4, 0, 0, 0, [12, 46, 0]]]]]]]]]], + "invalid format %S: '%%' alone is not accepted in character sets, use %%%% instead at position %d."], + _S_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ": integer ", + [4, 0, 0, 0, [11, " is greater than the limit ", [4, 0, 0, 0, 0]]]]]], + "invalid format %S: integer %d is greater than the limit %d"], + cst_digit = "digit", + _T_ = [0, cst_camlinternalFormat_ml, 2837, 11], + _U_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + ': unclosed sub-format, expected "', + [12, 37, [0, [11, '" at character number ', [4, 0, 0, 0, 0]]]]]]], + 'invalid format %S: unclosed sub-format, expected "%%%c" at character number %d'], + cst_character = "character ')'", + cst_character$0 = "character '}'", + _V_ = [0, cst_camlinternalFormat_ml, 2899, 34], + _W_ = [0, cst_camlinternalFormat_ml, 2935, 28], + _X_ = [0, cst_camlinternalFormat_ml, 2957, 11], + _Y_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, + 0, + 0, + 0, + [11, + cst$44, + [2, + 0, + [11, + " is incompatible with '", + [0, [11, "' in sub-format ", [3, 0, 0]]]]]]]]]], + "invalid format %S: at character number %d, %s is incompatible with '%c' in sub-format %S"], + _B_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, cst$44, [2, 0, [11, " expected, read ", [1, 0]]]]]]]], + "invalid format %S: at character number %d, %s expected, read %C"], + _A_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, + cst_at_character_number, + [4, 0, 0, 0, [11, ", '", [0, [11, "' without ", [2, 0, 0]]]]]]]], + "invalid format %S: at character number %d, '%c' without %s"], + cst_non_zero_widths_are_unsupp = + "non-zero widths are unsupported for %c conversions", + cst_unexpected_end_of_format = "unexpected end of format", + _z_ = + [0, + [11, + cst_invalid_format, + [3, + 0, + [11, cst_at_character_number, [4, 0, 0, 0, [11, cst$44, [2, 0, 0]]]]]], + "invalid format %S: at character number %d, %s"], + _y_ = + [0, + [11, "invalid box description ", [3, 0, 0]], + "invalid box description %S"], + _x_ = [0, 0, 4], + cst_nan = "nan", + cst_neg_infinity = "neg_infinity", + cst_infinity = "infinity", + _r_ = [0, 103], + cst_nd$0 = "%+nd", + cst_nd$1 = "% nd", + cst_ni$1 = "%+ni", + cst_ni$2 = "% ni", + cst_nx = "%nx", + cst_nx$0 = "%#nx", + cst_nX = "%nX", + cst_nX$0 = "%#nX", + cst_no = "%no", + cst_no$0 = "%#no", + cst_nd = "%nd", + cst_ni$0 = cst_ni$3, + cst_nu = "%nu", + cst_ld$0 = "%+ld", + cst_ld$1 = "% ld", + cst_li$1 = "%+li", + cst_li$2 = "% li", + cst_lx = "%lx", + cst_lx$0 = "%#lx", + cst_lX = "%lX", + cst_lX$0 = "%#lX", + cst_lo = "%lo", + cst_lo$0 = "%#lo", + cst_ld = "%ld", + cst_li$0 = cst_li$3, + cst_lu = "%lu", + cst_Ld$0 = "%+Ld", + cst_Ld$1 = "% Ld", + cst_Li$1 = "%+Li", + cst_Li$2 = "% Li", + cst_Lx = "%Lx", + cst_Lx$0 = "%#Lx", + cst_LX = "%LX", + cst_LX$0 = "%#LX", + cst_Lo = "%Lo", + cst_Lo$0 = "%#Lo", + cst_Ld = "%Ld", + cst_Li$0 = cst_Li$3, + cst_Lu = "%Lu", + cst_d$0 = "%+d", + cst_d$1 = "% d", + cst_i$1 = "%+i", + cst_i$2 = "% i", + cst_x = "%x", + cst_x$0 = "%#x", + cst_X = "%X", + cst_X$0 = "%#X", + cst_o = "%o", + cst_o$0 = "%#o", + cst_d = "%d", + cst_i$0 = cst_i$3, + cst_u = cst_u$0, + cst_0c = "0c", + _a_ = [0, 0, 0], + cst_CamlinternalFormat_Type_mi = "CamlinternalFormat.Type_mismatch"; + function create_char_set(param){return caml_call2(Stdlib_Bytes[1], 32, 0);} + function add_in_char_set(char_set, c){ + var + str_ind = c >>> 3 | 0, + mask = 1 << (c & 7), + _dU_ = runtime.caml_bytes_get(char_set, str_ind) | mask; + return caml_bytes_set(char_set, str_ind, caml_call1(Stdlib[29], _dU_)); + } + function freeze_char_set(char_set){ + return caml_call1(Stdlib_Bytes[6], char_set); + } + function rev_char_set(char_set){ + var char_set$0 = create_char_set(0), i = 0; + for(;;){ + var _dS_ = caml_string_get(char_set, i) ^ 255; + caml_bytes_set(char_set$0, i, caml_call1(Stdlib[29], _dS_)); + var _dT_ = i + 1 | 0; + if(31 === i) return caml_call1(Stdlib_Bytes[44], char_set$0); + var i = _dT_; + } + } + function is_in_char_set(char_set, c){ + var str_ind = c >>> 3 | 0, mask = 1 << (c & 7); + return 0 !== (caml_string_get(char_set, str_ind) & mask) ? 1 : 0; + } + function pad_of_pad_opt(pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return [0, 1, width]; + } + function param_format_of_ignored_format(ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + return [0, [0, fmt]]; + case 1: + return [0, [1, fmt]]; + case 2: + return [0, [19, fmt]]; + default: return [0, [22, fmt]]; + } + switch(ign[0]){ + case 0: + var pad_opt = ign[1]; return [0, [2, pad_of_pad_opt(pad_opt), fmt]]; + case 1: + var pad_opt$0 = ign[1]; + return [0, [3, pad_of_pad_opt(pad_opt$0), fmt]]; + case 2: + var pad_opt$1 = ign[2], iconv = ign[1]; + return [0, [4, iconv, pad_of_pad_opt(pad_opt$1), 0, fmt]]; + case 3: + var pad_opt$2 = ign[2], iconv$0 = ign[1]; + return [0, [5, iconv$0, pad_of_pad_opt(pad_opt$2), 0, fmt]]; + case 4: + var pad_opt$3 = ign[2], iconv$1 = ign[1]; + return [0, [6, iconv$1, pad_of_pad_opt(pad_opt$3), 0, fmt]]; + case 5: + var pad_opt$4 = ign[2], iconv$2 = ign[1]; + return [0, [7, iconv$2, pad_of_pad_opt(pad_opt$4), 0, fmt]]; + case 6: + var prec_opt = ign[2], pad_opt$5 = ign[1]; + if(prec_opt) + var ndec = prec_opt[1], _dR_ = [0, ndec]; + else + var _dR_ = 0; + return [0, [8, _a_, pad_of_pad_opt(pad_opt$5), _dR_, fmt]]; + case 7: + var pad_opt$6 = ign[1]; + return [0, [9, pad_of_pad_opt(pad_opt$6), fmt]]; + case 8: + var fmtty = ign[2], pad_opt$7 = ign[1]; + return [0, [13, pad_opt$7, fmtty, fmt]]; + case 9: + var fmtty$0 = ign[2], pad_opt$8 = ign[1]; + return [0, [14, pad_opt$8, fmtty$0, fmt]]; + case 10: + var char_set = ign[2], width_opt = ign[1]; + return [0, [20, width_opt, char_set, fmt]]; + default: var counter = ign[1]; return [0, [21, counter, fmt]]; + } + } + function default_float_precision(fconv){return 5 === fconv[2] ? 12 : -6;} + function buffer_create(init_size){ + return [0, 0, caml_create_bytes(init_size)]; + } + function buffer_check_size(buf, overhead){ + var + len = runtime.caml_ml_bytes_length(buf[2]), + min_len = buf[1] + overhead | 0, + _dP_ = len < min_len ? 1 : 0; + if(_dP_){ + var + new_len = caml_call2(Stdlib_Int[11], len * 2 | 0, min_len), + new_str = caml_create_bytes(new_len); + caml_call5(Stdlib_Bytes[11], buf[2], 0, new_str, 0, len); + buf[2] = new_str; + var _dQ_ = 0; + } + else + var _dQ_ = _dP_; + return _dQ_; + } + function buffer_add_char(buf, c){ + buffer_check_size(buf, 1); + caml_bytes_set(buf[2], buf[1], c); + buf[1] = buf[1] + 1 | 0; + return 0; + } + function buffer_add_string(buf, s){ + var str_len = caml_ml_string_length(s); + buffer_check_size(buf, str_len); + caml_call5(Stdlib_String[48], s, 0, buf[2], buf[1], str_len); + buf[1] = buf[1] + str_len | 0; + return 0; + } + function buffer_contents(buf){ + return caml_call3(Stdlib_Bytes[8], buf[2], 0, buf[1]); + } + function char_of_iconv(iconv){ + switch(iconv){ + case 6: + case 7: + return 120; + case 8: + case 9: + return 88; + case 10: + case 11: + return 111; + case 12: + case 15: + return 117; + case 0: + case 1: + case 2: + case 13: + return 100; + default: return 105; + } + } + function char_of_fconv(opt, fconv){ + if(opt) var sth = opt[1], cF = sth; else var cF = 70; + switch(fconv[2]){ + case 0: + return 102; + case 1: + return 101; + case 2: + return 69; + case 3: + return 103; + case 4: + return 71; + case 5: + return cF; + case 6: + return 104; + case 7: + return 72; + default: return 70; + } + } + function bprint_padty(buf, padty){ + switch(padty){ + case 0: + return buffer_add_char(buf, 45); + case 1: + return 0; + default: return buffer_add_char(buf, 48); + } + } + function bprint_ignored_flag(buf, ign_flag){ + return ign_flag ? buffer_add_char(buf, 95) : ign_flag; + } + function bprint_pad_opt(buf, pad_opt){ + if(! pad_opt) return 0; + var width = pad_opt[1]; + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], width)); + } + function bprint_padding(buf, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]){ + var n = pad[2], padty = pad[1]; + bprint_padty(buf, padty); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + var padty$0 = pad[1]; + bprint_padty(buf, padty$0); + return buffer_add_char(buf, 42); + } + function bprint_precision(buf, prec){ + if(typeof prec === "number") + return prec ? buffer_add_string(buf, cst) : 0; + var n = prec[1]; + buffer_add_char(buf, 46); + return buffer_add_string(buf, caml_call1(Stdlib_Int[12], n)); + } + function bprint_iconv_flag(buf, iconv){ + switch(iconv){ + case 1: + case 4: + return buffer_add_char(buf, 43); + case 2: + case 5: + return buffer_add_char(buf, 32); + case 7: + case 9: + case 11: + case 13: + case 14: + case 15: + return buffer_add_char(buf, 35); + default: return 0; + } + } + function bprint_altint_fmt(buf, ign_flag, iconv, pad, prec, c){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad); + bprint_precision(buf, prec); + buffer_add_char(buf, c); + return buffer_add_char(buf, char_of_iconv(iconv)); + } + function bprint_fconv_flag(buf, fconv){ + switch(fconv[1]){ + case 0: break; + case 1: + buffer_add_char(buf, 43); break; + default: buffer_add_char(buf, 32); + } + return 8 <= fconv[2] ? buffer_add_char(buf, 35) : 0; + } + function string_of_formatting_lit(formatting_lit){ + if(typeof formatting_lit === "number") + switch(formatting_lit){ + case 0: + return cst$0; + case 1: + return cst$1; + case 2: + return cst$2; + case 3: + return cst$3; + case 4: + return cst$4; + case 5: + return cst$5; + default: return cst$6; + } + switch(formatting_lit[0]){ + case 0: + var str = formatting_lit[1]; return str; + case 1: + var str$0 = formatting_lit[1]; return str$0; + default: + var c = formatting_lit[1], _dO_ = caml_call2(Stdlib_String[1], 1, c); + return caml_call2(Stdlib[28], cst$7, _dO_); + } + } + function bprint_char_literal(buf, chr){ + return 37 === chr + ? buffer_add_string(buf, cst$8) + : buffer_add_char(buf, chr); + } + function bprint_string_literal(buf, str){ + var _dM_ = caml_ml_string_length(str) - 1 | 0, _dL_ = 0; + if(_dM_ >= 0){ + var i = _dL_; + for(;;){ + bprint_char_literal(buf, caml_string_get(str, i)); + var _dN_ = i + 1 | 0; + if(_dM_ !== i){var i = _dN_; continue;} + break; + } + } + return 0; + } + function bprint_fmtty(buf, fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1]; + buffer_add_string(buf, cst_c); + var fmtty$0 = fmtty$1; + continue; + case 1: + var fmtty$2 = fmtty$0[1]; + buffer_add_string(buf, cst_s); + var fmtty$0 = fmtty$2; + continue; + case 2: + var fmtty$3 = fmtty$0[1]; + buffer_add_string(buf, cst_i); + var fmtty$0 = fmtty$3; + continue; + case 3: + var fmtty$4 = fmtty$0[1]; + buffer_add_string(buf, cst_li); + var fmtty$0 = fmtty$4; + continue; + case 4: + var fmtty$5 = fmtty$0[1]; + buffer_add_string(buf, cst_ni); + var fmtty$0 = fmtty$5; + continue; + case 5: + var fmtty$6 = fmtty$0[1]; + buffer_add_string(buf, cst_Li); + var fmtty$0 = fmtty$6; + continue; + case 6: + var fmtty$7 = fmtty$0[1]; + buffer_add_string(buf, cst_f); + var fmtty$0 = fmtty$7; + continue; + case 7: + var fmtty$8 = fmtty$0[1]; + buffer_add_string(buf, cst_B); + var fmtty$0 = fmtty$8; + continue; + case 8: + var fmtty$9 = fmtty$0[2], sub_fmtty = fmtty$0[1]; + buffer_add_string(buf, cst$9); + bprint_fmtty(buf, sub_fmtty); + buffer_add_string(buf, cst$10); + var fmtty$0 = fmtty$9; + continue; + case 9: + var fmtty$10 = fmtty$0[3], sub_fmtty$0 = fmtty$0[1]; + buffer_add_string(buf, cst$11); + bprint_fmtty(buf, sub_fmtty$0); + buffer_add_string(buf, cst$12); + var fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1]; + buffer_add_string(buf, cst_a); + var fmtty$0 = fmtty$11; + continue; + case 11: + var fmtty$12 = fmtty$0[1]; + buffer_add_string(buf, cst_t); + var fmtty$0 = fmtty$12; + continue; + case 12: + var fmtty$13 = fmtty$0[1]; + buffer_add_string(buf, cst$13); + var fmtty$0 = fmtty$13; + continue; + case 13: + var fmtty$14 = fmtty$0[1]; + buffer_add_string(buf, cst_r); + var fmtty$0 = fmtty$14; + continue; + default: + var fmtty$15 = fmtty$0[1]; + buffer_add_string(buf, cst_r$0); + var fmtty$0 = fmtty$15; + continue; + } + } + } + function int_of_custom_arity(param){ + if(! param) return 0; + var x = param[1]; + return 1 + int_of_custom_arity(x) | 0; + } + function string_of_fmt(fmt){ + var buf = buffer_create(16); + function fmtiter(fmt, ign_flag){ + var fmt$0 = fmt, ign_flag$0 = ign_flag; + a: + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 99); + var fmt$0 = rest, ign_flag$0 = 0; + continue; + case 1: + var rest$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 67); + var fmt$0 = rest$0, ign_flag$0 = 0; + continue; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad); + buffer_add_char(buf, 115); + var fmt$0 = rest$1, ign_flag$0 = 0; + continue; + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$0); + buffer_add_char(buf, 83); + var fmt$0 = rest$2, ign_flag$0 = 0; + continue; + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_iconv_flag(buf, iconv); + bprint_padding(buf, pad$1); + bprint_precision(buf, prec); + buffer_add_char(buf, char_of_iconv(iconv)); + var fmt$0 = rest$3, ign_flag$0 = 0; + continue; + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$0, pad$2, prec$0, 108); + var fmt$0 = rest$4, ign_flag$0 = 0; + continue; + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$1, pad$3, prec$1, 110); + var fmt$0 = rest$5, ign_flag$0 = 0; + continue; + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + bprint_altint_fmt(buf, ign_flag$0, iconv$2, pad$4, prec$2, 76); + var fmt$0 = rest$6, ign_flag$0 = 0; + continue; + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_fconv_flag(buf, fconv); + bprint_padding(buf, pad$5); + bprint_precision(buf, prec$3); + buffer_add_char(buf, char_of_fconv(0, fconv)); + var fmt$0 = rest$7, ign_flag$0 = 0; + continue; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_padding(buf, pad$6); + buffer_add_char(buf, 66); + var fmt$0 = rest$8, ign_flag$0 = 0; + continue; + case 10: + var rest$9 = fmt$0[1]; + buffer_add_string(buf, cst$14); + var fmt$0 = rest$9; + continue; + case 11: + var rest$10 = fmt$0[2], str = fmt$0[1]; + bprint_string_literal(buf, str); + var fmt$0 = rest$10; + continue; + case 12: + var rest$11 = fmt$0[2], chr = fmt$0[1]; + bprint_char_literal(buf, chr); + var fmt$0 = rest$11; + continue; + case 13: + var rest$12 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt); + buffer_add_char(buf, 123); + bprint_fmtty(buf, fmtty); + buffer_add_char(buf, 37); + buffer_add_char(buf, 125); + var fmt$0 = rest$12, ign_flag$0 = 0; + continue; + case 14: + var rest$13 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, pad_opt$0); + buffer_add_char(buf, 40); + bprint_fmtty(buf, fmtty$0); + buffer_add_char(buf, 37); + buffer_add_char(buf, 41); + var fmt$0 = rest$13, ign_flag$0 = 0; + continue; + case 15: + var rest$14 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 97); + var fmt$0 = rest$14, ign_flag$0 = 0; + continue; + case 16: + var rest$15 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 116); + var fmt$0 = rest$15, ign_flag$0 = 0; + continue; + case 17: + var rest$16 = fmt$0[2], fmting_lit = fmt$0[1]; + bprint_string_literal(buf, string_of_formatting_lit(fmting_lit)); + var fmt$0 = rest$16; + continue; + case 18: + var rest$17 = fmt$0[2], fmting_gen = fmt$0[1]; + if(0 === fmting_gen[0]){ + var str$0 = fmting_gen[1][2]; + buffer_add_string(buf, cst$15); + buffer_add_string(buf, str$0); + } + else{ + var str$1 = fmting_gen[1][2]; + buffer_add_string(buf, cst$16); + buffer_add_string(buf, str$1); + } + var fmt$0 = rest$17; + continue; + case 19: + var rest$18 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 114); + var fmt$0 = rest$18, ign_flag$0 = 0; + continue; + case 20: + var rest$19 = fmt$0[3], char_set = fmt$0[2], width_opt = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_pad_opt(buf, width_opt); + var + print_char = + function(buf, i){ + var c = caml_call1(Stdlib[29], i); + return 37 === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 37)) + : 64 + === c + ? (buffer_add_char(buf, 37), buffer_add_char(buf, 64)) + : buffer_add_char(buf, c); + }; + buffer_add_char(buf, 91); + var + set = + is_in_char_set(char_set, 0) + ? (buffer_add_char(buf, 94), rev_char_set(char_set)) + : char_set, + is_alone$0 = + function(set){ + function is_alone(c){ + var + after = caml_call1(Stdlib_Char[1], c + 1 | 0), + before = caml_call1(Stdlib_Char[1], c - 1 | 0), + _dH_ = is_in_char_set(set, c); + if(_dH_) + var + _dI_ = is_in_char_set(set, before), + _dJ_ = _dI_ ? is_in_char_set(set, after) : _dI_, + _dK_ = 1 - _dJ_; + else + var _dK_ = _dH_; + return _dK_; + } + return is_alone; + }, + is_alone = is_alone$0(set); + if(is_alone(93)) buffer_add_char(buf, 93); + var i = 1; + b: + for(;;){ + if(i < 256){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i))){var i$0 = i + 1 | 0, i = i$0; continue;} + var switcher = caml_call1(Stdlib[29], i) - 45 | 0, switch$0 = 0; + if(48 < switcher >>> 0) + if(210 <= switcher) print_char(buf, 255); else switch$0 = 1; + else{ + if(46 < switcher - 1 >>> 0){ + var i$2 = i + 1 | 0, i = i$2; + continue; + } + switch$0 = 1; + } + if(switch$0){ + var i$1 = i + 1 | 0; + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1))){ + print_char(buf, i$1 - 1 | 0); + var i$6 = i$1 + 1 | 0, i = i$6; + continue; + } + var + switcher$0 = caml_call1(Stdlib[29], i$1) - 45 | 0, + switch$1 = 0; + if(48 < switcher$0 >>> 0){ + if(210 <= switcher$0){ + print_char(buf, 254); + print_char(buf, 255); + switch$1 = 1; + } + } + else if + (46 < switcher$0 - 1 >>> 0 + && ! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + var i$5 = i$1 + 1 | 0, i = i$5; + continue; + } + if(! switch$1){ + if(! is_in_char_set(set, caml_call1(Stdlib[29], i$1 + 1 | 0))){ + print_char(buf, i$1 - 1 | 0); + print_char(buf, i$1); + var i$4 = i$1 + 2 | 0, i = i$4; + continue; + } + var j = i$1 + 2 | 0, i$3 = i$1 - 1 | 0, j$0 = j; + for(;;){ + if + (256 !== j$0 + && is_in_char_set(set, caml_call1(Stdlib[29], j$0))){var j$1 = j$0 + 1 | 0, j$0 = j$1; continue;} + print_char(buf, i$3); + print_char(buf, 45); + print_char(buf, j$0 - 1 | 0); + if(j$0 < 256){var i$7 = j$0 + 1 | 0, i = i$7; continue b;} + break; + } + } + } + } + if(is_alone(45)) buffer_add_char(buf, 45); + buffer_add_char(buf, 93); + var fmt$0 = rest$19, ign_flag$0 = 0; + continue a; + } + case 21: + var rest$20 = fmt$0[2], counter = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + switch(counter){ + case 0: + var _dD_ = 108; break; + case 1: + var _dD_ = 110; break; + default: var _dD_ = 78; + } + buffer_add_char(buf, _dD_); + var fmt$0 = rest$20, ign_flag$0 = 0; + continue; + case 22: + var rest$21 = fmt$0[1]; + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + bprint_string_literal(buf, cst_0c); + var fmt$0 = rest$21, ign_flag$0 = 0; + continue; + case 23: + var + rest$22 = fmt$0[2], + ign = fmt$0[1], + fmt$1 = param_format_of_ignored_format(ign, rest$22)[1], + fmt$0 = fmt$1, + ign_flag$0 = 1; + continue; + default: + var + rest$23 = fmt$0[3], + arity = fmt$0[1], + _dF_ = int_of_custom_arity(arity), + _dE_ = 1; + if(_dF_ >= 1){ + var i$8 = _dE_; + for(;;){ + buffer_add_char(buf, 37); + bprint_ignored_flag(buf, ign_flag$0); + buffer_add_char(buf, 63); + var _dG_ = i$8 + 1 | 0; + if(_dF_ !== i$8){var i$8 = _dG_; continue;} + break; + } + } + var fmt$0 = rest$23, ign_flag$0 = 0; + continue; + } + } + } + fmtiter(fmt, 0); + return buffer_contents(buf); + } + function symm(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var rest = param[1]; return [0, symm(rest)]; + case 1: + var rest$0 = param[1]; return [1, symm(rest$0)]; + case 2: + var rest$1 = param[1]; return [2, symm(rest$1)]; + case 3: + var rest$2 = param[1]; return [3, symm(rest$2)]; + case 4: + var rest$3 = param[1]; return [4, symm(rest$3)]; + case 5: + var rest$4 = param[1]; return [5, symm(rest$4)]; + case 6: + var rest$5 = param[1]; return [6, symm(rest$5)]; + case 7: + var rest$6 = param[1]; return [7, symm(rest$6)]; + case 8: + var rest$7 = param[2], ty = param[1]; return [8, ty, symm(rest$7)]; + case 9: + var rest$8 = param[3], ty2 = param[2], ty1 = param[1]; + return [9, ty2, ty1, symm(rest$8)]; + case 10: + var rest$9 = param[1]; return [10, symm(rest$9)]; + case 11: + var rest$10 = param[1]; return [11, symm(rest$10)]; + case 12: + var rest$11 = param[1]; return [12, symm(rest$11)]; + case 13: + var rest$12 = param[1]; return [13, symm(rest$12)]; + default: var rest$13 = param[1]; return [14, symm(rest$13)]; + } + } + function fmtty_rel_det(param){ + if(typeof param !== "number") + switch(param[0]){ + case 0: + var + rest = param[1], + match = fmtty_rel_det(rest), + de = match[4], + ed = match[3], + af = match[2], + fa = match[1], + _di_ = function(param){caml_call1(af, 0); return 0;}; + return [0, + function(param){caml_call1(fa, 0); return 0;}, + _di_, + ed, + de]; + case 1: + var + rest$0 = param[1], + match$0 = fmtty_rel_det(rest$0), + de$0 = match$0[4], + ed$0 = match$0[3], + af$0 = match$0[2], + fa$0 = match$0[1], + _dj_ = function(param){caml_call1(af$0, 0); return 0;}; + return [0, + function(param){caml_call1(fa$0, 0); return 0;}, + _dj_, + ed$0, + de$0]; + case 2: + var + rest$1 = param[1], + match$1 = fmtty_rel_det(rest$1), + de$1 = match$1[4], + ed$1 = match$1[3], + af$1 = match$1[2], + fa$1 = match$1[1], + _dk_ = function(param){caml_call1(af$1, 0); return 0;}; + return [0, + function(param){caml_call1(fa$1, 0); return 0;}, + _dk_, + ed$1, + de$1]; + case 3: + var + rest$2 = param[1], + match$2 = fmtty_rel_det(rest$2), + de$2 = match$2[4], + ed$2 = match$2[3], + af$2 = match$2[2], + fa$2 = match$2[1], + _dl_ = function(param){caml_call1(af$2, 0); return 0;}; + return [0, + function(param){caml_call1(fa$2, 0); return 0;}, + _dl_, + ed$2, + de$2]; + case 4: + var + rest$3 = param[1], + match$3 = fmtty_rel_det(rest$3), + de$3 = match$3[4], + ed$3 = match$3[3], + af$3 = match$3[2], + fa$3 = match$3[1], + _dm_ = function(param){caml_call1(af$3, 0); return 0;}; + return [0, + function(param){caml_call1(fa$3, 0); return 0;}, + _dm_, + ed$3, + de$3]; + case 5: + var + rest$4 = param[1], + match$4 = fmtty_rel_det(rest$4), + de$4 = match$4[4], + ed$4 = match$4[3], + af$4 = match$4[2], + fa$4 = match$4[1], + _dn_ = function(param){caml_call1(af$4, 0); return 0;}; + return [0, + function(param){caml_call1(fa$4, 0); return 0;}, + _dn_, + ed$4, + de$4]; + case 6: + var + rest$5 = param[1], + match$5 = fmtty_rel_det(rest$5), + de$5 = match$5[4], + ed$5 = match$5[3], + af$5 = match$5[2], + fa$5 = match$5[1], + _do_ = function(param){caml_call1(af$5, 0); return 0;}; + return [0, + function(param){caml_call1(fa$5, 0); return 0;}, + _do_, + ed$5, + de$5]; + case 7: + var + rest$6 = param[1], + match$6 = fmtty_rel_det(rest$6), + de$6 = match$6[4], + ed$6 = match$6[3], + af$6 = match$6[2], + fa$6 = match$6[1], + _dp_ = function(param){caml_call1(af$6, 0); return 0;}; + return [0, + function(param){caml_call1(fa$6, 0); return 0;}, + _dp_, + ed$6, + de$6]; + case 8: + var + rest$7 = param[2], + match$7 = fmtty_rel_det(rest$7), + de$7 = match$7[4], + ed$7 = match$7[3], + af$7 = match$7[2], + fa$7 = match$7[1], + _dq_ = function(param){caml_call1(af$7, 0); return 0;}; + return [0, + function(param){caml_call1(fa$7, 0); return 0;}, + _dq_, + ed$7, + de$7]; + case 9: + var + rest$8 = param[3], + ty2 = param[2], + ty1 = param[1], + match$8 = fmtty_rel_det(rest$8), + de$8 = match$8[4], + ed$8 = match$8[3], + af$8 = match$8[2], + fa$8 = match$8[1], + ty = trans(symm(ty1), ty2), + match$9 = fmtty_rel_det(ty), + jd = match$9[4], + dj = match$9[3], + ga = match$9[2], + ag = match$9[1], + _dr_ = + function(param){caml_call1(jd, 0); caml_call1(de$8, 0); return 0;}, + _ds_ = + function(param){caml_call1(ed$8, 0); caml_call1(dj, 0); return 0;}, + _dt_ = + function(param){caml_call1(ga, 0); caml_call1(af$8, 0); return 0;}; + return [0, + function(param){ + caml_call1(fa$8, 0); + caml_call1(ag, 0); + return 0; + }, + _dt_, + _ds_, + _dr_]; + case 10: + var + rest$9 = param[1], + match$10 = fmtty_rel_det(rest$9), + de$9 = match$10[4], + ed$9 = match$10[3], + af$9 = match$10[2], + fa$9 = match$10[1], + _du_ = function(param){caml_call1(af$9, 0); return 0;}; + return [0, + function(param){caml_call1(fa$9, 0); return 0;}, + _du_, + ed$9, + de$9]; + case 11: + var + rest$10 = param[1], + match$11 = fmtty_rel_det(rest$10), + de$10 = match$11[4], + ed$10 = match$11[3], + af$10 = match$11[2], + fa$10 = match$11[1], + _dv_ = function(param){caml_call1(af$10, 0); return 0;}; + return [0, + function(param){caml_call1(fa$10, 0); return 0;}, + _dv_, + ed$10, + de$10]; + case 12: + var + rest$11 = param[1], + match$12 = fmtty_rel_det(rest$11), + de$11 = match$12[4], + ed$11 = match$12[3], + af$11 = match$12[2], + fa$11 = match$12[1], + _dw_ = function(param){caml_call1(af$11, 0); return 0;}; + return [0, + function(param){caml_call1(fa$11, 0); return 0;}, + _dw_, + ed$11, + de$11]; + case 13: + var + rest$12 = param[1], + match$13 = fmtty_rel_det(rest$12), + de$12 = match$13[4], + ed$12 = match$13[3], + af$12 = match$13[2], + fa$12 = match$13[1], + _dx_ = function(param){caml_call1(de$12, 0); return 0;}, + _dy_ = function(param){caml_call1(ed$12, 0); return 0;}, + _dz_ = function(param){caml_call1(af$12, 0); return 0;}; + return [0, + function(param){caml_call1(fa$12, 0); return 0;}, + _dz_, + _dy_, + _dx_]; + default: + var + rest$13 = param[1], + match$14 = fmtty_rel_det(rest$13), + de$13 = match$14[4], + ed$13 = match$14[3], + af$13 = match$14[2], + fa$13 = match$14[1], + _dA_ = function(param){caml_call1(de$13, 0); return 0;}, + _dB_ = function(param){caml_call1(ed$13, 0); return 0;}, + _dC_ = function(param){caml_call1(af$13, 0); return 0;}; + return [0, + function(param){caml_call1(fa$13, 0); return 0;}, + _dC_, + _dB_, + _dA_]; + } + function _df_(param){return 0;} + function _dg_(param){return 0;} + function _dh_(param){return 0;} + return [0, function(param){return 0;}, _dh_, _dg_, _df_]; + } + function trans(ty1, ty2){ + var switch$0 = 0; + if(typeof ty1 === "number"){ + if(typeof ty2 === "number") return 0; + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + } + else + switch(ty1[0]){ + case 0: + var rest1 = ty1[1], switch$1 = 0; + if(typeof ty2 === "number") + switch$1 = 1; + else + switch(ty2[0]){ + case 0: + var rest2 = ty2[1]; return [0, trans(rest1, rest2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$1 = 1; + } + if(switch$1) switch$0 = 7; + break; + case 1: + var rest1$0 = ty1[1], switch$2 = 0; + if(typeof ty2 === "number") + switch$2 = 1; + else + switch(ty2[0]){ + case 1: + var rest2$0 = ty2[1]; return [1, trans(rest1$0, rest2$0)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$2 = 1; + } + if(switch$2) switch$0 = 7; + break; + case 2: + var rest1$1 = ty1[1], switch$3 = 0; + if(typeof ty2 === "number") + switch$3 = 1; + else + switch(ty2[0]){ + case 2: + var rest2$1 = ty2[1]; return [2, trans(rest1$1, rest2$1)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$3 = 1; + } + if(switch$3) switch$0 = 7; + break; + case 3: + var rest1$2 = ty1[1], switch$4 = 0; + if(typeof ty2 === "number") + switch$4 = 1; + else + switch(ty2[0]){ + case 3: + var rest2$2 = ty2[1]; return [3, trans(rest1$2, rest2$2)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$4 = 1; + } + if(switch$4) switch$0 = 7; + break; + case 4: + var rest1$3 = ty1[1], switch$5 = 0; + if(typeof ty2 === "number") + switch$5 = 1; + else + switch(ty2[0]){ + case 4: + var rest2$3 = ty2[1]; return [4, trans(rest1$3, rest2$3)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$5 = 1; + } + if(switch$5) switch$0 = 7; + break; + case 5: + var rest1$4 = ty1[1], switch$6 = 0; + if(typeof ty2 === "number") + switch$6 = 1; + else + switch(ty2[0]){ + case 5: + var rest2$4 = ty2[1]; return [5, trans(rest1$4, rest2$4)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$6 = 1; + } + if(switch$6) switch$0 = 7; + break; + case 6: + var rest1$5 = ty1[1], switch$7 = 0; + if(typeof ty2 === "number") + switch$7 = 1; + else + switch(ty2[0]){ + case 6: + var rest2$5 = ty2[1]; return [6, trans(rest1$5, rest2$5)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$7 = 1; + } + if(switch$7) switch$0 = 7; + break; + case 7: + var rest1$6 = ty1[1], switch$8 = 0; + if(typeof ty2 === "number") + switch$8 = 1; + else + switch(ty2[0]){ + case 7: + var rest2$6 = ty2[1]; return [7, trans(rest1$6, rest2$6)]; + case 8: + switch$0 = 5; break; + case 9: + switch$0 = 6; break; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$8 = 1; + } + if(switch$8) switch$0 = 7; + break; + case 8: + var rest1$7 = ty1[2], ty1$0 = ty1[1], switch$9 = 0; + if(typeof ty2 === "number") + switch$9 = 1; + else + switch(ty2[0]){ + case 8: + var + rest2$7 = ty2[2], + ty2$0 = ty2[1], + _de_ = trans(rest1$7, rest2$7); + return [8, trans(ty1$0, ty2$0), _de_]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$9 = 1; + } + if(switch$9) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + break; + case 9: + var rest1$8 = ty1[3], ty12 = ty1[2], ty11 = ty1[1], switch$10 = 0; + if(typeof ty2 === "number") + switch$10 = 1; + else + switch(ty2[0]){ + case 8: + switch$0 = 5; break; + case 9: + var + rest2$8 = ty2[3], + ty22 = ty2[2], + ty21 = ty2[1], + ty = trans(symm(ty12), ty21), + match = fmtty_rel_det(ty), + f4 = match[4], + f2 = match[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + return [9, ty11, ty22, trans(rest1$8, rest2$8)]; + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + switch$0 = 4; break; + default: switch$10 = 1; + } + if(switch$10) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + break; + case 10: + var rest1$9 = ty1[1]; + if(typeof ty2 !== "number" && 10 === ty2[0]){ + var rest2$9 = ty2[1]; + return [10, trans(rest1$9, rest2$9)]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + case 11: + var rest1$10 = ty1[1], switch$11 = 0; + if(typeof ty2 === "number") + switch$11 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + var rest2$10 = ty2[1]; return [11, trans(rest1$10, rest2$10)]; + default: switch$11 = 1; + } + if(switch$11) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + break; + case 12: + var rest1$11 = ty1[1], switch$12 = 0; + if(typeof ty2 === "number") + switch$12 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + var rest2$11 = ty2[1]; return [12, trans(rest1$11, rest2$11)]; + default: switch$12 = 1; + } + if(switch$12) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + break; + case 13: + var rest1$12 = ty1[1], switch$13 = 0; + if(typeof ty2 === "number") + switch$13 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + var rest2$12 = ty2[1]; return [13, trans(rest1$12, rest2$12)]; + default: switch$13 = 1; + } + if(switch$13) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + break; + default: + var rest1$13 = ty1[1], switch$14 = 0; + if(typeof ty2 === "number") + switch$14 = 1; + else + switch(ty2[0]){ + case 10: break; + case 11: + switch$0 = 1; break; + case 12: + switch$0 = 2; break; + case 13: + switch$0 = 3; break; + case 14: + var rest2$13 = ty2[1]; return [14, trans(rest1$13, rest2$13)]; + default: switch$14 = 1; + } + if(switch$14) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + } + switch(switch$0){ + case 0: + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + case 1: + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + case 3: + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + case 4: + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + case 5: + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + case 6: + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + default: throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function fmtty_of_padding_fmtty(pad, fmtty){ + return typeof pad === "number" ? fmtty : 0 === pad[0] ? fmtty : [2, fmtty]; + } + function fmtty_of_custom(arity, fmtty){ + if(! arity) return fmtty; + var arity$0 = arity[1]; + return [12, fmtty_of_custom(arity$0, fmtty)]; + } + function fmtty_of_fmt(fmtty){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 === "number") return 0; + switch(fmtty$0[0]){ + case 0: + var rest = fmtty$0[1]; return [0, fmtty_of_fmt(rest)]; + case 1: + var rest$0 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$0)]; + case 2: + var rest$1 = fmtty$0[2], pad = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad, [1, fmtty_of_fmt(rest$1)]); + case 3: + var rest$2 = fmtty$0[2], pad$0 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$0, [1, fmtty_of_fmt(rest$2)]); + case 4: + var + rest$3 = fmtty$0[4], + prec = fmtty$0[3], + pad$1 = fmtty$0[2], + ty_rest = fmtty_of_fmt(rest$3), + prec_ty = fmtty_of_precision_fmtty(prec, [2, ty_rest]); + return fmtty_of_padding_fmtty(pad$1, prec_ty); + case 5: + var + rest$4 = fmtty$0[4], + prec$0 = fmtty$0[3], + pad$2 = fmtty$0[2], + ty_rest$0 = fmtty_of_fmt(rest$4), + prec_ty$0 = fmtty_of_precision_fmtty(prec$0, [3, ty_rest$0]); + return fmtty_of_padding_fmtty(pad$2, prec_ty$0); + case 6: + var + rest$5 = fmtty$0[4], + prec$1 = fmtty$0[3], + pad$3 = fmtty$0[2], + ty_rest$1 = fmtty_of_fmt(rest$5), + prec_ty$1 = fmtty_of_precision_fmtty(prec$1, [4, ty_rest$1]); + return fmtty_of_padding_fmtty(pad$3, prec_ty$1); + case 7: + var + rest$6 = fmtty$0[4], + prec$2 = fmtty$0[3], + pad$4 = fmtty$0[2], + ty_rest$2 = fmtty_of_fmt(rest$6), + prec_ty$2 = fmtty_of_precision_fmtty(prec$2, [5, ty_rest$2]); + return fmtty_of_padding_fmtty(pad$4, prec_ty$2); + case 8: + var + rest$7 = fmtty$0[4], + prec$3 = fmtty$0[3], + pad$5 = fmtty$0[2], + ty_rest$3 = fmtty_of_fmt(rest$7), + prec_ty$3 = fmtty_of_precision_fmtty(prec$3, [6, ty_rest$3]); + return fmtty_of_padding_fmtty(pad$5, prec_ty$3); + case 9: + var rest$8 = fmtty$0[2], pad$6 = fmtty$0[1]; + return fmtty_of_padding_fmtty(pad$6, [7, fmtty_of_fmt(rest$8)]); + case 10: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 11: + var fmtty$2 = fmtty$0[2], fmtty$0 = fmtty$2; continue; + case 12: + var fmtty$3 = fmtty$0[2], fmtty$0 = fmtty$3; continue; + case 13: + var rest$9 = fmtty$0[3], ty = fmtty$0[2]; + return [8, ty, fmtty_of_fmt(rest$9)]; + case 14: + var rest$10 = fmtty$0[3], ty$0 = fmtty$0[2]; + return [9, ty$0, ty$0, fmtty_of_fmt(rest$10)]; + case 15: + var rest$11 = fmtty$0[1]; return [10, fmtty_of_fmt(rest$11)]; + case 16: + var rest$12 = fmtty$0[1]; return [11, fmtty_of_fmt(rest$12)]; + case 17: + var fmtty$4 = fmtty$0[2], fmtty$0 = fmtty$4; continue; + case 18: + var + rest$13 = fmtty$0[2], + formatting_gen = fmtty$0[1], + _db_ = fmtty_of_fmt(rest$13); + if(0 === formatting_gen[0]) + var fmt = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt); + else + var fmt$0 = formatting_gen[1][1], _dc_ = fmtty_of_fmt(fmt$0); + return caml_call2(CamlinternalFormatBasics[1], _dc_, _db_); + case 19: + var rest$14 = fmtty$0[1]; return [13, fmtty_of_fmt(rest$14)]; + case 20: + var rest$15 = fmtty$0[3]; return [1, fmtty_of_fmt(rest$15)]; + case 21: + var rest$16 = fmtty$0[2]; return [2, fmtty_of_fmt(rest$16)]; + case 22: + var rest$17 = fmtty$0[1]; return [0, fmtty_of_fmt(rest$17)]; + case 23: + var fmtty$5 = fmtty$0[2], ign = fmtty$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + return [14, fmtty_of_fmt(fmtty$5)]; + default: var fmtty$0 = fmtty$5; continue; + } + switch(ign[0]){ + case 0: + var fmtty$0 = fmtty$5; continue; + case 1: + var fmtty$0 = fmtty$5; continue; + case 2: + var fmtty$0 = fmtty$5; continue; + case 3: + var fmtty$0 = fmtty$5; continue; + case 4: + var fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$0 = fmtty$5; continue; + case 6: + var fmtty$0 = fmtty$5; continue; + case 7: + var fmtty$0 = fmtty$5; continue; + case 8: + var fmtty$0 = fmtty$5; continue; + case 9: + var fmtty$6 = ign[2], _dd_ = fmtty_of_fmt(fmtty$5); + return caml_call2(CamlinternalFormatBasics[1], fmtty$6, _dd_); + case 10: + var fmtty$0 = fmtty$5; continue; + default: var fmtty$0 = fmtty$5; continue; + } + default: + var rest$18 = fmtty$0[3], arity = fmtty$0[1]; + return fmtty_of_custom(arity, fmtty_of_fmt(rest$18)); + } + } + } + function fmtty_of_precision_fmtty(prec, fmtty){ + return typeof prec === "number" ? prec ? [2, fmtty] : fmtty : fmtty; + } + var + Type_mismatch = + [248, cst_CamlinternalFormat_Type_mi, runtime.caml_fresh_oo_id(0)]; + function type_padding(pad, fmtty){ + if(typeof pad === "number") return [0, 0, fmtty]; + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + return [0, [0, padty, w], fmtty]; + } + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var rest = fmtty[1], padty$0 = pad[1]; + return [0, [1, padty$0], rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_padprec(pad, prec, fmtty){ + var match = type_padding(pad, fmtty); + if(typeof prec !== "number"){ + var rest$1 = match[2], pad$2 = match[1], p = prec[1]; + return [0, pad$2, [0, p], rest$1]; + } + if(! prec){ + var rest$0 = match[2], pad$1 = match[1]; + return [0, pad$1, 0, rest$0]; + } + var match$0 = match[2]; + if(typeof match$0 !== "number" && 2 === match$0[0]){ + var rest = match$0[1], pad$0 = match[1]; + return [0, pad$0, 1, rest]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_format(fmt, fmtty){ + var _da_ = type_format_gen(fmt, fmtty); + if(typeof _da_[2] !== "number") + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var fmt$0 = _da_[1]; + return fmt$0; + } + function type_ignored_param_one(ign, fmt, fmtty){ + var + match = type_format_gen(fmt, fmtty), + fmtty$0 = match[2], + fmt$0 = match[1]; + return [0, [23, ign, fmt$0], fmtty$0]; + } + function type_format_gen(fmt, fmtty0){ + if(typeof fmt === "number") return [0, 0, fmtty0]; + switch(fmt[0]){ + case 0: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest = fmtty0[1], + fmt_rest = fmt[1], + match = type_format_gen(fmt_rest, fmtty_rest), + fmtty = match[2], + fmt$0 = match[1]; + return [0, [0, fmt$0], fmtty]; + } + break; + case 1: + if(typeof fmtty0 !== "number" && 0 === fmtty0[0]){ + var + fmtty_rest$0 = fmtty0[1], + fmt_rest$0 = fmt[1], + match$0 = type_format_gen(fmt_rest$0, fmtty_rest$0), + fmtty$0 = match$0[2], + fmt$1 = match$0[1]; + return [0, [1, fmt$1], fmtty$0]; + } + break; + case 2: + var + fmt_rest$1 = fmt[2], + pad = fmt[1], + match$1 = type_padding(pad, fmtty0), + pad$0 = match$1[1], + match$2 = match$1[2]; + if(typeof match$2 !== "number" && 1 === match$2[0]){ + var + fmtty_rest$1 = match$2[1], + match$3 = type_format_gen(fmt_rest$1, fmtty_rest$1), + fmtty$1 = match$3[2], + fmt$2 = match$3[1]; + return [0, [2, pad$0, fmt$2], fmtty$1]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 3: + var + fmt_rest$2 = fmt[2], + pad$1 = fmt[1], + match$4 = type_padding(pad$1, fmtty0), + pad$2 = match$4[1], + match$5 = match$4[2]; + if(typeof match$5 !== "number" && 1 === match$5[0]){ + var + fmtty_rest$2 = match$5[1], + match$6 = type_format_gen(fmt_rest$2, fmtty_rest$2), + fmtty$2 = match$6[2], + fmt$3 = match$6[1]; + return [0, [3, pad$2, fmt$3], fmtty$2]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 4: + var + fmt_rest$3 = fmt[4], + prec = fmt[3], + pad$3 = fmt[2], + iconv = fmt[1], + match$7 = type_padprec(pad$3, prec, fmtty0), + pad$4 = match$7[1], + match$8 = match$7[3]; + if(typeof match$8 !== "number" && 2 === match$8[0]){ + var + fmtty_rest$3 = match$8[1], + prec$0 = match$7[2], + match$9 = type_format_gen(fmt_rest$3, fmtty_rest$3), + fmtty$3 = match$9[2], + fmt$4 = match$9[1]; + return [0, [4, iconv, pad$4, prec$0, fmt$4], fmtty$3]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 5: + var + fmt_rest$4 = fmt[4], + prec$1 = fmt[3], + pad$5 = fmt[2], + iconv$0 = fmt[1], + match$10 = type_padprec(pad$5, prec$1, fmtty0), + pad$6 = match$10[1], + match$11 = match$10[3]; + if(typeof match$11 !== "number" && 3 === match$11[0]){ + var + fmtty_rest$4 = match$11[1], + prec$2 = match$10[2], + match$12 = type_format_gen(fmt_rest$4, fmtty_rest$4), + fmtty$4 = match$12[2], + fmt$5 = match$12[1]; + return [0, [5, iconv$0, pad$6, prec$2, fmt$5], fmtty$4]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 6: + var + fmt_rest$5 = fmt[4], + prec$3 = fmt[3], + pad$7 = fmt[2], + iconv$1 = fmt[1], + match$13 = type_padprec(pad$7, prec$3, fmtty0), + pad$8 = match$13[1], + match$14 = match$13[3]; + if(typeof match$14 !== "number" && 4 === match$14[0]){ + var + fmtty_rest$5 = match$14[1], + prec$4 = match$13[2], + match$15 = type_format_gen(fmt_rest$5, fmtty_rest$5), + fmtty$5 = match$15[2], + fmt$6 = match$15[1]; + return [0, [6, iconv$1, pad$8, prec$4, fmt$6], fmtty$5]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 7: + var + fmt_rest$6 = fmt[4], + prec$5 = fmt[3], + pad$9 = fmt[2], + iconv$2 = fmt[1], + match$16 = type_padprec(pad$9, prec$5, fmtty0), + pad$10 = match$16[1], + match$17 = match$16[3]; + if(typeof match$17 !== "number" && 5 === match$17[0]){ + var + fmtty_rest$6 = match$17[1], + prec$6 = match$16[2], + match$18 = type_format_gen(fmt_rest$6, fmtty_rest$6), + fmtty$6 = match$18[2], + fmt$7 = match$18[1]; + return [0, [7, iconv$2, pad$10, prec$6, fmt$7], fmtty$6]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 8: + var + fmt_rest$7 = fmt[4], + prec$7 = fmt[3], + pad$11 = fmt[2], + fconv = fmt[1], + match$19 = type_padprec(pad$11, prec$7, fmtty0), + pad$12 = match$19[1], + match$20 = match$19[3]; + if(typeof match$20 !== "number" && 6 === match$20[0]){ + var + fmtty_rest$7 = match$20[1], + prec$8 = match$19[2], + match$21 = type_format_gen(fmt_rest$7, fmtty_rest$7), + fmtty$7 = match$21[2], + fmt$8 = match$21[1]; + return [0, [8, fconv, pad$12, prec$8, fmt$8], fmtty$7]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 9: + var + fmt_rest$8 = fmt[2], + pad$13 = fmt[1], + match$22 = type_padding(pad$13, fmtty0), + pad$14 = match$22[1], + match$23 = match$22[2]; + if(typeof match$23 !== "number" && 7 === match$23[0]){ + var + fmtty_rest$8 = match$23[1], + match$24 = type_format_gen(fmt_rest$8, fmtty_rest$8), + fmtty$8 = match$24[2], + fmt$9 = match$24[1]; + return [0, [9, pad$14, fmt$9], fmtty$8]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + case 10: + var + fmt_rest$9 = fmt[1], + match$25 = type_format_gen(fmt_rest$9, fmtty0), + fmtty$9 = match$25[2], + fmt$10 = match$25[1]; + return [0, [10, fmt$10], fmtty$9]; + case 11: + var + fmt_rest$10 = fmt[2], + str = fmt[1], + match$26 = type_format_gen(fmt_rest$10, fmtty0), + fmtty$10 = match$26[2], + fmt$11 = match$26[1]; + return [0, [11, str, fmt$11], fmtty$10]; + case 12: + var + fmt_rest$11 = fmt[2], + chr = fmt[1], + match$27 = type_format_gen(fmt_rest$11, fmtty0), + fmtty$11 = match$27[2], + fmt$12 = match$27[1]; + return [0, [12, chr, fmt$12], fmtty$11]; + case 13: + if(typeof fmtty0 !== "number" && 8 === fmtty0[0]){ + var + fmtty_rest$9 = fmtty0[2], + sub_fmtty = fmtty0[1], + fmt_rest$12 = fmt[3], + sub_fmtty$0 = fmt[2], + pad_opt = fmt[1]; + if(caml_notequal([0, sub_fmtty$0], [0, sub_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$28 = type_format_gen(fmt_rest$12, fmtty_rest$9), + fmtty$12 = match$28[2], + fmt$13 = match$28[1]; + return [0, [13, pad_opt, sub_fmtty, fmt$13], fmtty$12]; + } + break; + case 14: + if(typeof fmtty0 !== "number" && 9 === fmtty0[0]){ + var + fmtty_rest$10 = fmtty0[3], + sub_fmtty1 = fmtty0[1], + fmt_rest$13 = fmt[3], + sub_fmtty$1 = fmt[2], + pad_opt$0 = fmt[1], + _c__ = [0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub_fmtty$1)], _c__)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$29 = + type_format_gen + (fmt_rest$13, + caml_call1(CamlinternalFormatBasics[2], fmtty_rest$10)), + fmtty$13 = match$29[2], + fmt$14 = match$29[1]; + return [0, [14, pad_opt$0, sub_fmtty1, fmt$14], fmtty$13]; + } + break; + case 15: + if(typeof fmtty0 !== "number" && 10 === fmtty0[0]){ + var + fmtty_rest$11 = fmtty0[1], + fmt_rest$14 = fmt[1], + match$30 = type_format_gen(fmt_rest$14, fmtty_rest$11), + fmtty$14 = match$30[2], + fmt$15 = match$30[1]; + return [0, [15, fmt$15], fmtty$14]; + } + break; + case 16: + if(typeof fmtty0 !== "number" && 11 === fmtty0[0]){ + var + fmtty_rest$12 = fmtty0[1], + fmt_rest$15 = fmt[1], + match$31 = type_format_gen(fmt_rest$15, fmtty_rest$12), + fmtty$15 = match$31[2], + fmt$16 = match$31[1]; + return [0, [16, fmt$16], fmtty$15]; + } + break; + case 17: + var + fmt_rest$16 = fmt[2], + formatting_lit = fmt[1], + match$32 = type_format_gen(fmt_rest$16, fmtty0), + fmtty$16 = match$32[2], + fmt$17 = match$32[1]; + return [0, [17, formatting_lit, fmt$17], fmtty$16]; + case 18: + var fmt_rest$17 = fmt[2], formatting_gen = fmt[1]; + if(0 === formatting_gen[0]){ + var + match$36 = formatting_gen[1], + str$0 = match$36[2], + fmt1 = match$36[1], + match$37 = type_format_gen(fmt1, fmtty0), + fmtty2 = match$37[2], + fmt2 = match$37[1], + match$38 = type_format_gen(fmt_rest$17, fmtty2), + fmtty3 = match$38[2], + fmt3 = match$38[1]; + return [0, [18, [0, [0, fmt2, str$0]], fmt3], fmtty3]; + } + var + match$39 = formatting_gen[1], + str$1 = match$39[2], + fmt1$0 = match$39[1], + match$40 = type_format_gen(fmt1$0, fmtty0), + fmtty2$0 = match$40[2], + fmt2$0 = match$40[1], + match$41 = type_format_gen(fmt_rest$17, fmtty2$0), + fmtty3$0 = match$41[2], + fmt3$0 = match$41[1]; + return [0, [18, [1, [0, fmt2$0, str$1]], fmt3$0], fmtty3$0]; + case 19: + if(typeof fmtty0 !== "number" && 13 === fmtty0[0]){ + var + fmtty_rest$13 = fmtty0[1], + fmt_rest$18 = fmt[1], + match$33 = type_format_gen(fmt_rest$18, fmtty_rest$13), + fmtty$17 = match$33[2], + fmt$18 = match$33[1]; + return [0, [19, fmt$18], fmtty$17]; + } + break; + case 20: + if(typeof fmtty0 !== "number" && 1 === fmtty0[0]){ + var + fmtty_rest$14 = fmtty0[1], + fmt_rest$19 = fmt[3], + char_set = fmt[2], + width_opt = fmt[1], + match$34 = type_format_gen(fmt_rest$19, fmtty_rest$14), + fmtty$18 = match$34[2], + fmt$19 = match$34[1]; + return [0, [20, width_opt, char_set, fmt$19], fmtty$18]; + } + break; + case 21: + if(typeof fmtty0 !== "number" && 2 === fmtty0[0]){ + var + fmtty_rest$15 = fmtty0[1], + fmt_rest$20 = fmt[2], + counter = fmt[1], + match$35 = type_format_gen(fmt_rest$20, fmtty_rest$15), + fmtty$19 = match$35[2], + fmt$20 = match$35[1]; + return [0, [21, counter, fmt$20], fmtty$19]; + } + break; + case 23: + var rest = fmt[2], ign = fmt[1]; + if(typeof ign !== "number") + switch(ign[0]){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + return type_ignored_param_one(ign, rest, fmtty0); + case 3: + return type_ignored_param_one(ign, rest, fmtty0); + case 4: + return type_ignored_param_one(ign, rest, fmtty0); + case 5: + return type_ignored_param_one(ign, rest, fmtty0); + case 6: + return type_ignored_param_one(ign, rest, fmtty0); + case 7: + return type_ignored_param_one(ign, rest, fmtty0); + case 8: + var sub_fmtty$2 = ign[2], pad_opt$1 = ign[1]; + return type_ignored_param_one + ([8, pad_opt$1, sub_fmtty$2], rest, fmtty0); + case 9: + var + sub_fmtty$3 = ign[2], + pad_opt$2 = ign[1], + _c$_ = type_ignored_format_substituti(sub_fmtty$3, rest, fmtty0), + match$43 = _c$_[2], + fmtty$21 = match$43[2], + fmt$22 = match$43[1], + sub_fmtty$4 = _c$_[1]; + return [0, [23, [9, pad_opt$2, sub_fmtty$4], fmt$22], fmtty$21]; + case 10: + return type_ignored_param_one(ign, rest, fmtty0); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + switch(ign){ + case 0: + return type_ignored_param_one(ign, rest, fmtty0); + case 1: + return type_ignored_param_one(ign, rest, fmtty0); + case 2: + if(typeof fmtty0 !== "number" && 14 === fmtty0[0]){ + var + fmtty_rest$16 = fmtty0[1], + match$42 = type_format_gen(rest, fmtty_rest$16), + fmtty$20 = match$42[2], + fmt$21 = match$42[1]; + return [0, [23, 2, fmt$21], fmtty$20]; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + default: return type_ignored_param_one(ign, rest, fmtty0); + } + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function type_ignored_format_substituti(sub_fmtty, fmt, fmtty){ + if(typeof sub_fmtty === "number") + return [0, 0, type_format_gen(fmt, fmtty)]; + switch(sub_fmtty[0]){ + case 0: + if(typeof fmtty !== "number" && 0 === fmtty[0]){ + var + fmtty_rest = fmtty[1], + sub_fmtty_rest = sub_fmtty[1], + match = + type_ignored_format_substituti(sub_fmtty_rest, fmt, fmtty_rest), + fmt$0 = match[2], + sub_fmtty_rest$0 = match[1]; + return [0, [0, sub_fmtty_rest$0], fmt$0]; + } + break; + case 1: + if(typeof fmtty !== "number" && 1 === fmtty[0]){ + var + fmtty_rest$0 = fmtty[1], + sub_fmtty_rest$1 = sub_fmtty[1], + match$0 = + type_ignored_format_substituti(sub_fmtty_rest$1, fmt, fmtty_rest$0), + fmt$1 = match$0[2], + sub_fmtty_rest$2 = match$0[1]; + return [0, [1, sub_fmtty_rest$2], fmt$1]; + } + break; + case 2: + if(typeof fmtty !== "number" && 2 === fmtty[0]){ + var + fmtty_rest$1 = fmtty[1], + sub_fmtty_rest$3 = sub_fmtty[1], + match$1 = + type_ignored_format_substituti(sub_fmtty_rest$3, fmt, fmtty_rest$1), + fmt$2 = match$1[2], + sub_fmtty_rest$4 = match$1[1]; + return [0, [2, sub_fmtty_rest$4], fmt$2]; + } + break; + case 3: + if(typeof fmtty !== "number" && 3 === fmtty[0]){ + var + fmtty_rest$2 = fmtty[1], + sub_fmtty_rest$5 = sub_fmtty[1], + match$2 = + type_ignored_format_substituti(sub_fmtty_rest$5, fmt, fmtty_rest$2), + fmt$3 = match$2[2], + sub_fmtty_rest$6 = match$2[1]; + return [0, [3, sub_fmtty_rest$6], fmt$3]; + } + break; + case 4: + if(typeof fmtty !== "number" && 4 === fmtty[0]){ + var + fmtty_rest$3 = fmtty[1], + sub_fmtty_rest$7 = sub_fmtty[1], + match$3 = + type_ignored_format_substituti(sub_fmtty_rest$7, fmt, fmtty_rest$3), + fmt$4 = match$3[2], + sub_fmtty_rest$8 = match$3[1]; + return [0, [4, sub_fmtty_rest$8], fmt$4]; + } + break; + case 5: + if(typeof fmtty !== "number" && 5 === fmtty[0]){ + var + fmtty_rest$4 = fmtty[1], + sub_fmtty_rest$9 = sub_fmtty[1], + match$4 = + type_ignored_format_substituti(sub_fmtty_rest$9, fmt, fmtty_rest$4), + fmt$5 = match$4[2], + sub_fmtty_rest$10 = match$4[1]; + return [0, [5, sub_fmtty_rest$10], fmt$5]; + } + break; + case 6: + if(typeof fmtty !== "number" && 6 === fmtty[0]){ + var + fmtty_rest$5 = fmtty[1], + sub_fmtty_rest$11 = sub_fmtty[1], + match$5 = + type_ignored_format_substituti + (sub_fmtty_rest$11, fmt, fmtty_rest$5), + fmt$6 = match$5[2], + sub_fmtty_rest$12 = match$5[1]; + return [0, [6, sub_fmtty_rest$12], fmt$6]; + } + break; + case 7: + if(typeof fmtty !== "number" && 7 === fmtty[0]){ + var + fmtty_rest$6 = fmtty[1], + sub_fmtty_rest$13 = sub_fmtty[1], + match$6 = + type_ignored_format_substituti + (sub_fmtty_rest$13, fmt, fmtty_rest$6), + fmt$7 = match$6[2], + sub_fmtty_rest$14 = match$6[1]; + return [0, [7, sub_fmtty_rest$14], fmt$7]; + } + break; + case 8: + if(typeof fmtty !== "number" && 8 === fmtty[0]){ + var + fmtty_rest$7 = fmtty[2], + sub2_fmtty = fmtty[1], + sub_fmtty_rest$15 = sub_fmtty[2], + sub2_fmtty$0 = sub_fmtty[1]; + if(caml_notequal([0, sub2_fmtty$0], [0, sub2_fmtty])) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + match$7 = + type_ignored_format_substituti + (sub_fmtty_rest$15, fmt, fmtty_rest$7), + fmt$8 = match$7[2], + sub_fmtty_rest$16 = match$7[1]; + return [0, [8, sub2_fmtty, sub_fmtty_rest$16], fmt$8]; + } + break; + case 9: + if(typeof fmtty !== "number" && 9 === fmtty[0]){ + var + fmtty_rest$8 = fmtty[3], + sub2_fmtty$1 = fmtty[2], + sub1_fmtty = fmtty[1], + sub_fmtty_rest$17 = sub_fmtty[3], + sub2_fmtty$2 = sub_fmtty[2], + sub1_fmtty$0 = sub_fmtty[1], + _c8_ = [0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub1_fmtty$0)], _c8_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var _c9_ = [0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$1)]; + if + (caml_notequal + ([0, caml_call1(CamlinternalFormatBasics[2], sub2_fmtty$2)], _c9_)) + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + var + sub_fmtty$0 = trans(symm(sub1_fmtty), sub2_fmtty$1), + match$8 = fmtty_rel_det(sub_fmtty$0), + f4 = match$8[4], + f2 = match$8[2]; + caml_call1(f2, 0); + caml_call1(f4, 0); + var + match$9 = + type_ignored_format_substituti + (caml_call1(CamlinternalFormatBasics[2], sub_fmtty_rest$17), + fmt, + fmtty_rest$8), + fmt$9 = match$9[2], + sub_fmtty_rest$18 = match$9[1]; + return [0, + [9, sub1_fmtty, sub2_fmtty$1, symm(sub_fmtty_rest$18)], + fmt$9]; + } + break; + case 10: + if(typeof fmtty !== "number" && 10 === fmtty[0]){ + var + fmtty_rest$9 = fmtty[1], + sub_fmtty_rest$19 = sub_fmtty[1], + match$10 = + type_ignored_format_substituti + (sub_fmtty_rest$19, fmt, fmtty_rest$9), + fmt$10 = match$10[2], + sub_fmtty_rest$20 = match$10[1]; + return [0, [10, sub_fmtty_rest$20], fmt$10]; + } + break; + case 11: + if(typeof fmtty !== "number" && 11 === fmtty[0]){ + var + fmtty_rest$10 = fmtty[1], + sub_fmtty_rest$21 = sub_fmtty[1], + match$11 = + type_ignored_format_substituti + (sub_fmtty_rest$21, fmt, fmtty_rest$10), + fmt$11 = match$11[2], + sub_fmtty_rest$22 = match$11[1]; + return [0, [11, sub_fmtty_rest$22], fmt$11]; + } + break; + case 13: + if(typeof fmtty !== "number" && 13 === fmtty[0]){ + var + fmtty_rest$11 = fmtty[1], + sub_fmtty_rest$23 = sub_fmtty[1], + match$12 = + type_ignored_format_substituti + (sub_fmtty_rest$23, fmt, fmtty_rest$11), + fmt$12 = match$12[2], + sub_fmtty_rest$24 = match$12[1]; + return [0, [13, sub_fmtty_rest$24], fmt$12]; + } + break; + case 14: + if(typeof fmtty !== "number" && 14 === fmtty[0]){ + var + fmtty_rest$12 = fmtty[1], + sub_fmtty_rest$25 = sub_fmtty[1], + match$13 = + type_ignored_format_substituti + (sub_fmtty_rest$25, fmt, fmtty_rest$12), + fmt$13 = match$13[2], + sub_fmtty_rest$26 = match$13[1]; + return [0, [14, sub_fmtty_rest$26], fmt$13]; + } + break; + } + throw caml_maybe_attach_backtrace(Type_mismatch, 1); + } + function recast(fmt, fmtty){ + var _c7_ = symm(fmtty); + return type_format(fmt, caml_call1(CamlinternalFormatBasics[2], _c7_)); + } + function fix_padding(padty, width, str){ + var + len = caml_ml_string_length(str), + padty$0 = 0 <= width ? padty : 0, + width$0 = caml_call1(Stdlib[18], width); + if(width$0 <= len) return str; + var + _c6_ = 2 === padty$0 ? 48 : 32, + res = caml_call2(Stdlib_Bytes[1], width$0, _c6_); + switch(padty$0){ + case 0: + caml_call5(Stdlib_String[48], str, 0, res, 0, len); break; + case 1: + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + break; + default: + var switch$0 = 0; + if(0 < len){ + var switch$1 = 0; + if + (43 !== caml_string_get(str, 0) + && 45 !== caml_string_get(str, 0) && 32 !== caml_string_get(str, 0)){switch$0 = 1; switch$1 = 1;} + if(! switch$1){ + caml_bytes_set(res, 0, caml_string_get(str, 0)); + caml_call5 + (Stdlib_String[48], + str, + 1, + res, + (width$0 - len | 0) + 1 | 0, + len - 1 | 0); + } + } + else + switch$0 = 1; + if(switch$0){ + var switch$2 = 0; + if(1 < len && 48 === caml_string_get(str, 0)){ + var switch$3 = 0; + if(120 === caml_string_get(str, 1) || 88 === caml_string_get(str, 1)) + switch$3 = 1; + if(switch$3){ + caml_bytes_set(res, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res, + (width$0 - len | 0) + 2 | 0, + len - 2 | 0); + switch$2 = 1; + } + } + if(! switch$2) + caml_call5(Stdlib_String[48], str, 0, res, width$0 - len | 0, len); + } + } + return caml_call1(Stdlib_Bytes[44], res); + } + function fix_int_precision(prec, str){ + var + prec$0 = caml_call1(Stdlib[18], prec), + len = caml_ml_string_length(str), + c = caml_string_get(str, 0), + switch$0 = 0; + if(58 <= c){ + if(71 <= c){ + if(5 >= c - 97 >>> 0) switch$0 = 1; + } + else if(65 <= c) switch$0 = 1; + } + else{ + var switch$1 = 0; + if(32 === c) + switch$1 = 1; + else if(43 <= c) + switch(c - 43 | 0){ + case 5: + if(len < (prec$0 + 2 | 0) && 1 < len){ + var switch$2 = 0; + if + (120 !== caml_string_get(str, 1) && 88 !== caml_string_get(str, 1)) + switch$2 = 1; + if(! switch$2){ + var res$1 = caml_call2(Stdlib_Bytes[1], prec$0 + 2 | 0, 48); + caml_bytes_set(res$1, 1, caml_string_get(str, 1)); + caml_call5 + (Stdlib_String[48], + str, + 2, + res$1, + (prec$0 - len | 0) + 4 | 0, + len - 2 | 0); + return caml_call1(Stdlib_Bytes[44], res$1); + } + } + switch$0 = 1; + break; + case 0: + case 2: + switch$1 = 1; break; + case 1: + case 3: + case 4: break; + default: switch$0 = 1; + } + if(switch$1 && len < (prec$0 + 1 | 0)){ + var res$0 = caml_call2(Stdlib_Bytes[1], prec$0 + 1 | 0, 48); + caml_bytes_set(res$0, 0, c); + caml_call5 + (Stdlib_String[48], + str, + 1, + res$0, + (prec$0 - len | 0) + 2 | 0, + len - 1 | 0); + return caml_call1(Stdlib_Bytes[44], res$0); + } + } + if(switch$0 && len < prec$0){ + var res = caml_call2(Stdlib_Bytes[1], prec$0, 48); + caml_call5(Stdlib_String[48], str, 0, res, prec$0 - len | 0, len); + return caml_call1(Stdlib_Bytes[44], res); + } + return str; + } + function string_to_caml_string(str){ + var + str$0 = caml_call1(Stdlib_String[24], str), + l = caml_ml_string_length(str$0), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 34); + caml_blit_string(str$0, 0, res, 1, l); + return caml_call1(Stdlib_Bytes[44], res); + } + function format_of_fconv(fconv, prec){ + var + prec$0 = caml_call1(Stdlib[18], prec), + symb = char_of_fconv(_r_, fconv), + buf = buffer_create(16); + buffer_add_char(buf, 37); + bprint_fconv_flag(buf, fconv); + buffer_add_char(buf, 46); + buffer_add_string(buf, caml_call1(Stdlib_Int[12], prec$0)); + buffer_add_char(buf, symb); + return buffer_contents(buf); + } + function transform_int_alt(iconv, s){ + if(13 > iconv) return s; + var n = [0, 0], _c1_ = caml_ml_string_length(s) - 1 | 0, _c0_ = 0; + if(_c1_ >= 0){ + var i$0 = _c0_; + for(;;){ + if(9 >= caml_string_unsafe_get(s, i$0) - 48 >>> 0) n[1]++; + var _c5_ = i$0 + 1 | 0; + if(_c1_ !== i$0){var i$0 = _c5_; continue;} + break; + } + } + var + digits = n[1], + buf = + caml_create_bytes + (caml_ml_string_length(s) + ((digits - 1 | 0) / 3 | 0) | 0), + pos = [0, 0]; + function put(c){caml_bytes_set(buf, pos[1], c); pos[1]++; return 0;} + var + left = [0, ((digits - 1 | 0) % 3 | 0) + 1 | 0], + _c3_ = caml_ml_string_length(s) - 1 | 0, + _c2_ = 0; + if(_c3_ >= 0){ + var i = _c2_; + for(;;){ + var c = caml_string_unsafe_get(s, i); + if(9 < c - 48 >>> 0) + put(c); + else{if(0 === left[1]){put(95); left[1] = 3;} left[1] += -1; put(c);} + var _c4_ = i + 1 | 0; + if(_c3_ !== i){var i = _c4_; continue;} + break; + } + } + return caml_call1(Stdlib_Bytes[44], buf); + } + function convert_int(iconv, n){ + switch(iconv){ + case 1: + var _cZ_ = cst_d$0; break; + case 2: + var _cZ_ = cst_d$1; break; + case 4: + var _cZ_ = cst_i$1; break; + case 5: + var _cZ_ = cst_i$2; break; + case 6: + var _cZ_ = cst_x; break; + case 7: + var _cZ_ = cst_x$0; break; + case 8: + var _cZ_ = cst_X; break; + case 9: + var _cZ_ = cst_X$0; break; + case 10: + var _cZ_ = cst_o; break; + case 11: + var _cZ_ = cst_o$0; break; + case 0: + case 13: + var _cZ_ = cst_d; break; + case 3: + case 14: + var _cZ_ = cst_i$0; break; + default: var _cZ_ = cst_u; + } + return transform_int_alt(iconv, caml_format_int(_cZ_, n)); + } + function convert_int32(iconv, n){ + switch(iconv){ + case 1: + var _cY_ = cst_ld$0; break; + case 2: + var _cY_ = cst_ld$1; break; + case 4: + var _cY_ = cst_li$1; break; + case 5: + var _cY_ = cst_li$2; break; + case 6: + var _cY_ = cst_lx; break; + case 7: + var _cY_ = cst_lx$0; break; + case 8: + var _cY_ = cst_lX; break; + case 9: + var _cY_ = cst_lX$0; break; + case 10: + var _cY_ = cst_lo; break; + case 11: + var _cY_ = cst_lo$0; break; + case 0: + case 13: + var _cY_ = cst_ld; break; + case 3: + case 14: + var _cY_ = cst_li$0; break; + default: var _cY_ = cst_lu; + } + return transform_int_alt(iconv, caml_format_int(_cY_, n)); + } + function convert_nativeint(iconv, n){ + switch(iconv){ + case 1: + var _cX_ = cst_nd$0; break; + case 2: + var _cX_ = cst_nd$1; break; + case 4: + var _cX_ = cst_ni$1; break; + case 5: + var _cX_ = cst_ni$2; break; + case 6: + var _cX_ = cst_nx; break; + case 7: + var _cX_ = cst_nx$0; break; + case 8: + var _cX_ = cst_nX; break; + case 9: + var _cX_ = cst_nX$0; break; + case 10: + var _cX_ = cst_no; break; + case 11: + var _cX_ = cst_no$0; break; + case 0: + case 13: + var _cX_ = cst_nd; break; + case 3: + case 14: + var _cX_ = cst_ni$0; break; + default: var _cX_ = cst_nu; + } + return transform_int_alt(iconv, caml_format_int(_cX_, n)); + } + function convert_int64(iconv, n){ + switch(iconv){ + case 1: + var _cW_ = cst_Ld$0; break; + case 2: + var _cW_ = cst_Ld$1; break; + case 4: + var _cW_ = cst_Li$1; break; + case 5: + var _cW_ = cst_Li$2; break; + case 6: + var _cW_ = cst_Lx; break; + case 7: + var _cW_ = cst_Lx$0; break; + case 8: + var _cW_ = cst_LX; break; + case 9: + var _cW_ = cst_LX$0; break; + case 10: + var _cW_ = cst_Lo; break; + case 11: + var _cW_ = cst_Lo$0; break; + case 0: + case 13: + var _cW_ = cst_Ld; break; + case 3: + case 14: + var _cW_ = cst_Li$0; break; + default: var _cW_ = cst_Lu; + } + return transform_int_alt(iconv, runtime.caml_int64_format(_cW_, n)); + } + function convert_float(fconv, prec, x){ + function hex(param){ + switch(fconv[1]){ + case 0: + var sign = 45; break; + case 1: + var sign = 43; break; + default: var sign = 32; + } + return runtime.caml_hexstring_of_float(x, prec, sign); + } + function caml_special_val(str){ + var match = runtime.caml_classify_float(x); + return 3 === match + ? x < 0. ? cst_neg_infinity : cst_infinity + : 4 <= match ? cst_nan : str; + } + switch(fconv[2]){ + case 5: + var + str = caml_format_float(format_of_fconv(fconv, prec), x), + len = caml_ml_string_length(str), + i = 0; + for(;;){ + if(i === len) + var _cT_ = 0; + else{ + var _cS_ = caml_string_get(str, i) - 46 | 0, switch$0 = 0; + if(23 < _cS_ >>> 0){ + if(55 === _cS_) switch$0 = 1; + } + else if(21 < _cS_ - 1 >>> 0) switch$0 = 1; + if(! switch$0){var i$0 = i + 1 | 0, i = i$0; continue;} + var _cT_ = 1; + } + var _cU_ = _cT_ ? str : caml_call2(Stdlib[28], str, cst$17); + return caml_special_val(_cU_); + } + case 6: + return hex(0); + case 7: + var _cV_ = hex(0); return caml_call1(Stdlib_String[25], _cV_); + case 8: + return caml_special_val(hex(0)); + default: return caml_format_float(format_of_fconv(fconv, prec), x); + } + } + function string_of_fmtty(fmtty){ + var buf = buffer_create(16); + bprint_fmtty(buf, fmtty); + return buffer_contents(buf); + } + function make_int_padding_precision(k, acc, fmt, pad, prec, trans, iconv){ + if(typeof pad === "number"){ + if(typeof prec === "number") + return prec + ? function + (p, x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = caml_call2(trans, iconv, x); + return make_printf(k, [4, acc, str], fmt); + }; + var p = prec[1]; + return function(x){ + var str = fix_int_precision(p, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt);}; + } + if(0 === pad[0]){ + var w = pad[2], padty = pad[1]; + if(typeof prec === "number") + return prec + ? function + (p, x){ + var + str = + fix_padding + (padty, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (x){ + var str = fix_padding(padty, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$0 = prec[1]; + return function(x){ + var + str = + fix_padding + (padty, w, fix_int_precision(p$0, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + var padty$0 = pad[1]; + if(typeof prec === "number") + return prec + ? function + (w, p, x){ + var + str = + fix_padding + (padty$0, + w, + fix_int_precision(p, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt); + } + : function + (w, x){ + var str = fix_padding(padty$0, w, caml_call2(trans, iconv, x)); + return make_printf(k, [4, acc, str], fmt); + }; + var p$1 = prec[1]; + return function(w, x){ + var + str = + fix_padding + (padty$0, w, fix_int_precision(p$1, caml_call2(trans, iconv, x))); + return make_printf(k, [4, acc, str], fmt);}; + } + function make_padding(k, acc, fmt, pad, trans){ + if(typeof pad === "number") + return function(x){ + var new_acc = [4, acc, caml_call1(trans, x)]; + return make_printf(k, new_acc, fmt);}; + if(0 === pad[0]){ + var width = pad[2], padty = pad[1]; + return function(x){ + var new_acc = [4, acc, fix_padding(padty, width, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + var padty$0 = pad[1]; + return function(w, x){ + var new_acc = [4, acc, fix_padding(padty$0, w, caml_call1(trans, x))]; + return make_printf(k, new_acc, fmt);}; + } + function make_printf$0(counter, k, acc, fmt){ + var k$0 = k, acc$0 = acc, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, acc$0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest);}; + case 1: + var rest$0 = fmt$0[1]; + return function(c){ + var + str = caml_call1(Stdlib_Char[2], c), + l = caml_ml_string_length(str), + res = caml_call2(Stdlib_Bytes[1], l + 2 | 0, 39); + caml_blit_string(str, 0, res, 1, l); + var new_acc = [4, acc$0, caml_call1(Stdlib_Bytes[44], res)]; + return make_printf(k$0, new_acc, rest$0);}; + case 2: + var rest$1 = fmt$0[2], pad = fmt$0[1]; + return make_padding + (k$0, acc$0, rest$1, pad, function(str){return str;}); + case 3: + var rest$2 = fmt$0[2], pad$0 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$2, pad$0, string_to_caml_string); + case 4: + var + rest$3 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$3, pad$1, prec, convert_int, iconv); + case 5: + var + rest$4 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$4, pad$2, prec$0, convert_int32, iconv$0); + case 6: + var + rest$5 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1]; + return make_int_padding_precision + (k$0, + acc$0, + rest$5, + pad$3, + prec$1, + convert_nativeint, + iconv$1); + case 7: + var + rest$6 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1]; + return make_int_padding_precision + (k$0, acc$0, rest$6, pad$4, prec$2, convert_int64, iconv$2); + case 8: + var + rest$7 = fmt$0[4], + prec$3 = fmt$0[3], + pad$5 = fmt$0[2], + fconv = fmt$0[1]; + if(typeof pad$5 === "number"){ + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x); + return make_printf(k$0, [4, acc$0, str], rest$7); + }; + var p = prec$3[1]; + return function(x){ + var str = convert_float(fconv, p, x); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + if(0 === pad$5[0]){ + var w = pad$5[2], padty = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (p, x){ + var str = fix_padding(padty, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$0 = prec$3[1]; + return function(x){ + var str = fix_padding(padty, w, convert_float(fconv, p$0, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + } + var padty$0 = pad$5[1]; + if(typeof prec$3 === "number") + return prec$3 + ? function + (w, p, x){ + var + str = fix_padding(padty$0, w, convert_float(fconv, p, x)); + return make_printf(k$0, [4, acc$0, str], rest$7); + } + : function + (w, x){ + var + str = + convert_float(fconv, default_float_precision(fconv), x), + str$0 = fix_padding(padty$0, w, str); + return make_printf(k$0, [4, acc$0, str$0], rest$7); + }; + var p$1 = prec$3[1]; + return function(w, x){ + var str = fix_padding(padty$0, w, convert_float(fconv, p$1, x)); + return make_printf(k$0, [4, acc$0, str], rest$7);}; + case 9: + var rest$8 = fmt$0[2], pad$6 = fmt$0[1]; + return make_padding(k$0, acc$0, rest$8, pad$6, Stdlib[30]); + case 10: + var + rest$9 = fmt$0[1], + acc$1 = [7, acc$0], + acc$0 = acc$1, + fmt$0 = rest$9; + continue; + case 11: + var + rest$10 = fmt$0[2], + str = fmt$0[1], + acc$2 = [2, acc$0, str], + acc$0 = acc$2, + fmt$0 = rest$10; + continue; + case 12: + var + rest$11 = fmt$0[2], + chr = fmt$0[1], + acc$3 = [3, acc$0, chr], + acc$0 = acc$3, + fmt$0 = rest$11; + continue; + case 13: + var + rest$12 = fmt$0[3], + sub_fmtty = fmt$0[2], + ty = string_of_fmtty(sub_fmtty); + return function(str){ + return make_printf(k$0, [4, acc$0, ty], rest$12);}; + case 14: + var rest$13 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _cR_ = recast(fmt, fmtty); + return make_printf + (k$0, + acc$0, + caml_call2(CamlinternalFormatBasics[3], _cR_, rest$13));}; + case 15: + var rest$14 = fmt$0[1]; + return function(f, x){ + return make_printf + (k$0, + [6, acc$0, function(o){return caml_call2(f, o, x);}], + rest$14);}; + case 16: + var rest$15 = fmt$0[1]; + return function(f){return make_printf(k$0, [6, acc$0, f], rest$15);}; + case 17: + var + rest$16 = fmt$0[2], + fmting_lit = fmt$0[1], + acc$4 = [0, acc$0, fmting_lit], + acc$0 = acc$4, + fmt$0 = rest$16; + continue; + case 18: + var _cP_ = fmt$0[1]; + if(0 === _cP_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _cP_[1][1], + k$3 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [0, kacc]], rest); + } + return k$0; + }, + k$1 = k$3(acc$0, k$0, rest$17), + k$0 = k$1, + acc$0 = 0, + fmt$0 = fmt$1; + continue; + } + var + rest$18 = fmt$0[2], + fmt$2 = _cP_[1][1], + k$4 = + function(acc, k, rest){ + function k$0(kacc){ + return make_printf(k, [1, acc, [1, kacc]], rest); + } + return k$0; + }, + k$2 = k$4(acc$0, k$0, rest$18), + k$0 = k$2, + acc$0 = 0, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + case 20: + var + rest$19 = fmt$0[3], + new_acc = [8, acc$0, cst_Printf_bad_conversion]; + return function(param){return make_printf(k$0, new_acc, rest$19);}; + case 21: + var rest$20 = fmt$0[2]; + return function(n){ + var new_acc = [4, acc$0, caml_format_int(cst_u$0, n)]; + return make_printf(k$0, new_acc, rest$20);}; + case 22: + var rest$21 = fmt$0[1]; + return function(c){ + var new_acc = [5, acc$0, c]; + return make_printf(k$0, new_acc, rest$21);}; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (make_ignored_param$0, [0, k$0, acc$0, ign, rest$22]); + var counter$1 = counter + 1 | 0; + return make_ignored_param$0(counter$1, k$0, acc$0, ign, rest$22); + default: + var + rest$23 = fmt$0[3], + f = fmt$0[2], + arity = fmt$0[1], + _cQ_ = caml_call1(f, 0); + if(counter >= 50) + return caml_trampoline_return + (make_custom$0, [0, k$0, acc$0, rest$23, arity, _cQ_]); + var counter$0 = counter + 1 | 0; + return make_custom$0(counter$0, k$0, acc$0, rest$23, arity, _cQ_); + } + } + } + function make_ignored_param$0(counter, k, acc, ign, fmt){ + if(typeof ign === "number") + switch(ign){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$1 = counter + 1 | 0; + return make_invalid_arg(counter$1, k, acc, fmt); + case 2: + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$2 = counter + 1 | 0; + return make_invalid_arg(counter$2, k, acc, fmt); + } + switch(ign[0]){ + case 0: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$3 = counter + 1 | 0; + return make_invalid_arg(counter$3, k, acc, fmt); + case 1: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$4 = counter + 1 | 0; + return make_invalid_arg(counter$4, k, acc, fmt); + case 2: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$5 = counter + 1 | 0; + return make_invalid_arg(counter$5, k, acc, fmt); + case 3: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$6 = counter + 1 | 0; + return make_invalid_arg(counter$6, k, acc, fmt); + case 4: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$7 = counter + 1 | 0; + return make_invalid_arg(counter$7, k, acc, fmt); + case 5: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$8 = counter + 1 | 0; + return make_invalid_arg(counter$8, k, acc, fmt); + case 6: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$9 = counter + 1 | 0; + return make_invalid_arg(counter$9, k, acc, fmt); + case 7: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$10 = counter + 1 | 0; + return make_invalid_arg(counter$10, k, acc, fmt); + case 8: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$11 = counter + 1 | 0; + return make_invalid_arg(counter$11, k, acc, fmt); + case 9: + var fmtty = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (make_from_fmtty$0, [0, k, acc, fmtty, fmt]); + var counter$14 = counter + 1 | 0; + return make_from_fmtty$0(counter$14, k, acc, fmtty, fmt); + case 10: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$12 = counter + 1 | 0; + return make_invalid_arg(counter$12, k, acc, fmt); + default: + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$13 = counter + 1 | 0; + return make_invalid_arg(counter$13, k, acc, fmt); + } + } + function make_from_fmtty$0(counter, k, acc, fmtty, fmt){ + if(typeof fmtty !== "number") + switch(fmtty[0]){ + case 0: + var rest = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest, fmt);}; + case 1: + var rest$0 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$0, fmt);}; + case 2: + var rest$1 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$1, fmt);}; + case 3: + var rest$2 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$2, fmt);}; + case 4: + var rest$3 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$3, fmt);}; + case 5: + var rest$4 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$4, fmt);}; + case 6: + var rest$5 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$5, fmt);}; + case 7: + var rest$6 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$6, fmt);}; + case 8: + var rest$7 = fmtty[2]; + return function(param){return make_from_fmtty(k, acc, rest$7, fmt);}; + case 9: + var + rest$8 = fmtty[3], + ty2 = fmtty[2], + ty1 = fmtty[1], + ty = trans(symm(ty1), ty2); + return function(param){ + return make_from_fmtty + (k, + acc, + caml_call2(CamlinternalFormatBasics[1], ty, rest$8), + fmt);}; + case 10: + var rest$9 = fmtty[1]; + return function(param, _cO_){ + return make_from_fmtty(k, acc, rest$9, fmt);}; + case 11: + var rest$10 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$10, fmt);}; + case 12: + var rest$11 = fmtty[1]; + return function(param){return make_from_fmtty(k, acc, rest$11, fmt);}; + case 13: + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + } + if(counter >= 50) + return caml_trampoline_return(make_invalid_arg, [0, k, acc, fmt]); + var counter$0 = counter + 1 | 0; + return make_invalid_arg(counter$0, k, acc, fmt); + } + function make_invalid_arg(counter, k, acc, fmt){ + var _cN_ = [8, acc, cst_Printf_bad_conversion$0]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cN_, fmt]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cN_, fmt); + } + function make_custom$0(counter, k, acc, rest, arity, f){ + if(arity){ + var arity$0 = arity[1]; + return function(x){ + return make_custom(k, acc, rest, arity$0, caml_call1(f, x));}; + } + var _cM_ = [4, acc, f]; + if(counter >= 50) + return caml_trampoline_return(make_printf$0, [0, k, _cM_, rest]); + var counter$0 = counter + 1 | 0; + return make_printf$0(counter$0, k, _cM_, rest); + } + function make_printf(k, acc, fmt){ + return caml_trampoline(make_printf$0(0, k, acc, fmt)); + } + function make_ignored_param(k, acc, ign, fmt){ + return caml_trampoline(make_ignored_param$0(0, k, acc, ign, fmt)); + } + function make_from_fmtty(k, acc, fmtty, fmt){ + return caml_trampoline(make_from_fmtty$0(0, k, acc, fmtty, fmt)); + } + function make_custom(k, acc, rest, arity, f){ + return caml_trampoline(make_custom$0(0, k, acc, rest, arity, f)); + } + function fn_of_padding_precision(k, o, fmt, pad, prec){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var _cl_ = make_iprintf(k, o, fmt); + return function(_cL_){return _cl_;}; + } + if(prec){ + var _ci_ = make_iprintf(k, o, fmt), _cj_ = function(_cK_){return _ci_;}; + return function(_cJ_){return _cj_;}; + } + var _ck_ = make_iprintf(k, o, fmt); + return function(_cI_){return _ck_;}; + } + if(0 === pad[0]){ + if(typeof prec !== "number"){ + var _cp_ = make_iprintf(k, o, fmt); + return function(_cH_){return _cp_;}; + } + if(prec){ + var _cm_ = make_iprintf(k, o, fmt), _cn_ = function(_cG_){return _cm_;}; + return function(_cF_){return _cn_;}; + } + var _co_ = make_iprintf(k, o, fmt); + return function(_cE_){return _co_;}; + } + if(typeof prec !== "number"){ + var _cv_ = make_iprintf(k, o, fmt), _cw_ = function(_cD_){return _cv_;}; + return function(_cC_){return _cw_;}; + } + if(prec){ + var + _cq_ = make_iprintf(k, o, fmt), + _cr_ = function(_cB_){return _cq_;}, + _cs_ = function(_cA_){return _cr_;}; + return function(_cz_){return _cs_;}; + } + var _ct_ = make_iprintf(k, o, fmt); + function _cu_(_cy_){return _ct_;} + return function(_cx_){return _cu_;}; + } + function make_iprintf$0(counter, k, o, fmt){ + var k$0 = k, fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k$0, o); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], _by_ = make_iprintf(k$0, o, rest); + return function(_ch_){return _by_;}; + case 1: + var rest$0 = fmt$0[1], _bz_ = make_iprintf(k$0, o, rest$0); + return function(_cg_){return _bz_;}; + case 2: + var _bA_ = fmt$0[1]; + if(typeof _bA_ === "number"){ + var rest$1 = fmt$0[2], _bB_ = make_iprintf(k$0, o, rest$1); + return function(_cf_){return _bB_;}; + } + if(0 === _bA_[0]){ + var rest$2 = fmt$0[2], _bC_ = make_iprintf(k$0, o, rest$2); + return function(_ce_){return _bC_;}; + } + var + rest$3 = fmt$0[2], + _bD_ = make_iprintf(k$0, o, rest$3), + _bE_ = function(_cd_){return _bD_;}; + return function(_cc_){return _bE_;}; + case 3: + var _bF_ = fmt$0[1]; + if(typeof _bF_ === "number"){ + var rest$4 = fmt$0[2], _bG_ = make_iprintf(k$0, o, rest$4); + return function(_cb_){return _bG_;}; + } + if(0 === _bF_[0]){ + var rest$5 = fmt$0[2], _bH_ = make_iprintf(k$0, o, rest$5); + return function(_ca_){return _bH_;}; + } + var + rest$6 = fmt$0[2], + _bI_ = make_iprintf(k$0, o, rest$6), + _bJ_ = function(_b$_){return _bI_;}; + return function(_b__){return _bJ_;}; + case 4: + var rest$7 = fmt$0[4], prec = fmt$0[3], pad = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$7, pad, prec); + case 5: + var rest$8 = fmt$0[4], prec$0 = fmt$0[3], pad$0 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$8, pad$0, prec$0); + case 6: + var rest$9 = fmt$0[4], prec$1 = fmt$0[3], pad$1 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$9, pad$1, prec$1); + case 7: + var rest$10 = fmt$0[4], prec$2 = fmt$0[3], pad$2 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$10, pad$2, prec$2); + case 8: + var rest$11 = fmt$0[4], prec$3 = fmt$0[3], pad$3 = fmt$0[2]; + return fn_of_padding_precision(k$0, o, rest$11, pad$3, prec$3); + case 9: + var _bK_ = fmt$0[1]; + if(typeof _bK_ === "number"){ + var rest$12 = fmt$0[2], _bL_ = make_iprintf(k$0, o, rest$12); + return function(_b9_){return _bL_;}; + } + if(0 === _bK_[0]){ + var rest$13 = fmt$0[2], _bM_ = make_iprintf(k$0, o, rest$13); + return function(_b8_){return _bM_;}; + } + var + rest$14 = fmt$0[2], + _bN_ = make_iprintf(k$0, o, rest$14), + _bO_ = function(_b7_){return _bN_;}; + return function(_b6_){return _bO_;}; + case 10: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 11: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 12: + var rest$17 = fmt$0[2], fmt$0 = rest$17; continue; + case 13: + var rest$18 = fmt$0[3], _bP_ = make_iprintf(k$0, o, rest$18); + return function(_b5_){return _bP_;}; + case 14: + var rest$19 = fmt$0[3], fmtty = fmt$0[2]; + return function(param){ + var fmt = param[1], _b4_ = recast(fmt, fmtty); + return make_iprintf + (k$0, + o, + caml_call2(CamlinternalFormatBasics[3], _b4_, rest$19));}; + case 15: + var + rest$20 = fmt$0[1], + _bQ_ = make_iprintf(k$0, o, rest$20), + _bR_ = function(_b3_){return _bQ_;}; + return function(_b2_){return _bR_;}; + case 16: + var rest$21 = fmt$0[1], _bS_ = make_iprintf(k$0, o, rest$21); + return function(_b1_){return _bS_;}; + case 17: + var rest$22 = fmt$0[2], fmt$0 = rest$22; continue; + case 18: + var _bT_ = fmt$0[1]; + if(0 === _bT_[0]){ + var + rest$23 = fmt$0[2], + fmt$1 = _bT_[1][1], + k$3 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$1 = k$3(k$0, rest$23), + k$0 = k$1, + fmt$0 = fmt$1; + continue; + } + var + rest$24 = fmt$0[2], + fmt$2 = _bT_[1][1], + k$4 = + function(k, rest){ + function k$0(koc){return make_iprintf(k, koc, rest);} + return k$0; + }, + k$2 = k$4(k$0, rest$24), + k$0 = k$2, + fmt$0 = fmt$2; + continue; + case 19: + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + case 20: + var rest$25 = fmt$0[3], _bU_ = make_iprintf(k$0, o, rest$25); + return function(_b0_){return _bU_;}; + case 21: + var rest$26 = fmt$0[2], _bV_ = make_iprintf(k$0, o, rest$26); + return function(_bZ_){return _bV_;}; + case 22: + var rest$27 = fmt$0[1], _bW_ = make_iprintf(k$0, o, rest$27); + return function(_bY_){return _bW_;}; + case 23: + var rest$28 = fmt$0[2], ign = fmt$0[1], _bX_ = 0; + return make_ignored_param + (function(param){return caml_call1(k$0, o);}, + _bX_, + ign, + rest$28); + default: + var rest$29 = fmt$0[3], arity = fmt$0[1]; + if(counter >= 50) + return caml_trampoline_return + (fn_of_custom_arity$0, [0, k$0, o, rest$29, arity]); + var counter$0 = counter + 1 | 0; + return fn_of_custom_arity$0(counter$0, k$0, o, rest$29, arity); + } + } + } + function fn_of_custom_arity$0(counter, k, o, fmt, param){ + if(param){ + var arity = param[1], _bw_ = fn_of_custom_arity(k, o, fmt, arity); + return function(_bx_){return _bw_;}; + } + if(counter >= 50) + return caml_trampoline_return(make_iprintf$0, [0, k, o, fmt]); + var counter$0 = counter + 1 | 0; + return make_iprintf$0(counter$0, k, o, fmt); + } + function make_iprintf(k, o, fmt){ + return caml_trampoline(make_iprintf$0(0, k, o, fmt)); + } + function fn_of_custom_arity(k, o, fmt, param){ + return caml_trampoline(fn_of_custom_arity$0(0, k, o, fmt, param)); + } + function output_acc(o, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + output_acc(o, p); + return caml_call2(Stdlib[66], o, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$18); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + output_acc(o, p$0); + caml_call2(Stdlib[66], o, cst$19); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + output_acc(o, p$3); + return caml_call1(f, o); + case 7: + var p$4 = acc$0[1]; + output_acc(o, p$4); + return caml_call1(Stdlib[63], o); + case 8: + var msg = acc$0[2], p$5 = acc$0[1]; + output_acc(o, p$5); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + output_acc(o, p$1); + return caml_call2(Stdlib[66], o, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + output_acc(o, p$2); + return caml_call2(Stdlib[65], o, c); + } + } + } + function bufput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + bufput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$20); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + bufput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$21); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + bufput_acc(b, p$3); + return caml_call1(f, b); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + bufput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + bufput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + bufput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function strput_acc(b, acc){ + var acc$0 = acc; + for(;;){ + if(typeof acc$0 === "number") return 0; + switch(acc$0[0]){ + case 0: + var + fmting_lit = acc$0[2], + p = acc$0[1], + s = string_of_formatting_lit(fmting_lit); + strput_acc(b, p); + return caml_call2(Stdlib_Buffer[16], b, s); + case 1: + var match = acc$0[2], p$0 = acc$0[1]; + if(0 === match[0]){ + var acc$1 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$22); + var acc$0 = acc$1; + continue; + } + var acc$2 = match[1]; + strput_acc(b, p$0); + caml_call2(Stdlib_Buffer[16], b, cst$23); + var acc$0 = acc$2; + continue; + case 6: + var f = acc$0[2], p$3 = acc$0[1]; + strput_acc(b, p$3); + var _bv_ = caml_call1(f, 0); + return caml_call2(Stdlib_Buffer[16], b, _bv_); + case 7: + var acc$3 = acc$0[1], acc$0 = acc$3; continue; + case 8: + var msg = acc$0[2], p$4 = acc$0[1]; + strput_acc(b, p$4); + return caml_call1(Stdlib[1], msg); + case 2: + case 4: + var s$0 = acc$0[2], p$1 = acc$0[1]; + strput_acc(b, p$1); + return caml_call2(Stdlib_Buffer[16], b, s$0); + default: + var c = acc$0[2], p$2 = acc$0[1]; + strput_acc(b, p$2); + return caml_call2(Stdlib_Buffer[12], b, c); + } + } + } + function failwith_message(param){ + var fmt = param[1], buf = caml_call1(Stdlib_Buffer[1], 256); + function k(acc){ + strput_acc(buf, acc); + var _bu_ = caml_call1(Stdlib_Buffer[2], buf); + return caml_call1(Stdlib[2], _bu_); + } + return make_printf(k, 0, fmt); + } + function open_box_of_string(str){ + if(runtime.caml_string_equal(str, cst$43)) return _x_; + var len = caml_ml_string_length(str); + function invalid_box(param){ + return caml_call1(failwith_message(_y_), str); + } + function parse_spaces(i){ + var i$0 = i; + for(;;){ + if(i$0 === len) return i$0; + var match = caml_string_get(str, i$0); + if(9 !== match && 32 !== match) return i$0; + var i$1 = i$0 + 1 | 0, i$0 = i$1; + } + } + var wstart = parse_spaces(0), wend = wstart; + for(;;){ + if(wend !== len && 25 >= caml_string_get(str, wend) - 97 >>> 0){var j = wend + 1 | 0, wend = j; continue;} + var + box_name = caml_call3(Stdlib_String[15], str, wstart, wend - wstart | 0), + nstart = parse_spaces(wend), + nend = nstart; + for(;;){ + if(nend !== len){ + var match = caml_string_get(str, nend), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(switch$0){var j$0 = nend + 1 | 0, nend = j$0; continue;} + } + if(nstart === nend) + var indent = 0; + else + try{ + var + _bs_ = + runtime.caml_int_of_string + (caml_call3(Stdlib_String[15], str, nstart, nend - nstart | 0)), + indent = _bs_; + } + catch(_bt_){ + var _br_ = caml_wrap_exception(_bt_); + if(_br_[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(_br_, 0); + var indent = invalid_box(0); + } + var exp_end = parse_spaces(nend); + if(exp_end !== len) invalid_box(0); + var switch$1 = 0; + if + (caml_string_notequal(box_name, cst$43) + && caml_string_notequal(box_name, "b")) + var + box_type = + caml_string_notequal(box_name, "h") + ? caml_string_notequal + (box_name, "hov") + ? caml_string_notequal + (box_name, "hv") + ? caml_string_notequal(box_name, "v") ? invalid_box(0) : 1 + : 2 + : 3 + : 0; + else + switch$1 = 1; + if(switch$1) var box_type = 4; + return [0, indent, box_type]; + } + } + } + function make_padding_fmt_ebb(pad, fmt){ + if(typeof pad === "number") return [0, 0, fmt]; + if(0 === pad[0]){var w = pad[2], s = pad[1]; return [0, [0, s, w], fmt];} + var s$0 = pad[1]; + return [0, [1, s$0], fmt]; + } + function make_padprec_fmt_ebb(pad, prec, fmt){ + if(typeof prec === "number") + var match = prec ? [0, 1, fmt] : [0, 0, fmt]; + else + var p = prec[1], match = [0, [0, p], fmt]; + var prec$0 = match[1]; + if(typeof pad === "number") return [0, 0, prec$0, fmt]; + if(0 === pad[0]){ + var w = pad[2], s = pad[1]; + return [0, [0, s, w], prec$0, fmt]; + } + var s$0 = pad[1]; + return [0, [1, s$0], prec$0, fmt]; + } + function fmt_ebb_of_string(legacy_behavior, str){ + if(legacy_behavior) + var flag = legacy_behavior[1], legacy_behavior$0 = flag; + else + var legacy_behavior$0 = 1; + function invalid_format_message(str_ind, msg){ + return caml_call3(failwith_message(_z_), str, str_ind, msg); + } + function unexpected_end_of_format(end_ind){ + return invalid_format_message(end_ind, cst_unexpected_end_of_format); + } + function invalid_format_without(str_ind, c, s){ + return caml_call4(failwith_message(_A_), str, str_ind, c, s); + } + function expected_character(str_ind, expected, read){ + return caml_call4(failwith_message(_B_), str, str_ind, expected, read); + } + function add_literal(lit_start, str_ind, fmt){ + var size = str_ind - lit_start | 0; + return 0 === size + ? [0, fmt] + : 1 + === size + ? [0, [12, caml_string_get(str, lit_start), fmt]] + : [0, + [11, + caml_call3(Stdlib_String[15], str, lit_start, size), + fmt]]; + } + function parse(lit_start, end_ind){ + var str_ind = lit_start; + for(;;){ + if(str_ind === end_ind) return add_literal(lit_start, str_ind, 0); + var match = caml_string_get(str, str_ind); + if(37 === match){ + var str_ind$2 = str_ind + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var + match$1 = + 95 === caml_string_get(str, str_ind$2) + ? parse_flags(str_ind, str_ind$2 + 1 | 0, end_ind, 1) + : parse_flags(str_ind, str_ind$2, end_ind, 0), + fmt_rest = match$1[1]; + return add_literal(lit_start, str_ind, fmt_rest); + } + if(64 !== match){ + var str_ind$1 = str_ind + 1 | 0, str_ind = str_ind$1; + continue; + } + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) + var match$0 = _N_; + else{ + var c = caml_string_get(str, str_ind$0), switch$0 = 0; + if(65 <= c) + if(94 <= c){ + var switcher = c - 123 | 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var match$0 = parse_tag(1, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$2 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 1, fmt_rest$2]]; + } + } + else if(91 <= c) + switch(c - 91 | 0){ + case 0: + var match$0 = parse_tag(0, str_ind$0 + 1 | 0, end_ind); break; + case 1: + switch$0 = 1; break; + default: + var + fmt_rest$3 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 0, fmt_rest$3]]; + } + else + switch$0 = 1; + else if(10 === c) + var + fmt_rest$4 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 3, fmt_rest$4]]; + else if(32 <= c) + switch(c - 32 | 0){ + case 0: + var + fmt_rest$5 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _O_, fmt_rest$5]]; + break; + case 5: + var switch$1 = 0; + if + ((str_ind$0 + 1 | 0) < end_ind + && 37 === caml_string_get(str, str_ind$0 + 1 | 0)) + var + fmt_rest$6 = parse(str_ind$0 + 2 | 0, end_ind)[1], + match$0 = [0, [17, 6, fmt_rest$6]]; + else + switch$1 = 1; + if(switch$1) + var + fmt_rest$7 = parse(str_ind$0, end_ind)[1], + match$0 = [0, [12, 64, fmt_rest$7]]; + break; + case 12: + var + fmt_rest$8 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, _P_, fmt_rest$8]]; + break; + case 14: + var + fmt_rest$9 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 4, fmt_rest$9]]; + break; + case 27: + var str_ind$3 = str_ind$0 + 1 | 0; + try{ + var + _bg_ = str_ind$3 === end_ind ? 1 : 0, + _bh_ = _bg_ || (60 !== caml_string_get(str, str_ind$3) ? 1 : 0); + if(_bh_) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + str_ind_1 = parse_spaces(str_ind$3 + 1 | 0, end_ind), + match$2 = caml_string_get(str, str_ind_1), + switch$2 = 0; + if(48 <= match$2){ + if(58 > match$2) switch$2 = 1; + } + else if(45 === match$2) switch$2 = 1; + if(! switch$2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + match$3 = parse_integer(str_ind_1, end_ind), + width = match$3[2], + str_ind_2 = match$3[1], + str_ind_3 = parse_spaces(str_ind_2, end_ind), + switcher$0 = caml_string_get(str, str_ind_3) - 45 | 0, + switch$3 = 0; + if(12 < switcher$0 >>> 0) + if(17 === switcher$0) + var + s = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_3 - str_ind$3 | 0) + 3 | 0), + _bi_ = [0, s, width, 0], + _bj_ = str_ind_3 + 1 | 0, + formatting_lit$0 = _bi_, + next_ind = _bj_; + else + switch$3 = 1; + else if(1 < switcher$0 - 1 >>> 0){ + var + match$4 = parse_integer(str_ind_3, end_ind), + offset = match$4[2], + str_ind_4 = match$4[1], + str_ind_5 = parse_spaces(str_ind_4, end_ind); + if(62 !== caml_string_get(str, str_ind_5)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$0 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$3 - 2 | 0, + (str_ind_5 - str_ind$3 | 0) + 3 | 0), + _bk_ = [0, s$0, width, offset], + _bl_ = str_ind_5 + 1 | 0, + formatting_lit$0 = _bk_, + next_ind = _bl_; + } + else + switch$3 = 1; + if(switch$3) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + } + catch(_bq_){ + var _bf_ = caml_wrap_exception(_bq_); + if(_bf_ !== Stdlib[8] && _bf_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bf_, 0); + var formatting_lit$0 = formatting_lit, next_ind = str_ind$3; + } + var + fmt_rest$12 = parse(next_ind, end_ind)[1], + match$0 = [0, [17, formatting_lit$0, fmt_rest$12]]; + break; + case 28: + var str_ind$4 = str_ind$0 + 1 | 0; + try{ + var + str_ind_1$0 = parse_spaces(str_ind$4, end_ind), + match$6 = caml_string_get(str, str_ind_1$0), + switch$4 = 0; + if(48 <= match$6){ + if(58 > match$6) switch$4 = 1; + } + else if(45 === match$6) switch$4 = 1; + if(switch$4){ + var + match$7 = parse_integer(str_ind_1$0, end_ind), + size = match$7[2], + str_ind_2$0 = match$7[1], + str_ind_3$0 = parse_spaces(str_ind_2$0, end_ind); + if(62 !== caml_string_get(str, str_ind_3$0)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + s$1 = + caml_call3 + (Stdlib_String[15], + str, + str_ind$4 - 2 | 0, + (str_ind_3$0 - str_ind$4 | 0) + 3 | 0), + _bo_ = [0, [0, str_ind_3$0 + 1 | 0, [1, s$1, size]]]; + } + else + var _bo_ = 0; + var _bn_ = _bo_; + } + catch(_bp_){ + var _bm_ = caml_wrap_exception(_bp_); + if(_bm_ !== Stdlib[8] && _bm_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bm_, 0); + var _bn_ = 0; + } + if(_bn_) + var + match$5 = _bn_[1], + formatting_lit$1 = match$5[2], + next_ind$0 = match$5[1], + fmt_rest$13 = parse(next_ind$0, end_ind)[1], + _be_ = [0, [17, formatting_lit$1, fmt_rest$13]]; + else + var + fmt_rest$14 = parse(str_ind$4, end_ind)[1], + _be_ = [0, [17, _Q_, fmt_rest$14]]; + var match$0 = _be_; + break; + case 31: + var + fmt_rest$10 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 2, fmt_rest$10]]; + break; + case 32: + var + fmt_rest$11 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, 5, fmt_rest$11]]; + break; + default: switch$0 = 1; + } + else + switch$0 = 1; + if(switch$0) + var + fmt_rest$1 = parse(str_ind$0 + 1 | 0, end_ind)[1], + match$0 = [0, [17, [2, c], fmt_rest$1]]; + } + var fmt_rest$0 = match$0[1]; + return add_literal(lit_start, str_ind, fmt_rest$0); + } + } + function parse_conversion + (pct_ind, + str_ind, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + symb){ + var + plus_used = [0, 0], + hash_used = [0, 0], + space_used = [0, 0], + ign_used = [0, 0], + pad_used = [0, 0], + prec_used = [0, 0]; + function get_plus(param){plus_used[1] = 1; return plus;} + function get_hash(param){hash_used[1] = 1; return hash;} + function get_space(param){space_used[1] = 1; return space;} + function get_ign(param){ign_used[1] = 1; return ign;} + function get_pad(param){pad_used[1] = 1; return pad;} + function get_prec(param){prec_used[1] = 1; return prec;} + function get_padprec(param){pad_used[1] = 1; return padprec;} + function get_int_pad(param){ + var pad = get_pad(0), match = get_prec(0); + if(typeof match === "number" && ! match) return pad; + if(typeof pad === "number") return 0; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _H_ + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$1) + : pad; + if(2 > pad[1]) return pad; + var n = pad[2]; + return legacy_behavior$0 + ? [0, 1, n] + : incompatible_flag(pct_ind, str_ind, 48, cst_precision$0); + } + function check_no_0(symb, pad){ + if(typeof pad === "number") return pad; + if(0 !== pad[0]) + return 2 <= pad[1] + ? legacy_behavior$0 + ? _I_ + : incompatible_flag(pct_ind, str_ind, symb, cst_0$1) + : pad; + if(2 > pad[1]) return pad; + var width = pad[2]; + return legacy_behavior$0 + ? [0, 1, width] + : incompatible_flag(pct_ind, str_ind, symb, cst_0$0); + } + function opt_of_pad(c, pad){ + if(typeof pad === "number") return 0; + if(0 === pad[0]) + switch(pad[1]){ + case 0: + var width = pad[2]; + return legacy_behavior$0 + ? [0, width] + : incompatible_flag(pct_ind, str_ind, c, cst$24); + case 1: + var width$0 = pad[2]; return [0, width$0]; + default: + var width$1 = pad[2]; + return legacy_behavior$0 + ? [0, width$1] + : incompatible_flag(pct_ind, str_ind, c, cst_0$2); + } + return incompatible_flag(pct_ind, str_ind, c, cst$25); + } + function get_pad_opt(c){return opt_of_pad(c, get_pad(0));} + function get_padprec_opt(c){return opt_of_pad(c, get_padprec(0));} + var switch$0 = 0; + if(124 <= symb) + switch$0 = 1; + else + switch(symb){ + case 33: + var + fmt_rest$5 = parse(str_ind, end_ind)[1], + fmt_result = [0, [10, fmt_rest$5]]; + break; + case 40: + var + sub_end = search_subformat_end(str_ind, end_ind, 41), + fmt_rest$7 = parse(sub_end + 2 | 0, end_ind)[1], + sub_fmt = parse(str_ind, sub_end)[1], + sub_fmtty = fmtty_of_fmt(sub_fmt); + if(get_ign(0)) + var + ignored$2 = [9, get_pad_opt(95), sub_fmtty], + _aN_ = [0, [23, ignored$2, fmt_rest$7]]; + else + var _aN_ = [0, [14, get_pad_opt(40), sub_fmtty, fmt_rest$7]]; + var fmt_result = _aN_; + break; + case 44: + var fmt_result = parse(str_ind, end_ind); break; + case 67: + var + fmt_rest$10 = parse(str_ind, end_ind)[1], + _aP_ = + get_ign(0) ? [0, [23, 1, fmt_rest$10]] : [0, [1, fmt_rest$10]], + fmt_result = _aP_; + break; + case 78: + var fmt_rest$14 = parse(str_ind, end_ind)[1], counter$0 = 2; + if(get_ign(0)) + var + ignored$6 = [11, counter$0], + _aV_ = [0, [23, ignored$6, fmt_rest$14]]; + else + var _aV_ = [0, [21, counter$0, fmt_rest$14]]; + var fmt_result = _aV_; + break; + case 83: + var + pad$6 = check_no_0(symb, get_padprec(0)), + fmt_rest$15 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$7 = [1, get_padprec_opt(95)], + _aW_ = [0, [23, ignored$7, fmt_rest$15]]; + else + var + match$5 = make_padding_fmt_ebb(pad$6, fmt_rest$15), + fmt_rest$16 = match$5[2], + pad$7 = match$5[1], + _aW_ = [0, [3, pad$7, fmt_rest$16]]; + var fmt_result = _aW_; + break; + case 91: + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var + char_set = create_char_set(0), + add_char = function(c){return add_in_char_set(char_set, c);}, + add_range = + function(c$0, c){ + if(c >= c$0){ + var i = c$0; + for(;;){ + add_in_char_set(char_set, caml_call1(Stdlib[29], i)); + var _bd_ = i + 1 | 0; + if(c !== i){var i = _bd_; continue;} + break; + } + } + return 0; + }, + fail_single_percent = + function(str_ind){ + return caml_call2(failwith_message(_R_), str, str_ind); + }, + parse_char_set_content = + function(counter, str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(45 === c){ + add_char(45); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + } + if(93 === c) return str_ind$0 + 1 | 0; + var _bc_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_after_char$0, [0, _bc_, end_ind, c]); + var counter$0 = counter + 1 | 0; + return parse_char_set_after_char$0(counter$0, _bc_, end_ind, c); + } + }, + parse_char_set_after_char$0 = + function(counter, str_ind, end_ind, c){ + var str_ind$0 = str_ind, c$0 = c; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c$1 = caml_string_get(str, str_ind$0), switch$0 = 0; + if(46 <= c$1){ + if(64 === c$1) + switch$0 = 1; + else if(93 === c$1){add_char(c$0); return str_ind$0 + 1 | 0;} + } + else if(37 === c$1) + switch$0 = 1; + else if(45 <= c$1){ + var str_ind$2 = str_ind$0 + 1 | 0; + if(str_ind$2 === end_ind) unexpected_end_of_format(end_ind); + var c$2 = caml_string_get(str, str_ind$2); + if(37 === c$2){ + if((str_ind$2 + 1 | 0) === end_ind) + unexpected_end_of_format(end_ind); + var c$3 = caml_string_get(str, str_ind$2 + 1 | 0); + if(37 !== c$3 && 64 !== c$3) + return fail_single_percent(str_ind$2); + add_range(c$0, c$3); + var _ba_ = str_ind$2 + 2 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _ba_, end_ind]); + var counter$2 = counter + 1 | 0; + return parse_char_set_content(counter$2, _ba_, end_ind); + } + if(93 === c$2){ + add_char(c$0); + add_char(45); + return str_ind$2 + 1 | 0; + } + add_range(c$0, c$2); + var _bb_ = str_ind$2 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _bb_, end_ind]); + var counter$1 = counter + 1 | 0; + return parse_char_set_content(counter$1, _bb_, end_ind); + } + if(switch$0 && 37 === c$0){ + add_char(c$1); + var _a$_ = str_ind$0 + 1 | 0; + if(counter >= 50) + return caml_trampoline_return + (parse_char_set_content, [0, _a$_, end_ind]); + var counter$0 = counter + 1 | 0; + return parse_char_set_content(counter$0, _a$_, end_ind); + } + if(37 === c$0) fail_single_percent(str_ind$0); + add_char(c$0); + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + c$0 = c$1; + } + }, + parse_char_set_after_char = + function(str_ind, end_ind, c){ + return caml_trampoline + (parse_char_set_after_char$0(0, str_ind, end_ind, c)); + }; + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + if(94 === caml_string_get(str, str_ind)) + var str_ind$0 = str_ind + 1 | 0, reverse = 1, str_ind$1 = str_ind$0; + else + var reverse = 0, str_ind$1 = str_ind; + if(str_ind$1 === end_ind) unexpected_end_of_format(end_ind); + var + c = caml_string_get(str, str_ind$1), + next_ind = parse_char_set_after_char(str_ind$1 + 1 | 0, end_ind, c), + char_set$0 = freeze_char_set(char_set), + char_set$1 = reverse ? rev_char_set(char_set$0) : char_set$0, + fmt_rest$19 = parse(next_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$9 = [10, get_pad_opt(95), char_set$1], + _a1_ = [0, [23, ignored$9, fmt_rest$19]]; + else + var _a1_ = [0, [20, get_pad_opt(91), char_set$1, fmt_rest$19]]; + var fmt_result = _a1_; + break; + case 97: + var + fmt_rest$20 = parse(str_ind, end_ind)[1], + fmt_result = [0, [15, fmt_rest$20]]; + break; + case 99: + var + char_format = + function(fmt_rest){ + return get_ign(0) ? [0, [23, 0, fmt_rest]] : [0, [0, fmt_rest]]; + }, + fmt_rest$21 = parse(str_ind, end_ind)[1], + match$7 = get_pad_opt(99); + if(match$7){ + if(0 === match$7[1]) + var + _a2_ = + get_ign(0) ? [0, [23, 3, fmt_rest$21]] : [0, [22, fmt_rest$21]], + _a3_ = _a2_; + else + var + _a3_ = + legacy_behavior$0 + ? char_format(fmt_rest$21) + : invalid_format_message + (str_ind, cst_non_zero_widths_are_unsupp); + var _a4_ = _a3_; + } + else + var _a4_ = char_format(fmt_rest$21); + var fmt_result = _a4_; + break; + case 114: + var + fmt_rest$22 = parse(str_ind, end_ind)[1], + _a5_ = + get_ign(0) ? [0, [23, 2, fmt_rest$22]] : [0, [19, fmt_rest$22]], + fmt_result = _a5_; + break; + case 115: + var + pad$9 = check_no_0(symb, get_padprec(0)), + fmt_rest$23 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$10 = [0, get_padprec_opt(95)], + _a6_ = [0, [23, ignored$10, fmt_rest$23]]; + else + var + match$8 = make_padding_fmt_ebb(pad$9, fmt_rest$23), + fmt_rest$24 = match$8[2], + pad$10 = match$8[1], + _a6_ = [0, [2, pad$10, fmt_rest$24]]; + var fmt_result = _a6_; + break; + case 116: + var + fmt_rest$25 = parse(str_ind, end_ind)[1], + fmt_result = [0, [16, fmt_rest$25]]; + break; + case 123: + var + sub_end$0 = search_subformat_end(str_ind, end_ind, 125), + sub_fmt$0 = parse(str_ind, sub_end$0)[1], + fmt_rest$26 = parse(sub_end$0 + 2 | 0, end_ind)[1], + sub_fmtty$0 = fmtty_of_fmt(sub_fmt$0); + if(get_ign(0)) + var + ignored$11 = [8, get_pad_opt(95), sub_fmtty$0], + _a7_ = [0, [23, ignored$11, fmt_rest$26]]; + else + var _a7_ = [0, [13, get_pad_opt(123), sub_fmtty$0, fmt_rest$26]]; + var fmt_result = _a7_; + break; + case 66: + case 98: + var + pad$3 = check_no_0(symb, get_padprec(0)), + fmt_rest$8 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$3 = [7, get_padprec_opt(95)], + _aO_ = [0, [23, ignored$3, fmt_rest$8]]; + else + var + match$3 = make_padding_fmt_ebb(pad$3, fmt_rest$8), + fmt_rest$9 = match$3[2], + pad$4 = match$3[1], + _aO_ = [0, [9, pad$4, fmt_rest$9]]; + var fmt_result = _aO_; + break; + case 37: + case 64: + var + fmt_rest$6 = parse(str_ind, end_ind)[1], + fmt_result = [0, [12, symb, fmt_rest$6]]; + break; + case 76: + case 108: + case 110: + var switch$1 = 0; + if(str_ind === end_ind) + switch$1 = 1; + else{ + var + symb$0 = caml_string_get(str, str_ind), + _a8_ = symb$0 - 88 | 0, + switch$2 = 0; + if(32 >= _a8_ >>> 0) + switch(_a8_){ + case 0: + case 12: + case 17: + case 23: + case 29: + case 32: + var _aU_ = 1; switch$2 = 1; break; + } + if(! switch$2) var _aU_ = 0; + if(_aU_) switch$0 = 1; else switch$1 = 1; + } + if(switch$1){ + var fmt_rest$13 = parse(str_ind, end_ind)[1], switch$3 = 0; + if(108 <= symb){ + if(111 > symb) + switch(symb - 108 | 0){ + case 0: + var counter = 0; switch$3 = 1; break; + case 1: break; + default: var counter = 1; switch$3 = 1; + } + } + else if(76 === symb){var counter = 2; switch$3 = 1;} + if(! switch$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _V_], 1); + if(get_ign(0)) + var + ignored$5 = [11, counter], + _aT_ = [0, [23, ignored$5, fmt_rest$13]]; + else + var _aT_ = [0, [21, counter, fmt_rest$13]]; + var fmt_result = _aT_; + } + break; + case 32: + case 35: + case 43: + case 45: + case 95: + var + fmt_result = caml_call3(failwith_message(_M_), str, pct_ind, symb); + break; + case 88: + case 100: + case 105: + case 111: + case 117: + case 120: + var + _aX_ = get_space(0), + _aY_ = get_hash(0), + iconv$2 = + compute_int_conv(pct_ind, str_ind, get_plus(0), _aY_, _aX_, symb), + fmt_rest$17 = parse(str_ind, end_ind)[1]; + if(get_ign(0)) + var + ignored$8 = [2, iconv$2, get_pad_opt(95)], + _aZ_ = [0, [23, ignored$8, fmt_rest$17]]; + else + var + _a0_ = get_prec(0), + match$6 = make_padprec_fmt_ebb(get_int_pad(0), _a0_, fmt_rest$17), + fmt_rest$18 = match$6[3], + prec$4 = match$6[2], + pad$8 = match$6[1], + _aZ_ = [0, [4, iconv$2, pad$8, prec$4, fmt_rest$18]]; + var fmt_result = _aZ_; + break; + case 69: + case 70: + case 71: + case 72: + case 101: + case 102: + case 103: + case 104: + var + space$1 = get_space(0), + hash$1 = get_hash(0), + plus$2 = get_plus(0), + flag = + plus$2 + ? space$1 + ? legacy_behavior$0 + ? 1 + : incompatible_flag(pct_ind, str_ind, 32, cst$36) + : 1 + : space$1 ? 2 : 0, + switch$4 = 0; + if(73 <= symb){ + var switcher = symb - 101 | 0; + if(3 < switcher >>> 0) + switch$4 = 1; + else{ + switch(switcher){ + case 0: + var _a9_ = 1; break; + case 1: + var _a9_ = 0; break; + case 2: + var _a9_ = 3; break; + default: var _a9_ = 6; + } + var kind = _a9_; + } + } + else if(69 <= symb){ + var switch$5 = 0; + switch(symb - 69 | 0){ + case 0: + var _a__ = 2; break; + case 1: + switch$4 = 1; switch$5 = 1; break; + case 2: + var _a__ = 4; break; + default: var _a__ = 7; + } + if(! switch$5) var kind = _a__; + } + else + switch$4 = 1; + if(switch$4){ + var switch$6 = 0; + if(hash$1){ + if(70 === symb){var kind = 8; switch$6 = 1;} + } + else if(70 === symb){var kind = 5; switch$6 = 1;} + if(! switch$6) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + } + var + fconv = [0, flag, kind], + fmt_rest$11 = parse(str_ind, end_ind)[1]; + if(get_ign(0)){ + var match = get_prec(0); + if(typeof match === "number") + var + _aQ_ = match ? incompatible_flag(pct_ind, str_ind, 95, cst$26) : 0; + else + var ndec = match[1], _aQ_ = [0, ndec]; + var + ignored$4 = [6, get_pad_opt(95), _aQ_], + _aR_ = [0, [23, ignored$4, fmt_rest$11]]; + } + else + var + _aS_ = get_prec(0), + match$4 = make_padprec_fmt_ebb(get_pad(0), _aS_, fmt_rest$11), + fmt_rest$12 = match$4[3], + prec$3 = match$4[2], + pad$5 = match$4[1], + _aR_ = [0, [8, fconv, pad$5, prec$3, fmt_rest$12]]; + var fmt_result = _aR_; + break; + default: switch$0 = 1; + } + if(switch$0){ + var switch$7 = 0; + if(108 <= symb){ + if(111 > symb){ + var switch$8 = 0; + switch(symb - 108 | 0){ + case 0: + var + _ax_ = caml_string_get(str, str_ind), + _ay_ = get_space(0), + _az_ = get_hash(0), + iconv = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _az_, _ay_, _ax_), + fmt_rest = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored = [3, iconv, get_pad_opt(95)], + _aA_ = [0, [23, ignored, fmt_rest]]; + else + var + _aC_ = get_prec(0), + match$0 = make_padprec_fmt_ebb(get_int_pad(0), _aC_, fmt_rest), + fmt_rest$0 = match$0[3], + prec$0 = match$0[2], + pad$0 = match$0[1], + _aA_ = [0, [5, iconv, pad$0, prec$0, fmt_rest$0]]; + var _aB_ = _aA_; + switch$8 = 1; + break; + case 1: break; + default: + var + _aD_ = caml_string_get(str, str_ind), + _aE_ = get_space(0), + _aF_ = get_hash(0), + iconv$0 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aF_, _aE_, _aD_), + fmt_rest$1 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$0 = [4, iconv$0, get_pad_opt(95)], + _aG_ = [0, [23, ignored$0, fmt_rest$1]]; + else + var + _aH_ = get_prec(0), + match$1 = make_padprec_fmt_ebb(get_int_pad(0), _aH_, fmt_rest$1), + fmt_rest$2 = match$1[3], + prec$1 = match$1[2], + pad$1 = match$1[1], + _aG_ = [0, [6, iconv$0, pad$1, prec$1, fmt_rest$2]]; + var _aB_ = _aG_; + switch$8 = 1; + } + if(switch$8){var fmt_result = _aB_; switch$7 = 1;} + } + } + else if(76 === symb){ + var + _aI_ = caml_string_get(str, str_ind), + _aJ_ = get_space(0), + _aK_ = get_hash(0), + iconv$1 = + compute_int_conv + (pct_ind, str_ind + 1 | 0, get_plus(0), _aK_, _aJ_, _aI_), + fmt_rest$3 = parse(str_ind + 1 | 0, end_ind)[1]; + if(get_ign(0)) + var + ignored$1 = [5, iconv$1, get_pad_opt(95)], + _aL_ = [0, [23, ignored$1, fmt_rest$3]]; + else + var + _aM_ = get_prec(0), + match$2 = make_padprec_fmt_ebb(get_int_pad(0), _aM_, fmt_rest$3), + fmt_rest$4 = match$2[3], + prec$2 = match$2[2], + pad$2 = match$2[1], + _aL_ = [0, [7, iconv$1, pad$2, prec$2, fmt_rest$4]]; + var fmt_result = _aL_; + switch$7 = 1; + } + if(! switch$7) + var + fmt_result = + caml_call3(failwith_message(_J_), str, str_ind - 1 | 0, symb); + } + if(1 - legacy_behavior$0){ + var _ao_ = 1 - plus_used[1], plus$0 = _ao_ ? plus : _ao_; + if(plus$0) incompatible_flag(pct_ind, str_ind, symb, cst$27); + var _ap_ = 1 - hash_used[1], hash$0 = _ap_ ? hash : _ap_; + if(hash$0) incompatible_flag(pct_ind, str_ind, symb, cst$28); + var _aq_ = 1 - space_used[1], space$0 = _aq_ ? space : _aq_; + if(space$0) incompatible_flag(pct_ind, str_ind, symb, cst$29); + var + _ar_ = 1 - pad_used[1], + _as_ = _ar_ ? caml_notequal([0, pad], _K_) : _ar_; + if(_as_) incompatible_flag(pct_ind, str_ind, symb, cst_padding$0); + var + _at_ = 1 - prec_used[1], + _au_ = _at_ ? caml_notequal([0, prec], _L_) : _at_; + if(_au_){ + var _av_ = ign ? 95 : symb; + incompatible_flag(pct_ind, str_ind, _av_, cst_precision$2); + } + var plus$1 = ign ? plus : ign; + if(plus$1) incompatible_flag(pct_ind, str_ind, 95, cst$30); + } + var _aw_ = 1 - ign_used[1], ign$0 = _aw_ ? ign : _aw_; + if(ign$0){ + var switch$9 = 0; + if(38 <= symb){ + if(44 !== symb && 64 !== symb) switch$9 = 1; + } + else if(33 !== symb && 37 > symb) switch$9 = 1; + var switch$10 = 0; + if(switch$9 || ! legacy_behavior$0) switch$10 = 1; + if(switch$10) incompatible_flag(pct_ind, str_ind, symb, cst$31); + } + return fmt_result; + } + function parse_after_precision + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad, prec){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + function parse_conv(padprec){ + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + prec, + padprec, + caml_string_get(str, str_ind)); + } + if(typeof pad !== "number") return parse_conv(pad); + if(typeof prec === "number" && ! prec) return parse_conv(0); + if(minus){ + if(typeof prec === "number") return parse_conv(_F_); + var n = prec[1]; + return parse_conv([0, 0, n]); + } + if(typeof prec === "number") return parse_conv(_G_); + var n$0 = prec[1]; + return parse_conv([0, 1, n$0]); + } + function parse_after_padding + (pct_ind, str_ind, end_ind, minus, plus, hash, space, ign, pad){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var symb = caml_string_get(str, str_ind); + if(46 !== symb) + return parse_conversion + (pct_ind, + str_ind + 1 | 0, + end_ind, + plus, + hash, + space, + ign, + pad, + 0, + pad, + symb); + var str_ind$0 = str_ind + 1 | 0; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + function parse_literal(minus, str_ind){ + var + match = parse_positive(str_ind, end_ind, 0), + prec = match[2], + new_ind = match[1]; + return parse_after_precision + (pct_ind, + new_ind, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + [0, prec]); + } + var symb$0 = caml_string_get(str, str_ind$0); + if(48 <= symb$0){ + if(58 > symb$0) return parse_literal(minus, str_ind$0); + } + else if(42 <= symb$0) + switch(symb$0 - 42 | 0){ + case 0: + return parse_after_precision + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + 1); + case 1: + case 3: + if(legacy_behavior$0){ + var + _an_ = str_ind$0 + 1 | 0, + minus$0 = minus || (45 === symb$0 ? 1 : 0); + return parse_literal(minus$0, _an_); + } + break; + } + return legacy_behavior$0 + ? parse_after_precision + (pct_ind, + str_ind$0, + end_ind, + minus, + plus, + hash, + space, + ign, + pad, + _E_) + : invalid_format_without(str_ind$0 - 1 | 0, 46, cst_precision); + } + function parse_flags(pct_ind, str_ind, end_ind, ign){ + var + zero = [0, 0], + minus = [0, 0], + plus = [0, 0], + space = [0, 0], + hash = [0, 0]; + function set_flag(str_ind, flag){ + var _ak_ = flag[1], _al_ = _ak_ ? 1 - legacy_behavior$0 : _ak_; + if(_al_){ + var _am_ = caml_string_get(str, str_ind); + caml_call3(failwith_message(_C_), str, str_ind, _am_); + } + flag[1] = 1; + return 0; + } + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var switcher = caml_string_get(str, str_ind$0) - 32 | 0; + if(16 >= switcher >>> 0) + switch(switcher){ + case 0: + set_flag(str_ind$0, space); + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + continue; + case 3: + set_flag(str_ind$0, hash); + var str_ind$2 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$2; + continue; + case 11: + set_flag(str_ind$0, plus); + var str_ind$3 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$3; + continue; + case 13: + set_flag(str_ind$0, minus); + var str_ind$4 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$4; + continue; + case 16: + set_flag(str_ind$0, zero); + var str_ind$5 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$5; + continue; + } + var + space$0 = space[1], + hash$0 = hash[1], + plus$0 = plus[1], + minus$0 = minus[1], + zero$0 = zero[1]; + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var + padty = + zero$0 + ? minus$0 + ? legacy_behavior$0 + ? 0 + : incompatible_flag(pct_ind, str_ind$0, 45, cst_0) + : 2 + : minus$0 ? 0 : 1, + match = caml_string_get(str, str_ind$0); + if(48 <= match){ + if(58 > match){ + var + match$0 = parse_positive(str_ind$0, end_ind, 0), + width = match$0[2], + new_ind = match$0[1]; + return parse_after_padding + (pct_ind, + new_ind, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [0, padty, width]); + } + } + else if(42 === match) + return parse_after_padding + (pct_ind, + str_ind$0 + 1 | 0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + [1, padty]); + switch(padty){ + case 0: + if(1 - legacy_behavior$0) + invalid_format_without(str_ind$0 - 1 | 0, 45, cst_padding); + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + case 1: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + 0); + default: + return parse_after_padding + (pct_ind, + str_ind$0, + end_ind, + minus$0, + plus$0, + hash$0, + space$0, + ign, + _D_); + } + } + } + function parse_tag(is_open_tag, str_ind, end_ind){ + try{ + if(str_ind === end_ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + if(60 !== caml_string_get(str, str_ind)) + throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var ind = caml_call3(Stdlib_String[31], str, str_ind + 1 | 0, 62); + if(end_ind <= ind) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var + sub_str = + caml_call3 + (Stdlib_String[15], str, str_ind, (ind - str_ind | 0) + 1 | 0), + fmt_rest$0 = parse(ind + 1 | 0, end_ind)[1], + sub_fmt = parse(str_ind, ind + 1 | 0)[1], + sub_format$0 = [0, sub_fmt, sub_str], + formatting$0 = is_open_tag ? [0, sub_format$0] : [1, sub_format$0], + _ai_ = [0, [18, formatting$0, fmt_rest$0]]; + return _ai_; + } + catch(_aj_){ + var _ah_ = caml_wrap_exception(_aj_); + if(_ah_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ah_, 0); + var + fmt_rest = parse(str_ind, end_ind)[1], + formatting = is_open_tag ? [0, sub_format] : [1, sub_format]; + return [0, [18, formatting, fmt_rest]]; + } + } + function parse_spaces(str_ind, end_ind){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + if(32 !== caml_string_get(str, str_ind$0)) return str_ind$0; + var str_ind$1 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$1; + } + } + function parse_positive(str_ind, end_ind, acc){ + var str_ind$0 = str_ind, acc$0 = acc; + for(;;){ + if(str_ind$0 === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind$0); + if(9 < c - 48 >>> 0) return [0, str_ind$0, acc$0]; + var new_acc = (acc$0 * 10 | 0) + (c - 48 | 0) | 0; + if(Stdlib_Sys[12] < new_acc){ + var _ag_ = Stdlib_Sys[12]; + return caml_call3(failwith_message(_S_), str, new_acc, _ag_); + } + var + str_ind$1 = str_ind$0 + 1 | 0, + str_ind$0 = str_ind$1, + acc$0 = new_acc; + } + } + function parse_integer(str_ind, end_ind){ + if(str_ind === end_ind) unexpected_end_of_format(end_ind); + var match = caml_string_get(str, str_ind); + if(48 <= match){ + if(58 > match) return parse_positive(str_ind, end_ind, 0); + } + else if(45 === match){ + if((str_ind + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + var c = caml_string_get(str, str_ind + 1 | 0); + if(9 < c - 48 >>> 0) + return expected_character(str_ind + 1 | 0, cst_digit, c); + var + match$0 = parse_positive(str_ind + 1 | 0, end_ind, 0), + n = match$0[2], + next_ind = match$0[1]; + return [0, next_ind, - n | 0]; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + } + function search_subformat_end(str_ind, end_ind, c){ + var str_ind$0 = str_ind; + for(;;){ + if(str_ind$0 === end_ind) + caml_call3(failwith_message(_U_), str, c, end_ind); + if(37 !== caml_string_get(str, str_ind$0)){ + var str_ind$7 = str_ind$0 + 1 | 0, str_ind$0 = str_ind$7; + continue; + } + if((str_ind$0 + 1 | 0) === end_ind) unexpected_end_of_format(end_ind); + if(caml_string_get(str, str_ind$0 + 1 | 0) === c) return str_ind$0; + var match = caml_string_get(str, str_ind$0 + 1 | 0); + if(95 <= match){ + if(123 <= match){ + if(126 > match) + switch(match - 123 | 0){ + case 0: + var + sub_end = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 125), + str_ind$2 = sub_end + 2 | 0, + str_ind$0 = str_ind$2; + continue; + case 1: break; + default: + return expected_character(str_ind$0 + 1 | 0, cst_character, 125); + } + } + else if(96 > match){ + if((str_ind$0 + 2 | 0) === end_ind) unexpected_end_of_format(end_ind); + var match$0 = caml_string_get(str, str_ind$0 + 2 | 0); + if(40 === match$0){ + var + sub_end$0 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 41), + str_ind$3 = sub_end$0 + 2 | 0, + str_ind$0 = str_ind$3; + continue; + } + if(123 === match$0){ + var + sub_end$1 = search_subformat_end(str_ind$0 + 3 | 0, end_ind, 125), + str_ind$4 = sub_end$1 + 2 | 0, + str_ind$0 = str_ind$4; + continue; + } + var str_ind$5 = str_ind$0 + 3 | 0, str_ind$0 = str_ind$5; + continue; + } + } + else{ + if(40 === match){ + var + sub_end$2 = search_subformat_end(str_ind$0 + 2 | 0, end_ind, 41), + str_ind$6 = sub_end$2 + 2 | 0, + str_ind$0 = str_ind$6; + continue; + } + if(41 === match) + return expected_character(str_ind$0 + 1 | 0, cst_character$0, 41); + } + var str_ind$1 = str_ind$0 + 2 | 0, str_ind$0 = str_ind$1; + } + } + function incompatible_flag(pct_ind, str_ind, symb, option){ + var + subfmt = + caml_call3(Stdlib_String[15], str, pct_ind, str_ind - pct_ind | 0); + return caml_call5 + (failwith_message(_Y_), str, pct_ind, option, symb, subfmt); + } + function compute_int_conv(pct_ind, str_ind, plus, hash, space, symb){ + var plus$0 = plus, hash$0 = hash, space$0 = space; + for(;;){ + var switch$0 = 0; + if(plus$0){ + if(hash$0) + switch$0 = 1; + else if(! space$0){ + if(100 === symb) return 1; + if(105 === symb) return 4; + } + } + else if(hash$0) + if(space$0) + switch$0 = 1; + else{ + var switcher$0 = symb - 88 | 0; + if(32 < switcher$0 >>> 0) + switch$0 = 1; + else + switch(switcher$0){ + case 0: + return 9; + case 12: + return 13; + case 17: + return 14; + case 23: + return 11; + case 29: + return 15; + case 32: + return 7; + default: switch$0 = 1; + } + } + else if(space$0){ + if(100 === symb) return 2; + if(105 === symb) return 5; + } + else{ + var switcher$1 = symb - 88 | 0; + if(32 >= switcher$1 >>> 0) + switch(switcher$1){ + case 0: + return 8; + case 12: + return 0; + case 17: + return 3; + case 23: + return 10; + case 29: + return 12; + case 32: + return 6; + } + } + if(switch$0){ + var switcher = symb - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 0: + if(legacy_behavior$0) return 9; break; + case 23: + if(legacy_behavior$0) return 11; break; + case 32: + if(legacy_behavior$0) return 7; break; + case 12: + case 17: + case 29: + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$35); + var hash$0 = 0; + continue; + } + } + if(! plus$0){ + if(! space$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _W_], 1); + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$34); + var space$0 = 0; + continue; + } + if(space$0){ + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, 32, cst$32); + var space$0 = 0; + continue; + } + if(! legacy_behavior$0) + return incompatible_flag(pct_ind, str_ind, symb, cst$33); + var plus$0 = 0; + } + } + return parse(0, caml_ml_string_length(str)); + } + function format_of_string_fmtty(str, fmtty){ + var fmt = fmt_ebb_of_string(0, str)[1]; + try{var _ae_ = [0, type_format(fmt, fmtty), str]; return _ae_;} + catch(_af_){ + var _ac_ = caml_wrap_exception(_af_); + if(_ac_ !== Type_mismatch) throw caml_maybe_attach_backtrace(_ac_, 0); + var _ad_ = string_of_fmtty(fmtty); + return caml_call2(failwith_message(_Z_), str, _ad_); + } + } + function format_of_string_format(str, param){ + var + str$0 = param[2], + fmt = param[1], + fmt$0 = fmt_ebb_of_string(0, str)[1]; + try{ + var _aa_ = [0, type_format(fmt$0, fmtty_of_fmt(fmt)), str]; + return _aa_; + } + catch(_ab_){ + var _$_ = caml_wrap_exception(_ab_); + if(_$_ === Type_mismatch) + return caml_call2(failwith_message(___), str, str$0); + throw caml_maybe_attach_backtrace(_$_, 0); + } + } + var + CamlinternalFormat = + [0, + is_in_char_set, + rev_char_set, + create_char_set, + add_in_char_set, + freeze_char_set, + param_format_of_ignored_format, + make_printf, + make_iprintf, + output_acc, + bufput_acc, + strput_acc, + type_format, + fmt_ebb_of_string, + format_of_string_fmtty, + format_of_string_format, + char_of_iconv, + string_of_formatting_lit, + string_of_fmtty, + string_of_fmt, + open_box_of_string, + symm, + trans, + recast]; + runtime.caml_register_global(197, CamlinternalFormat, "CamlinternalFormat"); + return; + } + (globalThis)); + +//# 15574 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Buffer = global_data.Stdlib__Buffer, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib; + function kfprintf(k, o, param){ + var fmt = param[1], _g_ = 0; + function _h_(acc){ + caml_call2(CamlinternalFormat[9], o, acc); + return caml_call1(k, o); + } + return caml_call3(CamlinternalFormat[7], _h_, _g_, fmt); + } + function kbprintf(k, b, param){ + var fmt = param[1], _e_ = 0; + function _f_(acc){ + caml_call2(CamlinternalFormat[10], b, acc); + return caml_call1(k, b); + } + return caml_call3(CamlinternalFormat[7], _f_, _e_, fmt); + } + function ikfprintf(k, oc, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, oc, fmt); + } + function fprintf(oc, fmt){ + return kfprintf(function(_d_){return 0;}, oc, fmt); + } + function bprintf(b, fmt){ + return kbprintf(function(_c_){return 0;}, b, fmt); + } + function ifprintf(oc, fmt){ + return ikfprintf(function(_b_){return 0;}, oc, fmt); + } + function ibprintf(b, fmt){ + return ikfprintf(function(_a_){return 0;}, b, fmt); + } + function printf(fmt){return fprintf(Stdlib[39], fmt);} + function eprintf(fmt){return fprintf(Stdlib[40], fmt);} + function ksprintf(k, param){ + var fmt = param[1]; + function k$0(acc){ + var buf = caml_call1(Stdlib_Buffer[1], 64); + caml_call2(CamlinternalFormat[11], buf, acc); + return caml_call1(k, caml_call1(Stdlib_Buffer[2], buf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(function(s){return s;}, fmt);} + var + Stdlib_Printf = + [0, + fprintf, + printf, + eprintf, + sprintf, + bprintf, + ifprintf, + ibprintf, + kfprintf, + ikfprintf, + ksprintf, + kbprintf, + ikfprintf, + ksprintf]; + runtime.caml_register_global(3, Stdlib_Printf, "Stdlib__Printf"); + return; + } + (globalThis)); + +//# 15665 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$7 = "", + cst$9 = " ", + cst_Display_this_list_of_optio$1 = " Display this list of options", + cst_s = "%s", + cst_help$4 = "--help", + cst_help$3 = "-help", + cst$8 = ".\n", + cst_a_float$1 = "a float", + cst_an_integer$1 = "an integer", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$6 = "\n", + cst$3 = cst$7, + cst$4 = " ", + cst$5 = cst$7, + cst$2 = "(?)", + cst = "}", + cst$0 = "|", + cst$1 = "{", + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + Bad = [248, "Stdlib.Arg.Bad", caml_fresh_oo_id(0)], + Help = [248, "Stdlib.Arg.Help", caml_fresh_oo_id(0)], + Stop = [248, "Stdlib.Arg.Stop", caml_fresh_oo_id(0)], + _v_ = [0, [2, 0, [0, 0]], "%s%c"], + _p_ = [0, [2, 0, 0], cst_s], + _q_ = [0, [2, 0, 0], cst_s], + _n_ = [0, [2, 0, 0], cst_s], + _o_ = [0, [2, 0, 0], cst_s], + _l_ = [0, [2, 0, 0], cst_s], + _m_ = [0, [2, 0, 0], cst_s], + cst_a_boolean = "a boolean", + cst_an_integer = cst_an_integer$1, + cst_an_integer$0 = cst_an_integer$1, + cst_a_float = cst_a_float$1, + cst_a_float$0 = cst_a_float$1, + cst_one_of = "one of: ", + cst_Arg_Expand_is_is_only_allo = + "Arg.Expand is is only allowed with Arg.parse_and_expand_argv_dynamic", + cst_no_argument = "no argument", + _f_ = + [0, + [2, 0, [11, ": unknown option '", [2, 0, [11, "'.\n", 0]]]], + "%s: unknown option '%s'.\n"], + _i_ = + [0, + [2, + 0, + [11, + ": wrong argument '", + [2, + 0, + [11, + "'; option '", + [2, 0, [11, "' expects ", [2, 0, [11, cst$8, 0]]]]]]]], + "%s: wrong argument '%s'; option '%s' expects %s.\n"], + _j_ = + [0, + [2, 0, [11, ": option '", [2, 0, [11, "' needs an argument.\n", 0]]]], + "%s: option '%s' needs an argument.\n"], + _k_ = [0, [2, 0, [11, ": ", [2, 0, [11, cst$8, 0]]]], "%s: %s.\n"], + _g_ = [0, cst_help$3], + _h_ = [0, cst_help$4], + _e_ = [0, [2, 0, 0], cst_s], + _d_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + cst_help$2 = cst_help$3, + cst_Display_this_list_of_optio = cst_Display_this_list_of_optio$1, + cst_help = cst_help$3, + cst_help$1 = cst_help$4, + cst_Display_this_list_of_optio$0 = cst_Display_this_list_of_optio$1, + cst_help$0 = cst_help$4, + _c_ = [0, cst_help$3], + _a_ = [0, [11, cst$9, [2, 0, [12, 32, [2, 0, [12, 10, 0]]]]], " %s %s\n"], + _b_ = + [0, + [11, cst$9, [2, 0, [12, 32, [2, 0, [2, 0, [12, 10, 0]]]]]], + " %s %s%s\n"], + cst_none = ""; + function assoc3(x, l){ + var l$0 = l; + for(;;){ + if(! l$0) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var match = l$0[1], y2 = match[2], y1 = match[1]; + if(caml_equal(y1, x)) return y2; + var t = l$0[2], l$0 = t; + } + } + function make_symlist(prefix, sep, suffix, l){ + if(! l) return cst_none; + var t = l[2], h = l[1], _aD_ = caml_call2(Stdlib[28], prefix, h); + function _aE_(x, y){ + var _aG_ = caml_call2(Stdlib[28], sep, y); + return caml_call2(Stdlib[28], x, _aG_); + } + var _aF_ = caml_call3(Stdlib_List[25], _aE_, _aD_, t); + return caml_call2(Stdlib[28], _aF_, suffix); + } + function help_action(param){ + throw caml_maybe_attach_backtrace([0, Stop, _c_], 1); + } + function add_help(speclist){ + try{assoc3(cst_help$2, speclist); var _aA_ = 0, add1 = _aA_;} + catch(_aC_){ + var _aw_ = caml_wrap_exception(_aC_); + if(_aw_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_aw_, 0); + var + add1 = + [0, + [0, cst_help, [0, help_action], cst_Display_this_list_of_optio], + 0]; + } + try{assoc3(cst_help$1, speclist); var _az_ = 0, add2 = _az_;} + catch(_aB_){ + var _ax_ = caml_wrap_exception(_aB_); + if(_ax_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_ax_, 0); + var + add2 = + [0, + [0, cst_help$0, [0, help_action], cst_Display_this_list_of_optio$0], + 0]; + } + var _ay_ = caml_call2(Stdlib[37], add1, add2); + return caml_call2(Stdlib[37], speclist, _ay_); + } + function usage_b(buf, speclist, errmsg){ + caml_call3(Stdlib_Printf[5], buf, _d_, errmsg); + var _as_ = add_help(speclist); + function _at_(param){ + var + doc = param[3], + spec = param[2], + key = param[1], + _au_ = 0 < caml_ml_string_length(doc) ? 1 : 0; + if(! _au_) return _au_; + if(11 !== spec[0]) + return caml_call4(Stdlib_Printf[5], buf, _a_, key, doc); + var l = spec[1], _av_ = make_symlist(cst$1, cst$0, cst, l); + return caml_call5(Stdlib_Printf[5], buf, _b_, key, _av_, doc); + } + return caml_call2(Stdlib_List[17], _at_, _as_); + } + function usage_string(speclist, errmsg){ + var b = caml_call1(Stdlib_Buffer[1], 200); + usage_b(b, speclist, errmsg); + return caml_call1(Stdlib_Buffer[2], b); + } + function usage(speclist, errmsg){ + var _ar_ = usage_string(speclist, errmsg); + return caml_call2(Stdlib_Printf[3], _e_, _ar_); + } + var current = [0, 0]; + function int_of_string_opt(x){ + try{var _ap_ = [0, runtime.caml_int_of_string(x)]; return _ap_;} + catch(_aq_){ + var _ao_ = caml_wrap_exception(_aq_); + if(_ao_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_ao_, 0); + } + } + function float_of_string_opt(x){ + try{var _am_ = [0, runtime.caml_float_of_string(x)]; return _am_;} + catch(_an_){ + var _al_ = caml_wrap_exception(_an_); + if(_al_[1] === Stdlib[7]) return 0; + throw caml_maybe_attach_backtrace(_al_, 0); + } + } + function parse_and_expand_argv_dynamic_ + (allow_expand, current, argv, speclist, anonfun, errmsg){ + var initpos = current[1]; + function convert_error(error){ + var + b = caml_call1(Stdlib_Buffer[1], 200), + progname = + initpos < argv[1].length - 1 + ? caml_check_bound(argv[1], initpos)[1 + initpos] + : cst$2; + switch(error[0]){ + case 0: + var s = error[1]; + if + (caml_string_notequal(s, cst_help$4) + && caml_string_notequal(s, cst_help$3)) + caml_call4(Stdlib_Printf[5], b, _f_, progname, s); + break; + case 1: + var expected = error[3], arg = error[2], opt = error[1]; + caml_call6(Stdlib_Printf[5], b, _i_, progname, arg, opt, expected); + break; + case 2: + var s$0 = error[1]; + caml_call4(Stdlib_Printf[5], b, _j_, progname, s$0); + break; + default: + var s$1 = error[1]; + caml_call4(Stdlib_Printf[5], b, _k_, progname, s$1); + } + usage_b(b, speclist[1], errmsg); + if(! caml_equal(error, _g_) && ! caml_equal(error, _h_)) + return [0, Bad, caml_call1(Stdlib_Buffer[2], b)]; + return [0, Help, caml_call1(Stdlib_Buffer[2], b)]; + } + current[1]++; + for(;;){ + if(current[1] >= argv[1].length - 1) return 0; + try{ + var + _Y_ = current[1], + s = caml_check_bound(argv[1], _Y_)[1 + _Y_], + switch$0 = 0; + if(1 <= caml_ml_string_length(s) && 45 === caml_string_get(s, 0)){ + try{ + var + follow$1 = 0, + _aa_ = assoc3(s, speclist[1]), + follow$0 = follow$1, + action = _aa_; + } + catch(_aj_){ + var _Z_ = caml_wrap_exception(_aj_); + if(_Z_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_Z_, 0); + try{ + var + i = caml_call2(Stdlib_String[35], s, 61), + len = caml_ml_string_length(s), + arg = + caml_call3(Stdlib_String[15], s, i + 1 | 0, len - (i + 1 | 0) | 0), + keyword = caml_call3(Stdlib_String[15], s, 0, i), + follow = [0, arg], + _$_ = assoc3(keyword, speclist[1]), + follow$0 = follow, + action = _$_; + } + catch(_ak_){ + var ___ = caml_wrap_exception(_ak_); + if(___ === Stdlib[8]) + throw caml_maybe_attach_backtrace([0, Stop, [0, s]], 1); + throw caml_maybe_attach_backtrace(___, 0); + } + } + var + no_arg$0 = + function(s, follow){ + function no_arg(param){ + if(! follow) return 0; + var arg = follow[1]; + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_no_argument]], 1); + } + return no_arg; + }, + no_arg = no_arg$0(s, follow$0), + get_arg$0 = + function(s, follow){ + function get_arg(param){ + if(follow){var arg = follow[1]; return arg;} + if((current[1] + 1 | 0) >= argv[1].length - 1) + throw caml_maybe_attach_backtrace([0, Stop, [2, s]], 1); + var _ai_ = current[1] + 1 | 0; + return caml_check_bound(argv[1], _ai_)[1 + _ai_]; + } + return get_arg; + }, + get_arg = get_arg$0(s, follow$0), + consume_arg$0 = + function(follow){ + function consume_arg(param){return follow ? 0 : (current[1]++, 0);} + return consume_arg; + }, + consume_arg = consume_arg$0(follow$0), + treat_action$0 = + function(s, no_arg, get_arg, consume_arg){ + function treat_action(param){ + switch(param[0]){ + case 0: + var f = param[1]; no_arg(0); return caml_call1(f, 0); + case 1: + var f$0 = param[1], arg = get_arg(0); + try{var _ac_ = [0, caml_call1(Stdlib[32], arg)], match = _ac_;} + catch(_ah_){ + var _ab_ = caml_wrap_exception(_ah_); + if(_ab_[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace(_ab_, 0); + var match = 0; + } + if(! match) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg, cst_a_boolean]], 1); + var s$0 = match[1]; + caml_call1(f$0, s$0); + return consume_arg(0); + case 2: + var r = param[1]; no_arg(0); r[1] = 1; return 0; + case 3: + var r$0 = param[1]; no_arg(0); r$0[1] = 0; return 0; + case 4: + var f$1 = param[1], arg$0 = get_arg(0); + caml_call1(f$1, arg$0); + return consume_arg(0); + case 5: + var r$1 = param[1]; r$1[1] = get_arg(0); return consume_arg(0); + case 6: + var + f$2 = param[1], + arg$1 = get_arg(0), + match$0 = int_of_string_opt(arg$1); + if(! match$0) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$1, cst_an_integer]], 1); + var x = match$0[1]; + caml_call1(f$2, x); + return consume_arg(0); + case 7: + var + r$2 = param[1], + arg$2 = get_arg(0), + match$1 = int_of_string_opt(arg$2); + if(! match$1) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$2, cst_an_integer$0]], 1); + var x$0 = match$1[1]; + r$2[1] = x$0; + return consume_arg(0); + case 8: + var + f$3 = param[1], + arg$3 = get_arg(0), + match$2 = float_of_string_opt(arg$3); + if(! match$2) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$3, cst_a_float]], 1); + var x$1 = match$2[1]; + caml_call1(f$3, x$1); + return consume_arg(0); + case 9: + var + r$3 = param[1], + arg$4 = get_arg(0), + match$3 = float_of_string_opt(arg$4); + if(! match$3) + throw caml_maybe_attach_backtrace + ([0, Stop, [1, s, arg$4, cst_a_float$0]], 1); + var x$2 = match$3[1]; + r$3[1] = x$2; + return consume_arg(0); + case 10: + var specs = param[1]; + no_arg(0); + return caml_call2(Stdlib_List[17], treat_action, specs); + case 11: + var f$4 = param[2], symb = param[1], arg$5 = get_arg(0); + if(caml_call2(Stdlib_List[36], arg$5, symb)){ + caml_call1(f$4, arg$5); + return consume_arg(0); + } + var _ad_ = make_symlist(cst$5, cst$4, cst$3, symb); + throw caml_maybe_attach_backtrace + ([0, + Stop, + [1, s, arg$5, caml_call2(Stdlib[28], cst_one_of, _ad_)]], + 1); + case 12: + var f$5 = param[1]; + no_arg(0); + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) return 0; + var _ae_ = current[1] + 1 | 0; + caml_call1(f$5, caml_check_bound(argv[1], _ae_)[1 + _ae_]); + consume_arg(0); + } + case 13: + var f$6 = param[1]; + no_arg(0); + var acc = [0, 0]; + for(;;){ + if(current[1] >= (argv[1].length - 1 - 1 | 0)) + return caml_call1(f$6, caml_call1(Stdlib_List[9], acc[1])); + var _ag_ = current[1] + 1 | 0, _af_ = acc[1]; + acc[1] = [0, caml_check_bound(argv[1], _ag_)[1 + _ag_], _af_]; + consume_arg(0); + } + default: + var f$7 = param[1]; + if(1 - allow_expand) + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Arg_Expand_is_is_only_allo], 1); + var arg$6 = get_arg(0), newarg = caml_call1(f$7, arg$6); + consume_arg(0); + var + before = + caml_call3(Stdlib_Array[5], argv[1], 0, current[1] + 1 | 0), + after = + caml_call3 + (Stdlib_Array[5], + argv[1], + current[1] + 1 | 0, + (argv[1].length - 1 - current[1] | 0) - 1 | 0); + argv[1] = + caml_call1 + (Stdlib_Array[4], [0, before, [0, newarg, [0, after, 0]]]); + return 0; + } + } + return treat_action; + }, + treat_action = treat_action$0(s, no_arg, get_arg, consume_arg); + treat_action(action); + switch$0 = 1; + } + if(! switch$0) caml_call1(anonfun, s); + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var m = exn[2]; + throw caml_maybe_attach_backtrace(convert_error([3, m]), 1); + } + if(exn[1] !== Stop) throw caml_maybe_attach_backtrace(exn, 0); + var e = exn[2]; + throw caml_maybe_attach_backtrace(convert_error(e), 1); + } + current[1]++; + } + } + function parse_and_expand_argv_dynamic + (current, argv, speclist, anonfun, errmsg){ + return parse_and_expand_argv_dynamic_ + (1, current, argv, speclist, anonfun, errmsg); + } + function parse_argv_dynamic(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_and_expand_argv_dynamic_ + (0, current$0, [0, argv], speclist, anonfun, errmsg); + } + function parse_argv(opt, argv, speclist, anonfun, errmsg){ + if(opt) var sth = opt[1], current$0 = sth; else var current$0 = current; + return parse_argv_dynamic + ([0, current$0], argv, [0, speclist], anonfun, errmsg); + } + function parse(l, f, msg){ + try{var _X_ = parse_argv(0, caml_sys_argv(0), l, f, msg); return _X_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _l_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _m_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_dynamic(l, f, msg){ + try{ + var _W_ = parse_argv_dynamic(0, caml_sys_argv(0), l, f, msg); + return _W_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _n_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _o_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function parse_expand(l, f, msg){ + try{ + var + argv = [0, caml_sys_argv(0)], + spec = [0, l], + current$0 = [0, current[1]], + _V_ = parse_and_expand_argv_dynamic(current$0, argv, spec, f, msg); + return _V_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Bad){ + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[3], _p_, msg$0); + return caml_call1(Stdlib[99], 2); + } + if(exn[1] !== Help) throw caml_maybe_attach_backtrace(exn, 0); + var msg$1 = exn[2]; + caml_call2(Stdlib_Printf[2], _q_, msg$1); + return caml_call1(Stdlib[99], 0); + } + } + function second_word(s){ + var len = caml_ml_string_length(s); + function loop(n){ + var n$0 = n; + for(;;){ + if(len <= n$0) return len; + if(32 !== caml_string_get(s, n$0)) return n$0; + var n$1 = n$0 + 1 | 0, n$0 = n$1; + } + } + try{var n$0 = caml_call2(Stdlib_String[35], s, 9);} + catch(_T_){ + var _R_ = caml_wrap_exception(_T_); + if(_R_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_R_, 0); + try{var n = caml_call2(Stdlib_String[35], s, 32);} + catch(_U_){ + var _S_ = caml_wrap_exception(_U_); + if(_S_ === Stdlib[8]) return len; + throw caml_maybe_attach_backtrace(_S_, 0); + } + return loop(n + 1 | 0); + } + return loop(n$0 + 1 | 0); + } + function max_arg_len(cur, param){ + var doc = param[3], spec = param[2], kwd = param[1]; + if(11 === spec[0]) + return caml_call2(Stdlib_Int[11], cur, caml_ml_string_length(kwd)); + var _Q_ = caml_ml_string_length(kwd) + second_word(doc) | 0; + return caml_call2(Stdlib_Int[11], cur, _Q_); + } + function replace_leading_tab(s){ + var seen = [0, 0]; + function _P_(c){ + if(9 === c && ! seen[1]){seen[1] = 1; return 32;} + return c; + } + return caml_call2(Stdlib_String[17], _P_, s); + } + function align(opt, speclist){ + if(opt) var sth = opt[1], limit = sth; else var limit = Stdlib[19]; + var + completed = add_help(speclist), + len = caml_call3(Stdlib_List[25], max_arg_len, 0, completed), + len$0 = caml_call2(Stdlib_Int[10], len, limit); + function _J_(ksd){ + var kwd = ksd[1], spec = ksd[2]; + if(! caml_string_notequal(ksd[3], cst$7)) return ksd; + if(11 === spec[0]){ + var + msg$0 = ksd[3], + cutcol$0 = second_word(msg$0), + _M_ = caml_call2(Stdlib_Int[11], 0, len$0 - cutcol$0 | 0) + 3 | 0, + spaces$0 = caml_call2(Stdlib_String[1], _M_, 32), + _N_ = replace_leading_tab(msg$0), + _O_ = caml_call2(Stdlib[28], spaces$0, _N_); + return [0, kwd, spec, caml_call2(Stdlib[28], cst$6, _O_)]; + } + var + msg = ksd[3], + spec$0 = ksd[2], + cutcol = second_word(msg), + kwd_len = caml_ml_string_length(kwd), + diff = (len$0 - kwd_len | 0) - cutcol | 0; + if(0 >= diff) return [0, kwd, spec$0, replace_leading_tab(msg)]; + var + spaces = caml_call2(Stdlib_String[1], diff, 32), + _K_ = replace_leading_tab(msg), + prefix = caml_call3(Stdlib_String[15], _K_, 0, cutcol), + suffix = + caml_call3 + (Stdlib_String[15], + msg, + cutcol, + caml_ml_string_length(msg) - cutcol | 0), + _L_ = caml_call2(Stdlib[28], spaces, suffix); + return [0, kwd, spec$0, caml_call2(Stdlib[28], prefix, _L_)]; + } + return caml_call2(Stdlib_List[19], _J_, completed); + } + function read_aux(trim, sep, file){ + var + ic = caml_call1(Stdlib[80], file), + buf = caml_call1(Stdlib_Buffer[1], 200), + words = [0, 0]; + function stash(param){ + var word = caml_call1(Stdlib_Buffer[2], buf); + if(trim){ + var len = caml_ml_string_length(word), switch$0 = 0; + if(0 < len && 13 === caml_string_get(word, len - 1 | 0)){ + var _I_ = caml_call3(Stdlib_String[15], word, 0, len - 1 | 0); + switch$0 = 1; + } + if(! switch$0) var _I_ = word; + var word$0 = _I_; + } + else + var word$0 = word; + words[1] = [0, word$0, words[1]]; + return caml_call1(Stdlib_Buffer[8], buf); + } + try{ + for(;;){ + var c = caml_call1(Stdlib[82], ic); + if(c === sep) stash(0); else caml_call2(Stdlib_Buffer[12], buf, c); + } + } + catch(_H_){ + var _F_ = caml_wrap_exception(_H_); + if(_F_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_F_, 0); + if(0 < caml_call1(Stdlib_Buffer[7], buf)) stash(0); + caml_call1(Stdlib[93], ic); + var _G_ = caml_call1(Stdlib_List[9], words[1]); + return caml_call1(Stdlib_Array[10], _G_); + } + } + var _r_ = 10, _s_ = 1; + function read_arg(_E_){return read_aux(_s_, _r_, _E_);} + var _t_ = 0, _u_ = 0; + function read_arg0(_D_){return read_aux(_u_, _t_, _D_);} + function write_aux(sep, file, args){ + var oc = caml_call1(Stdlib[61], file); + function _C_(s){return caml_call4(Stdlib_Printf[1], oc, _v_, s, sep);} + caml_call2(Stdlib_Array[11], _C_, args); + return caml_call1(Stdlib[76], oc); + } + var _w_ = 10; + function write_arg(_A_, _B_){return write_aux(_w_, _A_, _B_);} + var _x_ = 0; + function write_arg0(_y_, _z_){return write_aux(_x_, _y_, _z_);} + var + Stdlib_Arg = + [0, + parse, + parse_dynamic, + parse_argv, + parse_argv_dynamic, + parse_and_expand_argv_dynamic, + parse_expand, + Help, + Bad, + usage, + usage_string, + align, + current, + read_arg, + read_arg0, + write_arg, + write_arg0]; + runtime.caml_register_global(54, Stdlib_Arg, "Stdlib__Arg"); + return; + } + (globalThis)); + +//# 16364 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_s = "%s\n", + cst_Program_not_linked_with_g_$0 = + "(Program not linked with -g, cannot print stack backtrace)\n", + cst_characters = ", characters ", + cst_Fatal_error_exception = "Fatal error: exception ", + cst_Fatal_error_exception_s = "Fatal error: exception %s\n", + cst_Uncaught_exception = "Uncaught exception: ", + cst_Uncaught_exception_s = "Uncaught exception: %s\n", + caml_check_bound = runtime.caml_check_bound, + caml_get_exception_raw_backtra = runtime.caml_get_exception_raw_backtrace, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$4, + cst$3 = cst$4, + partial = [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, 0]]], + cst$1 = cst$4, + cst$2 = cst$4, + cst = "_", + locfmt = + [0, + [11, + 'File "', + [2, + 0, + [11, + '", line ', + [4, + 0, + 0, + 0, + [11, + cst_characters, + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [11, ": ", [2, 0, 0]]]]]]]]]], + 'File "%s", line %d, characters %d-%d: %s'], + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib = global_data.Stdlib, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Obj = global_data.Stdlib__Obj, + printers = caml_call1(Stdlib_Atomic[1], 0), + _c_ = [0, [11, ", ", [2, 0, [2, 0, 0]]], ", %s%s"], + _o_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _p_ = + [0, + [11, + "Fatal error in uncaught exception handler: exception ", + [2, 0, [12, 10, 0]]], + "Fatal error in uncaught exception handler: exception %s\n"], + cst_Fatal_error_out_of_memory_ = + "Fatal error: out of memory in uncaught exception handler", + _n_ = + [0, + [11, cst_Fatal_error_exception, [2, 0, [12, 10, 0]]], + cst_Fatal_error_exception_s], + _l_ = [0, [2, 0, [12, 10, 0]], cst_s], + cst_Program_not_linked_with_g_ = cst_Program_not_linked_with_g_$0, + _j_ = [0, [2, 0, [12, 10, 0]], cst_s], + _k_ = + [0, + [11, cst_Program_not_linked_with_g_$0, 0], + cst_Program_not_linked_with_g_$0], + cst_Raised_at = "Raised at", + cst_Re_raised_at = "Re-raised at", + cst_Raised_by_primitive_operat = "Raised by primitive operation at", + cst_Called_from = "Called from", + cst_inlined = " (inlined)", + _h_ = + [0, + [2, + 0, + [12, + 32, + [2, + 0, + [11, + ' in file "', + [2, + 0, + [12, + 34, + [2, + 0, + [11, ", line ", [4, 0, 0, 0, [11, cst_characters, partial]]]]]]]]]], + '%s %s in file "%s"%s, line %d, characters %d-%d'], + _i_ = [0, [2, 0, [11, " unknown location", 0]], "%s unknown location"], + _g_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + _f_ = + [0, + [11, cst_Uncaught_exception, [2, 0, [12, 10, 0]]], + cst_Uncaught_exception_s], + cst_Out_of_memory = "Out of memory", + cst_Stack_overflow = "Stack overflow", + cst_Pattern_matching_failed = "Pattern matching failed", + cst_Assertion_failed = "Assertion failed", + cst_Undefined_recursive_module = "Undefined recursive module", + _d_ = [0, [12, 40, [2, 0, [2, 0, [12, 41, 0]]]], "(%s%s)"], + _e_ = [0, [12, 40, [2, 0, [12, 41, 0]]], "(%s)"], + _b_ = [0, [4, 0, 0, 0, 0], "%d"], + _a_ = [0, [3, 0, 0], "%S"], + _m_ = + [0, + cst$4, + "(Cannot print locations:\n bytecode executable program file not found)", + "(Cannot print locations:\n bytecode executable program file appears to be corrupt)", + "(Cannot print locations:\n bytecode executable program file has wrong magic number)", + "(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"]; + function field(x, i){ + var f = x[1 + i]; + if(! caml_call1(Stdlib_Obj[1], f)) + return caml_call2(Stdlib_Printf[4], _b_, f); + var _al_ = Stdlib_Obj[15]; + if(caml_obj_tag(f) === _al_) return caml_call2(Stdlib_Printf[4], _a_, f); + var _am_ = Stdlib_Obj[16]; + return caml_obj_tag(f) === _am_ ? caml_call1(Stdlib[35], f) : cst; + } + function other_fields(x, i){ + if(x.length - 1 <= i) return cst$0; + var _aj_ = other_fields(x, i + 1 | 0), _ak_ = field(x, i); + return caml_call3(Stdlib_Printf[4], _c_, _ak_, _aj_); + } + function use_printers(x){ + var param = caml_call1(Stdlib_Atomic[2], printers); + for(;;){ + if(! param) return 0; + var tl = param[2], hd = param[1], switch$0 = 0; + try{var val = caml_call1(hd, x);}catch(_ai_){switch$0 = 1;} + if(! switch$0 && val){var s = val[1]; return [0, s];} + var param = tl; + } + } + function string_of_extension_constructo(t){ + if(0 === caml_obj_tag(t)){ + var constructor = t[1][1], match = t.length - 1; + if(2 < match >>> 0) + var + _ae_ = other_fields(t, 2), + _af_ = field(t, 1), + _ah_ = caml_call3(Stdlib_Printf[4], _d_, _af_, _ae_); + else + switch(match){ + case 0: + var _ah_ = cst$1; break; + case 1: + var _ah_ = cst$2; break; + default: + var + _ag_ = field(t, 1), + _ah_ = caml_call2(Stdlib_Printf[4], _e_, _ag_); + } + var match$0 = [0, constructor, [0, _ah_]]; + } + else + var match$0 = [0, t[1], 0]; + var fields_opt = match$0[2], constructor$0 = match$0[1]; + if(! fields_opt) return constructor$0; + var f = fields_opt[1]; + return caml_call2(Stdlib[28], constructor$0, f); + } + function to_string_default(x){ + if(x === Stdlib[9]) return cst_Out_of_memory; + if(x === Stdlib[10]) return cst_Stack_overflow; + if(x[1] === Stdlib[4]){ + var match = x[2], char$0 = match[3], line = match[2], file = match[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file, + line, + char$0, + char$0 + 5 | 0, + cst_Pattern_matching_failed); + } + if(x[1] === Stdlib[5]){ + var + match$0 = x[2], + char$1 = match$0[3], + line$0 = match$0[2], + file$0 = match$0[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$0, + line$0, + char$1, + char$1 + 6 | 0, + cst_Assertion_failed); + } + if(x[1] !== Stdlib[15]) return string_of_extension_constructo(x); + var + match$1 = x[2], + char$2 = match$1[3], + line$1 = match$1[2], + file$1 = match$1[1]; + return caml_call6 + (Stdlib_Printf[4], + locfmt, + file$1, + line$1, + char$2, + char$2 + 6 | 0, + cst_Undefined_recursive_module); + } + function to_string(e){ + var match = use_printers(e); + if(! match) return to_string_default(e); + var s = match[1]; + return s; + } + function print(fct, arg){ + try{var _ad_ = caml_call1(fct, arg); return _ad_;} + catch(x$0){ + var x = caml_wrap_exception(x$0), _ac_ = to_string(x); + caml_call2(Stdlib_Printf[3], _f_, _ac_); + caml_call1(Stdlib[63], Stdlib[40]); + throw caml_maybe_attach_backtrace(x, 0); + } + } + function catch$0(fct, arg){ + try{var _ab_ = caml_call1(fct, arg); return _ab_;} + catch(x$0){ + var x = caml_wrap_exception(x$0); + caml_call1(Stdlib[63], Stdlib[39]); + var _aa_ = to_string(x); + caml_call2(Stdlib_Printf[3], _g_, _aa_); + return caml_call1(Stdlib[99], 2); + } + } + function raw_backtrace_entries(bt){return bt;} + function convert_raw_backtrace(bt){ + return [0, runtime.caml_convert_raw_backtrace(bt)]; + } + function format_backtrace_slot(pos, slot){ + function info(is_raise){ + return is_raise + ? 0 === pos ? cst_Raised_at : cst_Re_raised_at + : 0 === pos ? cst_Raised_by_primitive_operat : cst_Called_from; + } + if(0 === slot[0]){ + var + _U_ = slot[5], + _V_ = slot[4], + _W_ = slot[3], + _X_ = slot[6] ? cst_inlined : cst$3, + _Y_ = slot[2], + _Z_ = slot[7], + ___ = info(slot[1]); + return [0, + caml_call8 + (Stdlib_Printf[4], _h_, ___, _Z_, _Y_, _X_, _W_, _V_, _U_)]; + } + if(slot[1]) return 0; + var _$_ = info(0); + return [0, caml_call2(Stdlib_Printf[4], _i_, _$_)]; + } + function print_raw_backtrace(outchan, raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return caml_call2(Stdlib_Printf[1], outchan, _k_); + var a = backtrace[1], _S_ = a.length - 1 - 1 | 0, _R_ = 0; + if(_S_ >= 0){ + var i = _R_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[1], outchan, _j_, str); + } + var _T_ = i + 1 | 0; + if(_S_ !== i){var i = _T_; continue;} + break; + } + } + return 0; + } + function print_backtrace(outchan){ + return print_raw_backtrace(outchan, caml_get_exception_raw_backtra(0)); + } + function raw_backtrace_to_string(raw_backtrace){ + var backtrace = convert_raw_backtrace(raw_backtrace); + if(! backtrace) return cst_Program_not_linked_with_g_; + var + a = backtrace[1], + b = caml_call1(Stdlib_Buffer[1], 1024), + _P_ = a.length - 1 - 1 | 0, + _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + var match = format_backtrace_slot(i, caml_check_bound(a, i)[1 + i]); + if(match){ + var str = match[1]; + caml_call3(Stdlib_Printf[5], b, _l_, str); + } + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return caml_call1(Stdlib_Buffer[2], b); + } + function backtrace_slot_is_raise(param){ + return 0 === param[0] ? param[1] : param[1]; + } + function backtrace_slot_is_inline(param){return 0 === param[0] ? param[6] : 0; + } + function backtrace_slot_location(param){ + return 0 === param[0] + ? [0, [0, param[2], param[3], param[4], param[5]]] + : 0; + } + function backtrace_slot_defname(param){ + if(0 === param[0] && runtime.caml_string_notequal(param[7], cst$4)) + return [0, param[7]]; + return 0; + } + function backtrace_slots(raw_backtrace){ + var match = convert_raw_backtrace(raw_backtrace); + if(! match) return 0; + var backtrace = match[1], i$1 = backtrace.length - 1 - 1 | 0, i = i$1; + for(;;){ + if(-1 === i) + var _N_ = 0; + else{ + var _M_ = 0 === caml_check_bound(backtrace, i)[1 + i][0] ? 1 : 0; + if(! _M_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _N_ = _M_; + } + return _N_ ? [0, backtrace] : 0; + } + } + function backtrace_slots_of_raw_entry(entry){return backtrace_slots([0, entry]); + } + function raw_backtrace_length(bt){return bt.length - 1;} + function get_backtrace(param){ + return raw_backtrace_to_string(caml_get_exception_raw_backtra(0)); + } + function register_printer(fn){ + for(;;){ + var + old_printers = caml_call1(Stdlib_Atomic[2], printers), + new_printers = [0, fn, old_printers], + success = + caml_call3(Stdlib_Atomic[5], printers, old_printers, new_printers), + _L_ = 1 - success; + if(_L_) continue; + return _L_; + } + } + function exn_slot(x){return 0 === caml_obj_tag(x) ? x[1] : x;} + function exn_slot_id(x){var slot = exn_slot(x); return slot[2];} + function exn_slot_name(x){var slot = exn_slot(x); return slot[1];} + var errors = _m_.slice(); + function default_uncaught_exception_han(exn, raw_backtrace){ + var _I_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _n_, _I_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var status = runtime.caml_ml_debug_info_status(0); + if(status < 0){ + var + _J_ = caml_call1(Stdlib[18], status), + _K_ = caml_check_bound(errors, _J_)[1 + _J_]; + caml_call1(Stdlib[53], _K_); + } + return caml_call1(Stdlib[63], Stdlib[40]); + } + var uncaught_exception_handler = [0, default_uncaught_exception_han]; + function set_uncaught_exception_handler(fn){ + uncaught_exception_handler[1] = fn; + return 0; + } + var empty_backtrace = [0]; + function handle_uncaught_exception(exn$0, debugger_in_use){ + try{ + try{ + var + raw_backtrace = + debugger_in_use ? empty_backtrace : caml_get_exception_raw_backtra(0); + try{caml_call1(Stdlib[103], 0);}catch(_H_){} + try{ + var + _D_ = caml_call2(uncaught_exception_handler[1], exn$0, raw_backtrace), + _C_ = _D_; + } + catch(exn$1){ + var + exn = caml_wrap_exception(exn$1), + raw_backtrace$0 = caml_get_exception_raw_backtra(0), + _A_ = to_string(exn$0); + caml_call2(Stdlib_Printf[3], _o_, _A_); + print_raw_backtrace(Stdlib[40], raw_backtrace); + var _B_ = to_string(exn); + caml_call2(Stdlib_Printf[3], _p_, _B_); + print_raw_backtrace(Stdlib[40], raw_backtrace$0); + var _C_ = caml_call1(Stdlib[63], Stdlib[40]); + } + var _E_ = _C_; + } + catch(_G_){ + var _z_ = caml_wrap_exception(_G_); + if(_z_ !== Stdlib[9]) throw caml_maybe_attach_backtrace(_z_, 0); + var _E_ = caml_call1(Stdlib[53], cst_Fatal_error_out_of_memory_); + } + return _E_; + } + catch(_F_){return 0;} + } + runtime.caml_register_named_value + ("Printexc.handle_uncaught_exception", handle_uncaught_exception); + function _q_(_y_){return runtime.caml_raw_backtrace_next_slot(_y_);} + function _r_(_x_){return runtime.caml_convert_raw_backtrace_slot(_x_);} + function _s_(_w_, _v_){return runtime.caml_raw_backtrace_slot(_w_, _v_);} + var + _t_ = + [0, + backtrace_slot_is_raise, + backtrace_slot_is_inline, + backtrace_slot_location, + backtrace_slot_defname, + format_backtrace_slot], + Stdlib_Printexc = + [0, + to_string, + to_string_default, + print, + catch$0, + print_backtrace, + get_backtrace, + runtime.caml_record_backtrace, + runtime.caml_backtrace_status, + register_printer, + use_printers, + raw_backtrace_entries, + function(_u_){return caml_get_exception_raw_backtra(_u_);}, + print_raw_backtrace, + raw_backtrace_to_string, + default_uncaught_exception_han, + set_uncaught_exception_handler, + backtrace_slots, + backtrace_slots_of_raw_entry, + _t_, + raw_backtrace_length, + _s_, + _r_, + _q_, + exn_slot_id, + exn_slot_name, + string_of_extension_constructo]; + runtime.caml_register_global(42, Stdlib_Printexc, "Stdlib__Printexc"); + return; + } + (globalThis)); + +//# 17098 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Digest_from_hex$1 = "Digest.from_hex", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_md5_string = runtime.caml_md5_string, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_String = global_data.Stdlib__String, + compare = Stdlib_String[9], + equal = Stdlib_String[8], + cst_Digest_from_hex$0 = cst_Digest_from_hex$1, + cst_Digest_from_hex = cst_Digest_from_hex$1, + cst_Digest_to_hex = "Digest.to_hex", + cst_Digest_substring = "Digest.substring"; + function string(str){ + return caml_md5_string(str, 0, caml_ml_string_length(str)); + } + function bytes(b){return string(caml_call1(Stdlib_Bytes[44], b));} + function substring(str, ofs, len){ + if(0 <= ofs && 0 <= len && (caml_ml_string_length(str) - len | 0) >= ofs) + return caml_md5_string(str, ofs, len); + return caml_call1(Stdlib[1], cst_Digest_substring); + } + function subbytes(b, ofs, len){ + return substring(caml_call1(Stdlib_Bytes[44], b), ofs, len); + } + function file(filename){ + var ic = caml_call1(Stdlib[80], filename); + try{var d = runtime.caml_md5_chan(ic, -1);} + catch(e$0){ + var e = caml_wrap_exception(e$0); + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(e, 0); + } + caml_call1(Stdlib[93], ic); + return d; + } + function output(chan, digest){return caml_call2(Stdlib[66], chan, digest);} + function input(chan){return caml_call2(Stdlib[86], chan, 16);} + function char_hex(n){var _e_ = 10 <= n ? 87 : 48; return n + _e_ | 0;} + function to_hex(d){ + if(16 !== caml_ml_string_length(d)) + caml_call1(Stdlib[1], cst_Digest_to_hex); + var result = caml_create_bytes(32), i = 0; + for(;;){ + var x = caml_string_get(d, i); + caml_bytes_unsafe_set(result, i * 2 | 0, char_hex(x >>> 4 | 0)); + caml_bytes_unsafe_set(result, (i * 2 | 0) + 1 | 0, char_hex(x & 15)); + var _d_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _d_; + } + } + function from_hex(s){ + if(32 !== caml_ml_string_length(s)) + caml_call1(Stdlib[1], cst_Digest_from_hex); + function digit(c){ + if(65 <= c){ + if(97 <= c){ + if(103 > c) return (c - 97 | 0) + 10 | 0; + } + else if(71 > c) return (c - 65 | 0) + 10 | 0; + } + else if(9 >= c - 48 >>> 0) return c - 48 | 0; + throw caml_maybe_attach_backtrace + ([0, Stdlib[6], cst_Digest_from_hex$0], 1); + } + var result = caml_create_bytes(16), i = 0; + for(;;){ + var + i$0 = 2 * i | 0, + _a_ = digit(caml_string_get(s, i$0 + 1 | 0)), + _b_ = (digit(caml_string_get(s, i$0)) << 4) + _a_ | 0; + runtime.caml_bytes_set(result, i, caml_call1(Stdlib_Char[1], _b_)); + var _c_ = i + 1 | 0; + if(15 === i) return caml_call1(Stdlib_Bytes[44], result); + var i = _c_; + } + } + var + Stdlib_Digest = + [0, + compare, + equal, + string, + bytes, + substring, + subbytes, + file, + output, + input, + to_hex, + from_hex]; + runtime.caml_register_global(8, Stdlib_Digest, "Stdlib__Digest"); + return; + } + (globalThis)); + +//# 17219 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Bigarray_Array3_of_array_n$1 = + "Bigarray.Array3.of_array: non-cubic data", + caml_ba_change_layout = runtime.caml_ba_change_layout, + caml_ba_create = runtime.caml_ba_create, + caml_ba_dim_1 = runtime.caml_ba_dim_1, + caml_ba_dim_2 = runtime.caml_ba_dim_2, + caml_ba_kind = runtime.caml_ba_kind, + caml_ba_num_dims = runtime.caml_ba_num_dims, + caml_ba_reshape = runtime.caml_ba_reshape, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_ba_set_2 = runtime.caml_ba_set_2, + caml_ba_set_3 = runtime.caml_ba_set_3, + caml_ba_set_generic = runtime.caml_ba_set_generic, + caml_ba_slice = runtime.caml_ba_slice, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Sys = global_data.Stdlib__Sys, + cst_Bigarray_array3_of_genarra = "Bigarray.array3_of_genarray", + cst_Bigarray_array2_of_genarra = "Bigarray.array2_of_genarray", + cst_Bigarray_array1_of_genarra = "Bigarray.array1_of_genarray", + cst_Bigarray_array0_of_genarra = "Bigarray.array0_of_genarray", + cst_Bigarray_Array3_of_array_n = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array3_of_array_n$0 = cst_Bigarray_Array3_of_array_n$1, + cst_Bigarray_Array2_of_array_n = + "Bigarray.Array2.of_array: non-rectangular data", + float32 = 0, + float64 = 1, + int8_signed = 2, + int8_unsigned = 3, + int16_signed = 4, + int16_unsigned = 5, + int32 = 6, + int64 = 7, + int$0 = 8, + nativeint = 9, + complex32 = 10, + complex64 = 11, + char$0 = 12; + function kind_size_in_bytes(param){ + switch(param){ + case 0: + return 4; + case 1: + return 8; + case 2: + return 1; + case 3: + return 1; + case 4: + return 2; + case 5: + return 2; + case 6: + return 4; + case 7: + return 8; + case 8: + return Stdlib_Sys[9] / 8 | 0; + case 9: + return Stdlib_Sys[9] / 8 | 0; + case 10: + return 8; + case 11: + return 16; + default: return 1; + } + } + var c_layout = 0, fortran_layout = 1; + function cloop(arr, idx, f, col, max){ + if(col === idx.length - 1) + return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _am_ = caml_check_bound(max, col)[1 + col] - 1 | 0, _al_ = 0; + if(_am_ >= 0){ + var j = _al_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + cloop(arr, idx, f, col + 1 | 0, max); + var _an_ = j + 1 | 0; + if(_am_ !== j){var j = _an_; continue;} + break; + } + } + return 0; + } + function floop(arr, idx, f, col, max){ + if(0 > col) return caml_ba_set_generic(arr, idx, caml_call1(f, idx)); + var _aj_ = caml_check_bound(max, col)[1 + col], _ai_ = 1; + if(_aj_ >= 1){ + var j = _ai_; + for(;;){ + caml_check_bound(idx, col)[1 + col] = j; + floop(arr, idx, f, col - 1 | 0, max); + var _ak_ = j + 1 | 0; + if(_aj_ !== j){var j = _ak_; continue;} + break; + } + } + return 0; + } + function init(kind, layout, dims, f){ + var arr = caml_ba_create(kind, layout, dims), dlen = dims.length - 1; + return layout + ? (floop + (arr, caml_make_vect(dlen, 1), f, dlen - 1 | 0, dims), + arr) + : (cloop(arr, caml_make_vect(dlen, 0), f, 0, dims), arr); + } + function dims(a){ + var + n = caml_ba_num_dims(a), + d = caml_make_vect(n, 0), + _af_ = n - 1 | 0, + _ae_ = 0; + if(_af_ >= 0){ + var i = _ae_; + for(;;){ + var _ag_ = runtime.caml_ba_dim(a, i); + caml_check_bound(d, i)[1 + i] = _ag_; + var _ah_ = i + 1 | 0; + if(_af_ !== i){var i = _ah_; continue;} + break; + } + } + return d; + } + function size_in_bytes(arr){ + var + _ac_ = dims(arr), + _ad_ = caml_call3(Stdlib_Array[15], caml_mul, 1, _ac_); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _ad_); + } + function create(kind, layout){return caml_ba_create(kind, layout, [0]);} + function get(arr){return runtime.caml_ba_get_generic(arr, [0]);} + function set(arr){ + var _aa_ = [0]; + return function(_ab_){return caml_ba_set_generic(arr, _aa_, _ab_);}; + } + function size_in_bytes$0(arr){ + return kind_size_in_bytes(caml_ba_kind(arr)); + } + function of_value(kind, layout, v){ + var a = create(kind, layout); + caml_call1(set(a), v); + return a; + } + function create$0(kind, layout, dim){ + return caml_ba_create(kind, layout, [0, dim]); + } + function size_in_bytes$1(arr){ + var _$_ = caml_ba_dim_1(arr); + return caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _$_); + } + function slice(a, n){ + return runtime.caml_ba_layout(a) + ? caml_ba_slice(a, [0, n]) + : caml_ba_slice(a, [0, n]); + } + function init$0(kind, layout, dim, f){ + var arr = create$0(kind, layout, dim); + if(layout){ + var _Z_ = 1; + if(dim >= 1){ + var i$0 = _Z_; + for(;;){ + caml_ba_set_1(arr, i$0, caml_call1(f, i$0)); + var ___ = i$0 + 1 | 0; + if(dim !== i$0){var i$0 = ___; continue;} + break; + } + } + return arr; + } + var _X_ = dim - 1 | 0, _W_ = 0; + if(_X_ >= 0){ + var i = _W_; + for(;;){ + caml_ba_set_1(arr, i, caml_call1(f, i)); + var _Y_ = i + 1 | 0; + if(_X_ !== i){var i = _Y_; continue;} + break; + } + } + return arr; + } + function of_array(kind, layout, data){ + var + ba = create$0(kind, layout, data.length - 1), + ofs = layout ? 1 : 0, + _U_ = data.length - 1 - 1 | 0, + _T_ = 0; + if(_U_ >= 0){ + var i = _T_; + for(;;){ + caml_ba_set_1(ba, i + ofs | 0, caml_check_bound(data, i)[1 + i]); + var _V_ = i + 1 | 0; + if(_U_ !== i){var i = _V_; continue;} + break; + } + } + return ba; + } + function create$1(kind, layout, dim1, dim2){ + return caml_ba_create(kind, layout, [0, dim1, dim2]); + } + function size_in_bytes$2(arr){ + var _R_ = caml_ba_dim_2(arr), _S_ = caml_ba_dim_1(arr); + return caml_mul(caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _S_), _R_); + } + function slice_left(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right(a, n){return caml_ba_slice(a, [0, n]);} + function init$1(kind, layout, dim1, dim2, f){ + var arr = create$1(kind, layout, dim1, dim2); + if(layout){ + var _N_ = 1; + if(dim2 >= 1){ + var j$0 = _N_; + for(;;){ + var _O_ = 1; + if(dim1 >= 1){ + var i$0 = _O_; + for(;;){ + caml_ba_set_2(arr, i$0, j$0, caml_call2(f, i$0, j$0)); + var _Q_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _Q_; continue;} + break; + } + } + var _P_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _P_; continue;} + break; + } + } + return arr; + } + var _I_ = dim1 - 1 | 0, _H_ = 0; + if(_I_ >= 0){ + var i = _H_; + for(;;){ + var _K_ = dim2 - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var j = _J_; + for(;;){ + caml_ba_set_2(arr, i, j, caml_call2(f, i, j)); + var _M_ = j + 1 | 0; + if(_K_ !== j){var j = _M_; continue;} + break; + } + } + var _L_ = i + 1 | 0; + if(_I_ !== i){var i = _L_; continue;} + break; + } + } + return arr; + } + function of_array$0(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + ba = create$1(kind, layout, dim1, dim2), + ofs = layout ? 1 : 0, + _C_ = dim1 - 1 | 0, + _B_ = 0; + if(_C_ >= 0){ + var i = _B_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array2_of_array_n); + var _E_ = dim2 - 1 | 0, _D_ = 0; + if(_E_ >= 0){ + var j = _D_; + for(;;){ + caml_ba_set_2 + (ba, i + ofs | 0, j + ofs | 0, caml_check_bound(row, j)[1 + j]); + var _G_ = j + 1 | 0; + if(_E_ !== j){var j = _G_; continue;} + break; + } + } + var _F_ = i + 1 | 0; + if(_C_ !== i){var i = _F_; continue;} + break; + } + } + return ba; + } + function create$2(kind, layout, dim1, dim2, dim3){ + return caml_ba_create(kind, layout, [0, dim1, dim2, dim3]); + } + function size_in_bytes$3(arr){ + var + _y_ = runtime.caml_ba_dim_3(arr), + _z_ = caml_ba_dim_2(arr), + _A_ = caml_ba_dim_1(arr); + return caml_mul + (caml_mul + (caml_mul(kind_size_in_bytes(caml_ba_kind(arr)), _A_), _z_), + _y_); + } + function slice_left_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_right_1(a, n, m){return caml_ba_slice(a, [0, n, m]);} + function slice_left_2(a, n){return caml_ba_slice(a, [0, n]);} + function slice_right_2(a, n){return caml_ba_slice(a, [0, n]);} + function init$2(kind, layout, dim1, dim2, dim3, f){ + var arr = create$2(kind, layout, dim1, dim2, dim3); + if(layout){ + var _s_ = 1; + if(dim3 >= 1){ + var k$0 = _s_; + for(;;){ + var _t_ = 1; + if(dim2 >= 1){ + var j$0 = _t_; + for(;;){ + var _v_ = 1; + if(dim1 >= 1){ + var i$0 = _v_; + for(;;){ + caml_ba_set_3(arr, i$0, j$0, k$0, caml_call3(f, i$0, j$0, k$0)); + var _x_ = i$0 + 1 | 0; + if(dim1 !== i$0){var i$0 = _x_; continue;} + break; + } + } + var _w_ = j$0 + 1 | 0; + if(dim2 !== j$0){var j$0 = _w_; continue;} + break; + } + } + var _u_ = k$0 + 1 | 0; + if(dim3 !== k$0){var k$0 = _u_; continue;} + break; + } + } + return arr; + } + var _k_ = dim1 - 1 | 0, _j_ = 0; + if(_k_ >= 0){ + var i = _j_; + for(;;){ + var _m_ = dim2 - 1 | 0, _l_ = 0; + if(_m_ >= 0){ + var j = _l_; + for(;;){ + var _p_ = dim3 - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var k = _o_; + for(;;){ + caml_ba_set_3(arr, i, j, k, caml_call3(f, i, j, k)); + var _r_ = k + 1 | 0; + if(_p_ !== k){var k = _r_; continue;} + break; + } + } + var _q_ = j + 1 | 0; + if(_m_ !== j){var j = _q_; continue;} + break; + } + } + var _n_ = i + 1 | 0; + if(_k_ !== i){var i = _n_; continue;} + break; + } + } + return arr; + } + function of_array$1(kind, layout, data){ + var + dim1 = data.length - 1, + dim2 = 0 === dim1 ? 0 : caml_check_bound(data, 0)[1].length - 1, + dim3 = + 0 === dim2 + ? 0 + : caml_check_bound(caml_check_bound(data, 0)[1], 0)[1].length - 1, + ba = create$2(kind, layout, dim1, dim2, dim3), + ofs = layout ? 1 : 0, + _b_ = dim1 - 1 | 0, + _a_ = 0; + if(_b_ >= 0){ + var i = _a_; + for(;;){ + var row = caml_check_bound(data, i)[1 + i]; + if(row.length - 1 !== dim2) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n); + var _d_ = dim2 - 1 | 0, _c_ = 0; + if(_d_ >= 0){ + var j = _c_; + for(;;){ + var col = caml_check_bound(row, j)[1 + j]; + if(col.length - 1 !== dim3) + caml_call1(Stdlib[1], cst_Bigarray_Array3_of_array_n$0); + var _g_ = dim3 - 1 | 0, _f_ = 0; + if(_g_ >= 0){ + var k = _f_; + for(;;){ + caml_ba_set_3 + (ba, + i + ofs | 0, + j + ofs | 0, + k + ofs | 0, + caml_check_bound(col, k)[1 + k]); + var _i_ = k + 1 | 0; + if(_g_ !== k){var k = _i_; continue;} + break; + } + } + var _h_ = j + 1 | 0; + if(_d_ !== j){var j = _h_; continue;} + break; + } + } + var _e_ = i + 1 | 0; + if(_b_ !== i){var i = _e_; continue;} + break; + } + } + return ba; + } + function array0_of_genarray(a){ + return 0 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array0_of_genarra); + } + function array1_of_genarray(a){ + return 1 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array1_of_genarra); + } + function array2_of_genarray(a){ + return 2 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array2_of_genarra); + } + function array3_of_genarray(a){ + return 3 === caml_ba_num_dims(a) + ? a + : caml_call1(Stdlib[1], cst_Bigarray_array3_of_genarra); + } + function reshape_0(a){return caml_ba_reshape(a, [0]);} + function reshape_1(a, dim1){return caml_ba_reshape(a, [0, dim1]);} + function reshape_2(a, dim1, dim2){ + return caml_ba_reshape(a, [0, dim1, dim2]); + } + function reshape_3(a, dim1, dim2, dim3){ + return caml_ba_reshape(a, [0, dim1, dim2, dim3]); + } + var + Stdlib_Bigarray = + [0, + float32, + float64, + complex32, + complex64, + int8_signed, + int8_unsigned, + int16_signed, + int16_unsigned, + int$0, + int32, + int64, + nativeint, + char$0, + kind_size_in_bytes, + c_layout, + fortran_layout, + [0, init, dims, size_in_bytes], + [0, + create, + of_value, + caml_ba_change_layout, + size_in_bytes$0, + get, + set, + of_value], + [0, + create$0, + init$0, + caml_ba_change_layout, + size_in_bytes$1, + slice, + of_array], + [0, + create$1, + init$1, + caml_ba_change_layout, + size_in_bytes$2, + slice_left, + slice_right, + of_array$0], + [0, + create$2, + init$2, + caml_ba_change_layout, + size_in_bytes$3, + slice_left_1, + slice_right_1, + slice_left_2, + slice_right_2, + of_array$1], + array0_of_genarray, + array1_of_genarray, + array2_of_genarray, + array3_of_genarray, + caml_ba_reshape, + reshape_0, + reshape_1, + reshape_2, + reshape_3]; + runtime.caml_register_global(10, Stdlib_Bigarray, "Stdlib__Bigarray"); + return; + } + (globalThis)); + +//# 17760 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_ba_blit = runtime.caml_ba_blit, + caml_ba_set_1 = runtime.caml_ba_set_1, + caml_bytes_set = runtime.caml_bytes_set, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessequal = runtime.caml_lessequal, + caml_lxm_next = runtime.caml_lxm_next, + caml_mod = runtime.caml_mod, + caml_notequal = runtime.caml_notequal, + caml_sys_random_seed = runtime.caml_sys_random_seed; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib = global_data.Stdlib, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Bytes = global_data.Stdlib__Bytes, + Stdlib_Digest = global_data.Stdlib__Digest, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Bigarray = global_data.Stdlib__Bigarray, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + _j_ = runtime.caml_int64_create_lo_mi_hi(14371852, 15349651, 22696), + _k_ = runtime.caml_int64_create_lo_mi_hi(12230193, 11438743, 35013), + _l_ = runtime.caml_int64_create_lo_mi_hi(1424933, 15549263, 2083), + _m_ = runtime.caml_int64_create_lo_mi_hi(9492471, 4696708, 43520), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_Random_int64 = "Random.int64", + cst_Random_int32 = "Random.int32", + cst_Random_full_int = "Random.full_int", + cst_Random_int = "Random.int", + _a_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0); + function create(param){return caml_call3(Stdlib_Bigarray[19][1], 7, 0, 4);} + function set(s, i1, i2, i3, i4){ + caml_ba_set_1(s, 0, runtime.caml_int64_or(i1, _a_)); + caml_ba_set_1(s, 1, i2); + var i3$0 = caml_notequal(i3, _b_) ? i3 : _e_; + caml_ba_set_1(s, 2, i3$0); + var i4$0 = caml_notequal(i4, _c_) ? i4 : _d_; + return caml_ba_set_1(s, 3, i4$0); + } + function mk(i1, i2, i3, i4){ + var s = create(0); + set(s, i1, i2, i3, i4); + return s; + } + function copy(s){var s$0 = create(0); caml_ba_blit(s, s$0); return s$0;} + function reinit(s, seed){ + var + n = seed.length - 1, + b = runtime.caml_create_bytes((n * 8 | 0) + 1 | 0), + _p_ = n - 1 | 0, + _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var _t_ = caml_int64_of_int32(runtime.caml_check_bound(seed, i)[1 + i]); + caml_call3(Stdlib_Bytes[86], b, i * 8 | 0, _t_); + var _u_ = i + 1 | 0; + if(_p_ !== i){var i = _u_; continue;} + break; + } + } + caml_bytes_set(b, n * 8 | 0, 1); + var d1 = caml_call1(Stdlib_Digest[4], b); + caml_bytes_set(b, n * 8 | 0, 2); + var + d2 = caml_call1(Stdlib_Digest[4], b), + _q_ = caml_call2(Stdlib_String[64], d2, 8), + _r_ = caml_call2(Stdlib_String[64], d2, 0), + _s_ = caml_call2(Stdlib_String[64], d1, 8); + return set(s, caml_call2(Stdlib_String[64], d1, 0), _s_, _r_, _q_); + } + function make(seed){var s = create(0); reinit(s, seed); return s;} + function make_self_init(param){return make(caml_sys_random_seed(0));} + function bits(s){ + return caml_int64_to_int32(caml_lxm_next(s)) & 1073741823; + } + function intaux(s, n){ + for(;;){ + var r = bits(s), v = caml_mod(r, n); + if(((1073741823 - n | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function int$0(s, bound){ + if(1073741823 >= bound && 0 < bound) return intaux(s, bound); + return caml_call1(Stdlib[1], cst_Random_int); + } + function full_int(s, bound){ + if(0 >= bound) return caml_call1(Stdlib[1], cst_Random_full_int); + if(1073741823 >= bound) return intaux(s, bound); + for(;;){ + var + _n_ = Stdlib[19], + r = caml_int64_to_int32(caml_lxm_next(s)) & _n_, + v = caml_mod(r, bound); + if(((Stdlib[19] - bound | 0) + 1 | 0) < (r - v | 0)) continue; + return v; + } + } + function bits32(s){return caml_int64_to_int32(caml_lxm_next(s));} + function int32(s, bound){ + if(caml_lessequal(bound, 0)) + return caml_call1(Stdlib[1], cst_Random_int32); + for(;;){ + var r = bits32(s) >>> 1 | 0, v = caml_mod(r, bound); + if(caml_greaterthan(r - v | 0, (Stdlib_Int32[9] - bound | 0) + 1 | 0)) + continue; + return v; + } + } + var bits64 = caml_lxm_next; + function int64(s, bound){ + if(caml_lessequal(bound, _g_)) + return caml_call1(Stdlib[1], cst_Random_int64); + for(;;){ + var + r = caml_int64_shift_right_unsigne(caml_lxm_next(s), 1), + v = runtime.caml_int64_mod(r, bound); + if + (caml_greaterthan + (caml_int64_sub(r, v), + runtime.caml_int64_add(caml_int64_sub(Stdlib_Int64[9], bound), _f_))) + continue; + return v; + } + } + var + nativebits = + 32 === Stdlib_Nativeint[9] + ? function(s){return bits32(s);} + : function(s){return caml_int64_to_int32(caml_lxm_next(s));}, + nativeint = + 32 === Stdlib_Nativeint[9] + ? function(s, bound){return int32(s, bound);} + : function + (s, bound){ + return caml_int64_to_int32(int64(s, caml_int64_of_int32(bound))); + }; + function float$0(s, bound){ + for(;;){ + var b = caml_lxm_next(s), n = caml_int64_shift_right_unsigne(b, 11); + if(caml_notequal(n, _h_)) + return runtime.caml_int64_to_float(n) * 1.1102230246251565e-16 * bound; + } + } + function bool(s){return runtime.caml_lessthan(caml_lxm_next(s), _i_);} + function split(s){ + var + i1 = caml_lxm_next(s), + i2 = caml_lxm_next(s), + i3 = caml_lxm_next(s), + i4 = caml_lxm_next(s); + return mk(i1, i2, i3, i4); + } + function mk_default(param){return mk(_m_, _l_, _k_, _j_);} + var random_key = caml_call2(Stdlib_Domain[10][1], [0, split], mk_default); + function bits$0(param){ + return bits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function int$1(bound){ + return int$0(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function full_int$0(bound){ + return full_int(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int32$0(bound){ + return int32(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function nativeint$0(bound){ + return nativeint(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function int64$0(bound){ + return int64(caml_call1(Stdlib_Domain[10][2], random_key), bound); + } + function float$1(scale){ + return float$0(caml_call1(Stdlib_Domain[10][2], random_key), scale); + } + function bool$0(param){ + return bool(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits32$0(param){ + return bits32(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function bits64$0(param){ + return caml_lxm_next(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function nativebits$0(param){ + return nativebits(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function full_init(seed){ + return reinit(caml_call1(Stdlib_Domain[10][2], random_key), seed); + } + function init(seed){return full_init([0, seed]);} + function self_init(param){return full_init(caml_sys_random_seed(0));} + function split$0(param){ + return split(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function get_state(param){ + return copy(caml_call1(Stdlib_Domain[10][2], random_key)); + } + function set_state(s){ + return caml_ba_blit(s, caml_call1(Stdlib_Domain[10][2], random_key)); + } + var + Stdlib_Random = + [0, + init, + full_init, + self_init, + bits$0, + int$1, + full_int$0, + int32$0, + nativeint$0, + int64$0, + float$1, + bool$0, + bits32$0, + bits64$0, + nativebits$0, + [0, + make, + make_self_init, + copy, + bits, + int$0, + full_int, + int32, + nativeint, + int64, + float$0, + bool, + bits32, + bits64, + nativebits, + split], + get_state, + set_state, + split$0]; + runtime.caml_register_global(29, Stdlib_Random, "Stdlib__Random"); + return; + } + (globalThis)); + +//# 18037 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_compare = runtime.caml_compare, + caml_hash = runtime.caml_hash, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib = global_data.Stdlib, + Stdlib_Atomic = global_data.Stdlib__Atomic, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array; + global_data.Assert_failure; + var + Stdlib_String = global_data.Stdlib__String, + cst_Hashtbl_unsupported_hash_t = "Hashtbl: unsupported hash table format", + _d_ = [0, 0]; + function ongoing_traversal(h){ + var _aB_ = h.length - 1 < 4 ? 1 : 0, _aC_ = _aB_ || (h[4] < 0 ? 1 : 0); + return _aC_; + } + function flip_ongoing_traversal(h){h[4] = - h[4] | 0; return 0;} + try{var _f_ = caml_sys_getenv("OCAMLRUNPARAM"), params = _f_;} + catch(_az_){ + var _a_ = caml_wrap_exception(_az_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + try{var _e_ = caml_sys_getenv("CAMLRUNPARAM"), _c_ = _e_;} + catch(_aA_){ + var _b_ = caml_wrap_exception(_aA_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var _c_ = cst; + } + var params = _c_; + } + var + randomized_default = caml_call2(Stdlib_String[14], params, 82), + randomized = caml_call1(Stdlib_Atomic[1], randomized_default); + function randomize(param){ + return caml_call2(Stdlib_Atomic[3], randomized, 1); + } + function is_randomized(param){ + return caml_call1(Stdlib_Atomic[2], randomized); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function power_2_above(x, n){ + var x$0 = x; + for(;;){ + if(n <= x$0) return x$0; + if(Stdlib_Sys[13] < (x$0 * 2 | 0)) return x$0; + var x$1 = x$0 * 2 | 0, x$0 = x$1; + } + } + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, initial_size); + if(random) + var + _ay_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _ay_); + else + var seed = 0; + return [0, 0, caml_make_vect(s, 0), seed, s]; + } + function clear(h){ + var _ax_ = 0 < h[1] ? 1 : 0; + return _ax_ + ? (h + [1] + = 0, + caml_call4(Stdlib_Array[7], h[2], 0, h[2].length - 1, 0)) + : _ax_; + } + function reset(h){ + var len = h[2].length - 1; + if(4 <= h.length - 1 && len !== caml_call1(Stdlib[18], h[4])){ + h[1] = 0; + h[2] = caml_make_vect(caml_call1(Stdlib[18], h[4]), 0); + return 0; + } + return clear(h); + } + function copy_bucketlist(param){ + if(! param) return 0; + var + key = param[1], + data = param[2], + next = param[3], + prec$1 = [0, key, data, next], + prec = prec$1, + param$0 = next; + for(;;){ + if(! param$0) return prec$1; + var + key$0 = param$0[1], + data$0 = param$0[2], + next$0 = param$0[3], + prec$0 = [0, key$0, data$0, next$0]; + prec[3] = prec$0; + var prec = prec$0, param$0 = next$0; + } + } + function copy(h){ + var + _au_ = h[4], + _av_ = h[3], + _aw_ = caml_call2(Stdlib_Array[13], copy_bucketlist, h[2]); + return [0, h[1], _aw_, _av_, _au_]; + } + function length(h){return h[1];} + function insert_all_buckets(indexfun, inplace, odata, ndata){ + var + nsize = ndata.length - 1, + ndata_tail = caml_make_vect(nsize, 0), + _ao_ = odata.length - 1 - 1 | 0, + _an_ = 0; + if(_ao_ >= 0){ + var i$0 = _an_; + a: + for(;;){ + var cell$1 = caml_check_bound(odata, i$0)[1 + i$0], cell = cell$1; + for(;;){ + if(cell){ + var + key = cell[1], + data = cell[2], + next = cell[3], + cell$0 = inplace ? cell : [0, key, data, 0], + nidx = caml_call1(indexfun, key), + match = caml_check_bound(ndata_tail, nidx)[1 + nidx]; + if(match) + match[3] = cell$0; + else + caml_check_bound(ndata, nidx)[1 + nidx] = cell$0; + caml_check_bound(ndata_tail, nidx)[1 + nidx] = cell$0; + var cell = next; + continue; + } + var _at_ = i$0 + 1 | 0; + if(_ao_ !== i$0){var i$0 = _at_; continue a;} + break; + } + break; + } + } + if(inplace){ + var _aq_ = nsize - 1 | 0, _ap_ = 0; + if(_aq_ >= 0){ + var i = _ap_; + for(;;){ + var match$0 = caml_check_bound(ndata_tail, i)[1 + i]; + if(match$0) match$0[3] = 0; + var _as_ = i + 1 | 0; + if(_aq_ !== i){var i = _as_; continue;} + break; + } + } + var _ar_ = 0; + } + else + var _ar_ = inplace; + return _ar_; + } + function resize(indexfun, h){ + var + odata = h[2], + osize = odata.length - 1, + nsize = osize * 2 | 0, + _am_ = nsize < Stdlib_Sys[13] ? 1 : 0; + if(! _am_) return _am_; + var ndata = caml_make_vect(nsize, 0), inplace = 1 - ongoing_traversal(h); + h[2] = ndata; + return insert_all_buckets(caml_call1(indexfun, h), inplace, odata, ndata); + } + function iter(f, h){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], _ai_ = d.length - 1 - 1 | 0, _ah_ = 0; + if(_ai_ >= 0){ + var i = _ah_; + a: + for(;;){ + var param = caml_check_bound(d, i)[1 + i]; + for(;;){ + if(param){ + var key = param[1], data = param[2], next = param[3]; + caml_call2(f, key, data); + var param = next; + continue; + } + var _al_ = i + 1 | 0; + if(_ai_ !== i){var i = _al_; continue a;} + break; + } + break; + } + } + var _aj_ = 1 - old_trav, _ak_ = _aj_ ? flip_ongoing_traversal(h) : _aj_; + return _ak_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function filter_map_inplace(f, h){ + var d = h[2], old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var _ad_ = d.length - 1 - 1 | 0, _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + a: + for(;;){ + var slot$0 = caml_check_bound(h[2], i)[1 + i], prec = 0, slot = slot$0; + for(;;){ + if(slot){ + var + key = slot[1], + data = slot[2], + next = slot[3], + match = caml_call2(f, key, data); + if(! match){h[1] = h[1] - 1 | 0; var slot = next; continue;} + var data$0 = match[1]; + if(prec) + prec[3] = slot; + else + caml_check_bound(h[2], i)[1 + i] = slot; + slot[2] = data$0; + var prec = slot, slot = next; + continue; + } + if(prec) prec[3] = 0; else caml_check_bound(h[2], i)[1 + i] = 0; + var _ag_ = i + 1 | 0; + if(_ad_ !== i){var i = _ag_; continue a;} + break; + } + break; + } + } + var _ae_ = 1 - old_trav, _af_ = _ae_ ? flip_ongoing_traversal(h) : _ae_; + return _af_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function fold(f, h, init){ + var old_trav = ongoing_traversal(h); + if(1 - old_trav) flip_ongoing_traversal(h); + try{ + var d = h[2], accu$1 = [0, init], _$_ = d.length - 1 - 1 | 0, ___ = 0; + if(_$_ >= 0){ + var i = ___; + a: + for(;;){ + var + accu$2 = accu$1[1], + b$0 = caml_check_bound(d, i)[1 + i], + b = b$0, + accu = accu$2; + for(;;){ + if(b){ + var + key = b[1], + data = b[2], + next = b[3], + accu$0 = caml_call3(f, key, data, accu), + b = next, + accu = accu$0; + continue; + } + accu$1[1] = accu; + var _ab_ = i + 1 | 0; + if(_$_ !== i){var i = _ab_; continue a;} + break; + } + break; + } + } + if(1 - old_trav) flip_ongoing_traversal(h); + var _aa_ = accu$1[1]; + return _aa_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(old_trav) throw caml_maybe_attach_backtrace(exn, 0); + flip_ongoing_traversal(h); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + next = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = next; + } + } + function stats(h){ + var _U_ = h[2], _V_ = 0; + function _W_(m, b){ + var _Z_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _Z_); + } + var + mbl = caml_call3(Stdlib_Array[15], _W_, _V_, _U_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _X_ = h[2]; + function _Y_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _Y_, _X_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function to_seq(tbl){ + var tbl_data = tbl[2]; + function aux(i, buck, param){ + var i$0 = i, buck$0 = buck; + for(;;){ + if(buck$0){ + var key = buck$0[1], data = buck$0[2], next = buck$0[3]; + return [0, [0, key, data], function(_T_){return aux(i$0, next, _T_);}]; + } + if(i$0 === tbl_data.length - 1) return 0; + var + buck$1 = caml_check_bound(tbl_data, i$0)[1 + i$0], + i$1 = i$0 + 1 | 0, + i$0 = i$1, + buck$0 = buck$1; + } + } + var _Q_ = 0, _R_ = 0; + return function(_S_){return aux(_R_, _Q_, _S_);}; + } + function to_seq_keys(m){ + var _N_ = to_seq(m); + function _O_(_P_){return _P_[1];} + return caml_call2(Stdlib_Seq[27], _O_, _N_); + } + function to_seq_values(m){ + var _K_ = to_seq(m); + function _L_(_M_){return _M_[2];} + return caml_call2(Stdlib_Seq[27], _L_, _K_); + } + function MakeSeeded(H){ + function key_index(h, key){ + var _J_ = h[2].length - 1 - 1 | 0; + return caml_call2(H[2], h[3], key) & _J_; + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _I_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _I_ ? resize(key_index, h) : _I_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(caml_call2(H[1], k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var + _H_ = key_index(h, key), + match = caml_check_bound(h[2], _H_)[1 + _H_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var + _G_ = key_index(h, key), + match = caml_check_bound(h[2], _G_)[1 + _G_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(caml_call2(H[1], key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(caml_call2(H[1], key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(caml_call2(H[1], key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(caml_call2(H[1], key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], d = param$0[2], next = param$0[3]; + if(caml_call2(H[1], k, key)) return [0, d, find_in_bucket(next)]; + var param$0 = next; + } + } + var _F_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _F_)[1 + _F_]); + } + function replace(h, key, data){ + var + i = key_index(h, key), + l = caml_check_bound(h[2], i)[1 + i], + slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(! caml_call2(H[1], k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _C_ = 0; + } + else + var _C_ = 1; + if(_C_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _D_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_D_) return resize(key_index, h); + var _E_ = _D_; + } + else + var _E_ = _C_; + return _E_; + } + } + function mem(h, key){ + var + _B_ = key_index(h, key), + param = caml_check_bound(h[2], _B_)[1 + _B_]; + for(;;){ + if(! param) return 0; + var k = param[1], next = param[3], _A_ = caml_call2(H[1], k, key); + if(_A_) return _A_; + var param = next; + } + } + function add_seq(tbl, i){ + function _z_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _z_, i); + } + function replace_seq(tbl, i){ + function _y_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _y_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + iter = include[12], + filter_map_inplace = include[13], + fold = include[14], + length = include[15], + stats = include[16], + to_seq = include[17], + to_seq_keys = include[18], + to_seq_values = include[19], + add_seq = include[20], + replace_seq = include[21], + _x_ = include[1]; + function create(sz){return caml_call2(_x_, _d_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + iter, + filter_map_inplace, + fold, + length, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq]; + } + function hash(x){return caml_hash(10, 100, 0, x);} + function hash_param(n1, n2, x){return caml_hash(n1, n2, 0, x);} + function seeded_hash(seed, x){return caml_hash(10, 100, seed, x);} + function key_index(h, key){ + return 4 <= h.length - 1 + ? caml_hash(10, 100, h[3], key) & (h[2].length - 1 - 1 | 0) + : caml_call1(Stdlib[1], cst_Hashtbl_unsupported_hash_t); + } + function add(h, key, data){ + var + i = key_index(h, key), + bucket = [0, key, data, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _w_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _w_ ? resize(key_index, h) : _w_; + } + function remove(h, key){ + var + i = key_index(h, key), + c = caml_check_bound(h[2], i)[1 + i], + prec$0 = 0, + prec = c; + for(;;){ + if(! prec) return 0; + var k = prec[1], next = prec[3]; + if(0 === caml_compare(k, key)){ + h[1] = h[1] - 1 | 0; + return prec$0 + ? (prec$0[3] = next, 0) + : (caml_check_bound(h[2], i)[1 + i] = next, 0); + } + var prec$0 = prec, prec = next; + } + } + function find(h, key){ + var _v_ = key_index(h, key), match = caml_check_bound(h[2], _v_)[1 + _v_]; + if(! match) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return d1; + if(! next1) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return d2; + if(! next2) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return d3; + var param = next3; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return data; + var param = next; + } + } + function find_opt(h, key){ + var _u_ = key_index(h, key), match = caml_check_bound(h[2], _u_)[1 + _u_]; + if(! match) return 0; + var k1 = match[1], d1 = match[2], next1 = match[3]; + if(0 === caml_compare(key, k1)) return [0, d1]; + if(! next1) return 0; + var k2 = next1[1], d2 = next1[2], next2 = next1[3]; + if(0 === caml_compare(key, k2)) return [0, d2]; + if(! next2) return 0; + var k3 = next2[1], d3 = next2[2], next3 = next2[3]; + if(0 === caml_compare(key, k3)) return [0, d3]; + var param = next3; + for(;;){ + if(! param) return 0; + var k = param[1], data = param[2], next = param[3]; + if(0 === caml_compare(key, k)) return [0, data]; + var param = next; + } + } + function find_all(h, key){ + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var k = param$0[1], data = param$0[2], next = param$0[3]; + if(0 === caml_compare(k, key)) return [0, data, find_in_bucket(next)]; + var param$0 = next; + } + } + var _t_ = key_index(h, key); + return find_in_bucket(caml_check_bound(h[2], _t_)[1 + _t_]); + } + function replace(h, key, data){ + var i = key_index(h, key), l = caml_check_bound(h[2], i)[1 + i], slot = l; + for(;;){ + if(slot){ + var k = slot[1], next = slot[3]; + if(0 !== caml_compare(k, key)){var slot = next; continue;} + slot[1] = key; + slot[2] = data; + var _q_ = 0; + } + else + var _q_ = 1; + if(_q_){ + caml_check_bound(h[2], i)[1 + i] = [0, key, data, l]; + h[1] = h[1] + 1 | 0; + var _r_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + if(_r_) return resize(key_index, h); + var _s_ = _r_; + } + else + var _s_ = _q_; + return _s_; + } + } + function mem(h, key){ + var _p_ = key_index(h, key), param = caml_check_bound(h[2], _p_)[1 + _p_]; + for(;;){ + if(! param) return 0; + var + k = param[1], + next = param[3], + _o_ = 0 === caml_compare(k, key) ? 1 : 0; + if(_o_) return _o_; + var param = next; + } + } + function add_seq(tbl, i){ + function _n_(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _n_, i); + } + function replace_seq(tbl, i){ + function _m_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _m_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + function rebuild(opt, h){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Atomic[2], randomized); + var s = power_2_above(16, h[2].length - 1); + if(random) + var + _g_ = caml_call1(Stdlib_Domain[10][2], prng_key), + seed = caml_call1(Stdlib_Random[15][4], _g_); + else + var seed = 4 <= h.length - 1 ? h[3] : 0; + var + _h_ = 4 <= h.length - 1 ? h[4] : s, + h$0 = [0, h[1], caml_make_vect(s, 0), seed, _h_], + _i_ = h$0[2], + _j_ = h[2], + _k_ = 0; + insert_all_buckets + (function(_l_){return key_index(h$0, _l_);}, _k_, _j_, _i_); + return h$0; + } + var + Stdlib_Hashtbl = + [0, + create, + clear, + reset, + copy, + add, + find, + find_opt, + find_all, + mem, + remove, + replace, + iter, + filter_map_inplace, + fold, + length, + randomize, + is_randomized, + rebuild, + stats, + to_seq, + to_seq_keys, + to_seq_values, + add_seq, + replace_seq, + of_seq, + Make, + MakeSeeded, + hash, + seeded_hash, + hash_param, + caml_hash]; + runtime.caml_register_global(16, Stdlib_Hashtbl, "Stdlib__Hashtbl"); + return; + } + (globalThis)); + +//# 19349 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$16 = "", + cst$15 = ">", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$14 = ".", + cst$11 = cst$15, + cst$12 = "<\/", + cst$13 = cst$16, + cst$8 = cst$15, + cst$9 = "<", + cst$10 = cst$16, + cst$7 = "\n", + cst$3 = cst$16, + cst$4 = cst$16, + cst$5 = cst$16, + cst$6 = cst$16, + cst = cst$16, + cst$0 = cst$16, + cst$1 = cst$16, + cst$2 = cst$16, + Stdlib_Queue = global_data.Stdlib__Queue, + CamlinternalFormat = global_data.CamlinternalFormat, + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _f_ = [3, 0, 3], + cst_Format_pp_set_geometry = "Format.pp_set_geometry: ", + _e_ = [1, "max_indent < 2"], + _c_ = [1, "margin <= max_indent"], + _d_ = [0, 0], + _b_ = [0, cst$16], + _a_ = [0, cst$16, 0, cst$16], + cst_Stdlib_Format_String_tag = "Stdlib.Format.String_tag"; + function id(x){return x;} + var + String_tag = + [248, cst_Stdlib_Format_String_tag, runtime.caml_fresh_oo_id(0)], + zero = 0, + unknown = -1; + function pp_enqueue(state, token){ + state[13] = state[13] + token[3] | 0; + return caml_call2(Stdlib_Queue[3], token, state[28]); + } + var pp_infinity = 1000000010; + function pp_output_string(state, s){ + return caml_call3(state[17], s, 0, caml_ml_string_length(s)); + } + function pp_output_newline(state){return caml_call1(state[19], 0);} + function format_pp_text(state, size, text){ + state[9] = state[9] - size | 0; + pp_output_string(state, text); + state[11] = 0; + return 0; + } + function format_string(state, s){ + var _bQ_ = runtime.caml_string_notequal(s, cst$16); + return _bQ_ ? format_pp_text(state, caml_ml_string_length(s), s) : _bQ_; + } + function break_new_line(state, param, width){ + var after = param[3], offset = param[2], before = param[1]; + format_string(state, before); + pp_output_newline(state); + state[11] = 1; + var + indent = (state[6] - width | 0) + offset | 0, + real_indent = caml_call2(Stdlib_Int[10], state[8], indent); + state[10] = real_indent; + state[9] = state[6] - state[10] | 0; + var n = state[10]; + caml_call1(state[21], n); + return format_string(state, after); + } + function break_line(state, width){ + return break_new_line(state, _a_, width); + } + function break_same_line(state, param){ + var after = param[3], width = param[2], before = param[1]; + format_string(state, before); + state[9] = state[9] - width | 0; + caml_call1(state[20], width); + return format_string(state, after); + } + function format_pp_token(state, size$0, param){ + if(typeof param === "number") + switch(param){ + case 0: + var match$3 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$3) return 0; + var + tabs = match$3[1][1], + add_tab = + function(n, ls){ + if(! ls) return [0, n, 0]; + var l = ls[2], x = ls[1]; + return runtime.caml_lessthan(n, x) + ? [0, n, ls] + : [0, x, add_tab(n, l)]; + }; + tabs[1] = add_tab(state[6] - state[9] | 0, tabs[1]); + return 0; + case 1: + caml_call1(Stdlib_Stack[5], state[2]); return 0; + case 2: + caml_call1(Stdlib_Stack[5], state[3]); return 0; + case 3: + var match$4 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$4) return pp_output_newline(state); + var width$0 = match$4[1][2]; + return break_line(state, width$0); + case 4: + var _bO_ = state[10] !== (state[6] - state[9] | 0) ? 1 : 0; + if(! _bO_) return _bO_; + var match$1 = caml_call1(Stdlib_Queue[6], state[28]); + if(! match$1) return 0; + var match$2 = match$1[1], size = match$2[1], length = match$2[3]; + state[12] = state[12] - length | 0; + state[9] = state[9] + size | 0; + return 0; + default: + var match$5 = caml_call1(Stdlib_Stack[5], state[5]); + if(! match$5) return 0; + var tag_name = match$5[1], marker = caml_call1(state[25], tag_name); + return pp_output_string(state, marker); + } + switch(param[0]){ + case 0: + var s = param[1]; return format_pp_text(state, size$0, s); + case 1: + var + breaks = param[2], + fits = param[1], + off = breaks[2], + before = breaks[1], + match$6 = caml_call1(Stdlib_Stack[7], state[2]); + if(! match$6) return 0; + var + match$7 = match$6[1], + width$1 = match$7[2], + box_type$0 = match$7[1]; + switch(box_type$0){ + case 0: + return break_same_line(state, fits); + case 1: + return break_new_line(state, breaks, width$1); + case 2: + return break_new_line(state, breaks, width$1); + case 3: + return state[9] < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + case 4: + return state[11] + ? break_same_line(state, fits) + : state + [9] + < (size$0 + caml_ml_string_length(before) | 0) + ? break_new_line(state, breaks, width$1) + : ((state + [6] + - width$1 + | 0) + + off + | 0) + < state[10] + ? break_new_line(state, breaks, width$1) + : break_same_line(state, fits); + default: return break_same_line(state, fits); + } + case 2: + var + off$0 = param[2], + n = param[1], + insertion_point = state[6] - state[9] | 0, + match$8 = caml_call1(Stdlib_Stack[7], state[3]); + if(! match$8) return 0; + var tabs$0 = match$8[1][1], match$9 = tabs$0[1]; + if(match$9){ + var first = match$9[1], param$0 = tabs$0[1]; + for(;;){ + if(param$0){ + var tail = param$0[2], head = param$0[1]; + if(insertion_point > head){var param$0 = tail; continue;} + var _bP_ = head; + } + else + var _bP_ = first; + var tab = _bP_; + break; + } + } + else + var tab = insertion_point; + var offset = tab - insertion_point | 0; + return 0 <= offset + ? break_same_line(state, [0, cst$0, offset + n | 0, cst]) + : break_new_line + (state, [0, cst$2, tab + off$0 | 0, cst$1], state[6]); + case 3: + var + ty = param[2], + off$1 = param[1], + insertion_point$0 = state[6] - state[9] | 0; + if(state[8] < insertion_point$0){ + var match = caml_call1(Stdlib_Stack[7], state[2]); + if(match){ + var match$0 = match[1], width = match$0[2], box_type = match$0[1]; + if(state[9] < width && 3 >= box_type - 1 >>> 0) + break_line(state, width); + } + else + pp_output_newline(state); + } + var + width$2 = state[9] - off$1 | 0, + box_type$1 = 1 === ty ? 1 : state[9] < size$0 ? ty : 5; + return caml_call2(Stdlib_Stack[3], [0, box_type$1, width$2], state[2]); + case 4: + var tbox = param[1]; + return caml_call2(Stdlib_Stack[3], tbox, state[3]); + default: + var + tag_name$0 = param[1], + marker$0 = caml_call1(state[24], tag_name$0); + pp_output_string(state, marker$0); + return caml_call2(Stdlib_Stack[3], tag_name$0, state[5]); + } + } + function advance_left(state){ + for(;;){ + var match = caml_call1(Stdlib_Queue[9], state[28]); + if(! match) return 0; + var + match$0 = match[1], + size = match$0[1], + length = match$0[3], + token = match$0[2], + pending_count = state[13] - state[12] | 0, + _bM_ = 0 <= size ? 1 : 0, + _bN_ = _bM_ || (state[9] <= pending_count ? 1 : 0); + if(! _bN_) return _bN_; + caml_call1(Stdlib_Queue[5], state[28]); + var size$0 = 0 <= size ? size : pp_infinity; + format_pp_token(state, size$0, token); + state[12] = length + state[12] | 0; + } + } + function enqueue_advance(state, tok){ + pp_enqueue(state, tok); + return advance_left(state); + } + function enqueue_string_as(state, size, s){ + return enqueue_advance(state, [0, size, [0, s], size]); + } + function initialize_scan_stack(stack){ + caml_call1(Stdlib_Stack[8], stack); + var queue_elem = [0, unknown, _b_, 0]; + return caml_call2(Stdlib_Stack[3], [0, -1, queue_elem], stack); + } + function set_size(state, ty){ + var match = caml_call1(Stdlib_Stack[7], state[1]); + if(! match) return 0; + var + match$0 = match[1], + queue_elem = match$0[2], + left_total = match$0[1], + size = queue_elem[1]; + if(left_total < state[12]) return initialize_scan_stack(state[1]); + var _bI_ = queue_elem[2]; + if(typeof _bI_ !== "number") + switch(_bI_[0]){ + case 3: + var + _bK_ = 1 - ty, + _bL_ = + _bK_ + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : _bK_; + return _bL_; + case 1: + case 2: + var + _bJ_ = + ty + ? (queue_elem + [1] + = state[13] + size | 0, + caml_call1(Stdlib_Stack[5], state[1]), + 0) + : ty; + return _bJ_; + } + return 0; + } + function scan_push(state, b, token){ + pp_enqueue(state, token); + if(b) set_size(state, 1); + var elem = [0, state[13], token]; + return caml_call2(Stdlib_Stack[3], elem, state[1]); + } + function pp_open_box_gen(state, indent, br_ty){ + state[14] = state[14] + 1 | 0; + if(state[14] < state[15]){ + var size = - state[13] | 0, elem = [0, size, [3, indent, br_ty], 0]; + return scan_push(state, 0, elem); + } + var _bH_ = state[14] === state[15] ? 1 : 0; + if(! _bH_) return _bH_; + var s = state[16]; + return enqueue_string_as(state, caml_ml_string_length(s), s); + } + function pp_close_box(state, param){ + var _bF_ = 1 < state[14] ? 1 : 0; + if(_bF_){ + if(state[14] < state[15]){ + pp_enqueue(state, [0, zero, 1, 0]); + set_size(state, 1); + set_size(state, 0); + } + state[14] = state[14] - 1 | 0; + var _bG_ = 0; + } + else + var _bG_ = _bF_; + return _bG_; + } + function pp_open_stag(state, tag_name){ + if(state[22]){ + caml_call2(Stdlib_Stack[3], tag_name, state[4]); + caml_call1(state[26], tag_name); + } + var _bE_ = state[23]; + if(! _bE_) return _bE_; + var token = [5, tag_name]; + return pp_enqueue(state, [0, zero, token, 0]); + } + function pp_close_stag(state, param){ + if(state[23]) pp_enqueue(state, [0, zero, 5, 0]); + var _bC_ = state[22]; + if(_bC_){ + var match = caml_call1(Stdlib_Stack[5], state[4]); + if(match){ + var tag_name = match[1]; + return caml_call1(state[27], tag_name); + } + var _bD_ = 0; + } + else + var _bD_ = _bC_; + return _bD_; + } + function pp_set_print_tags(state, b){state[22] = b; return 0;} + function pp_set_mark_tags(state, b){state[23] = b; return 0;} + function pp_get_print_tags(state, param){return state[22];} + function pp_get_mark_tags(state, param){return state[23];} + function pp_set_tags(state, b){ + pp_set_print_tags(state, b); + return pp_set_mark_tags(state, b); + } + function pp_get_formatter_stag_function(state, param){ + return [0, state[24], state[25], state[26], state[27]]; + } + function pp_set_formatter_stag_function(state, param){ + var pct = param[4], pot = param[3], mct = param[2], mot = param[1]; + state[24] = mot; + state[25] = mct; + state[26] = pot; + state[27] = pct; + return 0; + } + function pp_rinit(state){ + state[12] = 1; + state[13] = 1; + caml_call1(Stdlib_Queue[11], state[28]); + initialize_scan_stack(state[1]); + caml_call1(Stdlib_Stack[8], state[2]); + caml_call1(Stdlib_Stack[8], state[3]); + caml_call1(Stdlib_Stack[8], state[4]); + caml_call1(Stdlib_Stack[8], state[5]); + state[10] = 0; + state[14] = 0; + state[9] = state[6]; + return pp_open_box_gen(state, 0, 3); + } + function pp_flush_queue(state, b){ + var _bA_ = state[4]; + function _bB_(param){return pp_close_stag(state, 0);} + caml_call2(Stdlib_Stack[12], _bB_, _bA_); + for(;;){ + if(1 < state[14]){pp_close_box(state, 0); continue;} + state[13] = pp_infinity; + advance_left(state); + if(b) pp_output_newline(state); + return pp_rinit(state); + } + } + function pp_print_as_size(state, size, s){ + var _bz_ = state[14] < state[15] ? 1 : 0; + return _bz_ ? enqueue_string_as(state, size, s) : _bz_; + } + function pp_print_as(state, isize, s){ + return pp_print_as_size(state, isize, s); + } + function pp_print_string(state, s){ + return pp_print_as(state, caml_ml_string_length(s), s); + } + function pp_print_bytes(state, s){ + return pp_print_as + (state, + runtime.caml_ml_bytes_length(s), + caml_call1(Stdlib_Bytes[6], s)); + } + function pp_print_int(state, i){ + return pp_print_string(state, caml_call1(Stdlib_Int[12], i)); + } + function pp_print_float(state, f){ + return pp_print_string(state, caml_call1(Stdlib[35], f)); + } + function pp_print_bool(state, b){ + return pp_print_string(state, caml_call1(Stdlib[30], b)); + } + function pp_print_char(state, c){ + return pp_print_as(state, 1, caml_call2(Stdlib_String[1], 1, c)); + } + function pp_open_hbox(state, param){return pp_open_box_gen(state, 0, 0);} + function pp_open_vbox(state, indent){ + return pp_open_box_gen(state, indent, 1); + } + function pp_open_hvbox(state, indent){ + return pp_open_box_gen(state, indent, 2); + } + function pp_open_hovbox(state, indent){ + return pp_open_box_gen(state, indent, 3); + } + function pp_open_box(state, indent){ + return pp_open_box_gen(state, indent, 4); + } + function pp_print_newline(state, param){ + pp_flush_queue(state, 1); + return caml_call1(state[18], 0); + } + function pp_print_flush(state, param){ + pp_flush_queue(state, 0); + return caml_call1(state[18], 0); + } + function pp_force_newline(state, param){ + var _by_ = state[14] < state[15] ? 1 : 0; + return _by_ ? enqueue_advance(state, [0, zero, 3, 0]) : _by_; + } + function pp_print_if_newline(state, param){ + var _bx_ = state[14] < state[15] ? 1 : 0; + return _bx_ ? enqueue_advance(state, [0, zero, 4, 0]) : _bx_; + } + function pp_print_custom_break(state, fits, breaks){ + var + after = fits[3], + width = fits[2], + before = fits[1], + _bw_ = state[14] < state[15] ? 1 : 0; + if(! _bw_) return _bw_; + var + size = - state[13] | 0, + token = [1, fits, breaks], + length = + (caml_ml_string_length(before) + width | 0) + + caml_ml_string_length(after) + | 0, + elem = [0, size, token, length]; + return scan_push(state, 1, elem); + } + function pp_print_break(state, width, offset){ + return pp_print_custom_break + (state, [0, cst$6, width, cst$5], [0, cst$4, offset, cst$3]); + } + function pp_print_space(state, param){return pp_print_break(state, 1, 0);} + function pp_print_cut(state, param){return pp_print_break(state, 0, 0);} + function pp_open_tbox(state, param){ + state[14] = state[14] + 1 | 0; + var _bv_ = state[14] < state[15] ? 1 : 0; + if(! _bv_) return _bv_; + var elem = [0, zero, [4, [0, [0, 0]]], 0]; + return enqueue_advance(state, elem); + } + function pp_close_tbox(state, param){ + var _bs_ = 1 < state[14] ? 1 : 0; + if(_bs_){ + var _bt_ = state[14] < state[15] ? 1 : 0; + if(_bt_){ + var elem = [0, zero, 2, 0]; + enqueue_advance(state, elem); + state[14] = state[14] - 1 | 0; + var _bu_ = 0; + } + else + var _bu_ = _bt_; + } + else + var _bu_ = _bs_; + return _bu_; + } + function pp_print_tbreak(state, width, offset){ + var _br_ = state[14] < state[15] ? 1 : 0; + if(! _br_) return _br_; + var size = - state[13] | 0, elem = [0, size, [2, width, offset], width]; + return scan_push(state, 1, elem); + } + function pp_print_tab(state, param){return pp_print_tbreak(state, 0, 0);} + function pp_set_tab(state, param){ + var _bq_ = state[14] < state[15] ? 1 : 0; + if(! _bq_) return _bq_; + var elem = [0, zero, 0, 0]; + return enqueue_advance(state, elem); + } + function pp_set_max_boxes(state, n){ + var _bo_ = 1 < n ? 1 : 0, _bp_ = _bo_ ? (state[15] = n, 0) : _bo_; + return _bp_; + } + function pp_get_max_boxes(state, param){return state[15];} + function pp_over_max_boxes(state, param){return state[14] === state[15] ? 1 : 0; + } + function pp_set_ellipsis_text(state, s){state[16] = s; return 0;} + function pp_get_ellipsis_text(state, param){return state[16];} + function pp_limit(n){return n < 1000000010 ? n : 1000000009;} + function pp_set_max_indent(state, n$0){ + var _bn_ = 1 < n$0 ? 1 : 0; + if(! _bn_) return _bn_; + var n$1 = state[6] - n$0 | 0, _bm_ = 1 <= n$1 ? 1 : 0; + if(! _bm_) return _bm_; + var n = pp_limit(n$1); + state[7] = n; + state[8] = state[6] - state[7] | 0; + return pp_rinit(state); + } + function pp_get_max_indent(state, param){return state[8];} + function pp_set_margin(state, n){ + var _bk_ = 1 <= n ? 1 : 0; + if(! _bk_) return _bk_; + var n$0 = pp_limit(n); + state[6] = n$0; + if(state[8] <= state[6]) + var new_max_indent = state[8]; + else + var + _bl_ = + caml_call2(Stdlib_Int[11], state[6] - state[7] | 0, state[6] / 2 | 0), + new_max_indent = caml_call2(Stdlib_Int[11], _bl_, 1); + return pp_set_max_indent(state, new_max_indent); + } + function validate_geometry(param){ + var margin = param[2], max_indent = param[1]; + return 2 <= max_indent ? margin <= max_indent ? _c_ : _d_ : _e_; + } + function check_geometry(geometry){ + return 0 === validate_geometry(geometry)[0] ? 1 : 0; + } + function pp_get_margin(state, param){return state[6];} + function pp_set_full_geometry(state, param){ + var margin = param[2], max_indent = param[1]; + pp_set_margin(state, margin); + pp_set_max_indent(state, max_indent); + return 0; + } + function pp_set_geometry(state, max_indent, margin){ + var + geometry = [0, max_indent, margin], + match = validate_geometry(geometry); + if(0 === match[0]) return pp_set_full_geometry(state, geometry); + var + msg = match[1], + _bj_ = caml_call2(Stdlib[28], cst_Format_pp_set_geometry, msg); + throw caml_maybe_attach_backtrace([0, Stdlib[6], _bj_], 1); + } + function pp_safe_set_geometry(state, max_indent, margin){ + var geometry = [0, max_indent, margin]; + return 0 === validate_geometry(geometry)[0] + ? pp_set_full_geometry(state, geometry) + : 0; + } + function pp_get_geometry(state, param){return [0, state[8], state[6]];} + function pp_update_geometry(state, update){ + var geometry = pp_get_geometry(state, 0); + return pp_set_full_geometry(state, caml_call1(update, geometry)); + } + function pp_set_formatter_out_functions(state, param){ + var j = param[5], i = param[4], h = param[3], g = param[2], f = param[1]; + state[17] = f; + state[18] = g; + state[19] = h; + state[20] = i; + state[21] = j; + return 0; + } + function pp_get_formatter_out_functions(state, param){ + return [0, state[17], state[18], state[19], state[20], state[21]]; + } + function pp_set_formatter_output_functi(state, f, g){state[17] = f; state[18] = g; return 0; + } + function pp_get_formatter_output_functi(state, param){return [0, state[17], state[18]]; + } + function display_newline(state, param){ + return caml_call3(state[17], cst$7, 0, 1); + } + var blank_line = caml_call2(Stdlib_String[1], 80, 32); + function display_blanks(state, n){ + var n$0 = n; + for(;;){ + var _bi_ = 0 < n$0 ? 1 : 0; + if(! _bi_) return _bi_; + if(80 >= n$0) return caml_call3(state[17], blank_line, 0, n$0); + caml_call3(state[17], blank_line, 0, 80); + var n$1 = n$0 - 80 | 0, n$0 = n$1; + } + } + function pp_set_formatter_out_channel(state, oc){ + state[17] = caml_call1(Stdlib[69], oc); + state[18] = function(param){return caml_call1(Stdlib[63], oc);}; + state[19] = function(_bh_){return display_newline(state, _bh_);}; + state[20] = function(_bg_){return display_blanks(state, _bg_);}; + state[21] = function(_bf_){return display_blanks(state, _bf_);}; + return 0; + } + function default_pp_mark_open_tag(param){ + if(param[1] !== String_tag) return cst$10; + var s = param[2], _be_ = caml_call2(Stdlib[28], s, cst$8); + return caml_call2(Stdlib[28], cst$9, _be_); + } + function default_pp_mark_close_tag(param){ + if(param[1] !== String_tag) return cst$13; + var s = param[2], _bd_ = caml_call2(Stdlib[28], s, cst$11); + return caml_call2(Stdlib[28], cst$12, _bd_); + } + function default_pp_print_open_tag(_bc_){return 0;} + function default_pp_print_close_tag(_bb_){return 0;} + function pp_make_formatter(f, g, h, i, j){ + var + pp_queue = caml_call1(Stdlib_Queue[2], 0), + sys_tok = [0, unknown, _f_, 0]; + caml_call2(Stdlib_Queue[3], sys_tok, pp_queue); + var scan_stack = caml_call1(Stdlib_Stack[2], 0); + initialize_scan_stack(scan_stack); + caml_call2(Stdlib_Stack[3], [0, 1, sys_tok], scan_stack); + var + _a9_ = Stdlib[19], + _a__ = caml_call1(Stdlib_Stack[2], 0), + _a$_ = caml_call1(Stdlib_Stack[2], 0), + _ba_ = caml_call1(Stdlib_Stack[2], 0); + return [0, + scan_stack, + caml_call1(Stdlib_Stack[2], 0), + _ba_, + _a$_, + _a__, + 78, + 10, + 68, + 78, + 0, + 1, + 1, + 1, + 1, + _a9_, + cst$14, + f, + g, + h, + i, + j, + 0, + 0, + default_pp_mark_open_tag, + default_pp_mark_close_tag, + default_pp_print_open_tag, + default_pp_print_close_tag, + pp_queue]; + } + function formatter_of_out_functions(out_funs){ + return pp_make_formatter + (out_funs[1], out_funs[2], out_funs[3], out_funs[4], out_funs[5]); + } + function make_formatter(output, flush){ + function _a1_(_a8_){return 0;} + function _a2_(_a7_){return 0;} + var + ppf = + pp_make_formatter(output, flush, function(_a6_){return 0;}, _a2_, _a1_); + ppf[19] = function(_a5_){return display_newline(ppf, _a5_);}; + ppf[20] = function(_a4_){return display_blanks(ppf, _a4_);}; + ppf[21] = function(_a3_){return display_blanks(ppf, _a3_);}; + return ppf; + } + function formatter_of_out_channel(oc){ + function _a0_(param){return caml_call1(Stdlib[63], oc);} + return make_formatter(caml_call1(Stdlib[69], oc), _a0_); + } + function formatter_of_buffer(b){ + function _aY_(_aZ_){return 0;} + return make_formatter(caml_call1(Stdlib_Buffer[18], b), _aY_); + } + var pp_buffer_size = 512; + function pp_make_buffer(param){ + return caml_call1(Stdlib_Buffer[1], pp_buffer_size); + } + var + stdbuf = pp_make_buffer(0), + std_formatter = formatter_of_out_channel(Stdlib[39]), + err_formatter = formatter_of_out_channel(Stdlib[40]), + str_formatter = formatter_of_buffer(stdbuf), + stdbuf_key = caml_call2(Stdlib_Domain[10][1], 0, pp_make_buffer); + caml_call2(Stdlib_Domain[10][3], stdbuf_key, stdbuf); + function _g_(param){ + return formatter_of_buffer(caml_call1(Stdlib_Domain[10][2], stdbuf_key)); + } + var str_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _g_); + caml_call2(Stdlib_Domain[10][3], str_formatter_key, str_formatter); + function buffered_out_string(key, str, ofs, len){ + var _aX_ = caml_call1(Stdlib_Domain[10][2], key); + return caml_call4(Stdlib_Buffer[18], _aX_, str, ofs, len); + } + function buffered_out_flush(oc, key, param){ + var + buf = caml_call1(Stdlib_Domain[10][2], key), + len = caml_call1(Stdlib_Buffer[7], buf), + str = caml_call1(Stdlib_Buffer[2], buf); + caml_call4(Stdlib[69], oc, str, 0, len); + caml_call1(Stdlib[63], oc); + return caml_call1(Stdlib_Buffer[8], buf); + } + function _h_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var std_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _h_); + function _i_(param){return caml_call1(Stdlib_Buffer[1], pp_buffer_size);} + var err_buf_key = caml_call2(Stdlib_Domain[10][1], 0, _i_); + function _j_(param){ + function _aG_(_aW_){return 0;} + function _aH_(_aV_){return 0;} + function _aI_(_aU_){return 0;} + var _aJ_ = Stdlib[39]; + function _aK_(_aT_){return buffered_out_flush(_aJ_, std_buf_key, _aT_);} + var + ppf = + pp_make_formatter + (function(_aQ_, _aR_, _aS_){ + return buffered_out_string(std_buf_key, _aQ_, _aR_, _aS_); + }, + _aK_, + _aI_, + _aH_, + _aG_); + ppf[19] = function(_aP_){return display_newline(ppf, _aP_);}; + ppf[20] = function(_aO_){return display_blanks(ppf, _aO_);}; + ppf[21] = function(_aN_){return display_blanks(ppf, _aN_);}; + function _aL_(_aM_){return pp_print_flush(ppf, _aM_);} + caml_call1(Stdlib_Domain[6], _aL_); + return ppf; + } + var std_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _j_); + caml_call2(Stdlib_Domain[10][3], std_formatter_key, std_formatter); + function _k_(param){ + function _ap_(_aF_){return 0;} + function _aq_(_aE_){return 0;} + function _ar_(_aD_){return 0;} + var _as_ = Stdlib[40]; + function _at_(_aC_){return buffered_out_flush(_as_, err_buf_key, _aC_);} + var + ppf = + pp_make_formatter + (function(_az_, _aA_, _aB_){ + return buffered_out_string(err_buf_key, _az_, _aA_, _aB_); + }, + _at_, + _ar_, + _aq_, + _ap_); + ppf[19] = function(_ay_){return display_newline(ppf, _ay_);}; + ppf[20] = function(_ax_){return display_blanks(ppf, _ax_);}; + ppf[21] = function(_aw_){return display_blanks(ppf, _aw_);}; + function _au_(_av_){return pp_print_flush(ppf, _av_);} + caml_call1(Stdlib_Domain[6], _au_); + return ppf; + } + var err_formatter_key = caml_call2(Stdlib_Domain[10][1], 0, _k_); + caml_call2(Stdlib_Domain[10][3], err_formatter_key, err_formatter); + function get_std_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key); + } + function get_err_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], err_formatter_key); + } + function get_str_formatter(param){ + return caml_call1(Stdlib_Domain[10][2], str_formatter_key); + } + function get_stdbuf(param){ + return caml_call1(Stdlib_Domain[10][2], stdbuf_key); + } + function flush_buffer_formatter(buf, ppf){ + pp_flush_queue(ppf, 0); + var s = caml_call1(Stdlib_Buffer[2], buf); + caml_call1(Stdlib_Buffer[9], buf); + return s; + } + function flush_str_formatter(param){ + var + stdbuf = caml_call1(Stdlib_Domain[10][2], stdbuf_key), + str_formatter = caml_call1(Stdlib_Domain[10][2], str_formatter_key); + return flush_buffer_formatter(stdbuf, str_formatter); + } + function make_synchronized_formatter(output, flush){ + function _an_(param){ + var + buf = caml_call1(Stdlib_Buffer[1], pp_buffer_size), + output$0 = caml_call1(Stdlib_Buffer[18], buf); + function flush$0(param){ + var _ao_ = caml_call1(Stdlib_Buffer[7], buf); + caml_call3(output, caml_call1(Stdlib_Buffer[2], buf), 0, _ao_); + caml_call1(Stdlib_Buffer[8], buf); + return caml_call1(flush, 0); + } + return make_formatter(output$0, flush$0); + } + return caml_call2(Stdlib_Domain[10][1], 0, _an_); + } + function synchronized_formatter_of_out_(oc){ + function _am_(param){return caml_call1(Stdlib[63], oc);} + return make_synchronized_formatter(caml_call1(Stdlib[69], oc), _am_); + } + function make_symbolic_output_buffer(param){return [0, 0];} + function clear_symbolic_output_buffer(sob){sob[1] = 0; return 0;} + function get_symbolic_output_buffer(sob){ + return caml_call1(Stdlib_List[9], sob[1]); + } + function flush_symbolic_output_buffer(sob){ + var items = get_symbolic_output_buffer(sob); + clear_symbolic_output_buffer(sob); + return items; + } + function add_symbolic_output_item(sob, item){sob[1] = [0, item, sob[1]]; return 0; + } + function formatter_of_symbolic_output_b(sob){ + function f(s, i, n){ + return add_symbolic_output_item + (sob, [0, caml_call3(Stdlib_String[15], s, i, n)]); + } + function g(_al_){return add_symbolic_output_item(sob, 0);} + function h(_ak_){return add_symbolic_output_item(sob, 1);} + function i(n){return add_symbolic_output_item(sob, [1, n]);} + function j(n){return add_symbolic_output_item(sob, [2, n]);} + return pp_make_formatter(f, g, h, i, j); + } + function open_hbox(v){ + return pp_open_hbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_vbox(v){ + return pp_open_vbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hvbox(v){ + return pp_open_hvbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_hovbox(v){ + return pp_open_hovbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_box(v){ + return pp_open_box(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_box(v){ + return pp_close_box + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_stag(v){ + return pp_open_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_stag(v){ + return pp_close_stag + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_as(v, w){ + return pp_print_as + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_string(v){ + return pp_print_string + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bytes(v){ + return pp_print_bytes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_int(v){ + return pp_print_int + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_float(v){ + return pp_print_float + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_char(v){ + return pp_print_char + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_bool(v){ + return pp_print_bool + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_break(v, w){ + return pp_print_break + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function print_cut(v){ + return pp_print_cut + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_space(v){ + return pp_print_space + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function force_newline(v){ + return pp_force_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_flush(v){ + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_newline(v){ + return pp_print_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_if_newline(v){ + return pp_print_if_newline + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function open_tbox(v){ + return pp_open_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function close_tbox(v){ + return pp_close_tbox + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tbreak(v, w){ + return pp_print_tbreak + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function set_tab(v){ + return pp_set_tab(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function print_tab(v){ + return pp_print_tab + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_margin(v){ + return pp_set_margin + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_margin(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[6]; + } + function set_max_indent(v){ + return pp_set_max_indent + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_indent(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[8]; + } + function set_geometry(max_indent, margin){ + return pp_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function safe_set_geometry(max_indent, margin){ + return pp_safe_set_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), + max_indent, + margin); + } + function get_geometry(v){ + return pp_get_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function update_geometry(v){ + return pp_update_geometry + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_max_boxes(v){ + return pp_set_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_max_boxes(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[15]; + } + function over_max_boxes(v){ + return pp_over_max_boxes + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_ellipsis_text(v){ + return pp_set_ellipsis_text + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_ellipsis_text(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[16]; + } + function set_formatter_out_channel(v){ + return pp_set_formatter_out_channel + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_out_functions(v){ + return pp_set_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_out_functions(v){ + return pp_get_formatter_out_functions + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_output_functions(v, w){ + return pp_set_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v, w); + } + function get_formatter_output_functions(v){ + return pp_get_formatter_output_functi + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_formatter_stag_functions(v){ + return pp_set_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_formatter_stag_functions(v){ + return pp_get_formatter_stag_function + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function set_print_tags(v){ + return pp_set_print_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_print_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[22]; + } + function set_mark_tags(v){ + return pp_set_mark_tags + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function get_mark_tags(v){ + return caml_call1(Stdlib_Domain[10][2], std_formatter_key)[23]; + } + function set_tags(v){ + return pp_set_tags(caml_call1(Stdlib_Domain[10][2], std_formatter_key), v); + } + function pp_print_list(opt, pp_v, ppf, param){ + var opt$0 = opt, param$0 = param; + for(;;){ + if(opt$0) + var sth = opt$0[1], pp_sep = sth; + else + var pp_sep = pp_print_cut; + if(! param$0) return 0; + var v = param$0[1]; + if(! param$0[2]) return caml_call2(pp_v, ppf, v); + var vs = param$0[2]; + caml_call2(pp_v, ppf, v); + caml_call2(pp_sep, ppf, 0); + var opt$1 = [0, pp_sep], opt$0 = opt$1, param$0 = vs; + } + } + function pp_print_seq(opt, pp_v, ppf, seq$1){ + if(opt) var sth = opt[1], pp_sep = sth; else var pp_sep = pp_print_cut; + var match$0 = caml_call1(seq$1, 0); + if(! match$0) return 0; + var seq$2 = match$0[2], v$0 = match$0[1]; + caml_call2(pp_v, ppf, v$0); + var seq = seq$2; + for(;;){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var seq$0 = match[2], v = match[1]; + caml_call2(pp_sep, ppf, 0); + caml_call2(pp_v, ppf, v); + var seq = seq$0; + } + } + function pp_print_text(ppf, s){ + var len = caml_ml_string_length(s), left = [0, 0], right = [0, 0]; + function flush(param){ + pp_print_string + (ppf, caml_call3(Stdlib_String[15], s, left[1], right[1] - left[1] | 0)); + right[1]++; + left[1] = right[1]; + return 0; + } + for(;;){ + if(right[1] === len){ + var _aj_ = left[1] !== len ? 1 : 0; + return _aj_ ? flush(0) : _aj_; + } + var match = runtime.caml_string_get(s, right[1]); + if(10 === match){ + flush(0); + pp_force_newline(ppf, 0); + } + else if(32 === match){flush(0); pp_print_space(ppf, 0);} else right[1]++; + } + } + function pp_print_option(opt, pp_v, ppf, param){ + if(opt) + var sth = opt[1], none = sth; + else + var none = function(param, _ai_){return 0;}; + if(! param) return caml_call2(none, ppf, 0); + var v = param[1]; + return caml_call2(pp_v, ppf, v); + } + function pp_print_result(ok, error, ppf, param){ + if(0 === param[0]){var v = param[1]; return caml_call2(ok, ppf, v);} + var e = param[1]; + return caml_call2(error, ppf, e); + } + function pp_print_either(left, right, ppf, param){ + if(0 === param[0]){var l = param[1]; return caml_call2(left, ppf, l);} + var r = param[1]; + return caml_call2(right, ppf, r); + } + function compute_tag(output, tag_acc){ + var + buf = caml_call1(Stdlib_Buffer[1], 16), + ppf = formatter_of_buffer(buf); + caml_call2(output, ppf, tag_acc); + pp_print_flush(ppf, 0); + var len = caml_call1(Stdlib_Buffer[7], buf); + return 2 <= len + ? caml_call3(Stdlib_Buffer[4], buf, 1, len - 2 | 0) + : caml_call1(Stdlib_Buffer[2], buf); + } + function output_formatting_lit(ppf, fmting_lit){ + if(typeof fmting_lit === "number") + switch(fmting_lit){ + case 0: + return pp_close_box(ppf, 0); + case 1: + return pp_close_stag(ppf, 0); + case 2: + return pp_print_flush(ppf, 0); + case 3: + return pp_force_newline(ppf, 0); + case 4: + return pp_print_newline(ppf, 0); + case 5: + return pp_print_char(ppf, 64); + default: return pp_print_char(ppf, 37); + } + switch(fmting_lit[0]){ + case 0: + var offset = fmting_lit[3], width = fmting_lit[2]; + return pp_print_break(ppf, width, offset); + case 1: + return 0; + default: + var c = fmting_lit[1]; + pp_print_char(ppf, 64); + return pp_print_char(ppf, c); + } + } + function output_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + output_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + output_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(output_acc, acc$0)]); + } + var acc$1 = match[1]; + output_acc(ppf, p$0); + var + _$_ = compute_tag(output_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _$_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _aa_ = acc[1], switch$1 = 0; + if(typeof _aa_ === "number" || ! (0 === _aa_[0])) + switch$1 = 1; + else{ + var _ab_ = _aa_[2], switch$2 = 0; + if(typeof _ab_ === "number" || ! (1 === _ab_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _ab_[2], p$2 = _aa_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _aa_; switch$0 = 2;} + break; + case 3: + var _ac_ = acc[1], switch$3 = 0; + if(typeof _ac_ === "number" || ! (0 === _ac_[0])) + switch$3 = 1; + else{ + var _ad_ = _ac_[2], switch$4 = 0; + if(typeof _ad_ === "number" || ! (1 === _ad_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _ad_[2], p$4 = _ac_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _ac_; switch$0 = 3;} + break; + case 4: + var _ae_ = acc[1], switch$5 = 0; + if(typeof _ae_ === "number" || ! (0 === _ae_[0])) + switch$5 = 1; + else{ + var _af_ = _ae_[2], switch$6 = 0; + if(typeof _af_ === "number" || ! (1 === _af_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _af_[2], p$2 = _ae_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _ae_; switch$0 = 2;} + break; + case 5: + var _ag_ = acc[1], switch$7 = 0; + if(typeof _ag_ === "number" || ! (0 === _ag_[0])) + switch$7 = 1; + else{ + var _ah_ = _ag_[2], switch$8 = 0; + if(typeof _ah_ === "number" || ! (1 === _ah_[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = _ah_[2], p$4 = _ag_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _ag_; switch$0 = 3;} + break; + case 6: + var f$0 = acc[2], p$5 = acc[1]; + output_acc(ppf, p$5); + return caml_call1(f$0, ppf); + case 7: + var p$6 = acc[1]; output_acc(ppf, p$6); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$7 = acc[1]; + output_acc(ppf, p$7); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + output_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + output_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + output_acc(ppf, p$1); return pp_print_string(ppf, s); + default: output_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function strput_acc(ppf, acc){ + var switch$0 = 0; + if(typeof acc === "number") return 0; + switch(acc[0]){ + case 0: + var f = acc[2], p = acc[1]; + strput_acc(ppf, p); + return output_formatting_lit(ppf, f); + case 1: + var match = acc[2], p$0 = acc[1]; + if(0 === match[0]){ + var acc$0 = match[1]; + strput_acc(ppf, p$0); + return pp_open_stag + (ppf, [0, String_tag, compute_tag(strput_acc, acc$0)]); + } + var acc$1 = match[1]; + strput_acc(ppf, p$0); + var + _S_ = compute_tag(strput_acc, acc$1), + match$0 = caml_call1(CamlinternalFormat[20], _S_), + bty = match$0[2], + indent = match$0[1]; + return pp_open_box_gen(ppf, indent, bty); + case 2: + var _T_ = acc[1], switch$1 = 0; + if(typeof _T_ === "number" || ! (0 === _T_[0])) + switch$1 = 1; + else{ + var _U_ = _T_[2], switch$2 = 0; + if(typeof _U_ === "number" || ! (1 === _U_[0])) + switch$2 = 1; + else + var s$0 = acc[2], size = _U_[2], p$2 = _T_[1]; + if(switch$2) switch$1 = 1; + } + if(switch$1){var s = acc[2], p$1 = _T_; switch$0 = 2;} + break; + case 3: + var _V_ = acc[1], switch$3 = 0; + if(typeof _V_ === "number" || ! (0 === _V_[0])) + switch$3 = 1; + else{ + var _W_ = _V_[2], switch$4 = 0; + if(typeof _W_ === "number" || ! (1 === _W_[0])) + switch$4 = 1; + else{var c$0 = acc[2], size$0 = _W_[2], p$4 = _V_[1]; switch$0 = 1;} + if(switch$4) switch$3 = 1; + } + if(switch$3){var c = acc[2], p$3 = _V_; switch$0 = 3;} + break; + case 4: + var _X_ = acc[1], switch$5 = 0; + if(typeof _X_ === "number" || ! (0 === _X_[0])) + switch$5 = 1; + else{ + var _Y_ = _X_[2], switch$6 = 0; + if(typeof _Y_ === "number" || ! (1 === _Y_[0])) + switch$6 = 1; + else + var s$0 = acc[2], size = _Y_[2], p$2 = _X_[1]; + if(switch$6) switch$5 = 1; + } + if(switch$5){var s = acc[2], p$1 = _X_; switch$0 = 2;} + break; + case 5: + var _Z_ = acc[1], switch$7 = 0; + if(typeof _Z_ === "number" || ! (0 === _Z_[0])) + switch$7 = 1; + else{ + var ___ = _Z_[2], switch$8 = 0; + if(typeof ___ === "number" || ! (1 === ___[0])) + switch$8 = 1; + else{var c$0 = acc[2], size$0 = ___[2], p$4 = _Z_[1]; switch$0 = 1;} + if(switch$8) switch$7 = 1; + } + if(switch$7){var c = acc[2], p$3 = _Z_; switch$0 = 3;} + break; + case 6: + var p$5 = acc[1]; + if(typeof p$5 !== "number" && 0 === p$5[0]){ + var match$1 = p$5[2]; + if(typeof match$1 !== "number" && 1 === match$1[0]){ + var f$1 = acc[2], size$1 = match$1[2], p$6 = p$5[1]; + strput_acc(ppf, p$6); + return pp_print_as_size(ppf, size$1, caml_call1(f$1, 0)); + } + } + var f$0 = acc[2]; + strput_acc(ppf, p$5); + return pp_print_string(ppf, caml_call1(f$0, 0)); + case 7: + var p$7 = acc[1]; strput_acc(ppf, p$7); return pp_print_flush(ppf, 0); + default: + var msg = acc[2], p$8 = acc[1]; + strput_acc(ppf, p$8); + return caml_call1(Stdlib[1], msg); + } + switch(switch$0){ + case 0: + strput_acc(ppf, p$2); return pp_print_as_size(ppf, size, s$0); + case 1: + strput_acc(ppf, p$4); + return pp_print_as_size + (ppf, size$0, caml_call2(Stdlib_String[1], 1, c$0)); + case 2: + strput_acc(ppf, p$1); return pp_print_string(ppf, s); + default: strput_acc(ppf, p$3); return pp_print_char(ppf, c); + } + } + function kfprintf(k, ppf, param){ + var fmt = param[1], _Q_ = 0; + function _R_(acc){output_acc(ppf, acc); return caml_call1(k, ppf);} + return caml_call3(CamlinternalFormat[7], _R_, _Q_, fmt); + } + function ikfprintf(k, ppf, param){ + var fmt = param[1]; + return caml_call3(CamlinternalFormat[8], k, ppf, fmt); + } + function ifprintf(ppf, param){ + var fmt = param[1], _N_ = 0; + function _O_(_P_){return 0;} + return caml_call3(CamlinternalFormat[8], _O_, _N_, fmt); + } + function fprintf(ppf){ + function _K_(_M_){return 0;} + return function(_L_){return kfprintf(_K_, ppf, _L_);}; + } + function printf(param){ + var fmt = param[1], _I_ = 0; + function _J_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], std_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _J_, _I_, fmt); + } + function eprintf(param){ + var fmt = param[1], _G_ = 0; + function _H_(acc){ + return output_acc + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), acc); + } + return caml_call3(CamlinternalFormat[7], _H_, _G_, fmt); + } + function kdprintf(k, param){ + var fmt = param[1], _E_ = 0; + function _F_(acc){ + return caml_call1(k, function(ppf){return output_acc(ppf, acc);}); + } + return caml_call3(CamlinternalFormat[7], _F_, _E_, fmt); + } + function dprintf(fmt){return kdprintf(function(i){return i;}, fmt);} + function ksprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + strput_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function sprintf(fmt){return ksprintf(id, fmt);} + function kasprintf(k, param){ + var fmt = param[1], b = pp_make_buffer(0), ppf = formatter_of_buffer(b); + function k$0(acc){ + output_acc(ppf, acc); + return caml_call1(k, flush_buffer_formatter(b, ppf)); + } + return caml_call3(CamlinternalFormat[7], k$0, 0, fmt); + } + function asprintf(fmt){return kasprintf(id, fmt);} + function flush_standard_formatters(param){ + pp_print_flush(caml_call1(Stdlib_Domain[10][2], std_formatter_key), 0); + return pp_print_flush + (caml_call1(Stdlib_Domain[10][2], err_formatter_key), 0); + } + caml_call1(Stdlib[100], flush_standard_formatters); + function _l_(param){ + flush_standard_formatters(0); + var + fs = pp_get_formatter_out_functions(std_formatter, 0), + _m_ = fs[5], + _n_ = fs[4], + _o_ = fs[3], + _p_ = Stdlib[39]; + function _q_(_D_){return buffered_out_flush(_p_, std_buf_key, _D_);} + pp_set_formatter_out_functions + (std_formatter, + [0, + function(_A_, _B_, _C_){ + return buffered_out_string(std_buf_key, _A_, _B_, _C_); + }, + _q_, + _o_, + _n_, + _m_]); + var + fs$0 = pp_get_formatter_out_functions(err_formatter, 0), + _r_ = fs$0[5], + _s_ = fs$0[4], + _t_ = fs$0[3], + _u_ = Stdlib[40]; + function _v_(_z_){return buffered_out_flush(_u_, err_buf_key, _z_);} + return pp_set_formatter_out_functions + (err_formatter, + [0, + function(_w_, _x_, _y_){ + return buffered_out_string(err_buf_key, _w_, _x_, _y_); + }, + _v_, + _t_, + _s_, + _r_]); + } + caml_call1(Stdlib_Domain[5], _l_); + var + Stdlib_Format = + [0, + pp_open_box, + open_box, + pp_close_box, + close_box, + pp_open_hbox, + open_hbox, + pp_open_vbox, + open_vbox, + pp_open_hvbox, + open_hvbox, + pp_open_hovbox, + open_hovbox, + pp_print_string, + print_string, + pp_print_bytes, + print_bytes, + pp_print_as, + print_as, + pp_print_int, + print_int, + pp_print_float, + print_float, + pp_print_char, + print_char, + pp_print_bool, + print_bool, + pp_print_space, + print_space, + pp_print_cut, + print_cut, + pp_print_break, + print_break, + pp_print_custom_break, + pp_force_newline, + force_newline, + pp_print_if_newline, + print_if_newline, + pp_print_flush, + print_flush, + pp_print_newline, + print_newline, + pp_set_margin, + set_margin, + pp_get_margin, + get_margin, + pp_set_max_indent, + set_max_indent, + pp_get_max_indent, + get_max_indent, + check_geometry, + pp_set_geometry, + set_geometry, + pp_safe_set_geometry, + safe_set_geometry, + pp_update_geometry, + update_geometry, + pp_get_geometry, + get_geometry, + pp_set_max_boxes, + set_max_boxes, + pp_get_max_boxes, + get_max_boxes, + pp_over_max_boxes, + over_max_boxes, + pp_open_tbox, + open_tbox, + pp_close_tbox, + close_tbox, + pp_set_tab, + set_tab, + pp_print_tab, + print_tab, + pp_print_tbreak, + print_tbreak, + pp_set_ellipsis_text, + set_ellipsis_text, + pp_get_ellipsis_text, + get_ellipsis_text, + String_tag, + pp_open_stag, + open_stag, + pp_close_stag, + close_stag, + pp_set_tags, + set_tags, + pp_set_print_tags, + set_print_tags, + pp_set_mark_tags, + set_mark_tags, + pp_get_print_tags, + get_print_tags, + pp_get_mark_tags, + get_mark_tags, + pp_set_formatter_out_channel, + set_formatter_out_channel, + pp_set_formatter_output_functi, + set_formatter_output_functions, + pp_get_formatter_output_functi, + get_formatter_output_functions, + pp_set_formatter_out_functions, + set_formatter_out_functions, + pp_get_formatter_out_functions, + get_formatter_out_functions, + pp_set_formatter_stag_function, + set_formatter_stag_functions, + pp_get_formatter_stag_function, + get_formatter_stag_functions, + formatter_of_out_channel, + synchronized_formatter_of_out_, + std_formatter, + get_std_formatter, + err_formatter, + get_err_formatter, + formatter_of_buffer, + stdbuf, + get_stdbuf, + str_formatter, + get_str_formatter, + flush_str_formatter, + make_formatter, + make_synchronized_formatter, + formatter_of_out_functions, + make_symbolic_output_buffer, + clear_symbolic_output_buffer, + get_symbolic_output_buffer, + flush_symbolic_output_buffer, + add_symbolic_output_item, + formatter_of_symbolic_output_b, + pp_print_list, + pp_print_seq, + pp_print_text, + pp_print_option, + pp_print_result, + pp_print_either, + fprintf, + printf, + eprintf, + sprintf, + asprintf, + dprintf, + ifprintf, + kfprintf, + kdprintf, + ikfprintf, + ksprintf, + kasprintf]; + runtime.caml_register_global(35, Stdlib_Format, "Stdlib__Format"); + return; + } + (globalThis)); + +//# 21019 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = '"', + cst$6 = "-", + cst_character = "character ", + cst_scanf_ml = "scanf.ml", + cst_scanf_bad_conversion$3 = 'scanf: bad conversion "%*"', + cst_scanning_of = "scanning of ", + caml_bytes_get = runtime.caml_bytes_get, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$5, + cst$4 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + cst$0 = cst$5, + cst = cst$6, + CamlinternalFormat = global_data.CamlinternalFormat, + CamlinternalFormatBasics = global_data.CamlinternalFormatBasics, + Stdlib_String = global_data.Stdlib__String, + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Buffer = global_data.Stdlib__Buffer, + _r_ = [0, 91], + _q_ = [0, 123], + cst_end_of_input_not_found = "end of input not found", + cst_scanf_bad_conversion_a = 'scanf: bad conversion "%a"', + cst_scanf_bad_conversion_t = 'scanf: bad conversion "%t"', + cst_scanf_missing_reader = "scanf: missing reader", + _s_ = [0, cst_scanf_ml, 1414, 13], + cst_scanf_bad_conversion_custo = + 'scanf: bad conversion "%?" (custom converter)', + cst_scanf_bad_conversion = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$0 = cst_scanf_bad_conversion$3, + cst_scanf_bad_conversion$1 = 'scanf: bad conversion "%-"', + cst_scanf_bad_conversion$2 = cst_scanf_bad_conversion$3, + _t_ = [0, [3, 0, [10, 0]], "%S%!"], + cst_in_format = ' in format "', + _p_ = [0, 37, ""], + _o_ = + [0, + [11, + "scanf: bad input at char number ", + [4, 3, 0, 0, [11, ": ", [2, 0, 0]]]], + "scanf: bad input at char number %i: %s"], + _n_ = + [0, + [11, "the character ", [1, [11, " cannot start a boolean", 0]]], + "the character %C cannot start a boolean"], + _m_ = + [0, + [11, "bad character hexadecimal encoding \\", [0, [0, 0]]], + "bad character hexadecimal encoding \\%c%c"], + _l_ = + [0, + [11, "bad character decimal encoding \\", [0, [0, [0, 0]]]], + "bad character decimal encoding \\%c%c%c"], + cst_an = "an", + cst_x = "x", + cst_nfinity = "nfinity", + cst_digits = "digits", + _k_ = + [0, + [11, + cst_character, + [1, [11, " is not a valid ", [2, 0, [11, " digit", 0]]]]], + "character %C is not a valid %s digit"], + cst_decimal_digits = "decimal digits", + _j_ = + [0, + [11, cst_character, [1, [11, " is not a decimal digit", 0]]], + "character %C is not a decimal digit"], + cst_0b = "0b", + cst_0o = "0o", + cst_0u = "0u", + cst_0x = "0x", + _i_ = [0, cst_scanf_ml, 516, 9], + _h_ = + [0, + [11, "invalid boolean '", [2, 0, [12, 39, 0]]], + "invalid boolean '%s'"], + _g_ = + [0, + [11, "looking for ", [1, [11, ", found ", [1, 0]]]], + "looking for %C, found %C"], + cst_not_a_valid_float_in_hexad = + "not a valid float in hexadecimal notation", + cst_no_dot_or_exponent_part_fo = + "no dot or exponent part found in float token", + _f_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, + " failed: premature end of file occurred before end of token", + 0]]], + "scanning of %s failed: premature end of file occurred before end of token"], + _e_ = + [0, + [11, + cst_scanning_of, + [2, + 0, + [11, " failed: the specified length was too short for token", 0]]], + "scanning of %s failed: the specified length was too short for token"], + _d_ = + [0, + [11, "illegal escape character ", [1, 0]], + "illegal escape character %C"], + cst_unnamed_function = "unnamed function", + cst_unnamed_character_string = "unnamed character string", + cst_unnamed_Stdlib_input_chann = "unnamed Stdlib input channel", + cst_Stdlib_Scanf_Scan_failure = "Stdlib.Scanf.Scan_failure", + cst_binary = "binary", + cst_octal = "octal", + cst_hexadecimal = "hexadecimal", + cst_a_Char = "a Char", + cst_a_String = "a String", + null_char = 0; + function next_char(ib){ + try{ + var c = caml_call1(ib[7], 0); + ib[2] = c; + ib[3] = 1; + ib[4] = ib[4] + 1 | 0; + if(10 === c) ib[5] = ib[5] + 1 | 0; + return c; + } + catch(_bb_){ + var _ba_ = caml_wrap_exception(_bb_); + if(_ba_ !== Stdlib[12]) throw caml_maybe_attach_backtrace(_ba_, 0); + ib[2] = null_char; + ib[3] = 0; + ib[1] = 1; + return null_char; + } + } + function peek_char(ib){return ib[3] ? ib[2] : next_char(ib);} + function checked_peek_char(ib){ + var c = peek_char(ib); + if(ib[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + return c; + } + function end_of_input(ib){peek_char(ib); return ib[1];} + function beginning_of_input(ib){return 0 === ib[4] ? 1 : 0;} + function name_of_input(ib){ + var match = ib[9]; + if(typeof match === "number") + return 0 === match ? cst_unnamed_function : cst_unnamed_character_string; + if(0 === match[0]) return cst_unnamed_Stdlib_input_chann; + var fname = match[1]; + return fname; + } + function char_count(ib){return ib[3] ? ib[4] - 1 | 0 : ib[4];} + function invalidate_current_char(ib){ib[3] = 0; return 0;} + function token_string(ib){ + var + token_buffer = ib[8], + tok = caml_call1(Stdlib_Buffer[2], token_buffer); + caml_call1(Stdlib_Buffer[8], token_buffer); + ib[6] = ib[6] + 1 | 0; + return tok; + } + function skip_char(width, ib){invalidate_current_char(ib); return width;} + function ignore_char(width, ib){return skip_char(width - 1 | 0, ib);} + function store_char(width, ib, c){ + caml_call2(Stdlib_Buffer[12], ib[8], c); + return ignore_char(width, ib); + } + var default_token_buffer_size = 1024; + function create(iname, next){ + return [0, + 0, + null_char, + 0, + 0, + 0, + 0, + next, + caml_call1(Stdlib_Buffer[1], default_token_buffer_size), + iname]; + } + function from_string(s){ + var i = [0, 0], len = caml_ml_string_length(s); + function next(param){ + if(len <= i[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + var c = caml_string_get(s, i[1]); + i[1]++; + return c; + } + return create(1, next); + } + var _a_ = 0; + function from_function(_a$_){return create(_a_, _a$_);} + var len = 1024; + function scan_close_at_end(ic){ + caml_call1(Stdlib[93], ic); + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function scan_raise_at_end(ic){ + throw caml_maybe_attach_backtrace(Stdlib[12], 1); + } + function from_ic(scan_close_ic, iname, ic){ + var + buf = runtime.caml_create_bytes(1024), + i = [0, 0], + lim = [0, 0], + eof = [0, 0]; + function next(param){ + if(i[1] < lim[1]){var c = caml_bytes_get(buf, i[1]); i[1]++; return c;} + if(eof[1]) throw caml_maybe_attach_backtrace(Stdlib[12], 1); + lim[1] = caml_call4(Stdlib[84], ic, buf, 0, len); + return 0 === lim[1] + ? (eof[1] = 1, caml_call1(scan_close_ic, ic)) + : (i[1] = 1, caml_bytes_get(buf, 0)); + } + return create(iname, next); + } + var stdin = from_ic(scan_raise_at_end, [1, cst, Stdlib[38]], Stdlib[38]); + function open_in_file(open_in, fname){ + if(! caml_string_notequal(fname, cst$6)) return stdin; + var ic = caml_call1(open_in, fname); + return from_ic(scan_close_at_end, [1, fname, ic], ic); + } + var _b_ = Stdlib[79]; + function open_in(_a__){return open_in_file(_b_, _a__);} + var _c_ = Stdlib[80]; + function open_in_bin(_a9_){return open_in_file(_c_, _a9_);} + function from_channel(ic){return from_ic(scan_raise_at_end, [0, ic], ic);} + function close_in(ib){ + var match = ib[9]; + if(typeof match === "number") return 0; + if(0 === match[0]){var ic = match[1]; return caml_call1(Stdlib[93], ic);} + var ic$0 = match[2]; + return caml_call1(Stdlib[93], ic$0); + } + var + Scan_failure = + [248, cst_Stdlib_Scanf_Scan_failure, runtime.caml_fresh_oo_id(0)]; + function bad_input(s){ + throw caml_maybe_attach_backtrace([0, Scan_failure, s], 1); + } + function bad_input_escape(c){ + return bad_input(caml_call2(Stdlib_Printf[4], _d_, c)); + } + function bad_token_length(message){ + return bad_input(caml_call2(Stdlib_Printf[4], _e_, message)); + } + function bad_float(param){ + return bad_input(cst_no_dot_or_exponent_part_fo); + } + function bad_hex_float(param){ + return bad_input(cst_not_a_valid_float_in_hexad); + } + function character_mismatch(c, ci){ + return bad_input(caml_call3(Stdlib_Printf[4], _g_, c, ci)); + } + function check_this_char(ib, c){ + var ci = checked_peek_char(ib); + return ci === c ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function check_char(ib, c$0){ + if(10 === c$0){ + var ci = checked_peek_char(ib); + return 10 === ci + ? invalidate_current_char(ib) + : 13 + === ci + ? (invalidate_current_char(ib), check_this_char(ib, 10)) + : character_mismatch(10, ci); + } + if(32 !== c$0) return check_this_char(ib, c$0); + for(;;){ + var c = peek_char(ib), _a7_ = 1 - ib[1]; + if(! _a7_) return _a7_; + var _a8_ = c - 9 | 0, switch$0 = 0; + if(4 < _a8_ >>> 0){ + if(23 === _a8_) switch$0 = 1; + } + else if(1 < _a8_ - 2 >>> 0) switch$0 = 1; + if(! switch$0) return 0; + invalidate_current_char(ib); + } + } + function token_char(ib){return caml_string_get(token_string(ib), 0);} + function token_bool(ib){ + var s = token_string(ib); + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? bad_input(caml_call2(Stdlib_Printf[4], _h_, s)) + : 1 + : 0; + } + function integer_conversion_of_char(param){ + var switcher = param - 88 | 0; + if(32 >= switcher >>> 0) + switch(switcher){ + case 10: + return 0; + case 12: + return 1; + case 17: + return 2; + case 23: + return 3; + case 29: + return 4; + case 0: + case 32: + return 5; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + } + function token_int_literal(conv, ib){ + switch(conv){ + case 0: + var + _a3_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0b, _a3_); + break; + case 3: + var + _a4_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0o, _a4_); + break; + case 4: + var + _a5_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0u, _a5_); + break; + case 5: + var + _a6_ = token_string(ib), + tok = caml_call2(Stdlib[28], cst_0x, _a6_); + break; + default: var tok = token_string(ib); + } + var l = caml_ml_string_length(tok); + if(0 !== l && 43 === caml_string_get(tok, 0)) + return caml_call3(Stdlib_String[15], tok, 1, l - 1 | 0); + return tok; + } + function token_float(ib){ + return runtime.caml_float_of_string(token_string(ib)); + } + function scan_decimal_digit_star(width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(58 <= c){ + if(95 === c){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + } + else if(48 <= c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + return width$0; + } + } + function scan_decimal_digit_plus(width, ib){ + if(0 === width) return bad_token_length(cst_decimal_digits); + var c = checked_peek_char(ib); + if(9 < c - 48 >>> 0) + return bad_input(caml_call2(Stdlib_Printf[4], _j_, c)); + var width$0 = store_char(width, ib, c); + return scan_decimal_digit_star(width$0, ib); + } + function scan_digit_plus(basis, digitp, width$2, ib){ + if(0 === width$2) return bad_token_length(cst_digits); + var c$0 = checked_peek_char(ib); + if(! caml_call1(digitp, c$0)) + return bad_input(caml_call3(Stdlib_Printf[4], _k_, c$0, basis)); + var width$3 = store_char(width$2, ib, c$0), width = width$3; + for(;;){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(caml_call1(digitp, c)){ + var width$0 = store_char(width, ib, c), width = width$0; + continue; + } + if(95 !== c) return width; + var width$1 = ignore_char(width, ib), width = width$1; + } + } + function is_binary_digit(param){return 1 < param - 48 >>> 0 ? 0 : 1;} + function scan_binary_int(_a1_, _a2_){ + return scan_digit_plus(cst_binary, is_binary_digit, _a1_, _a2_); + } + function is_octal_digit(param){return 7 < param - 48 >>> 0 ? 0 : 1;} + function scan_octal_int(_aZ_, _a0_){ + return scan_digit_plus(cst_octal, is_octal_digit, _aZ_, _a0_); + } + function is_hexa_digit(param){ + var _aY_ = param - 48 | 0, switch$0 = 0; + if(22 < _aY_ >>> 0){ + if(5 >= _aY_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _aY_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function scan_hexadecimal_int(_aW_, _aX_){ + return scan_digit_plus(cst_hexadecimal, is_hexa_digit, _aW_, _aX_); + } + function scan_sign(width, ib){ + var c = checked_peek_char(ib), switcher = c - 43 | 0; + if(2 >= switcher >>> 0) + switch(switcher){ + case 0: + return store_char(width, ib, c); + case 1: break; + default: return store_char(width, ib, c); + } + return width; + } + function scan_optionally_signed_decimal(width, ib){ + var width$0 = scan_sign(width, ib); + return scan_decimal_digit_plus(width$0, ib); + } + function scan_int_conversion(conv, width$1, ib){ + switch(conv){ + case 0: + return scan_binary_int(width$1, ib); + case 1: + return scan_optionally_signed_decimal(width$1, ib); + case 2: + var width$0 = scan_sign(width$1, ib), c = checked_peek_char(ib); + if(48 !== c) return scan_decimal_digit_plus(width$0, ib); + var width = store_char(width$0, ib, c); + if(0 === width) return width; + var c$0 = peek_char(ib); + if(ib[1]) return width; + var switch$0 = 0; + if(99 <= c$0){ + if(111 === c$0) return scan_octal_int(store_char(width, ib, c$0), ib); + if(120 === c$0) switch$0 = 1; + } + else if(88 === c$0) + switch$0 = 1; + else if(98 <= c$0) + return scan_binary_int(store_char(width, ib, c$0), ib); + return switch$0 + ? scan_hexadecimal_int(store_char(width, ib, c$0), ib) + : scan_decimal_digit_star(width, ib); + case 3: + return scan_octal_int(width$1, ib); + case 4: + return scan_decimal_digit_plus(width$1, ib); + default: return scan_hexadecimal_int(width$1, ib); + } + } + function scan_fractional_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + return ib[1] + ? width + : 9 + < c - 48 >>> 0 + ? width + : scan_decimal_digit_star(store_char(width, ib, c), ib); + } + function scan_exponent_part(width, ib){ + if(0 === width) return width; + var c = peek_char(ib); + if(ib[1]) return width; + if(69 !== c && 101 !== c) return width; + return scan_optionally_signed_decimal(store_char(width, ib, c), ib); + } + function scan_float(width$1, precision, ib){ + var + width = scan_sign(width$1, ib), + width$0 = scan_decimal_digit_star(width, ib); + if(0 === width$0) return [0, width$0, precision]; + var c = peek_char(ib); + if(ib[1]) return [0, width$0, precision]; + if(46 !== c) return [0, scan_exponent_part(width$0, ib), precision]; + var + width$2 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$2, precision), + width$3 = + width$2 - (precision$0 - scan_fractional_part(precision$0, ib) | 0) | 0; + return [0, scan_exponent_part(width$3, ib), precision$0]; + } + function check_case_insensitive_string(width, ib, error, str){ + function lowercase(c){ + return 25 < c - 65 >>> 0 + ? c + : caml_call1(Stdlib[29], (c - 65 | 0) + 97 | 0); + } + var + len = caml_ml_string_length(str), + width$0 = [0, width], + _aT_ = len - 1 | 0, + _aS_ = 0; + if(_aT_ >= 0){ + var i = _aS_; + for(;;){ + var c = peek_char(ib), _aU_ = lowercase(caml_string_get(str, i)); + if(lowercase(c) !== _aU_) caml_call1(error, 0); + if(0 === width$0[1]) caml_call1(error, 0); + width$0[1] = store_char(width$0[1], ib, c); + var _aV_ = i + 1 | 0; + if(_aT_ !== i){var i = _aV_; continue;} + break; + } + } + return width$0[1]; + } + function scan_hex_float(width, precision, ib){ + var _aF_ = 0 === width ? 1 : 0, _aG_ = _aF_ || end_of_input(ib); + if(_aG_) bad_hex_float(0); + var + width$0 = scan_sign(width, ib), + _aH_ = 0 === width$0 ? 1 : 0, + _aI_ = _aH_ || end_of_input(ib); + if(_aI_) bad_hex_float(0); + var c = peek_char(ib), switch$0 = 0; + if(78 <= c){ + var switcher = c - 79 | 0; + if(30 < switcher >>> 0){ + if(32 > switcher){ + var + width$1 = store_char(width$0, ib, c), + _aJ_ = 0 === width$1 ? 1 : 0, + _aK_ = _aJ_ || end_of_input(ib); + if(_aK_) bad_hex_float(0); + return check_case_insensitive_string + (width$1, ib, bad_hex_float, cst_an); + } + } + else if(26 === switcher) switch$0 = 1; + } + else{ + if(48 === c){ + var + width$3 = store_char(width$0, ib, c), + _aN_ = 0 === width$3 ? 1 : 0, + _aO_ = _aN_ || end_of_input(ib); + if(_aO_) bad_hex_float(0); + var + width$4 = + check_case_insensitive_string(width$3, ib, bad_hex_float, cst_x); + if(0 !== width$4 && ! end_of_input(ib)){ + var _aP_ = peek_char(ib) - 46 | 0, switch$1 = 0; + if(34 < _aP_ >>> 0){ + if(66 === _aP_) switch$1 = 1; + } + else if(32 < _aP_ - 1 >>> 0) switch$1 = 1; + var width$5 = switch$1 ? width$4 : scan_hexadecimal_int(width$4, ib); + if(0 !== width$5 && ! end_of_input(ib)){ + var c$0 = peek_char(ib); + if(46 === c$0){ + var width$6 = store_char(width$5, ib, c$0), switch$2 = 0; + if(0 !== width$6 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$3 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$6, precision), + width$10 = + width$6 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$3 = 1; + } + if(! switch$3) var width$10 = width$6; + var width$7 = width$10; + switch$2 = 1; + } + if(! switch$2) var width$7 = width$6; + var width$8 = width$7; + } + else + var width$8 = width$5; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$1 = peek_char(ib); + if(80 !== c$1 && 112 !== c$1) return width$8; + var + width$9 = store_char(width$8, ib, c$1), + _aQ_ = 0 === width$9 ? 1 : 0, + _aR_ = _aQ_ || end_of_input(ib); + if(_aR_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return width$5; + } + return width$4; + } + if(73 === c) switch$0 = 1; + } + if(! switch$0) return bad_hex_float(0); + var + width$2 = store_char(width$0, ib, c), + _aL_ = 0 === width$2 ? 1 : 0, + _aM_ = _aL_ || end_of_input(ib); + if(_aM_) bad_hex_float(0); + return check_case_insensitive_string + (width$2, ib, bad_hex_float, cst_nfinity); + } + function scan_caml_float_rest(width, precision, ib){ + var _aB_ = 0 === width ? 1 : 0, _aC_ = _aB_ || end_of_input(ib); + if(_aC_) bad_float(0); + var + width$0 = scan_decimal_digit_star(width, ib), + _aD_ = 0 === width$0 ? 1 : 0, + _aE_ = _aD_ || end_of_input(ib); + if(_aE_) bad_float(0); + var c = peek_char(ib), switcher = c - 69 | 0; + if(32 < switcher >>> 0){ + if(-23 === switcher){ + var + width$1 = store_char(width$0, ib, c), + precision$0 = caml_call2(Stdlib_Int[10], width$1, precision), + width_precision = scan_fractional_part(precision$0, ib), + frac_width = precision$0 - width_precision | 0, + width$2 = width$1 - frac_width | 0; + return scan_exponent_part(width$2, ib); + } + } + else if(30 < switcher - 1 >>> 0) return scan_exponent_part(width$0, ib); + return bad_float(0); + } + function scan_caml_float(width, precision, ib){ + var _an_ = 0 === width ? 1 : 0, _ao_ = _an_ || end_of_input(ib); + if(_ao_) bad_float(0); + var + width$0 = scan_sign(width, ib), + _ap_ = 0 === width$0 ? 1 : 0, + _aq_ = _ap_ || end_of_input(ib); + if(_aq_) bad_float(0); + var c = peek_char(ib); + if(49 <= c){ + if(58 > c){ + var + width$1 = store_char(width$0, ib, c), + _ar_ = 0 === width$1 ? 1 : 0, + _as_ = _ar_ || end_of_input(ib); + if(_as_) bad_float(0); + return scan_caml_float_rest(width$1, precision, ib); + } + } + else if(48 <= c){ + var + width$2 = store_char(width$0, ib, c), + _at_ = 0 === width$2 ? 1 : 0, + _au_ = _at_ || end_of_input(ib); + if(_au_) bad_float(0); + var c$0 = peek_char(ib); + if(88 !== c$0 && 120 !== c$0) + return scan_caml_float_rest(width$2, precision, ib); + var + width$3 = store_char(width$2, ib, c$0), + _av_ = 0 === width$3 ? 1 : 0, + _aw_ = _av_ || end_of_input(ib); + if(_aw_) bad_float(0); + var + width$4 = scan_hexadecimal_int(width$3, ib), + _ax_ = 0 === width$4 ? 1 : 0, + _ay_ = _ax_ || end_of_input(ib); + if(_ay_) bad_float(0); + var c$1 = peek_char(ib), switcher = c$1 - 80 | 0, switch$0 = 0; + if(32 < switcher >>> 0) + if(-34 === switcher){ + var width$5 = store_char(width$4, ib, c$1), switch$1 = 0; + if(0 !== width$5 && ! end_of_input(ib)){ + var match = peek_char(ib), switch$2 = 0; + if(80 !== match && 112 !== match){ + var + precision$0 = caml_call2(Stdlib_Int[10], width$5, precision), + width$10 = + width$5 + - (precision$0 - scan_hexadecimal_int(precision$0, ib) | 0) + | 0; + switch$2 = 1; + } + if(! switch$2) var width$10 = width$5; + var width$6 = width$10; + switch$1 = 1; + } + if(! switch$1) var width$6 = width$5; + var width$7 = width$6; + } + else + switch$0 = 1; + else if(30 < switcher - 1 >>> 0) + var width$7 = width$4; + else + switch$0 = 1; + var width$8 = switch$0 ? bad_float(0) : width$7; + if(0 !== width$8 && ! end_of_input(ib)){ + var c$2 = peek_char(ib); + if(80 !== c$2 && 112 !== c$2) return width$8; + var + width$9 = store_char(width$8, ib, c$2), + _az_ = 0 === width$9 ? 1 : 0, + _aA_ = _az_ || end_of_input(ib); + if(_aA_) bad_hex_float(0); + return scan_optionally_signed_decimal(width$9, ib); + } + return width$8; + } + return bad_float(0); + } + function scan_string(stp, width, ib){ + var width$0 = width; + for(;;){ + if(0 === width$0) return width$0; + var c = peek_char(ib); + if(ib[1]) return width$0; + if(stp){ + var c$0 = stp[1]; + if(c === c$0) return skip_char(width$0, ib); + var width$1 = store_char(width$0, ib, c), width$0 = width$1; + continue; + } + var _am_ = c - 9 | 0, switch$0 = 0; + if(4 < _am_ >>> 0){ + if(23 === _am_) switch$0 = 1; + } + else if(1 < _am_ - 2 >>> 0) switch$0 = 1; + if(switch$0) return width$0; + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + } + } + function hexadecimal_value_of_char(c){ + return 97 <= c ? c - 87 | 0 : 65 <= c ? c - 55 | 0 : c - 48 | 0; + } + function check_next_char(message, width, ib){ + if(0 === width) return bad_token_length(message); + var c = peek_char(ib); + return ib[1] ? bad_input(caml_call2(Stdlib_Printf[4], _f_, message)) : c; + } + function check_next_char_for_char(_ak_, _al_){ + return check_next_char(cst_a_Char, _ak_, _al_); + } + function check_next_char_for_string(_ai_, _aj_){ + return check_next_char(cst_a_String, _ai_, _aj_); + } + function scan_backslash_char(width, ib){ + var c0 = check_next_char_for_char(width, ib), switch$0 = 0; + if(40 <= c0){ + if(58 <= c0){ + var switcher = c0 - 92 | 0; + if(28 >= switcher >>> 0) + switch(switcher){ + case 28: + var + get_digit = + function(param){ + var c = next_char(ib), _ah_ = c - 48 | 0, switch$0 = 0; + if(22 < _ah_ >>> 0){ + if(5 >= _ah_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _ah_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? c : bad_input_escape(c); + }, + c1 = get_digit(0), + c2 = get_digit(0), + _ad_ = hexadecimal_value_of_char(c2), + c$0 = (16 * hexadecimal_value_of_char(c1) | 0) + _ad_ | 0, + switch$1 = 0; + if(0 <= c$0 && 255 >= c$0){ + var _af_ = caml_call1(Stdlib[29], c$0); + switch$1 = 1; + } + if(! switch$1) + var _af_ = bad_input(caml_call3(Stdlib_Printf[4], _m_, c1, c2)); + return store_char(width - 2 | 0, ib, _af_); + case 0: + case 6: + case 18: + case 22: + case 24: + switch$0 = 1; break; + } + } + else if(48 <= c0){ + var + get_digit$0 = + function(param){ + var c = next_char(ib); + return 9 < c - 48 >>> 0 ? bad_input_escape(c) : c; + }, + c1$0 = get_digit$0(0), + c2$0 = get_digit$0(0), + c = + ((100 * (c0 - 48 | 0) | 0) + (10 * (c1$0 - 48 | 0) | 0) | 0) + + (c2$0 - 48 | 0) + | 0, + switch$2 = 0; + if(0 <= c && 255 >= c){ + var _ag_ = caml_call1(Stdlib[29], c); + switch$2 = 1; + } + if(! switch$2) + var + _ag_ = bad_input(caml_call4(Stdlib_Printf[4], _l_, c0, c1$0, c2$0)); + return store_char(width - 2 | 0, ib, _ag_); + } + } + else if(34 === c0 || 39 <= c0) switch$0 = 1; + if(! switch$0) return bad_input_escape(c0); + var switch$3 = 0; + if(110 <= c0) + if(117 <= c0) + switch$3 = 1; + else + switch(c0 - 110 | 0){ + case 0: + var _ae_ = 10; break; + case 4: + var _ae_ = 13; break; + case 6: + var _ae_ = 9; break; + default: switch$3 = 1; + } + else if(98 === c0) var _ae_ = 8; else switch$3 = 1; + if(switch$3) var _ae_ = c0; + return store_char(width, ib, _ae_); + } + function scan_caml_string(width, ib){ + function find_stop$0(counter, width){ + var width$0 = width; + for(;;){ + var c = check_next_char_for_string(width$0, ib); + if(34 === c) return ignore_char(width$0, ib); + if(92 !== c){ + var width$2 = store_char(width$0, ib, c), width$0 = width$2; + continue; + } + var + width$1 = ignore_char(width$0, ib), + match = check_next_char_for_string(width$1, ib); + if(10 === match){ + var _ab_ = ignore_char(width$1, ib); + if(counter >= 50) + return caml_trampoline_return(skip_spaces, [0, _ab_]); + var counter$0 = counter + 1 | 0; + return skip_spaces(counter$0, _ab_); + } + if(13 !== match){ + var width$4 = scan_backslash_char(width$1, ib), width$0 = width$4; + continue; + } + var width$3 = ignore_char(width$1, ib); + if(10 !== check_next_char_for_string(width$3, ib)){ + var width$5 = store_char(width$3, ib, 13), width$0 = width$5; + continue; + } + var _ac_ = ignore_char(width$3, ib); + if(counter >= 50) return caml_trampoline_return(skip_spaces, [0, _ac_]); + var counter$1 = counter + 1 | 0; + return skip_spaces(counter$1, _ac_); + } + } + function skip_spaces(counter, width){ + var width$0 = width; + for(;;){ + if(32 === check_next_char_for_string(width$0, ib)){ + var width$1 = ignore_char(width$0, ib), width$0 = width$1; + continue; + } + if(counter >= 50) + return caml_trampoline_return(find_stop$0, [0, width$0]); + var counter$0 = counter + 1 | 0; + return find_stop$0(counter$0, width$0); + } + } + function find_stop(width){return caml_trampoline(find_stop$0(0, width));} + var c = checked_peek_char(ib); + return 34 === c + ? find_stop(ignore_char(width, ib)) + : character_mismatch(34, c); + } + function scan_chars_in_char_set(char_set, scan_indic, width, ib){ + function scan_chars(i, stp){ + var i$0 = i; + for(;;){ + var c = peek_char(ib), _Z_ = 0 < i$0 ? 1 : 0; + if(_Z_){ + var ___ = 1 - ib[1]; + if(___) + var + _$_ = caml_call2(CamlinternalFormat[1], char_set, c), + _aa_ = _$_ ? c !== stp ? 1 : 0 : _$_; + else + var _aa_ = ___; + } + else + var _aa_ = _Z_; + if(! _aa_) return _aa_; + store_char(Stdlib[19], ib, c); + var i$1 = i$0 - 1 | 0, i$0 = i$1; + } + } + if(! scan_indic) return scan_chars(width, -1); + var c = scan_indic[1]; + scan_chars(width, c); + var _Y_ = 1 - ib[1]; + if(! _Y_) return _Y_; + var ci = peek_char(ib); + return c === ci ? invalidate_current_char(ib) : character_mismatch(c, ci); + } + function scanf_bad_input(ib, x){ + if(x[1] === Scan_failure) + var s = x[2]; + else{ + if(x[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(x, 1); + var s = x[2]; + } + var i = char_count(ib); + return bad_input(caml_call3(Stdlib_Printf[4], _o_, i, s)); + } + function width_of_pad_opt(pad_opt){ + if(! pad_opt) return Stdlib[19]; + var width = pad_opt[1]; + return width; + } + function stopper_of_formatting_lit(fmting){ + if(6 === fmting) return _p_; + var + str = caml_call1(CamlinternalFormat[17], fmting), + stp = caml_string_get(str, 1), + sub_str = + caml_call3 + (Stdlib_String[15], str, 2, caml_ml_string_length(str) - 2 | 0); + return [0, stp, sub_str]; + } + function take_format_readers$0(counter, k, fmt){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return caml_call1(k, 0); + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1], fmt$0 = rest; continue; + case 1: + var rest$0 = fmt$0[1], fmt$0 = rest$0; continue; + case 2: + var rest$1 = fmt$0[2], fmt$0 = rest$1; continue; + case 3: + var rest$2 = fmt$0[2], fmt$0 = rest$2; continue; + case 4: + var rest$3 = fmt$0[4], fmt$0 = rest$3; continue; + case 5: + var rest$4 = fmt$0[4], fmt$0 = rest$4; continue; + case 6: + var rest$5 = fmt$0[4], fmt$0 = rest$5; continue; + case 7: + var rest$6 = fmt$0[4], fmt$0 = rest$6; continue; + case 8: + var rest$7 = fmt$0[4], fmt$0 = rest$7; continue; + case 9: + var rest$8 = fmt$0[2], fmt$0 = rest$8; continue; + case 10: + var rest$9 = fmt$0[1], fmt$0 = rest$9; continue; + case 11: + var rest$10 = fmt$0[2], fmt$0 = rest$10; continue; + case 12: + var rest$11 = fmt$0[2], fmt$0 = rest$11; continue; + case 13: + var rest$12 = fmt$0[3], fmt$0 = rest$12; continue; + case 14: + var + rest$13 = fmt$0[3], + fmtty = fmt$0[2], + _V_ = caml_call1(CamlinternalFormat[21], fmtty), + _W_ = caml_call1(CamlinternalFormatBasics[2], _V_); + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, _W_, rest$13]); + var counter$0 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$0, k, _W_, rest$13); + case 15: + var rest$14 = fmt$0[1], fmt$0 = rest$14; continue; + case 16: + var rest$15 = fmt$0[1], fmt$0 = rest$15; continue; + case 17: + var rest$16 = fmt$0[2], fmt$0 = rest$16; continue; + case 18: + var _X_ = fmt$0[1]; + if(0 === _X_[0]){ + var + rest$17 = fmt$0[2], + fmt$1 = _X_[1][1], + fmt$2 = caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$17), + fmt$0 = fmt$2; + continue; + } + var + rest$18 = fmt$0[2], + fmt$3 = _X_[1][1], + fmt$4 = caml_call2(CamlinternalFormatBasics[3], fmt$3, rest$18), + fmt$0 = fmt$4; + continue; + case 19: + var fmt_rest = fmt$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, fmt_rest);}; + case 20: + var rest$19 = fmt$0[3], fmt$0 = rest$19; continue; + case 21: + var rest$20 = fmt$0[2], fmt$0 = rest$20; continue; + case 22: + var rest$21 = fmt$0[1], fmt$0 = rest$21; continue; + case 23: + var rest$22 = fmt$0[2], ign = fmt$0[1]; + if(typeof ign === "number") + switch(ign){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_format_readers(new_k, rest$22);}; + default: var fmt$0 = rest$22; continue; + } + switch(ign[0]){ + case 0: + var fmt$0 = rest$22; continue; + case 1: + var fmt$0 = rest$22; continue; + case 2: + var fmt$0 = rest$22; continue; + case 3: + var fmt$0 = rest$22; continue; + case 4: + var fmt$0 = rest$22; continue; + case 5: + var fmt$0 = rest$22; continue; + case 6: + var fmt$0 = rest$22; continue; + case 7: + var fmt$0 = rest$22; continue; + case 8: + var fmt$0 = rest$22; continue; + case 9: + var fmtty$0 = ign[2]; + if(counter >= 50) + return caml_trampoline_return + (take_fmtty_format_readers$0, [0, k, fmtty$0, rest$22]); + var counter$1 = counter + 1 | 0; + return take_fmtty_format_readers$0(counter$1, k, fmtty$0, rest$22); + case 10: + var fmt$0 = rest$22; continue; + default: var fmt$0 = rest$22; continue; + } + default: var rest$23 = fmt$0[3], fmt$0 = rest$23; continue; + } + } + } + function take_fmtty_format_readers$0(counter, k, fmtty, fmt){ + var fmtty$0 = fmtty; + for(;;){ + if(typeof fmtty$0 !== "number") + switch(fmtty$0[0]){ + case 0: + var fmtty$1 = fmtty$0[1], fmtty$0 = fmtty$1; continue; + case 1: + var fmtty$2 = fmtty$0[1], fmtty$0 = fmtty$2; continue; + case 2: + var fmtty$3 = fmtty$0[1], fmtty$0 = fmtty$3; continue; + case 3: + var fmtty$4 = fmtty$0[1], fmtty$0 = fmtty$4; continue; + case 4: + var fmtty$5 = fmtty$0[1], fmtty$0 = fmtty$5; continue; + case 5: + var fmtty$6 = fmtty$0[1], fmtty$0 = fmtty$6; continue; + case 6: + var fmtty$7 = fmtty$0[1], fmtty$0 = fmtty$7; continue; + case 7: + var fmtty$8 = fmtty$0[1], fmtty$0 = fmtty$8; continue; + case 8: + var fmtty$9 = fmtty$0[2], fmtty$0 = fmtty$9; continue; + case 9: + var + rest = fmtty$0[3], + ty2 = fmtty$0[2], + ty1 = fmtty$0[1], + _U_ = caml_call1(CamlinternalFormat[21], ty1), + ty = caml_call2(CamlinternalFormat[22], _U_, ty2), + fmtty$10 = caml_call2(CamlinternalFormatBasics[1], ty, rest), + fmtty$0 = fmtty$10; + continue; + case 10: + var fmtty$11 = fmtty$0[1], fmtty$0 = fmtty$11; continue; + case 11: + var fmtty$12 = fmtty$0[1], fmtty$0 = fmtty$12; continue; + case 12: + var fmtty$13 = fmtty$0[1], fmtty$0 = fmtty$13; continue; + case 13: + var fmt_rest = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest, fmt);}; + default: + var fmt_rest$0 = fmtty$0[1]; + return function(reader){ + function new_k(readers_rest){ + return caml_call1(k, [0, reader, readers_rest]); + } + return take_fmtty_format_readers(new_k, fmt_rest$0, fmt);}; + } + if(counter >= 50) + return caml_trampoline_return(take_format_readers$0, [0, k, fmt]); + var counter$0 = counter + 1 | 0; + return take_format_readers$0(counter$0, k, fmt); + } + } + function take_format_readers(k, fmt){ + return caml_trampoline(take_format_readers$0(0, k, fmt)); + } + function take_fmtty_format_readers(k, fmtty, fmt){ + return caml_trampoline(take_fmtty_format_readers$0(0, k, fmtty, fmt)); + } + function pad_prec_scanf(ib, fmt, readers, pad, prec, scan, token){ + if(typeof pad === "number"){ + if(typeof prec !== "number"){ + var p = prec[1]; + caml_call3(scan, Stdlib[19], p, ib); + var x$0 = caml_call1(token, ib); + return [0, x$0, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion); + caml_call3(scan, Stdlib[19], Stdlib[19], ib); + var x = caml_call1(token, ib); + return [0, x, make_scanf(ib, fmt, readers)]; + } + if(0 !== pad[0]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$2); + if(! pad[1]) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$1); + var w = pad[2]; + if(typeof prec !== "number"){ + var p$0 = prec[1]; + caml_call3(scan, w, p$0, ib); + var x$2 = caml_call1(token, ib); + return [0, x$2, make_scanf(ib, fmt, readers)]; + } + if(prec) return caml_call1(Stdlib[1], cst_scanf_bad_conversion$0); + caml_call3(scan, w, Stdlib[19], ib); + var x$1 = caml_call1(token, ib); + return [0, x$1, make_scanf(ib, fmt, readers)]; + } + function make_scanf(ib, fmt, readers){ + var fmt$0 = fmt; + for(;;){ + if(typeof fmt$0 === "number") return 0; + switch(fmt$0[0]){ + case 0: + var rest = fmt$0[1]; + store_char(0, ib, checked_peek_char(ib)); + var c$1 = token_char(ib); + return [0, c$1, make_scanf(ib, rest, readers)]; + case 1: + var + rest$0 = fmt$0[1], + width$0 = 0, + find_stop = + function(width){ + var c = check_next_char_for_char(width, ib); + return 39 === c + ? ignore_char(width, ib) + : character_mismatch(39, c); + }, + c = checked_peek_char(ib); + if(39 === c){ + var + width = ignore_char(width$0, ib), + c$0 = check_next_char_for_char(width, ib); + if(92 === c$0) + find_stop(scan_backslash_char(ignore_char(width, ib), ib)); + else + find_stop(store_char(width, ib, c$0)); + } + else + character_mismatch(39, c); + var c$2 = token_char(ib); + return [0, c$2, make_scanf(ib, rest$0, readers)]; + case 2: + var pad = fmt$0[1], match = fmt$0[2]; + if(typeof match !== "number") + switch(match[0]){ + case 17: + var + rest$2 = match[2], + fmting_lit = match[1], + match$0 = stopper_of_formatting_lit(fmting_lit), + str = match$0[2], + stp = match$0[1], + scan$0 = + function(width, param, ib){ + return scan_string([0, stp], width, ib); + }, + str_rest = [11, str, rest$2]; + return pad_prec_scanf + (ib, str_rest, readers, pad, 0, scan$0, token_string); + case 18: + var _G_ = match[1]; + if(0 === _G_[0]){ + var + rest$3 = match[2], + fmt$1 = _G_[1][1], + scan$1 = + function(width, param, ib){ + return scan_string(_q_, width, ib); + }; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$1, rest$3), + readers, + pad, + 0, + scan$1, + token_string); + } + var + rest$4 = match[2], + fmt$2 = _G_[1][1], + scan$2 = + function(width, param, ib){return scan_string(_r_, width, ib);}; + return pad_prec_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$2, rest$4), + readers, + pad, + 0, + scan$2, + token_string); + } + var + rest$1 = fmt$0[2], + scan = function(width, param, ib){return scan_string(0, width, ib);}; + return pad_prec_scanf(ib, rest$1, readers, pad, 0, scan, token_string); + case 3: + var + rest$5 = fmt$0[2], + pad$0 = fmt$0[1], + scan$3 = + function(width, param, ib){return scan_caml_string(width, ib);}; + return pad_prec_scanf + (ib, rest$5, readers, pad$0, 0, scan$3, token_string); + case 4: + var + rest$6 = fmt$0[4], + prec = fmt$0[3], + pad$1 = fmt$0[2], + iconv = fmt$0[1], + conv = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv)), + scan$4 = + function(width, param, ib){ + return scan_int_conversion(conv, width, ib); + }; + return pad_prec_scanf + (ib, + rest$6, + readers, + pad$1, + prec, + scan$4, + function(ib){ + return caml_int_of_string(token_int_literal(conv, ib)); + }); + case 5: + var + rest$7 = fmt$0[4], + prec$0 = fmt$0[3], + pad$2 = fmt$0[2], + iconv$0 = fmt$0[1], + conv$0 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$0)), + scan$5 = + function(width, param, ib){ + return scan_int_conversion(conv$0, width, ib); + }; + return pad_prec_scanf + (ib, + rest$7, + readers, + pad$2, + prec$0, + scan$5, + function(ib){ + return caml_int_of_string(token_int_literal(conv$0, ib)); + }); + case 6: + var + rest$8 = fmt$0[4], + prec$1 = fmt$0[3], + pad$3 = fmt$0[2], + iconv$1 = fmt$0[1], + conv$1 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$1)), + scan$6 = + function(width, param, ib){ + return scan_int_conversion(conv$1, width, ib); + }; + return pad_prec_scanf + (ib, + rest$8, + readers, + pad$3, + prec$1, + scan$6, + function(ib){ + return caml_int_of_string(token_int_literal(conv$1, ib)); + }); + case 7: + var + rest$9 = fmt$0[4], + prec$2 = fmt$0[3], + pad$4 = fmt$0[2], + iconv$2 = fmt$0[1], + conv$2 = + integer_conversion_of_char + (caml_call1(CamlinternalFormat[16], iconv$2)), + scan$7 = + function(width, param, ib){ + return scan_int_conversion(conv$2, width, ib); + }; + return pad_prec_scanf + (ib, + rest$9, + readers, + pad$4, + prec$2, + scan$7, + function(ib){ + return runtime.caml_int64_of_string + (token_int_literal(conv$2, ib)); + }); + case 8: + switch(fmt$0[1][2]){ + case 5: + case 8: + var rest$11 = fmt$0[4], prec$4 = fmt$0[3], pad$6 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$11, + readers, + pad$6, + prec$4, + scan_caml_float, + token_float); + case 6: + case 7: + var rest$12 = fmt$0[4], prec$5 = fmt$0[3], pad$7 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$12, + readers, + pad$7, + prec$5, + scan_hex_float, + token_float); + default: + var rest$10 = fmt$0[4], prec$3 = fmt$0[3], pad$5 = fmt$0[2]; + return pad_prec_scanf + (ib, + rest$10, + readers, + pad$5, + prec$3, + scan_float, + token_float); + } + case 9: + var + rest$13 = fmt$0[2], + pad$8 = fmt$0[1], + scan$8 = + function(param, _T_, ib){ + var + c = checked_peek_char(ib), + m = + 102 === c + ? 5 + : 116 + === c + ? 4 + : bad_input(caml_call2(Stdlib_Printf[4], _n_, c)); + return scan_string(0, m, ib); + }; + return pad_prec_scanf + (ib, rest$13, readers, pad$8, 0, scan$8, token_bool); + case 10: + var rest$14 = fmt$0[1]; + if(! end_of_input(ib)) return bad_input(cst_end_of_input_not_found); + var fmt$0 = rest$14; + continue; + case 11: + var + rest$15 = fmt$0[2], + str$0 = fmt$0[1], + _H_ = function(_S_){return check_char(ib, _S_);}; + caml_call2(Stdlib_String[29], _H_, str$0); + var fmt$0 = rest$15; + continue; + case 12: + var rest$16 = fmt$0[2], chr = fmt$0[1]; + check_char(ib, chr); + var fmt$0 = rest$16; + continue; + case 13: + var rest$17 = fmt$0[3], fmtty = fmt$0[2], pad_opt = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt), ib); + var s = token_string(ib); + try{ + var _I_ = caml_call2(CamlinternalFormat[14], s, fmtty), fmt$3 = _I_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt$3 = bad_input(msg); + } + return [0, fmt$3, make_scanf(ib, rest$17, readers)]; + case 14: + var rest$18 = fmt$0[3], fmtty$0 = fmt$0[2], pad_opt$0 = fmt$0[1]; + scan_caml_string(width_of_pad_opt(pad_opt$0), ib); + var s$0 = token_string(ib); + try{ + var + fmt$6 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + fmt$7 = caml_call2(CamlinternalFormat[13], 0, s$0)[1], + _K_ = caml_call1(CamlinternalFormat[21], fmtty$0), + _L_ = caml_call1(CamlinternalFormatBasics[2], _K_), + fmt$8 = caml_call2(CamlinternalFormat[12], fmt$7, _L_), + _M_ = caml_call1(CamlinternalFormatBasics[2], fmtty$0), + _N_ = caml_call2(CamlinternalFormat[12], fmt$6, _M_), + fmt$5 = fmt$8, + fmt$4 = _N_; + } + catch(exn){ + var exn$0 = caml_wrap_exception(exn); + if(exn$0[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(exn$0, 0); + var + msg$0 = exn$0[2], + _J_ = bad_input(msg$0), + fmt$5 = _J_[2], + fmt$4 = _J_[1]; + } + return [0, + [0, fmt$4, s$0], + make_scanf + (ib, + caml_call2(CamlinternalFormatBasics[3], fmt$5, rest$18), + readers)]; + case 15: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_a); + case 16: + return caml_call1(Stdlib[1], cst_scanf_bad_conversion_t); + case 17: + var + rest$19 = fmt$0[2], + formatting_lit = fmt$0[1], + _O_ = caml_call1(CamlinternalFormat[17], formatting_lit), + _P_ = function(_R_){return check_char(ib, _R_);}; + caml_call2(Stdlib_String[29], _P_, _O_); + var fmt$0 = rest$19; + continue; + case 18: + var _Q_ = fmt$0[1]; + if(0 === _Q_[0]){ + var rest$20 = fmt$0[2], fmt$9 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 123); + var + fmt$10 = caml_call2(CamlinternalFormatBasics[3], fmt$9, rest$20), + fmt$0 = fmt$10; + continue; + } + var rest$21 = fmt$0[2], fmt$11 = _Q_[1][1]; + check_char(ib, 64); + check_char(ib, 91); + var + fmt$12 = caml_call2(CamlinternalFormatBasics[3], fmt$11, rest$21), + fmt$0 = fmt$12; + continue; + case 19: + var fmt_rest = fmt$0[1]; + if(! readers) return caml_call1(Stdlib[1], cst_scanf_missing_reader); + var + readers_rest = readers[2], + reader = readers[1], + x = caml_call1(reader, ib); + return [0, x, make_scanf(ib, fmt_rest, readers_rest)]; + case 20: + var width_opt = fmt$0[1], match$1 = fmt$0[3]; + if(typeof match$1 !== "number" && 17 === match$1[0]){ + var + rest$23 = match$1[2], + fmting_lit$0 = match$1[1], + char_set$0 = fmt$0[2], + match$2 = stopper_of_formatting_lit(fmting_lit$0), + str$1 = match$2[2], + stp$0 = match$2[1], + width$2 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set$0, [0, stp$0], width$2, ib); + var s$2 = token_string(ib), str_rest$0 = [11, str$1, rest$23]; + return [0, s$2, make_scanf(ib, str_rest$0, readers)]; + } + var + rest$22 = fmt$0[3], + char_set = fmt$0[2], + width$1 = width_of_pad_opt(width_opt); + scan_chars_in_char_set(char_set, 0, width$1, ib); + var s$1 = token_string(ib); + return [0, s$1, make_scanf(ib, rest$22, readers)]; + case 21: + var rest$24 = fmt$0[2], counter = fmt$0[1]; + switch(counter){ + case 0: + var count = ib[5]; break; + case 1: + var count = char_count(ib); break; + default: var count = ib[6]; + } + return [0, count, make_scanf(ib, rest$24, readers)]; + case 22: + var rest$25 = fmt$0[1], c$3 = checked_peek_char(ib); + return [0, c$3, make_scanf(ib, rest$25, readers)]; + case 23: + var + rest$26 = fmt$0[2], + ign = fmt$0[1], + fmt$13 = caml_call2(CamlinternalFormat[6], ign, rest$26)[1], + match$3 = make_scanf(ib, fmt$13, readers); + if(! match$3) + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + var arg_rest = match$3[2]; + return arg_rest; + default: return caml_call1(Stdlib[1], cst_scanf_bad_conversion_custo); + } + } + } + function kscanf_gen(ib, ef, af, param){ + var str = param[2], fmt = param[1]; + function k(readers, f$1){ + caml_call1(Stdlib_Buffer[9], ib[8]); + try{var args$1 = make_scanf(ib, fmt, readers);} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0); + if + (exc[1] !== Scan_failure && exc[1] !== Stdlib[7] && exc !== Stdlib[12]){ + if(exc[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exc, 0); + var + msg = exc[2], + _C_ = caml_call1(Stdlib_String[24], str), + _D_ = caml_call2(Stdlib[28], _C_, cst$0), + _E_ = caml_call2(Stdlib[28], cst_in_format, _D_), + _F_ = caml_call2(Stdlib[28], msg, _E_); + return caml_call1(Stdlib[1], _F_); + } + return caml_call2(ef, ib, exc); + } + var f = f$1, args = args$1; + for(;;){ + if(! args) return caml_call1(af, f); + var + args$0 = args[2], + x = args[1], + f$0 = caml_call1(f, x), + f = f$0, + args = args$0; + } + } + return take_format_readers(k, fmt); + } + function kscanf(ib, ef, fmt){ + return kscanf_gen(ib, ef, function(x){return x;}, fmt); + } + function kscanf_opt(ib, fmt){ + function _A_(x){return [0, x];} + return kscanf_gen(ib, function(param, _B_){return 0;}, _A_, fmt); + } + function bscanf(ib, fmt){return kscanf(ib, scanf_bad_input, fmt);} + function bscanf_opt(ib, fmt){return kscanf_opt(ib, fmt);} + function ksscanf(s, ef, fmt){return kscanf(from_string(s), ef, fmt);} + function sscanf(s, fmt){ + return kscanf(from_string(s), scanf_bad_input, fmt); + } + function sscanf_opt(s, fmt){return kscanf_opt(from_string(s), fmt);} + function scanf(fmt){return kscanf(stdin, scanf_bad_input, fmt);} + function scanf_opt(fmt){return kscanf_opt(stdin, fmt);} + function bscanf_format(ib, format, f){ + scan_caml_string(Stdlib[19], ib); + var str = token_string(ib); + try{var _z_ = caml_call2(CamlinternalFormat[15], str, format), fmt = _z_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[7]) throw caml_maybe_attach_backtrace(exn, 0); + var msg = exn[2], fmt = bad_input(msg); + } + return caml_call1(f, fmt); + } + function sscanf_format(s, format, f){ + return bscanf_format(from_string(s), format, f); + } + function format_from_string(s, fmt){ + function _w_(x){return x;} + var + _x_ = caml_call1(Stdlib_String[24], s), + _y_ = caml_call2(Stdlib[28], _x_, cst$1); + return sscanf_format(caml_call2(Stdlib[28], cst$2, _y_), fmt, _w_); + } + function unescaped(s){ + function _u_(x){return x;} + var _v_ = caml_call2(Stdlib[28], s, cst$3); + return caml_call1(sscanf(caml_call2(Stdlib[28], cst$4, _v_), _t_), _u_); + } + var + Stdlib_Scanf = + [0, + [0, + stdin, + open_in, + open_in_bin, + close_in, + open_in, + open_in_bin, + from_string, + from_function, + from_channel, + end_of_input, + beginning_of_input, + name_of_input], + Scan_failure, + bscanf, + bscanf_opt, + sscanf, + sscanf_opt, + scanf, + scanf_opt, + kscanf, + ksscanf, + bscanf_format, + sscanf_format, + format_from_string, + unescaped]; + runtime.caml_register_global(64, Stdlib_Scanf, "Stdlib__Scanf"); + return; + } + (globalThis)); + +//# 22718 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_register_named_value = runtime.caml_register_named_value, + global_data = runtime.caml_get_global_data(), + Stdlib_Obj = global_data.Stdlib__Obj, + register = caml_register_named_value; + function register_exception(name, exn){ + var + _a_ = Stdlib_Obj[10], + slot = runtime.caml_obj_tag(exn) === _a_ ? exn : exn[1]; + return caml_register_named_value(name, slot); + } + var Stdlib_Callback = [0, register, register_exception]; + runtime.caml_register_global(1, Stdlib_Callback, "Stdlib__Callback"); + return; + } + (globalThis)); + +//# 23686 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Obj = global_data.Stdlib__Obj, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Seq = global_data.Stdlib__Seq, + Stdlib_Int = global_data.Stdlib__Int, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, 0], + _b_ = [0, 0], + _a_ = [0, 0]; + function MakeSeeded(H){ + var + prng = [246, function(_aM_){return caml_call1(Stdlib_Random[15][2], 0);}]; + function create(opt, initial_size){ + if(opt) + var sth = opt[1], random = sth; + else + var random = caml_call1(Stdlib_Hashtbl[17], 0); + var x = 16; + for(;;){ + if(initial_size > x && Stdlib_Sys[13] >= (x * 2 | 0)){var x$0 = x * 2 | 0, x = x$0; continue;} + if(random){ + var _aK_ = runtime.caml_obj_tag(prng); + if(250 === _aK_) + var _aL_ = prng[1]; + else{ + var switch$0 = 0; + if(246 !== _aK_ && 244 !== _aK_){var _aL_ = prng; switch$0 = 1;} + if(! switch$0) var _aL_ = caml_call1(CamlinternalLazy[2], prng); + } + var seed = caml_call1(Stdlib_Random[15][4], _aL_); + } + else + var seed = 0; + return [0, 0, caml_make_vect(x, 0), seed, x]; + } + } + function clear(h){ + h[1] = 0; + var len = h[2].length - 1, _aI_ = len - 1 | 0, _aH_ = 0; + if(_aI_ >= 0){ + var i = _aH_; + for(;;){ + caml_check_bound(h[2], i)[1 + i] = 0; + var _aJ_ = i + 1 | 0; + if(_aI_ !== i){var i = _aJ_; continue;} + break; + } + } + return 0; + } + function reset(h){ + var len = h[2].length - 1; + return len === h[4] + ? clear(h) + : (h[1] = 0, h[2] = caml_make_vect(h[4], 0), 0); + } + function copy(h){ + var _aE_ = h[4], _aF_ = h[3], _aG_ = caml_call1(Stdlib_Array[6], h[2]); + return [0, h[1], _aG_, _aF_, _aE_]; + } + function key_index(h, hkey){return hkey & (h[2].length - 1 - 1 | 0);} + function clean(h){ + function do_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hkey = param$0[1], rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var rest$0 = param$0[3], c$0 = param$0[2]; + return [0, hkey, c$0, do_bucket(rest$0)]; + } + h[1] = h[1] - 1 | 0; + var param$0 = rest; + } + } + var d = h[2], _aC_ = d.length - 1 - 1 | 0, _aB_ = 0; + if(_aC_ >= 0){ + var i = _aB_; + for(;;){ + d[1 + i] = do_bucket(caml_check_bound(d, i)[1 + i]); + var _aD_ = i + 1 | 0; + if(_aC_ !== i){var i = _aD_; continue;} + break; + } + } + return 0; + } + function resize(h){ + var odata = h[2], osize = odata.length - 1, nsize = osize * 2 | 0; + clean(h); + var + _av_ = nsize < Stdlib_Sys[13] ? 1 : 0, + _aw_ = _av_ ? (osize >>> 1 | 0) <= h[1] ? 1 : 0 : _av_; + if(_aw_){ + var ndata = caml_make_vect(nsize, 0); + h[2] = ndata; + var + insert_bucket = + function(param){ + if(! param) return 0; + var rest = param[3], data = param[2], hkey = param[1]; + insert_bucket(rest); + var nidx = key_index(h, hkey); + ndata[1 + nidx] = + [0, hkey, data, caml_check_bound(ndata, nidx)[1 + nidx]]; + return 0; + }, + _ay_ = osize - 1 | 0, + _ax_ = 0; + if(_ay_ >= 0){ + var i = _ax_; + for(;;){ + insert_bucket(caml_check_bound(odata, i)[1 + i]); + var _aA_ = i + 1 | 0; + if(_ay_ !== i){var i = _aA_; continue;} + break; + } + } + var _az_ = 0; + } + else + var _az_ = _aw_; + return _az_; + } + function add(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + container = caml_call2(H[1], key, info), + bucket = [0, hkey, container, caml_check_bound(h[2], i)[1 + i]]; + caml_check_bound(h[2], i)[1 + i] = bucket; + h[1] = h[1] + 1 | 0; + var _au_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _au_ ? resize(h) : _au_; + } + function remove(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function remove_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], next = param$0[3], c = param$0[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + h[1] = h[1] - 1 | 0; return next; + case 1: + return [0, hk, c, remove_bucket(next)]; + default: h[1] = h[1] - 1 | 0; var param$0 = next; continue; + } + var next$0 = param$0[3], c$0 = param$0[2]; + return [0, hk, c$0, remove_bucket(next$0)]; + } + } + var + i = key_index(h, hkey), + _at_ = remove_bucket(caml_check_bound(h[2], i)[1 + i]); + caml_check_bound(h[2], i)[1 + i] = _at_; + return 0; + } + function find(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _as_ = key_index(h, hkey), + param = caml_check_bound(h[2], _as_)[1 + _as_]; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], rest = param[3], c = param[2]; + if(hkey !== hk){var rest$0 = param[3], param = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return d;} + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + } + } + function find_opt(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _ar_ = key_index(h, hkey), + param = caml_check_bound(h[2], _ar_)[1 + _ar_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hkey === hk) + switch(caml_call2(H[3], c, key)){ + case 0: + var d = caml_call1(H[4], c); + if(d) return d; + var param = rest; + continue; + case 1: + var param = rest; continue; + default: var param = rest; continue; + } + var rest$0 = param[3], param = rest$0; + } + } + function find_all(h, key){ + var hkey = caml_call2(H[2], h[3], key); + function find_in_bucket(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var hk = param$0[1], rest = param$0[3], c = param$0[2]; + if(hkey !== hk){var rest$0 = param$0[3], param$0 = rest$0; continue;} + switch(caml_call2(H[3], c, key)){ + case 0: + var match = caml_call1(H[4], c); + if(match){var d = match[1]; return [0, d, find_in_bucket(rest)];} + var param$0 = rest; + continue; + case 1: + var param$0 = rest; continue; + default: var param$0 = rest; continue; + } + } + } + var _aq_ = key_index(h, hkey); + return find_in_bucket(caml_check_bound(h[2], _aq_)[1 + _aq_]); + } + function replace(h, key, info){ + var + hkey = caml_call2(H[2], h[3], key), + i = key_index(h, hkey), + l = caml_check_bound(h[2], i)[1 + i]; + try{ + var param = l; + for(;;){ + if(! param) throw caml_maybe_attach_backtrace(Stdlib[8], 1); + var hk = param[1], next = param[3], c = param[2]; + if(hkey !== hk){var next$0 = param[3], param = next$0; continue;} + if(caml_call2(H[3], c, key)){var param = next; continue;} + var _am_ = caml_call3(H[5], c, key, info); + return _am_; + } + } + catch(_ap_){ + var _an_ = caml_wrap_exception(_ap_); + if(_an_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_an_, 0); + var container = caml_call2(H[1], key, info); + caml_check_bound(h[2], i)[1 + i] = [0, hkey, container, l]; + h[1] = h[1] + 1 | 0; + var _ao_ = h[2].length - 1 << 1 < h[1] ? 1 : 0; + return _ao_ ? resize(h) : _ao_; + } + } + function mem(h, key){ + var + hkey = caml_call2(H[2], h[3], key), + _al_ = key_index(h, hkey), + param = caml_check_bound(h[2], _al_)[1 + _al_]; + for(;;){ + if(! param) return 0; + var hk = param[1], rest = param[3], c = param[2]; + if(hk !== hkey){var rest$0 = param[3], param = rest$0; continue;} + if(! caml_call2(H[3], c, key)) return 1; + var param = rest; + } + } + function length(h){return h[1];} + function bucket_length(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var + rest = param$0[3], + accu$1 = accu$0 + 1 | 0, + accu$0 = accu$1, + param$0 = rest; + } + } + function stats(h){ + var _af_ = h[2], _ag_ = 0; + function _ah_(m, b){ + var _ak_ = bucket_length(0, b); + return caml_call2(Stdlib_Int[11], m, _ak_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ah_, _ag_, _af_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ai_ = h[2]; + function _aj_(b){ + var l = bucket_length(0, b); + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _aj_, _ai_); + return [0, h[1], h[2].length - 1, mbl, histo]; + } + function bucket_length_alive(accu, param){ + var accu$0 = accu, param$0 = param; + for(;;){ + if(! param$0) return accu$0; + var rest = param$0[3], c = param$0[2]; + if(caml_call1(H[6], c)){ + var accu$1 = accu$0 + 1 | 0, accu$0 = accu$1, param$0 = rest; + continue; + } + var rest$0 = param$0[3], param$0 = rest$0; + } + } + function stats_alive(h){ + var size = [0, 0], _$_ = h[2], _aa_ = 0; + function _ab_(m, b){ + var _ae_ = bucket_length_alive(0, b); + return caml_call2(Stdlib_Int[11], m, _ae_); + } + var + mbl = caml_call3(Stdlib_Array[15], _ab_, _aa_, _$_), + histo = caml_make_vect(mbl + 1 | 0, 0), + _ac_ = h[2]; + function _ad_(b){ + var l = bucket_length_alive(0, b); + size[1] = size[1] + l | 0; + histo[1 + l] = caml_check_bound(histo, l)[1 + l] + 1 | 0; + return 0; + } + caml_call2(Stdlib_Array[11], _ad_, _ac_); + return [0, size[1], h[2].length - 1, mbl, histo]; + } + function add_seq(tbl, i){ + function ___(param){ + var v = param[2], k = param[1]; + return add(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], ___, i); + } + function replace_seq(tbl, i){ + function _Z_(param){ + var v = param[2], k = param[1]; + return replace(tbl, k, v); + } + return caml_call2(Stdlib_Seq[4], _Z_, i); + } + function of_seq(i){ + var tbl = create(0, 16); + replace_seq(tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function create(param){return caml_call1(Stdlib_Obj[24][1], 1);} + function get_key(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function check_key(t){return caml_call2(Stdlib_Obj[24][7], t, 0);} + function get_data(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make(key, data){ + var eph = create(0); + set_data(eph, data); + set_key(eph, key); + return eph; + } + function query(eph, key){ + var match = get_key(eph); + if(! match) return 0; + var k = match[1]; + return k === key ? get_data(eph) : 0; + } + function MakeSeeded$0(H){ + function create$0(k, d){ + var c = create(0); + set_data(c, d); + set_key(c, k); + return c; + } + var seeded_hash = H[2]; + function equal(c, k){ + var match = get_key(c); + if(! match) return 2; + var k$0 = match[1]; + return caml_call2(H[1], k, k$0) ? 0 : 1; + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + set_key(c, k); + return set_data(c, d); + } + return MakeSeeded + ([0, + create$0, + seeded_hash, + equal, + get_data, + set_key_data, + check_key]); + } + function Make(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$0([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _Y_ = include[1]; + function create(sz){return caml_call2(_Y_, _a_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$0(param){return [0, 0];} + function add(b, k, d){ + var _X_ = b[1]; + b[1] = [0, make(k, d), _X_]; + return 0; + } + function test_key(k, e){ + var match = get_key(e); + if(match){var x = match[1]; if(x === k) return 1;} + return 0; + } + function remove(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_key(k, h)){b[1] = caml_call2(Stdlib_List[12], acc, t); return 0;} + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find(b, k){ + var _U_ = b[1]; + function _V_(_W_){return test_key(k, _W_);} + var match = caml_call2(Stdlib_List[39], _V_, _U_); + if(! match) return 0; + var e = match[1]; + return get_data(e); + } + function length(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear(b){b[1] = 0; return 0;} + function create$0(param){return caml_call1(Stdlib_Obj[24][1], 2);} + function get_key1(t){return caml_call2(Stdlib_Obj[24][3], t, 0);} + function set_key1(t, k){return caml_call3(Stdlib_Obj[24][5], t, 0, k);} + function get_key2(t){return caml_call2(Stdlib_Obj[24][3], t, 1);} + function set_key2(t, k){return caml_call3(Stdlib_Obj[24][5], t, 1, k);} + function get_data$0(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$0(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$1(key1, key2, data){ + var eph = create$0(0); + set_data$0(eph, data); + set_key1(eph, key1); + set_key2(eph, key2); + return eph; + } + function query$0(eph, key1, key2){ + var match = get_key1(eph); + if(! match) return 0; + var k = match[1]; + if(k !== key1) return 0; + var match$0 = get_key2(eph); + if(! match$0) return 0; + var k$0 = match$0[1]; + return k$0 === key2 ? get_data$0(eph) : 0; + } + function MakeSeeded$1(H1, H2){ + function create(param, d){ + var k2 = param[2], k1 = param[1], c = create$0(0); + set_data$0(c, d); + set_key1(c, k1); + set_key2(c, k2); + return c; + } + function seeded_hash(seed, param){ + var + k2 = param[2], + k1 = param[1], + _T_ = caml_call2(H2[2], seed, k2) * 65599 | 0; + return caml_call2(H1[2], seed, k1) + _T_ | 0; + } + function equal(c, param){ + var + k2 = param[2], + k1 = param[1], + match = get_key1(c), + match$0 = get_key2(c); + if(match && match$0){ + var k2$0 = match$0[1], k1$0 = match[1]; + if(caml_call2(H1[1], k1, k1$0) && caml_call2(H2[1], k2, k2$0)) return 0; + return 1; + } + return 2; + } + function set_key_data(c, param, d){ + var k2 = param[2], k1 = param[1]; + caml_call1(Stdlib_Obj[24][12], c); + set_key1(c, k1); + set_key2(c, k2); + return set_data$0(c, d); + } + function check_key(c){ + var _S_ = caml_call2(Stdlib_Obj[24][7], c, 0); + return _S_ ? caml_call2(Stdlib_Obj[24][7], c, 1) : _S_; + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$0, + set_key_data, + check_key]); + } + function Make$0(H1, H2){ + var equal = H2[1]; + function seeded_hash(seed, x){return caml_call1(H2[2], x);} + var equal$0 = H1[1], _Q_ = [0, equal, seeded_hash]; + function seeded_hash$0(seed, x){return caml_call1(H1[2], x);} + var + include = MakeSeeded$1([0, equal$0, seeded_hash$0], _Q_), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _R_ = include[1]; + function create(sz){return caml_call2(_R_, _b_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$2(param){return [0, 0];} + function add$0(b, k1, k2, d){ + var _P_ = b[1]; + b[1] = [0, make$1(k1, k2, d), _P_]; + return 0; + } + function test_keys(k1, k2, e){ + var match = get_key1(e), match$0 = get_key2(e); + if(match && match$0){ + var x2 = match$0[1], x1 = match[1]; + if(x1 === k1 && x2 === k2) return 1; + } + return 0; + } + function remove$0(b, k1, k2){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys(k1, k2, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$0(b, k1, k2){ + var _M_ = b[1]; + function _N_(_O_){return test_keys(k1, k2, _O_);} + var match = caml_call2(Stdlib_List[39], _N_, _M_); + if(! match) return 0; + var e = match[1]; + return get_data$0(e); + } + function length$0(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$0(b){b[1] = 0; return 0;} + function create$1(n){return caml_call1(Stdlib_Obj[24][1], n);} + function length$1(k){return caml_call1(Stdlib_Obj[24][2], k);} + function get_key$0(t, n){return caml_call2(Stdlib_Obj[24][3], t, n);} + function set_key$0(t, n, k){return caml_call3(Stdlib_Obj[24][5], t, n, k);} + function get_data$1(t){return caml_call1(Stdlib_Obj[24][9], t);} + function set_data$1(t, d){return caml_call2(Stdlib_Obj[24][11], t, d);} + function make$3(keys, data){ + var l = keys.length - 1, eph = create$1(l); + set_data$1(eph, data); + var _K_ = l - 1 | 0, _J_ = 0; + if(_K_ >= 0){ + var i = _J_; + for(;;){ + set_key$0(eph, i, caml_check_bound(keys, i)[1 + i]); + var _L_ = i + 1 | 0; + if(_K_ !== i){var i = _L_; continue;} + break; + } + } + return eph; + } + function query$1(eph, keys){ + var l = length$1(eph); + try{ + if(l !== keys.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _F_ = l - 1 | 0, _E_ = 0; + if(_F_ >= 0){ + var i = _E_; + for(;;){ + var match = get_key$0(eph, i); + if(! match) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var k = match[1]; + if(k !== caml_check_bound(keys, i)[1 + i]) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _H_ = i + 1 | 0; + if(_F_ !== i){var i = _H_; continue;} + break; + } + } + var _G_ = get_data$1(eph); + return _G_; + } + catch(_I_){ + var _D_ = caml_wrap_exception(_I_); + if(_D_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_D_, 0); + } + } + function MakeSeeded$2(H){ + function create(k, d){ + var c = create$1(k.length - 1); + set_data$1(c, d); + var _B_ = k.length - 1 - 1 | 0, _A_ = 0; + if(_B_ >= 0){ + var i = _A_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _C_ = i + 1 | 0; + if(_B_ !== i){var i = _C_; continue;} + break; + } + } + return c; + } + function seeded_hash(seed, k){ + var h = [0, 0], _w_ = k.length - 1 - 1 | 0, _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + var _x_ = h[1], _y_ = caml_check_bound(k, i)[1 + i]; + h[1] = (caml_call2(H[2], seed, _y_) * 65599 | 0) + _x_ | 0; + var _z_ = i + 1 | 0; + if(_w_ !== i){var i = _z_; continue;} + break; + } + } + return h[1]; + } + function equal(c, k){ + var len = k.length - 1, len$0 = length$1(c); + if(len !== len$0) return 1; + var i$1 = len - 1 | 0, i = i$1; + for(;;){ + if(0 > i) return 0; + var match = get_key$0(c, i); + if(! match) return 2; + var ki = match[1], _u_ = caml_check_bound(k, i)[1 + i]; + if(! caml_call2(H[1], _u_, ki)) return 1; + var i$0 = i - 1 | 0, i = i$0; + } + } + function set_key_data(c, k, d){ + caml_call1(Stdlib_Obj[24][12], c); + var _s_ = k.length - 1 - 1 | 0, _r_ = 0; + if(_s_ >= 0){ + var i = _r_; + for(;;){ + set_key$0(c, i, caml_check_bound(k, i)[1 + i]); + var _t_ = i + 1 | 0; + if(_s_ !== i){var i = _t_; continue;} + break; + } + } + return set_data$1(c, d); + } + function check_key(c){ + var i$1 = length$1(c) - 1 | 0, i = i$1; + for(;;){ + var _p_ = i < 0 ? 1 : 0; + if(_p_) + var _q_ = _p_; + else{ + var _o_ = caml_call2(Stdlib_Obj[24][7], c, i); + if(_o_){var i$0 = i - 1 | 0, i = i$0; continue;} + var _q_ = _o_; + } + return _q_; + } + } + return MakeSeeded + ([0, + create, + seeded_hash, + equal, + get_data$1, + set_key_data, + check_key]); + } + function Make$1(H){ + var equal = H[1]; + function seeded_hash(seed, x){return caml_call1(H[2], x);} + var + include = MakeSeeded$2([0, equal, seeded_hash]), + clear = include[2], + reset = include[3], + copy = include[4], + add = include[5], + remove = include[6], + find = include[7], + find_opt = include[8], + find_all = include[9], + replace = include[10], + mem = include[11], + length = include[12], + stats = include[13], + add_seq = include[14], + replace_seq = include[15], + clean = include[17], + stats_alive = include[18], + _n_ = include[1]; + function create(sz){return caml_call2(_n_, _c_, sz);} + function of_seq(i){ + var tbl = create(16); + caml_call2(replace_seq, tbl, i); + return tbl; + } + return [0, + create, + clear, + reset, + copy, + add, + remove, + find, + find_opt, + find_all, + replace, + mem, + length, + stats, + add_seq, + replace_seq, + of_seq, + clean, + stats_alive]; + } + function make$4(param){return [0, 0];} + function add$1(b, k, d){ + var _m_ = b[1]; + b[1] = [0, make$3(k, d), _m_]; + return 0; + } + function test_keys$0(k, e){ + try{ + if(length$1(e) !== k.length - 1) + throw caml_maybe_attach_backtrace(Stdlib[3], 1); + var _i_ = k.length - 1 - 1 | 0, _h_ = 0; + if(_i_ >= 0){ + var i = _h_; + for(;;){ + var match = get_key$0(e, i), switch$0 = 0; + if(match){ + var x = match[1]; + if(x === caml_check_bound(k, i)[1 + i]){ + var _k_ = i + 1 | 0; + if(_i_ !== i){var i = _k_; continue;} + switch$0 = 1; + } + } + if(! switch$0) throw caml_maybe_attach_backtrace(Stdlib[3], 1); + break; + } + } + var _j_ = 1; + return _j_; + } + catch(_l_){ + var _g_ = caml_wrap_exception(_l_); + if(_g_ === Stdlib[3]) return 0; + throw caml_maybe_attach_backtrace(_g_, 0); + } + } + function remove$1(b, k){ + var l$0 = b[1], l = l$0, acc = 0; + for(;;){ + if(! l) return 0; + var h = l[1], t = l[2]; + if(test_keys$0(k, h)){ + b[1] = caml_call2(Stdlib_List[12], acc, t); + return 0; + } + var t$0 = l[2], acc$0 = [0, h, acc], l = t$0, acc = acc$0; + } + } + function find$1(b, k){ + var _d_ = b[1]; + function _e_(_f_){return test_keys$0(k, _f_);} + var match = caml_call2(Stdlib_List[39], _e_, _d_); + if(! match) return 0; + var e = match[1]; + return get_data$1(e); + } + function length$2(b){return caml_call1(Stdlib_List[1], b[1]);} + function clear$1(b){b[1] = 0; return 0;} + var + Stdlib_Ephemeron = + [0, + [0, + make, + query, + Make, + MakeSeeded$0, + [0, make$0, add, remove, find, length, clear]], + [0, + make$1, + query$0, + Make$0, + MakeSeeded$1, + [0, make$2, add$0, remove$0, find$0, length$0, clear$0]], + [0, + make$3, + query$1, + Make$1, + MakeSeeded$2, + [0, make$4, add$1, remove$1, find$1, length$2, clear$1]]]; + runtime.caml_register_global(13, Stdlib_Ephemeron, "Stdlib__Ephemeron"); + return; + } + (globalThis)); + +//# 24626 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$19 = "", + cst$23 = " ", + cst_2$1 = " 2>", + cst_2_1$1 = " 2>&1", + cst$22 = " <", + cst$21 = " >", + cst$20 = '"', + cst$24 = ".", + cst$25 = "..", + cst$28 = "../", + cst$27 = "./", + cst$26 = "/", + cst_dev_null = "/dev/null", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_trampoline = runtime.caml_trampoline, + caml_trampoline_return = runtime.caml_trampoline_return, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$18 = cst$19, + cst$17 = cst$19, + cst$16 = cst$19, + cst$8 = cst$21, + cst$15 = cst$19, + cst$9 = cst$22, + cst$14 = cst$19, + cst$10 = cst$23, + cst$11 = cst$23, + cst$12 = cst$20, + cst$13 = cst$19, + cst$6 = cst$20, + cst$7 = cst$20, + cst$4 = cst$19, + cst = cst$21, + cst$3 = cst$19, + cst$0 = cst$22, + cst$2 = cst$19, + cst$1 = cst$23, + null$0 = cst_dev_null, + current_dir_name = cst$24, + parent_dir_name = cst$25, + dir_sep = cst$26, + quotequote = "'\\''", + null$1 = "NUL", + current_dir_name$0 = cst$24, + parent_dir_name$0 = cst$25, + dir_sep$0 = "\\", + cst$5 = cst$24, + null$2 = cst_dev_null, + current_dir_name$1 = cst$24, + parent_dir_name$1 = cst$25, + dir_sep$1 = cst$26, + Stdlib = global_data.Stdlib, + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_String = global_data.Stdlib__String, + Stdlib_List = global_data.Stdlib__List, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib_Sys = global_data.Stdlib__Sys, + _i_ = [0, 7, 0], + _h_ = [0, 1, [0, 3, [0, 5, 0]]], + _e_ = [0, [2, 0, [4, 6, [0, 2, 6], 0, [2, 0, 0]]], "%s%06x%s"], + cst_Filename_chop_extension = "Filename.chop_extension", + cst_Filename_chop_suffix = "Filename.chop_suffix", + _c_ = [0, cst$20, 0], + cst_2_1$0 = cst_2_1$1, + cst_2$0 = cst_2$1, + cst_Filename_quote_command_bad = "Filename.quote_command: bad file name ", + cst_2_1 = cst_2_1$1, + cst_2 = cst_2$1, + cst_tmp = "/tmp"; + function generic_basename(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$3 = caml_ml_string_length(name) - 1 | 0, n = n$3; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var p = n + 1 | 0, n$1 = n; + for(;;){ + if(0 > n$1) return caml_call3(Stdlib_String[15], name, 0, p); + if(caml_call2(is_dir_sep, name, n$1)) + return caml_call3 + (Stdlib_String[15], name, n$1 + 1 | 0, (p - n$1 | 0) - 1 | 0); + var n$2 = n$1 - 1 | 0, n$1 = n$2; + } + } + } + function generic_dirname(is_dir_sep, current_dir_name, name){ + if(caml_string_equal(name, cst$19)) return current_dir_name; + var n$5 = caml_ml_string_length(name) - 1 | 0, n = n$5; + for(;;){ + if(0 > n) return caml_call3(Stdlib_String[15], name, 0, 1); + if(caml_call2(is_dir_sep, name, n)){ + var n$0 = n - 1 | 0, n = n$0; + continue; + } + var n$1 = n; + for(;;){ + if(0 > n$1) return current_dir_name; + if(! caml_call2(is_dir_sep, name, n$1)){ + var n$2 = n$1 - 1 | 0, n$1 = n$2; + continue; + } + var n$3 = n$1; + for(;;){ + if(0 > n$3) return caml_call3(Stdlib_String[15], name, 0, 1); + if(! caml_call2(is_dir_sep, name, n$3)) + return caml_call3(Stdlib_String[15], name, 0, n$3 + 1 | 0); + var n$4 = n$3 - 1 | 0, n$3 = n$4; + } + } + } + } + function is_dir_sep(s, i){return 47 === caml_string_get(s, i) ? 1 : 0;} + function is_relative(n){ + var + _aK_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _aL_ = _aK_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + return _aL_; + } + function is_implicit(n){ + var _aF_ = is_relative(n); + if(_aF_){ + var + _aG_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aH_ = + _aG_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_aH_) + var + _aI_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _aJ_ = + _aI_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + else + var _aJ_ = _aH_; + } + else + var _aJ_ = _aF_; + return _aJ_; + } + function check_suffix(name, suff){ + return caml_call2(Stdlib_String[11], suff, name); + } + function chop_suffix_opt(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s); + return caml_string_equal(r, suffix) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _k_ = caml_sys_getenv("TMPDIR"), temp_dir_name = _k_;} + catch(_aE_){ + var _a_ = caml_wrap_exception(_aE_); + if(_a_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_a_, 0); + var temp_dir_name = cst_tmp; + } + function quote(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 39); + var _aB_ = l - 1 | 0, _aA_ = 0; + if(_aB_ >= 0){ + var i = _aA_; + for(;;){ + if(39 === caml_string_get(s, i)) + caml_call2(Stdlib_Buffer[16], b, quotequote); + else{ + var _aD_ = caml_string_get(s, i); + caml_call2(Stdlib_Buffer[12], b, _aD_); + } + var _aC_ = i + 1 | 0; + if(_aB_ !== i){var i = _aC_; continue;} + break; + } + } + caml_call2(Stdlib_Buffer[12], b, 39); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_command(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _ap_ = cst_2_1; + else + var _az_ = quote(f), _ap_ = caml_call2(Stdlib[28], cst_2, _az_); + var _aq_ = _ap_; + } + else + var _aq_ = cst$4; + if(stdout) + var + f$0 = stdout[1], + _ar_ = quote(f$0), + _as_ = caml_call2(Stdlib[28], cst, _ar_); + else + var _as_ = cst$3; + var _at_ = caml_call2(Stdlib[28], _as_, _aq_); + if(stdin) + var + f$1 = stdin[1], + _au_ = quote(f$1), + _av_ = caml_call2(Stdlib[28], cst$0, _au_); + else + var _av_ = cst$2; + var + _aw_ = caml_call2(Stdlib[28], _av_, _at_), + _ax_ = caml_call2(Stdlib_List[19], quote, [0, cmd, args]), + _ay_ = caml_call2(Stdlib_String[6], cst$1, _ax_); + return caml_call2(Stdlib[28], _ay_, _aw_); + } + function basename(_ao_){ + return generic_basename(is_dir_sep, current_dir_name, _ao_); + } + function dirname(_an_){ + return generic_dirname(is_dir_sep, current_dir_name, _an_); + } + var + Unix = + [0, + null$0, + current_dir_name, + parent_dir_name, + dir_sep, + is_dir_sep, + is_relative, + is_implicit, + check_suffix, + chop_suffix_opt, + temp_dir_name, + quote, + quote_command, + basename, + dirname]; + function is_dir_sep$0(s, i){ + var c = caml_string_get(s, i), _ak_ = 47 === c ? 1 : 0; + if(_ak_) + var _al_ = _ak_; + else + var _am_ = 92 === c ? 1 : 0, _al_ = _am_ || (58 === c ? 1 : 0); + return _al_; + } + function is_relative$0(n){ + var + _ae_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _af_ = _ae_ || (47 !== caml_string_get(n, 0) ? 1 : 0); + if(_af_){ + var + _ag_ = caml_ml_string_length(n) < 1 ? 1 : 0, + _ah_ = _ag_ || (92 !== caml_string_get(n, 0) ? 1 : 0); + if(_ah_) + var + _ai_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _aj_ = _ai_ || (58 !== caml_string_get(n, 1) ? 1 : 0); + else + var _aj_ = _ah_; + } + else + var _aj_ = _af_; + return _aj_; + } + function is_implicit$0(n){ + var _X_ = is_relative$0(n); + if(_X_){ + var + _Y_ = caml_ml_string_length(n) < 2 ? 1 : 0, + _Z_ = + _Y_ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), cst$27); + if(_Z_){ + var + ___ = caml_ml_string_length(n) < 2 ? 1 : 0, + _$_ = + ___ + || + caml_string_notequal(caml_call3(Stdlib_String[15], n, 0, 2), ".\\"); + if(_$_){ + var + _aa_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ab_ = + _aa_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), cst$28); + if(_ab_) + var + _ac_ = caml_ml_string_length(n) < 3 ? 1 : 0, + _ad_ = + _ac_ + || + caml_string_notequal + (caml_call3(Stdlib_String[15], n, 0, 3), "..\\"); + else + var _ad_ = _ab_; + } + else + var _ad_ = _$_; + } + else + var _ad_ = _Z_; + } + else + var _ad_ = _X_; + return _ad_; + } + function check_suffix$0(name, suff){ + var + _U_ = caml_ml_string_length(suff) <= caml_ml_string_length(name) ? 1 : 0; + if(_U_) + var + s = + caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0, + caml_ml_string_length(suff)), + _V_ = caml_call1(Stdlib_String[26], suff), + _W_ = caml_string_equal(caml_call1(Stdlib_String[26], s), _V_); + else + var _W_ = _U_; + return _W_; + } + function chop_suffix_opt$0(suffix, filename){ + var + len_s = caml_ml_string_length(suffix), + len_f = caml_ml_string_length(filename); + if(len_s > len_f) return 0; + var + r = caml_call3(Stdlib_String[15], filename, len_f - len_s | 0, len_s), + _T_ = caml_call1(Stdlib_String[26], suffix); + return caml_string_equal(caml_call1(Stdlib_String[26], r), _T_) + ? [0, + caml_call3(Stdlib_String[15], filename, 0, len_f - len_s | 0)] + : 0; + } + try{var _j_ = caml_sys_getenv("TEMP"), temp_dir_name$0 = _j_;} + catch(_S_){ + var _b_ = caml_wrap_exception(_S_); + if(_b_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_b_, 0); + var temp_dir_name$0 = cst$5; + } + function quote$0(s){ + var + l = caml_ml_string_length(s), + b = caml_call1(Stdlib_Buffer[1], l + 20 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + function add_bs(n){ + var _Q_ = 1; + if(n >= 1){ + var j = _Q_; + for(;;){ + caml_call2(Stdlib_Buffer[12], b, 92); + var _R_ = j + 1 | 0; + if(n !== j){var j = _R_; continue;} + break; + } + } + return 0; + } + function loop$0(counter, i){ + var i$0 = i; + for(;;){ + if(i$0 === l) return caml_call2(Stdlib_Buffer[12], b, 34); + var c = caml_string_get(s, i$0); + if(34 === c){ + var _O_ = 0; + if(counter >= 50) + return caml_trampoline_return(loop_bs, [0, _O_, i$0]); + var counter$1 = counter + 1 | 0; + return loop_bs(counter$1, _O_, i$0); + } + if(92 !== c){ + caml_call2(Stdlib_Buffer[12], b, c); + var i$1 = i$0 + 1 | 0, i$0 = i$1; + continue; + } + var _P_ = 0; + if(counter >= 50) return caml_trampoline_return(loop_bs, [0, _P_, i$0]); + var counter$0 = counter + 1 | 0; + return loop_bs(counter$0, _P_, i$0); + } + } + function loop_bs(counter, n, i){ + var n$0 = n, i$0 = i; + for(;;){ + if(i$0 === l){caml_call2(Stdlib_Buffer[12], b, 34); return add_bs(n$0);} + var match = caml_string_get(s, i$0); + if(34 === match){ + add_bs((2 * n$0 | 0) + 1 | 0); + caml_call2(Stdlib_Buffer[12], b, 34); + var _N_ = i$0 + 1 | 0; + if(counter >= 50) return caml_trampoline_return(loop$0, [0, _N_]); + var counter$1 = counter + 1 | 0; + return loop$0(counter$1, _N_); + } + if(92 === match){ + var i$1 = i$0 + 1 | 0, n$1 = n$0 + 1 | 0, n$0 = n$1, i$0 = i$1; + continue; + } + add_bs(n$0); + if(counter >= 50) return caml_trampoline_return(loop$0, [0, i$0]); + var counter$0 = counter + 1 | 0; + return loop$0(counter$0, i$0); + } + } + function loop(i){return caml_trampoline(loop$0(0, i));} + loop(0); + return caml_call1(Stdlib_Buffer[2], b); + } + function quote_cmd_filename(f){ + if + (! + caml_call2(Stdlib_String[14], f, 34) + && ! caml_call2(Stdlib_String[14], f, 37)){ + if(! caml_call2(Stdlib_String[14], f, 32)) return f; + var _M_ = caml_call2(Stdlib[28], f, cst$6); + return caml_call2(Stdlib[28], cst$7, _M_); + } + var _L_ = caml_call2(Stdlib[28], cst_Filename_quote_command_bad, f); + return caml_call1(Stdlib[2], _L_); + } + function quote_command$0(cmd, stdin, stdout, stderr, args){ + if(stderr){ + var f = stderr[1]; + if(caml_equal(stderr, stdout)) + var _x_ = cst_2_1$0; + else + var + _J_ = quote_cmd_filename(f), + _x_ = caml_call2(Stdlib[28], cst_2$0, _J_); + var _y_ = _x_; + } + else + var _y_ = cst$16; + var _z_ = [0, _y_, _c_]; + if(stdout) + var + f$0 = stdout[1], + _A_ = quote_cmd_filename(f$0), + _B_ = caml_call2(Stdlib[28], cst$8, _A_); + else + var _B_ = cst$15; + var _C_ = [0, _B_, _z_]; + if(stdin) + var + f$1 = stdin[1], + _D_ = quote_cmd_filename(f$1), + _E_ = caml_call2(Stdlib[28], cst$9, _D_); + else + var _E_ = cst$14; + var + _G_ = caml_call2(Stdlib_List[19], quote$0, args), + s = caml_call2(Stdlib_String[6], cst$10, _G_), + b = caml_call1(Stdlib_Buffer[1], caml_ml_string_length(s) + 20 | 0), + _F_ = [0, _E_, _C_]; + function _w_(c){ + var switch$0 = 0; + if(62 <= c){ + var _K_ = c - 63 | 0; + if(60 < _K_ >>> 0){ + if(62 > _K_) switch$0 = 1; + } + else if(31 === _K_) switch$0 = 1; + } + else + if(42 <= c){ + if(60 === c) switch$0 = 1; + } + else if(33 <= c) + switch(c - 33 | 0){case 2:case 3:case 6: break;default: switch$0 = 1;} + return switch$0 + ? (caml_call2 + (Stdlib_Buffer[12], b, 94), + caml_call2(Stdlib_Buffer[12], b, c)) + : caml_call2(Stdlib_Buffer[12], b, c); + } + caml_call2(Stdlib_String[29], _w_, s); + var + _H_ = [0, cst$11, [0, caml_call1(Stdlib_Buffer[2], b), _F_]], + _I_ = [0, cst$12, [0, quote_cmd_filename(cmd), _H_]]; + return caml_call2(Stdlib_String[6], cst$13, _I_); + } + function drive_and_path(s){ + var _s_ = 2 <= caml_ml_string_length(s) ? 1 : 0; + if(_s_){ + var param = caml_string_get(s, 0), switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + var + _t_ = switch$0 ? 1 : 0, + _u_ = _t_ ? 58 === caml_string_get(s, 1) ? 1 : 0 : _t_; + } + else + var _u_ = _s_; + if(! _u_) return [0, cst$17, s]; + var + _v_ = + caml_call3(Stdlib_String[15], s, 2, caml_ml_string_length(s) - 2 | 0); + return [0, caml_call3(Stdlib_String[15], s, 0, 2), _v_]; + } + function dirname$0(s){ + var + match = drive_and_path(s), + path = match[2], + drive = match[1], + dir = generic_dirname(is_dir_sep$0, current_dir_name$0, path); + return caml_call2(Stdlib[28], drive, dir); + } + function basename$0(s){ + var path = drive_and_path(s)[2]; + return generic_basename(is_dir_sep$0, current_dir_name$0, path); + } + var + Win32 = + [0, + null$1, + current_dir_name$0, + parent_dir_name$0, + dir_sep$0, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name$0, + quote$0, + quote_command$0, + basename$0, + dirname$0]; + function basename$1(_r_){ + return generic_basename(is_dir_sep$0, current_dir_name$1, _r_); + } + function dirname$1(_q_){ + return generic_dirname(is_dir_sep$0, current_dir_name$1, _q_); + } + var + Cygwin = + [0, + null$2, + current_dir_name$1, + parent_dir_name$1, + dir_sep$1, + is_dir_sep$0, + is_relative$0, + is_implicit$0, + check_suffix$0, + chop_suffix_opt$0, + temp_dir_name, + quote, + quote_command, + basename$1, + dirname$1], + _d_ = Stdlib_Sys[4], + Sysdeps = + caml_string_notequal(_d_, "Cygwin") + ? caml_string_notequal(_d_, "Win32") ? Unix : Win32 + : Cygwin, + null$3 = Sysdeps[1], + current_dir_name$2 = Sysdeps[2], + parent_dir_name$2 = Sysdeps[3], + dir_sep$2 = Sysdeps[4], + is_dir_sep$1 = Sysdeps[5], + is_relative$1 = Sysdeps[6], + is_implicit$1 = Sysdeps[7], + check_suffix$1 = Sysdeps[8], + chop_suffix_opt$1 = Sysdeps[9], + temp_dir_name$1 = Sysdeps[10], + quote$1 = Sysdeps[11], + quote_command$1 = Sysdeps[12], + basename$2 = Sysdeps[13], + dirname$2 = Sysdeps[14]; + function concat(dirname, filename){ + var l = caml_ml_string_length(dirname); + if(0 !== l && ! is_dir_sep$1(dirname, l - 1 | 0)){ + var _p_ = caml_call2(Stdlib[28], dir_sep$2, filename); + return caml_call2(Stdlib[28], dirname, _p_); + } + return caml_call2(Stdlib[28], dirname, filename); + } + function chop_suffix(name, suff){ + return check_suffix$1(name, suff) + ? caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - caml_ml_string_length(suff) | 0) + : caml_call1(Stdlib[1], cst_Filename_chop_suffix); + } + function extension_len(name){ + var i$3 = caml_ml_string_length(name) - 1 | 0, i0 = i$3; + for(;;){ + if(0 <= i0 && ! is_dir_sep$1(name, i0)){ + if(46 !== caml_string_get(name, i0)){ + var i$2 = i0 - 1 | 0, i0 = i$2; + continue; + } + var i$1 = i0 - 1 | 0, i = i$1; + for(;;){ + if(0 <= i && ! is_dir_sep$1(name, i)){ + if(46 !== caml_string_get(name, i)) + return caml_ml_string_length(name) - i0 | 0; + var i$0 = i - 1 | 0, i = i$0; + continue; + } + return 0; + } + } + return 0; + } + } + function extension(name){ + var l = extension_len(name); + return 0 === l + ? cst$18 + : caml_call3 + (Stdlib_String[15], + name, + caml_ml_string_length(name) - l | 0, + l); + } + function chop_extension(name){ + var l = extension_len(name); + return 0 === l + ? caml_call1(Stdlib[1], cst_Filename_chop_extension) + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + function remove_extension(name){ + var l = extension_len(name); + return 0 === l + ? name + : caml_call3 + (Stdlib_String[15], + name, + 0, + caml_ml_string_length(name) - l | 0); + } + var prng_key = caml_call2(Stdlib_Domain[10][1], 0, Stdlib_Random[15][2]); + function temp_file_name(temp_dir, prefix, suffix){ + var + random_state = caml_call1(Stdlib_Domain[10][2], prng_key), + rnd = caml_call1(Stdlib_Random[15][4], random_state) & 16777215; + return concat + (temp_dir, caml_call4(Stdlib_Printf[4], _e_, prefix, rnd, suffix)); + } + function _f_(param){return temp_dir_name$1;} + var + _g_ = [0, function(_o_){return _o_;}], + current_temp_dir_name = caml_call2(Stdlib_Domain[10][1], _g_, _f_); + function set_temp_dir_name(s){ + return caml_call2(Stdlib_Domain[10][3], current_temp_dir_name, s); + } + function get_temp_dir_name(param){ + return caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + } + function temp_file(opt, prefix, suffix){ + if(opt) + var sth = opt[1], temp_dir = sth; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + runtime.caml_sys_close(runtime.caml_sys_open(name, _h_, 384)); + return name; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + function open_temp_file(opt, _m_, _l_, prefix, suffix){ + if(opt) var sth = opt[1], mode = sth; else var mode = _i_; + if(_m_) var sth$0 = _m_[1], perms = sth$0; else var perms = 384; + if(_l_) + var sth$1 = _l_[1], temp_dir = sth$1; + else + var temp_dir = caml_call1(Stdlib_Domain[10][2], current_temp_dir_name); + var counter = 0; + for(;;){ + var name = temp_file_name(temp_dir, prefix, suffix); + try{ + var + _n_ = + [0, + name, + caml_call3(Stdlib[62], [0, 1, [0, 3, [0, 5, mode]]], perms, name)]; + return _n_; + } + catch(e$0){ + var e = caml_wrap_exception(e$0); + if(e[1] !== Stdlib[11]) throw caml_maybe_attach_backtrace(e, 0); + if(1000 <= counter) throw caml_maybe_attach_backtrace(e, 0); + var counter$0 = counter + 1 | 0, counter = counter$0; + continue; + } + } + } + var + Stdlib_Filename = + [0, + current_dir_name$2, + parent_dir_name$2, + dir_sep$2, + concat, + is_relative$1, + is_implicit$1, + check_suffix$1, + chop_suffix, + chop_suffix_opt$1, + extension, + remove_extension, + chop_extension, + basename$2, + dirname$2, + null$3, + temp_file, + open_temp_file, + get_temp_dir_name, + set_temp_dir_name, + quote$1, + quote_command$1]; + runtime.caml_register_global(65, Stdlib_Filename, "Stdlib__Filename"); + return; + } + (globalThis)); + +//# 25489 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + init = Stdlib_Array[1], + make_matrix = Stdlib_Array[2], + append = Stdlib_Array[3], + concat = Stdlib_Array[4], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + fill = Stdlib_Array[7], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + iter = Stdlib_Array[11], + iteri = Stdlib_Array[12], + map = Stdlib_Array[13], + mapi = Stdlib_Array[14], + fold_left = Stdlib_Array[15], + fold_left_map = Stdlib_Array[16], + fold_right = Stdlib_Array[17], + iter2 = Stdlib_Array[18], + map2 = Stdlib_Array[19], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + for_all2 = Stdlib_Array[22], + exists2 = Stdlib_Array[23], + mem = Stdlib_Array[24], + memq = Stdlib_Array[25], + find_opt = Stdlib_Array[26], + find_map = Stdlib_Array[27], + split = Stdlib_Array[28], + combine = Stdlib_Array[29], + sort = Stdlib_Array[30], + stable_sort = Stdlib_Array[31], + fast_sort = Stdlib_Array[32], + to_seq = Stdlib_Array[33], + to_seqi = Stdlib_Array[34], + of_seq = Stdlib_Array[35], + Floatarray = Stdlib_Array[36], + Stdlib_ArrayLabels = + [0, + init, + make_matrix, + append, + concat, + sub, + copy, + fill, + blit, + to_list, + of_list, + iter, + iteri, + map, + mapi, + fold_left, + fold_left_map, + fold_right, + iter2, + map2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find_opt, + find_map, + split, + combine, + sort, + stable_sort, + fast_sort, + to_seq, + to_seqi, + of_seq, + Floatarray]; + runtime.caml_register_global(1, Stdlib_ArrayLabels, "Stdlib__ArrayLabels"); + return; + } + (globalThis)); + +//# 25577 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + length = Stdlib_List[1], + compare_lengths = Stdlib_List[2], + compare_length_with = Stdlib_List[3], + cons = Stdlib_List[4], + hd = Stdlib_List[5], + tl = Stdlib_List[6], + nth = Stdlib_List[7], + nth_opt = Stdlib_List[8], + rev = Stdlib_List[9], + init = Stdlib_List[10], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + flatten = Stdlib_List[14], + equal = Stdlib_List[15], + compare = Stdlib_List[16], + iter = Stdlib_List[17], + iteri = Stdlib_List[18], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + filter_map = Stdlib_List[22], + concat_map = Stdlib_List[23], + fold_left_map = Stdlib_List[24], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + iter2 = Stdlib_List[27], + map2 = Stdlib_List[28], + rev_map2 = Stdlib_List[29], + fold_left2 = Stdlib_List[30], + fold_right2 = Stdlib_List[31], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + for_all2 = Stdlib_List[34], + exists2 = Stdlib_List[35], + mem = Stdlib_List[36], + memq = Stdlib_List[37], + find = Stdlib_List[38], + find_opt = Stdlib_List[39], + find_map = Stdlib_List[40], + filter = Stdlib_List[41], + find_all = Stdlib_List[42], + filteri = Stdlib_List[43], + partition = Stdlib_List[44], + partition_map = Stdlib_List[45], + assoc = Stdlib_List[46], + assoc_opt = Stdlib_List[47], + assq = Stdlib_List[48], + assq_opt = Stdlib_List[49], + mem_assoc = Stdlib_List[50], + mem_assq = Stdlib_List[51], + remove_assoc = Stdlib_List[52], + remove_assq = Stdlib_List[53], + split = Stdlib_List[54], + combine = Stdlib_List[55], + sort = Stdlib_List[56], + stable_sort = Stdlib_List[57], + fast_sort = Stdlib_List[58], + sort_uniq = Stdlib_List[59], + merge = Stdlib_List[60], + to_seq = Stdlib_List[61], + of_seq = Stdlib_List[62], + Stdlib_ListLabels = + [0, + length, + compare_lengths, + compare_length_with, + cons, + hd, + tl, + nth, + nth_opt, + rev, + init, + append, + rev_append, + concat, + flatten, + equal, + compare, + iter, + iteri, + map, + mapi, + rev_map, + filter_map, + concat_map, + fold_left_map, + fold_left, + fold_right, + iter2, + map2, + rev_map2, + fold_left2, + fold_right2, + for_all, + exists, + for_all2, + exists2, + mem, + memq, + find, + find_opt, + find_map, + filter, + find_all, + filteri, + partition, + partition_map, + assoc, + assoc_opt, + assq, + assq_opt, + mem_assoc, + mem_assq, + remove_assoc, + remove_assq, + split, + combine, + sort, + stable_sort, + fast_sort, + sort_uniq, + merge, + to_seq, + of_seq]; + runtime.caml_register_global(1, Stdlib_ListLabels, "Stdlib__ListLabels"); + return; + } + (globalThis)); + +//# 25717 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Bytes = global_data.Stdlib__Bytes, + make = Stdlib_Bytes[1], + init = Stdlib_Bytes[2], + empty = Stdlib_Bytes[3], + copy = Stdlib_Bytes[4], + of_string = Stdlib_Bytes[5], + to_string = Stdlib_Bytes[6], + sub = Stdlib_Bytes[7], + sub_string = Stdlib_Bytes[8], + extend = Stdlib_Bytes[9], + fill = Stdlib_Bytes[10], + blit = Stdlib_Bytes[11], + blit_string = Stdlib_Bytes[12], + concat = Stdlib_Bytes[13], + cat = Stdlib_Bytes[14], + iter = Stdlib_Bytes[15], + iteri = Stdlib_Bytes[16], + map = Stdlib_Bytes[17], + mapi = Stdlib_Bytes[18], + fold_left = Stdlib_Bytes[19], + fold_right = Stdlib_Bytes[20], + for_all = Stdlib_Bytes[21], + exists = Stdlib_Bytes[22], + trim = Stdlib_Bytes[23], + escaped = Stdlib_Bytes[24], + index = Stdlib_Bytes[25], + index_opt = Stdlib_Bytes[26], + rindex = Stdlib_Bytes[27], + rindex_opt = Stdlib_Bytes[28], + index_from = Stdlib_Bytes[29], + index_from_opt = Stdlib_Bytes[30], + rindex_from = Stdlib_Bytes[31], + rindex_from_opt = Stdlib_Bytes[32], + contains = Stdlib_Bytes[33], + contains_from = Stdlib_Bytes[34], + rcontains_from = Stdlib_Bytes[35], + uppercase_ascii = Stdlib_Bytes[36], + lowercase_ascii = Stdlib_Bytes[37], + capitalize_ascii = Stdlib_Bytes[38], + uncapitalize_ascii = Stdlib_Bytes[39], + compare = Stdlib_Bytes[40], + equal = Stdlib_Bytes[41], + starts_with = Stdlib_Bytes[42], + ends_with = Stdlib_Bytes[43], + unsafe_to_string = Stdlib_Bytes[44], + unsafe_of_string = Stdlib_Bytes[45], + split_on_char = Stdlib_Bytes[46], + to_seq = Stdlib_Bytes[47], + to_seqi = Stdlib_Bytes[48], + of_seq = Stdlib_Bytes[49], + get_utf_8_uchar = Stdlib_Bytes[50], + set_utf_8_uchar = Stdlib_Bytes[51], + is_valid_utf_8 = Stdlib_Bytes[52], + get_utf_16be_uchar = Stdlib_Bytes[53], + set_utf_16be_uchar = Stdlib_Bytes[54], + is_valid_utf_16be = Stdlib_Bytes[55], + get_utf_16le_uchar = Stdlib_Bytes[56], + set_utf_16le_uchar = Stdlib_Bytes[57], + is_valid_utf_16le = Stdlib_Bytes[58], + get_uint8 = Stdlib_Bytes[59], + get_int8 = Stdlib_Bytes[60], + get_uint16_ne = Stdlib_Bytes[61], + get_uint16_be = Stdlib_Bytes[62], + get_uint16_le = Stdlib_Bytes[63], + get_int16_ne = Stdlib_Bytes[64], + get_int16_be = Stdlib_Bytes[65], + get_int16_le = Stdlib_Bytes[66], + get_int32_ne = Stdlib_Bytes[67], + get_int32_be = Stdlib_Bytes[68], + get_int32_le = Stdlib_Bytes[69], + get_int64_ne = Stdlib_Bytes[70], + get_int64_be = Stdlib_Bytes[71], + get_int64_le = Stdlib_Bytes[72], + set_uint8 = Stdlib_Bytes[73], + set_int8 = Stdlib_Bytes[74], + set_uint16_ne = Stdlib_Bytes[75], + set_uint16_be = Stdlib_Bytes[76], + set_uint16_le = Stdlib_Bytes[77], + set_int16_ne = Stdlib_Bytes[78], + set_int16_be = Stdlib_Bytes[79], + set_int16_le = Stdlib_Bytes[80], + set_int32_ne = Stdlib_Bytes[81], + set_int32_be = Stdlib_Bytes[82], + set_int32_le = Stdlib_Bytes[83], + set_int64_ne = Stdlib_Bytes[84], + set_int64_be = Stdlib_Bytes[85], + set_int64_le = Stdlib_Bytes[86], + unsafe_escape = Stdlib_Bytes[87], + Stdlib_BytesLabels = + [0, + make, + init, + empty, + copy, + of_string, + to_string, + sub, + sub_string, + extend, + fill, + blit, + blit_string, + concat, + cat, + iter, + iteri, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + index, + index_opt, + rindex, + rindex_opt, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + contains, + contains_from, + rcontains_from, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + compare, + equal, + starts_with, + ends_with, + unsafe_to_string, + unsafe_of_string, + split_on_char, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + set_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + set_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + set_utf_16le_uchar, + is_valid_utf_16le, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + set_uint8, + set_int8, + set_uint16_ne, + set_uint16_be, + set_uint16_le, + set_int16_ne, + set_int16_be, + set_int16_le, + set_int32_ne, + set_int32_be, + set_int32_le, + set_int64_ne, + set_int64_be, + set_int64_le, + unsafe_escape]; + runtime.caml_register_global(1, Stdlib_BytesLabels, "Stdlib__BytesLabels"); + return; + } + (globalThis)); + +//# 25907 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + equal = Stdlib_String[8], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + Stdlib_StringLabels = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + equal, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le]; + runtime.caml_register_global + (1, Stdlib_StringLabels, "Stdlib__StringLabels"); + return; + } + (globalThis)); + +//# 26052 "../../../.js/default/stdlib/stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_Set = global_data.Stdlib__Set, + Stdlib_Map = global_data.Stdlib__Map, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_MoreLabels = [0, Stdlib_Hashtbl, Stdlib_Map, Stdlib_Set]; + runtime.caml_register_global(3, Stdlib_MoreLabels, "Stdlib__MoreLabels"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 18 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + s = "5.1.1", + git_version = "", + Jsoo_runtime_Runtime_version = [0, s, git_version]; + runtime.caml_register_global + (2, Jsoo_runtime_Runtime_version, "Jsoo_runtime__Runtime_version"); + return; + } + (globalThis)); + +//# 33 "../../../.js/default/js_of_ocaml-compiler.runtime/jsoo_runtime.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Jsoo_runtime_Runtime_version = global_data.Jsoo_runtime__Runtime_version, + Stdlib_Callback = global_data.Stdlib__Callback, + Js = [0], + Config = [0], + version = Jsoo_runtime_Runtime_version[1], + git_version = Jsoo_runtime_Runtime_version[2], + Sys = [0, Config, version, git_version], + Exn = [248, "Jsoo_runtime.Error.Exn", runtime.caml_fresh_oo_id(0)]; + caml_call2(Stdlib_Callback[2], "jsError", [0, Exn, [0]]); + function raise(exn){throw exn;} + var + Error = + [0, + raise, + runtime.caml_exn_with_js_backtrace, + runtime.caml_js_error_option_of_exception, + Exn], + For_compatibility_only = [0], + Bigstring = [0], + Typed_array = [0, Bigstring], + Int64 = [0], + Jsoo_runtime = + [0, Js, Sys, Error, For_compatibility_only, Typed_array, Int64]; + runtime.caml_register_global(5, Jsoo_runtime, "Jsoo_runtime"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 19 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib_String = global_data.Stdlib__String, + Stdlib_Char = global_data.Stdlib__Char, + Poly = [0]; + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, max, min], + make = Stdlib_String[1], + init = Stdlib_String[2], + empty = Stdlib_String[3], + of_bytes = Stdlib_String[4], + to_bytes = Stdlib_String[5], + concat = Stdlib_String[6], + cat = Stdlib_String[7], + compare = Stdlib_String[9], + starts_with = Stdlib_String[10], + ends_with = Stdlib_String[11], + contains_from = Stdlib_String[12], + rcontains_from = Stdlib_String[13], + contains = Stdlib_String[14], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + map = Stdlib_String[17], + mapi = Stdlib_String[18], + fold_left = Stdlib_String[19], + fold_right = Stdlib_String[20], + for_all = Stdlib_String[21], + exists = Stdlib_String[22], + trim = Stdlib_String[23], + escaped = Stdlib_String[24], + uppercase_ascii = Stdlib_String[25], + lowercase_ascii = Stdlib_String[26], + capitalize_ascii = Stdlib_String[27], + uncapitalize_ascii = Stdlib_String[28], + iter = Stdlib_String[29], + iteri = Stdlib_String[30], + index_from = Stdlib_String[31], + index_from_opt = Stdlib_String[32], + rindex_from = Stdlib_String[33], + rindex_from_opt = Stdlib_String[34], + index = Stdlib_String[35], + index_opt = Stdlib_String[36], + rindex = Stdlib_String[37], + rindex_opt = Stdlib_String[38], + to_seq = Stdlib_String[39], + to_seqi = Stdlib_String[40], + of_seq = Stdlib_String[41], + get_utf_8_uchar = Stdlib_String[42], + is_valid_utf_8 = Stdlib_String[43], + get_utf_16be_uchar = Stdlib_String[44], + is_valid_utf_16be = Stdlib_String[45], + get_utf_16le_uchar = Stdlib_String[46], + is_valid_utf_16le = Stdlib_String[47], + blit = Stdlib_String[48], + get_uint8 = Stdlib_String[49], + get_int8 = Stdlib_String[50], + get_uint16_ne = Stdlib_String[51], + get_uint16_be = Stdlib_String[52], + get_uint16_le = Stdlib_String[53], + get_int16_ne = Stdlib_String[54], + get_int16_be = Stdlib_String[55], + get_int16_le = Stdlib_String[56], + get_int32_ne = Stdlib_String[57], + hash = Stdlib_String[58], + seeded_hash = Stdlib_String[59], + get_int32_be = Stdlib_String[60], + get_int32_le = Stdlib_String[61], + get_int64_ne = Stdlib_String[62], + get_int64_be = Stdlib_String[63], + get_int64_le = Stdlib_String[64], + equal = runtime.caml_string_equal, + String = + [0, + make, + init, + empty, + of_bytes, + to_bytes, + concat, + cat, + compare, + starts_with, + ends_with, + contains_from, + rcontains_from, + contains, + sub, + split_on_char, + map, + mapi, + fold_left, + fold_right, + for_all, + exists, + trim, + escaped, + uppercase_ascii, + lowercase_ascii, + capitalize_ascii, + uncapitalize_ascii, + iter, + iteri, + index_from, + index_from_opt, + rindex_from, + rindex_from_opt, + index, + index_opt, + rindex, + rindex_opt, + to_seq, + to_seqi, + of_seq, + get_utf_8_uchar, + is_valid_utf_8, + get_utf_16be_uchar, + is_valid_utf_16be, + get_utf_16le_uchar, + is_valid_utf_16le, + blit, + get_uint8, + get_int8, + get_uint16_ne, + get_uint16_be, + get_uint16_le, + get_int16_ne, + get_int16_be, + get_int16_le, + get_int32_ne, + hash, + seeded_hash, + get_int32_be, + get_int32_le, + get_int64_ne, + get_int64_be, + get_int64_le, + equal], + chr = Stdlib_Char[1], + escaped$0 = Stdlib_Char[2], + lowercase_ascii$0 = Stdlib_Char[3], + uppercase_ascii$0 = Stdlib_Char[4], + compare$0 = Stdlib_Char[5]; + function equal$0(x, y){return x === y ? 1 : 0;} + var + Char = + [0, + chr, + escaped$0, + lowercase_ascii$0, + uppercase_ascii$0, + compare$0, + equal$0], + max$0 = Int_replace_polymorphic_compar[1], + min$0 = Int_replace_polymorphic_compar[2], + Js_of_ocaml_Import = + [0, Poly, Int_replace_polymorphic_compar, String, Char, max$0, min$0]; + runtime.caml_register_global(2, Js_of_ocaml_Import, "Js_of_ocaml__Import"); + return; + } + (globalThis)); + +//# 188 "../../../.js/default/js_of_ocaml/js_of_ocaml.cma.js" +(function + (globalThis){ + "use strict"; + var + jsoo_exports = typeof module === "object" && module.exports || globalThis, + runtime = globalThis.jsoo_runtime, + cst_parseFloat$0 = "parseFloat", + cst_parseInt$0 = "parseInt", + caml_js_get = runtime.caml_js_get, + caml_js_set = runtime.caml_js_set, + caml_js_wrap_callback = runtime.caml_js_wrap_callback, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Import = global_data.Js_of_ocaml__Import, + Stdlib = global_data.Stdlib, + Jsoo_runtime = global_data.Jsoo_runtime, + Stdlib_Printexc = global_data.Stdlib__Printexc, + global = globalThis, + Unsafe = [0, global], + null$0 = null, + undefined$0 = undefined, + cst_function = "function", + cst_parseFloat = cst_parseFloat$0, + cst_parseInt = cst_parseInt$0; + function return$0(_z_){return _z_;} + function map(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function bind(x, f){return x == null$0 ? null$0 : caml_call1(f, x);} + function test(x){return 1 - (x == null$0 ? 1 : 0);} + function iter(x, f){ + var _y_ = 1 - (x == null$0 ? 1 : 0); + return _y_ ? caml_call1(f, x) : _y_; + } + function case$0(x, f, g){ + return x == null$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get(x, f){return x == null$0 ? caml_call1(f, 0) : x;} + function option(x){if(! x) return null$0; var x$0 = x[1]; return x$0;} + function to_option(x){ + function _x_(x){return [0, x];} + return case$0(x, function(param){return 0;}, _x_); + } + var + Opt = + [0, + null$0, + return$0, + map, + bind, + test, + iter, + case$0, + get, + option, + to_option]; + function return$1(_w_){return _w_;} + function map$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function bind$0(x, f){ + return x === undefined$0 ? undefined$0 : caml_call1(f, x); + } + function test$0(x){return x !== undefined$0 ? 1 : 0;} + function iter$0(x, f){ + var _v_ = x !== undefined$0 ? 1 : 0; + return _v_ ? caml_call1(f, x) : _v_; + } + function case$1(x, f, g){ + return x === undefined$0 ? caml_call1(f, 0) : caml_call1(g, x); + } + function get$0(x, f){return x === undefined$0 ? caml_call1(f, 0) : x;} + function option$0(x){ + if(! x) return undefined$0; + var x$0 = x[1]; + return x$0; + } + function to_option$0(x){ + function _u_(x){return [0, x];} + return case$1(x, function(param){return 0;}, _u_); + } + var + Optdef = + [0, + undefined$0, + return$1, + map$0, + bind$0, + test$0, + iter$0, + case$1, + get$0, + option$0, + to_option$0]; + function coerce(x, f, g){ + function _s_(param){return caml_call1(g, x);} + var _t_ = caml_call1(f, x); + return caml_call2(Opt[8], _t_, _s_); + } + function coerce_opt(x, f, g){ + function _q_(param){return caml_call1(g, x);} + var _r_ = caml_call2(Opt[4], x, f); + return caml_call2(Opt[8], _r_, _q_); + } + var + true$0 = true, + false$0 = false, + nfc = "NFC", + nfd = "NFD", + nfkc = "NFKC", + nfkd = "NFKD", + t0 = Unsafe[1], + string_constr = t0.String, + t1 = Unsafe[1], + regExp = t1.RegExp, + t2 = Unsafe[1], + object_constructor = t2.Object; + function object_keys(o){return object_constructor.keys(o);} + var + t5 = Unsafe[1], + array_constructor = t5.Array, + array_get = caml_js_get, + array_set = caml_js_set; + function array_map(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call1(f, x);})); + } + function array_mapi(f, a){ + return a.map + (caml_js_wrap_callback + (function(x, idx, param){return caml_call2(f, idx, x);})); + } + function str_array(_p_){return _p_;} + function match_result(_o_){return _o_;} + var + t8 = Unsafe[1], + date_constr = t8.Date, + t9 = Unsafe[1], + math = t9.Math, + t10 = Unsafe[1], + error_constr = t10.Error, + include = Jsoo_runtime[3], + raise = include[1], + exn_with_js_backtrace = include[2], + of_exn = include[3], + Error = include[4]; + function name(t11){return caml_string_of_jsstring(t11.name);} + function message(t12){return caml_string_of_jsstring(t12.message);} + function stack(t13){ + var _n_ = caml_call2(Opt[3], t13.stack, caml_string_of_jsstring); + return caml_call1(Opt[10], _n_); + } + function to_string(e){return caml_string_of_jsstring(e.toString());} + function raise_js_error(e){return caml_call1(raise, e);} + function string_of_error(e){return to_string(e);} + var t15 = Unsafe[1], JSON = t15.JSON; + function decodeURI(s){var t16 = Unsafe[1]; return t16.decodeURI(s);} + function decodeURIComponent(s){ + var t17 = Unsafe[1]; + return t17.decodeURIComponent(s); + } + function encodeURI(s){var t18 = Unsafe[1]; return t18.encodeURI(s);} + function encodeURIComponent(s){ + var t19 = Unsafe[1]; + return t19.encodeURIComponent(s); + } + function escape(s){var t20 = Unsafe[1]; return t20.escape(s);} + function unescape(s){var t21 = Unsafe[1]; return t21.unescape(s);} + function isNaN(i){var t22 = Unsafe[1]; return t22.isNaN(i) | 0;} + function parseInt(s){ + var t23 = Unsafe[1], s$0 = t23.parseInt(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseInt) : s$0; + } + function parseFloat(s){ + var t24 = Unsafe[1], s$0 = t24.parseFloat(s); + return isNaN(s$0) ? caml_call1(Stdlib[2], cst_parseFloat) : s$0; + } + function _a_(param){ + if(param[1] !== Error) return 0; + var e = param[2]; + return [0, to_string(e)]; + } + caml_call1(Stdlib_Printexc[9], _a_); + function _b_(e){ + return e instanceof array_constructor + ? 0 + : [0, caml_string_of_jsstring(e.toString())]; + } + caml_call1(Stdlib_Printexc[9], _b_); + function export_js(field, x){ + var _l_ = caml_string_of_jsstring(typeof x), switch$0 = 0; + if + (caml_call2(Js_of_ocaml_Import[3][64], _l_, cst_function) && 0 < x.length){var _m_ = caml_js_wrap_callback(x); switch$0 = 1;} + if(! switch$0) var _m_ = x; + return jsoo_exports[field] = _m_; + } + function export$0(field, x){ + return export_js(runtime.caml_jsstring_of_string(field), x); + } + function export_all(obj){ + var keys = object_keys(obj); + return keys.forEach + (caml_js_wrap_callback + (function(key, param, _k_){return export_js(key, obj[key]);})); + } + var _c_ = runtime.caml_js_error_of_exception; + function _d_(_j_){return _j_;} + var + _e_ = + [0, + to_string, + name, + message, + stack, + raise, + exn_with_js_backtrace, + of_exn, + Error, + function(_i_){return _i_;}, + _d_]; + function _f_(_h_){return _h_;} + var + Js_of_ocaml_Js = + [0, + null$0, + function(_g_){return _g_;}, + undefined$0, + _f_, + Opt, + Optdef, + true$0, + false$0, + nfd, + nfc, + nfkd, + nfkc, + string_constr, + regExp, + regExp, + regExp, + object_keys, + array_constructor, + array_constructor, + array_get, + array_set, + array_map, + array_mapi, + str_array, + match_result, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + date_constr, + math, + error_constr, + _e_, + JSON, + decodeURI, + decodeURIComponent, + encodeURI, + encodeURIComponent, + escape, + unescape, + isNaN, + parseInt, + parseFloat, + coerce, + coerce_opt, + export$0, + export_all, + Unsafe, + string_of_error, + raise_js_error, + exn_with_js_backtrace, + _c_, + Error]; + runtime.caml_register_global(43, Js_of_ocaml_Js, "Js_of_ocaml__Js"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/ppx_inline_test.config/inline_test_config.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function pre_test_hook(_a_){return 0;} + var Inline_test_config = [0, pre_test_hook]; + runtime.caml_register_global(0, Inline_test_config, "Inline_test_config"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 5 "../../../.js/default/base.base_internalhash_types/base_internalhash_types.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_internalhash_types = [0]; + runtime.caml_register_global + (0, Base_internalhash_types, "Base_internalhash_types"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.caml/caml.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.caml/caml.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + invalid_arg = Stdlib[1], + failwith = Stdlib[2], + Exit = Stdlib[3], + Match_failure = Stdlib[4], + Assert_failure = Stdlib[5], + Invalid_argument = Stdlib[6], + Failure = Stdlib[7], + Not_found = Stdlib[8], + Out_of_memory = Stdlib[9], + Stack_overflow = Stdlib[10], + Sys_error = Stdlib[11], + End_of_file = Stdlib[12], + Division_by_zero = Stdlib[13], + Sys_blocked_io = Stdlib[14], + Undefined_recursive_module = Stdlib[15], + min = Stdlib[16], + max = Stdlib[17], + abs = Stdlib[18], + max_int = Stdlib[19], + min_int = Stdlib[20], + lnot = Stdlib[21], + infinity = Stdlib[22], + neg_infinity = Stdlib[23], + nan = Stdlib[24], + max_float = Stdlib[25], + min_float = Stdlib[26], + epsilon_float = Stdlib[27], + symbol = Stdlib[28], + char_of_int = Stdlib[29], + string_of_bool = Stdlib[30], + bool_of_string_opt = Stdlib[31], + bool_of_string = Stdlib[32], + string_of_int = Stdlib[33], + int_of_string_opt = Stdlib[34], + string_of_float = Stdlib[35], + float_of_string_opt = Stdlib[36], + symbol$0 = Stdlib[37], + stdin = Stdlib[38], + stdout = Stdlib[39], + stderr = Stdlib[40], + print_char = Stdlib[41], + print_string = Stdlib[42], + print_bytes = Stdlib[43], + print_int = Stdlib[44], + print_float = Stdlib[45], + print_endline = Stdlib[46], + print_newline = Stdlib[47], + prerr_char = Stdlib[48], + prerr_string = Stdlib[49], + prerr_bytes = Stdlib[50], + prerr_int = Stdlib[51], + prerr_float = Stdlib[52], + prerr_endline = Stdlib[53], + prerr_newline = Stdlib[54], + read_line = Stdlib[55], + read_int_opt = Stdlib[56], + read_int = Stdlib[57], + read_float_opt = Stdlib[58], + read_float = Stdlib[59], + open_out = Stdlib[60], + open_out_bin = Stdlib[61], + open_out_gen = Stdlib[62], + flush = Stdlib[63], + flush_all = Stdlib[64], + output_char = Stdlib[65], + output_string = Stdlib[66], + output_bytes = Stdlib[67], + output = Stdlib[68], + output_substring = Stdlib[69], + output_byte = Stdlib[70], + output_binary_int = Stdlib[71], + output_value = Stdlib[72], + seek_out = Stdlib[73], + pos_out = Stdlib[74], + out_channel_length = Stdlib[75], + close_out = Stdlib[76], + close_out_noerr = Stdlib[77], + set_binary_mode_out = Stdlib[78], + open_in = Stdlib[79], + open_in_bin = Stdlib[80], + open_in_gen = Stdlib[81], + input_char = Stdlib[82], + input_line = Stdlib[83], + input = Stdlib[84], + really_input = Stdlib[85], + really_input_string = Stdlib[86], + input_byte = Stdlib[87], + input_binary_int = Stdlib[88], + input_value = Stdlib[89], + seek_in = Stdlib[90], + pos_in = Stdlib[91], + in_channel_length = Stdlib[92], + close_in = Stdlib[93], + close_in_noerr = Stdlib[94], + set_binary_mode_in = Stdlib[95], + LargeFile = Stdlib[96], + string_of_format = Stdlib[97], + symbol$1 = Stdlib[98], + exit = Stdlib[99], + at_exit = Stdlib[100], + valid_float_lexem = Stdlib[101], + unsafe_really_input = Stdlib[102], + do_at_exit = Stdlib[103], + do_domain_local_at_exit = Stdlib[104], + Caml = + [0, + invalid_arg, + failwith, + Exit, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Not_found, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + LargeFile, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Caml, "Caml"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/sexplib0/sexplib0.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "(", + cst$12 = "()", + cst$13 = ")", + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$2 = cst$11, + cst$3 = cst$12, + cst$4 = cst$13, + cst$5 = " ", + cst$6 = cst$11, + cst$7 = cst$12, + cst$8 = cst$13, + cst$10 = cst$12, + cst$9 = cst$12, + cst = "\\", + cst$0 = ' "', + cst$1 = '"', + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Format = global_data.Stdlib__Format, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_Buffer = global_data.Stdlib__Buffer, + Stdlib = global_data.Stdlib, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Char = global_data.Stdlib__Char, + Stdlib_Bytes = global_data.Stdlib__Bytes, + _b_ = [0, [15, [17, 2, 0]], "%a@?"], + _a_ = [0, 0, 0], + cst_n = "\\n", + cst_Sexplib0_Sexp_Not_found_s = "Sexplib0__Sexp.Not_found_s", + cst_Sexplib0_Sexp_Of_sexp_erro = "Sexplib0__Sexp.Of_sexp_error"; + function sexp_of_t(t){return t;} + function t_of_sexp(t){return t;} + function compare(a$0, b$0){ + if(a$0 === b$0) return 0; + if(0 === a$0[0]){ + var a$1 = a$0[1]; + if(0 !== b$0[0]) return -1; + var b$1 = b$0[1]; + return caml_call2(Stdlib_StringLabels[9], a$1, b$1); + } + var a$2 = a$0[1]; + if(0 === b$0[0]) return 1; + var b$2 = b$0[1], a = a$2, b = b$2; + for(;;){ + if(! a) return b ? -1 : 0; + if(! b) return 1; + var ys = b[2], y = b[1], xs = a[2], x = a[1], res = compare(x, y); + if(0 !== res) return res; + var a = xs, b = ys; + } + } + function equal(a, b){return 0 === compare(a, b) ? 1 : 0;} + var + Not_found_s = [248, cst_Sexplib0_Sexp_Not_found_s, caml_fresh_oo_id(0)], + Of_sexp_error = [248, cst_Sexplib0_Sexp_Of_sexp_erro, caml_fresh_oo_id(0)], + default_indent = [0, 1]; + function must_escape(str){ + var len = caml_ml_string_length(str), _x_ = 0 === len ? 1 : 0; + if(_x_) return _x_; + var ix$1 = len - 1 | 0, ix = ix$1; + for(;;){ + var match = caml_string_get(str, ix), switch$0 = 0; + if(92 <= match){ + var switcher = match - 93 | 0; + if(33 < switcher >>> 0) + if(0 <= switcher) switch$0 = 2; else switch$0 = 1; + else if(31 === switcher){ + var _y_ = 0 < ix ? 1 : 0; + if(_y_){ + var + next = ix - 1 | 0, + _z_ = caml_string_get(str, next), + _A_ = caml_call2(Stdlib_Char[6], _z_, 35); + if(! _A_){var ix = next; continue;} + var _B_ = _A_; + } + else + var _B_ = _y_; + return _B_; + } + } + else + if(42 <= match){ + if(59 === match) switch$0 = 1; + } + else if(33 <= match) + switch(match - 33 | 0){ + case 2: + var _D_ = 0 < ix ? 1 : 0; + if(_D_){ + var + next$0 = ix - 1 | 0, + _E_ = caml_string_get(str, next$0), + _F_ = caml_call2(Stdlib_Char[6], _E_, 124); + if(! _F_){var ix = next$0; continue;} + var _G_ = _F_; + } + else + var _G_ = _D_; + return _G_; + case 1: + case 7: + case 8: + switch$0 = 1; break; + } + else + switch$0 = 2; + switch(switch$0){ + case 0: + var _C_ = 0 < ix ? 1 : 0; + if(! _C_) return _C_; + var ix$0 = ix - 1 | 0, ix = ix$0; + continue; + case 1: + return 1; + default: return 1; + } + } + } + function escaped(s){ + var n = [0, 0], _n_ = caml_ml_string_length(s) - 1 | 0, _m_ = 0; + if(_n_ >= 0){ + var i$0 = _m_; + for(;;){ + var match = caml_string_unsafe_get(s, i$0), switch$0 = 0; + if(32 <= match){ + var _u_ = match - 34 | 0, switch$1 = 0; + if(58 < _u_ >>> 0){ + if(93 > _u_) switch$1 = 1; + } + else if(56 < _u_ - 1 >>> 0) switch$0 = 1; else switch$1 = 1; + if(switch$1){var _v_ = 1; switch$0 = 2;} + } + else + if(11 <= match){ + if(13 === match) switch$0 = 1; + } + else if(8 <= match) switch$0 = 1; + switch(switch$0){case 0: var _v_ = 4; break;case 1: var _v_ = 2; break; + } + n[1] = n[1] + _v_ | 0; + var _w_ = i$0 + 1 | 0; + if(_n_ !== i$0){var i$0 = _w_; continue;} + break; + } + } + if(n[1] === caml_ml_string_length(s)) return s; + var s$0 = caml_create_bytes(n[1]); + n[1] = 0; + var _p_ = caml_ml_string_length(s) - 1 | 0, _o_ = 0; + if(_p_ >= 0){ + var i = _o_; + for(;;){ + var c = caml_string_unsafe_get(s, i), switch$2 = 0; + if(35 <= c) + if(92 === c) + switch$2 = 2; + else if(127 <= c) switch$2 = 1; else switch$2 = 3; + else if(32 <= c) + if(34 <= c) switch$2 = 2; else switch$2 = 3; + else if(14 <= c) + switch$2 = 1; + else + switch(c){ + case 8: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 98); + break; + case 9: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 116); + break; + case 10: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 110); + break; + case 13: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], 114); + break; + default: switch$2 = 1; + } + switch(switch$2){ + case 1: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + var _r_ = caml_call1(Stdlib_Char[1], 48 + (c / 100 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _r_); + n[1]++; + var + _s_ = caml_call1(Stdlib_Char[1], 48 + ((c / 10 | 0) % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _s_); + n[1]++; + var _t_ = caml_call1(Stdlib_Char[1], 48 + (c % 10 | 0) | 0); + caml_bytes_unsafe_set(s$0, n[1], _t_); + break; + case 2: + caml_bytes_unsafe_set(s$0, n[1], 92); + n[1]++; + caml_bytes_unsafe_set(s$0, n[1], c); + break; + case 3: + caml_bytes_unsafe_set(s$0, n[1], c); break; + } + n[1]++; + var _q_ = i + 1 | 0; + if(_p_ !== i){var i = _q_; continue;} + break; + } + } + return caml_call1(Stdlib_BytesLabels[44], s$0); + } + function esc_str(str){ + var + estr = escaped(str), + elen = caml_ml_string_length(estr), + res = caml_create_bytes(elen + 2 | 0); + caml_call5(Stdlib_Bytes[12], estr, 0, res, 1, elen); + caml_bytes_unsafe_set(res, 0, 34); + caml_bytes_unsafe_set(res, elen + 1 | 0, 34); + return caml_call1(Stdlib_BytesLabels[44], res); + } + function index_of_newline(str, start){ + try{ + var _k_ = [0, caml_call3(Stdlib_StringLabels[31], str, start, 10)]; + return _k_; + } + catch(_l_){ + var _j_ = caml_wrap_exception(_l_); + if(_j_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_j_, 0); + } + } + function mach_maybe_esc_str(str){ + return must_escape(str) ? esc_str(str) : str; + } + function pp_hum_indent(indent, ppf, param){ + if(0 === param[0]){ + var str = param[1]; + if(! must_escape(str)) return caml_call2(Stdlib_Format[13], ppf, str); + var match = index_of_newline(str, 0); + if(match) + var + index = match[1], + _g_ = (index + 1 | 0) === caml_ml_string_length(str) ? 1 : 0; + else + var _g_ = 1; + if(_g_){ + var _h_ = esc_str(str); + return caml_call2(Stdlib_Format[13], ppf, _h_); + } + caml_call2(Stdlib_Format[1], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst$0); + var index$0 = 0; + for(;;){ + var next_newline = index_of_newline(str, index$0); + if(next_newline) + var end_pos = next_newline[1], end_pos$0 = end_pos; + else + var end_pos$0 = caml_ml_string_length(str); + var + next_line = + caml_call3 + (Stdlib_StringLabels[15], str, index$0, end_pos$0 - index$0 | 0), + _i_ = escaped(next_line); + caml_call2(Stdlib_Format[13], ppf, _i_); + if(next_newline){ + var newline_index = next_newline[1]; + caml_call2(Stdlib_Format[13], ppf, cst); + caml_call2(Stdlib_Format[34], ppf, 0); + caml_call2(Stdlib_Format[13], ppf, cst_n); + var index$1 = newline_index + 1 | 0, index$0 = index$1; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$1); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + var match$0 = param[1]; + if(! match$0) return caml_call2(Stdlib_Format[13], ppf, cst$3); + var t = match$0[2], h = match$0[1]; + caml_call2(Stdlib_Format[1], ppf, indent); + caml_call2(Stdlib_Format[13], ppf, cst$2); + pp_hum_indent(indent, ppf, h); + var param$0 = t; + for(;;){ + if(param$0){ + var t$0 = param$0[2], h$0 = param$0[1]; + caml_call2(Stdlib_Format[27], ppf, 0); + pp_hum_indent(indent, ppf, h$0); + var param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$4); + return caml_call2(Stdlib_Format[3], ppf, 0); + } + } + function pp_mach_internal(may_need_space, ppf, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Format[13], ppf, cst$5); + caml_call2(Stdlib_Format[13], ppf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Format[13], ppf, cst$7); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Format[13], ppf, cst$6); + var + may_need_space$0 = pp_mach_internal(0, ppf, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = pp_mach_internal(may_need_space$1, ppf, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Format[13], ppf, cst$8); + return 0; + } + } + function pp_hum(ppf, sexp){ + return pp_hum_indent(default_indent[1], ppf, sexp); + } + function pp_mach(ppf, sexp){pp_mach_internal(0, ppf, sexp); return 0;} + function size_loop(acc, param){ + var c = acc[2], v = acc[1]; + if(0 === param[0]){ + var str = param[1]; + return [0, v + 1 | 0, c + caml_ml_string_length(str) | 0]; + } + var lst = param[1]; + return caml_call3(Stdlib_ListLabels[25], size_loop, acc, lst); + } + function size(sexp){return size_loop(_a_, sexp);} + function to_buffer_hum(buf, opt, sexp){ + if(opt) + var sth = opt[1], indent = sth; + else + var indent = default_indent[1]; + var ppf = caml_call1(Stdlib_Format[114], buf); + function _d_(_e_, _f_){return pp_hum_indent(indent, _e_, _f_);} + return caml_call4(Stdlib_Format[135], ppf, _b_, _d_, sexp); + } + function to_buffer_mach(buf, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(Stdlib_Buffer[12], buf, 32); + caml_call2(Stdlib_Buffer[16], buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(Stdlib_Buffer[16], buf, cst$9); return 0;} + var t = match[2], h = match[1]; + caml_call2(Stdlib_Buffer[12], buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(Stdlib_Buffer[12], buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function to_buffer_gen(buf, add_char, add_string, sexp){ + function loop(may_need_space, param){ + if(0 === param[0]){ + var + str = param[1], + str$0 = mach_maybe_esc_str(str), + new_may_need_space = str$0 === str ? 1 : 0, + new_may_need_space$0 = + may_need_space ? new_may_need_space : may_need_space; + if(new_may_need_space$0) caml_call2(add_char, buf, 32); + caml_call2(add_string, buf, str$0); + return new_may_need_space; + } + var match = param[1]; + if(! match){caml_call2(add_string, buf, cst$10); return 0;} + var t = match[2], h = match[1]; + caml_call2(add_char, buf, 40); + var + may_need_space$0 = loop(0, h), + may_need_space$1 = may_need_space$0, + param$0 = t; + for(;;){ + if(param$0){ + var + t$0 = param$0[2], + h$0 = param$0[1], + may_need_space$2 = loop(may_need_space$1, h$0), + may_need_space$1 = may_need_space$2, + param$0 = t$0; + continue; + } + caml_call2(add_char, buf, 41); + return 0; + } + } + loop(0, sexp); + return 0; + } + function buffer(param){return caml_call1(Stdlib_Buffer[1], 1024);} + function to_string_hum(indent, sexp){ + if(0 === sexp[0]){ + var str = sexp[1], _c_ = index_of_newline(str, 0) ? 0 : 1; + if(_c_) return mach_maybe_esc_str(str); + } + var buf = buffer(0); + to_buffer_hum(buf, indent, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + function to_string_mach(sexp){ + if(0 === sexp[0]){var str = sexp[1]; return mach_maybe_esc_str(str);} + var buf = buffer(0); + to_buffer_mach(buf, sexp); + return caml_call1(Stdlib_Buffer[2], buf); + } + var of_float_style = [0, 1009018843], of_int_style = [0, 1009018843]; + function message(name, fields){ + function conv_fields(param){ + if(! param) return 0; + var + rest = param[2], + match = param[1], + fsexp = match[2], + fname = match[1]; + return runtime.caml_string_notequal(fname, "") + ? [0, [1, [0, [0, fname], [0, fsexp, 0]]], conv_fields(rest)] + : [0, fsexp, conv_fields(rest)]; + } + return [1, [0, [0, name], conv_fields(fields)]]; + } + var + Sexplib0_Sexp = + [0, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp_mach, + to_string_hum, + to_string_mach, + to_string_mach, + of_float_style, + of_int_style, + [0, + size, + buffer, + to_buffer_mach, + to_buffer_hum, + to_buffer_mach, + to_buffer_gen, + mach_maybe_esc_str, + must_escape, + esc_str]]; + runtime.caml_register_global(26, Sexplib0_Sexp, "Sexplib0__Sexp"); + return; + } + (globalThis)); + +//# 555 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + doc_comment_tag = "sexp_grammar.doc_comment"; + function coerce(t){return t;} + var Sexplib0_Sexp_grammar = [0, coerce, doc_comment_tag]; + runtime.caml_register_global + (1, Sexplib0_Sexp_grammar, "Sexplib0__Sexp_grammar"); + return; + } + (globalThis)); + +//# 570 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + unit_sexp_grammar = [2, 0], + sexp_t_sexp_grammar = [0, "Sexp.t"], + empty_sexp_grammar = [4, 0], + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + bool_sexp_grammar = 0, + string_sexp_grammar = 4, + bytes_sexp_grammar = 4, + char_sexp_grammar = 1, + int_sexp_grammar = 2, + float_sexp_grammar = 3, + int32_sexp_grammar = 2, + int64_sexp_grammar = 2, + nativeint_sexp_grammar = 2; + function ref_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function lazy_t_sexp_grammar(grammar){ + return caml_call1(Sexplib0_Sexp_grammar[1], grammar); + } + function option_sexp_grammar(param){return [1, param];} + function list_sexp_grammar(param){return [2, [1, param]];} + function array_sexp_grammar(param){return [2, [1, param]];} + var + Sexplib0_Sexp_conv_grammar = + [0, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + empty_sexp_grammar, + empty_sexp_grammar]; + runtime.caml_register_global + (4, Sexplib0_Sexp_conv_grammar, "Sexplib0__Sexp_conv_grammar"); + return; + } + (globalThis)); + +//# 632 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Assert_failure$0 = "Assert_failure", + cst_None = "None", + cst_Some = "Some", + cst_none = "none", + cst_option_of_sexp_only_none_c$1 = "option_of_sexp: only none can be atom", + cst_some = "some", + cst_src_sexp_conv_ml = "src/sexp_conv.ml", + caml_check_bound = runtime.caml_check_bound, + caml_float_of_string = runtime.caml_float_of_string, + caml_format_float = runtime.caml_format_float, + caml_int_of_string = runtime.caml_int_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Stdlib_Parsing = global_data.Stdlib__Parsing, + Stdlib_Queue = global_data.Stdlib__Queue, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Stack = global_data.Stdlib__Stack, + Stdlib_Sys = global_data.Stdlib__Sys, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Stdlib_Obj = global_data.Stdlib__Obj, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib_Ephemeron = global_data.Stdlib__Ephemeron, + Sexplib0_Sexp_conv_grammar = global_data.Sexplib0__Sexp_conv_grammar, + _aF_ = [0, 0], + _aG_ = [0, 1], + _aB_ = [0, "Sexplib.Conv.Of_sexp_error"], + _aC_ = [0, cst_src_sexp_conv_ml, 410, 15], + _ay_ = [0, 0], + _az_ = [0, 0], + cst_Assert_failure = cst_Assert_failure$0, + _av_ = [0, cst_src_sexp_conv_ml, 334, 15], + _ar_ = [0, "Exit"], + _as_ = [0, cst_src_sexp_conv_ml, 338, 15], + _an_ = [0, "End_of_file"], + _ao_ = [0, cst_src_sexp_conv_ml, 342, 15], + _aj_ = [0, "Failure"], + _ak_ = [0, cst_src_sexp_conv_ml, 346, 15], + _af_ = [0, "Not_found"], + _ag_ = [0, cst_src_sexp_conv_ml, 350, 15], + _ab_ = [0, "Invalid_argument"], + _ac_ = [0, cst_src_sexp_conv_ml, 354, 15], + cst_Match_failure = "Match_failure", + ___ = [0, cst_src_sexp_conv_ml, 358, 15], + _W_ = [0, "Not_found_s"], + _X_ = [0, cst_src_sexp_conv_ml, 362, 15], + _S_ = [0, "Sys_error"], + _T_ = [0, cst_src_sexp_conv_ml, 366, 15], + _O_ = [0, "Arg.Help"], + _P_ = [0, cst_src_sexp_conv_ml, 370, 15], + _K_ = [0, "Arg.Bad"], + _L_ = [0, cst_src_sexp_conv_ml, 374, 15], + _G_ = [0, "Lazy.Undefined"], + _H_ = [0, cst_src_sexp_conv_ml, 378, 15], + _C_ = [0, "Parsing.Parse_error"], + _D_ = [0, cst_src_sexp_conv_ml, 382, 15], + _y_ = [0, "Queue.Empty"], + _z_ = [0, cst_src_sexp_conv_ml, 386, 15], + _u_ = [0, "Scanf.Scan_failure"], + _v_ = [0, cst_src_sexp_conv_ml, 390, 15], + _q_ = [0, "Stack.Empty"], + _r_ = [0, cst_src_sexp_conv_ml, 394, 15], + _m_ = [0, "Sys.Break"], + _n_ = [0, cst_src_sexp_conv_ml, 398, 15], + _j_ = + [0, + [2, + 0, + [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, [12, 58, [4, 0, 0, 0, 0]]]]]]], + "%s %s:%d:%d"], + cst_fun_of_sexp_cannot_convert = + "fun_of_sexp: cannot convert function values", + cst_opaque_of_sexp_cannot_conv = + "opaque_of_sexp: cannot convert opaque values", + cst_hashtbl_of_sexp_tuple_list = "hashtbl_of_sexp: tuple list needed", + cst_hashtbl_of_sexp_list_neede = "hashtbl_of_sexp: list needed", + cst_array_of_sexp_list_needed = "array_of_sexp: list needed", + cst_list_of_sexp_list_needed = "list_of_sexp: list needed", + cst_triple_of_sexp_list_needed = "triple_of_sexp: list needed", + cst_triple_of_sexp_list_must_c = + "triple_of_sexp: list must contain exactly three elements only", + cst_pair_of_sexp_list_needed = "pair_of_sexp: list needed", + cst_pair_of_sexp_list_must_con = + "pair_of_sexp: list must contain exactly two elements only", + cst_option_of_sexp_only_none_c = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_r = + "option_of_sexp: list must represent optional value", + cst_option_of_sexp_only_none_c$0 = cst_option_of_sexp_only_none_c$1, + cst_option_of_sexp_list_must_b = "option_of_sexp: list must be (some el)", + cst_nativeint_of_sexp = "nativeint_of_sexp: ", + cst_nativeint_of_sexp_atom_nee = "nativeint_of_sexp: atom needed", + cst_int64_of_sexp = "int64_of_sexp: ", + cst_int64_of_sexp_atom_needed = "int64_of_sexp: atom needed", + cst_int32_of_sexp = "int32_of_sexp: ", + cst_int32_of_sexp_atom_needed = "int32_of_sexp: atom needed", + cst_float_of_sexp = "float_of_sexp: ", + cst_float_of_sexp_atom_needed = "float_of_sexp: atom needed", + cst_int_of_sexp = "int_of_sexp: ", + cst_int_of_sexp_atom_needed = "int_of_sexp: atom needed", + cst_char_of_sexp_atom_string_m = + "char_of_sexp: atom string must contain one character only", + cst_char_of_sexp_atom_needed = "char_of_sexp: atom needed", + cst_bytes_of_sexp_atom_needed = "bytes_of_sexp: atom needed", + cst_string_of_sexp_atom_needed = "string_of_sexp: atom needed", + cst_bool_of_sexp_unknown_strin = "bool_of_sexp: unknown string", + cst_bool_of_sexp_atom_needed = "bool_of_sexp: atom needed", + cst_unit_of_sexp_empty_list_ne = "unit_of_sexp: empty list needed", + _i_ = [0, 2], + _h_ = [0, 2], + _f_ = [0, ""], + _e_ = [0, ""], + _b_ = [0, cst_some], + _c_ = [1, 0], + _d_ = [0, cst_none], + _a_ = [1, 0], + default_string_of_float = + [0, + function(x){ + var y = caml_format_float("%.15G", x); + return caml_float_of_string(y) == x + ? y + : caml_format_float("%.17G", x); + }], + read_old_option_format = [0, 1], + write_old_option_format = [0, 1]; + function list_map(f, l){ + var _bo_ = caml_call2(Stdlib_ListLabels[21], f, l); + return caml_call1(Stdlib_ListLabels[9], _bo_); + } + function sexp_of_unit(param){return _a_;} + function sexp_of_bool(b){return [0, caml_call1(Stdlib[30], b)];} + function sexp_of_string(str){return [0, str];} + function sexp_of_bytes(bytes){ + return [0, caml_call1(Stdlib_BytesLabels[6], bytes)]; + } + function sexp_of_char(c){ + return [0, caml_call2(Stdlib_StringLabels[1], 1, c)]; + } + function sexp_of_int(n){return [0, caml_call1(Stdlib[33], n)];} + function sexp_of_float(n){ + return [0, caml_call1(default_string_of_float[1], n)]; + } + function sexp_of_int32(n){return [0, caml_call1(Stdlib_Int32[14], n)];} + function sexp_of_int64(n){return [0, caml_call1(Stdlib_Int64[14], n)];} + function sexp_of_nativeint(n){ + return [0, caml_call1(Stdlib_Nativeint[15], n)]; + } + function sexp_of_ref(sexp_of_a, rf){return caml_call1(sexp_of_a, rf[1]);} + function sexp_of_lazy_t(sexp_of_a, lv){ + var _bm_ = runtime.caml_obj_tag(lv); + if(250 === _bm_) + var _bn_ = lv[1]; + else{ + var switch$0 = 0; + if(246 !== _bm_ && 244 !== _bm_){var _bn_ = lv; switch$0 = 1;} + if(! switch$0) var _bn_ = caml_call1(CamlinternalLazy[2], lv); + } + return caml_call1(sexp_of_a, _bn_); + } + function sexp_of_option(sexp_of_a, param){ + if(! param) return write_old_option_format[1] ? _c_ : _d_; + var x = param[1]; + return write_old_option_format[1] + ? [1, [0, caml_call1(sexp_of_a, x), 0]] + : [1, [0, _b_, [0, caml_call1(sexp_of_a, x), 0]]]; + } + function sexp_of_pair(sexp_of_a, sexp_of_b, param){ + var b = param[2], a = param[1], _bl_ = [0, caml_call1(sexp_of_b, b), 0]; + return [1, [0, caml_call1(sexp_of_a, a), _bl_]]; + } + function sexp_of_triple(sexp_of_a, sexp_of_b, sexp_of_c, param){ + var + c = param[3], + b = param[2], + a = param[1], + _bj_ = [0, caml_call1(sexp_of_c, c), 0], + _bk_ = [0, caml_call1(sexp_of_b, b), _bj_]; + return [1, [0, caml_call1(sexp_of_a, a), _bk_]]; + } + function sexp_of_list(sexp_of_a, lst){ + var _bi_ = caml_call2(Stdlib_ListLabels[21], sexp_of_a, lst); + return [1, caml_call1(Stdlib_ListLabels[9], _bi_)]; + } + function sexp_of_array(sexp_of_a, ar){ + var lst_ref = [0, 0], _bf_ = ar.length - 1 - 1 | 0; + if(_bf_ >= 0){ + var i = _bf_; + for(;;){ + var _bg_ = lst_ref[1]; + lst_ref[1] = + [0, caml_call1(sexp_of_a, caml_check_bound(ar, i)[1 + i]), _bg_]; + var _bh_ = i - 1 | 0; + if(0 !== i){var i = _bh_; continue;} + break; + } + } + return [1, lst_ref[1]]; + } + function sexp_of_hashtbl(sexp_of_key, sexp_of_val, htbl){ + function coll(k, v, acc){ + var _be_ = [0, caml_call1(sexp_of_val, v), 0]; + return [0, [1, [0, caml_call1(sexp_of_key, k), _be_]], acc]; + } + return [1, caml_call3(Stdlib_MoreLabels[1][14], coll, htbl, 0)]; + } + function sexp_of_opaque(param){return _e_;} + function sexp_of_fun(param){return _f_;} + function equal(_bd_, _bc_){return _bd_ === _bc_ ? 1 : 0;} + var + hash = Stdlib_Obj[23][3], + Exn_table = caml_call1(Stdlib_Ephemeron[1][3], [0, equal, hash]), + the_exn_table = caml_call1(Exn_table[1], 17); + function add(opt, param, extension_constructor, sexp_of_exn){ + if(opt) var sth = opt[1], printexc = sth; else var printexc = 1; + return caml_call3 + (Exn_table[5], + the_exn_table, + extension_constructor, + [0, sexp_of_exn, printexc]); + } + function find_auto(for_printexc, exn){ + var + extension_constructor = caml_call1(Stdlib_Obj[23][1], exn), + match = caml_call2(Exn_table[8], the_exn_table, extension_constructor); + if(! match) return 0; + var match$0 = match[1], printexc = match$0[2], sexp_of_exn = match$0[1]; + if(for_printexc && ! printexc) return 0; + return [0, caml_call1(sexp_of_exn, exn)]; + } + function size(param){return caml_call1(Exn_table[18], the_exn_table)[1];} + var For_unit_tests_only = [0, size]; + function sexp_of_exn_opt(exn){return find_auto(0, exn);} + function sexp_of_exn(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return [1, [0, [0, caml_call1(Stdlib_Printexc[1], exn)], 0]]; + var sexp = match[1]; + return sexp; + } + function exn_to_string(e){ + var _bb_ = sexp_of_exn(e); + return caml_call2(Sexplib0_Sexp[13], 0, _bb_); + } + function _g_(exn){ + var match = find_auto(1, exn); + if(! match) return 0; + var sexp = match[1]; + return [0, caml_call2(Sexplib0_Sexp[13], _h_, sexp)]; + } + caml_call1(Stdlib_Printexc[9], _g_); + function printexc_prefer_sexp(exn){ + var match = sexp_of_exn_opt(exn); + if(! match) return caml_call1(Stdlib_Printexc[1], exn); + var sexp = match[1]; + return caml_call2(Sexplib0_Sexp[13], _i_, sexp); + } + var Of_sexp_error = Sexplib0_Sexp[6], record_check_extra_fields = [0, 1]; + function of_sexp_error_exn(exc, sexp){ + throw caml_maybe_attach_backtrace([0, Of_sexp_error, exc, sexp], 1); + } + function of_sexp_error(what, sexp){ + throw caml_maybe_attach_backtrace + ([0, Of_sexp_error, [0, Stdlib[7], what], sexp], 1); + } + function unit_of_sexp(sexp){ + if(1 === sexp[0] && ! sexp[1]) return 0; + return of_sexp_error(cst_unit_of_sexp_empty_list_ne, sexp); + } + function bool_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bool_of_sexp_atom_needed, sexp); + var _ba_ = sexp[1]; + if(caml_string_notequal(_ba_, "False")){ + var switch$0 = 0; + if(caml_string_notequal(_ba_, "True")) + if(caml_string_notequal(_ba_, "false")){ + if(caml_string_notequal(_ba_, "true")) + return of_sexp_error(cst_bool_of_sexp_unknown_strin, sexp); + } + else + switch$0 = 1; + if(! switch$0) return 1; + } + return 0; + } + function string_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_string_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return str; + } + function bytes_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_bytes_of_sexp_atom_needed, sexp); + var str = sexp[1]; + return caml_call1(Stdlib_BytesLabels[5], str); + } + function char_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_char_of_sexp_atom_needed, sexp); + var str = sexp[1]; + if(1 !== runtime.caml_ml_string_length(str)) + of_sexp_error(cst_char_of_sexp_atom_string_m, sexp); + return runtime.caml_string_get(str, 0); + } + function int_of_sexp(sexp){ + if(0 !== sexp[0]) return of_sexp_error(cst_int_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a$_ = caml_int_of_string(str); return _a$_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a__ = exn_to_string(exc); + return of_sexp_error(caml_call2(Stdlib[28], cst_int_of_sexp, _a__), sexp); + } + } + function float_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_float_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a9_ = caml_float_of_string(str); return _a9_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a8_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_float_of_sexp, _a8_), sexp); + } + } + function int32_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int32_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a7_ = caml_int_of_string(str); return _a7_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a6_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int32_of_sexp, _a6_), sexp); + } + } + function int64_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_int64_of_sexp_atom_needed, sexp); + var str = sexp[1]; + try{var _a5_ = runtime.caml_int64_of_string(str); return _a5_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a4_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_int64_of_sexp, _a4_), sexp); + } + } + function nativeint_of_sexp(sexp){ + if(0 !== sexp[0]) + return of_sexp_error(cst_nativeint_of_sexp_atom_nee, sexp); + var str = sexp[1]; + try{var _a3_ = caml_int_of_string(str); return _a3_;} + catch(exc$0){ + var exc = caml_wrap_exception(exc$0), _a2_ = exn_to_string(exc); + return of_sexp_error + (caml_call2(Stdlib[28], cst_nativeint_of_sexp, _a2_), sexp); + } + } + function ref_of_sexp(a_of_sexp, sexp){ + return [0, caml_call1(a_of_sexp, sexp)]; + } + function lazy_t_of_sexp(a_of_sexp, sexp){ + var _a1_ = caml_call1(a_of_sexp, sexp); + return caml_call1(Stdlib_Lazy[4], _a1_); + } + function option_of_sexp(a_of_sexp, sexp){ + if(! read_old_option_format[1]){ + if(0 === sexp[0]){ + var _aW_ = sexp[1]; + if + (caml_string_notequal(_aW_, cst_None) + && caml_string_notequal(_aW_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c$0, sexp); + return 0; + } + var _aX_ = sexp[1]; + if(_aX_){ + var _aY_ = _aX_[1]; + if(0 === _aY_[0]){ + var _aZ_ = _aY_[1], switch$2 = 0; + if + (! + caml_string_notequal(_aZ_, cst_Some) + || ! caml_string_notequal(_aZ_, cst_some)) + switch$2 = 1; + if(switch$2){ + var _a0_ = _aX_[2]; + if(_a0_ && ! _a0_[2]){ + var el$0 = _a0_[1]; + return [0, caml_call1(a_of_sexp, el$0)]; + } + } + } + } + return of_sexp_error(cst_option_of_sexp_list_must_b, sexp); + } + if(0 === sexp[0]){ + var _aR_ = sexp[1]; + if + (caml_string_notequal(_aR_, cst_None) + && caml_string_notequal(_aR_, cst_none)) + return of_sexp_error(cst_option_of_sexp_only_none_c, sexp); + } + else{ + var _aS_ = sexp[1]; + if(_aS_){ + var _aT_ = _aS_[1]; + if(_aS_[2]){ + var switch$0 = 0; + if(0 === _aT_[0]){ + var _aU_ = _aT_[1], switch$1 = 0; + if + (! + caml_string_notequal(_aU_, cst_Some) + || ! caml_string_notequal(_aU_, cst_some)) + switch$1 = 1; + if(switch$1){ + var _aV_ = _aS_[2]; + if(! _aV_[2]){var el = _aV_[1]; switch$0 = 1;} + } + } + if(! switch$0) + return of_sexp_error(cst_option_of_sexp_list_must_r, sexp); + } + else + var el = _aT_; + return [0, caml_call1(a_of_sexp, el)]; + } + } + return 0; + } + function pair_of_sexp(a_of_sexp, b_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_pair_of_sexp_list_needed, sexp); + var _aP_ = sexp[1]; + if(_aP_){ + var _aQ_ = _aP_[2]; + if(_aQ_ && ! _aQ_[2]){ + var + b_sexp = _aQ_[1], + a_sexp = _aP_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp); + return [0, a, b]; + } + } + return of_sexp_error(cst_pair_of_sexp_list_must_con, sexp); + } + function triple_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_triple_of_sexp_list_needed, sexp); + var _aM_ = sexp[1]; + if(_aM_){ + var _aN_ = _aM_[2]; + if(_aN_){ + var _aO_ = _aN_[2]; + if(_aO_ && ! _aO_[2]){ + var + c_sexp = _aO_[1], + b_sexp = _aN_[1], + a_sexp = _aM_[1], + a = caml_call1(a_of_sexp, a_sexp), + b = caml_call1(b_of_sexp, b_sexp), + c = caml_call1(c_of_sexp, c_sexp); + return [0, a, b, c]; + } + } + } + return of_sexp_error(cst_triple_of_sexp_list_must_c, sexp); + } + function list_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_list_of_sexp_list_needed, sexp); + var + lst = sexp[1], + rev_lst = caml_call2(Stdlib_ListLabels[21], a_of_sexp, lst); + return caml_call1(Stdlib_ListLabels[9], rev_lst); + } + function array_of_sexp(a_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_array_of_sexp_list_needed, sexp); + var match = sexp[1]; + if(! match) return [0]; + var + t = match[2], + h = match[1], + len = caml_call1(Stdlib_ListLabels[1], t) + 1 | 0, + res = runtime.caml_make_vect(len, caml_call1(a_of_sexp, h)), + i = 1, + param = t; + for(;;){ + if(! param) return res; + var t$0 = param[2], h$0 = param[1], _aL_ = caml_call1(a_of_sexp, h$0); + caml_check_bound(res, i)[1 + i] = _aL_; + var i$0 = i + 1 | 0, i = i$0, param = t$0; + } + } + function hashtbl_of_sexp(key_of_sexp, val_of_sexp, sexp){ + if(0 === sexp[0]) + return of_sexp_error(cst_hashtbl_of_sexp_list_neede, sexp); + var lst = sexp[1], htbl = caml_call2(Stdlib_MoreLabels[1][1], 0, 0); + function act(param){ + if(1 === param[0]){ + var _aH_ = param[1]; + if(_aH_){ + var _aI_ = _aH_[2]; + if(_aI_ && ! _aI_[2]){ + var + v_sexp = _aI_[1], + k_sexp = _aH_[1], + _aJ_ = caml_call1(val_of_sexp, v_sexp), + _aK_ = caml_call1(key_of_sexp, k_sexp); + return caml_call3(Stdlib_MoreLabels[1][5], htbl, _aK_, _aJ_); + } + } + } + return of_sexp_error(cst_hashtbl_of_sexp_tuple_list, sexp); + } + caml_call2(Stdlib_ListLabels[17], act, lst); + return htbl; + } + function opaque_of_sexp(sexp){ + return of_sexp_error(cst_opaque_of_sexp_cannot_conv, sexp); + } + function fun_of_sexp(sexp){ + return of_sexp_error(cst_fun_of_sexp_cannot_convert, sexp); + } + var + unit_sexp_grammar = Sexplib0_Sexp_conv_grammar[1], + bool_sexp_grammar = Sexplib0_Sexp_conv_grammar[2], + string_sexp_grammar = Sexplib0_Sexp_conv_grammar[3], + bytes_sexp_grammar = Sexplib0_Sexp_conv_grammar[4], + char_sexp_grammar = Sexplib0_Sexp_conv_grammar[5], + int_sexp_grammar = Sexplib0_Sexp_conv_grammar[6], + float_sexp_grammar = Sexplib0_Sexp_conv_grammar[7], + int32_sexp_grammar = Sexplib0_Sexp_conv_grammar[8], + int64_sexp_grammar = Sexplib0_Sexp_conv_grammar[9], + nativeint_sexp_grammar = Sexplib0_Sexp_conv_grammar[10], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[11], + ref_sexp_grammar = Sexplib0_Sexp_conv_grammar[12], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv_grammar[13], + option_sexp_grammar = Sexplib0_Sexp_conv_grammar[14], + list_sexp_grammar = Sexplib0_Sexp_conv_grammar[15], + array_sexp_grammar = Sexplib0_Sexp_conv_grammar[16], + opaque_sexp_grammar = Sexplib0_Sexp_conv_grammar[17], + fun_sexp_grammar = Sexplib0_Sexp_conv_grammar[18]; + function get_flc_error(name, param){ + var chr = param[3], line = param[2], file = param[1]; + return [0, caml_call5(Stdlib_Printf[4], _j_, name, file, line, chr)]; + } + var _k_ = 0; + function _l_(param){ + if(param === Stdlib_Sys[44]) return _m_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + var _o_ = [0, [0, Stdlib_Sys[44], _l_], _k_]; + function _p_(param){ + if(param === Stdlib_Stack[1]) return _q_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var _s_ = [0, [0, Stdlib_Stack[1], _p_], _o_]; + function _t_(param){ + if(param[1] !== Stdlib_Scanf[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var arg = param[2]; + return [1, [0, _u_, [0, [0, arg], 0]]]; + } + var _w_ = [0, [0, Stdlib_Scanf[2], _t_], _s_]; + function _x_(param){ + if(param === Stdlib_Queue[1]) return _y_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + var _A_ = [0, [0, Stdlib_Queue[1], _x_], _w_]; + function _B_(param){ + if(param === Stdlib_Parsing[10]) return _C_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + } + var _E_ = [0, [0, Stdlib_Parsing[10], _B_], _A_]; + function _F_(param){ + if(param === Stdlib_Lazy[1]) return _G_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + } + var _I_ = [0, [0, Stdlib_Lazy[1], _F_], _E_]; + function _J_(param){ + if(param[1] !== Stdlib_Arg[8]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + var arg = param[2]; + return [1, [0, _K_, [0, [0, arg], 0]]]; + } + var _M_ = [0, [0, Stdlib_Arg[8], _J_], _I_]; + function _N_(param){ + if(param[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _P_], 1); + var arg = param[2]; + return [1, [0, _O_, [0, [0, arg], 0]]]; + } + var _Q_ = [0, [0, Stdlib_Arg[7], _N_], _M_]; + function _R_(param){ + if(param[1] !== Stdlib[11]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _T_], 1); + var arg = param[2]; + return [1, [0, _S_, [0, [0, arg], 0]]]; + } + var _U_ = [0, [0, Stdlib[11], _R_], _Q_]; + function _V_(param){ + if(param[1] !== Sexplib0_Sexp[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _X_], 1); + var arg = param[2]; + return [1, [0, _W_, [0, arg, 0]]]; + } + var _Y_ = [0, [0, Sexplib0_Sexp[5], _V_], _U_]; + function _Z_(param){ + if(param[1] !== Stdlib[4]) + throw caml_maybe_attach_backtrace([0, Assert_failure, ___], 1); + var arg = param[2]; + return get_flc_error(cst_Match_failure, arg); + } + var _$_ = [0, [0, Stdlib[4], _Z_], _Y_]; + function _aa_(param){ + if(param[1] !== Stdlib[6]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ac_], 1); + var arg = param[2]; + return [1, [0, _ab_, [0, [0, arg], 0]]]; + } + var _ad_ = [0, [0, Stdlib[6], _aa_], _$_]; + function _ae_(param){ + if(param === Stdlib[8]) return _af_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ag_], 1); + } + var _ah_ = [0, [0, Stdlib[8], _ae_], _ad_]; + function _ai_(param){ + if(param[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _ak_], 1); + var arg = param[2]; + return [1, [0, _aj_, [0, [0, arg], 0]]]; + } + var _al_ = [0, [0, Stdlib[7], _ai_], _ah_]; + function _am_(param){ + if(param === Stdlib[12]) return _an_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _ao_], 1); + } + var _ap_ = [0, [0, Stdlib[12], _am_], _al_]; + function _aq_(param){ + if(param === Stdlib[3]) return _ar_; + throw caml_maybe_attach_backtrace([0, Assert_failure, _as_], 1); + } + var _at_ = [0, [0, Stdlib[3], _aq_], _ap_]; + function _au_(param){ + if(param[1] !== Stdlib[5]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _av_], 1); + var arg = param[2]; + return get_flc_error(cst_Assert_failure, arg); + } + var _aw_ = [0, [0, Stdlib[5], _au_], _at_]; + function _ax_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_az_, _ay_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _ax_, _aw_); + var + _aA_ = 0, + _aD_ = + [0, + [0, + Of_sexp_error, + function(param){ + if(param[1] !== Of_sexp_error) + throw caml_maybe_attach_backtrace([0, Assert_failure, _aC_], 1); + var sexp = param[3], exc = param[2]; + return [1, [0, _aB_, [0, sexp_of_exn(exc), [0, sexp, 0]]]]; + }], + _aA_]; + function _aE_(param){ + var handler = param[2], extension_constructor = param[1]; + return add(_aG_, _aF_, extension_constructor, handler); + } + caml_call2(Stdlib_ListLabels[17], _aE_, _aD_); + var + Sexplib0_Sexp_conv = + [0, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + [0, add, For_unit_tests_only]]; + runtime.caml_register_global + (117, Sexplib0_Sexp_conv, "Sexplib0__Sexp_conv"); + return; + } + (globalThis)); + +//# 1429 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = " ", + cst_has_incorrect_number_of_ar = " has incorrect number of arguments", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Stdlib = global_data.Stdlib, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_Printf = global_data.Stdlib__Printf, + Of_sexp_error = Sexplib0_Sexp_conv[25], + cst_of_sexp_trying_to_convert_ = + "_of_sexp: trying to convert an empty type", + cst_of_sexp_the_empty_list_is_ = + "_of_sexp: the empty list is an invalid polymorphic variant", + cst_of_sexp_a_nested_list_is_a = + "_of_sexp: a nested list is an invalid polymorphic variant", + cst_of_sexp_polymorphic_varian$0 = + "_of_sexp: polymorphic variant tag takes an argument", + _e_ = + [0, + [2, + 0, + [11, + "_of_sexp: polymorphic variant tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: polymorphic variant tag %S has incorrect number of arguments"], + cst_of_sexp_polymorphic_varian = + "_of_sexp: polymorphic variant does not take arguments", + cst_of_sexp_no_matching_varian = "_of_sexp: no matching variant found", + cst_of_sexp_cannot_convert_val = + "_of_sexp: cannot convert values of types resulting from polymorphic record fields", + cst_of_sexp_list_instead_of_at = + "_of_sexp: list instead of atom for record expected", + _d_ = + [0, + [2, + 0, + [11, + "_of_sexp: the following record elements were undefined: ", + [2, 0, 0]]], + "%s_of_sexp: the following record elements were undefined: %s"], + cst_extra_fields = "extra fields", + cst_duplicate_fields = "duplicate fields", + _c_ = + [0, + [2, 0, [11, "_of_sexp: ", [2, 0, [11, ": ", [2, 0, 0]]]]], + "%s_of_sexp: %s: %s"], + cst_of_sexp_record_conversion_$0 = + "_of_sexp: record conversion: only pairs expected, their first element must be an atom", + cst_of_sexp_record_conversion_ = + "_of_sexp: record conversion: a [sexp.bool] field was given a payload.", + cst_of_sexp_unexpected_variant = + "_of_sexp: unexpected variant constructor", + cst_of_sexp_expected_a_variant$0 = + "_of_sexp: expected a variant type, saw an empty list", + cst_of_sexp_expected_a_variant = + "_of_sexp: expected a variant type, saw a nested list", + cst_of_sexp_this_constructor_r = + "_of_sexp: this constructor requires arguments", + _b_ = + [0, + [2, + 0, + [11, + "_of_sexp: sum tag ", + [3, 0, [11, cst_has_incorrect_number_of_ar, 0]]]], + "%s_of_sexp: sum tag %S has incorrect number of arguments"], + cst_of_sexp_this_constructor_d = + "_of_sexp: this constructor does not take arguments", + _a_ = + [0, + [2, + 0, + [11, "_of_sexp: tuple of size ", [4, 0, 0, 0, [11, " expected", 0]]]], + "%s_of_sexp: tuple of size %d expected"], + cst_Sexplib0_Sexp_conv_error_N = + "Sexplib0__Sexp_conv_error.No_variant_match"; + function tuple_of_size_n_expected(loc, n, sexp){ + var _t_ = caml_call3(Stdlib_Printf[4], _a_, loc, n); + return caml_call2(Sexplib0_Sexp_conv[27], _t_, sexp); + } + function stag_no_args(loc, sexp){ + var _s_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_d); + return caml_call2(Sexplib0_Sexp_conv[27], _s_, sexp); + } + function stag_incorrect_n_args(loc, tag, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _b_, loc, tag); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function stag_takes_args(loc, sexp){ + var _r_ = caml_call2(Stdlib[28], loc, cst_of_sexp_this_constructor_r); + return caml_call2(Sexplib0_Sexp_conv[27], _r_, sexp); + } + function nested_list_invalid_sum(loc, sexp){ + var _q_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _q_, sexp); + } + function empty_list_invalid_sum(loc, sexp){ + var _p_ = caml_call2(Stdlib[28], loc, cst_of_sexp_expected_a_variant$0); + return caml_call2(Sexplib0_Sexp_conv[27], _p_, sexp); + } + function unexpected_stag(loc, sexp){ + var _o_ = caml_call2(Stdlib[28], loc, cst_of_sexp_unexpected_variant); + return caml_call2(Sexplib0_Sexp_conv[27], _o_, sexp); + } + function record_sexp_bool_with_payload(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_only_pairs_expected(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_record_conversion_$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_superfluous_fields(what, loc, rev_fld_names, sexp){ + var + _n_ = caml_call1(Stdlib_ListLabels[9], rev_fld_names), + fld_names_str = caml_call2(Stdlib_StringLabels[6], cst, _n_), + msg = caml_call4(Stdlib_Printf[4], _c_, loc, what, fld_names_str); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_duplicate_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_duplicate_fields, loc, rev_fld_names, sexp); + } + function record_extra_fields(loc, rev_fld_names, sexp){ + return record_superfluous_fields + (cst_extra_fields, loc, rev_fld_names, sexp); + } + function record_get_undefined_loop(fields, param){ + var fields$0 = fields, param$0 = param; + for(;;){ + if(! param$0){ + var _m_ = caml_call1(Stdlib_ListLabels[9], fields$0); + return caml_call2(Stdlib_StringLabels[6], cst$0, _m_); + } + var _l_ = param$0[1]; + if(_l_[1]){ + var + rest = param$0[2], + field = _l_[2], + fields$1 = [0, field, fields$0], + fields$0 = fields$1, + param$0 = rest; + continue; + } + var rest$0 = param$0[2], param$0 = rest$0; + } + } + function record_undefined_elements(loc, sexp, lst){ + var + undefined$0 = record_get_undefined_loop(0, lst), + msg = caml_call3(Stdlib_Printf[4], _d_, loc, undefined$0); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_list_instead_atom(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_list_instead_of_at); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function record_poly_field_value(loc, sexp){ + var msg = caml_call2(Stdlib[28], loc, cst_of_sexp_cannot_convert_val); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + var + No_variant_match = + [248, cst_Sexplib0_Sexp_conv_error_N, runtime.caml_fresh_oo_id(0)]; + function no_variant_match(param){ + throw caml_maybe_attach_backtrace(No_variant_match, 1); + } + function no_matching_variant_found(loc, sexp){ + var _k_ = caml_call2(Stdlib[28], loc, cst_of_sexp_no_matching_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _k_, sexp); + } + function ptag_no_args(loc, sexp){ + var _j_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian); + return caml_call2(Sexplib0_Sexp_conv[27], _j_, sexp); + } + function ptag_incorrect_n_args(loc, cnstr, sexp){ + var msg = caml_call3(Stdlib_Printf[4], _e_, loc, cnstr); + return caml_call2(Sexplib0_Sexp_conv[27], msg, sexp); + } + function ptag_takes_args(loc, sexp){ + var _i_ = caml_call2(Stdlib[28], loc, cst_of_sexp_polymorphic_varian$0); + return caml_call2(Sexplib0_Sexp_conv[27], _i_, sexp); + } + function nested_list_invalid_poly_var(loc, sexp){ + var _h_ = caml_call2(Stdlib[28], loc, cst_of_sexp_a_nested_list_is_a); + return caml_call2(Sexplib0_Sexp_conv[27], _h_, sexp); + } + function empty_list_invalid_poly_var(loc, sexp){ + var _g_ = caml_call2(Stdlib[28], loc, cst_of_sexp_the_empty_list_is_); + return caml_call2(Sexplib0_Sexp_conv[27], _g_, sexp); + } + function empty_type(loc, sexp){ + var _f_ = caml_call2(Stdlib[28], loc, cst_of_sexp_trying_to_convert_); + return caml_call2(Sexplib0_Sexp_conv[27], _f_, sexp); + } + var + Sexplib0_Sexp_conv_error = + [0, + Of_sexp_error, + tuple_of_size_n_expected, + stag_no_args, + stag_incorrect_n_args, + stag_takes_args, + nested_list_invalid_sum, + empty_list_invalid_sum, + unexpected_stag, + record_sexp_bool_with_payload, + record_only_pairs_expected, + record_superfluous_fields, + record_duplicate_fields, + record_extra_fields, + record_get_undefined_loop, + record_undefined_elements, + record_list_instead_atom, + record_poly_field_value, + No_variant_match, + no_variant_match, + no_matching_variant_found, + ptag_no_args, + ptag_incorrect_n_args, + ptag_takes_args, + nested_list_invalid_poly_var, + empty_list_invalid_poly_var, + empty_type]; + runtime.caml_register_global + (30, Sexplib0_Sexp_conv_error, "Sexplib0__Sexp_conv_error"); + return; + } + (globalThis)); + +//# 1689 "../../../.js/default/sexplib0/sexplib0.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Sexplib0_Sexpable = [0]; + runtime.caml_register_global(0, Sexplib0_Sexpable, "Sexplib0__Sexpable"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/base.shadow_stdlib/shadow_stdlib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + invalid_arg = Caml[1], + failwith = Caml[2], + Exit = Caml[3], + Not_found = Caml[8], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int = Caml[19], + min_int = Caml[20], + lnot = Caml[21], + infinity = Caml[22], + neg_infinity = Caml[23], + nan = Caml[24], + max_float = Caml[25], + min_float = Caml[26], + epsilon_float = Caml[27], + symbol = Caml[28], + char_of_int = Caml[29], + string_of_bool = Caml[30], + bool_of_string_opt = Caml[31], + bool_of_string = Caml[32], + string_of_int = Caml[33], + int_of_string_opt = Caml[34], + string_of_float = Caml[35], + float_of_string_opt = Caml[36], + symbol$0 = Caml[37], + stdin = Caml[38], + stdout = Caml[39], + stderr = Caml[40], + print_char = Caml[41], + print_string = Caml[42], + print_bytes = Caml[43], + print_int = Caml[44], + print_float = Caml[45], + print_endline = Caml[46], + print_newline = Caml[47], + prerr_char = Caml[48], + prerr_string = Caml[49], + prerr_bytes = Caml[50], + prerr_int = Caml[51], + prerr_float = Caml[52], + prerr_endline = Caml[53], + prerr_newline = Caml[54], + read_line = Caml[55], + read_int_opt = Caml[56], + read_int = Caml[57], + read_float_opt = Caml[58], + read_float = Caml[59], + open_out = Caml[60], + open_out_bin = Caml[61], + open_out_gen = Caml[62], + flush = Caml[63], + flush_all = Caml[64], + output_char = Caml[65], + output_string = Caml[66], + output_bytes = Caml[67], + output = Caml[68], + output_substring = Caml[69], + output_byte = Caml[70], + output_binary_int = Caml[71], + output_value = Caml[72], + seek_out = Caml[73], + pos_out = Caml[74], + out_channel_length = Caml[75], + close_out = Caml[76], + close_out_noerr = Caml[77], + set_binary_mode_out = Caml[78], + open_in = Caml[79], + open_in_bin = Caml[80], + open_in_gen = Caml[81], + input_char = Caml[82], + input_line = Caml[83], + input = Caml[84], + really_input = Caml[85], + really_input_string = Caml[86], + input_byte = Caml[87], + input_binary_int = Caml[88], + input_value = Caml[89], + seek_in = Caml[90], + pos_in = Caml[91], + in_channel_length = Caml[92], + close_in = Caml[93], + close_in_noerr = Caml[94], + set_binary_mode_in = Caml[95], + string_of_format = Caml[97], + symbol$1 = Caml[98], + exit = Caml[99], + at_exit = Caml[100], + valid_float_lexem = Caml[101], + unsafe_really_input = Caml[102], + do_at_exit = Caml[103], + do_domain_local_at_exit = Caml[104], + Shadow_stdlib = + [0, + invalid_arg, + failwith, + Exit, + Not_found, + min, + max, + abs, + max_int, + min_int, + lnot, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + symbol, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + symbol$0, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol$1, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit]; + runtime.caml_register_global(1, Shadow_stdlib, "Shadow_stdlib"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/base/base.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_compare = runtime.caml_compare, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml; + function descending(x, y){return caml_compare(y, x);} + var + max = Caml[17], + min = Caml[16], + Base_Poly0 = [0, caml_compare, descending, min, max]; + runtime.caml_register_global(1, Base_Poly0, "Base__Poly0"); + return; + } + (globalThis)); + +//# 36 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_equal = runtime.caml_bytes_equal, + caml_bytes_greaterequal = runtime.caml_bytes_greaterequal, + caml_bytes_lessequal = runtime.caml_bytes_lessequal, + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int_compare = runtime.caml_int_compare, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_notequal = runtime.caml_notequal, + caml_string_equal = runtime.caml_string_equal, + caml_string_greaterequal = runtime.caml_string_greaterequal, + caml_string_lessequal = runtime.caml_string_lessequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Poly0 = global_data.Base__Poly0, + Stdlib_Uchar = global_data.Stdlib__Uchar, + Shadow_stdlib = global_data.Shadow_stdlib, + Caml = global_data.Caml, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + invalid_arg = Caml[1], + failwith = Caml[2], + Exit$0 = Caml[3], + Match_failure = Caml[4], + Assert_failure = Caml[5], + Invalid_argument = Caml[6], + Failure = Caml[7], + Out_of_memory = Caml[9], + Stack_overflow = Caml[10], + Sys_error = Caml[11], + End_of_file = Caml[12], + Division_by_zero = Caml[13], + Sys_blocked_io = Caml[14], + Undefined_recursive_module = Caml[15], + min = Caml[16], + max = Caml[17], + abs = Caml[18], + max_int$0 = Caml[19], + min_int$0 = Caml[20], + lnot = Caml[21], + infinity$0 = Caml[22], + neg_infinity$0 = Caml[23], + nan$0 = Caml[24], + max_float$0 = Caml[25], + min_float$0 = Caml[26], + epsilon_float$0 = Caml[27], + symbol$0 = Caml[28], + char_of_int$0 = Caml[29], + string_of_bool$0 = Caml[30], + bool_of_string_opt$0 = Caml[31], + bool_of_string$0 = Caml[32], + string_of_int$0 = Caml[33], + int_of_string_opt$0 = Caml[34], + string_of_float$0 = Caml[35], + float_of_string_opt$0 = Caml[36], + symbol$1 = Caml[37], + stdin$0 = Caml[38], + stdout$0 = Caml[39], + stderr$0 = Caml[40], + print_char$0 = Caml[41], + print_string$0 = Caml[42], + print_bytes$0 = Caml[43], + print_int$0 = Caml[44], + print_float$0 = Caml[45], + print_endline$0 = Caml[46], + print_newline$0 = Caml[47], + prerr_char$0 = Caml[48], + prerr_string$0 = Caml[49], + prerr_bytes$0 = Caml[50], + prerr_int$0 = Caml[51], + prerr_float$0 = Caml[52], + prerr_endline$0 = Caml[53], + prerr_newline$0 = Caml[54], + read_line$0 = Caml[55], + read_int_opt$0 = Caml[56], + read_int$0 = Caml[57], + read_float_opt$0 = Caml[58], + read_float$0 = Caml[59], + open_out$0 = Caml[60], + open_out_bin$0 = Caml[61], + open_out_gen$0 = Caml[62], + flush$0 = Caml[63], + flush_all$0 = Caml[64], + output_char$0 = Caml[65], + output_string$0 = Caml[66], + output_bytes$0 = Caml[67], + output$0 = Caml[68], + output_substring$0 = Caml[69], + output_byte$0 = Caml[70], + output_binary_int$0 = Caml[71], + output_value$0 = Caml[72], + seek_out$0 = Caml[73], + pos_out$0 = Caml[74], + out_channel_length$0 = Caml[75], + close_out$0 = Caml[76], + close_out_noerr$0 = Caml[77], + set_binary_mode_out$0 = Caml[78], + open_in$0 = Caml[79], + open_in_bin$0 = Caml[80], + open_in_gen$0 = Caml[81], + input_char$0 = Caml[82], + input_line$0 = Caml[83], + input$0 = Caml[84], + really_input$0 = Caml[85], + really_input_string$0 = Caml[86], + input_byte$0 = Caml[87], + input_binary_int$0 = Caml[88], + input_value$0 = Caml[89], + seek_in$0 = Caml[90], + pos_in$0 = Caml[91], + in_channel_length$0 = Caml[92], + close_in$0 = Caml[93], + close_in_noerr$0 = Caml[94], + set_binary_mode_in$0 = Caml[95], + LargeFile = Caml[96], + string_of_format$0 = Caml[97], + symbol$2 = Caml[98], + exit$0 = Caml[99], + at_exit$0 = Caml[100], + valid_float_lexem$0 = Caml[101], + unsafe_really_input$0 = Caml[102], + do_at_exit$0 = Caml[103], + do_domain_local_at_exit$0 = Caml[104], + Not_found$0 = Caml[8], + Caml$0 = + [0, + invalid_arg, + failwith, + Exit$0, + Match_failure, + Assert_failure, + Invalid_argument, + Failure, + Out_of_memory, + Stack_overflow, + Sys_error, + End_of_file, + Division_by_zero, + Sys_blocked_io, + Undefined_recursive_module, + min, + max, + abs, + max_int$0, + min_int$0, + lnot, + infinity$0, + neg_infinity$0, + nan$0, + max_float$0, + min_float$0, + epsilon_float$0, + symbol$0, + char_of_int$0, + string_of_bool$0, + bool_of_string_opt$0, + bool_of_string$0, + string_of_int$0, + int_of_string_opt$0, + string_of_float$0, + float_of_string_opt$0, + symbol$1, + stdin$0, + stdout$0, + stderr$0, + print_char$0, + print_string$0, + print_bytes$0, + print_int$0, + print_float$0, + print_endline$0, + print_newline$0, + prerr_char$0, + prerr_string$0, + prerr_bytes$0, + prerr_int$0, + prerr_float$0, + prerr_endline$0, + prerr_newline$0, + read_line$0, + read_int_opt$0, + read_int$0, + read_float_opt$0, + read_float$0, + open_out$0, + open_out_bin$0, + open_out_gen$0, + flush$0, + flush_all$0, + output_char$0, + output_string$0, + output_bytes$0, + output$0, + output_substring$0, + output_byte$0, + output_binary_int$0, + output_value$0, + seek_out$0, + pos_out$0, + out_channel_length$0, + close_out$0, + close_out_noerr$0, + set_binary_mode_out$0, + open_in$0, + open_in_bin$0, + open_in_gen$0, + input_char$0, + input_line$0, + input$0, + really_input$0, + really_input_string$0, + input_byte$0, + input_binary_int$0, + input_value$0, + seek_in$0, + pos_in$0, + in_channel_length$0, + close_in$0, + close_in_noerr$0, + set_binary_mode_in$0, + LargeFile, + string_of_format$0, + symbol$2, + exit$0, + at_exit$0, + valid_float_lexem$0, + unsafe_really_input$0, + do_at_exit$0, + do_domain_local_at_exit$0, + Not_found$0]; + function bool_to_int(x){return x;} + function symbol$3(_V_, _U_){return _V_ !== _U_ ? 1 : 0;} + var symbol$4 = runtime.caml_mul; + function symbol$5(_T_, _S_){return Math.pow(_T_, _S_);} + function symbol$6(_R_, _Q_){return _R_ * _Q_;} + function symbol$7(_P_, _O_){return _P_ + _O_ | 0;} + function symbol$8(_N_, _M_){return _N_ + _M_;} + function symbol$9(_L_, _K_){return _L_ - _K_ | 0;} + function symbol$10(_J_, _I_){return _J_ - _I_;} + var symbol$11 = runtime.caml_div; + function symbol$12(_H_, _G_){return _H_ / _G_;} + var ascending = caml_int_compare; + function descending(x, y){return caml_int_compare(y, x);} + function max$0(x, y){return y <= x ? x : y;} + function min$0(x, y){return x <= y ? x : y;} + var + Int_replace_polymorphic_compar = [0, ascending, descending, max$0, min$0], + ascending$0 = Int_replace_polymorphic_compar[1], + descending$0 = Int_replace_polymorphic_compar[2], + max$1 = Int_replace_polymorphic_compar[3], + min$1 = Int_replace_polymorphic_compar[4], + symbol$13 = caml_lessthan, + symbol$14 = caml_lessequal, + symbol$15 = caml_notequal, + symbol$16 = caml_equal, + symbol$17 = caml_greaterthan, + symbol$18 = caml_greaterequal; + function ascending$1(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$1(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare = caml_int_compare, equal = caml_equal; + function max$2(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$2(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int32_replace_polymorphic_comp = + [0, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + ascending$1, + descending$1, + compare, + equal, + max$2, + min$2]; + function ascending$2(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$2(x, y){return caml_call2(Base_Poly0[2], x, y);} + function max$3(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$3(x, y){return caml_lessequal(x, y) ? x : y;} + var + Int64_replace_polymorphic_comp = + [0, ascending$2, descending$2, max$3, min$3], + symbol$19 = caml_lessthan, + symbol$20 = caml_lessequal, + symbol$21 = caml_notequal, + symbol$22 = caml_equal, + symbol$23 = caml_greaterthan, + symbol$24 = caml_greaterequal; + function ascending$3(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$3(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare, equal$0 = caml_equal; + function max$4(x, y){return caml_greaterequal(x, y) ? x : y;} + function min$4(x, y){return caml_lessequal(x, y) ? x : y;} + var + Nativeint_replace_polymorphic_ = + [0, + symbol$19, + symbol$20, + symbol$21, + symbol$22, + symbol$23, + symbol$24, + ascending$3, + descending$3, + compare$0, + equal$0, + max$4, + min$4]; + function symbol$25(x, y){return x < y ? 1 : 0;} + function symbol$26(x, y){return x <= y ? 1 : 0;} + function symbol$27(x, y){return x !== y ? 1 : 0;} + function symbol$28(x, y){return x === y ? 1 : 0;} + function symbol$29(x, y){return y < x ? 1 : 0;} + function symbol$30(x, y){return y <= x ? 1 : 0;} + function ascending$4(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$4(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$1 = caml_int_compare; + function equal$1(x, y){return x === y ? 1 : 0;} + function max$5(x, y){return y <= x ? x : y;} + function min$5(x, y){return x <= y ? x : y;} + var + Bool_replace_polymorphic_compa = + [0, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + ascending$4, + descending$4, + compare$1, + equal$1, + max$5, + min$5]; + function symbol$31(x, y){return x < y ? 1 : 0;} + function symbol$32(x, y){return x <= y ? 1 : 0;} + function symbol$33(x, y){return x !== y ? 1 : 0;} + function symbol$34(x, y){return x === y ? 1 : 0;} + function symbol$35(x, y){return y < x ? 1 : 0;} + function symbol$36(x, y){return y <= x ? 1 : 0;} + function ascending$5(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$5(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$2 = caml_int_compare; + function equal$2(x, y){return x === y ? 1 : 0;} + function max$6(x, y){return y <= x ? x : y;} + function min$6(x, y){return x <= y ? x : y;} + var + Char_replace_polymorphic_compa = + [0, + symbol$31, + symbol$32, + symbol$33, + symbol$34, + symbol$35, + symbol$36, + ascending$5, + descending$5, + compare$2, + equal$2, + max$6, + min$6]; + function i(x){return caml_call1(Stdlib_Uchar[10], x);} + function symbol$37(x, y){var _F_ = i(y); return i(x) < _F_ ? 1 : 0;} + function symbol$38(x, y){var _E_ = i(y); return i(x) <= _E_ ? 1 : 0;} + function symbol$39(x, y){var _D_ = i(y); return i(x) !== _D_ ? 1 : 0;} + function symbol$40(x, y){var _C_ = i(y); return i(x) === _C_ ? 1 : 0;} + function symbol$41(x, y){var _B_ = i(y); return _B_ < i(x) ? 1 : 0;} + function symbol$42(x, y){var _A_ = i(y); return _A_ <= i(x) ? 1 : 0;} + function ascending$6(x, y){ + var _y_ = i(y), _z_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[1], _z_, _y_); + } + function descending$6(x, y){ + var _w_ = i(y), _x_ = i(x); + return caml_call2(Int_replace_polymorphic_compar[2], _x_, _w_); + } + function compare$3(x, y){ + var _v_ = i(y); + return caml_int_compare(i(x), _v_); + } + function equal$3(x, y){var _u_ = i(y); return i(x) === _u_ ? 1 : 0;} + function max$7(x, y){return symbol$42(x, y) ? x : y;} + function min$7(x, y){return symbol$38(x, y) ? x : y;} + var + Uchar_replace_polymorphic_comp = + [0, + i, + symbol$37, + symbol$38, + symbol$39, + symbol$40, + symbol$41, + symbol$42, + ascending$6, + descending$6, + compare$3, + equal$3, + max$7, + min$7]; + function symbol$43(x, y){return x < y ? 1 : 0;} + function symbol$44(x, y){return x <= y ? 1 : 0;} + function symbol$45(x, y){return x != y ? 1 : 0;} + function symbol$46(x, y){return x == y ? 1 : 0;} + function symbol$47(x, y){return y < x ? 1 : 0;} + function symbol$48(x, y){return y <= x ? 1 : 0;} + function ascending$7(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$7(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$4 = runtime.caml_float_compare; + function equal$4(x, y){return x == y ? 1 : 0;} + function max$8(x, y){return y <= x ? x : y;} + function min$8(x, y){return x <= y ? x : y;} + var + Float_replace_polymorphic_comp = + [0, + symbol$43, + symbol$44, + symbol$45, + symbol$46, + symbol$47, + symbol$48, + ascending$7, + descending$7, + compare$4, + equal$4, + max$8, + min$8], + symbol$49 = runtime.caml_string_lessthan, + symbol$50 = caml_string_lessequal, + symbol$51 = runtime.caml_string_notequal, + symbol$52 = caml_string_equal, + symbol$53 = runtime.caml_string_greaterthan, + symbol$54 = caml_string_greaterequal; + function ascending$8(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$8(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$5 = runtime.caml_string_compare, equal$5 = caml_string_equal; + function max$9(x, y){return caml_string_greaterequal(x, y) ? x : y;} + function min$9(x, y){return caml_string_lessequal(x, y) ? x : y;} + var + String_replace_polymorphic_com = + [0, + symbol$49, + symbol$50, + symbol$51, + symbol$52, + symbol$53, + symbol$54, + ascending$8, + descending$8, + compare$5, + equal$5, + max$9, + min$9], + symbol$55 = runtime.caml_bytes_lessthan, + symbol$56 = caml_bytes_lessequal, + symbol$57 = runtime.caml_bytes_notequal, + symbol$58 = caml_bytes_equal, + symbol$59 = runtime.caml_bytes_greaterthan, + symbol$60 = caml_bytes_greaterequal; + function ascending$9(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending$9(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$6 = runtime.caml_bytes_compare, equal$6 = caml_bytes_equal; + function max$10(x, y){return caml_bytes_greaterequal(x, y) ? x : y;} + function min$10(x, y){return caml_bytes_lessequal(x, y) ? x : y;} + var + Bytes_replace_polymorphic_comp = + [0, + symbol$55, + symbol$56, + symbol$57, + symbol$58, + symbol$59, + symbol$60, + ascending$9, + descending$9, + compare$6, + equal$6, + max$10, + min$10], + symbol$61 = Caml$0[36], + symbol$62 = Caml$0[27]; + function symbol$63(_t_){return - _t_ | 0;} + function symbol$64(_s_){return - _s_;} + function asr(_r_, _q_){return _r_ >> _q_;} + function land(_p_, _o_){return _p_ & _o_;} + var lnot$0 = Caml$0[20]; + function lor(_n_, _m_){return _n_ | _m_;} + function lsl(_l_, _k_){return _l_ << _k_;} + function lsr(_j_, _i_){return _j_ >>> _i_ | 0;} + function lxor(_h_, _g_){return _h_ ^ _g_;} + var mod = runtime.caml_mod, abs$0 = Caml$0[17], failwith$0 = Caml$0[2]; + function fst(_f_){return _f_[1];} + var invalid_arg$0 = Caml$0[1]; + function snd(_e_){return _e_[2];} + function phys_equal(_d_, _c_){return _d_ === _c_ ? 1 : 0;} + function decr(_b_){_b_[1] += -1; return 0;} + function incr(_a_){_a_[1]++; return 0;} + var + float_of_string = runtime.caml_float_of_string, + am_testing = runtime.Base_am_testing(0), + Base_Import0 = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml$0, + bool_to_int, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + Int_replace_polymorphic_compar, + ascending$0, + descending$0, + max$1, + min$1, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$61, + symbol$62, + symbol$63, + symbol$64, + asr, + land, + lnot$0, + lor, + lsl, + lsr, + lxor, + mod, + abs$0, + failwith$0, + fst, + invalid_arg$0, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing]; + runtime.caml_register_global(4, Base_Import0, "Base__Import0"); + return; + } + (globalThis)); + +//# 777 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Stdlib_Printf = global_data.Stdlib__Printf, + sprintf = Stdlib_Printf[4], + bprintf = Stdlib_Printf[5], + ifprintf = Stdlib_Printf[6], + ksprintf = Stdlib_Printf[10], + kbprintf = Stdlib_Printf[11]; + function failwithf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[124], s);}, + fmt); + } + function invalid_argf(fmt){ + return caml_call2 + (ksprintf, + function(s, param){return caml_call1(Base_Import0[126], s);}, + fmt); + } + var + Base_Printf = + [0, + ifprintf, + sprintf, + bprintf, + ksprintf, + kbprintf, + failwithf, + invalid_argf]; + runtime.caml_register_global(2, Base_Printf, "Base__Printf"); + return; + } + (globalThis)); + +//# 829 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + Stdlib_Sys = global_data.Stdlib__Sys, + backend_type = Stdlib_Sys[5], + interactive = Stdlib_Sys[3], + os_type = Stdlib_Sys[4], + unix = Stdlib_Sys[6], + win32 = Stdlib_Sys[7], + cygwin = Stdlib_Sys[8], + word_size_in_bits = Stdlib_Sys[9], + int_size_in_bits = Stdlib_Sys[10], + big_endian = Stdlib_Sys[11], + max_string_length = Stdlib_Sys[12], + max_array_length = Stdlib_Sys[13], + runtime_variant = runtime.caml_runtime_variant, + runtime_parameters = runtime.caml_runtime_parameters, + argv = caml_sys_argv(0), + _a_ = + [0, + [11, + "Sys.getenv_exn: environment variable ", + [2, 0, [11, " is not set", 0]]], + "Sys.getenv_exn: environment variable %s is not set"]; + function get_argv(param){return caml_sys_argv(0);} + var + ocaml_version = Stdlib_Sys[46], + enable_runtime_warnings = Stdlib_Sys[49], + runtime_warnings_enabled = Stdlib_Sys[50]; + function getenv_exn(var$0){ + try{var _e_ = caml_sys_getenv(var$0); return _e_;} + catch(_f_){ + var _d_ = caml_wrap_exception(_f_); + if(_d_ === Base_Import0[85][104]) + return caml_call3(Base_Printf[6], _a_, var$0, 0); + throw caml_maybe_attach_backtrace(_d_, 0); + } + } + function getenv(var$0){ + try{var x = caml_sys_getenv(var$0);} + catch(_c_){ + var _b_ = caml_wrap_exception(_c_); + if(_b_ === Base_Import0[85][104]) return 0; + throw caml_maybe_attach_backtrace(_b_, 0); + } + return [0, x]; + } + var + Break = Stdlib_Sys[44], + Base_Sys0 = + [0, + backend_type, + interactive, + os_type, + unix, + win32, + cygwin, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + argv, + get_argv, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv_exn, + getenv, + Break]; + runtime.caml_register_global(4, Base_Sys0, "Base__Sys0"); + return; + } + (globalThis)); + +//# 923 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_check_bound = runtime.caml_check_bound; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ArrayLabels = global_data.Stdlib__ArrayLabels; + global_data.Stdlib; + var + Base_Printf = global_data.Base__Printf, + Base_Sys0 = global_data.Base__Sys0, + invalid_argf = Base_Printf[7], + Array = [0], + max_length = Base_Sys0[11]; + function create(len, x){return runtime.caml_make_vect(len, x);} + function create_float_uninitialized(len){ + return runtime.caml_make_float_vect(len); + } + var + append = Stdlib_ArrayLabels[3], + blit = Stdlib_ArrayLabels[8], + concat = Stdlib_ArrayLabels[4], + copy = Stdlib_ArrayLabels[6], + fill = Stdlib_ArrayLabels[7], + init = Stdlib_ArrayLabels[1], + make_matrix = Stdlib_ArrayLabels[2], + of_list = Stdlib_ArrayLabels[10], + sub = Stdlib_ArrayLabels[5], + to_list = Stdlib_ArrayLabels[9]; + function fold(t, init, f){ + return caml_call3(Stdlib_ArrayLabels[15], f, init, t); + } + function fold_right(t, f, init){ + return caml_call3(Stdlib_ArrayLabels[17], f, t, init); + } + function iter(t, f){return caml_call2(Stdlib_ArrayLabels[11], f, t);} + function iteri(t, f){return caml_call2(Stdlib_ArrayLabels[12], f, t);} + function map(t, f){return caml_call2(Stdlib_ArrayLabels[13], f, t);} + function mapi(t, f){return caml_call2(Stdlib_ArrayLabels[14], f, t);} + function stable_sort(t, compare){ + return caml_call2(Stdlib_ArrayLabels[31], compare, t); + } + function swap(t, i, j){ + var + elt_i = caml_check_bound(t, i)[1 + i], + elt_j = caml_check_bound(t, j)[1 + j]; + t[1 + i] = elt_j; + t[1 + j] = elt_i; + return 0; + } + var + Base_Array0 = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap]; + runtime.caml_register_global(6, Base_Array0, "Base__Array0"); + return; + } + (globalThis)); + +//# 1018 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Printf = global_data.Base__Printf, + Stdlib_Char = global_data.Stdlib__Char, + failwithf = Base_Printf[6], + escaped = Stdlib_Char[2], + lowercase = Stdlib_Char[3], + _a_ = + [0, + [11, "Char.of_int_exn got integer out of range: ", [4, 0, 0, 0, 0]], + "Char.of_int_exn got integer out of range: %d"]; + function to_int(_e_){return _e_;} + function unsafe_of_int(_d_){return _d_;} + var uppercase = Stdlib_Char[4]; + function int_is_ok(i){ + var _b_ = 0 <= i ? 1 : 0, _c_ = _b_ ? i <= 255 ? 1 : 0 : _b_; + return _c_; + } + var min_value = 0, max_value = 255; + function of_int(i){return int_is_ok(i) ? [0, i] : 0;} + function of_int_exn(i){ + return int_is_ok(i) ? i : caml_call3(failwithf, _a_, i, 0); + } + function equal(t1, t2){return t1 === t2 ? 1 : 0;} + var + Base_Char0 = + [0, + failwithf, + escaped, + lowercase, + to_int, + unsafe_of_int, + uppercase, + int_is_ok, + min_value, + max_value, + of_int, + of_int_exn, + equal]; + runtime.caml_register_global(3, Base_Char0, "Base__Char0"); + return; + } + (globalThis)); + +//# 1072 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Hash_intf = [0]; + runtime.caml_register_global(0, Base_Hash_intf, "Base__Hash_intf"); + return; + } + (globalThis)); + +//# 1082 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Caml = global_data.Caml, + to_string = Caml[33], + of_string = runtime.caml_int_of_string; + function to_float(_c_){return _c_;} + function of_float(_b_){return _b_ | 0;} + var max_value = Caml[19], min_value = Caml[20]; + function succ(_a_){return _a_ + 1 | 0;} + var + Base_Int0 = + [0, + to_string, + of_string, + to_float, + of_float, + max_value, + min_value, + succ]; + runtime.caml_register_global(1, Base_Int0, "Base__Int0"); + return; + } + (globalThis)); + +//# 1112 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_ListLabels = global_data.Stdlib__ListLabels, + hd_exn = Stdlib_ListLabels[5], + length = Stdlib_ListLabels[1], + rev_append = Stdlib_ListLabels[12], + tl_exn = Stdlib_ListLabels[6], + unzip = Stdlib_ListLabels[54]; + function exists(t, f){return caml_call2(Stdlib_ListLabels[33], f, t);} + function exists2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[35], f, l1, l2); + } + function fold(t, init, f){ + return caml_call3(Stdlib_ListLabels[25], f, init, t); + } + function fold2_ok(l1, l2, init, f){ + return caml_call4(Stdlib_ListLabels[30], f, init, l1, l2); + } + function for_all(t, f){return caml_call2(Stdlib_ListLabels[32], f, t);} + function for_all2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[34], f, l1, l2); + } + function iter(t, f){return caml_call2(Stdlib_ListLabels[17], f, t);} + function iter2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[27], f, l1, l2); + } + function nontail_map(t, f){return caml_call2(Stdlib_ListLabels[19], f, t);} + function nontail_mapi(t, f){ + return caml_call2(Stdlib_ListLabels[20], f, t); + } + function partition(t, f){return caml_call2(Stdlib_ListLabels[44], f, t);} + function rev_map(t, f){return caml_call2(Stdlib_ListLabels[21], f, t);} + function rev_map2_ok(l1, l2, f){ + return caml_call3(Stdlib_ListLabels[29], f, l1, l2); + } + function sort(l, compare){ + return caml_call2(Stdlib_ListLabels[56], compare, l); + } + function stable_sort(l, compare){ + return caml_call2(Stdlib_ListLabels[57], compare, l); + } + function rev(res){ + if(res){ + var match = res[2]; + if(match){ + var rest = match[2], y = match[1], x = res[1]; + return caml_call2(rev_append, rest, [0, y, [0, x, 0]]); + } + } + return res; + } + function fold_right(l, f, init){ + if(! l) return init; + function _a_(a, b){return caml_call2(f, b, a);} + return fold(rev(l), init, _a_); + } + var + Base_List0 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right]; + runtime.caml_register_global(1, Base_List0, "Base__List0"); + return; + } + (globalThis)); + +//# 1219 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + description = "internalhash", + Base_Import0 = global_data.Base__Import0, + Base_Int0 = global_data.Base__Int0, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_List0 = global_data.Base__List0, + Base_Char0 = global_data.Base__Char0; + function Folding(Hash){ + function hash_fold_unit(s, param){return s;} + var + hash_fold_int = Hash[2], + hash_fold_int64 = Hash[3], + hash_fold_float = Hash[4], + hash_fold_string = Hash[5]; + function as_int(f, s, x){ + return caml_call2(hash_fold_int, s, caml_call1(f, x)); + } + function _Q_(_ar_){return _ar_;} + function hash_fold_int32(_ap_, _aq_){return as_int(_Q_, _ap_, _aq_);} + var _R_ = Base_Char0[4]; + function hash_fold_char(_an_, _ao_){return as_int(_R_, _an_, _ao_);} + function _S_(param){return param ? 1 : 0;} + function hash_fold_bool(_al_, _am_){return as_int(_S_, _al_, _am_);} + function hash_fold_nativeint(s, x){ + return caml_call2(hash_fold_int64, s, runtime.caml_int64_of_int32(x)); + } + function hash_fold_option(hash_fold_elem, s, param){ + if(! param) return caml_call2(hash_fold_int, s, 0); + var x = param[1]; + return caml_call2(hash_fold_elem, caml_call2(hash_fold_int, s, 1), x); + } + function hash_fold_list(hash_fold_elem, s$1, list$1){ + var + s$2 = caml_call2(hash_fold_int, s$1, caml_call1(Base_List0[2], list$1)), + s = s$2, + list = list$1; + for(;;){ + if(! list) return s; + var + list$0 = list[2], + x = list[1], + s$0 = caml_call2(hash_fold_elem, s, x), + s = s$0, + list = list$0; + } + } + function hash_fold_lazy_t(hash_fold_elem, s, x){ + var _aj_ = runtime.caml_obj_tag(x); + if(250 === _aj_) + var _ak_ = x[1]; + else{ + var switch$0 = 0; + if(246 !== _aj_ && 244 !== _aj_){var _ak_ = x; switch$0 = 1;} + if(! switch$0) var _ak_ = caml_call1(CamlinternalLazy[2], x); + } + return caml_call2(hash_fold_elem, s, _ak_); + } + function hash_fold_ref_frozen(hash_fold_elem, s, x){return caml_call2(hash_fold_elem, s, x[1]); + } + function hash_fold_array_frozen(hash_fold_elem, s$1, array){ + var + s$2 = caml_call2(hash_fold_int, s$1, array.length - 1), + s = s$2, + i = 0; + for(;;){ + if(i === array.length - 1) return s; + var + e = array[1 + i], + i$0 = caml_call2(Base_Import0[91], i, 1), + s$0 = caml_call2(hash_fold_elem, s, e), + s = s$0, + i = i$0; + } + } + function hash_nativeint(x){ + var + _ah_ = caml_call1(Hash[6], 0), + _ai_ = hash_fold_nativeint(caml_call2(Hash[7], 0, _ah_), x); + return caml_call1(Hash[8], _ai_); + } + function hash_int64(x){ + var + _af_ = caml_call1(Hash[6], 0), + _ag_ = caml_call2(hash_fold_int64, caml_call2(Hash[7], 0, _af_), x); + return caml_call1(Hash[8], _ag_); + } + function hash_int32(x){ + var + _ad_ = caml_call1(Hash[6], 0), + _ae_ = hash_fold_int32(caml_call2(Hash[7], 0, _ad_), x); + return caml_call1(Hash[8], _ae_); + } + function hash_char(x){ + var + _ab_ = caml_call1(Hash[6], 0), + _ac_ = hash_fold_char(caml_call2(Hash[7], 0, _ab_), x); + return caml_call1(Hash[8], _ac_); + } + function hash_int(x){ + var + _$_ = caml_call1(Hash[6], 0), + _aa_ = caml_call2(hash_fold_int, caml_call2(Hash[7], 0, _$_), x); + return caml_call1(Hash[8], _aa_); + } + function hash_bool(x){ + var + _Z_ = caml_call1(Hash[6], 0), + ___ = hash_fold_bool(caml_call2(Hash[7], 0, _Z_), x); + return caml_call1(Hash[8], ___); + } + function hash_string(x){ + var + _X_ = caml_call1(Hash[6], 0), + _Y_ = caml_call2(hash_fold_string, caml_call2(Hash[7], 0, _X_), x); + return caml_call1(Hash[8], _Y_); + } + function hash_float(x){ + var + _V_ = caml_call1(Hash[6], 0), + _W_ = caml_call2(hash_fold_float, caml_call2(Hash[7], 0, _V_), x); + return caml_call1(Hash[8], _W_); + } + function hash_unit(x){ + var _T_ = caml_call1(Hash[6], 0), _U_ = caml_call2(Hash[7], 0, _T_); + return caml_call1(Hash[8], _U_); + } + return [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit]; + } + function F(Hash){ + var + description = Hash[1], + fold_int = Hash[2], + fold_int64 = Hash[3], + fold_float = Hash[4], + fold_string = Hash[5], + alloc = Hash[6], + reset = Hash[7], + get_hash_value = Hash[8], + For_tests = Hash[9]; + function create(seed, param){ + return caml_call2(reset, seed, caml_call1(alloc, 0)); + } + function of_fold(hash_fold_t, t){ + return caml_call1 + (get_hash_value, caml_call2(hash_fold_t, create(0, 0), t)); + } + var Builtin = Folding(Hash); + function run(seed, folder, x){ + var + _O_ = caml_call1(Hash[6], 0), + _P_ = caml_call2(folder, caml_call2(Hash[7], seed, _O_), x); + return caml_call1(Hash[8], _P_); + } + return [0, + description, + fold_int, + fold_int64, + fold_float, + fold_string, + alloc, + reset, + get_hash_value, + For_tests, + create, + of_fold, + Builtin, + run]; + } + function alloc(param){return 0;} + function reset(opt, t){ + if(opt) var sth = opt[1], seed = sth; else var seed = 0; + return seed; + } + var compare_state = runtime.caml_int_compare; + function state_to_string(state){return caml_call1(Base_Int0[1], state);} + var For_tests = [0, compare_state, state_to_string]; + function create(seed, param){return reset(seed, 0);} + function run(seed, folder, x){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(folder, reset(seed, 0), x)); + } + function of_fold(hash_fold_t, t){ + return runtime.Base_internalhash_get_hash_value + (caml_call2(hash_fold_t, create(0, 0), t)); + } + function _a_(_N_){return runtime.Base_internalhash_get_hash_value(_N_);} + function _b_(_M_, _L_){ + return runtime.Base_internalhash_fold_string(_M_, _L_); + } + function _c_(_K_, _J_){ + return runtime.Base_internalhash_fold_float(_K_, _J_); + } + function _d_(_I_, _H_){ + return runtime.Base_internalhash_fold_int64(_I_, _H_); + } + var + Folding$0 = + Folding + ([0, + description, + function(_G_, _F_){ + return runtime.Base_internalhash_fold_int(_G_, _F_); + }, + _d_, + _c_, + _b_, + alloc, + reset, + _a_, + For_tests]), + hash_fold_nativeint = Folding$0[1], + hash_fold_int64 = Folding$0[2], + hash_fold_int32 = Folding$0[3], + hash_fold_char = Folding$0[4], + hash_fold_int = Folding$0[5], + hash_fold_bool = Folding$0[6], + hash_fold_string = Folding$0[7], + hash_fold_float = Folding$0[8], + hash_fold_unit = Folding$0[9], + hash_fold_option = Folding$0[10], + hash_fold_list = Folding$0[11], + hash_fold_lazy_t = Folding$0[12], + hash_fold_ref_frozen = Folding$0[13], + hash_fold_array_frozen = Folding$0[14], + hash_nativeint = Folding$0[15], + hash_int64 = Folding$0[16], + hash_int32 = Folding$0[17], + hash_string = Folding$0[21], + hash_char = Base_Char0[4]; + function hash_int(t){ + var + _t_ = caml_call2(Base_Import0[119], t, 21), + _u_ = caml_call1(Base_Import0[117], t), + t$0 = caml_call2(Base_Import0[91], _u_, _t_), + _v_ = caml_call2(Base_Import0[120], t$0, 24), + t$1 = caml_call2(Base_Import0[121], t$0, _v_), + _w_ = caml_call2(Base_Import0[119], t$1, 8), + _x_ = caml_call2(Base_Import0[119], t$1, 3), + _y_ = caml_call2(Base_Import0[91], t$1, _x_), + t$2 = caml_call2(Base_Import0[91], _y_, _w_), + _z_ = caml_call2(Base_Import0[120], t$2, 14), + t$3 = caml_call2(Base_Import0[121], t$2, _z_), + _A_ = caml_call2(Base_Import0[119], t$3, 4), + _B_ = caml_call2(Base_Import0[119], t$3, 2), + _C_ = caml_call2(Base_Import0[91], t$3, _B_), + t$4 = caml_call2(Base_Import0[91], _C_, _A_), + _D_ = caml_call2(Base_Import0[120], t$4, 28), + t$5 = caml_call2(Base_Import0[121], t$4, _D_), + _E_ = caml_call2(Base_Import0[119], t$5, 31); + return caml_call2(Base_Import0[91], t$5, _E_); + } + function hash_bool(x){return x ? 1 : 0;} + function hash_unit(param){return 0;} + var + _e_ = + [0, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + function(_s_){return runtime.Base_hash_double(_s_);}, + hash_unit]; + function _f_(_r_){return runtime.Base_internalhash_get_hash_value(_r_);} + function _g_(_q_, _p_){ + return runtime.Base_internalhash_fold_string(_q_, _p_); + } + function _h_(_o_, _n_){ + return runtime.Base_internalhash_fold_float(_o_, _n_); + } + function _i_(_m_, _l_){ + return runtime.Base_internalhash_fold_int64(_m_, _l_); + } + var + Base_Hash = + [0, + F, + description, + function(_k_, _j_){ + return runtime.Base_internalhash_fold_int(_k_, _j_); + }, + _i_, + _h_, + _g_, + alloc, + reset, + _f_, + For_tests, + create, + of_fold, + _e_, + run]; + runtime.caml_register_global(6, Base_Hash, "Base__Hash"); + return; + } + (globalThis)); + +//# 1572 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_which_is_abstract_in_an_im = + ", which is abstract in an implementation.", + caml_equal = runtime.caml_equal, + caml_float_compare = runtime.caml_float_compare, + caml_int_compare = runtime.caml_int_compare; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Base_Printf = global_data.Base__Printf, + phys_equal = Base_Import0[128], + _b_ = + [0, + [11, + "Equal called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Equal called on the type %s, which is abstract in an implementation."], + _a_ = + [0, + [11, + "Compare called on the type ", + [2, 0, [11, cst_which_is_abstract_in_an_im, 0]]], + "Compare called on the type %s, which is abstract in an implementation."]; + function compare_abstract(type_name, param, _u_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _a_, type_name); + } + function equal_abstract(type_name, param, _t_){ + return caml_call3(Base_Printf[4], Base_Import0[124], _b_, type_name); + } + var + Comparable = [0], + Equal = [0], + compare_bool = caml_int_compare, + compare_char = caml_int_compare, + compare_float = caml_float_compare, + compare_int = caml_int_compare, + compare_int32 = caml_int_compare; + function compare_int64(_s_, _r_){ + return runtime.caml_int64_compare(_s_, _r_); + } + var + compare_nativeint = caml_int_compare, + compare_string = runtime.caml_string_compare, + compare_unit = caml_int_compare; + function compare_array(compare_elt, a, b){ + if(caml_call2(phys_equal, a, b)) return 0; + var + len_a = a.length - 1, + len_b = b.length - 1, + ret = caml_int_compare(len_a, len_b); + if(0 !== ret) return ret; + var i = 0; + for(;;){ + if(i === len_a) return 0; + var l = a[1 + i], r = b[1 + i], res = caml_call2(compare_elt, l, r); + if(0 !== res) return res; + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + } + } + function compare_list(compare_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + res = caml_call2(compare_elt, x, y); + if(0 !== res) return res; + var a$0 = xs, b$0 = ys; + } + } + function compare_option(compare_elt, a, b){ + if(! a) return b ? -1 : 0; + var a$0 = a[1]; + if(! b) return 1; + var b$0 = b[1]; + return caml_call2(compare_elt, a$0, b$0); + } + function compare_ref(compare_elt, a, b){ + return caml_call2(compare_elt, a[1], b[1]); + } + function equal_bool(_q_, _p_){return _q_ === _p_ ? 1 : 0;} + function equal_char(_o_, _n_){return _o_ === _n_ ? 1 : 0;} + function equal_int(_m_, _l_){return _m_ === _l_ ? 1 : 0;} + var + equal_int32 = caml_equal, + equal_int64 = caml_equal, + equal_nativeint = caml_equal, + equal_string = runtime.caml_string_equal; + function equal_unit(_k_, _j_){return _k_ === _j_ ? 1 : 0;} + function equal_float(x, y){return caml_float_compare(x, y) === 0 ? 1 : 0;} + function equal_array(equal_elt, a, b){ + var _d_ = caml_call2(phys_equal, a, b); + if(_d_) + var _e_ = _d_; + else{ + var + len_a = a.length - 1, + len_b = b.length - 1, + _f_ = len_a === len_b ? 1 : 0; + if(_f_){ + var i = 0; + for(;;){ + var _g_ = i === len_a ? 1 : 0; + if(_g_) + var _h_ = _g_; + else{ + var l = a[1 + i], r = b[1 + i], _i_ = caml_call2(equal_elt, l, r); + if(_i_){ + var i$0 = caml_call2(Base_Import0[91], i, 1), i = i$0; + continue; + } + var _h_ = _i_; + } + return _h_; + } + } + var _e_ = _f_; + } + return _e_; + } + function equal_list(equal_elt, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(a$0){ + if(b$0){ + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + _c_ = caml_call2(equal_elt, x, y); + if(! _c_) return _c_; + var a$0 = xs, b$0 = ys; + continue; + } + } + else if(! b$0) return 1; + return 0; + } + } + function equal_option(equal_elt, a, b){ + if(a){ + if(b){ + var b$0 = b[1], a$0 = a[1]; + return caml_call2(equal_elt, a$0, b$0); + } + } + else if(! b) return 1; + return 0; + } + function equal_ref(equal_elt, a, b){ + return caml_call2(equal_elt, a[1], b[1]); + } + var + Base_Ppx_compare_lib = + [0, + phys_equal, + compare_abstract, + equal_abstract, + Comparable, + Equal, + [0, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref]]; + runtime.caml_register_global + (4, Base_Ppx_compare_lib, "Base__Ppx_compare_lib"); + return; + } + (globalThis)); + +//# 1799 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_update_dummy = runtime.caml_update_dummy; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp = global_data.Sexplib0__Sexp, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + t_of_sexp = Sexplib0_Sexp[1], + sexp_of_t = Sexplib0_Sexp[2], + equal = Sexplib0_Sexp[3], + Not_found_s = Sexplib0_Sexp[5], + Of_sexp_error = Sexplib0_Sexp[6], + message = Sexplib0_Sexp[7], + default_indent = Sexplib0_Sexp[8], + pp_hum = Sexplib0_Sexp[9], + pp_hum_indent = Sexplib0_Sexp[10], + pp_mach = Sexplib0_Sexp[11], + pp = Sexplib0_Sexp[12], + to_string_hum = Sexplib0_Sexp[13], + to_string_mach = Sexplib0_Sexp[14], + to_string = Sexplib0_Sexp[15], + of_float_style = Sexplib0_Sexp[16], + of_int_style = Sexplib0_Sexp[17], + Private = Sexplib0_Sexp[18]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + if(0 === a_001[0]){ + var a_003 = a_001[1]; + if(0 !== b_002[0]) return -1; + var b_004 = b_002[1]; + return caml_call2(Base_Ppx_compare_lib[6][8], a_003, b_004); + } + var a_005 = a_001[1]; + if(0 === b_002[0]) return 1; + var b_006 = b_002[1]; + return caml_call3(Base_Ppx_compare_lib[6][11], compare, a_005, b_006); + } + var + hash_fold_t = function _f_(_d_, _e_){return _f_.fun(_d_, _e_);}, + hash = function _c_(_b_){return _c_.fun(_b_);}; + caml_update_dummy + (hash_fold_t, + function(hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(Base_Hash[13][7], hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call3(Base_Hash[13][11], hash_fold_t, hsv$1, a0$0); + }); + caml_update_dummy + (hash, + function(arg){ + var + hsv = caml_call2(Base_Hash[11], 0, 0), + _a_ = caml_call2(hash_fold_t, hsv, arg); + return caml_call1(Base_Hash[9], _a_); + }); + var t_sexp_grammar = Sexplib0_Sexp_conv[59], of_string = 0; + function invariant(param){return 0;} + var + Base_Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + equal, + compare, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + Private, + t_sexp_grammar, + invariant, + of_string]; + runtime.caml_register_global(4, Base_Sexp, "Base__Sexp"); + return; + } + (globalThis)); + +//# 1912 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Import0 = global_data.Base__Import0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Sexp = global_data.Base__Sexp, + Exit = Base_Import0[1], + Not_found = Base_Import0[2], + max_int = Base_Import0[3], + min_int = Base_Import0[4], + infinity = Base_Import0[5], + neg_infinity = Base_Import0[6], + nan = Base_Import0[7], + max_float = Base_Import0[8], + min_float = Base_Import0[9], + epsilon_float = Base_Import0[10], + char_of_int = Base_Import0[11], + string_of_bool = Base_Import0[12], + bool_of_string_opt = Base_Import0[13], + bool_of_string = Base_Import0[14], + string_of_int = Base_Import0[15], + int_of_string_opt = Base_Import0[16], + string_of_float = Base_Import0[17], + float_of_string_opt = Base_Import0[18], + stdin = Base_Import0[19], + stdout = Base_Import0[20], + stderr = Base_Import0[21], + print_char = Base_Import0[22], + print_string = Base_Import0[23], + print_bytes = Base_Import0[24], + print_int = Base_Import0[25], + print_float = Base_Import0[26], + print_endline = Base_Import0[27], + print_newline = Base_Import0[28], + prerr_char = Base_Import0[29], + prerr_string = Base_Import0[30], + prerr_bytes = Base_Import0[31], + prerr_int = Base_Import0[32], + prerr_float = Base_Import0[33], + prerr_endline = Base_Import0[34], + prerr_newline = Base_Import0[35], + read_line = Base_Import0[36], + read_int_opt = Base_Import0[37], + read_int = Base_Import0[38], + read_float_opt = Base_Import0[39], + read_float = Base_Import0[40], + open_out = Base_Import0[41], + open_out_bin = Base_Import0[42], + open_out_gen = Base_Import0[43], + flush = Base_Import0[44], + flush_all = Base_Import0[45], + output_char = Base_Import0[46], + output_string = Base_Import0[47], + output_bytes = Base_Import0[48], + output = Base_Import0[49], + output_substring = Base_Import0[50], + output_byte = Base_Import0[51], + output_binary_int = Base_Import0[52], + output_value = Base_Import0[53], + seek_out = Base_Import0[54], + pos_out = Base_Import0[55], + out_channel_length = Base_Import0[56], + close_out = Base_Import0[57], + close_out_noerr = Base_Import0[58], + set_binary_mode_out = Base_Import0[59], + open_in = Base_Import0[60], + open_in_bin = Base_Import0[61], + open_in_gen = Base_Import0[62], + input_char = Base_Import0[63], + input_line = Base_Import0[64], + input = Base_Import0[65], + really_input = Base_Import0[66], + really_input_string = Base_Import0[67], + input_byte = Base_Import0[68], + input_binary_int = Base_Import0[69], + input_value = Base_Import0[70], + seek_in = Base_Import0[71], + pos_in = Base_Import0[72], + in_channel_length = Base_Import0[73], + close_in = Base_Import0[74], + close_in_noerr = Base_Import0[75], + set_binary_mode_in = Base_Import0[76], + string_of_format = Base_Import0[77], + symbol = Base_Import0[78], + exit = Base_Import0[79], + at_exit = Base_Import0[80], + valid_float_lexem = Base_Import0[81], + unsafe_really_input = Base_Import0[82], + do_at_exit = Base_Import0[83], + do_domain_local_at_exit = Base_Import0[84], + Caml = Base_Import0[85], + bool_to_int = Base_Import0[86], + symbol$0 = Base_Import0[87], + symbol$1 = Base_Import0[88], + symbol$2 = Base_Import0[89], + symbol$3 = Base_Import0[90], + symbol$4 = Base_Import0[91], + symbol$5 = Base_Import0[92], + symbol$6 = Base_Import0[93], + symbol$7 = Base_Import0[94], + symbol$8 = Base_Import0[95], + symbol$9 = Base_Import0[96], + Int_replace_polymorphic_compar = Base_Import0[97], + ascending = Base_Import0[98], + descending = Base_Import0[99], + max = Base_Import0[100], + min = Base_Import0[101], + Int32_replace_polymorphic_comp = Base_Import0[102], + Int64_replace_polymorphic_comp = Base_Import0[103], + Nativeint_replace_polymorphic_ = Base_Import0[104], + Bool_replace_polymorphic_compa = Base_Import0[105], + Char_replace_polymorphic_compa = Base_Import0[106], + Uchar_replace_polymorphic_comp = Base_Import0[107], + Float_replace_polymorphic_comp = Base_Import0[108], + String_replace_polymorphic_com = Base_Import0[109], + Bytes_replace_polymorphic_comp = Base_Import0[110], + symbol$10 = Base_Import0[111], + symbol$11 = Base_Import0[112], + symbol$12 = Base_Import0[113], + symbol$13 = Base_Import0[114], + asr = Base_Import0[115], + land = Base_Import0[116], + lnot = Base_Import0[117], + lor = Base_Import0[118], + lsl = Base_Import0[119], + lsr = Base_Import0[120], + lxor = Base_Import0[121], + mod = Base_Import0[122], + abs = Base_Import0[123], + failwith = Base_Import0[124], + fst = Base_Import0[125], + invalid_arg = Base_Import0[126], + snd = Base_Import0[127], + phys_equal = Base_Import0[128], + decr = Base_Import0[129], + incr = Base_Import0[130], + float_of_string = Base_Import0[131], + am_testing = Base_Import0[132], + default_string_of_float = Sexplib0_Sexp_conv[1], + write_old_option_format = Sexplib0_Sexp_conv[2], + read_old_option_format = Sexplib0_Sexp_conv[3], + list_map = Sexplib0_Sexp_conv[4], + sexp_of_unit = Sexplib0_Sexp_conv[5], + sexp_of_bool = Sexplib0_Sexp_conv[6], + sexp_of_string = Sexplib0_Sexp_conv[7], + sexp_of_bytes = Sexplib0_Sexp_conv[8], + sexp_of_char = Sexplib0_Sexp_conv[9], + sexp_of_int = Sexplib0_Sexp_conv[10], + sexp_of_float = Sexplib0_Sexp_conv[11], + sexp_of_int32 = Sexplib0_Sexp_conv[12], + sexp_of_int64 = Sexplib0_Sexp_conv[13], + sexp_of_nativeint = Sexplib0_Sexp_conv[14], + sexp_of_ref = Sexplib0_Sexp_conv[15], + sexp_of_lazy_t = Sexplib0_Sexp_conv[16], + sexp_of_option = Sexplib0_Sexp_conv[17], + sexp_of_pair = Sexplib0_Sexp_conv[18], + sexp_of_triple = Sexplib0_Sexp_conv[19], + sexp_of_list = Sexplib0_Sexp_conv[20], + sexp_of_array = Sexplib0_Sexp_conv[21], + sexp_of_hashtbl = Sexplib0_Sexp_conv[22], + sexp_of_opaque = Sexplib0_Sexp_conv[23], + sexp_of_fun = Sexplib0_Sexp_conv[24], + Of_sexp_error = Sexplib0_Sexp_conv[25], + record_check_extra_fields = Sexplib0_Sexp_conv[26], + of_sexp_error = Sexplib0_Sexp_conv[27], + of_sexp_error_exn = Sexplib0_Sexp_conv[28], + unit_of_sexp = Sexplib0_Sexp_conv[29], + bool_of_sexp = Sexplib0_Sexp_conv[30], + string_of_sexp = Sexplib0_Sexp_conv[31], + bytes_of_sexp = Sexplib0_Sexp_conv[32], + char_of_sexp = Sexplib0_Sexp_conv[33], + int_of_sexp = Sexplib0_Sexp_conv[34], + float_of_sexp = Sexplib0_Sexp_conv[35], + int32_of_sexp = Sexplib0_Sexp_conv[36], + int64_of_sexp = Sexplib0_Sexp_conv[37], + nativeint_of_sexp = Sexplib0_Sexp_conv[38], + ref_of_sexp = Sexplib0_Sexp_conv[39], + lazy_t_of_sexp = Sexplib0_Sexp_conv[40], + option_of_sexp = Sexplib0_Sexp_conv[41], + pair_of_sexp = Sexplib0_Sexp_conv[42], + triple_of_sexp = Sexplib0_Sexp_conv[43], + list_of_sexp = Sexplib0_Sexp_conv[44], + array_of_sexp = Sexplib0_Sexp_conv[45], + hashtbl_of_sexp = Sexplib0_Sexp_conv[46], + opaque_of_sexp = Sexplib0_Sexp_conv[47], + fun_of_sexp = Sexplib0_Sexp_conv[48], + unit_sexp_grammar = Sexplib0_Sexp_conv[49], + bool_sexp_grammar = Sexplib0_Sexp_conv[50], + string_sexp_grammar = Sexplib0_Sexp_conv[51], + bytes_sexp_grammar = Sexplib0_Sexp_conv[52], + char_sexp_grammar = Sexplib0_Sexp_conv[53], + int_sexp_grammar = Sexplib0_Sexp_conv[54], + float_sexp_grammar = Sexplib0_Sexp_conv[55], + int32_sexp_grammar = Sexplib0_Sexp_conv[56], + int64_sexp_grammar = Sexplib0_Sexp_conv[57], + nativeint_sexp_grammar = Sexplib0_Sexp_conv[58], + sexp_t_sexp_grammar = Sexplib0_Sexp_conv[59], + ref_sexp_grammar = Sexplib0_Sexp_conv[60], + lazy_t_sexp_grammar = Sexplib0_Sexp_conv[61], + option_sexp_grammar = Sexplib0_Sexp_conv[62], + list_sexp_grammar = Sexplib0_Sexp_conv[63], + array_sexp_grammar = Sexplib0_Sexp_conv[64], + opaque_sexp_grammar = Sexplib0_Sexp_conv[65], + fun_sexp_grammar = Sexplib0_Sexp_conv[66], + sexp_of_exn = Sexplib0_Sexp_conv[67], + printexc_prefer_sexp = Sexplib0_Sexp_conv[68], + sexp_of_exn_opt = Sexplib0_Sexp_conv[69], + Exn_converter = Sexplib0_Sexp_conv[70], + _a_ = Base_Hash[13], + hash_fold_nativeint = _a_[1], + hash_fold_int64 = _a_[2], + hash_fold_int32 = _a_[3], + hash_fold_char = _a_[4], + hash_fold_int = _a_[5], + hash_fold_bool = _a_[6], + hash_fold_string = _a_[7], + hash_fold_float = _a_[8], + hash_fold_unit = _a_[9], + hash_fold_option = _a_[10], + hash_fold_list = _a_[11], + hash_fold_lazy_t = _a_[12], + hash_fold_ref_frozen = _a_[13], + hash_fold_array_frozen = _a_[14], + hash_nativeint = _a_[15], + hash_int64 = _a_[16], + hash_int32 = _a_[17], + hash_char = _a_[18], + hash_int = _a_[19], + hash_bool = _a_[20], + hash_string = _a_[21], + hash_float = _a_[22], + hash_unit = _a_[23], + include = Base_Ppx_compare_lib[6], + compare_bool = include[1], + compare_char = include[2], + compare_float = include[3], + compare_int = include[4], + compare_int32 = include[5], + compare_int64 = include[6], + compare_nativeint = include[7], + compare_string = include[8], + compare_unit = include[9], + compare_array = include[10], + compare_list = include[11], + compare_option = include[12], + compare_ref = include[13], + equal_bool = include[14], + equal_char = include[15], + equal_float = include[16], + equal_int = include[17], + equal_int32 = include[18], + equal_int64 = include[19], + equal_nativeint = include[20], + equal_string = include[21], + equal_unit = include[22], + equal_array = include[23], + equal_list = include[24], + equal_option = include[25], + equal_ref = include[26], + Not_found_s = Base_Sexp[7], + Base_Import = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Caml, + bool_to_int, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + Int_replace_polymorphic_compar, + ascending, + descending, + max, + min, + Int32_replace_polymorphic_comp, + Int64_replace_polymorphic_comp, + Nativeint_replace_polymorphic_, + Bool_replace_polymorphic_compa, + Char_replace_polymorphic_compa, + Uchar_replace_polymorphic_comp, + Float_replace_polymorphic_comp, + String_replace_polymorphic_com, + Bytes_replace_polymorphic_comp, + symbol$10, + symbol$11, + symbol$12, + symbol$13, + asr, + land, + lnot, + lor, + lsl, + lsr, + lxor, + mod, + abs, + failwith, + fst, + invalid_arg, + snd, + phys_equal, + decr, + incr, + float_of_string, + am_testing, + default_string_of_float, + write_old_option_format, + read_old_option_format, + list_map, + sexp_of_unit, + sexp_of_bool, + sexp_of_string, + sexp_of_bytes, + sexp_of_char, + sexp_of_int, + sexp_of_float, + sexp_of_int32, + sexp_of_int64, + sexp_of_nativeint, + sexp_of_ref, + sexp_of_lazy_t, + sexp_of_option, + sexp_of_pair, + sexp_of_triple, + sexp_of_list, + sexp_of_array, + sexp_of_hashtbl, + sexp_of_opaque, + sexp_of_fun, + Of_sexp_error, + record_check_extra_fields, + of_sexp_error, + of_sexp_error_exn, + unit_of_sexp, + bool_of_sexp, + string_of_sexp, + bytes_of_sexp, + char_of_sexp, + int_of_sexp, + float_of_sexp, + int32_of_sexp, + int64_of_sexp, + nativeint_of_sexp, + ref_of_sexp, + lazy_t_of_sexp, + option_of_sexp, + pair_of_sexp, + triple_of_sexp, + list_of_sexp, + array_of_sexp, + hashtbl_of_sexp, + opaque_of_sexp, + fun_of_sexp, + unit_sexp_grammar, + bool_sexp_grammar, + string_sexp_grammar, + bytes_sexp_grammar, + char_sexp_grammar, + int_sexp_grammar, + float_sexp_grammar, + int32_sexp_grammar, + int64_sexp_grammar, + nativeint_sexp_grammar, + sexp_t_sexp_grammar, + ref_sexp_grammar, + lazy_t_sexp_grammar, + option_sexp_grammar, + list_sexp_grammar, + array_sexp_grammar, + opaque_sexp_grammar, + fun_sexp_grammar, + sexp_of_exn, + printexc_prefer_sexp, + sexp_of_exn_opt, + Exn_converter, + hash_fold_nativeint, + hash_fold_int64, + hash_fold_int32, + hash_fold_char, + hash_fold_int, + hash_fold_bool, + hash_fold_string, + hash_fold_float, + hash_fold_unit, + hash_fold_option, + hash_fold_list, + hash_fold_lazy_t, + hash_fold_ref_frozen, + hash_fold_array_frozen, + hash_nativeint, + hash_int64, + hash_int32, + hash_char, + hash_int, + hash_bool, + hash_string, + hash_float, + hash_unit, + compare_bool, + compare_char, + compare_float, + compare_int, + compare_int32, + compare_int64, + compare_nativeint, + compare_string, + compare_unit, + compare_array, + compare_list, + compare_option, + compare_ref, + equal_bool, + equal_char, + equal_float, + equal_int, + equal_int32, + equal_int64, + equal_nativeint, + equal_string, + equal_unit, + equal_array, + equal_list, + equal_option, + equal_ref, + Not_found_s]; + runtime.caml_register_global(5, Base_Import, "Base__Import"); + return; + } + (globalThis)); + +//# 2438 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + Base_Import = global_data.Base__Import, + _a_ = [0, "W64"], + _b_ = [0, "W32"], + cst_unknown_word_size = "unknown word size"; + function sexp_of_t(param){return param ? _a_ : _b_;} + function num_bits(param){return param ? 64 : 32;} + var + _c_ = Base_Sys0[7], + word_size = + 32 === _c_ + ? 0 + : 64 === _c_ ? 1 : caml_call1(Base_Import[124], cst_unknown_word_size), + Base_Word_size = [0, sexp_of_t, num_bits, word_size]; + runtime.caml_register_global(5, Base_Word_size, "Base__Word_size"); + return; + } + (globalThis)); + +//# 2479 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Format = global_data.Stdlib__Format, + Base_Import = global_data.Base__Import, + r = [0, [0, "Base.Sexp.pp_hum", 0]], + cst_pp = ".pp"; + function all(param){return r[1];} + function register(p){r[1] = [0, p, r[1]]; return 0;} + function Register_pp(M){ + var pp = M[1], module_name = M[2]; + register(caml_call2(Base_Import[112], M[2], cst_pp)); + return [0, pp, module_name]; + } + function _a_(_c_){return [0, Register_pp(_c_)[1]];} + var + Base_Pretty_printer = + [0, + all, + function(M){ + var module_name = M[1]; + function pp(formatter, t){ + var _b_ = caml_call1(M[2], t); + return caml_call2(Stdlib_Format[13], formatter, _b_); + } + return [0, Register_pp([0, pp, module_name])[1]]; + }, + _a_, + register]; + runtime.caml_register_global + (4, Base_Pretty_printer, "Base__Pretty_printer"); + return; + } + (globalThis)); + +//# 2529 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_2 = "<2>", + cst_src_exn_ml = "src/exn.ml", + caml_fresh_oo_id = runtime.caml_fresh_oo_id, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Exn", + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Import = global_data.Base__Import, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Sexp = global_data.Base__Sexp, + Base_Printf = global_data.Base__Printf, + Assert_failure = global_data.Assert_failure, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + sexp_of_t = Base_Import[199], + exit = Base_Import[85][98], + Finally = [248, "Base__Exn.Finally", caml_fresh_oo_id(0)], + _k_ = + [0, + [11, "Exn.handle_uncaught could not print; exiting anyway\n", [10, 0]], + "Exn.handle_uncaught could not print; exiting anyway\n%!"], + _j_ = + [0, + [18, + [1, [0, [11, cst_2, 0], cst_2]], + [11, + "Uncaught exception:", + [17, + 3, + [17, + 3, + [18, [1, [0, 0, ""]], [15, [17, 0, [17, 0, [17, 3, [17, 4, 0]]]]]]]]]], + "@[<2>Uncaught exception:@\n@\n@[%a@]@]@\n@."], + _i_ = [0, 2], + _h_ = [0, cst_src_exn_ml, 54, 6], + _e_ = [0, "exn.ml.Reraised"], + _f_ = [0, cst_src_exn_ml, 33, 11], + _b_ = [0, "exn.ml.Finally"], + _c_ = [0, cst_src_exn_ml, 19, 11], + cst_Base_Exn_Reraised = "Base__Exn.Reraised", + cst_Base_Exn_Sexp = "Base__Exn.Sexp"; + function _a_(param){ + if(param[1] !== Finally) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + arg1_002 = param[3], + arg0_001 = param[2], + res0_003 = caml_call1(sexp_of_t, arg0_001), + res1_004 = caml_call1(sexp_of_t, arg1_002); + return [1, [0, _b_, [0, res0_003, [0, res1_004, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Finally, _a_); + var Reraised = [248, cst_Base_Exn_Reraised, caml_fresh_oo_id(0)]; + function _d_(param){ + if(param[1] !== Reraised) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + arg1_006 = param[3], + arg0_005 = param[2], + res0_007 = caml_call1(Base_Import[139], arg0_005), + res1_008 = caml_call1(sexp_of_t, arg1_006); + return [1, [0, _e_, [0, res0_007, [0, res1_008, 0]]]]; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Reraised, _d_); + var Sexp = [248, cst_Base_Exn_Sexp, caml_fresh_oo_id(0)]; + function _g_(param){ + if(param[1] !== Sexp) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var t = param[2]; + return t; + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Sexp, _g_); + function create_s(sexp){return [0, Sexp, sexp];} + function raise_with_original_backtrace(t, backtrace){ + runtime.caml_restore_raw_backtrace(t, backtrace); + throw caml_maybe_attach_backtrace(t, 0); + } + function reraise(exn, str){ + var exn$0 = [0, Reraised, str, exn]; + if(! runtime.Base_caml_exn_is_most_recent_exn(exn)) + throw caml_maybe_attach_backtrace(exn$0, 1); + var bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace(exn$0, bt); + } + function reraisef(exc, format){ + function _y_(str, param){return reraise(exc, str);} + return caml_call2(Base_Printf[4], _y_, format); + } + function to_string(exc){ + var _x_ = caml_call1(Base_Import[199], exc); + return caml_call2(Base_Sexp[15], _i_, _x_); + } + function to_string_mach(exc){ + var _w_ = caml_call1(Base_Import[199], exc); + return caml_call1(Base_Sexp[16], _w_); + } + var sexp_of_t$0 = Base_Import[199]; + function protectx(f, x, finally$0){ + try{var res = caml_call1(f, x);} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + try{caml_call1(finally$0, x);} + catch(final_exn$0){ + var final_exn = caml_wrap_exception(final_exn$0); + return raise_with_original_backtrace([0, Finally, exn, final_exn], bt); + } + return raise_with_original_backtrace(exn, bt); + } + caml_call1(finally$0, x); + return res; + } + function protect(f, finally$0){return protectx(f, 0, finally$0);} + function does_raise(f){ + try{caml_call1(f, 0); var _u_ = 0; return _u_;}catch(_v_){return 1;} + } + function pp(ppf, t){ + var match = caml_call1(Base_Import[201], t); + if(match){ + var sexp = match[1]; + return caml_call2(Base_Sexp[11], ppf, sexp); + } + var _t_ = caml_call1(Stdlib_Printexc[1], t); + return caml_call2(Stdlib_Format[13], ppf, _t_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1]; + function print_with_backtrace(exc, raw_backtrace){ + caml_call3(Stdlib_Format[137], _j_, pp$0, exc); + if(caml_call1(Stdlib_Printexc[8], 0)) + caml_call2(Stdlib_Printexc[13], Base_Import[85][39], raw_backtrace); + return caml_call1(Base_Import[85][62], Base_Import[85][39]); + } + function handle_uncaught_aux(do_at_exit, exit, f){ + try{var _p_ = caml_call1(f, 0); return _p_;} + catch(exc$0){ + var + exc = caml_wrap_exception(exc$0), + raw_backtrace = caml_call1(Stdlib_Printexc[12], 0); + if(do_at_exit) try{caml_call1(Base_Import[85][102], 0);}catch(_s_){} + try{print_with_backtrace(exc, raw_backtrace);} + catch(_q_){try{caml_call1(Stdlib_Printf[3], _k_);}catch(_r_){}} + return caml_call1(exit, 1); + } + } + function handle_uncaught_and_exit(f){ + return handle_uncaught_aux(1, exit, f); + } + function handle_uncaught(must_exit, f){ + var exit$0 = must_exit ? exit : function(_o_){return 0;}; + return handle_uncaught_aux(must_exit, exit$0, f); + } + function reraise_uncaught(str, func){ + try{var _n_ = caml_call1(func, 0); return _n_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + bt = caml_call1(Stdlib_Printexc[12], 0); + return raise_with_original_backtrace([0, Reraised, str, exn], bt); + } + } + function raise_without_backtrace(e){ + runtime.Base_clear_caml_backtrace_pos(0); + throw e; + } + function initialize_module(param){ + return caml_call1(Stdlib_Printexc[16], print_with_backtrace); + } + function clear_backtrace(_m_){ + return runtime.Base_clear_caml_backtrace_pos(_m_); + } + var + Private = [0, clear_backtrace], + Base_Exn = + [0, + sexp_of_t$0, + pp$0, + Finally, + Reraised, + create_s, + raise_without_backtrace, + raise_with_original_backtrace, + reraise, + reraisef, + to_string, + to_string_mach, + protectx, + protect, + handle_uncaught, + handle_uncaught_and_exit, + reraise_uncaught, + does_raise, + function(_l_){return runtime.Base_caml_exn_is_most_recent_exn(_l_);}, + initialize_module, + Private]; + runtime.caml_register_global(21, Base_Exn, "Base__Exn"); + return; + } + (globalThis)); + +//# 2761 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Exn = global_data.Base__Exn, + cst_use_of_return_from_a_with_ = + "use of [return] from a [with_return] that already returned", + cst_Return = "Return"; + function with_return(f){ + var + Return = [248, cst_Return, runtime.caml_fresh_oo_id(0)], + is_alive = [0, 1]; + function return$0(a){ + if(1 - is_alive[1]) + caml_call1(Base_Import[124], cst_use_of_return_from_a_with_); + return caml_call1(Base_Exn[6], [0, Return, a]); + } + try{var a$0 = caml_call1(f, return$0); is_alive[1] = 0; return a$0;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + is_alive[1] = 0; + if(exn[1] !== Return) throw caml_maybe_attach_backtrace(exn, 0); + var a = exn[2]; + return a; + } + } + function with_return_option(f){ + return with_return + (function(return$0){ + caml_call1(f, function(a){return caml_call1(return$0, [0, a]);}); + return 0; + }); + } + function prepend(param, f){ + return function(x){return caml_call1(param, caml_call1(f, x));}; + } + var Base_With_return = [0, with_return, with_return_option, prepend]; + runtime.caml_register_global(4, Base_With_return, "Base__With_return"); + return; + } + (globalThis)); + +//# 2833 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function S_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S3(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_to_S_indexed(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Monad_infix = X[3], + bind = X[4], + return$0 = X[5], + map = X[6], + join = X[7], + ignore_m = X[8], + all = X[9], + all_unit = X[10], + Let_syntax = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S2_to_S(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + } + function S3_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + function S_indexed_to_S2(X){ + var + symbol_bind = X[1], + symbol_map = X[2], + Let_syntax = X[3], + Monad_infix = X[4], + bind = X[5], + return$0 = X[6], + map = X[7], + join = X[8], + ignore_m = X[9], + all = X[10], + all_unit = X[11]; + return [0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]; + } + var + Base_Monad_intf = + [0, + S_to_S2, + S2_to_S3, + S_to_S_indexed, + S2_to_S, + S3_to_S2, + S_indexed_to_S2]; + runtime.caml_register_global(0, Base_Monad_intf, "Base__Monad_intf"); + return; + } + (globalThis)); + +//# 3008 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0; + function Make_general(_s_){ + var bind = _s_[1], return$0 = _s_[3]; + function map_via_bind(ma, f){ + function _t_(a){ + var _u_ = caml_call1(f, a); + return caml_call1(_s_[3], _u_); + } + return caml_call2(_s_[1], ma, _t_); + } + var match = _s_[2]; + if(typeof match === "number") + var map = map_via_bind; + else + var x = match[2], map = x; + function symbol_bind(t, f){return caml_call2(bind, t, f);} + function symbol_map(t, f){return caml_call2(map, t, f);} + var + Monad_infix = [0, symbol_bind, symbol_map], + symbol_bind$0 = Monad_infix[1], + symbol_map$0 = Monad_infix[2], + symbol_bind$1 = Monad_infix[1], + symbol_map$1 = Monad_infix[2]; + function both(a, b){ + return caml_call2 + (symbol_bind$1, + a, + function(a){ + return caml_call2 + (symbol_map$1, b, function(b){return [0, a, b];}); + }); + } + var + Open_on_rhs = [0], + Let_syntax = [0, return$0, bind, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind$1, symbol_map$1, Let_syntax]; + function join(t){ + return caml_call2(symbol_bind$0, t, function(t){return t;}); + } + function ignore_m(t){ + return caml_call2(map, t, function(param){return 0;}); + } + function loop(vs, param){ + if(! param) return caml_call1(return$0, caml_call1(Base_List0[21], vs)); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(v){return loop([0, v, vs], ts);}); + } + function all(ts){return loop(0, ts);} + function all_unit(param){ + if(! param) return caml_call1(return$0, 0); + var ts = param[2], t = param[1]; + return caml_call2 + (symbol_bind$0, t, function(param){return all_unit(ts);}); + } + return [0, + bind, + return$0, + map_via_bind, + map, + Monad_infix, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + join, + ignore_m, + all, + all_unit]; + } + function Make_indexed(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _r_ = Make_general([0, bind, map, return$0]); + return [0, + _r_[6], + _r_[7], + _r_[8], + _r_[5], + _r_[1], + _r_[2], + _r_[4], + _r_[9], + _r_[10], + _r_[11], + _r_[12]]; + } + function Make3(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _q_ = Make_general([0, bind, map, return$0]); + return [0, + _q_[6], + _q_[7], + _q_[8], + _q_[5], + _q_[1], + _q_[2], + _q_[4], + _q_[9], + _q_[10], + _q_[11], + _q_[12]]; + } + function Make2(M){ + var + bind = M[1], + map = M[2], + return$0 = M[3], + _p_ = Make_general([0, bind, map, return$0]); + return [0, + _p_[6], + _p_[7], + _p_[8], + _p_[5], + _p_[1], + _p_[2], + _p_[4], + _p_[9], + _p_[10], + _p_[11], + _p_[12]]; + } + function Make(M){ + var + bind = M[1], + return$0 = M[2], + map = M[3], + _o_ = Make_general([0, bind, map, return$0]); + return [0, + _o_[6], + _o_[7], + _o_[5], + _o_[1], + _o_[2], + _o_[4], + _o_[9], + _o_[10], + _o_[11], + _o_[12], + _o_[8]]; + } + function Of_monad_general(Monad, M){ + function return$0(a){ + var _n_ = caml_call1(Monad[3], a); + return caml_call1(M[2], _n_); + } + function bind(t, f){ + function _j_(a){ + var _m_ = caml_call1(f, a); + return caml_call1(M[1], _m_); + } + var _k_ = caml_call1(M[1], t), _l_ = caml_call2(Monad[1], _k_, _j_); + return caml_call1(M[2], _l_); + } + var + map = + [0, + -198771759, + function(t, f){ + var _h_ = caml_call1(M[1], t), _i_ = caml_call2(Monad[2], _h_, f); + return caml_call1(M[2], _i_); + }]; + return Make_general([0, bind, map, return$0]); + } + function bind(a, f){return caml_call1(f, a);} + function return$0(a){return a;} + var + map = [0, -198771759, function(a, f){return caml_call1(f, a);}], + include = Make([0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11], + Ident = + [0, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax]; + function _a_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _g_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _g_[6], + _g_[7], + _g_[8], + _g_[5], + _g_[1], + _g_[2], + _g_[4], + _g_[9], + _g_[10], + _g_[11], + _g_[12]]; + } + function _b_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _f_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _f_[6], + _f_[7], + _f_[8], + _f_[5], + _f_[1], + _f_[2], + _f_[4], + _f_[9], + _f_[10], + _f_[11], + _f_[12]]; + } + function _c_(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[5], + return$0 = Monad[6], + map = Monad[7], + _e_ = Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _e_[6], + _e_[7], + _e_[8], + _e_[5], + _e_[1], + _e_[2], + _e_[4], + _e_[9], + _e_[10], + _e_[11], + _e_[12]]; + } + var + Base_Monad = + [0, + Make, + Make2, + Make3, + Make_indexed, + function(Monad, M){ + var + to_monad = M[1], + of_monad = M[2], + bind = Monad[4], + return$0 = Monad[5], + map = Monad[6], + _d_ = + Of_monad_general([0, bind, map, return$0], [0, to_monad, of_monad]); + return [0, + _d_[6], + _d_[7], + _d_[5], + _d_[1], + _d_[2], + _d_[4], + _d_[9], + _d_[10], + _d_[11], + _d_[12], + _d_[8]]; + }, + _c_, + _b_, + _a_, + Ident]; + runtime.caml_register_global(1, Base_Monad, "Base__Monad"); + return; + } + (globalThis)); + +//# 3323 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Applicative_intf = [0]; + runtime.caml_register_global + (0, Base_Applicative_intf, "Base__Applicative_intf"); + return; + } + (globalThis)); + +//# 3334 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0; + function S_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S2_to_S3(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function S3_to_S2(X){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + apply = X[8], + map2 = X[9], + map3 = X[10], + all = X[11], + all_unit = X[12], + Applicative_infix = X[13]; + return [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Make3(_M_){ + var return$0 = _M_[1], symbol = _M_[2]; + function derived_map(t, f){ + return caml_call2(symbol, caml_call1(return$0, f), t); + } + var match = _M_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function map2(ta, tb, f){ + return caml_call2(symbol, caml_call2(map, ta, f), tb); + } + function map3(ta, tb, tc, f){ + return caml_call2 + (symbol, caml_call2(symbol, caml_call2(map, ta, f), tb), tc); + } + function all(ts){ + var _O_ = caml_call1(return$0, 0); + function _P_(x, xs){return [0, x, xs];} + function _Q_(_R_){return function(_S_){return map2(_R_, _S_, _P_);};} + return caml_call3(Base_List0[22], ts, _Q_, _O_); + } + function both(ta, tb){ + return map2(ta, tb, function(a, b){return [0, a, b];}); + } + function symbol$0(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(param, y){return y;}), + u), + v); + } + function symbol$1(u, v){ + return caml_call2 + (symbol, + caml_call2 + (symbol, + caml_call1(return$0, function(x, param){return x;}), + u), + v); + } + function all_unit(ts){ + var _N_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _N_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make3([0, return$0, apply, map]); + } + function Make(X){ + var return$0 = X[1], apply = X[2], map = X[3]; + return Make2([0, return$0, apply, map]); + } + function Make_let_syntax3(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + return$1 = X[1], + map$0 = X[2], + both$0 = X[3], + symbol$2 = X[4], + symbol$3 = X[5], + symbol$4 = X[6], + symbol_map$0 = X[7], + Let_syntax = + [0, + return$1, + map$0, + both$0, + symbol$2, + symbol$3, + symbol$4, + symbol_map$0, + Impl], + Let_syntax$0 = + [0, + return$0, + map, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + Let_syntax]; + return [0, Let_syntax$0]; + } + function Make_let_syntax2(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7]; + return Make_let_syntax3 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl); + } + function Make3_using_map2(_D_){ + var return$0 = _D_[1], map2 = _D_[2]; + function symbol(tf, ta){ + return caml_call3(map2, tf, ta, function(f, a){return caml_call1(f, a);}); + } + function derived_map(t, f){return symbol(caml_call1(return$0, f), t);} + var match = _D_[3]; + if(typeof match === "number") + var map = derived_map; + else + var x = match[2], map = x; + function symbol_map(t, f){return caml_call2(map, t, f);} + function both(ta, tb){ + return caml_call3(map2, ta, tb, function(a, b){return [0, a, b];}); + } + function map3(ta, tb, tc, f){ + function _L_(fab, c){return caml_call1(fab, c);} + return caml_call3(map2, caml_call3(map2, ta, tb, f), tc, _L_); + } + function all(ts){ + var _F_ = caml_call1(return$0, 0); + function _G_(x, xs){return [0, x, xs];} + function _H_(_I_){ + var _J_ = caml_call1(map2, _I_); + return function(_K_){return caml_call2(_J_, _K_, _G_);}; + } + return caml_call3(Base_List0[22], ts, _H_, _F_); + } + function symbol$0(u, v){ + return caml_call3(map2, u, v, function(param, y){return y;}); + } + function symbol$1(u, v){ + return caml_call3(map2, u, v, function(x, param){return x;}); + } + function all_unit(ts){ + var _E_ = caml_call1(return$0, 0); + return caml_call3(Base_List0[8], ts, _E_, symbol$0); + } + return [0, + return$0, + map, + both, + symbol, + symbol$1, + symbol$0, + symbol_map, + symbol, + map2, + map3, + all, + all_unit, + [0, symbol, symbol$1, symbol$0, symbol_map]]; + } + function Make2_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make3_using_map2([0, return$0, map2, map]); + } + function Make_using_map2(X){ + var return$0 = X[1], map2 = X[2], map = X[3]; + return Make2_using_map2([0, return$0, map2, map]); + } + function Of_monad2(M){ + var return$0 = M[6]; + function apply(mf, mx){ + function _C_(f){return caml_call2(M[7], mx, f);} + return caml_call2(M[5], mf, _C_); + } + var map = [0, -198771759, M[7]]; + return Make2([0, return$0, apply, map]); + } + function Of_monad(M){ + var + symbol_bind = M[1], + symbol_map = M[2], + Monad_infix = M[3], + bind = M[4], + return$0 = M[5], + map = M[6], + join = M[7], + ignore_m = M[8], + all = M[9], + all_unit = M[10], + Let_syntax = M[11]; + return Of_monad2 + ([0, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind, + return$0, + map, + join, + ignore_m, + all, + all_unit]); + } + function Compose(F, G){ + function return$0(a){ + var _B_ = caml_call1(F[1], a); + return caml_call1(G[1], _B_); + } + function apply(tf, tx){ + var _A_ = caml_call2(G[2], tf, F[8]); + return caml_call2(G[8], _A_, tx); + } + function custom_map(t, f){ + var _x_ = F[2]; + function _y_(_z_){return caml_call2(_x_, _z_, f);} + return caml_call2(G[2], t, _y_); + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function Pair(F, G){ + function return$0(a){ + var _w_ = caml_call1(G[1], a); + return [0, caml_call1(F[1], a), _w_]; + } + function apply(tf, tx){ + var + _r_ = caml_call1(Base_Import[127], tx), + _s_ = caml_call1(Base_Import[127], tf), + _t_ = caml_call2(G[8], _s_, _r_), + _u_ = caml_call1(Base_Import[125], tx), + _v_ = caml_call1(Base_Import[125], tf); + return [0, caml_call2(F[8], _v_, _u_), _t_]; + } + function custom_map(t, f){ + var + _o_ = caml_call1(Base_Import[127], t), + _p_ = caml_call2(G[2], _o_, f), + _q_ = caml_call1(Base_Import[125], t); + return [0, caml_call2(F[2], _q_, f), _p_]; + } + var + map = [0, -198771759, custom_map], + include = Make([0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + return [0, + return$1, + map$0, + both, + symbol, + symbol$0, + symbol$1, + symbol_map, + apply$0, + map2, + map3, + all, + all_unit, + Applicative_infix]; + } + function _a_(_l_, _k_, _j_){ + var _m_ = Make_let_syntax3(_l_, _k_, _j_)[1], _n_ = _m_[8]; + return [0, + [0, + _m_[1], + _m_[4], + _m_[5], + _m_[6], + _m_[7], + [0, _n_[1], _n_[2], _n_[3], _n_[8]]]]; + } + function _b_(_g_, _f_, _e_){ + var _h_ = Make_let_syntax2(_g_, _f_, _e_)[1], _i_ = _h_[8]; + return [0, + [0, + _h_[1], + _h_[4], + _h_[5], + _h_[6], + _h_[7], + [0, _i_[1], _i_[2], _i_[3], _i_[8]]]]; + } + var + Base_Applicative = + [0, + S2_to_S, + S_to_S2, + S3_to_S2, + S2_to_S3, + Make, + Make2, + Make3, + function(X, Intf, Impl){ + var + return$0 = X[1], + map = X[2], + both = X[3], + symbol = X[4], + symbol$0 = X[5], + symbol$1 = X[6], + symbol_map = X[7], + _c_ = + Make_let_syntax2 + ([0, return$0, map, both, symbol, symbol$0, symbol$1, symbol_map], + Intf, + Impl) + [1], + _d_ = _c_[8]; + return [0, + [0, + _c_[1], + _c_[4], + _c_[5], + _c_[6], + _c_[7], + [0, _d_[1], _d_[2], _d_[3], _d_[8]]]]; + }, + _b_, + _a_, + Make_using_map2, + Make2_using_map2, + Make3_using_map2, + Of_monad, + Of_monad2, + Compose, + Pair]; + runtime.caml_register_global(2, Base_Applicative, "Base__Applicative"); + return; + } + (globalThis)); + +//# 3868 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_BytesLabels = global_data.Stdlib__BytesLabels, + Base_Sys0 = global_data.Base__Sys0, + Primitives = [0], + max_length = Base_Sys0[10], + blit = Stdlib_BytesLabels[11], + blit_string = Stdlib_BytesLabels[12], + compare = Stdlib_BytesLabels[40], + copy = Stdlib_BytesLabels[4], + create = runtime.caml_create_bytes, + fill = Stdlib_BytesLabels[10], + make = Stdlib_BytesLabels[1], + map = Stdlib_BytesLabels[17], + mapi = Stdlib_BytesLabels[18], + sub = Stdlib_BytesLabels[7], + unsafe_blit = runtime.caml_blit_bytes, + to_string = Stdlib_BytesLabels[6], + of_string = Stdlib_BytesLabels[5]; + function unsafe_to_string(s){return caml_call1(Stdlib_BytesLabels[44], s);} + var + unsafe_of_string_promise_no_mu = Stdlib_BytesLabels[45], + Base_Bytes0 = + [0, + Primitives, + max_length, + blit, + blit_string, + compare, + copy, + create, + fill, + make, + map, + mapi, + sub, + unsafe_blit, + to_string, + of_string, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(2, Base_Bytes0, "Base__Bytes0"); + return; + } + (globalThis)); + +//# 3924 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var Module = [0], _a_ = [0, "_"]; + function make(compare, sexp_of_t){ + var comparator = [0, compare, sexp_of_t]; + return [0, comparator]; + } + function S_to_S1(S){var comparator = S[1]; return [0, comparator];} + function Make1(M){ + var comparator = [0, M[1], M[2]]; + return [0, comparator]; + } + var compare = runtime.caml_compare; + function sexp_of_t(param){return _a_;} + var + include = Make1([0, compare, sexp_of_t]), + comparator = include[1], + Poly = [0, comparator]; + function Derived(M){ + function comparator(a){ + var _d_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _d_]; + } + return [0, comparator]; + } + function Derived2(M){ + function comparator(a, b){ + var _c_ = caml_call2(M[2], a[2], b[2]); + return [0, caml_call2(M[1], a[1], b[1]), _c_]; + } + return [0, comparator]; + } + function Derived_phantom(M){ + function comparator(a){ + var _b_ = caml_call1(M[2], a[2]); + return [0, caml_call1(M[1], a[1]), _b_]; + } + return [0, comparator]; + } + var + Base_Comparator = + [0, + make, + Poly, + Module, + S_to_S1, + function(M){var comparator = [0, M[1], M[2]]; return [0, comparator];}, + Make1, + Derived, + Derived2, + Derived_phantom]; + runtime.caml_register_global(1, Base_Comparator, "Base__Comparator"); + return; + } + (globalThis)); + +//# 4201 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + Stdlib_StringLabels = global_data.Stdlib__StringLabels, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Sys0 = global_data.Base__Sys0, + Base_Import0 = global_data.Base__Import0, + String = [0], + max_length = Base_Sys0[10], + symbol = Base_Import0[112], + capitalize = Stdlib_StringLabels[27], + compare = Stdlib_StringLabels[9]; + function copy(x){ + var _a_ = caml_call1(Base_Bytes0[15], x); + return caml_call1(Base_Bytes0[16], _a_); + } + var + escaped = Stdlib_StringLabels[24], + lowercase = Stdlib_StringLabels[26], + make = Stdlib_StringLabels[1], + sub = Stdlib_StringLabels[15], + uncapitalize = Stdlib_StringLabels[28], + unsafe_blit = runtime.caml_blit_string, + uppercase = Stdlib_StringLabels[25]; + function concat(opt, l){ + if(opt) var sth = opt[1], sep = sth; else var sep = cst$0; + if(! l) return cst; + if(l[2]) return caml_call2(Stdlib_StringLabels[6], sep, l); + var x = l[1]; + return x; + } + function iter(t, f){return caml_call2(Stdlib_StringLabels[29], f, t);} + var + Base_String0 = + [0, + String, + max_length, + symbol, + capitalize, + compare, + copy, + escaped, + lowercase, + make, + sub, + uncapitalize, + unsafe_blit, + uppercase, + concat, + iter]; + runtime.caml_register_global(6, Base_String0, "Base__String0"); + return; + } + (globalThis)); + +//# 4273 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$1 = ":"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$1, + cst$0 = cst$1, + Base_Import = global_data.Base__Import, + Base_Int0 = global_data.Base__Int0, + Base_String0 = global_data.Base__String0, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Comparator = global_data.Base__Comparator, + _a_ = [0, "pos_cnum"], + _b_ = [0, "pos_bol"], + _c_ = [0, "pos_lnum"], + _d_ = [0, "pos_fname"]; + function compare(a_001, b_002){ + if(caml_call2(Base_Ppx_compare_lib[1], a_001, b_002)) return 0; + var n = caml_call2(Base_Import[233], a_001[1], b_002[1]); + if(0 !== n) return n; + var n$0 = caml_call2(Base_Import[229], a_001[2], b_002[2]); + if(0 !== n$0) return n$0; + var n$1 = caml_call2(Base_Import[229], a_001[3], b_002[3]); + return 0 === n$1 ? caml_call2(Base_Import[229], a_001[4], b_002[4]) : n$1; + } + function hash_fold_t(hsv, arg){ + var + hsv$0 = caml_call2(Base_Import[209], hsv, arg[1]), + hsv$1 = caml_call2(Base_Import[207], hsv$0, arg[2]), + hsv$2 = caml_call2(Base_Import[207], hsv$1, arg[3]); + return caml_call2(Base_Import[207], hsv$2, arg[4]); + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function sexp_of_t(param){ + var + pos_cnum_010 = param[4], + pos_bol_008 = param[3], + pos_lnum_006 = param[2], + pos_fname_004 = param[1], + arg_011 = caml_call1(Base_Import[142], pos_cnum_010), + bnds_003 = [0, [1, [0, _a_, [0, arg_011, 0]]], 0], + arg_009 = caml_call1(Base_Import[142], pos_bol_008), + bnds_003$0 = [0, [1, [0, _b_, [0, arg_009, 0]]], bnds_003], + arg_007 = caml_call1(Base_Import[142], pos_lnum_006), + bnds_003$1 = [0, [1, [0, _c_, [0, arg_007, 0]]], bnds_003$0], + arg_005 = caml_call1(Base_Import[139], pos_fname_004), + bnds_003$2 = [0, [1, [0, _d_, [0, arg_005, 0]]], bnds_003$1]; + return [1, bnds_003$2]; + } + var + T = [0, compare, hash_fold_t, hash, sexp_of_t], + compare$0 = T[1], + hash_fold_t$0 = T[2], + hash$0 = T[3], + include = caml_call1(Base_Comparator[5], [0, T[1], T[4]]), + comparator = include[1]; + function make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol){ + var + _e_ = caml_call2(Base_Import[93], pos_cnum, pos_bol), + _f_ = [0, cst, [0, caml_call1(Base_Int0[1], _e_), 0]], + _g_ = + [0, + pos_fname, + [0, cst$0, [0, caml_call1(Base_Int0[1], pos_lnum), _f_]]]; + return caml_call2(Base_String0[14], 0, _g_); + } + function to_string(param){ + var + pos_cnum = param[4], + pos_bol = param[3], + pos_lnum = param[2], + pos_fname = param[1]; + return make_location_string(pos_fname, pos_lnum, pos_cnum, pos_bol); + } + function sexp_of_t$0(t){return [0, to_string(t)];} + var + Base_Source_code_position0 = + [0, + T, + compare$0, + hash_fold_t$0, + hash$0, + comparator, + make_location_string, + to_string, + sexp_of_t$0]; + runtime.caml_register_global + (12, Base_Source_code_position0, "Base__Source_code_position0"); + return; + } + (globalThis)); + +//# 4392 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List0 = global_data.Base__List0, + hd_exn = Base_List0[1], + length = Base_List0[2], + rev_append = Base_List0[3], + tl_exn = Base_List0[4], + unzip = Base_List0[5], + exists = Base_List0[6], + exists2_ok = Base_List0[7], + fold = Base_List0[8], + fold2_ok = Base_List0[9], + for_all = Base_List0[10], + for_all2_ok = Base_List0[11], + iter = Base_List0[12], + iter2_ok = Base_List0[13], + nontail_map = Base_List0[14], + nontail_mapi = Base_List0[15], + partition = Base_List0[16], + rev_map = Base_List0[17], + rev_map2_ok = Base_List0[18], + sort = Base_List0[19], + stable_sort = Base_List0[20], + rev = Base_List0[21], + fold_right = Base_List0[22]; + function is_empty(param){return param ? 0 : 1;} + function partition_map(t, f){ + var t$0 = t, fst = 0, snd = 0; + for(;;){ + if(! t$0){ + var _a_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _a_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x); + if(0 === match[0]){ + var y = match[1], fst$0 = [0, y, fst], t$0 = t$1, fst = fst$0; + continue; + } + var y$0 = match[1], snd$0 = [0, y$0, snd], t$0 = t$1, snd = snd$0; + } + } + var + Base_List1 = + [0, + hd_exn, + length, + rev_append, + tl_exn, + unzip, + exists, + exists2_ok, + fold, + fold2_ok, + for_all, + for_all2_ok, + iter, + iter2_ok, + nontail_map, + nontail_mapi, + partition, + rev_map, + rev_map2_ok, + sort, + stable_sort, + rev, + fold_right, + is_empty, + partition_map]; + runtime.caml_register_global(1, Base_List1, "Base__List1"); + return; + } + (globalThis)); + +//# 4476 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Error$0 = "Error", + cst_Ok$0 = "Ok", + cst_error = "error", + cst_ok = "ok", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_005 = "result.ml.t", + Base_List1 = global_data.Base__List1, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Monad = global_data.Base__Monad, + _c_ = [0, 0], + cst_Error = cst_Error$0, + cst_Ok = cst_Ok$0, + _a_ = [0, cst_Ok$0], + _b_ = [0, cst_Error$0]; + function t_of_sexp(of_a_001, of_b_002, sexp_007){ + if(0 === sexp_007[0]){ + var _f_ = sexp_007[1], switch$0 = 0; + if(caml_string_notequal(_f_, cst_Error$0)){ + var switch$1 = 0; + if(caml_string_notequal(_f_, cst_Ok$0)){ + if(caml_string_notequal(_f_, cst_error)) + if(caml_string_notequal(_f_, cst_ok)) switch$0 = 1; else switch$1 = 1; + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_005, sexp_007); + } + else{ + var _g_ = sexp_007[1]; + if(! _g_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_007); + var _h_ = _g_[1]; + if(0 !== _h_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_007); + var tag_008 = _h_[1], switch$2 = 0; + if(caml_string_notequal(tag_008, cst_Error$0)){ + var switch$3 = 0; + if(caml_string_notequal(tag_008, cst_Ok$0)){ + if(caml_string_notequal(tag_008, cst_error)) + if(caml_string_notequal(tag_008, cst_ok)) + switch$2 = 1; + else + switch$3 = 1; + } + else + switch$3 = 1; + if(switch$3){ + var sexp_args_009 = _g_[2]; + if(sexp_args_009 && ! sexp_args_009[2]){ + var + arg0_010 = sexp_args_009[1], + res0_011 = caml_call1(of_a_001, arg0_010); + return [0, res0_011]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + if(! switch$2){ + var sexp_args_014 = _g_[2]; + if(sexp_args_014 && ! sexp_args_014[2]){ + var + arg0_015 = sexp_args_014[1], + res0_016 = caml_call1(of_b_002, arg0_015); + return [1, res0_016]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_005, + tag_008, + sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_007); + } + function sexp_of_t(of_a_019, of_b_020, param){ + if(0 === param[0]){ + var arg0_021 = param[1], res0_022 = caml_call1(of_a_019, arg0_021); + return [1, [0, _a_, [0, res0_022, 0]]]; + } + var arg0_023 = param[1], res0_024 = caml_call1(of_b_020, arg0_023); + return [1, [0, _b_, [0, res0_024, 0]]]; + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Ok, [0, [0, a_sexp_grammar, 0]]]], + [0, [1, [0, cst_Error, [0, [0, b_sexp_grammar, 0]]]], 0]]]]; + } + function compare(cmp_a, cmp_b, a_027, b_028){ + if(caml_call2(Base_Ppx_compare_lib[1], a_027, b_028)) return 0; + if(0 === a_027[0]){ + var a_029 = a_027[1]; + if(0 !== b_028[0]) return -1; + var b_030 = b_028[1]; + return caml_call2(cmp_a, a_029, b_030); + } + var a_031 = a_027[1]; + if(0 === b_028[0]) return 1; + var b_032 = b_028[1]; + return caml_call2(cmp_b, a_031, b_032); + } + function equal(cmp_a, cmp_b, a_033, b_034){ + if(caml_call2(Base_Ppx_compare_lib[1], a_033, b_034)) return 1; + if(0 === a_033[0]){ + var a_035 = a_033[1]; + if(0 !== b_034[0]) return 0; + var b_036 = b_034[1]; + return caml_call2(cmp_a, a_035, b_036); + } + var a_037 = a_033[1]; + if(0 === b_034[0]) return 0; + var b_038 = b_034[1]; + return caml_call2(cmp_b, a_037, b_038); + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + if(0 === arg[0]){ + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + } + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + } + function bind(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return caml_call1(f, x$0); + } + var + map = + [0, + -198771759, + function(x, f){ + if(0 !== x[0]) return x; + var x$0 = x[1]; + return [0, caml_call1(f, x$0)]; + }]; + function return$0(x){return [0, x];} + var + include = caml_call1(Base_Monad[2], [0, bind, map, return$0]), + symbol_bind = include[1], + symbol_map = include[2], + Let_syntax = include[3], + Monad_infix = include[4], + bind$0 = include[5], + return$1 = include[6], + map$0 = include[7], + join = include[8], + ignore_m = include[9], + all = include[10], + all_unit = include[11]; + function invariant(check_ok, check_error, t){ + if(0 === t[0]){var ok = t[1]; return caml_call1(check_ok, ok);} + var error = t[1]; + return caml_call1(check_error, error); + } + function fail(x){return [1, x];} + function failf(format){return caml_call2(Base_Printf[4], fail, format);} + function map_error(t, f){ + if(0 === t[0]) return t; + var x = t[1]; + return [1, caml_call1(f, x)]; + } + function bind$1(x, f){ + if(0 === x[0]) return x; + var e = x[1]; + return caml_call1(f, e); + } + var map$1 = [0, -198771759, map_error]; + function return$2(e){return [1, e];} + var Error = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]); + function is_ok(param){return 0 === param[0] ? 1 : 0;} + function is_error(param){return 0 === param[0] ? 0 : 1;} + function ok(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function error(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + } + function of_option(opt, error){ + if(! opt) return [1, error]; + var x = opt[1]; + return [0, x]; + } + function iter(v, f){ + if(0 !== v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function iter_error(v, f){ + if(0 === v[0]) return 0; + var x = v[1]; + return caml_call1(f, x); + } + function to_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function of_either(param){ + if(0 === param[0]){var x = param[1]; return [0, x];} + var x$0 = param[1]; + return [1, x$0]; + } + function ok_if_true(bool, error){return bool ? _c_ : [1, error];} + function try_with(f){ + try{var _e_ = [0, caml_call1(f, 0)]; return _e_;} + catch(exn$0){var exn = caml_wrap_exception(exn$0); return [1, exn];} + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var exn = param[1]; + throw caml_maybe_attach_backtrace(exn, 1); + } + function ok_or_failwith(param){ + if(0 === param[0]){var x = param[1]; return x;} + var str = param[1]; + return caml_call1(Base_Import[124], str); + } + function combine(t1, t2, ok, err){ + if(0 === t1[0]){ + var ok1 = t1[1]; + if(0 === t2[0]){var ok2 = t2[1]; return [0, caml_call2(ok, ok1, ok2)];} + var e = t2[1]; + } + else{ + var err1 = t1[1]; + if(0 !== t2[0]){ + var err2 = t2[1]; + return [1, caml_call2(err, err1, err2)]; + } + var e = err1; + } + return [1, e]; + } + function combine_errors(l){ + var + match = caml_call2(Base_List1[24], l, to_either), + errs = match[2], + ok = match[1]; + return errs ? [1, errs] : [0, ok]; + } + function combine_errors_unit(l){ + function _d_(param){return 0;} + return caml_call2(map$0, combine_errors(l), _d_); + } + var + Base_Result = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + equal, + hash_fold_t, + symbol_bind, + symbol_map, + Let_syntax, + Monad_infix, + bind$0, + return$1, + join, + ignore_m, + all, + all_unit, + Error, + invariant, + fail, + failf, + is_ok, + is_error, + ok, + ok_exn, + ok_or_failwith, + error, + of_option, + iter, + iter_error, + map$0, + map_error, + combine, + combine_errors, + combine_errors_unit, + to_either, + of_either, + to_either, + ok_if_true, + try_with, + [0, is_ok, is_error]]; + runtime.caml_register_global(21, Base_Result, "Base__Result"); + return; + } + (globalThis)); + +//# 4816 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + Continue_or_stop = [0], + Export = [0, Continue_or_stop], + Continue_or_stop$0 = Export[1], + Base_Container_intf = [0, Export, Continue_or_stop$0]; + runtime.caml_register_global + (0, Base_Container_intf, "Base__Container_intf"); + return; + } + (globalThis)); + +//# 4832 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Array0 = global_data.Base__Array0, + Base_Import = global_data.Base__Import, + Base_List0 = global_data.Base__List0, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iter(fold, t, f){ + return caml_call3 + (fold, t, 0, function(param, a){return caml_call1(f, a);}); + } + function count(fold, t, f){ + return caml_call3 + (fold, + t, + 0, + function(n, a){ + return caml_call1(f, a) ? caml_call2(Base_Import[91], n, 1) : n; + }); + } + function sum(fold, M){ + return function(t, f){ + function _h_(n, a){ + var _i_ = caml_call1(f, a); + return caml_call2(M[2], n, _i_); + } + return caml_call3(fold, t, M[1], _h_);}; + } + function fold_result(fold, init, f, t){ + return caml_call1 + (with_return, + function(param){ + return [0, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var e = caml_call2(f, acc, item); + if(0 !== e[0]) return caml_call1(param, e); + var x = e[1]; + return x; + })]; + }); + } + function fold_until(fold, init, f, finish, t){ + return caml_call1 + (with_return, + function(param){ + return caml_call1 + (finish, + caml_call3 + (fold, + t, + init, + function(acc, item){ + var match = caml_call2(f, acc, item); + if(0 === match[0]){var x = match[1]; return x;} + var x$0 = match[1]; + return caml_call1(param, x$0); + })); + }); + } + function min_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var min = acc[1]; + return 0 < caml_call2(compare, min, elt) ? [0, elt] : acc; + }); + } + function max_elt(fold, t, compare){ + return caml_call3 + (fold, + t, + 0, + function(acc, elt){ + if(! acc) return [0, elt]; + var max = acc[1]; + return 0 <= caml_call2(compare, max, elt) ? acc : [0, elt]; + }); + } + function length(fold, c){ + return caml_call3 + (fold, + c, + 0, + function(acc, param){return caml_call2(Base_Import[91], acc, 1);}); + } + function is_empty(iter, c){ + return caml_call1 + (with_return, + function(r){ + caml_call2(iter, c, function(param){return caml_call1(r, 0);}); + return 1; + }); + } + function exists(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _g_ = caml_call1(f, x); + return _g_ ? caml_call1(r, 1) : _g_; + }); + return 0; + }); + } + function for_all(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _f_ = 1 - caml_call1(f, x); + return _f_ ? caml_call1(r, 0) : _f_; + }); + return 1; + }); + } + function find_map(iter, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + t, + function(x){ + var res = caml_call1(f, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function find(iter, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iter, + c, + function(x){ + var _e_ = caml_call1(f, x); + return _e_ ? caml_call1(r, [0, x]) : _e_; + }); + return 0; + }); + } + function to_list(fold, c){ + var _d_ = caml_call3(fold, c, 0, function(acc, x){return [0, x, acc];}); + return caml_call1(Base_List0[21], _d_); + } + function to_array(length, iter, c){ + var array = [0, [0]], i = [0, 0]; + caml_call2 + (iter, + c, + function(x){ + if(0 === i[1]){ + var _b_ = caml_call1(length, c); + array[1] = caml_call2(Base_Array0[4], _b_, x); + } + var _c_ = i[1]; + runtime.caml_check_bound(array[1], _c_)[1 + _c_] = x; + return caml_call1(Base_Import[130], i); + }); + return array[1]; + } + function Make_gen(T){ + var fold = T[1], match = T[2]; + if(typeof match === "number") + var iter$0 = function(t, f){return iter(fold, t, f);}; + else + var iter$1 = match[2], iter$0 = iter$1; + var match$0 = T[3]; + if(typeof match$0 === "number") + var length$0 = function(t){return length(fold, t);}; + else + var length$1 = match$0[2], length$0 = length$1; + function is_empty$0(t){return is_empty(iter$0, t);} + function sum$0(m, t){return caml_call1(sum(fold, m), t);} + function count$0(t, f){return count(fold, t, f);} + function exists$0(t, f){return exists(iter$0, t, f);} + function for_all$0(t, f){return for_all(iter$0, t, f);} + function find_map$0(t, f){return find_map(iter$0, t, f);} + function find$0(t, f){return find(iter$0, t, f);} + function to_list$0(t){return to_list(fold, t);} + function to_array$0(t){return to_array(length$0, iter$0, t);} + function min_elt$0(t, compare){return min_elt(fold, t, compare);} + function max_elt$0(t, compare){return max_elt(fold, t, compare);} + function fold_result$0(t, init, f){return fold_result(fold, init, f, t);} + function fold_until$0(t, init, f, finish){ + return fold_until(fold, init, f, finish, t); + } + return [0, + length$0, + is_empty$0, + iter$0, + fold, + fold_result$0, + fold_until$0, + exists$0, + for_all$0, + count$0, + sum$0, + find$0, + find_map$0, + to_list$0, + to_array$0, + min_elt$0, + max_elt$0]; + } + function _a_(T){ + var + fold = T[2], + iter = T[3], + length = T[4], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, elt){ + return caml_call2(exists, t, caml_call1(T[1][1], elt)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + } + var + Base_Container = + [0, + iter, + count, + min_elt, + max_elt, + length, + to_list, + sum, + fold_result, + fold_until, + is_empty, + exists, + for_all, + find, + find_map, + to_array, + function(T){ + var + fold = T[1], + iter = T[2], + length = T[3], + include = Make_gen([0, fold, iter, length]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16]; + function mem(t, a, equal){ + return caml_call2(exists, t, caml_call1(equal, a)); + } + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt]; + }, + _a_, + Make_gen]; + runtime.caml_register_global(4, Base_Container, "Base__Container"); + return; + } + (globalThis)); + +//# 5186 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Import = global_data.Base__Import, + Stdlib_Lazy = global_data.Stdlib__Lazy, + Base_Hash = global_data.Base__Hash, + Base_Monad = global_data.Base__Monad, + Undefined = Stdlib_Lazy[1], + is_val = Stdlib_Lazy[3], + from_val = Stdlib_Lazy[4], + from_fun = Stdlib_Lazy[6], + force_val = Stdlib_Lazy[7], + t_of_sexp = Base_Import[172], + sexp_of_t = Base_Import[148], + cst_unforced_lazy = ""; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[193], a_sexp_grammar); + } + function _a_(t, f){ + return [246, + function(_q_){ + var _r_ = caml_obj_tag(t); + if(250 === _r_) + var _s_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _r_ && 244 !== _r_){var _s_ = t; switch$0 = 1;} + if(! switch$0) var _s_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(f, _s_); + }]; + } + function compare(compare_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 0; + var _m_ = caml_obj_tag(t2); + if(250 === _m_) + var _n_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _m_ && 244 !== _m_){var _n_ = t2; switch$0 = 1;} + if(! switch$0) var _n_ = caml_call1(CamlinternalLazy[2], t2); + } + var _o_ = caml_obj_tag(t1); + if(250 === _o_) + var _p_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _o_ && 244 !== _o_){var _p_ = t1; switch$1 = 1;} + if(! switch$1) var _p_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(compare_a, _p_, _n_); + } + function equal(equal_a, t1, t2){ + if(caml_call2(Base_Import[128], t1, t2)) return 1; + var _i_ = caml_obj_tag(t2); + if(250 === _i_) + var _j_ = t2[1]; + else{ + var switch$0 = 0; + if(246 !== _i_ && 244 !== _i_){var _j_ = t2; switch$0 = 1;} + if(! switch$0) var _j_ = caml_call1(CamlinternalLazy[2], t2); + } + var _k_ = caml_obj_tag(t1); + if(250 === _k_) + var _l_ = t1[1]; + else{ + var switch$1 = 0; + if(246 !== _k_ && 244 !== _k_){var _l_ = t1; switch$1 = 1;} + if(! switch$1) var _l_ = caml_call1(CamlinternalLazy[2], t1); + } + return caml_call2(equal_a, _l_, _j_); + } + var hash_fold_t = Base_Hash[13][12]; + function return$0(x){return caml_call1(from_val, x);} + function bind(t, f){ + return [246, + function(_d_){ + var _e_ = caml_obj_tag(t); + if(250 === _e_) + var _f_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _e_ && 244 !== _e_){var _f_ = t; switch$0 = 1;} + if(! switch$0) var _f_ = caml_call1(CamlinternalLazy[2], t); + } + var _g_ = caml_call1(f, _f_), _h_ = caml_obj_tag(_g_); + if(250 === _h_) return _g_[1]; + if(246 !== _h_ && 244 !== _h_) return _g_; + return caml_call1(CamlinternalLazy[2], _g_); + }]; + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function sexp_of_t$0(sexp_of_a, t){ + if(! caml_call1(is_val, t)) + return caml_call1(Base_Import[139], cst_unforced_lazy); + var _b_ = caml_obj_tag(t); + if(250 === _b_) + var _c_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = t; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(sexp_of_a, _c_); + } + var + T_unforcing = [0, sexp_of_t$0], + Base_Lazy = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + Undefined, + force_val, + from_fun, + from_val, + is_val, + T_unforcing]; + runtime.caml_register_global(6, Base_Lazy, "Base__Lazy"); + return; + } + (globalThis)); + +//# 5351 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Info_intf = [0]; + runtime.caml_register_global(0, Base_Info_intf, "Base__Info_intf"); + return; + } + (globalThis)); + +//# 5361 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + invalid_argf = Base_Printf[7], + _a_ = + [0, + [11, "Negative position: ", [4, 0, 0, 0, 0]], + "Negative position: %d"], + _b_ = + [0, [11, "Negative length: ", [4, 0, 0, 0, 0]], "Negative length: %d"], + _c_ = + [0, + [11, + "pos + len past end: ", + [4, 0, 0, 0, [11, " + ", [4, 0, 0, 0, [11, " > ", [4, 0, 0, 0, 0]]]]]], + "pos + len past end: %d + %d > %d"]; + function slow_check_pos_len_exn(pos, len, total_length){ + if(pos < 0) caml_call3(invalid_argf, _a_, pos, 0); + if(len < 0) caml_call3(invalid_argf, _b_, len, 0); + var _h_ = caml_call2(Base_Import[93], total_length, len) < pos ? 1 : 0; + return _h_ + ? caml_call5(invalid_argf, _c_, pos, len, total_length, 0) + : _h_; + } + function check_pos_len_exn(pos, len, total_length){ + var + stop = caml_call2(Base_Import[91], pos, len), + _d_ = caml_call2(Base_Import[93], total_length, stop), + _e_ = caml_call2(Base_Import[118], pos, len), + _f_ = caml_call2(Base_Import[118], _e_, stop), + _g_ = caml_call2(Base_Import[118], _f_, _d_) < 0 ? 1 : 0; + return _g_ ? slow_check_pos_len_exn(pos, len, total_length) : _g_; + } + function get_pos_len_exn(opt, len, param, total_length){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], len$0 = i; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + check_pos_len_exn(pos, len$0, total_length); + return [0, pos, len$0]; + } + var + Private = [0, slow_check_pos_len_exn], + Base_Ordered_collection_common = + [0, get_pos_len_exn, check_pos_len_exn, Private]; + runtime.caml_register_global + (5, Base_Ordered_collection_common, "Base__Ordered_collection_common0"); + return; + } + (globalThis)); + +//# 5435 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Domain = global_data.Stdlib__Domain, + Stdlib_Random = global_data.Stdlib__Random, + Stdlib_Lazy = global_data.Stdlib__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy; + function of_state(_f_){return _f_;} + var Repr = [0, of_state]; + function assign(dst, src){ + var _b_ = caml_obj_tag(dst); + if(250 === _b_) + var _c_ = dst[1]; + else{ + var switch$0 = 0; + if(246 !== _b_ && 244 !== _b_){var _c_ = dst; switch$0 = 1;} + if(! switch$0) var _c_ = caml_call1(CamlinternalLazy[2], dst); + } + var dst$0 = caml_call1(Repr[1], _c_), _d_ = caml_obj_tag(src); + if(250 === _d_) + var _e_ = src[1]; + else{ + var switch$1 = 0; + if(246 !== _d_ && 244 !== _d_){var _e_ = src; switch$1 = 1;} + if(! switch$1) var _e_ = caml_call1(CamlinternalLazy[2], src); + } + var src$0 = caml_call1(Repr[1], _e_); + return runtime.caml_ba_blit(src$0, dst$0); + } + function make_default(default$0){ + function split_from_parent(v){ + return caml_call2(Stdlib_Lazy[5], Stdlib_Random[15][15], v); + } + function _a_(param){return default$0;} + return caml_call2(Stdlib_Domain[10][1], [0, split_from_parent], _a_); + } + function get_state(random_key){ + return caml_call1(Stdlib_Domain[10][2], random_key); + } + var Base_Random_repr = [0, Repr, assign, make_default, get_state]; + runtime.caml_register_global(4, Base_Random_repr, "Base__Random_repr"); + return; + } + (globalThis)); + +//# 5495 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_greaterequal = runtime.caml_greaterequal, + caml_int64_add = runtime.caml_int64_add, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_left = runtime.caml_int64_shift_left, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_int64_xor = runtime.caml_int64_xor, + caml_obj_tag = runtime.caml_obj_tag; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random_repr = global_data.Base__Random_repr, + Base_Import = global_data.Base__Import, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Int0 = global_data.Base__Int0, + Base_Printf = global_data.Base__Printf, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Random = global_data.Stdlib__Random, + Base_Lazy = global_data.Base__Lazy, + Base_Char0 = global_data.Base__Char0, + Base_Word_size = global_data.Base__Word_size, + cst_float = "float", + cst_int64 = "int64", + _b_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + cst_nativeint = "nativeint", + cst_int32 = "int32", + cst_int = "int", + _a_ = + [0, + [11, + "Random.", + [2, + 0, + [11, ": crossed bounds [", [2, 0, [11, " > ", [2, 0, [12, 93, 0]]]]]]], + "Random.%s: crossed bounds [%s > %s]"], + cst_initializing_Random_with_a = + "initializing Random with a nondeterministic seed is forbidden in inline tests"; + function forbid_nondeterminism_in_tests(allow_in_tests){ + var _M_ = Base_Import[132]; + if(! _M_) return _M_; + if(allow_in_tests && allow_in_tests[1]) return 0; + return caml_call1(Base_Import[124], cst_initializing_Random_with_a); + } + function bits(t){ + var _K_ = caml_obj_tag(t); + if(250 === _K_) + var _L_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _K_ && 244 !== _K_){var _L_ = t; switch$0 = 1;} + if(! switch$0) var _L_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][4], _L_); + } + function bool(t){ + var _I_ = caml_obj_tag(t); + if(250 === _I_) + var _J_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _I_ && 244 !== _I_){var _J_ = t; switch$0 = 1;} + if(! switch$0) var _J_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call1(Stdlib_Random[15][11], _J_); + } + function int$0(t, x){ + var _G_ = caml_obj_tag(t); + if(250 === _G_) + var _H_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _G_ && 244 !== _G_){var _H_ = t; switch$0 = 1;} + if(! switch$0) var _H_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][5], _H_, x); + } + function int32(t, x){ + var _E_ = caml_obj_tag(t); + if(250 === _E_) + var _F_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _E_ && 244 !== _E_){var _F_ = t; switch$0 = 1;} + if(! switch$0) var _F_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][7], _F_, x); + } + function int64(t, x){ + var _C_ = caml_obj_tag(t); + if(250 === _C_) + var _D_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _C_ && 244 !== _C_){var _D_ = t; switch$0 = 1;} + if(! switch$0) var _D_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][9], _D_, x); + } + function nativeint(t, x){ + var _A_ = caml_obj_tag(t); + if(250 === _A_) + var _B_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _A_ && 244 !== _A_){var _B_ = t; switch$0 = 1;} + if(! switch$0) var _B_ = caml_call1(CamlinternalLazy[2], t); + } + return caml_call2(Stdlib_Random[15][8], _B_, x); + } + function make(seed){ + var _z_ = caml_call1(Stdlib_Random[15][1], seed); + return caml_call1(Base_Lazy[21], _z_); + } + function copy(t){ + var _w_ = caml_obj_tag(t); + if(250 === _w_) + var _x_ = t[1]; + else{ + var switch$0 = 0; + if(246 !== _w_ && 244 !== _w_){var _x_ = t; switch$0 = 1;} + if(! switch$0) var _x_ = caml_call1(CamlinternalLazy[2], t); + } + var _y_ = caml_call1(Stdlib_Random[15][3], _x_); + return caml_call1(Base_Lazy[21], _y_); + } + function char$0(t){ + var _v_ = int$0(t, 256); + return caml_call1(Base_Char0[5], _v_); + } + function ascii(t){ + var _u_ = int$0(t, 128); + return caml_call1(Base_Char0[5], _u_); + } + function make_self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + var _t_ = caml_call1(Stdlib_Random[15][2], 0); + return caml_call1(Base_Lazy[21], _t_); + } + var assign = Base_Random_repr[2]; + if(Base_Import[132]){ + var t = caml_call1(Stdlib_Random[16], 0); + caml_call1(Stdlib_Random[1], 137); + var default$0 = caml_call1(Base_Lazy[21], t); + } + else + var + default$0 = + [246, + function(param){ + var _r_ = make_self_init(0, 0), _s_ = caml_obj_tag(_r_); + if(250 === _s_) return _r_[1]; + if(246 !== _s_ && 244 !== _s_) return _r_; + return caml_call1(CamlinternalLazy[2], _r_); + }]; + function int_on_64bits(t, bound){ + return 1073741823 < bound + ? caml_int64_to_int32(int64(t, caml_int64_of_int32(bound))) + : int$0(t, bound); + } + function int_on_32bits(t, bound){ + return 1073741823 < bound ? int32(t, bound) : int$0(t, bound); + } + var int$1 = Base_Word_size[3] ? int_on_64bits : int_on_32bits; + function bits$0(state){return caml_int64_of_int32(bits(state));} + function full_range_int64(state){ + var + _p_ = caml_int64_shift_left(bits$0(state), 60), + _q_ = caml_int64_xor(caml_int64_shift_left(bits$0(state), 30), _p_); + return caml_int64_xor(bits$0(state), _q_); + } + function bits$1(state){return bits(state);} + function full_range_int32(state){ + var _o_ = bits$1(state) << 30; + return bits$1(state) ^ _o_; + } + function full_range_int_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_int_on_32bits(state){return full_range_int32(state);} + var + full_range_int_on_64bits$0 = + Base_Word_size[3] ? full_range_int_on_64bits : full_range_int_on_32bits; + function full_range_nativeint_on_64bits(state){ + return caml_int64_to_int32(full_range_int64(state)); + } + function full_range_nativeint_on_32bits(state){return full_range_int32(state); + } + var + full_range_nativeint = + Base_Word_size[3] + ? full_range_nativeint_on_64bits + : full_range_nativeint_on_32bits; + function raise_crossed_bounds + (name, lower_bound, upper_bound, string_of_bound){ + var + _m_ = caml_call1(string_of_bound, upper_bound), + _n_ = caml_call1(string_of_bound, lower_bound); + return caml_call5(Base_Printf[6], _a_, name, _n_, _m_, 0); + } + function int_incl(state, lo, hi){ + if(hi < lo) raise_crossed_bounds(cst_int, lo, hi, Base_Int0[1]); + var diff = caml_call2(Base_Import[93], hi, lo); + if(diff === Base_Int0[5]){ + var + _i_ = Base_Int0[5], + _j_ = full_range_int_on_64bits$0(state), + _k_ = caml_call2(Base_Import[116], _j_, _i_); + return caml_call2(Base_Import[91], lo, _k_); + } + if(0 <= diff){ + var _l_ = int$1(state, caml_call1(Base_Int0[7], diff)); + return caml_call2(Base_Import[91], lo, _l_); + } + for(;;){ + var int$0 = full_range_int_on_64bits$0(state); + if(lo <= int$0 && int$0 <= hi) return int$0; + } + } + function int32_incl(state, lo, hi){ + if(caml_call2(Base_Import[102][5], lo, hi)) + raise_crossed_bounds(cst_int32, lo, hi, Stdlib_Int32[14]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[102][4], diff, Stdlib_Int32[9])){ + var _h_ = Stdlib_Int32[9]; + return lo + (full_range_int32(state) & _h_) | 0; + } + if(caml_call2(Base_Import[102][6], diff, 0)) + return lo + int32(state, caml_call1(Stdlib_Int32[6], diff)) | 0; + for(;;){ + var int$0 = full_range_int32(state); + if + (caml_call2(Base_Import[102][6], int$0, lo) + && caml_call2(Base_Import[102][2], int$0, hi)) + return int$0; + } + } + function nativeint_incl(state, lo, hi){ + if(caml_call2(Base_Import[104][5], lo, hi)) + raise_crossed_bounds(cst_nativeint, lo, hi, Stdlib_Nativeint[15]); + var diff = hi - lo | 0; + if(caml_call2(Base_Import[104][4], diff, Stdlib_Nativeint[10])){ + var _g_ = Stdlib_Nativeint[10]; + return lo + (full_range_nativeint(state) & _g_) | 0; + } + if(caml_call2(Base_Import[104][6], diff, 0)) + return lo + nativeint(state, caml_call1(Stdlib_Nativeint[6], diff)) | 0; + for(;;){ + var int$0 = full_range_nativeint(state); + if + (caml_call2(Base_Import[104][6], int$0, lo) + && caml_call2(Base_Import[104][2], int$0, hi)) + return int$0; + } + } + function int64_incl(state, lo, hi){ + if(runtime.caml_greaterthan(lo, hi)) + raise_crossed_bounds(cst_int64, lo, hi, Stdlib_Int64[14]); + var diff = runtime.caml_int64_sub(hi, lo); + if(runtime.caml_equal(diff, Stdlib_Int64[9])){ + var _f_ = Stdlib_Int64[9]; + return caml_int64_add + (lo, runtime.caml_int64_and(full_range_int64(state), _f_)); + } + if(caml_greaterequal(diff, _b_)) + return caml_int64_add + (lo, int64(state, caml_call1(Stdlib_Int64[6], diff))); + for(;;){ + var int$0 = full_range_int64(state); + if(caml_greaterequal(int$0, lo) && runtime.caml_lessequal(int$0, hi)) + return int$0; + } + } + function float$0(state, hi){ + for(;;){ + var + r1 = bits(state), + r2 = bits(state), + _d_ = caml_call2(Base_Import[90], r1, 9.313225746154785e-10), + _e_ = caml_call2(Base_Import[92], _d_, r2), + result = caml_call2(Base_Import[90], _e_, 9.313225746154785e-10); + if(caml_call2(Base_Import[108][1], result, 1.)) + return caml_call2(Base_Import[90], result, hi); + } + } + function float_range(state, lo, hi){ + if(caml_call2(Base_Import[108][5], lo, hi)) + raise_crossed_bounds(cst_float, lo, hi, Base_Import[85][34]); + var _c_ = float$0(state, caml_call2(Base_Import[94], hi, lo)); + return caml_call2(Base_Import[92], lo, _c_); + } + var default$1 = caml_call1(Base_Random_repr[3], default$0); + function bits$2(param){ + return bits(caml_call1(Base_Random_repr[4], default$1)); + } + function int$2(x){ + return int$1(caml_call1(Base_Random_repr[4], default$1), x); + } + function int32$0(x){ + return int32(caml_call1(Base_Random_repr[4], default$1), x); + } + function nativeint$0(x){ + return nativeint(caml_call1(Base_Random_repr[4], default$1), x); + } + function int64$0(x){ + return int64(caml_call1(Base_Random_repr[4], default$1), x); + } + function float$1(x){ + return float$0(caml_call1(Base_Random_repr[4], default$1), x); + } + function int_incl$0(x, y){ + return int_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int32_incl$0(x, y){ + return int32_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function nativeint_incl$0(x, y){ + return nativeint_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function int64_incl$0(x, y){ + return int64_incl(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function float_range$0(x, y){ + return float_range(caml_call1(Base_Random_repr[4], default$1), x, y); + } + function bool$0(param){ + return bool(caml_call1(Base_Random_repr[4], default$1)); + } + function char$1(param){ + return char$0(caml_call1(Base_Random_repr[4], default$1)); + } + function ascii$0(param){ + return ascii(caml_call1(Base_Random_repr[4], default$1)); + } + function full_init(seed){ + var t = caml_call1(Base_Random_repr[4], default$1); + return caml_call2(assign, t, make(seed)); + } + function init(seed){return full_init([0, seed]);} + function self_init(allow_in_tests, param){ + forbid_nondeterminism_in_tests(allow_in_tests); + return full_init(runtime.caml_sys_random_seed(0)); + } + function set_state(s){ + return caml_call2(assign, caml_call1(Base_Random_repr[4], default$1), s); + } + var + Base_Random = + [0, + init, + full_init, + self_init, + bits$2, + int$2, + int32$0, + nativeint$0, + int64$0, + float$1, + int_incl$0, + int32_incl$0, + nativeint_incl$0, + int64_incl$0, + float_range$0, + bool$0, + char$1, + ascii$0, + [0, + default$0, + make, + make_self_init, + copy, + bits, + int$1, + int32, + nativeint, + int64, + float$0, + int_incl, + int32_incl, + nativeint_incl, + int64_incl, + float_range, + bool, + char$0, + ascii], + set_state]; + runtime.caml_register_global(24, Base_Random, "Base__Random"); + return; + } + (globalThis)); + +//# 5907 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + Base_Array0 = global_data.Base__Array0, + invalid_argf = Base_Array0[1], + Array = Base_Array0[2], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + blit = Base_Array0[7], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23]; + function permute(opt, _a_, len, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(_a_) var sth$0 = _a_[1], pos = sth$0; else var pos = 0; + var total_length = t.length - 1; + if(len) + var l = len[1], len$0 = l; + else + var len$0 = caml_call2(Base_Import[93], total_length, pos); + caml_call3(Base_Ordered_collection_common[2], pos, len$0, total_length); + var num_swaps = caml_call2(Base_Import[93], len$0, 1); + if(num_swaps >= 1){ + var i = num_swaps; + for(;;){ + var + this_i = caml_call2(Base_Import[91], pos, i), + _b_ = caml_call2(Base_Import[91], i, 1), + _c_ = caml_call2(Base_Random[18][6], random_state, _b_), + random_i = caml_call2(Base_Import[91], pos, _c_); + caml_call3(swap, t, this_i, random_i); + var _d_ = i - 1 | 0; + if(1 !== i){var i = _d_; continue;} + break; + } + } + return 0; + } + var + Base_Array_permute = + [0, + invalid_argf, + Array, + max_length, + create, + create_float_uninitialized, + append, + blit, + concat, + copy, + fill, + init, + make_matrix, + of_list, + sub, + to_list, + fold, + fold_right, + iter, + iteri, + map, + mapi, + stable_sort, + swap, + permute]; + runtime.caml_register_global(4, Base_Array_permute, "Base__Array_permute"); + return; + } + (globalThis)); + +//# 6023 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import; + function const$0(c, param){return c;} + function non(f, x){return 1 - caml_call1(f, x);} + function forever(f){ + try{for(;;) caml_call1(f, 0);} + catch(e$0){var e = caml_wrap_exception(e$0); return e;} + } + function compose(f, g, x){return caml_call1(f, caml_call1(g, x));} + function flip(f, x, y){return caml_call2(f, y, x);} + function apply_n_times(n, f, x){ + var n$0 = n, x$0 = x; + for(;;){ + if(0 >= n$0) return x$0; + var + x$1 = caml_call1(f, x$0), + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + x$0 = x$1; + } + } + var Base_Fn = [0, const$0, non, forever, apply_n_times, compose, flip]; + runtime.caml_register_global(1, Base_Fn, "Base__Fn"); + return; + } + (globalThis)); + +//# 6069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Equal = "Equal", + cst_Greater = "Greater", + cst_Less = "Less", + cst_equal = "equal", + cst_greater = "greater", + cst_less = "less", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, [0, 2, 0]]], + error_source_005 = "ordering.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Less, 0]], + [0, [1, [0, cst_Equal, 0]], [0, [1, [0, cst_Greater, 0]], 0]]]]], + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + compare = caml_int_compare, + _a_ = [0, cst_Less], + _b_ = [0, cst_Equal], + _c_ = [0, cst_Greater]; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function hash(arg){ + var hsv = caml_call2(Base_Hash[11], 0, 0), _h_ = hash_fold_t(hsv, arg); + return caml_call1(Base_Hash[9], _h_); + } + function t_of_sexp(sexp_006){ + if(0 === sexp_006[0]){ + var _d_ = sexp_006[1], switch$0 = 0; + if(caml_string_notequal(_d_, cst_Equal)){ + var switch$1 = 0; + if(caml_string_notequal(_d_, cst_Greater)){ + var switch$2 = 0; + if(caml_string_notequal(_d_, cst_Less)){ + if(caml_string_notequal(_d_, cst_equal)) + if(caml_string_notequal(_d_, cst_greater)) + if(caml_string_notequal(_d_, cst_less)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 0; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 1; + } + else{ + var _e_ = sexp_006[1]; + if(! _e_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_005, sexp_006); + var _f_ = _e_[1]; + if(0 !== _f_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_005, sexp_006); + var _g_ = _f_[1], switch$3 = 0; + if(caml_string_notequal(_g_, cst_Equal)){ + var switch$4 = 0; + if(caml_string_notequal(_g_, cst_Greater)){ + var switch$5 = 0; + if(caml_string_notequal(_g_, cst_Less)){ + if(caml_string_notequal(_g_, cst_equal)) + if(caml_string_notequal(_g_, cst_greater)) + if(caml_string_notequal(_g_, cst_less)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_005, sexp_006); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_005, sexp_006); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + function equal(a, b){return 0 === caml_int_compare(a, b) ? 1 : 0;} + var Export = [0]; + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + var + Base_Ordering = + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + all, + equal, + of_int, + to_int, + Export]; + runtime.caml_register_global(20, Base_Ordering, "Base__Ordering"); + return; + } + (globalThis)); + +//# 6223 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Base_Sys0 = global_data.Base__Sys0, + backend_type = Base_Sys0[1], + interactive = Base_Sys0[2], + os_type = Base_Sys0[3], + unix = Base_Sys0[4], + win32 = Base_Sys0[5], + cygwin = Base_Sys0[6], + word_size_in_bits = Base_Sys0[7], + int_size_in_bits = Base_Sys0[8], + big_endian = Base_Sys0[9], + max_string_length = Base_Sys0[10], + max_array_length = Base_Sys0[11], + runtime_variant = Base_Sys0[12], + runtime_parameters = Base_Sys0[13], + argv = Base_Sys0[14], + get_argv = Base_Sys0[15], + ocaml_version = Base_Sys0[16], + enable_runtime_warnings = Base_Sys0[17], + runtime_warnings_enabled = Base_Sys0[18], + getenv_exn = Base_Sys0[19], + getenv = Base_Sys0[20], + Base_Sys = + [0, + get_argv, + argv, + interactive, + os_type, + unix, + win32, + cygwin, + backend_type, + word_size_in_bits, + int_size_in_bits, + big_endian, + max_string_length, + max_array_length, + runtime_variant, + runtime_parameters, + ocaml_version, + enable_runtime_warnings, + runtime_warnings_enabled, + getenv, + getenv_exn]; + runtime.caml_register_global(1, Base_Sys, "Base__Sys"); + return; + } + (globalThis)); + +//# 6279 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst = " <> ", + cst$0 = ": ", + cst_length_mismatch_in = "length mismatch in ", + cst_src_list_ml = "src/list.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_022 = "list.ml.Assoc.t", + Base_Import = global_data.Base__Import, + Base_Container = global_data.Base__Container, + Assert_failure = global_data.Assert_failure, + Base_Random = global_data.Base__Random, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Result = global_data.Base__Result, + Base_Ordering = global_data.Base__Ordering, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_List1 = global_data.Base__List1, + Base_Printf = global_data.Base__Printf, + Base_Sys = global_data.Base__Sys, + Base_Applicative = global_data.Base__Applicative, + Base_Monad = global_data.Base__Monad, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + hd_exn = Base_List1[1], + length = Base_List1[2], + rev_append = Base_List1[3], + tl_exn = Base_List1[4], + exists = Base_List1[6], + exists2_ok = Base_List1[7], + fold_left = Base_List1[8], + fold2_ok = Base_List1[9], + for_all = Base_List1[10], + for_all2_ok = Base_List1[11], + iter = Base_List1[12], + iter2_ok = Base_List1[13], + nontail_map = Base_List1[14], + rev_map = Base_List1[17], + rev_map2_ok = Base_List1[18], + sort = Base_List1[19], + stable_sort = Base_List1[20], + rev = Base_List1[21], + fold_right = Base_List1[22], + is_empty = Base_List1[23], + partition_map = Base_List1[24], + invalid_argf = Base_Printf[7], + t_of_sexp = Base_Import[176], + sexp_of_t = Base_Import[152], + cst_List_last = "List.last", + _s_ = [0, "list.ml.Transpose_got_lists_of_different_lengths"], + _t_ = [0, cst_src_list_ml, 1301, 13], + cst_List_random_element_exn_em = "List.random_element_exn: empty list", + cst_List_drop_last_exn_empty_l = "List.drop_last_exn: empty list", + _q_ = + [0, + [11, "List.chunks_of: Expected length > 0, got ", [4, 0, 0, 0, 0]], + "List.chunks_of: Expected length > 0, got %d"], + cst_List_sub = "List.sub", + _o_ = [0, cst_src_list_ml, 1045, 12], + _n_ = [0, cst_src_list_ml, 933, 4], + _m_ = [0, [11, "List.init ", [4, 0, 0, 0, 0]], "List.init %d"], + cst_List_reduce_balanced_exn = "List.reduce_balanced_exn", + _l_ = [0, cst_src_list_ml, 661, 14], + cst_List_reduce_exn = "List.reduce_exn", + _k_ = + [0, + [11, + "length mismatch in zip_exn: ", + [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]], + "length mismatch in zip_exn: %d <> %d"], + cst_map3_exn = "map3_exn", + cst_rev_map3_exn = "rev_map3_exn", + _j_ = [0, cst_src_list_ml, 528, 11], + cst_map2_exn = "map2_exn", + cst_exists2_exn = "exists2_exn", + cst_for_all2_exn = "for_all2_exn", + cst_fold2_exn = "fold2_exn", + cst_rev_map2_exn = "rev_map2_exn", + cst_iter2_exn = "iter2_exn", + _e_ = + [0, + [11, + cst_length_mismatch_in, + [2, + 0, + [11, + cst$0, + [4, + 0, + 0, + 0, + [11, + cst, + [4, + 0, + 0, + 0, + [11, " || ", [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]]]]]], + "length mismatch in %s: %d <> %d || %d <> %d"], + _d_ = + [0, + [11, + cst_length_mismatch_in, + [2, 0, [11, cst$0, [4, 0, 0, 0, [11, cst, [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _c_ = + [0, + [11, + "List.nth_exn ", + [4, 0, 0, 0, [11, " called on list of length ", [4, 0, 0, 0, 0]]]], + "List.nth_exn %d called on list of length %d"], + cst_List_range_stride_must_be_ = "List.range: stride must be non-zero", + cst_List_range_stride_function$0 = + "List.range': stride function cannot change direction", + cst_List_range_stride_function = + "List.range': stride function cannot return the same value", + _a_ = [0, "Ok"], + _b_ = [0, "Unequal_lengths"], + _f_ = [0, "List.find_map_exn: not found"], + _g_ = [0, "List.find_exn: not found"], + _h_ = [0, "List.findi_exn: not found"], + _i_ = [0, "List.find_mapi_exn: not found"], + _p_ = [0, "List.Assoc.find_exn: not found"], + cst_Base_List_Transpose_got_li = + "Base__List.Transpose_got_lists_of_different_lengths"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[195], a_sexp_grammar); + } + function compare(cmp_a, a_006, b_007){ + if(caml_call2(Base_Ppx_compare_lib[1], a_006, b_007)) return 0; + if(! a_006) return b_007 ? 1 : 0; + var a_008 = a_006[1]; + if(! b_007) return -1; + var b_009 = b_007[1]; + return caml_call2(cmp_a, a_008, b_009); + } + function sexp_of_t$0(of_a_010, param){ + if(! param) return _b_; + var arg0_011 = param[1], res0_012 = caml_call1(of_a_010, arg0_011); + return [1, [0, _a_, [0, res0_012, 0]]]; + } + var Or_unequal_lengths = [0, compare, sexp_of_t$0]; + function invariant(f, t){return caml_call2(iter, t, f);} + function of_list(t){return t;} + function range(compare, stride, opt, _a0_, start_i, stop_i){ + if(opt) var sth = opt[1], start = sth; else var start = 104758188; + if(_a0_) var sth$0 = _a0_[1], stop = sth$0; else var stop = -160346914; + var next_i = caml_call1(stride, start_i); + function order(x, y){ + var _a2_ = caml_call2(compare, x, y); + return caml_call1(Base_Ordering[9], _a2_); + } + function raise_stride_cannot_return_sam(param){ + return caml_call1(Base_Import[126], cst_List_range_stride_function); + } + switch(order(start_i, next_i)){ + case 0: + var initial_stride_order = 847855481; break; + case 1: + var initial_stride_order = raise_stride_cannot_return_sam(0); break; + default: var initial_stride_order = 85047514; + } + var + start_i$0 = 104758188 <= start ? start_i : next_i, + i = start_i$0, + accum = 0; + for(;;){ + var i_to_stop_order = order(i, stop_i), switch$0 = 0; + switch(i_to_stop_order){ + case 0: + switch$0 = 847855481 <= initial_stride_order ? 1 : 2; break; + case 1: + var _a1_ = 104758188 <= stop ? [0, i, accum] : accum; break; + default: switch$0 = 847855481 <= initial_stride_order ? 2 : 1; + } + switch(switch$0){ + case 1: + var next_i$0 = caml_call1(stride, i), switch$1 = 0; + switch(order(i, next_i$0)){ + case 0: + switch$1 = 847855481 <= initial_stride_order ? 2 : 1; break; + case 1: + var _a1_ = raise_stride_cannot_return_sam(0); break; + default: switch$1 = 847855481 <= initial_stride_order ? 1 : 2; + } + switch(switch$1){ + case 1: + var + _a1_ = + caml_call1(Base_Import[126], cst_List_range_stride_function$0); + break; + case 2: + var accum$0 = [0, i, accum], i = next_i$0, accum = accum$0; + continue; + } + break; + case 2: + var _a1_ = accum; break; + } + return caml_call1(rev, _a1_); + } + } + function range$0(opt, _aX_, _aW_, start_i, stop_i){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_aX_) var sth$0 = _aX_[1], start = sth$0; else var start = 104758188; + if(_aW_) var sth$1 = _aW_[1], stop = sth$1; else var stop = -160346914; + if(0 === stride) + caml_call1(Base_Import[126], cst_List_range_stride_must_be_); + var _aY_ = [0, stop], _aZ_ = [0, start]; + return range + (runtime.caml_int_compare, + function(x){return caml_call2(Base_Import[91], x, stride);}, + _aZ_, + _aY_, + start_i, + stop_i); + } + function hd(t){if(! t) return 0; var x = t[1]; return [0, x];} + function tl(t){if(! t) return 0; var t$0 = t[2]; return [0, t$0];} + function nth(t, n){ + if(0 > n) return 0; + var t$0 = t, n$0 = n; + for(;;){ + if(! t$0) return 0; + var t$1 = t$0[2], a = t$0[1]; + if(0 === n$0) return [0, a]; + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = t$1, n$0 = n$1; + } + } + function nth_exn(t, n){ + var match = nth(t, n); + if(! match) + return caml_call4(invalid_argf, _c_, n, caml_call1(length, t), 0); + var a = match[1]; + return a; + } + function unordered_append(l1, l2){ + if(l1){ + if(l2) return caml_call2(rev_append, l1, l2); + var l = l1; + } + else + var l = l2; + return l; + } + function of_lists(l1, l2){ + var a = l1, b = l2, shared_length = 0; + for(;;){ + if(a){ + if(b){ + var + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b) return [0, shared_length]; + return [1, shared_length, a, b]; + } + } + function check_length2_exn(name, l1, l2){ + var match = of_lists(l1, l2); + if(0 === match[0]) return 0; + var + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aT_ = caml_call1(length, tail_of_b), + _aU_ = caml_call2(Base_Import[91], shared_length, _aT_), + _aV_ = caml_call1(length, tail_of_a); + return caml_call5 + (invalid_argf, + _d_, + name, + caml_call2(Base_Import[91], shared_length, _aV_), + _aU_, + 0); + } + function check_length2(l1, l2, f){ + return 0 === of_lists(l1, l2)[0] ? [0, caml_call2(f, l1, l2)] : 0; + } + function of_lists$0(l1, l2, l3){ + var a = l1, b = l2, c = l3, shared_length = 0; + for(;;){ + if(a){ + if(b && c){ + var + c$0 = c[2], + b$0 = b[2], + a$0 = a[2], + shared_length$0 = caml_call2(Base_Import[91], shared_length, 1), + a = a$0, + b = b$0, + c = c$0, + shared_length = shared_length$0; + continue; + } + } + else if(! b && ! c) return [0, shared_length]; + return [1, shared_length, a, b, c]; + } + } + function check_length3_exn(name, l1, l2, l3){ + var match = of_lists$0(l1, l2, l3); + if(0 === match[0]) return 0; + var + tail_of_c = match[4], + tail_of_b = match[3], + tail_of_a = match[2], + shared_length = match[1], + _aQ_ = caml_call1(length, tail_of_a), + n1 = caml_call2(Base_Import[91], shared_length, _aQ_), + _aR_ = caml_call1(length, tail_of_b), + n2 = caml_call2(Base_Import[91], shared_length, _aR_), + _aS_ = caml_call1(length, tail_of_c), + n3 = caml_call2(Base_Import[91], shared_length, _aS_); + return caml_call7(invalid_argf, _e_, name, n1, n2, n2, n3, 0); + } + function check_length3(l1, l2, l3, f){ + return 0 === of_lists$0(l1, l2, l3)[0] + ? [0, caml_call3(f, l1, l2, l3)] + : 0; + } + function iter2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aN_){ + var _aO_ = caml_call1(iter2_ok, _aN_); + return function(_aP_){return caml_call2(_aO_, _aP_, f);}; + }); + } + function iter2_exn(l1, l2, f){ + check_length2_exn(cst_iter2_exn, l1, l2); + return caml_call3(iter2_ok, l1, l2, f); + } + function rev_map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aK_){ + var _aL_ = caml_call1(rev_map2_ok, _aK_); + return function(_aM_){return caml_call2(_aL_, _aM_, f);}; + }); + } + function rev_map2_exn(l1, l2, f){ + check_length2_exn(cst_rev_map2_exn, l1, l2); + return caml_call3(rev_map2_ok, l1, l2, f); + } + function fold2(l1, l2, init, f){ + return check_length2 + (l1, + l2, + function(_aH_){ + var _aI_ = caml_call1(fold2_ok, _aH_); + return function(_aJ_){return caml_call3(_aI_, _aJ_, init, f);}; + }); + } + function fold2_exn(l1, l2, init, f){ + check_length2_exn(cst_fold2_exn, l1, l2); + return caml_call4(fold2_ok, l1, l2, init, f); + } + function for_all2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aE_){ + var _aF_ = caml_call1(for_all2_ok, _aE_); + return function(_aG_){return caml_call2(_aF_, _aG_, f);}; + }); + } + function for_all2_exn(l1, l2, f){ + check_length2_exn(cst_for_all2_exn, l1, l2); + return caml_call3(for_all2_ok, l1, l2, f); + } + function exists2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_aB_){ + var _aC_ = caml_call1(exists2_ok, _aB_); + return function(_aD_){return caml_call2(_aC_, _aD_, f);}; + }); + } + function exists2_exn(l1, l2, f){ + check_length2_exn(cst_exists2_exn, l1, l2); + return caml_call3(exists2_ok, l1, l2, f); + } + function mem(t, a, equal){ + var param = t; + for(;;){ + if(! param) return 0; + var bs = param[2], b = param[1], _aA_ = caml_call2(equal, a, b); + if(_aA_) return _aA_; + var param = bs; + } + } + function rev_filter(t, f){ + var accu = 0, param = t; + for(;;){ + if(! param) return accu; + var l = param[2], x = param[1]; + if(caml_call1(f, x)){ + var accu$0 = [0, x, accu], accu = accu$0, param = l; + continue; + } + var param = l; + } + } + function filter(t, f){return caml_call1(rev, rev_filter(t, f));} + function find_map(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1], r = caml_call1(f, x); + if(r) return r; + var param = l; + } + } + var not_found = [0, Base_Import[252], _f_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find(t, f){ + var param = t; + for(;;){ + if(! param) return 0; + var l = param[2], x = param[1]; + if(caml_call1(f, x)) return [0, x]; + var param = l; + } + } + var not_found$0 = [0, Base_Import[252], _g_]; + function find_exn(t, f){ + var t$0 = t; + for(;;){ + if(! t$0) throw caml_maybe_attach_backtrace(not_found$0, 1); + var t$1 = t$0[2], x = t$0[1]; + if(caml_call1(f, x)) return x; + var t$0 = t$1; + } + } + function findi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1]; + if(caml_call2(f, i, x)) return [0, [0, i, x]]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$1 = [0, Base_Import[252], _h_]; + function findi_exn(t, f){ + var match = findi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$1, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var l = t$0[2], x = t$0[1], result = caml_call2(f, i, x); + if(result) return result; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = l; + } + } + var not_found$2 = [0, Base_Import[252], _i_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$2, 1); + var x = match[1]; + return x; + } + function for_alli(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 1; + var tl = t$0[2], hd = t$0[1], _az_ = caml_call2(f, i, hd); + if(! _az_) return _az_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + function existsi(t, f){ + var i = 0, t$0 = t; + for(;;){ + if(! t$0) return 0; + var tl = t$0[2], hd = t$0[1], _ay_ = caml_call2(f, i, hd); + if(_ay_) return _ay_; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, t$0 = tl; + } + } + var to_array = Base_Array0[13]; + function to_list(t){return t;} + var max_non_tailcall = typeof Base_Sys[8] === "number" ? 1000 : 50; + function count_append(l1, l2, count){ + if(! l2) return l1; + if(! l1) return l2; + var _au_ = l1[2], x1 = l1[1]; + if(! _au_) return [0, x1, l2]; + var _av_ = _au_[2], x2 = _au_[1]; + if(! _av_) return [0, x1, [0, x2, l2]]; + var _aw_ = _av_[2], x3 = _av_[1]; + if(! _aw_) return [0, x1, [0, x2, [0, x3, l2]]]; + var match = _aw_[2], x4 = _aw_[1]; + if(! match) return [0, x1, [0, x2, [0, x3, [0, x4, l2]]]]; + var + tl = match[2], + x5 = match[1], + _ax_ = + max_non_tailcall < count + ? caml_call2(rev_append, caml_call1(rev, tl), l2) + : count_append(tl, l2, caml_call2(Base_Import[91], count, 1)); + return [0, x1, [0, x2, [0, x3, [0, x4, [0, x5, _ax_]]]]]; + } + function append(l1, l2){return count_append(l1, l2, 0);} + function count_map(f, l, ctr){ + if(! l) return 0; + var _aq_ = l[2], x1$0 = l[1]; + if(! _aq_){var f1$3 = caml_call1(f, x1$0); return [0, f1$3, 0];} + var _ar_ = _aq_[2], x2$0 = _aq_[1]; + if(! _ar_){ + var f1$2 = caml_call1(f, x1$0), f2$2 = caml_call1(f, x2$0); + return [0, f1$2, [0, f2$2, 0]]; + } + var _as_ = _ar_[2], x3$0 = _ar_[1]; + if(! _as_){ + var + f1$1 = caml_call1(f, x1$0), + f2$1 = caml_call1(f, x2$0), + f3$1 = caml_call1(f, x3$0); + return [0, f1$1, [0, f2$1, [0, f3$1, 0]]]; + } + var match$1 = _as_[2], x4$0 = _as_[1]; + if(! match$1){ + var + f1$0 = caml_call1(f, x1$0), + f2$0 = caml_call1(f, x2$0), + f3$0 = caml_call1(f, x3$0), + f4$0 = caml_call1(f, x4$0); + return [0, f1$0, [0, f2$0, [0, f3$0, [0, f4$0, 0]]]]; + } + var + tl = match$1[2], + x5$0 = match$1[1], + f1 = caml_call1(f, x1$0), + f2 = caml_call1(f, x2$0), + f3 = caml_call1(f, x3$0), + f4 = caml_call1(f, x4$0), + f5 = caml_call1(f, x5$0); + if(max_non_tailcall < ctr){ + var bs$0 = 0, xs = tl; + for(;;){ + if(xs){ + var _aj_ = xs[2]; + if(_aj_){ + var _ak_ = _aj_[2]; + if(_ak_){ + var _al_ = _ak_[2]; + if(_al_){ + var _am_ = _al_[2]; + if(_am_){ + var _an_ = _am_[2]; + if(_an_){ + var _ao_ = _an_[2]; + if(_ao_){ + var _ap_ = _ao_[2]; + if(_ap_){ + var match$0 = _ap_[2]; + if(match$0){ + var + xs$0 = match$0[2], + x8 = match$0[1], + x7 = _ap_[1], + x6 = _ao_[1], + x5 = _an_[1], + x4 = _am_[1], + x3 = _al_[1], + x2 = _ak_[1], + x1 = _aj_[1], + x0 = xs[1], + y0$0 = caml_call1(f, x0), + y1$0 = caml_call1(f, x1), + y2$0 = caml_call1(f, x2), + y3$0 = caml_call1(f, x3), + y4$0 = caml_call1(f, x4), + y5$0 = caml_call1(f, x5), + y6$0 = caml_call1(f, x6), + y7$0 = caml_call1(f, x7), + y8$0 = caml_call1(f, x8), + bs$1 = + [0, + [0, y0$0, y1$0, y2$0, y3$0, y4$0, y5$0, y6$0, y7$0, y8$0], + bs$0], + bs$0 = bs$1, + xs = xs$0; + continue; + } + } + } + } + } + } + } + } + } + var ys$1 = caml_call2(nontail_map, xs, f), ys = ys$1, param = bs$0; + for(;;){ + if(param){ + var + bs = param[2], + match = param[1], + y8 = match[9], + y7 = match[8], + y6 = match[7], + y5 = match[6], + y4 = match[5], + y3 = match[4], + y2 = match[3], + y1 = match[2], + y0 = match[1], + ys$0 = + [0, + y0, + [0, + y1, + [0, y2, [0, y3, [0, y4, [0, y5, [0, y6, [0, y7, [0, y8, ys]]]]]]]]], + ys = ys$0, + param = bs; + continue; + } + var _at_ = ys; + break; + } + break; + } + } + else + var _at_ = count_map(f, tl, caml_call2(Base_Import[91], ctr, 1)); + return [0, f1, [0, f2, [0, f3, [0, f4, [0, f5, _at_]]]]]; + } + function map(l, f){return count_map(f, l, 0);} + function folding_map(t, init, f){ + var acc = [0, init]; + return map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + map + (t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function symbol_map(l, f){return map(l, f);} + function map2_ok(l1, l2, f){ + return caml_call1(rev, caml_call3(rev_map2_ok, l1, l2, f)); + } + function map2(l1, l2, f){ + return check_length2 + (l1, + l2, + function(_ah_){ + return function(_ai_){return map2_ok(_ah_, _ai_, f);}; + }); + } + function map2_exn(l1, l2, f){ + check_length2_exn(cst_map2_exn, l1, l2); + return map2_ok(l1, l2, f); + } + function rev_map3_ok(l1, l2, l3, f){ + var l1$0 = l1, l2$0 = l2, l3$0 = l3, ac = 0; + for(;;){ + if(l1$0){ + if(l2$0 && l3$0){ + var + l3$1 = l3$0[2], + x3 = l3$0[1], + l2$1 = l2$0[2], + x2 = l2$0[1], + l1$1 = l1$0[2], + x1 = l1$0[1], + ac$0 = [0, caml_call3(f, x1, x2, x3), ac], + l1$0 = l1$1, + l2$0 = l2$1, + l3$0 = l3$1, + ac = ac$0; + continue; + } + } + else if(! l2$0 && ! l3$0) return ac; + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + } + function rev_map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ae_){ + return function(_af_){ + return function(_ag_){ + return rev_map3_ok(_ae_, _af_, _ag_, f);};}; + }); + } + function rev_map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_rev_map3_exn, l1, l2, l3); + return rev_map3_ok(l1, l2, l3, f); + } + function map3_ok(l1, l2, l3, f){ + return caml_call1(rev, rev_map3_ok(l1, l2, l3, f)); + } + function map3(l1, l2, l3, f){ + return check_length3 + (l1, + l2, + l3, + function(_ab_){ + return function(_ac_){ + return function(_ad_){return map3_ok(_ab_, _ac_, _ad_, f);};}; + }); + } + function map3_exn(l1, l2, l3, f){ + check_length3_exn(cst_map3_exn, l1, l2, l3); + return map3_ok(l1, l2, l3, f); + } + function rev_map_append(l1, l2, f){ + var l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return l2$0; + var + l1$1 = l1$0[2], + h = l1$0[1], + l2$1 = [0, caml_call1(f, h), l2$0], + l1$0 = l1$1, + l2$0 = l2$1; + } + } + function unzip(list){ + var list$2 = caml_call1(rev, list), list$0 = list$2, l1 = 0, l2 = 0; + for(;;){ + if(! list$0) return [0, l1, l2]; + var + list$1 = list$0[2], + match = list$0[1], + y = match[2], + x = match[1], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0; + } + } + function unzip3(list){ + var + list$2 = caml_call1(rev, list), + list$0 = list$2, + l1 = 0, + l2 = 0, + l3 = 0; + for(;;){ + if(! list$0) return [0, l1, l2, l3]; + var + list$1 = list$0[2], + match = list$0[1], + z = match[3], + y = match[2], + x = match[1], + l3$0 = [0, z, l3], + l2$0 = [0, y, l2], + l1$0 = [0, x, l1], + list$0 = list$1, + l1 = l1$0, + l2 = l2$0, + l3 = l3$0; + } + } + function zip_exn(l1, l2){ + try{ + var _$_ = map2_ok(l1, l2, function(a, b){return [0, a, b];}); + return _$_; + } + catch(_aa_){ + var ___ = caml_call1(length, l2); + return caml_call4(invalid_argf, _k_, caml_call1(length, l1), ___, 0); + } + } + function zip(l1, l2){ + return map2(l1, l2, function(a, b){return [0, a, b];}); + } + function rev_mapi(l, f){ + var i = 0, acc = 0, param = l; + for(;;){ + if(! param) return acc; + var + t = param[2], + h = param[1], + acc$0 = [0, caml_call2(f, i, h), acc], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + acc = acc$0, + param = t; + } + } + function mapi(l, f){return caml_call1(rev, rev_mapi(l, f));} + function folding_mapi(t, init, f){ + var acc = [0, init]; + return mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + mapi + (t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function iteri(l, f){ + caml_call3 + (fold_left, + l, + 0, + function(i, x){ + caml_call2(f, i, x); + return caml_call2(Base_Import[91], i, 1); + }); + return 0; + } + function foldi(t, init, f){ + var + _Y_ = + caml_call3 + (fold_left, + t, + [0, 0, init], + function(param, v){ + var acc = param[2], i = param[1], _Z_ = caml_call3(f, i, acc, v); + return [0, caml_call2(Base_Import[91], i, 1), _Z_]; + }); + return caml_call1(Base_Import[127], _Y_); + } + function filteri(l, f){ + return caml_call1 + (rev, + foldi + (l, + 0, + function(pos, acc, x){ + return caml_call2(f, pos, x) ? [0, x, acc] : acc; + })); + } + function reduce(l, f){ + if(! l) return 0; + var tl = l[2], hd = l[1]; + return [0, caml_call3(fold_left, tl, hd, f)]; + } + function reduce_exn(l, f){ + var match = reduce(l, f); + if(! match) return caml_call1(Base_Import[126], cst_List_reduce_exn); + var v = match[1]; + return v; + } + function reduce_balanced(l, f){ + function step_accum(num, acc, x){ + var num$0 = num, acc$0 = acc, x$0 = x; + for(;;){ + if(0 === caml_call2(Base_Import[116], num$0, 1)) return [0, x$0, acc$0]; + if(! acc$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + acc$1 = acc$0[2], + y = acc$0[1], + x$1 = caml_call2(f, y, x$0), + num$1 = caml_call2(Base_Import[115], num$0, 1), + num$0 = num$1, + acc$0 = acc$1, + x$0 = x$1; + } + } + var match = foldi(l, 0, step_accum); + if(! match) return 0; + var xs = match[2], x = match[1]; + return [0, + caml_call3 + (fold_left, xs, x, function(x, y){return caml_call2(f, y, x);})]; + } + function reduce_balanced_exn(l, f){ + var match = reduce_balanced(l, f); + if(! match) + return caml_call1(Base_Import[126], cst_List_reduce_balanced_exn); + var v = match[1]; + return v; + } + function groupi(l, break$0){ + var + groups = + foldi + (l, + 0, + function(i, acc, x){ + if(! acc) return [0, [0, x, 0], 0]; + var tl = acc[2], current_group = acc[1]; + return caml_call3(break$0, i, caml_call1(hd_exn, current_group), x) + ? [0, [0, x, 0], [0, current_group, tl]] + : [0, [0, x, current_group], tl]; + }); + return groups ? caml_call2(rev_map, groups, rev) : 0; + } + function group(l, break$0){ + return groupi(l, function(param, x, y){return caml_call2(break$0, x, y);}); + } + function sort_and_group(l, compare){ + var _X_ = caml_call2(stable_sort, l, compare); + return group + (_X_, + function(x, y){return 0 !== caml_call2(compare, x, y) ? 1 : 0;}); + } + function concat_map(l, f){ + var acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call1(f, hd), acc), + acc = acc$0, + param = tl; + } + } + function concat_mapi(l, f){ + var cont = 0, acc = 0, param = l; + for(;;){ + if(! param) return caml_call1(rev, acc); + var + tl = param[2], + hd = param[1], + acc$0 = caml_call2(rev_append, caml_call2(f, cont, hd), acc), + cont$0 = caml_call2(Base_Import[91], cont, 1), + cont = cont$0, + acc = acc$0, + param = tl; + } + } + function merge(l1, l2, compare){ + var acc = 0, l1$0 = l1, l2$0 = l2; + for(;;){ + if(! l1$0) return caml_call2(rev_append, acc, l2$0); + if(! l2$0) return caml_call2(rev_append, acc, l1$0); + var t2 = l2$0[2], h2 = l2$0[1], t1 = l1$0[2], h1 = l1$0[1]; + if(0 < caml_call2(compare, h1, h2)){ + var acc$0 = [0, h2, acc], acc = acc$0, l2$0 = t2; + continue; + } + var acc$1 = [0, h1, acc], acc = acc$1, l1$0 = t1; + } + } + function map2$0(a, b, f){ + return concat_map + (a, + function(x){ + return map(b, function(y){return caml_call2(f, x, y);}); + }); + } + function return$0(x){return [0, x, 0];} + function symbol_bind(t, f){return concat_map(t, f);} + var + map$0 = [0, -198771759, map], + Applicative = + caml_call1(Base_Applicative[11], [0, return$0, map2$0, map$0]), + map$1 = [0, -198771759, map], + Monad = caml_call1(Base_Monad[1], [0, concat_map, return$0, map$1]), + all = Monad[9], + all_unit = Monad[10], + ignore_m = Monad[8], + join = Monad[7], + apply = Applicative[8], + both = Applicative[3], + map3$0 = Applicative[10], + symbol = Applicative[4], + symbol$0 = Applicative[6], + symbol$1 = Applicative[5], + symbol$2 = Applicative[4], + symbol$3 = Applicative[6], + symbol$4 = Applicative[5], + Open_on_rhs = [0], + Let_syntax = [0, return$0, concat_map, map, both, Open_on_rhs], + Let_syntax$0 = [0, return$0, symbol_bind, symbol_map, Let_syntax], + Monad_infix = [0, symbol_bind, symbol_map]; + function last_exn(list){ + var list$0 = list; + for(;;){ + if(! list$0) return caml_call1(Base_Import[126], cst_List_last); + var x = list$0[1]; + if(! list$0[2]) return x; + var list$1 = list$0[2], list$0 = list$1; + } + } + function last(list){ + var list$0 = list; + for(;;){ + if(! list$0) return 0; + var x = list$0[1]; + if(! list$0[2]) return [0, x]; + var list$1 = list$0[2], list$0 = list$1; + } + } + function is_prefix(list, prefix, equal){ + var list$0 = list, prefix$0 = prefix; + for(;;){ + if(! prefix$0) return 1; + var prefix$1 = prefix$0[2], hd = prefix$0[1]; + if(! list$0) return 0; + var + list$1 = list$0[2], + hd$0 = list$0[1], + _W_ = caml_call2(equal, hd, hd$0); + if(! _W_) return _W_; + var list$0 = list$1, prefix$0 = prefix$1; + } + } + function find_consecutive_duplicate(t, equal){ + if(! t) return 0; + var t$0 = t[2], a1 = t[1], a1$0 = a1, t$1 = t$0; + for(;;){ + if(! t$1) return 0; + var t$2 = t$1[2], a2 = t$1[1]; + if(caml_call2(equal, a1$0, a2)) return [0, [0, a1$0, a2]]; + var a1$0 = a2, t$1 = t$2; + } + } + function remove_consecutive_duplicates(opt, list, equal){ + if(opt) + var sth = opt[1], which_to_keep = sth; + else + var which_to_keep = 847656566; + if(! list) return 0; + var + tl$0 = list[2], + to_keep$2 = list[1], + to_keep = to_keep$2, + accum = 0, + param = tl$0; + for(;;){ + if(! param) return caml_call1(rev, [0, to_keep, accum]); + var tl = param[2], to_keep$0 = param[1]; + if(caml_call2(equal, to_keep$0, to_keep)){ + var + to_keep$1 = 847656566 <= which_to_keep ? to_keep$0 : to_keep, + to_keep = to_keep$1, + param = tl; + continue; + } + var + accum$0 = [0, to_keep, accum], + to_keep = to_keep$0, + accum = accum$0, + param = tl; + } + } + function dedup_and_sort(list, compare){ + if(list && list[2]){ + var + equal = + function(x$0, x){return 0 === caml_call2(compare, x$0, x) ? 1 : 0;}, + sorted = caml_call2(sort, list, compare); + return remove_consecutive_duplicates(0, sorted, equal); + } + return list; + } + function find_a_dup(l, compare){ + var sorted = caml_call2(sort, l, compare), l$0 = sorted; + for(;;){ + if(l$0){ + var tl = l$0[2]; + if(tl){ + var hd2 = tl[1], hd1 = l$0[1]; + if(0 === caml_call2(compare, hd1, hd2)) return [0, hd1]; + var l$0 = tl; + continue; + } + } + return 0; + } + } + function contains_dup(lst, compare){ + return find_a_dup(lst, compare) ? 1 : 0; + } + function find_all_dups(l, compare){ + function compare$0(a, b){ + var _V_ = caml_call2(compare, a, b); + return caml_call2(Base_Import[88], -1, _V_); + } + var sorted = caml_call2(sort, l, compare$0); + if(! sorted) return 0; + var + sorted$2 = sorted[2], + prev$1 = sorted[1], + sorted$0 = sorted$2, + prev = prev$1, + already_recorded = 0, + acc = 0; + for(;;){ + if(! sorted$0) return acc; + var sorted$1 = sorted$0[2], prev$0 = sorted$0[1]; + if(0 !== compare$0(prev, prev$0)){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 0; + continue; + } + if(already_recorded){ + var sorted$0 = sorted$1, prev = prev$0, already_recorded = 1; + continue; + } + var + acc$0 = [0, prev$0, acc], + sorted$0 = sorted$1, + prev = prev$0, + already_recorded = 1, + acc = acc$0; + } + } + function all_equal(t$0, equal){ + if(! t$0) return 0; + var xs$0 = t$0[2], x$0 = t$0[1], t = xs$0; + for(;;){ + if(t){ + var xs = t[2], x = t[1], _T_ = caml_call2(equal, x, x$0); + if(_T_){var t = xs; continue;} + var _U_ = _T_; + } + else + var _U_ = 1; + return _U_ ? [0, x$0] : 0; + } + } + function count(t, f){ + return caml_call3(Base_Container[2], fold_left, t, f); + } + function sum(m, t, f){ + return caml_call4(Base_Container[7], fold_left, m, t, f); + } + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold_left, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold_left, t, compare); + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _m_, n, 0); + var i = n, accum = 0; + for(;;){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + if(0 === i) return accum; + var + accum$0 = [0, caml_call1(f, caml_call2(Base_Import[93], i, 1)), accum], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + accum = accum$0; + } + } + function rev_filter_map(l, f){ + var l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call1(f, hd); + if(match){ + var x = match[1], accum$0 = [0, x, accum], l$0 = tl, accum = accum$0; + continue; + } + var l$0 = tl; + } + } + function filter_map(l, f){return caml_call1(rev, rev_filter_map(l, f));} + function rev_filter_mapi(l, f){ + var i = 0, l$0 = l, accum = 0; + for(;;){ + if(! l$0) return accum; + var tl = l$0[2], hd = l$0[1], match = caml_call2(f, i, hd); + if(match){ + var + x = match[1], + accum$0 = [0, x, accum], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + l$0 = tl, + accum = accum$0; + continue; + } + var i$1 = caml_call2(Base_Import[91], i, 1), i = i$1, l$0 = tl; + } + } + function filter_mapi(l, f){return caml_call1(rev, rev_filter_mapi(l, f));} + function filter_opt(l){return filter_map(l, function(_S_){return _S_;});} + function partition3_map(t, f){ + var t$0 = t, fst = 0, snd = 0, trd = 0; + for(;;){ + if(! t$0){ + var _Q_ = caml_call1(rev, trd), _R_ = caml_call1(rev, snd); + return [0, caml_call1(rev, fst), _R_, _Q_]; + } + var t$1 = t$0[2], x = t$0[1], match = caml_call1(f, x), _P_ = match[1]; + if(4152137 === _P_){ + var y = match[2], snd$0 = [0, y, snd], t$0 = t$1, snd = snd$0; + continue; + } + if(4202758 <= _P_){ + var y$0 = match[2], trd$0 = [0, y$0, trd], t$0 = t$1, trd = trd$0; + continue; + } + var y$1 = match[2], fst$0 = [0, y$1, fst], t$0 = t$1, fst = fst$0; + } + } + function partition_tf(t, f){ + function f$0(x){return caml_call1(f, x) ? [0, x] : [1, x];} + return caml_call2(partition_map, t, f$0); + } + function partition_result(t){ + return caml_call2(partition_map, t, Base_Result[35]); + } + function t_of_sexp$0(of_a_014, of_b_015, x_023){ + function _M_(sexp_021){ + if(1 === sexp_021[0]){ + var _N_ = sexp_021[1]; + if(_N_){ + var _O_ = _N_[2]; + if(_O_ && ! _O_[2]){ + var + arg1_018 = _O_[1], + arg0_017 = _N_[1], + res0_019 = caml_call1(of_a_014, arg0_017), + res1_020 = caml_call1(of_b_015, arg1_018); + return [0, res0_019, res1_020]; + } + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[2], error_source_022, 2, sexp_021); + } + return caml_call2(Base_Import[176], _M_, x_023); + } + function sexp_of_t$1(of_a_024, of_b_025, x_030){ + function _L_(param){ + var + arg1_027 = param[2], + arg0_026 = param[1], + res0_028 = caml_call1(of_a_024, arg0_026), + res1_029 = caml_call1(of_b_025, arg1_027); + return [1, [0, res0_028, [0, res1_029, 0]]]; + } + return caml_call2(Base_Import[152], _L_, x_030); + } + function t_sexp_grammar$0(a_sexp_grammar, b_sexp_grammar){ + return caml_call1 + (Base_Import[195], + [2, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]); + } + function pair_of_group(list){ + if(! list) throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + var k = list[1][1]; + return [0, k, map(list, Base_Import[127])]; + } + function group$0(alist, equal){ + return map + (group + (alist, + function(param, _K_){ + var y = _K_[1], x = param[1]; + return 1 - caml_call2(equal, x, y); + }), + pair_of_group); + } + function sort_and_group$0(alist, compare){ + return map + (sort_and_group + (alist, + function(param, _J_){ + var y = _J_[1], x = param[1]; + return caml_call2(compare, x, y); + }), + pair_of_group); + } + function find$0(t, equal, key){ + var + match = + find + (t, + function(param){ + var key$0 = param[1]; + return caml_call2(equal, key, key$0); + }); + if(! match) return 0; + var x = match[1]; + return [0, caml_call1(Base_Import[127], x)]; + } + var not_found$3 = [0, Base_Import[252], _p_]; + function find_exn$0(t, equal, key){ + var match = find$0(t, equal, key); + if(! match) throw caml_maybe_attach_backtrace(not_found$3, 1); + var value = match[1]; + return value; + } + function mem$0(t, equal, key){return find$0(t, equal, key) ? 1 : 0;} + function remove(t, equal, key){ + return filter + (t, + function(param){ + var key$0 = param[1]; + return 1 - caml_call2(equal, key, key$0); + }); + } + function add(t, equal, key, value){ + return [0, [0, key, value], remove(t, equal, key)]; + } + function inverse(t){ + return map + (t, + function(param){ + var y = param[2], x = param[1]; + return [0, y, x]; + }); + } + function map$2(t, f){ + return map + (t, + function(param){ + var value = param[2], key = param[1]; + return [0, key, caml_call1(f, value)]; + }); + } + function sub(l, pos, len){ + var _F_ = pos < 0 ? 1 : 0; + if(_F_) + var _G_ = _F_; + else{ + var _H_ = len < 0 ? 1 : 0; + if(_H_) + var _G_ = _H_; + else + var + _I_ = caml_call1(length, l), + _G_ = caml_call2(Base_Import[93], _I_, len) < pos ? 1 : 0; + } + if(_G_) caml_call1(Base_Import[126], cst_List_sub); + return caml_call1 + (rev, + foldi + (l, + 0, + function(i, acc, el){ + if(pos <= i && i < caml_call2(Base_Import[91], pos, len)) + return [0, el, acc]; + return acc; + })); + } + function split_n(t_orig, n){ + if(0 >= n) return [0, 0, t_orig]; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return [0, caml_call1(rev, accum), t]; + if(! t) return [0, t_orig, 0]; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function take(t_orig, n){ + if(0 >= n) return 0; + var n$0 = n, t = t_orig, accum = 0; + for(;;){ + if(0 === n$0) return caml_call1(rev, accum); + if(! t) return t_orig; + var + tl = t[2], + hd = t[1], + accum$0 = [0, hd, accum], + n$1 = caml_call2(Base_Import[93], n$0, 1), + n$0 = n$1, + t = tl, + accum = accum$0; + } + } + function drop(t, n){ + var t$0 = t, n$0 = n; + for(;;){ + if(t$0){ + var tl = t$0[2]; + if(0 < n$0){ + var n$1 = caml_call2(Base_Import[93], n$0, 1), t$0 = tl, n$0 = n$1; + continue; + } + } + return t$0; + } + } + function chunks_of(l, length){ + if(length <= 0) caml_call3(invalid_argf, _q_, length, 0); + var acc = 0, l$0 = l; + for(;;){ + if(! l$0) return caml_call1(rev, acc); + var + match = split_n(l$0, length), + l$1 = match[2], + sublist = match[1], + acc$0 = [0, sublist, acc], + acc = acc$0, + l$0 = l$1; + } + } + function split_while(xs, f){ + var acc = 0, t = xs; + for(;;){ + if(t){ + var tl = t[2], hd = t[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, t = tl; + continue; + } + } + return [0, caml_call1(rev, acc), t]; + } + } + function take_while(xs, f){ + var acc = 0, param = xs; + for(;;){ + if(param){ + var tl = param[2], hd = param[1]; + if(caml_call1(f, hd)){ + var acc$0 = [0, hd, acc], acc = acc$0, param = tl; + continue; + } + } + return caml_call1(rev, acc); + } + } + function drop_while(t, f){ + var t$0 = t; + for(;;){ + if(t$0){ + var tl = t$0[2], hd = t$0[1]; + if(caml_call1(f, hd)){var t$0 = tl; continue;} + } + return t$0; + } + } + function drop_last(t){ + var match = caml_call1(rev, t); + if(! match) return 0; + var lst = match[2]; + return [0, caml_call1(rev, lst)]; + } + function drop_last_exn(t){ + var match = drop_last(t); + if(! match) + return caml_call1(Base_Import[124], cst_List_drop_last_exn_empty_l); + var lst = match[1]; + return lst; + } + function cartesian_product(list1, list2){ + if(caml_call1(is_empty, list2)) return 0; + var l1 = list1, accum = 0; + for(;;){ + if(! l1) return caml_call1(rev, accum); + var + tl = l1[2], + hd = l1[1], + accum$0 = + caml_call2 + (rev_append, + map + (list2, function(hd){return function(x){return [0, hd, x];};}(hd)), + accum), + l1 = tl, + accum = accum$0; + } + } + function concat(l){return caml_call3(fold_right, l, append, 0);} + function concat_no_order(l){ + return caml_call3 + (fold_left, + l, + 0, + function(acc, l){return caml_call2(rev_append, l, acc);}); + } + function cons(x, l){return [0, x, l];} + function is_sorted(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _E_ = caml_call2(compare, x1, x2) <= 0 ? 1 : 0; + if(! _E_) return _E_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + function is_sorted_strictly(l, compare){ + var l$0 = l; + for(;;){ + if(l$0){ + var rest = l$0[2]; + if(rest){ + var + x2 = rest[1], + x1 = l$0[1], + _D_ = caml_call2(compare, x1, x2) < 0 ? 1 : 0; + if(! _D_) return _D_; + var l$0 = rest; + continue; + } + } + return 1; + } + } + var Infix = [0, append]; + function permute(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(list){ + var _C_ = list[2]; + if(_C_){ + if(_C_[2]){ + var arr = caml_call1(Base_Array0[13], list); + caml_call4(Base_Array_permute[24], [0, random_state], 0, 0, arr); + return caml_call1(Base_Array0[15], arr); + } + var y = _C_[1], x = list[1]; + return caml_call1(Base_Random[18][16], random_state) + ? [0, y, [0, x, 0]] + : list; + } + } + return list; + } + function random_element_exn(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(caml_call1(is_empty, list)) + return caml_call1(Base_Import[124], cst_List_random_element_exn_em); + var _B_ = caml_call1(length, list); + return nth_exn(list, caml_call2(Base_Random[18][6], random_state, _B_)); + } + function random_element(opt, list){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{ + var _z_ = [0, random_element_exn([0, random_state], list)]; + return _z_; + } + catch(_A_){return 0;} + } + function compare$0(cmp, a, b){ + var a$0 = a, b$0 = b; + for(;;){ + if(! a$0) return b$0 ? -1 : 0; + if(! b$0) return 1; + var + ys = b$0[2], + y = b$0[1], + xs = a$0[2], + x = a$0[1], + n = caml_call2(cmp, x, y); + if(0 !== n) return n; + var a$0 = xs, b$0 = ys; + } + } + var hash_fold_t = Base_Import[213]; + function equal(equal, t1, t2){ + var t1$0 = t1, t2$0 = t2; + for(;;){ + if(t1$0){ + if(t2$0){ + var + t2$1 = t2$0[2], + x2 = t2$0[1], + t1$1 = t1$0[2], + x1 = t1$0[1], + _y_ = caml_call2(equal, x1, x2); + if(! _y_) return _y_; + var t1$0 = t1$1, t2$0 = t2$1; + continue; + } + } + else if(! t2$0) return 1; + return 0; + } + } + function transpose(rows$0){ + var rows = rows$0, columns = 0, do_rev = 1; + a: + for(;;){ + var t = rows, column_acc = 0, trimmed_rows = 0, found_empty = 0; + for(;;){ + if(! t){ + if(! column_acc && ! trimmed_rows) + return [0, caml_call1(rev, columns)]; + if(found_empty) return 0; + var + column = do_rev ? caml_call1(rev, column_acc) : column_acc, + do_rev$0 = 1 - do_rev, + columns$0 = [0, column, columns], + rows = trimmed_rows, + columns = columns$0, + do_rev = do_rev$0; + continue a; + } + var match = t[1]; + if(match){ + var + tl = t[2], + xs = match[2], + x = match[1], + trimmed = [0, xs, trimmed_rows], + column_acc$0 = [0, x, column_acc], + t = tl, + column_acc = column_acc$0, + trimmed_rows = trimmed; + continue; + } + var tl$0 = t[2], t = tl$0, found_empty = 1; + } + } + } + var + Transpose_got_lists_of_differe = + [248, cst_Base_List_Transpose_got_li, runtime.caml_fresh_oo_id(0)]; + function _r_(param){ + if(param[1] !== Transpose_got_lists_of_differe) + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + var + arg0_031 = param[2], + res0_032 = caml_call2(Base_Import[152], Base_Import[142], arg0_031); + return [1, [0, _s_, [0, res0_032, 0]]]; + } + caml_call4 + (Sexplib0_Sexp_conv[70][1], 0, 0, Transpose_got_lists_of_differe, _r_); + function transpose_exn(l){ + var match = transpose(l); + if(! match) + throw caml_maybe_attach_backtrace + ([0, Transpose_got_lists_of_differe, map(l, length)], 1); + var l$0 = match[1]; + return l$0; + } + function intersperse(t, sep){ + if(! t) return 0; + var xs = t[2], x = t[1], _x_ = 0; + return [0, + x, + caml_call3 + (fold_right, + xs, + function(y, acc){return [0, sep, [0, y, acc]];}, + _x_)]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold_left, init, f, t); + } + function fold_until(t, init, f){ + var _v_ = caml_call3(Base_Container[9], fold_left, init, f); + return function(_w_){return caml_call2(_v_, _w_, t);}; + } + function is_suffix(list, suffix, equal_elt){ + var + list_len = caml_call1(length, list), + suffix_len = caml_call1(length, suffix), + _u_ = suffix_len <= list_len ? 1 : 0; + return _u_ + ? equal + (equal_elt, + drop(list, caml_call2(Base_Import[93], list_len, suffix_len)), + suffix) + : _u_; + } + var + Base_List = + [0, + compare$0, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + mem, + length, + is_empty, + iter, + fold_left, + fold_result, + fold_until, + exists, + for_all, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + [0, + both, + symbol, + symbol$1, + symbol$0, + apply, + map2$0, + map3$0, + [0, symbol$2, symbol$4, symbol$3, symbol_map], + symbol_bind, + symbol_map, + [0, symbol_bind, symbol_map], + concat_map, + return$0, + map, + join, + ignore_m, + all, + all_unit, + [0, return$0, symbol_bind, symbol_map, Let_syntax]], + symbol_bind, + symbol_map, + Monad_infix, + concat_map, + return$0, + join, + ignore_m, + all, + all_unit, + Let_syntax$0, + Or_unequal_lengths, + of_list, + nth, + nth_exn, + rev, + rev_append, + unordered_append, + rev_map, + iter2_exn, + iter2, + rev_map2_exn, + rev_map2, + fold2_exn, + fold2, + for_alli, + for_all2_exn, + for_all2, + existsi, + exists2_exn, + exists2, + filter, + rev_filter, + filteri, + partition_map, + partition3_map, + partition_tf, + partition_result, + split_n, + sort, + stable_sort, + merge, + hd, + tl, + hd_exn, + tl_exn, + findi, + findi_exn, + find_exn, + find_map_exn, + find_mapi, + find_mapi_exn, + append, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + concat_map, + concat_mapi, + map2_exn, + map2, + rev_map3_exn, + rev_map3, + map3_exn, + map3, + rev_map_append, + fold_right, + fold_left, + unzip, + unzip3, + zip, + zip_exn, + mapi, + rev_mapi, + iteri, + foldi, + reduce_exn, + reduce, + reduce_balanced, + reduce_balanced_exn, + group, + groupi, + sort_and_group, + chunks_of, + last, + last_exn, + is_prefix, + is_suffix, + find_consecutive_duplicate, + remove_consecutive_duplicates, + dedup_and_sort, + find_a_dup, + contains_dup, + find_all_dups, + all_equal, + count, + counti, + range$0, + range, + init, + rev_filter_map, + rev_filter_mapi, + filter_map, + filter_mapi, + filter_opt, + [0, + t_of_sexp$0, + sexp_of_t$1, + t_sexp_grammar$0, + add, + find$0, + find_exn$0, + mem$0, + remove, + map$2, + inverse, + group$0, + sort_and_group$0], + sub, + take, + drop, + take_while, + drop_while, + split_while, + drop_last, + drop_last_exn, + concat, + concat_no_order, + cons, + cartesian_product, + permute, + random_element, + random_element_exn, + is_sorted, + is_sorted_strictly, + equal, + Infix, + transpose, + transpose_exn, + intersperse]; + runtime.caml_register_global(54, Base_List, "Base__List"); + return; + } + (globalThis)); + +//# 8248 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$5 = ": ", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$4 = "", + cst$3 = "; ", + cst = cst$5, + cst$0 = cst$5, + cst$1 = cst$5, + cst$2 = cst$5, + t_sexp_grammar = [0, "Info.t"], + module_name = "Base.Info", + Stdlib_Format = global_data.Stdlib__Format, + Base_Exn = global_data.Base__Exn, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Lazy = global_data.Base__Lazy, + CamlinternalLazy = global_data.CamlinternalLazy, + Assert_failure = global_data.Assert_failure, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_String0 = global_data.Base__String0, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Base_Pretty_printer = global_data.Base__Pretty_printer, + _l_ = [0, "src/info.ml", 204, 6], + _a_ = [0, "Could_not_construct"], + _b_ = [0, "String"], + _c_ = [0, "Exn"], + _d_ = [0, "Sexp"], + _e_ = [0, "Tag_sexp"], + _f_ = [0, "Tag_t"], + _g_ = [0, "Tag_arg"], + _h_ = [0, "Of_list"], + _i_ = [0, "With_backtrace"], + cst_could_not_construct_info = "could not construct info: ", + _j_ = + [0, + [11, "and ", [4, 0, 0, 0, [11, " more info", 0]]], + "and %d more info"], + cst_Backtrace = "\nBacktrace:\n", + cst_Base_Info_Exn = "Base__Info.Exn"; + function sexp_of_t(param){ + switch(param[0]){ + case 0: + var arg0_001 = param[1], res0_002 = caml_call1(Base_Sexp[4], arg0_001); + return [1, [0, _a_, [0, res0_002, 0]]]; + case 1: + var + arg0_003 = param[1], + res0_004 = caml_call1(Base_Import[139], arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + case 2: + var + arg0_005 = param[1], + res0_006 = caml_call1(Base_Import[199], arg0_005); + return [1, [0, _c_, [0, res0_006, 0]]]; + case 3: + var arg0_007 = param[1], res0_008 = caml_call1(Base_Sexp[4], arg0_007); + return [1, [0, _d_, [0, res0_008, 0]]]; + case 4: + var + arg2_011 = param[3], + arg1_010 = param[2], + arg0_009 = param[1], + res0_012 = caml_call1(Base_Import[139], arg0_009), + res1_013 = caml_call1(Base_Sexp[4], arg1_010), + res2_014 = + caml_call2 + (Base_Import[149], Base_Source_code_position0[8], arg2_011); + return [1, [0, _e_, [0, res0_012, [0, res1_013, [0, res2_014, 0]]]]]; + case 5: + var + arg1_016 = param[2], + arg0_015 = param[1], + res0_017 = caml_call1(Base_Import[139], arg0_015), + res1_018 = sexp_of_t(arg1_016); + return [1, [0, _f_, [0, res0_017, [0, res1_018, 0]]]]; + case 6: + var + arg2_021 = param[3], + arg1_020 = param[2], + arg0_019 = param[1], + res0_022 = caml_call1(Base_Import[139], arg0_019), + res1_023 = caml_call1(Base_Sexp[4], arg1_020), + res2_024 = sexp_of_t(arg2_021); + return [1, [0, _g_, [0, res0_022, [0, res1_023, [0, res2_024, 0]]]]]; + case 7: + var + arg1_026 = param[2], + arg0_025 = param[1], + res0_027 = caml_call2(Base_Import[149], Base_Import[142], arg0_025), + res1_028 = caml_call2(Base_Import[152], sexp_of_t, arg1_026); + return [1, [0, _h_, [0, res0_027, [0, res1_028, 0]]]]; + default: + var + arg1_030 = param[2], + arg0_029 = param[1], + res0_031 = sexp_of_t(arg0_029), + res1_032 = caml_call1(Base_Import[139], arg1_030); + return [1, [0, _i_, [0, res0_031, [0, res1_032, 0]]]]; + } + } + function to_strings_hum(t, ac){ + var t$0 = t, ac$0 = ac; + for(;;) + switch(t$0[0]){ + case 0: + var sexp = t$0[1]; + return [0, + cst_could_not_construct_info, + [0, caml_call1(Base_Sexp[16], sexp), ac$0]]; + case 1: + var string = t$0[1]; return [0, string, ac$0]; + case 2: + var exn = t$0[1], _R_ = caml_call1(Base_Exn[1], exn); + return [0, caml_call1(Base_Sexp[16], _R_), ac$0]; + case 3: + var sexp$0 = t$0[1]; + return [0, caml_call1(Base_Sexp[16], sexp$0), ac$0]; + case 4: + var sexp$1 = t$0[2], tag = t$0[1]; + return [0, + tag, + [0, cst, [0, caml_call1(Base_Sexp[16], sexp$1), ac$0]]]; + case 5: + var t$1 = t$0[2], tag$0 = t$0[1]; + return [0, tag$0, [0, cst$0, to_strings_hum(t$1, ac$0)]]; + case 6: + var + t$2 = t$0[3], + sexp$2 = t$0[2], + tag$1 = t$0[1], + _S_ = [0, cst$1, to_strings_hum(t$2, ac$0)], + body = [0, caml_call1(Base_Sexp[16], sexp$2), _S_]; + return 0 === caml_ml_string_length(tag$1) + ? body + : [0, tag$1, [0, cst$2, body]]; + case 7: + var ts = t$0[2], trunc_after = t$0[1]; + if(trunc_after){ + var max = trunc_after[1], n = caml_call1(Base_List[7], ts); + if(n <= max) + var ts$0 = ts; + else + var + _V_ = caml_call2(Base_Import[93], n, max), + _W_ = [0, [1, caml_call2(Base_Printf[2], _j_, _V_)], 0], + _X_ = caml_call2(Base_List[131], ts, max), + ts$0 = caml_call2(Base_Import[111], _X_, _W_); + var ts$1 = ts$0; + } + else + var ts$1 = ts; + var + _T_ = + function(ac, t){ + var ac$0 = caml_call1(Base_List[8], ac) ? ac : [0, cst$3, ac]; + return to_strings_hum(t, ac$0); + }, + _U_ = caml_call1(Base_List[38], ts$1); + return caml_call3(Base_List[10], _U_, ac$0, _T_); + default: + var + backtrace = t$0[2], + t$3 = t$0[1], + ac$1 = [0, cst_Backtrace, [0, backtrace, ac$0]], + t$0 = t$3, + ac$0 = ac$1; + continue; + } + } + function to_sexps_hum(t, ac){ + switch(t[0]){ + case 0: + return [0, sexp_of_t(t), ac]; + case 1: + var string = t[1]; return [0, [0, string], ac]; + case 2: + var exn = t[1]; return [0, caml_call1(Base_Exn[1], exn), ac]; + case 3: + var sexp = t[1]; return [0, sexp, ac]; + case 4: + var here = t[3], sexp$0 = t[2], tag = t[1]; + if(here) + var + here$0 = here[1], + _O_ = [0, caml_call1(Base_Source_code_position0[8], here$0), 0]; + else + var _O_ = 0; + return [0, [1, [0, [0, tag], [0, sexp$0, _O_]]], ac]; + case 5: + var t$0 = t[2], tag$0 = t[1]; + return [0, [1, [0, [0, tag$0], to_sexps_hum(t$0, 0)]], ac]; + case 6: + var + t$1 = t[3], + sexp$1 = t[2], + tag$1 = t[1], + body = [0, sexp$1, to_sexps_hum(t$1, 0)]; + return 0 === caml_ml_string_length(tag$1) + ? [0, [1, body], ac] + : [0, [1, [0, [0, tag$1], body]], ac]; + case 7: + var + ts = t[2], + _P_ = function(ac, t){return to_sexps_hum(t, ac);}, + _Q_ = caml_call1(Base_List[38], ts); + return caml_call3(Base_List[10], _Q_, ac, _P_); + default: + var backtrace = t[2], t$2 = t[1]; + return [0, [1, [0, to_sexp_hum(t$2), [0, [0, backtrace], 0]]], ac]; + } + } + function to_sexp_hum(t){ + var sexps = to_sexps_hum(t, 0); + if(sexps && ! sexps[2]){var sexp = sexps[1]; return sexp;} + return [1, sexps]; + } + function protect(f){ + try{var _N_ = caml_call1(f, 0); return _N_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return [0, caml_call1(Base_Exn[1], exn)]; + } + } + function to_message(info){ + return protect + (function(param){ + var _M_ = caml_obj_tag(info); + if(250 === _M_) return info[1]; + if(246 !== _M_ && 244 !== _M_) return info; + return caml_call1(CamlinternalLazy[2], info); + }); + } + function of_message(t){return [250, t];} + function invariant(param){return 0;} + function sexp_of_t$0(t){return to_sexp_hum(to_message(t));} + function t_of_sexp(sexp){return [246, function(_L_){return [3, sexp];}];} + function compare(t1, t2){ + var _J_ = sexp_of_t$0(t2), _K_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[6], _K_, _J_); + } + function equal(t1, t2){ + var _H_ = sexp_of_t$0(t2), _I_ = sexp_of_t$0(t1); + return caml_call2(Base_Sexp[5], _I_, _H_); + } + function hash_fold_t(state, t){ + var _G_ = sexp_of_t$0(t); + return caml_call2(Base_Sexp[1], state, _G_); + } + function hash(t){return caml_call3(Base_Hash[14], 0, hash_fold_t, t);} + function to_string_hum(t){ + var message = to_message(t); + if(1 === message[0]){var s = message[1]; return s;} + var _F_ = to_sexp_hum(message); + return caml_call2(Base_Sexp[15], 0, _F_); + } + function to_string_hum_deprecated(t){ + var t$0 = to_message(t), _E_ = to_strings_hum(t$0, 0); + return caml_call2(Base_String0[14], 0, _E_); + } + function to_string_mach(t){ + var _D_ = sexp_of_t$0(t); + return caml_call1(Base_Sexp[16], _D_); + } + function of_lazy(l){ + return [246, + function(_A_){ + return protect + (function(param){ + var _B_ = caml_obj_tag(l); + if(250 === _B_) + var _C_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _B_ && 244 !== _B_){var _C_ = l; switch$0 = 1;} + if(! switch$0) var _C_ = caml_call1(CamlinternalLazy[2], l); + } + return [1, _C_]; + }); + }]; + } + function of_lazy_sexp(l){ + return [246, + function(_x_){ + return protect + (function(param){ + var _y_ = caml_obj_tag(l); + if(250 === _y_) + var _z_ = l[1]; + else{ + var switch$0 = 0; + if(246 !== _y_ && 244 !== _y_){var _z_ = l; switch$0 = 1;} + if(! switch$0) var _z_ = caml_call1(CamlinternalLazy[2], l); + } + return [3, _z_]; + }); + }]; + } + function of_lazy_t(lazy_t){return caml_call1(Base_Lazy[13], lazy_t);} + function of_string(message){ + return caml_call1(Base_Lazy[21], [1, message]); + } + function createf(format){ + return caml_call2(Base_Printf[4], of_string, format); + } + function of_thunk(f){ + return [246, + function(_w_){ + return protect(function(param){return [1, caml_call1(f, 0)];}); + }]; + } + function create(here, strict, tag, x, sexp_of_x){ + return strict + ? [250, [4, tag, caml_call1(sexp_of_x, x), here]] + : [246, + function(_v_){ + return protect + (function(param){ + return [4, tag, caml_call1(sexp_of_x, x), here]; + }); + }]; + } + function create_s(sexp){return caml_call1(Base_Lazy[21], [3, sexp]);} + function tag(t, tag){ + return [246, function(param){return [5, tag, to_message(t)];}]; + } + function tag_s_lazy(t, tag){ + return [246, + function(_r_){ + return protect + (function(param){ + var _s_ = to_message(t), _t_ = caml_obj_tag(tag); + if(250 === _t_) + var _u_ = tag[1]; + else{ + var switch$0 = 0; + if(246 !== _t_ && 244 !== _t_){var _u_ = tag; switch$0 = 1;} + if(! switch$0) + var _u_ = caml_call1(CamlinternalLazy[2], tag); + } + return [6, cst$4, _u_, _s_]; + }); + }]; + } + function tag_s(t, tag){ + return tag_s_lazy(t, caml_call1(Base_Lazy[21], tag)); + } + function tag_arg(t, tag, x, sexp_of_x){ + return [246, + function(_p_){ + return protect + (function(param){ + var _q_ = to_message(t); + return [6, tag, caml_call1(sexp_of_x, x), _q_]; + }); + }]; + } + function of_list(trunc_after, ts){ + return [246, + function(param){ + return [7, + trunc_after, + caml_call2(Base_List[76], ts, to_message)]; + }]; + } + var Exn = [248, cst_Base_Info_Exn, runtime.caml_fresh_oo_id(0)]; + function _k_(param){ + if(param[1] !== Exn) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var t = param[2]; + return sexp_of_t$0(t); + } + caml_call4(Sexplib0_Sexp_conv[70][1], 0, 0, Exn, _k_); + function to_exn(t){ + if(! caml_call1(Base_Lazy[22], t)) return [0, Exn, t]; + var _o_ = caml_obj_tag(t); + if(250 === _o_) + var match = t[1]; + else{ + var switch$0 = 0; + if(246 !== _o_ && 244 !== _o_){var match = t; switch$0 = 1;} + if(! switch$0) var match = caml_call1(CamlinternalLazy[2], t); + } + if(2 !== match[0]) return [0, Exn, t]; + var exn = match[1]; + return exn; + } + function of_exn(backtrace, exn){ + if(backtrace){ + var match = backtrace[1]; + if(typeof match === "number") + var _n_ = [0, caml_call1(Stdlib_Printexc[6], 0)]; + else + var s = match[2], _n_ = [0, s]; + var backtrace$0 = _n_; + } + else + var backtrace$0 = 0; + if(exn[1] === Exn){ + var t = exn[2]; + if(! backtrace$0) return t; + var backtrace$1 = backtrace$0[1]; + return [246, function(param){return [8, to_message(t), backtrace$1];}]; + } + if(! backtrace$0) return caml_call1(Base_Lazy[21], [2, exn]); + var backtrace$2 = backtrace$0[1]; + return [246, + function(param){ + return [8, [3, caml_call1(Base_Exn[1], exn)], backtrace$2]; + }]; + } + function pp(ppf, t){ + var _m_ = to_string_hum(t); + return caml_call2(Stdlib_Format[13], ppf, _m_); + } + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Info = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + [0, sexp_of_t, to_message, of_message]]; + runtime.caml_register_global(37, Base_Info, "Base__Info"); + return; + } + (globalThis)); + +//# 8735 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + t_sexp_grammar = [0, "Error.t"], + module_name = "Base.Error", + Base_Info = global_data.Base__Info, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Info[1], + equal = Base_Info[2], + hash_fold_t = Base_Info[3], + hash = Base_Info[4], + t_of_sexp = Base_Info[5], + sexp_of_t = Base_Info[6], + invariant = Base_Info[8], + to_string_hum = Base_Info[9], + to_string_mach = Base_Info[10], + to_string_hum_deprecated = Base_Info[11], + of_string = Base_Info[12], + of_lazy = Base_Info[13], + of_lazy_sexp = Base_Info[14], + of_thunk = Base_Info[15], + of_lazy_t = Base_Info[16], + create = Base_Info[17], + create_s = Base_Info[18], + createf = Base_Info[19], + tag = Base_Info[20], + tag_s = Base_Info[21], + tag_s_lazy = Base_Info[22], + tag_arg = Base_Info[23], + of_list = Base_Info[24], + of_exn = Base_Info[25], + to_exn = Base_Info[26], + pp = Base_Info[27], + Internal_repr = Base_Info[28]; + function raise(t){ + throw caml_maybe_attach_backtrace(caml_call1(to_exn, t), 1); + } + function raise_s(sexp){return raise(caml_call1(create_s, sexp));} + function to_info(t){return t;} + function of_info(t){return t;} + var + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + Base_Error = + [0, + compare, + equal, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + invariant, + to_string_hum, + to_string_mach, + to_string_hum_deprecated, + of_string, + of_lazy, + of_lazy_sexp, + of_thunk, + of_lazy_t, + create, + create_s, + createf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + of_list, + of_exn, + to_exn, + pp$0, + Internal_repr, + raise, + raise_s, + to_info, + of_info]; + runtime.caml_register_global(4, Base_Error, "Base__Error"); + return; + } + (globalThis)); + +//# 8898 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_List = global_data.Base__List, + Base_Error = global_data.Base__Error, + Base_With_return = global_data.Base__With_return, + Assert_failure = global_data.Assert_failure, + Base_Result = global_data.Base__Result, + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Applicative = global_data.Base__Applicative, + ignore_m = Base_Result[14], + join = Base_Result[13], + return$0 = Base_Result[12], + bind = Base_Result[11], + symbol_bind = Base_Result[7], + _c_ = [0, "src/or_error.ml", 135, 22], + cst_unimplemented = "unimplemented", + _b_ = [0, 3553398], + _a_ = Base_Result[30]; + function compare(cmp_a, a_001, b_002){ + return caml_call4(Base_Result[4], cmp_a, Base_Error[1], a_001, b_002); + } + function equal(cmp_a, a_007, b_008){ + return caml_call4(Base_Result[5], cmp_a, Base_Error[2], a_007, b_008); + } + function hash_fold_t(hash_fold_a, hsv, arg){ + return caml_call4(Base_Result[6], hash_fold_a, Base_Error[3], hsv, arg); + } + function t_of_sexp(of_a_013, x_015){ + return caml_call3(Base_Result[1], of_a_013, Base_Error[5], x_015); + } + function sexp_of_t(of_a_016, x_017){ + return caml_call3(Base_Result[2], of_a_016, Base_Error[6], x_017); + } + function t_sexp_grammar(a_sexp_grammar){ + return caml_call2(Base_Result[3], a_sexp_grammar, Base_Error[7]); + } + function invariant(invariant_a, t){ + if(0 === t[0]){var a = t[1]; return caml_call1(invariant_a, a);} + var error = t[1]; + return caml_call1(Base_Error[8], error); + } + function apply(f, x){ + function _y_(e1, e2){ + return caml_call2(Base_Error[24], 0, [0, e1, [0, e2, 0]]); + } + function _z_(f, x){return caml_call1(f, x);} + return caml_call4(Base_Result[32], f, x, _z_, _y_); + } + var + map = [0, -198771759, _a_], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13], + include$0 = Base_Result[10], + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Open_on_rhs = [0], + ok = Base_Result[23], + is_ok = Base_Result[21], + is_error = Base_Result[22]; + function try_with(opt, f){ + if(opt) var sth = opt[1], backtrace = sth; else var backtrace = 0; + try{var _x_ = [0, caml_call1(f, 0)]; return _x_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0), _w_ = backtrace ? _b_ : 0; + return [1, caml_call2(Base_Error[25], _w_, exn)]; + } + } + function try_with_join(backtrace, f){ + return caml_call1(join, try_with(backtrace, f)); + } + function ok_exn(param){ + if(0 === param[0]){var x = param[1]; return x;} + var err = param[1]; + return caml_call1(Base_Error[29], err); + } + function of_exn(backtrace, exn){ + return [1, caml_call2(Base_Error[25], backtrace, exn)]; + } + function of_exn_result(backtrace, z){ + if(0 === z[0]) return z; + var exn = z[1]; + return of_exn(backtrace, exn); + } + function error(here, strict, message, a, sexp_of_a){ + return [1, + caml_call5(Base_Error[17], here, strict, message, a, sexp_of_a)]; + } + function error_s(sexp){return [1, caml_call1(Base_Error[18], sexp)];} + function error_string(message){ + return [1, caml_call1(Base_Error[12], message)]; + } + function errorf(format){ + return caml_call2(Base_Printf[4], error_string, format); + } + function tag(t, tag){ + var _t_ = Base_Error[20]; + function _u_(_v_){return caml_call2(_t_, _v_, tag);} + return caml_call2(Base_Result[31], t, _u_); + } + function tag_s(t, tag){ + var _q_ = Base_Error[21]; + function _r_(_s_){return caml_call2(_q_, _s_, tag);} + return caml_call2(Base_Result[31], t, _r_); + } + function tag_s_lazy(t, tag){ + var _n_ = Base_Error[22]; + function _o_(_p_){return caml_call2(_n_, _p_, tag);} + return caml_call2(Base_Result[31], t, _o_); + } + function tag_arg(t, message, a, sexp_of_a){ + function _m_(e){ + return caml_call4(Base_Error[23], e, message, a, sexp_of_a); + } + return caml_call2(Base_Result[31], t, _m_); + } + function unimplemented(s){ + return error(0, 0, cst_unimplemented, s, Base_Import[139]); + } + function combine_errors(l){ + var arg = Base_Error[24]; + function _k_(eta){return caml_call2(arg, 0, eta);} + var _l_ = caml_call1(Base_Result[33], l); + return caml_call2(Base_Result[31], _l_, _k_); + } + function combine_errors_unit(l){ + function _i_(param){return 0;} + var _j_ = combine_errors(l); + return caml_call2(Base_Result[30], _j_, _i_); + } + function filter_ok_at_least_one(l){ + var + match = caml_call2(Base_List[57], l, Base_Result[35]), + errs = match[2], + ok = match[1]; + return ok ? [0, ok] : [1, caml_call2(Base_Error[24], 0, errs)]; + } + function find_ok(l){ + var match = caml_call2(Base_List[17], l, Base_Result[23]); + if(match){var x = match[1]; return [0, x];} + function _g_(param){ + if(0 === param[0]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var err = param[1]; + return err; + } + var _h_ = caml_call2(Base_List[76], l, _g_); + return [1, caml_call2(Base_Error[24], 0, _h_)]; + } + function find_map_ok(l, f){ + function _d_(param){ + function _e_(elt){ + var x = caml_call1(f, elt); + if(0 === x[0]) return caml_call1(param, x); + var err = x[1]; + return err; + } + var _f_ = caml_call2(Base_List[76], l, _e_); + return [1, caml_call2(Base_Error[24], 0, _f_)]; + } + return caml_call1(Base_With_return[1], _d_); + } + var + map$1 = Base_Result[30], + iter = Base_Result[28], + iter_error = Base_Result[29], + Base_Or_error = + [0, + compare, + equal, + hash_fold_t, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + invariant, + symbol_bind, + symbol_map, + Base_Result[10], + bind, + return$1, + join, + ignore_m, + all, + all_unit, + [0, + return$1, + symbol_bind$0, + symbol_map$0, + [0, return$1, bind, map$0, both, Open_on_rhs]], + is_ok, + is_error, + try_with, + try_with_join, + ok, + ok_exn, + of_exn, + of_exn_result, + error, + error_s, + error_string, + errorf, + tag, + tag_s, + tag_s_lazy, + tag_arg, + unimplemented, + map$1, + iter, + iter_error, + combine_errors, + combine_errors_unit, + filter_ok_at_least_one, + find_ok, + find_map_ok]; + runtime.caml_register_global(11, Base_Or_error, "Base__Or_error"); + return; + } + (globalThis)); + +//# 9171 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Neg = "Neg", + cst_Pos = "Pos", + cst_Zero = "Zero", + cst_neg = "neg", + cst_pos = "pos", + cst_zero = "zero", + caml_int_compare = runtime.caml_int_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_003 = "sign0.ml.t", + t_sexp_grammar = + [3, + [0, + 2, + [0, + [1, [0, cst_Neg, 0]], + [0, [1, [0, cst_Zero, 0]], [0, [1, [0, cst_Pos, 0]], 0]]]]], + all = [0, 0, [0, 1, [0, 2, 0]]], + module_name = "Base.Sign", + Base_Import = global_data.Base__Import, + Base_Poly0 = global_data.Base__Poly0, + Base_Hash = global_data.Base__Hash, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + _a_ = [0, cst_Neg], + _b_ = [0, cst_Zero], + _c_ = [0, cst_Pos]; + function t_of_sexp(sexp_004){ + if(0 === sexp_004[0]){ + var _e_ = sexp_004[1], switch$0 = 0; + if(caml_string_notequal(_e_, cst_Neg)){ + var switch$1 = 0; + if(caml_string_notequal(_e_, cst_Pos)){ + var switch$2 = 0; + if(caml_string_notequal(_e_, cst_Zero)){ + if(caml_string_notequal(_e_, cst_neg)) + if(caml_string_notequal(_e_, cst_pos)) + if(caml_string_notequal(_e_, cst_zero)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) return 1; + } + else + switch$1 = 1; + if(switch$1) return 2; + } + if(! switch$0) return 0; + } + else{ + var _f_ = sexp_004[1]; + if(! _f_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_003, sexp_004); + var _g_ = _f_[1]; + if(0 !== _g_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_003, sexp_004); + var _h_ = _g_[1], switch$3 = 0; + if(caml_string_notequal(_h_, cst_Neg)){ + var switch$4 = 0; + if(caml_string_notequal(_h_, cst_Pos)){ + var switch$5 = 0; + if(caml_string_notequal(_h_, cst_Zero)){ + if(caml_string_notequal(_h_, cst_neg)) + if(caml_string_notequal(_h_, cst_pos)) + if(caml_string_notequal(_h_, cst_zero)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + else + switch$4 = 1; + if(switch$4) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + if(! switch$3) + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_003, sexp_004); + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_003, sexp_004); + } + function sexp_of_t(param){ + switch(param){case 0: return _a_;case 1: return _b_;default: return _c_; + } + } + var compare = caml_int_compare; + function hash_fold_t(hsv, arg){ + switch(arg){ + case 0: + return caml_call2(Base_Hash[3], hsv, 0); + case 1: + return caml_call2(Base_Hash[3], hsv, 1); + default: return caml_call2(Base_Hash[3], hsv, 2); + } + } + function symbol(x, y){return x < y ? 1 : 0;} + function symbol$0(x, y){return x <= y ? 1 : 0;} + function symbol$1(x, y){return x !== y ? 1 : 0;} + function symbol$2(x, y){return x === y ? 1 : 0;} + function symbol$3(x, y){return y < x ? 1 : 0;} + function symbol$4(x, y){return y <= x ? 1 : 0;} + function ascending(x, y){return caml_call2(Base_Poly0[1], x, y);} + function descending(x, y){return caml_call2(Base_Poly0[2], x, y);} + var compare$0 = caml_int_compare; + function equal(x, y){return x === y ? 1 : 0;} + function max(x, y){return y <= x ? x : y;} + function min(x, y){return x <= y ? x : y;} + var + Replace_polymorphic_compare = + [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + ascending, + descending, + compare$0, + equal, + max, + min]; + function of_string(s){return t_of_sexp(caml_call1(Base_Import[139], s));} + function to_string(t){ + var _d_ = sexp_of_t(t); + return caml_call1(Base_Import[163], _d_); + } + function to_int(param){ + switch(param){case 0: return -1;case 1: return 0;default: return 1; + } + } + function of_int(n){return 0 <= n ? 0 === n ? 1 : 2 : 0;} + var + Base_Sign0 = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + all, + Replace_polymorphic_compare, + of_string, + to_string, + to_int, + to_int, + module_name, + of_int]; + runtime.caml_register_global(23, Base_Sign0, "Base__Sign0"); + return; + } + (globalThis)); + +//# 9355 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Comparable_intf = [0]; + runtime.caml_register_global + (0, Base_Comparable_intf, "Base__Comparable_intf"); + return; + } + (globalThis)); + +//# 9366 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_clamp_requires_min_max$1 = "clamp requires [min <= max]", + cst_max$1 = "max", + cst_min$1 = "min", + cst_src_comparable_ml = "src/comparable.ml", + caml_compare = runtime.caml_compare, + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparator = global_data.Base__Comparator, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Poly0 = global_data.Base__Poly0, + Base_Sign0 = global_data.Base__Sign0, + cst_max$0 = cst_max$1, + cst_min$0 = cst_min$1, + cst_clamp_requires_min_max$0 = cst_clamp_requires_min_max$1, + _b_ = [0, cst_src_comparable_ml, 133, 4], + cst_max = cst_max$1, + cst_min = cst_min$1, + cst_clamp_requires_min_max = cst_clamp_requires_min_max$1, + _a_ = [0, cst_src_comparable_ml, 47, 4]; + function geq(cmp, a, b){return 0 <= caml_call2(cmp, a, b) ? 1 : 0;} + function leq(cmp, a, b){return caml_call2(cmp, a, b) <= 0 ? 1 : 0;} + function equal(cmp, a, b){return 0 === caml_call2(cmp, a, b) ? 1 : 0;} + function min(cmp, t$0, t){return leq(cmp, t$0, t) ? t$0 : t;} + function max(cmp, t$0, t){return geq(cmp, t$0, t) ? t$0 : t;} + function Infix(T){ + function symbol(a, b){ + var cmp = T[1]; + return 0 < caml_call2(cmp, a, b) ? 1 : 0; + } + function symbol$0(a, b){ + var cmp = T[1]; + return caml_call2(cmp, a, b) < 0 ? 1 : 0; + } + function symbol$1(a, b){return geq(T[1], a, b);} + function symbol$2(a, b){return leq(T[1], a, b);} + function symbol$3(a, b){return equal(T[1], a, b);} + function symbol$4(a, b){ + var cmp = T[1]; + return 0 !== caml_call2(cmp, a, b) ? 1 : 0; + } + return [0, symbol$1, symbol$2, symbol$3, symbol, symbol$0, symbol$4]; + } + function Polymorphic_compare(T){ + var + include = Infix(T), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + compare = T[1]; + function min$0(t$0, t){return min(compare, t$0, t);} + function max$0(t$0, t){return max(compare, t$0, t);} + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$1, + compare, + min$0, + max$0]; + } + function Make_using_comparator(T){ + var + sexp_of_t = T[1], + comparator = T[2], + compare = comparator[1], + Replace_polymorphic_compare = Polymorphic_compare([0, compare]), + symbol = Replace_polymorphic_compare[1], + symbol$0 = Replace_polymorphic_compare[2], + symbol$1 = Replace_polymorphic_compare[3], + symbol$2 = Replace_polymorphic_compare[4], + symbol$3 = Replace_polymorphic_compare[5], + symbol$4 = Replace_polymorphic_compare[6], + equal = Replace_polymorphic_compare[7], + compare$0 = Replace_polymorphic_compare[8], + min = Replace_polymorphic_compare[9], + max = Replace_polymorphic_compare[10]; + function descending(t$0, t){return caml_call2(compare$0, t, t$0);} + function between(t, low, high){ + var _s_ = caml_call2(symbol$0, low, t); + return _s_ ? caml_call2(symbol$0, t, high) : _s_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(symbol$3, t, min) + ? min + : caml_call2(symbol$0, t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(symbol$0, min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(symbol$2, min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _p_ = [0, [0, cst_max$0, caml_call1(sexp_of_t, max)], 0], + _q_ = [0, [0, cst_min$0, caml_call1(sexp_of_t, min)], _p_], + _r_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max$0, _q_); + return caml_call1(Base_Or_error[35], _r_); + } + return [0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + compare$0, + descending, + between, + clamp_exn, + clamp, + comparator]; + } + function Make(T){ + var + sexp_of_t = T[2], + include = caml_call1(Base_Comparator[5], T), + comparator = include[1]; + return Make_using_comparator([0, sexp_of_t, comparator]); + } + function Inherit(C, T){ + var sexp_of_t = T[1]; + function compare(t$0, t){ + var _n_ = caml_call1(T[2], t), _o_ = caml_call1(T[2], t$0); + return caml_call2(C[1], _o_, _n_); + } + return Make([0, compare, sexp_of_t]); + } + function lexicographic(cmps, x, y){ + var param = cmps; + for(;;){ + if(! param) return 0; + var cmps$0 = param[2], cmp = param[1], res = caml_call2(cmp, x, y); + if(0 !== res) return res; + var param = cmps$0; + } + } + function lift(cmp, f, x, y){ + var _m_ = caml_call1(f, y); + return caml_call2(cmp, caml_call1(f, x), _m_); + } + function reverse(cmp, x, y){return caml_call2(cmp, y, x);} + function _c_(_i_){ + var _j_ = _i_[3], _k_ = _i_[1]; + function is_positive(t){return 0 < caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_non_negative(t){return 0 <= caml_call2(_k_, t, _j_) ? 1 : 0;} + function is_negative(t){return caml_call2(_k_, t, _j_) < 0 ? 1 : 0;} + function is_non_positive(t){return caml_call2(_k_, t, _j_) <= 0 ? 1 : 0;} + function sign(t){ + var _l_ = caml_call2(_k_, t, _j_); + return caml_call1(Base_Sign0[13], _l_); + } + return [0, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign]; + } + var + Base_Comparable = + [0, + lexicographic, + lift, + reverse, + equal, + max, + min, + Infix, + Polymorphic_compare, + Inherit, + Make, + Make_using_comparator, + function(T){ + var + sexp_of_t = T[1], + ascending = Base_Poly0[1], + descending = Base_Poly0[2], + min = Base_Poly0[3], + max = Base_Poly0[4]; + function between(t, low, high){ + var + _g_ = caml_lessequal(low, t), + _h_ = _g_ ? caml_lessequal(t, high) : _g_; + return _h_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _d_ = [0, [0, cst_max, caml_call1(T[1], max)], 0], + _e_ = [0, [0, cst_min, caml_call1(T[1], min)], _d_], + _f_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _e_); + return caml_call1(Base_Or_error[35], _f_); + } + var + include = + caml_call1(Base_Comparator[5], [0, caml_compare, sexp_of_t]), + comparator = include[1]; + return [0, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + caml_equal, + caml_compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + }, + _c_]; + runtime.caml_register_global(14, Base_Comparable, "Base__Comparable"); + return; + } + (globalThis)); + +//# 9715 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Identifiable_intf = [0]; + runtime.caml_register_global + (0, Base_Identifiable_intf, "Base__Identifiable_intf"); + return; + } + (globalThis)); + +//# 9726 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer; + function _a_(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _c_ = caml_call1(Base_Comparable[11], [0, T[5], T[9]]), + symbol = _c_[1], + symbol$0 = _c_[2], + symbol$1 = _c_[3], + symbol$2 = _c_[4], + symbol$3 = _c_[5], + symbol$4 = _c_[6], + equal = _c_[7], + compare = _c_[8], + min = _c_[9], + max = _c_[10], + ascending = _c_[11], + descending = _c_[12], + between = _c_[13], + clamp_exn = _c_[14], + clamp = _c_[15], + comparator = _c_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + } + var + Base_Identifiable = + [0, + function(T){ + var + hash_fold_t = T[2], + hash = T[3], + t_of_sexp = T[4], + sexp_of_t = T[5], + of_string = T[6], + to_string = T[7], + _b_ = caml_call1(Base_Comparable[10], [0, T[1], T[5]]), + symbol = _b_[1], + symbol$0 = _b_[2], + symbol$1 = _b_[3], + symbol$2 = _b_[4], + symbol$3 = _b_[5], + symbol$4 = _b_[6], + equal = _b_[7], + compare = _b_[8], + min = _b_[9], + max = _b_[10], + ascending = _b_[11], + descending = _b_[12], + between = _b_[13], + clamp_exn = _b_[14], + clamp = _b_[15], + comparator = _b_[16], + include = caml_call1(Base_Pretty_printer[2], [0, T[8], T[7]]), + pp = include[1], + hashable = [0, hash, compare, sexp_of_t]; + return [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable]; + }, + _a_]; + runtime.caml_register_global(2, Base_Identifiable, "Base__Identifiable"); + return; + } + (globalThis)); + +//# 9858 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst$0 = "()"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + cst = cst$0, + all = [0, 0, 0], + module_name = "Base.Unit", + Base_Import = global_data.Base__Import, + Base_Identifiable = global_data.Base__Identifiable, + hash_fold_t = Base_Import[211], + func = Base_Import[225], + cst_Base_Unit_of_string_expect = "Base.Unit.of_string: () expected"; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[161], + sexp_of_t = Base_Import[137], + t_sexp_grammar = Base_Import[181]; + function compare(param, _a_){return 0;} + function of_string(param){ + return runtime.caml_string_notequal(param, cst$0) + ? caml_call1(Base_Import[124], cst_Base_Unit_of_string_expect) + : 0; + } + function to_string(param){return cst;} + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + symbol = include[7], + symbol$0 = include[8], + symbol$1 = include[9], + symbol$2 = include[10], + symbol$3 = include[11], + symbol$4 = include[12], + equal = include[13], + compare$0 = include[14], + min = include[15], + max = include[16], + ascending = include[17], + descending = include[18], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + pp = include[23], + hashable = include[24]; + function invariant(param){return 0;} + var + Base_Unit = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant]; + runtime.caml_register_global(7, Base_Unit, "Base__Unit"); + return; + } + (globalThis)); + +//# 9964 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib, + Base_Or_error = global_data.Base__Or_error, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common0, + get_pos_len_exn = Base_Ordered_collection_common[1], + check_pos_len_exn = Base_Ordered_collection_common[2], + Private = Base_Ordered_collection_common[3]; + function get_pos_len(pos, len, param, total_length){ + try{ + var _a_ = [0, caml_call4(get_pos_len_exn, pos, len, 0, total_length)]; + return _a_; + } + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] !== Stdlib[6]) throw caml_maybe_attach_backtrace(exn, 0); + var s = exn[2]; + return caml_call1(Base_Or_error[36], s); + } + } + var + Base_Ordered_collection_common$0 = + [0, get_pos_len_exn, check_pos_len_exn, Private, get_pos_len]; + runtime.caml_register_global + (3, Base_Ordered_collection_common$0, "Base__Ordered_collection_common"); + return; + } + (globalThis)); + +//# 10013 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Fn = global_data.Base__Fn; + function find_first_satisfying(pos, len, t, get, length, pred){ + var + _e_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _e_), + len$0 = match[2], + pos$0 = match[1], + _f_ = caml_call2(Base_Import[91], pos$0, len$0), + hi$0 = caml_call2(Base_Import[93], _f_, 1), + lo$1 = pos$0, + hi = hi$0; + for(;;){ + if(8 < caml_call2(Base_Import[93], hi, lo$1)){ + var + _c_ = caml_call2(Base_Import[93], hi, lo$1), + _d_ = caml_call2(Base_Import[95], _c_, 2), + mid = caml_call2(Base_Import[91], lo$1, _d_); + if(caml_call1(pred, caml_call2(get, t, mid))){var hi = mid; continue;} + var lo$2 = caml_call2(Base_Import[91], mid, 1), lo$1 = lo$2; + continue; + } + var lo = lo$1; + for(;;){ + if(hi < lo) return 0; + if(caml_call1(pred, caml_call2(get, t, lo))) return [0, lo]; + var lo$0 = caml_call2(Base_Import[91], lo, 1), lo = lo$0; + } + } + } + function find_last_satisfying(pos, len, t, pred, get, length){ + var + _a_ = caml_call1(length, t), + match = caml_call4(Base_Ordered_collection_common[1], pos, len, 0, _a_), + len$0 = match[2], + pos$0 = match[1]; + if(0 === len$0) return 0; + var + match$0 = + find_first_satisfying + ([0, pos$0], [0, len$0], t, get, length, caml_call1(Base_Fn[2], pred)); + if(match$0){ + var i = match$0[1]; + return i === pos$0 ? 0 : [0, caml_call2(Base_Import[93], i, 1)]; + } + var _b_ = caml_call2(Base_Import[91], pos$0, len$0); + return [0, caml_call2(Base_Import[93], _b_, 1)]; + } + function binary_search(pos, len, t, length, get, compare, how, v){ + if(-839473056 <= how) + return 200870407 <= how + ? 926943384 + <= how + ? find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}) + : find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) < 0 ? 1 : 0;}, + get, + length) + : -253007807 + <= how + ? find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length) + : find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 < caml_call2(compare, x, v) ? 1 : 0;}); + if(-1055410545 <= how){ + var + match = + find_last_satisfying + (pos, + len, + t, + function(x){return caml_call2(compare, x, v) <= 0 ? 1 : 0;}, + get, + length); + if(match){ + var x = match[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x), v)) return [0, x]; + } + return 0; + } + var + match$0 = + find_first_satisfying + (pos, + len, + t, + get, + length, + function(x){return 0 <= caml_call2(compare, x, v) ? 1 : 0;}); + if(match$0){ + var x$0 = match$0[1]; + if(0 === caml_call2(compare, caml_call2(get, t, x$0), v)) + return [0, x$0]; + } + return 0; + } + function binary_search_segmented(pos, len, t, length, get, segment_of, how){ + function is_left(x){ + return 847852583 <= caml_call1(segment_of, x) ? 1 : 0; + } + function is_right(x){return 1 - is_left(x);} + return 125585502 <= how + ? find_last_satisfying(pos, len, t, is_left, get, length) + : find_first_satisfying(pos, len, t, get, length, is_right); + } + var Base_Binary_search = [0, binary_search, binary_search_segmented]; + runtime.caml_register_global(3, Base_Binary_search, "Base__Binary_search"); + return; + } + (globalThis)); + +//# 10167 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + all = + [0, + 200870407, + [0, + -253007807, + [0, -1055410545, [0, -1056898635, [0, 926943384, [0, -839473056, 0]]]]]], + all$0 = [0, 125585502, [0, -63348021, 0]], + Which_target_by_key = [0, all], + Which_target_by_segment = [0, all$0], + Base_Binary_searchable_intf = + [0, Which_target_by_key, Which_target_by_segment]; + runtime.caml_register_global + (2, Base_Binary_searchable_intf, "Base__Binary_searchable_intf"); + return; + } + (globalThis)); + +//# 10190 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call7(f, a0, a1, a2, a3, a4, a5, a6){ + return (f.l >= 0 ? f.l : f.l = f.length) == 7 + ? f(a0, a1, a2, a3, a4, a5, a6) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Binary_search = global_data.Base__Binary_search; + function Make_gen(T){ + var get = T[1], length = T[2]; + function binary_search(pos, len, t, compare, how, v){ + return caml_call8 + (Base_Binary_search[1], + pos, + len, + t, + length, + get, + compare, + how, + v); + } + function binary_search_segmented(pos, len, t, segment_of, how){ + return caml_call7 + (Base_Binary_search[2], + pos, + len, + t, + length, + get, + segment_of, + how); + } + return [0, get, length, binary_search, binary_search_segmented]; + } + function _a_(T){ + var get = T[1], length = T[2], _c_ = Make_gen([0, get, length]); + return [0, _c_[3], _c_[4]]; + } + var + Base_Binary_searchable = + [0, + function(T){ + var get = T[1], length = T[2], _b_ = Make_gen([0, get, length]); + return [0, _b_[3], _b_[4]]; + }, + _a_]; + runtime.caml_register_global + (1, Base_Binary_searchable, "Base__Binary_searchable"); + return; + } + (globalThis)); + +//# 10253 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Blit_intf = [0]; + runtime.caml_register_global(0, Base_Blit_intf, "Base__Blit_intf"); + return; + } + (globalThis)); + +//# 10263 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common; + function Make_gen(Src, Dst){ + var unsafe_blit = Dst[3]; + function blit(src, src_pos, dst, dst_pos, len){ + var _q_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], src_pos, len, _q_); + var _r_ = caml_call1(Dst[1], dst); + caml_call3(Base_Ordered_collection_common[2], dst_pos, len, _r_); + var _s_ = 0 < len ? 1 : 0; + return _s_ + ? caml_call5(unsafe_blit, src, src_pos, dst, dst_pos, len) + : _s_; + } + function blito(src, opt, _o_, dst, _n_, param){ + if(opt) var sth = opt[1], src_pos = sth; else var src_pos = 0; + if(_o_) + var sth$0 = _o_[1], src_len = sth$0; + else + var + _p_ = caml_call1(Src[1], src), + src_len = caml_call2(Base_Import[93], _p_, src_pos); + if(_n_) var sth$1 = _n_[1], dst_pos = sth$1; else var dst_pos = 0; + return blit(src, src_pos, dst, dst_pos, src_len); + } + function sub(src, pos, len){ + var _m_ = caml_call1(Src[1], src); + caml_call3(Base_Ordered_collection_common[2], pos, len, _m_); + var dst = caml_call2(Dst[2], len, src); + if(0 < len) caml_call5(unsafe_blit, src, pos, dst, 0, len); + return dst; + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var + _l_ = caml_call1(Src[1], src), + i$0 = caml_call2(Base_Import[93], _l_, pos); + return sub(src, pos, i$0); + } + return [0, unsafe_blit, blit, blito, sub, subo]; + } + function Make_to_string(T, To_bytes){ + function sub(src, pos, len){ + var _k_ = caml_call3(To_bytes[4], src, pos, len); + return caml_call1(Base_Bytes0[16], _k_); + } + function subo(pos, len, src){ + var _j_ = caml_call3(To_bytes[5], pos, len, src); + return caml_call1(Base_Bytes0[16], _j_); + } + return [0, sub, subo]; + } + function _a_(_h_){ + var _i_ = Make_gen([0, _h_[2]], [0, _h_[2], _h_[1], _h_[3]]); + return [0, _i_[2], _i_[3], _i_[1], _i_[4], _i_[5]]; + } + function _b_(_e_){ + var _f_ = [0, _e_[2], _e_[1], _e_[3]], _g_ = Make_gen([0, _f_[1]], _f_); + return [0, _g_[2], _g_[3], _g_[1], _g_[4], _g_[5]]; + } + function _c_(Src, Dst){ + var length = Dst[1]; + function create_like(len, param){return caml_call1(Dst[2], len);} + var + unsafe_blit = Dst[3], + length$0 = Src[1], + _d_ = Make_gen([0, length$0], [0, length, create_like, unsafe_blit]); + return [0, _d_[2], _d_[3], _d_[1], _d_[4], _d_[5]]; + } + var + Base_Blit = + [0, + function(Sequence){ + function create_like(len, param){return caml_call1(Sequence[2], len);} + var + length = Sequence[1], + unsafe_blit = Sequence[3], + include = + Make_gen([0, length], [0, length, create_like, unsafe_blit]), + unsafe_blit$0 = include[1], + blit = include[2], + blito = include[3], + sub = include[4], + subo = include[5]; + return [0, blit, blito, unsafe_blit$0, sub, subo]; + }, + _c_, + Make_to_string, + _b_, + _a_]; + runtime.caml_register_global(3, Base_Blit, "Base__Blit"); + return; + } + (globalThis)); + +//# 10400 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Container = global_data.Base__Container, + Base_Source_code_position0 = global_data.Base__Source_code_position0, + Base_Error = global_data.Base__Error, + Base_Import = global_data.Base__Import, + Base_Monad = global_data.Base__Monad, + Base_Applicative = global_data.Base__Applicative, + compare = Base_Import[237], + hash_fold_t = Base_Import[212], + t_of_sexp = Base_Import[173], + sexp_of_t = Base_Import[149], + cst_Option_value_exn = "Option.value_exn", + cst_Option_value_exn_None = "Option.value_exn None"; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[194], a_sexp_grammar); + } + function is_none(param){return param ? 0 : 1;} + function is_some(param){return param ? 1 : 0;} + function value_map(o, default$0, f){ + if(! o) return default$0; + var x = o[1]; + return caml_call1(f, x); + } + function iter(o, f){ + if(! o) return 0; + var a = o[1]; + return caml_call1(f, a); + } + function invariant(f, t){return iter(t, f);} + function call(x, f){ + if(! f) return 0; + var f$0 = f[1]; + return caml_call1(f$0, x); + } + function value(t, default$0){ + if(! t) return default$0; + var x = t[1]; + return x; + } + function value_exn(here, error, message, t){ + if(t){var x = t[1]; return x;} + if(here){ + var p = here[1]; + if(error) + var + e = error[1], + _g_ = + caml_call2 + (Base_Import[150], Base_Error[6], Base_Source_code_position0[8]), + _h_ = value(message, cst), + _i_ = caml_call5(Base_Error[17], 0, 0, _h_, [0, e, p], _g_); + else if(message) + var + m = message[1], + _i_ = + caml_call5(Base_Error[17], 0, 0, m, p, Base_Source_code_position0[8]); + else + var + _i_ = + caml_call5 + (Base_Error[17], + 0, + 0, + cst_Option_value_exn, + p, + Base_Source_code_position0[8]); + var error$0 = _i_; + } + else if(error){ + var e$0 = error[1]; + if(message) + var m$0 = message[1], _j_ = caml_call2(Base_Error[20], e$0, m$0); + else + var _j_ = e$0; + var error$0 = _j_; + } + else if(message) + var m$1 = message[1], error$0 = caml_call1(Base_Error[12], m$1); + else + var error$0 = caml_call1(Base_Error[12], cst_Option_value_exn_None); + return caml_call1(Base_Error[29], error$0); + } + function value_or_thunk(o, default$0){ + if(! o) return caml_call1(default$0, 0); + var x = o[1]; + return x; + } + function to_array(t){if(! t) return [0]; var x = t[1]; return [0, x];} + function to_list(t){if(! t) return 0; var x = t[1]; return [0, x, 0];} + function min_elt(t, param){return t;} + function max_elt(t, param){return t;} + function sum(M){return function(t, f){return value_map(t, M[1], f);};} + function for_all(t, f){ + if(! t) return 1; + var x = t[1]; + return caml_call1(f, x); + } + function exists(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x); + } + function mem(t, a, equal){ + if(! t) return 0; + var a$0 = t[1]; + return caml_call2(equal, a, a$0); + } + function length(t){return t ? 1 : 0;} + function fold(t, init, f){ + if(! t) return init; + var x = t[1]; + return caml_call2(f, init, x); + } + function count(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a) ? 1 : 0; + } + function find(t, f){ + if(! t) return 0; + var x = t[1]; + return caml_call1(f, x) ? t : 0; + } + function find_map(t, f){ + if(! t) return 0; + var a = t[1]; + return caml_call1(f, a); + } + function equal(f, t$0, t){ + if(t$0){ + if(t){var x = t[1], x$0 = t$0[1]; return caml_call2(f, x$0, x);} + } + else if(! t) return 1; + return 0; + } + function some(x){return [0, x];} + function first_some(x, y){return x ? x : y;} + function some_if(cond, x){return cond ? [0, x] : 0;} + function merge(a, b, f){ + if(a){ + if(b){var b$0 = b[1], a$0 = a[1]; return [0, caml_call2(f, a$0, b$0)];} + var x = a; + } + else + var x = b; + return x; + } + function filter(t, f){ + if(t){var v = t[1]; if(caml_call1(f, v)) return t;} + return 0; + } + function try_with(f){ + try{var x = caml_call1(f, 0);}catch(_f_){return 0;} + return [0, x]; + } + function try_with_join(f){ + try{var x = caml_call1(f, 0); return x;}catch(_e_){return 0;} + } + function _a_(t, f){ + if(! t) return 0; + var a = t[1]; + return [0, caml_call1(f, a)]; + } + function apply(f, x){if(! f) return 0; var f$0 = f[1]; return _a_(x, f$0);} + function return$0(x){return [0, x];} + var map = [0, -198771759, _a_]; + function bind(o, f){ + if(! o) return 0; + var x = o[1]; + return caml_call1(f, x); + } + var + _b_ = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = _b_[1], + Monad_infix = _b_[3], + bind$0 = _b_[4], + join = _b_[7], + ignore_m = _b_[8], + Let_syntax = _b_[11], + include = caml_call1(Base_Applicative[5], [0, return$0, apply, map]), + return$1 = include[1], + map$0 = include[2], + both = include[3], + symbol = include[4], + symbol$0 = include[5], + symbol$1 = include[6], + symbol_map = include[7], + apply$0 = include[8], + map2 = include[9], + map3 = include[10], + all = include[11], + all_unit = include[12], + Applicative_infix = include[13]; + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _c_ = caml_call3(Base_Container[9], fold, init, f); + return function(_d_){return caml_call2(_c_, _d_, t);}; + } + var + Base_Option = + [0, + compare, + hash_fold_t, + t_sexp_grammar, + equal, + invariant, + t_of_sexp, + sexp_of_t, + both, + symbol, + symbol$0, + symbol$1, + apply$0, + map2, + map3, + Applicative_infix, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + value, + value_exn, + value_map, + value_or_thunk, + fold, + mem, + length, + iter, + exists, + for_all, + find, + find_map, + to_list, + to_array, + call, + merge, + filter, + try_with, + try_with_join, + some, + first_some, + some_if, + is_none, + is_some, + is_none, + fold_result, + fold_until, + min_elt, + max_elt, + count, + sum]; + runtime.caml_register_global(9, Base_Option, "Base__Option"); + return; + } + (globalThis)); + +//# 10698 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + cst_Sexpable_Of_stringable_t_o = + "Sexpable.Of_stringable.t_of_sexp expected an atom, but got a list"; + function Of_sexpable(Sexpable, M){ + function t_of_sexp(sexp){ + var s = caml_call1(Sexpable[1], sexp); + try{var _i_ = caml_call1(M[2], s); return _i_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){ + var _h_ = caml_call1(M[1], t); + return caml_call1(Sexpable[2], _h_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable1(Sexpable, M){ + function t_of_sexp(a_of_sexp, sexp){ + var s = caml_call2(Sexpable[1], a_of_sexp, sexp); + try{var _g_ = caml_call1(M[2], s); return _g_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, t){ + var _f_ = caml_call1(M[1], t); + return caml_call2(Sexpable[2], sexp_of_a, _f_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable2(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, sexp){ + var s = caml_call3(Sexpable[1], a_of_sexp, b_of_sexp, sexp); + try{var _e_ = caml_call1(M[2], s); return _e_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, t){ + var _d_ = caml_call1(M[1], t); + return caml_call3(Sexpable[2], sexp_of_a, sexp_of_b, _d_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_sexpable3(Sexpable, M){ + function t_of_sexp(a_of_sexp, b_of_sexp, c_of_sexp, sexp){ + var s = caml_call4(Sexpable[1], a_of_sexp, b_of_sexp, c_of_sexp, sexp); + try{var _c_ = caml_call1(M[2], s); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(sexp_of_a, sexp_of_b, sexp_of_c, t){ + var _b_ = caml_call1(M[1], t); + return caml_call4(Sexpable[2], sexp_of_a, sexp_of_b, sexp_of_c, _b_); + } + return [0, t_of_sexp, sexp_of_t]; + } + function Of_stringable(M){ + function t_of_sexp(sexp){ + if(0 !== sexp[0]) + return caml_call2 + (Base_Import[159], cst_Sexpable_Of_stringable_t_o, sexp); + var s = sexp[1]; + try{var _a_ = caml_call1(M[1], s); return _a_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + return caml_call2(Base_Import[160], exn, sexp); + } + } + function sexp_of_t(t){return [0, caml_call1(M[2], t)];} + return [0, t_of_sexp, sexp_of_t]; + } + var + Base_Sexpable = + [0, + Of_sexpable, + Of_sexpable1, + Of_sexpable2, + Of_sexpable3, + Of_stringable]; + runtime.caml_register_global(2, Base_Sexpable, "Base__Sexpable"); + return; + } + (globalThis)); + +//# 11151 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Indexed_container_intf = [0]; + runtime.caml_register_global + (0, Base_Indexed_container_intf, "Base__Indexed_container_intf"); + return; + } + (globalThis)); + +//# 11162 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Container = global_data.Base__Container, + Base_With_return = global_data.Base__With_return, + with_return = Base_With_return[1]; + function iteri(fold, t, f){ + caml_call3 + (fold, t, 0, function(i, x){caml_call2(f, i, x); return i + 1 | 0;}); + return 0; + } + function foldi(fold, t, init, f){ + var i = [0, 0]; + return caml_call3 + (fold, + t, + init, + function(acc, v){ + var acc$0 = caml_call3(f, i[1], acc, v); + i[1] = i[1] + 1 | 0; + return acc$0; + }); + } + function counti(foldi, t, f){ + return caml_call3 + (foldi, + t, + 0, + function(i, n, a){return caml_call2(f, i, a) ? n + 1 | 0 : n;}); + } + function existsi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _d_ = caml_call2(f, i, x); + return _d_ ? caml_call1(r, 1) : _d_; + }); + return 0; + }); + } + function for_alli(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _c_ = 1 - caml_call2(f, i, x); + return _c_ ? caml_call1(r, 0) : _c_; + }); + return 1; + }); + } + function find_mapi(iteri, t, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + t, + function(i, x){ + var res = caml_call2(f, i, x); + return res ? caml_call1(r, res) : 0; + }); + return 0; + }); + } + function findi(iteri, c, f){ + return caml_call1 + (with_return, + function(r){ + caml_call2 + (iteri, + c, + function(i, x){ + var _b_ = caml_call2(f, i, x); + return _b_ ? caml_call1(r, [0, [0, i, x]]) : _b_; + }); + return 0; + }); + } + function Make_gen(T){ + var + include = caml_call1(Base_Container[18], [0, T[1], T[2], T[3]]), + length = include[1], + is_empty = include[2], + iter = include[3], + fold = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + match = T[4]; + if(typeof match === "number") + var iteri$0 = function(t, f){return iteri(fold, t, f);}; + else + var iteri$1 = match[2], iteri$0 = iteri$1; + var match$0 = T[5]; + if(typeof match$0 === "number") + var foldi$0 = function(t, init, f){return foldi(fold, t, init, f);}; + else + var foldi$1 = match$0[2], foldi$0 = foldi$1; + function counti$0(t, f){return counti(foldi$0, t, f);} + function existsi$0(t, f){return existsi(iteri$0, t, f);} + function for_alli$0(t, f){return for_alli(iteri$0, t, f);} + function find_mapi$0(t, f){return find_mapi(iteri$0, t, f);} + function findi$0(t, f){return findi(iteri$0, t, f);} + return [0, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi$0, + for_alli$0, + counti$0, + findi$0, + find_mapi$0]; + } + function _a_(T){ + var + C = caml_call1(Base_Container[17], [0, T[1], T[2], T[3], T[4]]), + mem = C[1], + fold = T[2], + iter = T[3], + length = T[4], + iteri = T[5], + foldi = T[6], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + } + var + Base_Indexed_container = + [0, + foldi, + iteri, + counti, + existsi, + for_alli, + findi, + find_mapi, + function(T){ + var + C = caml_call1(Base_Container[16], [0, T[1], T[2], T[3]]), + mem = C[1], + fold = T[1], + iter = T[2], + length = T[3], + iteri = T[4], + foldi = T[5], + include = Make_gen([0, fold, iter, length, iteri, foldi]), + length$0 = include[1], + is_empty = include[2], + iter$0 = include[3], + fold$0 = include[4], + fold_result = include[5], + fold_until = include[6], + exists = include[7], + for_all = include[8], + count = include[9], + sum = include[10], + find = include[11], + find_map = include[12], + to_list = include[13], + to_array = include[14], + min_elt = include[15], + max_elt = include[16], + foldi$0 = include[17], + iteri$0 = include[18], + existsi = include[19], + for_alli = include[20], + counti = include[21], + findi = include[22], + find_mapi = include[23]; + return [0, + mem, + length$0, + is_empty, + iter$0, + fold$0, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi$0, + iteri$0, + existsi, + for_alli, + counti, + findi, + find_mapi]; + }, + _a_, + Make_gen]; + runtime.caml_register_global + (2, Base_Indexed_container, "Base__Indexed_container"); + return; + } + (globalThis)); + +//# 11463 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Both$0 = "Both", + cst_Left$0 = "Left", + cst_Right$0 = "Right", + cst_Sequence_nth$1 = "Sequence.nth", + cst_both = "both", + cst_left = "left", + cst_right = "right", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + error_source_025 = "sequence.ml.Merge_with_duplicates_element.t", + Base_List1 = global_data.Base__List1, + Base_With_return = global_data.Base__With_return, + Base_Import = global_data.Base__Import, + CamlinternalLazy = global_data.CamlinternalLazy, + Base_Result = global_data.Base__Result, + Base_Container = global_data.Base__Container, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + Base_Monad = global_data.Base__Monad, + _j_ = [0, 0], + cst_Sequence_cycle_list_exn = "Sequence.cycle_list_exn", + cst_Sequence_drop = "Sequence.drop", + cst_Sequence_take = "Sequence.take", + cst_Sequence_sub = "Sequence.sub", + cst_Sequence_reduce_exn = "Sequence.reduce_exn", + cst_Sequence_find_exn = "Sequence.find_exn", + cst_Sequence_chunks_exn = "Sequence.chunks_exn", + cst_Sequence_tl_exn = "Sequence.tl_exn", + cst_hd_exn = "hd_exn", + cst_Both = cst_Both$0, + cst_Right = cst_Right$0, + cst_Left = cst_Left$0, + _g_ = [0, cst_Left$0], + _h_ = [0, cst_Right$0], + _i_ = [0, cst_Both$0], + cst_Sequence_nth$0 = cst_Sequence_nth$1, + cst_Sequence_nth = cst_Sequence_nth$1, + _f_ = [0, "src/sequence.ml", 259, 14], + _e_ = [0, 0, 0], + _a_ = [0, "Done"], + _b_ = [0, "Skip"], + _c_ = [0, "Yield"]; + function sexp_of_t(of_a_001, of_s_002, param){ + if(typeof param === "number") return _a_; + if(0 === param[0]){ + var arg0_003 = param[1], res0_004 = caml_call1(of_s_002, arg0_003); + return [1, [0, _b_, [0, res0_004, 0]]]; + } + var + arg1_006 = param[2], + arg0_005 = param[1], + res0_007 = caml_call1(of_a_001, arg0_005), + res1_008 = caml_call1(of_s_002, arg1_006); + return [1, [0, _c_, [0, res0_007, [0, res1_008, 0]]]]; + } + var Step = [0, sexp_of_t]; + function next_step(param){ + var f = param[2], s = param[1], match = caml_call1(f, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, s$0, f]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, s$1, f]]; + } + function delayed_fold_step(s, init, f, finish){ + function loop(s, next, finish, f, acc){ + var match = caml_call1(next, s); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){ + var s$0 = match[1]; + return caml_call3 + (f, + acc, + 0, + function(_Z_){return loop(s$0, next, finish, f, _Z_);}); + } + var s$1 = match[2], a = match[1]; + return caml_call3 + (f, + acc, + [0, a], + function(_Y_){return loop(s$1, next, finish, f, _Y_);}); + } + var next = s[2], s$0 = s[1]; + return loop(s$0, next, finish, f, init); + } + var Expert = [0, next_step, delayed_fold_step]; + function unfold_step(init, f){return [0, init, f];} + function unfold(init, f){ + return [0, + init, + function(s){ + var match = caml_call1(f, s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [1, a, s$0]; + }]; + } + function unfold_with(s, init, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, init, s$0], + function(param){ + var s = param[2], seed = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, seed, s$0]]; + } + var + s$1 = match[2], + a = match[1], + match$0 = caml_call2(f, seed, a); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var seed$0 = match$0[1]; + return [0, [0, seed$0, s$1]]; + } + var seed$1 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, seed$1, s$1]]; + }]; + } + function unfold_with_and_finish + (s, init, running_step, inner_finished, finishing_step){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -172306698, [0, init, s$0]], + function(state){ + if(301075099 <= state[1]){ + var + state$0 = state[2], + match = caml_call1(finishing_step, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var state$1 = match[1]; + return [0, [0, 301075099, state$1]]; + } + var state$2 = match[2], y = match[1]; + return [1, y, [0, 301075099, state$2]]; + } + var + match$0 = state[2], + inner_state = match$0[2], + state$3 = match$0[1], + match$1 = caml_call1(next, inner_state); + if(typeof match$1 === "number") + return [0, [0, 301075099, caml_call1(inner_finished, state$3)]]; + if(0 === match$1[0]){ + var inner_state$0 = match$1[1]; + return [0, [0, -172306698, [0, state$3, inner_state$0]]]; + } + var + inner_state$1 = match$1[2], + x = match$1[1], + match$2 = caml_call2(running_step, state$3, x); + if(typeof match$2 === "number") return 0; + if(0 === match$2[0]){ + var state$4 = match$2[1]; + return [0, [0, -172306698, [0, state$4, inner_state$1]]]; + } + var state$5 = match$2[2], y$0 = match$2[1]; + return [1, y$0, [0, -172306698, [0, state$5, inner_state$1]]]; + }]; + } + function of_list(l){ + return [0, + l, + function(param){ + if(! param) return 0; + var l = param[2], x = param[1]; + return [1, x, l]; + }]; + } + function fold(t, init, f){ + var next = t[2], seed$2 = t[1], seed = seed$2, v = init; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return v; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var + seed$1 = match[2], + a = match[1], + v$0 = caml_call2(f, v, a), + seed = seed$1, + v = v$0; + } + } + function to_list_rev(t){ + return fold(t, 0, function(l, x){return [0, x, l];}); + } + function to_list(param){ + var next = param[2], s = param[1]; + function to_list(s, next, i){ + var s$0 = s; + for(;;){ + if(0 === i){ + var t = [0, s$0, next], _X_ = to_list_rev(t); + return caml_call1(Base_List1[21], _X_); + } + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, a, to_list(s$2, next, caml_call2(Base_Import[93], i, 1))]; + } + } + return to_list(s, next, 500); + } + function sexp_of_t$0(sexp_of_a, t){ + var _W_ = to_list(t); + return caml_call2(Base_Import[152], sexp_of_a, _W_); + } + function range(opt, _V_, _U_, start_v, stop_v){ + if(opt) var sth = opt[1], stride = sth; else var stride = 1; + if(_V_) var sth$0 = _V_[1], start = sth$0; else var start = 104758188; + if(_U_) var sth$1 = _U_[1], stop = sth$1; else var stop = -160346914; + var + step = + 104758188 <= stop + ? 0 + <= stride + ? function + (i){ + return stop_v < i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i < stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : 0 + <= stride + ? function + (i){ + return stop_v <= i + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + } + : function + (i){ + return i <= stop_v + ? 0 + : [1, i, caml_call2(Base_Import[91], i, stride)]; + }, + init = + 104758188 <= start + ? start_v + : caml_call2(Base_Import[91], start_v, stride); + return [0, init, step]; + } + function of_lazy(t_lazy){ + return [0, + t_lazy, + function(t_lazy){ + var _T_ = caml_obj_tag(t_lazy); + if(250 === _T_) + var match = t_lazy[1]; + else{ + var switch$0 = 0; + if(246 !== _T_ && 244 !== _T_){ + var match = t_lazy; + switch$0 = 1; + } + if(! switch$0) + var match = caml_call1(CamlinternalLazy[2], t_lazy); + } + var next = match[2], s = match[1], match$0 = caml_call1(next, s); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$0 = match$0[1], v = [0, s$0, next]; + return [0, v]; + } + var s$1 = match$0[2], x = match$0[1], v$0 = [0, s$1, next]; + return [1, x, v$0]; + }]; + } + function _d_(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var s$0 = match[2], a = match[1]; + return [1, caml_call1(f, a), s$0]; + }]; + } + function mapi(t, f){ + var next = t[2], s = t[1]; + return [0, + [0, 0, s], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var + s$1 = match[2], + a = match[1], + _S_ = [0, caml_call2(Base_Import[91], i, 1), s$1]; + return [1, caml_call2(f, i, a), _S_]; + }]; + } + function folding_map(t, init, f){ + return unfold_with + (t, + init, + function(acc, x){ + var + match = caml_call2(f, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, acc$0]; + }); + } + function folding_mapi(t, init, f){ + return unfold_with + (t, + [0, 0, init], + function(param, x){ + var + acc = param[2], + i = param[1], + match = caml_call3(f, i, acc, x), + x$0 = match[2], + acc$0 = match[1]; + return [1, x$0, [0, caml_call2(Base_Import[91], i, 1), acc$0]]; + }); + } + function filter(t, f){ + var next = t[2], seed = t[1]; + return [0, + seed, + function(seed){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var s = match[1]; return [0, s];} + var a = match[1], s$0 = match[2]; + if(caml_call1(f, a)) return [1, a, s$0]; + var s$1 = match[2]; + return [0, s$1]; + }]; + } + function filteri(t, f){ + var _Q_ = Base_Import[127]; + function _R_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return _d_(filter(mapi(t, function(i, s){return [0, i, s];}), _R_), _Q_); + } + function length(t){ + var next = t[2], seed = t[1], i = 0, s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return i; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s = s$1; + } + } + function to_array(t){ + var + match = + fold + (t, + _e_, + function(param, x){ + var i = param[2], l = param[1]; + return [0, [0, x, l], caml_call2(Base_Import[91], i, 1)]; + }), + len = match[2], + l = match[1]; + if(! l) return [0]; + var + l$0 = l[2], + x = l[1], + a = caml_call2(Base_Array0[4], len, x), + i$1 = caml_call2(Base_Import[93], len, 2), + i = i$1, + l$1 = l$0; + for(;;){ + if(l$1){ + var l$2 = l$1[2], x$0 = l$1[1]; + runtime.caml_check_bound(a, i)[1 + i] = x$0; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, l$1 = l$2; + continue; + } + if(-1 === i) return a; + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + } + function find(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(caml_call1(f, a)) return [0, a]; + var s$0 = match[2]; + } + var s = s$0; + } + } + function find_map(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call1(f, a); + if(some_b) return some_b; + var s = s$1; + } + } + function find_mapi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var s$1 = match[2], a = match[1], some_b = caml_call2(f, i, a); + if(some_b) return some_b; + var i$0 = caml_call2(Base_Import[91], i, 1), s = s$1, i = i$0; + } + } + function for_all(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var a = match[1]; + if(! caml_call1(f, a)) return 0; + var s$0 = match[2]; + } + var s = s$0; + } + } + function for_alli(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(! caml_call2(f, i, a)) return 0; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function exists(t, f){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{var a = match[1]; if(caml_call1(f, a)) return 1; var s$0 = match[2]; + } + var s = s$0; + } + } + function existsi(t, f){ + var next = t[2], seed = t[1], s = seed, i = 0; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1], s = s$0; continue;} + var a = match[1]; + if(caml_call2(f, i, a)) return 1; + var + s$1 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + s = s$1, + i = i$0; + } + } + function iter(t, f){ + var next = t[2], seed$2 = t[1], seed = seed$2; + for(;;){ + var match = caml_call1(next, seed); + if(typeof match === "number") return 0; + if(0 === match[0]){var seed$0 = match[1], seed = seed$0; continue;} + var seed$1 = match[2], a = match[1]; + caml_call1(f, a); + var seed = seed$1; + } + } + function is_empty(t){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 1; + if(0 !== match[0]) return 0; + var s$0 = match[1], s = s$0; + } + } + function mem(t, a, equal){ + var next = t[2], seed = t[1], s = seed; + for(;;){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]) + var s$0 = match[1]; + else{ + var b = match[1]; + if(caml_call2(equal, a, b)) return 1; + var s$0 = match[2]; + } + var s = s$0; + } + } + var empty = [0, 0, function(param){return 0;}]; + function bind(t, f){ + return [0, + [0, empty, t], + function(param){ + var + rest = param[2], + match = param[1], + next = match[2], + seed = match[1], + match$0 = caml_call1(next, seed); + if(typeof match$0 === "number"){ + var + next$0 = rest[2], + seed$0 = rest[1], + match$1 = caml_call1(next$0, seed$0); + if(typeof match$1 === "number") return 0; + if(0 === match$1[0]){ + var s = match$1[1]; + return [0, [0, empty, [0, s, next$0]]]; + } + var s$0 = match$1[2], a = match$1[1]; + return [0, [0, caml_call1(f, a), [0, s$0, next$0]]]; + } + if(0 === match$0[0]){ + var s$1 = match$0[1]; + return [0, [0, [0, s$1, next], rest]]; + } + var s$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, [0, s$2, next], rest]]; + }]; + } + function return$0(x){ + return [0, + [0, x], + function(param){ + if(! param) return 0; + var x = param[1]; + return [1, x, 0]; + }]; + } + var + map = [0, -198771759, _d_], + include = caml_call1(Base_Monad[1], [0, bind, return$0, map]), + symbol_bind = include[1], + symbol_map = include[2], + Monad_infix = include[3], + bind$0 = include[4], + return$1 = include[5], + map$0 = include[6], + join = include[7], + ignore_m = include[8], + all = include[9], + all_unit = include[10], + Let_syntax = include[11]; + function nth(s, n){ + if(0 > n) return 0; + var next = s[2], s$3 = s[1], i = n, s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(caml_call2(Base_Import[128], i, 0)) return [0, a]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0, s$0 = s$2; + } + } + function nth_exn(s, n){ + if(0 > n) return caml_call1(Base_Import[126], cst_Sequence_nth$0); + var match = nth(s, n); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_nth); + var x = match[1]; + return x; + } + function compare(cmp_a, cmp_b, a_011, b_012){ + if(caml_call2(Base_Ppx_compare_lib[1], a_011, b_012)) return 0; + switch(a_011[0]){ + case 0: + var a_013 = a_011[1]; + if(0 !== b_012[0]) return -1; + var b_014 = b_012[1]; + return caml_call2(cmp_a, a_013, b_014); + case 1: + var a_015 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + var b_016 = b_012[1]; return caml_call2(cmp_b, a_015, b_016); + default: return -1; + } + break; + default: + var a_019 = a_011[2], a_017 = a_011[1]; + switch(b_012[0]){ + case 0: break; + case 1: + return 1; + default: + var + b_020 = b_012[2], + b_018 = b_012[1], + n = caml_call2(cmp_a, a_017, b_018); + return 0 === n ? caml_call2(cmp_b, a_019, b_020) : n; + } + } + return 1; + } + function hash_fold_t(hash_fold_a, hash_fold_b, hsv, arg){ + switch(arg[0]){ + case 0: + var a0 = arg[1], hsv$0 = caml_call2(Base_Hash[3], hsv, 0); + return caml_call2(hash_fold_a, hsv$0, a0); + case 1: + var a0$0 = arg[1], hsv$1 = caml_call2(Base_Hash[3], hsv, 1); + return caml_call2(hash_fold_b, hsv$1, a0$0); + default: + var + a1 = arg[2], + a0$1 = arg[1], + hsv$2 = caml_call2(Base_Hash[3], hsv, 2), + hsv$3 = caml_call2(hash_fold_a, hsv$2, a0$1); + return caml_call2(hash_fold_b, hsv$3, a1); + } + } + function t_of_sexp(of_a_021, of_b_022, sexp_027){ + if(0 === sexp_027[0]){ + var _M_ = sexp_027[1], switch$0 = 0; + if(caml_string_notequal(_M_, cst_Both$0)){ + var switch$1 = 0; + if(caml_string_notequal(_M_, cst_Left$0)){ + var switch$2 = 0; + if(caml_string_notequal(_M_, cst_Right$0)){ + if(caml_string_notequal(_M_, cst_both)) + if(caml_string_notequal(_M_, cst_left)) + if(caml_string_notequal(_M_, cst_right)) + switch$0 = 1; + else + switch$2 = 1; + else + switch$1 = 1; + } + else + switch$2 = 1; + if(switch$2) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else + switch$1 = 1; + if(switch$1) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + if(! switch$0) + return caml_call2 + (Sexplib0_Sexp_conv_error[5], error_source_025, sexp_027); + } + else{ + var _N_ = sexp_027[1]; + if(! _N_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_025, sexp_027); + var _O_ = _N_[1]; + if(0 !== _O_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_025, sexp_027); + var tag_028 = _O_[1], switch$3 = 0; + if(caml_string_notequal(tag_028, cst_Both$0)){ + var switch$4 = 0; + if(caml_string_notequal(tag_028, cst_Left$0)){ + var switch$5 = 0; + if(caml_string_notequal(tag_028, cst_Right$0)){ + if(caml_string_notequal(tag_028, cst_both)) + if(caml_string_notequal(tag_028, cst_left)) + if(caml_string_notequal(tag_028, cst_right)) + switch$3 = 1; + else + switch$5 = 1; + else + switch$4 = 1; + } + else + switch$5 = 1; + if(switch$5){ + var sexp_args_034 = _N_[2]; + if(sexp_args_034 && ! sexp_args_034[2]){ + var + arg0_035 = sexp_args_034[1], + res0_036 = caml_call1(of_b_022, arg0_035); + return [1, res0_036]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + else + switch$4 = 1; + if(switch$4){ + var sexp_args_029 = _N_[2]; + if(sexp_args_029 && ! sexp_args_029[2]){ + var + arg0_030 = sexp_args_029[1], + res0_031 = caml_call1(of_a_021, arg0_030); + return [0, res0_031]; + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + if(! switch$3){ + var sexp_args_039 = _N_[2]; + if(sexp_args_039){ + var _P_ = sexp_args_039[2]; + if(_P_ && ! _P_[2]){ + var + arg1_041 = _P_[1], + arg0_040 = sexp_args_039[1], + res0_042 = caml_call1(of_a_021, arg0_040), + res1_043 = caml_call1(of_b_022, arg1_041); + return [2, res0_042, res1_043]; + } + } + return caml_call3 + (Sexplib0_Sexp_conv_error[4], + error_source_025, + tag_028, + sexp_027); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_025, sexp_027); + } + function sexp_of_t$1(of_a_046, of_b_047, param){ + switch(param[0]){ + case 0: + var arg0_048 = param[1], res0_049 = caml_call1(of_a_046, arg0_048); + return [1, [0, _g_, [0, res0_049, 0]]]; + case 1: + var arg0_050 = param[1], res0_051 = caml_call1(of_b_047, arg0_050); + return [1, [0, _h_, [0, res0_051, 0]]]; + default: + var + arg1_053 = param[2], + arg0_052 = param[1], + res0_054 = caml_call1(of_a_046, arg0_052), + res1_055 = caml_call1(of_b_047, arg1_053); + return [1, [0, _i_, [0, res0_054, [0, res1_055, 0]]]]; + } + } + function t_sexp_grammar(a_sexp_grammar, b_sexp_grammar){ + return [3, + [0, + 2, + [0, + [1, [0, cst_Left, [0, [0, a_sexp_grammar, 0]]]], + [0, + [1, [0, cst_Right, [0, [0, b_sexp_grammar, 0]]]], + [0, + [1, + [0, + cst_Both, + [0, [0, a_sexp_grammar, [0, b_sexp_grammar, 0]]]]], + 0]]]]]; + } + var + Merge_with_duplicates_element = + [0, compare, hash_fold_t, t_of_sexp, sexp_of_t$1, t_sexp_grammar]; + function merge_with_duplicates(param, _L_, compare){ + var next2 = _L_[2], s2 = _L_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [1, b], [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, [0, a], [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 <= comparison + ? 0 + === comparison + ? [1, [2, a, b$0], [0, [0, s1$1], [0, s2$3]]] + : [1, [1, b$0], [0, s1, [0, s2$3]]] + : [1, [0, a], [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function merge_deduped_and_sorted(s1, s2, compare){ + function _K_(param){var x = param[1]; return x;} + return caml_call2(map$0, merge_with_duplicates(s1, s2, compare), _K_); + } + function merge_sorted(param, _J_, compare){ + var next2 = _J_[2], s2 = _J_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, b, [0, 0, [0, s2$0]]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var s2$2 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof s2$2 === "number") return [1, a, [0, [0, s1$1], 0]]; + if(0 !== s2$2[0]){ + var + s2$3 = s2$2[2], + b$0 = s2$2[1], + comparison = caml_call2(compare, a, b$0); + return 0 < comparison + ? [1, b$0, [0, s1, [0, s2$3]]] + : [1, a, [0, [0, s1$1], s2$2]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function hd(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[1]; + return [0, a]; + } + } + function hd_exn(s){ + var match = hd(s); + if(! match) return caml_call1(Base_Import[124], cst_hd_exn); + var a = match[1]; + return a; + } + function tl(s){ + var next = s[2], s$2 = s[1], s$0 = s$2; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") + var match$0 = 0; + else{ + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var a = match[2], match$0 = [0, a]; + } + if(! match$0) return 0; + var s$3 = match$0[1]; + return [0, [0, s$3, next]]; + } + } + function tl_eagerly_exn(s){ + var match = tl(s); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_tl_exn); + var s$0 = match[1]; + return s$0; + } + function lift_identity(next, s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, 316735838, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, 316735838, s$1]]; + } + function next(s){ + var next = s[2], s$3 = s[1], s$0 = s$3; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [0, [0, a, [0, s$2, next]]]; + } + } + function filter_opt(s){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var match$0 = match[1]; + if(match$0){ + var s$1 = match[2], a = match$0[1]; + return [1, a, s$1]; + } + var s$2 = match[2]; + return [0, s$2]; + }]; + } + function filter_map(s, f){return filter_opt(caml_call2(map$0, s, f));} + function filter_mapi(s, f){ + function _I_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return filter_map(mapi(s, function(i, s){return [0, i, s];}), _I_); + } + function split_n(s, n){ + var next = s[2], s$3 = s[1], s$0 = s$3, i = n, accum = 0; + for(;;){ + if(0 >= i) return [0, caml_call1(Base_List1[21], accum), [0, s$0, next]]; + var match = caml_call1(next, s$0); + if(typeof match === "number") + return [0, caml_call1(Base_List1[21], accum), empty]; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + a = match[1], + accum$0 = [0, a, accum], + i$0 = caml_call2(Base_Import[93], i, 1), + s$0 = s$2, + i = i$0, + accum = accum$0; + } + } + function chunks_exn(t, n){ + return 0 < n + ? [0, + t, + function(t){ + var match = split_n(t, n), xs = match[1]; + if(! xs) return 0; + var t$0 = match[2]; + return [1, xs, t$0]; + }] + : caml_call1(Base_Import[126], cst_Sequence_chunks_exn); + } + function findi(s, f){ + function _H_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return find(mapi(s, function(i, s){return [0, i, s];}), _H_); + } + function find_exn(s, f){ + var match = find(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_find_exn); + var x = match[1]; + return x; + } + function append(s1, s2){ + var next2 = s2[2], s2$0 = s2[1], next1 = s1[2], s1$0 = s1[1]; + return [0, + [0, 472258093, s1$0], + function(param){ + if(472258093 <= param[1]){ + var s1 = param[2], match = caml_call1(next1, s1); + if(typeof match === "number") return [0, [0, -630817751, s2$0]]; + if(0 === match[0]){ + var s1$0 = match[1]; + return [0, [0, 472258093, s1$0]]; + } + var s1$1 = match[2], a = match[1]; + return [1, a, [0, 472258093, s1$1]]; + } + var s2 = param[2], match$0 = caml_call1(next2, s2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s2$1 = match$0[1]; + return [0, [0, -630817751, s2$1]]; + } + var s2$2 = match$0[2], a$0 = match$0[1]; + return [1, a$0, [0, -630817751, s2$2]]; + }]; + } + function concat_map(s, f){return caml_call2(bind$0, s, f);} + function concat(s){return concat_map(s, function(_G_){return _G_;});} + function concat_mapi(s, f){ + function _F_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return concat_map(mapi(s, function(i, s){return [0, i, s];}), _F_); + } + function zip(param, _D_){ + var next2 = _D_[2], s2 = _D_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var _E_ = param[1], switch$0 = 0; + if(typeof _E_ === "number") + switch$0 = 1; + else if(1 === _E_[0]){ + var match = param[2], s1$0 = _E_[2], a = _E_[1]; + if(typeof match !== "number"){ + if(0 === match[0]){ + var s2$0 = param[2][1]; + return [0, [0, _E_, caml_call1(next2, s2$0)]]; + } + var s2$1 = match[2], b = match[1]; + return [1, [0, a, b], [0, [0, s1$0], [0, s2$1]]]; + } + } + if(! switch$0 && typeof param[2] !== "number"){ + var s2 = param[2], s1 = _E_[1]; + return [0, [0, caml_call1(next1, s1), s2]]; + } + return 0; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function zip_full(param, _C_){ + var next2 = _C_[2], s2 = _C_[1], next1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[1]; + if(typeof s1 === "number"){ + var match = param[2]; + if(typeof match === "number") return 0; + if(0 !== match[0]){ + var s2$0 = match[2], b = match[1]; + return [1, [0, -57574468, b], [0, 0, caml_call1(next2, s2$0)]]; + } + } + else{ + if(0 === s1[0]){ + var s2$1 = param[2], s1$0 = s1[1]; + return [0, [0, caml_call1(next1, s1$0), s2$1]]; + } + var match$0 = param[2], s1$1 = s1[2], a = s1[1]; + if(typeof match$0 === "number") + return [1, [0, 847852583, a], [0, caml_call1(next1, s1$1), 0]]; + if(0 !== match$0[0]){ + var s2$2 = match$0[2], b$0 = match$0[1]; + return [1, [0, 737457313, [0, a, b$0]], [0, [0, s1$1], [0, s2$2]]]; + } + } + var s2 = param[2][1]; + return [0, [0, s1, caml_call1(next2, s2)]]; + } + return [0, [0, [0, s1], [0, s2]], next]; + } + function bounded_length(param, at_most){ + var next = param[2], seed = param[1], i = 0, seed$0 = seed; + for(;;){ + if(at_most < i) return 85047514; + var match = caml_call1(next, seed$0); + if(typeof match === "number") return [0, 16394, i]; + if(0 === match[0]){var seed$1 = match[1], seed$0 = seed$1; continue;} + var + seed$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + seed$0 = seed$2; + } + } + function length_is_bounded_by(opt, max, t){ + if(opt) var sth = opt[1], min = sth; else var min = -1; + if(max){ + var max$0 = max[1], match$0 = bounded_length(t, max$0); + if(typeof match$0 !== "number" && 16394 === match$0[1]){var len = match$0[2]; if(min <= len) return 1;} + return 0; + } + var next = t[2], s = t[1], s$0 = s, acc = 0; + for(;;){ + if(min <= acc) return 1; + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + acc$0 = caml_call2(Base_Import[91], acc, 1), + s$0 = s$2, + acc = acc$0; + } + } + function iteri(s, f){ + function _B_(param){ + var s = param[2], i = param[1]; + return caml_call2(f, i, s); + } + return iter(mapi(s, function(i, s){return [0, i, s];}), _B_); + } + function foldi(s, init, f){ + function _A_(acc, param){ + var s = param[2], i = param[1]; + return caml_call3(f, i, acc, s); + } + return fold(mapi(s, function(i, s){return [0, i, s];}), init, _A_); + } + function reduce(s, f){ + var match = next(s); + if(! match) return 0; + var match$0 = match[1], s$0 = match$0[2], a = match$0[1]; + return [0, fold(s$0, a, f)]; + } + function reduce_exn(s, f){ + var match = reduce(s, f); + if(! match) return caml_call1(Base_Import[124], cst_Sequence_reduce_exn); + var res = match[1]; + return res; + } + function group(param, break$0){ + var next = param[2], s = param[1]; + return [0, + [0, [0, 0, s]], + function(param){ + if(! param) return 0; + var + match = param[1], + s = match[2], + acc = match[1], + match$0 = caml_call1(next, s); + if(typeof match$0 !== "number" && 0 === match$0[0]){ + var s$2 = match$0[1]; + return [0, [0, [0, acc, s$2]]]; + } + if(acc){ + if(typeof match$0 === "number") + return [1, caml_call1(Base_List1[21], acc), 0]; + var s$0 = match$0[2], cur = match$0[1], prev = acc[1]; + return caml_call2(break$0, prev, cur) + ? [1, + caml_call1(Base_List1[21], acc), + [0, [0, [0, cur, 0], s$0]]] + : [0, [0, [0, [0, cur, acc], s$0]]]; + } + if(typeof match$0 === "number") return 0; + var s$1 = match$0[2], cur$0 = match$0[1]; + return [0, [0, [0, [0, cur$0, 0], s$1]]]; + }]; + } + function find_consecutive_duplicate(param, equal){ + var next = param[2], s = param[1], last_elt = 0, s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + if(last_elt){ + var b = last_elt[1]; + if(caml_call2(equal, a, b)) return [0, [0, b, a]]; + } + var last_elt$0 = [0, a], last_elt = last_elt$0, s$0 = s$2; + } + } + function remove_consecutive_duplicates(s, equal){ + return unfold_with + (s, + 0, + function(prev, a){ + if(prev){ + var b = prev[1]; + if(caml_call2(equal, a, b)) return [0, [0, a]]; + } + return [1, a, [0, a]]; + }); + } + function count(s, f){return length(filter(s, f));} + function counti(t, f){return length(filteri(t, f));} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function init(n, f){ + return [0, + 0, + function(i){ + if(n <= i) return 0; + var _z_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_call1(f, i), _z_]; + }]; + } + function sub(s, pos, len){ + var _x_ = pos < 0 ? 1 : 0, _y_ = _x_ || (len < 0 ? 1 : 0); + if(_y_) caml_call1(Base_Import[124], cst_Sequence_sub); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= caml_call2(Base_Import[93], i, pos)) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(pos <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_take); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1]; + if(len <= i) return 0; + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var s$1 = match[2], a = match[1]; + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + }]; + } + function drop(s, len){ + if(len < 0) caml_call1(Base_Import[124], cst_Sequence_drop); + var next = s[2], s$0 = s[1]; + return [0, + [0, 0, s$0], + function(param){ + var s = param[2], i = param[1], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, [0, i, s$0]];} + var a = match[1], s$1 = match[2]; + if(len <= i) + return [1, a, [0, caml_call2(Base_Import[91], i, 1), s$1]]; + var s$2 = match[2]; + return [0, [0, caml_call2(Base_Import[91], i, 1), s$2]]; + }]; + } + function take_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + s$0, + function(s){ + var match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$0 = match[1]; return [0, s$0];} + var a = match[1], s$1 = match[2]; + return caml_call1(f, a) ? [1, a, s$1] : 0; + }]; + } + function drop_while(s, f){ + var next = s[2], s$0 = s[1]; + return [0, + [0, -557110719, s$0], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var s$0 = param[2], match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$1 = match[1]; + return [0, [0, -557110719, s$1]]; + } + var a = match[1], s$2 = match[2]; + if(caml_call1(f, a)) return [0, [0, -557110719, s$2]]; + var s$3 = match[2]; + return [1, a, [0, 316735838, s$3]]; + }]; + } + function shift_right(s, x){ + var next = s[2], seed = s[1]; + return [0, + [0, -433944719, [0, seed, x]], + function(param){ + if(316735838 <= param[1]){ + var s = param[2]; + return lift_identity(next, s); + } + var match = param[2], x = match[2], seed = match[1]; + return [1, x, [0, 316735838, seed]]; + }]; + } + function shift_right_with_list(s, l){return append(of_list(l), s);} + var Infix = [0, append]; + function intersperse(s, sep){ + var next = s[2], s$0 = s[1]; + return [0, + [0, 815032112, s$0], + function(param){ + var _w_ = param[1]; + if(815032112 === _w_){ + var s = param[2], match = caml_call1(next, s); + if(typeof match === "number") return 0; + if(0 === match[0]){ + var s$0 = match[1]; + return [0, [0, 815032112, s$0]]; + } + var s$1 = match[2], a = match[1]; + return [1, a, [0, 951752159, s$1]]; + } + if(951752159 > _w_){ + var match$1 = param[2], s$5 = match$1[2], a$1 = match$1[1]; + return [1, a$1, [0, 951752159, s$5]]; + } + var s$2 = param[2], match$0 = caml_call1(next, s$2); + if(typeof match$0 === "number") return 0; + if(0 === match$0[0]){ + var s$3 = match$0[1]; + return [0, [0, 951752159, s$3]]; + } + var s$4 = match$0[2], a$0 = match$0[1]; + return [1, sep, [0, -571577571, [0, a$0, s$4]]]; + }]; + } + function repeat(x){return [0, x, function(x){return [1, x, x];}];} + function cycle_list_exn(xs){ + if(caml_call1(Base_List1[23], xs)) + caml_call1(Base_Import[126], cst_Sequence_cycle_list_exn); + var s = of_list(xs); + function _v_(param){return s;} + return concat_map(repeat(0), _v_); + } + function cartesian_product(sa, sb){ + return concat_map(sa, function(a){return zip(repeat(a), sb);}); + } + function singleton(x){return caml_call1(return$1, x);} + function delayed_fold(s, init, f, finish){ + function _u_(acc, option, k){ + if(! option) return caml_call1(k, acc); + var a = option[1]; + return caml_call3(f, acc, a, k); + } + return caml_call4(Expert[2], s, init, _u_, finish); + } + function fold_m(bind, return$0, t, init, f){ + function _t_(acc, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, acc), k); + var a = option[1]; + return caml_call2(bind, caml_call2(f, acc, a), k); + } + return caml_call4(Expert[2], t, init, _t_, return$0); + } + function iter_m(bind, return$0, t, f){ + function _s_(param, option, k){ + if(! option) return caml_call2(bind, caml_call1(return$0, 0), k); + var a = option[1]; + return caml_call2(bind, caml_call1(f, a), k); + } + return caml_call4(Expert[2], t, 0, _s_, return$0); + } + function fold_until(s, init, f, finish){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(finish, acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], match$0 = caml_call2(f, acc, a); + if(0 === match$0[0]){ + var acc$0 = match$0[1], s$0 = s$2, acc = acc$0; + continue; + } + var x = match$0[1]; + return x; + } + } + function fold_result(s, init, f){ + var next = s[2], s$3 = s[1], s$0 = s$3, acc = init; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return caml_call1(Base_Result[12], acc); + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1], e = caml_call2(f, acc, a); + if(0 !== e[0]) return e; + var acc$0 = e[1], s$0 = s$2, acc = acc$0; + } + } + function force_eagerly(t){return of_list(to_list(t));} + function memoize(param){ + var next = param[2], s = param[1]; + function memoize(s){ + return [0, + [246, + function(_r_){ + var s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], a = match[1]; + return [1, a, memoize(s$2)]; + } + }]]; + } + function _p_(param){ + var l = param[1], _q_ = caml_obj_tag(l); + if(250 === _q_) return l[1]; + if(246 !== _q_ && 244 !== _q_) return l; + return caml_call1(CamlinternalLazy[2], l); + } + return [0, memoize(s), _p_]; + } + function drop_eagerly(s, len){ + var next = s[2], s$3 = s[1], i = 0, s$0 = s$3; + for(;;){ + if(len <= i) return [0, s$0, next]; + var match = caml_call1(next, s$0); + if(typeof match === "number") return empty; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var + s$2 = match[2], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + s$0 = s$2; + } + } + function drop_while_option(param, f){ + var next = param[2], s = param[1], s$0 = s; + for(;;){ + var match = caml_call1(next, s$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var s$1 = match[1], s$0 = s$1; continue;} + var s$2 = match[2], x = match[1]; + if(! caml_call1(f, x)) return [0, [0, x, [0, s$2, next]]]; + var s$0 = s$2; + } + } + function compare$0(compare_a, t1, t2){ + function _l_(r){ + function _m_(param){ + var _n_ = param[1]; + if(737457313 !== _n_) + return 847852583 <= _n_ ? caml_call1(r, 1) : caml_call1(r, -1); + var + match = param[2], + v2 = match[2], + v1 = match[1], + c = caml_call2(compare_a, v1, v2), + _o_ = 0 !== c ? 1 : 0; + return _o_ ? caml_call1(r, c) : _o_; + } + iter(zip_full(t1, t2), _m_); + return 0; + } + return caml_call1(Base_With_return[1], _l_); + } + function equal(equal_a, t1, t2){ + function _k_(param){ + if(737457313 !== param[1]) return 0; + var match = param[2], a2 = match[2], a1 = match[1]; + return caml_call2(equal_a, a1, a2); + } + return for_all(zip_full(t1, t2), _k_); + } + function round_robin(list){ + function next(param){ + var done_stack = param[2], todo_stack = param[1]; + if(! todo_stack) + return caml_call1(Base_List1[23], done_stack) + ? 0 + : [0, [0, caml_call1(Base_List1[21], done_stack), 0]]; + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f = match[2], + s = match[1], + match$0 = caml_call1(f, s); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack]]; + if(0 === match$0[0]){ + var s$0 = match$0[1]; + return [0, [0, [0, [0, s$0, f], todo_stack$0], done_stack]]; + } + var s$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s$1, f], done_stack]]]; + } + var state = [0, list, 0]; + return [0, state, next]; + } + function interleave(param){ + var f1 = param[2], s1 = param[1]; + function next(param){ + var s1 = param[3], done_stack = param[2], todo_stack = param[1]; + if(todo_stack){ + var + todo_stack$0 = todo_stack[2], + match = todo_stack[1], + f2 = match[2], + s2 = match[1], + match$0 = caml_call1(f2, s2); + if(typeof match$0 === "number") + return [0, [0, todo_stack$0, done_stack, s1]]; + if(0 === match$0[0]){ + var s2$0 = match$0[1]; + return [0, [0, todo_stack$0, [0, [0, s2$0, f2], done_stack], s1]]; + } + var s2$1 = match$0[2], x = match$0[1]; + return [1, x, [0, todo_stack$0, [0, [0, s2$1, f2], done_stack], s1]]; + } + var match$1 = caml_call1(f1, s1); + if(typeof match$1 === "number") + return done_stack + ? [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1]] + : 0; + if(0 === match$1[0]){ + var s1$0 = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], done_stack), 0, s1$0]]; + } + var s1$1 = match$1[2], t = match$1[1]; + return [0, [0, caml_call1(Base_List1[21], [0, t, done_stack]), 0, s1$1]]; + } + var state = [0, 0, 0, s1]; + return [0, state, next]; + } + function interleaved_cartesian_product(s1, s2){ + return interleave + (caml_call2 + (map$0, + s1, + function(x1){ + return caml_call2 + (map$0, s2, function(x2){return [0, x1, x2];}); + })); + } + function of_seq(seq){ + return [0, + seq, + function(seq){ + var match = caml_call1(seq, 0); + if(! match) return 0; + var tl = match[2], hd = match[1]; + return [1, hd, tl]; + }]; + } + function to_seq(param){ + var next = param[2], state = param[1]; + function loop(state){ + var state$0 = state; + for(;;){ + var match = caml_call1(next, state$0); + if(typeof match === "number") return 0; + if(0 === match[0]){var state$1 = match[1], state$0 = state$1; continue;} + var state$2 = match[2], hd = match[1]; + return [0, hd, function(param){return loop(state$2);}]; + } + } + return function(param){return loop(state);}; + } + function return$2(x, k){return caml_call1(k, x);} + function bind$1(m, f, k){ + return caml_call1 + (m, + function(a){var m = caml_call1(f, a); return caml_call1(m, k);}); + } + var + map$1 = + [0, + -198771759, + function(m, f, k){ + return caml_call1 + (m, function(a){return caml_call1(k, caml_call1(f, a));}); + }], + include$0 = caml_call1(Base_Monad[2], [0, bind$1, map$1, return$2]), + symbol_bind$0 = include$0[1], + symbol_map$0 = include$0[2], + Let_syntax$0 = include$0[3], + Monad_infix$0 = include$0[4], + bind$2 = include$0[5], + return$3 = include$0[6], + map$2 = include$0[7], + join$0 = include$0[8], + ignore_m$0 = include$0[9], + all$0 = include$0[10], + all_unit$0 = include$0[11]; + function yield$0(e, k){return [0, [1, e, k]];} + function of_sequence(sequence){ + return delayed_fold + (sequence, + 0, + function(param, x, k, f){ + return [0, [1, x, function(param){return caml_call2(k, 0, f);}]]; + }, + return$3); + } + function run(t){ + function init(param){return caml_call1(t, function(param){return _j_;});} + function f(thunk){return caml_call1(thunk, 0)[1];} + return [0, init, f]; + } + var + Base_Sequence = + [0, + sexp_of_t$0, + equal, + compare$0, + mem, + length, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + foldi, + iteri, + existsi, + counti, + findi, + find_mapi, + symbol_bind, + symbol_map, + Monad_infix, + bind$0, + return$1, + map$0, + join, + ignore_m, + all, + all_unit, + Let_syntax, + empty, + next, + Step, + unfold_step, + unfold, + unfold_with, + unfold_with_and_finish, + nth, + nth_exn, + folding_map, + folding_mapi, + mapi, + filteri, + filter, + merge_deduped_and_sorted, + merge_deduped_and_sorted, + merge_sorted, + Merge_with_duplicates_element, + merge_with_duplicates, + hd, + hd_exn, + tl, + tl_eagerly_exn, + find_exn, + for_alli, + append, + concat, + concat_map, + concat_mapi, + interleave, + round_robin, + zip, + zip_full, + reduce_exn, + reduce, + group, + find_consecutive_duplicate, + remove_consecutive_duplicates, + range, + init, + filter_map, + filter_mapi, + filter_opt, + sub, + take, + drop, + drop_eagerly, + take_while, + drop_while, + drop_while_option, + split_n, + chunks_exn, + shift_right, + shift_right_with_list, + drop, + Infix, + cartesian_product, + interleaved_cartesian_product, + intersperse, + cycle_list_exn, + repeat, + singleton, + delayed_fold, + fold_m, + iter_m, + to_list_rev, + of_list, + of_lazy, + memoize, + force_eagerly, + bounded_length, + length_is_bounded_by, + of_seq, + to_seq, + [0, + symbol_bind$0, + symbol_map$0, + Let_syntax$0, + Monad_infix$0, + bind$2, + return$3, + map$2, + join$0, + ignore_m$0, + all$0, + all_unit$0, + yield$0, + of_sequence, + run], + Expert]; + runtime.caml_register_global(48, Base_Sequence, "Base__Sequence"); + return; + } + (globalThis)); + +//# 13251 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_array_ml = "src/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Base_Import = global_data.Base__Import, + Base_Sequence = global_data.Base__Sequence, + Base_Random = global_data.Base__Random, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Container = global_data.Base__Container, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Array0 = global_data.Base__Array0, + Base_Array_permute = global_data.Base__Array_permute, + Base_Binary_searchable = global_data.Base__Binary_searchable, + Base_Blit = global_data.Base__Blit, + invalid_argf = Base_Array0[1], + max_length = Base_Array0[3], + create = Base_Array0[4], + create_float_uninitialized = Base_Array0[5], + append = Base_Array0[6], + concat = Base_Array0[8], + copy = Base_Array0[9], + fill = Base_Array0[10], + init = Base_Array0[11], + make_matrix = Base_Array0[12], + of_list = Base_Array0[13], + sub = Base_Array0[14], + to_list = Base_Array0[15], + fold = Base_Array0[16], + fold_right = Base_Array0[17], + iter = Base_Array0[18], + iteri = Base_Array0[19], + map = Base_Array0[20], + mapi = Base_Array0[21], + stable_sort = Base_Array0[22], + swap = Base_Array0[23], + compare = Base_Import[235], + t_of_sexp = Base_Import[177], + sexp_of_t = Base_Import[153], + _g_ = [0, cst_src_array_ml, 858, 8], + cst_Array_transpose_exn = "Array.transpose_exn", + cst_Array_zip_exn = "Array.zip_exn", + cst_Array_random_element_exn_e = "Array.random_element_exn: empty array", + cst_Array_reduce_exn = "Array.reduce_exn", + _d_ = [0, "Array.find_exn: not found"], + _c_ = [0, "Array.findi_exn: not found"], + cst_Array_for_all2_exn = "Array.for_all2_exn", + cst_Array_exists2_exn = "Array.exists2_exn", + cst_Array_fold2_exn = "Array.fold2_exn", + cst_Array_map2_exn = "Array.map2_exn", + cst_Array_iter2_exn = "Array.iter2_exn", + _b_ = + [0, + [11, + "length mismatch in ", + [2, 0, [11, ": ", [4, 0, 0, 0, [11, " <> ", [4, 0, 0, 0, 0]]]]]], + "length mismatch in %s: %d <> %d"], + _a_ = [0, cst_src_array_ml, 435, 14], + _e_ = [0, "Array.find_map_exn: not found"], + _f_ = [0, "Array.find_mapi_exn: not found"]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[196], a_sexp_grammar); + } + function get(_aL_, _aK_){return caml_check_bound(_aL_, _aK_)[1 + _aK_];} + function set(_aJ_, _aI_, _aH_){ + caml_check_bound(_aJ_, _aI_)[1 + _aI_] = _aH_; + return 0; + } + function swap$0(arr, i, j){ + var tmp = get(arr, i); + set(arr, i, get(arr, j)); + return set(arr, j, tmp); + } + function sort(arr, compare, left, right){ + var _aF_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aF_){ + var pos = _aF_; + a: + for(;;){ + var v = get(arr, pos), final_pos = pos; + for(;;){ + var i_next = caml_call2(Base_Import[93], final_pos, 1); + if(left <= i_next && 0 < caml_call2(compare, get(arr, i_next), v)){ + set(arr, final_pos, get(arr, i_next)); + var final_pos = i_next; + continue; + } + set(arr, final_pos, v); + var _aG_ = pos + 1 | 0; + if(right !== pos){var pos = _aG_; continue a;} + break; + } + break; + } + } + return 0; + } + var Insertion_sort = [0, sort]; + function heapify(arr, compare, root, left, right){ + var root$0 = root; + for(;;){ + var + relative_root = caml_call2(Base_Import[93], root$0, left), + _ay_ = caml_call2(Base_Import[88], 2, relative_root), + _az_ = caml_call2(Base_Import[91], _ay_, left), + left_child = caml_call2(Base_Import[91], _az_, 1), + _aA_ = caml_call2(Base_Import[88], 2, relative_root), + _aB_ = caml_call2(Base_Import[91], _aA_, left), + right_child = caml_call2(Base_Import[91], _aB_, 2), + switch$0 = 0; + if(left_child <= right){ + var _aC_ = get(arr, root$0); + if(0 < caml_call2(compare, get(arr, left_child), _aC_)){var largest = left_child; switch$0 = 1;} + } + if(! switch$0) var largest = root$0; + var switch$1 = 0; + if(right_child <= right){ + var _aD_ = get(arr, largest); + if(0 < caml_call2(compare, get(arr, right_child), _aD_)){var largest$0 = right_child; switch$1 = 1;} + } + if(! switch$1) var largest$0 = largest; + var _aE_ = largest$0 !== root$0 ? 1 : 0; + if(! _aE_) return _aE_; + swap$0(arr, root$0, largest$0); + var root$0 = largest$0; + } + } + function sort$0(arr, compare, left, right){ + var + _at_ = caml_call2(Base_Import[91], left, right), + _au_ = caml_call2(Base_Import[95], _at_, 2); + if(_au_ >= left){ + var i = _au_; + for(;;){ + heapify(arr, compare, i, left, right); + var _av_ = i - 1 | 0; + if(left !== i){var i = _av_; continue;} + break; + } + } + var _aw_ = caml_call2(Base_Import[91], left, 1); + if(right >= _aw_){ + var i$0 = right; + for(;;){ + swap$0(arr, left, i$0); + heapify(arr, compare, left, left, caml_call2(Base_Import[93], i$0, 1)); + var _ax_ = i$0 - 1 | 0; + if(_aw_ !== i$0){var i$0 = _ax_; continue;} + break; + } + } + return 0; + } + var Heap_sort = [0, sort$0]; + function five_element_sort(arr, compare, m1, m2, m3, m4, m5){ + function compare_and_swap(i, j){ + var + _ar_ = get(arr, j), + _as_ = 0 < caml_call2(compare, get(arr, i), _ar_) ? 1 : 0; + return _as_ ? swap$0(arr, i, j) : _as_; + } + compare_and_swap(m1, m2); + compare_and_swap(m4, m5); + compare_and_swap(m1, m3); + compare_and_swap(m2, m3); + compare_and_swap(m1, m4); + compare_and_swap(m3, m4); + compare_and_swap(m2, m5); + compare_and_swap(m2, m3); + return compare_and_swap(m4, m5); + } + function intro_sort(arr, max_depth, compare, left, right){ + var max_depth$0 = max_depth, left$0 = left; + a: + for(;;){ + var + _aq_ = caml_call2(Base_Import[93], right, left$0), + len = caml_call2(Base_Import[91], _aq_, 1); + if(32 >= len) + return caml_call4(Insertion_sort[1], arr, compare, left$0, right); + if(0 > max_depth$0) + return caml_call4(Heap_sort[1], arr, compare, left$0, right); + var + max_depth$1 = caml_call2(Base_Import[93], max_depth$0, 1), + _ap_ = caml_call2(Base_Import[93], right, left$0), + sixth = caml_call2(Base_Import[95], _ap_, 6), + m1 = caml_call2(Base_Import[91], left$0, sixth), + m2 = caml_call2(Base_Import[91], m1, sixth), + m3 = caml_call2(Base_Import[91], m2, sixth), + m4 = caml_call2(Base_Import[91], m3, sixth), + m5 = caml_call2(Base_Import[91], m4, sixth); + five_element_sort(arr, compare, m1, m2, m3, m4, m5); + var + m2_val = get(arr, m2), + m3_val = get(arr, m3), + m4_val = get(arr, m4), + match = + 0 === caml_call2(compare, m2_val, m3_val) + ? [0, m2_val, m3_val, 1] + : 0 + === caml_call2(compare, m3_val, m4_val) + ? [0, m3_val, m4_val, 1] + : [0, m2_val, m4_val, 0], + middle_sorted = match[3], + pivot2 = match[2], + pivot1 = match[1], + l$0 = left$0, + p$1 = left$0, + r$2 = right; + b: + for(;;){ + if(r$2 < p$1){ + intro_sort + (arr, + max_depth$1, + compare, + left$0, + caml_call2(Base_Import[93], l$0, 1)); + if(1 - middle_sorted) intro_sort(arr, max_depth$1, compare, l$0, r$2); + var + left$1 = caml_call2(Base_Import[91], r$2, 1), + max_depth$0 = max_depth$1, + left$0 = left$1; + continue a; + } + var pv = get(arr, p$1); + if(0 > caml_call2(compare, pv, pivot1)){ + swap$0(arr, p$1, l$0); + var + p$0 = caml_call2(Base_Import[91], p$1, 1), + l = caml_call2(Base_Import[91], l$0, 1), + l$0 = l, + p$1 = p$0; + continue; + } + if(0 >= caml_call2(compare, pv, pivot2)){ + var p = caml_call2(Base_Import[91], p$1, 1), p$1 = p; + continue; + } + var r = r$2; + for(;;){ + if(p$1 < r && 0 < caml_call2(compare, get(arr, r), pivot2)){ + var r$0 = caml_call2(Base_Import[93], r, 1), r = r$0; + continue; + } + swap$0(arr, r, p$1); + var r$1 = caml_call2(Base_Import[93], r, 1), r$2 = r$1; + continue b; + } + } + } + } + function sort$1(arr, compare, left, right){ + return intro_sort(arr, 32, compare, left, right); + } + var Intro_sort = [0, sort$1, five_element_sort]; + function sort$2(pos, len, arr, compare){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], pos, len, 0, arr.length - 1), + len$0 = match[2], + pos$0 = match[1], + _an_ = caml_call2(Base_Import[91], pos$0, len$0), + _ao_ = caml_call2(Base_Import[93], _an_, 1); + return caml_call4(Intro_sort[1], arr, compare, pos$0, _ao_); + } + function to_array(t){return t;} + function is_empty(t){return 0 === t.length - 1 ? 1 : 0;} + function is_sorted(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 < caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function is_sorted_strictly(t, compare){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 < i[1] && result[1]){ + var + elt_i = t[1 + i[1]], + elt_i_minus_1 = t[1 + caml_call2(Base_Import[93], i[1], 1)]; + if(0 <= caml_call2(compare, elt_i_minus_1, elt_i)) result[1] = 0; + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function merge(a1, a2, compare){ + var l1 = a1.length - 1, l2 = a2.length - 1; + if(0 === l1) return caml_call1(copy, a2); + if(0 === l2) return caml_call1(copy, a1); + var _ai_ = a1[1 + caml_call2(Base_Import[93], l1, 1)]; + if(0 <= caml_call2(compare, a2[1], _ai_)) + return caml_call2(append, a1, a2); + var _aj_ = a2[1 + caml_call2(Base_Import[93], l2, 1)]; + if(0 < caml_call2(compare, a1[1], _aj_)) + return caml_call2(append, a2, a1); + var + len = caml_call2(Base_Import[91], l1, l2), + merged = caml_call2(create, len, a1[1]), + a1_index = [0, 0], + a2_index = [0, 0], + _al_ = caml_call2(Base_Import[93], len, 1), + _ak_ = 0; + if(_al_ >= 0){ + var i = _ak_; + for(;;){ + var + use_a1 = + l1 === a1_index[1] + ? 0 + : l2 + === a2_index[1] + ? 1 + : caml_call2 + (compare, a1[1 + a1_index[1]], a2[1 + a2_index[1]]) + <= 0 + ? 1 + : 0; + if(use_a1){ + merged[1 + i] = a1[1 + a1_index[1]]; + a1_index[1] = caml_call2(Base_Import[91], a1_index[1], 1); + } + else{ + merged[1 + i] = a2[1 + a2_index[1]]; + a2_index[1] = caml_call2(Base_Import[91], a2_index[1], 1); + } + var _am_ = i + 1 | 0; + if(_al_ !== i){var i = _am_; continue;} + break; + } + } + return merged; + } + function copy_matrix(_ah_){return caml_call2(map, _ah_, copy);} + function folding_map(t, init, f){ + var acc = [0, init]; + return caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_map(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (map, + t, + function(x){ + var + match = caml_call2(f, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _af_ = caml_call3(Base_Container[9], fold, init, f); + return function(_ag_){return caml_call2(_af_, _ag_, t);}; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t, compare){ + return caml_call3(Base_Container[3], fold, t, compare); + } + function max_elt(t, compare){ + return caml_call3(Base_Container[4], fold, t, compare); + } + function foldi(t, init, f){ + var + acc = [0, init], + _ad_ = caml_call2(Base_Import[93], t.length - 1, 1), + _ac_ = 0; + if(_ad_ >= 0){ + var i = _ac_; + for(;;){ + acc[1] = caml_call3(f, i, acc[1], t[1 + i]); + var _ae_ = i + 1 | 0; + if(_ad_ !== i){var i = _ae_; continue;} + break; + } + } + return acc[1]; + } + function folding_mapi(t, init, f){ + var acc = [0, init]; + return caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + } + function fold_mapi(t, init, f){ + var + acc = [0, init], + result = + caml_call2 + (mapi, + t, + function(i, x){ + var + match = caml_call3(f, i, acc[1], x), + y = match[2], + new_acc = match[1]; + acc[1] = new_acc; + return y; + }); + return [0, acc[1], result]; + } + function counti(t, f){ + return foldi + (t, + 0, + function(idx, count, a){ + return caml_call2(f, idx, a) + ? caml_call2(Base_Import[91], count, 1) + : count; + }); + } + function concat_map(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(map, t, f))); + } + function concat_mapi(t, f){ + return caml_call1(concat, caml_call1(to_list, caml_call2(mapi, t, f))); + } + function rev_inplace(t){ + var i = [0, 0], j = [0, caml_call2(Base_Import[93], t.length - 1, 1)]; + for(;;){ + if(i[1] >= j[1]) return 0; + caml_call3(swap, t, i[1], j[1]); + caml_call1(Base_Import[130], i); + caml_call1(Base_Import[129], j); + } + } + function rev(t){ + var t$0 = caml_call1(copy, t); + rev_inplace(t$0); + return t$0; + } + function of_list_rev(l){ + if(! l) return [0]; + var + l$0 = l[2], + a = l[1], + _$_ = caml_call1(Base_List[7], l$0), + len = caml_call2(Base_Import[91], 1, _$_), + t = caml_call2(create, len, a), + r = [0, l$0], + _aa_ = caml_call2(Base_Import[93], len, 2); + if(_aa_ >= 0){ + var i = _aa_; + for(;;){ + var match = r[1]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var l$1 = match[2], a$0 = match[1]; + caml_check_bound(t, i)[1 + i] = a$0; + r[1] = l$1; + var _ab_ = i - 1 | 0; + if(0 !== i){var i = _ab_; continue;} + break; + } + } + return t; + } + function of_list_map(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _Z_ = caml_call1(f, hd), + ___ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, ___), _Z_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call1(f, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_mapi(xs, f){ + if(! xs) return [0]; + var + tl = xs[2], + hd = xs[1], + _X_ = caml_call2(f, 0, hd), + _Y_ = caml_call1(Base_List[7], tl), + a = caml_call2(create, caml_call2(Base_Import[91], 1, _Y_), _X_), + i = 1, + param = tl; + for(;;){ + if(! param) return a; + var tl$0 = param[2], hd$0 = param[1]; + a[1 + i] = caml_call2(f, i, hd$0); + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0, param = tl$0; + } + } + function of_list_rev_map(xs, f){ + var t = of_list_map(xs, f); + rev_inplace(t); + return t; + } + function of_list_rev_mapi(xs, f){ + var t = of_list_mapi(xs, f); + rev_inplace(t); + return t; + } + function filter_mapi(t, f){ + var + r = [0, [0]], + k = [0, 0], + _V_ = caml_call2(Base_Import[93], t.length - 1, 1), + _U_ = 0; + if(_V_ >= 0){ + var i = _U_; + for(;;){ + var match = caml_call2(f, i, t[1 + i]); + if(match){ + var a = match[1]; + if(0 === k[1]) r[1] = caml_call2(create, t.length - 1, a); + r[1][1 + k[1]] = a; + caml_call1(Base_Import[130], k); + } + var _W_ = i + 1 | 0; + if(_V_ !== i){var i = _W_; continue;} + break; + } + } + return k[1] === t.length - 1 + ? r[1] + : 0 < k[1] ? caml_call3(sub, r[1], 0, k[1]) : [0]; + } + function filter_map(t, f){ + return filter_mapi(t, function(i, a){return caml_call1(f, a);}); + } + function filter_opt(t){return filter_map(t, function(_T_){return _T_;});} + function check_length2_exn(name, t1, t2){ + var n1 = t1.length - 1, n2 = t2.length - 1, _S_ = n1 !== n2 ? 1 : 0; + return _S_ ? caml_call5(invalid_argf, _b_, name, n1, n2, 0) : _S_; + } + function iter2_exn(t1, t2, f){ + check_length2_exn(cst_Array_iter2_exn, t1, t2); + return caml_call2 + (iteri, t1, function(i, x1){return caml_call2(f, x1, t2[1 + i]);}); + } + function map2_exn(t1, t2, f){ + check_length2_exn(cst_Array_map2_exn, t1, t2); + return caml_call2 + (init, + t1.length - 1, + function(i){return caml_call2(f, t1[1 + i], t2[1 + i]);}); + } + function fold2_exn(t1, t2, init, f){ + check_length2_exn(cst_Array_fold2_exn, t1, t2); + return foldi + (t1, + init, + function(i, ac, x){return caml_call3(f, ac, x, t2[1 + i]);}); + } + function filter(t, f){ + return filter_map(t, function(x){return caml_call1(f, x) ? [0, x] : 0;}); + } + function filteri(t, f){ + return filter_mapi + (t, function(i, x){return caml_call2(f, i, x) ? [0, x] : 0;}); + } + function exists(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call1(f, t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function existsi(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function mem(t, a, equal){return exists(t, caml_call1(equal, a));} + function for_all(t, f){ + var + i = [0, caml_call2(Base_Import[93], t.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call1(f, t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function for_alli(t, f){ + var + length = t.length - 1, + i = [0, caml_call2(Base_Import[93], length, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, i[1], t[1 + i[1]])){ + caml_call1(Base_Import[129], i); + continue; + } + result[1] = 0; + continue; + } + return result[1]; + } + } + function exists2_exn(t1, t2, f){ + check_length2_exn(cst_Array_exists2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 0]; + for(;;){ + if(0 <= i[1] && ! result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){result[1] = 1; continue;} + caml_call1(Base_Import[129], i); + continue; + } + return result[1]; + } + } + function for_all2_exn(t1, t2, f){ + check_length2_exn(cst_Array_for_all2_exn, t1, t2); + var + i = [0, caml_call2(Base_Import[93], t1.length - 1, 1)], + result = [0, 1]; + for(;;){ + if(0 <= i[1] && result[1]){ + if(caml_call2(f, t1[1 + i[1]], t2[1 + i[1]])){caml_call1(Base_Import[129], i); continue;} + result[1] = 0; + continue; + } + return result[1]; + } + } + function equal(equal, t1, t2){ + var _R_ = t1.length - 1 === t2.length - 1 ? 1 : 0; + return _R_ ? for_all2_exn(t1, t2, equal) : _R_; + } + function map_inplace(t, f){ + var _P_ = caml_call2(Base_Import[93], t.length - 1, 1), _O_ = 0; + if(_P_ >= 0){ + var i = _O_; + for(;;){ + t[1 + i] = caml_call1(f, t[1 + i]); + var _Q_ = i + 1 | 0; + if(_P_ !== i){var i = _Q_; continue;} + break; + } + } + return 0; + } + function findi_internal(t, f, if_found, if_not_found){ + var length = t.length - 1; + if(0 === length) return caml_call1(if_not_found, 0); + var i = [0, 0], found = [0, 0], value_found = [0, t[1]]; + for(;;){ + if(! found[1] && i[1] < length){ + var value = t[1 + i[1]]; + if(caml_call2(f, i[1], value)){ + value_found[1] = value; + found[1] = 1; + } + else + caml_call1(Base_Import[130], i); + continue; + } + return found[1] + ? caml_call2(if_found, i[1], value_found[1]) + : caml_call1(if_not_found, 0); + } + } + function findi(t, f){ + function _N_(param){return 0;} + return findi_internal + (t, f, function(i, value){return [0, [0, i, value]];}, _N_); + } + function findi_exn(t, f){ + function _M_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _c_], 1); + } + return findi_internal + (t, f, function(i, value){return [0, i, value];}, _M_); + } + function find_exn(t, f){ + function _K_(param){ + throw caml_maybe_attach_backtrace([0, Base_Import[252], _d_], 1); + } + function _L_(param, value){return value;} + return findi_internal + (t, function(i, x){return caml_call1(f, x);}, _L_, _K_); + } + function find(t, f){ + function _I_(param){var x = param[2]; return x;} + var _J_ = findi(t, function(i, x){return caml_call1(f, x);}); + return caml_call2(Base_Option[21], _J_, _I_); + } + function find_map(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call1(f, value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found = [0, Base_Import[252], _e_]; + function find_map_exn(t, f){ + var match = find_map(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found, 1); + var x = match[1]; + return x; + } + function find_mapi(t, f){ + var length = t.length - 1; + if(0 === length) return 0; + var i = [0, 0], value_found = [0, 0]; + for(;;){ + if(caml_call1(Base_Option[49], value_found[1]) && i[1] < length){ + var value = t[1 + i[1]]; + value_found[1] = caml_call2(f, i[1], value); + caml_call1(Base_Import[130], i); + continue; + } + return value_found[1]; + } + } + var not_found$0 = [0, Base_Import[252], _f_]; + function find_mapi_exn(t, f){ + var match = find_mapi(t, f); + if(! match) throw caml_maybe_attach_backtrace(not_found$0, 1); + var x = match[1]; + return x; + } + function find_consecutive_duplicate(t, equal){ + var n = t.length - 1; + if(1 >= n) return 0; + var result = [0, 0], i = [0, 1], prev = [0, t[1]]; + for(;;){ + if(i[1] >= n) return result[1]; + var cur = t[1 + i[1]]; + if(caml_call2(equal, cur, prev[1])){ + result[1] = [0, [0, prev[1], cur]]; + i[1] = n; + } + else{prev[1] = cur; caml_call1(Base_Import[130], i);} + } + } + function reduce(t, f){ + if(0 === t.length - 1) return 0; + var + r = [0, t[1]], + _G_ = caml_call2(Base_Import[93], t.length - 1, 1), + _F_ = 1; + if(_G_ >= 1){ + var i = _F_; + for(;;){ + r[1] = caml_call2(f, r[1], t[1 + i]); + var _H_ = i + 1 | 0; + if(_G_ !== i){var i = _H_; continue;} + break; + } + } + return [0, r[1]]; + } + function reduce_exn(t, f){ + var match = reduce(t, f); + if(! match) return caml_call1(Base_Import[126], cst_Array_reduce_exn); + var v = match[1]; + return v; + } + var permute = Base_Array_permute[24]; + function random_element_exn(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + if(is_empty(t)) + return caml_call1(Base_Import[124], cst_Array_random_element_exn_e); + var _E_ = caml_call2(Base_Random[18][6], random_state, t.length - 1); + return caml_check_bound(t, _E_)[1 + _E_]; + } + function random_element(opt, t){ + if(opt) + var sth = opt[1], random_state = sth; + else + var random_state = Base_Random[18][1]; + try{var _C_ = [0, random_element_exn([0, random_state], t)]; return _C_;} + catch(_D_){return 0;} + } + function zip(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? 0 + : [0, map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];})]; + } + function zip_exn(t1, t2){ + return t1.length - 1 !== t2.length - 1 + ? caml_call1(Base_Import[124], cst_Array_zip_exn) + : map2_exn(t1, t2, function(x1, x2){return [0, x1, x2];}); + } + function unzip(t){ + var n = t.length - 1; + if(0 === n) return [0, [0], [0]]; + var + match = caml_check_bound(t, 0)[1], + y = match[2], + x = match[1], + res1 = caml_call2(create, n, x), + res2 = caml_call2(create, n, y), + _A_ = caml_call2(Base_Import[93], n, 1), + _z_ = 1; + if(_A_ >= 1){ + var i = _z_; + for(;;){ + var + match$0 = caml_check_bound(t, i)[1 + i], + y$0 = match$0[2], + x$0 = match$0[1]; + caml_check_bound(res1, i)[1 + i] = x$0; + caml_check_bound(res2, i)[1 + i] = y$0; + var _B_ = i + 1 | 0; + if(_A_ !== i){var i = _B_; continue;} + break; + } + } + return [0, res1, res2]; + } + function sorted_copy(t, compare){ + var t1 = caml_call1(copy, t); + sort$2(0, 0, t1, compare); + return t1; + } + function partitioni_tf(t, f){ + var + both = + caml_call2 + (mapi, + t, + function(i, x){return caml_call2(f, i, x) ? [0, x] : [1, x];}), + trues = + filter_map + (both, + function(param){ + if(0 !== param[0]) return 0; + var x = param[1]; + return [0, x]; + }), + falses = + filter_map + (both, + function(param){ + if(0 === param[0]) return 0; + var x = param[1]; + return [0, x]; + }); + return [0, trues, falses]; + } + function partition_tf(t, f){ + return partitioni_tf(t, function(i, x){return caml_call1(f, x);}); + } + function last(t){ + var _y_ = caml_call2(Base_Import[93], t.length - 1, 1); + return caml_check_bound(t, _y_)[1 + _y_]; + } + function to_sequence_mutable(t){ + function _w_(i){ + if(t.length - 1 <= i) return 0; + var _x_ = caml_call2(Base_Import[91], i, 1); + return [1, caml_check_bound(t, i)[1 + i], _x_]; + } + return caml_call2(Base_Sequence[41], 0, _w_); + } + function to_sequence(t){return to_sequence_mutable(caml_call1(copy, t));} + function cartesian_product(t1, t2){ + if(! is_empty(t1) && ! is_empty(t2)){ + var + n1 = t1.length - 1, + n2 = t2.length - 1, + _l_ = caml_check_bound(t2, 0)[1], + _m_ = [0, caml_check_bound(t1, 0)[1], _l_], + t = caml_call2(create, caml_call2(Base_Import[88], n1, n2), _m_), + r = [0, 0], + _o_ = caml_call2(Base_Import[93], n1, 1), + _n_ = 0; + if(_o_ >= 0){ + var i1 = _n_; + for(;;){ + var _q_ = caml_call2(Base_Import[93], n2, 1), _p_ = 0; + if(_q_ >= 0){ + var i2 = _p_; + for(;;){ + var + _s_ = caml_check_bound(t2, i2)[1 + i2], + _t_ = [0, caml_check_bound(t1, i1)[1 + i1], _s_], + _u_ = r[1]; + caml_check_bound(t, _u_)[1 + _u_] = _t_; + caml_call1(Base_Import[130], r); + var _v_ = i2 + 1 | 0; + if(_q_ !== i2){var i2 = _v_; continue;} + break; + } + } + var _r_ = i1 + 1 | 0; + if(_o_ !== i1){var i1 = _r_; continue;} + break; + } + } + return t; + } + return [0]; + } + function transpose(tt){ + if(0 === tt.length - 1) return [0, [0]]; + var width = tt.length - 1, depth = caml_check_bound(tt, 0)[1].length - 1; + return exists(tt, function(t){return t.length - 1 !== depth ? 1 : 0;}) + ? 0 + : [0, + caml_call2 + (init, + depth, + function(d){ + return caml_call2 + (init, + width, + function(w){ + return caml_check_bound(caml_check_bound(tt, w)[1 + w], d) + [1 + d]; + }); + })]; + } + function transpose_exn(tt){ + var match = transpose(tt); + if(! match) return caml_call1(Base_Import[126], cst_Array_transpose_exn); + var tt$0 = match[1]; + return tt$0; + } + function get$0(_k_, _j_){return caml_check_bound(_k_, _j_)[1 + _j_];} + function length(_i_){return _i_.length - 1;} + var + include = caml_call1(Base_Binary_searchable[2], [0, get$0, length]), + binary_search = include[1], + binary_search_segmented = include[2]; + function length$0(_h_){return _h_.length - 1;} + function create_like(len, t){ + if(0 === len) return [0]; + if(0 < t.length - 1) + return caml_call2(create, len, caml_check_bound(t, 0)[1]); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + var + unsafe_blit = runtime.caml_array_blit, + include$0 = + caml_call1(Base_Blit[4], [0, create_like, length$0, unsafe_blit]), + blit = include$0[1], + blito = include$0[2], + unsafe_blit$0 = include$0[3], + sub$0 = include$0[4], + subo = include$0[5]; + function invariant(invariant_a, t){ + return caml_call2(iter, t, invariant_a); + } + var + Base_Array = + [0, + compare, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + binary_search, + binary_search_segmented, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + invariant, + max_length, + create, + create_float_uninitialized, + init, + make_matrix, + copy_matrix, + append, + concat, + copy, + fill, + blit, + blito, + unsafe_blit$0, + sub$0, + subo, + of_list, + map, + folding_map, + folding_mapi, + fold_map, + fold_mapi, + iteri, + mapi, + foldi, + fold_right, + sort$2, + stable_sort, + is_sorted, + is_sorted_strictly, + merge, + concat_map, + concat_mapi, + partition_tf, + partitioni_tf, + cartesian_product, + transpose, + transpose_exn, + filter_opt, + filter_map, + filter_mapi, + for_alli, + existsi, + counti, + iter2_exn, + map2_exn, + fold2_exn, + for_all2_exn, + exists2_exn, + filter, + filteri, + swap, + rev_inplace, + rev, + of_list_rev, + of_list_map, + of_list_mapi, + of_list_rev_map, + of_list_rev_mapi, + map_inplace, + find_exn, + find_map_exn, + findi, + findi_exn, + find_mapi, + find_mapi_exn, + find_consecutive_duplicate, + reduce, + reduce_exn, + permute, + random_element, + random_element_exn, + zip, + zip_exn, + unzip, + sorted_copy, + last, + equal, + to_sequence, + to_sequence_mutable, + [0, [0, Insertion_sort, Heap_sort, Intro_sort]]]; + runtime.caml_register_global(28, Base_Array, "Base__Array"); + return; + } + (globalThis)); + +//# 14994 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_float0_ml = "src/float0.ml", + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_float_of_bits = runtime.caml_int64_float_of_bits, + caml_int64_neg = runtime.caml_int64_neg, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_Printf = global_data.Base__Printf, + Stdlib_Float = global_data.Stdlib__Float, + _g_ = [0, cst_src_float0_ml, 170, 4], + _f_ = [0, cst_src_float0_ml, 174, 4], + _d_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = [0, runtime.caml_int64_create_lo_mi_hi(0, 0, 0)], + _a_ = + [0, + [8, + [0, 0, 0], + 0, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [8, + [0, 0, 0], + 0, + 0, + [11, " in float0.ml: modulus should be positive", 0]]]]]], + "%f %% %f in float0.ml: modulus should be positive"]; + function ceil(_p_){return Math.ceil(_p_);} + function floor(_o_){return Math.floor(_o_);} + function mod_float(_n_, _m_){return _n_ % _m_;} + var + modf = runtime.caml_modf_float, + float_of_string = runtime.caml_float_of_string, + nan = Base_Import[85][23], + infinity = Base_Import[85][21], + neg_infinity = Base_Import[85][22], + max_finite_value = Base_Import[85][24], + epsilon_float = Base_Import[85][26], + classify_float = runtime.caml_classify_float; + function abs_float(_l_){return Math.abs(_l_);} + var is_integer = Stdlib_Float[16]; + function symbol(_k_, _j_){return Math.pow(_k_, _j_);} + function symbol$0(a, b){ + if(caml_call2(Base_Import[108][1], b, 0.)) + caml_call4(Base_Printf[7], _a_, a, b, 0); + var m = a % b; + return caml_call2(Base_Import[108][1], m, 0.) + ? caml_call2(Base_Import[92], m, b) + : m; + } + var frexp = runtime.caml_frexp_float, ldexp = runtime.caml_ldexp_float; + function is_nan(x){return caml_call2(Base_Import[108][3], x, x);} + function to_int64_preserve_order(t){ + return is_nan(t) + ? 0 + : caml_call2 + (Base_Import[108][4], t, 0.) + ? _b_ + : caml_call2 + (Base_Import[108][5], t, 0.) + ? [0, caml_int64_bits_of_float(t)] + : [0, + caml_int64_neg + (caml_int64_bits_of_float(caml_call1(Base_Import[114], t)))]; + } + function to_int64_preserve_order_exn(x){ + var _i_ = to_int64_preserve_order(x); + return caml_call4(Base_Option[28], 0, 0, 0, _i_); + } + function of_int64_preserve_order(x){ + return runtime.caml_greaterequal(x, _c_) + ? caml_int64_float_of_bits(x) + : caml_call1 + (Base_Import[114], caml_int64_float_of_bits(caml_int64_neg(x))); + } + function one_ulp(dir, t){ + var match = to_int64_preserve_order(t); + if(! match) return Base_Import[85][23]; + var x = match[1], _h_ = 759637122 <= dir ? _d_ : _e_; + return of_int64_preserve_order(runtime.caml_int64_add(x, _h_)); + } + function upper_bound_for_int(num_bits){ + var exp = caml_call2(Base_Import[93], num_bits, 1); + return one_ulp(759637122, Math.pow(2., exp)); + } + function is_x_minus_one_exact(x){ + return 1 + - + runtime.caml_equal + (caml_int64_bits_of_float(x), + caml_int64_bits_of_float(caml_call2(Base_Import[94], x, 1.))); + } + function lower_bound_for_int(num_bits){ + var + exp = caml_call2(Base_Import[93], num_bits, 1), + min_int_as_float = caml_call1(Base_Import[114], Math.pow(2., exp)); + if(53 <= caml_call2(Base_Import[93], num_bits, 1)){ + if(is_x_minus_one_exact(min_int_as_float)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + return min_int_as_float; + } + if(is_x_minus_one_exact(min_int_as_float)) + return one_ulp(19067, caml_call2(Base_Import[94], min_int_as_float, 1.)); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[108][1], t, min) + ? min + : caml_call2(Base_Import[108][1], max, t) ? max : t; + } + var x = 0.; + function box(f){return caml_call2(Base_Import[92], f, x);} + var + include = Base_Import[108], + symbol$1 = include[1], + symbol$2 = include[2], + symbol$3 = include[3], + symbol$4 = include[4], + symbol$5 = include[5], + symbol$6 = include[6], + ascending = include[7], + descending = include[8], + compare = include[9], + equal = include[10], + max = include[11], + min = include[12], + Base_Float0 = + [0, + ceil, + floor, + mod_float, + modf, + float_of_string, + nan, + infinity, + neg_infinity, + max_finite_value, + epsilon_float, + classify_float, + abs_float, + is_integer, + symbol, + symbol$0, + frexp, + ldexp, + is_nan, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + upper_bound_for_int, + is_x_minus_one_exact, + lower_bound_for_int, + clamp_unchecked, + box, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + ascending, + descending, + compare, + equal, + max, + min]; + runtime.caml_register_global(21, Base_Float0, "Base__Float0"); + return; + } + (globalThis)); + +//# 15197 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Char", + Base_Hash = global_data.Base__Hash, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Stdlib_Format = global_data.Stdlib__Format, + Base_String0 = global_data.Base__String0, + Base_Char0 = global_data.Base__Char0, + Base_Identifiable = global_data.Base__Identifiable, + Base_Array0 = global_data.Base__Array0, + Base_Comparable = global_data.Base__Comparable, + failwithf = Base_Char0[1], + escaped = Base_Char0[2], + lowercase = Base_Char0[3], + to_int = Base_Char0[4], + unsafe_of_int = Base_Char0[5], + uppercase = Base_Char0[6], + min_value = Base_Char0[8], + max_value = Base_Char0[9], + of_int = Base_Char0[10], + of_int_exn = Base_Char0[11], + compare = Base_Import[227], + hash_fold_t = Base_Import[206], + func = Base_Import[220], + cst_char = "char", + cst_Char_get_hex_digit_exn_not = + "Char.get_hex_digit_exn: not a hexadecimal digit", + _d_ = + [0, + [11, "Char.get_digit_exn ", [1, [11, ": not a digit", 0]]], + "Char.get_digit_exn %C: not a digit"], + _b_ = [0, [1, 0], "%C"], + _a_ = [0, [11, "Char.of_string: ", [3, 0, 0]], "Char.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[165], + sexp_of_t = Base_Import[141], + t_sexp_grammar = Base_Import[185]; + function to_string(t){return caml_call2(Base_String0[9], 1, t);} + function of_string(s){ + return 1 === runtime.caml_ml_string_length(s) + ? runtime.caml_string_get(s, 0) + : caml_call3(failwithf, _a_, s, 0); + } + var + include = + caml_call1 + (Base_Identifiable[1], + [0, + compare, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + module_name]), + hash_fold_t$0 = include[1], + hash$0 = include[2], + t_of_sexp$0 = include[3], + sexp_of_t$0 = include[4], + of_string$0 = include[5], + to_string$0 = include[6], + between = include[19], + clamp_exn = include[20], + clamp = include[21], + comparator = include[22], + hashable = include[24]; + function pp(fmt, c){return caml_call3(Stdlib_Format[135], fmt, _b_, c);} + function invariant(param){return 0;} + var + _c_ = caml_call2(Base_Array0[11], 256, unsafe_of_int), + all = caml_call1(Base_Array0[15], _c_); + function is_lowercase(param){return 25 < param - 97 >>> 0 ? 0 : 1;} + function is_uppercase(param){return 25 < param - 65 >>> 0 ? 0 : 1;} + function is_print(param){return 94 < param - 32 >>> 0 ? 0 : 1;} + function is_whitespace(param){ + var switch$0 = 0; + if(14 <= param){ + if(32 === param) switch$0 = 1; + } + else if(9 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_digit(param){return 9 < param - 48 >>> 0 ? 0 : 1;} + function is_alpha(param){ + var switch$0 = 0; + if(91 <= param){ + if(25 >= param - 97 >>> 0) switch$0 = 1; + } + else if(65 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_alphanum(param){ + var _u_ = param - 48 | 0, switch$0 = 0; + if(42 < _u_ >>> 0){ + if(25 >= _u_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _u_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_digit_unsafe(t){ + var _s_ = caml_call1(to_int, 48), _t_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _t_, _s_); + } + function get_digit_exn(t){ + return is_digit(t) + ? get_digit_unsafe(t) + : caml_call3(failwithf, _d_, t, 0); + } + function get_digit(t){return is_digit(t) ? [0, get_digit_unsafe(t)] : 0;} + function is_hex_digit(param){ + var _r_ = param - 48 | 0, switch$0 = 0; + if(22 < _r_ >>> 0){ + if(5 >= _r_ - 49 >>> 0) switch$0 = 1; + } + else if(6 < _r_ - 10 >>> 0) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_lower(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 97 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function is_hex_digit_upper(param){ + var switch$0 = 0; + if(58 <= param){ + if(5 >= param - 65 >>> 0) switch$0 = 1; + } + else if(48 <= param) switch$0 = 1; + return switch$0 ? 1 : 0; + } + function get_hex_digit_exn(t){ + if(65 <= t){ + if(97 <= t){ + if(103 > t){ + var + _j_ = caml_call1(to_int, 97), + _k_ = caml_call1(to_int, t), + _l_ = caml_call2(Base_Import[93], _k_, _j_); + return caml_call2(Base_Import[91], _l_, 10); + } + } + else if(71 > t){ + var + _m_ = caml_call1(to_int, 65), + _n_ = caml_call1(to_int, t), + _o_ = caml_call2(Base_Import[93], _n_, _m_); + return caml_call2(Base_Import[91], _o_, 10); + } + } + else if(9 >= t - 48 >>> 0){ + var _p_ = caml_call1(to_int, 48), _q_ = caml_call1(to_int, t); + return caml_call2(Base_Import[93], _q_, _p_); + } + var + _h_ = [0, [0, cst_char, caml_call1(sexp_of_t$0, t)], 0], + _i_ = caml_call2(Base_Sexp[9], cst_Char_get_hex_digit_exn_not, _h_); + return caml_call1(Base_Error[30], _i_); + } + function get_hex_digit(t){ + return is_hex_digit(t) ? [0, get_hex_digit_exn(t)] : 0; + } + var + symbol = Base_Import[106][6], + symbol$0 = Base_Import[106][2], + symbol$1 = Base_Import[106][4], + symbol$2 = Base_Import[106][5], + symbol$3 = Base_Import[106][1], + symbol$4 = Base_Import[106][3], + O = [0, symbol, symbol$0, symbol$1, symbol$2, symbol$3, symbol$4], + t_of_sexp$1 = Base_Import[165], + sexp_of_t$1 = Base_Import[141], + t_sexp_grammar$0 = Base_Import[185]; + function compare$0(c1, c2){ + var _f_ = caml_call1(lowercase, c2), _g_ = caml_call1(lowercase, c1); + return caml_call2(Base_Import[106][9], _g_, _f_); + } + function hash_fold_t$1(state, t){ + var _e_ = caml_call1(lowercase, t); + return caml_call2(Base_Import[206], state, _e_); + } + function hash$1(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$1, t);} + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$1]), + symbol$5 = include$0[1], + symbol$6 = include$0[2], + symbol$7 = include$0[3], + symbol$8 = include$0[4], + symbol$9 = include$0[5], + symbol$10 = include$0[6], + equal = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between$0 = include$0[13], + clamp_exn$0 = include$0[14], + clamp$0 = include$0[15], + comparator$0 = include$0[16], + include$1 = Base_Import[106], + symbol$11 = include$1[1], + symbol$12 = include$1[2], + symbol$13 = include$1[3], + symbol$14 = include$1[4], + symbol$15 = include$1[5], + symbol$16 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$0 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_Char = + [0, + all, + t_sexp_grammar, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$16, + symbol$12, + symbol$14, + symbol$15, + symbol$11, + symbol$13, + equal$0, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + O, + to_int, + of_int, + of_int_exn, + unsafe_of_int, + escaped, + lowercase, + uppercase, + is_digit, + is_lowercase, + is_uppercase, + is_alpha, + is_alphanum, + is_print, + is_whitespace, + get_digit, + get_digit_exn, + is_hex_digit, + is_hex_digit_lower, + is_hex_digit_upper, + get_hex_digit, + get_hex_digit_exn, + min_value, + max_value, + [0, + hash_fold_t$1, + hash$1, + t_of_sexp$1, + sexp_of_t$1, + t_sexp_grammar$0, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + symbol$9, + symbol$10, + equal, + compare$1, + min, + max, + ascending, + descending, + between$0, + clamp_exn$0, + clamp$0, + comparator$0]]; + runtime.caml_register_global(16, Base_Char, "Base__Char"); + return; + } + (globalThis)); + +//# 15530 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_unsafe_get = runtime.caml_string_unsafe_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Char = global_data.Base__Char, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Import0 = global_data.Base__Import0; + function tr_create_map(target, replacement){ + var tr_map = caml_call1(Base_Bytes0[7], 256), i$3 = 0; + for(;;){ + caml_bytes_unsafe_set(tr_map, i$3, caml_call1(Base_Char[31], i$3)); + var _j_ = i$3 + 1 | 0; + if(255 !== i$3){var i$3 = _j_; continue;} + var + _b_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)) + - 1 + | 0, + _a_ = 0; + if(_b_ >= 0){ + var i$2 = _a_; + for(;;){ + var + index$0 = + caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$2)); + caml_bytes_unsafe_set + (tr_map, index$0, caml_string_unsafe_get(replacement, i$2)); + var _i_ = i$2 + 1 | 0; + if(_b_ !== i$2){var i$2 = _i_; continue;} + break; + } + } + var + last_replacement = + caml_string_unsafe_get + (replacement, caml_ml_string_length(replacement) - 1 | 0), + _c_ = + caml_call2 + (Base_Import0[97][4], + caml_ml_string_length(target), + caml_ml_string_length(replacement)), + _d_ = caml_ml_string_length(target) - 1 | 0; + if(_d_ >= _c_){ + var i$1 = _c_; + for(;;){ + var + index = caml_call1(Base_Char[29], caml_string_unsafe_get(target, i$1)); + caml_bytes_unsafe_set(tr_map, index, last_replacement); + var _h_ = i$1 + 1 | 0; + if(_d_ !== i$1){var i$1 = _h_; continue;} + break; + } + } + var + first_target = runtime.caml_string_get(target, 0), + _f_ = + caml_bytes_unsafe_get(tr_map, caml_call1(Base_Char[29], first_target)); + if(! caml_call2(Base_Char[14], _f_, first_target)){ + var i = 0; + for(;;){ + if(256 === i) + var _g_ = 0; + else{ + var _e_ = caml_call1(Base_Char[31], i); + if(! caml_call2(Base_Char[14], caml_bytes_unsafe_get(tr_map, i), _e_)){var i$0 = i + 1 | 0, i = i$0; continue;} + var _g_ = 1; + } + if(! _g_) return 0; + break; + } + } + return [0, caml_call1(Base_Bytes0[16], tr_map)]; + } + } + var Base_Bytes_tr = [0, tr_create_map]; + runtime.caml_register_global(3, Base_Bytes_tr, "Base__Bytes_tr"); + return; + } + (globalThis)); + +//# 15631 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function stage(_b_){return _b_;} + function unstage(_a_){return _a_;} + var Base_Staged = [0, stage, unstage]; + runtime.caml_register_global(0, Base_Staged, "Base__Staged"); + return; + } + (globalThis)); + +//# 15644 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$11 = "", + cst_case_sensitive = "case_sensitive", + cst_char$1 = "char", + cst_escape_char$1 = "escape_char", + cst_pattern = "pattern", + cst_pos$1 = "pos", + cst_src_string_ml = "src/string.ml", + cst_str$1 = "str", + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_check_bound = runtime.caml_check_bound, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_get = runtime.caml_string_get, + caml_string_unsafe_get = runtime.caml_string_unsafe_get, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$10 = cst$11, + cst$9 = cst$11, + cst$8 = cst$11, + cst$6 = cst$11, + cst$7 = cst$11, + cst$5 = cst$11, + cst$4 = cst$11, + cst$3 = cst$11, + cst$2 = cst$11, + cst$1 = cst$11, + cst$0 = cst$11, + cst = cst$11, + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Array0 = global_data.Base__Array0, + Stdlib_Format = global_data.Stdlib__Format, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Indexed_container = global_data.Base__Indexed_container, + Base_Container = global_data.Base__Container, + Base_Hash = global_data.Base__Hash, + Base_Ppx_compare_lib = global_data.Base__Ppx_compare_lib, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_String0 = global_data.Base__String0, + Base_Printf = global_data.Base__Printf, + Base_Error = global_data.Base__Error, + Base_Staged = global_data.Base__Staged, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + max_length = Base_String0[2], + symbol = Base_String0[3], + capitalize = Base_String0[4], + compare = Base_String0[5], + copy = Base_String0[6], + escaped = Base_String0[7], + lowercase = Base_String0[8], + make = Base_String0[9], + uncapitalize = Base_String0[11], + uppercase = Base_String0[13], + concat = Base_String0[14], + iter = Base_String0[15], + invalid_argf = Base_Printf[7], + raise_s = Base_Error[30], + stage = Base_Staged[1], + hash_fold_t = Base_Import[209], + func = Base_Import[223], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _G_ = [0, cst_src_string_ml, 1587, 2], + _F_ = [0, cst_src_string_ml, 1573, 19], + cst_char$0 = cst_char$1, + cst_pos$0 = cst_pos$1, + cst_escape_char$0 = cst_escape_char$1, + cst_str$0 = cst_str$1, + cst_rindex_from_exn_not_found = "rindex_from_exn: not found", + cst_rindex_from = "rindex_from", + cst_char = cst_char$1, + cst_pos = cst_pos$1, + cst_escape_char = cst_escape_char$1, + cst_str = cst_str$1, + cst_index_from_exn_not_found = "index_from_exn: not found", + cst_index_from = "index_from", + cst_is_char_literal = "is_char_literal", + cst_is_char_escaped = "is_char_escaped", + cst_is_char_escaping = "is_char_escaping", + _E_ = [0, [2, 0, [11, ": out of bounds", 0]], "%s: out of bounds"], + cst_escapeworthy_map = "escapeworthy_map", + cst_c_to = "c_to", + cst_c_from = "c_from", + cst_escapeworthy_map_not_one_t = "escapeworthy_map not one-to-one", + _D_ = [0, [3, 0, 0], "%S"], + _C_ = + [0, + [11, "String.chop_suffix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_suffix_exn %S %S"], + _B_ = + [0, + [11, "String.chop_prefix_exn ", [3, 0, [12, 32, [3, 0, 0]]]], + "String.chop_prefix_exn %S %S"], + cst_tr_multi_replacement_is_em = "tr_multi replacement is empty string", + _A_ = [0, cst_src_string_ml, 765, 17], + cst_suffix = "suffix", + cst_prefix = "prefix", + cst_drop_suffix = "drop_suffix", + cst_drop_prefix = "drop_prefix", + cst_expecting_nonnegative_argu = " expecting nonnegative argument", + _x_ = [0, [11, "String.init ", [4, 0, 0, 0, 0]], "String.init %d"], + _p_ = + [0, + [11, + "String.is_substring_at: invalid index ", + [4, 0, 0, 0, [11, " for string of length ", [4, 0, 0, 0, 0]]]], + "String.is_substring_at: invalid index %d for string of length %d"], + _g_ = [0, "kmp_array"], + _h_ = [0, cst_case_sensitive], + _i_ = [0, cst_pattern], + cst_substring = "substring", + cst_Substring_not_found = "Substring not found", + _e_ = [0, cst_case_sensitive], + _f_ = [0, cst_pattern], + cst_String_rindex_from_exn = "String.rindex_from_exn", + cst_String_index_from_exn = "String.index_from_exn", + _a_ = [0, "String.index_exn: not found"], + _b_ = [0, "String.index_from_exn: not found"], + _c_ = [0, "String.rindex_exn: not found"], + _d_ = [0, "String.rindex_from_exn: not found"], + _y_ = [0, "String.lsplit2_exn: not found"], + _z_ = [0, "String.rsplit2_exn: not found"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[163], + sexp_of_t = Base_Import[139], + t_sexp_grammar = Base_Import[183], + hashable = [0, hash, compare, sexp_of_t], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function sub(src, pos, len){ + if(0 === pos && len === caml_ml_string_length(src)) return src; + caml_call3 + (Base_Ordered_collection_common[2], pos, len, caml_ml_string_length(src)); + if(0 === len) return cst; + var dst = caml_call1(Base_Bytes0[7], len); + runtime.caml_blit_string(src, pos, dst, 0, len); + return caml_call1(Base_Bytes0[16], dst); + } + function subo(opt, len, src){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + if(len) + var i = len[1], i$0 = i; + else + var i$0 = caml_call2(Base_Import[93], caml_ml_string_length(src), pos); + return sub(src, pos, i$0); + } + function contains(opt, len, t, char$0){ + if(opt) var sth = opt[1], pos$1 = sth; else var pos$1 = 0; + var + total_length = caml_ml_string_length(t), + _dt_ = caml_call2(Base_Import[93], total_length, pos$1), + len$0 = caml_call2(Base_Option[27], len, _dt_); + caml_call3(Base_Ordered_collection_common[2], pos$1, len$0, total_length); + var end = caml_call2(Base_Import[91], pos$1, len$0), pos = pos$1; + for(;;){ + var _dq_ = pos < end ? 1 : 0; + if(_dq_){ + var + _dr_ = + caml_call2(Base_Char[15], caml_string_unsafe_get(t, pos), char$0); + if(! _dr_){ + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + continue; + } + var _ds_ = _dr_; + } + else + var _ds_ = _dq_; + return _ds_; + } + } + function is_empty(t){return 0 === caml_ml_string_length(t) ? 1 : 0;} + function index_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(len <= pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[91], pos$0, 1), pos$0 = pos$1; + } + } + function index_exn_internal(t, not_found, char$0){ + return index_from_exn_internal + (t, 0, caml_ml_string_length(t), not_found, char$0); + } + var not_found = [0, Base_Import[252], _a_]; + function index_exn(t, char$0){ + return index_exn_internal(t, not_found, char$0); + } + var not_found$0 = [0, Base_Import[252], _b_]; + function index_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(0 <= pos && len >= pos) + return index_from_exn_internal(t, pos, len, not_found$0, char$0); + return caml_call1(Base_Import[126], cst_String_index_from_exn); + } + function rindex_from_exn_internal(string, pos, len, not_found, char$0){ + var pos$0 = pos; + for(;;){ + if(0 > pos$0) throw caml_maybe_attach_backtrace(not_found, 1); + if + (caml_call2 + (Base_Char[15], caml_string_unsafe_get(string, pos$0), char$0)) + return pos$0; + var pos$1 = caml_call2(Base_Import[93], pos$0, 1), pos$0 = pos$1; + } + } + function rindex_exn_internal(t, not_found, char$0){ + var len = caml_ml_string_length(t); + return rindex_from_exn_internal + (t, caml_call2(Base_Import[93], len, 1), len, not_found, char$0); + } + var not_found$1 = [0, Base_Import[252], _c_]; + function rindex_exn(t, char$0){ + return rindex_exn_internal(t, not_found$1, char$0); + } + var not_found$2 = [0, Base_Import[252], _d_]; + function rindex_from_exn(t, pos, char$0){ + var len = caml_ml_string_length(t); + if(-1 <= pos && len > pos) + return rindex_from_exn_internal(t, pos, len, not_found$2, char$0); + return caml_call1(Base_Import[126], cst_String_rindex_from_exn); + } + function index(t, char$0){ + try{var _do_ = [0, index_exn(t, char$0)]; return _do_;} + catch(_dp_){ + var _dn_ = caml_wrap_exception(_dp_); + if(_dn_[1] !== Base_Import[252] && _dn_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dn_, 0); + return 0; + } + } + function rindex(t, char$0){ + try{var _dl_ = [0, rindex_exn(t, char$0)]; return _dl_;} + catch(_dm_){ + var _dk_ = caml_wrap_exception(_dm_); + if(_dk_[1] !== Base_Import[252] && _dk_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dk_, 0); + return 0; + } + } + function index_from(t, pos, char$0){ + try{var _di_ = [0, index_from_exn(t, pos, char$0)]; return _di_;} + catch(_dj_){ + var _dh_ = caml_wrap_exception(_dj_); + if(_dh_[1] !== Base_Import[252] && _dh_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_dh_, 0); + return 0; + } + } + function rindex_from(t, pos, char$0){ + try{var _df_ = [0, rindex_from_exn(t, pos, char$0)]; return _df_;} + catch(_dg_){ + var _de_ = caml_wrap_exception(_dg_); + if(_de_[1] !== Base_Import[252] && _de_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_de_, 0); + return 0; + } + } + function sexp_of_t$0(param){ + var + case_sensitive = param[2], + pattern = param[1], + _dd_ = + [0, + [1, [0, _e_, [0, caml_call1(Base_Import[138], case_sensitive), 0]]], + 0]; + return [1, + [0, + [1, [0, _f_, [0, caml_call1(Base_Import[139], pattern), 0]]], + _dd_]]; + } + function pattern(t){return t[1];} + function case_sensitive(t){return t[2];} + function kmp_internal_loop + (matched_chars, next_text_char, pattern, kmp_array, char_equal){ + var matched_chars$0 = [0, matched_chars]; + for(;;){ + if + (0 < matched_chars$0[1] + && + ! + caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))){ + matched_chars$0[1] = + kmp_array[1 + caml_call2(Base_Import[93], matched_chars$0[1], 1)]; + continue; + } + if + (caml_call2 + (char_equal, + next_text_char, + caml_string_unsafe_get(pattern, matched_chars$0[1]))) + matched_chars$0[1] = caml_call2(Base_Import[91], matched_chars$0[1], 1); + return matched_chars$0[1]; + } + } + function get_char_equal(case_sensitive){ + return case_sensitive ? Base_Char[15] : Base_Char[52][12]; + } + function create(pattern, case_sensitive){ + var + n = caml_ml_string_length(pattern), + kmp_array = caml_call2(Base_Array0[4], n, -1); + if(0 < n){ + var char_equal = get_char_equal(case_sensitive); + kmp_array[1] = 0; + var + matched_chars = [0, 0], + _db_ = caml_call2(Base_Import[93], n, 1), + _da_ = 1; + if(_db_ >= 1){ + var i = _da_; + for(;;){ + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], + caml_string_unsafe_get(pattern, i), + pattern, + kmp_array, + char_equal); + kmp_array[1 + i] = matched_chars[1]; + var _dc_ = i + 1 | 0; + if(_db_ !== i){var i = _dc_; continue;} + break; + } + } + } + return [0, pattern, case_sensitive, kmp_array]; + } + function index_internal(opt, param){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + return function(text){ + if + (0 <= pos + && + caml_call2 + (Base_Import[93], + caml_ml_string_length(text), + caml_ml_string_length(pattern)) + >= pos){ + var + char_equal = get_char_equal(case_sensitive), + j = [0, pos], + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text); + for(;;){ + if(j[1] < n && matched_chars[1] < k){ + var next_text_char = caml_string_unsafe_get(text, j[1]); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + j[1] = caml_call2(Base_Import[91], j[1], 1); + continue; + } + return matched_chars[1] === k + ? caml_call2(Base_Import[93], j[1], k) + : -1; + } + } + return -1;}; + } + function matches(t, str){ + return 0 <= caml_call1(index_internal(0, t), str) ? 1 : 0; + } + function index$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + return 0 <= p ? [0, p] : 0; + } + function index_exn$0(pos, t, in$0){ + var p = caml_call1(index_internal(pos, t), in$0); + if(0 <= p) return p; + var _c$_ = [0, [0, cst_substring, caml_call1(Base_Import[139], t[1])], 0]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Substring_not_found, _c$_)); + } + function index_all(param, may_overlap, text){ + var kmp_array = param[3], case_sensitive = param[2], pattern = param[1]; + if(0 === caml_ml_string_length(pattern)){ + var + _c5_ = function(_c__){return _c__;}, + _c6_ = caml_call2(Base_Import[91], 1, caml_ml_string_length(text)); + return caml_call2(Base_List[123], _c6_, _c5_); + } + var + char_equal = get_char_equal(case_sensitive), + matched_chars = [0, 0], + k = caml_ml_string_length(pattern), + n = caml_ml_string_length(text), + found = [0, 0], + _c7_ = 0; + if(n >= 0){ + var j = _c7_; + for(;;){ + if(matched_chars[1] === k){ + var _c8_ = found[1]; + found[1] = [0, caml_call2(Base_Import[93], j, k), _c8_]; + matched_chars[1] = + may_overlap ? kmp_array[1 + caml_call2(Base_Import[93], k, 1)] : 0; + } + if(j < n){ + var next_text_char = caml_string_unsafe_get(text, j); + matched_chars[1] = + kmp_internal_loop + (matched_chars[1], next_text_char, pattern, kmp_array, char_equal); + } + var _c9_ = j + 1 | 0; + if(n !== j){var j = _c9_; continue;} + break; + } + } + return caml_call1(Base_List[38], found[1]); + } + function replace_first(pos, t, s, with$0){ + var match = index$0(pos, t, s); + if(! match) return s; + var + i = match[1], + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + _cZ_ = caml_call2(Base_Import[91], len_s, len_with), + _c0_ = caml_call2(Base_Import[93], _cZ_, len_t), + dst = caml_call1(Base_Bytes0[7], _c0_); + caml_call5(Base_Bytes0[4], s, 0, dst, 0, i); + caml_call5(Base_Bytes0[4], with$0, 0, dst, i, len_with); + var + _c1_ = caml_call2(Base_Import[93], len_s, i), + _c2_ = caml_call2(Base_Import[93], _c1_, len_t), + _c3_ = caml_call2(Base_Import[91], i, len_with), + _c4_ = caml_call2(Base_Import[91], i, len_t); + caml_call5(Base_Bytes0[4], s, _c4_, dst, _c3_, _c2_); + return caml_call1(Base_Bytes0[16], dst); + } + function replace_all(t, s, with$0){ + var matches = index_all(t, 0, s); + if(! matches) return s; + var + len_s = caml_ml_string_length(s), + len_t = caml_ml_string_length(t[1]), + len_with = caml_ml_string_length(with$0), + num_matches = caml_call1(Base_List[7], matches), + _cR_ = caml_call2(Base_Import[93], len_with, len_t), + _cS_ = caml_call2(Base_Import[88], _cR_, num_matches), + _cT_ = caml_call2(Base_Import[91], len_s, _cS_), + dst = caml_call1(Base_Bytes0[7], _cT_), + next_dst_pos = [0, 0], + next_src_pos = [0, 0]; + function _cU_(i){ + var len = caml_call2(Base_Import[93], i, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], len); + var _cW_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + caml_call5(Base_Bytes0[4], with$0, 0, dst, _cW_, len_with); + var _cX_ = caml_call2(Base_Import[91], next_dst_pos[1], len); + next_dst_pos[1] = caml_call2(Base_Import[91], _cX_, len_with); + var _cY_ = caml_call2(Base_Import[91], next_src_pos[1], len); + next_src_pos[1] = caml_call2(Base_Import[91], _cY_, len_t); + return 0; + } + caml_call2(Base_List[9], matches, _cU_); + var _cV_ = caml_call2(Base_Import[93], len_s, next_src_pos[1]); + caml_call5(Base_Bytes0[4], s, next_src_pos[1], dst, next_dst_pos[1], _cV_); + return caml_call1(Base_Bytes0[16], dst); + } + function split_on(t, s){ + var + pattern_len = caml_ml_string_length(t[1]), + matches = index_all(t, 0, s); + function _cM_(i, j){ + var + _cP_ = caml_call2(Base_Import[93], j, i), + _cQ_ = caml_call2(Base_Import[93], _cP_, pattern_len); + return sub(s, caml_call2(Base_Import[91], i, pattern_len), _cQ_); + } + var + _cN_ = + caml_call2(Base_Import[111], matches, [0, caml_ml_string_length(s), 0]), + _cO_ = [0, caml_call1(Base_Import[113], pattern_len), matches]; + return caml_call3(Base_List[83], _cO_, _cN_, _cM_); + } + function equal(a_002, b_003){ + if(caml_call2(Base_Ppx_compare_lib[1], a_002, b_003)) return 1; + var _cJ_ = caml_call2(Base_Import[246], a_002[1], b_003[1]); + if(_cJ_){ + var _cK_ = caml_call2(Base_Import[239], a_002[2], b_003[2]); + if(_cK_) + return caml_call3 + (Base_Import[248], Base_Import[242], a_002[3], b_003[3]); + var _cL_ = _cK_; + } + else + var _cL_ = _cJ_; + return _cL_; + } + function sexp_of_t$1(param){ + var + kmp_array_011 = param[3], + case_sensitive_009 = param[2], + pattern_007 = param[1], + arg_012 = caml_call2(Base_Import[153], Base_Import[142], kmp_array_011), + bnds_006 = [0, [1, [0, _g_, [0, arg_012, 0]]], 0], + arg_010 = caml_call1(Base_Import[138], case_sensitive_009), + bnds_006$0 = [0, [1, [0, _h_, [0, arg_010, 0]]], bnds_006], + arg_008 = caml_call1(Base_Import[139], pattern_007), + bnds_006$1 = [0, [1, [0, _i_, [0, arg_008, 0]]], bnds_006$0]; + return [1, bnds_006$1]; + } + function representation(_cI_){return _cI_;} + var Private = [0, equal, sexp_of_t$1, representation]; + function substr_index_gen(case_sensitive, pos, t, pattern){return index$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_exn_gen(case_sensitive, pos, t, pattern){return index_exn$0(pos, create(pattern, case_sensitive), t); + } + function substr_index_all_gen(case_sensitive, t, may_overlap, pattern){return index_all(create(pattern, case_sensitive), may_overlap, t); + } + function substr_replace_first_gen(case_sensitive, pos, t, pattern){ + var _cG_ = create(pattern, case_sensitive); + return function(_cH_){return replace_first(pos, _cG_, t, _cH_);}; + } + function substr_replace_all_gen(case_sensitive, t, pattern){ + var _cE_ = create(pattern, case_sensitive); + return function(_cF_){return replace_all(_cE_, t, _cF_);}; + } + function is_substring_gen(case_sensitive, t, substring){ + var _cD_ = substr_index_gen(case_sensitive, 0, t, substring); + return caml_call1(Base_Option[50], _cD_); + } + var _j_ = 1; + function substr_index(_cA_, _cB_, _cC_){ + return substr_index_gen(_j_, _cA_, _cB_, _cC_); + } + var _k_ = 1; + function substr_index_exn(_cx_, _cy_, _cz_){ + return substr_index_exn_gen(_k_, _cx_, _cy_, _cz_); + } + var _l_ = 1; + function substr_index_all(_cu_, _cv_, _cw_){ + return substr_index_all_gen(_l_, _cu_, _cv_, _cw_); + } + var _m_ = 1; + function substr_replace_first(_cr_, _cs_, _ct_){ + return substr_replace_first_gen(_m_, _cr_, _cs_, _ct_); + } + var _n_ = 1; + function substr_replace_all(_cp_, _cq_){ + return substr_replace_all_gen(_n_, _cp_, _cq_); + } + var _o_ = 1; + function is_substring(_cn_, _co_){ + return is_substring_gen(_o_, _cn_, _co_); + } + function is_substring_at_gen(str, str_pos$1, sub, char_equal){ + var + str_len = caml_ml_string_length(str), + sub_len = caml_ml_string_length(sub), + _ck_ = str_pos$1 < 0 ? 1 : 0, + _cl_ = _ck_ || (str_len < str_pos$1 ? 1 : 0); + if(_cl_) caml_call4(invalid_argf, _p_, str_pos$1, str_len, 0); + var + _cm_ = caml_call2(Base_Import[91], str_pos$1, sub_len) <= str_len ? 1 : 0; + if(! _cm_) return _cm_; + var str_pos = str_pos$1, sub_pos = 0; + for(;;){ + if(sub_pos === sub_len) return 1; + if + (! + caml_call2 + (char_equal, + caml_string_unsafe_get(str, str_pos), + caml_string_unsafe_get(sub, sub_pos))) + return 0; + var + sub_pos$0 = caml_call2(Base_Import[91], sub_pos, 1), + str_pos$0 = caml_call2(Base_Import[91], str_pos, 1), + str_pos = str_pos$0, + sub_pos = sub_pos$0; + } + } + function is_suffix_gen(string, suffix, char_equal){ + var + string_len = caml_ml_string_length(string), + suffix_len = caml_ml_string_length(suffix), + _cj_ = suffix_len <= string_len ? 1 : 0; + return _cj_ + ? is_substring_at_gen + (string, + caml_call2(Base_Import[93], string_len, suffix_len), + suffix, + char_equal) + : _cj_; + } + function is_prefix_gen(string, prefix, char_equal){ + var + string_len = caml_ml_string_length(string), + prefix_len = caml_ml_string_length(prefix), + _ci_ = prefix_len <= string_len ? 1 : 0; + return _ci_ ? is_substring_at_gen(string, 0, prefix, char_equal) : _ci_; + } + var + t_of_sexp$0 = Base_Import[163], + sexp_of_t$2 = Base_Import[139], + t_sexp_grammar$0 = Base_Import[183]; + function compare$0(string1, string2){ + if(caml_call2(Base_Import[128], string1, string2)) return 0; + var + len2 = caml_ml_string_length(string2), + len1 = caml_ml_string_length(string1), + pos = 0; + for(;;){ + if(pos === len1) return pos === len2 ? 0 : -1; + if(pos === len2) return 1; + var + c2 = caml_string_unsafe_get(string2, pos), + c1 = caml_string_unsafe_get(string1, pos), + _cg_ = caml_call1(Base_Char[34], c2), + _ch_ = caml_call1(Base_Char[34], c1), + c = caml_call2(Base_Char[16], _ch_, _cg_); + if(0 !== c) return c; + var pos$0 = caml_call2(Base_Import[91], pos, 1), pos = pos$0; + } + } + function hash_fold_t$0(state, t){ + var + len = caml_ml_string_length(t), + state$0 = [0, caml_call2(Base_Import[207], state, len)], + _cd_ = caml_call2(Base_Import[93], len, 1), + _cc_ = 0; + if(_cd_ >= 0){ + var pos = _cc_; + for(;;){ + var _ce_ = caml_call1(Base_Char[34], caml_string_unsafe_get(t, pos)); + state$0[1] = caml_call2(Base_Import[206], state$0[1], _ce_); + var _cf_ = pos + 1 | 0; + if(_cd_ !== pos){var pos = _cf_; continue;} + break; + } + } + return state$0[1]; + } + function hash$0(t){return caml_call3(Base_Hash[14], 0, hash_fold_t$0, t);} + function is_suffix(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[52][12]); + } + function is_prefix(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[52][12]); + } + var _q_ = 0; + function substr_index$0(_b$_, _ca_, _cb_){ + return substr_index_gen(_q_, _b$_, _ca_, _cb_); + } + var _r_ = 0; + function substr_index_exn$0(_b8_, _b9_, _b__){ + return substr_index_exn_gen(_r_, _b8_, _b9_, _b__); + } + var _s_ = 0; + function substr_index_all$0(_b5_, _b6_, _b7_){ + return substr_index_all_gen(_s_, _b5_, _b6_, _b7_); + } + var _t_ = 0; + function substr_replace_first$0(_b2_, _b3_, _b4_){ + return substr_replace_first_gen(_t_, _b2_, _b3_, _b4_); + } + var _u_ = 0; + function substr_replace_all$0(_b0_, _b1_){ + return substr_replace_all_gen(_u_, _b0_, _b1_); + } + var _v_ = 0; + function is_substring$0(_bY_, _bZ_){ + return is_substring_gen(_v_, _bY_, _bZ_); + } + var _w_ = Base_Char[52][12]; + function is_substring_at(_bV_){ + return function(_bW_){ + return function(_bX_){ + return is_substring_at_gen(_bV_, _bW_, _bX_, _w_);};}; + } + var + include$0 = caml_call1(Base_Comparable[10], [0, compare$0, sexp_of_t$2]), + symbol$0 = include$0[1], + symbol$1 = include$0[2], + symbol$2 = include$0[3], + symbol$3 = include$0[4], + symbol$4 = include$0[5], + symbol$5 = include$0[6], + equal$0 = include$0[7], + compare$1 = include$0[8], + min = include$0[9], + max = include$0[10], + ascending = include$0[11], + descending = include$0[12], + between = include$0[13], + clamp_exn = include$0[14], + clamp = include$0[15], + comparator$0 = include$0[16]; + function of_string(_bU_){return _bU_;} + function to_string(_bT_){return _bT_;} + function init(n, f){ + if(n < 0) caml_call3(invalid_argf, _x_, n, 0); + var + t = caml_call1(Base_Bytes0[7], n), + _bR_ = caml_call2(Base_Import[93], n, 1), + _bQ_ = 0; + if(_bR_ >= 0){ + var i = _bQ_; + for(;;){ + caml_bytes_set(t, i, caml_call1(f, i)); + var _bS_ = i + 1 | 0; + if(_bR_ !== i){var i = _bS_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t); + } + function to_list(s){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_string_length(s), 1), + acc = 0, + i = i$1; + for(;;){ + if(0 > i) return acc; + var + i$0 = caml_call2(Base_Import[93], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function to_list_rev(s){ + var len = caml_ml_string_length(s), acc = 0, i = 0; + for(;;){ + if(i === len) return acc; + var + i$0 = caml_call2(Base_Import[91], i, 1), + acc$0 = [0, caml_string_get(s, i), acc], + acc = acc$0, + i = i$0; + } + } + function rev(t){ + var + len = caml_ml_string_length(t), + res = caml_call1(Base_Bytes0[7], len), + _bN_ = caml_call2(Base_Import[93], len, 1), + _bM_ = 0; + if(_bN_ >= 0){ + var i = _bM_; + for(;;){ + var _bO_ = caml_call2(Base_Import[93], len, 1); + caml_bytes_unsafe_set + (res, + i, + caml_string_unsafe_get(t, caml_call2(Base_Import[93], _bO_, i))); + var _bP_ = i + 1 | 0; + if(_bN_ !== i){var i = _bP_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], res); + } + var not_found$3 = [0, Base_Import[252], _y_]; + function lsplit2_exn(line, delim){ + var + pos = index_exn_internal(line, not_found$3, delim), + _bJ_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bK_ = caml_call2(Base_Import[93], _bJ_, 1), + _bL_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bK_); + return [0, sub(line, 0, pos), _bL_]; + } + var not_found$4 = [0, Base_Import[252], _z_]; + function rsplit2_exn(line, delim){ + var + pos = rindex_exn_internal(line, not_found$4, delim), + _bG_ = caml_call2(Base_Import[93], caml_ml_string_length(line), pos), + _bH_ = caml_call2(Base_Import[93], _bG_, 1), + _bI_ = sub(line, caml_call2(Base_Import[91], pos, 1), _bH_); + return [0, sub(line, 0, pos), _bI_]; + } + function lsplit2(line, on){ + try{var _bE_ = [0, lsplit2_exn(line, on)]; return _bE_;} + catch(_bF_){ + var _bD_ = caml_wrap_exception(_bF_); + if(_bD_[1] !== Base_Import[252] && _bD_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bD_, 0); + return 0; + } + } + function rsplit2(line, on){ + try{var _bB_ = [0, rsplit2_exn(line, on)]; return _bB_;} + catch(_bC_){ + var _bA_ = caml_wrap_exception(_bC_); + if(_bA_[1] !== Base_Import[252] && _bA_ !== Base_Import[85][104]) + throw caml_maybe_attach_backtrace(_bA_, 0); + return 0; + } + } + function char_list_mem(l, c){ + var l$0 = l; + for(;;){ + if(! l$0) return 0; + var tl = l$0[2], hd = l$0[1], _bz_ = caml_call2(Base_Char[15], hd, c); + if(_bz_) return _bz_; + var l$0 = tl; + } + } + function split_gen(str, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + last_pos = caml_ml_string_length(str), + pos$1 = caml_call2(Base_Import[93], last_pos, 1), + acc = 0, + last_pos$1 = last_pos, + last_pos$0 = pos$1; + for(;;){ + if(-1 === last_pos$0) return [0, sub(str, 0, last_pos$1), acc]; + if(is_delim(caml_string_get(str, last_pos$0))){ + var + pos1 = caml_call2(Base_Import[91], last_pos$0, 1), + sub_str = sub(str, pos1, caml_call2(Base_Import[93], last_pos$1, pos1)), + pos = caml_call2(Base_Import[93], last_pos$0, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + last_pos$1 = last_pos$0, + last_pos$0 = pos; + continue; + } + var + pos$0 = caml_call2(Base_Import[93], last_pos$0, 1), + last_pos$0 = pos$0; + } + } + function split(str, on){return split_gen(str, [0, -1044422954, on]);} + function split_on_chars(str, chars){ + return split_gen(str, [0, 552554919, chars]); + } + function back_up_at_newline(t, pos, eol){ + var switch$0 = 0; + if(0 < pos[1]){ + var _bx_ = caml_string_get(t, caml_call2(Base_Import[93], pos[1], 1)); + if(caml_call2(Base_Char[15], _bx_, 13)){var _by_ = 2; switch$0 = 1;} + } + if(! switch$0) var _by_ = 1; + pos[1] = caml_call2(Base_Import[93], pos[1], _by_); + eol[1] = caml_call2(Base_Import[91], pos[1], 1); + return 0; + } + function split_lines(t){ + var n = caml_ml_string_length(t); + if(0 === n) return 0; + var + pos = [0, caml_call2(Base_Import[93], n, 1)], + eol = [0, n], + ac = [0, 0], + _bt_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[15], _bt_, 10)) back_up_at_newline(t, pos, eol); + for(;;){ + if(0 > pos[1]){var _bw_ = ac[1]; return [0, sub(t, 0, eol[1]), _bw_];} + var _bu_ = caml_string_get(t, pos[1]); + if(caml_call2(Base_Char[14], _bu_, 10)){ + caml_call1(Base_Import[129], pos); + continue; + } + var start = caml_call2(Base_Import[91], pos[1], 1), _bv_ = ac[1]; + ac[1] = + [0, sub(t, start, caml_call2(Base_Import[93], eol[1], start)), _bv_]; + back_up_at_newline(t, pos, eol); + } + } + function is_suffix$0(s, suffix){ + return is_suffix_gen(s, suffix, Base_Char[15]); + } + function is_prefix$0(s, prefix){ + return is_prefix_gen(s, prefix, Base_Char[15]); + } + function is_substring_at$0(s, pos, substring){ + return is_substring_at_gen(s, pos, substring, Base_Char[15]); + } + function wrap_sub_n(t, n, name, pos, len, on_error){ + if(0 <= n) + try{var _bq_ = sub(t, pos, len); return _bq_;} + catch(_bs_){return on_error;} + var _br_ = caml_call2(symbol, name, cst_expecting_nonnegative_argu); + return caml_call1(Base_Import[126], _br_); + } + function drop_prefix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_prefix, + n, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$0); + } + function drop_suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_drop_suffix, + 0, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + cst$1); + } + function prefix(t, n){return wrap_sub_n(t, n, cst_prefix, 0, n, t);} + function suffix(t, n){ + return wrap_sub_n + (t, + n, + cst_suffix, + caml_call2(Base_Import[93], caml_ml_string_length(t), n), + n, + t); + } + function lfindi(opt, t, f){ + if(opt) var sth = opt[1], pos = sth; else var pos = 0; + var n = caml_ml_string_length(t), i = pos; + for(;;){ + if(i === n) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function find(t, f){ + var match = lfindi(0, t, function(param, c){return caml_call1(f, c);}); + if(! match) return 0; + var i = match[1]; + return [0, caml_string_get(t, i)]; + } + function find_map(t, f){ + var n = caml_ml_string_length(t), i = 0; + for(;;){ + if(i === n) return 0; + var res = caml_call1(f, caml_string_get(t, i)); + if(res) return res; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + function rfindi(pos, t, f){ + if(pos) + var pos$0 = pos[1], pos$1 = pos$0; + else + var pos$1 = caml_call2(Base_Import[93], caml_ml_string_length(t), 1); + var i = pos$1; + for(;;){ + if(0 > i) return 0; + if(caml_call2(f, i, caml_string_get(t, i))) return [0, i]; + var i$0 = caml_call2(Base_Import[93], i, 1), i = i$0; + } + } + function last_non_drop(drop, t){ + return rfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function rstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop(drop, t); + if(! match) return cst$2; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function first_non_drop(drop, t){ + return lfindi(0, t, function(param, c){return 1 - caml_call1(drop, c);}); + } + function lstrip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop(drop, t); + if(! match) return cst$3; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip(opt, t){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop(drop, t); + if(! match) return cst$4; + var first = match[1], match$0 = last_non_drop(drop, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var last = match$0[1], _bp_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _bp_, 1)); + } + } + return t; + } + function mapi(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bn_ = caml_call2(Base_Import[93], l, 1), + _bm_ = 0; + if(_bn_ >= 0){ + var i = _bm_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call2(f, i, caml_string_get(t, i))); + var _bo_ = i + 1 | 0; + if(_bn_ !== i){var i = _bo_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function map(t, f){ + var + l = caml_ml_string_length(t), + t$0 = caml_call1(Base_Bytes0[7], l), + _bk_ = caml_call2(Base_Import[93], l, 1), + _bj_ = 0; + if(_bk_ >= 0){ + var i = _bj_; + for(;;){ + caml_bytes_unsafe_set(t$0, i, caml_call1(f, caml_string_get(t, i))); + var _bl_ = i + 1 | 0; + if(_bk_ !== i){var i = _bl_; continue;} + break; + } + } + return caml_call1(Base_Bytes0[16], t$0); + } + function to_array(s){ + function _bi_(i){return caml_string_get(s, i);} + return caml_call2(Base_Array0[11], caml_ml_string_length(s), _bi_); + } + function exists(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bf_ = i < len ? 1 : 0; + if(_bf_){ + var _bg_ = caml_call1(f, caml_string_get(s, i)); + if(! _bg_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bh_ = _bg_; + } + else + var _bh_ = _bf_; + return _bh_; + } + } + function for_all(s, f){ + var len = caml_ml_string_length(s), i = 0; + for(;;){ + var _bc_ = i === len ? 1 : 0; + if(_bc_) + var _bd_ = _bc_; + else{ + var _be_ = caml_call1(f, caml_string_get(s, i)); + if(_be_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _bd_ = _be_; + } + return _bd_; + } + } + function fold(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call2(f, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_string_length(t), i = 0, ac = init; + for(;;){ + if(i === len) return ac; + var + ac$0 = caml_call3(f, i, ac, caml_string_get(t, i)), + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + ac = ac$0; + } + } + function iteri(t, f){ + var + _ba_ = caml_call2(Base_Import[93], caml_ml_string_length(t), 1), + _a$_ = 0; + if(_ba_ >= 0){ + var i = _a$_; + for(;;){ + caml_call2(f, i, caml_string_unsafe_get(t, i)); + var _bb_ = i + 1 | 0; + if(_ba_ !== i){var i = _bb_; continue;} + break; + } + } + return 0; + } + function count(t, f){return caml_call3(Base_Container[2], fold, t, f);} + function sum(m, t, f){return caml_call4(Base_Container[7], fold, m, t, f);} + function min_elt(t){return caml_call2(Base_Container[3], fold, t);} + function max_elt(t){return caml_call2(Base_Container[4], fold, t);} + function fold_result(t, init, f){ + return caml_call4(Base_Container[8], fold, init, f, t); + } + function fold_until(t, init, f){ + var _a9_ = caml_call3(Base_Container[9], fold, init, f); + return function(_a__){return caml_call2(_a9_, _a__, t);}; + } + function find_mapi(t, f){ + return caml_call3(Base_Indexed_container[7], iteri, t, f); + } + function findi(t, f){ + return caml_call3(Base_Indexed_container[6], iteri, t, f); + } + function counti(t, f){ + return caml_call3(Base_Indexed_container[3], foldi, t, f); + } + function for_alli(t, f){ + return caml_call3(Base_Indexed_container[5], iteri, t, f); + } + function existsi(t, f){ + return caml_call3(Base_Indexed_container[4], iteri, t, f); + } + function mem(t, c){ + var len = caml_ml_string_length(t), i = 0; + for(;;){ + var _a6_ = i < len ? 1 : 0; + if(_a6_){ + var _a7_ = caml_call2(Base_Char[15], c, caml_string_unsafe_get(t, i)); + if(! _a7_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _a8_ = _a7_; + } + else + var _a8_ = _a6_; + return _a8_; + } + } + function tr(target, replacement, s){ + return caml_call2(Base_Char[15], target, replacement) + ? s + : mem + (s, target) + ? map + (s, + function(c){ + return caml_call2(Base_Char[15], c, target) + ? replacement + : c; + }) + : s; + } + function tr_multi(target, replacement){ + if(is_empty(target)) + return caml_call1(stage, function(_a5_){return _a5_;}); + if(is_empty(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_em); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_a4_){return _a4_;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + return exists + (s, + function(c){ + var + _a3_ = + caml_string_unsafe_get(tr_map, caml_call1(Base_Char[29], c)); + return caml_call2(Base_Char[14], c, _a3_); + }) + ? map + (s, + function(c){ + return caml_string_unsafe_get + (tr_map, caml_call1(Base_Char[29], c)); + }) + : s; + }); + } + function concat_array(sep, ar){ + return caml_call2(concat, sep, caml_call1(Base_Array0[15], ar)); + } + function concat_map(sep, s, f){ + var _a2_ = to_array(s); + return concat_array(sep, caml_call2(Base_Array0[20], _a2_, f)); + } + function filter(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n && caml_call1(f, caml_string_get(t, i[1]))){caml_call1(Base_Import[130], i); continue;} + if(i[1] === n) return t; + var + _a0_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _a0_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _a1_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _a1_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call1(f, c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function filteri(t, f){ + var n = caml_ml_string_length(t), i = [0, 0]; + for(;;){ + if(i[1] < n){ + var _aX_ = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], _aX_)){ + caml_call1(Base_Import[130], i); + continue; + } + } + if(i[1] === n) return t; + var + _aY_ = caml_call2(Base_Import[93], n, 1), + out = caml_call1(Base_Bytes0[7], _aY_); + caml_call5(Base_Bytes0[4], t, 0, out, 0, i[1]); + var out_pos = [0, i[1]]; + caml_call1(Base_Import[130], i); + for(;;){ + if(i[1] >= n){ + var + out$0 = caml_call1(Base_Bytes0[16], out), + _aZ_ = caml_call2(Base_Import[93], n, 1); + return out_pos[1] === _aZ_ ? out$0 : sub(out$0, 0, out_pos[1]); + } + var c = caml_string_get(t, i[1]); + if(caml_call2(f, i[1], c)){ + caml_bytes_set(out, out_pos[1], c); + caml_call1(Base_Import[130], out_pos); + } + caml_call1(Base_Import[130], i); + } + } + } + function chop_prefix(s, prefix){ + return is_prefix$0(s, prefix) + ? [0, drop_prefix(s, caml_ml_string_length(prefix))] + : 0; + } + function chop_prefix_if_exists(s, prefix){ + return is_prefix$0(s, prefix) + ? drop_prefix(s, caml_ml_string_length(prefix)) + : s; + } + function chop_prefix_exn(s, prefix){ + var match = chop_prefix(s, prefix); + if(! match) return caml_call4(invalid_argf, _B_, s, prefix, 0); + var str = match[1]; + return str; + } + function chop_suffix(s, suffix){ + return is_suffix$0(s, suffix) + ? [0, drop_suffix(s, caml_ml_string_length(suffix))] + : 0; + } + function chop_suffix_if_exists(s, suffix){ + return is_suffix$0(s, suffix) + ? drop_suffix(s, caml_ml_string_length(suffix)) + : s; + } + function chop_suffix_exn(s, suffix){ + var match = chop_suffix(s, suffix); + if(! match) return caml_call4(invalid_argf, _C_, s, suffix, 0); + var str = match[1]; + return str; + } + function shorter(a, b){ + return caml_ml_string_length(a) <= caml_ml_string_length(b) ? a : b; + } + function shortest(list){ + if(! list) return cst$5; + var rest = list[2], first = list[1]; + return caml_call3(Base_List[10], rest, first, shorter); + } + function pos_from_left(param, i){return i;} + function pos_from_right(t, i){ + var _aW_ = caml_call2(Base_Import[93], caml_ml_string_length(t), i); + return caml_call2(Base_Import[93], _aW_, 1); + } + function common_generic2_length_loop(a, b, get_pos, max_len, len_so_far){ + var len_so_far$0 = len_so_far; + for(;;){ + if(max_len <= len_so_far$0) return max_len; + var + _aU_ = caml_string_unsafe_get(b, caml_call2(get_pos, b, len_so_far$0)), + _aV_ = caml_string_unsafe_get(a, caml_call2(get_pos, a, len_so_far$0)); + if(! caml_call2(Base_Char[15], _aV_, _aU_)) return len_so_far$0; + var + len_so_far$1 = caml_call2(Base_Import[91], len_so_far$0, 1), + len_so_far$0 = len_so_far$1; + } + } + function common_generic2_length(a, b, get_pos){ + var + max_len = + caml_call2 + (Base_Import[101], caml_ml_string_length(a), caml_ml_string_length(b)); + return common_generic2_length_loop(a, b, get_pos, max_len, 0); + } + function common_generic_length_loop(first, list, get_pos, max_len){ + var first$0 = first, list$0 = list, max_len$0 = max_len; + for(;;){ + if(! list$0) return max_len$0; + var + rest = list$0[2], + second = list$0[1], + max_len$1 = + common_generic2_length_loop(first$0, second, get_pos, max_len$0, 0), + first$0 = second, + list$0 = rest, + max_len$0 = max_len$1; + } + } + function common_generic_length(list, get_pos){ + if(! list) return 0; + var + rest = list[2], + first = list[1], + max_len = caml_ml_string_length(shortest(list)); + return common_generic_length_loop(first, rest, get_pos, max_len); + } + function common_generic2(a, b, get_pos, take){ + var len = common_generic2_length(a, b, get_pos); + return caml_call2(take, shorter(a, b), len); + } + function common_generic(list, get_pos, take){ + if(! list) return cst$7; + var + rest = list[2], + first = list[1], + s = shortest(list), + max_len = caml_ml_string_length(s); + if(0 === max_len) return cst$6; + var len = common_generic_length_loop(first, rest, get_pos, max_len); + return caml_call2(take, s, len); + } + function common_prefix(list){ + return common_generic(list, pos_from_left, prefix); + } + function common_suffix(list){ + return common_generic(list, pos_from_right, suffix); + } + function common_prefix2(a, b){ + return common_generic2(a, b, pos_from_left, prefix); + } + function common_suffix2(a, b){ + return common_generic2(a, b, pos_from_right, suffix); + } + function common_prefix_length(list){ + return common_generic_length(list, pos_from_left); + } + function common_suffix_length(list){ + return common_generic_length(list, pos_from_right); + } + function common_prefix2_length(a, b){ + return common_generic2_length(a, b, pos_from_left); + } + function common_suffix2_length(a, b){ + return common_generic2_length(a, b, pos_from_right); + } + function pp(ppf, string){ + return caml_call3(Stdlib_Format[135], ppf, _D_, string); + } + function of_char(c){return caml_call2(make, 1, c);} + function of_char_list(l){ + var + _aS_ = caml_call1(Base_List[7], l), + t = caml_call1(Base_Bytes0[7], _aS_); + function _aT_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _aT_); + return caml_call1(Base_Bytes0[16], t); + } + function build_and_validate_escapeworth + (escapeworthy_map, escape_char, func){ + var + escapeworthy_map$0 = + caml_call3 + (Base_List[129][7], escapeworthy_map, Base_Char[15], escape_char) + ? escapeworthy_map + : [0, [0, escape_char, escape_char], escapeworthy_map], + arr = caml_call2(Base_Array0[4], 256, -1), + vals = caml_call2(Base_Array0[4], 256, 0), + param = escapeworthy_map$0; + for(;;){ + if(! param) return [0, arr]; + var l = param[2], match = param[1], c_to = match[2], c_from = match[1]; + if(919809722 <= func) + var v = c_from, k = caml_call1(Base_Char[29], c_to); + else + var k$0 = caml_call1(Base_Char[29], c_from), v = c_to, k = k$0; + if(-1 === caml_check_bound(arr, k)[1 + k]){ + var _aK_ = caml_call1(Base_Char[29], v); + if(! caml_check_bound(vals, _aK_)[1 + _aK_]){ + var _aQ_ = caml_call1(Base_Char[29], v); + caml_check_bound(arr, k)[1 + k] = _aQ_; + var _aR_ = caml_call1(Base_Char[29], v); + caml_check_bound(vals, _aR_)[1 + _aR_] = 1; + var param = l; + continue; + } + } + var + _aL_ = caml_call2(Base_Import[150], Base_Import[141], Base_Import[141]), + _aM_ = + [0, + [0, + cst_escapeworthy_map, + caml_call2(Base_Import[152], _aL_, escapeworthy_map$0)], + 0], + _aN_ = [0, [0, cst_c_to, caml_call1(Base_Import[141], c_to)], _aM_], + _aO_ = [0, [0, cst_c_from, caml_call1(Base_Import[141], c_from)], _aN_], + _aP_ = caml_call2(Base_Sexp[9], cst_escapeworthy_map_not_one_t, _aO_); + return caml_call1(Base_Or_error[35], _aP_); + } + } + function escape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 258914209); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var + to_escape_len = [0, 0], + to_escape = + foldi + (src, + 0, + function(i, acc, c){ + var + _aJ_ = caml_call1(Base_Char[29], c), + n = caml_check_bound(escapeworthy, _aJ_)[1 + _aJ_]; + return -1 === n + ? acc + : (caml_call1 + (Base_Import[130], to_escape_len), + [0, [0, i, caml_call1(Base_Char[32], n)], acc]); + }); + if(! to_escape) return src; + var + last_idx = caml_ml_string_length(src), + last_dst_pos = + caml_call2(Base_Import[91], last_idx, to_escape_len[1]), + dst = caml_call1(Base_Bytes0[7], last_dst_pos), + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param = to_escape; + for(;;){ + if(param){ + var + to_escape$0 = param[2], + match = param[1], + escaped_char = match[2], + last_idx$1 = match[1], + _aH_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _aH_, 1), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aI_ = caml_call2(Base_Import[91], last_idx$1, 1); + caml_call5(Base_Bytes0[4], src, _aI_, dst, dst_pos, len); + var last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 2); + caml_bytes_set(dst, last_dst_pos$1, escape_char); + caml_bytes_set + (dst, + caml_call2(Base_Import[91], last_dst_pos$1, 1), + escaped_char); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param = to_escape$0; + continue; + } + caml_call5(Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + return caml_call1(Base_Bytes0[16], dst); + } + }]; + } + function escape_gen_exn(escapeworthy_map, escape_char){ + var _aG_ = escape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _aG_)); + } + function escape(escapeworthy, escape_char){ + var + _aE_ = caml_call2(Base_List[114], escapeworthy, Base_Char[16]), + _aF_ = Base_List[76], + escapeworthy_map = caml_call2(_aF_, _aE_, function(c){return [0, c, c];}); + return escape_gen_exn(escapeworthy_map, escape_char); + } + function unescape_gen(escapeworthy_map, escape_char){ + var + x = + build_and_validate_escapeworth + (escapeworthy_map, escape_char, 919809722); + if(0 !== x[0]) return x; + var escapeworthy = x[1]; + return [0, + function(src){ + var i = 0, status = -512962225, to_unescape = 0; + for(;;){ + if(caml_ml_string_length(src) <= i){ + if(! to_unescape) return src; + var + to_unescape$0 = to_unescape[2], + idx = to_unescape[1], + _ax_ = caml_call1(Base_List[7], to_unescape), + _ay_ = + caml_call2 + (Base_Import[93], caml_ml_string_length(src), _ax_), + dst = caml_call1(Base_Bytes0[7], _ay_), + loop = + function(last_idx, last_dst_pos, param){ + var + last_idx$0 = last_idx, + last_dst_pos$0 = last_dst_pos, + param$0 = param; + for(;;){ + if(! param$0) + return caml_call5 + (Base_Bytes0[4], src, 0, dst, 0, last_idx$0); + var + to_unescape = param$0[2], + last_idx$1 = param$0[1], + _az_ = caml_call2(Base_Import[93], last_idx$0, last_idx$1), + len = caml_call2(Base_Import[93], _az_, 2), + dst_pos = caml_call2(Base_Import[93], last_dst_pos$0, len), + _aA_ = caml_call2(Base_Import[91], last_idx$1, 2); + caml_call5(Base_Bytes0[4], src, _aA_, dst, dst_pos, len); + var + last_dst_pos$1 = caml_call2(Base_Import[93], dst_pos, 1), + _aB_ = + caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)), + _aC_ = caml_call1(Base_Char[29], _aB_), + n = caml_check_bound(escapeworthy, _aC_)[1 + _aC_], + _aD_ = + -1 === n + ? caml_string_get + (src, caml_call2(Base_Import[91], last_idx$1, 1)) + : caml_call1(Base_Char[32], n); + caml_bytes_set(dst, last_dst_pos$1, _aD_); + var + last_idx$0 = last_idx$1, + last_dst_pos$0 = last_dst_pos$1, + param$0 = to_unescape; + } + }; + if + (idx + < caml_call2(Base_Import[93], caml_ml_string_length(src), 1)) + loop + (caml_ml_string_length(src), + caml_ml_bytes_length(dst), + to_unescape); + else + loop + (caml_call2(Base_Import[93], caml_ml_string_length(src), 1), + caml_ml_bytes_length(dst), + to_unescape$0); + return caml_call1(Base_Bytes0[16], dst); + } + if(-512962225 <= status) + var + _aw_ = caml_string_get(src, i), + status$0 = + caml_call2(Base_Char[15], _aw_, escape_char) + ? -767030498 + : -512962225; + else + var status$0 = -244189789; + var + acc = + -512962225 <= status$0 ? to_unescape : [0, i, to_unescape], + i$0 = caml_call2(Base_Import[91], i, 1), + i = i$0, + status = status$0, + to_unescape = acc; + } + }]; + } + function unescape_gen_exn(escapeworthy_map, escape_char){ + var _av_ = unescape_gen(escapeworthy_map, escape_char); + return caml_call1(stage, caml_call1(Base_Or_error[31], _av_)); + } + function unescape(escape_char){return unescape_gen_exn(0, escape_char);} + function preceding_escape_chars(str, escape_char, pos){ + var p$1 = caml_call2(Base_Import[93], pos, 1), p = p$1, cnt = 0; + for(;;){ + if(0 <= p){ + var _au_ = caml_string_get(str, p); + if(! caml_call2(Base_Char[14], _au_, escape_char)){ + var + cnt$0 = caml_call2(Base_Import[91], cnt, 1), + p$0 = caml_call2(Base_Import[93], p, 1), + p = p$0, + cnt = cnt$0; + continue; + } + } + return cnt; + } + } + function update_escape_status(str, escape_char, i, param){ + if(-512962225 > param) return -244189789; + var _at_ = caml_string_get(str, i); + return caml_call2(Base_Char[15], _at_, escape_char) + ? -767030498 + : -512962225; + } + function escape_status(str, escape_char, pos){ + var + _ar_ = preceding_escape_chars(str, escape_char, pos), + odd = 1 === caml_call2(Base_Import[122], _ar_, 2) ? 1 : 0, + _as_ = caml_string_get(str, pos), + match = caml_call2(Base_Char[15], _as_, escape_char); + return odd ? -244189789 : match ? -767030498 : -512962225; + } + function check_bound(str, pos, function_name){ + var + _ap_ = caml_ml_string_length(str) <= pos ? 1 : 0, + _aq_ = _ap_ || (pos < 0 ? 1 : 0); + return _aq_ ? caml_call3(invalid_argf, _E_, function_name, 0) : _aq_; + } + function is_char_escaping(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaping); + return -512962225 <= escape_status(str, escape_char, pos) ? 0 : 1; + } + function is_char_escaped(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_escaped); + return -244189789 <= escape_status(str, escape_char, pos) ? 1 : 0; + } + function is_char_literal(str, escape_char, pos){ + check_bound(str, pos, cst_is_char_literal); + return -512962225 === escape_status(str, escape_char, pos) ? 1 : 0; + } + function index_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_index_from); + var + status$1 = escape_status(str, escape_char, pos), + i = pos, + status = status$1; + for(;;){ + if(pos <= i){ + var _an_ = -512962225 === status ? 1 : 0; + if(_an_){ + var _ao_ = caml_string_get(str, i); + if(caml_call2(Base_Char[15], _ao_, char$0)) return [0, i]; + } + } + var i$0 = caml_call2(Base_Import[91], i, 1); + if(caml_ml_string_length(str) <= i$0) return 0; + var + status$0 = update_escape_status(str, escape_char, i$0, status), + i = i$0, + status = status$0; + } + } + function index_from_exn$0(str, escape_char, pos, char$0){ + var match = index_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _aj_ = [0, [0, cst_char, caml_call1(Base_Import[141], char$0)], 0], + _ak_ = [0, [0, cst_pos, caml_call1(Base_Import[142], pos)], _aj_], + _al_ = + [0, + [0, cst_escape_char, caml_call1(Base_Import[141], escape_char)], + _ak_], + _am_ = [0, [0, cst_str, caml_call1(sexp_of_t, str)], _al_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_index_from_exn_not_found, _am_)); + } + function index$1(str, escape_char, char$0){ + return index_from$0(str, escape_char, 0, char$0); + } + function index_exn$1(str, escape_char, char$0){ + return index_from_exn$0(str, escape_char, 0, char$0); + } + function rindex_from$0(str, escape_char, pos, char$0){ + check_bound(str, pos, cst_rindex_from); + if(caml_call2(Base_Char[15], char$0, escape_char)) return 0; + var pos$0 = pos; + for(;;){ + if(0 > pos$0) return 0; + var escape_chars = preceding_escape_chars(str, escape_char, pos$0); + if(0 === caml_call2(Base_Import[122], escape_chars, 2)){ + var _ah_ = caml_string_get(str, pos$0); + if(caml_call2(Base_Char[15], _ah_, char$0)) return [0, pos$0]; + } + var + _ai_ = caml_call2(Base_Import[93], pos$0, escape_chars), + pos$1 = caml_call2(Base_Import[93], _ai_, 1), + pos$0 = pos$1; + } + } + function rindex_from_exn$0(str, escape_char, pos, char$0){ + var match = rindex_from$0(str, escape_char, pos, char$0); + if(match){var pos$0 = match[1]; return pos$0;} + var + _ad_ = [0, [0, cst_char$0, caml_call1(Base_Import[141], char$0)], 0], + _ae_ = [0, [0, cst_pos$0, caml_call1(Base_Import[142], pos)], _ad_], + _af_ = + [0, + [0, cst_escape_char$0, caml_call1(Base_Import[141], escape_char)], + _ae_], + _ag_ = [0, [0, cst_str$0, caml_call1(sexp_of_t, str)], _af_]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_rindex_from_exn_not_found, _ag_)); + } + function rindex$0(str, escape_char, char$0){ + return is_empty(str) + ? 0 + : rindex_from$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function rindex_exn$0(str, escape_char, char$0){ + return rindex_from_exn$0 + (str, + escape_char, + caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + char$0); + } + function split_gen$0(str, escape_char, on){ + if(552554919 <= on[1]) + var l = on[2], is_delim = function(c){return char_list_mem(l, c);}; + else + var + c = on[2], + is_delim = function(c$0){return caml_call2(Base_Char[15], c$0, c);}; + var + len = caml_ml_string_length(str), + acc = 0, + status = -512962225, + last_pos = 0, + pos = 0; + for(;;){ + if(pos === len){ + var + _ab_ = + [0, + sub(str, last_pos, caml_call2(Base_Import[93], len, last_pos)), + acc]; + return caml_call1(Base_List[38], _ab_); + } + var + status$0 = update_escape_status(str, escape_char, pos, status), + _ac_ = -512962225 === status$0 ? 1 : 0; + if(_ac_ && is_delim(caml_string_get(str, pos))){ + var + sub_str = + sub(str, last_pos, caml_call2(Base_Import[93], pos, last_pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + last_pos$0 = caml_call2(Base_Import[91], pos, 1), + acc$0 = [0, sub_str, acc], + acc = acc$0, + status = status$0, + last_pos = last_pos$0, + pos = pos$0; + continue; + } + var + pos$1 = caml_call2(Base_Import[91], pos, 1), + status = status$0, + pos = pos$1; + } + } + function split$0(str, on){ + var _$_ = [0, -1044422954, on]; + return function(_aa_){return split_gen$0(str, _aa_, _$_);}; + } + function split_on_chars$0(str, chars){ + var _Z_ = [0, 552554919, chars]; + return function(___){return split_gen$0(str, ___, _Z_);}; + } + function split_at(str, pos){ + var + _W_ = caml_call2(Base_Import[93], caml_ml_string_length(str), pos), + _X_ = caml_call2(Base_Import[93], _W_, 1), + _Y_ = sub(str, caml_call2(Base_Import[91], pos, 1), _X_); + return [0, sub(str, 0, pos), _Y_]; + } + function lsplit2$0(str, on, escape_char){ + function _U_(x){return split_at(str, x);} + var _V_ = index$1(str, escape_char, on); + return caml_call2(Base_Option[21], _V_, _U_); + } + function rsplit2$0(str, on, escape_char){ + function _S_(x){return split_at(str, x);} + var _T_ = rindex$0(str, escape_char, on); + return caml_call2(Base_Option[21], _T_, _S_); + } + function lsplit2_exn$0(str, on, escape_char){ + return split_at(str, index_exn$1(str, escape_char, on)); + } + function rsplit2_exn$0(str, on, escape_char){ + return split_at(str, rindex_exn$0(str, escape_char, on)); + } + function last_non_drop_literal(drop, escape_char, t){ + return rfindi + (0, + t, + function(i, c){ + var _P_ = 1 - caml_call1(drop, c); + if(_P_) + var _Q_ = _P_; + else{ + var _R_ = is_char_escaping(t, escape_char, i); + if(! _R_) return is_char_escaped(t, escape_char, i); + var _Q_ = _R_; + } + return _Q_; + }); + } + function first_non_drop_literal(drop, escape_char, t){ + return lfindi + (0, + t, + function(i, c){ + var _M_ = 1 - caml_call1(drop, c); + if(_M_) + var _N_ = _M_; + else{ + var _O_ = is_char_escaping(t, escape_char, i); + if(! _O_) return is_char_escaped(t, escape_char, i); + var _N_ = _O_; + } + return _N_; + }); + } + function rstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = last_non_drop_literal(drop, escape_char, t); + if(! match) return cst$8; + var i = match[1]; + return i === caml_call2(Base_Import[93], caml_ml_string_length(t), 1) + ? t + : prefix(t, caml_call2(Base_Import[91], i, 1)); + } + function lstrip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$9; + var n = match[1]; + return 0 === n ? t : drop_prefix(t, n); + } + function strip_literal(opt, t, escape_char){ + if(opt) var sth = opt[1], drop = sth; else var drop = Base_Char[42]; + var length = caml_ml_string_length(t); + if(0 !== length){ + var switch$0 = 0; + if + (! + caml_call1(drop, caml_string_get(t, 0)) + && + ! + caml_call1 + (drop, caml_string_get(t, caml_call2(Base_Import[93], length, 1)))) + switch$0 = 1; + if(! switch$0){ + var match = first_non_drop_literal(drop, escape_char, t); + if(! match) return cst$10; + var + first = match[1], + match$0 = last_non_drop_literal(drop, escape_char, t); + if(! match$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var last = match$0[1], _L_ = caml_call2(Base_Import[93], last, first); + return sub(t, first, caml_call2(Base_Import[91], _L_, 1)); + } + } + return t; + } + function between$0(t, low, high){ + var _K_ = caml_call2(Base_Import[109][2], low, t); + return _K_ ? caml_call2(Base_Import[109][2], t, high) : _K_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[109][1], t, min) + ? min + : caml_call2(Base_Import[109][2], t, max) ? t : max; + } + function clamp_exn$0(t, min, max){ + if(caml_call2(Base_Import[109][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + } + function clamp$0(t, min, max){ + if(! caml_call2(Base_Import[109][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _H_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _I_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _H_], + _J_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _I_); + return caml_call1(Base_Or_error[35], _J_); + } + function create$0(opt, pattern){ + if(opt) + var sth = opt[1], case_sensitive = sth; + else + var case_sensitive = 1; + return create(pattern, case_sensitive); + } + var + include$1 = Base_Import[109], + symbol$6 = include$1[1], + symbol$7 = include$1[2], + symbol$8 = include$1[3], + symbol$9 = include$1[4], + symbol$10 = include$1[5], + symbol$11 = include$1[6], + ascending$0 = include$1[7], + descending$0 = include$1[8], + compare$2 = include$1[9], + equal$1 = include$1[10], + max$0 = include$1[11], + min$0 = include$1[12], + Base_String = + [0, + t_sexp_grammar, + sub, + subo, + mem, + is_empty, + iter, + fold, + fold_result, + fold_until, + exists, + for_all, + count, + sum, + find, + find_map, + to_list, + to_array, + min_elt, + max_elt, + iteri, + existsi, + for_alli, + counti, + findi, + find_mapi, + hash_fold_t, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$11, + symbol$7, + symbol$9, + symbol$10, + symbol$6, + symbol$8, + compare$2, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator, + pp, + hashable, + invariant, + max_length, + make, + copy, + init, + symbol, + concat, + escaped, + contains, + uppercase, + lowercase, + capitalize, + uncapitalize, + [0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$2, + t_sexp_grammar$0, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal$0, + compare$1, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator$0, + is_suffix, + is_prefix, + is_substring$0, + is_substring_at, + substr_index$0, + substr_index_exn$0, + substr_index_all$0, + substr_replace_first$0, + substr_replace_all$0], + index, + index_exn, + index_from, + index_from_exn, + rindex, + rindex_exn, + rindex_from, + rindex_from_exn, + [0, + sexp_of_t$0, + create$0, + pattern, + case_sensitive, + matches, + index$0, + index_exn$0, + index_all, + replace_first, + replace_all, + split_on, + Private], + substr_index, + substr_index_exn, + substr_index_all, + substr_replace_first, + substr_replace_all, + is_substring, + is_substring_at$0, + to_list_rev, + rev, + is_suffix$0, + is_prefix$0, + lsplit2_exn, + rsplit2_exn, + lsplit2, + rsplit2, + split, + split_on_chars, + split_lines, + lfindi, + rfindi, + lstrip, + rstrip, + strip, + map, + mapi, + foldi, + concat_map, + filter, + filteri, + tr, + tr_multi, + chop_suffix_exn, + chop_prefix_exn, + chop_suffix, + chop_prefix, + chop_suffix_if_exists, + chop_prefix_if_exists, + suffix, + prefix, + drop_suffix, + drop_prefix, + common_suffix, + common_prefix, + common_suffix_length, + common_prefix_length, + common_suffix2, + common_prefix2, + common_suffix2_length, + common_prefix2_length, + concat_array, + equal$1, + of_char, + of_char_list, + [0, + escape_gen_exn, + escape_gen, + escape, + unescape_gen_exn, + unescape_gen, + unescape, + is_char_escaping, + is_char_escaped, + is_char_literal, + index$1, + index_exn$1, + rindex$0, + rindex_exn$0, + index_from$0, + index_from_exn$0, + rindex_from$0, + rindex_from_exn$0, + split$0, + split_on_chars$0, + lsplit2$0, + lsplit2_exn$0, + rsplit2$0, + rsplit2_exn$0, + lstrip_literal, + rstrip_literal, + strip_literal]]; + runtime.caml_register_global(86, Base_String, "Base__String"); + return; + } + (globalThis)); + +//# 17841 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_bytes_get = runtime.caml_bytes_get, + caml_bytes_set = runtime.caml_bytes_set, + caml_bytes_unsafe_get = runtime.caml_bytes_unsafe_get, + caml_bytes_unsafe_set = runtime.caml_bytes_unsafe_set, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_bytes_length = runtime.caml_ml_bytes_length, + caml_ml_string_length = runtime.caml_ml_string_length; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + module_name = "Base.Bytes", + Base_Char = global_data.Base__Char, + Base_Import = global_data.Base__Import, + Base_Ordered_collection_common = + global_data.Base__Ordered_collection_common, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Bytes_tr = global_data.Base__Bytes_tr, + Base_Array0 = global_data.Base__Array0, + Base_List = global_data.Base__List, + Base_Printf = global_data.Base__Printf, + Stdlib_Format = global_data.Stdlib__Format, + Base_Staged = global_data.Base__Staged, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Blit = global_data.Base__Blit, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + stage = Base_Staged[1], + t_of_sexp = Base_Import[164], + sexp_of_t = Base_Import[140], + t_sexp_grammar = Base_Import[184], + max_length = Base_Bytes0[2], + compare = Base_Bytes0[5], + copy = Base_Bytes0[6], + create = Base_Bytes0[7], + fill = Base_Bytes0[8], + make = Base_Bytes0[9], + map = Base_Bytes0[10], + mapi = Base_Bytes0[11], + unsafe_blit = Base_Bytes0[13], + to_string = Base_Bytes0[14], + of_string = Base_Bytes0[15], + unsafe_to_string = Base_Bytes0[16], + unsafe_of_string_promise_no_mu = Base_Bytes0[17], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _c_ = [0, "src/bytes.ml", 128, 2], + cst_tr_multi_replacement_is_th = + "tr_multi: replacement is the empty string", + _b_ = [0, [11, "Bytes.init ", [4, 0, 0, 0, 0]], "Bytes.init %d"], + _a_ = [0, [3, 0, 0], "%S"]; + function pp(fmt, t){ + var _y_ = caml_call1(to_string, t); + return caml_call3(Stdlib_Format[135], fmt, _a_, _y_); + } + function create$0(len){return caml_call1(create, len);} + var + To_bytes = + caml_call1 + (Base_Blit[1], [0, caml_ml_bytes_length, create$0, unsafe_blit]), + blit = To_bytes[1], + blito = To_bytes[2], + unsafe_blit$0 = To_bytes[3], + sub = To_bytes[4], + subo = To_bytes[5], + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + include = caml_call1(Base_Pretty_printer[3], [0, pp, module_name]), + pp$0 = include[1], + To_string = caml_call1(caml_call1(Base_Blit[3], [0]), To_bytes); + function create$1(len){return caml_call1(create, len);} + var + length = caml_ml_bytes_length, + unsafe_blit$1 = runtime.caml_blit_string, + length$0 = caml_ml_string_length, + From_string = + caml_call1 + (caml_call1(Base_Blit[2], [0, length$0]), + [0, length, create$1, unsafe_blit$1]); + function invariant(param){return 0;} + function init(n, f){ + if(n < 0) caml_call3(Base_Printf[7], _b_, n, 0); + var + t = caml_call1(create, n), + _w_ = caml_call2(Base_Import[93], n, 1), + _v_ = 0; + if(_w_ >= 0){ + var i = _v_; + for(;;){ + caml_bytes_unsafe_set(t, i, caml_call1(f, i)); + var _x_ = i + 1 | 0; + if(_w_ !== i){var i = _x_; continue;} + break; + } + } + return t; + } + function of_char_list(l){ + var t = caml_call1(create, caml_call1(Base_List[7], l)); + function _u_(i, c){return caml_bytes_set(t, i, c);} + caml_call2(Base_List[98], l, _u_); + return t; + } + function to_list(t){ + var + i$1 = caml_call2(Base_Import[93], caml_ml_bytes_length(t), 1), + i = i$1, + acc = 0; + for(;;){ + if(0 > i) return acc; + var + acc$0 = [0, caml_bytes_unsafe_get(t, i), acc], + i$0 = caml_call2(Base_Import[93], i, 1), + i = i$0, + acc = acc$0; + } + } + function to_array(t){ + function _t_(i){return caml_bytes_unsafe_get(t, i);} + return caml_call2(Base_Array0[11], caml_ml_bytes_length(t), _t_); + } + function map$0(t, f){return caml_call2(map, f, t);} + function mapi$0(t, f){return caml_call2(mapi, f, t);} + function fold(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call2(f, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function foldi(t, init, f){ + var len = caml_ml_bytes_length(t), pos = 0, acc = init; + for(;;){ + if(pos === len) return acc; + var + acc$0 = caml_call3(f, pos, acc, caml_bytes_unsafe_get(t, pos)), + pos$0 = caml_call2(Base_Import[91], pos, 1), + pos = pos$0, + acc = acc$0; + } + } + function tr(target, replacement, s){ + var + _r_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _q_ = 0; + if(_r_ >= 0){ + var i = _q_; + for(;;){ + if(caml_call2(Base_Char[15], caml_bytes_unsafe_get(s, i), target)) + caml_bytes_unsafe_set(s, i, replacement); + var _s_ = i + 1 | 0; + if(_r_ !== i){var i = _s_; continue;} + break; + } + } + return 0; + } + function tr_multi(target, replacement){ + if(0 === caml_ml_string_length(target)) + return caml_call1(stage, function(_p_){return 0;}); + if(0 === caml_ml_string_length(replacement)) + return caml_call1(Base_Import[126], cst_tr_multi_replacement_is_th); + var match = caml_call2(Base_Bytes_tr[1], target, replacement); + if(! match) return caml_call1(stage, function(_o_){return 0;}); + var tr_map = match[1]; + return caml_call1 + (stage, + function(s){ + var + _m_ = caml_call2(Base_Import[93], caml_ml_bytes_length(s), 1), + _l_ = 0; + if(_m_ >= 0){ + var i = _l_; + for(;;){ + caml_bytes_unsafe_set + (s, + i, + runtime.caml_string_unsafe_get + (tr_map, + caml_call1(Base_Char[29], caml_bytes_unsafe_get(s, i)))); + var _n_ = i + 1 | 0; + if(_m_ !== i){var i = _n_; continue;} + break; + } + } + return 0; + }); + } + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[110][2], low, t); + return _k_ ? caml_call2(Base_Import[110][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[110][1], t, min) + ? min + : caml_call2(Base_Import[110][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[110][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[110][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function contains(pos, len, t, char$0){ + var + match = + caml_call4 + (Base_Ordered_collection_common[1], + pos, + len, + 0, + caml_ml_bytes_length(t)), + len$0 = match[2], + pos$0 = match[1], + last = caml_call2(Base_Import[91], pos$0, len$0), + i = pos$0; + for(;;){ + var _d_ = i < last ? 1 : 0; + if(_d_){ + var + _e_ = caml_bytes_get(t, i), + _f_ = caml_call2(Base_Char[15], _e_, char$0); + if(! _f_){ + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + continue; + } + var _g_ = _f_; + } + else + var _g_ = _d_; + return _g_; + } + } + var + include$0 = Base_Import[110], + symbol = include$0[1], + symbol$0 = include$0[2], + symbol$1 = include$0[3], + symbol$2 = include$0[4], + symbol$3 = include$0[5], + symbol$4 = include$0[6], + ascending = include$0[7], + descending = include$0[8], + compare$0 = include$0[9], + equal = include$0[10], + max = include$0[11], + min = include$0[12], + Base_Bytes = + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + blit, + blito, + unsafe_blit$0, + sub, + subo, + symbol$4, + symbol$0, + symbol$2, + symbol$3, + symbol, + symbol$1, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + of_string, + to_string, + pp$0, + invariant, + To_string, + From_string, + create, + make, + map$0, + mapi$0, + copy, + init, + of_char_list, + caml_bytes_get, + caml_bytes_set, + fill, + tr, + tr_multi, + to_list, + to_array, + fold, + foldi, + contains, + max_length, + unsafe_to_string, + unsafe_of_string_promise_no_mu]; + runtime.caml_register_global(24, Base_Bytes, "Base__Bytes"); + return; + } + (globalThis)); + +//# 18184 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst = ""; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + ocaml_lex_tables = + [0, + "\0\0\0\0\x01\0\x01\0\x02\0\x1b\0R\0i\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\x01\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + "\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\x02\0\0\0\0\0\x01\0\x03\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\0\0\0\0\x06\0\x04\0\0\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\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\x06\0\x04\0\x05\0\0\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\0\0\0\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\x07\0\0\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\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\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\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\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\0\0\x02\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\xff\xff\xff\xff\x01\0\x03\0\xff\xff\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\xff\xff\x04\0\x04\0\x04\0\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\x03\0\x05\0\xff\xff\x05\0\x05\0\x05\0\x05\0\x05\0\x05\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\x06\0\x06\0\x06\0\x06\0\x06\0\x06\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\xff\xff\x07\0\x07\0\x07\0\x07\0\x07\0\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + cst, + cst, + cst, + cst, + cst, + cst], + Stdlib_Lexing = global_data.Stdlib__Lexing; + function parse_hex(lexbuf){ + var ocaml_lex_state = 0; + for(;;){ + var + ocaml_lex_state$0 = + caml_call3 + (Stdlib_Lexing[20], ocaml_lex_tables, ocaml_lex_state, lexbuf); + if(0 === ocaml_lex_state$0){ + var + body = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 3 | 0, lexbuf[6]); + return [0, body]; + } + if(1 === ocaml_lex_state$0){ + var + body$0 = + caml_call3(Stdlib_Lexing[16], lexbuf, lexbuf[5] + 2 | 0, lexbuf[6]); + return [1, body$0]; + } + caml_call1(lexbuf[1], lexbuf); + var ocaml_lex_state = ocaml_lex_state$0; + } + } + var Base_Hex_lexer = [0, parse_hex]; + runtime.caml_register_global(2, Base_Hex_lexer, "Base__Hex_lexer"); + return; + } + (globalThis)); + +//# 18245 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_int$3 = "int", + cst_int32$3 = "int32", + cst_int64$3 = "int64", + cst_nativeint$2 = "nativeint", + cst_src_int_conversions_ml = "src/int_conversions.ml", + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Hex_lexer = global_data.Base__Hex_lexer, + Stdlib_Lexing = global_data.Stdlib__Lexing, + Base_Option = global_data.Base__Option, + Base_Char = global_data.Base__Char, + Base_String = global_data.Base__String, + Base_Printf = global_data.Base__Printf, + Base_Import = global_data.Base__Import, + Sexplib0_Sexp_grammar = global_data.Sexplib0__Sexp_grammar, + Base_Sexpable = global_data.Base__Sexpable, + Base_Bytes = global_data.Base__Bytes, + Base_Sys0 = global_data.Base__Sys0, + Base_Word_size = global_data.Base__Word_size, + Assert_failure = global_data.Assert_failure, + Stdlib_Int32 = global_data.Stdlib__Int32, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Int0 = global_data.Base__Int0, + Base_Sexp = global_data.Base__Sexp, + _g_ = + [0, + [2, 0, [11, ".of_string: invalid input ", [3, 0, 0]]], + "%s.of_string: invalid input %S"], + cst_0x = "-0x", + cst_0x$0 = "0x", + cst_int63 = "int63", + cst_int64$2 = cst_int64$3, + cst_nativeint$1 = cst_nativeint$2, + cst_int64$1 = cst_int64$3, + cst_int32$2 = cst_int32$3, + cst_nativeint$0 = cst_nativeint$2, + cst_int32$1 = cst_int32$3, + cst_int64$0 = cst_int64$3, + cst_int$2 = cst_int$3, + cst_nativeint = cst_nativeint$2, + cst_int$1 = cst_int$3, + cst_int64 = cst_int64$3, + cst_int$0 = cst_int$3, + cst_int32$0 = cst_int32$3, + cst_int32 = cst_int32$3, + cst_int = cst_int$3, + _a_ = + [0, + [11, + "conversion from ", + [2, + 0, + [11, + " to ", + [2, 0, [11, " failed: ", [2, 0, [11, " is out of range", 0]]]]]]], + "conversion from %s to %s failed: %s is out of range"], + _m_ = [0, cst_src_int_conversions_ml, 19, 9], + _l_ = [0, cst_src_int_conversions_ml, 75, 9], + _k_ = [0, cst_src_int_conversions_ml, 96, 9], + _j_ = [0, cst_src_int_conversions_ml, 148, 9], + _i_ = [0, cst_src_int_conversions_ml, 176, 9]; + function convert_failure(x, a, b, to_string){ + var _S_ = caml_call1(to_string, x); + return caml_call5(Base_Printf[6], _a_, a, b, _S_, 0); + } + var + num_bits_int = Base_Sys0[8], + num_bits_nativeint = caml_call1(Base_Word_size[2], Base_Word_size[3]), + num_bits_int32 = 32, + num_bits_int64 = 64; + if(63 !== num_bits_int && 31 !== num_bits_int && 32 !== num_bits_int) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + var + min_int32 = Stdlib_Int32[10], + max_int32 = Stdlib_Int32[9], + min_int64 = Stdlib_Int64[10], + max_int64 = Stdlib_Int64[9], + min_nativeint = Stdlib_Nativeint[11], + max_nativeint = Stdlib_Nativeint[10], + int64_to_string = Stdlib_Int64[14], + nativeint_to_string = Stdlib_Nativeint[15], + _b_ = Base_Import[85][32], + _c_ = Stdlib_Int32[14]; + function int32_to_int_trunc(_R_){return _R_;} + function int_to_int32_trunc(_Q_){return _Q_;} + var + int_is_representable_as_int32 = + num_bits_int <= 32 + ? function(param){return 1;} + : function + (x){ + var + _O_ = caml_call2(Base_Import[229], min_int32, x) <= 0 ? 1 : 0, + _P_ = + _O_ + ? caml_call2(Base_Import[229], x, max_int32) <= 0 ? 1 : 0 + : _O_; + return _P_; + }; + if(32 <= num_bits_int) + var _d_ = function(param){return 1;}; + else + var + min$4 = Base_Int0[6], + max$4 = Base_Int0[5], + _d_ = + function(x){ + var + _M_ = caml_call2(Base_Import[230], min$4, x) <= 0 ? 1 : 0, + _N_ = _M_ ? caml_call2(Base_Import[230], x, max$4) <= 0 ? 1 : 0 : _M_; + return _N_; + }; + function int_to_int32(x){ + return int_is_representable_as_int32(x) ? [0, x] : 0; + } + function int32_to_int(x){return _d_(x) ? [0, x] : 0;} + function int_to_int32_exn(x){ + return int_is_representable_as_int32(x) + ? x + : convert_failure(x, cst_int, cst_int32, _b_); + } + function int32_to_int_exn(x){ + return _d_(x) ? x : convert_failure(x, cst_int32$0, cst_int$0, _c_); + } + if(num_bits_int >= 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + int_to_int64 = caml_int64_of_int32, + int64_to_int_trunc = caml_int64_to_int32, + min = caml_int64_of_int32(Base_Int0[6]), + max = caml_int64_of_int32(Base_Int0[5]); + function int64_is_representable_as_int(x){ + var + _K_ = caml_call2(Base_Import[231], min, x) <= 0 ? 1 : 0, + _L_ = _K_ ? caml_call2(Base_Import[231], x, max) <= 0 ? 1 : 0 : _K_; + return _L_; + } + function int64_to_int(x){ + return int64_is_representable_as_int(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int_exn(x){ + return int64_is_representable_as_int(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64, cst_int$1, int64_to_string); + } + if(num_bits_int > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + function int_to_nativeint(_J_){return _J_;} + function nativeint_to_int_trunc(_I_){return _I_;} + if(num_bits_nativeint <= num_bits_int) + var _e_ = function(param){return 1;}; + else + var + min$3 = Base_Int0[6], + max$3 = Base_Int0[5], + _e_ = + function(x){ + var + _G_ = caml_call2(Base_Import[232], min$3, x) <= 0 ? 1 : 0, + _H_ = _G_ ? caml_call2(Base_Import[232], x, max$3) <= 0 ? 1 : 0 : _G_; + return _H_; + }; + function nativeint_to_int(x){return _e_(x) ? [0, x] : 0;} + function nativeint_to_int_exn(x){ + return _e_(x) + ? x + : convert_failure + (x, cst_nativeint, cst_int$2, nativeint_to_string); + } + var + int32_to_int64 = caml_int64_of_int32, + int64_to_int32_trunc = caml_int64_to_int32, + min$0 = caml_int64_of_int32(min_int32), + max$0 = caml_int64_of_int32(max_int32); + function int64_is_representable_as_int3(x){ + var + _E_ = caml_call2(Base_Import[231], min$0, x) <= 0 ? 1 : 0, + _F_ = _E_ ? caml_call2(Base_Import[231], x, max$0) <= 0 ? 1 : 0 : _E_; + return _F_; + } + function int64_to_int32(x){ + return int64_is_representable_as_int3(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_int32_exn(x){ + return int64_is_representable_as_int3(x) + ? caml_int64_to_int32(x) + : convert_failure(x, cst_int64$0, cst_int32$1, int64_to_string); + } + if(32 > num_bits_nativeint) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + function int32_to_nativeint(_D_){return _D_;} + function nativeint_to_int32_trunc(_C_){return _C_;} + var + _f_ = + num_bits_nativeint <= 32 + ? function(param){return 1;} + : function + (x){ + var + _A_ = caml_call2(Base_Import[232], min_int32, x) <= 0 ? 1 : 0, + _B_ = + _A_ + ? caml_call2(Base_Import[232], x, max_int32) <= 0 ? 1 : 0 + : _A_; + return _B_; + }; + function nativeint_to_int32(x){return _f_(x) ? [0, x] : 0;} + function nativeint_to_int32_exn(x){ + return _f_(x) + ? x + : convert_failure + (x, cst_nativeint$0, cst_int32$2, nativeint_to_string); + } + if(num_bits_nativeint > 64) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var + int64_to_nativeint_trunc = caml_int64_to_int32, + nativeint_to_int64 = caml_int64_of_int32; + if(64 <= num_bits_nativeint) + var int64_is_representable_as_nati = function(param){return 1;}; + else + var + min$2 = caml_int64_of_int32(min_nativeint), + max$2 = caml_int64_of_int32(max_nativeint), + int64_is_representable_as_nati = + function(x){ + var + _y_ = caml_call2(Base_Import[231], min$2, x) <= 0 ? 1 : 0, + _z_ = _y_ ? caml_call2(Base_Import[231], x, max$2) <= 0 ? 1 : 0 : _y_; + return _z_; + }; + function int64_to_nativeint(x){ + return int64_is_representable_as_nati(x) ? [0, caml_int64_to_int32(x)] : 0; + } + function int64_to_nativeint_exn(x){ + return int64_is_representable_as_nati(x) + ? caml_int64_to_int32(x) + : convert_failure + (x, cst_int64$1, cst_nativeint$1, int64_to_string); + } + var + min$1 = caml_int64_shift_right(min_int64, 1), + max$1 = caml_int64_shift_right(max_int64, 1); + function int64_is_representable_as_int6(x){ + var + _w_ = caml_call2(Base_Import[231], min$1, x) <= 0 ? 1 : 0, + _x_ = _w_ ? caml_call2(Base_Import[231], x, max$1) <= 0 ? 1 : 0 : _w_; + return _x_; + } + function int64_fit_on_int63_exn(x){ + return int64_is_representable_as_int6(x) + ? 0 + : convert_failure(x, cst_int64$2, cst_int63, int64_to_string); + } + function insert_delimiter_every(input, delimiter, chars_per_delimiter){ + var input_length = runtime.caml_ml_string_length(input); + if(input_length <= chars_per_delimiter) return input; + var match = caml_string_get(input, 0), switch$0 = 0; + if(43 !== match && 45 !== match){var has_sign = 0; switch$0 = 1;} + if(! switch$0) var has_sign = 1; + var + num_digits = + has_sign ? caml_call2(Base_Import[93], input_length, 1) : input_length, + _t_ = caml_call2(Base_Import[93], num_digits, 1), + num_delimiters = caml_call2(Base_Import[95], _t_, chars_per_delimiter), + output_length = caml_call2(Base_Import[91], input_length, num_delimiters), + output = caml_call1(Base_Bytes[31], output_length), + input_pos = [0, caml_call2(Base_Import[93], input_length, 1)], + output_pos = [0, caml_call2(Base_Import[93], output_length, 1)], + num_chars_until_delimiter = [0, chars_per_delimiter], + first_digit_pos = has_sign ? 1 : 0; + for(;;){ + if(first_digit_pos <= input_pos[1]){ + if(0 === num_chars_until_delimiter[1]){ + caml_call3(Base_Bytes[39], output, output_pos[1], delimiter); + caml_call1(Base_Import[129], output_pos); + num_chars_until_delimiter[1] = chars_per_delimiter; + } + var _u_ = caml_string_get(input, input_pos[1]); + caml_call3(Base_Bytes[39], output, output_pos[1], _u_); + caml_call1(Base_Import[129], input_pos); + caml_call1(Base_Import[129], output_pos); + caml_call1(Base_Import[129], num_chars_until_delimiter); + continue; + } + if(has_sign){ + var _v_ = caml_string_get(input, 0); + caml_call3(Base_Bytes[39], output, 0, _v_); + } + return caml_call1(Base_Bytes[49], output); + } + } + function insert_delimiter(input, delimiter){ + return insert_delimiter_every(input, delimiter, 3); + } + function insert_underscores(input){return insert_delimiter(input, 95);} + var sexp_of_int_style = Base_Sexp[19]; + function _h_(I){ + var compare = I[1], hash_fold_t = I[2], func = I[3]; + function hash(x){return caml_call1(func, x);} + var chars_per_delimiter = 4; + function to_string(delimiter, t){ + if(delimiter) + var + delimiter$0 = delimiter[1], + make_suffix = + function(t){ + return insert_delimiter_every + (caml_call1(I[4], t), delimiter$0, chars_per_delimiter); + }; + else + var make_suffix = I[4]; + if(caml_call2(I[7], t, I[6])){ + var _r_ = caml_call1(make_suffix, caml_call1(I[8], t)); + return caml_call2(Base_Import[112], cst_0x, _r_); + } + var _s_ = caml_call1(make_suffix, t); + return caml_call2(Base_Import[112], cst_0x$0, _s_); + } + function to_string$0(t){return to_string(0, t);} + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return to_string([0, delimiter], t); + } + function invalid(str){ + return caml_call4(Base_Printf[6], _g_, I[9], str, 0); + } + function of_string_with_delimiter(str){ + function _p_(c){return caml_call2(Base_Char[14], c, 95);} + var _q_ = caml_call2(Base_String[98], str, _p_); + return caml_call1(I[5], _q_); + } + function of_string(str){ + var lex = caml_call2(Stdlib_Lexing[3], 0, str); + function _n_(param){return caml_call1(Base_Hex_lexer[1], lex);} + var result = caml_call1(Base_Option[44], _n_); + if(lex[6] !== lex[3]) return invalid(str); + if(! result) return invalid(str); + var match = result[1]; + if(0 === match[0]){ + var body = match[1], _o_ = of_string_with_delimiter(body); + return caml_call1(I[8], _o_); + } + var body$0 = match[1]; + return of_string_with_delimiter(body$0); + } + var + t_sexp_grammar = caml_call1(Sexplib0_Sexp_grammar[1], Base_String[1]), + include = caml_call1(Base_Sexpable[5], [0, of_string, to_string$0]), + t_of_sexp = include[1], + sexp_of_t = include[2]; + return [0, + [0, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + compare, + hash_fold_t, + hash, + of_string, + to_string$0, + to_string_hum]]; + } + var + Base_Int_conversions = + [0, + int_to_int32, + int_to_int32_exn, + int_to_int32_trunc, + int_to_int64, + int_to_nativeint, + int32_to_int, + int32_to_int_exn, + int32_to_int_trunc, + int32_to_int64, + int32_to_nativeint, + int64_to_int, + int64_to_int_exn, + int64_to_int_trunc, + int64_to_int32, + int64_to_int32_exn, + int64_to_int32_trunc, + int64_to_nativeint, + int64_to_nativeint_exn, + int64_to_nativeint_trunc, + int64_fit_on_int63_exn, + int64_is_representable_as_int6, + nativeint_to_int, + nativeint_to_int_exn, + nativeint_to_int_trunc, + nativeint_to_int32, + nativeint_to_int32_exn, + nativeint_to_int32_trunc, + nativeint_to_int64, + num_bits_int, + num_bits_int32, + num_bits_int64, + num_bits_nativeint, + function(I){ + var chars_per_delimiter = 3; + function to_string_hum(opt, t){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + return insert_delimiter_every + (caml_call1(I[1], t), delimiter, chars_per_delimiter); + } + function sexp_of_t(t){ + var + s = caml_call1(I[1], t), + s$0 = + 1009018843 <= sexp_of_int_style[1] + ? s + : insert_delimiter_every(s, 95, chars_per_delimiter); + return [0, s$0]; + } + return [0, to_string_hum, sexp_of_t]; + }, + _h_, + sexp_of_int_style, + insert_delimiter_every, + insert_delimiter, + insert_underscores]; + runtime.caml_register_global + (44, Base_Int_conversions, "Base__Int_conversions"); + return; + } + (globalThis)); + +//# 18718 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_Int_intf = [0]; + runtime.caml_register_global(0, Base_Int_intf, "Base__Int_intf"); + return; + } + (globalThis)); + +//# 18728 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + overflow_bound_max_int63_on_in = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + overflow_bound_max_int64_value = + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + Base_Import = global_data.Base__Import, + Base_Int_conversions = global_data.Base__Int_conversions, + Assert_failure = global_data.Assert_failure, + Base_Array0 = global_data.Base__Array0, + int32_positive_overflow_bounds = + [0, + 2147483647, + 2147483647, + 46340, + 1290, + 215, + 73, + 35, + 21, + 14, + 10, + 8, + 7, + 5, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1].slice + (), + overflow_bound_max_int_value = caml_call2(Base_Import[120], -1, 1), + switcher = Base_Int_conversions[29] - 31 | 0, + _g_ = [0, "src/pow_overflow_bounds.ml", 218, 9], + _a_ = runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _c_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + _i_ = + [0, + 1073741823, + 1073741823, + 32767, + 1023, + 181, + 63, + 31, + 19, + 13, + 10, + 7, + 6, + 5, + 4, + 4, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1], + _d_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 16383), + runtime.caml_int64_create_lo_mi_hi(16777215, 127, 0), + runtime.caml_int64_create_lo_mi_hi(1664510, 0, 0), + runtime.caml_int64_create_lo_mi_hi(46340, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5404, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1290, 0, 0), + runtime.caml_int64_create_lo_mi_hi(463, 0, 0), + runtime.caml_int64_create_lo_mi_hi(215, 0, 0), + runtime.caml_int64_create_lo_mi_hi(118, 0, 0), + runtime.caml_int64_create_lo_mi_hi(73, 0, 0), + runtime.caml_int64_create_lo_mi_hi(49, 0, 0), + runtime.caml_int64_create_lo_mi_hi(35, 0, 0), + runtime.caml_int64_create_lo_mi_hi(27, 0, 0), + runtime.caml_int64_create_lo_mi_hi(21, 0, 0), + runtime.caml_int64_create_lo_mi_hi(17, 0, 0), + runtime.caml_int64_create_lo_mi_hi(14, 0, 0), + runtime.caml_int64_create_lo_mi_hi(12, 0, 0), + runtime.caml_int64_create_lo_mi_hi(10, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _e_ = + [0, + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 32767), + runtime.caml_int64_create_lo_mi_hi(324403, 181, 0), + runtime.caml_int64_create_lo_mi_hi(2097151, 0, 0), + runtime.caml_int64_create_lo_mi_hi(55108, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6208, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1448, 0, 0), + runtime.caml_int64_create_lo_mi_hi(511, 0, 0), + runtime.caml_int64_create_lo_mi_hi(234, 0, 0), + runtime.caml_int64_create_lo_mi_hi(127, 0, 0), + runtime.caml_int64_create_lo_mi_hi(78, 0, 0), + runtime.caml_int64_create_lo_mi_hi(52, 0, 0), + runtime.caml_int64_create_lo_mi_hi(38, 0, 0), + runtime.caml_int64_create_lo_mi_hi(28, 0, 0), + runtime.caml_int64_create_lo_mi_hi(22, 0, 0), + runtime.caml_int64_create_lo_mi_hi(18, 0, 0), + runtime.caml_int64_create_lo_mi_hi(15, 0, 0), + runtime.caml_int64_create_lo_mi_hi(13, 0, 0), + runtime.caml_int64_create_lo_mi_hi(11, 0, 0), + runtime.caml_int64_create_lo_mi_hi(9, 0, 0), + runtime.caml_int64_create_lo_mi_hi(8, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(7, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(6, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(5, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(4, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(3, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + runtime.caml_int64_create_lo_mi_hi(1, 0, 0)], + _f_ = + [0, + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(1, 0, 32768), + runtime.caml_int64_create_lo_mi_hi(16452813, 16777034, 65535), + runtime.caml_int64_create_lo_mi_hi(14680065, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16722108, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16771008, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16775768, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776705, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16776982, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777089, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777138, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777164, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777178, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777188, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777194, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777198, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777201, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777203, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777205, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777207, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777208, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777209, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777210, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777211, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777212, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777213, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535)], + overflow_bound_max_int32_value = 2147483647; + if(1 < switcher >>> 0){ + if(32 !== switcher) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var + int_positive_overflow_bounds = + [0, + caml_int64_to_int32(_c_), + caml_int64_to_int32(_b_), + caml_int64_to_int32(_a_), + 1664510, + 46340, + 5404, + 1290, + 463, + 215, + 118, + 73, + 49, + 35, + 27, + 21, + 17, + 14, + 12, + 10, + 9, + 8, + 7, + 7, + 6, + 5, + 5, + 5, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 1, + 1]; + } + else if(switcher) + var + _h_ = function(_j_){return _j_;}, + int_positive_overflow_bounds = + caml_call2(Base_Array0[20], int32_positive_overflow_bounds, _h_); + else + var int_positive_overflow_bounds = _i_.slice(); + var + int63_on_int64_positive_overfl = _d_.slice(), + int64_positive_overflow_bounds = _e_.slice(), + int64_negative_overflow_bounds = _f_.slice(), + Base_Pow_overflow_bounds = + [0, + overflow_bound_max_int32_value, + int32_positive_overflow_bounds, + overflow_bound_max_int_value, + int_positive_overflow_bounds, + overflow_bound_max_int63_on_in, + int63_on_int64_positive_overfl, + overflow_bound_max_int64_value, + int64_positive_overflow_bounds, + int64_negative_overflow_bounds]; + runtime.caml_register_global + (16, Base_Pow_overflow_bounds, "Base__Pow_overflow_bounds"); + return; + } + (globalThis)); + +//# 19189 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_exponent_can_not_be_negati = "exponent can not be negative", + cst_integer_overflow_in_pow = "integer overflow in pow", + caml_check_bound = runtime.caml_check_bound, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_lessthan = runtime.caml_lessthan; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Pow_overflow_bounds = global_data.Base__Pow_overflow_bounds, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + invalid_argf = Base_Printf[7], + _m_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _l_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + _i_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _j_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _k_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _d_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0), + _h_ = runtime.caml_int64_create_lo_mi_hi(16777215, 16777215, 65535), + _e_ = runtime.caml_int64_create_lo_mi_hi(63, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _b_ = + [0, [11, cst_integer_overflow_in_pow, 0], cst_integer_overflow_in_pow], + _a_ = + [0, + [11, cst_exponent_can_not_be_negati, 0], + cst_exponent_can_not_be_negati]; + function negative_exponent(param){ + return caml_call2(Base_Printf[7], _a_, 0); + } + function overflow(param){return caml_call2(Base_Printf[7], _b_, 0);} + function int_pow(base, exponent){ + if(exponent < 0) negative_exponent(0); + var _J_ = 1 < caml_call1(Base_Import[123], base) ? 1 : 0; + if(_J_){ + var _K_ = 63 < exponent ? 1 : 0; + if(_K_) + var _L_ = _K_; + else + var + _M_ = + caml_check_bound(Base_Pow_overflow_bounds[4], exponent)[1 + exponent], + _L_ = _M_ < caml_call1(Base_Import[123], base) ? 1 : 0; + } + else + var _L_ = _J_; + if(_L_) overflow(0); + return runtime.Base_int_math_int_pow_stub(base, exponent); + } + var abs = Stdlib_Int64[8]; + function int64_pow(base, exponent){ + if(caml_lessthan(exponent, _c_)) negative_exponent(0); + var + _A_ = caml_greaterthan(base, _d_), + _B_ = _A_ || caml_lessthan(base, _h_); + if(_B_){ + var _C_ = caml_greaterthan(exponent, _e_); + if(_C_) + var _D_ = _C_; + else{ + var _E_ = runtime.caml_greaterequal(base, _f_); + if(_E_) + var + _F_ = caml_int64_to_int32(exponent), + _G_ = + caml_greaterthan + (base, caml_check_bound(Base_Pow_overflow_bounds[8], _F_)[1 + _F_]); + else + var _G_ = _E_; + if(_G_) + var _D_ = _G_; + else{ + var _H_ = caml_lessthan(base, _g_); + if(_H_) + var + _I_ = caml_int64_to_int32(exponent), + _D_ = + caml_lessthan + (base, + caml_check_bound(Base_Pow_overflow_bounds[9], _I_)[1 + _I_]); + else + var _D_ = _H_; + } + } + } + else + var _D_ = _B_; + if(_D_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + function int63_pow_on_int64(base, exponent){ + if(caml_lessthan(exponent, _i_)) negative_exponent(0); + var _v_ = caml_greaterthan(caml_call1(abs, base), _j_); + if(_v_){ + var _w_ = caml_greaterthan(exponent, _k_); + if(_w_) + var _x_ = _w_; + else + var + _y_ = caml_int64_to_int32(exponent), + _z_ = caml_check_bound(Base_Pow_overflow_bounds[6], _y_)[1 + _y_], + _x_ = caml_greaterthan(caml_call1(abs, base), _z_); + } + else + var _x_ = _v_; + if(_x_) overflow(0); + return runtime.Base_int_math_int64_pow_stub(base, exponent); + } + var + Private = [0, int_pow, int64_pow, int63_pow_on_int64], + Base_Int_math = + [0, + function(X){ + function symbol(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _u_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _l_, caml_call1(X[4], x), _u_, 0); + } + var rval = caml_call2(X[20], x, y); + return caml_call2(X[14], rval, X[18]) + ? caml_call2(X[5], rval, y) + : rval; + } + var one = caml_call1(X[19], 1); + function symbol$0(x, y){ + if(caml_call2(X[11], y, X[18])){ + var _r_ = caml_call1(X[4], y); + caml_call4(invalid_argf, _m_, caml_call1(X[4], x), _r_, 0); + } + if(! caml_call2(X[14], x, X[18])) return caml_call2(X[8], x, y); + var _s_ = caml_call2(X[5], x, one), _t_ = caml_call2(X[8], _s_, y); + return caml_call2(X[6], _t_, one); + } + function symbol$1(x, y){ + var _p_ = caml_call1(X[2], y), _q_ = caml_call1(X[2], x); + return caml_call2(Base_Import[96], _q_, _p_); + } + function round_down(i, modulus){ + var _o_ = symbol(i, modulus); + return caml_call2(X[6], i, _o_); + } + function round_up(i, modulus){ + var remainder = symbol(i, modulus); + if(caml_call2(X[12], remainder, X[18])) return i; + var _n_ = caml_call2(X[5], i, modulus); + return caml_call2(X[6], _n_, remainder); + } + function round_towards_zero(i, to_multiple_of){ + return caml_call2(X[12], i, X[18]) + ? X[18] + : caml_call2 + (X[13], i, X[18]) + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + function round_nearest(i, modulus){ + var + remainder = symbol(i, modulus), + modulus_minus_remainder = caml_call2(X[6], modulus, remainder); + return caml_call2(X[11], modulus_minus_remainder, remainder) + ? caml_call2(X[5], i, modulus_minus_remainder) + : caml_call2(X[6], i, remainder); + } + function round(opt, i, to_multiple_of){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? round_towards_zero(i, to_multiple_of) + : round_nearest(i, to_multiple_of) + : 759637122 + <= dir + ? round_down(i, to_multiple_of) + : round_up(i, to_multiple_of); + } + return [0, + symbol, + symbol$0, + symbol$1, + round, + round_towards_zero, + round_down, + round_up, + round_nearest]; + }, + Private]; + runtime.caml_register_global(17, Base_Int_math, "Base__Int_math"); + return; + } + (globalThis)); + +//# 19427 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + global_data = runtime.caml_get_global_data(), + m1 = runtime.caml_int64_create_lo_mi_hi(5592405, 5592405, 21845), + m2 = runtime.caml_int64_create_lo_mi_hi(3355443, 3355443, 13107), + m4 = runtime.caml_int64_create_lo_mi_hi(986895, 986895, 3855), + h01 = runtime.caml_int64_create_lo_mi_hi(65793, 65793, 257), + mask = runtime.caml_int64_create_lo_mi_hi(16777215, 255, 0), + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Assert_failure = global_data.Assert_failure, + _b_ = [0, "src/popcount.ml", 45, 9]; + function int64_popcount(x){ + var + x$0 = + runtime.caml_int64_sub + (x, caml_int64_and(caml_int64_shift_right_unsigne(x, 1), m1)), + x$1 = + caml_int64_add + (caml_int64_and(x$0, m2), + caml_int64_and(caml_int64_shift_right_unsigne(x$0, 2), m2)), + x$2 = + caml_int64_and + (caml_int64_add(x$1, caml_int64_shift_right_unsigne(x$1, 4)), m4); + return runtime.caml_int64_to_int32 + (caml_int64_shift_right_unsigne + (runtime.caml_int64_mul(x$2, h01), 56)); + } + function int32_popcount(x){ + return int64_popcount(caml_int64_and(caml_int64_of_int32(x), mask)); + } + var _a_ = Stdlib_Nativeint[9]; + if(32 === _a_) + var nativeint_popcount = function(x){return int32_popcount(x);}; + else{ + if(64 !== _a_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + nativeint_popcount = + function(x){return int64_popcount(caml_int64_of_int32(x));}; + } + var + Base_Popcount = + [0, + function(_c_){return runtime.Base_int_math_int_popcount(_c_);}, + int32_popcount, + int64_popcount, + nativeint_popcount]; + runtime.caml_register_global(8, Base_Popcount, "Base__Popcount"); + return; + } + (globalThis)); + +//# 19489 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Import = global_data.Base__Import, + Base_Sign0 = global_data.Base__Sign0, + Base_Identifiable = global_data.Base__Identifiable, + t_sexp_grammar = Base_Sign0[3], + all = Base_Sign0[6], + Replace_polymorphic_compare = Base_Sign0[7], + to_int = Base_Sign0[10], + of_int = Base_Sign0[13], + _a_ = + caml_call1 + (Base_Identifiable[1], + [0, + Base_Sign0[4], + Base_Sign0[5], + Base_Sign0[11], + Base_Sign0[1], + Base_Sign0[2], + Base_Sign0[8], + Base_Sign0[9], + Base_Sign0[12]]), + hash_fold_t = _a_[1], + hash = _a_[2], + t_of_sexp = _a_[3], + sexp_of_t = _a_[4], + of_string = _a_[5], + to_string = _a_[6], + between = _a_[19], + clamp_exn = _a_[20], + clamp = _a_[21], + comparator = _a_[22], + pp = _a_[23], + hashable = _a_[24]; + function to_float(param){ + switch(param){case 0: return -1.;case 1: return 0.;default: return 1.; + } + } + function flip(param){ + switch(param){case 0: return 2;case 1: return 1;default: return 0; + } + } + function symbol(t$0, t){ + var _b_ = caml_call1(to_int, t), _c_ = caml_call1(to_int, t$0); + return caml_call1(of_int, caml_call2(Base_Import[88], _c_, _b_)); + } + var + symbol$0 = Replace_polymorphic_compare[1], + symbol$1 = Replace_polymorphic_compare[2], + symbol$2 = Replace_polymorphic_compare[3], + symbol$3 = Replace_polymorphic_compare[4], + symbol$4 = Replace_polymorphic_compare[5], + symbol$5 = Replace_polymorphic_compare[6], + ascending = Replace_polymorphic_compare[7], + descending = Replace_polymorphic_compare[8], + compare = Replace_polymorphic_compare[9], + equal = Replace_polymorphic_compare[10], + max = Replace_polymorphic_compare[11], + min = Replace_polymorphic_compare[12], + Base_Sign = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$5, + symbol$1, + symbol$3, + symbol$4, + symbol$0, + symbol$2, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + of_int, + to_int, + to_float, + flip, + symbol]; + runtime.caml_register_global(6, Base_Sign, "Base__Sign"); + return; + } + (globalThis)); + +//# 19602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_x = "%x", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_div = runtime.caml_div, + caml_int_compare = runtime.caml_int_compare, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int.Hex", + module_name$0 = "Base.Int", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Float0 = global_data.Base__Float0, + Base_Int0 = global_data.Base__Int0, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Int_math = global_data.Base__Int_math, + Base_Error = global_data.Base__Error, + Base_Sign = global_data.Base__Sign, + Base_Popcount = global_data.Base__Popcount, + to_string = Base_Int0[1], + of_string = Base_Int0[2], + hash_fold_t = Base_Import[207], + func = Base_Import[221], + _u_ = + [0, + [2, + 0, + [11, + " /", + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: divisor should be positive", 0]]]]]], + "%s /%% %s in core_int.ml: divisor should be positive"], + _t_ = + [0, + [2, + 0, + [12, + 32, + [12, + 37, + [12, + 32, + [2, 0, [11, " in core_int.ml: modulus should be positive", 0]]]]]], + "%s %% %s in core_int.ml: modulus should be positive"], + cst_Int_ceil_log2_got_invalid_ = "[Int.ceil_log2] got invalid input", + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + _g_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/int.ml", 108, 2], + _e_ = [0, [4, 6, 0, 0, 0], cst_x], + _d_ = [0, [4, 6, 0, 0, 0], cst_x], + _b_ = + [0, + [11, + "Int.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int.of_float: argument (%f) is out of range or NaN"], + _a_ = [0, [11, "Int.of_string: ", [3, 0, 0]], "Int.of_string: %S"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[166], + sexp_of_t = Base_Import[142], + t_sexp_grammar = Base_Import[186], + hashable = [0, hash, caml_int_compare, sexp_of_t], + compare = caml_int_compare; + function of_string$0(s){ + try{var _aF_ = caml_call1(of_string, s); return _aF_;} + catch(_aG_){return caml_call3(Base_Printf[6], _a_, s, 0);} + } + var + num_bits = Base_Int_conversions[29], + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function to_float(_aE_){return _aE_;} + function of_float_unchecked(_aD_){return _aD_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _aC_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _b_, _aC_, 0); + } + var + comparator = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t])[1], + _c_ = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, 0]), + is_positive = _c_[1], + is_non_negative = _c_[2], + is_negative = _c_[3], + is_non_positive = _c_[4], + include = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include[1], + sexp_of_t$0 = include[2], + compare$0 = Base_Import[229], + hash_fold_t$0 = Base_Import[207], + func$0 = Base_Import[221], + zero = 0, + one = 1, + minus_one = -1; + function hash$0(x){return caml_call1(func$0, x);} + var neg = Base_Import[113]; + function symbol(_aB_, _aA_){return _aB_ < _aA_ ? 1 : 0;} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$1(s){ + function _ay_(_az_){return _az_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _ay_); + } + var + include$0 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$1, + zero, + symbol, + neg, + module_name]), + Hex = include$0[1], + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$1[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _aw_ = low <= t ? 1 : 0, _ax_ = _aw_ ? t <= high ? 1 : 0 : _aw_; + return _ax_; + } + function clamp_unchecked(t, min, max){ + return t < min ? min : t <= max ? t : max; + } + function clamp_exn(t, min, max){ + if(min <= max) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(max >= min) return [0, clamp_unchecked(t, min, max)]; + var + _at_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _au_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _at_], + _av_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _au_); + return caml_call1(Base_Or_error[35], _av_); + } + function pred(i){return caml_call2(Base_Import[93], i, 1);} + function succ(i){return caml_call2(Base_Import[91], i, 1);} + function to_int(i){return i;} + function of_int_exn(i){return i;} + var + max_value = Base_Import[85][18], + min_value = Base_Import[85][19], + of_int32 = Base_Int_conversions[6], + of_int32_exn = Base_Int_conversions[7], + to_int32 = Base_Int_conversions[1], + to_int32_exn = Base_Int_conversions[2], + of_int64 = Base_Int_conversions[11], + of_int64_exn = Base_Int_conversions[12], + to_int64 = Base_Int_conversions[4], + of_nativeint = Base_Int_conversions[22], + of_nativeint_exn = Base_Int_conversions[23], + to_nativeint = Base_Int_conversions[5], + max_value_30_bits = 1073741823; + function abs(x){return caml_call1(Base_Import[123], x);} + function rem(a, b){return caml_call2(Base_Import[122], a, b);} + function incr(_as_){_as_[1]++; return 0;} + function decr(_ar_){_ar_[1] += -1; return 0;} + function shift_right(a, b){return caml_call2(Base_Import[115], a, b);} + function shift_right_logical(a, b){ + return caml_call2(Base_Import[120], a, b); + } + function shift_left(a, b){return caml_call2(Base_Import[119], a, b);} + function bit_not(a){return caml_call1(Base_Import[117], a);} + function bit_or(a, b){return caml_call2(Base_Import[118], a, b);} + function bit_and(a, b){return caml_call2(Base_Import[116], a, b);} + function bit_xor(a, b){return caml_call2(Base_Import[121], a, b);} + var pow = Base_Int_math[2][1]; + function symbol$0(b, e){return caml_call2(pow, b, e);} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _g_, 0); + } + function ceil_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + x$0 = caml_call2(Base_Import[93], x, 1), + _al_ = caml_call2(Base_Import[120], x$0, 1), + x$1 = caml_call2(Base_Import[118], x$0, _al_), + _am_ = caml_call2(Base_Import[120], x$1, 2), + x$2 = caml_call2(Base_Import[118], x$1, _am_), + _an_ = caml_call2(Base_Import[120], x$2, 4), + x$3 = caml_call2(Base_Import[118], x$2, _an_), + _ao_ = caml_call2(Base_Import[120], x$3, 8), + x$4 = caml_call2(Base_Import[118], x$3, _ao_), + _ap_ = caml_call2(Base_Import[120], x$4, 16), + x$5 = caml_call2(Base_Import[118], x$4, _ap_), + _aq_ = caml_call2(Base_Import[120], x$5, 32), + x$6 = caml_call2(Base_Import[118], x$5, _aq_); + return caml_call2(Base_Import[91], x$6, 1); + } + function floor_pow2(x){ + if(x <= 0) non_positive_argument(0); + var + _ae_ = caml_call2(Base_Import[120], x, 1), + x$0 = caml_call2(Base_Import[118], x, _ae_), + _af_ = caml_call2(Base_Import[120], x$0, 2), + x$1 = caml_call2(Base_Import[118], x$0, _af_), + _ag_ = caml_call2(Base_Import[120], x$1, 4), + x$2 = caml_call2(Base_Import[118], x$1, _ag_), + _ah_ = caml_call2(Base_Import[120], x$2, 8), + x$3 = caml_call2(Base_Import[118], x$2, _ah_), + _ai_ = caml_call2(Base_Import[120], x$3, 16), + x$4 = caml_call2(Base_Import[118], x$3, _ai_), + _aj_ = caml_call2(Base_Import[120], x$4, 32), + x$5 = caml_call2(Base_Import[118], x$4, _aj_), + _ak_ = caml_call2(Base_Import[120], x$5, 1); + return caml_call2(Base_Import[93], x$5, _ak_); + } + function is_pow2(x){ + if(x <= 0) non_positive_argument(0); + var _ad_ = caml_call2(Base_Import[93], x, 1); + return 0 === caml_call2(Base_Import[116], x, _ad_) ? 1 : 0; + } + function floor_log2(i){ + if(i <= 0){ + var _aa_ = [0, [0, cst, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _aa_)); + } + var + _ab_ = runtime.Base_int_math_int_clz(i), + _ac_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _ac_, _ab_); + } + function ceil_log2(i){ + if(i <= 0){ + var ___ = [0, [0, cst$0, caml_call1(Base_Import[142], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_ceil_log2_got_invalid_, ___)); + } + if(1 === i) return 0; + var + _$_ = runtime.Base_int_math_int_clz(caml_call2(Base_Import[93], i, 1)); + return caml_call2(Base_Import[93], num_bits, _$_); + } + var sign = Base_Sign[27], popcount = Base_Popcount[1]; + function _h_(_Z_){return - _Z_ | 0;} + function _i_(_Y_, _X_){return _Y_ !== _X_ ? 1 : 0;} + function _j_(_W_, _V_){return _W_ < _V_ ? 1 : 0;} + function _k_(_U_, _T_){return _T_ < _U_ ? 1 : 0;} + function _l_(_S_, _R_){return _S_ === _R_ ? 1 : 0;} + function _m_(_Q_, _P_){return _Q_ <= _P_ ? 1 : 0;} + function _n_(_O_, _N_){return _N_ <= _O_ ? 1 : 0;} + function _o_(_M_){return - _M_ | 0;} + var _p_ = caml_div, _q_ = runtime.caml_mul; + function _r_(_L_, _K_){return _L_ - _K_ | 0;} + var + _s_ = + [0, + of_float, + to_float, + of_string$0, + to_string, + function(_J_, _I_){return _J_ + _I_ | 0;}, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + abs, + _h_, + zero, + of_int_exn, + rem], + F = caml_call1(Base_Int_math[1], _s_), + round = F[4], + round_towards_zero = F[5], + round_down = F[6], + round_up = F[7], + round_nearest = F[8]; + function symbol$1(x, y){ + if(y <= 0){ + var _G_ = caml_call1(to_string, y), _H_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _t_, _H_, _G_, 0); + } + var rval = rem(x, y); + return rval < 0 ? rval + y | 0 : rval; + } + function symbol$2(x, y){ + if(y <= 0){ + var _E_ = caml_call1(to_string, y), _F_ = caml_call1(to_string, x); + caml_call4(Base_Printf[7], _u_, _F_, _E_, 0); + } + return x < 0 ? caml_div(x + 1 | 0, y) - 1 | 0 : caml_div(x, y); + } + function symbol$3(x, y){return caml_call2(Base_Import[96], x, y);} + var + lnot = Base_Import[117], + include$2 = Base_Import[97], + ascending = include$2[1], + descending = include$2[2], + max = include$2[3], + min = include$2[4], + _v_ = [0, [0, F[1], F[2], F[3]]], + _w_ = [0, symbol$0, lnot, abs, zero, symbol$1, symbol$2, symbol$3]; + function _x_(_D_){return runtime.Base_int_math_int_ctz(_D_);} + function _y_(_C_){return runtime.Base_int_math_int_clz(_C_);} + var + _z_ = caml_int_compare, + Base_Int = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string$0, + to_string, + function(_B_, _A_){return _B_ === _A_ ? 1 : 0;}, + _z_, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _y_, + _x_, + _w_, + symbol$0, + lnot, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + max_value_30_bits, + of_int_exn, + to_int, + of_int32, + to_int32, + of_int64, + of_nativeint, + to_nativeint, + _v_]; + runtime.caml_register_global(33, Base_Int, "Base__Int"); + return; + } + (globalThis)); + +//# 20450 "../../../.js/default/base/base.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, Base_T = [0]; + runtime.caml_register_global(0, Base_T, "Base__T"); + return; + } + (globalThis)); + +//# 21496 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Sexp = global_data.Base__Sexp, + Base_Comparable = global_data.Base__Comparable, + hash_fold_t = Base_Sexp[1], + hash = Base_Sexp[2], + t_of_sexp = Base_Sexp[3], + sexp_of_t = Base_Sexp[4], + Not_found_s = Base_Sexp[7], + Of_sexp_error = Base_Sexp[8], + message = Base_Sexp[9], + default_indent = Base_Sexp[10], + pp_hum = Base_Sexp[11], + pp_hum_indent = Base_Sexp[12], + pp_mach = Base_Sexp[13], + pp = Base_Sexp[14], + to_string_hum = Base_Sexp[15], + to_string_mach = Base_Sexp[16], + to_string = Base_Sexp[17], + of_float_style = Base_Sexp[18], + of_int_style = Base_Sexp[19], + t_sexp_grammar = Base_Sexp[21], + invariant = Base_Sexp[22], + of_string = Base_Sexp[23], + include = caml_call1(Base_Comparable[10], [0, Base_Sexp[6], Base_Sexp[4]]), + symbol = include[1], + symbol$0 = include[2], + symbol$1 = include[3], + symbol$2 = include[4], + symbol$3 = include[5], + symbol$4 = include[6], + equal = include[7], + compare = include[8], + min = include[9], + max = include[10], + ascending = include[11], + descending = include[12], + between = include[13], + clamp_exn = include[14], + clamp = include[15], + comparator = include[16], + Base_Sexp_with_comparable = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator]; + runtime.caml_register_global + (2, Base_Sexp_with_comparable, "Base__Sexp_with_comparable"); + return; + } + (globalThis)); + +//# 24602 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Exn = global_data.Base__Exn, + Base_List = global_data.Base__List, + Base_Import = global_data.Base__Import, + compare = Base_Import[238], + equal = Base_Import[251], + t_of_sexp = Base_Import[171], + sexp_of_t = Base_Import[147]; + function t_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Import[192], a_sexp_grammar); + } + function swap(t1, t2){ + var tmp = t1[1]; + t1[1] = t2[1]; + t2[1] = tmp; + return 0; + } + function replace(t, f){t[1] = caml_call1(f, t[1]); return 0;} + function set_temporarily(t, a, f){ + var restore_to = t[1]; + t[1] = a; + function _b_(param){t[1] = restore_to; return 0;} + return caml_call2(Base_Exn[13], f, _b_); + } + function set(param){var a = param[2], r = param[1]; r[1] = a; return 0;} + function sets(ts){return caml_call2(Base_List[9], ts, set);} + function snapshot(param){var r = param[1]; return [0, r, r[1]];} + function sets_temporarily(and_values, f){ + var restore_to = caml_call2(Base_List[76], and_values, snapshot); + sets(and_values); + function _a_(param){return sets(restore_to);} + return caml_call2(Base_Exn[13], f, _a_); + } + var + Base_Ref = + [0, + compare, + equal, + t_of_sexp, + sexp_of_t, + t_sexp_grammar, + swap, + replace, + set_temporarily, + [0, set, sets, snapshot], + sets_temporarily]; + runtime.caml_register_global(3, Base_Ref, "Base__Ref"); + return; + } + (globalThis)); + +//# 25513 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_nx = "%nx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_lessequal = runtime.caml_lessequal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Nativeint.Hex", + module_name$0 = "Base.Nativeint", + Base_Int_math = global_data.Base__Int_math, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Stdlib_Nativeint = global_data.Stdlib__Nativeint, + Base_Printf = global_data.Base__Printf, + Base_Float0 = global_data.Base__Float0, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Pretty_printer = global_data.Base__Pretty_printer, + Base_Word_size = global_data.Base__Word_size, + Base_Error = global_data.Base__Error, + Base_Popcount = global_data.Base__Popcount, + include = Base_Import[104], + compare = include[9], + hash_fold_t = Base_Import[203], + func = Base_Import[217], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _f_ = [0, "src/nativeint.ml", 202, 2], + cst_Nativeint_ceil_log2_got_in = "[Nativeint.ceil_log2] got invalid input", + cst_Nativeint_floor_log2_got_i = + "[Nativeint.floor_log2] got invalid input", + _e_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + _d_ = + [0, + [11, + "Nativeint.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Nativeint.of_float: argument (%f) is out of range or NaN"], + _c_ = [0, [6, 6, 0, 0, 0], cst_nx], + _b_ = [0, [6, 6, 0, 0, 0], cst_nx]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[170], + sexp_of_t = Base_Import[146], + t_sexp_grammar = Base_Import[190], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[104][9], + to_string = Stdlib_Nativeint[15], + of_string = runtime.caml_int_of_string, + comparator = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t])[1], + zero = Stdlib_Nativeint[1], + _a_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + is_positive = _a_[1], + is_non_negative = _a_[2], + is_negative = _a_[3], + is_non_positive = _a_[4], + sign = _a_[5], + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$0 = include$0[2], + compare$1 = Base_Import[232], + hash_fold_t$0 = Base_Import[203], + func$0 = Base_Import[217]; + function hash$0(x){return caml_call1(func$0, x);} + var zero$0 = Stdlib_Nativeint[1]; + function neg(_U_){return - _U_ | 0;} + var symbol = Base_Import[104][1]; + function to_string$0(i){return caml_call2(Base_Printf[2], _b_, i);} + function of_string$0(s){ + function _S_(_T_){return _T_;} + return caml_call3(Stdlib_Scanf[5], s, _c_, _S_); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$1, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero$0, + symbol, + neg, + module_name]), + Hex = include$1[1], + include$2 = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string]), + pp = include$2[1]; + function invariant(param){return 0;} + var + num_bits = caml_call1(Base_Word_size[2], Base_Word_size[3]), + float_lower_bound = caml_call1(Base_Float0[25], num_bits), + float_upper_bound = caml_call1(Base_Float0[23], num_bits); + function shift_right_logical(_R_, _Q_){return _R_ >>> _Q_ | 0;} + function shift_right(_P_, _O_){return _P_ >> _O_;} + function shift_left(_N_, _M_){return _N_ << _M_;} + var bit_not = Stdlib_Nativeint[12]; + function bit_xor(_L_, _K_){return _L_ ^ _K_;} + function bit_or(_J_, _I_){return _J_ | _I_;} + function bit_and(_H_, _G_){return _H_ & _G_;} + var + min_value = Stdlib_Nativeint[11], + max_value = Stdlib_Nativeint[10], + abs = Stdlib_Nativeint[8], + pred = Stdlib_Nativeint[7], + succ = Stdlib_Nativeint[6], + rem = runtime.caml_mod; + function symbol$0(_F_){return - _F_ | 0;} + var + minus_one = Stdlib_Nativeint[3], + one = Stdlib_Nativeint[2], + zero$1 = Stdlib_Nativeint[1]; + function to_float(_E_){return _E_;} + function of_float_unchecked(_D_){return _D_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _C_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _d_, _C_, 0); + } + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _e_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Nativeint[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0, + x$6 = x$5 | x$5 >>> 32 | 0; + return caml_call1(Stdlib_Nativeint[6], x$6); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0, + x$5 = x$4 | x$4 >>> 32 | 0; + return x$5 - (x$5 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[104][2], x, 0)) non_positive_argument(0); + var _B_ = x & caml_call1(Stdlib_Nativeint[7], x); + return caml_call2(Base_Import[104][4], _B_, 0); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _y_ = [0, [0, cst, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_floor_log2_got_i, _y_)); + } + var + _z_ = runtime.Base_int_math_nativeint_clz(i), + _A_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _A_, _z_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Nativeint[1])){ + var _w_ = [0, [0, cst$0, caml_call1(Base_Import[146], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Nativeint_ceil_log2_got_in, _w_)); + } + if(caml_call2(Stdlib_Nativeint[18], i, Stdlib_Nativeint[2])) return 0; + var + _x_ = + runtime.Base_int_math_nativeint_clz(caml_call1(Stdlib_Nativeint[7], i)); + return caml_call2(Base_Import[93], num_bits, _x_); + } + function between(t, low, high){ + var _v_ = caml_call2(Base_Import[104][2], low, t); + return _v_ ? caml_call2(Base_Import[104][2], t, high) : _v_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[104][1], t, min) + ? min + : caml_call2(Base_Import[104][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[104][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[104][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _s_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _t_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _s_], + _u_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _t_); + return caml_call1(Base_Or_error[35], _u_); + } + var symbol$1 = runtime.caml_div, symbol$2 = runtime.caml_mul; + function symbol$3(_r_, _q_){return _r_ - _q_ | 0;} + function symbol$4(_p_, _o_){return _p_ + _o_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_nativeint(t){return t;} + function to_nativeint(t){return t;} + var + popcount = Base_Popcount[4], + of_int_exn = Base_Int_conversions[5], + to_int = Base_Int_conversions[22], + to_int_exn = Base_Int_conversions[23], + to_int_trunc = Base_Int_conversions[24], + of_int32 = Base_Int_conversions[10], + to_int32 = Base_Int_conversions[25], + to_int32_exn = Base_Int_conversions[26], + to_int32_trunc = Base_Int_conversions[27], + of_int64 = Base_Int_conversions[17], + of_int64_exn = Base_Int_conversions[18], + of_int64_trunc = Base_Int_conversions[19], + to_int64 = Base_Int_conversions[28]; + function pow(b, e){ + var _m_ = caml_call1(to_int_exn, e), _n_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _n_, _m_)); + } + function symbol$5(b, e){return pow(b, e);} + var + _g_ = Base_Import[104], + symbol$6 = _g_[3], + symbol$7 = _g_[1], + symbol$8 = _g_[5], + symbol$9 = _g_[4], + symbol$10 = _g_[2], + symbol$11 = _g_[6], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + of_int_exn, + rem]), + symbol$12 = include$3[1], + symbol$13 = include$3[2], + symbol$14 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[104], + symbol$15 = include$4[1], + symbol$16 = include$4[2], + symbol$17 = include$4[3], + symbol$18 = include$4[4], + symbol$19 = include$4[5], + symbol$20 = include$4[6], + ascending = include$4[7], + descending = include$4[8], + compare$2 = include$4[9], + equal = include$4[10], + max = include$4[11], + min = include$4[12], + _h_ = runtime.caml_int32_bswap, + _i_ = + [0, + symbol$4, + symbol$3, + symbol$2, + symbol$1, + symbol$0, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$0, + zero$1, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _j_(_l_){return runtime.Base_int_math_nativeint_ctz(_l_);} + var + Base_Nativeint = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$20, + symbol$16, + symbol$18, + symbol$19, + symbol$15, + symbol$17, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero$1, + one, + minus_one, + symbol$4, + symbol$3, + symbol$2, + symbol$5, + symbol$0, + symbol$0, + symbol$13, + symbol$12, + symbol$1, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_k_){return runtime.Base_int_math_nativeint_clz(_k_);}, + _j_, + _i_, + of_int_exn, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + to_int_trunc, + to_int32_trunc, + of_int64_trunc, + _h_]; + runtime.caml_register_global(34, Base_Nativeint, "Base__Nativeint"); + return; + } + (globalThis)); + +//# 29983 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_Lx = "%Lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_bswap = runtime.caml_int64_bswap, + caml_int64_compare = runtime.caml_int64_compare, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_or = runtime.caml_int64_or, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int64.Hex", + module_name$0 = "Base.Int64", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[204], + func = Base_Import[218], + _e_ = [0, [7, 6, 0, 0, 0], cst_Lx], + _d_ = [0, [7, 6, 0, 0, 0], cst_Lx], + cst_Int64_ceil_log2_got_invali = "[Int64.ceil_log2] got invalid input", + cst_Int64_floor_log2_got_inval = "[Int64.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int64.ml", 100, 2], + _a_ = + [0, + [11, + "Int64.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int64.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[169], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + hashable = [0, hash, Stdlib_Int64[15], sexp_of_t]; + function compare(_C_, _B_){return caml_int64_compare(_C_, _B_);} + var + to_string = Stdlib_Int64[14], + of_string = runtime.caml_int64_of_string, + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 64), + float_upper_bound = caml_call1(Base_Float0[23], 64), + float_of_bits = runtime.caml_int64_float_of_bits, + bits_of_float = runtime.caml_int64_bits_of_float, + shift_right_logical = caml_int64_shift_right_unsigne, + shift_right = runtime.caml_int64_shift_right, + shift_left = runtime.caml_int64_shift_left, + bit_not = Stdlib_Int64[11], + bit_xor = runtime.caml_int64_xor, + bit_or = caml_int64_or, + bit_and = caml_int64_and, + min_value = Stdlib_Int64[10], + max_value = Stdlib_Int64[9], + abs = Stdlib_Int64[8], + pred = Stdlib_Int64[7], + succ = Stdlib_Int64[6], + pow = Base_Int_math[2][2], + rem = runtime.caml_int64_mod, + neg = caml_int64_neg, + minus_one = Stdlib_Int64[3], + one = Stdlib_Int64[2], + zero = Stdlib_Int64[1], + to_float = runtime.caml_int64_to_float, + of_float_unchecked = caml_int64_of_float, + num_bits = 64; + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return caml_int64_of_float(f); + var _A_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _A_, 0); + } + function symbol(b, e){return caml_call2(pow, b, e);} + function bswap16(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 48); + } + function bswap32(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 32); + } + function bswap48(x){ + return caml_int64_shift_right_unsigne(caml_int64_bswap(x), 16); + } + var + include$0 = caml_call1(Base_Comparable[13], [0, compare, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5]; + function invariant(param){return 0;} + function between(t, low, high){ + var + _y_ = caml_lessequal(low, t), + _z_ = _y_ ? caml_lessequal(t, high) : _y_; + return _z_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _v_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _w_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _v_], + _x_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _w_); + return caml_call1(Base_Or_error[35], _x_); + } + function incr(r){r[1] = caml_int64_add(r[1], one); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one); return 0;} + function of_int64_exn(_u_){return _u_;} + function to_int64(t){return t;} + var + popcount = Base_Popcount[3], + of_int_exn = caml_int64_of_int32, + to_int = Base_Int_conversions[11], + to_int_exn = Base_Int_conversions[12], + of_int32_exn = caml_int64_of_int32, + to_int32 = Base_Int_conversions[14], + to_int32_exn = Base_Int_conversions[15], + of_nativeint = Base_Int_conversions[28], + to_nativeint = Base_Int_conversions[17], + to_nativeint_exn = Base_Int_conversions[18], + raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int64[7], x), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 1)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 2)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 4)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 8)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 16)), + x$6 = caml_int64_or(x$5, caml_int64_shift_right_unsigne(x$5, 32)); + return caml_call1(Stdlib_Int64[6], x$6); + } + function floor_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var + x$0 = caml_int64_or(x, caml_int64_shift_right_unsigne(x, 1)), + x$1 = caml_int64_or(x$0, caml_int64_shift_right_unsigne(x$0, 2)), + x$2 = caml_int64_or(x$1, caml_int64_shift_right_unsigne(x$1, 4)), + x$3 = caml_int64_or(x$2, caml_int64_shift_right_unsigne(x$2, 8)), + x$4 = caml_int64_or(x$3, caml_int64_shift_right_unsigne(x$3, 16)), + x$5 = caml_int64_or(x$4, caml_int64_shift_right_unsigne(x$4, 32)); + return caml_int64_sub(x$5, caml_int64_shift_right_unsigne(x$5, 1)); + } + function is_pow2(x){ + if(caml_lessequal(x, Stdlib_Int64[1])) non_positive_argument(0); + var _t_ = Stdlib_Int64[1]; + return caml_equal(caml_int64_and(x, caml_call1(Stdlib_Int64[7], x)), _t_); + } + function floor_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _q_ = [0, [0, cst, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_floor_log2_got_inval, _q_)); + } + var + _r_ = runtime.Base_int_math_int64_clz(i), + _s_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _s_, _r_); + } + function ceil_log2(i){ + if(caml_lessequal(i, Stdlib_Int64[1])){ + var _o_ = [0, [0, cst$0, caml_call1(Base_Import[145], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int64_ceil_log2_got_invali, _o_)); + } + if(caml_call2(Stdlib_Int64[17], i, Stdlib_Int64[2])) return 0; + var _p_ = runtime.Base_int_math_int64_clz(caml_call1(Stdlib_Int64[7], i)); + return caml_call2(Base_Import[93], num_bits, _p_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare$0 = Base_Import[231], + hash_fold_t$0 = Base_Import[204], + func$0 = Base_Import[218]; + function hash$0(x){return caml_call1(func$0, x);} + var symbol$0 = caml_lessthan; + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _m_(_n_){return _n_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _m_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$0, + neg, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + caml_int64_add, + caml_int64_sub, + runtime.caml_int64_mul, + runtime.caml_int64_div, + caml_int64_neg, + runtime.caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + runtime.caml_notequal, + abs, + caml_int64_neg, + zero, + of_int_exn, + rem]), + symbol$1 = include$3[1], + symbol$2 = include$3[2], + symbol$3 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + include$4 = Base_Import[103], + ascending = include$4[1], + descending = include$4[2], + max = include$4[3], + min = include$4[4], + _f_ = [0, symbol, bit_not, abs, zero, symbol$1, symbol$2, symbol$3]; + function _g_(_l_){return runtime.Base_int_math_int64_ctz(_l_);} + function _h_(_k_){return runtime.Base_int_math_int64_clz(_k_);} + var + Base_Int64 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + caml_equal, + function(_j_, _i_){return caml_int64_compare(_j_, _i_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + one, + minus_one, + rem, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + _h_, + _g_, + _f_, + symbol, + bit_not, + abs, + zero, + symbol$1, + symbol$2, + symbol$3, + to_int, + to_int32, + of_nativeint, + to_nativeint, + bits_of_float, + float_of_bits, + bswap16, + bswap32, + bswap48]; + runtime.caml_register_global(29, Base_Int64, "Base__Int64"); + return; + } + (globalThis)); + +//# 30380 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_int63_emul_ml = "src/int63_emul.ml", + caml_equal = runtime.caml_equal, + caml_greaterequal = runtime.caml_greaterequal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int64_add = runtime.caml_int64_add, + caml_int64_and = runtime.caml_int64_and, + caml_int64_mul = runtime.caml_int64_mul, + caml_int64_neg = runtime.caml_int64_neg, + caml_int64_of_float = runtime.caml_int64_of_float, + caml_int64_of_string = runtime.caml_int64_of_string, + caml_int64_shift_right = runtime.caml_int64_shift_right, + caml_int64_shift_right_unsigne = runtime.caml_int64_shift_right_unsigned, + caml_int64_sub = runtime.caml_int64_sub, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_notequal = runtime.caml_notequal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + mask = runtime.caml_int64_create_lo_mi_hi(16777214, 16777215, 65535), + module_name = "Base.Int63.Hex", + module_name$0 = "Base.Int63", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Int64 = global_data.Base__Int64, + Base_String = global_data.Base__String, + Stdlib_Int64 = global_data.Stdlib__Int64, + Stdlib_MoreLabels = global_data.Stdlib__MoreLabels, + Base_Popcount = global_data.Base__Popcount, + Base_Comparator = global_data.Base__Comparator, + Base_Int_math = global_data.Base__Int_math, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + compare = Base_Import[231], + hash_fold_t = Base_Import[204], + sexp_of_t = Base_Import[145], + t_sexp_grammar = Base_Import[189], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + cst_0x = "0x", + _l_ = [0, [7, 6, 0, 0, 0], "%Lx"], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _k_ = [0, cst_src_int63_emul_ml, 317, 2], + _i_ = + [0, + [11, + "Int63.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int63.of_float: argument (%f) is out of range or NaN"], + _h_ = runtime.caml_int64_create_lo_mi_hi(0, 0, 0), + _g_ = + [0, + [11, "Int63.of_string: invalid input ", [3, 0, 0]], + "Int63.of_string: invalid input %S"], + _e_ = [0, cst_src_int63_emul_ml, 114, 20], + _d_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _c_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _b_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _a_ = runtime.caml_int64_create_lo_mi_hi(2, 0, 0), + _f_ = runtime.caml_int64_create_lo_mi_hi(1, 0, 0); + function wrap_exn(x){ + caml_call1(Base_Int_conversions[20], x); + return caml_int64_mul(x, _a_); + } + function wrap_modulo(x){return caml_int64_mul(x, _c_);} + function unwrap(x){return caml_int64_shift_right(x, 1);} + function m(x){return caml_int64_and(x, mask);} + function invariant(t){ + if(caml_equal(m(t), t)) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + } + var + symbol = caml_int64_add, + symbol$0 = caml_int64_sub, + symbol$1 = caml_int64_neg; + function abs(x){return caml_call1(Stdlib_Int64[8], x);} + var one = wrap_exn(_f_); + function succ(a){return caml_int64_add(a, one);} + function pred(a){return caml_int64_sub(a, one);} + var min_value = m(Stdlib_Int64[10]), max_value = m(Stdlib_Int64[9]); + function bit_not(x){return m(caml_call1(Stdlib_Int64[11], x));} + var + bit_and = caml_int64_and, + bit_xor = runtime.caml_int64_xor, + bit_or = runtime.caml_int64_or, + shift_left = runtime.caml_int64_shift_left; + function shift_right(x, i){return m(caml_int64_shift_right(x, i));} + function shift_right_logical(x, i){ + return m(caml_int64_shift_right_unsigne(x, i)); + } + var f = Base_Int_math[2][3]; + function pow(a, b){ + return caml_int64_mul + (caml_call2 + (f, caml_int64_shift_right(a, 1), caml_int64_shift_right(b, 1)), + _d_); + } + function symbol$2(a, b){ + return caml_int64_mul(a, caml_int64_shift_right(b, 1)); + } + function symbol$3(a, b){return wrap_modulo(runtime.caml_int64_div(a, b));} + var rem = runtime.caml_int64_mod; + function popcount(x){return caml_call1(Base_Popcount[3], x);} + function to_int64(t){return caml_int64_shift_right(t, 1);} + function of_int64(t){ + return caml_call1(Base_Int_conversions[21], t) + ? [0, caml_int64_mul(t, _b_)] + : 0; + } + function of_int64_exn(t){return wrap_exn(t);} + function of_int64_trunc(t){return wrap_modulo(t);} + function t_of_sexp(x){return wrap_exn(caml_call1(Base_Import[169], x));} + function sexp_of_t$0(x){ + return caml_call1(Base_Import[145], caml_int64_shift_right(x, 1)); + } + function compare$0(x, y){return caml_call2(compare, x, y);} + function is_pow2(x){ + return caml_call1(Base_Int64[67], caml_int64_shift_right(x, 1)); + } + function clz(x){return caml_call1(Base_Int64[68], x);} + function ctz(x){ + return caml_call1(Base_Int64[69], caml_int64_shift_right(x, 1)); + } + function floor_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function ceil_pow2(x){ + return wrap_exn(caml_call1(Base_Int64[64], caml_int64_shift_right(x, 1))); + } + function floor_log2(x){ + return caml_call1(Base_Int64[66], caml_int64_shift_right(x, 1)); + } + function ceil_log2(x){ + return caml_call1(Base_Int64[65], caml_int64_shift_right(x, 1)); + } + function hash(x){return caml_call1(Stdlib_MoreLabels[1][28], x);} + var hashable = [0, hash, compare$0, sexp_of_t$0]; + function invalid_str(x){return caml_call3(Base_Printf[6], _g_, x, 0);} + function to_string(x){ + return caml_call1(Stdlib_Int64[14], caml_int64_shift_right(x, 1)); + } + function of_string(str){ + try{ + var len = caml_ml_string_length(str); + if(0 < len){ + var switcher = caml_string_get(str, 0) - 43 | 0, switch$0 = 0; + if(2 < switcher >>> 0) + switch$0 = 1; + else + switch(switcher){ + case 0: + var sign = 4003188, pos = 1; break; + case 1: + switch$0 = 1; break; + default: var sign = 3901488, pos = 1; + } + if(switch$0) var sign = 4003188, pos = 0; + } + else + var sign = 4003188, pos = 0; + if(caml_call2(Base_Import[91], pos, 2) < len) + var + c1 = caml_string_get(str, pos), + c2 = caml_string_get(str, caml_call2(Base_Import[91], pos, 1)), + match = + 48 === c1 + ? 9 < c2 - 48 >>> 0 ? [0, sign, 0] : [0, sign, 1] + : [0, sign, 1]; + else + var match = [0, sign, 1]; + var signedness = match[2]; + if(signedness) + var _w_ = of_int64_exn(caml_int64_of_string(str)); + else{ + if(4003188 <= sign) + var pos_str = str; + else + var + _x_ = caml_call2(Base_Import[93], caml_ml_string_length(str), 1), + pos_str = caml_call3(Base_String[2], str, 1, _x_); + var int64 = caml_int64_of_string(pos_str); + if(caml_lessthan(int64, _h_)) invalid_str(str); + var + int63 = wrap_modulo(int64), + int63$0 = 4003188 <= sign ? int63 : caml_int64_neg(int63), + _w_ = int63$0; + } + return _w_; + } + catch(_y_){return invalid_str(str);} + } + function bswap16(t){ + return wrap_modulo + (caml_call1(Base_Int64[84], caml_int64_shift_right(t, 1))); + } + function bswap32(t){ + return wrap_modulo + (caml_call1(Base_Int64[85], caml_int64_shift_right(t, 1))); + } + function bswap48(t){ + return wrap_modulo + (caml_call1(Base_Int64[86], caml_int64_shift_right(t, 1))); + } + var + float_lower_bound = caml_call1(Base_Float0[25], 63), + float_upper_bound = caml_call1(Base_Float0[23], 63), + minus_one = wrap_exn(Stdlib_Int64[3]), + one$0 = wrap_exn(Stdlib_Int64[2]), + zero = wrap_exn(Stdlib_Int64[1]), + num_bits = 63; + function to_float(x){ + return runtime.caml_int64_to_float(caml_int64_shift_right(x, 1)); + } + function of_float_unchecked(x){return wrap_modulo(caml_int64_of_float(x));} + function of_float(t){ + if + (caml_call2(Base_Import[108][6], t, float_lower_bound) + && caml_call2(Base_Import[108][2], t, float_upper_bound)) + return wrap_modulo(caml_int64_of_float(t)); + var _v_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _i_, _v_, 0); + } + var + _j_ = caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t$0, zero]), + is_positive = _j_[1], + is_non_negative = _j_[2], + is_negative = _j_[3], + is_non_positive = _j_[4], + sign = _j_[5]; + function between(t, low, high){ + var + _t_ = caml_lessequal(low, t), + _u_ = _t_ ? caml_lessequal(t, high) : _t_; + return _u_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _q_ = [0, [0, cst_max, sexp_of_t$0(max)], 0], + _r_ = [0, [0, cst_min, sexp_of_t$0(min)], _q_], + _s_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _r_); + return caml_call1(Base_Or_error[35], _s_); + } + function symbol$4(b, e){return pow(b, e);} + function incr(r){r[1] = caml_int64_add(r[1], one$0); return 0;} + function decr(r){r[1] = caml_int64_sub(r[1], one$0); return 0;} + function of_int(x){ + return wrap_exn(caml_call1(Base_Int_conversions[4], x)); + } + function of_int_exn(x){return of_int(x);} + function to_int(x){ + return caml_call1(Base_Int_conversions[11], caml_int64_shift_right(x, 1)); + } + function to_int_exn(x){ + return caml_call1(Base_Int_conversions[12], caml_int64_shift_right(x, 1)); + } + function to_int_trunc(x){ + return caml_call1(Base_Int_conversions[13], caml_int64_shift_right(x, 1)); + } + function of_int32(x){ + return wrap_exn(caml_call1(Base_Int_conversions[9], x)); + } + function of_int32_exn(x){return of_int32(x);} + function to_int32(x){ + return caml_call1(Base_Int_conversions[14], caml_int64_shift_right(x, 1)); + } + function to_int32_exn(x){ + return caml_call1(Base_Int_conversions[15], caml_int64_shift_right(x, 1)); + } + function to_int32_trunc(x){ + return caml_call1(Base_Int_conversions[16], caml_int64_shift_right(x, 1)); + } + function of_nativeint(x){ + return of_int64(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_exn(x){ + return wrap_exn(caml_call1(Base_Int_conversions[28], x)); + } + function of_nativeint_trunc(x){ + return of_int64_trunc(caml_call1(Base_Int_conversions[28], x)); + } + function to_nativeint(x){ + return caml_call1(Base_Int_conversions[17], caml_int64_shift_right(x, 1)); + } + function to_nativeint_exn(x){ + return caml_call1(Base_Int_conversions[18], caml_int64_shift_right(x, 1)); + } + function to_nativeint_trunc(x){ + return caml_call1(Base_Int_conversions[19], caml_int64_shift_right(x, 1)); + } + var + include$0 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$0[1], + sexp_of_t$1 = include$0[2]; + function hash$0(x){return hash(x);} + var symbol$5 = caml_lessthan; + function to_string$0(i){ + return caml_call2 + (Base_Printf[2], _l_, caml_int64_shift_right_unsigne(i, 1)); + } + function of_string$0(s){ + return of_string(caml_call2(Base_Import[112], cst_0x, s)); + } + var + include$1 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare$0, + hash_fold_t, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$5, + symbol$1, + module_name]), + Hex = include$1[1]; + function to_string$1(x){return to_string(x);} + var + pp = + caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string$1])[1], + symbol$6 = caml_notequal, + symbol$7 = caml_lessthan, + symbol$8 = caml_greaterthan, + symbol$9 = caml_equal, + symbol$10 = caml_lessequal, + symbol$11 = caml_greaterequal, + include$2 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + of_int_exn, + rem]), + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + round = include$2[4], + round_towards_zero = include$2[5], + round_down = include$2[6], + round_up = include$2[7], + round_nearest = include$2[8], + Repr = [0], + include$3 = Base_Import[103], + ascending = include$3[1], + descending = include$3[2], + max = include$3[3], + min = include$3[4], + repr = 1, + _m_ = [0, wrap_exn, unwrap], + _n_ = + [0, + symbol, + symbol$0, + symbol$2, + symbol$3, + symbol$1, + symbol$4, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs, + symbol$1, + zero, + symbol$12, + symbol$13, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical], + Base_Int63_emul = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + to_string, + caml_greaterequal, + caml_lessequal, + caml_equal, + caml_greaterthan, + caml_lessthan, + caml_notequal, + caml_equal, + function(_p_, _o_){return runtime.caml_int64_compare(_p_, _o_);}, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one$0, + minus_one, + symbol, + symbol$0, + symbol$2, + symbol$4, + symbol$1, + symbol$1, + symbol$13, + symbol$12, + symbol$3, + rem, + symbol$14, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _n_, + of_int, + to_int, + to_int_trunc, + of_int32, + to_int32, + to_int32_trunc, + of_int64, + of_int64_trunc, + of_nativeint, + to_nativeint, + of_nativeint_trunc, + to_nativeint_trunc, + bswap16, + bswap32, + bswap48, + _m_, + Repr, + repr]; + runtime.caml_register_global(34, Base_Int63_emul, "Base__Int63_emul"); + return; + } + (globalThis)); + +//# 30933 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_bool_ml = "src/bool.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + all = [0, 0, [0, 1, 0]], + module_name = "Base.Bool", + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Printf = global_data.Base__Printf, + Base_Comparator = global_data.Base__Comparator, + Base_Pretty_printer = global_data.Base__Pretty_printer, + invalid_argf = Base_Printf[7], + compare = Base_Import[226], + hash_fold_t = Base_Import[208], + func = Base_Import[222], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, cst_src_bool_ml, 56, 2], + _a_ = + [0, + [11, "Bool.of_string: expected true or false but got ", [2, 0, 0]], + "Bool.of_string: expected true or false but got %s"], + _c_ = [0, cst_src_bool_ml, 83, 9]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[162], + sexp_of_t = Base_Import[138], + t_sexp_grammar = Base_Import[182], + hashable = [0, hash, compare, sexp_of_t]; + function of_string(s){ + return caml_string_notequal(s, "false") + ? caml_string_notequal + (s, "true") + ? caml_call3(invalid_argf, _a_, s, 0) + : 1 + : 0; + } + var + to_string = Base_Import[85][29], + include = caml_call1(Base_Comparator[5], [0, compare, sexp_of_t]), + comparator = include[1], + include$0 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$0[1]; + function invariant(param){return 0;} + function between(t, low, high){ + var _k_ = caml_call2(Base_Import[105][2], low, t); + return _k_ ? caml_call2(Base_Import[105][2], t, high) : _k_; + } + function clamp_unchecked(t, min, max){ + return caml_call2(Base_Import[105][1], t, min) + ? min + : caml_call2(Base_Import[105][2], t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[105][2], min, max)) + return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_call2(Base_Import[105][5], min, max)) + return [0, clamp_unchecked(t, min, max)]; + var + _h_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _i_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _h_], + _j_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _i_); + return caml_call1(Base_Or_error[35], _j_); + } + function to_int(x){return caml_call1(Base_Import[86], x);} + function symbol(a, b){ + var _f_ = to_int(b), _g_ = to_int(a); + return caml_call2(Base_Import[118], _g_, _f_); + } + function symbol$0(a, b){ + var _d_ = to_int(b), _e_ = to_int(a); + return caml_call2(Base_Import[116], _e_, _d_); + } + if(1 === to_int(1) && 0 === to_int(0)){ + var + include$1 = Base_Import[105], + symbol$1 = include$1[1], + symbol$2 = include$1[2], + symbol$3 = include$1[3], + symbol$4 = include$1[4], + symbol$5 = include$1[5], + symbol$6 = include$1[6], + ascending = include$1[7], + descending = include$1[8], + compare$0 = include$1[9], + equal = include$1[10], + max = include$1[11], + min = include$1[12], + Base_Bool = + [0, + all, + t_sexp_grammar, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + symbol$6, + symbol$2, + symbol$4, + symbol$5, + symbol$1, + symbol$3, + equal, + compare$0, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + invariant, + to_int, + [0, symbol$0, symbol]]; + runtime.caml_register_global(17, Base_Bool, "Base__Bool"); + return; + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + } + (globalThis)); + +//# 31089 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$1 = "", + cst_lx = "%lx", + cst_argument_must_be_strictly_ = "argument must be strictly positive", + caml_equal = runtime.caml_equal, + caml_greaterthan = runtime.caml_greaterthan, + caml_int32_bswap = runtime.caml_int32_bswap, + caml_lessequal = runtime.caml_lessequal, + caml_lessthan = runtime.caml_lessthan, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst$0 = cst$1, + cst = cst$1, + module_name = "Base.Int32.Hex", + module_name$0 = "Base.Int32", + Stdlib_Scanf = global_data.Stdlib__Scanf, + Base_Printf = global_data.Base__Printf, + Stdlib_Int32 = global_data.Stdlib__Int32, + Base_Import = global_data.Base__Import, + Base_Sexp = global_data.Base__Sexp, + Base_Int_math = global_data.Base__Int_math, + Base_Or_error = global_data.Base__Or_error, + Assert_failure = global_data.Assert_failure, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Comparable = global_data.Base__Comparable, + Base_Popcount = global_data.Base__Popcount, + Base_Int_conversions = global_data.Base__Int_conversions, + Base_Error = global_data.Base__Error, + Base_Pretty_printer = global_data.Base__Pretty_printer, + hash_fold_t = Base_Import[205], + func = Base_Import[219], + _e_ = [0, [5, 6, 0, 0, 0], cst_lx], + _d_ = [0, [5, 6, 0, 0, 0], cst_lx], + cst_Int32_ceil_log2_got_invali = "[Int32.ceil_log2] got invalid input", + cst_Int32_floor_log2_got_inval = "[Int32.floor_log2] got invalid input", + _c_ = + [0, + [11, cst_argument_must_be_strictly_, 0], + cst_argument_must_be_strictly_], + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _b_ = [0, "src/int32.ml", 97, 4], + _a_ = + [0, + [11, + "Int32.of_float: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Int32.of_float: argument (%f) is out of range or NaN"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[168], + sexp_of_t = Base_Import[144], + t_sexp_grammar = Base_Import[188], + hashable = [0, hash, Stdlib_Int32[15], sexp_of_t]; + function ascending(x, y){return caml_call2(Stdlib_Int32[15], x, y);} + var + to_string = Stdlib_Int32[14], + of_string = runtime.caml_int_of_string, + include = caml_call1(Base_Comparator[5], [0, ascending, sexp_of_t]), + comparator = include[1], + float_lower_bound = caml_call1(Base_Float0[25], 32), + float_upper_bound = caml_call1(Base_Float0[23], 32), + float_of_bits = runtime.caml_int32_float_of_bits, + bits_of_float = runtime.caml_int32_bits_of_float, + num_bits = 32; + function shift_right_logical(_S_, _R_){return _S_ >>> _R_ | 0;} + function shift_right(_Q_, _P_){return _Q_ >> _P_;} + function shift_left(_O_, _N_){return _O_ << _N_;} + var bit_not = Stdlib_Int32[11]; + function bit_xor(_M_, _L_){return _M_ ^ _L_;} + function bit_or(_K_, _J_){return _K_ | _J_;} + function bit_and(_I_, _H_){return _I_ & _H_;} + var + min_value = Stdlib_Int32[10], + max_value = Stdlib_Int32[9], + abs = Stdlib_Int32[8], + pred = Stdlib_Int32[7], + succ = Stdlib_Int32[6], + rem = runtime.caml_mod; + function symbol(_G_){return - _G_ | 0;} + var + minus_one = Stdlib_Int32[3], + one = Stdlib_Int32[2], + zero = Stdlib_Int32[1]; + function to_float(_F_){return _F_;} + function of_float_unchecked(_E_){return _E_ | 0;} + function of_float(f){ + if + (caml_call2(Base_Import[108][6], f, float_lower_bound) + && caml_call2(Base_Import[108][2], f, float_upper_bound)) + return f | 0; + var _D_ = caml_call1(Base_Float0[27], f); + return caml_call3(Base_Printf[7], _a_, _D_, 0); + } + var + include$0 = + caml_call1(Base_Comparable[13], [0, ascending, sexp_of_t, zero]), + is_positive = include$0[1], + is_non_negative = include$0[2], + is_negative = include$0[3], + is_non_positive = include$0[4], + sign = include$0[5], + symbol$0 = runtime.caml_greaterequal, + symbol$1 = caml_lessequal, + symbol$2 = caml_equal, + symbol$3 = caml_greaterthan, + symbol$4 = caml_lessthan, + symbol$5 = runtime.caml_notequal; + function descending(x, y){return ascending(y, x);} + function min(x, y){return caml_lessthan(x, y) ? x : y;} + function max(x, y){return caml_greaterthan(x, y) ? x : y;} + var equal = caml_equal; + function between(t, low, high){ + var _C_ = caml_lessequal(low, t); + return _C_ ? caml_lessequal(t, high) : _C_; + } + function clamp_unchecked(t, min, max){ + return caml_lessthan(t, min) ? min : caml_lessequal(t, max) ? t : max; + } + function clamp_exn(t, min, max){ + if(caml_lessequal(min, max)) return clamp_unchecked(t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function clamp(t, min, max){ + if(! caml_greaterthan(min, max)) return [0, clamp_unchecked(t, min, max)]; + var + _z_ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _A_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], _z_], + _B_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _A_); + return caml_call1(Base_Or_error[35], _B_); + } + function invariant(param){return 0;} + var symbol$6 = runtime.caml_div, symbol$7 = runtime.caml_mul; + function symbol$8(_y_, _x_){return _y_ - _x_ | 0;} + function symbol$9(_w_, _v_){return _w_ + _v_ | 0;} + function incr(r){r[1] = r[1] + one | 0; return 0;} + function decr(r){r[1] = r[1] - one | 0; return 0;} + function of_int32(t){return t;} + function to_int32(t){return t;} + var + popcount = Base_Popcount[2], + of_int = Base_Int_conversions[1], + of_int_exn = Base_Int_conversions[2], + of_int_trunc = Base_Int_conversions[3], + to_int = Base_Int_conversions[6], + to_int_exn = Base_Int_conversions[7], + to_int_trunc = Base_Int_conversions[8], + of_int64 = Base_Int_conversions[14], + of_int64_exn = Base_Int_conversions[15], + of_int64_trunc = Base_Int_conversions[16], + to_int64 = Base_Int_conversions[9], + of_nativeint = Base_Int_conversions[25], + of_nativeint_exn = Base_Int_conversions[26], + of_nativeint_trunc = Base_Int_conversions[27], + to_nativeint = Base_Int_conversions[10]; + function pow(b, e){ + var _t_ = caml_call1(to_int_exn, e), _u_ = caml_call1(to_int_exn, b); + return caml_call1(of_int_exn, caml_call2(Base_Int_math[2][1], _u_, _t_)); + } + function symbol$10(b, e){return pow(b, e);} + function bswap16(x){return caml_int32_bswap(x) >>> 16 | 0;} + var raise_s = Base_Error[30]; + function non_positive_argument(param){ + return caml_call2(Base_Printf[7], _c_, 0); + } + function ceil_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = caml_call1(Stdlib_Int32[7], x), + x$1 = x$0 | x$0 >>> 1 | 0, + x$2 = x$1 | x$1 >>> 2 | 0, + x$3 = x$2 | x$2 >>> 4 | 0, + x$4 = x$3 | x$3 >>> 8 | 0, + x$5 = x$4 | x$4 >>> 16 | 0; + return caml_call1(Stdlib_Int32[6], x$5); + } + function floor_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var + x$0 = x | x >>> 1 | 0, + x$1 = x$0 | x$0 >>> 2 | 0, + x$2 = x$1 | x$1 >>> 4 | 0, + x$3 = x$2 | x$2 >>> 8 | 0, + x$4 = x$3 | x$3 >>> 16 | 0; + return x$4 - (x$4 >>> 1 | 0) | 0; + } + function is_pow2(x){ + if(caml_call2(Base_Import[102][2], x, Stdlib_Int32[1])) + non_positive_argument(0); + var _r_ = Stdlib_Int32[1], _s_ = x & caml_call1(Stdlib_Int32[7], x); + return caml_call2(Base_Import[102][4], _s_, _r_); + } + function floor_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _o_ = [0, [0, cst, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_floor_log2_got_inval, _o_)); + } + var + _p_ = runtime.Base_int_math_int32_clz(i), + _q_ = caml_call2(Base_Import[93], num_bits, 1); + return caml_call2(Base_Import[93], _q_, _p_); + } + function ceil_log2(i){ + if(caml_call2(Base_Import[102][2], i, Stdlib_Int32[1])){ + var _m_ = [0, [0, cst$0, caml_call1(Base_Import[144], i)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int32_ceil_log2_got_invali, _m_)); + } + if(caml_call2(Stdlib_Int32[17], i, Stdlib_Int32[2])) return 0; + var _n_ = runtime.Base_int_math_int32_clz(caml_call1(Stdlib_Int32[7], i)); + return caml_call2(Base_Import[93], num_bits, _n_); + } + var + include$1 = caml_call1(Base_Int_conversions[33], [0, to_string]), + to_string_hum = include$1[1], + sexp_of_t$0 = include$1[2], + compare = Base_Import[230], + hash_fold_t$0 = Base_Import[205], + func$0 = Base_Import[219]; + function hash$0(x){return caml_call1(func$0, x);} + function to_string$0(i){return caml_call2(Base_Printf[2], _d_, i);} + function of_string$0(s){ + function _k_(_l_){return _l_;} + return caml_call3(Stdlib_Scanf[5], s, _e_, _k_); + } + var + include$2 = + caml_call1 + (Base_Int_conversions[34], + [0, + compare, + hash_fold_t$0, + hash$0, + to_string$0, + of_string$0, + zero, + symbol$4, + symbol, + module_name]), + Hex = include$2[1], + pp = caml_call1(Base_Pretty_printer[2], [0, module_name$0, to_string])[1], + include$3 = + caml_call1 + (Base_Int_math[1], + [0, + of_float, + to_float, + of_string, + to_string, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + of_int_exn, + rem]), + symbol$11 = include$3[1], + symbol$12 = include$3[2], + symbol$13 = include$3[3], + round = include$3[4], + round_towards_zero = include$3[5], + round_down = include$3[6], + round_up = include$3[7], + round_nearest = include$3[8], + _f_ = caml_int32_bswap, + _g_ = + [0, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + symbol, + symbol$10, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + abs, + symbol, + zero, + symbol$11, + symbol$12, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + shift_right_logical]; + function _h_(_j_){return runtime.Base_int_math_int32_ctz(_j_);} + var + Base_Int32 = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$0, + of_string, + to_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + ascending, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + symbol$9, + symbol$8, + symbol$7, + symbol$10, + symbol, + symbol, + symbol$12, + symbol$11, + symbol$6, + rem, + symbol$13, + bit_and, + bit_or, + bit_xor, + bit_not, + shift_left, + shift_right, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32, + to_int32, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint, + of_float_unchecked, + num_bits, + max_value, + min_value, + shift_right_logical, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + function(_i_){return runtime.Base_int_math_int32_clz(_i_);}, + _h_, + _g_, + of_int, + to_int, + of_int32, + to_int32, + of_nativeint, + to_nativeint, + of_int64, + of_int_trunc, + to_int_trunc, + of_nativeint_trunc, + of_int64_trunc, + bits_of_float, + float_of_bits, + bswap16, + _f_]; + runtime.caml_register_global(29, Base_Int32, "Base__Int32"); + return; + } + (globalThis)); + +//# 31536 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_product$1 = "product", + cst_t$3 = "t", + cst_u$3 = "u", + caml_div = runtime.caml_div, + caml_int64_of_int32 = runtime.caml_int64_of_int32, + caml_int64_to_int32 = runtime.caml_int64_to_int32, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_mul = runtime.caml_mul; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Base_Word_size = global_data.Base__Word_size, + Base_Int = global_data.Base__Int, + Base_Sexp = global_data.Base__Sexp, + Base_Random = global_data.Base__Random, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Int64 = global_data.Base__Int64, + Base_Error = global_data.Base__Error, + Base_Int63_emul = global_data.Base__Int63_emul, + Assert_failure = global_data.Assert_failure, + raise_s = Base_Error[30], + cst_Int_floor_log2_got_invalid = "[Int.floor_log2] got invalid input", + cst_neg_overflow = "neg overflow", + cst_abs_overflow = "abs overflow", + cst_product$0 = cst_product$1, + cst_u$2 = cst_u$3, + cst_t$2 = cst_t$3, + cst_overflow$2 = "( / ) overflow", + cst_product = cst_product$1, + cst_u$1 = cst_u$3, + cst_t$1 = cst_t$3, + cst_overflow$1 = "( * ) overflow", + cst_diff = "diff", + cst_u$0 = cst_u$3, + cst_t$0 = cst_t$3, + cst_overflow$0 = "( - ) overflow", + cst_sum = "sum", + cst_u = cst_u$3, + cst_t = cst_t$3, + cst_overflow = "( + ) overflow", + _b_ = [0, "src/int63.ml", 155, 9], + repr = Base_Word_size[3] ? 0 : 1, + t_sexp_grammar = Base_Int[1], + of_float = Base_Int[2], + to_float = Base_Int[3], + of_int_exn = Base_Int[4], + to_int_exn = Base_Int[5], + hash_fold_t = Base_Int[6], + hash = Base_Int[7], + t_of_sexp = Base_Int[8], + sexp_of_t = Base_Int[9], + of_string = Base_Int[10], + to_string = Base_Int[11], + equal = Base_Int[12], + compare = Base_Int[13], + min = Base_Int[14], + max = Base_Int[15], + ascending = Base_Int[16], + descending = Base_Int[17], + between = Base_Int[18], + clamp_exn = Base_Int[19], + clamp = Base_Int[20], + comparator = Base_Int[21], + pp = Base_Int[22], + hashable = Base_Int[23], + is_positive = Base_Int[24], + is_non_negative = Base_Int[25], + is_negative = Base_Int[26], + is_non_positive = Base_Int[27], + sign = Base_Int[28], + invariant = Base_Int[29], + Hex = Base_Int[30], + to_string_hum = Base_Int[31], + one = Base_Int[32], + minus_one = Base_Int[33], + rem = Base_Int[34], + round = Base_Int[35], + round_towards_zero = Base_Int[36], + round_down = Base_Int[37], + round_up = Base_Int[38], + round_nearest = Base_Int[39], + succ = Base_Int[40], + pred = Base_Int[41], + pow = Base_Int[42], + bit_and = Base_Int[43], + bit_or = Base_Int[44], + bit_xor = Base_Int[45], + bit_not = Base_Int[46], + popcount = Base_Int[47], + shift_left = Base_Int[48], + shift_right = Base_Int[49], + decr = Base_Int[50], + incr = Base_Int[51], + of_int32_exn = Base_Int[52], + to_int32_exn = Base_Int[53], + of_int64_exn = Base_Int[54], + to_int64 = Base_Int[55], + of_nativeint_exn = Base_Int[56], + to_nativeint_exn = Base_Int[57], + of_float_unchecked = Base_Int[58], + num_bits = Base_Int[59], + max_value = Base_Int[60], + min_value = Base_Int[61], + shift_right_logical = Base_Int[62], + ceil_pow2 = Base_Int[63], + floor_pow2 = Base_Int[64], + ceil_log2 = Base_Int[65], + floor_log2 = Base_Int[66], + is_pow2 = Base_Int[67], + clz = Base_Int[68], + ctz = Base_Int[69], + O = Base_Int[70], + symbol = Base_Int[71], + lnot = Base_Int[72], + abs = Base_Int[73], + zero = Base_Int[74], + symbol$0 = Base_Int[75], + symbol$1 = Base_Int[76], + symbol$2 = Base_Int[77], + of_int = Base_Int[79], + to_int32 = Base_Int[82], + of_int64 = Base_Int[83], + of_nativeint = Base_Int[84], + _a_ = Base_Int[85]; + function to_int(x){return [0, x];} + function to_int_trunc(x){return x;} + function to_nativeint_trunc(x){return caml_call1(_a_, x);} + function to_nativeint(x){return [0, caml_call1(_a_, x)];} + var repr$0 = 0; + function bswap32(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[85], caml_int64_of_int32(t))); + } + function bswap48(t){ + return caml_int64_to_int32 + (caml_call1(Base_Int64[86], caml_int64_of_int32(t))); + } + if(repr) + var + include = + [0, + Base_Int63_emul[1], + Base_Int63_emul[2], + Base_Int63_emul[3], + Base_Int63_emul[4], + Base_Int63_emul[5], + Base_Int63_emul[6], + Base_Int63_emul[7], + Base_Int63_emul[8], + Base_Int63_emul[9], + Base_Int63_emul[10], + Base_Int63_emul[11], + Base_Int63_emul[12], + Base_Int63_emul[13], + Base_Int63_emul[14], + Base_Int63_emul[15], + Base_Int63_emul[16], + Base_Int63_emul[17], + Base_Int63_emul[18], + Base_Int63_emul[19], + Base_Int63_emul[20], + Base_Int63_emul[21], + Base_Int63_emul[22], + Base_Int63_emul[23], + Base_Int63_emul[24], + Base_Int63_emul[25], + Base_Int63_emul[26], + Base_Int63_emul[27], + Base_Int63_emul[28], + Base_Int63_emul[29], + Base_Int63_emul[30], + Base_Int63_emul[31], + Base_Int63_emul[32], + Base_Int63_emul[33], + Base_Int63_emul[34], + Base_Int63_emul[35], + Base_Int63_emul[36], + Base_Int63_emul[37], + Base_Int63_emul[38], + Base_Int63_emul[39], + Base_Int63_emul[40], + Base_Int63_emul[41], + Base_Int63_emul[42], + Base_Int63_emul[43], + Base_Int63_emul[44], + Base_Int63_emul[45], + Base_Int63_emul[46], + Base_Int63_emul[47], + Base_Int63_emul[48], + Base_Int63_emul[49], + Base_Int63_emul[50], + Base_Int63_emul[51], + Base_Int63_emul[52], + Base_Int63_emul[53], + Base_Int63_emul[54], + Base_Int63_emul[55], + Base_Int63_emul[56], + Base_Int63_emul[57], + Base_Int63_emul[58], + Base_Int63_emul[59], + Base_Int63_emul[60], + Base_Int63_emul[61], + Base_Int63_emul[62], + Base_Int63_emul[63], + Base_Int63_emul[64], + Base_Int63_emul[65], + Base_Int63_emul[66], + Base_Int63_emul[67], + Base_Int63_emul[68], + Base_Int63_emul[69], + Base_Int63_emul[70], + Base_Int63_emul[71], + Base_Int63_emul[72], + Base_Int63_emul[73], + Base_Int63_emul[74], + Base_Int63_emul[75], + Base_Int63_emul[76], + Base_Int63_emul[77], + Base_Int63_emul[78], + Base_Int63_emul[79], + Base_Int63_emul[80], + Base_Int63_emul[81], + Base_Int63_emul[83], + Base_Int63_emul[84], + Base_Int63_emul[85], + Base_Int63_emul[86], + Base_Int63_emul[87], + Base_Int63_emul[88], + Base_Int63_emul[89], + Base_Int63_emul[90], + Base_Int63_emul[91], + Base_Int63_emul[92], + Base_Int63_emul[93], + Base_Int63_emul[94], + Base_Int63_emul[95], + Base_Int63_emul[96], + Base_Int63_emul[97], + Base_Int63_emul[98], + Base_Int63_emul[99], + Base_Int63_emul[100], + Base_Int63_emul[101], + Base_Int63_emul[102], + Base_Int63_emul[103], + Base_Int63_emul[104], + Base_Int63_emul[105], + Base_Int63_emul[106], + Base_Int63_emul[107], + Base_Int63_emul[82], + Base_Int63_emul[113], + Base_Int63_emul[108], + Base_Int63_emul[109], + Base_Int63_emul[110]]; + else + var + _c_ = runtime.caml_bswap16, + _d_ = function(_bo_){return _bo_;}, + _e_ = caml_int64_to_int32, + _f_ = function(_bn_){return _bn_;}, + _g_ = function(_bm_, _bl_){return _bm_ >>> _bl_ | 0;}, + _h_ = function(_bk_, _bj_){return _bk_ >> _bj_;}, + _i_ = function(_bi_, _bh_){return _bi_ << _bh_;}, + _j_ = O[2], + _k_ = function(_bg_, _bf_){return _bg_ ^ _bf_;}, + _l_ = function(_be_, _bd_){return _be_ | _bd_;}, + _m_ = function(_bc_, _bb_){return _bc_ & _bb_;}, + _n_ = O[7], + _o_ = O[6], + _p_ = O[5], + _q_ = O[4], + _r_ = function(_ba_){return - _ba_ | 0;}, + _s_ = O[3], + _t_ = function(_a$_, _a__){return _a$_ !== _a__ ? 1 : 0;}, + _u_ = function(_a9_, _a8_){return _a9_ < _a8_ ? 1 : 0;}, + _v_ = function(_a7_, _a6_){return _a6_ < _a7_ ? 1 : 0;}, + _w_ = function(_a5_, _a4_){return _a5_ === _a4_ ? 1 : 0;}, + _x_ = function(_a3_, _a2_){return _a3_ <= _a2_ ? 1 : 0;}, + _y_ = function(_a1_, _a0_){return _a0_ <= _a1_ ? 1 : 0;}, + _z_ = O[1], + _A_ = function(_aZ_){return - _aZ_ | 0;}, + _B_ = caml_div, + _C_ = caml_mul, + _D_ = function(_aY_, _aX_){return _aY_ - _aX_ | 0;}, + _E_ = + [0, + function(_aW_, _aV_){return _aW_ + _aV_ | 0;}, + _D_, + _C_, + _B_, + _A_, + _z_, + _y_, + _x_, + _w_, + _v_, + _u_, + _t_, + _s_, + _r_, + _q_, + _p_, + _o_, + _n_, + _m_, + _l_, + _k_, + _j_, + _i_, + _h_, + _g_], + _F_ = function(_aU_, _aT_){return _aU_ >>> _aT_ | 0;}, + _G_ = function(_aS_, _aR_){return _aS_ >> _aR_;}, + _H_ = function(_aQ_, _aP_){return _aQ_ << _aP_;}, + _I_ = function(_aO_, _aN_){return _aO_ ^ _aN_;}, + _J_ = function(_aM_, _aL_){return _aM_ | _aL_;}, + _K_ = function(_aK_, _aJ_){return _aK_ & _aJ_;}, + _L_ = caml_div, + _M_ = function(_aI_){return - _aI_ | 0;}, + _N_ = function(_aH_){return - _aH_ | 0;}, + _O_ = caml_mul, + _P_ = function(_aG_, _aF_){return _aG_ - _aF_ | 0;}, + _Q_ = function(_aE_, _aD_){return _aE_ + _aD_ | 0;}, + _R_ = function(_aC_, _aB_){return _aC_ !== _aB_ ? 1 : 0;}, + _S_ = function(_aA_, _az_){return _aA_ < _az_ ? 1 : 0;}, + _T_ = function(_ay_, _ax_){return _ax_ < _ay_ ? 1 : 0;}, + _U_ = function(_aw_, _av_){return _aw_ === _av_ ? 1 : 0;}, + _V_ = function(_au_, _at_){return _au_ <= _at_ ? 1 : 0;}, + include = + [0, + t_sexp_grammar, + of_float, + to_float, + of_int_exn, + to_int_exn, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + of_string, + to_string, + function(_as_, _ar_){return _ar_ <= _as_ ? 1 : 0;}, + _V_, + _U_, + _T_, + _S_, + _R_, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + sign, + invariant, + Hex, + to_string_hum, + zero, + one, + minus_one, + _Q_, + _P_, + _O_, + symbol, + _N_, + _M_, + symbol$1, + symbol$0, + _L_, + rem, + symbol$2, + _K_, + _J_, + _I_, + lnot, + _H_, + _G_, + round, + round_towards_zero, + round_down, + round_up, + round_nearest, + abs, + succ, + pred, + pow, + bit_and, + bit_or, + bit_xor, + bit_not, + popcount, + shift_left, + shift_right, + decr, + incr, + of_int32_exn, + to_int32_exn, + of_int64_exn, + to_int64, + of_nativeint_exn, + to_nativeint_exn, + num_bits, + max_value, + min_value, + _F_, + shift_right_logical, + ceil_pow2, + floor_pow2, + ceil_log2, + floor_log2, + is_pow2, + clz, + ctz, + _E_, + of_int, + to_int, + to_int_trunc, + of_int32_exn, + to_int32, + _f_, + of_int64, + _e_, + of_nativeint, + to_nativeint, + _d_, + to_nativeint_trunc, + of_float_unchecked, + repr$0, + _c_, + bswap32, + bswap48]; + var + t_sexp_grammar$0 = include[1], + of_float$0 = include[2], + to_float$0 = include[3], + of_int_exn$0 = include[4], + to_int_exn$0 = include[5], + hash_fold_t$0 = include[6], + hash$0 = include[7], + t_of_sexp$0 = include[8], + sexp_of_t$0 = include[9], + of_string$0 = include[10], + to_string$0 = include[11], + symbol$3 = include[12], + symbol$4 = include[13], + symbol$5 = include[14], + symbol$6 = include[15], + symbol$7 = include[16], + symbol$8 = include[17], + equal$0 = include[18], + compare$0 = include[19], + min$0 = include[20], + max$0 = include[21], + ascending$0 = include[22], + descending$0 = include[23], + between$0 = include[24], + clamp_exn$0 = include[25], + clamp$0 = include[26], + comparator$0 = include[27], + pp$0 = include[28], + hashable$0 = include[29], + is_positive$0 = include[30], + is_non_negative$0 = include[31], + is_negative$0 = include[32], + is_non_positive$0 = include[33], + sign$0 = include[34], + invariant$0 = include[35], + Hex$0 = include[36], + to_string_hum$0 = include[37], + zero$0 = include[38], + one$0 = include[39], + minus_one$0 = include[40], + symbol$9 = include[41], + symbol$10 = include[42], + symbol$11 = include[43], + symbol$12 = include[44], + neg = include[45], + symbol$13 = include[46], + symbol$14 = include[47], + symbol$15 = include[48], + symbol$16 = include[49], + rem$0 = include[50], + symbol$17 = include[51], + land = include[52], + lor = include[53], + lxor = include[54], + lnot$0 = include[55], + lsl = include[56], + asr = include[57], + round$0 = include[58], + round_towards_zero$0 = include[59], + round_down$0 = include[60], + round_up$0 = include[61], + round_nearest$0 = include[62], + abs$0 = include[63], + succ$0 = include[64], + pred$0 = include[65], + pow$0 = include[66], + bit_and$0 = include[67], + bit_or$0 = include[68], + bit_xor$0 = include[69], + bit_not$0 = include[70], + popcount$0 = include[71], + shift_left$0 = include[72], + shift_right$0 = include[73], + decr$0 = include[74], + incr$0 = include[75], + of_int32_exn$0 = include[76], + to_int32_exn$0 = include[77], + of_int64_exn$0 = include[78], + to_int64$0 = include[79], + of_nativeint_exn$0 = include[80], + to_nativeint_exn$0 = include[81], + num_bits$0 = include[82], + max_value$0 = include[83], + min_value$0 = include[84], + lsr = include[85], + shift_right_logical$0 = include[86], + ceil_pow2$0 = include[87], + floor_pow2$0 = include[88], + ceil_log2$0 = include[89], + is_pow2$0 = include[91], + clz$0 = include[92], + ctz$0 = include[93], + O$0 = include[94], + of_int$0 = include[95], + to_int$0 = include[96], + to_int_trunc$0 = include[97], + of_int32 = include[98], + to_int32$0 = include[99], + to_int32_trunc = include[100], + of_int64$0 = include[101], + of_int64_trunc = include[102], + of_nativeint$0 = include[103], + to_nativeint$0 = include[104], + of_nativeint_trunc = include[105], + to_nativeint_trunc$0 = include[106], + of_float_unchecked$0 = include[107], + repr$1 = include[108], + bswap16 = include[109], + bswap32$0 = include[110], + bswap48$0 = include[111]; + function symbol$18(t, u){ + var + sum = caml_call2(symbol$9, t, u), + _an_ = caml_call2(bit_xor$0, t, caml_call1(bit_not$0, sum)); + if + (caml_call2 + (symbol$7, + caml_call2(bit_or$0, caml_call2(bit_xor$0, t, u), _an_), + zero$0)) + return sum; + var + _ao_ = [0, [0, cst_sum, caml_call1(sexp_of_t$0, sum)], 0], + _ap_ = [0, [0, cst_u, caml_call1(sexp_of_t$0, u)], _ao_], + _aq_ = [0, [0, cst_t, caml_call1(sexp_of_t$0, t)], _ap_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow, _aq_)); + } + function symbol$19(t, u){ + var + diff = caml_call2(symbol$10, t, u), + pos_diff = caml_call2(symbol$6, t, u); + if(caml_call2(symbol$8, t, u)){ + var _aj_ = caml_call1(is_positive$0, diff); + if(caml_call2(Base_Bool[14], pos_diff, _aj_)){ + var + _ak_ = [0, [0, cst_diff, caml_call1(sexp_of_t$0, diff)], 0], + _al_ = [0, [0, cst_u$0, caml_call1(sexp_of_t$0, u)], _ak_], + _am_ = [0, [0, cst_t$0, caml_call1(sexp_of_t$0, t)], _al_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$0, _am_)); + } + } + return diff; + } + var negative_one = caml_call1(of_int$0, -1); + function div_would_overflow(t, u){ + var _ai_ = caml_call2(symbol$5, t, min_value$0); + return _ai_ ? caml_call2(symbol$5, u, negative_one) : _ai_; + } + function symbol$20(t, u){ + var product = caml_call2(symbol$11, t, u); + if(caml_call2(symbol$8, u, zero$0)){ + var switch$0 = 0; + if + (! + div_would_overflow(product, u) + && ! caml_call2(symbol$8, caml_call2(symbol$16, product, u), t)) + switch$0 = 1; + if(! switch$0){ + var + _af_ = [0, [0, cst_product, caml_call1(sexp_of_t$0, product)], 0], + _ag_ = [0, [0, cst_u$1, caml_call1(sexp_of_t$0, u)], _af_], + _ah_ = [0, [0, cst_t$1, caml_call1(sexp_of_t$0, t)], _ag_]; + return caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_overflow$1, _ah_)); + } + } + return product; + } + function symbol$21(t, u){ + if(! div_would_overflow(t, u)) return caml_call2(symbol$16, t, u); + var + _ac_ = + [0, + [0, + cst_product$0, + caml_call1(sexp_of_t$0, caml_call2(symbol$16, t, u))], + 0], + _ad_ = [0, [0, cst_u$2, caml_call1(sexp_of_t$0, u)], _ac_], + _ae_ = [0, [0, cst_t$2, caml_call1(sexp_of_t$0, t)], _ad_]; + return caml_call1(raise_s, caml_call2(Base_Sexp[9], cst_overflow$2, _ae_)); + } + function abs$1(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_abs_overflow) + : caml_call1(abs$0, t); + } + function neg$0(t){ + return caml_call2(symbol$5, t, min_value$0) + ? caml_call1(Base_Import[124], cst_neg_overflow) + : caml_call1(neg, t); + } + if(63 !== num_bits$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + function random_of_int(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _ab_ = caml_call1(to_int_exn$0, bound); + return caml_call1(of_int$0, caml_call2(Base_Random[18][6], state, _ab_)); + } + function random_of_int64(opt, bound){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _aa_ = caml_call1(to_int64$0, bound); + return caml_call1 + (of_int64_exn$0, caml_call2(Base_Random[18][9], state, _aa_)); + } + var random_of_int$0 = Base_Word_size[3] ? random_of_int : random_of_int64; + function random_incl_of_int(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var + ___ = caml_call1(to_int_exn$0, hi), + _$_ = caml_call1(to_int_exn$0, lo); + return caml_call1 + (of_int$0, caml_call3(Base_Random[18][11], state, _$_, ___)); + } + function random_incl_of_int64(opt, lo, hi){ + if(opt) + var sth = opt[1], state = sth; + else + var state = Base_Random[18][1]; + var _Y_ = caml_call1(to_int64$0, hi), _Z_ = caml_call1(to_int64$0, lo); + return caml_call1 + (of_int64_exn$0, caml_call3(Base_Random[18][14], state, _Z_, _Y_)); + } + var + random_incl = + Base_Word_size[3] ? random_incl_of_int : random_incl_of_int64; + function floor_log2$0(t){ + if(Base_Word_size[3]){ + var _W_ = caml_call1(to_int_exn$0, t); + return caml_call1(Base_Int[66], _W_); + } + if(caml_call2(symbol$4, t, zero$0)){ + var _X_ = [0, [0, cst, caml_call1(sexp_of_t$0, t)], 0]; + caml_call1 + (raise_s, caml_call2(Base_Sexp[9], cst_Int_floor_log2_got_invalid, _X_)); + } + var floor_log2 = [0, num_bits$0 - 2 | 0]; + for(;;){ + if + (! + caml_call2 + (equal$0, + zero$0, + caml_call2 + (bit_and$0, t, caml_call2(shift_left$0, one$0, floor_log2[1])))) + return floor_log2[1]; + floor_log2[1] = floor_log2[1] - 1 | 0; + } + } + var + Base_Int63 = + [0, + t_sexp_grammar$0, + of_float$0, + to_float$0, + of_int_exn$0, + to_int_exn$0, + hash_fold_t$0, + hash$0, + t_of_sexp$0, + sexp_of_t$0, + of_string$0, + to_string$0, + symbol$3, + symbol$4, + symbol$5, + symbol$6, + symbol$7, + symbol$8, + equal$0, + compare$0, + min$0, + max$0, + ascending$0, + descending$0, + between$0, + clamp_exn$0, + clamp$0, + comparator$0, + pp$0, + hashable$0, + is_positive$0, + is_non_negative$0, + is_negative$0, + is_non_positive$0, + sign$0, + invariant$0, + Hex$0, + to_string_hum$0, + zero$0, + one$0, + minus_one$0, + symbol$9, + symbol$10, + symbol$11, + symbol$12, + neg, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + rem$0, + symbol$17, + land, + lor, + lxor, + lnot$0, + lsl, + asr, + round$0, + round_towards_zero$0, + round_down$0, + round_up$0, + round_nearest$0, + abs$0, + succ$0, + pred$0, + pow$0, + bit_and$0, + bit_or$0, + bit_xor$0, + bit_not$0, + popcount$0, + shift_left$0, + shift_right$0, + decr$0, + incr$0, + of_int32_exn$0, + to_int32_exn$0, + of_int64_exn$0, + to_int64$0, + of_nativeint_exn$0, + to_nativeint_exn$0, + of_float_unchecked$0, + num_bits$0, + max_value$0, + min_value$0, + lsr, + shift_right_logical$0, + ceil_pow2$0, + floor_pow2$0, + ceil_log2$0, + is_pow2$0, + clz$0, + ctz$0, + O$0, + [0, symbol$18, symbol$19, symbol$20, symbol$21, abs$1, neg$0], + of_int$0, + to_int$0, + of_int32, + to_int32$0, + of_int64$0, + of_nativeint$0, + to_nativeint$0, + to_int_trunc$0, + to_int32_trunc, + of_int64_trunc, + of_nativeint_trunc, + to_nativeint_trunc$0, + bswap16, + bswap32$0, + bswap48$0, + random_of_int$0, + random_incl, + floor_log2$0, + [0, Base_Int63_emul[112], repr$1]]; + runtime.caml_register_global(31, Base_Int63, "Base__Int63"); + return; + } + (globalThis)); + +//# 34671 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$4 = "", + cst_out_of_range_0 = " out of range [0, ", + cst_s_1e = "%s%.1e", + cst_is_too_large = ") is too large", + cst_is_too_small_or_NaN = ") is too small or NaN", + cst$5 = ".", + cst_Float_int63_round_down_exn = "Float.int63_round_down_exn: argument (", + cst_Float_int63_round_nearest_ = + "Float.int63_round_nearest_portable_alloc_exn: argument (", + cst_Float_int63_round_up_exn_a = "Float.int63_round_up_exn: argument (", + cst_Float_iround_down_exn_argu = "Float.iround_down_exn: argument (", + cst_Float_iround_nearest_exn_a = "Float.iround_nearest_exn: argument (", + cst_Float_iround_nearest_exn_a$0 = + "Float.iround_nearest_exn: argument (%f) is too large", + cst_Float_iround_up_exn_argume = "Float.iround_up_exn: argument (", + cst_Infinite = "Infinite", + cst_Nan = "Nan", + cst_Normal = "Normal", + cst_Subnormal = "Subnormal", + cst_Zero = "Zero", + cst_infinite = "infinite", + cst_nan$1 = "nan", + cst_normal = "normal", + cst_src_float_ml = "src/float.ml", + cst_subnormal = "subnormal", + cst_zero = "zero", + caml_bytes_set = runtime.caml_bytes_set, + caml_format_float = runtime.caml_format_float, + caml_int64_bits_of_float = runtime.caml_int64_bits_of_float, + caml_int64_or = runtime.caml_int64_or, + caml_log10_float = runtime.caml_log10_float, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_compare = runtime.caml_string_compare, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst$3 = cst$4, + cst$2 = cst$4, + cst$1 = "-", + cst$0 = cst$5, + cst = cst$5, + all = [0, 0, [0, 1, [0, 2, [0, 3, [0, 4, 0]]]]], + error_source_006 = "float.ml.Class.t", + t_sexp_grammar$0 = + [3, + [0, + 2, + [0, + [1, [0, cst_Infinite, 0]], + [0, + [1, [0, cst_Nan, 0]], + [0, + [1, [0, cst_Normal, 0]], + [0, [1, [0, cst_Subnormal, 0]], [0, [1, [0, cst_Zero, 0]], 0]]]]]]], + module_name = "Base.Float", + Base_Import = global_data.Base__Import, + Base_Printf = global_data.Base__Printf, + Base_Or_error = global_data.Base__Or_error, + Base_Int = global_data.Base__Int, + Base_Int63 = global_data.Base__Int63, + Stdlib_Int64 = global_data.Stdlib__Int64, + Base_Int64 = global_data.Base__Int64, + Base_Sexp = global_data.Base__Sexp, + Base_Error = global_data.Base__Error, + Assert_failure = global_data.Assert_failure, + Base_String = global_data.Base__String, + Base_Bytes0 = global_data.Base__Bytes0, + Base_Char = global_data.Base__Char, + Base_Int_conversions = global_data.Base__Int_conversions, + Sexplib0_Sexp_conv_error = global_data.Sexplib0__Sexp_conv_error, + Base_Float0 = global_data.Base__Float0, + Base_Comparator = global_data.Base__Comparator, + Base_Word_size = global_data.Base__Word_size, + Base_Comparable = global_data.Base__Comparable, + Base_Pretty_printer = global_data.Base__Pretty_printer, + round_up = Base_Float0[1], + round_down = Base_Float0[2], + mod_float = Base_Float0[3], + modf = Base_Float0[4], + float_of_string = Base_Float0[5], + nan = Base_Float0[6], + max_value = Base_Float0[7], + neg_infinity = Base_Float0[8], + max_finite_value = Base_Float0[9], + epsilon_float = Base_Float0[10], + classify_float = Base_Float0[11], + abs_float = Base_Float0[12], + is_integer = Base_Float0[13], + symbol = Base_Float0[14], + symbol$0 = Base_Float0[15], + frexp = Base_Float0[16], + ldexp = Base_Float0[17], + is_nan = Base_Float0[18], + to_int64_preserve_order = Base_Float0[19], + to_int64_preserve_order_exn = Base_Float0[20], + of_int64_preserve_order = Base_Float0[21], + one_ulp = Base_Float0[22], + upper_bound_for_int = Base_Float0[23], + lower_bound_for_int = Base_Float0[25], + clamp_unchecked = Base_Float0[26], + box = Base_Float0[27], + compare = Base_Float0[36], + raise_s = Base_Error[30], + hash_fold_t = Base_Import[210], + func = Base_Import[224], + _R_ = [0, [8, [0, 0, 4], 0, [0, 8], 0], "%.8G"], + _P_ = + [0, + [11, + "exponent ", + [4, 0, 0, 0, [11, cst_out_of_range_0, [4, 0, 0, 0, [12, 93, 0]]]]], + "exponent %d out of range [0, %d]"], + _Q_ = + [0, + [11, + "mantissa ", + [2, 0, [11, cst_out_of_range_0, [2, 0, [12, 93, 0]]]]], + "mantissa %s out of range [0, %s]"], + cst_Float_sign_exn_of_NAN = "Float.sign_exn of NAN", + cst_max = "max", + cst_min = "min", + cst_clamp_requires_min_max = "clamp requires [min <= max]", + _L_ = [0, cst_src_float_ml, 859, 2], + _K_ = + [0, + [11, + "Float.round_significant: invalid argument significant_digits:", + [4, 0, 0, 0, 0]], + "Float.round_significant: invalid argument significant_digits:%d"], + _J_ = [0, [8, [0, 0, 3], 0, 1, 0], "%.*g"], + _I_ = [0, "p"], + cst_t = "t", + cst_g = "g", + cst_m = "m", + cst_k = "k", + _F_ = [0, cst_src_float_ml, 697, 8], + _E_ = [0, cst_src_float_ml, 700, 8], + _A_ = [0, cst_src_float_ml, 707, 8], + _B_ = [0, cst_src_float_ml, 708, 8], + _C_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [12, 32, 0]]]], "%s%d%s "], + _D_ = [0, [2, 0, [4, 0, 0, 0, [2, 0, [4, 0, 0, 0, 0]]]], "%s%d%s%d"], + _z_ = [0, cst_src_float_ml, 684, 8], + cst_0 = ".0", + _G_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + _H_ = [0, [2, 0, [8, [0, 0, 1], 0, [0, 1], 0]], cst_s_1e], + cst_inf$1 = "-inf ", + cst_inf$2 = "inf ", + cst_nan$0 = "nan ", + cst_sexp = "sexp", + cst_sexp_of_float_produced_str = "[sexp_of_float] produced strange sexp", + _w_ = + [0, + [11, "to_string_hum: invalid argument ~decimals=", [4, 0, 0, 0, 0]], + "to_string_hum: invalid argument ~decimals=%d"], + _x_ = [0, [8, [0, 1, 0], 0, 1, 0], "%+.*f"], + _y_ = [0, [8, [0, 0, 0], 0, 1, 0], "%.*f"], + cst_inf = "inf", + cst_inf$0 = "-inf", + cst_nan = cst_nan$1, + _r_ = [0, cst_Infinite], + _s_ = [0, cst_Nan], + _t_ = [0, cst_Normal], + _u_ = [0, cst_Subnormal], + _v_ = [0, cst_Zero], + _p_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too large"], + _q_ = + [0, + [11, + cst_Float_int63_round_nearest_, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_nearest_portable_alloc_exn: argument (%f) is too small or NaN"], + _n_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_down_exn: argument (%f) is too large"], + _o_ = + [0, + [11, + cst_Float_int63_round_down_exn, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_down_exn: argument (%f) is too small or NaN"], + _l_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.int63_round_up_exn: argument (%f) is too large"], + _m_ = + [0, + [11, + cst_Float_int63_round_up_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.int63_round_up_exn: argument (%f) is too small or NaN"], + _j_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _k_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_nearest_exn: argument (%f) is too small or NaN"], + _h_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + cst_Float_iround_nearest_exn_a$0], + _i_ = + [0, + [11, + cst_Float_iround_nearest_exn_a, + [8, [0, 0, 0], 0, 0, [11, ") is too small", 0]]], + "Float.iround_nearest_exn: argument (%f) is too small"], + _f_ = + [0, + [11, + "Float.iround_towards_zero_exn: argument (", + [8, [0, 0, 0], 0, 0, [11, ") is out of range or NaN", 0]]], + "Float.iround_towards_zero_exn: argument (%f) is out of range or NaN"], + _d_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_down_exn: argument (%f) is too large"], + _e_ = + [0, + [11, + cst_Float_iround_down_exn_argu, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_down_exn: argument (%f) is too small or NaN"], + _b_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_large, 0]]], + "Float.iround_up_exn: argument (%f) is too large"], + _c_ = + [0, + [11, + cst_Float_iround_up_exn_argume, + [8, [0, 0, 0], 0, 0, [11, cst_is_too_small_or_NaN, 0]]], + "Float.iround_up_exn: argument (%f) is too small or NaN"], + _a_ = [0, [11, "Float.of_string ", [2, 0, 0]], "Float.of_string %s"]; + function hash(x){return caml_call1(func, x);} + var + t_of_sexp = Base_Import[167], + sexp_of_t = Base_Import[143], + t_sexp_grammar = Base_Import[187], + hashable = [0, hash, compare, sexp_of_t], + compare$0 = Base_Import[108][9], + include = caml_call1(Base_Comparator[5], [0, compare$0, sexp_of_t]), + comparator = include[1]; + function invariant(param){return 0;} + function to_float(x){return x;} + function of_float(x){return x;} + function of_string(s){ + try{var _aX_ = caml_call1(float_of_string, s); return _aX_;} + catch(_aY_){return caml_call3(Base_Printf[7], _a_, s, 0);} + } + function to_string(x){ + var + y = caml_format_float("%.15g", x), + _aW_ = caml_call1(float_of_string, y), + y$0 = + caml_call2(Base_Import[108][4], _aW_, x) + ? y + : caml_format_float("%.17g", x), + l = runtime.caml_ml_string_length(y$0), + i = 0; + for(;;){ + if(l <= i) return caml_call2(Base_Import[112], y$0, cst); + var match = runtime.caml_string_get(y$0, i), switch$0 = 0; + if(48 <= match){ + if(58 > match) switch$0 = 1; + } + else if(45 === match) switch$0 = 1; + if(! switch$0) return y$0; + var i$0 = caml_call2(Base_Import[91], i, 1), i = i$0; + } + } + var + min_positive_subnormal_value = caml_call2(symbol, 2., -1074.), + min_positive_normal_value = caml_call2(symbol, 2., -1022.), + of_int = Base_Int[3], + to_int = Base_Int[2], + zero = 0., + one = 1., + minus_one = -1., + pi = 3.141592653589793, + sqrt_pi = 1.772453850905516, + sqrt_2pi = 2.5066282746310007, + euler = 0.5772156649015329; + function of_int63(i){return caml_call1(Base_Int63[3], i);} + var + of_int64 = runtime.caml_int64_to_float, + to_int64 = runtime.caml_int64_of_float, + iround_lbound = caml_call1(lower_bound_for_int, Base_Int[59]), + iround_ubound = caml_call1(upper_bound_for_int, Base_Int[59]); + function iround_up(t){ + if(! caml_call2(Base_Import[108][5], t, 0.)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_up, t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aU_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _b_, _aU_, 0); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aV_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _c_, _aV_, 0); + } + function iround_down(t){ + if(caml_call2(Base_Import[108][6], t, 0.)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var t$0 = caml_call1(round_down, t); + return caml_call2(Base_Import[108][6], t$0, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + function iround_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aS_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _d_, _aS_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, iround_lbound)) + return caml_call1(Base_Int[58], t$0); + var _aT_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _e_, _aT_, 0); + } + function iround_towards_zero(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return [0, caml_call1(Base_Int[58], t)]; + return 0; + } + function iround_towards_zero_exn(t){ + if + (caml_call2(Base_Import[108][6], t, iround_lbound) + && caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aR_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _f_, _aR_, 0); + } + var + _g_ = caml_call2(symbol, 2., 52.), + round_nearest_lb = caml_call1(Base_Import[114], _g_), + round_nearest_ub = caml_call2(symbol, 2., 52.), + one_ulp_less_than_half = caml_call2(one_ulp, 759637122, 0.5); + function add_half_for_round_nearest(t){ + var + _aQ_ = + caml_call2(Base_Import[108][4], t, one_ulp_less_than_half) + ? one_ulp_less_than_half + : 0.5; + return caml_call2(Base_Import[92], t, _aQ_); + } + function iround_nearest_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + return caml_call2(Base_Import[108][2], t$0, iround_ubound) + ? [0, caml_call1(Base_Int[58], t$0)] + : 0; + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call2(Base_Import[108][6], t$1, iround_lbound) + ? [0, caml_call1(Base_Int[58], t$1)] + : 0; + } + function iround_nearest_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(! caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call2(Base_Import[108][2], t, iround_ubound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aO_ = add_half_for_round_nearest(t); + return [0, caml_call1(Base_Int[58], _aO_)]; + } + if(! caml_call2(Base_Import[108][5], t, round_nearest_lb)) + return caml_call2(Base_Import[108][6], t, iround_lbound) + ? [0, caml_call1(Base_Int[58], t)] + : 0; + var _aP_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return [0, caml_call1(Base_Int[58], _aP_)]; + } + var + iround_nearest_64$0 = + Base_Word_size[3] ? iround_nearest_64 : iround_nearest_32; + function iround_nearest_exn_32(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + var t$0 = add_half_for_round_nearest(t); + if(caml_call2(Base_Import[108][2], t$0, iround_ubound)) + return caml_call1(Base_Int[58], t$0); + var _aM_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _h_, _aM_, 0); + } + var t$1 = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + if(caml_call2(Base_Import[108][6], t$1, iround_lbound)) + return caml_call1(Base_Int[58], t$1); + var _aN_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _i_, _aN_, 0); + } + function iround_nearest_exn_64(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][1], t, round_nearest_ub)){ + var _aI_ = add_half_for_round_nearest(t); + return caml_call1(Base_Int[58], _aI_); + } + if(caml_call2(Base_Import[108][2], t, iround_ubound)) + return caml_call1(Base_Int[58], t); + var _aJ_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _j_, _aJ_, 0); + } + if(caml_call2(Base_Import[108][5], t, round_nearest_lb)){ + var _aK_ = caml_call1(round_down, caml_call2(Base_Import[92], t, 0.5)); + return caml_call1(Base_Int[58], _aK_); + } + if(caml_call2(Base_Import[108][6], t, iround_lbound)) + return caml_call1(Base_Int[58], t); + var _aL_ = caml_call1(box, t); + return caml_call3(Base_Printf[7], _k_, _aL_, 0); + } + var + iround_nearest_exn = + Base_Word_size[3] ? iround_nearest_exn_64 : iround_nearest_exn_32; + function iround_exn(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 + <= dir + ? iround_towards_zero_exn(t) + : iround_nearest_exn(t) + : 759637122 <= dir ? iround_down_exn(t) : iround_up_exn(t); + } + function iround(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + try{var _aG_ = [0, iround_exn([0, dir], t)]; return _aG_;} + catch(_aH_){return 0;} + } + function is_inf(t){ + var _aF_ = caml_call2(Base_Import[96], 1., t); + return caml_call2(Base_Import[108][4], _aF_, 0.); + } + function is_finite(t){ + var _aE_ = caml_call2(Base_Import[94], t, t); + return caml_call2(Base_Import[108][4], _aE_, 0.); + } + function min_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][1], x, y) ? x : y; + } + function max_inan(x, y){ + return caml_call1(is_nan, y) + ? x + : caml_call1 + (is_nan, x) + ? y + : caml_call2(Base_Import[108][5], x, y) ? x : y; + } + var + add = Base_Import[92], + sub = Base_Import[94], + neg = Base_Import[114], + scale = Base_Import[90]; + function square(x){return caml_call2(Base_Import[90], x, x);} + function fractional(t){return caml_call1(Base_Import[125], t);} + function integral(t){return caml_call1(Base_Import[127], t);} + function round_towards_zero(t){ + return caml_call2(Base_Import[108][6], t, 0.) + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + function round_nearest_inline(t){ + if + (caml_call2(Base_Import[108][5], t, round_nearest_lb) + && caml_call2(Base_Import[108][1], t, round_nearest_ub)) + return caml_call1(round_down, add_half_for_round_nearest(t)); + return caml_call2(Base_Import[92], t, 0.); + } + function round_nearest(t){return round_nearest_inline(t);} + function round_nearest_half_to_even(t){ + if + (! + caml_call2(Base_Import[108][2], t, round_nearest_lb) + && ! caml_call2(Base_Import[108][6], t, round_nearest_ub)){ + var + floor = caml_call1(round_down, t), + ceil_or_succ = caml_call2(Base_Import[92], floor, 1.), + diff_floor = caml_call2(Base_Import[94], t, floor), + diff_ceil = caml_call2(Base_Import[94], ceil_or_succ, t); + if(caml_call2(Base_Import[108][1], diff_floor, diff_ceil)) return floor; + if(caml_call2(Base_Import[108][5], diff_floor, diff_ceil)) + return ceil_or_succ; + var _aD_ = caml_call2(mod_float, floor, 2.); + return caml_call2(Base_Import[108][4], _aD_, 0.) ? floor : ceil_or_succ; + } + return caml_call2(Base_Import[92], t, 0.); + } + var + int63_round_lbound = caml_call1(lower_bound_for_int, Base_Int63[83]), + int63_round_ubound = caml_call1(upper_bound_for_int, Base_Int63[83]); + function int63_round_up_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)){ + var t$0 = caml_call1(round_up, t); + if(caml_call2(Base_Import[108][2], t$0, int63_round_ubound)) + return caml_call1(Base_Int63[82], t$0); + var _aB_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _l_, _aB_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _aC_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _m_, _aC_, 0); + } + function int63_round_down_exn(t){ + if(caml_call2(Base_Import[108][6], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _az_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _n_, _az_, 0); + } + var t$0 = caml_call1(round_down, t); + if(caml_call2(Base_Import[108][6], t$0, int63_round_lbound)) + return caml_call1(Base_Int63[82], t$0); + var _aA_ = caml_call1(Base_Float0[27], t); + return caml_call3(Base_Printf[7], _o_, _aA_, 0); + } + function int63_round_nearest_portable_a(t0){ + var t = round_nearest_inline(t0); + if(caml_call2(Base_Import[108][5], t, 0.)){ + if(caml_call2(Base_Import[108][2], t, int63_round_ubound)) + return caml_call1(Base_Int63[82], t); + var _ax_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _p_, _ax_, 0); + } + if(caml_call2(Base_Import[108][6], t, int63_round_lbound)) + return caml_call1(Base_Int63[82], t); + var _ay_ = caml_call1(box, t0); + return caml_call3(Base_Printf[7], _q_, _ay_, 0); + } + function int63_round_nearest_arch64_noa(f){ + var _aw_ = iround_nearest_exn(f); + return caml_call1(Base_Int63[96], _aw_); + } + var + int63_round_nearest_exn = + Base_Word_size[3] + ? int63_round_nearest_arch64_noa + : int63_round_nearest_portable_a; + function round(opt, t){ + if(opt) var sth = opt[1], dir = sth; else var dir = 857423934; + return 857423934 <= dir + ? 1003109192 <= dir ? round_towards_zero(t) : round_nearest(t) + : 759637122 + <= dir + ? caml_call1(round_down, t) + : caml_call1(round_up, t); + } + var compare$1 = runtime.caml_int_compare; + function t_of_sexp$0(sexp_007){ + if(0 === sexp_007[0]){ + var + _aq_ = sexp_007[1], + _ar_ = caml_string_compare(_aq_, cst_infinite), + switch$0 = 0; + if(0 <= _ar_) + if(0 < _ar_) + if(caml_string_notequal(_aq_, cst_nan$1)) + if(caml_string_notequal(_aq_, cst_normal)) + if(caml_string_notequal(_aq_, cst_subnormal)){ + if(! caml_string_notequal(_aq_, cst_zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + else if(caml_string_notequal(_aq_, cst_Infinite)) + if(caml_string_notequal(_aq_, cst_Nan)) + if(caml_string_notequal(_aq_, cst_Normal)) + if(caml_string_notequal(_aq_, cst_Subnormal)){ + if(! caml_string_notequal(_aq_, cst_Zero)) switch$0 = 5; + } + else + switch$0 = 4; + else + switch$0 = 3; + else + switch$0 = 2; + else + switch$0 = 1; + switch(switch$0){ + case 1: + return 0; + case 2: + return 1; + case 3: + return 2; + case 4: + return 3; + case 5: + return 4; + } + } + else{ + var _as_ = sexp_007[1]; + if(! _as_) + return caml_call2 + (Sexplib0_Sexp_conv_error[7], error_source_006, sexp_007); + var _at_ = _as_[1]; + if(0 !== _at_[0]) + return caml_call2 + (Sexplib0_Sexp_conv_error[6], error_source_006, sexp_007); + var + _au_ = _at_[1], + _av_ = caml_string_compare(_au_, cst_infinite), + switch$1 = 0; + if(0 <= _av_){ + if(0 < _av_) + if(caml_string_notequal(_au_, cst_nan$1)) + if(caml_string_notequal(_au_, cst_normal)) + if(caml_string_notequal(_au_, cst_subnormal)) + if(caml_string_notequal(_au_, cst_zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + } + else if(caml_string_notequal(_au_, cst_Infinite)) + if(caml_string_notequal(_au_, cst_Nan)) + if(caml_string_notequal(_au_, cst_Normal)) + if(caml_string_notequal(_au_, cst_Subnormal)) + if(caml_string_notequal(_au_, cst_Zero)) + switch$1 = 5; + else + switch$1 = 4; + else + switch$1 = 3; + else + switch$1 = 2; + else + switch$1 = 1; + switch(switch$1){ + case 0: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 1: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 2: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 3: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + case 4: + return caml_call2 + (Sexplib0_Sexp_conv_error[3], error_source_006, sexp_007); + } + } + return caml_call2(Sexplib0_Sexp_conv_error[8], error_source_006, sexp_007); + } + function sexp_of_t$0(param){ + switch(param){ + case 0: + return _r_; + case 1: + return _s_; + case 2: + return _t_; + case 3: + return _u_; + default: return _v_; + } + } + function to_string$0(t){ + var _ap_ = sexp_of_t$0(t); + return caml_call1(Base_Import[163], _ap_); + } + function of_string$0(s){ + return t_of_sexp$0(caml_call1(Base_Import[139], s)); + } + function classify(t){ + switch(caml_call1(classify_float, t)){ + case 0: + return 2; + case 1: + return 3; + case 2: + return 4; + case 3: + return 0; + default: return 1; + } + } + function insert_underscores(opt, _am_, string){ + if(opt) var sth = opt[1], delimiter = sth; else var delimiter = 95; + if(_am_) var sth$0 = _am_[1], strip_zero = sth$0; else var strip_zero = 0; + var match = caml_call2(Base_String[84], string, 46); + if(! match) + return caml_call2(Base_Int_conversions[37], string, delimiter); + var + match$0 = match[1], + right = match$0[2], + left = match$0[1], + left$0 = caml_call2(Base_Int_conversions[37], left, delimiter); + if(strip_zero) + var + _an_ = [0, function(c){return caml_call2(Base_Char[11], c, 48);}], + right$0 = caml_call2(Base_String[92], _an_, right); + else + var right$0 = right; + if(! caml_string_notequal(right$0, cst$4)) return left$0; + var _ao_ = caml_call2(Base_Import[112], cst$0, right$0); + return caml_call2(Base_Import[112], left$0, _ao_); + } + function to_string_hum(delimiter, opt, strip_zero, _al_, f){ + if(opt) var sth = opt[1], decimals = sth; else var decimals = 3; + if(_al_) + var sth$0 = _al_[1], explicit_plus = sth$0; + else + var explicit_plus = 0; + if(decimals < 0) caml_call3(Base_Printf[7], _w_, decimals, 0); + var match = classify(f); + if(1 === match) return cst_nan; + if(! match) + return caml_call2(Base_Import[108][5], f, 0.) ? cst_inf : cst_inf$0; + var + s = + explicit_plus + ? caml_call3(Base_Printf[2], _x_, decimals, f) + : caml_call3(Base_Printf[2], _y_, decimals, f); + return insert_underscores(delimiter, strip_zero, s); + } + function sexp_of_t$1(t){ + var sexp = caml_call1(sexp_of_t, t); + if(1009018843 <= Base_Sexp[18][1]) return sexp; + if(0 === sexp[0]){ + var string = sexp[1]; + return caml_call4(Base_String[56], 0, 0, string, 69) + ? sexp + : [0, insert_underscores(0, 0, string)]; + } + var _ak_ = [0, [0, cst_sexp, caml_call1(Base_Sexp[4], sexp)], 0]; + return caml_call1 + (raise_s, + caml_call2(Base_Sexp[9], cst_sexp_of_float_produced_str, _ak_)); + } + function to_padded_compact_string_custo + (t, opt, kilo, mega, giga, tera, peta, param){ + if(opt) var sth = opt[1], prefix = sth; else var prefix = cst$2; + var match = classify(t); + if(1 === match) return cst_nan$0; + if(! match) + return caml_call2(Base_Import[108][1], t, 0.) ? cst_inf$1 : cst_inf$2; + function go(t){ + function conv(mag, numerator, denominator){ + var switch$0 = 0; + if + (caml_call2(Base_Import[108][4], denominator, 100.) + && caml_call2(Base_Import[108][6], numerator, 999.95)) + switch$0 = 1; + if(! switch$0){ + var switch$1 = 0; + if(caml_call2(Base_Import[108][6], denominator, 100000.)){ + var + _aj_ = + round_nearest(caml_call2(Base_Import[90], denominator, 9.9995)); + if(caml_call2(Base_Import[108][6], numerator, _aj_)) switch$1 = 1; + } + if(! switch$1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + } + var + _ai_ = round_nearest(caml_call2(Base_Import[90], denominator, 9999.5)); + if(! caml_call2(Base_Import[108][1], numerator, _ai_)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var + k = + caml_call1 + (round_down, caml_call2(Base_Import[96], numerator, denominator)), + lower = caml_call2(Base_Import[90], denominator, k), + _ah_ = caml_call2(Base_Import[92], k, 1.), + higher = caml_call2(Base_Import[90], denominator, _ah_), + diff_right = caml_call2(Base_Import[94], higher, numerator), + diff_left = caml_call2(Base_Import[94], numerator, lower), + k$0 = iround_nearest_exn(k), + k$1 = + caml_call2(Base_Import[108][1], diff_right, diff_left) + ? caml_call2(Base_Import[91], k$0, 1) + : caml_call2 + (Base_Import[108][5], diff_right, diff_left) + ? k$0 + : 0 + === caml_call2(Base_Import[122], k$0, 2) + ? k$0 + : caml_call2(Base_Import[91], k$0, 1), + d = caml_call2(Base_Import[122], k$1, 10), + i = caml_call2(Base_Import[95], k$1, 10); + if(0 <= i && 1000 > i){ + if(0 <= d && 10 > d) + return 0 === d + ? caml_call4(Base_Printf[2], _C_, prefix, i, mag) + : caml_call5(Base_Printf[2], _D_, prefix, i, mag, d); + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + } + if(! caml_call2(Base_Import[108][1], t, 999.95)){ + if(caml_call2(Base_Import[108][1], t, 999950.)) + return conv(kilo, t, 100.); + if(caml_call2(Base_Import[108][1], t, 999950000.)) + return conv(mega, t, 100000.); + if(caml_call2(Base_Import[108][1], t, 999950000000.)) + return conv(giga, t, 100000000.); + if(caml_call2(Base_Import[108][1], t, 999950000000000.)) + return conv(tera, t, 100000000000.); + if(! peta) return caml_call3(Base_Printf[2], _H_, prefix, t); + var peta$0 = peta[1]; + return caml_call2(Base_Import[108][1], t, 999950000000000000.) + ? conv(peta$0, t, 100000000000000.) + : caml_call3(Base_Printf[2], _G_, prefix, t); + } + if + (caml_call2(Base_Import[108][2], 0., t) + && caml_call2(Base_Import[108][1], t, 999.95)){ + var + x = caml_call2(Base_Import[112], prefix, caml_format_float("%.1f", t)); + if(! caml_call2(Base_String[80], x, cst_0)) return x; + var + x$0 = caml_call1(Base_Bytes0[15], x), + n = runtime.caml_ml_bytes_length(x$0); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 1), 32); + caml_bytes_set(x$0, caml_call2(Base_Import[93], n, 2), 32); + return caml_call1(Base_Bytes0[16], x$0); + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + } + if(caml_call2(Base_Import[108][6], t, 0.)) return go(t); + var _ag_ = go(caml_call1(Base_Import[114], t)); + return caml_call2(Base_Import[112], cst$1, _ag_); + } + function to_padded_compact_string(t){ + return to_padded_compact_string_custo + (t, 0, cst_k, cst_m, cst_g, cst_t, _I_, 0); + } + function int_pow(x, n){ + if(0 === n) return 1.; + var + x$0 = [0, caml_call2(Base_Import[92], x, -0.)], + n$0 = [0, n], + accum = [0, 1.]; + if(n$0[1] < 0){ + x$0[1] = caml_call2(Base_Import[96], 1., x$0[1]); + n$0[1] = caml_call1(Base_Import[113], n$0[1]); + if(n$0[1] < 0){accum[1] = x$0[1]; caml_call1(Base_Import[129], n$0);} + } + for(;;){ + if(1 >= n$0[1]) return caml_call2(Base_Import[90], x$0[1], accum[1]); + if(0 !== caml_call2(Base_Import[116], n$0[1], 1)) + accum[1] = caml_call2(Base_Import[90], x$0[1], accum[1]); + x$0[1] = caml_call2(Base_Import[90], x$0[1], x$0[1]); + n$0[1] = caml_call2(Base_Import[120], n$0[1], 1); + } + } + function round_gen(x, how){ + if(caml_call2(Base_Import[108][4], x, 0.)) return 0.; + if(! is_finite(x)) return x; + if(555917426 <= how[1]) + var + sd = how[2], + _ac_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + dd = caml_call2(Base_Import[93], sd, _ac_), + dd$0 = dd, + sd$0 = sd; + else + var + dd$1 = how[2], + _af_ = + caml_call1 + (to_int, + caml_call1(round_up, caml_log10_float(caml_call1(abs_float, x)))), + sd$1 = caml_call2(Base_Import[91], dd$1, _af_), + dd$0 = dd$1, + sd$0 = sd$1; + if(0 > sd$0) return 0.; + if(17 <= sd$0) return x; + var abs_dd = caml_call1(Base_Int[73], dd$0); + if(22 >= abs_dd && 16 > sd$0){ + var order = int_pow(10., abs_dd); + if(0 <= dd$0){ + var + _ad_ = + round_nearest_half_to_even(caml_call2(Base_Import[90], x, order)); + return caml_call2(Base_Import[96], _ad_, order); + } + var + _ae_ = round_nearest_half_to_even(caml_call2(Base_Import[96], x, order)); + return caml_call2(Base_Import[90], _ae_, order); + } + return of_string(caml_call3(Base_Printf[2], _J_, sd$0, x)); + } + function round_significant(x, significant_digits){ + return 0 < significant_digits + ? round_gen(x, [0, 555917426, significant_digits]) + : caml_call3(Base_Printf[7], _K_, significant_digits, 0); + } + function round_decimal(x, decimal_digits){ + return round_gen(x, [0, -352548012, decimal_digits]); + } + function between(t, low, high){ + var _ab_ = caml_call2(Base_Import[108][2], low, t); + return _ab_ ? caml_call2(Base_Import[108][2], t, high) : _ab_; + } + function clamp_exn(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return caml_call3(clamp_unchecked, t, min, max); + throw caml_maybe_attach_backtrace([0, Assert_failure, _L_], 1); + } + function clamp(t, min, max){ + if(caml_call2(Base_Import[108][2], min, max)) + return [0, caml_call3(clamp_unchecked, t, min, max)]; + var + ___ = [0, [0, cst_max, caml_call1(sexp_of_t, max)], 0], + _$_ = [0, [0, cst_min, caml_call1(sexp_of_t, min)], ___], + _aa_ = caml_call2(Base_Sexp[9], cst_clamp_requires_min_max, _$_); + return caml_call1(Base_Or_error[35], _aa_); + } + var + symbol$1 = Base_Import[92], + symbol$2 = Base_Import[94], + symbol$3 = Base_Import[90], + symbol$4 = Base_Import[96], + symbol$5 = Base_Import[114]; + function sign_exn(t){ + if(caml_call2(Base_Import[108][5], t, 0.)) return 2; + if(caml_call2(Base_Import[108][1], t, 0.)) return 0; + if(caml_call2(Base_Import[108][4], t, 0.)) return 1; + var + _Y_ = [0, [0, cst$3, sexp_of_t$1(t)], 0], + _Z_ = caml_call2(Base_Sexp[9], cst_Float_sign_exn_of_NAN, _Y_); + return caml_call1(Base_Error[30], _Z_); + } + function sign_or_nan(t){ + return caml_call2(Base_Import[108][5], t, 0.) + ? 2 + : caml_call2 + (Base_Import[108][1], t, 0.) + ? 0 + : caml_call2(Base_Import[108][4], t, 0.) ? 1 : 3; + } + function ieee_negative(t){ + var bits = caml_int64_bits_of_float(t); + return runtime.caml_lessthan(bits, Stdlib_Int64[1]); + } + var + _M_ = Base_Int64[32], + exponent_mask64 = + runtime.caml_int64_sub + (caml_call2(Base_Int64[48], Base_Int64[32], 11), _M_), + exponent_mask = caml_call1(Base_Int64[5], exponent_mask64), + _N_ = Base_Int63[39], + _O_ = caml_call2(Base_Int63[72], Base_Int63[39], 52), + mantissa_mask = caml_call2(Base_Int63[42], _O_, _N_), + mantissa_mask64 = caml_call1(Base_Int63[79], mantissa_mask), + mantissa_bits = 52; + function ieee_exponent(t){ + var + bits = caml_int64_bits_of_float(t), + _X_ = caml_call2(Base_Int64[62], bits, mantissa_bits); + return runtime.caml_int64_to_int32 + (caml_call2(Base_Int64[43], _X_, exponent_mask64)); + } + function ieee_mantissa(t){ + var bits = caml_int64_bits_of_float(t); + return caml_call1 + (Base_Int63[78], runtime.caml_int64_and(bits, mantissa_mask64)); + } + function create_ieee_exn(negative, exponent, mantissa){ + if(caml_call2(Base_Int[43], exponent, exponent_mask) !== exponent) + return caml_call4(Base_Printf[6], _P_, exponent, exponent_mask, 0); + var _U_ = caml_call2(Base_Int63[67], mantissa, mantissa_mask); + if(caml_call2(Base_Int63[17], _U_, mantissa)){ + var + _V_ = caml_call1(Base_Int63[11], mantissa_mask), + _W_ = caml_call1(Base_Int63[11], mantissa); + return caml_call4(Base_Printf[6], _Q_, _W_, _V_, 0); + } + var + sign_bits = negative ? Stdlib_Int64[10] : Stdlib_Int64[1], + expt_bits = + runtime.caml_int64_shift_left + (runtime.caml_int64_of_int32(exponent), 52), + mant_bits = caml_call1(Base_Int63[79], mantissa), + bits = caml_int64_or(sign_bits, caml_int64_or(expt_bits, mant_bits)); + return runtime.caml_int64_float_of_bits(bits); + } + function create_ieee(negative, exponent, mantissa){ + function _T_(param){return create_ieee_exn(negative, exponent, mantissa);} + return caml_call2(Base_Or_error[28], 0, _T_); + } + function to_string$1(x){return caml_call2(Base_Printf[2], _R_, x);} + function sexp_of_t$2(x){return [0, to_string$1(x)];} + function of_string$1(x){return of_string(x);} + var + include$0 = + caml_call1(Base_Comparable[13], [0, compare$0, sexp_of_t, zero]), + sign = include$0[5]; + function is_positive(t){return caml_call2(Base_Import[108][5], t, 0.);} + function is_non_negative(t){return caml_call2(Base_Import[108][6], t, 0.);} + function is_negative(t){return caml_call2(Base_Import[108][1], t, 0.);} + function is_non_positive(t){return caml_call2(Base_Import[108][2], t, 0.);} + var + include$1 = + caml_call1(Base_Pretty_printer[2], [0, module_name, to_string]), + pp = include$1[1], + _S_ = Base_Import[108], + symbol$6 = _S_[3], + symbol$7 = _S_[1], + symbol$8 = _S_[5], + symbol$9 = _S_[4], + symbol$10 = _S_[2], + symbol$11 = _S_[6]; + function of_float$0(x){return x;} + var + specialized_hash = Base_Import[224], + Private = + [0, + box, + clamp_unchecked, + lower_bound_for_int, + upper_bound_for_int, + specialized_hash, + one_ulp_less_than_half, + int63_round_nearest_portable_a, + int63_round_nearest_arch64_noa, + iround_nearest_exn_64], + include$2 = Base_Import[108], + symbol$12 = include$2[1], + symbol$13 = include$2[2], + symbol$14 = include$2[3], + symbol$15 = include$2[4], + symbol$16 = include$2[5], + symbol$17 = include$2[6], + ascending = include$2[7], + descending = include$2[8], + compare$2 = include$2[9], + equal = include$2[10]; + function min(x, y){ + if(! caml_call2(symbol$12, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + function max(x, y){ + if(! caml_call2(symbol$16, x, y) && ! caml_call1(is_nan, x)) return y; + return x; + } + var + Base_Float = + [0, + t_sexp_grammar, + of_float, + to_float, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t$1, + of_string, + symbol$17, + symbol$13, + symbol$15, + symbol$16, + symbol$12, + symbol$14, + equal, + compare$2, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator, + pp, + hashable, + is_positive, + is_non_negative, + is_negative, + is_non_positive, + invariant, + nan, + max_value, + neg_infinity, + max_value, + neg_infinity, + zero, + one, + minus_one, + pi, + sqrt_pi, + sqrt_2pi, + euler, + epsilon_float, + max_finite_value, + min_positive_subnormal_value, + min_positive_normal_value, + to_int64_preserve_order, + to_int64_preserve_order_exn, + of_int64_preserve_order, + one_ulp, + of_int, + to_int, + of_int63, + of_int64, + to_int64, + round, + iround, + iround_exn, + round_towards_zero, + round_down, + round_up, + round_nearest, + round_nearest_half_to_even, + iround_towards_zero, + iround_down, + iround_up, + iround_nearest_64$0, + iround_towards_zero_exn, + iround_down_exn, + iround_up_exn, + iround_nearest_exn, + int63_round_down_exn, + int63_round_up_exn, + int63_round_nearest_exn, + iround_lbound, + iround_ubound, + int63_round_lbound, + int63_round_ubound, + round_significant, + round_decimal, + is_nan, + is_inf, + is_finite, + is_integer, + min_inan, + max_inan, + symbol$1, + symbol$2, + symbol$4, + symbol$0, + symbol$3, + symbol, + symbol$5, + [0, fractional, integral], + modf, + mod_float, + add, + sub, + neg, + scale, + abs_float, + [0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$0, + symbol, + symbol$5, + symbol$11, + symbol$10, + symbol$9, + symbol$8, + symbol$7, + symbol$6, + abs_float, + neg, + zero, + of_int, + of_float$0], + [0, symbol$1, symbol$2, symbol$3, symbol$4, symbol$0, symbol, symbol$5], + to_string, + to_string_hum, + to_padded_compact_string, + to_padded_compact_string_custo, + int_pow, + square, + ldexp, + frexp, + [0, + compare$1, + all, + t_of_sexp$0, + sexp_of_t$0, + t_sexp_grammar$0, + of_string$0, + to_string$0], + classify, + sign, + sign_exn, + sign_or_nan, + create_ieee, + create_ieee_exn, + ieee_negative, + ieee_exponent, + ieee_mantissa, + [0, t_of_sexp, sexp_of_t$2, t_sexp_grammar, of_string$1, to_string$1], + Private]; + runtime.caml_register_global(191, Base_Float, "Base__Float"); + return; + } + (globalThis)); + +//# 36069 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + elided_message = "", + Base_Exn = global_data.Base__Exn, + Base_Sys0 = global_data.Base__Sys0, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int = global_data.Base__Int, + elide = [0, 0], + cst_b = "b", + cst_OCAMLRUNPARAM = "OCAMLRUNPARAM"; + function get(opt, param){ + if(opt) + var sth = opt[1], at_most_num_frames = sth; + else + var at_most_num_frames = Base_Int[60]; + return runtime.caml_get_current_callstack(at_most_num_frames); + } + function to_string(t){ + return elide[1] ? elided_message : caml_call1(Stdlib_Printexc[14], t); + } + function to_string_list(t){ + var _i_ = to_string(t); + return caml_call1(Base_String[88], _i_); + } + function sexp_of_t(t){ + function _g_(x){return [0, x];} + var _h_ = to_string_list(t); + return [1, caml_call2(Base_List[76], _h_, _g_)]; + } + var set_recording = Stdlib_Printexc[7], am_recording = Stdlib_Printexc[8]; + function most_recent(param){return caml_call1(Stdlib_Printexc[12], 0);} + function most_recent_for_exn(exn){ + return caml_call1(Base_Exn[18], exn) ? [0, most_recent(0)] : 0; + } + function with_recording(b, f){ + var saved = caml_call1(am_recording, 0); + caml_call1(set_recording, b); + function _f_(param){return caml_call1(set_recording, saved);} + return caml_call2(Base_Exn[13], f, _f_); + } + function initialize_module(param){ + var match = caml_call1(Base_Sys0[20], cst_OCAMLRUNPARAM); + if(match) + var + x = match[1], + _a_ = Base_String[81], + _b_ = function(_e_){return caml_call2(_a_, _e_, cst_b);}, + _c_ = caml_call2(Base_String[86], x, 44), + ocamlrunparam_mentions_backtra = caml_call2(Base_List[13], _c_, _b_); + else + var ocamlrunparam_mentions_backtra = 0; + var _d_ = 1 - ocamlrunparam_mentions_backtra; + return _d_ ? caml_call1(set_recording, 1) : _d_; + } + var + Base_Backtrace = + [0, + sexp_of_t, + get, + to_string, + to_string_list, + elide, + [0, + am_recording, + set_recording, + with_recording, + most_recent, + most_recent_for_exn], + initialize_module]; + runtime.caml_register_global(9, Base_Backtrace, "Base__Backtrace"); + return; + } + (globalThis)); + +//# 36161 "../../../.js/default/base/base.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Ref = global_data.Base__Ref, + Base_Option = global_data.Base__Option, + Base_List = global_data.Base__List, + Base_Array = global_data.Base__Array, + Shadow_stdlib = global_data.Shadow_stdlib, + Base_Sexp_with_comparable = global_data.Base__Sexp_with_comparable, + Base_Import = global_data.Base__Import, + Base_Bool = global_data.Base__Bool, + Base_Char = global_data.Base__Char, + Base_Exn = global_data.Base__Exn, + Base_Float = global_data.Base__Float, + Base_Int = global_data.Base__Int, + Base_Int32 = global_data.Base__Int32, + Base_Int64 = global_data.Base__Int64, + Base_Nativeint = global_data.Base__Nativeint, + Base_String = global_data.Base__String, + Base_Bytes = global_data.Base__Bytes, + Base_Unit = global_data.Base__Unit, + Base_Error = global_data.Base__Error, + Base_Container_intf = global_data.Base__Container_intf, + Base_Backtrace = global_data.Base__Backtrace, + Exit = Shadow_stdlib[3], + Not_found = Shadow_stdlib[4], + max_int = Shadow_stdlib[8], + min_int = Shadow_stdlib[9], + infinity = Shadow_stdlib[11], + neg_infinity = Shadow_stdlib[12], + nan = Shadow_stdlib[13], + max_float = Shadow_stdlib[14], + min_float = Shadow_stdlib[15], + epsilon_float = Shadow_stdlib[16], + char_of_int = Shadow_stdlib[18], + string_of_bool = Shadow_stdlib[19], + bool_of_string_opt = Shadow_stdlib[20], + bool_of_string = Shadow_stdlib[21], + string_of_int = Shadow_stdlib[22], + int_of_string_opt = Shadow_stdlib[23], + string_of_float = Shadow_stdlib[24], + float_of_string_opt = Shadow_stdlib[25], + stdin = Shadow_stdlib[27], + stdout = Shadow_stdlib[28], + stderr = Shadow_stdlib[29], + print_char = Shadow_stdlib[30], + print_string = Shadow_stdlib[31], + print_bytes = Shadow_stdlib[32], + print_int = Shadow_stdlib[33], + print_float = Shadow_stdlib[34], + print_endline = Shadow_stdlib[35], + print_newline = Shadow_stdlib[36], + prerr_char = Shadow_stdlib[37], + prerr_string = Shadow_stdlib[38], + prerr_bytes = Shadow_stdlib[39], + prerr_int = Shadow_stdlib[40], + prerr_float = Shadow_stdlib[41], + prerr_endline = Shadow_stdlib[42], + prerr_newline = Shadow_stdlib[43], + read_line = Shadow_stdlib[44], + read_int_opt = Shadow_stdlib[45], + read_int = Shadow_stdlib[46], + read_float_opt = Shadow_stdlib[47], + read_float = Shadow_stdlib[48], + open_out = Shadow_stdlib[49], + open_out_bin = Shadow_stdlib[50], + open_out_gen = Shadow_stdlib[51], + flush = Shadow_stdlib[52], + flush_all = Shadow_stdlib[53], + output_char = Shadow_stdlib[54], + output_string = Shadow_stdlib[55], + output_bytes = Shadow_stdlib[56], + output = Shadow_stdlib[57], + output_substring = Shadow_stdlib[58], + output_byte = Shadow_stdlib[59], + output_binary_int = Shadow_stdlib[60], + output_value = Shadow_stdlib[61], + seek_out = Shadow_stdlib[62], + pos_out = Shadow_stdlib[63], + out_channel_length = Shadow_stdlib[64], + close_out = Shadow_stdlib[65], + close_out_noerr = Shadow_stdlib[66], + set_binary_mode_out = Shadow_stdlib[67], + open_in = Shadow_stdlib[68], + open_in_bin = Shadow_stdlib[69], + open_in_gen = Shadow_stdlib[70], + input_char = Shadow_stdlib[71], + input_line = Shadow_stdlib[72], + input = Shadow_stdlib[73], + really_input = Shadow_stdlib[74], + really_input_string = Shadow_stdlib[75], + input_byte = Shadow_stdlib[76], + input_binary_int = Shadow_stdlib[77], + input_value = Shadow_stdlib[78], + seek_in = Shadow_stdlib[79], + pos_in = Shadow_stdlib[80], + in_channel_length = Shadow_stdlib[81], + close_in = Shadow_stdlib[82], + close_in_noerr = Shadow_stdlib[83], + set_binary_mode_in = Shadow_stdlib[84], + string_of_format = Shadow_stdlib[85], + symbol = Shadow_stdlib[86], + exit = Shadow_stdlib[87], + at_exit = Shadow_stdlib[88], + valid_float_lexem = Shadow_stdlib[89], + unsafe_really_input = Shadow_stdlib[90], + do_at_exit = Shadow_stdlib[91], + do_domain_local_at_exit = Shadow_stdlib[92], + hash_fold_t = Base_Sexp_with_comparable[1], + hash = Base_Sexp_with_comparable[2], + t_of_sexp = Base_Sexp_with_comparable[3], + sexp_of_t = Base_Sexp_with_comparable[4], + Not_found_s = Base_Sexp_with_comparable[5], + Of_sexp_error = Base_Sexp_with_comparable[6], + message = Base_Sexp_with_comparable[7], + default_indent = Base_Sexp_with_comparable[8], + pp_hum = Base_Sexp_with_comparable[9], + pp_hum_indent = Base_Sexp_with_comparable[10], + pp_mach = Base_Sexp_with_comparable[11], + pp = Base_Sexp_with_comparable[12], + to_string_hum = Base_Sexp_with_comparable[13], + to_string_mach = Base_Sexp_with_comparable[14], + to_string = Base_Sexp_with_comparable[15], + of_float_style = Base_Sexp_with_comparable[16], + of_int_style = Base_Sexp_with_comparable[17], + t_sexp_grammar = Base_Sexp_with_comparable[18], + invariant = Base_Sexp_with_comparable[19], + of_string = Base_Sexp_with_comparable[20], + symbol$0 = Base_Sexp_with_comparable[21], + symbol$1 = Base_Sexp_with_comparable[22], + symbol$2 = Base_Sexp_with_comparable[23], + symbol$3 = Base_Sexp_with_comparable[24], + symbol$4 = Base_Sexp_with_comparable[25], + symbol$5 = Base_Sexp_with_comparable[26], + equal = Base_Sexp_with_comparable[27], + compare = Base_Sexp_with_comparable[28], + min = Base_Sexp_with_comparable[29], + max = Base_Sexp_with_comparable[30], + ascending = Base_Sexp_with_comparable[31], + descending = Base_Sexp_with_comparable[32], + between = Base_Sexp_with_comparable[33], + clamp_exn = Base_Sexp_with_comparable[34], + clamp = Base_Sexp_with_comparable[35], + comparator = Base_Sexp_with_comparable[36], + Sexp = + [0, + hash_fold_t, + hash, + t_of_sexp, + sexp_of_t, + Not_found_s, + Of_sexp_error, + message, + default_indent, + pp_hum, + pp_hum_indent, + pp_mach, + pp, + to_string_hum, + to_string_mach, + to_string, + of_float_style, + of_int_style, + t_sexp_grammar, + invariant, + of_string, + symbol$0, + symbol$1, + symbol$2, + symbol$3, + symbol$4, + symbol$5, + equal, + compare, + min, + max, + ascending, + descending, + between, + clamp_exn, + clamp, + comparator], + am_testing = Base_Import[132], + Exported_for_specific_uses = [0, am_testing], + compare_array = Base_Array[1], + equal_array = Base_Array[100], + array_of_sexp = Base_Array[2], + sexp_of_array = Base_Array[3]; + function array_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Array[4], a_sexp_grammar); + } + var + compare_bool = Base_Bool[16], + equal_bool = Base_Bool[15], + hash_fold_bool = Base_Bool[3], + func = Base_Bool[4]; + function hash_bool(x){return caml_call1(func, x);} + var + bool_of_sexp = Base_Bool[5], + sexp_of_bool = Base_Bool[6], + bool_sexp_grammar = Base_Bool[2], + compare_char = Base_Char[16], + equal_char = Base_Char[15], + hash_fold_char = Base_Char[3], + func$0 = Base_Char[4]; + function hash_char(x){return caml_call1(func$0, x);} + var + char_of_sexp = Base_Char[5], + sexp_of_char = Base_Char[6], + char_sexp_grammar = Base_Char[2], + sexp_of_exn = Base_Exn[1], + compare_float = Base_Float[16], + equal_float = Base_Float[15], + hash_fold_float = Base_Float[4], + func$1 = Base_Float[5]; + function hash_float(x){return caml_call1(func$1, x);} + var + float_of_sexp = Base_Float[6], + sexp_of_float = Base_Float[7], + float_sexp_grammar = Base_Float[1], + compare_int = Base_Int[13], + equal_int = Base_Int[12], + hash_fold_int = Base_Int[6], + func$2 = Base_Int[7]; + function hash_int(x){return caml_call1(func$2, x);} + var + int_of_sexp = Base_Int[8], + sexp_of_int = Base_Int[9], + int_sexp_grammar = Base_Int[1], + compare_int32 = Base_Int32[19], + equal_int32 = Base_Int32[18], + hash_fold_int32 = Base_Int32[6], + func$3 = Base_Int32[7]; + function hash_int32(x){return caml_call1(func$3, x);} + var + int32_of_sexp = Base_Int32[8], + sexp_of_int32 = Base_Int32[9], + int32_sexp_grammar = Base_Int32[1], + compare_int64 = Base_Int64[13], + equal_int64 = Base_Int64[12], + hash_fold_int64 = Base_Int64[6], + func$4 = Base_Int64[7]; + function hash_int64(x){return caml_call1(func$4, x);} + var + int64_of_sexp = Base_Int64[8], + sexp_of_int64 = Base_Int64[9], + int64_sexp_grammar = Base_Int64[1], + compare_list = Base_List[1], + equal_list = Base_List[147], + hash_fold_list = Base_List[2], + list_of_sexp = Base_List[3], + sexp_of_list = Base_List[4]; + function list_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_List[5], a_sexp_grammar); + } + var + compare_nativeint = Base_Nativeint[19], + equal_nativeint = Base_Nativeint[18], + hash_fold_nativeint = Base_Nativeint[6], + func$5 = Base_Nativeint[7]; + function hash_nativeint(x){return caml_call1(func$5, x);} + var + nativeint_of_sexp = Base_Nativeint[8], + sexp_of_nativeint = Base_Nativeint[9], + nativeint_sexp_grammar = Base_Nativeint[1], + compare_option = Base_Option[1], + equal_option = Base_Option[4], + hash_fold_option = Base_Option[2], + option_of_sexp = Base_Option[6], + sexp_of_option = Base_Option[7]; + function option_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Option[3], a_sexp_grammar); + } + var + compare_ref = Base_Ref[1], + equal_ref = Base_Ref[2], + ref_of_sexp = Base_Ref[3], + sexp_of_ref = Base_Ref[4]; + function ref_sexp_grammar(a_sexp_grammar){ + return caml_call1(Base_Ref[5], a_sexp_grammar); + } + var + compare_string = Base_String[37], + equal_string = Base_String[121], + hash_fold_string = Base_String[26]; + function hash_string(x){return runtime.Base_hash_string(x);} + var + string_of_sexp = Base_String[27], + sexp_of_string = Base_String[28], + string_sexp_grammar = Base_String[1], + compare_bytes = Base_Bytes[16], + equal_bytes = Base_Bytes[15], + bytes_of_sexp = Base_Bytes[1], + sexp_of_bytes = Base_Bytes[2], + bytes_sexp_grammar = Base_Bytes[3], + compare_unit = Base_Unit[16], + equal_unit = Base_Unit[15], + hash_fold_unit = Base_Unit[3], + func$6 = Base_Unit[4]; + function hash_unit(x){return caml_call1(func$6, x);} + var + unit_of_sexp = Base_Unit[5], + sexp_of_unit = Base_Unit[6], + unit_sexp_grammar = Base_Unit[2], + symbol$6 = Base_List[148][1], + _a_ = Base_Int[70], + symbol$7 = _a_[1], + lnot = _a_[2], + abs = _a_[3], + zero = _a_[4], + symbol$8 = _a_[5], + symbol$9 = _a_[6], + symbol$10 = _a_[7], + _b_ = Base_Import[97], + ascending$0 = _b_[1], + descending$0 = _b_[2], + max$0 = _b_[3], + min$0 = _b_[4], + include = Base_Float[104], + symbol$11 = include[1], + symbol$12 = include[2], + symbol$13 = include[3], + symbol$14 = include[4], + symbol$15 = include[5], + symbol$16 = include[6], + symbol$17 = include[7], + symbol$18 = Base_String[53], + fst = Base_Import[125], + snd = Base_Import[127], + failwith = Base_Import[124], + invalid_arg = Base_Import[126], + raise_s = Base_Error[30], + phys_equal = Base_Import[128], + Export = + [0, + compare_array, + equal_array, + array_of_sexp, + sexp_of_array, + array_sexp_grammar, + compare_bool, + equal_bool, + hash_fold_bool, + hash_bool, + bool_of_sexp, + sexp_of_bool, + bool_sexp_grammar, + compare_char, + equal_char, + hash_fold_char, + hash_char, + char_of_sexp, + sexp_of_char, + char_sexp_grammar, + sexp_of_exn, + compare_float, + equal_float, + hash_fold_float, + hash_float, + float_of_sexp, + sexp_of_float, + float_sexp_grammar, + compare_int, + equal_int, + hash_fold_int, + hash_int, + int_of_sexp, + sexp_of_int, + int_sexp_grammar, + compare_int32, + equal_int32, + hash_fold_int32, + hash_int32, + int32_of_sexp, + sexp_of_int32, + int32_sexp_grammar, + compare_int64, + equal_int64, + hash_fold_int64, + hash_int64, + int64_of_sexp, + sexp_of_int64, + int64_sexp_grammar, + compare_list, + equal_list, + hash_fold_list, + list_of_sexp, + sexp_of_list, + list_sexp_grammar, + compare_nativeint, + equal_nativeint, + hash_fold_nativeint, + hash_nativeint, + nativeint_of_sexp, + sexp_of_nativeint, + nativeint_sexp_grammar, + compare_option, + equal_option, + hash_fold_option, + option_of_sexp, + sexp_of_option, + option_sexp_grammar, + compare_ref, + equal_ref, + ref_of_sexp, + sexp_of_ref, + ref_sexp_grammar, + compare_string, + equal_string, + hash_fold_string, + hash_string, + string_of_sexp, + sexp_of_string, + string_sexp_grammar, + compare_bytes, + equal_bytes, + bytes_of_sexp, + sexp_of_bytes, + bytes_sexp_grammar, + compare_unit, + equal_unit, + hash_fold_unit, + hash_unit, + unit_of_sexp, + sexp_of_unit, + unit_sexp_grammar, + symbol$6, + symbol$7, + lnot, + abs, + zero, + symbol$8, + symbol$9, + symbol$10, + ascending$0, + descending$0, + max$0, + min$0, + symbol$11, + symbol$12, + symbol$13, + symbol$14, + symbol$15, + symbol$16, + symbol$17, + symbol$18, + fst, + snd, + failwith, + invalid_arg, + raise_s, + phys_equal], + compare_array$0 = Export[1], + equal_array$0 = Export[2], + array_of_sexp$0 = Export[3], + sexp_of_array$0 = Export[4], + array_sexp_grammar$0 = Export[5], + compare_bool$0 = Export[6], + equal_bool$0 = Export[7], + hash_fold_bool$0 = Export[8], + hash_bool$0 = Export[9], + bool_of_sexp$0 = Export[10], + sexp_of_bool$0 = Export[11], + bool_sexp_grammar$0 = Export[12], + compare_char$0 = Export[13], + equal_char$0 = Export[14], + hash_fold_char$0 = Export[15], + hash_char$0 = Export[16], + char_of_sexp$0 = Export[17], + sexp_of_char$0 = Export[18], + char_sexp_grammar$0 = Export[19], + sexp_of_exn$0 = Export[20], + compare_float$0 = Export[21], + equal_float$0 = Export[22], + hash_fold_float$0 = Export[23], + hash_float$0 = Export[24], + float_of_sexp$0 = Export[25], + sexp_of_float$0 = Export[26], + float_sexp_grammar$0 = Export[27], + compare_int$0 = Export[28], + equal_int$0 = Export[29], + hash_fold_int$0 = Export[30], + hash_int$0 = Export[31], + int_of_sexp$0 = Export[32], + sexp_of_int$0 = Export[33], + int_sexp_grammar$0 = Export[34], + compare_int32$0 = Export[35], + equal_int32$0 = Export[36], + hash_fold_int32$0 = Export[37], + hash_int32$0 = Export[38], + int32_of_sexp$0 = Export[39], + sexp_of_int32$0 = Export[40], + int32_sexp_grammar$0 = Export[41], + compare_int64$0 = Export[42], + equal_int64$0 = Export[43], + hash_fold_int64$0 = Export[44], + hash_int64$0 = Export[45], + int64_of_sexp$0 = Export[46], + sexp_of_int64$0 = Export[47], + int64_sexp_grammar$0 = Export[48], + compare_list$0 = Export[49], + equal_list$0 = Export[50], + hash_fold_list$0 = Export[51], + list_of_sexp$0 = Export[52], + sexp_of_list$0 = Export[53], + list_sexp_grammar$0 = Export[54], + compare_nativeint$0 = Export[55], + equal_nativeint$0 = Export[56], + hash_fold_nativeint$0 = Export[57], + hash_nativeint$0 = Export[58], + nativeint_of_sexp$0 = Export[59], + sexp_of_nativeint$0 = Export[60], + nativeint_sexp_grammar$0 = Export[61], + compare_option$0 = Export[62], + equal_option$0 = Export[63], + hash_fold_option$0 = Export[64], + option_of_sexp$0 = Export[65], + sexp_of_option$0 = Export[66], + option_sexp_grammar$0 = Export[67], + compare_ref$0 = Export[68], + equal_ref$0 = Export[69], + ref_of_sexp$0 = Export[70], + sexp_of_ref$0 = Export[71], + ref_sexp_grammar$0 = Export[72], + compare_string$0 = Export[73], + equal_string$0 = Export[74], + hash_fold_string$0 = Export[75], + hash_string$0 = Export[76], + string_of_sexp$0 = Export[77], + sexp_of_string$0 = Export[78], + string_sexp_grammar$0 = Export[79], + compare_bytes$0 = Export[80], + equal_bytes$0 = Export[81], + bytes_of_sexp$0 = Export[82], + sexp_of_bytes$0 = Export[83], + bytes_sexp_grammar$0 = Export[84], + compare_unit$0 = Export[85], + equal_unit$0 = Export[86], + hash_fold_unit$0 = Export[87], + hash_unit$0 = Export[88], + unit_of_sexp$0 = Export[89], + sexp_of_unit$0 = Export[90], + unit_sexp_grammar$0 = Export[91], + symbol$19 = Export[92], + symbol$20 = Export[93], + lnot$0 = Export[94], + abs$0 = Export[95], + zero$0 = Export[96], + symbol$21 = Export[97], + symbol$22 = Export[98], + symbol$23 = Export[99], + ascending$1 = Export[100], + descending$1 = Export[101], + max$1 = Export[102], + min$1 = Export[103], + symbol$24 = Export[104], + symbol$25 = Export[105], + symbol$26 = Export[106], + symbol$27 = Export[107], + symbol$28 = Export[108], + symbol$29 = Export[109], + symbol$30 = Export[110], + symbol$31 = Export[111], + fst$0 = Export[112], + snd$0 = Export[113], + failwith$0 = Export[114], + invalid_arg$0 = Export[115], + raise_s$0 = Export[116], + phys_equal$0 = Export[117], + include$0 = Base_Container_intf[1], + Continue_or_stop = include$0[1], + Not_found_s$0 = Base_Import[252]; + caml_call1(Base_Backtrace[7], 0); + var + Base = + [0, + Exit, + Not_found, + max_int, + min_int, + infinity, + neg_infinity, + nan, + max_float, + min_float, + epsilon_float, + char_of_int, + string_of_bool, + bool_of_string_opt, + bool_of_string, + string_of_int, + int_of_string_opt, + string_of_float, + float_of_string_opt, + stdin, + stdout, + stderr, + print_char, + print_string, + print_bytes, + print_int, + print_float, + print_endline, + print_newline, + prerr_char, + prerr_string, + prerr_bytes, + prerr_int, + prerr_float, + prerr_endline, + prerr_newline, + read_line, + read_int_opt, + read_int, + read_float_opt, + read_float, + open_out, + open_out_bin, + open_out_gen, + flush, + flush_all, + output_char, + output_string, + output_bytes, + output, + output_substring, + output_byte, + output_binary_int, + output_value, + seek_out, + pos_out, + out_channel_length, + close_out, + close_out_noerr, + set_binary_mode_out, + open_in, + open_in_bin, + open_in_gen, + input_char, + input_line, + input, + really_input, + really_input_string, + input_byte, + input_binary_int, + input_value, + seek_in, + pos_in, + in_channel_length, + close_in, + close_in_noerr, + set_binary_mode_in, + string_of_format, + symbol, + exit, + at_exit, + valid_float_lexem, + unsafe_really_input, + do_at_exit, + do_domain_local_at_exit, + Sexp, + Exported_for_specific_uses, + Export, + compare_array$0, + equal_array$0, + array_of_sexp$0, + sexp_of_array$0, + array_sexp_grammar$0, + compare_bool$0, + equal_bool$0, + hash_fold_bool$0, + hash_bool$0, + bool_of_sexp$0, + sexp_of_bool$0, + bool_sexp_grammar$0, + compare_char$0, + equal_char$0, + hash_fold_char$0, + hash_char$0, + char_of_sexp$0, + sexp_of_char$0, + char_sexp_grammar$0, + sexp_of_exn$0, + compare_float$0, + equal_float$0, + hash_fold_float$0, + hash_float$0, + float_of_sexp$0, + sexp_of_float$0, + float_sexp_grammar$0, + compare_int$0, + equal_int$0, + hash_fold_int$0, + hash_int$0, + int_of_sexp$0, + sexp_of_int$0, + int_sexp_grammar$0, + compare_int32$0, + equal_int32$0, + hash_fold_int32$0, + hash_int32$0, + int32_of_sexp$0, + sexp_of_int32$0, + int32_sexp_grammar$0, + compare_int64$0, + equal_int64$0, + hash_fold_int64$0, + hash_int64$0, + int64_of_sexp$0, + sexp_of_int64$0, + int64_sexp_grammar$0, + compare_list$0, + equal_list$0, + hash_fold_list$0, + list_of_sexp$0, + sexp_of_list$0, + list_sexp_grammar$0, + compare_nativeint$0, + equal_nativeint$0, + hash_fold_nativeint$0, + hash_nativeint$0, + nativeint_of_sexp$0, + sexp_of_nativeint$0, + nativeint_sexp_grammar$0, + compare_option$0, + equal_option$0, + hash_fold_option$0, + option_of_sexp$0, + sexp_of_option$0, + option_sexp_grammar$0, + compare_ref$0, + equal_ref$0, + ref_of_sexp$0, + sexp_of_ref$0, + ref_sexp_grammar$0, + compare_string$0, + equal_string$0, + hash_fold_string$0, + hash_string$0, + string_of_sexp$0, + sexp_of_string$0, + string_sexp_grammar$0, + compare_bytes$0, + equal_bytes$0, + bytes_of_sexp$0, + sexp_of_bytes$0, + bytes_sexp_grammar$0, + compare_unit$0, + equal_unit$0, + hash_fold_unit$0, + hash_unit$0, + unit_of_sexp$0, + sexp_of_unit$0, + unit_sexp_grammar$0, + symbol$19, + symbol$20, + lnot$0, + abs$0, + zero$0, + symbol$21, + symbol$22, + symbol$23, + ascending$1, + descending$1, + max$1, + min$1, + symbol$24, + symbol$25, + symbol$26, + symbol$27, + symbol$28, + symbol$29, + symbol$30, + symbol$31, + fst$0, + snd$0, + failwith$0, + invalid_arg$0, + raise_s$0, + phys_equal$0, + Continue_or_stop, + Not_found_s$0]; + runtime.caml_register_global(21, Base, "Base"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/jane-street-headers/jane_street_headers.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_sexp_conv.runtime-lib/ppx_sexp_conv_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_compare.runtime-lib/ppx_compare_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_enumerate.runtime-lib/ppx_enumerate_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/ppx_hash.runtime-lib/ppx_hash_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + + +//# 1 "../../../.js/default/time_now/time_now.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/time_now/time_now.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Base_Int63 = global_data.Base__Int63, + Base = global_data.Base, + cst_gettimeofday_failed = "gettimeofday failed"; + function nanoseconds_since_unix_epoch(param){ + var t = runtime.time_now_nanoseconds_since_unix_epoch_or_zero(0); + return caml_call2(Base_Int63[17], t, Base_Int63[38]) + ? t + : caml_call1(Base[201], cst_gettimeofday_failed); + } + var Time_now = [0, nanoseconds_since_unix_epoch]; + runtime.caml_register_global(3, Time_now, "Time_now"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../../.js/default/ppx_inline_test.runtime-lib/ppx_inline_test_lib.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst$13 = "", + cst$14 = "\n", + cst$15 = " ", + cst_line = " , line ", + cst_File = " File ", + cst_threw = " threw", + cst_s$0 = "%s", + cst_s = "%s%!", + cst$12 = ".\n", + cst_Ppx_inline_test_lib_Runtim$0 = "Ppx_inline_test_lib__Runtime", + cst_TES = "TES", + cst_TESTING_FRAMEWORK = "TESTING_FRAMEWORK", + cst_T_MODULE_at$0 = "T_MODULE at ", + cst_T_MODULES = "T_MODULES", + cst_inline_test_runner$0 = "inline-test-runner", + cst_inline_tests_log$0 = "inline_tests.log", + cst_ppx_inline_test_error_the_ = + "ppx_inline_test error: the following -only-test flags matched nothing:", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_obj_tag = runtime.caml_obj_tag, + caml_string_equal = runtime.caml_string_equal, + caml_string_notequal = runtime.caml_string_notequal, + caml_sys_argv = runtime.caml_sys_argv, + caml_sys_getenv = runtime.caml_sys_getenv, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + cst$11 = cst$13, + cst$9 = cst$14, + cst$10 = cst$15, + cst$7 = cst$14, + cst$8 = cst$15, + cst$5 = cst$14, + cst$6 = " ", + cst$3 = cst$14, + cst$4 = cst$13, + cst$2 = ".", + cst$0 = cst$13, + cst$1 = ": ", + enable_everything = [0, 0, 0], + cst = cst$13, + am_running_inline_test_env_var = cst_TESTING_FRAMEWORK, + Stdlib_List = global_data.Stdlib__List, + Stdlib = global_data.Stdlib, + Stdlib_Printf = global_data.Stdlib__Printf, + Stdlib_Filename = global_data.Stdlib__Filename, + Sexplib0_Sexp_conv = global_data.Sexplib0__Sexp_conv, + Stdlib_String = global_data.Stdlib__String, + CamlinternalLazy = global_data.CamlinternalLazy, + Stdlib_Result = global_data.Stdlib__Result, + Base = global_data.Base, + Base_String = global_data.Base__String, + Base_List = global_data.Base__List, + Stdlib_Random = global_data.Stdlib__Random, + Base_Random = global_data.Base__Random, + Stdlib_Printexc = global_data.Stdlib__Printexc, + Base_Int63 = global_data.Base__Int63, + Time_now = global_data.Time_now, + Stdlib_Scanf = global_data.Stdlib__Scanf, + Stdlib_Hashtbl = global_data.Stdlib__Hashtbl, + Stdlib_Arg = global_data.Stdlib__Arg, + Stdlib_Array = global_data.Stdlib__Array, + _E_ = [0, [12, 32, [2, 0, [12, 58, [4, 0, 0, 0, 0]]]], " %s:%d"], + _F_ = [0, [12, 32, [2, 0, 0]], " %s"], + _z_ = + [0, + [11, + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n", + [10, 0]], + "inline_tests_runner.exe is not supposed to be run by hand, you \nshould run the inline_tests_runner script instead.\n%!"], + _A_ = + [0, + [11, + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n", + [10, 0]], + "You are doing something unexpected with the tests. No tests have \nbeen run. You should use the inline_tests_runner script to run \ntests.\n%!"], + _B_ = [0, [2, 0, [12, 10, 0]], "%s\n"], + _C_ = + [0, + [4, + 0, + 0, + 0, + [11, + " tests ran, ", + [4, 0, 0, 0, [11, " test_modules ran\n", [10, 0]]]]], + "%d tests ran, %d test_modules ran\n%!"], + _D_ = + [0, + [11, cst_ppx_inline_test_error_the_, 0], + cst_ppx_inline_test_error_the_], + _G_ = [0, [11, cst$12, [10, 0]], ".\n%!"], + _H_ = + [0, + [11, "ppx_inline_test error: no tests have been run.\n", [10, 0]], + "ppx_inline_test error: no tests have been run.\n%!"], + _J_ = [0, [11, cst_T_MODULES, 0], cst_T_MODULES], + _K_ = [0, [11, ", ", [4, 0, 0, 0, [11, " TES", 0]]], ", %d TES"], + _I_ = + [0, + [11, + "FAILED ", + [4, + 0, + 0, + 0, + [11, " / ", [4, 0, 0, 0, [11, " tests", [2, 0, [12, 10, [10, 0]]]]]]]], + "FAILED %d / %d tests%s\n%!"], + _x_ = + [0, + [11, + cst_T_MODULE_at$0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]]], + "T_MODULE at %s threw%s%s.\n%s%s\n%!"], + _y_ = [0, [11, cst_TES, 0], cst_TES], + cst_ppx_inline_test_cannot_use = + "ppx_inline_test: cannot use -list-partition or -partition without specifying a partition at preprocessing time", + _r_ = [0, [2, 0, [12, 10, [2, 0, 0]]], "%s\n%s"], + _s_ = [0, [2, 0, [10, 0]], cst_s], + _t_ = [0, 1], + _u_ = + [0, + [11, " (", [8, [0, 0, 0], 0, [0, 3], [11, " sec)\n", [10, 0]]]], + " (%.3f sec)\n%!"], + _v_ = + [0, + [2, 0, [11, " is false.\n", [2, 0, [12, 10, [10, 0]]]]], + "%s is false.\n%s\n%!"], + _w_ = + [0, + [2, + 0, + [11, + cst_threw, + [2, 0, [2, 0, [11, cst$12, [2, 0, [2, 0, [12, 10, [10, 0]]]]]]]]], + "%s threw%s%s.\n%s%s\n%!"], + _q_ = [0, [2, 0, [10, 0]], cst_s], + _p_ = [0, [2, 0, [10, 0]], cst_s], + _o_ = [0, [12, 10, [2, 0, [12, 10, [10, 0]]]], "\n%s\n%!"], + cst_T_MODULE_at = cst_T_MODULE_at$0, + cst_in_TES = " in TES", + cst_time_without_resetting_ran = "time_without_resetting_random_seeds", + cst_Ppx_inline_test_lib_Runtim = cst_Ppx_inline_test_lib_Runtim$0, + cst_inline_tests_log = cst_inline_tests_log$0, + _S_ = + [0, + [11, + "Argument ", + [2, + 0, + [11, " doesn't fit the format filename[:line_number]\n", [10, 0]]]], + "Argument %s doesn't fit the format filename[:line_number]\n%!"], + _O_ = + [0, + [2, + 0, + [11, ": unexpected anonymous argument ", [2, 0, [12, 10, [10, 0]]]]], + "%s: unexpected anonymous argument %s\n%!"], + _h_ = + [0, + [11, + cst_File, + [3, + 0, + [11, + cst_line, + [4, + 0, + 0, + 0, + [11, + " , characters ", + [4, 0, 0, 0, [11, " - ", [4, 0, 0, 0, [12, 32, [10, 0]]]]]]]]]], + " File %S , line %d , characters %d - %d %!"], + _g_ = + [0, + [11, cst_File, [3, 0, [11, cst_line, [4, 0, 0, 0, [12, 32, [10, 0]]]]]], + " File %S , line %d %!"], + _f_ = [0, [11, cst_File, [3, 0, [12, 32, [10, 0]]]], " File %S %!"], + _e_ = + [0, + [11, + "File ", + [3, + 0, + [11, + ", line ", + [4, + 0, + 0, + 0, + [11, + ", characters ", + [4, 0, 0, 0, [12, 45, [4, 0, 0, 0, [2, 0, 0]]]]]]]]], + "File %S, line %d, characters %d-%d%s"], + _a_ = [0, [2, 0, 0], cst_s$0], + _b_ = [0, [2, 0, 0], cst_s$0], + cst_success = "success", + cst_failure = "failure", + cst_error = "error", + cst_inline_test_runner = cst_inline_test_runner$0, + _N_ = + [0, + [2, 0, [12, 32, [2, 0, [12, 32, [2, 0, [11, " [args]", 0]]]]]], + "%s %s %s [args]"], + cst_Path_to_the_root_of_the_so = " Path to the root of the source tree", + cst_source_tree_root = "-source-tree-root", + cst_Allow_output_patterns_in_t = + " Allow output patterns in tests expectations", + cst_allow_output_patterns = "-allow-output-patterns", + cst_Diff_command_for_tests_tha = + " Diff command for tests that require diffing (use - to disable diffing)", + cst_diff_cmd = "-diff-cmd", + cst_Update_expect_tests_in_pla = " Update expect tests in place", + cst_in_place = "-in-place", + cst_Summarize_tests_without_us = " Summarize tests without using color", + cst_no_color = "-no-color", + cst_location_Run_only_the_test = + 'location Run only the tests specified by all the -only-test options.\n Locations can be one of these forms:\n - file.ml\n - file.ml:line_number\n - File "file.ml"\n - File "file.ml", line 23\n - File "file.ml", line 23, characters 2-3', + cst_only_test = "-only-test", + cst_substring_Only_run_tests_w = + "substring Only run tests whose names contain the given substring", + cst_matching = "-matching", + cst_tag_Only_run_tests_tagged_ = + "tag Only run tests tagged with [tag] (overrides previous -drop-tag)", + cst_require_tag = "-require-tag", + cst_tag_Only_run_tests_not_tag = + "tag Only run tests not tagged with [tag] (overrides previous -require-tag)", + cst_drop_tag = "-drop-tag", + cst_Log_the_tests_run_in_inlin = " Log the tests run in inline_tests.log", + cst_log = "-log", + cst_Show_the_number_of_tests_r = " Show the number of tests ran", + cst_show_counts = "-show-counts", + cst_End_with_an_error_if_no_te = " End with an error if no tests were run", + cst_strict = "-strict", + cst_Run_tests_only_up_to_the_f = + " Run tests only up to the first error (doesn't work for expect tests)", + cst_stop_on_error = "-stop-on-error", + cst_Show_the_tests_as_they_run = " Show the tests as they run", + cst_verbose = "-verbose", + cst_Only_run_the_tests_in_the_ = + " Only run the tests in the given partition", + cst_partition = "-partition", + cst_Lists_all_the_partitions_t = + " Lists all the partitions that contain at least one test or test_module", + cst_list_partitions = "-list-partitions", + cst_Do_not_run_tests_but_show_ = + " Do not run tests but show what would have been run", + cst_list_test_names = "-list-test-names", + _n_ = [0, 187165616, 545942154], + _L_ = [0, 187165616, -863538453]; + function to_string(param){ + switch(param){ + case 0: + return cst_success; + case 1: + return cst_failure; + default: return cst_error; + } + } + function combine(t1, t2){ + var switch$0 = 0; + switch(t1){ + case 0: + if(! t2) return 0; break; + case 1: break; + default: switch$0 = 1; + } + if(! switch$0 && 2 !== t2) return 1; + return 2; + } + function combine_all(ts){ + return caml_call3(Stdlib_List[25], combine, 0, ts); + } + var + test_modules_ran = [0, 0], + test_modules_failed = [0, 0], + tests_ran = [0, 0], + tests_failed = [0, 0], + dynamic_lib = [0, 0], + action = [0, -950194894]; + try{ + caml_sys_getenv("FORCE_DROP_INLINE_TEST"); + var _aa_ = 1, force_drop = _aa_; + } + catch(_bY_){ + var _c_ = caml_wrap_exception(_bY_); + if(_c_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_c_, 0); + var force_drop = 0; + } + function get(param){return force_drop ? -950194894 : action[1];} + var _d_ = caml_call2(Stdlib_Hashtbl[1], 0, 23), current = [0, cst]; + function found_test(param){ + var + _bW_ = caml_string_notequal(current[1], cst$13), + _bX_ = _bW_ ? 1 - caml_call2(Stdlib_Hashtbl[9], _d_, current[1]) : _bW_; + return _bX_ ? caml_call3(Stdlib_Hashtbl[5], _d_, current[1], 0) : _bX_; + } + function is_current(param){ + if(! param) return 1; + var p = param[1]; + return caml_string_equal(p, current[1]); + } + var current$0 = [0, 0]; + function current_tags(param){ + var t = current$0[1]; + function _bU_(m){return m[2];} + var _bV_ = caml_call2(Stdlib_List[19], _bU_, t); + return caml_call1(Stdlib_List[13], _bV_); + } + var + verbose = [0, 0], + strict = [0, 0], + show_counts = [0, 0], + list_test_names = [0, 0], + delayed_errors = [0, 0], + stop_on_error = [0, 0], + log = [0, 0], + time_sec = [0, 0.], + use_color = [0, 1], + in_place = [0, 0], + diff_command = [0, 0], + source_tree_root = [0, 0], + allow_output_patterns = [0, 0]; + function displayed_descr(param){ + var _bS_ = caml_obj_tag(param); + if(250 === _bS_) + var descr = param[1]; + else{ + var switch$0 = 0; + if(246 !== _bS_ && 244 !== _bS_){var descr = param; switch$0 = 1;} + if(! switch$0) var descr = caml_call1(CamlinternalLazy[2], param); + } + return function(filename, line, start_pos, end_pos){ + var + _bT_ = + caml_string_equal(descr, cst$13) + ? cst$0 + : caml_call2(Stdlib[28], cst$1, descr); + return caml_call6 + (Stdlib_Printf[4], _e_, filename, line, start_pos, end_pos, _bT_);}; + } + var + _i_ = caml_sys_argv(0), + match = caml_call1(Stdlib_Array[9], _i_), + switch$0 = 0; + if(match){ + var _j_ = match[2]; + if(_j_){ + var name = match[1]; + if(! caml_string_notequal(_j_[1], cst_inline_test_runner$0)){ + var match$0 = _j_[2]; + if(match$0){ + var rest = match$0[2], lib = match$0[1]; + if(Base[86][1]){ + var + tests = [0, 0], + list_partitions = [0, 0], + partition = [0, 0], + tag_predicate = [0, enable_everything], + name_filter = [0, 0], + msg$1 = + caml_call4 + (Stdlib_Printf[4], _N_, name, cst_inline_test_runner, lib), + f = + function(anon){ + caml_call3(Stdlib_Printf[3], _O_, name, anon); + return caml_call1(Stdlib[99], 1); + }, + _P_ = 0, + _Q_ = + [0, + [0, + cst_allow_output_patterns, + [2, allow_output_patterns], + cst_Allow_output_patterns_in_t], + [0, + [0, + cst_source_tree_root, + [4, function(s){source_tree_root[1] = [0, s]; return 0;}], + cst_Path_to_the_root_of_the_so], + _P_]], + _R_ = + [0, + [0, cst_no_color, [3, use_color], cst_Summarize_tests_without_us], + [0, + [0, cst_in_place, [2, in_place], cst_Update_expect_tests_in_pla], + [0, + [0, + cst_diff_cmd, + [4, function(s){diff_command[1] = [0, s]; return 0;}], + cst_Diff_command_for_tests_tha], + _Q_]]], + _T_ = + [0, + [0, + cst_only_test, + [4, + function(str){ + try{ + var + _bK_ = + function(file, line, start_pos, end_pos){return [0, file, [0, line]]; + }, + _bL_ = [0, caml_call3(Stdlib_Scanf[5], str, _h_, _bK_)], + match = _bL_; + } + catch(_bP_){ + try{ + var + _bI_ = function(file, line){return [0, file, [0, line]];}, + _bJ_ = [0, caml_call3(Stdlib_Scanf[5], str, _g_, _bI_)], + match = _bJ_; + } + catch(_bQ_){ + try{ + var + _bG_ = function(file){return [0, file, 0];}, + _bH_ = [0, caml_call3(Stdlib_Scanf[5], str, _f_, _bG_)], + match = _bH_; + } + catch(_bR_){var match = 0;} + } + } + if(match) + var + match$0 = match[1], + index = match$0[2], + file = match$0[1], + index$0 = index, + filename = file; + else if(caml_call2(Stdlib_String[14], str, 58)){ + var + i = caml_call2(Stdlib_String[35], str, 58), + filename$0 = caml_call3(Stdlib_String[15], str, 0, i), + index_string = + caml_call3 + (Stdlib_String[15], + str, + i + 1 | 0, + (caml_ml_string_length(str) - i | 0) - 1 | 0); + try{ + var + _bN_ = runtime.caml_int_of_string(index_string), + index$1 = _bN_; + } + catch(_bO_){ + var _bM_ = caml_wrap_exception(_bO_); + if(_bM_[1] !== Stdlib[7]) + throw caml_maybe_attach_backtrace(_bM_, 0); + caml_call2(Stdlib_Printf[3], _S_, str); + var index$1 = caml_call1(Stdlib[99], 1); + } + var index$0 = [0, index$1], filename = filename$0; + } + else + var index$0 = 0, filename = str; + tests[1] = [0, [0, filename, index$0, [0, 0]], tests[1]]; + return 0; + }], + cst_location_Run_only_the_test], + _R_], + _U_ = + [0, + [0, + cst_matching, + [4, + function(s){name_filter[1] = [0, s, name_filter[1]]; return 0;}], + cst_substring_Only_run_tests_w], + _T_], + _V_ = + [0, + [0, + cst_require_tag, + [4, + function(tag){ + var t = tag_predicate[1], _bC_ = t[2]; + function _bD_(_bF_){return caml_string_notequal(tag, _bF_);} + var _bE_ = caml_call2(Stdlib_List[41], _bD_, _bC_); + tag_predicate[1] = [0, [0, tag, t[1]], _bE_]; + return 0; + }], + cst_tag_Only_run_tests_tagged_], + _U_], + _W_ = + [0, + [0, + cst_drop_tag, + [4, + function(tag){ + var t = tag_predicate[1], _by_ = [0, tag, t[2]], _bz_ = t[1]; + function _bA_(_bB_){return caml_string_notequal(tag, _bB_);} + tag_predicate[1] = + [0, caml_call2(Stdlib_List[41], _bA_, _bz_), _by_]; + return 0; + }], + cst_tag_Only_run_tests_not_tag], + _V_], + _X_ = + [0, + [0, cst_verbose, [2, verbose], cst_Show_the_tests_as_they_run], + [0, + [0, + cst_stop_on_error, + [2, stop_on_error], + cst_Run_tests_only_up_to_the_f], + [0, + [0, cst_strict, [2, strict], cst_End_with_an_error_if_no_te], + [0, + [0, + cst_show_counts, + [2, show_counts], + cst_Show_the_number_of_tests_r], + [0, + [0, + cst_log, + [0, + function(param){ + try{runtime.caml_sys_remove(cst_inline_tests_log$0);} + catch(_bx_){} + log[1] = [0, caml_call1(Stdlib[60], cst_inline_tests_log)]; + return 0; + }], + cst_Log_the_tests_run_in_inlin], + _W_]]]]], + _Y_ = + [0, + [0, + cst_partition, + [4, function(i){partition[1] = [0, i]; return 0;}], + cst_Only_run_the_tests_in_the_], + _X_], + _Z_ = + [0, + [0, + cst_list_partitions, + [0, function(param){list_partitions[1] = 1; return 0;}], + cst_Lists_all_the_partitions_t], + _Y_], + ___ = + [0, + [0, + cst_list_test_names, + [0, + function(param){ + list_test_names[1] = 1; + verbose[1] = 1; + return 0; + }], + cst_Do_not_run_tests_but_show_], + _Z_], + l = caml_call2(Stdlib_Arg[11], 0, ___), + argv = caml_call1(Stdlib_Array[10], [0, name, rest]); + try{caml_call5(Stdlib_Arg[3], 0, argv, l, f, msg$1);} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib_Arg[8]){ + var msg = exn[2]; + caml_call2(Stdlib_Printf[3], _a_, msg); + caml_call1(Stdlib[99], 1); + } + else{ + if(exn[1] !== Stdlib_Arg[7]) + throw caml_maybe_attach_backtrace(exn, 0); + var msg$0 = exn[2]; + caml_call2(Stdlib_Printf[2], _b_, msg$0); + caml_call1(Stdlib[99], 0); + } + } + var + _$_ = list_partitions[1] ? -260537174 : [0, 1025081494, partition[1]], + v = + [0, + -753295984, + [0, [0, lib, tests[1], name_filter[1], tag_predicate[1]], _$_]]; + action[1] = v; + switch$0 = 1; + } + } + } + } + } + var am_test_runner = typeof get(0) === "number" ? 0 : 1, switch$1 = 0; + try{caml_sys_getenv("PPX_INLINE_TEST_LIB_AM_RUNNING_INLINE_TEST");} + catch(_bv_){ + var _k_ = caml_wrap_exception(_bv_); + if(_k_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_k_, 0); + var switch$2 = 0; + try{var val = caml_sys_getenv(cst_TESTING_FRAMEWORK);} + catch(_bw_){ + var _l_ = caml_wrap_exception(_bw_); + if(_l_ !== Stdlib[8]) throw caml_maybe_attach_backtrace(_l_, 0); + var _m_ = 0; + switch$2 = 1; + } + if(! switch$2) + var _M_ = caml_string_notequal(val, "inline-test") ? 0 : 1, _m_ = _M_; + var am_running_inline_test = _m_; + switch$1 = 1; + } + if(! switch$1) var am_running_inline_test = 1; + var + testing = am_test_runner ? _n_ : am_running_inline_test ? _L_ : 822171972; + function wall_time_clock_ns(param){return caml_call1(Time_now[1], 0);} + var + where_to_cut_backtrace = + [246, + function(param){ + var + _bt_ = caml_call2(Stdlib[28], cst$2, cst_time_without_resetting_ran), + _bu_ = caml_call2(Stdlib[28], cst_Ppx_inline_test_lib_Runtim, _bt_); + return caml_call2(Base_String[70][2], 0, _bu_); + }]; + function time_without_resetting_random_(f){ + var before_ns = wall_time_clock_ns(0); + try{var _bs_ = [0, caml_call1(f, 0)], res = _bs_;} + catch(exn$0){ + var + exn = caml_wrap_exception(exn$0), + res = [1, [0, exn, caml_call1(Stdlib_Printexc[6], 0)]]; + } + var + _bq_ = wall_time_clock_ns(0), + _br_ = caml_call2(Base_Int63[42], _bq_, before_ns); + time_sec[1] = caml_call1(Base_Int63[3], _br_) / 1000000000.; + return res; + } + var + saved_caml_random_state = + [246, + function(_bp_){ + return caml_call1(Stdlib_Random[15][1], [0, 100, 200, 300]); + }], + saved_base_random_state = + [246, + function(_bo_){ + return caml_call1(Base_Random[18][2], [0, 111, 222, 333]); + }]; + function string_of_module_descr(param){ + var t = current$0[1]; + function _bh_(m){return m[1];} + var _bi_ = caml_call2(Stdlib_List[19], _bh_, t); + function _bj_(s){ + var + _bl_ = caml_call1(Stdlib_String[28], s), + _bm_ = caml_call2(Stdlib[28], _bl_, cst$3), + _bn_ = caml_call2(Stdlib[28], cst_T_MODULE_at, _bm_); + return caml_call2(Stdlib[28], cst_in_TES, _bn_); + } + var _bk_ = caml_call2(Stdlib_List[19], _bj_, _bi_); + return caml_call2(Stdlib_String[6], cst$4, _bk_); + } + function print_delayed_errors(param){ + var delayed_errors$0 = caml_call1(Stdlib_List[9], delayed_errors[1]); + if(! delayed_errors$0) return 0; + var _bf_ = caml_call2(Stdlib_String[1], 70, 61); + caml_call2(Stdlib_Printf[3], _o_, _bf_); + function _bg_(message){return caml_call2(Stdlib_Printf[3], _p_, message);} + return caml_call2(Stdlib_List[17], _bg_, delayed_errors$0); + } + function eprintf_or_delay(fmt){ + function _bd_(s){ + if(verbose[1]) + delayed_errors[1] = [0, s, delayed_errors[1]]; + else + caml_call2(Stdlib_Printf[3], _q_, s); + var _be_ = stop_on_error[1]; + return _be_ ? (print_delayed_errors(0), caml_call1(Stdlib[99], 2)) : _be_; + } + return caml_call2(Stdlib_Printf[10], _bd_, fmt); + } + function add_hooks(C){ + return function(f, param){caml_call1(C[1], 0); return caml_call1(f, 0);}; + } + function hum_backtrace(backtrace){ + var + _a7_ = caml_call1(Base_String[88], backtrace), + _a8_ = Base_List[133], + _a9_ = + caml_call2 + (_a8_, + _a7_, + function(str){ + var _bb_ = caml_obj_tag(where_to_cut_backtrace); + if(250 === _bb_) + var _bc_ = where_to_cut_backtrace[1]; + else{ + var switch$0 = 0; + if(246 !== _bb_ && 244 !== _bb_){ + var _bc_ = where_to_cut_backtrace; + switch$0 = 1; + } + if(! switch$0) + var + _bc_ = caml_call1(CamlinternalLazy[2], where_to_cut_backtrace); + } + return 1 - caml_call2(Base_String[70][5], _bc_, str); + }), + _a__ = Base_List[76], + _a$_ = + caml_call2 + (_a__, + _a9_, + function(str){ + var _ba_ = caml_call2(Base[198], str, cst$5); + return caml_call2(Base[198], cst$6, _ba_); + }); + return caml_call2(Base_String[54], 0, _a$_); + } + function test_inner + (config, + descr, + tags, + def_filename, + def_line_number, + start_pos, + end_pos, + f, + bool_of_f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _aN_ = match[2], + what_to_do = _aN_[2], + match$0 = _aN_[1], + which_tags = match$0[4], + name_filter = match$0[3], + only_test_location = match$0[2], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + descr$0 = + [246, + function(_a6_){ + return caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos); + }], + _aO_ = current_tags(0), + complete_tags = caml_call2(Stdlib[37], tags, _aO_), + _aP_ = caml_equal([0, libname], dynamic_lib[1]); + if(_aP_){ + if(only_test_location) + var + _aL_ = + function(param){ + var + used = param[3], + line_number_opt = param[2], + filename = param[1], + position_start = + caml_ml_string_length(def_filename) + - caml_ml_string_length(filename) + | 0, + _a1_ = 0 <= position_start ? 1 : 0; + if(_a1_){ + var + end_of_def_filename = + caml_call3 + (Stdlib_String[15], + def_filename, + position_start, + caml_ml_string_length(filename)), + _a2_ = caml_string_equal(end_of_def_filename, filename); + if(_a2_){ + var + _a3_ = 0 === position_start ? 1 : 0, + _a4_ = + _a3_ + || + (47 + === + runtime.caml_string_get + (def_filename, position_start - 1 | 0) + ? 1 + : 0); + if(_a4_) + if(line_number_opt) + var + line_number = line_number_opt[1], + _a5_ = caml_equal(def_line_number, line_number); + else + var _a5_ = 1; + else + var _a5_ = _a4_; + } + else + var _a5_ = _a2_; + var found = _a5_; + } + else + var found = _a1_; + if(found) used[1] = 1; + return found; + }, + _aQ_ = caml_call2(Stdlib_List[33], _aL_, only_test_location); + else + var _aQ_ = 1; + if(_aQ_){ + var + _aC_ = which_tags[1], + _aD_ = + function(req){ + return 1 - caml_call2(Stdlib_List[36], req, complete_tags); + }, + _aE_ = caml_call2(Stdlib_List[33], _aD_, _aC_); + if(_aE_) + var _aR_ = _aE_; + else + var + _aF_ = which_tags[2], + _aG_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, complete_tags); + }, + _aR_ = caml_call2(Stdlib_List[33], _aG_, _aF_); + var _aS_ = 1 - _aR_; + if(_aS_){ + var _aT_ = caml_obj_tag(descr$0); + if(250 === _aT_) + var descr$1 = descr$0[1]; + else{ + var switch$0 = 0; + if(246 !== _aT_ && 244 !== _aT_){var descr$1 = descr$0; switch$0 = 1;} + if(! switch$0) var descr$1 = caml_call1(CamlinternalLazy[2], descr$0); + } + if(name_filter) + var + _aM_ = + function(substring){ + return caml_call2(Base_String[76], descr$1, substring); + }, + _aU_ = caml_call2(Stdlib_List[33], _aM_, name_filter); + else + var _aU_ = 1; + var should_run = _aU_; + } + else + var should_run = _aS_; + } + else + var should_run = _aQ_; + } + else + var should_run = _aP_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _aV_ = is_current(partition); + if(_aV_){ + var _aW_ = caml_obj_tag(descr$0); + if(250 === _aW_) + var descr$2 = descr$0[1]; + else{ + var switch$1 = 0; + if(246 !== _aW_ && 244 !== _aW_){var descr$2 = descr$0; switch$1 = 1;} + if(! switch$1) var descr$2 = caml_call1(CamlinternalLazy[2], descr$0); + } + tests_ran[1]++; + var match$1 = log[1]; + if(match$1){ + var ch = match$1[1], _aX_ = string_of_module_descr(0); + caml_call4(Stdlib_Printf[1], ch, _r_, descr$2, _aX_); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _s_, descr$2); + if(list_test_names[1]) + var result$0 = _t_; + else{ + var + caml_random_state = caml_call1(Stdlib_Random[16], 0), + base_random_state = caml_call1(Base_Random[18][4], Base_Random[18][1]), + _aH_ = caml_obj_tag(saved_caml_random_state); + if(250 === _aH_) + var _aI_ = saved_caml_random_state[1]; + else{ + var switch$2 = 0; + if(246 !== _aH_ && 244 !== _aH_){ + var _aI_ = saved_caml_random_state; + switch$2 = 1; + } + if(! switch$2) + var _aI_ = caml_call1(CamlinternalLazy[2], saved_caml_random_state); + } + caml_call1(Stdlib_Random[17], _aI_); + var _aJ_ = caml_obj_tag(saved_base_random_state); + if(250 === _aJ_) + var _aK_ = saved_base_random_state[1]; + else{ + var switch$3 = 0; + if(246 !== _aJ_ && 244 !== _aJ_){ + var _aK_ = saved_base_random_state; + switch$3 = 1; + } + if(! switch$3) + var _aK_ = caml_call1(CamlinternalLazy[2], saved_base_random_state); + } + caml_call1(Base_Random[19], _aK_); + var result = time_without_resetting_random_(f$0); + caml_call1(Stdlib_Random[17], caml_random_state); + caml_call1(Base_Random[19], base_random_state); + var result$0 = caml_call2(Stdlib_Result[8], bool_of_f, result); + } + if(verbose[1]) caml_call2(Stdlib_Printf[2], _u_, time_sec[1]); + if(0 !== result$0[0]){ + var match$2 = result$0[1], backtrace = match$2[2], exn = match$2[1]; + tests_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$7 : cst$8, + _aZ_ = string_of_module_descr(0); + return caml_call5 + (eprintf_or_delay(_w_), + descr$2, + sep, + exn_str, + backtrace$0, + _aZ_); + } + if(result$0[1]) return 0; + tests_failed[1]++; + var _aY_ = string_of_module_descr(0); + return caml_call2(eprintf_or_delay(_v_), descr$2, _aY_); + } + var _a0_ = _aV_; + } + else + var _a0_ = should_run; + return _a0_; + } + function set_lib_and_partition(static_lib, partition){ + if(dynamic_lib[1]) return 0; + dynamic_lib[1] = [0, static_lib]; + var match = get(0); + if(typeof match === "number") return 0; + var + match$0 = match[2], + what_to_do = match$0[2], + which_tests = match$0[1], + _aB_ = caml_string_equal(which_tests[1], static_lib); + if(! _aB_) return _aB_; + var switch$0 = 0; + if(typeof what_to_do !== "number" && ! what_to_do[2]){var requires_partition = 0; switch$0 = 1;} + if(! switch$0) var requires_partition = 1; + if(caml_string_equal(partition, cst$13) && requires_partition) + return caml_call1(Stdlib[2], cst_ppx_inline_test_cannot_use); + current[1] = partition; + return 0; + } + function unset_lib(static_lib){ + var match = dynamic_lib[1]; + if(! match) return 0; + var + lib = match[1], + _az_ = caml_string_equal(lib, static_lib), + _aA_ = _az_ ? (dynamic_lib[1] = 0, 0) : _az_; + return _aA_; + } + function test + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(b){return b;}); + } + function test_unit + (config, descr, tags, filename, line_number, start_pos, end_pos, f){ + return test_inner + (config, + descr, + tags, + filename, + line_number, + start_pos, + end_pos, + f, + function(param){return 1;}); + } + function test_module + (config, descr, tags, def_filename, def_line_number, start_pos, end_pos, f){ + var match = get(0); + if(typeof match === "number") return 0; + var + _as_ = match[2], + what_to_do = _as_[2], + match$0 = _as_[1], + which_tags = match$0[4], + libname = match$0[1], + f$0 = caml_call1(add_hooks(config), f), + _at_ = current_tags(0), + partial_tags = caml_call2(Stdlib[37], tags, _at_), + _au_ = caml_equal([0, libname], dynamic_lib[1]); + if(_au_) + var + _aq_ = which_tags[2], + _ar_ = + function(dropped){ + return caml_call2(Stdlib_List[36], dropped, partial_tags); + }, + should_run = 1 - caml_call2(Stdlib_List[33], _ar_, _aq_); + else + var should_run = _au_; + if(should_run){ + if(typeof what_to_do === "number") return found_test(0); + var partition = what_to_do[2], _av_ = is_current(partition); + if(_av_){ + test_modules_ran[1]++; + var + descr$0 = + caml_call4 + (displayed_descr(descr), + def_filename, + def_line_number, + start_pos, + end_pos), + prev = current$0[1]; + current$0[1] = [0, [0, descr$0, tags], prev]; + try{var x = time_without_resetting_random_(f$0); current$0[1] = prev;} + catch(e$0){ + var e = caml_wrap_exception(e$0); + current$0[1] = prev; + throw caml_maybe_attach_backtrace(e, 0); + } + if(0 === x[0]) return 0; + var match$1 = x[1], backtrace = match$1[2], exn = match$1[1]; + test_modules_failed[1]++; + var + backtrace$0 = hum_backtrace(backtrace), + exn_str = caml_call1(Sexplib0_Sexp_conv[68], exn), + sep = caml_call2(Stdlib_String[14], exn_str, 10) ? cst$9 : cst$10, + _aw_ = string_of_module_descr(0), + _ax_ = caml_call1(Stdlib_String[28], descr$0); + return caml_call5 + (eprintf_or_delay(caml_call2(Stdlib[98], _y_, _x_)), + _ax_, + sep, + exn_str, + backtrace$0, + _aw_); + } + var _ay_ = _av_; + } + else + var _ay_ = should_run; + return _ay_; + } + function summarize(param){ + var match = get(0); + if(typeof match === "number"){ + var switch$0 = 0; + if(runtime.caml_notequal(caml_sys_argv(0), [0])){ + var _ai_ = runtime.caml_check_bound(caml_sys_argv(0), 0)[1]; + if + (caml_string_equal + (caml_call1(Stdlib_Filename[13], _ai_), "inline_tests_runner.exe")){caml_call1(Stdlib_Printf[3], _z_); switch$0 = 1;} + } + if(! switch$0) caml_call1(Stdlib_Printf[3], _A_); + return 2; + } + var _aj_ = match[2], which_tests = _aj_[1]; + if(typeof _aj_[2] === "number"){ + var + _ae_ = 0, + _af_ = function(k, param, acc){return [0, k, acc];}, + _ag_ = caml_call3(Stdlib_Hashtbl[14], _af_, _d_, _ae_), + _ah_ = caml_call2(Stdlib_List[56], Stdlib_String[9], _ag_), + _ak_ = caml_call1(Stdlib_Printf[2], _B_); + caml_call2(Stdlib_List[17], _ak_, _ah_); + return 0; + } + var match$0 = log[1]; + if(match$0){var ch = match$0[1]; caml_call1(Stdlib[76], ch);} + print_delayed_errors(0); + var count = tests_failed[1], count_test_modules = test_modules_failed[1]; + if(0 === count && 0 === count_test_modules){ + if(show_counts[1]) + caml_call3(Stdlib_Printf[3], _C_, tests_ran[1], test_modules_ran[1]); + var + _al_ = which_tests[2], + _am_ = function(param){var used = param[3]; return 1 - used[1];}, + unused_tests = caml_call2(Stdlib_List[41], _am_, _al_), + errors = unused_tests ? [0, unused_tests] : 0; + if(errors){ + var tests = errors[1]; + caml_call1(Stdlib_Printf[3], _D_); + var + _an_ = + function(param){ + var line_number_opt = param[2], filename = param[1]; + if(! line_number_opt) + return caml_call2(Stdlib_Printf[3], _F_, filename); + var line_number = line_number_opt[1]; + return caml_call3(Stdlib_Printf[3], _E_, filename, line_number); + }; + caml_call2(Stdlib_List[17], _an_, tests); + caml_call1(Stdlib_Printf[3], _G_); + return 2; + } + if(0 === tests_ran[1] && strict[1]){ + caml_call1(Stdlib_Printf[3], _H_); + return 2; + } + return 0; + } + if(0 === count_test_modules) + var _ao_ = cst$11; + else + var + _ap_ = caml_call2(Stdlib[98], _K_, _J_), + _ao_ = caml_call2(Stdlib_Printf[4], _ap_, count_test_modules); + caml_call4(Stdlib_Printf[3], _I_, count, tests_ran[1], _ao_); + return 1; + } + var + use_color$0 = use_color[1], + in_place$0 = in_place[1], + diff_command$0 = diff_command[1], + source_tree_root$0 = source_tree_root[1], + allow_output_patterns$0 = allow_output_patterns[1], + evaluators = [0, [0, summarize, 0]]; + function add_evaluator(f){evaluators[1] = [0, f, evaluators[1]]; return 0;} + function exit(param){ + var _ab_ = caml_call1(Stdlib_List[9], evaluators[1]); + function _ac_(f){return caml_call1(f, 0);} + switch(combine_all(caml_call2(Stdlib_List[19], _ac_, _ab_))){ + case 0: + var _ad_ = 0; break; + case 1: + var _ad_ = 2; break; + default: var _ad_ = 1; + } + return caml_call1(Stdlib[99], _ad_); + } + var + Ppx_inline_test_lib_Runtime = + [0, + [0, combine, combine_all, to_string], + set_lib_and_partition, + unset_lib, + test, + test_unit, + test_module, + testing, + use_color$0, + in_place$0, + diff_command$0, + source_tree_root$0, + allow_output_patterns$0, + am_running_inline_test, + am_running_inline_test_env_var, + add_evaluator, + exit]; + runtime.caml_register_global + (124, Ppx_inline_test_lib_Runtime, cst_Ppx_inline_test_lib_Runtim$0); + return; + } + (globalThis)); + + +//# 1 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 52 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std, cst); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Interfaces = [0]; + runtime.caml_register_global + (4, Fmlib_std_Interfaces, "Fmlib_std__Interfaces"); + return; + } + (globalThis)); + +//# 81 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_12345678901234567890123456 = "12345678901234567890123456789012", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_string_ml$0 = "src/std/string.ml", + caml_bytes_set = runtime.caml_bytes_set, + caml_create_bytes = runtime.caml_create_bytes, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_ml_string_length = runtime.caml_ml_string_length, + caml_string_equal = runtime.caml_string_equal, + caml_string_get = runtime.caml_string_get; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + str = cst_12345678901234567890123456, + cst = "", + Stdlib_Bytes = global_data.Stdlib__Bytes, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_String = global_data.Stdlib__String, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + make = Stdlib_String[1], + init = Stdlib_String[2], + concat = Stdlib_String[6], + compare = Stdlib_String[9], + sub = Stdlib_String[15], + split_on_char = Stdlib_String[16], + _b_ = [0, cst_src_std_string_ml$0, 107, 8], + _a_ = [0, cst_src_std_string_ml$0, 103, 8], + cst_src_std_string_ml = cst_src_std_string_ml$0, + cst_str_From_make_with_size_2_ = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function one(c){return caml_call2(make, 1, c);} + function is_prefix(a, b){ + var + len_a = caml_ml_string_length(a), + _i_ = len_a <= caml_ml_string_length(b) ? 1 : 0, + _j_ = _i_ ? caml_string_equal(a, caml_call3(sub, b, 0, len_a)) : _i_; + return _j_; + } + function is_suffix(a, b){ + var + len_a = caml_ml_string_length(a), + len_b = caml_ml_string_length(b), + _g_ = len_a <= len_b ? 1 : 0, + _h_ = + _g_ + ? caml_string_equal(a, caml_call3(sub, b, len_b - len_a | 0, len_a)) + : _g_; + return _h_; + } + function find(f, start, s){ + var len = caml_ml_string_length(s), i = start; + for(;;){ + if(i !== len && ! caml_call1(f, caml_string_get(s, i))){var i$0 = i + 1 | 0, i = i$0; continue;} + return i; + } + } + function has(f, start, s){ + return find(f, start, s) < caml_ml_string_length(s) ? 1 : 0; + } + function find_bwd(f, beyond, s){ + var len = caml_ml_string_length(s), switch$0 = 0; + if(0 <= beyond && len >= beyond){var beyond$0 = beyond; switch$0 = 1;} + if(! switch$0) var beyond$0 = len; + var i = beyond$0; + for(;;){ + if(0 !== i && ! caml_call1(f, caml_string_get(s, i - 1 | 0))){var i$0 = i - 1 | 0, i = i$0; continue;} + return i - 1 | 0; + } + } + function list(s){ + var i$0 = caml_ml_string_length(s), cs = 0, i = i$0; + for(;;){ + if(0 === i) return cs; + var + j = i - 1 | 0, + cs$0 = [0, caml_string_get(s, j), cs], + cs = cs$0, + i = j; + } + } + function of_list(cs){ + function str(cs, i){ + if(! cs) return caml_create_bytes(i); + var cs$0 = cs[2], c = cs[1], bs = str(cs$0, i + 1 | 0); + caml_bytes_set(bs, i, c); + return bs; + } + var bs = str(cs, 0); + return caml_call1(Stdlib_Bytes[44], bs); + } + function reverse(s){ + var len = caml_ml_string_length(s); + return caml_call2 + (init, + len, + function(i){return caml_string_get(s, (len - 1 | 0) - i | 0);}); + } + function has_more(param){ + var s = param[2], i = param[1]; + return i < caml_ml_string_length(s) ? 1 : 0; + } + function peek(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return caml_string_get(s, i); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function advance(param){ + var s = param[2], i = param[1]; + if(has_more([0, i, s])) return [0, i + 1 | 0, s]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function make$0(s){return [0, 0, s];} + var To_source = [0, has_more, peek, advance, make$0]; + function From_source(R){ + function make_with_size(estimate, r){ + var + estimate$0 = 0 < estimate ? estimate : 80, + buffer = [0, caml_create_bytes(estimate$0)], + len = [0, 0], + capacity = [0, estimate$0], + r$0 = r; + for(;;){ + if(! caml_call1(R[1], r$0)) + return caml_call3(Stdlib_Bytes[8], buffer[1], 0, len[1]); + var c = caml_call1(R[2], r$0); + if(len[1] === capacity[1]){ + var bnew = caml_create_bytes(2 * capacity[1] | 0); + caml_call5(Stdlib_Bytes[11], buffer[1], 0, bnew, 0, len[1]); + buffer[1] = bnew; + capacity[1] = 2 * capacity[1] | 0; + } + caml_bytes_set(buffer[1], len[1], c); + len[1] = len[1] + 1 | 0; + var r$1 = caml_call1(R[3], r$0), r$0 = r$1; + } + } + function make(r){return make_with_size(100, r);} + return [0, make_with_size, make]; + } + function _c_(param){ + var + From = From_source([0, To_source[1], To_source[2], To_source[3]]), + _f_ = caml_call1(To_source[4], str); + return caml_string_equal + (cst_12345678901234567890123456, caml_call2(From[1], 2, _f_)); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_str_From_make_with_size_2_, + 0, + cst_src_std_string_ml, + 162, + 0, + 166, + _c_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_String = + [0, + is_prefix, + is_suffix, + reverse, + compare, + one, + find, + has, + find_bwd, + list, + of_list, + caml_ml_string_length, + caml_string_get, + sub, + concat, + split_on_char, + make, + init, + To_source, + function(_d_){var _e_ = From_source(_d_); return [0, _e_[2], _e_[1]];}]; + runtime.caml_register_global(13, Fmlib_std_String, "Fmlib_std__String"); + return; + } + (globalThis)); + +//# 437 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_Int = global_data.Stdlib__Int; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var compare = Stdlib_Int[9], cst_fmlib_std = cst_fmlib_std$0; + function iterate(n, f, start){ + var n$0 = n, v = start; + for(;;){ + if(0 === n$0) return v; + var v$0 = caml_call1(f, v), n$1 = n$0 - 1 | 0, n$0 = n$1, v = v$0; + } + } + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Int = [0, compare, iterate]; + runtime.caml_register_global(5, Fmlib_std_Int, "Fmlib_std__Int"); + return; + } + (globalThis)); + +//# 474 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime, cst_fmlib_std$0 = "fmlib_std"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var cst_fmlib_std = cst_fmlib_std$0; + function return$0(a){return [0, a];} + var fail = 0; + function let$0(m, f){ + if(! m) return 0; + var a = m[1]; + return caml_call1(f, a); + } + function map(f, m){ + return let$0(m, function(a){return [0, caml_call1(f, a)];}); + } + function to_list(m){if(! m) return 0; var a = m[1]; return [0, a, 0];} + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var Fmlib_std_Option = [0, return$0, fail, let$0, let$0, map, to_list]; + runtime.caml_register_global(4, Fmlib_std_Option, "Fmlib_std__Option"); + return; + } + (globalThis)); + +//# 514 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_insert_downward_0_3_SetInt$3 = + "<<((insert_downward 0 3 SetInt.empty) |> (SetIn[...]>>", + cst_insert_upward_0_3_SetInt_e$2 = + "<<((insert_upward 0 3 SetInt.empty) |> (insert_[...]>>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_array_ml$12 = "src/std/array.ml", + caml_check_bound = runtime.caml_check_bound, + caml_equal = runtime.caml_equal, + caml_make_vect = runtime.caml_make_vect, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Int = global_data.Fmlib_std__Int, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Stdlib_Array = global_data.Stdlib__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + init = Stdlib_Array[1], + append = Stdlib_Array[3], + sub = Stdlib_Array[5], + copy = Stdlib_Array[6], + blit = Stdlib_Array[8], + to_list = Stdlib_Array[9], + of_list = Stdlib_Array[10], + map = Stdlib_Array[13], + fold_left = Stdlib_Array[15], + fold_right = Stdlib_Array[17], + for_all = Stdlib_Array[20], + exists = Stdlib_Array[21], + _Y_ = [0, 0], + _U_ = [0, 2, 0], + _V_ = [0, 1, 0], + _S_ = + [0, [0, 0, 0], [0, 1, 0], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0]], + _O_ = [0, 2, 0], + _P_ = [0, 1, 0], + _Q_ = [0, 0, 0], + _K_ = [0, 2, 0], + _L_ = [0, 1, 0], + _M_ = [0, 0, 0], + _H_ = [0, 2, 0], + _I_ = [0, 0, 0], + _D_ = [0, 2, 0], + _E_ = [0, 1, 0], + _F_ = [0, 0, 0], + _z_ = [0, 2, 0], + _A_ = [0, 1, 0], + _B_ = [0, 0, 0], + _x_ = [0, 1, 0], + _v_ = [0, 0, 1], + _t_ = [0, 0, 0], + _r_ = [0, 0, 0], + _p_ = [0, cst_src_std_array_ml$12, 332, 8], + _o_ = [0, cst_src_std_array_ml$12, 333, 8], + _n_ = [0, cst_src_std_array_ml$12, 235, 8], + _m_ = [0, cst_src_std_array_ml$12, 161, 16], + _l_ = [0, cst_src_std_array_ml$12, 162, 16], + _k_ = [0, cst_src_std_array_ml$12, 101, 4], + _j_ = [0, cst_src_std_array_ml$12, 94, 4], + _i_ = [0, cst_src_std_array_ml$12, 79, 4], + _h_ = [0, cst_src_std_array_ml$12, 80, 4], + _g_ = [0, cst_src_std_array_ml$12, 85, 4], + _f_ = [0, cst_src_std_array_ml$12, 67, 4], + _e_ = [0, cst_src_std_array_ml$12, 68, 4], + _d_ = [0, cst_src_std_array_ml$12, 54, 4], + _c_ = [0, cst_src_std_array_ml$12, 55, 4], + _b_ = [0, cst_src_std_array_ml$12, 25, 4], + _a_ = [0, cst_src_std_array_ml$12, 19, 4], + cst_src_std_array_ml = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_ = + "<<(binsearch Int.compare Fun.id 100 [||]) = (0,[...]>>", + cst_src_std_array_ml$0 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$0 = + "<<(binsearch Int.compare Fun.id 99 [|100|]) = ([...]>>", + cst_src_std_array_ml$1 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$1 = + "<<(binsearch Int.compare Fun.id 100 [|100|]) = [...]>>", + cst_src_std_array_ml$2 = cst_src_std_array_ml$12, + cst_binsearch_Int_compare_Fun_$2 = + "<<(binsearch Int.compare Fun.id 101 [|100|]) = [...]>>", + cst_src_std_array_ml$3 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e = + "<<(insert_upward 0 3 SetInt.empty) = [|(0, ());[...]>>", + cst_src_std_array_ml$4 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt = + "<<(insert_downward 0 3 SetInt.empty) = [|(0, ()[...]>>", + cst_src_std_array_ml$5 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$0 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$6 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$1 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$7 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$0 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$8 = cst_src_std_array_ml$12, + cst_insert_upward_0_3_SetInt_e$1 = cst_insert_upward_0_3_SetInt_e$2, + cst_src_std_array_ml$9 = cst_src_std_array_ml$12, + cst_insert_downward_0_3_SetInt$2 = cst_insert_downward_0_3_SetInt$3, + cst_src_std_array_ml$10 = cst_src_std_array_ml$12, + cst_SetInt_index_of_3_set_None = "<<(SetInt.index_of 3 set) = None>>", + cst_src_std_array_ml$11 = cst_src_std_array_ml$12, + cst_SetInt_index_of_0_set_Some = "<<(SetInt.index_of 0 set) = (Some 0)>>", + cst_fmlib_std = cst_fmlib_std$0; + function is_empty(xs){return 0 === xs.length - 1 ? 1 : 0;} + function valid_index(i, xs){ + var _aX_ = 0 <= i ? 1 : 0, _aY_ = _aX_ ? i < xs.length - 1 ? 1 : 0 : _aX_; + return _aY_; + } + function has_some(xs){return 0 < xs.length - 1 ? 1 : 0;} + function first(xs){ + if(has_some(xs)) return caml_check_bound(xs, 0)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function last(xs){ + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var _aW_ = len - 1 | 0; + return caml_check_bound(xs, _aW_)[1 + _aW_]; + } + function foldi_left(f, start, xs){ + var _aV_ = [0, start, 0]; + return caml_call3 + (fold_left, + function(param, e){ + var idx = param[2], start = param[1]; + return [0, caml_call3(f, start, idx, e), idx + 1 | 0]; + }, + _aV_, + xs) + [1]; + } + function push(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 0, len); + return xs_new; + } + function push_front(x, xs){ + var len = xs.length - 1, xs_new = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, xs_new, 1, len); + return xs_new; + } + function insert(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i > xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var len = xs.length - 1, arr = caml_make_vect(len + 1 | 0, x); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i, arr, i + 1 | 0, len - i | 0); + return arr; + } + function replace(i, x, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + var arr = caml_call1(copy, xs); + caml_check_bound(arr, i)[1 + i] = x; + return arr; + } + function remove(i, xs){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(i >= xs.length - 1) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + var len = xs.length - 1; + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + var arr = caml_make_vect(len - 1 | 0, caml_check_bound(xs, 0)[1]); + caml_call5(blit, xs, 0, arr, 0, i); + caml_call5(blit, xs, i + 1 | 0, arr, i, len - (i + 1 | 0) | 0); + return arr; + } + function remove_first(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 1, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + } + function remove_last(xs){ + var len = xs.length - 1; + if(0 < len) return caml_call3(sub, xs, 0, len - 1 | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + } + function find(p, arr){ + var len = arr.length - 1, i = 0; + for(;;){ + if(i === len) return 0; + if(caml_call1(p, caml_check_bound(arr, i)[1 + i])) return [0, i]; + var i$0 = i + 1 | 0, i = i$0; + } + } + function binsearch(compare, key_of, key, arr){ + var len = arr.length - 1; + if(0 === len) return [0, len, 0]; + if(1 === len){ + var + cmp = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])); + return 0 < cmp ? [0, len, 0] : [0, 0, 0 === cmp ? 1 : 0]; + } + var + upper$0 = len - 1 | 0, + cmp$1 = + caml_call2 + (compare, key, caml_call1(key_of, caml_check_bound(arr, 0)[1])), + lower$1 = 0; + if(0 >= cmp$1) return [0, lower$1, 0 === cmp$1 ? 1 : 0]; + var + cmp$2 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, upper$0)[1 + upper$0])); + if(0 <= cmp$2) return 0 === cmp$2 ? [0, upper$0, 1] : [0, len, 0]; + var lower = lower$1, upper = upper$0; + for(;;){ + if((lower + 1 | 0) === upper) return [0, upper, 0]; + var lower$0 = lower + ((upper - lower | 0) / 2 | 0) | 0; + if(lower >= lower$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(lower$0 >= upper) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var + cmp$0 = + caml_call2 + (compare, + key, + caml_call1(key_of, caml_check_bound(arr, lower$0)[1 + lower$0])); + if(0 === cmp$0) return [0, lower$0, 1]; + if(0 <= cmp$0){var lower = lower$0; continue;} + var upper = lower$0; + } + } + function Map(Key){ + function cardinal(map){return map.length - 1;} + function is_empty(map){return 0 === map.length - 1 ? 1 : 0;} + function bindings(map){return caml_call1(to_list, map);} + function fold_left(f, start, map){ + function _aU_(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + } + return caml_call3(Stdlib_Array[15], _aU_, start, map); + } + function fold_right(f, start, map){ + function _aT_(param, result){ + var value = param[2], key = param[1]; + return caml_call3(f, result, key, value); + } + return caml_call3(Stdlib_Array[17], _aT_, map, start); + } + function index_of(key, map){ + var len = map.length - 1; + function _aR_(_aS_){return _aS_[1];} + var + match = binsearch(Key[1], _aR_, key, map), + exact = match[2], + i = match[1]; + if(i !== len && exact) return [0, i]; + return 0; + } + function pair(i, map){ + if(i < map.length - 1) return caml_check_bound(map, i)[1 + i]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + } + function find_opt(key, map){ + var _aP_ = index_of(key, map); + function _aQ_(i){return caml_check_bound(map, i)[1 + i][2];} + return caml_call2(Fmlib_std_Option[5], _aQ_, _aP_); + } + function mem(key, map){return 0 !== index_of(key, map) ? 1 : 0;} + var empty = [0]; + function singleton(key, value){return [0, [0, key, value]];} + function add(key, value, map){ + function _aN_(_aO_){return _aO_[1];} + var + match = binsearch(Key[1], _aN_, key, map), + exact = match[2], + i = match[1]; + return exact + ? replace(i, [0, key, value], map) + : insert(i, [0, key, value], map); + } + function update(key, f, map){ + function _aL_(_aM_){return _aM_[1];} + var + match = binsearch(Key[1], _aL_, key, map), + exact = match[2], + i = match[1]; + if(exact){ + var match$0 = caml_call1(f, [0, caml_check_bound(map, i)[1 + i][2]]); + if(! match$0) return remove(i, map); + var value = match$0[1]; + return replace(i, [0, key, value], map); + } + var match$1 = caml_call1(f, 0); + if(! match$1) return map; + var value$0 = match$1[1]; + return insert(i, [0, key, value$0], map); + } + function remove$0(key, map){ + function _aJ_(_aK_){return _aK_[1];} + var + match = binsearch(Key[1], _aJ_, key, map), + exact = match[2], + i = match[1]; + return exact ? remove(i, map) : map; + } + return [0, + cardinal, + is_empty, + bindings, + fold_left, + fold_right, + index_of, + pair, + find_opt, + mem, + empty, + singleton, + add, + update, + remove$0]; + } + function Set(Key){ + var M = Map(Key); + function cardinal(set){return caml_call1(M[1], set);} + var is_empty = M[2]; + function fold_left(f, start, set){ + function _aI_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[4], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(res, key, param){return caml_call2(f, res, key);} + return caml_call3(M[5], _aH_, start, set); + } + function elements(set){ + var _aG_ = 0; + return fold_right(function(lst, key){return [0, key, lst];}, _aG_, set); + } + function element(i, set){ + if(0 > i) throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + if(i < cardinal(set)) return caml_call2(M[7], i, set)[1]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + } + var index_of = M[6], empty = M[10]; + function singleton(e){return caml_call2(M[11], e, 0);} + var mem = M[9]; + function add(e, set){return caml_call3(M[12], e, 0, set);} + var remove = M[14]; + return [0, + M, + cardinal, + is_empty, + fold_left, + fold_right, + elements, + element, + index_of, + empty, + singleton, + mem, + add, + remove]; + } + function _q_(param){ + var _aC_ = [0], _aD_ = 100; + function _aE_(_aF_){return _aF_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aE_, _aD_, _aC_), _r_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_, + 0, + cst_src_std_array_ml, + 372, + 0, + 67, + _q_); + function _s_(param){ + var _ay_ = [0, 100], _az_ = 99; + function _aA_(_aB_){return _aB_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aA_, _az_, _ay_), _t_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$0, + 0, + cst_src_std_array_ml$0, + 377, + 0, + 69, + _s_); + function _u_(param){ + var _au_ = [0, 100], _av_ = 100; + function _aw_(_ax_){return _ax_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _aw_, _av_, _au_), _v_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$1, + 0, + cst_src_std_array_ml$1, + 382, + 0, + 69, + _u_); + function _w_(param){ + var _aq_ = [0, 100], _ar_ = 101; + function _as_(_at_){return _at_;} + return caml_equal(binsearch(Fmlib_std_Int[1], _as_, _ar_, _aq_), _x_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_binsearch_Int_compare_Fun_$2, + 0, + cst_src_std_array_ml$2, + 387, + 0, + 70, + _w_); + var SetInt = Set([0, Fmlib_std_Int[1]]); + function insert_downward(lower, beyond, set){ + var i = beyond, set$0 = set; + for(;;){ + if(i === lower) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(SetInt[12], i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function insert_upward(lower, beyond, set){ + var i = lower, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(SetInt[12], i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function _y_(param){ + return caml_equal(insert_upward(0, 3, SetInt[9]), [0, _B_, _A_, _z_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e, + 0, + cst_src_std_array_ml$3, + 418, + 0, + 70, + _y_); + function _C_(param){ + return caml_equal(insert_downward(0, 3, SetInt[9]), [0, _F_, _E_, _D_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt, + 0, + cst_src_std_array_ml$4, + 422, + 0, + 72, + _C_); + function _G_(param){ + var _ap_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 1), _ap_), [0, _I_, _H_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$0, + 0, + cst_src_std_array_ml$5, + 426, + 0, + 85, + _G_); + function _J_(param){ + var _ao_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 4), _ao_), [0, _M_, _L_, _K_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$1, + 0, + cst_src_std_array_ml$6, + 430, + 0, + 92, + _J_); + function _N_(param){ + return caml_equal + (insert_downward(0, 3, insert_upward(0, 3, SetInt[9])), + [0, _Q_, _P_, _O_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$0, + 0, + cst_src_std_array_ml$7, + 434, + 0, + 103, + _N_); + function _R_(param){ + var _an_ = _S_.slice(); + return caml_equal + (insert_downward(3, 6, insert_upward(0, 3, SetInt[9])), _an_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_upward_0_3_SetInt_e$1, + 0, + cst_src_std_array_ml$8, + 440, + 0, + 121, + _R_); + function _T_(param){ + var _am_ = insert_downward(0, 3, SetInt[9]); + return caml_equal + (caml_call1(caml_call1(SetInt[13], 0), _am_), [0, _V_, _U_]); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_insert_downward_0_3_SetInt$2, + 0, + cst_src_std_array_ml$9, + 446, + 0, + 95, + _T_); + function _W_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return 0 === caml_call2(SetInt[8], 3, set) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_3_set_None, + 0, + cst_src_std_array_ml$10, + 452, + 0, + 95, + _W_); + function _X_(param){ + var set = insert_downward(0, 3, SetInt[9]); + return caml_equal(caml_call2(SetInt[8], 0, set), _Y_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_SetInt_index_of_0_set_Some, + 0, + cst_src_std_array_ml$11, + 457, + 0, + 97, + _X_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _Z_(_ak_){ + var _al_ = Map(_ak_); + return [0, + _al_[2], + _al_[1], + _al_[4], + _al_[5], + _al_[3], + _al_[8], + _al_[10], + _al_[12], + _al_[14], + _al_[13], + _al_[7], + _al_[11]]; + } + function ___(_ai_){ + var _aj_ = Set(_ai_); + return [0, + _aj_[3], + _aj_[2], + _aj_[11], + _aj_[4], + _aj_[5], + _aj_[6], + _aj_[9], + _aj_[12], + _aj_[13], + _aj_[7], + _aj_[8], + _aj_[10]]; + } + var _$_ = caml_make_vect; + function _aa_(_ah_, _ag_, _af_){ + caml_check_bound(_ah_, _ag_)[1 + _ag_] = _af_; + return 0; + } + function _ab_(_ae_, _ad_){return caml_check_bound(_ae_, _ad_)[1 + _ad_];} + var + Fmlib_std_Array = + [0, + function(_ac_){return _ac_.length - 1;}, + valid_index, + is_empty, + has_some, + _ab_, + first, + last, + _aa_, + _$_, + init, + append, + insert, + replace, + remove, + remove_first, + remove_last, + map, + fold_left, + foldi_left, + fold_right, + copy, + sub, + blit, + find, + for_all, + exists, + push, + push_front, + to_list, + of_list, + binsearch, + ___, + _Z_]; + runtime.caml_register_global(73, Fmlib_std_Array, "Fmlib_std__Array"); + return; + } + (globalThis)); + +//# 1709 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_list_ml$2 = "src/std/list.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Assert_failure = global_data.Assert_failure, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Stdlib_List = global_data.Stdlib__List, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + length = Stdlib_List[1], + rev = Stdlib_List[9], + append = Stdlib_List[11], + rev_append = Stdlib_List[12], + concat = Stdlib_List[13], + map = Stdlib_List[19], + mapi = Stdlib_List[20], + rev_map = Stdlib_List[21], + fold_left = Stdlib_List[25], + fold_right = Stdlib_List[26], + for_all = Stdlib_List[32], + exists = Stdlib_List[33], + filter = Stdlib_List[41], + split = Stdlib_List[54], + _o_ = + [0, + [0, 1, [0, 4, 0]], + [0, [0, 2, [0, 5, 0]], [0, [0, 3, [0, 6, 0]], 0]]], + _p_ = [0, [0, 1, [0, 2, [0, 3, 0]]], [0, [0, 4, [0, 5, [0, 6, 0]]], 0]], + _l_ = [0, [0, 1, 0], [0, [0, 2, 0], [0, [0, 3, 0], 0]]], + _m_ = [0, [0, 1, [0, 2, [0, 3, 0]]], 0], + _i_ = [0, [0, 1, 0], 0], + _j_ = [0, [0, 1, 0], 0], + _g_ = [0, cst_src_std_list_ml$2, 97, 12], + _f_ = [0, cst_src_std_list_ml$2, 86, 20], + _e_ = [0, 0, 0], + _d_ = [0, cst_src_std_list_ml$2, 79, 4], + _b_ = [0, cst_src_std_list_ml$2, 37, 4], + _c_ = [0, cst_src_std_list_ml$2, 40, 8], + cst_src_std_list_ml = cst_src_std_list_ml$2, + cst_transpose_1_1 = "<<(transpose [[1]]) = [[1]]>>", + cst_src_std_list_ml$0 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_1_2_3 = + "<<(transpose [[1; 2; 3]]) = [[1]; [2]; [3]]>>", + cst_src_std_list_ml$1 = cst_src_std_list_ml$2, + cst_transpose_1_2_3_4_5_6_1_4 = + "<<(transpose [[1; 2; 3]; [4; 5; 6]]) = [[1; 4];[...]>>", + cst_fmlib_std = cst_fmlib_std$0, + _a_ = Stdlib_List[38]; + function return$0(a){return [0, a, 0];} + function symbol_bind(l, f){ + if(! l) return 0; + var + tl = l[2], + hd = l[1], + _x_ = symbol_bind(tl, f), + _y_ = caml_call1(f, hd); + return caml_call2(Stdlib[37], _y_, _x_); + } + function symbol(f, g, a){return symbol_bind(caml_call1(f, a), g);} + function symbol$0(flst, lst){ + return symbol_bind(flst, function(f){return caml_call2(map, f, lst);}); + } + function find(p, l){ + try{var _v_ = [0, caml_call2(_a_, p, l)]; return _v_;} + catch(_w_){ + var _u_ = caml_wrap_exception(_w_); + if(_u_ === Stdlib[8]) return 0; + throw caml_maybe_attach_backtrace(_u_, 0); + } + } + function split_head_tail(lst){ + if(0 === lst) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + if(! lst) throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var tl = lst[2], hd = lst[1]; + return [0, hd, tl]; + } + function map_and_filter(f, l){ + function map(param){ + var param$0 = param; + for(;;){ + if(! param$0) return 0; + var tl = param$0[2], hd = param$0[1], match = caml_call1(f, hd); + if(match){var b = match[1]; return [0, b, map(tl)];} + var param$0 = tl; + } + } + return map(l); + } + function split_at(p, rest){ + var prefix = 0, rest$0 = rest; + for(;;){ + if(! rest$0) return [0, caml_call1(rev, prefix), rest$0]; + var rest$1 = rest$0[2], hd = rest$0[1]; + if(caml_call1(p, hd)) return [0, caml_call1(rev, prefix), rest$0]; + var prefix$0 = [0, hd, prefix], prefix = prefix$0, rest$0 = rest$1; + } + } + function transpose(row_list){ + if(0 === row_list) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var columns = 0, row_list$0 = row_list; + for(;;){ + if(! row_list$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + if(! row_list$0[1]) return caml_call1(rev, columns); + var + match = + caml_call3 + (fold_right, + function(row, param){ + var row_list = param[2], column = param[1]; + if(! row) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var rest_row = row[2], el = row[1]; + return [0, [0, el, column], [0, rest_row, row_list]]; + }, + row_list$0, + _e_), + row_list$1 = match[2], + column = match[1], + columns$0 = [0, column, columns], + columns = columns$0, + row_list$0 = row_list$1; + } + } + function _h_(param){return caml_equal(transpose(_j_), _i_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_1, + 0, + cst_src_std_list_ml, + 137, + 0, + 44, + _h_); + function _k_(param){return caml_equal(transpose(_m_), _l_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_1_2_3, + 0, + cst_src_std_list_ml$0, + 141, + 0, + 66, + _k_); + function _n_(param){return caml_equal(transpose(_p_), _o_);} + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_transpose_1_2_3_4_5_6_1_4, + 0, + cst_src_std_list_ml$1, + 145, + 0, + 81, + _n_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + var + Fmlib_std_List = + [0, + return$0, + symbol_bind, + symbol_bind, + symbol, + symbol$0, + concat, + find, + append, + concat, + split, + rev, + rev_append, + length, + filter, + fold_left, + fold_right, + map, + mapi, + rev_map, + for_all, + exists, + split_head_tail, + map_and_filter, + split_at, + transpose, + function(M){ + function foldi_left(f, l, start){ + function foldi(i, l, start){ + if(! l) return caml_call1(M[1], start); + var tl = l[2], hd = l[1], _q_ = i + 1 | 0; + function _r_(_t_){return foldi(_q_, tl, _t_);} + var _s_ = caml_call3(f, i, hd, start); + return caml_call2(M[2], _s_, _r_); + } + return foldi(0, l, start); + } + function fold_left(f, l, start){ + return foldi_left(function(param){return f;}, l, start); + } + function fold_right(f, l, start){ + return fold_left(f, caml_call1(rev, l), start); + } + return [0, fold_left, fold_right, foldi_left]; + }]; + runtime.caml_register_global(26, Fmlib_std_List, "Fmlib_std__List"); + return; + } + (globalThis)); + +//# 2148 "../../std/.fmlib_std.objs/jsoo/default/fmlib_std.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_Set3_check_range_100_200_s$2 = "<>", + cst_Set4_check_range_100_200_s$2 = "<>", + cst_let_open_Map3_in_let_map_a$3 = + "<>", + cst_fmlib_std$0 = "fmlib_std", + cst_src_std_btree_ml$15 = "src/std/btree.ml", + caml_equal = runtime.caml_equal, + caml_list_of_js_array = runtime.caml_list_of_js_array, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call8(f, a0, a1, a2, a3, a4, a5, a6, a7){ + return (f.l >= 0 ? f.l : f.l = f.length) == 8 + ? f(a0, a1, a2, a3, a4, a5, a6, a7) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5, a6, a7]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Fmlib_std_Option = global_data.Fmlib_std__Option, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Int = global_data.Fmlib_std__Int; + global_data.Stdlib; + var Fmlib_std_List = global_data.Fmlib_std__List; + global_data.Fmlib_std__String; + global_data.Stdlib__Unit; + var + Fmlib_std_Array = global_data.Fmlib_std__Array, + Ppx_inline_test_lib_Runtime = global_data.Ppx_inline_test_lib__Runtime, + Inline_test_config = global_data.Inline_test_config; + caml_call2(Ppx_inline_test_lib_Runtime[2], cst_fmlib_std$0, cst); + var + O32 = [0, 32], + _aa_ = + caml_list_of_js_array + ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]), + _U_ = [0, cst_src_std_btree_ml$15, 1130, 8], + _K_ = [0, cst_src_std_btree_ml$15, 990, 8], + _J_ = [0, cst_src_std_btree_ml$15, 980, 8], + _v_ = [0, cst_src_std_btree_ml$15, 381, 16], + _D_ = [0, cst_src_std_btree_ml$15, 604, 12], + _E_ = [0, cst_src_std_btree_ml$15, 616, 12], + _H_ = [0, cst_src_std_btree_ml$15, 825, 8], + _G_ = [0, cst_src_std_btree_ml$15, 833, 12], + _F_ = [0, cst_src_std_btree_ml$15, 787, 8], + _C_ = [0, cst_src_std_btree_ml$15, 572, 12], + _B_ = [0, cst_src_std_btree_ml$15, 503, 8], + _A_ = [0, cst_src_std_btree_ml$15, 485, 8], + _z_ = [0, cst_src_std_btree_ml$15, 466, 8], + _y_ = [0, cst_src_std_btree_ml$15, 436, 8], + _x_ = [0, cst_src_std_btree_ml$15, 423, 8], + _w_ = [0, cst_src_std_btree_ml$15, 424, 8], + _o_ = [0, cst_src_std_btree_ml$15, 293, 12], + _q_ = [0, cst_src_std_btree_ml$15, 310, 20], + _p_ = [0, cst_src_std_btree_ml$15, 311, 20], + _r_ = [0, cst_src_std_btree_ml$15, 324, 20], + _s_ = [0, cst_src_std_btree_ml$15, 334, 20], + _t_ = [0, cst_src_std_btree_ml$15, 348, 20], + _u_ = [0, cst_src_std_btree_ml$15, 359, 20], + _n_ = [0, cst_src_std_btree_ml$15, 223, 8], + _m_ = [0, cst_src_std_btree_ml$15, 205, 8], + _l_ = [0, cst_src_std_btree_ml$15, 206, 8], + _k_ = [0, cst_src_std_btree_ml$15, 207, 8], + _j_ = [0, cst_src_std_btree_ml$15, 208, 8], + _i_ = [0, cst_src_std_btree_ml$15, 193, 8], + _h_ = [0, cst_src_std_btree_ml$15, 194, 8], + _g_ = [0, cst_src_std_btree_ml$15, 195, 8], + _e_ = [0, cst_src_std_btree_ml$15, 109, 20], + _d_ = [0, cst_src_std_btree_ml$15, 114, 24], + _c_ = [0, cst_src_std_btree_ml$15, 115, 24], + _f_ = [0, cst_src_std_btree_ml$15, 107, 16], + _a_ = [0, cst_src_std_btree_ml$15, 81, 20], + _b_ = [0, cst_src_std_btree_ml$15, 79, 16], + _I_ = [0, cst_src_std_btree_ml$15, 20, 8], + cst_src_std_btree_ml = cst_src_std_btree_ml$15, + cst_let_open_Map_in_cardinal_e = + "<<(let open Map in cardinal empty) = 0>>", + cst_src_std_btree_ml$0 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$1 = cst_src_std_btree_ml$15, + cst_Set4_check_range_0_100_set = "<>", + cst_src_std_btree_ml$2 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$3 = cst_src_std_btree_ml$15, + cst_Set3_check_range_0_100_set = "<>", + cst_src_std_btree_ml$4 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$0 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$5 = cst_src_std_btree_ml$15, + cst_Set3_check_range_100_200_s$1 = cst_Set3_check_range_100_200_s$2, + cst_src_std_btree_ml$6 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$0 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$7 = cst_src_std_btree_ml$15, + cst_Set4_check_range_100_200_s$1 = cst_Set4_check_range_100_200_s$2, + cst_src_std_btree_ml$8 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a = + "<>", + cst_src_std_btree_ml$9 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$0 = + "<>", + cst_src_std_btree_ml$10 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_u = + "<>", + cst_src_std_btree_ml$11 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$1 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$12 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_map_a$2 = cst_let_open_Map3_in_let_map_a$3, + cst_src_std_btree_ml$13 = cst_src_std_btree_ml$15, + cst_let_open_Map3_in_let_f_i_i = + "<>", + cst_src_std_btree_ml$14 = cst_src_std_btree_ml$15, + cst_let_open_Set3_in_let_modul = + "<>", + cst_fmlib_std = cst_fmlib_std$0; + function Map0(_aJ_, Key){ + var order = _aJ_[1]; + if(3 > order) + throw caml_maybe_attach_backtrace([0, Assert_failure, _I_], 1); + var + odd_order = ((order / 2 | 0) * 2 | 0) < order ? 1 : 0, + max_keys = order - 1 | 0, + min_keys = odd_order ? (order - 1 | 0) / 2 | 0 : (order / 2 | 0) - 1 | 0; + function is_empty(map){ + if(0 !== map[0]) return 0; + var keys = map[1]; + return 0 === caml_call1(Fmlib_std_Array[1], keys) ? 1 : 0; + } + function cardinal(map){ + if(0 === map[0]){ + var keys = map[1]; + return caml_call1(Fmlib_std_Array[1], keys); + } + var + children = map[2], + keys$0 = map[1], + _bi_ = caml_call1(Fmlib_std_Array[1], keys$0); + function _bj_(n, child){return n + cardinal(child) | 0;} + return caml_call3(Fmlib_std_Array[18], _bj_, _bi_, children); + } + var empty = [0, [0]]; + function fold_left(f, start, map){ + function fold(accu, map){ + var accu$0 = accu, map$0 = map; + a: + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + _bf_ = + function(a, param){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[18], _bf_, accu$0, pairs); + } + var + children = map$0[2], + pairs$0 = map$0[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var accu$1 = accu$0, i = 0; + for(;;){ + if(i >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + if(i === n){ + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i), + accu$0 = accu$1, + map$0 = map$1; + continue a; + } + var + i$0 = i + 1 | 0, + _bg_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[2], + _bh_ = caml_call2(Fmlib_std_Array[5], pairs$0, i)[1], + accu$2 = + caml_call3 + (f, + fold(accu$1, caml_call2(Fmlib_std_Array[5], children, i)), + _bh_, + _bg_), + accu$1 = accu$2, + i = i$0; + } + } + } + return fold(start, map); + } + function fold_right(f, start, map){ + function fold(accu, map){ + if(0 === map[0]){ + var + pairs = map[1], + _bc_ = + function(param, a){ + var value = param[2], key = param[1]; + return caml_call3(f, a, key, value); + }; + return caml_call3(Fmlib_std_Array[20], _bc_, pairs, accu); + } + var + children = map[2], + pairs$0 = map[1], + n = caml_call1(Fmlib_std_Array[1], pairs$0); + if((n + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _f_], 1); + var + accu$2 = fold(accu, caml_call2(Fmlib_std_Array[5], children, n)), + accu$0 = accu$2, + i = n; + for(;;){ + if(0 > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _e_], 1); + if(0 === i) return accu$0; + var i$0 = i - 1 | 0; + if(0 > i$0) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + if(i$0 >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var + _bd_ = caml_call2(Fmlib_std_Array[5], children, i$0), + _be_ = caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2], + accu$1 = + fold + (caml_call3 + (f, + accu$0, + caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[1], + _be_), + _bd_), + accu$0 = accu$1, + i = i$0; + } + } + return fold(start, map); + } + function bindings(map){ + var _bb_ = 0; + return fold_right + (function(lst, key, value){return [0, [0, key, value], lst];}, + _bb_, + map); + } + function keys(map){ + var _ba_ = 0; + return fold_right + (function(lst, key, param){return [0, key, lst];}, _ba_, map); + } + function bsearch(key, arr){ + function _a__(_a$_){return _a$_[1];} + return caml_call4(Fmlib_std_Array[31], Key[1], _a__, key, arr); + } + function find_opt(key, map){ + var map$0 = map; + for(;;){ + if(0 === map$0[0]){ + var + pairs = map$0[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + return exact ? [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]] : 0; + } + var + children = map$0[2], + pairs$0 = map$0[1], + match$0 = bsearch(key, pairs$0), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0) return [0, caml_call2(Fmlib_std_Array[5], pairs$0, i$0)[2]]; + var + map$1 = caml_call2(Fmlib_std_Array[5], children, i$0), + map$0 = map$1; + } + } + function subarray(arr, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + if(beyond <= caml_call1(Fmlib_std_Array[1], arr)) + return caml_call3(Fmlib_std_Array[22], arr, start, beyond - start | 0); + throw caml_maybe_attach_backtrace([0, Assert_failure, _g_], 1); + } + function insert_subarray(arr, i, x, start, beyond){ + if(0 > start) + throw caml_maybe_attach_backtrace([0, Assert_failure, _m_], 1); + if(start > i) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + if(i > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _k_], 1); + if(beyond > caml_call1(Fmlib_std_Array[1], arr)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _j_], 1); + var + arr2 = caml_call2(Fmlib_std_Array[9], (beyond - start | 0) + 1 | 0, x); + caml_call5(Fmlib_std_Array[23], arr, start, arr2, 0, i - start | 0); + caml_call5 + (Fmlib_std_Array[23], + arr, + i, + arr2, + (i - start | 0) + 1 | 0, + beyond - i | 0); + return arr2; + } + function split_subarray(arr, i, x, y, start, beyond){ + if(i >= beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _n_], 1); + var arr$0 = insert_subarray(arr, i, x, start, beyond); + caml_call3(Fmlib_std_Array[8], arr$0, (i - start | 0) + 1 | 0, y); + return arr$0; + } + function add_in_leaf(key, value, pairs){ + var + len = caml_call1(Fmlib_std_Array[1], pairs), + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(exact) + return [0, + [0, caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]; + if(len < max_keys) + return [0, + [0, caml_call3(Fmlib_std_Array[12], i, [0, key, value], pairs)]]; + var _a7_ = [0, key, value]; + function insert_subarray$0(_a8_, _a9_){ + return insert_subarray(pairs, i, _a7_, _a8_, _a9_); + } + var k = order / 2 | 0; + if(odd_order){ + if(i === k){ + var left = subarray(pairs, 0, k), right = subarray(pairs, k, len); + return [1, [0, left], [0, key, value], [0, right]]; + } + if(i < k){ + var + left$0 = insert_subarray$0(0, k - 1 | 0), + right$0 = subarray(pairs, k, len); + return [1, + [0, left$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$0]]; + } + var + left$1 = subarray(pairs, 0, k), + right$1 = insert_subarray$0(k + 1 | 0, len); + return [1, + [0, left$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [0, right$1]]; + } + if(i < k){ + var + left$2 = insert_subarray$0(0, k - 1 | 0), + right$2 = subarray(pairs, k, len); + return [1, + [0, left$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$2]]; + } + var + left$3 = subarray(pairs, 0, k - 1 | 0), + right$3 = insert_subarray$0(k, len); + return [1, + [0, left$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [0, right$3]]; + } + function add_in_node(i, left, pair, right, pairs, children){ + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(len < max_keys){ + var + pairs$0 = caml_call3(Fmlib_std_Array[12], i, pair, pairs), + children$0 = caml_call3(Fmlib_std_Array[12], i, left, children); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _o_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return [0, [1, pairs$0, children$0]]; + } + var k = order / 2 | 0; + function insert_subarray$0(_a5_, _a6_){ + return insert_subarray(pairs, i, pair, _a5_, _a6_); + } + function split_subarray$0(start, beyond){ + return split_subarray(children, i, left, right, start, beyond); + } + if(odd_order){ + if(i === k){ + var + left_pairs = subarray(pairs, 0, k), + left_children = subarray(children, 0, k + 1 | 0), + right_pairs = subarray(pairs, k, len), + right_children = subarray(children, k, len + 1 | 0); + if(! caml_call2(Fmlib_std_Array[2], k, left_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _q_], 1); + if(! caml_call2(Fmlib_std_Array[2], 0, right_children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _p_], 1); + caml_call3(Fmlib_std_Array[8], left_children, k, left); + caml_call3(Fmlib_std_Array[8], right_children, 0, right); + return [1, + [1, left_pairs, left_children], + pair, + [1, right_pairs, right_children]]; + } + if(i < k){ + var + left_pairs$0 = insert_subarray$0(0, k - 1 | 0), + left_children$0 = split_subarray$0(0, k), + right_pairs$0 = subarray(pairs, k, len), + right_children$0 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$0, left_children$0], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$0, right_children$0]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _r_], 1); + } + var + left_pairs$1 = subarray(pairs, 0, k), + left_children$1 = subarray(children, 0, k + 1 | 0), + right_pairs$1 = insert_subarray$0(k + 1 | 0, len), + right_children$1 = split_subarray$0(k + 1 | 0, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k, pairs)) + return [1, + [1, left_pairs$1, left_children$1], + caml_call2(Fmlib_std_Array[5], pairs, k), + [1, right_pairs$1, right_children$1]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _s_], 1); + } + if(i < k){ + var + left_pairs$2 = insert_subarray$0(0, k - 1 | 0), + left_children$2 = split_subarray$0(0, k), + right_pairs$2 = subarray(pairs, k, len), + right_children$2 = subarray(children, k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$2, left_children$2], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$2, right_children$2]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _t_], 1); + } + var + left_pairs$3 = subarray(pairs, 0, k - 1 | 0), + left_children$3 = subarray(children, 0, k), + right_pairs$3 = insert_subarray$0(k, len), + right_children$3 = split_subarray$0(k, len + 1 | 0); + if(caml_call2(Fmlib_std_Array[2], k - 1 | 0, pairs)) + return [1, + [1, left_pairs$3, left_children$3], + caml_call2(Fmlib_std_Array[5], pairs, k - 1 | 0), + [1, right_pairs$3, right_children$3]]; + throw caml_maybe_attach_backtrace([0, Assert_failure, _u_], 1); + } + function add_aux(key, value, map){ + if(0 === map[0]){ + var pairs = map[1]; + return add_in_leaf(key, value, pairs); + } + var + children = map[2], + pairs$0 = map[1], + match = bsearch(key, pairs$0), + exact = match[2], + i = match[1]; + if(exact){ + var + pairs$1 = caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs$0); + return [0, [1, pairs$1, children]]; + } + if(! caml_call2(Fmlib_std_Array[2], i, children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _v_], 1); + var + match$0 = + add_aux(key, value, caml_call2(Fmlib_std_Array[5], children, i)); + if(0 === match$0[0]){ + var + child = match$0[1], + children$0 = caml_call3(Fmlib_std_Array[13], i, child, children); + return [0, [1, pairs$0, children$0]]; + } + var v = match$0[3], y = match$0[2], u = match$0[1]; + return add_in_node(i, u, y, v, pairs$0, children); + } + function add(key, value, map){ + var match = add_aux(key, value, map); + if(0 === match[0]){var map$0 = match[1]; return map$0;} + var right = match[3], pair = match[2], left = match[1]; + return [1, [0, pair], [0, left, right]]; + } + function not_minimal(pairs){ + return min_keys < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + function replace2(i, left, right, children){ + var children$0 = caml_call1(Fmlib_std_Array[21], children); + if(! caml_call2(Fmlib_std_Array[2], i, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _x_], 1); + if(! caml_call2(Fmlib_std_Array[2], i + 1 | 0, children$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _w_], 1); + caml_call3(Fmlib_std_Array[8], children$0, i, left); + caml_call3(Fmlib_std_Array[8], children$0, i + 1 | 0, right); + return children$0; + } + function rotate_keys(to_left, i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _y_], 1); + if(to_left){ + var + _aX_ = caml_call1(Fmlib_std_Array[15], right), + _aY_ = caml_call1(Fmlib_std_Array[6], right), + _aZ_ = caml_call3(Fmlib_std_Array[13], i, _aY_, parent), + _a0_ = caml_call2(Fmlib_std_Array[5], parent, i); + return [0, caml_call2(Fmlib_std_Array[27], _a0_, left), _aZ_, _aX_]; + } + var + _a1_ = caml_call2(Fmlib_std_Array[5], parent, i), + _a2_ = caml_call2(Fmlib_std_Array[28], _a1_, right), + _a3_ = caml_call1(Fmlib_std_Array[7], left), + _a4_ = caml_call3(Fmlib_std_Array[13], i, _a3_, parent); + return [0, caml_call1(Fmlib_std_Array[16], left), _a4_, _a2_]; + } + function rotate_children(to_left, left, right){ + if(to_left){ + var + _aT_ = caml_call1(Fmlib_std_Array[15], right), + _aU_ = caml_call1(Fmlib_std_Array[6], right); + return [0, caml_call2(Fmlib_std_Array[27], _aU_, left), _aT_]; + } + var + _aV_ = caml_call1(Fmlib_std_Array[7], left), + _aW_ = caml_call2(Fmlib_std_Array[28], _aV_, right); + return [0, caml_call1(Fmlib_std_Array[16], left), _aW_]; + } + function merge_keys(i, left, parent, right){ + if(! caml_call2(Fmlib_std_Array[2], i, parent)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _z_], 1); + var + len_left = caml_call1(Fmlib_std_Array[1], left), + len_right = caml_call1(Fmlib_std_Array[1], right), + _aS_ = caml_call2(Fmlib_std_Array[5], parent, i), + merged = + caml_call2 + (Fmlib_std_Array[9], (len_left + 1 | 0) + len_right | 0, _aS_), + parent$0 = caml_call2(Fmlib_std_Array[14], i, parent); + caml_call5(Fmlib_std_Array[23], left, 0, merged, 0, len_left); + caml_call5 + (Fmlib_std_Array[23], right, 0, merged, len_left + 1 | 0, len_right); + return [0, merged, parent$0]; + } + function merge_leaves(i, pair, pairs1, pairs2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _A_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + merged = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + caml_call3(Fmlib_std_Array[8], children$0, i, [0, merged]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function merge_nodes + (i, pair, pairs1, children1, pairs2, children2, pairs, children){ + if((i + 1 | 0) >= caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _B_], 1); + var + match = merge_keys(i, pairs1, pairs, pairs2), + pairs$0 = match[2], + pairs_new = match[1], + children$0 = caml_call2(Fmlib_std_Array[14], i, children), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0, + children_new = caml_call2(Fmlib_std_Array[11], children1, children2); + caml_call3 + (Fmlib_std_Array[8], children$0, i, [1, pairs_new, children_new]); + return [0, [1, pairs$0, children$0], pair, underflow]; + } + function handle_underflow + (i, underflow_left, left_child, right_child, pair, pairs, children){ + function not_minimal$0(pairs1, pairs2){ + return underflow_left ? not_minimal(pairs2) : not_minimal(pairs1); + } + if(0 === left_child[0]){ + var pairs1 = left_child[1]; + if(0 === right_child[0]){ + var pairs2 = right_child[1]; + if(! not_minimal$0(pairs1, pairs2)) + return merge_leaves(i, pair, pairs1, pairs2, pairs, children); + var + match = rotate_keys(underflow_left, i, pairs1, pairs, pairs2), + pairs2$0 = match[3], + pairs$0 = match[2], + pairs1$0 = match[1], + children$0 = replace2(i, [0, pairs1$0], [0, pairs2$0], children); + return [0, [1, pairs$0, children$0], pair, 0]; + } + } + else{ + var children1 = left_child[2], pairs1$1 = left_child[1]; + if(0 !== right_child[0]){ + var pairs2$1 = right_child[1], children2 = right_child[2]; + if(not_minimal$0(pairs1$1, pairs2$1)){ + var + match$0 = rotate_keys(underflow_left, i, pairs1$1, pairs, pairs2$1), + pairs2$2 = match$0[3], + pairs$1 = match$0[2], + pairs1$2 = match$0[1], + match$1 = rotate_children(underflow_left, children1, children2), + children2$0 = match$1[2], + children1$0 = match$1[1], + children$1 = + replace2 + (i, + [1, pairs1$2, children1$0], + [1, pairs2$2, children2$0], + children); + return [0, [1, pairs$1, children$1], pair, 0]; + } + var children2$1 = right_child[2]; + return merge_nodes + (i, + pair, + pairs1$1, + children1, + pairs2$1, + children2$1, + pairs, + children); + } + } + throw caml_maybe_attach_backtrace([0, Assert_failure, _C_], 1); + } + function handle_delete(i, pair, d, pairs, children){ + if(! d[3]) + return [0, + [1, pairs, caml_call3(Fmlib_std_Array[13], i, d[1], children)], + pair, + 0]; + var len = caml_call1(Fmlib_std_Array[1], pairs); + if(i < len){ + var _aQ_ = caml_call2(Fmlib_std_Array[5], children, i + 1 | 0); + return handle_underflow(i, 1, d[1], _aQ_, pair, pairs, children); + } + var i$0 = i - 1 | 0, _aR_ = d[1]; + return handle_underflow + (i$0, + 0, + caml_call2(Fmlib_std_Array[5], children, i$0), + _aR_, + pair, + pairs, + children); + } + function remove_last(map){ + if(0 === map[0]){ + var pairs = map[1], len = caml_call1(Fmlib_std_Array[1], pairs); + if(0 >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _D_], 1); + var + pair = caml_call1(Fmlib_std_Array[7], pairs), + pairs$0 = caml_call1(Fmlib_std_Array[16], pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, pairs$0], pair, underflow]; + } + var + children = map[2], + pairs$1 = map[1], + len$0 = caml_call1(Fmlib_std_Array[1], pairs$1); + if((len$0 + 1 | 0) !== caml_call1(Fmlib_std_Array[1], children)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _E_], 1); + var d = remove_last(caml_call2(Fmlib_std_Array[5], children, len$0)); + return handle_delete(len$0, d[2], d, pairs$1, children); + } + function remove_aux(key, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact) return 0; + var + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + underflow = caml_call1(Fmlib_std_Array[1], pairs) <= min_keys ? 1 : 0; + return [0, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$0 = bsearch(key, pairs$1), + exact$0 = match$0[2], + i$0 = match$0[1]; + if(exact$0){ + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [0, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + _aO_ = remove_aux(key, caml_call2(Fmlib_std_Array[5], children, i$0)); + function _aP_(d){return handle_delete(i$0, d[2], d, pairs$1, children);} + return caml_call2(Fmlib_std_Option[5], _aP_, _aO_); + } + function remove(key, map){ + var match = remove_aux(key, map); + if(! match) return map; + var d = match[1], match$0 = d[1]; + if(1 === match$0[0]){ + var children = match$0[2], pairs = match$0[1]; + if(caml_call1(Fmlib_std_Array[3], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function update_aux(key, f, map){ + if(0 === map[0]){ + var + pairs = map[1], + match = bsearch(key, pairs), + exact = match[2], + i = match[1]; + if(! exact){ + var match$1 = caml_call1(f, 0); + if(! match$1) return [0, [0, map]]; + var value$0 = match$1[1]; + return [0, add_in_leaf(key, value$0, pairs)]; + } + var + match$0 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs, i)[2]]); + if(match$0){ + var value = match$0[1]; + return [0, + [0, + [0, + caml_call3(Fmlib_std_Array[13], i, [0, key, value], pairs)]]]; + } + var + pairs$0 = caml_call2(Fmlib_std_Array[14], i, pairs), + pair = caml_call2(Fmlib_std_Array[5], pairs, i), + underflow = min_keys === caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + return [1, [0, [0, pairs$0], pair, underflow]]; + } + var + children = map[2], + pairs$1 = map[1], + match$2 = bsearch(key, pairs$1), + exact$0 = match$2[2], + i$0 = match$2[1]; + if(exact$0){ + var + match$3 = + caml_call1(f, [0, caml_call2(Fmlib_std_Array[5], pairs$1, i$0)[2]]); + if(match$3){ + var value$1 = match$3[1]; + return [0, + [0, + [1, + caml_call3 + (Fmlib_std_Array[13], i$0, [0, key, value$1], pairs$1), + children]]]; + } + var + d = remove_last(caml_call2(Fmlib_std_Array[5], children, i$0)), + pair$0 = caml_call2(Fmlib_std_Array[5], pairs$1, i$0), + pairs$2 = caml_call3(Fmlib_std_Array[13], i$0, d[2], pairs$1); + return [1, handle_delete(i$0, pair$0, d, pairs$2, children)]; + } + var + match$4 = + update_aux(key, f, caml_call2(Fmlib_std_Array[5], children, i$0)); + if(0 !== match$4[0]){ + var d$0 = match$4[1]; + return [1, handle_delete(i$0, d$0[2], d$0, pairs$1, children)]; + } + var match$5 = match$4[1]; + if(0 === match$5[0]){ + var child = match$5[1]; + return [0, + [0, + [1, + pairs$1, + caml_call3(Fmlib_std_Array[13], i$0, child, children)]]]; + } + var v = match$5[3], y = match$5[2], u = match$5[1]; + return [0, add_in_node(i$0, u, y, v, pairs$1, children)]; + } + function update(key, f, map){ + var match = update_aux(key, f, map); + if(0 === match[0]){ + var match$0 = match[1]; + if(0 === match$0[0]){var map$0 = match$0[1]; return map$0;} + var v = match$0[3], y = match$0[2], u = match$0[1]; + return [1, [0, y], [0, u, v]]; + } + var d = match[1], match$1 = d[1]; + if(1 === match$1[0]){ + var children = match$1[2], pairs = match$1[1]; + if(0 === caml_call1(Fmlib_std_Array[1], pairs)) + return caml_call2(Fmlib_std_Array[5], children, 0); + } + return d[1]; + } + function has_more(source){ + var _aN_ = source[1], match = _aN_[1]; + if(0 === match[0]){ + var i = _aN_[2], pairs = match[1]; + return i < caml_call1(Fmlib_std_Array[1], pairs) ? 1 : 0; + } + var i$0 = _aN_[2], pairs$0 = match[1]; + return i$0 < caml_call1(Fmlib_std_Array[1], pairs$0) ? 1 : 0; + } + function peek(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _F_], 1); + var _aM_ = source[1], match = _aM_[1]; + if(0 === match[0]){ + var i = _aM_[2], pairs = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs, i); + } + var i$0 = _aM_[2], pairs$0 = match[1]; + return caml_call2(Fmlib_std_Array[5], pairs$0, i$0); + } + function down(tree, stack){ + var tree$0 = tree, stack$0 = stack; + for(;;){ + if(0 === tree$0[0]){ + var pairs = tree$0[1]; + return [0, [0, [0, pairs], 0], stack$0]; + } + var + children = tree$0[2], + pairs$0 = tree$0[1], + stack$1 = [0, [0, pairs$0, children, 0], stack$0], + tree$1 = caml_call2(Fmlib_std_Array[5], children, 0), + tree$0 = tree$1, + stack$0 = stack$1; + } + } + function up(stack){ + var stack$0 = stack; + for(;;){ + if(! stack$0) return [0, [0, empty, 0], 0]; + var + stack$1 = stack$0[2], + match = stack$0[1], + i = match[3], + children = match[2], + pairs = match[1]; + if(i < caml_call1(Fmlib_std_Array[1], pairs)) + return [0, [0, [1, pairs, children], i], stack$1]; + var stack$0 = stack$1; + } + } + function advance(source){ + if(! has_more(source)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _H_], 1); + var _aK_ = source[1], match = _aK_[1]; + if(0 === match[0]){ + var i = _aK_[2], pairs = match[1]; + return (i + 1 | 0) < caml_call1(Fmlib_std_Array[1], pairs) + ? [0, [0, [0, pairs], i + 1 | 0], source[2]] + : up(source[2]); + } + var i$0 = _aK_[2], children = match[2], pairs$0 = match[1]; + if(i$0 >= caml_call1(Fmlib_std_Array[1], pairs$0)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _G_], 1); + var _aL_ = [0, [0, pairs$0, children, i$0 + 1 | 0], source[2]]; + return down(caml_call2(Fmlib_std_Array[5], children, i$0 + 1 | 0), _aL_); + } + function make_source(tree){return down(tree, 0);} + function Source(Value){return [0, has_more, peek, advance, make_source];} + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set0(Order, Key){ + var + Map = Map0(Order, Key), + is_empty = Map[5], + cardinal = Map[6], + empty = Map[7]; + function fold_left(f, start, set){ + function _aI_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[8], _aI_, start, set); + } + function fold_right(f, start, set){ + function _aH_(a, key, param){return caml_call2(f, a, key);} + return caml_call3(Map[9], _aH_, start, set); + } + function mem(key, set){return caml_call2(Map[13], key, set) ? 1 : 0;} + function add(key, set){return caml_call3(Map[20], key, 0, set);} + function remove(key, set){return caml_call2(Map[32], key, set);} + function elements(set){return caml_call1(Map[11], set);} + var M = caml_call1(Map[41], [0]), has_more = M[1]; + function peek(source){return caml_call1(M[2], source)[1];} + var + advance = M[3], + make = M[4], + Source = [0, M, has_more, peek, advance, make]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + Source]; + } + function Map(Key){ + var + include = Map0(O32, Key), + order = include[1], + odd_order = include[2], + max_keys = include[3], + min_keys = include[4], + is_empty = include[5], + cardinal = include[6], + empty = include[7], + fold_left = include[8], + fold_right = include[9], + bindings = include[10], + keys = include[11], + bsearch = include[12], + find_opt = include[13], + subarray = include[14], + insert_subarray = include[15], + split_subarray = include[16], + add_in_leaf = include[17], + add_in_node = include[18], + add_aux = include[19], + add = include[20], + not_minimal = include[21], + replace2 = include[22], + rotate_keys = include[23], + rotate_children = include[24], + merge_keys = include[25], + merge_leaves = include[26], + merge_nodes = include[27], + handle_underflow = include[28], + handle_delete = include[29], + remove_last = include[30], + remove_aux = include[31], + remove = include[32], + update_aux = include[33], + update = include[34], + has_more = include[35], + peek = include[36], + down = include[37], + up = include[38], + advance = include[39], + make_source = include[40], + Source = include[41]; + return [0, + order, + odd_order, + max_keys, + min_keys, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + bindings, + keys, + bsearch, + find_opt, + subarray, + insert_subarray, + split_subarray, + add_in_leaf, + add_in_node, + add_aux, + add, + not_minimal, + replace2, + rotate_keys, + rotate_children, + merge_keys, + merge_leaves, + merge_nodes, + handle_underflow, + handle_delete, + remove_last, + remove_aux, + remove, + update_aux, + update, + has_more, + peek, + down, + up, + advance, + make_source, + Source]; + } + function Set_order(Order){ + var + include = Set0(Order, [0, Fmlib_std_Int[1]]), + Map = include[1], + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + function do_upward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _J_], 1); + var i = start, set$0 = set; + for(;;){ + if(i === beyond) return set$0; + var + set$1 = caml_call2(f, i, set$0), + i$0 = i + 1 | 0, + i = i$0, + set$0 = set$1; + } + } + function do_downward(f, start, beyond, set){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _K_], 1); + var i = beyond, set$0 = set; + for(;;){ + if(i === start) return set$0; + var + i$0 = i - 1 | 0, + set$1 = caml_call2(f, i$0, set$0), + i = i$0, + set$0 = set$1; + } + } + function add_upward(start, beyond, set){ + return do_upward(add, start, beyond, set); + } + function add_downward(start, beyond, set){ + return do_downward(add, start, beyond, set); + } + function remove_upward(start, beyond, set){ + return do_upward(remove, start, beyond, set); + } + function remove_downward(start, beyond, set){ + return do_downward(remove, start, beyond, set); + } + function check_range(start, beyond, set){ + var + _aE_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key){ + var + ok = param[2], + i = param[1], + _aG_ = ok ? key === i ? 1 : 0 : ok; + return [0, i + 1 | 0, _aG_]; + }, + _aE_, + set), + ok = match[2], + n = match[1], + _aF_ = n === beyond ? 1 : 0, + ok$0 = _aF_ ? ok : _aF_; + return ok$0; + } + var + M = Source[1], + has_more = Source[2], + peek = Source[3], + advance = Source[4], + make = Source[5]; + function to_list(source){ + var source$0 = source, accu = 0; + for(;;){ + if(! caml_call1(has_more, source$0)) + return caml_call1(Fmlib_std_List[11], accu); + var + accu$0 = [0, caml_call1(peek, source$0), accu], + source$1 = caml_call1(advance, source$0), + source$0 = source$1, + accu = accu$0; + } + } + var Source$0 = [0, M, has_more, peek, advance, make, to_list]; + return [0, + Map, + is_empty, + cardinal, + empty, + fold_left, + fold_right, + mem, + add, + remove, + elements, + do_upward, + do_downward, + add_upward, + add_downward, + remove_upward, + remove_downward, + check_range, + Source$0]; + } + var Set3 = Set_order([0, 3]), Set4 = Set_order([0, 4]); + function _L_(param){ + var Map$0 = Map([0, Fmlib_std_Int[1]]); + return 0 === caml_call1(Map$0[6], Map$0[7]) ? 1 : 0; + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map_in_cardinal_e, + 0, + cst_src_std_btree_ml, + 1052, + 0, + 75, + _L_); + function _M_(param){ + var set = caml_call3(Set4[13], 100, 200, Set4[4]); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s, + 0, + cst_src_std_btree_ml$0, + 1059, + 0, + 94, + _M_); + function _N_(param){ + var set = caml_call3(Set4[14], 0, 100, Set4[4]); + return caml_call3(Set4[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_0_100_set, + 0, + cst_src_std_btree_ml$1, + 1066, + 0, + 92, + _N_); + function _O_(param){ + var set = caml_call3(Set3[13], 100, 200, Set3[4]); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s, + 0, + cst_src_std_btree_ml$2, + 1073, + 0, + 94, + _O_); + function _P_(param){ + var set = caml_call3(Set3[14], 0, 100, Set3[4]); + return caml_call3(Set3[17], 0, 100, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_0_100_set, + 0, + cst_src_std_btree_ml$3, + 1080, + 0, + 92, + _P_); + function _Q_(param){ + var + _aD_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[15], 0, 100), _aD_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$4, + 1091, + 0, + 115, + _Q_); + function _R_(param){ + var + _aC_ = caml_call3(Set3[13], 0, 200, Set3[4]), + set = caml_call1(caml_call2(Set3[16], 0, 100), _aC_); + return caml_call3(Set3[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set3_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$5, + 1096, + 0, + 117, + _R_); + function _S_(param){ + var + _aB_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[15], 0, 100), _aB_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$0, + 0, + cst_src_std_btree_ml$6, + 1101, + 0, + 115, + _S_); + function _T_(param){ + var + _aA_ = caml_call3(Set4[13], 0, 200, Set4[4]), + set = caml_call1(caml_call2(Set4[16], 0, 100), _aA_); + return caml_call3(Set4[17], 100, 200, set); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_Set4_check_range_100_200_s$1, + 0, + cst_src_std_btree_ml$7, + 1106, + 0, + 117, + _T_); + var + Order = [0, 3], + include = Map0(Order, [0, Fmlib_std_Int[1]]), + is_empty = include[5], + empty = include[7], + fold_left = include[8], + add = include[20], + update = include[34]; + function do_upward(f, start, beyond, map){ + if(start > beyond) + throw caml_maybe_attach_backtrace([0, Assert_failure, _U_], 1); + var i = start, map$0 = map; + for(;;){ + if(i === beyond) return map$0; + var + map$1 = caml_call2(f, i, map$0), + i$0 = i + 1 | 0, + i = i$0, + map$0 = map$1; + } + } + function add_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(add, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function update_upward(start, beyond, f, map){ + return do_upward + (function(i, map){ + return caml_call3(update, i, caml_call1(f, i), map); + }, + start, + beyond, + map); + } + function check_range(start, beyond, f, map){ + var + _ax_ = [0, start, 1], + match = + caml_call3 + (fold_left, + function(param, key, value){ + var + ok = param[2], + i = param[1], + _az_ = ok ? caml_equal(caml_call1(f, key), value) : ok; + return [0, i + 1 | 0, _az_]; + }, + _ax_, + map), + ok = match[2], + n = match[1], + _ay_ = n === beyond ? 1 : 0, + ok$0 = _ay_ ? ok : _ay_; + return ok$0; + } + function _V_(param){ + var map = add_upward(0, 100, function(_aw_){return _aw_;}, empty); + return check_range(0, 100, function(_av_){return _av_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a, + 0, + cst_src_std_btree_ml$8, + 1185, + 0, + 113, + _V_); + function _W_(param){ + var i = 100, map = empty; + for(;;){ + if(i === 0) + return check_range(0, 100, function(_au_){return _au_;}, map); + var + i$0 = i - 1 | 0, + map$0 = caml_call3(add, i$0, i$0, map), + i = i$0, + map = map$0; + } + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$0, + 0, + cst_src_std_btree_ml$9, + 1190, + 0, + 115, + _W_); + function _X_(param){ + var + map = update_upward(0, 100, function(i, param){return [0, i];}, empty); + return check_range(0, 100, function(_at_){return _at_;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_u, + 0, + cst_src_std_btree_ml$10, + 1199, + 0, + 129, + _X_); + function _Y_(param){ + var + _aq_ = add_upward(0, 100, function(_as_){return _as_;}, empty), + map = + update_upward + (0, + 100, + function(param){ + function _ar_(i){return 2 * i | 0;} + return caml_call1(Fmlib_std_Option[5], _ar_); + }, + _aq_); + return check_range(0, 100, function(i){return 2 * i | 0;}, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$1, + 0, + cst_src_std_btree_ml$11, + 1205, + 0, + 213, + _Y_); + function _Z_(param){ + var + _an_ = add_upward(0, 100, function(_ap_){return _ap_;}, empty), + map = update_upward(0, 100, function(param, _ao_){return 0;}, _an_); + return caml_call1(is_empty, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_map_a$2, + 0, + cst_src_std_btree_ml$12, + 1215, + 0, + 166, + _Z_); + function ___(param){ + function f(i){return ((i / 2 | 0) * 2 | 0) === i ? i : 2 * i | 0;} + var + _af_ = add_upward(0, 100, function(_am_){return _am_;}, empty), + _ai_ = add_upward(200, 300, function(_al_){return _al_;}, _af_), + _ah_ = + update_upward + (0, + 100, + function(param){return caml_call1(Fmlib_std_Option[5], f);}, + _ai_), + _ag_ = + update_upward(100, 200, function(i, param){return [0, f(i)];}, _ah_), + map = + update_upward + (0, + 300, + function(i){ + if(200 <= i) return function(param){return 0;}; + function _aj_(_ak_){return _ak_;} + return caml_call1(Fmlib_std_Option[5], _aj_); + }, + _ag_); + return check_range(0, 200, f, map); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Map3_in_let_f_i_i, + 0, + cst_src_std_btree_ml$13, + 1226, + 0, + 540, + ___); + function _$_(param){ + var + set = caml_call3(Set3[13], 0, 20, Set3[4]), + _ae_ = caml_call1(Set3[18][5], set); + return caml_equal(caml_call1(Set3[18][6], _ae_), _aa_); + } + caml_call8 + (Ppx_inline_test_lib_Runtime[4], + Inline_test_config, + cst_let_open_Set3_in_let_modul, + 0, + cst_src_std_btree_ml$14, + 1260, + 0, + 253, + _$_); + caml_call1(Ppx_inline_test_lib_Runtime[3], cst_fmlib_std); + function _ab_(_ac_){ + var _ad_ = Map(_ac_); + return [0, + _ad_[5], + _ad_[6], + _ad_[8], + _ad_[9], + _ad_[10], + _ad_[13], + _ad_[7], + _ad_[20], + _ad_[32], + _ad_[34], + _ad_[40], + _ad_[35], + _ad_[36], + _ad_[39], + _ad_[41]]; + } + var + Fmlib_std_Btree = + [0, + function(Key){ + var + include = Set0(O32, Key), + is_empty = include[2], + cardinal = include[3], + empty = include[4], + fold_left = include[5], + fold_right = include[6], + mem = include[7], + add = include[8], + remove = include[9], + elements = include[10], + Source = include[11]; + return [0, + is_empty, + cardinal, + mem, + fold_left, + fold_right, + elements, + empty, + add, + remove, + [0, Source[2], Source[3], Source[4], Source[5]]]; + }, + _ab_]; + runtime.caml_register_global(88, Fmlib_std_Btree, "Fmlib_std__Btree"); + return; + } + (globalThis)); + + +//# 1 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_cannot_decode_message$1 = "cannot decode message", + cst_provided_callback_is_not_a$1 = "provided callback is not a function", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_List = global_data.Fmlib_std__List, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Stdlib_Float = global_data.Stdlib__Float, + null$0 = Js_of_ocaml_Js[1], + undefined$0 = Js_of_ocaml_Js[3], + cst_cannot_decode_message$0 = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a$0 = cst_provided_callback_is_not_a$1, + cst_cannot_decode_state = "cannot decode state", + cst_cannot_decode_a_nullable_e = "cannot decode a nullable element id", + cst_cannot_decode_message = cst_cannot_decode_message$1, + cst_provided_callback_is_not_a = cst_provided_callback_is_not_a$1, + cst_cannot_decode_input_data = "cannot decode input data", + cst_init = "init", + _b_ = [0, "src/js/base.ml", 283, 12]; + function int$0(i){return i;} + function float$0(v){return v;} + var + bool = runtime.caml_js_from_bool, + string = caml_jsstring_of_string, + object = runtime.caml_js_object, + array = runtime.caml_js_from_array; + function function1(f){return f;} + function function2(f){return f;} + function function3(f){return f;} + function stringify(v){ + try{var _G_ = [0, Js_of_ocaml_Js[38].stringify(v)]; return _G_;} + catch(_H_){return 0;} + } + function parse(v){ + try{var _E_ = [0, Js_of_ocaml_Js[38].parse(v)]; return _E_;} + catch(_F_){return 0;} + } + var + Value = + [0, + null$0, + undefined$0, + int$0, + float$0, + bool, + string, + object, + array, + function1, + function2, + function3, + stringify, + parse]; + function is_function(v){return typeof v === "function" ? 1 : 0;} + function return$0(a, param){return [0, a];} + function fail(param){return 0;} + function value(v){return [0, v];} + function let$0(m, f, v){ + function _C_(a){return caml_call2(f, a, v);} + var _D_ = caml_call1(m, v); + return caml_call2(Fmlib_std_Option[3], _D_, _C_); + } + function symbol(p, q, v){ + var r = caml_call1(p, v); + return r ? r : caml_call1(q, v); + } + function map(f, m){ + function _y_(a){ + var _A_ = caml_call1(f, a); + return function(_B_){return [0, _A_];}; + } + return function(_z_){return let$0(m, _y_, _z_);}; + } + function null$1(a, obj){return obj === Value[1] ? [0, a] : 0;} + function undefined$1(a, obj){return obj === Value[2] ? [0, a] : 0;} + function float$1(v){return typeof v === "number" ? [0, v.valueOf(0)] : 0;} + function _a_(v){ + var i = v | 0; + return caml_call2(Stdlib_Float[20], v, i) + ? function(_x_){return [0, i];} + : fail; + } + function int$1(_w_){return let$0(float$1, _a_, _w_);} + function bool$0(v){return typeof v === "boolean" ? [0, v | 0] : 0;} + function string$0(v){ + return typeof v === "string" ? [0, runtime.caml_string_of_jsstring(v)] : 0; + } + function function$0(v){ + return is_function(v) + ? [0, function(args){return runtime.caml_js_fun_call(v, args);}] + : 0; + } + function method(v){ + return is_function(v) + ? [0, + function(obj, args){return runtime.caml_js_call(v, obj, args);}] + : 0; + } + function field(name, decode, obj){ + function _t_(v){return caml_call1(decode, v);} + var + _u_ = obj[caml_jsstring_of_string(name)], + _v_ = caml_call1(Js_of_ocaml_Js[6][10], _u_); + return caml_call2(Fmlib_std_Option[3], _v_, _t_); + } + function array$0(decode, obj){ + var t6 = Js_of_ocaml_Js[52][1]; + if(! t6.Array.isArray(obj)) return 0; + var len = obj.length; + function extract(i, lst){ + if(i === len){ + var _n_ = caml_call1(Fmlib_std_List[11], lst); + return [0, caml_call1(Fmlib_std_Array[30], _n_)]; + } + function _o_(e){ + function _r_(a){return extract(i + 1 | 0, [0, a, lst]);} + var _s_ = caml_call1(decode, e); + return caml_call2(Fmlib_std_Option[3], _s_, _r_); + } + var + _p_ = caml_call2(Js_of_ocaml_Js[20], obj, i), + _q_ = caml_call1(Js_of_ocaml_Js[6][10], _p_); + return caml_call2(Fmlib_std_Option[3], _q_, _o_); + } + return extract(0, 0); + } + function option(decode){ + var _i_ = 0; + function _j_(_m_){return null$1(_i_, _m_);} + var _k_ = map(Fmlib_std_Option[1], decode); + return function(_l_){return symbol(_k_, _j_, _l_);}; + } + function of_exception(exn){return caml_call1(Js_of_ocaml_Js[37][7], exn);} + function raise_js_error(js_error){ + return caml_call1(Js_of_ocaml_Js[37][5], js_error); + } + function raise_js(message){ + var + js_msg = caml_jsstring_of_string(message), + _g_ = new Js_of_ocaml_Js[36](js_msg), + _h_ = caml_call1(Js_of_ocaml_Js[37][9], _g_); + return caml_call1(Js_of_ocaml_Js[37][5], _h_); + } + function log_string(str){ + var t12 = Js_of_ocaml_Js[52][1]; + return t12.console.log(caml_jsstring_of_string(str)); + } + function log_value(value){ + var t15 = Js_of_ocaml_Js[52][1]; + return t15.console.log(value); + } + function export$0(obj){ + var _f_ = caml_call1(Value[7], obj); + return caml_call1(Js_of_ocaml_Js[51], _f_); + } + function make_global(name, v){ + return Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)] = v; + } + function get_global(name){ + var _e_ = Js_of_ocaml_Js[52][1][caml_jsstring_of_string(name)]; + return caml_call1(Js_of_ocaml_Js[5][10], _e_); + } + function new_global(cname, args){ + var match = get_global(cname); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var constr = match[1]; + return runtime.caml_js_new(constr, args); + } + function decode_callback(cb, err){ + var match = function$0(cb); + if(! match) return raise_js(err); + var cb$0 = match[1]; + return function(v){caml_call1(cb$0, [0, v]); return 0;}; + } + function decode_data(dec, data, err){ + var match = caml_call1(dec, data); + if(! match) return raise_js(err); + var state = match[1]; + return state; + } + function node_module(decode, msg_decode, node_function){ + function js_function(data, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a), + data$0 = decode_data(decode, data, cst_cannot_decode_input_data), + f = caml_call2(node_function, data$0, callback$0); + function _d_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _d_); + } + return export$0([0, [0, cst_init, caml_call1(Value[10], js_function)]]); + } + function browser_application + (app_name, state_decode, msg_decode, browser_function){ + function js_function(state, element, callback){ + var + callback$0 = decode_callback(callback, cst_provided_callback_is_not_a$0), + state$0 = decode_data(state_decode, state, cst_cannot_decode_state), + element$0 = + decode_data(option(string$0), element, cst_cannot_decode_a_nullable_e), + f = caml_call3(browser_function, state$0, element$0, callback$0); + function _c_(msg){ + var match = caml_call1(msg_decode, msg); + if(match){var msg$0 = match[1]; caml_call1(f, msg$0); return Value[2];} + log_string(cst_cannot_decode_message$0); + log_value(msg); + return Value[2]; + } + return caml_call1(Value[9], _c_); + } + return make_global(app_name, caml_call1(Value[11], js_function)); + } + var + Fmlib_js_Base = + [0, + Value, + [0, + return$0, + fail, + value, + let$0, + let$0, + symbol, + map, + null$1, + undefined$1, + float$1, + int$1, + bool$0, + string$0, + function$0, + method, + field, + array$0, + option], + [0, + of_exception, + raise_js_error, + raise_js, + log_string, + log_value, + node_module, + browser_application, + make_global, + get_global, + new_global, + export$0]]; + runtime.caml_register_global(29, Fmlib_js_Base, "Fmlib_js__Base"); + return; + } + (globalThis)); + +//# 300 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function value(e){return e;} + function stop_propagation(e){return e.stopPropagation(0);} + function prevent_default(e){return e.preventDefault(0);} + var Fmlib_js_Event = [0, value, stop_propagation, prevent_default]; + runtime.caml_register_global(2, Fmlib_js_Event, "Fmlib_js__Event"); + return; + } + (globalThis)); + +//# 315 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function add(name, handler, tgt){ + return tgt.addEventListener(caml_jsstring_of_string(name), handler); + } + function remove(name, handler, tgt){ + return tgt.removeEventListener(caml_jsstring_of_string(name), handler); + } + var Fmlib_js_Event_target = [0, add, remove]; + runtime.caml_register_global + (2, Fmlib_js_Event_target, "Fmlib_js__Event_target"); + return; + } + (globalThis)); + +//# 336 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function set(f, ms){return Js_of_ocaml_Js[52][1].setTimeout(f, ms);} + function clear(t){return Js_of_ocaml_Js[52][1].clearTimeout(t);} + function set_interval(f, ms){ + return Js_of_ocaml_Js[52][1].setInterval(f, ms); + } + function clear_interval(t){return Js_of_ocaml_Js[52][1].clearInterval(t);} + var Fmlib_js_Timer = [0, set, clear, set_interval, clear_interval]; + runtime.caml_register_global(5, Fmlib_js_Timer, "Fmlib_js__Timer"); + return; + } + (globalThis)); + +//# 544 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_jsstring_of_string = runtime.caml_jsstring_of_string; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Stdlib_List = global_data.Stdlib__List; + function event_target(req){return req;} + function make(method, url, headers, body){ + var + t0 = Js_of_ocaml_Js[52][1], + request = t0.XMLHttpRequest, + req = new request(); + req.open(caml_jsstring_of_string(method), caml_jsstring_of_string(url)); + function _a_(param){ + var value = param[2], name = param[1]; + return req.setRequestHeader + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + caml_call2(Stdlib_List[17], _a_, headers); + req.send(caml_jsstring_of_string(body)); + return req; + } + function ready_state(req){return req.readyState;} + function status(req){return req.status;} + function response_text_value(req){return req.responseText;} + function response_text_string(req){ + return runtime.caml_string_of_jsstring(req.responseText); + } + var + Fmlib_js_Http_request = + [0, + event_target, + make, + ready_state, + status, + response_text_value, + response_text_string]; + runtime.caml_register_global + (10, Fmlib_js_Http_request, "Fmlib_js__Http_request"); + return; + } + (globalThis)); + +//# 598 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_js_dom_ml = "src/js/dom.ml", + caml_jsstring_of_string = runtime.caml_jsstring_of_string, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_of_jsstring = runtime.caml_string_of_jsstring; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + _b_ = [0, cst_src_js_dom_ml, 257, 8], + _a_ = [0, cst_src_js_dom_ml, 147, 8]; + function set(name, value, s){ + return s.setProperty + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove(name, s){ + return s.removeProperty(caml_jsstring_of_string(name)); + } + var Style = [0, set, remove]; + function event_target(node){return node;} + function parent(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.parentNode); + } + function first(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.firstChild); + } + function next(node){ + return caml_call1(Js_of_ocaml_Js[5][10], node.nextSibling); + } + function append(child, node){ + if(node === Fmlib_js_Base[1][1]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + return node.appendChild(child); + } + function remove$0(child, node){return node.removeChild(child);} + function replace(new_child, old_child, node){ + return node.replaceChild(new_child, old_child); + } + function remove_children(parent){ + for(;;){ + var match = first(parent); + if(! match) return 0; + var child = match[1]; + parent.removeChild(child); + } + } + function node_value(node){return caml_string_of_jsstring(node.nodeValue);} + function set_node_value(value, node){ + var t16 = caml_jsstring_of_string(value); + return node.nodeValue = t16; + } + var + Node = + [0, + event_target, + parent, + first, + next, + append, + remove$0, + replace, + remove_children, + node_value, + set_node_value]; + function node(element){return element;} + function scroll_width(element){return element.scrollWidth;} + function scroll_height(element){return element.scrollHeight;} + function client_width(element){return element.clientWidth;} + function client_height(element){return element.clientHeight;} + function scroll_left(element){return element.scrollLeft;} + function scroll_top(element){return element.scrollTop;} + function set_scroll_left(t24, element){return element.scrollLeft = t24;} + function set_scroll_top(t26, element){return element.scrollTop = t26;} + function style(element){return element.style;} + function set_attribute(name, value, element){ + return element.setAttribute + (caml_jsstring_of_string(name), caml_jsstring_of_string(value)); + } + function remove_attribute(name, element){ + return element.removeAttribute(caml_jsstring_of_string(name)); + } + function set_property(name, value, element){ + return element[caml_jsstring_of_string(name)] = value; + } + function delete_property(name, element){ + return delete element[caml_jsstring_of_string(name)]; + } + function focus(element){return element.focus(0);} + function blur(element){return element.blur(0);} + var + Element = + [0, + node, + scroll_width, + scroll_height, + client_width, + client_height, + scroll_left, + scroll_top, + set_scroll_left, + set_scroll_top, + style, + set_attribute, + remove_attribute, + set_property, + delete_property, + focus, + blur]; + function title(doc){return caml_string_of_jsstring(doc.title);} + function set_title(title, doc){ + var t39 = caml_jsstring_of_string(title); + return doc.title = t39; + } + function body(doc){ + if(doc.body !== null) return doc.body; + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + function find(name, doc){ + var _c_ = doc.getElementById(caml_jsstring_of_string(name)); + return caml_call1(Js_of_ocaml_Js[5][10], _c_); + } + function create_element(tag, doc){ + return doc.createElement(caml_jsstring_of_string(tag)); + } + function create_text_node(text, doc){ + return doc.createTextNode(caml_jsstring_of_string(text)); + } + function create_element_ns(namespace, tag, doc){ + return doc.createElementNS + (caml_jsstring_of_string(namespace), caml_jsstring_of_string(tag)); + } + function create_document_fragment(doc){return doc.createDocumentFragment(0); + } + var + Document = + [0, + title, + set_title, + body, + find, + create_element, + create_text_node, + create_element_ns, + create_document_fragment]; + function go(i, history){return history.go(i);} + function push_state(state, title, url, history){ + return history.pushState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + function replace_state(state, title, url, history){ + return history.replaceState + (state, + caml_jsstring_of_string(title), + caml_jsstring_of_string(url)); + } + var History = [0, go, push_state, replace_state]; + function href(location){return caml_string_of_jsstring(location.href);} + function protocol(location){ + return caml_string_of_jsstring(location.protocol); + } + function host(location){return caml_string_of_jsstring(location.host);} + function port(location){return caml_string_of_jsstring(location.port);} + function pathname(location){ + return caml_string_of_jsstring(location.pathname); + } + function search(location){return caml_string_of_jsstring(location.search);} + function hash(location){return caml_string_of_jsstring(location.hash);} + function assign(url, location){ + return location.assign(caml_jsstring_of_string(url)); + } + function reload(location){return location.reload(0);} + var + Location = + [0, href, protocol, host, port, pathname, search, hash, assign, reload]; + function get(param){return Js_of_ocaml_Js[52][1];} + function event_target$0(w){return w;} + function document(t75){return t75.document;} + function history(t76){return t76.history;} + function location(t77){return t77.location;} + function on_next_animation(callback, w){ + return w.requestAnimationFrame(callback); + } + var + Window = + [0, get, event_target$0, document, history, location, on_next_animation], + Fmlib_js_Dom = + [0, Node, Style, Element, Document, Location, History, Window]; + runtime.caml_register_global(54, Fmlib_js_Dom, "Fmlib_js__Dom"); + return; + } + (globalThis)); + +//# 804 "../../js/.fmlib_js.objs/jsoo/default/fmlib_js.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + global_data = runtime.caml_get_global_data(), + Js_of_ocaml_Js = global_data.Js_of_ocaml__Js; + function now(param){return new Js_of_ocaml_Js[26]();} + function make(year, month, day, hour, minute, second, milli){ + return new + Js_of_ocaml_Js[33] + (year, month, day, hour, minute, second, milli); + } + function of_value(v){return new Js_of_ocaml_Js[27](v);} + function value(d){return d.valueOf();} + function zone_offset(d){return d.getTimezoneOffset();} + function add(ms, d){return of_value(d.valueOf() + ms);} + function day(d){return d.getDay();} + function date(d){return d.getDate();} + function month(d){return d.getMonth();} + function year(d){return d.getFullYear();} + function hours(d){return d.getHours();} + function minutes(d){return d.getMinutes();} + function seconds(d){return d.getSeconds();} + function milliseconds(d){return d.getMilliseconds();} + var + Fmlib_js_Date = + [0, + now, + value, + of_value, + zone_offset, + add, + make, + day, + date, + month, + year, + hours, + minutes, + seconds, + milliseconds]; + runtime.caml_register_global(11, Fmlib_js_Date, "Fmlib_js__Date"); + return; + } + (globalThis)); + + +//# 1 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cma, use-js-string=true, version=5.1.1 + +//# 16 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_dictionary_ml = "src/browser/dictionary.ml", + caml_equal = runtime.caml_equal, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_Array = global_data.Stdlib__Array, + Fmlib_std_Array = global_data.Fmlib_std__Array, + Assert_failure = global_data.Assert_failure, + Fmlib_std_Option = global_data.Fmlib_std__Option, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_std_String = global_data.Fmlib_std__String, + _c_ = [0, cst_src_browser_dictionary_ml, 77, 12], + _b_ = [0, cst_src_browser_dictionary_ml, 51, 17], + _a_ = [0, cst_src_browser_dictionary_ml, 53, 17]; + function Make(Key){ + var Map = caml_call1(Fmlib_std_Btree[2], Key), empty = [0, [0], Map[7]]; + function find_opt(key, d){ + var _n_ = caml_call2(Map[6], key, d[2]); + function _o_(i){ + if(i >= caml_call1(Fmlib_std_Array[1], d[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var + match = caml_call2(Fmlib_std_Array[5], d[1], i), + v = match[2], + k = match[1]; + if(caml_equal(k, key)) return v; + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + return caml_call2(Fmlib_std_Option[5], _o_, _n_); + } + function add(key, value, d){ + if(caml_call2(Map[6], key, d[2])) return d; + var + n = caml_call1(Fmlib_std_Array[1], d[1]), + _m_ = caml_call3(Map[8], key, n, d[2]); + return [0, caml_call2(Fmlib_std_Array[27], [0, key, value], d[1]), _m_]; + } + function set(key, f, d){ + var match = caml_call2(Map[6], key, d[2]); + if(! match) return add(key, caml_call1(f, 0), d); + var + idx = match[1], + match$0 = caml_call2(Fmlib_std_Array[5], d[1], idx), + v = match$0[2], + k = match$0[1]; + if(! caml_equal(k, key)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _j_ = d[2], _k_ = d[1], _l_ = [0, key, caml_call1(f, [0, v])]; + return [0, caml_call3(Fmlib_std_Array[13], idx, _l_, _k_), _j_]; + } + function of_list(lst){ + var d = empty, param = lst; + for(;;){ + if(! param) return d; + var + tl = param[2], + match = param[1], + value = match[2], + key = match[1], + d$0 = add(key, value, d), + d = d$0, + param = tl; + } + } + function fold(f, accu, d){ + var _h_ = d[1]; + function _i_(accu, param){ + var value = param[2], key = param[1]; + return caml_call3(f, accu, key, value); + } + return caml_call3(Fmlib_std_Array[18], _i_, accu, _h_); + } + function iter(f, dict){ + var _f_ = dict[1]; + function _g_(param){ + var value = param[2], key = param[1]; + return caml_call2(f, key, value); + } + return caml_call2(Stdlib_Array[11], _g_, _f_); + } + function diff(add, set, remove, d1, d2){ + iter + (function(key, param){ + return find_opt(key, d1) ? 0 : caml_call1(remove, key); + }, + d2); + return iter + (function(key, value){ + var match = find_opt(key, d2); + if(! match) return caml_call2(add, key, value); + var value2 = match[1]; + return value === value2 ? 0 : caml_call2(set, key, value); + }, + d1); + } + return [0, Map, empty, find_opt, add, set, of_list, fold, iter, diff]; + } + var + include = Make([0, Fmlib_std_String[4]]), + empty = include[2], + find_opt = include[3], + add = include[4], + set = include[5], + of_list = include[6], + fold = include[7], + iter = include[8], + diff = include[9], + Fmlib_browser_Dictionary = + [0, + function(_d_){ + var _e_ = Make(_d_); + return [0, + _e_[2], + _e_[3], + _e_[4], + _e_[5], + _e_[6], + _e_[7], + _e_[8], + _e_[9]]; + }, + empty, + find_opt, + add, + set, + of_list, + fold, + iter, + diff]; + runtime.caml_register_global + (9, Fmlib_browser_Dictionary, "Fmlib_browser__Dictionary"); + return; + } + (globalThis)); + +//# 172 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + prevent = [0, 1], + no_prevent = [0, 0], + stop = [0, 1], + no_stop = [0, 0], + Fmlib_browser_Event_flag = [0, prevent, no_prevent, stop, no_stop]; + runtime.caml_register_global + (4, Fmlib_browser_Event_flag, "Fmlib_browser__Event_flag"); + return; + } + (globalThis)); + +//# 189 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + utc = 0; + function make(minutes){return minutes;} + function offset(zone){return zone;} + var Zone = [0, utc, make, offset], zero = caml_call1(Fmlib_js_Date[3], 0.); + function adapt(time, zone){ + var _h_ = 60000. * (caml_call1(Fmlib_js_Date[4], time) - zone | 0); + return caml_call2(Fmlib_js_Date[5], _h_, time); + } + function year(time, zone){ + var _g_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[10], _g_); + } + function month(time, zone){ + var _f_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[9], _f_); + } + function day_of_month(time, zone){ + var _e_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[8], _e_); + } + function hour(time, zone){ + var _d_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[11], _d_); + } + function minute(time, zone){ + var _c_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[12], _c_); + } + function second(time, zone){ + var _b_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[13], _b_); + } + function milli_second(time, zone){ + var _a_ = adapt(time, zone); + return caml_call1(Fmlib_js_Date[14], _a_); + } + var + Fmlib_browser_Time = + [0, + Zone, + zero, + adapt, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second]; + runtime.caml_register_global(3, Fmlib_browser_Time, "Fmlib_browser__Time"); + return; + } + (globalThis)); + +//# 262 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + _a_ = [0, "src/browser/url.ml", 6, 8]; + function string(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + var Local = [0, string]; + function parse(str){return [0, [0, str]];} + function string$0(param){ + if(0 === param[0]){var str = param[1]; return str;} + var loc = param[1]; + return caml_call1(Local[1], loc); + } + function is_page(param){return 0 === param[0] ? 1 : 1;} + var Fmlib_browser_Url = [0, Local, parse, string$0, is_page]; + runtime.caml_register_global(2, Fmlib_browser_Url, "Fmlib_browser__Url"); + return; + } + (globalThis)); + +//# 296 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_click$1 = "click", + cst_src_browser_handler_ml = "src/browser/handler.ml", + cst_target$1 = "target", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_notequal = runtime.caml_string_notequal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + function caml_call6(f, a0, a1, a2, a3, a4, a5){ + return (f.l >= 0 ? f.l : f.l = f.length) == 6 + ? f(a0, a1, a2, a3, a4, a5) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4, a5]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Fmlib_js_Event = global_data.Fmlib_js__Event, + Fmlib_browser_Url = global_data.Fmlib_browser__Url, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_js_Date = global_data.Fmlib_js__Date, + Stdlib_List = global_data.Stdlib__List, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Stdlib_String = global_data.Stdlib__String, + Stdlib_Int = global_data.Stdlib__Int, + _h_ = [0, cst_src_browser_handler_ml, 356, 12], + cst_href = "href", + cst_target = cst_target$1, + cst_click$0 = cst_click$1, + cst_click = cst_click$1, + cst_Cannot_decode_event = "Cannot decode event", + _d_ = [0, cst_src_browser_handler_ml, 78, 33], + _c_ = [0, cst_src_browser_handler_ml, 88, 21], + _b_ = [0, cst_src_browser_handler_ml, 101, 33], + _a_ = [0, cst_src_browser_handler_ml, 48, 17], + cst_tagName = "tagName", + cst_target$0 = cst_target$1; + function make(handler){ + var ref = [0, handler]; + return [0, ref, function(e){return caml_call1(ref[1], e);}]; + } + function update(handler, actual){actual[1][1] = handler; return 0;} + function fire(actual){return actual[2];} + var Actual = [0, make, update, fire]; + function Actuals(Key){ + var + Map = caml_call1(Fmlib_std_Btree[2], Key), + Dict = caml_call1(Fmlib_browser_Dictionary[1], Key); + function empty(param){return [0, Map[7]];} + function set(make, add, dict, map){ + function _Y_(key, v){ + if(0 !== caml_call2(Map[6], key, map[1])) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var + _Z_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _Z_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + map[1] = caml_call3(Map[8], key, [0, actual, a], map[1]); + return 0; + } + return caml_call2(Dict[7], _Y_, dict); + } + function update(make, add, remove, d1, d2, map){ + function _P_(key){ + var _W_ = map[1]; + function _X_(param){ + if(! param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var match = param[1], a = match[2], actual = match[1]; + caml_call3(remove, key, caml_call1(Actual[3], actual), a); + return 0; + } + map[1] = caml_call3(Map[10], key, _X_, _W_); + return 0; + } + function _Q_(key, v){ + var match = caml_call2(Map[6], key, map[1]); + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var actual = match[1][1], _V_ = caml_call1(make, v); + return caml_call2(Actual[2], _V_, actual); + } + function _R_(key, v){ + var _S_ = map[1]; + function _T_(param){ + if(param) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + var + _U_ = caml_call1(make, v), + actual = caml_call1(Actual[1], _U_), + a = caml_call2(add, key, caml_call1(Actual[3], actual)); + return [0, [0, actual, a]]; + } + map[1] = caml_call3(Map[10], key, _T_, _S_); + return 0; + } + return caml_call5(Dict[8], _R_, _Q_, _P_, d1, d2); + } + return [0, Map, Dict, empty, set, update]; + } + function make_one(dispatch, param, event){ + var decode = param[3], prevent = param[2][1], stop = param[1][1]; + if(stop) caml_call1(Fmlib_js_Event[2], event); + if(prevent) caml_call1(Fmlib_js_Event[3], event); + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(match){var m = match[1]; return caml_call1(dispatch, m);} + caml_call1(Fmlib_js_Base[3][4], cst_Cannot_decode_event); + var _O_ = caml_call1(Fmlib_js_Event[1], event); + return caml_call1(Fmlib_js_Base[3][5], _O_); + } + function make_list(dispatch, lst, event){ + var _M_ = caml_call1(Stdlib_List[9], lst); + function _N_(v){return make_one(dispatch, v, event);} + return caml_call2(Stdlib_List[17], _N_, _M_); + } + function map(f, param){ + var decode = param[3], prevent = param[2], stop = param[1]; + return [0, stop, prevent, caml_call2(Fmlib_js_Base[2][7], f, decode)]; + } + var + Virtual = [0, make_one, make_list, map], + Actuals$0 = Actuals([0, Stdlib_String[9]]), + Dict = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = Actuals$0[3]; + function add(target, event_type, handler){ + return caml_call3(Fmlib_js_Event_target[1], event_type, handler, target); + } + function set(target, dispatch, dict, map){ + function _I_(_K_, _L_){return add(target, _K_, _L_);} + var _J_ = caml_call1(Virtual[2], dispatch); + return caml_call4(Actuals$0[4], _J_, _I_, dict, map); + } + function update$0(target, dispatch, d1, d2, map){ + function _D_(event_type, handler, param){ + return caml_call3(Fmlib_js_Event_target[2], event_type, handler, target); + } + function _E_(_G_, _H_){return add(target, _G_, _H_);} + var _F_ = caml_call1(Virtual[2], dispatch); + return caml_call6(Actuals$0[5], _F_, _E_, _D_, d1, d2, map); + } + var + EventHs = [0, Actuals$0, Dict, empty, add, set, update$0], + Actuals$1 = Actuals([0, Stdlib_Int[9]]), + Dict$0 = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + empty$0 = Actuals$1[3]; + function of_list(dispatch, lst, time){ + var _B_ = caml_call1(Stdlib_List[9], lst); + function _C_(f){return caml_call1(dispatch, caml_call1(f, time));} + return caml_call2(Stdlib_List[17], _C_, _B_); + } + function make_timer(millis, h){ + function _A_(param){ + return caml_call1(h, caml_call1(Fmlib_js_Date[1], 0)); + } + return caml_call2(Fmlib_js_Timer[3], _A_, millis); + } + function remove_timer(param, _z_, timer){ + return caml_call1(Fmlib_js_Timer[4], timer); + } + function set$0(dispatch, dict, map){ + function _w_(_x_, _y_){return of_list(dispatch, _x_, _y_);} + return caml_call4(Actuals$1[4], _w_, make_timer, dict, map); + } + function update$1(dispatch, d1, d2, map){ + function _t_(_u_, _v_){return of_list(dispatch, _u_, _v_);} + return caml_call6 + (Actuals$1[5], _t_, make_timer, remove_timer, d1, d2, map); + } + var + Timers = + [0, + Actuals$1, + Dict$0, + empty$0, + of_list, + make_timer, + remove_timer, + set$0, + update$1]; + function empty$1(param){return [0, 0];} + function target(param){ + var _s_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][2], _s_); + } + function add$0(h){ + var _r_ = target(0); + return caml_call3(Fmlib_js_Event_target[1], cst_click, h, _r_); + } + function remove(h){ + var _q_ = target(0); + return caml_call3(Fmlib_js_Event_target[2], cst_click$0, h, _q_); + } + function _e_(tag){ + function _n_(href){ + var match = caml_call1(Fmlib_browser_Url[2], href); + if(! match) return Fmlib_js_Base[2][2]; + var url = match[1]; + if + (! + caml_string_notequal(tag, "A") + && + ! + caml_string_notequal(tag, "a") + && caml_call1(Fmlib_browser_Url[4], url)) + return caml_call1(Fmlib_js_Base[2][1], url); + return Fmlib_js_Base[2][2]; + } + var + _o_ = caml_call2(Fmlib_js_Base[2][16], cst_href, Fmlib_js_Base[2][13]), + _p_ = caml_call2(Fmlib_js_Base[2][16], cst_target, _o_); + return caml_call2(Fmlib_js_Base[2][4], _p_, _n_); + } + var + _f_ = caml_call2(Fmlib_js_Base[2][16], cst_tagName, Fmlib_js_Base[2][13]), + _g_ = caml_call2(Fmlib_js_Base[2][16], cst_target$0, _f_), + decode = caml_call2(Fmlib_js_Base[2][4], _g_, _e_); + function make$0(dispatch, f, event){ + var match = caml_call1(decode, caml_call1(Fmlib_js_Event[1], event)); + if(! match) return 0; + var url = match[1]; + caml_call1(Fmlib_js_Event[3], event); + return caml_call1(dispatch, caml_call1(f, url)); + } + function set$1(dispatch, virt, req){ + if(virt){ + var + f = virt[1], + _l_ = function(_m_){return make$0(dispatch, f, _m_);}, + actual = caml_call1(Actual[1], _l_); + add$0(caml_call1(Actual[3], actual)); + req[1] = [0, actual]; + return 0; + } + req[1] = 0; + return 0; + } + function update$2(dispatch, virt1, virt2, req){ + var match = req[1]; + if(virt1){ + var f1 = virt1[1]; + if(virt2){ + if(match){ + var + actual = match[1], + handler = function(_j_){return make$0(dispatch, f1, _j_);}; + return caml_call2(Actual[2], handler, actual); + } + } + else if(! match){ + var + _i_ = function(_k_){return make$0(dispatch, f1, _k_);}, + actual$0 = caml_call1(Actual[1], _i_); + add$0(caml_call1(Actual[3], actual$0)); + req[1] = [0, actual$0]; + return 0; + } + } + else + if(virt2){ + if(match){ + var actual$1 = match[1]; + return remove(caml_call1(Actual[3], actual$1)); + } + } + else if(! match) return 0; + throw caml_maybe_attach_backtrace([0, Assert_failure, _h_], 1); + } + var + Url_request = + [0, empty$1, target, add$0, remove, decode, make$0, set$1, update$2], + Fmlib_browser_Handler = + [0, Actual, Actuals, Virtual, EventHs, Timers, Url_request]; + runtime.caml_register_global + (27, Fmlib_browser_Handler, "Fmlib_browser__Handler"); + return; + } + (globalThis)); + +//# 605 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function(globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function style(key, value){return [0, key, value];} + function property(key, value){return [1, key, value];} + function attribute(key, value){return [2, key, value];} + function handler(key, stop, prevent, decode){ + return [3, key, [0, stop, prevent, decode]]; + } + var Fmlib_browser_Attribute = [0, style, property, attribute, handler]; + runtime.caml_register_global + (0, Fmlib_browser_Attribute, "Fmlib_browser__Attribute"); + return; + } + (globalThis)); + +//# 623 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_string_equal = runtime.caml_string_equal; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib_List = global_data.Stdlib__List, + Assert_failure = global_data.Assert_failure, + Stdlib_String = global_data.Stdlib__String, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + _a_ = [0, "src/browser/vdom.ml", 205, 16], + _b_ = [0, 0, 0]; + function of_list(lst){ + var _x_ = [0, Dictionary[1], Dictionary[1], Dictionary[1], Dictionary[1]]; + function _y_(attrs, param){ + switch(param[0]){ + case 0: + var + value = param[2], + name = param[1], + _z_ = attrs[4], + _A_ = attrs[3], + _B_ = attrs[2]; + return [0, + caml_call3(Dictionary[3], name, value, attrs[1]), + _B_, + _A_, + _z_]; + case 1: + var + value$0 = param[2], + name$0 = param[1], + _C_ = attrs[4], + _D_ = attrs[3], + _E_ = caml_call3(Dictionary[3], name$0, value$0, attrs[2]); + return [0, attrs[1], _E_, _D_, _C_]; + case 2: + var + value$1 = param[2], + name$1 = param[1], + _F_ = attrs[4], + _G_ = caml_call3(Dictionary[3], name$1, value$1, attrs[3]); + return [0, attrs[1], attrs[2], _G_, _F_]; + default: + var + handler = param[2], + name$2 = param[1], + _H_ = attrs[4], + _I_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }, + _J_ = caml_call3(Dictionary[4], name$2, _I_, _H_); + return [0, attrs[1], attrs[2], attrs[3], _J_]; + } + } + return caml_call3(Stdlib_List[25], _y_, _x_, lst); + } + var Attributes = [0, of_list]; + function text(s){return [0, [0, s], 0];} + function node(tag, attrs, lst){ + return [0, [1, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function node_ns(namespace, tag, attrs, lst){ + return [0, [2, namespace, tag, caml_call1(Attributes[1], attrs), lst], 0]; + } + function keyed(tag, attrs, lst){ + var _w_ = caml_call1(Dictionary[5], lst); + return [0, [3, tag, caml_call1(Attributes[1], attrs), _w_], 0]; + } + function element(_v_){return _v_[2];} + function add_attributes(ops, attrs, el){ + var _p_ = attrs[1], _q_ = caml_call1(ops[9], el); + caml_call2(Dictionary[7], _q_, _p_); + var _r_ = attrs[3], _s_ = caml_call1(ops[10], el); + caml_call2(Dictionary[7], _s_, _r_); + var _t_ = attrs[2], _u_ = caml_call1(ops[11], el); + caml_call2(Dictionary[7], _u_, _t_); + return caml_call2(ops[15], el, attrs[4]); + } + function make(ops, vdom){ + function make(vdom){ + var match = vdom[1]; + switch(match[0]){ + case 0: + var s = match[1]; return [0, [0, s], caml_call1(ops[1], s)]; + case 1: + var + lst = match[3], + attrs = match[2], + tag = match[1], + match$0 = make_children(lst), + real_children = match$0[2], + combined_children = match$0[1], + parent = caml_call2(ops[2], tag, real_children); + add_attributes(ops, attrs, parent); + return [0, [1, tag, attrs, combined_children], parent]; + case 2: + var + lst$0 = match[4], + attrs$0 = match[3], + tag$0 = match[2], + namespace = match[1], + match$1 = make_children(lst$0), + real_children$0 = match$1[2], + combined_children$0 = match$1[1], + parent$0 = caml_call3(ops[3], namespace, tag$0, real_children$0); + add_attributes(ops, attrs$0, parent$0); + return [0, + [2, namespace, tag$0, attrs$0, combined_children$0], + parent$0]; + default: + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + } + function make_children(lst){ + if(! lst) return _b_; + var + tl = lst[2], + hd = lst[1], + hd$0 = make(hd), + hd2 = hd$0[2], + match = make_children(tl), + tl2 = match[2], + tl1 = match[1]; + return [0, [0, hd$0, tl1], [0, hd2, tl2]]; + } + return make(vdom); + } + function update_attributes(ops, par, attrs1, attrs2){ + var + set = caml_call1(ops[9], par), + _g_ = attrs2[1], + _h_ = attrs1[1], + _i_ = caml_call1(ops[12], par); + caml_call5(Dictionary[8], set, set, _i_, _h_, _g_); + var + set$0 = caml_call1(ops[10], par), + _j_ = attrs2[3], + _k_ = attrs1[3], + _l_ = caml_call1(ops[13], par); + caml_call5(Dictionary[8], set$0, set$0, _l_, _k_, _j_); + var + set$1 = caml_call1(ops[11], par), + _m_ = attrs2[2], + _n_ = attrs1[2], + _o_ = caml_call1(ops[14], par); + caml_call5(Dictionary[8], set$1, set$1, _o_, _n_, _m_); + return caml_call3(ops[16], par, attrs1[4], attrs2[4]); + } + function update(ops, vdom, dom){ + var _d_ = vdom[1]; + switch(_d_[0]){ + case 0: + var match = dom[1]; + if(0 === match[0]){ + var el = dom[2], s2 = match[1], s1 = _d_[1]; + return caml_string_equal(s1, s2) + ? [0, dom, 0] + : (caml_call2(ops[8], el, s1), [0, [0, [0, s1], el], 0]); + } + break; + case 1: + var match$0 = dom[1]; + if(1 === match$0[0]){ + var + par = dom[2], + lst2 = match$0[3], + attrs2 = match$0[2], + tag2 = match$0[1], + lst1 = _d_[3], + attrs1 = _d_[2], + tag1 = _d_[1]; + if(caml_string_equal(tag1, tag2)){ + update_attributes(ops, par, attrs1, attrs2); + var + _e_ = update_children(ops, par, lst1, lst2, 0), + children = caml_call1(Stdlib_List[9], _e_); + return [0, [0, [1, tag2, attrs1, children], par], 0]; + } + } + break; + case 2: + var match$1 = dom[1]; + if(2 === match$1[0]){ + var + par$0 = dom[2], + lst2$0 = match$1[4], + attrs2$0 = match$1[3], + tag2$0 = match$1[2], + ns2 = match$1[1], + lst1$0 = _d_[4], + attrs1$0 = _d_[3], + tag1$0 = _d_[2], + ns1 = _d_[1]; + if(caml_string_equal(tag1$0, tag2$0) && caml_string_equal(ns1, ns2)){ + update_attributes(ops, par$0, attrs1$0, attrs2$0); + var + _f_ = update_children(ops, par$0, lst1$0, lst2$0, 0), + children$0 = caml_call1(Stdlib_List[9], _f_); + return [0, [0, [2, ns2, tag2$0, attrs1$0, children$0], par$0], 0]; + } + } + break; + default: + var match$2 = dom[1]; + if(3 === match$2[0]){ + var + par$1 = dom[2], + d2 = match$2[3], + attrs2$1 = match$2[2], + tag2$1 = match$2[1], + d1 = _d_[3], + attrs1$1 = _d_[2], + tag1$1 = _d_[1]; + if(caml_string_equal(tag1$1, tag2$1)){ + update_attributes(ops, par$1, attrs1$1, attrs2$1); + var children$1 = update_keyed(ops, par$1, d1, d2); + return [0, [0, [3, tag2$1, attrs1$1, children$1], par$1], 0]; + } + } + } + return [0, make(ops, vdom), 1]; + } + function update_keyed(ops, par, d1, d2){ + caml_call1(ops[7], par); + var d = [0, Dictionary[1]]; + function _c_(key, vdom){ + var match = caml_call2(Dictionary[2], key, d2); + if(match){ + var dom = match[1], dom$0 = update(ops, vdom, dom)[1], el = dom$0[2]; + caml_call2(ops[4], el, par); + d[1] = caml_call3(Dictionary[3], key, dom$0, d[1]); + return 0; + } + var dom$1 = make(ops, vdom), el$0 = dom$1[2]; + caml_call2(ops[4], el$0, par); + d[1] = caml_call3(Dictionary[3], key, dom$1, d[1]); + return 0; + } + caml_call2(Dictionary[7], _c_, d1); + return d[1]; + } + function update_children(ops, par, lst1, lst2, nlst2){ + var lst1$0 = lst1, lst2$0 = lst2, nlst2$0 = nlst2; + for(;;){ + if(! lst1$0){ + if(! lst2$0) return nlst2$0; + var lst2$2 = lst2$0[2], hd = lst2$0[1][2]; + caml_call2(ops[5], hd, par); + var lst1$0 = 0, lst2$0 = lst2$2; + continue; + } + var lst1$1 = lst1$0[2], hd1 = lst1$0[1]; + if(! lst2$0){ + var hd1$0 = make(ops, hd1), hd11 = hd1$0[2]; + caml_call2(ops[4], hd11, par); + var + nlst2$2 = [0, hd1$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = 0, + nlst2$0 = nlst2$2; + continue; + } + var + lst2$1 = lst2$0[2], + hd2 = lst2$0[1], + old_el = hd2[2], + match = update(ops, hd1, hd2), + created = match[2], + hd2$0 = match[1], + new_el = hd2$0[2]; + if(created) caml_call3(ops[6], old_el, new_el, par); + var + nlst2$1 = [0, hd2$0, nlst2$0], + lst1$0 = lst1$1, + lst2$0 = lst2$1, + nlst2$0 = nlst2$1; + } + } + var + Fmlib_browser_Vdom = + [0, + Dictionary, + Attributes, + text, + node, + node_ns, + keyed, + element, + add_attributes, + make, + update_attributes, + update, + update_keyed, + update_children]; + runtime.caml_register_global(6, Fmlib_browser_Vdom, "Fmlib_browser__Vdom"); + return; + } + (globalThis)); + +//# 953 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace, + caml_wrap_exception = runtime.caml_wrap_exception; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "", + Stdlib = global_data.Stdlib, + Stdlib_String = global_data.Stdlib__String, + Fmlib_js_Base = global_data.Fmlib_js__Base, + cst_col = " col: ", + cst_line = " line: ", + cst_assertion_failed_file = "assertion failed file: ", + cst_Uncaught_javascript_except = "Uncaught javascript exception", + cst_Uncaught_ocaml_exception = "Uncaught ocaml exception"; + function attempt(str, f, cleanup){ + try{var _c_ = caml_call1(f, 0); return _c_;} + catch(exn$0){ + var exn = caml_wrap_exception(exn$0); + if(exn[1] === Stdlib[5]){ + var + match = exn[2], + col = match[3], + line = match[2], + file = match[1], + _a_ = [0, cst_col, [0, caml_call1(Stdlib[33], col), 0]], + _b_ = + [0, + cst_assertion_failed_file, + [0, file, [0, cst_line, [0, caml_call1(Stdlib[33], line), _a_]]]], + msg = caml_call2(Stdlib_String[6], cst, _b_); + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + caml_call1(Fmlib_js_Base[3][4], msg); + return caml_call1(Fmlib_js_Base[3][3], str); + } + caml_call1(cleanup, 0); + caml_call1(Fmlib_js_Base[3][4], str); + var match$0 = caml_call1(Fmlib_js_Base[3][1], exn); + if(match$0){ + var js_error = match$0[1]; + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_javascript_except); + return caml_call1(Fmlib_js_Base[3][2], js_error); + } + caml_call1(Fmlib_js_Base[3][4], cst_Uncaught_ocaml_exception); + throw caml_maybe_attach_backtrace(exn, 0); + } + } + var Fmlib_browser_Assert_failure = [0, attempt]; + runtime.caml_register_global + (9, Fmlib_browser_Assert_failure, "Fmlib_browser__Assert_failure"); + return; + } + (globalThis)); + +//# 1023 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_src_browser_random_ml = "src/browser/random.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Assert_failure = global_data.Assert_failure, + Stdlib_Array = global_data.Stdlib__Array, + Stdlib_Random = global_data.Stdlib__Random, + _c_ = [0, cst_src_browser_random_ml, 44, 4], + _b_ = [0, cst_src_browser_random_ml, 32, 4], + _a_ = [0, cst_src_browser_random_ml, 26, 4]; + function run(random){ + return caml_call1(random, caml_call1(Stdlib_Random[15][2], 0)); + } + function constant(a, param){return a;} + function symbol_bind(m, f, state){ + return caml_call2(f, caml_call1(m, state), state); + } + function map(f, m){ + function _j_(a){ + var _l_ = caml_call1(f, a); + return function(_m_){return _l_;}; + } + return function(_k_){return symbol_bind(m, _j_, _k_);}; + } + function int$0(bound, state){ + if(0 < bound) return caml_call2(Stdlib_Random[15][5], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function float$0(bound, state){ + if(0. <= bound) return caml_call2(Stdlib_Random[15][10], state, bound); + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + } + var bool = Stdlib_Random[15][11]; + function choose(lst){ + var arr = caml_call1(Stdlib_Array[10], lst), len = arr.length - 1; + function _d_(i){ + if(i >= len) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + var _h_ = runtime.caml_check_bound(arr, i)[1 + i]; + return function(_i_){return _h_;}; + } + function _e_(_g_){return int$0(len, _g_);} + return function(_f_){return symbol_bind(_e_, _d_, _f_);}; + } + var + Fmlib_browser_Random = + [0, + run, + constant, + symbol_bind, + symbol_bind, + map, + int$0, + float$0, + bool, + choose]; + runtime.caml_register_global + (7, Fmlib_browser_Random, "Fmlib_browser__Random"); + return; + } + (globalThis)); + +//# 1102 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_loadend$1 = "loadend", + cst_src_browser_task_ml = "src/browser/task.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Date = global_data.Fmlib_js__Date, + Fmlib_js_Http_request = global_data.Fmlib_js__Http_request, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + _l_ = [0, cst_src_browser_task_ml, 183, 8], + _j_ = [1, -819565531], + _k_ = [1, -1056736433], + cst_loadend$0 = cst_loadend$1, + _i_ = [0, cst_src_browser_task_ml, 159, 8], + cst_loadend = cst_loadend$1, + _g_ = [0, 0], + _h_ = [1, -358247754], + _e_ = [0, 0], + _f_ = [1, -358247754], + _d_ = [0, 0], + _c_ = [0, 0], + _b_ = [0, 0], + cst_Exception_in_task_executio = "Exception in task execution", + _a_ = [0, cst_src_browser_task_ml, 11, 4]; + function absurd(param){ + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + } + function continue$0(k, a){ + function _E_(param){return 0;} + function _F_(param){return caml_call1(k, a);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_task_executio, + _F_, + _E_); + } + function run(task, post, k){ + return caml_call2 + (task, + post, + function(param){ + if(0 === param[0]){var a = param[1]; return continue$0(k, a);} + var e = param[1]; + return absurd(e); + }); + } + function succeed(a, param, k){return continue$0(k, [0, a]);} + function fail(e, param, k){return continue$0(k, [1, e]);} + function result(r, param, k){return continue$0(k, r);} + function symbol_bind(m, f, post, k){ + return caml_call2 + (m, + post, + function(param){ + if(0 === param[0]){ + var a = param[1]; + return caml_call3(f, a, post, k); + } + var e = param[1]; + return continue$0(k, [1, e]); + }); + } + function map(f, m){ + function _y_(a){ + var _B_ = caml_call1(f, a); + return function(_C_, _D_){return succeed(_B_, _C_, _D_);}; + } + return function(_z_, _A_){return symbol_bind(m, _y_, _z_, _A_);}; + } + function make_succeed(f, m, post, k){ + return caml_call2 + (m, + post, + function(res){return continue$0(k, [0, caml_call1(f, res)]);}); + } + function log_string(s, param, k){ + caml_call1(Fmlib_js_Base[3][4], s); + return continue$0(k, _b_); + } + function log_value(v, param, k){ + caml_call1(Fmlib_js_Base[3][5], v); + return continue$0(k, _c_); + } + function sleep(ms, a, param, k){ + function _x_(param){return continue$0(k, [0, a]);} + caml_call2(Fmlib_js_Timer[1], _x_, ms); + return 0; + } + function next_tick(a){ + var _u_ = 0; + return function(_v_, _w_){return sleep(_u_, a, _v_, _w_);}; + } + function send_to_javascript(v, post, k){ + caml_call1(post, v); + return continue$0(k, _d_); + } + function focus(id, param, k){ + var + _s_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _t_ = caml_call1(Fmlib_js_Dom[7][3], _s_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _t_); + if(! match) return caml_call1(k, _f_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][15], el); + return continue$0(k, _e_); + } + function blur(id, param, k){ + var + _q_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _r_ = caml_call1(Fmlib_js_Dom[7][3], _q_), + match = caml_call2(Fmlib_js_Dom[4][4], id, _r_); + if(! match) return continue$0(k, _h_); + var el = match[1]; + caml_call1(Fmlib_js_Dom[3][16], el); + return continue$0(k, _g_); + } + function random(rand, param, k){ + return continue$0(k, [0, caml_call1(Fmlib_browser_Random[1], rand)]); + } + function http_text(meth, url, headers, body, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _i_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + return 200 === status + ? continue$0(k, [0, caml_call1(Fmlib_js_Http_request[6], req)]) + : continue$0(k, [1, [0, -264964567, status]]); + } + var _p_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend, handler, _p_); + } + function http_json(meth, url, headers, body, decode, param, k){ + var req = caml_call4(Fmlib_js_Http_request[2], meth, url, headers, body); + function handler(param){ + if(4 !== caml_call1(Fmlib_js_Http_request[3], req)) + throw caml_maybe_attach_backtrace([0, Assert_failure, _l_], 1); + var status = caml_call1(Fmlib_js_Http_request[4], req); + if(200 !== status) return continue$0(k, [1, [0, -264964567, status]]); + var + _o_ = caml_call1(Fmlib_js_Http_request[5], req), + match = caml_call1(Fmlib_js_Base[1][13], _o_); + if(! match) return continue$0(k, _k_); + var v = match[1], match$0 = caml_call1(decode, v); + if(! match$0) return continue$0(k, _j_); + var a = match$0[1]; + return continue$0(k, [0, a]); + } + var _n_ = caml_call1(Fmlib_js_Http_request[1], req); + return caml_call3(Fmlib_js_Event_target[1], cst_loadend$0, handler, _n_); + } + function now(param, k){ + return continue$0(k, [0, caml_call1(Fmlib_js_Date[1], 0)]); + } + function time_zone(param, k){ + var _m_ = caml_call1(Fmlib_js_Date[1], 0); + return continue$0(k, [0, caml_call1(Fmlib_js_Date[4], _m_)]); + } + var + Fmlib_browser_Task = + [0, + absurd, + continue$0, + run, + succeed, + succeed, + fail, + result, + symbol_bind, + symbol_bind, + map, + make_succeed, + log_string, + log_value, + sleep, + next_tick, + send_to_javascript, + focus, + blur, + random, + http_text, + http_json, + now, + time_zone]; + runtime.caml_register_global(24, Fmlib_browser_Task, "Fmlib_browser__Task"); + return; + } + (globalThis)); + +//# 1323 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + cst_visibilityState = "visibilityState", + cst_target = "target", + cst_visibilitychange = "visibilitychange", + cst_innerHeight = "innerHeight", + cst_innerWidth = "innerWidth", + cst_currentTarget = "currentTarget", + cst_resize = "resize", + cst_mouseup = "mouseup", + cst_mousemove = "mousemove", + cst_mousedown = "mousedown", + cst_keyup = "keyup", + cst_keydown = "keydown", + cst_clientY = "clientY", + cst_clientX = "clientX", + cst_key = "key", + none = 0; + function batch(lst){return [4, lst];} + function on_window(event_type, decode){ + return [0, + event_type, + [0, + Fmlib_browser_Event_flag[4], + Fmlib_browser_Event_flag[2], + decode]]; + } + function every(ms, callback){return [1, ms, callback];} + function on_message(decode){return [2, decode];} + function on_url_request(f){return [3, f];} + function map(f, sub){ + function map(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var decode = param[2], event_type = param[1]; + return [0, + event_type, + caml_call2(Fmlib_browser_Handler[3][3], f, decode)]; + case 1: + var g = param[2], millis = param[1]; + return [1, + millis, + function(time){return caml_call1(f, caml_call1(g, time));}]; + case 2: + var decode$0 = param[1]; + return [2, caml_call2(Fmlib_js_Base[2][7], f, decode$0)]; + case 3: + var g$0 = param[1]; + return [3, function(url){return caml_call1(f, caml_call1(g$0, url));}]; + default: + var lst = param[1]; return [4, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(sub); + } + function decode_key_event(f){ + var _r_ = caml_call2(Fmlib_js_Base[2][16], cst_key, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][7], f, _r_); + } + function decode_mouse_event(f){ + function _m_(x){ + function _o_(y){ + var _q_ = caml_call2(f, x, y); + return caml_call1(Fmlib_js_Base[2][1], _q_); + } + var + _p_ = + caml_call2(Fmlib_js_Base[2][16], cst_clientY, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _p_, _o_); + } + var + _n_ = caml_call2(Fmlib_js_Base[2][16], cst_clientX, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _n_, _m_); + } + function on_keydown(f){return on_window(cst_keydown, decode_key_event(f));} + function on_keyup(f){return on_window(cst_keyup, decode_key_event(f));} + function on_mouse_down(f){ + return on_window(cst_mousedown, decode_mouse_event(f)); + } + function on_mouse_move(f){ + return on_window(cst_mousemove, decode_mouse_event(f)); + } + function on_mouse_up(f){ + return on_window(cst_mouseup, decode_mouse_event(f)); + } + function on_resize(f){ + function _e_(param){ + function _g_(width){ + function _j_(height){ + var _l_ = caml_call2(f, width, height); + return caml_call1(Fmlib_js_Base[2][1], _l_); + } + var + _k_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_innerHeight, Fmlib_js_Base[2][11]); + return caml_call2(Fmlib_js_Base[2][4], _k_, _j_); + } + var + _h_ = + caml_call2(Fmlib_js_Base[2][16], cst_innerWidth, Fmlib_js_Base[2][11]), + _i_ = caml_call2(Fmlib_js_Base[2][4], _h_, _g_); + return caml_call2(Fmlib_js_Base[2][16], cst_currentTarget, _i_); + } + var + _f_ = caml_call1(Fmlib_js_Base[2][1], 0), + decode = caml_call2(Fmlib_js_Base[2][4], _f_, _e_); + return on_window(cst_resize, decode); + } + function on_visibility_change(f){ + function _a_(state){ + var _d_ = caml_call1(f, state); + return caml_call1(Fmlib_js_Base[2][1], _d_); + } + var + _b_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_visibilityState, Fmlib_js_Base[2][13]), + _c_ = caml_call2(Fmlib_js_Base[2][4], _b_, _a_), + decode = caml_call2(Fmlib_js_Base[2][16], cst_target, _c_); + return on_window(cst_visibilitychange, decode); + } + var + Fmlib_browser_Subscription = + [0, + none, + batch, + on_window, + every, + on_message, + on_url_request, + map, + decode_key_event, + decode_mouse_event, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change]; + runtime.caml_register_global + (19, Fmlib_browser_Subscription, "Fmlib_browser__Subscription"); + return; + } + (globalThis)); + +//# 1491 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + Stdlib_List = global_data.Stdlib__List, + Stdlib_String = global_data.Stdlib__String, + Fmlib_std_Btree = global_data.Fmlib_std__Btree, + Stdlib_Int = global_data.Stdlib__Int, + Fmlib_browser_Dictionary = global_data.Fmlib_browser__Dictionary, + String_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_String[9]]), + Int_map = caml_call1(Fmlib_std_Btree[2], [0, Stdlib_Int[9]]), + Intionary = caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_Int[9]]), + Dictionary = + caml_call1(Fmlib_browser_Dictionary[1], [0, Stdlib_String[9]]), + empty = [0, Dictionary[1], Intionary[1], 0, 0]; + function make(sub){ + function make(subs, param){ + if(typeof param === "number") return subs; + switch(param[0]){ + case 0: + var + handler = param[2], + event_type = param[1], + _i_ = subs[4], + _j_ = subs[3], + _k_ = subs[2], + _l_ = subs[1], + _m_ = + function(param){ + if(! param) return [0, handler, 0]; + var lst = param[1]; + return [0, handler, lst]; + }; + return [0, + caml_call3(Dictionary[4], event_type, _m_, _l_), + _k_, + _j_, + _i_]; + case 1: + var + callback = param[2], + millis = param[1], + _n_ = subs[4], + _o_ = subs[3], + _p_ = subs[2], + _q_ = + function(param){ + if(! param) return [0, callback, 0]; + var lst = param[1]; + return [0, callback, lst]; + }, + _r_ = caml_call3(Intionary[4], millis, _q_, _p_); + return [0, subs[1], _r_, _o_, _n_]; + case 2: + var decode = param[1], _s_ = subs[4], _t_ = subs[3] || [0, decode]; + return [0, subs[1], subs[2], _t_, _s_]; + case 3: + var f = param[1], _u_ = subs[4] || [0, f]; + return [0, subs[1], subs[2], subs[3], _u_]; + default: + var lst = param[1]; + return caml_call3(Stdlib_List[25], make, subs, lst); + } + } + return make(empty, sub); + } + var Subs = [0, empty, make]; + function make$0(dispatch, sub){ + var + subs = caml_call1(Subs[2], sub), + window = caml_call1(Fmlib_browser_Handler[4][3], 0), + _f_ = subs[1], + _g_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _h_ = caml_call1(Fmlib_js_Dom[7][2], _g_); + caml_call4(Fmlib_browser_Handler[4][5], _h_, dispatch, _f_, window); + var timers = caml_call1(Fmlib_browser_Handler[5][3], 0); + caml_call3(Fmlib_browser_Handler[5][7], dispatch, subs[2], timers); + var url_request = caml_call1(Fmlib_browser_Handler[6][1], 0); + caml_call3(Fmlib_browser_Handler[6][7], dispatch, subs[4], url_request); + return [0, subs, window, timers, url_request]; + } + function update(dispatch, sub, s){ + var + subs = caml_call1(Subs[2], sub), + _a_ = s[2], + _b_ = s[1][1], + _c_ = subs[1], + _d_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _e_ = caml_call1(Fmlib_js_Dom[7][2], _d_); + caml_call5(Fmlib_browser_Handler[4][6], _e_, dispatch, _c_, _b_, _a_); + caml_call4(Fmlib_browser_Handler[5][8], dispatch, subs[2], s[1][2], s[3]); + caml_call4(Fmlib_browser_Handler[6][8], dispatch, subs[4], s[1][4], s[4]); + return [0, subs, s[2], s[3], s[4]]; + } + var + Fmlib_browser_Subscriptions = + [0, String_map, Int_map, Intionary, Dictionary, Subs, make$0, update]; + runtime.caml_register_global + (7, Fmlib_browser_Subscriptions, "Fmlib_browser__Subscriptions"); + return; + } + (globalThis)); + +//# 1620 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Stdlib_List = global_data.Stdlib__List, + none = 0; + function batch(lst){return [2, lst];} + function perform(task){return [0, task];} + function just_do(task){return [1, task];} + function attempt(f, task){ + return [0, caml_call2(Fmlib_browser_Task[11], f, task)]; + } + function map(f, cmd){ + function map(cmd){ + if(typeof cmd === "number") return 0; + switch(cmd[0]){ + case 0: + var task = cmd[1]; + return [0, caml_call2(Fmlib_browser_Task[10], f, task)]; + case 1: + return cmd; + default: + var lst = cmd[1]; return [2, caml_call2(Stdlib_List[19], map, lst)]; + } + } + return map(cmd); + } + function execute(post, dispatch, cmd){ + function exe(param){ + if(typeof param === "number") return 0; + switch(param[0]){ + case 0: + var task = param[1]; + return caml_call3(Fmlib_browser_Task[3], task, post, dispatch); + case 1: + var task$0 = param[1], _a_ = function(param){return 0;}; + return caml_call3(Fmlib_browser_Task[3], task$0, post, _a_); + default: + var lst = param[1]; return caml_call2(Stdlib_List[17], exe, lst); + } + } + return exe(cmd); + } + var + Fmlib_browser_Command = + [0, none, batch, perform, just_do, attempt, map, execute]; + runtime.caml_register_global + (2, Fmlib_browser_Command, "Fmlib_browser__Command"); + return; + } + (globalThis)); + +//# 1687 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_application_already_initia$1 = "application already initialized", + cst_cannot_decode_initialisati$1 = "cannot decode initialisation data", + cst_data$1 = "data", + cst_init$1 = "init", + cst_load$4 = "load", + cst_onMessage$1 = "onMessage", + cst_post$1 = "post", + cst_src_browser_browser_ml = "src/browser/browser.ml", + caml_maybe_attach_backtrace = runtime.caml_maybe_attach_backtrace; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + function caml_call5(f, a0, a1, a2, a3, a4){ + return (f.l >= 0 ? f.l : f.l = f.length) == 5 + ? f(a0, a1, a2, a3, a4) + : runtime.caml_call_gen(f, [a0, a1, a2, a3, a4]); + } + var + global_data = runtime.caml_get_global_data(), + cst = "'", + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_js_Timer = global_data.Fmlib_js__Timer, + Fmlib_browser_Subscriptions = global_data.Fmlib_browser__Subscriptions, + Fmlib_browser_Assert_failure = global_data.Fmlib_browser__Assert_failure, + Assert_failure = global_data.Assert_failure, + Fmlib_js_Dom = global_data.Fmlib_js__Dom, + Fmlib_js_Event_target = global_data.Fmlib_js__Event_target, + Fmlib_js_Base = global_data.Fmlib_js__Base, + Stdlib = global_data.Stdlib, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Stdlib_List = global_data.Stdlib__List, + Fmlib_browser_Handler = global_data.Fmlib_browser__Handler, + cst_Exception_in_update_subscr = + "Exception in 'update_subscriptions' of Fmlib_browser", + _d_ = [0, cst_src_browser_browser_ml, 353, 4], + cst_load$3 = cst_load$4, + cst_post$0 = cst_post$1, + cst_init$0 = cst_init$1, + cst_application_already_initia$0 = cst_application_already_initia$1, + cst_load$2 = cst_load$4, + cst_cannot_decode_initialisati$0 = cst_cannot_decode_initialisati$1, + cst_data$0 = cst_data$1, + cst_onMessage$0 = cst_onMessage$1, + cst_post = cst_post$1, + cst_init = cst_init$1, + cst_Cannot_find_element = "Cannot find element ", + cst_application_already_initia = cst_application_already_initia$1, + cst_load$1 = cst_load$4, + cst_cannot_decode_initialisati = cst_cannot_decode_initialisati$1, + cst_element_id = "element_id", + cst_data = cst_data$1, + cst_onMessage = cst_onMessage$1, + cst_load$0 = cst_load$4, + cst_load = cst_load$4, + cst_receive_message_cannot_dec = + "receive_message: cannot decode message from javascript", + cst_receive_message_event_not_ = "receive_message: event not subscribed", + cst_receive_message_subscripti = + "receive_message: subscriptions not yet initialized", + cst_receive_message_applicatio = + "receive_message: application not yet initialized", + cst_Exception_in_update = "Exception in 'update'", + cst_subscriptioin = "subscriptioin", + cst_view = "view", + cst_Exception_in = "Exception in '", + cst_Exception_in_update_dom_of = + "Exception in 'update_dom' of Fmlib_browser", + _c_ = [0, cst_src_browser_browser_ml, 341, 4], + _b_ = [0, cst_src_browser_browser_ml, 94, 12], + _a_ = [0, cst_src_browser_browser_ml, 85, 12]; + function document(param){ + var _bE_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call1(Fmlib_js_Dom[7][3], _bE_); + } + function dom_operations(dispatch){ + function get_both(param){ + var match = param[2]; + if(! match) + throw caml_maybe_attach_backtrace([0, Assert_failure, _a_], 1); + var el = match[1]; + return el; + } + function get_element(param){ + var _bD_ = param[2]; + if(! _bD_) + throw caml_maybe_attach_backtrace([0, Assert_failure, _b_], 1); + var el = _bD_[1][1]; + return el; + } + function _a5_(el, dict1, dict2){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bC_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bC_); + return caml_call5 + (Fmlib_browser_Handler[4][6], + target, + dispatch, + dict1, + dict2, + reals); + } + function _a6_(el, dict){ + var + match = get_both(el), + reals = match[2], + el$0 = match[1], + _bB_ = caml_call1(Fmlib_js_Dom[3][1], el$0), + target = caml_call1(Fmlib_js_Dom[1][1], _bB_); + return caml_call4 + (Fmlib_browser_Handler[4][5], target, dispatch, dict, reals); + } + function _a7_(el, key){ + var _bA_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][14], key, _bA_); + } + function _a8_(el, key){ + var _bz_ = get_element(el); + return caml_call2(Fmlib_js_Dom[3][12], key, _bz_); + } + function _a9_(el, key){ + var _bx_ = get_element(el), _by_ = caml_call1(Fmlib_js_Dom[3][10], _bx_); + return caml_call2(Fmlib_js_Dom[2][2], key, _by_); + } + function _a__(el, key, value){ + var _bw_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][13], key, value, _bw_); + } + function _a$_(el, key, value){ + var _bv_ = get_element(el); + return caml_call3(Fmlib_js_Dom[3][11], key, value, _bv_); + } + function _ba_(el, key, value){ + var _bt_ = get_element(el), _bu_ = caml_call1(Fmlib_js_Dom[3][10], _bt_); + return caml_call3(Fmlib_js_Dom[2][1], key, value, _bu_); + } + function _bb_(param, text){ + var node = param[1]; + return caml_call2(Fmlib_js_Dom[1][10], text, node); + } + function _bc_(param){ + var par = param[1]; + return caml_call1(Fmlib_js_Dom[1][8], par); + } + function _bd_(param, _bs_, _br_){ + var par = _br_[1], new_child = _bs_[1], old_child = param[1]; + return caml_call3(Fmlib_js_Dom[1][7], new_child, old_child, par); + } + function _be_(param, _bq_){ + var par = _bq_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][6], child, par); + } + function _bf_(param, _bp_){ + var par = _bp_[1], child = param[1]; + return caml_call2(Fmlib_js_Dom[1][5], child, par); + } + function _bg_(namespace, tag, lst){ + var + doc = document(0), + el = caml_call3(Fmlib_js_Dom[4][7], namespace, tag, doc); + function _bm_(param){ + var child = param[1], _bo_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bo_); + } + caml_call2(Stdlib_List[17], _bm_, lst); + var _bn_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bn_]; + } + function _bh_(tag, lst){ + var doc = document(0), el = caml_call2(Fmlib_js_Dom[4][5], tag, doc); + function _bj_(param){ + var child = param[1], _bl_ = caml_call1(Fmlib_js_Dom[3][1], el); + return caml_call2(Fmlib_js_Dom[1][5], child, _bl_); + } + caml_call2(Stdlib_List[17], _bj_, lst); + var _bk_ = [0, [0, el, caml_call1(Fmlib_browser_Handler[4][3], 0)]]; + return [0, caml_call1(Fmlib_js_Dom[3][1], el), _bk_]; + } + return [0, + function(s){ + var _bi_ = document(0); + return [0, caml_call2(Fmlib_js_Dom[4][6], s, _bi_), 0]; + }, + _bh_, + _bg_, + _bf_, + _be_, + _bd_, + _bc_, + _bb_, + _ba_, + _a$_, + _a__, + _a9_, + _a8_, + _a7_, + _a6_, + _a5_]; + } + function dispatch(data, msg){ + function update_data(state){ + var + state_different = 1 - (state === data[1] ? 1 : 0), + _a3_ = data[2], + _a4_ = _a3_ || state_different; + data[2] = _a4_; + return state_different + ? (data[1] = state, update_subscriptions(data)) + : state_different; + } + var match = data[6]; + switch(match[0]){ + case 0: + var update = match[3]; + return update_data(caml_call2(update, data[1], msg)); + case 1: + var + post = match[4], + update$0 = match[3], + match$0 = caml_call2(update$0, data[1], msg), + cmd = match$0[2], + state = match$0[1]; + update_data(state); + var _aZ_ = function(_a1_){return dispatch_next(data, _a1_);}; + return caml_call3(Fmlib_browser_Command[7], post, _aZ_, cmd); + default: + var + post$0 = match[4], + update$1 = match[3], + match$1 = caml_call2(update$1, data[1], msg), + cmd$0 = match$1[2], + state$0 = match$1[1]; + update_data(state$0); + var _a0_ = function(_a2_){return dispatch_next(data, _a2_);}; + return caml_call3(Fmlib_browser_Command[7], post$0, _a0_, cmd$0); + } + } + function dispatch_next(data, msg){ + var _aX_ = 0; + function _aY_(param){return dispatch(data, msg);} + caml_call2(Fmlib_js_Timer[1], _aY_, _aX_); + return 0; + } + function update_subscriptions(data){ + function update(param){ + var match = data[4], sub = data[6][2]; + if(! match){ + var + _aT_ = caml_call1(sub, data[1]), + _aU_ = function(_aW_){return dispatch(data, _aW_);}; + data[4] = [0, caml_call2(Fmlib_browser_Subscriptions[6], _aU_, _aT_)]; + return 0; + } + var subs = match[1]; + if(! data[2]) return 0; + var _aR_ = caml_call1(sub, data[1]); + function _aS_(_aV_){return dispatch(data, _aV_);} + data[4] = + [0, caml_call3(Fmlib_browser_Subscriptions[7], _aS_, _aR_, subs)]; + return 0; + } + function _aQ_(param){return 0;} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_subscr, + update, + _aQ_); + } + function put_below_root(data, dom){ + var root_node = caml_call1(Fmlib_js_Dom[3][1], data[5]); + caml_call1(Fmlib_js_Dom[1][8], root_node); + var _aP_ = caml_call1(Fmlib_browser_Vdom[7], dom)[1]; + return caml_call2(Fmlib_js_Dom[1][5], _aP_, root_node); + } + function update_dom(data){ + function update(param){ + function vdom(data){ + var match = data[6]; + switch(match[0]){ + case 0: + var + view = match[1], + _aM_ = function(param){return 0;}, + match$1 = [0, caml_call1(view, data[1]), _aM_]; + break; + case 1: + var + view$0 = match[1], + _aN_ = function(param){return 0;}, + match$1 = [0, caml_call1(view$0, data[1]), _aN_]; + break; + default: + var + view$1 = match[1], + match$0 = caml_call1(view$1, data[1]), + title = match$0[2], + vdom = match$0[1], + match$1 = + [0, + vdom, + function(param){ + var _aO_ = document(0); + return caml_call2(Fmlib_js_Dom[4][2], title, _aO_); + }]; + } + var set_title = match$1[2], vdom$0 = match$1[1]; + set_title(0); + return vdom$0; + } + var match = data[3]; + if(! match){ + var + _aI_ = vdom(data), + _aJ_ = dom_operations(function(_aL_){return dispatch(data, _aL_);}), + dom$1 = caml_call2(Fmlib_browser_Vdom[9], _aJ_, _aI_); + data[3] = [0, dom$1]; + return put_below_root(data, dom$1); + } + var dom = match[1], _aE_ = data[2]; + if(_aE_){ + var + _aF_ = vdom(data), + _aG_ = dom_operations(function(_aK_){return dispatch(data, _aK_);}), + match$0 = caml_call3(Fmlib_browser_Vdom[11], _aG_, _aF_, dom), + created = match$0[2], + dom$0 = match$0[1]; + if(created) put_below_root(data, dom$0); + data[3] = [0, dom$0]; + var _aH_ = 0; + } + else + var _aH_ = _aE_; + return _aH_; + } + function cleanup(param){data[2] = 0; return 0;} + caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update_dom_of, + update, + cleanup); + cleanup(0); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _c_], 1); + return 0; + } + function on_next_animation(f){ + var _aD_ = caml_call1(Fmlib_js_Dom[7][1], 0); + return caml_call2(Fmlib_js_Dom[7][6], f, _aD_); + } + function animate(data, param){ + update_dom(data); + if(data[2]) + throw caml_maybe_attach_backtrace([0, Assert_failure, _d_], 1); + return on_next_animation(function(_aC_){return animate(data, _aC_);}); + } + function wrap_state_fun(str, f, state){ + function _ay_(param){return 0;} + function _az_(param){return caml_call1(f, state);} + var + _aA_ = caml_call2(Stdlib[28], str, cst), + _aB_ = caml_call2(Stdlib[28], cst_Exception_in, _aA_); + return caml_call3(Fmlib_browser_Assert_failure[1], _aB_, _az_, _ay_); + } + function wrap_view(view, state){ + return wrap_state_fun(cst_view, view, state); + } + function wrap_subscription(view, state){ + return wrap_state_fun(cst_subscriptioin, view, state); + } + function wrap_update(update, state, message){ + function _aw_(param){return 0;} + function _ax_(param){return caml_call2(update, state, message);} + return caml_call3 + (Fmlib_browser_Assert_failure[1], + cst_Exception_in_update, + _ax_, + _aw_); + } + function receive_message(data){ + function post(v){ + var match = data[1]; + if(! match){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_applicatio); + return Fmlib_js_Base[1][1]; + } + var data$0 = match[1], match$0 = data$0[4]; + if(! match$0){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_subscripti); + return Fmlib_js_Base[1][1]; + } + var subs = match$0[1], match$1 = subs[1][3]; + if(! match$1){ + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_event_not_); + return Fmlib_js_Base[1][1]; + } + var decode = match$1[1], match$2 = caml_call1(decode, v); + if(match$2){ + var m = match$2[1]; + dispatch(data$0, m); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_receive_message_cannot_dec); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + return caml_call1(Fmlib_js_Base[1][9], post); + } + function start_application(data, command, post){ + update_subscriptions(data); + update_dom(data); + function _at_(_av_){return dispatch_next(data, _av_);} + caml_call3(Fmlib_browser_Command[7], post, _at_, command); + return on_next_animation(function(_au_){return animate(data, _au_);}); + } + function make_sandbox(state, view, sub, update, param){ + function _ak_(_ar_, _as_){return wrap_update(update, _ar_, _as_);} + function _al_(_aq_){return wrap_subscription(sub, _aq_);} + var + _am_ = [0, function(_ap_){return wrap_view(view, _ap_);}, _al_, _ak_], + _an_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _an_), _am_]; + update_subscriptions(data); + update_dom(data); + return on_next_animation(function(_ao_){return animate(data, _ao_);}); + } + function sandbox(state, view, update){ + var + _af_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ag_ = caml_call1(Fmlib_js_Dom[7][2], _af_); + function _ah_(param){return Fmlib_browser_Subscription[1];} + function _ai_(_aj_){return make_sandbox(state, view, _ah_, update, _aj_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load, _ai_, _ag_); + } + function sandbox_plus(state, view, sub, update){ + var + _ab_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _ac_ = caml_call1(Fmlib_js_Dom[7][2], _ab_); + function _ad_(_ae_){return make_sandbox(state, view, sub, update, _ae_);} + return caml_call3(Fmlib_js_Event_target[1], cst_load$0, _ad_, _ac_); + } + function element(name, decode$0, view, subs, update){ + var dataref = [0, 0], _K_ = [0, cst_post, receive_message(dataref)]; + function _I_(post){ + function _Y_(param){ + var cmd = param[2], state = param[1]; + function ___(element_id){ + var + _aa_ = + [0, + element_id, + state, + cmd, + function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _aa_); + } + var + _$_ = + caml_call2 + (Fmlib_js_Base[2][16], cst_element_id, Fmlib_js_Base[2][13]); + return caml_call2(Fmlib_js_Base[2][4], _$_, ___); + } + var _Z_ = caml_call2(Fmlib_js_Base[2][16], cst_data, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _Z_, _Y_); + } + var + _J_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _J_, _I_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[4], + command = match$0[3], + state = match$0[2], + element_id = match$0[1], + _N_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _O_ = caml_call1(Fmlib_js_Dom[7][2], _N_), + _P_ = + function(param){ + var + _Q_ = document(0), + match = caml_call2(Fmlib_js_Dom[4][4], element_id, _Q_); + if(match){ + var + root = match[1], + _R_ = function(_W_, _X_){return wrap_update(update, _W_, _X_);}, + _S_ = function(_V_){return wrap_subscription(subs, _V_);}, + data = + [0, + state, + 0, + 0, + 0, + root, + [1, + function(_U_){return wrap_view(view, _U_);}, + _S_, + _R_, + post]]; + dataref[1] = [0, data]; + return start_application(data, command, post); + } + var + _T_ = caml_call2(Stdlib[28], cst_Cannot_find_element, element_id); + return caml_call1(Fmlib_js_Base[3][4], _T_); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$1, _P_, _O_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _L_ = [0, [0, cst_init, caml_call1(Fmlib_js_Base[1][9], init)], _K_], + _M_ = caml_call1(Fmlib_js_Base[1][7], _L_); + return caml_call2(Fmlib_js_Base[3][8], name, _M_); + } + function application(name, decode$0, view, subs, update){ + var dataref = [0, 0], _r_ = [0, cst_post$0, receive_message(dataref)]; + function _p_(post){ + function _F_(param){ + var + cmd = param[2], + state = param[1], + _H_ = [0, state, cmd, function(v){caml_call1(post, [0, v]); return 0;}]; + return caml_call1(Fmlib_js_Base[2][1], _H_); + } + var _G_ = caml_call2(Fmlib_js_Base[2][16], cst_data$0, decode$0); + return caml_call2(Fmlib_js_Base[2][4], _G_, _F_); + } + var + _q_ = + caml_call2(Fmlib_js_Base[2][16], cst_onMessage$0, Fmlib_js_Base[2][14]), + decode = caml_call2(Fmlib_js_Base[2][4], _q_, _p_); + function init(v){ + if(dataref[1]){ + caml_call1(Fmlib_js_Base[3][4], cst_application_already_initia$0); + return Fmlib_js_Base[1][1]; + } + var match = caml_call1(decode, v); + if(match){ + var + match$0 = match[1], + post = match$0[3], + command = match$0[2], + state = match$0[1], + _u_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _v_ = caml_call1(Fmlib_js_Dom[7][2], _u_), + _w_ = + function(param){ + function _x_(_D_, _E_){return wrap_update(update, _D_, _E_);} + function _y_(_C_){return wrap_subscription(subs, _C_);} + var + _z_ = + [2, function(_B_){return wrap_view(view, _B_);}, _y_, _x_, post], + _A_ = document(0), + data = + [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _A_), _z_]; + dataref[1] = [0, data]; + return start_application(data, command, post); + }; + caml_call3(Fmlib_js_Event_target[1], cst_load$2, _w_, _v_); + return Fmlib_js_Base[1][1]; + } + caml_call1(Fmlib_js_Base[3][4], cst_cannot_decode_initialisati$0); + caml_call1(Fmlib_js_Base[3][5], v); + return Fmlib_js_Base[1][1]; + } + var + _s_ = [0, [0, cst_init$0, caml_call1(Fmlib_js_Base[1][9], init)], _r_], + _t_ = caml_call1(Fmlib_js_Base[1][7], _s_); + return caml_call2(Fmlib_js_Base[3][8], name, _t_); + } + function basic_application(state, command, view, sub, update){ + function post(param){return 0;} + var + _e_ = caml_call1(Fmlib_js_Dom[7][1], 0), + _f_ = caml_call1(Fmlib_js_Dom[7][2], _e_); + function _g_(param){ + function _h_(_n_, _o_){return wrap_update(update, _n_, _o_);} + function _i_(_m_){return wrap_subscription(sub, _m_);} + var + _j_ = [2, function(_l_){return wrap_view(view, _l_);}, _i_, _h_, post], + _k_ = document(0), + data = [0, state, 0, 0, 0, caml_call1(Fmlib_js_Dom[4][3], _k_), _j_]; + return start_application(data, command, post); + } + return caml_call3(Fmlib_js_Event_target[1], cst_load$3, _g_, _f_); + } + var + Fmlib_browser_Browser = + [0, sandbox, sandbox_plus, element, basic_application, application]; + runtime.caml_register_global + (47, Fmlib_browser_Browser, "Fmlib_browser__Browser"); + return; + } + (globalThis)); + +//# 2319 "../../browser/.fmlib_browser.objs/jsoo/default/fmlib_browser.cma.js" +(function + (globalThis){ + "use strict"; + var + runtime = globalThis.jsoo_runtime, + cst_input$1 = "input", + cst_value$1 = "value"; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + function caml_call4(f, a0, a1, a2, a3){ + return (f.l >= 0 ? f.l : f.l = f.length) == 4 + ? f(a0, a1, a2, a3) + : runtime.caml_call_gen(f, [a0, a1, a2, a3]); + } + var + global_data = runtime.caml_get_global_data(), + Fmlib_js_Base = global_data.Fmlib_js__Base, + Fmlib_browser_Random = global_data.Fmlib_browser__Random, + Fmlib_browser_Time = global_data.Fmlib_browser__Time, + Fmlib_browser_Task = global_data.Fmlib_browser__Task, + Fmlib_browser_Event_flag = global_data.Fmlib_browser__Event_flag, + Fmlib_browser_Command = global_data.Fmlib_browser__Command, + Fmlib_browser_Subscription = global_data.Fmlib_browser__Subscription, + Fmlib_browser_Attribute = global_data.Fmlib_browser__Attribute, + Fmlib_browser_Vdom = global_data.Fmlib_browser__Vdom, + Fmlib_browser_Browser = global_data.Fmlib_browser__Browser, + constant = Fmlib_browser_Random[2], + symbol_bind = Fmlib_browser_Random[3], + let$0 = Fmlib_browser_Random[4], + map = Fmlib_browser_Random[5], + int$0 = Fmlib_browser_Random[6], + float$0 = Fmlib_browser_Random[7], + bool = Fmlib_browser_Random[8], + choose = Fmlib_browser_Random[9], + Zone = Fmlib_browser_Time[1], + zero = Fmlib_browser_Time[2], + year = Fmlib_browser_Time[4], + month = Fmlib_browser_Time[5], + day_of_month = Fmlib_browser_Time[6], + hour = Fmlib_browser_Time[7], + minute = Fmlib_browser_Time[8], + second = Fmlib_browser_Time[9], + milli_second = Fmlib_browser_Time[10], + succeed = Fmlib_browser_Task[4], + return$0 = Fmlib_browser_Task[5], + fail = Fmlib_browser_Task[6], + result = Fmlib_browser_Task[7], + symbol_bind$0 = Fmlib_browser_Task[8], + let$1 = Fmlib_browser_Task[9], + map$0 = Fmlib_browser_Task[10], + log_string = Fmlib_browser_Task[12], + log_value = Fmlib_browser_Task[13], + sleep = Fmlib_browser_Task[14], + next_tick = Fmlib_browser_Task[15], + send_to_javascript = Fmlib_browser_Task[16], + focus = Fmlib_browser_Task[17], + blur = Fmlib_browser_Task[18], + random = Fmlib_browser_Task[19], + http_text = Fmlib_browser_Task[20], + http_json = Fmlib_browser_Task[21], + now = Fmlib_browser_Task[22], + time_zone = Fmlib_browser_Task[23], + include = Fmlib_js_Base[1], + null$0 = include[1], + int$1 = include[3], + float$1 = include[4], + bool$0 = include[5], + string = include[6], + object = include[7], + array = include[8], + prevent = Fmlib_browser_Event_flag[1], + no_prevent = Fmlib_browser_Event_flag[2], + stop = Fmlib_browser_Event_flag[3], + no_stop = Fmlib_browser_Event_flag[4], + Event_flag = [0, prevent, no_prevent, stop, no_stop], + include$0 = Fmlib_js_Base[2], + return$1 = include$0[1], + fail$0 = include$0[2], + let$2 = include$0[4], + symbol_bind$1 = include$0[5], + symbol = include$0[6], + map$1 = include$0[7], + null$1 = include$0[8], + undefined$0 = include$0[9], + float$2 = include$0[10], + int$2 = include$0[11], + bool$1 = include$0[12], + string$0 = include$0[13], + field = include$0[16], + array$0 = include$0[17], + option = include$0[18], + cst_http_www_w3_org_2000_svg = "http://www.w3.org/2000/svg", + cst_li = "li", + cst_ul = "ul", + cst_ol = "ol", + cst_select = "select", + cst_textarea = "textarea", + cst_label = "label", + cst_input$0 = cst_input$1, + cst_button = "button", + cst_p = "p", + cst_pre = "pre", + cst_span = "span", + cst_div = "div", + cst_h6 = "h6", + cst_h5 = "h5", + cst_h4 = "h4", + cst_h3 = "h3", + cst_h2 = "h2", + cst_h1 = "h1", + cst_value$0 = cst_value$1, + cst_target = "target", + cst_input = cst_input$1, + cst_placeholder = "placeholder", + cst_value = cst_value$1, + cst_title = "title", + cst_src = "src", + cst_href = "href", + cst_class = "class", + cst_id = "id", + cst_border_color = "border-color", + cst_border_width = "border-width", + cst_border_style = "border-style", + cst_padding = "padding", + cst_margin = "margin", + cst_width = "width", + cst_height = "height", + cst_background_color = "background-color", + cst_color = "color", + cst_font_size = "font-size", + cst_click = "click"; + function run(decode, v){return caml_call1(decode, v);} + var + none = Fmlib_browser_Command[1], + batch = Fmlib_browser_Command[2], + perform = Fmlib_browser_Command[3], + just_do = Fmlib_browser_Command[4], + attempt = Fmlib_browser_Command[5], + map$2 = Fmlib_browser_Command[6], + none$0 = Fmlib_browser_Subscription[1], + batch$0 = Fmlib_browser_Subscription[2], + on_window = Fmlib_browser_Subscription[3], + every = Fmlib_browser_Subscription[4], + on_message = Fmlib_browser_Subscription[5], + map$3 = Fmlib_browser_Subscription[7], + on_keydown = Fmlib_browser_Subscription[10], + on_keyup = Fmlib_browser_Subscription[11], + on_mouse_down = Fmlib_browser_Subscription[12], + on_mouse_move = Fmlib_browser_Subscription[13], + on_mouse_up = Fmlib_browser_Subscription[14], + on_resize = Fmlib_browser_Subscription[15], + on_visibility_change = Fmlib_browser_Subscription[16]; + function debug(str){return caml_call1(Fmlib_js_Base[3][4], str);} + function debug_value(v){return caml_call1(Fmlib_js_Base[3][5], v);} + var + style = Fmlib_browser_Attribute[1], + property = Fmlib_browser_Attribute[2], + attribute = Fmlib_browser_Attribute[3], + handler = Fmlib_browser_Attribute[4]; + function on(key, decode){ + return caml_call4(handler, key, Event_flag[4], Event_flag[2], decode); + } + function on_click(msg){return on(cst_click, caml_call1(return$1, msg));} + function font_size(size){return caml_call2(style, cst_font_size, size);} + function color(color){return caml_call2(style, cst_color, color);} + function background_color(color){ + return caml_call2(style, cst_background_color, color); + } + function height(value){return caml_call2(style, cst_height, value);} + function width(value){return caml_call2(style, cst_width, value);} + function margin(value){return caml_call2(style, cst_margin, value);} + function padding(value){return caml_call2(style, cst_padding, value);} + function border_style(value){ + return caml_call2(style, cst_border_style, value); + } + function border_width(value){ + return caml_call2(style, cst_border_width, value); + } + function border_color(value){ + return caml_call2(style, cst_border_color, value); + } + function id(value){return caml_call2(attribute, cst_id, value);} + function class$0(value){return caml_call2(attribute, cst_class, value);} + function href(value){return caml_call2(attribute, cst_href, value);} + function src(value){return caml_call2(attribute, cst_src, value);} + function title(value){return caml_call2(attribute, cst_title, value);} + function value(value){ + return caml_call2(property, cst_value, caml_call1(string, value)); + } + function placeholder(value){ + return caml_call2(attribute, cst_placeholder, value); + } + function on_input(f){ + var + decode = + caml_call2 + (field, + cst_target, + caml_call2(field, cst_value$0, caml_call2(map$1, f, string$0))); + return caml_call4 + (handler, cst_input, Event_flag[3], Event_flag[2], decode); + } + var + Attribute = + [0, + style, + property, + attribute, + handler, + on, + on_click, + font_size, + color, + background_color, + height, + width, + margin, + padding, + border_style, + border_width, + border_color, + id, + class$0, + href, + src, + title, + value, + placeholder, + on_input], + text = Fmlib_browser_Vdom[3], + node = Fmlib_browser_Vdom[4], + node_ns = Fmlib_browser_Vdom[5], + keyed = Fmlib_browser_Vdom[6]; + function h1(attrs, nodes){return caml_call3(node, cst_h1, attrs, nodes);} + function h2(attrs, nodes){return caml_call3(node, cst_h2, attrs, nodes);} + function h3(attrs, nodes){return caml_call3(node, cst_h3, attrs, nodes);} + function h4(attrs, nodes){return caml_call3(node, cst_h4, attrs, nodes);} + function h5(attrs, nodes){return caml_call3(node, cst_h5, attrs, nodes);} + function h6(attrs, nodes){return caml_call3(node, cst_h6, attrs, nodes);} + function div(attrs, nodes){return caml_call3(node, cst_div, attrs, nodes);} + function span(attrs, nodes){ + return caml_call3(node, cst_span, attrs, nodes); + } + function pre(attrs, nodes){return caml_call3(node, cst_pre, attrs, nodes);} + function p(attrs, nodes){return caml_call3(node, cst_p, attrs, nodes);} + function button(attrs, nodes){ + return caml_call3(node, cst_button, attrs, nodes); + } + function input(attrs, nodes){ + return caml_call3(node, cst_input$0, attrs, nodes); + } + function label(attrs, nodes){ + return caml_call3(node, cst_label, attrs, nodes); + } + function textarea(attrs, nodes){ + return caml_call3(node, cst_textarea, attrs, nodes); + } + function select(attrs, nodes){ + return caml_call3(node, cst_select, attrs, nodes); + } + function ol(attrs, nodes){return caml_call3(node, cst_ol, attrs, nodes);} + function ul(attrs, nodes){return caml_call3(node, cst_ul, attrs, nodes);} + function li(attrs, nodes){return caml_call3(node, cst_li, attrs, nodes);} + function svg_node(tag, attrs, nodes){ + return caml_call4 + (node_ns, cst_http_www_w3_org_2000_svg, tag, attrs, nodes); + } + var + sandbox = Fmlib_browser_Browser[1], + sandbox_plus = Fmlib_browser_Browser[2], + element = Fmlib_browser_Browser[3], + basic_application = Fmlib_browser_Browser[4], + application = Fmlib_browser_Browser[5], + Fmlib_browser = + [0, + [0, constant, symbol_bind, let$0, map, int$0, float$0, bool, choose], + [0, + Zone, + zero, + year, + month, + day_of_month, + hour, + minute, + second, + milli_second], + Event_flag, + [0, null$0, string, int$1, bool$0, float$1, object, array], + [0, + run, + return$1, + fail$0, + symbol_bind$1, + let$2, + map$1, + symbol, + null$1, + undefined$0, + int$2, + bool$1, + float$2, + string$0, + field, + array$0, + option], + Attribute, + [0, + text, + node, + node_ns, + svg_node, + keyed, + h1, + h2, + h3, + h4, + h5, + h6, + div, + span, + pre, + p, + button, + input, + label, + textarea, + select, + ol, + ul, + li], + [0, + succeed, + return$0, + fail, + result, + symbol_bind$0, + let$1, + map$0, + log_string, + log_value, + send_to_javascript, + focus, + blur, + sleep, + next_tick, + now, + time_zone, + random, + http_text, + http_json], + [0, none, batch, perform, just_do, attempt, map$2], + [0, + none$0, + batch$0, + map$3, + on_window, + on_message, + every, + on_keydown, + on_keyup, + on_mouse_down, + on_mouse_move, + on_mouse_up, + on_resize, + on_visibility_change], + debug, + debug_value, + sandbox, + sandbox_plus, + application, + basic_application, + element]; + runtime.caml_register_global(50, Fmlib_browser, "Fmlib_browser"); + return; + } + (globalThis)); + + +//# 1 ".temperature.eobjs/jsoo/temperature.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 ".temperature.eobjs/jsoo/temperature.cmo.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + function caml_call2(f, a0, a1){ + return (f.l >= 0 ? f.l : f.l = f.length) == 2 + ? f(a0, a1) + : runtime.caml_call_gen(f, [a0, a1]); + } + function caml_call3(f, a0, a1, a2){ + return (f.l >= 0 ? f.l : f.l = f.length) == 3 + ? f(a0, a1, a2) + : runtime.caml_call_gen(f, [a0, a1, a2]); + } + var + global_data = runtime.caml_get_global_data(), + cst = " ", + Fmlib_browser = global_data.Fmlib_browser, + Stdlib_Printf = global_data.Stdlib__Printf, + cst_text = "text", + cst_type = "type", + cst_value_must_be_a_number = "value must be a number", + cst_red = "red", + cst_Fahrenheit = "Fahrenheit", + cst_Celcius = "Celcius", + cst_Temperature_Converter = "Temperature Converter", + _a_ = [0, [8, [0, 0, 0], 0, [0, 1], 0], "%.1f"], + cst_20 = "20"; + function print_float(v){return caml_call2(Stdlib_Printf[4], _a_, v);} + function fahrenheit_to_celcius(fahrenheit){ + return print_float((fahrenheit - 32.) * 0.5555555555555556); + } + function celcius_to_fahrenheit(celcius){ + return print_float(32. + celcius * 1.8); + } + function set_temperature(state, is_celcius, value){ + try{ + var + v = runtime.caml_float_of_string(value), + _u_ = + is_celcius + ? [0, 1, value, celcius_to_fahrenheit(v)] + : [0, 1, fahrenheit_to_celcius(v), value]; + return _u_; + } + catch(_v_){ + return is_celcius ? [0, 0, value, state[3]] : [0, 0, state[2], value]; + } + } + var init = [0, 1, cst_20, celcius_to_fahrenheit(20.)]; + function update(state, param){ + if(0 === param[0]){ + var celcius = param[1]; + return set_temperature(state, 1, celcius); + } + var fahrenheit = param[1]; + return set_temperature(state, 0, fahrenheit); + } + function view(state){ + function message(is_celcius, v){return is_celcius ? [0, v] : [1, v];} + function temperature_field(txt, v, f){ + var + _n_ = [0, caml_call1(Fmlib_browser[7][1], txt), 0], + _o_ = [0, caml_call1(Fmlib_browser[7][1], cst), _n_], + _p_ = [0, caml_call1(Fmlib_browser[6][24], f), 0], + _q_ = [0, caml_call1(Fmlib_browser[6][22], v), _p_], + _r_ = [0, caml_call2(Fmlib_browser[6][3], cst_type, cst_text), _q_], + _s_ = [0, caml_call2(Fmlib_browser[7][17], _r_, 0), _o_], + _t_ = [0, caml_call2(Fmlib_browser[7][18], 0, _s_), 0]; + return caml_call2(Fmlib_browser[7][12], 0, _t_); + } + if(state[1]) + var error = 0; + else + var + _j_ = + [0, caml_call1(Fmlib_browser[7][1], cst_value_must_be_a_number), 0], + _k_ = [0, caml_call1(Fmlib_browser[6][8], cst_red), 0], + error = [0, caml_call2(Fmlib_browser[7][12], _k_, _j_), 0]; + var _b_ = 0; + function _c_(_m_){return message(_b_, _m_);} + var + _d_ = [0, temperature_field(cst_Fahrenheit, state[3], _c_), error], + _e_ = 1; + function _f_(_l_){return message(_e_, _l_);} + var + _g_ = [0, temperature_field(cst_Celcius, state[2], _f_), _d_], + _h_ = [0, caml_call1(Fmlib_browser[7][1], cst_Temperature_Converter), 0], + _i_ = [0, caml_call2(Fmlib_browser[7][6], 0, _h_), _g_]; + return caml_call2(Fmlib_browser[7][12], 0, _i_); + } + caml_call3(Fmlib_browser[13], init, view, update); + var + Temperature = + [0, + print_float, + fahrenheit_to_celcius, + celcius_to_fahrenheit, + set_temperature, + init, + update, + view]; + runtime.caml_register_global(19, Temperature, "Temperature"); + return; + } + (globalThis)); + + +//# 1 "../../../.js/default/stdlib/std_exit.cmo.js" +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=cmo, use-js-string=true, version=5.1.1 + +//# 6 "../../../.js/default/stdlib/std_exit.cmo.js" +(function + (globalThis){ + "use strict"; + var runtime = globalThis.jsoo_runtime; + function caml_call1(f, a0){ + return (f.l >= 0 ? f.l : f.l = f.length) == 1 + ? f(a0) + : runtime.caml_call_gen(f, [a0]); + } + var + global_data = runtime.caml_get_global_data(), + Stdlib = global_data.Stdlib; + caml_call1(Stdlib[103], 0); + var Std_exit = [0]; + runtime.caml_register_global(1, Std_exit, "Std_exit"); + return; + } + (globalThis)); + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLjAsImZpbGUiOiJ0ZW1wZXJhdHVyZS5iYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJuYW1lcyI6WyJjYW1sX2ludDY0X2lzX3plcm8iLCJ4IiwiY2FtbF9zdHJfcmVwZWF0IiwibiIsInMiLCJyIiwibCIsImNhbWxfaW50NjRfb2Zmc2V0IiwiTWF0aCIsImNhbWxfcmFpc2VfY29uc3RhbnQiLCJ0YWciLCJjYW1sX2dsb2JhbF9kYXRhIiwiY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSIsIk1sSW50NjQiLCJsbyIsIm1pIiwiaGkiLCJ0aGlzIiwieGhpIiwiaCIsInNpZ24iLCJvZmZzZXQiLCJtb2R1bHVzIiwiZGl2aXNvciIsInF1b3RpZW50IiwieSIsInEiLCJjYW1sX2ludDY0X29mX2ludDMyIiwiY2FtbF9pbnQ2NF90b19pbnQzMiIsImNhbWxfaW50NjRfaXNfbmVnYXRpdmUiLCJjYW1sX2ludDY0X25lZyIsImNhbWxfanNieXRlc19vZl9zdHJpbmciLCJqc29vX3N5c19nZXRlbnYiLCJwcm9jZXNzIiwiZ2xvYmFsVGhpcyIsInVuZGVmaW5lZCIsImNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnIiwiaSIsImNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlIiwiZXhuIiwiZm9yY2UiLCJjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UiLCJjYW1sX3JhaXNlX3dpdGhfYXJnIiwiYXJnIiwiY2FtbF9zdHJpbmdfb2ZfanNieXRlcyIsImNhbWxfcmFpc2Vfd2l0aF9zdHJpbmciLCJtc2ciLCJjYW1sX2ludmFsaWRfYXJndW1lbnQiLCJjYW1sX3BhcnNlX2Zvcm1hdCIsImZtdCIsImxlbiIsImYiLCJjIiwiY2FtbF9maW5pc2hfZm9ybWF0dGluZyIsInJhd2J1ZmZlciIsImJ1ZmZlciIsImNhbWxfaW50NjRfZm9ybWF0Iiwid2Jhc2UiLCJjdnRibCIsInAiLCJjYW1sX2V4cG0xX2Zsb2F0IiwiY2FtbF9tbF9jb25kaXRpb25fYnJvYWRjYXN0IiwidCIsImpzb29faXNfYXNjaWkiLCJjYW1sX3V0ZjE2X29mX3V0ZjgiLCJiIiwiYzEiLCJjMiIsInYiLCJqIiwiU3RyaW5nIiwiY2FtbF9qc3N0cmluZ19vZl9zdHJpbmciLCJmc19ub2RlX3N1cHBvcnRlZCIsIm1ha2VfcGF0aF9pc19hYnNvbHV0ZSIsInBvc2l4IiwicGF0aCIsIndpbjMyIiwic3BsaXREZXZpY2VSZSIsInJlc3VsdCIsImRldmljZSIsImlzVW5jIiwiQm9vbGVhbiIsInJvb3QiLCJzZXAiLCJwYXRoX2lzX2Fic29sdXRlIiwiY2FtbF90cmFpbGluZ19zbGFzaCIsIm5hbWUiLCJjYW1sX2N1cnJlbnRfZGlyIiwiY2FtbF9tYWtlX3BhdGgiLCJjb21wMCIsImNvbXAiLCJuY29tcCIsImNhbWxfdXRmOF9vZl91dGYxNiIsImQiLCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZyIsInVuaXhfZXJyb3IiLCJtYWtlX3VuaXhfZXJyX2FyZ3MiLCJjb2RlIiwic3lzY2FsbCIsImVycm5vIiwidmFyaWFudCIsIm51bGwiLCJhcmdzIiwiY2FtbF9uYW1lZF92YWx1ZXMiLCJjYW1sX25hbWVkX3ZhbHVlIiwibm0iLCJjYW1sX3JhaXNlX3dpdGhfYXJncyIsImNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyIsImEiLCJjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzIiwiTWxCeXRlcyIsImNvbnRlbnRzIiwibGVuZ3RoIiwiY29udGVudCIsImNhbWxfaXNfbWxfYnl0ZXMiLCJjYW1sX2lzX21sX3N0cmluZyIsImNhbWxfYnl0ZXNfb2ZfYXJyYXkiLCJVaW50OEFycmF5IiwiY2FtbF9ieXRlc19vZl9qc2J5dGVzIiwiY2FtbF9ieXRlc19vZl9zdHJpbmciLCJjYW1sX3JhaXNlX3N5c19lcnJvciIsImNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlIiwiY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5IiwiY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyIsImNhbWxfY3JlYXRlX2J5dGVzIiwiY2FtbF9tbF9ieXRlc19sZW5ndGgiLCJjYW1sX2JsaXRfYnl0ZXMiLCJzMSIsImkxIiwiczIiLCJpMiIsIk1sRmlsZSIsIk1sRmFrZUZpbGUiLCJvbGQiLCJidWYiLCJwb3MiLCJjbGVuIiwibmV3X3N0ciIsIm9sZF9kYXRhIiwiZGF0YSIsIk1sRmFrZUZkIiwiZmlsZSIsImZsYWdzIiwiTWxGYWtlRGV2aWNlIiwicmVzIiwiU3ltYm9sIiwibmFtZV9zbGFzaCIsIm1vZGUiLCJyYWlzZV91bml4IiwicGFyZW50IiwiUmVnRXhwIiwic2VlbiIsIm0iLCJlbnRyeSIsIm9rIiwiQXJyYXkiLCJieXRlcyIsImNhbWxfbWxfc3RyaW5nX2xlbmd0aCIsImNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQiLCJjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyIsImNhbWxfYnl0ZXNfYm91bmRfZXJyb3IiLCJjYW1sX2J5dGVzX3Vuc2FmZV9zZXQiLCJjYW1sX2J5dGVzX3NldCIsIk1sTm9kZUZkIiwiZmQiLCJyZXF1aXJlIiwiZXJyIiwiYnVmX29mZnNldCIsInJlYWQiLCJNbE5vZGVEZXZpY2UiLCJjb25zdHMiLCJrZXkiLCJpc0NoYXJhY3RlckRldmljZSIsIm8iLCJqc19zdGF0cyIsInRvX2RpciIsInRhcmdldCIsImxpbmsiLCJmaWxlX2tpbmQiLCJjYW1sX2dldF9yb290IiwiY2FtbF9mYWlsd2l0aCIsImNhbWxfcm9vdCIsImpzb29fbW91bnRfcG9pbnQiLCJyZXNvbHZlX2ZzX2RldmljZSIsImNhbWxfc3lzX2lzX2RpcmVjdG9yeSIsImNhbWxfcmFpc2Vfbm90X2ZvdW5kIiwiY2FtbF9zeXNfZ2V0ZW52Iiwic2hpZnRfcmlnaHRfbmF0IiwibmF0MSIsIm9mczEiLCJsZW4xIiwibmF0MiIsIm9mczIiLCJuYml0cyIsIndyYXAiLCJjYW1sX2dyX3N0YXRlIiwiY2FtbF9ncl9zdGF0ZV9nZXQiLCJjYW1sX2dyX3BvaW50X2NvbG9yIiwiaW0iLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVzb2x2ZSIsIk1sT2JqZWN0VGFibGUiLCJOYWl2ZUxvb2t1cCIsIm9ianMiLCJjYW1sX3N5c19yZW5hbWUiLCJvX3Jvb3QiLCJuX3Jvb3QiLCJjYW1sX2xvZzEwX2Zsb2F0IiwiY2FtbF9ydW50aW1lX3dhcm5pbmdzIiwiY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5ncyIsImJvb2wiLCJjYW1sX2NsYXNzaWZ5X2Zsb2F0IiwiaXNGaW5pdGUiLCJpc05hTiIsImNhbWxfbWxfY2hhbm5lbHMiLCJjYW1sX3JlZmlsbCIsImNoYW4iLCJzdHIiLCJzdHJfYSIsIm5yZWFkIiwiY2FtbF9hcnJheV9ib3VuZF9lcnJvciIsImNhbWxfbWxfaW5wdXRfc2Nhbl9saW5lIiwiY2hhbmlkIiwicHJldl9tYXgiLCJjYW1sX2djX21pbm9yIiwidW5pdCIsImNhbWxfbWxfY29uZGl0aW9uX25ldyIsImNhbWxfaW50NjRfb2ZfYnl0ZXMiLCJjYW1sX2JhX3VpbnQ4X2dldDY0IiwiYmEiLCJpMCIsIm9mcyIsImIxIiwiYjIiLCJiMyIsImI0IiwiYjUiLCJiNiIsImI3IiwiYjgiLCJjYW1sX2ludDY0X3RvX2J5dGVzIiwiY2FtbF9pbnQ2NF9tYXJzaGFsIiwid3JpdGVyIiwic2l6ZXMiLCJjYW1sX2JhX251bV9kaW1zIiwiY2FtbF93cmFwX2V4Y2VwdGlvbiIsImUiLCJjYW1sX2NyZWF0ZV9maWxlIiwianNvb19jcmVhdGVfZmlsZSIsImNhbWxfZnNfaW5pdCIsInRtcCIsImNhbWxfbXVsIiwiY2FtbF9oYXNoX21peF9pbnQiLCJjYW1sX2hhc2hfbWl4X2pzYnl0ZXMiLCJ3IiwiY2FtbF9oYXNoX21peF9zdHJpbmciLCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX3N0cmluZyIsImNhbWxfZ2V0X2NvbnRpbnVhdGlvbl9jYWxsc3RhY2siLCJjYW1sX3BhcnNlcl90cmFjZSIsImNhbWxfc2V0X3BhcnNlcl90cmFjZSIsIm9sZGZsYWciLCJjYW1sX2xpc3Rfb2ZfanNfYXJyYXkiLCJudW1fZGlnaXRzX25hdCIsIm5hdCIsImNhbWxfaGFzaF9uYXQiLCJjYW1sX2NhbGxfZ2VuIiwiYXJnc0xlbiIsImciLCJuYXJncyIsImV4dHJhX2FyZ3MiLCJhcmd1bWVudHMiLCJjYW1sX2NhbGxiYWNrIiwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50cyIsImNhbWxfc3lzX2NoZGlyIiwiZGlyIiwiY2FtbF9vYmpfdGFnIiwiRnVuY3Rpb24iLCJjYW1sX29ial91cGRhdGVfdGFnIiwiY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXyIsImNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbiIsImNhbWxfbGF6eV91cGRhdGVfdG9fZm9yY2luZyIsImZpZWxkMCIsImNhbWxfZ2NfY291bnRlcnMiLCJjYW1sX2dyX3N5bmNocm9uaXplIiwiY2FtbF91bml4X2Nsb3NlZGlyIiwiZGlyX2hhbmRsZSIsImNhbWxfdW5peF9vcGVuZGlyIiwiY2FtbF91bml4X3Jld2luZGRpciIsIm5ld19kaXJfaGFuZGxlIiwiY2FtbF9yYWlzZV9lbmRfb2ZfZmlsZSIsImNhbWxfdW5peF9yZWFkZGlyIiwiY2FtbF91bml4X2ZpbmRmaXJzdCIsInBhdGhfanMiLCJmaXJzdF9lbnRyeSIsImNhbWxfaXNfY29udGludWF0aW9uX3RhZyIsImxvZzJfb2siLCJqc29vX2Zsb29yX2xvZzIiLCJJbmZpbml0eSIsImNhbWxfaW50MzJfYml0c19vZl9mbG9hdCIsImZsb2F0MzJhIiwiRmxvYXQzMkFycmF5IiwiaW50MzJhIiwiSW50MzJBcnJheSIsImNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpIiwiY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0IiwiZXhwIiwiayIsInIzIiwicjIiLCJyMSIsImNhbWxfYmFfc2VyaWFsaXplIiwic3oiLCJjb21wbGV4IiwiY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudCIsImtpbmQiLCJjYW1sX2JhX2NyZWF0ZV9idWZmZXIiLCJzaXplIiwidmlldyIsIkZsb2F0NjRBcnJheSIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsImNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyIsImNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyIsIk5hTiIsImNhbWxfYmFfZ2V0X3NpemUiLCJkaW1zIiwibl9kaW1zIiwiY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkiLCJjYW1sX2ludDY0X2hpMzIiLCJjYW1sX2ludDY0X2xvMzIiLCJjYW1sX2JhX2N1c3RvbV9uYW1lIiwiTWxfQmlnYXJyYXkiLCJsYXlvdXQiLCJyZSIsInRvdGFsIiwiazEiLCJrMiIsIk1sX0JpZ2FycmF5X2NfMV8xIiwiY2FtbF9iYV9jcmVhdGVfdW5zYWZlIiwic2l6ZV9wZXJfZWxlbWVudCIsImNhbWxfYmFfZGVzZXJpYWxpemUiLCJyZWFkZXIiLCJudW1fZGltcyIsInNpemVfZGltIiwic2l6ZV9kaW1faGkiLCJzaXplX2RpbV9sbyIsInNpeHR5IiwiaW50NjQiLCJjYW1sX2JhX2NvbXBhcmUiLCJjYW1sX2hhc2hfbWl4X2ludDY0IiwiY2FtbF9oYXNoX21peF9mbG9hdCIsInYwIiwiY2FtbF9iYV9oYXNoIiwibnVtX2VsdHMiLCJjYW1sX2ludDMyX3VubWFyc2hhbCIsImNhbWxfbmF0aXZlaW50X3VubWFyc2hhbCIsImNhbWxfaW50NjRfdW5tYXJzaGFsIiwiY2FtbF9pbnQ2NF9jb21wYXJlIiwiY2FtbF9pbnQ2NF9oYXNoIiwiY2FtbF9jdXN0b21fb3BzIiwiY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tIiwiY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tIiwibnVtIiwiY3VzdG9tIiwic3dhcCIsImNhbWxfY29tcGFyZV92YWxfdGFnIiwiTnVtYmVyIiwiY2FtbF9pbnRfY29tcGFyZSIsImNhbWxfc3RyaW5nX2NvbXBhcmUiLCJjYW1sX2J5dGVzX2NvbXBhcmUiLCJjYW1sX2NvbXBhcmVfdmFsIiwic3RhY2siLCJ0YWdfYSIsInRhZ19iIiwiY2FtbF9ncmVhdGVydGhhbiIsImRpdl9oZWxwZXIiLCJ6IiwiZGl2X2RpZ2l0X25hdCIsIm5hdHEiLCJvZnNxIiwibmF0ciIsIm9mc3IiLCJyZW0iLCJudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQiLCJzaGlmdF9sZWZ0X25hdCIsIk1sTmF0IiwiY3JlYXRlX25hdCIsImFyciIsInNldF90b196ZXJvX25hdCIsImluY3JfbmF0IiwiY2FycnlfaW4iLCJjYXJyeSIsImFkZF9uYXQiLCJsZW4yIiwibmF0X29mX2FycmF5IiwibXVsdF9kaWdpdF9uYXQiLCJuYXQzIiwib2ZzMyIsIngxIiwieDIiLCJ4MyIsImRlY3JfbmF0IiwiYm9ycm93Iiwic3ViX25hdCIsImNvbXBhcmVfbmF0IiwiZGl2X25hdCIsInF1byIsImNhbWxfYmFfYmxpdCIsInNyYyIsImRzdCIsImlzX2RpZ2l0X2ludCIsImNhbWxfaW50NjRfZGl2IiwiY2FtbF9qc19odG1sX2VudGl0aWVzIiwiZW50aXR5IiwidGVtcCIsImRvY3VtZW50IiwiY2FtbF9zdHJpbmdfdW5zYWZlX3NldCIsImNhbWxfaW50NjRfb2ZfZmxvYXQiLCJjYW1sX21sX2NoYW5uZWxfc2l6ZV82NCIsImNhbWxfYmFfc2V0XzIiLCJjYW1sX2FyZ3YiLCJtYWluIiwiYXJndiIsImFyZ3MyIiwiY2FtbF9leGVjdXRhYmxlX25hbWUiLCJjYW1sX2pzX2V2YWxfc3RyaW5nIiwiZXZhbCIsInNlcmlhbGl6ZV9uYXQiLCJjYW1sX21lbXByb2Zfc2V0IiwiX2NvbnRyb2wiLCJjYW1sX3N5c19leGl0IiwiY2FtbF9jaGFubmVsX2Rlc2NyaXB0b3IiLCJjYW1sX2pzX2Zyb21fYXJyYXkiLCJjYW1sX2JhX3Jlc2hhcGUiLCJ2aW5kIiwibmV3X2RpbSIsImNhbWxfb29fbGFzdF9pZCIsImNhbWxfc2V0X29vX2lkIiwiY2FtbF9ncl9maWxsX3JlY3QiLCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYSIsInN0cjEiLCJwb3MxIiwiYmEyIiwicG9zMiIsInNsaWNlIiwiY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlIiwianNuYW1lIiwiY2FtbF9nZXRfZ2xvYmFsX2RhdGEiLCJjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkIiwiY2FtbF9iYV91aW50OF9nZXQxNiIsImNhbWxfY29tcGFyZSIsImNhbWxfTUQ1VHJhbnNmb3JtIiwiYWRkIiwieHgiLCJmZiIsImdnIiwiaGgiLCJpaSIsImNhbWxfTUQ1VXBkYXRlIiwiY3R4IiwiaW5wdXQiLCJpbnB1dF9sZW4iLCJpbl9idWYiLCJpbnB1dF9wb3MiLCJtaXNzaW5nIiwiY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGwiLCJjdXJzb3IiLCJjYWxsYmFja3MiLCJjYW1sX2ZyZXNoX29vX2lkIiwiY2FtbF9pbnQ2NF90b19mbG9hdCIsImNhbWxfYmFfZ2V0XzEiLCJjYW1sX2JpZ3N0cmluZ19tZW1jbXAiLCJjYW1sX25ld19zdHJpbmciLCJjYW1sX2VyZl9mbG9hdCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJjYW1sX2JhX3VpbnQ4X2dldDMyIiwiY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aCIsImNhbWxfc3RyX2luaXRpYWxpemUiLCJjYW1sX29ial9ibG9jayIsImNhbWxfZ3JfY2xlYXJfZ3JhcGgiLCJiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyIiwiYnMiLCJjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkIiwiX3VuaXQiLCJseG9yX2RpZ2l0X25hdCIsImNhbWxfb2JqX2FkZF9vZmZzZXQiLCJjYW1sX2ZpbmFsX3JlbGVhc2UiLCJjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUiLCJjYW1sX2pzX3RvX2FycmF5IiwiY2FtbF9zeXNfaXNfcmVndWxhcl9maWxlIiwiY2FtbF9ncl9wbG90IiwiY29sb3IiLCJjYW1sX2J5dGVzX3NldDY0IiwiaTY0IiwiY2FtbF9zdHJpbmdfc2V0MTYiLCJpMTYiLCJjYW1sX2ludDY0X2Jzd2FwIiwiY2FtbF9nY19tYWpvciIsImNhbWxfbGV4X2FycmF5IiwiY2FtbF9sZXhfZW5naW5lIiwidGJsIiwic3RhcnRfc3RhdGUiLCJsZXhidWYiLCJsZXhfYnVmZmVyIiwibGV4X2J1ZmZlcl9sZW4iLCJsZXhfc3RhcnRfcG9zIiwibGV4X2N1cnJfcG9zIiwibGV4X2xhc3RfcG9zIiwibGV4X2xhc3RfYWN0aW9uIiwibGV4X2VvZl9yZWFjaGVkIiwibGV4X2Jhc2UiLCJsZXhfYmFja3RyayIsImxleF9kZWZhdWx0IiwibGV4X3RyYW5zIiwibGV4X2NoZWNrIiwic3RhdGUiLCJiYXNlIiwiYmFja3RyayIsImNhbWxfc3lzX2ZpbGVfZXhpc3RzIiwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdCIsImNhbWxfYXJyYXlfc3ViIiwiY2FtbF9ieXRlc19lcXVhbCIsImNhbWxfZ3Jfc2l6ZV94IiwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHoiLCJjYW1sX21sX2RlYnVnX2luZm9fc3RhdHVzIiwiY2FtbF9hdG9taWNfZmV0Y2hfYWRkIiwicmVmIiwib3NfdHlwZSIsImNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4iLCJjYW1sX2Nvc2hfZmxvYXQiLCJNbE11dGV4IiwiY2FtbF9tbF9tdXRleF9uZXciLCJjYW1sX2VwaGVfa2V5X29mZnNldCIsImNhbWxfZXBoZV9jaGVja19rZXkiLCJ3ZWFrIiwiY2FtbF9oYXNoX21peF9maW5hbCIsImNhbWxfZ3JfdGV4dF9zaXplIiwidHh0IiwiY2FtbF9sZXhfcnVuX21lbSIsIm1lbSIsImN1cnJfcG9zIiwiY2FtbF9sZXhfcnVuX3RhZyIsImNhbWxfbmV3X2xleF9lbmdpbmUiLCJsZXhfbWVtIiwibGV4X2Jhc2VfY29kZSIsImxleF9iYWNrdHJrX2NvZGUiLCJsZXhfZGVmYXVsdF9jb2RlIiwibGV4X3RyYW5zX2NvZGUiLCJsZXhfY2hlY2tfY29kZSIsImxleF9jb2RlIiwicGNfb2ZmIiwicHN0YXRlIiwiYmFzZV9jb2RlIiwiY2FtbF9iYV91aW50OF9zZXQ2NCIsImNhbWxfc3lzX2V4ZWN1dGFibGVfbmFtZSIsImNhbWxfbGVzc2VxdWFsIiwiY2FtbF9hY29zaF9mbG9hdCIsImNhbWxfTUQ1SW5pdCIsIkFycmF5QnVmZmVyIiwiYjMyIiwiVWludDMyQXJyYXkiLCJjYW1sX21sX2ZsdXNoIiwiY2FtbF9zZWVrX291dCIsImNhbWxfbWxfc2Vla19vdXRfNjQiLCJjb21wYXJlX25hdF9yZWFsIiwiY2FtbF9nY19zZXQiLCJjYW1sX2pzX2dldCIsImNhbWxfdW5peF9pc2F0dHkiLCJmaWxlRGVzY3JpcHRvciIsInR0eSIsImNhbWxfbWxfc2V0X2J1ZmZlcmVkIiwiY2FtbF9oYXNoX21peF9ieXRlc19hcnIiLCJjYW1sX21sX2J5dGVzX2NvbnRlbnQiLCJjYW1sX2hhc2hfbWl4X2J5dGVzIiwiY2FtbF9oYXNoIiwiY291bnQiLCJsaW1pdCIsInNlZWQiLCJvYmoiLCJxdWV1ZSIsInJkIiwid3IiLCJCYXNlX2hhc2hfc3RyaW5nIiwiY2FtbF9nY19jb21wYWN0aW9uIiwiY2FtbF9lcGhlX2dldF9rZXkiLCJjYW1sX3VuaXhfbG9jYWx0aW1lIiwiRGF0ZSIsImRfbnVtIiwiamFudWFyeWZpcnN0IiwiZG95IiwiamFuIiwianVsIiwic3RkVGltZXpvbmVPZmZzZXQiLCJjYW1sX3VuaXhfbWt0aW1lIiwidG0iLCJ0bTIiLCJjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhIiwiY2FtbF9zeXNfZmRzIiwiY2FtbF9zeXNfY2xvc2UiLCJjYW1sX21sX2Nsb3NlX2NoYW5uZWwiLCJCYXNlX2ludF9tYXRoX2ludF9wb3dfc3R1YiIsImV4cG9uZW50Iiwib25lIiwibXVsIiwiY2FtbF9hdG9taWNfZXhjaGFuZ2UiLCJjYW1sX3N5c19pc2F0dHkiLCJfY2hhbiIsImlzX2RpZ2l0X3plcm8iLCJjYW1sX3VuaXhfbHN0YXQiLCJjYW1sX3VuaXhfbHN0YXRfNjQiLCJjYW1sX2pzX3NldCIsImNhbWxfYXJyYXlfZ2V0IiwiYXJyYXkiLCJpbmRleCIsImNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4YyIsImNvbnQiLCJjYW1sX3VuaXhfcm1kaXIiLCJjYW1sX2xvZzJfZmxvYXQiLCJjYW1sX2djX2h1Z2VfZmFsbGJhY2tfY291bnQiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZSIsImNhbWxfc3BhY2V0aW1lX29ubHlfd29ya3NfZm9yX25hdGl2ZV9jb2RlIiwiY2FtbF9pbnQ2NF9zdWIiLCJjYW1sX3NlZWtfaW4iLCJjYW1sX21sX3NlZWtfaW5fNjQiLCJjYW1sX2RvbWFpbl9pZCIsImNhbWxfbWxfbXV0ZXhfdW5sb2NrIiwiY2FtbF9kb21haW5fbGF0ZXN0X2lkeCIsImNhbWxfZG9tYWluX3NwYXduIiwibXV0ZXgiLCJpZCIsImNhbWxfdW5peF9ta2RpciIsInBlcm0iLCJjYW1sX2ludDY0X3NoaWZ0X2xlZnQiLCJjYW1sX25vdGVxdWFsIiwiY2FtbF9zeXNfY29uc3RfaW50X3NpemUiLCJjYW1sX2pzX3dyYXBfY2FsbGJhY2siLCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayIsImNhbWxfaXNfanMiLCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2Zsb2F0IiwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkIiwiY2FtbF9iYV9kaW0iLCJjYW1sX2JhX2RpbV8xIiwiY2FtbF9qc19tZXRoX2NhbGwiLCJjYW1sX2VwaGVfZGF0YV9vZmZzZXQiLCJjYW1sX3dlYWtfY3JlYXRlIiwiY2FtbF9lcGhlX2NyZWF0ZSIsImNhbWxfanNfdG9fYnl0ZV9zdHJpbmciLCJjYW1sX3RyYW1wb2xpbmUiLCJjYW1sX21heWJlX3ByaW50X3N0YXRzIiwiY2FtbF9ieXRlc191bnNhZmVfZ2V0IiwiY2FtbF9ieXRlc19nZXQ2NCIsImNhbWxfY3VzdG9tX2V2ZW50X2luZGV4IiwiY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3JlZ2lzdGVyIiwiZXZlbnRfbmFtZSIsImV2ZW50X3RhZyIsImV2ZW50X3R5cGUiLCJjYW1sX3VuaXhfaGFzX3N5bWxpbmsiLCJjYW1sX2VwaGVfc2V0X2tleSIsIk9iamVjdCIsImNhbWxfZXBoZV91bnNldF9rZXkiLCJjYW1sX3dlYWtfc2V0IiwiY2FtbF9zeXNfcmVtb3ZlIiwiY2FtbF9zdHJpbmdfYm91bmRfZXJyb3IiLCJjYW1sX3N0cmluZ19nZXQzMiIsImNhbWxfYnl0ZXNfZ2V0IiwiY2FtbF9oeXBvdF9mbG9hdCIsImNhbWxfanNfY2FsbCIsImNhbWxfc3lzX2NvbnN0X21heF93b3NpemUiLCJjYW1sX3VuaXhfaW5ldF9hZGRyX29mX3N0cmluZyIsIkJhc2VfYW1fdGVzdGluZyIsImNhbWxfYnl0ZXNfbGVzc3RoYW4iLCJjYW1sX2VyZmNfZmxvYXQiLCJjYW1sX2dyX2ZpbGxfcG9seSIsImFyIiwiY2FtbF9nY19xdWlja19zdGF0IiwiY2FtbF9tbF9pbnB1dF9jaGFyIiwiY2FtbF9tbF9pbnB1dF9pbnQiLCJjYW1sX2dyX2Rpc3BsYXlfbW9kZSIsImNhbWxfb2JqX3JlYWNoYWJsZV93b3JkcyIsIm50aF9kaWdpdF9uYXQiLCJjYW1sX2FycmF5X2JsaXQiLCJjYW1sX2Zsb2F0X29mX3N0cmluZyIsIm0zIiwibWFudGlzc2EiLCJwYXJzZUludCIsImNhbWxfc3lzX2dldGN3ZCIsImNhbWxfaW50NjRfYWRkIiwiY2FtbF9pbnQ2NF9tdWwiLCJjYW1sX2ludDY0X3VsdCIsImNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSIsImNhbWxfcGFyc2VfZGlnaXQiLCJjYW1sX2ludDY0X29mX3N0cmluZyIsImJhc2U2NCIsInRocmVzaG9sZCIsImNhbWxfYmFfc2V0XzEiLCJjYW1sX2ludDY0X3hvciIsImNhbWxfaW50NjRfb3IiLCJjYW1sX2x4bV9uZXh0Iiwic2hpZnRfbCIsInNoaWZ0X3IiLCJvciIsInhvciIsInJvdGwiLCJnZXQiLCJzZXQiLCJNIiwiZGFiYSIsInEwIiwicTEiLCJzdCIsIngwIiwiY2FtbF9zeXNfY29uc3RfYmlnX2VuZGlhbiIsImNhbWxfbGlzdF90b19qc19hcnJheSIsImNhbWxfb3V0cHV0X3ZhbCIsIldyaXRlciIsInZhbHVlIiwibm9fc2hhcmluZyIsImNsb3N1cmVzIiwiY29uc29sZSIsImludGVybl9vYmpfdGFibGUiLCJtZW1vIiwiZXhpc3Rpbmdfb2Zmc2V0IiwiZXh0ZXJuX3JlYyIsIm9wcyIsInN6XzMyXzY0IiwiaGVhZGVyX3BvcyIsIm9sZF9wb3MiLCJ0eXBlX29mX3YiLCJjYW1sX3N0cmluZ19vZl9hcnJheSIsImNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyIsImNhbWxfcmFpc2Vfbm90X2FfZGlyIiwiY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmQiLCJjbWQiLCJjaGlsZF9wcm9jZXNzIiwiY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb24iLCJjYW1sX3VuaXhfZ2V0dWlkIiwiZGVzZXJpYWxpemVfbmF0IiwiaW5pdGlhbGl6ZV9uYXQiLCJjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nIiwiY2FtbF9ncl9vcGVuX3N1YndpbmRvdyIsIlVJbnQ4QXJyYXlSZWFkZXIiLCJjYW1sX21hcnNoYWxfZGF0YV9zaXplIiwicmVhZHZscSIsIm92ZXJmbG93IiwibjciLCJoZWFkZXJfbGVuIiwiZGF0YV9sZW4iLCJNbFN0cmluZ1JlYWRlciIsInpzdGRfZGVjb21wcmVzcyIsImFiIiwidTgiLCJ1MTYiLCJ1MzIiLCJpMzIiLCJzbGMiLCJmaWxsIiwiY3B3IiwiZWMiLCJpbmQiLCJudCIsIkVycm9yIiwicmIiLCJyemZoIiwiZGF0IiwibjMiLCJmbGciLCJzcyIsImNjIiwiZGYiLCJmY2YiLCJidCIsImRiIiwiZGkiLCJmc2IiLCJmc3MiLCJ3cyIsIndiIiwibXNiIiwidmFsIiwiYml0cyIsInJmc2UiLCJtYWwiLCJ0cG9zIiwiYWwiLCJwcm9icyIsInN5bSIsImh0IiwiZnJlcSIsImRzdGF0ZSIsIm5zdGF0ZSIsImJiMSIsInN5bXMiLCJjYnQiLCJtc2siLCJtc2sxZmIiLCJtc3YiLCJzdmFsIiwicmJ0Iiwic3ltcG9zIiwic3N0ZXAiLCJzbWFzayIsInNmIiwibnMiLCJuYiIsInJodSIsIndjIiwiaGIiLCJodyIsInJjIiwicmkiLCJfYSIsImVidCIsImZkdCIsImVwb3MiLCJsYiIsInN0MSIsInN0MiIsImJ0cjEiLCJidHIyIiwiZnBvcyIsImJ5dGUiLCJ3ZXMiLCJ3dCIsIm1iIiwidHMiLCJoYnVmIiwicHYiLCJkbGx0IiwiZG1sdCIsImRvY3QiLCJiMmJsIiwiYmwiLCJsbGIiLCJsbGJsIiwibWxiIiwibWxibCIsImRodSIsIm91dCIsImh1IiwiZWIiLCJidHIiLCJkaHU0Iiwic3oxIiwic3oyIiwic3ozIiwicnpiIiwiYjAiLCJidHlwZSIsImxidCIsImxzcyIsImxjcyIsInM0Iiwic3BsIiwiaHVkIiwic2NtIiwiZHRzIiwibWQiLCJyYnVmIiwiX2IiLCJtbHQiLCJvY3QiLCJsbHQiLCJzcG9zIiwib3VidCIsImxzdCIsIm9zdCIsIm1zdCIsImxsYyIsImxidHIiLCJtbGMiLCJtYnRyIiwib2ZjIiwib2J0ciIsIm9mcCIsIm9mZiIsIm1sIiwibGwiLCJpZHgiLCJzdGluIiwiY2N0IiwiYnVmcyIsIm9sIiwiY2hrIiwiYmxrIiwiY2FtbF9mbG9hdF9vZl9ieXRlcyIsImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIiLCJtYWdpYyIsImNvbXByZXNzZWQiLCJ1bmNvbXByZXNzZWRfZGF0YV9sZW4iLCJudW1fb2JqZWN0cyIsIl9zaXplXzMyIiwiX3NpemVfNjQiLCJvYmpfY291bnRlciIsImludGVybl9yZWMiLCJoZWFkZXIiLCJleHBlY3RlZF9zaXplIiwiY2FtbF9zdHJpbmdfb2ZfYnl0ZXMiLCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXMiLCJjYW1sX2lucHV0X3ZhbHVlIiwiYmxvY2siLCJjYW1sX2lucHV0X3ZhbHVlX3RvX291dHNpZGVfaGVhcCIsImNhbWxfYXRvbWljX2NhcyIsImNhbWxfY29weXNpZ25fZmxvYXQiLCJjYW1sX2dyX3NldF90ZXh0X3NpemUiLCJjYW1sX2F0b21pY19sb2FkIiwiY2FtbF9NRDVGaW5hbCIsImNhbWxfbWQ1X2J5dGVzIiwiY2FtbF9iYV9zZXRfZ2VuZXJpYyIsImNhbWxfbWxfY29uZGl0aW9uX3dhaXQiLCJtdXRleHQiLCJjYW1sX3N0cmluZ19sZXNzZXF1YWwiLCJjYW1sX3N0cmluZ19ncmVhdGVyZXF1YWwiLCJjYW1sX25leHRhZnRlcl9mbG9hdCIsImNhbWxfZ3Jfc2l6ZV95IiwiY2FtbF9wb3NfaW4iLCJjYW1sX21sX3Bvc19pbiIsImNhbWxfaW50NjRfYW5kIiwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9wb3dfc3R1YiIsImNhbWxfc3lzX2NvbnN0X3dvcmRfc2l6ZSIsImNhbWxfcnVudGltZV9ldmVudHNfcGF1c2UiLCJjYW1sX3VuaXhfdW5saW5rIiwiY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZSIsImZzIiwiZmQyIiwiTWxGYWtlRmRfb3V0IiwiY2FtbF9zeXNfb3Blbl9pbnRlcm5hbCIsImNhbWxfc3lzX29wZW4iLCJfcGVybXMiLCJjYW1sX3N0cmluZ19nZXQiLCJyZV9tYXRjaCIsInJlX3dvcmRfbGV0dGVycyIsIm9wY29kZXMiLCJpc193b3JkX2xldHRlciIsImluX2JpdHNldCIsInJlX21hdGNoX2ltcGwiLCJwYXJ0aWFsIiwicHJvZyIsImNwb29sIiwibm9ybXRhYmxlIiwibnVtZ3JvdXBzIiwibnVtcmVnaXN0ZXJzIiwic3RhcnRjaGFycyIsInBjIiwicXVpdCIsImdyb3VwcyIsInJlX3JlZ2lzdGVyIiwiYmFja3RyYWNrIiwiaXRlbSIsInB1c2giLCJhY2NlcHQiLCJwcmVmaXhfbWF0Y2giLCJvcCIsInNhcmciLCJ1YXJnIiwiZ3JvdXAiLCJyZV9zZWFyY2hfYmFja3dhcmQiLCJjYW1sX2pzX2Zyb21fc3RyaW5nIiwiY2FtbF9iYV9zdWIiLCJjaGFuZ2VkX2RpbSIsIm5ld19kaW1zIiwibmV3X2RhdGEiLCJjYW1sX2djX2Z1bGxfbWFqb3IiLCJjYW1sX21sX211dGV4X3RyeV9sb2NrIiwiY2FtbF9ieXRlc19zZXQzMiIsImNhbWxfZ3Jfc2lnaW9fc2lnbmFsIiwiY2FtbF9iYV91aW50OF9zZXQzMiIsImNhbWxfc3lzX2NvbnN0X29zdHlwZV91bml4IiwiY2FtbF91bml4X2dtdGltZSIsImNhbWxfc2lnbmJpdF9mbG9hdCIsImNhbWxfZ3JfY3VycmVudF94IiwiY2FtbF9ncl9zZXRfbGluZV93aWR0aCIsImNhbWxfZ3Jfc2V0X2ZvbnQiLCJjYW1sX2dyX3NldF9jb2xvciIsImNvbnZlcnQiLCJudW1iZXIiLCJjX3N0ciIsImNhbWxfZ3JfbW92ZXRvIiwiY2FtbF9ncl9yZXNpemVfd2luZG93IiwiY2FtbF9ncl9zdGF0ZV9pbml0IiwiY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5IiwidGEiLCJjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXkiLCJjYW1sX21sX3NlZWtfb3V0IiwiY2FtbF9qc190eXBlb2YiLCJjYW1sX3N0cmluZ19oYXNoIiwiY2FtbF9yZXN0b3JlX3Jhd19iYWNrdHJhY2UiLCJCYXNlX2ludF9tYXRoX2ludDMyX2N0eiIsIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2N0eiIsImNhbWxfZ3JfbGluZXRvIiwiY2FtbF9qc19mdW5jdGlvbl9hcml0eSIsImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX3Vuc2FmZSIsImNhbWxfYmFfZGltXzMiLCJjYW1sX2lzX3NwZWNpYWxfZXhjZXB0aW9uIiwiY2FtbF9mb3JtYXRfZXhjZXB0aW9uIiwiYnVja2V0Iiwic3RhcnQiLCJjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbiIsImhhbmRsZXIiLCJhdF9leGl0IiwiY2FtbF9lcGhlX2NoZWNrX2RhdGEiLCJjYW1sX2J5dGVzX2dldDE2IiwiY2FtbF9vYmpfbWFrZV9mb3J3YXJkIiwiY2FtbF9qc19mcm9tX2Jvb2wiLCJjYW1sX21sX3NldF9jaGFubmVsX25hbWUiLCJjYW1sX2V4cDJfZmxvYXQiLCJjYW1sX2dyX2Nsb3NlX2dyYXBoIiwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnQiLCJjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXgiLCJjYW1sX2NyZWF0ZV9zdHJpbmciLCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jbHoiLCJjYW1sX21sX2lucHV0X2Jsb2NrIiwiYXZhaWwiLCJjYW1sX21kNV9jaGFuIiwidG9yZWFkIiwiY2FtbF9hdGFuaF9mbG9hdCIsImNhbWxfbWxfY29uZGl0aW9uX3NpZ25hbCIsImNhbWxfdW5peF9maW5kbmV4dCIsImNhbWxfbWxfb3V0cHV0X2J5dGVzIiwiY2FtbF9tbF9vdXRwdXQiLCJjYW1sX21sX2RvbWFpbl9pZCIsImNhbWxfZXBoZV9nZXRfZGF0YSIsImNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlIiwiY2FtbF90cmFtcG9saW5lX3JldHVybiIsImNhbWxfbWxfaXNfYnVmZmVyZWQiLCJCYXNlX2ludF9tYXRoX2ludDY0X2NseiIsImNhbWxfYXJyYXlfYXBwZW5kIiwibDEiLCJsMiIsImNhbWxfdW5peF9nZXR0aW1lb2ZkYXkiLCJjYW1sX3VuaXhfdGltZSIsImNhbWxfbWxfc2V0X2NoYW5uZWxfcmVmaWxsIiwiY2FtbF9ydW50aW1lX2V2ZW50c19jcmVhdGVfY3Vyc29yIiwiY2FtbF9maWxsX2J5dGVzIiwiY2FtbF9qc19leHByIiwiY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQiLCJjYW1sX291dHB1dF92YWx1ZV90b19ieXRlcyIsImNhbWxfZXZlbnRsb2dfcmVzdW1lIiwiY2FtbF9tZDVfc3RyaW5nIiwiY2FtbF9hcnJheV9vZl9zdHJpbmciLCJjYW1sX3N0cmluZ19lcXVhbCIsImNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nIiwiY2FtbF9vdXRwdXRfdmFsdWVfdG9fYnVmZmVyIiwicmVfcmVwbGFjZW1lbnRfdGV4dCIsInJlcGwiLCJvcmlnIiwiY3VyIiwiZW5kIiwiY2FtbF9wdXJlX2pzX2V4cHIiLCJjYW1sX2JsaXRfc3RyaW5nIiwiYmxpdF9uYXQiLCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2J5dGVzIiwiYmExIiwiYnl0ZXMyIiwiY2FtbF91bml4X3N0YXQiLCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlIiwianNvb19jcmVhdGVfZmlsZV9leHRlcm4iLCJjYW1sX3VuaXhfc3RhdF82NCIsImNhbWxfdG9fanNfc3RyaW5nIiwiY2FtbF9tbF9tdXRleF9sb2NrIiwicmVfc2VhcmNoX2ZvcndhcmQiLCJjYW1sX21ha2VfdmVjdCIsImluaXQiLCJjYW1sX21sX3NlZWtfaW4iLCJjYW1sX3N5c19yZWFkX2RpcmVjdG9yeSIsImNhbWxfbWxfb3V0cHV0X2NoYXIiLCJjYW1sX3N5c19jb25zdF9vc3R5cGVfd2luMzIiLCJjYW1sX29ial9pc19ibG9jayIsImNhbWxfb2JqX3NldF9yYXdfZmllbGQiLCJjYW1sX2pzX3ZhciIsImNhbWxfdHJ1bmNfZmxvYXQiLCJjYW1sX2VwaGVfdW5zZXRfZGF0YSIsImNhbWxfZXBoZV9zZXRfZGF0YSIsImNhbWxfZXBoZV9ibGl0X2RhdGEiLCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludDY0IiwiY2FtbF9pc19wcmludGFibGUiLCJjYW1sX2J5dGVzX2xlc3NlcXVhbCIsImNhbWxfYXJyYXlfb2ZfYnl0ZXMiLCJjYW1sX2VxdWFsIiwicmVfcGFydGlhbF9tYXRjaCIsImNhbWxfc3lzX3JhbmRvbV9zZWVkIiwiYnVmZiIsIm5vdyIsImFsbF9maW5hbGl6ZXJzIiwiY2FtbF9maW5hbF9yZWdpc3Rlcl9jYWxsZWRfd2l0aG91dF92YWx1ZSIsImNiIiwiY2FtbF9iYV9nZXRfMiIsImNhbWxfYmFfdWludDhfc2V0MTYiLCJjYW1sX2xhenlfcmVzZXRfdG9fbGF6eSIsImNhbWxfanNfZGVsZXRlIiwiY2FtbF9pbnRfb2Zfc3RyaW5nIiwiY2FtbF9saXN0X21vdW50X3BvaW50IiwicHJldiIsImNhbWxfbWFyc2hhbF9jb25zdGFudHMiLCJjYW1sX29ial9yYXdfZmllbGQiLCJjYW1sX2pzX2VxdWFscyIsImNhbWxfb2JqX2NvbXBhcmVfYW5kX3N3YXAiLCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkiLCJjYW1sX2dyX2FyY19hdXgiLCJjeCIsImN5IiwicnkiLCJyeCIsInJvdCIsInhQb3MiLCJ5UG9zIiwieFBvc19wcmV2IiwieVBvc19wcmV2Iiwic3BhY2UiLCJkZWx0YSIsImNhbWxfZ3JfZmlsbF9hcmMiLCJjYW1sX2JhX3NsaWNlIiwibnVtX2luZHMiLCJzdWJfZGltcyIsImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUiLCJjYW1sX2JhX2tpbmQiLCJjYW1sX2FsbG9jX2R1bW15X2luZml4IiwiY2FtbF9qc19mdW5fY2FsbCIsImNhbWxfZ2NfbWFqb3Jfc2xpY2UiLCJ3b3JrIiwiY2FtbF9qc19wdXJlX2V4cHIiLCJjb21wYXJlX2RpZ2l0c19uYXQiLCJjYW1sX21sX2lucHV0IiwiY2FtbF9ncl93YWl0X2V2ZW50IiwiX2V2bCIsImNhbWxfZ3Jfc2lnaW9faGFuZGxlciIsImNhbWxfaGFzaF9taXhfYmlnc3RyaW5nIiwiY2FtbF9yZWNvcmRfYmFja3RyYWNlIiwiY2FtbF91bml4X2NsZWFudXAiLCJjYW1sX3N5c19nZXRfY29uZmlnIiwiY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlIiwiY2FtbF9vYmpfaXNfc2hhcmVkIiwiY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdCIsImNhbWxfYXNpbmhfZmxvYXQiLCJjYW1sX3Bvc19vdXQiLCJiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyIiwiY2FtbF9tb2QiLCJjYW1sX2JhX2luaXQiLCJjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkIiwicmVfc3RyaW5nX21hdGNoIiwiQmlnU3RyaW5nUmVhZGVyIiwiY2FtbF9ncl9kdW1wX2ltYWdlIiwiY2FtbF9iYV9nZXRfZ2VuZXJpYyIsImNhbWxfdW5peF9zdGFydHVwIiwiY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSIsImNhbWxfZm9ybWF0X2Zsb2F0IiwidG9GaXhlZCIsImRwIiwicHJlYyIsImNhbWxfbW91bnRfYXV0b2xvYWQiLCJCYXNlX2ludF9tYXRoX2ludF9jbHoiLCJjYW1sX3N0cmluZ19sZXNzdGhhbiIsImNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuIiwiY2FtbF9kaXYiLCJjYW1sX29ial9kdXAiLCJjYW1sX2VwaGVfZ2V0X2RhdGFfY29weSIsImNhbWxfbWVtcHJvZl9zdGFydCIsInJhdGUiLCJzdGFja19zaXplIiwidHJhY2tlciIsImNhbWxfc3lzX2dldF9hcmd2IiwiY2FtbF9tbF9kb21haW5fc2V0X25hbWUiLCJfbmFtZSIsImNhbWxfanNfdG9fYm9vbCIsImNhbWxfZ3JfY3JlYXRlX2ltYWdlIiwiY2FtbF9lcGhlX2dldF9rZXlfY29weSIsImNhbWxfbGVzc3RoYW4iLCJjYW1sX3Jhd19iYWNrdHJhY2VfbmV4dF9zbG90IiwiY2FtbF9idWlsZF9zeW1ib2xzIiwidG9jIiwic3ltYiIsImNhbWxfcmVnaXN0ZXJfZ2xvYmFsIiwibmFtZV9vcHQiLCJuaWQiLCJtdWx0X25hdCIsImxlbjMiLCJzcXVhcmVfbmF0IiwiY2FtbF9qc19mcm9tX2Zsb2F0IiwiY2FtbF9mbG9hdGFycmF5X2NyZWF0ZSIsImNhbWxfZ2Nfc3RhdCIsImNhbWxfZ2V0X21ham9yX2NyZWRpdCIsImNhbWxfc3lzX21vZGlmeV9hcmd2IiwiY2FtbF9tZXRob2RfY2FjaGUiLCJjYW1sX2dldF9wdWJsaWNfbWV0aG9kIiwiY2FjaGVpZCIsIm1ldGhzIiwibGkiLCJjYW1sX2pzX2dldF9jb25zb2xlIiwiY2FtbF9zeXNfdW5zYWZlX2dldGVudiIsImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luIiwicmVmaWxsIiwiY2hhbm5lbCIsImJpZ3N0cmluZ19vZl90eXBlZF9hcnJheSIsImNhbWxfcm91bmRfZmxvYXQiLCJjYW1sX29qc19uZXdfYXJyIiwiRiIsImNvbXBsZW1lbnRfbmF0IiwiY2FtbF9kb21haW5fZGxzIiwiY2FtbF9kb21haW5fZGxzX3NldCIsImNhbWxfbGF6eV9yZWFkX3Jlc3VsdCIsImNhbWxfanNfcmVnZXhwcyIsImNhbWxfanNfaHRtbF9lc2NhcGUiLCJjYW1sX2JhX2RpbV8yIiwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfYXJndW1lbnRzIiwiY2FtbF9zaW5oX2Zsb2F0IiwiY2FtbF9sZGV4cF9mbG9hdCIsImNhbWxfZ3Jfc3RhdGVfc2V0IiwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdCIsImFyaXR5IiwiY2FtbF9nY19taW5vcl93b3JkcyIsImNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrIiwibGFuZF9kaWdpdF9uYXQiLCJjYW1sX2ludDY0X21vZCIsImNhbWxfb2JqX3NldF90YWciLCJjYW1sX2ludDMyX2Jzd2FwIiwiY2FtbF9iYV9zZXRfMyIsImNhbWxfanNfaW5zdGFuY2VvZiIsImNhbWxfZ2V0X21ham9yX2J1Y2tldCIsIm50aF9kaWdpdF9uYXRfbmF0aXZlIiwic2V0X2RpZ2l0X25hdF9uYXRpdmUiLCJkaWdpdCIsImNhbWxfc3RyaW5nX3NldDY0IiwiY2FtbF9ncl9zdGF0ZV9jcmVhdGUiLCJjYW52YXMiLCJjb250ZXh0IiwiY2FtbF9ncl9kcmF3X2FyYyIsImNhbWxfYmFfbWFwX2ZpbGUiLCJ2ZmQiLCJzaGFyZWQiLCJjYW1sX2JhX21hcF9maWxlX2J5dGVjb2RlIiwiYXJnbiIsImNhbWxfYmFfY3JlYXRlX2Zyb20iLCJkYXRhMSIsImRhdGEyIiwianN0eXAiLCJjYW1sX3RhbmhfZmxvYXQiLCJCYXNlX2ludF9tYXRoX2ludF9jdHoiLCJjYW1sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0IiwiY2FtbF9ncl9kcmF3X3N0ciIsImR4IiwiY2FtbF9ncl9kcmF3X3N0cmluZyIsImNhbWxfZ3JfZHJhd19jaGFyIiwiY2FtbF91bm1vdW50IiwiY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYSIsImNhbWxfaW5wdXRfdmFsdWVfZnJvbV9zdHJpbmciLCJjYW1sX21sX3Bvc19pbl82NCIsImNhbWxfZ3JfZHJhd19pbWFnZSIsImltYWdlIiwiY2FtbF9yZWdpc3Rlcl9jaGFubmVsX2Zvcl9zcGFjZXRpbWUiLCJfY2hhbm5lbCIsImNhbWxfc3RyaW5nX3NldCIsImNhbWxfc3lzX3JtZGlyIiwiY2FtbF91bml4X3N5bWxpbmsiLCJzcmNfcm9vdCIsImRzdF9yb290IiwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jdHoiLCJpc196ZXJvIiwibGFuZCIsInNtYWxsX2ludDY0IiwiY2FtbF9tbF9wb3Nfb3V0IiwiQmFzZV9jYW1sX2V4bl9pc19tb3N0X3JlY2VudF9leG4iLCJjYW1sX3NwYWNldGltZV9lbmFibGVkIiwiY2FtbF9ieXRlc19ub3RlcXVhbCIsImNhbWxfcnVudGltZV9wYXJhbWV0ZXJzIiwiY2FtbF9qc19vYmplY3QiLCJjYW1sX2JhX2NyZWF0ZSIsImRpbXNfbWwiLCJjYW1sX2dyX3JlbWVtYmVyX21vZGUiLCJCYXNlX2ludGVybmFsaGFzaF9nZXRfaGFzaF92YWx1ZSIsImNhbWxfZm1hX2Zsb2F0IiwiU1BMSVQiLCJNSU5fVkFMVUUiLCJFUFNJTE9OIiwiQyIsIkEiLCJCIiwibXVsdGlwbHkiLCJhdCIsImFoaSIsImFsbyIsImJoaSIsImJsbyIsImFkanVzdCIsInNjYWxlIiwieHMiLCJ5cyIsInpzIiwieHkiLCJ1IiwiY2FtbF9yZWNvbW1lbmRlZF9kb21haW5fY291bnQiLCJjYW1sX2Jzd2FwMTYiLCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZSIsImNhbWxfZmluYWxfcmVnaXN0ZXIiLCJjYW1sX2dyX2RyYXdfcmVjdCIsImNhbWxfc3RyaW5nX2dldDE2IiwiY2FtbF9vdXRwdXRfdmFsdWUiLCJjYW1sX2JhX2dldF8zIiwiY2FtbF9lcGhlX2JsaXRfa2V5IiwiY2FtbF9pbml0aWFsX3RpbWUiLCJjYW1sX3N5c190aW1lIiwiY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuIiwiQmFzZV9jbGVhcl9jYW1sX2JhY2t0cmFjZV9wb3MiLCJjYW1sX2NoZWNrX2JvdW5kIiwiY2FtbF91bml4X2dldHB3dWlkIiwiY2FtbF9iYV90b190eXBlZF9hcnJheSIsImNhbWxfZG9tYWluX2Rsc19nZXQiLCJjYW1sX2J5dGVzX2dldDMyIiwiY2FtbF9mcmV4cF9mbG9hdCIsIm5lZyIsImNhbWxfc3RyaW5nX2dldDY0IiwiY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uIiwiY2FtbF9tbF9wb3Nfb3V0XzY0IiwiY2FtbF91bml4X2ZpbmRjbG9zZSIsImNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93IiwiY2FtbF9mbG9hdGFycmF5X2JsaXQiLCJjYW1sX2dldF9taW5vcl9mcmVlIiwiY2FtbF9zZXRfc3RhdGljX2VudiIsImNhbWxfYmFfY2hhbmdlX2xheW91dCIsIkJhc2VfaGFzaF9kb3VibGUiLCJjYW1sX2pzX25ldyIsImNhbWxfZ3JfY3VycmVudF95IiwiY2FtbF9mb3JtYXRfaW50IiwianNvb19lZmZlY3Rfbm90X3N1cHBvcnRlZCIsImNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGMiLCJodmFsIiwiaGV4biIsImhlZmYiLCJjYW1sX29ial90cnVuY2F0ZSIsImNhbWxfanNfdG9fc3RyaW5nIiwiaXNfZGlnaXRfb2RkIiwiY2FtbF9ydW50aW1lX3ZhcmlhbnQiLCJjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXQiLCJidWZmZXJlZCIsImNhbWxfYXJyYXlfY29uY2F0IiwiY2FtbF9ncl9vcGVuX2dyYXBoIiwiaW5mbyIsInNwZWNzIiwic3RhdHVzIiwid2luIiwiZG9jIiwidGl0bGUiLCJib2R5IiwiY2FtbF9tYWtlX2Zsb2F0X3ZlY3QiLCJjYW1sX2NicnRfZmxvYXQiLCJjYW1sX2V2ZW50bG9nX3BhdXNlIiwiY2FtbF9tZW1wcm9mX3N0b3AiLCJjYW1sX2dyZWF0ZXJlcXVhbCIsImNhbWxfZ2V0X2V4Y2VwdGlvbl9yYXdfYmFja3RyYWNlIiwiY2FtbF9sb2cxcF9mbG9hdCIsIm1zX3RvX25hbm8iLCJ0aW1lX25vd19uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm8iLCJtcyIsIm1zX2k2MyIsImNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3IiLCJjYW1sX2xhenlfbWFrZV9mb3J3YXJkIiwibG9yX2RpZ2l0X25hdCIsImNhbWxfZ3JfYmxpdF9pbWFnZSIsImltMiIsImNhbWxfZ3Jfd2luZG93X2lkIiwiY2FtbF9qc19vbl9pZSIsInVhIiwiY2FtbF9pbnQ2NF9zaGlmdF9yaWdodCIsImNhbWxfYmFfbGF5b3V0IiwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UiLCJjYW1sX2FycmF5X3NldCIsIm5ld3ZhbCIsImNhbWxfYWxsb2Nfc3RhY2siLCJodiIsImh4IiwiaGYiLCJjYW1sX2J5dGVzX2dyZWF0ZXJlcXVhbCIsInNldF9kaWdpdF9uYXQiLCJjYW1sX2J5dGVzX3NldDE2IiwiY2FtbF9ncl9kb2Nfb2Zfc3RhdGUiLCJjYW1sX21sX291dHB1dF9pbnQiLCJjYW1sX29ial93aXRoX3RhZyIsImNhbWxfbWxfY2hhbm5lbF9zaXplIiwiY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3QiLCJjYW1sX2hleHN0cmluZ19vZl9mbG9hdCIsInN0eWxlIiwiZXhwX3NpZ24iLCJzaWduX3N0ciIsImNzdCIsInhfc3RyIiwiY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlIiwiZXZlbnQiLCJldmVudF9jb250ZW50IiwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0IiwiY2FtbF91bml4X3JlYWRsaW5rIiwiY2FtbF9iYWNrdHJhY2Vfc3RhdHVzIiwiY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyIiwiY2FtbF9zeXNfYXJndiIsImNhbWxfYmFfZmlsbCIsImNhbWxfbW9kZl9mbG9hdCIsImNhbWxfZ2NfZ2V0IiwiY2FtbF9mbG9hdF9jb21wYXJlIiwiY2FtbF9zdHJpbmdfc2V0MzIiLCJjYW1sX3BhcnNlX2VuZ2luZSIsInRhYmxlcyIsImVudiIsIkVSUkNPREUiLCJsb29wIiwidGVzdHNoaWZ0Iiwic2hpZnQiLCJzaGlmdF9yZWNvdmVyIiwicmVkdWNlIiwiUkVBRF9UT0tFTiIsIlJBSVNFX1BBUlNFX0VSUk9SIiwiR1JPV19TVEFDS1NfMSIsIkdST1dfU1RBQ0tTXzIiLCJDT01QVVRFX1NFTUFOVElDX0FDVElPTiIsIkNBTExfRVJST1JfRlVOQ1RJT04iLCJlbnZfc19zdGFjayIsImVudl92X3N0YWNrIiwiZW52X3N5bWJfc3RhcnRfc3RhY2siLCJlbnZfc3ltYl9lbmRfc3RhY2siLCJlbnZfc3RhY2tzaXplIiwiZW52X3N0YWNrYmFzZSIsImVudl9jdXJyX2NoYXIiLCJlbnZfbHZhbCIsImVudl9zeW1iX3N0YXJ0IiwiZW52X3N5bWJfZW5kIiwiZW52X2FzcCIsImVudl9ydWxlX2xlbiIsImVudl9ydWxlX251bWJlciIsImVudl9zcCIsImVudl9zdGF0ZSIsImVudl9lcnJmbGFnIiwidGJsX3RyYW5zbF9jb25zdCIsInRibF90cmFuc2xfYmxvY2siLCJ0YmxfbGhzIiwidGJsX2xlbiIsInRibF9kZWZyZWQiLCJ0YmxfZGdvdG8iLCJ0Ymxfc2luZGV4IiwidGJsX3JpbmRleCIsInRibF9naW5kZXgiLCJ0YmxfdGFibGVzaXplIiwidGJsX3RhYmxlIiwidGJsX2NoZWNrIiwidGJsX25hbWVzX2NvbnN0IiwidGJsX25hbWVzX2Jsb2NrIiwibG9nIiwidG9rZW5fbmFtZSIsIm5hbWVzIiwicHJpbnRfdG9rZW4iLCJ0b2siLCJ0b2tlbiIsIm4xIiwibjIiLCJzdGF0ZTEiLCJzcCIsImVycmZsYWciLCJhc3AiLCJjYW1sX2pzb29fZmxhZ3NfZWZmZWN0cyIsImNhbWxfdXBkYXRlX2R1bW15IiwiY2FtbF9hcnJheV9maWxsIiwiY2FtbF9zeXNfbWtkaXIiLCJjYW1sX3N0cmluZ19ub3RlcXVhbCIsImNhbWxfYnl0ZXNfZ3JlYXRlcnRoYW4iLCJjYW1sX2dyX21ha2VfaW1hZ2UiLCJCYXNlX2ludF9tYXRoX2ludF9wb3Bjb3VudCIsImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0IiwiY2FtbF9yZWFkX2ZpbGVfY29udGVudCIsImNhbWxfanNfdG9fZmxvYXQiLCJjYW1sX3NldHVwX3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIiwib3JpZ2luIiwiZXJhc2VfcmVsIiwicmVzdCIsInJlc3QkMCIsInJlc3QkMSIsInJlc3QkMiIsInJlc3QkMyIsInJlc3QkNCIsInJlc3QkNSIsInJlc3QkNiIsInJlc3QkNyIsInR5IiwicmVzdCQ4IiwidHkxIiwicmVzdCQ5IiwicmVzdCQxMCIsInJlc3QkMTEiLCJyZXN0JDEyIiwicmVzdCQxMyIsImNvbmNhdF9mbXR0eSIsImZtdHR5MSIsImZtdHR5MiIsInR5MiIsImNvbmNhdF9mbXQiLCJmbXQxIiwiZm10MiIsInBhZCIsInBhZCQwIiwicHJlYyIsInBhZCQxIiwiaWNvbnYiLCJwcmVjJDAiLCJwYWQkMiIsImljb252JDAiLCJwcmVjJDEiLCJwYWQkMyIsImljb252JDEiLCJwcmVjJDIiLCJwYWQkNCIsImljb252JDIiLCJwcmVjJDMiLCJwYWQkNSIsImZjb252IiwicGFkJDYiLCJzdHIiLCJjaHIiLCJmbXR0eSIsInBhZCQ3IiwiZm10dHkkMCIsInBhZCQ4IiwicmVzdCQxNCIsInJlc3QkMTUiLCJyZXN0JDE2IiwiZm10aW5nX2xpdCIsInJlc3QkMTciLCJmbXRpbmdfZ2VuIiwicmVzdCQxOCIsInJlc3QkMTkiLCJjaGFyX3NldCIsIndpZHRoX29wdCIsInJlc3QkMjAiLCJjb3VudGVyIiwicmVzdCQyMSIsInJlc3QkMjIiLCJpZ24iLCJyZXN0JDIzIiwiZiIsImFyaXR5IiwiZmFpbHdpdGgiLCJzIiwiaW52YWxpZF9hcmciLCJtaW4iLCJ4IiwieSIsIm1heCIsImFicyIsImxub3QiLCJpbmZpbml0eSIsIm5lZ19pbmZpbml0eSIsIm5hbiIsIm1heF9mbG9hdCIsIm1pbl9mbG9hdCIsImVwc2lsb25fZmxvYXQiLCJtYXhfaW50IiwibWluX2ludCIsInN5bWJvbCIsInMxIiwiczIiLCJsMSIsImwyIiwiY2hhcl9vZl9pbnQiLCJuIiwic3RyaW5nX29mX2Jvb2wiLCJiIiwiYm9vbF9vZl9zdHJpbmciLCJib29sX29mX3N0cmluZ19vcHQiLCJzdHJpbmdfb2ZfaW50IiwiaW50X29mX3N0cmluZ19vcHQiLCJ2YWxpZF9mbG9hdF9sZXhlbSIsImwiLCJpIiwiaSQwIiwic3RyaW5nX29mX2Zsb2F0IiwiZmxvYXRfb2Zfc3RyaW5nX29wdCIsInN5bWJvbCQwIiwidGwiLCJoZCIsInN0ZGluIiwic3Rkb3V0Iiwic3RkZXJyIiwib3Blbl9vdXRfZ2VuIiwibW9kZSIsInBlcm0iLCJuYW1lIiwiYyIsIm9wZW5fb3V0Iiwib3Blbl9vdXRfYmluIiwiZmx1c2hfYWxsIiwiYSIsIm91dHB1dF9ieXRlcyIsIm9jIiwib3V0cHV0X3N0cmluZyIsIm91dHB1dCIsIm9mcyIsImxlbiIsIm91dHB1dF9zdWJzdHJpbmciLCJvdXRwdXRfdmFsdWUiLCJjaGFuIiwidiIsImNsb3NlX291dCIsImNsb3NlX291dF9ub2VyciIsIm9wZW5faW5fZ2VuIiwib3Blbl9pbiIsIm9wZW5faW5fYmluIiwiaW5wdXQiLCJpYyIsInVuc2FmZV9yZWFsbHlfaW5wdXQiLCJvZnMkMCIsImxlbiQwIiwiciIsImxlbiQxIiwib2ZzJDEiLCJyZWFsbHlfaW5wdXQiLCJyZWFsbHlfaW5wdXRfc3RyaW5nIiwiaW5wdXRfbGluZSIsImJ1aWxkX3Jlc3VsdCIsImJ1ZiIsInBvcyQwIiwiYWNjdSIsImJlZyIsImFjY3UkMCIsInJlcyIsImNsb3NlX2luX25vZXJyIiwicHJpbnRfY2hhciIsInByaW50X3N0cmluZyIsInByaW50X2J5dGVzIiwicHJpbnRfaW50IiwicHJpbnRfZmxvYXQiLCJwcmludF9lbmRsaW5lIiwicHJpbnRfbmV3bGluZSIsInByZXJyX2NoYXIiLCJwcmVycl9zdHJpbmciLCJwcmVycl9ieXRlcyIsInByZXJyX2ludCIsInByZXJyX2Zsb2F0IiwicHJlcnJfZW5kbGluZSIsInByZXJyX25ld2xpbmUiLCJyZWFkX2xpbmUiLCJyZWFkX2ludCIsInJlYWRfaW50X29wdCIsInJlYWRfZmxvYXQiLCJyZWFkX2Zsb2F0X29wdCIsInN0cmluZ19vZl9mb3JtYXQiLCJzeW1ib2wkMSIsInN0cjIiLCJzdHIxIiwiZXhpdF9mdW5jdGlvbiIsImF0X2V4aXQiLCJmX3lldF90b19ydW4iLCJvbGRfZXhpdCIsIm5ld19leGl0JDAiLCJuZXdfZXhpdCIsInN1Y2Nlc3MiLCJkb19kb21haW5fbG9jYWxfYXRfZXhpdCIsImRvX2F0X2V4aXQiLCJleGl0IiwicmV0Y29kZSIsImxlZnQiLCJyaWdodCIsImlzX2xlZnQiLCJpc19yaWdodCIsImZpbmRfbGVmdCIsImZpbmRfcmlnaHQiLCJtYXBfbGVmdCIsImUiLCJtYXBfcmlnaHQiLCJtYXAiLCJ2JDAiLCJmb2xkIiwiZXF1YWwiLCJlMSIsImUyIiwidjEiLCJ2MiIsInYxJDAiLCJ2MiQwIiwiY29tcGFyZSIsIm9jYW1sX3ZlcnNpb24iLCJvY2FtbF9yZWxlYXNlIiwiZXhlY3V0YWJsZV9uYW1lIiwib3NfdHlwZSIsImJhY2tlbmRfdHlwZSIsInVuaXgiLCJ3aW4zMiIsImN5Z3dpbiIsIm1heF9hcnJheV9sZW5ndGgiLCJtYXhfZmxvYXRhcnJheV9sZW5ndGgiLCJtYXhfc3RyaW5nX2xlbmd0aCIsImJpZ19lbmRpYW4iLCJ3b3JkX3NpemUiLCJpbnRfc2l6ZSIsImdldGVudl9vcHQiLCJpbnRlcmFjdGl2ZSIsInNldF9zaWduYWwiLCJzaWdfbnVtIiwic2lnX2JlaCIsInNpZ2FicnQiLCJzaWdhbHJtIiwic2lnZnBlIiwic2lnaHVwIiwic2lnaWxsIiwic2lnaW50Iiwic2lna2lsbCIsInNpZ3BpcGUiLCJzaWdxdWl0Iiwic2lnc2VndiIsInNpZ3Rlcm0iLCJzaWd1c3IxIiwic2lndXNyMiIsInNpZ2NobGQiLCJzaWdjb250Iiwic2lnc3RvcCIsInNpZ3RzdHAiLCJzaWd0dGluIiwic2lndHRvdSIsInNpZ3Z0YWxybSIsInNpZ3Byb2YiLCJzaWdidXMiLCJzaWdwb2xsIiwic2lnc3lzIiwic2lndHJhcCIsInNpZ3VyZyIsInNpZ3hjcHUiLCJzaWd4ZnN6IiwiY2F0Y2hfYnJlYWsiLCJvbiIsImRldmVsb3BtZW50X3ZlcnNpb24iLCJpc19ibG9jayIsImRvdWJsZV9maWVsZCIsInNldF9kb3VibGVfZmllbGQiLCJmaXJzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3IiLCJsYXN0X25vbl9jb25zdGFudF9jb25zdHJ1Y3Rvcl8iLCJmb3JjaW5nX3RhZyIsImNvbnRfdGFnIiwibGF6eV90YWciLCJjbG9zdXJlX3RhZyIsIm9iamVjdF90YWciLCJpbmZpeF90YWciLCJmb3J3YXJkX3RhZyIsIm5vX3NjYW5fdGFnIiwiYWJzdHJhY3RfdGFnIiwic3RyaW5nX3RhZyIsImRvdWJsZV90YWciLCJkb3VibGVfYXJyYXlfdGFnIiwiY3VzdG9tX3RhZyIsImludF90YWciLCJvdXRfb2ZfaGVhcF90YWciLCJ1bmFsaWduZWRfdGFnIiwiaW5mbyIsIm9iaiIsInN0YXJ0X2VudiIsIm9mX3ZhbCIsInNsb3QiLCJpZCIsIm1heF9lcGhlX2xlbmd0aCIsImNyZWF0ZSIsImxlbmd0aCIsInJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IiwibyIsIm1zZyIsImdldF9rZXkiLCJnZXRfa2V5X2NvcHkiLCJzZXRfa2V5IiwidW5zZXRfa2V5IiwiY2hlY2tfa2V5IiwiYmxpdF9rZXkiLCJvMSIsIm8yIiwic2V0IiwiaW5jciIsImRlY3IiLCJmb3JjZV9nZW5fbGF6eV9ibG9jayIsIm9ubHlfdmFsIiwiYmxrIiwiY2xvc3VyZSQwIiwicmVzdWx0JDAiLCJjbG9zdXJlIiwicmVzdWx0IiwiZSQwIiwiZm9yY2VfbGF6eV9ibG9jayIsImZvcmNlX2dlbiIsImx6diIsInQiLCJmb3JjZV92YWwiLCJmcm9tX2Z1biIsImZyb21fdmFsIiwiaXNfdmFsIiwibWFwX3ZhbCIsImVtcHR5IiwicmV0dXJuJDAiLCJjb25zIiwibmV4dCIsImFwcGVuZCIsInNlcTEiLCJzZXEyIiwic2VxIiwiZmlsdGVyX21hcCIsInNlcSQwIiwiZmlsdGVyIiwiY29uY2F0IiwiZmxhdF9tYXAiLCJmb2xkX2xlZnQiLCJhY2MiLCJhY2MkMCIsImFjYyQxIiwiaXRlciIsInVuZm9sZCIsInUiLCJ1JDAiLCJpc19lbXB0eSIsInhzIiwidW5jb25zIiwieHMkMCIsInhzJDEiLCJpdGVyaSIsImZvbGRfbGVmdGkiLCJhY2N1JDEiLCJmb3JfYWxsIiwicCIsImV4aXN0cyIsImZpbmQiLCJmaW5kX21hcCIsIml0ZXIyIiwieXMiLCJ5cyQwIiwieXMkMSIsImZvbGRfbGVmdDIiLCJmb3JfYWxsMiIsImV4aXN0czIiLCJlcSIsImNtcCIsImluaXRfYXV4IiwiaiIsImluaXQiLCJyZXBlYXQiLCJmb3JldmVyIiwiY3ljbGVfbm9uZW1wdHkiLCJjeWNsZSIsIml0ZXJhdGUxIiwiaXRlcmF0ZSIsIm1hcGlfYXV4IiwibWFwaSIsInRhaWxfc2NhbiIsInMkMCIsInNjYW4iLCJ0YWtlX2F1eCIsInRha2UiLCJkcm9wIiwibiQwIiwibiQxIiwidGFrZV93aGlsZSIsImRyb3Bfd2hpbGUiLCJub2RlIiwiZ3JvdXAiLCJ0b19sYXp5IiwiZmFpbHVyZSIsIm1lbW9pemUiLCJvbmNlIiwiYWN0aW9uIiwiemlwIiwibWFwMiIsImludGVybGVhdmUiLCJzb3J0ZWRfbWVyZ2UxIiwic29ydGVkX21lcmdlIiwibWFwX2ZzdCIsInh5cyIsInh5cyQwIiwibWFwX3NuZCIsInVuemlwIiwiZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIiwiZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCIsInoiLCJwYXJ0aXRpb25fbWFwIiwicGFydGl0aW9uIiwicGVlbCIsInhzcyIsInRyYW5zcG9zZSIsInRhaWxzIiwiaGVhZHMiLCJyZW1haW5kZXJzIiwieHNzJDAiLCJ0YWlscyQwIiwiaGVhZHMkMCIsIm1hcF9wcm9kdWN0IiwicHJvZHVjdCIsIm9mX2Rpc3BlbnNlciIsIml0IiwidG9fZGlzcGVuc2VyIiwiaW50cyIsIm5vbmUiLCJzb21lIiwidmFsdWUiLCJkZWZhdWx0JDAiLCJnZXQiLCJiaW5kIiwiam9pbiIsImlzX25vbmUiLCJpc19zb21lIiwibzAiLCJ2MCIsInRvX3Jlc3VsdCIsInRvX2xpc3QiLCJ0b19zZXEiLCJvayIsImVycm9yIiwiZ2V0X29rIiwiZ2V0X2Vycm9yIiwibWFwX2Vycm9yIiwiaXRlcl9lcnJvciIsImlzX29rIiwiaXNfZXJyb3IiLCJyMCIsInIxIiwiZTAiLCJ0b19vcHRpb24iLCJ0b19mbG9hdCIsInRvX3N0cmluZyIsImVzY2FwZWQiLCJsb3dlcmNhc2VfYXNjaWkiLCJ1cHBlcmNhc2VfYXNjaWkiLCJjMSIsImMyIiwiZXJyX25vX3ByZWQiLCJlcnJfbm9fc3VjYyIsImxvX2JvdW5kIiwiaGlfYm91bmQiLCJib20iLCJyZXAiLCJzdWNjIiwicHJlZCIsImlzX3ZhbGlkIiwib2ZfaW50IiwiaXNfY2hhciIsIm9mX2NoYXIiLCJ0b19jaGFyIiwidW5zYWZlX3RvX2NoYXIiLCJoYXNoIiwidXRmX2RlY29kZV9pc192YWxpZCIsImQiLCJ1dGZfZGVjb2RlX2xlbmd0aCIsInV0Zl9kZWNvZGVfdWNoYXIiLCJ1dGZfZGVjb2RlIiwidXRmX2RlY29kZV9pbnZhbGlkIiwidXRmXzhfYnl0ZV9sZW5ndGgiLCJ1dGZfMTZfYnl0ZV9sZW5ndGgiLCJsJDAiLCJudGgiLCJsJDEiLCJudGhfb3B0IiwicmV2X2FwcGVuZCIsImwxJDAiLCJsMiQwIiwibDEkMSIsImwyJDEiLCJyZXYiLCJyZXZfaW5pdF90aHJlc2hvbGQiLCJmbGF0dGVuIiwicmV2X21hcCIsImZvbGRfcmlnaHQiLCJhMiIsImExIiwicmV2X21hcDIiLCJmb2xkX3JpZ2h0MiIsIm1lbSIsIm1lbXEiLCJhc3NvYyIsImFzc29jX29wdCIsImFzc3EiLCJhc3NxX29wdCIsIm1lbV9hc3NvYyIsIm1lbV9hc3NxIiwicmVtb3ZlX2Fzc29jIiwicGFpciIsInJlbW92ZV9hc3NxIiwiZmluZF9vcHQiLCJmaW5kX2FsbCIsImZpbHRlcmkiLCJjb25jYXRfbWFwIiwiZm9sZF9sZWZ0X21hcCIsImxfYWNjdSIsIngkMCIsInllcyIsIm5vIiwic3BsaXQiLCJyeSIsInJ4IiwiY29tYmluZSIsIm1lcmdlIiwidDIiLCJoMiIsInQxIiwiaDEiLCJzdGFibGVfc29ydCIsInNvcnQiLCJ4MiIsIngxIiwidGwkMSIsIngzIiwieDIkMCIsIngxJDAiLCJuMSIsIm4yIiwicmV2X3NvcnQiLCJ0bCQwIiwic29ydF91bmlxIiwiYyQwIiwiYyQxIiwiYyQyIiwiYyQzIiwiYyQ0IiwiYyQ1IiwiYyQ2IiwiYWNjdSQyIiwiY29tcGFyZV9sZW5ndGhzIiwiY29tcGFyZV9sZW5ndGhfd2l0aCIsImF1eCIsInRhaWwiLCJvZl9zZXEiLCJkaXJlY3QiLCJkZXB0aCIsInplcm8iLCJvbmUiLCJtaW51c19vbmUiLCJsb2dub3QiLCJtYWtlIiwiY29weSIsIm9mX3N0cmluZyIsInN1YiIsInN1Yl9zdHJpbmciLCJleHRlbmQiLCJkc3RvZmYiLCJzcmNvZmYiLCJjcHlsZW4iLCJmaWxsIiwiYmxpdCIsIm9mczEiLCJvZnMyIiwiYmxpdF9zdHJpbmciLCJzZXAiLCJzZXBsZW4iLCJkc3QiLCJwb3MiLCJoZCQwIiwiY2F0IiwiaXNfc3BhY2UiLCJ0cmltIiwidW5zYWZlX2VzY2FwZSIsImIkMCIsImFwcGx5MSIsImNhcGl0YWxpemVfYXNjaWkiLCJ1bmNhcGl0YWxpemVfYXNjaWkiLCJzdGFydHNfd2l0aCIsInByZWZpeCIsImxlbl9zIiwibGVuX3ByZSIsImVuZHNfd2l0aCIsInN1ZmZpeCIsImxlbl9zdWYiLCJkaWZmIiwiaW5kZXhfcmVjIiwibGltIiwiaSQxIiwiaW5kZXgiLCJpbmRleF9yZWNfb3B0IiwiaW5kZXhfb3B0IiwiaW5kZXhfZnJvbSIsImluZGV4X2Zyb21fb3B0IiwicmluZGV4X3JlYyIsInJpbmRleCIsInJpbmRleF9mcm9tIiwicmluZGV4X3JlY19vcHQiLCJyaW5kZXhfb3B0IiwicmluZGV4X2Zyb21fb3B0IiwiY29udGFpbnNfZnJvbSIsImNvbnRhaW5zIiwicmNvbnRhaW5zX2Zyb20iLCJzcGxpdF9vbl9jaGFyIiwidG9fc2VxaSIsIm5ld19sZW4iLCJuZXdfYnVmIiwidW5zYWZlX2dldF91aW50MTZfbGUiLCJ1bnNhZmVfZ2V0X3VpbnQxNl9iZSIsImdldF9pbnQ4IiwiZ2V0X3VpbnQxNl9sZSIsImdldF91aW50MTZfYmUiLCJnZXRfaW50MTZfbmUiLCJnZXRfaW50MTZfbGUiLCJnZXRfaW50MTZfYmUiLCJnZXRfaW50MzJfbGUiLCJnZXRfaW50MzJfYmUiLCJnZXRfaW50NjRfbGUiLCJnZXRfaW50NjRfYmUiLCJ1bnNhZmVfc2V0X3VpbnQxNl9sZSIsInVuc2FmZV9zZXRfdWludDE2X2JlIiwic2V0X2ludDE2X2xlIiwic2V0X2ludDE2X2JlIiwic2V0X2ludDMyX2xlIiwic2V0X2ludDMyX2JlIiwic2V0X2ludDY0X2xlIiwic2V0X2ludDY0X2JlIiwic2V0X3VpbnQ4Iiwic2V0X3VpbnQxNl9uZSIsImRlY19pbnZhbGlkIiwiZGVjX3JldCIsIm5vdF9pbl94ODBfdG9feEJGIiwibm90X2luX3hBMF90b194QkYiLCJub3RfaW5feDgwX3RvX3g5RiIsIm5vdF9pbl94OTBfdG9feEJGIiwibm90X2luX3g4MF90b194OEYiLCJ1dGZfOF91Y2hhcl8zIiwiYjAiLCJiMSIsImIyIiwidXRmXzhfdWNoYXJfNCIsImIzIiwiZ2V0X3V0Zl84X3VjaGFyIiwiaSQ0IiwiYjEkMSIsImkkNSIsImIyJDEiLCJpJDYiLCJpJDEwIiwiYjEkMyIsImkkMTEiLCJiMiQzIiwiaSQxMiIsImIzJDEiLCJpJDciLCJiMSQyIiwiaSQ4IiwiYjIkMiIsImkkOSIsImIzJDAiLCJpJDEzIiwiYjEkNCIsImkkMTQiLCJiMiQ0IiwiaSQyIiwiYjEkMCIsImkkMyIsImIyJDAiLCJpJDE1IiwiYjEkNSIsInNldF91dGZfOF91Y2hhciIsImxhc3QkMSIsImxhc3QkMCIsImxhc3QiLCJpc192YWxpZF91dGZfOCIsImxhc3QkMyIsImxhc3QkMiIsImxhc3QkNCIsImxhc3QkNSIsImdldF91dGZfMTZiZV91Y2hhciIsImhpIiwibG8iLCJzZXRfdXRmXzE2YmVfdWNoYXIiLCJ1JDEiLCJpc192YWxpZF91dGZfMTZiZSIsImdldF91dGZfMTZsZV91Y2hhciIsInNldF91dGZfMTZsZV91Y2hhciIsImlzX3ZhbGlkX3V0Zl8xNmxlIiwiYnRzIiwiYm9zIiwib2ZfYnl0ZXMiLCJ0b19ieXRlcyIsImciLCJ0b19idWZmZXIiLCJidWZmIiwiZmxhZ3MiLCJoZWFkZXJfc2l6ZSIsImRhdGFfc2l6ZSIsInRvdGFsX3NpemUiLCJmcm9tX2J5dGVzIiwiZnJvbV9zdHJpbmciLCJtYWtlX21hdHJpeCIsInN4Iiwic3kiLCJsYSIsImxiIiwicmVzJDAiLCJsaXN0X2xlbmd0aCIsIm9mX2xpc3QiLCJpbnB1dF9hcnJheSIsImVsdCIsIm91dHB1dF9hcnJheSIsImVsdCQwIiwiYWNjJDIiLCJhMCIsImJpIiwiYWkiLCJuYSIsIm5iIiwibWF4c29uIiwiaTMxIiwiZSQxIiwiaiQwIiwiZmF0aGVyIiwic3JjMW9mcyIsInNyYzFsZW4iLCJzcmMyIiwic3JjMm9mcyIsInNyYzJsZW4iLCJkc3RvZnMiLCJzcmMxciIsInNyYzJyIiwiczIkMSIsInMxJDEiLCJpMSIsImkyIiwiaTIkMCIsImQkMCIsInMyJDAiLCJpMSQwIiwiZCQxIiwiczEkMCIsImlzb3J0dG8iLCJzcmNvZnMiLCJzb3J0dG8iLCJpc19maW5pdGUiLCJpc19pbmZpbml0ZSIsImlzX25hbiIsImVwc2lsb24iLCJvZl9zdHJpbmdfb3B0IiwicGkiLCJpc19pbnRlZ2VyIiwibWluX21heCIsIm1pbl9udW0iLCJtYXhfbnVtIiwibWluX21heF9udW0iLCJ1bnNhZmVfZmlsbCIsImNoZWNrIiwiaGxlbiIsInNyYyIsInNvZnMiLCJkb2ZzIiwiaCIsIm1lbV9pZWVlIiwibWFwX3RvX2FycmF5IiwibWFwX2Zyb21fYXJyYXkiLCJtYXhfaW50JDAiLCJ1bnNpZ25lZF90b19pbnQiLCJ1bnNpZ25lZF9jb21wYXJlIiwibSIsInVuc2lnbmVkX2RpdiIsInEiLCJ1bnNpZ25lZF9yZW0iLCJzaXplIiwiZHVtbXlfcG9zIiwiemVyb19wb3MiLCJlbmdpbmUiLCJ0YmwiLCJzdGF0ZSIsIm5ld19lbmdpbmUiLCJmcm9tX2Z1bmN0aW9uIiwib3B0IiwicmVhZF9mdW4iLCJzdGgiLCJ3aXRoX3Bvc2l0aW9ucyIsImF1eF9idWZmZXIiLCJsZXhidWYiLCJyZWFkIiwibmV3bGVuIiwibmV3YnVmIiwiZnJvbV9jaGFubmVsIiwic2V0X3Bvc2l0aW9uIiwicG9zaXRpb24iLCJzZXRfZmlsZW5hbWUiLCJmbmFtZSIsImxleGVtZSIsInN1Yl9sZXhlbWUiLCJzdWJfbGV4ZW1lX29wdCIsInN1Yl9sZXhlbWVfY2hhciIsInN1Yl9sZXhlbWVfY2hhcl9vcHQiLCJsZXhlbWVfY2hhciIsImxleGVtZV9zdGFydCIsImxleGVtZV9lbmQiLCJsZXhlbWVfc3RhcnRfcCIsImxleGVtZV9lbmRfcCIsIm5ld19saW5lIiwibGNwIiwiZmx1c2hfaW5wdXQiLCJlbnYiLCJncm93X3N0YWNrcyIsIm9sZHNpemUiLCJuZXdzaXplIiwibmV3X3MiLCJuZXdfdiIsIm5ld19zdGFydCIsIm5ld19lbmQiLCJjbGVhcl9wYXJzZXIiLCJjdXJyZW50X2xvb2thaGVhZF9mdW4iLCJ5eXBhcnNlIiwidGFibGVzIiwic3RhcnQiLCJsZXhlciIsImluaXRfYXNwIiwiaW5pdF9zcCIsImluaXRfc3RhY2tiYXNlIiwiaW5pdF9zdGF0ZSIsImluaXRfY3Vycl9jaGFyIiwiaW5pdF9sdmFsIiwiaW5pdF9lcnJmbGFnIiwiY21kIiwiYXJnIiwiYXJnJDAiLCJleG4kMCIsImV4biIsImN1cnJfY2hhciIsInRvayIsInBlZWtfdmFsIiwic3ltYm9sX3N0YXJ0X3BvcyIsInN0IiwiZW4iLCJzeW1ib2xfZW5kX3BvcyIsInJoc19zdGFydF9wb3MiLCJyaHNfZW5kX3BvcyIsInN5bWJvbF9zdGFydCIsInN5bWJvbF9lbmQiLCJyaHNfc3RhcnQiLCJyaHNfZW5kIiwiaXNfY3VycmVudF9sb29rYWhlYWQiLCJwYXJzZV9lcnJvciIsImhlaWdodCIsImhsIiwiaCQwIiwiaHIiLCJiYWwiLCJsciIsImx2IiwibGwiLCJscnIiLCJscnYiLCJscmwiLCJyciIsInJ2IiwicmwiLCJybHIiLCJybHYiLCJybGwiLCJhZGQiLCJzaW5nbGV0b24iLCJhZGRfbWluX2VsZW1lbnQiLCJhZGRfbWF4X2VsZW1lbnQiLCJyaCIsImxoIiwibWluX2VsdCIsIm1pbl9lbHRfb3B0IiwibWF4X2VsdCIsIm1heF9lbHRfb3B0IiwicmVtb3ZlX21pbl9lbHQiLCJyJDAiLCJwcmVzIiwicHJlcyQwIiwicmVtb3ZlIiwidW5pb24iLCJyMiIsInIyJDAiLCJyMSQwIiwiaW50ZXIiLCJzcGxpdF9iaXMiLCJkaXNqb2ludCIsImNvbnNfZW51bSIsImUyJDIiLCJlMSQyIiwiZTIkMCIsImUxJDAiLCJlMiQxIiwiZTEkMSIsInN1YnNldCIsInB2IiwibGYiLCJsdCIsInJmIiwicnQiLCJjYXJkaW5hbCIsImVsZW1lbnRzX2F1eCIsImVsZW1lbnRzIiwiZmluZF9maXJzdCIsInYwJDEiLCJ2MCQwIiwiZmluZF9maXJzdF9vcHQiLCJmaW5kX2xhc3QiLCJmaW5kX2xhc3Rfb3B0IiwidHJ5X2pvaW4iLCJ2JDEiLCJ4MCIsImwkMyIsImwkNCIsIngwJDAiLCJsJDUiLCJ4MCQxIiwibmwiLCJtaWQiLCJsJDIiLCJ4NCIsImFkZF9zZXEiLCJzZXFfb2ZfZW51bSIsInNub2NfZW51bSIsInJldl9zZXFfb2ZfZW51bSIsInRvX3Jldl9zZXEiLCJ0b19zZXFfZnJvbSIsImxvdyIsImxkIiwibHJkIiwicmQiLCJybGQiLCJkYXRhIiwiZDAkMSIsImQwIiwiZDAkMCIsIm1pbl9iaW5kaW5nIiwibWluX2JpbmRpbmdfb3B0IiwibWF4X2JpbmRpbmciLCJtYXhfYmluZGluZ19vcHQiLCJyZW1vdmVfbWluX2JpbmRpbmciLCJ1cGRhdGUiLCJkYXRhJDAiLCJtJDAiLCJhZGRfbWluX2JpbmRpbmciLCJrIiwiYWRkX21heF9iaW5kaW5nIiwiY29uY2F0X29yX2pvaW4iLCJkMSIsImQyIiwiZDIkMCIsImQxJDAiLCJkMiQxIiwiZDEkMSIsInB2ZCIsImZ2ZCIsIm0xIiwibTIiLCJiaW5kaW5nc19hdXgiLCJiaW5kaW5ncyIsImNsZWFyIiwicHVzaCIsInBvcCIsInBvcF9vcHQiLCJ0b3AiLCJ0b3Bfb3B0IiwiY2VsbCIsIm1hdGNoIiwicGVlayIsImNvbnRlbnQiLCJwZWVrX29wdCIsInRha2Vfb3B0IiwiY2VsbCQwIiwicV9yZXMiLCJwcmV2IiwicHJldiQwIiwidHJhbnNmZXIiLCJxMSIsInEyIiwiY29udGVudHMiLCJidWZmZXIiLCJyZXNldCIsImlubmVyIiwicmVzaXplIiwibW9yZSIsIm9sZF9wb3MiLCJvbGRfbGVuIiwibmV3X2J1ZmZlciIsImFkZF9jaGFyIiwidWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4IiwidWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCIsImFkZF91dGZfOF91Y2hhciIsImFkZF91dGZfMTZiZV91Y2hhciIsImFkZF91dGZfMTZsZV91Y2hhciIsImFkZF9zdWJzdHJpbmciLCJvZmZzZXQiLCJuZXdfcG9zaXRpb24iLCJhZGRfc3ViYnl0ZXMiLCJhZGRfc3RyaW5nIiwiYWRkX2J5dGVzIiwiYWRkX2J1ZmZlciIsImJzIiwiYWRkX2NoYW5uZWwiLCJ0b19yZWFkJDEiLCJhbHJlYWR5X3JlYWQiLCJ0b19yZWFkIiwiYWxyZWFkeV9yZWFkJDAiLCJ0b19yZWFkJDAiLCJvdXRwdXRfYnVmZmVyIiwiYWRkX3N1YnN0aXR1dGUiLCJsaW0kMSIsInByZXZpb3VzIiwicHJldmlvdXMkMCIsInN0YXJ0JDAiLCJvcGVuaW5nIiwibGltJDAiLCJzdG9wJDAiLCJrJDIiLCJjbG9zaW5nIiwic3RvcCIsImskMCIsImskMSIsIm5leHRfaSIsImlkZW50IiwidHJ1bmNhdGUiLCJhZGRfaW50OCIsImFkZF9pbnQxNl9uZSIsImFkZF9pbnQzMl9uZSIsImFkZF9pbnQ2NF9uZSIsImFkZF9pbnQxNl9sZSIsImFkZF9pbnQxNl9iZSIsImFkZF9pbnQzMl9sZSIsImFkZF9pbnQzMl9iZSIsImFkZF9pbnQ2NF9sZSIsImFkZF9pbnQ2NF9iZSIsInJlbGVhc2UiLCJhY3F1aXJlIiwidHJ5X2FjcXVpcmUiLCJyZXQiLCJnZXRfdmFsdWUiLCJtYWtlJDAiLCJyZWxlYXNlJDAiLCJhY3F1aXJlJDAiLCJ0cnlfYWNxdWlyZSQwIiwiY3B1X3JlbGF4IiwidW5pcXVlX3ZhbHVlIiwiY3JlYXRlX2RscyIsImtleV9jb3VudGVyIiwicGFyZW50X2tleXMiLCJuZXdfa2V5Iiwic3BsaXRfZnJvbV9wYXJlbnQiLCJpbml0X29ycGhhbiIsImlkeCIsImtpIiwibWF5YmVfZ3JvdyIsInN6IiwibmV3X3N6IiwibmV3X3N0IiwiZ2V0X2lkIiwiZG9tYWluIiwic2VsZiIsImlzX21haW5fZG9tYWluIiwiZmlyc3RfZG9tYWluX3NwYXduZWQiLCJmaXJzdF9zcGF3bl9mdW5jdGlvbiIsImJlZm9yZV9maXJzdF9zcGF3biIsIm9sZF9mIiwibmV3X2YiLCJhdF9leGl0X2tleSIsInNwYXduIiwicGsiLCJ0ZXJtX211dGV4IiwidGVybV9jb25kaXRpb24iLCJ0ZXJtX3N0YXRlIiwiYm9keSIsImV4JDAiLCJleCIsInJlY29tbWVuZGVkX2RvbWFpbl9jb3VudCIsInN1Yl9mb3JtYXQiLCJmb3JtYXR0aW5nX2xpdCIsImNyZWF0ZV9jaGFyX3NldCIsImFkZF9pbl9jaGFyX3NldCIsInN0cl9pbmQiLCJtYXNrIiwiZnJlZXplX2NoYXJfc2V0IiwicmV2X2NoYXJfc2V0IiwiY2hhcl9zZXQkMCIsImlzX2luX2NoYXJfc2V0IiwicGFkX29mX3BhZF9vcHQiLCJwYWRfb3B0Iiwid2lkdGgiLCJwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQiLCJmbXQiLCJwYWRfb3B0JDAiLCJwYWRfb3B0JDEiLCJwYWRfb3B0JDIiLCJwYWRfb3B0JDMiLCJwYWRfb3B0JDQiLCJwcmVjX29wdCIsInBhZF9vcHQkNSIsIm5kZWMiLCJwYWRfb3B0JDYiLCJwYWRfb3B0JDciLCJwYWRfb3B0JDgiLCJkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiIsImJ1ZmZlcl9jcmVhdGUiLCJpbml0X3NpemUiLCJidWZmZXJfY2hlY2tfc2l6ZSIsIm92ZXJoZWFkIiwibWluX2xlbiIsIm5ld19zdHIiLCJidWZmZXJfYWRkX2NoYXIiLCJidWZmZXJfYWRkX3N0cmluZyIsInN0cl9sZW4iLCJidWZmZXJfY29udGVudHMiLCJjaGFyX29mX2ljb252IiwiY2hhcl9vZl9mY29udiIsImNGIiwiYnByaW50X3BhZHR5IiwicGFkdHkiLCJicHJpbnRfaWdub3JlZF9mbGFnIiwiaWduX2ZsYWciLCJicHJpbnRfcGFkX29wdCIsImJwcmludF9wYWRkaW5nIiwicGFkdHkkMCIsImJwcmludF9wcmVjaXNpb24iLCJicHJpbnRfaWNvbnZfZmxhZyIsImJwcmludF9hbHRpbnRfZm10IiwiYnByaW50X2Zjb252X2ZsYWciLCJzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQiLCJzdHIkMCIsImJwcmludF9jaGFyX2xpdGVyYWwiLCJicHJpbnRfc3RyaW5nX2xpdGVyYWwiLCJicHJpbnRfZm10dHkiLCJmbXR0eSQxIiwiZm10dHkkMiIsImZtdHR5JDMiLCJmbXR0eSQ0IiwiZm10dHkkNSIsImZtdHR5JDYiLCJmbXR0eSQ3IiwiZm10dHkkOCIsImZtdHR5JDkiLCJzdWJfZm10dHkiLCJmbXR0eSQxMCIsInN1Yl9mbXR0eSQwIiwiZm10dHkkMTEiLCJmbXR0eSQxMiIsImZtdHR5JDEzIiwiZm10dHkkMTQiLCJmbXR0eSQxNSIsImludF9vZl9jdXN0b21fYXJpdHkiLCJzdHJpbmdfb2ZfZm10IiwiZm10aXRlciIsImZtdCQwIiwiaWduX2ZsYWckMCIsInN0ciQxIiwiaXNfYWxvbmUkMCIsImlzX2Fsb25lIiwiYWZ0ZXIiLCJiZWZvcmUiLCJqJDEiLCJmbXQkMSIsInN5bW0iLCJmbXR0eV9yZWxfZGV0IiwiZGUiLCJlZCIsImFmIiwiZmEiLCJkZSQwIiwiZWQkMCIsImFmJDAiLCJmYSQwIiwiZGUkMSIsImVkJDEiLCJhZiQxIiwiZmEkMSIsImRlJDIiLCJlZCQyIiwiYWYkMiIsImZhJDIiLCJkZSQzIiwiZWQkMyIsImFmJDMiLCJmYSQzIiwiZGUkNCIsImVkJDQiLCJhZiQ0IiwiZmEkNCIsImRlJDUiLCJlZCQ1IiwiYWYkNSIsImZhJDUiLCJkZSQ2IiwiZWQkNiIsImFmJDYiLCJmYSQ2IiwiZGUkNyIsImVkJDciLCJhZiQ3IiwiZmEkNyIsImRlJDgiLCJlZCQ4IiwiYWYkOCIsImZhJDgiLCJ0cmFucyIsImpkIiwiZGoiLCJnYSIsImFnIiwiZGUkOSIsImVkJDkiLCJhZiQ5IiwiZmEkOSIsImRlJDEwIiwiZWQkMTAiLCJhZiQxMCIsImZhJDEwIiwiZGUkMTEiLCJlZCQxMSIsImFmJDExIiwiZmEkMTEiLCJkZSQxMiIsImVkJDEyIiwiYWYkMTIiLCJmYSQxMiIsImRlJDEzIiwiZWQkMTMiLCJhZiQxMyIsImZhJDEzIiwicmVzdDEiLCJyZXN0MiIsInJlc3QxJDAiLCJyZXN0MiQwIiwicmVzdDEkMSIsInJlc3QyJDEiLCJyZXN0MSQyIiwicmVzdDIkMiIsInJlc3QxJDMiLCJyZXN0MiQzIiwicmVzdDEkNCIsInJlc3QyJDQiLCJyZXN0MSQ1IiwicmVzdDIkNSIsInJlc3QxJDYiLCJyZXN0MiQ2IiwicmVzdDEkNyIsInR5MSQwIiwicmVzdDIkNyIsInR5MiQwIiwicmVzdDEkOCIsInR5MTIiLCJ0eTExIiwicmVzdDIkOCIsInR5MjIiLCJ0eTIxIiwiZjQiLCJmMiIsInJlc3QxJDkiLCJyZXN0MiQ5IiwicmVzdDEkMTAiLCJyZXN0MiQxMCIsInJlc3QxJDExIiwicmVzdDIkMTEiLCJyZXN0MSQxMiIsInJlc3QyJDEyIiwicmVzdDEkMTMiLCJyZXN0MiQxMyIsImZtdHR5X29mX3BhZGRpbmdfZm10dHkiLCJmbXR0eV9vZl9jdXN0b20iLCJhcml0eSQwIiwiZm10dHlfb2ZfZm10IiwidHlfcmVzdCIsInByZWNfdHkiLCJmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkiLCJ0eV9yZXN0JDAiLCJwcmVjX3R5JDAiLCJ0eV9yZXN0JDEiLCJwcmVjX3R5JDEiLCJ0eV9yZXN0JDIiLCJwcmVjX3R5JDIiLCJ0eV9yZXN0JDMiLCJwcmVjX3R5JDMiLCJ0eSQwIiwiZm9ybWF0dGluZ19nZW4iLCJ0eXBlX3BhZGRpbmciLCJ3IiwidHlwZV9wYWRwcmVjIiwidHlwZV9mb3JtYXQiLCJ0eXBlX2Zvcm1hdF9nZW4iLCJ0eXBlX2lnbm9yZWRfcGFyYW1fb25lIiwiZm10dHkwIiwiZm10dHlfcmVzdCIsImZtdF9yZXN0IiwiZm10dHlfcmVzdCQwIiwiZm10X3Jlc3QkMCIsImZtdF9yZXN0JDEiLCJmbXR0eV9yZXN0JDEiLCJmbXQkMiIsImZtdF9yZXN0JDIiLCJmbXR0eV9yZXN0JDIiLCJmbXQkMyIsImZtdF9yZXN0JDMiLCJmbXR0eV9yZXN0JDMiLCJmbXQkNCIsImZtdF9yZXN0JDQiLCJmbXR0eV9yZXN0JDQiLCJmbXQkNSIsImZtdF9yZXN0JDUiLCJmbXR0eV9yZXN0JDUiLCJwcmVjJDQiLCJmbXQkNiIsImZtdF9yZXN0JDYiLCJwcmVjJDUiLCJwYWQkOSIsInBhZCQxMCIsImZtdHR5X3Jlc3QkNiIsInByZWMkNiIsImZtdCQ3IiwiZm10X3Jlc3QkNyIsInByZWMkNyIsInBhZCQxMSIsInBhZCQxMiIsImZtdHR5X3Jlc3QkNyIsInByZWMkOCIsImZtdCQ4IiwiZm10X3Jlc3QkOCIsInBhZCQxMyIsInBhZCQxNCIsImZtdHR5X3Jlc3QkOCIsImZtdCQ5IiwiZm10X3Jlc3QkOSIsImZtdCQxMCIsImZtdF9yZXN0JDEwIiwiZm10JDExIiwiZm10X3Jlc3QkMTEiLCJmbXQkMTIiLCJmbXR0eV9yZXN0JDkiLCJmbXRfcmVzdCQxMiIsImZtdCQxMyIsImZtdHR5X3Jlc3QkMTAiLCJzdWJfZm10dHkxIiwiZm10X3Jlc3QkMTMiLCJzdWJfZm10dHkkMSIsImZtdCQxNCIsImZtdHR5X3Jlc3QkMTEiLCJmbXRfcmVzdCQxNCIsImZtdCQxNSIsImZtdHR5X3Jlc3QkMTIiLCJmbXRfcmVzdCQxNSIsImZtdCQxNiIsImZtdF9yZXN0JDE2IiwiZm10dHkkMTYiLCJmbXQkMTciLCJmbXRfcmVzdCQxNyIsImZtdHR5MyIsImZtdDMiLCJmbXQxJDAiLCJmbXR0eTIkMCIsImZtdDIkMCIsImZtdHR5MyQwIiwiZm10MyQwIiwiZm10dHlfcmVzdCQxMyIsImZtdF9yZXN0JDE4IiwiZm10dHkkMTciLCJmbXQkMTgiLCJmbXR0eV9yZXN0JDE0IiwiZm10X3Jlc3QkMTkiLCJmbXR0eSQxOCIsImZtdCQxOSIsImZtdHR5X3Jlc3QkMTUiLCJmbXRfcmVzdCQyMCIsImZtdHR5JDE5IiwiZm10JDIwIiwic3ViX2ZtdHR5JDIiLCJzdWJfZm10dHkkMyIsInR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aSIsImZtdHR5JDIxIiwiZm10JDIyIiwic3ViX2ZtdHR5JDQiLCJmbXR0eV9yZXN0JDE2IiwiZm10dHkkMjAiLCJmbXQkMjEiLCJzdWJfZm10dHlfcmVzdCIsInN1Yl9mbXR0eV9yZXN0JDAiLCJzdWJfZm10dHlfcmVzdCQxIiwic3ViX2ZtdHR5X3Jlc3QkMiIsInN1Yl9mbXR0eV9yZXN0JDMiLCJzdWJfZm10dHlfcmVzdCQ0Iiwic3ViX2ZtdHR5X3Jlc3QkNSIsInN1Yl9mbXR0eV9yZXN0JDYiLCJzdWJfZm10dHlfcmVzdCQ3Iiwic3ViX2ZtdHR5X3Jlc3QkOCIsInN1Yl9mbXR0eV9yZXN0JDkiLCJzdWJfZm10dHlfcmVzdCQxMCIsInN1Yl9mbXR0eV9yZXN0JDExIiwic3ViX2ZtdHR5X3Jlc3QkMTIiLCJzdWJfZm10dHlfcmVzdCQxMyIsInN1Yl9mbXR0eV9yZXN0JDE0Iiwic3ViMl9mbXR0eSIsInN1Yl9mbXR0eV9yZXN0JDE1Iiwic3ViMl9mbXR0eSQwIiwic3ViX2ZtdHR5X3Jlc3QkMTYiLCJzdWIyX2ZtdHR5JDEiLCJzdWIxX2ZtdHR5Iiwic3ViX2ZtdHR5X3Jlc3QkMTciLCJzdWIyX2ZtdHR5JDIiLCJzdWIxX2ZtdHR5JDAiLCJzdWJfZm10dHlfcmVzdCQxOCIsInN1Yl9mbXR0eV9yZXN0JDE5Iiwic3ViX2ZtdHR5X3Jlc3QkMjAiLCJzdWJfZm10dHlfcmVzdCQyMSIsInN1Yl9mbXR0eV9yZXN0JDIyIiwic3ViX2ZtdHR5X3Jlc3QkMjMiLCJzdWJfZm10dHlfcmVzdCQyNCIsInN1Yl9mbXR0eV9yZXN0JDI1Iiwic3ViX2ZtdHR5X3Jlc3QkMjYiLCJyZWNhc3QiLCJmaXhfcGFkZGluZyIsIndpZHRoJDAiLCJmaXhfaW50X3ByZWNpc2lvbiIsInJlcyQxIiwic3RyaW5nX3RvX2NhbWxfc3RyaW5nIiwiZm9ybWF0X29mX2Zjb252Iiwic3ltYiIsInRyYW5zZm9ybV9pbnRfYWx0IiwiZGlnaXRzIiwicHV0IiwiY29udmVydF9pbnQiLCJjb252ZXJ0X2ludDMyIiwiY29udmVydF9uYXRpdmVpbnQiLCJjb252ZXJ0X2ludDY0IiwiY29udmVydF9mbG9hdCIsImhleCIsInNpZ24iLCJjYW1sX3NwZWNpYWxfdmFsIiwic3RyaW5nX29mX2ZtdHR5IiwibWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24iLCJtYWtlX3ByaW50ZiIsInAkMCIsInAkMSIsIm1ha2VfcGFkZGluZyIsIm5ld19hY2MiLCJtYWtlX3ByaW50ZiQwIiwiYWNjJDMiLCJhY2MkNCIsImskMyIsImthY2MiLCJrJDQiLCJtYWtlX2lnbm9yZWRfcGFyYW0kMCIsIm1ha2VfY3VzdG9tJDAiLCJtYWtlX2ludmFsaWRfYXJnIiwibWFrZV9mcm9tX2ZtdHR5JDAiLCJtYWtlX2Zyb21fZm10dHkiLCJtYWtlX2N1c3RvbSIsIm1ha2VfaWdub3JlZF9wYXJhbSIsImZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIiwibWFrZV9pcHJpbnRmIiwibWFrZV9pcHJpbnRmJDAiLCJrb2MiLCJyZXN0JDI0IiwicmVzdCQyNSIsInJlc3QkMjYiLCJyZXN0JDI3IiwicmVzdCQyOCIsInJlc3QkMjkiLCJmbl9vZl9jdXN0b21fYXJpdHkkMCIsImZuX29mX2N1c3RvbV9hcml0eSIsIm91dHB1dF9hY2MiLCJwJDMiLCJwJDQiLCJwJDUiLCJwJDIiLCJidWZwdXRfYWNjIiwic3RycHV0X2FjYyIsImZhaWx3aXRoX21lc3NhZ2UiLCJvcGVuX2JveF9vZl9zdHJpbmciLCJpbnZhbGlkX2JveCIsInBhcnNlX3NwYWNlcyIsIndzdGFydCIsIndlbmQiLCJib3hfbmFtZSIsIm5zdGFydCIsIm5lbmQiLCJpbmRlbnQiLCJleHBfZW5kIiwiYm94X3R5cGUiLCJtYWtlX3BhZGRpbmdfZm10X2ViYiIsIm1ha2VfcGFkcHJlY19mbXRfZWJiIiwiZm10X2ViYl9vZl9zdHJpbmciLCJsZWdhY3lfYmVoYXZpb3IiLCJmbGFnIiwibGVnYWN5X2JlaGF2aW9yJDAiLCJpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIiwidW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IiwiZW5kX2luZCIsImludmFsaWRfZm9ybWF0X3dpdGhvdXQiLCJleHBlY3RlZF9jaGFyYWN0ZXIiLCJleHBlY3RlZCIsImFkZF9saXRlcmFsIiwibGl0X3N0YXJ0IiwicGFyc2UiLCJzdHJfaW5kJDIiLCJwYXJzZV9mbGFncyIsInN0cl9pbmQkMSIsInN0cl9pbmQkMCIsInBhcnNlX3RhZyIsInN0cl9pbmQkMyIsInN0cl9pbmRfMSIsInBhcnNlX2ludGVnZXIiLCJzdHJfaW5kXzIiLCJzdHJfaW5kXzMiLCJmb3JtYXR0aW5nX2xpdCQwIiwibmV4dF9pbmQiLCJzdHJfaW5kXzQiLCJzdHJfaW5kXzUiLCJzdHJfaW5kJDQiLCJzdHJfaW5kXzEkMCIsInN0cl9pbmRfMiQwIiwic3RyX2luZF8zJDAiLCJzJDEiLCJmb3JtYXR0aW5nX2xpdCQxIiwibmV4dF9pbmQkMCIsInBhcnNlX2NvbnZlcnNpb24iLCJwY3RfaW5kIiwicGx1cyIsInNwYWNlIiwicGFkcHJlYyIsInBsdXNfdXNlZCIsImhhc2hfdXNlZCIsInNwYWNlX3VzZWQiLCJpZ25fdXNlZCIsInBhZF91c2VkIiwicHJlY191c2VkIiwiZ2V0X3BsdXMiLCJnZXRfaGFzaCIsImdldF9zcGFjZSIsImdldF9pZ24iLCJnZXRfcGFkIiwiZ2V0X3ByZWMiLCJnZXRfcGFkcHJlYyIsImdldF9pbnRfcGFkIiwiaW5jb21wYXRpYmxlX2ZsYWciLCJjaGVja19ub18wIiwib3B0X29mX3BhZCIsIndpZHRoJDEiLCJnZXRfcGFkX29wdCIsImdldF9wYWRwcmVjX29wdCIsImZtdF9yZXN1bHQiLCJzdWJfZW5kIiwic2VhcmNoX3N1YmZvcm1hdF9lbmQiLCJzdWJfZm10IiwiaWdub3JlZCQyIiwiY291bnRlciQwIiwiaWdub3JlZCQ2IiwiaWdub3JlZCQ3IiwiYWRkX3JhbmdlIiwiZmFpbF9zaW5nbGVfcGVyY2VudCIsInBhcnNlX2NoYXJfc2V0X2NvbnRlbnQiLCJwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyJDAiLCJwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIiwicmV2ZXJzZSIsImNoYXJfc2V0JDEiLCJpZ25vcmVkJDkiLCJjaGFyX2Zvcm1hdCIsImZtdF9yZXN0JDIxIiwiZm10X3Jlc3QkMjIiLCJmbXRfcmVzdCQyMyIsImlnbm9yZWQkMTAiLCJmbXRfcmVzdCQyNCIsImZtdF9yZXN0JDI1Iiwic3ViX2VuZCQwIiwic3ViX2ZtdCQwIiwiZm10X3Jlc3QkMjYiLCJpZ25vcmVkJDExIiwiaWdub3JlZCQzIiwic3ltYiQwIiwiaWdub3JlZCQ1IiwiY29tcHV0ZV9pbnRfY29udiIsImlnbm9yZWQkOCIsInNwYWNlJDEiLCJoYXNoJDEiLCJwbHVzJDIiLCJraW5kIiwiaWdub3JlZCQ0IiwiaWdub3JlZCIsImlnbm9yZWQkMCIsImlnbm9yZWQkMSIsInBsdXMkMCIsImhhc2gkMCIsInNwYWNlJDAiLCJwbHVzJDEiLCJpZ24kMCIsInBhcnNlX2FmdGVyX3ByZWNpc2lvbiIsIm1pbnVzIiwicGFyc2VfY29udiIsInBhcnNlX2FmdGVyX3BhZGRpbmciLCJwYXJzZV9saXRlcmFsIiwicGFyc2VfcG9zaXRpdmUiLCJuZXdfaW5kIiwibWludXMkMCIsInNldF9mbGFnIiwic3RyX2luZCQ1IiwiemVybyQwIiwiaXNfb3Blbl90YWciLCJpbmQiLCJzdWJfc3RyIiwic3ViX2Zvcm1hdCQwIiwiZm9ybWF0dGluZyQwIiwiZm9ybWF0dGluZyIsInN0cl9pbmQkNyIsInN1Yl9lbmQkMSIsInN1Yl9lbmQkMiIsInN0cl9pbmQkNiIsIm9wdGlvbiIsInN1YmZtdCIsImZvcm1hdF9vZl9zdHJpbmdfZm10dHkiLCJmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCIsImtmcHJpbnRmIiwia2JwcmludGYiLCJpa2ZwcmludGYiLCJmcHJpbnRmIiwiYnByaW50ZiIsImlmcHJpbnRmIiwiaWJwcmludGYiLCJwcmludGYiLCJlcHJpbnRmIiwia3NwcmludGYiLCJzcHJpbnRmIiwiYXNzb2MzIiwieTIiLCJ5MSIsIm1ha2Vfc3ltbGlzdCIsImhlbHBfYWN0aW9uIiwiYWRkX2hlbHAiLCJzcGVjbGlzdCIsImFkZDEiLCJhZGQyIiwidXNhZ2VfYiIsImVycm1zZyIsImRvYyIsInNwZWMiLCJrZXkiLCJ1c2FnZV9zdHJpbmciLCJ1c2FnZSIsImN1cnJlbnQiLCJwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY18iLCJhbGxvd19leHBhbmQiLCJhcmd2IiwiYW5vbmZ1biIsImluaXRwb3MiLCJjb252ZXJ0X2Vycm9yIiwicHJvZ25hbWUiLCJmb2xsb3ckMCIsImtleXdvcmQiLCJub19hcmckMCIsImZvbGxvdyIsIm5vX2FyZyIsImdldF9hcmckMCIsImdldF9hcmciLCJjb25zdW1lX2FyZyQwIiwiY29uc3VtZV9hcmciLCJ0cmVhdF9hY3Rpb24kMCIsInRyZWF0X2FjdGlvbiIsImYkMCIsImYkMSIsInIkMSIsImYkMiIsImFyZyQxIiwiciQyIiwiYXJnJDIiLCJmJDMiLCJhcmckMyIsIngkMSIsInIkMyIsImFyZyQ0IiwieCQyIiwic3BlY3MiLCJmJDQiLCJhcmckNSIsImYkNSIsImYkNiIsImYkNyIsImFyZyQ2IiwibmV3YXJnIiwicGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWMiLCJwYXJzZV9hcmd2X2R5bmFtaWMiLCJjdXJyZW50JDAiLCJwYXJzZV9hcmd2IiwibXNnJDAiLCJtc2ckMSIsInBhcnNlX2R5bmFtaWMiLCJwYXJzZV9leHBhbmQiLCJzZWNvbmRfd29yZCIsImxvb3AiLCJtYXhfYXJnX2xlbiIsImN1ciIsImt3ZCIsInJlcGxhY2VfbGVhZGluZ190YWIiLCJzZWVuIiwiYWxpZ24iLCJsaW1pdCIsImNvbXBsZXRlZCIsImtzZCIsImN1dGNvbCQwIiwic3BhY2VzJDAiLCJzcGVjJDAiLCJjdXRjb2wiLCJrd2RfbGVuIiwic3BhY2VzIiwicmVhZF9hdXgiLCJmaWxlIiwid29yZHMiLCJzdGFzaCIsIndvcmQiLCJ3b3JkJDAiLCJyZWFkX2FyZyIsInJlYWRfYXJnMCIsIndyaXRlX2F1eCIsImFyZ3MiLCJ3cml0ZV9hcmciLCJ3cml0ZV9hcmcwIiwibG9jZm10IiwicHJpbnRlcnMiLCJmaWVsZCIsIm90aGVyX2ZpZWxkcyIsInVzZV9wcmludGVycyIsInN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0byIsImNvbnN0cnVjdG9yIiwiZmllbGRzX29wdCIsImNvbnN0cnVjdG9yJDAiLCJ0b19zdHJpbmdfZGVmYXVsdCIsImNoYXIkMCIsImxpbmUiLCJjaGFyJDEiLCJsaW5lJDAiLCJmaWxlJDAiLCJjaGFyJDIiLCJsaW5lJDEiLCJmaWxlJDEiLCJwcmludCIsImZjdCIsImNhdGNoJDAiLCJyYXdfYmFja3RyYWNlX2VudHJpZXMiLCJidCIsImNvbnZlcnRfcmF3X2JhY2t0cmFjZSIsImZvcm1hdF9iYWNrdHJhY2Vfc2xvdCIsImlzX3JhaXNlIiwicHJpbnRfcmF3X2JhY2t0cmFjZSIsIm91dGNoYW4iLCJyYXdfYmFja3RyYWNlIiwiYmFja3RyYWNlIiwicHJpbnRfYmFja3RyYWNlIiwicmF3X2JhY2t0cmFjZV90b19zdHJpbmciLCJiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZSIsInBhcmFtIiwiYmFja3RyYWNlX3Nsb3RfaXNfaW5saW5lIiwiYmFja3RyYWNlX3Nsb3RfbG9jYXRpb24iLCJiYWNrdHJhY2Vfc2xvdF9kZWZuYW1lIiwiYmFja3RyYWNlX3Nsb3RzIiwiYmFja3RyYWNlX3Nsb3RzX29mX3Jhd19lbnRyeSIsImVudHJ5IiwicmF3X2JhY2t0cmFjZV9sZW5ndGgiLCJnZXRfYmFja3RyYWNlIiwicmVnaXN0ZXJfcHJpbnRlciIsImZuIiwib2xkX3ByaW50ZXJzIiwibmV3X3ByaW50ZXJzIiwiZXhuX3Nsb3QiLCJleG5fc2xvdF9pZCIsImV4bl9zbG90X25hbWUiLCJlcnJvcnMiLCJkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW4iLCJzdGF0dXMiLCJ1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsInNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciIsImVtcHR5X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9leGNlcHRpb24iLCJkZWJ1Z2dlcl9pbl91c2UiLCJleG4kMSIsInJhd19iYWNrdHJhY2UkMCIsImNvbnN0JDAiLCJmbGlwIiwibmVnYXRlIiwicHJvdGVjdCIsImZpbmFsbHkkMCIsIndvcmsiLCJmaW5hbGx5X25vX2V4biIsIndvcmtfZXhuJDAiLCJ3b3JrX2V4biIsIndvcmtfYnQiLCJldmVudGxvZ19wYXVzZSIsImV2ZW50bG9nX3Jlc3VtZSIsInByaW50X3N0YXQiLCJhbGxvY2F0ZWRfYnl0ZXMiLCJtYSIsInBybyIsIm1pIiwiY3JlYXRlX2FsYXJtIiwiZGVsZXRlX2FsYXJtIiwibnVsbF90cmFja2VyIiwic2FtcGxpbmdfcmF0ZSIsInRyYWNrZXIiLCJjYWxsc3RhY2tfc2l6ZSIsInN0cmluZyIsImJ5dGVzIiwic3Vic3RyaW5nIiwic3ViYnl0ZXMiLCJmaWxlbmFtZSIsImRpZ2VzdCIsImNoYXJfaGV4IiwidG9faGV4IiwiZnJvbV9oZXgiLCJkaWdpdCIsImZsb2F0MzIiLCJmbG9hdDY0IiwiaW50OF9zaWduZWQiLCJpbnQ4X3Vuc2lnbmVkIiwiaW50MTZfc2lnbmVkIiwiaW50MTZfdW5zaWduZWQiLCJpbnQzMiIsImludDY0IiwiaW50JDAiLCJuYXRpdmVpbnQiLCJjb21wbGV4MzIiLCJjb21wbGV4NjQiLCJraW5kX3NpemVfaW5fYnl0ZXMiLCJjX2xheW91dCIsImZvcnRyYW5fbGF5b3V0IiwiY2xvb3AiLCJhcnIiLCJjb2wiLCJmbG9vcCIsImxheW91dCIsImRpbXMiLCJkbGVuIiwic2l6ZV9pbl9ieXRlcyIsInNpemVfaW5fYnl0ZXMkMCIsIm9mX3ZhbHVlIiwiY3JlYXRlJDAiLCJkaW0iLCJzaXplX2luX2J5dGVzJDEiLCJzbGljZSIsImluaXQkMCIsIm9mX2FycmF5IiwiYmEiLCJjcmVhdGUkMSIsImRpbTEiLCJkaW0yIiwic2l6ZV9pbl9ieXRlcyQyIiwic2xpY2VfbGVmdCIsInNsaWNlX3JpZ2h0IiwiaW5pdCQxIiwib2ZfYXJyYXkkMCIsInJvdyIsImNyZWF0ZSQyIiwiZGltMyIsInNpemVfaW5fYnl0ZXMkMyIsInNsaWNlX2xlZnRfMSIsInNsaWNlX3JpZ2h0XzEiLCJzbGljZV9sZWZ0XzIiLCJzbGljZV9yaWdodF8yIiwiaW5pdCQyIiwib2ZfYXJyYXkkMSIsImFycmF5MF9vZl9nZW5hcnJheSIsImFycmF5MV9vZl9nZW5hcnJheSIsImFycmF5Ml9vZl9nZW5hcnJheSIsImFycmF5M19vZl9nZW5hcnJheSIsInJlc2hhcGVfMCIsInJlc2hhcGVfMSIsInJlc2hhcGVfMiIsInJlc2hhcGVfMyIsImkzIiwiaTQiLCJpMyQwIiwiaTQkMCIsIm1rIiwicmVpbml0Iiwic2VlZCIsIm1ha2Vfc2VsZl9pbml0IiwiYml0cyIsImludGF1eCIsImJvdW5kIiwiZnVsbF9pbnQiLCJiaXRzMzIiLCJiaXRzNjQiLCJuYXRpdmViaXRzIiwiZmxvYXQkMCIsImJvb2wiLCJta19kZWZhdWx0IiwicmFuZG9tX2tleSIsImJpdHMkMCIsImludCQxIiwiZnVsbF9pbnQkMCIsImludDMyJDAiLCJuYXRpdmVpbnQkMCIsImludDY0JDAiLCJmbG9hdCQxIiwic2NhbGUiLCJib29sJDAiLCJiaXRzMzIkMCIsImJpdHM2NCQwIiwibmF0aXZlYml0cyQwIiwiZnVsbF9pbml0Iiwic2VsZl9pbml0Iiwic3BsaXQkMCIsImdldF9zdGF0ZSIsInNldF9zdGF0ZSIsIm9uZ29pbmdfdHJhdmVyc2FsIiwiZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCIsInBhcmFtcyIsInJhbmRvbWl6ZWRfZGVmYXVsdCIsInJhbmRvbWl6ZWQiLCJyYW5kb21pemUiLCJpc19yYW5kb21pemVkIiwicHJuZ19rZXkiLCJwb3dlcl8yX2Fib3ZlIiwiaW5pdGlhbF9zaXplIiwicmFuZG9tIiwiY29weV9idWNrZXRsaXN0Iiwia2V5JDAiLCJuZXh0JDAiLCJpbnNlcnRfYWxsX2J1Y2tldHMiLCJpbmRleGZ1biIsImlucGxhY2UiLCJvZGF0YSIsIm5kYXRhIiwibnNpemUiLCJuZGF0YV90YWlsIiwibmlkeCIsIm1hdGNoJDAiLCJvc2l6ZSIsIm9sZF90cmF2IiwiZmlsdGVyX21hcF9pbnBsYWNlIiwiYnVja2V0X2xlbmd0aCIsInN0YXRzIiwibWJsIiwiaGlzdG8iLCJ0YmxfZGF0YSIsImJ1Y2siLCJidWNrJDAiLCJidWNrJDEiLCJ0b19zZXFfa2V5cyIsInRvX3NlcV92YWx1ZXMiLCJrZXlfaW5kZXgiLCJidWNrZXQiLCJrMSIsIm5leHQxIiwiazIiLCJuZXh0MiIsImszIiwiZDMiLCJuZXh0MyIsImZpbmRfaW5fYnVja2V0IiwicmVwbGFjZSIsInJlcGxhY2Vfc2VxIiwic2VlZGVkX2hhc2giLCJoYXNoX3BhcmFtIiwicmVidWlsZCIsImdldF9jb3B5IiwiYXIiLCJlbXB0eWJ1Y2tldCIsImdldF9pbmRleCIsInN6JDAiLCJzeiQxIiwiY291bnRfYnVja2V0IiwiY291bnQiLCJhZGRfYXV4Iiwic2V0dGVyIiwiYnVja2V0JDAiLCJoYXNoZXMiLCJuZXdzeiIsIm5ld2J1Y2tldCQwIiwibmV3aGFzaGVzIiwiaGJ1Y2tldCIsInByZXZfbGVuIiwibGl2ZSIsImokMiIsIm5ld2J1Y2tldCIsIm9sZGxlbiIsIm5ld3QiLCJvYiIsIm9pIiwib2giLCJzZXR0ZXIkMCIsIm5pIiwiZmluZF9vciIsImlmbm90Zm91bmQiLCJmaW5kX3NoYWRvdyIsImlmZm91bmQiLCJsZW5zIiwidG90bGVuIiwidW5rbm93biIsInBwX2VucXVldWUiLCJ0b2tlbiIsInBwX2luZmluaXR5IiwicHBfb3V0cHV0X3N0cmluZyIsInBwX291dHB1dF9uZXdsaW5lIiwiZm9ybWF0X3BwX3RleHQiLCJ0ZXh0IiwiZm9ybWF0X3N0cmluZyIsImJyZWFrX25ld19saW5lIiwicmVhbF9pbmRlbnQiLCJicmVha19saW5lIiwiYnJlYWtfc2FtZV9saW5lIiwiZm9ybWF0X3BwX3Rva2VuIiwic2l6ZSQwIiwidGFicyIsImFkZF90YWIiLCJscyIsInRhZ19uYW1lIiwibWFya2VyIiwiYnJlYWtzIiwiZml0cyIsIm9mZiIsImJveF90eXBlJDAiLCJvZmYkMCIsImluc2VydGlvbl9wb2ludCIsInRhYnMkMCIsImZpcnN0IiwiaGVhZCIsInRhYiIsIm9mZiQxIiwiaW5zZXJ0aW9uX3BvaW50JDAiLCJ3aWR0aCQyIiwiYm94X3R5cGUkMSIsInRib3giLCJ0YWdfbmFtZSQwIiwibWFya2VyJDAiLCJhZHZhbmNlX2xlZnQiLCJwZW5kaW5nX2NvdW50IiwiZW5xdWV1ZV9hZHZhbmNlIiwiZW5xdWV1ZV9zdHJpbmdfYXMiLCJpbml0aWFsaXplX3NjYW5fc3RhY2siLCJzdGFjayIsInF1ZXVlX2VsZW0iLCJzZXRfc2l6ZSIsImxlZnRfdG90YWwiLCJzY2FuX3B1c2giLCJlbGVtIiwicHBfb3Blbl9ib3hfZ2VuIiwiYnJfdHkiLCJwcF9jbG9zZV9ib3giLCJwcF9vcGVuX3N0YWciLCJwcF9jbG9zZV9zdGFnIiwicHBfc2V0X3ByaW50X3RhZ3MiLCJwcF9zZXRfbWFya190YWdzIiwicHBfZ2V0X3ByaW50X3RhZ3MiLCJwcF9nZXRfbWFya190YWdzIiwicHBfc2V0X3RhZ3MiLCJwcF9nZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb24iLCJwcF9zZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb24iLCJwY3QiLCJwb3QiLCJtY3QiLCJtb3QiLCJwcF9yaW5pdCIsInBwX2ZsdXNoX3F1ZXVlIiwicHBfcHJpbnRfYXNfc2l6ZSIsInBwX3ByaW50X2FzIiwiaXNpemUiLCJwcF9wcmludF9zdHJpbmciLCJwcF9wcmludF9ieXRlcyIsInBwX3ByaW50X2ludCIsInBwX3ByaW50X2Zsb2F0IiwicHBfcHJpbnRfYm9vbCIsInBwX3ByaW50X2NoYXIiLCJwcF9vcGVuX2hib3giLCJwcF9vcGVuX3Zib3giLCJwcF9vcGVuX2h2Ym94IiwicHBfb3Blbl9ob3Zib3giLCJwcF9vcGVuX2JveCIsInBwX3ByaW50X25ld2xpbmUiLCJwcF9wcmludF9mbHVzaCIsInBwX2ZvcmNlX25ld2xpbmUiLCJwcF9wcmludF9pZl9uZXdsaW5lIiwicHBfcHJpbnRfY3VzdG9tX2JyZWFrIiwicHBfcHJpbnRfYnJlYWsiLCJwcF9wcmludF9zcGFjZSIsInBwX3ByaW50X2N1dCIsInBwX29wZW5fdGJveCIsInBwX2Nsb3NlX3Rib3giLCJwcF9wcmludF90YnJlYWsiLCJwcF9wcmludF90YWIiLCJwcF9zZXRfdGFiIiwicHBfc2V0X21heF9ib3hlcyIsInBwX2dldF9tYXhfYm94ZXMiLCJwcF9vdmVyX21heF9ib3hlcyIsInBwX3NldF9lbGxpcHNpc190ZXh0IiwicHBfZ2V0X2VsbGlwc2lzX3RleHQiLCJwcF9saW1pdCIsInBwX3NldF9tYXhfaW5kZW50IiwicHBfZ2V0X21heF9pbmRlbnQiLCJwcF9zZXRfbWFyZ2luIiwibmV3X21heF9pbmRlbnQiLCJ2YWxpZGF0ZV9nZW9tZXRyeSIsIm1hcmdpbiIsIm1heF9pbmRlbnQiLCJjaGVja19nZW9tZXRyeSIsImdlb21ldHJ5IiwicHBfZ2V0X21hcmdpbiIsInBwX3NldF9mdWxsX2dlb21ldHJ5IiwicHBfc2V0X2dlb21ldHJ5IiwicHBfc2FmZV9zZXRfZ2VvbWV0cnkiLCJwcF9nZXRfZ2VvbWV0cnkiLCJwcF91cGRhdGVfZ2VvbWV0cnkiLCJwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMiLCJwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMiLCJwcF9zZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGkiLCJwcF9nZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGkiLCJkaXNwbGF5X25ld2xpbmUiLCJibGFua19saW5lIiwiZGlzcGxheV9ibGFua3MiLCJwcF9zZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIiwiZGVmYXVsdF9wcF9tYXJrX29wZW5fdGFnIiwiZGVmYXVsdF9wcF9tYXJrX2Nsb3NlX3RhZyIsImRlZmF1bHRfcHBfcHJpbnRfb3Blbl90YWciLCJkZWZhdWx0X3BwX3ByaW50X2Nsb3NlX3RhZyIsInBwX21ha2VfZm9ybWF0dGVyIiwicHBfcXVldWUiLCJzeXNfdG9rIiwic2Nhbl9zdGFjayIsImZvcm1hdHRlcl9vZl9vdXRfZnVuY3Rpb25zIiwib3V0X2Z1bnMiLCJtYWtlX2Zvcm1hdHRlciIsImZsdXNoIiwicHBmIiwiZm9ybWF0dGVyX29mX291dF9jaGFubmVsIiwiZm9ybWF0dGVyX29mX2J1ZmZlciIsInBwX2J1ZmZlcl9zaXplIiwicHBfbWFrZV9idWZmZXIiLCJzdGRidWYiLCJzdGRfZm9ybWF0dGVyIiwiZXJyX2Zvcm1hdHRlciIsInN0cl9mb3JtYXR0ZXIiLCJzdGRidWZfa2V5Iiwic3RyX2Zvcm1hdHRlcl9rZXkiLCJidWZmZXJlZF9vdXRfc3RyaW5nIiwiYnVmZmVyZWRfb3V0X2ZsdXNoIiwic3RkX2J1Zl9rZXkiLCJlcnJfYnVmX2tleSIsInN0ZF9mb3JtYXR0ZXJfa2V5IiwiZXJyX2Zvcm1hdHRlcl9rZXkiLCJnZXRfc3RkX2Zvcm1hdHRlciIsImdldF9lcnJfZm9ybWF0dGVyIiwiZ2V0X3N0cl9mb3JtYXR0ZXIiLCJnZXRfc3RkYnVmIiwiZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciIsImZsdXNoX3N0cl9mb3JtYXR0ZXIiLCJtYWtlX3N5bmNocm9uaXplZF9mb3JtYXR0ZXIiLCJvdXRwdXQkMCIsImZsdXNoJDAiLCJzeW5jaHJvbml6ZWRfZm9ybWF0dGVyX29mX291dF8iLCJtYWtlX3N5bWJvbGljX291dHB1dF9idWZmZXIiLCJjbGVhcl9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwic29iIiwiZ2V0X3N5bWJvbGljX291dHB1dF9idWZmZXIiLCJmbHVzaF9zeW1ib2xpY19vdXRwdXRfYnVmZmVyIiwiaXRlbXMiLCJhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0iLCJpdGVtIiwiZm9ybWF0dGVyX29mX3N5bWJvbGljX291dHB1dF9iIiwib3Blbl9oYm94Iiwib3Blbl92Ym94Iiwib3Blbl9odmJveCIsIm9wZW5faG92Ym94Iiwib3Blbl9ib3giLCJjbG9zZV9ib3giLCJvcGVuX3N0YWciLCJjbG9zZV9zdGFnIiwicHJpbnRfYXMiLCJwcmludF9ib29sIiwicHJpbnRfYnJlYWsiLCJwcmludF9jdXQiLCJwcmludF9zcGFjZSIsImZvcmNlX25ld2xpbmUiLCJwcmludF9mbHVzaCIsInByaW50X2lmX25ld2xpbmUiLCJvcGVuX3Rib3giLCJjbG9zZV90Ym94IiwicHJpbnRfdGJyZWFrIiwic2V0X3RhYiIsInByaW50X3RhYiIsInNldF9tYXJnaW4iLCJnZXRfbWFyZ2luIiwic2V0X21heF9pbmRlbnQiLCJnZXRfbWF4X2luZGVudCIsInNldF9nZW9tZXRyeSIsInNhZmVfc2V0X2dlb21ldHJ5IiwiZ2V0X2dlb21ldHJ5IiwidXBkYXRlX2dlb21ldHJ5Iiwic2V0X21heF9ib3hlcyIsImdldF9tYXhfYm94ZXMiLCJvdmVyX21heF9ib3hlcyIsInNldF9lbGxpcHNpc190ZXh0IiwiZ2V0X2VsbGlwc2lzX3RleHQiLCJzZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIiwic2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIiwic2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIiwiZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIiwic2V0X2Zvcm1hdHRlcl9zdGFnX2Z1bmN0aW9ucyIsImdldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMiLCJzZXRfcHJpbnRfdGFncyIsImdldF9wcmludF90YWdzIiwic2V0X21hcmtfdGFncyIsImdldF9tYXJrX3RhZ3MiLCJzZXRfdGFncyIsInBwX3ByaW50X2xpc3QiLCJwcF92Iiwib3B0JDAiLCJwcF9zZXAiLCJvcHQkMSIsInBwX3ByaW50X3NlcSIsInNlcSQxIiwic2VxJDIiLCJwcF9wcmludF90ZXh0IiwicHBfcHJpbnRfb3B0aW9uIiwicHBfcHJpbnRfcmVzdWx0IiwicHBfcHJpbnRfZWl0aGVyIiwiY29tcHV0ZV90YWciLCJ0YWdfYWNjIiwib3V0cHV0X2Zvcm1hdHRpbmdfbGl0IiwiYnR5IiwicCQ2IiwicCQ3Iiwic2l6ZSQxIiwicCQ4Iiwia2RwcmludGYiLCJkcHJpbnRmIiwia2FzcHJpbnRmIiwiYXNwcmludGYiLCJmbHVzaF9zdGFuZGFyZF9mb3JtYXR0ZXJzIiwiZnMiLCJmcyQwIiwibnVsbF9jaGFyIiwibmV4dF9jaGFyIiwiaWIiLCJwZWVrX2NoYXIiLCJjaGVja2VkX3BlZWtfY2hhciIsImVuZF9vZl9pbnB1dCIsImJlZ2lubmluZ19vZl9pbnB1dCIsIm5hbWVfb2ZfaW5wdXQiLCJjaGFyX2NvdW50IiwiaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIiLCJ0b2tlbl9zdHJpbmciLCJ0b2tlbl9idWZmZXIiLCJza2lwX2NoYXIiLCJpZ25vcmVfY2hhciIsInN0b3JlX2NoYXIiLCJkZWZhdWx0X3Rva2VuX2J1ZmZlcl9zaXplIiwiaW5hbWUiLCJzY2FuX2Nsb3NlX2F0X2VuZCIsInNjYW5fcmFpc2VfYXRfZW5kIiwiZnJvbV9pYyIsInNjYW5fY2xvc2VfaWMiLCJlb2YiLCJvcGVuX2luX2ZpbGUiLCJjbG9zZV9pbiIsImljJDAiLCJiYWRfaW5wdXQiLCJiYWRfaW5wdXRfZXNjYXBlIiwiYmFkX3Rva2VuX2xlbmd0aCIsIm1lc3NhZ2UiLCJiYWRfZmxvYXQiLCJiYWRfaGV4X2Zsb2F0IiwiY2hhcmFjdGVyX21pc21hdGNoIiwiY2kiLCJjaGVja190aGlzX2NoYXIiLCJjaGVja19jaGFyIiwidG9rZW5fY2hhciIsInRva2VuX2Jvb2wiLCJpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciIsInRva2VuX2ludF9saXRlcmFsIiwiY29udiIsInRva2VuX2Zsb2F0Iiwic2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIiLCJzY2FuX2RlY2ltYWxfZGlnaXRfcGx1cyIsInNjYW5fZGlnaXRfcGx1cyIsImJhc2lzIiwiZGlnaXRwIiwid2lkdGgkMyIsImlzX2JpbmFyeV9kaWdpdCIsInNjYW5fYmluYXJ5X2ludCIsImlzX29jdGFsX2RpZ2l0Iiwic2Nhbl9vY3RhbF9pbnQiLCJpc19oZXhhX2RpZ2l0Iiwic2Nhbl9oZXhhZGVjaW1hbF9pbnQiLCJzY2FuX3NpZ24iLCJzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWwiLCJzY2FuX2ludF9jb252ZXJzaW9uIiwic2Nhbl9mcmFjdGlvbmFsX3BhcnQiLCJzY2FuX2V4cG9uZW50X3BhcnQiLCJzY2FuX2Zsb2F0IiwicHJlY2lzaW9uIiwicHJlY2lzaW9uJDAiLCJjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyIsImxvd2VyY2FzZSIsInNjYW5faGV4X2Zsb2F0Iiwid2lkdGgkNCIsIndpZHRoJDUiLCJ3aWR0aCQ2Iiwid2lkdGgkMTAiLCJ3aWR0aCQ3Iiwid2lkdGgkOCIsIndpZHRoJDkiLCJzY2FuX2NhbWxfZmxvYXRfcmVzdCIsIndpZHRoX3ByZWNpc2lvbiIsImZyYWNfd2lkdGgiLCJzY2FuX2NhbWxfZmxvYXQiLCJzY2FuX3N0cmluZyIsInN0cCIsImhleGFkZWNpbWFsX3ZhbHVlX29mX2NoYXIiLCJjaGVja19uZXh0X2NoYXIiLCJjaGVja19uZXh0X2NoYXJfZm9yX2NoYXIiLCJjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyIsInNjYW5fYmFja3NsYXNoX2NoYXIiLCJjMCIsImdldF9kaWdpdCIsImdldF9kaWdpdCQwIiwiYzEkMCIsImMyJDAiLCJzY2FuX2NhbWxfc3RyaW5nIiwiZmluZF9zdG9wJDAiLCJza2lwX3NwYWNlcyIsImZpbmRfc3RvcCIsInNjYW5fY2hhcnNfaW5fY2hhcl9zZXQiLCJzY2FuX2luZGljIiwic2Nhbl9jaGFycyIsInNjYW5mX2JhZF9pbnB1dCIsIndpZHRoX29mX3BhZF9vcHQiLCJzdG9wcGVyX29mX2Zvcm1hdHRpbmdfbGl0IiwiZm10aW5nIiwidGFrZV9mb3JtYXRfcmVhZGVycyQwIiwidGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyQwIiwicmVhZGVyIiwibmV3X2siLCJyZWFkZXJzX3Jlc3QiLCJ0YWtlX2Zvcm1hdF9yZWFkZXJzIiwidGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyIsInBhZF9wcmVjX3NjYW5mIiwicmVhZGVycyIsIm1ha2Vfc2NhbmYiLCJzY2FuJDAiLCJzdHJfcmVzdCIsInNjYW4kMSIsInNjYW4kMiIsInNjYW4kMyIsInNjYW4kNCIsImNvbnYkMCIsInNjYW4kNSIsImNvbnYkMSIsInNjYW4kNiIsImNvbnYkMiIsInNjYW4kNyIsInNjYW4kOCIsImZtdGluZ19saXQkMCIsInN0cCQwIiwicyQyIiwic3RyX3Jlc3QkMCIsImFyZ19yZXN0Iiwia3NjYW5mX2dlbiIsImVmIiwiYXJncyQxIiwiZXhjJDAiLCJleGMiLCJhcmdzJDAiLCJrc2NhbmYiLCJrc2NhbmZfb3B0IiwiYnNjYW5mIiwiYnNjYW5mX29wdCIsImtzc2NhbmYiLCJzc2NhbmYiLCJzc2NhbmZfb3B0Iiwic2NhbmYiLCJzY2FuZl9vcHQiLCJic2NhbmZfZm9ybWF0IiwiZm9ybWF0Iiwic3NjYW5mX2Zvcm1hdCIsImZvcm1hdF9mcm9tX3N0cmluZyIsInVuZXNjYXBlZCIsInJlZ2lzdGVyIiwicmVnaXN0ZXJfZXhjZXB0aW9uIiwibyQwIiwiaW5pdGlhbF9vYmplY3Rfc2l6ZSIsImR1bW15X2l0ZW0iLCJwdWJsaWNfbWV0aG9kX2xhYmVsIiwidGFnIiwiY29tcGFyZSQwIiwiY29tcGFyZSQxIiwiZHVtbXlfdGFibGUiLCJ0YWJsZV9jb3VudCIsImR1bW15X21ldCIsImZpdF9zaXplIiwibmV3X3RhYmxlIiwicHViX2xhYmVscyIsIm1ldGhvZHMiLCJhcnJheSIsIm5ld19zaXplIiwib2xkX3NpemUiLCJuZXdfYnVjayIsIm1ldGhvZF9jb3VudCIsImluc3RfdmFyX2NvdW50IiwibmV3X21ldGhvZCIsInRhYmxlIiwiZ2V0X21ldGhvZF9sYWJlbCIsImxhYmVsIiwiZ2V0X21ldGhvZF9sYWJlbHMiLCJuYW1lcyIsInNldF9tZXRob2QiLCJlbGVtZW50IiwiZ2V0X21ldGhvZCIsIm5hcnJvdyIsInZhcnMiLCJ2aXJ0X21ldGhzIiwiY29uY3JfbWV0aHMiLCJ2YXJzJDAiLCJ2aXJ0X21ldGhzJDAiLCJjb25jcl9tZXRocyQwIiwidmlydF9tZXRoX2xhYnMiLCJjb25jcl9tZXRoX2xhYnMiLCJsYWIiLCJ0dmFycyIsImJ5X25hbWUiLCJieV9sYWJlbCIsIm1ldCIsImhtIiwid2lkZW4iLCJzYXZlZF92YXJzIiwic2F2ZWRfaGlkZGVuX21ldGhzIiwibmV3X3ZhcmlhYmxlIiwidG9fYXJyYXkiLCJuZXdfbWV0aG9kc192YXJpYWJsZXMiLCJtZXRocyIsInZhbHMiLCJtZXRocyQwIiwibm1ldGhzIiwibnZhbHMiLCJnZXRfdmFyaWFibGUiLCJnZXRfdmFyaWFibGVzIiwiYWRkX2luaXRpYWxpemVyIiwiY3JlYXRlX3RhYmxlIiwicHVibGljX21ldGhvZHMiLCJ0YWdzIiwiaW5pdF9jbGFzcyIsImluaGVyaXRzIiwiY2xhIiwic3VwZXIkMCIsIm5tIiwibWFrZV9jbGFzcyIsInB1Yl9tZXRocyIsImNsYXNzX2luaXQiLCJlbnZfaW5pdCIsIm1ha2VfY2xhc3Nfc3RvcmUiLCJpbml0X3RhYmxlIiwiZHVtbXlfY2xhc3MiLCJsb2MiLCJ1bmRlZiIsImNyZWF0ZV9vYmplY3QiLCJjcmVhdGVfb2JqZWN0X29wdCIsIm9ial8wIiwiaXRlcl9mIiwicnVuX2luaXRpYWxpemVycyIsImluaXRzIiwicnVuX2luaXRpYWxpemVyc19vcHQiLCJjcmVhdGVfb2JqZWN0X2FuZF9ydW5faW5pdGlhbGkiLCJnZXRfZGF0YSIsImJ1aWxkX3BhdGgiLCJrZXlzIiwibG9va3VwX3RhYmxlcyIsInJvb3QiLCJyb290X2RhdGEiLCJ0YWJsZXMkMCIsInRhYmxlcyQxIiwidGFibGVzX2RhdGEiLCJuZXdfY2FjaGUiLCJzZXRfbWV0aG9kcyIsImNsbyIsImNsbyQwIiwibiQyIiwibiQzIiwibiQ0IiwibiQ1IiwibiQ2IiwieCQzIiwibiQ3IiwieCQ0IiwibiQ4IiwibiQ5IiwieCQ1IiwiZiQ4IiwiZSQyIiwibiQxMCIsIngkNiIsImYkOSIsIm4kMTEiLCJ4JDciLCJuJDEyIiwieCQ4IiwibiQxMyIsIm4kMTQiLCJlJDMiLCJuJDE1IiwibSQxIiwibSQyIiwieCQ5IiwibSQzIiwibiQxNiIsIm0kNCIsImUkNCIsIm4kMTciLCJtJDUiLCJuJDE4IiwiaW5pdF9tb2RfYmxvY2siLCJjb21wcyQwIiwibW9kdSIsInNoYXBlIiwiZm4kMCIsImNvbXBzIiwiaW5pdF9tb2QiLCJ1cGRhdGVfbW9kX2Jsb2NrIiwiY2wiLCJ1cGRhdGVfbW9kIiwicHJuZyIsImhrZXkiLCJjbGVhbiIsImRvX2J1Y2tldCIsImluc2VydF9idWNrZXQiLCJjb250YWluZXIiLCJyZW1vdmVfYnVja2V0IiwiaGsiLCJidWNrZXRfbGVuZ3RoX2FsaXZlIiwic3RhdHNfYWxpdmUiLCJzZXRfZGF0YSIsImVwaCIsInF1ZXJ5Iiwic2V0X2tleV9kYXRhIiwidGVzdF9rZXkiLCJ0JDAiLCJnZXRfa2V5MSIsInNldF9rZXkxIiwiZ2V0X2tleTIiLCJzZXRfa2V5MiIsImdldF9kYXRhJDAiLCJzZXRfZGF0YSQwIiwibWFrZSQxIiwia2V5MSIsImtleTIiLCJxdWVyeSQwIiwiazIkMCIsImsxJDAiLCJlcXVhbCQwIiwic2VlZGVkX2hhc2gkMCIsIm1ha2UkMiIsImFkZCQwIiwidGVzdF9rZXlzIiwicmVtb3ZlJDAiLCJmaW5kJDAiLCJsZW5ndGgkMCIsImNsZWFyJDAiLCJsZW5ndGgkMSIsImdldF9rZXkkMCIsInNldF9rZXkkMCIsImdldF9kYXRhJDEiLCJzZXRfZGF0YSQxIiwibWFrZSQzIiwicXVlcnkkMSIsIm1ha2UkNCIsImFkZCQxIiwidGVzdF9rZXlzJDAiLCJyZW1vdmUkMSIsImZpbmQkMSIsImxlbmd0aCQyIiwiY2xlYXIkMSIsIm51bGwkMCIsImN1cnJlbnRfZGlyX25hbWUiLCJwYXJlbnRfZGlyX25hbWUiLCJkaXJfc2VwIiwicXVvdGVxdW90ZSIsIm51bGwkMSIsImN1cnJlbnRfZGlyX25hbWUkMCIsInBhcmVudF9kaXJfbmFtZSQwIiwiZGlyX3NlcCQwIiwibnVsbCQyIiwiY3VycmVudF9kaXJfbmFtZSQxIiwicGFyZW50X2Rpcl9uYW1lJDEiLCJkaXJfc2VwJDEiLCJnZW5lcmljX2Jhc2VuYW1lIiwiaXNfZGlyX3NlcCIsImdlbmVyaWNfZGlybmFtZSIsImlzX3JlbGF0aXZlIiwiaXNfaW1wbGljaXQiLCJjaGVja19zdWZmaXgiLCJzdWZmIiwiY2hvcF9zdWZmaXhfb3B0IiwibGVuX2YiLCJ0ZW1wX2Rpcl9uYW1lIiwicXVvdGUiLCJxdW90ZV9jb21tYW5kIiwiYmFzZW5hbWUiLCJkaXJuYW1lIiwiaXNfZGlyX3NlcCQwIiwiaXNfcmVsYXRpdmUkMCIsImlzX2ltcGxpY2l0JDAiLCJjaGVja19zdWZmaXgkMCIsImNob3Bfc3VmZml4X29wdCQwIiwidGVtcF9kaXJfbmFtZSQwIiwicXVvdGUkMCIsImFkZF9icyIsImxvb3AkMCIsImxvb3BfYnMiLCJxdW90ZV9jbWRfZmlsZW5hbWUiLCJxdW90ZV9jb21tYW5kJDAiLCJkcml2ZV9hbmRfcGF0aCIsImRpcm5hbWUkMCIsInBhdGgiLCJkcml2ZSIsImRpciIsImJhc2VuYW1lJDAiLCJiYXNlbmFtZSQxIiwiZGlybmFtZSQxIiwibnVsbCQzIiwiY3VycmVudF9kaXJfbmFtZSQyIiwicGFyZW50X2Rpcl9uYW1lJDIiLCJkaXJfc2VwJDIiLCJpc19kaXJfc2VwJDEiLCJpc19yZWxhdGl2ZSQxIiwiaXNfaW1wbGljaXQkMSIsImNoZWNrX3N1ZmZpeCQxIiwiY2hvcF9zdWZmaXhfb3B0JDEiLCJ0ZW1wX2Rpcl9uYW1lJDEiLCJxdW90ZSQxIiwicXVvdGVfY29tbWFuZCQxIiwiYmFzZW5hbWUkMiIsImRpcm5hbWUkMiIsImNob3Bfc3VmZml4IiwiZXh0ZW5zaW9uX2xlbiIsImkwIiwiZXh0ZW5zaW9uIiwiY2hvcF9leHRlbnNpb24iLCJyZW1vdmVfZXh0ZW5zaW9uIiwidGVtcF9maWxlX25hbWUiLCJ0ZW1wX2RpciIsInJhbmRvbV9zdGF0ZSIsInJuZCIsImN1cnJlbnRfdGVtcF9kaXJfbmFtZSIsInNldF90ZW1wX2Rpcl9uYW1lIiwiZ2V0X3RlbXBfZGlyX25hbWUiLCJ0ZW1wX2ZpbGUiLCJvcGVuX3RlbXBfZmlsZSIsInN0aCQwIiwicGVybXMiLCJzdGgkMSIsIm5lZyIsImNvbmoiLCJtdWwiLCJkaXYiLCJpbnYiLCJub3JtMiIsIm5vcm0iLCJwb2xhciIsInNxcnQiLCJxJDAiLCJ3JDAiLCJleHAiLCJsb2ciLCJwb3ciLCJvcGVuX2JpbiIsIm9wZW5fdGV4dCIsIm9wZW5fZ2VuIiwid2l0aF9vcGVuIiwib3BlbmZ1biIsIndpdGhfb3Blbl9iaW4iLCJ3aXRoX29wZW5fdGV4dCIsIndpdGhfb3Blbl9nZW4iLCJzZWVrIiwiY2xvc2UiLCJjbG9zZV9ub2VyciIsImlucHV0X2NoYXIiLCJpbnB1dF9ieXRlIiwicmVhZF91cHRvIiwiZW5zdXJlIiwibmV3X2xlbiQwIiwibmV3X2xlbiQxIiwiaW5wdXRfYWxsIiwiY2h1bmtfc2l6ZSIsImluaXRpYWxfc2l6ZSQwIiwiaW5pdGlhbF9zaXplJDEiLCJucmVhZCIsImJ1ZiQyIiwiYnVmJDAiLCJidWYkMSIsInJlbSIsInNldF9iaW5hcnlfbW9kZSIsIm91dHB1dF9jaGFyIiwib3V0cHV0X2J5dGUiLCJwcmludGVyIiwiY29udGludWUkMCIsImRpc2NvbnRpbnVlIiwiZGlzY29udGludWVfd2l0aF9iYWNrdHJhY2UiLCJtYXRjaF93aXRoIiwiY29tcCIsImhhbmRsZXIiLCJlZmZjIiwiZWZmIiwibGFzdF9maWJlciIsInRyeV93aXRoIiwiZmliZXIiLCJjb250aW51ZV9nZW4iLCJyZXN1bWVfZnVuIiwiY29udGludWVfd2l0aCIsImRpc2NvbnRpbnVlX3dpdGgiLCJkaXNjb250aW51ZV93aXRoX2JhY2t0cmFjZSQwIiwidmVyc2lvbiIsImdpdF92ZXJzaW9uIiwicmFpc2UiLCJtYXgiLCJ4IiwieSIsIm1pbiIsImVxdWFsIiwiZXF1YWwkMCIsIm1heCQwIiwibWluJDAiLCJnbG9iYWwiLCJudWxsJDAiLCJ1bmRlZmluZWQkMCIsInJldHVybiQwIiwibWFwIiwiZiIsImJpbmQiLCJ0ZXN0IiwiaXRlciIsImNhc2UkMCIsImciLCJnZXQiLCJvcHRpb24iLCJ4JDAiLCJ0b19vcHRpb24iLCJyZXR1cm4kMSIsIm1hcCQwIiwiYmluZCQwIiwidGVzdCQwIiwiaXRlciQwIiwiY2FzZSQxIiwiZ2V0JDAiLCJvcHRpb24kMCIsInRvX29wdGlvbiQwIiwiY29lcmNlIiwiY29lcmNlX29wdCIsInRydWUkMCIsImZhbHNlJDAiLCJuZmMiLCJuZmQiLCJuZmtjIiwibmZrZCIsInN0cmluZ19jb25zdHIiLCJyZWdFeHAiLCJvYmplY3RfY29uc3RydWN0b3IiLCJvYmplY3Rfa2V5cyIsIm8iLCJhcnJheV9jb25zdHJ1Y3RvciIsImFycmF5X2dldCIsImFycmF5X3NldCIsImFycmF5X21hcCIsImEiLCJpZHgiLCJhcnJheV9tYXBpIiwic3RyX2FycmF5IiwibWF0Y2hfcmVzdWx0IiwiZGF0ZV9jb25zdHIiLCJtYXRoIiwiZXJyb3JfY29uc3RyIiwiZXhuX3dpdGhfanNfYmFja3RyYWNlIiwibmFtZSIsIm1lc3NhZ2UiLCJzdGFjayIsInRvX3N0cmluZyIsImUiLCJyYWlzZV9qc19lcnJvciIsInN0cmluZ19vZl9lcnJvciIsIkpTT04iLCJkZWNvZGVVUkkiLCJzIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZW5jb2RlVVJJIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiLCJpc05hTiIsImkiLCJwYXJzZUludCIsInMkMCIsInBhcnNlRmxvYXQiLCJleHBvcnRfanMiLCJmaWVsZCIsImV4cG9ydCQwIiwiZXhwb3J0X2FsbCIsIm9iaiIsImtleXMiLCJrZXkiLCJsaXN0X29mX25vZGVMaXN0IiwibGVuZ3RoIiwiYWNjIiwiaSQwIiwiYWNjJDAiLCJpJDEiLCJkaXNjb25uZWN0ZWQiLCJwcmVjZWRpbmciLCJmb2xsb3dpbmciLCJjb250YWlucyIsImNvbnRhaW5lZF9ieSIsImltcGxlbWVudGF0aW9uX3NwZWNpZmljIiwiaGFzIiwidCIsIm1hc2siLCJhZGQiLCJhcHBlbmRDaGlsZCIsInAiLCJuIiwicmVtb3ZlQ2hpbGQiLCJyZXBsYWNlQ2hpbGQiLCJpbnNlcnRCZWZvcmUiLCJub2RlVHlwZSIsInQxMyIsImNhc3QiLCJ0MTQiLCJlbGVtZW50IiwidGV4dCIsImF0dHIiLCJub19oYW5kbGVyIiwiaGFuZGxlciIsInJlcyIsImZ1bGxfaGFuZGxlciIsInRoaXMkMCIsImludm9rZV9oYW5kbGVyIiwiZXZlbnQiLCJldmVudFRhcmdldCIsIm1ha2UiLCJhZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMiLCJ0MjgiLCJ0eXAiLCJjYXB0dXJlIiwib25jZSIsInBhc3NpdmUiLCJoIiwiZXYiLCJjYWxsYmFjayIsImIiLCJhZGRFdmVudExpc3RlbmVyIiwiY2FwdCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJpZCIsInByZXZlbnREZWZhdWx0IiwiY3JlYXRlQ3VzdG9tRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImRldGFpbCIsIm9wdF9pdGVyIiwiY29uc3RyIiwiYXJyYXlCdWZmZXIiLCJpbnQ4QXJyYXkiLCJ1aW50OEFycmF5IiwiaW50MTZBcnJheSIsInVpbnQxNkFycmF5IiwiaW50MzJBcnJheSIsInVpbnQzMkFycmF5IiwiZmxvYXQzMkFycmF5IiwiZmxvYXQ2NEFycmF5Iiwic2V0IiwidiIsInVuc2FmZV9nZXQiLCJkYXRhVmlldyIsIm9mX2FycmF5QnVmZmVyIiwiYWIiLCJ1aW50OCIsImJsb2JfY29uc3RyIiwiZmlsdGVyX21hcCIsInEiLCJ2JDAiLCJibG9iX3JhdyIsImNvbnRlbnRUeXBlIiwiZW5kaW5ncyIsIm9wdGlvbnMiLCJvcHRpb25zJDAiLCJibG9iX2Zyb21fc3RyaW5nIiwiYmxvYl9mcm9tX2FueSIsImwiLCJhJDAiLCJsJDAiLCJmaWxlbmFtZSIsIm5hbWUkMCIsImRvY19jb25zdHIiLCJkb2N1bWVudCIsImJsb2IiLCJzdHJpbmciLCJsb2Fkc3RhcnQiLCJwcm9ncmVzcyIsImFib3J0IiwiZXJyb3IiLCJsb2FkIiwibG9hZGVuZCIsImZpbGVSZWFkZXIiLCJvbklFIiwiY2xpY2siLCJjb3B5IiwiY3V0IiwicGFzdGUiLCJkYmxjbGljayIsIm1vdXNlZG93biIsIm1vdXNldXAiLCJtb3VzZW92ZXIiLCJtb3VzZW1vdmUiLCJtb3VzZW91dCIsImtleXByZXNzIiwia2V5ZG93biIsImtleXVwIiwibW91c2V3aGVlbCIsIndoZWVsIiwiRE9NTW91c2VTY3JvbGwiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIiwidG91Y2hlbmQiLCJ0b3VjaGNhbmNlbCIsImRyYWdzdGFydCIsImRyYWdlbmQiLCJkcmFnZW50ZXIiLCJkcmFnb3ZlciIsImRyYWdsZWF2ZSIsImRyYWciLCJkcm9wIiwiaGFzaGNoYW5nZSIsImNoYW5nZSIsImlucHV0IiwidGltZXVwZGF0ZSIsInN1Ym1pdCIsInNjcm9sbCIsImZvY3VzIiwiYmx1ciIsInVubG9hZCIsImJlZm9yZXVubG9hZCIsInJlc2l6ZSIsIm9yaWVudGF0aW9uY2hhbmdlIiwicG9wc3RhdGUiLCJzZWxlY3QiLCJvbmxpbmUiLCJvZmZsaW5lIiwiY2hlY2tpbmciLCJub3VwZGF0ZSIsImRvd25sb2FkaW5nIiwidXBkYXRlcmVhZHkiLCJjYWNoZWQiLCJvYnNvbGV0ZSIsImRvbUNvbnRlbnRMb2FkZWQiLCJhbmltYXRpb25zdGFydCIsImFuaW1hdGlvbmVuZCIsImFuaW1hdGlvbml0ZXJhdGlvbiIsImFuaW1hdGlvbmNhbmNlbCIsInRyYW5zaXRpb25ydW4iLCJ0cmFuc2l0aW9uc3RhcnQiLCJ0cmFuc2l0aW9uZW5kIiwidHJhbnNpdGlvbmNhbmNlbCIsImNhbnBsYXkiLCJjYW5wbGF5dGhyb3VnaCIsImR1cmF0aW9uY2hhbmdlIiwiZW1wdGllZCIsImVuZGVkIiwiZ290cG9pbnRlcmNhcHR1cmUiLCJsb2FkZWRkYXRhIiwibG9hZGVkbWV0YWRhdGEiLCJsb3N0cG9pbnRlcmNhcHR1cmUiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmNhbmNlbCIsInBvaW50ZXJkb3duIiwicG9pbnRlcmxlYXZlIiwicG9pbnRlcm1vdmUiLCJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiLCJwb2ludGVydXAiLCJyYXRlY2hhbmdlIiwic2Vla2VkIiwic2Vla2luZyIsInN0YWxsZWQiLCJzdXNwZW5kIiwidm9sdW1lY2hhbmdlIiwid2FpdGluZyIsImQiLCJsb2NhdGlvbl9vcmlnaW4iLCJvcmlnaW4iLCJ3aW5kb3ciLCJnZXRFbGVtZW50QnlJZCIsInBub2RlIiwiZ2V0RWxlbWVudEJ5SWRfZXhuIiwiZ2V0RWxlbWVudEJ5SWRfb3B0IiwiZ2V0RWxlbWVudEJ5SWRfY29lcmNlIiwiY3JlYXRlRWxlbWVudCIsImRvYyIsInVuc2FmZUNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50U3ludGF4IiwidW5zYWZlQ3JlYXRlRWxlbWVudEV4IiwidHlwZSIsImVsdCIsImNyZWF0ZUh0bWwiLCJjcmVhdGVIZWFkIiwiY3JlYXRlTGluayIsImNyZWF0ZVRpdGxlIiwiY3JlYXRlTWV0YSIsImNyZWF0ZUJhc2UiLCJjcmVhdGVTdHlsZSIsImNyZWF0ZUJvZHkiLCJjcmVhdGVGb3JtIiwiY3JlYXRlT3B0Z3JvdXAiLCJjcmVhdGVPcHRpb24iLCJjcmVhdGVTZWxlY3QiLCJjcmVhdGVJbnB1dCIsImNyZWF0ZVRleHRhcmVhIiwiY3JlYXRlQnV0dG9uIiwiY3JlYXRlTGFiZWwiLCJjcmVhdGVGaWVsZHNldCIsImNyZWF0ZUxlZ2VuZCIsImNyZWF0ZVVsIiwiY3JlYXRlT2wiLCJjcmVhdGVEbCIsImNyZWF0ZUxpIiwiY3JlYXRlRGl2IiwiY3JlYXRlRW1iZWQiLCJjcmVhdGVQIiwiY3JlYXRlSDEiLCJjcmVhdGVIMiIsImNyZWF0ZUgzIiwiY3JlYXRlSDQiLCJjcmVhdGVINSIsImNyZWF0ZUg2IiwiY3JlYXRlUSIsImNyZWF0ZUJsb2NrcXVvdGUiLCJjcmVhdGVQcmUiLCJjcmVhdGVCciIsImNyZWF0ZUhyIiwiY3JlYXRlSW5zIiwiY3JlYXRlRGVsIiwiY3JlYXRlQSIsImNyZWF0ZUltZyIsImNyZWF0ZU9iamVjdCIsImNyZWF0ZVBhcmFtIiwiY3JlYXRlTWFwIiwiY3JlYXRlQXJlYSIsImNyZWF0ZVNjcmlwdCIsImNyZWF0ZVRhYmxlIiwiY3JlYXRlQ2FwdGlvbiIsImNyZWF0ZUNvbCIsImNyZWF0ZUNvbGdyb3VwIiwiY3JlYXRlVGhlYWQiLCJjcmVhdGVUZm9vdCIsImNyZWF0ZVRib2R5IiwiY3JlYXRlVHIiLCJjcmVhdGVUaCIsImNyZWF0ZVRkIiwiY3JlYXRlU3ViIiwiY3JlYXRlU3VwIiwiY3JlYXRlU3BhbiIsImNyZWF0ZVR0IiwiY3JlYXRlSSIsImNyZWF0ZUIiLCJjcmVhdGVCaWciLCJjcmVhdGVTbWFsbCIsImNyZWF0ZUVtIiwiY3JlYXRlU3Ryb25nIiwiY3JlYXRlQ2l0ZSIsImNyZWF0ZURmbiIsImNyZWF0ZUNvZGUiLCJjcmVhdGVTYW1wIiwiY3JlYXRlS2JkIiwiY3JlYXRlVmFyIiwiY3JlYXRlQWJiciIsImNyZWF0ZURkIiwiY3JlYXRlRHQiLCJjcmVhdGVOb3NjcmlwdCIsImNyZWF0ZUFkZHJlc3MiLCJjcmVhdGVGcmFtZXNldCIsImNyZWF0ZUZyYW1lIiwiY3JlYXRlSWZyYW1lIiwiY3JlYXRlQXVkaW8iLCJjcmVhdGVWaWRlbyIsImNyZWF0ZUNhbnZhcyIsImh0bWxfZWxlbWVudCIsInQ1NCIsInVuc2FmZUNvZXJjZSIsInRhZyIsInQ1NSIsImFyZWEiLCJiYXNlIiwiYmxvY2txdW90ZSIsImJvZHkiLCJiciIsImJ1dHRvbiIsImNhbnZhcyIsImNhcHRpb24iLCJjb2wiLCJjb2xncm91cCIsImRlbCIsImRpdiIsImRsIiwiZmllbGRzZXQiLCJlbWJlZCIsImZvcm0iLCJmcmFtZXNldCIsImZyYW1lIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiaGVhZCIsImhyIiwiaHRtbCIsImlmcmFtZSIsImltZyIsImlucHV0JDAiLCJpbnMiLCJsYWJlbCIsImxlZ2VuZCIsImxpIiwibGluayIsIm1ldGEiLCJvYmplY3QiLCJvbCIsIm9wdGdyb3VwIiwicGFyYW0iLCJwcmUiLCJzY3JpcHQiLCJzZWxlY3QkMCIsInN0eWxlIiwidGFibGUiLCJ0Ym9keSIsInRkIiwidGV4dGFyZWEiLCJ0Zm9vdCIsInRoIiwidGhlYWQiLCJ0aXRsZSIsInRyIiwidWwiLCJhdWRpbyIsInZpZGVvIiwidW5zYWZlQ29lcmNlRXZlbnQiLCJtb3VzZUV2ZW50Iiwia2V5Ym9hcmRFdmVudCIsIndoZWVsRXZlbnQiLCJtb3VzZVNjcm9sbEV2ZW50IiwicG9wU3RhdGVFdmVudCIsIm1lc3NhZ2VFdmVudCIsImV2ZW50UmVsYXRlZFRhcmdldCIsImV2ZW50QWJzb2x1dGVQb3NpdGlvbiIsImV2ZW50QWJzb2x1dGVQb3NpdGlvbiQwIiwiZWxlbWVudENsaWVudFBvc2l0aW9uIiwiZ2V0RG9jdW1lbnRTY3JvbGwiLCJidXR0b25QcmVzc2VkIiwiYWRkTW91c2V3aGVlbEV2ZW50TGlzdGVuZXJXaXRoIiwiZHgiLCJkeSIsImFkZE1vdXNld2hlZWxFdmVudExpc3RlbmVyIiwidHJ5X2NvZGUiLCJ0cnlfa2V5X2NvZGVfbGVmdCIsInRyeV9rZXlfY29kZV9yaWdodCIsInRyeV9rZXlfY29kZV9udW1wYWQiLCJ0cnlfa2V5X2NvZGVfbm9ybWFsIiwibWFrZV91bmlkZW50aWZpZWQiLCJydW5fbmV4dCIsInZhbHVlIiwic3ltYm9sIiwib2ZfZXZlbnQiLCJjaGFyX29mX2ludCIsImVtcHR5X3N0cmluZyIsIm5vbmUiLCJvZl9ldmVudCQwIiwiZWxlbWVudCQwIiwidGFnZ2VkIiwidDEwNSIsIm9wdF90YWdnZWQiLCJ0YWdnZWRFdmVudCIsIm9wdF90YWdnZWRFdmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImMiLCJyZXEiLCJub3ciLCJsYXN0IiwiZHQiLCJkdCQwIiwiaGFzUHVzaFN0YXRlIiwiaGFzUGxhY2Vob2xkZXIiLCJoYXNSZXF1aXJlZCIsIm92ZXJmbG93X2xpbWl0Iiwic2V0VGltZW91dCIsImxvb3AiLCJyZW1haW4iLCJzdGVwIiwiY2IiLCJjbGVhclRpbWVvdXQiLCJqc19hcnJheV9vZl9jb2xsZWN0aW9uIiwiZm9ybURhdGEiLCJmb3JtRGF0YV9mb3JtIiwiaGF2ZV9jb250ZW50IiwiZm9ybV9lbGVtZW50cyIsImkkMiIsInN0aCIsIm5hbWUkMSIsImxpc3QiLCJmaWxlIiwiYXBwZW5kIiwiZm9ybV9jb250ZW50cyIsImZvcm1fZWx0IiwiZW1wdHlfZm9ybV9jb250ZW50cyIsInBvc3RfZm9ybV9jb250ZW50cyIsImNvbnRlbnRzIiwiZ2V0X2Zvcm1fY29udGVudHMiLCJyZWFkeXN0YXRlY2hhbmdlIiwidGltZW91dCIsIndvcmtlciIsImNyZWF0ZSIsImltcG9ydF9zY3JpcHRzIiwic2NyaXB0cyIsInNldF9vbm1lc3NhZ2UiLCJqc19oYW5kbGVyIiwicG9zdF9tZXNzYWdlIiwibXNnIiwid2ViU29ja2V0IiwiaXNfc3VwcG9ydGVkIiwiZGVmYXVsdENvbnRleHRBdHRyaWJ1dGVzIiwid2ViZ2xjb250ZXh0bG9zdCIsIndlYmdsY29udGV4dHJlc3RvcmVkIiwid2ViZ2xjb250ZXh0Y3JlYXRpb25lcnJvciIsImdldENvbnRleHQiLCJjdHgiLCJnZXRDb250ZXh0V2l0aEF0dHJpYnV0ZXMiLCJhdHRyaWJzIiwicmVnZXhwIiwicmVnZXhwX2Nhc2VfZm9sZCIsInJlZ2V4cF93aXRoX2ZsYWciLCJibHVudF9zdHJfYXJyYXlfZ2V0Iiwic3RyaW5nX21hdGNoIiwic2VhcmNoIiwicmVzX3ByZSIsIm1hdGNoZWRfc3RyaW5nIiwiciIsIm1hdGNoZWRfZ3JvdXAiLCJxdW90ZV9yZXBsX3JlIiwicXVvdGVfcmVwbCIsImdsb2JhbF9yZXBsYWNlIiwic19ieSIsInJlcGxhY2VfZmlyc3QiLCJ0MjkiLCJmbGFncyIsImxpc3Rfb2ZfanNfYXJyYXkiLCJpZHgkMSIsImFjY3UiLCJpZHgkMCIsImFjY3UkMCIsInNwbGl0IiwiYm91bmRlZF9zcGxpdCIsInF1b3RlX3JlIiwicXVvdGUiLCJyZWdleHBfc3RyaW5nIiwicmVnZXhwX3N0cmluZ19jYXNlX2ZvbGQiLCJpbnRlcnJ1cHQiLCJwbHVzX3JlIiwidXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmciLCJ1cmxkZWNvZGUiLCJ1cmxlbmNvZGUiLCJvcHQiLCJ3aXRoX3BsdXMiLCJkZWZhdWx0X2h0dHBfcG9ydCIsImRlZmF1bHRfaHR0cHNfcG9ydCIsInBhdGhfb2ZfcGF0aF9zdHJpbmciLCJhdXgiLCJqIiwid29yZCIsImVuY29kZV9hcmd1bWVudHMiLCJkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZyIsImxlbiIsImluZGV4IiwiZGVjb2RlX2FyZ3VtZW50cyIsInVybF9yZSIsImZpbGVfcmUiLCJ1cmxfb2ZfanNfc3RyaW5nIiwiaGFuZGxlIiwicHJvdF9zdHJpbmciLCJzc2wiLCJwYXRoX3N0ciIsInVybCIsInVybF9vZl9zdHJpbmciLCJzdHJpbmdfb2ZfdXJsIiwiZnJhZyIsImFyZ3MiLCJwYXRoIiwicG9ydCIsImhvc3QiLCJmcmFnJDAiLCJhcmdzJDAiLCJwYXRoJDAiLCJwb3J0JDAiLCJob3N0JDAiLCJmcmFnJDEiLCJhcmdzJDEiLCJwYXRoJDEiLCJwcm90b2NvbCIsInBhdGhfc3RyaW5nIiwiYXJndW1lbnRzJDAiLCJnZXRfZnJhZ21lbnQiLCJyZXMkMCIsInNldF9mcmFnbWVudCIsInUiLCJhc19zdHJpbmciLCJ1cGRhdGVfZmlsZSIsImNvbnRlbnQiLCJvYyIsInNldF9jaGFubmVsX2ZsdXNoZXIiLCJvdXRfY2hhbm5lbCIsImYkMCIsInNldF9jaGFubmVsX2ZpbGxlciIsImluX2NoYW5uZWwiLCJtb3VudCIsInByZWZpeCIsInVubW91bnQiLCJqc19vZl9vY2FtbF92ZXJzaW9uIiwiZW1wdHlfcmVzaXplX29ic2VydmVyX29wdGlvbnMiLCJyZXNpemVPYnNlcnZlciIsIm9ic2VydmUiLCJub2RlIiwiYm94Iiwib2JzIiwicGVyZm9ybWFuY2VPYnNlcnZlciIsImVudHJ5X3R5cGVzIiwiZW1wdHlfbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdCIsIm11dGF0aW9uT2JzZXJ2ZXIiLCJjaGlsZF9saXN0IiwiYXR0cmlidXRlcyIsImNoYXJhY3Rlcl9kYXRhIiwic3VidHJlZSIsImF0dHJpYnV0ZV9vbGRfdmFsdWUiLCJjaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWUiLCJhdHRyaWJ1dGVfZmlsdGVyIiwiayIsInJlbW92ZSIsImZpbmQiLCJqc29uIiwicmV2aXZlciIsImlucHV0X3Jldml2ZXIiLCJ1bnNhZmVfaW5wdXQiLCJtbEludDY0X2NvbnN0ciIsIm91dHB1dF9yZXZpdmVyIiwib3V0cHV0Iiwic3RyaW5nX29mX25hbWUiLCJuYW1lX29mX3N0cmluZyIsInJnYl9vZl9uYW1lIiwicmdiIiwiaHNsIiwic3RyaW5nX29mX3QiLCJiJDAiLCJnJDAiLCJyJDAiLCJiJDEiLCJnJDEiLCJyJDEiLCJiJDIiLCJnJDIiLCJyJDIiLCJhJDEiLCJoJDAiLCJoZXhfb2ZfcmdiIiwiYmx1ZSIsImdyZWVuIiwicmVkIiwiaW5fcmFuZ2UiLCJqc190X29mX2pzX3N0cmluZyIsInJnYl9yZSIsInJnYl9wY3RfcmUiLCJyZ2JhX3JlIiwicmdiYV9wY3RfcmUiLCJoc2xfcmUiLCJoc2xhX3JlIiwianMiLCJjbiIsIm1sIiwiZmFpbCIsInJlX3JnYiIsInJlX3JnYl9wY3QiLCJyZV9oc2wiLCJpX29mX3NfbyIsImZfb2ZfcyIsImFscGhhIiwicmVkJDAiLCJncmVlbiQwIiwiYmx1ZSQwIiwiYWxwaGEkMCIsInJlZCQxIiwiZ3JlZW4kMSIsImJsdWUkMSIsImFscGhhJDEiLCJzdHJpbmdfb2ZfdCQwIiwiZiQxIiwiZiQyIiwiZiQzIiwiZiQ0IiwiZiQ1IiwiZiQ2IiwiZiQ3IiwiZiQ4IiwiZiQ5IiwiZiQxMCIsImYkMTEiLCJmJDEyIiwianMkMCIsIm1sJDAiLCJyZSIsInN0cmluZ19vZl90JDEiLCJqcyQxIiwibWwkMSIsImxpc3RlbiIsInRhcmdldCIsInN0b3BfbGlzdGVuIiwieG1sbnMiLCJjcmVhdGVBbHRHbHlwaCIsImNyZWF0ZUFsdEdseXBoRGVmIiwiY3JlYXRlQWx0R2x5cGhJdGVtIiwiY3JlYXRlQW5pbWF0ZSIsImNyZWF0ZUFuaW1hdGVDb2xvciIsImNyZWF0ZUFuaW1hdGVNb3Rpb24iLCJjcmVhdGVBbmltYXRlVHJhbnNmb3JtIiwiY3JlYXRlQ2lyY2xlIiwiY3JlYXRlQ2xpcFBhdGgiLCJjcmVhdGVDdXJzb3IiLCJjcmVhdGVEZWZzIiwiY3JlYXRlRGVzYyIsImNyZWF0ZUVsbGlwc2UiLCJjcmVhdGVGaWx0ZXIiLCJjcmVhdGVGb250IiwiY3JlYXRlRm9udEZhY2UiLCJjcmVhdGVGb250RmFjZUZvcm1hdCIsImNyZWF0ZUZvbnRGYWNlTmFtZSIsImNyZWF0ZUZvbnRGYWNlU3JjIiwiY3JlYXRlRm9udEZhY2VVcmkiLCJjcmVhdGVGb3JlaWduT2JqZWN0IiwiY3JlYXRlRyIsImNyZWF0ZUdseXBoIiwiY3JlYXRlR2x5cGhSZWYiLCJjcmVhdGVoa2VybiIsImNyZWF0ZUltYWdlIiwiY3JlYXRlTGluZUVsZW1lbnQiLCJjcmVhdGVMaW5lYXJFbGVtZW50IiwiY3JlYXRlTWFzayIsImNyZWF0ZU1ldGFEYXRhIiwiY3JlYXRlTWlzc2luZ0dseXBoIiwiY3JlYXRlTVBhdGgiLCJjcmVhdGVQYXRoIiwiY3JlYXRlUGF0dGVybiIsImNyZWF0ZVBvbHlnb24iLCJjcmVhdGVQb2x5bGluZSIsImNyZWF0ZVJhZGlhbGdyYWRpZW50IiwiY3JlYXRlUmVjdCIsImNyZWF0ZVNldCIsImNyZWF0ZVN0b3AiLCJjcmVhdGVTdmciLCJjcmVhdGVTd2l0Y2giLCJjcmVhdGVTeW1ib2wiLCJjcmVhdGVUZXh0RWxlbWVudCIsImNyZWF0ZVRleHRwYXRoIiwiY3JlYXRlVHJlZiIsImNyZWF0ZVRzcGFuIiwiY3JlYXRlVXNlIiwiY3JlYXRlVmlldyIsImNyZWF0ZXZrZXJuIiwic3ZnX2VsZW1lbnQiLCJ0OCIsImFsdEdseXBoIiwiYWx0R2x5cGhEZWYiLCJhbHRHbHlwaEl0ZW0iLCJhbmltYXRlIiwiYW5pbWF0ZUNvbG9yIiwiYW5pbWF0ZU1vdGlvbiIsImFuaW1hdGVUcmFuc2Zvcm0iLCJjaXJjbGUiLCJjbGlwUGF0aCIsImN1cnNvciIsImRlZnMiLCJkZXNjIiwiZWxsaXBzZSIsImZpbHRlciIsImZvbnQiLCJmb250RmFjZSIsImZvbnRGYWNlRm9ybWF0IiwiZm9udEZhY2VOYW1lIiwiZm9udEZhY2VTcmMiLCJmb250RmFjZVVyaSIsImZvcmVpZ25PYmplY3QiLCJnbHlwaCIsImdseXBoUmVmIiwiaGtlcm4iLCJpbWFnZSIsImxpbmVFbGVtZW50IiwibGluZWFyRWxlbWVudCIsIm1ldGFEYXRhIiwibWlzc2luZ0dseXBoIiwibVBhdGgiLCJwYXR0ZXJuIiwicG9seWdvbiIsInBvbHlsaW5lIiwicmFkaWFsZ3JhZGllbnQiLCJyZWN0Iiwic3RvcCIsInN2ZyIsInN3aXRjaCQwIiwidGV4dEVsZW1lbnQiLCJ0ZXh0cGF0aCIsInRyZWYiLCJ0c3BhbiIsInVzZSIsInZpZXciLCJ2a2VybiIsIndpdGhDcmVkZW50aWFscyIsImV2ZW50U291cmNlIiwiZXZlbnRTb3VyY2Vfb3B0aW9ucyIsImNvbnNvbGUiLCJlbXB0eV9wb3NpdGlvbl9vcHRpb25zIiwiZ2VvbG9jYXRpb24iLCJlbXB0eV9pbnRlcnNlY3Rpb25fb2JzZXJ2ZXJfb3AiLCJpbnRlcnNlY3Rpb25PYnNlcnZlcl91bnNhZmUiLCJvYmplY3Rfb3B0aW9ucyIsIm9wdGlvbnMkMSIsIm9wdGlvbnMkMiIsImludGwiLCJjb2xsYXRvcl9jb25zdHIiLCJkYXRlVGltZUZvcm1hdF9jb25zdHIiLCJudW1iZXJGb3JtYXRfY29uc3RyIiwicGx1cmFsUnVsZXNfY29uc3RyIiwicHJlX3Rlc3RfaG9vayIsInNleHBfb2ZfdCIsInQiLCJ0X29mX3NleHAiLCJjb21wYXJlIiwiYSQwIiwiYiQwIiwiYSQxIiwiYiQxIiwiYSQyIiwiYiQyIiwiYSIsImIiLCJ5cyIsInkiLCJ4cyIsIngiLCJyZXMiLCJlcXVhbCIsImRlZmF1bHRfaW5kZW50IiwibXVzdF9lc2NhcGUiLCJzdHIiLCJsZW4iLCJpeCQxIiwiaXgiLCJuZXh0IiwibmV4dCQwIiwiaXgkMCIsImVzY2FwZWQiLCJzIiwibiIsImkkMCIsInMkMCIsImkiLCJjIiwiZXNjX3N0ciIsImVzdHIiLCJlbGVuIiwiaW5kZXhfb2ZfbmV3bGluZSIsInN0YXJ0IiwibWFjaF9tYXliZV9lc2Nfc3RyIiwicHBfaHVtX2luZGVudCIsImluZGVudCIsInBwZiIsImluZGV4IiwiaW5kZXgkMCIsIm5leHRfbmV3bGluZSIsImVuZF9wb3MiLCJlbmRfcG9zJDAiLCJuZXh0X2xpbmUiLCJuZXdsaW5lX2luZGV4IiwiaW5kZXgkMSIsImgiLCJ0JDAiLCJoJDAiLCJwcF9tYWNoX2ludGVybmFsIiwibWF5X25lZWRfc3BhY2UiLCJzdHIkMCIsIm5ld19tYXlfbmVlZF9zcGFjZSIsIm5ld19tYXlfbmVlZF9zcGFjZSQwIiwibWF5X25lZWRfc3BhY2UkMCIsIm1heV9uZWVkX3NwYWNlJDEiLCJtYXlfbmVlZF9zcGFjZSQyIiwicHBfaHVtIiwic2V4cCIsInBwX21hY2giLCJzaXplX2xvb3AiLCJhY2MiLCJ2IiwibHN0Iiwic2l6ZSIsInRvX2J1ZmZlcl9odW0iLCJidWYiLCJvcHQiLCJzdGgiLCJ0b19idWZmZXJfbWFjaCIsImxvb3AiLCJ0b19idWZmZXJfZ2VuIiwiYWRkX2NoYXIiLCJhZGRfc3RyaW5nIiwiYnVmZmVyIiwidG9fc3RyaW5nX2h1bSIsInRvX3N0cmluZ19tYWNoIiwib2ZfZmxvYXRfc3R5bGUiLCJvZl9pbnRfc3R5bGUiLCJtZXNzYWdlIiwibmFtZSIsImZpZWxkcyIsImNvbnZfZmllbGRzIiwicmVzdCIsImZzZXhwIiwiZm5hbWUiLCJkb2NfY29tbWVudF90YWciLCJjb2VyY2UiLCJ1bml0X3NleHBfZ3JhbW1hciIsInNleHBfdF9zZXhwX2dyYW1tYXIiLCJlbXB0eV9zZXhwX2dyYW1tYXIiLCJib29sX3NleHBfZ3JhbW1hciIsInN0cmluZ19zZXhwX2dyYW1tYXIiLCJieXRlc19zZXhwX2dyYW1tYXIiLCJjaGFyX3NleHBfZ3JhbW1hciIsImludF9zZXhwX2dyYW1tYXIiLCJmbG9hdF9zZXhwX2dyYW1tYXIiLCJpbnQzMl9zZXhwX2dyYW1tYXIiLCJpbnQ2NF9zZXhwX2dyYW1tYXIiLCJuYXRpdmVpbnRfc2V4cF9ncmFtbWFyIiwicmVmX3NleHBfZ3JhbW1hciIsImdyYW1tYXIiLCJsYXp5X3Rfc2V4cF9ncmFtbWFyIiwib3B0aW9uX3NleHBfZ3JhbW1hciIsInBhcmFtIiwibGlzdF9zZXhwX2dyYW1tYXIiLCJhcnJheV9zZXhwX2dyYW1tYXIiLCJkZWZhdWx0X3N0cmluZ19vZl9mbG9hdCIsInJlYWRfb2xkX29wdGlvbl9mb3JtYXQiLCJ3cml0ZV9vbGRfb3B0aW9uX2Zvcm1hdCIsImxpc3RfbWFwIiwiZiIsImwiLCJzZXhwX29mX3VuaXQiLCJzZXhwX29mX2Jvb2wiLCJzZXhwX29mX3N0cmluZyIsInNleHBfb2ZfYnl0ZXMiLCJieXRlcyIsInNleHBfb2ZfY2hhciIsInNleHBfb2ZfaW50Iiwic2V4cF9vZl9mbG9hdCIsInNleHBfb2ZfaW50MzIiLCJzZXhwX29mX2ludDY0Iiwic2V4cF9vZl9uYXRpdmVpbnQiLCJzZXhwX29mX3JlZiIsInNleHBfb2ZfYSIsInJmIiwic2V4cF9vZl9sYXp5X3QiLCJsdiIsInNleHBfb2Zfb3B0aW9uIiwic2V4cF9vZl9wYWlyIiwic2V4cF9vZl9iIiwic2V4cF9vZl90cmlwbGUiLCJzZXhwX29mX2MiLCJzZXhwX29mX2xpc3QiLCJzZXhwX29mX2FycmF5IiwiYXIiLCJsc3RfcmVmIiwic2V4cF9vZl9oYXNodGJsIiwic2V4cF9vZl9rZXkiLCJzZXhwX29mX3ZhbCIsImh0YmwiLCJjb2xsIiwiayIsInNleHBfb2Zfb3BhcXVlIiwic2V4cF9vZl9mdW4iLCJoYXNoIiwidGhlX2V4bl90YWJsZSIsImFkZCIsImV4dGVuc2lvbl9jb25zdHJ1Y3RvciIsInNleHBfb2ZfZXhuIiwicHJpbnRleGMiLCJmaW5kX2F1dG8iLCJmb3JfcHJpbnRleGMiLCJleG4iLCJzZXhwX29mX2V4bl9vcHQiLCJleG5fdG9fc3RyaW5nIiwiZSIsInByaW50ZXhjX3ByZWZlcl9zZXhwIiwicmVjb3JkX2NoZWNrX2V4dHJhX2ZpZWxkcyIsIm9mX3NleHBfZXJyb3JfZXhuIiwiZXhjIiwib2Zfc2V4cF9lcnJvciIsIndoYXQiLCJ1bml0X29mX3NleHAiLCJib29sX29mX3NleHAiLCJzdHJpbmdfb2Zfc2V4cCIsImJ5dGVzX29mX3NleHAiLCJjaGFyX29mX3NleHAiLCJpbnRfb2Zfc2V4cCIsImV4YyQwIiwiZmxvYXRfb2Zfc2V4cCIsImludDMyX29mX3NleHAiLCJpbnQ2NF9vZl9zZXhwIiwibmF0aXZlaW50X29mX3NleHAiLCJyZWZfb2Zfc2V4cCIsImFfb2Zfc2V4cCIsImxhenlfdF9vZl9zZXhwIiwib3B0aW9uX29mX3NleHAiLCJlbCQwIiwiZWwiLCJwYWlyX29mX3NleHAiLCJiX29mX3NleHAiLCJiX3NleHAiLCJhX3NleHAiLCJ0cmlwbGVfb2Zfc2V4cCIsImNfb2Zfc2V4cCIsImNfc2V4cCIsImxpc3Rfb2Zfc2V4cCIsInJldl9sc3QiLCJhcnJheV9vZl9zZXhwIiwiaGFzaHRibF9vZl9zZXhwIiwia2V5X29mX3NleHAiLCJ2YWxfb2Zfc2V4cCIsImFjdCIsInZfc2V4cCIsImtfc2V4cCIsIm9wYXF1ZV9vZl9zZXhwIiwiZnVuX29mX3NleHAiLCJnZXRfZmxjX2Vycm9yIiwiY2hyIiwibGluZSIsImZpbGUiLCJhcmciLCJoYW5kbGVyIiwidHVwbGVfb2Zfc2l6ZV9uX2V4cGVjdGVkIiwibG9jIiwic3RhZ19ub19hcmdzIiwic3RhZ19pbmNvcnJlY3Rfbl9hcmdzIiwidGFnIiwibXNnIiwic3RhZ190YWtlc19hcmdzIiwibmVzdGVkX2xpc3RfaW52YWxpZF9zdW0iLCJlbXB0eV9saXN0X2ludmFsaWRfc3VtIiwidW5leHBlY3RlZF9zdGFnIiwicmVjb3JkX3NleHBfYm9vbF93aXRoX3BheWxvYWQiLCJyZWNvcmRfb25seV9wYWlyc19leHBlY3RlZCIsInJlY29yZF9zdXBlcmZsdW91c19maWVsZHMiLCJyZXZfZmxkX25hbWVzIiwiZmxkX25hbWVzX3N0ciIsInJlY29yZF9kdXBsaWNhdGVfZmllbGRzIiwicmVjb3JkX2V4dHJhX2ZpZWxkcyIsInJlY29yZF9nZXRfdW5kZWZpbmVkX2xvb3AiLCJmaWVsZHMkMCIsImZpZWxkIiwicmVzdCQwIiwicmVjb3JkX3VuZGVmaW5lZF9lbGVtZW50cyIsInVuZGVmaW5lZCQwIiwicmVjb3JkX2xpc3RfaW5zdGVhZF9hdG9tIiwicmVjb3JkX3BvbHlfZmllbGRfdmFsdWUiLCJub192YXJpYW50X21hdGNoIiwibm9fbWF0Y2hpbmdfdmFyaWFudF9mb3VuZCIsInB0YWdfbm9fYXJncyIsInB0YWdfaW5jb3JyZWN0X25fYXJncyIsImNuc3RyIiwicHRhZ190YWtlc19hcmdzIiwibmVzdGVkX2xpc3RfaW52YWxpZF9wb2x5X3ZhciIsImVtcHR5X2xpc3RfaW52YWxpZF9wb2x5X3ZhciIsImVtcHR5X3R5cGUiLCJkZXNjZW5kaW5nIiwieCIsInkiLCJtYXgiLCJtaW4iLCJtYXhfaW50IiwibWluX2ludCIsImluZmluaXR5IiwibmVnX2luZmluaXR5IiwibmFuIiwibWF4X2Zsb2F0IiwibWluX2Zsb2F0IiwiZXBzaWxvbl9mbG9hdCIsImNoYXJfb2ZfaW50Iiwic3RyaW5nX29mX2Jvb2wiLCJib29sX29mX3N0cmluZ19vcHQiLCJib29sX29mX3N0cmluZyIsInN0cmluZ19vZl9pbnQiLCJpbnRfb2Zfc3RyaW5nX29wdCIsInN0cmluZ19vZl9mbG9hdCIsImZsb2F0X29mX3N0cmluZ19vcHQiLCJzdGRpbiIsInN0ZG91dCIsInN0ZGVyciIsInByaW50X2NoYXIiLCJwcmludF9zdHJpbmciLCJwcmludF9ieXRlcyIsInByaW50X2ludCIsInByaW50X2Zsb2F0IiwicHJpbnRfZW5kbGluZSIsInByaW50X25ld2xpbmUiLCJwcmVycl9jaGFyIiwicHJlcnJfc3RyaW5nIiwicHJlcnJfYnl0ZXMiLCJwcmVycl9pbnQiLCJwcmVycl9mbG9hdCIsInByZXJyX2VuZGxpbmUiLCJwcmVycl9uZXdsaW5lIiwicmVhZF9saW5lIiwicmVhZF9pbnRfb3B0IiwicmVhZF9pbnQiLCJyZWFkX2Zsb2F0X29wdCIsInJlYWRfZmxvYXQiLCJvcGVuX291dCIsIm9wZW5fb3V0X2JpbiIsIm9wZW5fb3V0X2dlbiIsImZsdXNoIiwiZmx1c2hfYWxsIiwib3V0cHV0X2NoYXIiLCJvdXRwdXRfc3RyaW5nIiwib3V0cHV0X2J5dGVzIiwib3V0cHV0Iiwib3V0cHV0X3N1YnN0cmluZyIsIm91dHB1dF9ieXRlIiwib3V0cHV0X2JpbmFyeV9pbnQiLCJvdXRwdXRfdmFsdWUiLCJzZWVrX291dCIsInBvc19vdXQiLCJvdXRfY2hhbm5lbF9sZW5ndGgiLCJjbG9zZV9vdXQiLCJjbG9zZV9vdXRfbm9lcnIiLCJzZXRfYmluYXJ5X21vZGVfb3V0Iiwib3Blbl9pbiIsIm9wZW5faW5fYmluIiwib3Blbl9pbl9nZW4iLCJpbnB1dF9jaGFyIiwiaW5wdXRfbGluZSIsImlucHV0IiwicmVhbGx5X2lucHV0IiwicmVhbGx5X2lucHV0X3N0cmluZyIsImlucHV0X2J5dGUiLCJpbnB1dF9iaW5hcnlfaW50IiwiaW5wdXRfdmFsdWUiLCJzZWVrX2luIiwicG9zX2luIiwiaW5fY2hhbm5lbF9sZW5ndGgiLCJjbG9zZV9pbiIsImNsb3NlX2luX25vZXJyIiwic2V0X2JpbmFyeV9tb2RlX2luIiwic3RyaW5nX29mX2Zvcm1hdCIsInN5bWJvbCIsImV4aXQiLCJhdF9leGl0IiwidmFsaWRfZmxvYXRfbGV4ZW0iLCJ1bnNhZmVfcmVhbGx5X2lucHV0IiwiZG9fYXRfZXhpdCIsImRvX2RvbWFpbl9sb2NhbF9hdF9leGl0IiwiYm9vbF90b19pbnQiLCJzeW1ib2wkMyIsInN5bWJvbCQ0Iiwic3ltYm9sJDUiLCJzeW1ib2wkNiIsInN5bWJvbCQ3Iiwic3ltYm9sJDgiLCJzeW1ib2wkOSIsInN5bWJvbCQxMCIsInN5bWJvbCQxMSIsInN5bWJvbCQxMiIsImFzY2VuZGluZyIsIm1heCQwIiwibWluJDAiLCJhc2NlbmRpbmckMCIsImRlc2NlbmRpbmckMCIsIm1heCQxIiwibWluJDEiLCJzeW1ib2wkMTMiLCJzeW1ib2wkMTQiLCJzeW1ib2wkMTUiLCJzeW1ib2wkMTYiLCJzeW1ib2wkMTciLCJzeW1ib2wkMTgiLCJhc2NlbmRpbmckMSIsImRlc2NlbmRpbmckMSIsImNvbXBhcmUiLCJlcXVhbCIsIm1heCQyIiwibWluJDIiLCJhc2NlbmRpbmckMiIsImRlc2NlbmRpbmckMiIsIm1heCQzIiwibWluJDMiLCJzeW1ib2wkMTkiLCJzeW1ib2wkMjAiLCJzeW1ib2wkMjEiLCJzeW1ib2wkMjIiLCJzeW1ib2wkMjMiLCJzeW1ib2wkMjQiLCJhc2NlbmRpbmckMyIsImRlc2NlbmRpbmckMyIsImNvbXBhcmUkMCIsImVxdWFsJDAiLCJtYXgkNCIsIm1pbiQ0Iiwic3ltYm9sJDI1Iiwic3ltYm9sJDI2Iiwic3ltYm9sJDI3Iiwic3ltYm9sJDI4Iiwic3ltYm9sJDI5Iiwic3ltYm9sJDMwIiwiYXNjZW5kaW5nJDQiLCJkZXNjZW5kaW5nJDQiLCJjb21wYXJlJDEiLCJlcXVhbCQxIiwibWF4JDUiLCJtaW4kNSIsInN5bWJvbCQzMSIsInN5bWJvbCQzMiIsInN5bWJvbCQzMyIsInN5bWJvbCQzNCIsInN5bWJvbCQzNSIsInN5bWJvbCQzNiIsImFzY2VuZGluZyQ1IiwiZGVzY2VuZGluZyQ1IiwiY29tcGFyZSQyIiwiZXF1YWwkMiIsIm1heCQ2IiwibWluJDYiLCJpIiwic3ltYm9sJDM3Iiwic3ltYm9sJDM4Iiwic3ltYm9sJDM5Iiwic3ltYm9sJDQwIiwic3ltYm9sJDQxIiwic3ltYm9sJDQyIiwiYXNjZW5kaW5nJDYiLCJkZXNjZW5kaW5nJDYiLCJjb21wYXJlJDMiLCJlcXVhbCQzIiwibWF4JDciLCJtaW4kNyIsInN5bWJvbCQ0MyIsInN5bWJvbCQ0NCIsInN5bWJvbCQ0NSIsInN5bWJvbCQ0NiIsInN5bWJvbCQ0NyIsInN5bWJvbCQ0OCIsImFzY2VuZGluZyQ3IiwiZGVzY2VuZGluZyQ3IiwiY29tcGFyZSQ0IiwiZXF1YWwkNCIsIm1heCQ4IiwibWluJDgiLCJzeW1ib2wkNDkiLCJzeW1ib2wkNTAiLCJzeW1ib2wkNTEiLCJzeW1ib2wkNTIiLCJzeW1ib2wkNTMiLCJzeW1ib2wkNTQiLCJhc2NlbmRpbmckOCIsImRlc2NlbmRpbmckOCIsImNvbXBhcmUkNSIsImVxdWFsJDUiLCJtYXgkOSIsIm1pbiQ5Iiwic3ltYm9sJDU1Iiwic3ltYm9sJDU2Iiwic3ltYm9sJDU3Iiwic3ltYm9sJDU4Iiwic3ltYm9sJDU5Iiwic3ltYm9sJDYwIiwiYXNjZW5kaW5nJDkiLCJkZXNjZW5kaW5nJDkiLCJjb21wYXJlJDYiLCJlcXVhbCQ2IiwibWF4JDEwIiwibWluJDEwIiwic3ltYm9sJDYxIiwic3ltYm9sJDYyIiwic3ltYm9sJDYzIiwic3ltYm9sJDY0IiwiYXNyIiwibGFuZCIsImxub3QkMCIsImxvciIsImxzbCIsImxzciIsImx4b3IiLCJtb2QiLCJhYnMkMCIsImZhaWx3aXRoJDAiLCJmc3QiLCJpbnZhbGlkX2FyZyQwIiwic25kIiwicGh5c19lcXVhbCIsImRlY3IiLCJpbmNyIiwiZmxvYXRfb2Zfc3RyaW5nIiwiYW1fdGVzdGluZyIsImZhaWx3aXRoZiIsImZtdCIsInMiLCJpbnZhbGlkX2FyZ2YiLCJiYWNrZW5kX3R5cGUiLCJpbnRlcmFjdGl2ZSIsIm9zX3R5cGUiLCJ1bml4Iiwid2luMzIiLCJjeWd3aW4iLCJ3b3JkX3NpemVfaW5fYml0cyIsImludF9zaXplX2luX2JpdHMiLCJiaWdfZW5kaWFuIiwibWF4X3N0cmluZ19sZW5ndGgiLCJtYXhfYXJyYXlfbGVuZ3RoIiwicnVudGltZV92YXJpYW50IiwicnVudGltZV9wYXJhbWV0ZXJzIiwiYXJndiIsImdldF9hcmd2Iiwib2NhbWxfdmVyc2lvbiIsImVuYWJsZV9ydW50aW1lX3dhcm5pbmdzIiwicnVudGltZV93YXJuaW5nc19lbmFibGVkIiwiZ2V0ZW52X2V4biIsInZhciQwIiwiZ2V0ZW52IiwibWF4X2xlbmd0aCIsImNyZWF0ZSIsImxlbiIsImNyZWF0ZV9mbG9hdF91bmluaXRpYWxpemVkIiwiYXBwZW5kIiwiYmxpdCIsImNvbmNhdCIsImNvcHkiLCJmaWxsIiwiaW5pdCIsIm1ha2VfbWF0cml4Iiwib2ZfbGlzdCIsInN1YiIsInRvX2xpc3QiLCJmb2xkIiwidCIsImYiLCJmb2xkX3JpZ2h0IiwiaXRlciIsIml0ZXJpIiwibWFwIiwibWFwaSIsInN0YWJsZV9zb3J0Iiwic3dhcCIsImoiLCJlbHRfaSIsImVsdF9qIiwiZXNjYXBlZCIsImxvd2VyY2FzZSIsInRvX2ludCIsInVuc2FmZV9vZl9pbnQiLCJ1cHBlcmNhc2UiLCJpbnRfaXNfb2siLCJtaW5fdmFsdWUiLCJtYXhfdmFsdWUiLCJvZl9pbnQiLCJvZl9pbnRfZXhuIiwidDEiLCJ0MiIsInRvX3N0cmluZyIsIm9mX3N0cmluZyIsInRvX2Zsb2F0Iiwib2ZfZmxvYXQiLCJzdWNjIiwiaGRfZXhuIiwibGVuZ3RoIiwicmV2X2FwcGVuZCIsInRsX2V4biIsInVuemlwIiwiZXhpc3RzIiwiZXhpc3RzMl9vayIsImwxIiwibDIiLCJmb2xkMl9vayIsImZvcl9hbGwiLCJmb3JfYWxsMl9vayIsIml0ZXIyX29rIiwibm9udGFpbF9tYXAiLCJub250YWlsX21hcGkiLCJwYXJ0aXRpb24iLCJyZXZfbWFwIiwicmV2X21hcDJfb2siLCJzb3J0IiwibCIsInJldiIsInJlcyIsInJlc3QiLCJhIiwiYiIsImhhc2hfZm9sZF91bml0IiwiaGFzaF9mb2xkX2ludCIsImhhc2hfZm9sZF9pbnQ2NCIsImhhc2hfZm9sZF9mbG9hdCIsImhhc2hfZm9sZF9zdHJpbmciLCJhc19pbnQiLCJoYXNoX2ZvbGRfaW50MzIiLCJoYXNoX2ZvbGRfY2hhciIsImhhc2hfZm9sZF9ib29sIiwiaGFzaF9mb2xkX25hdGl2ZWludCIsImhhc2hfZm9sZF9vcHRpb24iLCJoYXNoX2ZvbGRfZWxlbSIsImhhc2hfZm9sZF9saXN0IiwicyQxIiwibGlzdCQxIiwicyQyIiwibGlzdCIsImxpc3QkMCIsInMkMCIsImhhc2hfZm9sZF9sYXp5X3QiLCJoYXNoX2ZvbGRfcmVmX2Zyb3plbiIsImhhc2hfZm9sZF9hcnJheV9mcm96ZW4iLCJhcnJheSIsImUiLCJpJDAiLCJoYXNoX25hdGl2ZWludCIsImhhc2hfaW50NjQiLCJoYXNoX2ludDMyIiwiaGFzaF9jaGFyIiwiaGFzaF9pbnQiLCJoYXNoX2Jvb2wiLCJoYXNoX3N0cmluZyIsImhhc2hfZmxvYXQiLCJoYXNoX3VuaXQiLCJzZWVkIiwib2ZfZm9sZCIsImhhc2hfZm9sZF90IiwicnVuIiwiZm9sZGVyIiwib3B0Iiwic3RoIiwiY29tcGFyZV9zdGF0ZSIsInN0YXRlX3RvX3N0cmluZyIsInN0YXRlIiwidCQwIiwidCQxIiwidCQyIiwidCQzIiwidCQ0IiwidCQ1IiwiY29tcGFyZV9hYnN0cmFjdCIsInR5cGVfbmFtZSIsImVxdWFsX2Fic3RyYWN0IiwiY29tcGFyZV9ib29sIiwiY29tcGFyZV9jaGFyIiwiY29tcGFyZV9mbG9hdCIsImNvbXBhcmVfaW50IiwiY29tcGFyZV9pbnQzMiIsImNvbXBhcmVfaW50NjQiLCJjb21wYXJlX25hdGl2ZWludCIsImNvbXBhcmVfc3RyaW5nIiwiY29tcGFyZV91bml0IiwiY29tcGFyZV9hcnJheSIsImNvbXBhcmVfZWx0IiwibGVuX2EiLCJsZW5fYiIsInJldCIsInIiLCJjb21wYXJlX2xpc3QiLCJhJDAiLCJiJDAiLCJ5cyIsInhzIiwiY29tcGFyZV9vcHRpb24iLCJjb21wYXJlX3JlZiIsImVxdWFsX2Jvb2wiLCJlcXVhbF9jaGFyIiwiZXF1YWxfaW50IiwiZXF1YWxfaW50MzIiLCJlcXVhbF9pbnQ2NCIsImVxdWFsX25hdGl2ZWludCIsImVxdWFsX3N0cmluZyIsImVxdWFsX3VuaXQiLCJlcXVhbF9mbG9hdCIsImVxdWFsX2FycmF5IiwiZXF1YWxfZWx0IiwiZXF1YWxfbGlzdCIsImVxdWFsX29wdGlvbiIsImVxdWFsX3JlZiIsImFfMDAxIiwiYl8wMDIiLCJhXzAwMyIsImJfMDA0IiwiYV8wMDUiLCJiXzAwNiIsImhhc2giLCJoc3YiLCJhcmciLCJhMCIsImhzdiQwIiwiYTAkMCIsImhzdiQxIiwidF9zZXhwX2dyYW1tYXIiLCJpbnZhcmlhbnQiLCJzZXhwX29mX3QiLCJudW1fYml0cyIsIndvcmRfc2l6ZSIsImFsbCIsInJlZ2lzdGVyIiwicCIsInBwIiwibW9kdWxlX25hbWUiLCJmb3JtYXR0ZXIiLCJhcmcxXzAwMiIsImFyZzBfMDAxIiwicmVzMF8wMDMiLCJyZXMxXzAwNCIsImFyZzFfMDA2IiwiYXJnMF8wMDUiLCJyZXMwXzAwNyIsInJlczFfMDA4IiwiY3JlYXRlX3MiLCJzZXhwIiwicmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UiLCJiYWNrdHJhY2UiLCJyZXJhaXNlIiwiZXhuIiwic3RyIiwiZXhuJDAiLCJidCIsInJlcmFpc2VmIiwiZXhjIiwiZm9ybWF0IiwidG9fc3RyaW5nX21hY2giLCJzZXhwX29mX3QkMCIsInByb3RlY3R4IiwiZmluYWxseSQwIiwiZmluYWxfZXhuJDAiLCJmaW5hbF9leG4iLCJwcm90ZWN0IiwiZG9lc19yYWlzZSIsInBwZiIsInByaW50X3dpdGhfYmFja3RyYWNlIiwicmF3X2JhY2t0cmFjZSIsImhhbmRsZV91bmNhdWdodF9hdXgiLCJleGMkMCIsImhhbmRsZV91bmNhdWdodF9hbmRfZXhpdCIsImhhbmRsZV91bmNhdWdodCIsIm11c3RfZXhpdCIsImV4aXQkMCIsInJlcmFpc2VfdW5jYXVnaHQiLCJmdW5jIiwicmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UiLCJpbml0aWFsaXplX21vZHVsZSIsImNsZWFyX2JhY2t0cmFjZSIsIndpdGhfcmV0dXJuIiwiaXNfYWxpdmUiLCJyZXR1cm4kMCIsIndpdGhfcmV0dXJuX29wdGlvbiIsInByZXBlbmQiLCJwYXJhbSIsInN5bWJvbF9iaW5kIiwic3ltYm9sX21hcCIsImJpbmQiLCJqb2luIiwiaWdub3JlX20iLCJhbGxfdW5pdCIsIm1hcF92aWFfYmluZCIsIm1hIiwic3ltYm9sX2JpbmQkMCIsInN5bWJvbF9tYXAkMCIsInN5bWJvbF9iaW5kJDEiLCJzeW1ib2xfbWFwJDEiLCJib3RoIiwibG9vcCIsInZzIiwidHMiLCJ2IiwiYmluZCQwIiwicmV0dXJuJDEiLCJtYXAkMCIsInRvX21vbmFkIiwib2ZfbW9uYWQiLCJkZXJpdmVkX21hcCIsIm1hcDIiLCJ0YSIsInRiIiwibWFwMyIsInRjIiwic3ltYm9sJDAiLCJ1Iiwic3ltYm9sJDEiLCJ0ZiIsImZhYiIsImMiLCJhcHBseSIsIm1mIiwibXgiLCJ0eCIsImN1c3RvbV9tYXAiLCJhcHBseSQwIiwiYmxpdF9zdHJpbmciLCJtYWtlIiwidW5zYWZlX2JsaXQiLCJ1bnNhZmVfdG9fc3RyaW5nIiwidW5zYWZlX29mX3N0cmluZ19wcm9taXNlX25vX211IiwiY29tcGFyYXRvciIsImVycm9yX3NvdXJjZV8wMTEiLCJjbXBfZiIsImNtcF9zIiwiaGFzaF9mb2xkX2YiLCJoYXNoX2ZvbGRfcyIsInRfb2Zfc2V4cCIsIm9mX2ZfMDA3Iiwib2Zfc18wMDgiLCJzZXhwXzAxMyIsInRhZ18wMTQiLCJzZXhwX2FyZ3NfMDIwIiwiYXJnMF8wMjEiLCJyZXMwXzAyMiIsInNleHBfYXJnc18wMTUiLCJhcmcwXzAxNiIsInJlczBfMDE3Iiwib2ZfZl8wMjUiLCJvZl9zXzAyNiIsImFyZzBfMDI3IiwicmVzMF8wMjgiLCJhcmcwXzAyOSIsInJlczBfMDMwIiwiZl9zZXhwX2dyYW1tYXIiLCJzX3NleHBfZ3JhbW1hciIsIm9wYXF1ZV9pZGVudGl0eSIsIm5hbWUiLCJnZXQiLCJmc2V0Iiwic2V0dGVyIiwidXBkYXRlciIsImZpZWxkIiwiY2FwaXRhbGl6ZSIsInVuY2FwaXRhbGl6ZSIsInNlcCIsIm4iLCJuJDAiLCJuJDEiLCJoc3YkMiIsInBvc19jbnVtXzAxMCIsInBvc19ib2xfMDA4IiwicG9zX2xudW1fMDA2IiwicG9zX2ZuYW1lXzAwNCIsImFyZ18wMTEiLCJibmRzXzAwMyIsImFyZ18wMDkiLCJibmRzXzAwMyQwIiwiYXJnXzAwNyIsImJuZHNfMDAzJDEiLCJhcmdfMDA1IiwiYm5kc18wMDMkMiIsImhhc2hfZm9sZF90JDAiLCJoYXNoJDAiLCJtYWtlX2xvY2F0aW9uX3N0cmluZyIsInBvc19mbmFtZSIsInBvc19sbnVtIiwicG9zX2NudW0iLCJwb3NfYm9sIiwiaXNfZW1wdHkiLCJwYXJ0aXRpb25fbWFwIiwiZnN0JDAiLCJ5JDAiLCJzbmQkMCIsImVycm9yX3NvdXJjZV8wMDUiLCJvZl9hXzAwMSIsIm9mX2JfMDAyIiwic2V4cF8wMDciLCJ0YWdfMDA4Iiwic2V4cF9hcmdzXzAwOSIsImFyZzBfMDEwIiwicmVzMF8wMTEiLCJzZXhwX2FyZ3NfMDE0IiwiYXJnMF8wMTUiLCJyZXMwXzAxNiIsIm9mX2FfMDE5Iiwib2ZfYl8wMjAiLCJhcmcwXzAyMyIsInJlczBfMDI0IiwiYV9zZXhwX2dyYW1tYXIiLCJiX3NleHBfZ3JhbW1hciIsImNtcF9hIiwiY21wX2IiLCJhXzAyNyIsImJfMDI4IiwiYV8wMjkiLCJiXzAzMCIsImFfMDMxIiwiYl8wMzIiLCJhXzAzMyIsImJfMDM0IiwiYV8wMzUiLCJiXzAzNiIsImFfMDM3IiwiYl8wMzgiLCJoYXNoX2ZvbGRfYSIsImhhc2hfZm9sZF9iIiwieCQwIiwiY2hlY2tfb2siLCJjaGVja19lcnJvciIsIm9rIiwiZXJyb3IiLCJmYWlsIiwiZmFpbGYiLCJtYXBfZXJyb3IiLCJiaW5kJDEiLCJtYXAkMSIsInJldHVybiQyIiwiaXNfb2siLCJpc19lcnJvciIsIm9mX29wdGlvbiIsIml0ZXJfZXJyb3IiLCJ0b19laXRoZXIiLCJvZl9laXRoZXIiLCJva19pZl90cnVlIiwiYm9vbCIsInRyeV93aXRoIiwib2tfZXhuIiwib2tfb3JfZmFpbHdpdGgiLCJjb21iaW5lIiwiZXJyIiwib2sxIiwib2syIiwiZXJyMSIsImVycjIiLCJjb21iaW5lX2Vycm9ycyIsImVycnMiLCJjb21iaW5lX2Vycm9yc191bml0IiwiY291bnQiLCJzdW0iLCJNIiwiZm9sZF9yZXN1bHQiLCJhY2MiLCJpdGVtIiwiZm9sZF91bnRpbCIsImZpbmlzaCIsIm1pbl9lbHQiLCJlbHQiLCJtYXhfZWx0IiwiZmluZF9tYXAiLCJmaW5kIiwidG9fYXJyYXkiLCJpdGVyJDAiLCJpdGVyJDEiLCJsZW5ndGgkMCIsImxlbmd0aCQxIiwiaXNfZW1wdHkkMCIsInN1bSQwIiwibSIsImNvdW50JDAiLCJleGlzdHMkMCIsImZvcl9hbGwkMCIsImZpbmRfbWFwJDAiLCJmaW5kJDAiLCJ0b19saXN0JDAiLCJ0b19hcnJheSQwIiwibWluX2VsdCQwIiwibWF4X2VsdCQwIiwiZm9sZF9yZXN1bHQkMCIsImZvbGRfdW50aWwkMCIsImZvbGQkMCIsIm1lbSIsImNvbXBhcmVfYSIsImVxdWFsX2EiLCJzZXhwX29mX2EiLCJzbG93X2NoZWNrX3Bvc19sZW5fZXhuIiwicG9zIiwidG90YWxfbGVuZ3RoIiwiY2hlY2tfcG9zX2xlbl9leG4iLCJzdG9wIiwiZ2V0X3Bvc19sZW5fZXhuIiwibGVuJDAiLCJvZl9zdGF0ZSIsImFzc2lnbiIsImRzdCIsInNyYyIsImRzdCQwIiwic3JjJDAiLCJtYWtlX2RlZmF1bHQiLCJkZWZhdWx0JDAiLCJzcGxpdF9mcm9tX3BhcmVudCIsImdldF9zdGF0ZSIsInJhbmRvbV9rZXkiLCJmb3JiaWRfbm9uZGV0ZXJtaW5pc21faW5fdGVzdHMiLCJhbGxvd19pbl90ZXN0cyIsImJpdHMiLCJpbnQkMCIsImludDMyIiwiaW50NjQiLCJuYXRpdmVpbnQiLCJjaGFyJDAiLCJhc2NpaSIsIm1ha2Vfc2VsZl9pbml0IiwiaW50X29uXzY0Yml0cyIsImJvdW5kIiwiaW50X29uXzMyYml0cyIsImludCQxIiwiYml0cyQwIiwiZnVsbF9yYW5nZV9pbnQ2NCIsImJpdHMkMSIsImZ1bGxfcmFuZ2VfaW50MzIiLCJmdWxsX3JhbmdlX2ludF9vbl82NGJpdHMiLCJmdWxsX3JhbmdlX2ludF9vbl8zMmJpdHMiLCJmdWxsX3JhbmdlX2ludF9vbl82NGJpdHMkMCIsImZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzY0Yml0cyIsImZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzMyYml0cyIsImZ1bGxfcmFuZ2VfbmF0aXZlaW50IiwicmFpc2VfY3Jvc3NlZF9ib3VuZHMiLCJsb3dlcl9ib3VuZCIsInVwcGVyX2JvdW5kIiwic3RyaW5nX29mX2JvdW5kIiwiaW50X2luY2wiLCJsbyIsImhpIiwiZGlmZiIsImludDMyX2luY2wiLCJuYXRpdmVpbnRfaW5jbCIsImludDY0X2luY2wiLCJmbG9hdCQwIiwicjEiLCJyMiIsInJlc3VsdCIsImZsb2F0X3JhbmdlIiwiZGVmYXVsdCQxIiwiYml0cyQyIiwiaW50JDIiLCJpbnQzMiQwIiwibmF0aXZlaW50JDAiLCJpbnQ2NCQwIiwiZmxvYXQkMSIsImludF9pbmNsJDAiLCJpbnQzMl9pbmNsJDAiLCJuYXRpdmVpbnRfaW5jbCQwIiwiaW50NjRfaW5jbCQwIiwiZmxvYXRfcmFuZ2UkMCIsImJvb2wkMCIsImNoYXIkMSIsImFzY2lpJDAiLCJmdWxsX2luaXQiLCJzZWxmX2luaXQiLCJzZXRfc3RhdGUiLCJwZXJtdXRlIiwicmFuZG9tX3N0YXRlIiwic3RoJDAiLCJudW1fc3dhcHMiLCJ0aGlzX2kiLCJyYW5kb21faSIsImNvbnN0JDAiLCJub24iLCJmb3JldmVyIiwiZSQwIiwiY29tcG9zZSIsImciLCJmbGlwIiwiYXBwbHlfbl90aW1lcyIsIngkMSIsInNleHBfMDA2IiwiZXJyb3Jfc291cmNlXzAyMiIsImZvbGRfbGVmdCIsImFfMDA2IiwiYl8wMDciLCJhXzAwOCIsImJfMDA5Iiwib2ZfYV8wMTAiLCJhcmcwXzAxMSIsInJlczBfMDEyIiwicmFuZ2UiLCJzdHJpZGUiLCJzdGFydF9pIiwic3RvcF9pIiwic3RhcnQiLCJuZXh0X2kiLCJvcmRlciIsInJhaXNlX3N0cmlkZV9jYW5ub3RfcmV0dXJuX3NhbSIsImluaXRpYWxfc3RyaWRlX29yZGVyIiwic3RhcnRfaSQwIiwiYWNjdW0iLCJpX3RvX3N0b3Bfb3JkZXIiLCJuZXh0X2kkMCIsImFjY3VtJDAiLCJyYW5nZSQwIiwic3RoJDEiLCJoZCIsInRsIiwibnRoIiwibnRoX2V4biIsInVub3JkZXJlZF9hcHBlbmQiLCJvZl9saXN0cyIsInNoYXJlZF9sZW5ndGgiLCJzaGFyZWRfbGVuZ3RoJDAiLCJjaGVja19sZW5ndGgyX2V4biIsInRhaWxfb2ZfYiIsInRhaWxfb2ZfYSIsImNoZWNrX2xlbmd0aDIiLCJvZl9saXN0cyQwIiwibDMiLCJjJDAiLCJjaGVja19sZW5ndGgzX2V4biIsInRhaWxfb2ZfYyIsIm4xIiwibjIiLCJuMyIsImNoZWNrX2xlbmd0aDMiLCJpdGVyMiIsIml0ZXIyX2V4biIsInJldl9tYXAyIiwicmV2X21hcDJfZXhuIiwiZm9sZDIiLCJmb2xkMl9leG4iLCJmb3JfYWxsMiIsImZvcl9hbGwyX2V4biIsImV4aXN0czIiLCJleGlzdHMyX2V4biIsImJzIiwicmV2X2ZpbHRlciIsImFjY3UiLCJmaWx0ZXIiLCJub3RfZm91bmQiLCJmaW5kX21hcF9leG4iLCJub3RfZm91bmQkMCIsImZpbmRfZXhuIiwiZmluZGkiLCJub3RfZm91bmQkMSIsImZpbmRpX2V4biIsImZpbmRfbWFwaSIsIm5vdF9mb3VuZCQyIiwiZmluZF9tYXBpX2V4biIsImZvcl9hbGxpIiwiZXhpc3RzaSIsIm1heF9ub25fdGFpbGNhbGwiLCJjb3VudF9hcHBlbmQiLCJ4MSIsIngyIiwieDMiLCJ4NCIsIng1IiwiY291bnRfbWFwIiwiY3RyIiwieDEkMCIsImYxJDMiLCJ4MiQwIiwiZjEkMiIsImYyJDIiLCJ4MyQwIiwiZjEkMSIsImYyJDEiLCJmMyQxIiwieDQkMCIsImYxJDAiLCJmMiQwIiwiZjMkMCIsImY0JDAiLCJ4NSQwIiwiZjEiLCJmMiIsImYzIiwiZjQiLCJmNSIsImJzJDAiLCJ4cyQwIiwieDgiLCJ4NyIsIng2IiwieDAiLCJ5MCQwIiwieTEkMCIsInkyJDAiLCJ5MyQwIiwieTQkMCIsInk1JDAiLCJ5NiQwIiwieTckMCIsInk4JDAiLCJ5OCIsInk3IiwieTYiLCJ5NSIsInk0IiwieTMiLCJ5MiIsInkxIiwieTAiLCJmb2xkaW5nX21hcCIsIm5ld19hY2MiLCJmb2xkX21hcCIsIm1hcDJfb2siLCJtYXAyX2V4biIsInJldl9tYXAzX29rIiwibDEkMCIsImwyJDAiLCJsMyQwIiwiYWMiLCJsMyQxIiwibDIkMSIsImwxJDEiLCJhYyQwIiwicmV2X21hcDMiLCJyZXZfbWFwM19leG4iLCJtYXAzX29rIiwibWFwM19leG4iLCJyZXZfbWFwX2FwcGVuZCIsImgiLCJsaXN0JDIiLCJ1bnppcDMiLCJ6IiwiemlwX2V4biIsInppcCIsInJldl9tYXBpIiwiZm9sZGluZ19tYXBpIiwiZm9sZF9tYXBpIiwiZm9sZGkiLCJmaWx0ZXJpIiwicmVkdWNlIiwicmVkdWNlX2V4biIsInJlZHVjZV9iYWxhbmNlZCIsInN0ZXBfYWNjdW0iLCJudW0iLCJudW0kMCIsImFjYyQwIiwiYWNjJDEiLCJudW0kMSIsInJlZHVjZV9iYWxhbmNlZF9leG4iLCJncm91cGkiLCJicmVhayQwIiwiZ3JvdXBzIiwiY3VycmVudF9ncm91cCIsImdyb3VwIiwic29ydF9hbmRfZ3JvdXAiLCJjb25jYXRfbWFwIiwiY29uY2F0X21hcGkiLCJjb250IiwibWVyZ2UiLCJoMiIsImgxIiwibWFwMiQwIiwibWFwMyQwIiwic3ltYm9sJDIiLCJsYXN0X2V4biIsImxhc3QiLCJpc19wcmVmaXgiLCJwcmVmaXgiLCJwcmVmaXgkMCIsInByZWZpeCQxIiwiaGQkMCIsImZpbmRfY29uc2VjdXRpdmVfZHVwbGljYXRlIiwiYTEiLCJhMSQwIiwiYTIiLCJyZW1vdmVfY29uc2VjdXRpdmVfZHVwbGljYXRlcyIsIndoaWNoX3RvX2tlZXAiLCJ0bCQwIiwidG9fa2VlcCQyIiwidG9fa2VlcCIsInRvX2tlZXAkMCIsInRvX2tlZXAkMSIsImRlZHVwX2FuZF9zb3J0Iiwic29ydGVkIiwiZmluZF9hX2R1cCIsImwkMCIsImhkMiIsImhkMSIsImNvbnRhaW5zX2R1cCIsImxzdCIsImZpbmRfYWxsX2R1cHMiLCJzb3J0ZWQkMiIsInByZXYkMSIsInNvcnRlZCQwIiwicHJldiIsImFscmVhZHlfcmVjb3JkZWQiLCJzb3J0ZWQkMSIsInByZXYkMCIsImFsbF9lcXVhbCIsImNvdW50aSIsImlkeCIsInJldl9maWx0ZXJfbWFwIiwiZmlsdGVyX21hcCIsInJldl9maWx0ZXJfbWFwaSIsImkkMSIsImZpbHRlcl9tYXBpIiwiZmlsdGVyX29wdCIsInBhcnRpdGlvbjNfbWFwIiwidHJkIiwidHJkJDAiLCJ5JDEiLCJwYXJ0aXRpb25fdGYiLCJmJDAiLCJwYXJ0aXRpb25fcmVzdWx0IiwidF9vZl9zZXhwJDAiLCJvZl9hXzAxNCIsIm9mX2JfMDE1IiwieF8wMjMiLCJzZXhwXzAyMSIsImFyZzFfMDE4IiwiYXJnMF8wMTciLCJyZXMwXzAxOSIsInJlczFfMDIwIiwic2V4cF9vZl90JDEiLCJvZl9hXzAyNCIsIm9mX2JfMDI1IiwieF8wMzAiLCJhcmcxXzAyNyIsImFyZzBfMDI2IiwicmVzMV8wMjkiLCJ0X3NleHBfZ3JhbW1hciQwIiwicGFpcl9vZl9ncm91cCIsImsiLCJncm91cCQwIiwiYWxpc3QiLCJzb3J0X2FuZF9ncm91cCQwIiwia2V5Iiwia2V5JDAiLCJub3RfZm91bmQkMyIsImZpbmRfZXhuJDAiLCJ2YWx1ZSIsIm1lbSQwIiwicmVtb3ZlIiwiYWRkIiwiaW52ZXJzZSIsIm1hcCQyIiwiZWwiLCJzcGxpdF9uIiwidF9vcmlnIiwidGFrZSIsImRyb3AiLCJjaHVua3Nfb2YiLCJsJDEiLCJzdWJsaXN0Iiwic3BsaXRfd2hpbGUiLCJ0YWtlX3doaWxlIiwiZHJvcF93aGlsZSIsImRyb3BfbGFzdCIsImRyb3BfbGFzdF9leG4iLCJjYXJ0ZXNpYW5fcHJvZHVjdCIsImxpc3QxIiwibGlzdDIiLCJjb25jYXRfbm9fb3JkZXIiLCJjb25zIiwiaXNfc29ydGVkIiwiaXNfc29ydGVkX3N0cmljdGx5IiwiYXJyIiwicmFuZG9tX2VsZW1lbnRfZXhuIiwicmFuZG9tX2VsZW1lbnQiLCJjbXAiLCJ0MSQwIiwidDIkMCIsInQyJDEiLCJ0MSQxIiwidHJhbnNwb3NlIiwicm93cyQwIiwicm93cyIsImNvbHVtbnMiLCJkb19yZXYiLCJjb2x1bW5fYWNjIiwidHJpbW1lZF9yb3dzIiwiZm91bmRfZW1wdHkiLCJjb2x1bW4iLCJkb19yZXYkMCIsImNvbHVtbnMkMCIsInRyaW1tZWQiLCJjb2x1bW5fYWNjJDAiLCJhcmcwXzAzMSIsInJlczBfMDMyIiwidHJhbnNwb3NlX2V4biIsImludGVyc3BlcnNlIiwiaXNfc3VmZml4Iiwic3VmZml4IiwibGlzdF9sZW4iLCJzdWZmaXhfbGVuIiwicmVzMF8wMDIiLCJhcmcwXzAwMyIsInJlczBfMDA0IiwicmVzMF8wMDYiLCJhcmcwXzAwNyIsInJlczBfMDA4IiwiYXJnMl8wMTEiLCJhcmcxXzAxMCIsImFyZzBfMDA5IiwicmVzMV8wMTMiLCJyZXMyXzAxNCIsImFyZzFfMDE2IiwicmVzMV8wMTgiLCJhcmcyXzAyMSIsImFyZzFfMDIwIiwiYXJnMF8wMTkiLCJyZXMxXzAyMyIsInJlczJfMDI0IiwiYXJnMV8wMjYiLCJhcmcwXzAyNSIsInJlczBfMDI3IiwicmVzMV8wMjgiLCJhcmcxXzAzMCIsInJlczBfMDMxIiwicmVzMV8wMzIiLCJ0b19zdHJpbmdzX2h1bSIsInN0cmluZyIsInNleHAkMCIsInNleHAkMSIsInRhZyIsInRhZyQwIiwic2V4cCQyIiwidGFnJDEiLCJib2R5IiwidHJ1bmNfYWZ0ZXIiLCJ0cyQwIiwidHMkMSIsImFjJDEiLCJ0b19zZXhwc19odW0iLCJoZXJlIiwiaGVyZSQwIiwidG9fc2V4cF9odW0iLCJzZXhwcyIsInRvX21lc3NhZ2UiLCJpbmZvIiwib2ZfbWVzc2FnZSIsInRvX3N0cmluZ19odW0iLCJtZXNzYWdlIiwidG9fc3RyaW5nX2h1bV9kZXByZWNhdGVkIiwib2ZfbGF6eSIsIm9mX2xhenlfc2V4cCIsIm9mX2xhenlfdCIsImxhenlfdCIsImNyZWF0ZWYiLCJvZl90aHVuayIsInN0cmljdCIsInNleHBfb2ZfeCIsInRhZ19zX2xhenkiLCJ0YWdfcyIsInRhZ19hcmciLCJ0b19leG4iLCJvZl9leG4iLCJiYWNrdHJhY2UkMCIsImJhY2t0cmFjZSQxIiwiYmFja3RyYWNlJDIiLCJyYWlzZSIsInJhaXNlX3MiLCJ0b19pbmZvIiwib2ZfaW5mbyIsImNoZWNrX2ZpZWxkIiwiYV8wMDciLCJiXzAwOCIsIm9mX2FfMDEzIiwieF8wMTUiLCJvZl9hXzAxNiIsInhfMDE3IiwiaW52YXJpYW50X2EiLCJlMSIsImUyIiwidHJ5X3dpdGhfam9pbiIsIm9mX2V4bl9yZXN1bHQiLCJlcnJvcl9zIiwiZXJyb3Jfc3RyaW5nIiwiZXJyb3JmIiwidW5pbXBsZW1lbnRlZCIsImZpbHRlcl9va19hdF9sZWFzdF9vbmUiLCJmaW5kX29rIiwiZmluZF9tYXBfb2siLCJlcnJvcl9zb3VyY2VfMDAzIiwic2V4cF8wMDQiLCJnZXEiLCJsZXEiLCJiZXR3ZWVuIiwibG93IiwiaGlnaCIsImNsYW1wX3VuY2hlY2tlZCIsImNsYW1wX2V4biIsImNsYW1wIiwibGV4aWNvZ3JhcGhpYyIsImNtcHMiLCJjbXBzJDAiLCJsaWZ0IiwicmV2ZXJzZSIsImlzX3Bvc2l0aXZlIiwiaXNfbm9uX25lZ2F0aXZlIiwiaXNfbmVnYXRpdmUiLCJpc19ub25fcG9zaXRpdmUiLCJzaWduIiwiaGFzaF9wYXJhbSIsInBvbHkiLCJvZl9rZXkiLCJLZXkiLCJ0b19rZXkiLCJoYXNoX3BhcmFtJDAiLCJwb2x5JDAiLCJvZl9rZXkkMCIsInRvX2tleSQwIiwiaGFzaGFibGUiLCJnZXRfcG9zX2xlbiIsImZpbmRfZmlyc3Rfc2F0aXNmeWluZyIsInByZWQiLCJwb3MkMCIsImhpJDAiLCJsbyQxIiwibWlkIiwibG8kMiIsImxvJDAiLCJmaW5kX2xhc3Rfc2F0aXNmeWluZyIsImJpbmFyeV9zZWFyY2giLCJob3ciLCJiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCIsInNlZ21lbnRfb2YiLCJpc19sZWZ0IiwiaXNfcmlnaHQiLCJhbGwkMCIsInNyY19wb3MiLCJkc3RfcG9zIiwiYmxpdG8iLCJzcmNfbGVuIiwic3VibyIsImNyZWF0ZV9saWtlIiwidW5zYWZlX2JsaXQkMCIsImlzX25vbmUiLCJpc19zb21lIiwidmFsdWVfbWFwIiwibyIsImNhbGwiLCJ2YWx1ZV9leG4iLCJlcnJvciQwIiwibSQwIiwibSQxIiwidmFsdWVfb3JfdGh1bmsiLCJzb21lIiwiZmlyc3Rfc29tZSIsInNvbWVfaWYiLCJjb25kIiwiYV9vZl9zZXhwIiwiYl9vZl9zZXhwIiwic2V4cF9vZl9iIiwiY19vZl9zZXhwIiwic2V4cF9vZl9jIiwiaXNfZmlyc3QiLCJpc19zZWNvbmQiLCJmaXJzdCIsInNlY29uZCIsImVxMSIsImVxMiIsIm90aGVyIiwiZWl0aGVyIiwib3RoZXJfbG9vcCIsInJldHVybl9sb29wIiwiY29tYmluZV9hbGwiLCJvdGhlcl9sb29wJDAiLCJyZXR1cm5fbG9vcCQwIiwiY29tYmluZV9hbGxfdW5pdCIsInRvX29wdGlvbiIsImVpdGhlciQwIiwiY29tYmluZSQwIiwiaXRlcmkkMCIsIml0ZXJpJDEiLCJmb2xkaSQwIiwiZm9sZGkkMSIsImNvdW50aSQwIiwiZXhpc3RzaSQwIiwiZm9yX2FsbGkkMCIsImZpbmRfbWFwaSQwIiwiZmluZGkkMCIsImVycm9yX3NvdXJjZV8wMjUiLCJvZl9zXzAwMiIsIm5leHRfc3RlcCIsImRlbGF5ZWRfZm9sZF9zdGVwIiwibmV4dCIsInVuZm9sZF9zdGVwIiwidW5mb2xkIiwidW5mb2xkX3dpdGgiLCJzZWVkJDAiLCJzZWVkJDEiLCJ1bmZvbGRfd2l0aF9hbmRfZmluaXNoIiwicnVubmluZ19zdGVwIiwiaW5uZXJfZmluaXNoZWQiLCJmaW5pc2hpbmdfc3RlcCIsInN0YXRlJDAiLCJzdGF0ZSQxIiwic3RhdGUkMiIsImlubmVyX3N0YXRlIiwic3RhdGUkMyIsImlubmVyX3N0YXRlJDAiLCJpbm5lcl9zdGF0ZSQxIiwic3RhdGUkNCIsInN0YXRlJDUiLCJzZWVkJDIiLCJ2JDAiLCJ0b19saXN0X3JldiIsInN0YXJ0X3YiLCJzdG9wX3YiLCJzdGVwIiwidF9sYXp5IiwibCQyIiwic29tZV9iIiwiZW1wdHkiLCJuZXh0JDAiLCJzJDMiLCJhXzAxMSIsImJfMDEyIiwiYV8wMTMiLCJiXzAxNCIsImFfMDE1IiwiYl8wMTYiLCJhXzAxOSIsImFfMDE3IiwiYl8wMjAiLCJiXzAxOCIsImEwJDEiLCJoc3YkMyIsIm9mX2FfMDIxIiwib2ZfYl8wMjIiLCJzZXhwXzAyNyIsInRhZ18wMjgiLCJzZXhwX2FyZ3NfMDM0IiwiYXJnMF8wMzUiLCJyZXMwXzAzNiIsInNleHBfYXJnc18wMjkiLCJhcmcwXzAzMCIsInNleHBfYXJnc18wMzkiLCJhcmcxXzA0MSIsImFyZzBfMDQwIiwicmVzMF8wNDIiLCJyZXMxXzA0MyIsIm9mX2FfMDQ2Iiwib2ZfYl8wNDciLCJhcmcwXzA0OCIsInJlczBfMDQ5IiwiYXJnMF8wNTAiLCJyZXMwXzA1MSIsImFyZzFfMDUzIiwiYXJnMF8wNTIiLCJyZXMwXzA1NCIsInJlczFfMDU1IiwibWVyZ2Vfd2l0aF9kdXBsaWNhdGVzIiwibmV4dDIiLCJzMiIsIm5leHQxIiwiczEiLCJzMiQwIiwiczIkMSIsInMxJDAiLCJzMiQyIiwiczEkMSIsInMyJDMiLCJjb21wYXJpc29uIiwibWVyZ2VfZGVkdXBlZF9hbmRfc29ydGVkIiwibWVyZ2Vfc29ydGVkIiwidGxfZWFnZXJseV9leG4iLCJsaWZ0X2lkZW50aXR5IiwiY2h1bmtzX2V4biIsInppcF9mdWxsIiwiYm91bmRlZF9sZW5ndGgiLCJhdF9tb3N0IiwibGVuZ3RoX2lzX2JvdW5kZWRfYnkiLCJjdXIiLCJjdXIkMCIsImxhc3RfZWx0IiwibGFzdF9lbHQkMCIsInNoaWZ0X3JpZ2h0Iiwic2hpZnRfcmlnaHRfd2l0aF9saXN0IiwicyQ1IiwiYSQxIiwicyQ0IiwicmVwZWF0IiwiY3ljbGVfbGlzdF9leG4iLCJzYSIsInNiIiwic2luZ2xldG9uIiwiZGVsYXllZF9mb2xkIiwib3B0aW9uIiwiZm9sZF9tIiwiaXRlcl9tIiwiZm9yY2VfZWFnZXJseSIsIm1lbW9pemUiLCJkcm9wX2VhZ2VybHkiLCJkcm9wX3doaWxlX29wdGlvbiIsInYyIiwidjEiLCJyb3VuZF9yb2JpbiIsImRvbmVfc3RhY2siLCJ0b2RvX3N0YWNrIiwidG9kb19zdGFjayQwIiwiaW50ZXJsZWF2ZSIsImludGVybGVhdmVkX2NhcnRlc2lhbl9wcm9kdWN0Iiwib2Zfc2VxIiwic2VxIiwidG9fc2VxIiwieWllbGQkMCIsIm9mX3NlcXVlbmNlIiwic2VxdWVuY2UiLCJ0aHVuayIsInNldCIsInN3YXAkMCIsInRtcCIsImxlZnQiLCJyaWdodCIsImZpbmFsX3BvcyIsImlfbmV4dCIsImhlYXBpZnkiLCJyb290Iiwicm9vdCQwIiwicmVsYXRpdmVfcm9vdCIsImxlZnRfY2hpbGQiLCJyaWdodF9jaGlsZCIsImxhcmdlc3QiLCJsYXJnZXN0JDAiLCJzb3J0JDAiLCJmaXZlX2VsZW1lbnRfc29ydCIsIm0xIiwibTIiLCJtMyIsIm00IiwibTUiLCJjb21wYXJlX2FuZF9zd2FwIiwiaW50cm9fc29ydCIsIm1heF9kZXB0aCIsIm1heF9kZXB0aCQwIiwibGVmdCQwIiwibWF4X2RlcHRoJDEiLCJzaXh0aCIsIm0yX3ZhbCIsIm0zX3ZhbCIsIm00X3ZhbCIsIm1pZGRsZV9zb3J0ZWQiLCJwaXZvdDIiLCJwaXZvdDEiLCJwJDEiLCJyJDIiLCJsZWZ0JDEiLCJwdiIsInAkMCIsInIkMCIsInIkMSIsInNvcnQkMSIsInNvcnQkMiIsImVsdF9pX21pbnVzXzEiLCJtZXJnZWQiLCJhMV9pbmRleCIsImEyX2luZGV4IiwidXNlX2ExIiwiY29weV9tYXRyaXgiLCJyZXZfaW5wbGFjZSIsIm9mX2xpc3RfcmV2Iiwib2ZfbGlzdF9tYXAiLCJvZl9saXN0X21hcGkiLCJvZl9saXN0X3Jldl9tYXAiLCJvZl9saXN0X3Jldl9tYXBpIiwibWFwX2lucGxhY2UiLCJmaW5kaV9pbnRlcm5hbCIsImlmX2ZvdW5kIiwiaWZfbm90X2ZvdW5kIiwiZm91bmQiLCJ2YWx1ZV9mb3VuZCIsInJlczEiLCJyZXMyIiwic29ydGVkX2NvcHkiLCJwYXJ0aXRpb25pX3RmIiwidHJ1ZXMiLCJmYWxzZXMiLCJ0b19zZXF1ZW5jZV9tdXRhYmxlIiwidG9fc2VxdWVuY2UiLCJpMSIsImkyIiwidHQiLCJ3aWR0aCIsImRlcHRoIiwiZCIsInciLCJ0dCQwIiwiZ2V0JDAiLCJ6ZXJvX29iaiIsImNyZWF0ZV96ZXJvIiwidW5zYWZlX2dldCIsInVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSIsIm9iaiIsInNldF93aXRoX2NhbWxfbW9kaWZ5IiwidW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVuIiwib2xkX29iaiIsInVuc2FmZV9zZXQiLCJ1bnNhZmVfc2V0X29taXRfcGh5c19lcXVhbF9jaGUiLCJ1bnNhZmVfc2V0X2Fzc3VtaW5nX2N1cnJlbnRseV8iLCJ1bnNhZmVfc2V0X2ludCIsInVuc2FmZV9jbGVhcl9pZl9wb2ludGVyIiwidW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIiwiY3JlYXRlX29ial9hcnJheSIsIm9mX2FycmF5IiwiZ3JhbW1hciIsImNlaWwiLCJmbG9vciIsIm1vZF9mbG9hdCIsIm1vZGYiLCJtYXhfZmluaXRlX3ZhbHVlIiwiY2xhc3NpZnlfZmxvYXQiLCJhYnNfZmxvYXQiLCJpc19pbnRlZ2VyIiwiZnJleHAiLCJsZGV4cCIsImlzX25hbiIsInRvX2ludDY0X3ByZXNlcnZlX29yZGVyIiwidG9faW50NjRfcHJlc2VydmVfb3JkZXJfZXhuIiwib2ZfaW50NjRfcHJlc2VydmVfb3JkZXIiLCJvbmVfdWxwIiwiZGlyIiwidXBwZXJfYm91bmRfZm9yX2ludCIsImV4cCIsImlzX3hfbWludXNfb25lX2V4YWN0IiwibG93ZXJfYm91bmRfZm9yX2ludCIsIm1pbl9pbnRfYXNfZmxvYXQiLCJib3giLCJpc19sb3dlcmNhc2UiLCJpc191cHBlcmNhc2UiLCJpc19wcmludCIsImlzX3doaXRlc3BhY2UiLCJpc19kaWdpdCIsImlzX2FscGhhIiwiaXNfYWxwaGFudW0iLCJnZXRfZGlnaXRfdW5zYWZlIiwiZ2V0X2RpZ2l0X2V4biIsImdldF9kaWdpdCIsImlzX2hleF9kaWdpdCIsImlzX2hleF9kaWdpdF9sb3dlciIsImlzX2hleF9kaWdpdF91cHBlciIsImdldF9oZXhfZGlnaXRfZXhuIiwiZ2V0X2hleF9kaWdpdCIsInRfb2Zfc2V4cCQxIiwiYzEiLCJjMiIsImhhc2hfZm9sZF90JDEiLCJoYXNoJDEiLCJ0cl9jcmVhdGVfbWFwIiwidGFyZ2V0IiwicmVwbGFjZW1lbnQiLCJ0cl9tYXAiLCJpJDMiLCJpJDIiLCJpbmRleCQwIiwibGFzdF9yZXBsYWNlbWVudCIsImluZGV4IiwiZmlyc3RfdGFyZ2V0Iiwic3RhZ2UiLCJ1bnN0YWdlIiwiY29udGFpbnMiLCJwb3MkMSIsImVuZCIsImluZGV4X2Zyb21fZXhuX2ludGVybmFsIiwiaW5kZXhfZXhuX2ludGVybmFsIiwiaW5kZXhfZXhuIiwiaW5kZXhfZnJvbV9leG4iLCJyaW5kZXhfZnJvbV9leG5faW50ZXJuYWwiLCJyaW5kZXhfZXhuX2ludGVybmFsIiwicmluZGV4X2V4biIsInJpbmRleF9mcm9tX2V4biIsInJpbmRleCIsImluZGV4X2Zyb20iLCJyaW5kZXhfZnJvbSIsImNhc2Vfc2Vuc2l0aXZlIiwicGF0dGVybiIsImttcF9pbnRlcm5hbF9sb29wIiwibWF0Y2hlZF9jaGFycyIsIm5leHRfdGV4dF9jaGFyIiwia21wX2FycmF5IiwiY2hhcl9lcXVhbCIsIm1hdGNoZWRfY2hhcnMkMCIsImdldF9jaGFyX2VxdWFsIiwiaW5kZXhfaW50ZXJuYWwiLCJ0ZXh0IiwibWF0Y2hlcyIsImluJDAiLCJpbmRleF9leG4kMCIsImluZGV4X2FsbCIsIm1heV9vdmVybGFwIiwicmVwbGFjZV9maXJzdCIsIndpdGgkMCIsImxlbl9zIiwibGVuX3QiLCJsZW5fd2l0aCIsInJlcGxhY2VfYWxsIiwibnVtX21hdGNoZXMiLCJuZXh0X2RzdF9wb3MiLCJuZXh0X3NyY19wb3MiLCJzcGxpdF9vbiIsInBhdHRlcm5fbGVuIiwiYV8wMDIiLCJiXzAwMyIsImttcF9hcnJheV8wMTEiLCJjYXNlX3NlbnNpdGl2ZV8wMDkiLCJwYXR0ZXJuXzAwNyIsImFyZ18wMTIiLCJibmRzXzAwNiIsImFyZ18wMTAiLCJibmRzXzAwNiQwIiwiYXJnXzAwOCIsImJuZHNfMDA2JDEiLCJyZXByZXNlbnRhdGlvbiIsInN1YnN0cl9pbmRleF9nZW4iLCJzdWJzdHJfaW5kZXhfZXhuX2dlbiIsInN1YnN0cl9pbmRleF9hbGxfZ2VuIiwic3Vic3RyX3JlcGxhY2VfZmlyc3RfZ2VuIiwic3Vic3RyX3JlcGxhY2VfYWxsX2dlbiIsImlzX3N1YnN0cmluZ19nZW4iLCJzdWJzdHJpbmciLCJzdWJzdHJfaW5kZXgiLCJzdWJzdHJfaW5kZXhfZXhuIiwic3Vic3RyX2luZGV4X2FsbCIsInN1YnN0cl9yZXBsYWNlX2ZpcnN0Iiwic3Vic3RyX3JlcGxhY2VfYWxsIiwiaXNfc3Vic3RyaW5nIiwiaXNfc3Vic3RyaW5nX2F0X2dlbiIsInN0cl9wb3MkMSIsInN0cl9sZW4iLCJzdWJfbGVuIiwic3RyX3BvcyIsInN1Yl9wb3MiLCJzdWJfcG9zJDAiLCJzdHJfcG9zJDAiLCJpc19zdWZmaXhfZ2VuIiwic3RyaW5nX2xlbiIsImlzX3ByZWZpeF9nZW4iLCJwcmVmaXhfbGVuIiwic2V4cF9vZl90JDIiLCJzdHJpbmcxIiwic3RyaW5nMiIsImxlbjIiLCJsZW4xIiwic3Vic3RyX2luZGV4JDAiLCJzdWJzdHJfaW5kZXhfZXhuJDAiLCJzdWJzdHJfaW5kZXhfYWxsJDAiLCJzdWJzdHJfcmVwbGFjZV9maXJzdCQwIiwic3Vic3RyX3JlcGxhY2VfYWxsJDAiLCJpc19zdWJzdHJpbmckMCIsImlzX3N1YnN0cmluZ19hdCIsImxzcGxpdDJfZXhuIiwibGluZSIsImRlbGltIiwibm90X2ZvdW5kJDQiLCJyc3BsaXQyX2V4biIsImxzcGxpdDIiLCJvbiIsInJzcGxpdDIiLCJjaGFyX2xpc3RfbWVtIiwic3BsaXRfZ2VuIiwiaXNfZGVsaW0iLCJsYXN0X3BvcyIsImxhc3RfcG9zJDEiLCJsYXN0X3BvcyQwIiwicG9zMSIsInN1Yl9zdHIiLCJzcGxpdCIsInNwbGl0X29uX2NoYXJzIiwiY2hhcnMiLCJiYWNrX3VwX2F0X25ld2xpbmUiLCJlb2wiLCJzcGxpdF9saW5lcyIsImlzX3N1ZmZpeCQwIiwiaXNfcHJlZml4JDAiLCJpc19zdWJzdHJpbmdfYXQkMCIsIndyYXBfc3ViX24iLCJvbl9lcnJvciIsImRyb3BfcHJlZml4IiwiZHJvcF9zdWZmaXgiLCJsZmluZGkiLCJyZmluZGkiLCJsYXN0X25vbl9kcm9wIiwicnN0cmlwIiwiZmlyc3Rfbm9uX2Ryb3AiLCJsc3RyaXAiLCJzdHJpcCIsInRyIiwidHJfbXVsdGkiLCJjb25jYXRfYXJyYXkiLCJhciIsIm91dCIsIm91dF9wb3MiLCJvdXQkMCIsImNob3BfcHJlZml4IiwiY2hvcF9wcmVmaXhfaWZfZXhpc3RzIiwiY2hvcF9wcmVmaXhfZXhuIiwiY2hvcF9zdWZmaXgiLCJjaG9wX3N1ZmZpeF9pZl9leGlzdHMiLCJjaG9wX3N1ZmZpeF9leG4iLCJzaG9ydGVyIiwic2hvcnRlc3QiLCJwb3NfZnJvbV9sZWZ0IiwicG9zX2Zyb21fcmlnaHQiLCJjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3AiLCJnZXRfcG9zIiwibWF4X2xlbiIsImxlbl9zb19mYXIiLCJsZW5fc29fZmFyJDAiLCJsZW5fc29fZmFyJDEiLCJjb21tb25fZ2VuZXJpYzJfbGVuZ3RoIiwiY29tbW9uX2dlbmVyaWNfbGVuZ3RoX2xvb3AiLCJmaXJzdCQwIiwibWF4X2xlbiQwIiwibWF4X2xlbiQxIiwiY29tbW9uX2dlbmVyaWNfbGVuZ3RoIiwiY29tbW9uX2dlbmVyaWMyIiwiY29tbW9uX2dlbmVyaWMiLCJjb21tb25fcHJlZml4IiwiY29tbW9uX3N1ZmZpeCIsImNvbW1vbl9wcmVmaXgyIiwiY29tbW9uX3N1ZmZpeDIiLCJjb21tb25fcHJlZml4X2xlbmd0aCIsImNvbW1vbl9zdWZmaXhfbGVuZ3RoIiwiY29tbW9uX3ByZWZpeDJfbGVuZ3RoIiwiY29tbW9uX3N1ZmZpeDJfbGVuZ3RoIiwib2ZfY2hhciIsIm9mX2NoYXJfbGlzdCIsImJ1aWxkX2FuZF92YWxpZGF0ZV9lc2NhcGV3b3J0aCIsImVzY2FwZXdvcnRoeV9tYXAiLCJlc2NhcGVfY2hhciIsImVzY2FwZXdvcnRoeV9tYXAkMCIsInZhbHMiLCJjX3RvIiwiY19mcm9tIiwiayQwIiwiZXNjYXBlX2dlbiIsImVzY2FwZXdvcnRoeSIsInRvX2VzY2FwZV9sZW4iLCJ0b19lc2NhcGUiLCJsYXN0X2lkeCIsImxhc3RfZHN0X3BvcyIsImxhc3RfaWR4JDAiLCJsYXN0X2RzdF9wb3MkMCIsInRvX2VzY2FwZSQwIiwiZXNjYXBlZF9jaGFyIiwibGFzdF9pZHgkMSIsImxhc3RfZHN0X3BvcyQxIiwiZXNjYXBlX2dlbl9leG4iLCJlc2NhcGUiLCJ1bmVzY2FwZV9nZW4iLCJzdGF0dXMiLCJ0b191bmVzY2FwZSIsInRvX3VuZXNjYXBlJDAiLCJzdGF0dXMkMCIsInVuZXNjYXBlX2dlbl9leG4iLCJ1bmVzY2FwZSIsInByZWNlZGluZ19lc2NhcGVfY2hhcnMiLCJjbnQiLCJjbnQkMCIsInVwZGF0ZV9lc2NhcGVfc3RhdHVzIiwiZXNjYXBlX3N0YXR1cyIsIm9kZCIsImNoZWNrX2JvdW5kIiwiZnVuY3Rpb25fbmFtZSIsImlzX2NoYXJfZXNjYXBpbmciLCJpc19jaGFyX2VzY2FwZWQiLCJpc19jaGFyX2xpdGVyYWwiLCJpbmRleF9mcm9tJDAiLCJzdGF0dXMkMSIsImluZGV4X2Zyb21fZXhuJDAiLCJpbmRleCQxIiwiaW5kZXhfZXhuJDEiLCJyaW5kZXhfZnJvbSQwIiwiZXNjYXBlX2NoYXJzIiwicmluZGV4X2Zyb21fZXhuJDAiLCJyaW5kZXgkMCIsInJpbmRleF9leG4kMCIsInNwbGl0X2dlbiQwIiwic3BsaXQkMCIsInNwbGl0X29uX2NoYXJzJDAiLCJzcGxpdF9hdCIsImxzcGxpdDIkMCIsInJzcGxpdDIkMCIsImxzcGxpdDJfZXhuJDAiLCJyc3BsaXQyX2V4biQwIiwibGFzdF9ub25fZHJvcF9saXRlcmFsIiwiZmlyc3Rfbm9uX2Ryb3BfbGl0ZXJhbCIsInJzdHJpcF9saXRlcmFsIiwibHN0cmlwX2xpdGVyYWwiLCJzdHJpcF9saXRlcmFsIiwiYmV0d2VlbiQwIiwiY2xhbXBfZXhuJDAiLCJjbGFtcCQwIiwiY3JlYXRlJDAiLCJjcmVhdGUkMSIsInVuc2FmZV9ibGl0JDEiLCJtYXBpJDAiLCJvY2FtbF9sZXhfdGFibGVzIiwicGFyc2VfaGV4IiwibGV4YnVmIiwib2NhbWxfbGV4X3N0YXRlIiwib2NhbWxfbGV4X3N0YXRlJDAiLCJjb252ZXJ0X2ZhaWx1cmUiLCJudW1fYml0c19pbnQiLCJudW1fYml0c19uYXRpdmVpbnQiLCJudW1fYml0c19pbnQzMiIsIm51bV9iaXRzX2ludDY0IiwibWluX2ludDMyIiwibWF4X2ludDMyIiwibWluX2ludDY0IiwibWF4X2ludDY0IiwibWluX25hdGl2ZWludCIsIm1heF9uYXRpdmVpbnQiLCJpbnQ2NF90b19zdHJpbmciLCJuYXRpdmVpbnRfdG9fc3RyaW5nIiwiaW50MzJfdG9faW50X3RydW5jIiwiaW50X3RvX2ludDMyX3RydW5jIiwiaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIiLCJpbnRfdG9faW50MzIiLCJpbnQzMl90b19pbnQiLCJpbnRfdG9faW50MzJfZXhuIiwiaW50MzJfdG9faW50X2V4biIsImludF90b19pbnQ2NCIsImludDY0X3RvX2ludF90cnVuYyIsImludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50IiwiaW50NjRfdG9faW50IiwiaW50NjRfdG9faW50X2V4biIsImludF90b19uYXRpdmVpbnQiLCJuYXRpdmVpbnRfdG9faW50X3RydW5jIiwibmF0aXZlaW50X3RvX2ludCIsIm5hdGl2ZWludF90b19pbnRfZXhuIiwiaW50MzJfdG9faW50NjQiLCJpbnQ2NF90b19pbnQzMl90cnVuYyIsImludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MyIsImludDY0X3RvX2ludDMyIiwiaW50NjRfdG9faW50MzJfZXhuIiwiaW50MzJfdG9fbmF0aXZlaW50IiwibmF0aXZlaW50X3RvX2ludDMyX3RydW5jIiwibmF0aXZlaW50X3RvX2ludDMyIiwibmF0aXZlaW50X3RvX2ludDMyX2V4biIsImludDY0X3RvX25hdGl2ZWludF90cnVuYyIsIm5hdGl2ZWludF90b19pbnQ2NCIsImludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfbmF0aSIsImludDY0X3RvX25hdGl2ZWludCIsImludDY0X3RvX25hdGl2ZWludF9leG4iLCJpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDYiLCJpbnQ2NF9maXRfb25faW50NjNfZXhuIiwiaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSIsImRlbGltaXRlciIsImNoYXJzX3Blcl9kZWxpbWl0ZXIiLCJpbnB1dF9sZW5ndGgiLCJoYXNfc2lnbiIsIm51bV9kaWdpdHMiLCJudW1fZGVsaW1pdGVycyIsIm91dHB1dF9sZW5ndGgiLCJpbnB1dF9wb3MiLCJvdXRwdXRfcG9zIiwibnVtX2NoYXJzX3VudGlsX2RlbGltaXRlciIsImZpcnN0X2RpZ2l0X3BvcyIsImluc2VydF9kZWxpbWl0ZXIiLCJpbnNlcnRfdW5kZXJzY29yZXMiLCJzZXhwX29mX2ludF9zdHlsZSIsImRlbGltaXRlciQwIiwibWFrZV9zdWZmaXgiLCJ0b19zdHJpbmckMCIsImludmFsaWQiLCJvZl9zdHJpbmdfd2l0aF9kZWxpbWl0ZXIiLCJsZXgiLCJib2R5JDAiLCJvdmVyZmxvd19ib3VuZF9tYXhfaW50NjNfb25faW4iLCJvdmVyZmxvd19ib3VuZF9tYXhfaW50NjRfdmFsdWUiLCJpbnQzMl9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMiLCJvdmVyZmxvd19ib3VuZF9tYXhfaW50X3ZhbHVlIiwib3ZlcmZsb3dfYm91bmRfbWF4X2ludDMyX3ZhbHVlIiwiaW50X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyIsImludDYzX29uX2ludDY0X3Bvc2l0aXZlX292ZXJmbCIsImludDY0X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyIsImludDY0X25lZ2F0aXZlX292ZXJmbG93X2JvdW5kcyIsIm5lZ2F0aXZlX2V4cG9uZW50Iiwib3ZlcmZsb3ciLCJpbnRfcG93IiwiYmFzZSIsImV4cG9uZW50IiwiaW50NjRfcG93IiwiaW50NjNfcG93X29uX2ludDY0IiwicnZhbCIsIm9uZSIsInJvdW5kX2Rvd24iLCJtb2R1bHVzIiwicm91bmRfdXAiLCJyZW1haW5kZXIiLCJyb3VuZF90b3dhcmRzX3plcm8iLCJ0b19tdWx0aXBsZV9vZiIsInJvdW5kX25lYXJlc3QiLCJtb2R1bHVzX21pbnVzX3JlbWFpbmRlciIsInJvdW5kIiwiaDAxIiwibWFzayIsImludDY0X3BvcGNvdW50IiwieCQyIiwiaW50MzJfcG9wY291bnQiLCJuYXRpdmVpbnRfcG9wY291bnQiLCJtb2R1bGVfbmFtZSQwIiwib2Zfc3RyaW5nJDAiLCJmbG9hdF9sb3dlcl9ib3VuZCIsImZsb2F0X3VwcGVyX2JvdW5kIiwib2ZfZmxvYXRfdW5jaGVja2VkIiwiZnVuYyQwIiwiemVybyIsIm1pbnVzX29uZSIsIm5lZyIsIm9mX3N0cmluZyQxIiwib2ZfaW50MzIiLCJvZl9pbnQzMl9leG4iLCJ0b19pbnQzMiIsInRvX2ludDMyX2V4biIsIm9mX2ludDY0Iiwib2ZfaW50NjRfZXhuIiwidG9faW50NjQiLCJvZl9uYXRpdmVpbnQiLCJvZl9uYXRpdmVpbnRfZXhuIiwidG9fbmF0aXZlaW50IiwibWF4X3ZhbHVlXzMwX2JpdHMiLCJhYnMiLCJyZW0iLCJzaGlmdF9yaWdodF9sb2dpY2FsIiwic2hpZnRfbGVmdCIsImJpdF9ub3QiLCJiaXRfb3IiLCJiaXRfYW5kIiwiYml0X3hvciIsInBvdyIsIm5vbl9wb3NpdGl2ZV9hcmd1bWVudCIsImNlaWxfcG93MiIsIngkMyIsIngkNCIsIngkNSIsIngkNiIsImZsb29yX3BvdzIiLCJpc19wb3cyIiwiZmxvb3JfbG9nMiIsImNlaWxfbG9nMiIsInBvcGNvdW50IiwibG5vdCIsInN1Y2NfZXhuIiwibXNnIiwicHJlZF9leG4iLCJvZl9zY2FsYXIiLCJvZl9zY2FsYXJfZXhuIiwidG9fc2NhbGFyIiwidG9fY2hhciIsInRvX2NoYXJfZXhuIiwidXRmOF9ieXRlX2xlbmd0aCIsInVjaGFyIiwiY29kZXBvaW50Iiwic29tZV90IiwicmVmbCIsInN5bSIsInRyYW5zIiwiY29udiIsImRldHVwbGUyIiwidHVwbGUyIiwid2l0bmVzcyIsInZfMDA1IiwidG9fc2V4cCIsInVpZCIsInNhbWVfd2l0bmVzcyIsInNhbWUiLCJzYW1lX3dpdG5lc3NfZXhuIiwibm9uZV9zdWJzdGl0dXRlIiwibm9uZSIsInZhbHVlX3Vuc2FmZSIsIm9mX3NleHBhYmxlIiwidG9fc2V4cGFibGUiLCJ4XzAwMyIsIm9mX2FfMDA0IiwieF8wMDUiLCJpbml0X3NvbWUiLCJnZXRfc29tZV9leG4iLCJpc19ub25lJDAiLCJpc19zb21lJDAiLCJzZXRfc29tZSIsInNldF9ub25lIiwidW5zYWZlX2dldF9zb21lX2V4biIsInVuc2FmZV9nZXRfc29tZV9hc3N1bWluZ19zb21lIiwidW5zYWZlX2lzX3NvbWUiLCJ1bnNhZmVfc2V0X3NvbWUiLCJ1bnNhZmVfc2V0X25vbmUiLCJjbGVhciIsImVsZW0iLCJtYXBfc29tZSIsIm9mX2FycmF5X3NvbWUiLCJjYXBhY2l0eSIsImVsdHMiLCJsZW5ndGhfMDAzIiwiZWx0c18wMDUiLCJhcmdfMDA2IiwiYm5kc18wMDIiLCJhcmdfMDA0IiwiYm5kc18wMDIkMCIsInJlc2l6ZSIsInNpemUiLCJzZXRfY2FwYWNpdHkiLCJuZXdfY2FwYWNpdHkiLCJuZXdfY2FwYWNpdHkkMCIsInB1c2giLCJwb3Bfbm9uZW1wdHkiLCJwb3BfZXJyb3IiLCJwb3AiLCJwb3BfZXhuIiwidG9wX25vbmVtcHR5IiwidG9wX2Vycm9yIiwidG9wIiwidG9wX2V4biIsInVudGlsX2VtcHR5IiwiaGFzaF9vdmVycmlkZSIsIm9mX3BvcyIsIm9mX3NpZ24iLCJ0b19zaWduX2V4biIsInRvX2ludF9leG4iLCJlcnJvcl9zb3VyY2VfMDA2IiwiZXJyb3Jfc291cmNlXzAyNyIsImludGVydmFsX2NvbXBhcmlzb25fc2V4cF9ncmFtbSIsImFsbF9vZl9hIiwiZW51bWVyYXRlXzAwMiIsImVudW1lcmF0ZV8wMDEiLCJhY2MkMiIsIm9mX2FfMDAzIiwic2V4cF8wMDgiLCJ0YWdfMDA5Iiwic2V4cF9hcmdzXzAxMCIsImFyZzBfMDIwIiwicmVzMF8wMjEiLCJhcmcwXzAyMiIsInJlczBfMDIzIiwiaW50ZXJ2YWxfY29tcGFyaXNvbl9vZl9zZXhwIiwic2V4cF8wMjgiLCJzZXhwX29mX2ludGVydmFsX2NvbXBhcmlzb24iLCJjb21wYXJlX2ludGVydmFsX2NvbXBhcmlzb24iLCJoYXNoX2ZvbGRfaW50ZXJ2YWxfY29tcGFyaXNvbiIsImhhc2hfaW50ZXJ2YWxfY29tcGFyaXNvbiIsImluY2wiLCJleGNsIiwiaXNfbG93ZXJfYm91bmQiLCJpc191cHBlcl9ib3VuZCIsImJvdW5kc19jcm9zc2VkIiwibG93ZXIiLCJ1cHBlciIsImxvd2VyJDAiLCJ1cHBlciQwIiwiY29tcGFyZV90b19pbnRlcnZhbF9leG4iLCJpbnRlcnZhbF9jb250YWluc19leG4iLCJlcnJvcl9zb3VyY2VfMDU3IiwicmlnaHRfMDA0IiwibGVmdF8wMDMiLCJyaWdodF8wMDgiLCJsZWZ0XzAwNyIsIm9mX2FfMDA5Iiwidl8wMTAiLCJjbXBfayIsImNtcF92IiwidF8wMTQiLCJ0XzAxMyIsInRfMDE2IiwidF8wMTUiLCJyaWdodF8wMTgiLCJsZWZ0XzAxNyIsInJpZ2h0XzAyMiIsImxlZnRfMDIxIiwidF8wMjQiLCJ0XzAyMyIsInRfMDI2IiwidF8wMjUiLCJyaWdodF8wMjAiLCJsZWZ0XzAxOSIsInRfMDMwIiwidF8wMjkiLCJ0XzAzMiIsInRfMDMxIiwicmlnaHRfMDM0IiwibGVmdF8wMzMiLCJyaWdodF8wMzgiLCJsZWZ0XzAzNyIsInRfMDQwIiwidF8wMzkiLCJ0XzA0MiIsInRfMDQxIiwicmlnaHRfMDM2IiwibGVmdF8wMzUiLCJvZl9rXzA0MyIsIm9mX3ZfMDQ0Iiwic2V4cF8wNzEiLCJhcmcxXzA2OCIsImFyZzBfMDY3IiwicmVzMF8wNjkiLCJhdG9tXzA0NyIsInNleHBfYXJnc18wNTAiLCJhdG9tXzA0NyQwIiwiYXJnMF8wNTgiLCJyZXMwXzA1OSIsImFyZzBfMDYxIiwicmVzMF8wNjIiLCJhcmcwXzA2NCIsInJlczBfMDY1IiwicmVzMV8wNzAiLCJvZl9rXzA3MiIsIm9mX3ZfMDczIiwiYXJnMV8wODIiLCJhcmcwXzA4MSIsInJlczBfMDgzIiwidl8wNzQiLCJyZXMxXzA4NCIsInZfMDc2IiwiYXJnMV8wNzgiLCJhcmcwXzA3NyIsInJlczBfMDc5IiwicmVzMV8wODAiLCJ2XzA3NSIsImtfc2V4cF9ncmFtbWFyIiwidl9zZXhwX2dyYW1tYXIiLCJjbXBfbGVmdCIsImNtcF9yaWdodCIsImFfMDg1IiwiYl8wODYiLCJyaWdodF8wOTIiLCJsZWZ0XzA5MSIsInRfMDk0IiwidF8wOTMiLCJ0XzA5NiIsInRfMDk1IiwicmlnaHRfMDg4IiwibGVmdF8wODciLCJyaWdodF8wOTAiLCJsZWZ0XzA4OSIsImFfMDk3IiwiYl8wOTgiLCJyaWdodF8xMDQiLCJsZWZ0XzEwMyIsInRfMTA2IiwidF8xMDUiLCJ0XzEwOCIsInRfMTA3IiwicmlnaHRfMTAwIiwibGVmdF8wOTkiLCJyaWdodF8xMDIiLCJsZWZ0XzEwMSIsIm9mX2xlZnRfMTA5Iiwib2ZfcmlnaHRfMTEwIiwidl8xMTMiLCJhcmcxXzExNSIsImFyZzBfMTE0IiwicmVzMF8xMTYiLCJyZXMxXzExNyIsInZfMTExIiwidl8xMTIiLCJzZXhwX29mX3QkMyIsImhlaWdodCIsImluX3JhbmdlIiwiaGwiLCJociIsImxvd2VyJDEiLCJpbnZhcmlhbnRzIiwiaCQxIiwiaCQwIiwic2wiLCJzciIsIm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVjayIsImtsIiwiayQxIiwia2wkMCIsImskMiIsImtyIiwibGVmdF9sZW5ndGgiLCJyaWdodF9sZW5ndGgiLCJvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIiwiYXJyYXlfbGVuZ3RoIiwib2Zfc29ydGVkX2FycmF5IiwiaW5jcmVhc2luZyIsImJhbCIsImxyIiwibHYiLCJsbCIsImxyciIsImxydiQwIiwibHJsIiwibHJ2IiwicnIiLCJydiIsInJsIiwicmxyIiwicmx2JDAiLCJybGwiLCJybHYiLCJhdXgiLCJsaCIsImx2JDAiLCJyaCIsInJ2JDAiLCJtaW5fZWx0X2V4biIsImZvbGRfdW50aWxfaGVscGVyIiwidmFsdWUkMCIsIm1heF9lbHRfZXhuIiwicmVtb3ZlX21pbl9lbHQiLCJtYXliZV9lbHQiLCJtYXliZV9lbHQkMCIsImVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3RpbyIsInJlbW92ZV9pbmRleCIsImxfc2l6ZSIsInVuaW9uIiwidjEkMCIsInYyJDAiLCJyMiQwIiwicjEkMCIsInVuaW9uX2xpc3QiLCJ0b190cmVlIiwiaW50ZXIiLCJvdGhlcl9zZXQiLCJlJDEiLCJjb25zX3JpZ2h0Iiwib2Zfc2V0IiwiZW51bSQwIiwidHJlZSIsInN5bW1ldHJpY19kaWZmIiwiZWx0JDAiLCJlbnVtMSIsInRyZWUxIiwiZW51bTIiLCJ0cmVlMiIsImNvbXBhcmVfcmVzdWx0IiwibmV4dF9zdGF0ZSIsImdyZWF0ZXJfb3JfZXF1YWxfdG8iLCJsZXNzX29yX2VxdWFsX3RvIiwiaW5jbHVzaXZlX2JvdW5kIiwic2lkZSIsIm1heWJlIiwidiQxIiwidiQyIiwidiQzIiwidiQ0IiwiZSQyIiwiaW5pdCQwIiwibWVyZ2VfdG9fc2VxdWVuY2UiLCJlMiQyIiwiZTEkMiIsImUyJDAiLCJlMSQwIiwiZTIkMSIsImUxJDEiLCJ0MiQyIiwidDEkMiIsImlzX3N1YnNldCIsImFyZV9kaXNqb2ludCIsImFjY3UkMCIsImFjY3UkMSIsImZpbHQiLCJwYXJ0IiwiZWxlbWVudHNfYXV4IiwiZWxlbWVudHMiLCJjaG9vc2UiLCJjaG9vc2VfZXhuIiwicG9zX3JlZiIsImdyb3VwX2J5IiwiZXF1aXYiLCJzZXQkMCIsImVxdWl2X2NsYXNzZXMiLCJub3RfZXF1aXZfeCIsImVxdWl2X3giLCJlcXVpdl9jbGFzc2VzJDAiLCJzdGFibGVfZGVkdXBfbGlzdCIsImxlZnRvdmVycyIsImFscmVhZHlfc2VlbiIsImFscmVhZHlfc2VlbiQwIiwibGVmdG92ZXJzJDAiLCJ0X29mX3NleHBfZGlyZWN0IiwiZWx0X2xzdCIsImVsX3NleHAiLCJpc19zdWJzZXQkMCIsInN1YnNldCIsInN1cGVyc2V0Iiwic2V4cF9vZl9lbHQiLCJpbnZhbGlkX2VsZW1lbnRzIiwiaW52YWxpZF9lbGVtZW50c19zZXhwIiwibGlrZSIsImludmFyaWFudHMkMCIsImVsZW1lbnRzJDAiLCJtaW5fZWx0X2V4biQwIiwibWF4X2VsdF9leG4kMCIsImNob29zZSQwIiwiY2hvb3NlX2V4biQwIiwiZm9sZF9yaWdodCQwIiwiaXRlcjIkMCIsImZpbHRlciQwIiwiYWRkJDAiLCJyZW1vdmUkMCIsInVuaW9uJDAiLCJpbnRlciQwIiwiZGlmZiQwIiwic3ltbWV0cmljX2RpZmYkMCIsImNvbXBhcmVfZGlyZWN0IiwiaXNfc3Vic2V0JDEiLCJvZiIsImFyZV9kaXNqb2ludCQwIiwidG9fbmFtZWRfdHJlZSIsImlzX3N1YnNldCQyIiwicGFydGl0aW9uX3RmJDAiLCJ0cmVlX2YiLCJ0cmVlX3QiLCJncm91cF9ieSQwIiwibnRoJDAiLCJyZW1vdmVfaW5kZXgkMCIsInRvX3NlcXVlbmNlJDAiLCJiaW5hcnlfc2VhcmNoJDAiLCJiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCQwIiwibWVyZ2VfdG9fc2VxdWVuY2UkMCIsImhhc2hfZm9sZF9kaXJlY3QiLCJ0X29mX3NleHBfZGlyZWN0JDAiLCJpbnZhcmlhbnRzJDEiLCJpc19lbXB0eSQxIiwiZWxlbWVudHMkMSIsIm1pbl9lbHQkMSIsIm1pbl9lbHRfZXhuJDEiLCJtYXhfZWx0JDEiLCJtYXhfZWx0X2V4biQxIiwiY2hvb3NlJDEiLCJjaG9vc2VfZXhuJDEiLCJ0b19saXN0JDEiLCJ0b19hcnJheSQxIiwiaXRlciQyIiwiZXhpc3RzJDEiLCJmb3JfYWxsJDEiLCJjb3VudCQxIiwic3VtJDEiLCJmaW5kJDEiLCJmaW5kX2V4biQxIiwiZmluZF9tYXAkMSIsImZvbGQkMSIsImZvbGRfdW50aWwkMSIsImZvbGRfcmlnaHQkMSIsImZpbHRlciQxIiwiZmlsdGVyX21hcCQwIiwicGFydGl0aW9uX3RmJDEiLCJpdGVyMiQxIiwibWVtJDEiLCJhZGQkMSIsInJlbW92ZSQxIiwidW5pb24kMSIsImludGVyJDEiLCJkaWZmJDEiLCJzeW1tZXRyaWNfZGlmZiQxIiwiY29tcGFyZV9kaXJlY3QkMCIsImlzX3N1YnNldCQzIiwiYXJlX2Rpc2pvaW50JDEiLCJvZl9saXN0JDAiLCJvZl9zZXF1ZW5jZSQwIiwib2ZfYXJyYXkkMCIsIm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQkMCIsIm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVjayQwIiwib2Zfc29ydGVkX2FycmF5JDAiLCJ1bmlvbl9saXN0JDAiLCJzdGFibGVfZGVkdXBfbGlzdCQwIiwiZ3JvdXBfYnkkMSIsInNwbGl0JDEiLCJudGgkMSIsInJlbW92ZV9pbmRleCQxIiwib2ZfdHJlZSIsInRvX3NlcXVlbmNlJDEiLCJiaW5hcnlfc2VhcmNoJDEiLCJiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCQxIiwibWVyZ2VfdG9fc2VxdWVuY2UkMSIsImlzX3N1YnNldCQ0IiwidG9fdHJlZSQwIiwib2ZfdHJlZSQwIiwidF9vZl9zZXhwX2RpcmVjdCQxIiwiZW1wdHkkMCIsInNpbmdsZXRvbiQwIiwidW5pb25fbGlzdCQxIiwib2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCQxIiwib2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrJDEiLCJvZl9zb3J0ZWRfYXJyYXkkMSIsIm9mX2xpc3QkMSIsIm9mX3NlcXVlbmNlJDEiLCJvZl9hcnJheSQxIiwic3RhYmxlX2RlZHVwX2xpc3QkMSIsImZpbHRlcl9tYXAkMSIsImNvbXBhcmF0b3JfcyIsImVtcHR5JDEiLCJzaW5nbGV0b24kMSIsInVuaW9uX2xpc3QkMiIsIm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQkMiIsIm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVjayQyIiwib2Zfc29ydGVkX2FycmF5JDIiLCJvZl9saXN0JDIiLCJvZl9zZXF1ZW5jZSQyIiwib2ZfYXJyYXkkMiIsInN0YWJsZV9kZWR1cF9saXN0JDIiLCJmaWx0ZXJfbWFwJDIiLCJzZXhwX29mX21fdCIsIkVsdCIsIm1fdF9vZl9zZXhwIiwibV90X3NleHBfZ3JhbW1hciIsImNvbXBhcmVfbV90IiwiZXF1YWxfbV90IiwiaGFzaF9mb2xkX21fdCIsImhhc2hfbV90IiwiY29tcGFyYXRvciQwIiwiZW1wdHkkMiIsInNpbmdsZXRvbiQyIiwidW5pb25fbGlzdCQzIiwib2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCQzIiwib2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrJDMiLCJvZl9zb3J0ZWRfYXJyYXkkMyIsIm9mX2xpc3QkMyIsIm9mX3NlcXVlbmNlJDMiLCJvZl9hcnJheSQzIiwic3RhYmxlX2RlZHVwX2xpc3QkMyIsIm1hcCQzIiwiZmlsdGVyX21hcCQzIiwib2ZfdHJlZSQxIiwidG9fdHJlZSQxIiwicmVwbGFjZSIsInNldF90ZW1wb3JhcmlseSIsInJlc3RvcmVfdG8iLCJzZXRzIiwic25hcHNob3QiLCJzZXRzX3RlbXBvcmFyaWx5IiwiYW5kX3ZhbHVlcyIsImluY19udW1fbXV0YXRpb25zIiwiZWx0c19pbmRleCIsImNoZWNrX2luZGV4X2V4biIsImVuc3VyZV9ub19tdXRhdGlvbiIsIm51bV9tdXRhdGlvbnMiLCJudW1fbXV0YXRpb25zXzAwMyIsImZyb250XzAwNSIsIm1hc2tfMDA3IiwibGVuZ3RoXzAwOSIsImVsdHNfMDExIiwiYm5kc18wMDIkMSIsImJuZHNfMDAyJDIiLCJibmRzXzAwMiQzIiwibXV0MiIsIm11dDEiLCJmcm9udCIsImNhcGFjaXR5JDAiLCJjYXBhY2l0eSQxIiwiYmxpdF90b19hcnJheSIsImZyb250X2xlbiIsInJlc3RfbGVuIiwiZGVzaXJlZF9jYXBhY2l0eSIsImVucXVldWUiLCJkZXF1ZXVlX25vbmVtcHR5IiwiZGVxdWV1ZV9leG4iLCJkZXF1ZXVlIiwiZnJvbnRfbm9uZW1wdHkiLCJsYXN0X25vbmVtcHR5IiwicGVlayIsInBlZWtfZXhuIiwiYmxpdF90cmFuc2ZlciIsImxlbiQxIiwiZHN0X3N0YXJ0Iiwic3JjX2kiLCJkc3RfaSIsImVucXVldWVfYWxsIiwidF9yZXN1bHQiLCJmaWx0ZXJfaW5wbGFjZSIsImZpbHRlcmlfaW5wbGFjZSIsInVucmVhY2hhYmxlX2NvZGUiLCJ6ZXJvJDAiLCJ6ZXJvJDEiLCJ0b19pbnRfdHJ1bmMiLCJ0b19pbnQzMl90cnVuYyIsIm9mX2ludDY0X3RydW5jIiwibmFtZSQwIiwib2ZfY29udGludWVfb3Jfc3RvcCIsInRvX2NvbnRpbnVlX29yX3N0b3AiLCJsZWZ0X3ZhbHVlIiwicmlnaHRfdmFsdWUiLCJ2YWx1ZXMiLCJsZWZ0X2RlZmF1bHQiLCJyaWdodF9kZWZhdWx0IiwicmlnaHQkMCIsImNvbXBhcmVfa2V5IiwidmwiLCJ2bCQwIiwidnIiLCJrMCIsImsxIiwibGQiLCJscmQiLCJscmQkMCIsInJkIiwicmxkIiwicmxkJDAiLCJyYWlzZV9rZXlfYWxyZWFkeV9wcmVzZW50Iiwic2V4cF9vZl9rZXkiLCJmaW5kX2FuZF9hZGRfb3Jfc2V0IiwiZGF0YSIsImFkZF9vcl9zZXQiLCJkJDAiLCJhZGRfZXhuIiwiYWRkX2V4bl9pbnRlcm5hbCIsInNpbmdsZXRvbl90b190cmVlX2V4biIsImNvbGxhcHNlIiwiZ28iLCJhZGRfdW5jaGVja2VkIiwiZ28kMCIsInRvX3RyZWVfdW5jaGVja2VkIiwibWF4X2tleSIsIm9mX2luY3JlYXNpbmdfc2VxdWVuY2UiLCJidWlsZGVyIiwicHJldl9rZXkiLCJqb2luJDAiLCJsZCQwIiwibGskMCIsInJrIiwicmQkMCIsInJrJDAiLCJsayIsImNtcCQwIiwibWF5YmUkMCIsInNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSIsImludG8iLCJib3VuZGFyeV9vcHQiLCJpbnNlcnRfaW50byIsInNwbGl0X3JhbmdlIiwibWlkX2FuZF9yaWdodCIsImxiJDEiLCJsYiQyIiwibWlkX2FuZF9yaWdodCQwIiwibGIiLCJsYiQwIiwibWlkJDAiLCJhZGRfbXVsdGkiLCJkYXRhJDAiLCJmaW5kX211bHRpIiwibG93ZXJfcGFydCIsInVwcGVyX3BhcnQiLCJtaW5fdXBwZXIiLCJtYXhfbG93ZXIiLCJ1cHBlcl9wYXJ0X3dpdGhvdXRfbWluIiwiZ28kMSIsImNfbWluIiwiaW5pdCQxIiwiY19tYXgiLCJpbml0JDIiLCJmb2xkX3JhbmdlX2luY2x1c2l2ZSIsInJhbmdlX3RvX2FsaXN0IiwiY29uY2F0X3VuY2hlY2tlZCIsInJlbW92ZV9sb29wIiwiY2hhbmdlIiwiY2hhbmdlX2NvcmUiLCJkJDEiLCJsZW5ndGgkMiIsImxlbmd0aCQzIiwidXBkYXRlIiwidXBkYXRlX2NvcmUiLCJyZW1vdmVfbXVsdGkiLCJub25fZW1wdHlfdGFpbCIsIml0ZXJfa2V5cyIsIml0ZXJpX3VudGlsX2xvb3AiLCJpdGVyaV91bnRpbCIsImZvbGRfdW50aWxfbG9vcCIsImZpbmFsJDEiLCJmaW5hbCQwIiwiZmlsdGVyX2tleXMiLCJwYXJ0aXRpb25fbWFwaSIsInBhaXIyIiwicGFpcjEiLCJjdXJyIiwiazIiLCJuZXh0JDEiLCJkYXRhX2VxdWFsIiwia2V5c19ncmVhdGVyX29yX2VxdWFsX3RvIiwia2V5c19sZXNzX29yX2VxdWFsX3RvIiwiZCQyIiwiY29tcGFyZV9kYXRhIiwiZDIiLCJkMSIsImZvbGQyJDAiLCJmb2xkX3N5bW1ldHJpY19kaWZmIiwiZGVsdGEiLCJhY2MkMyIsImFjYyQ0IiwiYWNjJDUiLCJhY2MkNiIsImFjYyQ3IiwicmlnaHQkMiIsImxlZnQkMiIsInJpZ2h0JDEiLCJrZXlzIiwib2ZfZm9sZGFibGVfZm9sZCIsImZvbGRhYmxlIiwicHJldl9kYXRhIiwib2ZfZm9sZGFibGVfcmVkdWNlIiwibmV3X2RhdGEiLCJvZl9mb2xkYWJsZSIsIm9mX2ZvbGRhYmxlX29yX2Vycm9yIiwib2ZfZm9sZGFibGVfZXhuIiwib2ZfYWxpc3RfZm9sZCIsIm9mX2FsaXN0X3JlZHVjZSIsIm9mX2FsaXN0Iiwib2ZfYWxpc3Rfb3JfZXJyb3IiLCJvZl9hbGlzdF9leG4iLCJvZl9mb2xkYWJsZV9tdWx0aSIsIm9mX2FsaXN0X211bHRpIiwiZm9sZCQyIiwib2Zfc2VxdWVuY2VfZm9sZCIsIm9mX3NlcXVlbmNlX3JlZHVjZSIsIm9mX3NlcXVlbmNlX29yX2Vycm9yIiwib2Zfc2VxdWVuY2VfZXhuIiwib2Zfc2VxdWVuY2VfbXVsdGkiLCJ0b19hbGlzdCIsImtleV9vcmRlciIsIm1lcmdlX2xhcmdlX2ZpcnN0IiwibGVuZ3RoX2xhcmdlIiwidF9sYXJnZSIsInRfc21hbGwiLCJtZXJnZV9za2V3ZWQiLCJsZW5ndGgxIiwibGVuZ3RoMiIsInJlcGFja2FnZSIsIm1hcmtlciIsImNsb3Nlc3Rfa2V5IiwiZm91bmRfbWFya2VyIiwiZm91bmRfa2V5IiwiZm91bmRfdmFsdWUiLCJmb3VuZF92YWx1ZSQwIiwiZm91bmRfa2V5JDAiLCJyYW5rIiwibnVtX3RvX3NlYXJjaCIsInBhaXIiLCJwYWlyJDAiLCJiaW5hcnlfc2VhcmNoX29uZV9zaWRlZF9ib3VuZCIsIm1heWJlX2JvdW5kIiwiaWZfZXhjbHVzaXZlIiwiaWZfaW5jbHVzaXZlIiwiZmluZF9ib3VuZCIsImJvdW5kJDAiLCJiaW5hcnlfc2VhcmNoX3R3b19zaWRlZF9ib3VuZHMiLCJsb3dlcl9ib3VuZCQwIiwidXBwZXJfYm91bmQkMCIsIm9mX2l0ZXJpIiwib2ZfaXRlcmlfZXhuIiwia2V5X29mX3NleHAiLCJ2YWx1ZV9vZl9zZXhwIiwiYWxpc3Rfc2V4cHMiLCJmb3VuZF9maXJzdF9rIiwiazJfc2V4cCIsInNleHBfb2ZfdmFsdWUiLCJlcnJvcl90cmVlIiwib2tzIiwibWFwX2tleXMiLCJtYXBfa2V5c19leG4iLCJsaWtlMiIsImxpa2VfbWF5YmVfbm9fb3AiLCJvbGRfdCIsIm9sZF90cmVlIiwid2l0aF9zYW1lX2xlbmd0aCIsInNldCQxIiwiYWRkX2V4biQwIiwiYWRkX211bHRpJDAiLCJyZW1vdmVfbXVsdGkkMCIsImZpbmRfbXVsdGkkMCIsImNoYW5nZSQwIiwidXBkYXRlJDAiLCJpdGVyX2tleXMkMCIsIml0ZXJpX3VudGlsJDAiLCJmb2xkJDMiLCJmb2xkMiQxIiwiZmlsdGVyX2tleXMkMCIsImZpbHRlcmkkMCIsImZpbHRlcl9tYXBpJDAiLCJwYXJ0aXRpb25fbWFwaSQwIiwicGFydGl0aW9uX21hcCQwIiwicGFydGl0aW9uaV90ZiQwIiwiY29tYmluZV9lcnJvcnMkMCIsImtleXMkMCIsInRvX2FsaXN0JDAiLCJmb2xkX3N5bW1ldHJpY19kaWZmJDAiLCJtZXJnZSQwIiwibWVyZ2Vfc2tld2VkJDAiLCJib3RoX2xlbiIsInN1YnJhbmdlIiwiaF9sIiwiaF9yIiwib3V0ZXJfam9pbmVkX2hlaWdodCIsIm1pZF9sZW5ndGgiLCJhcHBlbmQkMCIsImZvbGRfcmFuZ2VfaW5jbHVzaXZlJDAiLCJyYW5nZV90b19hbGlzdCQwIiwiY2xvc2VzdF9rZXkkMCIsInJhbmskMCIsInNleHBfb2ZfayIsInNleHBfb2ZfdiIsImhhc2hfZm9sZF9rZXkiLCJoYXNoX2ZvbGRfZGF0YSIsImJpbmFyeV9zZWFyY2hfc3VicmFuZ2UiLCJvZl9hbGlzdCQwIiwib2ZfYWxpc3Rfb3JfZXJyb3IkMCIsIm9mX2FsaXN0X2V4biQwIiwib2ZfYWxpc3RfbXVsdGkkMCIsIm9mX2FsaXN0X2ZvbGQkMCIsIm9mX2FsaXN0X3JlZHVjZSQwIiwib2ZfaXRlcmkkMCIsIm9mX2l0ZXJpX2V4biQwIiwicmVxdWlyZWRfYnlfaW50ZiIsIm9mX2luY3JlYXNpbmdfc2VxdWVuY2UkMCIsIm9mX3NlcXVlbmNlX29yX2Vycm9yJDAiLCJvZl9zZXF1ZW5jZV9leG4kMCIsIm9mX3NlcXVlbmNlX211bHRpJDAiLCJvZl9zZXF1ZW5jZV9mb2xkJDAiLCJvZl9zZXF1ZW5jZV9yZWR1Y2UkMCIsInNldCQyIiwiYWRkX2V4biQxIiwiYWRkX211bHRpJDEiLCJyZW1vdmVfbXVsdGkkMSIsImZpbmRfbXVsdGkkMSIsImNoYW5nZSQxIiwidXBkYXRlJDEiLCJpdGVyX2tleXMkMSIsIml0ZXJpX3VudGlsJDEiLCJtYXBpJDEiLCJmb2xkJDQiLCJmb2xkMiQyIiwiZmlsdGVyX2tleXMkMSIsImZpbHRlcmkkMSIsImZpbHRlcl9tYXBpJDEiLCJwYXJ0aXRpb25fbWFwaSQxIiwicGFydGl0aW9uX21hcCQxIiwicGFydGl0aW9uaV90ZiQxIiwiY29tYmluZV9lcnJvcnMkMSIsImtleXMkMSIsImRhdGEkMSIsInRvX2FsaXN0JDEiLCJmb2xkX3N5bW1ldHJpY19kaWZmJDEiLCJtZXJnZSQxIiwibWVyZ2Vfc2tld2VkJDEiLCJmb3JfYWxsaSQxIiwiZXhpc3RzaSQxIiwiY291bnRpJDEiLCJhcHBlbmQkMSIsInN1YnJhbmdlJDAiLCJmb2xkX3JhbmdlX2luY2x1c2l2ZSQxIiwicmFuZ2VfdG9fYWxpc3QkMSIsImNsb3Nlc3Rfa2V5JDEiLCJudGgkMiIsIm50aF9leG4kMCIsInJhbmskMSIsImtfb2Zfc2V4cCIsInZfb2Zfc2V4cCIsImJpbmFyeV9zZWFyY2hfc3VicmFuZ2UkMCIsIm1hcF9rZXlzJDAiLCJkdXAiLCJtYXBfa2V5c19leG4kMCIsImFkZF9leG4kMiIsIm9mX3RyZWUwIiwib2ZfdHJlZSQyIiwib2ZfYWxpc3QkMSIsIm9mX2FsaXN0X29yX2Vycm9yJDEiLCJvZl9hbGlzdF9leG4kMSIsIm9mX2FsaXN0X211bHRpJDEiLCJvZl9hbGlzdF9mb2xkJDEiLCJvZl9hbGlzdF9yZWR1Y2UkMSIsIm9mX2l0ZXJpJDEiLCJ0cmVlX2xlbmd0aCIsIm9mX2l0ZXJpX2V4biQxIiwib2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSQxIiwib2Zfc2VxdWVuY2Vfb3JfZXJyb3IkMSIsIm9mX3NlcXVlbmNlX2V4biQxIiwib2Zfc2VxdWVuY2VfbXVsdGkkMSIsIm9mX3NlcXVlbmNlX2ZvbGQkMSIsIm9mX3NlcXVlbmNlX3JlZHVjZSQxIiwibWFwX2tleXMkMSIsIm1hcF9rZXlzX2V4biQxIiwib2ZfdHJlZSQzIiwib2ZfYWxpc3QkMiIsIm9mX2FsaXN0X29yX2Vycm9yJDIiLCJvZl9hbGlzdF9leG4kMiIsIm9mX2FsaXN0X211bHRpJDIiLCJvZl9hbGlzdF9mb2xkJDIiLCJvZl9hbGlzdF9yZWR1Y2UkMiIsIm9mX2l0ZXJpJDIiLCJvZl9pdGVyaV9leG4kMiIsIm9mX2luY3JlYXNpbmdfc2VxdWVuY2UkMiIsIm9mX3NlcXVlbmNlX29yX2Vycm9yJDIiLCJvZl9zZXF1ZW5jZV9leG4kMiIsIm9mX3NlcXVlbmNlX211bHRpJDIiLCJvZl9zZXF1ZW5jZV9mb2xkJDIiLCJvZl9zZXF1ZW5jZV9yZWR1Y2UkMiIsIm1hcF9rZXlzJDIiLCJtYXBfa2V5c19leG4kMiIsIksiLCJ2X2dyYW1tYXIiLCJjb21wYXJlX3YiLCJlcXVhbF92IiwiaGFzaF9mb2xkX3YiLCJvZl90cmVlJDQiLCJlbXB0eSQzIiwib2ZfYWxpc3QkMyIsIm9mX2FsaXN0X29yX2Vycm9yJDMiLCJvZl9hbGlzdF9leG4kMyIsIm9mX2FsaXN0X211bHRpJDMiLCJvZl9hbGlzdF9mb2xkJDMiLCJvZl9hbGlzdF9yZWR1Y2UkMyIsIm9mX2l0ZXJpJDMiLCJvZl9pdGVyaV9leG4kMyIsIm9mX2luY3JlYXNpbmdfc2VxdWVuY2UkMyIsIm9mX3NlcXVlbmNlX29yX2Vycm9yJDMiLCJvZl9zZXF1ZW5jZV9leG4kMyIsIm9mX3NlcXVlbmNlX211bHRpJDMiLCJvZl9zZXF1ZW5jZV9mb2xkJDMiLCJvZl9zZXF1ZW5jZV9yZWR1Y2UkMyIsIm1hcF9rZXlzJDMiLCJtYXBfa2V5c19leG4kMyIsInRyYW5zZmVyIiwicSIsInEkMCIsImZsb2F0X29mX2JpdHMiLCJiaXRzX29mX2Zsb2F0IiwiYnN3YXAxNiIsImJzd2FwMzIiLCJic3dhcDQ4IiwidG9fbmF0aXZlaW50X2V4biIsIndyYXBfZXhuIiwid3JhcF9tb2R1bG8iLCJ1bndyYXAiLCJjbHoiLCJjdHoiLCJpbnZhbGlkX3N0ciIsInNpZ25lZG5lc3MiLCJwb3Nfc3RyIiwiaW50NjMiLCJpbnQ2MyQwIiwib25lJDAiLCJvZl9uYXRpdmVpbnRfdHJ1bmMiLCJ0b19uYXRpdmVpbnRfdHJ1bmMiLCJ0b19zdHJpbmckMSIsInJlcHIiLCJvZl9pbnRfdHJ1bmMiLCJyZXByJDAiLCJpbmNsdWRlIiwib2ZfZmxvYXQkMCIsInRvX2Zsb2F0JDAiLCJvZl9pbnRfZXhuJDAiLCJ0b19pbnRfZXhuJDAiLCJwcCQwIiwiaGFzaGFibGUkMCIsImlzX3Bvc2l0aXZlJDAiLCJpc19ub25fbmVnYXRpdmUkMCIsImlzX25lZ2F0aXZlJDAiLCJpc19ub25fcG9zaXRpdmUkMCIsInNpZ24kMCIsImludmFyaWFudCQwIiwidG9fc3RyaW5nX2h1bSQwIiwibWludXNfb25lJDAiLCJyZW0kMCIsInJvdW5kJDAiLCJyb3VuZF90b3dhcmRzX3plcm8kMCIsInJvdW5kX2Rvd24kMCIsInJvdW5kX3VwJDAiLCJyb3VuZF9uZWFyZXN0JDAiLCJzdWNjJDAiLCJwcmVkJDAiLCJwb3ckMCIsImJpdF9hbmQkMCIsImJpdF9vciQwIiwiYml0X3hvciQwIiwiYml0X25vdCQwIiwicG9wY291bnQkMCIsInNoaWZ0X2xlZnQkMCIsInNoaWZ0X3JpZ2h0JDAiLCJkZWNyJDAiLCJpbmNyJDAiLCJvZl9pbnQzMl9leG4kMCIsInRvX2ludDMyX2V4biQwIiwib2ZfaW50NjRfZXhuJDAiLCJ0b19pbnQ2NCQwIiwib2ZfbmF0aXZlaW50X2V4biQwIiwidG9fbmF0aXZlaW50X2V4biQwIiwibnVtX2JpdHMkMCIsIm1heF92YWx1ZSQwIiwibWluX3ZhbHVlJDAiLCJzaGlmdF9yaWdodF9sb2dpY2FsJDAiLCJjZWlsX3BvdzIkMCIsImZsb29yX3BvdzIkMCIsImNlaWxfbG9nMiQwIiwiaXNfcG93MiQwIiwiY2x6JDAiLCJjdHokMCIsIm9mX2ludCQwIiwidG9faW50JDAiLCJ0b19pbnRfdHJ1bmMkMCIsInRvX2ludDMyJDAiLCJvZl9pbnQ2NCQwIiwib2ZfbmF0aXZlaW50JDAiLCJ0b19uYXRpdmVpbnQkMCIsInRvX25hdGl2ZWludF90cnVuYyQwIiwib2ZfZmxvYXRfdW5jaGVja2VkJDAiLCJyZXByJDEiLCJic3dhcDMyJDAiLCJic3dhcDQ4JDAiLCJwb3NfZGlmZiIsIm5lZ2F0aXZlX29uZSIsImRpdl93b3VsZF9vdmVyZmxvdyIsInByb2R1Y3QiLCJhYnMkMSIsIm5lZyQwIiwicmFuZG9tX29mX2ludCIsInJhbmRvbV9vZl9pbnQ2NCIsInJhbmRvbV9vZl9pbnQkMCIsInJhbmRvbV9pbmNsX29mX2ludCIsInJhbmRvbV9pbmNsX29mX2ludDY0IiwicmFuZG9tX2luY2wiLCJmbG9vcl9sb2cyJDAiLCJpbnYiLCJsZWZ0X2tleSIsInJpZ2h0X2tleSIsInVwZGF0ZV9oZWlnaHQiLCJvbGRfaGVpZ2h0IiwibmV3X2hlaWdodCIsImJhbGFuY2UiLCJyb290X25vZGUiLCJsZWZ0X25vZGUiLCJyaWdodF9ub2RlIiwibGVmdF9ub2RlX2xlZnQiLCJsZWZ0X25vZGVfcmlnaHQiLCJscl9sZWZ0IiwibHJfcmlnaHQiLCJyaWdodF9ub2RlX2xlZnQiLCJyaWdodF9ub2RlX3JpZ2h0IiwicmxfbGVmdCIsInJsX3JpZ2h0Iiwic2V0X2xlZnQiLCJub2RlIiwidHJlZSQwIiwic2V0X3JpZ2h0IiwiYWRkZWQiLCJmaW5kaV9hbmRfY2FsbF9pbXBsIiwiYXJnMSIsImFyZzIiLCJjYWxsX2lmX2ZvdW5kIiwiY2FsbF9pZl9ub3RfZm91bmQiLCJmaW5kX2FuZF9jYWxsIiwiY2FsbF9pZl9mb3VuZCQwIiwiY2FsbF9pZl9ub3RfZm91bmQkMCIsImZpbmRpX2FuZF9jYWxsIiwiY2FsbF9pZl9mb3VuZCQxIiwiY2FsbF9pZl9ub3RfZm91bmQkMSIsImZpbmRfYW5kX2NhbGwxIiwiY2FsbF9pZl9mb3VuZCQyIiwiY2FsbF9pZl9ub3RfZm91bmQkMiIsImZpbmRpX2FuZF9jYWxsMSIsImNhbGxfaWZfZm91bmQkMyIsImNhbGxfaWZfbm90X2ZvdW5kJDMiLCJmaW5kX2FuZF9jYWxsMiIsImNhbGxfaWZfZm91bmQkNCIsImNhbGxfaWZfbm90X2ZvdW5kJDQiLCJmaW5kaV9hbmRfY2FsbDIiLCJpZl9mb3VuZCQwIiwiaWZfbm90X2ZvdW5kJDAiLCJyZW1vdmVkIiwia2V5JDQiLCJkYXRhJDQiLCJya2V5IiwicmRhdGEiLCJrZXkkMSIsInJrZXkkMCIsInJkYXRhJDAiLCJsa2V5JDAiLCJsZGF0YSQwIiwia2V5JDMiLCJkYXRhJDMiLCJya2V5JDEiLCJyZGF0YSQxIiwibGtleSIsImxkYXRhIiwia2V5JDIiLCJkYXRhJDIiLCJtYXBpX2lucGxhY2UiLCJlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCIsIndpdGhvdXRfbXV0YXRpbmciLCJtYXhfdGFibGVfbGVuZ3RoIiwiZ3Jvd3RoX2FsbG93ZWQiLCJzaXplJDAiLCJzaXplJDEiLCJzbG90IiwiYWRkX3dvcmtlciIsIm5ld19yb290IiwibWF5YmVfcmVzaXplX3RhYmxlIiwic2hvdWxkX2dyb3ciLCJuZXdfYXJyYXlfbGVuZ3RoIiwibmV3X3RhYmxlIiwib2xkX3RhYmxlIiwic2V4cF9vZl9rZXkkMCIsImFkZGVkX29yX3JlbW92ZWQiLCJidWNrZXQiLCJjaG9vc2Vfbm9uZW1wdHkiLCJ0YWJsZSIsImF2bHRyZWUiLCJpbnZhcmlhbnRfa2V5IiwiaW52YXJpYW50X2RhdGEiLCJyZWFsX2xlbiIsIm5ld190IiwidDAiLCJuZXdfZGF0YSQwIiwiZmluZF9vcl9hZGQiLCJpZCIsImZpbmRpX29yX2FkZCIsImZpbmRfYW5kX3JlbW92ZSIsInVwZGF0ZV9hbmRfcmV0dXJuIiwiaW5jcl9ieSIsInJlbW92ZV9pZl96ZXJvIiwiYnkiLCJjcmVhdGVfbWFwcGVkIiwiZ2V0X2tleSIsImdldF9kYXRhIiwiZHVwZXMiLCJvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMiLCJzZXhwX29mX2RhdGEiLCJkX29mX3NleHAiLCJrX2dyYW1tYXIiLCJyb3ciLCJvbGQiLCJjcmVhdGVfd2l0aF9rZXkiLCJjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IiLCJjcmVhdGVfd2l0aF9rZXlfZXhuIiwibWF5YmVfc2V0IiwidF9sZWZ0IiwidF9yaWdodCIsIm1lcmdlX2ludG8iLCJkc3RfZGF0YSIsImFjdGlvbiIsImRzdF9kYXRhJDAiLCJ0b19yZW1vdmUiLCJmaWx0ZXJfa2V5c19pbnBsYWNlIiwiZmlsdGVyX21hcGlfaW5wbGFjZSIsIm1hcF9yZXN1bHRzIiwiZmlsdGVyX21hcF9pbnBsYWNlIiwic2ltaWxhciIsIm9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyQwIiwiY3JlYXRlX21hcHBlZCQwIiwiY3JlYXRlX3dpdGhfa2V5JDAiLCJjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IkMCIsImNyZWF0ZV93aXRoX2tleV9leG4kMCIsIm9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyQxIiwiY3JlYXRlX21hcHBlZCQxIiwiY3JlYXRlX3dpdGhfa2V5JDEiLCJjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IkMSIsImNyZWF0ZV93aXRoX2tleV9leG4kMSIsImdyb3VwJDEiLCJoYXNoYWJsZV9zIiwicG9seV9oYXNoYWJsZSIsInN0cmljdF9hZGQiLCJzdHJpY3RfYWRkX2V4biIsInN0cmljdF9yZW1vdmUiLCJzdHJpY3RfcmVtb3ZlX2V4biIsInNleHBfb2ZfZSIsImxhcmdlciIsInNtYWxsZXIiLCJvZl9oYXNodGJsX2tleXMiLCJoYXNodGJsIiwidG9faGFzaHRibCIsImVfb2Zfc2V4cCIsIm1pbl9wb3NpdGl2ZV9zdWJub3JtYWxfdmFsdWUiLCJtaW5fcG9zaXRpdmVfbm9ybWFsX3ZhbHVlIiwicGkiLCJzcXJ0X3BpIiwic3FydF8ycGkiLCJldWxlciIsIm9mX2ludDYzIiwiaXJvdW5kX2xib3VuZCIsImlyb3VuZF91Ym91bmQiLCJpcm91bmRfdXAiLCJpcm91bmRfdXBfZXhuIiwiaXJvdW5kX2Rvd24iLCJpcm91bmRfZG93bl9leG4iLCJpcm91bmRfdG93YXJkc196ZXJvIiwiaXJvdW5kX3Rvd2FyZHNfemVyb19leG4iLCJyb3VuZF9uZWFyZXN0X2xiIiwicm91bmRfbmVhcmVzdF91YiIsIm9uZV91bHBfbGVzc190aGFuX2hhbGYiLCJhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCIsImlyb3VuZF9uZWFyZXN0XzMyIiwiaXJvdW5kX25lYXJlc3RfNjQiLCJpcm91bmRfbmVhcmVzdF82NCQwIiwiaXJvdW5kX25lYXJlc3RfZXhuXzMyIiwiaXJvdW5kX25lYXJlc3RfZXhuXzY0IiwiaXJvdW5kX25lYXJlc3RfZXhuIiwiaXJvdW5kX2V4biIsImlyb3VuZCIsImlzX2luZiIsImlzX2Zpbml0ZSIsIm1pbl9pbmFuIiwibWF4X2luYW4iLCJzY2FsZSIsInNxdWFyZSIsImZyYWN0aW9uYWwiLCJpbnRlZ3JhbCIsInJvdW5kX25lYXJlc3RfaW5saW5lIiwicm91bmRfbmVhcmVzdF9oYWxmX3RvX2V2ZW4iLCJjZWlsX29yX3N1Y2MiLCJkaWZmX2Zsb29yIiwiZGlmZl9jZWlsIiwiaW50NjNfcm91bmRfbGJvdW5kIiwiaW50NjNfcm91bmRfdWJvdW5kIiwiaW50NjNfcm91bmRfdXBfZXhuIiwiaW50NjNfcm91bmRfZG93bl9leG4iLCJpbnQ2M19yb3VuZF9uZWFyZXN0X3BvcnRhYmxlX2EiLCJpbnQ2M19yb3VuZF9uZWFyZXN0X2FyY2g2NF9ub2EiLCJpbnQ2M19yb3VuZF9uZWFyZXN0X2V4biIsImNsYXNzaWZ5Iiwic3RyaXBfemVybyIsImRlY2ltYWxzIiwiZXhwbGljaXRfcGx1cyIsInRvX3BhZGRlZF9jb21wYWN0X3N0cmluZ19jdXN0byIsImtpbG8iLCJtZWdhIiwiZ2lnYSIsInRlcmEiLCJwZXRhIiwibWFnIiwibnVtZXJhdG9yIiwiZGVub21pbmF0b3IiLCJoaWdoZXIiLCJkaWZmX3JpZ2h0IiwiZGlmZl9sZWZ0IiwicGV0YSQwIiwidG9fcGFkZGVkX2NvbXBhY3Rfc3RyaW5nIiwicm91bmRfZ2VuIiwic2QiLCJkZCIsImRkJDAiLCJzZCQwIiwiZGQkMSIsInNkJDEiLCJhYnNfZGQiLCJyb3VuZF9zaWduaWZpY2FudCIsInNpZ25pZmljYW50X2RpZ2l0cyIsInJvdW5kX2RlY2ltYWwiLCJkZWNpbWFsX2RpZ2l0cyIsInNpZ25fZXhuIiwic2lnbl9vcl9uYW4iLCJpZWVlX25lZ2F0aXZlIiwiZXhwb25lbnRfbWFzazY0IiwiZXhwb25lbnRfbWFzayIsIm1hbnRpc3NhX21hc2siLCJtYW50aXNzYV9tYXNrNjQiLCJtYW50aXNzYV9iaXRzIiwiaWVlZV9leHBvbmVudCIsImllZWVfbWFudGlzc2EiLCJjcmVhdGVfaWVlZV9leG4iLCJuZWdhdGl2ZSIsIm1hbnRpc3NhIiwic2lnbl9iaXRzIiwiZXhwdF9iaXRzIiwibWFudF9iaXRzIiwiY3JlYXRlX2llZWUiLCJzcGVjaWFsaXplZF9oYXNoIiwiYWRkX3N1YnN0cmluZyIsImFkZF9zdWJieXRlcyIsImVsaWRlZF9tZXNzYWdlIiwiZWxpZGUiLCJhdF9tb3N0X251bV9mcmFtZXMiLCJ0b19zdHJpbmdfbGlzdCIsInNldF9yZWNvcmRpbmciLCJhbV9yZWNvcmRpbmciLCJtb3N0X3JlY2VudCIsIm1vc3RfcmVjZW50X2Zvcl9leG4iLCJ3aXRoX3JlY29yZGluZyIsInNhdmVkIiwib2NhbWxydW5wYXJhbV9tZW50aW9uc19iYWNrdHJhIiwiYXJyYXlfb2Zfc2V4cCIsInNleHBfb2ZfYXJyYXkiLCJhcnJheV9zZXhwX2dyYW1tYXIiLCJib29sX29mX3NleHAiLCJzZXhwX29mX2Jvb2wiLCJib29sX3NleHBfZ3JhbW1hciIsImNoYXJfb2Zfc2V4cCIsInNleHBfb2ZfY2hhciIsImNoYXJfc2V4cF9ncmFtbWFyIiwic2V4cF9vZl9leG4iLCJmdW5jJDEiLCJmbG9hdF9vZl9zZXhwIiwic2V4cF9vZl9mbG9hdCIsImZsb2F0X3NleHBfZ3JhbW1hciIsImZ1bmMkMiIsImludF9vZl9zZXhwIiwic2V4cF9vZl9pbnQiLCJpbnRfc2V4cF9ncmFtbWFyIiwiZnVuYyQzIiwiaW50MzJfb2Zfc2V4cCIsInNleHBfb2ZfaW50MzIiLCJpbnQzMl9zZXhwX2dyYW1tYXIiLCJmdW5jJDQiLCJpbnQ2NF9vZl9zZXhwIiwic2V4cF9vZl9pbnQ2NCIsImludDY0X3NleHBfZ3JhbW1hciIsImxpc3Rfb2Zfc2V4cCIsInNleHBfb2ZfbGlzdCIsImxpc3Rfc2V4cF9ncmFtbWFyIiwiZnVuYyQ1IiwibmF0aXZlaW50X29mX3NleHAiLCJzZXhwX29mX25hdGl2ZWludCIsIm5hdGl2ZWludF9zZXhwX2dyYW1tYXIiLCJvcHRpb25fb2Zfc2V4cCIsInNleHBfb2Zfb3B0aW9uIiwib3B0aW9uX3NleHBfZ3JhbW1hciIsInJlZl9vZl9zZXhwIiwic2V4cF9vZl9yZWYiLCJyZWZfc2V4cF9ncmFtbWFyIiwic3RyaW5nX29mX3NleHAiLCJzZXhwX29mX3N0cmluZyIsInN0cmluZ19zZXhwX2dyYW1tYXIiLCJjb21wYXJlX2J5dGVzIiwiZXF1YWxfYnl0ZXMiLCJieXRlc19vZl9zZXhwIiwic2V4cF9vZl9ieXRlcyIsImJ5dGVzX3NleHBfZ3JhbW1hciIsImZ1bmMkNiIsInVuaXRfb2Zfc2V4cCIsInNleHBfb2ZfdW5pdCIsInVuaXRfc2V4cF9ncmFtbWFyIiwiZmFpbHdpdGgiLCJpbnZhbGlkX2FyZyIsImNvbXBhcmVfYXJyYXkkMCIsImVxdWFsX2FycmF5JDAiLCJhcnJheV9vZl9zZXhwJDAiLCJzZXhwX29mX2FycmF5JDAiLCJhcnJheV9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfYm9vbCQwIiwiZXF1YWxfYm9vbCQwIiwiaGFzaF9mb2xkX2Jvb2wkMCIsImhhc2hfYm9vbCQwIiwiYm9vbF9vZl9zZXhwJDAiLCJzZXhwX29mX2Jvb2wkMCIsImJvb2xfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2NoYXIkMCIsImVxdWFsX2NoYXIkMCIsImhhc2hfZm9sZF9jaGFyJDAiLCJoYXNoX2NoYXIkMCIsImNoYXJfb2Zfc2V4cCQwIiwic2V4cF9vZl9jaGFyJDAiLCJjaGFyX3NleHBfZ3JhbW1hciQwIiwic2V4cF9vZl9leG4kMCIsImNvbXBhcmVfZmxvYXQkMCIsImVxdWFsX2Zsb2F0JDAiLCJoYXNoX2ZvbGRfZmxvYXQkMCIsImhhc2hfZmxvYXQkMCIsImZsb2F0X29mX3NleHAkMCIsInNleHBfb2ZfZmxvYXQkMCIsImZsb2F0X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9pbnQkMCIsImVxdWFsX2ludCQwIiwiaGFzaF9mb2xkX2ludCQwIiwiaGFzaF9pbnQkMCIsImludF9vZl9zZXhwJDAiLCJzZXhwX29mX2ludCQwIiwiaW50X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9pbnQzMiQwIiwiZXF1YWxfaW50MzIkMCIsImhhc2hfZm9sZF9pbnQzMiQwIiwiaGFzaF9pbnQzMiQwIiwiaW50MzJfb2Zfc2V4cCQwIiwic2V4cF9vZl9pbnQzMiQwIiwiaW50MzJfc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX2ludDY0JDAiLCJlcXVhbF9pbnQ2NCQwIiwiaGFzaF9mb2xkX2ludDY0JDAiLCJoYXNoX2ludDY0JDAiLCJpbnQ2NF9vZl9zZXhwJDAiLCJzZXhwX29mX2ludDY0JDAiLCJpbnQ2NF9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfbGlzdCQwIiwiZXF1YWxfbGlzdCQwIiwiaGFzaF9mb2xkX2xpc3QkMCIsImxpc3Rfb2Zfc2V4cCQwIiwic2V4cF9vZl9saXN0JDAiLCJsaXN0X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9uYXRpdmVpbnQkMCIsImVxdWFsX25hdGl2ZWludCQwIiwiaGFzaF9mb2xkX25hdGl2ZWludCQwIiwiaGFzaF9uYXRpdmVpbnQkMCIsIm5hdGl2ZWludF9vZl9zZXhwJDAiLCJzZXhwX29mX25hdGl2ZWludCQwIiwibmF0aXZlaW50X3NleHBfZ3JhbW1hciQwIiwiY29tcGFyZV9vcHRpb24kMCIsImVxdWFsX29wdGlvbiQwIiwiaGFzaF9mb2xkX29wdGlvbiQwIiwib3B0aW9uX29mX3NleHAkMCIsInNleHBfb2Zfb3B0aW9uJDAiLCJvcHRpb25fc2V4cF9ncmFtbWFyJDAiLCJjb21wYXJlX3JlZiQwIiwiZXF1YWxfcmVmJDAiLCJyZWZfb2Zfc2V4cCQwIiwic2V4cF9vZl9yZWYkMCIsInJlZl9zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfc3RyaW5nJDAiLCJlcXVhbF9zdHJpbmckMCIsImhhc2hfZm9sZF9zdHJpbmckMCIsImhhc2hfc3RyaW5nJDAiLCJzdHJpbmdfb2Zfc2V4cCQwIiwic2V4cF9vZl9zdHJpbmckMCIsInN0cmluZ19zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfYnl0ZXMkMCIsImVxdWFsX2J5dGVzJDAiLCJieXRlc19vZl9zZXhwJDAiLCJzZXhwX29mX2J5dGVzJDAiLCJieXRlc19zZXhwX2dyYW1tYXIkMCIsImNvbXBhcmVfdW5pdCQwIiwiZXF1YWxfdW5pdCQwIiwiaGFzaF9mb2xkX3VuaXQkMCIsImhhc2hfdW5pdCQwIiwidW5pdF9vZl9zZXhwJDAiLCJzZXhwX29mX3VuaXQkMCIsInVuaXRfc2V4cF9ncmFtbWFyJDAiLCJyYWlzZV9zJDAiLCJwaHlzX2VxdWFsJDAiLCJ0X3NleHBfZ3JhbW1hciIsIm5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2giLCJ0IiwiZW5hYmxlX2V2ZXJ5dGhpbmciLCJhbV9ydW5uaW5nX2lubGluZV90ZXN0X2Vudl92YXIiLCJ0b19zdHJpbmciLCJjb21iaW5lIiwidDEiLCJ0MiIsImNvbWJpbmVfYWxsIiwidHMiLCJ0ZXN0X21vZHVsZXNfcmFuIiwidGVzdF9tb2R1bGVzX2ZhaWxlZCIsInRlc3RzX3JhbiIsInRlc3RzX2ZhaWxlZCIsImR5bmFtaWNfbGliIiwiYWN0aW9uIiwiZm9yY2VfZHJvcCIsImdldCIsImN1cnJlbnQiLCJmb3VuZF90ZXN0IiwiaXNfY3VycmVudCIsInAiLCJjdXJyZW50JDAiLCJjdXJyZW50X3RhZ3MiLCJ0IiwibSIsInZlcmJvc2UiLCJzdHJpY3QiLCJzaG93X2NvdW50cyIsImxpc3RfdGVzdF9uYW1lcyIsImRlbGF5ZWRfZXJyb3JzIiwic3RvcF9vbl9lcnJvciIsImxvZyIsInRpbWVfc2VjIiwidXNlX2NvbG9yIiwiaW5fcGxhY2UiLCJkaWZmX2NvbW1hbmQiLCJzb3VyY2VfdHJlZV9yb290IiwiYWxsb3dfb3V0cHV0X3BhdHRlcm5zIiwiZGlzcGxheWVkX2Rlc2NyIiwiZGVzY3IiLCJmaWxlbmFtZSIsImxpbmUiLCJzdGFydF9wb3MiLCJlbmRfcG9zIiwibmFtZSIsInJlc3QiLCJsaWIiLCJ0ZXN0cyIsImxpc3RfcGFydGl0aW9ucyIsInBhcnRpdGlvbiIsInRhZ19wcmVkaWNhdGUiLCJuYW1lX2ZpbHRlciIsIm1zZyQxIiwiZiIsImFub24iLCJzIiwic3RyIiwiZmlsZSIsImluZGV4IiwiaW5kZXgkMCIsImkiLCJmaWxlbmFtZSQwIiwiaW5kZXhfc3RyaW5nIiwiaW5kZXgkMSIsInRhZyIsImwiLCJhcmd2IiwibXNnIiwibXNnJDAiLCJ2IiwiYW1fdGVzdF9ydW5uZXIiLCJhbV9ydW5uaW5nX2lubGluZV90ZXN0IiwidGVzdGluZyIsIndhbGxfdGltZV9jbG9ja19ucyIsIndoZXJlX3RvX2N1dF9iYWNrdHJhY2UiLCJ0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV8iLCJiZWZvcmVfbnMiLCJyZXMiLCJleG4kMCIsImV4biIsInNhdmVkX2NhbWxfcmFuZG9tX3N0YXRlIiwic2F2ZWRfYmFzZV9yYW5kb21fc3RhdGUiLCJzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyIiwicHJpbnRfZGVsYXllZF9lcnJvcnMiLCJkZWxheWVkX2Vycm9ycyQwIiwibWVzc2FnZSIsImVwcmludGZfb3JfZGVsYXkiLCJmbXQiLCJhZGRfaG9va3MiLCJDIiwiaHVtX2JhY2t0cmFjZSIsImJhY2t0cmFjZSIsInRlc3RfaW5uZXIiLCJjb25maWciLCJ0YWdzIiwiZGVmX2ZpbGVuYW1lIiwiZGVmX2xpbmVfbnVtYmVyIiwiYm9vbF9vZl9mIiwid2hhdF90b19kbyIsIndoaWNoX3RhZ3MiLCJvbmx5X3Rlc3RfbG9jYXRpb24iLCJsaWJuYW1lIiwiZiQwIiwiZGVzY3IkMCIsImNvbXBsZXRlX3RhZ3MiLCJ1c2VkIiwibGluZV9udW1iZXJfb3B0IiwicG9zaXRpb25fc3RhcnQiLCJlbmRfb2ZfZGVmX2ZpbGVuYW1lIiwibGluZV9udW1iZXIiLCJmb3VuZCIsInJlcSIsImRyb3BwZWQiLCJkZXNjciQxIiwic3Vic3RyaW5nIiwic2hvdWxkX3J1biIsImRlc2NyJDIiLCJjaCIsInJlc3VsdCQwIiwiY2FtbF9yYW5kb21fc3RhdGUiLCJiYXNlX3JhbmRvbV9zdGF0ZSIsInJlc3VsdCIsImJhY2t0cmFjZSQwIiwiZXhuX3N0ciIsInNlcCIsInNldF9saWJfYW5kX3BhcnRpdGlvbiIsInN0YXRpY19saWIiLCJ3aGljaF90ZXN0cyIsInJlcXVpcmVzX3BhcnRpdGlvbiIsInVuc2V0X2xpYiIsInRlc3QiLCJiIiwidGVzdF91bml0IiwidGVzdF9tb2R1bGUiLCJwYXJ0aWFsX3RhZ3MiLCJwcmV2IiwieCIsImUkMCIsImUiLCJzdW1tYXJpemUiLCJrIiwiYWNjIiwiY291bnQiLCJjb3VudF90ZXN0X21vZHVsZXMiLCJ1bnVzZWRfdGVzdHMiLCJlcnJvcnMiLCJ1c2VfY29sb3IkMCIsImluX3BsYWNlJDAiLCJkaWZmX2NvbW1hbmQkMCIsInNvdXJjZV90cmVlX3Jvb3QkMCIsImFsbG93X291dHB1dF9wYXR0ZXJucyQwIiwiZXZhbHVhdG9ycyIsImFkZF9ldmFsdWF0b3IiLCJleGl0IiwiYWJzdXJkIiwic3RyIiwibWFrZSIsImluaXQiLCJjb25jYXQiLCJjb21wYXJlIiwic3ViIiwic3BsaXRfb25fY2hhciIsIm9uZSIsImMiLCJpc19wcmVmaXgiLCJhIiwiYiIsImxlbl9hIiwiaXNfc3VmZml4IiwibGVuX2IiLCJmaW5kIiwiZiIsInN0YXJ0IiwicyIsImxlbiIsImkiLCJpJDAiLCJoYXMiLCJmaW5kX2J3ZCIsImJleW9uZCIsImJleW9uZCQwIiwibGlzdCIsImNzIiwiaiIsImNzJDAiLCJvZl9saXN0IiwiYnMiLCJyZXZlcnNlIiwiaGFzX21vcmUiLCJwZWVrIiwiYWR2YW5jZSIsIm1ha2UkMCIsIm1ha2Vfd2l0aF9zaXplIiwiZXN0aW1hdGUiLCJyIiwiZXN0aW1hdGUkMCIsImJ1ZmZlciIsImNhcGFjaXR5IiwiciQwIiwiYm5ldyIsInIkMSIsInJldHVybiQwIiwiZmFpbCIsImUiLCJ0b19vcHRpb24iLCJzeW1ib2xfYmluZCIsIm0iLCJtYXAiLCJtYXBfZXJyb3IiLCJnZXQiLCJhZGQiLCJ4IiwieSIsImRpdmlkZSIsIml0ZXJhdGUiLCJuIiwibiQwIiwidiIsInYkMCIsIm4kMSIsImxldCQwIiwidG9fbGlzdCIsImFwcGVuZCIsImNvcHkiLCJibGl0IiwiZm9sZF9sZWZ0IiwiZm9sZF9yaWdodCIsImZvcl9hbGwiLCJleGlzdHMiLCJpc19lbXB0eSIsInhzIiwidmFsaWRfaW5kZXgiLCJoYXNfc29tZSIsImZpcnN0IiwibGFzdCIsImZvbGRpX2xlZnQiLCJpZHgiLCJwdXNoIiwieHNfbmV3IiwicHVzaF9mcm9udCIsImluc2VydCIsImFyciIsInJlcGxhY2UiLCJyZW1vdmUiLCJyZW1vdmVfZmlyc3QiLCJyZW1vdmVfbGFzdCIsInAiLCJiaW5zZWFyY2giLCJrZXlfb2YiLCJrZXkiLCJjbXAiLCJ1cHBlciQwIiwiY21wJDEiLCJsb3dlciQxIiwiY21wJDIiLCJsb3dlciIsInVwcGVyIiwibG93ZXIkMCIsImNtcCQwIiwiY2FyZGluYWwiLCJiaW5kaW5ncyIsInZhbHVlIiwicmVzdWx0IiwiaW5kZXhfb2YiLCJleGFjdCIsInBhaXIiLCJmaW5kX29wdCIsIm1lbSIsImVtcHR5Iiwic2luZ2xldG9uIiwidXBkYXRlIiwidmFsdWUkMCIsInJlbW92ZSQwIiwic2V0IiwicmVzIiwiZWxlbWVudHMiLCJsc3QiLCJlbGVtZW50IiwiaW5zZXJ0X2Rvd253YXJkIiwic2V0JDAiLCJzZXQkMSIsImluc2VydF91cHdhcmQiLCJiaXRzaXplIiwiYnJhbmNoaW5nIiwic2xvdCIsImwiLCJvZmZzZXQiLCJmdWxsX3NpemUiLCJsZXZlbCIsInBhcmFtIiwiaXNfZnVsbCIsImxlbmd0aCIsInQiLCJjaGVja19pbnZhcmlhbnQiLCJjaGVjayIsImlzX3Jvb3QiLCJub2RlIiwiaXNfcm9vdCQwIiwibmNoaWxkcmVuIiwiY2hpbGQiLCJzaXplIiwiZm9sZCIsInQkMCIsIm8iLCJ0JDEiLCJzaW5nbGV0b25fdHJlZSIsImxldiIsInB1c2hfbm90X2Z1bGwiLCJub2RlcyIsInBvcF9hdXgiLCJub2RlcyQwIiwiY2hpbGQkMCIsImUkMCIsIm5vZGVzJDEiLCJwb3AiLCJwb3Bfb3B0IiwiZmlsbCIsInN0YXJ0JDAiLCJzdGFydCQxIiwib2siLCJ0bCIsImhkIiwic3ltYm9sIiwiZyIsInN5bWJvbCQwIiwiZmxzdCIsInNwbGl0X2hlYWRfdGFpbCIsIm1hcF9hbmRfZmlsdGVyIiwic3BsaXRfYXQiLCJyZXN0IiwicHJlZml4IiwicmVzdCQwIiwicmVzdCQxIiwicHJlZml4JDAiLCJ0cmFuc3Bvc2UiLCJyb3dfbGlzdCIsImNvbHVtbnMiLCJyb3dfbGlzdCQwIiwicm93IiwiY29sdW1uIiwicmVzdF9yb3ciLCJlbCIsInJvd19saXN0JDEiLCJjb2x1bW5zJDAiLCJmb2xkaSIsImZpZm8iLCJwb3BfZnJvbnQiLCJmcm9udCIsImZyb250JDAiLCJoZCQwIiwiZW1wdHkkMCIsInB1c2hfZnJvbnQkMCIsImxmIiwicHVzaF9yZWFyIiwicG9wX2Zyb250JDAiLCJsZiQwIiwidXBkYXRlX2ZpcnN0IiwidXBkYXRlX2xhc3QiLCJmaWZvJDAiLCJvcmRlciIsIm9kZF9vcmRlciIsIm1heF9rZXlzIiwibWluX2tleXMiLCJrZXlzIiwiY2hpbGRyZW4iLCJrZXlzJDAiLCJhY2N1IiwiYWNjdSQwIiwibWFwJDAiLCJwYWlycyIsInBhaXJzJDAiLCJhY2N1JDEiLCJtYXAkMSIsImFjY3UkMiIsImJzZWFyY2giLCJleGFjdCQwIiwic3ViYXJyYXkiLCJpbnNlcnRfc3ViYXJyYXkiLCJhcnIyIiwic3BsaXRfc3ViYXJyYXkiLCJhcnIkMCIsImFkZF9pbl9sZWFmIiwiaW5zZXJ0X3N1YmFycmF5JDAiLCJrIiwibGVmdCIsInJpZ2h0IiwibGVmdCQwIiwicmlnaHQkMCIsImxlZnQkMSIsInJpZ2h0JDEiLCJsZWZ0JDIiLCJyaWdodCQyIiwibGVmdCQzIiwicmlnaHQkMyIsImFkZF9pbl9ub2RlIiwiY2hpbGRyZW4kMCIsInNwbGl0X3N1YmFycmF5JDAiLCJsZWZ0X3BhaXJzIiwibGVmdF9jaGlsZHJlbiIsInJpZ2h0X3BhaXJzIiwicmlnaHRfY2hpbGRyZW4iLCJsZWZ0X3BhaXJzJDAiLCJsZWZ0X2NoaWxkcmVuJDAiLCJyaWdodF9wYWlycyQwIiwicmlnaHRfY2hpbGRyZW4kMCIsImxlZnRfcGFpcnMkMSIsImxlZnRfY2hpbGRyZW4kMSIsInJpZ2h0X3BhaXJzJDEiLCJyaWdodF9jaGlsZHJlbiQxIiwibGVmdF9wYWlycyQyIiwibGVmdF9jaGlsZHJlbiQyIiwicmlnaHRfcGFpcnMkMiIsInJpZ2h0X2NoaWxkcmVuJDIiLCJsZWZ0X3BhaXJzJDMiLCJsZWZ0X2NoaWxkcmVuJDMiLCJyaWdodF9wYWlycyQzIiwicmlnaHRfY2hpbGRyZW4kMyIsImFkZF9hdXgiLCJwYWlycyQxIiwidSIsIm5vdF9taW5pbWFsIiwicmVwbGFjZTIiLCJyb3RhdGVfa2V5cyIsInRvX2xlZnQiLCJwYXJlbnQiLCJyb3RhdGVfY2hpbGRyZW4iLCJtZXJnZV9rZXlzIiwibGVuX2xlZnQiLCJsZW5fcmlnaHQiLCJtZXJnZWQiLCJwYXJlbnQkMCIsIm1lcmdlX2xlYXZlcyIsInBhaXJzMSIsInBhaXJzMiIsInVuZGVyZmxvdyIsIm1lcmdlX25vZGVzIiwiY2hpbGRyZW4xIiwiY2hpbGRyZW4yIiwicGFpcnNfbmV3IiwiY2hpbGRyZW5fbmV3IiwiaGFuZGxlX3VuZGVyZmxvdyIsInVuZGVyZmxvd19sZWZ0IiwibGVmdF9jaGlsZCIsInJpZ2h0X2NoaWxkIiwibm90X21pbmltYWwkMCIsInBhaXJzMiQwIiwicGFpcnMxJDAiLCJwYWlyczEkMSIsInBhaXJzMiQxIiwicGFpcnMyJDIiLCJwYWlyczEkMiIsImNoaWxkcmVuMiQwIiwiY2hpbGRyZW4xJDAiLCJjaGlsZHJlbiQxIiwiY2hpbGRyZW4yJDEiLCJoYW5kbGVfZGVsZXRlIiwiZCIsImxlbiQwIiwicmVtb3ZlX2F1eCIsInBhaXIkMCIsInBhaXJzJDIiLCJ1cGRhdGVfYXV4IiwidmFsdWUkMSIsImQkMCIsInNvdXJjZSIsImRvd24iLCJ0cmVlIiwic3RhY2siLCJ0cmVlJDAiLCJzdGFjayQwIiwic3RhY2skMSIsInRyZWUkMSIsInVwIiwibWFrZV9zb3VyY2UiLCJkb191cHdhcmQiLCJkb19kb3dud2FyZCIsImFkZF91cHdhcmQiLCJhZGRfZG93bndhcmQiLCJyZW1vdmVfdXB3YXJkIiwicmVtb3ZlX2Rvd253YXJkIiwiY2hlY2tfcmFuZ2UiLCJvayQwIiwic291cmNlJDAiLCJzb3VyY2UkMSIsInVwZGF0ZV91cHdhcmQiLCJudWxsJDAiLCJ1bmRlZmluZWQkMCIsImludCQwIiwiaSIsImZsb2F0JDAiLCJ2IiwiYm9vbCIsInN0cmluZyIsIm9iamVjdCIsImFycmF5IiwiZnVuY3Rpb24xIiwiZiIsImZ1bmN0aW9uMiIsImZ1bmN0aW9uMyIsInN0cmluZ2lmeSIsInBhcnNlIiwiaXNfZnVuY3Rpb24iLCJyZXR1cm4kMCIsImEiLCJmYWlsIiwidmFsdWUiLCJsZXQkMCIsIm0iLCJzeW1ib2wiLCJwIiwicSIsInIiLCJtYXAiLCJudWxsJDEiLCJvYmoiLCJ1bmRlZmluZWQkMSIsImZsb2F0JDEiLCJpbnQkMSIsImJvb2wkMCIsInN0cmluZyQwIiwiZnVuY3Rpb24kMCIsImFyZ3MiLCJtZXRob2QiLCJmaWVsZCIsIm5hbWUiLCJkZWNvZGUiLCJhcnJheSQwIiwibGVuIiwiZXh0cmFjdCIsImxzdCIsImUiLCJvcHRpb24iLCJvZl9leGNlcHRpb24iLCJleG4iLCJyYWlzZV9qc19lcnJvciIsImpzX2Vycm9yIiwicmFpc2VfanMiLCJtZXNzYWdlIiwianNfbXNnIiwibG9nX3N0cmluZyIsInN0ciIsImxvZ192YWx1ZSIsImV4cG9ydCQwIiwibWFrZV9nbG9iYWwiLCJnZXRfZ2xvYmFsIiwibmV3X2dsb2JhbCIsImNuYW1lIiwiY29uc3RyIiwiZGVjb2RlX2NhbGxiYWNrIiwiY2IiLCJlcnIiLCJjYiQwIiwiZGVjb2RlX2RhdGEiLCJkZWMiLCJkYXRhIiwic3RhdGUiLCJub2RlX21vZHVsZSIsIm1zZ19kZWNvZGUiLCJub2RlX2Z1bmN0aW9uIiwianNfZnVuY3Rpb24iLCJjYWxsYmFjayIsImNhbGxiYWNrJDAiLCJkYXRhJDAiLCJtc2ciLCJtc2ckMCIsImJyb3dzZXJfYXBwbGljYXRpb24iLCJhcHBfbmFtZSIsInN0YXRlX2RlY29kZSIsImJyb3dzZXJfZnVuY3Rpb24iLCJlbGVtZW50Iiwic3RhdGUkMCIsImVsZW1lbnQkMCIsInN0b3BfcHJvcGFnYXRpb24iLCJwcmV2ZW50X2RlZmF1bHQiLCJhZGQiLCJoYW5kbGVyIiwidGd0IiwicmVtb3ZlIiwic2V0IiwibXMiLCJjbGVhciIsInQiLCJzZXRfaW50ZXJ2YWwiLCJjbGVhcl9pbnRlcnZhbCIsInNlbmRfbWVzc2FnZSIsImRvX2FzeW5jIiwic3RhcnQiLCJ1cmwiLCJ3IiwiZXZlbnQiLCJwb3N0X21lc3NhZ2UiLCJ0ZXJtaW5hdGUiLCJtYWtlIiwicG9zdCIsInBvc3QkMCIsInBvc3QkMSIsImYkMCIsInN0YXJ0JDAiLCJ3b3JrZXJfZGVjb2RlIiwid29ya2VyIiwicG9zdF90b19jcmVhdG9yIiwicG9zdF90b193b3JrZXIiLCJwb3N0X21lc3NhZ2UkMCIsInRlcm1pbmF0ZSQwIiwic2ltdWxhdGVfanMiLCJ3ZnVuIiwiZXZlbnRfdGFyZ2V0IiwicmVxIiwiaGVhZGVycyIsImJvZHkiLCJyZXF1ZXN0IiwicmVhZHlfc3RhdGUiLCJzdGF0dXMiLCJyZXNwb25zZV90ZXh0X3ZhbHVlIiwicmVzcG9uc2VfdGV4dF9zdHJpbmciLCJzIiwibm9kZSIsInBhcmVudCIsImZpcnN0IiwibmV4dCIsImFwcGVuZCIsImNoaWxkIiwicmVtb3ZlJDAiLCJyZXBsYWNlIiwibmV3X2NoaWxkIiwib2xkX2NoaWxkIiwicmVtb3ZlX2NoaWxkcmVuIiwibm9kZV92YWx1ZSIsInNldF9ub2RlX3ZhbHVlIiwic2Nyb2xsX3dpZHRoIiwic2Nyb2xsX2hlaWdodCIsImNsaWVudF93aWR0aCIsImNsaWVudF9oZWlnaHQiLCJzY3JvbGxfbGVmdCIsInNjcm9sbF90b3AiLCJzZXRfc2Nyb2xsX2xlZnQiLCJzZXRfc2Nyb2xsX3RvcCIsInN0eWxlIiwic2V0X2F0dHJpYnV0ZSIsInJlbW92ZV9hdHRyaWJ1dGUiLCJzZXRfcHJvcGVydHkiLCJkZWxldGVfcHJvcGVydHkiLCJmb2N1cyIsImJsdXIiLCJ0aXRsZSIsInNldF90aXRsZSIsImZpbmQiLCJkb2MiLCJjcmVhdGVfZWxlbWVudCIsInRhZyIsImNyZWF0ZV90ZXh0X25vZGUiLCJ0ZXh0IiwiY3JlYXRlX2VsZW1lbnRfbnMiLCJuYW1lc3BhY2UiLCJjcmVhdGVfZG9jdW1lbnRfZnJhZ21lbnQiLCJnbyIsImhpc3RvcnkiLCJwdXNoX3N0YXRlIiwicmVwbGFjZV9zdGF0ZSIsImhyZWYiLCJwcm90b2NvbCIsImhvc3QiLCJwb3J0IiwicGF0aG5hbWUiLCJzZWFyY2giLCJoYXNoIiwiYXNzaWduIiwibG9jYXRpb24iLCJyZWxvYWQiLCJnZXQiLCJldmVudF90YXJnZXQkMCIsImRvY3VtZW50Iiwib25fbmV4dF9hbmltYXRpb24iLCJub3ciLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwibWlsbGkiLCJvZl92YWx1ZSIsImQiLCJ6b25lX29mZnNldCIsImRhdGUiLCJob3VycyIsIm1pbnV0ZXMiLCJzZWNvbmRzIiwibWlsbGlzZWNvbmRzIiwiZW1wdHkiLCJmaW5kX29wdCIsImtleSIsImQiLCJpIiwidiIsImsiLCJhZGQiLCJ2YWx1ZSIsIm4iLCJzZXQiLCJmIiwiaWR4Iiwib2ZfbGlzdCIsImxzdCIsInRsIiwiZm9sZCIsImFjY3UiLCJpdGVyIiwiZGljdCIsImRpZmYiLCJyZW1vdmUiLCJkMSIsImQyIiwidmFsdWUyIiwidXRjIiwibWFrZSIsIm1pbnV0ZXMiLCJvZmZzZXQiLCJ6b25lIiwiemVybyIsImFkYXB0IiwidGltZSIsInllYXIiLCJtb250aCIsImRheV9vZl9tb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaV9zZWNvbmQiLCJzdHJpbmciLCJwYXJzZSIsInN0ciIsInN0cmluZyQwIiwibG9jIiwiaXNfcGFnZSIsImhhbmRsZXIiLCJyZWYiLCJlIiwidXBkYXRlIiwiYWN0dWFsIiwiZmlyZSIsIm1hcCIsImEiLCJtYWtlX29uZSIsImRpc3BhdGNoIiwiZXZlbnQiLCJkZWNvZGUiLCJwcmV2ZW50Iiwic3RvcCIsIm0iLCJtYWtlX2xpc3QiLCJ0YXJnZXQiLCJldmVudF90eXBlIiwidXBkYXRlJDAiLCJlbXB0eSQwIiwibWFrZV90aW1lciIsIm1pbGxpcyIsImgiLCJyZW1vdmVfdGltZXIiLCJ0aW1lciIsInNldCQwIiwidXBkYXRlJDEiLCJlbXB0eSQxIiwiYWRkJDAiLCJ0YWciLCJocmVmIiwidXJsIiwibWFrZSQwIiwic2V0JDEiLCJ2aXJ0IiwicmVxIiwidXBkYXRlJDIiLCJ2aXJ0MSIsInZpcnQyIiwiZjEiLCJhY3R1YWwkMCIsImFjdHVhbCQxIiwic3R5bGUiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZSIsImF0dHJzIiwibmFtZSIsInZhbHVlJDAiLCJuYW1lJDAiLCJ2YWx1ZSQxIiwibmFtZSQxIiwibmFtZSQyIiwidGV4dCIsInMiLCJub2RlIiwibm9kZV9ucyIsIm5hbWVzcGFjZSIsImtleWVkIiwiZWxlbWVudCIsImFkZF9hdHRyaWJ1dGVzIiwib3BzIiwiZWwiLCJ2ZG9tIiwibWFrZV9jaGlsZHJlbiIsInJlYWxfY2hpbGRyZW4iLCJjb21iaW5lZF9jaGlsZHJlbiIsInBhcmVudCIsImxzdCQwIiwiYXR0cnMkMCIsInRhZyQwIiwicmVhbF9jaGlsZHJlbiQwIiwiY29tYmluZWRfY2hpbGRyZW4kMCIsInBhcmVudCQwIiwiaGQiLCJoZCQwIiwiaGQyIiwidGwyIiwidGwxIiwidXBkYXRlX2F0dHJpYnV0ZXMiLCJwYXIiLCJhdHRyczEiLCJhdHRyczIiLCJkb20iLCJzMiIsInMxIiwibHN0MiIsInRhZzIiLCJsc3QxIiwidGFnMSIsInVwZGF0ZV9jaGlsZHJlbiIsImNoaWxkcmVuIiwicGFyJDAiLCJsc3QyJDAiLCJhdHRyczIkMCIsInRhZzIkMCIsIm5zMiIsImxzdDEkMCIsImF0dHJzMSQwIiwidGFnMSQwIiwibnMxIiwiY2hpbGRyZW4kMCIsInBhciQxIiwiYXR0cnMyJDEiLCJ0YWcyJDEiLCJhdHRyczEkMSIsInRhZzEkMSIsImNoaWxkcmVuJDEiLCJ1cGRhdGVfa2V5ZWQiLCJkb20kMCIsImRvbSQxIiwiZWwkMCIsIm5sc3QyIiwibmxzdDIkMCIsImxzdDIkMiIsImxzdDEkMSIsImhkMSIsImhkMSQwIiwiaGQxMSIsIm5sc3QyJDIiLCJsc3QyJDEiLCJvbGRfZWwiLCJjcmVhdGVkIiwiaGQyJDAiLCJuZXdfZWwiLCJubHN0MiQxIiwiYXR0ZW1wdCIsImNsZWFudXAiLCJleG4kMCIsImV4biIsImNvbCIsImxpbmUiLCJmaWxlIiwibXNnIiwianNfZXJyb3IiLCJydW4iLCJyYW5kb20iLCJjb25zdGFudCIsInN5bWJvbF9iaW5kIiwic3RhdGUiLCJpbnQkMCIsImJvdW5kIiwiZmxvYXQkMCIsImJvb2wiLCJjaG9vc2UiLCJhcnIiLCJsZW4iLCJhYnN1cmQiLCJjb250aW51ZSQwIiwidGFzayIsInBvc3QiLCJzdWNjZWVkIiwiZmFpbCIsInJlc3VsdCIsInIiLCJtYWtlX3N1Y2NlZWQiLCJyZXMiLCJsb2dfc3RyaW5nIiwibG9nX3ZhbHVlIiwic2xlZXAiLCJtcyIsIm5leHRfdGljayIsInNlbmRfdG9famF2YXNjcmlwdCIsImZvY3VzIiwiaWQiLCJibHVyIiwicmFuZCIsImh0dHBfdGV4dCIsIm1ldGgiLCJoZWFkZXJzIiwiYm9keSIsInN0YXR1cyIsImh0dHBfanNvbiIsIm5vdyIsInRpbWVfem9uZSIsIm5vbmUiLCJiYXRjaCIsIm9uX3dpbmRvdyIsImV2ZXJ5IiwiY2FsbGJhY2siLCJvbl9tZXNzYWdlIiwib25fdXJsX3JlcXVlc3QiLCJzdWIiLCJnIiwiZGVjb2RlJDAiLCJnJDAiLCJkZWNvZGVfa2V5X2V2ZW50IiwiZGVjb2RlX21vdXNlX2V2ZW50IiwieCIsInkiLCJvbl9rZXlkb3duIiwib25fa2V5dXAiLCJvbl9tb3VzZV9kb3duIiwib25fbW91c2VfbW92ZSIsIm9uX21vdXNlX3VwIiwib25fcmVzaXplIiwid2lkdGgiLCJoZWlnaHQiLCJvbl92aXNpYmlsaXR5X2NoYW5nZSIsInN1YnMiLCJ3aW5kb3ciLCJ0aW1lcnMiLCJ1cmxfcmVxdWVzdCIsInBlcmZvcm0iLCJqdXN0X2RvIiwiY21kIiwiZXhlY3V0ZSIsImV4ZSIsInRhc2skMCIsImRvY3VtZW50IiwiZG9tX29wZXJhdGlvbnMiLCJnZXRfYm90aCIsImdldF9lbGVtZW50IiwiZGljdDEiLCJkaWN0MiIsInJlYWxzIiwibmV3X2NoaWxkIiwib2xkX2NoaWxkIiwiY2hpbGQiLCJkb2MiLCJkYXRhIiwidXBkYXRlX2RhdGEiLCJzdGF0ZV9kaWZmZXJlbnQiLCJ1cGRhdGVfc3Vic2NyaXB0aW9ucyIsImRpc3BhdGNoX25leHQiLCJwb3N0JDAiLCJjbWQkMCIsInN0YXRlJDAiLCJwdXRfYmVsb3dfcm9vdCIsInJvb3Rfbm9kZSIsInVwZGF0ZV9kb20iLCJ2aWV3IiwidmlldyQwIiwidmlldyQxIiwidGl0bGUiLCJzZXRfdGl0bGUiLCJ2ZG9tJDAiLCJvbl9uZXh0X2FuaW1hdGlvbiIsImFuaW1hdGUiLCJ3cmFwX3N0YXRlX2Z1biIsIndyYXBfdmlldyIsIndyYXBfc3Vic2NyaXB0aW9uIiwid3JhcF91cGRhdGUiLCJtZXNzYWdlIiwicmVjZWl2ZV9tZXNzYWdlIiwiZGF0YSQwIiwic3RhcnRfYXBwbGljYXRpb24iLCJjb21tYW5kIiwibWFrZV9zYW5kYm94Iiwic2FuZGJveCIsInNhbmRib3hfcGx1cyIsImRhdGFyZWYiLCJlbGVtZW50X2lkIiwiaW5pdCIsInJvb3QiLCJhcHBsaWNhdGlvbiIsImJhc2ljX2FwcGxpY2F0aW9uIiwiZGVidWciLCJkZWJ1Z192YWx1ZSIsIm9uIiwib25fY2xpY2siLCJmb250X3NpemUiLCJzaXplIiwiY29sb3IiLCJiYWNrZ3JvdW5kX2NvbG9yIiwibWFyZ2luIiwicGFkZGluZyIsImJvcmRlcl9zdHlsZSIsImJvcmRlcl93aWR0aCIsImJvcmRlcl9jb2xvciIsImNsYXNzJDAiLCJzcmMiLCJwbGFjZWhvbGRlciIsIm9uX2lucHV0IiwiaDEiLCJub2RlcyIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiLCJkaXYiLCJzcGFuIiwicHJlIiwicCIsImJ1dHRvbiIsImlucHV0IiwibGFiZWwiLCJ0ZXh0YXJlYSIsInNlbGVjdCIsIm9sIiwidWwiLCJsaSIsInN2Z19ub2RlIiwicHJpbnRfZmxvYXQiLCJ2IiwiZmFocmVuaGVpdF90b19jZWxjaXVzIiwiZmFocmVuaGVpdCIsImNlbGNpdXNfdG9fZmFocmVuaGVpdCIsImNlbGNpdXMiLCJzZXRfdGVtcGVyYXR1cmUiLCJzdGF0ZSIsImlzX2NlbGNpdXMiLCJ2YWx1ZSIsImluaXQiLCJ1cGRhdGUiLCJ2aWV3IiwibWVzc2FnZSIsInRlbXBlcmF0dXJlX2ZpZWxkIiwidHh0IiwiZiIsImVycm9yIl0sInNvdXJjZXMiOlsiL2J1aWx0aW4vK2ludDY0LmpzIiwiL2J1aWx0aW4vK21sQnl0ZXMuanMiLCIvYnVpbHRpbi8rZmFpbC5qcyIsIi9idWlsdGluLytzdGRsaWIuanMiLCIvYnVpbHRpbi8rc3lzLmpzIiwiL2J1aWx0aW4vK2JhY2t0cmFjZS5qcyIsIi9idWlsdGluLytqc2xpYi5qcyIsIi9idWlsdGluLytmb3JtYXQuanMiLCIvYnVpbHRpbi8raWVlZV83NTQuanMiLCIvYnVpbHRpbi8rZWZmZWN0LmpzIiwiL2J1aWx0aW4vK2ZzX25vZGUuanMiLCIvYnVpbHRpbi8rZnMuanMiLCIvYnVpbHRpbi8rdW5peC5qcyIsIi9idWlsdGluLytmc19mYWtlLmpzIiwiL2J1aWx0aW4vK25hdC5qcyIsIi9idWlsdGluLytncmFwaGljcy5qcyIsIi9idWlsdGluLytydW50aW1lX2V2ZW50cy5qcyIsIi9idWlsdGluLyttYXJzaGFsLmpzIiwiL2J1aWx0aW4vK2lvLmpzIiwiL2J1aWx0aW4vK2djLmpzIiwiL2J1aWx0aW4vK2JpZ2FycmF5LmpzIiwiL2J1aWx0aW4vK2ludHMuanMiLCIvYnVpbHRpbi8raGFzaC5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlX2ludGVybmFsaGFzaF90eXBlcy9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3BhcnNpbmcuanMiLCIvYnVpbHRpbi8rb2JqLmpzIiwiL2J1aWx0aW4vK2RvbWFpbi5qcyIsIi9idWlsdGluLytjb21wYXJlLmpzIiwiL2J1aWx0aW4vK2pzbGliX2pzX29mX29jYW1sLmpzIiwiL2J1aWx0aW4vK2JpZ3N0cmluZy5qcyIsIi9idWlsdGluLyttZDUuanMiLCIvYnVpbHRpbi8rc3RyLmpzIiwiL2J1aWx0aW4vK2xleGluZy5qcyIsIi9idWlsdGluLythcnJheS5qcyIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ydW50aW1lLmpzIiwiL2J1aWx0aW4vK3N5bmMuanMiLCIvYnVpbHRpbi8rd2Vhay5qcyIsIi9idWlsdGluLytwcm5nLmpzIiwiL2J1aWx0aW4vK3pzdGQuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3RpbWVfbm93L3J1bnRpbWUuanMiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc3RkbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N5cy5tbC5pbiIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb2JqLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9hdG9taWMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbExhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xhenkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3NlcS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvb3B0aW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9yZXN1bHQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Jvb2wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VjaGFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2J5dGVzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zdHJpbmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3VuaXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL21hcnNoYWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9mbG9hdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaW50MzIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2ludDY0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9uYXRpdmVpbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2xleGluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcGFyc2luZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3N0YWNrLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zZW1hcGhvcmUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RvbWFpbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FtbGludGVybmFsRm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9wcmludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2FyZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvcHJpbnRleGMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2Z1bi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZ2MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2RpZ2VzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvYmlnYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL3JhbmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvaGFzaHRibC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvd2Vhay5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZm9ybWF0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9zY2FuZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvY2FsbGJhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NhbWxpbnRlcm5hbE9PLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9jYW1saW50ZXJuYWxNb2QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2VwaGVtZXJvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvZmlsZW5hbWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2NvbXBsZXgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL2luX2NoYW5uZWwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL29jYW1sL291dF9jaGFubmVsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9vY2FtbC9lZmZlY3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lX18ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sLWNvbXBpbGVyL3J1bnRpbWUvanNvb19ydW50aW1lLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc19vZl9vY2FtbF9fLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9pbXBvcnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2pzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3R5cGVkX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maWxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9kb21faHRtbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvZm9ybS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwveG1sSHR0cFJlcXVlc3QubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3dvcmtlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViU29ja2V0cy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvd2ViR0wubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3JlZ2V4cC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvdXJsLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9zeXNfanMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL3Jlc2l6ZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9wZXJmb3JtYW5jZU9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9tdXRhdGlvbk9ic2VydmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc3RhYmxlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9qc29uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9jU1MubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9ldmVudHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2RvbV9zdmcubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2V2ZW50U291cmNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9maXJlYnVnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9qc19vZl9vY2FtbC9nZW9sb2NhdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvanNfb2Zfb2NhbWwvaW50ZXJzZWN0aW9uT2JzZXJ2ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2pzX29mX29jYW1sL2ludGwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3BweF9pbmxpbmVfdGVzdC9jb25maWcvaW5saW5lX3Rlc3RfY29uZmlnLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2dyYW1tYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9ncmFtbWFyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9zZXhwbGliMC9zZXhwX2NvbnYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL3NleHBsaWIwL3NleHBfY29udl9lcnJvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wb2x5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbXBvcnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3ByaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zeXMwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2FycmF5MC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jaGFyMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2NvbXBhcmVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3BweF9oYXNoX2xpYi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3dvcmRfc2l6ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9wcmV0dHlfcHJpbnRlci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9leG4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvd2l0aF9yZXR1cm4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbW9uYWRfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tb25hZC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hcHBsaWNhdGl2ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlczAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvY29tcGFyYXRvci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ZpZWxkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZzAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2xpc3QxLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXJfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGF6eS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb21fcmVwci5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXlfcGVybXV0ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9mbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2luZm8ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZXJyb3IubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW52YXJpYW50Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29yX2Vycm9yLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3NpZ24wLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NvbXBhcmFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pZGVudGlmaWFibGUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdW5pdC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JpbmFyeV9zZWFyY2gubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYmluYXJ5X3NlYXJjaGFibGVfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iaW5hcnlfc2VhcmNoYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ibGl0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9zZXhwYWJsZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9laXRoZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW5kZXhlZF9jb250YWluZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2VxdWVuY2UubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvb2JqX2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3VuaWZvcm1fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQwLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2NoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcHB4X2VudW1lcmF0ZV9saWIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnl0ZXNfdHIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhZ2VkLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3N0cmluZy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ieXRlcy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9oZXhfbGV4ZXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X2NvbnZlcnNpb25zLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3Bvd19vdmVyZmxvd19ib3VuZHMubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50X21hdGgubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvcG9wY291bnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9pbnQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdWNoYXIubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvdHlwZV9lcXVhbC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9vcHRpb25fYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc3RhY2subWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc291cmNlX2NvZGVfcG9zaXRpb24ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2lnbl9vcl9uYW4ubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWF5YmVfYm91bmQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbWFwX2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0X2ludGYubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2Uvc2V0Lm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL3JlZi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9xdWV1ZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ub3RoaW5nLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL25hdGl2ZWludC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9tYXAubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvbGlua2VkX3F1ZXVlMC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9saW5rZWRfcXVldWUubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaW50NjNfZW11bC5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9ib29sLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDMyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2ludDYzLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmxfaW50Zi5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9hdmx0cmVlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2hhc2h0YmwubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvaGFzaF9zZXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvZmxvYXQubWwiLCIvVXNlcnMvaGVsbXV0Ly5vcGFtL2RlZmF1bHQvbGliL2Jhc2UvYnVmZmVyLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9iYXNlL2JhY2t0cmFjZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvYmFzZS9iYXNlLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfc2V4cF9jb252L3J1bnRpbWUtbGliL3BweF9zZXhwX2NvbnZfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi9wcHhfZW51bWVyYXRlL3J1bnRpbWUtbGliL3BweF9lbnVtZXJhdGVfbGliLm1sIiwiL1VzZXJzL2hlbG11dC8ub3BhbS9kZWZhdWx0L2xpYi90aW1lX25vdy90aW1lX25vdy5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvcHB4X2lubGluZV90ZXN0L3J1bnRpbWUtbGliL3J1bnRpbWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC92b2lkLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvc3RyaW5nLm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL3Jlc3VsdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2ludC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL29wdGlvbi5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1saSIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvc3RkL2FycmF5Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvcmJfYXJyYXkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9saXN0Lm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9zdGQvZGVxdWUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL3N0ZC9idHJlZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvYmFzZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZXZlbnQubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2V2ZW50X3RhcmdldC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvdGltZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL3dlYl93b3JrZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2pzL2h0dHBfcmVxdWVzdC5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvanMvZG9tLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9qcy9kYXRlLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2RpY3Rpb25hcnkubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGltZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci91cmwubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvaGFuZGxlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hdHRyaWJ1dGUubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdmRvbS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9hc3NlcnRfZmFpbHVyZS5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9yYW5kb20ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvdGFzay5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9zdWJzY3JpcHRpb24ubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvc3Vic2NyaXB0aW9ucy5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvYnJvd3Nlci9jb21tYW5kLm1sIiwiL1VzZXJzL2hlbG11dC9naXRodWIvaGJyL2ZtbGliL19idWlsZC9kZWZhdWx0L3NyYy9icm93c2VyL2Jyb3dzZXIubWwiLCIvVXNlcnMvaGVsbXV0L2dpdGh1Yi9oYnIvZm1saWIvX2J1aWxkL2RlZmF1bHQvc3JjL2Jyb3dzZXIvZm1saWJfYnJvd3Nlci5tbCIsIi9Vc2Vycy9oZWxtdXQvZ2l0aHViL2hici9mbWxpYi9fYnVpbGQvZGVmYXVsdC9zcmMvZXhhbXBsZXMvYnJvd3Nlci90ZW1wZXJhdHVyZS5tbCIsIi9Vc2Vycy9oZWxtdXQvLm9wYW0vZGVmYXVsdC9saWIvb2NhbWwvc3RkX2V4aXQubWwiXSwibWFwcGluZ3MiOiI7Ozs7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7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REwsc0JBTVFIO2tCQVZSQyxzQkFVUUQsSUFGMkNRO0tBSTNDOzs7S0FZSixPQWhCNEJELG9CQUFtQkMsT0FBbENGLDZCQUFrQ0U7O0dBMkIxQztHQUlULElBREFDLHNCQWxDQU47WUEyQ0FPLE9BQVFKO0lEbEViO1NDb0VlRjtLQUNOLE9BMUNKQyxnQkF1Q1FDLFVBRUVGOztRQUVHRjtJQUNULE9BNUNKRyxnQkF1Q1FDLFVBSUtKOztZQUtiUyxLQUFNTDtJQUNOLFNBRUlNLFFBQVFMLFlBQVdQLEdBQ25CLE9BRFFPLGlCQUFXUCxZQUlIO2FBQ2hCYSxrQkFBa0JDLEtBQUlkLEdBQUVlO0tBQ3hCO2dCQU9RLGdDQVJVRDtnQkFPVjtnQkFGUSxpQ0FMUUM7Z0JBSVIsaUNBSk1mO01BR1IsVUFBRTtNQURILFVBQ0w7TUFGRCxVQUNIO0tBREc7SUFTTjtPQWxCQ007U0FtQkZVOztLQUl1Qjs7WUFBQztNQUFmLFVBQUM7TUFKVkEsWUFJSztJQUVUO0lBS29ELGtCRHpHekQsT0M4RVNKO0lBMkJBO2VBdEJBQyxrQ0FSRVAsZ0JBbUJGVTtLQVdBO0lBRjBDLGtCRHZHbkQsT0M4RVNKO0lBeUJBO2VBcEJBQywrQkFSRVA7S0EwQkksVUFBQztLQURKLFVBQ0g7SUFERztHQVFKO0dBR0MsOEJBdERKRyxNQWtCQUUsTUFUQUQ7Ozs7T0FuREFYO09BSUFFO09BSUFFO09BSUFFO09BOEJBSTtPQVNBQztPQVNBQzs7O0VEM0VMOzs7Ozs7Ozs7Ozs7O0dDQUE7Ozs7Ozs7O0dDa0JTOzs7O0VEbEJUIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG52YXIgY2FtbF9pbnQ2NF9vZmZzZXQgPSBNYXRoLnBvdygyLCAtMjQpO1xuXG4vL1Byb3ZpZGVzOiBNbEludDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mZnNldCwgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuZnVuY3Rpb24gTWxJbnQ2NCAobG8sbWksaGkpIHtcbiAgdGhpcy5sbyA9IGxvICYgMHhmZmZmZmY7XG4gIHRoaXMubWkgPSBtaSAmIDB4ZmZmZmZmO1xuICB0aGlzLmhpID0gaGkgJiAweGZmZmY7XG59XG5NbEludDY0LnByb3RvdHlwZS5jYW1sX2N1c3RvbSA9IFwiX2pcIlxuTWxJbnQ2NC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG8sdGhpcy5taSx0aGlzLmhpKTtcbn1cblxuTWxJbnQ2NC5wcm90b3R5cGUudWNvbXBhcmUgPSBmdW5jdGlvbiAoeCkge1xuICBpZiAodGhpcy5oaSA+IHguaGkpIHJldHVybiAxO1xuICBpZiAodGhpcy5oaSA8IHguaGkpIHJldHVybiAtMTtcbiAgaWYgKHRoaXMubWkgPiB4Lm1pKSByZXR1cm4gMTtcbiAgaWYgKHRoaXMubWkgPCB4Lm1pKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLmxvID4geC5sbykgcmV0dXJuIDE7XG4gIGlmICh0aGlzLmxvIDwgeC5sbykgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgaGkgPSB0aGlzLmhpIDw8IDE2O1xuICB2YXIgeGhpID0geC5oaSA8PCAxNjtcbiAgaWYgKGhpID4geGhpKSByZXR1cm4gMTtcbiAgaWYgKGhpIDwgeGhpKSByZXR1cm4gLTE7XG4gIGlmICh0aGlzLm1pID4geC5taSkgcmV0dXJuIDE7XG4gIGlmICh0aGlzLm1pIDwgeC5taSkgcmV0dXJuIC0xO1xuICBpZiAodGhpcy5sbyA+IHgubG8pIHJldHVybiAxO1xuICBpZiAodGhpcy5sbyA8IHgubG8pIHJldHVybiAtMTtcbiAgcmV0dXJuIDA7XG59XG5NbEludDY0LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBsbyA9IC0gdGhpcy5sbztcbiAgdmFyIG1pID0gLSB0aGlzLm1pICsgKGxvID4+IDI0KTtcbiAgdmFyIGhpID0gLSB0aGlzLmhpICsgKG1pID4+IDI0KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KGxvLCBtaSwgaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIGxvID0gdGhpcy5sbyArIHgubG87XG4gIHZhciBtaSA9IHRoaXMubWkgKyB4Lm1pICsgKGxvID4+IDI0KTtcbiAgdmFyIGhpID0gdGhpcy5oaSArIHguaGkgKyAobWkgPj4gMjQpO1xuICByZXR1cm4gbmV3IE1sSW50NjQobG8sIG1pLCBoaSk7XG59XG5NbEludDY0LnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiAoeCkge1xuICB2YXIgbG8gPSB0aGlzLmxvIC0geC5sbztcbiAgdmFyIG1pID0gdGhpcy5taSAtIHgubWkgKyAobG8gPj4gMjQpO1xuICB2YXIgaGkgPSB0aGlzLmhpIC0geC5oaSArIChtaSA+PiAyNCk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBsbyA9IHRoaXMubG8gKiB4LmxvO1xuICB2YXIgbWkgPSAoKGxvICogY2FtbF9pbnQ2NF9vZmZzZXQpIHwgMCkgKyB0aGlzLm1pICogeC5sbyArIHRoaXMubG8gKiB4Lm1pO1xuICB2YXIgaGkgPSAoKG1pICogY2FtbF9pbnQ2NF9vZmZzZXQpIHwgMCkgKyB0aGlzLmhpICogeC5sbyArIHRoaXMubWkgKiB4Lm1pICsgdGhpcy5sbyAqIHguaGk7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICh0aGlzLmxvfHRoaXMubWl8dGhpcy5oaSkgPT0gMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKHRoaXMuaGkgPDwgMTYpIDwgMDtcbn1cbk1sSW50NjQucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh0aGlzLmxvICYgeC5sbywgdGhpcy5taSAmIHgubWksIHRoaXMuaGkgJiB4LmhpKTtcbn1cbk1sSW50NjQucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG98eC5sbywgdGhpcy5taXx4Lm1pLCB0aGlzLmhpfHguaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUueG9yID0gZnVuY3Rpb24gKHgpIHtcbiAgcmV0dXJuIG5ldyBNbEludDY0KHRoaXMubG9eeC5sbywgdGhpcy5taV54Lm1pLCB0aGlzLmhpXnguaGkpO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuc2hpZnRfbGVmdCA9IGZ1bmN0aW9uIChzKSB7XG4gIHMgPSBzICYgNjM7XG4gIGlmIChzID09IDApIHJldHVybiB0aGlzO1xuICBpZiAocyA8IDI0KSB7XG4gICAgcmV0dXJuIG5ldyBNbEludDY0ICh0aGlzLmxvIDw8IHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5taSA8PCBzKSB8ICh0aGlzLmxvID4+ICgyNCAtIHMpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhpIDw8IHMpIHwgKHRoaXMubWkgPj4gKDI0IC0gcykpKTtcbiAgfVxuICBpZiAocyA8IDQ4KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG8gPDwgKHMgLSAyNCksXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5taSA8PCAocyAtIDI0KSkgfCAodGhpcy5sbyA+PiAoNDggLSBzKSkpO1xuICByZXR1cm4gbmV3IE1sSW50NjQoMCwgMCwgdGhpcy5sbyA8PCAocyAtIDQ4KSlcbn1cbk1sSW50NjQucHJvdG90eXBlLnNoaWZ0X3JpZ2h0X3Vuc2lnbmVkID0gZnVuY3Rpb24gKHMpIHtcbiAgcyA9IHMgJiA2MztcbiAgaWYgKHMgPT0gMCkgcmV0dXJuIHRoaXM7XG4gIGlmIChzIDwgMjQpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgKHRoaXMubWkgPj4gcykgfCAodGhpcy5oaSA8PCAoMjQgLSBzKSksXG4gICAgICAodGhpcy5oaSA+PiBzKSk7XG4gIGlmIChzIDwgNDgpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLm1pID4+IChzIC0gMjQpKSB8ICh0aGlzLmhpIDw8ICg0OCAtIHMpKSxcbiAgICAgICh0aGlzLmhpID4+IChzIC0gMjQpKSxcbiAgICAgIDApO1xuICByZXR1cm4gbmV3IE1sSW50NjQgKHRoaXMuaGkgPj4gKHMgLSA0OCksIDAsIDApO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUuc2hpZnRfcmlnaHQgPSBmdW5jdGlvbiAocykge1xuICBzID0gcyAmIDYzO1xuICBpZiAocyA9PSAwKSByZXR1cm4gdGhpcztcbiAgdmFyIGggPSAodGhpcy5oaSA8PCAxNikgPj4gMTY7XG4gIGlmIChzIDwgMjQpXG4gICAgcmV0dXJuIG5ldyBNbEludDY0IChcbiAgICAgICh0aGlzLmxvID4+IHMpIHwgKHRoaXMubWkgPDwgKDI0IC0gcykpLFxuICAgICAgKHRoaXMubWkgPj4gcykgfCAoaCA8PCAoMjQgLSBzKSksXG4gICAgICAoKHRoaXMuaGkgPDwgMTYpID4+IHMpID4+PiAxNik7XG4gIHZhciBzaWduID0gKHRoaXMuaGkgPDwgMTYpID4+IDMxO1xuICBpZiAocyA8IDQ4KVxuICAgIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgICAodGhpcy5taSA+PiAocyAtIDI0KSkgfCAodGhpcy5oaSA8PCAoNDggLSBzKSksXG4gICAgICAodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAyNCkgPj4gMTYsXG4gICAgICBzaWduICYgMHhmZmZmKTtcbiAgcmV0dXJuIG5ldyBNbEludDY0ICgodGhpcy5oaSA8PCAxNikgPj4gKHMgLSAzMiksIHNpZ24sIHNpZ24pO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubHNsMSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5oaSA9ICh0aGlzLmhpIDw8IDEpIHwgKHRoaXMubWkgPj4gMjMpO1xuICB0aGlzLm1pID0gKCh0aGlzLm1pIDw8IDEpIHwgKHRoaXMubG8gPj4gMjMpKSAmIDB4ZmZmZmZmO1xuICB0aGlzLmxvID0gKHRoaXMubG8gPDwgMSkgJiAweGZmZmZmZjtcbn1cbk1sSW50NjQucHJvdG90eXBlLmxzcjEgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMubG8gPSAoKHRoaXMubG8gPj4+IDEpIHwgKHRoaXMubWkgPDwgMjMpKSAmIDB4ZmZmZmZmO1xuICB0aGlzLm1pID0gKCh0aGlzLm1pID4+PiAxKSB8ICh0aGlzLmhpIDw8IDIzKSkgJiAweGZmZmZmZjtcbiAgdGhpcy5oaSA9IHRoaXMuaGkgPj4+IDE7XG59XG5NbEludDY0LnByb3RvdHlwZS51ZGl2bW9kID0gZnVuY3Rpb24gKHgpIHtcbiAgdmFyIG9mZnNldCA9IDA7XG4gIHZhciBtb2R1bHVzID0gdGhpcy5jb3B5KCk7XG4gIHZhciBkaXZpc29yID0geC5jb3B5KCk7XG4gIHZhciBxdW90aWVudCA9IG5ldyBNbEludDY0KDAsMCwwKTtcbiAgd2hpbGUgKG1vZHVsdXMudWNvbXBhcmUoZGl2aXNvcikgPiAwKSB7XG4gICAgb2Zmc2V0Kys7XG4gICAgZGl2aXNvci5sc2wxKCk7XG4gIH1cbiAgd2hpbGUgKG9mZnNldCA+PSAwKSB7XG4gICAgb2Zmc2V0IC0tO1xuICAgIHF1b3RpZW50LmxzbDEoKTtcbiAgICBpZiAobW9kdWx1cy51Y29tcGFyZShkaXZpc29yKSA+PSAwKSB7XG4gICAgICBxdW90aWVudC5sbyArKztcbiAgICAgIG1vZHVsdXMgPSBtb2R1bHVzLnN1YihkaXZpc29yKTtcbiAgICB9XG4gICAgZGl2aXNvci5sc3IxKCk7XG4gIH1cbiAgcmV0dXJuIHsgcXVvdGllbnQgOiBxdW90aWVudCwgbW9kdWx1cyA6IG1vZHVsdXMgfTtcbn1cbk1sSW50NjQucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uICh5KVxue1xuICB2YXIgeCA9IHRoaXM7XG4gIGlmICh5LmlzWmVybygpKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpO1xuICB2YXIgc2lnbiA9IHguaGkgXiB5LmhpO1xuICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gIGlmICh5LmhpICYgMHg4MDAwKSB5ID0geS5uZWcoKTtcbiAgdmFyIHEgPSB4LnVkaXZtb2QoeSkucXVvdGllbnQ7XG4gIGlmIChzaWduICYgMHg4MDAwKSBxID0gcS5uZWcoKTtcbiAgcmV0dXJuIHE7XG59XG5NbEludDY0LnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiAoeSlcbntcbiAgdmFyIHggPSB0aGlzO1xuICBpZiAoeS5pc1plcm8oKSkgY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKTtcbiAgdmFyIHNpZ24gPSB4LmhpO1xuICBpZiAoeC5oaSAmIDB4ODAwMCkgeCA9IHgubmVnKCk7XG4gIGlmICh5LmhpICYgMHg4MDAwKSB5ID0geS5uZWcoKTtcbiAgdmFyIHIgPSB4LnVkaXZtb2QoeSkubW9kdWx1cztcbiAgaWYgKHNpZ24gJiAweDgwMDApIHIgPSByLm5lZygpO1xuICByZXR1cm4gcjtcbn1cbk1sSW50NjQucHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5sbyB8ICh0aGlzLm1pIDw8IDI0KTtcbn1cbk1sSW50NjQucHJvdG90eXBlLnRvRmxvYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAoKHRoaXMuaGkgPDwgMTYpICogTWF0aC5wb3coMiwgMzIpICsgdGhpcy5taSAqIE1hdGgucG93KDIsIDI0KSkgKyB0aGlzLmxvO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFt0aGlzLmhpID4+IDgsXG4gICAgICAgICAgdGhpcy5oaSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5taSA+PiAxNixcbiAgICAgICAgICAodGhpcy5taSA+PiA4KSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5taSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5sbyA+PiAxNixcbiAgICAgICAgICAodGhpcy5sbyA+PiA4KSAmIDB4ZmYsXG4gICAgICAgICAgdGhpcy5sbyAmIDB4ZmZdO1xufVxuTWxJbnQ2NC5wcm90b3R5cGUubG8zMiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMubG8gfCAoKHRoaXMubWkgJiAweGZmKSA8PCAyNCk7XG59XG5NbEludDY0LnByb3RvdHlwZS5oaTMyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gKCh0aGlzLm1pID4+PiA4KSAmIDB4ZmZmZikgfCAodGhpcy5oaSA8PCAxNik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdWx0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3VsdCh4LHkpIHsgcmV0dXJuIHgudWNvbXBhcmUoeSkgPCAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfY29tcGFyZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9jb21wYXJlKHgseSwgdG90YWwpIHsgcmV0dXJuIHguY29tcGFyZSh5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbmVnIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X25lZyAoeCkgeyByZXR1cm4geC5uZWcoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYWRkIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FkZCAoeCwgeSkgeyByZXR1cm4geC5hZGQoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3N1YiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9zdWIgKHgsIHkpIHsgcmV0dXJuIHguc3ViKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9tdWwgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2ludDY0X211bCh4LHkpIHsgcmV0dXJuIHgubXVsKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc196ZXJvIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2lzX3plcm8oeCkgeyByZXR1cm4gK3guaXNaZXJvKCk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSh4KSB7IHJldHVybiAreC5pc05lZygpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYW5kIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2FuZCAoeCwgeSkgeyByZXR1cm4geC5hbmQoeSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vciBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vciAoeCwgeSkgeyByZXR1cm4geC5vcih5KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3hvciBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF94b3IgKHgsIHkpIHsgcmV0dXJuIHgueG9yKHkpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9zaGlmdF9sZWZ0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQgKHgsIHMpIHsgcmV0dXJuIHguc2hpZnRfbGVmdChzKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQgKHgsIHMpIHsgcmV0dXJuIHguc2hpZnRfcmlnaHRfdW5zaWduZWQocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0ICh4LCBzKSB7IHJldHVybiB4LnNoaWZ0X3JpZ2h0KHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9kaXYgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfZGl2ICh4LCB5KSB7IHJldHVybiB4LmRpdih5KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbW9kIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X21vZCAoeCwgeSkgeyByZXR1cm4geC5tb2QoeSkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X29mX2ludDMyIGNvbnN0XG4vL1JlcXVpcmVzOiBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2ludDMyICh4KSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCh4ICYgMHhmZmZmZmYsICh4ID4+IDI0KSAmIDB4ZmZmZmZmLCAoeCA+PiAzMSkgJiAweGZmZmYpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9faW50MzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9faW50MzIgKHgpIHsgcmV0dXJuIHgudG9JbnQoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdG9fZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfdG9fZmxvYXQgKHgpIHsgcmV0dXJuIHgudG9GbG9hdCAoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfb2ZfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zmc2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX2Zsb2F0ICh4KSB7XG4gIGlmICh4IDwgMCkgeCA9IE1hdGguY2VpbCh4KTtcbiAgcmV0dXJuIG5ldyBNbEludDY0KFxuICAgIHggJiAweGZmZmZmZixcbiAgICBNYXRoLmZsb29yKHggKiBjYW1sX2ludDY0X29mZnNldCkgJiAweGZmZmZmZixcbiAgICBNYXRoLmZsb29yKHggKiBjYW1sX2ludDY0X29mZnNldCAqIGNhbWxfaW50NjRfb2Zmc2V0KSAmIDB4ZmZmZik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfZm9ybWF0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlX2Zvcm1hdCwgY2FtbF9maW5pc2hfZm9ybWF0dGluZ1xuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9pc19uZWdhdGl2ZSwgY2FtbF9pbnQ2NF9uZWdcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2ZfaW50MzIsIGNhbWxfaW50NjRfdG9faW50MzJcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfaXNfemVybywgY2FtbF9zdHJfcmVwZWF0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2Zvcm1hdCAoZm10LCB4KSB7XG4gIHZhciBmID0gY2FtbF9wYXJzZV9mb3JtYXQoZm10KTtcbiAgaWYgKGYuc2lnbmVkY29udiAmJiBjYW1sX2ludDY0X2lzX25lZ2F0aXZlKHgpKSB7XG4gICAgZi5zaWduID0gLTE7IHggPSBjYW1sX2ludDY0X25lZyh4KTtcbiAgfVxuICB2YXIgYnVmZmVyID0gXCJcIjtcbiAgdmFyIHdiYXNlID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihmLmJhc2UpO1xuICB2YXIgY3Z0YmwgPSBcIjAxMjM0NTY3ODlhYmNkZWZcIjtcbiAgZG8ge1xuICAgIHZhciBwID0geC51ZGl2bW9kKHdiYXNlKTtcbiAgICB4ID0gcC5xdW90aWVudDtcbiAgICBidWZmZXIgPSBjdnRibC5jaGFyQXQoY2FtbF9pbnQ2NF90b19pbnQzMihwLm1vZHVsdXMpKSArIGJ1ZmZlcjtcbiAgfSB3aGlsZSAoISBjYW1sX2ludDY0X2lzX3plcm8oeCkpO1xuICBpZiAoZi5wcmVjID49IDApIHtcbiAgICBmLmZpbGxlciA9ICcgJztcbiAgICB2YXIgbiA9IGYucHJlYyAtIGJ1ZmZlci5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBidWZmZXIgPSBjYW1sX3N0cl9yZXBlYXQgKG4sICcwJykgKyBidWZmZXI7XG4gIH1cbiAgcmV0dXJuIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgYnVmZmVyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSwgY2FtbF9mYWlsd2l0aCwgY2FtbF9wYXJzZV9kaWdpdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9pbnQzMiwgY2FtbF9pbnQ2NF91bHRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfYWRkLCBjYW1sX2ludDY0X211bCwgY2FtbF9pbnQ2NF9uZWdcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCxjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBNbEludDY0XG5mdW5jdGlvbiBjYW1sX2ludDY0X29mX3N0cmluZyhzKSB7XG4gIHZhciByID0gY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlIChzKTtcbiAgdmFyIGkgPSByWzBdLCBzaWduID0gclsxXSwgYmFzZSA9IHJbMl07XG4gIHZhciBiYXNlNjQgPSBjYW1sX2ludDY0X29mX2ludDMyKGJhc2UpO1xuICB2YXIgdGhyZXNob2xkID1cbiAgICAgIG5ldyBNbEludDY0KDB4ZmZmZmZmLCAweGZmZmZmZmYsIDB4ZmZmZikudWRpdm1vZChiYXNlNjQpLnF1b3RpZW50O1xuICB2YXIgYyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSk7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICBmb3IgKDs7KSB7XG4gICAgaSsrO1xuICAgIGMgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpO1xuICAgIGlmIChjID09IDk1KSBjb250aW51ZTtcbiAgICBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgICBpZiAoZCA8IDAgfHwgZCA+PSBiYXNlKSBicmVhaztcbiAgICAvKiBEZXRlY3Qgb3ZlcmZsb3cgaW4gbXVsdGlwbGljYXRpb24gYmFzZSAqIHJlcyAqL1xuICAgIGlmIChjYW1sX2ludDY0X3VsdCh0aHJlc2hvbGQsIHJlcykpIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICAgIGQgPSBjYW1sX2ludDY0X29mX2ludDMyKGQpO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfYWRkKGNhbWxfaW50NjRfbXVsKGJhc2U2NCwgcmVzKSwgZCk7XG4gICAgLyogRGV0ZWN0IG92ZXJmbG93IGluIGFkZGl0aW9uIChiYXNlICogcmVzKSArIGQgKi9cbiAgICBpZiAoY2FtbF9pbnQ2NF91bHQocmVzLCBkKSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIH1cbiAgaWYgKGkgIT0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgaWYgKGJhc2UgPT0gMTAgJiYgY2FtbF9pbnQ2NF91bHQobmV3IE1sSW50NjQoMCwgMCwgMHg4MDAwKSwgcmVzKSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgaWYgKHNpZ24gPCAwKSByZXMgPSBjYW1sX2ludDY0X25lZyhyZXMpO1xuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkobG8sIG1pLCBoaSl7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChsbywgbWksIGhpKVxufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkgY29uc3Rcbi8vUmVxdWlyZXM6IE1sSW50NjRcbmZ1bmN0aW9uIGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpKGxvLCBoaSl7XG4gIHJldHVybiBuZXcgTWxJbnQ2NCAoXG4gICAgbG8gJiAweGZmZmZmZixcbiAgICAoKGxvID4+PiAyNCkgJiAweGZmKSB8ICgoaGkgJiAweGZmZmYpIDw8IDgpLFxuICAgIChoaSA+Pj4gMTYpICYgMHhmZmZmKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfbG8zMiBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9sbzMyKHYpeyByZXR1cm4gdi5sbzMyKCkgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ludDY0X2hpMzIgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaW50NjRfaGkzMih2KXsgcmV0dXJuIHYuaGkzMigpIH1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9vZl9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxJbnQ2NFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKSB7XG4gIHJldHVybiBuZXcgTWxJbnQ2NChhWzddIDw8IDAgfCAoYVs2XSA8PCA4KSB8IChhWzVdIDw8IDE2KSxcbiAgICAgICAgICAgICAgICAgICAgIGFbNF0gPDwgMCB8IChhWzNdIDw8IDgpIHwgKGFbMl0gPDwgMTYpLFxuICAgICAgICAgICAgICAgICAgICAgYVsxXSA8PCAwIHwgKGFbMF0gPDwgOCkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF90b19ieXRlcyBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF90b19ieXRlcyh4KSB7IHJldHVybiB4LnRvQXJyYXkoKSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfaGFzaCBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9oYXNoKHYpe1xuICByZXR1cm4gKHYubG8zMigpKSBeICh2LmhpMzIoKSlcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMC0yMDE0IErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vIEFuIE9DYW1sIHN0cmluZyBpcyBhbiBvYmplY3Qgd2l0aCB0aHJlZSBmaWVsZHM6XG4vLyAtIHRhZyAndCdcbi8vIC0gbGVuZ3RoICdsJ1xuLy8gLSBjb250ZW50cyAnYydcbi8vXG4vLyBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyIGEgSmF2YVNjcmlwdCBhcnJheSBvclxuLy8gYSBKYXZhU2NyaXB0IHN0cmluZy4gVGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZyBjYW4gYmUgbGVzcyB0aGFuIHRoZVxuLy8gbGVuZ3RoIG9mIHRoZSBPQ2FtbCBzdHJpbmcuIEluIHRoaXMgY2FzZSwgcmVtYWluaW5nIGJ5dGVzIGFyZVxuLy8gYXNzdW1lZCB0byBiZSB6ZXJvZXMuIEFycmF5cyBhcmUgbXV0YWJsZSBidXQgY29uc3VtZXMgbW9yZSBtZW1vcnlcbi8vIHRoYW4gc3RyaW5ncy4gQSBjb21tb24gcGF0dGVybiBpcyB0byBzdGFydCBmcm9tIGFuIGVtcHR5IHN0cmluZyBhbmRcbi8vIHByb2dyZXNzaXZlbHkgZmlsbCBpdCBmcm9tIHRoZSBzdGFydC4gUGFydGlhbCBzdHJpbmdzIG1ha2VzIGl0XG4vLyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcyBlZmZpY2llbnRseS5cbi8vXG4vLyBXaGVuIGNvbnZlcnRpbmcgdG8gYW5kIGZyb20gVVRGLTE2LCB3ZSBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlXG4vLyBzdHJpbmcgaXMgY29tcG9zZWQgb25seSBvZiBBU0NJSSBjaGFyYWN0ZXJzIChpbiB3aGljaCBjYXNlLCBub1xuLy8gY29udmVyc2lvbiBuZWVkcyB0byBiZSBwZXJmb3JtZWQpIG9yIG5vdC5cbi8vXG4vLyBUaGUgc3RyaW5nIHRhZyBjYW4gdGh1cyB0YWtlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOlxuLy8gICBmdWxsIHN0cmluZyAgICAgQllURSB8IFVOS05PV046ICAgICAgMFxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IEFTQ0lJOiAgICAgICAgOVxuLy8gICAgICAgICAgICAgICAgICAgQllURSB8IE5PVF9BU0NJSTogICAgOFxuLy8gICBzdHJpbmcgcHJlZml4ICAgUEFSVElBTDogICAgICAgICAgICAgMlxuLy8gICBhcnJheSAgICAgICAgICAgQVJSQVk6ICAgICAgICAgICAgICAgNFxuLy9cbi8vIE9uZSBjYW4gdXNlIGJpdCBtYXNraW5nIHRvIGRpc2NyaW1pbmF0ZSB0aGVzZSBkaWZmZXJlbnQgY2FzZXM6XG4vLyAgIGtub3duX2VuY29kaW5nKHgpID0geCY4XG4vLyAgIGlzX2FzY2lpKHgpID0gICAgICAgeCYxXG4vLyAgIGtpbmQoeCkgPSAgICAgICAgICAgeCY2XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9zdHJfcmVwZWF0KG4sIHMpIHtcbiAgaWYobiA9PSAwKSByZXR1cm4gXCJcIjtcbiAgaWYgKHMucmVwZWF0KSB7cmV0dXJuIHMucmVwZWF0KG4pO30gLy8gRUNNQXNjcmlwdCA2IGFuZCBGaXJlZm94IDI0K1xuICB2YXIgciA9IFwiXCIsIGwgPSAwO1xuICBmb3IoOzspIHtcbiAgICBpZiAobiAmIDEpIHIgKz0gcztcbiAgICBuID4+PSAxO1xuICAgIGlmIChuID09IDApIHJldHVybiByO1xuICAgIHMgKz0gcztcbiAgICBsKys7XG4gICAgaWYgKGwgPT0gOSkge1xuICAgICAgcy5zbGljZSgwLDEpOyAvLyBmbGF0dGVuIHRoZSBzdHJpbmdcbiAgICAgIC8vIHRoZW4sIHRoZSBmbGF0dGVuaW5nIG9mIHRoZSB3aG9sZSBzdHJpbmcgd2lsbCBiZSBmYXN0ZXIsXG4gICAgICAvLyBhcyBpdCB3aWxsIGJlIGNvbXBvc2VkIG9mIGxhcmdlciBwaWVjZXNcbiAgICB9XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdWJhcnJheV90b19qc2J5dGVzXG4vL1dlYWtkZWZcbi8vIFByZSBFQ01BU2NyaXB0IDUsIFthcHBseV0gd291bGQgbm90IHN1cHBvcnQgYXJyYXktbGlrZSBvYmplY3QuXG4vLyBJbiBzdWNoIHNldHVwLCBUeXBlZF9hcnJheSB3b3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBwb2x5ZmlsbCwgYW5kIFtmLmFwcGx5XSB3b3VsZFxuLy8gZmFpbCBoZXJlLiBNYXJrIHRoZSBwcmltaXRpdmUgYXMgV2Vha2RlZiwgc28gdGhhdCBwZW9wbGUgY2FuIG92ZXJyaWRlIGl0IGVhc2lseS5cbmZ1bmN0aW9uIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyAoYSwgaSwgbGVuKSB7XG4gIHZhciBmID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcbiAgaWYgKGkgPT0gMCAmJiBsZW4gPD0gNDA5NiAmJiBsZW4gPT0gYS5sZW5ndGgpIHJldHVybiBmLmFwcGx5IChudWxsLCBhKTtcbiAgdmFyIHMgPSBcIlwiO1xuICBmb3IgKDsgMCA8IGxlbjsgaSArPSAxMDI0LGxlbi09MTAyNClcbiAgICBzICs9IGYuYXBwbHkgKG51bGwsIGEuc2xpY2UoaSxpICsgTWF0aC5taW4obGVuLCAxMDI0KSkpO1xuICByZXR1cm4gcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF91dGY4X29mX3V0ZjE2XG5mdW5jdGlvbiBjYW1sX3V0Zjhfb2ZfdXRmMTYocykge1xuICBmb3IgKHZhciBiID0gXCJcIiwgdCA9IGIsIGMsIGQsIGkgPSAwLCBsID0gcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMHg4MCkge1xuICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyAoaiA8IGwpICYmIChjID0gcy5jaGFyQ29kZUF0KGopKSA8IDB4ODA7IGorKyk7XG4gICAgICBpZiAoaiAtIGkgPiA1MTIpIHsgdC5zdWJzdHIoMCwgMSk7IGIgKz0gdDsgdCA9IFwiXCI7IGIgKz0gcy5zbGljZShpLCBqKSB9XG4gICAgICBlbHNlIHQgKz0gcy5zbGljZShpLCBqKTtcbiAgICAgIGlmIChqID09IGwpIGJyZWFrO1xuICAgICAgaSA9IGo7XG4gICAgfVxuICAgIGlmIChjIDwgMHg4MDApIHtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGMwIHwgKGMgPj4gNikpO1xuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9IGVsc2UgaWYgKGMgPCAweGQ4MDAgfHwgYyA+PSAweGRmZmYpIHtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGUwIHwgKGMgPj4gMTIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoKGMgPj4gNikgJiAweDNmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwIHwgKGMgJiAweDNmKSk7XG4gICAgfSBlbHNlIGlmIChjID49IDB4ZGJmZiB8fCBpICsgMSA9PSBsIHx8XG4gICAgICAgICAgICAgICAoZCA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGQgPiAweGRmZmYpIHtcbiAgICAgIC8vIFVubWF0Y2hlZCBzdXJyb2dhdGUgcGFpciwgcmVwbGFjZWQgYnkgXFx1ZmZmZCAocmVwbGFjZW1lbnQgY2hhcmFjdGVyKVxuICAgICAgdCArPSBcIlxceGVmXFx4YmZcXHhiZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBpKys7XG4gICAgICBjID0gKGMgPDwgMTApICsgZCAtIDB4MzVmZGMwMDtcbiAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGYwIHwgKGMgPj4gMTgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoKGMgPj4gMTIpICYgMHgzZiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAgfCAoYyAmIDB4M2YpKTtcbiAgICB9XG4gICAgaWYgKHQubGVuZ3RoID4gMTAyNCkge3Quc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiO31cbiAgfVxuICByZXR1cm4gYit0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3V0ZjE2X29mX3V0ZjhcbmZ1bmN0aW9uIGNhbWxfdXRmMTZfb2ZfdXRmOChzKSB7XG4gIGZvciAodmFyIGIgPSBcIlwiLCB0ID0gXCJcIiwgYywgYzEsIGMyLCB2LCBpID0gMCwgbCA9IHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYzEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYgKGMxIDwgMHg4MCkge1xuICAgICAgZm9yICh2YXIgaiA9IGkgKyAxOyAoaiA8IGwpICYmIChjMSA9IHMuY2hhckNvZGVBdChqKSkgPCAweDgwOyBqKyspO1xuICAgICAgaWYgKGogLSBpID4gNTEyKSB7IHQuc3Vic3RyKDAsIDEpOyBiICs9IHQ7IHQgPSBcIlwiOyBiICs9IHMuc2xpY2UoaSwgaikgfVxuICAgICAgZWxzZSB0ICs9IHMuc2xpY2UoaSwgaik7XG4gICAgICBpZiAoaiA9PSBsKSBicmVhaztcbiAgICAgIGkgPSBqO1xuICAgIH1cbiAgICB2ID0gMTtcbiAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSkge1xuICAgICAgYyA9IGMyICsgKGMxIDw8IDYpO1xuICAgICAgaWYgKGMxIDwgMHhlMCkge1xuICAgICAgICB2ID0gYyAtIDB4MzA4MDtcbiAgICAgICAgaWYgKHYgPCAweDgwKSB2ID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHYgPSAyO1xuICAgICAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSkge1xuICAgICAgICAgIGMgPSBjMiArIChjIDw8IDYpO1xuICAgICAgICAgIGlmIChjMSA8IDB4ZjApIHtcbiAgICAgICAgICAgIHYgPSBjIC0gMHhlMjA4MDtcbiAgICAgICAgICAgIGlmICgodiA8IDB4ODAwKSB8fCAoKHYgPj0gMHhkN2ZmKSAmJiAodiA8IDB4ZTAwMCkpKSB2ID0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdiA9IDM7XG4gICAgICAgICAgICBpZiAoKCsraSA8IGwpICYmICgoKGMyID0gcy5jaGFyQ29kZUF0KGkpKSAmIC02NCkgPT0gMTI4KSAmJlxuICAgICAgICAgICAgICAgIChjMSA8IDB4ZjUpKSB7XG4gICAgICAgICAgICAgIHYgPSBjMiAtIDB4M2M4MjA4MCArIChjIDw8IDYpO1xuICAgICAgICAgICAgICBpZiAodiA8IDB4MTAwMDAgfHwgdiA+IDB4MTBmZmZmKSB2ID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHYgPCA0KSB7IC8vIEludmFsaWQgc2VxdWVuY2VcbiAgICAgIGkgLT0gdjtcbiAgICAgIHQgKz0gXCJcXHVmZmZkXCI7XG4gICAgfSBlbHNlIGlmICh2ID4gMHhmZmZmKVxuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZDdjMCArICh2ID4+IDEwKSwgMHhkYzAwICsgKHYgJiAweDNGRikpXG4gICAgZWxzZVxuICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEwMjQpIHt0LnN1YnN0cigwLCAxKTsgYiArPSB0OyB0ID0gXCJcIjt9XG4gIH1cbiAgcmV0dXJuIGIrdDtcbn1cblxuLy9Qcm92aWRlczoganNvb19pc19hc2NpaVxuZnVuY3Rpb24ganNvb19pc19hc2NpaSAocykge1xuICAvLyBUaGUgcmVndWxhciBleHByZXNzaW9uIGdldHMgYmV0dGVyIGF0IGFyb3VuZCB0aGlzIHBvaW50IGZvciBhbGwgYnJvd3NlcnNcbiAgaWYgKHMubGVuZ3RoIDwgMjQpIHtcbiAgICAvLyBTcGlkZXJtb25rZXkgZ2V0cyBtdWNoIHNsb3dlciB3aGVuIHMubGVuZ3RoID49IDI0IChvbiA2NCBiaXQgYXJjaHMpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBpZiAocy5jaGFyQ29kZUF0KGkpID4gMTI3KSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZVxuICAgIHJldHVybiAhL1teXFx4MDAtXFx4N2ZdLy50ZXN0KHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKSB7XG4gIHN3aXRjaCAocy50ICYgNikge1xuICBkZWZhdWx0OiAvKiBQQVJUSUFMICovXG4gICAgaWYgKGkgPj0gcy5jLmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNhc2UgMDogLyogQllURVMgKi9cbiAgICByZXR1cm4gcy5jLmNoYXJDb2RlQXQoaSk7XG4gIGNhc2UgNDogLyogQVJSQVkgKi9cbiAgICByZXR1cm4gcy5jW2ldXG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXlcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSwgYykge1xuICAvLyBUaGUgT0NhbWwgY29tcGlsZXIgdXNlcyBDaGFyLnVuc2FmZV9jaHIgb24gaW50ZWdlcnMgbGFyZ2VyIHRoYW4gMjU1IVxuICBjICY9IDB4ZmY7XG4gIGlmIChzLnQgIT0gNCAvKiBBUlJBWSAqLykge1xuICAgIGlmIChpID09IHMuYy5sZW5ndGgpIHtcbiAgICAgIHMuYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlIChjKTtcbiAgICAgIGlmIChpICsgMSA9PSBzLmwpIHMudCA9IDA7IC8qQllURVMgfCBVTktPV04qL1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheSAocyk7XG4gIH1cbiAgcy5jW2ldID0gYztcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcImluZGV4IG91dCBvZiBib3VuZHNcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ib3VuZF9lcnJvciAoKSB7XG4gIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldCAocywgaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDE2KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykgLSAxKSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDEpO1xuICByZXR1cm4gKGIyIDw8IDggfCBiMSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0MTZcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQxNihzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMSkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAxKTtcbiAgcmV0dXJuIChiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX2dldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9zdHJpbmdfZ2V0MzIocyxpKSB7XG4gIGlmIChpID4+PiAwID49IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSAtIDMpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpLFxuICAgICAgYjIgPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgMSksXG4gICAgICBiMyA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkgKyAyKSxcbiAgICAgIGI0ID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSArIDMpO1xuICByZXR1cm4gKGI0IDw8IDI0IHwgYjMgPDwgMTYgfCBiMiA8PCA4IHwgYjEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dldDMyXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQsIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ2V0MzIocyxpKSB7XG4gIGlmIChpID4+PiAwID49IHMubCAtIDMpIGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpKSxcbiAgICAgIGIyID0gY2FtbF9ieXRlc191bnNhZmVfZ2V0IChzLCBpICsgMSksXG4gICAgICBiMyA9IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCAocywgaSArIDIpLFxuICAgICAgYjQgPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyAzKTtcbiAgcmV0dXJuIChiNCA8PCAyNCB8IGIzIDw8IDE2IHwgYjIgPDwgOCB8IGIxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQsIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dldDY0KHMsaSkge1xuICBpZiAoaSA+Pj4gMCA+PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykgLSA3KSBjYW1sX3N0cmluZ19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yKHZhciBqID0gMDsgaiA8IDg7IGorKyl7XG4gICAgYVs3IC0gal0gPSBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IChzLCBpICsgaik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoYSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZ2V0NjRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldCwgY2FtbF9ieXRlc19ib3VuZF9lcnJvclxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQ2NChzLGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gNykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYSA9IG5ldyBBcnJheSg4KTtcbiAgZm9yKHZhciBqID0gMDsgaiA8IDg7IGorKyl7XG4gICAgYVs3IC0gal0gPSBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkgKyBqKTtcbiAgfVxuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19nZXQgKHMsIGkpIHtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX2J5dGVzX3Vuc2FmZV9nZXQgKHMsIGkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0IChzLCBpLCBjKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfdW5zYWZlX3NldCwgY2FtbF9zdHJpbmdfYm91bmRfZXJyb3Jcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldCAocywgaSwgYykge1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwpIGNhbWxfc3RyaW5nX2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ191bnNhZmVfc2V0IChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXQxNlxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldDE2KHMsaSxpMTYpe1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSAxKSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBiMiA9IDB4RkYgJiBpMTYgPj4gOCxcbiAgICAgIGIxID0gMHhGRiAmIGkxNjtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMCwgYjEpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAxLCBiMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDE2KHMsaSxpMTYpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0MTZcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3NldDE2XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQxNihzLGksaTE2KXtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfc2V0MTYocyxpLGkxNik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfYm91bmRfZXJyb3IsIGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuZnVuY3Rpb24gY2FtbF9ieXRlc19zZXQzMihzLGksaTMyKXtcbiAgaWYgKGkgPj4+IDAgPj0gcy5sIC0gMykgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICB2YXIgYjQgPSAweEZGICYgaTMyID4+IDI0LFxuICAgICAgYjMgPSAweEZGICYgaTMyID4+IDE2LFxuICAgICAgYjIgPSAweEZGICYgaTMyID4+IDgsXG4gICAgICBiMSA9IDB4RkYgJiBpMzI7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDAsIGIxKTtcbiAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgMSwgYjIpO1xuICBjYW1sX2J5dGVzX3Vuc2FmZV9zZXQgKHMsIGkgKyAyLCBiMyk7XG4gIGNhbWxfYnl0ZXNfdW5zYWZlX3NldCAocywgaSArIDMsIGI0KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfc2V0MzIocyxpLGkzMil7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ19zZXQzMlwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfc2V0MzJcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfc2V0MzJcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDMyKHMsaSxpMzIpe1xuICByZXR1cm4gY2FtbF9ieXRlc19zZXQzMihzLGksaTMyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19zZXQ2NFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19ib3VuZF9lcnJvciwgY2FtbF9ieXRlc191bnNhZmVfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX3NldDY0KHMsaSxpNjQpe1xuICBpZiAoaSA+Pj4gMCA+PSBzLmwgLSA3KSBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yKCk7XG4gIHZhciBhID0gY2FtbF9pbnQ2NF90b19ieXRlcyhpNjQpO1xuICBmb3IodmFyIGogPSAwOyBqIDwgODsgaisrKSB7XG4gICAgY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpICsgNyAtIGosIGFbal0pO1xuICB9XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3NldDY0KHMsaSxpNjQpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9zdHJpbmdfc2V0NjRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX3NldDY0XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19zZXQ2NChzLGksaTY0KXtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfc2V0NjQocyxpLGk2NCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2JvdW5kX2Vycm9yLCBjYW1sX2J5dGVzX3Vuc2FmZV9zZXRcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfc2V0IChzLCBpLCBjKSB7XG4gIGlmIChpID4+PiAwID49IHMubCkgY2FtbF9ieXRlc19ib3VuZF9lcnJvcigpO1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0IChzLCBpLCBjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19pc19hc2NpaSwgY2FtbF91dGY4X29mX3V0ZjE2LCBNbEJ5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX29mX3V0ZjE2X2pzc3RyaW5nIChzKSB7XG4gIHZhciB0YWcgPSA5IC8qIEJZVEVTIHwgQVNDSUkgKi87XG4gIGlmICghanNvb19pc19hc2NpaShzKSlcbiAgICB0YWcgPSA4IC8qIEJZVEVTIHwgTk9UX0FTQ0lJICovLCBzID0gY2FtbF91dGY4X29mX3V0ZjE2KHMpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXModGFnLCBzLCBzLmxlbmd0aCk7XG59XG5cblxuLy9Qcm92aWRlczogTWxCeXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywganNvb19pc19hc2NpaSwgY2FtbF91dGYxNl9vZl91dGY4XG5mdW5jdGlvbiBNbEJ5dGVzICh0YWcsIGNvbnRlbnRzLCBsZW5ndGgpIHtcbiAgdGhpcy50PXRhZzsgdGhpcy5jPWNvbnRlbnRzOyB0aGlzLmw9bGVuZ3RoO1xufVxuTWxCeXRlcy5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpe1xuICBzd2l0Y2ggKHRoaXMudCkge1xuICBjYXNlIDk6IC8qQllURVMgfCBBU0NJSSovXG4gICAgcmV0dXJuIHRoaXMuYztcbiAgZGVmYXVsdDpcbiAgICBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHRoaXMpO1xuICBjYXNlIDA6IC8qQllURVMgfCBVTktPV04qL1xuICAgIGlmIChqc29vX2lzX2FzY2lpKHRoaXMuYykpIHtcbiAgICAgIHRoaXMudCA9IDk7IC8qQllURVMgfCBBU0NJSSovXG4gICAgICByZXR1cm4gdGhpcy5jO1xuICAgIH1cbiAgICB0aGlzLnQgPSA4OyAvKkJZVEVTIHwgTk9UX0FTQ0lJKi9cbiAgY2FzZSA4OiAvKkJZVEVTIHwgTk9UX0FTQ0lJKi9cbiAgICByZXR1cm4gdGhpcy5jO1xuICB9XG59O1xuTWxCeXRlcy5wcm90b3R5cGUudG9VdGYxNiA9IGZ1bmN0aW9uICgpe1xuICB2YXIgciA9IHRoaXMudG9TdHJpbmcoKTtcbiAgaWYodGhpcy50ID09IDkpIHJldHVybiByXG4gIHJldHVybiBjYW1sX3V0ZjE2X29mX3V0Zjgocik7XG59XG5NbEJ5dGVzLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uICgpe1xuICB2YXIgY29udGVudCA9IHRoaXMudCA9PSA0ID8gdGhpcy5jLnNsaWNlKCkgOiB0aGlzLmM7XG4gIHJldHVybiBuZXcgTWxCeXRlcyh0aGlzLnQsY29udGVudCx0aGlzLmwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlc1xuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyAocykge1xuICAvKiBBc3N1bWVzIG5vdCBCWVRFUyAqL1xuICBpZiAocy50ID09IDIgLyogUEFSVElBTCAqLylcbiAgICBzLmMgKz0gY2FtbF9zdHJfcmVwZWF0KHMubCAtIHMuYy5sZW5ndGgsICdcXDAnKVxuICBlbHNlXG4gICAgcy5jID0gY2FtbF9zdWJhcnJheV90b19qc2J5dGVzIChzLmMsIDAsIHMuYy5sZW5ndGgpO1xuICBzLnQgPSAwOyAvKkJZVEVTIHwgVU5LT1dOKi9cbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkgKHMpIHtcbiAgLyogQXNzdW1lcyBub3QgQVJSQVkgKi9cbiAgdmFyIGEgPSBuZXcgVWludDhBcnJheShzLmwpO1xuICB2YXIgYiA9IHMuYywgbCA9IGIubGVuZ3RoLCBpID0gMDtcbiAgZm9yICg7IGkgPCBsOyBpKyspIGFbaV0gPSBiLmNoYXJDb2RlQXQoaSk7XG4gIGZvciAobCA9IHMubDsgaSA8IGw7IGkrKykgYVtpXSA9IDA7XG4gIHMuYyA9IGE7XG4gIHMudCA9IDQ7IC8qIEFSUkFZICovXG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuZnVuY3Rpb24gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyAocykge1xuICBpZiAocy50ICE9IDQgLyogQVJSQVkgKi8pIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheShzKTtcbiAgcmV0dXJuIHMuYztcbn1cblxuLy9Qcm92aWRlczogY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXRcbmZ1bmN0aW9uIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nIChzKSB7XG4gIHZhciBsID0gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpO1xuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgdmFyIGkgPSAwO1xuICBmb3IgKDsgaSA8IGw7IGkrKykgYVtpXSA9IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocyxpKTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3JlYXRlX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9zdHJpbmcobGVuKSB7XG4gIGlmKGxlbiA8IDApIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIlN0cmluZy5jcmVhdGVcIik7XG4gIHJldHVybiBuZXcgTWxCeXRlcyhsZW4/Mjo5LFwiXCIsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jcmVhdGVfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9jcmVhdGVfc3RyaW5nKGxlbikge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHJpbmcuY3JlYXRlXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NyZWF0ZV9ieXRlcyBjb25zdFxuLy9SZXF1aXJlczogTWxCeXRlcyxjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfY3JlYXRlX2J5dGVzKGxlbikge1xuICBpZiAobGVuIDwgMCkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQnl0ZXMuY3JlYXRlXCIpO1xuICByZXR1cm4gbmV3IE1sQnl0ZXMobGVuPzI6OSxcIlwiLGxlbik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2FycmF5IChhKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhhLDAsYS5sZW5ndGgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19vZl9hcnJheSAoYSkge1xuICBpZighIChhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICBhID0gbmV3IFVpbnQ4QXJyYXkoYSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBNbEJ5dGVzKDQsYSxhLmxlbmd0aCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfY29tcGFyZSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2J5dGVzX2NvbXBhcmUoczEsIHMyKSB7XG4gIChzMS50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIChzMi50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiAoczEuYyA8IHMyLmMpPy0xOihzMS5jID4gczIuYyk/MTowO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlc1xuZnVuY3Rpb24gY2FtbF9ieXRlc19lcXVhbChzMSwgczIpIHtcbiAgaWYoczEgPT09IHMyKSByZXR1cm4gMTtcbiAgKHMxLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMxKTtcbiAgKHMyLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMyKTtcbiAgcmV0dXJuIChzMS5jID09IHMyLmMpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbm90ZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfZXF1YWxcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX25vdGVxdWFsKHMxLCBzMikgeyByZXR1cm4gMS1jYW1sX3N0cmluZ19lcXVhbChzMSwgczIpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfbm90ZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19lcXVhbFxuZnVuY3Rpb24gY2FtbF9ieXRlc19ub3RlcXVhbChzMSwgczIpIHsgcmV0dXJuIDEtY2FtbF9ieXRlc19lcXVhbChzMSwgczIpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfYnl0ZXNfbGVzc2VxdWFsIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbGVzc2VxdWFsKHMxLCBzMikge1xuICAoczEudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczEpO1xuICAoczIudCAmIDYpICYmIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMoczIpO1xuICByZXR1cm4gKHMxLmMgPD0gczIuYyk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsIHMyKSB7XG4gIChzMS50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMSk7XG4gIChzMi50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzMik7XG4gIHJldHVybiAoczEuYyA8IHMyLmMpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZ3JlYXRlcmVxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19sZXNzZXF1YWxcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dyZWF0ZXJlcXVhbChzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX2xlc3NlcXVhbChzMixzMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX2dyZWF0ZXJlcXVhbFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzZXF1YWxcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfZ3JlYXRlcmVxdWFsKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19sZXNzZXF1YWwoczIsczEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfbGVzc3RoYW5cbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2dyZWF0ZXJ0aGFuKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19ncmVhdGVydGhhblxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19sZXNzdGhhblxuZnVuY3Rpb24gY2FtbF9ieXRlc19ncmVhdGVydGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczIsIHMxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maWxsX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cl9yZXBlYXQsIGNhbWxfY29udmVydF9ieXRlc190b19hcnJheVxuLy9BbGlhczogY2FtbF9maWxsX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9maWxsX2J5dGVzKHMsIGksIGwsIGMpIHtcbiAgaWYgKGwgPiAwKSB7XG4gICAgaWYgKGkgPT0gMCAmJiAobCA+PSBzLmwgfHwgKHMudCA9PSAyIC8qIFBBUlRJQUwgKi8gJiYgbCA+PSBzLmMubGVuZ3RoKSkpIHtcbiAgICAgIGlmIChjID09IDApIHtcbiAgICAgICAgcy5jID0gXCJcIjtcbiAgICAgICAgcy50ID0gMjsgLyogUEFSVElBTCAqL1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcy5jID0gY2FtbF9zdHJfcmVwZWF0IChsLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgICAgICAgcy50ID0gKGwgPT0gcy5sKT8wIC8qIEJZVEVTIHwgVU5LT1dOICovIDoyOyAvKiBQQVJUSUFMICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzLnQgIT0gNCAvKiBBUlJBWSAqLykgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5KHMpO1xuICAgICAgZm9yIChsICs9IGk7IGkgPCBsOyBpKyspIHMuY1tpXSA9IGM7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsaXRfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcywgY2FtbF9jb252ZXJ0X2J5dGVzX3RvX2FycmF5XG5mdW5jdGlvbiBjYW1sX2JsaXRfYnl0ZXMoczEsIGkxLCBzMiwgaTIsIGxlbikge1xuICBpZiAobGVuID09IDApIHJldHVybiAwO1xuICBpZiAoKGkyID09IDApICYmXG4gICAgICAobGVuID49IHMyLmwgfHwgKHMyLnQgPT0gMiAvKiBQQVJUSUFMICovICYmIGxlbiA+PSBzMi5jLmxlbmd0aCkpKSB7XG4gICAgczIuYyA9IChzMS50ID09IDQgLyogQVJSQVkgKi8pP1xuICAgICAgY2FtbF9zdWJhcnJheV90b19qc2J5dGVzKHMxLmMsIGkxLCBsZW4pOlxuICAgICAgKGkxID09IDAgJiYgczEuYy5sZW5ndGggPT0gbGVuKT9zMS5jOnMxLmMuc3Vic3RyKGkxLCBsZW4pO1xuICAgIHMyLnQgPSAoczIuYy5sZW5ndGggPT0gczIubCk/MCAvKiBCWVRFUyB8IFVOS09XTiAqLyA6MjsgLyogUEFSVElBTCAqL1xuICB9IGVsc2UgaWYgKHMyLnQgPT0gMiAvKiBQQVJUSUFMICovICYmIGkyID09IHMyLmMubGVuZ3RoKSB7XG4gICAgczIuYyArPSAoczEudCA9PSA0IC8qIEFSUkFZICovKT9cbiAgICAgIGNhbWxfc3ViYXJyYXlfdG9fanNieXRlcyhzMS5jLCBpMSwgbGVuKTpcbiAgICAgIChpMSA9PSAwICYmIHMxLmMubGVuZ3RoID09IGxlbik/czEuYzpzMS5jLnN1YnN0cihpMSwgbGVuKTtcbiAgICBzMi50ID0gKHMyLmMubGVuZ3RoID09IHMyLmwpPzAgLyogQllURVMgfCBVTktPV04gKi8gOjI7IC8qIFBBUlRJQUwgKi9cbiAgfSBlbHNlIHtcbiAgICBpZiAoczIudCAhPSA0IC8qIEFSUkFZICovKSBjYW1sX2NvbnZlcnRfYnl0ZXNfdG9fYXJyYXkoczIpO1xuICAgIHZhciBjMSA9IHMxLmMsIGMyID0gczIuYztcbiAgICBpZiAoczEudCA9PSA0IC8qIEFSUkFZICovKSB7XG4gICAgICBpZiAoaTIgPD0gaTEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYzIgW2kyICsgaV0gPSBjMSBbaTEgKyBpXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgYzIgW2kyICsgaV0gPSBjMSBbaTEgKyBpXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGwgPSBNYXRoLm1pbiAobGVuLCBjMS5sZW5ndGggLSBpMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgYzIgW2kyICsgaV0gPSBjMS5jaGFyQ29kZUF0KGkxICsgaSk7XG4gICAgICBmb3IgKDsgaSA8IGxlbjsgaSsrKSBjMiBbaTIgKyBpXSA9IDA7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JsaXRfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2JsaXRfc3RyaW5nKGEsYixjLGQsZSkge1xuICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl9zdHJpbmcoYSksYixjLGQsZSk7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoIGNvbnN0XG5mdW5jdGlvbiBjYW1sX21sX2J5dGVzX2xlbmd0aChzKSB7IHJldHVybiBzLmwgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0IGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgKHMsIGkpIHtcbiAgcmV0dXJuIHMuY2hhckNvZGVBdChpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfdW5zYWZlX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ191bnNhZmVfc2V0IChzLCBpLCBjKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N0cmluZ191bnNhZmVfc2V0XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGggY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIHtcbiAgcmV0dXJuIHMubGVuZ3RoXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2NvbXBhcmUgY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29tcGFyZShzMSwgczIpIHtcbiAgcmV0dXJuIChzMSA8IHMyKT8tMTooczEgPiBzMik/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19lcXVhbCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19lcXVhbChzMSwgczIpIHtcbiAgaWYoczEgPT09IHMyKSByZXR1cm4gMTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3NlcXVhbCBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzZXF1YWwoczEsIHMyKSB7XG4gIHJldHVybiAoczEgPD0gczIpPzE6MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc3RoYW4gY29uc3Rcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc3RoYW4oczEsIHMyKSB7XG4gIHJldHVybiAoczEgPCBzMik/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcywgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9ieXRlcyhzKSB7XG4gIChzLnQgJiA2KSAmJiBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzKHMpO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhzLmMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyBjb25zdFxuLy9JZjoganMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHgpIHsgcmV0dXJuIHggfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nIGNvbnN0XG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNieXRlc19vZl9zdHJpbmcoeCkgeyByZXR1cm4geCB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3V0ZjE2X29mX3V0Zjhcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykge1xuICBpZihqc29vX2lzX2FzY2lpKHMpKVxuICAgIHJldHVybiBzO1xuICByZXR1cm4gY2FtbF91dGYxNl9vZl91dGY4KHMpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nIGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpLCBjYW1sX3V0Zjhfb2ZfdXRmMTYsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vSWY6IGpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKHMpIHtcbiAgaWYgKGpzb29faXNfYXNjaWkocykpXG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocylcbiAgZWxzZSByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhjYW1sX3V0Zjhfb2ZfdXRmMTYocykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXMgY29uc3Rcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2ZfanNieXRlcyhzKSB7IHJldHVybiBuZXcgTWxCeXRlcygwLHMscy5sZW5ndGgpOyB9XG5cblxuLy8gVGhlIHNlY3Rpb24gYmVsb3cgc2hvdWxkIGJlIHVzZWQgd2hlbiB1c2UtanMtc3RyaW5nPWZhbHNlXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX2dldFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfdW5zYWZlX2dldCAocywgaSkge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfZ2V0KHMsaSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX3Vuc2FmZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfdW5zYWZlX3NldFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfdW5zYWZlX3NldCAocywgaSwgYykge1xuICByZXR1cm4gY2FtbF9ieXRlc191bnNhZmVfc2V0KHMsaSxjKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHMpIHtcbiAgcmV0dXJuIGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2NvbXBhcmVcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfY29tcGFyZVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfY29tcGFyZShzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfY29tcGFyZShzMSxzMilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfZXF1YWxcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfZXF1YWxcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19lcXVhbChzMSxzMilcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zdHJpbmdfbGVzc2VxdWFsXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3NlcXVhbFxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfbGVzc2VxdWFsKHMxLCBzMikge1xuICByZXR1cm4gY2FtbF9ieXRlc19sZXNzZXF1YWwoczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX2xlc3N0aGFuXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX2xlc3N0aGFuXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19sZXNzdGhhbihzMSwgczIpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfbGVzc3RoYW4oczEsczIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyaW5nX29mX2J5dGVzXG4vL0lmOiAhanMtc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N0cmluZ19vZl9ieXRlcyhzKSB7IHJldHVybiBzIH1cblxuLy9Qcm92aWRlczogY2FtbF9ieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHMpIHsgcmV0dXJuIHMgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2pzYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykgeyByZXR1cm4gY2FtbF9ieXRlc19vZl9qc2J5dGVzKHMpOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNieXRlc19vZl9zdHJpbmcocykge1xuICAocy50ICYgNikgJiYgY2FtbF9jb252ZXJ0X3N0cmluZ190b19ieXRlcyhzKTtcbiAgcmV0dXJuIHMuYyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nIG11dGFibGUgKGNvbnN0KVxuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocyl7XG4gIHJldHVybiBzLnRvVXRmMTYoKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ieXRlc19vZl91dGYxNl9qc3N0cmluZ1xuLy9JZjogIWpzLXN0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKHMpIHtcbiAgcmV0dXJuIGNhbWxfYnl0ZXNfb2ZfdXRmMTZfanNzdHJpbmcocyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfYnl0ZXNcbi8vUmVxdWlyZXM6IE1sQnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfYnl0ZXMocykge1xuICByZXR1cm4gKHMgaW5zdGFuY2VvZiBNbEJ5dGVzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ieXRlc19jb250ZW50XG4vL1JlcXVpcmVzOiBNbEJ5dGVzLCBjYW1sX2NvbnZlcnRfc3RyaW5nX3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2J5dGVzX2NvbnRlbnQocykge1xuICBzd2l0Y2ggKHMudCAmIDYpIHtcbiAgZGVmYXVsdDogLyogUEFSVElBTCAqL1xuICAgIGNhbWxfY29udmVydF9zdHJpbmdfdG9fYnl0ZXMocyk7XG4gIGNhc2UgMDogLyogQllURVMgKi9cbiAgICByZXR1cm4gcy5jO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHMuY1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaXNfbWxfc3RyaW5nXG4vL1JlcXVpcmVzOiBqc29vX2lzX2FzY2lpXG4vL0lmOiBqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfc3RyaW5nKHMpIHtcbiAgcmV0dXJuICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiAmJiAhL1teXFx4MDAtXFx4ZmZdLy50ZXN0KHMpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19tbF9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXNcbi8vSWY6ICFqcy1zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfaXNfbWxfc3RyaW5nKHMpIHtcbiAgcmV0dXJuIGNhbWxfaXNfbWxfYnl0ZXMocyk7XG59XG5cbi8vIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGRlcHJlY2F0ZWRcblxuLy9Qcm92aWRlczogY2FtbF9qc190b19ieXRlX3N0cmluZyBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9qc190b19ieXRlX3N0cmluZyhzKSB7IHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKHMpIH1cblxuLy9Qcm92aWRlczogY2FtbF9uZXdfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX25ld19zdHJpbmcgKHMpIHsgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocykgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fc3RyaW5nIG11dGFibGUgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfZnJvbV9zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocylcbn1cblxuLy9Qcm92aWRlczogY2FtbF90b19qc19zdHJpbmcgbXV0YWJsZSAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF90b19qc19zdHJpbmcocykge1xuICByZXR1cm4gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocylcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc190b19zdHJpbmcgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzX3RvX3N0cmluZyAocykge1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocyk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2FycmF5X29mX3N0cmluZyh4KSB7IHJldHVybiBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZyh4KSB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfb2ZfYnl0ZXMoeCkgeyByZXR1cm4gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyh4KSB9XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1JhaXNlIGV4Y2VwdGlvblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX2NvbnN0YW50IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfcmFpc2VfY29uc3RhbnQgKHRhZykgeyB0aHJvdyB0YWc7IH1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX2FyZyAoY29uc3QsIG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9hcmcgKHRhZywgYXJnKSB7IHRocm93IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZShbMCwgdGFnLCBhcmddKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX3dpdGhfYXJncyAoY29uc3QsIG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2VcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfd2l0aF9hcmdzICh0YWcsIGFyZ3MpIHsgdGhyb3cgY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKFswLCB0YWddLmNvbmNhdChhcmdzKSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZyAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX2FyZywgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9yYWlzZV93aXRoX3N0cmluZyAodGFnLCBtc2cpIHtcbiAgY2FtbF9yYWlzZV93aXRoX2FyZyAodGFnLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKG1zZykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZhaWx3aXRoIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcsIGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmFpbHdpdGggKG1zZykge1xuICBpZighY2FtbF9nbG9iYWxfZGF0YS5GYWlsdXJlKVxuICAgIGNhbWxfZ2xvYmFsX2RhdGEuRmFpbHVyZT1bMjQ4LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJGYWlsdXJlXCIpLC0zXTtcbiAgY2FtbF9yYWlzZV93aXRoX3N0cmluZyhjYW1sX2dsb2JhbF9kYXRhLkZhaWx1cmUsIG1zZyk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfaW52YWxpZF9hcmd1bWVudCAobXNnKSB7XG4gIGNhbWxfcmFpc2Vfd2l0aF9zdHJpbmcoY2FtbF9nbG9iYWxfZGF0YS5JbnZhbGlkX2FyZ3VtZW50LCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2NvbnN0YW50LCBjYW1sX2dsb2JhbF9kYXRhXG5mdW5jdGlvbiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlICgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLkVuZF9vZl9maWxlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV96ZXJvX2RpdmlkZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9jb25zdGFudCwgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV96ZXJvX2RpdmlkZSAoKSB7XG4gIGNhbWxfcmFpc2VfY29uc3RhbnQoY2FtbF9nbG9iYWxfZGF0YS5EaXZpc2lvbl9ieV96ZXJvKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfY29uc3RhbnQsIGNhbWxfZ2xvYmFsX2RhdGFcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfbm90X2ZvdW5kICgpIHtcbiAgY2FtbF9yYWlzZV9jb25zdGFudChjYW1sX2dsb2JhbF9kYXRhLk5vdF9mb3VuZCk7IH1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IgKCkge1xuICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJpbmRleCBvdXQgb2YgYm91bmRzXCIpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbF9nZW4gKGNvbnN0LCBzaGFsbG93KVxuLy9JZjogIWVmZmVjdHNcbi8vV2Vha2RlZlxuZnVuY3Rpb24gY2FtbF9jYWxsX2dlbihmLCBhcmdzKSB7XG4gIHZhciBuID0gKGYubCA+PSAwKT9mLmw6KGYubCA9IGYubGVuZ3RoKTtcbiAgdmFyIGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIGQgPSBuIC0gYXJnc0xlbjtcbiAgaWYgKGQgPT0gMClcbiAgICByZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKTtcbiAgZWxzZSBpZiAoZCA8IDApIHtcbiAgICB2YXIgZyA9IGYuYXBwbHkobnVsbCxhcmdzLnNsaWNlKDAsbikpO1xuICAgIGlmKHR5cGVvZiBnICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBnO1xuICAgIHJldHVybiBjYW1sX2NhbGxfZ2VuKGcsYXJncy5zbGljZShuKSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgc3dpdGNoIChkKSB7XG4gICAgY2FzZSAxOiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4KXtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAxKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICByZXR1cm4gZi5hcHBseShudWxsLCBuYXJncylcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAyOiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICh4LCB5KXtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyAyKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgbmFyZ3NbYXJnc0xlbl0gPSB4O1xuICAgICAgICBuYXJnc1thcmdzTGVuICsgMV0gPSB5O1xuICAgICAgICByZXR1cm4gZi5hcHBseShudWxsLCBuYXJncylcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoKXtcbiAgICAgICAgdmFyIGV4dHJhX2FyZ3MgPSAoYXJndW1lbnRzLmxlbmd0aCA9PSAwKT8xOmFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIHZhciBuYXJncyA9IG5ldyBBcnJheShhcmdzLmxlbmd0aCtleHRyYV9hcmdzKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKysgKSBuYXJnc1tpXSA9IGFyZ3NbaV07XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSBuYXJnc1thcmdzLmxlbmd0aCtpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgcmV0dXJuIGNhbWxfY2FsbF9nZW4oZiwgbmFyZ3MpXG4gICAgICB9O1xuICAgIH19XG4gICAgZy5sID0gZDtcbiAgICByZXR1cm4gZztcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NhbGxfZ2VuIChjb25zdCwgc2hhbGxvdylcbi8vSWY6IGVmZmVjdHNcbi8vV2Vha2RlZlxuZnVuY3Rpb24gY2FtbF9jYWxsX2dlbihmLCBhcmdzKSB7XG4gIHZhciBuID0gKGYubCA+PSAwKT9mLmw6KGYubCA9IGYubGVuZ3RoKTtcbiAgdmFyIGFyZ3NMZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIGQgPSBuIC0gYXJnc0xlbjtcbiAgaWYgKGQgPT0gMCkge1xuICAgIHJldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9IGVsc2UgaWYgKGQgPCAwKSB7XG4gICAgdmFyIHJlc3QgPSBhcmdzLnNsaWNlKG4gLSAxKTtcbiAgICB2YXIgayA9IGFyZ3MgW2FyZ3NMZW4gLSAxXTtcbiAgICBhcmdzID0gYXJncy5zbGljZSgwLCBuKTtcbiAgICBhcmdzW24gLSAxXSA9IGZ1bmN0aW9uIChnKSB7XG4gICAgICBpZiAodHlwZW9mIGcgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGsoZyk7XG4gICAgICB2YXIgYXJncyA9IHJlc3Quc2xpY2UoKTtcbiAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSA9IGs7XG4gICAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihnLCBhcmdzKTsgfTtcbiAgICByZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzTGVuLS07XG4gICAgdmFyIGsgPSBhcmdzIFthcmdzTGVuXTtcbiAgICBzd2l0Y2ggKGQpIHtcbiAgICBjYXNlIDE6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHkpe1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDIpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIG5hcmdzKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIDI6IHtcbiAgICAgIHZhciBnID0gZnVuY3Rpb24gKHgsIHksIHope1xuICAgICAgICB2YXIgbmFyZ3MgPSBuZXcgQXJyYXkoYXJnc0xlbiArIDMpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJnc0xlbjsgaSsrICkgbmFyZ3NbaV0gPSBhcmdzW2ldO1xuICAgICAgICBuYXJnc1thcmdzTGVuXSA9IHg7XG4gICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAxXSA9IHk7XG4gICAgICAgIG5hcmdzW2FyZ3NMZW4gKyAyXSA9IHo7XG4gICAgICAgIHJldHVybiBmLmFwcGx5KG51bGwsIG5hcmdzKVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB2YXIgZyA9IGZ1bmN0aW9uICgpe1xuICAgICAgICB2YXIgZXh0cmFfYXJncyA9IChhcmd1bWVudHMubGVuZ3RoID09IDApPzE6YXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgdmFyIG5hcmdzID0gbmV3IEFycmF5KGFyZ3NMZW4gKyBleHRyYV9hcmdzKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3NMZW47IGkrKyApIG5hcmdzW2ldID0gYXJnc1tpXTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApXG4gICAgICAgICAgbmFyZ3NbYXJnc0xlbiArIGldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICByZXR1cm4gY2FtbF9jYWxsX2dlbihmLCBuYXJncylcbiAgICAgIH07XG4gICAgfX1cbiAgICBnLmwgPSBkICsgMTtcbiAgICByZXR1cm4gayhnKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlc1xudmFyIGNhbWxfbmFtZWRfdmFsdWVzID0ge307XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWUgKGNvbnN0LG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9uYW1lZF92YWx1ZShubSx2KSB7XG4gIGNhbWxfbmFtZWRfdmFsdWVzW2NhbWxfanNieXRlc19vZl9zdHJpbmcobm0pXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hbWVkX3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX25hbWVkX3ZhbHVlc1xuZnVuY3Rpb24gY2FtbF9uYW1lZF92YWx1ZShubSkge1xuICByZXR1cm4gY2FtbF9uYW1lZF92YWx1ZXNbbm1dXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2xvYmFsX2RhdGFcbnZhciBjYW1sX2dsb2JhbF9kYXRhID0gWzBdO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2J1aWxkX3N5bWJvbHNcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2J1aWxkX3N5bWJvbHModG9jKSB7XG4gIHZhciBzeW1iO1xuICB3aGlsZSh0b2MpIHtcbiAgICBpZihjYW1sX2pzc3RyaW5nX29mX3N0cmluZyh0b2NbMV1bMV0pID09IFwiU1lKU1wiKSB7XG4gICAgICBzeW1iID0gdG9jWzFdWzJdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGVsc2UgdG9jID0gdG9jWzJdXG4gIH1cbiAgdmFyIHIgPSB7fTtcbiAgaWYoc3ltYikge1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCBzeW1iLmxlbmd0aDsgaSsrKXtcbiAgICAgIHJbY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoc3ltYltpXVsxXSldID0gc3ltYltpXVsyXVxuICAgIH1cbiAgfVxuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKGNvbnN0LCBzaGFsbG93LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfZ2xvYmFsX2RhdGEsIGNhbWxfY2FsbGJhY2ssIGNhbWxfYnVpbGRfc3ltYm9sc1xuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9yZWdpc3Rlcl9nbG9iYWwgKG4sIHYsIG5hbWVfb3B0KSB7XG4gIGlmIChuYW1lX29wdCkge1xuICAgIHZhciBuYW1lID0gbmFtZV9vcHQ7XG4gICAgaWYoZ2xvYmFsVGhpcy50b3BsZXZlbFJlbG9jKSB7XG4gICAgICBuID0gY2FtbF9jYWxsYmFjayhnbG9iYWxUaGlzLnRvcGxldmVsUmVsb2MsIFtuYW1lXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNhbWxfZ2xvYmFsX2RhdGEudG9jKSB7XG4gICAgICBpZighY2FtbF9nbG9iYWxfZGF0YS5zeW1ib2xzKSB7XG4gICAgICAgIGNhbWxfZ2xvYmFsX2RhdGEuc3ltYm9scyA9IGNhbWxfYnVpbGRfc3ltYm9scyhjYW1sX2dsb2JhbF9kYXRhLnRvYylcbiAgICAgIH1cbiAgICAgIHZhciBuaWQgPSBjYW1sX2dsb2JhbF9kYXRhLnN5bWJvbHNbbmFtZV1cbiAgICAgIGlmKG5pZCA+PSAwKVxuICAgICAgICBuID0gbmlkXG4gICAgICBlbHNlIHtcbiAgICAgICAgY2FtbF9mYWlsd2l0aChcImNhbWxfcmVnaXN0ZXJfZ2xvYmFsOiBjYW5ub3QgbG9jYXRlIFwiICsgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbWxfZ2xvYmFsX2RhdGFbbiArIDFdID0gdjtcbiAgaWYobmFtZV9vcHQpIGNhbWxfZ2xvYmFsX2RhdGFbbmFtZV9vcHRdID0gdjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfZ2xvYmFsX2RhdGEgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9nZXRfZ2xvYmFsX2RhdGEgKCkgeyByZXR1cm4gY2FtbF9nbG9iYWxfZGF0YTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX3ByaW50YWJsZSBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX2lzX3ByaW50YWJsZShjKSB7IHJldHVybiArKGMgPiAzMSAmJiBjIDwgMTI3KTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21heWJlX3ByaW50X3N0YXRzXG5mdW5jdGlvbiBjYW1sX21heWJlX3ByaW50X3N0YXRzKHVuaXQpIHsgcmV0dXJuIDAgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBTeXNcblxuLy9Qcm92aWRlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV93aXRoX3N0cmluZywgY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9yYWlzZV9zeXNfZXJyb3IgKG1zZykge1xuICBjYW1sX3JhaXNlX3dpdGhfc3RyaW5nKGNhbWxfZ2xvYmFsX2RhdGEuU3lzX2Vycm9yLCBtc2cpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19leGl0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfc3lzX2V4aXQgKGNvZGUpIHtcbiAgaWYoZ2xvYmFsVGhpcy5xdWl0KSBnbG9iYWxUaGlzLnF1aXQoY29kZSk7XG4gIC8vbm9kZWpzXG4gIGlmKGdsb2JhbFRoaXMucHJvY2VzcyAmJiBnbG9iYWxUaGlzLnByb2Nlc3MuZXhpdClcbiAgICBnbG9iYWxUaGlzLnByb2Nlc3MuZXhpdChjb2RlKTtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiRnVuY3Rpb24gJ2V4aXQnIG5vdCBpbXBsZW1lbnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvbihleG4pe1xuICBzd2l0Y2goZXhuWzJdKSB7XG4gIGNhc2UgLTg6IC8vIE1hdGNoX2ZhaWx1cmVcbiAgY2FzZSAtMTE6IC8vIEFzc2VydF9mYWlsdXJlXG4gIGNhc2UgLTEyOiAvLyBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZVxuICAgIHJldHVybiAxO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2V4Y2VwdGlvblxuLy9SZXF1aXJlczogTWxCeXRlcywgY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9mb3JtYXRfZXhjZXB0aW9uKGV4bil7XG4gIHZhciByID0gXCJcIjtcbiAgaWYoZXhuWzBdID09IDApIHtcbiAgICByICs9IGV4blsxXVsxXTtcbiAgICBpZihleG4ubGVuZ3RoID09IDMgJiYgZXhuWzJdWzBdID09IDAgJiYgY2FtbF9pc19zcGVjaWFsX2V4Y2VwdGlvbihleG5bMV0pKSB7XG5cbiAgICAgIHZhciBidWNrZXQgPSBleG5bMl07XG4gICAgICB2YXIgc3RhcnQgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc3RhcnQgPSAyXG4gICAgICB2YXIgYnVja2V0ID0gZXhuO1xuICAgIH1cbiAgICByICs9IFwiKFwiO1xuICAgIGZvcih2YXIgaSA9IHN0YXJ0OyBpIDwgYnVja2V0Lmxlbmd0aDsgaSArKyl7XG4gICAgICBpZihpID4gc3RhcnQpIHIrPVwiLCBcIjtcbiAgICAgIHZhciB2ID0gYnVja2V0W2ldXG4gICAgICBpZih0eXBlb2YgdiA9PSBcIm51bWJlclwiKVxuICAgICAgICByKz0gdi50b1N0cmluZygpO1xuICAgICAgZWxzZSBpZih2IGluc3RhbmNlb2YgTWxCeXRlcyl7XG4gICAgICAgIHIrPSAnXCInICsgdi50b1N0cmluZygpICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYodHlwZW9mIHYgPT0gXCJzdHJpbmdcIil7XG4gICAgICAgIHIrPSAnXCInICsgdi50b1N0cmluZygpICsgJ1wiJztcbiAgICAgIH1cbiAgICAgIGVsc2UgciArPSBcIl9cIjtcbiAgICB9XG4gICAgciArPSBcIilcIlxuICB9IGVsc2UgaWYgKGV4blswXSA9PSAyNDgpe1xuICAgIHIgKz0gZXhuWzFdXG4gIH1cbiAgcmV0dXJuIHJcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25cbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfZm9ybWF0X2V4Y2VwdGlvbiwgY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb24oZXJyKXtcbiAgaWYoZXJyIGluc3RhbmNlb2YgQXJyYXkgJiYgKGVyclswXSA9PSAwIHx8IGVyclswXSA9PSAyNDgpKSB7XG4gICAgdmFyIGhhbmRsZXIgPSBjYW1sX25hbWVkX3ZhbHVlKFwiUHJpbnRleGMuaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvblwiKTtcbiAgICBpZihoYW5kbGVyKSBjYW1sX2NhbGxiYWNrKGhhbmRsZXIsIFtlcnIsZmFsc2VdKTtcbiAgICBlbHNlIHtcbiAgICAgIHZhciBtc2cgPSBjYW1sX2Zvcm1hdF9leGNlcHRpb24oZXJyKTtcbiAgICAgIHZhciBhdF9leGl0ID0gY2FtbF9uYW1lZF92YWx1ZShcIlBlcnZhc2l2ZXMuZG9fYXRfZXhpdFwiKTtcbiAgICAgIGlmKGF0X2V4aXQpIGNhbWxfY2FsbGJhY2soYXRfZXhpdCwgWzBdKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uIFwiICsgbXNnICsgXCJcXG5cIik7XG4gICAgICBpZihlcnIuanNfZXJyb3IpIHRocm93IGVyci5qc19lcnJvcjtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9zZXRfc3RhdGljX2VudlxuZnVuY3Rpb24gY2FtbF9zZXRfc3RhdGljX2VudihrLHYpe1xuICBpZighZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnYpXG4gICAgZ2xvYmFsVGhpcy5qc29vX3N0YXRpY19lbnYgPSB7fVxuICBnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudltrXSA9IHY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBqc29vX3N5c19nZXRlbnYgKGNvbnN0KVxuZnVuY3Rpb24ganNvb19zeXNfZ2V0ZW52KG4pIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIC8vbm9kZWpzIGVudlxuICBpZihwcm9jZXNzXG4gICAgICYmIHByb2Nlc3MuZW52XG4gICAgICYmIHByb2Nlc3MuZW52W25dICE9IHVuZGVmaW5lZClcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnZbbl07XG4gIGlmKGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52XG4gICAgICYmIGdsb2JhbFRoaXMuanNvb19zdGF0aWNfZW52W25dKVxuICAgIHJldHVybiBnbG9iYWxUaGlzLmpzb29fc3RhdGljX2VudltuXVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRlbnYgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczoganNvb19zeXNfZ2V0ZW52XG5mdW5jdGlvbiBjYW1sX3N5c19nZXRlbnYgKG5hbWUpIHtcbiAgdmFyIHIgPSBqc29vX3N5c19nZXRlbnYoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZSkpO1xuICBpZihyID09PSB1bmRlZmluZWQpXG4gICAgY2FtbF9yYWlzZV9ub3RfZm91bmQgKCk7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhyKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c191bnNhZmVfZ2V0ZW52XG4vL1JlcXVpcmVzOiBjYW1sX3N5c19nZXRlbnZcbmZ1bmN0aW9uIGNhbWxfc3lzX3Vuc2FmZV9nZXRlbnYobmFtZSl7XG4gIHJldHVybiBjYW1sX3N5c19nZXRlbnYgKG5hbWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG52YXIgY2FtbF9hcmd2ID0gKChmdW5jdGlvbiAoKSB7XG4gIHZhciBwcm9jZXNzID0gZ2xvYmFsVGhpcy5wcm9jZXNzO1xuICB2YXIgbWFpbiA9IFwiYS5vdXRcIjtcbiAgdmFyIGFyZ3MgPSBbXVxuXG4gIGlmKHByb2Nlc3NcbiAgICAgJiYgcHJvY2Vzcy5hcmd2XG4gICAgICYmIHByb2Nlc3MuYXJndi5sZW5ndGggPiAxKSB7XG4gICAgdmFyIGFyZ3YgPSBwcm9jZXNzLmFyZ3ZcbiAgICAvL25vZGVqc1xuICAgIG1haW4gPSBhcmd2WzFdO1xuICAgIGFyZ3MgPSBhcmd2LnNsaWNlKDIpO1xuICB9XG5cbiAgdmFyIHAgPSBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhtYWluKTtcbiAgdmFyIGFyZ3MyID0gWzAsIHBdO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKylcbiAgICBhcmdzMi5wdXNoKGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKGFyZ3NbaV0pKTtcbiAgcmV0dXJuIGFyZ3MyO1xufSkoKSlcblxuLy9Qcm92aWRlczogY2FtbF9leGVjdXRhYmxlX25hbWVcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxudmFyIGNhbWxfZXhlY3V0YWJsZV9uYW1lID0gY2FtbF9hcmd2WzFdXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2dldF9hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2dldF9hcmd2IChhKSB7XG4gIHJldHVybiBbMCwgY2FtbF9hcmd2WzFdLCBjYW1sX2FyZ3ZdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19hcmd2XG4vL1JlcXVpcmVzOiBjYW1sX2FyZ3ZcbmZ1bmN0aW9uIGNhbWxfc3lzX2FyZ3YgKGEpIHtcbiAgcmV0dXJuIGNhbWxfYXJndjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfbW9kaWZ5X2FyZ3Zcbi8vUmVxdWlyZXM6IGNhbWxfYXJndlxuZnVuY3Rpb24gY2FtbF9zeXNfbW9kaWZ5X2FyZ3YoYXJnKXtcbiAgY2FtbF9hcmd2ID0gYXJnO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2V4ZWN1dGFibGVfbmFtZVxuZnVuY3Rpb24gY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lKGEpe1xuICByZXR1cm4gY2FtbF9leGVjdXRhYmxlX25hbWVcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmRcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZChjbWQpe1xuICB2YXIgY21kID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcoY21kKTtcbiAgaWYgKHR5cGVvZiByZXF1aXJlICE9IFwidW5kZWZpbmVkXCIpe1xuICAgIHZhciBjaGlsZF9wcm9jZXNzID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuICAgIGlmKGNoaWxkX3Byb2Nlc3MgJiYgY2hpbGRfcHJvY2Vzcy5leGVjU3luYylcbiAgICAgIHRyeSB7XG4gICAgICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoY21kLHtzdGRpbzogJ2luaGVyaXQnfSk7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9XG4gIH1cbiAgZWxzZSByZXR1cm4gMTI3O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19zeXN0ZW1fY29tbWFuZFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3N5c3RlbV9jb21tYW5kKGNtZCl7XG4gIHJldHVybiAxMjc7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3RpbWUgbXV0YWJsZVxudmFyIGNhbWxfaW5pdGlhbF90aW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAqIDAuMDAxO1xuZnVuY3Rpb24gY2FtbF9zeXNfdGltZSAoKSB7XG4gIHZhciBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICByZXR1cm4gbm93ICogMC4wMDEgLSBjYW1sX2luaXRpYWxfdGltZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfdGltZV9pbmNsdWRlX2NoaWxkcmVuXG4vL1JlcXVpcmVzOiBjYW1sX3N5c190aW1lXG5mdW5jdGlvbiBjYW1sX3N5c190aW1lX2luY2x1ZGVfY2hpbGRyZW4oYikge1xuICByZXR1cm4gY2FtbF9zeXNfdGltZSgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yYW5kb21fc2VlZCBtdXRhYmxlXG4vL1RoZSBmdW5jdGlvbiBuZWVkcyB0byByZXR1cm4gYW4gYXJyYXkgc2luY2UgT0NhbWwgNC4wLi4uXG5mdW5jdGlvbiBjYW1sX3N5c19yYW5kb21fc2VlZCAoKSB7XG4gIGlmKGdsb2JhbFRoaXMuY3J5cHRvKSB7XG4gICAgaWYodHlwZW9mIGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyl7XG4gICAgICAvLyBXZWJicm93c2Vyc1xuICAgICAgdmFyIGEgPSBuZXcgVWludDMyQXJyYXkoMSk7XG4gICAgICBnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYSk7XG4gICAgICByZXR1cm4gWzAsYVswXV07XG4gICAgfSBlbHNlIGlmKGdsb2JhbFRoaXMuY3J5cHRvLnJhbmRvbUJ5dGVzID09PSAnZnVuY3Rpb24nKXtcbiAgICAgIC8vIE5vZGVqc1xuICAgICAgdmFyIGJ1ZmYgPSBnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21CeXRlcyg0KTtcbiAgICAgIHZhciBhID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmYpO1xuICAgICAgcmV0dXJuIFswLGFbMF1dO1xuICAgIH1cbiAgfVxuICB2YXIgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgdmFyIHggPSBub3deMHhmZmZmZmZmZipNYXRoLnJhbmRvbSgpO1xuICByZXR1cm4gWzAseF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X2JpZ19lbmRpYW4gY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X2JpZ19lbmRpYW4gKCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF93b3JkX3NpemUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X3dvcmRfc2l6ZSAoKSB7IHJldHVybiAzMjsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9pbnRfc2l6ZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3RfaW50X3NpemUgKCkgeyByZXR1cm4gMzI7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfbWF4X3dvc2l6ZSBjb25zdFxuLy8gbWF4X2ludCAvIDQgc28gdGhhdCB0aGUgZm9sbG93aW5nIGRvZXMgbm90IG92ZXJmbG93XG4vL2xldCBtYXhfc3RyaW5nX2xlbmd0aCA9IHdvcmRfc2l6ZSAvIDggKiBtYXhfYXJyYXlfbGVuZ3RoIC0gMTs7XG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9tYXhfd29zaXplICgpIHsgcmV0dXJuICgweDdGRkZGRkZGLzQpIHwgMDt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV91bml4IGNvbnN0XG4vL1JlcXVpcmVzOiBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9vc3R5cGVfdW5peCAoKSB7IHJldHVybiBvc190eXBlID09IFwiVW5peFwiID8gMSA6IDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV93aW4zMiBjb25zdFxuLy9SZXF1aXJlczogb3NfdHlwZVxuZnVuY3Rpb24gY2FtbF9zeXNfY29uc3Rfb3N0eXBlX3dpbjMyICgpIHsgcmV0dXJuIG9zX3R5cGUgPT0gXCJXaW4zMlwiID8gMSA6IDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4gY29uc3Rcbi8vUmVxdWlyZXM6IG9zX3R5cGVcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X29zdHlwZV9jeWd3aW4gKCkgeyByZXR1cm4gb3NfdHlwZSA9PSBcIkN5Z3dpblwiID8gMSA6IDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfY29uc3RfYmFja2VuZF90eXBlIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3N5c19jb25zdF9iYWNrZW5kX3R5cGUgKCkge1xuICByZXR1cm4gWzAsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJqc19vZl9vY2FtbFwiKV07XG59XG5cbi8vUHJvdmlkZXM6IG9zX3R5cGVcbnZhciBvc190eXBlID0gKGdsb2JhbFRoaXMucHJvY2VzcyAmJlxuICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5wcm9jZXNzLnBsYXRmb3JtICYmXG4gICAgICAgICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MucGxhdGZvcm0gPT0gXCJ3aW4zMlwiKSA/IFwiQ3lnd2luXCIgOiBcIlVuaXhcIjtcblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19nZXRfY29uZmlnIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzLCBvc190eXBlXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRfY29uZmlnICgpIHtcbiAgcmV0dXJuIFswLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKG9zX3R5cGUpLCAzMiwgMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzYXR0eVxuZnVuY3Rpb24gY2FtbF9zeXNfaXNhdHR5KF9jaGFuKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfdmFyaWFudFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9ydW50aW1lX3ZhcmlhbnQoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfcGFyYW1ldGVyc1xuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9ydW50aW1lX3BhcmFtZXRlcnMoX3VuaXQpIHtcbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5zdGFsbF9zaWduYWxfaGFuZGxlciBjb25zdFxuZnVuY3Rpb24gY2FtbF9pbnN0YWxsX3NpZ25hbF9oYW5kbGVyKCl7cmV0dXJuIDB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xudmFyIGNhbWxfcnVudGltZV93YXJuaW5ncyA9IDA7XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3Ncbi8vUmVxdWlyZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xuZnVuY3Rpb24gY2FtbF9tbF9lbmFibGVfcnVudGltZV93YXJuaW5ncyAoYm9vbCkge1xuICBjYW1sX3J1bnRpbWVfd2FybmluZ3MgPSBib29sO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWRcbi8vUmVxdWlyZXM6IGNhbWxfcnVudGltZV93YXJuaW5nc1xuZnVuY3Rpb24gY2FtbF9tbF9ydW50aW1lX3dhcm5pbmdzX2VuYWJsZWQgKF91bml0KSB7XG4gIHJldHVybiBjYW1sX3J1bnRpbWVfd2FybmluZ3M7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9zcGFjZXRpbWVfZW5hYmxlZCBjb25zdCAoY29uc3QpXG5mdW5jdGlvbiBjYW1sX3NwYWNldGltZV9lbmFibGVkKF91bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jb25zdF9uYWtlZF9wb2ludGVyc19jaGVja2VkIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfc3lzX2NvbnN0X25ha2VkX3BvaW50ZXJzX2NoZWNrZWQoX3VuaXQpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVnaXN0ZXJfY2hhbm5lbF9mb3Jfc3BhY2V0aW1lIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfcmVnaXN0ZXJfY2hhbm5lbF9mb3Jfc3BhY2V0aW1lKF9jaGFubmVsKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NwYWNldGltZV9vbmx5X3dvcmtzX2Zvcl9uYXRpdmVfY29kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9zcGFjZXRpbWVfb25seV93b3Jrc19mb3JfbmF0aXZlX2NvZGUoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJTcGFjZXRpbWUgcHJvZmlsaW5nIG9ubHkgd29ya3MgZm9yIG5hdGl2ZSBjb2RlXCIpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZVxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX2lzX3JlZ3VsYXJfZmlsZShuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHJldHVybiByb290LmRldmljZS5pc0ZpbGUocm9vdC5yZXN0KTtcbn1cbi8vQWx3YXlzXG4vL1JlcXVpcmVzOiBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9zZXR1cF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlcigpIHtcbiAgdmFyIHByb2Nlc3MgPSBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gIGlmKHByb2Nlc3MgJiYgcHJvY2Vzcy5vbikge1xuICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgZnVuY3Rpb24gKGVyciwgb3JpZ2luKSB7XG4gICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihlcnIpO1xuICAgICAgcHJvY2Vzcy5leGl0ICgyKTtcbiAgICB9KVxuICB9XG4gIGVsc2UgaWYoZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKXtcbiAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgaWYoZXZlbnQuZXJyb3Ipe1xuICAgICAgICBjYW1sX2ZhdGFsX3VuY2F1Z2h0X2V4Y2VwdGlvbihldmVudC5lcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmNhbWxfc2V0dXBfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIoKTtcbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cblxuLy9Qcm92aWRlczogY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWdcbi8vUmVxdWlyZXM6IGpzb29fc3lzX2dldGVudlxudmFyIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnID0gRkxBRyhcIndpdGgtanMtZXJyb3JcIik7XG5cbihmdW5jdGlvbiAoKSB7XG4gIHZhciByID0ganNvb19zeXNfZ2V0ZW52KFwiT0NBTUxSVU5QQVJBTVwiKVxuICBpZihyICE9PSB1bmRlZmluZWQpe1xuICAgIHZhciBsID0gci5zcGxpdChcIixcIik7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspe1xuICAgICAgaWYobFtpXSA9PSBcImJcIikgeyBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZyA9IDE7IGJyZWFrIH1cbiAgICAgIGVsc2UgaWYgKGxbaV0uc3RhcnRzV2l0aChcImI9XCIpKSB7XG4gICAgICAgIGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnID0gKyhsW2ldLnNsaWNlKDIpKX1cbiAgICAgIGVsc2UgY29udGludWU7XG4gICAgfVxuICB9XG59KSAoKVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXMgKCkgeyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9iYWNrdHJhY2Vfc3RhdHVzXG4vL1JlcXVpcmVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZ1xuZnVuY3Rpb24gY2FtbF9iYWNrdHJhY2Vfc3RhdHVzIChfdW5pdCkgeyByZXR1cm4gY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcgPyAxIDogMDsgfVxuLy9Qcm92aWRlczogY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX2JhY2t0cmFjZSAoKSB7IHJldHVybiAwOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9leGNlcHRpb25fcmF3X2JhY2t0cmFjZSBjb25zdFxuZnVuY3Rpb24gY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2UgKCkgeyByZXR1cm4gWzBdOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfcmVjb3JkX2JhY2t0cmFjZV9mbGFnXG5mdW5jdGlvbiBjYW1sX3JlY29yZF9iYWNrdHJhY2UgKGIpIHsgY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcgPSBiOyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlICgpIHsgcmV0dXJuIFswXTsgfVxuLy9Qcm92aWRlczogY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9yYXdfYmFja3RyYWNlX2xlbmd0aCgpIHsgcmV0dXJuIDA7IH1cbi8vUHJvdmlkZXM6IGNhbWxfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3RcbmZ1bmN0aW9uIGNhbWxfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QoKSB7IHJldHVybiAwIH1cbi8vUHJvdmlkZXM6IGNhbWxfcmF3X2JhY2t0cmFjZV9zbG90XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfcmF3X2JhY2t0cmFjZV9zbG90ICgpIHtcbiAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2Vfc2xvdDogaW5kZXggb3V0IG9mIGJvdW5kc1wiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfcmVzdG9yZV9yYXdfYmFja3RyYWNlXG5mdW5jdGlvbiBjYW1sX3Jlc3RvcmVfcmF3X2JhY2t0cmFjZShleG4sIGJ0KSB7IHJldHVybiAwIH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X2N1cnJlbnRfY2FsbHN0YWNrIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2dldF9jdXJyZW50X2NhbGxzdGFjayAoKSB7IHJldHVybiBbMF07IH1cblxuLy9Qcm92aWRlczogY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdCgpe1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9jb252ZXJ0X3Jhd19iYWNrdHJhY2Vfc2xvdFwiKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIGxpYnJhcnlcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy8vLy8vLy8vLy8vLyBKc2xpYlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3B1cmVfZXhwciBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc19wdXJlX2V4cHIgKGYpIHsgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgWzBdKTsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3NldCAobXV0YWJsZSwgY29uc3QsIG11dGFibGUpXG5mdW5jdGlvbiBjYW1sX2pzX3NldChvLGYsdikgeyBvW2ZdPXY7cmV0dXJuIDB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldCAobXV0YWJsZSwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2pzX2dldChvLGYpIHsgcmV0dXJuIG9bZl07IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfZGVsZXRlIChtdXRhYmxlLCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZGVsZXRlKG8sZikgeyBkZWxldGUgb1tmXTsgcmV0dXJuIDB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfaW5zdGFuY2VvZiAoY29uc3QsIGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19pbnN0YW5jZW9mKG8sYykgeyByZXR1cm4gKG8gaW5zdGFuY2VvZiBjKSA/IDEgOiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfdHlwZW9mIChjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfdHlwZW9mKG8pIHsgcmV0dXJuIHR5cGVvZiBvOyB9XG5cbi8vUHJvdmlkZXM6Y2FtbF90cmFtcG9saW5lXG5mdW5jdGlvbiBjYW1sX3RyYW1wb2xpbmUocmVzKSB7XG4gIHZhciBjID0gMTtcbiAgd2hpbGUocmVzICYmIHJlcy5qb29fdHJhbXApe1xuICAgIHJlcyA9IHJlcy5qb29fdHJhbXAuYXBwbHkobnVsbCwgcmVzLmpvb19hcmdzKTtcbiAgICBjKys7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczpjYW1sX3RyYW1wb2xpbmVfcmV0dXJuXG5mdW5jdGlvbiBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuKGYsYXJncykge1xuICByZXR1cm4ge2pvb190cmFtcDpmLGpvb19hcmdzOmFyZ3N9O1xufVxuXG4vL1Byb3ZpZGVzOmNhbWxfc3RhY2tfZGVwdGhcbi8vSWY6IGVmZmVjdHNcbnZhciBjYW1sX3N0YWNrX2RlcHRoID0gMDtcblxuLy9Qcm92aWRlczpjYW1sX3N0YWNrX2NoZWNrX2RlcHRoXG4vL0lmOiBlZmZlY3RzXG4vL1JlcXVpcmVzOmNhbWxfc3RhY2tfZGVwdGhcbmZ1bmN0aW9uIGNhbWxfc3RhY2tfY2hlY2tfZGVwdGgoKSB7XG4gICAgcmV0dXJuIC0tY2FtbF9zdGFja19kZXB0aCA+IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2FsbGJhY2tcbi8vSWY6ICFlZmZlY3RzXG4vL1JlcXVpcmVzOmNhbWxfY2FsbF9nZW5cbnZhciBjYW1sX2NhbGxiYWNrID0gY2FtbF9jYWxsX2dlbjtcblxuLy9Qcm92aWRlczogY2FtbF9jYWxsYmFja1xuLy9JZjogZWZmZWN0c1xuLy9SZXF1aXJlczpjYW1sX3N0YWNrX2RlcHRoLCBjYW1sX2NhbGxfZ2VuLCBjYW1sX2V4bl9zdGFjaywgY2FtbF9maWJlcl9zdGFjaywgY2FtbF93cmFwX2V4Y2VwdGlvbiwgY2FtbF9yZXN1bWVfc3RhY2ssIGNhbWxfZnJlc2hfb29faWQsIGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2Vfd2l0aF9hcmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfY29uc3RhbnRcbmZ1bmN0aW9uIGNhbWxfY2FsbGJhY2soZixhcmdzKSB7XG4gIGZ1bmN0aW9uIHVuY2F1Z2h0X2VmZmVjdF9oYW5kbGVyKGVmZixrLG1zKSB7XG4gICAgLy8gUmVzdW1lcyB0aGUgY29udGludWF0aW9uIGsgYnkgcmFpc2luZyBleGNlcHRpb24gVW5oYW5kbGVkLlxuICAgIGNhbWxfcmVzdW1lX3N0YWNrKGtbMV0sbXMpO1xuICAgIHZhciBleG4gPSBjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LlVuaGFuZGxlZFwiKTtcbiAgICBpZihleG4pIGNhbWxfcmFpc2Vfd2l0aF9hcmcoZXhuLCBlZmYpO1xuICAgIGVsc2Uge1xuICAgICAgZXhuID0gWzI0OCxjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiRWZmZWN0LlVuaGFuZGxlZFwiKSwgY2FtbF9mcmVzaF9vb19pZCgwKV07XG4gICAgICBjYW1sX3JhaXNlX2NvbnN0YW50KGV4bik7XG4gICAgfVxuICB9XG4gIHZhciBzYXZlZF9zdGFja19kZXB0aCA9IGNhbWxfc3RhY2tfZGVwdGg7XG4gIHZhciBzYXZlZF9leG5fc3RhY2sgPSBjYW1sX2V4bl9zdGFjaztcbiAgdmFyIHNhdmVkX2ZpYmVyX3N0YWNrID0gY2FtbF9maWJlcl9zdGFjaztcbiAgdHJ5IHtcbiAgICBjYW1sX2V4bl9zdGFjayA9IDA7XG4gICAgY2FtbF9maWJlcl9zdGFjayA9XG4gICAgICB7aDpbMCwgMCwgMCwgdW5jYXVnaHRfZWZmZWN0X2hhbmRsZXJdLCByOntrOjAsIHg6MCwgZTowfX07XG4gICAgdmFyIHJlcyA9IHtqb29fdHJhbXA6IGYsXG4gICAgICAgICAgICAgICBqb29fYXJnczogYXJncy5jb25jYXQoZnVuY3Rpb24gKHgpe3JldHVybiB4O30pfTtcbiAgICBkbyB7XG4gICAgICBjYW1sX3N0YWNrX2RlcHRoID0gNDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXMgPSBjYW1sX2NhbGxfZ2VuKHJlcy5qb29fdHJhbXAsIHJlcy5qb29fYXJncyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8qIEhhbmRsZSBleGNlcHRpb24gY29taW5nIGZyb20gSmF2YVNjcmlwdCBvciBmcm9tIHRoZSBydW50aW1lLiAqL1xuICAgICAgICBpZiAoIWNhbWxfZXhuX3N0YWNrKSB0aHJvdyBlO1xuICAgICAgICB2YXIgaGFuZGxlciA9IGNhbWxfZXhuX3N0YWNrWzFdO1xuICAgICAgICBjYW1sX2V4bl9zdGFjayA9IGNhbWxfZXhuX3N0YWNrWzJdO1xuICAgICAgICByZXMgPSB7am9vX3RyYW1wOiBoYW5kbGVyLFxuICAgICAgICAgICAgICAgam9vX2FyZ3M6IFtjYW1sX3dyYXBfZXhjZXB0aW9uKGUpXX07XG4gICAgICB9XG4gICAgfSB3aGlsZShyZXMgJiYgcmVzLmpvb19hcmdzKVxuICB9IGZpbmFsbHkge1xuICAgIGNhbWxfc3RhY2tfZGVwdGggPSBzYXZlZF9zdGFja19kZXB0aDtcbiAgICBjYW1sX2V4bl9zdGFjayA9IHNhdmVkX2V4bl9zdGFjaztcbiAgICBjYW1sX2ZpYmVyX3N0YWNrID0gc2F2ZWRfZmliZXJfc3RhY2s7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19qc1xuZnVuY3Rpb24gY2FtbF9pc19qcygpIHtcbiAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc191c2VfanNfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZyh1bml0KXtcbiAgcmV0dXJuIEZMQUcoXCJ1c2UtanMtc3RyaW5nXCIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNvb19mbGFnc19lZmZlY3RzXG5mdW5jdGlvbiBjYW1sX2pzb29fZmxhZ3NfZWZmZWN0cyh1bml0KXtcbiAgcmV0dXJuIEZMQUcoXCJlZmZlY3RzXCIpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfd3JhcF9leGNlcHRpb24gY29uc3QgKG11dGFibGUpXG4vL1JlcXVpcmVzOiBjYW1sX2dsb2JhbF9kYXRhLGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nLGNhbWxfbmFtZWRfdmFsdWVcbmZ1bmN0aW9uIGNhbWxfd3JhcF9leGNlcHRpb24oZSkge1xuICBpZiAoRkxBRyhcImV4Y3dyYXBcIikpIHtcbiAgICBpZihlIGluc3RhbmNlb2YgQXJyYXkpIHJldHVybiBlO1xuICAgIHZhciBleG47XG4gICAgLy9TdGFja19vdmVyZmxvdzogY2hyb21lLCBzYWZhcmlcbiAgICBpZihnbG9iYWxUaGlzLlJhbmdlRXJyb3JcbiAgICAgICAmJiBlIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5SYW5nZUVycm9yXG4gICAgICAgJiYgZS5tZXNzYWdlXG4gICAgICAgJiYgZS5tZXNzYWdlLm1hdGNoKC9tYXhpbXVtIGNhbGwgc3RhY2svaSkpXG4gICAgICBleG4gPSBjYW1sX2dsb2JhbF9kYXRhLlN0YWNrX292ZXJmbG93O1xuICAgIC8vU3RhY2tfb3ZlcmZsb3c6IGZpcmVmb3hcbiAgICBlbHNlIGlmKGdsb2JhbFRoaXMuSW50ZXJuYWxFcnJvclxuICAgICAgICYmIGUgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLkludGVybmFsRXJyb3JcbiAgICAgICAmJiBlLm1lc3NhZ2VcbiAgICAgICAmJiBlLm1lc3NhZ2UubWF0Y2goL3RvbyBtdWNoIHJlY3Vyc2lvbi9pKSlcbiAgICAgIGV4biA9IGNhbWxfZ2xvYmFsX2RhdGEuU3RhY2tfb3ZlcmZsb3c7XG4gICAgLy9XcmFwIEVycm9yIGluIEpzLkVycm9yIGV4Y2VwdGlvblxuICAgIGVsc2UgaWYoZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuRXJyb3IgJiYgY2FtbF9uYW1lZF92YWx1ZShcImpzRXJyb3JcIikpXG4gICAgICBleG4gPSBbMCxjYW1sX25hbWVkX3ZhbHVlKFwianNFcnJvclwiKSxlXTtcbiAgICBlbHNlXG4gICAgICAvL2ZhbGxiYWNrOiB3cmFwcGVkIGluIEZhaWx1cmVcbiAgICAgIGV4biA9IFswLGNhbWxfZ2xvYmFsX2RhdGEuRmFpbHVyZSxjYW1sX3N0cmluZ19vZl9qc3N0cmluZyAoU3RyaW5nKGUpKV07XG4gICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGVycm9yIGF0IGhhbmQsIGxldCdzIHVzZSBpdC5cbiAgICBpZiAoZSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuRXJyb3IpXG4gICAgICBleG4uanNfZXJyb3IgPSBlO1xuICAgIHJldHVybiBleG47XG4gIH0gZWxzZVxuICAgIHJldHVybiBlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2Vcbi8vUmVxdWlyZXM6IGNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlXG4vL1JlcXVpcmVzOiBjYW1sX3JlY29yZF9iYWNrdHJhY2VfZmxhZ1xuZnVuY3Rpb24gY2FtbF9tYXliZV9hdHRhY2hfYmFja3RyYWNlKGV4biwgZm9yY2UpIHtcbiAgaWYoY2FtbF9yZWNvcmRfYmFja3RyYWNlX2ZsYWcpXG4gICAgcmV0dXJuIGNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlKGV4biwgZm9yY2UpO1xuICBlbHNlIHJldHVybiBleG5cbn1cblxuLy8gRXhwZXJpbWVudGFsXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl93aXRoX2pzX2JhY2t0cmFjZVxuLy9SZXF1aXJlczogY2FtbF9nbG9iYWxfZGF0YVxuZnVuY3Rpb24gY2FtbF9leG5fd2l0aF9qc19iYWNrdHJhY2UoZXhuLCBmb3JjZSkge1xuICAvL25ldmVyIHJlcmFpc2UgZm9yIGNvbnN0YW50IGV4blxuICBpZighZXhuLmpzX2Vycm9yIHx8IGZvcmNlIHx8IGV4blswXSA9PSAyNDgpIGV4bi5qc19lcnJvciA9IG5ldyBnbG9iYWxUaGlzLkVycm9yKFwiSnMgZXhjZXB0aW9uIGNvbnRhaW5pbmcgYmFja3RyYWNlXCIpO1xuICByZXR1cm4gZXhuO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXJyb3Jfb3B0aW9uX29mX2V4Y2VwdGlvblxuZnVuY3Rpb24gY2FtbF9qc19lcnJvcl9vcHRpb25fb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZihleG4uanNfZXJyb3IpIHsgcmV0dXJuIFswLCBleG4uanNfZXJyb3JdOyB9XG4gIHJldHVybiAwO1xufVxuXG5cblxuLy9Qcm92aWRlczogY2FtbF9qc19mcm9tX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Jvb2woeCkgeyByZXR1cm4gISF4OyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2Jvb2wgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19ib29sKHgpIHsgcmV0dXJuICt4OyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Zyb21fZmxvYXQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2Zsb2F0KHgpIHsgcmV0dXJuIHg7IH1cbi8vUHJvdmlkZXM6IGNhbWxfanNfdG9fZmxvYXQgY29uc3QgKGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9qc190b19mbG9hdCh4KSB7IHJldHVybiB4OyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnJvbV9hcnJheSBtdXRhYmxlIChzaGFsbG93KVxuZnVuY3Rpb24gY2FtbF9qc19mcm9tX2FycmF5KGEpIHtcbiAgcmV0dXJuIGEuc2xpY2UoMSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3RvX2FycmF5IG11dGFibGUgKHNoYWxsb3cpXG5mdW5jdGlvbiBjYW1sX2pzX3RvX2FycmF5KGEpIHtcbiAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICB2YXIgYiA9IG5ldyBBcnJheShsZW4rMSk7XG4gIGJbMF0gPSAwO1xuICBmb3IodmFyIGk9MDtpPGxlbjtpKyspIGJbaSsxXSA9IGFbaV07XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkgY29uc3QgKG11dGFibGUpXG5mdW5jdGlvbiBjYW1sX2xpc3Rfb2ZfanNfYXJyYXkoYSl7XG4gIHZhciBsID0gMDtcbiAgZm9yKHZhciBpPWEubGVuZ3RoIC0gMTsgaT49MDsgaS0tKXtcbiAgICB2YXIgZSA9IGFbaV07XG4gICAgbCA9IFswLGUsbF07XG4gIH1cbiAgcmV0dXJuIGxcbn1cblxuLy9Qcm92aWRlczogY2FtbF9saXN0X3RvX2pzX2FycmF5IGNvbnN0IChtdXRhYmxlKVxuZnVuY3Rpb24gY2FtbF9saXN0X3RvX2pzX2FycmF5KGwpe1xuICB2YXIgYSA9IFtdO1xuICBmb3IoOyBsICE9PSAwOyBsID0gbFsyXSkge1xuICAgIGEucHVzaChsWzFdKTtcbiAgfVxuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc192YXIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfdmFyKHgpIHtcbiAgdmFyIHggPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyh4KTtcbiAgLy9DaGVja3MgdGhhdCB4IGhhcyB0aGUgZm9ybSBpZGVudFsuaWRlbnRdKlxuICBpZigheC5tYXRjaCgvXlthLXpBLVpfJF1bYS16QS1aXyQwLTldKihcXC5bYS16QS1aXyRdW2EtekEtWl8kMC05XSopKiQvKSl7XG4gICAgY29uc29sZS5lcnJvcihcImNhbWxfanNfdmFyOiBcXFwiXCIgKyB4ICsgXCJcXFwiIGlzIG5vdCBhIHZhbGlkIEphdmFTY3JpcHQgdmFyaWFibGUuIGNvbnRpbnVpbmcgLi5cIik7XG4gICAgLy9jb25zb2xlLmVycm9yKFwiSnMuVW5zYWZlLmV2YWxfc3RyaW5nXCIpXG4gIH1cbiAgcmV0dXJuIGV2YWwoeCk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2NhbGwgKGNvbnN0LCBtdXRhYmxlLCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2pzX2NhbGwoZiwgbywgYXJncykgeyByZXR1cm4gZi5hcHBseShvLCBjYW1sX2pzX2Zyb21fYXJyYXkoYXJncykpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2Z1bl9jYWxsIChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19mdW5fY2FsbChmLCBhKSB7XG4gIHN3aXRjaCAoYS5sZW5ndGgpIHtcbiAgY2FzZSAxOiByZXR1cm4gZigpO1xuICBjYXNlIDI6IHJldHVybiBmIChhWzFdKTtcbiAgY2FzZSAzOiByZXR1cm4gZiAoYVsxXSxhWzJdKTtcbiAgY2FzZSA0OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10pO1xuICBjYXNlIDU6IHJldHVybiBmIChhWzFdLGFbMl0sYVszXSxhWzRdKTtcbiAgY2FzZSA2OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdKTtcbiAgY2FzZSA3OiByZXR1cm4gZiAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0pO1xuICBjYXNlIDg6IHJldHVybiBmIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0sYVs2XSxhWzddKTtcbiAgfVxuICByZXR1cm4gZi5hcHBseShudWxsLCBjYW1sX2pzX2Zyb21fYXJyYXkoYSkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9qc19tZXRoX2NhbGwgKG11dGFibGUsIGNvbnN0LCBzaGFsbG93KVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19tZXRoX2NhbGwobywgZiwgYXJncykge1xuICByZXR1cm4gb1tjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhmKV0uYXBwbHkobywgY2FtbF9qc19mcm9tX2FycmF5KGFyZ3MpKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfbmV3IChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9qc19uZXcoYywgYSkge1xuICBzd2l0Y2ggKGEubGVuZ3RoKSB7XG4gIGNhc2UgMTogcmV0dXJuIG5ldyBjO1xuICBjYXNlIDI6IHJldHVybiBuZXcgYyAoYVsxXSk7XG4gIGNhc2UgMzogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0pO1xuICBjYXNlIDQ6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10pO1xuICBjYXNlIDU6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10sYVs0XSk7XG4gIGNhc2UgNjogcmV0dXJuIG5ldyBjIChhWzFdLGFbMl0sYVszXSxhWzRdLGFbNV0pO1xuICBjYXNlIDc6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0pO1xuICBjYXNlIDg6IHJldHVybiBuZXcgYyAoYVsxXSxhWzJdLGFbM10sYVs0XSxhWzVdLGFbNl0sYVs3XSk7XG4gIH1cbiAgZnVuY3Rpb24gRigpIHsgcmV0dXJuIGMuYXBwbHkodGhpcywgY2FtbF9qc19mcm9tX2FycmF5KGEpKTsgfVxuICBGLnByb3RvdHlwZSA9IGMucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEY7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX29qc19uZXdfYXJyIChjb25zdCwgc2hhbGxvdylcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9vanNfbmV3X2FycihjLCBhKSB7XG4gIHN3aXRjaCAoYS5sZW5ndGgpIHtcbiAgY2FzZSAwOiByZXR1cm4gbmV3IGM7XG4gIGNhc2UgMTogcmV0dXJuIG5ldyBjIChhWzBdKTtcbiAgY2FzZSAyOiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSk7XG4gIGNhc2UgMzogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSk7XG4gIGNhc2UgNDogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSxhWzNdKTtcbiAgY2FzZSA1OiByZXR1cm4gbmV3IGMgKGFbMF0sYVsxXSxhWzJdLGFbM10sYVs0XSk7XG4gIGNhc2UgNjogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSk7XG4gIGNhc2UgNzogcmV0dXJuIG5ldyBjIChhWzBdLGFbMV0sYVsyXSxhWzNdLGFbNF0sYVs1XSxhWzZdKTtcbiAgfVxuICBmdW5jdGlvbiBGKCkgeyByZXR1cm4gYy5hcHBseSh0aGlzLCBhKTsgfVxuICBGLnByb3RvdHlwZSA9IGMucHJvdG90eXBlO1xuICByZXR1cm4gbmV3IEY7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2sgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZihsZW4gPiAwKXtcbiAgICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbik7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzID0gW3VuZGVmaW5lZF07XG4gICAgfVxuICAgIHZhciByZXMgPSBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpO1xuICAgIHJldHVybiAocmVzIGluc3RhbmNlb2YgRnVuY3Rpb24pP2NhbWxfanNfd3JhcF9jYWxsYmFjayhyZXMpOnJlcztcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBbYXJnc10pO1xuICB9XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfY2FsbGJhY2tfc3RyaWN0KGFyaXR5LCBmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyaXR5KTtcbiAgICB2YXIgbGVuID0gTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCwgYXJpdHkpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLCBhcmdzKTtcbiAgfTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmUgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFjaywgY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuZnVuY3Rpb24gY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZShmKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxlbiA9IGNhbWxfanNfZnVuY3Rpb25fYXJpdHkoZik7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpOyB9XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFjayBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrLCBjYW1sX2pzX3dyYXBfY2FsbGJhY2tcbmZ1bmN0aW9uIGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShsZW4gKyAxKTtcbiAgICBhcmdzWzBdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2krMV0gPSBhcmd1bWVudHNbaV07XG4gICAgdmFyIHJlcyA9IGNhbWxfY2FsbGJhY2soZixhcmdzKTtcbiAgICByZXR1cm4gKHJlcyBpbnN0YW5jZW9mIEZ1bmN0aW9uKT9jYW1sX2pzX3dyYXBfY2FsbGJhY2socmVzKTpyZXM7XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50cyBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19hcmd1bWVudHMoZikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpXSA9IGFyZ3VtZW50c1tpXTtcbiAgICByZXR1cm4gY2FtbF9jYWxsYmFjayhmLFt0aGlzLGFyZ3NdKTtcbiAgfVxufVxuLy9Qcm92aWRlczogY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2NhbGxiYWNrXG5mdW5jdGlvbiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3QoYXJpdHksIGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcml0eSArIDEpO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoLCBhcml0eSlcbiAgICBhcmdzWzBdID0gdGhpcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBhcmdzW2krMV0gPSBhcmd1bWVudHNbaV07XG4gICAgcmV0dXJuIGNhbWxfY2FsbGJhY2soZiwgYXJncyk7XG4gIH07XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmUgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFjaywgY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuZnVuY3Rpb24gY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlKGYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbGVuID0gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKSAtIDE7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkobGVuICsgMSk7XG4gICAgYXJnc1swXSA9IHRoaXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgYXJnc1tpKzFdID0gYXJndW1lbnRzW2ldO1xuICAgIHJldHVybiBjYW1sX2NhbGxiYWNrKGYsIGFyZ3MpOyB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZnVuY3Rpb25fYXJpdHlcbi8vSWY6ICFlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX2pzX2Z1bmN0aW9uX2FyaXR5KGYpIHtcbiAgcmV0dXJuIChmLmwgPj0gMCk/Zi5sOihmLmwgPSBmLmxlbmd0aClcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19mdW5jdGlvbl9hcml0eVxuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9qc19mdW5jdGlvbl9hcml0eShmKSB7XG4gIC8vIEZ1bmN0aW9ucyBoYXZlIGFuIGFkZGl0aW9uYWwgY29udGludWF0aW9uIHBhcmFtZXRlci4gVGhpcyBzaG91bGRcbiAgLy8gbm90IGJlIHZpc2libGUgd2hlbiBjYWxsaW5nIHRoZW0gZnJvbSBKYXZhU2NyaXB0XG4gIHJldHVybiAoKGYubCA+PSAwKT9mLmw6KGYubCA9IGYubGVuZ3RoKSkgLSAxXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXF1YWxzIG11dGFibGUgKGNvbnN0LCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfanNfZXF1YWxzICh4LCB5KSB7IHJldHVybiArKHggPT0geSk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9qc19ldmFsX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19ldmFsX3N0cmluZyAocykge3JldHVybiBldmFsKGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMpKTt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfZXhwciAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9qc19leHByKHMpIHtcbiAgY29uc29sZS5lcnJvcihcImNhbWxfanNfZXhwcjogZmFsbGJhY2sgdG8gcnVudGltZSBldmFsdWF0aW9uXFxuXCIpO1xuICByZXR1cm4gZXZhbChjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzKSk7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3B1cmVfanNfZXhwciBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9wdXJlX2pzX2V4cHIgKHMpe1xuICBjb25zb2xlLmVycm9yKFwiY2FtbF9wdXJlX2pzX2V4cHI6IGZhbGxiYWNrIHRvIHJ1bnRpbWUgZXZhbHVhdGlvblxcblwiKTtcbiAgcmV0dXJuIGV2YWwoY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcocykpO31cblxuLy9Qcm92aWRlczogY2FtbF9qc19vYmplY3QgKG9iamVjdF9saXRlcmFsKVxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfanNfb2JqZWN0IChhKSB7XG4gIHZhciBvID0ge307XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwID0gYVtpXTtcbiAgICBvW2NhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHBbMV0pXSA9IHBbMl07XG4gIH1cbiAgcmV0dXJuIG87XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEZvcm1hdFxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlX2Zvcm1hdFxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX3BhcnNlX2Zvcm1hdCAoZm10KSB7XG4gIGZtdCA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcoZm10KTtcbiAgdmFyIGxlbiA9IGZtdC5sZW5ndGg7XG4gIGlmIChsZW4gPiAzMSkgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZm9ybWF0X2ludDogZm9ybWF0IHRvbyBsb25nXCIpO1xuICB2YXIgZiA9XG4gICAgICB7IGp1c3RpZnk6JysnLCBzaWduc3R5bGU6Jy0nLCBmaWxsZXI6JyAnLCBhbHRlcm5hdGU6ZmFsc2UsXG4gICAgICAgIGJhc2U6MCwgc2lnbmVkY29udjpmYWxzZSwgd2lkdGg6MCwgdXBwZXJjYXNlOmZhbHNlLFxuICAgICAgICBzaWduOjEsIHByZWM6LTEsIGNvbnY6J2YnIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYyA9IGZtdC5jaGFyQXQoaSk7XG4gICAgc3dpdGNoIChjKSB7XG4gICAgY2FzZSAnLSc6XG4gICAgICBmLmp1c3RpZnkgPSAnLSc7IGJyZWFrO1xuICAgIGNhc2UgJysnOiBjYXNlICcgJzpcbiAgICAgIGYuc2lnbnN0eWxlID0gYzsgYnJlYWs7XG4gICAgY2FzZSAnMCc6XG4gICAgICBmLmZpbGxlciA9ICcwJzsgYnJlYWs7XG4gICAgY2FzZSAnIyc6XG4gICAgICBmLmFsdGVybmF0ZSA9IHRydWU7IGJyZWFrO1xuICAgIGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzpcbiAgICBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzpcbiAgICAgIGYud2lkdGggPSAwO1xuICAgICAgd2hpbGUgKGM9Zm10LmNoYXJDb2RlQXQoaSkgLSA0OCwgYyA+PSAwICYmIGMgPD0gOSkge1xuICAgICAgICBmLndpZHRoID0gZi53aWR0aCAqIDEwICsgYzsgaSsrXG4gICAgICB9XG4gICAgICBpLS07XG4gICAgICBicmVhaztcbiAgICBjYXNlICcuJzpcbiAgICAgIGYucHJlYyA9IDA7XG4gICAgICBpKys7XG4gICAgICB3aGlsZSAoYz1mbXQuY2hhckNvZGVBdChpKSAtIDQ4LCBjID49IDAgJiYgYyA8PSA5KSB7XG4gICAgICAgIGYucHJlYyA9IGYucHJlYyAqIDEwICsgYzsgaSsrXG4gICAgICB9XG4gICAgICBpLS07XG4gICAgY2FzZSAnZCc6IGNhc2UgJ2knOlxuICAgICAgZi5zaWduZWRjb252ID0gdHJ1ZTsgLyogZmFsbHRocm91Z2ggKi9cbiAgICBjYXNlICd1JzpcbiAgICAgIGYuYmFzZSA9IDEwOyBicmVhaztcbiAgICBjYXNlICd4JzpcbiAgICAgIGYuYmFzZSA9IDE2OyBicmVhaztcbiAgICBjYXNlICdYJzpcbiAgICAgIGYuYmFzZSA9IDE2OyBmLnVwcGVyY2FzZSA9IHRydWU7IGJyZWFrO1xuICAgIGNhc2UgJ28nOlxuICAgICAgZi5iYXNlID0gODsgYnJlYWs7XG4gICAgY2FzZSAnZSc6IGNhc2UgJ2YnOiBjYXNlICdnJzpcbiAgICAgIGYuc2lnbmVkY29udiA9IHRydWU7IGYuY29udiA9IGM7IGJyZWFrO1xuICAgIGNhc2UgJ0UnOiBjYXNlICdGJzogY2FzZSAnRyc6XG4gICAgICBmLnNpZ25lZGNvbnYgPSB0cnVlOyBmLnVwcGVyY2FzZSA9IHRydWU7XG4gICAgICBmLmNvbnYgPSBjLnRvTG93ZXJDYXNlICgpOyBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcoZiwgcmF3YnVmZmVyKSB7XG4gIGlmIChmLnVwcGVyY2FzZSkgcmF3YnVmZmVyID0gcmF3YnVmZmVyLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBsZW4gPSByYXdidWZmZXIubGVuZ3RoO1xuICAvKiBBZGp1c3QgbGVuIHRvIHJlZmxlY3QgYWRkaXRpb25hbCBjaGFycyAoc2lnbiwgZXRjKSAqL1xuICBpZiAoZi5zaWduZWRjb252ICYmIChmLnNpZ24gPCAwIHx8IGYuc2lnbnN0eWxlICE9ICctJykpIGxlbisrO1xuICBpZiAoZi5hbHRlcm5hdGUpIHtcbiAgICBpZiAoZi5iYXNlID09IDgpIGxlbiArPSAxO1xuICAgIGlmIChmLmJhc2UgPT0gMTYpIGxlbiArPSAyO1xuICB9XG4gIC8qIERvIHRoZSBmb3JtYXR0aW5nICovXG4gIHZhciBidWZmZXIgPSBcIlwiO1xuICBpZiAoZi5qdXN0aWZ5ID09ICcrJyAmJiBmLmZpbGxlciA9PSAnICcpXG4gICAgZm9yICh2YXIgaSA9IGxlbjsgaSA8IGYud2lkdGg7IGkrKykgYnVmZmVyICs9ICcgJztcbiAgaWYgKGYuc2lnbmVkY29udikge1xuICAgIGlmIChmLnNpZ24gPCAwKSBidWZmZXIgKz0gJy0nO1xuICAgIGVsc2UgaWYgKGYuc2lnbnN0eWxlICE9ICctJykgYnVmZmVyICs9IGYuc2lnbnN0eWxlO1xuICB9XG4gIGlmIChmLmFsdGVybmF0ZSAmJiBmLmJhc2UgPT0gOCkgYnVmZmVyICs9ICcwJztcbiAgaWYgKGYuYWx0ZXJuYXRlICYmIGYuYmFzZSA9PSAxNikgYnVmZmVyICs9IGYudXBwZXJjYXNlP1wiMFhcIjpcIjB4XCI7XG4gIGlmIChmLmp1c3RpZnkgPT0gJysnICYmIGYuZmlsbGVyID09ICcwJylcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gJzAnO1xuICBidWZmZXIgKz0gcmF3YnVmZmVyO1xuICBpZiAoZi5qdXN0aWZ5ID09ICctJylcbiAgICBmb3IgKHZhciBpID0gbGVuOyBpIDwgZi53aWR0aDsgaSsrKSBidWZmZXIgKz0gJyAnO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhidWZmZXIpO1xufVxuIiwiLy8gSnNfb2Zfb2NhbWwgcnVudGltZSBzdXBwb3J0XG4vLyBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuLy8gQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGpzb29fZmxvb3JfbG9nMlxudmFyIGxvZzJfb2sgPSBNYXRoLmxvZzIgJiYgTWF0aC5sb2cyKDEuMTIzNTU4MjA5Mjg4OTQ3NEUrMzA3KSA9PSAxMDIwXG5mdW5jdGlvbiBqc29vX2Zsb29yX2xvZzIoeCkge1xuICBpZihsb2cyX29rKSByZXR1cm4gTWF0aC5mbG9vcihNYXRoLmxvZzIoeCkpXG4gIHZhciBpID0gMDtcbiAgaWYgKHggPT0gMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgaWYoeD49MSkge3doaWxlICh4Pj0yKSB7eC89MjsgaSsrfSB9XG4gIGVsc2Uge3doaWxlICh4IDwgMSkge3gqPTI7IGktLX0gfTtcbiAgcmV0dXJuIGk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczoganNvb19mbG9vcl9sb2cyLCBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaVxuZnVuY3Rpb24gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0ICh4KSB7XG4gIGlmICghaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoaXNOYU4oeCkpXG4gICAgICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkoMSwgMCwgMHg3ZmYwKTtcbiAgICBpZiAoeCA+IDApXG4gICAgICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkoMCwgMCwgMHg3ZmYwKVxuICAgIGVsc2VcbiAgICAgIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaSgwLCAwLCAweGZmZjApXG4gIH1cbiAgdmFyIHNpZ24gPSAoeD09MCAmJiAxL3ggPT0gLUluZmluaXR5KT8weDgwMDA6KHg+PTApPzA6MHg4MDAwO1xuICBpZiAoc2lnbikgeCA9IC14O1xuICAvLyBJbnQ2NC5iaXRzX29mX2Zsb2F0IDEuMTIzNTU4MjA5Mjg4OTQ3NEUrMzA3ID0gMHg3ZmIwMDAwMDAwMDAwMDAwTFxuICAvLyB1c2luZyBNYXRoLkxPRzJFKk1hdGgubG9nKHgpIGluIHBsYWNlIG9mIE1hdGgubG9nMiByZXN1bHQgaW4gcHJlY2lzaW9uIGxvc3RcbiAgdmFyIGV4cCA9IGpzb29fZmxvb3JfbG9nMih4KSArIDEwMjM7XG4gIGlmIChleHAgPD0gMCkge1xuICAgIGV4cCA9IDA7XG4gICAgeCAvPSBNYXRoLnBvdygyLC0xMDI2KTtcbiAgfSBlbHNlIHtcbiAgICB4IC89IE1hdGgucG93KDIsZXhwLTEwMjcpO1xuICAgIGlmICh4IDwgMTYpIHtcbiAgICAgIHggKj0gMjsgZXhwIC09MTsgfVxuICAgIGlmIChleHAgPT0gMCkge1xuICAgICAgeCAvPSAyOyB9XG4gIH1cbiAgdmFyIGsgPSBNYXRoLnBvdygyLDI0KTtcbiAgdmFyIHIzID0geHwwO1xuICB4ID0gKHggLSByMykgKiBrO1xuICB2YXIgcjIgPSB4fDA7XG4gIHggPSAoeCAtIHIyKSAqIGs7XG4gIHZhciByMSA9IHh8MDtcbiAgcjMgPSAocjMgJjB4ZikgfCBzaWduIHwgZXhwIDw8IDQ7XG4gIHJldHVybiBjYW1sX2ludDY0X2NyZWF0ZV9sb19taV9oaShyMSwgcjIsIHIzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBqc29vX2Zsb29yX2xvZzJcbmZ1bmN0aW9uIGNhbWxfaW50MzJfYml0c19vZl9mbG9hdCAoeCkge1xuICB2YXIgZmxvYXQzMmEgPSBuZXcgRmxvYXQzMkFycmF5KDEpO1xuICBmbG9hdDMyYVswXSA9IHg7XG4gIHZhciBpbnQzMmEgPSBuZXcgSW50MzJBcnJheShmbG9hdDMyYS5idWZmZXIpO1xuICByZXR1cm4gaW50MzJhWzBdIHwgMDtcbn1cblxuLy9GUCBsaXRlcmFscyBjYW4gYmUgd3JpdHRlbiB1c2luZyB0aGUgaGV4YWRlY2ltYWxcbi8vbm90YXRpb24gMHg8bWFudGlzc2EgaW4gaGV4PnA8ZXhwb25lbnQ+IGZyb20gSVNPIEM5OS5cbi8vaHR0cHM6Ly9naXRodWIuY29tL2RhbmtvZ2FpL2pzLWhleGZsb2F0L2Jsb2IvbWFzdGVyL2hleGZsb2F0LmpzXG4vL1Byb3ZpZGVzOiBjYW1sX2hleHN0cmluZ19vZl9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcsIGNhbWxfc3RyX3JlcGVhdFxuZnVuY3Rpb24gY2FtbF9oZXhzdHJpbmdfb2ZfZmxvYXQgKHgsIHByZWMsIHN0eWxlKSB7XG4gIGlmICghaXNGaW5pdGUoeCkpIHtcbiAgICBpZiAoaXNOYU4oeCkpIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhcIm5hblwiKTtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKCh4ID4gMCk/XCJpbmZpbml0eVwiOlwiLWluZmluaXR5XCIpO1xuICB9XG4gIHZhciBzaWduID0gKHg9PTAgJiYgMS94ID09IC1JbmZpbml0eSk/MTooeD49MCk/MDoxO1xuICBpZihzaWduKSB4ID0gLXg7XG4gIHZhciBleHAgPSAwO1xuICBpZiAoeCA9PSAwKSB7IH1cbiAgZWxzZSBpZiAoeCA8IDEpIHtcbiAgICB3aGlsZSAoeCA8IDEgJiYgZXhwID4gLTEwMjIpICB7IHggKj0gMjsgZXhwLS0gfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlICh4ID49IDIpIHsgeCAvPSAyOyBleHArKyB9XG4gIH1cbiAgdmFyIGV4cF9zaWduID0gZXhwIDwgMCA/ICcnIDogJysnO1xuICB2YXIgc2lnbl9zdHIgPSAnJztcbiAgaWYgKHNpZ24pIHNpZ25fc3RyID0gJy0nXG4gIGVsc2Uge1xuICAgIHN3aXRjaChzdHlsZSl7XG4gICAgY2FzZSA0MyAvKiAnKycgKi86IHNpZ25fc3RyID0gJysnOyBicmVhaztcbiAgICBjYXNlIDMyIC8qICcgJyAqLzogc2lnbl9zdHIgPSAnICc7IGJyZWFrO1xuICAgIGRlZmF1bHQ6IGJyZWFrO1xuICAgIH1cbiAgfVxuICBpZiAocHJlYyA+PSAwICYmIHByZWMgPCAxMykge1xuICAgIC8qIElmIGEgcHJlY2lzaW9uIGlzIGdpdmVuLCBhbmQgaXMgc21hbGwsIHJvdW5kIG1hbnRpc3NhIGFjY29yZGluZ2x5ICovXG4gICAgdmFyIGNzdCA9IE1hdGgucG93KDIscHJlYyAqIDQpO1xuICAgIHggPSBNYXRoLnJvdW5kKHggKiBjc3QpIC8gY3N0O1xuICB9XG4gIHZhciB4X3N0ciA9IHgudG9TdHJpbmcoMTYpO1xuICBpZihwcmVjID49IDApe1xuICAgIHZhciBpZHggPSB4X3N0ci5pbmRleE9mKCcuJyk7XG4gICAgaWYoaWR4PDApIHtcbiAgICAgIHhfc3RyICs9ICcuJyArIGNhbWxfc3RyX3JlcGVhdChwcmVjLCAnMCcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBzaXplID0gaWR4KzErcHJlYztcbiAgICAgIGlmKHhfc3RyLmxlbmd0aCA8IHNpemUpXG4gICAgICAgIHhfc3RyICs9IGNhbWxfc3RyX3JlcGVhdChzaXplIC0geF9zdHIubGVuZ3RoLCAnMCcpO1xuICAgICAgZWxzZVxuICAgICAgICB4X3N0ciA9IHhfc3RyLnN1YnN0cigwLHNpemUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcgKHNpZ25fc3RyICsgJzB4JyArIHhfc3RyICsgJ3AnICsgZXhwX3NpZ24gKyBleHAudG9TdHJpbmcoMTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMgKHgpIHtcbiAgdmFyIGxvID0geC5sbztcbiAgdmFyIG1pID0geC5taTtcbiAgdmFyIGhpID0geC5oaTtcbiAgdmFyIGV4cCA9IChoaSAmIDB4N2ZmZikgPj4gNDtcbiAgaWYgKGV4cCA9PSAyMDQ3KSB7XG4gICAgaWYgKChsb3xtaXwoaGkmMHhmKSkgPT0gMClcbiAgICAgIHJldHVybiAoaGkgJiAweDgwMDApPygtSW5maW5pdHkpOkluZmluaXR5O1xuICAgIGVsc2VcbiAgICAgIHJldHVybiBOYU47XG4gIH1cbiAgdmFyIGsgPSBNYXRoLnBvdygyLC0yNCk7XG4gIHZhciByZXMgPSAobG8qayttaSkqaysoaGkmMHhmKTtcbiAgaWYgKGV4cCA+IDApIHtcbiAgICByZXMgKz0gMTY7XG4gICAgcmVzICo9IE1hdGgucG93KDIsZXhwLTEwMjcpO1xuICB9IGVsc2VcbiAgICByZXMgKj0gTWF0aC5wb3coMiwtMTAyNik7XG4gIGlmIChoaSAmIDB4ODAwMCkgcmVzID0gLSByZXM7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbmV4dGFmdGVyX2Zsb2F0IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHMsIGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCwgY2FtbF9pbnQ2NF9hZGQsIGNhbWxfaW50NjRfc3ViLGNhbWxfaW50NjRfb2ZfaW50MzJcbmZ1bmN0aW9uIGNhbWxfbmV4dGFmdGVyX2Zsb2F0ICh4LHkpIHtcbiAgaWYoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiBOYU47XG4gIGlmKHg9PXkpIHJldHVybiB5O1xuICBpZih4PT0wKXtcbiAgICBpZih5IDwgMClcbiAgICAgIHJldHVybiAtTWF0aC5wb3coMiwgLTEwNzQpXG4gICAgZWxzZVxuICAgICAgcmV0dXJuIE1hdGgucG93KDIsIC0xMDc0KVxuICB9XG4gIHZhciBiaXRzID0gY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0KHgpO1xuICB2YXIgb25lID0gY2FtbF9pbnQ2NF9vZl9pbnQzMigxKTtcbiAgaWYgKCh4PHkpID09ICh4PjApKVxuICAgIGJpdHMgPSBjYW1sX2ludDY0X2FkZChiaXRzLCBvbmUpXG4gIGVsc2VcbiAgICBiaXRzID0gY2FtbF9pbnQ2NF9zdWIoYml0cywgb25lKVxuICByZXR1cm4gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGJpdHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3RydW5jX2Zsb2F0XG5mdW5jdGlvbiBjYW1sX3RydW5jX2Zsb2F0KHgpe1xuICByZXR1cm4gTWF0aC50cnVuYyh4KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ludDMyX2Zsb2F0X29mX2JpdHMgKHgpIHtcbiAgdmFyIGludDMyYSA9IG5ldyBJbnQzMkFycmF5KDEpO1xuICBpbnQzMmFbMF0gPSB4O1xuICB2YXIgZmxvYXQzMmEgPSBuZXcgRmxvYXQzMkFycmF5KGludDMyYS5idWZmZXIpO1xuICByZXR1cm4gZmxvYXQzMmFbMF07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2xhc3NpZnlfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfY2xhc3NpZnlfZmxvYXQgKHgpIHtcbiAgaWYgKGlzRmluaXRlICh4KSkge1xuICAgIGlmIChNYXRoLmFicyh4KSA+PSAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkgcmV0dXJuIDA7XG4gICAgaWYgKHggIT0gMCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIDI7XG4gIH1cbiAgcmV0dXJuIGlzTmFOKHgpPzQ6Mztcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbW9kZl9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9tb2RmX2Zsb2F0ICh4KSB7XG4gIGlmIChpc0Zpbml0ZSAoeCkpIHtcbiAgICB2YXIgbmVnID0gKDEveCkgPCAwO1xuICAgIHggPSBNYXRoLmFicyh4KTtcbiAgICB2YXIgaSA9IE1hdGguZmxvb3IgKHgpO1xuICAgIHZhciBmID0geCAtIGk7XG4gICAgaWYgKG5lZykgeyBpID0gLWk7IGYgPSAtZjsgfVxuICAgIHJldHVybiBbMCwgZiwgaV07XG4gIH1cbiAgaWYgKGlzTmFOICh4KSkgcmV0dXJuIFswLCBOYU4sIE5hTl07XG4gIHJldHVybiBbMCwgMS94LCB4XTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfbGRleHBfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbGRleHBfZmxvYXQgKHgsZXhwKSB7XG4gIGV4cCB8PSAwO1xuICBpZiAoZXhwID4gMTAyMykge1xuICAgIGV4cCAtPSAxMDIzO1xuICAgIHggKj0gTWF0aC5wb3coMiwgMTAyMyk7XG4gICAgaWYgKGV4cCA+IDEwMjMpIHsgIC8vIGluIGNhc2UgeCBpcyBzdWJub3JtYWxcbiAgICAgIGV4cCAtPSAxMDIzO1xuICAgICAgeCAqPSBNYXRoLnBvdygyLCAxMDIzKTtcbiAgICB9XG4gIH1cbiAgaWYgKGV4cCA8IC0xMDIzKSB7XG4gICAgZXhwICs9IDEwMjM7XG4gICAgeCAqPSBNYXRoLnBvdygyLCAtMTAyMyk7XG4gIH1cbiAgeCAqPSBNYXRoLnBvdygyLCBleHApO1xuICByZXR1cm4geDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZnJleHBfZmxvYXQgY29uc3Rcbi8vUmVxdWlyZXM6IGpzb29fZmxvb3JfbG9nMlxuZnVuY3Rpb24gY2FtbF9mcmV4cF9mbG9hdCAoeCkge1xuICBpZiAoKHggPT0gMCkgfHwgIWlzRmluaXRlKHgpKSByZXR1cm4gWzAsIHgsIDBdO1xuICB2YXIgbmVnID0geCA8IDA7XG4gIGlmIChuZWcpIHggPSAtIHg7XG4gIHZhciBleHAgPSBNYXRoLm1heCgtMTAyMywganNvb19mbG9vcl9sb2cyKHgpICsgMSk7XG4gIHggKj0gTWF0aC5wb3coMiwtZXhwKTtcbiAgd2hpbGUgKHggPCAwLjUpIHtcbiAgICB4ICo9IDI7XG4gICAgZXhwLS07XG4gIH1cbiAgd2hpbGUgKHggPj0gMSkge1xuICAgIHggKj0gMC41O1xuICAgIGV4cCsrO1xuICB9XG4gIGlmIChuZWcpIHggPSAtIHg7XG4gIHJldHVybiBbMCwgeCwgZXhwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mbG9hdF9jb21wYXJlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2Zsb2F0X2NvbXBhcmUgKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHJldHVybiAwO1xuICBpZiAoeCA8IHkpIHJldHVybiAtMTtcbiAgaWYgKHggPiB5KSByZXR1cm4gMTtcbiAgaWYgKHggPT09IHgpIHJldHVybiAxO1xuICBpZiAoeSA9PT0geSkgcmV0dXJuIC0xO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb3B5c2lnbl9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jb3B5c2lnbl9mbG9hdCAoeCwgeSkge1xuICBpZiAoeSA9PSAwKSB5ID0gMSAvIHk7XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgcmV0dXJuICh5IDwgMCk/KC14KTp4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NpZ25iaXRfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfc2lnbmJpdF9mbG9hdCh4KSB7XG4gIGlmICh4ID09IDApIHggPSAxIC8geDtcbiAgcmV0dXJuICh4IDwgMCk/MTowO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4cG0xX2Zsb2F0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2V4cG0xX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmV4cG0xKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2V4cDJfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXhwMl9mbG9hdCh4KSB7IHJldHVybiBNYXRoLnBvdygyLCB4KTsgfVxuLy9Qcm92aWRlczogY2FtbF9sb2cxcF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9sb2cxcF9mbG9hdCh4KSB7IHJldHVybiBNYXRoLmxvZzFwKHgpOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xvZzJfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMl9mbG9hdCh4KSB7IHJldHVybiBNYXRoLmxvZzIoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfaHlwb3RfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfaHlwb3RfZmxvYXQgKHgsIHkpIHsgcmV0dXJuIE1hdGguaHlwb3QoeCwgeSk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbG9nMTBfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbG9nMTBfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGgubG9nMTAoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfY29zaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jb3NoX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmNvc2goeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfYWNvc2hfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfYWNvc2hfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguYWNvc2goeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfc2luaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9zaW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLnNpbmgoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfYXNpbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfYXNpbmhfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguYXNpbmgoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfdGFuaF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF90YW5oX2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLnRhbmgoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfYXRhbmhfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfYXRhbmhfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGguYXRhbmgoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfcm91bmRfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfcm91bmRfZmxvYXQgKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfY2JydF9mbG9hdCBjb25zdFxuZnVuY3Rpb24gY2FtbF9jYnJ0X2Zsb2F0ICh4KSB7IHJldHVybiBNYXRoLmNicnQoeCk7IH1cblxuLy9Qcm92aWRlczogY2FtbF9lcmZfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZXJmX2Zsb2F0KHgpIHtcbiAgdmFyIGExID0gMC4yNTQ4Mjk1OTI7XG4gIHZhciBhMiA9IC0wLjI4NDQ5NjczNjtcbiAgdmFyIGEzID0gMS40MjE0MTM3NDE7XG4gIHZhciBhNCA9IC0xLjQ1MzE1MjAyNztcbiAgdmFyIGE1ID0gMS4wNjE0MDU0Mjk7XG4gIHZhciBwID0gMC4zMjc1OTExO1xuXG4gIHZhciBzaWduID0gMTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc2lnbiA9IC0xO1xuICB9XG4gIHggPSBNYXRoLmFicyh4KTtcbiAgdmFyIHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICB2YXIgeSA9IDEuMCAtICgoKChhNSAqIHQgKyBhNCkgKiB0ICsgYTMpICogdCArIGEyKSAqIHQgKyBhMSkgKiB0ICogTWF0aC5leHAoLXggKiB4KTtcblxuICByZXR1cm4gc2lnbiAqIHk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXJmY19mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9lcmZfZmxvYXRcbmZ1bmN0aW9uIGNhbWxfZXJmY19mbG9hdCh4KSB7XG4gIHJldHVybiAxIC0gY2FtbF9lcmZfZmxvYXQoeCk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9mbWFfZmxvYXQgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZm1hX2Zsb2F0KHgsIHksIHopIHtcbiAgdmFyIFNQTElUID0gTWF0aC5wb3coMiwgMjcpICsgMTtcbiAgdmFyIE1JTl9WQUxVRSA9IE1hdGgucG93KDIsIC0xMDIyKTtcbiAgdmFyIEVQU0lMT04gPSBNYXRoLnBvdygyLCAtNTIpO1xuICB2YXIgQyA9IDQxNjtcbiAgdmFyIEEgPSBNYXRoLnBvdygyLCArQyk7XG4gIHZhciBCID0gTWF0aC5wb3coMiwgLUMpO1xuXG4gIGZ1bmN0aW9uIG11bHRpcGx5IChhLCBiKSB7XG4gICAgdmFyIGF0ID0gU1BMSVQgKiBhO1xuICAgIHZhciBhaGkgPSBhdCAtIChhdCAtIGEpO1xuICAgIHZhciBhbG8gPSBhIC0gYWhpO1xuICAgIHZhciBidCA9IFNQTElUICogYjtcbiAgICB2YXIgYmhpID0gYnQgLSAoYnQgLSBiKTtcbiAgICB2YXIgYmxvID0gYiAtIGJoaTtcbiAgICB2YXIgcCA9IGEgKiBiO1xuICAgIHZhciBlID0gKChhaGkgKiBiaGkgLSBwKSArIGFoaSAqIGJsbyArIGFsbyAqIGJoaSkgKyBhbG8gKiBibG87XG4gICAgcmV0dXJuIHtcbiAgICAgIHA6IHAsXG4gICAgICBlOiBlXG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB2YXIgcyA9IGEgKyBiO1xuICAgIHZhciB2ID0gcyAtIGE7XG4gICAgdmFyIGUgPSAoYSAtIChzIC0gdikpICsgKGIgLSB2KTtcbiAgICByZXR1cm4ge1xuICAgICAgczogcyxcbiAgICAgIGU6IGVcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIGFkanVzdCAoeCwgeSkge1xuICAgIHJldHVybiB4ICE9PSAwICYmIHkgIT09IDAgJiYgU1BMSVQgKiB4IC0gKFNQTElUICogeCAtIHgpID09PSB4ID8geCAqICgxICsgKHggPCAwID8gLTEgOiArMSkgKiAoeSA8IDAgPyAtMSA6ICsxKSAqIEVQU0lMT04pIDogeDtcbiAgfTtcblxuICBpZiAoeCA9PT0gMCB8fCB4ICE9PSB4IHx8IHggPT09ICsxIC8gMCB8fCB4ID09PSAtMSAvIDAgfHxcbiAgICAgIHkgPT09IDAgfHwgeSAhPT0geSB8fCB5ID09PSArMSAvIDAgfHwgeSA9PT0gLTEgLyAwKSB7XG4gICAgcmV0dXJuIHggKiB5ICsgejtcbiAgfVxuICBpZiAoeiA9PT0gMCkge1xuICAgIHJldHVybiB4ICogeTtcbiAgfVxuICBpZiAoeiAhPT0geiB8fCB6ID09PSArMSAvIDAgfHwgeiA9PT0gLTEgLyAwKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cblxuICB2YXIgc2NhbGUgPSAxO1xuICB3aGlsZSAoTWF0aC5hYnMoeCkgPiBBKSB7XG4gICAgc2NhbGUgKj0gQTtcbiAgICB4ICo9IEI7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpID4gQSkge1xuICAgIHNjYWxlICo9IEE7XG4gICAgeSAqPSBCO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMSAvIDApIHtcbiAgICByZXR1cm4geCAqIHkgKiBzY2FsZTtcbiAgfVxuICB3aGlsZSAoTWF0aC5hYnMoeCkgPCBCKSB7XG4gICAgc2NhbGUgKj0gQjtcbiAgICB4ICo9IEE7XG4gIH1cbiAgd2hpbGUgKE1hdGguYWJzKHkpIDwgQikge1xuICAgIHNjYWxlICo9IEI7XG4gICAgeSAqPSBBO1xuICB9XG4gIGlmIChzY2FsZSA9PT0gMCkge1xuICAgIHJldHVybiB6O1xuICB9XG5cbiAgdmFyIHhzID0geDtcbiAgdmFyIHlzID0geTtcbiAgdmFyIHpzID0geiAvIHNjYWxlO1xuXG4gIGlmIChNYXRoLmFicyh6cykgPiBNYXRoLmFicyh4cyAqIHlzKSAqIDQgLyBFUFNJTE9OKSB7XG4gICAgcmV0dXJuIHo7XG4gIH1cbiAgaWYgKE1hdGguYWJzKHpzKSA8IE1hdGguYWJzKHhzICogeXMpICogRVBTSUxPTiAvIDQgKiBFUFNJTE9OIC8gNCkge1xuICAgIHpzID0gKHogPCAwID8gLTEgOiArMSkgKiBNSU5fVkFMVUU7XG4gIH1cblxuICB2YXIgeHkgPSBtdWx0aXBseSh4cywgeXMpO1xuICB2YXIgcyA9IGFkZCh4eS5wLCB6cyk7XG4gIHZhciB1ID0gYWRkKHh5LmUsIHMuZSk7XG4gIHZhciBpID0gYWRkKHMucywgdS5zKTtcblxuICB2YXIgZiA9IGkucyArIGFkanVzdChpLmUsIHUuZSk7XG4gIGlmIChmID09PSAwKSB7XG4gICAgcmV0dXJuIGY7XG4gIH1cblxuICB2YXIgZnMgPSBmICogc2NhbGU7XG4gIGlmIChNYXRoLmFicyhmcykgPiBNSU5fVkFMVUUpIHtcbiAgICByZXR1cm4gZnM7XG4gIH1cblxuICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIHdhcyBleHRyYSByb3VuZGluZyBmb3IgYSBkZW5vcm1hbGl6ZWQgdmFsdWUuXG4gIHJldHVybiBmcyArIGFkanVzdChmIC0gZnMgLyBzY2FsZSwgaS5lKSAqIHNjYWxlO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zvcm1hdF9mbG9hdCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmdcbmZ1bmN0aW9uIGNhbWxfZm9ybWF0X2Zsb2F0IChmbXQsIHgpIHtcbiAgZnVuY3Rpb24gdG9GaXhlZCh4LGRwKSB7XG4gICAgaWYgKE1hdGguYWJzKHgpIDwgMS4wKSB7XG4gICAgICByZXR1cm4geC50b0ZpeGVkKGRwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGUgPSBwYXJzZUludCh4LnRvU3RyaW5nKCkuc3BsaXQoJysnKVsxXSk7XG4gICAgICBpZiAoZSA+IDIwKSB7XG4gICAgICAgIGUgLT0gMjA7XG4gICAgICAgIHggLz0gTWF0aC5wb3coMTAsZSk7XG4gICAgICAgIHggKz0gKG5ldyBBcnJheShlKzEpKS5qb2luKCcwJyk7XG4gICAgICAgIGlmKGRwID4gMCkge1xuICAgICAgICAgIHggPSB4ICsgJy4nICsgKG5ldyBBcnJheShkcCsxKSkuam9pbignMCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfVxuICAgICAgZWxzZSByZXR1cm4geC50b0ZpeGVkKGRwKVxuICAgIH1cbiAgfVxuICB2YXIgcywgZiA9IGNhbWxfcGFyc2VfZm9ybWF0KGZtdCk7XG4gIHZhciBwcmVjID0gKGYucHJlYyA8IDApPzY6Zi5wcmVjO1xuICBpZiAoeCA8IDAgfHwgKHggPT0gMCAmJiAxL3ggPT0gLUluZmluaXR5KSkgeyBmLnNpZ24gPSAtMTsgeCA9IC14OyB9XG4gIGlmIChpc05hTih4KSkgeyBzID0gXCJuYW5cIjsgZi5maWxsZXIgPSAnICc7IH1cbiAgZWxzZSBpZiAoIWlzRmluaXRlKHgpKSB7IHMgPSBcImluZlwiOyBmLmZpbGxlciA9ICcgJzsgfVxuICBlbHNlXG4gICAgc3dpdGNoIChmLmNvbnYpIHtcbiAgICBjYXNlICdlJzpcbiAgICAgIHZhciBzID0geC50b0V4cG9uZW50aWFsKHByZWMpO1xuICAgICAgLy8gZXhwb25lbnQgc2hvdWxkIGJlIGF0IGxlYXN0IHR3byBkaWdpdHNcbiAgICAgIHZhciBpID0gcy5sZW5ndGg7XG4gICAgICBpZiAocy5jaGFyQXQoaSAtIDMpID09ICdlJylcbiAgICAgICAgcyA9IHMuc2xpY2UgKDAsIGkgLSAxKSArICcwJyArIHMuc2xpY2UgKGkgLSAxKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2YnOlxuICAgICAgcyA9IHRvRml4ZWQoeCwgcHJlYyk7IGJyZWFrO1xuICAgIGNhc2UgJ2cnOlxuICAgICAgcHJlYyA9IHByZWM/cHJlYzoxO1xuICAgICAgcyA9IHgudG9FeHBvbmVudGlhbChwcmVjIC0gMSk7XG4gICAgICB2YXIgaiA9IHMuaW5kZXhPZignZScpO1xuICAgICAgdmFyIGV4cCA9ICtzLnNsaWNlKGogKyAxKTtcbiAgICAgIGlmIChleHAgPCAtNCB8fCB4ID49IDFlMjEgfHwgeC50b0ZpeGVkKDApLmxlbmd0aCA+IHByZWMpIHtcbiAgICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHplcm9lc1xuICAgICAgICB2YXIgaSA9IGogLSAxOyB3aGlsZSAocy5jaGFyQXQoaSkgPT0gJzAnKSBpLS07XG4gICAgICAgIGlmIChzLmNoYXJBdChpKSA9PSAnLicpIGktLTtcbiAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpICsgcy5zbGljZShqKTtcbiAgICAgICAgaSA9IHMubGVuZ3RoO1xuICAgICAgICBpZiAocy5jaGFyQXQoaSAtIDMpID09ICdlJylcbiAgICAgICAgICBzID0gcy5zbGljZSAoMCwgaSAtIDEpICsgJzAnICsgcy5zbGljZSAoaSAtIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwID0gcHJlYztcbiAgICAgICAgaWYgKGV4cCA8IDApIHsgcCAtPSBleHAgKyAxOyBzID0geC50b0ZpeGVkKHApOyB9XG4gICAgICAgIGVsc2Ugd2hpbGUgKHMgPSB4LnRvRml4ZWQocCksIHMubGVuZ3RoID4gcHJlYyArIDEpIHAtLTtcbiAgICAgICAgaWYgKHApIHtcbiAgICAgICAgICAvLyByZW1vdmUgdHJhaWxpbmcgemVyb2VzXG4gICAgICAgICAgdmFyIGkgPSBzLmxlbmd0aCAtIDE7IHdoaWxlIChzLmNoYXJBdChpKSA9PSAnMCcpIGktLTtcbiAgICAgICAgICBpZiAocy5jaGFyQXQoaSkgPT0gJy4nKSBpLS07XG4gICAgICAgICAgcyA9IHMuc2xpY2UoMCwgaSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIHJldHVybiBjYW1sX2ZpbmlzaF9mb3JtYXR0aW5nKGYsIHMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0X29mX3N0cmluZyAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2Zsb2F0X29mX3N0cmluZyhzKSB7XG4gIHZhciByZXM7XG4gIHMgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKHMpXG4gIHJlcyA9ICtzO1xuICBpZiAoKHMubGVuZ3RoID4gMCkgJiYgKHJlcyA9PT0gcmVzKSkgcmV0dXJuIHJlcztcbiAgcyA9IHMucmVwbGFjZSgvXy9nLFwiXCIpO1xuICByZXMgPSArcztcbiAgaWYgKCgocy5sZW5ndGggPiAwKSAmJiAocmVzID09PSByZXMpKSB8fCAvXlsrLV0/bmFuJC9pLnRlc3QocykpIHJldHVybiByZXM7XG4gIHZhciBtID0gL14gKihbKy1dPykweChbMC05YS1mXSspXFwuPyhbMC05YS1mXSopKHAoWystXT9bMC05XSspKT8vaS5leGVjKHMpO1xuICAvLyAgICAgICAgICAxICAgICAgICAyICAgICAgICAgICAgIDMgICAgICAgICAgIDVcbiAgaWYobSl7XG4gICAgdmFyIG0zID0gbVszXS5yZXBsYWNlKC8wKyQvLCcnKTtcbiAgICB2YXIgbWFudGlzc2EgPSBwYXJzZUludChtWzFdICsgbVsyXSArIG0zLCAxNik7XG4gICAgdmFyIGV4cG9uZW50ID0gKG1bNV18MCkgLSA0Km0zLmxlbmd0aDtcbiAgICByZXMgPSBtYW50aXNzYSAqIE1hdGgucG93KDIsIGV4cG9uZW50KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG4gIGlmKC9eXFwrP2luZihpbml0eSk/JC9pLnRlc3QocykpIHJldHVybiBJbmZpbml0eTtcbiAgaWYoL14taW5mKGluaXR5KT8kL2kudGVzdChzKSkgcmV0dXJuIC1JbmZpbml0eTtcbiAgY2FtbF9mYWlsd2l0aChcImZsb2F0X29mX3N0cmluZ1wiKTtcbn1cbiIsIi8qXG5UbyBkZWFsIHdpdGggZWZmZWN0cywgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IGlzIGludHVpdGl2ZWx5IGNvbXBvc2VkIG9mXG5hIHN0YWNrIG9mIGZpYmVycy4gRWFjaCBmaWJlciBoYXMgYSBjdXJyZW50IGxvdy1sZXZlbCBjb250aW51YXRpb25cbihvbmUtYXJndW1lbnQgSmF2YVNjcmlwdCBmdW5jdGlvbiksIGEgc3RhY2sgb2YgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZFxuYSB0cmlwbGUgb2YgaGFuZGxlcnMsIHdoaWNoIGFyZSBpbnZva2VkIHdoZW4gdGhlIGZpYmVyIHRlcm1pbmF0ZXNcbihlaXRoZXIgd2l0aCBhIHZhbHVlIG9yIGFuIGV4Y2VwdGlvbikgb3Igd2hlbiBhbiBlZmZlY3QgaXMgcGVyZm9ybWVkLlxuVGhlIGxvdy1sZXZlbCBjb250aW51YXRpb24gb2YgdGhlIHRvcG1vc3QgZmliZXIgKHdoaWNoIGlzIGN1cnJlbnRseVxuZXhlY3V0aW5nKSBpcyBwYXNzZWQgZnJvbSBmdW5jdGlvbiB0byBmdW5jdGlvbiBhcyBhbiBhZGRpdGlvbmFsXG5hcmd1bWVudC4gSXRzIHN0YWNrIG9mIGV4Y2VwdGlvbiBoYW5kbGVycyBpcyBzdG9yZWQgaW5cbltjYW1sX2V4bl9zdGFja10uIEV4Y2VwdGlvbiBoYW5kbGVycyBhcmUgcHVzaGVkIGludG8gdGhpcyBzdGFjayB3aGVuXG5lbnRlcmluZyBhIFt0cnkgLi4uIHdpdGggLi4uXSBhbmQgcG9wcGVkIG9uIGV4aXQuIFRoZW4sIGhhbmRsZXJzIGFuZFxudGhlIHJlbWFpbmluZyBmaWJlcnMgYXJlIHN0b3JlZCBpbiBbY2FtbF9maWJlcl9zdGFja10uIFRvIGluc3RhbGwgYW5cbmVmZmVjdCBoYW5kbGVyLCB3ZSBwdXNoIGEgbmV3IGZpYmVyIGludG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LlxuXG5XZSBoYXZlIGJhc2ljYWxseSB0aGUgZm9sbG93aW5nIHR5cGUgZm9yIHJlaWZpZWQgY29udGludWF0aW9ucyAodHlwZVxuW2NvbnRpbnVhdGlvbl0gaW4gbW9kdWxlIFtFZmZlY3RdIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KTpcblxuICB0eXBlICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiA9ICgnYSwgJ2IpIHN0YWNrIHJlZlxuXG4gIGFuZCAoXywgXykgc3RhY2sgPVxuICAgICAgQ29ucyA6ICgnYiAtPiB1bml0KSAqICAgICAgICAgICAgICgqIGxvdy1sZXZlbCBjb250aW51YXRpb24gKilcbiAgICAgICAgICAgICAoZXhuIC0+IHVuaXQpIGxpc3QgKiAgICAgICAoKiBleGNlcHRpb24gaGFuZGxlcnMgKilcbiAgICAgICAgICAgICAoJ2IsICdjKSBoYW5kbGVyICpcbiAgICAgICAgICAgICAoJ2EsICdiKSBzdGFja1xuICAgICAgICAgICAgIC0+ICgnYSwgJ2MpIHN0YWNrXG4gICAgfCBFbXB0eSA6ICgnYSwgJ2EpIHN0YWNrXG5cbiAgYW5kICgnYSwnYikgaGFuZGxlciA9ICAgKCogQXMgaW4gbW9kdWxlIEVmZmVjdCBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5ICopXG4gICAgeyByZXRjOiAnYSAtPiAnYjtcbiAgICAgIGV4bmM6IGV4biAtPiAnYjtcbiAgICAgIGVmZmM6ICdjLidjIEVmZmVjdC50IC0+ICgoJ2MsJ2IpIGNvbnRpbnVhdGlvbiAtPiAnYikgb3B0aW9uIH1cblxuQ29udGludWF0aW9ucyBhcmUgb25lLXNob3QuIEEgY29udGludWF0aW9uIFtyZWYgRW1wdHldIGhhcyBhbHJlYWR5XG5iZWVuIHJlc3VtZWQuXG5cbkEgY29udGludWF0aW9uIGlzIGJhc2ljYWxseSBjb21wb3NlZCBvZiBhIGxpc3Qgb2YgZmliZXJzLCB3aGljaCBlYWNoXG5oYXMgaXRzIGxvdy1sZXZlbCBjb250aW51YXRpb24sIGl0cyBzdGFjayBvZiBleGNlcHRpb24gaGFuZGxlcnMgYW5kIGFcbnRyaXBsZSBvZiBoYW5kbGVycyB0byBkZWFsIHdpdGggd2hlbiB0aGUgZmliZXIgdGVybWluYXRlcyBvciBhblxuZWZmZWN0IGlzIHBlcmZvcm1lZC4gV2hlbiByZXN1bWluZyBhIGNvbnRpbnVhdGlvbiwgdGhlIGlubmVybW9zdCBmaWJlclxuaXMgcmVzdW1lZCBmaXJzdC5cblxuVGhlIGhhbmRsZXJzIGFyZSBDUFMtdHJhbnNmb3JtZWQgZnVuY3Rpb25zOiB0aGV5IGFjdHVhbGx5IHRha2UgYW5cbmFkZGl0aW9uYWwgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjdXJyZW50IGxvdy1sZXZlbCBjb250aW51YXRpb24uXG4qL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2V4bl9zdGFja1xuLy9JZjogZWZmZWN0c1xuLy8gVGhpcyBpcyBhbiBPQ2FtbCBsaXN0IG9mIGV4Y2VwdGlvbiBoYW5kbGVyc1xudmFyIGNhbWxfZXhuX3N0YWNrID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9wdXNoX3RyYXBcbi8vUmVxdWlyZXM6IGNhbWxfZXhuX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3B1c2hfdHJhcChoYW5kbGVyKSB7XG4gIGNhbWxfZXhuX3N0YWNrPVswLGhhbmRsZXIsY2FtbF9leG5fc3RhY2tdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3BvcF90cmFwXG4vL1JlcXVpcmVzOiBjYW1sX2V4bl9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wb3BfdHJhcCgpIHtcbiAgaWYgKCFjYW1sX2V4bl9zdGFjaykgcmV0dXJuIGZ1bmN0aW9uKHgpe3Rocm93IHg7fVxuICB2YXIgaCA9IGNhbWxfZXhuX3N0YWNrWzFdO1xuICBjYW1sX2V4bl9zdGFjaz1jYW1sX2V4bl9zdGFja1syXTtcbiAgcmV0dXJuIGhcbn1cblxuLy9Qcm92aWRlczogY2FtbF9maWJlcl9zdGFja1xuLy9JZjogZWZmZWN0c1xuLy8gVGhpcyBoYXMgdGhlIHNoYXBlIHtoLCByOntrLCB4LCBlfX0gd2hlcmUgaCBpcyBhIHRyaXBsZSBvZiBoYW5kbGVyc1xuLy8gKHNlZSBlZmZlY3QuanMpIGFuZCBrLCB4IGFuZCBlIGFyZSB0aGUgc2F2ZWQgY29udGludWF0aW9uLFxuLy8gZXhjZXB0aW9uIHN0YWNrIGFuZCBmaWJlciBzdGFjayBvZiB0aGUgcGFyZW50IGZpYmVyLlxudmFyIGNhbWxfZmliZXJfc3RhY2s7XG5cbi8vUHJvdmlkZXM6Y2FtbF9yZXN1bWVfc3RhY2tcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfcmFpc2VfY29uc3RhbnQsIGNhbWxfZXhuX3N0YWNrLCBjYW1sX2ZpYmVyX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3Jlc3VtZV9zdGFjayhzdGFjaywgaykge1xuICBpZiAoIXN0YWNrKSBjYW1sX3JhaXNlX2NvbnN0YW50XG4gICAgICAgICAgICAgICAgIChjYW1sX25hbWVkX3ZhbHVlKFwiRWZmZWN0LkNvbnRpbnVhdGlvbl9hbHJlYWR5X3Jlc3VtZWRcIikpO1xuICAvLyBVcGRhdGUgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggdGhlIHN0YWNrIG9mIGZpYmVycyBpbiBbc3RhY2tdIGluXG4gIC8vIG9yZGVyIHRvIHJlc3VtZSB0aGUgY29udGludWF0aW9uXG4gIGRvIHtcbiAgICBjYW1sX2ZpYmVyX3N0YWNrID1cbiAgICAgIHtoOnN0YWNrWzNdLCByOntrOmssIHg6Y2FtbF9leG5fc3RhY2ssIGU6Y2FtbF9maWJlcl9zdGFja319O1xuICAgIGsgPSBzdGFja1sxXTtcbiAgICBjYW1sX2V4bl9zdGFjayA9IHN0YWNrWzJdO1xuICAgIHN0YWNrID0gc3RhY2tbNF07XG4gIH0gd2hpbGUgKHN0YWNrKVxuICByZXR1cm4gaztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wb3BfZmliZXJcbi8vUmVxdWlyZXM6IGNhbWxfZXhuX3N0YWNrLCBjYW1sX2ZpYmVyX3N0YWNrXG4vL0lmOiBlZmZlY3RzXG5mdW5jdGlvbiBjYW1sX3BvcF9maWJlcigpIHtcbiAgLy8gTW92ZSB0byB0aGUgcGFyZW50IGZpYmVyLCByZXR1cm5pbmcgdGhlIHBhcmVudCdzIGxvdy1sZXZlbCBjb250aW51YXRpb25cbiAgdmFyIHJlbSA9IGNhbWxfZmliZXJfc3RhY2sucjtcbiAgY2FtbF9leG5fc3RhY2sgPSByZW0ueDtcbiAgY2FtbF9maWJlcl9zdGFjayA9IHJlbS5lO1xuICByZXR1cm4gcmVtLms7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcGVyZm9ybV9lZmZlY3Rcbi8vUmVxdWlyZXM6IGNhbWxfcG9wX2ZpYmVyLCBjYW1sX3N0YWNrX2NoZWNrX2RlcHRoLCBjYW1sX3RyYW1wb2xpbmVfcmV0dXJuLCBjYW1sX2V4bl9zdGFjaywgY2FtbF9maWJlcl9zdGFja1xuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9wZXJmb3JtX2VmZmVjdChlZmYsIGNvbnQsIGswKSB7XG4gIC8vIEFsbG9jYXRlIGEgY29udGludWF0aW9uIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmVcbiAgaWYgKCFjb250KSBjb250ID0gWzI0NSAvKmNvbnRpbnVhdGlvbiovLCAwXTtcbiAgLy8gR2V0IGN1cnJlbnQgZWZmZWN0IGhhbmRsZXJcbiAgdmFyIGhhbmRsZXIgPSBjYW1sX2ZpYmVyX3N0YWNrLmhbM107XG4gIC8vIENvbnMgdGhlIGN1cnJlbnQgZmliZXIgb250byB0aGUgY29udGludWF0aW9uOlxuICAvLyAgIGNvbnQgOj0gQ29ucyAoaywgZXhuX3N0YWNrLCBoYW5kbGVycywgIWNvbnQpXG4gIGNvbnRbMV0gPSBbMCxrMCxjYW1sX2V4bl9zdGFjayxjYW1sX2ZpYmVyX3N0YWNrLmgsY29udFsxXV07XG4gIC8vIE1vdmUgdG8gcGFyZW50IGZpYmVyIGFuZCBleGVjdXRlIHRoZSBlZmZlY3QgaGFuZGxlciB0aGVyZVxuICAvLyBUaGUgaGFuZGxlciBpcyBkZWZpbmVkIGluIFN0ZGxpYi5FZmZlY3QsIHNvIHdlIGtub3cgdGhhdCB0aGUgYXJpdHkgbWF0Y2hlc1xuICB2YXIgazEgPSBjYW1sX3BvcF9maWJlcigpO1xuICByZXR1cm4gY2FtbF9zdGFja19jaGVja19kZXB0aCgpP2hhbmRsZXIoZWZmLGNvbnQsazEsazEpXG4gICAgICAgICA6Y2FtbF90cmFtcG9saW5lX3JldHVybihoYW5kbGVyLFtlZmYsY29udCxrMSxrMV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FsbG9jX3N0YWNrXG4vL1JlcXVpcmVzOiBjYW1sX3BvcF9maWJlciwgY2FtbF9maWJlcl9zdGFjaywgY2FtbF9jYWxsX2dlbiwgY2FtbF9zdGFja19jaGVja19kZXB0aCwgY2FtbF90cmFtcG9saW5lX3JldHVyblxuLy9JZjogZWZmZWN0c1xuZnVuY3Rpb24gY2FtbF9hbGxvY19zdGFjayhodiwgaHgsIGhmKSB7XG4gIGZ1bmN0aW9uIGNhbGwoaSwgeCkge1xuICAgIHZhciBmPWNhbWxfZmliZXJfc3RhY2suaFtpXTtcbiAgICB2YXIgYXJncyA9IFt4LCBjYW1sX3BvcF9maWJlcigpXTtcbiAgICByZXR1cm4gY2FtbF9zdGFja19jaGVja19kZXB0aCgpP2NhbWxfY2FsbF9nZW4oZixhcmdzKVxuICAgICAgICAgICA6Y2FtbF90cmFtcG9saW5lX3JldHVybihmLGFyZ3MpO1xuICB9XG4gIGZ1bmN0aW9uIGh2YWwoeCkge1xuICAgIC8vIENhbGwgW2h2XSBpbiB0aGUgcGFyZW50IGZpYmVyXG4gICAgcmV0dXJuIGNhbGwoMSwgeCk7XG4gIH1cbiAgZnVuY3Rpb24gaGV4bihlKSB7XG4gICAgLy8gQ2FsbCBbaHhdIGluIHRoZSBwYXJlbnQgZmliZXJcbiAgICByZXR1cm4gY2FsbCgyLCBlKTtcbiAgfVxuICByZXR1cm4gWzAsIGh2YWwsIFswLCBoZXhuLCAwXSwgWzAsIGh2LCBoeCwgaGZdLCAwXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hbGxvY19zdGFja1xuLy9JZjogIWVmZmVjdHNcbmZ1bmN0aW9uIGNhbWxfYWxsb2Nfc3RhY2soaHYsIGh4LCBoZikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXG5mdW5jdGlvbiBjYW1sX2NvbnRpbnVhdGlvbl91c2Vfbm9leGMoY29udCkge1xuICB2YXIgc3RhY2s9Y29udFsxXTtcbiAgY29udFsxXT0wO1xuICByZXR1cm4gc3RhY2s7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9hbmRfdXBkYXRlX2hhbmRsZXJfbm9leGNcbi8vUmVxdWlyZXM6IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Y1xuZnVuY3Rpb24gY2FtbF9jb250aW51YXRpb25fdXNlX2FuZF91cGRhdGVfaGFuZGxlcl9ub2V4Yyhjb250LCBodmFsLCBoZXhuLCBoZWZmKSB7XG4gIHZhciBzdGFjayA9IGNhbWxfY29udGludWF0aW9uX3VzZV9ub2V4Yyhjb250KTtcbiAgc3RhY2tbM10gPSBbMCwgaHZhbCwgaGV4biwgaGVmZl07XG4gIHJldHVybiBzdGFjaztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9nZXRfY29udGludWF0aW9uX2NhbGxzdGFja1xuZnVuY3Rpb24gY2FtbF9nZXRfY29udGludWF0aW9uX2NhbGxzdGFjayAoKSB7IHJldHVybiBbMF07IH1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jb25kaXRpb25fbmV3XG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9uZXcodW5pdCl7XG4gICAgcmV0dXJuIHtjb25kaXRpb246MX07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY29uZGl0aW9uX3dhaXRcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX3dhaXQodCxtdXRleHQpe1xuICAgIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NvbmRpdGlvbl9icm9hZGNhc3RcbmZ1bmN0aW9uIGNhbWxfbWxfY29uZGl0aW9uX2Jyb2FkY2FzdCh0KXtcbiAgICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9jb25kaXRpb25fc2lnbmFsXG5mdW5jdGlvbiBjYW1sX21sX2NvbmRpdGlvbl9zaWduYWwodCl7XG4gICAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGpzb29fZWZmZWN0X25vdF9zdXBwb3J0ZWRcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vIUlmOiBlZmZlY3RzXG5mdW5jdGlvbiBqc29vX2VmZmVjdF9ub3Rfc3VwcG9ydGVkKCl7XG4gIGNhbWxfZmFpbHdpdGgoXCJFZmZlY3QgaGFuZGxlcnMgYXJlIG5vdCBzdXBwb3J0ZWRcIik7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBmc19ub2RlX3N1cHBvcnRlZFxuZnVuY3Rpb24gZnNfbm9kZV9zdXBwb3J0ZWQgKCkge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBnbG9iYWxUaGlzLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnXG4gICAgICAmJiB0eXBlb2YgZ2xvYmFsVGhpcy5wcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJ1xuICAgICAgJiYgdHlwZW9mIGdsb2JhbFRoaXMucHJvY2Vzcy52ZXJzaW9ucy5ub2RlICE9PSAndW5kZWZpbmVkJylcbn1cbi8vUHJvdmlkZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0lmOiBicm93c2VyXG5mdW5jdGlvbiBmc19ub2RlX3N1cHBvcnRlZCAoKSB7XG4gIHJldHVybiBmYWxzZVxufVxuXG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9SZXF1aXJlczogTWxOb2RlRmQsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX3JhaXNlX3dpdGhfYXJnc1xuLy9SZXF1aXJlczogbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuZnVuY3Rpb24gTWxOb2RlRGV2aWNlKHJvb3QpIHtcbiAgdGhpcy5mcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIHRoaXMucm9vdCA9IHJvb3Q7XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLm5tID0gZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gKHRoaXMucm9vdCArIG5hbWUpO1xufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5leGlzdHMgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMuZXhpc3RzU3luYyh0aGlzLm5tKG5hbWUpKT8xOjA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmlzRmlsZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5zdGF0U3luYyh0aGlzLm5tKG5hbWUpKS5pc0ZpbGUoKT8xOjA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5ta2RpciA9IGZ1bmN0aW9uKG5hbWUsIG1vZGUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLm1rZGlyU3luYyh0aGlzLm5tKG5hbWUpLHttb2RlOm1vZGV9KTtcbiAgICByZXR1cm4gMFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJtZGlyID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHRoaXMuZnMucm1kaXJTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiAwXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUucmVhZGRpciA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gdGhpcy5mcy5yZWFkZGlyU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5pc19kaXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMuc3RhdFN5bmModGhpcy5ubShuYW1lKSkuaXNEaXJlY3RvcnkoKT8xOjA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdmFyIGIgPSB0aGlzLmZzLmV4aXN0c1N5bmModGhpcy5ubShuYW1lKSk/MTowO1xuICAgIHRoaXMuZnMudW5saW5rU3luYyh0aGlzLm5tKG5hbWUpKTtcbiAgICByZXR1cm4gYjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24obmFtZSwgZiwgcmFpc2VfdW5peCkge1xuICB2YXIgY29uc3RzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7XG4gIHZhciByZXMgPSAwO1xuICBmb3IodmFyIGtleSBpbiBmKXtcbiAgICBzd2l0Y2goa2V5KXtcbiAgICBjYXNlIFwicmRvbmx5XCIgIDogcmVzIHw9IGNvbnN0cy5PX1JET05MWTsgYnJlYWs7XG4gICAgY2FzZSBcIndyb25seVwiICA6IHJlcyB8PSBjb25zdHMuT19XUk9OTFk7IGJyZWFrO1xuICAgIGNhc2UgXCJhcHBlbmRcIiAgOlxuICAgICAgcmVzIHw9IGNvbnN0cy5PX1dST05MWSB8IGNvbnN0cy5PX0FQUEVORDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJjcmVhdGVcIiAgIDogcmVzIHw9IGNvbnN0cy5PX0NSRUFUOyAgICBicmVhaztcbiAgICBjYXNlIFwidHJ1bmNhdGVcIiA6IHJlcyB8PSBjb25zdHMuT19UUlVOQzsgICAgYnJlYWs7XG4gICAgY2FzZSBcImV4Y2xcIiAgICAgOiByZXMgfD0gY29uc3RzLk9fRVhDTDsgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJiaW5hcnlcIiAgIDogcmVzIHw9IGNvbnN0cy5PX0JJTkFSWTsgICBicmVhaztcbiAgICBjYXNlIFwidGV4dFwiICAgICA6IHJlcyB8PSBjb25zdHMuT19URVhUOyAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm5vbmJsb2NrXCIgOiByZXMgfD0gY29uc3RzLk9fTk9OQkxPQ0s7IGJyZWFrO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIHZhciBmZCA9IHRoaXMuZnMub3BlblN5bmModGhpcy5ubShuYW1lKSwgcmVzKTtcbiAgICB2YXIgaXNDaGFyYWN0ZXJEZXZpY2UgPSB0aGlzLmZzLmxzdGF0U3luYyh0aGlzLm5tKG5hbWUpKS5pc0NoYXJhY3RlckRldmljZSgpO1xuICAgIGYuaXNDaGFyYWN0ZXJEZXZpY2UgPSBpc0NoYXJhY3RlckRldmljZTtcbiAgICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkLCBmKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuXG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJlbmFtZSA9IGZ1bmN0aW9uKG8sIG4sIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLnJlbmFtZVN5bmModGhpcy5ubShvKSwgdGhpcy5ubShuKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUuc3RhdCA9IGZ1bmN0aW9uKG5hbWUsIHJhaXNlX3VuaXgpIHtcbiAgdHJ5IHtcbiAgICB2YXIganNfc3RhdHMgPSB0aGlzLmZzLnN0YXRTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiB0aGlzLnN0YXRzX2Zyb21fanMoanNfc3RhdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmxzdGF0ID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHZhciBqc19zdGF0cyA9IHRoaXMuZnMubHN0YXRTeW5jKHRoaXMubm0obmFtZSkpO1xuICAgIHJldHVybiB0aGlzLnN0YXRzX2Zyb21fanMoanNfc3RhdHMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnN5bWxpbmsgPSBmdW5jdGlvbih0b19kaXIsIHRhcmdldCwgcGF0aCwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHRoaXMuZnMuc3ltbGlua1N5bmModGhpcy5ubSh0YXJnZXQpLCB0aGlzLm5tKHBhdGgpLCB0b19kaXIgPyAnZGlyJyA6ICdmaWxlJyk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMucmFpc2Vfbm9kZWpzX2Vycm9yKGVyciwgcmFpc2VfdW5peCk7XG4gIH1cbn1cbk1sTm9kZURldmljZS5wcm90b3R5cGUucmVhZGxpbmsgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHRyeSB7XG4gICAgdmFyIGxpbmsgPSB0aGlzLmZzLnJlYWRsaW5rU3luYyh0aGlzLm5tKG5hbWUpLCAndXRmOCcpO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhsaW5rKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhpcy5yYWlzZV9ub2RlanNfZXJyb3IoZXJyLCByYWlzZV91bml4KTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5vcGVuZGlyID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzLmZzLm9wZW5kaXJTeW5jKHRoaXMubm0obmFtZSkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aGlzLnJhaXNlX25vZGVqc19lcnJvcihlcnIsIHJhaXNlX3VuaXgpO1xuICB9XG59XG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLnJhaXNlX25vZGVqc19lcnJvciA9IGZ1bmN0aW9uKGVyciwgcmFpc2VfdW5peCkge1xuICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoXCJVbml4LlVuaXhfZXJyb3JcIik7XG4gIGlmIChyYWlzZV91bml4ICYmIHVuaXhfZXJyb3IpIHtcbiAgICB2YXIgYXJncyA9IG1ha2VfdW5peF9lcnJfYXJncyhlcnIuY29kZSwgZXJyLnN5c2NhbGwsIGVyci5wYXRoLCBlcnIuZXJybm8pO1xuICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIGFyZ3MpO1xuICB9IGVsc2Uge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRGV2aWNlLnByb3RvdHlwZS5zdGF0c19mcm9tX2pzID0gZnVuY3Rpb24oanNfc3RhdHMpIHtcbiAgLyogPT09VW5peC5maWxlX2tpbmQ9PT1cbiAgICogdHlwZSBmaWxlX2tpbmQgPVxuICAgKiAgICAgU19SRUcgICAgICAgICAgICAgICAgICAgICAgICgqKiBSZWd1bGFyIGZpbGUgKilcbiAgICogICB8IFNfRElSICAgICAgICAgICAgICAgICAgICAgICAoKiogRGlyZWN0b3J5ICopXG4gICAqICAgfCBTX0NIUiAgICAgICAgICAgICAgICAgICAgICAgKCoqIENoYXJhY3RlciBkZXZpY2UgKilcbiAgICogICB8IFNfQkxLICAgICAgICAgICAgICAgICAgICAgICAoKiogQmxvY2sgZGV2aWNlICopXG4gICAqICAgfCBTX0xOSyAgICAgICAgICAgICAgICAgICAgICAgKCoqIFN5bWJvbGljIGxpbmsgKilcbiAgICogICB8IFNfRklGTyAgICAgICAgICAgICAgICAgICAgICAoKiogTmFtZWQgcGlwZSAqKVxuICAgKiAgIHwgU19TT0NLICAgICAgICAgICAgICAgICAgICAgICgqKiBTb2NrZXQgKilcbiAgICovXG4gIHZhciBmaWxlX2tpbmQ7XG4gIGlmIChqc19zdGF0cy5pc0ZpbGUoKSkge1xuICAgIGZpbGVfa2luZCA9IDA7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgIGZpbGVfa2luZCA9IDE7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNDaGFyYWN0ZXJEZXZpY2UoKSkge1xuICAgIGZpbGVfa2luZCA9IDI7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNCbG9ja0RldmljZSgpKSB7XG4gICAgZmlsZV9raW5kID0gMztcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgZmlsZV9raW5kID0gNDtcbiAgfSBlbHNlIGlmIChqc19zdGF0cy5pc0ZJRk8oKSkge1xuICAgIGZpbGVfa2luZCA9IDU7XG4gIH0gZWxzZSBpZiAoanNfc3RhdHMuaXNTb2NrZXQoKSkge1xuICAgIGZpbGVfa2luZCA9IDY7XG4gIH1cbiAgLyogPT09VW5peC5zdGF0cz09PVxuICAgKiB0eXBlIHN0YXRzID1cbiAgICogIHsgc3RfZGV2IDogaW50OyAgICAgICAgICAgICAgICgqKiBEZXZpY2UgbnVtYmVyICopXG4gICAqICAgIHN0X2lubyA6IGludDsgICAgICAgICAgICAgICAoKiogSW5vZGUgbnVtYmVyICopXG4gICAqICAgIHN0X2tpbmQgOiBmaWxlX2tpbmQ7ICAgICAgICAoKiogS2luZCBvZiB0aGUgZmlsZSAqKVxuICAgKiAgICBzdF9wZXJtIDogZmlsZV9wZXJtOyAgICAgICAgKCoqIEFjY2VzcyByaWdodHMgKilcbiAgICogICAgc3RfbmxpbmsgOiBpbnQ7ICAgICAgICAgICAgICgqKiBOdW1iZXIgb2YgbGlua3MgKilcbiAgICogICAgc3RfdWlkIDogaW50OyAgICAgICAgICAgICAgICgqKiBVc2VyIGlkIG9mIHRoZSBvd25lciAqKVxuICAgKiAgICBzdF9naWQgOiBpbnQ7ICAgICAgICAgICAgICAgKCoqIEdyb3VwIElEIG9mIHRoZSBmaWxlJ3MgZ3JvdXAgKilcbiAgICogICAgc3RfcmRldiA6IGludDsgICAgICAgICAgICAgICgqKiBEZXZpY2UgSUQgKGlmIHNwZWNpYWwgZmlsZSkgKilcbiAgICogICAgc3Rfc2l6ZSA6IGludDsgICAgICAgICAgICAgICgqKiBTaXplIGluIGJ5dGVzICopXG4gICAqICAgIHN0X2F0aW1lIDogZmxvYXQ7ICAgICAgICAgICAoKiogTGFzdCBhY2Nlc3MgdGltZSAqKVxuICAgKiAgICBzdF9tdGltZSA6IGZsb2F0OyAgICAgICAgICAgKCoqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUgKilcbiAgICogICAgc3RfY3RpbWUgOiBmbG9hdDsgICAgICAgICAgICgqKiBMYXN0IHN0YXR1cyBjaGFuZ2UgdGltZSAqKVxuICAgKiAgfVxuICAgKi9cbiAgcmV0dXJuIEJMT0NLKFxuICAgIDAsXG4gICAganNfc3RhdHMuZGV2LFxuICAgIGpzX3N0YXRzLmlubyxcbiAgICBmaWxlX2tpbmQsXG4gICAganNfc3RhdHMubW9kZSxcbiAgICBqc19zdGF0cy5ubGluayxcbiAgICBqc19zdGF0cy51aWQsXG4gICAganNfc3RhdHMuZ2lkLFxuICAgIGpzX3N0YXRzLnJkZXYsXG4gICAganNfc3RhdHMuc2l6ZSxcbiAgICBqc19zdGF0cy5hdGltZU1zLFxuICAgIGpzX3N0YXRzLm10aW1lTXMsXG4gICAganNfc3RhdHMuY3RpbWVNc1xuICApO1xufVxuXG5NbE5vZGVEZXZpY2UucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWxOb2RlRGV2aWNlXG5cbi8vUHJvdmlkZXM6IE1sTm9kZURldmljZVxuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gTWxOb2RlRGV2aWNlKCkge1xufVxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVGZFxuLy9SZXF1aXJlczogTWxGaWxlLCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZywgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcywgY2FtbF9ieXRlc19zZXQsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBNbE5vZGVGZChmZCwgZmxhZ3Mpe1xuICB0aGlzLmZzID0gcmVxdWlyZSgnZnMnKTtcbiAgdGhpcy5mZCA9IGZkO1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG59XG5NbE5vZGVGZC5wcm90b3R5cGUgPSBuZXcgTWxGaWxlICgpO1xuTWxOb2RlRmQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWxOb2RlRmQ7XG5cbk1sTm9kZUZkLnByb3RvdHlwZS50cnVuY2F0ZSA9IGZ1bmN0aW9uKGxlbil7XG4gIHRyeSB7XG4gICAgdGhpcy5mcy5mdHJ1bmNhdGVTeW5jKHRoaXMuZmQsbGVufDApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cbk1sTm9kZUZkLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXMuZnMuZnN0YXRTeW5jKHRoaXMuZmQpLnNpemU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRmQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob2Zmc2V0LGJ1ZixidWZfb2Zmc2V0LGxlbil7XG4gIHRyeSB7XG4gICAgaWYodGhpcy5mbGFncy5pc0NoYXJhY3RlckRldmljZSlcbiAgICAgIHRoaXMuZnMud3JpdGVTeW5jKHRoaXMuZmQsIGJ1ZiwgYnVmX29mZnNldCwgbGVuKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLmZzLndyaXRlU3luYyh0aGlzLmZkLCBidWYsIGJ1Zl9vZmZzZXQsIGxlbiwgb2Zmc2V0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoZXJyLnRvU3RyaW5nKCkpO1xuICB9XG4gIHJldHVybiAwO1xufVxuTWxOb2RlRmQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihvZmZzZXQsYSxidWZfb2Zmc2V0LGxlbil7XG4gIHRyeSB7XG4gICAgaWYodGhpcy5mbGFncy5pc0NoYXJhY3RlckRldmljZSlcbiAgICAgIHZhciByZWFkID0gdGhpcy5mcy5yZWFkU3luYyh0aGlzLmZkLCBhLCBidWZfb2Zmc2V0LCBsZW4pO1xuICAgIGVsc2VcbiAgICAgIHZhciByZWFkID0gdGhpcy5mcy5yZWFkU3luYyh0aGlzLmZkLCBhLCBidWZfb2Zmc2V0LCBsZW4sIG9mZnNldCk7XG4gICAgcmV0dXJuIHJlYWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKGVyci50b1N0cmluZygpKTtcbiAgfVxufVxuTWxOb2RlRmQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICB0aGlzLmZzLmNsb3NlU3luYyh0aGlzLmZkKTtcbiAgICByZXR1cm4gMFxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihlcnIudG9TdHJpbmcoKSk7XG4gIH1cbn1cblxuXG4vL1Byb3ZpZGVzOiBNbE5vZGVGZFxuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gTWxOb2RlRmQoKXtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG4vL1JlcXVpcmVzOiBNbE5vZGVGZFxuZnVuY3Rpb24gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3Mpe1xuICBpZihmbGFncy5uYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbiAgICAgIHZhciBmZDIgPSBmcy5vcGVuU3luYyhmbGFncy5uYW1lLCBcInJzXCIpO1xuICAgICAgcmV0dXJuIG5ldyBNbE5vZGVGZChmZDIsIGZsYWdzKTtcbiAgICB9IGNhdGNoKGUpIHsgIH1cbiAgfVxuICByZXR1cm4gbmV3IE1sTm9kZUZkKGZkLCBmbGFncyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5fZm9yX25vZGVcbi8vSWY6IGJyb3dzZXJcbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW5fZm9yX25vZGUoZmQsIGZsYWdzKXtcbiAgcmV0dXJuIG51bGw7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSsOpcsO0bWUgVm91aWxsb24sIEh1Z28gSGV1emFyZFxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIER1bW15IGZpbGVzeXN0ZW1cblxuLy9Qcm92aWRlczogY2FtbF90cmFpbGluZ19zbGFzaFxuZnVuY3Rpb24gY2FtbF90cmFpbGluZ19zbGFzaChuYW1lKXtcbiAgcmV0dXJuIChuYW1lLnNsaWNlKC0xKSAhPT0gXCIvXCIpID8gKG5hbWUgKyBcIi9cIikgOiBuYW1lO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2N1cnJlbnRfZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3RyYWlsaW5nX3NsYXNoLCBmc19ub2RlX3N1cHBvcnRlZFxuaWYoZnNfbm9kZV9zdXBwb3J0ZWQgKCkgJiYgZ2xvYmFsVGhpcy5wcm9jZXNzICYmIGdsb2JhbFRoaXMucHJvY2Vzcy5jd2QpXG4gIHZhciBjYW1sX2N1cnJlbnRfZGlyID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmN3ZCgpLnJlcGxhY2UoL1xcXFwvZywnLycpO1xuZWxzZVxuICB2YXIgY2FtbF9jdXJyZW50X2RpciA9ICBcIi9zdGF0aWNcIjtcbmNhbWxfY3VycmVudF9kaXIgPSBjYW1sX3RyYWlsaW5nX3NsYXNoKGNhbWxfY3VycmVudF9kaXIpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9yb290XG4vL1JlcXVpcmVzOiBwYXRoX2lzX2Fic29sdXRlXG5mdW5jdGlvbiBjYW1sX2dldF9yb290KHBhdGgpe1xuICB2YXIgeCA9IHBhdGhfaXNfYWJzb2x1dGUocGF0aCk7XG4gIGlmICgheCkgcmV0dXJuO1xuICByZXR1cm4geFswXSArIFwiL1wifVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3Jvb3Rcbi8vUmVxdWlyZXM6IGNhbWxfZ2V0X3Jvb3QsIGNhbWxfY3VycmVudF9kaXIsIGNhbWxfZmFpbHdpdGhcbnZhciBjYW1sX3Jvb3QgPSBjYW1sX2dldF9yb290KGNhbWxfY3VycmVudF9kaXIpIHx8IGNhbWxfZmFpbHdpdGgoXCJ1bmFibGUgdG8gY29tcHV0ZSBjYW1sX3Jvb3RcIik7XG5cblxuLy9Qcm92aWRlczogTWxGaWxlXG5mdW5jdGlvbiBNbEZpbGUoKXsgIH1cblxuLy9Qcm92aWRlczogcGF0aF9pc19hYnNvbHV0ZVxuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIG1ha2VfcGF0aF9pc19hYnNvbHV0ZSgpIHtcbiAgZnVuY3Rpb24gcG9zaXgocGF0aCkge1xuICAgIGlmIChwYXRoLmNoYXJBdCgwKSA9PT0gJy8nKSByZXR1cm4gW1wiXCIsIHBhdGguc3Vic3RyaW5nKDEpXTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiB3aW4zMihwYXRoKSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvYjNmY2MyNDVmYjI1NTM5OTA5ZWYxZDVlYWEwMWRiZjkyZTE2ODYzMy9saWIvcGF0aC5qcyNMNTZcbiAgICB2YXIgc3BsaXREZXZpY2VSZSA9IC9eKFthLXpBLVpdOnxbXFxcXC9dezJ9W15cXFxcL10rW1xcXFwvXStbXlxcXFwvXSspPyhbXFxcXC9dKT8oW1xcc1xcU10qPykkLztcbiAgICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKHBhdGgpO1xuICAgIHZhciBkZXZpY2UgPSByZXN1bHRbMV0gfHwgJyc7XG4gICAgdmFyIGlzVW5jID0gQm9vbGVhbihkZXZpY2UgJiYgZGV2aWNlLmNoYXJBdCgxKSAhPT0gJzonKTtcblxuICAgIC8vIFVOQyBwYXRocyBhcmUgYWx3YXlzIGFic29sdXRlXG4gICAgaWYgKEJvb2xlYW4ocmVzdWx0WzJdIHx8IGlzVW5jKSkge1xuICAgICAgdmFyIHJvb3QgPSAocmVzdWx0WzFdIHx8ICcnKTtcbiAgICAgIHZhciBzZXAgPSAocmVzdWx0WzJdIHx8ICcnKTtcbiAgICAgIHJldHVybiBbcm9vdCwgcGF0aC5zdWJzdHJpbmcocm9vdC5sZW5ndGggKyBzZXAubGVuZ3RoKV1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmKGZzX25vZGVfc3VwcG9ydGVkICgpICYmIGdsb2JhbFRoaXMucHJvY2VzcyAmJiBnbG9iYWxUaGlzLnByb2Nlc3MucGxhdGZvcm0pIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIgOiBwb3NpeDtcbiAgfVxuICBlbHNlIHJldHVybiBwb3NpeFxufVxudmFyIHBhdGhfaXNfYWJzb2x1dGUgPSBtYWtlX3BhdGhfaXNfYWJzb2x1dGUoKTtcblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX3BhdGhcbi8vUmVxdWlyZXM6IGNhbWxfY3VycmVudF9kaXJcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nLCBwYXRoX2lzX2Fic29sdXRlXG5mdW5jdGlvbiBjYW1sX21ha2VfcGF0aCAobmFtZSkge1xuICBuYW1lPWNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpO1xuICBpZiggIXBhdGhfaXNfYWJzb2x1dGUobmFtZSkgKVxuICAgIG5hbWUgPSBjYW1sX2N1cnJlbnRfZGlyICsgbmFtZTtcbiAgdmFyIGNvbXAwID0gcGF0aF9pc19hYnNvbHV0ZShuYW1lKTtcbiAgdmFyIGNvbXAgPSBjb21wMFsxXS5zcGxpdChcIi9cIik7XG4gIHZhciBuY29tcCA9IFtdXG4gIGZvcih2YXIgaSA9IDA7IGk8Y29tcC5sZW5ndGg7IGkrKyl7XG4gICAgc3dpdGNoKGNvbXBbaV0pe1xuICAgIGNhc2UgXCIuLlwiOiBpZihuY29tcC5sZW5ndGg+MSkgbmNvbXAucG9wKCk7IGJyZWFrO1xuICAgIGNhc2UgXCIuXCI6IGJyZWFrO1xuICAgIGNhc2UgXCJcIjogYnJlYWs7XG4gICAgZGVmYXVsdDogbmNvbXAucHVzaChjb21wW2ldKTticmVha1xuICAgIH1cbiAgfVxuICBuY29tcC51bnNoaWZ0KGNvbXAwWzBdKTtcbiAgbmNvbXAub3JpZyA9IG5hbWU7XG4gIHJldHVybiBuY29tcDtcbn1cblxuLy9Qcm92aWRlczpqc29vX21vdW50X3BvaW50XG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIE1sTm9kZURldmljZSwgY2FtbF9yb290LCBmc19ub2RlX3N1cHBvcnRlZFxudmFyIGpzb29fbW91bnRfcG9pbnQgPSBbXVxuaWYgKGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOmNhbWxfcm9vdCxkZXZpY2U6bmV3IE1sTm9kZURldmljZShjYW1sX3Jvb3QpfSk7XG59IGVsc2Uge1xuICBqc29vX21vdW50X3BvaW50LnB1c2goe3BhdGg6Y2FtbF9yb290LGRldmljZTpuZXcgTWxGYWtlRGV2aWNlKGNhbWxfcm9vdCl9KTtcbn1cbmpzb29fbW91bnRfcG9pbnQucHVzaCh7cGF0aDpcIi9zdGF0aWMvXCIsIGRldmljZTpuZXcgTWxGYWtlRGV2aWNlKFwiL3N0YXRpYy9cIil9KTtcblxuLy9Qcm92aWRlczpjYW1sX2xpc3RfbW91bnRfcG9pbnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbGlzdF9tb3VudF9wb2ludCgpe1xuICB2YXIgcHJldiA9IDBcbiAgZm9yKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspe1xuICAgIHZhciBvbGQgPSBwcmV2O1xuICAgIHByZXYgPSBbMCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhqc29vX21vdW50X3BvaW50W2ldLnBhdGgpLCBvbGRdXG4gIH1cbiAgcmV0dXJuIHByZXY7XG59XG5cbi8vUHJvdmlkZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX21ha2VfcGF0aCwganNvb19tb3VudF9wb2ludCwgY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfZ2V0X3Jvb3QsIE1sTm9kZURldmljZSwgY2FtbF90cmFpbGluZ19zbGFzaCwgZnNfbm9kZV9zdXBwb3J0ZWRcbmZ1bmN0aW9uIHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpe1xuICB2YXIgcGF0aCA9IGNhbWxfbWFrZV9wYXRoKG5hbWUpO1xuICB2YXIgbmFtZSA9IHBhdGguam9pbihcIi9cIik7XG4gIHZhciBuYW1lX3NsYXNoID0gY2FtbF90cmFpbGluZ19zbGFzaChuYW1lKTtcbiAgdmFyIHJlcztcbiAgZm9yKHZhciBpID0gMDsgaSA8IGpzb29fbW91bnRfcG9pbnQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbSA9IGpzb29fbW91bnRfcG9pbnRbaV07XG4gICAgaWYobmFtZV9zbGFzaC5zZWFyY2gobS5wYXRoKSA9PSAwXG4gICAgICAgJiYgKCFyZXMgfHwgcmVzLnBhdGgubGVuZ3RoIDwgbS5wYXRoLmxlbmd0aCkpXG4gICAgICByZXMgPSB7cGF0aDptLnBhdGgsZGV2aWNlOm0uZGV2aWNlLHJlc3Q6bmFtZS5zdWJzdHJpbmcobS5wYXRoLmxlbmd0aCxuYW1lLmxlbmd0aCl9O1xuICB9XG4gIGlmKCAhcmVzICYmIGZzX25vZGVfc3VwcG9ydGVkKCkpIHtcbiAgICB2YXIgcm9vdCA9IGNhbWxfZ2V0X3Jvb3QobmFtZSk7XG4gICAgaWYgKHJvb3QgJiYgcm9vdC5tYXRjaCgvXlthLXpBLVpdOlxcLyQvKSl7XG4gICAgICB2YXIgbSA9IHtwYXRoOnJvb3QsZGV2aWNlOm5ldyBNbE5vZGVEZXZpY2Uocm9vdCl9O1xuICAgICAganNvb19tb3VudF9wb2ludC5wdXNoKG0pO1xuICAgICAgcmVzID0ge3BhdGg6bS5wYXRoLGRldmljZTptLmRldmljZSxyZXN0Om5hbWUuc3Vic3RyaW5nKG0ucGF0aC5sZW5ndGgsbmFtZS5sZW5ndGgpfTtcbiAgICB9XG4gIH1cbiAgaWYoIHJlcyApIHJldHVybiByZXM7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwibm8gZGV2aWNlIGZvdW5kIGZvciBcIiArIG5hbWVfc2xhc2gpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21vdW50X2F1dG9sb2FkXG4vL1JlcXVpcmVzOiBNbEZha2VEZXZpY2UsIGNhbWxfbWFrZV9wYXRoLCBqc29vX21vdW50X3BvaW50LCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX21vdW50X2F1dG9sb2FkKG5hbWUsZil7XG4gIHZhciBwYXRoID0gY2FtbF9tYWtlX3BhdGgobmFtZSk7XG4gIHZhciBuYW1lID0gY2FtbF90cmFpbGluZ19zbGFzaChwYXRoLmpvaW4oXCIvXCIpKTtcbiAganNvb19tb3VudF9wb2ludC5wdXNoKHtwYXRoOm5hbWUsZGV2aWNlOm5ldyBNbEZha2VEZXZpY2UobmFtZSxmKX0pXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VubW91bnRcbi8vUmVxdWlyZXM6IGpzb29fbW91bnRfcG9pbnQsIGNhbWxfbWFrZV9wYXRoLCBjYW1sX3RyYWlsaW5nX3NsYXNoXG5mdW5jdGlvbiBjYW1sX3VubW91bnQobmFtZSl7XG4gIHZhciBwYXRoID0gY2FtbF9tYWtlX3BhdGgobmFtZSk7XG4gIHZhciBuYW1lID0gY2FtbF90cmFpbGluZ19zbGFzaChwYXRoLmpvaW4oXCIvXCIpKTtcbiAgdmFyIGlkeCA9IC0xO1xuICBmb3IodmFyIGkgPSAwOyBpIDwganNvb19tb3VudF9wb2ludC5sZW5ndGg7IGkrKylcbiAgICBpZihqc29vX21vdW50X3BvaW50W2ldLnBhdGggPT0gbmFtZSkgaWR4ID0gaTtcbiAgaWYoaWR4ID4gLTEpIGpzb29fbW91bnRfcG9pbnQuc3BsaWNlKGlkeCwxKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZ2V0Y3dkXG4vL1JlcXVpcmVzOiBjYW1sX2N1cnJlbnRfZGlyLCBjYW1sX3N0cmluZ19vZl9qc2J5dGVzXG5mdW5jdGlvbiBjYW1sX3N5c19nZXRjd2QoKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGNhbWxfY3VycmVudF9kaXIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jaGRpclxuLy9SZXF1aXJlczogY2FtbF9jdXJyZW50X2RpciwgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUsIHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3RyYWlsaW5nX3NsYXNoLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3N5c19jaGRpcihkaXIpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShkaXIpO1xuICBpZihyb290LmRldmljZS5leGlzdHMocm9vdC5yZXN0KSkge1xuICAgIGlmKHJvb3QucmVzdCkgY2FtbF9jdXJyZW50X2RpciA9IGNhbWxfdHJhaWxpbmdfc2xhc2gocm9vdC5wYXRoICsgcm9vdC5yZXN0KTtcbiAgICBlbHNlIGNhbWxfY3VycmVudF9kaXIgPSByb290LnBhdGg7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhkaXIpKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKG5hbWUpe1xuICBjYW1sX3JhaXNlX3N5c19lcnJvciAobmFtZSArIFwiOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JhaXNlX25vdF9hX2RpclxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfcmFpc2Vfbm90X2FfZGlyKG5hbWUpe1xuICBjYW1sX3JhaXNlX3N5c19lcnJvciAobmFtZSArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX2ZpbGVfZXhpc3RzXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfZmlsZV9leGlzdHMgKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcmV0dXJuIHJvb3QuZGV2aWNlLmV4aXN0cyhyb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfYV9kaXIsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX3N5c19yZWFkX2RpcmVjdG9yeShuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIGEgPSByb290LmRldmljZS5yZWFkZGlyKHJvb3QucmVzdCk7XG4gIHZhciBsID0gbmV3IEFycmF5KGEubGVuZ3RoICsgMSk7XG4gIGxbMF0gPSAwO1xuICBmb3IodmFyIGk9MDtpPGEubGVuZ3RoO2krKylcbiAgICBsW2krMV0gPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKGFbaV0pO1xuICByZXR1cm4gbDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcmVtb3ZlXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSwgcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfc3lzX3JlbW92ZShuYW1lKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgdmFyIG9rID0gcm9vdC5kZXZpY2UudW5saW5rKHJvb3QucmVzdCk7XG4gIGlmKG9rID09IDApIGNhbWxfcmFpc2Vfbm9fc3VjaF9maWxlKGNhbWxfanNieXRlc19vZl9zdHJpbmcobmFtZSkpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfaXNfZGlyZWN0b3J5XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZVxuZnVuY3Rpb24gY2FtbF9zeXNfaXNfZGlyZWN0b3J5KG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICB2YXIgYSA9IHJvb3QuZGV2aWNlLmlzX2Rpcihyb290LnJlc3QpO1xuICByZXR1cm4gYT8xOjA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX3JlbmFtZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgcmVzb2x2ZV9mc19kZXZpY2VcbmZ1bmN0aW9uIGNhbWxfc3lzX3JlbmFtZShvLG4pe1xuICB2YXIgb19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uobyk7XG4gIHZhciBuX3Jvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuKTtcbiAgaWYob19yb290LmRldmljZSAhPSBuX3Jvb3QuZGV2aWNlKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N5c19yZW5hbWU6IGNhbm5vdCBtb3ZlIGZpbGUgYmV0d2VlbiB0d28gZmlsZXN5c3RlbVwiKTtcbiAgaWYoIW9fcm9vdC5kZXZpY2UucmVuYW1lKVxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3N5c19yZW5hbWU6IG5vIGltcGxlbWVudGVkXCIpO1xuICBvX3Jvb3QuZGV2aWNlLnJlbmFtZShvX3Jvb3QucmVzdCwgbl9yb290LnJlc3QpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19ta2RpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBjYW1sX3N5c19ta2RpcihuYW1lLCBwZXJtKXtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgcm9vdC5kZXZpY2UubWtkaXIocm9vdC5yZXN0LHBlcm0pO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfcm1kaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9yYWlzZV9ub3RfYV9kaXJcbmZ1bmN0aW9uIGNhbWxfc3lzX3JtZGlyKG5hbWUpe1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICByb290LmRldmljZS5ybWRpcihyb290LnJlc3QpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9tYXBfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9iYV9tYXBfZmlsZSh2ZmQsIGtpbmQsIGxheW91dCwgc2hhcmVkLCBkaW1zLCBwb3MpIHtcbiAgLy8gdmFyIGRhdGEgPSBjYW1sX3N5c19mZHNbdmZkXTtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfYmFfbWFwX2ZpbGUgbm90IGltcGxlbWVudGVkXCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX21hcF9maWxlX2J5dGVjb2RlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX21hcF9maWxlXG5mdW5jdGlvbiBjYW1sX2JhX21hcF9maWxlX2J5dGVjb2RlKGFyZ3YsYXJnbil7XG4gIHJldHVybiBjYW1sX2JhX21hcF9maWxlKGFyZ3ZbMF0sYXJndlsxXSxhcmd2WzJdLGFyZ3ZbM10sYXJndls0XSxhcmd2WzVdKTtcbn1cblxuLy9Qcm92aWRlczoganNvb19jcmVhdGVfZmlsZV9leHRlcm5cbmZ1bmN0aW9uIGpzb29fY3JlYXRlX2ZpbGVfZXh0ZXJuKG5hbWUsY29udGVudCl7XG4gIGlmKGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZSlcbiAgICBnbG9iYWxUaGlzLmpzb29fY3JlYXRlX2ZpbGUobmFtZSxjb250ZW50KTtcbiAgZWxzZSB7XG4gICAgaWYoIWdsb2JhbFRoaXMuY2FtbF9mc190bXApIGdsb2JhbFRoaXMuY2FtbF9mc190bXAgPSBbXTtcbiAgICBnbG9iYWxUaGlzLmNhbWxfZnNfdG1wLnB1c2goe25hbWU6bmFtZSxjb250ZW50OmNvbnRlbnR9KTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mc19pbml0XG4vL1JlcXVpcmVzOiBqc29vX2NyZWF0ZV9maWxlXG5mdW5jdGlvbiBjYW1sX2ZzX2luaXQgKCl7XG4gIHZhciB0bXA9Z2xvYmFsVGhpcy5jYW1sX2ZzX3RtcFxuICBpZih0bXApe1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyBpKyspe1xuICAgICAganNvb19jcmVhdGVfZmlsZSh0bXBbaV0ubmFtZSx0bXBbaV0uY29udGVudCk7XG4gICAgfVxuICB9XG4gIGdsb2JhbFRoaXMuanNvb19jcmVhdGVfZmlsZSA9IGpzb29fY3JlYXRlX2ZpbGU7XG4gIGdsb2JhbFRoaXMuY2FtbF9mc190bXAgPSBbXTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY3JlYXRlX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGgsIHJlc29sdmVfZnNfZGV2aWNlXG5mdW5jdGlvbiBjYW1sX2NyZWF0ZV9maWxlKG5hbWUsY29udGVudCkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZighIHJvb3QuZGV2aWNlLnJlZ2lzdGVyKSBjYW1sX2ZhaWx3aXRoKFwiY2Fubm90IHJlZ2lzdGVyIGZpbGVcIik7XG4gIHJvb3QuZGV2aWNlLnJlZ2lzdGVyKHJvb3QucmVzdCxjb250ZW50KTtcbiAgcmV0dXJuIDA7XG59XG5cblxuLy9Qcm92aWRlczoganNvb19jcmVhdGVfZmlsZVxuLy9SZXF1aXJlczogY2FtbF9jcmVhdGVfZmlsZSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24ganNvb19jcmVhdGVfZmlsZShuYW1lLGNvbnRlbnQpIHtcbiAgdmFyIG5hbWUgPSBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKG5hbWUpO1xuICB2YXIgY29udGVudCA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoY29udGVudCk7XG4gIHJldHVybiBjYW1sX2NyZWF0ZV9maWxlKG5hbWUsIGNvbnRlbnQpO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVhZF9maWxlX2NvbnRlbnRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSwgY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfcmVhZF9maWxlX2NvbnRlbnQgKG5hbWUpIHtcbiAgdmFyIG5hbWUgPSAodHlwZW9mIG5hbWUgPT0gXCJzdHJpbmdcIik/Y2FtbF9zdHJpbmdfb2ZfanNieXRlcyhuYW1lKTpuYW1lO1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZihyb290LmRldmljZS5leGlzdHMocm9vdC5yZXN0KSkge1xuICAgIHZhciBmaWxlID0gcm9vdC5kZXZpY2Uub3Blbihyb290LnJlc3Qse3Jkb25seToxfSk7XG4gICAgdmFyIGxlbiAgPSBmaWxlLmxlbmd0aCgpO1xuICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIGZpbGUucmVhZCgwLGJ1ZiwwLGxlbik7XG4gICAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2FycmF5KGJ1ZilcbiAgfVxuICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZShjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5hbWUpKTtcbn1cbiIsIi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXR0aW1lb2ZkYXlcbi8vQWxpYXM6IHVuaXhfZ2V0dGltZW9mZGF5XG5mdW5jdGlvbiBjYW1sX3VuaXhfZ2V0dGltZW9mZGF5ICgpIHtcbiAgcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLyAxMDAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdGltZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2dldHRpbWVvZmRheVxuLy9BbGlhczogdW5peF90aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfdGltZSAoKSB7XG4gIHJldHVybiBNYXRoLmZsb29yKGNhbWxfdW5peF9nZXR0aW1lb2ZkYXkgKCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZ210aW1lXG4vL0FsaWFzOiB1bml4X2dtdGltZVxuZnVuY3Rpb24gY2FtbF91bml4X2dtdGltZSAodCkge1xuICB2YXIgZCA9IG5ldyBEYXRlICh0ICogMTAwMCk7XG4gIHZhciBkX251bSA9IGQuZ2V0VGltZSgpO1xuICB2YXIgamFudWFyeWZpcnN0ID0gKG5ldyBEYXRlKERhdGUuVVRDKGQuZ2V0VVRDRnVsbFllYXIoKSwgMCwgMSkpKS5nZXRUaW1lKCk7XG4gIHZhciBkb3kgPSBNYXRoLmZsb29yKChkX251bSAtIGphbnVhcnlmaXJzdCkgLyA4NjQwMDAwMCk7XG4gIHJldHVybiBCTE9DSygwLCBkLmdldFVUQ1NlY29uZHMoKSwgZC5nZXRVVENNaW51dGVzKCksIGQuZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgICAgICAgIGQuZ2V0VVRDRGF0ZSgpLCBkLmdldFVUQ01vbnRoKCksIGQuZ2V0VVRDRnVsbFllYXIoKSAtIDE5MDAsXG4gICAgICAgICAgICAgICBkLmdldFVUQ0RheSgpLCBkb3ksXG4gICAgICAgICAgICAgICBmYWxzZSB8IDAgLyogZm9yIFVUQyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaXMgZmFsc2UgKi8pXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9sb2NhbHRpbWVcbi8vQWxpYXM6IHVuaXhfbG9jYWx0aW1lXG5mdW5jdGlvbiBjYW1sX3VuaXhfbG9jYWx0aW1lICh0KSB7XG4gIHZhciBkID0gbmV3IERhdGUgKHQgKiAxMDAwKTtcbiAgdmFyIGRfbnVtID0gZC5nZXRUaW1lKCk7XG4gIHZhciBqYW51YXJ5Zmlyc3QgPSAobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKSkuZ2V0VGltZSgpO1xuICB2YXIgZG95ID0gTWF0aC5mbG9vcigoZF9udW0gLSBqYW51YXJ5Zmlyc3QpIC8gODY0MDAwMDApO1xuICB2YXIgamFuID0gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgdmFyIGp1bCA9IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgNiwgMSk7XG4gIHZhciBzdGRUaW1lem9uZU9mZnNldCA9IE1hdGgubWF4KGphbi5nZXRUaW1lem9uZU9mZnNldCgpLCBqdWwuZ2V0VGltZXpvbmVPZmZzZXQoKSk7XG4gIHJldHVybiBCTE9DSygwLCBkLmdldFNlY29uZHMoKSwgZC5nZXRNaW51dGVzKCksIGQuZ2V0SG91cnMoKSxcbiAgICAgICAgICAgICAgIGQuZ2V0RGF0ZSgpLCBkLmdldE1vbnRoKCksIGQuZ2V0RnVsbFllYXIoKSAtIDE5MDAsXG4gICAgICAgICAgICAgICBkLmdldERheSgpLCBkb3ksXG4gICAgICAgICAgICAgICAoZC5nZXRUaW1lem9uZU9mZnNldCgpIDwgc3RkVGltZXpvbmVPZmZzZXQpIHwgMCAvKiBkYXlsaWdodCBzYXZpbmdzIHRpbWUgIGZpZWxkLiAqLylcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X21rdGltZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2xvY2FsdGltZVxuLy9BbGlhczogdW5peF9ta3RpbWVcbmZ1bmN0aW9uIGNhbWxfdW5peF9ta3RpbWUodG0pe1xuICB2YXIgZCA9IChuZXcgRGF0ZSh0bVs2XSsxOTAwLHRtWzVdLHRtWzRdLHRtWzNdLHRtWzJdLHRtWzFdKSkuZ2V0VGltZSgpO1xuICB2YXIgdCA9IE1hdGguZmxvb3IoZCAvIDEwMDApO1xuICB2YXIgdG0yID0gY2FtbF91bml4X2xvY2FsdGltZSh0KTtcbiAgcmV0dXJuIEJMT0NLKDAsdCx0bTIpO1xufVxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXJ0dXAgY29uc3Rcbi8vQWxpYXM6IHdpbl9zdGFydHVwXG5mdW5jdGlvbiBjYW1sX3VuaXhfc3RhcnR1cCgpIHt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9jbGVhbnVwIGNvbnN0XG4vL0FsaWFzOiB3aW5fY2xlYW51cFxuZnVuY3Rpb24gY2FtbF91bml4X2NsZWFudXAoKSB7fVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkIGNvbnN0XG4vL0FsaWFzOiB3aW5faGFuZGxlX2ZkXG5mdW5jdGlvbiBjYW1sX3VuaXhfZmlsZWRlc2NyX29mX2ZkKHgpIHtyZXR1cm4geDt9XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9pc2F0dHlcbi8vUmVxdWlyZXM6IGZzX25vZGVfc3VwcG9ydGVkXG4vL0FsaWFzOiB1bml4X2lzYXR0eVxuZnVuY3Rpb24gY2FtbF91bml4X2lzYXR0eShmaWxlRGVzY3JpcHRvcikge1xuICBpZihmc19ub2RlX3N1cHBvcnRlZCgpKSB7XG4gICAgdmFyIHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuICAgIHJldHVybiB0dHkuaXNhdHR5KGZpbGVEZXNjcmlwdG9yKT8xOjA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaXNhdHR5XG4vL0FsaWFzOiB1bml4X2lzYXR0eVxuLy9JZjogYnJvd3NlclxuZnVuY3Rpb24gY2FtbF91bml4X2lzYXR0eShmaWxlRGVzY3JpcHRvcikge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbWFrZV91bml4X2Vycl9hcmdzXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xudmFyIHVuaXhfZXJyb3IgPSBbXG4gIC8qID09PVVuaXguZXJyb3I9PT1cbiAgICpcbiAgICogVGhpcyBhcnJheSBpcyBpbiBvcmRlciBvZiB0aGUgdmFyaWFudCBpbiBPQ2FtbFxuICAgKi9cbiAgXCJFMkJJR1wiLCBcIkVBQ0NFU1wiLCBcIkVBR0FJTlwiLCBcIkVCQURGXCIsIFwiRUJVU1lcIiwgXCJFQ0hJTERcIiwgXCJFREVBRExLXCIsIFwiRURPTVwiLFxuICBcIkVFWElTVFwiLCBcIkVGQVVMVFwiLCBcIkVGQklHXCIsIFwiRUlOVFJcIiwgXCJFSU5WQUxcIiwgXCJFSU9cIiwgXCJFSVNESVJcIiwgXCJFTUZJTEVcIixcbiAgXCJFTUxJTktcIiwgXCJFTkFNRVRPT0xPTkdcIiwgXCJFTkZJTEVcIiwgXCJFTk9ERVZcIiwgXCJFTk9FTlRcIiwgXCJFTk9FWEVDXCIsIFwiRU5PTENLXCIsXG4gIFwiRU5PTUVNXCIsIFwiRU5PU1BDXCIsIFwiRU5PU1lTXCIsIFwiRU5PVERJUlwiLCBcIkVOT1RFTVBUWVwiLCBcIkVOT1RUWVwiLCBcIkVOWElPXCIsXG4gIFwiRVBFUk1cIiwgXCJFUElQRVwiLCBcIkVSQU5HRVwiLCBcIkVST0ZTXCIsIFwiRVNQSVBFXCIsIFwiRVNSQ0hcIiwgXCJFWERFVlwiLCBcIkVXT1VMREJMT0NLXCIsXG4gIFwiRUlOUFJPR1JFU1NcIiwgXCJFQUxSRUFEWVwiLCBcIkVOT1RTT0NLXCIsIFwiRURFU1RBRERSUkVRXCIsIFwiRU1TR1NJWkVcIixcbiAgXCJFUFJPVE9UWVBFXCIsIFwiRU5PUFJPVE9PUFRcIiwgXCJFUFJPVE9OT1NVUFBPUlRcIiwgXCJFU09DS1ROT1NVUFBPUlRcIixcbiAgXCJFT1BOT1RTVVBQXCIsIFwiRVBGTk9TVVBQT1JUXCIsIFwiRUFGTk9TVVBQT1JUXCIsIFwiRUFERFJJTlVTRVwiLCBcIkVBRERSTk9UQVZBSUxcIixcbiAgXCJFTkVURE9XTlwiLCBcIkVORVRVTlJFQUNIXCIsIFwiRU5FVFJFU0VUXCIsIFwiRUNPTk5BQk9SVEVEXCIsIFwiRUNPTk5SRVNFVFwiLCBcIkVOT0JVRlNcIixcbiAgXCJFSVNDT05OXCIsIFwiRU5PVENPTk5cIiwgXCJFU0hVVERPV05cIiwgXCJFVE9PTUFOWVJFRlNcIiwgXCJFVElNRURPVVRcIiwgXCJFQ09OTlJFRlVTRURcIixcbiAgXCJFSE9TVERPV05cIiwgXCJFSE9TVFVOUkVBQ0hcIiwgXCJFTE9PUFwiLCBcIkVPVkVSRkxPV1wiXG5dO1xuZnVuY3Rpb24gbWFrZV91bml4X2Vycl9hcmdzKGNvZGUsIHN5c2NhbGwsIHBhdGgsIGVycm5vKSB7XG4gIHZhciB2YXJpYW50ID0gdW5peF9lcnJvci5pbmRleE9mKGNvZGUpO1xuICBpZiAodmFyaWFudCA8IDApIHtcbiAgICAvLyBEZWZhdWx0IGlmIHVuZGVmaW5lZFxuICAgIGlmIChlcnJubyA9PSBudWxsKSB7XG4gICAgICBlcnJubyA9IC05OTk5XG4gICAgfVxuICAgIC8vIElmIG5vbmUgb2YgdGhlIGFib3ZlIHZhcmlhbnRzLCBmYWxsYmFjayB0byBFVU5LTk9XTkVSUihpbnQpXG4gICAgdmFyaWFudCA9IEJMT0NLKDAsIGVycm5vKTtcbiAgfVxuICB2YXIgYXJncyA9IFtcbiAgICB2YXJpYW50LFxuICAgIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHN5c2NhbGwgfHwgXCJcIiksXG4gICAgY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcocGF0aCB8fCBcIlwiKVxuICBdO1xuICByZXR1cm4gYXJncztcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N0YXRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3N0YXRcbmZ1bmN0aW9uIGNhbWxfdW5peF9zdGF0KG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5zdGF0KSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9zdGF0OiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnN0YXQocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfc3RhdF82NFxuLy9SZXF1aXJlczogY2FtbF91bml4X3N0YXQsIGNhbWxfaW50NjRfb2ZfaW50MzJcbi8vQWxpYXM6IHVuaXhfc3RhdF82NFxuZnVuY3Rpb24gY2FtbF91bml4X3N0YXRfNjQobmFtZSkge1xuICB2YXIgciA9IGNhbWxfdW5peF9zdGF0KG5hbWUpO1xuICByWzldID0gY2FtbF9pbnQ2NF9vZl9pbnQzMihyWzldKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2xzdGF0XG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9sc3RhdFxuZnVuY3Rpb24gY2FtbF91bml4X2xzdGF0KG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5sc3RhdCkge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfbHN0YXQ6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UubHN0YXQocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbHN0YXRfNjRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9sc3RhdCwgY2FtbF9pbnQ2NF9vZl9pbnQzMlxuLy9BbGlhczogdW5peF9sc3RhdF82NFxuZnVuY3Rpb24gY2FtbF91bml4X2xzdGF0XzY0KG5hbWUpIHtcbiAgdmFyIHIgPSBjYW1sX3VuaXhfbHN0YXQobmFtZSk7XG4gIHJbOV0gPSBjYW1sX2ludDY0X29mX2ludDMyKHJbOV0pO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfbWtkaXJcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X21rZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfbWtkaXIobmFtZSwgcGVybSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLm1rZGlyKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9ta2Rpcjogbm90IGltcGxlbWVudGVkXCIpO1xuICB9XG4gIHJldHVybiByb290LmRldmljZS5ta2Rpcihyb290LnJlc3QsIHBlcm0sIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9ybWRpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfcm1kaXJcbmZ1bmN0aW9uIGNhbWxfdW5peF9ybWRpcihuYW1lKSB7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIGlmICghcm9vdC5kZXZpY2Uucm1kaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3JtZGlyOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnJtZGlyKHJvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3N5bWxpbmtcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlLCBjYW1sX2ZhaWx3aXRoXG4vL0FsaWFzOiB1bml4X3N5bWxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9zeW1saW5rKHRvX2Rpciwgc3JjLCBkc3QpIHtcbiAgdmFyIHNyY19yb290ID0gcmVzb2x2ZV9mc19kZXZpY2Uoc3JjKTtcbiAgdmFyIGRzdF9yb290ID0gcmVzb2x2ZV9mc19kZXZpY2UoZHN0KTtcbiAgaWYoc3JjX3Jvb3QuZGV2aWNlICE9IGRzdF9yb290LmRldmljZSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X3N5bWxpbms6IGNhbm5vdCBzeW1saW5rIGJldHdlZW4gdHdvIGZpbGVzeXN0ZW1zXCIpO1xuICBpZiAoIXNyY19yb290LmRldmljZS5zeW1saW5rKSB7XG4gICAgY2FtbF9mYWlsd2l0aChcImNhbWxfdW5peF9zeW1saW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHNyY19yb290LmRldmljZS5zeW1saW5rKHRvX2Rpciwgc3JjX3Jvb3QucmVzdCwgZHN0X3Jvb3QucmVzdCwgLyogcmFpc2UgVW5peF9lcnJvciAqLyB0cnVlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X3JlYWRsaW5rXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF9yZWFkbGlua1xuZnVuY3Rpb24gY2FtbF91bml4X3JlYWRsaW5rKG5hbWUpIHtcbiAgdmFyIHJvb3QgPSByZXNvbHZlX2ZzX2RldmljZShuYW1lKTtcbiAgaWYgKCFyb290LmRldmljZS5yZWFkbGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfcmVhZGxpbms6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICByZXR1cm4gcm9vdC5kZXZpY2UucmVhZGxpbmsocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfdW5saW5rXG4vL1JlcXVpcmVzOiByZXNvbHZlX2ZzX2RldmljZSwgY2FtbF9mYWlsd2l0aFxuLy9BbGlhczogdW5peF91bmxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF91bmxpbmsobmFtZSkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKG5hbWUpO1xuICBpZiAoIXJvb3QuZGV2aWNlLnVubGluaykge1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX3VuaXhfdW5saW5rOiBub3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHJvb3QuZGV2aWNlLnVubGluayhyb290LnJlc3QsIC8qIHJhaXNlIFVuaXhfZXJyb3IgKi8gdHJ1ZSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXR1aWRcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfbm90X2ZvdW5kXG4vL0FsaWFzOiB1bml4X2dldHVpZFxuZnVuY3Rpb24gY2FtbF91bml4X2dldHVpZCh1bml0KSB7XG4gIGlmKGdsb2JhbFRoaXMucHJvY2VzcyAmJiBnbG9iYWxUaGlzLnByb2Nlc3MuZ2V0dWlkKXtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5wcm9jZXNzLmdldHVpZCgpO1xuICB9XG4gIGNhbWxfcmFpc2Vfbm90X2ZvdW5kKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9nZXRwd3VpZFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9ub3RfZm91bmRcbi8vQWxpYXM6IHVuaXhfZ2V0cHd1aWRcbmZ1bmN0aW9uIGNhbWxfdW5peF9nZXRwd3VpZCh1bml0KSB7XG4gIGNhbWxfcmFpc2Vfbm90X2ZvdW5kKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9oYXNfc3ltbGlua1xuLy9SZXF1aXJlczogZnNfbm9kZV9zdXBwb3J0ZWRcbi8vQWxpYXM6IHVuaXhfaGFzX3N5bWxpbmtcbmZ1bmN0aW9uIGNhbWxfdW5peF9oYXNfc3ltbGluayh1bml0KSB7XG4gIHJldHVybiBmc19ub2RlX3N1cHBvcnRlZCgpPzE6MFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfb3BlbmRpclxuLy9SZXF1aXJlczogcmVzb2x2ZV9mc19kZXZpY2UsIGNhbWxfZmFpbHdpdGhcbi8vQWxpYXM6IHVuaXhfb3BlbmRpclxuZnVuY3Rpb24gY2FtbF91bml4X29wZW5kaXIocGF0aCkge1xuICB2YXIgcm9vdCA9IHJlc29sdmVfZnNfZGV2aWNlKHBhdGgpO1xuICBpZiAoIXJvb3QuZGV2aWNlLm9wZW5kaXIpIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF91bml4X29wZW5kaXI6IG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuICB2YXIgZGlyX2hhbmRsZSA9IHJvb3QuZGV2aWNlLm9wZW5kaXIocm9vdC5yZXN0LCAvKiByYWlzZSBVbml4X2Vycm9yICovIHRydWUpO1xuICByZXR1cm4geyBwb2ludGVyIDogZGlyX2hhbmRsZSwgcGF0aDogcGF0aCB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9yZWFkZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogbWFrZV91bml4X2Vycl9hcmdzLCBjYW1sX3JhaXNlX3dpdGhfYXJncywgY2FtbF9uYW1lZF92YWx1ZVxuLy9BbGlhczogdW5peF9yZWFkZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKSB7XG4gIHZhciBlbnRyeTtcbiAgdHJ5IHtcbiAgICAgIGVudHJ5ID0gZGlyX2hhbmRsZS5wb2ludGVyLnJlYWRTeW5jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhciB1bml4X2Vycm9yID0gY2FtbF9uYW1lZF92YWx1ZSgnVW5peC5Vbml4X2Vycm9yJyk7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFQkFERlwiLCBcInJlYWRkaXJcIiwgZGlyX2hhbmRsZS5wYXRoKSk7XG4gIH1cbiAgaWYgKGVudHJ5ID09PSBudWxsKSB7XG4gICAgICBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNzdHJpbmcoZW50cnkubmFtZSk7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2Nsb3NlZGlyXG4vL1JlcXVpcmVzOiBtYWtlX3VuaXhfZXJyX2FyZ3MsIGNhbWxfcmFpc2Vfd2l0aF9hcmdzLCBjYW1sX25hbWVkX3ZhbHVlXG4vL0FsaWFzOiB1bml4X2Nsb3NlZGlyXG5mdW5jdGlvbiBjYW1sX3VuaXhfY2xvc2VkaXIoZGlyX2hhbmRsZSkge1xuICB0cnkge1xuICAgICAgZGlyX2hhbmRsZS5wb2ludGVyLmNsb3NlU3luYygpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgdW5peF9lcnJvciA9IGNhbWxfbmFtZWRfdmFsdWUoJ1VuaXguVW5peF9lcnJvcicpO1xuICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRUJBREZcIiwgXCJjbG9zZWRpclwiLCBkaXJfaGFuZGxlLnBhdGgpKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfcmV3aW5kZGlyXG4vL1JlcXVpcmVzOiBjYW1sX3VuaXhfY2xvc2VkaXIsIGNhbWxfdW5peF9vcGVuZGlyXG4vL0FsaWFzOiB1bml4X3Jld2luZGRpclxuZnVuY3Rpb24gY2FtbF91bml4X3Jld2luZGRpcihkaXJfaGFuZGxlKSB7XG4gIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKTtcbiAgdmFyIG5ld19kaXJfaGFuZGxlID0gY2FtbF91bml4X29wZW5kaXIoZGlyX2hhbmRsZS5wYXRoKTtcbiAgZGlyX2hhbmRsZS5wb2ludGVyID0gbmV3X2Rpcl9oYW5kbGUucG9pbnRlcjtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfdW5peF9maW5kZmlyc3Rcbi8vUmVxdWlyZXM6IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nLCBjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF91bml4X29wZW5kaXIsIGNhbWxfdW5peF9yZWFkZGlyXG4vL0FsaWFzOiB3aW5fZmluZGZpcnN0XG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZGZpcnN0KHBhdGgpIHtcbiAgLy8gVGhlIFdpbmRvd3MgY29kZSBhZGRzIHRoaXMgZ2xvYiB0byB0aGUgcGF0aCwgc28gd2UgbmVlZCB0byByZW1vdmUgaXRcbiAgdmFyIHBhdGhfanMgPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhwYXRoKTtcbiAgcGF0aF9qcyA9IHBhdGhfanMucmVwbGFjZSgvKF58W1xcXFxcXC9dKVxcKlxcLlxcKiQvLCBcIlwiKTtcbiAgcGF0aCA9IGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nKHBhdGhfanMpO1xuICAvLyAqLiogaXMgbm93IHN0cmlwcGVkXG4gIHZhciBkaXJfaGFuZGxlID0gY2FtbF91bml4X29wZW5kaXIocGF0aCk7XG4gIHZhciBmaXJzdF9lbnRyeSA9IGNhbWxfdW5peF9yZWFkZGlyKGRpcl9oYW5kbGUpO1xuICAvLyBUaGUgV2luZG93cyBiaW5kaW5ncyB0eXBlIGRpcl9oYW5kbGUgYXMgYW4gYGludGAgYnV0IGl0J3Mgbm90IGluIEpTXG4gIHJldHVybiBbMCwgZmlyc3RfZW50cnksIGRpcl9oYW5kbGVdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfZmluZG5leHRcbi8vUmVxdWlyZXM6IGNhbWxfdW5peF9yZWFkZGlyXG4vL0FsaWFzOiB3aW5fZmluZG5leHRcbmZ1bmN0aW9uIGNhbWxfdW5peF9maW5kbmV4dChkaXJfaGFuZGxlKSB7XG4gIHJldHVybiBjYW1sX3VuaXhfcmVhZGRpcihkaXJfaGFuZGxlKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF91bml4X2ZpbmRjbG9zZVxuLy9SZXF1aXJlczogY2FtbF91bml4X2Nsb3NlZGlyXG4vL0FsaWFzOiB3aW5fZmluZGNsb3NlXG5mdW5jdGlvbiBjYW1sX3VuaXhfZmluZGNsb3NlKGRpcl9oYW5kbGUpIHtcbiAgcmV0dXJuIGNhbWxfdW5peF9jbG9zZWRpcihkaXJfaGFuZGxlKTtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3VuaXhfaW5ldF9hZGRyX29mX3N0cmluZ1xuLy9BbGlhczogdW5peF9pbmV0X2FkZHJfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX3VuaXhfaW5ldF9hZGRyX29mX3N0cmluZyAoKSB7cmV0dXJuIDA7fVxuXG5cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IE1sRmFrZURldmljZVxuLy9SZXF1aXJlczogTWxGYWtlRmlsZSwgTWxGYWtlRmQsIGNhbWxfY3JlYXRlX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX2J5dGVzX29mX2FycmF5LCBjYW1sX2J5dGVzX29mX3N0cmluZywgY2FtbF9ieXRlc19vZl9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX2lzX21sX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9uYW1lZF92YWx1ZSwgY2FtbF9yYWlzZV93aXRoX2FyZ3MsIGNhbWxfbmFtZWRfdmFsdWVzXG4vL1JlcXVpcmVzOiBtYWtlX3VuaXhfZXJyX2FyZ3NcbmZ1bmN0aW9uIE1sRmFrZURldmljZSAocm9vdCwgZikge1xuICB0aGlzLmNvbnRlbnQ9e307XG4gIHRoaXMucm9vdCA9IHJvb3Q7XG4gIHRoaXMubG9va3VwRnVuID0gZjtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUubm0gPSBmdW5jdGlvbihuYW1lKSB7XG4gIHJldHVybiAodGhpcy5yb290ICsgbmFtZSk7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLmNyZWF0ZV9kaXJfaWZfbmVlZGVkID0gZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY29tcCA9IG5hbWUuc3BsaXQoXCIvXCIpO1xuICB2YXIgcmVzID0gXCJcIjtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGNvbXAubGVuZ3RoIC0gMTsgaSsrKXtcbiAgICByZXMgKz0gY29tcFtpXSArIFwiL1wiO1xuICAgIGlmKHRoaXMuY29udGVudFtyZXNdKSBjb250aW51ZTtcbiAgICB0aGlzLmNvbnRlbnRbcmVzXSA9IFN5bWJvbChcImRpcmVjdG9yeVwiKTtcbiAgfVxufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5zbGFzaCA9IGZ1bmN0aW9uKG5hbWUpe1xuICByZXR1cm4gL1xcLyQvLnRlc3QobmFtZSk/bmFtZToobmFtZSArIFwiL1wiKTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUubG9va3VwID0gZnVuY3Rpb24obmFtZSkge1xuICBpZighdGhpcy5jb250ZW50W25hbWVdICYmIHRoaXMubG9va3VwRnVuKSB7XG4gICAgdmFyIHJlcyA9IHRoaXMubG9va3VwRnVuKGNhbWxfc3RyaW5nX29mX2pzYnl0ZXModGhpcy5yb290KSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhuYW1lKSk7XG4gICAgaWYocmVzICE9PSAwKSB7XG4gICAgICB0aGlzLmNyZWF0ZV9kaXJfaWZfbmVlZGVkKG5hbWUpO1xuICAgICAgdGhpcy5jb250ZW50W25hbWVdPW5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKHJlc1sxXSkpO1xuICAgIH1cbiAgfVxufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5leGlzdHMgPSBmdW5jdGlvbihuYW1lKSB7XG4gIC8vIFRoZSByb290IG9mIHRoZSBkZXZpY2UgZXhpc3RzXG4gIGlmKG5hbWUgPT0gXCJcIikgcmV0dXJuIDE7XG4gIC8vIENoZWNrIGlmIGEgZGlyZWN0b3J5IGV4aXN0c1xuICB2YXIgbmFtZV9zbGFzaCA9IHRoaXMuc2xhc2gobmFtZSk7XG4gIGlmKHRoaXMuY29udGVudFtuYW1lX3NsYXNoXSkgcmV0dXJuIDE7XG4gIC8vIENoZWNrIGlmIGEgZmlsZSBleGlzdHNcbiAgdGhpcy5sb29rdXAobmFtZSk7XG4gIHJldHVybiB0aGlzLmNvbnRlbnRbbmFtZV0/MTowO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5pc0ZpbGUgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGlmKHRoaXMuZXhpc3RzKG5hbWUpICYmICF0aGlzLmlzX2RpcihuYW1lKSkge1xuICAgIHJldHVybiAxXG4gIH1cbiAgZWxzZSB7XG4gICAgcmV0dXJuIDBcbiAgfVxufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5ta2RpciA9IGZ1bmN0aW9uKG5hbWUsbW9kZSwgcmFpc2VfdW5peCkge1xuICB2YXIgdW5peF9lcnJvciA9IHJhaXNlX3VuaXggJiYgY2FtbF9uYW1lZF92YWx1ZSgnVW5peC5Vbml4X2Vycm9yJyk7XG4gIGlmKHRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVFWElTVFwiLCBcIm1rZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IEZpbGUgZXhpc3RzXCIpO1xuICAgIH1cbiAgfVxuICB2YXIgcGFyZW50ID0gL14oLiopXFwvW14vXSsvLmV4ZWMobmFtZSk7XG4gIHBhcmVudCA9IChwYXJlbnQgJiYgcGFyZW50WzFdKSB8fCAnJztcbiAgaWYoIXRoaXMuZXhpc3RzKHBhcmVudCkpe1xuICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9FTlRcIiwgXCJta2RpclwiLCB0aGlzLm5tKHBhcmVudCkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihwYXJlbnQgKyBcIjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cbiAgaWYoIXRoaXMuaXNfZGlyKHBhcmVudCkpe1xuICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9URElSXCIsIFwibWtkaXJcIiwgdGhpcy5ubShwYXJlbnQpKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IocGFyZW50ICsgXCI6IE5vdCBhIGRpcmVjdG9yeVwiKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZCh0aGlzLnNsYXNoKG5hbWUpKTtcbn1cbk1sRmFrZURldmljZS5wcm90b3R5cGUucm1kaXIgPSBmdW5jdGlvbihuYW1lLCByYWlzZV91bml4KSB7XG4gIHZhciB1bml4X2Vycm9yID0gcmFpc2VfdW5peCAmJiBjYW1sX25hbWVkX3ZhbHVlKCdVbml4LlVuaXhfZXJyb3InKTtcbiAgdmFyIG5hbWVfc2xhc2ggPSAobmFtZSA9PSBcIlwiKT9cIlwiOih0aGlzLnNsYXNoKG5hbWUpKTtcbiAgdmFyIHIgPSBuZXcgUmVnRXhwKFwiXlwiICsgbmFtZV9zbGFzaCArIFwiKFteL10rKVwiKTtcbiAgaWYoIXRoaXMuZXhpc3RzKG5hbWUpKSB7XG4gICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgIGNhbWxfcmFpc2Vfd2l0aF9hcmdzKHVuaXhfZXJyb3IsIG1ha2VfdW5peF9lcnJfYXJncyhcIkVOT0VOVFwiLCBcInJtZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gICAgfVxuICB9XG4gIGlmKCF0aGlzLmlzX2RpcihuYW1lKSkge1xuICAgIGlmICh1bml4X2Vycm9yKSB7XG4gICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFTk9URElSXCIsIFwicm1kaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKG5hbWUgKyBcIjogTm90IGEgZGlyZWN0b3J5XCIpO1xuICAgIH1cbiAgfVxuICBmb3IodmFyIG4gaW4gdGhpcy5jb250ZW50KSB7XG4gICAgaWYobi5tYXRjaChyKSkge1xuICAgICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgICAgY2FtbF9yYWlzZV93aXRoX2FyZ3ModW5peF9lcnJvciwgbWFrZV91bml4X2Vycl9hcmdzKFwiRU5PVEVNUFRZXCIsIFwicm1kaXJcIiwgdGhpcy5ubShuYW1lKSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiOiBEaXJlY3Rvcnkgbm90IGVtcHR5XCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkZWxldGUgdGhpcy5jb250ZW50W25hbWVfc2xhc2hdO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5yZWFkZGlyID0gZnVuY3Rpb24obmFtZSkge1xuICB2YXIgbmFtZV9zbGFzaCA9IChuYW1lID09IFwiXCIpP1wiXCI6KHRoaXMuc2xhc2gobmFtZSkpO1xuICBpZighdGhpcy5leGlzdHMobmFtZSkpIHtcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcIik7XG4gIH1cbiAgaWYoIXRoaXMuaXNfZGlyKG5hbWUpKSB7XG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IobmFtZSArIFwiOiBOb3QgYSBkaXJlY3RvcnlcIik7XG4gIH1cbiAgdmFyIHIgPSBuZXcgUmVnRXhwKFwiXlwiICsgbmFtZV9zbGFzaCArIFwiKFteL10rKVwiKTtcbiAgdmFyIHNlZW4gPSB7fVxuICB2YXIgYSA9IFtdO1xuICBmb3IodmFyIG4gaW4gdGhpcy5jb250ZW50KSB7XG4gICAgdmFyIG0gPSBuLm1hdGNoKHIpO1xuICAgIGlmKG0gJiYgIXNlZW5bbVsxXV0pIHtzZWVuW21bMV1dID0gdHJ1ZTsgYS5wdXNoKG1bMV0pfVxuICB9XG4gIHJldHVybiBhO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5vcGVuZGlyID0gZnVuY3Rpb24obmFtZSwgcmFpc2VfdW5peCkge1xuICB2YXIgdW5peF9lcnJvciA9IHJhaXNlX3VuaXggJiYgY2FtbF9uYW1lZF92YWx1ZSgnVW5peC5Vbml4X2Vycm9yJyk7XG5cbiAgdmFyIGEgPSB0aGlzLnJlYWRkaXIobmFtZSk7XG4gIHZhciBjID0gZmFsc2U7XG4gIHZhciBpID0gMDtcbiAgcmV0dXJuIHsgcmVhZFN5bmMgOiAoZnVuY3Rpb24gKCkge1xuICAgIGlmIChjKSB7XG4gICAgICBpZiAodW5peF9lcnJvcikge1xuICAgICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFQkFERlwiLCBcImNsb3NlZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IGNsb3NlZGlyIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoaSA9PSBhLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgdmFyIGVudHJ5ID0gYVtpXTtcbiAgICBpKys7XG4gICAgcmV0dXJuIHsgbmFtZTogZW50cnkgfVxuICB9KVxuICAgICwgY2xvc2VTeW5jOiAoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgaWYgKHVuaXhfZXJyb3IpIHtcbiAgICAgICAgICBjYW1sX3JhaXNlX3dpdGhfYXJncyh1bml4X2Vycm9yLCBtYWtlX3VuaXhfZXJyX2FyZ3MoXCJFQkFERlwiLCBcImNsb3NlZGlyXCIsIHRoaXMubm0obmFtZSkpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihuYW1lICsgXCI6IGNsb3NlZGlyIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYyA9IHRydWU7XG4gICAgICBhID0gW107XG4gICAgfSlcbiAgfVxufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5pc19kaXIgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGlmKG5hbWUgPT0gXCJcIikgIHJldHVybiB0cnVlO1xuICB2YXIgbmFtZV9zbGFzaCA9IHRoaXMuc2xhc2gobmFtZSk7XG4gIHJldHVybiB0aGlzLmNvbnRlbnRbbmFtZV9zbGFzaF0/MTowO1xufVxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS51bmxpbmsgPSBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBvayA9IHRoaXMuY29udGVudFtuYW1lXT90cnVlOmZhbHNlO1xuICBkZWxldGUgdGhpcy5jb250ZW50W25hbWVdO1xuICByZXR1cm4gb2s7XG59XG5NbEZha2VEZXZpY2UucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbihuYW1lLCBmKSB7XG4gIHZhciBmaWxlO1xuICBpZihmLnJkb25seSAmJiBmLndyb25seSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3Jkb25seSBhbmQgT3Blbl93cm9ubHkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICBpZihmLnRleHQgJiYgZi5iaW5hcnkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl90ZXh0IGFuZCBPcGVuX2JpbmFyeSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIHRoaXMubG9va3VwKG5hbWUpO1xuICBpZiAodGhpcy5jb250ZW50W25hbWVdKSB7XG4gICAgaWYgKHRoaXMuaXNfZGlyKG5hbWUpKSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBpcyBhIGRpcmVjdG9yeVwiKTtcbiAgICBpZiAoZi5jcmVhdGUgJiYgZi5leGNsKSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICAgIGZpbGUgPSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gICAgaWYoZi50cnVuY2F0ZSkgZmlsZS50cnVuY2F0ZSgpO1xuICB9IGVsc2UgaWYgKGYuY3JlYXRlKSB7XG4gICAgdGhpcy5jcmVhdGVfZGlyX2lmX25lZWRlZChuYW1lKTtcbiAgICB0aGlzLmNvbnRlbnRbbmFtZV0gPSBuZXcgTWxGYWtlRmlsZShjYW1sX2NyZWF0ZV9ieXRlcygwKSk7XG4gICAgZmlsZSA9IHRoaXMuY29udGVudFtuYW1lXTtcbiAgfSBlbHNlIHtcbiAgICBjYW1sX3JhaXNlX25vX3N1Y2hfZmlsZSAodGhpcy5ubShuYW1lKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBNbEZha2VGZCh0aGlzLm5tKG5hbWUpLCBmaWxlLCBmKTtcbn1cblxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24obmFtZSwgZikge1xuICB2YXIgZmlsZTtcbiAgaWYoZi5yZG9ubHkgJiYgZi53cm9ubHkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl9yZG9ubHkgYW5kIE9wZW5fd3Jvbmx5IGFyZSBub3QgY29tcGF0aWJsZVwiKTtcbiAgaWYoZi50ZXh0ICYmIGYuYmluYXJ5KVxuICAgIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IGZsYWdzIE9wZW5fdGV4dCBhbmQgT3Blbl9iaW5hcnkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICB0aGlzLmxvb2t1cChuYW1lKTtcbiAgaWYgKHRoaXMuY29udGVudFtuYW1lXSkge1xuICAgIGlmICh0aGlzLmlzX2RpcihuYW1lKSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogaXMgYSBkaXJlY3RvcnlcIik7XG4gICAgaWYgKGYuY3JlYXRlICYmIGYuZXhjbCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IodGhpcy5ubShuYW1lKSArIFwiIDogZmlsZSBhbHJlYWR5IGV4aXN0c1wiKTtcbiAgICBmaWxlID0gdGhpcy5jb250ZW50W25hbWVdO1xuICAgIGlmKGYudHJ1bmNhdGUpIGZpbGUudHJ1bmNhdGUoKTtcbiAgfSBlbHNlIGlmIChmLmNyZWF0ZSkge1xuICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgdGhpcy5jb250ZW50W25hbWVdID0gbmV3IE1sRmFrZUZpbGUoY2FtbF9jcmVhdGVfYnl0ZXMoMCkpO1xuICAgIGZpbGUgPSB0aGlzLmNvbnRlbnRbbmFtZV07XG4gIH0gZWxzZSB7XG4gICAgY2FtbF9yYWlzZV9ub19zdWNoX2ZpbGUgKHRoaXMubm0obmFtZSkpO1xuICB9XG4gIHJldHVybiBuZXcgTWxGYWtlRmQodGhpcy5ubShuYW1lKSwgZmlsZSwgZik7XG59XG5cbk1sRmFrZURldmljZS5wcm90b3R5cGUucmVnaXN0ZXI9IGZ1bmN0aW9uIChuYW1lLGNvbnRlbnQpe1xuICB2YXIgZmlsZTtcbiAgaWYodGhpcy5jb250ZW50W25hbWVdKSBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLm5tKG5hbWUpICsgXCIgOiBmaWxlIGFscmVhZHkgZXhpc3RzXCIpO1xuICBpZihjYW1sX2lzX21sX2J5dGVzKGNvbnRlbnQpKVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjb250ZW50KTtcbiAgaWYoY2FtbF9pc19tbF9zdHJpbmcoY29udGVudCkpXG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2Zfc3RyaW5nKGNvbnRlbnQpKTtcbiAgZWxzZSBpZihjb250ZW50IGluc3RhbmNlb2YgQXJyYXkpXG4gICAgZmlsZSA9IG5ldyBNbEZha2VGaWxlKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoY29udGVudCkpO1xuICBlbHNlIGlmKHR5cGVvZiBjb250ZW50ID09PSBcInN0cmluZ1wiKVxuICAgIGZpbGUgPSBuZXcgTWxGYWtlRmlsZShjYW1sX2J5dGVzX29mX2pzYnl0ZXMoY29udGVudCkpO1xuICBlbHNlIGlmKGNvbnRlbnQudG9TdHJpbmcpIHtcbiAgICB2YXIgYnl0ZXMgPSBjYW1sX2J5dGVzX29mX3N0cmluZyhjYW1sX3N0cmluZ19vZl9qc3N0cmluZyhjb250ZW50LnRvU3RyaW5nKCkpKTtcbiAgICBmaWxlID0gbmV3IE1sRmFrZUZpbGUoYnl0ZXMpO1xuICB9XG4gIGlmKGZpbGUpe1xuICAgIHRoaXMuY3JlYXRlX2Rpcl9pZl9uZWVkZWQobmFtZSk7XG4gICAgdGhpcy5jb250ZW50W25hbWVdID0gZmlsZTtcbiAgfVxuICBlbHNlIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubm0obmFtZSkgKyBcIiA6IHJlZ2lzdGVyaW5nIGZpbGUgd2l0aCBpbnZhbGlkIGNvbnRlbnQgdHlwZVwiKTtcbn1cblxuTWxGYWtlRGV2aWNlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1sRmFrZURldmljZVxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGaWxlXG4vL1JlcXVpcmVzOiBNbEZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ibGl0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzLCBjYW1sX2J5dGVzX29mX2FycmF5XG5mdW5jdGlvbiBNbEZha2VGaWxlKGNvbnRlbnQpe1xuICB0aGlzLmRhdGEgPSBjb250ZW50O1xufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUgPSBuZXcgTWxGaWxlICgpO1xuTWxGYWtlRmlsZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNbEZha2VGaWxlXG5NbEZha2VGaWxlLnByb3RvdHlwZS50cnVuY2F0ZSA9IGZ1bmN0aW9uKGxlbil7XG4gIHZhciBvbGQgPSB0aGlzLmRhdGE7XG4gIHRoaXMuZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbnwwKTtcbiAgY2FtbF9ibGl0X2J5dGVzKG9sZCwgMCwgdGhpcy5kYXRhLCAwLCBsZW4pO1xufVxuTWxGYWtlRmlsZS5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gY2FtbF9tbF9ieXRlc19sZW5ndGgodGhpcy5kYXRhKTtcbn1cbk1sRmFrZUZpbGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob2Zmc2V0LGJ1Zixwb3MsbGVuKXtcbiAgdmFyIGNsZW4gPSB0aGlzLmxlbmd0aCgpO1xuICBpZihvZmZzZXQgKyBsZW4gPj0gY2xlbikge1xuICAgIHZhciBuZXdfc3RyID0gY2FtbF9jcmVhdGVfYnl0ZXMob2Zmc2V0ICsgbGVuKTtcbiAgICB2YXIgb2xkX2RhdGEgPSB0aGlzLmRhdGE7XG4gICAgdGhpcy5kYXRhID0gbmV3X3N0cjtcbiAgICBjYW1sX2JsaXRfYnl0ZXMob2xkX2RhdGEsIDAsIHRoaXMuZGF0YSwgMCwgY2xlbik7XG4gIH1cbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoYnVmKSwgcG9zLCB0aGlzLmRhdGEsIG9mZnNldCwgbGVuKTtcbiAgcmV0dXJuIDBcbn1cbk1sRmFrZUZpbGUucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihvZmZzZXQsYnVmLHBvcyxsZW4pe1xuICB2YXIgY2xlbiA9IHRoaXMubGVuZ3RoKCk7XG4gIGlmKG9mZnNldCArIGxlbiA+PSBjbGVuKSB7XG4gICAgbGVuID0gY2xlbiAtIG9mZnNldDtcbiAgfVxuICBpZihsZW4pIHtcbiAgICB2YXIgZGF0YSA9IGNhbWxfY3JlYXRlX2J5dGVzKGxlbnwwKTtcbiAgICBjYW1sX2JsaXRfYnl0ZXModGhpcy5kYXRhLCBvZmZzZXQsIGRhdGEsIDAsIGxlbik7XG4gICAgYnVmLnNldChjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGRhdGEpLCBwb3MpO1xuICB9XG4gIHJldHVybiBsZW5cbn1cblxuXG4vL1Byb3ZpZGVzOiBNbEZha2VGZF9vdXRcbi8vUmVxdWlyZXM6IE1sRmFrZUZpbGUsIGNhbWxfY3JlYXRlX2J5dGVzLCBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBNbEZha2VGZF9vdXQoZmQsZmxhZ3MpIHtcbiAgTWxGYWtlRmlsZS5jYWxsKHRoaXMsIGNhbWxfY3JlYXRlX2J5dGVzKDApKTtcbiAgdGhpcy5sb2cgPSAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIDAgfSk7XG4gIGlmKGZkID09IDEgJiYgdHlwZW9mIGNvbnNvbGUubG9nID09IFwiZnVuY3Rpb25cIilcbiAgICB0aGlzLmxvZyA9IGNvbnNvbGUubG9nO1xuICBlbHNlIGlmKGZkID09IDIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT0gXCJmdW5jdGlvblwiKVxuICAgIHRoaXMubG9nID0gY29uc29sZS5lcnJvcjtcbiAgZWxzZSBpZih0eXBlb2YgY29uc29sZS5sb2cgPT0gXCJmdW5jdGlvblwiKVxuICAgIHRoaXMubG9nID0gY29uc29sZS5sb2dcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xufVxuTWxGYWtlRmRfb3V0LnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIDAgfVxuTWxGYWtlRmRfb3V0LnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIChvZmZzZXQsYnVmLHBvcyxsZW4pIHtcbiAgaWYodGhpcy5sb2cpIHtcbiAgICBpZihsZW4gPiAwXG4gICAgICAgJiYgcG9zID49IDBcbiAgICAgICAmJiBwb3MrbGVuIDw9IGJ1Zi5sZW5ndGhcbiAgICAgICAmJiBidWZbcG9zK2xlbi0xXSA9PSAxMClcbiAgICAgIGxlbiAtLTtcbiAgICAvLyBEbyBub3Qgb3V0cHV0IHRoZSBsYXN0IFxcbiBpZiBwcmVzZW50XG4gICAgLy8gYXMgY29uc29sZSBsb2dnaW5nIGRpc3BsYXkgYSBuZXdsaW5lIGF0IHRoZSBlbmRcbiAgICB2YXIgc3JjID0gY2FtbF9jcmVhdGVfYnl0ZXMobGVuKTtcbiAgICBjYW1sX2JsaXRfYnl0ZXMoY2FtbF9ieXRlc19vZl9hcnJheShidWYpLCBwb3MsIHNyYywgMCwgbGVuKTtcbiAgICB0aGlzLmxvZyhzcmMudG9VdGYxNigpKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjYW1sX3JhaXNlX3N5c19lcnJvcih0aGlzLmZkICArIFwiOiBmaWxlIGRlc2NyaXB0b3IgYWxyZWFkeSBjbG9zZWRcIik7XG59XG5NbEZha2VGZF9vdXQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbiAob2Zmc2V0LCBidWYsIHBvcywgbGVuKSB7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMuZmQgICsgXCI6IGZpbGUgZGVzY3JpcHRvciBpcyB3cml0ZSBvbmx5XCIpO1xufVxuTWxGYWtlRmRfb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5sb2cgPSB1bmRlZmluZWQ7XG59XG5cblxuLy9Qcm92aWRlczogTWxGYWtlRmRcbi8vUmVxdWlyZXM6IE1sRmFrZUZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG5mdW5jdGlvbiBNbEZha2VGZChuYW1lLCBmaWxlLGZsYWdzKSB7XG4gIHRoaXMuZmlsZSA9IGZpbGU7XG4gIHRoaXMubmFtZSA9IG5hbWU7XG4gIHRoaXMuZmxhZ3MgPSBmbGFncztcbn1cblxuTWxGYWtlRmQucHJvdG90eXBlLmVycl9jbG9zZWQgPSBmdW5jdGlvbiAoKSB7XG4gIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKHRoaXMubmFtZSAgKyBcIjogZmlsZSBkZXNjcmlwdG9yIGFscmVhZHkgY2xvc2VkXCIpO1xufVxuTWxGYWtlRmQucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICBpZih0aGlzLmZpbGUpIHJldHVybiB0aGlzLmZpbGUubGVuZ3RoICgpXG4gIHRoaXMuZXJyX2Nsb3NlZCgpO1xufVxuTWxGYWtlRmQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKG9mZnNldCxidWYscG9zLGxlbikge1xuICBpZih0aGlzLmZpbGUpIHJldHVybiB0aGlzLmZpbGUud3JpdGUob2Zmc2V0LGJ1Zixwb3MsbGVuKVxuICB0aGlzLmVycl9jbG9zZWQoKTtcbn1cbk1sRmFrZUZkLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24gKG9mZnNldCwgYnVmLCBwb3MsIGxlbikge1xuICBpZih0aGlzLmZpbGUpIHJldHVybiB0aGlzLmZpbGUucmVhZChvZmZzZXQsIGJ1ZiwgcG9zLCBsZW4pXG4gIHRoaXMuZXJyX2Nsb3NlZCgpO1xufVxuTWxGYWtlRmQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmZpbGUgPSB1bmRlZmluZWQ7XG59XG4iLCIvL1Byb3ZpZGVzOiBpbml0aWFsaXplX25hdFxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBzZXJpYWxpemVfbmF0LCBkZXNlcmlhbGl6ZV9uYXQsIGNhbWxfaGFzaF9uYXRcbmZ1bmN0aW9uIGluaXRpYWxpemVfbmF0KCkge1xuICBjYW1sX2N1c3RvbV9vcHNbXCJfbmF0XCJdID1cbiAgICB7IGRlc2VyaWFsaXplIDogZGVzZXJpYWxpemVfbmF0LFxuICAgICAgc2VyaWFsaXplIDogc2VyaWFsaXplX25hdCxcbiAgICAgIGhhc2ggOiBjYW1sX2hhc2hfbmF0XG4gICAgfVxufVxuXG4vL1Byb3ZpZGVzOiBNbE5hdFxuZnVuY3Rpb24gTWxOYXQoeCl7XG4gIHRoaXMuZGF0YSA9IG5ldyBJbnQzMkFycmF5KHgpO1xuICAvLyBsZW5ndGhfbmF0IGlzbid0IGV4dGVybmFsLCBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhlIE9iai5zaXplXG4gIC8vIHdvcmsgb3V0IHJpZ2h0LiBUaGUgKzIgdG8gYXJyYXkgbGVuZ3RoIHNlZW1zIHRvIHdvcmsuXG4gIHRoaXMubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aCArIDJcbn1cblxuTWxOYXQucHJvdG90eXBlLmNhbWxfY3VzdG9tID0gXCJfbmF0XCI7XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9uYXRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50LCBudW1fZGlnaXRzX25hdFxuZnVuY3Rpb24gY2FtbF9oYXNoX25hdCh4KSB7XG4gIHZhciBsZW4gPSBudW1fZGlnaXRzX25hdCh4LCAwLCB4LmRhdGEubGVuZ3RoKTtcbiAgdmFyIGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHguZGF0YVtpXSk7XG4gIH1cbiAgcmV0dXJuIGg7XG59XG5cblxuLy9Qcm92aWRlczogbmF0X29mX2FycmF5XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gbmF0X29mX2FycmF5KGwpe1xuICByZXR1cm4gbmV3IE1sTmF0KGwpO1xufVxuXG4vL1Byb3ZpZGVzOiBjcmVhdGVfbmF0XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gY3JlYXRlX25hdChzaXplKSB7XG4gIHZhciBhcnIgPSBuZXcgTWxOYXQoc2l6ZSk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBhcnIuZGF0YVtpXSA9IC0xO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8vUHJvdmlkZXM6IHNldF90b196ZXJvX25hdFxuZnVuY3Rpb24gc2V0X3RvX3plcm9fbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgbmF0LmRhdGFbb2ZzK2ldID0gMDtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogYmxpdF9uYXRcbmZ1bmN0aW9uIGJsaXRfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIsIGxlbikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBuYXQxLmRhdGFbb2ZzMStpXSA9IG5hdDIuZGF0YVtvZnMyK2ldO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXRfZGlnaXRfbmF0XG5mdW5jdGlvbiBzZXRfZGlnaXRfbmF0KG5hdCwgb2ZzLCBkaWdpdCkge1xuICBuYXQuZGF0YVtvZnNdID0gZGlnaXQ7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBudGhfZGlnaXRfbmF0XG5mdW5jdGlvbiBudGhfZGlnaXRfbmF0KG5hdCwgb2ZzKSB7XG4gIHJldHVybiBuYXQuZGF0YVtvZnNdO1xufVxuXG4vL1Byb3ZpZGVzOiBzZXRfZGlnaXRfbmF0X25hdGl2ZVxuZnVuY3Rpb24gc2V0X2RpZ2l0X25hdF9uYXRpdmUobmF0LCBvZnMsIGRpZ2l0KSB7XG4gIG5hdC5kYXRhW29mc10gPSBkaWdpdDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IG50aF9kaWdpdF9uYXRfbmF0aXZlXG5mdW5jdGlvbiBudGhfZGlnaXRfbmF0X25hdGl2ZShuYXQsIG9mcykge1xuICByZXR1cm4gbmF0LmRhdGFbb2ZzXTtcbn1cblxuLy9Qcm92aWRlczogbnVtX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIG51bV9kaWdpdHNfbmF0KG5hdCwgb2ZzLCBsZW4pIHtcbiAgZm9yKHZhciBpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZihuYXQuZGF0YVtvZnMraV0gIT0gMCkgcmV0dXJuIGkrMTtcbiAgfVxuICByZXR1cm4gMTsgLy8gMCBjb3VudHMgYXMgMSBkaWdpdFxufVxuXG4vL1Byb3ZpZGVzOiBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXRcbmZ1bmN0aW9uIG51bV9sZWFkaW5nX3plcm9fYml0c19pbl9kaWdpdChuYXQsIG9mcykge1xuICB2YXIgYSA9IG5hdC5kYXRhW29mc107XG4gIHZhciBiID0gMDtcbiAgaWYoYSAmIDB4RkZGRjAwMDApIHsgYiArPTE2OyBhID4+Pj0xNjsgfVxuICBpZihhICYgMHhGRjAwKSAgICAgeyBiICs9IDg7IGEgPj4+PSA4OyB9XG4gIGlmKGEgJiAweEYwKSAgICAgICB7IGIgKz0gNDsgYSA+Pj49IDQ7IH1cbiAgaWYoYSAmIDEyKSAgICAgICAgIHsgYiArPSAyOyBhID4+Pj0gMjsgfVxuICBpZihhICYgMikgICAgICAgICAgeyBiICs9IDE7IGEgPj4+PSAxOyB9XG4gIGlmKGEgJiAxKSAgICAgICAgICB7IGIgKz0gMTsgfVxuICByZXR1cm4gMzIgLSBiO1xufVxuXG4vL1Byb3ZpZGVzOiBpc19kaWdpdF9pbnRcbmZ1bmN0aW9uIGlzX2RpZ2l0X2ludChuYXQsIG9mcykge1xuICBpZiAobmF0LmRhdGFbb2ZzXSA+PSAwKSByZXR1cm4gMVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfemVyb1xuZnVuY3Rpb24gaXNfZGlnaXRfemVybyhuYXQsIG9mcykge1xuICBpZihuYXQuZGF0YVtvZnNdID09IDApIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaXNfZGlnaXRfb2RkXG5mdW5jdGlvbiBpc19kaWdpdF9vZGQobmF0LCBvZnMpIHtcbiAgaWYobmF0LmRhdGFbb2ZzXSAmIDEpIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogaW5jcl9uYXRcbmZ1bmN0aW9uIGluY3JfbmF0KG5hdCwgb2ZzLCBsZW4sIGNhcnJ5X2luKSB7XG4gIHZhciBjYXJyeSA9IGNhcnJ5X2luO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQuZGF0YVtvZnMraV0gPj4+IDApICsgY2Fycnk7XG4gICAgbmF0LmRhdGFbb2ZzK2ldID0gKHggfCAwKTtcbiAgICBpZih4ID09ICh4ID4+PiAwKSkge1xuICAgICAgY2FycnkgPSAwO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcnJ5ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhcnJ5O1xufVxuXG4vLyBsZW4xID49IGxlbjJcbi8vUHJvdmlkZXM6IGFkZF9uYXRcbi8vUmVxdWlyZXM6IGluY3JfbmF0XG5mdW5jdGlvbiBhZGRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIGNhcnJ5X2luKSB7XG4gIHZhciBjYXJyeSA9IGNhcnJ5X2luO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0MS5kYXRhW29mczEraV0gPj4+IDApICsgKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSArIGNhcnJ5O1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0geFxuICAgIGlmKHggPT0gKHggPj4+IDApKSB7XG4gICAgICBjYXJyeSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcnJ5ID0gMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluY3JfbmF0KG5hdDEsIG9mczErbGVuMiwgbGVuMS1sZW4yLCBjYXJyeSk7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBsZW1lbnRfbmF0XG5mdW5jdGlvbiBjb21wbGVtZW50X25hdChuYXQsIG9mcywgbGVuKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIG5hdC5kYXRhW29mcytpXSA9ICgtMSA+Pj4gMCkgLSAobmF0LmRhdGFbb2ZzK2ldID4+PiAwKTtcbiAgfVxufVxuXG4vLyBvY2FtbCBmbGlwcyBjYXJyeV9pblxuLy9Qcm92aWRlczogZGVjcl9uYXRcbmZ1bmN0aW9uIGRlY3JfbmF0KG5hdCwgb2ZzLCBsZW4sIGNhcnJ5X2luKSB7XG4gIHZhciBib3Jyb3cgPSAoY2FycnlfaW4gPT0gMSkgPyAwIDogMTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIHggPSAobmF0LmRhdGFbb2ZzK2ldID4+PjApIC0gYm9ycm93O1xuICAgIG5hdC5kYXRhW29mcytpXSA9IHg7XG4gICAgaWYgKHggPj0gMCkge1xuICAgICAgYm9ycm93ID0gMDtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3Jyb3cgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKGJvcnJvdyA9PSAxKSA/IDAgOiAxO1xufVxuXG4vLyBvY2FtbCBmbGlwcyBjYXJyeV9pblxuLy8gbGVuMSA+PSBsZW4yXG4vL1Byb3ZpZGVzOiBzdWJfbmF0XG4vL1JlcXVpcmVzOiBkZWNyX25hdFxuZnVuY3Rpb24gc3ViX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBsZW4yLCBjYXJyeV9pbikge1xuICB2YXIgYm9ycm93ID0gKGNhcnJ5X2luID09IDEpID8gMCA6IDE7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4yOyBpKyspIHtcbiAgICB2YXIgeCA9IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCkgLSAobmF0Mi5kYXRhW29mczIraV0gPj4+IDApIC0gYm9ycm93O1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0geDtcbiAgICBpZiAoeCA+PSAwKSB7XG4gICAgICBib3Jyb3cgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3Jyb3cgPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVjcl9uYXQobmF0MSwgb2ZzMStsZW4yLCBsZW4xLWxlbjIsIChib3Jyb3c9PTEpPzA6MSk7XG59XG5cbi8vIG5hdDEgKz0gbmF0MiAqIG5hdDNbb2ZzM11cbi8vIGxlbjEgPj0gbGVuMlxuLy9Qcm92aWRlczogbXVsdF9kaWdpdF9uYXRcbi8vUmVxdWlyZXM6IGFkZF9uYXQsIG5hdF9vZl9hcnJheVxuZnVuY3Rpb24gbXVsdF9kaWdpdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0Mywgb2ZzMykge1xuICB2YXIgY2FycnkgPSAwO1xuICB2YXIgYSA9IChuYXQzLmRhdGFbb2ZzM10gPj4+IDApO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuMjsgaSsrKSB7XG4gICAgdmFyIHgxID0gKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSArIChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkgKiAoYSAmIDB4MDAwMEZGRkYpICsgY2Fycnk7XG4gICAgdmFyIHgyID0gKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSAqIChhID4+PiAxNik7XG4gICAgY2FycnkgPSBNYXRoLmZsb29yKHgyLzY1NTM2KTtcbiAgICB2YXIgeDMgPSB4MSArICh4MiAlIDY1NTM2KSAqIDY1NTM2O1xuICAgIG5hdDEuZGF0YVtvZnMxK2ldID0geDM7XG4gICAgY2FycnkgKz0gTWF0aC5mbG9vcih4My80Mjk0OTY3Mjk2KTtcbiAgfVxuXG4gIGlmKGxlbjIgPCBsZW4xICYmIGNhcnJ5KSB7XG4gICAgcmV0dXJuIGFkZF9uYXQobmF0MSwgb2ZzMStsZW4yLCBsZW4xLWxlbjIsIG5hdF9vZl9hcnJheShbY2FycnldKSwgMCwgMSwgMCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNhcnJ5O1xuICB9XG59XG5cbi8vIG5hdDEgKz0gbmF0MiAqIG5hdDNcbi8vIGxlbjEgPj0gbGVuMiArIGxlbjMuXG4vL1Byb3ZpZGVzOiBtdWx0X25hdFxuLy9SZXF1aXJlczogbXVsdF9kaWdpdF9uYXRcbmZ1bmN0aW9uIG11bHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIsIG5hdDMsIG9mczMsIGxlbjMpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjM7IGkrKykge1xuICAgIGNhcnJ5ICs9IG11bHRfZGlnaXRfbmF0KG5hdDEsIG9mczEraSwgbGVuMS1pLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXQzLCBvZnMzK2kpO1xuICB9XG4gIHJldHVybiBjYXJyeTtcbn1cblxuLy8gbmF0MSA9IDIgKiBuYXQxICsgbmF0MiAqIG5hdDJcbi8vIGxlbjEgPj0gMiAqIGxlbjJcbi8vUHJvdmlkZXM6IHNxdWFyZV9uYXRcbi8vUmVxdWlyZXM6IG11bHRfbmF0LCBhZGRfbmF0XG5mdW5jdGlvbiBzcXVhcmVfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgY2FycnkgKz0gYWRkX25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQxLCBvZnMxLCBsZW4xLCAwKTtcbiAgY2FycnkgKz0gbXVsdF9uYXQobmF0MSwgb2ZzMSwgbGVuMSwgbmF0Miwgb2ZzMiwgbGVuMiwgbmF0Miwgb2ZzMiwgbGVuMik7XG4gIHJldHVybiBjYXJyeTtcbn1cblxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X2xlZnRfbmF0XG5mdW5jdGlvbiBzaGlmdF9sZWZ0X25hdChuYXQxLCBvZnMxLCBsZW4xLCBuYXQyLCBvZnMyLCBuYml0cykge1xuICBpZihuYml0cyA9PSAwKSB7XG4gICAgbmF0Mi5kYXRhW29mczJdID0gMDtcbiAgICByZXR1cm4gMDtcbiAgfVxuICB2YXIgd3JhcCA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsZW4xOyBpKyspIHtcbiAgICB2YXIgYSA9IChuYXQxLmRhdGFbb2ZzMStpXSA+Pj4gMCk7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSAoYSA8PCBuYml0cykgfCB3cmFwO1xuICAgIHdyYXAgPSBhID4+PiAoMzIgLSBuYml0cyk7XG4gIH1cbiAgbmF0Mi5kYXRhW29mczJdID0gd3JhcDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vIEFzc3VtaW5nIGMgPiBhLCByZXR1cm5zIFtxdW90aWVudCwgcmVtYWluZGVyXSBvZiAoYTw8MzIgKyBiKS9jXG4vL1Byb3ZpZGVzOiBkaXZfaGVscGVyXG5mdW5jdGlvbiBkaXZfaGVscGVyKGEsIGIsIGMpIHtcbiAgdmFyIHggPSBhICogNjU1MzYgKyAoYj4+PjE2KTtcbiAgdmFyIHkgPSBNYXRoLmZsb29yKHgvYykgKiA2NTUzNjtcbiAgdmFyIHogPSAoeCAlIGMpICogNjU1MzY7XG4gIHZhciB3ID0geiArIChiICYgMHgwMDAwRkZGRik7XG4gIHJldHVybiBbeSArIE1hdGguZmxvb3Iody9jKSwgdyAlIGNdO1xufVxuXG4vLyBuYXQxW29mczErbGVuXSA8IG5hdDJbb2ZzMl1cbi8vUHJvdmlkZXM6IGRpdl9kaWdpdF9uYXRcbi8vUmVxdWlyZXM6IGRpdl9oZWxwZXJcbmZ1bmN0aW9uIGRpdl9kaWdpdF9uYXQobmF0cSwgb2ZzcSwgbmF0ciwgb2ZzciwgbmF0MSwgb2ZzMSwgbGVuLCBuYXQyLCBvZnMyKSB7XG4gIHZhciByZW0gPSAobmF0MS5kYXRhW29mczErbGVuLTFdID4+PjApO1xuICAvLyBuYXRxW29mc3ErbGVuLTFdIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVybyAoZHVlIHRvIHRoZSBNU0QgcmVxdWlyZW1lbnQpLFxuICAvLyBhbmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuIHRvLlxuICBmb3IodmFyIGkgPSBsZW4tMjsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgeCA9IGRpdl9oZWxwZXIocmVtLCAobmF0MS5kYXRhW29mczEraV0gPj4+IDApLCAobmF0Mi5kYXRhW29mczJdID4+PiAwKSk7XG4gICAgbmF0cS5kYXRhW29mc3EraV0gPSB4WzBdO1xuICAgIHJlbSA9IHhbMV07XG4gIH1cbiAgbmF0ci5kYXRhW29mc3JdID0gcmVtO1xuICByZXR1cm4gMDtcbn1cblxuLy8gbmF0MVtuYXQyOl0gOj0gbmF0MSAvIG5hdDJcbi8vIG5hdDFbOm5hdDJdIDo9IG5hdDEgJSBuYXQyXG4vLyBsZW4xID4gbGVuMiwgbmF0MltvZnMyK2xlbjItMV0gPiBuYXQxW29mczErbGVuMS0xXVxuLy9Qcm92aWRlczogZGl2X25hdFxuLy9SZXF1aXJlczogZGl2X2RpZ2l0X25hdCwgZGl2X2hlbHBlciwgbnVtX2xlYWRpbmdfemVyb19iaXRzX2luX2RpZ2l0LCBzaGlmdF9sZWZ0X25hdCwgc2hpZnRfcmlnaHRfbmF0LCBjcmVhdGVfbmF0LCBzZXRfdG9femVyb19uYXQsIG11bHRfZGlnaXRfbmF0LCBzdWJfbmF0LCBjb21wYXJlX25hdCwgbmF0X29mX2FycmF5XG5mdW5jdGlvbiBkaXZfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIpIHtcbiAgaWYobGVuMiA9PSAxKSB7XG4gICAgZGl2X2RpZ2l0X25hdChuYXQxLCBvZnMxKzEsIG5hdDEsIG9mczEsIG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIpO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmFyIHMgPSBudW1fbGVhZGluZ196ZXJvX2JpdHNfaW5fZGlnaXQobmF0Miwgb2ZzMitsZW4yLTEpO1xuICBzaGlmdF9sZWZ0X25hdChuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoWzBdKSwgMCwgcyk7XG4gIHNoaWZ0X2xlZnRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdF9vZl9hcnJheShbMF0pLCAwLCBzKTtcblxuICB2YXIgZCA9IChuYXQyLmRhdGFbb2ZzMitsZW4yLTFdID4+PiAwKSArIDE7XG4gIHZhciBhID0gY3JlYXRlX25hdChsZW4yKzEpO1xuICBmb3IgKHZhciBpID0gbGVuMSAtIDE7IGkgPj0gbGVuMjsgaS0tKSB7XG4gICAgLy8gRGVjZW50IGxvd2VyIGJvdW5kIG9uIHF1b1xuICAgIHZhciBxdW8gPSBkID09IDQyOTQ5NjcyOTYgPyAobmF0MS5kYXRhW29mczEraV0gPj4+IDApIDogZGl2X2hlbHBlcigobmF0MS5kYXRhW29mczEraV0gPj4+IDApLCAobmF0MS5kYXRhW29mczEraS0xXSA+Pj4wKSwgZClbMF07XG4gICAgc2V0X3RvX3plcm9fbmF0KGEsIDAsIGxlbjIrMSk7XG4gICAgbXVsdF9kaWdpdF9uYXQoYSwgMCwgbGVuMisxLCBuYXQyLCBvZnMyLCBsZW4yLCBuYXRfb2ZfYXJyYXkoW3F1b10pLCAwKTtcbiAgICBzdWJfbmF0KG5hdDEsIG9mczEraS1sZW4yLCBsZW4yKzEsIGEsIDAsIGxlbjIrMSwgMSk7XG5cbiAgICB3aGlsZSAobmF0MS5kYXRhW29mczEraV0gIT0gMCB8fCBjb21wYXJlX25hdChuYXQxLCBvZnMxK2ktbGVuMiwgbGVuMiwgbmF0Miwgb2ZzMiwgbGVuMikgPj0gMCkge1xuICAgICAgcXVvID0gcXVvICsgMTtcbiAgICAgIHN1Yl9uYXQobmF0MSwgb2ZzMStpLWxlbjIsIGxlbjIrMSwgbmF0Miwgb2ZzMiwgbGVuMiwgMSk7XG4gICAgfVxuXG4gICAgbmF0MS5kYXRhW29mczEraV0gPSBxdW87XG4gIH1cblxuICBzaGlmdF9yaWdodF9uYXQobmF0MSwgb2ZzMSwgbGVuMiwgbmF0X29mX2FycmF5KFswXSksIDAsIHMpOyAvLyBzaGlmdCByZW1haW5kZXJcbiAgc2hpZnRfcmlnaHRfbmF0KG5hdDIsIG9mczIsIGxlbjIsIG5hdF9vZl9hcnJheShbMF0pLCAwLCBzKTsgLy8gcmVzdG9yZVxuICByZXR1cm4gMDtcbn1cblxuXG4vLyAwIDw9IHNoaWZ0IDwgMzJcbi8vUHJvdmlkZXM6IHNoaWZ0X3JpZ2h0X25hdFxuZnVuY3Rpb24gc2hpZnRfcmlnaHRfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIG5iaXRzKSB7XG4gIGlmKG5iaXRzID09IDApIHtcbiAgICBuYXQyLmRhdGFbb2ZzMl0gPSAwO1xuICAgIHJldHVybiAwO1xuICB9XG4gIHZhciB3cmFwID0gMDtcbiAgZm9yKHZhciBpID0gbGVuMS0xOyBpID49IDA7IGktLSkge1xuICAgIHZhciBhID0gbmF0MS5kYXRhW29mczEraV0gPj4+IDA7XG4gICAgbmF0MS5kYXRhW29mczEraV0gPSAoYSA+Pj4gbmJpdHMpIHwgd3JhcDtcbiAgICB3cmFwID0gYSA8PCAoMzIgLSBuYml0cyk7XG4gIH1cbiAgbmF0Mi5kYXRhW29mczJdID0gd3JhcDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNvbXBhcmVfZGlnaXRzX25hdFxuZnVuY3Rpb24gY29tcGFyZV9kaWdpdHNfbmF0KG5hdDEsIG9mczEsIG5hdDIsIG9mczIpIHtcbiAgaWYobmF0MS5kYXRhW29mczFdID4gbmF0Mi5kYXRhW29mczJdKSByZXR1cm4gMTtcbiAgaWYobmF0MS5kYXRhW29mczFdIDwgbmF0Mi5kYXRhW29mczJdKSByZXR1cm4gLTE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wYXJlX25hdFxuLy9SZXF1aXJlczogbnVtX2RpZ2l0c19uYXRcbmZ1bmN0aW9uIGNvbXBhcmVfbmF0KG5hdDEsIG9mczEsIGxlbjEsIG5hdDIsIG9mczIsIGxlbjIpIHtcbiAgdmFyIGEgPSBudW1fZGlnaXRzX25hdChuYXQxLCBvZnMxLCBsZW4xKTtcbiAgdmFyIGIgPSBudW1fZGlnaXRzX25hdChuYXQyLCBvZnMyLCBsZW4yKTtcbiAgaWYoYSA+IGIpIHJldHVybiAxO1xuICBpZihhIDwgYikgcmV0dXJuIC0xO1xuICBmb3IodmFyIGkgPSBsZW4xIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoKG5hdDEuZGF0YVtvZnMxK2ldID4+PiAwKSA+IChuYXQyLmRhdGFbb2ZzMitpXSA+Pj4gMCkpIHJldHVybiAxO1xuICAgIGlmICgobmF0MS5kYXRhW29mczEraV0gPj4+IDApIDwgKG5hdDIuZGF0YVtvZnMyK2ldID4+PiAwKSkgcmV0dXJuIC0xO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjb21wYXJlX25hdF9yZWFsXG4vL1JlcXVpcmVzOiBjb21wYXJlX25hdFxuZnVuY3Rpb24gY29tcGFyZV9uYXRfcmVhbChuYXQxLG5hdDIpe1xuICByZXR1cm4gY29tcGFyZV9uYXQobmF0MSwwLG5hdDEuZGF0YS5sZW5ndGgsbmF0MiwwLG5hdDIuZGF0YS5sZW5ndGgpO1xufVxuXG4vL1Byb3ZpZGVzOiBsYW5kX2RpZ2l0X25hdFxuZnVuY3Rpb24gbGFuZF9kaWdpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMikge1xuICBuYXQxLmRhdGFbb2ZzMV0gJj0gbmF0Mi5kYXRhW29mczJdO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogbG9yX2RpZ2l0X25hdFxuZnVuY3Rpb24gbG9yX2RpZ2l0X25hdChuYXQxLCBvZnMxLCBuYXQyLCBvZnMyKSB7XG4gIG5hdDEuZGF0YVtvZnMxXSB8PSBuYXQyLmRhdGFbb2ZzMl07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBseG9yX2RpZ2l0X25hdFxuZnVuY3Rpb24gbHhvcl9kaWdpdF9uYXQobmF0MSwgb2ZzMSwgbmF0Miwgb2ZzMikge1xuICBuYXQxLmRhdGFbb2ZzMV0gXj0gbmF0Mi5kYXRhW29mczJdO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBzZXJpYWxpemVfbmF0XG5mdW5jdGlvbiBzZXJpYWxpemVfbmF0KHdyaXRlciwgbmF0LCBzeil7XG4gIHZhciBsZW4gPSBuYXQuZGF0YS5sZW5ndGg7XG4gIHdyaXRlci53cml0ZSgzMiwgbGVuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKXtcbiAgICB3cml0ZXIud3JpdGUoMzIsIG5hdC5kYXRhW2ldKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHN6WzFdID0gbGVuICogODtcbn1cblxuLy9Qcm92aWRlczogZGVzZXJpYWxpemVfbmF0XG4vL1JlcXVpcmVzOiBNbE5hdFxuZnVuY3Rpb24gZGVzZXJpYWxpemVfbmF0KHJlYWRlciwgc3ope1xuICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgdmFyIG5hdCA9IG5ldyBNbE5hdChsZW4pO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspe1xuICAgIG5hdC5kYXRhW2ldID0gcmVhZGVyLnJlYWQzMnMoKTtcbiAgfVxuICBzelswXSA9IGxlbiAqIDQ7XG4gIHJldHVybiBuYXQ7XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTQgSHVnbyBIZXV6YXJkXG5cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlXG52YXIgY2FtbF9ncl9zdGF0ZTtcblxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVcbi8vUmVxdWlyZXM6IGNhbWxfbmFtZWRfdmFsdWUsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWF5YmVfYXR0YWNoX2JhY2t0cmFjZVxuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9nZXQoKSB7XG4gIGlmKGNhbWxfZ3Jfc3RhdGUpIHtcbiAgICByZXR1cm4gY2FtbF9ncl9zdGF0ZTtcbiAgfVxuICB0aHJvdyBjYW1sX21heWJlX2F0dGFjaF9iYWNrdHJhY2UoWzAsY2FtbF9uYW1lZF92YWx1ZShcIkdyYXBoaWNzLkdyYXBoaWNfZmFpbHVyZVwiKSwgY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcIk5vdCBpbml0aWFsaXplZFwiKV0pO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zdGF0ZV9zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGUsY2FtbF9ncl9zdGF0ZV9pbml0XG5mdW5jdGlvbiBjYW1sX2dyX3N0YXRlX3NldChjdHgpIHtcbiAgY2FtbF9ncl9zdGF0ZT1jdHg7XG4gIGNhbWxfZ3Jfc3RhdGVfaW5pdCgpXG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX29wZW5fZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX3NldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfb3Blbl9ncmFwaChpbmZvKXtcbiAgdmFyIGluZm8gPSBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhpbmZvKTtcbiAgZnVuY3Rpb24gZ2V0KG5hbWUpe1xuICAgIHZhciByZXMgPSBpbmZvLm1hdGNoKFwiKF58LCkgKlwiK25hbWUrXCIgKj0gKihbYS16QS1aMC05X10rKSAqKCx8JClcIik7XG4gICAgaWYocmVzKSByZXR1cm4gcmVzWzJdO1xuICB9XG4gIHZhciBzcGVjcyA9IFtdO1xuICBpZighKGluZm89PVwiXCIpKSBzcGVjcy5wdXNoKGluZm8pO1xuICB2YXIgdGFyZ2V0ID0gZ2V0KFwidGFyZ2V0XCIpO1xuICBpZighdGFyZ2V0KSB0YXJnZXQ9XCJcIjtcbiAgdmFyIHN0YXR1cyA9IGdldChcInN0YXR1c1wiKTtcbiAgaWYoIXN0YXR1cykgc3BlY3MucHVzaChcInN0YXR1cz0xXCIpXG5cbiAgdmFyIHcgPSBnZXQoXCJ3aWR0aFwiKTtcbiAgdyA9IHc/cGFyc2VJbnQodyk6MjAwO1xuICBzcGVjcy5wdXNoKFwid2lkdGg9XCIrdyk7XG5cbiAgdmFyIGggPSBnZXQoXCJoZWlnaHRcIik7XG4gIGggPSBoP3BhcnNlSW50KGgpOjIwMDtcbiAgc3BlY3MucHVzaChcImhlaWdodD1cIitoKTtcblxuICB2YXIgd2luID0gZ2xvYmFsVGhpcy5vcGVuKFwiYWJvdXQ6YmxhbmtcIix0YXJnZXQsc3BlY3Muam9pbihcIixcIikpO1xuICBpZighd2luKSB7Y2FtbF9mYWlsd2l0aChcIkdyYXBoaWNzLm9wZW5fZ3JhcGg6IGNhbm5vdCBvcGVuIHRoZSB3aW5kb3dcIil9XG4gIHZhciBkb2MgPSB3aW4uZG9jdW1lbnQ7XG4gIHZhciBjYW52YXMgPSBkb2MuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gdztcbiAgY2FudmFzLmhlaWdodCA9IGg7XG4gIHZhciBjdHggPSBjYW1sX2dyX3N0YXRlX2NyZWF0ZShjYW52YXMsdyxoKTtcbiAgY3R4LnNldF90aXRsZSA9IGZ1bmN0aW9uICh0aXRsZSkge1xuICAgIGRvYy50aXRsZSA9IHRpdGxlO1xuICB9O1xuICBjYW1sX2dyX3N0YXRlX3NldChjdHgpO1xuICB2YXIgYm9keSA9IGRvYy5ib2R5O1xuICBib2R5LnN0eWxlLm1hcmdpbiA9IFwiMHB4XCI7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc3RhdGVfaW5pdFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zZXRfY29sb3IsY2FtbF9ncl9tb3ZldG8sY2FtbF9ncl9yZXNpemVfd2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF9saW5lX3dpZHRoLGNhbWxfZ3Jfc2V0X3RleHRfc2l6ZSxjYW1sX2dyX3NldF9mb250XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3NldF93aW5kb3dfdGl0bGVcbmZ1bmN0aW9uIGNhbWxfZ3Jfc3RhdGVfaW5pdCgpe1xuICBjYW1sX2dyX21vdmV0byhjYW1sX2dyX3N0YXRlLngsY2FtbF9ncl9zdGF0ZS55KTtcbiAgY2FtbF9ncl9yZXNpemVfd2luZG93KGNhbWxfZ3Jfc3RhdGUud2lkdGgsY2FtbF9ncl9zdGF0ZS5oZWlnaHQpO1xuICBjYW1sX2dyX3NldF9saW5lX3dpZHRoKGNhbWxfZ3Jfc3RhdGUubGluZV93aWR0aCk7XG4gIGNhbWxfZ3Jfc2V0X3RleHRfc2l6ZShjYW1sX2dyX3N0YXRlLnRleHRfc2l6ZSk7XG4gIGNhbWxfZ3Jfc2V0X2ZvbnQoY2FtbF9ncl9zdGF0ZS5mb250KTtcbiAgY2FtbF9ncl9zZXRfY29sb3IoY2FtbF9ncl9zdGF0ZS5jb2xvcik7XG4gIGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZShjYW1sX2dyX3N0YXRlLnRpdGxlKTtcbiAgLy9jYW1sX2dyX3Jlc2l6ZV93aW5kb3cgbWlnaHQgcmVzZXQgc29tZSBjYW52YXMnIHByb3BlcnRpZXNcbiAgY2FtbF9ncl9zdGF0ZS5jb250ZXh0LnRleHRCYXNlbGluZSA9ICdib3R0b20nO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3N0YXRlX2NyZWF0ZVxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuZnVuY3Rpb24gY2FtbF9ncl9zdGF0ZV9jcmVhdGUoY2FudmFzLHcsaCl7XG4gIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgcmV0dXJuIHtcbiAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgIGNhbnZhcyA6IGNhbnZhcyxcbiAgICB4IDogMCxcbiAgICB5IDogMCxcbiAgICB3aWR0aCA6IHcsXG4gICAgaGVpZ2h0IDogaCxcbiAgICBsaW5lX3dpZHRoIDogMSxcbiAgICBmb250IDogY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhcImZpeGVkXCIpLFxuICAgIHRleHRfc2l6ZSA6IDI2LFxuICAgIGNvbG9yIDogMHgwMDAwMDAsXG4gICAgdGl0bGUgOiBjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpXG4gIH07XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZG9jX29mX3N0YXRlXG5mdW5jdGlvbiBjYW1sX2dyX2RvY19vZl9zdGF0ZShzdGF0ZSkge1xuICBpZihzdGF0ZS5jYW52YXMub3duZXJEb2N1bWVudClcbiAgICByZXR1cm4gc3RhdGUuY2FudmFzLm93bmVyRG9jdW1lbnQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xvc2VfZ3JhcGhcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2Nsb3NlX2dyYXBoKCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jYW52YXMud2lkdGggPSAwO1xuICBzLmNhbnZhcy5oZWlnaHQgPSAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfd2luZG93X3RpdGxlXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X3dpbmRvd190aXRsZShuYW1lKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLnRpdGxlID0gbmFtZTtcbiAgdmFyIGpzbmFtZSA9IGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKG5hbWUpO1xuICBpZihzLnNldF90aXRsZSkgcy5zZXRfdGl0bGUoanNuYW1lKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcmVzaXplX3dpbmRvd1xuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfcmVzaXplX3dpbmRvdyh3LGgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KClcbiAgcy53aWR0aCA9IHc7XG4gIHMuaGVpZ2h0ID0gaDtcbiAgcy5jYW52YXMud2lkdGggPSB3O1xuICBzLmNhbnZhcy5oZWlnaHQgPSBoO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9jbGVhcl9ncmFwaFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfY2xlYXJfZ3JhcGgoKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNhbnZhcy53aWR0aCA9IHMud2lkdGg7XG4gIHMuY2FudmFzLmhlaWdodCA9IHMuaGVpZ2h0O1xuICAvLyAgcy5jb250ZXh0LnN0cm9rZVJlY3QgKDAuLCAwLiwgcy53aWR0aCwgcy5oZWlnaHQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zaXplX3hcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NpemVfeCgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLndpZHRoO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaXplX3lcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX3NpemVfeSgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLmhlaWdodDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF9jb2xvclxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2NvbG9yKGNvbG9yKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBmdW5jdGlvbiBjb252ZXJ0KG51bWJlcikge1xuICAgIHZhciBzdHIgPSAnJyArIG51bWJlci50b1N0cmluZygxNik7XG4gICAgd2hpbGUgKHN0ci5sZW5ndGggPCAyKSBzdHIgPSAnMCcgKyBzdHI7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICB2YXJcbiAgciA9IChjb2xvciA+PiAxNikgJiAweGZmLFxuICBnID0gKGNvbG9yID4+IDgpICAmIDB4ZmYsXG4gIGIgPSAoY29sb3IgPj4gMCkgICYgMHhmZjtcbiAgcy5jb2xvcj1jb2xvcjtcbiAgdmFyIGNfc3RyID0gJyMnICsgY29udmVydChyKSArIGNvbnZlcnQoZykgKyBjb252ZXJ0KGIpO1xuICBzLmNvbnRleHQuZmlsbFN0eWxlID0gICBjX3N0cjtcbiAgcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gY19zdHI7XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9wbG90XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9wbG90KHgseSl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIGltPXMuY29udGV4dC5jcmVhdGVJbWFnZURhdGEoMSwxKTtcbiAgdmFyIGQgPSBpbS5kYXRhO1xuICB2YXIgY29sb3IgPSBzLmNvbG9yO1xuICBkWzBdID0gKGNvbG9yID4+IDE2KSAmIDB4ZmY7IC8vclxuICBkWzFdID0gKGNvbG9yID4+IDgpICAmIDB4ZmYsIC8vZ1xuICBkWzJdID0gKGNvbG9yID4+IDApICAmIDB4ZmY7IC8vYlxuICBkWzNdID0gMHhGRjsgLy9hXG4gIHMueD14O1xuICBzLnk9eTtcbiAgcy5jb250ZXh0LnB1dEltYWdlRGF0YShpbSx4LHMuaGVpZ2h0IC0geSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3BvaW50X2NvbG9yXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9wb2ludF9jb2xvcih4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBpbT1zLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKHgscy5oZWlnaHQgLSB5LDEsMSk7XG4gIHZhciBkID0gaW0uZGF0YTtcbiAgcmV0dXJuIChkWzBdIDw8IDE2KSArIChkWzFdIDw8IDgpICsgZFsyXTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbW92ZXRvXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9tb3ZldG8oeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLng9eDtcbiAgcy55PXk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2N1cnJlbnRfeFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfY3VycmVudF94KCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcmV0dXJuIHMueFxufVxuLy9Qcm92aWRlczogY2FtbF9ncl9jdXJyZW50X3lcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2N1cnJlbnRfeSgpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLnlcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbGluZXRvXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9saW5ldG8oeCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIHMuY29udGV4dC5tb3ZlVG8ocy54LHMuaGVpZ2h0IC0gcy55KTtcbiAgcy5jb250ZXh0LmxpbmVUbyh4LHMuaGVpZ2h0IC0geSk7XG4gIHMuY29udGV4dC5zdHJva2UoKTtcbiAgcy54PXg7XG4gIHMueT15O1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19yZWN0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9kcmF3X3JlY3QoeCx5LHcsaCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LnN0cm9rZVJlY3QoeCxzLmhlaWdodCAtIHksdywtaCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2FyY19hdXhcbmZ1bmN0aW9uIGNhbWxfZ3JfYXJjX2F1eChjdHgsY3gsY3kscnkscngsYTEsYTIpe1xuICB3aGlsZShhMT5hMikgYTIrPTM2MDtcbiAgYTEgLz0gMTgwO1xuICBhMiAvPSAxODA7XG4gIHZhciByb3QgPSAwLHhQb3MseVBvcyx4UG9zX3ByZXYseVBvc19wcmV2O1xuICB2YXIgc3BhY2UgPSAyO1xuICB2YXIgbnVtID0gKCgoYTIgLSBhMSkgKiBNYXRoLlBJICogKChyeCtyeSkvMikpIC8gc3BhY2UpIHwgMDtcbiAgdmFyIGRlbHRhID0gKGEyIC0gYTEpICogTWF0aC5QSSAvIG51bTtcbiAgdmFyIGkgPSBhMSAqIE1hdGguUEk7XG4gIGZvciAodmFyIGo9MDtqPD1udW07aisrKXtcbiAgICB4UG9zID0gY3ggLSAocnggKiBNYXRoLnNpbihpKSkgKiBNYXRoLnNpbihyb3QgKiBNYXRoLlBJKSArIChyeSAqIE1hdGguY29zKGkpKSAqIE1hdGguY29zKHJvdCAqIE1hdGguUEkpO1xuICAgIHhQb3MgPSB4UG9zLnRvRml4ZWQoMik7XG4gICAgeVBvcyA9IGN5ICsgKHJ5ICogTWF0aC5jb3MoaSkpICogTWF0aC5zaW4ocm90ICogTWF0aC5QSSkgKyAocnggKiBNYXRoLnNpbihpKSkgKiBNYXRoLmNvcyhyb3QgKiBNYXRoLlBJKTtcbiAgICB5UG9zID0geVBvcy50b0ZpeGVkKDIpO1xuICAgIGlmIChqPT0wKSB7XG4gICAgICBjdHgubW92ZVRvKHhQb3MsIHlQb3MpO1xuICAgIH0gZWxzZSBpZiAoeFBvc19wcmV2IT14UG9zIHx8IHlQb3NfcHJldiE9eVBvcyl7XG4gICAgICBjdHgubGluZVRvKHhQb3MsIHlQb3MpO1xuICAgIH1cbiAgICB4UG9zX3ByZXY9eFBvcztcbiAgICB5UG9zX3ByZXY9eVBvcztcbiAgICBpLT0gZGVsdGE7Ly9jY3dcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfYXJjXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldCwgY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfYXJjKHgseSxyeCxyeSxhMSxhMil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjYW1sX2dyX2FyY19hdXgocy5jb250ZXh0LHgscy5oZWlnaHQgLSB5LHJ4LHJ5LGExLGEyKTtcbiAgcy5jb250ZXh0LnN0cm9rZSgpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zZXRfbGluZV93aWR0aFxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3Jfc2V0X2xpbmVfd2lkdGgodyl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5saW5lX3dpZHRoID0gdztcbiAgcy5jb250ZXh0LmxpbmVXaWR0aCA9IHdcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9yZWN0XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX3JlY3QoeCx5LHcsaCl7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmZpbGxSZWN0KHgscy5oZWlnaHQgLSB5LHcsLWgpO1xuICByZXR1cm4gMDtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZmlsbF9wb2x5XG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldFxuZnVuY3Rpb24gY2FtbF9ncl9maWxsX3BvbHkoYXIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMuY29udGV4dC5iZWdpblBhdGgoKTtcbiAgcy5jb250ZXh0Lm1vdmVUbyhhclsxXVsxXSxzLmhlaWdodCAtIGFyWzFdWzJdKTtcbiAgZm9yKHZhciBpID0gMjsgaSA8IGFyLmxlbmd0aDsgaSsrKVxuICAgIHMuY29udGV4dC5saW5lVG8oYXJbaV1bMV0scy5oZWlnaHQgLSBhcltpXVsyXSk7XG4gIHMuY29udGV4dC5saW5lVG8oYXJbMV1bMV0scy5oZWlnaHQgLSBhclsxXVsyXSk7XG4gIHMuY29udGV4dC5maWxsKCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2ZpbGxfYXJjXG4vL1JlcXVpcmVzOiBjYW1sX2dyX3N0YXRlX2dldCwgY2FtbF9ncl9hcmNfYXV4XG5mdW5jdGlvbiBjYW1sX2dyX2ZpbGxfYXJjKHgseSxyeCxyeSxhMSxhMil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgcy5jb250ZXh0LmJlZ2luUGF0aCgpO1xuICBjYW1sX2dyX2FyY19hdXgocy5jb250ZXh0LHgscy5oZWlnaHQgLSB5LHJ4LHJ5LGExLGEyKTtcbiAgcy5jb250ZXh0LmZpbGwoKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHJhd19zdHJcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfc3RyKHN0cil7XG4gIHZhciBzID0gY2FtbF9ncl9zdGF0ZV9nZXQoKTtcbiAgdmFyIG0gPSBzLmNvbnRleHQubWVhc3VyZVRleHQoc3RyKTtcbiAgdmFyIGR4ID0gbS53aWR0aDtcbiAgcy5jb250ZXh0LmZpbGxUZXh0KHN0cixzLngscy5oZWlnaHQgLSBzLnkpO1xuICBzLnggKz0gZHggfCAwO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfZ3JfZHJhd19zdHJcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19jaGFyKGMpe1xuICBjYW1sX2dyX2RyYXdfc3RyKFN0cmluZy5mcm9tQ2hhckNvZGUoYykpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9kcmF3X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9ncl9kcmF3X3N0clxuLy9SZXF1aXJlczogY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfZ3JfZHJhd19zdHJpbmcoc3RyKXtcbiAgY2FtbF9ncl9kcmF3X3N0cihjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzdHIpKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2V0X2ZvbnRcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfZm9udChmKXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBzLmZvbnQgPSBmO1xuICBzLmNvbnRleHQuZm9udCA9IHMudGV4dF9zaXplICsgXCJweCBcIiArIGNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nKHMuZm9udCk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dyX3NldF90ZXh0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl9zZXRfdGV4dF9zaXplKHNpemUpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHMudGV4dF9zaXplID0gc2l6ZTtcbiAgcy5jb250ZXh0LmZvbnQgPSBzLnRleHRfc2l6ZSArIFwicHggXCIgKyBjYW1sX2pzc3RyaW5nX29mX3N0cmluZyhzLmZvbnQpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl90ZXh0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9ncl90ZXh0X3NpemUodHh0KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgdyA9IHMuY29udGV4dC5tZWFzdXJlVGV4dChjYW1sX2pzc3RyaW5nX29mX3N0cmluZyh0eHQpKS53aWR0aDtcbiAgcmV0dXJuIFswLHcscy50ZXh0X3NpemVdO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfbWFrZV9pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfbWFrZV9pbWFnZShhcnIpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHZhciBoID0gYXJyLmxlbmd0aCAtIDEgO1xuICB2YXIgdyA9IGFyclsxXS5sZW5ndGggLSAxO1xuICB2YXIgaW0gPSBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHcsaCk7XG4gIGZvcih2YXIgaT0wO2k8aDtpKyspe1xuICAgIGZvcih2YXIgaj0wO2o8dztqKyspe1xuICAgICAgdmFyIGMgPSBhcnJbaSsxXVtqKzFdO1xuICAgICAgdmFyIG8gPSBpKih3KjQpICsgKGogKiA0KTtcbiAgICAgIGlmKGMgPT0gLTEpIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSAwO1xuICAgICAgICBpbS5kYXRhW28gKyAxXSA9IDA7XG4gICAgICAgIGltLmRhdGFbbyArIDJdID0gMDtcbiAgICAgICAgaW0uZGF0YVtvICsgM10gPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW0uZGF0YVtvICsgMF0gPSBjID4+IDE2ICYgMHhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgMV0gPSBjID4+ICA4ICYgMHhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgMl0gPSBjID4+ICAwICYgMFhmZjtcbiAgICAgICAgaW0uZGF0YVtvICsgM10gPSAweGZmO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfZHVtcF9pbWFnZVxuLy9SZXF1aXJlczogY2FtbF9ncl9zdGF0ZV9nZXRcbmZ1bmN0aW9uIGNhbWxfZ3JfZHVtcF9pbWFnZShpbSl7XG4gIHZhciBkYXRhID0gWzBdXG4gIGZvcih2YXIgaT0wOyBpPGltLmhlaWdodDtpKyspe1xuICAgIGRhdGFbaSsxXSA9IFswXVxuICAgIGZvcih2YXIgaj0wOyBqPGltLndpZHRoO2orKyl7XG4gICAgICB2YXIgbyA9IGkqKGltLndpZHRoKjQpICsgKGogKiA0KSxcbiAgICAgICAgICByID0gaW0uZGF0YVtvKzBdLFxuICAgICAgICAgIGcgPSBpbS5kYXRhW28rMV0sXG4gICAgICAgICAgYiA9IGltLmRhdGFbbysyXTtcbiAgICAgIGRhdGFbaSsxXVtqKzFdID0gKHIgPDwgMTYpICsgKGcgPDwgOCkgKyBiXG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhXG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2RyYXdfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2RyYXdfaW1hZ2UoaW0seCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICBpZighaW0uaW1hZ2UpIHtcbiAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSBzLndpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBzLmhlaWdodDtcbiAgICBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnB1dEltYWdlRGF0YShpbSwwLDApO1xuICAgIHZhciBpbWFnZSA9IG5ldyBnbG9iYWxUaGlzLkltYWdlKCk7XG4gICAgaW1hZ2Uub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcy5jb250ZXh0LmRyYXdJbWFnZShpbWFnZSx4LHMuaGVpZ2h0IC0gaW0uaGVpZ2h0IC0geSk7XG4gICAgICBpbS5pbWFnZSA9IGltYWdlO1xuICAgIH1cbiAgICBpbWFnZS5zcmMgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvcG5nXCIpO1xuICB9IGVsc2Uge1xuICAgIHMuY29udGV4dC5kcmF3SW1hZ2UoaW0uaW1hZ2UseCxzLmhlaWdodCAtIGltLmhlaWdodCAtIHkpO1xuICB9XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9jcmVhdGVfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2NyZWF0ZV9pbWFnZSh4LHkpe1xuICB2YXIgcyA9IGNhbWxfZ3Jfc3RhdGVfZ2V0KCk7XG4gIHJldHVybiBzLmNvbnRleHQuY3JlYXRlSW1hZ2VEYXRhKHgseSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2JsaXRfaW1hZ2Vcbi8vUmVxdWlyZXM6IGNhbWxfZ3Jfc3RhdGVfZ2V0XG5mdW5jdGlvbiBjYW1sX2dyX2JsaXRfaW1hZ2UoaW0seCx5KXtcbiAgdmFyIHMgPSBjYW1sX2dyX3N0YXRlX2dldCgpO1xuICB2YXIgaW0yID0gcy5jb250ZXh0LmdldEltYWdlRGF0YSh4LHMuaGVpZ2h0IC0gaW0uaGVpZ2h0IC0geSxpbS53aWR0aCxpbS5oZWlnaHQpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGltMi5kYXRhLmxlbmd0aDsgaSs9NCl7XG4gICAgaW0uZGF0YVtpXSA9IGltMi5kYXRhW2ldO1xuICAgIGltLmRhdGFbaSsxXSA9IGltMi5kYXRhW2krMV07XG4gICAgaW0uZGF0YVtpKzJdID0gaW0yLmRhdGFbaSsyXTtcbiAgICBpbS5kYXRhW2krM10gPSBpbTIuZGF0YVtpKzNdO1xuICB9XG4gIHJldHVybiAwO1xufVxuLy9Qcm92aWRlczogY2FtbF9ncl9zaWdpb19oYW5kbGVyXG5mdW5jdGlvbiBjYW1sX2dyX3NpZ2lvX2hhbmRsZXIoKXtyZXR1cm4gMH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfc2lnaW9fc2lnbmFsXG5mdW5jdGlvbiBjYW1sX2dyX3NpZ2lvX3NpZ25hbCgpe3JldHVybiAwfVxuLy9Qcm92aWRlczogY2FtbF9ncl93YWl0X2V2ZW50XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3dhaXRfZXZlbnQoX2V2bCl7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX3dhaXRfZXZlbnQgbm90IEltcGxlbWVudGVkOiB1c2UgR3JhcGhpY3NfanMgaW5zdGVhZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ncl9zeW5jaHJvbml6ZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9zeW5jaHJvbml6ZSAoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX3N5bmNocm9uaXplIG5vdCBJbXBsZW1lbnRlZFwiKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfcmVtZW1iZXJfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9yZW1lbWJlcl9tb2RlICgpIHtcbiAgY2FtbF9mYWlsd2l0aChcImNhbWxfZ3JfcmVtZW1iZXJfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2dyX2Rpc3BsYXlfbW9kZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9ncl9kaXNwbGF5X21vZGUoKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Rpc3BsYXlfbW9kZSBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfd2luZG93X2lkXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX3dpbmRvd19pZChhKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX3dpbmRvd19pZCBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3Jfb3Blbl9zdWJ3aW5kb3dcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfZ3Jfb3Blbl9zdWJ3aW5kb3coYSxiLGMsZCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9ncl9vcGVuX3N1YndpbmRvdyBub3QgSW1wbGVtZW50ZWRcIik7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ3JfY2xvc2Vfc3Vid2luZG93XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyhhKSB7XG4gIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2dyX2Nsb3NlX3N1YndpbmRvdyBub3QgSW1wbGVtZW50ZWRcIik7XG59XG4iLCJcbi8vUHJvdmlkZXM6IGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4XG52YXIgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXggPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVnaXN0ZXJcbi8vUmVxdWlyZXM6IGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4XG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVnaXN0ZXIoZXZlbnRfbmFtZSwgZXZlbnRfdGFnLCBldmVudF90eXBlKSB7XG4gIGNhbWxfY3VzdG9tX2V2ZW50X2luZGV4ICs9IDE7XG4gIHJldHVybiBbMCwgY2FtbF9jdXN0b21fZXZlbnRfaW5kZXgsIGV2ZW50X25hbWUsIGV2ZW50X3R5cGUsIGV2ZW50X3RhZ107XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfdXNlcl93cml0ZVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3dyaXRlKGV2ZW50LCBldmVudF9jb250ZW50KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3VzZXJfcmVzb2x2ZVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c191c2VyX3Jlc29sdmUoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0XG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3N0YXJ0KCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZVxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19wYXVzZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfcmVzdW1lXG5mdW5jdGlvbiBjYW1sX3J1bnRpbWVfZXZlbnRzX3Jlc3VtZSgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfY3JlYXRlX2N1cnNvclxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19jcmVhdGVfY3Vyc29yKHRhcmdldCkge1xuICByZXR1cm4ge307XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3JcbmZ1bmN0aW9uIGNhbWxfcnVudGltZV9ldmVudHNfZnJlZV9jdXJzb3IoY3Vyc29yKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3J1bnRpbWVfZXZlbnRzX3JlYWRfcG9sbFxuZnVuY3Rpb24gY2FtbF9ydW50aW1lX2V2ZW50c19yZWFkX3BvbGwoY3Vyc29yLCBjYWxsYmFja3MsIG51bSkge1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfY29uc3RhbnRzXG52YXIgY2FtbF9tYXJzaGFsX2NvbnN0YW50cyA9IHtcbiAgUFJFRklYX1NNQUxMX0JMT0NLOiAgICAgICAgIDB4ODAsXG4gIFBSRUZJWF9TTUFMTF9JTlQ6ICAgICAgICAgICAweDQwLFxuICBQUkVGSVhfU01BTExfU1RSSU5HOiAgICAgICAgMHgyMCxcbiAgQ09ERV9JTlQ4OiAgICAgICAgICAgICAgICAgIDB4MDAsXG4gIENPREVfSU5UMTY6ICAgICAgICAgICAgICAgICAweDAxLFxuICBDT0RFX0lOVDMyOiAgICAgICAgICAgICAgICAgMHgwMixcbiAgQ09ERV9JTlQ2NDogICAgICAgICAgICAgICAgIDB4MDMsXG4gIENPREVfU0hBUkVEODogICAgICAgICAgICAgICAweDA0LFxuICBDT0RFX1NIQVJFRDE2OiAgICAgICAgICAgICAgMHgwNSxcbiAgQ09ERV9TSEFSRUQzMjogICAgICAgICAgICAgIDB4MDYsXG4gIENPREVfQkxPQ0szMjogICAgICAgICAgICAgICAweDA4LFxuICBDT0RFX0JMT0NLNjQ6ICAgICAgICAgICAgICAgMHgxMyxcbiAgQ09ERV9TVFJJTkc4OiAgICAgICAgICAgICAgIDB4MDksXG4gIENPREVfU1RSSU5HMzI6ICAgICAgICAgICAgICAweDBBLFxuICBDT0RFX0RPVUJMRV9CSUc6ICAgICAgICAgICAgMHgwQixcbiAgQ09ERV9ET1VCTEVfTElUVExFOiAgICAgICAgIDB4MEMsXG4gIENPREVfRE9VQkxFX0FSUkFZOF9CSUc6ICAgICAweDBELFxuICBDT0RFX0RPVUJMRV9BUlJBWThfTElUVExFOiAgMHgwRSxcbiAgQ09ERV9ET1VCTEVfQVJSQVkzMl9CSUc6ICAgIDB4MEYsXG4gIENPREVfRE9VQkxFX0FSUkFZMzJfTElUVExFOiAweDA3LFxuICBDT0RFX0NPREVQT0lOVEVSOiAgICAgICAgICAgMHgxMCxcbiAgQ09ERV9JTkZJWFBPSU5URVI6ICAgICAgICAgIDB4MTEsXG4gIENPREVfQ1VTVE9NOiAgICAgICAgICAgICAgICAweDEyLFxuICBDT0RFX0NVU1RPTV9MRU46ICAgICAgICAgICAgMHgxOCxcbiAgQ09ERV9DVVNUT01fRklYRUQ6ICAgICAgICAgIDB4MTlcbn1cblxuXG4vL1Byb3ZpZGVzOiBVSW50OEFycmF5UmVhZGVyXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19vZl9hcnJheSwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gVUludDhBcnJheVJlYWRlciAocywgaSkgeyB0aGlzLnMgPSBzOyB0aGlzLmkgPSBpOyB9XG5VSW50OEFycmF5UmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgcmVhZDh1OmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuc1t0aGlzLmkrK107IH0sXG4gIHJlYWQ4czpmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnNbdGhpcy5pKytdIDw8IDI0ID4+IDI0OyB9LFxuICByZWFkMTZ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKHNbaV0gPDwgOCkgfCBzW2kgKyAxXVxuICB9LFxuICByZWFkMTZzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKHNbaV0gPDwgMjQgPj4gMTYpIHwgc1tpICsgMV07XG4gIH0sXG4gIHJlYWQzMnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKHNbaV0gPDwgMjQpIHwgKHNbaSsxXSA8PCAxNikgfFxuICAgICAgICAgICAgKHNbaSsyXSA8PCA4KSB8IHNbaSszXSkgPj4+IDA7XG4gIH0sXG4gIHJlYWQzMnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoc1tpXSA8PCAyNCkgfCAoc1tpKzFdIDw8IDE2KSB8XG4gICAgICAoc1tpKzJdIDw8IDgpIHwgc1tpKzNdO1xuICB9LFxuICByZWFkc3RyOmZ1bmN0aW9uIChsZW4pIHtcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheSh0aGlzLnMuc3ViYXJyYXkoaSwgaSArIGxlbikpO1xuICB9LFxuICByZWFkdWludDhhcnJheTpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gdGhpcy5zLnN1YmFycmF5KGksIGkgKyBsZW4pO1xuICB9XG59XG5cblxuLy9Qcm92aWRlczogTWxTdHJpbmdSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfanNieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIE1sU3RyaW5nUmVhZGVyIChzLCBpKSB7IHRoaXMucyA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocyk7IHRoaXMuaSA9IGk7IH1cbk1sU3RyaW5nUmVhZGVyLnByb3RvdHlwZSA9IHtcbiAgcmVhZDh1OmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucy5jaGFyQ29kZUF0KHRoaXMuaSsrKTsgfSxcbiAgcmVhZDhzOmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucy5jaGFyQ29kZUF0KHRoaXMuaSsrKSA8PCAyNCA+PiAyNDsgfSxcbiAgcmVhZDE2dTpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDI7XG4gICAgcmV0dXJuIChzLmNoYXJDb2RlQXQoaSkgPDwgOCkgfCBzLmNoYXJDb2RlQXQoaSArIDEpXG4gIH0sXG4gIHJlYWQxNnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAocy5jaGFyQ29kZUF0KGkpIDw8IDI0ID4+IDE2KSB8IHMuY2hhckNvZGVBdChpICsgMSk7XG4gIH0sXG4gIHJlYWQzMnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoKHMuY2hhckNvZGVBdChpKSA8PCAyNCkgfCAocy5jaGFyQ29kZUF0KGkrMSkgPDwgMTYpIHxcbiAgICAgICAgICAgIChzLmNoYXJDb2RlQXQoaSsyKSA8PCA4KSB8IHMuY2hhckNvZGVBdChpKzMpKSA+Pj4gMDtcbiAgfSxcbiAgcmVhZDMyczpmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHMgPSB0aGlzLnMsIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIDQ7XG4gICAgcmV0dXJuIChzLmNoYXJDb2RlQXQoaSkgPDwgMjQpIHwgKHMuY2hhckNvZGVBdChpKzEpIDw8IDE2KSB8XG4gICAgICAocy5jaGFyQ29kZUF0KGkrMikgPDwgOCkgfCBzLmNoYXJDb2RlQXQoaSszKTtcbiAgfSxcbiAgcmVhZHN0cjpmdW5jdGlvbiAobGVuKSB7XG4gICAgdmFyIGkgPSB0aGlzLmk7XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyh0aGlzLnMuc3Vic3RyaW5nKGksIGkgKyBsZW4pKTtcbiAgfSxcbiAgcmVhZHVpbnQ4YXJyYXk6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICB2YXIgcyA9IHRoaXMucztcbiAgICB2YXIgaSA9IHRoaXMuaTtcbiAgICBmb3IodmFyIGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIGJbal0gPSBzLmNoYXJDb2RlQXQoaSArIGopO1xuICAgIH1cbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiBiO1xuICB9XG59XG5cbi8vUHJvdmlkZXM6IEJpZ1N0cmluZ1JlYWRlclxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXksIGNhbWxfYmFfZ2V0XzFcbmZ1bmN0aW9uIEJpZ1N0cmluZ1JlYWRlciAoYnMsIGkpIHsgdGhpcy5zID0gYnM7IHRoaXMuaSA9IGk7IH1cbkJpZ1N0cmluZ1JlYWRlci5wcm90b3R5cGUgPSB7XG4gIHJlYWQ4dTpmdW5jdGlvbiAoKSB7IHJldHVybiBjYW1sX2JhX2dldF8xKHRoaXMucyx0aGlzLmkrKyk7IH0sXG4gIHJlYWQ4czpmdW5jdGlvbiAoKSB7IHJldHVybiBjYW1sX2JhX2dldF8xKHRoaXMucyx0aGlzLmkrKykgPDwgMjQgPj4gMjQ7IH0sXG4gIHJlYWQxNnU6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyAyO1xuICAgIHJldHVybiAoY2FtbF9iYV9nZXRfMShzLGkpIDw8IDgpIHwgY2FtbF9iYV9nZXRfMShzLGkgKyAxKVxuICB9LFxuICByZWFkMTZzOmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgMjtcbiAgICByZXR1cm4gKGNhbWxfYmFfZ2V0XzEocyxpKSA8PCAyNCA+PiAxNikgfCBjYW1sX2JhX2dldF8xKHMsaSArIDEpO1xuICB9LFxuICByZWFkMzJ1OmZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcyA9IHRoaXMucywgaSA9IHRoaXMuaTtcbiAgICB0aGlzLmkgPSBpICsgNDtcbiAgICByZXR1cm4gKChjYW1sX2JhX2dldF8xKHMsaSkgICA8PCAyNCkgfCAoY2FtbF9iYV9nZXRfMShzLGkrMSkgPDwgMTYpIHxcbiAgICAgICAgICAgIChjYW1sX2JhX2dldF8xKHMsaSsyKSA8PCA4KSAgfCBjYW1sX2JhX2dldF8xKHMsaSszKSAgICAgICAgICkgPj4+IDA7XG4gIH0sXG4gIHJlYWQzMnM6ZnVuY3Rpb24gKCkge1xuICAgIHZhciBzID0gdGhpcy5zLCBpID0gdGhpcy5pO1xuICAgIHRoaXMuaSA9IGkgKyA0O1xuICAgIHJldHVybiAoY2FtbF9iYV9nZXRfMShzLGkpICAgPDwgMjQpIHwgKGNhbWxfYmFfZ2V0XzEocyxpKzEpIDw8IDE2KSB8XG4gICAgICAoY2FtbF9iYV9nZXRfMShzLGkrMikgPDwgOCkgIHwgY2FtbF9iYV9nZXRfMShzLGkrMyk7XG4gIH0sXG4gIHJlYWRzdHI6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkobGVuKVxuICAgIGZvcih2YXIgaiA9IDA7IGogPCBsZW47IGorKyl7XG4gICAgICBhcnJbal0gPSBjYW1sX2JhX2dldF8xKHRoaXMucywgaStqKTtcbiAgICB9XG4gICAgdGhpcy5pID0gaSArIGxlbjtcbiAgICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkoYXJyKTtcbiAgfSxcbiAgcmVhZHVpbnQ4YXJyYXk6ZnVuY3Rpb24gKGxlbikge1xuICAgIHZhciBpID0gdGhpcy5pO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLm9mZnNldChpKTtcbiAgICB0aGlzLmkgPSBpICsgbGVuO1xuICAgIHJldHVybiB0aGlzLnMuZGF0YS5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbik7XG4gIH1cbn1cblxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cywgY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9mbG9hdF9vZl9ieXRlcyAoYSkge1xuICByZXR1cm4gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzIChjYW1sX2ludDY0X29mX2J5dGVzIChhKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9zdHJpbmcgbXV0YWJsZVxuLy9SZXF1aXJlczogTWxTdHJpbmdSZWFkZXIsIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXJcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9zdHJpbmcocyxvZnMpIHtcbiAgdmFyIHJlYWRlciA9IG5ldyBNbFN0cmluZ1JlYWRlciAocywgdHlwZW9mIG9mcz09XCJudW1iZXJcIj9vZnM6b2ZzWzBdKTtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIocmVhZGVyLCBvZnMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBNbFN0cmluZ1JlYWRlciwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlciwgY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyhzLG9mcykge1xuICB2YXIgcmVhZGVyID0gbmV3IE1sU3RyaW5nUmVhZGVyIChjYW1sX3N0cmluZ19vZl9ieXRlcyhzKSwgdHlwZW9mIG9mcz09XCJudW1iZXJcIj9vZnM6b2ZzWzBdKTtcbiAgcmV0dXJuIGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9yZWFkZXIocmVhZGVyLCBvZnMpXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50NjRfdW5tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X3VubWFyc2hhbChyZWFkZXIsIHNpemUpe1xuICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgc2l6ZVswXSA9IDg7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2J5dGVzICh0KTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9tYXJzaGFsXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2ludDY0X21hcnNoYWwod3JpdGVyLCB2LCBzaXplcykge1xuICB2YXIgYiA9IGNhbWxfaW50NjRfdG9fYnl0ZXMgKHYpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgd3JpdGVyLndyaXRlICg4LCBiW2ldKTtcbiAgc2l6ZXNbMF0gPSA4OyBzaXplc1sxXSA9IDg7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW50MzJfdW5tYXJzaGFsXG5mdW5jdGlvbiBjYW1sX2ludDMyX3VubWFyc2hhbChyZWFkZXIsIHNpemUpe1xuICBzaXplWzBdID0gNDtcbiAgcmV0dXJuIHJlYWRlci5yZWFkMzJzICgpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWxcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbChyZWFkZXIsIHNpemUpe1xuICBzd2l0Y2ggKHJlYWRlci5yZWFkOHUgKCkpIHtcbiAgY2FzZSAxOlxuICAgIHNpemVbMF0gPSA0O1xuICAgIHJldHVybiByZWFkZXIucmVhZDMycyAoKTtcbiAgY2FzZSAyOlxuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogbmF0aXZlIGludGVnZXIgdmFsdWUgdG9vIGxhcmdlXCIpO1xuICBkZWZhdWx0OiBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGlsbC1mb3JtZWQgbmF0aXZlIGludGVnZXJcIik7XG4gIH1cbn1cblxuLy9Qcm92aWRlczogY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3VubWFyc2hhbCwgY2FtbF9pbnQ2NF9tYXJzaGFsLCBjYW1sX2ludDY0X2NvbXBhcmUsIGNhbWxfaW50NjRfaGFzaFxuLy9SZXF1aXJlczogY2FtbF9pbnQzMl91bm1hcnNoYWwsIGNhbWxfbmF0aXZlaW50X3VubWFyc2hhbFxuLy9SZXF1aXJlczogY2FtbF9iYV9zZXJpYWxpemUsIGNhbWxfYmFfZGVzZXJpYWxpemUsIGNhbWxfYmFfY29tcGFyZSwgY2FtbF9iYV9oYXNoXG52YXIgY2FtbF9jdXN0b21fb3BzID1cbiAgICB7XCJfalwiOiB7XG4gICAgICBkZXNlcmlhbGl6ZSA6IGNhbWxfaW50NjRfdW5tYXJzaGFsLFxuICAgICAgc2VyaWFsaXplICA6IGNhbWxfaW50NjRfbWFyc2hhbCxcbiAgICAgIGZpeGVkX2xlbmd0aCA6IDgsXG4gICAgICBjb21wYXJlIDogY2FtbF9pbnQ2NF9jb21wYXJlLFxuICAgICAgaGFzaCA6IGNhbWxfaW50NjRfaGFzaFxuICAgIH0sXG4gICAgIFwiX2lcIjoge1xuICAgICAgIGRlc2VyaWFsaXplIDogY2FtbF9pbnQzMl91bm1hcnNoYWwsXG4gICAgICAgZml4ZWRfbGVuZ3RoIDogNCxcbiAgICAgfSxcbiAgICAgXCJfblwiOiB7XG4gICAgICAgZGVzZXJpYWxpemUgOiBjYW1sX25hdGl2ZWludF91bm1hcnNoYWwsXG4gICAgICAgZml4ZWRfbGVuZ3RoIDogNCxcbiAgICAgfSxcbiAgICAgXCJfYmlnYXJyYXlcIjp7XG4gICAgICAgZGVzZXJpYWxpemUgOiAoZnVuY3Rpb24gKHJlYWRlciwgc3opIHtyZXR1cm4gY2FtbF9iYV9kZXNlcmlhbGl6ZSAocmVhZGVyLHN6LFwiX2JpZ2FycmF5XCIpfSksXG4gICAgICAgc2VyaWFsaXplIDogY2FtbF9iYV9zZXJpYWxpemUsXG4gICAgICAgY29tcGFyZSA6IGNhbWxfYmFfY29tcGFyZSxcbiAgICAgICBoYXNoOiBjYW1sX2JhX2hhc2gsXG4gICAgIH0sXG4gICAgIFwiX2JpZ2FycjAyXCI6e1xuICAgICAgIGRlc2VyaWFsaXplIDogKGZ1bmN0aW9uIChyZWFkZXIsIHN6KSB7cmV0dXJuIGNhbWxfYmFfZGVzZXJpYWxpemUgKHJlYWRlcixzeixcIl9iaWdhcnIwMlwiKX0pLFxuICAgICAgIHNlcmlhbGl6ZSA6IGNhbWxfYmFfc2VyaWFsaXplLFxuICAgICAgIGNvbXBhcmUgOiBjYW1sX2JhX2NvbXBhcmUsXG4gICAgICAgaGFzaDogY2FtbF9iYV9oYXNoLFxuICAgICB9XG4gICAgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbi8vUmVxdWlyZXM6IGNhbWxfZmxvYXRfb2ZfYnl0ZXMsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogenN0ZF9kZWNvbXByZXNzXG4vL1JlcXVpcmVzOiBVSW50OEFycmF5UmVhZGVyXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyKHJlYWRlciwgb2ZzKSB7XG4gIGZ1bmN0aW9uIHJlYWR2bHEob3ZlcmZsb3cpIHtcbiAgICB2YXIgYyA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICB2YXIgbiA9IGMgJiAweDdGO1xuICAgIHdoaWxlICgoYyAmIDB4ODApICE9IDApIHtcbiAgICAgIGMgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICB2YXIgbjcgPSBuIDw8IDc7XG4gICAgICBpZiAobiAhPSBuNyA+PiA3KSBvdmVyZmxvd1swXSA9IHRydWU7XG4gICAgICBuID0gbjcgfCAoYyAmIDB4N0YpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuICB2YXIgbWFnaWMgPSByZWFkZXIucmVhZDMydSAoKVxuICBzd2l0Y2gobWFnaWMpe1xuICBjYXNlIDB4ODQ5NUE2QkU6IC8qIEludGV4dF9tYWdpY19udW1iZXJfc21hbGwgKi9cbiAgICB2YXIgaGVhZGVyX2xlbiA9IDIwO1xuICAgIHZhciBjb21wcmVzc2VkID0gMDtcbiAgICB2YXIgZGF0YV9sZW4gPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICB2YXIgdW5jb21wcmVzc2VkX2RhdGFfbGVuID0gZGF0YV9sZW47XG4gICAgdmFyIG51bV9vYmplY3RzID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgdmFyIF9zaXplXzMyID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgdmFyIF9zaXplXzY0ID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgYnJlYWtcbiAgY2FzZSAweDg0OTVBNkJEOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX2NvbXByZXNzZWQgKi9cbiAgICB2YXIgaGVhZGVyX2xlbiA9IHJlYWRlci5yZWFkOHUoKSAmIDB4M0Y7XG4gICAgdmFyIGNvbXByZXNzZWQgPSAxO1xuICAgIHZhciBvdmVyZmxvdyA9IFtmYWxzZV07XG4gICAgdmFyIGRhdGFfbGVuID0gcmVhZHZscShvdmVyZmxvdyk7XG4gICAgdmFyIHVuY29tcHJlc3NlZF9kYXRhX2xlbiA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgIHZhciBudW1fb2JqZWN0cyA9IHJlYWR2bHEob3ZlcmZsb3cpO1xuICAgIHZhciBfc2l6ZV8zMiA9IHJlYWR2bHEgKG92ZXJmbG93KTtcbiAgICB2YXIgX3NpemVfNjQgPSByZWFkdmxxIChvdmVyZmxvdyk7XG4gICAgaWYob3ZlcmZsb3dbMF0pe1xuICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiY2FtbF9pbnB1dF92YWx1ZV9mcm9tX3JlYWRlcjogb2JqZWN0IHRvbyBsYXJnZSB0byBiZSByZWFkIGJhY2sgb24gdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICB9XG4gICAgYnJlYWtcbiAgY2FzZSAweDg0OTVBNkJGOiAvKiBJbnRleHRfbWFnaWNfbnVtYmVyX2JpZyAqL1xuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBvYmplY3QgdG9vIGxhcmdlIHRvIGJlIHJlYWQgYmFjayBvbiBhIDMyLWJpdCBwbGF0Zm9ybVwiKTtcbiAgICBicmVha1xuICBkZWZhdWx0OlxuICAgIGNhbWxfZmFpbHdpdGgoXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fcmVhZGVyOiBiYWQgb2JqZWN0XCIpO1xuICAgIGJyZWFrO1xuICB9XG4gIHZhciBzdGFjayA9IFtdO1xuICB2YXIgaW50ZXJuX29ial90YWJsZSA9IChudW1fb2JqZWN0cyA+IDApP1tdOm51bGw7XG4gIHZhciBvYmpfY291bnRlciA9IDA7XG4gIGZ1bmN0aW9uIGludGVybl9yZWMgKHJlYWRlcikge1xuICAgIHZhciBjb2RlID0gcmVhZGVyLnJlYWQ4dSAoKTtcbiAgICBpZiAoY29kZSA+PSAweDQwIC8qY3N0LlBSRUZJWF9TTUFMTF9JTlQqLykge1xuICAgICAgaWYgKGNvZGUgPj0gMHg4MCAvKmNzdC5QUkVGSVhfU01BTExfQkxPQ0sqLykge1xuICAgICAgICB2YXIgdGFnID0gY29kZSAmIDB4RjtcbiAgICAgICAgdmFyIHNpemUgPSAoY29kZSA+PiA0KSAmIDB4NztcbiAgICAgICAgdmFyIHYgPSBbdGFnXTtcbiAgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIHY7XG4gICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgc3RhY2sucHVzaCh2LCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIChjb2RlICYgMHgzRik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb2RlID49IDB4MjAvKmNzdC5QUkVGSVhfU01BTExfU1RSSU5HICovKSB7XG4gICAgICAgIHZhciBsZW4gPSBjb2RlICYgMHgxRjtcbiAgICAgICAgdmFyIHYgPSByZWFkZXIucmVhZHN0ciAobGVuKTtcbiAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN3aXRjaChjb2RlKSB7XG4gICAgICAgIGNhc2UgMHgwMDogLy9jc3QuQ09ERV9JTlQ4OlxuICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZDhzICgpO1xuICAgICAgICBjYXNlIDB4MDE6IC8vY3N0LkNPREVfSU5UMTY6XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMTZzICgpO1xuICAgICAgICBjYXNlIDB4MDI6IC8vY3N0LkNPREVfSU5UMzI6XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkMzJzICgpO1xuICAgICAgICBjYXNlIDB4MDM6IC8vY3N0LkNPREVfSU5UNjQ6XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBpbnRlZ2VyIHRvbyBsYXJnZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDA0OiAvL2NzdC5DT0RFX1NIQVJFRDg6XG4gICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkOHUgKCk7XG4gICAgICAgICAgaWYoY29tcHJlc3NlZCA9PSAwKSBvZmZzZXQgPSBvYmpfY291bnRlciAtIG9mZnNldDtcbiAgICAgICAgICByZXR1cm4gaW50ZXJuX29ial90YWJsZVtvZmZzZXRdO1xuICAgICAgICBjYXNlIDB4MDU6IC8vY3N0LkNPREVfU0hBUkVEMTY6XG4gICAgICAgICAgdmFyIG9mZnNldCA9IHJlYWRlci5yZWFkMTZ1ICgpO1xuICAgICAgICAgIGlmKGNvbXByZXNzZWQgPT0gMCkgb2Zmc2V0ID0gb2JqX2NvdW50ZXIgLSBvZmZzZXQ7XG4gICAgICAgICAgcmV0dXJuIGludGVybl9vYmpfdGFibGVbb2Zmc2V0XTtcbiAgICAgICAgY2FzZSAweDA2OiAvL2NzdC5DT0RFX1NIQVJFRDMyOlxuICAgICAgICAgIHZhciBvZmZzZXQgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICAgICAgICBpZihjb21wcmVzc2VkID09IDApIG9mZnNldCA9IG9ial9jb3VudGVyIC0gb2Zmc2V0O1xuICAgICAgICAgIHJldHVybiBpbnRlcm5fb2JqX3RhYmxlW29mZnNldF07XG4gICAgICAgIGNhc2UgMHgwODogLy9jc3QuQ09ERV9CTE9DSzMyOlxuICAgICAgICAgIHZhciBoZWFkZXIgPSByZWFkZXIucmVhZDMydSAoKTtcbiAgICAgICAgICB2YXIgdGFnID0gaGVhZGVyICYgMHhGRjtcbiAgICAgICAgICB2YXIgc2l6ZSA9IGhlYWRlciA+PiAxMDtcbiAgICAgICAgICB2YXIgdiA9IFt0YWddO1xuICAgICAgICAgIGlmIChzaXplID09IDApIHJldHVybiB2O1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MTM6IC8vY3N0LkNPREVfQkxPQ0s2NDpcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoIChcImlucHV0X3ZhbHVlOiBkYXRhIGJsb2NrIHRvbyBsYXJnZVwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAweDA5OiAvL2NzdC5DT0RFX1NUUklORzg6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICB2YXIgdiA9IHJlYWRlci5yZWFkc3RyIChsZW4pO1xuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDBBOiAvL2NzdC5DT0RFX1NUUklORzMyOlxuICAgICAgICAgIHZhciBsZW4gPSByZWFkZXIucmVhZDMydSgpO1xuICAgICAgICAgIHZhciB2ID0gcmVhZGVyLnJlYWRzdHIgKGxlbik7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEM6IC8vY3N0LkNPREVfRE9VQkxFX0xJVFRMRTpcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IDg7aSsrKSB0WzcgLSBpXSA9IHJlYWRlci5yZWFkOHUgKCk7XG4gICAgICAgICAgdmFyIHYgPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwQjogLy9jc3QuQ09ERV9ET1VCTEVfQklHOlxuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDtpIDwgODtpKyspIHRbaV0gPSByZWFkZXIucmVhZDh1ICgpO1xuICAgICAgICAgIHZhciB2ID0gY2FtbF9mbG9hdF9vZl9ieXRlcyAodCk7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICBjYXNlIDB4MEU6IC8vY3N0LkNPREVfRE9VQkxFX0FSUkFZOF9MSVRUTEU6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICB2YXIgdiA9IG5ldyBBcnJheShsZW4rMSk7XG4gICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICB2YXIgdCA9IG5ldyBBcnJheSg4KTs7XG4gICAgICAgICAgaWYgKGludGVybl9vYmpfdGFibGUpIGludGVybl9vYmpfdGFibGVbb2JqX2NvdW50ZXIrK10gPSB2O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxO2kgPD0gbGVuO2krKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0WzcgLSBqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwRDogLy9jc3QuQ09ERV9ET1VCTEVfQVJSQVk4X0JJRzpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgIHZhciB2ID0gbmV3IEFycmF5KGxlbisxKTtcbiAgICAgICAgICB2WzBdID0gMjU0O1xuICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7aSA8PSBsZW47aSsrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDtqIDwgODtqKyspIHRbal0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgICAgICAgICB2IFtpXSA9IGNhbWxfZmxvYXRfb2ZfYnl0ZXMgKHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgY2FzZSAweDA3OiAvL2NzdC5DT0RFX0RPVUJMRV9BUlJBWTMyX0xJVFRMRTpcbiAgICAgICAgICB2YXIgbGVuID0gcmVhZGVyLnJlYWQzMnUoKTtcbiAgICAgICAgICB2YXIgdiA9IG5ldyBBcnJheShsZW4rMSk7XG4gICAgICAgICAgdlswXSA9IDI1NDtcbiAgICAgICAgICBpZiAoaW50ZXJuX29ial90YWJsZSkgaW50ZXJuX29ial90YWJsZVtvYmpfY291bnRlcisrXSA9IHY7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxO2kgPD0gbGVuO2krKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0WzcgLSBqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgICAgICAgIHZbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgwRjogLy9jc3QuQ09ERV9ET1VCTEVfQVJSQVkzMl9CSUc6XG4gICAgICAgICAgdmFyIGxlbiA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgICAgdmFyIHYgPSBuZXcgQXJyYXkobGVuKzEpO1xuICAgICAgICAgIHZbMF0gPSAyNTQ7XG4gICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgICAgICAgIGZvciAodmFyIGkgPSAxO2kgPD0gbGVuO2krKykge1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgICAgICAgdiBbaV0gPSBjYW1sX2Zsb2F0X29mX2J5dGVzICh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIGNhc2UgMHgxMDogLy9jc3QuQ09ERV9DT0RFUE9JTlRFUjpcbiAgICAgICAgY2FzZSAweDExOiAvL2NzdC5DT0RFX0lORklYUE9JTlRFUjpcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoIChcImlucHV0X3ZhbHVlOiBjb2RlIHBvaW50ZXJcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMHgxMjogLy9jc3QuQ09ERV9DVVNUT006XG4gICAgICAgIGNhc2UgMHgxODogLy9jc3QuQ09ERV9DVVNUT01fTEVOOlxuICAgICAgICBjYXNlIDB4MTk6IC8vY3N0LkNPREVfQ1VTVE9NX0ZJWEVEOlxuICAgICAgICAgIHZhciBjLCBzID0gXCJcIjtcbiAgICAgICAgICB3aGlsZSAoKGMgPSByZWFkZXIucmVhZDh1ICgpKSAhPSAwKSBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUgKGMpO1xuICAgICAgICAgIHZhciBvcHMgPSBjYW1sX2N1c3RvbV9vcHNbc107XG4gICAgICAgICAgdmFyIGV4cGVjdGVkX3NpemU7XG4gICAgICAgICAgaWYoIW9wcylcbiAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogdW5rbm93biBjdXN0b20gYmxvY2sgaWRlbnRpZmllclwiKTtcbiAgICAgICAgICBzd2l0Y2goY29kZSl7XG4gICAgICAgICAgY2FzZSAweDEyOiAvLyBjc3QuQ09ERV9DVVNUT00gKGRlcHJlY2F0ZWQpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDB4MTk6IC8vIGNzdC5DT0RFX0NVU1RPTV9GSVhFRFxuICAgICAgICAgICAgaWYoIW9wcy5maXhlZF9sZW5ndGgpXG4gICAgICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogZXhwZWN0ZWQgYSBmaXhlZC1zaXplIGN1c3RvbSBibG9ja1wiKTtcbiAgICAgICAgICAgIGV4cGVjdGVkX3NpemUgPSBvcHMuZml4ZWRfbGVuZ3RoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAweDE4OiAvLyBjc3QuQ09ERV9DVVNUT01fTEVOXG4gICAgICAgICAgICBleHBlY3RlZF9zaXplID0gcmVhZGVyLnJlYWQzMnUgKCk7XG4gICAgICAgICAgICAvLyBTa2lwIHNpemU2NFxuICAgICAgICAgICAgcmVhZGVyLnJlYWQzMnMoKTsgcmVhZGVyLnJlYWQzMnMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb2xkX3BvcyA9IHJlYWRlci5pO1xuICAgICAgICAgIHZhciBzaXplID0gWzBdO1xuICAgICAgICAgIHZhciB2ID0gb3BzLmRlc2VyaWFsaXplKHJlYWRlciwgc2l6ZSk7XG4gICAgICAgICAgaWYoZXhwZWN0ZWRfc2l6ZSAhPSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgaWYoZXhwZWN0ZWRfc2l6ZSAhPSBzaXplWzBdKVxuICAgICAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IGluY29ycmVjdCBsZW5ndGggb2Ygc2VyaWFsaXplZCBjdXN0b20gYmxvY2tcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSBpbnRlcm5fb2JqX3RhYmxlW29ial9jb3VudGVyKytdID0gdjtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoIChcImlucHV0X3ZhbHVlOiBpbGwtZm9ybWVkIG1lc3NhZ2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYoY29tcHJlc3NlZCkge1xuICAgIHZhciBkYXRhID0gcmVhZGVyLnJlYWR1aW50OGFycmF5KGRhdGFfbGVuKTtcbiAgICB2YXIgcmVzID0gbmV3IFVpbnQ4QXJyYXkodW5jb21wcmVzc2VkX2RhdGFfbGVuKTtcbiAgICB2YXIgcmVzID0genN0ZF9kZWNvbXByZXNzKGRhdGEsIHJlcyk7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBVSW50OEFycmF5UmVhZGVyKHJlcywgMCk7XG4gIH1cbiAgdmFyIHJlcyA9IGludGVybl9yZWMgKHJlYWRlcik7XG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgdmFyIHNpemUgPSBzdGFjay5wb3AoKTtcbiAgICB2YXIgdiA9IHN0YWNrLnBvcCgpO1xuICAgIHZhciBkID0gdi5sZW5ndGg7XG4gICAgaWYgKGQgPCBzaXplKSBzdGFjay5wdXNoKHYsIHNpemUpO1xuICAgIHZbZF0gPSBpbnRlcm5fcmVjIChyZWFkZXIpO1xuICB9XG4gIGlmICh0eXBlb2Ygb2ZzIT1cIm51bWJlclwiKSBvZnNbMF0gPSByZWFkZXIuaTtcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplXG4vL1ZlcnNpb246IDwgNS4xLjBcbnZhciBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgPSAyMFxuXG4vL1Byb3ZpZGVzOiBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemVcbi8vVmVyc2lvbjogPj0gNS4xLjBcbnZhciBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUgPSAxNlxuXG5cblxuLy9Qcm92aWRlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2J5dGVzX3Vuc2FmZV9nZXRcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IFVJbnQ4QXJyYXlSZWFkZXJcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSAocywgb2ZzKSB7XG4gIHZhciByID0gbmV3IFVJbnQ4QXJyYXlSZWFkZXIoY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzKSwgb2ZzKTtcbiAgZnVuY3Rpb24gcmVhZHZscShvdmVyZmxvdykge1xuICAgIHZhciBjID0gci5yZWFkOHUoKTtcbiAgICB2YXIgbiA9IGMgJiAweDdGO1xuICAgIHdoaWxlICgoYyAmIDB4ODApICE9IDApIHtcbiAgICAgIGMgPSByLnJlYWQ4dSgpO1xuICAgICAgdmFyIG43ID0gbiA8PCA3O1xuICAgICAgaWYgKG4gIT0gbjcgPj4gNykgb3ZlcmZsb3dbMF0gPSB0cnVlO1xuICAgICAgbiA9IG43IHwgKGMgJiAweDdGKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cblxuICBzd2l0Y2goci5yZWFkMzJ1KCkpe1xuICBjYXNlIDB4ODQ5NUE2QkU6IC8qIEludGV4dF9tYWdpY19udW1iZXJfc21hbGwgKi9cbiAgICB2YXIgaGVhZGVyX2xlbiA9IDIwO1xuICAgIHZhciBkYXRhX2xlbiA9IHIucmVhZDMydSgpO1xuICAgIGJyZWFrO1xuICBjYXNlIDB4ODQ5NUE2QkQ6IC8qIEludGV4dF9tYWdpY19udW1iZXJfY29tcHJlc3NlZCAqL1xuICAgIHZhciBoZWFkZXJfbGVuID0gci5yZWFkOHUoKSAmIDB4M0Y7XG4gICAgdmFyIG92ZXJmbG93ID0gW2ZhbHNlXTtcbiAgICB2YXIgZGF0YV9sZW4gPSByZWFkdmxxKG92ZXJmbG93KTtcbiAgICBpZihvdmVyZmxvd1swXSl7XG4gICAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IG9iamVjdCB0b28gbGFyZ2UgdG8gYmUgcmVhZCBiYWNrIG9uIHRoaXMgcGxhdGZvcm1cIik7XG4gICAgfVxuICAgIGJyZWFrXG4gIGNhc2UgMHg4NDk1QTZCRjogLyogSW50ZXh0X21hZ2ljX251bWJlcl9iaWcgKi9cbiAgZGVmYXVsdDpcbiAgICBjYW1sX2ZhaWx3aXRoKFwiTWFyc2hhbC5kYXRhX3NpemU6IGJhZCBvYmplY3RcIik7XG4gICAgYnJlYWtcbiAgfVxuICByZXR1cm4gaGVhZGVyX2xlbiAtIGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSArIGRhdGFfbGVuO1xufVxuXG4vL1Byb3ZpZGVzOiBNbE9iamVjdFRhYmxlXG52YXIgTWxPYmplY3RUYWJsZTtcbmlmICh0eXBlb2YgZ2xvYmFsVGhpcy5XZWFrTWFwID09PSAndW5kZWZpbmVkJykge1xuICBNbE9iamVjdFRhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgLyogcG9seWZpbGwgKHVzaW5nIGxpbmVhciBzZWFyY2gpICovXG4gICAgZnVuY3Rpb24gTmFpdmVMb29rdXAob2JqcykgeyB0aGlzLm9ianMgPSBvYmpzOyB9XG4gICAgTmFpdmVMb29rdXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYmpzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLm9ianNbaV0gPT09IHYpIHJldHVybiBpO1xuICAgICAgfVxuICAgIH07XG4gICAgTmFpdmVMb29rdXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gRG8gbm90aGluZyBoZXJlLiBbTWxPYmplY3RUYWJsZS5zdG9yZV0gd2lsbCBwdXNoIHRvIFt0aGlzLm9ianNdIGRpcmVjdGx5LlxuICAgIH07XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gTWxPYmplY3RUYWJsZSgpIHtcbiAgICAgIHRoaXMub2JqcyA9IFtdOyB0aGlzLmxvb2t1cCA9IG5ldyBOYWl2ZUxvb2t1cCh0aGlzLm9ianMpO1xuICAgIH07XG4gIH0oKTtcbn1cbmVsc2Uge1xuICBNbE9iamVjdFRhYmxlID0gZnVuY3Rpb24gTWxPYmplY3RUYWJsZSgpIHtcbiAgICB0aGlzLm9ianMgPSBbXTsgdGhpcy5sb29rdXAgPSBuZXcgZ2xvYmFsVGhpcy5XZWFrTWFwKCk7XG4gIH07XG59XG5cbk1sT2JqZWN0VGFibGUucHJvdG90eXBlLnN0b3JlID0gZnVuY3Rpb24odikge1xuICB0aGlzLmxvb2t1cC5zZXQodiwgdGhpcy5vYmpzLmxlbmd0aCk7XG4gIHRoaXMub2Jqcy5wdXNoKHYpO1xufVxuXG5NbE9iamVjdFRhYmxlLnByb3RvdHlwZS5yZWNhbGwgPSBmdW5jdGlvbih2KSB7XG4gIHZhciBpID0gdGhpcy5sb29rdXAuZ2V0KHYpO1xuICByZXR1cm4gKGkgPT09IHVuZGVmaW5lZClcbiAgICA/IHVuZGVmaW5lZCA6IHRoaXMub2Jqcy5sZW5ndGggLSBpOyAgIC8qIGluZGV4IGlzIHJlbGF0aXZlICovXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9mYWlsd2l0aFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX2J5dGVzLCBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0XG4vL1JlcXVpcmVzOiBNbE9iamVjdFRhYmxlLCBjYW1sX2xpc3RfdG9fanNfYXJyYXksIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMsIGNhbWxfaXNfY29udGludWF0aW9uX3RhZ1xudmFyIGNhbWxfb3V0cHV0X3ZhbCA9IGZ1bmN0aW9uICgpe1xuICBmdW5jdGlvbiBXcml0ZXIgKCkgeyB0aGlzLmNodW5rID0gW107IH1cbiAgV3JpdGVyLnByb3RvdHlwZSA9IHtcbiAgICBjaHVua19pZHg6MjAsIGJsb2NrX2xlbjowLCBvYmpfY291bnRlcjowLCBzaXplXzMyOjAsIHNpemVfNjQ6MCxcbiAgICB3cml0ZTpmdW5jdGlvbiAoc2l6ZSwgdmFsdWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODtpID49IDA7aSAtPSA4KVxuICAgICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX2F0OmZ1bmN0aW9uIChwb3MsIHNpemUsIHZhbHVlKSB7XG4gICAgICB2YXIgcG9zID0gcG9zO1xuICAgICAgZm9yICh2YXIgaSA9IHNpemUgLSA4O2kgPj0gMDtpIC09IDgpXG4gICAgICAgIHRoaXMuY2h1bmtbcG9zKytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX2NvZGU6ZnVuY3Rpb24gKHNpemUsIGNvZGUsIHZhbHVlKSB7XG4gICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gY29kZTtcbiAgICAgIGZvciAodmFyIGkgPSBzaXplIC0gODtpID49IDA7aSAtPSA4KVxuICAgICAgICB0aGlzLmNodW5rW3RoaXMuY2h1bmtfaWR4KytdID0gKHZhbHVlID4+IGkpICYgMHhGRjtcbiAgICB9LFxuICAgIHdyaXRlX3NoYXJlZDpmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICBpZiAob2Zmc2V0IDwgKDEgPDwgOCkpIHRoaXMud3JpdGVfY29kZSg4LCAweDA0IC8qY3N0LkNPREVfU0hBUkVEOCovLCBvZmZzZXQpO1xuICAgICAgZWxzZSBpZiAob2Zmc2V0IDwgKDEgPDwgMTYpKSB0aGlzLndyaXRlX2NvZGUoMTYsIDB4MDUgLypjc3QuQ09ERV9TSEFSRUQxNiovLCBvZmZzZXQpO1xuICAgICAgZWxzZSB0aGlzLndyaXRlX2NvZGUoMzIsIDB4MDYgLypjc3QuQ09ERV9TSEFSRUQzMiovLCBvZmZzZXQpO1xuICAgIH0sXG4gICAgcG9zOmZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuY2h1bmtfaWR4IH0sXG4gICAgZmluYWxpemU6ZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5ibG9ja19sZW4gPSB0aGlzLmNodW5rX2lkeCAtIDIwO1xuICAgICAgdGhpcy5jaHVua19pZHggPSAwO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIDB4ODQ5NUE2QkUpO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMuYmxvY2tfbGVuKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLm9ial9jb3VudGVyKTtcbiAgICAgIHRoaXMud3JpdGUgKDMyLCB0aGlzLnNpemVfMzIpO1xuICAgICAgdGhpcy53cml0ZSAoMzIsIHRoaXMuc2l6ZV82NCk7XG4gICAgICByZXR1cm4gdGhpcy5jaHVuaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICh2LCBmbGFncykge1xuICAgIGZsYWdzID0gY2FtbF9saXN0X3RvX2pzX2FycmF5KGZsYWdzKTtcblxuICAgIHZhciBub19zaGFyaW5nID0gKGZsYWdzLmluZGV4T2YoMCAvKk1hcnNoYWwuTm9fc2hhcmluZyovKSAhPT0gLTEpLFxuICAgICAgICBjbG9zdXJlcyA9ICAoZmxhZ3MuaW5kZXhPZigxIC8qTWFyc2hhbC5DbG9zdXJlcyovKSAhPT0gLTEpO1xuICAgIC8qIE1hcnNoYWwuQ29tcGF0XzMyIGlzIHJlZHVuZGFudCBzaW5jZSBpbnRlZ2VycyBhcmUgMzItYml0IGFueXdheSAqL1xuXG4gICAgaWYgKGNsb3N1cmVzKVxuICAgICAgY29uc29sZS53YXJuKFwiaW4gY2FtbF9vdXRwdXRfdmFsOiBmbGFnIE1hcnNoYWwuQ2xvc3VyZXMgaXMgbm90IHN1cHBvcnRlZC5cIik7XG5cbiAgICB2YXIgd3JpdGVyID0gbmV3IFdyaXRlciAoKTtcbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICB2YXIgaW50ZXJuX29ial90YWJsZSA9IG5vX3NoYXJpbmcgPyBudWxsIDogbmV3IE1sT2JqZWN0VGFibGUoKTtcblxuICAgIGZ1bmN0aW9uIG1lbW8odikge1xuICAgICAgaWYgKG5vX3NoYXJpbmcpIHJldHVybiBmYWxzZTtcbiAgICAgIHZhciBleGlzdGluZ19vZmZzZXQgPSBpbnRlcm5fb2JqX3RhYmxlLnJlY2FsbCh2KTtcbiAgICAgIGlmIChleGlzdGluZ19vZmZzZXQpIHsgd3JpdGVyLndyaXRlX3NoYXJlZChleGlzdGluZ19vZmZzZXQpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgZWxzZSB7IGludGVybl9vYmpfdGFibGUuc3RvcmUodik7IHJldHVybiBmYWxzZTsgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dGVybl9yZWMgKHYpIHtcbiAgICAgIGlmICh2LmNhbWxfY3VzdG9tKSB7XG4gICAgICAgIGlmIChtZW1vKHYpKSByZXR1cm47XG4gICAgICAgIHZhciBuYW1lID0gdi5jYW1sX2N1c3RvbTtcbiAgICAgICAgdmFyIG9wcyA9IGNhbWxfY3VzdG9tX29wc1tuYW1lXTtcbiAgICAgICAgdmFyIHN6XzMyXzY0ID0gWzAsMF07XG4gICAgICAgIGlmKCFvcHMuc2VyaWFsaXplKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKEN1c3RvbSlcIik7XG4gICAgICAgIGlmKG9wcy5maXhlZF9sZW5ndGggPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MTggLypjc3QuQ09ERV9DVVNUT01fTEVOKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgbmFtZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgdmFyIGhlYWRlcl9wb3MgPSB3cml0ZXIucG9zICgpO1xuICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wcy5zZXJpYWxpemUod3JpdGVyLCB2LCBzel8zMl82NCk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlX2F0KGhlYWRlcl9wb3MsIDMyLCBzel8zMl82NFswXSk7XG4gICAgICAgICAgd3JpdGVyLndyaXRlX2F0KGhlYWRlcl9wb3MgKyA0LCAzMiwgMCk7IC8vIHplcm9cbiAgICAgICAgICB3cml0ZXIud3JpdGVfYXQoaGVhZGVyX3BvcyArIDgsIDMyLCBzel8zMl82NFsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCAweDE5IC8qY3N0LkNPREVfQ1VTVE9NX0ZJWEVEKi8pO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgbmFtZS5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgICB3cml0ZXIud3JpdGUoOCwgMCk7XG4gICAgICAgICAgdmFyIG9sZF9wb3MgPSB3cml0ZXIucG9zKCk7XG4gICAgICAgICAgb3BzLnNlcmlhbGl6ZSh3cml0ZXIsIHYsIHN6XzMyXzY0KTtcbiAgICAgICAgICBpZiAob3BzLmZpeGVkX2xlbmd0aCAhPSB3cml0ZXIucG9zKCkgLSBvbGRfcG9zKVxuICAgICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogaW5jb3JyZWN0IGZpeGVkIHNpemVzIHNwZWNpZmllZCBieSBcIiArIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHdyaXRlci5zaXplXzMyICs9IDIgKyAoKHN6XzMyXzY0WzBdICsgMykgPj4gMik7XG4gICAgICAgIHdyaXRlci5zaXplXzY0ICs9IDIgKyAoKHN6XzMyXzY0WzFdICsgNykgPj4gMyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgQXJyYXkgJiYgdlswXSA9PT0gKHZbMF18MCkpIHtcbiAgICAgICAgaWYgKHZbMF0gPT0gMjUxKSB7XG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcIm91dHB1dF92YWx1ZTogYWJzdHJhY3QgdmFsdWUgKEFic3RyYWN0KVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FtbF9pc19jb250aW51YXRpb25fdGFnKHZbMF0pKVxuICAgICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIm91dHB1dF92YWx1ZTogY29udGludWF0aW9uIHZhbHVlXCIpO1xuICAgICAgICBpZiAodi5sZW5ndGggPiAxICYmIG1lbW8odikpIHJldHVybjtcbiAgICAgICAgaWYgKHZbMF0gPCAxNiAmJiB2Lmxlbmd0aCAtIDEgPCA4KVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHg4MCAvKmNzdC5QUkVGSVhfU01BTExfQkxPQ0sqLyArIHZbMF0gKyAoKHYubGVuZ3RoIC0gMSk8PDQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDMyLCAweDA4IC8qY3N0LkNPREVfQkxPQ0szMiovLCAoKHYubGVuZ3RoLTEpIDw8IDEwKSB8IHZbMF0pO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSB2Lmxlbmd0aDtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gdi5sZW5ndGg7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA+IDEpIHN0YWNrLnB1c2ggKHYsIDEpO1xuICAgICAgfSBlbHNlIGlmIChjYW1sX2lzX21sX2J5dGVzKHYpKSB7XG4gICAgICAgIGlmKCEoY2FtbF9pc19tbF9ieXRlcyhjYW1sX3N0cmluZ19vZl9qc2J5dGVzKFwiXCIpKSkpIHtcbiAgICAgICAgICBjYW1sX2ZhaWx3aXRoKFwib3V0cHV0X3ZhbHVlOiBbQnl0ZXMudF0gY2Fubm90IHNhZmVseSBiZSBtYXJzaGFsZWQgd2l0aCBbLS1lbmFibGUgdXNlLWpzLXN0cmluZ11cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lbW8odikpIHJldHVybjtcbiAgICAgICAgdmFyIGxlbiA9IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoKHYpO1xuICAgICAgICBpZiAobGVuIDwgMHgyMClcbiAgICAgICAgICB3cml0ZXIud3JpdGUgKDgsIDB4MjAgLypjc3QuUFJFRklYX1NNQUxMX1NUUklORyovICsgbGVuKTtcbiAgICAgICAgZWxzZSBpZiAobGVuIDwgMHgxMDApXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUgKDgsIDB4MDkvKmNzdC5DT0RFX1NUUklORzgqLywgbGVuKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlICgzMiwgMHgwQSAvKmNzdC5DT0RFX1NUUklORzMyKi8sIGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwO2kgPCBsZW47aSsrKVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgY2FtbF9ieXRlc191bnNhZmVfZ2V0KHYsaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KXwwKTtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gMSArICgoKGxlbiArIDgpIC8gOCl8MCk7XG4gICAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKHYpKSB7XG4gICAgICAgIHZhciBsZW4gPSBjYW1sX21sX3N0cmluZ19sZW5ndGgodik7XG4gICAgICAgIGlmIChsZW4gPCAweDIwKVxuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgyMCAvKmNzdC5QUkVGSVhfU01BTExfU1RSSU5HKi8gKyBsZW4pO1xuICAgICAgICBlbHNlIGlmIChsZW4gPCAweDEwMClcbiAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSAoOCwgMHgwOS8qY3N0LkNPREVfU1RSSU5HOCovLCBsZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUgKDMyLCAweDBBIC8qY3N0LkNPREVfU1RSSU5HMzIqLywgbGVuKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7aSA8IGxlbjtpKyspXG4gICAgICAgICAgd3JpdGVyLndyaXRlICg4LCBjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHYsaSkpO1xuICAgICAgICB3cml0ZXIuc2l6ZV8zMiArPSAxICsgKCgobGVuICsgNCkgLyA0KXwwKTtcbiAgICAgICAgd3JpdGVyLnNpemVfNjQgKz0gMSArICgoKGxlbiArIDgpIC8gOCl8MCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodiAhPSAodnwwKSl7XG4gICAgICAgICAgdmFyIHR5cGVfb2ZfdiA9IHR5cGVvZiB2O1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSWYgYSBmbG9hdCBoYXBwZW5zIHRvIGJlIGFuIGludGVnZXIgaXQgaXMgc2VyaWFsaXplZCBhcyBhbiBpbnRlZ2VyXG4gICAgICAgICAgLy8gKEpzX29mX29jYW1sIGNhbm5vdCB0ZWxsIHdoZXRoZXIgdGhlIHR5cGUgb2YgYW4gaW50ZWdlciBudW1iZXIgaXNcbiAgICAgICAgICAvLyBmbG9hdCBvciBpbnRlZ2VyLikgVGhpcyBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgY3Jhc2hlcyB3aGVuXG4gICAgICAgICAgLy8gdW5tYXJzaGFsbGluZyB1c2luZyB0aGUgc3RhbmRhcmQgcnVudGltZS4gSXQgc2VlbXMgYmV0dGVyIHRvXG4gICAgICAgICAgLy8gc3lzdGVtYXRpY2FsbHkgZmFpbCBvbiBtYXJzaGFsbGluZy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vICAgICAgICAgIGlmKHR5cGVfb2ZfdiAhPSBcIm51bWJlclwiKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJvdXRwdXRfdmFsdWU6IGFic3RyYWN0IHZhbHVlIChcIit0eXBlX29mX3YrXCIpXCIpO1xuICAgICAgICAgIC8vICAgICAgICAgIHZhciB0ID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQodikpO1xuICAgICAgICAgIC8vICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMHgwQiAvKmNzdC5DT0RFX0RPVUJMRV9CSUcqLyk7XG4gICAgICAgICAgLy8gICAgICAgICAgZm9yKHZhciBpID0gMDsgaTw4OyBpKyspe3dyaXRlci53cml0ZSg4LHRbaV0pfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHYgPj0gMCAmJiB2IDwgMHg0MCkge1xuICAgICAgICAgIHdyaXRlci53cml0ZSAoOCwgMFg0MCAvKmNzdC5QUkVGSVhfU01BTExfSU5UKi8gKyB2KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodiA+PSAtKDEgPDwgNykgJiYgdiA8ICgxIDw8IDcpKVxuICAgICAgICAgICAgd3JpdGVyLndyaXRlX2NvZGUoOCwgMHgwMCAvKmNzdC5DT0RFX0lOVDgqLywgdik7XG4gICAgICAgICAgZWxzZSBpZiAodiA+PSAtKDEgPDwgMTUpICYmIHYgPCAoMSA8PCAxNSkpXG4gICAgICAgICAgICB3cml0ZXIud3JpdGVfY29kZSgxNiwgMHgwMSAvKmNzdC5DT0RFX0lOVDE2Ki8sIHYpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHdyaXRlci53cml0ZV9jb2RlKDMyLCAweDAyIC8qY3N0LkNPREVfSU5UMzIqLywgdik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZXh0ZXJuX3JlYyAodik7XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBpID0gc3RhY2sucG9wICgpO1xuICAgICAgdmFyIHYgPSBzdGFjay5wb3AgKCk7XG4gICAgICBpZiAoaSArIDEgPCB2Lmxlbmd0aCkgc3RhY2sucHVzaCAodiwgaSArIDEpO1xuICAgICAgZXh0ZXJuX3JlYyAodltpXSk7XG4gICAgfVxuICAgIGlmIChpbnRlcm5fb2JqX3RhYmxlKSB3cml0ZXIub2JqX2NvdW50ZXIgPSBpbnRlcm5fb2JqX3RhYmxlLm9ianMubGVuZ3RoO1xuICAgIHdyaXRlci5maW5hbGl6ZSgpO1xuICAgIHJldHVybiB3cml0ZXIuY2h1bms7XG4gIH1cbn0gKCk7XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlX3RvX3N0cmluZyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWwsIGNhbWxfc3RyaW5nX29mX2FycmF5XG5mdW5jdGlvbiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcgKHYsIGZsYWdzKSB7XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheSAoY2FtbF9vdXRwdXRfdmFsICh2LCBmbGFncykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWx1ZV90b19ieXRlcyBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWwsIGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbmZ1bmN0aW9uIGNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J5dGVzICh2LCBmbGFncykge1xuICByZXR1cm4gY2FtbF9ieXRlc19vZl9hcnJheSAoY2FtbF9vdXRwdXRfdmFsICh2LCBmbGFncykpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX291dHB1dF92YWx1ZV90b19idWZmZXJcbi8vUmVxdWlyZXM6IGNhbWxfb3V0cHV0X3ZhbCwgY2FtbF9mYWlsd2l0aCwgY2FtbF9ibGl0X2J5dGVzXG5mdW5jdGlvbiBjYW1sX291dHB1dF92YWx1ZV90b19idWZmZXIgKHMsIG9mcywgbGVuLCB2LCBmbGFncykge1xuICB2YXIgdCA9IGNhbWxfb3V0cHV0X3ZhbCAodiwgZmxhZ3MpO1xuICBpZiAodC5sZW5ndGggPiBsZW4pIGNhbWxfZmFpbHdpdGggKFwiTWFyc2hhbC50b19idWZmZXI6IGJ1ZmZlciBvdmVyZmxvd1wiKTtcbiAgY2FtbF9ibGl0X2J5dGVzKHQsIDAsIHMsIG9mcywgdC5sZW5ndGgpO1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkXG4vLyBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3Rcbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSW9cblxuLy9Qcm92aWRlczogY2FtbF9zeXNfZmRzXG52YXIgY2FtbF9zeXNfZmRzID0gbmV3IEFycmF5KDMpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3N5c19jbG9zZVxuLy9SZXF1aXJlczogY2FtbF9zeXNfZmRzXG5mdW5jdGlvbiBjYW1sX3N5c19jbG9zZShmZCkge1xuICB2YXIgZmlsZSA9IGNhbWxfc3lzX2Zkc1tmZF07XG4gIGlmKGZpbGUpIGZpbGUuY2xvc2UoKTtcbiAgZGVsZXRlIGNhbWxfc3lzX2Zkc1tmZF07XG4gIHJldHVybiAwO1xufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3lzX29wZW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBNbEZha2VGZF9vdXRcbi8vUmVxdWlyZXM6IHJlc29sdmVfZnNfZGV2aWNlXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBmc19ub2RlX3N1cHBvcnRlZFxuLy9SZXF1aXJlczogY2FtbF9zeXNfZmRzXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuX2Zvcl9ub2RlXG5mdW5jdGlvbiBjYW1sX3N5c19vcGVuX2ludGVybmFsKGZpbGUsaWR4KSB7XG4gIGlmKGlkeCA9PSB1bmRlZmluZWQpe1xuICAgIGlkeCA9IGNhbWxfc3lzX2Zkcy5sZW5ndGg7XG4gIH1cbiAgY2FtbF9zeXNfZmRzW2lkeF0gPSBmaWxlO1xuICByZXR1cm4gaWR4IHwgMDtcbn1cbmZ1bmN0aW9uIGNhbWxfc3lzX29wZW4gKG5hbWUsIGZsYWdzLCBfcGVybXMpIHtcbiAgdmFyIGYgPSB7fTtcbiAgd2hpbGUoZmxhZ3Mpe1xuICAgIHN3aXRjaChmbGFnc1sxXSl7XG4gICAgY2FzZSAwOiBmLnJkb25seSA9IDE7YnJlYWs7XG4gICAgY2FzZSAxOiBmLndyb25seSA9IDE7YnJlYWs7XG4gICAgY2FzZSAyOiBmLmFwcGVuZCA9IDE7YnJlYWs7XG4gICAgY2FzZSAzOiBmLmNyZWF0ZSA9IDE7YnJlYWs7XG4gICAgY2FzZSA0OiBmLnRydW5jYXRlID0gMTticmVhaztcbiAgICBjYXNlIDU6IGYuZXhjbCA9IDE7IGJyZWFrO1xuICAgIGNhc2UgNjogZi5iaW5hcnkgPSAxO2JyZWFrO1xuICAgIGNhc2UgNzogZi50ZXh0ID0gMTticmVhaztcbiAgICBjYXNlIDg6IGYubm9uYmxvY2sgPSAxO2JyZWFrO1xuICAgIH1cbiAgICBmbGFncz1mbGFnc1syXTtcbiAgfVxuICBpZihmLnJkb25seSAmJiBmLndyb25seSlcbiAgICBjYW1sX3JhaXNlX3N5c19lcnJvcihjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG5hbWUpICsgXCIgOiBmbGFncyBPcGVuX3Jkb25seSBhbmQgT3Blbl93cm9ubHkgYXJlIG5vdCBjb21wYXRpYmxlXCIpO1xuICBpZihmLnRleHQgJiYgZi5iaW5hcnkpXG4gICAgY2FtbF9yYWlzZV9zeXNfZXJyb3IoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhuYW1lKSArIFwiIDogZmxhZ3MgT3Blbl90ZXh0IGFuZCBPcGVuX2JpbmFyeSBhcmUgbm90IGNvbXBhdGlibGVcIik7XG4gIHZhciByb290ID0gcmVzb2x2ZV9mc19kZXZpY2UobmFtZSk7XG4gIHZhciBmaWxlID0gcm9vdC5kZXZpY2Uub3Blbihyb290LnJlc3QsZik7XG4gIHJldHVybiBjYW1sX3N5c19vcGVuX2ludGVybmFsIChmaWxlLCB1bmRlZmluZWQpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZmlsZShmZCwgZmxhZ3MpIHtcbiAgICBpZihmc19ub2RlX3N1cHBvcnRlZCgpKSB7XG4gICAgICByZXR1cm4gY2FtbF9zeXNfb3Blbl9mb3Jfbm9kZShmZCwgZmxhZ3MpO1xuICAgIH1cbiAgICBlbHNlXG4gICAgICByZXR1cm4gbmV3IE1sRmFrZUZkX291dChmZCwgZmxhZ3MpXG4gIH1cbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlKDAse3Jkb25seToxLGFsdG5hbWU6XCIvZGV2L3N0ZGluXCIsaXNDaGFyYWN0ZXJEZXZpY2U6dHJ1ZX0pLCAwKTtcbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlKDEse2J1ZmZlcmVkOjIsd3Jvbmx5OjEsaXNDaGFyYWN0ZXJEZXZpY2U6dHJ1ZX0pLCAxKTtcbiAgY2FtbF9zeXNfb3Blbl9pbnRlcm5hbChmaWxlKDIse2J1ZmZlcmVkOjIsd3Jvbmx5OjEsaXNDaGFyYWN0ZXJEZXZpY2U6dHJ1ZX0pLCAyKTtcbn0pKClcblxuXG4vLyBvY2FtbCBDaGFubmVsc1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9jaGFubmVsX25hbWVcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfc2V0X2NoYW5uZWxfbmFtZShjaGFuaWQsIG5hbWUpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGNoYW4ubmFtZSA9IG5hbWU7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2NoYW5uZWxzXG52YXIgY2FtbF9tbF9jaGFubmVscyA9IG5ldyBBcnJheSgpO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX291dF9jaGFubmVsc19saXN0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX291dF9jaGFubmVsc19saXN0ICgpIHtcbiAgdmFyIGwgPSAwO1xuICBmb3IodmFyIGMgPSAwOyBjIDwgY2FtbF9tbF9jaGFubmVscy5sZW5ndGg7IGMrKyl7XG4gICAgaWYoY2FtbF9tbF9jaGFubmVsc1tjXSAmJiBjYW1sX21sX2NoYW5uZWxzW2NdLm9wZW5lZCAmJiBjYW1sX21sX2NoYW5uZWxzW2NdLm91dClcbiAgICAgIGw9WzAsY2FtbF9tbF9jaGFubmVsc1tjXS5mZCxsXTtcbiAgfVxuICByZXR1cm4gbDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9vdXRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfc3lzX2Zkc1xuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX29wZW5cbmZ1bmN0aW9uIGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dCAoZmQpIHtcbiAgdmFyIGZpbGUgPSBjYW1sX3N5c19mZHNbZmRdO1xuICBpZihmaWxlLmZsYWdzLnJkb25seSkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJmZCBcIisgZmQgKyBcIiBpcyByZWFkb25seVwiKTtcbiAgdmFyIGJ1ZmZlcmVkID0gKGZpbGUuZmxhZ3MuYnVmZmVyZWQgIT09IHVuZGVmaW5lZCkgPyBmaWxlLmZsYWdzLmJ1ZmZlcmVkIDogMTtcbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTpmaWxlLFxuICAgIG9mZnNldDpmaWxlLmZsYWdzLmFwcGVuZD9maWxlLmxlbmd0aCgpOjAsXG4gICAgZmQ6ZmQsXG4gICAgb3BlbmVkOnRydWUsXG4gICAgb3V0OnRydWUsXG4gICAgYnVmZmVyX2N1cnI6MCxcbiAgICBidWZmZXI6bmV3IFVpbnQ4QXJyYXkoNjU1MzYpLFxuICAgIGJ1ZmZlcmVkOmJ1ZmZlcmVkXG4gIH07XG4gIGNhbWxfbWxfY2hhbm5lbHNbY2hhbm5lbC5mZF09Y2hhbm5lbDtcbiAgcmV0dXJuIGNoYW5uZWwuZmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX2luXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX3N5c19mZHNcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX3N5c19vcGVuXG5mdW5jdGlvbiBjYW1sX21sX29wZW5fZGVzY3JpcHRvcl9pbiAoZmQpICB7XG4gIHZhciBmaWxlID0gY2FtbF9zeXNfZmRzW2ZkXTtcbiAgaWYoZmlsZS5mbGFncy53cm9ubHkpIGNhbWxfcmFpc2Vfc3lzX2Vycm9yKFwiZmQgXCIrIGZkICsgXCIgaXMgd3JpdGVvbmx5XCIpO1xuICB2YXIgcmVmaWxsID0gbnVsbDtcbiAgdmFyIGNoYW5uZWwgPSB7XG4gICAgZmlsZTpmaWxlLFxuICAgIG9mZnNldDpmaWxlLmZsYWdzLmFwcGVuZD9maWxlLmxlbmd0aCgpOjAsXG4gICAgZmQ6ZmQsXG4gICAgb3BlbmVkOnRydWUsXG4gICAgb3V0OiBmYWxzZSxcbiAgICBidWZmZXJfY3VycjowLFxuICAgIGJ1ZmZlcl9tYXg6MCxcbiAgICBidWZmZXI6bmV3IFVpbnQ4QXJyYXkoNjU1MzYpLFxuICAgIHJlZmlsbDpyZWZpbGxcbiAgfTtcbiAgY2FtbF9tbF9jaGFubmVsc1tjaGFubmVsLmZkXT1jaGFubmVsO1xuICByZXR1cm4gY2hhbm5lbC5mZDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvclxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuLy9BbGlhczogd2luX2ZpbGVkZXNjcl9vZl9jaGFubmVsXG5mdW5jdGlvbiBjYW1sX2NoYW5uZWxfZGVzY3JpcHRvcihjaGFuaWQpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNoYW4uZmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2JpbmFyeV9tb2RlXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX3NldF9iaW5hcnlfbW9kZShjaGFuaWQsbW9kZSl7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBjaGFuLmZpbGUuZmxhZ3MudGV4dCA9ICFtb2RlXG4gIGNoYW4uZmlsZS5mbGFncy5iaW5hcnkgPSBtb2RlXG4gIHJldHVybiAwO1xufVxuXG4vL0lucHV0IGZyb20gaW5fY2hhbm5lbFxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2Nsb3NlX2NoYW5uZWxcbi8vUmVxdWlyZXM6IGNhbWxfbWxfZmx1c2gsIGNhbWxfbWxfY2hhbm5lbHNcbi8vUmVxdWlyZXM6IGNhbWxfc3lzX2Nsb3NlXG5mdW5jdGlvbiBjYW1sX21sX2Nsb3NlX2NoYW5uZWwgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2hhbi5vcGVuZWQgPSBmYWxzZTtcbiAgY2FtbF9zeXNfY2xvc2UoY2hhbi5mZClcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX2NoYW5uZWxfc2l6ZShjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjaGFuLmZpbGUubGVuZ3RoKCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfY2hhbm5lbF9zaXplXzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2Zsb2F0LGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfY2hhbm5lbF9zaXplXzY0KGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfZmxvYXQoY2hhbi5maWxlLmxlbmd0aCAoKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX21sX3NldF9jaGFubmVsX291dHB1dChjaGFuaWQsZikge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2hhbi5vdXRwdXQgPSAoZnVuY3Rpb24gKHMpIHtmKHMpfSk7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVsc1xuZnVuY3Rpb24gY2FtbF9tbF9zZXRfY2hhbm5lbF9yZWZpbGwoY2hhbmlkLGYpIHtcbiAgY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdLnJlZmlsbCA9IGY7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3JlZmlsbFxuLy9SZXF1aXJlczogY2FtbF9tbF9zdHJpbmdfbGVuZ3RoLCBjYW1sX3VpbnQ4X2FycmF5X29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9yZWZpbGwgKGNoYW4pIHtcbiAgaWYoY2hhbi5yZWZpbGwgIT0gbnVsbCl7XG4gICAgdmFyIHN0ciA9IGNoYW4ucmVmaWxsKCk7XG4gICAgdmFyIHN0cl9hID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyX2EubGVuZ3RoID09IDApIHtcbiAgICAgIGNoYW4ucmVmaWxsID0gbnVsbFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmKGNoYW4uYnVmZmVyLmxlbmd0aCA8IGNoYW4uYnVmZmVyX21heCArIHN0cl9hLmxlbmd0aCl7XG4gICAgICAgIHZhciBiID0gbmV3IFVpbnQ4QXJyYXkoY2hhbi5idWZmZXJfbWF4ICsgc3RyX2EubGVuZ3RoKTtcbiAgICAgICAgYi5zZXQoY2hhbi5idWZmZXIpO1xuICAgICAgICBjaGFuLmJ1ZmZlciA9IGI7XG4gICAgICB9XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoc3RyX2EsY2hhbi5idWZmZXJfbWF4KTtcbiAgICAgIGNoYW4ub2Zmc2V0ICs9IHN0cl9hLmxlbmd0aDtcbiAgICAgIGNoYW4uYnVmZmVyX21heCArPSBzdHJfYS5sZW5ndGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBucmVhZCA9IGNoYW4uZmlsZS5yZWFkKGNoYW4ub2Zmc2V0LCBjaGFuLmJ1ZmZlciwgY2hhbi5idWZmZXJfbWF4LCBjaGFuLmJ1ZmZlci5sZW5ndGggLSBjaGFuLmJ1ZmZlcl9tYXgpO1xuICAgIGNoYW4ub2Zmc2V0ICs9IG5yZWFkO1xuICAgIGNoYW4uYnVmZmVyX21heCArPSBucmVhZDtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2lucHV0X2Jsb2NrXG4vL1JlcXVpcmVzOiBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0IChjaGFuaWQsIGIsIGksIGwpIHtcbiAgdmFyIGJhID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhiKTtcbiAgcmV0dXJuIGNhbWxfbWxfaW5wdXRfYmxvY2soY2hhbmlkLCBiYSwgaSwgbClcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dF9ibG9ja1xuLy9SZXF1aXJlczogY2FtbF9yZWZpbGwsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfYmxvY2sgKGNoYW5pZCwgYmEsIGksIGwpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHZhciBuID0gbDtcbiAgdmFyIGF2YWlsID0gY2hhbi5idWZmZXJfbWF4IC0gY2hhbi5idWZmZXJfY3VycjtcbiAgaWYobCA8PSBhdmFpbCkge1xuICAgIGJhLnNldChjaGFuLmJ1ZmZlci5zdWJhcnJheShjaGFuLmJ1ZmZlcl9jdXJyLGNoYW4uYnVmZmVyX2N1cnIgKyBsKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBsO1xuICB9XG4gIGVsc2UgaWYoYXZhaWwgPiAwKSB7XG4gICAgYmEuc2V0KGNoYW4uYnVmZmVyLnN1YmFycmF5KGNoYW4uYnVmZmVyX2N1cnIsY2hhbi5idWZmZXJfY3VyciArIGF2YWlsKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBhdmFpbDtcbiAgICBuID0gYXZhaWw7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICBjYW1sX3JlZmlsbChjaGFuKTtcbiAgICB2YXIgYXZhaWwgPSBjaGFuLmJ1ZmZlcl9tYXggLSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgIGlmKG4gPiBhdmFpbCkgbiA9IGF2YWlsO1xuICAgIGJhLnNldChjaGFuLmJ1ZmZlci5zdWJhcnJheShjaGFuLmJ1ZmZlcl9jdXJyLGNoYW4uYnVmZmVyX2N1cnIgKyBuKSwgaSk7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBuO1xuICB9XG4gIHJldHVybiBuIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnB1dF92YWx1ZVxuLy9SZXF1aXJlczogY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZSwgY2FtbF9pbnB1dF92YWx1ZV9mcm9tX2J5dGVzLCBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9tbF9jaGFubmVscywgY2FtbF9ieXRlc19vZl9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9yZWZpbGwsIGNhbWxfZmFpbHdpdGgsIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGVcbi8vUmVxdWlyZXM6IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZVxuZnVuY3Rpb24gY2FtbF9pbnB1dF92YWx1ZSAoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICB2YXIgaGVhZGVyID0gbmV3IFVpbnQ4QXJyYXkoY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKTtcbiAgZnVuY3Rpb24gYmxvY2soYnVmZmVyLCBvZmZzZXQsIG4pIHtcbiAgICB2YXIgciA9IDA7XG4gICAgd2hpbGUociA8IG4pe1xuICAgICAgaWYoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpe1xuICAgICAgICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgICAgICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgICAgICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpXG4gICAgICAgIGJyZWFrO1xuICAgICAgYnVmZmVyW29mZnNldCtyXSA9IGNoYW4uYnVmZmVyW2NoYW4uYnVmZmVyX2N1cnJdO1xuICAgICAgY2hhbi5idWZmZXJfY3VycisrO1xuICAgICAgcisrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICB2YXIgciA9IGJsb2NrKGhlYWRlciwgMCwgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKTtcbiAgaWYociA9PSAwKVxuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgZWxzZSBpZiAociA8IGNhbWxfbWFyc2hhbF9oZWFkZXJfc2l6ZSlcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHRydW5jYXRlZCBvYmplY3RcIik7XG4gIHZhciBsZW4gPSBjYW1sX21hcnNoYWxfZGF0YV9zaXplIChjYW1sX2J5dGVzX29mX2FycmF5KGhlYWRlciksIDApO1xuICB2YXIgYnVmID0gbmV3IFVpbnQ4QXJyYXkobGVuICsgY2FtbF9tYXJzaGFsX2hlYWRlcl9zaXplKTtcbiAgYnVmLnNldChoZWFkZXIsMCk7XG4gIHZhciByID0gYmxvY2soYnVmLCBjYW1sX21hcnNoYWxfaGVhZGVyX3NpemUsIGxlbilcbiAgaWYociA8IGxlbilcbiAgICBjYW1sX2ZhaWx3aXRoKFwiaW5wdXRfdmFsdWU6IHRydW5jYXRlZCBvYmplY3QgXCIgKyByICsgXCIgIFwiICsgbGVuKTtcbiAgdmFyIG9mZnNldCA9IFswXTtcbiAgdmFyIHJlcyA9IGNhbWxfaW5wdXRfdmFsdWVfZnJvbV9ieXRlcyhjYW1sX2J5dGVzX29mX2FycmF5KGJ1ZiksIG9mZnNldCk7XG4gIGNoYW4ub2Zmc2V0ID0gY2hhbi5vZmZzZXQgKyBvZmZzZXRbMF07XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaW5wdXRfdmFsdWVfdG9fb3V0c2lkZV9oZWFwXG4vL1JlcXVpcmVzOiBjYW1sX2lucHV0X3ZhbHVlXG5mdW5jdGlvbiBjYW1sX2lucHV0X3ZhbHVlX3RvX291dHNpZGVfaGVhcChjKSB7XG4gIHJldHVybiBjYW1sX2lucHV0X3ZhbHVlKGMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2lucHV0X2NoYXJcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfcmVmaWxsXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X2NoYXIgKGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYoY2hhbi5idWZmZXJfY3VyciA+PSBjaGFuLmJ1ZmZlcl9tYXgpe1xuICAgIGNoYW4uYnVmZmVyX2N1cnIgPSAwO1xuICAgIGNoYW4uYnVmZmVyX21heCA9IDA7XG4gICAgY2FtbF9yZWZpbGwoY2hhbik7XG4gIH1cbiAgaWYgKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXJfbWF4KVxuICAgIGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUoKTtcbiAgdmFyIHJlcyA9IGNoYW4uYnVmZmVyW2NoYW4uYnVmZmVyX2N1cnJdO1xuICBjaGFuLmJ1ZmZlcl9jdXJyKys7XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaW5wdXRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX3JhaXNlX2VuZF9vZl9maWxlXG4vL1JlcXVpcmVzOiBjYW1sX21sX2lucHV0X2NoYXIsIGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfaW5wdXRfaW50IChjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHZhciByZXMgPSAwO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgNDsgaSsrKXtcbiAgICByZXMgPSAocmVzIDw8IDgpICsgY2FtbF9tbF9pbnB1dF9jaGFyKGNoYW5pZCkgfCAwO1xuICB9XG4gIHJldHVybiByZXMgfCAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NlZWtfaW5cbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2Vfc3lzX2Vycm9yLCBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX3NlZWtfaW4oY2hhbmlkLCBwb3MpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIGlmIChjaGFuLnJlZmlsbCAhPSBudWxsKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIklsbGVnYWwgc2Vla1wiKTtcbiAgaWYocG9zID49IGNoYW4ub2Zmc2V0IC0gY2hhbi5idWZmZXJfbWF4XG4gICAgICYmIHBvcyA8PSBjaGFuLm9mZnNldFxuICAgICAmJiBjaGFuLmZpbGUuZmxhZ3MuYmluYXJ5KSB7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IGNoYW4uYnVmZmVyX21heCAtIChjaGFuLm9mZnNldCAtIHBvcyk7XG4gIH0gZWxzZSB7XG4gICAgY2hhbi5vZmZzZXQgPSBwb3M7XG4gICAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gICAgY2hhbi5idWZmZXJfbWF4ID0gMDtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZWVrX2luXG4vL1JlcXVpcmVzOiBjYW1sX3NlZWtfaW5cbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19pbihjaGFuaWQscG9zKXtcbiAgcmV0dXJuIGNhbWxfc2Vla19pbihjaGFuaWQscG9zKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9zZWVrX2luXzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2Zsb2F0LCBjYW1sX3NlZWtfaW5cbmZ1bmN0aW9uIGNhbWxfbWxfc2Vla19pbl82NChjaGFuaWQscG9zKXtcbiAgdmFyIHBvcyA9IGNhbWxfaW50NjRfdG9fZmxvYXQocG9zKTtcbiAgcmV0dXJuIGNhbWxfc2Vla19pbihjaGFuaWQsIHBvcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9zX2luXG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzXG5mdW5jdGlvbiBjYW1sX3Bvc19pbihjaGFuaWQpIHtcbiAgdmFyIGNoYW4gPSBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF07XG4gIHJldHVybiBjaGFuLm9mZnNldCAtIChjaGFuLmJ1ZmZlcl9tYXggLSBjaGFuLmJ1ZmZlcl9jdXJyKSB8IDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX2luXG4vL1JlcXVpcmVzOiBjYW1sX3Bvc19pblxuZnVuY3Rpb24gY2FtbF9tbF9wb3NfaW4oY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX3Bvc19pbihjaGFuaWQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19pbl82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9wb3NfaW5cbmZ1bmN0aW9uIGNhbWxfbWxfcG9zX2luXzY0KGNoYW5pZCkge1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9mbG9hdChjYW1sX3Bvc19pbihjaGFuaWQpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmVcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3Jcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHMsIGNhbWxfcmVmaWxsXG5mdW5jdGlvbiBjYW1sX21sX2lucHV0X3NjYW5fbGluZShjaGFuaWQpe1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgdmFyIHAgPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICBkbyB7XG4gICAgaWYocCA+PSBjaGFuLmJ1ZmZlcl9tYXgpIHtcbiAgICAgIGlmKGNoYW4uYnVmZmVyX2N1cnIgPiAwKSB7XG4gICAgICAgIGNoYW4uYnVmZmVyLnNldChjaGFuLmJ1ZmZlci5zdWJhcnJheShjaGFuLmJ1ZmZlcl9jdXJyKSwwKTtcbiAgICAgICAgcCAtPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICAgICAgICBjaGFuLmJ1ZmZlcl9tYXggLT0gY2hhbi5idWZmZXJfY3VycjtcbiAgICAgICAgY2hhbi5idWZmZXJfY3VyciA9IDA7XG4gICAgICB9XG4gICAgICBpZihjaGFuLmJ1ZmZlcl9tYXggPj0gY2hhbi5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtKGNoYW4uYnVmZmVyX21heCkgfCAwO1xuICAgICAgfVxuICAgICAgdmFyIHByZXZfbWF4ID0gY2hhbi5idWZmZXJfbWF4O1xuICAgICAgY2FtbF9yZWZpbGwgKGNoYW4pO1xuICAgICAgaWYocHJldl9tYXggPT0gY2hhbi5idWZmZXJfbWF4KSB7XG4gICAgICAgIHJldHVybiAtKGNoYW4uYnVmZmVyX21heCkgfCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoY2hhbi5idWZmZXJbcCsrXSAhPSAxMCk7XG4gIHJldHVybiAocCAtIGNoYW4uYnVmZmVyX2N1cnIpIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9mbHVzaFxuLy9SZXF1aXJlczogY2FtbF9yYWlzZV9zeXNfZXJyb3IsIGNhbWxfbWxfY2hhbm5lbHNcbi8vUmVxdWlyZXM6IGNhbWxfc3ViYXJyYXlfdG9fanNieXRlc1xuZnVuY3Rpb24gY2FtbF9tbF9mbHVzaCAoY2hhbmlkKSB7XG4gIHZhciBjaGFuID0gY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdO1xuICBpZighIGNoYW4ub3BlbmVkKSBjYW1sX3JhaXNlX3N5c19lcnJvcihcIkNhbm5vdCBmbHVzaCBhIGNsb3NlZCBjaGFubmVsXCIpO1xuICBpZighY2hhbi5idWZmZXIgfHwgY2hhbi5idWZmZXJfY3VyciA9PSAwKSByZXR1cm4gMDtcbiAgaWYoY2hhbi5vdXRwdXQpIHtcbiAgICBjaGFuLm91dHB1dChjYW1sX3N1YmFycmF5X3RvX2pzYnl0ZXMoY2hhbi5idWZmZXIsIDAsIGNoYW4uYnVmZmVyX2N1cnIpKTtcbiAgfSBlbHNlIHtcbiAgICBjaGFuLmZpbGUud3JpdGUoY2hhbi5vZmZzZXQsIGNoYW4uYnVmZmVyLCAwLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgfVxuICBjaGFuLm9mZnNldCArPSBjaGFuLmJ1ZmZlcl9jdXJyO1xuICBjaGFuLmJ1ZmZlcl9jdXJyID0gMDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vb3V0cHV0IHRvIG91dF9jaGFubmVsXG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2ZsdXNoLGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG4vL1JlcXVpcmVzOiBjYW1sX2NyZWF0ZV9ieXRlcywgY2FtbF9ibGl0X2J5dGVzLCBjYW1sX3JhaXNlX3N5c19lcnJvciwgY2FtbF9tbF9jaGFubmVscywgY2FtbF9zdHJpbmdfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2J5dGVzKGNoYW5pZCxidWZmZXIsb2Zmc2V0LGxlbikge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgaWYoISBjaGFuLm9wZW5lZCkgY2FtbF9yYWlzZV9zeXNfZXJyb3IoXCJDYW5ub3Qgb3V0cHV0IHRvIGEgY2xvc2VkIGNoYW5uZWxcIik7XG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGJ1ZmZlcik7XG4gIGJ1ZmZlciA9IGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGxlbik7XG4gIGlmKGNoYW4uYnVmZmVyX2N1cnIgKyBidWZmZXIubGVuZ3RoID4gY2hhbi5idWZmZXIubGVuZ3RoKSB7XG4gICAgdmFyIGIgPSBuZXcgVWludDhBcnJheShjaGFuLmJ1ZmZlcl9jdXJyICsgYnVmZmVyLmxlbmd0aCk7XG4gICAgYi5zZXQoY2hhbi5idWZmZXIpO1xuICAgIGNoYW4uYnVmZmVyID0gYlxuICB9XG4gIHN3aXRjaChjaGFuLmJ1ZmZlcmVkKXtcbiAgY2FzZSAwOiAvLyBVbmJ1ZmZlcmVkXG4gICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgIGNhbWxfbWxfZmx1c2ggKGNoYW5pZCk7XG4gICAgYnJlYWtcbiAgY2FzZSAxOiAvLyBCdWZmZXJlZCAodGhlIGRlZmF1bHQpXG4gICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgY2hhbi5idWZmZXJfY3VyciArPSBidWZmZXIubGVuZ3RoO1xuICAgIGlmKGNoYW4uYnVmZmVyX2N1cnIgPj0gY2hhbi5idWZmZXIubGVuZ3RoKVxuICAgICAgY2FtbF9tbF9mbHVzaCAoY2hhbmlkKTtcbiAgICBicmVhaztcbiAgY2FzZSAyOiAvLyBCdWZmZXJlZCAob25seSBmb3Igc3Rkb3V0IGFuZCBzdGRlcnIpXG4gICAgdmFyIGlkID0gYnVmZmVyLmxhc3RJbmRleE9mKDEwKVxuICAgIGlmKGlkIDwgMCkge1xuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlciwgY2hhbi5idWZmZXJfY3Vycik7XG4gICAgICBjaGFuLmJ1ZmZlcl9jdXJyICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBpZihjaGFuLmJ1ZmZlcl9jdXJyID49IGNoYW4uYnVmZmVyLmxlbmd0aClcbiAgICAgICAgY2FtbF9tbF9mbHVzaCAoY2hhbmlkKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGFuLmJ1ZmZlci5zZXQoYnVmZmVyLnN1YmFycmF5KDAsIGlkICsgMSksIGNoYW4uYnVmZmVyX2N1cnIpO1xuICAgICAgY2hhbi5idWZmZXJfY3VyciArPSBpZCArIDE7XG4gICAgICBjYW1sX21sX2ZsdXNoIChjaGFuaWQpO1xuICAgICAgY2hhbi5idWZmZXIuc2V0KGJ1ZmZlci5zdWJhcnJheShpZCArIDEpLCBjaGFuLmJ1ZmZlcl9jdXJyKTtcbiAgICAgIGNoYW4uYnVmZmVyX2N1cnIgKz0gYnVmZmVyLmxlbmd0aCAtIGlkIC0gMTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0XG4vL1JlcXVpcmVzOiBjYW1sX21sX291dHB1dF9ieXRlcywgY2FtbF9ieXRlc19vZl9zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxidWZmZXIsb2Zmc2V0LGxlbil7XG4gIHJldHVybiBjYW1sX21sX291dHB1dF9ieXRlcyhjaGFuaWQsY2FtbF9ieXRlc19vZl9zdHJpbmcoYnVmZmVyKSxvZmZzZXQsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9vdXRwdXRfY2hhclxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbWxfb3V0cHV0X2NoYXIgKGNoYW5pZCxjKSB7XG4gIHZhciBzID0gY2FtbF9zdHJpbmdfb2ZfanNieXRlcyhTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLHMsMCwxKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb3V0cHV0X3ZhbHVlXG4vL1JlcXVpcmVzOiBjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmcsIGNhbWxfbWxfb3V0cHV0LGNhbWxfbWxfc3RyaW5nX2xlbmd0aFxuZnVuY3Rpb24gY2FtbF9vdXRwdXRfdmFsdWUgKGNoYW5pZCx2LGZsYWdzKSB7XG4gIHZhciBzID0gY2FtbF9vdXRwdXRfdmFsdWVfdG9fc3RyaW5nKHYsIGZsYWdzKTtcbiAgY2FtbF9tbF9vdXRwdXQoY2hhbmlkLHMsMCxjYW1sX21sX3N0cmluZ19sZW5ndGgocykpO1xuICByZXR1cm4gMDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX21sX2NoYW5uZWxzLCBjYW1sX21sX2ZsdXNoXG5mdW5jdGlvbiBjYW1sX3NlZWtfb3V0KGNoYW5pZCwgcG9zKXtcbiAgY2FtbF9tbF9mbHVzaChjaGFuaWQpO1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgY2hhbi5vZmZzZXQgPSBwb3M7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XG4vL1JlcXVpcmVzOiBjYW1sX3NlZWtfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0KGNoYW5pZCxwb3Mpe1xuICByZXR1cm4gY2FtbF9zZWVrX291dChjaGFuaWQsIHBvcyk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NlZWtfb3V0XzY0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3RvX2Zsb2F0LCBjYW1sX3NlZWtfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3NlZWtfb3V0XzY0KGNoYW5pZCxwb3Mpe1xuICB2YXIgcG9zID0gY2FtbF9pbnQ2NF90b19mbG9hdChwb3MpO1xuICByZXR1cm4gY2FtbF9zZWVrX291dChjaGFuaWQsIHBvcyk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcG9zX291dFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9wb3Nfb3V0KGNoYW5pZCkge1xuICB2YXIgY2hhbiA9IGNhbWxfbWxfY2hhbm5lbHNbY2hhbmlkXTtcbiAgcmV0dXJuIGNoYW4ub2Zmc2V0ICsgY2hhbi5idWZmZXJfY3VyclxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3Bvc19vdXRcbi8vUmVxdWlyZXM6IGNhbWxfcG9zX291dFxuZnVuY3Rpb24gY2FtbF9tbF9wb3Nfb3V0KGNoYW5pZCkge1xuICByZXR1cm4gY2FtbF9wb3Nfb3V0KGNoYW5pZCk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfcG9zX291dF82NFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9wb3Nfb3V0XG5mdW5jdGlvbiBjYW1sX21sX3Bvc19vdXRfNjQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX2ludDY0X29mX2Zsb2F0IChjYW1sX3Bvc19vdXQoY2hhbmlkKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfb3V0cHV0X2ludFxuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXRcbi8vUmVxdWlyZXM6IGNhbWxfc3RyaW5nX29mX2FycmF5XG5mdW5jdGlvbiBjYW1sX21sX291dHB1dF9pbnQgKGNoYW5pZCxpKSB7XG4gIHZhciBhcnIgPSBbKGk+PjI0KSAmIDB4RkYsKGk+PjE2KSAmIDB4RkYsKGk+PjgpICYgMHhGRixpICYgMHhGRiBdO1xuICB2YXIgcyA9IGNhbWxfc3RyaW5nX29mX2FycmF5KGFycik7XG4gIGNhbWxfbWxfb3V0cHV0KGNoYW5pZCxzLDAsNCk7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWxfaXNfYnVmZmVyZWRcbi8vUmVxdWlyZXM6IGNhbWxfbWxfY2hhbm5lbHNcbmZ1bmN0aW9uIGNhbWxfbWxfaXNfYnVmZmVyZWQoY2hhbmlkKSB7XG4gIHJldHVybiBjYW1sX21sX2NoYW5uZWxzW2NoYW5pZF0uYnVmZmVyZWQgPyAxIDogMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX3NldF9idWZmZXJlZFxuLy9SZXF1aXJlczogY2FtbF9tbF9jaGFubmVscywgY2FtbF9tbF9mbHVzaFxuZnVuY3Rpb24gY2FtbF9tbF9zZXRfYnVmZmVyZWQoY2hhbmlkLHYpIHtcbiAgY2FtbF9tbF9jaGFubmVsc1tjaGFuaWRdLmJ1ZmZlcmVkID0gdjtcbiAgaWYoIXYpIGNhbWxfbWxfZmx1c2goY2hhbmlkKTtcbiAgcmV0dXJuIDBcbn1cbiIsIlxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21pbm9yXG5mdW5jdGlvbiBjYW1sX2djX21pbm9yKHVuaXQpe1xuICAvL2F2YWlsYWJsZSB3aXRoIFtub2RlIC0tZXhwb3NlLWdjXVxuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5nYyA9PSAnZnVuY3Rpb24nKSBnbG9iYWxUaGlzLmdjKHRydWUpO1xuICByZXR1cm4gMFxufVxuLy9Qcm92aWRlczogY2FtbF9nY19tYWpvclxuZnVuY3Rpb24gY2FtbF9nY19tYWpvcih1bml0KXtcbiAgLy9hdmFpbGFibGUgd2l0aCBbbm9kZSAtLWV4cG9zZS1nY11cbiAgaWYodHlwZW9mIGdsb2JhbFRoaXMuZ2MgPT0gJ2Z1bmN0aW9uJykgZ2xvYmFsVGhpcy5nYygpO1xuICByZXR1cm4gMFxufVxuLy9Qcm92aWRlczogY2FtbF9nY19mdWxsX21ham9yXG5mdW5jdGlvbiBjYW1sX2djX2Z1bGxfbWFqb3IodW5pdCl7XG4gIC8vYXZhaWxhYmxlIHdpdGggW25vZGUgLS1leHBvc2UtZ2NdXG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmdjID09ICdmdW5jdGlvbicpIGdsb2JhbFRoaXMuZ2MoKTtcbiAgcmV0dXJuIDBcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfY29tcGFjdGlvblxuZnVuY3Rpb24gY2FtbF9nY19jb21wYWN0aW9uKCl7IHJldHVybiAwfVxuLy9Qcm92aWRlczogY2FtbF9nY19jb3VudGVyc1xuZnVuY3Rpb24gY2FtbF9nY19jb3VudGVycygpIHsgcmV0dXJuIFsyNTQsMCwwLDBdIH1cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfcXVpY2tfc3RhdFxuZnVuY3Rpb24gY2FtbF9nY19xdWlja19zdGF0KCl7XG4gIHJldHVybiBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXVxufVxuLy9Qcm92aWRlczogY2FtbF9nY19zdGF0XG5mdW5jdGlvbiBjYW1sX2djX3N0YXQoKSB7XG4gIHJldHVybiBbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX3NldFxuZnVuY3Rpb24gY2FtbF9nY19zZXQoX2NvbnRyb2wpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2NfZ2V0XG5mdW5jdGlvbiBjYW1sX2djX2dldCgpe1xuICByZXR1cm4gWzAsMCwwLDAsMCwwLDAsMCwwXVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21lbXByb2Zfc2V0XG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc2V0KF9jb250cm9sKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlZ2lzdGVyIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2ZpbmFsX3JlZ2lzdGVyICgpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9maW5hbF9yZWdpc3Rlcl9jYWxsZWRfd2l0aG91dF92YWx1ZVxudmFyIGFsbF9maW5hbGl6ZXJzID0gbmV3IGdsb2JhbFRoaXMuU2V0KClcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVnaXN0ZXJfY2FsbGVkX3dpdGhvdXRfdmFsdWUgKGNiLCBhKSB7XG4gIGlmKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgYSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHZhciB4ID0gbmV3IGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKHgpe2FsbF9maW5hbGl6ZXJzLmRlbGV0ZSh4KTsgY2IoMCk7IHJldHVybjt9KTtcbiAgICB4LnJlZ2lzdGVyKGEseCk7XG4gICAgYWxsX2ZpbmFsaXplcnMuYWRkKHgpO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2ZpbmFsX3JlbGVhc2UgY29uc3RcbmZ1bmN0aW9uIGNhbWxfZmluYWxfcmVsZWFzZSAoKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWVtcHJvZl9zdGFydFxuZnVuY3Rpb24gY2FtbF9tZW1wcm9mX3N0YXJ0KHJhdGUsc3RhY2tfc2l6ZSx0cmFja2VyKXtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbWVtcHJvZl9zdG9wXG5mdW5jdGlvbiBjYW1sX21lbXByb2Zfc3RvcCh1bml0KSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V2ZW50bG9nX3Jlc3VtZVxuZnVuY3Rpb24gY2FtbF9ldmVudGxvZ19yZXN1bWUodW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2V2ZW50bG9nX3BhdXNlXG5mdW5jdGlvbiBjYW1sX2V2ZW50bG9nX3BhdXNlKHVuaXQpIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nY19odWdlX2ZhbGxiYWNrX2NvdW50XG5mdW5jdGlvbiBjYW1sX2djX2h1Z2VfZmFsbGJhY2tfY291bnQodW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2djX21ham9yX3NsaWNlXG5mdW5jdGlvbiBjYW1sX2djX21ham9yX3NsaWNlKHdvcmspIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9nY19taW5vcl93b3Jkc1xuZnVuY3Rpb24gY2FtbF9nY19taW5vcl93b3Jkcyh1bml0KSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X21pbm9yX2ZyZWVcbmZ1bmN0aW9uIGNhbWxfZ2V0X21pbm9yX2ZyZWUodW5pdCkgeyByZXR1cm4gMDsgfVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9tYWpvcl9idWNrZXRcbmZ1bmN0aW9uIGNhbWxfZ2V0X21ham9yX2J1Y2tldChuKSB7IHJldHVybiAwOyB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfZ2V0X21ham9yX2NyZWRpdFxuZnVuY3Rpb24gY2FtbF9nZXRfbWFqb3JfY3JlZGl0KG4pIHsgcmV0dXJuIDA7IH1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvbiwgSHVnbyBIZXV6YXJkLCBBbmR5IFJheVxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuLy9cbi8vIEJpZ2FycmF5LlxuLy9cbi8vIC0gYWxsIGJpZ2FycmF5IHR5cGVzIGluY2x1ZGluZyBJbnQ2NCBhbmQgQ29tcGxleC5cbi8vIC0gZm9ydHJhbiArIGMgbGF5b3V0c1xuLy8gLSBzdWIvc2xpY2UvcmVzaGFwZVxuLy8gLSByZXRhaW4gZmFzdCBwYXRoIGZvciAxZCBhcnJheSBhY2Nlc3NcblxuLy9Qcm92aWRlczogY2FtbF9iYV9pbml0IGNvbnN0XG5mdW5jdGlvbiBjYW1sX2JhX2luaXQoKSB7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfZ2V0X3NpemUoZGltcykge1xuICB2YXIgbl9kaW1zID0gZGltcy5sZW5ndGg7XG4gIHZhciBzaXplID0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuX2RpbXM7IGkrKykge1xuICAgIGlmIChkaW1zW2ldIDwgMClcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmNyZWF0ZTogbmVnYXRpdmUgZGltZW5zaW9uXCIpO1xuICAgIHNpemUgPSBzaXplICogZGltc1tpXTtcbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKXtcbiAgc3dpdGNoKGtpbmQpe1xuICBjYXNlIDc6IGNhc2UgMTA6IGNhc2UgMTE6IHJldHVybiAyO1xuICBkZWZhdWx0OiByZXR1cm4gMTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpe1xuICB2YXIgdmlldztcbiAgc3dpdGNoKGtpbmQpe1xuICBjYXNlIDA6ICB2aWV3ID0gRmxvYXQzMkFycmF5OyBicmVhaztcbiAgY2FzZSAxOiAgdmlldyA9IEZsb2F0NjRBcnJheTsgYnJlYWs7XG4gIGNhc2UgMjogIHZpZXcgPSBJbnQ4QXJyYXk7IGJyZWFrO1xuICBjYXNlIDM6ICB2aWV3ID0gVWludDhBcnJheTsgYnJlYWs7XG4gIGNhc2UgNDogIHZpZXcgPSBJbnQxNkFycmF5OyBicmVhaztcbiAgY2FzZSA1OiAgdmlldyA9IFVpbnQxNkFycmF5OyBicmVhaztcbiAgY2FzZSA2OiAgdmlldyA9IEludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDc6ICB2aWV3ID0gSW50MzJBcnJheTsgYnJlYWs7XG4gIGNhc2UgODogIHZpZXcgPSBJbnQzMkFycmF5OyBicmVhaztcbiAgY2FzZSA5OiAgdmlldyA9IEludDMyQXJyYXk7IGJyZWFrO1xuICBjYXNlIDEwOiB2aWV3ID0gRmxvYXQzMkFycmF5OyBicmVhaztcbiAgY2FzZSAxMTogdmlldyA9IEZsb2F0NjRBcnJheTsgYnJlYWs7XG4gIGNhc2UgMTI6IHZpZXcgPSBVaW50OEFycmF5OyBicmVhaztcbiAgfVxuICBpZiAoIXZpZXcpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmNyZWF0ZTogdW5zdXBwb3J0ZWQga2luZFwiKTtcbiAgdmFyIGRhdGEgPSBuZXcgdmlldyhzaXplICogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChraW5kKSk7XG4gIHJldHVybiBkYXRhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2N1c3RvbV9uYW1lXG4vL1ZlcnNpb246IDwgNC4xMVxudmFyIGNhbWxfYmFfY3VzdG9tX25hbWUgPSBcIl9iaWdhcnJheVwiXG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3VzdG9tX25hbWVcbi8vVmVyc2lvbjogPj0gNC4xMVxudmFyIGNhbWxfYmFfY3VzdG9tX25hbWUgPSBcIl9iaWdhcnIwMlwiXG5cbi8vUHJvdmlkZXM6IE1sX0JpZ2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfY3VzdG9tX25hbWVcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpLCBjYW1sX2ludDY0X2hpMzIsIGNhbWxfaW50NjRfbG8zMlxuZnVuY3Rpb24gTWxfQmlnYXJyYXkgKGtpbmQsIGxheW91dCwgZGltcywgYnVmZmVyKSB7XG5cbiAgdGhpcy5raW5kICAgPSBraW5kIDtcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMuZGltcyAgID0gZGltcztcbiAgdGhpcy5kYXRhID0gYnVmZmVyO1xufVxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuY2FtbF9jdXN0b20gPSBjYW1sX2JhX2N1c3RvbV9uYW1lO1xuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKGFyZykge1xuICB2YXIgb2ZzID0gMDtcbiAgaWYodHlwZW9mIGFyZyA9PT0gXCJudW1iZXJcIikgYXJnID0gW2FyZ107XG4gIGlmICghIChhcmcgaW5zdGFuY2VvZiBBcnJheSkpIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImJpZ2FycmF5LmpzOiBpbnZhbGlkIG9mZnNldFwiKTtcbiAgaWYgKHRoaXMuZGltcy5sZW5ndGggIT0gYXJnLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5nZXQvc2V0OiBiYWQgbnVtYmVyIG9mIGRpbWVuc2lvbnNcIik7XG4gIGlmKHRoaXMubGF5b3V0ID09IDAgLyogY19sYXlvdXQgKi8pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGltcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFyZ1tpXSA8IDAgfHwgYXJnW2ldID49IHRoaXMuZGltc1tpXSlcbiAgICAgICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICAgICAgb2ZzID0gKG9mcyAqIHRoaXMuZGltc1tpXSkgKyBhcmdbaV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmRpbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChhcmdbaV0gPCAxIHx8IGFyZ1tpXSA+IHRoaXMuZGltc1tpXSl7XG4gICAgICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIG9mcyA9IChvZnMgKiB0aGlzLmRpbXNbaV0pICsgKGFyZ1tpXSAtIDEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2ZzO1xufVxuXG5NbF9CaWdhcnJheS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG9mcykge1xuICBzd2l0Y2godGhpcy5raW5kKXtcbiAgY2FzZSA3OlxuICAgIC8vIEludDY0XG4gICAgdmFyIGwgPSB0aGlzLmRhdGFbb2ZzICogMiArIDBdO1xuICAgIHZhciBoID0gdGhpcy5kYXRhW29mcyAqIDIgKyAxXTtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9faGkobCxoKTtcbiAgY2FzZSAxMDogY2FzZSAxMTpcbiAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgIHZhciByID0gdGhpcy5kYXRhW29mcyAqIDIgKyAwXTtcbiAgICB2YXIgaSA9IHRoaXMuZGF0YVtvZnMgKiAyICsgMV07XG4gICAgcmV0dXJuIFsyNTQsIHIsIGldO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiB0aGlzLmRhdGFbb2ZzXVxuICB9XG59XG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAob2ZzLHYpIHtcbiAgc3dpdGNoKHRoaXMua2luZCl7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSBjYW1sX2ludDY0X2xvMzIodik7XG4gICAgdGhpcy5kYXRhW29mcyAqIDIgKyAxXSA9IGNhbWxfaW50NjRfaGkzMih2KTtcbiAgICBicmVhaztcbiAgY2FzZSAxMDogY2FzZSAxMTpcbiAgICAvLyBDb21wbGV4MzIsIENvbXBsZXg2NFxuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMF0gPSB2WzFdO1xuICAgIHRoaXMuZGF0YVtvZnMgKiAyICsgMV0gPSB2WzJdO1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRoaXMuZGF0YVtvZnNdID0gdjtcbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gMFxufVxuXG5cbk1sX0JpZ2FycmF5LnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gKHYpIHtcbiAgc3dpdGNoKHRoaXMua2luZCl7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIHZhciBhID0gY2FtbF9pbnQ2NF9sbzMyKHYpO1xuICAgIHZhciBiID0gY2FtbF9pbnQ2NF9oaTMyKHYpO1xuICAgIGlmKGEgPT0gYil7XG4gICAgICB0aGlzLmRhdGEuZmlsbChhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpPHRoaXMuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHRoaXMuZGF0YVtpXSA9IChpJTIgPT0gMCkgPyBhIDogYjtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTA6IGNhc2UgMTE6XG4gICAgLy8gQ29tcGxleDMyLCBDb21wbGV4NjRcbiAgICB2YXIgaW0gPSB2WzFdO1xuICAgIHZhciByZSA9IHZbMl07XG4gICAgaWYoaW0gPT0gcmUpe1xuICAgICAgdGhpcy5kYXRhLmZpbGwoaW0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGk8dGhpcy5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdGhpcy5kYXRhW2ldID0gKGklMiA9PSAwKSA/IGltIDogcmU7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIHRoaXMuZGF0YS5maWxsKHYpO1xuICAgIGJyZWFrO1xuICB9XG59XG5cblxuTWxfQmlnYXJyYXkucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAoYiwgdG90YWwpIHtcbiAgaWYgKHRoaXMubGF5b3V0ICE9IGIubGF5b3V0IHx8IHRoaXMua2luZCAhPSBiLmtpbmQpIHtcbiAgICB2YXIgazEgPSB0aGlzLmtpbmQgfCAodGhpcy5sYXlvdXQgPDwgOCk7XG4gICAgdmFyIGsyID0gICAgYi5raW5kIHwgKGIubGF5b3V0IDw8IDgpO1xuICAgIHJldHVybiBrMiAtIGsxO1xuICB9XG4gIGlmICh0aGlzLmRpbXMubGVuZ3RoICE9IGIuZGltcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gYi5kaW1zLmxlbmd0aCAtIHRoaXMuZGltcy5sZW5ndGg7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgaWYgKHRoaXMuZGltc1tpXSAhPSBiLmRpbXNbaV0pXG4gICAgICByZXR1cm4gKHRoaXMuZGltc1tpXSA8IGIuZGltc1tpXSkgPyAtMSA6IDE7XG4gIHN3aXRjaCAodGhpcy5raW5kKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICBjYXNlIDEwOlxuICBjYXNlIDExOlxuICAgIC8vIEZsb2F0c1xuICAgIHZhciB4LCB5O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB4ID0gdGhpcy5kYXRhW2ldO1xuICAgICAgeSA9IGIuZGF0YVtpXTtcbiAgICAgIGlmICh4IDwgeSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHggPiB5KVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmICh4ICE9IHkpIHtcbiAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgaWYgKHggPT0geCkgcmV0dXJuIDE7XG4gICAgICAgIGlmICh5ID09IHkpIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNzpcbiAgICAvLyBJbnQ2NFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhLmxlbmd0aDsgaSs9Mikge1xuICAgICAgLy8gQ2hlY2sgaGlnaGVzdCBiaXRzIGZpcnN0XG4gICAgICBpZiAodGhpcy5kYXRhW2krMV0gPCBiLmRhdGFbaSsxXSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuZGF0YVtpKzFdID4gYi5kYXRhW2krMV0pXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgaWYgKCh0aGlzLmRhdGFbaV0gPj4+IDApIDwgKGIuZGF0YVtpXSA+Pj4gMCkpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmICgodGhpcy5kYXRhW2ldID4+PiAwKSA+IChiLmRhdGFbaV0gPj4+IDApKVxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMjpcbiAgY2FzZSAzOlxuICBjYXNlIDQ6XG4gIGNhc2UgNTpcbiAgY2FzZSA2OlxuICBjYXNlIDg6XG4gIGNhc2UgOTpcbiAgY2FzZSAxMjpcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuZGF0YVtpXSA8IGIuZGF0YVtpXSlcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgaWYgKHRoaXMuZGF0YVtpXSA+IGIuZGF0YVtpXSlcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBNbF9CaWdhcnJheV9jXzFfMVxuLy9SZXF1aXJlczogTWxfQmlnYXJyYXksIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gTWxfQmlnYXJyYXlfY18xXzEoa2luZCwgbGF5b3V0LCBkaW1zLCBidWZmZXIpIHtcbiAgdGhpcy5raW5kICAgPSBraW5kIDtcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMuZGltcyAgID0gZGltcztcbiAgdGhpcy5kYXRhICAgPSBidWZmZXI7XG59XG5cbk1sX0JpZ2FycmF5X2NfMV8xLnByb3RvdHlwZSA9IG5ldyBNbF9CaWdhcnJheSgpXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUub2Zmc2V0ID0gZnVuY3Rpb24gKGFyZykge1xuICBpZih0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKXtcbiAgICBpZigoYXJnIGluc3RhbmNlb2YgQXJyYXkpICYmIGFyZy5sZW5ndGggPT0gMSlcbiAgICAgIGFyZyA9IGFyZ1swXTtcbiAgICBlbHNlIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIk1sX0JpZ2FycmF5X2NfMV8xLm9mZnNldFwiKTtcbiAgfVxuICBpZiAoYXJnIDwgMCB8fCBhcmcgPj0gdGhpcy5kaW1zWzBdKVxuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgcmV0dXJuIGFyZztcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChvZnMpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YVtvZnNdO1xufVxuXG5NbF9CaWdhcnJheV9jXzFfMS5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKG9mcyx2KSB7XG4gIHRoaXMuZGF0YVtvZnNdID0gdjtcbiAgcmV0dXJuIDBcbn1cblxuTWxfQmlnYXJyYXlfY18xXzEucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiAodikge1xuICB0aGlzLmRhdGEuZmlsbCh2KTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jb21wYXJlXG5mdW5jdGlvbiBjYW1sX2JhX2NvbXBhcmUoYSxiLHRvdGFsKXtcbiAgcmV0dXJuIGEuY29tcGFyZShiLHRvdGFsKVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbi8vUmVxdWlyZXM6IE1sX0JpZ2FycmF5LCBNbF9CaWdhcnJheV9jXzFfMSwgY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKXtcbiAgdmFyIHNpemVfcGVyX2VsZW1lbnQgPSBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50KGtpbmQpO1xuICBpZihjYW1sX2JhX2dldF9zaXplKGRpbXMpICogc2l6ZV9wZXJfZWxlbWVudCAhPSBkYXRhLmxlbmd0aCkge1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImxlbmd0aCBkb2Vzbid0IG1hdGNoIGRpbXNcIik7XG4gIH1cbiAgaWYobGF5b3V0ID09IDAgJiYgLy8gY19sYXlvdXRcbiAgICAgZGltcy5sZW5ndGggPT0gMSAmJiAvLyBBcnJheTFcbiAgICAgc2l6ZV9wZXJfZWxlbWVudCA9PSAxKSAvLyAxLXRvLTEgbWFwcGluZ1xuICAgIHJldHVybiBuZXcgTWxfQmlnYXJyYXlfY18xXzEoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgcmV0dXJuIG5ldyBNbF9CaWdhcnJheShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xuXG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV9idWZmZXJcbmZ1bmN0aW9uIGNhbWxfYmFfY3JlYXRlKGtpbmQsIGxheW91dCwgZGltc19tbCkge1xuICB2YXIgZGltcyA9IGNhbWxfanNfZnJvbV9hcnJheShkaW1zX21sKTtcbiAgdmFyIGRhdGEgPSBjYW1sX2JhX2NyZWF0ZV9idWZmZXIoa2luZCwgY2FtbF9iYV9nZXRfc2l6ZShkaW1zKSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcbmZ1bmN0aW9uIGNhbWxfYmFfY2hhbmdlX2xheW91dChiYSwgbGF5b3V0KSB7XG4gIGlmKGJhLmxheW91dCA9PSBsYXlvdXQpIHJldHVybiBiYTtcbiAgdmFyIG5ld19kaW1zID0gW11cbiAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspIG5ld19kaW1zW2ldID0gYmEuZGltc1tiYS5kaW1zLmxlbmd0aCAtIGkgLSAxXTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBsYXlvdXQsIG5ld19kaW1zLCBiYS5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9raW5kXG5mdW5jdGlvbiBjYW1sX2JhX2tpbmQoYmEpIHtcbiAgcmV0dXJuIGJhLmtpbmQ7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfbGF5b3V0XG5mdW5jdGlvbiBjYW1sX2JhX2xheW91dChiYSkge1xuICByZXR1cm4gYmEubGF5b3V0O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX251bV9kaW1zXG5mdW5jdGlvbiBjYW1sX2JhX251bV9kaW1zKGJhKSB7XG4gIHJldHVybiBiYS5kaW1zLmxlbmd0aDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1cbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9iYV9kaW0oYmEsIGkpIHtcbiAgaWYgKGkgPCAwIHx8IGkgPj0gYmEuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuZGltXCIpO1xuICByZXR1cm4gYmEuZGltc1tpXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fMVxuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzEoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAwKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fMlxuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzIoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAxKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kaW1fM1xuLy9SZXF1aXJlczogY2FtbF9iYV9kaW1cbmZ1bmN0aW9uIGNhbWxfYmFfZGltXzMoYmEpIHtcbiAgcmV0dXJuIGNhbWxfYmFfZGltKGJhLCAyKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfZ2VuZXJpY1xuLy9SZXF1aXJlczogY2FtbF9qc19mcm9tX2FycmF5XG5mdW5jdGlvbiBjYW1sX2JhX2dldF9nZW5lcmljKGJhLCBpKSB7XG4gIHZhciBvZnMgPSBiYS5vZmZzZXQoY2FtbF9qc19mcm9tX2FycmF5KGkpKTtcbiAgcmV0dXJuIGJhLmdldChvZnMpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDE2KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMSA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBiYS5nZXQob2ZzKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcyArIDEpO1xuICByZXR1cm4gKGIxIHwgKGIyIDw8IDgpKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9nZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9nZXQzMihiYSwgaTApIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDMgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgdmFyIGIxID0gYmEuZ2V0KG9mcyswKTtcbiAgdmFyIGIyID0gYmEuZ2V0KG9mcysxKTtcbiAgdmFyIGIzID0gYmEuZ2V0KG9mcysyKTtcbiAgdmFyIGI0ID0gYmEuZ2V0KG9mcyszKTtcbiAgcmV0dXJuICggKGIxIDw8IDApICB8XG4gICAgICAgICAgIChiMiA8PCA4KSAgfFxuICAgICAgICAgICAoYjMgPDwgMTYpIHxcbiAgICAgICAgICAgKGI0IDw8IDI0KSApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X2dldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X29mX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X2dldDY0KGJhLCBpMCkge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgNyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgYjEgPSBiYS5nZXQob2ZzKzApO1xuICB2YXIgYjIgPSBiYS5nZXQob2ZzKzEpO1xuICB2YXIgYjMgPSBiYS5nZXQob2ZzKzIpO1xuICB2YXIgYjQgPSBiYS5nZXQob2ZzKzMpO1xuICB2YXIgYjUgPSBiYS5nZXQob2ZzKzQpO1xuICB2YXIgYjYgPSBiYS5nZXQob2ZzKzUpO1xuICB2YXIgYjcgPSBiYS5nZXQob2ZzKzYpO1xuICB2YXIgYjggPSBiYS5nZXQob2ZzKzcpO1xuICByZXR1cm4gY2FtbF9pbnQ2NF9vZl9ieXRlcyhbYjgsYjcsYjYsYjUsYjQsYjMsYjIsYjFdKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMShiYSwgaTApIHtcbiAgcmV0dXJuIGJhLmdldChiYS5vZmZzZXQoaTApKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfMlxuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMihiYSwgaTAsIGkxKSB7XG4gIHJldHVybiBiYS5nZXQoYmEub2Zmc2V0KFtpMCxpMV0pKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9nZXRfM1xuZnVuY3Rpb24gY2FtbF9iYV9nZXRfMyhiYSwgaTAsIGkxLCBpMikge1xuICByZXR1cm4gYmEuZ2V0KGJhLm9mZnNldChbaTAsaTEsaTJdKSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2V0X2dlbmVyaWNcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfZ2VuZXJpYyhiYSwgaSwgdikge1xuICBiYS5zZXQoYmEub2Zmc2V0KGNhbWxfanNfZnJvbV9hcnJheShpKSksIHYpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDE2XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDE2KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgMSA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICBiYS5zZXQob2ZzKzAsICB2ICAgICAgICAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzEsICh2ID4+PiA4KSAmIDB4ZmYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV91aW50OF9zZXQzMlxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9iYV91aW50OF9zZXQzMihiYSwgaTAsIHYpIHtcbiAgdmFyIG9mcyA9IGJhLm9mZnNldChpMCk7XG4gIGlmKG9mcyArIDMgPj0gYmEuZGF0YS5sZW5ndGgpIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgYmEuc2V0KG9mcyswLCAgdiAgICAgICAgICYgMHhmZik7XG4gIGJhLnNldChvZnMrMSwgKHYgPj4+IDgpICAmIDB4ZmYpO1xuICBiYS5zZXQob2ZzKzIsICh2ID4+PiAxNikgJiAweGZmKTtcbiAgYmEuc2V0KG9mcyszLCAodiA+Pj4gMjQpICYgMHhmZik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3VpbnQ4X3NldDY0XG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yLCBjYW1sX2ludDY0X3RvX2J5dGVzXG5mdW5jdGlvbiBjYW1sX2JhX3VpbnQ4X3NldDY0KGJhLCBpMCwgdikge1xuICB2YXIgb2ZzID0gYmEub2Zmc2V0KGkwKTtcbiAgaWYob2ZzICsgNyA+PSBiYS5kYXRhLmxlbmd0aCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgdiA9IGNhbWxfaW50NjRfdG9fYnl0ZXModik7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA4OyBpKyspIGJhLnNldChvZnMraSwgdls3LWldKVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9zZXRfMVxuZnVuY3Rpb24gY2FtbF9iYV9zZXRfMShiYSwgaTAsIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChpMCksIHYpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8yXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8yKGJhLCBpMCwgaTEsIHYpIHtcbiAgYmEuc2V0KGJhLm9mZnNldChbaTAsaTFdKSwgdik7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NldF8zXG5mdW5jdGlvbiBjYW1sX2JhX3NldF8zKGJhLCBpMCwgaTEsIGkyLCB2KSB7XG4gIGJhLnNldChiYS5vZmZzZXQoW2kwLGkxLGkyXSksIHYpO1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9maWxsXG5mdW5jdGlvbiBjYW1sX2JhX2ZpbGwoYmEsIHYpIHtcbiAgYmEuZmlsbCh2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfYmxpdFxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2JsaXQoc3JjLCBkc3QpIHtcbiAgaWYgKGRzdC5kaW1zLmxlbmd0aCAhPSBzcmMuZGltcy5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkuYmxpdDogZGltZW5zaW9uIG1pc21hdGNoXCIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGRzdC5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIGlmIChkc3QuZGltc1tpXSAhPSBzcmMuZGltc1tpXSlcbiAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LmJsaXQ6IGRpbWVuc2lvbiBtaXNtYXRjaFwiKTtcbiAgZHN0LmRhdGEuc2V0KHNyYy5kYXRhKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc3ViXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9iYV9nZXRfc2l6ZVxuLy9SZXF1aXJlczogY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudFxuZnVuY3Rpb24gY2FtbF9iYV9zdWIoYmEsIG9mcywgbGVuKSB7XG4gIHZhciBjaGFuZ2VkX2RpbTtcbiAgdmFyIG11bCA9IDE7XG4gIGlmIChiYS5sYXlvdXQgPT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKylcbiAgICAgIG11bCA9IG11bCAqIGJhLmRpbXNbaV07XG4gICAgY2hhbmdlZF9kaW0gPSAwO1xuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgKGJhLmRpbXMubGVuZ3RoIC0gMSk7IGkrKylcbiAgICAgIG11bCA9IG11bCAqIGJhLmRpbXNbaV07XG4gICAgY2hhbmdlZF9kaW0gPSBiYS5kaW1zLmxlbmd0aCAtIDE7XG4gICAgb2ZzID0gb2ZzIC0gMTtcbiAgfVxuICBpZiAob2ZzIDwgMCB8fCBsZW4gPCAwIHx8IChvZnMgKyBsZW4pID4gYmEuZGltc1tjaGFuZ2VkX2RpbV0pe1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnN1YjogYmFkIHN1Yi1hcnJheVwiKTtcbiAgfVxuICB2YXIgbmV3X2RpbXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKVxuICAgIG5ld19kaW1zW2ldID0gYmEuZGltc1tpXTtcbiAgbmV3X2RpbXNbY2hhbmdlZF9kaW1dID0gbGVuO1xuICBtdWwgKj0gY2FtbF9iYV9nZXRfc2l6ZV9wZXJfZWxlbWVudChiYS5raW5kKTtcbiAgdmFyIG5ld19kYXRhID0gYmEuZGF0YS5zdWJhcnJheShvZnMgKiBtdWwsIChvZnMgKyBsZW4pICogbXVsKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBiYS5sYXlvdXQsIG5ld19kaW1zLCBuZXdfZGF0YSk7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfc2xpY2Vcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYmFfZ2V0X3NpemVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfc2xpY2UoYmEsIHZpbmQpIHtcbiAgdmluZCA9IGNhbWxfanNfZnJvbV9hcnJheSh2aW5kKTtcbiAgdmFyIG51bV9pbmRzID0gdmluZC5sZW5ndGg7XG4gIHZhciBpbmRleCA9IFtdO1xuICB2YXIgc3ViX2RpbXMgPSBbXTtcbiAgdmFyIG9mcztcblxuICBpZiAobnVtX2luZHMgPiBiYS5kaW1zLmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5zbGljZTogdG9vIG1hbnkgaW5kaWNlc1wiKTtcblxuICAvLyBDb21wdXRlIG9mZnNldCBhbmQgY2hlY2sgYm91bmRzXG4gIGlmIChiYS5sYXlvdXQgPT0gMCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2luZHM7IGkrKylcbiAgICAgIGluZGV4W2ldID0gdmluZFtpXTtcbiAgICBmb3IgKDsgaSA8IGJhLmRpbXMubGVuZ3RoOyBpKyspXG4gICAgICBpbmRleFtpXSA9IDA7XG4gICAgc3ViX2RpbXMgPSBiYS5kaW1zLnNsaWNlKG51bV9pbmRzKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9pbmRzOyBpKyspXG4gICAgICBpbmRleFtiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzICsgaV0gPSB2aW5kW2ldO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGggLSBudW1faW5kczsgaSsrKVxuICAgICAgaW5kZXhbaV0gPSAxO1xuICAgIHN1Yl9kaW1zID0gYmEuZGltcy5zbGljZSgwLCBiYS5kaW1zLmxlbmd0aCAtIG51bV9pbmRzKTtcbiAgfVxuICBvZnMgPSBiYS5vZmZzZXQoaW5kZXgpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoc3ViX2RpbXMpO1xuICB2YXIgc2l6ZV9wZXJfZWxlbWVudCA9IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoYmEua2luZCk7XG4gIHZhciBuZXdfZGF0YSA9IGJhLmRhdGEuc3ViYXJyYXkob2ZzICogc2l6ZV9wZXJfZWxlbWVudCwgKG9mcyArIHNpemUpICogc2l6ZV9wZXJfZWxlbWVudCk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoYmEua2luZCwgYmEubGF5b3V0LCBzdWJfZGltcywgbmV3X2RhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3Jlc2hhcGVcbi8vUmVxdWlyZXM6IGNhbWxfanNfZnJvbV9hcnJheSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2NyZWF0ZV91bnNhZmUsIGNhbWxfYmFfZ2V0X3NpemVcbmZ1bmN0aW9uIGNhbWxfYmFfcmVzaGFwZShiYSwgdmluZCkge1xuICB2aW5kID0gY2FtbF9qc19mcm9tX2FycmF5KHZpbmQpO1xuICB2YXIgbmV3X2RpbSA9IFtdO1xuICB2YXIgbnVtX2RpbXMgPSB2aW5kLmxlbmd0aDtcblxuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpe1xuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcIkJpZ2FycmF5LnJlc2hhcGU6IGJhZCBudW1iZXIgb2YgZGltZW5zaW9uc1wiKTtcbiAgfVxuICB2YXIgbnVtX2VsdHMgPSAxO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bV9kaW1zOyBpKyspIHtcbiAgICBuZXdfZGltW2ldID0gdmluZFtpXTtcbiAgICBpZiAobmV3X2RpbVtpXSA8IDApXG4gICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJCaWdhcnJheS5yZXNoYXBlOiBuZWdhdGl2ZSBkaW1lbnNpb25cIik7XG4gICAgbnVtX2VsdHMgPSBudW1fZWx0cyAqIG5ld19kaW1baV07XG4gIH1cblxuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoYmEuZGltcyk7XG4gIC8vIENoZWNrIHRoYXQgc2l6ZXMgYWdyZWVcbiAgaWYgKG51bV9lbHRzICE9IHNpemUpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiQmlnYXJyYXkucmVzaGFwZTogc2l6ZSBtaXNtYXRjaFwiKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShiYS5raW5kLCBiYS5sYXlvdXQsIG5ld19kaW0sIGJhLmRhdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JhX3NlcmlhbGl6ZVxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9iaXRzX29mX2Zsb2F0LCBjYW1sX2ludDY0X3RvX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRcbmZ1bmN0aW9uIGNhbWxfYmFfc2VyaWFsaXplKHdyaXRlciwgYmEsIHN6KSB7XG4gIHdyaXRlci53cml0ZSgzMiwgYmEuZGltcy5sZW5ndGgpO1xuICB3cml0ZXIud3JpdGUoMzIsIChiYS5raW5kIHwgKGJhLmxheW91dCA8PCA4KSkpO1xuICBpZihiYS5jYW1sX2N1c3RvbSA9PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kaW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZihiYS5kaW1zW2ldIDwgMHhmZmZmKVxuICAgICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRpbXNbaV0pO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHdyaXRlci53cml0ZSgxNiwgMHhmZmZmKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKDMyLCAwKTtcbiAgICAgICAgd3JpdGVyLndyaXRlKDMyLCBiYS5kaW1zW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIGVsc2VcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGltcy5sZW5ndGg7IGkrKykgd3JpdGVyLndyaXRlKDMyLGJhLmRpbXNbaV0pXG4gIHN3aXRjaChiYS5raW5kKXtcbiAgY2FzZSAyOiAgLy9JbnQ4QXJyYXlcbiAgY2FzZSAzOiAgLy9VaW50OEFycmF5XG4gIGNhc2UgMTI6IC8vVWludDhBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSg4LCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNDogIC8vIEludDE2QXJyYXlcbiAgY2FzZSA1OiAgLy8gVWludDE2QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGg7IGkrKyl7XG4gICAgICB3cml0ZXIud3JpdGUoMTYsIGJhLmRhdGFbaV0pO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA2OiAgLy8gSW50MzJBcnJheSAoaW50MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoOyBpKyspe1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBiYS5kYXRhW2ldKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgODogIC8vIEludDMyQXJyYXkgKGludClcbiAgY2FzZSA5OiAgLy8gSW50MzJBcnJheSAobmF0aXZlaW50KVxuICAgIHdyaXRlci53cml0ZSg4LDApO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHdyaXRlci53cml0ZSgzMiwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDc6ICAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmEuZGF0YS5sZW5ndGggLyAyOyBpKyspe1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGJhLmdldChpKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTogIC8vIEZsb2F0NjRBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoYmEuZ2V0KGkpKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMDogIC8vIEZsb2F0MzJBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBiYS5kYXRhLmxlbmd0aDsgaSsrKXtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0KGJhLmdldChpKSk7XG4gICAgICB3cml0ZXIud3JpdGUoMzIsIGIpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMDogLy8gRmxvYXQzMkFycmF5IChjb21wbGV4MzIpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKXtcbiAgICAgIHZhciBqID0gYmEuZ2V0KGkpO1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQoalsxXSkpO1xuICAgICAgd3JpdGVyLndyaXRlKDMyLCBjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXQoalsyXSkpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSAxMTogLy8gRmxvYXQ2NEFycmF5IChjb21wbGV4NjQpXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGJhLmRhdGEubGVuZ3RoIC8gMjsgaSsrKXtcbiAgICAgIHZhciBjb21wbGV4ID0gYmEuZ2V0KGkpO1xuICAgICAgdmFyIGIgPSBjYW1sX2ludDY0X3RvX2J5dGVzKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdChjb21wbGV4WzFdKSk7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDg7IGorKykgd3JpdGVyLndyaXRlICg4LCBiW2pdKTtcbiAgICAgIHZhciBiID0gY2FtbF9pbnQ2NF90b19ieXRlcyhjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQoY29tcGxleFsyXSkpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA4OyBqKyspIHdyaXRlci53cml0ZSAoOCwgYltqXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICB9XG4gIHN6WzBdID0gKDQgKyBiYS5kaW1zLmxlbmd0aCkgKiA0O1xuICBzelsxXSA9ICg0ICsgYmEuZGltcy5sZW5ndGgpICogODtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9kZXNlcmlhbGl6ZVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlLCBjYW1sX2ZhaWx3aXRoXG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X29mX2J5dGVzLCBjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNcbi8vUmVxdWlyZXM6IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0c1xuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfYnVmZmVyXG5mdW5jdGlvbiBjYW1sX2JhX2Rlc2VyaWFsaXplKHJlYWRlciwgc3osIG5hbWUpe1xuICB2YXIgbnVtX2RpbXMgPSByZWFkZXIucmVhZDMycygpO1xuICBpZiAobnVtX2RpbXMgPCAwIHx8IG51bV9kaW1zID4gMTYpXG4gICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiB3cm9uZyBudW1iZXIgb2YgYmlnYXJyYXkgZGltZW5zaW9uc1wiKTtcbiAgdmFyIHRhZyA9IHJlYWRlci5yZWFkMzJzKCk7XG4gIHZhciBraW5kID0gdGFnICYgMHhmZlxuICB2YXIgbGF5b3V0ID0gKHRhZyA+PiA4KSAmIDE7XG4gIHZhciBkaW1zID0gW11cbiAgaWYobmFtZSA9PSBcIl9iaWdhcnIwMlwiKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykge1xuICAgICAgdmFyIHNpemVfZGltID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICAgIGlmKHNpemVfZGltID09IDB4ZmZmZil7XG4gICAgICAgIHZhciBzaXplX2RpbV9oaSA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIHZhciBzaXplX2RpbV9sbyA9IHJlYWRlci5yZWFkMzJ1KCk7XG4gICAgICAgIGlmKHNpemVfZGltX2hpICE9IDApXG4gICAgICAgICAgY2FtbF9mYWlsd2l0aChcImlucHV0X3ZhbHVlOiBiaWdhcnJheSBkaW1lbnNpb24gb3ZlcmZsb3cgaW4gMzJiaXRcIik7XG4gICAgICAgIHNpemVfZGltID0gc2l6ZV9kaW1fbG87XG4gICAgICB9XG4gICAgICBkaW1zLnB1c2goc2l6ZV9kaW0pO1xuICAgIH1cbiAgZWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2RpbXM7IGkrKykgZGltcy5wdXNoKHJlYWRlci5yZWFkMzJ1KCkpO1xuICB2YXIgc2l6ZSA9IGNhbWxfYmFfZ2V0X3NpemUoZGltcyk7XG4gIHZhciBkYXRhID0gY2FtbF9iYV9jcmVhdGVfYnVmZmVyKGtpbmQsIHNpemUpO1xuICB2YXIgYmEgPSBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgbGF5b3V0LCBkaW1zLCBkYXRhKTtcbiAgc3dpdGNoKGtpbmQpe1xuICBjYXNlIDI6ICAvL0ludDhBcnJheVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkOHMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMzogIC8vVWludDhBcnJheVxuICBjYXNlIDEyOiAvL1VpbnQ4QXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDh1KCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDQ6ICAvLyBJbnQxNkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnMoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNTogIC8vIFVpbnQxNkFycmF5XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKyl7XG4gICAgICBkYXRhW2ldID0gcmVhZGVyLnJlYWQxNnUoKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgNjogIC8vIEludDMyQXJyYXkgKGludDMyKVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZGF0YVtpXSA9IHJlYWRlci5yZWFkMzJzKCk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDg6ICAvLyBJbnQzMkFycmF5IChpbnQpXG4gIGNhc2UgOTogIC8vIEludDMyQXJyYXkgKG5hdGl2ZWludClcbiAgICB2YXIgc2l4dHkgPSByZWFkZXIucmVhZDh1KCk7XG4gICAgaWYoc2l4dHkpIGNhbWxfZmFpbHdpdGgoXCJpbnB1dF92YWx1ZTogY2Fubm90IHJlYWQgYmlnYXJyYXkgd2l0aCA2NC1iaXQgT0NhbWwgaW50c1wiKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGRhdGFbaV0gPSByZWFkZXIucmVhZDMycygpO1xuICAgIH1cbiAgICBicmVhaztcbiAgY2FzZSA3OiAvLyAoaW50NjQpXG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoOCk7O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspe1xuICAgICAgZm9yICh2YXIgaiA9IDA7aiA8IDg7aisrKSB0W2pdID0gcmVhZGVyLnJlYWQ4dSgpO1xuICAgICAgdmFyIGludDY0ID0gY2FtbF9pbnQ2NF9vZl9ieXRlcyh0KTtcbiAgICAgIGJhLnNldChpLGludDY0KTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTogIC8vIEZsb2F0NjRBcnJheVxuICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBmID0gY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzKGNhbWxfaW50NjRfb2ZfYnl0ZXModCkpO1xuICAgICAgYmEuc2V0KGksZik7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDA6ICAvLyBGbG9hdDMyQXJyYXlcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIHZhciBmID0gY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzKHJlYWRlci5yZWFkMzJzKCkpO1xuICAgICAgYmEuc2V0KGksZik7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiAvLyBGbG9hdDMyQXJyYXkgKGNvbXBsZXgzMilcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIHZhciByZSA9IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyhyZWFkZXIucmVhZDMycygpKTtcbiAgICAgIHZhciBpbSA9IGNhbWxfaW50MzJfZmxvYXRfb2ZfYml0cyhyZWFkZXIucmVhZDMycygpKTtcbiAgICAgIGJhLnNldChpLFsyNTQscmUsaW1dKTtcbiAgICB9XG4gICAgYnJlYWs7XG4gIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgIHZhciB0ID0gbmV3IEFycmF5KDgpOztcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKXtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciByZSA9IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKHQpKTtcbiAgICAgIGZvciAodmFyIGogPSAwO2ogPCA4O2orKykgdFtqXSA9IHJlYWRlci5yZWFkOHUoKTtcbiAgICAgIHZhciBpbSA9IGNhbWxfaW50NjRfZmxvYXRfb2ZfYml0cyhjYW1sX2ludDY0X29mX2J5dGVzKHQpKTtcbiAgICAgIGJhLnNldChpLFsyNTQscmUsaW1dKTtcbiAgICB9XG4gICAgYnJlYWtcbiAgfVxuICBzelswXSA9ICg0ICsgbnVtX2RpbXMpICogNDtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGEpO1xufVxuXG4vL0RlcHJlY2F0ZWRcbi8vUHJvdmlkZXM6IGNhbWxfYmFfY3JlYXRlX2Zyb21cbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2JhX2dldF9zaXplX3Blcl9lbGVtZW50XG5mdW5jdGlvbiBjYW1sX2JhX2NyZWF0ZV9mcm9tKGRhdGExLCBkYXRhMiwganN0eXAsIGtpbmQsIGxheW91dCwgZGltcyl7XG4gIGlmKGRhdGEyIHx8IGNhbWxfYmFfZ2V0X3NpemVfcGVyX2VsZW1lbnQoa2luZCkgPT0gMil7XG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iYV9jcmVhdGVfZnJvbTogdXNlIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmVcIik7XG4gIH1cbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZShraW5kLCBsYXlvdXQsIGRpbXMsIGRhdGExKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9oYXNoIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2JhX2dldF9zaXplLCBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9mbG9hdFxuZnVuY3Rpb24gY2FtbF9iYV9oYXNoKGJhKXtcbiAgdmFyIG51bV9lbHRzID0gY2FtbF9iYV9nZXRfc2l6ZShiYS5kaW1zKTtcbiAgdmFyIGggPSAwO1xuICBzd2l0Y2goYmEua2luZCl7XG4gIGNhc2UgMjogIC8vSW50OEFycmF5XG4gIGNhc2UgMzogIC8vVWludDhBcnJheVxuICBjYXNlIDEyOiAvL1VpbnQ4QXJyYXlcbiAgICBpZihudW1fZWx0cyA+IDI1NikgbnVtX2VsdHMgPSAyNTY7XG4gICAgdmFyIHcgPSAwLCBpID0wO1xuICAgIGZvcihpID0gMDsgaSArIDQgPD0gYmEuZGF0YS5sZW5ndGg7IGkrPTQpe1xuICAgICAgdyA9IGJhLmRhdGFbaSswXSB8IChiYS5kYXRhW2krMV0gPDwgOCkgfCAoYmEuZGF0YVtpKzJdIDw8IDE2KSB8IChiYS5kYXRhW2krM10gPDwgMjQpO1xuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsdyk7XG4gICAgfVxuICAgIHcgPSAwO1xuICAgIHN3aXRjaCAobnVtX2VsdHMgJiAzKSB7XG4gICAgY2FzZSAzOiB3ICA9IGJhLmRhdGFbaSsyXSA8PCAxNjsgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICBjYXNlIDI6IHcgfD0gYmEuZGF0YVtpKzFdIDw8IDg7ICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgIGNhc2UgMTogdyB8PSBiYS5kYXRhW2krMF07XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDQ6ICAvLyBJbnQxNkFycmF5XG4gIGNhc2UgNTogIC8vIFVpbnQxNkFycmF5XG4gICAgaWYobnVtX2VsdHMgPiAxMjgpIG51bV9lbHRzID0gMTI4O1xuICAgIHZhciB3ID0gMCwgaSA9MDtcbiAgICBmb3IoaSA9IDA7IGkgKyAyIDw9IGJhLmRhdGEubGVuZ3RoOyBpKz0yKXtcbiAgICAgIHcgPSBiYS5kYXRhW2krMF0gfCAoYmEuZGF0YVtpKzFdIDw8IDE2KTtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLHcpO1xuICAgIH1cbiAgICBpZiAoKG51bV9lbHRzICYgMSkgIT0gMClcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgY2FzZSA2OiAgLy8gSW50MzJBcnJheSAoaW50MzIpXG4gICAgaWYgKG51bV9lbHRzID4gNjQpIG51bV9lbHRzID0gNjQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgODogIC8vIEludDMyQXJyYXkgKGludClcbiAgY2FzZSA5OiAgLy8gSW50MzJBcnJheSAobmF0aXZlaW50KVxuICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGJhLmRhdGFbaV0pO1xuICAgIGJyZWFrO1xuICBjYXNlIDc6ICAvLyBJbnQzMkFycmF5IChpbnQ2NClcbiAgICBpZiAobnVtX2VsdHMgPiAzMikgbnVtX2VsdHMgPSAzMjtcbiAgICBudW1fZWx0cyAqPSAyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgYmEuZGF0YVtpXSk7XG4gICAgfVxuICAgIGJyZWFrO1xuICBjYXNlIDEwOiAvLyBGbG9hdDMyQXJyYXkgKGNvbXBsZXgzMilcbiAgICBudW1fZWx0cyAqPTI7IC8qIGZhbGx0aHJvdWdoICovXG4gIGNhc2UgMDogIC8vIEZsb2F0MzJBcnJheVxuICAgIGlmIChudW1fZWx0cyA+IDY0KSBudW1fZWx0cyA9IDY0O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtX2VsdHM7IGkrKykgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCwgYmEuZGF0YVtpXSk7XG4gICAgYnJlYWs7XG4gIGNhc2UgMTE6IC8vIEZsb2F0NjRBcnJheSAoY29tcGxleDY0KVxuICAgIG51bV9lbHRzICo9MjsgLyogZmFsbHRocm91Z2ggKi9cbiAgY2FzZSAxOiAgLy8gRmxvYXQ2NEFycmF5XG4gICAgaWYgKG51bV9lbHRzID4gMzIpIG51bV9lbHRzID0gMzI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fZWx0czsgaSsrKSBoID0gY2FtbF9oYXNoX21peF9mbG9hdChoLCBiYS5kYXRhW2ldKTtcbiAgICBicmVhaztcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV90b190eXBlZF9hcnJheSBtdXRhYmxlXG5mdW5jdGlvbiBjYW1sX2JhX3RvX3R5cGVkX2FycmF5KGJhKXtcbiAgcmV0dXJuIGJhLmRhdGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbmZ1bmN0aW9uIGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSh0YSl7XG4gIHZhciBraW5kO1xuICBpZiAgICAgICh0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkga2luZCA9IDA7XG4gIGVsc2UgaWYgKHRhIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSBraW5kID0gMTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpIGtpbmQgPSAyO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGtpbmQgPSAzO1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIEludDE2QXJyYXkpIGtpbmQgPSA0O1xuICBlbHNlIGlmICh0YSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KSBraW5kID0gNTtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSBraW5kID0gNjtcbiAgZWxzZSBpZiAodGEgaW5zdGFuY2VvZiBVaW50MzJBcnJheSkga2luZCA9IDY7XG4gIGVsc2UgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iYV9raW5kX29mX3R5cGVkX2FycmF5OiB1bnN1cHBvcnRlZCBraW5kXCIpO1xuICByZXR1cm4ga2luZDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG5mdW5jdGlvbiBjYW1sX2JhX2Zyb21fdHlwZWRfYXJyYXkodGEpe1xuICB2YXIga2luZCA9IGNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheSh0YSk7XG4gIHJldHVybiBjYW1sX2JhX2NyZWF0ZV91bnNhZmUoa2luZCwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZm9ybWF0X2ludCBjb25zdCAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9mb3JtYXQsIGNhbWxfZmluaXNoX2Zvcm1hdHRpbmcsIGNhbWxfc3RyX3JlcGVhdFxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfanNieXRlcywgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9mb3JtYXRfaW50KGZtdCwgaSkge1xuICBpZiAoY2FtbF9qc2J5dGVzX29mX3N0cmluZyhmbXQpID09IFwiJWRcIikgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoXCJcIitpKTtcbiAgdmFyIGYgPSBjYW1sX3BhcnNlX2Zvcm1hdChmbXQpO1xuICBpZiAoaSA8IDApIHsgaWYgKGYuc2lnbmVkY29udikgeyBmLnNpZ24gPSAtMTsgaSA9IC1pOyB9IGVsc2UgaSA+Pj49IDA7IH1cbiAgdmFyIHMgPSBpLnRvU3RyaW5nKGYuYmFzZSk7XG4gIGlmIChmLnByZWMgPj0gMCkge1xuICAgIGYuZmlsbGVyID0gJyAnO1xuICAgIHZhciBuID0gZi5wcmVjIC0gcy5sZW5ndGg7XG4gICAgaWYgKG4gPiAwKSBzID0gY2FtbF9zdHJfcmVwZWF0IChuLCAnMCcpICsgcztcbiAgfVxuICByZXR1cm4gY2FtbF9maW5pc2hfZm9ybWF0dGluZyhmLCBzKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ191bnNhZmVfZ2V0LCBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfcGFyc2Vfc2lnbl9hbmRfYmFzZSAocykge1xuICB2YXIgaSA9IDAsIGxlbiA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSwgYmFzZSA9IDEwLCBzaWduID0gMTtcbiAgaWYgKGxlbiA+IDApIHtcbiAgICBzd2l0Y2ggKGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocyxpKSkge1xuICAgIGNhc2UgNDU6IGkrKzsgc2lnbiA9IC0xOyBicmVhaztcbiAgICBjYXNlIDQzOiBpKys7IHNpZ24gPSAxOyBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGkgKyAxIDwgbGVuICYmIGNhbWxfc3RyaW5nX3Vuc2FmZV9nZXQocywgaSkgPT0gNDgpXG4gICAgc3dpdGNoIChjYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkgKyAxKSkge1xuICAgIGNhc2UgMTIwOiBjYXNlIDg4OiBiYXNlID0gMTY7IGkgKz0gMjsgYnJlYWs7XG4gICAgY2FzZSAxMTE6IGNhc2UgNzk6IGJhc2UgPSAgODsgaSArPSAyOyBicmVhaztcbiAgICBjYXNlICA5ODogY2FzZSA2NjogYmFzZSA9ICAyOyBpICs9IDI7IGJyZWFrO1xuICAgIGNhc2UgMTE3OiBjYXNlIDg1OiBpICs9IDI7IGJyZWFrO1xuICAgIH1cbiAgcmV0dXJuIFtpLCBzaWduLCBiYXNlXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9kaWdpdFxuZnVuY3Rpb24gY2FtbF9wYXJzZV9kaWdpdChjKSB7XG4gIGlmIChjID49IDQ4ICYmIGMgPD0gNTcpICByZXR1cm4gYyAtIDQ4O1xuICBpZiAoYyA+PSA2NSAmJiBjIDw9IDkwKSAgcmV0dXJuIGMgLSA1NTtcbiAgaWYgKGMgPj0gOTcgJiYgYyA8PSAxMjIpIHJldHVybiBjIC0gODc7XG4gIHJldHVybiAtMTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pbnRfb2Zfc3RyaW5nIChjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfdW5zYWZlX2dldFxuLy9SZXF1aXJlczogY2FtbF9wYXJzZV9zaWduX2FuZF9iYXNlLCBjYW1sX3BhcnNlX2RpZ2l0LCBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX2ludF9vZl9zdHJpbmcgKHMpIHtcbiAgdmFyIHIgPSBjYW1sX3BhcnNlX3NpZ25fYW5kX2Jhc2UgKHMpO1xuICB2YXIgaSA9IHJbMF0sIHNpZ24gPSByWzFdLCBiYXNlID0gclsyXTtcbiAgdmFyIGxlbiA9IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKTtcbiAgdmFyIHRocmVzaG9sZCA9IC0xID4+PiAwO1xuICB2YXIgYyA9IChpIDwgbGVuKT9jYW1sX3N0cmluZ191bnNhZmVfZ2V0KHMsIGkpOjA7XG4gIHZhciBkID0gY2FtbF9wYXJzZV9kaWdpdChjKTtcbiAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIHZhciByZXMgPSBkO1xuICBmb3IgKGkrKztpPGxlbjtpKyspIHtcbiAgICBjID0gY2FtbF9zdHJpbmdfdW5zYWZlX2dldChzLCBpKTtcbiAgICBpZiAoYyA9PSA5NSkgY29udGludWU7XG4gICAgZCA9IGNhbWxfcGFyc2VfZGlnaXQoYyk7XG4gICAgaWYgKGQgPCAwIHx8IGQgPj0gYmFzZSkgYnJlYWs7XG4gICAgcmVzID0gYmFzZSAqIHJlcyArIGQ7XG4gICAgaWYgKHJlcyA+IHRocmVzaG9sZCkgY2FtbF9mYWlsd2l0aChcImludF9vZl9zdHJpbmdcIik7XG4gIH1cbiAgaWYgKGkgIT0gbGVuKSBjYW1sX2ZhaWx3aXRoKFwiaW50X29mX3N0cmluZ1wiKTtcbiAgLy8gRm9yIGJhc2UgZGlmZmVyZW50IGZyb20gMTAsIHdlIGV4cGVjdCBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbixcbiAgLy8gaGVuY2UgYW55IHZhbHVlIG9mICdyZXMnIChsZXNzIHRoYW4gJ3RocmVzaG9sZCcpIGlzIGFjY2VwdGFibGUuXG4gIC8vIEJ1dCB3ZSBoYXZlIHRvIGNvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIGEgc2lnbmVkIGludGVnZXIuXG4gIHJlcyA9IHNpZ24gKiByZXM7XG4gIGlmICgoYmFzZSA9PSAxMCkgJiYgKChyZXMgfCAwKSAhPSByZXMpKVxuICAgIC8qIFNpZ25lZCByZXByZXNlbnRhdGlvbiBleHBlY3RlZCwgYWxsb3cgLTJeKG5iaXRzLTEpIHRvIDJeKG5iaXRzLTEpIC0gMSAqL1xuICAgIGNhbWxfZmFpbHdpdGgoXCJpbnRfb2Zfc3RyaW5nXCIpO1xuICByZXR1cm4gcmVzIHwgMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tdWwgY29uc3RcbmZ1bmN0aW9uIGNhbWxfbXVsKGEsYil7XG4gIHJldHVybiBNYXRoLmltdWwoYSxiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9kaXZcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfemVyb19kaXZpZGVcbmZ1bmN0aW9uIGNhbWxfZGl2KHgseSkge1xuICBpZiAoeSA9PSAwKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpO1xuICByZXR1cm4gKHgveSl8MDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tb2Rcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfemVyb19kaXZpZGVcbmZ1bmN0aW9uIGNhbWxfbW9kKHgseSkge1xuICBpZiAoeSA9PSAwKSBjYW1sX3JhaXNlX3plcm9fZGl2aWRlICgpO1xuICByZXR1cm4geCV5O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Jzd2FwMTZcbmZ1bmN0aW9uIGNhbWxfYnN3YXAxNih4KSB7XG4gIHJldHVybiAoKCgoeCAmIDB4MDBGRikgPDwgOCkgfFxuICAgICAgICAgICAoKHggJiAweEZGMDApID4+IDgpKSk7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2ludDMyX2Jzd2FwXG5mdW5jdGlvbiBjYW1sX2ludDMyX2Jzd2FwKHgpIHtcbiAgcmV0dXJuICgoKHggJiAweDAwMDAwMEZGKSA8PCAyNCkgfFxuICAgICAgICAgICgoeCAmIDB4MDAwMEZGMDApIDw8IDgpIHxcbiAgICAgICAgICAoKHggJiAweDAwRkYwMDAwKSA+Pj4gOCkgfFxuICAgICAgICAgICgoeCAmIDB4RkYwMDAwMDApID4+PiAyNCkpO1xufVxuLy9Qcm92aWRlczogY2FtbF9pbnQ2NF9ic3dhcFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF90b19ieXRlcywgY2FtbF9pbnQ2NF9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9pbnQ2NF9ic3dhcCh4KSB7XG4gIHZhciB5ID0gY2FtbF9pbnQ2NF90b19ieXRlcyh4KTtcbiAgcmV0dXJuIGNhbWxfaW50NjRfb2ZfYnl0ZXMoW3lbN10sIHlbNl0sIHlbNV0sIHlbNF0sIHlbM10sIHlbMl0sIHlbMV0sIHlbMF1dKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vLy8vLy8vLy8vLy8gSGFzaHRibFxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF91bml2X3BhcmFtIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfc3RyaW5nLCBjYW1sX2lzX21sX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfdG9fYnl0ZXMsIGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCwgY2FtbF9jdXN0b21fb3BzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2xlbmd0aCwgY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9WZXJzaW9uOiA8IDQuMTJcbmZ1bmN0aW9uIGNhbWxfaGFzaF91bml2X3BhcmFtIChjb3VudCwgbGltaXQsIG9iaikge1xuICB2YXIgaGFzaF9hY2N1ID0gMDtcbiAgZnVuY3Rpb24gaGFzaF9hdXggKG9iaikge1xuICAgIGxpbWl0IC0tO1xuICAgIGlmIChjb3VudCA8IDAgfHwgbGltaXQgPCAwKSByZXR1cm47XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5ICYmIG9ialswXSA9PT0gKG9ialswXXwwKSkge1xuICAgICAgc3dpdGNoIChvYmpbMF0pIHtcbiAgICAgIGNhc2UgMjQ4OlxuICAgICAgICAvLyBPYmplY3RcbiAgICAgICAgY291bnQgLS07XG4gICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiA2NTU5OSArIG9ialsyXSkgfCAwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjUwOlxuICAgICAgICAvLyBGb3J3YXJkXG4gICAgICAgIGxpbWl0Kys7IGhhc2hfYXV4KG9iaik7IGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY291bnQgLS07XG4gICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIG9ialswXSkgfCAwO1xuICAgICAgICBmb3IgKHZhciBpID0gb2JqLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIGhhc2hfYXV4IChvYmpbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9ieXRlcyhvYmopKSB7XG4gICAgICBjb3VudCAtLTtcbiAgICAgIHZhciBjb250ZW50ID0gY2FtbF9tbF9ieXRlc19jb250ZW50KG9iaik7XG4gICAgICBpZih0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBmb3IgKHZhciBiID0gY29udGVudCwgbCA9IGIubGVuZ3RoLCBpID0gMDsgaSA8IGw7IGkrKylcbiAgICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBiLmNoYXJDb2RlQXQoaSkpIHwgMDtcbiAgICAgIH0gZWxzZSB7IC8qIEFSUkFZICovXG4gICAgICAgIGZvciAodmFyIGEgPSBjb250ZW50LCBsID0gYS5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIGFbaV0pIHwgMDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfc3RyaW5nKG9iaikpIHtcbiAgICAgIHZhciBqc2J5dGVzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhvYmopO1xuICAgICAgZm9yICh2YXIgYiA9IGpzYnl0ZXMsIGwgPSBqc2J5dGVzLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyBpKyspXG4gICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIGIuY2hhckNvZGVBdChpKSkgfCAwO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZm9yICh2YXIgYiA9IG9iaiwgbCA9IG9iai5sZW5ndGgsIGkgPSAwOyBpIDwgbDsgaSsrKVxuICAgICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogMTkgKyBiLmNoYXJDb2RlQXQoaSkpIHwgMDtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gKG9ianwwKSkge1xuICAgICAgLy8gSW50ZWdlclxuICAgICAgY291bnQgLS07XG4gICAgICBoYXNoX2FjY3UgPSAoaGFzaF9hY2N1ICogNjU1OTkgKyBvYmopIHwgMDtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gK29iaikge1xuICAgICAgLy8gRmxvYXRcbiAgICAgIGNvdW50LS07XG4gICAgICB2YXIgcCA9IGNhbWxfaW50NjRfdG9fYnl0ZXMgKGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCAob2JqKSk7XG4gICAgICBmb3IgKHZhciBpID0gNzsgaSA+PSAwOyBpLS0pIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiAxOSArIHBbaV0pIHwgMDtcbiAgICB9IGVsc2UgaWYob2JqICYmIG9iai5jYW1sX2N1c3RvbSkge1xuICAgICAgaWYoY2FtbF9jdXN0b21fb3BzW29iai5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW29iai5jYW1sX2N1c3RvbV0uaGFzaCkge1xuICAgICAgICB2YXIgaCA9IGNhbWxfY3VzdG9tX29wc1tvYmouY2FtbF9jdXN0b21dLmhhc2gob2JqKSB8IDA7XG4gICAgICAgIGhhc2hfYWNjdSA9IChoYXNoX2FjY3UgKiA2NTU5OSArIGgpIHwgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaGFzaF9hdXggKG9iaik7XG4gIHJldHVybiBoYXNoX2FjY3UgJiAweDNGRkZGRkZGO1xufVxuXG4vL2Z1bmN0aW9uIFJPVEwzMih4LG4pIHsgcmV0dXJuICgoeCA8PCBuKSB8ICh4ID4+PiAoMzItbikpKTsgfVxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9pbnRcbi8vUmVxdWlyZXM6IGNhbWxfbXVsXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ludChoLGQpIHtcbiAgZCA9IGNhbWxfbXVsKGQsIDB4Y2M5ZTJkNTF8MCk7XG4gIGQgPSAoKGQgPDwgMTUpIHwgKGQgPj4+ICgzMi0xNSkpKTsgLy8gUk9UTDMyKGQsIDE1KTtcbiAgZCA9IGNhbWxfbXVsKGQsIDB4MWI4NzM1OTMpO1xuICBoIF49IGQ7XG4gIGggPSAoKGggPDwgMTMpIHwgKGggPj4+ICgzMi0xMykpKTsgICAvL1JPVEwzMihoLCAxMyk7XG4gIHJldHVybiAoKChoICsgKGggPDwgMikpfDApICsgKDB4ZTY1NDZiNjR8MCkpfDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfZmluYWxcbi8vUmVxdWlyZXM6IGNhbWxfbXVsXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2ZpbmFsKGgpIHtcbiAgaCBePSBoID4+PiAxNjtcbiAgaCA9IGNhbWxfbXVsIChoLCAweDg1ZWJjYTZifDApO1xuICBoIF49IGggPj4+IDEzO1xuICBoID0gY2FtbF9tdWwgKGgsIDB4YzJiMmFlMzV8MCk7XG4gIGggXj0gaCA+Pj4gMTY7XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXQsIGNhbWxfaGFzaF9taXhfaW50NjRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfZmxvYXQgKGgsIHYwKSB7XG4gIHJldHVybiBjYW1sX2hhc2hfbWl4X2ludDY0KGgsIGNhbWxfaW50NjRfYml0c19vZl9mbG9hdCAodjApKTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfaGFzaF9taXhfaW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2xvMzIsIGNhbWxfaW50NjRfaGkzMlxuZnVuY3Rpb24gY2FtbF9oYXNoX21peF9pbnQ2NCAoaCwgdikge1xuICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgY2FtbF9pbnQ2NF9sbzMyKHYpKTtcbiAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIGNhbWxfaW50NjRfaGkzMih2KSk7XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50XG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCwgcykge1xuICB2YXIgbGVuID0gcy5sZW5ndGgsIGksIHc7XG4gIGZvciAoaSA9IDA7IGkgKyA0IDw9IGxlbjsgaSArPSA0KSB7XG4gICAgdyA9IHMuY2hhckNvZGVBdChpKVxuICAgICAgfCAocy5jaGFyQ29kZUF0KGkrMSkgPDwgOClcbiAgICAgIHwgKHMuY2hhckNvZGVBdChpKzIpIDw8IDE2KVxuICAgICAgfCAocy5jaGFyQ29kZUF0KGkrMykgPDwgMjQpO1xuICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB3KTtcbiAgfVxuICB3ID0gMDtcbiAgc3dpdGNoIChsZW4gJiAzKSB7XG4gIGNhc2UgMzogdyAgPSBzLmNoYXJDb2RlQXQoaSsyKSA8PCAxNjtcbiAgY2FzZSAyOiB3IHw9IHMuY2hhckNvZGVBdChpKzEpIDw8IDg7XG4gIGNhc2UgMTpcbiAgICB3IHw9IHMuY2hhckNvZGVBdChpKTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIGRlZmF1bHQ6XG4gIH1cbiAgaCBePSBsZW47XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzX2FyclxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9pbnRcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsIHMpIHtcbiAgdmFyIGxlbiA9IHMubGVuZ3RoLCBpLCB3O1xuICBmb3IgKGkgPSAwOyBpICsgNCA8PSBsZW47IGkgKz0gNCkge1xuICAgIHcgPSBzW2ldXG4gICAgICB8IChzW2krMV0gPDwgOClcbiAgICAgIHwgKHNbaSsyXSA8PCAxNilcbiAgICAgIHwgKHNbaSszXSA8PCAyNCk7XG4gICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHcpO1xuICB9XG4gIHcgPSAwO1xuICBzd2l0Y2ggKGxlbiAmIDMpIHtcbiAgY2FzZSAzOiB3ICA9IHNbaSsyXSA8PCAxNjtcbiAgY2FzZSAyOiB3IHw9IHNbaSsxXSA8PCA4O1xuICBjYXNlIDE6IHcgfD0gc1tpXTtcbiAgICBoID0gY2FtbF9oYXNoX21peF9pbnQoaCwgdyk7XG4gIGRlZmF1bHQ6XG4gIH1cbiAgaCBePSBsZW47XG4gIHJldHVybiBoO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX21sX2J5dGVzX2NvbnRlbnRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9ieXRlc19hcnJcbmZ1bmN0aW9uIGNhbWxfaGFzaF9taXhfYnl0ZXMoaCwgdikge1xuICB2YXIgY29udGVudCA9IGNhbWxfbWxfYnl0ZXNfY29udGVudCh2KTtcbiAgaWYodHlwZW9mIGNvbnRlbnQgPT09IFwic3RyaW5nXCIpXG4gICAgcmV0dXJuIGNhbWxfaGFzaF9taXhfanNieXRlcyhoLCBjb250ZW50KVxuICBlbHNlIC8qIEFSUkFZICovXG4gICAgcmV0dXJuIGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyKGgsIGNvbnRlbnQpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2hhc2hfbWl4X3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9qc2J5dGVzLCBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X3N0cmluZyhoLCB2KSB7XG4gIHJldHVybiBjYW1sX2hhc2hfbWl4X2pzYnl0ZXMoaCwgY2FtbF9qc2J5dGVzX29mX3N0cmluZyh2KSk7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9oYXNoIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfc3RyaW5nLCBjYW1sX2lzX21sX2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludCwgY2FtbF9oYXNoX21peF9maW5hbFxuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9mbG9hdCwgY2FtbF9oYXNoX21peF9zdHJpbmcsIGNhbWxfaGFzaF9taXhfYnl0ZXMsIGNhbWxfY3VzdG9tX29wc1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9qc2J5dGVzXG4vL1JlcXVpcmVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbmZ1bmN0aW9uIGNhbWxfaGFzaCAoY291bnQsIGxpbWl0LCBzZWVkLCBvYmopIHtcbiAgdmFyIHF1ZXVlLCByZCwgd3IsIHN6LCBudW0sIGgsIHYsIGksIGxlbjtcbiAgc3ogPSBsaW1pdDtcbiAgaWYgKHN6IDwgMCB8fCBzeiA+IDI1Nikgc3ogPSAyNTY7XG4gIG51bSA9IGNvdW50O1xuICBoID0gc2VlZDtcbiAgcXVldWUgPSBbb2JqXTsgcmQgPSAwOyB3ciA9IDE7XG4gIHdoaWxlIChyZCA8IHdyICYmIG51bSA+IDApIHtcbiAgICB2ID0gcXVldWVbcmQrK107XG4gICAgaWYgKHYgJiYgdi5jYW1sX2N1c3RvbSl7XG4gICAgICBpZihjYW1sX2N1c3RvbV9vcHNbdi5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dLmhhc2gpIHtcbiAgICAgICAgdmFyIGhoID0gY2FtbF9jdXN0b21fb3BzW3YuY2FtbF9jdXN0b21dLmhhc2godik7XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludCAoaCwgaGgpO1xuICAgICAgICBudW0gLS07XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBBcnJheSAmJiB2WzBdID09PSAodlswXXwwKSkge1xuICAgICAgc3dpdGNoICh2WzBdKSB7XG4gICAgICBjYXNlIDI0ODpcbiAgICAgICAgLy8gT2JqZWN0XG4gICAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB2WzJdKTtcbiAgICAgICAgbnVtLS07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTA6XG4gICAgICAgIC8vIEZvcndhcmRcbiAgICAgICAgcXVldWVbLS1yZF0gPSB2WzFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh2WzBdKSkge1xuICAgICAgICAgIC8qIEFsbCBjb250aW51YXRpb25zIGhhc2ggdG8gdGhlIHNhbWUgdmFsdWUsXG4gICAgICAgICAgICAgc2luY2Ugd2UgaGF2ZSBubyBpZGVhIGhvdyB0byBkaXN0aW5ndWlzaCB0aGVtLiAqL1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0YWcgPSAoKHYubGVuZ3RoIC0gMSkgPDwgMTApIHwgdlswXTtcbiAgICAgICAgaCA9IGNhbWxfaGFzaF9taXhfaW50KGgsIHRhZyk7XG4gICAgICAgIGZvciAoaSA9IDEsIGxlbiA9IHYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBpZiAod3IgPj0gc3opIGJyZWFrO1xuICAgICAgICAgIHF1ZXVlW3dyKytdID0gdltpXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXModikpIHtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2J5dGVzKGgsdilcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcodikpIHtcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X3N0cmluZyhoLHYpXG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBoID0gY2FtbF9oYXNoX21peF9qc2J5dGVzKGgsdilcbiAgICAgIG51bS0tO1xuICAgIH0gZWxzZSBpZiAodiA9PT0gKHZ8MCkpIHtcbiAgICAgIC8vIEludGVnZXJcbiAgICAgIGggPSBjYW1sX2hhc2hfbWl4X2ludChoLCB2K3YrMSk7XG4gICAgICBudW0tLTtcbiAgICB9IGVsc2UgaWYgKHYgPT09ICt2KSB7XG4gICAgICAvLyBGbG9hdFxuICAgICAgaCA9IGNhbWxfaGFzaF9taXhfZmxvYXQoaCx2KTtcbiAgICAgIG51bS0tO1xuICAgIH1cbiAgfVxuICBoID0gY2FtbF9oYXNoX21peF9maW5hbChoKTtcbiAgcmV0dXJuIGggJiAweDNGRkZGRkZGO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3N0cmluZ19oYXNoXG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ZpbmFsLCBjYW1sX2hhc2hfbWl4X3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9zdHJpbmdfaGFzaChoLCB2KXtcbiAgdmFyIGggPSBjYW1sX2hhc2hfbWl4X3N0cmluZyhoLHYpO1xuICB2YXIgaCA9IGNhbWxfaGFzaF9taXhfZmluYWwoaCk7XG4gIHJldHVybiBoICYgMHgzRkZGRkZGRjtcbn1cbiIsIi8vUHJvdmlkZXM6IEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50NjRcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfaW50NjRcbnZhciBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludDY0ID0gY2FtbF9oYXNoX21peF9pbnQ2NDtcbi8vUHJvdmlkZXM6IEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2ludFxudmFyIEJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfaW50ID0gY2FtbF9oYXNoX21peF9pbnQ7XG4vL1Byb3ZpZGVzOiBCYXNlX2ludGVybmFsaGFzaF9mb2xkX2Zsb2F0XG4vL1JlcXVpcmVzOiBjYW1sX2hhc2hfbWl4X2Zsb2F0XG52YXIgQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9mbG9hdCA9IGNhbWxfaGFzaF9taXhfZmxvYXQ7XG4vL1Byb3ZpZGVzOiBCYXNlX2ludGVybmFsaGFzaF9mb2xkX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9oYXNoX21peF9zdHJpbmdcbnZhciBCYXNlX2ludGVybmFsaGFzaF9mb2xkX3N0cmluZyA9IGNhbWxfaGFzaF9taXhfc3RyaW5nO1xuLy9Qcm92aWRlczogQmFzZV9pbnRlcm5hbGhhc2hfZ2V0X2hhc2hfdmFsdWVcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfZmluYWxcbmZ1bmN0aW9uIEJhc2VfaW50ZXJuYWxoYXNoX2dldF9oYXNoX3ZhbHVlKHNlZWQpIHtcbiAgdmFyIGggPSBjYW1sX2hhc2hfbWl4X2ZpbmFsKHNlZWQpO1xuICByZXR1cm4gaCAmIDB4M0ZGRkZGRkY7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICovXG4vKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICovXG4vKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdpdGggICAgICovXG4vKiAgdGhlIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZpbGUgLi4vTElDRU5TRS4gICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qICRJZDogcGFyc2luZy5jIDg5ODMgMjAwOC0wOC0wNiAwOTozODoyNVogeGxlcm95ICQgKi9cblxuLyogVGhlIFBEQSBhdXRvbWF0b24gZm9yIHBhcnNlcnMgZ2VuZXJhdGVkIGJ5IGNhbWx5YWNjICovXG5cbi8qIFRoZSBwdXNoZG93biBhdXRvbWF0YSAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3BhcnNlcl90cmFjZVxudmFyIGNhbWxfcGFyc2VyX3RyYWNlID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9wYXJzZV9lbmdpbmVcbi8vUmVxdWlyZXM6IGNhbWxfbGV4X2FycmF5LCBjYW1sX3BhcnNlcl90cmFjZSxjYW1sX2pzc3RyaW5nX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9tbF9vdXRwdXQsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9zdHJpbmdfb2ZfanNieXRlc1xuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZywgTWxCeXRlc1xuZnVuY3Rpb24gY2FtbF9wYXJzZV9lbmdpbmUodGFibGVzLCBlbnYsIGNtZCwgYXJnKVxue1xuICB2YXIgRVJSQ09ERSA9IDI1NjtcblxuICAvL3ZhciBTVEFSVCA9IDA7XG4gIC8vdmFyIFRPS0VOX1JFQUQgPSAxO1xuICAvL3ZhciBTVEFDS1NfR1JPV05fMSA9IDI7XG4gIC8vdmFyIFNUQUNLU19HUk9XTl8yID0gMztcbiAgLy92YXIgU0VNQU5USUNfQUNUSU9OX0NPTVBVVEVEID0gNDtcbiAgLy92YXIgRVJST1JfREVURUNURUQgPSA1O1xuICB2YXIgbG9vcCA9IDY7XG4gIHZhciB0ZXN0c2hpZnQgPSA3O1xuICB2YXIgc2hpZnQgPSA4O1xuICB2YXIgc2hpZnRfcmVjb3ZlciA9IDk7XG4gIHZhciByZWR1Y2UgPSAxMDtcblxuICB2YXIgUkVBRF9UT0tFTiA9IDA7XG4gIHZhciBSQUlTRV9QQVJTRV9FUlJPUiA9IDE7XG4gIHZhciBHUk9XX1NUQUNLU18xID0gMjtcbiAgdmFyIEdST1dfU1RBQ0tTXzIgPSAzO1xuICB2YXIgQ09NUFVURV9TRU1BTlRJQ19BQ1RJT04gPSA0O1xuICB2YXIgQ0FMTF9FUlJPUl9GVU5DVElPTiA9IDU7XG5cbiAgdmFyIGVudl9zX3N0YWNrID0gMTtcbiAgdmFyIGVudl92X3N0YWNrID0gMjtcbiAgdmFyIGVudl9zeW1iX3N0YXJ0X3N0YWNrID0gMztcbiAgdmFyIGVudl9zeW1iX2VuZF9zdGFjayA9IDQ7XG4gIHZhciBlbnZfc3RhY2tzaXplID0gNTtcbiAgdmFyIGVudl9zdGFja2Jhc2UgPSA2O1xuICB2YXIgZW52X2N1cnJfY2hhciA9IDc7XG4gIHZhciBlbnZfbHZhbCA9IDg7XG4gIHZhciBlbnZfc3ltYl9zdGFydCA9IDk7XG4gIHZhciBlbnZfc3ltYl9lbmQgPSAxMDtcbiAgdmFyIGVudl9hc3AgPSAxMTtcbiAgdmFyIGVudl9ydWxlX2xlbiA9IDEyO1xuICB2YXIgZW52X3J1bGVfbnVtYmVyID0gMTM7XG4gIHZhciBlbnZfc3AgPSAxNDtcbiAgdmFyIGVudl9zdGF0ZSA9IDE1O1xuICB2YXIgZW52X2VycmZsYWcgPSAxNjtcblxuICAvLyB2YXIgX3RibF9hY3Rpb25zID0gMTtcbiAgdmFyIHRibF90cmFuc2xfY29uc3QgPSAyO1xuICB2YXIgdGJsX3RyYW5zbF9ibG9jayA9IDM7XG4gIHZhciB0YmxfbGhzID0gNDtcbiAgdmFyIHRibF9sZW4gPSA1O1xuICB2YXIgdGJsX2RlZnJlZCA9IDY7XG4gIHZhciB0YmxfZGdvdG8gPSA3O1xuICB2YXIgdGJsX3NpbmRleCA9IDg7XG4gIHZhciB0YmxfcmluZGV4ID0gOTtcbiAgdmFyIHRibF9naW5kZXggPSAxMDtcbiAgdmFyIHRibF90YWJsZXNpemUgPSAxMTtcbiAgdmFyIHRibF90YWJsZSA9IDEyO1xuICB2YXIgdGJsX2NoZWNrID0gMTM7XG4gIC8vIHZhciBfdGJsX2Vycm9yX2Z1bmN0aW9uID0gMTQ7XG4gIHZhciB0YmxfbmFtZXNfY29uc3QgPSAxNTtcbiAgdmFyIHRibF9uYW1lc19ibG9jayA9IDE2O1xuXG5cbiAgZnVuY3Rpb24gbG9nKHgpIHtcbiAgICB2YXIgcyA9IGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMoeCArIFwiXFxuXCIpO1xuICAgIGNhbWxfbWxfb3V0cHV0KDIsIHMsIDAsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0b2tlbl9uYW1lKG5hbWVzLCBudW1iZXIpXG4gIHtcbiAgICB2YXIgc3RyID0gY2FtbF9qc3N0cmluZ19vZl9zdHJpbmcobmFtZXMpO1xuICAgIGlmIChzdHJbMF0gPT0gJ1xceDAwJylcbiAgICAgIHJldHVybiBcIjx1bmtub3duIHRva2VuPlwiO1xuICAgIHJldHVybiBzdHIuc3BsaXQoJ1xceDAwJylbbnVtYmVyXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByaW50X3Rva2VuKHN0YXRlLCB0b2spXG4gIHtcbiAgICB2YXIgdG9rZW4sIGtpbmQ7XG4gICAgaWYgKHRvayBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB0b2tlbiA9IHRva2VuX25hbWUodGFibGVzW3RibF9uYW1lc19ibG9ja10sIHRva1swXSk7XG4gICAgICBpZiAodHlwZW9mIHRva1sxXSA9PSBcIm51bWJlclwiKVxuICAgICAgICBraW5kID0gXCJcIiArIHRva1sxXTtcbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB0b2tbMV0gPT0gXCJzdHJpbmdcIilcbiAgICAgICAga2luZCA9IHRva1sxXVxuICAgICAgZWxzZSBpZiAodG9rWzFdIGluc3RhbmNlb2YgTWxCeXRlcylcbiAgICAgICAga2luZCA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcodG9rWzFdKVxuICAgICAgZWxzZVxuICAgICAgICBraW5kID0gXCJfXCJcbiAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVhZCB0b2tlbiBcIiArIHRva2VuICsgXCIoXCIgKyBraW5kICsgXCIpXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b2tlbiA9IHRva2VuX25hbWUodGFibGVzW3RibF9uYW1lc19jb25zdF0sIHRvayk7XG4gICAgICBsb2coXCJTdGF0ZSBcIiArIHN0YXRlICsgXCI6IHJlYWQgdG9rZW4gXCIgKyB0b2tlbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKCF0YWJsZXMuZGdvdG8pIHtcbiAgICB0YWJsZXMuZGVmcmVkID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfZGVmcmVkXSk7XG4gICAgdGFibGVzLnNpbmRleCA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX3NpbmRleF0pO1xuICAgIHRhYmxlcy5jaGVjayAgPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9jaGVja10pO1xuICAgIHRhYmxlcy5yaW5kZXggPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9yaW5kZXhdKTtcbiAgICB0YWJsZXMudGFibGUgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfdGFibGVdKTtcbiAgICB0YWJsZXMubGVuICAgID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfbGVuXSk7XG4gICAgdGFibGVzLmxocyAgICA9IGNhbWxfbGV4X2FycmF5ICh0YWJsZXNbdGJsX2xoc10pO1xuICAgIHRhYmxlcy5naW5kZXggPSBjYW1sX2xleF9hcnJheSAodGFibGVzW3RibF9naW5kZXhdKTtcbiAgICB0YWJsZXMuZGdvdG8gID0gY2FtbF9sZXhfYXJyYXkgKHRhYmxlc1t0YmxfZGdvdG9dKTtcbiAgfVxuXG4gIHZhciByZXMgPSAwLCBuLCBuMSwgbjIsIHN0YXRlMTtcblxuICAvLyBSRVNUT1JFXG4gIHZhciBzcCA9IGVudltlbnZfc3BdO1xuICB2YXIgc3RhdGUgPSBlbnZbZW52X3N0YXRlXTtcbiAgdmFyIGVycmZsYWcgPSBlbnZbZW52X2VycmZsYWddO1xuXG4gIGV4aXQ6Zm9yICg7Oykge1xuICAgIG5leHQ6c3dpdGNoKGNtZCkge1xuICAgIGNhc2UgMDovL1NUQVJUOlxuICAgICAgc3RhdGUgPSAwO1xuICAgICAgZXJyZmxhZyA9IDA7XG4gICAgICAvLyBGYWxsIHRocm91Z2hcblxuICAgIGNhc2UgNjovL2xvb3A6XG4gICAgICBuID0gdGFibGVzLmRlZnJlZFtzdGF0ZV07XG4gICAgICBpZiAobiAhPSAwKSB7IGNtZCA9IHJlZHVjZTsgYnJlYWs7IH1cbiAgICAgIGlmIChlbnZbZW52X2N1cnJfY2hhcl0gPj0gMCkgeyBjbWQgPSB0ZXN0c2hpZnQ7IGJyZWFrOyB9XG4gICAgICByZXMgPSBSRUFEX1RPS0VOO1xuICAgICAgYnJlYWsgZXhpdDtcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBsZXhlciBhbmQgdXBkYXRlcyAqL1xuICAgICAgLyogc3ltYl9zdGFydCBhbmQgc3ltYl9lbmQgKi9cbiAgICBjYXNlIDE6Ly9UT0tFTl9SRUFEOlxuICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGVudltlbnZfY3Vycl9jaGFyXSA9IHRhYmxlc1t0YmxfdHJhbnNsX2Jsb2NrXVthcmdbMF0gKyAxXTtcbiAgICAgICAgZW52W2Vudl9sdmFsXSA9IGFyZ1sxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudltlbnZfY3Vycl9jaGFyXSA9IHRhYmxlc1t0YmxfdHJhbnNsX2NvbnN0XVthcmcgKyAxXTtcbiAgICAgICAgZW52W2Vudl9sdmFsXSA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpIHByaW50X3Rva2VuIChzdGF0ZSwgYXJnKTtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuXG4gICAgY2FzZSA3Oi8vdGVzdHNoaWZ0OlxuICAgICAgbjEgPSB0YWJsZXMuc2luZGV4W3N0YXRlXTtcbiAgICAgIG4yID0gbjEgKyBlbnZbZW52X2N1cnJfY2hhcl07XG4gICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT0gZW52W2Vudl9jdXJyX2NoYXJdKSB7XG4gICAgICAgIGNtZCA9IHNoaWZ0OyBicmVhaztcbiAgICAgIH1cbiAgICAgIG4xID0gdGFibGVzLnJpbmRleFtzdGF0ZV07XG4gICAgICBuMiA9IG4xICsgZW52W2Vudl9jdXJyX2NoYXJdO1xuICAgICAgaWYgKG4xICE9IDAgJiYgbjIgPj0gMCAmJiBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICB0YWJsZXMuY2hlY2tbbjJdID09IGVudltlbnZfY3Vycl9jaGFyXSkge1xuICAgICAgICBuID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgICAgY21kID0gcmVkdWNlOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChlcnJmbGFnIDw9IDApIHtcbiAgICAgICAgcmVzID0gQ0FMTF9FUlJPUl9GVU5DVElPTjtcbiAgICAgICAgYnJlYWsgZXhpdDtcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgICAgLyogVGhlIE1MIGNvZGUgY2FsbHMgdGhlIGVycm9yIGZ1bmN0aW9uICovXG4gICAgY2FzZSA1Oi8vRVJST1JfREVURUNURUQ6XG4gICAgICBpZiAoZXJyZmxhZyA8IDMpIHtcbiAgICAgICAgZXJyZmxhZyA9IDM7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBzdGF0ZTEgPSBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV07XG4gICAgICAgICAgbjEgPSB0YWJsZXMuc2luZGV4W3N0YXRlMV07XG4gICAgICAgICAgbjIgPSBuMSArIEVSUkNPREU7XG4gICAgICAgICAgaWYgKG4xICE9IDAgJiYgbjIgPj0gMCAmJiBuMiA8PSB0YWJsZXNbdGJsX3RhYmxlc2l6ZV0gJiZcbiAgICAgICAgICAgICAgdGFibGVzLmNoZWNrW24yXSA9PSBFUlJDT0RFKSB7XG4gICAgICAgICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgICAgICAgIGxvZyhcIlJlY292ZXJpbmcgaW4gc3RhdGUgXCIgKyBzdGF0ZTEpO1xuICAgICAgICAgICAgY21kID0gc2hpZnRfcmVjb3ZlcjsgYnJlYWsgbmV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgICAgICBsb2coXCJEaXNjYXJkaW5nIHN0YXRlIFwiICsgc3RhdGUxKTtcbiAgICAgICAgICAgIGlmIChzcCA8PSBlbnZbZW52X3N0YWNrYmFzZV0pIHtcbiAgICAgICAgICAgICAgaWYgKGNhbWxfcGFyc2VyX3RyYWNlKVxuICAgICAgICAgICAgICAgIGxvZyhcIk5vIG1vcmUgc3RhdGVzIHRvIGRpc2NhcmRcIik7XG4gICAgICAgICAgICAgIHJldHVybiBSQUlTRV9QQVJTRV9FUlJPUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIFRoZSBNTCBjb2RlIHJhaXNlcyBQYXJzZV9lcnJvciAqL1xuICAgICAgICAgICAgc3AtLTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChlbnZbZW52X2N1cnJfY2hhcl0gPT0gMClcbiAgICAgICAgICByZXR1cm4gUkFJU0VfUEFSU0VfRVJST1I7IC8qIFRoZSBNTCBjb2RlIHJhaXNlcyBQYXJzZV9lcnJvciAqL1xuICAgICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgICAgbG9nKFwiRGlzY2FyZGluZyBsYXN0IHRva2VuIHJlYWRcIik7XG4gICAgICAgIGVudltlbnZfY3Vycl9jaGFyXSA9IC0xO1xuICAgICAgICBjbWQgPSBsb29wOyBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgIGNhc2UgODovL3NoaWZ0OlxuICAgICAgZW52W2Vudl9jdXJyX2NoYXJdID0gLTE7XG4gICAgICBpZiAoZXJyZmxhZyA+IDApIGVycmZsYWctLTtcbiAgICAgIC8vIEZhbGwgdGhyb3VnaFxuICAgIGNhc2UgOTovL3NoaWZ0X3JlY292ZXI6XG4gICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogc2hpZnQgdG8gc3RhdGUgXCIgKyB0YWJsZXMudGFibGVbbjJdKTtcbiAgICAgIHN0YXRlID0gdGFibGVzLnRhYmxlW24yXTtcbiAgICAgIHNwKys7XG4gICAgICBpZiAoc3AgPj0gZW52W2Vudl9zdGFja3NpemVdKSB7XG4gICAgICAgIHJlcyA9IEdST1dfU1RBQ0tTXzE7XG4gICAgICAgIGJyZWFrIGV4aXQ7XG4gICAgICB9XG4gICAgICAvLyBGYWxsIHRocm91Z2hcbiAgICAgIC8qIFRoZSBNTCBjb2RlIHJlc2l6ZXMgdGhlIHN0YWNrcyAqL1xuICAgIGNhc2UgMjovL1NUQUNLU19HUk9XTl8xOlxuICAgICAgZW52W2Vudl9zX3N0YWNrXVtzcCArIDFdID0gc3RhdGU7XG4gICAgICBlbnZbZW52X3Zfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X2x2YWxdO1xuICAgICAgZW52W2Vudl9zeW1iX3N0YXJ0X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX3N0YXJ0XTtcbiAgICAgIGVudltlbnZfc3ltYl9lbmRfc3RhY2tdW3NwICsgMV0gPSBlbnZbZW52X3N5bWJfZW5kXTtcbiAgICAgIGNtZCA9IGxvb3A7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMTA6Ly9yZWR1Y2U6XG4gICAgICBpZiAoY2FtbF9wYXJzZXJfdHJhY2UpXG4gICAgICAgIGxvZyhcIlN0YXRlIFwiICsgc3RhdGUgKyBcIjogcmVkdWNlIGJ5IHJ1bGUgXCIgKyBuKTtcbiAgICAgIHZhciBtID0gdGFibGVzLmxlbltuXTtcbiAgICAgIGVudltlbnZfYXNwXSA9IHNwO1xuICAgICAgZW52W2Vudl9ydWxlX251bWJlcl0gPSBuO1xuICAgICAgZW52W2Vudl9ydWxlX2xlbl0gPSBtO1xuICAgICAgc3AgPSBzcCAtIG0gKyAxO1xuICAgICAgbSA9IHRhYmxlcy5saHNbbl07XG4gICAgICBzdGF0ZTEgPSBlbnZbZW52X3Nfc3RhY2tdW3NwXTtcbiAgICAgIG4xID0gdGFibGVzLmdpbmRleFttXTtcbiAgICAgIG4yID0gbjEgKyBzdGF0ZTE7XG4gICAgICBpZiAobjEgIT0gMCAmJiBuMiA+PSAwICYmIG4yIDw9IHRhYmxlc1t0YmxfdGFibGVzaXplXSAmJlxuICAgICAgICAgIHRhYmxlcy5jaGVja1tuMl0gPT0gc3RhdGUxKVxuICAgICAgICBzdGF0ZSA9IHRhYmxlcy50YWJsZVtuMl07XG4gICAgICBlbHNlXG4gICAgICAgIHN0YXRlID0gdGFibGVzLmRnb3RvW21dO1xuICAgICAgaWYgKHNwID49IGVudltlbnZfc3RhY2tzaXplXSkge1xuICAgICAgICByZXMgPSBHUk9XX1NUQUNLU18yO1xuICAgICAgICBicmVhayBleGl0O1xuICAgICAgfVxuICAgICAgLy8gRmFsbCB0aHJvdWdoXG4gICAgICAvKiBUaGUgTUwgY29kZSByZXNpemVzIHRoZSBzdGFja3MgKi9cbiAgICBjYXNlIDM6Ly9TVEFDS1NfR1JPV05fMjpcbiAgICAgIHJlcyA9IENPTVBVVEVfU0VNQU5USUNfQUNUSU9OO1xuICAgICAgYnJlYWsgZXhpdDtcbiAgICAgIC8qIFRoZSBNTCBjb2RlIGNhbGxzIHRoZSBzZW1hbnRpYyBhY3Rpb24gKi9cbiAgICBjYXNlIDQ6Ly9TRU1BTlRJQ19BQ1RJT05fQ09NUFVURUQ6XG4gICAgICBlbnZbZW52X3Nfc3RhY2tdW3NwICsgMV0gPSBzdGF0ZTtcbiAgICAgIGVudltlbnZfdl9zdGFja11bc3AgKyAxXSA9IGFyZztcbiAgICAgIHZhciBhc3AgPSBlbnZbZW52X2FzcF07XG4gICAgICBlbnZbZW52X3N5bWJfZW5kX3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX2VuZF9zdGFja11bYXNwICsgMV07XG4gICAgICBpZiAoc3AgPiBhc3ApIHtcbiAgICAgICAgLyogVGhpcyBpcyBhbiBlcHNpbG9uIHByb2R1Y3Rpb24uIFRha2Ugc3ltYl9zdGFydCBlcXVhbCB0byBzeW1iX2VuZC4gKi9cbiAgICAgICAgZW52W2Vudl9zeW1iX3N0YXJ0X3N0YWNrXVtzcCArIDFdID0gZW52W2Vudl9zeW1iX2VuZF9zdGFja11bYXNwICsgMV07XG4gICAgICB9XG4gICAgICBjbWQgPSBsb29wOyBicmVhaztcbiAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBSQUlTRV9QQVJTRV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLy8gU0FWRVxuICBlbnZbZW52X3NwXSA9IHNwO1xuICBlbnZbZW52X3N0YXRlXSA9IHN0YXRlO1xuICBlbnZbZW52X2VycmZsYWddID0gZXJyZmxhZztcbiAgcmV0dXJuIHJlcztcbn1cblxuLy9Qcm92aWRlczogY2FtbF9zZXRfcGFyc2VyX3RyYWNlIGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX3BhcnNlcl90cmFjZVxuZnVuY3Rpb24gY2FtbF9zZXRfcGFyc2VyX3RyYWNlKGJvb2wpIHtcbiAgdmFyIG9sZGZsYWcgPSBjYW1sX3BhcnNlcl90cmFjZTtcbiAgY2FtbF9wYXJzZXJfdHJhY2UgPSBib29sO1xuICByZXR1cm4gb2xkZmxhZztcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfdXBkYXRlX2R1bW15XG5mdW5jdGlvbiBjYW1sX3VwZGF0ZV9kdW1teSAoeCwgeSkge1xuICBpZiggdHlwZW9mIHk9PT1cImZ1bmN0aW9uXCIgKSB7IHguZnVuID0geTsgcmV0dXJuIDA7IH1cbiAgaWYoIHkuZnVuICkgeyB4LmZ1biA9IHkuZnVuOyByZXR1cm4gMDsgfVxuICB2YXIgaSA9IHkubGVuZ3RoOyB3aGlsZSAoaS0tKSB4W2ldID0geVtpXTsgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYWxsb2NfZHVtbXlfaW5maXhcbi8vUmVxdWlyZXM6IGNhbWxfY2FsbF9nZW5cbmZ1bmN0aW9uIGNhbWxfYWxsb2NfZHVtbXlfaW5maXggKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZiAoeCkgeyByZXR1cm4gY2FtbF9jYWxsX2dlbihmLmZ1biwgW3hdKSB9XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2lzX2Jsb2NrIGNvbnN0IChjb25zdClcbmZ1bmN0aW9uIGNhbWxfb2JqX2lzX2Jsb2NrICh4KSB7IHJldHVybiArKHggaW5zdGFuY2VvZiBBcnJheSk7IH1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial90YWdcbi8vUmVxdWlyZXM6IGNhbWxfaXNfbWxfYnl0ZXMsIGNhbWxfaXNfbWxfc3RyaW5nXG5mdW5jdGlvbiBjYW1sX29ial90YWcgKHgpIHtcbiAgaWYgKCh4IGluc3RhbmNlb2YgQXJyYXkpICYmIHhbMF0gPT0gKHhbMF0gPj4+IDApKVxuICAgIHJldHVybiB4WzBdXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMoeCkpXG4gICAgcmV0dXJuIDI1MlxuICBlbHNlIGlmIChjYW1sX2lzX21sX3N0cmluZyh4KSlcbiAgICByZXR1cm4gMjUyXG4gIGVsc2UgaWYgKCh4IGluc3RhbmNlb2YgRnVuY3Rpb24pIHx8IHR5cGVvZiB4ID09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gMjQ3XG4gIGVsc2UgaWYgKHggJiYgeC5jYW1sX2N1c3RvbSlcbiAgICByZXR1cm4gMjU1XG4gIGVsc2VcbiAgICByZXR1cm4gMTAwMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9zZXRfdGFnIChtdXRhYmxlLCBjb25zdClcbmZ1bmN0aW9uIGNhbWxfb2JqX3NldF90YWcgKHgsIHRhZykgeyB4WzBdID0gdGFnOyByZXR1cm4gMDsgfVxuLy9Qcm92aWRlczogY2FtbF9vYmpfYmxvY2sgY29uc3QgKGNvbnN0LGNvbnN0KVxuZnVuY3Rpb24gY2FtbF9vYmpfYmxvY2sgKHRhZywgc2l6ZSkge1xuICB2YXIgbyA9IG5ldyBBcnJheShzaXplKzEpO1xuICBvWzBdPXRhZztcbiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gc2l6ZTsgaSsrKSBvW2ldID0gMDtcbiAgcmV0dXJuIG87XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3dpdGhfdGFnXG5mdW5jdGlvbiBjYW1sX29ial93aXRoX3RhZyh0YWcseCkge1xuICB2YXIgbCA9IHgubGVuZ3RoO1xuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgYVswXSA9IHRhZztcbiAgZm9yKHZhciBpID0gMTsgaSA8IGw7IGkrKyApIGFbaV0gPSB4W2ldO1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfZHVwIG11dGFibGUgKG11dGFibGUpXG5mdW5jdGlvbiBjYW1sX29ial9kdXAgKHgpIHtcbiAgdmFyIGwgPSB4Lmxlbmd0aDtcbiAgdmFyIGEgPSBuZXcgQXJyYXkobCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBsOyBpKysgKSBhW2ldID0geFtpXTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3RydW5jYXRlIChtdXRhYmxlLCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gY2FtbF9vYmpfdHJ1bmNhdGUgKHgsIHMpIHtcbiAgaWYgKHM8PTAgfHwgcyArIDEgPiB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiT2JqLnRydW5jYXRlXCIpO1xuICBpZiAoeC5sZW5ndGggIT0gcyArIDEpIHgubGVuZ3RoID0gcyArIDE7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29ial9tYWtlX2ZvcndhcmRcbmZ1bmN0aW9uIGNhbWxfb2JqX21ha2VfZm9yd2FyZCAoYix2KSB7XG4gIGJbMF09MjUwO1xuICBiWzFdPXY7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX2NvbXBhcmVfYW5kX3N3YXBcbmZ1bmN0aW9uIGNhbWxfb2JqX2NvbXBhcmVfYW5kX3N3YXAoeCxpLG9sZCxuKXtcbiAgaWYoeFtpKzFdID09IG9sZCkge1xuICAgIHhbaSsxXSA9IG47XG4gICAgcmV0dXJuIDE7XG4gIH1cbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfaXNfc2hhcmVkXG5mdW5jdGlvbiBjYW1sX29ial9pc19zaGFyZWQoeCl7XG4gIHJldHVybiAxXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV9tYWtlX2ZvcndhcmQgY29uc3QgKG11dGFibGUpXG5mdW5jdGlvbiBjYW1sX2xhenlfbWFrZV9mb3J3YXJkICh2KSB7IHJldHVybiBbMjUwLCB2XTsgfVxuXG4vLy8vLy8vLy8vLy8vIENhbWxpbnRlcm5hbE9PXG4vL1Byb3ZpZGVzOiBjYW1sX2dldF9wdWJsaWNfbWV0aG9kIGNvbnN0XG52YXIgY2FtbF9tZXRob2RfY2FjaGUgPSBbXTtcbmZ1bmN0aW9uIGNhbWxfZ2V0X3B1YmxpY19tZXRob2QgKG9iaiwgdGFnLCBjYWNoZWlkKSB7XG4gIHZhciBtZXRocyA9IG9ialsxXTtcbiAgdmFyIG9mcyA9IGNhbWxfbWV0aG9kX2NhY2hlW2NhY2hlaWRdO1xuICBpZiAob2ZzID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBNYWtlIHN1cmUgdGhlIGFycmF5IGlzIG5vdCBzcGFyc2VcbiAgICBmb3IgKHZhciBpID0gY2FtbF9tZXRob2RfY2FjaGUubGVuZ3RoOyBpIDwgY2FjaGVpZDsgaSsrKVxuICAgICAgY2FtbF9tZXRob2RfY2FjaGVbaV0gPSAwO1xuICB9IGVsc2UgaWYgKG1ldGhzW29mc10gPT09IHRhZykge1xuICAgIHJldHVybiBtZXRoc1tvZnMgLSAxXTtcbiAgfVxuICB2YXIgbGkgPSAzLCBoaSA9IG1ldGhzWzFdICogMiArIDEsIG1pO1xuICB3aGlsZSAobGkgPCBoaSkge1xuICAgIG1pID0gKChsaStoaSkgPj4gMSkgfCAxO1xuICAgIGlmICh0YWcgPCBtZXRoc1ttaSsxXSkgaGkgPSBtaS0yO1xuICAgIGVsc2UgbGkgPSBtaTtcbiAgfVxuICBjYW1sX21ldGhvZF9jYWNoZVtjYWNoZWlkXSA9IGxpICsgMTtcbiAgLyogcmV0dXJuIDAgaWYgdGFnIGlzIG5vdCB0aGVyZSAqL1xuICByZXR1cm4gKHRhZyA9PSBtZXRoc1tsaSsxXSA/IG1ldGhzW2xpXSA6IDApO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX29vX2xhc3RfaWRcbnZhciBjYW1sX29vX2xhc3RfaWQgPSAwO1xuXG4vL1Byb3ZpZGVzOiBjYW1sX3NldF9vb19pZFxuLy9SZXF1aXJlczogY2FtbF9vb19sYXN0X2lkXG5mdW5jdGlvbiBjYW1sX3NldF9vb19pZCAoYikge1xuICBiWzJdPWNhbWxfb29fbGFzdF9pZCsrO1xuICByZXR1cm4gYjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9mcmVzaF9vb19pZCBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9vb19sYXN0X2lkXG5mdW5jdGlvbiBjYW1sX2ZyZXNoX29vX2lkKCkge1xuICByZXR1cm4gY2FtbF9vb19sYXN0X2lkKys7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3Jhd19maWVsZFxuZnVuY3Rpb24gY2FtbF9vYmpfcmF3X2ZpZWxkKG8saSkgeyByZXR1cm4gb1tpKzFdIH1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfc2V0X3Jhd19maWVsZFxuZnVuY3Rpb24gY2FtbF9vYmpfc2V0X3Jhd19maWVsZChvLGksdikgeyByZXR1cm4gb1tpKzFdID0gdiB9XG5cbi8vUHJvdmlkZXM6IGNhbWxfb2JqX3JlYWNoYWJsZV93b3Jkc1xuZnVuY3Rpb24gY2FtbF9vYmpfcmVhY2hhYmxlX3dvcmRzKG8pIHsgcmV0dXJuIDA7IH1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfYWRkX29mZnNldFxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aFxuZnVuY3Rpb24gY2FtbF9vYmpfYWRkX29mZnNldCh2LG9mZnNldCkge1xuICBjYW1sX2ZhaWx3aXRoKFwiT2JqLmFkZF9vZmZzZXQgaXMgbm90IHN1cHBvcnRlZFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9vYmpfdXBkYXRlX3RhZ1xuZnVuY3Rpb24gY2FtbF9vYmpfdXBkYXRlX3RhZyhiLG8sbikge1xuICAgIGlmKGJbMF09PW8pIHsgYlswXSA9IG47IHJldHVybiAxIH1cbiAgICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmdcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3RhZywgY2FtbF9vYmpfdXBkYXRlX3RhZywgY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXG5mdW5jdGlvbiBjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmcobykge1xuICB2YXIgdCA9IGNhbWxfb2JqX3RhZyhvKTtcbiAgaWYodCAhPSAyNDYgJiYgdCAhPSAyNTAgJiYgdCAhPSAyNDQpXG4gICAgcmV0dXJuIDRcbiAgaWYoY2FtbF9vYmpfdXBkYXRlX3RhZyhvLCAyNDYsIDI0NCkpIHtcbiAgICByZXR1cm4gMFxuICB9IGVsc2Uge1xuICAgIHZhciBmaWVsZDAgPSBvWzFdO1xuICAgIHQgPSBvWzBdXG4gICAgaWYodCA9PSAyNDQpIHtcbiAgICAgIGlmKGZpZWxkMCA9PSBjYW1sX21sX2RvbWFpbl91bmlxdWVfdG9rZW4oMCkpXG4gICAgICAgIHJldHVybiAxXG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiAyXG4gICAgfSBlbHNlIGlmICh0ID09IDI1MCkge1xuICAgICAgcmV0dXJuIDM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGFzc2VydCB0ID0gbGF6eV90YWdcbiAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcndhcmRcbi8vUmVxdWlyZXM6IGNhbWxfb2JqX3VwZGF0ZV90YWdcbiAgZnVuY3Rpb24gY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkKG8pIHtcbiAgY2FtbF9vYmpfdXBkYXRlX3RhZyhvLDI0NCwyNTApO1xuICByZXR1cm4gMDsgLy8gdW5pdFxufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV9yZXNldF90b19sYXp5XG4vL1JlcXVpcmVzOiBjYW1sX29ial91cGRhdGVfdGFnXG5mdW5jdGlvbiBjYW1sX2xhenlfcmVzZXRfdG9fbGF6eShvKSB7XG4gIGNhbWxfb2JqX3VwZGF0ZV90YWcobywyNDQsMjQ2KTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfbGF6eV9yZWFkX3Jlc3VsdFxuLy9SZXF1aXJlczogY2FtbF9vYmpfdGFnXG5mdW5jdGlvbiBjYW1sX2xhenlfcmVhZF9yZXN1bHQobykge1xuICByZXR1cm4gKGNhbWxfb2JqX3RhZyhvKSA9PSAyNTApP29bMV06bztcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWdcbi8vVmVyc2lvbjogPCA1XG5mdW5jdGlvbiBjYW1sX2lzX2NvbnRpbnVhdGlvbl90YWcodCkge1xuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9pc19jb250aW51YXRpb25fdGFnXG4vL1ZlcnNpb246ID49IDVcbmZ1bmN0aW9uIGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh0KSB7XG4gIHJldHVybiAodCA9PSAyNDUpID8gMSA6IDA7XG59XG4iLCIvL1Byb3ZpZGVzOiBjYW1sX2RvbWFpbl9kbHNcbnZhciBjYW1sX2RvbWFpbl9kbHMgPSBbMF07XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19zZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuZnVuY3Rpb24gY2FtbF9kb21haW5fZGxzX3NldChhKSB7XG4gIGNhbWxfZG9tYWluX2RscyA9IGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZG9tYWluX2Rsc19nZXRcbi8vUmVxdWlyZXM6IGNhbWxfZG9tYWluX2Rsc1xuZnVuY3Rpb24gY2FtbF9kb21haW5fZGxzX2dldCh1bml0KSB7XG4gIHJldHVybiBjYW1sX2RvbWFpbl9kbHM7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfbG9hZFxuZnVuY3Rpb24gY2FtbF9hdG9taWNfbG9hZChyZWYpe1xuICByZXR1cm4gcmVmWzFdO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19jYXNcbmZ1bmN0aW9uIGNhbWxfYXRvbWljX2NhcyhyZWYsbyxuKSB7XG4gIGlmKHJlZlsxXSA9PT0gbyl7XG4gICAgcmVmWzFdID0gbjtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hdG9taWNfZmV0Y2hfYWRkXG5mdW5jdGlvbiBjYW1sX2F0b21pY19mZXRjaF9hZGQocmVmLCBpKSB7XG4gIHZhciBvbGQgPSByZWZbMV07XG4gIHJlZlsxXSArPSBpO1xuICByZXR1cm4gb2xkO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2F0b21pY19leGNoYW5nZVxuZnVuY3Rpb24gY2FtbF9hdG9taWNfZXhjaGFuZ2UocmVmLCB2KSB7XG4gIHZhciByID0gcmVmWzFdO1xuICByZWZbMV0gPSB2O1xuICByZXR1cm4gcjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXG52YXIgY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuXyA9IFswXVxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fdW5pcXVlX3Rva2VuKHVuaXQpIHtcbiAgcmV0dXJuIGNhbWxfbWxfZG9tYWluX3VuaXF1ZV90b2tlbl9cbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9zZXRfbmFtZVxuZnVuY3Rpb24gY2FtbF9tbF9kb21haW5fc2V0X25hbWUoX25hbWUpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfcmVjb21tZW5kZWRfZG9tYWluX2NvdW50XG5mdW5jdGlvbiBjYW1sX3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudCh1bml0KSB7IHJldHVybiAxIH1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX2RvbWFpbl9pZFxudmFyIGNhbWxfZG9tYWluX2lkID0gMDtcblxuLy9Qcm92aWRlczogY2FtbF9kb21haW5fc3Bhd25cbi8vUmVxdWlyZXM6IGNhbWxfbWxfbXV0ZXhfdW5sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9jYWxsYmFja1xudmFyIGNhbWxfZG9tYWluX2xhdGVzdF9pZHggPSAxXG5mdW5jdGlvbiBjYW1sX2RvbWFpbl9zcGF3bihmLG11dGV4KXtcbiAgICB2YXIgaWQgPSBjYW1sX2RvbWFpbl9sYXRlc3RfaWR4Kys7XG4gICAgdmFyIG9sZCA9IGNhbWxfZG9tYWluX2lkO1xuICAgIGNhbWxfZG9tYWluX2lkID0gaWQ7XG4gICAgY2FtbF9jYWxsYmFjayhmLFswXSk7XG4gICAgY2FtbF9kb21haW5faWQgPSBvbGQ7XG4gICAgY2FtbF9tbF9tdXRleF91bmxvY2sobXV0ZXgpO1xuICAgIHJldHVybiBpZDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9pZFxuLy9SZXF1aXJlczogY2FtbF9kb21haW5faWRcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX2lkKHVuaXQpe1xuICAgIHJldHVybiBjYW1sX2RvbWFpbl9pZDtcbn1cblxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX2RvbWFpbl9jcHVfcmVsYXhcbmZ1bmN0aW9uIGNhbWxfbWxfZG9tYWluX2NwdV9yZWxheCh1bml0KXtcbiAgICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4vLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuLy8gZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2Zcbi8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbi8vIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuLy9cbi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbi8vIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfdGFnXG4vL1JlcXVpcmVzOiBjYW1sX2lzX21sX3N0cmluZywgY2FtbF9pc19tbF9ieXRlc1xuZnVuY3Rpb24gY2FtbF9jb21wYXJlX3ZhbF90YWcoYSl7XG4gIGlmICh0eXBlb2YgYSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIDEwMDA7IC8vIGludF90YWcgKHdlIHVzZSBpdCBmb3IgYWxsIG51bWJlcnMpXG4gIGVsc2UgaWYgKGNhbWxfaXNfbWxfYnl0ZXMoYSkpIHJldHVybiAyNTI7IC8vIHN0cmluZ190YWdcbiAgZWxzZSBpZiAoY2FtbF9pc19tbF9zdHJpbmcoYSkpIHJldHVybiAxMjUyOyAvLyBvY2FtbCBzdHJpbmcgKGlmIGRpZmZlcmVudCBmcm9tIGJ5dGVzKVxuICBlbHNlIGlmIChhIGluc3RhbmNlb2YgQXJyYXkgJiYgYVswXSA9PT0gKGFbMF0+Pj4wKSAmJiBhWzBdIDw9IDI1NSkge1xuICAgIC8vIExvb2sgbGlrZSBhbiBvY2FtbCBibG9ja1xuICAgIHZhciB0YWcgPSBhWzBdIHwgMDtcbiAgICAvLyBpZ25vcmUgZG91YmxlX2FycmF5X3RhZyBiZWNhdXNlIHdlIGNhbm5vdCBhY2N1cmF0ZWx5IHNldFxuICAgIC8vIHRoaXMgdGFnIHdoZW4gd2UgY3JlYXRlIGFuIGFycmF5IG9mIGZsb2F0LlxuICAgIHJldHVybiAodGFnID09IDI1NCk/MDp0YWdcbiAgfVxuICBlbHNlIGlmIChhIGluc3RhbmNlb2YgU3RyaW5nKSByZXR1cm4gMTI1MjA7IC8vIGphdmFzY3JpcHQgc3RyaW5nLCBsaWtlIHN0cmluZ190YWcgKDI1MilcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT0gXCJzdHJpbmdcIikgcmV0dXJuIDEyNTIwOyAvLyBqYXZhc2NyaXB0IHN0cmluZywgbGlrZSBzdHJpbmdfdGFnICgyNTIpXG4gIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBOdW1iZXIpIHJldHVybiAxMDAwOyAvLyBpbnRfdGFnICh3ZSB1c2UgaXQgZm9yIGFsbCBudW1iZXJzKVxuICBlbHNlIGlmIChhICYmIGEuY2FtbF9jdXN0b20pIHJldHVybiAxMjU1OyAvLyBsaWtlIGN1c3RvbV90YWcgKDI1NSlcbiAgZWxzZSBpZiAoYSAmJiBhLmNvbXBhcmUpIHJldHVybiAxMjU2OyAvLyBsaWtlIGN1c3RvbV90YWcgKDI1NSlcbiAgZWxzZSBpZiAodHlwZW9mIGEgPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gMTI0NzsgLy8gbGlrZSBjbG9zdXJlX3RhZyAoMjQ3KVxuICBlbHNlIGlmICh0eXBlb2YgYSA9PSBcInN5bWJvbFwiKSByZXR1cm4gMTI1MTtcbiAgcmV0dXJuIDEwMDE7IC8vb3V0X29mX2hlYXBfdGFnXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbVxuLy9SZXF1aXJlczogY2FtbF9jdXN0b21fb3BzXG5mdW5jdGlvbiBjYW1sX2NvbXBhcmVfdmFsX2dldF9jdXN0b20oYSl7XG4gIHJldHVybiBjYW1sX2N1c3RvbV9vcHNbYS5jYW1sX2N1c3RvbV0gJiYgY2FtbF9jdXN0b21fb3BzW2EuY2FtbF9jdXN0b21dLmNvbXBhcmU7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tXG5mdW5jdGlvbiBjYW1sX2NvbXBhcmVfdmFsX251bWJlcl9jdXN0b20obnVtLCBjdXN0b20sIHN3YXAsIHRvdGFsKSB7XG4gIHZhciBjb21wID0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGN1c3RvbSk7XG4gIGlmKGNvbXApIHtcbiAgICB2YXIgeCA9IChzd2FwID4gMCk/Y29tcChjdXN0b20sbnVtLHRvdGFsKTpjb21wKG51bSxjdXN0b20sdG90YWwpO1xuICAgIGlmKHRvdGFsICYmIHggIT0geCkgcmV0dXJuIHN3YXA7IC8vIHRvdGFsICYmIG5hblxuICAgIGlmKCt4ICE9ICt4KSByZXR1cm4gK3g7IC8vIG5hblxuICAgIGlmKCh4IHwgMCkgIT0gMCkgcmV0dXJuICh4IHwgMCk7IC8vICFuYW5cbiAgfVxuICByZXR1cm4gc3dhcFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2NvbXBhcmVfdmFsIChjb25zdCwgY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9pbnRfY29tcGFyZSwgY2FtbF9zdHJpbmdfY29tcGFyZSwgY2FtbF9ieXRlc19jb21wYXJlXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbSwgY2FtbF9jb21wYXJlX3ZhbF90YWdcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxfbnVtYmVyX2N1c3RvbVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuLy9SZXF1aXJlczogY2FtbF9pc19jb250aW51YXRpb25fdGFnXG5mdW5jdGlvbiBjYW1sX2NvbXBhcmVfdmFsIChhLCBiLCB0b3RhbCkge1xuICB2YXIgc3RhY2sgPSBbXTtcbiAgZm9yKDs7KSB7XG4gICAgaWYgKCEodG90YWwgJiYgYSA9PT0gYikpIHtcbiAgICAgIHZhciB0YWdfYSA9IGNhbWxfY29tcGFyZV92YWxfdGFnKGEpO1xuICAgICAgLy8gZm9yd2FyZF90YWcgP1xuICAgICAgaWYodGFnX2EgPT0gMjUwKSB7IGEgPSBhWzFdOyBjb250aW51ZSB9XG5cbiAgICAgIHZhciB0YWdfYiA9IGNhbWxfY29tcGFyZV92YWxfdGFnKGIpO1xuICAgICAgLy8gZm9yd2FyZF90YWcgP1xuICAgICAgaWYodGFnX2IgPT0gMjUwKSB7IGIgPSBiWzFdOyBjb250aW51ZSB9XG5cbiAgICAgIC8vIHRhZ3MgYXJlIGRpZmZlcmVudFxuICAgICAgaWYodGFnX2EgIT09IHRhZ19iKSB7XG4gICAgICAgIGlmKHRhZ19hID09IDEwMDApIHtcbiAgICAgICAgICBpZih0YWdfYiA9PSAxMjU1KSB7IC8vaW1tZWRpYXRlIGNhbiBjb21wYXJlIGFnYWluc3QgY3VzdG9tXG4gICAgICAgICAgICByZXR1cm4gY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tKGEsIGIsIC0xLCB0b3RhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICB9XG4gICAgICAgIGlmKHRhZ19iID09IDEwMDApIHtcbiAgICAgICAgICBpZih0YWdfYSA9PSAxMjU1KSB7IC8vaW1tZWRpYXRlIGNhbiBjb21wYXJlIGFnYWluc3QgY3VzdG9tXG4gICAgICAgICAgICByZXR1cm4gY2FtbF9jb21wYXJlX3ZhbF9udW1iZXJfY3VzdG9tKGIsIGEsIDEsIHRvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKHRhZ19hIDwgdGFnX2IpPy0xOjE7XG4gICAgICB9XG4gICAgICBzd2l0Y2godGFnX2Epe1xuICAgICAgICAvLyAyNDY6IExhenlfdGFnIGhhbmRsZWQgYmVsbG93XG4gICAgICBjYXNlIDI0NzogLy8gQ2xvc3VyZV90YWdcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlblxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAyNDg6IC8vIE9iamVjdFxuICAgICAgICB2YXIgeCA9IGNhbWxfaW50X2NvbXBhcmUoYVsyXSwgYlsyXSk7XG4gICAgICAgIGlmICh4ICE9IDApIHJldHVybiAoeCB8IDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjQ5OiAvLyBJbmZpeFxuICAgICAgICAvLyBDYW5ub3QgaGFwcGVuXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImNvbXBhcmU6IGZ1bmN0aW9uYWwgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIDI1MDogLy8gRm9yd2FyZCB0YWdcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlbiwgaGFuZGxlZCBhYm92ZVxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IEZvcndhcmRfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI1MTogLy9BYnN0cmFjdFxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogYWJzdHJhY3QgdmFsdWVcIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTI6IC8vIE9DYW1sIGJ5dGVzXG4gICAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgICAgdmFyIHggPSBjYW1sX2J5dGVzX2NvbXBhcmUoYSwgYik7XG4gICAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTM6IC8vIERvdWJsZV90YWdcbiAgICAgICAgLy8gQ2Fubm90IGhhcHBlblxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJlcXVhbDogZ290IERvdWJsZV90YWcsIHNob3VsZCBub3QgaGFwcGVuXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjU0OiAvLyBEb3VibGVfYXJyYXlfdGFnXG4gICAgICAgIC8vIENhbm5vdCBoYXBwZW4sIGhhbmRsZWQgYWJvdmVcbiAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiZXF1YWw6IGdvdCBEb3VibGVfYXJyYXlfdGFnLCBzaG91bGQgbm90IGhhcHBlblwiKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgMjU1OiAvLyBDdXN0b21fdGFnXG4gICAgICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudChcImVxdWFsOiBnb3QgQ3VzdG9tX3RhZywgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjQ3OiAvLyBGdW5jdGlvblxuICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBmdW5jdGlvbmFsIHZhbHVlXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1NTogLy8gQ3VzdG9tXG4gICAgICAgIHZhciBjb21wID0gY2FtbF9jb21wYXJlX3ZhbF9nZXRfY3VzdG9tKGEpO1xuICAgICAgICBpZihjb21wICE9IGNhbWxfY29tcGFyZV92YWxfZ2V0X2N1c3RvbShiKSl7XG4gICAgICAgICAgcmV0dXJuIChhLmNhbWxfY3VzdG9tPGIuY2FtbF9jdXN0b20pPy0xOjE7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIWNvbXApXG4gICAgICAgICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY29tcGFyZTogYWJzdHJhY3QgdmFsdWVcIik7XG4gICAgICAgIHZhciB4ID0gY29tcChhLGIsdG90YWwpO1xuICAgICAgICBpZih4ICE9IHgpeyAvLyBQcm90ZWN0IGFnYWluc3QgaW52YWxpZCBVTk9SREVSRURcbiAgICAgICAgICByZXR1cm4gdG90YWw/LTE6eDtcbiAgICAgICAgfVxuICAgICAgICBpZih4ICE9PSAoeHwwKSl7IC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIHJldHVybiB2YWx1ZVxuICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICB9XG4gICAgICAgIGlmICh4ICE9IDApIHJldHVybiAoeCB8IDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTI1NjogLy8gY29tcGFyZSBmdW5jdGlvblxuICAgICAgICB2YXIgeCA9IGEuY29tcGFyZShiLHRvdGFsKTtcbiAgICAgICAgaWYoeCAhPSB4KSB7IC8vIFByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIFVOT1JERVJFRFxuICAgICAgICAgIHJldHVybiB0b3RhbD8tMTp4O1xuICAgICAgICB9XG4gICAgICAgIGlmKHggIT09ICh4fDApKXsgLy8gUHJvdGVjdCBhZ2FpbnN0IGludmFsaWQgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgcmV0dXJuIC0xXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHggIT0gMCkgcmV0dXJuICh4IHwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMDAwOiAvLyBOdW1iZXJcbiAgICAgICAgYSA9ICthO1xuICAgICAgICBiID0gK2I7XG4gICAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICAgICAgICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICAgICAgICBpZiAoYSAhPSBiKSB7XG4gICAgICAgICAgaWYgKCF0b3RhbCkgcmV0dXJuIE5hTjtcbiAgICAgICAgICBpZiAoYSA9PSBhKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYiA9PSBiKSByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEwMDE6IC8vIFRoZSByZXN0XG4gICAgICAgIC8vIEhlcmUgd2UgY2FuIGJlIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAgICAgIC8vIDEuIEphdmFTY3JpcHQgcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgIC8vIDIuIEphdmFTY3JpcHQgb2JqZWN0IHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgIC8vIDMuIEphdmFTY3JpcHQgb2JqZWN0IHRoYW4gY2Fubm90IGJlIGNvZXJjZWQgdG8gcHJpbWl0aXZlIHR5cGVzXG4gICAgICAgIC8vXG4gICAgICAgIC8vICgzKSB3aWxsIHJhaXNlIGEgW1R5cGVFcnJvcl1cbiAgICAgICAgLy8gKDIpIHdpbGwgY29lcmNlIHRvIHByaW1pdGl2ZSB0eXBlcyB1c2luZyBbdmFsdWVPZl0gb3IgW3RvU3RyaW5nXVxuICAgICAgICAvLyAoMikgYW5kICgzKSwgYWZ0ZXIgZXZlbnR1YWwgY29lcmNpb25cbiAgICAgICAgLy8gLSBpZiBhIGFuZCBiIGFyZSBzdHJpbmdzLCBhcHBseSBsZXhpY29ncmFwaGljIGNvbXBhcmlzb25cbiAgICAgICAgLy8gLSBpZiBhIG9yIGIgYXJlIG5vdCBzdHJpbmdzLCBjb252ZXJ0IGEgYW5kIGIgdG8gbnVtYmVyXG4gICAgICAgIC8vICAgYW5kIGFwcGx5IHN0YW5kYXJkIGNvbXBhcmlzb25cbiAgICAgICAgLy9cbiAgICAgICAgLy8gRXhjZXB0aW9uOiBgIT1gIHdpbGwgbm90IGNvZXJjZS9jb252ZXJ0IGlmIGJvdGggYSBhbmQgYiBhcmUgb2JqZWN0c1xuICAgICAgICBpZiAoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKGEgIT0gYikge1xuICAgICAgICAgIGlmICghdG90YWwpIHJldHVybiBOYU47XG4gICAgICAgICAgaWYgKGEgPT0gYSkgcmV0dXJuIDE7XG4gICAgICAgICAgaWYgKGIgPT0gYikgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjUxOiAvLyBKYXZhU2NyaXB0IFN5bWJvbCwgbm8gb3JkZXJpbmcuXG4gICAgICAgIGlmKGEgIT09IGIpIHtcbiAgICAgICAgICBpZiAoIXRvdGFsKSByZXR1cm4gTmFOO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjUyOiAvLyBvY2FtbCBzdHJpbmdzXG4gICAgICAgIHZhciBhID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhhKTtcbiAgICAgICAgdmFyIGIgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGIpO1xuICAgICAgICBpZihhICE9PSBiKSB7XG4gICAgICAgICAgaWYoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZihhID4gYikgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDEyNTIwOiAvLyBqYXZhc2NyaXB0IHN0cmluZ3NcbiAgICAgICAgdmFyIGEgPSBhLnRvU3RyaW5nKCk7XG4gICAgICAgIHZhciBiID0gYi50b1N0cmluZygpO1xuICAgICAgICBpZihhICE9PSBiKSB7XG4gICAgICAgICAgaWYoYSA8IGIpIHJldHVybiAtMTtcbiAgICAgICAgICBpZihhID4gYikgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI0NjogLy8gTGF6eV90YWdcbiAgICAgIGNhc2UgMjU0OiAvLyBEb3VibGVfYXJyYXlcbiAgICAgIGRlZmF1bHQ6IC8vIEJsb2NrIHdpdGggb3RoZXIgdGFnXG4gICAgICAgIGlmKGNhbWxfaXNfY29udGludWF0aW9uX3RhZyh0YWdfYSkpIHtcbiAgICAgICAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjb21wYXJlOiBjb250aW51YXRpb24gdmFsdWVcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gKGEubGVuZ3RoIDwgYi5sZW5ndGgpPy0xOjE7XG4gICAgICAgIGlmIChhLmxlbmd0aCA+IDEpIHN0YWNrLnB1c2goYSwgYiwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhY2subGVuZ3RoID09IDApIHJldHVybiAwO1xuICAgIHZhciBpID0gc3RhY2sucG9wKCk7XG4gICAgYiA9IHN0YWNrLnBvcCgpO1xuICAgIGEgPSBzdGFjay5wb3AoKTtcbiAgICBpZiAoaSArIDEgPCBhLmxlbmd0aCkgc3RhY2sucHVzaChhLCBiLCBpICsgMSk7XG4gICAgYSA9IGFbaV07XG4gICAgYiA9IGJbaV07XG4gIH1cbn1cbi8vUHJvdmlkZXM6IGNhbWxfY29tcGFyZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9jb21wYXJlIChhLCBiKSB7IHJldHVybiBjYW1sX2NvbXBhcmVfdmFsIChhLCBiLCB0cnVlKTsgfVxuLy9Qcm92aWRlczogY2FtbF9pbnRfY29tcGFyZSBtdXRhYmxlIChjb25zdCwgY29uc3QpXG5mdW5jdGlvbiBjYW1sX2ludF9jb21wYXJlIChhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuICgtMSk7IGlmIChhID09IGIpIHJldHVybiAwOyByZXR1cm4gMTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9lcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPT0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbm90ZXF1YWwgbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9ub3RlcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgIT0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfZ3JlYXRlcmVxdWFsIG11dGFibGUgKGNvbnN0LCBjb25zdClcbi8vUmVxdWlyZXM6IGNhbWxfY29tcGFyZV92YWxcbmZ1bmN0aW9uIGNhbWxfZ3JlYXRlcmVxdWFsICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA+PSAwKTsgfVxuLy9Qcm92aWRlczogY2FtbF9ncmVhdGVydGhhbiBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2dyZWF0ZXJ0aGFuICh4LCB5KSB7IHJldHVybiArKGNhbWxfY29tcGFyZV92YWwoeCx5LGZhbHNlKSA+IDApOyB9XG4vL1Byb3ZpZGVzOiBjYW1sX2xlc3NlcXVhbCBtdXRhYmxlIChjb25zdCwgY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2NvbXBhcmVfdmFsXG5mdW5jdGlvbiBjYW1sX2xlc3NlcXVhbCAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPD0gMCk7IH1cbi8vUHJvdmlkZXM6IGNhbWxfbGVzc3RoYW4gbXV0YWJsZSAoY29uc3QsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9jb21wYXJlX3ZhbFxuZnVuY3Rpb24gY2FtbF9sZXNzdGhhbiAoeCwgeSkgeyByZXR1cm4gKyhjYW1sX2NvbXBhcmVfdmFsKHgseSxmYWxzZSkgPCAwKTsgfVxuIiwiLy8gSnNfb2Zfb2NhbWwgbGlicmFyeVxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEpzbGliOiBjb2RlIHNwZWNpZmljIHRvIEpzX29mX29jYW1sXG5cbi8vUHJvdmlkZXM6IGNhbWxfanNfb25faWUgY29uc3RcbmZ1bmN0aW9uIGNhbWxfanNfb25faWUgKCkge1xuICB2YXIgdWEgPVxuICAgICAgZ2xvYmFsVGhpcy5uYXZpZ2F0b3I/Z2xvYmFsVGhpcy5uYXZpZ2F0b3IudXNlckFnZW50OlwiXCI7XG4gIHJldHVybiB1YS5pbmRleE9mKFwiTVNJRVwiKSAhPSAtMSAmJiB1YS5pbmRleE9mKFwiT3BlcmFcIikgIT0gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19odG1sX2VzY2FwZSBjb25zdCAoY29uc3QpXG52YXIgY2FtbF9qc19yZWdleHBzID0geyBhbXA6LyYvZywgbHQ6LzwvZywgcXVvdDovXFxcIi9nLCBhbGw6L1smPFxcXCJdLyB9O1xuZnVuY3Rpb24gY2FtbF9qc19odG1sX2VzY2FwZSAocykge1xuICBpZiAoIWNhbWxfanNfcmVnZXhwcy5hbGwudGVzdChzKSkgcmV0dXJuIHM7XG4gIHJldHVybiBzLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLmFtcCwgXCImYW1wO1wiKVxuICAgIC5yZXBsYWNlKGNhbWxfanNfcmVnZXhwcy5sdCwgXCImbHQ7XCIpXG4gICAgLnJlcGxhY2UoY2FtbF9qc19yZWdleHBzLnF1b3QsIFwiJnF1b3Q7XCIpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2h0bWxfZW50aXRpZXNcbi8vUmVxdWlyZXM6IGNhbWxfZmFpbHdpdGhcbmZ1bmN0aW9uIGNhbWxfanNfaHRtbF9lbnRpdGllcyhzKSB7XG4gIHZhciBlbnRpdHkgPSAvXiYjP1swLTlhLXpBLVpdKzskL1xuICBpZihzLm1hdGNoKGVudGl0eSkpXG4gIHtcbiAgICB2YXIgc3RyLCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIHRlbXAuaW5uZXJIVE1MPSBzO1xuICAgIHN0cj0gdGVtcC50ZXh0Q29udGVudCB8fCB0ZW1wLmlubmVyVGV4dDtcbiAgICB0ZW1wPW51bGw7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICBlbHNlIHtcbiAgICBjYW1sX2ZhaWx3aXRoKFwiSW52YWxpZCBlbnRpdHkgXCIgKyBzKTtcbiAgfVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2pzX2dldF9jb25zb2xlIGNvbnN0XG5mdW5jdGlvbiBjYW1sX2pzX2dldF9jb25zb2xlICgpIHtcbiAgdmFyIGMgPSBjb25zb2xlO1xuICB2YXIgbSA9IFtcImxvZ1wiLCBcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiLCBcImFzc2VydFwiLCBcImRpclwiLCBcImRpcnhtbFwiLFxuICAgICAgICAgICBcInRyYWNlXCIsIFwiZ3JvdXBcIiwgXCJncm91cENvbGxhcHNlZFwiLCBcImdyb3VwRW5kXCIsIFwidGltZVwiLCBcInRpbWVFbmRcIl07XG4gIGZ1bmN0aW9uIGYgKCkge31cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtLmxlbmd0aDsgaSsrKSBpZiAoIWNbbVtpXV0pIGNbbVtpXV09ZjtcbiAgcmV0dXJuIGM7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vL1dlYWtkZWZcbmZ1bmN0aW9uIGNhbWxfeG1saHR0cHJlcXVlc3RfY3JlYXRlKHVuaXQpe1xuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5YTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0cnkgeyByZXR1cm4gbmV3IGdsb2JhbFRoaXMuWE1MSHR0cFJlcXVlc3QgfSBjYXRjaCAoZSkgeyB9O1xuICB9XG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmFjdGl2ZVhPYmplY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdHJ5IHsgcmV0dXJuIG5ldyBnbG9iYWxUaGlzLmFjdGl2ZVhPYmplY3QoXCJNc3htbDIuWE1MSFRUUFwiKSB9IGNhdGNoKGUpeyB9O1xuICAgIHRyeSB7IHJldHVybiBuZXcgZ2xvYmFsVGhpcy5hY3RpdmVYT2JqZWN0KFwiTXN4bWwzLlhNTEhUVFBcIikgfSBjYXRjaChlKXsgfTtcbiAgICB0cnkgeyByZXR1cm4gbmV3IGdsb2JhbFRoaXMuYWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpIH0gY2F0Y2goZSl7IH07XG4gIH1cbiAgY2FtbF9mYWlsd2l0aChcIkNhbm5vdCBjcmVhdGUgYSBYTUxIdHRwUmVxdWVzdFwiKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb25cbmZ1bmN0aW9uIGNhbWxfanNfZXJyb3Jfb2ZfZXhjZXB0aW9uKGV4bikge1xuICBpZihleG4uanNfZXJyb3IpIHsgcmV0dXJuIGV4bi5qc19lcnJvcjsgfVxuICByZXR1cm4gbnVsbDtcbn1cbiIsIi8vLy8vLy8vLyBCSUdTVFJJTkdcblxuLy9Qcm92aWRlczogY2FtbF9oYXNoX21peF9iaWdzdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaF9taXhfYnl0ZXNfYXJyXG5mdW5jdGlvbiBjYW1sX2hhc2hfbWl4X2JpZ3N0cmluZyhoLCBicykge1xuICByZXR1cm4gY2FtbF9oYXNoX21peF9ieXRlc19hcnIoaCxicy5kYXRhKTtcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlciBtdXRhYmxlXG5mdW5jdGlvbiBiaWdzdHJpbmdfdG9fYXJyYXlfYnVmZmVyKGJzKSB7XG4gIHJldHVybiBicy5kYXRhLmJ1ZmZlclxufVxuXG4vL1Byb3ZpZGVzOiBiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXkgbXV0YWJsZVxuZnVuY3Rpb24gYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5KGJzKSB7XG4gIHJldHVybiBicy5kYXRhXG59XG5cbi8vUHJvdmlkZXM6IGJpZ3N0cmluZ19vZl9hcnJheV9idWZmZXIgbXV0YWJsZVxuLy9SZXF1aXJlczogY2FtbF9iYV9jcmVhdGVfdW5zYWZlXG5mdW5jdGlvbiBiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyKGFiKSB7XG4gIHZhciB0YSA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgcmV0dXJuIGNhbWxfYmFfY3JlYXRlX3Vuc2FmZSgxMiwgMCwgW3RhLmxlbmd0aF0sIHRhKTtcbn1cblxuLy9Qcm92aWRlczogYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5IG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfYmFfY3JlYXRlX3Vuc2FmZVxuZnVuY3Rpb24gYmlnc3RyaW5nX29mX3R5cGVkX2FycmF5KGJhKSB7XG4gIHZhciB0YSA9IG5ldyBVaW50OEFycmF5KGJhLmJ1ZmZlciwgYmEuYnl0ZU9mZnNldCwgYmEubGVuZ3RoICogYmEuQllURVNfUEVSX0VMRU1FTlQpO1xuICByZXR1cm4gY2FtbF9iYV9jcmVhdGVfdW5zYWZlKDEyLCAwLCBbdGEubGVuZ3RoXSwgdGEpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19tZW1jbXBcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0XzFcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX21lbWNtcChzMSwgcG9zMSwgczIsIHBvczIsIGxlbil7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIgYSA9IGNhbWxfYmFfZ2V0XzEoczEscG9zMSArIGkpO1xuICAgIHZhciBiID0gY2FtbF9iYV9nZXRfMShzMixwb3MyICsgaSk7XG4gICAgaWYgKGEgPCBiKSByZXR1cm4gLTE7XG4gICAgaWYgKGEgPiBiKSByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19iYVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhKGJhMSwgcG9zMSwgYmEyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTEua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZigxMiAhPSBiYTIua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2JhOiBraW5kIG1pc21hdGNoXCIpO1xuICBpZihsZW4gPT0gMCkgcmV0dXJuIDA7XG4gIHZhciBvZnMxID0gYmExLm9mZnNldChwb3MxKTtcbiAgdmFyIG9mczIgPSBiYTIub2Zmc2V0KHBvczIpO1xuICBpZihvZnMxICsgbGVuID4gYmExLmRhdGEubGVuZ3RoKXtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYob2ZzMiArIGxlbiA+IGJhMi5kYXRhLmxlbmd0aCl7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGJhMS5kYXRhLnN1YmFycmF5KG9mczEsb2ZzMStsZW4pO1xuICBiYTIuZGF0YS5zZXQoc2xpY2UscG9zMik7XG4gIHJldHVybiAwXG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX21sX3N0cmluZ19sZW5ndGhcbmZ1bmN0aW9uIGNhbWxfYmlnc3RyaW5nX2JsaXRfc3RyaW5nX3RvX2JhKHN0cjEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKXtcbiAgaWYoMTIgIT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczIgPSBiYTIub2Zmc2V0KHBvczIpO1xuICBpZihwb3MxICsgbGVuID4gY2FtbF9tbF9zdHJpbmdfbGVuZ3RoKHN0cjEpKSB7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIGlmKG9mczIgKyBsZW4gPiBiYTIuZGF0YS5sZW5ndGgpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgdmFyIHNsaWNlID0gY2FtbF91aW50OF9hcnJheV9vZl9zdHJpbmcoc3RyMSkuc2xpY2UocG9zMSxwb3MxICsgbGVuKTtcbiAgYmEyLmRhdGEuc2V0KHNsaWNlLG9mczIpO1xuICByZXR1cm4gMFxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhXG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2J5dGVzX3RvX2JhKHN0cjEsIHBvczEsIGJhMiwgcG9zMiwgbGVuKXtcbiAgaWYoMTIgIT0gYmEyLmtpbmQpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiY2FtbF9iaWdzdHJpbmdfYmxpdF9zdHJpbmdfdG9fYmE6IGtpbmQgbWlzbWF0Y2hcIik7XG4gIGlmKGxlbiA9PSAwKSByZXR1cm4gMDtcbiAgdmFyIG9mczIgPSBiYTIub2Zmc2V0KHBvczIpO1xuICBpZihwb3MxICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoc3RyMSkpIHtcbiAgICBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIH1cbiAgaWYob2ZzMiArIGxlbiA+IGJhMi5kYXRhLmxlbmd0aCkge1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICB2YXIgc2xpY2UgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKHN0cjEpLnNsaWNlKHBvczEscG9zMSArIGxlbik7XG4gIGJhMi5kYXRhLnNldChzbGljZSxvZnMyKTtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9iaWdzdHJpbmdfYmxpdF9iYV90b19ieXRlc1xuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG4vL1JlcXVpcmVzOiBjYW1sX2JsaXRfYnl0ZXMsIGNhbWxfYnl0ZXNfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfbWxfYnl0ZXNfbGVuZ3RoXG5mdW5jdGlvbiBjYW1sX2JpZ3N0cmluZ19ibGl0X2JhX3RvX2J5dGVzKGJhMSwgcG9zMSwgYnl0ZXMyLCBwb3MyLCBsZW4pe1xuICBpZigxMiAhPSBiYTEua2luZClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJjYW1sX2JpZ3N0cmluZ19ibGl0X3N0cmluZ190b19iYToga2luZCBtaXNtYXRjaFwiKTtcbiAgaWYobGVuID09IDApIHJldHVybiAwO1xuICB2YXIgb2ZzMSA9IGJhMS5vZmZzZXQocG9zMSk7XG4gIGlmKG9mczEgKyBsZW4gPiBiYTEuZGF0YS5sZW5ndGgpe1xuICAgIGNhbWxfYXJyYXlfYm91bmRfZXJyb3IoKTtcbiAgfVxuICBpZihwb3MyICsgbGVuID4gY2FtbF9tbF9ieXRlc19sZW5ndGgoYnl0ZXMyKSl7XG4gICAgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB9XG4gIHZhciBzbGljZSA9IGJhMS5kYXRhLnNsaWNlKG9mczEsIG9mczErbGVuKTtcbiAgY2FtbF9ibGl0X2J5dGVzKGNhbWxfYnl0ZXNfb2ZfYXJyYXkoc2xpY2UpLCAwLCBieXRlczIsIHBvczIsIGxlbik7XG4gIHJldHVybiAwXG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vLyBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbi8vIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuLy9cbi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4vLyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbi8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4vLyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4vLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuLy8gR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4vL1xuLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4vLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfY2hhblxuLy9SZXF1aXJlczogY2FtbF9zdHJpbmdfb2ZfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfcmFpc2VfZW5kX29mX2ZpbGUsIGNhbWxfbWxfaW5wdXRfYmxvY2tcbi8vUmVxdWlyZXM6IGNhbWxfTUQ1SW5pdCwgY2FtbF9NRDVVcGRhdGUsIGNhbWxfTUQ1RmluYWxcbmZ1bmN0aW9uIGNhbWxfbWQ1X2NoYW4oY2hhbmlkLHRvcmVhZCl7XG4gIHZhciBjdHggPSBjYW1sX01ENUluaXQoKTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KDQwOTYpO1xuICBpZih0b3JlYWQgPCAwKXtcbiAgICB3aGlsZSh0cnVlKXtcbiAgICAgIHZhciByZWFkID0gY2FtbF9tbF9pbnB1dF9ibG9jayhjaGFuaWQsYnVmZmVyLDAsYnVmZmVyLmxlbmd0aCk7XG4gICAgICBpZihyZWFkID09IDApIGJyZWFrO1xuICAgICAgY2FtbF9NRDVVcGRhdGUoY3R4LGJ1ZmZlci5zdWJhcnJheSgwLCByZWFkKSwgcmVhZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHdoaWxlKHRvcmVhZCA+IDApIHtcbiAgICAgIHZhciByZWFkID0gY2FtbF9tbF9pbnB1dF9ibG9jayhjaGFuaWQsYnVmZmVyLDAsICh0b3JlYWQgPiBidWZmZXIubGVuZ3RoID8gYnVmZmVyLmxlbmd0aCA6IHRvcmVhZCkpO1xuICAgICAgaWYocmVhZCA9PSAwKSBjYW1sX3JhaXNlX2VuZF9vZl9maWxlKCk7XG4gICAgICBjYW1sX01ENVVwZGF0ZShjdHgsYnVmZmVyLnN1YmFycmF5KDAsIHJlYWQpLCByZWFkKTtcbiAgICAgIHRvcmVhZCAtPSByZWFkXG4gICAgfVxuICB9XG4gIHJldHVybiBjYW1sX3N0cmluZ19vZl9hcnJheShjYW1sX01ENUZpbmFsKGN0eCkpO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21kNV9zdHJpbmdcbi8vUmVxdWlyZXM6IGNhbWxfYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX21kNV9ieXRlc1xuZnVuY3Rpb24gY2FtbF9tZDVfc3RyaW5nKHMsIG9mcywgbGVuKSB7XG4gIHJldHVybiBjYW1sX21kNV9ieXRlcyhjYW1sX2J5dGVzX29mX3N0cmluZyhzKSxvZnMsbGVuKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9NRDVUcmFuc2Zvcm1cbnZhciBjYW1sX01ENVRyYW5zZm9ybSA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGFkZCAoeCwgeSkgeyByZXR1cm4gKHggKyB5KSB8IDA7IH1cbiAgZnVuY3Rpb24geHgocSxhLGIseCxzLHQpIHtcbiAgICBhID0gYWRkKGFkZChhLCBxKSwgYWRkKHgsIHQpKTtcbiAgICByZXR1cm4gYWRkKChhIDw8IHMpIHwgKGEgPj4+ICgzMiAtIHMpKSwgYik7XG4gIH1cbiAgZnVuY3Rpb24gZmYoYSxiLGMsZCx4LHMsdCkge1xuICAgIHJldHVybiB4eCgoYiAmIGMpIHwgKCh+YikgJiBkKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gZ2coYSxiLGMsZCx4LHMsdCkge1xuICAgIHJldHVybiB4eCgoYiAmIGQpIHwgKGMgJiAofmQpKSwgYSwgYiwgeCwgcywgdCk7XG4gIH1cbiAgZnVuY3Rpb24gaGgoYSxiLGMsZCx4LHMsdCkgeyByZXR1cm4geHgoYiBeIGMgXiBkLCBhLCBiLCB4LCBzLCB0KTsgfVxuICBmdW5jdGlvbiBpaShhLGIsYyxkLHgscyx0KSB7IHJldHVybiB4eChjIF4gKGIgfCAofmQpKSwgYSwgYiwgeCwgcywgdCk7IH1cblxuICByZXR1cm4gZnVuY3Rpb24gKHcsIGJ1ZmZlcikge1xuICAgIHZhciBhID0gd1swXSwgYiA9IHdbMV0sIGMgPSB3WzJdLCBkID0gd1szXTtcblxuICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbIDBdLCA3LCAweEQ3NkFBNDc4KTtcbiAgICBkID0gZmYoZCwgYSwgYiwgYywgYnVmZmVyWyAxXSwgMTIsIDB4RThDN0I3NTYpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbIDJdLCAxNywgMHgyNDIwNzBEQik7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsgM10sIDIyLCAweEMxQkRDRUVFKTtcbiAgICBhID0gZmYoYSwgYiwgYywgZCwgYnVmZmVyWyA0XSwgNywgMHhGNTdDMEZBRik7XG4gICAgZCA9IGZmKGQsIGEsIGIsIGMsIGJ1ZmZlclsgNV0sIDEyLCAweDQ3ODdDNjJBKTtcbiAgICBjID0gZmYoYywgZCwgYSwgYiwgYnVmZmVyWyA2XSwgMTcsIDB4QTgzMDQ2MTMpO1xuICAgIGIgPSBmZihiLCBjLCBkLCBhLCBidWZmZXJbIDddLCAyMiwgMHhGRDQ2OTUwMSk7XG4gICAgYSA9IGZmKGEsIGIsIGMsIGQsIGJ1ZmZlclsgOF0sIDcsIDB4Njk4MDk4RDgpO1xuICAgIGQgPSBmZihkLCBhLCBiLCBjLCBidWZmZXJbIDldLCAxMiwgMHg4QjQ0RjdBRik7XG4gICAgYyA9IGZmKGMsIGQsIGEsIGIsIGJ1ZmZlclsxMF0sIDE3LCAweEZGRkY1QkIxKTtcbiAgICBiID0gZmYoYiwgYywgZCwgYSwgYnVmZmVyWzExXSwgMjIsIDB4ODk1Q0Q3QkUpO1xuICAgIGEgPSBmZihhLCBiLCBjLCBkLCBidWZmZXJbMTJdLCA3LCAweDZCOTAxMTIyKTtcbiAgICBkID0gZmYoZCwgYSwgYiwgYywgYnVmZmVyWzEzXSwgMTIsIDB4RkQ5ODcxOTMpO1xuICAgIGMgPSBmZihjLCBkLCBhLCBiLCBidWZmZXJbMTRdLCAxNywgMHhBNjc5NDM4RSk7XG4gICAgYiA9IGZmKGIsIGMsIGQsIGEsIGJ1ZmZlclsxNV0sIDIyLCAweDQ5QjQwODIxKTtcblxuICAgIGEgPSBnZyhhLCBiLCBjLCBkLCBidWZmZXJbIDFdLCA1LCAweEY2MUUyNTYyKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWyA2XSwgOSwgMHhDMDQwQjM0MCk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsxMV0sIDE0LCAweDI2NUU1QTUxKTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWyAwXSwgMjAsIDB4RTlCNkM3QUEpO1xuICAgIGEgPSBnZyhhLCBiLCBjLCBkLCBidWZmZXJbIDVdLCA1LCAweEQ2MkYxMDVEKTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzEwXSwgOSwgMHgwMjQ0MTQ1Myk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE0LCAweEQ4QTFFNjgxKTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWyA0XSwgMjAsIDB4RTdEM0ZCQzgpO1xuICAgIGEgPSBnZyhhLCBiLCBjLCBkLCBidWZmZXJbIDldLCA1LCAweDIxRTFDREU2KTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWzE0XSwgOSwgMHhDMzM3MDdENik7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsgM10sIDE0LCAweEY0RDUwRDg3KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWyA4XSwgMjAsIDB4NDU1QTE0RUQpO1xuICAgIGEgPSBnZyhhLCBiLCBjLCBkLCBidWZmZXJbMTNdLCA1LCAweEE5RTNFOTA1KTtcbiAgICBkID0gZ2coZCwgYSwgYiwgYywgYnVmZmVyWyAyXSwgOSwgMHhGQ0VGQTNGOCk7XG4gICAgYyA9IGdnKGMsIGQsIGEsIGIsIGJ1ZmZlclsgN10sIDE0LCAweDY3NkYwMkQ5KTtcbiAgICBiID0gZ2coYiwgYywgZCwgYSwgYnVmZmVyWzEyXSwgMjAsIDB4OEQyQTRDOEEpO1xuXG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsgNV0sIDQsIDB4RkZGQTM5NDIpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbIDhdLCAxMSwgMHg4NzcxRjY4MSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsxMV0sIDE2LCAweDZEOUQ2MTIyKTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWzE0XSwgMjMsIDB4RkRFNTM4MEMpO1xuICAgIGEgPSBoaChhLCBiLCBjLCBkLCBidWZmZXJbIDFdLCA0LCAweEE0QkVFQTQ0KTtcbiAgICBkID0gaGgoZCwgYSwgYiwgYywgYnVmZmVyWyA0XSwgMTEsIDB4NEJERUNGQTkpO1xuICAgIGMgPSBoaChjLCBkLCBhLCBiLCBidWZmZXJbIDddLCAxNiwgMHhGNkJCNEI2MCk7XG4gICAgYiA9IGhoKGIsIGMsIGQsIGEsIGJ1ZmZlclsxMF0sIDIzLCAweEJFQkZCQzcwKTtcbiAgICBhID0gaGgoYSwgYiwgYywgZCwgYnVmZmVyWzEzXSwgNCwgMHgyODlCN0VDNik7XG4gICAgZCA9IGhoKGQsIGEsIGIsIGMsIGJ1ZmZlclsgMF0sIDExLCAweEVBQTEyN0ZBKTtcbiAgICBjID0gaGgoYywgZCwgYSwgYiwgYnVmZmVyWyAzXSwgMTYsIDB4RDRFRjMwODUpO1xuICAgIGIgPSBoaChiLCBjLCBkLCBhLCBidWZmZXJbIDZdLCAyMywgMHgwNDg4MUQwNSk7XG4gICAgYSA9IGhoKGEsIGIsIGMsIGQsIGJ1ZmZlclsgOV0sIDQsIDB4RDlENEQwMzkpO1xuICAgIGQgPSBoaChkLCBhLCBiLCBjLCBidWZmZXJbMTJdLCAxMSwgMHhFNkRCOTlFNSk7XG4gICAgYyA9IGhoKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNV0sIDE2LCAweDFGQTI3Q0Y4KTtcbiAgICBiID0gaGgoYiwgYywgZCwgYSwgYnVmZmVyWyAyXSwgMjMsIDB4QzRBQzU2NjUpO1xuXG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsgMF0sIDYsIDB4RjQyOTIyNDQpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbIDddLCAxMCwgMHg0MzJBRkY5Nyk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsxNF0sIDE1LCAweEFCOTQyM0E3KTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWyA1XSwgMjEsIDB4RkM5M0EwMzkpO1xuICAgIGEgPSBpaShhLCBiLCBjLCBkLCBidWZmZXJbMTJdLCA2LCAweDY1NUI1OUMzKTtcbiAgICBkID0gaWkoZCwgYSwgYiwgYywgYnVmZmVyWyAzXSwgMTAsIDB4OEYwQ0NDOTIpO1xuICAgIGMgPSBpaShjLCBkLCBhLCBiLCBidWZmZXJbMTBdLCAxNSwgMHhGRkVGRjQ3RCk7XG4gICAgYiA9IGlpKGIsIGMsIGQsIGEsIGJ1ZmZlclsgMV0sIDIxLCAweDg1ODQ1REQxKTtcbiAgICBhID0gaWkoYSwgYiwgYywgZCwgYnVmZmVyWyA4XSwgNiwgMHg2RkE4N0U0Rik7XG4gICAgZCA9IGlpKGQsIGEsIGIsIGMsIGJ1ZmZlclsxNV0sIDEwLCAweEZFMkNFNkUwKTtcbiAgICBjID0gaWkoYywgZCwgYSwgYiwgYnVmZmVyWyA2XSwgMTUsIDB4QTMwMTQzMTQpO1xuICAgIGIgPSBpaShiLCBjLCBkLCBhLCBidWZmZXJbMTNdLCAyMSwgMHg0RTA4MTFBMSk7XG4gICAgYSA9IGlpKGEsIGIsIGMsIGQsIGJ1ZmZlclsgNF0sIDYsIDB4Rjc1MzdFODIpO1xuICAgIGQgPSBpaShkLCBhLCBiLCBjLCBidWZmZXJbMTFdLCAxMCwgMHhCRDNBRjIzNSk7XG4gICAgYyA9IGlpKGMsIGQsIGEsIGIsIGJ1ZmZlclsgMl0sIDE1LCAweDJBRDdEMkJCKTtcbiAgICBiID0gaWkoYiwgYywgZCwgYSwgYnVmZmVyWyA5XSwgMjEsIDB4RUI4NkQzOTEpO1xuXG4gICAgd1swXSA9IGFkZChhLCB3WzBdKTtcbiAgICB3WzFdID0gYWRkKGIsIHdbMV0pO1xuICAgIHdbMl0gPSBhZGQoYywgd1syXSk7XG4gICAgd1szXSA9IGFkZChkLCB3WzNdKTtcbiAgfX0pKClcblxuLy9Qcm92aWRlczogY2FtbF9NRDVJbml0XG5mdW5jdGlvbiBjYW1sX01ENUluaXQoKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoNjQpO1xuICB2YXIgYjMyID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gIHZhciBiOCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gIHJldHVybiB7bGVuOjAsXG4gICAgICAgICAgdzpuZXcgVWludDMyQXJyYXkoWzB4Njc0NTIzMDEsIDB4RUZDREFCODksIDB4OThCQURDRkUsIDB4MTAzMjU0NzZdKSxcbiAgICAgICAgICBiMzI6YjMyLFxuICAgICAgICAgIGI4OmI4fVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX01ENVVwZGF0ZVxuLy9SZXF1aXJlczogY2FtbF9NRDVUcmFuc2Zvcm1cbmZ1bmN0aW9uIGNhbWxfTUQ1VXBkYXRlKGN0eCwgaW5wdXQsIGlucHV0X2xlbil7XG4gIHZhciBpbl9idWYgPSBjdHgubGVuICYgMHgzZjtcbiAgdmFyIGlucHV0X3BvcyA9IDA7XG4gIGN0eC5sZW4gKz0gaW5wdXRfbGVuO1xuICBpZihpbl9idWYpe1xuICAgIHZhciBtaXNzaW5nID0gNjQgLSBpbl9idWY7XG4gICAgaWYoaW5wdXRfbGVuIDwgbWlzc2luZykge1xuICAgICAgY3R4LmI4LnNldChpbnB1dC5zdWJhcnJheSgwLGlucHV0X2xlbiksaW5fYnVmKTtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjdHguYjguc2V0KGlucHV0LnN1YmFycmF5KDAsbWlzc2luZyksaW5fYnVmKTtcbiAgICBjYW1sX01ENVRyYW5zZm9ybShjdHgudywgY3R4LmIzMik7XG4gICAgaW5wdXRfbGVuIC09IG1pc3Npbmc7XG4gICAgaW5wdXRfcG9zICs9IG1pc3Npbmc7XG4gIH1cbiAgd2hpbGUoaW5wdXRfbGVuID49IDY0KXtcbiAgICBjdHguYjguc2V0KGlucHV0LnN1YmFycmF5KGlucHV0X3BvcyxpbnB1dF9wb3MgKyA2NCksIDApO1xuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBpbnB1dF9sZW4gLT0gNjQ7XG4gICAgaW5wdXRfcG9zICs9IDY0O1xuICB9XG4gIGlmKGlucHV0X2xlbilcbiAgICBjdHguYjguc2V0KGlucHV0LnN1YmFycmF5KGlucHV0X3BvcyxpbnB1dF9wb3MgKyBpbnB1dF9sZW4pLCAwKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9NRDVGaW5hbFxuLy9SZXF1aXJlczogY2FtbF9NRDVUcmFuc2Zvcm1cbmZ1bmN0aW9uIGNhbWxfTUQ1RmluYWwoY3R4KXtcbiAgdmFyIGluX2J1ZiA9IGN0eC5sZW4gJiAweDNmO1xuICBjdHguYjhbaW5fYnVmXSA9IDB4ODA7XG4gIGluX2J1ZiArKztcbiAgaWYoaW5fYnVmID4gNTYpIHtcbiAgICBmb3IodmFyIGogPSBpbl9idWY7IGogPCA2NDsgaisrKXtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICAgIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgICBmb3IodmFyIGogPSAwOyBqIDwgNTY7IGorKyl7XG4gICAgICBjdHguYjhbal0gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IodmFyIGogPSBpbl9idWY7IGogPCA1NjsgaisrKXtcbiAgICAgIGN0eC5iOFtqXSA9IDA7XG4gICAgfVxuICB9XG4gIGN0eC5iMzJbMTRdID0gY3R4LmxlbiA8PCAzO1xuICBjdHguYjMyWzE1XSA9IChjdHgubGVuID4+IDI5KSAmIDB4MUZGRkZGRkY7XG4gIGNhbWxfTUQ1VHJhbnNmb3JtKGN0eC53LCBjdHguYjMyKTtcbiAgdmFyIHQgPSBuZXcgVWludDhBcnJheSgxNik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKVxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgNDsgaisrKVxuICAgICAgdFtpICogNCArIGpdID0gKGN0eC53W2ldID4+ICg4ICogaikpICYgMHhGRjtcbiAgcmV0dXJuIHQ7XG59XG5cblxuLy9Qcm92aWRlczogY2FtbF9tZDVfYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMsIGNhbWxfc3RyaW5nX29mX2FycmF5XG4vL1JlcXVpcmVzOiBjYW1sX01ENUluaXQsIGNhbWxfTUQ1VXBkYXRlLCBjYW1sX01ENUZpbmFsXG5mdW5jdGlvbiBjYW1sX21kNV9ieXRlcyhzLCBvZnMsIGxlbikge1xuICB2YXIgY3R4ID0gY2FtbF9NRDVJbml0KCk7XG4gIHZhciBhID0gY2FtbF91aW50OF9hcnJheV9vZl9ieXRlcyhzKTtcbiAgY2FtbF9NRDVVcGRhdGUoY3R4LGEuc3ViYXJyYXkob2ZzLCBvZnMgKyBsZW4pLCBsZW4pO1xuICByZXR1cm4gY2FtbF9zdHJpbmdfb2ZfYXJyYXkoY2FtbF9NRDVGaW5hbChjdHgpKTtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAyMCAtIEh1Z28gSGV1emFyZFxuLy8gQ29weXJpZ2h0IChDKSAyMDIwIC0gU2hhY2hhciBJdHpoYWt5XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi80LjA3L290aGVybGlicy9zdHIvc3Ryc3R1YnMuY1xuLy8gQ29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzY29xL2pzY29xL2Jsb2IvdjguMTEvY29xLWpzL2pzX3N0dWIvc3RyLmpzXG5cbi8vUHJvdmlkZXM6IHJlX21hdGNoXG4vL1JlcXVpcmVzOiBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nLCBjYW1sX2pzX2Zyb21fYXJyYXksIGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX3N0cmluZ19nZXRcblxudmFyIHJlX21hdGNoID0gZnVuY3Rpb24oKXtcbiAgdmFyIHJlX3dvcmRfbGV0dGVycyA9IFtcbiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAvKiAweDAwLTB4MUY6IG5vbmUgKi9cbiAgICAweDAwLCAweDAwLCAweEZGLCAweDAzLCAgICAgICAvKiAweDIwLTB4M0Y6IGRpZ2l0cyAwLTkgKi9cbiAgICAweEZFLCAweEZGLCAweEZGLCAweDg3LCAgICAgICAvKiAweDQwLTB4NUY6IEEgdG8gWiwgXyAqL1xuICAgIDB4RkUsIDB4RkYsIDB4RkYsIDB4MDcsICAgICAgIC8qIDB4NjAtMHg3RjogYSB0byB6ICovXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogMHg4MC0weDlGOiBub25lICovXG4gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogMHhBMC0weEJGOiBub25lICovXG4gICAgMHhGRiwgMHhGRiwgMHg3RiwgMHhGRiwgICAgICAgLyogMHhDMC0weERGOiBMYXRpbi0xIGFjY2VudGVkIHVwcGVyY2FzZSAqL1xuICAgIDB4RkYsIDB4RkYsIDB4N0YsIDB4RkYgICAgICAgIC8qIDB4RTAtMHhGRjogTGF0aW4tMSBhY2NlbnRlZCBsb3dlcmNhc2UgKi9cbiAgXTtcblxuICB2YXIgb3Bjb2RlcyA9IHtcbiAgICBDSEFSOiAwLCBDSEFSTk9STTogMSwgU1RSSU5HOiAyLCBTVFJJTkdOT1JNOiAzLCBDSEFSQ0xBU1M6IDQsXG4gICAgQk9MOiA1LCBFT0w6IDYsIFdPUkRCT1VOREFSWTogNyxcbiAgICBCRUdHUk9VUDogOCwgRU5ER1JPVVA6IDksIFJFRkdST1VQOiAxMCxcbiAgICBBQ0NFUFQ6IDExLFxuICAgIFNJTVBMRU9QVDogMTIsIFNJTVBMRVNUQVI6IDEzLCBTSU1QTEVQTFVTOiAxNCxcbiAgICBHT1RPOiAxNSwgUFVTSEJBQ0s6IDE2LCBTRVRNQVJLOiAxNyxcbiAgICBDSEVDS1BST0dSRVNTOiAxOFxuICB9O1xuXG4gIGZ1bmN0aW9uIGlzX3dvcmRfbGV0dGVyKGMpIHtcbiAgICByZXR1cm4gKHJlX3dvcmRfbGV0dGVyc1sgIChjID4+IDMpXSA+PiAoYyAmIDcpKSAmIDE7XG4gIH1cblxuICBmdW5jdGlvbiBpbl9iaXRzZXQocyxpKSB7XG4gICAgcmV0dXJuIChjYW1sX3N0cmluZ19nZXQocywoaSA+PiAzKSkgPj4gKGkgJiA3KSkgJiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVfbWF0Y2hfaW1wbChyZSwgcywgcG9zLCBwYXJ0aWFsKSB7XG5cbiAgICB2YXIgcHJvZyAgICAgICAgICA9IGNhbWxfanNfZnJvbV9hcnJheShyZVsxXSksXG4gICAgICAgIGNwb29sICAgICAgICAgPSBjYW1sX2pzX2Zyb21fYXJyYXkocmVbMl0pLFxuICAgICAgICBub3JtdGFibGUgICAgID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhyZVszXSksXG4gICAgICAgIG51bWdyb3VwcyAgICAgPSByZVs0XSB8IDAsXG4gICAgICAgIG51bXJlZ2lzdGVycyAgPSByZVs1XSB8IDAsXG4gICAgICAgIHN0YXJ0Y2hhcnMgICAgPSByZVs2XSB8IDA7XG5cbiAgICB2YXIgcyA9IGNhbWxfdWludDhfYXJyYXlfb2Zfc3RyaW5nKHMpO1xuXG4gICAgdmFyIHBjID0gMCxcbiAgICAgICAgcXVpdCA9IGZhbHNlLFxuICAgICAgICBzdGFjayA9IFtdLFxuICAgICAgICBncm91cHMgPSBuZXcgQXJyYXkobnVtZ3JvdXBzKSxcbiAgICAgICAgcmVfcmVnaXN0ZXIgPSBuZXcgQXJyYXkobnVtcmVnaXN0ZXJzKTtcblxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpKyspe1xuICAgICAgZ3JvdXBzW2ldID0ge3N0YXJ0OiAtMSwgZW5kOi0xfVxuICAgIH1cbiAgICBncm91cHNbMF0uc3RhcnQgPSBwb3M7XG5cbiAgICB2YXIgYmFja3RyYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2hpbGUgKHN0YWNrLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHN0YWNrLnBvcCgpO1xuICAgICAgICBpZiAoaXRlbS51bmRvKSB7XG4gICAgICAgICAgaXRlbS51bmRvLm9ialtpdGVtLnVuZG8ucHJvcF0gPSBpdGVtLnVuZG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihpdGVtLnBvcykge1xuICAgICAgICAgIHBjID0gaXRlbS5wb3MucGM7XG4gICAgICAgICAgcG9zID0gaXRlbS5wb3MudHh0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcXVpdCA9IHRydWU7XG4gICAgfTtcblxuICAgIHZhciBwdXNoID0gZnVuY3Rpb24oaXRlbSkgeyBzdGFjay5wdXNoKGl0ZW0pOyB9O1xuXG4gICAgdmFyIGFjY2VwdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGdyb3Vwc1swXS5lbmQgPSBwb3M7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KDEgKyBncm91cHMubGVuZ3RoKjIpO1xuICAgICAgcmVzdWx0WzBdID0gMDsgLy8gdGFnXG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdmFyIGcgPSBncm91cHNbaV07XG4gICAgICAgIGlmKGcuc3RhcnQgPCAwIHx8IGcuZW5kIDwgMCkge1xuICAgICAgICAgIGcuc3RhcnQgPSBnLmVuZCA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFsyKmkgKyAxIF0gPSBnLnN0YXJ0O1xuICAgICAgICByZXN1bHRbMippICsgMSArIDEgXSA9IGcuZW5kO1xuICAgICAgfTtcbiAgICAgIHJldHVybiByZXN1bHRcbiAgICB9O1xuXG4gICAgdmFyIHByZWZpeF9tYXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmKHBhcnRpYWwpIHJldHVybiBhY2NlcHQgKCk7XG4gICAgICBlbHNlIGJhY2t0cmFjayAoKTtcbiAgICB9XG5cbiAgICAvKiBNYWluIERGQSBpbnRlcnByZXRlciBsb29wICovXG4gICAgd2hpbGUgKCFxdWl0KSB7XG4gICAgICB2YXIgb3AgPSBwcm9nW3BjXSAmIDB4ZmYsXG4gICAgICAgICAgc2FyZyA9IHByb2dbcGNdID4+IDgsXG4gICAgICAgICAgdWFyZyA9IHNhcmcgJiAweGZmLFxuICAgICAgICAgIGMgPSBzW3Bvc10sXG4gICAgICAgICAgZ3JvdXA7XG5cbiAgICAgIHBjKys7XG5cbiAgICAgIHN3aXRjaCAob3ApIHtcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5DSEFSOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChjID09PSB1YXJnKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hBUk5PUk06XG4gICAgICAgIGlmKHBvcyA9PT0gcy5sZW5ndGgpIHtwcmVmaXhfbWF0Y2ggKCk7IGJyZWFrfTtcbiAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSB1YXJnKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU1RSSU5HOlxuICAgICAgICBmb3IgKHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYgKGMgPT09IGFyZy5jaGFyQ29kZUF0KGkpKVxuICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIGVsc2UgeyBiYWNrdHJhY2soKTsgYnJlYWs7IH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TVFJJTkdOT1JNOlxuICAgICAgICBmb3IgKHZhciBhcmcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKGNwb29sW3VhcmddKSwgaSA9IDA7IGkgPCBhcmcubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgICAgaWYgKG5vcm10YWJsZS5jaGFyQ29kZUF0KGMpID09PSBhcmcuY2hhckNvZGVBdChpKSlcbiAgICAgICAgICAgIGMgPSBzWysrcG9zXTtcbiAgICAgICAgICBlbHNlIHsgYmFja3RyYWNrKCk7IGJyZWFrOyB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hBUkNMQVNTOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgZWxzZSBiYWNrdHJhY2soKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQk9MOlxuICAgICAgICBpZihwb3MgPiAwICYmIHNbcG9zIC0gMV0gIT0gMTAgLyogXFxuICovKSB7YmFja3RyYWNrKCl9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkVPTDpcbiAgICAgICAgaWYocG9zIDwgcy5sZW5ndGggJiYgc1twb3NdICE9IDEwIC8qIFxcbiAqLykge2JhY2t0cmFjaygpfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5XT1JEQk9VTkRBUlk6XG4gICAgICAgIGlmKHBvcyA9PSAwKSB7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmKGlzX3dvcmRfbGV0dGVyKHNbMF0pKSBicmVhaztcbiAgICAgICAgICBiYWNrdHJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3MgPT09IHMubGVuZ3RoKSB7XG4gICAgICAgICAgaWYoaXNfd29yZF9sZXR0ZXIoc1twb3MgLSAxXSkpIGJyZWFrO1xuICAgICAgICAgIGJhY2t0cmFjayAoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZihpc193b3JkX2xldHRlcihzW3BvcyAtIDFdKSAhPSBpc193b3JkX2xldHRlcihzW3Bvc10pKSBicmVhaztcbiAgICAgICAgICBiYWNrdHJhY2sgKCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQkVHR1JPVVA6XG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICBwdXNoKHt1bmRvOiB7b2JqOmdyb3VwLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcDonc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdyb3VwLnN0YXJ0fX0pO1xuICAgICAgICBncm91cC5zdGFydCA9IHBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuRU5ER1JPVVA6XG4gICAgICAgIGdyb3VwID0gZ3JvdXBzW3VhcmddO1xuICAgICAgICBwdXNoKHt1bmRvOiB7b2JqOiBncm91cCxcbiAgICAgICAgICAgICAgICAgICAgIHByb3A6J2VuZCcsXG4gICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ3JvdXAuZW5kfX0pO1xuICAgICAgICBncm91cC5lbmQgPSBwb3M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlJFRkdST1VQOlxuICAgICAgICBncm91cCA9IGdyb3Vwc1t1YXJnXTtcbiAgICAgICAgaWYoZ3JvdXAuc3RhcnQgPCAwIHx8IGdyb3VwLmVuZCA8IDApIHtiYWNrdHJhY2sgKCk7IGJyZWFrfVxuICAgICAgICBmb3IgKHZhciBpID0gZ3JvdXAuc3RhcnQ7IGkgPCBncm91cC5lbmQ7IGkrKyl7XG4gICAgICAgICAgaWYocG9zID09PSBzLmxlbmd0aCkge3ByZWZpeF9tYXRjaCAoKTsgYnJlYWt9O1xuICAgICAgICAgIGlmKHNbaV0gIT0gc1twb3NdKSB7YmFja3RyYWNrICgpOyBicmVha31cbiAgICAgICAgICBwb3MrKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVPUFQ6XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSBwb3MrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuU0lNUExFU1RBUjpcbiAgICAgICAgd2hpbGUgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpXG4gICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5TSU1QTEVQTFVTOlxuICAgICAgICBpZihwb3MgPT09IHMubGVuZ3RoKSB7cHJlZml4X21hdGNoICgpOyBicmVha307XG4gICAgICAgIGlmIChpbl9iaXRzZXQoY3Bvb2xbdWFyZ10sIGMpKSB7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgYyA9IHNbKytwb3NdO1xuICAgICAgICAgIH0gd2hpbGUgKGluX2JpdHNldChjcG9vbFt1YXJnXSwgYykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgYmFja3RyYWNrKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLkFDQ0VQVDpcbiAgICAgICAgcmV0dXJuIGFjY2VwdCgpO1xuICAgICAgY2FzZSBvcGNvZGVzLkdPVE86XG4gICAgICAgIHBjID0gcGMgKyBzYXJnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2Ugb3Bjb2Rlcy5QVVNIQkFDSzpcbiAgICAgICAgcHVzaCh7cG9zOiB7cGM6IHBjICsgc2FyZywgdHh0OiBwb3N9fSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBvcGNvZGVzLlNFVE1BUks6XG4gICAgICAgIHB1c2goe3VuZG86IHtvYmo6cmVfcmVnaXN0ZXIsXG4gICAgICAgICAgICAgICAgICAgICBwcm9wOiB1YXJnLFxuICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlX3JlZ2lzdGVyW3VhcmddfX0pO1xuICAgICAgICByZV9yZWdpc3Rlclt1YXJnXSA9IHBvcztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIG9wY29kZXMuQ0hFQ0tQUk9HUkVTUzpcbiAgICAgICAgaWYgKHJlX3JlZ2lzdGVyW3VhcmddID09PSBwb3MpIGJhY2t0cmFjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYnl0ZWNvZGVcIik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHJlX21hdGNoX2ltcGw7XG59KCk7XG5cblxuLy9Qcm92aWRlczogcmVfc2VhcmNoX2ZvcndhcmRcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfc2VhcmNoX2ZvcndhcmQocmUsIHMsIHBvcykge1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIuc2VhcmNoX2ZvcndhcmRcIilcbiAgd2hpbGUgKHBvcyA8PSBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpIHtcbiAgICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gICAgaWYgKHJlcykgcmV0dXJuIHJlcztcbiAgICBwb3MrKztcbiAgfVxuXG4gIHJldHVybiBbMF07ICAvKiBbfHxdIDogaW50IGFycmF5ICovXG59XG5cbi8vUHJvdmlkZXM6IHJlX3NlYXJjaF9iYWNrd2FyZFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9zZWFyY2hfYmFja3dhcmQocmUsIHMsIHBvcykge1xuICBpZihwb3MgPCAwIHx8IHBvcyA+IGNhbWxfbWxfc3RyaW5nX2xlbmd0aChzKSlcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQoXCJTdHIuc2VhcmNoX2JhY2t3YXJkXCIpXG4gIHdoaWxlIChwb3MgPj0gMCkge1xuICAgIHZhciByZXMgPSByZV9tYXRjaChyZSwgcywgcG9zLCAwKTtcbiAgICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICAgIHBvcy0tO1xuICB9XG5cbiAgcmV0dXJuIFswXTsgIC8qIFt8fF0gOiBpbnQgYXJyYXkgKi9cbn1cblxuXG4vL1Byb3ZpZGVzOiByZV9zdHJpbmdfbWF0Y2hcbi8vUmVxdWlyZXM6IHJlX21hdGNoLCBjYW1sX21sX3N0cmluZ19sZW5ndGgsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuZnVuY3Rpb24gcmVfc3RyaW5nX21hdGNoKHJlLHMscG9zKXtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnN0cmluZ19tYXRjaFwiKVxuICB2YXIgcmVzID0gcmVfbWF0Y2gocmUsIHMsIHBvcywgMCk7XG4gIGlmIChyZXMpIHJldHVybiByZXM7XG4gIGVsc2UgcmV0dXJuIFswXTtcbn1cblxuLy9Qcm92aWRlczogcmVfcGFydGlhbF9tYXRjaFxuLy9SZXF1aXJlczogcmVfbWF0Y2gsIGNhbWxfbWxfc3RyaW5nX2xlbmd0aCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50XG5mdW5jdGlvbiByZV9wYXJ0aWFsX21hdGNoKHJlLHMscG9zKXtcbiAgaWYocG9zIDwgMCB8fCBwb3MgPiBjYW1sX21sX3N0cmluZ19sZW5ndGgocykpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50KFwiU3RyLnBhcnRpYWxfbWF0Y2hcIilcbiAgdmFyIHJlcyA9IHJlX21hdGNoKHJlLCBzLCBwb3MsIDEpO1xuICBpZiAocmVzKSByZXR1cm4gcmVzO1xuICBlbHNlIHJldHVybiBbMF07XG59XG5cbi8vUHJvdmlkZXM6IHJlX3JlcGxhY2VtZW50X3RleHRcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfZ2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG4vLyBleHRlcm5hbCByZV9yZXBsYWNlbWVudF90ZXh0OiBzdHJpbmcgLT4gaW50IGFycmF5IC0+IHN0cmluZyAtPiBzdHJpbmdcbmZ1bmN0aW9uIHJlX3JlcGxhY2VtZW50X3RleHQocmVwbCxncm91cHMsb3JpZykge1xuICB2YXIgcmVwbCA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcocmVwbCk7XG4gIHZhciBsZW4gPSByZXBsLmxlbmd0aDtcbiAgdmFyIG9yaWcgPSBjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nKG9yaWcpO1xuICB2YXIgcmVzID0gXCJcIjsgLy9yZXN1bHRcbiAgdmFyIG4gPSAwOyAvLyBjdXJyZW50IHBvc2l0aW9uXG4gIHZhciBjdXI7IC8vY3VycmVudCBjaGFyXG4gIHZhciBzdGFydCwgZW5kLCBjO1xuICB3aGlsZShuIDwgbGVuKXtcbiAgICBjdXIgPSByZXBsLmNoYXJBdChuKyspO1xuICAgIGlmKGN1ciAhPSAnXFxcXCcpe1xuICAgICAgcmVzICs9IGN1cjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZihuID09IGxlbikgY2FtbF9mYWlsd2l0aChcIlN0ci5yZXBsYWNlOiBpbGxlZ2FsIGJhY2tzbGFzaCBzZXF1ZW5jZVwiKTtcbiAgICAgIGN1ciA9IHJlcGwuY2hhckF0KG4rKyk7XG4gICAgICBzd2l0Y2goY3VyKXtcbiAgICAgIGNhc2UgJ1xcXFwnOlxuICAgICAgICByZXMgKz0gY3VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzpcbiAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzpcbiAgICAgICAgYyA9ICtjdXI7XG4gICAgICAgIGlmIChjKjIgPj0gZ3JvdXBzLmxlbmd0aCAtIDEgKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJTdHIucmVwbGFjZTogcmVmZXJlbmNlIHRvIHVubWF0Y2hlZCBncm91cFwiICk7XG4gICAgICAgIHN0YXJ0ID0gY2FtbF9hcnJheV9nZXQoZ3JvdXBzLGMqMik7XG4gICAgICAgIGVuZCA9IGNhbWxfYXJyYXlfZ2V0KGdyb3VwcywgYyoyICsxKTtcbiAgICAgICAgaWYgKHN0YXJ0ID09IC0xKVxuICAgICAgICAgIGNhbWxfZmFpbHdpdGgoXCJTdHIucmVwbGFjZTogcmVmZXJlbmNlIHRvIHVubWF0Y2hlZCBncm91cFwiKTtcbiAgICAgICAgcmVzKz1vcmlnLnNsaWNlKHN0YXJ0LGVuZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzICs9ICgnXFxcXCcgICsgY3VyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNhbWxfc3RyaW5nX29mX2pzYnl0ZXMocmVzKTsgfVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfc3RyX2luaXRpYWxpemVcbmZ1bmN0aW9uIGNhbWxfc3RyX2luaXRpYWxpemUodW5pdCkge1xuICByZXR1cm4gMDtcbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKi9cbi8qICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKi9cbi8qICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgd2l0aCAgICAgKi9cbi8qICB0aGUgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gZmlsZSAuLi9MSUNFTlNFLiAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogJElkOiBsZXhpbmcuYyA2MDQ1IDIwMDQtMDEtMDEgMTY6NDI6NDNaIGRvbGlnZXogJCAqL1xuXG4vKiBUaGUgdGFibGUtZHJpdmVuIGF1dG9tYXRvbiBmb3IgbGV4ZXJzIGdlbmVyYXRlZCBieSBjYW1sbGV4LiAqL1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2xleF9hcnJheVxuLy9SZXF1aXJlczogY2FtbF9qc2J5dGVzX29mX3N0cmluZ1xuZnVuY3Rpb24gY2FtbF9sZXhfYXJyYXkocykge1xuICBzID0gY2FtbF9qc2J5dGVzX29mX3N0cmluZyhzKTtcbiAgdmFyIGwgPSBzLmxlbmd0aCAvIDI7XG4gIHZhciBhID0gbmV3IEFycmF5KGwpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKylcbiAgICBhW2ldID0gKHMuY2hhckNvZGVBdCgyICogaSkgfCAocy5jaGFyQ29kZUF0KDIgKiBpICsgMSkgPDwgOCkpIDw8IDE2ID4+IDE2O1xuICByZXR1cm4gYTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9sZXhfZW5naW5lXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoLCBjYW1sX2xleF9hcnJheSwgY2FtbF91aW50OF9hcnJheV9vZl9ieXRlc1xuZnVuY3Rpb24gY2FtbF9sZXhfZW5naW5lKHRibCwgc3RhcnRfc3RhdGUsIGxleGJ1Zikge1xuICB2YXIgbGV4X2J1ZmZlciA9IDI7XG4gIHZhciBsZXhfYnVmZmVyX2xlbiA9IDM7XG4gIHZhciBsZXhfc3RhcnRfcG9zID0gNTtcbiAgdmFyIGxleF9jdXJyX3BvcyA9IDY7XG4gIHZhciBsZXhfbGFzdF9wb3MgPSA3O1xuICB2YXIgbGV4X2xhc3RfYWN0aW9uID0gODtcbiAgdmFyIGxleF9lb2ZfcmVhY2hlZCA9IDk7XG4gIHZhciBsZXhfYmFzZSA9IDE7XG4gIHZhciBsZXhfYmFja3RyayA9IDI7XG4gIHZhciBsZXhfZGVmYXVsdCA9IDM7XG4gIHZhciBsZXhfdHJhbnMgPSA0O1xuICB2YXIgbGV4X2NoZWNrID0gNTtcblxuICBpZiAoIXRibC5sZXhfZGVmYXVsdCkge1xuICAgIHRibC5sZXhfYmFzZSA9ICAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2Jhc2VdKTtcbiAgICB0YmwubGV4X2JhY2t0cmsgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9iYWNrdHJrXSk7XG4gICAgdGJsLmxleF9jaGVjayA9ICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfY2hlY2tdKTtcbiAgICB0YmwubGV4X3RyYW5zID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF90cmFuc10pO1xuICAgIHRibC5sZXhfZGVmYXVsdCA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2RlZmF1bHRdKTtcbiAgfVxuXG4gIHZhciBjLCBzdGF0ZSA9IHN0YXJ0X3N0YXRlO1xuXG4gIHZhciBidWZmZXIgPSBjYW1sX3VpbnQ4X2FycmF5X29mX2J5dGVzKGxleGJ1ZltsZXhfYnVmZmVyXSk7XG5cbiAgaWYgKHN0YXRlID49IDApIHtcbiAgICAvKiBGaXJzdCBlbnRyeSAqL1xuICAgIGxleGJ1ZltsZXhfbGFzdF9wb3NdID0gbGV4YnVmW2xleF9zdGFydF9wb3NdID0gbGV4YnVmW2xleF9jdXJyX3Bvc107XG4gICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSAtMTtcbiAgfSBlbHNlIHtcbiAgICAvKiBSZWVudHJ5IGFmdGVyIHJlZmlsbCAqL1xuICAgIHN0YXRlID0gLXN0YXRlIC0gMTtcbiAgfVxuICBmb3IoOzspIHtcbiAgICAvKiBMb29rdXAgYmFzZSBhZGRyZXNzIG9yIGFjdGlvbiBudW1iZXIgZm9yIGN1cnJlbnQgc3RhdGUgKi9cbiAgICB2YXIgYmFzZSA9IHRibC5sZXhfYmFzZVtzdGF0ZV07XG4gICAgaWYgKGJhc2UgPCAwKSByZXR1cm4gLWJhc2UtMTtcbiAgICAvKiBTZWUgaWYgaXQncyBhIGJhY2t0cmFjayBwb2ludCAqL1xuICAgIHZhciBiYWNrdHJrID0gdGJsLmxleF9iYWNrdHJrW3N0YXRlXTtcbiAgICBpZiAoYmFja3RyayA+PSAwKSB7XG4gICAgICBsZXhidWZbbGV4X2xhc3RfcG9zXSA9IGxleGJ1ZltsZXhfY3Vycl9wb3NdO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X2FjdGlvbl0gPSBiYWNrdHJrO1xuICAgIH1cbiAgICAvKiBTZWUgaWYgd2UgbmVlZCBhIHJlZmlsbCAqL1xuICAgIGlmIChsZXhidWZbbGV4X2N1cnJfcG9zXSA+PSBsZXhidWZbbGV4X2J1ZmZlcl9sZW5dKXtcbiAgICAgIGlmIChsZXhidWZbbGV4X2VvZl9yZWFjaGVkXSA9PSAwKVxuICAgICAgICByZXR1cm4gLXN0YXRlIC0gMTtcbiAgICAgIGVsc2VcbiAgICAgICAgYyA9IDI1NjtcbiAgICB9ZWxzZXtcbiAgICAgIC8qIFJlYWQgbmV4dCBpbnB1dCBjaGFyICovXG4gICAgICBjID0gYnVmZmVyW2xleGJ1ZltsZXhfY3Vycl9wb3NdXTtcbiAgICAgIGxleGJ1ZltsZXhfY3Vycl9wb3NdICsrO1xuICAgIH1cbiAgICAvKiBEZXRlcm1pbmUgbmV4dCBzdGF0ZSAqL1xuICAgIGlmICh0YmwubGV4X2NoZWNrW2Jhc2UgKyBjXSA9PSBzdGF0ZSlcbiAgICAgIHN0YXRlID0gdGJsLmxleF90cmFuc1tiYXNlICsgY107XG4gICAgZWxzZVxuICAgICAgc3RhdGUgPSB0YmwubGV4X2RlZmF1bHRbc3RhdGVdO1xuICAgIC8qIElmIG5vIHRyYW5zaXRpb24gb24gdGhpcyBjaGFyLCByZXR1cm4gdG8gbGFzdCBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICBpZiAoc3RhdGUgPCAwKSB7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSA9IGxleGJ1ZltsZXhfbGFzdF9wb3NdO1xuICAgICAgaWYgKGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID09IC0xKVxuICAgICAgICBjYW1sX2ZhaWx3aXRoKFwibGV4aW5nOiBlbXB0eSB0b2tlblwiKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dO1xuICAgIH1lbHNle1xuICAgICAgLyogRXJhc2UgdGhlIEVPRiBjb25kaXRpb24gb25seSBpZiB0aGUgRU9GIHBzZXVkby1jaGFyYWN0ZXIgd2FzXG4gICAgICAgICBjb25zdW1lZCBieSB0aGUgYXV0b21hdG9uIChpLmUuIHRoZXJlIHdhcyBubyBiYWNrdHJhY2sgYWJvdmUpXG4gICAgICAqL1xuICAgICAgaWYgKGMgPT0gMjU2KSBsZXhidWZbbGV4X2VvZl9yZWFjaGVkXSA9IDA7XG4gICAgfVxuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qIE5ldyBsZXhlciBlbmdpbmUsIHdpdGggbWVtb3J5IG9mIHBvc2l0aW9ucyAgKi9cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy9Qcm92aWRlczogY2FtbF9uZXdfbGV4X2VuZ2luZVxuLy9SZXF1aXJlczogY2FtbF9mYWlsd2l0aCwgY2FtbF9sZXhfYXJyYXlcbi8vUmVxdWlyZXM6IGNhbWxfanNieXRlc19vZl9zdHJpbmcsIGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXNcbmZ1bmN0aW9uIGNhbWxfbGV4X3J1bl9tZW0ocywgaSwgbWVtLCBjdXJyX3Bvcykge1xuICBmb3IgKDs7KSB7XG4gICAgdmFyIGRzdCA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChkc3QgPT0gMHhmZikgcmV0dXJuO1xuICAgIHZhciBzcmMgPSBzLmNoYXJDb2RlQXQoaSk7IGkrKztcbiAgICBpZiAoc3JjID09IDB4ZmYpXG4gICAgICBtZW0gW2RzdCArIDFdID0gY3Vycl9wb3M7XG4gICAgZWxzZVxuICAgICAgbWVtIFtkc3QgKyAxXSA9IG1lbSBbc3JjICsgMV07XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FtbF9sZXhfcnVuX3RhZyhzLCBpLCBtZW0pIHtcbiAgZm9yICg7Oykge1xuICAgIHZhciBkc3QgPSBzLmNoYXJDb2RlQXQoaSk7IGkrKztcbiAgICBpZiAoZHN0ID09IDB4ZmYpIHJldHVybiA7XG4gICAgdmFyIHNyYyA9IHMuY2hhckNvZGVBdChpKTsgaSsrO1xuICAgIGlmIChzcmMgPT0gMHhmZilcbiAgICAgIG1lbSBbZHN0ICsgMV0gPSAtMTtcbiAgICBlbHNlXG4gICAgICBtZW0gW2RzdCArIDFdID0gbWVtIFtzcmMgKyAxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYW1sX25ld19sZXhfZW5naW5lKHRibCwgc3RhcnRfc3RhdGUsIGxleGJ1Zikge1xuICB2YXIgbGV4X2J1ZmZlciA9IDI7XG4gIHZhciBsZXhfYnVmZmVyX2xlbiA9IDM7XG4gIHZhciBsZXhfc3RhcnRfcG9zID0gNTtcbiAgdmFyIGxleF9jdXJyX3BvcyA9IDY7XG4gIHZhciBsZXhfbGFzdF9wb3MgPSA3O1xuICB2YXIgbGV4X2xhc3RfYWN0aW9uID0gODtcbiAgdmFyIGxleF9lb2ZfcmVhY2hlZCA9IDk7XG4gIHZhciBsZXhfbWVtID0gMTA7XG4gIHZhciBsZXhfYmFzZSA9IDE7XG4gIHZhciBsZXhfYmFja3RyayA9IDI7XG4gIHZhciBsZXhfZGVmYXVsdCA9IDM7XG4gIHZhciBsZXhfdHJhbnMgPSA0O1xuICB2YXIgbGV4X2NoZWNrID0gNTtcbiAgdmFyIGxleF9iYXNlX2NvZGUgPSA2O1xuICB2YXIgbGV4X2JhY2t0cmtfY29kZSA9IDc7XG4gIHZhciBsZXhfZGVmYXVsdF9jb2RlID0gODtcbiAgdmFyIGxleF90cmFuc19jb2RlID0gOTtcbiAgdmFyIGxleF9jaGVja19jb2RlID0gMTA7XG4gIHZhciBsZXhfY29kZSA9IDExO1xuXG4gIGlmICghdGJsLmxleF9kZWZhdWx0KSB7XG4gICAgdGJsLmxleF9iYXNlID0gICAgY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFzZV0pO1xuICAgIHRibC5sZXhfYmFja3RyayA9IGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2JhY2t0cmtdKTtcbiAgICB0YmwubGV4X2NoZWNrID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9jaGVja10pO1xuICAgIHRibC5sZXhfdHJhbnMgPSAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X3RyYW5zXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0ID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfZGVmYXVsdF0pO1xuICB9XG4gIGlmICghdGJsLmxleF9kZWZhdWx0X2NvZGUpIHtcbiAgICB0YmwubGV4X2Jhc2VfY29kZSA9ICAgIGNhbWxfbGV4X2FycmF5ICh0YmxbbGV4X2Jhc2VfY29kZV0pO1xuICAgIHRibC5sZXhfYmFja3Rya19jb2RlID0gY2FtbF9sZXhfYXJyYXkgKHRibFtsZXhfYmFja3Rya19jb2RlXSk7XG4gICAgdGJsLmxleF9jaGVja19jb2RlID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF9jaGVja19jb2RlXSk7XG4gICAgdGJsLmxleF90cmFuc19jb2RlID0gICBjYW1sX2xleF9hcnJheSAodGJsW2xleF90cmFuc19jb2RlXSk7XG4gICAgdGJsLmxleF9kZWZhdWx0X2NvZGUgPSBjYW1sX2xleF9hcnJheSAodGJsW2xleF9kZWZhdWx0X2NvZGVdKTtcbiAgfVxuICBpZiAodGJsLmxleF9jb2RlID09IG51bGwpIHRibC5sZXhfY29kZSA9IGNhbWxfanNieXRlc19vZl9zdHJpbmcodGJsW2xleF9jb2RlXSk7XG5cbiAgdmFyIGMsIHN0YXRlID0gc3RhcnRfc3RhdGU7XG5cbiAgdmFyIGJ1ZmZlciA9IGNhbWxfdWludDhfYXJyYXlfb2ZfYnl0ZXMobGV4YnVmW2xleF9idWZmZXJdKTtcblxuICBpZiAoc3RhdGUgPj0gMCkge1xuICAgIC8qIEZpcnN0IGVudHJ5ICovXG4gICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X3N0YXJ0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICBsZXhidWZbbGV4X2xhc3RfYWN0aW9uXSA9IC0xO1xuICB9IGVsc2Uge1xuICAgIC8qIFJlZW50cnkgYWZ0ZXIgcmVmaWxsICovXG4gICAgc3RhdGUgPSAtc3RhdGUgLSAxO1xuICB9XG4gIGZvcig7Oykge1xuICAgIC8qIExvb2t1cCBiYXNlIGFkZHJlc3Mgb3IgYWN0aW9uIG51bWJlciBmb3IgY3VycmVudCBzdGF0ZSAqL1xuICAgIHZhciBiYXNlID0gdGJsLmxleF9iYXNlW3N0YXRlXTtcbiAgICBpZiAoYmFzZSA8IDApIHtcbiAgICAgIHZhciBwY19vZmYgPSB0YmwubGV4X2Jhc2VfY29kZVtzdGF0ZV07XG4gICAgICBjYW1sX2xleF9ydW5fdGFnKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0pO1xuICAgICAgcmV0dXJuIC1iYXNlLTE7XG4gICAgfVxuICAgIC8qIFNlZSBpZiBpdCdzIGEgYmFja3RyYWNrIHBvaW50ICovXG4gICAgdmFyIGJhY2t0cmsgPSB0YmwubGV4X2JhY2t0cmtbc3RhdGVdO1xuICAgIGlmIChiYWNrdHJrID49IDApIHtcbiAgICAgIHZhciBwY19vZmYgPSB0YmwubGV4X2JhY2t0cmtfY29kZVtzdGF0ZV07XG4gICAgICBjYW1sX2xleF9ydW5fdGFnKHRibC5sZXhfY29kZSwgcGNfb2ZmLCBsZXhidWZbbGV4X21lbV0pO1xuICAgICAgbGV4YnVmW2xleF9sYXN0X3Bvc10gPSBsZXhidWZbbGV4X2N1cnJfcG9zXTtcbiAgICAgIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID0gYmFja3RyaztcbiAgICB9XG4gICAgLyogU2VlIGlmIHdlIG5lZWQgYSByZWZpbGwgKi9cbiAgICBpZiAobGV4YnVmW2xleF9jdXJyX3Bvc10gPj0gbGV4YnVmW2xleF9idWZmZXJfbGVuXSl7XG4gICAgICBpZiAobGV4YnVmW2xleF9lb2ZfcmVhY2hlZF0gPT0gMClcbiAgICAgICAgcmV0dXJuIC1zdGF0ZSAtIDE7XG4gICAgICBlbHNlXG4gICAgICAgIGMgPSAyNTY7XG4gICAgfWVsc2V7XG4gICAgICAvKiBSZWFkIG5leHQgaW5wdXQgY2hhciAqL1xuICAgICAgYyA9IGJ1ZmZlcltsZXhidWZbbGV4X2N1cnJfcG9zXV07XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSArKztcbiAgICB9XG4gICAgLyogRGV0ZXJtaW5lIG5leHQgc3RhdGUgKi9cbiAgICB2YXIgcHN0YXRlID0gc3RhdGUgO1xuICAgIGlmICh0YmwubGV4X2NoZWNrW2Jhc2UgKyBjXSA9PSBzdGF0ZSlcbiAgICAgIHN0YXRlID0gdGJsLmxleF90cmFuc1tiYXNlICsgY107XG4gICAgZWxzZVxuICAgICAgc3RhdGUgPSB0YmwubGV4X2RlZmF1bHRbc3RhdGVdO1xuICAgIC8qIElmIG5vIHRyYW5zaXRpb24gb24gdGhpcyBjaGFyLCByZXR1cm4gdG8gbGFzdCBiYWNrdHJhY2sgcG9pbnQgKi9cbiAgICBpZiAoc3RhdGUgPCAwKSB7XG4gICAgICBsZXhidWZbbGV4X2N1cnJfcG9zXSA9IGxleGJ1ZltsZXhfbGFzdF9wb3NdO1xuICAgICAgaWYgKGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dID09IC0xKVxuICAgICAgICBjYW1sX2ZhaWx3aXRoKFwibGV4aW5nOiBlbXB0eSB0b2tlblwiKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIGxleGJ1ZltsZXhfbGFzdF9hY3Rpb25dO1xuICAgIH1lbHNle1xuICAgICAgLyogSWYgc29tZSB0cmFuc2l0aW9uLCBnZXQgYW5kIHBlcmZvcm0gbWVtb3J5IG1vdmVzICovXG4gICAgICB2YXIgYmFzZV9jb2RlID0gdGJsLmxleF9iYXNlX2NvZGVbcHN0YXRlXSwgcGNfb2ZmO1xuICAgICAgaWYgKHRibC5sZXhfY2hlY2tfY29kZVtiYXNlX2NvZGUgKyBjXSA9PSBwc3RhdGUpXG4gICAgICAgIHBjX29mZiA9IHRibC5sZXhfdHJhbnNfY29kZVtiYXNlX2NvZGUgKyBjXTtcbiAgICAgIGVsc2VcbiAgICAgICAgcGNfb2ZmID0gdGJsLmxleF9kZWZhdWx0X2NvZGVbcHN0YXRlXTtcbiAgICAgIGlmIChwY19vZmYgPiAwKVxuICAgICAgICBjYW1sX2xleF9ydW5fbWVtXG4gICAgICAodGJsLmxleF9jb2RlLCBwY19vZmYsIGxleGJ1ZltsZXhfbWVtXSwgbGV4YnVmW2xleF9jdXJyX3Bvc10pO1xuICAgICAgLyogRXJhc2UgdGhlIEVPRiBjb25kaXRpb24gb25seSBpZiB0aGUgRU9GIHBzZXVkby1jaGFyYWN0ZXIgd2FzXG4gICAgICAgICBjb25zdW1lZCBieSB0aGUgYXV0b21hdG9uIChpLmUuIHRoZXJlIHdhcyBubyBiYWNrdHJhY2sgYWJvdmUpXG4gICAgICAqL1xuICAgICAgaWYgKGMgPT0gMjU2KSBsZXhidWZbbGV4X2VvZl9yZWFjaGVkXSA9IDA7XG4gICAgfVxuICB9XG59XG4iLCIvLyBKc19vZl9vY2FtbCBydW50aW1lIHN1cHBvcnRcbi8vIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLy8vLy8vLy8vLy8vIEFycmF5XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfc3ViIG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc3ViIChhLCBpLCBsZW4pIHtcbiAgdmFyIGEyID0gbmV3IEFycmF5KGxlbisxKTtcbiAgYTJbMF09MDtcbiAgZm9yKHZhciBpMiA9IDEsIGkxPSBpKzE7IGkyIDw9IGxlbjsgaTIrKyxpMSsrICl7XG4gICAgYTJbaTJdPWFbaTFdO1xuICB9XG4gIHJldHVybiBhMjtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9hcHBlbmQgbXV0YWJsZVxuZnVuY3Rpb24gY2FtbF9hcnJheV9hcHBlbmQoYTEsIGEyKSB7XG4gIHZhciBsMSA9IGExLmxlbmd0aCwgbDIgPSBhMi5sZW5ndGg7XG4gIHZhciBsID0gbDErbDItMVxuICB2YXIgYSA9IG5ldyBBcnJheShsKTtcbiAgYVswXSA9IDA7XG4gIHZhciBpID0gMSxqID0gMTtcbiAgZm9yKDtpPGwxO2krKykgYVtpXT1hMVtpXTtcbiAgZm9yKDtpPGw7aSsrLGorKykgYVtpXT1hMltqXTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfY29uY2F0IG11dGFibGVcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfY29uY2F0KGwpIHtcbiAgdmFyIGEgPSBbMF07XG4gIHdoaWxlIChsICE9PSAwKSB7XG4gICAgdmFyIGIgPSBsWzFdO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYi5sZW5ndGg7IGkrKykgYS5wdXNoKGJbaV0pO1xuICAgIGwgPSBsWzJdO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2FycmF5X2JsaXRcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfYmxpdChhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIGlmIChpMiA8PSBpMSkge1xuICAgIGZvciAodmFyIGogPSAxOyBqIDw9IGxlbjsgaisrKSBhMltpMiArIGpdID0gYTFbaTEgKyBqXTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBqID0gbGVuOyBqID49IDE7IGotLSkgYTJbaTIgKyBqXSA9IGExW2kxICsgal07XG4gIH07XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2Zsb2F0YXJyYXlfYmxpdFxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2JsaXQoYTEsIGkxLCBhMiwgaTIsIGxlbikge1xuICBpZiAoaTIgPD0gaTEpIHtcbiAgICBmb3IgKHZhciBqID0gMTsgaiA8PSBsZW47IGorKykgYTJbaTIgKyBqXSA9IGExW2kxICsgal07XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgaiA9IGxlbjsgaiA+PSAxOyBqLS0pIGEyW2kyICsgal0gPSBhMVtpMSArIGpdO1xuICB9O1xuICByZXR1cm4gMDtcbn1cblxuLy8vLy8vLy8vLy8vLyBQZXJ2YXNpdmVcbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfc2V0IChtdXRhYmxlLCBjb25zdCwgbXV0YWJsZSlcbi8vUmVxdWlyZXM6IGNhbWxfYXJyYXlfYm91bmRfZXJyb3JcbmZ1bmN0aW9uIGNhbWxfYXJyYXlfc2V0IChhcnJheSwgaW5kZXgsIG5ld3ZhbCkge1xuICBpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGFycmF5Lmxlbmd0aCAtIDEpKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIGFycmF5W2luZGV4KzFdPW5ld3ZhbDsgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfYXJyYXlfZ2V0IG11dGFibGUgKG11dGFibGUsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9hcnJheV9nZXQgKGFycmF5LCBpbmRleCkge1xuICBpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IGFycmF5Lmxlbmd0aCAtIDEpKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBhcnJheVtpbmRleCsxXTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9hcnJheV9maWxsXG5mdW5jdGlvbiBjYW1sX2FycmF5X2ZpbGwoYXJyYXksIG9mcywgbGVuLCB2KXtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKXtcbiAgICBhcnJheVtvZnMraSsxXSA9IHY7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfY2hlY2tfYm91bmQgKG11dGFibGUsIGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9jaGVja19ib3VuZCAoYXJyYXksIGluZGV4KSB7XG4gIGlmIChpbmRleCA+Pj4gMCA+PSBhcnJheS5sZW5ndGggLSAxKSBjYW1sX2FycmF5X2JvdW5kX2Vycm9yKCk7XG4gIHJldHVybiBhcnJheTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tYWtlX3ZlY3QgY29uc3QgKGNvbnN0LCBtdXRhYmxlKVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9tYWtlX3ZlY3QgKGxlbiwgaW5pdCkge1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MDtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBsZW47IGkrKykgYltpXSA9IGluaXQ7XG4gIHJldHVybiBiO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21ha2VfZmxvYXRfdmVjdCBjb25zdCAoY29uc3QpXG4vL1JlcXVpcmVzOiBjYW1sX2FycmF5X2JvdW5kX2Vycm9yXG5mdW5jdGlvbiBjYW1sX21ha2VfZmxvYXRfdmVjdChsZW4pe1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MjU0O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gMDtcbiAgcmV0dXJuIGJcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZmxvYXRhcnJheV9jcmVhdGUgY29uc3QgKGNvbnN0KVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ib3VuZF9lcnJvclxuZnVuY3Rpb24gY2FtbF9mbG9hdGFycmF5X2NyZWF0ZShsZW4pe1xuICBpZiAobGVuIDwgMCkgY2FtbF9hcnJheV9ib3VuZF9lcnJvcigpO1xuICB2YXIgbGVuID0gbGVuICsgMSB8IDA7XG4gIHZhciBiID0gbmV3IEFycmF5KGxlbik7XG4gIGJbMF09MjU0O1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbjsgaSsrKSBiW2ldID0gMDtcbiAgcmV0dXJuIGJcbn1cbiIsIi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50X3BvcGNvdW50IGNvbnN0XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludF9wb3Bjb3VudCh2KSB7XG4gIHYgPSB2IC0gKCh2ID4+PiAxKSAmIDB4NTU1NTU1NTUpO1xuICB2ID0gKHYgJiAweDMzMzMzMzMzKSArICgodiA+Pj4gMikgJiAweDMzMzMzMzMzKTtcbiAgcmV0dXJuICgodiArICh2ID4+PiA0KSAmIDB4RjBGMEYwRikgKiAweDEwMTAxMDEpID4+PiAyNDtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9jbGVhcl9jYW1sX2JhY2t0cmFjZV9wb3MgY29uc3RcbmZ1bmN0aW9uIEJhc2VfY2xlYXJfY2FtbF9iYWNrdHJhY2VfcG9zKHgpIHtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfY2FtbF9leG5faXNfbW9zdF9yZWNlbnRfZXhuIGNvbnN0XG5mdW5jdGlvbiBCYXNlX2NhbWxfZXhuX2lzX21vc3RfcmVjZW50X2V4bih4KSB7XG4gIHJldHVybiAxO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2NseiBjb25zdFxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHooeCkge1xuICB2YXIgbiA9IDMyO1xuICB2YXIgeTtcbiAgeSA9IHggPj4xNjsgaWYgKHkgIT0gMCkgeyBuID0gbiAtMTY7IHggPSB5OyB9XG4gIHkgPSB4ID4+IDg7IGlmICh5ICE9IDApIHsgbiA9IG4gLSA4OyB4ID0geTsgfVxuICB5ID0geCA+PiA0OyBpZiAoeSAhPSAwKSB7IG4gPSBuIC0gNDsgeCA9IHk7IH1cbiAgeSA9IHggPj4gMjsgaWYgKHkgIT0gMCkgeyBuID0gbiAtIDI7IHggPSB5OyB9XG4gIHkgPSB4ID4+IDE7IGlmICh5ICE9IDApIHJldHVybiBuIC0gMjtcbiAgcmV0dXJuIG4gLSB4O1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludF9jbHogY29uc3Rcbi8vUmVxdWlyZXM6IEJhc2VfaW50X21hdGhfaW50MzJfY2x6XG5mdW5jdGlvbiBCYXNlX2ludF9tYXRoX2ludF9jbHooeCkgeyByZXR1cm4gQmFzZV9pbnRfbWF0aF9pbnQzMl9jbHooeCk7IH1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY2x6IGNvbnN0XG4vL1JlcXVpcmVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2NselxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY2x6KHgpIHsgcmV0dXJuIEJhc2VfaW50X21hdGhfaW50MzJfY2x6KHgpOyB9XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50NjRfY2x6IGNvbnN0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkLCBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfaW50NjRfdG9faW50MzJcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50NjRfY2x6KHgpIHtcbiAgdmFyIG4gPSA2NDtcbiAgdmFyIHk7XG4gIHkgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDMyKTtcbiAgaWYgKCFjYW1sX2ludDY0X2lzX3plcm8oeSkpIHsgbiA9IG4gLTMyOyB4ID0geTsgfVxuICB5ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAxNik7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSB7IG4gPSBuIC0xNjsgeCA9IHk7IH1cbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgOCk7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSB7IG4gPSBuIC0gODsgeCA9IHk7IH1cbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgNCk7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSB7IG4gPSBuIC0gNDsgeCA9IHk7IH1cbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMik7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSB7IG4gPSBuIC0gMjsgeCA9IHk7IH1cbiAgeSA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgMSk7XG4gIGlmICghY2FtbF9pbnQ2NF9pc196ZXJvKHkpKSByZXR1cm4gbiAtIDI7XG4gIHJldHVybiBuIC0gY2FtbF9pbnQ2NF90b19pbnQzMih4KTtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHogY29uc3RcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50MzJfY3R6KHgpIHtcbiAgaWYgKHggPT09IDApIHsgcmV0dXJuIDMyOyB9XG4gIHZhciBuID0gMTtcbiAgaWYgKCAoeCAmIDB4MDAwMEZGRkYpID09PSAwKSB7IG4gPSBuICsgMTY7IHggPSB4ID4+IDE2OyB9XG4gIGlmICggKHggJiAweDAwMDAwMEZGKSA9PT0gMCkgeyBuID0gbiArICA4OyB4ID0geCA+PiAgODsgfVxuICBpZiAoICh4ICYgMHgwMDAwMDAwRikgPT09IDApIHsgbiA9IG4gKyAgNDsgeCA9IHggPj4gIDQ7IH1cbiAgaWYgKCAoeCAmIDB4MDAwMDAwMDMpID09PSAwKSB7IG4gPSBuICsgIDI7IHggPSB4ID4+ICAyOyB9XG4gIHJldHVybiBuIC0gKHggJiAxKTtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnRfY3R6IGNvbnN0XG4vL1JlcXVpcmVzOiBCYXNlX2ludF9tYXRoX2ludDMyX2N0elxuZnVuY3Rpb24gQmFzZV9pbnRfbWF0aF9pbnRfY3R6KHgpIHsgcmV0dXJuIEJhc2VfaW50X21hdGhfaW50MzJfY3R6KHgpOyB9XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfbmF0aXZlaW50X2N0eiBjb25zdFxuLy9SZXF1aXJlczogQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHpcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfbmF0aXZlaW50X2N0eih4KSB7IHJldHVybiBCYXNlX2ludF9tYXRoX2ludDMyX2N0eih4KTsgfVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2ludF9tYXRoX2ludDY0X2N0eiBjb25zdFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCwgY2FtbF9pbnQ2NF9pc196ZXJvLCBjYW1sX2ludDY0X3RvX2ludDMyXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FuZCwgY2FtbF9pbnQ2NF9vZl9pbnQzMiwgY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGlcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50NjRfY3R6KHgpIHtcbiAgaWYgKGNhbWxfaW50NjRfaXNfemVybyh4KSkgeyByZXR1cm4gNjQ7IH1cbiAgdmFyIG4gPSAxO1xuICBmdW5jdGlvbiBpc196ZXJvICh4KSAgICB7IHJldHVybiBjYW1sX2ludDY0X2lzX3plcm8oeCk7IH1cbiAgZnVuY3Rpb24gbGFuZCAoeCx5KSAgICAgeyByZXR1cm4gY2FtbF9pbnQ2NF9hbmQoeCwgeSk7IH1cbiAgZnVuY3Rpb24gc21hbGxfaW50NjQoeCkgeyByZXR1cm4gY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkoeCwwLDApOyB9XG4gIGlmIChpc196ZXJvKGxhbmQoeCwgY2FtbF9pbnQ2NF9jcmVhdGVfbG9fbWlfaGkoMHhGRkZGRkYsIDB4MDAwMEZGLCAweDAwMDApKSkpIHtcbiAgICBuID0gbiArIDMyOyB4ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAzMik7XG4gIH1cbiAgaWYgKGlzX3plcm8obGFuZCh4LCBzbWFsbF9pbnQ2NCgweDAwRkZGRikpKSkge1xuICAgIG4gPSBuICsgMTY7IHggPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDE2KTtcbiAgfVxuICBpZiAoaXNfemVybyhsYW5kKHgsIHNtYWxsX2ludDY0KDB4MDAwMEZGKSkpKSB7XG4gICAgbiA9IG4gKyAgODsgeCA9IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWQoeCwgOCk7XG4gIH1cbiAgaWYgKGlzX3plcm8obGFuZCh4LCBzbWFsbF9pbnQ2NCgweDAwMDAwRikpKSkge1xuICAgIG4gPSBuICsgIDQ7IHggPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsIDQpO1xuICB9XG4gIGlmIChpc196ZXJvKGxhbmQoeCwgc21hbGxfaW50NjQoMHgwMDAwMDMpKSkpIHtcbiAgICBuID0gbiArICAyOyB4ID0gY2FtbF9pbnQ2NF9zaGlmdF9yaWdodF91bnNpZ25lZCh4LCAyKTtcbiAgfVxuICByZXR1cm4gbiAtIChjYW1sX2ludDY0X3RvX2ludDMyKGNhbWxfaW50NjRfYW5kKHgsIHNtYWxsX2ludDY0KDB4MDAwMDAxKSkpKTtcbn1cblxuLy9Qcm92aWRlczogQmFzZV9pbnRfbWF0aF9pbnRfcG93X3N0dWIgY29uc3RcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50X3Bvd19zdHViKGJhc2UsIGV4cG9uZW50KSB7XG4gIHZhciBvbmUgPSAxO1xuICB2YXIgbXVsID0gW29uZSwgYmFzZSwgb25lLCBvbmVdO1xuICB2YXIgcmVzID0gb25lO1xuICB3aGlsZSAoIWV4cG9uZW50PT0wKSB7XG4gICAgbXVsWzFdID0gKG11bFsxXSAqIG11bFszXSkgfCAwO1xuICAgIG11bFsyXSA9IChtdWxbMV0gKiBtdWxbMV0pIHwgMDtcbiAgICBtdWxbM10gPSAobXVsWzJdICogbXVsWzFdKSB8IDA7XG4gICAgcmVzID0gKHJlcyAqIG11bFtleHBvbmVudCAmIDNdKSB8IDA7XG4gICAgZXhwb25lbnQgPSBleHBvbmVudCA+PiAyO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfaW50X21hdGhfaW50NjRfcG93X3N0dWIgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfbXVsLCBjYW1sX2ludDY0X2lzX3plcm8sIGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpLCBjYW1sX2ludDY0X2xvMzJcbmZ1bmN0aW9uIEJhc2VfaW50X21hdGhfaW50NjRfcG93X3N0dWIoYmFzZSwgZXhwb25lbnQpIHtcbiAgdmFyIG9uZSA9IGNhbWxfaW50NjRfY3JlYXRlX2xvX2hpKDEsMCk7XG4gIHZhciBtdWwgPSBbb25lLCBiYXNlLCBvbmUsIG9uZV07XG4gIHZhciByZXMgPSBvbmU7XG4gIHdoaWxlICghY2FtbF9pbnQ2NF9pc196ZXJvKGV4cG9uZW50KSkge1xuICAgIG11bFsxXSA9IGNhbWxfaW50NjRfbXVsKG11bFsxXSwgbXVsWzNdKTtcbiAgICBtdWxbMl0gPSBjYW1sX2ludDY0X211bChtdWxbMV0sIG11bFsxXSk7XG4gICAgbXVsWzNdID0gY2FtbF9pbnQ2NF9tdWwobXVsWzJdLCBtdWxbMV0pO1xuICAgIHJlcyA9IGNhbWxfaW50NjRfbXVsKHJlcywgbXVsW2NhbWxfaW50NjRfbG8zMihleHBvbmVudCkgJiAzXSk7XG4gICAgZXhwb25lbnQgPSBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKGV4cG9uZW50LCAyKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG4vL1Byb3ZpZGVzOiBCYXNlX2hhc2hfc3RyaW5nIG11dGFibGVcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaFxuZnVuY3Rpb24gQmFzZV9oYXNoX3N0cmluZyhzKSB7XG4gIHJldHVybiBjYW1sX2hhc2goMSwxLDAscylcbn1cbi8vUHJvdmlkZXM6IEJhc2VfaGFzaF9kb3VibGUgY29uc3Rcbi8vUmVxdWlyZXM6IGNhbWxfaGFzaFxuZnVuY3Rpb24gQmFzZV9oYXNoX2RvdWJsZShkKSB7XG4gIHJldHVybiBjYW1sX2hhc2goMSwxLDAsZCk7XG59XG5cbi8vUHJvdmlkZXM6IEJhc2VfYW1fdGVzdGluZyBjb25zdFxuLy9XZWFrZGVmXG5mdW5jdGlvbiBCYXNlX2FtX3Rlc3RpbmcoeCkge1xuICByZXR1cm4gMDtcbn1cbiIsIlxuLy9Qcm92aWRlczogTWxNdXRleFxuZnVuY3Rpb24gTWxNdXRleCgpIHtcbiAgdGhpcy5sb2NrZWQgPSBmYWxzZVxufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X25ld1xuLy9SZXF1aXJlczogTWxNdXRleFxuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF9uZXcodW5pdCkge1xuICByZXR1cm4gbmV3IE1sTXV0ZXgoKTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9tbF9tdXRleF9sb2NrXG4vL1JlcXVpcmVzOiBjYW1sX2ZhaWx3aXRoXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X2xvY2sodCkge1xuICBpZih0LmxvY2tlZClcbiAgICBjYW1sX2ZhaWx3aXRoKFwiTXV0ZXgubG9jazogbXV0ZXggYWxyZWFkeSBsb2NrZWQuIENhbm5vdCB3YWl0LlwiKTtcbiAgZWxzZSB0LmxvY2tlZCA9IHRydWU7XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X3RyeV9sb2NrXG5mdW5jdGlvbiBjYW1sX21sX211dGV4X3RyeV9sb2NrKHQpIHtcbiAgaWYoIXQubG9ja2VkKSB7XG4gICAgdC5sb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX21sX211dGV4X3VubG9ja1xuZnVuY3Rpb24gY2FtbF9tbF9tdXRleF91bmxvY2sodCkge1xuICB0LmxvY2tlZCA9IGZhbHNlO1xuICByZXR1cm4gMDtcbn1cbiIsIi8vIEpzX29mX29jYW1sIHJ1bnRpbWUgc3VwcG9ydFxuLy8gaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbi8vIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuLy8gTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4vL1xuLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbi8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuLy8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbi8vIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbi8vXG4vLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbi8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4vLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4vLyBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbi8vXG4vLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Vcbi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4vLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuXG4vLyBXZWFrIEFQSVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxudmFyIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ID0gM1xuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbnZhciBjYW1sX2VwaGVfZGF0YV9vZmZzZXQgPSAyXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9zZXRfa2V5XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2tleSh4LCBpLCB2KSB7XG4gIGlmKGkgPCAwIHx8IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaSA+PSB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiV2Vhay5zZXRcIik7XG4gIGlmICh2IGluc3RhbmNlb2YgT2JqZWN0ICYmIGdsb2JhbFRoaXMuV2Vha1JlZikge1xuICAgIGlmKHhbMV0ucmVnaXN0ZXIpIHhbMV0ucmVnaXN0ZXIodiwgdW5kZWZpbmVkLCB2KTtcbiAgICB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gPSBuZXcgZ2xvYmFsVGhpcy5XZWFrUmVmKHYpO1xuICB9XG4gIGVsc2UgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdjtcbiAgcmV0dXJuIDBcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX3Vuc2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9pbnZhbGlkX2FyZ3VtZW50LCBjYW1sX2VwaGVfa2V5X29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX3Vuc2V0X2tleSh4LCBpKSB7XG4gIGlmKGkgPCAwIHx8IGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaSA+PSB4Lmxlbmd0aClcbiAgICBjYW1sX2ludmFsaWRfYXJndW1lbnQgKFwiV2Vhay5zZXRcIik7XG4gIGlmKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV0gaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYgJiYgeFsxXS51bnJlZ2lzdGVyKSB7XG4gICAgdmFyIG9sZCA9IHhbY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpXS5kZXJlZigpO1xuICAgIGlmKG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY291bnQgPSAwXG4gICAgICBmb3IodmFyIGogPSBjYW1sX2VwaGVfa2V5X29mZnNldDsgaiA8IHgubGVuZ3RoOyBqKyspe1xuICAgICAgICB2YXIga2V5ID0geFtqXTtcbiAgICAgICAgaWYoa2V5IGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKXtcbiAgICAgICAgICBrZXkgPSBrZXkuZGVyZWYoKVxuICAgICAgICAgIGlmKGtleSA9PT0gb2xkKSBjb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihjb3VudCA9PSAxKSB4WzFdLnVucmVnaXN0ZXIob2xkKTtcbiAgICB9XG4gIH1cbiAgeFtjYW1sX2VwaGVfa2V5X29mZnNldCArIGldID0gdW5kZWZpbmVkO1xuICByZXR1cm4gMFxufVxuXG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9jcmVhdGVcbi8vUmVxdWlyZXM6IGNhbWxfd2Vha19jcmVhdGUsIGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2NyZWF0ZSAobikge1xuICB2YXIgeCA9IGNhbWxfd2Vha19jcmVhdGUobik7XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfY3JlYXRlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldCwgY2FtbF9pbnZhbGlkX2FyZ3VtZW50LGNhbWxfZXBoZV9kYXRhX29mZnNldFxuZnVuY3Rpb24gY2FtbF93ZWFrX2NyZWF0ZSAobikge1xuICBpZiAobiA8IDApIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLmNyZWF0ZVwiKTtcbiAgdmFyIHggPSBbMjUxLFwiY2FtbF9lcGhlX2xpc3RfaGVhZFwiXTtcbiAgeC5sZW5ndGggPSBjYW1sX2VwaGVfa2V5X29mZnNldCArIG47XG4gIHJldHVybiB4O1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX3dlYWtfc2V0XG4vL1JlcXVpcmVzOiBjYW1sX2ludmFsaWRfYXJndW1lbnRcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9zZXRfa2V5LCBjYW1sX2VwaGVfdW5zZXRfa2V5XG5mdW5jdGlvbiBjYW1sX3dlYWtfc2V0KHgsIGksIHYpIHtcbiAgaWYodiA9PSAwKSBjYW1sX2VwaGVfdW5zZXRfa2V5KHgsaSlcbiAgZWxzZSBjYW1sX2VwaGVfc2V0X2tleSh4LGksdlsxXSlcbiAgcmV0dXJuIDA7XG59XG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZ2V0X2tleVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2tleV9vZmZzZXQsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9BbGlhczogY2FtbF93ZWFrX2dldFxuZnVuY3Rpb24gY2FtbF9lcGhlX2dldF9rZXkoeCwgaSkge1xuICBpZihpIDwgMCB8fCBjYW1sX2VwaGVfa2V5X29mZnNldCArIGkgPj0geC5sZW5ndGgpXG4gICAgY2FtbF9pbnZhbGlkX2FyZ3VtZW50IChcIldlYWsuZ2V0X2tleVwiKTtcbiAgdmFyIHdlYWsgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaSBdO1xuICBpZihnbG9iYWxUaGlzLldlYWtSZWYgJiYgd2VhayBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuV2Vha1JlZikgd2VhayA9IHdlYWsuZGVyZWYoKTtcbiAgcmV0dXJuICh3ZWFrPT09dW5kZWZpbmVkKT8wOlswLCB3ZWFrXTtcbn1cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfa2V5X2NvcHlcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9nZXRfa2V5LGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX29ial9kdXAsIGNhbWxfaW52YWxpZF9hcmd1bWVudFxuLy9BbGlhczogY2FtbF93ZWFrX2dldF9jb3B5XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2tleV9jb3B5KHgsIGkpIHtcbiAgaWYoaSA8IDAgfHwgY2FtbF9lcGhlX2tleV9vZmZzZXQgKyBpID49IHgubGVuZ3RoKVxuICAgIGNhbWxfaW52YWxpZF9hcmd1bWVudCAoXCJXZWFrLmdldF9jb3B5XCIpO1xuICB2YXIgeSA9IGNhbWxfZXBoZV9nZXRfa2V5KHgsIGkpO1xuICBpZiAoeSA9PT0gMCkgcmV0dXJuIHk7XG4gIHZhciB6ID0geVsxXTtcbiAgaWYgKHogaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIFswLCBjYW1sX29ial9kdXAoeildO1xuICByZXR1cm4geTtcbn1cblxuLy9Qcm92aWRlczogY2FtbF9lcGhlX2NoZWNrX2tleSBtdXRhYmxlXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9BbGlhczogY2FtbF93ZWFrX2NoZWNrXG5mdW5jdGlvbiBjYW1sX2VwaGVfY2hlY2tfa2V5KHgsIGkpIHtcbiAgdmFyIHdlYWsgPSB4W2NhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaV07XG4gIGlmKGdsb2JhbFRoaXMuV2Vha1JlZiAmJiB3ZWFrIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5XZWFrUmVmKSB3ZWFrID0gd2Vhay5kZXJlZigpO1xuICBpZih3ZWFrPT09dW5kZWZpbmVkKVxuICAgIHJldHVybiAwO1xuICBlbHNlXG4gICAgcmV0dXJuIDE7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2tleVxuLy9SZXF1aXJlczogY2FtbF9hcnJheV9ibGl0XG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfa2V5X29mZnNldFxuLy9BbGlhczogY2FtbF93ZWFrX2JsaXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9ibGl0X2tleShhMSwgaTEsIGEyLCBpMiwgbGVuKSB7XG4gIC8vIG1pbnVzIG9uZSBiZWNhdXNlIGNhbWxfYXJyYXlfYmxpdCB3b3JrcyBvbiBvY2FtbCBhcnJheVxuICBjYW1sX2FycmF5X2JsaXQoYTEsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTEgLSAxLFxuICAgICAgICAgICAgICAgICAgYTIsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0ICsgaTIgLSAxLFxuICAgICAgICAgICAgICAgICAgbGVuKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9ibGl0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX3NldF9kYXRhLCBjYW1sX2VwaGVfdW5zZXRfZGF0YVxuZnVuY3Rpb24gY2FtbF9lcGhlX2JsaXRfZGF0YShzcmMsIGRzdCl7XG4gIHZhciBuID0gc3JjW2NhbWxfZXBoZV9kYXRhX29mZnNldF07XG4gIGlmKG4gPT09IHVuZGVmaW5lZCkgY2FtbF9lcGhlX3Vuc2V0X2RhdGEoZHN0KTtcbiAgZWxzZSBjYW1sX2VwaGVfc2V0X2RhdGEoZHN0LCBuKTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9nZXRfZGF0YVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfZ2V0X2RhdGEoeCl7XG4gIGlmKHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiAwO1xuICBlbHNlXG4gICAgcmV0dXJuIFswLCB4W2NhbWxfZXBoZV9kYXRhX29mZnNldF1dO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfZ2V0X2RhdGFfY29weVxuLy9SZXF1aXJlczogY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XG4vL1JlcXVpcmVzOiBjYW1sX29ial9kdXBcbmZ1bmN0aW9uIGNhbWxfZXBoZV9nZXRfZGF0YV9jb3B5KHgpe1xuICBpZih4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gMDtcbiAgZWxzZVxuICAgIHJldHVybiBbMCwgY2FtbF9vYmpfZHVwKHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSldO1xufVxuXG4vL1Byb3ZpZGVzOiBjYW1sX2VwaGVfc2V0X2RhdGFcbi8vUmVxdWlyZXM6IGNhbWxfZXBoZV9kYXRhX29mZnNldCwgY2FtbF9lcGhlX2tleV9vZmZzZXQsIGNhbWxfZXBoZV91bnNldF9kYXRhXG5mdW5jdGlvbiBjYW1sX2VwaGVfc2V0X2RhdGEoeCwgZGF0YSl7XG4gIGlmKGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkgJiYgZ2xvYmFsVGhpcy5XZWFrUmVmKSB7XG4gICAgaWYoISAoeFsxXSBpbnN0YW5jZW9mIGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkpKSB7XG4gICAgICB4WzFdID0gbmV3IGdsb2JhbFRoaXMuRmluYWxpemF0aW9uUmVnaXN0cnkoZnVuY3Rpb24gKCkgeyBjYW1sX2VwaGVfdW5zZXRfZGF0YSh4KSB9KTtcbiAgICAgIC8vcmVnaXN0ZXIgYWxsIGtleXNcbiAgICAgIGZvcih2YXIgaiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBqIDwgeC5sZW5ndGg7IGorKyl7XG4gICAgICAgIHZhciBrZXkgPSB4W2pdO1xuICAgICAgICBpZihrZXkgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuZGVyZWYoKTtcbiAgICAgICAgICBpZihrZXkpIHhbMV0ucmVnaXN0ZXIoa2V5LCB1bmRlZmluZWQsIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgeFtjYW1sX2VwaGVfZGF0YV9vZmZzZXRdID0gZGF0YTtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV91bnNldF9kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXQsIGNhbWxfZXBoZV9rZXlfb2Zmc2V0XG5mdW5jdGlvbiBjYW1sX2VwaGVfdW5zZXRfZGF0YSh4KXtcbiAgaWYoZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSAmJiBnbG9iYWxUaGlzLldlYWtSZWYpIHtcbiAgICBpZih4WzFdIGluc3RhbmNlb2YgZ2xvYmFsVGhpcy5GaW5hbGl6YXRpb25SZWdpc3RyeSl7XG4gICAgICAvL3VucmVnaXN0ZXIgYWxsIGtleXNcbiAgICAgIGZvcih2YXIgaiA9IGNhbWxfZXBoZV9rZXlfb2Zmc2V0OyBqIDwgeC5sZW5ndGg7IGorKyl7XG4gICAgICAgIHZhciBrZXkgPSB4W2pdO1xuICAgICAgICBpZihrZXkgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLldlYWtSZWYpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuZGVyZWYoKTtcbiAgICAgICAgICBpZihrZXkpIHhbMV0udW5yZWdpc3RlcihrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHhbY2FtbF9lcGhlX2RhdGFfb2Zmc2V0XSA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIDA7XG59XG5cbi8vUHJvdmlkZXM6IGNhbWxfZXBoZV9jaGVja19kYXRhXG4vL1JlcXVpcmVzOiBjYW1sX2VwaGVfZGF0YV9vZmZzZXRcbmZ1bmN0aW9uIGNhbWxfZXBoZV9jaGVja19kYXRhKHgpe1xuICBpZih4W2NhbWxfZXBoZV9kYXRhX29mZnNldF0gPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gMDtcbiAgZWxzZVxuICAgIHJldHVybiAxO1xufVxuIiwiXG4vL1Byb3ZpZGVzOiBjYW1sX2x4bV9uZXh0XG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X3NoaWZ0X2xlZnRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfc2hpZnRfcmlnaHRfdW5zaWduZWRcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb3Jcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfeG9yXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X2FkZFxuLy9SZXF1aXJlczogY2FtbF9pbnQ2NF9tdWxcbi8vUmVxdWlyZXM6IGNhbWxfYmFfZ2V0XzFcbi8vUmVxdWlyZXM6IGNhbWxfYmFfc2V0XzFcbi8vUmVxdWlyZXM6IGNhbWxfaW50NjRfb2Zfc3RyaW5nXG4vL1JlcXVpcmVzOiBjYW1sX25ld19zdHJpbmdcbmZ1bmN0aW9uIGNhbWxfbHhtX25leHQodikge1xuICBmdW5jdGlvbiBzaGlmdF9sKHgsIGspe1xuICAgIHJldHVybiBjYW1sX2ludDY0X3NoaWZ0X2xlZnQoeCxrKTtcbiAgfVxuICBmdW5jdGlvbiBzaGlmdF9yKHgsIGspe1xuICAgIHJldHVybiBjYW1sX2ludDY0X3NoaWZ0X3JpZ2h0X3Vuc2lnbmVkKHgsayk7XG4gIH1cbiAgZnVuY3Rpb24gb3IoYSwgYil7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfb3IoYSxiKTtcbiAgfVxuICBmdW5jdGlvbiB4b3IoYSwgYil7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfeG9yKGEsYik7XG4gIH1cbiAgZnVuY3Rpb24gYWRkKGEsIGIpe1xuICAgIHJldHVybiBjYW1sX2ludDY0X2FkZChhLGIpO1xuICB9XG4gIGZ1bmN0aW9uIG11bChhLCBiKXtcbiAgICByZXR1cm4gY2FtbF9pbnQ2NF9tdWwoYSxiKTtcbiAgfVxuICBmdW5jdGlvbiByb3RsKHgsIGspIHtcbiAgICByZXR1cm4gb3Ioc2hpZnRfbCh4LGspLHNoaWZ0X3IgKHgsIDY0IC0gaykpO1xuICB9XG4gIGZ1bmN0aW9uIGdldChhLCBpKSB7XG4gICAgcmV0dXJuIGNhbWxfYmFfZ2V0XzEoYSwgaSk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0KGEsIGksIHgpIHtcbiAgICByZXR1cm4gY2FtbF9iYV9zZXRfMShhLCBpLCB4KTtcbiAgfVxuICB2YXIgTSA9IGNhbWxfaW50NjRfb2Zfc3RyaW5nKGNhbWxfbmV3X3N0cmluZyhcIjB4ZDEzNDI1NDNkZTgyZWY5NVwiKSk7XG4gIHZhciBkYWJhID0gY2FtbF9pbnQ2NF9vZl9zdHJpbmcoY2FtbF9uZXdfc3RyaW5nKFwiMHhkYWJhMGI2ZWIwOTMyMmUzXCIpKTtcbiAgdmFyIHosIHEwLCBxMTtcbiAgdmFyIHN0ID0gdjtcbiAgdmFyIGEgPSBnZXQoc3QsMCk7XG4gIHZhciBzID0gZ2V0KHN0LDEpO1xuICB2YXIgeDAgPSBnZXQoc3QsMik7XG4gIHZhciB4MSA9IGdldChzdCwzKTtcbiAgLyogQ29tYmluaW5nIG9wZXJhdGlvbiAqL1xuICB6ID0gYWRkKHMsIHgwKTtcbiAgLyogTWl4aW5nIGZ1bmN0aW9uICovXG4gIHogPSBtdWwoeG9yKHosc2hpZnRfcih6LDMyKSksIGRhYmEpO1xuICB6ID0gbXVsKHhvcih6LHNoaWZ0X3IoeiwzMikpLCBkYWJhKTtcbiAgeiA9IHhvcih6LHNoaWZ0X3IoeiwzMikpO1xuICAvKiBMQ0cgdXBkYXRlICovXG4gIHNldChzdCwgMSwgYWRkIChtdWwocyxNKSwgYSkpO1xuICAvKiBYQkcgdXBkYXRlICovXG4gIHZhciBxMCA9IHgwXG4gIHZhciBxMSA9IHgxXG4gIHExID0geG9yKHExLHEwKTtcbiAgcTAgPSByb3RsKHEwLCAyNCk7XG4gIHEwID0geG9yKHhvcihxMCwgcTEpLCAoc2hpZnRfbChxMSwxNikpKTtcbiAgcTEgPSByb3RsKHExLCAzNyk7XG4gIHNldChzdCwgMiwgcTApO1xuICBzZXQoc3QsIDMsIHExKTtcbiAgLyogUmV0dXJuIHJlc3VsdCAqL1xuICByZXR1cm4gejtcbn1cbiIsIlxuLy9Qcm92aWRlczogenN0ZF9kZWNvbXByZXNzXG52YXIgenN0ZF9kZWNvbXByZXNzID0gKGZ1bmN0aW9uICgpIHtcblwidXNlIHN0cmljdFwiO1xuLy8gYWxpYXNlcyBmb3Igc2hvcnRlciBjb21wcmVzc2VkIGNvZGUgKG1vc3QgbWluaWZlcnMgZG9uJ3QgZG8gdGhpcylcbnZhciBhYiA9IEFycmF5QnVmZmVyLCB1OCA9IFVpbnQ4QXJyYXksIHUxNiA9IFVpbnQxNkFycmF5LCBpMTYgPSBJbnQxNkFycmF5LCB1MzIgPSBVaW50MzJBcnJheSwgaTMyID0gSW50MzJBcnJheTtcbnZhciBzbGMgPSBmdW5jdGlvbiAodiwgcywgZSkge1xuICAgIGlmICh1OC5wcm90b3R5cGUuc2xpY2UpXG4gICAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuc2xpY2UuY2FsbCh2LCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKVxuICAgICAgICBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aClcbiAgICAgICAgZSA9IHYubGVuZ3RoO1xuICAgIHZhciBuID0gbmV3IHU4KGUgLSBzKTtcbiAgICBuLnNldCh2LnN1YmFycmF5KHMsIGUpKTtcbiAgICByZXR1cm4gbjtcbn07XG52YXIgZmlsbCA9IGZ1bmN0aW9uICh2LCBuLCBzLCBlKSB7XG4gICAgaWYgKHU4LnByb3RvdHlwZS5maWxsKVxuICAgICAgICByZXR1cm4gdTgucHJvdG90eXBlLmZpbGwuY2FsbCh2LCBuLCBzLCBlKTtcbiAgICBpZiAocyA9PSBudWxsIHx8IHMgPCAwKVxuICAgICAgICBzID0gMDtcbiAgICBpZiAoZSA9PSBudWxsIHx8IGUgPiB2Lmxlbmd0aClcbiAgICAgICAgZSA9IHYubGVuZ3RoO1xuICAgIGZvciAoOyBzIDwgZTsgKytzKVxuICAgICAgICB2W3NdID0gbjtcbiAgICByZXR1cm4gdjtcbn07XG52YXIgY3B3ID0gZnVuY3Rpb24gKHYsIHQsIHMsIGUpIHtcbiAgICBpZiAodTgucHJvdG90eXBlLmNvcHlXaXRoaW4pXG4gICAgICAgIHJldHVybiB1OC5wcm90b3R5cGUuY29weVdpdGhpbi5jYWxsKHYsIHQsIHMsIGUpO1xuICAgIGlmIChzID09IG51bGwgfHwgcyA8IDApXG4gICAgICAgIHMgPSAwO1xuICAgIGlmIChlID09IG51bGwgfHwgZSA+IHYubGVuZ3RoKVxuICAgICAgICBlID0gdi5sZW5ndGg7XG4gICAgd2hpbGUgKHMgPCBlKSB7XG4gICAgICAgIHZbdCsrXSA9IHZbcysrXTtcbiAgICB9XG59O1xuLyoqXG4gKiBDb2RlcyBmb3IgZXJyb3JzIGdlbmVyYXRlZCB3aXRoaW4gdGhpcyBsaWJyYXJ5XG4gKi9cbi8vIGVycm9yIGNvZGVzXG52YXIgZWMgPSBbXG4gICAgJ2ludmFsaWQgenN0ZCBkYXRhJyxcbiAgICAnd2luZG93IHNpemUgdG9vIGxhcmdlICg+MjA0Nk1CKScsXG4gICAgJ2ludmFsaWQgYmxvY2sgdHlwZScsXG4gICAgJ0ZTRSBhY2N1cmFjeSB0b28gaGlnaCcsXG4gICAgJ21hdGNoIGRpc3RhbmNlIHRvbyBmYXIgYmFjaycsXG4gICAgJ3VuZXhwZWN0ZWQgRU9GJ1xuXTtcbjtcbnZhciBlcnIgPSBmdW5jdGlvbiAoaW5kLCBtc2csIG50KSB7XG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnIHx8IGVjW2luZF0pO1xuICAgIGUuY29kZSA9IGluZDtcbiAgICBpZiAoIW50KVxuICAgICAgICB0aHJvdyBlO1xuICAgIHJldHVybiBlO1xufTtcbnZhciByYiA9IGZ1bmN0aW9uIChkLCBiLCBuKSB7XG4gICAgdmFyIGkgPSAwLCBvID0gMDtcbiAgICBmb3IgKDsgaSA8IG47ICsraSlcbiAgICAgICAgbyB8PSBkW2IrK10gPDwgKGkgPDwgMyk7XG4gICAgcmV0dXJuIG87XG59O1xudmFyIGI0ID0gZnVuY3Rpb24gKGQsIGIpIHsgcmV0dXJuIChkW2JdIHwgKGRbYiArIDFdIDw8IDgpIHwgKGRbYiArIDJdIDw8IDE2KSB8IChkW2IgKyAzXSA8PCAyNCkpID4+PiAwOyB9O1xuLy8gcmVhZCBac3RhbmRhcmQgZnJhbWUgaGVhZGVyXG52YXIgcnpmaCA9IGZ1bmN0aW9uIChkYXQsIHcpIHtcbiAgICB2YXIgbjMgPSBkYXRbMF0gfCAoZGF0WzFdIDw8IDgpIHwgKGRhdFsyXSA8PCAxNik7XG4gICAgaWYgKG4zID09IDB4MkZCNTI4ICYmIGRhdFszXSA9PSAyNTMpIHtcbiAgICAgICAgLy8gWnN0YW5kYXJkXG4gICAgICAgIHZhciBmbGcgPSBkYXRbNF07XG4gICAgICAgIC8vICAgIHNpbmdsZSBzZWdtZW50ICAgICAgIGNoZWNrc3VtICAgICAgICAgICAgIGRpY3QgZmxhZyAgICAgZnJhbWUgY29udGVudCBmbGFnXG4gICAgICAgIHZhciBzcyA9IChmbGcgPj4gNSkgJiAxLCBjYyA9IChmbGcgPj4gMikgJiAxLCBkZiA9IGZsZyAmIDMsIGZjZiA9IGZsZyA+PiA2O1xuICAgICAgICBpZiAoZmxnICYgOClcbiAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgLy8gYnl0ZVxuICAgICAgICB2YXIgYnQgPSA2IC0gc3M7XG4gICAgICAgIC8vIGRpY3QgYnl0ZXNcbiAgICAgICAgdmFyIGRiID0gZGYgPT0gMyA/IDQgOiBkZjtcbiAgICAgICAgLy8gZGljdGlvbmFyeSBpZFxuICAgICAgICB2YXIgZGkgPSByYihkYXQsIGJ0LCBkYik7XG4gICAgICAgIGJ0ICs9IGRiO1xuICAgICAgICAvLyBmcmFtZSBzaXplIGJ5dGVzXG4gICAgICAgIHZhciBmc2IgPSBmY2YgPyAoMSA8PCBmY2YpIDogc3M7XG4gICAgICAgIC8vIGZyYW1lIHNvdXJjZSBzaXplXG4gICAgICAgIHZhciBmc3MgPSByYihkYXQsIGJ0LCBmc2IpICsgKChmY2YgPT0gMSkgJiYgMjU2KTtcbiAgICAgICAgLy8gd2luZG93IHNpemVcbiAgICAgICAgdmFyIHdzID0gZnNzO1xuICAgICAgICBpZiAoIXNzKSB7XG4gICAgICAgICAgICAvLyB3aW5kb3cgZGVzY3JpcHRvclxuICAgICAgICAgICAgdmFyIHdiID0gMSA8PCAoMTAgKyAoZGF0WzVdID4+IDMpKTtcbiAgICAgICAgICAgIHdzID0gd2IgKyAod2IgPj4gMykgKiAoZGF0WzVdICYgNyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdzID4gMjE0NTM4NjQ5NilcbiAgICAgICAgICAgIGVycigxKTtcbiAgICAgICAgdmFyIGJ1ZiA9IG5ldyB1OCgodyA9PSAxID8gKGZzcyB8fCB3cykgOiB3ID8gMCA6IHdzKSArIDEyKTtcbiAgICAgICAgYnVmWzBdID0gMSwgYnVmWzRdID0gNCwgYnVmWzhdID0gODtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGI6IGJ0ICsgZnNiLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIGw6IDAsXG4gICAgICAgICAgICBkOiBkaSxcbiAgICAgICAgICAgIHc6ICh3ICYmIHcgIT0gMSkgPyB3IDogYnVmLnN1YmFycmF5KDEyKSxcbiAgICAgICAgICAgIGU6IHdzLFxuICAgICAgICAgICAgbzogbmV3IGkzMihidWYuYnVmZmVyLCAwLCAzKSxcbiAgICAgICAgICAgIHU6IGZzcyxcbiAgICAgICAgICAgIGM6IGNjLFxuICAgICAgICAgICAgbTogTWF0aC5taW4oMTMxMDcyLCB3cylcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoKChuMyA+PiA0KSB8IChkYXRbM10gPDwgMjApKSA9PSAweDE4NEQyQTUpIHtcbiAgICAgICAgLy8gc2tpcHBhYmxlXG4gICAgICAgIHJldHVybiBiNChkYXQsIDQpICsgODtcbiAgICB9XG4gICAgZXJyKDApO1xufTtcbi8vIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZvciBub256ZXJvXG52YXIgbXNiID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBiaXRzID0gMDtcbiAgICBmb3IgKDsgKDEgPDwgYml0cykgPD0gdmFsOyArK2JpdHMpXG4gICAgICAgIDtcbiAgICByZXR1cm4gYml0cyAtIDE7XG59O1xuLy8gcmVhZCBmaW5pdGUgc3RhdGUgZW50cm9weVxudmFyIHJmc2UgPSBmdW5jdGlvbiAoZGF0LCBidCwgbWFsKSB7XG4gICAgLy8gdGFibGUgcG9zXG4gICAgdmFyIHRwb3MgPSAoYnQgPDwgMykgKyA0O1xuICAgIC8vIGFjY3VyYWN5IGxvZ1xuICAgIHZhciBhbCA9IChkYXRbYnRdICYgMTUpICsgNTtcbiAgICBpZiAoYWwgPiBtYWwpXG4gICAgICAgIGVycigzKTtcbiAgICAvLyBzaXplXG4gICAgdmFyIHN6ID0gMSA8PCBhbDtcbiAgICAvLyBwcm9iYWJpbGl0aWVzIHN5bWJvbHMgIHJlcGVhdCAgIGluZGV4ICAgaGlnaCB0aHJlc2hvbGRcbiAgICB2YXIgcHJvYnMgPSBzeiwgc3ltID0gLTEsIHJlID0gLTEsIGkgPSAtMSwgaHQgPSBzejtcbiAgICAvLyBvcHRpbWl6YXRpb246IHNpbmdsZSBhbGxvY2F0aW9uIGlzIG11Y2ggZmFzdGVyXG4gICAgdmFyIGJ1ZiA9IG5ldyBhYig1MTIgKyAoc3ogPDwgMikpO1xuICAgIHZhciBmcmVxID0gbmV3IGkxNihidWYsIDAsIDI1Nik7XG4gICAgLy8gc2FtZSB2aWV3IGFzIGZyZXFcbiAgICB2YXIgZHN0YXRlID0gbmV3IHUxNihidWYsIDAsIDI1Nik7XG4gICAgdmFyIG5zdGF0ZSA9IG5ldyB1MTYoYnVmLCA1MTIsIHN6KTtcbiAgICB2YXIgYmIxID0gNTEyICsgKHN6IDw8IDEpO1xuICAgIHZhciBzeW1zID0gbmV3IHU4KGJ1ZiwgYmIxLCBzeik7XG4gICAgdmFyIG5iaXRzID0gbmV3IHU4KGJ1ZiwgYmIxICsgc3opO1xuICAgIHdoaWxlIChzeW0gPCAyNTUgJiYgcHJvYnMgPiAwKSB7XG4gICAgICAgIHZhciBiaXRzID0gbXNiKHByb2JzICsgMSk7XG4gICAgICAgIHZhciBjYnQgPSB0cG9zID4+IDM7XG4gICAgICAgIC8vIG1hc2tcbiAgICAgICAgdmFyIG1zayA9ICgxIDw8IChiaXRzICsgMSkpIC0gMTtcbiAgICAgICAgdmFyIHZhbCA9ICgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikpID4+ICh0cG9zICYgNykpICYgbXNrO1xuICAgICAgICAvLyBtYXNrICgxIGZld2VyIGJpdClcbiAgICAgICAgdmFyIG1zazFmYiA9ICgxIDw8IGJpdHMpIC0gMTtcbiAgICAgICAgLy8gbWF4IHNtYWxsIHZhbHVlXG4gICAgICAgIHZhciBtc3YgPSBtc2sgLSBwcm9icyAtIDE7XG4gICAgICAgIC8vIHNtYWxsIHZhbHVlXG4gICAgICAgIHZhciBzdmFsID0gdmFsICYgbXNrMWZiO1xuICAgICAgICBpZiAoc3ZhbCA8IG1zdilcbiAgICAgICAgICAgIHRwb3MgKz0gYml0cywgdmFsID0gc3ZhbDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cG9zICs9IGJpdHMgKyAxO1xuICAgICAgICAgICAgaWYgKHZhbCA+IG1zazFmYilcbiAgICAgICAgICAgICAgICB2YWwgLT0gbXN2O1xuICAgICAgICB9XG4gICAgICAgIGZyZXFbKytzeW1dID0gLS12YWw7XG4gICAgICAgIGlmICh2YWwgPT0gLTEpIHtcbiAgICAgICAgICAgIHByb2JzICs9IHZhbDtcbiAgICAgICAgICAgIHN5bXNbLS1odF0gPSBzeW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcHJvYnMgLT0gdmFsO1xuICAgICAgICBpZiAoIXZhbCkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIC8vIHJlcGVhdCBieXRlXG4gICAgICAgICAgICAgICAgdmFyIHJidCA9IHRwb3MgPj4gMztcbiAgICAgICAgICAgICAgICByZSA9ICgoZGF0W3JidF0gfCAoZGF0W3JidCArIDFdIDw8IDgpKSA+PiAodHBvcyAmIDcpKSAmIDM7XG4gICAgICAgICAgICAgICAgdHBvcyArPSAyO1xuICAgICAgICAgICAgICAgIHN5bSArPSByZTtcbiAgICAgICAgICAgIH0gd2hpbGUgKHJlID09IDMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzeW0gPiAyNTUgfHwgcHJvYnMpXG4gICAgICAgIGVycigwKTtcbiAgICB2YXIgc3ltcG9zID0gMDtcbiAgICAvLyBzeW0gc3RlcCAoY29wcmltZSB3aXRoIHN6IC0gZm9ybXVsYSBmcm9tIHpzdGQgc291cmNlKVxuICAgIHZhciBzc3RlcCA9IChzeiA+PiAxKSArIChzeiA+PiAzKSArIDM7XG4gICAgLy8gc3ltIG1hc2tcbiAgICB2YXIgc21hc2sgPSBzeiAtIDE7XG4gICAgZm9yICh2YXIgcyA9IDA7IHMgPD0gc3ltOyArK3MpIHtcbiAgICAgICAgdmFyIHNmID0gZnJlcVtzXTtcbiAgICAgICAgaWYgKHNmIDwgMSkge1xuICAgICAgICAgICAgZHN0YXRlW3NdID0gLXNmO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBpcyBzcGxpdCBpbnRvIHR3byBsb29wcyBpbiB6c3RkIHRvIGF2b2lkIGJyYW5jaGluZywgYnV0IGFzIEpTIGlzIGhpZ2hlci1sZXZlbCB0aGF0IGlzIHVubmVjZXNzYXJ5XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzZjsgKytpKSB7XG4gICAgICAgICAgICBzeW1zW3N5bXBvc10gPSBzO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHN5bXBvcyA9IChzeW1wb3MgKyBzc3RlcCkgJiBzbWFzaztcbiAgICAgICAgICAgIH0gd2hpbGUgKHN5bXBvcyA+PSBodCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQWZ0ZXIgc3ByZWFkaW5nIHN5bWJvbHMsIHNob3VsZCBiZSB6ZXJvIGFnYWluXG4gICAgaWYgKHN5bXBvcylcbiAgICAgICAgZXJyKDApO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzejsgKytpKSB7XG4gICAgICAgIC8vIG5leHQgc3RhdGVcbiAgICAgICAgdmFyIG5zID0gZHN0YXRlW3N5bXNbaV1dKys7XG4gICAgICAgIC8vIG51bSBiaXRzXG4gICAgICAgIHZhciBuYiA9IG5iaXRzW2ldID0gYWwgLSBtc2IobnMpO1xuICAgICAgICBuc3RhdGVbaV0gPSAobnMgPDwgbmIpIC0gc3o7XG4gICAgfVxuICAgIHJldHVybiBbKHRwb3MgKyA3KSA+PiAzLCB7XG4gICAgICAgICAgICBiOiBhbCxcbiAgICAgICAgICAgIHM6IHN5bXMsXG4gICAgICAgICAgICBuOiBuYml0cyxcbiAgICAgICAgICAgIHQ6IG5zdGF0ZVxuICAgICAgICB9XTtcbn07XG4vLyByZWFkIGh1ZmZtYW5cbnZhciByaHUgPSBmdW5jdGlvbiAoZGF0LCBidCkge1xuICAgIC8vICBpbmRleCAgd2VpZ2h0IGNvdW50XG4gICAgdmFyIGkgPSAwLCB3YyA9IC0xO1xuICAgIC8vICAgIGJ1ZmZlciAgICAgICAgICAgICBoZWFkZXIgYnl0ZVxuICAgIHZhciBidWYgPSBuZXcgdTgoMjkyKSwgaGIgPSBkYXRbYnRdO1xuICAgIC8vIGh1ZmZtYW4gd2VpZ2h0c1xuICAgIHZhciBodyA9IGJ1Zi5zdWJhcnJheSgwLCAyNTYpO1xuICAgIC8vIHJhbmsgY291bnRcbiAgICB2YXIgcmMgPSBidWYuc3ViYXJyYXkoMjU2LCAyNjgpO1xuICAgIC8vIHJhbmsgaW5kZXhcbiAgICB2YXIgcmkgPSBuZXcgdTE2KGJ1Zi5idWZmZXIsIDI2OCk7XG4gICAgLy8gTk9URTogYXQgdGhpcyBwb2ludCBidCBpcyAxIGxlc3MgdGhhbiBleHBlY3RlZFxuICAgIGlmIChoYiA8IDEyOCkge1xuICAgICAgICAvLyBlbmQgYnl0ZSwgZnNlIGRlY29kZSB0YWJsZVxuICAgICAgICB2YXIgX2EgPSByZnNlKGRhdCwgYnQgKyAxLCA2KSwgZWJ0ID0gX2FbMF0sIGZkdCA9IF9hWzFdO1xuICAgICAgICBidCArPSBoYjtcbiAgICAgICAgdmFyIGVwb3MgPSBlYnQgPDwgMztcbiAgICAgICAgLy8gbGFzdCBieXRlXG4gICAgICAgIHZhciBsYiA9IGRhdFtidF07XG4gICAgICAgIGlmICghbGIpXG4gICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgIC8vICBzdGF0ZTEgICBzdGF0ZTIgICBzdGF0ZTEgYml0cyAgIHN0YXRlMiBiaXRzXG4gICAgICAgIHZhciBzdDEgPSAwLCBzdDIgPSAwLCBidHIxID0gZmR0LmIsIGJ0cjIgPSBidHIxO1xuICAgICAgICAvLyBmc2UgcG9zXG4gICAgICAgIC8vIHByZS1pbmNyZW1lbnQgdG8gYWNjb3VudCBmb3Igb3JpZ2luYWwgZGVmaWNpdCBvZiAxXG4gICAgICAgIHZhciBmcG9zID0gKCsrYnQgPDwgMykgLSA4ICsgbXNiKGxiKTtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgZnBvcyAtPSBidHIxO1xuICAgICAgICAgICAgaWYgKGZwb3MgPCBlcG9zKVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgdmFyIGNidCA9IGZwb3MgPj4gMztcbiAgICAgICAgICAgIHN0MSArPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKGZwb3MgJiA3KSkgJiAoKDEgPDwgYnRyMSkgLSAxKTtcbiAgICAgICAgICAgIGh3Wysrd2NdID0gZmR0LnNbc3QxXTtcbiAgICAgICAgICAgIGZwb3MgLT0gYnRyMjtcbiAgICAgICAgICAgIGlmIChmcG9zIDwgZXBvcylcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNidCA9IGZwb3MgPj4gMztcbiAgICAgICAgICAgIHN0MiArPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKGZwb3MgJiA3KSkgJiAoKDEgPDwgYnRyMikgLSAxKTtcbiAgICAgICAgICAgIGh3Wysrd2NdID0gZmR0LnNbc3QyXTtcbiAgICAgICAgICAgIGJ0cjEgPSBmZHQubltzdDFdO1xuICAgICAgICAgICAgc3QxID0gZmR0LnRbc3QxXTtcbiAgICAgICAgICAgIGJ0cjIgPSBmZHQubltzdDJdO1xuICAgICAgICAgICAgc3QyID0gZmR0LnRbc3QyXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKyt3YyA+IDI1NSlcbiAgICAgICAgICAgIGVycigwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdjID0gaGIgLSAxMjc7XG4gICAgICAgIGZvciAoOyBpIDwgd2M7IGkgKz0gMikge1xuICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRbKytidF07XG4gICAgICAgICAgICBod1tpXSA9IGJ5dGUgPj4gNDtcbiAgICAgICAgICAgIGh3W2kgKyAxXSA9IGJ5dGUgJiAxNTtcbiAgICAgICAgfVxuICAgICAgICArK2J0O1xuICAgIH1cbiAgICAvLyB3ZWlnaHQgZXhwb25lbnRpYWwgc3VtXG4gICAgdmFyIHdlcyA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgICAgdmFyIHd0ID0gaHdbaV07XG4gICAgICAgIC8vIGJpdHMgbXVzdCBiZSBhdCBtb3N0IDExLCBzYW1lIGFzIHdlaWdodFxuICAgICAgICBpZiAod3QgPiAxMSlcbiAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgd2VzICs9IHd0ICYmICgxIDw8ICh3dCAtIDEpKTtcbiAgICB9XG4gICAgLy8gbWF4IGJpdHNcbiAgICB2YXIgbWIgPSBtc2Iod2VzKSArIDE7XG4gICAgLy8gdGFibGUgc2l6ZVxuICAgIHZhciB0cyA9IDEgPDwgbWI7XG4gICAgLy8gcmVtYWluaW5nIHN1bVxuICAgIHZhciByZW0gPSB0cyAtIHdlcztcbiAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDJcbiAgICBpZiAocmVtICYgKHJlbSAtIDEpKVxuICAgICAgICBlcnIoMCk7XG4gICAgaHdbd2MrK10gPSBtc2IocmVtKSArIDE7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgICAgdmFyIHd0ID0gaHdbaV07XG4gICAgICAgICsrcmNbaHdbaV0gPSB3dCAmJiAobWIgKyAxIC0gd3QpXTtcbiAgICB9XG4gICAgLy8gaHVmIGJ1ZlxuICAgIHZhciBoYnVmID0gbmV3IHU4KHRzIDw8IDEpO1xuICAgIC8vICAgIHN5bWJvbHMgICAgICAgICAgICAgICAgICAgICAgbnVtIGJpdHNcbiAgICB2YXIgc3ltcyA9IGhidWYuc3ViYXJyYXkoMCwgdHMpLCBuYiA9IGhidWYuc3ViYXJyYXkodHMpO1xuICAgIHJpW21iXSA9IDA7XG4gICAgZm9yIChpID0gbWI7IGkgPiAwOyAtLWkpIHtcbiAgICAgICAgdmFyIHB2ID0gcmlbaV07XG4gICAgICAgIGZpbGwobmIsIGksIHB2LCByaVtpIC0gMV0gPSBwdiArIHJjW2ldICogKDEgPDwgKG1iIC0gaSkpKTtcbiAgICB9XG4gICAgaWYgKHJpWzBdICE9IHRzKVxuICAgICAgICBlcnIoMCk7XG4gICAgZm9yIChpID0gMDsgaSA8IHdjOyArK2kpIHtcbiAgICAgICAgdmFyIGJpdHMgPSBod1tpXTtcbiAgICAgICAgaWYgKGJpdHMpIHtcbiAgICAgICAgICAgIHZhciBjb2RlID0gcmlbYml0c107XG4gICAgICAgICAgICBmaWxsKHN5bXMsIGksIGNvZGUsIHJpW2JpdHNdID0gY29kZSArICgxIDw8IChtYiAtIGJpdHMpKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtidCwge1xuICAgICAgICAgICAgbjogbmIsXG4gICAgICAgICAgICBiOiBtYixcbiAgICAgICAgICAgIHM6IHN5bXNcbiAgICAgICAgfV07XG59O1xuLy8gVGFibGVzIGdlbmVyYXRlZCB1c2luZyB0aGlzOlxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTAxYXJyb3d6L2E5Nzk0NTJkNDM1NTk5MmNiZjhmMjU3Y2JmZmM5ZWRkXG4vLyBkZWZhdWx0IGxpdGVyYWwgbGVuZ3RoIHRhYmxlXG52YXIgZGxsdCA9IC8qI19fUFVSRV9fKi8gcmZzZSgvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgODEsIDE2LCA5OSwgMTQwLCA0OSwgMTk4LCAyNCwgOTksIDEyLCAzMywgMTk2LCAyNCwgOTksIDEwMiwgMTAyLCAxMzQsIDcwLCAxNDYsIDRcbl0pLCAwLCA2KVsxXTtcbi8vIGRlZmF1bHQgbWF0Y2ggbGVuZ3RoIHRhYmxlXG52YXIgZG1sdCA9IC8qI19fUFVSRV9fKi8gcmZzZSgvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgMzMsIDIwLCAxOTYsIDI0LCA5OSwgMTQwLCAzMywgMTMyLCAxNiwgNjYsIDgsIDMzLCAxMzIsIDE2LCA2NiwgOCwgMzMsIDY4LCA2OCwgNjgsIDY4LCA2OCwgNjgsIDY4LCA2OCwgMzYsIDlcbl0pLCAwLCA2KVsxXTtcbi8vIGRlZmF1bHQgb2Zmc2V0IGNvZGUgdGFibGVcbnZhciBkb2N0ID0gLyojX19QVVJFX18gKi8gcmZzZSgvKiNfX1BVUkVfXyovIG5ldyB1OChbXG4gICAgMzIsIDEzMiwgMTYsIDY2LCAxMDIsIDcwLCA2OCwgNjgsIDY4LCA2OCwgMzYsIDczLCAyXG5dKSwgMCwgNSlbMV07XG4vLyBiaXRzIHRvIGJhc2VsaW5lXG52YXIgYjJibCA9IGZ1bmN0aW9uIChiLCBzKSB7XG4gICAgdmFyIGxlbiA9IGIubGVuZ3RoLCBibCA9IG5ldyBpMzIobGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIGJsW2ldID0gcztcbiAgICAgICAgcyArPSAxIDw8IGJbaV07XG4gICAgfVxuICAgIHJldHVybiBibDtcbn07XG4vLyBsaXRlcmFsIGxlbmd0aCBiaXRzXG52YXIgbGxiID0gLyojX19QVVJFX18gKi8gbmV3IHU4KCggLyojX19QVVJFX18gKi9uZXcgaTMyKFtcbiAgICAwLCAwLCAwLCAwLCAxNjg0MzAwOSwgNTA1Mjg3NzAsIDEzNDY3ODAyMCwgMjAyMDUwMDU3LCAyNjk0MjIwOTNcbl0pKS5idWZmZXIsIDAsIDM2KTtcbi8vIGxpdGVyYWwgbGVuZ3RoIGJhc2VsaW5lXG52YXIgbGxibCA9IC8qI19fUFVSRV9fICovIGIyYmwobGxiLCAwKTtcbi8vIG1hdGNoIGxlbmd0aCBiaXRzXG52YXIgbWxiID0gLyojX19QVVJFX18gKi8gbmV3IHU4KCggLyojX19QVVJFX18gKi9uZXcgaTMyKFtcbiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxNjg0MzAwOSwgNTA1Mjg3NzAsIDExNzc2OTIyMCwgMTg1MjA3MDQ4LCAyNTI1NzkwODQsIDE2XG5dKSkuYnVmZmVyLCAwLCA1Myk7XG4vLyBtYXRjaCBsZW5ndGggYmFzZWxpbmVcbnZhciBtbGJsID0gLyojX19QVVJFX18gKi8gYjJibChtbGIsIDMpO1xuLy8gZGVjb2RlIGh1ZmZtYW4gc3RyZWFtXG52YXIgZGh1ID0gZnVuY3Rpb24gKGRhdCwgb3V0LCBodSkge1xuICAgIHZhciBsZW4gPSBkYXQubGVuZ3RoLCBzcyA9IG91dC5sZW5ndGgsIGxiID0gZGF0W2xlbiAtIDFdLCBtc2sgPSAoMSA8PCBodS5iKSAtIDEsIGViID0gLWh1LmI7XG4gICAgaWYgKCFsYilcbiAgICAgICAgZXJyKDApO1xuICAgIHZhciBzdCA9IDAsIGJ0ciA9IGh1LmIsIHBvcyA9IChsZW4gPDwgMykgLSA4ICsgbXNiKGxiKSAtIGJ0ciwgaSA9IC0xO1xuICAgIGZvciAoOyBwb3MgPiBlYiAmJiBpIDwgc3M7KSB7XG4gICAgICAgIHZhciBjYnQgPSBwb3MgPj4gMztcbiAgICAgICAgdmFyIHZhbCA9IChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj4gKHBvcyAmIDcpO1xuICAgICAgICBzdCA9ICgoc3QgPDwgYnRyKSB8IHZhbCkgJiBtc2s7XG4gICAgICAgIG91dFsrK2ldID0gaHUuc1tzdF07XG4gICAgICAgIHBvcyAtPSAoYnRyID0gaHUubltzdF0pO1xuICAgIH1cbiAgICBpZiAocG9zICE9IGViIHx8IGkgKyAxICE9IHNzKVxuICAgICAgICBlcnIoMCk7XG59O1xuLy8gZGVjb2RlIGh1ZmZtYW4gc3RyZWFtIDR4XG4vLyBUT0RPOiB1c2Ugd29ya2VycyB0byBwYXJhbGxlbGl6ZVxudmFyIGRodTQgPSBmdW5jdGlvbiAoZGF0LCBvdXQsIGh1KSB7XG4gICAgdmFyIGJ0ID0gNjtcbiAgICB2YXIgc3MgPSBvdXQubGVuZ3RoLCBzejEgPSAoc3MgKyAzKSA+PiAyLCBzejIgPSBzejEgPDwgMSwgc3ozID0gc3oxICsgc3oyO1xuICAgIGRodShkYXQuc3ViYXJyYXkoYnQsIGJ0ICs9IGRhdFswXSB8IChkYXRbMV0gPDwgOCkpLCBvdXQuc3ViYXJyYXkoMCwgc3oxKSwgaHUpO1xuICAgIGRodShkYXQuc3ViYXJyYXkoYnQsIGJ0ICs9IGRhdFsyXSB8IChkYXRbM10gPDwgOCkpLCBvdXQuc3ViYXJyYXkoc3oxLCBzejIpLCBodSk7XG4gICAgZGh1KGRhdC5zdWJhcnJheShidCwgYnQgKz0gZGF0WzRdIHwgKGRhdFs1XSA8PCA4KSksIG91dC5zdWJhcnJheShzejIsIHN6MyksIGh1KTtcbiAgICBkaHUoZGF0LnN1YmFycmF5KGJ0KSwgb3V0LnN1YmFycmF5KHN6MyksIGh1KTtcbn07XG4vLyByZWFkIFpzdGFuZGFyZCBibG9ja1xudmFyIHJ6YiA9IGZ1bmN0aW9uIChkYXQsIHN0LCBvdXQpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGJ0ID0gc3QuYjtcbiAgICAvLyAgICBieXRlIDAgICAgICAgIGJsb2NrIHR5cGVcbiAgICB2YXIgYjAgPSBkYXRbYnRdLCBidHlwZSA9IChiMCA+PiAxKSAmIDM7XG4gICAgc3QubCA9IGIwICYgMTtcbiAgICB2YXIgc3ogPSAoYjAgPj4gMykgfCAoZGF0W2J0ICsgMV0gPDwgNSkgfCAoZGF0W2J0ICsgMl0gPDwgMTMpO1xuICAgIC8vIGVuZCBieXRlIGZvciBibG9ja1xuICAgIHZhciBlYnQgPSAoYnQgKz0gMykgKyBzejtcbiAgICBpZiAoYnR5cGUgPT0gMSkge1xuICAgICAgICBpZiAoYnQgPj0gZGF0Lmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc3QuYiA9IGJ0ICsgMTtcbiAgICAgICAgaWYgKG91dCkge1xuICAgICAgICAgICAgZmlsbChvdXQsIGRhdFtidF0sIHN0LnksIHN0LnkgKz0gc3opO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsbChuZXcgdTgoc3opLCBkYXRbYnRdKTtcbiAgICB9XG4gICAgaWYgKGVidCA+IGRhdC5sZW5ndGgpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoYnR5cGUgPT0gMCkge1xuICAgICAgICBzdC5iID0gZWJ0O1xuICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICBvdXQuc2V0KGRhdC5zdWJhcnJheShidCwgZWJ0KSwgc3QueSk7XG4gICAgICAgICAgICBzdC55ICs9IHN6O1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2xjKGRhdCwgYnQsIGVidCk7XG4gICAgfVxuICAgIGlmIChidHlwZSA9PSAyKSB7XG4gICAgICAgIC8vICAgIGJ5dGUgMyAgICAgICAgbGl0IGJ0eXBlICAgICBzaXplIGZvcm1hdFxuICAgICAgICB2YXIgYjMgPSBkYXRbYnRdLCBsYnQgPSBiMyAmIDMsIHNmID0gKGIzID4+IDIpICYgMztcbiAgICAgICAgLy8gbGl0IHNyYyBzaXplICBsaXQgY21wIHN6IDQgc3RyZWFtc1xuICAgICAgICB2YXIgbHNzID0gYjMgPj4gNCwgbGNzID0gMCwgczQgPSAwO1xuICAgICAgICBpZiAobGJ0IDwgMikge1xuICAgICAgICAgICAgaWYgKHNmICYgMSlcbiAgICAgICAgICAgICAgICBsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoc2YgJiAyKSAmJiAoZGF0WysrYnRdIDw8IDEyKSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbHNzID0gYjMgPj4gMztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gc2Y7XG4gICAgICAgICAgICBpZiAoc2YgPCAyKVxuICAgICAgICAgICAgICAgIGxzcyB8PSAoKGRhdFsrK2J0XSAmIDYzKSA8PCA0KSwgbGNzID0gKGRhdFtidF0gPj4gNikgfCAoZGF0WysrYnRdIDw8IDIpO1xuICAgICAgICAgICAgZWxzZSBpZiAoc2YgPT0gMilcbiAgICAgICAgICAgICAgICBsc3MgfD0gKGRhdFsrK2J0XSA8PCA0KSB8ICgoZGF0WysrYnRdICYgMykgPDwgMTIpLCBsY3MgPSAoZGF0W2J0XSA+PiAyKSB8IChkYXRbKytidF0gPDwgNik7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbHNzIHw9IChkYXRbKytidF0gPDwgNCkgfCAoKGRhdFsrK2J0XSAmIDYzKSA8PCAxMiksIGxjcyA9IChkYXRbYnRdID4+IDYpIHwgKGRhdFsrK2J0XSA8PCAyKSB8IChkYXRbKytidF0gPDwgMTApO1xuICAgICAgICB9XG4gICAgICAgICsrYnQ7XG4gICAgICAgIC8vIGFkZCBsaXRlcmFscyB0byBlbmQgLSBjYW4gbmV2ZXIgb3ZlcmxhcCB3aXRoIGJhY2tyZWZlcmVuY2VzIGJlY2F1c2UgdW51c2VkIGxpdGVyYWxzIGFsd2F5cyBhcHBlbmRlZFxuICAgICAgICB2YXIgYnVmID0gb3V0ID8gb3V0LnN1YmFycmF5KHN0LnksIHN0LnkgKyBzdC5tKSA6IG5ldyB1OChzdC5tKTtcbiAgICAgICAgLy8gc3RhcnRpbmcgcG9pbnQgZm9yIGxpdGVyYWxzXG4gICAgICAgIHZhciBzcGwgPSBidWYubGVuZ3RoIC0gbHNzO1xuICAgICAgICBpZiAobGJ0ID09IDApXG4gICAgICAgICAgICBidWYuc2V0KGRhdC5zdWJhcnJheShidCwgYnQgKz0gbHNzKSwgc3BsKTtcbiAgICAgICAgZWxzZSBpZiAobGJ0ID09IDEpXG4gICAgICAgICAgICBmaWxsKGJ1ZiwgZGF0W2J0KytdLCBzcGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGh1ZmZtYW4gdGFibGVcbiAgICAgICAgICAgIHZhciBodSA9IHN0Lmg7XG4gICAgICAgICAgICBpZiAobGJ0ID09IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgaHVkID0gcmh1KGRhdCwgYnQpO1xuICAgICAgICAgICAgICAgIC8vIHN1YnRyYWN0IGRlc2NyaXB0aW9uIGxlbmd0aFxuICAgICAgICAgICAgICAgIGxjcyArPSBidCAtIChidCA9IGh1ZFswXSk7XG4gICAgICAgICAgICAgICAgc3QuaCA9IGh1ID0gaHVkWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWh1KVxuICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgIChzNCA/IGRodTQgOiBkaHUpKGRhdC5zdWJhcnJheShidCwgYnQgKz0gbGNzKSwgYnVmLnN1YmFycmF5KHNwbCksIGh1KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBudW0gc2VxdWVuY2VzXG4gICAgICAgIHZhciBucyA9IGRhdFtidCsrXTtcbiAgICAgICAgaWYgKG5zKSB7XG4gICAgICAgICAgICBpZiAobnMgPT0gMjU1KVxuICAgICAgICAgICAgICAgIG5zID0gKGRhdFtidCsrXSB8IChkYXRbYnQrK10gPDwgOCkpICsgMHg3RjAwO1xuICAgICAgICAgICAgZWxzZSBpZiAobnMgPiAxMjcpXG4gICAgICAgICAgICAgICAgbnMgPSAoKG5zIC0gMTI4KSA8PCA4KSB8IGRhdFtidCsrXTtcbiAgICAgICAgICAgIC8vIHN5bWJvbCBjb21wcmVzc2lvbiBtb2Rlc1xuICAgICAgICAgICAgdmFyIHNjbSA9IGRhdFtidCsrXTtcbiAgICAgICAgICAgIGlmIChzY20gJiAzKVxuICAgICAgICAgICAgICAgIGVycigwKTtcbiAgICAgICAgICAgIHZhciBkdHMgPSBbZG1sdCwgZG9jdCwgZGxsdF07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA+IC0xOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWQgPSAoc2NtID4+ICgoaSA8PCAxKSArIDIpKSAmIDM7XG4gICAgICAgICAgICAgICAgaWYgKG1kID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmxlIGJ1ZlxuICAgICAgICAgICAgICAgICAgICB2YXIgcmJ1ZiA9IG5ldyB1OChbMCwgMCwgZGF0W2J0KytdXSk7XG4gICAgICAgICAgICAgICAgICAgIGR0c1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHJidWYuc3ViYXJyYXkoMiwgMyksXG4gICAgICAgICAgICAgICAgICAgICAgICBuOiByYnVmLnN1YmFycmF5KDAsIDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdDogbmV3IHUxNihyYnVmLmJ1ZmZlciwgMCwgMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBiOiAwXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1kID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjdXJhY3kgbG9nIDggZm9yIG9mZnNldHMsIDkgZm9yIG90aGVyc1xuICAgICAgICAgICAgICAgICAgICBfYSA9IHJmc2UoZGF0LCBidCwgOSAtIChpICYgMSkpLCBidCA9IF9hWzBdLCBkdHNbaV0gPSBfYVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWQgPT0gMykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXN0LnQpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnIoMCk7XG4gICAgICAgICAgICAgICAgICAgIGR0c1tpXSA9IHN0LnRbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIF9iID0gc3QudCA9IGR0cywgbWx0ID0gX2JbMF0sIG9jdCA9IF9iWzFdLCBsbHQgPSBfYlsyXTtcbiAgICAgICAgICAgIHZhciBsYiA9IGRhdFtlYnQgLSAxXTtcbiAgICAgICAgICAgIGlmICghbGIpXG4gICAgICAgICAgICAgICAgZXJyKDApO1xuICAgICAgICAgICAgdmFyIHNwb3MgPSAoZWJ0IDw8IDMpIC0gOCArIG1zYihsYikgLSBsbHQuYiwgY2J0ID0gc3BvcyA+PiAzLCBvdWJ0ID0gMDtcbiAgICAgICAgICAgIHZhciBsc3QgPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbGx0LmIpIC0gMSk7XG4gICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBvY3QuYikgPj4gMztcbiAgICAgICAgICAgIHZhciBvc3QgPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgb2N0LmIpIC0gMSk7XG4gICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbHQuYikgPj4gMztcbiAgICAgICAgICAgIHZhciBtc3QgPSAoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbWx0LmIpIC0gMSk7XG4gICAgICAgICAgICBmb3IgKCsrbnM7IC0tbnM7KSB7XG4gICAgICAgICAgICAgICAgdmFyIGxsYyA9IGxsdC5zW2xzdF07XG4gICAgICAgICAgICAgICAgdmFyIGxidHIgPSBsbHQubltsc3RdO1xuICAgICAgICAgICAgICAgIHZhciBtbGMgPSBtbHQuc1ttc3RdO1xuICAgICAgICAgICAgICAgIHZhciBtYnRyID0gbWx0Lm5bbXN0XTtcbiAgICAgICAgICAgICAgICB2YXIgb2ZjID0gb2N0LnNbb3N0XTtcbiAgICAgICAgICAgICAgICB2YXIgb2J0ciA9IG9jdC5uW29zdF07XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gb2ZjKSA+PiAzO1xuICAgICAgICAgICAgICAgIHZhciBvZnAgPSAxIDw8IG9mYztcbiAgICAgICAgICAgICAgICB2YXIgb2ZmID0gb2ZwICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpIHwgKGRhdFtjYnQgKyAyXSA8PCAxNikgfCAoZGF0W2NidCArIDNdIDw8IDI0KSkgPj4+IChzcG9zICYgNykpICYgKG9mcCAtIDEpKTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtbGJbbWxjXSkgPj4gMztcbiAgICAgICAgICAgICAgICB2YXIgbWwgPSBtbGJsW21sY10gKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkgfCAoZGF0W2NidCArIDJdIDw8IDE2KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgbWxiW21sY10pIC0gMSkpO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IGxsYltsbGNdKSA+PiAzO1xuICAgICAgICAgICAgICAgIHZhciBsbCA9IGxsYmxbbGxjXSArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSB8IChkYXRbY2J0ICsgMl0gPDwgMTYpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBsbGJbbGxjXSkgLSAxKSk7XG4gICAgICAgICAgICAgICAgY2J0ID0gKHNwb3MgLT0gbGJ0cikgPj4gMztcbiAgICAgICAgICAgICAgICBsc3QgPSBsbHQudFtsc3RdICsgKCgoZGF0W2NidF0gfCAoZGF0W2NidCArIDFdIDw8IDgpKSA+PiAoc3BvcyAmIDcpKSAmICgoMSA8PCBsYnRyKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBjYnQgPSAoc3BvcyAtPSBtYnRyKSA+PiAzO1xuICAgICAgICAgICAgICAgIG1zdCA9IG1sdC50W21zdF0gKyAoKChkYXRbY2J0XSB8IChkYXRbY2J0ICsgMV0gPDwgOCkpID4+IChzcG9zICYgNykpICYgKCgxIDw8IG1idHIpIC0gMSkpO1xuICAgICAgICAgICAgICAgIGNidCA9IChzcG9zIC09IG9idHIpID4+IDM7XG4gICAgICAgICAgICAgICAgb3N0ID0gb2N0LnRbb3N0XSArICgoKGRhdFtjYnRdIHwgKGRhdFtjYnQgKyAxXSA8PCA4KSkgPj4gKHNwb3MgJiA3KSkgJiAoKDEgPDwgb2J0cikgLSAxKSk7XG4gICAgICAgICAgICAgICAgaWYgKG9mZiA+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Qub1syXSA9IHN0Lm9bMV07XG4gICAgICAgICAgICAgICAgICAgIHN0Lm9bMV0gPSBzdC5vWzBdO1xuICAgICAgICAgICAgICAgICAgICBzdC5vWzBdID0gb2ZmIC09IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gb2ZmIC0gKGxsICE9IDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmYgPSBpZHggPT0gMyA/IHN0Lm9bMF0gLSAxIDogc3Qub1tpZHhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Qub1syXSA9IHN0Lm9bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBzdC5vWzFdID0gc3Qub1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0Lm9bMF0gPSBvZmY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgb2ZmID0gc3Qub1swXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsbDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZltvdWJ0ICsgaV0gPSBidWZbc3BsICsgaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91YnQgKz0gbGwsIHNwbCArPSBsbDtcbiAgICAgICAgICAgICAgICB2YXIgc3RpbiA9IG91YnQgLSBvZmY7XG4gICAgICAgICAgICAgICAgaWYgKHN0aW4gPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSAtc3RpbjtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJzID0gc3QuZSArIHN0aW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiBtbClcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IG1sO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZbb3VidCArIGldID0gc3Qud1ticyArIGldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91YnQgKz0gbGVuLCBtbCAtPSBsZW4sIHN0aW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1sOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmW291YnQgKyBpXSA9IGJ1ZltzdGluICsgaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG91YnQgKz0gbWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3VidCAhPSBzcGwpIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc3BsIDwgYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBidWZbb3VidCsrXSA9IGJ1ZltzcGwrK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG91YnQgPSBidWYubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG91dClcbiAgICAgICAgICAgICAgICBzdC55ICs9IG91YnQ7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYnVmID0gc2xjKGJ1ZiwgMCwgb3VidCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAob3V0KSB7XG4gICAgICAgICAgICAgICAgc3QueSArPSBsc3M7XG4gICAgICAgICAgICAgICAgaWYgKHNwbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxzczsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSBidWZbc3BsICsgaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzcGwpXG4gICAgICAgICAgICAgICAgYnVmID0gc2xjKGJ1Ziwgc3BsKTtcbiAgICAgICAgfVxuICAgICAgICBzdC5iID0gZWJ0O1xuICAgICAgICByZXR1cm4gYnVmO1xuICAgIH1cbiAgICBlcnIoMik7XG59O1xuLy8gY29uY2F0XG52YXIgY2N0ID0gZnVuY3Rpb24gKGJ1ZnMsIG9sKSB7XG4gICAgaWYgKGJ1ZnMubGVuZ3RoID09IDEpXG4gICAgICAgIHJldHVybiBidWZzWzBdO1xuICAgIHZhciBidWYgPSBuZXcgdTgob2wpO1xuICAgIGZvciAodmFyIGkgPSAwLCBiID0gMDsgaSA8IGJ1ZnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGNoayA9IGJ1ZnNbaV07XG4gICAgICAgIGJ1Zi5zZXQoY2hrLCBiKTtcbiAgICAgICAgYiArPSBjaGsubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xufTtcbi8qKlxuICogRGVjb21wcmVzc2VzIFpzdGFuZGFyZCBkYXRhXG4gKiBAcGFyYW0gZGF0IFRoZSBpbnB1dCBkYXRhXG4gKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgYnVmZmVyLiBJZiB1bnNwZWNpZmllZCwgdGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGVcbiAqICAgICAgICAgICAgZXhhY3RseSBlbm91Z2ggbWVtb3J5IHRvIGZpdCB0aGUgZGVjb21wcmVzc2VkIGRhdGEuIElmIHlvdXJcbiAqICAgICAgICAgICAgZGF0YSBoYXMgbXVsdGlwbGUgZnJhbWVzIGFuZCB5b3Uga25vdyB0aGUgb3V0cHV0IHNpemUsIHNwZWNpZnlpbmdcbiAqICAgICAgICAgICAgaXQgd2lsbCB5aWVsZCBiZXR0ZXIgcGVyZm9ybWFuY2UuXG4gKiBAcmV0dXJucyBUaGUgZGVjb21wcmVzc2VkIGRhdGFcbiAqL1xucmV0dXJuIGZ1bmN0aW9uIGRlY29tcHJlc3MoZGF0LCBidWYpIHtcbiAgICB2YXIgYnQgPSAwLCBidWZzID0gW10sIG5iID0gKyFidWYsIG9sID0gMDtcbiAgICBmb3IgKDsgZGF0Lmxlbmd0aDspIHtcbiAgICAgICAgdmFyIHN0ID0gcnpmaChkYXQsIG5iIHx8IGJ1Zik7XG4gICAgICAgIGlmICh0eXBlb2Ygc3QgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmIChuYikge1xuICAgICAgICAgICAgICAgIGJ1ZiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHN0LncubGVuZ3RoID09IHN0LnUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVmcy5wdXNoKGJ1ZiA9IHN0LncpO1xuICAgICAgICAgICAgICAgICAgICBvbCArPSBzdC51O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJ1ZnMucHVzaChidWYpO1xuICAgICAgICAgICAgICAgIHN0LmUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICg7ICFzdC5sOykge1xuICAgICAgICAgICAgICAgIHZhciBibGsgPSByemIoZGF0LCBzdCwgYnVmKTtcbiAgICAgICAgICAgICAgICBpZiAoIWJsaylcbiAgICAgICAgICAgICAgICAgICAgZXJyKDUpO1xuICAgICAgICAgICAgICAgIGlmIChidWYpXG4gICAgICAgICAgICAgICAgICAgIHN0LmUgPSBzdC55O1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBidWZzLnB1c2goYmxrKTtcbiAgICAgICAgICAgICAgICAgICAgb2wgKz0gYmxrLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgY3B3KHN0LncsIDAsIGJsay5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICBzdC53LnNldChibGssIHN0LncubGVuZ3RoIC0gYmxrLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnQgPSBzdC5iICsgKHN0LmMgKiA0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBidCA9IHN0O1xuICAgICAgICBkYXQgPSBkYXQuc3ViYXJyYXkoYnQpO1xuICAgIH1cbiAgICByZXR1cm4gY2N0KGJ1ZnMsIG9sKTtcbn1cbn0pICgpXG4iLCIvLy8vLy8vLy8gVElNRV9OT1dcblxuLy9Qcm92aWRlczogdGltZV9ub3dfbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvXG4vL1JlcXVpcmVzOiBjYW1sX2ludDY0X211bCwgY2FtbF9pbnQ2NF9vZl9mbG9hdCwgY2FtbF9pbnQ2NF9vZl9pbnQzMlxudmFyIG1zX3RvX25hbm8gPSBjYW1sX2ludDY0X29mX2ludDMyKDEwMDAqMTAwMCk7XG5mdW5jdGlvbiB0aW1lX25vd19uYW5vc2Vjb25kc19zaW5jZV91bml4X2Vwb2NoX29yX3plcm8oKXtcbiAgICB2YXIgbXMgPSBEYXRlLm5vdygpO1xuICAgIC8vIG11bHRpcGxlIGJ5IHR3byAtIGludDYzIGludGVnZXJzIGFyZSBzaGlmdGVkIHRvIHRoZSBsZWZ0XG4gICAgdmFyIG1zX2k2MyA9IGNhbWxfaW50NjRfb2ZfZmxvYXQobXMqMik7XG4gICAgcmV0dXJuIGNhbWxfaW50NjRfbXVsKG1zX2k2Myxtc190b19uYW5vKTtcbn1cbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUGFkZGluZyBwb3NpdGlvbi4gKilcbnR5cGUgcGFkdHkgPVxuICB8IExlZnQgICAoKiBUZXh0IGlzIGxlZnQganVzdGlmaWVkICgnLScgb3B0aW9uKS4gICAgICAgICAgICAgICAqKVxuICB8IFJpZ2h0ICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCAobm8gJy0nIG9wdGlvbikuICAgICAgICAgICAqKVxuICB8IFplcm9zICAoKiBUZXh0IGlzIHJpZ2h0IGp1c3RpZmllZCBieSB6ZXJvcyAoc2VlICcwJyBvcHRpb24pLiAqKVxuXG4oKioqKVxuXG4oKiBJbnRlZ2VyIGNvbnZlcnNpb24uICopXG50eXBlIGludF9jb252ID1cbiAgfCBJbnRfZCB8IEludF9wZCB8IEludF9zZCAgICAgICAgKCogICVkIHwgJStkIHwgJSBkICAqKVxuICB8IEludF9pIHwgSW50X3BpIHwgSW50X3NpICAgICAgICAoKiAgJWkgfCAlK2kgfCAlIGkgICopXG4gIHwgSW50X3ggfCBJbnRfQ3ggICAgICAgICAgICAgICAgICgqICAleCB8ICUjeCAgICAgICAgKilcbiAgfCBJbnRfWCB8IEludF9DWCAgICAgICAgICAgICAgICAgKCogICVYIHwgJSNYICAgICAgICAqKVxuICB8IEludF9vIHwgSW50X0NvICAgICAgICAgICAgICAgICAoKiAgJW8gfCAlI28gICAgICAgICopXG4gIHwgSW50X3UgICAgICAgICAgICAgICAgICAgICAgICAgICgqICAldSAgICAgICAgICAgICAgKilcbiAgfCBJbnRfQ2QgfCBJbnRfQ2kgfCBJbnRfQ3UgICAgICAgKCogICUjZCB8ICUjaSB8ICUjdSAqKVxuXG4oKiBGbG9hdCBjb252ZXJzaW9uLiAqKVxudHlwZSBmbG9hdF9mbGFnX2NvbnYgPVxuICB8IEZsb2F0X2ZsYWdfICAgICAgICAgICAgICAgICAgICAoKiAlW2ZlRWdHRmhIXSAqKVxuICB8IEZsb2F0X2ZsYWdfcCAgICAgICAgICAgICAgICAgICAoKiAlK1tmZUVnR0ZoSF0gKilcbiAgfCBGbG9hdF9mbGFnX3MgICAgICAgICAgICAgICAgICAgKCogJSBbZmVFZ0dGaEhdICopXG50eXBlIGZsb2F0X2tpbmRfY29udiA9XG4gIHwgRmxvYXRfZiAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZiB8ICUrZiB8ICUgZiAgKilcbiAgfCBGbG9hdF9lICAgICAgICAgICAgICAgICAgICAgICAgKCogICVlIHwgJStlIHwgJSBlICAqKVxuICB8IEZsb2F0X0UgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUUgfCAlK0UgfCAlIEUgICopXG4gIHwgRmxvYXRfZyAgICAgICAgICAgICAgICAgICAgICAgICgqICAlZyB8ICUrZyB8ICUgZyAgKilcbiAgfCBGbG9hdF9HICAgICAgICAgICAgICAgICAgICAgICAgKCogICVHIHwgJStHIHwgJSBHICAqKVxuICB8IEZsb2F0X0YgICAgICAgICAgICAgICAgICAgICAgICAoKiAgJUYgfCAlK0YgfCAlIEYgICopXG4gIHwgRmxvYXRfaCAgICAgICAgICAgICAgICAgICAgICAgICgqICAlaCB8ICUraCB8ICUgaCAgKilcbiAgfCBGbG9hdF9IICAgICAgICAgICAgICAgICAgICAgICAgKCogICVIIHwgJStIIHwgJSBIICAqKVxuICB8IEZsb2F0X0NGICAgICAgICAgICAgICAgICAgICAgICAoKiAgJSNGfCAlKyNGfCAlICNGICopXG50eXBlIGZsb2F0X2NvbnYgPSBmbG9hdF9mbGFnX2NvbnYgKiBmbG9hdF9raW5kX2NvbnZcblxuKCoqKilcblxuKCogQ2hhciBzZXRzIChzZWUgJVsuLi5dKSBhcmUgYml0bWFwcyBpbXBsZW1lbnRlZCBhcyAzMi1jaGFyIHN0cmluZ3MuICopXG50eXBlIGNoYXJfc2V0ID0gc3RyaW5nXG5cbigqKiopXG5cbigqIENvdW50ZXIgdXNlZCBpbiBTY2FuZi4gKilcbnR5cGUgY291bnRlciA9XG4gIHwgTGluZV9jb3VudGVyICAgICAoKiAgJWwgICAgICAqKVxuICB8IENoYXJfY291bnRlciAgICAgKCogICVuICAgICAgKilcbiAgfCBUb2tlbl9jb3VudGVyICAgICgqICAlTiwgJUwgICopXG5cbigqKiopXG5cbigqIFBhZGRpbmcgb2Ygc3RyaW5ncyBhbmQgbnVtYmVycy4gKilcbnR5cGUgKCdhLCAnYikgcGFkZGluZyA9XG4gICgqIE5vIHBhZGRpbmcgKGV4OiBcIiVkXCIpICopXG4gIHwgTm9fcGFkZGluZyAgOiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIExpdGVyYWwgcGFkZGluZyAoZXg6IFwiJThkXCIpICopXG4gIHwgTGl0X3BhZGRpbmcgOiBwYWR0eSAqIGludCAtPiAoJ2EsICdhKSBwYWRkaW5nXG4gICgqIFBhZGRpbmcgYXMgZXh0cmEgYXJndW1lbnQgKGV4OiBcIiUqZFwiKSAqKVxuICB8IEFyZ19wYWRkaW5nIDogcGFkdHkgLT4gKGludCAtPiAnYSwgJ2EpIHBhZGRpbmdcblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZCxcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwYWRkaW5nIG9wdGlvbiAobm8gZXh0cmEgYXJndW1lbnQpICopXG50eXBlIHBhZF9vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIFByZWNpc2lvbiBvZiBmbG9hdHMgYW5kICcwJy1wYWRkaW5nIG9mIGludGVnZXJzLiAqKVxudHlwZSAoJ2EsICdiKSBwcmVjaXNpb24gPVxuICAoKiBObyBwcmVjaXNpb24gKGV4OiBcIiVmXCIpICopXG4gIHwgTm9fcHJlY2lzaW9uIDogKCdhLCAnYSkgcHJlY2lzaW9uXG4gICgqIExpdGVyYWwgcHJlY2lzaW9uIChleDogXCIlLjNmXCIpICopXG4gIHwgTGl0X3ByZWNpc2lvbiA6IGludCAtPiAoJ2EsICdhKSBwcmVjaXNpb25cbiAgKCogUHJlY2lzaW9uIGFzIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpICopXG4gIHwgQXJnX3ByZWNpc2lvbiA6IChpbnQgLT4gJ2EsICdhKSBwcmVjaXNpb25cblxuKCogU29tZSBmb3JtYXRzLCBzdWNoIGFzICVfZixcbiAgIG9ubHkgYWNjZXB0IGFuIG9wdGlvbmFsIG51bWJlciBhcyBwcmVjaXNpb24gb3B0aW9uIChubyBleHRyYSBhcmd1bWVudCkgKilcbnR5cGUgcHJlY19vcHRpb24gPSBpbnQgb3B0aW9uXG5cbigqIHNlZSB0aGUgQ3VzdG9tIGZvcm1hdCBjb21iaW5hdG9yICopXG50eXBlICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgPVxuICB8IEN1c3RvbV96ZXJvIDogKCdhLCBzdHJpbmcsICdhKSBjdXN0b21fYXJpdHlcbiAgfCBDdXN0b21fc3VjYyA6ICgnYSwgJ2IsICdjKSBjdXN0b21fYXJpdHkgLT5cbiAgICAoJ2EsICd4IC0+ICdiLCAneCAtPiAnYykgY3VzdG9tX2FyaXR5XG5cbigqKiopXG5cbigqICAgICAgICBSZWxhdGlvbmFsIGZvcm1hdCB0eXBlc1xuXG5JbiB0aGUgZmlyc3QgZm9ybWF0K2dhZHRzIGltcGxlbWVudGF0aW9uLCB0aGUgdHlwZSBmb3IgJSguLiUpIGluIHRoZVxuZm10IEdBRFQgd2FzIGFzIGZvbGxvd3M6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKiAoJ2QxLCAncTEsICdkMiwgJ3EyKSByZWFkZXJfbmJfdW5pZmllciAqXG4gICAgKCd4LCAnYiwgJ2MsICdkMSwgJ3ExLCAndSkgZm10dHkgKlxuICAgICgndSwgJ2IsICdjLCAncTEsICdlMSwgJ2YpIGZtdCAtPlxuICAgICAgKCgneCwgJ2IsICdjLCAnZDIsICdxMiwgJ3UpIGZvcm1hdDYgLT4gJ3gsICdiLCAnYywgJ2QxLCAnZTEsICdmKSBmbXRcblxuTm90aWNlIHRoYXQgdGhlICd1IHBhcmFtZXRlciBpbiAnZiBwb3NpdGlvbiBpbiB0aGUgZm9ybWF0IGFyZ3VtZW50XG4oKCd4LCAuLiwgJ3UpIGZvcm1hdDYgLT4gLi4pIGlzIGVxdWFsIHRvIHRoZSAndSBwYXJhbWV0ZXIgaW4gJ2FcbnBvc2l0aW9uIGluIHRoZSBmb3JtYXQgdGFpbCAoKCd1LCAuLiwgJ2YpIGZtdCkuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbnR5cGUgb2YgdGhlIGV4cGVjdGVkIGZvcm1hdCBwYXJhbWV0ZXIgZGVwZW5kcyBvZiB3aGVyZSB0aGUgJSguLi4lKVxuYXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nOlxuXG4gICMgUHJpbnRmLnByaW50ZiBcIiUoJSlcIlxuICAtIDogKHVuaXQsIG91dF9jaGFubmVsLCB1bml0LCAnX2EsICdfYSwgdW5pdClcbiAgICAgIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2IC0+IHVuaXRcbiAgPSA8ZnVuPlxuICAjIFByaW50Zi5wcmludGYgXCIlKCUpJWRcIlxuICAtIDogKGludCAtPiB1bml0LCBvdXRfY2hhbm5lbCwgdW5pdCwgJ19hLCAnX2EsIGludCAtPiB1bml0KVxuICAgICAgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDYgLT4gaW50IC0+IHVuaXRcbiAgPSA8ZnVuPlxuXG5PbiB0aGUgY29udHJhcnksIHRoZSBsZWdhY3kgdHlwZXIgZ2l2ZXMgYSBjbGV2ZXIgdHlwZSB0aGF0IGRvZXMgbm90XG5kZXBlbmQgb24gdGhlIHBvc2l0aW9uIG9mICUoLi4lKSBpbiB0aGUgZm9ybWF0IHN0cmluZy4gRm9yIGV4YW1wbGUsXG4lKCUpIHdpbGwgaGF2ZSB0aGUgcG9seW1vcnBoaWMgdHlwZSAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSk6IGl0IGNhblxuYmUgY29uY2F0ZW5hdGVkIHRvIGFueSBmb3JtYXQgdHlwZSwgYW5kIG9ubHkgZW5mb3JjZXMgdGhlIGNvbnN0cmFpbnRcbnRoYXQgaXRzICdhIGFuZCAnZiBwYXJhbWV0ZXJzIGFyZSBlcXVhbCAobm8gZm9ybWF0IGFyZ3VtZW50cykgYW5kICdkXG5hbmQgJ2UgYXJlIGVxdWFsIChubyByZWFkZXIgYXJndW1lbnQpLlxuXG5UaGUgd2Vha2VuaW5nIG9mIHRoaXMgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIEdBRFQgdmVyc2lvbiBicm9rZSB1c2VyXG5jb2RlIChpbiBmYWN0IGl0IGVzc2VudGlhbGx5IG1hZGUgJSguLi4lKSB1bnVzYWJsZSBleGNlcHQgYXQgdGhlIGxhc3RcbnBvc2l0aW9uIG9mIGEgZm9ybWF0KS4gSW4gcGFydGljdWxhciwgdGhlIGZvbGxvd2luZyB3b3VsZCBub3Qgd29ya1xuYW55bW9yZTpcblxuICBmdW4gc2VwIC0+XG4gICAgRm9ybWF0LnByaW50ZiBcImZvbyUoJSliYXIlKCUpYmF6XCIgc2VwIHNlcFxuXG5BcyB0aGUgdHlwZS1jaGVja2VyIHdvdWxkIHJlcXVpcmUgdHdvICppbmNvbXBhdGlibGUqIHR5cGVzIGZvciB0aGUgJSglKVxuaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cblxuVGhlIHNvbHV0aW9uIHRvIHJlZ2FpbiBhIGdlbmVyYWwgdHlwZSBmb3IgJSguLiUpIGlzIHRvIGdlbmVyYWxpemUgdGhpc1xudGVjaG5pcXVlLCBub3Qgb25seSBvbiB0aGUgJ2QsICdlIHBhcmFtZXRlcnMsIGJ1dCBvbiBhbGwgc2l4XG5wYXJhbWV0ZXJzIG9mIGEgZm9ybWF0OiB3ZSBpbnRyb2R1Y2UgYSBcInJlbGF0aW9uYWxcIiB0eXBlXG4gICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG53aG9zZSB2YWx1ZXMgYXJlIHByb29mcyB0aGF0ICgnYTEsIC4uLCAnZjEpIGFuZCAoJ2EyLCAuLiwgJ2YyKSBtb3JhbGx5XG5jb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvcm1hdCB0eXBlOiAnYTEgaXMgb2J0YWluZWQgZnJvbSAnZjEsJ2IxLCdjMVxuaW4gdGhlIGV4YWN0IHNhbWUgd2F5IHRoYXQgJ2EyIGlzIG9idGFpbmVkIGZyb20gJ2YyLCdiMiwnYzIsIGV0Yy5cblxuRm9yIGV4YW1wbGUsIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHR3byBmb3JtYXQgdHlwZXMgYmVnaW5uaW5nIHdpdGggYSBDaGFyXG5wYXJhbWV0ZXIgaXMgYXMgZm9sbG93czpcblxufCBDaGFyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWMgICopXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgIChjaGFyIC0+ICdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgIGNoYXIgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG5cbkluIHRoZSBnZW5lcmFsIGNhc2UsIHRoZSB0ZXJtIHN0cnVjdHVyZSBvZiBmbXR0eV9yZWwgaXMgKGFsbW9zdFsxXSlcbmlzb21vcnBoaWMgdG8gdGhlIGZtdHR5IG9mIHRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbjogZXZlcnlcbmNvbnN0cnVjdG9yIGlzIHJlLXJlYWQgd2l0aCBhIGJpbmFyeSwgcmVsYXRpb25hbCB0eXBlLCBpbnN0ZWFkIG9mIHRoZVxucHJldmlvdXMgdW5hcnkgdHlwaW5nLiBmbXR0eSBjYW4gdGhlbiBiZSByZS1kZWZpbmVkIGFzIHRoZSBkaWFnb25hbCBvZlxuZm10dHlfcmVsOlxuXG4gIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5ID1cbiAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICAgJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHlfcmVsXG5cbk9uY2Ugd2UgaGF2ZSB0aGlzIGZtdHR5X3JlbCB0eXBlIGluIHBsYWNlLCB3ZSBjYW4gZ2l2ZSB0aGUgbW9yZVxuZ2VuZXJhbCB0eXBlIHRvICUoLi4uJSk6XG5cbnwgRm9ybWF0X3N1YnN0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSguLi4lKSAqKVxuICAgIHBhZF9vcHRpb24gKlxuICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsLFxuICAgICAnZzIsICdiLCAnYywgJ2oyLCAnZCwgJ2EpIGZtdHR5X3JlbCAqXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiLCAnYywgJ2oyLCAnZSwgJ2YpIGZtdFxuXG5XZSBhY2NlcHQgYW55IGZvcm1hdCAoKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYpICh0aGlzIGlzXG5jb21wbGV0ZWx5IHVucmVsYXRlZCB0byB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBmb3JtYXQpLCBidXQgYWxzb1xucmVxdWlyZSBhIHByb29mIHRoYXQgdGhpcyBmb3JtYXQgaXMgaW4gcmVsYXRpb24gdG8gYW5vdGhlciBmb3JtYXQgdGhhdFxuaXMgY29uY2F0ZW5hYmxlIHRvIHRoZSBmb3JtYXQgdGFpbC4gV2hlbiBleGVjdXRpbmcgYSAlKC4uLiUpIGZvcm1hdFxuKGluIGNhbWxpbnRlcm5hbEZvcm1hdC5tbDptYWtlX3ByaW50ZiBvciBzY2FuZi5tbDptYWtlX3NjYW5mKSwgd2VcbnRyYW5zdHlwZSB0aGUgZm9ybWF0IGFsb25nIHRoaXMgcmVsYXRpb24gdXNpbmcgdGhlICdyZWNhc3QnIGZ1bmN0aW9uXG50byB0cmFuc3Bvc2UgYmV0d2VlbiByZWxhdGVkIGZvcm1hdCB0eXBlcy5cblxuICB2YWwgcmVjYXN0IDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEpIGZtdFxuICAtPiAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICAtPiAoJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10XG5cbk5PVEUgWzFdOiB0aGUgdHlwaW5nIG9mIEZvcm1hdF9zdWJzdF90eSByZXF1aXJlcyBub3Qgb25lIGZvcm1hdCB0eXBlLCBidXRcbnR3bywgb25lIHRvIGVzdGFibGlzaCB0aGUgbGluayBiZXR3ZWVuIHRoZSBmb3JtYXQgYXJndW1lbnQgYW5kIHRoZVxuZmlyc3Qgc2l4IHBhcmFtZXRlcnMsIGFuZCB0aGUgb3RoZXIgZm9yIHRoZSBsaW5rIGJldHdlZW4gdGhlIGZvcm1hdFxuYXJndW1lbnQgYW5kIHRoZSBsYXN0IHNpeCBwYXJhbWV0ZXJzLlxuXG58IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2QxLCAnYTEpIGZtdHR5X3JlbCAqXG4gICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICdnMiwgJ2IyLCAnYzIsICdqMiwgJ2QyLCAnYTIpIGZtdHR5X3JlbCAqXG4gICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzEsICdiMSwgJ2MxLCAnajEsICdlMSwgJ2YxLFxuICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnZzIsICdiMiwgJ2MyLCAnajIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuV2hlbiB3ZSBnZW5lcmF0ZSBhIGZvcm1hdCBBU1QsIHdlIGdlbmVyYXRlIGV4YWN0bHkgdGhlIHNhbWUgd2l0bmVzc1xuZm9yIGJvdGggcmVsYXRpb25zLCBhbmQgdGhlIHdpdG5lc3MtY29udmVyc2lvbiBmdW5jdGlvbnMgaW5cbmNhbWxpbnRlcm5hbEZvcm1hdCBkbyByZWx5IG9uIHRoaXMgaW52YXJpYW50LiBGb3IgZXhhbXBsZSwgdGhlXG5mdW5jdGlvbiB0aGF0IHByb3ZlcyB0aGF0IHRoZSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlXG5cbiAgdmFsIHRyYW5zIDpcbiAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgLT4gKCdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcbiAgLT4gKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAnYTMsICdiMywgJ2MzLCAnZDMsICdlMywgJ2YzKSBmbXR0eV9yZWxcblxuZG9lcyBhc3N1bWUgdGhhdCB0aGUgdHdvIGlucHV0cyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgdGVybSBzdHJ1Y3R1cmVcbihhbmQgaXMgb25seSBldmVyeSB1c2VkIGZvciBhcmd1bWVudCB3aXRuZXNzZXMgb2YgdGhlXG5Gb3JtYXRfc3Vic3RfdHkgY29uc3RydWN0b3IpLlxuKilcblxuKCogVHlwZSBvZiBhIGJsb2NrIHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCAgICgqIEhvcml6b250YWwgYmxvY2sgbm8gbGluZSBicmVha2luZyAqKVxuICB8IFBwX3Zib3ggICAoKiBWZXJ0aWNhbCBibG9jayBlYWNoIGJyZWFrIGxlYWRzIHRvIGEgbmV3IGxpbmUgKilcbiAgfCBQcF9odmJveCAgKCogSG9yaXpvbnRhbC12ZXJ0aWNhbCBibG9jazogc2FtZSBhcyB2Ym94LCBleGNlcHQgaWYgdGhpcyBibG9ja1xuICAgICAgICAgICAgICAgICBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IG9uIGEgc2luZ2xlIGxpbmUgKilcbiAgfCBQcF9ob3Zib3ggKCogSG9yaXpvbnRhbCBvciBWZXJ0aWNhbCBibG9jazogYnJlYWtzIGxlYWQgdG8gbmV3IGxpbmVcbiAgICAgICAgICAgICAgICAgb25seSB3aGVuIG5lY2Vzc2FyeSB0byBwcmludCB0aGUgY29udGVudCBvZiB0aGUgYmxvY2sgKilcbiAgfCBQcF9ib3ggICAgKCogSG9yaXpvbnRhbCBvciBJbmRlbnQgYmxvY2s6IGJyZWFrcyBsZWFkIHRvIG5ldyBsaW5lXG4gICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBuZWNlc3NhcnkgdG8gcHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIGJsb2NrLCBvclxuICAgICAgICAgICAgICAgICB3aGVuIGl0IGxlYWRzIHRvIGEgbmV3IGluZGVudGF0aW9uIG9mIHRoZSBjdXJyZW50IGxpbmUgKilcbiAgfCBQcF9maXRzICAgKCogSW50ZXJuYWwgdXNhZ2U6IHdoZW4gYSBibG9jayBmaXRzIG9uIGEgc2luZ2xlIGxpbmUgKilcblxuKCogRm9ybWF0dGluZyBlbGVtZW50IHVzZWQgYnkgdGhlIEZvcm1hdCBwcmV0dHktcHJpbnRlci4gKilcbnR5cGUgZm9ybWF0dGluZ19saXQgPVxuICB8IENsb3NlX2JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXSAgICopXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEB9ICAgKilcbiAgfCBCcmVhayBvZiBzdHJpbmcgKiBpbnQgKiBpbnQgICAgICAgICAgKCogQCwgfCBAICB8IEA7IHwgQDs8PiAqKVxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAPyAgICopXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBcXG4gICopXG4gIHwgRmx1c2hfbmV3bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAuICAgKilcbiAgfCBNYWdpY19zaXplIG9mIHN0cmluZyAqIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQDxuPiAqKVxuICB8IEVzY2FwZWRfYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAQCAgICopXG4gIHwgRXNjYXBlZF9wZXJjZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEAlJSAgKilcbiAgfCBTY2FuX2luZGljIG9mIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQFggICAqKVxuXG4oKiBGb3JtYXR0aW5nIGVsZW1lbnQgdXNlZCBieSB0aGUgRm9ybWF0IHByZXR0eS1wcmludGVyLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW4gPVxuICB8IE9wZW5fdGFnIDogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gICAgICAoKiBAeyAgICopXG4gICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdHRpbmdfZ2VuXG4gIHwgT3Blbl9ib3ggOiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPiAgICAgICgqIEBbICAgKilcbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0dGluZ19nZW5cblxuKCoqKilcblxuKCogTGlzdCBvZiBmb3JtYXQgdHlwZSBlbGVtZW50cy4gKilcbigqIEluIHBhcnRpY3VsYXIgdXNlZCB0byByZXByZXNlbnQgJSguLi4lKSBhbmQgJXsuLi4lfSBjb250ZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10dHkgPVxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZixcbiAgICAgICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X3JlbFxuYW5kICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgPVxuICB8IENoYXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGNoYXIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBjaGFyIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IFN0cmluZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKHN0cmluZyAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIHN0cmluZyAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBJbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50MzJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVsZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50MzIgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQzMiAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBOYXRpdmVpbnRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJW5kICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChuYXRpdmVpbnQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBuYXRpdmVpbnQgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgSW50NjRfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVMZCAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoaW50NjQgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBpbnQ2NCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBGbG9hdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWYgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgIChmbG9hdCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgIGZsb2F0IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IEJvb2xfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQiAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKGJvb2wgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICBib29sIC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRm9ybWF0X2FyZ190eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICV7Li4uJX0gKilcbiAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmbXR0eSAqXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm9ybWF0NiAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpXG4gICAgICAgICAgIGZtdHR5X3JlbFxuICB8IEZvcm1hdF9zdWJzdF90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlKC4uLiUpICopXG4gICAgICAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCxcbiAgICAgICAnZzEsICdiMSwgJ2MxLCAnajEsICdkMSwgJ2ExKSBmbXR0eV9yZWwgKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZDIsICdhMikgZm10dHlfcmVsICpcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMSwgJ2IxLCAnYzEsICdqMSwgJ2UxLCAnZjEsXG4gICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZvcm1hdDYgLT4gJ2cyLCAnYjIsICdjMiwgJ2oyLCAnZTIsICdmMilcbiAgICAgICAgICAgZm10dHlfcmVsXG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzLiAqKVxuICB8IEFscGhhX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYSAgKilcbiAgICAgICgnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbCAtPlxuICAgICAgKCgnYjEgLT4gJ3ggLT4gJ2MxKSAtPiAneCAtPiAnYTEsICdiMSwgJ2MxLCAnZDEsICdlMSwgJ2YxLFxuICAgICAgICgnYjIgLT4gJ3ggLT4gJ2MyKSAtPiAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcbiAgfCBUaGV0YV90eSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgoJ2IxIC0+ICdjMSkgLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAoJ2IyIC0+ICdjMikgLT4gJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsXG4gIHwgQW55X3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBVc2VkIGZvciBjdXN0b20gZm9ybWF0cyAqKVxuICAgICAgKCdhMSwgJ2IxLCAnYzEsICdkMSwgJ2UxLCAnZjEsXG4gICAgICAgJ2EyLCAnYjIsICdjMiwgJ2QyLCAnZTIsICdmMikgZm10dHlfcmVsIC0+XG4gICAgICAoJ3ggLT4gJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAneCAtPiAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWxcblxuICAoKiBTY2FuZiBzcGVjaWZpYyBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWFkZXJfdHkgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXIgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgneCAtPiAnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICd4IC0+ICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuICB8IElnbm9yZWRfcmVhZGVyX3R5IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3IgICopXG4gICAgICAoJ2ExLCAnYjEsICdjMSwgJ2QxLCAnZTEsICdmMSxcbiAgICAgICAnYTIsICdiMiwgJ2MyLCAnZDIsICdlMiwgJ2YyKSBmbXR0eV9yZWwgLT5cbiAgICAgICgnYTEsICdiMSwgJ2MxLCAoJ2IxIC0+ICd4KSAtPiAnZDEsICdlMSwgJ2YxLFxuICAgICAgICdhMiwgJ2IyLCAnYzIsICgnYjIgLT4gJ3gpIC0+ICdkMiwgJ2UyLCAnZjIpIGZtdHR5X3JlbFxuXG4gIHwgRW5kX29mX2ZtdHR5IDpcbiAgICAgICgnZjEsICdiMSwgJ2MxLCAnZDEsICdkMSwgJ2YxLFxuICAgICAgICdmMiwgJ2IyLCAnYzIsICdkMiwgJ2QyLCAnZjIpIGZtdHR5X3JlbFxuXG4oKioqKVxuXG4oKiBMaXN0IG9mIGZvcm1hdCBlbGVtZW50cy4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10ID1cbiAgfCBDaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX2NoYXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoY2hhciAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTdHJpbmcgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlcyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDYW1sX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlUyAqKVxuICAgICAgKCd4LCBzdHJpbmcgLT4gJ2EpIHBhZGRpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBJbnQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQzMiAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IE5hdGl2ZWludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVuW2RpeFh1b10gKilcbiAgICAgIGludF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgbmF0aXZlaW50IC0+ICdhKSBwcmVjaXNpb24gKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJUxbZGl4WHVvXSAqKVxuICAgICAgaW50X2NvbnYgKiAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCBpbnQ2NCAtPiAnYSkgcHJlY2lzaW9uICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCd4LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZsb2F0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVbZmVFZ0dGaEhdICopXG4gICAgICBmbG9hdF9jb252ICogKCd4LCAneSkgcGFkZGluZyAqICgneSwgZmxvYXQgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBCb29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW2JCXSAqKVxuICAgICAgKCd4LCBib29sIC0+ICdhKSBwYWRkaW5nICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3gsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgRmx1c2ggOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJSEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogYWJjICopXG4gICAgICBzdHJpbmcgKiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBDaGFyX2xpdGVyYWwgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiB4ICopXG4gICAgICBjaGFyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgfCBGb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAley4uLiV9ICopXG4gICAgICBwYWRfb3B0aW9uICogKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wpIGZtdHR5ICpcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUoLi4uJSkgKilcbiAgICAgIHBhZF9vcHRpb24gKlxuICAgICAgKCdnLCAnaCwgJ2ksICdqLCAnaywgJ2wsXG4gICAgICAgJ2cyLCAnYiwgJ2MsICdqMiwgJ2QsICdhKSBmbXR0eV9yZWwgKlxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCgnZywgJ2gsICdpLCAnaiwgJ2ssICdsKSBmb3JtYXQ2IC0+ICdnMiwgJ2IsICdjLCAnajIsICdlLCAnZikgZm10XG5cbiAgKCogUHJpbnRmIGFuZCBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3IuICopXG4gIHwgQWxwaGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJWEgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAneCAtPiAnYykgLT4gJ3ggLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgVGhldGEgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJXQgKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCgnYiAtPiAnYykgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogRm9ybWF0IHNwZWNpZmljIGNvbnN0cnVjdG9yOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIEBfICopXG4gICAgICBmb3JtYXR0aW5nX2xpdCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IEZvcm1hdHRpbmdfZ2VuIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBAXyAqKVxuICAgICAgKCdhMSwgJ2IsICdjLCAnZDEsICdlMSwgJ2YxKSBmb3JtYXR0aW5nX2dlbiAqXG4gICAgICAoJ2YxLCAnYiwgJ2MsICdlMSwgJ2UyLCAnZjIpIGZtdCAtPiAoJ2ExLCAnYiwgJ2MsICdkMSwgJ2UyLCAnZjIpIGZtdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ3ggLT4gJ2EsICdiLCAnYywgKCdiIC0+ICd4KSAtPiAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2NoYXJfc2V0IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgICAgKHN0cmluZyAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRcbiAgfCBTY2FuX2dldF9jb3VudGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlW25sTkxdICopXG4gICAgICBjb3VudGVyICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoaW50IC0+ICdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuICB8IFNjYW5fbmV4dF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICUwYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKGNoYXIgLT4gJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG4gIHwgSWdub3JlZF9wYXJhbSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8gKilcbiAgICAgICgnYSwgJ2IsICdjLCAnZCwgJ3ksICd4KSBpZ25vcmVkICogKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10XG5cbiAgKCogQ3VzdG9tIHByaW50aW5nIGZvcm1hdCAoUFIjNjQ1MiwgR1BSIzE0MClcblxuICAgICBXZSBpbmNsdWRlIGEgdHlwZSBDdXN0b20gb2YgXCJjdXN0b20gY29udmVydGVyc1wiLCB3aGVyZSBhblxuICAgICBhcmJpdHJhcnkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgb3IgbW9yZVxuICAgICBhcmd1bWVudHMuIFRoZXJlIGlzIG5vIHN5bnRheCBmb3IgY3VzdG9tIGNvbnZlcnRlcnMsIGl0IGlzIG9ubHlcbiAgICAgaW50ZW5kZWQgZm9yIGN1c3RvbSBwcm9jZXNzb3JzIHRoYXQgd2lzaCB0byByZWx5IG9uIHRoZVxuICAgICBzdGRsaWItZGVmaW5lZCBmb3JtYXQgR0FEVHMuXG5cbiAgICAgRm9yIGluc3RhbmNlIGEgcHJlLXByb2Nlc3NvciBjb3VsZCBjaG9vc2UgdG8gaW50ZXJwcmV0IHN0cmluZ3NcbiAgICAgcHJlZml4ZWQgd2l0aCBbXCIhXCJdIGFzIGZvcm1hdCBzdHJpbmdzIHdoZXJlIFsle3sgLi4uIH19XSBpc1xuICAgICBhIHNwZWNpYWwgZm9ybSB0byBwYXNzIGEgdG9fc3RyaW5nIGZ1bmN0aW9uLCBzbyB0aGF0IG9uZSBjb3VsZFxuICAgICB3cml0ZTpcblxuICAgICB7W1xuICAgICAgIHR5cGUgdCA9IHsgeCA6IGludDsgeSA6IGludCB9XG5cbiAgICAgICBsZXQgc3RyaW5nX29mX3QgdCA9IFByaW50Zi5zcHJpbnRmIFwieyB4ID0gJWQ7IHkgPSAlZCB9XCIgdC54IHQueVxuXG4gICAgICAgUHJpbnRmLnByaW50ZiAhXCJ0ID0gJXt7c3RyaW5nX29mX3R9fVwiIHsgeCA9IDQyOyB5ID0gNDIgfVxuICAgICBdfVxuICAqKVxuICB8IEN1c3RvbSA6XG4gICAgICAoJ2EsICd4LCAneSkgY3VzdG9tX2FyaXR5ICogKHVuaXQgLT4gJ3gpICogKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdCAtPlxuICAgICAgKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdFxuXG4gICgqIGVuZCBvZiBhIGZvcm1hdCBzcGVjaWZpY2F0aW9uICopXG4gIHwgRW5kX29mX2Zvcm1hdCA6XG4gICAgICAgICgnZiwgJ2IsICdjLCAnZSwgJ2UsICdmKSBmbXRcblxuKCoqKilcblxuKCogVHlwZSBmb3IgaWdub3JlZCBwYXJhbWV0ZXJzIChzZWUgXCIlX1wiKS4gKilcbmFuZCAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZCA9XG4gIHwgSWdub3JlZF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9jICopXG4gICAgICAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfY2FtbF9jaGFyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfQyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX3N0cmluZyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX3MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX1MgKilcbiAgICAgIHBhZF9vcHRpb24gLT4gKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2ludCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlX2QgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50MzIgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfbmF0aXZlaW50IDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfbmQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfaW50NjQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfTGQgKilcbiAgICAgIGludF9jb252ICogcGFkX29wdGlvbiAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfZmxvYXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfZiAqKVxuICAgICAgcGFkX29wdGlvbiAqIHByZWNfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9ib29sIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV9CICopXG4gICAgICBwYWRfb3B0aW9uIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV97Li4uJX0gKilcbiAgICAgIHBhZF9vcHRpb24gKiAoJ2csICdoLCAnaSwgJ2osICdrLCAnbCkgZm10dHkgLT5cbiAgICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiAlXyguLi4lKSAqKVxuICAgICAgcGFkX29wdGlvbiAqICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPlxuICAgICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgaWdub3JlZFxuICB8IElnbm9yZWRfcmVhZGVyIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfciAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICgnYiAtPiAneCkgLT4gJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfWy4uLl0gKilcbiAgICAgIHBhZF9vcHRpb24gKiBjaGFyX3NldCAtPiAoJ2EsICdiLCAnYywgJ2QsICdkLCAnYSkgaWdub3JlZFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqICVfW25sTkxdICopXG4gICAgICBjb3VudGVyIC0+ICgnYSwgJ2IsICdjLCAnZCwgJ2QsICdhKSBpZ25vcmVkXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogJV8wYyAqKVxuICAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZCwgJ2EpIGlnbm9yZWRcblxuYW5kICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID1cbiAgRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgKiBzdHJpbmdcblxubGV0IHJlYyBlcmFzZV9yZWwgOiB0eXBlIGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYsXG4gICBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5XG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgU3RyaW5nX3R5IHJlc3QgLT5cbiAgICBTdHJpbmdfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludF90eSByZXN0IC0+XG4gICAgSW50X3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgLT5cbiAgICBOYXRpdmVpbnRfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgQm9vbF90eSByZXN0IC0+XG4gICAgQm9vbF90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGVyYXNlX3JlbCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCBfdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTEsIGVyYXNlX3JlbCByZXN0KVxuICB8IEFscGhhX3R5IHJlc3QgLT5cbiAgICBBbHBoYV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgVGhldGFfdHkgcmVzdCAtPlxuICAgIFRoZXRhX3R5IChlcmFzZV9yZWwgcmVzdClcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT5cbiAgICBSZWFkZXJfdHkgKGVyYXNlX3JlbCByZXN0KVxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAoZXJhc2VfcmVsIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIEZvcm1hdCB0eXBlIGNvbmNhdGVuYXRpb24gKilcblxuKCogQ29uY2F0ZW5hdGUgdHdvIGZvcm1hdCB0eXBlcy4gKilcbigqIFVzZWQgYnk6XG4gICAqIHJlYWRlcl9uYl91bmlmaWVyX29mX2ZtdHR5IHRvIGNvdW50IHJlYWRlcnMgaW4gYW4gZm10dHksXG4gICAqIFNjYW5mLnRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgdG8gZXh0cmFjdCByZWFkZXJzIGluc2lkZSAlKC4uLiUpLFxuICAgKiBDYW1saW50ZXJuYWxGb3JtYXQuZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgdG8gZXh0cmFjdCBmb3JtYXQgdHlwZS4gKilcblxuKCpcbmxldCByZWMgY29uY2F0X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggLlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAgIChmLCBiLCBjLCBlLCBnLCBoKSBmbXR0eSAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXR0eSA9XG4qKVxubGV0IHJlYyBjb25jYXRfZm10dHkgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgICAgICBnMSBqMSBnMiBqMlxuICAuXG4gICAgKGcxLCBiMSwgYzEsIGoxLCBkMSwgYTEsXG4gICAgIGcyLCBiMiwgYzIsIGoyLCBkMiwgYTIpIGZtdHR5X3JlbCAtPlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoZzEsIGIxLCBjMSwgajEsIGUxLCBmMSxcbiAgICAgZzIsIGIyLCBjMiwgajIsIGUyLCBmMikgZm10dHlfcmVsID1cbmZ1biBmbXR0eTEgZm10dHkyIC0+IG1hdGNoIGZtdHR5MSB3aXRoXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgQ2hhcl90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgU3RyaW5nX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSW50X3R5IHJlc3QgLT5cbiAgICBJbnRfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBJbnQzMl90eSByZXN0IC0+XG4gICAgSW50MzJfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIE5hdGl2ZWludF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEludDY0X3R5IHJlc3QgLT5cbiAgICBJbnQ2NF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEZsb2F0X3R5IHJlc3QgLT5cbiAgICBGbG9hdF90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIEJvb2xfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbHBoYV90eSByZXN0IC0+XG4gICAgQWxwaGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBUaGV0YV90eSByZXN0IC0+XG4gICAgVGhldGFfdHkgKGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIEFueV90eSAoY29uY2F0X2ZtdHR5IHJlc3QgZm10dHkyKVxuICB8IFJlYWRlcl90eSByZXN0IC0+XG4gICAgUmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPlxuICAgIElnbm9yZWRfcmVhZGVyX3R5IChjb25jYXRfZm10dHkgcmVzdCBmbXR0eTIpXG4gIHwgRm9ybWF0X2FyZ190eSAodHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIGNvbmNhdF9mbXR0eSByZXN0IGZtdHR5MilcbiAgfCBFbmRfb2ZfZm10dHkgLT4gZm10dHkyXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgY29uY2F0ZW5hdGlvbiAqKVxuXG4oKiBDb25jYXRlbmF0ZSB0d28gZm9ybWF0cy4gKilcbmxldCByZWMgY29uY2F0X2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgZyBoIC5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKGYsIGIsIGMsIGUsIGcsIGgpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBnLCBoKSBmbXQgPVxuZnVuIGZtdDEgZm10MiAtPiBtYXRjaCBmbXQxIHdpdGhcbiAgfCBTdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBTdHJpbmcgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBDYW1sX3N0cmluZyAocGFkLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQgKGljb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIEludDMyIChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgQ2hhciAocmVzdCkgLT5cbiAgICBDaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgIENhbWxfY2hhciAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIEJvb2wgKHBhZCwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgQWxwaGEgcmVzdCAtPlxuICAgIEFscGhhIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgVGhldGEgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEN1c3RvbSAoYXJpdHksIGYsIHJlc3QpIC0+XG4gICAgQ3VzdG9tIChhcml0eSwgZiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG4gIHwgUmVhZGVyIHJlc3QgLT5cbiAgICBSZWFkZXIgKGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBGbHVzaCAoY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIFN0cmluZ19saXRlcmFsIChzdHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIENoYXJfbGl0ZXJhbCAgIChjaHIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgRm9ybWF0X2FyZyAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfYXJnICAgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkLCBmbXR0eSwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3QgKHBhZCwgZm10dHksIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgcmVzdCkgLT5cbiAgICBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCByZXN0KSAtPlxuICAgIFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGNvbmNhdF9mbXQgcmVzdCBmbXQyKVxuICB8IFNjYW5fbmV4dF9jaGFyIChyZXN0KSAtPlxuICAgIFNjYW5fbmV4dF9jaGFyIChjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgSWdub3JlZF9wYXJhbSAoaWduLCBjb25jYXRfZm10IHJlc3QgZm10MilcblxuICB8IEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCByZXN0KSAtPlxuICAgIEZvcm1hdHRpbmdfbGl0IChmbXRpbmdfbGl0LCBjb25jYXRfZm10IHJlc3QgZm10MilcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgY29uY2F0X2ZtdCByZXN0IGZtdDIpXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgZm10MlxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFeGNlcHRpb25zICopXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0ICgpID1cbiAgKCogZm9yIHJ1bnRpbWUvZmFpbF9uYXQuYyAqKVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlBlcnZhc2l2ZXMuYXJyYXlfYm91bmRfZXJyb3JcIlxuICAgIChJbnZhbGlkX2FyZ3VtZW50IFwiaW5kZXggb3V0IG9mIGJvdW5kc1wiKVxuXG5leHRlcm5hbCByYWlzZSA6IGV4biAtPiAnYSA9IFwiJXJhaXNlXCJcbmV4dGVybmFsIHJhaXNlX25vdHJhY2UgOiBleG4gLT4gJ2EgPSBcIiVyYWlzZV9ub3RyYWNlXCJcblxubGV0IGZhaWx3aXRoIHMgPSByYWlzZShGYWlsdXJlIHMpXG5sZXQgaW52YWxpZF9hcmcgcyA9IHJhaXNlKEludmFsaWRfYXJndW1lbnQgcylcblxuZXhjZXB0aW9uIEV4aXRcbmV4Y2VwdGlvbiBNYXRjaF9mYWlsdXJlID0gTWF0Y2hfZmFpbHVyZVxuZXhjZXB0aW9uIEFzc2VydF9mYWlsdXJlID0gQXNzZXJ0X2ZhaWx1cmVcbmV4Y2VwdGlvbiBJbnZhbGlkX2FyZ3VtZW50ID0gSW52YWxpZF9hcmd1bWVudFxuZXhjZXB0aW9uIEZhaWx1cmUgPSBGYWlsdXJlXG5leGNlcHRpb24gTm90X2ZvdW5kID0gTm90X2ZvdW5kXG5leGNlcHRpb24gT3V0X29mX21lbW9yeSA9IE91dF9vZl9tZW1vcnlcbmV4Y2VwdGlvbiBTdGFja19vdmVyZmxvdyA9IFN0YWNrX292ZXJmbG93XG5leGNlcHRpb24gU3lzX2Vycm9yID0gU3lzX2Vycm9yXG5leGNlcHRpb24gRW5kX29mX2ZpbGUgPSBFbmRfb2ZfZmlsZVxuZXhjZXB0aW9uIERpdmlzaW9uX2J5X3plcm8gPSBEaXZpc2lvbl9ieV96ZXJvXG5leGNlcHRpb24gU3lzX2Jsb2NrZWRfaW8gPSBTeXNfYmxvY2tlZF9pb1xuZXhjZXB0aW9uIFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlID0gVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGVcblxuKCogQ29tcG9zaXRpb24gb3BlcmF0b3JzICopXG5cbmV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5leHRlcm5hbCAoIEBAICkgOiAoJ2EgLT4gJ2IpIC0+ICdhIC0+ICdiID0gXCIlYXBwbHlcIlxuXG4oKiBEZWJ1Z2dpbmcgKilcblxuZXh0ZXJuYWwgX19MT0NfXyA6IHN0cmluZyA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19GSUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfRklMRVwiXG5leHRlcm5hbCBfX0xJTkVfXyA6IGludCA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fTU9EVUxFX18gOiBzdHJpbmcgPSBcIiVsb2NfTU9EVUxFXCJcbmV4dGVybmFsIF9fUE9TX18gOiBzdHJpbmcgKiBpbnQgKiBpbnQgKiBpbnQgPSBcIiVsb2NfUE9TXCJcbmV4dGVybmFsIF9fRlVOQ1RJT05fXyA6IHN0cmluZyA9IFwiJWxvY19GVU5DVElPTlwiXG5cbmV4dGVybmFsIF9fTE9DX09GX18gOiAnYSAtPiBzdHJpbmcgKiAnYSA9IFwiJWxvY19MT0NcIlxuZXh0ZXJuYWwgX19MSU5FX09GX18gOiAnYSAtPiBpbnQgKiAnYSA9IFwiJWxvY19MSU5FXCJcbmV4dGVybmFsIF9fUE9TX09GX18gOiAnYSAtPiAoc3RyaW5nICogaW50ICogaW50ICogaW50KSAqICdhID0gXCIlbG9jX1BPU1wiXG5cbigqIENvbXBhcmlzb25zICopXG5cbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPD4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVub3RlcXVhbFwiXG5leHRlcm5hbCAoIDwgKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG5leHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5leHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG5sZXQgbWluIHggeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG5cbmV4dGVybmFsICggPT0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcVwiXG5leHRlcm5hbCAoICE9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXFcIlxuXG4oKiBCb29sZWFuIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5leHRlcm5hbCAoICYmICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVhbmRcIlxuZXh0ZXJuYWwgKCB8fCApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1b3JcIlxuXG4oKiBJbnRlZ2VyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgKCB+LSApIDogaW50IC0+IGludCA9IFwiJW5lZ2ludFwiXG5leHRlcm5hbCAoIH4rICkgOiBpbnQgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5leHRlcm5hbCAoICsgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYWRkaW50XCJcbmV4dGVybmFsICggLSApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgKCAqICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW11bGludFwiXG5leHRlcm5hbCAoIC8gKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlZGl2aW50XCJcbmV4dGVybmFsICggbW9kICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW1vZGludFwiXG5cbmxldCBhYnMgeCA9IGlmIHggPj0gMCB0aGVuIHggZWxzZSAteFxuXG5leHRlcm5hbCAoIGxhbmQgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYW5kaW50XCJcbmV4dGVybmFsICggbG9yICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxuXG5sZXQgbG5vdCB4ID0geCBseG9yICgtMSlcblxuZXh0ZXJuYWwgKCBsc2wgKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbHNsaW50XCJcbmV4dGVybmFsICggbHNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5leHRlcm5hbCAoIGFzciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhc3JpbnRcIlxuXG5sZXQgbWF4X2ludCA9ICgtMSkgbHNyIDFcbmxldCBtaW5faW50ID0gbWF4X2ludCArIDFcblxuKCogRmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyAqKVxuXG5leHRlcm5hbCAoIH4tLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVuZWdmbG9hdFwiXG5leHRlcm5hbCAoIH4rLiApIDogZmxvYXQgLT4gZmxvYXQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCAoICsuICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWFkZGZsb2F0XCJcbmV4dGVybmFsICggLS4gKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlc3ViZmxvYXRcIlxuZXh0ZXJuYWwgKCAqLiApIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVtdWxmbG9hdFwiXG5leHRlcm5hbCAoIC8uICkgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJWRpdmZsb2F0XCJcbmV4dGVybmFsICggKiogKSA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc19mbG9hdFwiIFwiYWNvc1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXNpbl9mbG9hdFwiIFwiYXNpblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBoeXBvdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0XG4gICAgICAgICAgICAgICA9IFwiY2FtbF9oeXBvdF9mbG9hdFwiIFwiY2FtbF9oeXBvdFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NfZmxvYXRcIiBcImNvc1wiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhY29zaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NoX2Zsb2F0XCIgXCJjYW1sX2Fjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc2luX2Zsb2F0XCIgXCJzaW5cIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luaF9mbG9hdFwiIFwiY2FtbF9hc2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0YW5oIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfdGFuaF9mbG9hdFwiIFwidGFuaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5oX2Zsb2F0XCIgXCJjYW1sX2F0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jZWlsX2Zsb2F0XCIgXCJjZWlsXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb29yIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZmxvb3JfZmxvYXRcIiBcImZsb29yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFic19mbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWJzZmxvYXRcIlxuZXh0ZXJuYWwgY29weXNpZ24gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICAgICAgICAgICAgICAgICAgPSBcImNhbWxfY29weXNpZ25fZmxvYXRcIiBcImNhbWxfY29weXNpZ25cIlxuICAgICAgICAgICAgICAgICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG1vZF9mbG9hdCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Ztb2RfZmxvYXRcIiBcImZtb2RcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5leHRlcm5hbCBsZGV4cCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiAoaW50IFtAdW50YWdnZWRdKSAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfbGRleHBfZmxvYXRcIiBcImNhbWxfbGRleHBfZmxvYXRfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBtb2RmIDogZmxvYXQgLT4gZmxvYXQgKiBmbG9hdCA9IFwiY2FtbF9tb2RmX2Zsb2F0XCJcbmV4dGVybmFsIGZsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBmbG9hdF9vZl9pbnQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIHRydW5jYXRlIDogZmxvYXQgLT4gaW50ID0gXCIlaW50b2ZmbG9hdFwiXG5leHRlcm5hbCBpbnRfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQgPSBcIiVpbnRvZmZsb2F0XCJcbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5sZXQgaW5maW5pdHkgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5sZXQgbmVnX2luZmluaXR5ID1cbiAgZmxvYXRfb2ZfYml0cyAweEZGX0YwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IG5hbiA9XG4gIGZsb2F0X29mX2JpdHMgMHg3Rl9GMF8wMF8wMF8wMF8wMF8wMF8wMUxcbmxldCBtYXhfZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4N0ZfRUZfRkZfRkZfRkZfRkZfRkZfRkZMXG5sZXQgbWluX2Zsb2F0ID1cbiAgZmxvYXRfb2ZfYml0cyAweDAwXzEwXzAwXzAwXzAwXzAwXzAwXzAwTFxubGV0IGVwc2lsb25fZmxvYXQgPVxuICBmbG9hdF9vZl9iaXRzIDB4M0NfQjBfMDBfMDBfMDBfMDBfMDBfMDBMXG5cbnR5cGUgZnBjbGFzcyA9XG4gICAgRlBfbm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsXG4gIHwgRlBfemVyb1xuICB8IEZQX2luZmluaXRlXG4gIHwgRlBfbmFuXG5leHRlcm5hbCBjbGFzc2lmeV9mbG9hdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBmcGNsYXNzID1cbiAgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0XCIgXCJjYW1sX2NsYXNzaWZ5X2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuXG4oKiBTdHJpbmcgYW5kIGJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZXMgU3RyaW5nIGFuZCBCeXRlcyAqKVxuXG5leHRlcm5hbCBzdHJpbmdfbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuZXh0ZXJuYWwgYnl0ZXNfbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbmV4dGVybmFsIGJ5dGVzX2NyZWF0ZSA6IGludCAtPiBieXRlcyA9IFwiY2FtbF9jcmVhdGVfYnl0ZXNcIlxuZXh0ZXJuYWwgc3RyaW5nX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfYmxpdF9zdHJpbmdcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfYmxpdCA6IGJ5dGVzIC0+IGludCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5cbmxldCAoIF4gKSBzMSBzMiA9XG4gIGxldCBsMSA9IHN0cmluZ19sZW5ndGggczEgYW5kIGwyID0gc3RyaW5nX2xlbmd0aCBzMiBpblxuICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSAobDEgKyBsMikgaW5cbiAgc3RyaW5nX2JsaXQgczEgMCBzIDAgbDE7XG4gIHN0cmluZ19ibGl0IHMyIDAgcyBsMSBsMjtcbiAgYnl0ZXNfdW5zYWZlX3RvX3N0cmluZyBzXG5cbigqIENoYXJhY3RlciBvcGVyYXRpb25zIC0tIG1vcmUgaW4gbW9kdWxlIENoYXIgKilcblxuZXh0ZXJuYWwgaW50X29mX2NoYXIgOiBjaGFyIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIHVuc2FmZV9jaGFyX29mX2ludCA6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxubGV0IGNoYXJfb2ZfaW50IG4gPVxuICBpZiBuIDwgMCB8fCBuID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgXCJjaGFyX29mX2ludFwiIGVsc2UgdW5zYWZlX2NoYXJfb2ZfaW50IG5cblxuKCogVW5pdCBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiBQYWlyIG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgZnN0IDogJ2EgKiAnYiAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCBzbmQgOiAnYSAqICdiIC0+ICdiID0gXCIlZmllbGQxXCJcblxuKCogUmVmZXJlbmNlcyAqKVxuXG50eXBlICdhIHJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cbmV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsICggISApIDogJ2EgcmVmIC0+ICdhID0gXCIlZmllbGQwXCJcbmV4dGVybmFsICggOj0gKSA6ICdhIHJlZiAtPiAnYSAtPiB1bml0ID0gXCIlc2V0ZmllbGQwXCJcbmV4dGVybmFsIGluY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVpbmNyXCJcbmV4dGVybmFsIGRlY3IgOiBpbnQgcmVmIC0+IHVuaXQgPSBcIiVkZWNyXCJcblxuKCogUmVzdWx0IHR5cGUgKilcblxudHlwZSAoJ2EsJ2IpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2JcblxuKCogU3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb25zICopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxubGV0IHN0cmluZ19vZl9ib29sIGIgPVxuICBpZiBiIHRoZW4gXCJ0cnVlXCIgZWxzZSBcImZhbHNlXCJcbmxldCBib29sX29mX3N0cmluZyA9IGZ1bmN0aW9uXG4gIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBmYWxzZVxuICB8IF8gLT4gaW52YWxpZF9hcmcgXCJib29sX29mX3N0cmluZ1wiXG5cbmxldCBib29sX29mX3N0cmluZ19vcHQgPSBmdW5jdGlvblxuICB8IFwidHJ1ZVwiIC0+IFNvbWUgdHJ1ZVxuICB8IFwiZmFsc2VcIiAtPiBTb21lIGZhbHNlXG4gIHwgXyAtPiBOb25lXG5cbmxldCBzdHJpbmdfb2ZfaW50IG4gPVxuICBmb3JtYXRfaW50IFwiJWRcIiBuXG5cbmV4dGVybmFsIGludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50ID0gXCJjYW1sX2ludF9vZl9zdHJpbmdcIlxuXG5sZXQgaW50X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGludF9vZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5leHRlcm5hbCBzdHJpbmdfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcblxubGV0IHZhbGlkX2Zsb2F0X2xleGVtIHMgPVxuICBsZXQgbCA9IHN0cmluZ19sZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA+PSBsIHRoZW4gcyBeIFwiLlwiIGVsc2VcbiAgICBtYXRjaCBzdHJpbmdfZ2V0IHMgaSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IGxvb3AgKGkgKyAxKVxuICAgIHwgXyAtPiBzXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgc3RyaW5nX29mX2Zsb2F0IGYgPSB2YWxpZF9mbG9hdF9sZXhlbSAoZm9ybWF0X2Zsb2F0IFwiJS4xMmdcIiBmKVxuXG5leHRlcm5hbCBmbG9hdF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRfb2Zfc3RyaW5nXCJcblxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgcyA9XG4gICgqIFRPRE86IHByb3ZpZGUgdGhpcyBkaXJlY3RseSBhcyBhIG5vbi1yYWlzaW5nIHByaW1pdGl2ZS4gKilcbiAgdHJ5IFNvbWUgKGZsb2F0X29mX3N0cmluZyBzKVxuICB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG5cbigqIExpc3Qgb3BlcmF0aW9ucyAtLSBtb3JlIGluIG1vZHVsZSBMaXN0ICopXG5cbmxldCByZWMgKCBAICkgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBoZCA6OiB0bCAtPiBoZCA6OiAodGwgQCBsMilcblxuKCogSS9PIG9wZXJhdGlvbnMgKilcblxudHlwZSBpbl9jaGFubmVsXG50eXBlIG91dF9jaGFubmVsXG5cbmV4dGVybmFsIG9wZW5fZGVzY3JpcHRvcl9vdXQgOiBpbnQgLT4gb3V0X2NoYW5uZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfb3Blbl9kZXNjcmlwdG9yX291dFwiXG5leHRlcm5hbCBvcGVuX2Rlc2NyaXB0b3JfaW4gOiBpbnQgLT4gaW5fY2hhbm5lbCA9IFwiY2FtbF9tbF9vcGVuX2Rlc2NyaXB0b3JfaW5cIlxuXG5sZXQgc3RkaW4gPSBvcGVuX2Rlc2NyaXB0b3JfaW4gMFxubGV0IHN0ZG91dCA9IG9wZW5fZGVzY3JpcHRvcl9vdXQgMVxubGV0IHN0ZGVyciA9IG9wZW5fZGVzY3JpcHRvcl9vdXQgMlxuXG4oKiBHZW5lcmFsIG91dHB1dCBmdW5jdGlvbnMgKilcblxudHlwZSBvcGVuX2ZsYWcgPVxuICAgIE9wZW5fcmRvbmx5IHwgT3Blbl93cm9ubHkgfCBPcGVuX2FwcGVuZFxuICB8IE9wZW5fY3JlYXQgfCBPcGVuX3RydW5jIHwgT3Blbl9leGNsXG4gIHwgT3Blbl9iaW5hcnkgfCBPcGVuX3RleHQgfCBPcGVuX25vbmJsb2NrXG5cbmV4dGVybmFsIG9wZW5fZGVzYyA6IHN0cmluZyAtPiBvcGVuX2ZsYWcgbGlzdCAtPiBpbnQgLT4gaW50ID0gXCJjYW1sX3N5c19vcGVuXCJcblxuZXh0ZXJuYWwgc2V0X291dF9jaGFubmVsX25hbWU6IG91dF9jaGFubmVsIC0+IHN0cmluZyAtPiB1bml0ID1cbiAgXCJjYW1sX21sX3NldF9jaGFubmVsX25hbWVcIlxuXG5sZXQgb3Blbl9vdXRfZ2VuIG1vZGUgcGVybSBuYW1lID1cbiAgbGV0IGMgPSBvcGVuX2Rlc2NyaXB0b3Jfb3V0KG9wZW5fZGVzYyBuYW1lIG1vZGUgcGVybSkgaW5cbiAgc2V0X291dF9jaGFubmVsX25hbWUgYyBuYW1lO1xuICBjXG5cbmxldCBvcGVuX291dCBuYW1lID1cbiAgb3Blbl9vdXRfZ2VuIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl90cnVuYzsgT3Blbl90ZXh0XSAwbzY2NiBuYW1lXG5cbmxldCBvcGVuX291dF9iaW4gbmFtZSA9XG4gIG9wZW5fb3V0X2dlbiBbT3Blbl93cm9ubHk7IE9wZW5fY3JlYXQ7IE9wZW5fdHJ1bmM7IE9wZW5fYmluYXJ5XSAwbzY2NiBuYW1lXG5cbmV4dGVybmFsIGZsdXNoIDogb3V0X2NoYW5uZWwgLT4gdW5pdCA9IFwiY2FtbF9tbF9mbHVzaFwiXG5cbmV4dGVybmFsIG91dF9jaGFubmVsc19saXN0IDogdW5pdCAtPiBvdXRfY2hhbm5lbCBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9vdXRfY2hhbm5lbHNfbGlzdFwiXG5cbmxldCBmbHVzaF9hbGwgKCkgPVxuICBsZXQgcmVjIGl0ZXIgPSBmdW5jdGlvblxuICAgICAgW10gLT4gKClcbiAgICB8IGE6OmwgLT5cbiAgICAgICAgYmVnaW4gdHJ5XG4gICAgICAgICAgICBmbHVzaCBhXG4gICAgICAgIHdpdGggU3lzX2Vycm9yIF8gLT5cbiAgICAgICAgICAoKSAoKiBpZ25vcmUgY2hhbm5lbHMgY2xvc2VkIGR1cmluZyBhIHByZWNlZGluZyBmbHVzaC4gKilcbiAgICAgICAgZW5kO1xuICAgICAgICBpdGVyIGxcbiAgaW4gaXRlciAob3V0X2NoYW5uZWxzX2xpc3QgKCkpXG5cbmV4dGVybmFsIHVuc2FmZV9vdXRwdXQgOiBvdXRfY2hhbm5lbCAtPiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfb3V0cHV0X2J5dGVzXCJcbmV4dGVybmFsIHVuc2FmZV9vdXRwdXRfc3RyaW5nIDogb3V0X2NoYW5uZWwgLT4gc3RyaW5nIC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfb3V0cHV0XCJcblxuZXh0ZXJuYWwgb3V0cHV0X2NoYXIgOiBvdXRfY2hhbm5lbCAtPiBjaGFyIC0+IHVuaXQgPSBcImNhbWxfbWxfb3V0cHV0X2NoYXJcIlxuXG5sZXQgb3V0cHV0X2J5dGVzIG9jIHMgPVxuICB1bnNhZmVfb3V0cHV0IG9jIHMgMCAoYnl0ZXNfbGVuZ3RoIHMpXG5cbmxldCBvdXRwdXRfc3RyaW5nIG9jIHMgPVxuICB1bnNhZmVfb3V0cHV0X3N0cmluZyBvYyBzIDAgKHN0cmluZ19sZW5ndGggcylcblxubGV0IG91dHB1dCBvYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gYnl0ZXNfbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIm91dHB1dFwiXG4gIGVsc2UgdW5zYWZlX291dHB1dCBvYyBzIG9mcyBsZW5cblxubGV0IG91dHB1dF9zdWJzdHJpbmcgb2MgcyBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IHN0cmluZ19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwib3V0cHV0X3N1YnN0cmluZ1wiXG4gIGVsc2UgdW5zYWZlX291dHB1dF9zdHJpbmcgb2MgcyBvZnMgbGVuXG5cbmV4dGVybmFsIG91dHB1dF9ieXRlIDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfbWxfb3V0cHV0X2NoYXJcIlxuZXh0ZXJuYWwgb3V0cHV0X2JpbmFyeV9pbnQgOiBvdXRfY2hhbm5lbCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9tbF9vdXRwdXRfaW50XCJcblxuZXh0ZXJuYWwgbWFyc2hhbF90b19jaGFubmVsIDogb3V0X2NoYW5uZWwgLT4gJ2EgLT4gdW5pdCBsaXN0IC0+IHVuaXRcbiAgICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlXCJcbmxldCBvdXRwdXRfdmFsdWUgY2hhbiB2ID0gbWFyc2hhbF90b19jaGFubmVsIGNoYW4gdiBbXVxuXG5leHRlcm5hbCBzZWVrX291dCA6IG91dF9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX3NlZWtfb3V0XCJcbmV4dGVybmFsIHBvc19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfcG9zX291dFwiXG5leHRlcm5hbCBvdXRfY2hhbm5lbF9sZW5ndGggOiBvdXRfY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfY2hhbm5lbF9zaXplXCJcbmV4dGVybmFsIGNsb3NlX291dF9jaGFubmVsIDogb3V0X2NoYW5uZWwgLT4gdW5pdCA9IFwiY2FtbF9tbF9jbG9zZV9jaGFubmVsXCJcbmxldCBjbG9zZV9vdXQgb2MgPSBmbHVzaCBvYzsgY2xvc2Vfb3V0X2NoYW5uZWwgb2NcbmxldCBjbG9zZV9vdXRfbm9lcnIgb2MgPVxuICAodHJ5IGZsdXNoIG9jIHdpdGggXyAtPiAoKSk7XG4gICh0cnkgY2xvc2Vfb3V0X2NoYW5uZWwgb2Mgd2l0aCBfIC0+ICgpKVxuZXh0ZXJuYWwgc2V0X2JpbmFyeV9tb2RlX291dCA6IG91dF9jaGFubmVsIC0+IGJvb2wgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9zZXRfYmluYXJ5X21vZGVcIlxuXG4oKiBHZW5lcmFsIGlucHV0IGZ1bmN0aW9ucyAqKVxuXG5leHRlcm5hbCBzZXRfaW5fY2hhbm5lbF9uYW1lOiBpbl9jaGFubmVsIC0+IHN0cmluZyAtPiB1bml0ID1cbiAgXCJjYW1sX21sX3NldF9jaGFubmVsX25hbWVcIlxuXG5sZXQgb3Blbl9pbl9nZW4gbW9kZSBwZXJtIG5hbWUgPVxuICBsZXQgYyA9IG9wZW5fZGVzY3JpcHRvcl9pbihvcGVuX2Rlc2MgbmFtZSBtb2RlIHBlcm0pIGluXG4gIHNldF9pbl9jaGFubmVsX25hbWUgYyBuYW1lO1xuICBjXG5cbmxldCBvcGVuX2luIG5hbWUgPVxuICBvcGVuX2luX2dlbiBbT3Blbl9yZG9ubHk7IE9wZW5fdGV4dF0gMCBuYW1lXG5cbmxldCBvcGVuX2luX2JpbiBuYW1lID1cbiAgb3Blbl9pbl9nZW4gW09wZW5fcmRvbmx5OyBPcGVuX2JpbmFyeV0gMCBuYW1lXG5cbmV4dGVybmFsIGlucHV0X2NoYXIgOiBpbl9jaGFubmVsIC0+IGNoYXIgPSBcImNhbWxfbWxfaW5wdXRfY2hhclwiXG5cbmV4dGVybmFsIHVuc2FmZV9pbnB1dCA6IGluX2NoYW5uZWwgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiBpbnRcbiAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9tbF9pbnB1dFwiXG5cbmxldCBpbnB1dCBpYyBzIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gYnl0ZXNfbGVuZ3RoIHMgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcImlucHV0XCJcbiAgZWxzZSB1bnNhZmVfaW5wdXQgaWMgcyBvZnMgbGVuXG5cbmxldCByZWMgdW5zYWZlX3JlYWxseV9pbnB1dCBpYyBzIG9mcyBsZW4gPVxuICBpZiBsZW4gPD0gMCB0aGVuICgpIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IHVuc2FmZV9pbnB1dCBpYyBzIG9mcyBsZW4gaW5cbiAgICBpZiByID0gMFxuICAgIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGVcbiAgICBlbHNlIHVuc2FmZV9yZWFsbHlfaW5wdXQgaWMgcyAob2ZzICsgcikgKGxlbiAtIHIpXG4gIGVuZFxuXG5sZXQgcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBieXRlc19sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwicmVhbGx5X2lucHV0XCJcbiAgZWxzZSB1bnNhZmVfcmVhbGx5X2lucHV0IGljIHMgb2ZzIGxlblxuXG5sZXQgcmVhbGx5X2lucHV0X3N0cmluZyBpYyBsZW4gPVxuICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSBsZW4gaW5cbiAgcmVhbGx5X2lucHV0IGljIHMgMCBsZW47XG4gIGJ5dGVzX3Vuc2FmZV90b19zdHJpbmcgc1xuXG5leHRlcm5hbCBpbnB1dF9zY2FuX2xpbmUgOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9pbnB1dF9zY2FuX2xpbmVcIlxuXG5sZXQgaW5wdXRfbGluZSBjaGFuID1cbiAgbGV0IHJlYyBidWlsZF9yZXN1bHQgYnVmIHBvcyA9IGZ1bmN0aW9uXG4gICAgW10gLT4gYnVmXG4gIHwgaGQgOjogdGwgLT5cbiAgICAgIGxldCBsZW4gPSBieXRlc19sZW5ndGggaGQgaW5cbiAgICAgIGJ5dGVzX2JsaXQgaGQgMCBidWYgKHBvcyAtIGxlbikgbGVuO1xuICAgICAgYnVpbGRfcmVzdWx0IGJ1ZiAocG9zIC0gbGVuKSB0bCBpblxuICBsZXQgcmVjIHNjYW4gYWNjdSBsZW4gPVxuICAgIGxldCBuID0gaW5wdXRfc2Nhbl9saW5lIGNoYW4gaW5cbiAgICBpZiBuID0gMCB0aGVuIGJlZ2luICAgICAgICAgICAgICAgICAgICgqIG4gPSAwOiB3ZSBhcmUgYXQgRU9GICopXG4gICAgICBtYXRjaCBhY2N1IHdpdGhcbiAgICAgICAgW10gLT4gcmFpc2UgRW5kX29mX2ZpbGVcbiAgICAgIHwgXyAgLT4gYnVpbGRfcmVzdWx0IChieXRlc19jcmVhdGUgbGVuKSBsZW4gYWNjdVxuICAgIGVuZCBlbHNlIGlmIG4gPiAwIHRoZW4gYmVnaW4gICAgICAgICAgKCogbiA+IDA6IG5ld2xpbmUgZm91bmQgaW4gYnVmZmVyICopXG4gICAgICBsZXQgcmVzID0gYnl0ZXNfY3JlYXRlIChuIC0gMSkgaW5cbiAgICAgIGlnbm9yZSAodW5zYWZlX2lucHV0IGNoYW4gcmVzIDAgKG4gLSAxKSk7XG4gICAgICBpZ25vcmUgKGlucHV0X2NoYXIgY2hhbik7ICAgICAgICAgICAoKiBza2lwIHRoZSBuZXdsaW5lICopXG4gICAgICBtYXRjaCBhY2N1IHdpdGhcbiAgICAgICAgW10gLT4gcmVzXG4gICAgICB8ICBfIC0+IGxldCBsZW4gPSBsZW4gKyBuIC0gMSBpblxuICAgICAgICAgICAgICBidWlsZF9yZXN1bHQgKGJ5dGVzX2NyZWF0ZSBsZW4pIGxlbiAocmVzIDo6IGFjY3UpXG4gICAgZW5kIGVsc2UgYmVnaW4gICAgICAgICAgICAgICAgICAgICAgICAoKiBuIDwgMDogbmV3bGluZSBub3QgZm91bmQgKilcbiAgICAgIGxldCBiZWcgPSBieXRlc19jcmVhdGUgKC1uKSBpblxuICAgICAgaWdub3JlKHVuc2FmZV9pbnB1dCBjaGFuIGJlZyAwICgtbikpO1xuICAgICAgc2NhbiAoYmVnIDo6IGFjY3UpIChsZW4gLSBuKVxuICAgIGVuZFxuICBpbiBieXRlc191bnNhZmVfdG9fc3RyaW5nIChzY2FuIFtdIDApXG5cbmV4dGVybmFsIGlucHV0X2J5dGUgOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9pbnB1dF9jaGFyXCJcbmV4dGVybmFsIGlucHV0X2JpbmFyeV9pbnQgOiBpbl9jaGFubmVsIC0+IGludCA9IFwiY2FtbF9tbF9pbnB1dF9pbnRcIlxuZXh0ZXJuYWwgaW5wdXRfdmFsdWUgOiBpbl9jaGFubmVsIC0+ICdhID0gXCJjYW1sX2lucHV0X3ZhbHVlXCJcbmV4dGVybmFsIHNlZWtfaW4gOiBpbl9jaGFubmVsIC0+IGludCAtPiB1bml0ID0gXCJjYW1sX21sX3NlZWtfaW5cIlxuZXh0ZXJuYWwgcG9zX2luIDogaW5fY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfcG9zX2luXCJcbmV4dGVybmFsIGluX2NoYW5uZWxfbGVuZ3RoIDogaW5fY2hhbm5lbCAtPiBpbnQgPSBcImNhbWxfbWxfY2hhbm5lbF9zaXplXCJcbmV4dGVybmFsIGNsb3NlX2luIDogaW5fY2hhbm5lbCAtPiB1bml0ID0gXCJjYW1sX21sX2Nsb3NlX2NoYW5uZWxcIlxubGV0IGNsb3NlX2luX25vZXJyIGljID0gKHRyeSBjbG9zZV9pbiBpYyB3aXRoIF8gLT4gKCkpXG5leHRlcm5hbCBzZXRfYmluYXJ5X21vZGVfaW4gOiBpbl9jaGFubmVsIC0+IGJvb2wgLT4gdW5pdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX21sX3NldF9iaW5hcnlfbW9kZVwiXG5cbigqIE91dHB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgb3V0cHV0ICopXG5cbmxldCBwcmludF9jaGFyIGMgPSBvdXRwdXRfY2hhciBzdGRvdXQgY1xubGV0IHByaW50X3N0cmluZyBzID0gb3V0cHV0X3N0cmluZyBzdGRvdXQgc1xubGV0IHByaW50X2J5dGVzIHMgPSBvdXRwdXRfYnl0ZXMgc3Rkb3V0IHNcbmxldCBwcmludF9pbnQgaSA9IG91dHB1dF9zdHJpbmcgc3Rkb3V0IChzdHJpbmdfb2ZfaW50IGkpXG5sZXQgcHJpbnRfZmxvYXQgZiA9IG91dHB1dF9zdHJpbmcgc3Rkb3V0IChzdHJpbmdfb2ZfZmxvYXQgZilcbmxldCBwcmludF9lbmRsaW5lIHMgPVxuICBvdXRwdXRfc3RyaW5nIHN0ZG91dCBzOyBvdXRwdXRfY2hhciBzdGRvdXQgJ1xcbic7IGZsdXNoIHN0ZG91dFxubGV0IHByaW50X25ld2xpbmUgKCkgPSBvdXRwdXRfY2hhciBzdGRvdXQgJ1xcbic7IGZsdXNoIHN0ZG91dFxuXG4oKiBPdXRwdXQgZnVuY3Rpb25zIG9uIHN0YW5kYXJkIGVycm9yICopXG5cbmxldCBwcmVycl9jaGFyIGMgPSBvdXRwdXRfY2hhciBzdGRlcnIgY1xubGV0IHByZXJyX3N0cmluZyBzID0gb3V0cHV0X3N0cmluZyBzdGRlcnIgc1xubGV0IHByZXJyX2J5dGVzIHMgPSBvdXRwdXRfYnl0ZXMgc3RkZXJyIHNcbmxldCBwcmVycl9pbnQgaSA9IG91dHB1dF9zdHJpbmcgc3RkZXJyIChzdHJpbmdfb2ZfaW50IGkpXG5sZXQgcHJlcnJfZmxvYXQgZiA9IG91dHB1dF9zdHJpbmcgc3RkZXJyIChzdHJpbmdfb2ZfZmxvYXQgZilcbmxldCBwcmVycl9lbmRsaW5lIHMgPVxuICBvdXRwdXRfc3RyaW5nIHN0ZGVyciBzOyBvdXRwdXRfY2hhciBzdGRlcnIgJ1xcbic7IGZsdXNoIHN0ZGVyclxubGV0IHByZXJyX25ld2xpbmUgKCkgPSBvdXRwdXRfY2hhciBzdGRlcnIgJ1xcbic7IGZsdXNoIHN0ZGVyclxuXG4oKiBJbnB1dCBmdW5jdGlvbnMgb24gc3RhbmRhcmQgaW5wdXQgKilcblxubGV0IHJlYWRfbGluZSAoKSA9IGZsdXNoIHN0ZG91dDsgaW5wdXRfbGluZSBzdGRpblxubGV0IHJlYWRfaW50ICgpID0gaW50X29mX3N0cmluZyhyZWFkX2xpbmUoKSlcbmxldCByZWFkX2ludF9vcHQgKCkgPSBpbnRfb2Zfc3RyaW5nX29wdChyZWFkX2xpbmUoKSlcbmxldCByZWFkX2Zsb2F0ICgpID0gZmxvYXRfb2Zfc3RyaW5nKHJlYWRfbGluZSgpKVxubGV0IHJlYWRfZmxvYXRfb3B0ICgpID0gZmxvYXRfb2Zfc3RyaW5nX29wdChyZWFkX2xpbmUoKSlcblxuKCogT3BlcmF0aW9ucyBvbiBsYXJnZSBmaWxlcyAqKVxuXG5tb2R1bGUgTGFyZ2VGaWxlID1cbiAgc3RydWN0XG4gICAgZXh0ZXJuYWwgc2Vla19vdXQgOiBvdXRfY2hhbm5lbCAtPiBpbnQ2NCAtPiB1bml0ID0gXCJjYW1sX21sX3NlZWtfb3V0XzY0XCJcbiAgICBleHRlcm5hbCBwb3Nfb3V0IDogb3V0X2NoYW5uZWwgLT4gaW50NjQgPSBcImNhbWxfbWxfcG9zX291dF82NFwiXG4gICAgZXh0ZXJuYWwgb3V0X2NoYW5uZWxfbGVuZ3RoIDogb3V0X2NoYW5uZWwgLT4gaW50NjRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0XCJcbiAgICBleHRlcm5hbCBzZWVrX2luIDogaW5fY2hhbm5lbCAtPiBpbnQ2NCAtPiB1bml0ID0gXCJjYW1sX21sX3NlZWtfaW5fNjRcIlxuICAgIGV4dGVybmFsIHBvc19pbiA6IGluX2NoYW5uZWwgLT4gaW50NjQgPSBcImNhbWxfbWxfcG9zX2luXzY0XCJcbiAgICBleHRlcm5hbCBpbl9jaGFubmVsX2xlbmd0aCA6IGluX2NoYW5uZWwgLT4gaW50NjQgPSBcImNhbWxfbWxfY2hhbm5lbF9zaXplXzY0XCJcbiAgZW5kXG5cbigqIEZvcm1hdHMgKilcblxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NlxuICAgPSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzLmZvcm1hdDZcbiAgID0gRm9ybWF0IG9mICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuZm10XG4gICAgICAgICAgICAgICAqIHN0cmluZ1xuXG50eXBlICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NCA9ICgnYSwgJ2IsICdjLCAnYywgJ2MsICdkKSBmb3JtYXQ2XG5cbnR5cGUgKCdhLCAnYiwgJ2MpIGZvcm1hdCA9ICgnYSwgJ2IsICdjLCAnYykgZm9ybWF0NFxuXG5sZXQgc3RyaW5nX29mX2Zvcm1hdCAoRm9ybWF0IChfZm10LCBzdHIpKSA9IHN0clxuXG5leHRlcm5hbCBmb3JtYXRfb2Zfc3RyaW5nIDpcbiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPlxuICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgKCBeXiApIChGb3JtYXQgKGZtdDEsIHN0cjEpKSAoRm9ybWF0IChmbXQyLCBzdHIyKSkgPVxuICBGb3JtYXQgKENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5jb25jYXRfZm10IGZtdDEgZm10MixcbiAgICAgICAgICBzdHIxIF4gXCIlLFwiIF4gc3RyMilcblxuKCogTWlzY2VsbGFuZW91cyAqKVxuXG5leHRlcm5hbCBzeXNfZXhpdCA6IGludCAtPiAnYSA9IFwiY2FtbF9zeXNfZXhpdFwiXG5cbigqIGZvciBhdF9leGl0ICopXG50eXBlICdhIGF0b21pY190XG5leHRlcm5hbCBhdG9taWNfbWFrZSA6ICdhIC0+ICdhIGF0b21pY190ID0gXCIlbWFrZW11dGFibGVcIlxuZXh0ZXJuYWwgYXRvbWljX2dldCA6ICdhIGF0b21pY190IC0+ICdhID0gXCIlYXRvbWljX2xvYWRcIlxuZXh0ZXJuYWwgYXRvbWljX2NvbXBhcmVfYW5kX3NldCA6ICdhIGF0b21pY190IC0+ICdhIC0+ICdhIC0+IGJvb2xcbiAgPSBcIiVhdG9taWNfY2FzXCJcblxubGV0IGV4aXRfZnVuY3Rpb24gPSBhdG9taWNfbWFrZSBmbHVzaF9hbGxcblxubGV0IHJlYyBhdF9leGl0IGYgPVxuICAoKiBNUFIjNzI1MywgTVBSIzc3OTY6IG1ha2Ugc3VyZSBcImZcIiBpcyBleGVjdXRlZCBvbmx5IG9uY2UgKilcbiAgbGV0IGZfeWV0X3RvX3J1biA9IGF0b21pY19tYWtlIHRydWUgaW5cbiAgbGV0IG9sZF9leGl0ID0gYXRvbWljX2dldCBleGl0X2Z1bmN0aW9uIGluXG4gIGxldCBuZXdfZXhpdCAoKSA9XG4gICAgaWYgYXRvbWljX2NvbXBhcmVfYW5kX3NldCBmX3lldF90b19ydW4gdHJ1ZSBmYWxzZSB0aGVuIGYgKCkgO1xuICAgIG9sZF9leGl0ICgpXG4gIGluXG4gIGxldCBzdWNjZXNzID0gYXRvbWljX2NvbXBhcmVfYW5kX3NldCBleGl0X2Z1bmN0aW9uIG9sZF9leGl0IG5ld19leGl0IGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gYXRfZXhpdCBmXG5cbmxldCBkb19kb21haW5fbG9jYWxfYXRfZXhpdCA9IHJlZiAoZnVuICgpIC0+ICgpKVxuXG5sZXQgZG9fYXRfZXhpdCAoKSA9XG4gICghZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQpICgpO1xuICAoYXRvbWljX2dldCBleGl0X2Z1bmN0aW9uKSAoKVxuXG5sZXQgZXhpdCByZXRjb2RlID1cbiAgZG9fYXRfZXhpdCAoKTtcbiAgc3lzX2V4aXQgcmV0Y29kZVxuXG5sZXQgXyA9IHJlZ2lzdGVyX25hbWVkX3ZhbHVlIFwiUGVydmFzaXZlcy5kb19hdF9leGl0XCIgZG9fYXRfZXhpdFxuXG4oKk1PRFVMRV9BTElBU0VTKilcbm1vZHVsZSBBcmcgICAgICAgICAgICA9IEFyZ1xubW9kdWxlIEFycmF5ICAgICAgICAgID0gQXJyYXlcbm1vZHVsZSBBcnJheUxhYmVscyAgICA9IEFycmF5TGFiZWxzXG5tb2R1bGUgQXRvbWljICAgICAgICAgPSBBdG9taWNcbm1vZHVsZSBCaWdhcnJheSAgICAgICA9IEJpZ2FycmF5XG5tb2R1bGUgQm9vbCAgICAgICAgICAgPSBCb29sXG5tb2R1bGUgQnVmZmVyICAgICAgICAgPSBCdWZmZXJcbm1vZHVsZSBCeXRlcyAgICAgICAgICA9IEJ5dGVzXG5tb2R1bGUgQnl0ZXNMYWJlbHMgICAgPSBCeXRlc0xhYmVsc1xubW9kdWxlIENhbGxiYWNrICAgICAgID0gQ2FsbGJhY2tcbm1vZHVsZSBDaGFyICAgICAgICAgICA9IENoYXJcbm1vZHVsZSBDb21wbGV4ICAgICAgICA9IENvbXBsZXhcbm1vZHVsZSBDb25kaXRpb24gICAgICA9IENvbmRpdGlvblxubW9kdWxlIERpZ2VzdCAgICAgICAgID0gRGlnZXN0XG5tb2R1bGUgRG9tYWluICAgICAgICAgPSBEb21haW5cbm1vZHVsZSBFZmZlY3QgICAgICAgICA9IEVmZmVjdFxubW9kdWxlIEVpdGhlciAgICAgICAgID0gRWl0aGVyXG5tb2R1bGUgRXBoZW1lcm9uICAgICAgPSBFcGhlbWVyb25cbm1vZHVsZSBGaWxlbmFtZSAgICAgICA9IEZpbGVuYW1lXG5tb2R1bGUgRmxvYXQgICAgICAgICAgPSBGbG9hdFxubW9kdWxlIEZvcm1hdCAgICAgICAgID0gRm9ybWF0XG5tb2R1bGUgRnVuICAgICAgICAgICAgPSBGdW5cbm1vZHVsZSBHYyAgICAgICAgICAgICA9IEdjXG5tb2R1bGUgSGFzaHRibCAgICAgICAgPSBIYXNodGJsXG5tb2R1bGUgSW5fY2hhbm5lbCAgICAgPSBJbl9jaGFubmVsXG5tb2R1bGUgSW50ICAgICAgICAgICAgPSBJbnRcbm1vZHVsZSBJbnQzMiAgICAgICAgICA9IEludDMyXG5tb2R1bGUgSW50NjQgICAgICAgICAgPSBJbnQ2NFxubW9kdWxlIExhenkgICAgICAgICAgID0gTGF6eVxubW9kdWxlIExleGluZyAgICAgICAgID0gTGV4aW5nXG5tb2R1bGUgTGlzdCAgICAgICAgICAgPSBMaXN0XG5tb2R1bGUgTGlzdExhYmVscyAgICAgPSBMaXN0TGFiZWxzXG5tb2R1bGUgTWFwICAgICAgICAgICAgPSBNYXBcbm1vZHVsZSBNYXJzaGFsICAgICAgICA9IE1hcnNoYWxcbm1vZHVsZSBNb3JlTGFiZWxzICAgICA9IE1vcmVMYWJlbHNcbm1vZHVsZSBNdXRleCAgICAgICAgICA9IE11dGV4XG5tb2R1bGUgTmF0aXZlaW50ICAgICAgPSBOYXRpdmVpbnRcbm1vZHVsZSBPYmogICAgICAgICAgICA9IE9ialxubW9kdWxlIE9vICAgICAgICAgICAgID0gT29cbm1vZHVsZSBPcHRpb24gICAgICAgICA9IE9wdGlvblxubW9kdWxlIE91dF9jaGFubmVsICAgID0gT3V0X2NoYW5uZWxcbm1vZHVsZSBQYXJzaW5nICAgICAgICA9IFBhcnNpbmdcbm1vZHVsZSBQcmludGV4YyAgICAgICA9IFByaW50ZXhjXG5tb2R1bGUgUHJpbnRmICAgICAgICAgPSBQcmludGZcbm1vZHVsZSBRdWV1ZSAgICAgICAgICA9IFF1ZXVlXG5tb2R1bGUgUmFuZG9tICAgICAgICAgPSBSYW5kb21cbm1vZHVsZSBSZXN1bHQgICAgICAgICA9IFJlc3VsdFxubW9kdWxlIFNjYW5mICAgICAgICAgID0gU2NhbmZcbm1vZHVsZSBTZW1hcGhvcmUgICAgICA9IFNlbWFwaG9yZVxubW9kdWxlIFNlcSAgICAgICAgICAgID0gU2VxXG5tb2R1bGUgU2V0ICAgICAgICAgICAgPSBTZXRcbm1vZHVsZSBTdGFjayAgICAgICAgICA9IFN0YWNrXG5tb2R1bGUgU3RkTGFiZWxzICAgICAgPSBTdGRMYWJlbHNcbm1vZHVsZSBTdHJpbmcgICAgICAgICA9IFN0cmluZ1xubW9kdWxlIFN0cmluZ0xhYmVscyAgID0gU3RyaW5nTGFiZWxzXG5tb2R1bGUgU3lzICAgICAgICAgICAgPSBTeXNcbm1vZHVsZSBVY2hhciAgICAgICAgICA9IFVjaGFyXG5tb2R1bGUgVW5pdCAgICAgICAgICAgPSBVbml0XG5tb2R1bGUgV2VhayAgICAgICAgICAgPSBXZWFrXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgIEdhYnJpZWwgU2NoZXJlciwgcHJvamV0IFBhcnNpZmFsLCBJTlJJQSBTYWNsYXkgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE5IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgKCdhLCAnYikgdCA9IExlZnQgb2YgJ2EgfCBSaWdodCBvZiAnYlxuXG5sZXQgbGVmdCB2ID0gTGVmdCB2XG5sZXQgcmlnaHQgdiA9IFJpZ2h0IHZcblxubGV0IGlzX2xlZnQgPSBmdW5jdGlvblxufCBMZWZ0IF8gLT4gdHJ1ZVxufCBSaWdodCBfIC0+IGZhbHNlXG5cbmxldCBpc19yaWdodCA9IGZ1bmN0aW9uXG58IExlZnQgXyAtPiBmYWxzZVxufCBSaWdodCBfIC0+IHRydWVcblxubGV0IGZpbmRfbGVmdCA9IGZ1bmN0aW9uXG58IExlZnQgdiAtPiBTb21lIHZcbnwgUmlnaHQgXyAtPiBOb25lXG5cbmxldCBmaW5kX3JpZ2h0ID0gZnVuY3Rpb25cbnwgTGVmdCBfIC0+IE5vbmVcbnwgUmlnaHQgdiAtPiBTb21lIHZcblxubGV0IG1hcF9sZWZ0IGYgPSBmdW5jdGlvblxufCBMZWZ0IHYgLT4gTGVmdCAoZiB2KVxufCBSaWdodCBfIGFzIGUgLT4gZVxuXG5sZXQgbWFwX3JpZ2h0IGYgPSBmdW5jdGlvblxufCBMZWZ0IF8gYXMgZSAtPiBlXG58IFJpZ2h0IHYgLT4gUmlnaHQgKGYgdilcblxubGV0IG1hcCB+bGVmdCB+cmlnaHQgPSBmdW5jdGlvblxufCBMZWZ0IHYgLT4gTGVmdCAobGVmdCB2KVxufCBSaWdodCB2IC0+IFJpZ2h0IChyaWdodCB2KVxuXG5sZXQgZm9sZCB+bGVmdCB+cmlnaHQgPSBmdW5jdGlvblxufCBMZWZ0IHYgLT4gbGVmdCB2XG58IFJpZ2h0IHYgLT4gcmlnaHQgdlxuXG5sZXQgaXRlciA9IGZvbGRcblxubGV0IGZvcl9hbGwgPSBmb2xkXG5cbmxldCBlcXVhbCB+bGVmdCB+cmlnaHQgZTEgZTIgPSBtYXRjaCBlMSwgZTIgd2l0aFxufCBMZWZ0IHYxLCBMZWZ0IHYyIC0+IGxlZnQgdjEgdjJcbnwgUmlnaHQgdjEsIFJpZ2h0IHYyIC0+IHJpZ2h0IHYxIHYyXG58IExlZnQgXywgUmlnaHQgXyB8IFJpZ2h0IF8sIExlZnQgXyAtPiBmYWxzZVxuXG5sZXQgY29tcGFyZSB+bGVmdCB+cmlnaHQgZTEgZTIgPSBtYXRjaCBlMSwgZTIgd2l0aFxufCBMZWZ0IHYxLCBMZWZ0IHYyIC0+IGxlZnQgdjEgdjJcbnwgUmlnaHQgdjEsIFJpZ2h0IHYyIC0+IHJpZ2h0IHYxIHYyXG58IExlZnQgXywgUmlnaHQgXyAtPiAoLTEpXG58IFJpZ2h0IF8sIExlZnQgXyAtPiAxXG4iLCIoKiBAY29uZmlndXJlX2lucHV0QCAqKVxuIzMgXCJzeXMubWwuaW5cIlxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIGJhY2tlbmRfdHlwZSA9XG4gIHwgTmF0aXZlXG4gIHwgQnl0ZWNvZGVcbiAgfCBPdGhlciBvZiBzdHJpbmdcbigqIFN5c3RlbSBpbnRlcmZhY2UgKilcblxuZXh0ZXJuYWwgZ2V0X2NvbmZpZzogdW5pdCAtPiBzdHJpbmcgKiBpbnQgKiBib29sID0gXCJjYW1sX3N5c19nZXRfY29uZmlnXCJcbmV4dGVybmFsIGdldF9leGVjdXRhYmxlX25hbWUgOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZXhlY3V0YWJsZV9uYW1lXCJcbmV4dGVybmFsIGFyZ3YgOiBzdHJpbmcgYXJyYXkgPSBcIiVzeXNfYXJndlwiXG5leHRlcm5hbCBiaWdfZW5kaWFuIDogdW5pdCAtPiBib29sID0gXCIlYmlnX2VuZGlhblwiXG5leHRlcm5hbCB3b3JkX3NpemUgOiB1bml0IC0+IGludCA9IFwiJXdvcmRfc2l6ZVwiXG5leHRlcm5hbCBpbnRfc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlaW50X3NpemVcIlxuZXh0ZXJuYWwgbWF4X3dvc2l6ZSA6IHVuaXQgLT4gaW50ID0gXCIlbWF4X3dvc2l6ZVwiXG5leHRlcm5hbCB1bml4IDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX3VuaXhcIlxuZXh0ZXJuYWwgd2luMzIgOiB1bml0IC0+IGJvb2wgPSBcIiVvc3R5cGVfd2luMzJcIlxuZXh0ZXJuYWwgY3lnd2luIDogdW5pdCAtPiBib29sID0gXCIlb3N0eXBlX2N5Z3dpblwiXG5leHRlcm5hbCBnZXRfYmFja2VuZF90eXBlIDogdW5pdCAtPiBiYWNrZW5kX3R5cGUgPSBcIiViYWNrZW5kX3R5cGVcIlxuXG5sZXQgZXhlY3V0YWJsZV9uYW1lID0gZ2V0X2V4ZWN1dGFibGVfbmFtZSgpXG5sZXQgKG9zX3R5cGUsIF8sIF8pID0gZ2V0X2NvbmZpZygpXG5sZXQgYmFja2VuZF90eXBlID0gZ2V0X2JhY2tlbmRfdHlwZSAoKVxubGV0IGJpZ19lbmRpYW4gPSBiaWdfZW5kaWFuICgpXG5sZXQgd29yZF9zaXplID0gd29yZF9zaXplICgpXG5sZXQgaW50X3NpemUgPSBpbnRfc2l6ZSAoKVxubGV0IHVuaXggPSB1bml4ICgpXG5sZXQgd2luMzIgPSB3aW4zMiAoKVxubGV0IGN5Z3dpbiA9IGN5Z3dpbiAoKVxubGV0IG1heF9hcnJheV9sZW5ndGggPSBtYXhfd29zaXplICgpXG5sZXQgbWF4X2Zsb2F0YXJyYXlfbGVuZ3RoID0gbWF4X2FycmF5X2xlbmd0aCAvICg2NCAvIHdvcmRfc2l6ZSlcbmxldCBtYXhfc3RyaW5nX2xlbmd0aCA9IHdvcmRfc2l6ZSAvIDggKiBtYXhfYXJyYXlfbGVuZ3RoIC0gMVxuZXh0ZXJuYWwgcnVudGltZV92YXJpYW50IDogdW5pdCAtPiBzdHJpbmcgPSBcImNhbWxfcnVudGltZV92YXJpYW50XCJcbmV4dGVybmFsIHJ1bnRpbWVfcGFyYW1ldGVycyA6IHVuaXQgLT4gc3RyaW5nID0gXCJjYW1sX3J1bnRpbWVfcGFyYW1ldGVyc1wiXG5cbmV4dGVybmFsIGZpbGVfZXhpc3RzOiBzdHJpbmcgLT4gYm9vbCA9IFwiY2FtbF9zeXNfZmlsZV9leGlzdHNcIlxuZXh0ZXJuYWwgaXNfZGlyZWN0b3J5IDogc3RyaW5nIC0+IGJvb2wgPSBcImNhbWxfc3lzX2lzX2RpcmVjdG9yeVwiXG5leHRlcm5hbCByZW1vdmU6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19yZW1vdmVcIlxuZXh0ZXJuYWwgcmVuYW1lIDogc3RyaW5nIC0+IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3N5c19yZW5hbWVcIlxuZXh0ZXJuYWwgZ2V0ZW52OiBzdHJpbmcgLT4gc3RyaW5nID0gXCJjYW1sX3N5c19nZXRlbnZcIlxuXG5sZXQgZ2V0ZW52X29wdCBzID1cbiAgKCogVE9ETzogZXhwb3NlIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlIGRpcmVjdGx5LiAqKVxuICB0cnkgU29tZSAoZ2V0ZW52IHMpXG4gIHdpdGggTm90X2ZvdW5kIC0+IE5vbmVcblxuZXh0ZXJuYWwgY29tbWFuZDogc3RyaW5nIC0+IGludCA9IFwiY2FtbF9zeXNfc3lzdGVtX2NvbW1hbmRcIlxuZXh0ZXJuYWwgdGltZTogdW5pdCAtPiAoZmxvYXQgW0B1bmJveGVkXSkgPVxuICBcImNhbWxfc3lzX3RpbWVcIiBcImNhbWxfc3lzX3RpbWVfdW5ib3hlZFwiIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBjaGRpcjogc3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfc3lzX2NoZGlyXCJcbmV4dGVybmFsIG1rZGlyOiBzdHJpbmcgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfc3lzX21rZGlyXCJcbmV4dGVybmFsIHJtZGlyOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9zeXNfcm1kaXJcIlxuZXh0ZXJuYWwgZ2V0Y3dkOiB1bml0IC0+IHN0cmluZyA9IFwiY2FtbF9zeXNfZ2V0Y3dkXCJcbmV4dGVybmFsIHJlYWRkaXIgOiBzdHJpbmcgLT4gc3RyaW5nIGFycmF5ID0gXCJjYW1sX3N5c19yZWFkX2RpcmVjdG9yeVwiXG5cbmxldCBpbnRlcmFjdGl2ZSA9IHJlZiBmYWxzZVxuXG50eXBlIHNpZ25hbF9iZWhhdmlvciA9XG4gICAgU2lnbmFsX2RlZmF1bHRcbiAgfCBTaWduYWxfaWdub3JlXG4gIHwgU2lnbmFsX2hhbmRsZSBvZiAoaW50IC0+IHVuaXQpXG5cbmV4dGVybmFsIHNpZ25hbCA6IGludCAtPiBzaWduYWxfYmVoYXZpb3IgLT4gc2lnbmFsX2JlaGF2aW9yXG4gICAgICAgICAgICAgICAgPSBcImNhbWxfaW5zdGFsbF9zaWduYWxfaGFuZGxlclwiXG5cbmxldCBzZXRfc2lnbmFsIHNpZ19udW0gc2lnX2JlaCA9IGlnbm9yZShzaWduYWwgc2lnX251bSBzaWdfYmVoKVxuXG5sZXQgc2lnYWJydCA9IC0xXG5sZXQgc2lnYWxybSA9IC0yXG5sZXQgc2lnZnBlID0gLTNcbmxldCBzaWdodXAgPSAtNFxubGV0IHNpZ2lsbCA9IC01XG5sZXQgc2lnaW50ID0gLTZcbmxldCBzaWdraWxsID0gLTdcbmxldCBzaWdwaXBlID0gLThcbmxldCBzaWdxdWl0ID0gLTlcbmxldCBzaWdzZWd2ID0gLTEwXG5sZXQgc2lndGVybSA9IC0xMVxubGV0IHNpZ3VzcjEgPSAtMTJcbmxldCBzaWd1c3IyID0gLTEzXG5sZXQgc2lnY2hsZCA9IC0xNFxubGV0IHNpZ2NvbnQgPSAtMTVcbmxldCBzaWdzdG9wID0gLTE2XG5sZXQgc2lndHN0cCA9IC0xN1xubGV0IHNpZ3R0aW4gPSAtMThcbmxldCBzaWd0dG91ID0gLTE5XG5sZXQgc2lndnRhbHJtID0gLTIwXG5sZXQgc2lncHJvZiA9IC0yMVxubGV0IHNpZ2J1cyA9IC0yMlxubGV0IHNpZ3BvbGwgPSAtMjNcbmxldCBzaWdzeXMgPSAtMjRcbmxldCBzaWd0cmFwID0gLTI1XG5sZXQgc2lndXJnID0gLTI2XG5sZXQgc2lneGNwdSA9IC0yN1xubGV0IHNpZ3hmc3ogPSAtMjhcblxuZXhjZXB0aW9uIEJyZWFrXG5cbmxldCBjYXRjaF9icmVhayBvbiA9XG4gIGlmIG9uIHRoZW5cbiAgICBzZXRfc2lnbmFsIHNpZ2ludCAoU2lnbmFsX2hhbmRsZShmdW4gXyAtPiByYWlzZSBCcmVhaykpXG4gIGVsc2VcbiAgICBzZXRfc2lnbmFsIHNpZ2ludCBTaWduYWxfZGVmYXVsdFxuXG5cbmV4dGVybmFsIGVuYWJsZV9ydW50aW1lX3dhcm5pbmdzOiBib29sIC0+IHVuaXQgPVxuICBcImNhbWxfbWxfZW5hYmxlX3J1bnRpbWVfd2FybmluZ3NcIlxuZXh0ZXJuYWwgcnVudGltZV93YXJuaW5nc19lbmFibGVkOiB1bml0IC0+IGJvb2wgPVxuICBcImNhbWxfbWxfcnVudGltZV93YXJuaW5nc19lbmFibGVkXCJcblxuKCogVGhlIHZlcnNpb24gc3RyaW5nIGlzIGZvdW5kIGluIGZpbGUgLi4vVkVSU0lPTiAqKVxuXG5sZXQgb2NhbWxfdmVyc2lvbiA9IFwiQFZFUlNJT05AXCJcblxubGV0IGRldmVsb3BtZW50X3ZlcnNpb24gPSBAT0NBTUxfREVWRUxPUE1FTlRfVkVSU0lPTkBcblxudHlwZSBleHRyYV9wcmVmaXggPSBQbHVzIHwgVGlsZGVcblxudHlwZSBleHRyYV9pbmZvID0gZXh0cmFfcHJlZml4ICogc3RyaW5nXG5cbnR5cGUgb2NhbWxfcmVsZWFzZV9pbmZvID0ge1xuICBtYWpvciA6IGludDtcbiAgbWlub3IgOiBpbnQ7XG4gIHBhdGNobGV2ZWwgOiBpbnQ7XG4gIGV4dHJhIDogZXh0cmFfaW5mbyBvcHRpb25cbn1cblxubGV0IG9jYW1sX3JlbGVhc2UgPSB7XG4gIG1ham9yID0gQE9DQU1MX1ZFUlNJT05fTUFKT1JAO1xuICBtaW5vciA9IEBPQ0FNTF9WRVJTSU9OX01JTk9SQDtcbiAgcGF0Y2hsZXZlbCA9IEBPQ0FNTF9WRVJTSU9OX1BBVENITEVWRUxAO1xuICBleHRyYSA9IEBPQ0FNTF9SRUxFQVNFX0VYVFJBQFxufVxuXG4oKiBPcHRpbWl6YXRpb24gKilcblxuZXh0ZXJuYWwgb3BhcXVlX2lkZW50aXR5IDogJ2EgLT4gJ2EgPSBcIiVvcGFxdWVcIlxuXG5tb2R1bGUgSW1tZWRpYXRlNjQgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgTm9uX2ltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdFxuICBlbmRcbiAgbW9kdWxlIHR5cGUgSW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZV1cbiAgZW5kXG5cbiAgbW9kdWxlIE1ha2UoSW1tZWRpYXRlIDogSW1tZWRpYXRlKShOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZSkgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlNjRdXG4gICAgdHlwZSAnYSByZXByID1cbiAgICAgIHwgSW1tZWRpYXRlIDogSW1tZWRpYXRlLnQgcmVwclxuICAgICAgfCBOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZS50IHJlcHJcbiAgICBleHRlcm5hbCBtYWdpYyA6IF8gcmVwciAtPiB0IHJlcHIgPSBcIiVpZGVudGl0eVwiXG4gICAgbGV0IHJlcHIgPVxuICAgICAgaWYgd29yZF9zaXplID0gNjQgdGhlblxuICAgICAgICBtYWdpYyBJbW1lZGlhdGVcbiAgICAgIGVsc2VcbiAgICAgICAgbWFnaWMgTm9uX2ltbWVkaWF0ZVxuICBlbmRcbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBPcGVyYXRpb25zIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9ucyBvZiB2YWx1ZXMgKilcblxudHlwZSB0XG5cbnR5cGUgcmF3X2RhdGEgPSBuYXRpdmVpbnRcblxuZXh0ZXJuYWwgcmVwciA6ICdhIC0+IHQgPSBcIiVpZGVudGl0eVwiXG5leHRlcm5hbCBvYmogOiB0IC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgbWFnaWMgOiAnYSAtPiAnYiA9IFwiJWlkZW50aXR5XCJcbmV4dGVybmFsIGlzX2ludCA6IHQgLT4gYm9vbCA9IFwiJW9ial9pc19pbnRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gaXNfYmxvY2sgYSA9IG5vdCAoaXNfaW50IGEpXG5leHRlcm5hbCB0YWcgOiB0IC0+IGludCA9IFwiY2FtbF9vYmpfdGFnXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpemUgOiB0IC0+IGludCA9IFwiJW9ial9zaXplXCJcbmV4dGVybmFsIHJlYWNoYWJsZV93b3JkcyA6IHQgLT4gaW50ID0gXCJjYW1sX29ial9yZWFjaGFibGVfd29yZHNcIlxuZXh0ZXJuYWwgZmllbGQgOiB0IC0+IGludCAtPiB0ID0gXCIlb2JqX2ZpZWxkXCJcbmV4dGVybmFsIHNldF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdW5pdCA9IFwiJW9ial9zZXRfZmllbGRcIlxuZXh0ZXJuYWwgY29tcGFyZV9hbmRfc3dhcF9maWVsZCA6IHQgLT4gaW50IC0+IHQgLT4gdCAtPiBib29sXG4gID0gXCJjYW1sX29ial9jb21wYXJlX2FuZF9zd2FwXCJcbmV4dGVybmFsIGlzX3NoYXJlZCA6IHQgLT4gYm9vbCA9IFwiY2FtbF9vYmpfaXNfc2hhcmVkXCJcbmV4dGVybmFsIGZsb2F0YXJyYXlfZ2V0IDogZmxvYXRhcnJheSAtPiBpbnQgLT4gZmxvYXQgPSBcImNhbWxfZmxvYXRhcnJheV9nZXRcIlxuZXh0ZXJuYWwgZmxvYXRhcnJheV9zZXQgOlxuICAgIGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXQgPSBcImNhbWxfZmxvYXRhcnJheV9zZXRcIlxubGV0IFtAaW5saW5lIGFsd2F5c10gZG91YmxlX2ZpZWxkIHggaSA9IGZsb2F0YXJyYXlfZ2V0IChvYmogeCA6IGZsb2F0YXJyYXkpIGlcbmxldCBbQGlubGluZSBhbHdheXNdIHNldF9kb3VibGVfZmllbGQgeCBpIHYgPVxuICBmbG9hdGFycmF5X3NldCAob2JqIHggOiBmbG9hdGFycmF5KSBpIHZcbmV4dGVybmFsIHJhd19maWVsZCA6IHQgLT4gaW50IC0+IHJhd19kYXRhID0gXCJjYW1sX29ial9yYXdfZmllbGRcIlxuZXh0ZXJuYWwgc2V0X3Jhd19maWVsZCA6IHQgLT4gaW50IC0+IHJhd19kYXRhIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX29ial9zZXRfcmF3X2ZpZWxkXCJcblxuZXh0ZXJuYWwgbmV3X2Jsb2NrIDogaW50IC0+IGludCAtPiB0ID0gXCJjYW1sX29ial9ibG9ja1wiXG5leHRlcm5hbCBkdXAgOiB0IC0+IHQgPSBcImNhbWxfb2JqX2R1cFwiXG5leHRlcm5hbCBhZGRfb2Zmc2V0IDogdCAtPiBJbnQzMi50IC0+IHQgPSBcImNhbWxfb2JqX2FkZF9vZmZzZXRcIlxuZXh0ZXJuYWwgd2l0aF90YWcgOiBpbnQgLT4gdCAtPiB0ID0gXCJjYW1sX29ial93aXRoX3RhZ1wiXG5cbmxldCBmaXJzdF9ub25fY29uc3RhbnRfY29uc3RydWN0b3JfdGFnID0gMFxubGV0IGxhc3Rfbm9uX2NvbnN0YW50X2NvbnN0cnVjdG9yX3RhZyA9IDI0M1xuXG5sZXQgZm9yY2luZ190YWcgPSAyNDRcbmxldCBjb250X3RhZyA9IDI0NVxubGV0IGxhenlfdGFnID0gMjQ2XG5sZXQgY2xvc3VyZV90YWcgPSAyNDdcbmxldCBvYmplY3RfdGFnID0gMjQ4XG5sZXQgaW5maXhfdGFnID0gMjQ5XG5sZXQgZm9yd2FyZF90YWcgPSAyNTBcblxubGV0IG5vX3NjYW5fdGFnID0gMjUxXG5cbmxldCBhYnN0cmFjdF90YWcgPSAyNTFcbmxldCBzdHJpbmdfdGFnID0gMjUyXG5sZXQgZG91YmxlX3RhZyA9IDI1M1xubGV0IGRvdWJsZV9hcnJheV90YWcgPSAyNTRcbmxldCBjdXN0b21fdGFnID0gMjU1XG5cblxubGV0IGludF90YWcgPSAxMDAwXG5sZXQgb3V0X29mX2hlYXBfdGFnID0gMTAwMVxubGV0IHVuYWxpZ25lZF90YWcgPSAxMDAyXG5cbm1vZHVsZSBDbG9zdXJlID0gc3RydWN0XG4gIHR5cGUgaW5mbyA9IHtcbiAgICBhcml0eTogaW50O1xuICAgIHN0YXJ0X2VudjogaW50O1xuICB9XG5cbiAgbGV0IGluZm9fb2ZfcmF3IChpbmZvIDogbmF0aXZlaW50KSA9XG4gICAgbGV0IG9wZW4gTmF0aXZlaW50IGluXG4gICAgbGV0IGFyaXR5ID1cbiAgICAgICgqIHNpZ25lZDogbmVnYXRpdmUgZm9yIHR1cGxlZCBmdW5jdGlvbnMgKilcbiAgICAgIGlmIFN5cy53b3JkX3NpemUgPSA2NCB0aGVuXG4gICAgICAgIHRvX2ludCAoc2hpZnRfcmlnaHQgaW5mbyA1NilcbiAgICAgIGVsc2VcbiAgICAgICAgdG9faW50IChzaGlmdF9yaWdodCBpbmZvIDI0KVxuICAgIGluXG4gICAgbGV0IHN0YXJ0X2VudiA9XG4gICAgICAoKiBzdGFydF9lbnYgaXMgdW5zaWduZWQsIGJ1dCB3ZSBrbm93IGl0IGNhbiBhbHdheXMgZml0IGFuIE9DYW1sXG4gICAgICAgICBpbnRlZ2VyIHNvIHdlIHVzZSBbdG9faW50XSBpbnN0ZWFkIG9mIFt1bnNpZ25lZF90b19pbnRdLiAqKVxuICAgICAgdG9faW50IChzaGlmdF9yaWdodF9sb2dpY2FsIChzaGlmdF9sZWZ0IGluZm8gOCkgOSkgaW5cbiAgICB7IGFyaXR5OyBzdGFydF9lbnYgfVxuXG4gICgqIG5vdGU6IHdlIGV4cGVjdCBhIGNsb3N1cmUsIG5vdCBhbiBpbmZpeCBwb2ludGVyICopXG4gIGxldCBpbmZvIChvYmogOiB0KSA9XG4gICAgYXNzZXJ0ICh0YWcgb2JqID0gY2xvc3VyZV90YWcpO1xuICAgIGluZm9fb2ZfcmF3IChyYXdfZmllbGQgb2JqIDEpXG5lbmRcblxubW9kdWxlIEV4dGVuc2lvbl9jb25zdHJ1Y3RvciA9XG5zdHJ1Y3RcbiAgdHlwZSB0ID0gZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXG4gIGxldCBvZl92YWwgeCA9XG4gICAgbGV0IHggPSByZXByIHggaW5cbiAgICBsZXQgc2xvdCA9XG4gICAgICBpZiAoaXNfYmxvY2sgeCkgJiYgKHRhZyB4KSA8PiBvYmplY3RfdGFnICYmIChzaXplIHgpID49IDEgdGhlbiBmaWVsZCB4IDBcbiAgICAgIGVsc2UgeFxuICAgIGluXG4gICAgbGV0IG5hbWUgPVxuICAgICAgaWYgKGlzX2Jsb2NrIHNsb3QpICYmICh0YWcgc2xvdCkgPSBvYmplY3RfdGFnIHRoZW4gZmllbGQgc2xvdCAwXG4gICAgICBlbHNlIGludmFsaWRfYXJnIFwiT2JqLmV4dGVuc2lvbl9jb25zdHJ1Y3RvclwiXG4gICAgaW5cbiAgICAgIGlmICh0YWcgbmFtZSkgPSBzdHJpbmdfdGFnIHRoZW4gKG9iaiBzbG90IDogdClcbiAgICAgIGVsc2UgaW52YWxpZF9hcmcgXCJPYmouZXh0ZW5zaW9uX2NvbnN0cnVjdG9yXCJcblxuICBsZXQgW0BpbmxpbmUgYWx3YXlzXSBuYW1lIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDApIDogc3RyaW5nKVxuXG4gIGxldCBbQGlubGluZSBhbHdheXNdIGlkIChzbG90IDogdCkgPVxuICAgIChvYmogKGZpZWxkIChyZXByIHNsb3QpIDEpIDogaW50KVxuZW5kXG5cbm1vZHVsZSBFcGhlbWVyb24gPSBzdHJ1Y3RcbiAgdHlwZSBvYmpfdCA9IHRcblxuICB0eXBlIHQgKCoqIGVwaGVtZXJvbiAqKVxuXG4gICAoKiogVG8gY2hhbmdlIGluIHN5bmMgd2l0aCB3ZWFrLmggKilcbiAgbGV0IGFkZGl0aW9uYWxfdmFsdWVzID0gMlxuICBsZXQgbWF4X2VwaGVfbGVuZ3RoID0gU3lzLm1heF9hcnJheV9sZW5ndGggLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiB0ID0gXCJjYW1sX2VwaGVfY3JlYXRlXCJcbiAgbGV0IGNyZWF0ZSBsID1cbiAgICBpZiBub3QgKDAgPD0gbCAmJiBsIDw9IG1heF9lcGhlX2xlbmd0aCkgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJPYmouRXBoZW1lcm9uLmNyZWF0ZVwiO1xuICAgIGNyZWF0ZSBsXG5cbiAgbGV0IGxlbmd0aCB4ID0gc2l6ZShyZXByIHgpIC0gYWRkaXRpb25hbF92YWx1ZXNcblxuICBsZXQgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIG1zZyA9XG4gICAgaWYgbm90ICgwIDw9IG8gJiYgbyA8IGxlbmd0aCBlKSB0aGVuXG4gICAgICBpbnZhbGlkX2FyZyBtc2dcblxuICBleHRlcm5hbCBnZXRfa2V5OiB0IC0+IGludCAtPiBvYmpfdCBvcHRpb24gPSBcImNhbWxfZXBoZV9nZXRfa2V5XCJcbiAgbGV0IGdldF9rZXkgZSBvID1cbiAgICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJPYmouRXBoZW1lcm9uLmdldF9rZXlcIjtcbiAgICBnZXRfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGdldF9rZXlfY29weTogdCAtPiBpbnQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2tleV9jb3B5XCJcbiAgbGV0IGdldF9rZXlfY29weSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uZ2V0X2tleV9jb3B5XCI7XG4gICAgZ2V0X2tleV9jb3B5IGUgb1xuXG4gIGV4dGVybmFsIHNldF9rZXk6IHQgLT4gaW50IC0+IG9ial90IC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfa2V5XCJcbiAgbGV0IHNldF9rZXkgZSBvIHggPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uc2V0X2tleVwiO1xuICAgIHNldF9rZXkgZSBvIHhcblxuICBleHRlcm5hbCB1bnNldF9rZXk6IHQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9rZXlcIlxuICBsZXQgdW5zZXRfa2V5IGUgbyA9XG4gICAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiT2JqLkVwaGVtZXJvbi51bnNldF9rZXlcIjtcbiAgICB1bnNldF9rZXkgZSBvXG5cbiAgZXh0ZXJuYWwgY2hlY2tfa2V5OiB0IC0+IGludCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfa2V5XCJcbiAgbGV0IGNoZWNrX2tleSBlIG8gPVxuICAgIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIk9iai5FcGhlbWVyb24uY2hlY2tfa2V5XCI7XG4gICAgY2hlY2tfa2V5IGUgb1xuXG4gIGV4dGVybmFsIGJsaXRfa2V5IDogdCAtPiBpbnQgLT4gdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9lcGhlX2JsaXRfa2V5XCJcblxuICBsZXQgYmxpdF9rZXkgZTEgbzEgZTIgbzIgbCA9XG4gICAgaWYgbCA8IDAgfHwgbzEgPCAwIHx8IG8xID4gbGVuZ3RoIGUxIC0gbFxuICAgICAgIHx8IG8yIDwgMCB8fCBvMiA+IGxlbmd0aCBlMiAtIGxcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiT2JqLkVwaGVtZXJvbi5ibGl0X2tleVwiXG4gICAgZWxzZSBpZiBsIDw+IDAgdGhlbiBibGl0X2tleSBlMSBvMSBlMiBvMiBsXG5cbiAgZXh0ZXJuYWwgZ2V0X2RhdGE6IHQgLT4gb2JqX3Qgb3B0aW9uID0gXCJjYW1sX2VwaGVfZ2V0X2RhdGFcIlxuICBleHRlcm5hbCBnZXRfZGF0YV9jb3B5OiB0IC0+IG9ial90IG9wdGlvbiA9IFwiY2FtbF9lcGhlX2dldF9kYXRhX2NvcHlcIlxuICBleHRlcm5hbCBzZXRfZGF0YTogdCAtPiBvYmpfdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfc2V0X2RhdGFcIlxuICBleHRlcm5hbCB1bnNldF9kYXRhOiB0IC0+IHVuaXQgPSBcImNhbWxfZXBoZV91bnNldF9kYXRhXCJcbiAgZXh0ZXJuYWwgY2hlY2tfZGF0YTogdCAtPiBib29sID0gXCJjYW1sX2VwaGVfY2hlY2tfZGF0YVwiXG4gIGV4dGVybmFsIGJsaXRfZGF0YSA6IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2VwaGVfYmxpdF9kYXRhXCJcblxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgU3RlcGhlbiBEb2xhbiwgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE3LTIwMTggVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgISdhIHRcblxuZXh0ZXJuYWwgbWFrZSA6ICdhIC0+ICdhIHQgPSBcIiVtYWtlbXV0YWJsZVwiXG5leHRlcm5hbCBnZXQgOiAnYSB0IC0+ICdhID0gXCIlYXRvbWljX2xvYWRcIlxuZXh0ZXJuYWwgZXhjaGFuZ2UgOiAnYSB0IC0+ICdhIC0+ICdhID0gXCIlYXRvbWljX2V4Y2hhbmdlXCJcbmV4dGVybmFsIGNvbXBhcmVfYW5kX3NldCA6ICdhIHQgLT4gJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWF0b21pY19jYXNcIlxuZXh0ZXJuYWwgZmV0Y2hfYW5kX2FkZCA6IGludCB0IC0+IGludCAtPiBpbnQgPSBcIiVhdG9taWNfZmV0Y2hfYWRkXCJcbmV4dGVybmFsIGlnbm9yZSA6ICdhIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG5sZXQgc2V0IHIgeCA9IGlnbm9yZSAoZXhjaGFuZ2UgciB4KVxubGV0IGluY3IgciA9IGlnbm9yZSAoZmV0Y2hfYW5kX2FkZCByIDEpXG5sZXQgZGVjciByID0gaWdub3JlIChmZXRjaF9hbmRfYWRkIHIgKC0xKSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogSW50ZXJuYWxzIG9mIGZvcmNpbmcgbGF6eSB2YWx1ZXMuICopXG5cbnR5cGUgJ2EgdCA9ICdhIGxhenlfdFxuXG5leGNlcHRpb24gVW5kZWZpbmVkXG5cbigqIFt1cGRhdGVfdG9fZm9yY2luZyBibGtdIHRyaWVzIHRvIHVwZGF0ZSBhIFtibGtdIHdpdGggW2xhenlfdGFnXSB0b1xuICAgW2ZvcmNpbmdfdGFnXSB1c2luZyBjb21wYXJlLWFuZC1zd2FwIChDQVMpLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGUgaGVhZGVyIHdvcmQgYnkgYSBjb25jdXJyZW50IEdDIHRocmVhZC4gUmV0dXJucyBbMF0gaWYgdGhlXG4gICBDQVMgaXMgc3VjY2Vzc2Z1bC4gSWYgdGhlIENBUyBmYWlscywgdGhlbiB0aGUgdGFnIHdhcyBvYnNlcnZlZCB0byBiZVxuICAgc29tZXRoaW5nIG90aGVyIHRoYW4gW2xhenlfdGFnXSBkdWUgdG8gYSBjb25jdXJyZW50IG11dGF0b3IuIEluIHRoaXMgY2FzZSxcbiAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIFsxXS4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3JjaW5nIDogT2JqLnQgLT4gaW50ID1cbiAgXCJjYW1sX2xhenlfdXBkYXRlX3RvX2ZvcmNpbmdcIiBbQEBub2FsbG9jXVxuXG4oKiBbcmVzZXRfdG9fbGF6eSBibGtdIGV4cGVjdHMgW2Jsa10gdG8gYmUgYSBsYXp5IG9iamVjdCB3aXRoIFtPYmouZm9yY2luZ190YWddXG4gICBhbmQgdXBkYXRlcyB0aGUgdGFnIHRvIFtPYmoubGF6eV90YWddLCB0YWtpbmcgY2FyZSB0byBoYW5kbGUgY29uY3VycmVudFxuICAgbWFya2luZyBvZiB0aGlzIG9iamVjdCdzIGhlYWRlciBieSBhIGNvbmN1cnJlbnQgR0MgdGhyZWFkLiAqKVxuZXh0ZXJuYWwgcmVzZXRfdG9fbGF6eSA6IE9iai50IC0+IHVuaXQgPSBcImNhbWxfbGF6eV9yZXNldF90b19sYXp5XCIgW0BAbm9hbGxvY11cblxuKCogW3VwZGF0ZV90b19mb3J3YXJkIGJsa10gZXhwZWN0cyBbYmxrXSB0byBiZSBhIGxhenkgb2JqZWN0IHdpdGhcbiAgIFtPYmouZm9yY2luZ190YWddIGFuZCB1cGRhdGVzIHRoZSB0YWcgdG8gW09iai5mb3J3YXJkX3RhZ10sIHRha2luZyBjYXJlIHRvXG4gICBoYW5kbGUgY29uY3VycmVudCBtYXJraW5nIG9mIHRoaXMgb2JqZWN0J3MgaGVhZGVyIGJ5IGEgY29uY3VycmVudCBHQyB0aHJlYWQuXG4gKilcbmV4dGVybmFsIHVwZGF0ZV90b19mb3J3YXJkIDogT2JqLnQgLT4gdW5pdCA9XG4gIFwiY2FtbF9sYXp5X3VwZGF0ZV90b19mb3J3YXJkXCIgW0BAbm9hbGxvY11cblxuKCogQXNzdW1lcyBbYmxrXSBpcyBhIGJsb2NrIHdpdGggdGFnIGZvcmNpbmcgKilcbmxldCBkb19mb3JjZV9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICB0cnlcbiAgICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciByZXN1bHQpO1xuICAgIHVwZGF0ZV90b19mb3J3YXJkIGI7XG4gICAgcmVzdWx0XG4gIHdpdGggZSAtPlxuICAgIE9iai5zZXRfZmllbGQgYiAwIChPYmoucmVwciAoZnVuICgpIC0+IHJhaXNlIGUpKTtcbiAgICByZXNldF90b19sYXp5IGI7XG4gICAgcmFpc2UgZVxuXG4oKiBBc3N1bWVzIFtibGtdIGlzIGEgYmxvY2sgd2l0aCB0YWcgZm9yY2luZyAqKVxubGV0IGRvX2ZvcmNlX3ZhbF9ibG9jayBibGsgPVxuICBsZXQgYiA9IE9iai5yZXByIGJsayBpblxuICBsZXQgY2xvc3VyZSA9IChPYmoub2JqIChPYmouZmllbGQgYiAwKSA6IHVuaXQgLT4gJ2FyZykgaW5cbiAgT2JqLnNldF9maWVsZCBiIDAgKE9iai5yZXByICgpKTsgKCogUmVsZWFzZSB0aGUgY2xvc3VyZSAqKVxuICBsZXQgcmVzdWx0ID0gY2xvc3VyZSAoKSBpblxuICBPYmouc2V0X2ZpZWxkIGIgMCAoT2JqLnJlcHIgcmVzdWx0KTtcbiAgdXBkYXRlX3RvX2ZvcndhcmQgYjtcbiAgcmVzdWx0XG5cbigqIENhbGxlZCBieSBbZm9yY2VfZ2VuXSAqKVxubGV0IGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCAoYmxrIDogJ2FyZyBsYXp5X3QpID1cbiAgKCogV2UgZXhwZWN0IHRoZSB0YWcgdG8gYmUgW2xhenlfdGFnXSwgYnV0IG1heSBiZSBvdGhlciB0YWdzIGR1ZSB0b1xuICAgICBjb25jdXJyZW50IGZvcmNpbmcgb2YgbGF6eSB2YWx1ZXMuICopXG4gIG1hdGNoIHVwZGF0ZV90b19mb3JjaW5nIChPYmoucmVwciBibGspIHdpdGhcbiAgfCAwIHdoZW4gb25seV92YWwgLT4gZG9fZm9yY2VfdmFsX2Jsb2NrIGJsa1xuICB8IDAgLT4gZG9fZm9yY2VfYmxvY2sgYmxrXG4gIHwgXyAtPiByYWlzZSBVbmRlZmluZWRcblxuKCogdXNlZCBpbiB0aGUgJWxhenlfZm9yY2UgcHJpbWl0aXZlICopXG5sZXQgZm9yY2VfbGF6eV9ibG9jayBibGsgPSBmb3JjZV9nZW5fbGF6eV9ibG9jayB+b25seV92YWw6ZmFsc2UgYmxrXG5cbigqIFtmb3JjZV9nZW4gfm9ubHlfdmFsOmZhbHNlXSBpcyBub3QgdXNlZCwgc2luY2UgW0xhenkuZm9yY2VdIGlzXG4gICBkZWNsYXJlZCBhcyBhIHByaW1pdGl2ZSB3aG9zZSBjb2RlIGlubGluZXMgdGhlIHRhZyB0ZXN0cyBvZiBpdHNcbiAgIGFyZ3VtZW50LCBleGNlcHQgd2hlbiBhZmwgaW5zdHJ1bWVudGF0aW9uIGlzIHR1cm5lZCBvbi4gKilcbmxldCBmb3JjZV9nZW4gfm9ubHlfdmFsIChsenYgOiAnYXJnIGxhenlfdCkgPVxuICAoKiBVc2luZyBbU3lzLm9wYXF1ZV9pZGVudGl0eV0gcHJldmVudHMgdHdvIHBvdGVudGlhbCBwcm9ibGVtczpcbiAgICAgLSBJZiB0aGUgdmFsdWUgaXMga25vd24gdG8gaGF2ZSBGb3J3YXJkX3RhZywgdGhlbiBpdCBjb3VsZCBoYXZlIGJlZW5cbiAgICAgICBzaG9ydGN1dCBkdXJpbmcgR0MsIHNvIHRoYXQgaW5mb3JtYXRpb24gbXVzdCBiZSBmb3Jnb3R0ZW4gKHNlZSBHUFIjNzEzXG4gICAgICAgYW5kIGlzc3VlICM3MzAxKS4gVGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhdCB0aGUgbW9tZW50IHNpbmNlXG4gICAgICAgW09iai50YWddIGlzIG5vdCBzaW1wbGlmaWVkIGJ5IHRoZSBjb21waWxlciwgYW5kIEdQUiM3MTMgYWxzb1xuICAgICAgIGVuc3VyZXMgdGhhdCBubyB2YWx1ZSB3aWxsIGJlIGtub3duIHRvIGhhdmUgRm9yd2FyZF90YWcuXG4gICAgIC0gSWYgdGhlIHZhbHVlIGlzIGtub3duIHRvIGJlIGltbXV0YWJsZSwgdGhlbiBpZiB0aGUgY29tcGlsZXJcbiAgICAgICBjYW5ub3QgcHJvdmUgdGhhdCB0aGUgbGFzdCBicmFuY2ggaXMgbm90IHRha2VuIGl0IHdpbGwgaXNzdWUgYVxuICAgICAgIHdhcm5pbmcgNTkgKG1vZGlmaWNhdGlvbiBvZiBhbiBpbW11dGFibGUgdmFsdWUpICopXG4gIGxldCBsenYgPSBTeXMub3BhcXVlX2lkZW50aXR5IGx6diBpblxuICBsZXQgeCA9IE9iai5yZXByIGx6diBpblxuICAoKiBTVEFSVCBubyBzYWZlIHBvaW50cy4gSWYgYSBHQyBvY2N1cnMgaGVyZSwgdGhlbiB0aGUgb2JqZWN0IFt4XSBtYXkgYmVcbiAgICAgc2hvcnQtY2lyY3VpdGVkLCBhbmQgZ2V0dGluZyB0aGUgZmlyc3QgZmllbGQgb2YgW3hdIHdvdWxkIGdldCB1cyB0aGUgd3JvbmdcbiAgICAgdmFsdWUuIEx1Y2tpbHksIHRoZSBjb21waWxlciBkb2VzIG5vdCBpbnNlcnQgR0Mgc2FmZSBwb2ludHMgYXQgdGhpcyBwbGFjZSxcbiAgICAgc28gaXQgaXMgb2suICopXG4gIGxldCB0ID0gT2JqLnRhZyB4IGluXG4gIGlmIHQgPSBPYmouZm9yd2FyZF90YWcgdGhlblxuICAgIChPYmoub2JqIChPYmouZmllbGQgeCAwKSA6ICdhcmcpXG4gICgqIEVORCBubyBzYWZlIHBvaW50cyAqKVxuICBlbHNlIGlmIHQgPSBPYmouZm9yY2luZ190YWcgdGhlbiByYWlzZSBVbmRlZmluZWRcbiAgZWxzZSBpZiB0IDw+IE9iai5sYXp5X3RhZyB0aGVuIChPYmoub2JqIHggOiAnYXJnKVxuICBlbHNlIGZvcmNlX2dlbl9sYXp5X2Jsb2NrIH5vbmx5X3ZhbCBsenZcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtMYXp5XTogZGVmZXJyZWQgY29tcHV0YXRpb25zICopXG5cblxuKCpcbiAgIFdBUk5JTkc6IHNvbWUgcHVycGxlIG1hZ2ljIGlzIGdvaW5nIG9uIGhlcmUuICBEbyBub3QgdGFrZSB0aGlzIGZpbGVcbiAgIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHByb2dyYW0gaW4gT0NhbWwuXG4qKVxuXG5cbigqIFdlIG1ha2UgdXNlIG9mIHR3byBzcGVjaWFsIHRhZ3MgcHJvdmlkZWQgYnkgdGhlIHJ1bnRpbWU6XG4gICBbbGF6eV90YWddIGFuZCBbZm9yd2FyZF90YWddLlxuXG4gICBBIHZhbHVlIG9mIHR5cGUgWydhIExhenkudF0gY2FuIGJlIG9uZSBvZiB0aHJlZSB0aGluZ3M6XG4gICAxLiBBIGJsb2NrIG9mIHNpemUgMSB3aXRoIHRhZyBbbGF6eV90YWddLiAgSXRzIGZpZWxkIGlzIGEgY2xvc3VyZSBvZlxuICAgICAgdHlwZSBbdW5pdCAtPiAnYV0gdGhhdCBjb21wdXRlcyB0aGUgdmFsdWUuXG4gICAyLiBBIGJsb2NrIG9mIHNpemUgMSB3aXRoIHRhZyBbZm9yd2FyZF90YWddLiAgSXRzIGZpZWxkIGlzIHRoZSB2YWx1ZVxuICAgICAgb2YgdHlwZSBbJ2FdIHRoYXQgd2FzIGNvbXB1dGVkLlxuICAgMy4gQW55dGhpbmcgZWxzZSBleGNlcHQgYSBmbG9hdC4gIFRoaXMgaGFzIHR5cGUgWydhXSBhbmQgaXMgdGhlIHZhbHVlXG4gICAgICB0aGF0IHdhcyBjb21wdXRlZC5cbiAgIEV4Y2VwdGlvbnMgYXJlIHN0b3JlZCBpbiBmb3JtYXQgKDEpLlxuICAgVGhlIEdDIHdpbGwgbWFnaWNhbGx5IGNoYW5nZSB0aGluZ3MgZnJvbSAoMikgdG8gKDMpIGFjY29yZGluZyB0byBpdHNcbiAgIGZhbmN5LlxuXG4gICBJZiBPQ2FtbCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSAtZmxhdC1mbG9hdC1hcnJheSBvcHRpb24gKHdoaWNoIGlzXG4gICBjdXJyZW50bHkgdGhlIGRlZmF1bHQpLCB0aGUgZm9sbG93aW5nIGlzIGFsc28gdHJ1ZTpcbiAgIFdlIGNhbm5vdCB1c2UgcmVwcmVzZW50YXRpb24gKDMpIGZvciBhIFtmbG9hdCBMYXp5LnRdIGJlY2F1c2VcbiAgIFtjYW1sX21ha2VfYXJyYXldIGFzc3VtZXMgdGhhdCBvbmx5IGEgW2Zsb2F0XSB2YWx1ZSBjYW4gaGF2ZSB0YWdcbiAgIFtEb3VibGVfdGFnXS5cblxuICAgV2UgaGF2ZSB0byB1c2UgdGhlIGJ1aWx0LWluIHR5cGUgY29uc3RydWN0b3IgW2xhenlfdF0gdG9cbiAgIGxldCB0aGUgY29tcGlsZXIgaW1wbGVtZW50IHRoZSBzcGVjaWFsIHR5cGluZyBhbmQgY29tcGlsYXRpb25cbiAgIHJ1bGVzIGZvciB0aGUgW2xhenldIGtleXdvcmQuXG4qKVxuXG50eXBlICdhIHQgPSAnYSBDYW1saW50ZXJuYWxMYXp5LnRcblxuZXhjZXB0aW9uIFVuZGVmaW5lZCA9IENhbWxpbnRlcm5hbExhenkuVW5kZWZpbmVkXG5leHRlcm5hbCBtYWtlX2ZvcndhcmQgOiAnYSAtPiAnYSBsYXp5X3QgPSBcImNhbWxfbGF6eV9tYWtlX2ZvcndhcmRcIlxuZXh0ZXJuYWwgZm9yY2UgOiAnYSB0IC0+ICdhID0gXCIlbGF6eV9mb3JjZVwiXG5cbmxldCBmb3JjZV92YWwgbCA9IENhbWxpbnRlcm5hbExhenkuZm9yY2VfZ2VuIH5vbmx5X3ZhbDp0cnVlIGxcblxubGV0IGZyb21fZnVuIChmIDogdW5pdCAtPiAnYXJnKSA9XG4gIGxldCB4ID0gT2JqLm5ld19ibG9jayBPYmoubGF6eV90YWcgMSBpblxuICBPYmouc2V0X2ZpZWxkIHggMCAoT2JqLnJlcHIgZik7XG4gIChPYmoub2JqIHggOiAnYXJnIHQpXG5cbmxldCBmcm9tX3ZhbCAodiA6ICdhcmcpID1cbiAgbGV0IHQgPSBPYmoudGFnIChPYmoucmVwciB2KSBpblxuICBpZiB0ID0gT2JqLmZvcndhcmRfdGFnIHx8IHQgPSBPYmoubGF6eV90YWcgfHxcbiAgICAgdCA9IE9iai5mb3JjaW5nX3RhZyB8fCB0ID0gT2JqLmRvdWJsZV90YWcgdGhlbiBiZWdpblxuICAgIG1ha2VfZm9yd2FyZCB2XG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgKE9iai5tYWdpYyB2IDogJ2FyZyB0KVxuICBlbmRcblxubGV0IGlzX3ZhbCAobCA6ICdhcmcgdCkgPSBPYmoudGFnIChPYmoucmVwciBsKSA8PiBPYmoubGF6eV90YWdcblxubGV0IG1hcCBmIHggPVxuICBsYXp5IChmIChmb3JjZSB4KSlcblxubGV0IG1hcF92YWwgZiB4ID1cbiAgaWYgaXNfdmFsIHhcbiAgdGhlbiBmcm9tX3ZhbCAoZiAoZm9yY2UgeCkpXG4gIGVsc2UgbGF6eSAoZiAoZm9yY2UgeCkpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgU2ltb24gQ3J1YW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE3IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbU2VxXTogZnVuY3Rpb25hbCBpdGVyYXRvcnMgKilcblxudHlwZSArJ2Egbm9kZSA9XG4gIHwgTmlsXG4gIHwgQ29ucyBvZiAnYSAqICdhIHRcblxuYW5kICdhIHQgPSB1bml0IC0+ICdhIG5vZGVcblxubGV0IGVtcHR5ICgpID0gTmlsXG5cbmxldCByZXR1cm4geCAoKSA9IENvbnMgKHgsIGVtcHR5KVxuXG5sZXQgY29ucyB4IG5leHQgKCkgPSBDb25zICh4LCBuZXh0KVxuXG5sZXQgcmVjIGFwcGVuZCBzZXExIHNlcTIgKCkgPVxuICBtYXRjaCBzZXExKCkgd2l0aFxuICB8IE5pbCAtPiBzZXEyKClcbiAgfCBDb25zICh4LCBuZXh0KSAtPiBDb25zICh4LCBhcHBlbmQgbmV4dCBzZXEyKVxuXG5sZXQgcmVjIG1hcCBmIHNlcSAoKSA9IG1hdGNoIHNlcSgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT4gQ29ucyAoZiB4LCBtYXAgZiBuZXh0KVxuXG5sZXQgcmVjIGZpbHRlcl9tYXAgZiBzZXEgKCkgPSBtYXRjaCBzZXEoKSB3aXRoXG4gIHwgTmlsIC0+IE5pbFxuICB8IENvbnMgKHgsIG5leHQpIC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgICB8IE5vbmUgLT4gZmlsdGVyX21hcCBmIG5leHQgKClcbiAgICAgICAgfCBTb21lIHkgLT4gQ29ucyAoeSwgZmlsdGVyX21hcCBmIG5leHQpXG5cbmxldCByZWMgZmlsdGVyIGYgc2VxICgpID0gbWF0Y2ggc2VxKCkgd2l0aFxuICB8IE5pbCAtPiBOaWxcbiAgfCBDb25zICh4LCBuZXh0KSAtPlxuICAgICAgaWYgZiB4XG4gICAgICB0aGVuIENvbnMgKHgsIGZpbHRlciBmIG5leHQpXG4gICAgICBlbHNlIGZpbHRlciBmIG5leHQgKClcblxubGV0IHJlYyBjb25jYXQgc2VxICgpID0gbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgYXBwZW5kIHggKGNvbmNhdCBuZXh0KSAoKVxuXG5sZXQgcmVjIGZsYXRfbWFwIGYgc2VxICgpID0gbWF0Y2ggc2VxICgpIHdpdGhcbiAgfCBOaWwgLT4gTmlsXG4gIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICBhcHBlbmQgKGYgeCkgKGZsYXRfbWFwIGYgbmV4dCkgKClcblxubGV0IGNvbmNhdF9tYXAgPSBmbGF0X21hcFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjYyBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICAgIHwgTmlsIC0+IGFjY1xuICAgIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgICAgbGV0IGFjYyA9IGYgYWNjIHggaW5cbiAgICAgICAgZm9sZF9sZWZ0IGYgYWNjIG5leHRcblxubGV0IHJlYyBpdGVyIGYgc2VxID1cbiAgbWF0Y2ggc2VxICgpIHdpdGhcbiAgICB8IE5pbCAtPiAoKVxuICAgIHwgQ29ucyAoeCwgbmV4dCkgLT5cbiAgICAgICAgZiB4O1xuICAgICAgICBpdGVyIGYgbmV4dFxuXG5sZXQgcmVjIHVuZm9sZCBmIHUgKCkgPVxuICBtYXRjaCBmIHUgd2l0aFxuICB8IE5vbmUgLT4gTmlsXG4gIHwgU29tZSAoeCwgdScpIC0+IENvbnMgKHgsIHVuZm9sZCBmIHUnKVxuXG5sZXQgaXNfZW1wdHkgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zIChfLCBfKSAtPlxuICAgICAgZmFsc2VcblxubGV0IHVuY29ucyB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgU29tZSAoeCwgeHMpXG4gIHwgTmlsIC0+XG4gICAgICBOb25lXG5cblxuXG5sZXQgcmVjIGxlbmd0aF9hdXggYWNjdSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKF8sIHhzKSAtPlxuICAgICAgbGVuZ3RoX2F1eCAoYWNjdSArIDEpIHhzXG5cbmxldFtAaW5saW5lXSBsZW5ndGggeHMgPVxuICBsZW5ndGhfYXV4IDAgeHNcblxubGV0IHJlYyBpdGVyaV9hdXggZiBpIHhzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICAoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgZiBpIHg7XG4gICAgICBpdGVyaV9hdXggZiAoaSsxKSB4c1xuXG5sZXRbQGlubGluZV0gaXRlcmkgZiB4cyA9XG4gIGl0ZXJpX2F1eCBmIDAgeHNcblxubGV0IHJlYyBmb2xkX2xlZnRpX2F1eCBmIGFjY3UgaSB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgaSB4IGluXG4gICAgICBmb2xkX2xlZnRpX2F1eCBmIGFjY3UgKGkrMSkgeHNcblxubGV0W0BpbmxpbmVdIGZvbGRfbGVmdGkgZiBhY2N1IHhzID1cbiAgZm9sZF9sZWZ0aV9hdXggZiBhY2N1IDAgeHNcblxubGV0IHJlYyBmb3JfYWxsIHAgeHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIHAgeCAmJiBmb3JfYWxsIHAgeHNcblxubGV0IHJlYyBleGlzdHMgcCB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgZmFsc2VcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIHAgeCB8fCBleGlzdHMgcCB4c1xuXG5sZXQgcmVjIGZpbmQgcCB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgaWYgcCB4IHRoZW4gU29tZSB4IGVsc2UgZmluZCBwIHhzXG5cbmxldCByZWMgZmluZF9tYXAgZiB4cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTm9uZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgIGZpbmRfbWFwIGYgeHNcbiAgICAgIHwgU29tZSBfIGFzIHJlc3VsdCAtPlxuICAgICAgICAgIHJlc3VsdFxuXG4oKiBbaXRlcjJdLCBbZm9sZF9sZWZ0Ml0sIFtmb3JfYWxsMl0sIFtleGlzdHMyXSwgW21hcDJdLCBbemlwXSB3b3JrIGFsc28gaW5cbiAgIHRoZSBjYXNlIHdoZXJlIHRoZSB0d28gc2VxdWVuY2VzIGhhdmUgZGlmZmVyZW50IGxlbmd0aHMuIFRoZXkgc3RvcCBhcyBzb29uXG4gICBhcyBvbmUgc2VxdWVuY2UgaXMgZXhoYXVzdGVkLiBUaGVpciBiZWhhdmlvciBpcyBzbGlnaHRseSBhc3ltbWV0cmljOiB3aGVuXG4gICBbeHNdIGlzIGVtcHR5LCB0aGV5IGRvIG5vdCBmb3JjZSBbeXNdOyBob3dldmVyLCB3aGVuIFt5c10gaXMgZW1wdHksIFt4c10gaXNcbiAgIGZvcmNlZCwgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gYXBwbGljYXRpb24gW3hzKCldIHR1cm5zIG91dFxuICAgdG8gYmUgdXNlbGVzcy4gKilcblxubGV0IHJlYyBpdGVyMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICAoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgICgpXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5O1xuICAgICAgICAgIGl0ZXIyIGYgeHMgeXNcblxubGV0IHJlYyBmb2xkX2xlZnQyIGYgYWNjdSB4cyB5cyA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgYWNjdVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGFjY3VcbiAgICAgIHwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgICAgbGV0IGFjY3UgPSBmIGFjY3UgeCB5IGluXG4gICAgICAgICAgZm9sZF9sZWZ0MiBmIGFjY3UgeHMgeXNcblxubGV0IHJlYyBmb3JfYWxsMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICB0cnVlXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgICAgICBmIHggeSAmJiBmb3JfYWxsMiBmIHhzIHlzXG5cbmxldCByZWMgZXhpc3RzMiBmIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBmYWxzZVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggeXMoKSB3aXRoXG4gICAgICB8IE5pbCAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIGYgeCB5IHx8IGV4aXN0czIgZiB4cyB5c1xuXG5sZXQgcmVjIGVxdWFsIGVxIHhzIHlzID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gIHwgTmlsLCBOaWwgLT5cbiAgICAgIHRydWVcbiAgfCBDb25zICh4LCB4cyksIENvbnMgKHksIHlzKSAtPlxuICAgICAgZXEgeCB5ICYmIGVxdWFsIGVxIHhzIHlzXG4gIHwgTmlsLCBDb25zIChfLCBfKVxuICB8IENvbnMgKF8sIF8pLCBOaWwgLT5cbiAgICAgIGZhbHNlXG5cbmxldCByZWMgY29tcGFyZSBjbXAgeHMgeXMgPVxuICBtYXRjaCB4cygpLCB5cygpIHdpdGhcbiAgfCBOaWwsIE5pbCAtPlxuICAgICAgMFxuICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICBsZXQgYyA9IGNtcCB4IHkgaW5cbiAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZSBjb21wYXJlIGNtcCB4cyB5c1xuICB8IE5pbCwgQ29ucyAoXywgXykgLT5cbiAgICAgIC0xXG4gIHwgQ29ucyAoXywgXyksIE5pbCAtPlxuICAgICAgKzFcblxuXG5cbigqIFtpbml0X2F1eCBmIGkgal0gaXMgdGhlIHNlcXVlbmNlIFtmIGksIC4uLiwgZiAoai0xKV0uICopXG5cbmxldCByZWMgaW5pdF9hdXggZiBpIGogKCkgPVxuICBpZiBpIDwgaiB0aGVuIGJlZ2luXG4gICAgQ29ucyAoZiBpLCBpbml0X2F1eCBmIChpICsgMSkgailcbiAgZW5kXG4gIGVsc2VcbiAgICBOaWxcblxubGV0IGluaXQgbiBmID1cbiAgaWYgbiA8IDAgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU2VxLmluaXRcIlxuICBlbHNlXG4gICAgaW5pdF9hdXggZiAwIG5cblxubGV0IHJlYyByZXBlYXQgeCAoKSA9XG4gIENvbnMgKHgsIHJlcGVhdCB4KVxuXG5sZXQgcmVjIGZvcmV2ZXIgZiAoKSA9XG4gIENvbnMgKGYoKSwgZm9yZXZlciBmKVxuXG4oKiBUaGlzIHByZWxpbWluYXJ5IGRlZmluaXRpb24gb2YgW2N5Y2xlXSByZXF1aXJlcyB0aGUgc2VxdWVuY2UgW3hzXVxuICAgdG8gYmUgbm9uZW1wdHkuIEFwcGx5aW5nIGl0IHRvIGFuIGVtcHR5IHNlcXVlbmNlIHdvdWxkIHByb2R1Y2UgYVxuICAgc2VxdWVuY2UgdGhhdCBkaXZlcmdlcyB3aGVuIGl0IGlzIGZvcmNlZC4gKilcblxubGV0IHJlYyBjeWNsZV9ub25lbXB0eSB4cyAoKSA9XG4gIGFwcGVuZCB4cyAoY3ljbGVfbm9uZW1wdHkgeHMpICgpXG5cbigqIFtjeWNsZSB4c10gY2hlY2tzIHdoZXRoZXIgW3hzXSBpcyBlbXB0eSBhbmQsIGlmIHNvLCByZXR1cm5zIGFuIGVtcHR5XG4gICBzZXF1ZW5jZS4gT3RoZXJ3aXNlLCBbY3ljbGUgeHNdIHByb2R1Y2VzIG9uZSBjb3B5IG9mIFt4c10gZm9sbG93ZWRcbiAgIHdpdGggdGhlIGluZmluaXRlIHNlcXVlbmNlIFtjeWNsZV9ub25lbXB0eSB4c10uIFRodXMsIHRoZSBub25lbXB0aW5lc3NcbiAgIGNoZWNrIGlzIHBlcmZvcm1lZCBqdXN0IG9uY2UuICopXG5cbmxldCBjeWNsZSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMnKSAtPlxuICAgICAgQ29ucyAoeCwgYXBwZW5kIHhzJyAoY3ljbGVfbm9uZW1wdHkgeHMpKVxuXG4oKiBbaXRlcmF0ZTEgZiB4XSBpcyB0aGUgc2VxdWVuY2UgW2YgeCwgZiAoZiB4KSwgLi4uXS5cbiAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKGl0ZXJhdGUgZiB4KV0uXG4gICBbaXRlcmF0ZTFdIGlzIHVzZWQgYXMgYSBidWlsZGluZyBibG9jayBpbiB0aGUgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0uICopXG5cbmxldCByZWMgaXRlcmF0ZTEgZiB4ICgpID1cbiAgbGV0IHkgPSBmIHggaW5cbiAgQ29ucyAoeSwgaXRlcmF0ZTEgZiB5KVxuXG4oKiBbaXRlcmF0ZSBmIHhdIGlzIHRoZSBzZXF1ZW5jZSBbeCwgZiB4LCAuLi5dLiAqKVxuXG4oKiBUaGUgcmVhc29uIHdoeSB3ZSBnaXZlIHRoaXMgc2xpZ2h0bHkgaW5kaXJlY3QgZGVmaW5pdGlvbiBvZiBbaXRlcmF0ZV0sXG4gICBhcyBvcHBvc2VkIHRvIHRoZSBtb3JlIG5haXZlIGRlZmluaXRpb24gdGhhdCBtYXkgY29tZSB0byBtaW5kLCBpcyB0aGF0XG4gICB3ZSBhcmUgY2FyZWZ1bCB0byBhdm9pZCBldmFsdWF0aW5nIFtmIHhdIHVudGlsIHRoaXMgZnVuY3Rpb24gY2FsbCBpc1xuICAgYWN0dWFsbHkgbmVjZXNzYXJ5LiBUaGUgbmFpdmUgZGVmaW5pdGlvbiAobm90IHNob3duIGhlcmUpIGNvbXB1dGVzIHRoZVxuICAgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBzZXF1ZW5jZSwgW2YgeF0sIHdoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IGlzXG4gICByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuICopXG5cbmxldCBpdGVyYXRlIGYgeCA9XG4gIGNvbnMgeCAoaXRlcmF0ZTEgZiB4KVxuXG5cblxubGV0IHJlYyBtYXBpX2F1eCBmIGkgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoZiBpIHgsIG1hcGlfYXV4IGYgKGkrMSkgeHMpXG5cbmxldFtAaW5saW5lXSBtYXBpIGYgeHMgPVxuICBtYXBpX2F1eCBmIDAgeHNcblxuKCogW3RhaWxfc2NhbiBmIHMgeHNdIGlzIGVxdWl2YWxlbnQgdG8gW3RhaWwgKHNjYW4gZiBzIHhzKV0uXG4gICBbdGFpbF9zY2FuXSBpcyB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgaW4gdGhlIGRlZmluaXRpb24gb2YgW3NjYW5dLiAqKVxuXG4oKiBUaGlzIHNsaWdodGx5IGluZGlyZWN0IGRlZmluaXRpb24gb2YgW3NjYW5dIGlzIG1lYW50IHRvIGF2b2lkIGNvbXB1dGluZ1xuICAgZWxlbWVudHMgdG9vIGVhcmx5OyBzZWUgdGhlIGFib3ZlIGNvbW1lbnQgYWJvdXQgW2l0ZXJhdGUxXSBhbmQgW2l0ZXJhdGVdLiAqKVxuXG5sZXQgcmVjIHRhaWxfc2NhbiBmIHMgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbGV0IHMgPSBmIHMgeCBpblxuICAgICAgQ29ucyAocywgdGFpbF9zY2FuIGYgcyB4cylcblxubGV0IHNjYW4gZiBzIHhzID1cbiAgY29ucyBzICh0YWlsX3NjYW4gZiBzIHhzKVxuXG4oKiBbdGFrZV0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW3Rha2UgMCB4c10gcmV0dXJucyBbZW1wdHldXG4gICBpbW1lZGlhdGVseSwgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCByZWMgdGFrZV9hdXggbiB4cyA9XG4gIGlmIG4gPSAwIHRoZW5cbiAgICBlbXB0eVxuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgICAgIENvbnMgKHgsIHRha2VfYXV4IChuLTEpIHhzKVxuXG5sZXQgdGFrZSBuIHhzID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcS50YWtlXCI7XG4gIHRha2VfYXV4IG4geHNcblxuKCogW2ZvcmNlX2Ryb3AgbiB4c10gaXMgZXF1aXZhbGVudCB0byBbZHJvcCBuIHhzICgpXS5cbiAgIFtmb3JjZV9kcm9wIG4geHNdIHJlcXVpcmVzIFtuID4gMF0uXG4gICBbZm9yY2VfZHJvcF0gaXMgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIGluIHRoZSBkZWZpbml0aW9uIG9mIFtkcm9wXS4gKilcblxubGV0IHJlYyBmb3JjZV9kcm9wIG4geHMgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKF8sIHhzKSAtPlxuICAgICAgbGV0IG4gPSBuIC0gMSBpblxuICAgICAgaWYgbiA9IDAgdGhlblxuICAgICAgICB4cygpXG4gICAgICBlbHNlXG4gICAgICAgIGZvcmNlX2Ryb3AgbiB4c1xuXG4oKiBbZHJvcF0gaXMgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQgW2Ryb3AgMCB4c10gcmV0dXJucyBbeHNdIGltbWVkaWF0ZWx5LFxuICAgd2l0aG91dCBhbGxvY2F0aW5nIGFueSBtZW1vcnkuICopXG5cbmxldCBkcm9wIG4geHMgPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiU2VxLmRyb3BcIlxuICBlbHNlIGlmIG4gPSAwIHRoZW5cbiAgICB4c1xuICBlbHNlXG4gICAgZnVuICgpIC0+XG4gICAgICBmb3JjZV9kcm9wIG4geHNcblxubGV0IHJlYyB0YWtlX3doaWxlIHAgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgaWYgcCB4IHRoZW4gQ29ucyAoeCwgdGFrZV93aGlsZSBwIHhzKSBlbHNlIE5pbFxuXG5sZXQgcmVjIGRyb3Bfd2hpbGUgcCB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIGFzIG5vZGUgLT5cbiAgICAgIGlmIHAgeCB0aGVuIGRyb3Bfd2hpbGUgcCB4cyAoKSBlbHNlIG5vZGVcblxubGV0IHJlYyBncm91cCBlcSB4cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBDb25zIChjb25zIHggKHRha2Vfd2hpbGUgKGVxIHgpIHhzKSwgZ3JvdXAgZXEgKGRyb3Bfd2hpbGUgKGVxIHgpIHhzKSlcblxuZXhjZXB0aW9uIEZvcmNlZF90d2ljZVxuXG5tb2R1bGUgU3VzcGVuc2lvbiA9IHN0cnVjdFxuXG4gIHR5cGUgJ2Egc3VzcGVuc2lvbiA9XG4gICAgdW5pdCAtPiAnYVxuXG4gICgqIENvbnZlcnNpb25zLiAqKVxuXG4gIGxldCB0b19sYXp5IDogJ2Egc3VzcGVuc2lvbiAtPiAnYSBMYXp5LnQgPVxuICAgIExhenkuZnJvbV9mdW5cbiAgICAoKiBmdW4gcyAtPiBsYXp5IChzKCkpICopXG5cbiAgbGV0IGZyb21fbGF6eSAocyA6ICdhIExhenkudCkgOiAnYSBzdXNwZW5zaW9uID1cbiAgICBmdW4gKCkgLT4gTGF6eS5mb3JjZSBzXG5cbiAgKCogW21lbW9pemVdIHR1cm5zIGFuIGFyYml0cmFyeSBzdXNwZW5zaW9uIGludG8gYSBwZXJzaXN0ZW50IHN1c3BlbnNpb24uICopXG5cbiAgbGV0IG1lbW9pemUgKHMgOiAnYSBzdXNwZW5zaW9uKSA6ICdhIHN1c3BlbnNpb24gPVxuICAgIGZyb21fbGF6eSAodG9fbGF6eSBzKVxuXG4gICgqIFtmYWlsdXJlXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBmYWlscyB3aGVuIGZvcmNlZC4gKilcblxuICBsZXQgZmFpbHVyZSA6IF8gc3VzcGVuc2lvbiA9XG4gICAgZnVuICgpIC0+XG4gICAgICAoKiBBIHN1c3BlbnNpb24gY3JlYXRlZCBieSBbb25jZV0gaGFzIGJlZW4gZm9yY2VkIHR3aWNlLiAqKVxuICAgICAgcmFpc2UgRm9yY2VkX3R3aWNlXG5cbiAgKCogSWYgW2ZdIGlzIGEgc3VzcGVuc2lvbiwgdGhlbiBbb25jZSBmXSBpcyBhIHN1c3BlbnNpb24gdGhhdCBjYW4gYmUgZm9yY2VkXG4gICAgIGF0IG1vc3Qgb25jZS4gSWYgaXQgaXMgZm9yY2VkIG1vcmUgdGhhbiBvbmNlLCB0aGVuIFtGb3JjZWRfdHdpY2VdIGlzXG4gICAgIHJhaXNlZC4gKilcblxuICBsZXQgb25jZSAoZiA6ICdhIHN1c3BlbnNpb24pIDogJ2Egc3VzcGVuc2lvbiA9XG4gICAgbGV0IGFjdGlvbiA9IEF0b21pYy5tYWtlIGYgaW5cbiAgICBmdW4gKCkgLT5cbiAgICAgICgqIEdldCB0aGUgZnVuY3Rpb24gY3VycmVudGx5IHN0b3JlZCBpbiBbYWN0aW9uXSwgYW5kIHdyaXRlIHRoZVxuICAgICAgICAgZnVuY3Rpb24gW2ZhaWx1cmVdIGluIGl0cyBwbGFjZSwgc28gdGhlIG5leHQgYWNjZXNzIHdpbGwgcmVzdWx0XG4gICAgICAgICBpbiBhIGNhbGwgdG8gW2ZhaWx1cmUoKV0uICopXG4gICAgICBsZXQgZiA9IEF0b21pYy5leGNoYW5nZSBhY3Rpb24gZmFpbHVyZSBpblxuICAgICAgZigpXG5cbmVuZCAoKiBTdXNwZW5zaW9uICopXG5cbmxldCByZWMgbWVtb2l6ZSB4cyA9XG4gIFN1c3BlbnNpb24ubWVtb2l6ZSAoZnVuICgpIC0+XG4gICAgbWF0Y2ggeHMoKSB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgICAgTmlsXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgQ29ucyAoeCwgbWVtb2l6ZSB4cylcbiAgKVxuXG5sZXQgcmVjIG9uY2UgeHMgPVxuICBTdXNwZW5zaW9uLm9uY2UgKGZ1biAoKSAtPlxuICAgIG1hdGNoIHhzKCkgd2l0aFxuICAgIHwgTmlsIC0+XG4gICAgICAgIE5pbFxuICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgIENvbnMgKHgsIG9uY2UgeHMpXG4gIClcblxuXG5sZXQgcmVjIHppcCB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKCh4LCB5KSwgemlwIHhzIHlzKVxuXG5sZXQgcmVjIG1hcDIgZiB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICBtYXRjaCB5cygpIHdpdGhcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgTmlsXG4gICAgICB8IENvbnMgKHksIHlzKSAtPlxuICAgICAgICAgIENvbnMgKGYgeCB5LCBtYXAyIGYgeHMgeXMpXG5cbmxldCByZWMgaW50ZXJsZWF2ZSB4cyB5cyAoKSA9XG4gIG1hdGNoIHhzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgeXMoKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgQ29ucyAoeCwgaW50ZXJsZWF2ZSB5cyB4cylcblxuKCogW3NvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIChjb25zIHggeHMpIHlzXS5cblxuICAgW3NvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzXSBpcyBlcXVpdmFsZW50IHRvXG4gICAgIFtzb3J0ZWRfbWVyZ2UgY21wIHhzIChjb25zIHkgeXMpXS5cblxuICAgW3NvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c10gaXMgZXF1aXZhbGVudCB0b1xuICAgICBbc29ydGVkX21lcmdlIGNtcCAoY29ucyB4IHhzKSAoY29ucyB5IHlzKV0uXG5cbiAgIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBhcmUgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgaW4gdGhlIGRlZmluaXRpb25cbiAgIG9mIFtzb3J0ZWRfbWVyZ2VdLiAqKVxuXG5sZXQgcmVjIHNvcnRlZF9tZXJnZTFsIGNtcCB4IHhzIHlzICgpID1cbiAgbWF0Y2ggeXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBDb25zICh4LCB4cylcbiAgfCBDb25zICh5LCB5cykgLT5cbiAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5hbmQgc29ydGVkX21lcmdlMXIgY21wIHhzIHkgeXMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIENvbnMgKHksIHlzKVxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgc29ydGVkX21lcmdlMSBjbXAgeCB4cyB5IHlzXG5cbmFuZCBzb3J0ZWRfbWVyZ2UxIGNtcCB4IHhzIHkgeXMgPVxuICBpZiBjbXAgeCB5IDw9IDAgdGhlblxuICAgIENvbnMgKHgsIHNvcnRlZF9tZXJnZTFyIGNtcCB4cyB5IHlzKVxuICBlbHNlXG4gICAgQ29ucyAoeSwgc29ydGVkX21lcmdlMWwgY21wIHggeHMgeXMpXG5cbmxldCBzb3J0ZWRfbWVyZ2UgY21wIHhzIHlzICgpID1cbiAgbWF0Y2ggeHMoKSwgeXMoKSB3aXRoXG4gICAgfCBOaWwsIE5pbCAtPlxuICAgICAgICBOaWxcbiAgICB8IE5pbCwgY1xuICAgIHwgYywgTmlsIC0+XG4gICAgICAgIGNcbiAgICB8IENvbnMgKHgsIHhzKSwgQ29ucyAoeSwgeXMpIC0+XG4gICAgICAgIHNvcnRlZF9tZXJnZTEgY21wIHggeHMgeSB5c1xuXG5cbmxldCByZWMgbWFwX2ZzdCB4eXMgKCkgPVxuICBtYXRjaCB4eXMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICgoeCwgXyksIHh5cykgLT5cbiAgICAgIENvbnMgKHgsIG1hcF9mc3QgeHlzKVxuXG5sZXQgcmVjIG1hcF9zbmQgeHlzICgpID1cbiAgbWF0Y2ggeHlzKCkgd2l0aFxuICB8IE5pbCAtPlxuICAgICAgTmlsXG4gIHwgQ29ucyAoKF8sIHkpLCB4eXMpIC0+XG4gICAgICBDb25zICh5LCBtYXBfc25kIHh5cylcblxubGV0IHVuemlwIHh5cyA9XG4gIG1hcF9mc3QgeHlzLCBtYXBfc25kIHh5c1xuXG5sZXQgc3BsaXQgPVxuICB1bnppcFxuXG4oKiBbZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHNdIGlzIGVxdWl2YWxlbnQgdG9cbiAgIFtmaWx0ZXJfbWFwIEVpdGhlci5maW5kX2xlZnQgKG1hcCBmIHhzKV0uICopXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX2xlZnRfbWFwIGYgeHMgKCkgPVxuICBtYXRjaCB4cygpIHdpdGhcbiAgfCBOaWwgLT5cbiAgICAgIE5pbFxuICB8IENvbnMgKHgsIHhzKSAtPlxuICAgICAgbWF0Y2ggZiB4IHdpdGhcbiAgICAgIHwgRWl0aGVyLkxlZnQgeSAtPlxuICAgICAgICAgIENvbnMgKHksIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzKVxuICAgICAgfCBFaXRoZXIuUmlnaHQgXyAtPlxuICAgICAgICAgIGZpbHRlcl9tYXBfZmluZF9sZWZ0X21hcCBmIHhzICgpXG5cbmxldCByZWMgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzICgpID1cbiAgbWF0Y2ggeHMoKSB3aXRoXG4gIHwgTmlsIC0+XG4gICAgICBOaWxcbiAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICB8IEVpdGhlci5MZWZ0IF8gLT5cbiAgICAgICAgICBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMgKClcbiAgICAgIHwgRWl0aGVyLlJpZ2h0IHogLT5cbiAgICAgICAgICBDb25zICh6LCBmaWx0ZXJfbWFwX2ZpbmRfcmlnaHRfbWFwIGYgeHMpXG5cbmxldCBwYXJ0aXRpb25fbWFwIGYgeHMgPVxuICBmaWx0ZXJfbWFwX2ZpbmRfbGVmdF9tYXAgZiB4cyxcbiAgZmlsdGVyX21hcF9maW5kX3JpZ2h0X21hcCBmIHhzXG5cbmxldCBwYXJ0aXRpb24gcCB4cyA9XG4gIGZpbHRlciBwIHhzLCBmaWx0ZXIgKGZ1biB4IC0+IG5vdCAocCB4KSkgeHNcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW3BlZWwgeHNzXSBpcyBhIHBhaXIgb2ZcbiAgIHRoZSBmaXJzdCBjb2x1bW4gKGEgc2VxdWVuY2Ugb2YgZWxlbWVudHMpIGFuZCBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZVxuICAgbWF0cml4IChhIHNlcXVlbmNlIG9mIHNob3J0ZXIgcm93cykuIFRoZXNlIHR3byBzZXF1ZW5jZXMgaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBUaGUgcm93cyBvZiB0aGUgbWF0cml4IFt4c3NdIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSB0aGUgc2FtZVxuICAgbGVuZ3RoLiBBbiBlbXB0eSByb3cgaXMgaWdub3JlZC4gKilcblxuKCogQmVjYXVzZSBbcGVlbF0gdXNlcyBbdW56aXBdLCBpdHMgYXJndW1lbnQgbXVzdCBiZSBwZXJzaXN0ZW50LiBUaGUgc2FtZVxuICAgcmVtYXJrIGFwcGxpZXMgdG8gW3RyYW5zcG9zZV0sIFtkaWFnb25hbHNdLCBbcHJvZHVjdF0sIGV0Yy4gKilcblxubGV0IHBlZWwgeHNzID1cbiAgdW56aXAgKGZpbHRlcl9tYXAgdW5jb25zIHhzcylcblxubGV0IHJlYyB0cmFuc3Bvc2UgeHNzICgpID1cbiAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgeHNzIGluXG4gIGlmIGlzX2VtcHR5IGhlYWRzIHRoZW4gYmVnaW5cbiAgICBhc3NlcnQgKGlzX2VtcHR5IHRhaWxzKTtcbiAgICBOaWxcbiAgZW5kXG4gIGVsc2VcbiAgICBDb25zIChoZWFkcywgdHJhbnNwb3NlIHRhaWxzKVxuXG4oKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb24gW2RpYWdvbmFsc10gdGFrZXMgYW4gZXh0cmEgYXJndW1lbnQsIFtyZW1haW5kZXJzXSxcbiAgIHdoaWNoIGNvbnRhaW5zIHRoZSByZW1haW5kZXJzIG9mIHRoZSByb3dzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgIGRpc2NvdmVyZWQuICopXG5cbmxldCByZWMgZGlhZ29uYWxzIHJlbWFpbmRlcnMgeHNzICgpID1cbiAgbWF0Y2ggeHNzKCkgd2l0aFxuICB8IENvbnMgKHhzLCB4c3MpIC0+XG4gICAgICBiZWdpbiBtYXRjaCB4cygpIHdpdGhcbiAgICAgIHwgQ29ucyAoeCwgeHMpIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgbm9uZW1wdHkgcm93IFt4IDo6IHhzXS4gVGh1cywgdGhlIG5leHQgZGlhZ29uYWxcbiAgICAgICAgICAgICBpcyBbeCA6OiBoZWFkc106IHRoaXMgZGlhZ29uYWwgYmVnaW5zIHdpdGggW3hdIGFuZCBjb250aW51ZXMgd2l0aFxuICAgICAgICAgICAgIHRoZSBmaXJzdCBlbGVtZW50IG9mIGV2ZXJ5IHJvdyBpbiBbcmVtYWluZGVyc10uIEluIHRoZSByZWN1cnNpdmVcbiAgICAgICAgICAgICBjYWxsLCB0aGUgYXJndW1lbnQgW3JlbWFpbmRlcnNdIGlzIGluc3RhbnRpYXRlZCB3aXRoIFt4cyA6OlxuICAgICAgICAgICAgIHRhaWxzXSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3csIFt4c10sXG4gICAgICAgICAgICAgYW5kIHRoYXQgd2Uga2VlcCB0aGUgdGFpbHMgb2YgdGhlIHByZS1leGlzdGluZyByZW1haW5pbmcgcm93cy4gKilcbiAgICAgICAgICBsZXQgaGVhZHMsIHRhaWxzID0gcGVlbCByZW1haW5kZXJzIGluXG4gICAgICAgICAgQ29ucyAoY29ucyB4IGhlYWRzLCBkaWFnb25hbHMgKGNvbnMgeHMgdGFpbHMpIHhzcylcbiAgICAgIHwgTmlsIC0+XG4gICAgICAgICAgKCogV2UgZGlzY292ZXIgYSBuZXcgZW1wdHkgcm93LiBJbiB0aGlzIGNhc2UsIHRoZSBuZXcgZGlhZ29uYWwgaXNcbiAgICAgICAgICAgICBqdXN0IFtoZWFkc10sIGFuZCBbcmVtYWluZGVyc10gaXMgaW5zdGFudGlhdGVkIHdpdGgganVzdCBbdGFpbHNdLFxuICAgICAgICAgICAgIGFzIHdlIGRvIG5vdCBoYXZlIG9uZSBtb3JlIHJlbWFpbmluZyByb3cuICopXG4gICAgICAgICAgbGV0IGhlYWRzLCB0YWlscyA9IHBlZWwgcmVtYWluZGVycyBpblxuICAgICAgICAgIENvbnMgKGhlYWRzLCBkaWFnb25hbHMgdGFpbHMgeHNzKVxuICAgICAgZW5kXG4gIHwgTmlsIC0+XG4gICAgICAoKiBUaGVyZSBhcmUgbm8gbW9yZSByb3dzIHRvIGJlIGRpc2NvdmVyZWQuIFRoZXJlIHJlbWFpbnMgdG8gZXhoYXVzdFxuICAgICAgICAgdGhlIHJlbWFpbmluZyByb3dzLiAqKVxuICAgICAgdHJhbnNwb3NlIHJlbWFpbmRlcnMgKClcblxuKCogSWYgW3hzc10gaXMgYSBtYXRyaXggKGEgc2VxdWVuY2Ugb2Ygcm93cyksIHRoZW4gW2RpYWdvbmFscyB4c3NdIGlzXG4gICB0aGUgc2VxdWVuY2Ugb2YgaXRzIGRpYWdvbmFscy5cblxuICAgVGhlIGZpcnN0IGRpYWdvbmFsIGNvbnRhaW5zIGp1c3QgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBmaXJzdCByb3cuIFRoZSBzZWNvbmQgZGlhZ29uYWwgY29udGFpbnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlXG4gICBzZWNvbmQgcm93IGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIGZpcnN0IHJvdzsgYW5kIHNvIG9uLlxuICAgVGhpcyBraW5kIG9mIGRpYWdvbmFsIGlzIGluIGZhY3Qgc29tZXRpbWVzIGtub3duIGFzIGFuIGFudGlkaWFnb25hbC5cblxuICAgLSBFdmVyeSBkaWFnb25hbCBpcyBhIGZpbml0ZSBzZXF1ZW5jZS5cbiAgIC0gVGhlIHJvd3Mgb2YgdGhlIG1hdHJpeCBbeHNzXSBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIGlzIG5vdCByZXF1aXJlZCB0byBiZSBmaW5pdGUgKGluIGVpdGhlciBkaXJlY3Rpb24pLlxuICAgLSBUaGUgbWF0cml4IFt4c3NdIG11c3QgYmUgcGVyc2lzdGVudC4gKilcblxubGV0IGRpYWdvbmFscyB4c3MgPVxuICBkaWFnb25hbHMgZW1wdHkgeHNzXG5cbmxldCBtYXBfcHJvZHVjdCBmIHhzIHlzID1cbiAgY29uY2F0IChkaWFnb25hbHMgKFxuICAgIG1hcCAoZnVuIHggLT5cbiAgICAgIG1hcCAoZnVuIHkgLT5cbiAgICAgICAgZiB4IHlcbiAgICAgICkgeXNcbiAgICApIHhzXG4gICkpXG5cbmxldCBwcm9kdWN0IHhzIHlzID1cbiAgbWFwX3Byb2R1Y3QgKGZ1biB4IHkgLT4gKHgsIHkpKSB4cyB5c1xuXG5sZXQgb2ZfZGlzcGVuc2VyIGl0ID1cbiAgbGV0IHJlYyBjICgpID1cbiAgICBtYXRjaCBpdCgpIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTmlsXG4gICAgfCBTb21lIHggLT5cbiAgICAgICAgQ29ucyAoeCwgYylcbiAgaW5cbiAgY1xuXG5sZXQgdG9fZGlzcGVuc2VyIHhzID1cbiAgbGV0IHMgPSByZWYgeHMgaW5cbiAgZnVuICgpIC0+XG4gICAgbWF0Y2ggKCFzKSgpIHdpdGhcbiAgICB8IE5pbCAtPlxuICAgICAgICBOb25lXG4gICAgfCBDb25zICh4LCB4cykgLT5cbiAgICAgICAgcyA6PSB4cztcbiAgICAgICAgU29tZSB4XG5cblxuXG5sZXQgcmVjIGludHMgaSAoKSA9XG4gIENvbnMgKGksIGludHMgKGkgKyAxKSlcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSAnYSB0ID0gJ2Egb3B0aW9uID0gTm9uZSB8IFNvbWUgb2YgJ2FcblxubGV0IG5vbmUgPSBOb25lXG5sZXQgc29tZSB2ID0gU29tZSB2XG5sZXQgdmFsdWUgbyB+ZGVmYXVsdCA9IG1hdGNoIG8gd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gZGVmYXVsdFxubGV0IGdldCA9IGZ1bmN0aW9uIFNvbWUgdiAtPiB2IHwgTm9uZSAtPiBpbnZhbGlkX2FyZyBcIm9wdGlvbiBpcyBOb25lXCJcbmxldCBiaW5kIG8gZiA9IG1hdGNoIG8gd2l0aCBOb25lIC0+IE5vbmUgfCBTb21lIHYgLT4gZiB2XG5sZXQgam9pbiA9IGZ1bmN0aW9uIFNvbWUgbyAtPiBvIHwgTm9uZSAtPiBOb25lXG5sZXQgbWFwIGYgbyA9IG1hdGNoIG8gd2l0aCBOb25lIC0+IE5vbmUgfCBTb21lIHYgLT4gU29tZSAoZiB2KVxubGV0IGZvbGQgfm5vbmUgfnNvbWUgPSBmdW5jdGlvbiBTb21lIHYgLT4gc29tZSB2IHwgTm9uZSAtPiBub25lXG5sZXQgaXRlciBmID0gZnVuY3Rpb24gU29tZSB2IC0+IGYgdiB8IE5vbmUgLT4gKClcbmxldCBpc19ub25lID0gZnVuY3Rpb24gTm9uZSAtPiB0cnVlIHwgU29tZSBfIC0+IGZhbHNlXG5sZXQgaXNfc29tZSA9IGZ1bmN0aW9uIE5vbmUgLT4gZmFsc2UgfCBTb21lIF8gLT4gdHJ1ZVxuXG5sZXQgZXF1YWwgZXEgbzAgbzEgPSBtYXRjaCBvMCwgbzEgd2l0aFxufCBTb21lIHYwLCBTb21lIHYxIC0+IGVxIHYwIHYxXG58IE5vbmUsIE5vbmUgLT4gdHJ1ZVxufCBfIC0+IGZhbHNlXG5cbmxldCBjb21wYXJlIGNtcCBvMCBvMSA9IG1hdGNoIG8wLCBvMSB3aXRoXG58IFNvbWUgdjAsIFNvbWUgdjEgLT4gY21wIHYwIHYxXG58IE5vbmUsIE5vbmUgLT4gMFxufCBOb25lLCBTb21lIF8gLT4gLTFcbnwgU29tZSBfLCBOb25lIC0+IDFcblxubGV0IHRvX3Jlc3VsdCB+bm9uZSA9IGZ1bmN0aW9uIE5vbmUgLT4gRXJyb3Igbm9uZSB8IFNvbWUgdiAtPiBPayB2XG5sZXQgdG9fbGlzdCA9IGZ1bmN0aW9uIE5vbmUgLT4gW10gfCBTb21lIHYgLT4gW3ZdXG5sZXQgdG9fc2VxID0gZnVuY3Rpb24gTm9uZSAtPiBTZXEuZW1wdHkgfCBTb21lIHYgLT4gU2VxLnJldHVybiB2XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UpIHJlc3VsdCA9IE9rIG9mICdhIHwgRXJyb3Igb2YgJ2VcblxubGV0IG9rIHYgPSBPayB2XG5sZXQgZXJyb3IgZSA9IEVycm9yIGVcbmxldCB2YWx1ZSByIH5kZWZhdWx0ID0gbWF0Y2ggciB3aXRoIE9rIHYgLT4gdiB8IEVycm9yIF8gLT4gZGVmYXVsdFxubGV0IGdldF9vayA9IGZ1bmN0aW9uIE9rIHYgLT4gdiB8IEVycm9yIF8gLT4gaW52YWxpZF9hcmcgXCJyZXN1bHQgaXMgRXJyb3IgX1wiXG5sZXQgZ2V0X2Vycm9yID0gZnVuY3Rpb24gRXJyb3IgZSAtPiBlIHwgT2sgXyAtPiBpbnZhbGlkX2FyZyBcInJlc3VsdCBpcyBPayBfXCJcbmxldCBiaW5kIHIgZiA9IG1hdGNoIHIgd2l0aCBPayB2IC0+IGYgdiB8IEVycm9yIF8gYXMgZSAtPiBlXG5sZXQgam9pbiA9IGZ1bmN0aW9uIE9rIHIgLT4gciB8IEVycm9yIF8gYXMgZSAtPiBlXG5sZXQgbWFwIGYgPSBmdW5jdGlvbiBPayB2IC0+IE9rIChmIHYpIHwgRXJyb3IgXyBhcyBlIC0+IGVcbmxldCBtYXBfZXJyb3IgZiA9IGZ1bmN0aW9uIEVycm9yIGUgLT4gRXJyb3IgKGYgZSkgfCBPayBfIGFzIHYgLT4gdlxubGV0IGZvbGQgfm9rIH5lcnJvciA9IGZ1bmN0aW9uIE9rIHYgLT4gb2sgdiB8IEVycm9yIGUgLT4gZXJyb3IgZVxubGV0IGl0ZXIgZiA9IGZ1bmN0aW9uIE9rIHYgLT4gZiB2IHwgRXJyb3IgXyAtPiAoKVxubGV0IGl0ZXJfZXJyb3IgZiA9IGZ1bmN0aW9uIEVycm9yIGUgLT4gZiBlIHwgT2sgXyAtPiAoKVxubGV0IGlzX29rID0gZnVuY3Rpb24gT2sgXyAtPiB0cnVlIHwgRXJyb3IgXyAtPiBmYWxzZVxubGV0IGlzX2Vycm9yID0gZnVuY3Rpb24gRXJyb3IgXyAtPiB0cnVlIHwgT2sgXyAtPiBmYWxzZVxuXG5sZXQgZXF1YWwgfm9rIH5lcnJvciByMCByMSA9IG1hdGNoIHIwLCByMSB3aXRoXG58IE9rIHYwLCBPayB2MSAtPiBvayB2MCB2MVxufCBFcnJvciBlMCwgRXJyb3IgZTEgLT4gZXJyb3IgZTAgZTFcbnwgXywgXyAtPiBmYWxzZVxuXG5sZXQgY29tcGFyZSB+b2sgfmVycm9yIHIwIHIxID0gbWF0Y2ggcjAsIHIxIHdpdGhcbnwgT2sgdjAsIE9rIHYxIC0+IG9rIHYwIHYxXG58IEVycm9yIGUwLCBFcnJvciBlMSAtPiBlcnJvciBlMCBlMVxufCBPayBfLCBFcnJvciBfIC0+IC0xXG58IEVycm9yIF8sIE9rIF8gLT4gMVxuXG5sZXQgdG9fb3B0aW9uID0gZnVuY3Rpb24gT2sgdiAtPiBTb21lIHYgfCBFcnJvciBfIC0+IE5vbmVcbmxldCB0b19saXN0ID0gZnVuY3Rpb24gT2sgdiAtPiBbdl0gfCBFcnJvciBfIC0+IFtdXG5sZXQgdG9fc2VxID0gZnVuY3Rpb24gT2sgdiAtPiBTZXEucmV0dXJuIHYgfCBFcnJvciBfIC0+IFNlcS5lbXB0eVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE9DYW1sIHByb2dyYW1tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlIHQgPSBib29sID0gZmFsc2UgfCB0cnVlXG5cbmV4dGVybmFsIG5vdCA6IGJvb2wgLT4gYm9vbCA9IFwiJWJvb2xub3RcIlxuZXh0ZXJuYWwgKCAmJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcbmV4dGVybmFsICggfHwgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdW9yXCJcbmxldCBlcXVhbCA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gKCA9IClcbmxldCBjb21wYXJlIDogYm9vbCAtPiBib29sIC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5leHRlcm5hbCB0b19pbnQgOiBib29sIC0+IGludCA9IFwiJWlkZW50aXR5XCJcbmxldCB0b19mbG9hdCA9IGZ1bmN0aW9uIGZhbHNlIC0+IDAuIHwgdHJ1ZSAtPiAxLlxuXG4oKlxubGV0IG9mX3N0cmluZyA9IGZ1bmN0aW9uXG58IFwiZmFsc2VcIiAtPiBTb21lIGZhbHNlXG58IFwidHJ1ZVwiIC0+IFNvbWUgdHJ1ZVxufCBfIC0+IE5vbmVcbiopXG5cbmxldCB0b19zdHJpbmcgPSBmdW5jdGlvbiBmYWxzZSAtPiBcImZhbHNlXCIgfCB0cnVlIC0+IFwidHJ1ZVwiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIENoYXJhY3RlciBvcGVyYXRpb25zICopXG5cbmV4dGVybmFsIGNvZGU6IGNoYXIgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdW5zYWZlX2NocjogaW50IC0+IGNoYXIgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBjaHIgbiA9XG4gIGlmIG4gPCAwIHx8IG4gPiAyNTUgdGhlbiBpbnZhbGlkX2FyZyBcIkNoYXIuY2hyXCIgZWxzZSB1bnNhZmVfY2hyIG5cblxuZXh0ZXJuYWwgYnl0ZXNfY3JlYXRlOiBpbnQgLT4gYnl0ZXMgPSBcImNhbWxfY3JlYXRlX2J5dGVzXCJcbmV4dGVybmFsIGJ5dGVzX3Vuc2FmZV9zZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5cbmxldCBlc2NhcGVkID0gZnVuY3Rpb25cbiAgfCAnXFwnJyAtPiBcIlxcXFwnXCJcbiAgfCAnXFxcXCcgLT4gXCJcXFxcXFxcXFwiXG4gIHwgJ1xcbicgLT4gXCJcXFxcblwiXG4gIHwgJ1xcdCcgLT4gXCJcXFxcdFwiXG4gIHwgJ1xccicgLT4gXCJcXFxcclwiXG4gIHwgJ1xcYicgLT4gXCJcXFxcYlwiXG4gIHwgJyAnIC4uICd+JyBhcyBjIC0+XG4gICAgICBsZXQgcyA9IGJ5dGVzX2NyZWF0ZSAxIGluXG4gICAgICBieXRlc191bnNhZmVfc2V0IHMgMCBjO1xuICAgICAgdW5zYWZlX3RvX3N0cmluZyBzXG4gIHwgYyAtPlxuICAgICAgbGV0IG4gPSBjb2RlIGMgaW5cbiAgICAgIGxldCBzID0gYnl0ZXNfY3JlYXRlIDQgaW5cbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAwICdcXFxcJztcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAxICh1bnNhZmVfY2hyICg0OCArIG4gLyAxMDApKTtcbiAgICAgIGJ5dGVzX3Vuc2FmZV9zZXQgcyAyICh1bnNhZmVfY2hyICg0OCArIChuIC8gMTApIG1vZCAxMCkpO1xuICAgICAgYnl0ZXNfdW5zYWZlX3NldCBzIDMgKHVuc2FmZV9jaHIgKDQ4ICsgbiBtb2QgMTApKTtcbiAgICAgIHVuc2FmZV90b19zdHJpbmcgc1xuXG5sZXQgbG93ZXJjYXNlX2FzY2lpID0gZnVuY3Rpb25cbiAgfCAnQScgLi4gJ1onIGFzIGMgLT4gdW5zYWZlX2Nocihjb2RlIGMgKyAzMilcbiAgfCBjIC0+IGNcblxubGV0IHVwcGVyY2FzZV9hc2NpaSA9IGZ1bmN0aW9uXG4gIHwgJ2EnIC4uICd6JyBhcyBjIC0+IHVuc2FmZV9jaHIoY29kZSBjIC0gMzIpXG4gIHwgYyAtPiBjXG5cbnR5cGUgdCA9IGNoYXJcblxubGV0IGNvbXBhcmUgYzEgYzIgPSBjb2RlIGMxIC0gY29kZSBjMlxubGV0IGVxdWFsIChjMTogdCkgKGMyOiB0KSA9IGNvbXBhcmUgYzEgYzIgPSAwXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERhbmllbCBDLiBCdWVuemxpICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE0IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4dGVybmFsIGZvcm1hdF9pbnQgOiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZyA9IFwiY2FtbF9mb3JtYXRfaW50XCJcblxubGV0IGVycl9ub19wcmVkID0gXCJVKzAwMDAgaGFzIG5vIHByZWRlY2Vzc29yXCJcbmxldCBlcnJfbm9fc3VjYyA9IFwiVSsxMEZGRkYgaGFzIG5vIHN1Y2Nlc3NvclwiXG5sZXQgZXJyX25vdF9zdiBpID0gZm9ybWF0X2ludCBcIiVYXCIgaSBeIFwiIGlzIG5vdCBhbiBVbmljb2RlIHNjYWxhciB2YWx1ZVwiXG5sZXQgZXJyX25vdF9sYXRpbjEgdSA9IFwiVStcIiBeIGZvcm1hdF9pbnQgXCIlMDRYXCIgdSBeIFwiIGlzIG5vdCBhIGxhdGluMSBjaGFyYWN0ZXJcIlxuXG50eXBlIHQgPSBpbnRcblxubGV0IG1pbiA9IDB4MDAwMFxubGV0IG1heCA9IDB4MTBGRkZGXG5sZXQgbG9fYm91bmQgPSAweEQ3RkZcbmxldCBoaV9ib3VuZCA9IDB4RTAwMFxuXG5sZXQgYm9tID0gMHhGRUZGXG5sZXQgcmVwID0gMHhGRkZEXG5cbmxldCBzdWNjIHUgPVxuICBpZiB1ID0gbG9fYm91bmQgdGhlbiBoaV9ib3VuZCBlbHNlXG4gIGlmIHUgPSBtYXggdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fc3VjYyBlbHNlXG4gIHUgKyAxXG5cbmxldCBwcmVkIHUgPVxuICBpZiB1ID0gaGlfYm91bmQgdGhlbiBsb19ib3VuZCBlbHNlXG4gIGlmIHUgPSBtaW4gdGhlbiBpbnZhbGlkX2FyZyBlcnJfbm9fcHJlZCBlbHNlXG4gIHUgLSAxXG5cbmxldCBpc192YWxpZCBpID0gKG1pbiA8PSBpICYmIGkgPD0gbG9fYm91bmQpIHx8IChoaV9ib3VuZCA8PSBpICYmIGkgPD0gbWF4KVxubGV0IG9mX2ludCBpID0gaWYgaXNfdmFsaWQgaSB0aGVuIGkgZWxzZSBpbnZhbGlkX2FyZyAoZXJyX25vdF9zdiBpKVxuZXh0ZXJuYWwgdW5zYWZlX29mX2ludCA6IGludCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgdG9faW50IDogdCAtPiBpbnQgPSBcIiVpZGVudGl0eVwiXG5cbmxldCBpc19jaGFyIHUgPSB1IDwgMjU2XG5sZXQgb2ZfY2hhciBjID0gQ2hhci5jb2RlIGNcbmxldCB0b19jaGFyIHUgPVxuICBpZiB1ID4gMjU1IHRoZW4gaW52YWxpZF9hcmcgKGVycl9ub3RfbGF0aW4xIHUpIGVsc2VcbiAgQ2hhci51bnNhZmVfY2hyIHVcblxubGV0IHVuc2FmZV90b19jaGFyID0gQ2hhci51bnNhZmVfY2hyXG5cbmxldCBlcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbCA9ICggPSApXG5sZXQgY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50ID0gU3RkbGliLmNvbXBhcmVcbmxldCBoYXNoID0gdG9faW50XG5cbigqIFVURiBjb2RlY3MgdG9vbHMgKilcblxudHlwZSB1dGZfZGVjb2RlID0gaW50XG4oKiBUaGlzIGlzIGFuIGludCBbMHhEVVVVVVVVXSBkZWNvbXBvc2VkIGFzIGZvbGxvd3M6XG4gICAtIFtEXSBpcyBmb3VyIGJpdHMgZm9yIGRlY29kZSBpbmZvcm1hdGlvbiwgdGhlIGhpZ2hlc3QgYml0IGlzIHNldCBpZiB0aGVcbiAgICAgZGVjb2RlIGlzIHZhbGlkLiBUaGUgdGhyZWUgbG93ZXIgYml0cyBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzXG4gICAgIGZyb20gdGhlIHNvdXJjZSB0aGF0IHdlcmUgY29uc3VtZWQgYnkgdGhlIGRlY29kZS5cbiAgIC0gW1VVVVVVVV0gaXMgdGhlIGRlY29kZWQgVW5pY29kZSBjaGFyYWN0ZXIgb3IgdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnRcbiAgICAgY2hhcmFjdGVyIFUrRkZGRCBpZiBmb3IgaW52YWxpZCBkZWNvZGVzLiAqKVxuXG5sZXQgdmFsaWRfYml0ID0gMjdcbmxldCBkZWNvZGVfYml0cyA9IDI0XG5cbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2lzX3ZhbGlkIGQgPSAoZCBsc3IgdmFsaWRfYml0KSA9IDFcbmxldFtAaW5saW5lXSB1dGZfZGVjb2RlX2xlbmd0aCBkID0gKGQgbHNyIGRlY29kZV9iaXRzKSBsYW5kIDBiMTExXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV91Y2hhciBkID0gdW5zYWZlX29mX2ludCAoZCBsYW5kIDB4RkZGRkZGKVxubGV0W0BpbmxpbmVdIHV0Zl9kZWNvZGUgbiB1ID0gKCg4IGxvciBuKSBsc2wgZGVjb2RlX2JpdHMpIGxvciAodG9faW50IHUpXG5sZXRbQGlubGluZV0gdXRmX2RlY29kZV9pbnZhbGlkIG4gPSAobiBsc2wgZGVjb2RlX2JpdHMpIGxvciByZXBcblxubGV0IHV0Zl84X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHgwMDdGIC0+IDFcbnwgdSB3aGVuIHUgPD0gMHgwN0ZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDNcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgdXRmXzE2X2J5dGVfbGVuZ3RoIHUgPSBtYXRjaCB0b19pbnQgdSB3aXRoXG58IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbnwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+IDJcbnwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT4gNFxufCBfIC0+IGFzc2VydCBmYWxzZVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBBbiBhbGlhcyBmb3IgdGhlIHR5cGUgb2YgbGlzdHMuICopXG50eXBlICdhIHQgPSAnYSBsaXN0ID0gW10gfCAoOjopIG9mICdhICogJ2EgbGlzdFxuXG4oKiBMaXN0IG9wZXJhdGlvbnMgKilcblxubGV0IHJlYyBsZW5ndGhfYXV4IGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gbGVuXG4gIHwgXzo6bCAtPiBsZW5ndGhfYXV4IChsZW4gKyAxKSBsXG5cbmxldCBsZW5ndGggbCA9IGxlbmd0aF9hdXggMCBsXG5cbmxldCBjb25zIGEgbCA9IGE6OmxcblxubGV0IGhkID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcImhkXCJcbiAgfCBhOjpfIC0+IGFcblxubGV0IHRsID0gZnVuY3Rpb25cbiAgICBbXSAtPiBmYWlsd2l0aCBcInRsXCJcbiAgfCBfOjpsIC0+IGxcblxubGV0IG50aCBsIG4gPVxuICBpZiBuIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiTGlzdC5udGhcIiBlbHNlXG4gIGxldCByZWMgbnRoX2F1eCBsIG4gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gZmFpbHdpdGggXCJudGhcIlxuICAgIHwgYTo6bCAtPiBpZiBuID0gMCB0aGVuIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IG50aF9vcHQgbCBuID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkxpc3QubnRoXCIgZWxzZVxuICBsZXQgcmVjIG50aF9hdXggbCBuID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IGE6OmwgLT4gaWYgbiA9IDAgdGhlbiBTb21lIGEgZWxzZSBudGhfYXV4IGwgKG4tMSlcbiAgaW4gbnRoX2F1eCBsIG5cblxubGV0IGFwcGVuZCA9IChAKVxuXG5sZXQgcmVjIHJldl9hcHBlbmQgbDEgbDIgPVxuICBtYXRjaCBsMSB3aXRoXG4gICAgW10gLT4gbDJcbiAgfCBhIDo6IGwgLT4gcmV2X2FwcGVuZCBsIChhIDo6IGwyKVxuXG5sZXQgcmV2IGwgPSByZXZfYXBwZW5kIGwgW11cblxubGV0IHJlYyBpbml0X3RhaWxyZWNfYXV4IGFjYyBpIG4gZiA9XG4gIGlmIGkgPj0gbiB0aGVuIGFjY1xuICBlbHNlIGluaXRfdGFpbHJlY19hdXggKGYgaSA6OiBhY2MpIChpKzEpIG4gZlxuXG5sZXQgcmVjIGluaXRfYXV4IGkgbiBmID1cbiAgaWYgaSA+PSBuIHRoZW4gW11cbiAgZWxzZVxuICAgIGxldCByID0gZiBpIGluXG4gICAgciA6OiBpbml0X2F1eCAoaSsxKSBuIGZcblxubGV0IHJldl9pbml0X3RocmVzaG9sZCA9XG4gIG1hdGNoIFN5cy5iYWNrZW5kX3R5cGUgd2l0aFxuICB8IFN5cy5OYXRpdmUgfCBTeXMuQnl0ZWNvZGUgLT4gMTBfMDAwXG4gICgqIFdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN0YWNrLCBiZXR0ZXIgYmUgc2FmZSBhbmQgYXNzdW1lIGl0J3NcbiAgICAgc21hbGwuICopXG4gIHwgU3lzLk90aGVyIF8gLT4gNTBcblxubGV0IGluaXQgbGVuIGYgPVxuICBpZiBsZW4gPCAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LmluaXRcIiBlbHNlXG4gIGlmIGxlbiA+IHJldl9pbml0X3RocmVzaG9sZCB0aGVuIHJldiAoaW5pdF90YWlscmVjX2F1eCBbXSAwIGxlbiBmKVxuICBlbHNlIGluaXRfYXV4IDAgbGVuIGZcblxubGV0IHJlYyBmbGF0dGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IGw6OnIgLT4gbCBAIGZsYXR0ZW4gclxuXG5sZXQgY29uY2F0ID0gZmxhdHRlblxuXG5sZXQgcmVjIG1hcCBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiBbXVxuICB8IGE6OmwgLT4gbGV0IHIgPSBmIGEgaW4gciA6OiBtYXAgZiBsXG5cbmxldCByZWMgbWFwaSBpIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+IFtdXG4gIHwgYTo6bCAtPiBsZXQgciA9IGYgaSBhIGluIHIgOjogbWFwaSAoaSArIDEpIGYgbFxuXG5sZXQgbWFwaSBmIGwgPSBtYXBpIDAgZiBsXG5cbmxldCByZXZfbWFwIGYgbCA9XG4gIGxldCByZWMgcm1hcF9mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgYTo6bCAtPiBybWFwX2YgKGYgYSA6OiBhY2N1KSBsXG4gIGluXG4gIHJtYXBfZiBbXSBsXG5cblxubGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgIFtdIC0+ICgpXG4gIHwgYTo6bCAtPiBmIGE7IGl0ZXIgZiBsXG5cbmxldCByZWMgaXRlcmkgaSBmID0gZnVuY3Rpb25cbiAgICBbXSAtPiAoKVxuICB8IGE6OmwgLT4gZiBpIGE7IGl0ZXJpIChpICsgMSkgZiBsXG5cbmxldCBpdGVyaSBmIGwgPSBpdGVyaSAwIGYgbFxuXG5sZXQgcmVjIGZvbGRfbGVmdCBmIGFjY3UgbCA9XG4gIG1hdGNoIGwgd2l0aFxuICAgIFtdIC0+IGFjY3VcbiAgfCBhOjpsIC0+IGZvbGRfbGVmdCBmIChmIGFjY3UgYSkgbFxuXG5sZXQgcmVjIGZvbGRfcmlnaHQgZiBsIGFjY3UgPVxuICBtYXRjaCBsIHdpdGhcbiAgICBbXSAtPiBhY2N1XG4gIHwgYTo6bCAtPiBmIGEgKGZvbGRfcmlnaHQgZiBsIGFjY3UpXG5cbmxldCByZWMgbWFwMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IFtdXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBsZXQgciA9IGYgYTEgYTIgaW4gciA6OiBtYXAyIGYgbDEgbDJcbiAgfCAoXywgXykgLT4gaW52YWxpZF9hcmcgXCJMaXN0Lm1hcDJcIlxuXG5sZXQgcmV2X21hcDIgZiBsMSBsMiA9XG4gIGxldCByZWMgcm1hcDJfZiBhY2N1IGwxIGwyID1cbiAgICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgfCAoW10sIFtdKSAtPiBhY2N1XG4gICAgfCAoYTE6OmwxLCBhMjo6bDIpIC0+IHJtYXAyX2YgKGYgYTEgYTIgOjogYWNjdSkgbDEgbDJcbiAgICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QucmV2X21hcDJcIlxuICBpblxuICBybWFwMl9mIFtdIGwxIGwyXG5cblxubGV0IHJlYyBpdGVyMiBmIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+ICgpXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBmIGExIGEyOyBpdGVyMiBmIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5pdGVyMlwiXG5cbmxldCByZWMgZm9sZF9sZWZ0MiBmIGFjY3UgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZm9sZF9sZWZ0MiBmIChmIGFjY3UgYTEgYTIpIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb2xkX2xlZnQyXCJcblxubGV0IHJlYyBmb2xkX3JpZ2h0MiBmIGwxIGwyIGFjY3UgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gYWNjdVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gZiBhMSBhMiAoZm9sZF9yaWdodDIgZiBsMSBsMiBhY2N1KVxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZm9sZF9yaWdodDJcIlxuXG5sZXQgcmVjIGZvcl9hbGwgcCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gdHJ1ZVxuICB8IGE6OmwgLT4gcCBhICYmIGZvcl9hbGwgcCBsXG5cbmxldCByZWMgZXhpc3RzIHAgPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBwIGEgfHwgZXhpc3RzIHAgbFxuXG5sZXQgcmVjIGZvcl9hbGwyIHAgbDEgbDIgPVxuICBtYXRjaCAobDEsIGwyKSB3aXRoXG4gICAgKFtdLCBbXSkgLT4gdHJ1ZVxuICB8IChhMTo6bDEsIGEyOjpsMikgLT4gcCBhMSBhMiAmJiBmb3JfYWxsMiBwIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5mb3JfYWxsMlwiXG5cbmxldCByZWMgZXhpc3RzMiBwIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IGZhbHNlXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiBwIGExIGEyIHx8IGV4aXN0czIgcCBsMSBsMlxuICB8IChfLCBfKSAtPiBpbnZhbGlkX2FyZyBcIkxpc3QuZXhpc3RzMlwiXG5cbmxldCByZWMgbWVtIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IGZhbHNlXG4gIHwgYTo6bCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtIHggbFxuXG5sZXQgcmVjIG1lbXEgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZmFsc2VcbiAgfCBhOjpsIC0+IGEgPT0geCB8fCBtZW1xIHggbFxuXG5sZXQgcmVjIGFzc29jIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGIgZWxzZSBhc3NvYyB4IGxcblxubGV0IHJlYyBhc3NvY19vcHQgeCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gTm9uZVxuICB8IChhLGIpOjpsIC0+IGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIFNvbWUgYiBlbHNlIGFzc29jX29wdCB4IGxcblxubGV0IHJlYyBhc3NxIHggPSBmdW5jdGlvblxuICAgIFtdIC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IChhLGIpOjpsIC0+IGlmIGEgPT0geCB0aGVuIGIgZWxzZSBhc3NxIHggbFxuXG5sZXQgcmVjIGFzc3Ffb3B0IHggPSBmdW5jdGlvblxuICAgIFtdIC0+IE5vbmVcbiAgfCAoYSxiKTo6bCAtPiBpZiBhID09IHggdGhlbiBTb21lIGIgZWxzZSBhc3NxX29wdCB4IGxcblxubGV0IHJlYyBtZW1fYXNzb2MgeCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gZmFsc2VcbiAgfCAoYSwgXykgOjogbCAtPiBjb21wYXJlIGEgeCA9IDAgfHwgbWVtX2Fzc29jIHggbFxuXG5sZXQgcmVjIG1lbV9hc3NxIHggPSBmdW5jdGlvblxuICB8IFtdIC0+IGZhbHNlXG4gIHwgKGEsIF8pIDo6IGwgLT4gYSA9PSB4IHx8IG1lbV9hc3NxIHggbFxuXG5sZXQgcmVjIHJlbW92ZV9hc3NvYyB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT5cbiAgICAgIGlmIGNvbXBhcmUgYSB4ID0gMCB0aGVuIGwgZWxzZSBwYWlyIDo6IHJlbW92ZV9hc3NvYyB4IGxcblxubGV0IHJlYyByZW1vdmVfYXNzcSB4ID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IChhLCBfIGFzIHBhaXIpIDo6IGwgLT4gaWYgYSA9PSB4IHRoZW4gbCBlbHNlIHBhaXIgOjogcmVtb3ZlX2Fzc3EgeCBsXG5cbmxldCByZWMgZmluZCBwID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4geCBlbHNlIGZpbmQgcCBsXG5cbmxldCByZWMgZmluZF9vcHQgcCA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gTm9uZVxuICB8IHggOjogbCAtPiBpZiBwIHggdGhlbiBTb21lIHggZWxzZSBmaW5kX29wdCBwIGxcblxubGV0IHJlYyBmaW5kX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiBsIC0+XG4gICAgIGJlZ2luIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBmaW5kX21hcCBmIGxcbiAgICAgZW5kXG5cbmxldCBmaW5kX2FsbCBwID1cbiAgbGV0IHJlYyBmaW5kIGFjY3UgPSBmdW5jdGlvblxuICB8IFtdIC0+IHJldiBhY2N1XG4gIHwgeCA6OiBsIC0+IGlmIHAgeCB0aGVuIGZpbmQgKHggOjogYWNjdSkgbCBlbHNlIGZpbmQgYWNjdSBsIGluXG4gIGZpbmQgW11cblxubGV0IGZpbHRlciA9IGZpbmRfYWxsXG5cbmxldCBmaWx0ZXJpIHAgbCA9XG4gIGxldCByZWMgYXV4IGkgYWNjID0gZnVuY3Rpb25cbiAgfCBbXSAtPiByZXYgYWNjXG4gIHwgeDo6bCAtPiBhdXggKGkgKyAxKSAoaWYgcCBpIHggdGhlbiB4OjphY2MgZWxzZSBhY2MpIGxcbiAgaW5cbiAgYXV4IDAgW10gbFxuXG5sZXQgZmlsdGVyX21hcCBmID1cbiAgbGV0IHJlYyBhdXggYWNjdSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjdVxuICAgIHwgeCA6OiBsIC0+XG4gICAgICAgIG1hdGNoIGYgeCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBhdXggYWNjdSBsXG4gICAgICAgIHwgU29tZSB2IC0+IGF1eCAodiA6OiBhY2N1KSBsXG4gIGluXG4gIGF1eCBbXVxuXG5sZXQgY29uY2F0X21hcCBmIGwgPVxuICBsZXQgcmVjIGF1eCBmIGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjXG4gICAgfCB4IDo6IGwgLT5cbiAgICAgICBsZXQgeHMgPSBmIHggaW5cbiAgICAgICBhdXggZiAocmV2X2FwcGVuZCB4cyBhY2MpIGxcbiAgaW4gYXV4IGYgW10gbFxuXG5sZXQgZm9sZF9sZWZ0X21hcCBmIGFjY3UgbCA9XG4gIGxldCByZWMgYXV4IGFjY3UgbF9hY2N1ID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY3UsIHJldiBsX2FjY3VcbiAgICB8IHggOjogbCAtPlxuICAgICAgICBsZXQgYWNjdSwgeCA9IGYgYWNjdSB4IGluXG4gICAgICAgIGF1eCBhY2N1ICh4IDo6IGxfYWNjdSkgbCBpblxuICBhdXggYWNjdSBbXSBsXG5cbmxldCBwYXJ0aXRpb24gcCBsID1cbiAgbGV0IHJlYyBwYXJ0IHllcyBubyA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gKHJldiB5ZXMsIHJldiBubylcbiAgfCB4IDo6IGwgLT4gaWYgcCB4IHRoZW4gcGFydCAoeCA6OiB5ZXMpIG5vIGwgZWxzZSBwYXJ0IHllcyAoeCA6OiBubykgbCBpblxuICBwYXJ0IFtdIFtdIGxcblxubGV0IHBhcnRpdGlvbl9tYXAgcCBsID1cbiAgbGV0IHJlYyBwYXJ0IGxlZnQgcmlnaHQgPSBmdW5jdGlvblxuICB8IFtdIC0+IChyZXYgbGVmdCwgcmV2IHJpZ2h0KVxuICB8IHggOjogbCAtPlxuICAgICBiZWdpbiBtYXRjaCBwIHggd2l0aFxuICAgICAgIHwgRWl0aGVyLkxlZnQgdiAtPiBwYXJ0ICh2IDo6IGxlZnQpIHJpZ2h0IGxcbiAgICAgICB8IEVpdGhlci5SaWdodCB2IC0+IHBhcnQgbGVmdCAodiA6OiByaWdodCkgbFxuICAgICBlbmRcbiAgaW5cbiAgcGFydCBbXSBbXSBsXG5cbmxldCByZWMgc3BsaXQgPSBmdW5jdGlvblxuICAgIFtdIC0+IChbXSwgW10pXG4gIHwgKHgseSk6OmwgLT5cbiAgICAgIGxldCAocngsIHJ5KSA9IHNwbGl0IGwgaW4gKHg6OnJ4LCB5OjpyeSlcblxubGV0IHJlYyBjb21iaW5lIGwxIGwyID1cbiAgbWF0Y2ggKGwxLCBsMikgd2l0aFxuICAgIChbXSwgW10pIC0+IFtdXG4gIHwgKGExOjpsMSwgYTI6OmwyKSAtPiAoYTEsIGEyKSA6OiBjb21iaW5lIGwxIGwyXG4gIHwgKF8sIF8pIC0+IGludmFsaWRfYXJnIFwiTGlzdC5jb21iaW5lXCJcblxuKCoqIHNvcnRpbmcgKilcblxubGV0IHJlYyBtZXJnZSBjbXAgbDEgbDIgPVxuICBtYXRjaCBsMSwgbDIgd2l0aFxuICB8IFtdLCBsMiAtPiBsMlxuICB8IGwxLCBbXSAtPiBsMVxuICB8IGgxIDo6IHQxLCBoMiA6OiB0MiAtPlxuICAgICAgaWYgY21wIGgxIGgyIDw9IDBcbiAgICAgIHRoZW4gaDEgOjogbWVyZ2UgY21wIHQxIGwyXG4gICAgICBlbHNlIGgyIDo6IG1lcmdlIGNtcCBsMSB0MlxuXG5cbmxldCBzdGFibGVfc29ydCBjbXAgbCA9XG4gIGxldCByZWMgcmV2X21lcmdlIGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBpZiBjbXAgaDEgaDIgPD0gMFxuICAgICAgICB0aGVuIHJldl9tZXJnZSB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlIGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyByZXZfbWVyZ2VfcmV2IGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBpZiBjbXAgaDEgaDIgPiAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlX3JldiB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlX3JldiBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPSBpZiBjbXAgeDEgeDIgPD0gMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV0gaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGlmIGNtcCB4MSB4MiA8PSAwIHRoZW5cbiAgICAgICAgICAgIGlmIGNtcCB4MiB4MyA8PSAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlIGlmIGNtcCB4MSB4MyA8PSAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzIDw9IDAgdGhlbiBbeDI7IHgxOyB4M11cbiAgICAgICAgICBlbHNlIGlmIGNtcCB4MiB4MyA8PSAwIHRoZW4gW3gyOyB4MzsgeDFdXG4gICAgICAgICAgZWxzZSBbeDM7IHgyOyB4MV1cbiAgICAgICAgaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgbiwgbCAtPlxuICAgICAgICBsZXQgbjEgPSBuIGFzciAxIGluXG4gICAgICAgIGxldCBuMiA9IG4gLSBuMSBpblxuICAgICAgICBsZXQgczEsIGwyID0gcmV2X3NvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gcmV2X3NvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZV9yZXYgczEgczIgW10sIHRsKVxuICBhbmQgcmV2X3NvcnQgbiBsID1cbiAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICB8IDIsIHgxIDo6IHgyIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID0gaWYgY21wIHgxIHgyID4gMCB0aGVuIFt4MTsgeDJdIGVsc2UgW3gyOyB4MV0gaW5cbiAgICAgICAgKHMsIHRsKVxuICAgIHwgMywgeDEgOjogeDIgOjogeDMgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGlmIGNtcCB4MSB4MiA+IDAgdGhlblxuICAgICAgICAgICAgaWYgY21wIHgyIHgzID4gMCB0aGVuIFt4MTsgeDI7IHgzXVxuICAgICAgICAgICAgZWxzZSBpZiBjbXAgeDEgeDMgPiAwIHRoZW4gW3gxOyB4MzsgeDJdXG4gICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgxIHgzID4gMCB0aGVuIFt4MjsgeDE7IHgzXVxuICAgICAgICAgIGVsc2UgaWYgY21wIHgyIHgzID4gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgIGVsc2UgW3gzOyB4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IG4sIGwgLT5cbiAgICAgICAgbGV0IG4xID0gbiBhc3IgMSBpblxuICAgICAgICBsZXQgbjIgPSBuIC0gbjEgaW5cbiAgICAgICAgbGV0IHMxLCBsMiA9IHNvcnQgbjEgbCBpblxuICAgICAgICBsZXQgczIsIHRsID0gc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlIHMxIHMyIFtdLCB0bClcbiAgaW5cbiAgbGV0IGxlbiA9IGxlbmd0aCBsIGluXG4gIGlmIGxlbiA8IDIgdGhlbiBsIGVsc2UgZnN0IChzb3J0IGxlbiBsKVxuXG5cbmxldCBzb3J0ID0gc3RhYmxlX3NvcnRcbmxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4oKiBOb3RlOiBvbiBhIGxpc3Qgb2YgbGVuZ3RoIGJldHdlZW4gYWJvdXQgMTAwMDAwIChkZXBlbmRpbmcgb24gdGhlIG1pbm9yXG4gICBoZWFwIHNpemUgYW5kIHRoZSB0eXBlIG9mIHRoZSBsaXN0KSBhbmQgU3lzLm1heF9hcnJheV9zaXplLCBpdCBpc1xuICAgYWN0dWFsbHkgZmFzdGVyIHRvIHVzZSB0aGUgZm9sbG93aW5nLCBidXQgaXQgbWlnaHQgYWxzbyB1c2UgbW9yZSBtZW1vcnlcbiAgIGJlY2F1c2UgdGhlIGFyZ3VtZW50IGxpc3QgY2Fubm90IGJlIGRlYWxsb2NhdGVkIGluY3JlbWVudGFsbHkuXG5cbiAgIEFsc28sIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIHRoaXMgY29kZSBvciBpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mIG9ial90cnVuY2F0ZS5cblxuZXh0ZXJuYWwgb2JqX3RydW5jYXRlIDogJ2EgYXJyYXkgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfb2JqX3RydW5jYXRlXCJcblxubGV0IGFycmF5X3RvX2xpc3RfaW5fcGxhY2UgYSA9XG4gIGxldCBsID0gQXJyYXkubGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGFjY3UgbiBwID1cbiAgICBpZiBwIDw9IDAgdGhlbiBhY2N1IGVsc2UgYmVnaW5cbiAgICAgIGlmIHAgPSBuIHRoZW4gYmVnaW5cbiAgICAgICAgb2JqX3RydW5jYXRlIGEgcDtcbiAgICAgICAgbG9vcCAoYS4ocC0xKSA6OiBhY2N1KSAobi0xMDAwKSAocC0xKVxuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbG9vcCAoYS4ocC0xKSA6OiBhY2N1KSBuIChwLTEpXG4gICAgICBlbmRcbiAgICBlbmRcbiAgaW5cbiAgbG9vcCBbXSAobC0xMDAwKSBsXG5cblxubGV0IHN0YWJsZV9zb3J0IGNtcCBsID1cbiAgbGV0IGEgPSBBcnJheS5vZl9saXN0IGwgaW5cbiAgQXJyYXkuc3RhYmxlX3NvcnQgY21wIGE7XG4gIGFycmF5X3RvX2xpc3RfaW5fcGxhY2UgYVxuXG4qKVxuXG5cbigqKiBzb3J0aW5nICsgcmVtb3ZpbmcgZHVwbGljYXRlcyAqKVxuXG5sZXQgc29ydF91bmlxIGNtcCBsID1cbiAgbGV0IHJlYyByZXZfbWVyZ2UgbDEgbDIgYWNjdSA9XG4gICAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgICB8IFtdLCBsMiAtPiByZXZfYXBwZW5kIGwyIGFjY3VcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGwxIGFjY3VcbiAgICB8IGgxOjp0MSwgaDI6OnQyIC0+XG4gICAgICAgIGxldCBjID0gY21wIGgxIGgyIGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gcmV2X21lcmdlIHQxIHQyIChoMTo6YWNjdSlcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIHJldl9tZXJnZSB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlIGwxIHQyIChoMjo6YWNjdSlcbiAgaW5cbiAgbGV0IHJlYyByZXZfbWVyZ2VfcmV2IGwxIGwyIGFjY3UgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBsMiBhY2N1XG4gICAgfCBsMSwgW10gLT4gcmV2X2FwcGVuZCBsMSBhY2N1XG4gICAgfCBoMTo6dDEsIGgyOjp0MiAtPlxuICAgICAgICBsZXQgYyA9IGNtcCBoMSBoMiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIHJldl9tZXJnZV9yZXYgdDEgdDIgKGgxOjphY2N1KVxuICAgICAgICBlbHNlIGlmIGMgPiAwXG4gICAgICAgIHRoZW4gcmV2X21lcmdlX3JldiB0MSBsMiAoaDE6OmFjY3UpXG4gICAgICAgIGVsc2UgcmV2X21lcmdlX3JldiBsMSB0MiAoaDI6OmFjY3UpXG4gIGluXG4gIGxldCByZWMgc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDFdIGVsc2UgaWYgYyA8IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4Ml0gZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDNdIGVsc2UgW3gzOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPCAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSByZXZfc29ydCBuMSBsIGluXG4gICAgICAgIGxldCBzMiwgdGwgPSByZXZfc29ydCBuMiBsMiBpblxuICAgICAgICAocmV2X21lcmdlX3JldiBzMSBzMiBbXSwgdGwpXG4gIGFuZCByZXZfc29ydCBuIGwgPVxuICAgIG1hdGNoIG4sIGwgd2l0aFxuICAgIHwgMiwgeDEgOjogeDIgOjogdGwgLT5cbiAgICAgICAgbGV0IHMgPVxuICAgICAgICAgIGxldCBjID0gY21wIHgxIHgyIGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBbeDFdIGVsc2UgaWYgYyA+IDAgdGhlbiBbeDE7IHgyXSBlbHNlIFt4MjsgeDFdXG4gICAgICAgIGluXG4gICAgICAgIChzLCB0bClcbiAgICB8IDMsIHgxIDo6IHgyIDo6IHgzIDo6IHRsIC0+XG4gICAgICAgIGxldCBzID1cbiAgICAgICAgICBsZXQgYyA9IGNtcCB4MSB4MiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4Ml0gZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDNdIGVsc2UgW3gzOyB4Ml1cbiAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW5cbiAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MTsgeDJdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gxOyB4MjsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gxOyB4Ml1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MTsgeDM7IHgyXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDE7IHgyXVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBjID0gY21wIHgxIHgzIGluXG4gICAgICAgICAgICBpZiBjID0gMCB0aGVuIFt4MjsgeDFdXG4gICAgICAgICAgICBlbHNlIGlmIGMgPiAwIHRoZW4gW3gyOyB4MTsgeDNdXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIGxldCBjID0gY21wIHgyIHgzIGluXG4gICAgICAgICAgICAgIGlmIGMgPSAwIHRoZW4gW3gyOyB4MV1cbiAgICAgICAgICAgICAgZWxzZSBpZiBjID4gMCB0aGVuIFt4MjsgeDM7IHgxXVxuICAgICAgICAgICAgICBlbHNlIFt4MzsgeDI7IHgxXVxuICAgICAgICBpblxuICAgICAgICAocywgdGwpXG4gICAgfCBuLCBsIC0+XG4gICAgICAgIGxldCBuMSA9IG4gYXNyIDEgaW5cbiAgICAgICAgbGV0IG4yID0gbiAtIG4xIGluXG4gICAgICAgIGxldCBzMSwgbDIgPSBzb3J0IG4xIGwgaW5cbiAgICAgICAgbGV0IHMyLCB0bCA9IHNvcnQgbjIgbDIgaW5cbiAgICAgICAgKHJldl9tZXJnZSBzMSBzMiBbXSwgdGwpXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggbCBpblxuICBpZiBsZW4gPCAyIHRoZW4gbCBlbHNlIGZzdCAoc29ydCBsZW4gbClcblxuXG5sZXQgcmVjIGNvbXBhcmVfbGVuZ3RocyBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIFtdIC0+IDBcbiAgfCBbXSwgXyAtPiAtMVxuICB8IF8sIFtdIC0+IDFcbiAgfCBfIDo6IGwxLCBfIDo6IGwyIC0+IGNvbXBhcmVfbGVuZ3RocyBsMSBsMlxuXG5sZXQgcmVjIGNvbXBhcmVfbGVuZ3RoX3dpdGggbCBuID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT5cbiAgICBpZiBuID0gMCB0aGVuIDAgZWxzZVxuICAgICAgaWYgbiA+IDAgdGhlbiAtMSBlbHNlIDFcbiAgfCBfIDo6IGwgLT5cbiAgICBpZiBuIDw9IDAgdGhlbiAxIGVsc2VcbiAgICAgIGNvbXBhcmVfbGVuZ3RoX3dpdGggbCAobi0xKVxuXG4oKiogezEgQ29tcGFyaXNvbn0gKilcblxuKCogTm90ZTogd2UgYXJlICpub3QqIHNob3J0Y3V0dGluZyB0aGUgbGlzdCBieSB1c2luZ1xuICAgW0xpc3QuY29tcGFyZV9sZW5ndGhzXSBmaXJzdDsgdGhpcyBtYXkgYmUgc2xvd2VyIG9uIGxvbmcgbGlzdHNcbiAgIGltbWVkaWF0ZWx5IHN0YXJ0IHdpdGggZGlzdGluY3QgZWxlbWVudHMuIEl0IGlzIGFsc28gaW5jb3JyZWN0IGZvclxuICAgW2NvbXBhcmVdIGJlbG93LCBhbmQgaXQgaXMgYmV0dGVyIChwcmluY2lwbGUgb2YgbGVhc3Qgc3VycHJpc2UpIHRvXG4gICB1c2UgdGhlIHNhbWUgYXBwcm9hY2ggZm9yIGJvdGggZnVuY3Rpb25zLiAqKVxubGV0IHJlYyBlcXVhbCBlcSBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIFtdIC0+IHRydWVcbiAgfCBbXSwgXzo6XyB8IF86Ol8sIFtdIC0+IGZhbHNlXG4gIHwgYTE6OmwxLCBhMjo6bDIgLT4gZXEgYTEgYTIgJiYgZXF1YWwgZXEgbDEgbDJcblxubGV0IHJlYyBjb21wYXJlIGNtcCBsMSBsMiA9XG4gIG1hdGNoIGwxLCBsMiB3aXRoXG4gIHwgW10sIFtdIC0+IDBcbiAgfCBbXSwgXzo6XyAtPiAtMVxuICB8IF86Ol8sIFtdIC0+IDFcbiAgfCBhMTo6bDEsIGEyOjpsMiAtPlxuICAgIGxldCBjID0gY21wIGExIGEyIGluXG4gICAgaWYgYyA8PiAwIHRoZW4gY1xuICAgIGVsc2UgY29tcGFyZSBjbXAgbDEgbDJcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBsID1cbiAgbGV0IHJlYyBhdXggbCAoKSA9IG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gU2VxLk5pbFxuICAgIHwgeCA6OiB0YWlsIC0+IFNlcS5Db25zICh4LCBhdXggdGFpbClcbiAgaW5cbiAgYXV4IGxcblxubGV0IG9mX3NlcSBzZXEgPVxuICBsZXQgcmVjIGRpcmVjdCBkZXB0aCBzZXEgOiBfIGxpc3QgPVxuICAgIGlmIGRlcHRoPTBcbiAgICB0aGVuXG4gICAgICBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBzZXFcbiAgICAgIHw+IHJldiAoKiB0YWlscmVjICopXG4gICAgZWxzZSBtYXRjaCBzZXEoKSB3aXRoXG4gICAgICB8IFNlcS5OaWwgLT4gW11cbiAgICAgIHwgU2VxLkNvbnMgKHgsIG5leHQpIC0+IHggOjogZGlyZWN0IChkZXB0aC0xKSBuZXh0XG4gIGluXG4gIGRpcmVjdCA1MDAgc2VxXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGludFxuXG5sZXQgemVybyA9IDBcbmxldCBvbmUgPSAxXG5sZXQgbWludXNfb25lID0gLTFcbmV4dGVybmFsIG5lZyA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuZXh0ZXJuYWwgYWRkIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhZGRpbnRcIlxuZXh0ZXJuYWwgc3ViIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuZXh0ZXJuYWwgbXVsIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtdWxpbnRcIlxuZXh0ZXJuYWwgZGl2IDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVkaXZpbnRcIlxuZXh0ZXJuYWwgcmVtIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVtb2RpbnRcIlxuZXh0ZXJuYWwgc3VjYyA6IGludCAtPiBpbnQgPSBcIiVzdWNjaW50XCJcbmV4dGVybmFsIHByZWQgOiBpbnQgLT4gaW50ID0gXCIlcHJlZGludFwiXG5sZXQgYWJzIHggPSBpZiB4ID49IDAgdGhlbiB4IGVsc2UgLXhcbmxldCBtYXhfaW50ID0gKC0xKSBsc3IgMVxubGV0IG1pbl9pbnQgPSBtYXhfaW50ICsgMVxuZXh0ZXJuYWwgbG9nYW5kIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuZXh0ZXJuYWwgbG9nb3IgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJW9yaW50XCJcbmV4dGVybmFsIGxvZ3hvciA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIleG9yaW50XCJcbmxldCBsb2dub3QgeCA9IGxvZ3hvciB4ICgtMSlcbmV4dGVybmFsIHNoaWZ0X2xlZnQgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodCA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlYXNyaW50XCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG5sZXQgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSAoID0gKVxubGV0IGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFN0ZGxpYi5jb21wYXJlXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbmV4dGVybmFsIHRvX2Zsb2F0IDogaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRvZmludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuXG4oKlxuZXh0ZXJuYWwgaW50X29mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfaW50X29mX3N0cmluZ1wiXG5sZXQgb2Zfc3RyaW5nIHMgPSB0cnkgU29tZSAoaW50X29mX3N0cmluZyBzKSB3aXRoIEZhaWx1cmUgXyAtPiBOb25lXG4qKVxuXG5leHRlcm5hbCBmb3JtYXRfaW50IDogc3RyaW5nIC0+IGludCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2ludFwiXG5sZXQgdG9fc3RyaW5nIHggPSBmb3JtYXRfaW50IFwiJWRcIiB4XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAqKVxuXG4oKiBXQVJOSU5HOiBTb21lIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sIGZvclxuICAgZWZmaWNpZW5jeSByZWFzb25zLiBXaGVuIHlvdSBtb2RpZnkgdGhlIG9uZSBpbiB0aGlzIGZpbGUgeW91IG5lZWQgdG9cbiAgIG1vZGlmeSBpdHMgZHVwbGljYXRlIGluIHN0cmluZy5tbC5cbiAgIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgXCJkdXBsaWNhdGVkXCIgY29tbWVudCBhYm92ZSB0aGVpciBkZWZpbml0aW9uLlxuKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbmV4dGVybmFsIHN0cmluZ19sZW5ndGggOiBzdHJpbmcgLT4gaW50ID0gXCIlc3RyaW5nX2xlbmd0aFwiXG5leHRlcm5hbCBnZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbmV4dGVybmFsIHNldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gYnl0ZXMgPSBcImNhbWxfY3JlYXRlX2J5dGVzXCJcbmV4dGVybmFsIHVuc2FmZV9nZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciA9IFwiJWJ5dGVzX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV9maWxsIDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiBjaGFyIC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2ZpbGxfYnl0ZXNcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdW5zYWZlX3RvX3N0cmluZyA6IGJ5dGVzIC0+IHN0cmluZyA9IFwiJWJ5dGVzX3RvX3N0cmluZ1wiXG5leHRlcm5hbCB1bnNhZmVfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGJ5dGVzID0gXCIlYnl0ZXNfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgdW5zYWZlX2JsaXQgOiBieXRlcyAtPiBpbnQgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X2J5dGVzXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHVuc2FmZV9ibGl0X3N0cmluZyA6IHN0cmluZyAtPiBpbnQgLT4gYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9ibGl0X3N0cmluZ1wiIFtAQG5vYWxsb2NdXG5cbmxldCBtYWtlIG4gYyA9XG4gIGxldCBzID0gY3JlYXRlIG4gaW5cbiAgdW5zYWZlX2ZpbGwgcyAwIG4gYztcbiAgc1xuXG5sZXQgaW5pdCBuIGYgPVxuICBsZXQgcyA9IGNyZWF0ZSBuIGluXG4gIGZvciBpID0gMCB0byBuIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgcyBpIChmIGkpXG4gIGRvbmU7XG4gIHNcblxubGV0IGVtcHR5ID0gY3JlYXRlIDBcblxubGV0IGNvcHkgcyA9XG4gIGxldCBsZW4gPSBsZW5ndGggcyBpblxuICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgdW5zYWZlX2JsaXQgcyAwIHIgMCBsZW47XG4gIHJcblxubGV0IHRvX3N0cmluZyBiID0gdW5zYWZlX3RvX3N0cmluZyAoY29weSBiKVxubGV0IG9mX3N0cmluZyBzID0gY29weSAodW5zYWZlX29mX3N0cmluZyBzKVxuXG5sZXQgc3ViIHMgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLnN1YiAvIEJ5dGVzLnN1YlwiXG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsZW4gaW5cbiAgICB1bnNhZmVfYmxpdCBzIG9mcyByIDAgbGVuO1xuICAgIHJcbiAgZW5kXG5cbmxldCBzdWJfc3RyaW5nIGIgb2ZzIGxlbiA9IHVuc2FmZV90b19zdHJpbmcgKHN1YiBiIG9mcyBsZW4pXG5cbigqIGFkZGl0aW9uIHdpdGggYW4gb3ZlcmZsb3cgY2hlY2sgKilcbmxldCAoKyspIGEgYiA9XG4gIGxldCBjID0gYSArIGIgaW5cbiAgbWF0Y2ggYSA8IDAsIGIgPCAwLCBjIDwgMCB3aXRoXG4gIHwgdHJ1ZSAsIHRydWUgLCBmYWxzZVxuICB8IGZhbHNlLCBmYWxzZSwgdHJ1ZSAgLT4gaW52YWxpZF9hcmcgXCJCeXRlcy5leHRlbmRcIiAoKiBvdmVyZmxvdyAqKVxuICB8IF8gLT4gY1xuXG5sZXQgZXh0ZW5kIHMgbGVmdCByaWdodCA9XG4gIGxldCBsZW4gPSBsZW5ndGggcyArKyBsZWZ0ICsrIHJpZ2h0IGluXG4gIGxldCByID0gY3JlYXRlIGxlbiBpblxuICBsZXQgKHNyY29mZiwgZHN0b2ZmKSA9IGlmIGxlZnQgPCAwIHRoZW4gLWxlZnQsIDAgZWxzZSAwLCBsZWZ0IGluXG4gIGxldCBjcHlsZW4gPSBJbnQubWluIChsZW5ndGggcyAtIHNyY29mZikgKGxlbiAtIGRzdG9mZikgaW5cbiAgaWYgY3B5bGVuID4gMCB0aGVuIHVuc2FmZV9ibGl0IHMgc3Jjb2ZmIHIgZHN0b2ZmIGNweWxlbjtcbiAgclxuXG5sZXQgZmlsbCBzIG9mcyBsZW4gYyA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBsZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmZpbGwgLyBCeXRlcy5maWxsXCJcbiAgZWxzZSB1bnNhZmVfZmlsbCBzIG9mcyBsZW4gY1xuXG5sZXQgYmxpdCBzMSBvZnMxIHMyIG9mczIgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBvZnMxIDwgMCB8fCBvZnMxID4gbGVuZ3RoIHMxIC0gbGVuXG4gICAgICAgICAgICAgfHwgb2ZzMiA8IDAgfHwgb2ZzMiA+IGxlbmd0aCBzMiAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnl0ZXMuYmxpdFwiXG4gIGVsc2UgdW5zYWZlX2JsaXQgczEgb2ZzMSBzMiBvZnMyIGxlblxuXG5sZXQgYmxpdF9zdHJpbmcgczEgb2ZzMSBzMiBvZnMyIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgb2ZzMSA8IDAgfHwgb2ZzMSA+IHN0cmluZ19sZW5ndGggczEgLSBsZW5cbiAgICAgICAgICAgICB8fCBvZnMyIDwgMCB8fCBvZnMyID4gbGVuZ3RoIHMyIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuYmxpdCAvIEJ5dGVzLmJsaXRfc3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfYmxpdF9zdHJpbmcgczEgb2ZzMSBzMiBvZnMyIGxlblxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGl0ZXIgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaXRlcmkgZiBhID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmIGkgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbmxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIGludmFsaWRfYXJnIFwiQnl0ZXMuY29uY2F0XCJcblxubGV0IHJlYyBzdW1fbGVuZ3RocyBhY2Mgc2VwbGVuID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBhY2NcbiAgfCBoZCA6OiBbXSAtPiBsZW5ndGggaGQgKyBhY2NcbiAgfCBoZCA6OiB0bCAtPiBzdW1fbGVuZ3RocyAoZW5zdXJlX2dlIChsZW5ndGggaGQgKyBzZXBsZW4gKyBhY2MpIGFjYykgc2VwbGVuIHRsXG5cbmxldCByZWMgdW5zYWZlX2JsaXRzIGRzdCBwb3Mgc2VwIHNlcGxlbiA9IGZ1bmN0aW9uXG4gICAgW10gLT4gZHN0XG4gIHwgaGQgOjogW10gLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7IGRzdFxuICB8IGhkIDo6IHRsIC0+XG4gICAgdW5zYWZlX2JsaXQgaGQgMCBkc3QgcG9zIChsZW5ndGggaGQpO1xuICAgIHVuc2FmZV9ibGl0IHNlcCAwIGRzdCAocG9zICsgbGVuZ3RoIGhkKSBzZXBsZW47XG4gICAgdW5zYWZlX2JsaXRzIGRzdCAocG9zICsgbGVuZ3RoIGhkICsgc2VwbGVuKSBzZXAgc2VwbGVuIHRsXG5cbmxldCBjb25jYXQgc2VwID0gZnVuY3Rpb25cbiAgICBbXSAtPiBlbXB0eVxuICB8IGwgLT4gbGV0IHNlcGxlbiA9IGxlbmd0aCBzZXAgaW5cbiAgICAgICAgICB1bnNhZmVfYmxpdHNcbiAgICAgICAgICAgIChjcmVhdGUgKHN1bV9sZW5ndGhzIDAgc2VwbGVuIGwpKVxuICAgICAgICAgICAgMCBzZXAgc2VwbGVuIGxcblxubGV0IGNhdCBzMSBzMiA9XG4gIGxldCBsMSA9IGxlbmd0aCBzMSBpblxuICBsZXQgbDIgPSBsZW5ndGggczIgaW5cbiAgbGV0IHIgPSBjcmVhdGUgKGwxICsgbDIpIGluXG4gIHVuc2FmZV9ibGl0IHMxIDAgciAwIGwxO1xuICB1bnNhZmVfYmxpdCBzMiAwIHIgbDEgbDI7XG4gIHJcblxuXG5leHRlcm5hbCBjaGFyX2NvZGU6IGNoYXIgLT4gaW50ID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgY2hhcl9jaHI6IGludCAtPiBjaGFyID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgaXNfc3BhY2UgPSBmdW5jdGlvblxuICB8ICcgJyB8ICdcXDAxMicgfCAnXFxuJyB8ICdcXHInIHwgJ1xcdCcgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2VcblxubGV0IHRyaW0gcyA9XG4gIGxldCBsZW4gPSBsZW5ndGggcyBpblxuICBsZXQgaSA9IHJlZiAwIGluXG4gIHdoaWxlICFpIDwgbGVuICYmIGlzX3NwYWNlICh1bnNhZmVfZ2V0IHMgIWkpIGRvXG4gICAgaW5jciBpXG4gIGRvbmU7XG4gIGxldCBqID0gcmVmIChsZW4gLSAxKSBpblxuICB3aGlsZSAhaiA+PSAhaSAmJiBpc19zcGFjZSAodW5zYWZlX2dldCBzICFqKSBkb1xuICAgIGRlY3IgalxuICBkb25lO1xuICBpZiAhaiA+PSAhaSB0aGVuXG4gICAgc3ViIHMgIWkgKCFqIC0gIWkgKyAxKVxuICBlbHNlXG4gICAgZW1wdHlcblxubGV0IHVuc2FmZV9lc2NhcGUgcyA9XG4gICgqIFdlIHBlcmZvcm0gdHdvIHBhc3NlcyBvbiB0aGUgaW5wdXQgc2VxdWVuY2UsIG9uZSB0byBjb21wdXRlIHRoZVxuICAgICByZXN1bHQgc2l6ZSBhbmQgb25lIHRvIHdyaXRlIHRoZSByZXN1bHQuXG5cbiAgICAgIzExNTA4LCAjMTE1MDk6IFRoaXMgbG9naWMgd291bGQgYmUgaW5jb3JyZWN0IGluIHByZXNlbmNlIG9mXG4gICAgIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIHRvIHRoZSBpbnB1dCwgbWFraW5nIHRoZSB1c2Ugb2ZcbiAgICAgW3Vuc2FmZV9zZXRdIGJlbG93IG1lbW9yeS11bnNhZmUuXG5cbiAgICAgUHJlY29uZGl0aW9uOiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBzYWZlbHkgY2FsbGVkIG9uOlxuICAgICAtIGFuIGltbXV0YWJsZSBieXRlIHNlcXVlbmNlXG4gICAgIC0gYSB1bmlxdWVseS1vd25lZCBieXRlIHNlcXVlbmNlICh0aGUgZnVuY3Rpb24gdGFrZXMgb3duZXJzaGlwKVxuXG4gICAgIEluIGVpdGhlciBjYXNlIHdlIHJldHVybiBhIHVuaXF1ZWx5LW93bmVkIGJ5dGUgc2VxdWVuY2UuXG4gICopXG4gIGxldCBuID0gcmVmIDAgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBzIC0gMSBkb1xuICAgIG4gOj0gIW4gK1xuICAgICAgKG1hdGNoIHVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgICB8ICdcXFwiJyB8ICdcXFxcJyB8ICdcXG4nIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXGInIC0+IDJcbiAgICAgICB8ICcgJyAuLiAnficgLT4gMVxuICAgICAgIHwgXyAtPiA0KVxuICBkb25lO1xuICBpZiAhbiA9IGxlbmd0aCBzIHRoZW4gc1xuICBlbHNlIGJlZ2luXG4gICAgbGV0IHMnID0gY3JlYXRlICFuIGluXG4gICAgbiA6PSAwO1xuICAgIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICAgIGJlZ2luIG1hdGNoIHVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgIHwgKCdcXFwiJyB8ICdcXFxcJykgYXMgYyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gY1xuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ24nXG4gICAgICB8ICdcXHQnIC0+XG4gICAgICAgICAgdW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7IGluY3IgbjsgdW5zYWZlX3NldCBzJyAhbiAndCdcbiAgICAgIHwgJ1xccicgLT5cbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuICdcXFxcJzsgaW5jciBuOyB1bnNhZmVfc2V0IHMnICFuICdyJ1xuICAgICAgfCAnXFxiJyAtPlxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnOyBpbmNyIG47IHVuc2FmZV9zZXQgcycgIW4gJ2InXG4gICAgICB8ICgnICcgLi4gJ34nKSBhcyBjIC0+IHVuc2FmZV9zZXQgcycgIW4gY1xuICAgICAgfCBjIC0+XG4gICAgICAgICAgbGV0IGEgPSBjaGFyX2NvZGUgYyBpblxuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gJ1xcXFwnO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyBhIC8gMTAwKSk7XG4gICAgICAgICAgaW5jciBuO1xuICAgICAgICAgIHVuc2FmZV9zZXQgcycgIW4gKGNoYXJfY2hyICg0OCArIChhIC8gMTApIG1vZCAxMCkpO1xuICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICB1bnNhZmVfc2V0IHMnICFuIChjaGFyX2NociAoNDggKyBhIG1vZCAxMCkpO1xuICAgICAgZW5kO1xuICAgICAgaW5jciBuXG4gICAgZG9uZTtcbiAgICBzJ1xuICBlbmRcblxubGV0IGVzY2FwZWQgYiA9XG4gIGxldCBiID0gY29weSBiIGluXG4gICgqIFdlIGNvcHkgb3VyIGlucHV0IHRvIG9idGFpbiBhIHVuaXF1ZWx5LW93bmVkIGJ5dGUgc2VxdWVuY2UgW2JdXG4gICAgIHRvIHNhdGlzZnkgW3Vuc2FmZV9lc2NhcGVdJ3MgcHJlY29uZGl0aW9uICopXG4gIHVuc2FmZV9lc2NhcGUgYlxuXG5sZXQgbWFwIGYgcyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgbCA9IDAgdGhlbiBzIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGNyZWF0ZSBsIGluXG4gICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IHMgaSkpIGRvbmU7XG4gICAgclxuICBlbmRcblxubGV0IG1hcGkgZiBzID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBsID0gMCB0aGVuIHMgZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG8gdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBzIGkpKSBkb25lO1xuICAgIHJcbiAgZW5kXG5cbmxldCBmb2xkX2xlZnQgZiB4IGEgPVxuICBsZXQgciA9IHJlZiB4IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lO1xuICAhclxuXG5sZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDAgZG9cbiAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICBkb25lO1xuICAhclxuXG5sZXQgZXhpc3RzIHAgcyA9XG4gIGxldCBuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgcyBpKSB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBmb3JfYWxsIHAgcyA9XG4gIGxldCBuID0gbGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBzIGkpIHRoZW4gbG9vcCAoc3VjYyBpKVxuICAgIGVsc2UgZmFsc2UgaW5cbiAgbG9vcCAwXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgcyA9IG1hcCBDaGFyLnVwcGVyY2FzZV9hc2NpaSBzXG5sZXQgbG93ZXJjYXNlX2FzY2lpIHMgPSBtYXAgQ2hhci5sb3dlcmNhc2VfYXNjaWkgc1xuXG5sZXQgYXBwbHkxIGYgcyA9XG4gIGlmIGxlbmd0aCBzID0gMCB0aGVuIHMgZWxzZSBiZWdpblxuICAgIGxldCByID0gY29weSBzIGluXG4gICAgdW5zYWZlX3NldCByIDAgKGYodW5zYWZlX2dldCBzIDApKTtcbiAgICByXG4gIGVuZFxuXG5sZXQgY2FwaXRhbGl6ZV9hc2NpaSBzID0gYXBwbHkxIENoYXIudXBwZXJjYXNlX2FzY2lpIHNcbmxldCB1bmNhcGl0YWxpemVfYXNjaWkgcyA9IGFwcGx5MSBDaGFyLmxvd2VyY2FzZV9hc2NpaSBzXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgc3RhcnRzX3dpdGggfnByZWZpeCBzID1cbiAgbGV0IGxlbl9zID0gbGVuZ3RoIHNcbiAgYW5kIGxlbl9wcmUgPSBsZW5ndGggcHJlZml4IGluXG4gIGxldCByZWMgYXV4IGkgPVxuICAgIGlmIGkgPSBsZW5fcHJlIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgdW5zYWZlX2dldCBzIGkgPD4gdW5zYWZlX2dldCBwcmVmaXggaSB0aGVuIGZhbHNlXG4gICAgZWxzZSBhdXggKGkgKyAxKVxuICBpbiBsZW5fcyA+PSBsZW5fcHJlICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgZW5kc193aXRoIH5zdWZmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fc3VmID0gbGVuZ3RoIHN1ZmZpeCBpblxuICBsZXQgZGlmZiA9IGxlbl9zIC0gbGVuX3N1ZiBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3N1ZiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyAoZGlmZiArIGkpIDw+IHVuc2FmZV9nZXQgc3VmZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gZGlmZiA+PSAwICYmIGF1eCAwXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmVjIGluZGV4X3JlYyBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSBpbmRleF9yZWMgcyBsaW0gKGkgKyAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgaW5kZXggcyBjID0gaW5kZXhfcmVjIHMgKGxlbmd0aCBzKSAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByZWMgaW5kZXhfcmVjX29wdCBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSBpbmRleF9yZWNfb3B0IHMgbGltIChpICsgMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4X29wdCBzIGMgPSBpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzKSAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCBpbmRleF9mcm9tIHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb20gLyBCeXRlcy5pbmRleF9mcm9tXCIgZWxzZVxuICBpbmRleF9yZWMgcyBsIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IGluZGV4X2Zyb21fb3B0IHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5pbmRleF9mcm9tX29wdFwiXG4gIGVsc2VcbiAgICBpbmRleF9yZWNfb3B0IHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByZWMgcmluZGV4X3JlYyBzIGkgYyA9XG4gIGlmIGkgPCAwIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gaSBlbHNlIHJpbmRleF9yZWMgcyAoaSAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXggcyBjID0gcmluZGV4X3JlYyBzIChsZW5ndGggcyAtIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbSAvIEJ5dGVzLnJpbmRleF9mcm9tXCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWMgcyBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBzdHJpbmcubWwgKilcbmxldCByZWMgcmluZGV4X3JlY19vcHQgcyBpIGMgPVxuICBpZiBpIDwgMCB0aGVuIE5vbmUgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBTb21lIGkgZWxzZSByaW5kZXhfcmVjX29wdCBzIChpIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJpbmRleF9vcHQgcyBjID0gcmluZGV4X3JlY19vcHQgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgcmluZGV4X2Zyb21fb3B0IHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tX29wdCAvIEJ5dGVzLnJpbmRleF9mcm9tX29wdFwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjX29wdCBzIGkgY1xuXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbnRhaW5zX2Zyb20gLyBCeXRlcy5jb250YWluc19mcm9tXCJcbiAgZWxzZVxuICAgIHRyeSBpZ25vcmUgKGluZGV4X3JlYyBzIGwgaSBjKTsgdHJ1ZSB3aXRoIE5vdF9mb3VuZCAtPiBmYWxzZVxuXG5cbigqIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5sZXQgY29udGFpbnMgcyBjID0gY29udGFpbnNfZnJvbSBzIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHJjb250YWluc19mcm9tIHMgaSBjID1cbiAgaWYgaSA8IDAgfHwgaSA+PSBsZW5ndGggcyB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcucmNvbnRhaW5zX2Zyb20gLyBCeXRlcy5yY29udGFpbnNfZnJvbVwiXG4gIGVsc2VcbiAgICB0cnkgaWdub3JlIChyaW5kZXhfcmVjIHMgaSBjKTsgdHJ1ZSB3aXRoIE5vdF9mb3VuZCAtPiBmYWxzZVxuXG5cbnR5cGUgdCA9IGJ5dGVzXG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmV4dGVybmFsIGVxdWFsIDogdCAtPiB0IC0+IGJvb2wgPSBcImNhbWxfYnl0ZXNfZXF1YWxcIiBbQEBub2FsbG9jXVxuXG4oKiBkdXBsaWNhdGVkIGluIHN0cmluZy5tbCAqKVxubGV0IHNwbGl0X29uX2NoYXIgc2VwIHMgPVxuICBsZXQgciA9IHJlZiBbXSBpblxuICBsZXQgaiA9IHJlZiAobGVuZ3RoIHMpIGluXG4gIGZvciBpID0gbGVuZ3RoIHMgLSAxIGRvd250byAwIGRvXG4gICAgaWYgdW5zYWZlX2dldCBzIGkgPSBzZXAgdGhlbiBiZWdpblxuICAgICAgciA6PSBzdWIgcyAoaSArIDEpICghaiAtIGkgLSAxKSA6OiAhcjtcbiAgICAgIGogOj0gaVxuICAgIGVuZFxuICBkb25lO1xuICBzdWIgcyAwICFqIDo6ICFyXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgcyA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPSBsZW5ndGggcyB0aGVuIFNlcS5OaWxcbiAgICBlbHNlXG4gICAgICBsZXQgeCA9IGdldCBzIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIHMgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICBpZiBpID0gbGVuZ3RoIHMgdGhlbiBTZXEuTmlsXG4gICAgZWxzZVxuICAgICAgbGV0IHggPSBnZXQgcyBpIGluXG4gICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgaW5cbiAgYXV4IDBcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IG4gPSByZWYgMCBpblxuICBsZXQgYnVmID0gcmVmIChtYWtlIDI1NiAnXFwwMDAnKSBpblxuICBsZXQgcmVzaXplICgpID1cbiAgICAoKiByZXNpemUgKilcbiAgICBsZXQgbmV3X2xlbiA9IEludC5taW4gKDIgKiBsZW5ndGggIWJ1ZikgU3lzLm1heF9zdHJpbmdfbGVuZ3RoIGluXG4gICAgaWYgbGVuZ3RoICFidWYgPSBuZXdfbGVuIHRoZW4gZmFpbHdpdGggXCJCeXRlcy5vZl9zZXE6IGNhbm5vdCBncm93IGJ5dGVzXCI7XG4gICAgbGV0IG5ld19idWYgPSBtYWtlIG5ld19sZW4gJ1xcMDAwJyBpblxuICAgIGJsaXQgIWJ1ZiAwIG5ld19idWYgMCAhbjtcbiAgICBidWYgOj0gbmV3X2J1ZlxuICBpblxuICBTZXEuaXRlclxuICAgIChmdW4gYyAtPlxuICAgICAgIGlmICFuID0gbGVuZ3RoICFidWYgdGhlbiByZXNpemUoKTtcbiAgICAgICBzZXQgIWJ1ZiAhbiBjO1xuICAgICAgIGluY3IgbilcbiAgICBpO1xuICBzdWIgIWJ1ZiAwICFuXG5cbigqKiB7NiBCaW5hcnkgZW5jb2RpbmcvZGVjb2Rpbmcgb2YgaW50ZWdlcnN9ICopXG5cbigqIFRoZSBnZXRfIGZ1bmN0aW9ucyBhcmUgYWxsIGR1cGxpY2F0ZWQgaW4gc3RyaW5nLm1sICopXG5cbmV4dGVybmFsIHVuc2FmZV9nZXRfdWludDggOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlYnl0ZXNfdW5zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfZ2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgPSBcIiVjYW1sX2J5dGVzX2dldDE2dVwiXG5leHRlcm5hbCBnZXRfdWludDggOiBieXRlcyAtPiBpbnQgLT4gaW50ID0gXCIlYnl0ZXNfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgZ2V0X3VpbnQxNl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQgPSBcIiVjYW1sX2J5dGVzX2dldDE2XCJcbmV4dGVybmFsIGdldF9pbnQzMl9uZSA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiA9IFwiJWNhbWxfYnl0ZXNfZ2V0MzJcIlxuZXh0ZXJuYWwgZ2V0X2ludDY0X25lIDogYnl0ZXMgLT4gaW50IC0+IGludDY0ID0gXCIlY2FtbF9ieXRlc19nZXQ2NFwiXG5cbmV4dGVybmFsIHVuc2FmZV9zZXRfdWludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV9zZXRfdWludDE2X25lIDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFwiJWNhbWxfYnl0ZXNfc2V0MTZ1XCJcbmV4dGVybmFsIHNldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuZXh0ZXJuYWwgc2V0X2ludDE2X25lIDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNlwiXG5leHRlcm5hbCBzZXRfaW50MzJfbmUgOiBieXRlcyAtPiBpbnQgLT4gaW50MzIgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0MzJcIlxuZXh0ZXJuYWwgc2V0X2ludDY0X25lIDogYnl0ZXMgLT4gaW50IC0+IGludDY0IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDY0XCJcbmV4dGVybmFsIHN3YXAxNiA6IGludCAtPiBpbnQgPSBcIiVic3dhcDE2XCJcbmV4dGVybmFsIHN3YXAzMiA6IGludDMyIC0+IGludDMyID0gXCIlYnN3YXBfaW50MzJcIlxuZXh0ZXJuYWwgc3dhcDY0IDogaW50NjQgLT4gaW50NjQgPSBcIiVic3dhcF9pbnQ2NFwiXG5cbmxldCB1bnNhZmVfZ2V0X3VpbnQxNl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhblxuICB0aGVuIHN3YXAxNiAodW5zYWZlX2dldF91aW50MTZfbmUgYiBpKVxuICBlbHNlIHVuc2FmZV9nZXRfdWludDE2X25lIGIgaVxuXG5sZXQgdW5zYWZlX2dldF91aW50MTZfYmUgYiBpID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfZ2V0X3VpbnQxNl9uZSBiIGlcbiAgZWxzZSBzd2FwMTYgKHVuc2FmZV9nZXRfdWludDE2X25lIGIgaSlcblxubGV0IGdldF9pbnQ4IGIgaSA9XG4gICgoZ2V0X3VpbnQ4IGIgaSkgbHNsIChTeXMuaW50X3NpemUgLSA4KSkgYXNyIChTeXMuaW50X3NpemUgLSA4KVxuXG5sZXQgZ2V0X3VpbnQxNl9sZSBiIGkgPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXAxNiAoZ2V0X3VpbnQxNl9uZSBiIGkpXG4gIGVsc2UgZ2V0X3VpbnQxNl9uZSBiIGlcblxubGV0IGdldF91aW50MTZfYmUgYiBpID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IChnZXRfdWludDE2X25lIGIgaSlcbiAgZWxzZSBnZXRfdWludDE2X25lIGIgaVxuXG5sZXQgZ2V0X2ludDE2X25lIGIgaSA9XG4gICgoZ2V0X3VpbnQxNl9uZSBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gMTYpKSBhc3IgKFN5cy5pbnRfc2l6ZSAtIDE2KVxuXG5sZXQgZ2V0X2ludDE2X2xlIGIgaSA9XG4gICgoZ2V0X3VpbnQxNl9sZSBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gMTYpKSBhc3IgKFN5cy5pbnRfc2l6ZSAtIDE2KVxuXG5sZXQgZ2V0X2ludDE2X2JlIGIgaSA9XG4gICgoZ2V0X3VpbnQxNl9iZSBiIGkpIGxzbCAoU3lzLmludF9zaXplIC0gMTYpKSBhc3IgKFN5cy5pbnRfc2l6ZSAtIDE2KVxuXG5sZXQgZ2V0X2ludDMyX2xlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDMyIChnZXRfaW50MzJfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQzMl9uZSBiIGlcblxubGV0IGdldF9pbnQzMl9iZSBiIGkgPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgKGdldF9pbnQzMl9uZSBiIGkpXG4gIGVsc2UgZ2V0X2ludDMyX25lIGIgaVxuXG5sZXQgZ2V0X2ludDY0X2xlIGIgaSA9XG4gIGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDY0IChnZXRfaW50NjRfbmUgYiBpKVxuICBlbHNlIGdldF9pbnQ2NF9uZSBiIGlcblxubGV0IGdldF9pbnQ2NF9iZSBiIGkgPVxuICBpZiBub3QgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwNjQgKGdldF9pbnQ2NF9uZSBiIGkpXG4gIGVsc2UgZ2V0X2ludDY0X25lIGIgaVxuXG5sZXQgdW5zYWZlX3NldF91aW50MTZfbGUgYiBpIHggPVxuICBpZiBTeXMuYmlnX2VuZGlhblxuICB0aGVuIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSAoc3dhcDE2IHgpXG4gIGVsc2UgdW5zYWZlX3NldF91aW50MTZfbmUgYiBpIHhcblxubGV0IHVuc2FmZV9zZXRfdWludDE2X2JlIGIgaSB4ID1cbiAgaWYgU3lzLmJpZ19lbmRpYW5cbiAgdGhlbiB1bnNhZmVfc2V0X3VpbnQxNl9uZSBiIGkgeCBlbHNlXG4gIHVuc2FmZV9zZXRfdWludDE2X25lIGIgaSAoc3dhcDE2IHgpXG5cbmxldCBzZXRfaW50MTZfbGUgYiBpIHggPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQxNl9uZSBiIGkgKHN3YXAxNiB4KVxuICBlbHNlIHNldF9pbnQxNl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDE2X2JlIGIgaSB4ID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDE2X25lIGIgaSAoc3dhcDE2IHgpXG4gIGVsc2Ugc2V0X2ludDE2X25lIGIgaSB4XG5cbmxldCBzZXRfaW50MzJfbGUgYiBpIHggPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQzMl9uZSBiIGkgKHN3YXAzMiB4KVxuICBlbHNlIHNldF9pbnQzMl9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDMyX2JlIGIgaSB4ID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDMyX25lIGIgaSAoc3dhcDMyIHgpXG4gIGVsc2Ugc2V0X2ludDMyX25lIGIgaSB4XG5cbmxldCBzZXRfaW50NjRfbGUgYiBpIHggPVxuICBpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHNldF9pbnQ2NF9uZSBiIGkgKHN3YXA2NCB4KVxuICBlbHNlIHNldF9pbnQ2NF9uZSBiIGkgeFxuXG5sZXQgc2V0X2ludDY0X2JlIGIgaSB4ID1cbiAgaWYgbm90IFN5cy5iaWdfZW5kaWFuIHRoZW4gc2V0X2ludDY0X25lIGIgaSAoc3dhcDY0IHgpXG4gIGVsc2Ugc2V0X2ludDY0X25lIGIgaSB4XG5cbmxldCBzZXRfdWludDggPSBzZXRfaW50OFxubGV0IHNldF91aW50MTZfbmUgPSBzZXRfaW50MTZfbmVcbmxldCBzZXRfdWludDE2X2JlID0gc2V0X2ludDE2X2JlXG5sZXQgc2V0X3VpbnQxNl9sZSA9IHNldF9pbnQxNl9sZVxuXG4oKiBVVEYgY29kZWNzIGFuZCB2YWxpZGF0aW9ucyAqKVxuXG5sZXQgZGVjX2ludmFsaWQgPSBVY2hhci51dGZfZGVjb2RlX2ludmFsaWRcbmxldFtAaW5saW5lXSBkZWNfcmV0IG4gdSA9IFVjaGFyLnV0Zl9kZWNvZGUgbiAoVWNoYXIudW5zYWZlX29mX2ludCB1KVxuXG4oKiBJbiBjYXNlIG9mIGRlY29kaW5nIGVycm9yLCBpZiB3ZSBlcnJvciBvbiB0aGUgZmlyc3QgYnl0ZSwgd2VcbiAgIGNvbnN1bWUgdGhlIGJ5dGUsIG90aGVyd2lzZSB3ZSBjb25zdW1lIHRoZSBbbl0gYnl0ZXMgcHJlY2VkaW5nXG4gICB0aGUgZXJyb3JpbmcgYnl0ZS5cblxuICAgVGhpcyBtZWFucyB0aGF0IGlmIGEgY2xpZW50IHVzZXMgZGVjb2RlcyB3aXRob3V0IGNhcmluZyBhYm91dFxuICAgdmFsaWRpdHkgaXQgbmF0dXJhbGx5IHJlcGxhY2UgYm9ndXMgZGF0YSB3aXRoIFVjaGFyLnJlcCBhY2NvcmRpbmdcbiAgIHRvIHRoZSBXSEFUV0cgRW5jb2Rpbmcgc3RhbmRhcmQuIE90aGVyIHNjaGVtZXMgYXJlIHBvc3NpYmxlIGJ5XG4gICBjb25zdWx0aW5nIHRoZSBudW1iZXIgb2YgdXNlZCBieXRlcyBvbiBpbnZhbGlkIGRlY29kZXMuIEZvciBtb3JlXG4gICBkZXRhaWxzIHNlZSBodHRwczovL2hzaXZvbmVuLmZpL2Jyb2tlbi11dGYtOC9cblxuICAgRm9yIHRoaXMgcmVhc29uIGluIFtnZXRfdXRmXzhfdWNoYXJdIHdlIGdyYWR1YWxseSBjaGVjayB0aGUgbmV4dFxuICAgYnl0ZSBpcyBhdmFpbGFibGUgcmF0aGVyIHRoYW4gZG9pbmcgaXQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXG4gICBmaXJzdCBieXRlLiBDb250cmFzdCB3aXRoIFtpc192YWxpZF91dGZfOF0uICopXG5cbigqIFVURi04ICopXG5cbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3hCRiBiID0gYiBsc3IgNiA8PiAwYjEwXG5sZXRbQGlubGluZV0gbm90X2luX3hBMF90b194QkYgYiA9IGIgbHNyIDUgPD4gMGIxMDFcbmxldFtAaW5saW5lXSBub3RfaW5feDgwX3RvX3g5RiBiID0gYiBsc3IgNSA8PiAwYjEwMFxubGV0W0BpbmxpbmVdIG5vdF9pbl94OTBfdG9feEJGIGIgPSBiIDwgMHg5MCB8fCAweEJGIDwgYlxubGV0W0BpbmxpbmVdIG5vdF9pbl94ODBfdG9feDhGIGIgPSBiIGxzciA0IDw+IDB4OFxuXG5sZXRbQGlubGluZV0gdXRmXzhfdWNoYXJfMiBiMCBiMSA9XG4gICgoYjAgbGFuZCAweDFGKSBsc2wgNikgbG9yXG4gICgoYjEgbGFuZCAweDNGKSlcblxubGV0W0BpbmxpbmVdIHV0Zl84X3VjaGFyXzMgYjAgYjEgYjIgPVxuICAoKGIwIGxhbmQgMHgwRikgbHNsIDEyKSBsb3JcbiAgKChiMSBsYW5kIDB4M0YpIGxzbCA2KSBsb3JcbiAgKChiMiBsYW5kIDB4M0YpKVxuXG5sZXRbQGlubGluZV0gdXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMyA9XG4gICgoYjAgbGFuZCAweDA3KSBsc2wgMTgpIGxvclxuICAoKGIxIGxhbmQgMHgzRikgbHNsIDEyKSBsb3JcbiAgKChiMiBsYW5kIDB4M0YpIGxzbCA2KSBsb3JcbiAgKChiMyBsYW5kIDB4M0YpKVxuXG5sZXQgZ2V0X3V0Zl84X3VjaGFyIGIgaSA9XG4gIGxldCBiMCA9IGdldF91aW50OCBiIGkgaW4gKCogcmFpc2VzIGlmIFtpXSBpcyBub3QgYSB2YWxpZCBpbmRleC4gKilcbiAgbGV0IGdldCA9IHVuc2FmZV9nZXRfdWludDggaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBtYXRjaCBDaGFyLnVuc2FmZV9jaHIgYjAgd2l0aCAoKiBTZWUgVGhlIFVuaWNvZGUgU3RhbmRhcmQsIFRhYmxlIDMuNyAqKVxuICB8ICdcXHgwMCcgLi4gJ1xceDdGJyAtPiBkZWNfcmV0IDEgYjBcbiAgfCAnXFx4QzInIC4uICdcXHhERicgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgZGVjX3JldCAyICh1dGZfOF91Y2hhcl8yIGIwIGIxKVxuICB8ICdcXHhFMCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feEEwX3RvX3hCRiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBkZWNfcmV0IDMgKHV0Zl84X3VjaGFyXzMgYjAgYjEgYjIpXG4gIHwgJ1xceEUxJyAuLiAnXFx4RUMnIHwgJ1xceEVFJyAuLiAnXFx4RUYnIC0+XG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBiMSA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjEgdGhlbiBkZWNfaW52YWxpZCAxIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgbGV0IGIyID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMiB0aGVuIGRlY19pbnZhbGlkIDIgZWxzZVxuICAgICAgZGVjX3JldCAzICh1dGZfOF91Y2hhcl8zIGIwIGIxIGIyKVxuICB8ICdcXHhFRCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3g5RiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBkZWNfcmV0IDMgKHV0Zl84X3VjaGFyXzMgYjAgYjEgYjIpXG4gIHwgJ1xceEYwJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94OTBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgbGV0IGIzID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMyB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgZGVjX3JldCA0ICh1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzKVxuICB8ICdcXHhGMScgLi4gJ1xceEYzJyAtPlxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgYjEgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIxIHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBiMiA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjIgdGhlbiBkZWNfaW52YWxpZCAyIGVsc2VcbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgbGV0IGIzID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3hCRiBiMyB0aGVuIGRlY19pbnZhbGlkIDMgZWxzZVxuICAgICAgZGVjX3JldCA0ICh1dGZfOF91Y2hhcl80IGIwIGIxIGIyIGIzKVxuICB8ICdcXHhGNCcgLT5cbiAgICAgIGxldCBpID0gaSArIDEgaW4gaWYgaSA+IG1heCB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGIxID0gZ2V0IGIgaSBpbiBpZiBub3RfaW5feDgwX3RvX3g4RiBiMSB0aGVuIGRlY19pbnZhbGlkIDEgZWxzZVxuICAgICAgbGV0IGkgPSBpICsgMSBpbiBpZiBpID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgYjIgPSBnZXQgYiBpIGluIGlmIG5vdF9pbl94ODBfdG9feEJGIGIyIHRoZW4gZGVjX2ludmFsaWQgMiBlbHNlXG4gICAgICBsZXQgaSA9IGkgKyAxIGluIGlmIGkgPiBtYXggdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGxldCBiMyA9IGdldCBiIGkgaW4gaWYgbm90X2luX3g4MF90b194QkYgYjMgdGhlbiBkZWNfaW52YWxpZCAzIGVsc2VcbiAgICAgIGRlY19yZXQgNCAodXRmXzhfdWNoYXJfNCBiMCBiMSBiMiBiMylcbiAgfCBfIC0+IGRlY19pbnZhbGlkIDFcblxubGV0IHNldF91dGZfOF91Y2hhciBiIGkgdSA9XG4gIGxldCBzZXQgPSB1bnNhZmVfc2V0X3VpbnQ4IGluXG4gIGxldCBtYXggPSBsZW5ndGggYiAtIDEgaW5cbiAgbWF0Y2ggVWNoYXIudG9faW50IHUgd2l0aFxuICB8IHUgd2hlbiB1IDwgMCAtPiBhc3NlcnQgZmFsc2VcbiAgfCB1IHdoZW4gdSA8PSAweDAwN0YgLT5cbiAgICAgIHNldF91aW50OCBiIGkgdTtcbiAgICAgIDFcbiAgfCB1IHdoZW4gdSA8PSAweDA3RkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIChzZXRfdWludDggYiBpICgweEMwIGxvciAodSBsc3IgNikpO1xuICAgICAgIHNldCBiIGxhc3QgKDB4ODAgbG9yICh1IGxhbmQgMHgzRikpO1xuICAgICAgIDIpXG4gIHwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAyIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhFMCBsb3IgKHUgbHNyIDEyKSk7XG4gICAgICAgc2V0IGIgKGkgKyAxKSAoMHg4MCBsb3IgKCh1IGxzciA2KSBsYW5kIDB4M0YpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICAzKVxuICB8IHUgd2hlbiB1IDw9IDB4MTBGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlXG4gICAgICAoc2V0X3VpbnQ4IGIgaSAoMHhGMCBsb3IgKHUgbHNyIDE4KSk7XG4gICAgICAgc2V0IGIgKGkgKyAxKSAoMHg4MCBsb3IgKCh1IGxzciAxMikgbGFuZCAweDNGKSk7XG4gICAgICAgc2V0IGIgKGkgKyAyKSAoMHg4MCBsb3IgKCh1IGxzciA2KSBsYW5kIDB4M0YpKTtcbiAgICAgICBzZXQgYiBsYXN0ICgweDgwIGxvciAodSBsYW5kIDB4M0YpKTtcbiAgICAgICA0KVxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBpc192YWxpZF91dGZfOCBiID1cbiAgbGV0IHJlYyBsb29wIG1heCBiIGkgPVxuICAgIGlmIGkgPiBtYXggdGhlbiB0cnVlIGVsc2VcbiAgICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50OCBpblxuICAgIG1hdGNoIENoYXIudW5zYWZlX2NociAoZ2V0IGIgaSkgd2l0aFxuICAgIHwgJ1xceDAwJyAuLiAnXFx4N0YnIC0+IGxvb3AgbWF4IGIgKGkgKyAxKVxuICAgIHwgJ1xceEMyJyAuLiAnXFx4REYnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDEgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEUwJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAyIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3hBMF90b194QkYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RTEnIC4uICdcXHhFQycgfCAnXFx4RUUnIC4uICdcXHhFRicgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMiBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgbGFzdClcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGxvb3AgbWF4IGIgKGxhc3QgKyAxKVxuICAgIHwgJ1xceEVEJyAtPlxuICAgICAgICBsZXQgbGFzdCA9IGkgKyAyIGluXG4gICAgICAgIGlmIGxhc3QgPiBtYXhcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194OUYgKGdldCBiIChpICsgMSkpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjAnIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heFxuICAgICAgICB8fCBub3RfaW5feDkwX3RvX3hCRiAoZ2V0IGIgKGkgKyAxKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIChpICsgMikpXG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiBsYXN0KVxuICAgICAgICB0aGVuIGZhbHNlXG4gICAgICAgIGVsc2UgbG9vcCBtYXggYiAobGFzdCArIDEpXG4gICAgfCAnXFx4RjEnIC4uICdcXHhGMycgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feEJGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAyKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8ICdcXHhGNCcgLT5cbiAgICAgICAgbGV0IGxhc3QgPSBpICsgMyBpblxuICAgICAgICBpZiBsYXN0ID4gbWF4XG4gICAgICAgIHx8IG5vdF9pbl94ODBfdG9feDhGIChnZXQgYiAoaSArIDEpKVxuICAgICAgICB8fCBub3RfaW5feDgwX3RvX3hCRiAoZ2V0IGIgKGkgKyAyKSlcbiAgICAgICAgfHwgbm90X2luX3g4MF90b194QkYgKGdldCBiIGxhc3QpXG4gICAgICAgIHRoZW4gZmFsc2VcbiAgICAgICAgZWxzZSBsb29wIG1heCBiIChsYXN0ICsgMSlcbiAgICB8IF8gLT4gZmFsc2VcbiAgaW5cbiAgbG9vcCAobGVuZ3RoIGIgLSAxKSBiIDBcblxuKCogVVRGLTE2QkUgKilcblxubGV0IGdldF91dGZfMTZiZV91Y2hhciBiIGkgPVxuICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50MTZfYmUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBpZiBpID0gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gIG1hdGNoIGdldCBiIGkgd2l0aFxuICB8IHUgd2hlbiB1IDwgMHhEODAwIHx8IHUgPiAweERGRkYgLT4gZGVjX3JldCAyIHVcbiAgfCB1IHdoZW4gdSA+IDB4REJGRiAtPiBkZWNfaW52YWxpZCAyXG4gIHwgaGkgLT4gKCogY29tYmluZSBbaGldIHdpdGggYSBsb3cgc3Vycm9nYXRlICopXG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgKG1heCAtIGkgKyAxKSBlbHNlXG4gICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgIHwgdSB3aGVuIHUgPCAweERDMDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfaW52YWxpZCAyICgqIHJldHJ5IGhlcmUgKilcbiAgICAgIHwgbG8gLT5cbiAgICAgICAgICBsZXQgdSA9ICgoKGhpIGxhbmQgMHgzRkYpIGxzbCAxMCkgbG9yIChsbyBsYW5kIDB4M0ZGKSkgKyAweDEwMDAwIGluXG4gICAgICAgICAgZGVjX3JldCA0IHVcblxubGV0IHNldF91dGZfMTZiZV91Y2hhciBiIGkgdSA9XG4gIGxldCBzZXQgPSB1bnNhZmVfc2V0X3VpbnQxNl9iZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlIChzZXQgYiBpIHU7IDIpXG4gIHwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIGxldCB1JyA9IHUgLSAweDEwMDAwIGluXG4gICAgICBsZXQgaGkgPSAoMHhEODAwIGxvciAodScgbHNyIDEwKSkgaW5cbiAgICAgIGxldCBsbyA9ICgweERDMDAgbG9yICh1JyBsYW5kIDB4M0ZGKSkgaW5cbiAgICAgIHNldCBiIGkgaGk7IHNldCBiIChpICsgMikgbG87IDRcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzE2YmUgYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50MTZfYmUgaW5cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgaWYgaSA9IG1heCB0aGVuIGZhbHNlIGVsc2VcbiAgICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgICB8IHUgd2hlbiB1IDwgMHhEODAwIHx8IHUgPiAweERGRkYgLT4gbG9vcCBtYXggYiAoaSArIDIpXG4gICAgfCB1IHdoZW4gdSA+IDB4REJGRiAtPiBmYWxzZVxuICAgIHwgX2hpIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICAgIHwgdSB3aGVuIHUgPCAweERDMDAgfHwgdSA+IDB4REZGRiAtPiBmYWxzZVxuICAgICAgICB8IF9sbyAtPiBsb29wIG1heCBiIChpICsgNClcbiAgaW5cbiAgbG9vcCAobGVuZ3RoIGIgLSAxKSBiIDBcblxuKCogVVRGLTE2TEUgKilcblxubGV0IGdldF91dGZfMTZsZV91Y2hhciBiIGkgPVxuICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50MTZfbGUgaW5cbiAgbGV0IG1heCA9IGxlbmd0aCBiIC0gMSBpblxuICBpZiBpIDwgMCB8fCBpID4gbWF4IHRoZW4gaW52YWxpZF9hcmcgXCJpbmRleCBvdXQgb2YgYm91bmRzXCIgZWxzZVxuICBpZiBpID0gbWF4IHRoZW4gZGVjX2ludmFsaWQgMSBlbHNlXG4gIG1hdGNoIGdldCBiIGkgd2l0aFxuICB8IHUgd2hlbiB1IDwgMHhEODAwIHx8IHUgPiAweERGRkYgLT4gZGVjX3JldCAyIHVcbiAgfCB1IHdoZW4gdSA+IDB4REJGRiAtPiBkZWNfaW52YWxpZCAyXG4gIHwgaGkgLT4gKCogY29tYmluZSBbaGldIHdpdGggYSBsb3cgc3Vycm9nYXRlICopXG4gICAgICBsZXQgbGFzdCA9IGkgKyAzIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gZGVjX2ludmFsaWQgKG1heCAtIGkgKyAxKSBlbHNlXG4gICAgICBtYXRjaCBnZXQgYiAoaSArIDIpIHdpdGhcbiAgICAgIHwgdSB3aGVuIHUgPCAweERDMDAgfHwgdSA+IDB4REZGRiAtPiBkZWNfaW52YWxpZCAyICgqIHJldHJ5IGhlcmUgKilcbiAgICAgIHwgbG8gLT5cbiAgICAgICAgICBsZXQgdSA9ICgoKGhpIGxhbmQgMHgzRkYpIGxzbCAxMCkgbG9yIChsbyBsYW5kIDB4M0ZGKSkgKyAweDEwMDAwIGluXG4gICAgICAgICAgZGVjX3JldCA0IHVcblxubGV0IHNldF91dGZfMTZsZV91Y2hhciBiIGkgdSA9XG4gIGxldCBzZXQgPSB1bnNhZmVfc2V0X3VpbnQxNl9sZSBpblxuICBsZXQgbWF4ID0gbGVuZ3RoIGIgLSAxIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBtYXggdGhlbiBpbnZhbGlkX2FyZyBcImluZGV4IG91dCBvZiBib3VuZHNcIiBlbHNlXG4gIG1hdGNoIFVjaGFyLnRvX2ludCB1IHdpdGhcbiAgfCB1IHdoZW4gdSA8IDAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgdSB3aGVuIHUgPD0gMHhGRkZGIC0+XG4gICAgICBsZXQgbGFzdCA9IGkgKyAxIGluXG4gICAgICBpZiBsYXN0ID4gbWF4IHRoZW4gMCBlbHNlIChzZXQgYiBpIHU7IDIpXG4gIHwgdSB3aGVuIHUgPD0gMHgxMEZGRkYgLT5cbiAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgIGlmIGxhc3QgPiBtYXggdGhlbiAwIGVsc2VcbiAgICAgIGxldCB1JyA9IHUgLSAweDEwMDAwIGluXG4gICAgICBsZXQgaGkgPSAoMHhEODAwIGxvciAodScgbHNyIDEwKSkgaW5cbiAgICAgIGxldCBsbyA9ICgweERDMDAgbG9yICh1JyBsYW5kIDB4M0ZGKSkgaW5cbiAgICAgIHNldCBiIGkgaGk7IHNldCBiIChpICsgMikgbG87IDRcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5sZXQgaXNfdmFsaWRfdXRmXzE2bGUgYiA9XG4gIGxldCByZWMgbG9vcCBtYXggYiBpID1cbiAgICBsZXQgZ2V0ID0gdW5zYWZlX2dldF91aW50MTZfbGUgaW5cbiAgICBpZiBpID4gbWF4IHRoZW4gdHJ1ZSBlbHNlXG4gICAgaWYgaSA9IG1heCB0aGVuIGZhbHNlIGVsc2VcbiAgICBtYXRjaCBnZXQgYiBpIHdpdGhcbiAgICB8IHUgd2hlbiB1IDwgMHhEODAwIHx8IHUgPiAweERGRkYgLT4gbG9vcCBtYXggYiAoaSArIDIpXG4gICAgfCB1IHdoZW4gdSA+IDB4REJGRiAtPiBmYWxzZVxuICAgIHwgX2hpIC0+XG4gICAgICAgIGxldCBsYXN0ID0gaSArIDMgaW5cbiAgICAgICAgaWYgbGFzdCA+IG1heCB0aGVuIGZhbHNlIGVsc2VcbiAgICAgICAgbWF0Y2ggZ2V0IGIgKGkgKyAyKSB3aXRoXG4gICAgICAgIHwgdSB3aGVuIHUgPCAweERDMDAgfHwgdSA+IDB4REZGRiAtPiBmYWxzZVxuICAgICAgICB8IF9sbyAtPiBsb29wIG1heCBiIChpICsgNClcbiAgaW5cbiAgbG9vcCAobGVuZ3RoIGIgLSAxKSBiIDBcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICBEYW1pZW4gRG9saWdleiwgcHJvamV0IEdhbGxpdW0sIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogU3RyaW5nIG9wZXJhdGlvbnMsIGJhc2VkIG9uIGJ5dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyAqKVxuXG4oKiBXQVJOSU5HOiBTb21lIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMuIFdoZW4geW91IG1vZGlmeSB0aGUgb25lIGluIHRoaXMgZmlsZSB5b3UgbmVlZCB0b1xuICAgbW9kaWZ5IGl0cyBkdXBsaWNhdGUgaW4gYnl0ZXMubWwuXG4gICBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBhIFwiZHVwbGljYXRlZFwiIGNvbW1lbnQgYWJvdmUgdGhlaXIgZGVmaW5pdGlvbi5cbiopXG5cbmV4dGVybmFsIGxlbmd0aCA6IHN0cmluZyAtPiBpbnQgPSBcIiVzdHJpbmdfbGVuZ3RoXCJcbmV4dGVybmFsIGdldCA6IHN0cmluZyAtPiBpbnQgLT4gY2hhciA9IFwiJXN0cmluZ19zYWZlX2dldFwiXG5leHRlcm5hbCB1bnNhZmVfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX2JsaXQgOiBzdHJpbmcgLT4gaW50IC0+ICBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCIgW0BAbm9hbGxvY11cblxubW9kdWxlIEIgPSBCeXRlc1xuXG5sZXQgYnRzID0gQi51bnNhZmVfdG9fc3RyaW5nXG5sZXQgYm9zID0gQi51bnNhZmVfb2Zfc3RyaW5nXG5cbmxldCBtYWtlIG4gYyA9XG4gIEIubWFrZSBuIGMgfD4gYnRzXG5sZXQgaW5pdCBuIGYgPVxuICBCLmluaXQgbiBmIHw+IGJ0c1xubGV0IGVtcHR5ID0gXCJcIlxubGV0IG9mX2J5dGVzID0gQi50b19zdHJpbmdcbmxldCB0b19ieXRlcyA9IEIub2Zfc3RyaW5nXG5sZXQgc3ViIHMgb2ZzIGxlbiA9XG4gIEIuc3ViIChib3Mgcykgb2ZzIGxlbiB8PiBidHNcbmxldCBibGl0ID1cbiAgQi5ibGl0X3N0cmluZ1xuXG5sZXQgZW5zdXJlX2dlICh4OmludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSBpbnZhbGlkX2FyZyBcIlN0cmluZy5jb25jYXRcIlxuXG5sZXQgcmVjIHN1bV9sZW5ndGhzIGFjYyBzZXBsZW4gPSBmdW5jdGlvblxuICB8IFtdIC0+IGFjY1xuICB8IGhkIDo6IFtdIC0+IGxlbmd0aCBoZCArIGFjY1xuICB8IGhkIDo6IHRsIC0+IHN1bV9sZW5ndGhzIChlbnN1cmVfZ2UgKGxlbmd0aCBoZCArIHNlcGxlbiArIGFjYykgYWNjKSBzZXBsZW4gdGxcblxubGV0IHJlYyB1bnNhZmVfYmxpdHMgZHN0IHBvcyBzZXAgc2VwbGVuID0gZnVuY3Rpb25cbiAgICBbXSAtPiBkc3RcbiAgfCBoZCA6OiBbXSAtPlxuICAgIHVuc2FmZV9ibGl0IGhkIDAgZHN0IHBvcyAobGVuZ3RoIGhkKTsgZHN0XG4gIHwgaGQgOjogdGwgLT5cbiAgICB1bnNhZmVfYmxpdCBoZCAwIGRzdCBwb3MgKGxlbmd0aCBoZCk7XG4gICAgdW5zYWZlX2JsaXQgc2VwIDAgZHN0IChwb3MgKyBsZW5ndGggaGQpIHNlcGxlbjtcbiAgICB1bnNhZmVfYmxpdHMgZHN0IChwb3MgKyBsZW5ndGggaGQgKyBzZXBsZW4pIHNlcCBzZXBsZW4gdGxcblxubGV0IGNvbmNhdCBzZXAgPSBmdW5jdGlvblxuICAgIFtdIC0+IFwiXCJcbiAgfCBsIC0+IGxldCBzZXBsZW4gPSBsZW5ndGggc2VwIGluIGJ0cyBAQFxuICAgICAgICAgIHVuc2FmZV9ibGl0c1xuICAgICAgICAgICAgKEIuY3JlYXRlIChzdW1fbGVuZ3RocyAwIHNlcGxlbiBsKSlcbiAgICAgICAgICAgIDAgc2VwIHNlcGxlbiBsXG5cbmxldCBjYXQgPSAoIF4gKVxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgaXRlciBmIHMgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvIGYgKHVuc2FmZV9nZXQgcyBpKSBkb25lXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpdGVyaSBmIHMgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvIGYgaSAodW5zYWZlX2dldCBzIGkpIGRvbmVcblxubGV0IG1hcCBmIHMgPVxuICBCLm1hcCBmIChib3MgcykgfD4gYnRzXG5sZXQgbWFwaSBmIHMgPVxuICBCLm1hcGkgZiAoYm9zIHMpIHw+IGJ0c1xubGV0IGZvbGRfcmlnaHQgZiB4IGEgPVxuICBCLmZvbGRfcmlnaHQgZiAoYm9zIHgpIGFcbmxldCBmb2xkX2xlZnQgZiBhIHggPVxuICBCLmZvbGRfbGVmdCBmIGEgKGJvcyB4KVxubGV0IGV4aXN0cyBmIHMgPVxuICBCLmV4aXN0cyBmIChib3MgcylcbmxldCBmb3JfYWxsIGYgcyA9XG4gIEIuZm9yX2FsbCBmIChib3MgcylcblxuKCogQmV3YXJlOiB3ZSBjYW5ub3QgdXNlIEIudHJpbSBvciBCLmVzY2FwZSBiZWNhdXNlIHRoZXkgYWx3YXlzIG1ha2UgYVxuICAgY29weSwgYnV0IFN0cmluZy5tbGkgc3BlbGxzIG91dCBzb21lIGNhc2VzIHdoZXJlIHdlIGFyZSBub3QgYWxsb3dlZFxuICAgdG8gbWFrZSBhIGNvcHkuICopXG5cbmxldCBpc19zcGFjZSA9IGZ1bmN0aW9uXG4gIHwgJyAnIHwgJ1xcMDEyJyB8ICdcXG4nIHwgJ1xccicgfCAnXFx0JyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5sZXQgdHJpbSBzID1cbiAgaWYgcyA9IFwiXCIgdGhlbiBzXG4gIGVsc2UgaWYgaXNfc3BhY2UgKHVuc2FmZV9nZXQgcyAwKSB8fCBpc19zcGFjZSAodW5zYWZlX2dldCBzIChsZW5ndGggcyAtIDEpKVxuICAgIHRoZW4gYnRzIChCLnRyaW0gKGJvcyBzKSlcbiAgZWxzZSBzXG5cbmxldCBlc2NhcGVkIHMgPVxuICBsZXQgYiA9IGJvcyBzIGluXG4gICgqIFdlIHNhdGlzZnkgW3Vuc2FmZV9lc2NhcGVdJ3MgcHJlY29uZGl0aW9uIGJ5IHBhc3NpbmcgYW5cbiAgICAgaW1tdXRhYmxlIGJ5dGUgc2VxdWVuY2UgW2JdLiAqKVxuICBidHMgKEIudW5zYWZlX2VzY2FwZSBiKVxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIGluZGV4X3JlYyBzIGxpbSBpIGMgPVxuICBpZiBpID49IGxpbSB0aGVuIHJhaXNlIE5vdF9mb3VuZCBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIGkgZWxzZSBpbmRleF9yZWMgcyBsaW0gKGkgKyAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCBpbmRleCBzIGMgPSBpbmRleF9yZWMgcyAobGVuZ3RoIHMpIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmVjIGluZGV4X3JlY19vcHQgcyBsaW0gaSBjID1cbiAgaWYgaSA+PSBsaW0gdGhlbiBOb25lIGVsc2VcbiAgaWYgdW5zYWZlX2dldCBzIGkgPSBjIHRoZW4gU29tZSBpIGVsc2UgaW5kZXhfcmVjX29wdCBzIGxpbSAoaSArIDEpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4X29wdCBzIGMgPSBpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzKSAwIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4X2Zyb20gcyBpIGMgPVxuICBsZXQgbCA9IGxlbmd0aCBzIGluXG4gIGlmIGkgPCAwIHx8IGkgPiBsIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbSAvIEJ5dGVzLmluZGV4X2Zyb21cIiBlbHNlXG4gICAgaW5kZXhfcmVjIHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IGluZGV4X2Zyb21fb3B0IHMgaSBjID1cbiAgbGV0IGwgPSBsZW5ndGggcyBpblxuICBpZiBpIDwgMCB8fCBpID4gbCB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJTdHJpbmcuaW5kZXhfZnJvbV9vcHQgLyBCeXRlcy5pbmRleF9mcm9tX29wdFwiXG4gIGVsc2VcbiAgICBpbmRleF9yZWNfb3B0IHMgbCBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjIHMgaSBjID1cbiAgaWYgaSA8IDAgdGhlbiByYWlzZSBOb3RfZm91bmQgZWxzZVxuICBpZiB1bnNhZmVfZ2V0IHMgaSA9IGMgdGhlbiBpIGVsc2UgcmluZGV4X3JlYyBzIChpIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmluZGV4IHMgYyA9IHJpbmRleF9yZWMgcyAobGVuZ3RoIHMgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfZnJvbSBzIGkgYyA9XG4gIGlmIGkgPCAtMSB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yaW5kZXhfZnJvbSAvIEJ5dGVzLnJpbmRleF9mcm9tXCJcbiAgZWxzZVxuICAgIHJpbmRleF9yZWMgcyBpIGNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHJlYyByaW5kZXhfcmVjX29wdCBzIGkgYyA9XG4gIGlmIGkgPCAwIHRoZW4gTm9uZSBlbHNlXG4gIGlmIHVuc2FmZV9nZXQgcyBpID0gYyB0aGVuIFNvbWUgaSBlbHNlIHJpbmRleF9yZWNfb3B0IHMgKGkgLSAxKSBjXG5cbigqIGR1cGxpY2F0ZWQgaW4gYnl0ZXMubWwgKilcbmxldCByaW5kZXhfb3B0IHMgYyA9IHJpbmRleF9yZWNfb3B0IHMgKGxlbmd0aCBzIC0gMSkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmluZGV4X2Zyb21fb3B0IHMgaSBjID1cbiAgaWYgaSA8IC0xIHx8IGkgPj0gbGVuZ3RoIHMgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLnJpbmRleF9mcm9tX29wdCAvIEJ5dGVzLnJpbmRleF9mcm9tX29wdFwiXG4gIGVsc2VcbiAgICByaW5kZXhfcmVjX29wdCBzIGkgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgY29udGFpbnNfZnJvbSBzIGkgYyA9XG4gIGxldCBsID0gbGVuZ3RoIHMgaW5cbiAgaWYgaSA8IDAgfHwgaSA+IGwgdGhlblxuICAgIGludmFsaWRfYXJnIFwiU3RyaW5nLmNvbnRhaW5zX2Zyb20gLyBCeXRlcy5jb250YWluc19mcm9tXCJcbiAgZWxzZVxuICAgIHRyeSBpZ25vcmUgKGluZGV4X3JlYyBzIGwgaSBjKTsgdHJ1ZSB3aXRoIE5vdF9mb3VuZCAtPiBmYWxzZVxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgY29udGFpbnMgcyBjID0gY29udGFpbnNfZnJvbSBzIDAgY1xuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgcmNvbnRhaW5zX2Zyb20gcyBpIGMgPVxuICBpZiBpIDwgMCB8fCBpID49IGxlbmd0aCBzIHRoZW5cbiAgICBpbnZhbGlkX2FyZyBcIlN0cmluZy5yY29udGFpbnNfZnJvbSAvIEJ5dGVzLnJjb250YWluc19mcm9tXCJcbiAgZWxzZVxuICAgIHRyeSBpZ25vcmUgKHJpbmRleF9yZWMgcyBpIGMpOyB0cnVlIHdpdGggTm90X2ZvdW5kIC0+IGZhbHNlXG5cbmxldCB1cHBlcmNhc2VfYXNjaWkgcyA9XG4gIEIudXBwZXJjYXNlX2FzY2lpIChib3MgcykgfD4gYnRzXG5sZXQgbG93ZXJjYXNlX2FzY2lpIHMgPVxuICBCLmxvd2VyY2FzZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xubGV0IGNhcGl0YWxpemVfYXNjaWkgcyA9XG4gIEIuY2FwaXRhbGl6ZV9hc2NpaSAoYm9zIHMpIHw+IGJ0c1xubGV0IHVuY2FwaXRhbGl6ZV9hc2NpaSBzID1cbiAgQi51bmNhcGl0YWxpemVfYXNjaWkgKGJvcyBzKSB8PiBidHNcblxuKCogZHVwbGljYXRlZCBpbiBieXRlcy5tbCAqKVxubGV0IHN0YXJ0c193aXRoIH5wcmVmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fcHJlID0gbGVuZ3RoIHByZWZpeCBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3ByZSB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyBpIDw+IHVuc2FmZV9nZXQgcHJlZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gbGVuX3MgPj0gbGVuX3ByZSAmJiBhdXggMFxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgZW5kc193aXRoIH5zdWZmaXggcyA9XG4gIGxldCBsZW5fcyA9IGxlbmd0aCBzXG4gIGFuZCBsZW5fc3VmID0gbGVuZ3RoIHN1ZmZpeCBpblxuICBsZXQgZGlmZiA9IGxlbl9zIC0gbGVuX3N1ZiBpblxuICBsZXQgcmVjIGF1eCBpID1cbiAgICBpZiBpID0gbGVuX3N1ZiB0aGVuIHRydWVcbiAgICBlbHNlIGlmIHVuc2FmZV9nZXQgcyAoZGlmZiArIGkpIDw+IHVuc2FmZV9nZXQgc3VmZml4IGkgdGhlbiBmYWxzZVxuICAgIGVsc2UgYXV4IChpICsgMSlcbiAgaW4gZGlmZiA+PSAwICYmIGF1eCAwXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoIDogaW50IC0+IHN0cmluZyAtPiBpbnQgPSBcImNhbWxfc3RyaW5nX2hhc2hcIiBbQEBub2FsbG9jXVxubGV0IGhhc2ggeCA9IHNlZWRlZF9oYXNoIDAgeFxuXG4oKiBkdXBsaWNhdGVkIGluIGJ5dGVzLm1sICopXG5sZXQgc3BsaXRfb25fY2hhciBzZXAgcyA9XG4gIGxldCByID0gcmVmIFtdIGluXG4gIGxldCBqID0gcmVmIChsZW5ndGggcykgaW5cbiAgZm9yIGkgPSBsZW5ndGggcyAtIDEgZG93bnRvIDAgZG9cbiAgICBpZiB1bnNhZmVfZ2V0IHMgaSA9IHNlcCB0aGVuIGJlZ2luXG4gICAgICByIDo9IHN1YiBzIChpICsgMSkgKCFqIC0gaSAtIDEpIDo6ICFyO1xuICAgICAgaiA6PSBpXG4gICAgZW5kXG4gIGRvbmU7XG4gIHN1YiBzIDAgIWogOjogIXJcblxudHlwZSB0ID0gc3RyaW5nXG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmV4dGVybmFsIGVxdWFsIDogc3RyaW5nIC0+IHN0cmluZyAtPiBib29sID0gXCJjYW1sX3N0cmluZ19lcXVhbFwiIFtAQG5vYWxsb2NdXG5cbigqKiB7MSBJdGVyYXRvcnN9ICopXG5cbmxldCB0b19zZXEgcyA9IGJvcyBzIHw+IEIudG9fc2VxXG5cbmxldCB0b19zZXFpIHMgPSBib3MgcyB8PiBCLnRvX3NlcWlcblxubGV0IG9mX3NlcSBnID0gQi5vZl9zZXEgZyB8PiBidHNcblxuKCogVVRGIGRlY29kZXJzIGFuZCB2YWxpZGF0b3JzICopXG5cbmxldCBnZXRfdXRmXzhfdWNoYXIgcyBpID0gQi5nZXRfdXRmXzhfdWNoYXIgKGJvcyBzKSBpXG5sZXQgaXNfdmFsaWRfdXRmXzggcyA9IEIuaXNfdmFsaWRfdXRmXzggKGJvcyBzKVxuXG5sZXQgZ2V0X3V0Zl8xNmJlX3VjaGFyIHMgaSA9IEIuZ2V0X3V0Zl8xNmJlX3VjaGFyIChib3MgcykgaVxubGV0IGlzX3ZhbGlkX3V0Zl8xNmJlIHMgPSBCLmlzX3ZhbGlkX3V0Zl8xNmJlIChib3MgcylcblxubGV0IGdldF91dGZfMTZsZV91Y2hhciBzIGkgPSBCLmdldF91dGZfMTZsZV91Y2hhciAoYm9zIHMpIGlcbmxldCBpc192YWxpZF91dGZfMTZsZSBzID0gQi5pc192YWxpZF91dGZfMTZsZSAoYm9zIHMpXG5cbigqKiB7NiBCaW5hcnkgZW5jb2RpbmcvZGVjb2Rpbmcgb2YgaW50ZWdlcnN9ICopXG5cbmV4dGVybmFsIGdldF91aW50OCA6IHN0cmluZyAtPiBpbnQgLT4gaW50ID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbmV4dGVybmFsIGdldF91aW50MTZfbmUgOiBzdHJpbmcgLT4gaW50IC0+IGludCA9IFwiJWNhbWxfc3RyaW5nX2dldDE2XCJcbmV4dGVybmFsIGdldF9pbnQzMl9uZSA6IHN0cmluZyAtPiBpbnQgLT4gaW50MzIgPSBcIiVjYW1sX3N0cmluZ19nZXQzMlwiXG5leHRlcm5hbCBnZXRfaW50NjRfbmUgOiBzdHJpbmcgLT4gaW50IC0+IGludDY0ID0gXCIlY2FtbF9zdHJpbmdfZ2V0NjRcIlxuXG5sZXQgZ2V0X2ludDggcyBpID0gQi5nZXRfaW50OCAoYm9zIHMpIGlcbmxldCBnZXRfdWludDE2X2xlIHMgaSA9IEIuZ2V0X3VpbnQxNl9sZSAoYm9zIHMpIGlcbmxldCBnZXRfdWludDE2X2JlIHMgaSA9IEIuZ2V0X3VpbnQxNl9iZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MTZfbmUgcyBpID0gQi5nZXRfaW50MTZfbmUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDE2X2xlIHMgaSA9IEIuZ2V0X2ludDE2X2xlIChib3MgcykgaVxubGV0IGdldF9pbnQxNl9iZSBzIGkgPSBCLmdldF9pbnQxNl9iZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50MzJfbGUgcyBpID0gQi5nZXRfaW50MzJfbGUgKGJvcyBzKSBpXG5sZXQgZ2V0X2ludDMyX2JlIHMgaSA9IEIuZ2V0X2ludDMyX2JlIChib3MgcykgaVxubGV0IGdldF9pbnQ2NF9sZSBzIGkgPSBCLmdldF9pbnQ2NF9sZSAoYm9zIHMpIGlcbmxldCBnZXRfaW50NjRfYmUgcyBpID0gQi5nZXRfaW50NjRfYmUgKGJvcyBzKSBpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgT0NhbWwgcHJvZ3JhbW1lcnMgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDE4IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IHVuaXQgPSAoKVxuXG5sZXQgZXF1YWwgKCkgKCkgPSB0cnVlXG5sZXQgY29tcGFyZSAoKSAoKSA9IDBcbmxldCB0b19zdHJpbmcgKCkgPSBcIigpXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBleHRlcm5fZmxhZ3MgPVxuICAgIE5vX3NoYXJpbmdcbiAgfCBDbG9zdXJlc1xuICB8IENvbXBhdF8zMlxuKCogbm90ZTogdGhpcyB0eXBlIGRlZmluaXRpb24gaXMgdXNlZCBpbiAncnVudGltZS9kZWJ1Z2dlci5jJyAqKVxuXG5leHRlcm5hbCB0b19jaGFubmVsOiBvdXRfY2hhbm5lbCAtPiAnYSAtPiBleHRlcm5fZmxhZ3MgbGlzdCAtPiB1bml0XG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlXCJcbmV4dGVybmFsIHRvX2J5dGVzOiAnYSAtPiBleHRlcm5fZmxhZ3MgbGlzdCAtPiBieXRlc1xuICAgID0gXCJjYW1sX291dHB1dF92YWx1ZV90b19ieXRlc1wiXG5leHRlcm5hbCB0b19zdHJpbmc6ICdhIC0+IGV4dGVybl9mbGFncyBsaXN0IC0+IHN0cmluZ1xuICAgID0gXCJjYW1sX291dHB1dF92YWx1ZV90b19zdHJpbmdcIlxuZXh0ZXJuYWwgdG9fYnVmZmVyX3Vuc2FmZTpcbiAgICAgIGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gZXh0ZXJuX2ZsYWdzIGxpc3QgLT4gaW50XG4gICAgPSBcImNhbWxfb3V0cHV0X3ZhbHVlX3RvX2J1ZmZlclwiXG5cbmxldCB0b19idWZmZXIgYnVmZiBvZnMgbGVuIHYgZmxhZ3MgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gQnl0ZXMubGVuZ3RoIGJ1ZmYgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIk1hcnNoYWwudG9fYnVmZmVyOiBzdWJzdHJpbmcgb3V0IG9mIGJvdW5kc1wiXG4gIGVsc2UgdG9fYnVmZmVyX3Vuc2FmZSBidWZmIG9mcyBsZW4gdiBmbGFnc1xuXG4oKiBUaGUgZnVuY3Rpb25zIGJlbG93IHVzZSBieXRlIHNlcXVlbmNlcyBhcyBpbnB1dCwgbmV2ZXIgdXNpbmcgYW55XG4gICBtdXRhdGlvbi4gSXQgbWFrZXMgc2Vuc2UgdG8gdXNlIG5vbi1tdXRhdGVkIFtieXRlc10gcmF0aGVyIHRoYW5cbiAgIFtzdHJpbmddLCBiZWNhdXNlIHdlIHJlYWxseSB3b3JrIHdpdGggc2VxdWVuY2VzIG9mIGJ5dGVzLCBub3RcbiAgIGEgdGV4dCByZXByZXNlbnRhdGlvbi5cbiopXG5cbmV4dGVybmFsIGZyb21fY2hhbm5lbDogaW5fY2hhbm5lbCAtPiAnYSA9IFwiY2FtbF9pbnB1dF92YWx1ZVwiXG5leHRlcm5hbCBmcm9tX2J5dGVzX3Vuc2FmZTogYnl0ZXMgLT4gaW50IC0+ICdhID0gXCJjYW1sX2lucHV0X3ZhbHVlX2Zyb21fYnl0ZXNcIlxuZXh0ZXJuYWwgZGF0YV9zaXplX3Vuc2FmZTogYnl0ZXMgLT4gaW50IC0+IGludCA9IFwiY2FtbF9tYXJzaGFsX2RhdGFfc2l6ZVwiXG5cbmxldCBoZWFkZXJfc2l6ZSA9IDIwXG5sZXQgZGF0YV9zaXplIGJ1ZmYgb2ZzID1cbiAgaWYgb2ZzIDwgMCB8fCBvZnMgPiBCeXRlcy5sZW5ndGggYnVmZiAtIGhlYWRlcl9zaXplXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJNYXJzaGFsLmRhdGFfc2l6ZVwiXG4gIGVsc2UgZGF0YV9zaXplX3Vuc2FmZSBidWZmIG9mc1xubGV0IHRvdGFsX3NpemUgYnVmZiBvZnMgPSBoZWFkZXJfc2l6ZSArIGRhdGFfc2l6ZSBidWZmIG9mc1xuXG5sZXQgZnJvbV9ieXRlcyBidWZmIG9mcyA9XG4gIGlmIG9mcyA8IDAgfHwgb2ZzID4gQnl0ZXMubGVuZ3RoIGJ1ZmYgLSBoZWFkZXJfc2l6ZVxuICB0aGVuIGludmFsaWRfYXJnIFwiTWFyc2hhbC5mcm9tX2J5dGVzXCJcbiAgZWxzZSBiZWdpblxuICAgIGxldCBsZW4gPSBkYXRhX3NpemVfdW5zYWZlIGJ1ZmYgb2ZzIGluXG4gICAgaWYgb2ZzID4gQnl0ZXMubGVuZ3RoIGJ1ZmYgLSAoaGVhZGVyX3NpemUgKyBsZW4pXG4gICAgdGhlbiBpbnZhbGlkX2FyZyBcIk1hcnNoYWwuZnJvbV9ieXRlc1wiXG4gICAgZWxzZSBmcm9tX2J5dGVzX3Vuc2FmZSBidWZmIG9mc1xuICBlbmRcblxubGV0IGZyb21fc3RyaW5nIGJ1ZmYgb2ZzID1cbiAgKCogQnl0ZXMudW5zYWZlX29mX3N0cmluZyBpcyBzYWZlIGhlcmUsIGFzIHRoZSBwcm9kdWNlZCBieXRlXG4gICAgIHNlcXVlbmNlIGlzIG5ldmVyIG11dGF0ZWQgKilcbiAgZnJvbV9ieXRlcyAoQnl0ZXMudW5zYWZlX29mX3N0cmluZyBidWZmKSBvZnNcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogQW4gYWxpYXMgZm9yIHRoZSB0eXBlIG9mIGFycmF5cy4gKilcbnR5cGUgJ2EgdCA9ICdhIGFycmF5XG5cbigqIEFycmF5IG9wZXJhdGlvbnMgKilcblxuZXh0ZXJuYWwgbGVuZ3RoIDogJ2EgYXJyYXkgLT4gaW50ID0gXCIlYXJyYXlfbGVuZ3RoXCJcbmV4dGVybmFsIGdldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfc2FmZV9nZXRcIlxuZXh0ZXJuYWwgc2V0OiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3NhZmVfc2V0XCJcbmV4dGVybmFsIHVuc2FmZV9nZXQ6ICdhIGFycmF5IC0+IGludCAtPiAnYSA9IFwiJWFycmF5X3Vuc2FmZV9nZXRcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVhcnJheV91bnNhZmVfc2V0XCJcbmV4dGVybmFsIG1ha2U6IGludCAtPiAnYSAtPiAnYSBhcnJheSA9IFwiY2FtbF9tYWtlX3ZlY3RcIlxuZXh0ZXJuYWwgY3JlYXRlOiBpbnQgLT4gJ2EgLT4gJ2EgYXJyYXkgPSBcImNhbWxfbWFrZV92ZWN0XCJcbmV4dGVybmFsIHVuc2FmZV9zdWIgOiAnYSBhcnJheSAtPiBpbnQgLT4gaW50IC0+ICdhIGFycmF5ID0gXCJjYW1sX2FycmF5X3N1YlwiXG5leHRlcm5hbCBhcHBlbmRfcHJpbSA6ICdhIGFycmF5IC0+ICdhIGFycmF5IC0+ICdhIGFycmF5ID0gXCJjYW1sX2FycmF5X2FwcGVuZFwiXG5leHRlcm5hbCBjb25jYXQgOiAnYSBhcnJheSBsaXN0IC0+ICdhIGFycmF5ID0gXCJjYW1sX2FycmF5X2NvbmNhdFwiXG5leHRlcm5hbCB1bnNhZmVfYmxpdCA6XG4gICdhIGFycmF5IC0+IGludCAtPiAnYSBhcnJheSAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfYXJyYXlfYmxpdFwiXG5leHRlcm5hbCB1bnNhZmVfZmlsbCA6XG4gICdhIGFycmF5IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9hcnJheV9maWxsXCJcbmV4dGVybmFsIGNyZWF0ZV9mbG9hdDogaW50IC0+IGZsb2F0IGFycmF5ID0gXCJjYW1sX21ha2VfZmxvYXRfdmVjdFwiXG5cbm1vZHVsZSBGbG9hdGFycmF5ID0gc3RydWN0XG4gIGV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiBmbG9hdGFycmF5ID0gXCJjYW1sX2Zsb2F0YXJyYXlfY3JlYXRlXCJcbiAgZXh0ZXJuYWwgbGVuZ3RoIDogZmxvYXRhcnJheSAtPiBpbnQgPSBcIiVmbG9hdGFycmF5X2xlbmd0aFwiXG4gIGV4dGVybmFsIGdldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV9zYWZlX2dldFwiXG4gIGV4dGVybmFsIHNldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV91bnNhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6IGZsb2F0YXJyYXkgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXRcbiAgICAgID0gXCIlZmxvYXRhcnJheV91bnNhZmVfc2V0XCJcbmVuZFxuXG5sZXQgaW5pdCBsIGYgPVxuICBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZVxuICBpZiBsIDwgMCB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuaW5pdFwiXG4gICgqIFNlZSAjNjU3NS4gV2UgY291bGQgYWxzbyBjaGVjayBmb3IgbWF4aW11bSBhcnJheSBzaXplLCBidXQgdGhpcyBkZXBlbmRzXG4gICAgIG9uIHdoZXRoZXIgd2UgY3JlYXRlIGEgZmxvYXQgYXJyYXkgb3IgYSByZWd1bGFyIG9uZS4uLiAqKVxuICBlbHNlXG4gICBsZXQgcmVzID0gY3JlYXRlIGwgKGYgMCkgaW5cbiAgIGZvciBpID0gMSB0byBwcmVkIGwgZG9cbiAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgZG9uZTtcbiAgIHJlc1xuXG5sZXQgbWFrZV9tYXRyaXggc3ggc3kgaW5pdCA9XG4gIGxldCByZXMgPSBjcmVhdGUgc3ggW3x8XSBpblxuICBmb3IgeCA9IDAgdG8gcHJlZCBzeCBkb1xuICAgIHVuc2FmZV9zZXQgcmVzIHggKGNyZWF0ZSBzeSBpbml0KVxuICBkb25lO1xuICByZXNcblxubGV0IGNvcHkgYSA9XG4gIGxldCBsID0gbGVuZ3RoIGEgaW4gaWYgbCA9IDAgdGhlbiBbfHxdIGVsc2UgdW5zYWZlX3N1YiBhIDAgbFxuXG5sZXQgYXBwZW5kIGExIGEyID1cbiAgbGV0IGwxID0gbGVuZ3RoIGExIGluXG4gIGlmIGwxID0gMCB0aGVuIGNvcHkgYTJcbiAgZWxzZSBpZiBsZW5ndGggYTIgPSAwIHRoZW4gdW5zYWZlX3N1YiBhMSAwIGwxXG4gIGVsc2UgYXBwZW5kX3ByaW0gYTEgYTJcblxubGV0IHN1YiBhIG9mcyBsZW4gPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIGEgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LnN1YlwiXG4gIGVsc2UgdW5zYWZlX3N1YiBhIG9mcyBsZW5cblxubGV0IGZpbGwgYSBvZnMgbGVuIHYgPVxuICBpZiBvZnMgPCAwIHx8IGxlbiA8IDAgfHwgb2ZzID4gbGVuZ3RoIGEgLSBsZW5cbiAgdGhlbiBpbnZhbGlkX2FyZyBcIkFycmF5LmZpbGxcIlxuICBlbHNlIHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2XG5cbmxldCBibGl0IGExIG9mczEgYTIgb2ZzMiBsZW4gPVxuICBpZiBsZW4gPCAwIHx8IG9mczEgPCAwIHx8IG9mczEgPiBsZW5ndGggYTEgLSBsZW5cbiAgICAgICAgICAgICB8fCBvZnMyIDwgMCB8fCBvZnMyID4gbGVuZ3RoIGEyIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5ibGl0XCJcbiAgZWxzZSB1bnNhZmVfYmxpdCBhMSBvZnMxIGEyIG9mczIgbGVuXG5cbmxldCBpdGVyIGYgYSA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZih1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG5sZXQgaXRlcjIgZiBhIGIgPVxuICBpZiBsZW5ndGggYSA8PiBsZW5ndGggYiB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJBcnJheS5pdGVyMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICBlbHNlXG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkbyBmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSBkb25lXG5cbmxldCBtYXAgZiBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpblxuICBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGwgKGYodW5zYWZlX2dldCBhIDApKSBpblxuICAgIGZvciBpID0gMSB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuICBlbmRcblxubGV0IG1hcDIgZiBhIGIgPVxuICBsZXQgbGEgPSBsZW5ndGggYSBpblxuICBsZXQgbGIgPSBsZW5ndGggYiBpblxuICBpZiBsYSA8PiBsYiB0aGVuXG4gICAgaW52YWxpZF9hcmcgXCJBcnJheS5tYXAyOiBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiXG4gIGVsc2UgYmVnaW5cbiAgICBpZiBsYSA9IDAgdGhlbiBbfHxdIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gY3JlYXRlIGxhIChmICh1bnNhZmVfZ2V0IGEgMCkgKHVuc2FmZV9nZXQgYiAwKSkgaW5cbiAgICAgIGZvciBpID0gMSB0byBsYSAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSAodW5zYWZlX2dldCBiIGkpKVxuICAgICAgZG9uZTtcbiAgICAgIHJcbiAgICBlbmRcbiAgZW5kXG5cbmxldCBpdGVyaSBmIGEgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgaSAodW5zYWZlX2dldCBhIGkpIGRvbmVcblxubGV0IG1hcGkgZiBhID1cbiAgbGV0IGwgPSBsZW5ndGggYSBpblxuICBpZiBsID0gMCB0aGVuIFt8fF0gZWxzZSBiZWdpblxuICAgIGxldCByID0gY3JlYXRlIGwgKGYgMCAodW5zYWZlX2dldCBhIDApKSBpblxuICAgIGZvciBpID0gMSB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgaSAodW5zYWZlX2dldCBhIGkpKVxuICAgIGRvbmU7XG4gICAgclxuICBlbmRcblxubGV0IHRvX2xpc3QgYSA9XG4gIGxldCByZWMgdG9saXN0IGkgcmVzID1cbiAgICBpZiBpIDwgMCB0aGVuIHJlcyBlbHNlIHRvbGlzdCAoaSAtIDEpICh1bnNhZmVfZ2V0IGEgaSA6OiByZXMpIGluXG4gIHRvbGlzdCAobGVuZ3RoIGEgLSAxKSBbXVxuXG4oKiBDYW5ub3QgdXNlIExpc3QubGVuZ3RoIGhlcmUgYmVjYXVzZSB0aGUgTGlzdCBtb2R1bGUgZGVwZW5kcyBvbiBBcnJheS4gKilcbmxldCByZWMgbGlzdF9sZW5ndGggYWNjdSA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gYWNjdVxuICB8IF86OnQgLT4gbGlzdF9sZW5ndGggKHN1Y2MgYWNjdSkgdFxuXG5sZXQgb2ZfbGlzdCA9IGZ1bmN0aW9uXG4gICAgW10gLT4gW3x8XVxuICB8IGhkOjp0bCBhcyBsIC0+XG4gICAgICBsZXQgYSA9IGNyZWF0ZSAobGlzdF9sZW5ndGggMCBsKSBoZCBpblxuICAgICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgICAgIFtdIC0+IGFcbiAgICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGkrMSkgdGwgaW5cbiAgICAgIGZpbGwgMSB0bFxuXG5sZXQgZm9sZF9sZWZ0IGYgeCBhID1cbiAgbGV0IHIgPSByZWYgeCBpblxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IGEgaSlcbiAgZG9uZTtcbiAgIXJcblxubGV0IGZvbGRfbGVmdF9tYXAgZiBhY2MgaW5wdXRfYXJyYXkgPVxuICBsZXQgbGVuID0gbGVuZ3RoIGlucHV0X2FycmF5IGluXG4gIGlmIGxlbiA9IDAgdGhlbiAoYWNjLCBbfHxdKSBlbHNlIGJlZ2luXG4gICAgbGV0IGFjYywgZWx0ID0gZiBhY2MgKHVuc2FmZV9nZXQgaW5wdXRfYXJyYXkgMCkgaW5cbiAgICBsZXQgb3V0cHV0X2FycmF5ID0gY3JlYXRlIGxlbiBlbHQgaW5cbiAgICBsZXQgYWNjID0gcmVmIGFjYyBpblxuICAgIGZvciBpID0gMSB0byBsZW4gLSAxIGRvXG4gICAgICBsZXQgYWNjJywgZWx0ID0gZiAhYWNjICh1bnNhZmVfZ2V0IGlucHV0X2FycmF5IGkpIGluXG4gICAgICBhY2MgOj0gYWNjJztcbiAgICAgIHVuc2FmZV9zZXQgb3V0cHV0X2FycmF5IGkgZWx0O1xuICAgIGRvbmU7XG4gICAgIWFjYywgb3V0cHV0X2FycmF5XG4gIGVuZFxuXG5sZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gIGxldCByID0gcmVmIHggaW5cbiAgZm9yIGkgPSBsZW5ndGggYSAtIDEgZG93bnRvIDAgZG9cbiAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICBkb25lO1xuICAhclxuXG5sZXQgZXhpc3RzIHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBmb3JfYWxsIHAgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgIGVsc2UgaWYgcCAodW5zYWZlX2dldCBhIGkpIHRoZW4gbG9vcCAoc3VjYyBpKVxuICAgIGVsc2UgZmFsc2UgaW5cbiAgbG9vcCAwXG5cbmxldCBmb3JfYWxsMiBwIGwxIGwyID1cbiAgbGV0IG4xID0gbGVuZ3RoIGwxXG4gIGFuZCBuMiA9IGxlbmd0aCBsMiBpblxuICBpZiBuMSA8PiBuMiB0aGVuIGludmFsaWRfYXJnIFwiQXJyYXkuZm9yX2FsbDJcIlxuICBlbHNlIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbjEgdGhlbiB0cnVlXG4gICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGwxIGkpICh1bnNhZmVfZ2V0IGwyIGkpIHRoZW4gbG9vcCAoc3VjYyBpKVxuICAgIGVsc2UgZmFsc2UgaW5cbiAgbG9vcCAwXG5cbmxldCBleGlzdHMyIHAgbDEgbDIgPVxuICBsZXQgbjEgPSBsZW5ndGggbDFcbiAgYW5kIG4yID0gbGVuZ3RoIGwyIGluXG4gIGlmIG4xIDw+IG4yIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5leGlzdHMyXCJcbiAgZWxzZSBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG4xIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgbDEgaSkgKHVuc2FmZV9nZXQgbDIgaSkgdGhlbiB0cnVlXG4gICAgZWxzZSBsb29wIChzdWNjIGkpIGluXG4gIGxvb3AgMFxuXG5sZXQgbWVtIHggYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYSBpKSB4ID0gMCB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBtZW1xIHggYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gZmFsc2VcbiAgICBlbHNlIGlmIHggPT0gKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICBlbHNlIGxvb3AgKHN1Y2MgaSkgaW5cbiAgbG9vcCAwXG5cbmxldCBmaW5kX29wdCBwIGEgPVxuICBsZXQgbiA9IGxlbmd0aCBhIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpID0gbiB0aGVuIE5vbmVcbiAgICBlbHNlXG4gICAgICBsZXQgeCA9IHVuc2FmZV9nZXQgYSBpIGluXG4gICAgICBpZiBwIHggdGhlbiBTb21lIHhcbiAgICAgIGVsc2UgbG9vcCAoc3VjYyBpKVxuICBpblxuICBsb29wIDBcblxubGV0IGZpbmRfbWFwIGYgYSA9XG4gIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgbGV0IHJlYyBsb29wIGkgPVxuICAgIGlmIGkgPSBuIHRoZW4gTm9uZVxuICAgIGVsc2VcbiAgICAgIG1hdGNoIGYgKHVuc2FmZV9nZXQgYSBpKSB3aXRoXG4gICAgICB8IE5vbmUgLT4gbG9vcCAoc3VjYyBpKVxuICAgICAgfCBTb21lIF8gYXMgciAtPiByXG4gIGluXG4gIGxvb3AgMFxuXG5sZXQgc3BsaXQgeCA9XG4gIGlmIHggPSBbfHxdIHRoZW4gW3x8XSwgW3x8XVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IGEwLCBiMCA9IHVuc2FmZV9nZXQgeCAwIGluXG4gICAgbGV0IG4gPSBsZW5ndGggeCBpblxuICAgIGxldCBhID0gY3JlYXRlIG4gYTAgaW5cbiAgICBsZXQgYiA9IGNyZWF0ZSBuIGIwIGluXG4gICAgZm9yIGkgPSAxIHRvIG4gLSAxIGRvXG4gICAgICBsZXQgYWksIGJpID0gdW5zYWZlX2dldCB4IGkgaW5cbiAgICAgIHVuc2FmZV9zZXQgYSBpIGFpO1xuICAgICAgdW5zYWZlX3NldCBiIGkgYmlcbiAgICBkb25lO1xuICAgIGEsIGJcbiAgZW5kXG5cbmxldCBjb21iaW5lIGEgYiA9XG4gIGxldCBuYSA9IGxlbmd0aCBhIGluXG4gIGxldCBuYiA9IGxlbmd0aCBiIGluXG4gIGlmIG5hIDw+IG5iIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5jb21iaW5lXCI7XG4gIGlmIG5hID0gMCB0aGVuIFt8fF1cbiAgZWxzZSBiZWdpblxuICAgIGxldCB4ID0gY3JlYXRlIG5hICh1bnNhZmVfZ2V0IGEgMCwgdW5zYWZlX2dldCBiIDApIGluXG4gICAgZm9yIGkgPSAxIHRvIG5hIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCB4IGkgKHVuc2FmZV9nZXQgYSBpLCB1bnNhZmVfZ2V0IGIgaSlcbiAgICBkb25lO1xuICAgIHhcbiAgZW5kXG5cbmV4Y2VwdGlvbiBCb3R0b20gb2YgaW50XG5sZXQgc29ydCBjbXAgYSA9XG4gIGxldCBtYXhzb24gbCBpID1cbiAgICBsZXQgaTMxID0gaStpK2krMSBpblxuICAgIGxldCB4ID0gcmVmIGkzMSBpblxuICAgIGlmIGkzMSsyIDwgbCB0aGVuIGJlZ2luXG4gICAgICBpZiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMCB0aGVuIHggOj0gaTMxKzE7XG4gICAgICBpZiBjbXAgKGdldCBhICF4KSAoZ2V0IGEgKGkzMSsyKSkgPCAwIHRoZW4geCA6PSBpMzErMjtcbiAgICAgICF4XG4gICAgZW5kIGVsc2VcbiAgICAgIGlmIGkzMSsxIDwgbCAmJiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMFxuICAgICAgdGhlbiBpMzErMVxuICAgICAgZWxzZSBpZiBpMzEgPCBsIHRoZW4gaTMxIGVsc2UgcmFpc2UgKEJvdHRvbSBpKVxuICBpblxuICBsZXQgcmVjIHRyaWNrbGVkb3duIGwgaSBlID1cbiAgICBsZXQgaiA9IG1heHNvbiBsIGkgaW5cbiAgICBpZiBjbXAgKGdldCBhIGopIGUgPiAwIHRoZW4gYmVnaW5cbiAgICAgIHNldCBhIGkgKGdldCBhIGopO1xuICAgICAgdHJpY2tsZWRvd24gbCBqIGU7XG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgIHNldCBhIGkgZTtcbiAgICBlbmQ7XG4gIGluXG4gIGxldCB0cmlja2xlIGwgaSBlID0gdHJ5IHRyaWNrbGVkb3duIGwgaSBlIHdpdGggQm90dG9tIGkgLT4gc2V0IGEgaSBlIGluXG4gIGxldCByZWMgYnViYmxlZG93biBsIGkgPVxuICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgIHNldCBhIGkgKGdldCBhIGopO1xuICAgIGJ1YmJsZWRvd24gbCBqXG4gIGluXG4gIGxldCBidWJibGUgbCBpID0gdHJ5IGJ1YmJsZWRvd24gbCBpIHdpdGggQm90dG9tIGkgLT4gaSBpblxuICBsZXQgcmVjIHRyaWNrbGV1cCBpIGUgPVxuICAgIGxldCBmYXRoZXIgPSAoaSAtIDEpIC8gMyBpblxuICAgIGFzc2VydCAoaSA8PiBmYXRoZXIpO1xuICAgIGlmIGNtcCAoZ2V0IGEgZmF0aGVyKSBlIDwgMCB0aGVuIGJlZ2luXG4gICAgICBzZXQgYSBpIChnZXQgYSBmYXRoZXIpO1xuICAgICAgaWYgZmF0aGVyID4gMCB0aGVuIHRyaWNrbGV1cCBmYXRoZXIgZSBlbHNlIHNldCBhIDAgZTtcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgc2V0IGEgaSBlO1xuICAgIGVuZDtcbiAgaW5cbiAgbGV0IGwgPSBsZW5ndGggYSBpblxuICBmb3IgaSA9IChsICsgMSkgLyAzIC0gMSBkb3dudG8gMCBkbyB0cmlja2xlIGwgaSAoZ2V0IGEgaSk7IGRvbmU7XG4gIGZvciBpID0gbCAtIDEgZG93bnRvIDIgZG9cbiAgICBsZXQgZSA9IChnZXQgYSBpKSBpblxuICAgIHNldCBhIGkgKGdldCBhIDApO1xuICAgIHRyaWNrbGV1cCAoYnViYmxlIGkgMCkgZTtcbiAgZG9uZTtcbiAgaWYgbCA+IDEgdGhlbiAobGV0IGUgPSAoZ2V0IGEgMSkgaW4gc2V0IGEgMSAoZ2V0IGEgMCk7IHNldCBhIDAgZSlcblxuXG5sZXQgY3V0b2ZmID0gNVxubGV0IHN0YWJsZV9zb3J0IGNtcCBhID1cbiAgbGV0IG1lcmdlIHNyYzFvZnMgc3JjMWxlbiBzcmMyIHNyYzJvZnMgc3JjMmxlbiBkc3QgZHN0b2ZzID1cbiAgICBsZXQgc3JjMXIgPSBzcmMxb2ZzICsgc3JjMWxlbiBhbmQgc3JjMnIgPSBzcmMyb2ZzICsgc3JjMmxlbiBpblxuICAgIGxldCByZWMgbG9vcCBpMSBzMSBpMiBzMiBkID1cbiAgICAgIGlmIGNtcCBzMSBzMiA8PSAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGRzdCBkIHMxO1xuICAgICAgICBsZXQgaTEgPSBpMSArIDEgaW5cbiAgICAgICAgaWYgaTEgPCBzcmMxciB0aGVuXG4gICAgICAgICAgbG9vcCBpMSAoZ2V0IGEgaTEpIGkyIHMyIChkICsgMSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJsaXQgc3JjMiBpMiBkc3QgKGQgKyAxKSAoc3JjMnIgLSBpMilcbiAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgIHNldCBkc3QgZCBzMjtcbiAgICAgICAgbGV0IGkyID0gaTIgKyAxIGluXG4gICAgICAgIGlmIGkyIDwgc3JjMnIgdGhlblxuICAgICAgICAgIGxvb3AgaTEgczEgaTIgKGdldCBzcmMyIGkyKSAoZCArIDEpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBibGl0IGEgaTEgZHN0IChkICsgMSkgKHNyYzFyIC0gaTEpXG4gICAgICBlbmRcbiAgICBpbiBsb29wIHNyYzFvZnMgKGdldCBhIHNyYzFvZnMpIHNyYzJvZnMgKGdldCBzcmMyIHNyYzJvZnMpIGRzdG9mcztcbiAgaW5cbiAgbGV0IGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuID1cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IGUgPSAoZ2V0IGEgKHNyY29mcyArIGkpKSBpblxuICAgICAgbGV0IGogPSByZWYgKGRzdG9mcyArIGkgLSAxKSBpblxuICAgICAgd2hpbGUgKCFqID49IGRzdG9mcyAmJiBjbXAgKGdldCBkc3QgIWopIGUgPiAwKSBkb1xuICAgICAgICBzZXQgZHN0ICghaiArIDEpIChnZXQgZHN0ICFqKTtcbiAgICAgICAgZGVjciBqO1xuICAgICAgZG9uZTtcbiAgICAgIHNldCBkc3QgKCFqICsgMSkgZTtcbiAgICBkb25lO1xuICBpblxuICBsZXQgcmVjIHNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgIGlmIGxlbiA8PSBjdXRvZmYgdGhlbiBpc29ydHRvIHNyY29mcyBkc3QgZHN0b2ZzIGxlbiBlbHNlIGJlZ2luXG4gICAgICBsZXQgbDEgPSBsZW4gLyAyIGluXG4gICAgICBsZXQgbDIgPSBsZW4gLSBsMSBpblxuICAgICAgc29ydHRvIChzcmNvZnMgKyBsMSkgZHN0IChkc3RvZnMgKyBsMSkgbDI7XG4gICAgICBzb3J0dG8gc3Jjb2ZzIGEgKHNyY29mcyArIGwyKSBsMTtcbiAgICAgIG1lcmdlIChzcmNvZnMgKyBsMikgbDEgZHN0IChkc3RvZnMgKyBsMSkgbDIgZHN0IGRzdG9mcztcbiAgICBlbmQ7XG4gIGluXG4gIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgaWYgbCA8PSBjdXRvZmYgdGhlbiBpc29ydHRvIDAgYSAwIGwgZWxzZSBiZWdpblxuICAgIGxldCBsMSA9IGwgLyAyIGluXG4gICAgbGV0IGwyID0gbCAtIGwxIGluXG4gICAgbGV0IHQgPSBtYWtlIGwyIChnZXQgYSAwKSBpblxuICAgIHNvcnR0byBsMSB0IDAgbDI7XG4gICAgc29ydHRvIDAgYSBsMiBsMTtcbiAgICBtZXJnZSBsMiBsMSB0IDAgbDIgYSAwO1xuICBlbmRcblxuXG5sZXQgZmFzdF9zb3J0ID0gc3RhYmxlX3NvcnRcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBhID1cbiAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgdGhlblxuICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgICBlbHNlIFNlcS5OaWxcbiAgaW5cbiAgYXV4IDBcblxubGV0IHRvX3NlcWkgYSA9XG4gIGxldCByZWMgYXV4IGkgKCkgPVxuICAgIGlmIGkgPCBsZW5ndGggYVxuICAgIHRoZW5cbiAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICAgIGVsc2UgU2VxLk5pbFxuICBpblxuICBhdXggMFxuXG5sZXQgb2ZfcmV2X2xpc3QgPSBmdW5jdGlvblxuICAgIFtdIC0+IFt8fF1cbiAgfCBoZDo6dGwgYXMgbCAtPlxuICAgICAgbGV0IGxlbiA9IGxpc3RfbGVuZ3RoIDAgbCBpblxuICAgICAgbGV0IGEgPSBjcmVhdGUgbGVuIGhkIGluXG4gICAgICBsZXQgcmVjIGZpbGwgaSA9IGZ1bmN0aW9uXG4gICAgICAgICAgW10gLT4gYVxuICAgICAgICB8IGhkOjp0bCAtPiB1bnNhZmVfc2V0IGEgaSBoZDsgZmlsbCAoaS0xKSB0bFxuICAgICAgaW5cbiAgICAgIGZpbGwgKGxlbi0yKSB0bFxuXG5sZXQgb2Zfc2VxIGkgPVxuICBsZXQgbCA9IFNlcS5mb2xkX2xlZnQgKGZ1biBhY2MgeCAtPiB4OjphY2MpIFtdIGkgaW5cbiAgb2ZfcmV2X2xpc3QgbFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICBOaWNvbGFzIE9qZWRhIEJhciwgTGV4aUZpICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAxOCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5leHRlcm5hbCBuZWcgOiBmbG9hdCAtPiBmbG9hdCA9IFwiJW5lZ2Zsb2F0XCJcbmV4dGVybmFsIGFkZCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWRkZmxvYXRcIlxuZXh0ZXJuYWwgc3ViIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcIiVzdWJmbG9hdFwiXG5leHRlcm5hbCBtdWwgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiJW11bGZsb2F0XCJcbmV4dGVybmFsIGRpdiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCIlZGl2ZmxvYXRcIlxuZXh0ZXJuYWwgcmVtIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZm1vZF9mbG9hdFwiIFwiZm1vZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbWEgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbWFfZmxvYXRcIiBcImNhbWxfZm1hXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFicyA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlYWJzZmxvYXRcIlxuXG5sZXQgemVybyA9IDAuXG5sZXQgb25lID0gMS5cbmxldCBtaW51c19vbmUgPSAtMS5cbmxldCBpbmZpbml0eSA9IFN0ZGxpYi5pbmZpbml0eVxubGV0IG5lZ19pbmZpbml0eSA9IFN0ZGxpYi5uZWdfaW5maW5pdHlcbmxldCBuYW4gPSBTdGRsaWIubmFuXG5sZXQgaXNfZmluaXRlICh4OiBmbG9hdCkgPSB4IC0uIHggPSAwLlxubGV0IGlzX2luZmluaXRlICh4OiBmbG9hdCkgPSAxLiAvLiB4ID0gMC5cbmxldCBpc19uYW4gKHg6IGZsb2F0KSA9IHggPD4geFxuXG5sZXQgcGkgPSAweDEuOTIxZmI1NDQ0MmQxOHArMVxubGV0IG1heF9mbG9hdCA9IFN0ZGxpYi5tYXhfZmxvYXRcbmxldCBtaW5fZmxvYXQgPSBTdGRsaWIubWluX2Zsb2F0XG5sZXQgZXBzaWxvbiA9IFN0ZGxpYi5lcHNpbG9uX2Zsb2F0XG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdG9maW50XCJcbmV4dGVybmFsIHRvX2ludCA6IGZsb2F0IC0+IGludCA9IFwiJWludG9mZmxvYXRcIlxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGZsb2F0ID0gXCJjYW1sX2Zsb2F0X29mX3N0cmluZ1wiXG5sZXQgb2Zfc3RyaW5nX29wdCA9IFN0ZGxpYi5mbG9hdF9vZl9zdHJpbmdfb3B0XG5sZXQgdG9fc3RyaW5nID0gU3RkbGliLnN0cmluZ19vZl9mbG9hdFxudHlwZSBmcGNsYXNzID0gU3RkbGliLmZwY2xhc3MgPVxuICAgIEZQX25vcm1hbFxuICB8IEZQX3N1Ym5vcm1hbFxuICB8IEZQX3plcm9cbiAgfCBGUF9pbmZpbml0ZVxuICB8IEZQX25hblxuZXh0ZXJuYWwgY2xhc3NpZnlfZmxvYXQgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gZnBjbGFzcyA9XG4gIFwiY2FtbF9jbGFzc2lmeV9mbG9hdFwiIFwiY2FtbF9jbGFzc2lmeV9mbG9hdF91bmJveGVkXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIHBvdyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Bvd2VyX2Zsb2F0XCIgXCJwb3dcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgc3FydCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NxcnRfZmxvYXRcIiBcInNxcnRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2JydCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NicnRfZmxvYXRcIiBcImNhbWxfY2JydFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBfZmxvYXRcIiBcImV4cFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBleHAyIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwMl9mbG9hdFwiIFwiY2FtbF9leHAyXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzEwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMTBfZmxvYXRcIiBcImxvZzEwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGxvZzIgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cyX2Zsb2F0XCIgXCJjYW1sX2xvZzJcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBsb2cxcCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZzFwX2Zsb2F0XCIgXCJjYW1sX2xvZzFwXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Nvc19mbG9hdFwiIFwiY29zXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Npbl9mbG9hdFwiIFwic2luXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Rhbl9mbG9hdFwiIFwidGFuXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hY29zX2Zsb2F0XCIgXCJhY29zXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luX2Zsb2F0XCIgXCJhc2luXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hdGFuX2Zsb2F0XCIgXCJhdGFuXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbjJfZmxvYXRcIiBcImF0YW4yXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGh5cG90IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgICAgICAgICAgICAgID0gXCJjYW1sX2h5cG90X2Zsb2F0XCIgXCJjYW1sX2h5cG90XCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGNvc2ggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9jb3NoX2Zsb2F0XCIgXCJjb3NoXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9zaW5oX2Zsb2F0XCIgXCJzaW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5oX2Zsb2F0XCIgXCJ0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGFjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYWNvc2hfZmxvYXRcIiBcImNhbWxfYWNvc2hcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgYXNpbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luaF9mbG9hdFwiIFwiY2FtbF9hc2luaFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBhdGFuaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW5oX2Zsb2F0XCIgXCJjYW1sX2F0YW5oXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGVyZiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2VyZl9mbG9hdFwiIFwiY2FtbF9lcmZcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZXJmYyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2VyZmNfZmxvYXRcIiBcImNhbWxfZXJmY1wiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCB0cnVuYyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3RydW5jX2Zsb2F0XCIgXCJjYW1sX3RydW5jXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHJvdW5kIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfcm91bmRfZmxvYXRcIiBcImNhbWxfcm91bmRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgY2VpbCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NlaWxfZmxvYXRcIiBcImNlaWxcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgZmxvb3IgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9mbG9vcl9mbG9hdFwiIFwiZmxvb3JcIlxuW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxubGV0IGlzX2ludGVnZXIgeCA9IHggPSB0cnVuYyB4ICYmIGlzX2Zpbml0ZSB4XG5cbmV4dGVybmFsIG5leHRfYWZ0ZXIgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdFxuICA9IFwiY2FtbF9uZXh0YWZ0ZXJfZmxvYXRcIiBcImNhbWxfbmV4dGFmdGVyXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxubGV0IHN1Y2MgeCA9IG5leHRfYWZ0ZXIgeCBpbmZpbml0eVxubGV0IHByZWQgeCA9IG5leHRfYWZ0ZXIgeCBuZWdfaW5maW5pdHlcblxuZXh0ZXJuYWwgY29weV9zaWduIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXRcbiAgICAgICAgICAgICAgICAgID0gXCJjYW1sX2NvcHlzaWduX2Zsb2F0XCIgXCJjYW1sX2NvcHlzaWduXCJcbiAgICAgICAgICAgICAgICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBzaWduX2JpdCA6IChmbG9hdCBbQHVuYm94ZWRdKSAtPiBib29sXG4gID0gXCJjYW1sX3NpZ25iaXRfZmxvYXRcIiBcImNhbWxfc2lnbmJpdFwiIFtAQG5vYWxsb2NdXG5cbmV4dGVybmFsIGZyZXhwIDogZmxvYXQgLT4gZmxvYXQgKiBpbnQgPSBcImNhbWxfZnJleHBfZmxvYXRcIlxuZXh0ZXJuYWwgbGRleHAgOiAoZmxvYXQgW0B1bmJveGVkXSkgLT4gKGludCBbQHVudGFnZ2VkXSkgLT4gKGZsb2F0IFtAdW5ib3hlZF0pID1cbiAgXCJjYW1sX2xkZXhwX2Zsb2F0XCIgXCJjYW1sX2xkZXhwX2Zsb2F0X3VuYm94ZWRcIiBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgbW9kZiA6IGZsb2F0IC0+IGZsb2F0ICogZmxvYXQgPSBcImNhbWxfbW9kZl9mbG9hdFwiXG50eXBlIHQgPSBmbG9hdFxuZXh0ZXJuYWwgY29tcGFyZSA6IGZsb2F0IC0+IGZsb2F0IC0+IGludCA9IFwiJWNvbXBhcmVcIlxubGV0IGVxdWFsIHggeSA9IGNvbXBhcmUgeCB5ID0gMFxuXG5sZXRbQGlubGluZV0gbWluICh4OiBmbG9hdCkgKHk6IGZsb2F0KSA9XG4gIGlmIHkgPiB4IHx8IChub3Qoc2lnbl9iaXQgeSkgJiYgc2lnbl9iaXQgeCkgdGhlblxuICAgIGlmIGlzX25hbiB5IHRoZW4geSBlbHNlIHhcbiAgZWxzZSBpZiBpc19uYW4geCB0aGVuIHggZWxzZSB5XG5cbmxldFtAaW5saW5lXSBtYXggKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuXG4gICAgaWYgaXNfbmFuIHggdGhlbiB4IGVsc2UgeVxuICBlbHNlIGlmIGlzX25hbiB5IHRoZW4geSBlbHNlIHhcblxubGV0W0BpbmxpbmVdIG1pbl9tYXggKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgaXNfbmFuIHggfHwgaXNfbmFuIHkgdGhlbiAobmFuLCBuYW4pXG4gIGVsc2UgaWYgeSA+IHggfHwgKG5vdChzaWduX2JpdCB5KSAmJiBzaWduX2JpdCB4KSB0aGVuICh4LCB5KSBlbHNlICh5LCB4KVxuXG5sZXRbQGlubGluZV0gbWluX251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSB4XG4gIGVsc2UgaWYgaXNfbmFuIHkgdGhlbiB4IGVsc2UgeVxuXG5sZXRbQGlubGluZV0gbWF4X251bSAoeDogZmxvYXQpICh5OiBmbG9hdCkgPVxuICBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW5cbiAgICBpZiBpc19uYW4geSB0aGVuIHggZWxzZSB5XG4gIGVsc2UgaWYgaXNfbmFuIHggdGhlbiB5IGVsc2UgeFxuXG5sZXRbQGlubGluZV0gbWluX21heF9udW0gKHg6IGZsb2F0KSAoeTogZmxvYXQpID1cbiAgaWYgaXNfbmFuIHggdGhlbiAoeSx5KVxuICBlbHNlIGlmIGlzX25hbiB5IHRoZW4gKHgseClcbiAgZWxzZSBpZiB5ID4geCB8fCAobm90KHNpZ25fYml0IHkpICYmIHNpZ25fYml0IHgpIHRoZW4gKHgseSkgZWxzZSAoeSx4KVxuXG5leHRlcm5hbCBzZWVkZWRfaGFzaF9wYXJhbSA6IGludCAtPiBpbnQgLT4gaW50IC0+IGZsb2F0IC0+IGludFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcImNhbWxfaGFzaFwiIFtAQG5vYWxsb2NdXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxuXG5tb2R1bGUgQXJyYXkgPSBzdHJ1Y3RcblxuICB0eXBlIHQgPSBmbG9hdGFycmF5XG5cbiAgZXh0ZXJuYWwgbGVuZ3RoIDogdCAtPiBpbnQgPSBcIiVmbG9hdGFycmF5X2xlbmd0aFwiXG4gIGV4dGVybmFsIGdldCA6IHQgLT4gaW50IC0+IGZsb2F0ID0gXCIlZmxvYXRhcnJheV9zYWZlX2dldFwiXG4gIGV4dGVybmFsIHNldCA6IHQgLT4gaW50IC0+IGZsb2F0IC0+IHVuaXQgPSBcIiVmbG9hdGFycmF5X3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgY3JlYXRlIDogaW50IC0+IHQgPSBcImNhbWxfZmxvYXRhcnJheV9jcmVhdGVcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgPSBcIiVmbG9hdGFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogdCAtPiBpbnQgLT4gZmxvYXQgLT4gdW5pdCA9IFwiJWZsb2F0YXJyYXlfdW5zYWZlX3NldFwiXG5cbiAgbGV0IHVuc2FmZV9maWxsIGEgb2ZzIGxlbiB2ID1cbiAgICBmb3IgaSA9IG9mcyB0byBvZnMgKyBsZW4gLSAxIGRvIHVuc2FmZV9zZXQgYSBpIHYgZG9uZVxuXG4gIGV4dGVybmFsIHVuc2FmZV9ibGl0OiB0IC0+IGludCAtPiB0IC0+IGludCAtPiBpbnQgLT4gdW5pdCA9XG4gICAgXCJjYW1sX2Zsb2F0YXJyYXlfYmxpdFwiIFtAQG5vYWxsb2NdXG5cbiAgbGV0IGNoZWNrIGEgb2ZzIGxlbiBtc2cgPVxuICAgIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgKyBsZW4gPCAwIHx8IG9mcyArIGxlbiA+IGxlbmd0aCBhIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIG1zZ1xuXG4gIGxldCBtYWtlIG4gdiA9XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSBuIGluXG4gICAgdW5zYWZlX2ZpbGwgcmVzdWx0IDAgbiB2O1xuICAgIHJlc3VsdFxuXG4gIGxldCBpbml0IGwgZiA9XG4gICAgaWYgbCA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIkZsb2F0LkFycmF5LmluaXRcIlxuICAgIGVsc2VcbiAgICAgIGxldCByZXMgPSBjcmVhdGUgbCBpblxuICAgICAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgcmVzIGkgKGYgaSlcbiAgICAgIGRvbmU7XG4gICAgICByZXNcblxuICBsZXQgYXBwZW5kIGExIGEyID1cbiAgICBsZXQgbDEgPSBsZW5ndGggYTEgaW5cbiAgICBsZXQgbDIgPSBsZW5ndGggYTIgaW5cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIChsMSArIGwyKSBpblxuICAgIHVuc2FmZV9ibGl0IGExIDAgcmVzdWx0IDAgbDE7XG4gICAgdW5zYWZlX2JsaXQgYTIgMCByZXN1bHQgbDEgbDI7XG4gICAgcmVzdWx0XG5cbiAgKCogbmV4dCAzIGZ1bmN0aW9uczogbW9kaWZpZWQgY29weSBvZiBjb2RlIGZyb20gc3RyaW5nLm1sICopXG4gIGxldCBlbnN1cmVfZ2UgKHg6aW50KSB5ID1cbiAgICBpZiB4ID49IHkgdGhlbiB4IGVsc2UgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5jb25jYXRcIlxuXG4gIGxldCByZWMgc3VtX2xlbmd0aHMgYWNjID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY1xuICAgIHwgaGQgOjogdGwgLT4gc3VtX2xlbmd0aHMgKGVuc3VyZV9nZSAobGVuZ3RoIGhkICsgYWNjKSBhY2MpIHRsXG5cbiAgbGV0IGNvbmNhdCBsID1cbiAgICBsZXQgbGVuID0gc3VtX2xlbmd0aHMgMCBsIGluXG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSBsZW4gaW5cbiAgICBsZXQgcmVjIGxvb3AgbCBpID1cbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBbXSAtPiBhc3NlcnQgKGkgPSBsZW4pXG4gICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIGxldCBobGVuID0gbGVuZ3RoIGhkIGluXG4gICAgICAgIHVuc2FmZV9ibGl0IGhkIDAgcmVzdWx0IGkgaGxlbjtcbiAgICAgICAgbG9vcCB0bCAoaSArIGhsZW4pXG4gICAgaW5cbiAgICBsb29wIGwgMDtcbiAgICByZXN1bHRcblxuICBsZXQgc3ViIGEgb2ZzIGxlbiA9XG4gICAgY2hlY2sgYSBvZnMgbGVuIFwiRmxvYXQuQXJyYXkuc3ViXCI7XG4gICAgbGV0IHJlc3VsdCA9IGNyZWF0ZSBsZW4gaW5cbiAgICB1bnNhZmVfYmxpdCBhIG9mcyByZXN1bHQgMCBsZW47XG4gICAgcmVzdWx0XG5cbiAgbGV0IGNvcHkgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByZXN1bHQgPSBjcmVhdGUgbCBpblxuICAgIHVuc2FmZV9ibGl0IGEgMCByZXN1bHQgMCBsO1xuICAgIHJlc3VsdFxuXG4gIGxldCBmaWxsIGEgb2ZzIGxlbiB2ID1cbiAgICBjaGVjayBhIG9mcyBsZW4gXCJGbG9hdC5BcnJheS5maWxsXCI7XG4gICAgdW5zYWZlX2ZpbGwgYSBvZnMgbGVuIHZcblxuICBsZXQgYmxpdCBzcmMgc29mcyBkc3QgZG9mcyBsZW4gPVxuICAgIGNoZWNrIHNyYyBzb2ZzIGxlbiBcIkZsb2F0LmFycmF5LmJsaXRcIjtcbiAgICBjaGVjayBkc3QgZG9mcyBsZW4gXCJGbG9hdC5hcnJheS5ibGl0XCI7XG4gICAgdW5zYWZlX2JsaXQgc3JjIHNvZnMgZHN0IGRvZnMgbGVuXG5cbiAgbGV0IHRvX2xpc3QgYSA9XG4gICAgTGlzdC5pbml0IChsZW5ndGggYSkgKHVuc2FmZV9nZXQgYSlcblxuICBsZXQgb2ZfbGlzdCBsID1cbiAgICBsZXQgcmVzdWx0ID0gY3JlYXRlIChMaXN0Lmxlbmd0aCBsKSBpblxuICAgIGxldCByZWMgZmlsbCBpIGwgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IFtdIC0+IHJlc3VsdFxuICAgICAgfCBoIDo6IHQgLT4gdW5zYWZlX3NldCByZXN1bHQgaSBoOyBmaWxsIChpICsgMSkgdFxuICAgIGluXG4gICAgZmlsbCAwIGxcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGl0ZXIgZiBhID1cbiAgICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvIGYgKHVuc2FmZV9nZXQgYSBpKSBkb25lXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyMiBmIGEgYiA9XG4gICAgaWYgbGVuZ3RoIGEgPD4gbGVuZ3RoIGIgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJGbG9hdC5BcnJheS5pdGVyMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICAgIGVsc2VcbiAgICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiAodW5zYWZlX2dldCBhIGkpICh1bnNhZmVfZ2V0IGIgaSkgZG9uZVxuXG4gIGxldCBtYXAgZiBhID1cbiAgICBsZXQgbCA9IGxlbmd0aCBhIGluXG4gICAgbGV0IHIgPSBjcmVhdGUgbCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcblxuICBsZXQgbWFwMiBmIGEgYiA9XG4gICAgbGV0IGxhID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgbGIgPSBsZW5ndGggYiBpblxuICAgIGlmIGxhIDw+IGxiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiRmxvYXQuQXJyYXkubWFwMjogYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIlxuICAgIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gY3JlYXRlIGxhIGluXG4gICAgICBmb3IgaSA9IDAgdG8gbGEgLSAxIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgciBpIChmICh1bnNhZmVfZ2V0IGEgaSkgKHVuc2FmZV9nZXQgYiBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBpdGVyaSBmIGEgPVxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG8gZiBpICh1bnNhZmVfZ2V0IGEgaSkgZG9uZVxuXG4gIGxldCBtYXBpIGYgYSA9XG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIGkgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICBkb25lO1xuICAgIHJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGZvbGRfbGVmdCBmIHggYSA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCBhIGkpXG4gICAgZG9uZTtcbiAgICAhclxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgZm9sZF9yaWdodCBmIGEgeCA9XG4gICAgbGV0IHIgPSByZWYgeCBpblxuICAgIGZvciBpID0gbGVuZ3RoIGEgLSAxIGRvd250byAwIGRvXG4gICAgICByIDo9IGYgKHVuc2FmZV9nZXQgYSBpKSAhclxuICAgIGRvbmU7XG4gICAgIXJcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IGV4aXN0cyBwIGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHAgKHVuc2FmZV9nZXQgYSBpKSB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpIGluXG4gICAgbG9vcCAwXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBmb3JfYWxsIHAgYSA9XG4gICAgbGV0IG4gPSBsZW5ndGggYSBpblxuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBuIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBpZiBwICh1bnNhZmVfZ2V0IGEgaSkgdGhlbiBsb29wIChpICsgMSlcbiAgICAgIGVsc2UgZmFsc2UgaW5cbiAgICBsb29wIDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IG1lbSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIGNvbXBhcmUgKHVuc2FmZV9nZXQgYSBpKSB4ID0gMCB0aGVuIHRydWVcbiAgICAgIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ICopXG4gIGxldCBtZW1faWVlZSB4IGEgPVxuICAgIGxldCBuID0gbGVuZ3RoIGEgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID0gbiB0aGVuIGZhbHNlXG4gICAgICBlbHNlIGlmIHggPSAodW5zYWZlX2dldCBhIGkpIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBleGNlcHRpb24gQm90dG9tIG9mIGludFxuICBsZXQgc29ydCBjbXAgYSA9XG4gICAgbGV0IG1heHNvbiBsIGkgPVxuICAgICAgbGV0IGkzMSA9IGkraStpKzEgaW5cbiAgICAgIGxldCB4ID0gcmVmIGkzMSBpblxuICAgICAgaWYgaTMxKzIgPCBsIHRoZW4gYmVnaW5cbiAgICAgICAgaWYgY21wIChnZXQgYSBpMzEpIChnZXQgYSAoaTMxKzEpKSA8IDAgdGhlbiB4IDo9IGkzMSsxO1xuICAgICAgICBpZiBjbXAgKGdldCBhICF4KSAoZ2V0IGEgKGkzMSsyKSkgPCAwIHRoZW4geCA6PSBpMzErMjtcbiAgICAgICAgIXhcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIGlmIGkzMSsxIDwgbCAmJiBjbXAgKGdldCBhIGkzMSkgKGdldCBhIChpMzErMSkpIDwgMFxuICAgICAgICB0aGVuIGkzMSsxXG4gICAgICAgIGVsc2UgaWYgaTMxIDwgbCB0aGVuIGkzMSBlbHNlIHJhaXNlIChCb3R0b20gaSlcbiAgICBpblxuICAgIGxldCByZWMgdHJpY2tsZWRvd24gbCBpIGUgPVxuICAgICAgbGV0IGogPSBtYXhzb24gbCBpIGluXG4gICAgICBpZiBjbXAgKGdldCBhIGopIGUgPiAwIHRoZW4gYmVnaW5cbiAgICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICAgIHRyaWNrbGVkb3duIGwgaiBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IHRyaWNrbGUgbCBpIGUgPSB0cnkgdHJpY2tsZWRvd24gbCBpIGUgd2l0aCBCb3R0b20gaSAtPiBzZXQgYSBpIGUgaW5cbiAgICBsZXQgcmVjIGJ1YmJsZWRvd24gbCBpID1cbiAgICAgIGxldCBqID0gbWF4c29uIGwgaSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgaik7XG4gICAgICBidWJibGVkb3duIGwgalxuICAgIGluXG4gICAgbGV0IGJ1YmJsZSBsIGkgPSB0cnkgYnViYmxlZG93biBsIGkgd2l0aCBCb3R0b20gaSAtPiBpIGluXG4gICAgbGV0IHJlYyB0cmlja2xldXAgaSBlID1cbiAgICAgIGxldCBmYXRoZXIgPSAoaSAtIDEpIC8gMyBpblxuICAgICAgYXNzZXJ0IChpIDw+IGZhdGhlcik7XG4gICAgICBpZiBjbXAgKGdldCBhIGZhdGhlcikgZSA8IDAgdGhlbiBiZWdpblxuICAgICAgICBzZXQgYSBpIChnZXQgYSBmYXRoZXIpO1xuICAgICAgICBpZiBmYXRoZXIgPiAwIHRoZW4gdHJpY2tsZXVwIGZhdGhlciBlIGVsc2Ugc2V0IGEgMCBlO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgc2V0IGEgaSBlO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbGV0IGwgPSBsZW5ndGggYSBpblxuICAgIGZvciBpID0gKGwgKyAxKSAvIDMgLSAxIGRvd250byAwIGRvIHRyaWNrbGUgbCBpIChnZXQgYSBpKTsgZG9uZTtcbiAgICBmb3IgaSA9IGwgLSAxIGRvd250byAyIGRvXG4gICAgICBsZXQgZSA9IChnZXQgYSBpKSBpblxuICAgICAgc2V0IGEgaSAoZ2V0IGEgMCk7XG4gICAgICB0cmlja2xldXAgKGJ1YmJsZSBpIDApIGU7XG4gICAgZG9uZTtcbiAgICBpZiBsID4gMSB0aGVuIChsZXQgZSA9IChnZXQgYSAxKSBpbiBzZXQgYSAxIChnZXQgYSAwKTsgc2V0IGEgMCBlKVxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCwgZXhjZXB0IGZvciB0aGUgY2FsbCB0byBbY3JlYXRlXSAqKVxuICBsZXQgY3V0b2ZmID0gNVxuICBsZXQgc3RhYmxlX3NvcnQgY21wIGEgPVxuICAgIGxldCBtZXJnZSBzcmMxb2ZzIHNyYzFsZW4gc3JjMiBzcmMyb2ZzIHNyYzJsZW4gZHN0IGRzdG9mcyA9XG4gICAgICBsZXQgc3JjMXIgPSBzcmMxb2ZzICsgc3JjMWxlbiBhbmQgc3JjMnIgPSBzcmMyb2ZzICsgc3JjMmxlbiBpblxuICAgICAgbGV0IHJlYyBsb29wIGkxIHMxIGkyIHMyIGQgPVxuICAgICAgICBpZiBjbXAgczEgczIgPD0gMCB0aGVuIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMxO1xuICAgICAgICAgIGxldCBpMSA9IGkxICsgMSBpblxuICAgICAgICAgIGlmIGkxIDwgc3JjMXIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSAoZ2V0IGEgaTEpIGkyIHMyIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IHNyYzIgaTIgZHN0IChkICsgMSkgKHNyYzJyIC0gaTIpXG4gICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgc2V0IGRzdCBkIHMyO1xuICAgICAgICAgIGxldCBpMiA9IGkyICsgMSBpblxuICAgICAgICAgIGlmIGkyIDwgc3JjMnIgdGhlblxuICAgICAgICAgICAgbG9vcCBpMSBzMSBpMiAoZ2V0IHNyYzIgaTIpIChkICsgMSlcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBibGl0IGEgaTEgZHN0IChkICsgMSkgKHNyYzFyIC0gaTEpXG4gICAgICAgIGVuZFxuICAgICAgaW4gbG9vcCBzcmMxb2ZzIChnZXQgYSBzcmMxb2ZzKSBzcmMyb2ZzIChnZXQgc3JjMiBzcmMyb2ZzKSBkc3RvZnM7XG4gICAgaW5cbiAgICBsZXQgaXNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgbGV0IGUgPSAoZ2V0IGEgKHNyY29mcyArIGkpKSBpblxuICAgICAgICBsZXQgaiA9IHJlZiAoZHN0b2ZzICsgaSAtIDEpIGluXG4gICAgICAgIHdoaWxlICghaiA+PSBkc3RvZnMgJiYgY21wIChnZXQgZHN0ICFqKSBlID4gMCkgZG9cbiAgICAgICAgICBzZXQgZHN0ICghaiArIDEpIChnZXQgZHN0ICFqKTtcbiAgICAgICAgICBkZWNyIGo7XG4gICAgICAgIGRvbmU7XG4gICAgICAgIHNldCBkc3QgKCFqICsgMSkgZTtcbiAgICAgIGRvbmU7XG4gICAgaW5cbiAgICBsZXQgcmVjIHNvcnR0byBzcmNvZnMgZHN0IGRzdG9mcyBsZW4gPVxuICAgICAgaWYgbGVuIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gc3Jjb2ZzIGRzdCBkc3RvZnMgbGVuIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGwxID0gbGVuIC8gMiBpblxuICAgICAgICBsZXQgbDIgPSBsZW4gLSBsMSBpblxuICAgICAgICBzb3J0dG8gKHNyY29mcyArIGwxKSBkc3QgKGRzdG9mcyArIGwxKSBsMjtcbiAgICAgICAgc29ydHRvIHNyY29mcyBhIChzcmNvZnMgKyBsMikgbDE7XG4gICAgICAgIG1lcmdlIChzcmNvZnMgKyBsMikgbDEgZHN0IChkc3RvZnMgKyBsMSkgbDIgZHN0IGRzdG9mcztcbiAgICAgIGVuZDtcbiAgICBpblxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsIDw9IGN1dG9mZiB0aGVuIGlzb3J0dG8gMCBhIDAgbCBlbHNlIGJlZ2luXG4gICAgICBsZXQgbDEgPSBsIC8gMiBpblxuICAgICAgbGV0IGwyID0gbCAtIGwxIGluXG4gICAgICBsZXQgdCA9IGNyZWF0ZSBsMiBpblxuICAgICAgc29ydHRvIGwxIHQgMCBsMjtcbiAgICAgIHNvcnR0byAwIGEgbDIgbDE7XG4gICAgICBtZXJnZSBsMiBsMSB0IDAgbDIgYSAwO1xuICAgIGVuZFxuXG4gIGxldCBmYXN0X3NvcnQgPSBzdGFibGVfc29ydFxuXG4gICgqIGR1cGxpY2F0ZWQgZnJvbSBhcnJheS5tbCAqKVxuICBsZXQgdG9fc2VxIGEgPVxuICAgIGxldCByZWMgYXV4IGkgKCkgPVxuICAgICAgaWYgaSA8IGxlbmd0aCBhXG4gICAgICB0aGVuXG4gICAgICAgIGxldCB4ID0gdW5zYWZlX2dldCBhIGkgaW5cbiAgICAgICAgU2VxLkNvbnMgKHgsIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBkdXBsaWNhdGVkIGZyb20gYXJyYXkubWwgKilcbiAgbGV0IHRvX3NlcWkgYSA9XG4gICAgbGV0IHJlYyBhdXggaSAoKSA9XG4gICAgICBpZiBpIDwgbGVuZ3RoIGFcbiAgICAgIHRoZW5cbiAgICAgICAgbGV0IHggPSB1bnNhZmVfZ2V0IGEgaSBpblxuICAgICAgICBTZXEuQ29ucyAoKGkseCksIGF1eCAoaSsxKSlcbiAgICAgIGVsc2UgU2VxLk5pbFxuICAgIGluXG4gICAgYXV4IDBcblxuICAoKiBtb3N0bHkgZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9yZXZfbGlzdCBsID1cbiAgICBsZXQgbGVuID0gTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCBhID0gY3JlYXRlIGxlbiBpblxuICAgIGxldCByZWMgZmlsbCBpID0gZnVuY3Rpb25cbiAgICAgICAgW10gLT4gYVxuICAgICAgfCBoZDo6dGwgLT4gdW5zYWZlX3NldCBhIGkgaGQ7IGZpbGwgKGktMSkgdGxcbiAgICBpblxuICAgIGZpbGwgKGxlbi0xKSBsXG5cbiAgKCogZHVwbGljYXRlZCBmcm9tIGFycmF5Lm1sICopXG4gIGxldCBvZl9zZXEgaSA9XG4gICAgbGV0IGwgPSBTZXEuZm9sZF9sZWZ0IChmdW4gYWNjIHggLT4geDo6YWNjKSBbXSBpIGluXG4gICAgb2ZfcmV2X2xpc3QgbFxuXG5cbiAgbGV0IG1hcF90b19hcnJheSBmIGEgPVxuICAgIGxldCBsID0gbGVuZ3RoIGEgaW5cbiAgICBpZiBsID0gMCB0aGVuIFt8IHxdIGVsc2UgYmVnaW5cbiAgICAgIGxldCByID0gQXJyYXkubWFrZSBsIChmICh1bnNhZmVfZ2V0IGEgMCkpIGluXG4gICAgICBmb3IgaSA9IDEgdG8gbCAtIDEgZG9cbiAgICAgICAgQXJyYXkudW5zYWZlX3NldCByIGkgKGYgKHVuc2FmZV9nZXQgYSBpKSlcbiAgICAgIGRvbmU7XG4gICAgICByXG4gICAgZW5kXG5cbiAgbGV0IG1hcF9mcm9tX2FycmF5IGYgYSA9XG4gICAgbGV0IGwgPSBBcnJheS5sZW5ndGggYSBpblxuICAgIGxldCByID0gY3JlYXRlIGwgaW5cbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICAgIHVuc2FmZV9zZXQgciBpIChmIChBcnJheS51bnNhZmVfZ2V0IGEgaSkpXG4gICAgZG9uZTtcbiAgICByXG5cbmVuZFxuXG5tb2R1bGUgQXJyYXlMYWJlbHMgPSBBcnJheVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW0ludDMyXTogMzItYml0IGludGVnZXJzICopXG5cbmV4dGVybmFsIG5lZyA6IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfbmVnXCJcbmV4dGVybmFsIGFkZCA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfYWRkXCJcbmV4dGVybmFsIHN1YiA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfc3ViXCJcbmV4dGVybmFsIG11bCA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfbXVsXCJcbmV4dGVybmFsIGRpdiA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfZGl2XCJcbmV4dGVybmFsIHJlbSA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfbW9kXCJcbmV4dGVybmFsIGxvZ2FuZCA6IGludDMyIC0+IGludDMyIC0+IGludDMyID0gXCIlaW50MzJfYW5kXCJcbmV4dGVybmFsIGxvZ29yIDogaW50MzIgLT4gaW50MzIgLT4gaW50MzIgPSBcIiVpbnQzMl9vclwiXG5leHRlcm5hbCBsb2d4b3IgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQzMiA9IFwiJWludDMyX3hvclwiXG5leHRlcm5hbCBzaGlmdF9sZWZ0IDogaW50MzIgLT4gaW50IC0+IGludDMyID0gXCIlaW50MzJfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0IDogaW50MzIgLT4gaW50IC0+IGludDMyID0gXCIlaW50MzJfYXNyXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQzMiAtPiBpbnQgLT4gaW50MzIgPSBcIiVpbnQzMl9sc3JcIlxuZXh0ZXJuYWwgb2ZfaW50IDogaW50IC0+IGludDMyID0gXCIlaW50MzJfb2ZfaW50XCJcbmV4dGVybmFsIHRvX2ludCA6IGludDMyIC0+IGludCA9IFwiJWludDMyX3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludDMyXG4gID0gXCJjYW1sX2ludDMyX29mX2Zsb2F0XCIgXCJjYW1sX2ludDMyX29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBpbnQzMiAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQzMl90b19mbG9hdFwiIFwiY2FtbF9pbnQzMl90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGJpdHNfb2ZfZmxvYXQgOiBmbG9hdCAtPiBpbnQzMlxuICA9IFwiY2FtbF9pbnQzMl9iaXRzX29mX2Zsb2F0XCIgXCJjYW1sX2ludDMyX2JpdHNfb2ZfZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBmbG9hdF9vZl9iaXRzIDogaW50MzIgLT4gZmxvYXRcbiAgPSBcImNhbWxfaW50MzJfZmxvYXRfb2ZfYml0c1wiIFwiY2FtbF9pbnQzMl9mbG9hdF9vZl9iaXRzX3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG5sZXQgemVybyA9IDBsXG5sZXQgb25lID0gMWxcbmxldCBtaW51c19vbmUgPSAtMWxcbmxldCBzdWNjIG4gPSBhZGQgbiAxbFxubGV0IHByZWQgbiA9IHN1YiBuIDFsXG5sZXQgYWJzIG4gPSBpZiBuID49IDBsIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgbWluX2ludCA9IDB4ODAwMDAwMDBsXG5sZXQgbWF4X2ludCA9IDB4N0ZGRkZGRkZsXG5sZXQgbG9nbm90IG4gPSBsb2d4b3IgbiAoLTFsKVxuXG5sZXQgdW5zaWduZWRfdG9faW50ID1cbiAgbWF0Y2ggU3lzLndvcmRfc2l6ZSB3aXRoXG4gIHwgMzIgLT5cbiAgICAgIGxldCBtYXhfaW50ID0gb2ZfaW50IFN0ZGxpYi5tYXhfaW50IGluXG4gICAgICBmdW4gbiAtPlxuICAgICAgICBpZiBjb21wYXJlIHplcm8gbiA8PSAwICYmIGNvbXBhcmUgbiBtYXhfaW50IDw9IDAgdGhlblxuICAgICAgICAgIFNvbWUgKHRvX2ludCBuKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgTm9uZVxuICB8IDY0IC0+XG4gICAgICAoKiBTbyB0aGF0IGl0IGNvbXBpbGVzIGluIDMyLWJpdCAqKVxuICAgICAgbGV0IG1hc2sgPSAweEZGRkYgbHNsIDE2IGxvciAweEZGRkYgaW5cbiAgICAgIGZ1biBuIC0+IFNvbWUgKHRvX2ludCBuIGxhbmQgbWFzaylcbiAgfCBfIC0+XG4gICAgICBhc3NlcnQgZmFsc2VcblxuZXh0ZXJuYWwgZm9ybWF0IDogc3RyaW5nIC0+IGludDMyIC0+IHN0cmluZyA9IFwiY2FtbF9pbnQzMl9mb3JtYXRcIlxubGV0IHRvX3N0cmluZyBuID0gZm9ybWF0IFwiJWRcIiBuXG5cbmV4dGVybmFsIG9mX3N0cmluZyA6IHN0cmluZyAtPiBpbnQzMiA9IFwiY2FtbF9pbnQzMl9vZl9zdHJpbmdcIlxuXG5sZXQgb2Zfc3RyaW5nX29wdCBzID1cbiAgKCogVE9ETzogZXhwb3NlIGEgbm9uLXJhaXNpbmcgcHJpbWl0aXZlIGRpcmVjdGx5LiAqKVxuICB0cnkgU29tZSAob2Zfc3RyaW5nIHMpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxudHlwZSB0ID0gaW50MzJcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxubGV0IGVxdWFsICh4OiB0KSAoeTogdCkgPSBjb21wYXJlIHggeSA9IDBcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZVxuICAgYml0bmVzcy4gU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgbiBkIDwgMCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSByIGQgPj0gMCB0aGVuIHN1Y2MgcSBlbHNlIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBNb2R1bGUgW0ludDY0XTogNjQtYml0IGludGVnZXJzICopXG5cbmV4dGVybmFsIG5lZyA6IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfbmVnXCJcbmV4dGVybmFsIGFkZCA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfYWRkXCJcbmV4dGVybmFsIHN1YiA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfc3ViXCJcbmV4dGVybmFsIG11bCA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfbXVsXCJcbmV4dGVybmFsIGRpdiA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfZGl2XCJcbmV4dGVybmFsIHJlbSA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfbW9kXCJcbmV4dGVybmFsIGxvZ2FuZCA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCIlaW50NjRfYW5kXCJcbmV4dGVybmFsIGxvZ29yIDogaW50NjQgLT4gaW50NjQgLT4gaW50NjQgPSBcIiVpbnQ2NF9vclwiXG5leHRlcm5hbCBsb2d4b3IgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBpbnQ2NCA9IFwiJWludDY0X3hvclwiXG5leHRlcm5hbCBzaGlmdF9sZWZ0IDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfbHNsXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0IDogaW50NjQgLT4gaW50IC0+IGludDY0ID0gXCIlaW50NjRfYXNyXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgOiBpbnQ2NCAtPiBpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9sc3JcIlxuZXh0ZXJuYWwgb2ZfaW50IDogaW50IC0+IGludDY0ID0gXCIlaW50NjRfb2ZfaW50XCJcbmV4dGVybmFsIHRvX2ludCA6IGludDY0IC0+IGludCA9IFwiJWludDY0X3RvX2ludFwiXG5leHRlcm5hbCBvZl9mbG9hdCA6IGZsb2F0IC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X29mX2Zsb2F0XCIgXCJjYW1sX2ludDY0X29mX2Zsb2F0X3VuYm94ZWRcIlxuICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuZXh0ZXJuYWwgdG9fZmxvYXQgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF90b19mbG9hdFwiIFwiY2FtbF9pbnQ2NF90b19mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIG9mX2ludDMyIDogaW50MzIgLT4gaW50NjQgPSBcIiVpbnQ2NF9vZl9pbnQzMlwiXG5leHRlcm5hbCB0b19pbnQzMiA6IGludDY0IC0+IGludDMyID0gXCIlaW50NjRfdG9faW50MzJcIlxuZXh0ZXJuYWwgb2ZfbmF0aXZlaW50IDogbmF0aXZlaW50IC0+IGludDY0ID0gXCIlaW50NjRfb2ZfbmF0aXZlaW50XCJcbmV4dGVybmFsIHRvX25hdGl2ZWludCA6IGludDY0IC0+IG5hdGl2ZWludCA9IFwiJWludDY0X3RvX25hdGl2ZWludFwiXG5cbmxldCB6ZXJvID0gMExcbmxldCBvbmUgPSAxTFxubGV0IG1pbnVzX29uZSA9IC0xTFxubGV0IHN1Y2MgbiA9IGFkZCBuIDFMXG5sZXQgcHJlZCBuID0gc3ViIG4gMUxcbmxldCBhYnMgbiA9IGlmIG4gPj0gMEwgdGhlbiBuIGVsc2UgbmVnIG5cbmxldCBtaW5faW50ID0gMHg4MDAwMDAwMDAwMDAwMDAwTFxubGV0IG1heF9pbnQgPSAweDdGRkZGRkZGRkZGRkZGRkZMXG5sZXQgbG9nbm90IG4gPSBsb2d4b3IgbiAoLTFMKVxuXG5sZXQgdW5zaWduZWRfdG9faW50ID1cbiAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgZnVuIG4gLT5cbiAgICBpZiBjb21wYXJlIHplcm8gbiA8PSAwICYmIGNvbXBhcmUgbiBtYXhfaW50IDw9IDAgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gaW50NjQgLT4gc3RyaW5nID0gXCJjYW1sX2ludDY0X2Zvcm1hdFwiXG5sZXQgdG9fc3RyaW5nIG4gPSBmb3JtYXQgXCIlZFwiIG5cblxuZXh0ZXJuYWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0ID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5cblxuZXh0ZXJuYWwgYml0c19vZl9mbG9hdCA6IGZsb2F0IC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X2JpdHNfb2ZfZmxvYXRcIiBcImNhbWxfaW50NjRfYml0c19vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIGZsb2F0X29mX2JpdHMgOiBpbnQ2NCAtPiBmbG9hdFxuICA9IFwiY2FtbF9pbnQ2NF9mbG9hdF9vZl9iaXRzXCIgXCJjYW1sX2ludDY0X2Zsb2F0X29mX2JpdHNfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbnR5cGUgdCA9IGludDY0XG5cbmxldCBjb21wYXJlICh4OiB0KSAoeTogdCkgPSBTdGRsaWIuY29tcGFyZSB4IHlcbmxldCBlcXVhbCAoeDogdCkgKHk6IHQpID0gY29tcGFyZSB4IHkgPSAwXG5cbmxldCB1bnNpZ25lZF9jb21wYXJlIG4gbSA9XG4gIGNvbXBhcmUgKHN1YiBuIG1pbl9pbnQpIChzdWIgbSBtaW5faW50KVxuXG5sZXQgbWluIHggeSA6IHQgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxubGV0IG1heCB4IHkgOiB0ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcblxuKCogVW5zaWduZWQgZGl2aXNpb24gZnJvbSBzaWduZWQgZGl2aXNpb24gb2YgdGhlIHNhbWVcbiAgIGJpdG5lc3MuIFNlZSBXYXJyZW4gSnIuLCBIZW5yeSBTLiAoMjAxMykuIEhhY2tlcidzIERlbGlnaHQgKDIgZWQuKSwgU2VjIDktMy5cbiopXG5sZXQgdW5zaWduZWRfZGl2IG4gZCA9XG4gIGlmIGQgPCB6ZXJvIHRoZW5cbiAgICBpZiB1bnNpZ25lZF9jb21wYXJlIG4gZCA8IDAgdGhlbiB6ZXJvIGVsc2Ugb25lXG4gIGVsc2VcbiAgICBsZXQgcSA9IHNoaWZ0X2xlZnQgKGRpdiAoc2hpZnRfcmlnaHRfbG9naWNhbCBuIDEpIGQpIDEgaW5cbiAgICBsZXQgciA9IHN1YiBuIChtdWwgcSBkKSBpblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgciBkID49IDAgdGhlbiBzdWNjIHEgZWxzZSBxXG5cbmxldCB1bnNpZ25lZF9yZW0gbiBkID1cbiAgc3ViIG4gKG11bCAodW5zaWduZWRfZGl2IG4gZCkgZClcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogTW9kdWxlIFtOYXRpdmVpbnRdOiBwcm9jZXNzb3ItbmF0aXZlIGludGVnZXJzICopXG5cbmV4dGVybmFsIG5lZzogbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9uZWdcIlxuZXh0ZXJuYWwgYWRkOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hZGRcIlxuZXh0ZXJuYWwgc3ViOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9zdWJcIlxuZXh0ZXJuYWwgbXVsOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9tdWxcIlxuZXh0ZXJuYWwgZGl2OiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9kaXZcIlxuZXh0ZXJuYWwgcmVtOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9tb2RcIlxuZXh0ZXJuYWwgbG9nYW5kOiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50IC0+IG5hdGl2ZWludCA9IFwiJW5hdGl2ZWludF9hbmRcIlxuZXh0ZXJuYWwgbG9nb3I6IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X29yXCJcbmV4dGVybmFsIGxvZ3hvcjogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfeG9yXCJcbmV4dGVybmFsIHNoaWZ0X2xlZnQ6IG5hdGl2ZWludCAtPiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2xzbFwiXG5leHRlcm5hbCBzaGlmdF9yaWdodDogbmF0aXZlaW50IC0+IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfYXNyXCJcbmV4dGVybmFsIHNoaWZ0X3JpZ2h0X2xvZ2ljYWw6IG5hdGl2ZWludCAtPiBpbnQgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X2xzclwiXG5leHRlcm5hbCBvZl9pbnQ6IGludCAtPiBuYXRpdmVpbnQgPSBcIiVuYXRpdmVpbnRfb2ZfaW50XCJcbmV4dGVybmFsIHRvX2ludDogbmF0aXZlaW50IC0+IGludCA9IFwiJW5hdGl2ZWludF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfZmxvYXQgOiBmbG9hdCAtPiBuYXRpdmVpbnRcbiAgPSBcImNhbWxfbmF0aXZlaW50X29mX2Zsb2F0XCIgXCJjYW1sX25hdGl2ZWludF9vZl9mbG9hdF91bmJveGVkXCJcbiAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbmV4dGVybmFsIHRvX2Zsb2F0IDogbmF0aXZlaW50IC0+IGZsb2F0XG4gID0gXCJjYW1sX25hdGl2ZWludF90b19mbG9hdFwiIFwiY2FtbF9uYXRpdmVpbnRfdG9fZmxvYXRfdW5ib3hlZFwiXG4gIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5leHRlcm5hbCBvZl9pbnQzMjogaW50MzIgLT4gbmF0aXZlaW50ID0gXCIlbmF0aXZlaW50X29mX2ludDMyXCJcbmV4dGVybmFsIHRvX2ludDMyOiBuYXRpdmVpbnQgLT4gaW50MzIgPSBcIiVuYXRpdmVpbnRfdG9faW50MzJcIlxuXG5sZXQgemVybyA9IDBuXG5sZXQgb25lID0gMW5cbmxldCBtaW51c19vbmUgPSAtMW5cbmxldCBzdWNjIG4gPSBhZGQgbiAxblxubGV0IHByZWQgbiA9IHN1YiBuIDFuXG5sZXQgYWJzIG4gPSBpZiBuID49IDBuIHRoZW4gbiBlbHNlIG5lZyBuXG5sZXQgc2l6ZSA9IFN5cy53b3JkX3NpemVcbmxldCBtaW5faW50ID0gc2hpZnRfbGVmdCAxbiAoc2l6ZSAtIDEpXG5sZXQgbWF4X2ludCA9IHN1YiBtaW5faW50IDFuXG5sZXQgbG9nbm90IG4gPSBsb2d4b3IgbiAoLTFuKVxuXG5sZXQgdW5zaWduZWRfdG9faW50ID1cbiAgbGV0IG1heF9pbnQgPSBvZl9pbnQgU3RkbGliLm1heF9pbnQgaW5cbiAgZnVuIG4gLT5cbiAgICBpZiBjb21wYXJlIHplcm8gbiA8PSAwICYmIGNvbXBhcmUgbiBtYXhfaW50IDw9IDAgdGhlblxuICAgICAgU29tZSAodG9faW50IG4pXG4gICAgZWxzZVxuICAgICAgTm9uZVxuXG5leHRlcm5hbCBmb3JtYXQgOiBzdHJpbmcgLT4gbmF0aXZlaW50IC0+IHN0cmluZyA9IFwiY2FtbF9uYXRpdmVpbnRfZm9ybWF0XCJcbmxldCB0b19zdHJpbmcgbiA9IGZvcm1hdCBcIiVkXCIgblxuXG5leHRlcm5hbCBvZl9zdHJpbmc6IHN0cmluZyAtPiBuYXRpdmVpbnQgPSBcImNhbWxfbmF0aXZlaW50X29mX3N0cmluZ1wiXG5cbmxldCBvZl9zdHJpbmdfb3B0IHMgPVxuICAoKiBUT0RPOiBleHBvc2UgYSBub24tcmFpc2luZyBwcmltaXRpdmUgZGlyZWN0bHkuICopXG4gIHRyeSBTb21lIChvZl9zdHJpbmcgcylcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG50eXBlIHQgPSBuYXRpdmVpbnRcblxubGV0IGNvbXBhcmUgKHg6IHQpICh5OiB0KSA9IFN0ZGxpYi5jb21wYXJlIHggeVxubGV0IGVxdWFsICh4OiB0KSAoeTogdCkgPSBjb21wYXJlIHggeSA9IDBcblxubGV0IHVuc2lnbmVkX2NvbXBhcmUgbiBtID1cbiAgY29tcGFyZSAoc3ViIG4gbWluX2ludCkgKHN1YiBtIG1pbl9pbnQpXG5cbmxldCBtaW4geCB5IDogdCA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5sZXQgbWF4IHggeSA6IHQgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4oKiBVbnNpZ25lZCBkaXZpc2lvbiBmcm9tIHNpZ25lZCBkaXZpc2lvbiBvZiB0aGUgc2FtZVxuICAgYml0bmVzcy4gU2VlIFdhcnJlbiBKci4sIEhlbnJ5IFMuICgyMDEzKS4gSGFja2VyJ3MgRGVsaWdodCAoMiBlZC4pLCBTZWMgOS0zLlxuKilcbmxldCB1bnNpZ25lZF9kaXYgbiBkID1cbiAgaWYgZCA8IHplcm8gdGhlblxuICAgIGlmIHVuc2lnbmVkX2NvbXBhcmUgbiBkIDwgMCB0aGVuIHplcm8gZWxzZSBvbmVcbiAgZWxzZVxuICAgIGxldCBxID0gc2hpZnRfbGVmdCAoZGl2IChzaGlmdF9yaWdodF9sb2dpY2FsIG4gMSkgZCkgMSBpblxuICAgIGxldCByID0gc3ViIG4gKG11bCBxIGQpIGluXG4gICAgaWYgdW5zaWduZWRfY29tcGFyZSByIGQgPj0gMCB0aGVuIHN1Y2MgcSBlbHNlIHFcblxubGV0IHVuc2lnbmVkX3JlbSBuIGQgPVxuICBzdWIgbiAobXVsICh1bnNpZ25lZF9kaXYgbiBkKSBkKVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBUaGUgcnVuLXRpbWUgbGlicmFyeSBmb3IgbGV4ZXJzIGdlbmVyYXRlZCBieSBjYW1sbGV4ICopXG5cbnR5cGUgcG9zaXRpb24gPSB7XG4gIHBvc19mbmFtZSA6IHN0cmluZztcbiAgcG9zX2xudW0gOiBpbnQ7XG4gIHBvc19ib2wgOiBpbnQ7XG4gIHBvc19jbnVtIDogaW50O1xufVxuXG5sZXQgZHVtbXlfcG9zID0ge1xuICBwb3NfZm5hbWUgPSBcIlwiO1xuICBwb3NfbG51bSA9IDA7XG4gIHBvc19ib2wgPSAwO1xuICBwb3NfY251bSA9IC0xO1xufVxuXG50eXBlIGxleGJ1ZiA9XG4gIHsgcmVmaWxsX2J1ZmYgOiBsZXhidWYgLT4gdW5pdDtcbiAgICBtdXRhYmxlIGxleF9idWZmZXIgOiBieXRlcztcbiAgICBtdXRhYmxlIGxleF9idWZmZXJfbGVuIDogaW50O1xuICAgIG11dGFibGUgbGV4X2Fic19wb3MgOiBpbnQ7XG4gICAgbXV0YWJsZSBsZXhfc3RhcnRfcG9zIDogaW50O1xuICAgIG11dGFibGUgbGV4X2N1cnJfcG9zIDogaW50O1xuICAgIG11dGFibGUgbGV4X2xhc3RfcG9zIDogaW50O1xuICAgIG11dGFibGUgbGV4X2xhc3RfYWN0aW9uIDogaW50O1xuICAgIG11dGFibGUgbGV4X2VvZl9yZWFjaGVkIDogYm9vbDtcbiAgICBtdXRhYmxlIGxleF9tZW0gOiBpbnQgYXJyYXk7XG4gICAgbXV0YWJsZSBsZXhfc3RhcnRfcCA6IHBvc2l0aW9uO1xuICAgIG11dGFibGUgbGV4X2N1cnJfcCA6IHBvc2l0aW9uO1xuICB9XG5cbnR5cGUgbGV4X3RhYmxlcyA9XG4gIHsgbGV4X2Jhc2U6IHN0cmluZztcbiAgICBsZXhfYmFja3Ryazogc3RyaW5nO1xuICAgIGxleF9kZWZhdWx0OiBzdHJpbmc7XG4gICAgbGV4X3RyYW5zOiBzdHJpbmc7XG4gICAgbGV4X2NoZWNrOiBzdHJpbmc7XG4gICAgbGV4X2Jhc2VfY29kZSA6IHN0cmluZztcbiAgICBsZXhfYmFja3Rya19jb2RlIDogc3RyaW5nO1xuICAgIGxleF9kZWZhdWx0X2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X3RyYW5zX2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X2NoZWNrX2NvZGUgOiBzdHJpbmc7XG4gICAgbGV4X2NvZGU6IHN0cmluZzt9XG5cbmV4dGVybmFsIGNfZW5naW5lIDogbGV4X3RhYmxlcyAtPiBpbnQgLT4gbGV4YnVmIC0+IGludCA9IFwiY2FtbF9sZXhfZW5naW5lXCJcbmV4dGVybmFsIGNfbmV3X2VuZ2luZSA6IGxleF90YWJsZXMgLT4gaW50IC0+IGxleGJ1ZiAtPiBpbnRcbiAgICAgICAgICAgICAgICAgICAgICA9IFwiY2FtbF9uZXdfbGV4X2VuZ2luZVwiXG5cbmxldCBlbmdpbmUgdGJsIHN0YXRlIGJ1ZiA9XG4gIGxldCByZXN1bHQgPSBjX2VuZ2luZSB0Ymwgc3RhdGUgYnVmIGluXG4gIGlmIHJlc3VsdCA+PSAwICYmIGJ1Zi5sZXhfY3Vycl9wICE9IGR1bW15X3BvcyB0aGVuIGJlZ2luXG4gICAgYnVmLmxleF9zdGFydF9wIDwtIGJ1Zi5sZXhfY3Vycl9wO1xuICAgIGJ1Zi5sZXhfY3Vycl9wIDwtIHtidWYubGV4X2N1cnJfcFxuICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHBvc19jbnVtID0gYnVmLmxleF9hYnNfcG9zICsgYnVmLmxleF9jdXJyX3Bvc307XG4gIGVuZDtcbiAgcmVzdWx0XG5cblxubGV0IG5ld19lbmdpbmUgdGJsIHN0YXRlIGJ1ZiA9XG4gIGxldCByZXN1bHQgPSBjX25ld19lbmdpbmUgdGJsIHN0YXRlIGJ1ZiBpblxuICBpZiByZXN1bHQgPj0gMCAmJiBidWYubGV4X2N1cnJfcCAhPSBkdW1teV9wb3MgdGhlbiBiZWdpblxuICAgIGJ1Zi5sZXhfc3RhcnRfcCA8LSBidWYubGV4X2N1cnJfcDtcbiAgICBidWYubGV4X2N1cnJfcCA8LSB7YnVmLmxleF9jdXJyX3BcbiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBwb3NfY251bSA9IGJ1Zi5sZXhfYWJzX3BvcyArIGJ1Zi5sZXhfY3Vycl9wb3N9O1xuICBlbmQ7XG4gIHJlc3VsdFxuXG5sZXQgbGV4X3JlZmlsbCByZWFkX2Z1biBhdXhfYnVmZmVyIGxleGJ1ZiA9XG4gIGxldCByZWFkID1cbiAgICByZWFkX2Z1biBhdXhfYnVmZmVyIChCeXRlcy5sZW5ndGggYXV4X2J1ZmZlcikgaW5cbiAgbGV0IG4gPVxuICAgIGlmIHJlYWQgPiAwXG4gICAgdGhlbiByZWFkXG4gICAgZWxzZSAobGV4YnVmLmxleF9lb2ZfcmVhY2hlZCA8LSB0cnVlOyAwKSBpblxuICAoKiBDdXJyZW50IHN0YXRlIG9mIHRoZSBidWZmZXI6XG4gICAgICAgIDwtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLT5cbiAgICAgICAgfCAganVuayB8ICAgICAgdmFsaWQgZGF0YSAgICAgfCAgIGp1bmsgICAgfFxuICAgICAgICBeICAgICAgIF4gICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICBeXG4gICAgICAgIDAgICAgc3RhcnRfcG9zICAgICAgICAgICAgIGJ1ZmZlcl9lbmQgICAgQnl0ZXMubGVuZ3RoIGJ1ZmZlclxuICAqKVxuICBpZiBsZXhidWYubGV4X2J1ZmZlcl9sZW4gKyBuID4gQnl0ZXMubGVuZ3RoIGxleGJ1Zi5sZXhfYnVmZmVyIHRoZW4gYmVnaW5cbiAgICAoKiBUaGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqKVxuICAgIGlmIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zICsgblxuICAgICAgIDw9IEJ5dGVzLmxlbmd0aCBsZXhidWYubGV4X2J1ZmZlclxuICAgIHRoZW4gYmVnaW5cbiAgICAgICgqIEJ1dCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgaWYgd2UgcmVjbGFpbSB0aGUganVuayBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICBvZiB0aGUgYnVmZmVyICopXG4gICAgICBCeXRlcy5ibGl0IGxleGJ1Zi5sZXhfYnVmZmVyIGxleGJ1Zi5sZXhfc3RhcnRfcG9zXG4gICAgICAgICAgICAgICAgICBsZXhidWYubGV4X2J1ZmZlciAwXG4gICAgICAgICAgICAgICAgICAobGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MpXG4gICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICgqIFdlIG11c3QgZ3JvdyB0aGUgYnVmZmVyLiAgRG91YmxpbmcgaXRzIHNpemUgd2lsbCBwcm92aWRlIGVub3VnaFxuICAgICAgICAgc3BhY2Ugc2luY2UgbiA8PSBTdHJpbmcubGVuZ3RoIGF1eF9idWZmZXIgPD0gU3RyaW5nLmxlbmd0aCBidWZmZXIuXG4gICAgICAgICBXYXRjaCBvdXQgZm9yIHN0cmluZyBsZW5ndGggb3ZlcmZsb3csIHRob3VnaC4gKilcbiAgICAgIGxldCBuZXdsZW4gPVxuICAgICAgICBJbnQubWluICgyICogQnl0ZXMubGVuZ3RoIGxleGJ1Zi5sZXhfYnVmZmVyKSBTeXMubWF4X3N0cmluZ19sZW5ndGggaW5cbiAgICAgIGlmIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiAtIGxleGJ1Zi5sZXhfc3RhcnRfcG9zICsgbiA+IG5ld2xlblxuICAgICAgdGhlbiBmYWlsd2l0aCBcIkxleGluZy5sZXhfcmVmaWxsOiBjYW5ub3QgZ3JvdyBidWZmZXJcIjtcbiAgICAgIGxldCBuZXdidWYgPSBCeXRlcy5jcmVhdGUgbmV3bGVuIGluXG4gICAgICAoKiBDb3B5IHRoZSB2YWxpZCBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5ldyBidWZmZXIgKilcbiAgICAgIEJ5dGVzLmJsaXQgbGV4YnVmLmxleF9idWZmZXIgbGV4YnVmLmxleF9zdGFydF9wb3NcbiAgICAgICAgICAgICAgICAgIG5ld2J1ZiAwXG4gICAgICAgICAgICAgICAgICAobGV4YnVmLmxleF9idWZmZXJfbGVuIC0gbGV4YnVmLmxleF9zdGFydF9wb3MpO1xuICAgICAgbGV4YnVmLmxleF9idWZmZXIgPC0gbmV3YnVmXG4gICAgZW5kO1xuICAgICgqIFJlYWxsb2NhdGlvbiBvciBub3QsIHdlIGhhdmUgc2hpZnRlZCB0aGUgZGF0YSBsZWZ0IGJ5XG4gICAgICAgc3RhcnRfcG9zIGNoYXJhY3RlcnM7IHVwZGF0ZSB0aGUgcG9zaXRpb25zICopXG4gICAgbGV0IHMgPSBsZXhidWYubGV4X3N0YXJ0X3BvcyBpblxuICAgIGxleGJ1Zi5sZXhfYWJzX3BvcyA8LSBsZXhidWYubGV4X2Fic19wb3MgKyBzO1xuICAgIGxleGJ1Zi5sZXhfY3Vycl9wb3MgPC0gbGV4YnVmLmxleF9jdXJyX3BvcyAtIHM7XG4gICAgbGV4YnVmLmxleF9zdGFydF9wb3MgPC0gMDtcbiAgICBsZXhidWYubGV4X2xhc3RfcG9zIDwtIGxleGJ1Zi5sZXhfbGFzdF9wb3MgLSBzO1xuICAgIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiA8LSBsZXhidWYubGV4X2J1ZmZlcl9sZW4gLSBzIDtcbiAgICBsZXQgdCA9IGxleGJ1Zi5sZXhfbWVtIGluXG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCB0LTEgZG9cbiAgICAgIGxldCB2ID0gdC4oaSkgaW5cbiAgICAgIGlmIHYgPj0gMCB0aGVuXG4gICAgICAgIHQuKGkpIDwtIHYtc1xuICAgIGRvbmVcbiAgZW5kO1xuICAoKiBUaGVyZSBpcyBub3cgZW5vdWdoIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqKVxuICBCeXRlcy5ibGl0IGF1eF9idWZmZXIgMCBsZXhidWYubGV4X2J1ZmZlciBsZXhidWYubGV4X2J1ZmZlcl9sZW4gbjtcbiAgbGV4YnVmLmxleF9idWZmZXJfbGVuIDwtIGxleGJ1Zi5sZXhfYnVmZmVyX2xlbiArIG5cblxubGV0IHplcm9fcG9zID0ge1xuICBwb3NfZm5hbWUgPSBcIlwiO1xuICBwb3NfbG51bSA9IDE7XG4gIHBvc19ib2wgPSAwO1xuICBwb3NfY251bSA9IDA7XG59XG5cbmxldCBmcm9tX2Z1bmN0aW9uID8od2l0aF9wb3NpdGlvbnMgPSB0cnVlKSBmID1cbiAgeyByZWZpbGxfYnVmZiA9IGxleF9yZWZpbGwgZiAoQnl0ZXMuY3JlYXRlIDUxMik7XG4gICAgbGV4X2J1ZmZlciA9IEJ5dGVzLmNyZWF0ZSAxMDI0O1xuICAgIGxleF9idWZmZXJfbGVuID0gMDtcbiAgICBsZXhfYWJzX3BvcyA9IDA7XG4gICAgbGV4X3N0YXJ0X3BvcyA9IDA7XG4gICAgbGV4X2N1cnJfcG9zID0gMDtcbiAgICBsZXhfbGFzdF9wb3MgPSAwO1xuICAgIGxleF9sYXN0X2FjdGlvbiA9IDA7XG4gICAgbGV4X21lbSA9IFt8fF07XG4gICAgbGV4X2VvZl9yZWFjaGVkID0gZmFsc2U7XG4gICAgbGV4X3N0YXJ0X3AgPSBpZiB3aXRoX3Bvc2l0aW9ucyB0aGVuIHplcm9fcG9zIGVsc2UgZHVtbXlfcG9zO1xuICAgIGxleF9jdXJyX3AgPSBpZiB3aXRoX3Bvc2l0aW9ucyB0aGVuIHplcm9fcG9zIGVsc2UgZHVtbXlfcG9zO1xuICB9XG5cbmxldCBmcm9tX2NoYW5uZWwgP3dpdGhfcG9zaXRpb25zIGljID1cbiAgZnJvbV9mdW5jdGlvbiA/d2l0aF9wb3NpdGlvbnMgKGZ1biBidWYgbiAtPiBpbnB1dCBpYyBidWYgMCBuKVxuXG5sZXQgZnJvbV9zdHJpbmcgPyh3aXRoX3Bvc2l0aW9ucyA9IHRydWUpIHMgPVxuICB7IHJlZmlsbF9idWZmID0gKGZ1biBsZXhidWYgLT4gbGV4YnVmLmxleF9lb2ZfcmVhY2hlZCA8LSB0cnVlKTtcbiAgICBsZXhfYnVmZmVyID0gQnl0ZXMub2Zfc3RyaW5nIHM7ICgqIGhhdmUgdG8gbWFrZSBhIGNvcHkgZm9yIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdW5zYWZlLXN0cmluZyBtb2RlICopXG4gICAgbGV4X2J1ZmZlcl9sZW4gPSBTdHJpbmcubGVuZ3RoIHM7XG4gICAgbGV4X2Fic19wb3MgPSAwO1xuICAgIGxleF9zdGFydF9wb3MgPSAwO1xuICAgIGxleF9jdXJyX3BvcyA9IDA7XG4gICAgbGV4X2xhc3RfcG9zID0gMDtcbiAgICBsZXhfbGFzdF9hY3Rpb24gPSAwO1xuICAgIGxleF9tZW0gPSBbfHxdO1xuICAgIGxleF9lb2ZfcmVhY2hlZCA9IHRydWU7XG4gICAgbGV4X3N0YXJ0X3AgPSBpZiB3aXRoX3Bvc2l0aW9ucyB0aGVuIHplcm9fcG9zIGVsc2UgZHVtbXlfcG9zO1xuICAgIGxleF9jdXJyX3AgPSBpZiB3aXRoX3Bvc2l0aW9ucyB0aGVuIHplcm9fcG9zIGVsc2UgZHVtbXlfcG9zO1xuICB9XG5cbmxldCBzZXRfcG9zaXRpb24gbGV4YnVmIHBvc2l0aW9uID1cbiAgbGV4YnVmLmxleF9jdXJyX3AgIDwtIHtwb3NpdGlvbiB3aXRoIHBvc19mbmFtZSA9IGxleGJ1Zi5sZXhfY3Vycl9wLnBvc19mbmFtZX07XG4gIGxleGJ1Zi5sZXhfYWJzX3BvcyA8LSBwb3NpdGlvbi5wb3NfY251bVxuXG5sZXQgc2V0X2ZpbGVuYW1lIGxleGJ1ZiBmbmFtZSA9XG4gIGxleGJ1Zi5sZXhfY3Vycl9wIDwtIHtsZXhidWYubGV4X2N1cnJfcCB3aXRoIHBvc19mbmFtZSA9IGZuYW1lfVxuXG5sZXQgd2l0aF9wb3NpdGlvbnMgbGV4YnVmID0gbGV4YnVmLmxleF9jdXJyX3AgIT0gZHVtbXlfcG9zXG5cbmxldCBsZXhlbWUgbGV4YnVmID1cbiAgbGV0IGxlbiA9IGxleGJ1Zi5sZXhfY3Vycl9wb3MgLSBsZXhidWYubGV4X3N0YXJ0X3BvcyBpblxuICBCeXRlcy5zdWJfc3RyaW5nIGxleGJ1Zi5sZXhfYnVmZmVyIGxleGJ1Zi5sZXhfc3RhcnRfcG9zIGxlblxuXG5sZXQgc3ViX2xleGVtZSBsZXhidWYgaTEgaTIgPVxuICBsZXQgbGVuID0gaTItaTEgaW5cbiAgQnl0ZXMuc3ViX3N0cmluZyBsZXhidWYubGV4X2J1ZmZlciBpMSBsZW5cblxubGV0IHN1Yl9sZXhlbWVfb3B0IGxleGJ1ZiBpMSBpMiA9XG4gIGlmIGkxID49IDAgdGhlbiBiZWdpblxuICAgIGxldCBsZW4gPSBpMi1pMSBpblxuICAgIFNvbWUgKEJ5dGVzLnN1Yl9zdHJpbmcgbGV4YnVmLmxleF9idWZmZXIgaTEgbGVuKVxuICBlbmQgZWxzZSBiZWdpblxuICAgIE5vbmVcbiAgZW5kXG5cbmxldCBzdWJfbGV4ZW1lX2NoYXIgbGV4YnVmIGkgPSBCeXRlcy5nZXQgbGV4YnVmLmxleF9idWZmZXIgaVxuXG5sZXQgc3ViX2xleGVtZV9jaGFyX29wdCBsZXhidWYgaSA9XG4gIGlmIGkgPj0gMCB0aGVuXG4gICAgU29tZSAoQnl0ZXMuZ2V0IGxleGJ1Zi5sZXhfYnVmZmVyIGkpXG4gIGVsc2VcbiAgICBOb25lXG5cblxubGV0IGxleGVtZV9jaGFyIGxleGJ1ZiBpID1cbiAgQnl0ZXMuZ2V0IGxleGJ1Zi5sZXhfYnVmZmVyIChsZXhidWYubGV4X3N0YXJ0X3BvcyArIGkpXG5cbmxldCBsZXhlbWVfc3RhcnQgbGV4YnVmID0gbGV4YnVmLmxleF9zdGFydF9wLnBvc19jbnVtXG5sZXQgbGV4ZW1lX2VuZCBsZXhidWYgPSBsZXhidWYubGV4X2N1cnJfcC5wb3NfY251bVxuXG5sZXQgbGV4ZW1lX3N0YXJ0X3AgbGV4YnVmID0gbGV4YnVmLmxleF9zdGFydF9wXG5sZXQgbGV4ZW1lX2VuZF9wIGxleGJ1ZiA9IGxleGJ1Zi5sZXhfY3Vycl9wXG5cbmxldCBuZXdfbGluZSBsZXhidWYgPVxuICBsZXQgbGNwID0gbGV4YnVmLmxleF9jdXJyX3AgaW5cbiAgaWYgbGNwICE9IGR1bW15X3BvcyB0aGVuXG4gICAgbGV4YnVmLmxleF9jdXJyX3AgPC1cbiAgICAgIHsgbGNwIHdpdGhcbiAgICAgICAgcG9zX2xudW0gPSBsY3AucG9zX2xudW0gKyAxO1xuICAgICAgICBwb3NfYm9sID0gbGNwLnBvc19jbnVtO1xuICAgICAgfVxuXG5cblxuKCogRGlzY2FyZCBkYXRhIGxlZnQgaW4gbGV4ZXIgYnVmZmVyLiAqKVxuXG5sZXQgZmx1c2hfaW5wdXQgbGIgPVxuICBsYi5sZXhfY3Vycl9wb3MgPC0gMDtcbiAgbGIubGV4X2Fic19wb3MgPC0gMDtcbiAgbGV0IGxjcCA9IGxiLmxleF9jdXJyX3AgaW5cbiAgaWYgbGNwICE9IGR1bW15X3BvcyB0aGVuXG4gICAgbGIubGV4X2N1cnJfcCA8LSB7emVyb19wb3Mgd2l0aCBwb3NfZm5hbWUgPSBsY3AucG9zX2ZuYW1lfTtcbiAgbGIubGV4X2J1ZmZlcl9sZW4gPC0gMDtcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogVGhlIHBhcnNpbmcgZW5naW5lICopXG5cbm9wZW4gTGV4aW5nXG5cbigqIEludGVybmFsIGludGVyZmFjZSB0byB0aGUgcGFyc2luZyBlbmdpbmUgKilcblxudHlwZSBwYXJzZXJfZW52ID1cbiAgeyBtdXRhYmxlIHNfc3RhY2sgOiBpbnQgYXJyYXk7ICAgICAgICAoKiBTdGF0ZXMgKilcbiAgICBtdXRhYmxlIHZfc3RhY2sgOiBPYmoudCBhcnJheTsgICAgICAoKiBTZW1hbnRpYyBhdHRyaWJ1dGVzICopXG4gICAgbXV0YWJsZSBzeW1iX3N0YXJ0X3N0YWNrIDogcG9zaXRpb24gYXJyYXk7ICgqIFN0YXJ0IHBvc2l0aW9ucyAqKVxuICAgIG11dGFibGUgc3ltYl9lbmRfc3RhY2sgOiBwb3NpdGlvbiBhcnJheTsgICAoKiBFbmQgcG9zaXRpb25zICopXG4gICAgbXV0YWJsZSBzdGFja3NpemUgOiBpbnQ7ICAgICAgICAgICAgKCogU2l6ZSBvZiB0aGUgc3RhY2tzICopXG4gICAgbXV0YWJsZSBzdGFja2Jhc2UgOiBpbnQ7ICAgICAgICAgICAgKCogQmFzZSBzcCBmb3IgY3VycmVudCBwYXJzZSAqKVxuICAgIG11dGFibGUgY3Vycl9jaGFyIDogaW50OyAgICAgICAgICAgICgqIExhc3QgdG9rZW4gcmVhZCAqKVxuICAgIG11dGFibGUgbHZhbCA6IE9iai50OyAgICAgICAgICAgICAgICgqIEl0cyBzZW1hbnRpYyBhdHRyaWJ1dGUgKilcbiAgICBtdXRhYmxlIHN5bWJfc3RhcnQgOiBwb3NpdGlvbjsgICAgICAoKiBTdGFydCBwb3MuIG9mIHRoZSBjdXJyZW50IHN5bWJvbCopXG4gICAgbXV0YWJsZSBzeW1iX2VuZCA6IHBvc2l0aW9uOyAgICAgICAgKCogRW5kIHBvcy4gb2YgdGhlIGN1cnJlbnQgc3ltYm9sICopXG4gICAgbXV0YWJsZSBhc3AgOiBpbnQ7ICAgICAgICAgICAgICAgICAgKCogVGhlIHN0YWNrIHBvaW50ZXIgZm9yIGF0dHJpYnV0ZXMgKilcbiAgICBtdXRhYmxlIHJ1bGVfbGVuIDogaW50OyAgICAgICAgICAgICAoKiBOdW1iZXIgb2YgcmhzIGl0ZW1zIGluIHRoZSBydWxlICopXG4gICAgbXV0YWJsZSBydWxlX251bWJlciA6IGludDsgICAgICAgICAgKCogUnVsZSBudW1iZXIgdG8gcmVkdWNlIGJ5ICopXG4gICAgbXV0YWJsZSBzcCA6IGludDsgICAgICAgICAgICAgICAgICAgKCogU2F2ZWQgc3AgZm9yIHBhcnNlX2VuZ2luZSAqKVxuICAgIG11dGFibGUgc3RhdGUgOiBpbnQ7ICAgICAgICAgICAgICAgICgqIFNhdmVkIHN0YXRlIGZvciBwYXJzZV9lbmdpbmUgKilcbiAgICBtdXRhYmxlIGVycmZsYWcgOiBpbnQgfSAgICAgICAgICAgICAoKiBTYXZlZCBlcnJvciBmbGFnIGZvciBwYXJzZV9lbmdpbmUgKilcbltAQHdhcm5pbmcgXCItdW51c2VkLWZpZWxkXCJdXG5cbnR5cGUgcGFyc2VfdGFibGVzID1cbiAgeyBhY3Rpb25zIDogKHBhcnNlcl9lbnYgLT4gT2JqLnQpIGFycmF5O1xuICAgIHRyYW5zbF9jb25zdCA6IGludCBhcnJheTtcbiAgICB0cmFuc2xfYmxvY2sgOiBpbnQgYXJyYXk7XG4gICAgbGhzIDogc3RyaW5nO1xuICAgIGxlbiA6IHN0cmluZztcbiAgICBkZWZyZWQgOiBzdHJpbmc7XG4gICAgZGdvdG8gOiBzdHJpbmc7XG4gICAgc2luZGV4IDogc3RyaW5nO1xuICAgIHJpbmRleCA6IHN0cmluZztcbiAgICBnaW5kZXggOiBzdHJpbmc7XG4gICAgdGFibGVzaXplIDogaW50O1xuICAgIHRhYmxlIDogc3RyaW5nO1xuICAgIGNoZWNrIDogc3RyaW5nO1xuICAgIGVycm9yX2Z1bmN0aW9uIDogc3RyaW5nIC0+IHVuaXQ7XG4gICAgbmFtZXNfY29uc3QgOiBzdHJpbmc7XG4gICAgbmFtZXNfYmxvY2sgOiBzdHJpbmcgfVxuXG5leGNlcHRpb24gWVlleGl0IG9mIE9iai50XG5leGNlcHRpb24gUGFyc2VfZXJyb3JcblxudHlwZSBwYXJzZXJfaW5wdXQgPVxuICAgIFN0YXJ0XG4gIHwgVG9rZW5fcmVhZFxuICB8IFN0YWNrc19ncm93bl8xXG4gIHwgU3RhY2tzX2dyb3duXzJcbiAgfCBTZW1hbnRpY19hY3Rpb25fY29tcHV0ZWRcbiAgfCBFcnJvcl9kZXRlY3RlZFxuXG50eXBlIHBhcnNlcl9vdXRwdXQgPVxuICAgIFJlYWRfdG9rZW5cbiAgfCBSYWlzZV9wYXJzZV9lcnJvclxuICB8IEdyb3dfc3RhY2tzXzFcbiAgfCBHcm93X3N0YWNrc18yXG4gIHwgQ29tcHV0ZV9zZW1hbnRpY19hY3Rpb25cbiAgfCBDYWxsX2Vycm9yX2Z1bmN0aW9uXG5cbigqIHRvIGF2b2lkIHdhcm5pbmdzICopXG5sZXQgXyA9IFtSZWFkX3Rva2VuOyBSYWlzZV9wYXJzZV9lcnJvcjsgR3Jvd19zdGFja3NfMTsgR3Jvd19zdGFja3NfMjtcbiAgICAgICAgIENvbXB1dGVfc2VtYW50aWNfYWN0aW9uOyBDYWxsX2Vycm9yX2Z1bmN0aW9uXVxuXG5leHRlcm5hbCBwYXJzZV9lbmdpbmUgOlxuICAgIHBhcnNlX3RhYmxlcyAtPiBwYXJzZXJfZW52IC0+IHBhcnNlcl9pbnB1dCAtPiBPYmoudCAtPiBwYXJzZXJfb3V0cHV0XG4gICAgPSBcImNhbWxfcGFyc2VfZW5naW5lXCJcblxuZXh0ZXJuYWwgc2V0X3RyYWNlOiBib29sIC0+IGJvb2xcbiAgICA9IFwiY2FtbF9zZXRfcGFyc2VyX3RyYWNlXCJcblxubGV0IGVudiA9XG4gIHsgc19zdGFjayA9IEFycmF5Lm1ha2UgMTAwIDA7XG4gICAgdl9zdGFjayA9IEFycmF5Lm1ha2UgMTAwIChPYmoucmVwciAoKSk7XG4gICAgc3ltYl9zdGFydF9zdGFjayA9IEFycmF5Lm1ha2UgMTAwIGR1bW15X3BvcztcbiAgICBzeW1iX2VuZF9zdGFjayA9IEFycmF5Lm1ha2UgMTAwIGR1bW15X3BvcztcbiAgICBzdGFja3NpemUgPSAxMDA7XG4gICAgc3RhY2tiYXNlID0gMDtcbiAgICBjdXJyX2NoYXIgPSAwO1xuICAgIGx2YWwgPSBPYmoucmVwciAoKTtcbiAgICBzeW1iX3N0YXJ0ID0gZHVtbXlfcG9zO1xuICAgIHN5bWJfZW5kID0gZHVtbXlfcG9zO1xuICAgIGFzcCA9IDA7XG4gICAgcnVsZV9sZW4gPSAwO1xuICAgIHJ1bGVfbnVtYmVyID0gMDtcbiAgICBzcCA9IDA7XG4gICAgc3RhdGUgPSAwO1xuICAgIGVycmZsYWcgPSAwIH1cblxubGV0IGdyb3dfc3RhY2tzKCkgPVxuICBsZXQgb2xkc2l6ZSA9IGVudi5zdGFja3NpemUgaW5cbiAgbGV0IG5ld3NpemUgPSBvbGRzaXplICogMiBpblxuICBsZXQgbmV3X3MgPSBBcnJheS5tYWtlIG5ld3NpemUgMFxuICBhbmQgbmV3X3YgPSBBcnJheS5tYWtlIG5ld3NpemUgKE9iai5yZXByICgpKVxuICBhbmQgbmV3X3N0YXJ0ID0gQXJyYXkubWFrZSBuZXdzaXplIGR1bW15X3Bvc1xuICBhbmQgbmV3X2VuZCA9IEFycmF5Lm1ha2UgbmV3c2l6ZSBkdW1teV9wb3MgaW5cbiAgICBBcnJheS5ibGl0IGVudi5zX3N0YWNrIDAgbmV3X3MgMCBvbGRzaXplO1xuICAgIGVudi5zX3N0YWNrIDwtIG5ld19zO1xuICAgIEFycmF5LmJsaXQgZW52LnZfc3RhY2sgMCBuZXdfdiAwIG9sZHNpemU7XG4gICAgZW52LnZfc3RhY2sgPC0gbmV3X3Y7XG4gICAgQXJyYXkuYmxpdCBlbnYuc3ltYl9zdGFydF9zdGFjayAwIG5ld19zdGFydCAwIG9sZHNpemU7XG4gICAgZW52LnN5bWJfc3RhcnRfc3RhY2sgPC0gbmV3X3N0YXJ0O1xuICAgIEFycmF5LmJsaXQgZW52LnN5bWJfZW5kX3N0YWNrIDAgbmV3X2VuZCAwIG9sZHNpemU7XG4gICAgZW52LnN5bWJfZW5kX3N0YWNrIDwtIG5ld19lbmQ7XG4gICAgZW52LnN0YWNrc2l6ZSA8LSBuZXdzaXplXG5cbmxldCBjbGVhcl9wYXJzZXIoKSA9XG4gIEFycmF5LmZpbGwgZW52LnZfc3RhY2sgMCBlbnYuc3RhY2tzaXplIChPYmoucmVwciAoKSk7XG4gIGVudi5sdmFsIDwtIE9iai5yZXByICgpXG5cbmxldCBjdXJyZW50X2xvb2thaGVhZF9mdW4gPSByZWYgKGZ1biAoXyA6IE9iai50KSAtPiBmYWxzZSlcblxubGV0IHl5cGFyc2UgdGFibGVzIHN0YXJ0IGxleGVyIGxleGJ1ZiA9XG4gIGxldCByZWMgbG9vcCBjbWQgYXJnID1cbiAgICBtYXRjaCBwYXJzZV9lbmdpbmUgdGFibGVzIGVudiBjbWQgYXJnIHdpdGhcbiAgICAgIFJlYWRfdG9rZW4gLT5cbiAgICAgICAgbGV0IHQgPSBPYmoucmVwcihsZXhlciBsZXhidWYpIGluXG4gICAgICAgIGVudi5zeW1iX3N0YXJ0IDwtIGxleGJ1Zi5sZXhfc3RhcnRfcDtcbiAgICAgICAgZW52LnN5bWJfZW5kIDwtIGxleGJ1Zi5sZXhfY3Vycl9wO1xuICAgICAgICBsb29wIFRva2VuX3JlYWQgdFxuICAgIHwgUmFpc2VfcGFyc2VfZXJyb3IgLT5cbiAgICAgICAgcmFpc2UgUGFyc2VfZXJyb3JcbiAgICB8IENvbXB1dGVfc2VtYW50aWNfYWN0aW9uIC0+XG4gICAgICAgIGxldCAoYWN0aW9uLCB2YWx1ZSkgPVxuICAgICAgICAgIHRyeVxuICAgICAgICAgICAgKFNlbWFudGljX2FjdGlvbl9jb21wdXRlZCwgdGFibGVzLmFjdGlvbnMuKGVudi5ydWxlX251bWJlcikgZW52KVxuICAgICAgICAgIHdpdGggUGFyc2VfZXJyb3IgLT5cbiAgICAgICAgICAgIChFcnJvcl9kZXRlY3RlZCwgT2JqLnJlcHIgKCkpIGluXG4gICAgICAgIGxvb3AgYWN0aW9uIHZhbHVlXG4gICAgfCBHcm93X3N0YWNrc18xIC0+XG4gICAgICAgIGdyb3dfc3RhY2tzKCk7IGxvb3AgU3RhY2tzX2dyb3duXzEgKE9iai5yZXByICgpKVxuICAgIHwgR3Jvd19zdGFja3NfMiAtPlxuICAgICAgICBncm93X3N0YWNrcygpOyBsb29wIFN0YWNrc19ncm93bl8yIChPYmoucmVwciAoKSlcbiAgICB8IENhbGxfZXJyb3JfZnVuY3Rpb24gLT5cbiAgICAgICAgdGFibGVzLmVycm9yX2Z1bmN0aW9uIFwic3ludGF4IGVycm9yXCI7XG4gICAgICAgIGxvb3AgRXJyb3JfZGV0ZWN0ZWQgKE9iai5yZXByICgpKSBpblxuICBsZXQgaW5pdF9hc3AgPSBlbnYuYXNwXG4gIGFuZCBpbml0X3NwID0gZW52LnNwXG4gIGFuZCBpbml0X3N0YWNrYmFzZSA9IGVudi5zdGFja2Jhc2VcbiAgYW5kIGluaXRfc3RhdGUgPSBlbnYuc3RhdGVcbiAgYW5kIGluaXRfY3Vycl9jaGFyID0gZW52LmN1cnJfY2hhclxuICBhbmQgaW5pdF9sdmFsID0gZW52Lmx2YWxcbiAgYW5kIGluaXRfZXJyZmxhZyA9IGVudi5lcnJmbGFnIGluXG4gIGVudi5zdGFja2Jhc2UgPC0gZW52LnNwICsgMTtcbiAgZW52LmN1cnJfY2hhciA8LSBzdGFydDtcbiAgZW52LnN5bWJfZW5kIDwtIGxleGJ1Zi5sZXhfY3Vycl9wO1xuICB0cnlcbiAgICBsb29wIFN0YXJ0IChPYmoucmVwciAoKSlcbiAgd2l0aCBleG4gLT5cbiAgICBsZXQgY3Vycl9jaGFyID0gZW52LmN1cnJfY2hhciBpblxuICAgIGVudi5hc3AgPC0gaW5pdF9hc3A7XG4gICAgZW52LnNwIDwtIGluaXRfc3A7XG4gICAgZW52LnN0YWNrYmFzZSA8LSBpbml0X3N0YWNrYmFzZTtcbiAgICBlbnYuc3RhdGUgPC0gaW5pdF9zdGF0ZTtcbiAgICBlbnYuY3Vycl9jaGFyIDwtIGluaXRfY3Vycl9jaGFyO1xuICAgIGVudi5sdmFsIDwtIGluaXRfbHZhbDtcbiAgICBlbnYuZXJyZmxhZyA8LSBpbml0X2VycmZsYWc7XG4gICAgbWF0Y2ggZXhuIHdpdGhcbiAgICAgIFlZZXhpdCB2IC0+XG4gICAgICAgIE9iai5tYWdpYyB2XG4gICAgfCBfIC0+XG4gICAgICAgIGN1cnJlbnRfbG9va2FoZWFkX2Z1biA6PVxuICAgICAgICAgIChmdW4gdG9rIC0+XG4gICAgICAgICAgICBpZiBPYmouaXNfYmxvY2sgdG9rXG4gICAgICAgICAgICB0aGVuIHRhYmxlcy50cmFuc2xfYmxvY2suKE9iai50YWcgdG9rKSA9IGN1cnJfY2hhclxuICAgICAgICAgICAgZWxzZSB0YWJsZXMudHJhbnNsX2NvbnN0LihPYmoubWFnaWMgdG9rKSA9IGN1cnJfY2hhcik7XG4gICAgICAgIHJhaXNlIGV4blxuXG5sZXQgcGVla192YWwgZW52IG4gPVxuICBPYmoubWFnaWMgZW52LnZfc3RhY2suKGVudi5hc3AgLSBuKVxuXG5sZXQgc3ltYm9sX3N0YXJ0X3BvcyAoKSA9XG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBpIDw9IDAgdGhlbiBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3ApXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHN0ID0gZW52LnN5bWJfc3RhcnRfc3RhY2suKGVudi5hc3AgLSBpICsgMSkgaW5cbiAgICAgIGxldCBlbiA9IGVudi5zeW1iX2VuZF9zdGFjay4oZW52LmFzcCAtIGkgKyAxKSBpblxuICAgICAgaWYgc3QgPD4gZW4gdGhlbiBzdCBlbHNlIGxvb3AgKGkgLSAxKVxuICAgIGVuZFxuICBpblxuICBsb29wIGVudi5ydWxlX2xlblxuXG5sZXQgc3ltYm9sX2VuZF9wb3MgKCkgPSBlbnYuc3ltYl9lbmRfc3RhY2suKGVudi5hc3ApXG5sZXQgcmhzX3N0YXJ0X3BvcyBuID0gZW52LnN5bWJfc3RhcnRfc3RhY2suKGVudi5hc3AgLSAoZW52LnJ1bGVfbGVuIC0gbikpXG5sZXQgcmhzX2VuZF9wb3MgbiA9IGVudi5zeW1iX2VuZF9zdGFjay4oZW52LmFzcCAtIChlbnYucnVsZV9sZW4gLSBuKSlcblxubGV0IHN5bWJvbF9zdGFydCAoKSA9IChzeW1ib2xfc3RhcnRfcG9zICgpKS5wb3NfY251bVxubGV0IHN5bWJvbF9lbmQgKCkgPSAoc3ltYm9sX2VuZF9wb3MgKCkpLnBvc19jbnVtXG5sZXQgcmhzX3N0YXJ0IG4gPSAocmhzX3N0YXJ0X3BvcyBuKS5wb3NfY251bVxubGV0IHJoc19lbmQgbiA9IChyaHNfZW5kX3BvcyBuKS5wb3NfY251bVxuXG5sZXQgaXNfY3VycmVudF9sb29rYWhlYWQgdG9rID1cbiAgKCFjdXJyZW50X2xvb2thaGVhZF9mdW4pKE9iai5yZXByIHRvaylcblxubGV0IHBhcnNlX2Vycm9yIChfIDogc3RyaW5nKSA9ICgpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFNldHMgb3ZlciBvcmRlcmVkIHR5cGVzICopXG5cbm1vZHVsZSB0eXBlIE9yZGVyZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGNvbXBhcmU6IHQgLT4gdCAtPiBpbnRcbiAgZW5kXG5cbm1vZHVsZSB0eXBlIFMgPVxuICBzaWdcbiAgICB0eXBlIGVsdFxuICAgIHR5cGUgdFxuICAgIHZhbCBlbXB0eTogdFxuICAgIHZhbCBpc19lbXB0eTogdCAtPiBib29sXG4gICAgdmFsIG1lbTogZWx0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBhZGQ6IGVsdCAtPiB0IC0+IHRcbiAgICB2YWwgc2luZ2xldG9uOiBlbHQgLT4gdFxuICAgIHZhbCByZW1vdmU6IGVsdCAtPiB0IC0+IHRcbiAgICB2YWwgdW5pb246IHQgLT4gdCAtPiB0XG4gICAgdmFsIGludGVyOiB0IC0+IHQgLT4gdFxuICAgIHZhbCBkaXNqb2ludDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgZGlmZjogdCAtPiB0IC0+IHRcbiAgICB2YWwgY29tcGFyZTogdCAtPiB0IC0+IGludFxuICAgIHZhbCBlcXVhbDogdCAtPiB0IC0+IGJvb2xcbiAgICB2YWwgc3Vic2V0OiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBpdGVyOiAoZWx0IC0+IHVuaXQpIC0+IHQgLT4gdW5pdFxuICAgIHZhbCBtYXA6IChlbHQgLT4gZWx0KSAtPiB0IC0+IHRcbiAgICB2YWwgZm9sZDogKGVsdCAtPiAnYSAtPiAnYSkgLT4gdCAtPiAnYSAtPiAnYVxuICAgIHZhbCBmb3JfYWxsOiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gYm9vbFxuICAgIHZhbCBleGlzdHM6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBib29sXG4gICAgdmFsIGZpbHRlcjogKGVsdCAtPiBib29sKSAtPiB0IC0+IHRcbiAgICB2YWwgZmlsdGVyX21hcDogKGVsdCAtPiBlbHQgb3B0aW9uKSAtPiB0IC0+IHRcbiAgICB2YWwgcGFydGl0aW9uOiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gdCAqIHRcbiAgICB2YWwgY2FyZGluYWw6IHQgLT4gaW50XG4gICAgdmFsIGVsZW1lbnRzOiB0IC0+IGVsdCBsaXN0XG4gICAgdmFsIG1pbl9lbHQ6IHQgLT4gZWx0XG4gICAgdmFsIG1pbl9lbHRfb3B0OiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgbWF4X2VsdDogdCAtPiBlbHRcbiAgICB2YWwgbWF4X2VsdF9vcHQ6IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBjaG9vc2U6IHQgLT4gZWx0XG4gICAgdmFsIGNob29zZV9vcHQ6IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBzcGxpdDogZWx0IC0+IHQgLT4gdCAqIGJvb2wgKiB0XG4gICAgdmFsIGZpbmQ6IGVsdCAtPiB0IC0+IGVsdFxuICAgIHZhbCBmaW5kX29wdDogZWx0IC0+IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBmaW5kX2ZpcnN0OiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gZWx0XG4gICAgdmFsIGZpbmRfZmlyc3Rfb3B0OiAoZWx0IC0+IGJvb2wpIC0+IHQgLT4gZWx0IG9wdGlvblxuICAgIHZhbCBmaW5kX2xhc3Q6IChlbHQgLT4gYm9vbCkgLT4gdCAtPiBlbHRcbiAgICB2YWwgZmluZF9sYXN0X29wdDogKGVsdCAtPiBib29sKSAtPiB0IC0+IGVsdCBvcHRpb25cbiAgICB2YWwgb2ZfbGlzdDogZWx0IGxpc3QgLT4gdFxuICAgIHZhbCB0b19zZXFfZnJvbSA6IGVsdCAtPiB0IC0+IGVsdCBTZXEudFxuICAgIHZhbCB0b19zZXEgOiB0IC0+IGVsdCBTZXEudFxuICAgIHZhbCB0b19yZXZfc2VxIDogdCAtPiBlbHQgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6IGVsdCBTZXEudCAtPiB0IC0+IHRcbiAgICB2YWwgb2Zfc2VxIDogZWx0IFNlcS50IC0+IHRcbiAgZW5kXG5cbm1vZHVsZSBNYWtlKE9yZDogT3JkZXJlZFR5cGUpID1cbiAgc3RydWN0XG4gICAgdHlwZSBlbHQgPSBPcmQudFxuICAgIHR5cGUgdCA9IEVtcHR5IHwgTm9kZSBvZiB7bDp0OyB2OmVsdDsgcjp0OyBoOmludH1cblxuICAgICgqIFNldHMgYXJlIHJlcHJlc2VudGVkIGJ5IGJhbGFuY2VkIGJpbmFyeSB0cmVlcyAodGhlIGhlaWdodHMgb2YgdGhlXG4gICAgICAgY2hpbGRyZW4gZGlmZmVyIGJ5IGF0IG1vc3QgMiAqKVxuXG4gICAgbGV0IGhlaWdodCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IDBcbiAgICAgIHwgTm9kZSB7aH0gLT4gaFxuXG4gICAgKCogQ3JlYXRlcyBhIG5ldyBub2RlIHdpdGggbGVmdCBzb24gbCwgdmFsdWUgdiBhbmQgcmlnaHQgc29uIHIuXG4gICAgICAgV2UgbXVzdCBoYXZlIGFsbCBlbGVtZW50cyBvZiBsIDwgdiA8IGFsbCBlbGVtZW50cyBvZiByLlxuICAgICAgIGwgYW5kIHIgbXVzdCBiZSBiYWxhbmNlZCBhbmQgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMi5cbiAgICAgICBJbmxpbmUgZXhwYW5zaW9uIG9mIGhlaWdodCBmb3IgYmV0dGVyIHNwZWVkLiAqKVxuXG4gICAgbGV0IGNyZWF0ZSBsIHYgciA9XG4gICAgICBsZXQgaGwgPSBtYXRjaCBsIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgTm9kZXtsOyB2OyByOyBoPShpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSl9XG5cbiAgICAoKiBTYW1lIGFzIGNyZWF0ZSwgYnV0IHBlcmZvcm1zIG9uZSBzdGVwIG9mIHJlYmFsYW5jaW5nIGlmIG5lY2Vzc2FyeS5cbiAgICAgICBBc3N1bWVzIGwgYW5kIHIgYmFsYW5jZWQgYW5kIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDMuXG4gICAgICAgSW5saW5lIGV4cGFuc2lvbiBvZiBjcmVhdGUgZm9yIGJldHRlciBzcGVlZCBpbiB0aGUgbW9zdCBmcmVxdWVudCBjYXNlXG4gICAgICAgd2hlcmUgbm8gcmViYWxhbmNpbmcgaXMgcmVxdWlyZWQuICopXG5cbiAgICBsZXQgYmFsIGwgdiByID1cbiAgICAgIGxldCBobCA9IG1hdGNoIGwgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgbGV0IGhyID0gbWF0Y2ggciB3aXRoIEVtcHR5IC0+IDAgfCBOb2RlIHtofSAtPiBoIGluXG4gICAgICBpZiBobCA+IGhyICsgMiB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgIHwgTm9kZXtsPWxsOyB2PWx2OyByPWxyfSAtPlxuICAgICAgICAgICAgaWYgaGVpZ2h0IGxsID49IGhlaWdodCBsciB0aGVuXG4gICAgICAgICAgICAgIGNyZWF0ZSBsbCBsdiAoY3JlYXRlIGxyIHYgcilcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggbHIgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiU2V0LmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPWxybDsgdj1scnY7IHI9bHJyfS0+XG4gICAgICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBscmwpIGxydiAoY3JlYXRlIGxyciB2IHIpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGVuZCBlbHNlIGlmIGhyID4gaGwgKyAyIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQuYmFsXCJcbiAgICAgICAgfCBOb2Rle2w9cmw7IHY9cnY7IHI9cnJ9IC0+XG4gICAgICAgICAgICBpZiBoZWlnaHQgcnIgPj0gaGVpZ2h0IHJsIHRoZW5cbiAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB2IHJsKSBydiByclxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBtYXRjaCBybCB3aXRoXG4gICAgICAgICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQuYmFsXCJcbiAgICAgICAgICAgICAgfCBOb2Rle2w9cmxsOyB2PXJsdjsgcj1ybHJ9IC0+XG4gICAgICAgICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsIHYgcmxsKSBybHYgKGNyZWF0ZSBybHIgcnYgcnIpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGVuZCBlbHNlXG4gICAgICAgIE5vZGV7bDsgdjsgcjsgaD0oaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpfVxuXG4gICAgKCogSW5zZXJ0aW9uIG9mIG9uZSBlbGVtZW50ICopXG5cbiAgICBsZXQgcmVjIGFkZCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9kZXtsPUVtcHR5OyB2PXg7IHI9RW1wdHk7IGg9MX1cbiAgICAgIHwgTm9kZXtsOyB2OyByfSBhcyB0IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIHQgZWxzZVxuICAgICAgICAgIGlmIGMgPCAwIHRoZW5cbiAgICAgICAgICAgIGxldCBsbCA9IGFkZCB4IGwgaW5cbiAgICAgICAgICAgIGlmIGwgPT0gbGwgdGhlbiB0IGVsc2UgYmFsIGxsIHYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IGFkZCB4IHIgaW5cbiAgICAgICAgICAgIGlmIHIgPT0gcnIgdGhlbiB0IGVsc2UgYmFsIGwgdiByclxuXG4gICAgbGV0IHNpbmdsZXRvbiB4ID0gTm9kZXtsPUVtcHR5OyB2PXg7IHI9RW1wdHk7IGg9MX1cblxuICAgICgqIEJld2FyZTogdGhvc2UgdHdvIGZ1bmN0aW9ucyBhc3N1bWUgdGhhdCB0aGUgYWRkZWQgdiBpcyAqc3RyaWN0bHkqXG4gICAgICAgc21hbGxlciAob3IgYmlnZ2VyKSB0aGFuIGFsbCB0aGUgcHJlc2VudCBlbGVtZW50cyBpbiB0aGUgdHJlZTsgaXRcbiAgICAgICBkb2VzIG5vdCB0ZXN0IGZvciBlcXVhbGl0eSB3aXRoIHRoZSBjdXJyZW50IG1pbiAob3IgbWF4KSBlbGVtZW50LlxuICAgICAgIEluZGVlZCwgdGhleSBhcmUgb25seSB1c2VkIGR1cmluZyB0aGUgXCJqb2luXCIgb3BlcmF0aW9uIHdoaWNoXG4gICAgICAgcmVzcGVjdHMgdGhpcyBwcmVjb25kaXRpb24uXG4gICAgKilcblxuICAgIGxldCByZWMgYWRkX21pbl9lbGVtZW50IHggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBzaW5nbGV0b24geFxuICAgICAgfCBOb2RlIHtsOyB2OyByfSAtPlxuICAgICAgICBiYWwgKGFkZF9taW5fZWxlbWVudCB4IGwpIHYgclxuXG4gICAgbGV0IHJlYyBhZGRfbWF4X2VsZW1lbnQgeCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IHNpbmdsZXRvbiB4XG4gICAgICB8IE5vZGUge2w7IHY7IHJ9IC0+XG4gICAgICAgIGJhbCBsIHYgKGFkZF9tYXhfZWxlbWVudCB4IHIpXG5cbiAgICAoKiBTYW1lIGFzIGNyZWF0ZSBhbmQgYmFsLCBidXQgbm8gYXNzdW1wdGlvbnMgYXJlIG1hZGUgb24gdGhlXG4gICAgICAgcmVsYXRpdmUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuXG4gICAgbGV0IHJlYyBqb2luIGwgdiByID1cbiAgICAgIG1hdGNoIChsLCByKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgLT4gYWRkX21pbl9lbGVtZW50IHYgclxuICAgICAgfCAoXywgRW1wdHkpIC0+IGFkZF9tYXhfZWxlbWVudCB2IGxcbiAgICAgIHwgKE5vZGV7bD1sbDsgdj1sdjsgcj1scjsgaD1saH0sIE5vZGV7bD1ybDsgdj1ydjsgcj1ycjsgaD1yaH0pIC0+XG4gICAgICAgICAgaWYgbGggPiByaCArIDIgdGhlbiBiYWwgbGwgbHYgKGpvaW4gbHIgdiByKSBlbHNlXG4gICAgICAgICAgaWYgcmggPiBsaCArIDIgdGhlbiBiYWwgKGpvaW4gbCB2IHJsKSBydiByciBlbHNlXG4gICAgICAgICAgY3JlYXRlIGwgdiByXG5cbiAgICAoKiBTbWFsbGVzdCBhbmQgZ3JlYXRlc3QgZWxlbWVudCBvZiBhIHNldCAqKVxuXG4gICAgbGV0IHJlYyBtaW5fZWx0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7bD1FbXB0eTsgdn0gLT4gdlxuICAgICAgfCBOb2Rle2x9IC0+IG1pbl9lbHQgbFxuXG4gICAgbGV0IHJlYyBtaW5fZWx0X29wdCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZXtsPUVtcHR5OyB2fSAtPiBTb21lIHZcbiAgICAgIHwgTm9kZXtsfSAtPiBtaW5fZWx0X29wdCBsXG5cbiAgICBsZXQgcmVjIG1heF9lbHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZXt2OyByPUVtcHR5fSAtPiB2XG4gICAgICB8IE5vZGV7cn0gLT4gbWF4X2VsdCByXG5cbiAgICBsZXQgcmVjIG1heF9lbHRfb3B0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2Rle3Y7IHI9RW1wdHl9IC0+IFNvbWUgdlxuICAgICAgfCBOb2Rle3J9IC0+IG1heF9lbHRfb3B0IHJcblxuICAgICgqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBvZiB0aGUgZ2l2ZW4gc2V0ICopXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9taW5fZWx0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQucmVtb3ZlX21pbl9lbHRcIlxuICAgICAgfCBOb2Rle2w9RW1wdHk7IHJ9IC0+IHJcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBiYWwgKHJlbW92ZV9taW5fZWx0IGwpIHYgclxuXG4gICAgKCogTWVyZ2UgdHdvIHRyZWVzIGwgYW5kIHIgaW50byBvbmUuXG4gICAgICAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICAgIEFzc3VtZSB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAyLiAqKVxuXG4gICAgbGV0IG1lcmdlIHQxIHQyID1cbiAgICAgIG1hdGNoICh0MSwgdDIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCB0KSAtPiB0XG4gICAgICB8ICh0LCBFbXB0eSkgLT4gdFxuICAgICAgfCAoXywgXykgLT4gYmFsIHQxIChtaW5fZWx0IHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpXG5cbiAgICAoKiBNZXJnZSB0d28gdHJlZXMgbCBhbmQgciBpbnRvIG9uZS5cbiAgICAgICBBbGwgZWxlbWVudHMgb2YgbCBtdXN0IHByZWNlZGUgdGhlIGVsZW1lbnRzIG9mIHIuXG4gICAgICAgTm8gYXNzdW1wdGlvbiBvbiB0aGUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuXG4gICAgbGV0IGNvbmNhdCB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+IGpvaW4gdDEgKG1pbl9lbHQgdDIpIChyZW1vdmVfbWluX2VsdCB0MilcblxuICAgICgqIFNwbGl0dGluZy4gIHNwbGl0IHggcyByZXR1cm5zIGEgdHJpcGxlIChsLCBwcmVzZW50LCByKSB3aGVyZVxuICAgICAgICAtIGwgaXMgdGhlIHNldCBvZiBlbGVtZW50cyBvZiBzIHRoYXQgYXJlIDwgeFxuICAgICAgICAtIHIgaXMgdGhlIHNldCBvZiBlbGVtZW50cyBvZiBzIHRoYXQgYXJlID4geFxuICAgICAgICAtIHByZXNlbnQgaXMgZmFsc2UgaWYgcyBjb250YWlucyBubyBlbGVtZW50IGVxdWFsIHRvIHgsXG4gICAgICAgICAgb3IgdHJ1ZSBpZiBzIGNvbnRhaW5zIGFuIGVsZW1lbnQgZXF1YWwgdG8geC4gKilcblxuICAgIGxldCByZWMgc3BsaXQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgKEVtcHR5LCBmYWxzZSwgRW1wdHkpXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gKGwsIHRydWUsIHIpXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgKGxsLCBwcmVzLCBybCkgPSBzcGxpdCB4IGwgaW4gKGxsLCBwcmVzLCBqb2luIHJsIHYgcilcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgKGxyLCBwcmVzLCBycikgPSBzcGxpdCB4IHIgaW4gKGpvaW4gbCB2IGxyLCBwcmVzLCBycilcblxuICAgICgqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXQgb3BlcmF0aW9ucyAqKVxuXG4gICAgbGV0IGVtcHR5ID0gRW1wdHlcblxuICAgIGxldCBpc19lbXB0eSA9IGZ1bmN0aW9uIEVtcHR5IC0+IHRydWUgfCBfIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVjIG1lbSB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gZmFsc2VcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgYyA9IDAgfHwgbWVtIHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIHJlbW92ZSB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgKE5vZGV7bDsgdjsgcn0gYXMgdCkgLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gbWVyZ2UgbCByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgICBsZXQgbGwgPSByZW1vdmUgeCBsIGluXG4gICAgICAgICAgICAgIGlmIGwgPT0gbGwgdGhlbiB0XG4gICAgICAgICAgICAgIGVsc2UgYmFsIGxsIHYgclxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBsZXQgcnIgPSByZW1vdmUgeCByIGluXG4gICAgICAgICAgICAgIGlmIHIgPT0gcnIgdGhlbiB0XG4gICAgICAgICAgICAgIGVsc2UgYmFsIGwgdiByclxuXG4gICAgbGV0IHJlYyB1bmlvbiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdDIpIC0+IHQyXG4gICAgICB8ICh0MSwgRW1wdHkpIC0+IHQxXG4gICAgICB8IChOb2Rle2w9bDE7IHY9djE7IHI9cjE7IGg9aDF9LCBOb2Rle2w9bDI7IHY9djI7IHI9cjI7IGg9aDJ9KSAtPlxuICAgICAgICAgIGlmIGgxID49IGgyIHRoZW5cbiAgICAgICAgICAgIGlmIGgyID0gMSB0aGVuIGFkZCB2MiBzMSBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIGxldCAobDIsIF8sIHIyKSA9IHNwbGl0IHYxIHMyIGluXG4gICAgICAgICAgICAgIGpvaW4gKHVuaW9uIGwxIGwyKSB2MSAodW5pb24gcjEgcjIpXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpZiBoMSA9IDEgdGhlbiBhZGQgdjEgczIgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBsZXQgKGwxLCBfLCByMSkgPSBzcGxpdCB2MiBzMSBpblxuICAgICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikgdjIgKHVuaW9uIHIxIHIyKVxuICAgICAgICAgICAgZW5kXG5cbiAgICBsZXQgcmVjIGludGVyIHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSAtPiBFbXB0eVxuICAgICAgfCAoXywgRW1wdHkpIC0+IEVtcHR5XG4gICAgICB8IChOb2Rle2w9bDE7IHY9djE7IHI9cjF9LCB0MikgLT5cbiAgICAgICAgICBtYXRjaCBzcGxpdCB2MSB0MiB3aXRoXG4gICAgICAgICAgICAobDIsIGZhbHNlLCByMikgLT5cbiAgICAgICAgICAgICAgY29uY2F0IChpbnRlciBsMSBsMikgKGludGVyIHIxIHIyKVxuICAgICAgICAgIHwgKGwyLCB0cnVlLCByMikgLT5cbiAgICAgICAgICAgICAgam9pbiAoaW50ZXIgbDEgbDIpIHYxIChpbnRlciByMSByMilcblxuICAgICgqIFNhbWUgYXMgc3BsaXQsIGJ1dCBjb21wdXRlIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlc1xuICAgICAgIG9ubHkgaWYgdGhlIHBpdm90IGVsZW1lbnQgaXMgbm90IGluIHRoZSBzZXQuICBUaGUgcmlnaHQgc3VidHJlZVxuICAgICAgIGlzIGNvbXB1dGVkIG9uIGRlbWFuZC4gKilcblxuICAgIHR5cGUgc3BsaXRfYmlzID1cbiAgICAgIHwgRm91bmRcbiAgICAgIHwgTm90Rm91bmQgb2YgdCAqICh1bml0IC0+IHQpXG5cbiAgICBsZXQgcmVjIHNwbGl0X2JpcyB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb3RGb3VuZCAoRW1wdHksIChmdW4gKCkgLT4gRW1wdHkpKVxuICAgICAgfCBOb2Rle2w7IHY7IHI7IF99IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIEZvdW5kXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBtYXRjaCBzcGxpdF9iaXMgeCBsIHdpdGhcbiAgICAgICAgICAgIHwgRm91bmQgLT4gRm91bmRcbiAgICAgICAgICAgIHwgTm90Rm91bmQgKGxsLCBybCkgLT4gTm90Rm91bmQgKGxsLCAoZnVuICgpIC0+IGpvaW4gKHJsICgpKSB2IHIpKVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hdGNoIHNwbGl0X2JpcyB4IHIgd2l0aFxuICAgICAgICAgICAgfCBGb3VuZCAtPiBGb3VuZFxuICAgICAgICAgICAgfCBOb3RGb3VuZCAobHIsIHJyKSAtPiBOb3RGb3VuZCAoam9pbiBsIHYgbHIsIHJyKVxuXG4gICAgbGV0IHJlYyBkaXNqb2ludCBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgXykgfCAoXywgRW1wdHkpIC0+IHRydWVcbiAgICAgIHwgKE5vZGV7bD1sMTsgdj12MTsgcj1yMX0sIHQyKSAtPlxuICAgICAgICAgIGlmIHMxID09IHMyIHRoZW4gZmFsc2VcbiAgICAgICAgICBlbHNlIG1hdGNoIHNwbGl0X2JpcyB2MSB0MiB3aXRoXG4gICAgICAgICAgICAgIE5vdEZvdW5kKGwyLCByMikgLT4gZGlzam9pbnQgbDEgbDIgJiYgZGlzam9pbnQgcjEgKHIyICgpKVxuICAgICAgICAgICAgfCBGb3VuZCAtPiBmYWxzZVxuXG4gICAgbGV0IHJlYyBkaWZmIHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBfKSAtPiBFbXB0eVxuICAgICAgfCAodDEsIEVtcHR5KSAtPiB0MVxuICAgICAgfCAoTm9kZXtsPWwxOyB2PXYxOyByPXIxfSwgdDIpIC0+XG4gICAgICAgICAgbWF0Y2ggc3BsaXQgdjEgdDIgd2l0aFxuICAgICAgICAgICAgKGwyLCBmYWxzZSwgcjIpIC0+XG4gICAgICAgICAgICAgIGpvaW4gKGRpZmYgbDEgbDIpIHYxIChkaWZmIHIxIHIyKVxuICAgICAgICAgIHwgKGwyLCB0cnVlLCByMikgLT5cbiAgICAgICAgICAgICAgY29uY2F0IChkaWZmIGwxIGwyKSAoZGlmZiByMSByMilcblxuICAgIHR5cGUgZW51bWVyYXRpb24gPSBFbmQgfCBNb3JlIG9mIGVsdCAqIHQgKiBlbnVtZXJhdGlvblxuXG4gICAgbGV0IHJlYyBjb25zX2VudW0gcyBlID1cbiAgICAgIG1hdGNoIHMgd2l0aFxuICAgICAgICBFbXB0eSAtPiBlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gY29uc19lbnVtIGwgKE1vcmUodiwgciwgZSkpXG5cbiAgICBsZXQgcmVjIGNvbXBhcmVfYXV4IGUxIGUyID1cbiAgICAgICAgbWF0Y2ggKGUxLCBlMikgd2l0aFxuICAgICAgICAoRW5kLCBFbmQpIC0+IDBcbiAgICAgIHwgKEVuZCwgXykgIC0+IC0xXG4gICAgICB8IChfLCBFbmQpIC0+IDFcbiAgICAgIHwgKE1vcmUodjEsIHIxLCBlMSksIE1vcmUodjIsIHIyLCBlMikpIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB2MSB2MiBpblxuICAgICAgICAgIGlmIGMgPD4gMFxuICAgICAgICAgIHRoZW4gY1xuICAgICAgICAgIGVsc2UgY29tcGFyZV9hdXggKGNvbnNfZW51bSByMSBlMSkgKGNvbnNfZW51bSByMiBlMilcblxuICAgIGxldCBjb21wYXJlIHMxIHMyID1cbiAgICAgIGNvbXBhcmVfYXV4IChjb25zX2VudW0gczEgRW5kKSAoY29uc19lbnVtIHMyIEVuZClcblxuICAgIGxldCBlcXVhbCBzMSBzMiA9XG4gICAgICBjb21wYXJlIHMxIHMyID0gMFxuXG4gICAgbGV0IHJlYyBzdWJzZXQgczEgczIgPVxuICAgICAgbWF0Y2ggKHMxLCBzMikgd2l0aFxuICAgICAgICBFbXB0eSwgXyAtPlxuICAgICAgICAgIHRydWVcbiAgICAgIHwgXywgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBOb2RlIHtsPWwxOyB2PXYxOyByPXIxfSwgKE5vZGUge2w9bDI7IHY9djI7IHI9cjJ9IGFzIHQyKSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgdjEgdjIgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuXG4gICAgICAgICAgICBzdWJzZXQgbDEgbDIgJiYgc3Vic2V0IHIxIHIyXG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBzdWJzZXQgKE5vZGUge2w9bDE7IHY9djE7IHI9RW1wdHk7IGg9MH0pIGwyICYmIHN1YnNldCByMSB0MlxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHN1YnNldCAoTm9kZSB7bD1FbXB0eTsgdj12MTsgcj1yMTsgaD0wfSkgcjIgJiYgc3Vic2V0IGwxIHQyXG5cbiAgICBsZXQgcmVjIGl0ZXIgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+ICgpXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gaXRlciBmIGw7IGYgdjsgaXRlciBmIHJcblxuICAgIGxldCByZWMgZm9sZCBmIHMgYWNjdSA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IGZvbGQgZiByIChmIHYgKGZvbGQgZiBsIGFjY3UpKVxuXG4gICAgbGV0IHJlYyBmb3JfYWxsIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiB0cnVlXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT4gcCB2ICYmIGZvcl9hbGwgcCBsICYmIGZvcl9hbGwgcCByXG5cbiAgICBsZXQgcmVjIGV4aXN0cyBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gZmFsc2VcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBwIHYgfHwgZXhpc3RzIHAgbCB8fCBleGlzdHMgcCByXG5cbiAgICBsZXQgcmVjIGZpbHRlciBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgKE5vZGV7bDsgdjsgcn0pIGFzIHQgLT5cbiAgICAgICAgICAoKiBjYWxsIFtwXSBpbiB0aGUgZXhwZWN0ZWQgbGVmdC10by1yaWdodCBvcmRlciAqKVxuICAgICAgICAgIGxldCBsJyA9IGZpbHRlciBwIGwgaW5cbiAgICAgICAgICBsZXQgcHYgPSBwIHYgaW5cbiAgICAgICAgICBsZXQgcicgPSBmaWx0ZXIgcCByIGluXG4gICAgICAgICAgaWYgcHYgdGhlblxuICAgICAgICAgICAgaWYgbD09bCcgJiYgcj09cicgdGhlbiB0IGVsc2Ugam9pbiBsJyB2IHInXG4gICAgICAgICAgZWxzZSBjb25jYXQgbCcgcidcblxuICAgIGxldCByZWMgcGFydGl0aW9uIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAoRW1wdHksIEVtcHR5KVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgKCogY2FsbCBbcF0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgKGx0LCBsZikgPSBwYXJ0aXRpb24gcCBsIGluXG4gICAgICAgICAgbGV0IHB2ID0gcCB2IGluXG4gICAgICAgICAgbGV0IChydCwgcmYpID0gcGFydGl0aW9uIHAgciBpblxuICAgICAgICAgIGlmIHB2XG4gICAgICAgICAgdGhlbiAoam9pbiBsdCB2IHJ0LCBjb25jYXQgbGYgcmYpXG4gICAgICAgICAgZWxzZSAoY29uY2F0IGx0IHJ0LCBqb2luIGxmIHYgcmYpXG5cbiAgICBsZXQgcmVjIGNhcmRpbmFsID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gMFxuICAgICAgfCBOb2Rle2w7IHJ9IC0+IGNhcmRpbmFsIGwgKyAxICsgY2FyZGluYWwgclxuXG4gICAgbGV0IHJlYyBlbGVtZW50c19hdXggYWNjdSA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPiBlbGVtZW50c19hdXggKHYgOjogZWxlbWVudHNfYXV4IGFjY3UgcikgbFxuXG4gICAgbGV0IGVsZW1lbnRzIHMgPVxuICAgICAgZWxlbWVudHNfYXV4IFtdIHNcblxuICAgIGxldCBjaG9vc2UgPSBtaW5fZWx0XG5cbiAgICBsZXQgY2hvb3NlX29wdCA9IG1pbl9lbHRfb3B0XG5cbiAgICBsZXQgcmVjIGZpbmQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIHZcbiAgICAgICAgICBlbHNlIGZpbmQgeCAoaWYgYyA8IDAgdGhlbiBsIGVsc2UgcilcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9hdXggdjAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2IGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYwIGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdF9vcHRfYXV4IHYwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIFNvbWUgdjBcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdjAgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3Rfb3B0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdF9hdXggdiBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X29wdCBmIHJcblxuICAgIGxldCByZWMgZmluZF9sYXN0X2F1eCB2MCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICB2MFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9hdXggdiBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYwIGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3QgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IE5vZGV7bDsgdjsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2IGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0X29wdF9hdXggdjAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgU29tZSB2MFxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdjAgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9vcHQgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgTm9uZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X29wdCBmIGxcblxuICAgIGxldCByZWMgZmluZF9vcHQgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IE5vbmVcbiAgICAgIHwgTm9kZXtsOyB2OyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBTb21lIHZcbiAgICAgICAgICBlbHNlIGZpbmRfb3B0IHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgdHJ5X2pvaW4gbCB2IHIgPVxuICAgICAgKCogW2pvaW4gbCB2IHJdIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIChlbGVtZW50cyBvZiBsIDwgdiA8XG4gICAgICAgICBlbGVtZW50cyBvZiByKTsgdXNlIFt0cnlfam9pbiBsIHYgcl0gd2hlbiB0aGlzIHByb3BlcnR5IG1heVxuICAgICAgICAgbm90IGhvbGQsIGJ1dCB5b3UgaG9wZSBpdCBkb2VzIGhvbGQgaW4gdGhlIGNvbW1vbiBjYXNlICopXG4gICAgICBpZiAobCA9IEVtcHR5IHx8IE9yZC5jb21wYXJlIChtYXhfZWx0IGwpIHYgPCAwKVxuICAgICAgJiYgKHIgPSBFbXB0eSB8fCBPcmQuY29tcGFyZSB2IChtaW5fZWx0IHIpIDwgMClcbiAgICAgIHRoZW4gam9pbiBsIHYgclxuICAgICAgZWxzZSB1bmlvbiBsIChhZGQgdiByKVxuXG4gICAgbGV0IHJlYyBtYXAgZiA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gYXMgdCAtPlxuICAgICAgICAgKCogZW5mb3JjZSBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgKilcbiAgICAgICAgIGxldCBsJyA9IG1hcCBmIGwgaW5cbiAgICAgICAgIGxldCB2JyA9IGYgdiBpblxuICAgICAgICAgbGV0IHInID0gbWFwIGYgciBpblxuICAgICAgICAgaWYgbCA9PSBsJyAmJiB2ID09IHYnICYmIHIgPT0gcicgdGhlbiB0XG4gICAgICAgICBlbHNlIHRyeV9qb2luIGwnIHYnIHInXG5cbiAgICBsZXQgdHJ5X2NvbmNhdCB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+IHRyeV9qb2luIHQxIChtaW5fZWx0IHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpXG5cbiAgICBsZXQgcmVjIGZpbHRlcl9tYXAgZiA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IE5vZGV7bDsgdjsgcn0gYXMgdCAtPlxuICAgICAgICAgKCogZW5mb3JjZSBsZWZ0LXRvLXJpZ2h0IGV2YWx1YXRpb24gb3JkZXIgKilcbiAgICAgICAgIGxldCBsJyA9IGZpbHRlcl9tYXAgZiBsIGluXG4gICAgICAgICBsZXQgdicgPSBmIHYgaW5cbiAgICAgICAgIGxldCByJyA9IGZpbHRlcl9tYXAgZiByIGluXG4gICAgICAgICBiZWdpbiBtYXRjaCB2JyB3aXRoXG4gICAgICAgICAgIHwgU29tZSB2JyAtPlxuICAgICAgICAgICAgICBpZiBsID09IGwnICYmIHYgPT0gdicgJiYgciA9PSByJyB0aGVuIHRcbiAgICAgICAgICAgICAgZWxzZSB0cnlfam9pbiBsJyB2JyByJ1xuICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgdHJ5X2NvbmNhdCBsJyByJ1xuICAgICAgICAgZW5kXG5cbiAgICBsZXQgb2Zfc29ydGVkX2xpc3QgbCA9XG4gICAgICBsZXQgcmVjIHN1YiBuIGwgPVxuICAgICAgICBtYXRjaCBuLCBsIHdpdGhcbiAgICAgICAgfCAwLCBsIC0+IEVtcHR5LCBsXG4gICAgICAgIHwgMSwgeDAgOjogbCAtPiBOb2RlIHtsPUVtcHR5OyB2PXgwOyByPUVtcHR5OyBoPTF9LCBsXG4gICAgICAgIHwgMiwgeDAgOjogeDEgOjogbCAtPlxuICAgICAgICAgICAgTm9kZXtsPU5vZGV7bD1FbXB0eTsgdj14MDsgcj1FbXB0eTsgaD0xfTsgdj14MTsgcj1FbXB0eTsgaD0yfSwgbFxuICAgICAgICB8IDMsIHgwIDo6IHgxIDo6IHgyIDo6IGwgLT5cbiAgICAgICAgICAgIE5vZGV7bD1Ob2Rle2w9RW1wdHk7IHY9eDA7IHI9RW1wdHk7IGg9MX07IHY9eDE7XG4gICAgICAgICAgICAgICAgIHI9Tm9kZXtsPUVtcHR5OyB2PXgyOyByPUVtcHR5OyBoPTF9OyBoPTJ9LCBsXG4gICAgICAgIHwgbiwgbCAtPlxuICAgICAgICAgIGxldCBubCA9IG4gLyAyIGluXG4gICAgICAgICAgbGV0IGxlZnQsIGwgPSBzdWIgbmwgbCBpblxuICAgICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICAgIHwgW10gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgfCBtaWQgOjogbCAtPlxuICAgICAgICAgICAgbGV0IHJpZ2h0LCBsID0gc3ViIChuIC0gbmwgLSAxKSBsIGluXG4gICAgICAgICAgICBjcmVhdGUgbGVmdCBtaWQgcmlnaHQsIGxcbiAgICAgIGluXG4gICAgICBmc3QgKHN1YiAoTGlzdC5sZW5ndGggbCkgbClcblxuICAgIGxldCBvZl9saXN0IGwgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IFtdIC0+IGVtcHR5XG4gICAgICB8IFt4MF0gLT4gc2luZ2xldG9uIHgwXG4gICAgICB8IFt4MDsgeDFdIC0+IGFkZCB4MSAoc2luZ2xldG9uIHgwKVxuICAgICAgfCBbeDA7IHgxOyB4Ml0gLT4gYWRkIHgyIChhZGQgeDEgKHNpbmdsZXRvbiB4MCkpXG4gICAgICB8IFt4MDsgeDE7IHgyOyB4M10gLT4gYWRkIHgzIChhZGQgeDIgKGFkZCB4MSAoc2luZ2xldG9uIHgwKSkpXG4gICAgICB8IFt4MDsgeDE7IHgyOyB4MzsgeDRdIC0+IGFkZCB4NCAoYWRkIHgzIChhZGQgeDIgKGFkZCB4MSAoc2luZ2xldG9uIHgwKSkpKVxuICAgICAgfCBfIC0+IG9mX3NvcnRlZF9saXN0IChMaXN0LnNvcnRfdW5pcSBPcmQuY29tcGFyZSBsKVxuXG4gICAgbGV0IGFkZF9zZXEgaSBtID1cbiAgICAgIFNlcS5mb2xkX2xlZnQgKGZ1biBzIHggLT4gYWRkIHggcykgbSBpXG5cbiAgICBsZXQgb2Zfc2VxIGkgPSBhZGRfc2VxIGkgZW1wdHlcblxuICAgIGxldCByZWMgc2VxX29mX2VudW1fIGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICAgIHwgRW5kIC0+IFNlcS5OaWxcbiAgICAgIHwgTW9yZSAoeCwgdCwgcmVzdCkgLT4gU2VxLkNvbnMgKHgsIHNlcV9vZl9lbnVtXyAoY29uc19lbnVtIHQgcmVzdCkpXG5cbiAgICBsZXQgdG9fc2VxIGMgPSBzZXFfb2ZfZW51bV8gKGNvbnNfZW51bSBjIEVuZClcblxuICAgIGxldCByZWMgc25vY19lbnVtIHMgZSA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgICAgRW1wdHkgLT4gZVxuICAgICAgfCBOb2Rle2w7IHY7IHJ9IC0+IHNub2NfZW51bSByIChNb3JlKHYsIGwsIGUpKVxuXG4gICAgbGV0IHJlYyByZXZfc2VxX29mX2VudW1fIGMgKCkgPSBtYXRjaCBjIHdpdGhcbiAgICAgIHwgRW5kIC0+IFNlcS5OaWxcbiAgICAgIHwgTW9yZSAoeCwgdCwgcmVzdCkgLT4gU2VxLkNvbnMgKHgsIHJldl9zZXFfb2ZfZW51bV8gKHNub2NfZW51bSB0IHJlc3QpKVxuXG4gICAgbGV0IHRvX3Jldl9zZXEgYyA9IHJldl9zZXFfb2ZfZW51bV8gKHNub2NfZW51bSBjIEVuZClcblxuICAgIGxldCB0b19zZXFfZnJvbSBsb3cgcyA9XG4gICAgICBsZXQgcmVjIGF1eCBsb3cgcyBjID0gbWF0Y2ggcyB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gY1xuICAgICAgICB8IE5vZGUge2w7IHI7IHY7IF99IC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBPcmQuY29tcGFyZSB2IGxvdyB3aXRoXG4gICAgICAgICAgICAgIHwgMCAtPiBNb3JlICh2LCByLCBjKVxuICAgICAgICAgICAgICB8IG4gd2hlbiBuPDAgLT4gYXV4IGxvdyByIGNcbiAgICAgICAgICAgICAgfCBfIC0+IGF1eCBsb3cgbCAoTW9yZSAodiwgciwgYykpXG4gICAgICAgICAgICBlbmRcbiAgICAgIGluXG4gICAgICBzZXFfb2ZfZW51bV8gKGF1eCBsb3cgcyBFbmQpXG4gIGVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5tb2R1bGUgdHlwZSBPcmRlcmVkVHlwZSA9XG4gIHNpZ1xuICAgIHR5cGUgdFxuICAgIHZhbCBjb21wYXJlOiB0IC0+IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTID1cbiAgc2lnXG4gICAgdHlwZSBrZXlcbiAgICB0eXBlICErJ2EgdFxuICAgIHZhbCBlbXB0eTogJ2EgdFxuICAgIHZhbCBpc19lbXB0eTogJ2EgdCAtPiBib29sXG4gICAgdmFsIG1lbTogIGtleSAtPiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgYWRkOiBrZXkgLT4gJ2EgLT4gJ2EgdCAtPiAnYSB0XG4gICAgdmFsIHVwZGF0ZToga2V5IC0+ICgnYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgc2luZ2xldG9uOiBrZXkgLT4gJ2EgLT4gJ2EgdFxuICAgIHZhbCByZW1vdmU6IGtleSAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgbWVyZ2U6XG4gICAgICAgICAgKGtleSAtPiAnYSBvcHRpb24gLT4gJ2Igb3B0aW9uIC0+ICdjIG9wdGlvbikgLT4gJ2EgdCAtPiAnYiB0IC0+ICdjIHRcbiAgICB2YWwgdW5pb246IChrZXkgLT4gJ2EgLT4gJ2EgLT4gJ2Egb3B0aW9uKSAtPiAnYSB0IC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBjb21wYXJlOiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50XG4gICAgdmFsIGVxdWFsOiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGJvb2xcbiAgICB2YWwgaXRlcjogKGtleSAtPiAnYSAtPiB1bml0KSAtPiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgZm9sZDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBmb3JfYWxsOiAoa2V5IC0+ICdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbFxuICAgIHZhbCBleGlzdHM6IChrZXkgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiBib29sXG4gICAgdmFsIGZpbHRlcjogKGtleSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgZmlsdGVyX21hcDogKGtleSAtPiAnYSAtPiAnYiBvcHRpb24pIC0+ICdhIHQgLT4gJ2IgdFxuICAgIHZhbCBwYXJ0aXRpb246IChrZXkgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0ICogJ2EgdFxuICAgIHZhbCBjYXJkaW5hbDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgYmluZGluZ3M6ICdhIHQgLT4gKGtleSAqICdhKSBsaXN0XG4gICAgdmFsIG1pbl9iaW5kaW5nOiAnYSB0IC0+IChrZXkgKiAnYSlcbiAgICB2YWwgbWluX2JpbmRpbmdfb3B0OiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIG1heF9iaW5kaW5nOiAnYSB0IC0+IChrZXkgKiAnYSlcbiAgICB2YWwgbWF4X2JpbmRpbmdfb3B0OiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIGNob29zZTogJ2EgdCAtPiAoa2V5ICogJ2EpXG4gICAgdmFsIGNob29zZV9vcHQ6ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgICB2YWwgc3BsaXQ6IGtleSAtPiAnYSB0IC0+ICdhIHQgKiAnYSBvcHRpb24gKiAnYSB0XG4gICAgdmFsIGZpbmQ6IGtleSAtPiAnYSB0IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiBrZXkgLT4gJ2EgdCAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9maXJzdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IGtleSAqICdhXG4gICAgdmFsIGZpbmRfZmlyc3Rfb3B0OiAoa2V5IC0+IGJvb2wpIC0+ICdhIHQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgICB2YWwgZmluZF9sYXN0OiAoa2V5IC0+IGJvb2wpIC0+ICdhIHQgLT4ga2V5ICogJ2FcbiAgICB2YWwgZmluZF9sYXN0X29wdDogKGtleSAtPiBib29sKSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgb3B0aW9uXG4gICAgdmFsIG1hcDogKCdhIC0+ICdiKSAtPiAnYSB0IC0+ICdiIHRcbiAgICB2YWwgbWFwaTogKGtleSAtPiAnYSAtPiAnYikgLT4gJ2EgdCAtPiAnYiB0XG4gICAgdmFsIHRvX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19yZXZfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50XG4gICAgdmFsIHRvX3NlcV9mcm9tIDoga2V5IC0+ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCBhZGRfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0IC0+ICdhIHRcbiAgICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIGVuZFxuXG5tb2R1bGUgTWFrZShPcmQ6IE9yZGVyZWRUeXBlKSA9IHN0cnVjdFxuXG4gICAgdHlwZSBrZXkgPSBPcmQudFxuXG4gICAgdHlwZSAnYSB0ID1cbiAgICAgICAgRW1wdHlcbiAgICAgIHwgTm9kZSBvZiB7bDonYSB0OyB2OmtleTsgZDonYTsgcjonYSB0OyBoOmludH1cblxuICAgIGxldCBoZWlnaHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAwXG4gICAgICB8IE5vZGUge2h9IC0+IGhcblxuICAgIGxldCBjcmVhdGUgbCB4IGQgciA9XG4gICAgICBsZXQgaGwgPSBoZWlnaHQgbCBhbmQgaHIgPSBoZWlnaHQgciBpblxuICAgICAgTm9kZXtsOyB2PXg7IGQ7IHI7IGg9KGlmIGhsID49IGhyIHRoZW4gaGwgKyAxIGVsc2UgaHIgKyAxKX1cblxuICAgIGxldCBzaW5nbGV0b24geCBkID0gTm9kZXtsPUVtcHR5OyB2PXg7IGQ7IHI9RW1wdHk7IGg9MX1cblxuICAgIGxldCBiYWwgbCB4IGQgciA9XG4gICAgICBsZXQgaGwgPSBtYXRjaCBsIHdpdGggRW1wdHkgLT4gMCB8IE5vZGUge2h9IC0+IGggaW5cbiAgICAgIGxldCBociA9IG1hdGNoIHIgd2l0aCBFbXB0eSAtPiAwIHwgTm9kZSB7aH0gLT4gaCBpblxuICAgICAgaWYgaGwgPiBociArIDIgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5iYWxcIlxuICAgICAgICB8IE5vZGV7bD1sbDsgdj1sdjsgZD1sZDsgcj1scn0gLT5cbiAgICAgICAgICAgIGlmIGhlaWdodCBsbCA+PSBoZWlnaHQgbHIgdGhlblxuICAgICAgICAgICAgICBjcmVhdGUgbGwgbHYgbGQgKGNyZWF0ZSBsciB4IGQgcilcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgbWF0Y2ggbHIgd2l0aFxuICAgICAgICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgICAgICAgIHwgTm9kZXtsPWxybDsgdj1scnY7IGQ9bHJkOyByPWxycn0tPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbGwgbHYgbGQgbHJsKSBscnYgbHJkIChjcmVhdGUgbHJyIHggZCByKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZSBpZiBociA+IGhsICsgMiB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIHIgd2l0aFxuICAgICAgICAgIEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICAgIHwgTm9kZXtsPXJsOyB2PXJ2OyBkPXJkOyByPXJyfSAtPlxuICAgICAgICAgICAgaWYgaGVpZ2h0IHJyID49IGhlaWdodCBybCB0aGVuXG4gICAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgeCBkIHJsKSBydiByZCByclxuICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBtYXRjaCBybCB3aXRoXG4gICAgICAgICAgICAgICAgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgICAgICAgfCBOb2Rle2w9cmxsOyB2PXJsdjsgZD1ybGQ7IHI9cmxyfSAtPlxuICAgICAgICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB4IGQgcmxsKSBybHYgcmxkIChjcmVhdGUgcmxyIHJ2IHJkIHJyKVxuICAgICAgICAgICAgZW5kXG4gICAgICBlbmQgZWxzZVxuICAgICAgICBOb2Rle2w7IHY9eDsgZDsgcjsgaD0oaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEpfVxuXG4gICAgbGV0IGVtcHR5ID0gRW1wdHlcblxuICAgIGxldCBpc19lbXB0eSA9IGZ1bmN0aW9uIEVtcHR5IC0+IHRydWUgfCBfIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVjIGFkZCB4IGRhdGEgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vZGV7bD1FbXB0eTsgdj14OyBkPWRhdGE7IHI9RW1wdHk7IGg9MX1cbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcjsgaH0gYXMgbSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlblxuICAgICAgICAgICAgaWYgZCA9PSBkYXRhIHRoZW4gbSBlbHNlIE5vZGV7bDsgdj14OyBkPWRhdGE7IHI7IGh9XG4gICAgICAgICAgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgbGwgPSBhZGQgeCBkYXRhIGwgaW5cbiAgICAgICAgICAgIGlmIGwgPT0gbGwgdGhlbiBtIGVsc2UgYmFsIGxsIHYgZCByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IHJyID0gYWRkIHggZGF0YSByIGluXG4gICAgICAgICAgICBpZiByID09IHJyIHRoZW4gbSBlbHNlIGJhbCBsIHYgZCByclxuXG4gICAgbGV0IHJlYyBmaW5kIHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiBkXG4gICAgICAgICAgZWxzZSBmaW5kIHggKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3RfYXV4IHYwIGQwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3RfYXV4IHYgZCBmIGxcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2ZpcnN0X2F1eCB2MCBkMCBmIHJcblxuICAgIGxldCByZWMgZmluZF9maXJzdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9maXJzdF9hdXggdiBkIGYgbFxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfZmlyc3QgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfZmlyc3Rfb3B0X2F1eCB2MCBkMCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBTb21lICh2MCwgZDApXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2IGQgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHRfYXV4IHYwIGQwIGYgclxuXG4gICAgbGV0IHJlYyBmaW5kX2ZpcnN0X29wdCBmID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICBOb25lXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgaWYgZiB2IHRoZW5cbiAgICAgICAgICAgIGZpbmRfZmlyc3Rfb3B0X2F1eCB2IGQgZiBsXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9maXJzdF9vcHQgZiByXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9hdXggdjAgZDAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgKHYwLCBkMClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2IGQgZiByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmluZF9sYXN0X2F1eCB2MCBkMCBmIGxcblxuICAgIGxldCByZWMgZmluZF9sYXN0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGlmIGYgdiB0aGVuXG4gICAgICAgICAgICBmaW5kX2xhc3RfYXV4IHYgZCBmIHJcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2xhc3QgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGQwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIFNvbWUgKHYwLCBkMClcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdiBkIGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHRfYXV4IHYwIGQwIGYgbFxuXG4gICAgbGV0IHJlYyBmaW5kX2xhc3Rfb3B0IGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBpZiBmIHYgdGhlblxuICAgICAgICAgICAgZmluZF9sYXN0X29wdF9hdXggdiBkIGYgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmRfbGFzdF9vcHQgZiBsXG5cbiAgICBsZXQgcmVjIGZpbmRfb3B0IHggPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gU29tZSBkXG4gICAgICAgICAgZWxzZSBmaW5kX29wdCB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyBtZW0geCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgZmFsc2VcbiAgICAgIHwgTm9kZSB7bDsgdjsgcn0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGMgPSAwIHx8IG1lbSB4IChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKVxuXG4gICAgbGV0IHJlYyBtaW5fYmluZGluZyA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgfCBOb2RlIHtsPUVtcHR5OyB2OyBkfSAtPiAodiwgZClcbiAgICAgIHwgTm9kZSB7bH0gLT4gbWluX2JpbmRpbmcgbFxuXG4gICAgbGV0IHJlYyBtaW5fYmluZGluZ19vcHQgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBOb25lXG4gICAgICB8IE5vZGUge2w9RW1wdHk7IHY7IGR9IC0+IFNvbWUgKHYsIGQpXG4gICAgICB8IE5vZGUge2x9LT4gbWluX2JpbmRpbmdfb3B0IGxcblxuICAgIGxldCByZWMgbWF4X2JpbmRpbmcgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgTm9kZSB7djsgZDsgcj1FbXB0eX0gLT4gKHYsIGQpXG4gICAgICB8IE5vZGUge3J9IC0+IG1heF9iaW5kaW5nIHJcblxuICAgIGxldCByZWMgbWF4X2JpbmRpbmdfb3B0ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBOb2RlIHt2OyBkOyByPUVtcHR5fSAtPiBTb21lICh2LCBkKVxuICAgICAgfCBOb2RlIHtyfSAtPiBtYXhfYmluZGluZ19vcHQgclxuXG4gICAgbGV0IHJlYyByZW1vdmVfbWluX2JpbmRpbmcgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBpbnZhbGlkX2FyZyBcIk1hcC5yZW1vdmVfbWluX2VsdFwiXG4gICAgICB8IE5vZGUge2w9RW1wdHk7IHJ9IC0+IHJcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT4gYmFsIChyZW1vdmVfbWluX2JpbmRpbmcgbCkgdiBkIHJcblxuICAgIGxldCBtZXJnZSB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+XG4gICAgICAgICAgbGV0ICh4LCBkKSA9IG1pbl9iaW5kaW5nIHQyIGluXG4gICAgICAgICAgYmFsIHQxIHggZCAocmVtb3ZlX21pbl9iaW5kaW5nIHQyKVxuXG4gICAgbGV0IHJlYyByZW1vdmUgeCA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgRW1wdHlcbiAgICAgIHwgKE5vZGUge2w7IHY7IGQ7IHJ9IGFzIG0pIC0+XG4gICAgICAgICAgbGV0IGMgPSBPcmQuY29tcGFyZSB4IHYgaW5cbiAgICAgICAgICBpZiBjID0gMCB0aGVuIG1lcmdlIGwgclxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IGxsID0gcmVtb3ZlIHggbCBpbiBpZiBsID09IGxsIHRoZW4gbSBlbHNlIGJhbCBsbCB2IGQgclxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCByciA9IHJlbW92ZSB4IHIgaW4gaWYgciA9PSByciB0aGVuIG0gZWxzZSBiYWwgbCB2IGQgcnJcblxuICAgIGxldCByZWMgdXBkYXRlIHggZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggZiBOb25lIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gRW1wdHlcbiAgICAgICAgICB8IFNvbWUgZGF0YSAtPiBOb2Rle2w9RW1wdHk7IHY9eDsgZD1kYXRhOyByPUVtcHR5OyBoPTF9XG4gICAgICAgICAgZW5kXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IGFzIG0gLT5cbiAgICAgICAgICBsZXQgYyA9IE9yZC5jb21wYXJlIHggdiBpblxuICAgICAgICAgIGlmIGMgPSAwIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIG1hdGNoIGYgKFNvbWUgZCkgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IG1lcmdlIGwgclxuICAgICAgICAgICAgfCBTb21lIGRhdGEgLT5cbiAgICAgICAgICAgICAgICBpZiBkID09IGRhdGEgdGhlbiBtIGVsc2UgTm9kZXtsOyB2PXg7IGQ9ZGF0YTsgcjsgaH1cbiAgICAgICAgICBlbmQgZWxzZSBpZiBjIDwgMCB0aGVuXG4gICAgICAgICAgICBsZXQgbGwgPSB1cGRhdGUgeCBmIGwgaW5cbiAgICAgICAgICAgIGlmIGwgPT0gbGwgdGhlbiBtIGVsc2UgYmFsIGxsIHYgZCByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IHJyID0gdXBkYXRlIHggZiByIGluXG4gICAgICAgICAgICBpZiByID09IHJyIHRoZW4gbSBlbHNlIGJhbCBsIHYgZCByclxuXG4gICAgbGV0IHJlYyBpdGVyIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAoKVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGl0ZXIgZiBsOyBmIHYgZDsgaXRlciBmIHJcblxuICAgIGxldCByZWMgbWFwIGYgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPlxuICAgICAgICAgIEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHI7IGh9IC0+XG4gICAgICAgICAgbGV0IGwnID0gbWFwIGYgbCBpblxuICAgICAgICAgIGxldCBkJyA9IGYgZCBpblxuICAgICAgICAgIGxldCByJyA9IG1hcCBmIHIgaW5cbiAgICAgICAgICBOb2Rle2w9bCc7IHY7IGQ9ZCc7IHI9cic7IGh9XG5cbiAgICBsZXQgcmVjIG1hcGkgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+XG4gICAgICAgICAgRW1wdHlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcjsgaH0gLT5cbiAgICAgICAgICBsZXQgbCcgPSBtYXBpIGYgbCBpblxuICAgICAgICAgIGxldCBkJyA9IGYgdiBkIGluXG4gICAgICAgICAgbGV0IHInID0gbWFwaSBmIHIgaW5cbiAgICAgICAgICBOb2Rle2w9bCc7IHY7IGQ9ZCc7IHI9cic7IGh9XG5cbiAgICBsZXQgcmVjIGZvbGQgZiBtIGFjY3UgPVxuICAgICAgbWF0Y2ggbSB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT5cbiAgICAgICAgICBmb2xkIGYgciAoZiB2IGQgKGZvbGQgZiBsIGFjY3UpKVxuXG4gICAgbGV0IHJlYyBmb3JfYWxsIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiB0cnVlXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IHAgdiBkICYmIGZvcl9hbGwgcCBsICYmIGZvcl9hbGwgcCByXG5cbiAgICBsZXQgcmVjIGV4aXN0cyBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gZmFsc2VcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gLT4gcCB2IGQgfHwgZXhpc3RzIHAgbCB8fCBleGlzdHMgcCByXG5cbiAgICAoKiBCZXdhcmU6IHRob3NlIHR3byBmdW5jdGlvbnMgYXNzdW1lIHRoYXQgdGhlIGFkZGVkIGsgaXMgKnN0cmljdGx5KlxuICAgICAgIHNtYWxsZXIgKG9yIGJpZ2dlcikgdGhhbiBhbGwgdGhlIHByZXNlbnQga2V5cyBpbiB0aGUgdHJlZTsgaXRcbiAgICAgICBkb2VzIG5vdCB0ZXN0IGZvciBlcXVhbGl0eSB3aXRoIHRoZSBjdXJyZW50IG1pbiAob3IgbWF4KSBrZXkuXG5cbiAgICAgICBJbmRlZWQsIHRoZXkgYXJlIG9ubHkgdXNlZCBkdXJpbmcgdGhlIFwiam9pblwiIG9wZXJhdGlvbiB3aGljaFxuICAgICAgIHJlc3BlY3RzIHRoaXMgcHJlY29uZGl0aW9uLlxuICAgICopXG5cbiAgICBsZXQgcmVjIGFkZF9taW5fYmluZGluZyBrIHggPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBzaW5nbGV0b24gayB4XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgIGJhbCAoYWRkX21pbl9iaW5kaW5nIGsgeCBsKSB2IGQgclxuXG4gICAgbGV0IHJlYyBhZGRfbWF4X2JpbmRpbmcgayB4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gc2luZ2xldG9uIGsgeFxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICBiYWwgbCB2IGQgKGFkZF9tYXhfYmluZGluZyBrIHggcilcblxuICAgICgqIFNhbWUgYXMgY3JlYXRlIGFuZCBiYWwsIGJ1dCBubyBhc3N1bXB0aW9ucyBhcmUgbWFkZSBvbiB0aGVcbiAgICAgICByZWxhdGl2ZSBoZWlnaHRzIG9mIGwgYW5kIHIuICopXG5cbiAgICBsZXQgcmVjIGpvaW4gbCB2IGQgciA9XG4gICAgICBtYXRjaCAobCwgcikgd2l0aFxuICAgICAgICAoRW1wdHksIF8pIC0+IGFkZF9taW5fYmluZGluZyB2IGQgclxuICAgICAgfCAoXywgRW1wdHkpIC0+IGFkZF9tYXhfYmluZGluZyB2IGQgbFxuICAgICAgfCAoTm9kZXtsPWxsOyB2PWx2OyBkPWxkOyByPWxyOyBoPWxofSxcbiAgICAgICAgIE5vZGV7bD1ybDsgdj1ydjsgZD1yZDsgcj1ycjsgaD1yaH0pIC0+XG4gICAgICAgICAgaWYgbGggPiByaCArIDIgdGhlbiBiYWwgbGwgbHYgbGQgKGpvaW4gbHIgdiBkIHIpIGVsc2VcbiAgICAgICAgICBpZiByaCA+IGxoICsgMiB0aGVuIGJhbCAoam9pbiBsIHYgZCBybCkgcnYgcmQgcnIgZWxzZVxuICAgICAgICAgIGNyZWF0ZSBsIHYgZCByXG5cbiAgICAoKiBNZXJnZSB0d28gdHJlZXMgbCBhbmQgciBpbnRvIG9uZS5cbiAgICAgICBBbGwgZWxlbWVudHMgb2YgbCBtdXN0IHByZWNlZGUgdGhlIGVsZW1lbnRzIG9mIHIuXG4gICAgICAgTm8gYXNzdW1wdGlvbiBvbiB0aGUgaGVpZ2h0cyBvZiBsIGFuZCByLiAqKVxuXG4gICAgbGV0IGNvbmNhdCB0MSB0MiA9XG4gICAgICBtYXRjaCAodDEsIHQyKSB3aXRoXG4gICAgICAgIChFbXB0eSwgdCkgLT4gdFxuICAgICAgfCAodCwgRW1wdHkpIC0+IHRcbiAgICAgIHwgKF8sIF8pIC0+XG4gICAgICAgICAgbGV0ICh4LCBkKSA9IG1pbl9iaW5kaW5nIHQyIGluXG4gICAgICAgICAgam9pbiB0MSB4IGQgKHJlbW92ZV9taW5fYmluZGluZyB0MilcblxuICAgIGxldCBjb25jYXRfb3Jfam9pbiB0MSB2IGQgdDIgPVxuICAgICAgbWF0Y2ggZCB3aXRoXG4gICAgICB8IFNvbWUgZCAtPiBqb2luIHQxIHYgZCB0MlxuICAgICAgfCBOb25lIC0+IGNvbmNhdCB0MSB0MlxuXG4gICAgbGV0IHJlYyBzcGxpdCB4ID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT5cbiAgICAgICAgICAoRW1wdHksIE5vbmUsIEVtcHR5KVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgeCB2IGluXG4gICAgICAgICAgaWYgYyA9IDAgdGhlbiAobCwgU29tZSBkLCByKVxuICAgICAgICAgIGVsc2UgaWYgYyA8IDAgdGhlblxuICAgICAgICAgICAgbGV0IChsbCwgcHJlcywgcmwpID0gc3BsaXQgeCBsIGluIChsbCwgcHJlcywgam9pbiBybCB2IGQgcilcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgKGxyLCBwcmVzLCBycikgPSBzcGxpdCB4IHIgaW4gKGpvaW4gbCB2IGQgbHIsIHByZXMsIHJyKVxuXG4gICAgbGV0IHJlYyBtZXJnZSBmIHMxIHMyID1cbiAgICAgIG1hdGNoIChzMSwgczIpIHdpdGhcbiAgICAgICAgKEVtcHR5LCBFbXB0eSkgLT4gRW1wdHlcbiAgICAgIHwgKE5vZGUge2w9bDE7IHY9djE7IGQ9ZDE7IHI9cjE7IGg9aDF9LCBfKSB3aGVuIGgxID49IGhlaWdodCBzMiAtPlxuICAgICAgICAgIGxldCAobDIsIGQyLCByMikgPSBzcGxpdCB2MSBzMiBpblxuICAgICAgICAgIGNvbmNhdF9vcl9qb2luIChtZXJnZSBmIGwxIGwyKSB2MSAoZiB2MSAoU29tZSBkMSkgZDIpIChtZXJnZSBmIHIxIHIyKVxuICAgICAgfCAoXywgTm9kZSB7bD1sMjsgdj12MjsgZD1kMjsgcj1yMn0pIC0+XG4gICAgICAgICAgbGV0IChsMSwgZDEsIHIxKSA9IHNwbGl0IHYyIHMxIGluXG4gICAgICAgICAgY29uY2F0X29yX2pvaW4gKG1lcmdlIGYgbDEgbDIpIHYyIChmIHYyIGQxIChTb21lIGQyKSkgKG1lcmdlIGYgcjEgcjIpXG4gICAgICB8IF8gLT5cbiAgICAgICAgICBhc3NlcnQgZmFsc2VcblxuICAgIGxldCByZWMgdW5pb24gZiBzMSBzMiA9XG4gICAgICBtYXRjaCAoczEsIHMyKSB3aXRoXG4gICAgICB8IChFbXB0eSwgcykgfCAocywgRW1wdHkpIC0+IHNcbiAgICAgIHwgKE5vZGUge2w9bDE7IHY9djE7IGQ9ZDE7IHI9cjE7IGg9aDF9LFxuICAgICAgICAgTm9kZSB7bD1sMjsgdj12MjsgZD1kMjsgcj1yMjsgaD1oMn0pIC0+XG4gICAgICAgICAgaWYgaDEgPj0gaDIgdGhlblxuICAgICAgICAgICAgbGV0IChsMiwgZDIsIHIyKSA9IHNwbGl0IHYxIHMyIGluXG4gICAgICAgICAgICBsZXQgbCA9IHVuaW9uIGYgbDEgbDIgYW5kIHIgPSB1bmlvbiBmIHIxIHIyIGluXG4gICAgICAgICAgICBtYXRjaCBkMiB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gam9pbiBsIHYxIGQxIHJcbiAgICAgICAgICAgIHwgU29tZSBkMiAtPiBjb25jYXRfb3Jfam9pbiBsIHYxIChmIHYxIGQxIGQyKSByXG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IChsMSwgZDEsIHIxKSA9IHNwbGl0IHYyIHMxIGluXG4gICAgICAgICAgICBsZXQgbCA9IHVuaW9uIGYgbDEgbDIgYW5kIHIgPSB1bmlvbiBmIHIxIHIyIGluXG4gICAgICAgICAgICBtYXRjaCBkMSB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gam9pbiBsIHYyIGQyIHJcbiAgICAgICAgICAgIHwgU29tZSBkMSAtPiBjb25jYXRfb3Jfam9pbiBsIHYyIChmIHYyIGQxIGQyKSByXG5cbiAgICBsZXQgcmVjIGZpbHRlciBwID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gRW1wdHlcbiAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcn0gYXMgbSAtPlxuICAgICAgICAgICgqIGNhbGwgW3BdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IGwnID0gZmlsdGVyIHAgbCBpblxuICAgICAgICAgIGxldCBwdmQgPSBwIHYgZCBpblxuICAgICAgICAgIGxldCByJyA9IGZpbHRlciBwIHIgaW5cbiAgICAgICAgICBpZiBwdmQgdGhlbiBpZiBsPT1sJyAmJiByPT1yJyB0aGVuIG0gZWxzZSBqb2luIGwnIHYgZCByJ1xuICAgICAgICAgIGVsc2UgY29uY2F0IGwnIHInXG5cbiAgICBsZXQgcmVjIGZpbHRlcl9tYXAgZiA9IGZ1bmN0aW9uXG4gICAgICAgIEVtcHR5IC0+IEVtcHR5XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+XG4gICAgICAgICAgKCogY2FsbCBbZl0gaW4gdGhlIGV4cGVjdGVkIGxlZnQtdG8tcmlnaHQgb3JkZXIgKilcbiAgICAgICAgICBsZXQgbCcgPSBmaWx0ZXJfbWFwIGYgbCBpblxuICAgICAgICAgIGxldCBmdmQgPSBmIHYgZCBpblxuICAgICAgICAgIGxldCByJyA9IGZpbHRlcl9tYXAgZiByIGluXG4gICAgICAgICAgYmVnaW4gbWF0Y2ggZnZkIHdpdGhcbiAgICAgICAgICAgIHwgU29tZSBkJyAtPiBqb2luIGwnIHYgZCcgcidcbiAgICAgICAgICAgIHwgTm9uZSAtPiBjb25jYXQgbCcgcidcbiAgICAgICAgICBlbmRcblxuICAgIGxldCByZWMgcGFydGl0aW9uIHAgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiAoRW1wdHksIEVtcHR5KVxuICAgICAgfCBOb2RlIHtsOyB2OyBkOyByfSAtPlxuICAgICAgICAgICgqIGNhbGwgW3BdIGluIHRoZSBleHBlY3RlZCBsZWZ0LXRvLXJpZ2h0IG9yZGVyICopXG4gICAgICAgICAgbGV0IChsdCwgbGYpID0gcGFydGl0aW9uIHAgbCBpblxuICAgICAgICAgIGxldCBwdmQgPSBwIHYgZCBpblxuICAgICAgICAgIGxldCAocnQsIHJmKSA9IHBhcnRpdGlvbiBwIHIgaW5cbiAgICAgICAgICBpZiBwdmRcbiAgICAgICAgICB0aGVuIChqb2luIGx0IHYgZCBydCwgY29uY2F0IGxmIHJmKVxuICAgICAgICAgIGVsc2UgKGNvbmNhdCBsdCBydCwgam9pbiBsZiB2IGQgcmYpXG5cbiAgICB0eXBlICdhIGVudW1lcmF0aW9uID0gRW5kIHwgTW9yZSBvZiBrZXkgKiAnYSAqICdhIHQgKiAnYSBlbnVtZXJhdGlvblxuXG4gICAgbGV0IHJlYyBjb25zX2VudW0gbSBlID1cbiAgICAgIG1hdGNoIG0gd2l0aFxuICAgICAgICBFbXB0eSAtPiBlXG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IGNvbnNfZW51bSBsIChNb3JlKHYsIGQsIHIsIGUpKVxuXG4gICAgbGV0IGNvbXBhcmUgY21wIG0xIG0yID1cbiAgICAgIGxldCByZWMgY29tcGFyZV9hdXggZTEgZTIgPVxuICAgICAgICAgIG1hdGNoIChlMSwgZTIpIHdpdGhcbiAgICAgICAgICAoRW5kLCBFbmQpIC0+IDBcbiAgICAgICAgfCAoRW5kLCBfKSAgLT4gLTFcbiAgICAgICAgfCAoXywgRW5kKSAtPiAxXG4gICAgICAgIHwgKE1vcmUodjEsIGQxLCByMSwgZTEpLCBNb3JlKHYyLCBkMiwgcjIsIGUyKSkgLT5cbiAgICAgICAgICAgIGxldCBjID0gT3JkLmNvbXBhcmUgdjEgdjIgaW5cbiAgICAgICAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZVxuICAgICAgICAgICAgbGV0IGMgPSBjbXAgZDEgZDIgaW5cbiAgICAgICAgICAgIGlmIGMgPD4gMCB0aGVuIGMgZWxzZVxuICAgICAgICAgICAgY29tcGFyZV9hdXggKGNvbnNfZW51bSByMSBlMSkgKGNvbnNfZW51bSByMiBlMilcbiAgICAgIGluIGNvbXBhcmVfYXV4IChjb25zX2VudW0gbTEgRW5kKSAoY29uc19lbnVtIG0yIEVuZClcblxuICAgIGxldCBlcXVhbCBjbXAgbTEgbTIgPVxuICAgICAgbGV0IHJlYyBlcXVhbF9hdXggZTEgZTIgPVxuICAgICAgICAgIG1hdGNoIChlMSwgZTIpIHdpdGhcbiAgICAgICAgICAoRW5kLCBFbmQpIC0+IHRydWVcbiAgICAgICAgfCAoRW5kLCBfKSAgLT4gZmFsc2VcbiAgICAgICAgfCAoXywgRW5kKSAtPiBmYWxzZVxuICAgICAgICB8IChNb3JlKHYxLCBkMSwgcjEsIGUxKSwgTW9yZSh2MiwgZDIsIHIyLCBlMikpIC0+XG4gICAgICAgICAgICBPcmQuY29tcGFyZSB2MSB2MiA9IDAgJiYgY21wIGQxIGQyICYmXG4gICAgICAgICAgICBlcXVhbF9hdXggKGNvbnNfZW51bSByMSBlMSkgKGNvbnNfZW51bSByMiBlMilcbiAgICAgIGluIGVxdWFsX2F1eCAoY29uc19lbnVtIG0xIEVuZCkgKGNvbnNfZW51bSBtMiBFbmQpXG5cbiAgICBsZXQgcmVjIGNhcmRpbmFsID0gZnVuY3Rpb25cbiAgICAgICAgRW1wdHkgLT4gMFxuICAgICAgfCBOb2RlIHtsOyByfSAtPiBjYXJkaW5hbCBsICsgMSArIGNhcmRpbmFsIHJcblxuICAgIGxldCByZWMgYmluZGluZ3NfYXV4IGFjY3UgPSBmdW5jdGlvblxuICAgICAgICBFbXB0eSAtPiBhY2N1XG4gICAgICB8IE5vZGUge2w7IHY7IGQ7IHJ9IC0+IGJpbmRpbmdzX2F1eCAoKHYsIGQpIDo6IGJpbmRpbmdzX2F1eCBhY2N1IHIpIGxcblxuICAgIGxldCBiaW5kaW5ncyBzID1cbiAgICAgIGJpbmRpbmdzX2F1eCBbXSBzXG5cbiAgICBsZXQgY2hvb3NlID0gbWluX2JpbmRpbmdcblxuICAgIGxldCBjaG9vc2Vfb3B0ID0gbWluX2JpbmRpbmdfb3B0XG5cbiAgICBsZXQgYWRkX3NlcSBpIG0gPVxuICAgICAgU2VxLmZvbGRfbGVmdCAoZnVuIG0gKGssdikgLT4gYWRkIGsgdiBtKSBtIGlcblxuICAgIGxldCBvZl9zZXEgaSA9IGFkZF9zZXEgaSBlbXB0eVxuXG4gICAgbGV0IHJlYyBzZXFfb2ZfZW51bV8gYyAoKSA9IG1hdGNoIGMgd2l0aFxuICAgICAgfCBFbmQgLT4gU2VxLk5pbFxuICAgICAgfCBNb3JlIChrLHYsdCxyZXN0KSAtPiBTZXEuQ29ucyAoKGssdiksIHNlcV9vZl9lbnVtXyAoY29uc19lbnVtIHQgcmVzdCkpXG5cbiAgICBsZXQgdG9fc2VxIG0gPVxuICAgICAgc2VxX29mX2VudW1fIChjb25zX2VudW0gbSBFbmQpXG5cbiAgICBsZXQgcmVjIHNub2NfZW51bSBzIGUgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICAgIEVtcHR5IC0+IGVcbiAgICAgIHwgTm9kZXtsOyB2OyBkOyByfSAtPiBzbm9jX2VudW0gciAoTW9yZSh2LCBkLCBsLCBlKSlcblxuICAgIGxldCByZWMgcmV2X3NlcV9vZl9lbnVtXyBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgICB8IEVuZCAtPiBTZXEuTmlsXG4gICAgICB8IE1vcmUgKGssdix0LHJlc3QpIC0+XG4gICAgICAgICAgU2VxLkNvbnMgKChrLHYpLCByZXZfc2VxX29mX2VudW1fIChzbm9jX2VudW0gdCByZXN0KSlcblxuICAgIGxldCB0b19yZXZfc2VxIGMgPVxuICAgICAgcmV2X3NlcV9vZl9lbnVtXyAoc25vY19lbnVtIGMgRW5kKVxuXG4gICAgbGV0IHRvX3NlcV9mcm9tIGxvdyBtID1cbiAgICAgIGxldCByZWMgYXV4IGxvdyBtIGMgPSBtYXRjaCBtIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiBjXG4gICAgICAgIHwgTm9kZSB7bDsgdjsgZDsgcjsgX30gLT5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIE9yZC5jb21wYXJlIHYgbG93IHdpdGhcbiAgICAgICAgICAgICAgfCAwIC0+IE1vcmUgKHYsIGQsIHIsIGMpXG4gICAgICAgICAgICAgIHwgbiB3aGVuIG48MCAtPiBhdXggbG93IHIgY1xuICAgICAgICAgICAgICB8IF8gLT4gYXV4IGxvdyBsIChNb3JlICh2LCBkLCByLCBjKSlcbiAgICAgICAgICAgIGVuZFxuICAgICAgaW5cbiAgICAgIHNlcV9vZl9lbnVtXyAoYXV4IGxvdyBtIEVuZClcbmVuZFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG50eXBlICdhIHQgPSB7IG11dGFibGUgYyA6ICdhIGxpc3Q7IG11dGFibGUgbGVuIDogaW50OyB9XG5cbmV4Y2VwdGlvbiBFbXB0eVxuXG5sZXQgY3JlYXRlICgpID0geyBjID0gW107IGxlbiA9IDA7IH1cblxubGV0IGNsZWFyIHMgPSBzLmMgPC0gW107IHMubGVuIDwtIDBcblxubGV0IGNvcHkgcyA9IHsgYyA9IHMuYzsgbGVuID0gcy5sZW47IH1cblxubGV0IHB1c2ggeCBzID0gcy5jIDwtIHggOjogcy5jOyBzLmxlbiA8LSBzLmxlbiArIDFcblxubGV0IHBvcCBzID1cbiAgbWF0Y2ggcy5jIHdpdGhcbiAgfCBoZDo6dGwgLT4gcy5jIDwtIHRsOyBzLmxlbiA8LSBzLmxlbiAtIDE7IGhkXG4gIHwgW10gICAgIC0+IHJhaXNlIEVtcHR5XG5cbmxldCBwb3Bfb3B0IHMgPVxuICBtYXRjaCBzLmMgd2l0aFxuICB8IGhkOjp0bCAtPiBzLmMgPC0gdGw7IHMubGVuIDwtIHMubGVuIC0gMTsgU29tZSBoZFxuICB8IFtdICAgICAtPiBOb25lXG5cbmxldCB0b3AgcyA9XG4gIG1hdGNoIHMuYyB3aXRoXG4gIHwgaGQ6Ol8gLT4gaGRcbiAgfCBbXSAgICAtPiByYWlzZSBFbXB0eVxuXG5sZXQgdG9wX29wdCBzID1cbiAgbWF0Y2ggcy5jIHdpdGhcbiAgfCBoZDo6XyAtPiBTb21lIGhkXG4gIHwgW10gICAgLT4gTm9uZVxuXG5sZXQgaXNfZW1wdHkgcyA9IChzLmMgPSBbXSlcblxubGV0IGxlbmd0aCBzID0gcy5sZW5cblxubGV0IGl0ZXIgZiBzID0gTGlzdC5pdGVyIGYgcy5jXG5cbmxldCBmb2xkIGYgYWNjIHMgPSBMaXN0LmZvbGRfbGVmdCBmIGFjYyBzLmNcblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSBzID0gTGlzdC50b19zZXEgcy5jXG5cbmxldCBhZGRfc2VxIHEgaSA9IFNlcS5pdGVyIChmdW4geCAtPiBwdXNoIHggcSkgaVxuXG5sZXQgb2Zfc2VxIGcgPVxuICBsZXQgcyA9IGNyZWF0ZSgpIGluXG4gIGFkZF9zZXEgcyBnO1xuICBzXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgIEZyYW5jb2lzIFBvdHRpZXIsIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgIEplcmVtaWUgRGltaW5vLCBKYW5lIFN0cmVldCBFdXJvcGUgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAyIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbmV4Y2VwdGlvbiBFbXB0eVxuXG50eXBlICdhIGNlbGwgPVxuICB8IE5pbFxuICB8IENvbnMgb2YgeyBjb250ZW50OiAnYTsgbXV0YWJsZSBuZXh0OiAnYSBjZWxsIH1cblxudHlwZSAnYSB0ID0ge1xuICBtdXRhYmxlIGxlbmd0aDogaW50O1xuICBtdXRhYmxlIGZpcnN0OiAnYSBjZWxsO1xuICBtdXRhYmxlIGxhc3Q6ICdhIGNlbGxcbn1cblxubGV0IGNyZWF0ZSAoKSA9IHtcbiAgbGVuZ3RoID0gMDtcbiAgZmlyc3QgPSBOaWw7XG4gIGxhc3QgPSBOaWxcbn1cblxubGV0IGNsZWFyIHEgPVxuICBxLmxlbmd0aCA8LSAwO1xuICBxLmZpcnN0IDwtIE5pbDtcbiAgcS5sYXN0IDwtIE5pbFxuXG5sZXQgYWRkIHggcSA9XG4gIGxldCBjZWxsID0gQ29ucyB7XG4gICAgY29udGVudCA9IHg7XG4gICAgbmV4dCA9IE5pbFxuICB9IGluXG4gIG1hdGNoIHEubGFzdCB3aXRoXG4gIHwgTmlsIC0+XG4gICAgcS5sZW5ndGggPC0gMTtcbiAgICBxLmZpcnN0IDwtIGNlbGw7XG4gICAgcS5sYXN0IDwtIGNlbGxcbiAgfCBDb25zIGxhc3QgLT5cbiAgICBxLmxlbmd0aCA8LSBxLmxlbmd0aCArIDE7XG4gICAgbGFzdC5uZXh0IDwtIGNlbGw7XG4gICAgcS5sYXN0IDwtIGNlbGxcblxubGV0IHB1c2ggPVxuICBhZGRcblxubGV0IHBlZWsgcSA9XG4gIG1hdGNoIHEuZmlyc3Qgd2l0aFxuICB8IE5pbCAtPiByYWlzZSBFbXB0eVxuICB8IENvbnMgeyBjb250ZW50IH0gLT4gY29udGVudFxuXG5sZXQgcGVla19vcHQgcSA9XG4gIG1hdGNoIHEuZmlyc3Qgd2l0aFxuICB8IE5pbCAtPiBOb25lXG4gIHwgQ29ucyB7IGNvbnRlbnQgfSAtPiBTb21lIGNvbnRlbnRcblxubGV0IHRvcCA9XG4gIHBlZWtcblxubGV0IHRha2UgcSA9XG4gIG1hdGNoIHEuZmlyc3Qgd2l0aFxuICB8IE5pbCAtPiByYWlzZSBFbXB0eVxuICB8IENvbnMgeyBjb250ZW50OyBuZXh0ID0gTmlsIH0gLT5cbiAgICBjbGVhciBxO1xuICAgIGNvbnRlbnRcbiAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgcS5sZW5ndGggPC0gcS5sZW5ndGggLSAxO1xuICAgIHEuZmlyc3QgPC0gbmV4dDtcbiAgICBjb250ZW50XG5cbmxldCB0YWtlX29wdCBxID1cbiAgbWF0Y2ggcS5maXJzdCB3aXRoXG4gIHwgTmlsIC0+IE5vbmVcbiAgfCBDb25zIHsgY29udGVudDsgbmV4dCA9IE5pbCB9IC0+XG4gICAgY2xlYXIgcTtcbiAgICBTb21lIGNvbnRlbnRcbiAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgcS5sZW5ndGggPC0gcS5sZW5ndGggLSAxO1xuICAgIHEuZmlyc3QgPC0gbmV4dDtcbiAgICBTb21lIGNvbnRlbnRcblxubGV0IHBvcCA9XG4gIHRha2VcblxubGV0IGNvcHkgPVxuICBsZXQgcmVjIGNvcHkgcV9yZXMgcHJldiBjZWxsID1cbiAgICBtYXRjaCBjZWxsIHdpdGhcbiAgICB8IE5pbCAtPiBxX3Jlcy5sYXN0IDwtIHByZXY7IHFfcmVzXG4gICAgfCBDb25zIHsgY29udGVudDsgbmV4dCB9IC0+XG4gICAgICBsZXQgcmVzID0gQ29ucyB7IGNvbnRlbnQ7IG5leHQgPSBOaWwgfSBpblxuICAgICAgYmVnaW4gbWF0Y2ggcHJldiB3aXRoXG4gICAgICB8IE5pbCAtPiBxX3Jlcy5maXJzdCA8LSByZXNcbiAgICAgIHwgQ29ucyBwIC0+IHAubmV4dCA8LSByZXNcbiAgICAgIGVuZDtcbiAgICAgIGNvcHkgcV9yZXMgcmVzIG5leHRcbiAgaW5cbiAgZnVuIHEgLT4gY29weSB7IGxlbmd0aCA9IHEubGVuZ3RoOyBmaXJzdCA9IE5pbDsgbGFzdCA9IE5pbCB9IE5pbCBxLmZpcnN0XG5cbmxldCBpc19lbXB0eSBxID1cbiAgcS5sZW5ndGggPSAwXG5cbmxldCBsZW5ndGggcSA9XG4gIHEubGVuZ3RoXG5cbmxldCBpdGVyID1cbiAgbGV0IHJlYyBpdGVyIGYgY2VsbCA9XG4gICAgbWF0Y2ggY2VsbCB3aXRoXG4gICAgfCBOaWwgLT4gKClcbiAgICB8IENvbnMgeyBjb250ZW50OyBuZXh0IH0gLT5cbiAgICAgIGYgY29udGVudDtcbiAgICAgIGl0ZXIgZiBuZXh0XG4gIGluXG4gIGZ1biBmIHEgLT4gaXRlciBmIHEuZmlyc3RcblxubGV0IGZvbGQgPVxuICBsZXQgcmVjIGZvbGQgZiBhY2N1IGNlbGwgPVxuICAgIG1hdGNoIGNlbGwgd2l0aFxuICAgIHwgTmlsIC0+IGFjY3VcbiAgICB8IENvbnMgeyBjb250ZW50OyBuZXh0IH0gLT5cbiAgICAgIGxldCBhY2N1ID0gZiBhY2N1IGNvbnRlbnQgaW5cbiAgICAgIGZvbGQgZiBhY2N1IG5leHRcbiAgaW5cbiAgZnVuIGYgYWNjdSBxIC0+IGZvbGQgZiBhY2N1IHEuZmlyc3RcblxubGV0IHRyYW5zZmVyIHExIHEyID1cbiAgaWYgcTEubGVuZ3RoID4gMCB0aGVuXG4gICAgbWF0Y2ggcTIubGFzdCB3aXRoXG4gICAgfCBOaWwgLT5cbiAgICAgIHEyLmxlbmd0aCA8LSBxMS5sZW5ndGg7XG4gICAgICBxMi5maXJzdCA8LSBxMS5maXJzdDtcbiAgICAgIHEyLmxhc3QgPC0gcTEubGFzdDtcbiAgICAgIGNsZWFyIHExXG4gICAgfCBDb25zIGxhc3QgLT5cbiAgICAgIHEyLmxlbmd0aCA8LSBxMi5sZW5ndGggKyBxMS5sZW5ndGg7XG4gICAgICBsYXN0Lm5leHQgPC0gcTEuZmlyc3Q7XG4gICAgICBxMi5sYXN0IDwtIHExLmxhc3Q7XG4gICAgICBjbGVhciBxMVxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIHEgPVxuICBsZXQgcmVjIGF1eCBjICgpID0gbWF0Y2ggYyB3aXRoXG4gICAgfCBOaWwgLT4gU2VxLk5pbFxuICAgIHwgQ29ucyB7IGNvbnRlbnQ9eDsgbmV4dDsgfSAtPiBTZXEuQ29ucyAoeCwgYXV4IG5leHQpXG4gIGluXG4gIGF1eCBxLmZpcnN0XG5cbmxldCBhZGRfc2VxIHEgaSA9IFNlcS5pdGVyIChmdW4geCAtPiBwdXNoIHggcSkgaVxuXG5sZXQgb2Zfc2VxIGcgPVxuICBsZXQgcSA9IGNyZWF0ZSgpIGluXG4gIGFkZF9zZXEgcSBnO1xuICBxXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICBQaWVycmUgV2VpcyBhbmQgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk5IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEV4dGVuc2libGUgYnVmZmVycyAqKVxuXG4oKiBUaGUgW2lubmVyX2J1ZmZlcl0gdHlwZSBlbnN1cmVzIHRoYXQgdGhlIFtsZW5ndGhdIGFuZCBbYnVmZmVyXSBmaWVsZHMgYXJlXG4gICBhbHdheXMgc3luY2hyb25pemVkLCBbbGVuZ3RoID0gQnl0ZXMubGVuZ3RoIGJ1ZmZlcl0sIGV2ZW4gaW4gcHJlc2VuY2VcbiAgIG9mIGRhdGEgcmFjZXMuXG4qKVxudHlwZSBpbm5lcl9idWZmZXIgPSB7XG4gIGJ1ZmZlcjogYnl0ZXM7XG4gIGxlbmd0aDogaW50O1xufVxuXG50eXBlIHQgPVxuIHttdXRhYmxlIGlubmVyIDogaW5uZXJfYnVmZmVyO1xuICBtdXRhYmxlIHBvc2l0aW9uIDogaW50O1xuICBpbml0aWFsX2J1ZmZlciA6IGJ5dGVzfVxuKCogSW52YXJpYW50czogYWxsIHBhcnRzIG9mIHRoZSBjb2RlIHByZXNlcnZlIHRoZSBpbnZhcmlhbnRzIHRoYXQ6XG4gICAtIFtpbm5lci5sZW5ndGggPSBCeXRlcy5sZW5ndGggaW5uZXIuYnVmZmVyXVxuICAgSW4gYWJzZW5jZSBvZiBkYXRhIHJhY2VzLCB3ZSBhbHNvIGhhdmVcbiAgIC0gWzAgPD0gYi5wb3NpdGlvbiA8PSBiLmlubmVyLmxlbmd0aF1cblxuICAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgW2IucG9zaXRpb24gPSBiLmlubmVyLmxlbmd0aF0gaXMgbGVnYWwsXG4gICBpdCBtZWFucyB0aGF0IHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgd2lsbCBoYXZlIHRvIGJlIGV4dGVuZGVkXG4gICBiZWZvcmUgYW55IGZ1cnRoZXIgYWRkaXRpb24uICopXG5cbmxldCBjcmVhdGUgbiA9XG4gbGV0IG4gPSBpZiBuIDwgMSB0aGVuIDEgZWxzZSBuIGluXG4gbGV0IG4gPSBpZiBuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIGVsc2UgbiBpblxuIGxldCBzID0gQnl0ZXMuY3JlYXRlIG4gaW5cbiB7IGlubmVyID0geyBidWZmZXIgPSBzOyBsZW5ndGggPSBufTsgcG9zaXRpb24gPSAwOyBpbml0aWFsX2J1ZmZlciA9IHN9XG5cbmxldCBjb250ZW50cyBiID0gQnl0ZXMuc3ViX3N0cmluZyBiLmlubmVyLmJ1ZmZlciAwIGIucG9zaXRpb25cbmxldCB0b19ieXRlcyBiID0gQnl0ZXMuc3ViIGIuaW5uZXIuYnVmZmVyIDAgYi5wb3NpdGlvblxuXG5sZXQgc3ViIGIgb2ZzIGxlbiA9XG4gIGlmIG9mcyA8IDAgfHwgbGVuIDwgMCB8fCBvZnMgPiBiLnBvc2l0aW9uIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuc3ViXCJcbiAgZWxzZSBCeXRlcy5zdWJfc3RyaW5nIGIuaW5uZXIuYnVmZmVyIG9mcyBsZW5cblxuXG5sZXQgYmxpdCBzcmMgc3Jjb2ZmIGRzdCBkc3RvZmYgbGVuID1cbiAgaWYgbGVuIDwgMCB8fCBzcmNvZmYgPCAwIHx8IHNyY29mZiA+IHNyYy5wb3NpdGlvbiAtIGxlblxuICAgICAgICAgICAgIHx8IGRzdG9mZiA8IDAgfHwgZHN0b2ZmID4gKEJ5dGVzLmxlbmd0aCBkc3QpIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJCdWZmZXIuYmxpdFwiXG4gIGVsc2VcbiAgICBCeXRlcy5ibGl0IHNyYy5pbm5lci5idWZmZXIgc3Jjb2ZmIGRzdCBkc3RvZmYgbGVuXG5cblxubGV0IG50aCBiIG9mcyA9XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtidWZmZXI7bGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgaWYgb2ZzIDwgMCB8fCBvZnMgPj0gcG9zaXRpb24gfHwgcG9zaXRpb24gPiBsZW5ndGggdGhlblxuICAgaW52YWxpZF9hcmcgXCJCdWZmZXIubnRoXCJcbiAgZWxzZSBCeXRlcy51bnNhZmVfZ2V0IGJ1ZmZlciBvZnNcblxuXG5sZXQgbGVuZ3RoIGIgPSBiLnBvc2l0aW9uXG5cbmxldCBjbGVhciBiID0gYi5wb3NpdGlvbiA8LSAwXG5cbmxldCByZXNldCBiID1cbiAgYi5wb3NpdGlvbiA8LSAwO1xuICBsZXQgaW5uZXIgPVxuICAgIHsgYnVmZmVyID0gYi5pbml0aWFsX2J1ZmZlcjsgbGVuZ3RoID0gQnl0ZXMubGVuZ3RoIGIuaW5pdGlhbF9idWZmZXIgfVxuICBpblxuICBiLmlubmVyIDwtIGlubmVyXG5cbigqIFtyZXNpemUgYiBtb3JlXSBlbnN1cmVzIHRoYXQgW2IucG9zaXRpb24gKyBtb3JlIDw9IGIuaW5uZXIubGVuZ3RoXSBob2xkc1xuICAgYnkgZHluYW1pY2FsbHkgZXh0ZW5kaW5nIFtiLmlubmVyXSBpZiBuZWNlc3NhcnkgLS0gYW5kIHRodXNcbiAgIGluY3JlYXNpbmcgW2IuaW5uZXIubGVuZ3RoXS5cbiopXG5sZXQgcmVzaXplIGIgbW9yZSA9XG4gIGxldCBvbGRfcG9zID0gYi5wb3NpdGlvbiBpblxuICBsZXQgb2xkX2xlbiA9IGIuaW5uZXIubGVuZ3RoIGluXG4gIGxldCBuZXdfbGVuID0gcmVmIG9sZF9sZW4gaW5cbiAgd2hpbGUgb2xkX3BvcyArIG1vcmUgPiAhbmV3X2xlbiBkbyBuZXdfbGVuIDo9IDIgKiAhbmV3X2xlbiBkb25lO1xuICBpZiAhbmV3X2xlbiA+IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuIGJlZ2luXG4gICAgaWYgb2xkX3BvcyArIG1vcmUgPD0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG4gICAgdGhlbiBuZXdfbGVuIDo9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgIGVsc2UgZmFpbHdpdGggXCJCdWZmZXIuYWRkOiBjYW5ub3QgZ3JvdyBidWZmZXJcIlxuICBlbmQ7XG4gIGxldCBuZXdfYnVmZmVyID0gQnl0ZXMuY3JlYXRlICFuZXdfbGVuIGluXG4gICgqIFBSIzYxNDg6IGxldCdzIGtlZXAgdXNpbmcgW2JsaXRdIHJhdGhlciB0aGFuIFt1bnNhZmVfYmxpdF0gaW5cbiAgICAgdGhpcyB0cmlja3kgZnVuY3Rpb24gdGhhdCBpcyBzbG93IGFueXdheS4gKilcbiAgQnl0ZXMuYmxpdCBiLmlubmVyLmJ1ZmZlciAwIG5ld19idWZmZXIgMCBiLnBvc2l0aW9uO1xuICBiLmlubmVyIDwtIHsgYnVmZmVyID0gbmV3X2J1ZmZlcjsgbGVuZ3RoID0gIW5ld19sZW4gfVxuXG4oKiBOb3RlOlxuICAgIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyBoYXZlIGEgZmFzdCBwYXRoIHdoZW4gdGhlIGlubmVyXG4gIGJ1ZmZlciBkb2Vzbid0IG5lZWQgdG8gYmUgZXh0ZW5kZWQuXG4gICAgSW4gdGhpcyBjYXNlLCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgdW5zYWZlIGFjY2Vzc2VzIG9uIHRoZVxuICBjb250ZW50cyBvZiB0aGUgW2lubmVyXSBmaWVsZCBzaW5jZSBpdHMgZmllbGRzIGFyZSBpbW11dGFibGUuXG4gIEluIHByZXNlbmNlIG9mIGRhdGEgcmFjZXMsIHdlIG1heSBhY2Nlc3MgdGhlIHdyb25nIGlubmVyIGJ1ZmZlciwgYnV0IHdlXG4gIHdpbGwgdXNlIHRoaXMgYnVmZmVyIHNhZmVseS5cbiAgQXMgc29vbiBhcyB3ZSBuZWVkIHRvIHJlc2l6ZSB0aGUgYnVmZmVyLCB3ZSBmYWxsIGJhY2sgdG8gc2FmZSBhY2Nlc3Nlcy5cbiopXG5cbmxldCBhZGRfY2hhciBiIGMgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2J1ZmZlcjtsZW5ndGh9ID0gYi5pbm5lciBpblxuICBpZiBwb3MgPj0gbGVuZ3RoIHRoZW4gKFxuICAgIHJlc2l6ZSBiIDE7XG4gICAgQnl0ZXMuc2V0IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gY1xuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfc2V0IGJ1ZmZlciBwb3MgYztcbiAgYi5wb3NpdGlvbiA8LSBwb3MgKyAxXG5cbmxldCB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXggPSA0XG5sZXQgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heCA9IDRcblxubGV0IHJlYyBhZGRfdXRmXzhfdWNoYXIgYiB1ID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgdWNoYXJfdXRmXzhfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfOF91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfOF9ieXRlX2xlbmd0aF9tYXg7IGFkZF91dGZfOF91Y2hhciBiIHUpXG4gIGVsc2UgKGIucG9zaXRpb24gPC0gcG9zICsgbilcblxubGV0IHJlYyBhZGRfdXRmXzE2YmVfdWNoYXIgYiB1ID1cbiAgbGV0IHBvcyA9IGIucG9zaXRpb24gaW5cbiAgaWYgcG9zID49IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDtcbiAgbGV0IG4gPSBCeXRlcy5zZXRfdXRmXzE2YmVfdWNoYXIgYi5pbm5lci5idWZmZXIgcG9zIHUgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiAocmVzaXplIGIgdWNoYXJfdXRmXzE2X2J5dGVfbGVuZ3RoX21heDsgYWRkX3V0Zl8xNmJlX3VjaGFyIGIgdSlcbiAgZWxzZSAoYi5wb3NpdGlvbiA8LSBwb3MgKyBuKVxuXG5sZXQgcmVjIGFkZF91dGZfMTZsZV91Y2hhciBiIHUgPVxuICBsZXQgcG9zID0gYi5wb3NpdGlvbiBpblxuICBpZiBwb3MgPj0gYi5pbm5lci5sZW5ndGggdGhlbiByZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4O1xuICBsZXQgbiA9IEJ5dGVzLnNldF91dGZfMTZsZV91Y2hhciBiLmlubmVyLmJ1ZmZlciBwb3MgdSBpblxuICBpZiBuID0gMFxuICB0aGVuIChyZXNpemUgYiB1Y2hhcl91dGZfMTZfYnl0ZV9sZW5ndGhfbWF4OyBhZGRfdXRmXzE2bGVfdWNoYXIgYiB1KVxuICBlbHNlIChiLnBvc2l0aW9uIDwtIHBvcyArIG4pXG5cbmxldCBhZGRfc3Vic3RyaW5nIGIgcyBvZmZzZXQgbGVuID1cbiAgaWYgb2Zmc2V0IDwgMCB8fCBsZW4gPCAwIHx8IG9mZnNldCA+IFN0cmluZy5sZW5ndGggcyAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnIFwiQnVmZmVyLmFkZF9zdWJzdHJpbmcvYWRkX3N1YmJ5dGVzXCI7XG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtidWZmZXI7bGVuZ3RofSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiBsZW47XG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcyBvZmZzZXQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiBsZW5cbiAgKSBlbHNlXG4gICAgQnl0ZXMudW5zYWZlX2JsaXRfc3RyaW5nIHMgb2Zmc2V0IGJ1ZmZlciBwb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfc3ViYnl0ZXMgYiBzIG9mZnNldCBsZW4gPVxuICBhZGRfc3Vic3RyaW5nIGIgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcykgb2Zmc2V0IGxlblxuXG5sZXQgYWRkX3N0cmluZyBiIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCBwb3NpdGlvbiA9IGIucG9zaXRpb24gaW5cbiAgbGV0IHtidWZmZXI7IGxlbmd0aH0gPSBiLmlubmVyIGluXG4gIGxldCBuZXdfcG9zaXRpb24gPSBiLnBvc2l0aW9uICsgbGVuIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiBsZW47XG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgcyAwIGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24gbGVuO1xuICApIGVsc2VcbiAgICBCeXRlcy51bnNhZmVfYmxpdF9zdHJpbmcgcyAwIGJ1ZmZlciBwb3NpdGlvbiBsZW47XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfYnl0ZXMgYiBzID0gYWRkX3N0cmluZyBiIChCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHMpXG5cbmxldCBhZGRfYnVmZmVyIGIgYnMgPVxuICBhZGRfc3ViYnl0ZXMgYiBicy5pbm5lci5idWZmZXIgMCBicy5wb3NpdGlvblxuXG4oKiB0aGlzIChwcml2YXRlKSBmdW5jdGlvbiBjb3VsZCBtb3ZlIGludG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkgKilcbmxldCByZWFsbHlfaW5wdXRfdXBfdG8gaWMgYnVmIG9mcyBsZW4gPVxuICBsZXQgcmVjIGxvb3AgaWMgYnVmIH5hbHJlYWR5X3JlYWQgfm9mcyB+dG9fcmVhZCA9XG4gICAgaWYgdG9fcmVhZCA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICBlbHNlIGJlZ2luXG4gICAgICBsZXQgciA9IGlucHV0IGljIGJ1ZiBvZnMgdG9fcmVhZCBpblxuICAgICAgaWYgciA9IDAgdGhlbiBhbHJlYWR5X3JlYWRcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgbGV0IGFscmVhZHlfcmVhZCA9IGFscmVhZHlfcmVhZCArIHIgaW5cbiAgICAgICAgbGV0IG9mcyA9IG9mcyArIHIgaW5cbiAgICAgICAgbGV0IHRvX3JlYWQgPSB0b19yZWFkIC0gciBpblxuICAgICAgICBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkIH5vZnMgfnRvX3JlYWRcbiAgICAgIGVuZFxuICAgIGVuZFxuICBpbiBsb29wIGljIGJ1ZiB+YWxyZWFkeV9yZWFkOjAgfm9mcyB+dG9fcmVhZDpsZW5cblxuXG5sZXQgdW5zYWZlX2FkZF9jaGFubmVsX3VwX3RvIGIgaWMgbGVuID1cbiAgaWYgYi5wb3NpdGlvbiArIGxlbiA+IGIuaW5uZXIubGVuZ3RoIHRoZW4gcmVzaXplIGIgbGVuO1xuICBsZXQgbiA9IHJlYWxseV9pbnB1dF91cF90byBpYyBiLmlubmVyLmJ1ZmZlciBiLnBvc2l0aW9uIGxlbiBpblxuICBiLnBvc2l0aW9uIDwtIGIucG9zaXRpb24gKyBuO1xuICBuXG5cbmxldCBhZGRfY2hhbm5lbCBiIGljIGxlbiA9XG4gIGlmIGxlbiA8IDAgfHwgbGVuID4gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW4gICAoKiBQUiM1MDA0ICopXG4gICAgaW52YWxpZF9hcmcgXCJCdWZmZXIuYWRkX2NoYW5uZWxcIjtcbiAgbGV0IG4gPSB1bnNhZmVfYWRkX2NoYW5uZWxfdXBfdG8gYiBpYyBsZW4gaW5cbiAgKCogSXQgaXMgaW50ZW50aW9uYWwgdGhhdCBhIGNvbnN1bWVyIGNhdGNoaW5nIEVuZF9vZl9maWxlXG4gICAgIHdpbGwgc2VlIHRoZSBkYXRhIHdyaXR0ZW4gKHNlZSAjNjcxOSwgIzcxMzYpLiAqKVxuICBpZiBuIDwgbGVuIHRoZW4gcmFpc2UgRW5kX29mX2ZpbGU7XG4gICgpXG5cbmxldCBvdXRwdXRfYnVmZmVyIG9jIGIgPVxuICBvdXRwdXQgb2MgYi5pbm5lci5idWZmZXIgMCBiLnBvc2l0aW9uXG5cbmxldCBjbG9zaW5nID0gZnVuY3Rpb25cbiAgfCAnKCcgLT4gJyknXG4gIHwgJ3snIC0+ICd9J1xuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbigqIG9wZW5pbmcgYW5kIGNsb3Npbmc6IG9wZW4gYW5kIGNsb3NlIGNoYXJhY3RlcnMsIHR5cGljYWxseSAoIGFuZCApXG4gICBrOiBiYWxhbmNlIG9mIG9wZW5pbmcgYW5kIGNsb3NpbmcgY2hhcnNcbiAgIHM6IHRoZSBzdHJpbmcgd2hlcmUgd2UgYXJlIHNlYXJjaGluZ1xuICAgc3RhcnQ6IHRoZSBpbmRleCB3aGVyZSB3ZSBzdGFydCB0aGUgc2VhcmNoLiAqKVxubGV0IGFkdmFuY2VfdG9fY2xvc2luZyBvcGVuaW5nIGNsb3NpbmcgayBzIHN0YXJ0ID1cbiAgbGV0IHJlYyBhZHZhbmNlIGsgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgICBpZiBzLltpXSA9IG9wZW5pbmcgdGhlbiBhZHZhbmNlIChrICsgMSkgKGkgKyAxKSBsaW0gZWxzZVxuICAgIGlmIHMuW2ldID0gY2xvc2luZyB0aGVuXG4gICAgICBpZiBrID0gMCB0aGVuIGkgZWxzZSBhZHZhbmNlIChrIC0gMSkgKGkgKyAxKSBsaW1cbiAgICBlbHNlIGFkdmFuY2UgayAoaSArIDEpIGxpbSBpblxuICBhZHZhbmNlIGsgc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxubGV0IGFkdmFuY2VfdG9fbm9uX2FscGhhIHMgc3RhcnQgPVxuICBsZXQgcmVjIGFkdmFuY2UgaSBsaW0gPVxuICAgIGlmIGkgPj0gbGltIHRoZW4gbGltIGVsc2VcbiAgICBtYXRjaCBzLltpXSB3aXRoXG4gICAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgfCAnXycgLT4gYWR2YW5jZSAoaSArIDEpIGxpbVxuICAgIHwgXyAtPiBpIGluXG4gIGFkdmFuY2Ugc3RhcnQgKFN0cmluZy5sZW5ndGggcylcblxuKCogV2UgYXJlIGp1c3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhbiBpZGVudCBpbiBzLCBzdGFydGluZyBhdCBzdGFydC4gKilcbmxldCBmaW5kX2lkZW50IHMgc3RhcnQgbGltID1cbiAgaWYgc3RhcnQgPj0gbGltIHRoZW4gcmFpc2UgTm90X2ZvdW5kIGVsc2VcbiAgbWF0Y2ggcy5bc3RhcnRdIHdpdGhcbiAgKCogUGFyZW50aGVzaXplZCBpZGVudCA/ICopXG4gIHwgJygnIHwgJ3snIGFzIGMgLT5cbiAgICAgbGV0IG5ld19zdGFydCA9IHN0YXJ0ICsgMSBpblxuICAgICBsZXQgc3RvcCA9IGFkdmFuY2VfdG9fY2xvc2luZyBjIChjbG9zaW5nIGMpIDAgcyBuZXdfc3RhcnQgaW5cbiAgICAgU3RyaW5nLnN1YiBzIG5ld19zdGFydCAoc3RvcCAtIHN0YXJ0IC0gMSksIHN0b3AgKyAxXG4gICgqIFJlZ3VsYXIgaWRlbnQgKilcbiAgfCBfIC0+XG4gICAgIGxldCBzdG9wID0gYWR2YW5jZV90b19ub25fYWxwaGEgcyAoc3RhcnQgKyAxKSBpblxuICAgICBTdHJpbmcuc3ViIHMgc3RhcnQgKHN0b3AgLSBzdGFydCksIHN0b3BcblxuKCogU3Vic3RpdHV0ZSAkaWRlbnQsICQoaWRlbnQpLCBvciAke2lkZW50fSBpbiBzLFxuICAgIGFjY29yZGluZyB0byB0aGUgZnVuY3Rpb24gbWFwcGluZyBmLiAqKVxubGV0IGFkZF9zdWJzdGl0dXRlIGIgZiBzID1cbiAgbGV0IGxpbSA9IFN0cmluZy5sZW5ndGggcyBpblxuICBsZXQgcmVjIHN1YnN0IHByZXZpb3VzIGkgPVxuICAgIGlmIGkgPCBsaW0gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnJCcgYXMgY3VycmVudCB3aGVuIHByZXZpb3VzID0gJ1xcXFwnIC0+XG4gICAgICAgICBhZGRfY2hhciBiIGN1cnJlbnQ7XG4gICAgICAgICBzdWJzdCAnICcgKGkgKyAxKVxuICAgICAgfCAnJCcgLT5cbiAgICAgICAgIGxldCBqID0gaSArIDEgaW5cbiAgICAgICAgIGxldCBpZGVudCwgbmV4dF9pID0gZmluZF9pZGVudCBzIGogbGltIGluXG4gICAgICAgICBhZGRfc3RyaW5nIGIgKGYgaWRlbnQpO1xuICAgICAgICAgc3Vic3QgJyAnIG5leHRfaVxuICAgICAgfCBjdXJyZW50IHdoZW4gcHJldmlvdXMgPT0gJ1xcXFwnIC0+XG4gICAgICAgICBhZGRfY2hhciBiICdcXFxcJztcbiAgICAgICAgIGFkZF9jaGFyIGIgY3VycmVudDtcbiAgICAgICAgIHN1YnN0ICcgJyAoaSArIDEpXG4gICAgICB8ICdcXFxcJyBhcyBjdXJyZW50IC0+XG4gICAgICAgICBzdWJzdCBjdXJyZW50IChpICsgMSlcbiAgICAgIHwgY3VycmVudCAtPlxuICAgICAgICAgYWRkX2NoYXIgYiBjdXJyZW50O1xuICAgICAgICAgc3Vic3QgY3VycmVudCAoaSArIDEpXG4gICAgZW5kIGVsc2VcbiAgICBpZiBwcmV2aW91cyA9ICdcXFxcJyB0aGVuIGFkZF9jaGFyIGIgcHJldmlvdXMgaW5cbiAgc3Vic3QgJyAnIDBcblxubGV0IHRydW5jYXRlIGIgbGVuID1cbiAgICBpZiBsZW4gPCAwIHx8IGxlbiA+IGxlbmd0aCBiIHRoZW5cbiAgICAgIGludmFsaWRfYXJnIFwiQnVmZmVyLnRydW5jYXRlXCJcbiAgICBlbHNlXG4gICAgICBiLnBvc2l0aW9uIDwtIGxlblxuXG4oKiogezEgSXRlcmF0b3JzfSAqKVxuXG5sZXQgdG9fc2VxIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICh4LCBhdXggKGkrMSkpXG4gIGluXG4gIGF1eCAwXG5cbmxldCB0b19zZXFpIGIgPVxuICBsZXQgcmVjIGF1eCBpICgpID1cbiAgICAoKiBOb3RlIHRoYXQgYi5wb3NpdGlvbiBpcyBub3QgYSBjb25zdGFudCBhbmQgY2Fubm90IGJlIGxpZnRlZCBvdXQgb2YgYXV4ICopXG4gICAgaWYgaSA+PSBiLnBvc2l0aW9uIHRoZW4gU2VxLk5pbFxuICAgIGVsc2VcbiAgICAgIGxldCB4ID0gQnl0ZXMuZ2V0IGIuaW5uZXIuYnVmZmVyIGkgaW5cbiAgICAgIFNlcS5Db25zICgoaSx4KSwgYXV4IChpKzEpKVxuICBpblxuICBhdXggMFxuXG5sZXQgYWRkX3NlcSBiIHNlcSA9IFNlcS5pdGVyIChhZGRfY2hhciBiKSBzZXFcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IGIgPSBjcmVhdGUgMzIgaW5cbiAgYWRkX3NlcSBiIGk7XG4gIGJcblxuKCoqIHs2IEJpbmFyeSBlbmNvZGluZyBvZiBpbnRlZ2Vyc30gKilcblxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ4IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlYnl0ZXNfdW5zYWZlX3NldFwiXG5leHRlcm5hbCB1bnNhZmVfc2V0X2ludDE2IDogYnl0ZXMgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQxNnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMnVcIlxuZXh0ZXJuYWwgdW5zYWZlX3NldF9pbnQ2NCA6IGJ5dGVzIC0+IGludCAtPiBpbnQ2NCAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQ2NHVcIlxuZXh0ZXJuYWwgc2V0X2ludDggOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVieXRlc19zYWZlX3NldFwiXG5leHRlcm5hbCBzZXRfaW50MTYgOiBieXRlcyAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDE2XCJcbmV4dGVybmFsIHNldF9pbnQzMiA6IGJ5dGVzIC0+IGludCAtPiBpbnQzMiAtPiB1bml0ID0gXCIlY2FtbF9ieXRlc19zZXQzMlwiXG5leHRlcm5hbCBzZXRfaW50NjQgOiBieXRlcyAtPiBpbnQgLT4gaW50NjQgLT4gdW5pdCA9IFwiJWNhbWxfYnl0ZXNfc2V0NjRcIlxuXG5leHRlcm5hbCBzd2FwMTYgOiBpbnQgLT4gaW50ID0gXCIlYnN3YXAxNlwiXG5leHRlcm5hbCBzd2FwMzIgOiBpbnQzMiAtPiBpbnQzMiA9IFwiJWJzd2FwX2ludDMyXCJcbmV4dGVybmFsIHN3YXA2NCA6IGludDY0IC0+IGludDY0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5cbmxldCBhZGRfaW50OCBiIHggPVxuICBsZXQgcG9zaXRpb24gPSBiLnBvc2l0aW9uIGluXG4gIGxldCB7bGVuZ3RoOyBidWZmZXJ9ID0gYi5pbm5lciBpblxuICBsZXQgbmV3X3Bvc2l0aW9uID0gcG9zaXRpb24gKyAxIGluXG4gIGlmIG5ld19wb3NpdGlvbiA+IGxlbmd0aCB0aGVuIChcbiAgICByZXNpemUgYiAxO1xuICAgIHNldF9pbnQ4IGIuaW5uZXIuYnVmZmVyIGIucG9zaXRpb24geFxuICApIGVsc2VcbiAgICB1bnNhZmVfc2V0X2ludDggYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgMiBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgMjtcbiAgICBzZXRfaW50MTYgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MTYgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MzJfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgNCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgNDtcbiAgICBzZXRfaW50MzIgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50MzIgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50NjRfbmUgYiB4ID1cbiAgbGV0IHBvc2l0aW9uID0gYi5wb3NpdGlvbiBpblxuICBsZXQge2xlbmd0aDsgYnVmZmVyfSA9IGIuaW5uZXIgaW5cbiAgbGV0IG5ld19wb3NpdGlvbiA9IHBvc2l0aW9uICsgOCBpblxuICBpZiBuZXdfcG9zaXRpb24gPiBsZW5ndGggdGhlbiAoXG4gICAgcmVzaXplIGIgODtcbiAgICBzZXRfaW50NjQgYi5pbm5lci5idWZmZXIgYi5wb3NpdGlvbiB4XG4gICkgZWxzZVxuICAgIHVuc2FmZV9zZXRfaW50NjQgYnVmZmVyIHBvc2l0aW9uIHg7XG4gIGIucG9zaXRpb24gPC0gbmV3X3Bvc2l0aW9uXG5cbmxldCBhZGRfaW50MTZfbGUgYiB4ID1cbiAgYWRkX2ludDE2X25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4gc3dhcDE2IHggZWxzZSB4KVxuXG5sZXQgYWRkX2ludDE2X2JlIGIgeCA9XG4gIGFkZF9pbnQxNl9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHggZWxzZSBzd2FwMTYgeClcblxubGV0IGFkZF9pbnQzMl9sZSBiIHggPVxuICBhZGRfaW50MzJfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiBzd2FwMzIgeCBlbHNlIHgpXG5cbmxldCBhZGRfaW50MzJfYmUgYiB4ID1cbiAgYWRkX2ludDMyX25lIGIgKGlmIFN5cy5iaWdfZW5kaWFuIHRoZW4geCBlbHNlIHN3YXAzMiB4KVxuXG5sZXQgYWRkX2ludDY0X2xlIGIgeCA9XG4gIGFkZF9pbnQ2NF9uZSBiIChpZiBTeXMuYmlnX2VuZGlhbiB0aGVuIHN3YXA2NCB4IGVsc2UgeClcblxubGV0IGFkZF9pbnQ2NF9iZSBiIHggPVxuICBhZGRfaW50NjRfbmUgYiAoaWYgU3lzLmJpZ19lbmRpYW4gdGhlbiB4IGVsc2Ugc3dhcDY0IHgpXG5cbmxldCBhZGRfdWludDggPSBhZGRfaW50OFxubGV0IGFkZF91aW50MTZfbmUgPSBhZGRfaW50MTZfbmVcbmxldCBhZGRfdWludDE2X2xlID0gYWRkX2ludDE2X2xlXG5sZXQgYWRkX3VpbnQxNl9iZSA9IGFkZF9pbnQxNl9iZVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgWGF2aWVyIExlcm95LCBDb2xsw6hnZSBkZSBGcmFuY2UgYW5kIElOUklBIFBhcmlzICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjAgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCoqIFNlbWFwaG9yZXMgKilcblxudHlwZSBzZW0gPSB7XG4gIG11dDogTXV0ZXgudDsgICAgICAgICAgICAgICAgICAgICAgICAgKCogcHJvdGVjdHMgW3ZdICopXG4gIG11dGFibGUgdjogaW50OyAgICAgICAgICAgICAgICAgICAgICAgKCogdGhlIGN1cnJlbnQgdmFsdWUgKilcbiAgbm9uemVybzogQ29uZGl0aW9uLnQgICAgICAgICAgICAgICAgICAoKiBzaWduYWxlZCB3aGVuIFt2ID4gMF0gKilcbn1cblxubW9kdWxlIENvdW50aW5nID0gc3RydWN0XG5cbnR5cGUgdCA9IHNlbVxuXG5sZXQgbWFrZSB2ID1cbiAgaWYgdiA8IDAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlbWFwaG9yZS5Db3VudGluZy5pbml0OiB3cm9uZyBpbml0aWFsIHZhbHVlXCI7XG4gIHsgbXV0ID0gTXV0ZXguY3JlYXRlKCk7IHY7IG5vbnplcm8gPSBDb25kaXRpb24uY3JlYXRlKCkgfVxuXG5sZXQgcmVsZWFzZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgaWYgcy52IDwgbWF4X2ludCB0aGVuIGJlZ2luXG4gICAgcy52IDwtIHMudiArIDE7XG4gICAgQ29uZGl0aW9uLnNpZ25hbCBzLm5vbnplcm87XG4gICAgTXV0ZXgudW5sb2NrIHMubXV0XG4gIGVuZCBlbHNlIGJlZ2luXG4gICAgTXV0ZXgudW5sb2NrIHMubXV0O1xuICAgIHJhaXNlIChTeXNfZXJyb3IgXCJTZW1hcGhvcmUuQ291bnRpbmcucmVsZWFzZTogb3ZlcmZsb3dcIilcbiAgZW5kXG5cbmxldCBhY3F1aXJlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICB3aGlsZSBzLnYgPSAwIGRvIENvbmRpdGlvbi53YWl0IHMubm9uemVybyBzLm11dCBkb25lO1xuICBzLnYgPC0gcy52IC0gMTtcbiAgTXV0ZXgudW5sb2NrIHMubXV0XG5cbmxldCB0cnlfYWNxdWlyZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgbGV0IHJldCA9IGlmIHMudiA9IDAgdGhlbiBmYWxzZSBlbHNlIChzLnYgPC0gcy52IC0gMTsgdHJ1ZSkgaW5cbiAgTXV0ZXgudW5sb2NrIHMubXV0O1xuICByZXRcblxubGV0IGdldF92YWx1ZSBzID0gcy52XG5cbmVuZFxuXG5tb2R1bGUgQmluYXJ5ID0gc3RydWN0XG5cbnR5cGUgdCA9IHNlbVxuXG5sZXQgbWFrZSBiID1cbiAgeyBtdXQgPSBNdXRleC5jcmVhdGUoKTtcbiAgICB2ID0gaWYgYiB0aGVuIDEgZWxzZSAwO1xuICAgIG5vbnplcm8gPSBDb25kaXRpb24uY3JlYXRlKCkgfVxuXG5sZXQgcmVsZWFzZSBzID1cbiAgTXV0ZXgubG9jayBzLm11dDtcbiAgcy52IDwtIDE7XG4gIENvbmRpdGlvbi5zaWduYWwgcy5ub256ZXJvO1xuICBNdXRleC51bmxvY2sgcy5tdXRcblxubGV0IGFjcXVpcmUgcyA9XG4gIE11dGV4LmxvY2sgcy5tdXQ7XG4gIHdoaWxlIHMudiA9IDAgZG8gQ29uZGl0aW9uLndhaXQgcy5ub256ZXJvIHMubXV0IGRvbmU7XG4gIHMudiA8LSAwO1xuICBNdXRleC51bmxvY2sgcy5tdXRcblxubGV0IHRyeV9hY3F1aXJlIHMgPVxuICBNdXRleC5sb2NrIHMubXV0O1xuICBsZXQgcmV0ID0gaWYgcy52ID0gMCB0aGVuIGZhbHNlIGVsc2UgKHMudiA8LSAwOyB0cnVlKSBpblxuICBNdXRleC51bmxvY2sgcy5tdXQ7XG4gIHJldFxuXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgS0MgU2l2YXJhbWFrcmlzaG5hbiwgSW5kaWFuIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBNYWRyYXMgICAgICAgKilcbigqICAgICAgICAgICAgICAgICBTdGVwaGVuIERvbGFuLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgIFRvbSBLZWxseSwgT0NhbWwgTGFicyBDb25zdWx0YW5jeSAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTkgSW5kaWFuIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBNYWRyYXMgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgVW5pdmVyc2l0eSBvZiBDYW1icmlkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMjEgT0NhbWwgTGFicyBDb25zdWx0YW5jeSBMdGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubW9kdWxlIFJhdyA9IHN0cnVjdFxuICAoKiBMb3ctbGV2ZWwgcHJpbWl0aXZlcyBwcm92aWRlZCBieSB0aGUgcnVudGltZSAqKVxuICB0eXBlIHQgPSBwcml2YXRlIGludFxuICBleHRlcm5hbCBzcGF3biA6ICh1bml0IC0+IHVuaXQpIC0+IE11dGV4LnQgLT4gdFxuICAgID0gXCJjYW1sX2RvbWFpbl9zcGF3blwiXG4gIGV4dGVybmFsIHNlbGYgOiB1bml0IC0+IHRcbiAgICA9IFwiY2FtbF9tbF9kb21haW5faWRcIlxuICBleHRlcm5hbCBjcHVfcmVsYXggOiB1bml0IC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tbF9kb21haW5fY3B1X3JlbGF4XCJcbiAgZXh0ZXJuYWwgZ2V0X3JlY29tbWVuZGVkX2RvbWFpbl9jb3VudDogdW5pdCAtPiBpbnRcbiAgICA9IFwiY2FtbF9yZWNvbW1lbmRlZF9kb21haW5fY291bnRcIiBbQEBub2FsbG9jXVxuZW5kXG5cbmxldCBjcHVfcmVsYXggKCkgPSBSYXcuY3B1X3JlbGF4ICgpXG5cbnR5cGUgaWQgPSBSYXcudFxuXG50eXBlICdhIHN0YXRlID1cbnwgUnVubmluZ1xufCBGaW5pc2hlZCBvZiAoJ2EsIGV4bikgcmVzdWx0XG5cbnR5cGUgJ2EgdCA9IHtcbiAgZG9tYWluIDogUmF3LnQ7XG4gIHRlcm1fbXV0ZXg6IE11dGV4LnQ7XG4gIHRlcm1fY29uZGl0aW9uOiBDb25kaXRpb24udDtcbiAgdGVybV9zdGF0ZTogJ2Egc3RhdGUgcmVmICgqIHByb3RlY3RlZCBieSBbdGVybV9tdXRleF0gKilcbn1cblxubW9kdWxlIERMUyA9IHN0cnVjdFxuXG4gIHR5cGUgZGxzX3N0YXRlID0gT2JqLnQgYXJyYXlcblxuICBsZXQgdW5pcXVlX3ZhbHVlID0gT2JqLnJlcHIgKHJlZiAwKVxuXG4gIGV4dGVybmFsIGdldF9kbHNfc3RhdGUgOiB1bml0IC0+IGRsc19zdGF0ZSA9IFwiJWRsc19nZXRcIlxuXG4gIGV4dGVybmFsIHNldF9kbHNfc3RhdGUgOiBkbHNfc3RhdGUgLT4gdW5pdCA9XG4gICAgXCJjYW1sX2RvbWFpbl9kbHNfc2V0XCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlX2RscyAoKSA9XG4gICAgbGV0IHN0ID0gQXJyYXkubWFrZSA4IHVuaXF1ZV92YWx1ZSBpblxuICAgIHNldF9kbHNfc3RhdGUgc3RcblxuICBsZXQgXyA9IGNyZWF0ZV9kbHMgKClcblxuICB0eXBlICdhIGtleSA9IGludCAqICh1bml0IC0+ICdhKVxuXG4gIGxldCBrZXlfY291bnRlciA9IEF0b21pYy5tYWtlIDBcblxuICB0eXBlIGtleV9pbml0aWFsaXplciA9XG4gICAgS0k6ICdhIGtleSAqICgnYSAtPiAnYSkgLT4ga2V5X2luaXRpYWxpemVyXG5cbiAgbGV0IHBhcmVudF9rZXlzID0gQXRvbWljLm1ha2UgKFtdIDoga2V5X2luaXRpYWxpemVyIGxpc3QpXG5cbiAgbGV0IHJlYyBhZGRfcGFyZW50X2tleSBraSA9XG4gICAgbGV0IGwgPSBBdG9taWMuZ2V0IHBhcmVudF9rZXlzIGluXG4gICAgaWYgbm90IChBdG9taWMuY29tcGFyZV9hbmRfc2V0IHBhcmVudF9rZXlzIGwgKGtpIDo6IGwpKVxuICAgIHRoZW4gYWRkX3BhcmVudF9rZXkga2lcblxuICBsZXQgbmV3X2tleSA/c3BsaXRfZnJvbV9wYXJlbnQgaW5pdF9vcnBoYW4gPVxuICAgIGxldCBpZHggPSBBdG9taWMuZmV0Y2hfYW5kX2FkZCBrZXlfY291bnRlciAxIGluXG4gICAgbGV0IGsgPSAoaWR4LCBpbml0X29ycGhhbikgaW5cbiAgICBiZWdpbiBtYXRjaCBzcGxpdF9mcm9tX3BhcmVudCB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIHNwbGl0IC0+IGFkZF9wYXJlbnRfa2V5IChLSShrLCBzcGxpdCkpXG4gICAgZW5kO1xuICAgIGtcblxuICAoKiBJZiBuZWNlc3NhcnksIGdyb3cgdGhlIGN1cnJlbnQgZG9tYWluJ3MgbG9jYWwgc3RhdGUgYXJyYXkgc3VjaCB0aGF0IFtpZHhdXG4gICAqIGlzIGEgdmFsaWQgaW5kZXggaW4gdGhlIGFycmF5LiAqKVxuICBsZXQgbWF5YmVfZ3JvdyBpZHggPVxuICAgIGxldCBzdCA9IGdldF9kbHNfc3RhdGUgKCkgaW5cbiAgICBsZXQgc3ogPSBBcnJheS5sZW5ndGggc3QgaW5cbiAgICBpZiBpZHggPCBzeiB0aGVuIHN0XG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHJlYyBjb21wdXRlX25ld19zaXplIHMgPVxuICAgICAgICBpZiBpZHggPCBzIHRoZW4gcyBlbHNlIGNvbXB1dGVfbmV3X3NpemUgKDIgKiBzKVxuICAgICAgaW5cbiAgICAgIGxldCBuZXdfc3ogPSBjb21wdXRlX25ld19zaXplIHN6IGluXG4gICAgICBsZXQgbmV3X3N0ID0gQXJyYXkubWFrZSBuZXdfc3ogdW5pcXVlX3ZhbHVlIGluXG4gICAgICBBcnJheS5ibGl0IHN0IDAgbmV3X3N0IDAgc3o7XG4gICAgICBzZXRfZGxzX3N0YXRlIG5ld19zdDtcbiAgICAgIG5ld19zdFxuICAgIGVuZFxuXG4gIGxldCBzZXQgKGlkeCwgX2luaXQpIHggPVxuICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluXG4gICAgKCogW1N5cy5vcGFxdWVfaWRlbnRpdHldIGVuc3VyZXMgdGhhdCBmbGFtYmRhIGRvZXMgbm90IGxvb2sgYXQgdGhlIHR5cGUgb2ZcbiAgICAgKiBbeF0sIHdoaWNoIG1heSBiZSBhIFtmbG9hdF0gYW5kIGNvbmNsdWRlIHRoYXQgdGhlIFtzdF0gaXMgYSBmbG9hdCBhcnJheS5cbiAgICAgKiBXZSBkbyBub3Qgd2FudCBPQ2FtbCdzIGZsb2F0IGFycmF5IG9wdGltaXNhdGlvbiBraWNraW5nIGluIGhlcmUuICopXG4gICAgc3QuKGlkeCkgPC0gT2JqLnJlcHIgKFN5cy5vcGFxdWVfaWRlbnRpdHkgeClcblxuICBsZXQgZ2V0IChpZHgsIGluaXQpID1cbiAgICBsZXQgc3QgPSBtYXliZV9ncm93IGlkeCBpblxuICAgIGxldCB2ID0gc3QuKGlkeCkgaW5cbiAgICBpZiB2ID09IHVuaXF1ZV92YWx1ZSB0aGVuXG4gICAgICBsZXQgdicgPSBPYmoucmVwciAoaW5pdCAoKSkgaW5cbiAgICAgIHN0LihpZHgpIDwtIChTeXMub3BhcXVlX2lkZW50aXR5IHYnKTtcbiAgICAgIE9iai5tYWdpYyB2J1xuICAgIGVsc2UgT2JqLm1hZ2ljIHZcblxuICBsZXQgZ2V0X2luaXRpYWxfa2V5cyAoKSA6IChpbnQgKiBPYmoudCkgbGlzdCA9XG4gICAgTGlzdC5tYXBcbiAgICAgIChmdW4gKEtJICgoaWR4LCBfKSBhcyBrLCBzcGxpdCkpIC0+XG4gICAgICAgICAgIChpZHgsIE9iai5yZXByIChzcGxpdCAoZ2V0IGspKSkpXG4gICAgICAoQXRvbWljLmdldCBwYXJlbnRfa2V5cylcblxuICBsZXQgc2V0X2luaXRpYWxfa2V5cyAobDogKGludCAqIE9iai50KSBsaXN0KSA9XG4gICAgTGlzdC5pdGVyXG4gICAgICAoZnVuIChpZHgsIHYpIC0+XG4gICAgICAgIGxldCBzdCA9IG1heWJlX2dyb3cgaWR4IGluIHN0LihpZHgpIDwtIHYpXG4gICAgICBsXG5cbmVuZFxuXG4oKioqKioqKiogSWRlbnRpdHkgKioqKioqKioqKilcblxubGV0IGdldF9pZCB7IGRvbWFpbjsgXyB9ID0gZG9tYWluXG5cbmxldCBzZWxmICgpID0gUmF3LnNlbGYgKClcblxubGV0IGlzX21haW5fZG9tYWluICgpID0gKHNlbGYgKCkgOj4gaW50KSA9IDBcblxuKCoqKioqKioqIENhbGxiYWNrcyAqKioqKioqKioqKVxuXG4oKiBmaXJzdCBzcGF3biwgZG9tYWluIHN0YXJ0dXAgYW5kIGF0IGV4aXQgZnVuY3Rpb25hbGl0eSAqKVxubGV0IGZpcnN0X2RvbWFpbl9zcGF3bmVkID0gQXRvbWljLm1ha2UgZmFsc2VcblxubGV0IGZpcnN0X3NwYXduX2Z1bmN0aW9uID0gcmVmIChmdW4gKCkgLT4gKCkpXG5cbmxldCBiZWZvcmVfZmlyc3Rfc3Bhd24gZiA9XG4gIGlmIEF0b21pYy5nZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdGhlblxuICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiZmlyc3QgZG9tYWluIGFscmVhZHkgc3Bhd25lZFwiKVxuICBlbHNlIGJlZ2luXG4gICAgbGV0IG9sZF9mID0gIWZpcnN0X3NwYXduX2Z1bmN0aW9uIGluXG4gICAgbGV0IG5ld19mICgpID0gb2xkX2YgKCk7IGYgKCkgaW5cbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSBuZXdfZlxuICBlbmRcblxubGV0IGRvX2JlZm9yZV9maXJzdF9zcGF3biAoKSA9XG4gIGlmIG5vdCAoQXRvbWljLmdldCBmaXJzdF9kb21haW5fc3Bhd25lZCkgdGhlbiBiZWdpblxuICAgIEF0b21pYy5zZXQgZmlyc3RfZG9tYWluX3NwYXduZWQgdHJ1ZTtcbiAgICAhZmlyc3Rfc3Bhd25fZnVuY3Rpb24oKTtcbiAgICAoKiBSZWxlYXNlIHRoZSBvbGQgZnVuY3Rpb24gKilcbiAgICBmaXJzdF9zcGF3bl9mdW5jdGlvbiA6PSAoZnVuICgpIC0+ICgpKVxuICBlbmRcblxubGV0IGF0X2V4aXRfa2V5ID0gRExTLm5ld19rZXkgKGZ1biAoKSAtPiAoZnVuICgpIC0+ICgpKSlcblxubGV0IGF0X2V4aXQgZiA9XG4gIGxldCBvbGRfZXhpdCA6IHVuaXQgLT4gdW5pdCA9IERMUy5nZXQgYXRfZXhpdF9rZXkgaW5cbiAgbGV0IG5ld19leGl0ICgpID1cbiAgICAoKiBUaGUgZG9tYWluIHRlcm1pbmF0aW9uIGNhbGxiYWNrcyAoW2F0X2V4aXRdKSBhcmUgcnVuIGluXG4gICAgICAgbGFzdC1pbi1maXJzdC1vdXQgKExJRk8pIG9yZGVyIGluIG9yZGVyIHRvIGJlIHN5bW1ldHJpYyB3aXRoIHRoZSBkb21haW5cbiAgICAgICBjcmVhdGlvbiBjYWxsYmFja3MgKFthdF9lYWNoX3NwYXduXSkgd2hpY2ggcnVuIGluIGZpcnN0LWluLWZpc3J0LW91dFxuICAgICAgIChGSUZPKSBvcmRlci4gKilcbiAgICBmICgpOyBvbGRfZXhpdCAoKVxuICBpblxuICBETFMuc2V0IGF0X2V4aXRfa2V5IG5ld19leGl0XG5cbmxldCBkb19hdF9leGl0ICgpID1cbiAgbGV0IGYgOiB1bml0IC0+IHVuaXQgPSBETFMuZ2V0IGF0X2V4aXRfa2V5IGluXG4gIGYgKClcblxubGV0IF8gPSBTdGRsaWIuZG9fZG9tYWluX2xvY2FsX2F0X2V4aXQgOj0gZG9fYXRfZXhpdFxuXG4oKioqKioqKiBDcmVhdGlvbiBhbmQgVGVybWluYXRpb24gKioqKioqKiopXG5cbmxldCBzcGF3biBmID1cbiAgZG9fYmVmb3JlX2ZpcnN0X3NwYXduICgpO1xuICBsZXQgcGsgPSBETFMuZ2V0X2luaXRpYWxfa2V5cyAoKSBpblxuXG4gICgqIFRoZSBbdGVybV9tdXRleF0gYW5kIFt0ZXJtX2NvbmRpdGlvbl0gYXJlIHVzZWQgdG9cbiAgICAgc3luY2hyb25pemUgd2l0aCB0aGUgam9pbmluZyBkb21haW5zICopXG4gIGxldCB0ZXJtX211dGV4ID0gTXV0ZXguY3JlYXRlICgpIGluXG4gIGxldCB0ZXJtX2NvbmRpdGlvbiA9IENvbmRpdGlvbi5jcmVhdGUgKCkgaW5cbiAgbGV0IHRlcm1fc3RhdGUgPSByZWYgUnVubmluZyBpblxuXG4gIGxldCBib2R5ICgpID1cbiAgICBsZXQgcmVzdWx0ID1cbiAgICAgIG1hdGNoXG4gICAgICAgIERMUy5jcmVhdGVfZGxzICgpO1xuICAgICAgICBETFMuc2V0X2luaXRpYWxfa2V5cyBwaztcbiAgICAgICAgbGV0IHJlcyA9IGYgKCkgaW5cbiAgICAgICAgcmVzXG4gICAgICB3aXRoXG4gICAgICB8IHggLT4gT2sgeFxuICAgICAgfCBleGNlcHRpb24gZXggLT4gRXJyb3IgZXhcbiAgICBpblxuXG4gICAgbGV0IHJlc3VsdCcgPVxuICAgICAgKCogUnVuIHRoZSBbYXRfZXhpdF0gY2FsbGJhY2tzIHdoZW4gdGhlIGRvbWFpbiBjb21wdXRhdGlvbiBlaXRoZXJcbiAgICAgICAgIHRlcm1pbmF0ZXMgbm9ybWFsbHkgb3IgZXhjZXB0aW9uYWxseS4gKilcbiAgICAgIG1hdGNoIGRvX2F0X2V4aXQgKCkgd2l0aFxuICAgICAgfCAoKSAtPiByZXN1bHRcbiAgICAgIHwgZXhjZXB0aW9uIGV4IC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggcmVzdWx0IHdpdGhcbiAgICAgICAgICB8IE9rIF8gLT5cbiAgICAgICAgICAgICAgKCogSWYgdGhlIGRvbWFpbiBjb21wdXRhdGlvbiB0ZXJtaW5hdGVkIG5vcm1hbGx5LCBidXQgdGhlXG4gICAgICAgICAgICAgICAgIFthdF9leGl0XSBjYWxsYmFja3MgcmFpc2VkIGFuIGV4Y2VwdGlvbiwgdGhlbiByZXR1cm4gdGhlXG4gICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi4gKilcbiAgICAgICAgICAgICAgRXJyb3IgZXhcbiAgICAgICAgICB8IEVycm9yIF8gLT5cbiAgICAgICAgICAgICAgKCogSWYgYm90aCB0aGUgZG9tYWluIGNvbXB1dGF0aW9uIGFuZCB0aGUgW2F0X2V4aXRdIGNhbGxiYWNrc1xuICAgICAgICAgICAgICAgICByYWlzZWQgZXhjZXB0aW9ucywgdGhlbiBpZ25vcmUgdGhlIGV4Y2VwdGlvbiBmcm9tIHRoZVxuICAgICAgICAgICAgICAgICBbYXRfZXhpdF0gY2FsbGJhY2tzIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi4gKilcbiAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgZW5kXG4gICAgaW5cblxuICAgICgqIFN5bmNocm9uaXplIHdpdGggam9pbmluZyBkb21haW5zICopXG4gICAgTXV0ZXgubG9jayB0ZXJtX211dGV4O1xuICAgIG1hdGNoICF0ZXJtX3N0YXRlIHdpdGhcbiAgICB8IFJ1bm5pbmcgLT5cbiAgICAgICAgdGVybV9zdGF0ZSA6PSBGaW5pc2hlZCByZXN1bHQnO1xuICAgICAgICBDb25kaXRpb24uYnJvYWRjYXN0IHRlcm1fY29uZGl0aW9uO1xuICAgIHwgRmluaXNoZWQgXyAtPlxuICAgICAgICBmYWlsd2l0aCBcImludGVybmFsIGVycm9yOiBBbSBJIGFscmVhZHkgZmluaXNoZWQ/XCJcbiAgICAoKiBbdGVybV9tdXRleF0gaXMgdW5sb2NrZWQgaW4gdGhlIHJ1bnRpbWUgYWZ0ZXIgdGhlIGNsZWFudXAgZnVuY3Rpb25zIG9uXG4gICAgICAgdGhlIEMgc2lkZSBhcmUgZmluaXNoZWQuICopXG4gIGluXG4gIHsgZG9tYWluID0gUmF3LnNwYXduIGJvZHkgdGVybV9tdXRleDtcbiAgICB0ZXJtX211dGV4O1xuICAgIHRlcm1fY29uZGl0aW9uO1xuICAgIHRlcm1fc3RhdGUgfVxuXG5sZXQgam9pbiB7IHRlcm1fbXV0ZXg7IHRlcm1fY29uZGl0aW9uOyB0ZXJtX3N0YXRlOyBfIH0gPVxuICBNdXRleC5sb2NrIHRlcm1fbXV0ZXg7XG4gIGxldCByZWMgbG9vcCAoKSA9XG4gICAgbWF0Y2ggIXRlcm1fc3RhdGUgd2l0aFxuICAgIHwgUnVubmluZyAtPlxuICAgICAgICBDb25kaXRpb24ud2FpdCB0ZXJtX2NvbmRpdGlvbiB0ZXJtX211dGV4O1xuICAgICAgICBsb29wICgpXG4gICAgfCBGaW5pc2hlZCByZXMgLT5cbiAgICAgICAgTXV0ZXgudW5sb2NrIHRlcm1fbXV0ZXg7XG4gICAgICAgIHJlc1xuICBpblxuICBtYXRjaCBsb29wICgpIHdpdGhcbiAgfCBPayB4IC0+IHhcbiAgfCBFcnJvciBleCAtPiByYWlzZSBleFxuXG5sZXQgcmVjb21tZW5kZWRfZG9tYWluX2NvdW50ID0gUmF3LmdldF9yZWNvbW1lbmRlZF9kb21haW5fY291bnRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgVmF1Z29uLCBFTlNUQSAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3NcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgKCogVG9vbHMgdG8gbWFuaXB1bGF0ZSBzY2FubmluZyBzZXQgb2YgY2hhcnMgKHNlZSAlWy4uLl0pICopXG5cbnR5cGUgbXV0YWJsZV9jaGFyX3NldCA9IGJ5dGVzXG5cbigqIENyZWF0ZSBhIGZyZXNoLCBlbXB0eSwgbXV0YWJsZSBjaGFyIHNldC4gKilcbmxldCBjcmVhdGVfY2hhcl9zZXQgKCkgPSBCeXRlcy5tYWtlIDMyICdcXDAwMCdcblxuKCogQWRkIGEgY2hhciBpbiBhIG11dGFibGUgY2hhciBzZXQuICopXG5sZXQgYWRkX2luX2NoYXJfc2V0IGNoYXJfc2V0IGMgPVxuICBsZXQgaW5kID0gaW50X29mX2NoYXIgYyBpblxuICBsZXQgc3RyX2luZCA9IGluZCBsc3IgMyBhbmQgbWFzayA9IDEgbHNsIChpbmQgbGFuZCAwYjExMSkgaW5cbiAgQnl0ZXMuc2V0IGNoYXJfc2V0IHN0cl9pbmRcbiAgICAoY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIChCeXRlcy5nZXQgY2hhcl9zZXQgc3RyX2luZCkgbG9yIG1hc2spKVxuXG5sZXQgZnJlZXplX2NoYXJfc2V0IGNoYXJfc2V0ID1cbiAgQnl0ZXMudG9fc3RyaW5nIGNoYXJfc2V0XG5cbigqIENvbXB1dGUgdGhlIGNvbXBsZW1lbnQgb2YgYSBjaGFyIHNldC4gKilcbmxldCByZXZfY2hhcl9zZXQgY2hhcl9zZXQgPVxuICBsZXQgY2hhcl9zZXQnID0gY3JlYXRlX2NoYXJfc2V0ICgpIGluXG4gIGZvciBpID0gMCB0byAzMSBkb1xuICAgIEJ5dGVzLnNldCBjaGFyX3NldCcgaVxuICAgICAgKGNoYXJfb2ZfaW50IChpbnRfb2ZfY2hhciAoU3RyaW5nLmdldCBjaGFyX3NldCBpKSBseG9yIDB4RkYpKTtcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBjaGFyX3NldCdcblxuKCogUmV0dXJuIHRydWUgaWYgYSBgYycgaXMgaW4gYGNoYXJfc2V0Jy4gKilcbmxldCBpc19pbl9jaGFyX3NldCBjaGFyX3NldCBjID1cbiAgbGV0IGluZCA9IGludF9vZl9jaGFyIGMgaW5cbiAgbGV0IHN0cl9pbmQgPSBpbmQgbHNyIDMgYW5kIG1hc2sgPSAxIGxzbCAoaW5kIGxhbmQgMGIxMTEpIGluXG4gIChpbnRfb2ZfY2hhciAoU3RyaW5nLmdldCBjaGFyX3NldCBzdHJfaW5kKSBsYW5kIG1hc2spIDw+IDBcblxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICgqIElnbm9yZWQgcGFyYW0gY29udmVyc2lvbiAqKVxuXG4oKiBHQURUIHVzZWQgdG8gYWJzdHJhY3QgYW4gZXhpc3RlbnRpYWwgdHlwZSBwYXJhbWV0ZXIuICopXG4oKiBTZWUgcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0LiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFyYW1fZm9ybWF0X2ViYiA9IFBhcmFtX2Zvcm1hdF9FQkIgOlxuICAgICgneCAtPiAnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgcGFyYW1fZm9ybWF0X2ViYlxuXG4oKiBDb21wdXRlIGEgcGFkZGluZyBhc3NvY2lhdGVkIHRvIGEgcGFkX29wdGlvbiAoc2VlIFwiJV80MmRcIikuICopXG5sZXQgcGFkX29mX3BhZF9vcHQgcGFkX29wdCA9IG1hdGNoIHBhZF9vcHQgd2l0aFxuICB8IE5vbmUgLT4gTm9fcGFkZGluZ1xuICB8IFNvbWUgd2lkdGggLT4gTGl0X3BhZGRpbmcgKFJpZ2h0LCB3aWR0aClcblxuKCogQ29tcHV0ZSBhIHByZWNpc2lvbiBhc3NvY2lhdGVkIHRvIGEgcHJlY19vcHRpb24gKHNlZSBcIiVfLjQyZlwiKS4gKilcbmxldCBwcmVjX29mX3ByZWNfb3B0IHByZWNfb3B0ID0gbWF0Y2ggcHJlY19vcHQgd2l0aFxuICB8IE5vbmUgLT4gTm9fcHJlY2lzaW9uXG4gIHwgU29tZSBuZGVjIC0+IExpdF9wcmVjaXNpb24gbmRlY1xuXG4oKiBUdXJuIGFuIGlnbm9yZWQgcGFyYW0gaW50byBpdHMgZXF1aXZhbGVudCBub3QtaWdub3JlZCBmb3JtYXQgbm9kZS4gKilcbigqIFVzZWQgZm9yIGZvcm1hdCBwcmV0dHktcHJpbnRpbmcgYW5kIFNjYW5mLiAqKVxubGV0IHBhcmFtX2Zvcm1hdF9vZl9pZ25vcmVkX2Zvcm1hdCA6IHR5cGUgYSBiIGMgZCBlIGYgeCB5IC5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPiAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+XG4gICAgICAoYSwgYiwgYywgZCwgZSwgZikgcGFyYW1fZm9ybWF0X2ViYiA9XG5mdW4gaWduIGZtdCAtPiBtYXRjaCBpZ24gd2l0aFxuICB8IElnbm9yZWRfY2hhciAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKENoYXIgZm10KVxuICB8IElnbm9yZWRfY2FtbF9jaGFyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoQ2FtbF9jaGFyIGZtdClcbiAgfCBJZ25vcmVkX3N0cmluZyBwYWRfb3B0IC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU3RyaW5nIChwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBmbXQpKVxuICB8IElnbm9yZWRfY2FtbF9zdHJpbmcgcGFkX29wdCAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKENhbWxfc3RyaW5nIChwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBmbXQpKVxuICB8IElnbm9yZWRfaW50IChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChJbnQgKGljb252LCBwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBOb19wcmVjaXNpb24sIGZtdCkpXG4gIHwgSWdub3JlZF9pbnQzMiAoaWNvbnYsIHBhZF9vcHQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQlxuICAgICAgKEludDMyIChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfbmF0aXZlaW50IChpY29udiwgcGFkX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoTmF0aXZlaW50IChpY29udiwgcGFkX29mX3BhZF9vcHQgcGFkX29wdCwgTm9fcHJlY2lzaW9uLCBmbXQpKVxuICB8IElnbm9yZWRfaW50NjQgKGljb252LCBwYWRfb3B0KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChJbnQ2NCAoaWNvbnYsIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIE5vX3ByZWNpc2lvbiwgZm10KSlcbiAgfCBJZ25vcmVkX2Zsb2F0IChwYWRfb3B0LCBwcmVjX29wdCkgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCXG4gICAgICAoRmxvYXQgKChGbG9hdF9mbGFnXywgRmxvYXRfZiksXG4gICAgICAgICAgICAgIHBhZF9vZl9wYWRfb3B0IHBhZF9vcHQsIHByZWNfb2ZfcHJlY19vcHQgcHJlY19vcHQsIGZtdCkpXG4gIHwgSWdub3JlZF9ib29sIHBhZF9vcHQgLT5cbiAgICBQYXJhbV9mb3JtYXRfRUJCIChCb29sIChwYWRfb2ZfcGFkX29wdCBwYWRfb3B0LCBmbXQpKVxuICB8IElnbm9yZWRfZm9ybWF0X2FyZyAocGFkX29wdCwgZm10dHkpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoRm9ybWF0X2FyZyAocGFkX29wdCwgZm10dHksIGZtdCkpXG4gIHwgSWdub3JlZF9mb3JtYXRfc3Vic3QgKHBhZF9vcHQsIGZtdHR5KSAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkJcbiAgICAgIChGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIGZtdHR5LCBmbXQpKVxuICB8IElnbm9yZWRfcmVhZGVyIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoUmVhZGVyIGZtdClcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgKHdpZHRoX29wdCwgY2hhcl9zZXQpIC0+XG4gICAgUGFyYW1fZm9ybWF0X0VCQiAoU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgZm10KSlcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgY291bnRlciAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdCkpXG4gIHwgSWdub3JlZF9zY2FuX25leHRfY2hhciAtPlxuICAgIFBhcmFtX2Zvcm1hdF9FQkIgKFNjYW5fbmV4dF9jaGFyIGZtdClcblxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogVHlwZXMgKilcblxudHlwZSAoJ2IsICdjKSBhY2NfZm9ybWF0dGluZ19nZW4gPVxuICB8IEFjY19vcGVuX3RhZyBvZiAoJ2IsICdjKSBhY2NcbiAgfCBBY2Nfb3Blbl9ib3ggb2YgKCdiLCAnYykgYWNjXG5cbigqIFJldmVyc2VkIGxpc3Qgb2YgcHJpbnRpbmcgYXRvbXMuICopXG4oKiBVc2VkIHRvIGFjY3VtdWxhdGUgcHJpbnRmIGFyZ3VtZW50cy4gKilcbmFuZCAoJ2IsICdjKSBhY2MgPVxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCBvZiAoJ2IsICdjKSBhY2MgKiBmb3JtYXR0aW5nX2xpdFxuICAgICAgKCogU3BlY2lhbCBmbXR0aW5nIChib3gpICopXG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIG9mICgnYiwgJ2MpIGFjYyAqICgnYiwgJ2MpIGFjY19mb3JtYXR0aW5nX2dlblxuICAgICAgKCogU3BlY2lhbCBmbXR0aW5nIChib3gpICopXG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIG9mICgnYiwgJ2MpIGFjYyAqIHN0cmluZyAgICAgKCogTGl0ZXJhbCBzdHJpbmcgKilcbiAgfCBBY2NfY2hhcl9saXRlcmFsICAgb2YgKCdiLCAnYykgYWNjICogY2hhciAgICAgICAoKiBMaXRlcmFsIGNoYXIgKilcbiAgfCBBY2NfZGF0YV9zdHJpbmcgICAgb2YgKCdiLCAnYykgYWNjICogc3RyaW5nICAgICAoKiBHZW5lcmF0ZWQgc3RyaW5nICopXG4gIHwgQWNjX2RhdGFfY2hhciAgICAgIG9mICgnYiwgJ2MpIGFjYyAqIGNoYXIgICAgICAgKCogR2VuZXJhdGVkIGNoYXIgKilcbiAgfCBBY2NfZGVsYXkgICAgICAgICAgb2YgKCdiLCAnYykgYWNjICogKCdiIC0+ICdjKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRGVsYXllZCBwcmludGluZyAoJWEsICV0KSAqKVxuICB8IEFjY19mbHVzaCAgICAgICAgICBvZiAoJ2IsICdjKSBhY2MgICAgICAgICAgICAgICgqIEZsdXNoICopXG4gIHwgQWNjX2ludmFsaWRfYXJnICAgIG9mICgnYiwgJ2MpIGFjYyAqIHN0cmluZ1xuICAgICAgKCogUmFpc2UgSW52YWxpZF9hcmd1bWVudCBtc2cgKilcbiAgfCBFbmRfb2ZfYWNjXG5cbigqIExpc3Qgb2YgaGV0ZXJvZ2VuZW91cyB2YWx1ZXMuICopXG4oKiBVc2VkIHRvIGFjY3VtdWxhdGUgc2NhbmYgY2FsbGJhY2sgYXJndW1lbnRzLiAqKVxudHlwZSAoJ2EsICdiKSBoZXRlcl9saXN0ID1cbiAgfCBDb25zIDogJ2MgKiAoJ2EsICdiKSBoZXRlcl9saXN0IC0+ICgnYyAtPiAnYSwgJ2IpIGhldGVyX2xpc3RcbiAgfCBOaWwgOiAoJ2IsICdiKSBoZXRlcl9saXN0XG5cbigqIEV4aXN0ZW50aWFsIEJsYWNrIEJveGVzLiAqKVxuKCogVXNlZCB0byBhYnN0cmFjdCBzb21lIGV4aXN0ZW50aWFsIHR5cGUgcGFyYW1ldGVycy4gKilcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcGFkZGluZyBhbmQgYW4gZm10dHkuICopXG4oKiBTZWUgdGhlIHR5cGVfcGFkZGluZyBmdW5jdGlvbi4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZGRpbmdfZm10dHlfZWJiID0gUGFkZGluZ19mbXR0eV9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+XG4gICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYWRkaW5nX2ZtdHR5X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYW4gZm10dHkuICopXG4oKiBTZWUgdGhlIHR5cGVfcGFkcHJlYyBmdW5jdGlvbi4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIHBhZHByZWNfZm10dHlfZWJiID0gUGFkcHJlY19mbXR0eV9FQkIgOlxuICAgICAoJ3gsICd5KSBwYWRkaW5nICogKCd5LCAneikgcHJlY2lzaW9uICogKCd6LCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5IC0+XG4gICAgICgneCwgJ2IsICdjLCAnZCwgJ2UsICdmKSBwYWRwcmVjX2ZtdHR5X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYSBwYWRkaW5nIGFuZCBhbiBmbXQuICopXG4oKiBTZWUgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgYW5kIHBhcnNlX2Zvcm1hdCBmdW5jdGlvbnMuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZSwgJ2YpIHBhZGRpbmdfZm10X2ViYiA9IFBhZGRpbmdfZm10X0VCQiA6XG4gICAgIChfLCAneCAtPiAnYSkgcGFkZGluZyAqXG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdlLCAnZikgcGFkZGluZ19mbXRfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhIHByZWNpc2lvbiBhbmQgYW4gZm10LiAqKVxuKCogU2VlIG1ha2VfcHJlY2lzaW9uX2ZtdF9lYmIgYW5kIHBhcnNlX2Zvcm1hdCBmdW5jdGlvbnMuICopXG50eXBlICgnYSwgJ2IsICdjLCAnZSwgJ2YpIHByZWNpc2lvbl9mbXRfZWJiID0gUHJlY2lzaW9uX2ZtdF9FQkIgOlxuICAgICAoXywgJ3ggLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCd4LCAnYiwgJ2MsICdlLCAnZikgcHJlY2lzaW9uX2ZtdF9lYmJcblxuKCogR0FEVCB0eXBlIGFzc29jaWF0aW5nIGEgcGFkZGluZywgYSBwcmVjaXNpb24gYW5kIGFuIGZtdC4gKilcbigqIFNlZSBtYWtlX3BhZHByZWNfZm10X2ViYiBhbmQgcGFyc2VfZm9ybWF0IGZ1bmN0aW9ucy4gKilcbnR5cGUgKCdwLCAnYiwgJ2MsICdlLCAnZikgcGFkcHJlY19mbXRfZWJiID0gUGFkcHJlY19mbXRfRUJCIDpcbiAgICAgKCd4LCAneSkgcGFkZGluZyAqICgneSwgJ3AgLT4gJ2EpIHByZWNpc2lvbiAqXG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXQgLT5cbiAgICAgKCdwLCAnYiwgJ2MsICdlLCAnZikgcGFkcHJlY19mbXRfZWJiXG5cbigqIEFic3RyYWN0IHRoZSAnYSBhbmQgJ2QgcGFyYW1ldGVycyBvZiBhbiBmbXQuICopXG4oKiBPdXRwdXQgdHlwZSBvZiB0aGUgZm9ybWF0IHBhcnNpbmcgZnVuY3Rpb24uICopXG50eXBlICgnYiwgJ2MsICdlLCAnZikgZm10X2ViYiA9IEZtdF9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10IC0+XG4gICAgICgnYiwgJ2MsICdlLCAnZikgZm10X2ViYlxuXG4oKiBHQURUIHR5cGUgYXNzb2NpYXRpbmcgYW4gZm10dHkgYW5kIGFuIGZtdC4gKilcbigqIFNlZSB0aGUgdHlwZV9mb3JtYXRfZ2VuIGZ1bmN0aW9uLiAqKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm10X2ZtdHR5X2ViYiA9IEZtdF9mbXR0eV9FQkIgOlxuICAgICAoJ2EsICdiLCAnYywgJ2QsICd5LCAneCkgZm10ICpcbiAgICAgKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdHR5IC0+XG4gICAgICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXRfZm10dHlfZWJiXG5cbigqIEdBRFQgdHlwZSBhc3NvY2lhdGluZyBhbiBmbXR0eSBhbmQgYW4gZm10LiAqKVxuKCogU2VlIHRoZSB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBmdW5jdGlvbi4gKilcbnR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X2ZtdF9lYmIgPSBGbXR0eV9mbXRfRUJCIDpcbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAneSwgJ3gpIGZtdHR5ICpcbiAgICAgKCd4LCAnYiwgJ2MsICd5LCAnZSwgJ2YpIGZtdF9mbXR0eV9lYmIgLT5cbiAgICAgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZtdHR5X2ZtdF9lYmJcblxuKCogQWJzdHJhY3QgYWxsIGZtdHR5IHR5cGUgcGFyYW1ldGVycy4gKilcbigqIFVzZWQgdG8gY29tcGFyZSBmb3JtYXQgdHlwZXMuICopXG50eXBlIGZtdHR5X2ViYiA9IEZtdHR5X0VCQiA6ICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmbXR0eSAtPiBmbXR0eV9lYmJcblxuKCogQWJzdHJhY3QgYWxsIHBhZGRpbmcgdHlwZSBwYXJhbWV0ZXJzLiAqKVxuKCogVXNlZCB0byBjb21wYXJlIHBhZGRpbmdzLiAqKVxudHlwZSBwYWRkaW5nX2ViYiA9IFBhZGRpbmdfRUJCIDogKCdhLCAnYikgcGFkZGluZyAtPiBwYWRkaW5nX2ViYlxuXG4oKiBBYnN0cmFjdCBhbGwgcHJlY2lzaW9uIHR5cGUgcGFyYW1ldGVycy4gKilcbigqIFVzZWQgdG8gY29tcGFyZSBwcmVjaXNpb25zLiAqKVxudHlwZSBwcmVjaXNpb25fZWJiID0gUHJlY2lzaW9uX0VCQiA6ICgnYSwgJ2IpIHByZWNpc2lvbiAtPiBwcmVjaXNpb25fZWJiXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogQ29uc3RhbnRzICopXG5cbigqIERlZmF1bHQgcHJlY2lzaW9uIGZvciBmbG9hdCBwcmludGluZy4gKilcbmxldCBkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiBmY29udiA9XG4gIG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZiB8IEZsb2F0X2UgfCBGbG9hdF9FIHwgRmxvYXRfZyB8IEZsb2F0X0cgfCBGbG9hdF9oIHwgRmxvYXRfSFxuICB8IEZsb2F0X0NGIC0+IC02XG4gICgqIEZvciAlaCAlSCBhbmQgJSNGIGZvcm1hdHMsIGEgbmVnYXRpdmUgcHJlY2lzaW9uIG1lYW5zIFwiYXMgbWFueSBkaWdpdHMgYXNcbiAgICAgbmVjZXNzYXJ5XCIuICBGb3IgdGhlIG90aGVyIEZQIGZvcm1hdHMsIHdlIHRha2UgdGhlIGFic29sdXRlIHZhbHVlXG4gICAgIG9mIHRoZSBwcmVjaXNpb24sIGhlbmNlIDYgZGlnaXRzIGJ5IGRlZmF1bHQuICopXG4gIHwgRmxvYXRfRiAtPiAxMlxuICAoKiBEZWZhdWx0IHByZWNpc2lvbiBmb3IgT0NhbWwgZmxvYXQgcHJpbnRpbmcgKCVGKS4gKilcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBFeHRlcm5hbHMgKilcblxuZXh0ZXJuYWwgZm9ybWF0X2Zsb2F0OiBzdHJpbmcgLT4gZmxvYXQgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2Zvcm1hdF9mbG9hdFwiXG5leHRlcm5hbCBmb3JtYXRfaW50OiBzdHJpbmcgLT4gaW50IC0+IHN0cmluZ1xuICA9IFwiY2FtbF9mb3JtYXRfaW50XCJcbmV4dGVybmFsIGZvcm1hdF9pbnQzMjogc3RyaW5nIC0+IGludDMyIC0+IHN0cmluZ1xuICA9IFwiY2FtbF9pbnQzMl9mb3JtYXRcIlxuZXh0ZXJuYWwgZm9ybWF0X25hdGl2ZWludDogc3RyaW5nIC0+IG5hdGl2ZWludCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfbmF0aXZlaW50X2Zvcm1hdFwiXG5leHRlcm5hbCBmb3JtYXRfaW50NjQ6IHN0cmluZyAtPiBpbnQ2NCAtPiBzdHJpbmdcbiAgPSBcImNhbWxfaW50NjRfZm9ybWF0XCJcbmV4dGVybmFsIGhleHN0cmluZ19vZl9mbG9hdDogZmxvYXQgLT4gaW50IC0+IGNoYXIgLT4gc3RyaW5nXG4gID0gXCJjYW1sX2hleHN0cmluZ19vZl9mbG9hdFwiXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAoKiBUb29scyB0byBwcmV0dHktcHJpbnQgZm9ybWF0cyAqKVxuXG4oKiBUeXBlIG9mIGV4dGVuc2libGUgY2hhcmFjdGVyIGJ1ZmZlcnMuICopXG50eXBlIGJ1ZmZlciA9IHtcbiAgbXV0YWJsZSBpbmQgOiBpbnQ7XG4gIG11dGFibGUgYnl0ZXMgOiBieXRlcztcbn1cblxuKCogQ3JlYXRlIGEgZnJlc2ggYnVmZmVyLiAqKVxubGV0IGJ1ZmZlcl9jcmVhdGUgaW5pdF9zaXplID0geyBpbmQgPSAwOyBieXRlcyA9IEJ5dGVzLmNyZWF0ZSBpbml0X3NpemUgfVxuXG4oKiBDaGVjayBzaXplIG9mIHRoZSBidWZmZXIgYW5kIGdyb3cgaXQgaWYgbmVlZGVkLiAqKVxubGV0IGJ1ZmZlcl9jaGVja19zaXplIGJ1ZiBvdmVyaGVhZCA9XG4gIGxldCBsZW4gPSBCeXRlcy5sZW5ndGggYnVmLmJ5dGVzIGluXG4gIGxldCBtaW5fbGVuID0gYnVmLmluZCArIG92ZXJoZWFkIGluXG4gIGlmIG1pbl9sZW4gPiBsZW4gdGhlbiAoXG4gICAgbGV0IG5ld19sZW4gPSBJbnQubWF4IChsZW4gKiAyKSBtaW5fbGVuIGluXG4gICAgbGV0IG5ld19zdHIgPSBCeXRlcy5jcmVhdGUgbmV3X2xlbiBpblxuICAgIEJ5dGVzLmJsaXQgYnVmLmJ5dGVzIDAgbmV3X3N0ciAwIGxlbjtcbiAgICBidWYuYnl0ZXMgPC0gbmV3X3N0cjtcbiAgKVxuXG4oKiBBZGQgdGhlIGNoYXJhY3RlciBgYycgdG8gdGhlIGJ1ZmZlciBgYnVmJy4gKilcbmxldCBidWZmZXJfYWRkX2NoYXIgYnVmIGMgPVxuICBidWZmZXJfY2hlY2tfc2l6ZSBidWYgMTtcbiAgQnl0ZXMuc2V0IGJ1Zi5ieXRlcyBidWYuaW5kIGM7XG4gIGJ1Zi5pbmQgPC0gYnVmLmluZCArIDFcblxuKCogQWRkIHRoZSBzdHJpbmcgYHMnIHRvIHRoZSBidWZmZXIgYGJ1ZicuICopXG5sZXQgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIHMgPVxuICBsZXQgc3RyX2xlbiA9IFN0cmluZy5sZW5ndGggcyBpblxuICBidWZmZXJfY2hlY2tfc2l6ZSBidWYgc3RyX2xlbjtcbiAgU3RyaW5nLmJsaXQgcyAwIGJ1Zi5ieXRlcyBidWYuaW5kIHN0cl9sZW47XG4gIGJ1Zi5pbmQgPC0gYnVmLmluZCArIHN0cl9sZW5cblxuKCogR2V0IHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIuICopXG5sZXQgYnVmZmVyX2NvbnRlbnRzIGJ1ZiA9XG4gIEJ5dGVzLnN1Yl9zdHJpbmcgYnVmLmJ5dGVzIDAgYnVmLmluZFxuXG4oKioqKVxuXG4oKiBDb252ZXJ0IGFuIGludGVnZXIgY29udmVyc2lvbiB0byBjaGFyLiAqKVxubGV0IGNoYXJfb2ZfaWNvbnYgaWNvbnYgPSBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X2QgfCBJbnRfcGQgfCBJbnRfc2QgfCBJbnRfQ2QgLT4gJ2QnIHwgSW50X2kgfCBJbnRfcGkgfCBJbnRfc2lcbiAgfCBJbnRfQ2kgLT4gJ2knIHwgSW50X3ggfCBJbnRfQ3ggLT4gJ3gnIHwgSW50X1ggfCBJbnRfQ1ggLT4gJ1gnIHwgSW50X29cbiAgfCBJbnRfQ28gLT4gJ28nIHwgSW50X3UgfCBJbnRfQ3UgLT4gJ3UnXG5cbigqIENvbnZlcnQgYSBmbG9hdCBjb252ZXJzaW9uIHRvIGNoYXIuICopXG4oKiBgY0YnIHdpbGwgYmUgJ0YnIGZvciBkaXNwbGF5aW5nIGZvcm1hdCBhbmQgJ2cnIHRvIGNhbGwgbGliYyBwcmludGYgKilcbmxldCBjaGFyX29mX2Zjb252ID8oY0Y9J0YnKSBmY29udiA9IG1hdGNoIHNuZCBmY29udiB3aXRoXG4gIHwgRmxvYXRfZiAtPiAnZicgfCBGbG9hdF9lIC0+ICdlJ1xuICB8IEZsb2F0X0UgLT4gJ0UnIHwgRmxvYXRfZyAtPiAnZydcbiAgfCBGbG9hdF9HIC0+ICdHJyB8IEZsb2F0X0YgLT4gY0ZcbiAgfCBGbG9hdF9oIC0+ICdoJyB8IEZsb2F0X0ggLT4gJ0gnXG4gIHwgRmxvYXRfQ0YgLT4gJ0YnXG5cblxuKCogQ29udmVydCBhIHNjYW5uaW5nIGNvdW50ZXIgdG8gY2hhci4gKilcbmxldCBjaGFyX29mX2NvdW50ZXIgY291bnRlciA9IG1hdGNoIGNvdW50ZXIgd2l0aFxuICB8IExpbmVfY291bnRlciAgLT4gJ2wnXG4gIHwgQ2hhcl9jb3VudGVyICAtPiAnbidcbiAgfCBUb2tlbl9jb3VudGVyIC0+ICdOJ1xuXG4oKioqKVxuXG4oKiBQcmludCBhIGNoYXJfc2V0IGluIGEgYnVmZmVyIHdpdGggdGhlIE9DYW1sIGZvcm1hdCBsZXhpY2FsIGNvbnZlbnRpb24uICopXG5sZXQgYnByaW50X2NoYXJfc2V0IGJ1ZiBjaGFyX3NldCA9XG4gIGxldCByZWMgcHJpbnRfc3RhcnQgc2V0ID1cbiAgICBsZXQgaXNfYWxvbmUgYyA9XG4gICAgICBsZXQgYmVmb3JlLCBhZnRlciA9IENoYXIuKGNociAoY29kZSBjIC0gMSksIGNociAoY29kZSBjICsgMSkpIGluXG4gICAgICBpc19pbl9jaGFyX3NldCBzZXQgY1xuICAgICAgJiYgbm90IChpc19pbl9jaGFyX3NldCBzZXQgYmVmb3JlICYmIGlzX2luX2NoYXJfc2V0IHNldCBhZnRlcikgaW5cbiAgICBpZiBpc19hbG9uZSAnXScgdGhlbiBidWZmZXJfYWRkX2NoYXIgYnVmICddJztcbiAgICBwcmludF9vdXQgc2V0IDE7XG4gICAgaWYgaXNfYWxvbmUgJy0nIHRoZW4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnLSc7XG4gIGFuZCBwcmludF9vdXQgc2V0IGkgPVxuICAgIGlmIGkgPCAyNTYgdGhlblxuICAgICAgaWYgaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCBpKSB0aGVuIHByaW50X2ZpcnN0IHNldCBpXG4gICAgICBlbHNlIHByaW50X291dCBzZXQgKGkgKyAxKVxuICBhbmQgcHJpbnRfZmlyc3Qgc2V0IGkgPVxuICAgIG1hdGNoIGNoYXJfb2ZfaW50IGkgd2l0aFxuICAgIHwgJ1xcMjU1JyAtPiBwcmludF9jaGFyIGJ1ZiAyNTU7XG4gICAgfCAnXScgfCAnLScgLT4gcHJpbnRfb3V0IHNldCAoaSArIDEpO1xuICAgIHwgXyAtPiBwcmludF9zZWNvbmQgc2V0IChpICsgMSk7XG4gIGFuZCBwcmludF9zZWNvbmQgc2V0IGkgPVxuICAgIGlmIGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgaSkgdGhlblxuICAgICAgbWF0Y2ggY2hhcl9vZl9pbnQgaSB3aXRoXG4gICAgICB8ICdcXDI1NScgLT5cbiAgICAgICAgcHJpbnRfY2hhciBidWYgMjU0O1xuICAgICAgICBwcmludF9jaGFyIGJ1ZiAyNTU7XG4gICAgICB8ICddJyB8ICctJyB3aGVuIG5vdCAoaXNfaW5fY2hhcl9zZXQgc2V0IChjaGFyX29mX2ludCAoaSArIDEpKSkgLT5cbiAgICAgICAgcHJpbnRfY2hhciBidWYgKGkgLSAxKTtcbiAgICAgICAgcHJpbnRfb3V0IHNldCAoaSArIDEpO1xuICAgICAgfCBfIHdoZW4gbm90IChpc19pbl9jaGFyX3NldCBzZXQgKGNoYXJfb2ZfaW50IChpICsgMSkpKSAtPlxuICAgICAgICBwcmludF9jaGFyIGJ1ZiAoaSAtIDEpO1xuICAgICAgICBwcmludF9jaGFyIGJ1ZiBpO1xuICAgICAgICBwcmludF9vdXQgc2V0IChpICsgMik7XG4gICAgICB8IF8gLT5cbiAgICAgICAgcHJpbnRfaW4gc2V0IChpIC0gMSkgKGkgKyAyKTtcbiAgICBlbHNlIChcbiAgICAgIHByaW50X2NoYXIgYnVmIChpIC0gMSk7XG4gICAgICBwcmludF9vdXQgc2V0IChpICsgMSk7XG4gICAgKVxuICBhbmQgcHJpbnRfaW4gc2V0IGkgaiA9XG4gICAgaWYgaiA9IDI1NiB8fCBub3QgKGlzX2luX2NoYXJfc2V0IHNldCAoY2hhcl9vZl9pbnQgaikpIHRoZW4gKFxuICAgICAgcHJpbnRfY2hhciBidWYgaTtcbiAgICAgIHByaW50X2NoYXIgYnVmIChpbnRfb2ZfY2hhciAnLScpO1xuICAgICAgcHJpbnRfY2hhciBidWYgKGogLSAxKTtcbiAgICAgIGlmIGogPCAyNTYgdGhlbiBwcmludF9vdXQgc2V0IChqICsgMSk7XG4gICAgKSBlbHNlXG4gICAgICBwcmludF9pbiBzZXQgaSAoaiArIDEpO1xuICBhbmQgcHJpbnRfY2hhciBidWYgaSA9IG1hdGNoIGNoYXJfb2ZfaW50IGkgd2l0aFxuICAgIHwgJyUnIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgICB8ICdAJyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQCc7XG4gICAgfCBjICAgLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiBjO1xuICBpblxuICBidWZmZXJfYWRkX2NoYXIgYnVmICdbJztcbiAgcHJpbnRfc3RhcnQgKFxuICAgIGlmIGlzX2luX2NoYXJfc2V0IGNoYXJfc2V0ICdcXDAwMCdcbiAgICB0aGVuICggYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnXic7IHJldl9jaGFyX3NldCBjaGFyX3NldCApXG4gICAgZWxzZSBjaGFyX3NldFxuICApO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmICddJ1xuXG4oKioqKVxuXG4oKiBQcmludCBhIHBhZHR5IGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcGFkdHkgYnVmIHBhZHR5ID0gbWF0Y2ggcGFkdHkgd2l0aFxuICB8IExlZnQgIC0+IGJ1ZmZlcl9hZGRfY2hhciBidWYgJy0nXG4gIHwgUmlnaHQgLT4gKClcbiAgfCBaZXJvcyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcwJ1xuXG4oKiBQcmludCB0aGUgJ18nIG9mIGFuIGlnbm9yZWQgZmxhZyBpZiBuZWVkZWQuICopXG5sZXQgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWcgPVxuICBpZiBpZ25fZmxhZyB0aGVuIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ18nXG5cbigqKiopXG5cbmxldCBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdCA9IG1hdGNoIHBhZF9vcHQgd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIHdpZHRoIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyB3aWR0aClcblxuKCoqKilcblxuKCogUHJpbnQgcGFkZGluZyBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBmb3JtYXQtbGlrZSBzeW50YXguICopXG5sZXQgYnByaW50X3BhZGRpbmcgOiB0eXBlIGEgYiAuIGJ1ZmZlciAtPiAoYSwgYikgcGFkZGluZyAtPiB1bml0ID1cbmZ1biBidWYgcGFkIC0+IG1hdGNoIHBhZCB3aXRoXG4gIHwgTm9fcGFkZGluZyAtPiAoKVxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgbikgLT5cbiAgICBicHJpbnRfcGFkdHkgYnVmIHBhZHR5O1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBuKTtcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSAtPlxuICAgIGJwcmludF9wYWR0eSBidWYgcGFkdHk7XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnKidcblxuKCogUHJpbnQgcHJlY2lzaW9uIGluIGEgYnVmZmVyIHdpdGggdGhlIGZvcm1hdC1saWtlIHN5bnRheC4gKilcbmxldCBicHJpbnRfcHJlY2lzaW9uIDogdHlwZSBhIGIgLiBidWZmZXIgLT4gKGEsIGIpIHByZWNpc2lvbiAtPiB1bml0ID1cbiAgZnVuIGJ1ZiBwcmVjIC0+IG1hdGNoIHByZWMgd2l0aFxuICB8IE5vX3ByZWNpc2lvbiAtPiAoKVxuICB8IExpdF9wcmVjaXNpb24gbiAtPlxuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJy4nO1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiAoSW50LnRvX3N0cmluZyBuKTtcbiAgfCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiLipcIlxuXG4oKioqKVxuXG4oKiBQcmludCB0aGUgb3B0aW9uYWwgJysnLCAnICcgb3IgJyMnIGFzc29jaWF0ZWQgdG8gYW4gaW50IGNvbnZlcnNpb24uICopXG5sZXQgYnByaW50X2ljb252X2ZsYWcgYnVmIGljb252ID0gbWF0Y2ggaWNvbnYgd2l0aFxuICB8IEludF9wZCB8IEludF9waSAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcrJ1xuICB8IEludF9zZCB8IEludF9zaSAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcgJ1xuICB8IEludF9DeCB8IEludF9DWCB8IEludF9DbyB8IEludF9DZCB8IEludF9DaSB8IEludF9DdSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnIydcbiAgfCBJbnRfZCB8IEludF9pIHwgSW50X3ggfCBJbnRfWCB8IEludF9vIHwgSW50X3UgLT4gKClcblxuKCogUHJpbnQgYW4gY29tcGxldGUgaW50IGZvcm1hdCBpbiBhIGJ1ZmZlciAoZXg6IFwiJTMuKmRcIikuICopXG5sZXQgYnByaW50X2ludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjID1cbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7XG4gIGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICBicHJpbnRfaWNvbnZfZmxhZyBidWYgaWNvbnY7XG4gIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7XG4gIGJwcmludF9wcmVjaXNpb24gYnVmIHByZWM7XG4gIGJ1ZmZlcl9hZGRfY2hhciBidWYgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpXG5cbigqIFByaW50IGEgY29tcGxldGUgaW50MzIsIG5hdGl2ZWludCBvciBpbnQ2NCBmb3JtYXQgaW4gYSBidWZmZXIuICopXG5sZXQgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjIGMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9pY29udl9mbGFnIGJ1ZiBpY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiBjO1xuICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2ljb252IGljb252KVxuXG4oKioqKVxuXG4oKiBQcmludCB0aGUgb3B0aW9uYWwgJysnLCAnICcgYW5kL29yICcjJyBhc3NvY2lhdGVkIHRvIGEgZmxvYXQgY29udmVyc2lvbi4gKilcbmxldCBicHJpbnRfZmNvbnZfZmxhZyBidWYgZmNvbnYgPVxuICBiZWdpbiBtYXRjaCBmc3QgZmNvbnYgd2l0aFxuICB8IEZsb2F0X2ZsYWdfcCAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcrJ1xuICB8IEZsb2F0X2ZsYWdfcyAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcgJ1xuICB8IEZsb2F0X2ZsYWdfIC0+ICgpIGVuZDtcbiAgbWF0Y2ggc25kIGZjb252IHdpdGhcbiAgfCBGbG9hdF9DRiAtPiBidWZmZXJfYWRkX2NoYXIgYnVmICcjJ1xuICB8IEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HXG4gIHwgRmxvYXRfRiB8IEZsb2F0X2ggfCBGbG9hdF9IIC0+ICgpXG5cbigqIFByaW50IGEgY29tcGxldGUgZmxvYXQgZm9ybWF0IGluIGEgYnVmZmVyIChleDogXCIlKyouM2ZcIikuICopXG5sZXQgYnByaW50X2Zsb2F0X2ZtdCBidWYgaWduX2ZsYWcgZmNvbnYgcGFkIHByZWMgPVxuICBidWZmZXJfYWRkX2NoYXIgYnVmICclJztcbiAgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gIGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udjtcbiAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDtcbiAgYnByaW50X3ByZWNpc2lvbiBidWYgcHJlYztcbiAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAoY2hhcl9vZl9mY29udiBmY29udilcblxuKCogQ29tcHV0ZSB0aGUgbGl0ZXJhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBGb3JtYXR0aW5nX2xpdC4gKilcbigqIFVzZWQgYnkgUHJpbnRmIGFuZCBTY2FuZiB3aGVyZSBmb3JtYXR0aW5nIGlzIG5vdCBpbnRlcnByZXRlZC4gKilcbmxldCBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm9ybWF0dGluZ19saXQgPSBtYXRjaCBmb3JtYXR0aW5nX2xpdCB3aXRoXG4gIHwgQ2xvc2VfYm94ICAgICAgICAgICAgLT4gXCJAXVwiXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgLT4gXCJAfVwiXG4gIHwgQnJlYWsgKHN0ciwgXywgXykgICAgLT4gc3RyXG4gIHwgRkZsdXNoICAgICAgICAgICAgICAgLT4gXCJAP1wiXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgLT4gXCJAXFxuXCJcbiAgfCBGbHVzaF9uZXdsaW5lICAgICAgICAtPiBcIkAuXCJcbiAgfCBNYWdpY19zaXplIChzdHIsIF8pICAtPiBzdHJcbiAgfCBFc2NhcGVkX2F0ICAgICAgICAgICAtPiBcIkBAXCJcbiAgfCBFc2NhcGVkX3BlcmNlbnQgICAgICAtPiBcIkAlXCJcbiAgfCBTY2FuX2luZGljIGMgLT4gXCJAXCIgXiAoU3RyaW5nLm1ha2UgMSBjKVxuXG4oKioqKVxuXG4oKiBQcmludCBhIGxpdGVyYWwgY2hhciBpbiBhIGJ1ZmZlciwgZXNjYXBlICclJyBieSBcIiUlXCIuICopXG5sZXQgYnByaW50X2NoYXJfbGl0ZXJhbCBidWYgY2hyID0gbWF0Y2ggY2hyIHdpdGhcbiAgfCAnJScgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJSVcIlxuICB8IF8gLT4gYnVmZmVyX2FkZF9jaGFyIGJ1ZiBjaHJcblxuKCogUHJpbnQgYSBsaXRlcmFsIHN0cmluZyBpbiBhIGJ1ZmZlciwgZXNjYXBlIGFsbCAnJScgYnkgXCIlJVwiLiAqKVxubGV0IGJwcmludF9zdHJpbmdfbGl0ZXJhbCBidWYgc3RyID1cbiAgZm9yIGkgPSAwIHRvIFN0cmluZy5sZW5ndGggc3RyIC0gMSBkb1xuICAgIGJwcmludF9jaGFyX2xpdGVyYWwgYnVmIHN0ci5baV1cbiAgZG9uZVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgcHJldHR5LXByaW50aW5nICopXG5cbigqIFByaW50IGEgY29tcGxldGUgZm9ybWF0IHR5cGUgKGFuIGZtdHR5KSBpbiBhIGJ1ZmZlci4gKilcbmxldCByZWMgYnByaW50X2ZtdHR5IDogdHlwZSBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCAuXG4gICAgYnVmZmVyIC0+IChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBrLCBsKSBmbXR0eV9yZWwgLT4gdW5pdCA9XG5mdW4gYnVmIGZtdHR5IC0+IG1hdGNoIGZtdHR5IHdpdGhcbiAgfCBDaGFyX3R5IHJlc3QgICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlY1wiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IFN0cmluZ190eSByZXN0ICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVzXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgSW50X3R5IHJlc3QgICAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJWlcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBJbnQzMl90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlbGlcIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IE5hdGl2ZWludF90eSByZXN0IC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVuaVwiOyBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgSW50NjRfdHkgcmVzdCAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJUxpXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBGbG9hdF90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlZlwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEJvb2xfdHkgcmVzdCAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiVCXCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgQWxwaGFfdHkgcmVzdCAgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJWFcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcbiAgfCBUaGV0YV90eSByZXN0ICAgICAtPiBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIldFwiOyAgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEFueV90eSByZXN0ICAgICAgIC0+IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiU/XCI7ICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG4gIHwgUmVhZGVyX3R5IHJlc3QgICAgLT4gYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXJcIjsgIGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IElnbm9yZWRfcmVhZGVyX3R5IHJlc3QgLT5cbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlX3JcIjtcbiAgICBicHJpbnRfZm10dHkgYnVmIHJlc3Q7XG5cbiAgfCBGb3JtYXRfYXJnX3R5IChzdWJfZm10dHksIHJlc3QpIC0+XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJXtcIjsgYnByaW50X2ZtdHR5IGJ1ZiBzdWJfZm10dHk7XG4gICAgYnVmZmVyX2FkZF9zdHJpbmcgYnVmIFwiJX1cIjsgYnByaW50X2ZtdHR5IGJ1ZiByZXN0O1xuICB8IEZvcm1hdF9zdWJzdF90eSAoc3ViX2ZtdHR5LCBfLCByZXN0KSAtPlxuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUoXCI7IGJwcmludF9mbXR0eSBidWYgc3ViX2ZtdHR5O1xuICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIiUpXCI7IGJwcmludF9mbXR0eSBidWYgcmVzdDtcblxuICB8IEVuZF9vZl9mbXR0eSAtPiAoKVxuXG4oKioqKVxuXG5sZXQgcmVjIGludF9vZl9jdXN0b21fYXJpdHkgOiB0eXBlIGEgYiBjIC5cbiAgKGEsIGIsIGMpIGN1c3RvbV9hcml0eSAtPiBpbnQgPVxuICBmdW5jdGlvblxuICB8IEN1c3RvbV96ZXJvIC0+IDBcbiAgfCBDdXN0b21fc3VjYyB4IC0+IDEgKyBpbnRfb2ZfY3VzdG9tX2FyaXR5IHhcblxuKCogUHJpbnQgYSBjb21wbGV0ZSBmb3JtYXQgaW4gYSBidWZmZXIuICopXG5sZXQgYnByaW50X2ZtdCBidWYgZm10ID1cbiAgbGV0IHJlYyBmbXRpdGVyIDogdHlwZSBhIGIgYyBkIGUgZiAuXG4gICAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IGJvb2wgLT4gdW5pdCA9XG4gIGZ1biBmbXQgaWduX2ZsYWcgLT4gbWF0Y2ggZm10IHdpdGhcbiAgICB8IFN0cmluZyAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAncyc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBDYW1sX3N0cmluZyAocGFkLCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZGRpbmcgYnVmIHBhZDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnUyc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG5cbiAgICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgIGJwcmludF9pbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgYnByaW50X2FsdGludF9mbXQgYnVmIGlnbl9mbGFnIGljb252IHBhZCBwcmVjICdsJztcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgIGJwcmludF9hbHRpbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYyAnbic7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBJbnQ2NCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgIGJwcmludF9hbHRpbnRfZm10IGJ1ZiBpZ25fZmxhZyBpY29udiBwYWQgcHJlYyAnTCc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgIGJwcmludF9mbG9hdF9mbXQgYnVmIGlnbl9mbGFnIGZjb252IHBhZCBwcmVjO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuXG4gICAgfCBDaGFyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ2MnOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBDYW1sX2NoYXIgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnQyc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IEJvb2wgKHBhZCwgcmVzdCkgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJwcmludF9wYWRkaW5nIGJ1ZiBwYWQ7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJ0InO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgQWxwaGEgcmVzdCAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnYSc7IGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFRoZXRhIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ3QnOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBDdXN0b20gKGFyaXR5LCBfLCByZXN0KSAtPlxuICAgICAgZm9yIF9pID0gMSB0byBpbnRfb2ZfY3VzdG9tX2FyaXR5IGFyaXR5IGRvXG4gICAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnPyc7XG4gICAgICBkb25lO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuICAgIHwgUmVhZGVyIHJlc3QgLT5cbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnOyBicHJpbnRfaWdub3JlZF9mbGFnIGJ1ZiBpZ25fZmxhZztcbiAgICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJ3InOyBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBGbHVzaCByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCIlIVwiO1xuICAgICAgZm10aXRlciByZXN0IGlnbl9mbGFnO1xuXG4gICAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgICAgYnByaW50X3N0cmluZ19saXRlcmFsIGJ1ZiBzdHI7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG4gICAgfCBDaGFyX2xpdGVyYWwgKGNociwgcmVzdCkgLT5cbiAgICAgIGJwcmludF9jaGFyX2xpdGVyYWwgYnVmIGNocjtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcblxuICAgIHwgRm9ybWF0X2FyZyAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfcGFkX29wdCBidWYgcGFkX29wdDsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAneyc7XG4gICAgICBicHJpbnRfZm10dHkgYnVmIGZtdHR5OyBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnfSc7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBGb3JtYXRfc3Vic3QgKHBhZF9vcHQsIGZtdHR5LCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZF9vcHQgYnVmIHBhZF9vcHQ7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJygnO1xuICAgICAgYnByaW50X2ZtdHR5IGJ1ZiBmbXR0eTsgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJ1ZmZlcl9hZGRfY2hhciBidWYgJyknO1xuICAgICAgZm10aXRlciByZXN0IGZhbHNlO1xuXG4gICAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCByZXN0KSAtPlxuICAgICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiAnJSc7IGJwcmludF9pZ25vcmVkX2ZsYWcgYnVmIGlnbl9mbGFnO1xuICAgICAgYnByaW50X3BhZF9vcHQgYnVmIHdpZHRoX29wdDsgYnByaW50X2NoYXJfc2V0IGJ1ZiBjaGFyX3NldDtcbiAgICAgIGZtdGl0ZXIgcmVzdCBmYWxzZTtcbiAgICB8IFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIHJlc3QpIC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmIChjaGFyX29mX2NvdW50ZXIgY291bnRlcik7XG4gICAgICBmbXRpdGVyIHJlc3QgZmFsc2U7XG4gICAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgICBidWZmZXJfYWRkX2NoYXIgYnVmICclJzsgYnByaW50X2lnbm9yZWRfZmxhZyBidWYgaWduX2ZsYWc7XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIFwiMGNcIjsgZm10aXRlciByZXN0IGZhbHNlO1xuXG4gICAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgICBsZXQgUGFyYW1fZm9ybWF0X0VCQiBmbXQnID0gcGFyYW1fZm9ybWF0X29mX2lnbm9yZWRfZm9ybWF0IGlnbiByZXN0IGluXG4gICAgICBmbXRpdGVyIGZtdCcgdHJ1ZTtcblxuICAgIHwgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIHJlc3QpIC0+XG4gICAgICBicHJpbnRfc3RyaW5nX2xpdGVyYWwgYnVmIChzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCk7XG4gICAgICBmbXRpdGVyIHJlc3QgaWduX2ZsYWc7XG4gICAgfCBGb3JtYXR0aW5nX2dlbiAoZm10aW5nX2dlbiwgcmVzdCkgLT5cbiAgICAgIGJlZ2luIG1hdGNoIGZtdGluZ19nZW4gd2l0aFxuICAgICAgfCBPcGVuX3RhZyAoRm9ybWF0IChfLCBzdHIpKSAtPlxuICAgICAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgXCJAe1wiOyBidWZmZXJfYWRkX3N0cmluZyBidWYgc3RyXG4gICAgICB8IE9wZW5fYm94IChGb3JtYXQgKF8sIHN0cikpIC0+XG4gICAgICAgIGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBcIkBbXCI7IGJ1ZmZlcl9hZGRfc3RyaW5nIGJ1ZiBzdHJcbiAgICAgIGVuZDtcbiAgICAgIGZtdGl0ZXIgcmVzdCBpZ25fZmxhZztcblxuICAgIHwgRW5kX29mX2Zvcm1hdCAtPiAoKVxuXG4gIGluIGZtdGl0ZXIgZm10IGZhbHNlXG5cbigqKiopXG5cbigqIENvbnZlcnQgYSBmb3JtYXQgdG8gc3RyaW5nLiAqKVxubGV0IHN0cmluZ19vZl9mbXQgZm10ID1cbiAgbGV0IGJ1ZiA9IGJ1ZmZlcl9jcmVhdGUgMTYgaW5cbiAgYnByaW50X2ZtdCBidWYgZm10O1xuICBidWZmZXJfY29udGVudHMgYnVmXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIFR5cGUgZXh0cmFjdGlvbiAqKVxuXG50eXBlIChfLCBfKSBlcSA9IFJlZmwgOiAoJ2EsICdhKSBlcVxuXG4oKiBJbnZhcmlhbnQ6IHRoaXMgZnVuY3Rpb24gaXMgdGhlIGlkZW50aXR5IG9uIHZhbHVlcy5cblxuICAgSW4gcGFydGljdWxhciwgaWYgKHR5MSwgdHkyKSBoYXZlIGVxdWFsIHZhbHVlcywgdGhlblxuICAgKHRyYW5zIChzeW1tIHR5MSkgdHkyKSByZXNwZWN0cyB0aGUgJ3RyYW5zJyBwcmVjb25kaXRpb24uICopXG5sZXQgcmVjIHN5bW0gOiB0eXBlIGExIGIxIGMxIGQxIGUxIGYxIGEyIGIyIGMyIGQyIGUyIGYyIC5cbiAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgIGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5X3JlbFxuLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIsXG4gICAgYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10dHlfcmVsXG49IGZ1bmN0aW9uXG4gIHwgQ2hhcl90eSByZXN0IC0+IENoYXJfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnRfdHkgcmVzdCAtPiBJbnRfdHkgKHN5bW0gcmVzdClcbiAgfCBJbnQzMl90eSByZXN0IC0+IEludDMyX3R5IChzeW1tIHJlc3QpXG4gIHwgSW50NjRfdHkgcmVzdCAtPiBJbnQ2NF90eSAoc3ltbSByZXN0KVxuICB8IE5hdGl2ZWludF90eSByZXN0IC0+IE5hdGl2ZWludF90eSAoc3ltbSByZXN0KVxuICB8IEZsb2F0X3R5IHJlc3QgLT4gRmxvYXRfdHkgKHN5bW0gcmVzdClcbiAgfCBCb29sX3R5IHJlc3QgLT4gQm9vbF90eSAoc3ltbSByZXN0KVxuICB8IFN0cmluZ190eSByZXN0IC0+IFN0cmluZ190eSAoc3ltbSByZXN0KVxuICB8IFRoZXRhX3R5IHJlc3QgLT4gVGhldGFfdHkgKHN5bW0gcmVzdClcbiAgfCBBbHBoYV90eSByZXN0IC0+IEFscGhhX3R5IChzeW1tIHJlc3QpXG4gIHwgQW55X3R5IHJlc3QgLT4gQW55X3R5IChzeW1tIHJlc3QpXG4gIHwgUmVhZGVyX3R5IHJlc3QgLT4gUmVhZGVyX3R5IChzeW1tIHJlc3QpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdCAtPiBJZ25vcmVkX3JlYWRlcl90eSAoc3ltbSByZXN0KVxuICB8IEZvcm1hdF9hcmdfdHkgKHR5LCByZXN0KSAtPlxuICAgIEZvcm1hdF9hcmdfdHkgKHR5LCBzeW1tIHJlc3QpXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgcmVzdCkgLT5cbiAgICBGb3JtYXRfc3Vic3RfdHkgKHR5MiwgdHkxLCBzeW1tIHJlc3QpXG4gIHwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuXG5sZXQgcmVjIGZtdHR5X3JlbF9kZXQgOiB0eXBlIGExIGIgYyBkMSBlMSBmMSBhMiBkMiBlMiBmMiAuXG4gIChhMSwgYiwgYywgZDEsIGUxLCBmMSxcbiAgIGEyLCBiLCBjLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWwgLT5cbiAgICAoKGYxLCBmMikgZXEgLT4gKGExLCBhMikgZXEpXG4gICogKChhMSwgYTIpIGVxIC0+IChmMSwgZjIpIGVxKVxuICAqICgoZTEsIGUyKSBlcSAtPiAoZDEsIGQyKSBlcSlcbiAgKiAoKGQxLCBkMikgZXEgLT4gKGUxLCBlMikgZXEpXG49IGZ1bmN0aW9uXG4gIHwgRW5kX29mX2ZtdHR5IC0+XG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IFJlZmwpXG4gIHwgQ2hhcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IFN0cmluZ190eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEludF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEludDMyX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgSW50NjRfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBGbG9hdF90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIGVkLCBkZVxuICB8IEJvb2xfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcblxuICB8IFRoZXRhX3R5IHJlc3QgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgQWxwaGFfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBBbnlfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICBlZCwgZGVcbiAgfCBSZWFkZXJfdHkgcmVzdCAtPlxuICAgIGxldCBmYSwgYWYsIGVkLCBkZSA9IGZtdHR5X3JlbF9kZXQgcmVzdCBpblxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGZhIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBlZCBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGRlIFJlZmwgaW4gUmVmbClcbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0IC0+XG4gICAgbGV0IGZhLCBhZiwgZWQsIGRlID0gZm10dHlfcmVsX2RldCByZXN0IGluXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZmEgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBhZiBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGVkIFJlZmwgaW4gUmVmbCksXG4gICAgKGZ1biBSZWZsIC0+IGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuICB8IEZvcm1hdF9hcmdfdHkgKF90eSwgcmVzdCkgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIFJlZmwpLFxuICAgIChmdW4gUmVmbCAtPiBsZXQgUmVmbCA9IGFmIFJlZmwgaW4gUmVmbCksXG4gICAgZWQsIGRlXG4gIHwgRm9ybWF0X3N1YnN0X3R5ICh0eTEsIHR5MiwgcmVzdCkgLT5cbiAgICBsZXQgZmEsIGFmLCBlZCwgZGUgPSBmbXR0eV9yZWxfZGV0IHJlc3QgaW5cbiAgICBsZXQgdHkgPSB0cmFucyAoc3ltbSB0eTEpIHR5MiBpblxuICAgIGxldCBhZywgZ2EsIGRqLCBqZCA9IGZtdHR5X3JlbF9kZXQgdHkgaW5cbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBmYSBSZWZsIGluIGxldCBSZWZsID0gYWcgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBnYSBSZWZsIGluIGxldCBSZWZsID0gYWYgUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBlZCBSZWZsIGluIGxldCBSZWZsID0gZGogUmVmbCBpbiBSZWZsKSxcbiAgICAoZnVuIFJlZmwgLT4gbGV0IFJlZmwgPSBqZCBSZWZsIGluIGxldCBSZWZsID0gZGUgUmVmbCBpbiBSZWZsKVxuXG4oKiBQcmVjb25kaXRpb246IHdlIGFzc3VtZSB0aGF0IHRoZSB0d28gZm10dHlfcmVsIGFyZ3VtZW50cyBoYXZlIGVxdWFsXG4gICB2YWx1ZXMgKGF0IHBvc3NpYmx5IGRpc3RpbmN0IHR5cGVzKTsgdGhpcyBpbnZhcmlhbnQgY29tZXMgZnJvbSB0aGUgd2F5XG4gICBmbXR0eV9yZWwgd2l0bmVzc2VzIGFyZSBwcm9kdWNlZCBieSB0aGUgdHlwZS1jaGVja2VyXG5cbiAgIFRoZSBjb2RlIGJlbG93IHVzZXMgKGFzc2VydCBmYWxzZSkgd2hlbiB0aGlzIGFzc3VtcHRpb24gaXMgYnJva2VuLiBUaGVcbiAgIGNvZGUgcGF0dGVybiBpcyB0aGUgZm9sbG93aW5nOlxuXG4gICAgIHwgRm9vIHgsIEZvbyB5IC0+XG4gICAgICAgKCogY2FzZSB3aGVyZSBpbmRlZWQgYm90aCB2YWx1ZXNcbiAgICAgICAgICBzdGFydCB3aXRoIGNvbnN0cnVjdG9yIEZvbyAqKVxuICAgICB8IEZvbyBfLCBfXG4gICAgIHwgXywgRm9vIF8gLT5cbiAgICAgICAoKiBkaWZmZXJlbnQgaGVhZCBjb25zdHJ1Y3RvcnM6IGJyb2tlbiBwcmVjb25kaXRpb24gKilcbiAgICAgICBhc3NlcnQgZmFsc2VcbiopXG5hbmQgdHJhbnMgOiB0eXBlXG4gIGExIGIxIGMxIGQxIGUxIGYxXG4gIGEyIGIyIGMyIGQyIGUyIGYyXG4gIGEzIGIzIGMzIGQzIGUzIGYzXG4uXG4gICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSxcbiAgICBhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eV9yZWxcbi0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyLFxuICAgIGEzLCBiMywgYzMsIGQzLCBlMywgZjMpIGZtdHR5X3JlbFxuLT4gKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEsXG4gICAgYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHlfcmVsXG49IGZ1biB0eTEgdHkyIC0+IG1hdGNoIHR5MSwgdHkyIHdpdGhcbiAgfCBDaGFyX3R5IHJlc3QxLCBDaGFyX3R5IHJlc3QyIC0+IENoYXJfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IFN0cmluZ190eSByZXN0MSwgU3RyaW5nX3R5IHJlc3QyIC0+IFN0cmluZ190eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgQm9vbF90eSByZXN0MSwgQm9vbF90eSByZXN0MiAtPiBCb29sX3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBJbnRfdHkgcmVzdDEsIEludF90eSByZXN0MiAtPiBJbnRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEludDMyX3R5IHJlc3QxLCBJbnQzMl90eSByZXN0MiAtPiBJbnQzMl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSW50NjRfdHkgcmVzdDEsIEludDY0X3R5IHJlc3QyIC0+IEludDY0X3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBOYXRpdmVpbnRfdHkgcmVzdDEsIE5hdGl2ZWludF90eSByZXN0MiAtPiBOYXRpdmVpbnRfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEZsb2F0X3R5IHJlc3QxLCBGbG9hdF90eSByZXN0MiAtPiBGbG9hdF90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG5cbiAgfCBBbHBoYV90eSByZXN0MSwgQWxwaGFfdHkgcmVzdDIgLT4gQWxwaGFfdHkgKHRyYW5zIHJlc3QxIHJlc3QyKVxuICB8IEFscGhhX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgQWxwaGFfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IFRoZXRhX3R5IHJlc3QxLCBUaGV0YV90eSByZXN0MiAtPiBUaGV0YV90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgVGhldGFfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBUaGV0YV90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgQW55X3R5IHJlc3QxLCBBbnlfdHkgcmVzdDIgLT4gQW55X3R5ICh0cmFucyByZXN0MSByZXN0MilcbiAgfCBBbnlfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBBbnlfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IFJlYWRlcl90eSByZXN0MSwgUmVhZGVyX3R5IHJlc3QyIC0+IFJlYWRlcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgUmVhZGVyX3R5IF8sIF8gLT4gYXNzZXJ0IGZhbHNlXG4gIHwgXywgUmVhZGVyX3R5IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbiAgfCBJZ25vcmVkX3JlYWRlcl90eSByZXN0MSwgSWdub3JlZF9yZWFkZXJfdHkgcmVzdDIgLT5cbiAgICBJZ25vcmVkX3JlYWRlcl90eSAodHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBJZ25vcmVkX3JlYWRlcl90eSBfIC0+IGFzc2VydCBmYWxzZVxuXG4gIHwgRm9ybWF0X2FyZ190eSAodHkxLCByZXN0MSksIEZvcm1hdF9hcmdfdHkgKHR5MiwgcmVzdDIpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHJhbnMgdHkxIHR5MiwgdHJhbnMgcmVzdDEgcmVzdDIpXG4gIHwgRm9ybWF0X2FyZ190eSBfLCBfIC0+IGFzc2VydCBmYWxzZVxuICB8IF8sIEZvcm1hdF9hcmdfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxMSwgdHkxMiwgcmVzdDEpLFxuICAgIEZvcm1hdF9zdWJzdF90eSAodHkyMSwgdHkyMiwgcmVzdDIpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxMikgdHkyMSBpblxuICAgIGxldCBfLCBmMiwgXywgZjQgPSBmbXR0eV9yZWxfZGV0IHR5IGluXG4gICAgbGV0IFJlZmwgPSBmMiBSZWZsIGluXG4gICAgbGV0IFJlZmwgPSBmNCBSZWZsIGluXG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eTExLCB0eTIyLCB0cmFucyByZXN0MSByZXN0MilcbiAgfCBGb3JtYXRfc3Vic3RfdHkgXywgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBGb3JtYXRfc3Vic3RfdHkgXyAtPiBhc3NlcnQgZmFsc2VcblxuICB8IEVuZF9vZl9mbXR0eSwgRW5kX29mX2ZtdHR5IC0+IEVuZF9vZl9mbXR0eVxuICB8IEVuZF9vZl9mbXR0eSwgXyAtPiBhc3NlcnQgZmFsc2VcbiAgfCBfLCBFbmRfb2ZfZm10dHkgLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCByZWMgZm10dHlfb2ZfZm9ybWF0dGluZ19nZW4gOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgKGEsIGIsIGMsIGQsIGUsIGYpIGZvcm1hdHRpbmdfZ2VuIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5ID1cbmZ1biBmb3JtYXR0aW5nX2dlbiAtPiBtYXRjaCBmb3JtYXR0aW5nX2dlbiB3aXRoXG4gIHwgT3Blbl90YWcgKEZvcm1hdCAoZm10LCBfKSkgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IE9wZW5fYm94IChGb3JtYXQgKGZtdCwgXykpIC0+IGZtdHR5X29mX2ZtdCBmbXRcblxuKCogRXh0cmFjdCB0aGUgdHlwZSByZXByZXNlbnRhdGlvbiAoYW4gZm10dHkpIG9mIGEgZm9ybWF0LiAqKVxuYW5kIGZtdHR5X29mX2ZtdCA6IHR5cGUgYSBiIGMgZCBlIGYgLlxuICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSA9XG5mdW4gZm10dHkgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IFN0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChTdHJpbmdfdHkgKGZtdHR5X29mX2ZtdCByZXN0KSlcbiAgfCBDYW1sX3N0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIChTdHJpbmdfdHkgKGZtdHR5X29mX2ZtdCByZXN0KSlcblxuICB8IEludCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnRfdHkgdHlfcmVzdCkgaW5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCBwcmVjX3R5XG4gIHwgSW50MzIgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgdHlfcmVzdCA9IGZtdHR5X29mX2ZtdCByZXN0IGluXG4gICAgbGV0IHByZWNfdHkgPSBmbXR0eV9vZl9wcmVjaXNpb25fZm10dHkgcHJlYyAoSW50MzJfdHkgdHlfcmVzdCkgaW5cbiAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCBwcmVjX3R5XG4gIHwgTmF0aXZlaW50IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IHR5X3Jlc3QgPSBmbXR0eV9vZl9mbXQgcmVzdCBpblxuICAgIGxldCBwcmVjX3R5ID0gZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IHByZWMgKE5hdGl2ZWludF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBJbnQ2NCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChJbnQ2NF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcbiAgfCBGbG9hdCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCB0eV9yZXN0ID0gZm10dHlfb2ZfZm10IHJlc3QgaW5cbiAgICBsZXQgcHJlY190eSA9IGZtdHR5X29mX3ByZWNpc2lvbl9mbXR0eSBwcmVjIChGbG9hdF90eSB0eV9yZXN0KSBpblxuICAgIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgcGFkIHByZWNfdHlcblxuICB8IENoYXIgcmVzdCAgICAgICAgICAgICAgICAgIC0+IENoYXJfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IENhbWxfY2hhciByZXN0ICAgICAgICAgICAgIC0+IENoYXJfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IEJvb2wgKHBhZCwgcmVzdCkgICAgICAgICAgIC0+XG4gICAgICBmbXR0eV9vZl9wYWRkaW5nX2ZtdHR5IHBhZCAoQm9vbF90eSAoZm10dHlfb2ZfZm10IHJlc3QpKVxuICB8IEFscGhhIHJlc3QgICAgICAgICAgICAgICAgIC0+IEFscGhhX3R5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBUaGV0YSByZXN0ICAgICAgICAgICAgICAgICAtPiBUaGV0YV90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgQ3VzdG9tIChhcml0eSwgXywgcmVzdCkgICAgLT4gZm10dHlfb2ZfY3VzdG9tIGFyaXR5IChmbXR0eV9vZl9mbXQgcmVzdClcbiAgfCBSZWFkZXIgcmVzdCAgICAgICAgICAgICAgICAtPiBSZWFkZXJfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRm9ybWF0X2FyZyAoXywgdHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X2FyZ190eSAodHksIGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IEZvcm1hdF9zdWJzdCAoXywgdHksIHJlc3QpIC0+XG4gICAgRm9ybWF0X3N1YnN0X3R5ICh0eSwgdHksIGZtdHR5X29mX2ZtdCByZXN0KVxuXG4gIHwgRmx1c2ggcmVzdCAgICAgICAgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IHJlc3RcbiAgfCBTdHJpbmdfbGl0ZXJhbCAoXywgcmVzdCkgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgICAgIC0+IGZtdHR5X29mX2ZtdCByZXN0XG5cbiAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPiBTdHJpbmdfdHkgKGZtdHR5X29mX2ZtdCByZXN0KVxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKF8sIHJlc3QpIC0+IEludF90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAgICAgICAgLT4gQ2hhcl90eSAoZm10dHlfb2ZfZm10IHJlc3QpXG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAgLT4gZm10dHlfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2xpdCAoXywgcmVzdCkgICAtPiBmbXR0eV9vZl9mbXQgcmVzdFxuICB8IEZvcm1hdHRpbmdfZ2VuIChmbXRpbmdfZ2VuLCByZXN0KSAgLT5cbiAgICBjb25jYXRfZm10dHkgKGZtdHR5X29mX2Zvcm1hdHRpbmdfZ2VuIGZtdGluZ19nZW4pIChmbXR0eV9vZl9mbXQgcmVzdClcblxuICB8IEVuZF9vZl9mb3JtYXQgICAgICAgICAgICAgIC0+IEVuZF9vZl9mbXR0eVxuXG5hbmQgZm10dHlfb2ZfY3VzdG9tIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPlxuICAoeSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGFyaXR5IGZtdHR5IC0+IG1hdGNoIGFyaXR5IHdpdGhcbiAgfCBDdXN0b21femVybyAtPiBmbXR0eVxuICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+IEFueV90eSAoZm10dHlfb2ZfY3VzdG9tIGFyaXR5IGZtdHR5KVxuXG4oKiBFeHRyYWN0IHRoZSBmbXR0eSBvZiBhbiBpZ25vcmVkIHBhcmFtZXRlciBmb2xsb3dlZCBieSB0aGUgcmVzdCBvZlxuICAgdGhlIGZvcm1hdC4gKilcbmFuZCBmbXR0eV9vZl9pZ25vcmVkX2Zvcm1hdCA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgICAoYSwgYiwgYywgZCwgeSwgeCkgaWdub3JlZCAtPlxuICAgICh4LCBiLCBjLCB5LCBlLCBmKSBmbXQgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuZnVuIGlnbiBmbXQgLT4gbWF0Y2ggaWduIHdpdGhcbiAgfCBJZ25vcmVkX2NoYXIgICAgICAgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX3N0cmluZyBfICAgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIF8gICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2ludDMyIChfLCBfKSAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX25hdGl2ZWludCAoXywgXykgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2Zsb2F0IChfLCBfKSAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2Jvb2wgXyAgICAgICAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IGZtdHR5X29mX2ZtdCBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoXywgZm10dHkpIC0+IGNvbmNhdF9mbXR0eSBmbXR0eSAoZm10dHlfb2ZfZm10IGZtdClcbiAgfCBJZ25vcmVkX3JlYWRlciAgICAgICAgICAgICAgICAgIC0+IElnbm9yZWRfcmVhZGVyX3R5IChmbXR0eV9vZl9mbXQgZm10KVxuICB8IElnbm9yZWRfc2Nhbl9jaGFyX3NldCBfICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuICB8IElnbm9yZWRfc2Nhbl9uZXh0X2NoYXIgICAgICAgICAgLT4gZm10dHlfb2ZfZm10IGZtdFxuXG4oKiBBZGQgYW4gSW50X3R5IG5vZGUgaWYgcGFkZGluZyBpcyB0YWtlbiBhcyBhbiBleHRyYSBhcmd1bWVudCAoZXg6IFwiJSpzXCIpLiAqKVxuYW5kIGZtdHR5X29mX3BhZGRpbmdfZm10dHkgOiB0eXBlIHggYSBiIGMgZCBlIGYgLlxuICAgICh4LCBhKSBwYWRkaW5nIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPiAoeCwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuICBmdW4gcGFkIGZtdHR5IC0+IG1hdGNoIHBhZCB3aXRoXG4gICAgfCBOb19wYWRkaW5nICAgIC0+IGZtdHR5XG4gICAgfCBMaXRfcGFkZGluZyBfIC0+IGZtdHR5XG4gICAgfCBBcmdfcGFkZGluZyBfIC0+IEludF90eSBmbXR0eVxuXG4oKiBBZGQgYW4gSW50X3R5IG5vZGUgaWYgcHJlY2lzaW9uIGlzIHRha2VuIGFzIGFuIGV4dHJhIGFyZ3VtZW50IChleDogXCIlLipmXCIpLiopXG5hbmQgZm10dHlfb2ZfcHJlY2lzaW9uX2ZtdHR5IDogdHlwZSB4IGEgYiBjIGQgZSBmIC5cbiAgICAoeCwgYSkgcHJlY2lzaW9uIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPiAoeCwgYiwgYywgZCwgZSwgZikgZm10dHkgPVxuICBmdW4gcHJlYyBmbXR0eSAtPiBtYXRjaCBwcmVjIHdpdGhcbiAgICB8IE5vX3ByZWNpc2lvbiAgICAtPiBmbXR0eVxuICAgIHwgTGl0X3ByZWNpc2lvbiBfIC0+IGZtdHR5XG4gICAgfCBBcmdfcHJlY2lzaW9uICAgLT4gSW50X3R5IGZtdHR5XG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogRm9ybWF0IHR5cGluZyAqKVxuXG4oKiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSBmb3JtYXQgZG9lcyBub3QgbWF0Y2ggYSBnaXZlbiBmb3JtYXQgdHlwZS4gKilcbmV4Y2VwdGlvbiBUeXBlX21pc21hdGNoXG5cbigqIFR5cGUgYSBwYWRkaW5nLiAqKVxuKCogVGFrZSBhbiBJbnRfdHkgZnJvbSB0aGUgZm10dHkgaWYgdGhlIGludGVnZXIgc2hvdWxkIGJlIGtlcHQgYXMgYXJndW1lbnQuICopXG4oKiBSYWlzZSBUeXBlX21pc21hdGNoIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCB0eXBlX3BhZGRpbmcgOiB0eXBlIGEgYiBjIGQgZSBmIHggeSAuXG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICAgICAoYSwgYiwgYywgZCwgZSwgZikgcGFkZGluZ19mbXR0eV9lYmIgPVxuZnVuIHBhZCBmbXR0eSAtPiBtYXRjaCBwYWQsIGZtdHR5IHdpdGhcbiAgfCBOb19wYWRkaW5nLCBfIC0+IFBhZGRpbmdfZm10dHlfRUJCIChOb19wYWRkaW5nLCBmbXR0eSlcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBfIC0+IFBhZGRpbmdfZm10dHlfRUJCIChMaXRfcGFkZGluZyAocGFkdHksdyksZm10dHkpXG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEludF90eSByZXN0IC0+IFBhZGRpbmdfZm10dHlfRUJCIChBcmdfcGFkZGluZyBwYWR0eSxyZXN0KVxuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG4oKiBDb252ZXJ0IGEgKHVwYWRkaW5nLCB1cHJlY2lzaW9uKSB0byBhIChwYWRkaW5nLCBwcmVjaXNpb24pLiAqKVxuKCogVGFrZSBvbmUgb3IgdHdvIEludF90eSBmcm9tIHRoZSBmbXR0eSBpZiBuZWVkZWQuICopXG4oKiBSYWlzZSBUeXBlX21pc21hdGNoIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCB0eXBlX3BhZHByZWMgOiB0eXBlIGEgYiBjIGQgZSBmIHggeSB6IC5cbiAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIHopIHByZWNpc2lvbiAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHkgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgcGFkcHJlY19mbXR0eV9lYmIgPVxuZnVuIHBhZCBwcmVjIGZtdHR5IC0+IG1hdGNoIHByZWMsIHR5cGVfcGFkZGluZyBwYWQgZm10dHkgd2l0aFxuICB8IE5vX3ByZWNpc2lvbiwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgcmVzdCkgLT5cbiAgICBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBOb19wcmVjaXNpb24sIHJlc3QpXG4gIHwgTGl0X3ByZWNpc2lvbiBwLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCByZXN0KSAtPlxuICAgIFBhZHByZWNfZm10dHlfRUJCIChwYWQsIExpdF9wcmVjaXNpb24gcCwgcmVzdClcbiAgfCBBcmdfcHJlY2lzaW9uLCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBJbnRfdHkgcmVzdCkgLT5cbiAgICBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBBcmdfcHJlY2lzaW9uLCByZXN0KVxuICB8IF8sIFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIFR5cGUgYSBmb3JtYXQgYWNjb3JkaW5nIHRvIGFuIGZtdHR5LiAqKVxuKCogSWYgdHlwaW5nIHN1Y2NlZWQsIGdlbmVyYXRlIGEgY29weSBvZiB0aGUgZm9ybWF0IHdpdGggdGhlIHNhbWVcbiAgICB0eXBlIHBhcmFtZXRlcnMgYXMgdGhlIGZtdHR5LiAqKVxuKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiBjYXNlIG9mIHR5cGUgbWlzbWF0Y2guICopXG5sZXQgcmVjIHR5cGVfZm9ybWF0IDpcbiAgdHlwZSBhMSBiMSBjMSBkMSBlMSBmMVxuICAgICAgIGEyIGIyIGMyIGQyIGUyIGYyICAuXG4gICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmbXRcbiAgLT4gKGEyLCBiMiwgYzIsIGQyLCBlMiwgZjIpIGZtdHR5XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRcbj0gZnVuIGZtdCBmbXR0eSAtPiBtYXRjaCB0eXBlX2Zvcm1hdF9nZW4gZm10IGZtdHR5IHdpdGhcbiAgfCBGbXRfZm10dHlfRUJCIChmbXQnLCBFbmRfb2ZfZm10dHkpIC0+IGZtdCdcbiAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcblxuYW5kIHR5cGVfZm9ybWF0X2dlbiA6XG4gIHR5cGUgYTEgYjEgYzEgZDEgZTEgZjFcbiAgICAgICBhMiBiMiBjMiBkMiBlMiBmMiAgLlxuICAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10XG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eVxuICAtPiAoYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10X2ZtdHR5X2ViYlxuPSBmdW4gZm10IGZtdHR5IC0+IG1hdGNoIGZtdCwgZm10dHkgd2l0aFxuICB8IENoYXIgZm10X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChDaGFyIGZtdCcsIGZtdHR5JylcbiAgfCBDYW1sX2NoYXIgZm10X3Jlc3QsIENoYXJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChDYW1sX2NoYXIgZm10JywgZm10dHknKVxuICB8IFN0cmluZyAocGFkLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkZGluZyBwYWQgZm10dHkgd2l0aFxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgU3RyaW5nX3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChTdHJpbmcgKHBhZCwgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZGRpbmdfZm10dHlfRUJCIChfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBDYW1sX3N0cmluZyAocGFkLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkZGluZyBwYWQgZm10dHkgd2l0aFxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKHBhZCwgU3RyaW5nX3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChDYW1sX3N0cmluZyAocGFkLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkZGluZ19mbXR0eV9FQkIgKF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEludCAoaWNvbnYsIHBhZCwgcHJlYywgZm10X3Jlc3QpLCBfIC0+IChcbiAgICBtYXRjaCB0eXBlX3BhZHByZWMgcGFkIHByZWMgZm10dHkgd2l0aFxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKHBhZCwgcHJlYywgSW50X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgSW50MzIgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEludDMyX3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIE5hdGl2ZWludF90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoTmF0aXZlaW50IChpY29udiwgcGFkLCBwcmVjLCBmbXQnKSwgZm10dHknKVxuICAgIHwgUGFkcHJlY19mbXR0eV9FQkIgKF8sIF8sIF8pIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCBmbXRfcmVzdCksIF8gLT4gKFxuICAgIG1hdGNoIHR5cGVfcGFkcHJlYyBwYWQgcHJlYyBmbXR0eSB3aXRoXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAocGFkLCBwcmVjLCBJbnQ2NF90eSBmbXR0eV9yZXN0KSAtPlxuICAgICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoSW50NjQgKGljb252LCBwYWQsIHByZWMsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRwcmVjX2ZtdHR5X0VCQiAoXywgXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRwcmVjIHBhZCBwcmVjIGZtdHR5IHdpdGhcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChwYWQsIHByZWMsIEZsb2F0X3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChGbG9hdCAoZmNvbnYsIHBhZCwgcHJlYywgZm10JyksIGZtdHR5JylcbiAgICB8IFBhZHByZWNfZm10dHlfRUJCIChfLCBfLCBfKSAtPiByYWlzZSBUeXBlX21pc21hdGNoXG4gIClcbiAgfCBCb29sIChwYWQsIGZtdF9yZXN0KSwgXyAtPiAoXG4gICAgbWF0Y2ggdHlwZV9wYWRkaW5nIHBhZCBmbXR0eSB3aXRoXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAocGFkLCBCb29sX3R5IGZtdHR5X3Jlc3QpIC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgICBGbXRfZm10dHlfRUJCIChCb29sIChwYWQsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBQYWRkaW5nX2ZtdHR5X0VCQiAoXywgXykgLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuICApXG4gIHwgRmx1c2ggZm10X3Jlc3QsIGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRmx1c2ggZm10JywgZm10dHknKVxuXG4gIHwgU3RyaW5nX2xpdGVyYWwgKHN0ciwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFN0cmluZ19saXRlcmFsIChzdHIsIGZtdCcpLCBmbXR0eScpXG4gIHwgQ2hhcl9saXRlcmFsIChjaHIsIGZtdF9yZXN0KSwgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChDaGFyX2xpdGVyYWwgKGNociwgZm10JyksIGZtdHR5JylcblxuICB8IEZvcm1hdF9hcmcgKHBhZF9vcHQsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpLFxuICAgIEZvcm1hdF9hcmdfdHkgKHN1Yl9mbXR0eScsIGZtdHR5X3Jlc3QpIC0+XG4gICAgaWYgRm10dHlfRUJCIHN1Yl9mbXR0eSA8PiBGbXR0eV9FQkIgc3ViX2ZtdHR5JyB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdF9hcmcgKHBhZF9vcHQsIHN1Yl9mbXR0eScsIGZtdCcpLCBmbXR0eScpXG4gIHwgRm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHksIGZtdF9yZXN0KSxcbiAgICBGb3JtYXRfc3Vic3RfdHkgKHN1Yl9mbXR0eTEsIF9zdWJfZm10dHkyLCBmbXR0eV9yZXN0KSAtPlxuICAgIGlmIEZtdHR5X0VCQiAoZXJhc2VfcmVsIHN1Yl9mbXR0eSkgPD4gRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViX2ZtdHR5MSkgdGhlblxuICAgICAgcmFpc2UgVHlwZV9taXNtYXRjaDtcbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9XG4gICAgICB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgKGVyYXNlX3JlbCBmbXR0eV9yZXN0KVxuICAgIGluXG4gICAgRm10X2ZtdHR5X0VCQiAoRm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHkxLCBmbXQnKSwgZm10dHknKVxuICAoKiBQcmludGYgYW5kIEZvcm1hdCBzcGVjaWZpYyBjb25zdHJ1Y3RvcnM6ICopXG4gIHwgQWxwaGEgZm10X3Jlc3QsIEFscGhhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoQWxwaGEgZm10JywgZm10dHknKVxuICB8IFRoZXRhIGZtdF9yZXN0LCBUaGV0YV90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFRoZXRhIGZtdCcsIGZtdHR5JylcblxuICAoKiBGb3JtYXQgc3BlY2lmaWMgY29uc3RydWN0b3JzOiAqKVxuICB8IEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10JyksIGZtdHR5JylcbiAgfCBGb3JtYXR0aW5nX2dlbiAoZm9ybWF0dGluZ19nZW4sIGZtdF9yZXN0KSwgZm10dHlfcmVzdCAtPlxuICAgIHR5cGVfZm9ybWF0dGluZ19nZW4gZm9ybWF0dGluZ19nZW4gZm10X3Jlc3QgZm10dHlfcmVzdFxuXG4gICgqIFNjYW5mIHNwZWNpZmljIGNvbnN0cnVjdG9yczogKilcbiAgfCBSZWFkZXIgZm10X3Jlc3QsIFJlYWRlcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10X3Jlc3QgZm10dHlfcmVzdCBpblxuICAgIEZtdF9mbXR0eV9FQkIgKFJlYWRlciBmbXQnLCBmbXR0eScpXG4gIHwgU2Nhbl9jaGFyX3NldCAod2lkdGhfb3B0LCBjaGFyX3NldCwgZm10X3Jlc3QpLCBTdHJpbmdfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdF9yZXN0IGZtdHR5X3Jlc3QgaW5cbiAgICBGbXRfZm10dHlfRUJCIChTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBmbXQnKSwgZm10dHknKVxuICB8IFNjYW5fZ2V0X2NvdW50ZXIgKGNvdW50ZXIsIGZtdF9yZXN0KSwgSW50X3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXRfcmVzdCBmbXR0eV9yZXN0IGluXG4gICAgRm10X2ZtdHR5X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10JyksIGZtdHR5JylcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpLCBmbXR0eV9yZXN0IC0+XG4gICAgdHlwZV9pZ25vcmVkX3BhcmFtIGlnbiByZXN0IGZtdHR5X3Jlc3RcblxuICB8IEVuZF9vZl9mb3JtYXQsIGZtdHR5X3Jlc3QgLT4gRm10X2ZtdHR5X0VCQiAoRW5kX29mX2Zvcm1hdCwgZm10dHlfcmVzdClcblxuICB8IF8gLT4gcmFpc2UgVHlwZV9taXNtYXRjaFxuXG5hbmQgdHlwZV9mb3JtYXR0aW5nX2dlbiA6IHR5cGUgYTEgYTMgYjEgYjMgYzEgYzMgZDEgZDMgZTEgZTIgZTMgZjEgZjIgZjMgLlxuICAgIChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxKSBmb3JtYXR0aW5nX2dlbiAtPlxuICAgIChmMSwgYjEsIGMxLCBlMSwgZTIsIGYyKSBmbXQgLT5cbiAgICAoYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10dHkgLT5cbiAgICAoYTMsIGIzLCBjMywgZDMsIGUzLCBmMykgZm10X2ZtdHR5X2ViYiA9XG5mdW4gZm9ybWF0dGluZ19nZW4gZm10MCBmbXR0eTAgLT4gbWF0Y2ggZm9ybWF0dGluZ19nZW4gd2l0aFxuICB8IE9wZW5fdGFnIChGb3JtYXQgKGZtdDEsIHN0cikpIC0+XG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDIsIGZtdHR5MikgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MSBmbXR0eTAgaW5cbiAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10MywgZm10dHkzKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQwIGZtdHR5MiBpblxuICAgIEZtdF9mbXR0eV9FQkIgKEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQyLCBzdHIpKSwgZm10MyksIGZtdHR5MylcbiAgfCBPcGVuX2JveCAoRm9ybWF0IChmbXQxLCBzdHIpKSAtPlxuICAgIGxldCBGbXRfZm10dHlfRUJCIChmbXQyLCBmbXR0eTIpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdDEgZm10dHkwIGluXG4gICAgbGV0IEZtdF9mbXR0eV9FQkIgKGZtdDMsIGZtdHR5MykgPSB0eXBlX2Zvcm1hdF9nZW4gZm10MCBmbXR0eTIgaW5cbiAgICBGbXRfZm10dHlfRUJCIChGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10Miwgc3RyKSksIGZtdDMpLCBmbXR0eTMpXG5cbigqIFR5cGUgYW4gSWdub3JlZF9wYXJhbSBub2RlIGFjY29yZGluZyB0byBhbiBmbXR0eS4gKilcbmFuZCB0eXBlX2lnbm9yZWRfcGFyYW0gOiB0eXBlIHAgcSB4IHkgeiB0IHUgdiBhIGIgYyBkIGUgZiAuXG4gICAgKHgsIHksIHosIHQsIHEsIHApIGlnbm9yZWQgLT5cbiAgICAocCwgeSwgeiwgcSwgdSwgdikgZm10IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdHR5IC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdF9mbXR0eV9lYmIgPVxuZnVuIGlnbiBmbXQgZm10dHkgLT4gbWF0Y2ggaWduIHdpdGhcbiAgfCBJZ25vcmVkX2NoYXIgICAgICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX3N0cmluZyBfICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIF8gICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2ludCBfICAgICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2ludDMyIF8gICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX25hdGl2ZWludCBfICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2ludDY0IF8gICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2Zsb2F0IF8gICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2Jvb2wgXyAgICAgICAgICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgXyBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyICAgICBhcyBpZ24nIC0+IHR5cGVfaWdub3JlZF9wYXJhbV9vbmUgaWduJyBmbXQgZm10dHlcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgKHBhZF9vcHQsIHN1Yl9mbXR0eSkgLT5cbiAgICB0eXBlX2lnbm9yZWRfcGFyYW1fb25lIChJZ25vcmVkX2Zvcm1hdF9hcmcgKHBhZF9vcHQsIHN1Yl9mbXR0eSkpIGZtdCBmbXR0eVxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChwYWRfb3B0LCBzdWJfZm10dHkpIC0+XG4gICAgbGV0IEZtdHR5X2ZtdF9FQkIgKHN1Yl9mbXR0eScsIEZtdF9mbXR0eV9FQkIgKGZtdCcsIGZtdHR5JykpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eSBmbXQgZm10dHkgaW5cbiAgICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2Zvcm1hdF9zdWJzdCAocGFkX29wdCwgc3ViX2ZtdHR5JyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10JyksXG4gICAgICAgICAgICAgICAgICAgZm10dHknKVxuICB8IElnbm9yZWRfcmVhZGVyIC0+IChcbiAgICBtYXRjaCBmbXR0eSB3aXRoXG4gICAgfCBJZ25vcmVkX3JlYWRlcl90eSBmbXR0eV9yZXN0IC0+XG4gICAgICBsZXQgRm10X2ZtdHR5X0VCQiAoZm10JywgZm10dHknKSA9IHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHlfcmVzdCBpblxuICAgICAgRm10X2ZtdHR5X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9yZWFkZXIsIGZtdCcpLCBmbXR0eScpXG4gICAgfCBfIC0+IHJhaXNlIFR5cGVfbWlzbWF0Y2hcbiAgKVxuXG5hbmQgdHlwZV9pZ25vcmVkX3BhcmFtX29uZSA6IHR5cGUgYTEgYTIgYjEgYjIgYzEgYzIgZDEgZDIgZTEgZTIgZjEgZjIgLlxuICAgIChhMiwgYjIsIGMyLCBkMiwgZDIsIGEyKSBpZ25vcmVkIC0+XG4gICAgKGExLCBiMSwgYzEsIGQxLCBlMSwgZjEpIGZtdCAtPlxuICAgIChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXR0eSAtPlxuICAgIChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRfZm10dHlfZWJiXG49IGZ1biBpZ24gZm10IGZtdHR5IC0+XG4gIGxldCBGbXRfZm10dHlfRUJCIChmbXQnLCBmbXR0eScpID0gdHlwZV9mb3JtYXRfZ2VuIGZtdCBmbXR0eSBpblxuICBGbXRfZm10dHlfRUJCIChJZ25vcmVkX3BhcmFtIChpZ24sIGZtdCcpLCBmbXR0eScpXG5cbigqIFR5cGluZyBvZiB0aGUgY29tcGxleCBjYXNlOiBcIiVfKC4uLiUpXCIuICopXG5hbmQgdHlwZV9pZ25vcmVkX2Zvcm1hdF9zdWJzdGl0dXRpb24gOiB0eXBlIHcgeCB5IHogcCBzIHQgdSBhIGIgYyBkIGUgZiAuXG4gICAgKHcsIHgsIHksIHosIHMsIHApIGZtdHR5IC0+XG4gICAgKHAsIHgsIHksIHMsIHQsIHUpIGZtdCAtPlxuICAgIChhLCBiLCBjLCBkLCBlLCBmKSBmbXR0eSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10dHlfZm10X2ViYiA9XG5mdW4gc3ViX2ZtdHR5IGZtdCBmbXR0eSAtPiBtYXRjaCBzdWJfZm10dHksIGZtdHR5IHdpdGhcbiAgfCBDaGFyX3R5IHN1Yl9mbXR0eV9yZXN0LCBDaGFyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKENoYXJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFN0cmluZ190eSBzdWJfZm10dHlfcmVzdCwgU3RyaW5nX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKFN0cmluZ190eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgSW50X3R5IHN1Yl9mbXR0eV9yZXN0LCBJbnRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBJbnQzMl90eSBzdWJfZm10dHlfcmVzdCwgSW50MzJfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoSW50MzJfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IE5hdGl2ZWludF90eSBzdWJfZm10dHlfcmVzdCwgTmF0aXZlaW50X3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKE5hdGl2ZWludF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgSW50NjRfdHkgc3ViX2ZtdHR5X3Jlc3QsIEludDY0X3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEludDY0X3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBGbG9hdF90eSBzdWJfZm10dHlfcmVzdCwgRmxvYXRfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoRmxvYXRfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IEJvb2xfdHkgc3ViX2ZtdHR5X3Jlc3QsIEJvb2xfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoQm9vbF90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgQWxwaGFfdHkgc3ViX2ZtdHR5X3Jlc3QsIEFscGhhX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKEFscGhhX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcbiAgfCBUaGV0YV90eSBzdWJfZm10dHlfcmVzdCwgVGhldGFfdHkgZm10dHlfcmVzdCAtPlxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoVGhldGFfdHkgc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKVxuICB8IFJlYWRlcl90eSBzdWJfZm10dHlfcmVzdCwgUmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKFJlYWRlcl90eSBzdWJfZm10dHlfcmVzdCcsIGZtdCcpXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgc3ViX2ZtdHR5X3Jlc3QsIElnbm9yZWRfcmVhZGVyX3R5IGZtdHR5X3Jlc3QgLT5cbiAgICBsZXQgRm10dHlfZm10X0VCQiAoc3ViX2ZtdHR5X3Jlc3QnLCBmbXQnKSA9XG4gICAgICB0eXBlX2lnbm9yZWRfZm9ybWF0X3N1YnN0aXR1dGlvbiBzdWJfZm10dHlfcmVzdCBmbXQgZm10dHlfcmVzdCBpblxuICAgIEZtdHR5X2ZtdF9FQkIgKElnbm9yZWRfcmVhZGVyX3R5IHN1Yl9mbXR0eV9yZXN0JywgZm10JylcblxuICB8IEZvcm1hdF9hcmdfdHkgKHN1YjJfZm10dHksIHN1Yl9mbXR0eV9yZXN0KSxcbiAgICBGb3JtYXRfYXJnX3R5IChzdWIyX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICBpZiBGbXR0eV9FQkIgc3ViMl9mbXR0eSA8PiBGbXR0eV9FQkIgc3ViMl9mbXR0eScgdGhlbiByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIHN1Yl9mbXR0eV9yZXN0IGZtdCBmbXR0eV9yZXN0IGluXG4gICAgRm10dHlfZm10X0VCQiAoRm9ybWF0X2FyZ190eSAoc3ViMl9mbXR0eScsIHN1Yl9mbXR0eV9yZXN0JyksIGZtdCcpXG4gIHwgRm9ybWF0X3N1YnN0X3R5IChzdWIxX2ZtdHR5LCAgc3ViMl9mbXR0eSwgIHN1Yl9mbXR0eV9yZXN0KSxcbiAgICBGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHknLCBzdWIyX2ZtdHR5JywgZm10dHlfcmVzdCkgLT5cbiAgICAoKiBUT0RPIGRlZmluZSBGbXR0eV9yZWxfRUJCIHRvIHJlbW92ZSB0aG9zZSBlcmFzZV9yZWwgKilcbiAgICBpZiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIxX2ZtdHR5KSA8PiBGbXR0eV9FQkIgKGVyYXNlX3JlbCBzdWIxX2ZtdHR5JylcbiAgICB0aGVuIHJhaXNlIFR5cGVfbWlzbWF0Y2g7XG4gICAgaWYgRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViMl9mbXR0eSkgPD4gRm10dHlfRUJCIChlcmFzZV9yZWwgc3ViMl9mbXR0eScpXG4gICAgdGhlbiByYWlzZSBUeXBlX21pc21hdGNoO1xuICAgIGxldCBzdWJfZm10dHknID0gdHJhbnMgKHN5bW0gc3ViMV9mbXR0eScpIHN1YjJfZm10dHknIGluXG4gICAgbGV0IF8sIGYyLCBfLCBmNCA9IGZtdHR5X3JlbF9kZXQgc3ViX2ZtdHR5JyBpblxuICAgIGxldCBSZWZsID0gZjIgUmVmbCBpblxuICAgIGxldCBSZWZsID0gZjQgUmVmbCBpblxuICAgIGxldCBGbXR0eV9mbXRfRUJCIChzdWJfZm10dHlfcmVzdCcsIGZtdCcpID1cbiAgICAgIHR5cGVfaWdub3JlZF9mb3JtYXRfc3Vic3RpdHV0aW9uIChlcmFzZV9yZWwgc3ViX2ZtdHR5X3Jlc3QpIGZtdCBmbXR0eV9yZXN0XG4gICAgaW5cbiAgICBGbXR0eV9mbXRfRUJCIChGb3JtYXRfc3Vic3RfdHkgKHN1YjFfZm10dHknLCBzdWIyX2ZtdHR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW0gc3ViX2ZtdHR5X3Jlc3QnKSxcbiAgICAgICAgICAgICAgICAgICBmbXQnKVxuICB8IEVuZF9vZl9mbXR0eSwgZm10dHkgLT5cbiAgICBGbXR0eV9mbXRfRUJCIChFbmRfb2ZfZm10dHksIHR5cGVfZm9ybWF0X2dlbiBmbXQgZm10dHkpXG4gIHwgXyAtPiByYWlzZSBUeXBlX21pc21hdGNoXG5cbigqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYHJlY2FzdGAgaXMgYSBiaXQgZGlzYXBwb2ludGluZy4gVGhlXG4gICBpbnZhcmlhbnQgcHJvdmlkZWQgYnkgdGhlIHR5cGUgYXJlIHZlcnkgc3Ryb25nOiB0aGUgaW5wdXQgZm9ybWF0J3NcbiAgIHR5cGUgaXMgaW4gcmVsYXRpb24gdG8gdGhlIG91dHB1dCB0eXBlJ3MgYXMgd2l0bmVzc2VkIGJ5IHRoZVxuICAgZm10dHlfcmVsIGFyZ3VtZW50LiBPbmUgd291bGQgYXQgZmlyc3QgZXhwZWN0IHRoaXMgZnVuY3Rpb24gdG8gYmVcbiAgIHRvdGFsLCBhbmQgaW1wbGVtZW50YWJsZSBieSBleGhhdXN0aXZlIHBhdHRlcm4gbWF0Y2hpbmcuIEluc3RlYWQsXG4gICB3ZSByZXVzZSB0aGUgaGlnaGx5IHBhcnRpYWwgYW5kIG11Y2ggbGVzcyB3ZWxsLWRlZmluZWQgZnVuY3Rpb25cbiAgIGB0eXBlX2Zvcm1hdGAgdGhhdCBoYXMgbG9zdCBhbGwga25vd2xlZGdlIG9mIHRoZSBjb3JyZXNwb25kZW5jZVxuICAgYmV0d2VlbiB0aGUgYXJndW1lbnQncyB0eXBlcy5cblxuICAgQmVzaWRlcyB0aGUgZmFjdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV1c2VzIGEgbG90IG9mIHRoZVxuICAgYHR5cGVfZm9ybWF0YCBsb2dpYyAoZWcuOiBzZWVpbmcgSW50X3R5IGluIHRoZSBmbXR0eSBwYXJhbWV0ZXIgZG9lc1xuICAgbm90IGxldCB5b3UgbWF0Y2ggb24gSW50IG9ubHksIGFzIHlvdSBtYXkgaW4gZmFjdCBoYXZlIEZsb2F0XG4gICAoQXJnX3BhZGRpbmcsIC4uLikgKFwiJS4qZFwiKSBiZWdpbm5pbmcgd2l0aCBhbiBJbnRfdHkpLCBpdCBpcyBhbHNvXG4gICBhIHBhcnRpYWwgZnVuY3Rpb24sIGJlY2F1c2UgdGhlIHR5cGluZyBpbmZvcm1hdGlvbiBpbiBhIGZvcm1hdCBpc1xuICAgbm90IHF1aXRlIGVub3VnaCB0byByZWNvbnN0cnVjdCBpdCB1bmFtYmlndW91c2x5LiBGb3IgZXhhbXBsZSwgdGhlXG4gICBmb3JtYXQgdHlwZXMgb2YgXCIlZCVfclwiIGFuZCBcIiVfciVkXCIgaGF2ZSB0aGUgc2FtZSBmb3JtYXQ2XG4gICBwYXJhbWV0ZXJzLCBidXQgdGhleSBhcmUgbm90IGF0IGFsbCBleGNoYW5nZWFibGUsIGFuZCBwdXR0aW5nIG9uZVxuICAgaW4gcGxhY2Ugb2YgdGhlIG90aGVyIG11c3QgcmVzdWx0IGluIGEgZHluYW1pYyBmYWlsdXJlLlxuXG4gICBHaXZlbiB0aGF0OlxuICAgLSB3ZSdkIGhhdmUgdG8gZHVwbGljYXRlIGEgbG90IG9mIG5vbi10cml2aWFsIHR5cGluZyBsb2dpYyBmcm9tIHR5cGVfZm9ybWF0XG4gICAtIHRoaXMgd291bGRuJ3QgZXZlbiBlbGltaW5hdGUgKGFsbCkgdGhlIGR5bmFtaWMgZmFpbHVyZXNcbiAgIHdlIGRlY2lkZWQgdG8ganVzdCByZXVzZSB0eXBlX2Zvcm1hdCBkaXJlY3RseSBmb3Igbm93LlxuKilcbmxldCByZWNhc3QgOlxuICB0eXBlIGExIGIxIGMxIGQxIGUxIGYxXG4gICAgICAgYTIgYjIgYzIgZDIgZTIgZjJcbiAgLlxuICAgICAoYTEsIGIxLCBjMSwgZDEsIGUxLCBmMSkgZm10XG4gIC0+IChhMSwgYjEsIGMxLCBkMSwgZTEsIGYxLFxuICAgICAgYTIsIGIyLCBjMiwgZDIsIGUyLCBmMikgZm10dHlfcmVsXG4gIC0+IChhMiwgYjIsIGMyLCBkMiwgZTIsIGYyKSBmbXRcbj0gZnVuIGZtdCBmbXR0eSAtPlxuICB0eXBlX2Zvcm1hdCBmbXQgKGVyYXNlX3JlbCAoc3ltbSBmbXR0eSkpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFByaW50aW5nIHRvb2xzICopXG5cbigqIEFkZCBwYWRkaW5nIHNwYWNlcyBhcm91bmQgYSBzdHJpbmcuICopXG5sZXQgZml4X3BhZGRpbmcgcGFkdHkgd2lkdGggc3RyID1cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIGxldCB3aWR0aCwgcGFkdHkgPVxuICAgIGFicyB3aWR0aCxcbiAgICAoKiB3aGlsZSBsaXRlcmFsIHBhZGRpbmcgd2lkdGhzIGFyZSBhbHdheXMgbm9uLW5lZ2F0aXZlLFxuICAgICAgIGR5bmFtaWNhbGx5LXNldCB3aWR0aHMgKEFyZ19wYWRkaW5nLCBlZy4gJSpkKSBtYXkgYmUgbmVnYXRpdmU7XG4gICAgICAgd2UgaW50ZXJwcmV0IHRob3NlIGFzIHNwZWNpZnlpbmcgYSBwYWRkaW5nLXRvLXRoZS1sZWZ0OyB0aGlzXG4gICAgICAgbWVhbnMgdGhhdCAnMCcgbWF5IGdldCBkcm9wcGVkIGV2ZW4gaWYgaXQgd2FzIGV4cGxpY2l0bHkgc2V0LFxuICAgICAgIGJ1dDpcbiAgICAgICAtIHRoaXMgaXMgd2hhdCB0aGUgbGVnYWN5IGltcGxlbWVudGF0aW9uIGRvZXMsIGFuZFxuICAgICAgICAgd2UgcHJlc2VydmUgY29tcGF0aWJpbGl0eSBpZiBwb3NzaWJsZVxuICAgICAgIC0gd2UgY291bGQgb25seSBzaWduYWwgdGhpcyBpc3N1ZSBieSBmYWlsaW5nIGF0IHJ1bnRpbWUsXG4gICAgICAgICB3aGljaCBpcyBub3QgdmVyeSBuaWNlLi4uICopXG4gICAgaWYgd2lkdGggPCAwIHRoZW4gTGVmdCBlbHNlIHBhZHR5IGluXG4gIGlmIHdpZHRoIDw9IGxlbiB0aGVuIHN0ciBlbHNlXG4gICAgbGV0IHJlcyA9IEJ5dGVzLm1ha2Ugd2lkdGggKGlmIHBhZHR5ID0gWmVyb3MgdGhlbiAnMCcgZWxzZSAnICcpIGluXG4gICAgYmVnaW4gbWF0Y2ggcGFkdHkgd2l0aFxuICAgIHwgTGVmdCAgLT4gU3RyaW5nLmJsaXQgc3RyIDAgcmVzIDAgbGVuXG4gICAgfCBSaWdodCAtPiBTdHJpbmcuYmxpdCBzdHIgMCByZXMgKHdpZHRoIC0gbGVuKSBsZW5cbiAgICB8IFplcm9zIHdoZW4gbGVuID4gMCAmJiAoc3RyLlswXSA9ICcrJyB8fCBzdHIuWzBdID0gJy0nIHx8IHN0ci5bMF0gPSAnICcpIC0+XG4gICAgICBCeXRlcy5zZXQgcmVzIDAgc3RyLlswXTtcbiAgICAgIFN0cmluZy5ibGl0IHN0ciAxIHJlcyAod2lkdGggLSBsZW4gKyAxKSAobGVuIC0gMSlcbiAgICB8IFplcm9zIHdoZW4gbGVuID4gMSAmJiBzdHIuWzBdID0gJzAnICYmIChzdHIuWzFdID0gJ3gnIHx8IHN0ci5bMV0gPSAnWCcpIC0+XG4gICAgICBCeXRlcy5zZXQgcmVzIDEgc3RyLlsxXTtcbiAgICAgIFN0cmluZy5ibGl0IHN0ciAyIHJlcyAod2lkdGggLSBsZW4gKyAyKSAobGVuIC0gMilcbiAgICB8IFplcm9zIC0+XG4gICAgICBTdHJpbmcuYmxpdCBzdHIgMCByZXMgKHdpZHRoIC0gbGVuKSBsZW5cbiAgICBlbmQ7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcblxuKCogQWRkICcwJyBwYWRkaW5nIHRvIGludCwgaW50MzIsIG5hdGl2ZWludCBvciBpbnQ2NCBzdHJpbmcgcmVwcmVzZW50YXRpb24uICopXG5sZXQgZml4X2ludF9wcmVjaXNpb24gcHJlYyBzdHIgPVxuICBsZXQgcHJlYyA9IGFicyBwcmVjIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICBtYXRjaCBzdHIuWzBdIHdpdGhcbiAgfCAoJysnIHwgJy0nIHwgJyAnKSBhcyBjIHdoZW4gcHJlYyArIDEgPiBsZW4gLT5cbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSAocHJlYyArIDEpICcwJyBpblxuICAgIEJ5dGVzLnNldCByZXMgMCBjO1xuICAgIFN0cmluZy5ibGl0IHN0ciAxIHJlcyAocHJlYyAtIGxlbiArIDIpIChsZW4gLSAxKTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuICB8ICcwJyB3aGVuIHByZWMgKyAyID4gbGVuICYmIGxlbiA+IDEgJiYgKHN0ci5bMV0gPSAneCcgfHwgc3RyLlsxXSA9ICdYJykgLT5cbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSAocHJlYyArIDIpICcwJyBpblxuICAgIEJ5dGVzLnNldCByZXMgMSBzdHIuWzFdO1xuICAgIFN0cmluZy5ibGl0IHN0ciAyIHJlcyAocHJlYyAtIGxlbiArIDQpIChsZW4gLSAyKTtcbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuICB8ICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB3aGVuIHByZWMgPiBsZW4gLT5cbiAgICBsZXQgcmVzID0gQnl0ZXMubWFrZSBwcmVjICcwJyBpblxuICAgIFN0cmluZy5ibGl0IHN0ciAwIHJlcyAocHJlYyAtIGxlbikgbGVuO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzXG4gIHwgXyAtPlxuICAgIHN0clxuXG4oKiBFc2NhcGUgYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBPQ2FtbCBsZXhpbmcgY29udmVudGlvbi4gKilcbmxldCBzdHJpbmdfdG9fY2FtbF9zdHJpbmcgc3RyID1cbiAgbGV0IHN0ciA9IFN0cmluZy5lc2NhcGVkIHN0ciBpblxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIGxldCByZXMgPSBCeXRlcy5tYWtlIChsICsgMikgJ1xcXCInIGluXG4gIFN0cmluZy51bnNhZmVfYmxpdCBzdHIgMCByZXMgMSBsO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIHJlc1xuXG4oKiBHZW5lcmF0ZSB0aGUgZm9ybWF0X2ludC9pbnQzMi9uYXRpdmVpbnQvaW50NjQgZmlyc3QgYXJndW1lbnRcbiAgIGZyb20gYW4gaW50X2NvbnYuICopXG5sZXQgZm9ybWF0X29mX2ljb252ID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVkXCIgfCBJbnRfcGQgLT4gXCIlK2RcIiB8IEludF9zZCAtPiBcIiUgZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlaVwiIHwgSW50X3BpIC0+IFwiJStpXCIgfCBJbnRfc2kgLT4gXCIlIGlcIlxuICB8IEludF94IC0+IFwiJXhcIiB8IEludF9DeCAtPiBcIiUjeFwiXG4gIHwgSW50X1ggLT4gXCIlWFwiIHwgSW50X0NYIC0+IFwiJSNYXCJcbiAgfCBJbnRfbyAtPiBcIiVvXCIgfCBJbnRfQ28gLT4gXCIlI29cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJXVcIlxuXG5sZXQgZm9ybWF0X29mX2ljb252TCA9IGZ1bmN0aW9uXG4gIHwgSW50X2QgfCBJbnRfQ2QgLT4gXCIlTGRcIiB8IEludF9wZCAtPiBcIiUrTGRcIiB8IEludF9zZCAtPiBcIiUgTGRcIlxuICB8IEludF9pIHwgSW50X0NpIC0+IFwiJUxpXCIgfCBJbnRfcGkgLT4gXCIlK0xpXCIgfCBJbnRfc2kgLT4gXCIlIExpXCJcbiAgfCBJbnRfeCAtPiBcIiVMeFwiIHwgSW50X0N4IC0+IFwiJSNMeFwiXG4gIHwgSW50X1ggLT4gXCIlTFhcIiB8IEludF9DWCAtPiBcIiUjTFhcIlxuICB8IEludF9vIC0+IFwiJUxvXCIgfCBJbnRfQ28gLT4gXCIlI0xvXCJcbiAgfCBJbnRfdSB8IEludF9DdSAtPiBcIiVMdVwiXG5cbmxldCBmb3JtYXRfb2ZfaWNvbnZsID0gZnVuY3Rpb25cbiAgfCBJbnRfZCB8IEludF9DZCAtPiBcIiVsZFwiIHwgSW50X3BkIC0+IFwiJStsZFwiIHwgSW50X3NkIC0+IFwiJSBsZFwiXG4gIHwgSW50X2kgfCBJbnRfQ2kgLT4gXCIlbGlcIiB8IEludF9waSAtPiBcIiUrbGlcIiB8IEludF9zaSAtPiBcIiUgbGlcIlxuICB8IEludF94IC0+IFwiJWx4XCIgfCBJbnRfQ3ggLT4gXCIlI2x4XCJcbiAgfCBJbnRfWCAtPiBcIiVsWFwiIHwgSW50X0NYIC0+IFwiJSNsWFwiXG4gIHwgSW50X28gLT4gXCIlbG9cIiB8IEludF9DbyAtPiBcIiUjbG9cIlxuICB8IEludF91IHwgSW50X0N1IC0+IFwiJWx1XCJcblxubGV0IGZvcm1hdF9vZl9pY29udm4gPSBmdW5jdGlvblxuICB8IEludF9kIHwgSW50X0NkIC0+IFwiJW5kXCIgfCBJbnRfcGQgLT4gXCIlK25kXCIgfCBJbnRfc2QgLT4gXCIlIG5kXCJcbiAgfCBJbnRfaSB8IEludF9DaSAtPiBcIiVuaVwiIHwgSW50X3BpIC0+IFwiJStuaVwiIHwgSW50X3NpIC0+IFwiJSBuaVwiXG4gIHwgSW50X3ggLT4gXCIlbnhcIiB8IEludF9DeCAtPiBcIiUjbnhcIlxuICB8IEludF9YIC0+IFwiJW5YXCIgfCBJbnRfQ1ggLT4gXCIlI25YXCJcbiAgfCBJbnRfbyAtPiBcIiVub1wiIHwgSW50X0NvIC0+IFwiJSNub1wiXG4gIHwgSW50X3UgfCBJbnRfQ3UgLT4gXCIlbnVcIlxuXG4oKiBHZW5lcmF0ZSB0aGUgZm9ybWF0X2Zsb2F0IGZpcnN0IGFyZ3VtZW50IGZyb20gYSBmbG9hdF9jb252LiAqKVxubGV0IGZvcm1hdF9vZl9mY29udiBmY29udiBwcmVjID1cbiAgICBsZXQgcHJlYyA9IGFicyBwcmVjIGluXG4gICAgbGV0IHN5bWIgPSBjaGFyX29mX2Zjb252IH5jRjonZycgZmNvbnYgaW5cbiAgICBsZXQgYnVmID0gYnVmZmVyX2NyZWF0ZSAxNiBpblxuICAgIGJ1ZmZlcl9hZGRfY2hhciBidWYgJyUnO1xuICAgIGJwcmludF9mY29udl9mbGFnIGJ1ZiBmY29udjtcbiAgICBidWZmZXJfYWRkX2NoYXIgYnVmICcuJztcbiAgICBidWZmZXJfYWRkX3N0cmluZyBidWYgKEludC50b19zdHJpbmcgcHJlYyk7XG4gICAgYnVmZmVyX2FkZF9jaGFyIGJ1ZiBzeW1iO1xuICAgIGJ1ZmZlcl9jb250ZW50cyBidWZcblxubGV0IHRyYW5zZm9ybV9pbnRfYWx0IGljb252IHMgPVxuICBtYXRjaCBpY29udiB3aXRoXG4gIHwgSW50X0NkIHwgSW50X0NpIHwgSW50X0N1IC0+XG4gICAgbGV0IGRpZ2l0cyA9XG4gICAgICBsZXQgbiA9IHJlZiAwIGluXG4gICAgICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzIC0gMSBkb1xuICAgICAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCBzIGkgd2l0aFxuICAgICAgICB8ICcwJy4uJzknIC0+IGluY3IgblxuICAgICAgICB8IF8gLT4gKClcbiAgICAgIGRvbmU7XG4gICAgICAhblxuICAgIGluXG4gICAgbGV0IGJ1ZiA9IEJ5dGVzLmNyZWF0ZSAoU3RyaW5nLmxlbmd0aCBzICsgKGRpZ2l0cyAtIDEpIC8gMykgaW5cbiAgICBsZXQgcG9zID0gcmVmIDAgaW5cbiAgICBsZXQgcHV0IGMgPSBCeXRlcy5zZXQgYnVmICFwb3MgYzsgaW5jciBwb3MgaW5cbiAgICBsZXQgbGVmdCA9IHJlZiAoKGRpZ2l0cyAtIDEpIG1vZCAzICsgMSkgaW5cbiAgICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzIC0gMSBkb1xuICAgICAgbWF0Y2ggU3RyaW5nLnVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgIHwgJzAnLi4nOScgYXMgYyAtPlxuICAgICAgICAgIGlmICFsZWZ0ID0gMCB0aGVuIChwdXQgJ18nOyBsZWZ0IDo9IDMpOyBkZWNyIGxlZnQ7IHB1dCBjXG4gICAgICB8IGMgLT4gcHV0IGNcbiAgICBkb25lO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmXG4gIHwgXyAtPiBzXG5cbigqIENvbnZlcnQgYW4gaW50ZWdlciB0byBhIHN0cmluZyBhY2NvcmRpbmcgdG8gYSBjb252ZXJzaW9uLiAqKVxubGV0IGNvbnZlcnRfaW50IGljb252IG4gPVxuICB0cmFuc2Zvcm1faW50X2FsdCBpY29udiAoZm9ybWF0X2ludCAoZm9ybWF0X29mX2ljb252IGljb252KSBuKVxubGV0IGNvbnZlcnRfaW50MzIgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50MzIgKGZvcm1hdF9vZl9pY29udmwgaWNvbnYpIG4pXG5sZXQgY29udmVydF9uYXRpdmVpbnQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfbmF0aXZlaW50IChmb3JtYXRfb2ZfaWNvbnZuIGljb252KSBuKVxubGV0IGNvbnZlcnRfaW50NjQgaWNvbnYgbiA9XG4gIHRyYW5zZm9ybV9pbnRfYWx0IGljb252IChmb3JtYXRfaW50NjQgKGZvcm1hdF9vZl9pY29udkwgaWNvbnYpIG4pXG5cbigqIENvbnZlcnQgYSBmbG9hdCB0byBzdHJpbmcuICopXG4oKiBGaXggc3BlY2lhbCBjYXNlIG9mIFwiT0NhbWwgZmxvYXQgZm9ybWF0XCIuICopXG5sZXQgY29udmVydF9mbG9hdCBmY29udiBwcmVjIHggPVxuICBsZXQgaGV4ICgpID1cbiAgICBsZXQgc2lnbiA9XG4gICAgICBtYXRjaCBmc3QgZmNvbnYgd2l0aFxuICAgICAgfCBGbG9hdF9mbGFnX3AgLT4gJysnXG4gICAgICB8IEZsb2F0X2ZsYWdfcyAtPiAnICdcbiAgICAgIHwgXyAtPiAnLScgaW5cbiAgICBoZXhzdHJpbmdfb2ZfZmxvYXQgeCBwcmVjIHNpZ24gaW5cbiAgbGV0IGFkZF9kb3RfaWZfbmVlZGVkIHN0ciA9XG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGV0IHJlYyBpc192YWxpZCBpID1cbiAgICAgIGlmIGkgPSBsZW4gdGhlbiBmYWxzZSBlbHNlXG4gICAgICAgIG1hdGNoIHN0ci5baV0gd2l0aFxuICAgICAgICB8ICcuJyB8ICdlJyB8ICdFJyAtPiB0cnVlXG4gICAgICAgIHwgXyAtPiBpc192YWxpZCAoaSArIDEpIGluXG4gICAgaWYgaXNfdmFsaWQgMCB0aGVuIHN0ciBlbHNlIHN0ciBeIFwiLlwiIGluXG4gIGxldCBjYW1sX3NwZWNpYWxfdmFsIHN0ciA9IG1hdGNoIGNsYXNzaWZ5X2Zsb2F0IHggd2l0aFxuICAgIHwgRlBfbm9ybWFsIHwgRlBfc3Vibm9ybWFsIHwgRlBfemVybyAtPiBzdHJcbiAgICB8IEZQX2luZmluaXRlIC0+IGlmIHggPCAwLjAgdGhlbiBcIm5lZ19pbmZpbml0eVwiIGVsc2UgXCJpbmZpbml0eVwiXG4gICAgfCBGUF9uYW4gLT4gXCJuYW5cIiBpblxuICBtYXRjaCBzbmQgZmNvbnYgd2l0aFxuICB8IEZsb2F0X2ggLT4gaGV4ICgpXG4gIHwgRmxvYXRfSCAtPiBTdHJpbmcudXBwZXJjYXNlX2FzY2lpIChoZXggKCkpXG4gIHwgRmxvYXRfQ0YgLT4gY2FtbF9zcGVjaWFsX3ZhbCAoaGV4ICgpKVxuICB8IEZsb2F0X0YgLT5cbiAgICBsZXQgc3RyID0gZm9ybWF0X2Zsb2F0IChmb3JtYXRfb2ZfZmNvbnYgZmNvbnYgcHJlYykgeCBpblxuICAgIGNhbWxfc3BlY2lhbF92YWwgKGFkZF9kb3RfaWZfbmVlZGVkIHN0cilcbiAgfCBGbG9hdF9mIHwgRmxvYXRfZSB8IEZsb2F0X0UgfCBGbG9hdF9nIHwgRmxvYXRfRyAtPlxuICAgIGZvcm1hdF9mbG9hdCAoZm9ybWF0X29mX2Zjb252IGZjb252IHByZWMpIHhcblxuKCogQ29udmVydCBhIGNoYXIgdG8gYSBzdHJpbmcgYWNjb3JkaW5nIHRvIHRoZSBPQ2FtbCBsZXhpY2FsIGNvbnZlbnRpb24uICopXG5sZXQgZm9ybWF0X2NhbWxfY2hhciBjID1cbiAgbGV0IHN0ciA9IENoYXIuZXNjYXBlZCBjIGluXG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzdHIgaW5cbiAgbGV0IHJlcyA9IEJ5dGVzLm1ha2UgKGwgKyAyKSAnXFwnJyBpblxuICBTdHJpbmcudW5zYWZlX2JsaXQgc3RyIDAgcmVzIDEgbDtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcblxuKCogQ29udmVydCBhIGZvcm1hdCB0eXBlIHRvIHN0cmluZyAqKVxubGV0IHN0cmluZ19vZl9mbXR0eSBmbXR0eSA9XG4gIGxldCBidWYgPSBidWZmZXJfY3JlYXRlIDE2IGluXG4gIGJwcmludF9mbXR0eSBidWYgZm10dHk7XG4gIGJ1ZmZlcl9jb250ZW50cyBidWZcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICgqIEdlbmVyaWMgcHJpbnRpbmcgZnVuY3Rpb24gKilcblxuKCogTWFrZSBhIGdlbmVyaWMgcHJpbnRpbmcgZnVuY3Rpb24uICopXG4oKiBVc2VkIHRvIGdlbmVyYXRlIFByaW50ZiBhbmQgRm9ybWF0IHByaW50aW5nIGZ1bmN0aW9ucy4gKilcbigqIFBhcmFtZXRlcnM6XG4gICAgIGs6IGEgY29udGludWF0aW9uIGZpbmFsbHkgYXBwbGllZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgdGhlIGFjY3VtdWxhdG9yLlxuICAgICBvOiB0aGUgb3V0cHV0IHN0cmVhbSAoc2VlIGssICVhIGFuZCAldCkuXG4gICAgIGFjYzogcmV2IGxpc3Qgb2YgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1c2gsIGZvcm1hdHRpbmcsIC4uLikuXG4gICAgIGZtdDogdGhlIGZvcm1hdC4gKilcbmxldCByZWMgbWFrZV9wcmludGYgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiBhID1cbmZ1biBrIGFjYyBmbXQgLT4gbWF0Y2ggZm10IHdpdGhcbiAgfCBDaGFyIHJlc3QgLT5cbiAgICBmdW4gYyAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9jaGFyIChhY2MsIGMpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgcmVzdFxuICB8IENhbWxfY2hhciByZXN0IC0+XG4gICAgZnVuIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfc3RyaW5nIChhY2MsIGZvcm1hdF9jYW1sX2NoYXIgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbWFrZV9wYWRkaW5nIGsgYWNjIHJlc3QgcGFkIChmdW4gc3RyIC0+IHN0cilcbiAgfCBDYW1sX3N0cmluZyAocGFkLCByZXN0KSAtPlxuICAgIG1ha2VfcGFkZGluZyBrIGFjYyByZXN0IHBhZCBzdHJpbmdfdG9fY2FtbF9zdHJpbmdcbiAgfCBJbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludCBpY29udlxuICB8IEludDMyIChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIG1ha2VfaW50X3BhZGRpbmdfcHJlY2lzaW9uIGsgYWNjIHJlc3QgcGFkIHByZWMgY29udmVydF9pbnQzMiBpY29udlxuICB8IE5hdGl2ZWludCAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBtYWtlX2ludF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGNvbnZlcnRfbmF0aXZlaW50IGljb252XG4gIHwgSW50NjQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gayBhY2MgcmVzdCBwYWQgcHJlYyBjb252ZXJ0X2ludDY0IGljb252XG4gIHwgRmxvYXQgKGZjb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbWFrZV9mbG9hdF9wYWRkaW5nX3ByZWNpc2lvbiBrIGFjYyByZXN0IHBhZCBwcmVjIGZjb252XG4gIHwgQm9vbCAocGFkLCByZXN0KSAtPlxuICAgIG1ha2VfcGFkZGluZyBrIGFjYyByZXN0IHBhZCBzdHJpbmdfb2ZfYm9vbFxuICB8IEFscGhhIHJlc3QgLT5cbiAgICBmdW4gZiB4IC0+IG1ha2VfcHJpbnRmIGsgKEFjY19kZWxheSAoYWNjLCBmdW4gbyAtPiBmIG8geCkpIHJlc3RcbiAgfCBUaGV0YSByZXN0IC0+XG4gICAgZnVuIGYgLT4gbWFrZV9wcmludGYgayAoQWNjX2RlbGF5IChhY2MsIGYpKSByZXN0XG4gIHwgQ3VzdG9tIChhcml0eSwgZiwgcmVzdCkgLT5cbiAgICBtYWtlX2N1c3RvbSBrIGFjYyByZXN0IGFyaXR5IChmICgpKVxuICB8IFJlYWRlciBfIC0+XG4gICAgKCogVGhpcyBjYXNlIGlzIGltcG9zc2libGUsIGJ5IHR5cGluZyBvZiBmb3JtYXRzLiAqKVxuICAgICgqIEluZGVlZCwgc2luY2UgcHJpbnRmIGFuZCBjby4gdGFrZSBhIGZvcm1hdDQgYXMgYXJndW1lbnQsIHRoZSAnZCBhbmQgJ2VcbiAgICAgICB0eXBlIHBhcmFtZXRlcnMgb2YgZm10IGFyZSBvYnZpb3VzbHkgZXF1YWxzLiBUaGUgUmVhZGVyIGlzIHRoZVxuICAgICAgIG9ubHkgY29uc3RydWN0b3Igd2hpY2ggdG91Y2ggJ2QgYW5kICdlIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgZm9ybWF0XG4gICAgICAgdHlwZSwgaXQgYWRkcyBhbiAoLT4pIHRvIHRoZSAnZCBwYXJhbWV0ZXJzLiBDb25zZXF1ZW50bHksIGEgZm9ybWF0NFxuICAgICAgIGNhbm5vdCBjb250YWluIGEgUmVhZGVyIG5vZGUsIGV4Y2VwdCBpbiB0aGUgc3ViLWZvcm1hdCBhc3NvY2lhdGVkIHRvXG4gICAgICAgYW4gJXsuLi4lfS4gSXQncyBub3QgYSBwcm9ibGVtIGJlY2F1c2UgbWFrZV9wcmludGYgZG8gbm90IGNhbGxcbiAgICAgICBpdHNlbGYgcmVjdXJzaXZlbHkgb24gdGhlIHN1Yi1mb3JtYXQgYXNzb2NpYXRlZCB0byAley4uLiV9LiAqKVxuICAgIGFzc2VydCBmYWxzZVxuICB8IEZsdXNoIHJlc3QgLT5cbiAgICBtYWtlX3ByaW50ZiBrIChBY2NfZmx1c2ggYWNjKSByZXN0XG5cbiAgfCBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSAtPlxuICAgIG1ha2VfcHJpbnRmIGsgKEFjY19zdHJpbmdfbGl0ZXJhbCAoYWNjLCBzdHIpKSByZXN0XG4gIHwgQ2hhcl9saXRlcmFsIChjaHIsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX2NoYXJfbGl0ZXJhbCAoYWNjLCBjaHIpKSByZXN0XG5cbiAgfCBGb3JtYXRfYXJnIChfLCBzdWJfZm10dHksIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gc3RyaW5nX29mX2ZtdHR5IHN1Yl9mbXR0eSBpblxuICAgIChmdW4gc3RyIC0+XG4gICAgICBpZ25vcmUgc3RyO1xuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHR5KSkgcmVzdClcbiAgfCBGb3JtYXRfc3Vic3QgKF8sIGZtdHR5LCByZXN0KSAtPlxuICAgIGZ1biAoRm9ybWF0IChmbXQsIF8pKSAtPiBtYWtlX3ByaW50ZiBrIGFjY1xuICAgICAgKGNvbmNhdF9mbXQgKHJlY2FzdCBmbXQgZm10dHkpIHJlc3QpXG5cbiAgfCBTY2FuX2NoYXJfc2V0IChfLCBfLCByZXN0KSAtPlxuICAgIGxldCBuZXdfYWNjID0gQWNjX2ludmFsaWRfYXJnIChhY2MsIFwiUHJpbnRmOiBiYWQgY29udmVyc2lvbiAlW1wiKSBpblxuICAgIGZ1biBfIC0+IG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgLT5cbiAgICAoKiBUaGlzIGNhc2Ugc2hvdWxkIGJlIHJlZnVzZWQgZm9yIFByaW50Zi4gKilcbiAgICAoKiBBY2NlcHRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gKilcbiAgICAoKiBJbnRlcnByZXQgJWwsICVuIGFuZCAlTCBhcyAldS4gKilcbiAgICBmdW4gbiAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZm9ybWF0X2ludCBcIiV1XCIgbikgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgU2Nhbl9uZXh0X2NoYXIgcmVzdCAtPlxuICAgIGZ1biBjIC0+XG4gICAgICBsZXQgbmV3X2FjYyA9IEFjY19kYXRhX2NoYXIgKGFjYywgYykgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgbmV3X2FjYyByZXN0XG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgIG1ha2VfaWdub3JlZF9wYXJhbSBrIGFjYyBpZ24gcmVzdFxuXG4gIHwgRm9ybWF0dGluZ19saXQgKGZtdGluZ19saXQsIHJlc3QpIC0+XG4gICAgbWFrZV9wcmludGYgayAoQWNjX2Zvcm1hdHRpbmdfbGl0IChhY2MsIGZtdGluZ19saXQpKSByZXN0XG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICBsZXQgaycga2FjYyA9XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19nZW4gKGFjYywgQWNjX29wZW5fdGFnIGthY2MpKSByZXN0IGluXG4gICAgbWFrZV9wcmludGYgaycgRW5kX29mX2FjYyBmbXQnXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICBsZXQgaycga2FjYyA9XG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZm9ybWF0dGluZ19nZW4gKGFjYywgQWNjX29wZW5fYm94IGthY2MpKSByZXN0IGluXG4gICAgbWFrZV9wcmludGYgaycgRW5kX29mX2FjYyBmbXQnXG5cbiAgfCBFbmRfb2ZfZm9ybWF0IC0+XG4gICAgayBhY2NcblxuKCogRGVsYXkgdGhlIGVycm9yIChJbnZhbGlkX2FyZ3VtZW50IFwiUHJpbnRmOiBiYWQgY29udmVyc2lvbiAlX1wiKS4gKilcbigqIEdlbmVyYXRlIGZ1bmN0aW9ucyB0byB0YWtlIHJlbWFpbmluZyBhcmd1bWVudHMgKGFmdGVyIHRoZSBcIiVfXCIpLiAqKVxuYW5kIG1ha2VfaWdub3JlZF9wYXJhbSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIHksIHgpIGlnbm9yZWQgLT5cbiAgICAoeCwgYiwgYywgeSwgZSwgZikgZm10IC0+IGEgPVxuZnVuIGsgYWNjIGlnbiBmbXQgLT4gbWF0Y2ggaWduIHdpdGhcbiAgfCBJZ25vcmVkX2NoYXIgICAgICAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9jYW1sX2NoYXIgICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc3RyaW5nIF8gICAgICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIF8gICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQgKF8sIF8pICAgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfaW50MzIgKF8sIF8pICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX25hdGl2ZWludCAoXywgXykgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9pbnQ2NCAoXywgXykgICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfZmxvYXQgKF8sIF8pICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX2Jvb2wgXyAgICAgICAgICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG4gIHwgSWdub3JlZF9mb3JtYXRfYXJnIF8gICAgICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfZm9ybWF0X3N1YnN0IChfLCBmbXR0eSkgLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIGZtdHR5IGZtdFxuICB8IElnbm9yZWRfcmVhZGVyICAgICAgICAgICAgICAgICAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgSWdub3JlZF9zY2FuX2NoYXJfc2V0IF8gICAgICAgICAtPiBtYWtlX2ludmFsaWRfYXJnIGsgYWNjIGZtdFxuICB8IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBfICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyICAgICAgICAgIC0+IG1ha2VfaW52YWxpZF9hcmcgayBhY2MgZm10XG5cblxuKCogU3BlY2lhbCBjYXNlIG9mIHByaW50ZiBcIiVfKFwiLiAqKVxuYW5kIG1ha2VfZnJvbV9mbXR0eSA6IHR5cGUgeCB5IGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIHksIHgpIGZtdHR5IC0+XG4gICAgKHgsIGIsIGMsIHksIGUsIGYpIGZtdCAtPiBhID1cbmZ1biBrIGFjYyBmbXR0eSBmbXQgLT4gbWF0Y2ggZm10dHkgd2l0aFxuICB8IENoYXJfdHkgcmVzdCAgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IFN0cmluZ190eSByZXN0ICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEludF90eSByZXN0ICAgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEludDMyX3R5IHJlc3QgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IE5hdGl2ZWludF90eSByZXN0ICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEludDY0X3R5IHJlc3QgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEZsb2F0X3R5IHJlc3QgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEJvb2xfdHkgcmVzdCAgICAgICAgICAgIC0+IGZ1biBfIC0+IG1ha2VfZnJvbV9mbXR0eSBrIGFjYyByZXN0IGZtdFxuICB8IEFscGhhX3R5IHJlc3QgICAgICAgICAgIC0+IGZ1biBfIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgVGhldGFfdHkgcmVzdCAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgQW55X3R5IHJlc3QgICAgICAgICAgICAgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgUmVhZGVyX3R5IF8gICAgICAgICAgICAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgXyAgICAgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgRm9ybWF0X2FyZ190eSAoXywgcmVzdCkgLT4gZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIHJlc3QgZm10XG4gIHwgRW5kX29mX2ZtdHR5ICAgICAgICAgICAgLT4gbWFrZV9pbnZhbGlkX2FyZyBrIGFjYyBmbXRcbiAgfCBGb3JtYXRfc3Vic3RfdHkgKHR5MSwgdHkyLCByZXN0KSAtPlxuICAgIGxldCB0eSA9IHRyYW5zIChzeW1tIHR5MSkgdHkyIGluXG4gICAgZnVuIF8gLT4gbWFrZV9mcm9tX2ZtdHR5IGsgYWNjIChjb25jYXRfZm10dHkgdHkgcmVzdCkgZm10XG5cbigqIEluc2VydCBhbiBBY2NfaW52YWxpZF9hcmcgaW4gdGhlIGFjY3VtdWxhdG9yIGFuZCBjb250aW51ZSB0byBnZW5lcmF0ZVxuICAgY2xvc3VyZXMgdG8gZ2V0IHRoZSByZW1haW5pbmcgYXJndW1lbnRzLiAqKVxuYW5kIG1ha2VfaW52YWxpZF9hcmcgOiB0eXBlIGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiBhID1cbmZ1biBrIGFjYyBmbXQgLT5cbiAgbWFrZV9wcmludGYgayAoQWNjX2ludmFsaWRfYXJnIChhY2MsIFwiUHJpbnRmOiBiYWQgY29udmVyc2lvbiAlX1wiKSkgZm10XG5cbigqIEZpeCBwYWRkaW5nLCB0YWtlIGl0IGFzIGFuIGV4dHJhIGludGVnZXIgYXJndW1lbnQgaWYgbmVlZGVkLiAqKVxuYW5kIG1ha2VfcGFkZGluZyA6IHR5cGUgeCB6IGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgICh4LCB6IC0+IGEpIHBhZGRpbmcgLT4gKHogLT4gc3RyaW5nKSAtPiB4ID1cbiAgZnVuIGsgYWNjIGZtdCBwYWQgdHJhbnMgLT4gbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBuZXdfYWNjID0gQWNjX2RhdGFfc3RyaW5nIChhY2MsIHRyYW5zIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3aWR0aCkgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZml4X3BhZGRpbmcgcGFkdHkgd2lkdGggKHRyYW5zIHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayBuZXdfYWNjIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5IC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IG5ld19hY2MgPSBBY2NfZGF0YV9zdHJpbmcgKGFjYywgZml4X3BhZGRpbmcgcGFkdHkgdyAodHJhbnMgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIG5ld19hY2MgZm10XG5cbigqIEZpeCBwYWRkaW5nIGFuZCBwcmVjaXNpb24gZm9yIGludCwgaW50MzIsIG5hdGl2ZWludCBvciBpbnQ2NC4gKilcbigqIFRha2Ugb25lIG9yIHR3byBleHRyYSBpbnRlZ2VyIGFyZ3VtZW50cyBpZiBuZWVkZWQuICopXG5hbmQgbWFrZV9pbnRfcGFkZGluZ19wcmVjaXNpb24gOiB0eXBlIHggeSB6IGEgYiBjIGQgZSBmIC5cbiAgICAoKGIsIGMpIGFjYyAtPiBmKSAtPiAoYiwgYykgYWNjIC0+XG4gICAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAgICh4LCB5KSBwYWRkaW5nIC0+ICh5LCB6IC0+IGEpIHByZWNpc2lvbiAtPiAoaW50X2NvbnYgLT4geiAtPiBzdHJpbmcpIC0+XG4gICAgaW50X2NvbnYgLT4geCA9XG4gIGZ1biBrIGFjYyBmbXQgcGFkIHByZWMgdHJhbnMgaWNvbnYgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgfCBOb19wYWRkaW5nLCBOb19wcmVjaXNpb24gLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IHRyYW5zIGljb252IHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTm9fcGFkZGluZywgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGZ1biBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAodHJhbnMgaWNvbnYgeCkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGZpeF9pbnRfcHJlY2lzaW9uIHAgKHRyYW5zIGljb252IHgpKSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3ICh0cmFucyBpY29udiB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4gdyB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoZml4X2ludF9wcmVjaXNpb24gcCAodHJhbnMgaWNvbnYgeCkpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gdyBwIHggLT5cbiAgICAgIGxldCBzdHIgPSBmaXhfcGFkZGluZyBwYWR0eSB3IChmaXhfaW50X3ByZWNpc2lvbiBwICh0cmFucyBpY29udiB4KSkgaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcblxuKCogQ29udmVydCBhIGZsb2F0LCBmaXggcGFkZGluZyBhbmQgcHJlY2lzaW9uIGlmIG5lZWRlZC4gKilcbigqIFRha2UgdGhlIGZsb2F0IGFyZ3VtZW50IGFuZCBvbmUgb3IgdHdvIGV4dHJhIGludGVnZXIgYXJndW1lbnRzIGlmIG5lZWRlZC4gKilcbmFuZCBtYWtlX2Zsb2F0X3BhZGRpbmdfcHJlY2lzaW9uIDogdHlwZSB4IHkgYSBiIGMgZCBlIGYgLlxuICAgICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgICAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHksIGZsb2F0IC0+IGEpIHByZWNpc2lvbiAtPiBmbG9hdF9jb252IC0+IHggPVxuICBmdW4gayBhY2MgZm10IHBhZCBwcmVjIGZjb252IC0+IG1hdGNoIHBhZCwgcHJlYyB3aXRoXG4gIHwgTm9fcGFkZGluZywgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IChkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiBmY29udikgeCBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGZ1biB4IC0+XG4gICAgICBsZXQgc3RyID0gY29udmVydF9mbG9hdCBmY29udiBwIHggaW5cbiAgICAgIG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBzdHIpKSBmbXRcbiAgfCBOb19wYWRkaW5nLCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHAgeCAtPlxuICAgICAgbGV0IHN0ciA9IGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4IGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgTGl0X3BhZGRpbmcgKHBhZHR5LCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgZnVuIHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IChkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiBmY29udikgeCBpblxuICAgICAgbGV0IHN0cicgPSBmaXhfcGFkZGluZyBwYWR0eSB3IHN0ciBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cicpKSBmbXRcbiAgfCBMaXRfcGFkZGluZyAocGFkdHksIHcpLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBmdW4geCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IExpdF9wYWRkaW5nIChwYWR0eSwgdyksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBmdW4gcCB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG4gIHwgQXJnX3BhZGRpbmcgcGFkdHksIE5vX3ByZWNpc2lvbiAtPlxuICAgIGZ1biB3IHggLT5cbiAgICAgIGxldCBzdHIgPSBjb252ZXJ0X2Zsb2F0IGZjb252IChkZWZhdWx0X2Zsb2F0X3ByZWNpc2lvbiBmY29udikgeCBpblxuICAgICAgbGV0IHN0cicgPSBmaXhfcGFkZGluZyBwYWR0eSB3IHN0ciBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cicpKSBmbXRcbiAgfCBBcmdfcGFkZGluZyBwYWR0eSwgTGl0X3ByZWNpc2lvbiBwIC0+XG4gICAgZnVuIHcgeCAtPlxuICAgICAgbGV0IHN0ciA9IGZpeF9wYWRkaW5nIHBhZHR5IHcgKGNvbnZlcnRfZmxvYXQgZmNvbnYgcCB4KSBpblxuICAgICAgbWFrZV9wcmludGYgayAoQWNjX2RhdGFfc3RyaW5nIChhY2MsIHN0cikpIGZtdFxuICB8IEFyZ19wYWRkaW5nIHBhZHR5LCBBcmdfcHJlY2lzaW9uIC0+XG4gICAgZnVuIHcgcCB4IC0+XG4gICAgICBsZXQgc3RyID0gZml4X3BhZGRpbmcgcGFkdHkgdyAoY29udmVydF9mbG9hdCBmY29udiBwIHgpIGluXG4gICAgICBtYWtlX3ByaW50ZiBrIChBY2NfZGF0YV9zdHJpbmcgKGFjYywgc3RyKSkgZm10XG5hbmQgbWFrZV9jdXN0b20gOiB0eXBlIHggeSBhIGIgYyBkIGUgZiAuXG4gICgoYiwgYykgYWNjIC0+IGYpIC0+IChiLCBjKSBhY2MgLT5cbiAgKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPlxuICAoYSwgeCwgeSkgY3VzdG9tX2FyaXR5IC0+IHggLT4geSA9XG4gIGZ1biBrIGFjYyByZXN0IGFyaXR5IGYgLT4gbWF0Y2ggYXJpdHkgd2l0aFxuICB8IEN1c3RvbV96ZXJvIC0+IG1ha2VfcHJpbnRmIGsgKEFjY19kYXRhX3N0cmluZyAoYWNjLCBmKSkgcmVzdFxuICB8IEN1c3RvbV9zdWNjIGFyaXR5IC0+XG4gICAgZnVuIHggLT5cbiAgICAgIG1ha2VfY3VzdG9tIGsgYWNjIHJlc3QgYXJpdHkgKGYgeClcblxubGV0IGNvbnN0IHggXyA9IHhcblxubGV0IHJlYyBtYWtlX2lwcmludGYgOiB0eXBlIGEgYiBjIGQgZSBmIHN0YXRlLlxuICAoc3RhdGUgLT4gZikgLT4gc3RhdGUgLT4gKGEsIGIsIGMsIGQsIGUsIGYpIGZtdCAtPiBhID1cbiAgZnVuIGsgbyBmbXQgLT4gbWF0Y2ggZm10IHdpdGhcbiAgICB8IENoYXIgcmVzdCAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KVxuICAgIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFN0cmluZyAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFN0cmluZyAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFN0cmluZyAoQXJnX3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpKVxuICAgIHwgQ2FtbF9zdHJpbmcgKE5vX3BhZGRpbmcsIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBDYW1sX3N0cmluZyAoTGl0X3BhZGRpbmcgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IENhbWxfc3RyaW5nIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBJbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEludDMyIChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBOYXRpdmVpbnQgKF8sIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICAgICAgZm5fb2ZfcGFkZGluZ19wcmVjaXNpb24gayBvIHJlc3QgcGFkIHByZWNcbiAgICB8IEludDY0IChfLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX3BhZGRpbmdfcHJlY2lzaW9uIGsgbyByZXN0IHBhZCBwcmVjXG4gICAgfCBGbG9hdCAoXywgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgICAgICBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiBrIG8gcmVzdCBwYWQgcHJlY1xuICAgIHwgQm9vbCAoTm9fcGFkZGluZywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEJvb2wgKExpdF9wYWRkaW5nIF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBCb29sIChBcmdfcGFkZGluZyBfLCByZXN0KSAtPlxuICAgICAgICBjb25zdCAoY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdCkpXG4gICAgfCBBbHBoYSByZXN0IC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyByZXN0KSlcbiAgICB8IFRoZXRhIHJlc3QgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEN1c3RvbSAoYXJpdHksIF8sIHJlc3QpIC0+XG4gICAgICAgIGZuX29mX2N1c3RvbV9hcml0eSBrIG8gcmVzdCBhcml0eVxuICAgIHwgUmVhZGVyIF8gLT5cbiAgICAgICAgKCogVGhpcyBjYXNlIGlzIGltcG9zc2libGUsIGJ5IHR5cGluZyBvZiBmb3JtYXRzLiAgU2VlIHRoZVxuICAgICAgICAgICBub3RlIGluIHRoZSBjb3JyZXNwb25kaW5nIGNhc2UgZm9yIG1ha2VfcHJpbnRmLiAqKVxuICAgICAgICBhc3NlcnQgZmFsc2VcbiAgICB8IEZsdXNoIHJlc3QgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBTdHJpbmdfbGl0ZXJhbCAoXywgcmVzdCkgLT5cbiAgICAgICAgbWFrZV9pcHJpbnRmIGsgbyByZXN0XG4gICAgfCBDaGFyX2xpdGVyYWwgKF8sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gcmVzdFxuICAgIHwgRm9ybWF0X2FyZyAoXywgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IEZvcm1hdF9zdWJzdCAoXywgZm10dHksIHJlc3QpIC0+XG4gICAgICAgIGZ1biAoRm9ybWF0IChmbXQsIF8pKSAtPlxuICAgICAgICAgIG1ha2VfaXByaW50ZiBrIG9cbiAgICAgICAgICAgIChjb25jYXRfZm10IChyZWNhc3QgZm10IGZtdHR5KSByZXN0KVxuICAgIHwgU2Nhbl9jaGFyX3NldCAoXywgXywgcmVzdCkgLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gcmVzdClcbiAgICB8IFNjYW5fZ2V0X2NvdW50ZXIgKF8sIHJlc3QpIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBTY2FuX25leHRfY2hhciByZXN0IC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIHJlc3QpXG4gICAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaWdub3JlZF9wYXJhbSAoZnVuIF8gLT4gayBvKSAoRW5kX29mX2FjYykgaWduIHJlc3RcbiAgICB8IEZvcm1hdHRpbmdfbGl0IChfLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgayBvIHJlc3RcbiAgICB8IEZvcm1hdHRpbmdfZ2VuIChPcGVuX3RhZyAoRm9ybWF0IChmbXQnLCBfKSksIHJlc3QpIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiAoZnVuIGtvYyAtPiBtYWtlX2lwcmludGYgayBrb2MgcmVzdCkgbyBmbXQnXG4gICAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgICAgICBtYWtlX2lwcmludGYgKGZ1biBrb2MgLT4gbWFrZV9pcHJpbnRmIGsga29jIHJlc3QpIG8gZm10J1xuICAgIHwgRW5kX29mX2Zvcm1hdCAtPlxuICAgICAgICBrIG9cbmFuZCBmbl9vZl9wYWRkaW5nX3ByZWNpc2lvbiA6XG4gIHR5cGUgeCB5IHogYSBiIGMgZCBlIGYgc3RhdGUuXG4gIChzdGF0ZSAtPiBmKSAtPiBzdGF0ZSAtPiAoYSwgYiwgYywgZCwgZSwgZikgZm10IC0+XG4gICh4LCB5KSBwYWRkaW5nIC0+ICh5LCB6IC0+IGEpIHByZWNpc2lvbiAtPiB4ID1cbiAgZnVuIGsgbyBmbXQgcGFkIHByZWMgLT4gbWF0Y2ggcGFkLCBwcmVjIHdpdGhcbiAgICB8IE5vX3BhZGRpbmcgICAsIE5vX3ByZWNpc2lvbiAgICAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBOb19wYWRkaW5nICAgLCBMaXRfcHJlY2lzaW9uIF8gLT5cbiAgICAgICAgY29uc3QgKG1ha2VfaXByaW50ZiBrIG8gZm10KVxuICAgIHwgTm9fcGFkZGluZyAgICwgQXJnX3ByZWNpc2lvbiAgIC0+XG4gICAgICAgIGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpKVxuICAgIHwgTGl0X3BhZGRpbmcgXywgTm9fcHJlY2lzaW9uICAgIC0+XG4gICAgICAgIGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdClcbiAgICB8IExpdF9wYWRkaW5nIF8sIExpdF9wcmVjaXNpb24gXyAtPlxuICAgICAgICBjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpXG4gICAgfCBMaXRfcGFkZGluZyBfLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBBcmdfcGFkZGluZyBfLCBOb19wcmVjaXNpb24gICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBBcmdfcGFkZGluZyBfLCBMaXRfcHJlY2lzaW9uIF8gLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChtYWtlX2lwcmludGYgayBvIGZtdCkpXG4gICAgfCBBcmdfcGFkZGluZyBfLCBBcmdfcHJlY2lzaW9uICAgLT5cbiAgICAgICAgY29uc3QgKGNvbnN0IChjb25zdCAobWFrZV9pcHJpbnRmIGsgbyBmbXQpKSlcbmFuZCBmbl9vZl9jdXN0b21fYXJpdHkgOiB0eXBlIHggeSBhIGIgYyBkIGUgZiBzdGF0ZS5cbiAgKHN0YXRlIC0+IGYpIC0+XG4gIHN0YXRlIC0+IChhLCBiLCBjLCBkLCBlLCBmKSBmbXQgLT4gKGEsIHgsIHkpIGN1c3RvbV9hcml0eSAtPiB5ID1cbiAgZnVuIGsgbyBmbXQgLT4gZnVuY3Rpb25cbiAgICB8IEN1c3RvbV96ZXJvIC0+XG4gICAgICAgIG1ha2VfaXByaW50ZiBrIG8gZm10XG4gICAgfCBDdXN0b21fc3VjYyBhcml0eSAtPlxuICAgICAgICBjb25zdCAoZm5fb2ZfY3VzdG9tX2FyaXR5IGsgbyBmbXQgYXJpdHkpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgqIENvbnRpbnVhdGlvbnMgZm9yIG1ha2VfcHJpbnRmICopXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYW4gb3V0cHV0X3N0cmVhbS4gKilcbigqIFVzZWQgYXMgYSBjb250aW51YXRpb24gb2YgbWFrZV9wcmludGYuICopXG5sZXQgcmVjIG91dHB1dF9hY2MgbyBhY2MgPSBtYXRjaCBhY2Mgd2l0aFxuICB8IEFjY19mb3JtYXR0aW5nX2xpdCAocCwgZm10aW5nX2xpdCkgLT5cbiAgICBsZXQgcyA9IHN0cmluZ19vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgb3V0cHV0X2FjYyBvIHA7IG91dHB1dF9zdHJpbmcgbyBzO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBvIHA7IG91dHB1dF9zdHJpbmcgbyBcIkB7XCI7IG91dHB1dF9hY2MgbyBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBvIHA7IG91dHB1dF9zdHJpbmcgbyBcIkBbXCI7IG91dHB1dF9hY2MgbyBhY2MnO1xuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gb3V0cHV0X2FjYyBvIHA7IG91dHB1dF9zdHJpbmcgbyBzXG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAocCwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChwLCBjKSAgICAgLT4gb3V0cHV0X2FjYyBvIHA7IG91dHB1dF9jaGFyIG8gY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBvdXRwdXRfYWNjIG8gcDsgZiBvXG4gIHwgQWNjX2ZsdXNoIHAgICAgICAgICAgICAgIC0+IG91dHB1dF9hY2MgbyBwOyBmbHVzaCBvXG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IG91dHB1dF9hY2MgbyBwOyBpbnZhbGlkX2FyZyBtc2c7XG4gIHwgRW5kX29mX2FjYyAgICAgICAgICAgICAgIC0+ICgpXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYSBidWZmZXIuICopXG4oKiBVc2VkIGFzIGEgY29udGludWF0aW9uIG9mIG1ha2VfcHJpbnRmLiAqKVxubGV0IHJlYyBidWZwdXRfYWNjIGIgYWNjID0gbWF0Y2ggYWNjIHdpdGhcbiAgfCBBY2NfZm9ybWF0dGluZ19saXQgKHAsIGZtdGluZ19saXQpIC0+XG4gICAgbGV0IHMgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nX2xpdCBpblxuICAgIGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHM7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfZ2VuIChwLCBBY2Nfb3Blbl90YWcgYWNjJykgLT5cbiAgICBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBcIkB7XCI7IGJ1ZnB1dF9hY2MgYiBhY2MnO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgYnVmcHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAW1wiOyBidWZwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2Nfc3RyaW5nX2xpdGVyYWwgKHAsIHMpXG4gIHwgQWNjX2RhdGFfc3RyaW5nIChwLCBzKSAgIC0+IGJ1ZnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIHNcbiAgfCBBY2NfY2hhcl9saXRlcmFsIChwLCBjKVxuICB8IEFjY19kYXRhX2NoYXIgKHAsIGMpICAgICAtPiBidWZwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9jaGFyIGIgY1xuICB8IEFjY19kZWxheSAocCwgZikgICAgICAgICAtPiBidWZwdXRfYWNjIGIgcDsgZiBiXG4gIHwgQWNjX2ZsdXNoIHAgICAgICAgICAgICAgIC0+IGJ1ZnB1dF9hY2MgYiBwO1xuICB8IEFjY19pbnZhbGlkX2FyZyAocCwgbXNnKSAtPiBidWZwdXRfYWNjIGIgcDsgaW52YWxpZF9hcmcgbXNnO1xuICB8IEVuZF9vZl9hY2MgICAgICAgICAgICAgICAtPiAoKVxuXG4oKiBSZWN1cnNpdmVseSBvdXRwdXQgYW4gXCJhY2N1bXVsYXRvclwiIGNvbnRhaW5pbmcgYSByZXZlcnNlZCBsaXN0IG9mXG4gICBwcmludGluZyBlbnRpdGllcyAoc3RyaW5nLCBjaGFyLCBmbHVzLCAuLi4pIGluIGEgYnVmZmVyLiAqKVxuKCogRGlmZmVyIGZyb20gYnVmcHV0X2FjYyBieSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgJWEgYW5kICV0LiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBtYWtlX3ByaW50Zi4gKilcbmxldCByZWMgc3RycHV0X2FjYyBiIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmbXRpbmdfbGl0KSAtPlxuICAgIGxldCBzID0gc3RyaW5nX29mX2Zvcm1hdHRpbmdfbGl0IGZtdGluZ19saXQgaW5cbiAgICBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBzO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgXCJAe1wiOyBzdHJwdXRfYWNjIGIgYWNjJztcbiAgfCBBY2NfZm9ybWF0dGluZ19nZW4gKHAsIEFjY19vcGVuX2JveCBhY2MnKSAtPlxuICAgIHN0cnB1dF9hY2MgYiBwOyBCdWZmZXIuYWRkX3N0cmluZyBiIFwiQFtcIjsgc3RycHV0X2FjYyBiIGFjYyc7XG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChwLCBzKVxuICB8IEFjY19kYXRhX3N0cmluZyAocCwgcykgICAtPiBzdHJwdXRfYWNjIGIgcDsgQnVmZmVyLmFkZF9zdHJpbmcgYiBzXG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAocCwgYylcbiAgfCBBY2NfZGF0YV9jaGFyIChwLCBjKSAgICAgLT4gc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfY2hhciBiIGNcbiAgfCBBY2NfZGVsYXkgKHAsIGYpICAgICAgICAgLT4gc3RycHV0X2FjYyBiIHA7IEJ1ZmZlci5hZGRfc3RyaW5nIGIgKGYgKCkpXG4gIHwgQWNjX2ZsdXNoIHAgICAgICAgICAgICAgIC0+IHN0cnB1dF9hY2MgYiBwO1xuICB8IEFjY19pbnZhbGlkX2FyZyAocCwgbXNnKSAtPiBzdHJwdXRfYWNjIGIgcDsgaW52YWxpZF9hcmcgbXNnO1xuICB8IEVuZF9vZl9hY2MgICAgICAgICAgICAgICAtPiAoKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBFcnJvciBtYW5hZ2VtZW50ICopXG5cbigqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgcHJldHR5LXByaW50ZWQgZXJyb3IgbWVzc2FnZS4gKilcbmxldCBmYWlsd2l0aF9tZXNzYWdlIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgMjU2IGluXG4gIGxldCBrIGFjYyA9IHN0cnB1dF9hY2MgYnVmIGFjYzsgZmFpbHdpdGggKEJ1ZmZlci5jb250ZW50cyBidWYpIGluXG4gIG1ha2VfcHJpbnRmIGsgRW5kX29mX2FjYyBmbXRcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXR0aW5nIHRvb2xzICopXG5cbigqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gb3BlbiBibG9jayBkZXNjcmlwdGlvbiAoaW5kZW50LCBibG9ja190eXBlKSAqKVxubGV0IG9wZW5fYm94X29mX3N0cmluZyBzdHIgPVxuICBpZiBzdHIgPSBcIlwiIHRoZW4gKDAsIFBwX2JveCkgZWxzZVxuICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHN0ciBpblxuICAgIGxldCBpbnZhbGlkX2JveCAoKSA9IGZhaWx3aXRoX21lc3NhZ2UgXCJpbnZhbGlkIGJveCBkZXNjcmlwdGlvbiAlU1wiIHN0ciBpblxuICAgIGxldCByZWMgcGFyc2Vfc3BhY2VzIGkgPVxuICAgICAgaWYgaSA9IGxlbiB0aGVuIGkgZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2ldIHdpdGhcbiAgICAgICAgfCAnICcgfCAnXFx0JyAtPiBwYXJzZV9zcGFjZXMgKGkgKyAxKVxuICAgICAgICB8IF8gLT4gaVxuICAgIGFuZCBwYXJzZV9sd29yZCBpIGogPVxuICAgICAgaWYgaiA9IGxlbiB0aGVuIGogZWxzZVxuICAgICAgICBtYXRjaCBzdHIuW2pdIHdpdGhcbiAgICAgICAgfCAnYScgLi4gJ3onIC0+IHBhcnNlX2x3b3JkIGkgKGogKyAxKVxuICAgICAgICB8IF8gLT4galxuICAgIGFuZCBwYXJzZV9pbnQgaSBqID1cbiAgICAgIGlmIGogPSBsZW4gdGhlbiBqIGVsc2VcbiAgICAgICAgbWF0Y2ggc3RyLltqXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPiBwYXJzZV9pbnQgaSAoaiArIDEpXG4gICAgICAgIHwgXyAtPiBqIGluXG4gICAgbGV0IHdzdGFydCA9IHBhcnNlX3NwYWNlcyAwIGluXG4gICAgbGV0IHdlbmQgPSBwYXJzZV9sd29yZCB3c3RhcnQgd3N0YXJ0IGluXG4gICAgbGV0IGJveF9uYW1lID0gU3RyaW5nLnN1YiBzdHIgd3N0YXJ0ICh3ZW5kIC0gd3N0YXJ0KSBpblxuICAgIGxldCBuc3RhcnQgPSBwYXJzZV9zcGFjZXMgd2VuZCBpblxuICAgIGxldCBuZW5kID0gcGFyc2VfaW50IG5zdGFydCBuc3RhcnQgaW5cbiAgICBsZXQgaW5kZW50ID1cbiAgICAgIGlmIG5zdGFydCA9IG5lbmQgdGhlbiAwIGVsc2VcbiAgICAgICAgdHJ5IGludF9vZl9zdHJpbmcgKFN0cmluZy5zdWIgc3RyIG5zdGFydCAobmVuZCAtIG5zdGFydCkpXG4gICAgICAgIHdpdGggRmFpbHVyZSBfIC0+IGludmFsaWRfYm94ICgpIGluXG4gICAgbGV0IGV4cF9lbmQgPSBwYXJzZV9zcGFjZXMgbmVuZCBpblxuICAgIGlmIGV4cF9lbmQgPD4gbGVuIHRoZW4gaW52YWxpZF9ib3ggKCk7XG4gICAgbGV0IGJveF90eXBlID0gbWF0Y2ggYm94X25hbWUgd2l0aFxuICAgICAgfCBcIlwiIHwgXCJiXCIgLT4gUHBfYm94XG4gICAgICB8IFwiaFwiICAgICAgLT4gUHBfaGJveFxuICAgICAgfCBcInZcIiAgICAgIC0+IFBwX3Zib3hcbiAgICAgIHwgXCJodlwiICAgICAtPiBQcF9odmJveFxuICAgICAgfCBcImhvdlwiICAgIC0+IFBwX2hvdmJveFxuICAgICAgfCBfICAgICAgICAtPiBpbnZhbGlkX2JveCAoKSBpblxuICAgIChpbmRlbnQsIGJveF90eXBlKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFBhcnNpbmcgdG9vbHMgKilcblxuKCogQ3JlYXRlIGEgcGFkZGluZ19mbXRfZWJiIGZyb20gYSBwYWRkaW5nIGFuZCBhIGZvcm1hdC4gKilcbigqIENvcHkgdGhlIHBhZGRpbmcgdG8gZGlzam9pbiB0aGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50IGFuZCByZXN1bHQuICopXG5sZXQgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgOiB0eXBlIHggeSAuXG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKF8sIF8sIF8sIF8sIF8sIF8pIGZtdCAtPlxuICAgICAgKF8sIF8sIF8sIF8sIF8pIHBhZGRpbmdfZm10X2ViYiA9XG5mdW4gcGFkIGZtdCAtPiBtYXRjaCBwYWQgd2l0aFxuICB8IE5vX3BhZGRpbmcgICAgICAgICAtPiBQYWRkaW5nX2ZtdF9FQkIgKE5vX3BhZGRpbmcsIGZtdClcbiAgfCBMaXRfcGFkZGluZyAocywgdykgLT4gUGFkZGluZ19mbXRfRUJCIChMaXRfcGFkZGluZyAocywgdyksIGZtdClcbiAgfCBBcmdfcGFkZGluZyBzICAgICAgLT4gUGFkZGluZ19mbXRfRUJCIChBcmdfcGFkZGluZyBzLCBmbXQpXG5cbigqIENyZWF0ZSBhIHByZWNpc2lvbl9mbXRfZWJiIGZyb20gYSBwcmVjaXNpb24gYW5kIGEgZm9ybWF0LiAqKVxuKCogQ29weSB0aGUgcHJlY2lzaW9uIHRvIGRpc2pvaW4gdGhlIHR5cGUgcGFyYW1ldGVycyBvZiBhcmd1bWVudCBhbmQgcmVzdWx0LiAqKVxubGV0IG1ha2VfcHJlY2lzaW9uX2ZtdF9lYmIgOiB0eXBlIHggeSAuXG4gICAgKHgsIHkpIHByZWNpc2lvbiAtPiAoXywgXywgXywgXywgXywgXykgZm10IC0+XG4gICAgICAoXywgXywgXywgXywgXykgcHJlY2lzaW9uX2ZtdF9lYmIgPVxuZnVuIHByZWMgZm10IC0+IG1hdGNoIHByZWMgd2l0aFxuICB8IE5vX3ByZWNpc2lvbiAgICAtPiBQcmVjaXNpb25fZm10X0VCQiAoTm9fcHJlY2lzaW9uLCBmbXQpXG4gIHwgTGl0X3ByZWNpc2lvbiBwIC0+IFByZWNpc2lvbl9mbXRfRUJCIChMaXRfcHJlY2lzaW9uIHAsIGZtdClcbiAgfCBBcmdfcHJlY2lzaW9uICAgLT4gUHJlY2lzaW9uX2ZtdF9FQkIgKEFyZ19wcmVjaXNpb24sIGZtdClcblxuKCogQ3JlYXRlIGEgcGFkcHJlY19mbXRfZWJiIGZyb20gYSBwYWRkaW5nLCBhIHByZWNpc2lvbiBhbmQgYSBmb3JtYXQuICopXG4oKiBDb3B5IHRoZSBwYWRkaW5nIGFuZCB0aGUgcHJlY2lzaW9uIHRvIGRpc2pvaW4gdHlwZSBwYXJhbWV0ZXJzIG9mIGFyZ3VtZW50c1xuICAgYW5kIHJlc3VsdC4gKilcbmxldCBtYWtlX3BhZHByZWNfZm10X2ViYiA6IHR5cGUgeCB5IHogdCAuXG4gICAgKHgsIHkpIHBhZGRpbmcgLT4gKHosIHQpIHByZWNpc2lvbiAtPlxuICAgIChfLCBfLCBfLCBfLCBfLCBfKSBmbXQgLT5cbiAgICAoXywgXywgXywgXywgXykgcGFkcHJlY19mbXRfZWJiID1cbmZ1biBwYWQgcHJlYyBmbXQgLT5cbiAgbGV0IFByZWNpc2lvbl9mbXRfRUJCIChwcmVjLCBmbXQnKSA9IG1ha2VfcHJlY2lzaW9uX2ZtdF9lYmIgcHJlYyBmbXQgaW5cbiAgbWF0Y2ggcGFkIHdpdGhcbiAgfCBOb19wYWRkaW5nICAgICAgICAgLT4gUGFkcHJlY19mbXRfRUJCIChOb19wYWRkaW5nLCBwcmVjLCBmbXQnKVxuICB8IExpdF9wYWRkaW5nIChzLCB3KSAtPiBQYWRwcmVjX2ZtdF9FQkIgKExpdF9wYWRkaW5nIChzLCB3KSwgcHJlYywgZm10JylcbiAgfCBBcmdfcGFkZGluZyBzICAgICAgLT4gUGFkcHJlY19mbXRfRUJCIChBcmdfcGFkZGluZyBzLCBwcmVjLCBmbXQnKVxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBGb3JtYXQgcGFyc2luZyAqKVxuXG4oKiBQYXJzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBmb3JtYXQgYW5kIGNyZWF0ZSBhIGZtdF9lYmIuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gaW4gY2FzZSBvZiBpbnZhbGlkIGZvcm1hdC4gKilcbmxldCBmbXRfZWJiX29mX3N0cmluZyA/bGVnYWN5X2JlaGF2aW9yIHN0ciA9XG4gICgqIFBhcmFtZXRlcnMgbmFtaW5nIGNvbnZlbnRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIGxpdF9zdGFydDogc3RhcnQgb2YgdGhlIGxpdGVyYWwgc2VxdWVuY2UuICAgICAgICAgICAgICAgICAgICAqKVxuICAoKiAgIC0gc3RyX2luZDogY3VycmVudCBpbmRleCBpbiB0aGUgc3RyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBlbmRfaW5kOiBlbmQgb2YgdGhlIGN1cnJlbnQgKHN1Yi0pZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHBjdF9pbmQ6IGluZGV4IG9mIHRoZSAnJScgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAqKVxuICAoKiAgIC0gemVybzogIGlzIHRoZSAnMCcgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBtaW51czogaXMgdGhlICctJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIHBsdXM6ICBpcyB0aGUgJysnIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gaGFzaDogIGlzIHRoZSAnIycgZmxhZyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICopXG4gICgqICAgLSBzcGFjZTogaXMgdGhlICcgJyBmbGFnIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgKilcbiAgKCogICAtIGlnbjogICBpcyB0aGUgJ18nIGZsYWcgZGVmaW5lZCBpbiB0aGUgY3VycmVudCBtaWNyby1mb3JtYXQuICAqKVxuICAoKiAgIC0gcGFkOiBwYWRkaW5nIG9mIHRoZSBjdXJyZW50IG1pY3JvLWZvcm1hdC4gICAgICAgICAgICAgICAgICAgICopXG4gICgqICAgLSBwcmVjOiBwcmVjaXNpb24gb2YgdGhlIGN1cnJlbnQgbWljcm8tZm9ybWF0LiAgICAgICAgICAgICAgICAgKilcbiAgKCogICAtIHN5bWI6IGNoYXIgcmVwcmVzZW50aW5nIHRoZSBjb252ZXJzaW9uICgnYycsICdzJywgJ2QnLCAuLi4pLiAqKVxuICAoKiAgIC0gY2hhcl9zZXQ6IHNldCBvZiBjaGFyYWN0ZXJzIGFzIGJpdG1hcCAoc2VlIHNjYW5mICVbLi4uXSkuICAgICopXG5cbiAgbGV0IGxlZ2FjeV9iZWhhdmlvciA9IG1hdGNoIGxlZ2FjeV9iZWhhdmlvciB3aXRoXG4gICAgfCBTb21lIGZsYWcgLT4gZmxhZ1xuICAgIHwgTm9uZSAtPiB0cnVlXG4gICgqICBXaGVuIHRoaXMgZmxhZyBpcyBlbmFibGVkLCB0aGUgZm9ybWF0IHBhcnNlciB0cmllcyB0byBiZWhhdmUgYXNcbiAgICAgIHRoZSA8NC4wMiBpbXBsZW1lbnRhdGlvbnMsIGluIHBhcnRpY3VsYXIgaXQgaWdub3JlcyBtb3N0IGJlbmluZVxuICAgICAgbm9uc2Vuc2ljYWwgZm9ybWF0LiBXaGVuIHRoZSBmbGFnIGlzIGRpc2FibGVkLCBpdCB3aWxsIHJlamVjdCBhbnlcbiAgICAgIGZvcm1hdCB0aGF0IGlzIG5vdCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWNhdGlvbi5cblxuICAgICAgQSB0eXBpY2FsIGV4YW1wbGUgd291bGQgYmUgXCIlKyBkXCI6IHNwZWNpZnlpbmcgYm90aCAnKycgKGlmIHRoZVxuICAgICAgbnVtYmVyIGlzIHBvc2l0aXZlLCBwYWQgd2l0aCBhICcrJyB0byBnZXQgdGhlIHNhbWUgd2lkdGggYXNcbiAgICAgIG5lZ2F0aXZlIG51bWJlcnMpIGFuZCAnICcgKGlmIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUsIHBhZCB3aXRoXG4gICAgICBhIHNwYWNlKSBkb2VzIG5vdCBtYWtlIHNlbnNlLCBidXQgdGhlIGxlZ2FjeSAoPCA0LjAyKVxuICAgICAgaW1wbGVtZW50YXRpb24gd2FzIGhhcHB5IHRvIGp1c3QgaWdub3JlIHRoZSBzcGFjZS5cbiAgKilcbiAgaW5cblxuICAoKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhIGZyaWVuZGx5IGVycm9yIG1lc3NhZ2UuICopXG4gIGxldCBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIHN0cl9pbmQgbXNnID1cbiAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCAlc1wiXG4gICAgICBzdHIgc3RyX2luZCBtc2dcbiAgaW5cblxuICAoKiBVc2VkIHdoZW4gdGhlIGVuZCBvZiB0aGUgZm9ybWF0IChvciB0aGUgY3VycmVudCBzdWItZm9ybWF0KSB3YXMgZW5jb3VudGVyZWRcbiAgICAgIHVuZXhwZWN0ZWRseS4gKilcbiAgbGV0IHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kID1cbiAgICBpbnZhbGlkX2Zvcm1hdF9tZXNzYWdlIGVuZF9pbmRcbiAgICAgIFwidW5leHBlY3RlZCBlbmQgb2YgZm9ybWF0XCJcbiAgaW5cblxuICAoKiBVc2VkIGZvciAlMGM6IG5vIG90aGVyIHdpZHRocyBhcmUgaW1wbGVtZW50ZWQgKilcbiAgbGV0IGludmFsaWRfbm9ubnVsbF9jaGFyX3dpZHRoIHN0cl9pbmQgPVxuICAgIGludmFsaWRfZm9ybWF0X21lc3NhZ2Ugc3RyX2luZFxuICAgICAgXCJub24temVybyB3aWR0aHMgYXJlIHVuc3VwcG9ydGVkIGZvciAlYyBjb252ZXJzaW9uc1wiXG4gIGluXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiBvcHRpb24gZGVwZW5kZW5jeVxuICAgICBwcm9ibGVtLiAqKVxuICBsZXQgaW52YWxpZF9mb3JtYXRfd2l0aG91dCBzdHJfaW5kIGMgcyA9XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJyVjJyB3aXRob3V0ICVzXCJcbiAgICAgIHN0ciBzdHJfaW5kIGMgc1xuICBpblxuXG4gICgqIFJhaXNlIFtGYWlsdXJlXSB3aXRoIGEgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZSBhYm91dCBhbiB1bmV4cGVjdGVkXG4gICAgIGNoYXJhY3Rlci4gKilcbiAgbGV0IGV4cGVjdGVkX2NoYXJhY3RlciBzdHJfaW5kIGV4cGVjdGVkIHJlYWQgPVxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgJXMgZXhwZWN0ZWQsIHJlYWQgJUNcIlxuICAgICAgc3RyIHN0cl9pbmQgZXhwZWN0ZWQgcmVhZFxuICBpblxuXG4gICgqIFBhcnNlIHRoZSBzdHJpbmcgZnJvbSBiZWdfaW5kIChpbmNsdWRlZCkgdG8gZW5kX2luZCAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIHBhcnNlIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIGJlZ19pbmQgZW5kX2luZCAtPiBwYXJzZV9saXRlcmFsIGJlZ19pbmQgYmVnX2luZCBlbmRfaW5kXG5cbiAgKCogUmVhZCBsaXRlcmFsIGNoYXJhY3RlcnMgdXAgdG8gJyUnIG9yICdAJyBzcGVjaWFsIGNoYXJhY3RlcnMuICopXG4gIGFuZCBwYXJzZV9saXRlcmFsIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBsaXRfc3RhcnQgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBFbmRfb2ZfZm9ybWF0IGVsc2VcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZV9mb3JtYXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIGFkZF9saXRlcmFsIGxpdF9zdGFydCBzdHJfaW5kIGZtdF9yZXN0XG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlX2FmdGVyX2F0IChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBhZGRfbGl0ZXJhbCBsaXRfc3RhcnQgc3RyX2luZCBmbXRfcmVzdFxuICAgICAgfCBfIC0+XG4gICAgICAgIHBhcnNlX2xpdGVyYWwgbGl0X3N0YXJ0IChzdHJfaW5kICsgMSkgZW5kX2luZFxuXG4gICgqIFBhcnNlIGEgZm9ybWF0IGFmdGVyICclJyAqKVxuICBhbmQgcGFyc2VfZm9ybWF0IDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgZW5kX2luZCAtPiBwYXJzZV9pZ24gcGN0X2luZCAocGN0X2luZCArIDEpIGVuZF9pbmRcblxuICBhbmQgcGFyc2VfaWduIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCAtPlxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdfJyAtPiBwYXJzZV9mbGFncyBwY3RfaW5kIChzdHJfaW5kKzEpIGVuZF9pbmQgdHJ1ZVxuICAgICAgfCBfIC0+IHBhcnNlX2ZsYWdzIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGZhbHNlXG5cbiAgYW5kIHBhcnNlX2ZsYWdzIDogdHlwZSBlIGYgLiBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiXG4gID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIGlnbiAtPlxuICAgIGxldCB6ZXJvID0gcmVmIGZhbHNlIGFuZCBtaW51cyA9IHJlZiBmYWxzZVxuICAgIGFuZCBwbHVzID0gcmVmIGZhbHNlIGFuZCBzcGFjZSA9IHJlZiBmYWxzZVxuICAgIGFuZCBoYXNoID0gcmVmIGZhbHNlIGluXG4gICAgbGV0IHNldF9mbGFnIHN0cl9pbmQgZmxhZyA9XG4gICAgICAoKiBpbiBsZWdhY3kgbW9kZSwgZHVwbGljYXRlIGZsYWdzIGFyZSBhY2NlcHRlZCAqKVxuICAgICAgaWYgIWZsYWcgJiYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBkdXBsaWNhdGUgZmxhZyAlQ1wiXG4gICAgICAgICAgc3RyIHN0cl9pbmQgc3RyLltzdHJfaW5kXTtcbiAgICAgIGZsYWcgOj0gdHJ1ZTtcbiAgICBpblxuICAgIGxldCByZWMgcmVhZF9mbGFncyBzdHJfaW5kID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJzAnIC0+IHNldF9mbGFnIHN0cl9pbmQgemVybzsgIHJlYWRfZmxhZ3MgKHN0cl9pbmQgKyAxKVxuICAgICAgfCAnLScgLT4gc2V0X2ZsYWcgc3RyX2luZCBtaW51czsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcrJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHBsdXM7ICByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgJyMnIC0+IHNldF9mbGFnIHN0cl9pbmQgaGFzaDsgcmVhZF9mbGFncyAoc3RyX2luZCArIDEpXG4gICAgICB8ICcgJyAtPiBzZXRfZmxhZyBzdHJfaW5kIHNwYWNlOyByZWFkX2ZsYWdzIChzdHJfaW5kICsgMSlcbiAgICAgIHwgXyAtPlxuICAgICAgICBwYXJzZV9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kXG4gICAgICAgICAgIXplcm8gIW1pbnVzICFwbHVzICFoYXNoICFzcGFjZSBpZ25cbiAgICAgIGVuZFxuICAgIGluXG4gICAgcmVhZF9mbGFncyBzdHJfaW5kXG5cbiAgKCogVHJ5IHRvIHJlYWQgYSBkaWdpdGFsIG9yIGEgJyonIHBhZGRpbmcuICopXG4gIGFuZCBwYXJzZV9wYWRkaW5nIDogdHlwZSBlIGYgLlxuICAgICAgaW50IC0+IGludCAtPiBpbnQgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgemVybyBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICBsZXQgcGFkdHkgPSBtYXRjaCB6ZXJvLCBtaW51cyB3aXRoXG4gICAgICB8IGZhbHNlLCBmYWxzZSAtPiBSaWdodFxuICAgICAgfCBmYWxzZSwgdHJ1ZSAgLT4gTGVmdFxuICAgICAgfCAgdHJ1ZSwgZmFsc2UgLT4gWmVyb3NcbiAgICAgIHwgIHRydWUsIHRydWUgIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIExlZnRcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJy0nIFwiMFwiIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+XG4gICAgICBsZXQgbmV3X2luZCwgd2lkdGggPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIG5ld19pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgIChMaXRfcGFkZGluZyAocGFkdHksIHdpZHRoKSlcbiAgICB8ICcqJyAtPlxuICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIChzdHJfaW5kICsgMSkgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2VcbiAgICAgICAgaWduIChBcmdfcGFkZGluZyBwYWR0eSlcbiAgICB8IF8gLT5cbiAgICAgIGJlZ2luIG1hdGNoIHBhZHR5IHdpdGhcbiAgICAgIHwgTGVmdCAgLT5cbiAgICAgICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuXG4gICAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICctJyBcInBhZGRpbmdcIjtcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgfCBaZXJvcyAtPlxuICAgICAgICAgKCogYSAnMCcgcGFkZGluZyBpbmRpY2F0aW9uIG5vdCBmb2xsb3dlZCBieSBhbnl0aGluZyBzaG91bGRcbiAgICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYSBSaWdodCBwYWRkaW5nIG9mIHdpZHRoIDAuIFRoaXMgaXMgdXNlZFxuICAgICAgICAgICBieSBzY2FubmluZyBjb252ZXJzaW9ucyAlMHMgYW5kICUwYyAqKVxuICAgICAgICBwYXJzZV9hZnRlcl9wYWRkaW5nIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICAoTGl0X3BhZGRpbmcgKFJpZ2h0LCAwKSlcbiAgICAgIHwgUmlnaHQgLT5cbiAgICAgICAgcGFyc2VfYWZ0ZXJfcGFkZGluZyBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBtaW51cyBwbHVzIGhhc2ggc3BhY2UgaWduXG4gICAgICAgICAgTm9fcGFkZGluZ1xuICAgICAgZW5kXG5cbiAgKCogSXMgcHJlY2lzaW9uIGRlZmluZWQ/ICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wYWRkaW5nIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgIHwgJy4nIC0+XG4gICAgICBwYXJzZV9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnblxuICAgICAgICBwYWRcbiAgICB8IHN5bWIgLT5cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgTm9fcHJlY2lzaW9uIHBhZCBzeW1iXG5cbiAgKCogUmVhZCB0aGUgZGlnaXRhbCBvciAnKicgcHJlY2lzaW9uLiAqKVxuICBhbmQgcGFyc2VfcHJlY2lzaW9uIDogdHlwZSB4IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT5cbiAgICAgICAgKHgsIF8pIHBhZGRpbmcgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gcGN0X2luZCBzdHJfaW5kIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWQgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9saXRlcmFsIG1pbnVzIHN0cl9pbmQgPVxuICAgICAgbGV0IG5ld19pbmQsIHByZWMgPSBwYXJzZV9wb3NpdGl2ZSBzdHJfaW5kIGVuZF9pbmQgMCBpblxuICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgbmV3X2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgcGFkIChMaXRfcHJlY2lzaW9uIHByZWMpIGluXG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX2xpdGVyYWwgbWludXMgc3RyX2luZFxuICAgIHwgKCcrJyB8ICctJykgYXMgc3ltYiB3aGVuIGxlZ2FjeV9iZWhhdmlvciAtPlxuICAgICAgKCogTGVnYWN5IG1vZGUgd291bGQgYWNjZXB0IGFuZCBpZ25vcmUgJysnIG9yICctJyBiZWZvcmUgdGhlXG4gICAgICAgICBpbnRlZ2VyIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQgcHJlY2lzaW9uOyBub3RlIHRoYXQgdGhpc1xuICAgICAgICAgY2Fubm90IGhhcHBlbiBmb3IgcGFkZGluZyB3aWR0aCwgYXMgJysnIGFuZCAnLScgYWxyZWFkeSBoYXZlXG4gICAgICAgICBhIHNlbWFudGljcyB0aGVyZS5cblxuICAgICAgICAgVGhhdCBzYWlkLCB0aGUgaWRlYSAoc3VwcG9ydGVkIGJ5IHRoaXMgdHdlYWspIHRoYXQgd2lkdGggYW5kXG4gICAgICAgICBwcmVjaXNpb24gbGl0ZXJhbHMgYXJlIFwiaW50ZWdlciBsaXRlcmFsc1wiIGluIHRoZSBPQ2FtbCBzZW5zZSBpc1xuICAgICAgICAgc3RpbGwgYmxhdGFudGx5IHdyb25nLCBhcyAxMjNfNDU2IG9yIDB4RkYgYXJlIHJlamVjdGVkLiAqKVxuICAgICAgcGFyc2VfbGl0ZXJhbCAobWludXMgfHwgc3ltYiA9ICctJykgKHN0cl9pbmQgKyAxKVxuICAgIHwgJyonIC0+XG4gICAgICBwYXJzZV9hZnRlcl9wcmVjaXNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgbWludXMgcGx1cyBoYXNoIHNwYWNlXG4gICAgICAgIGlnbiBwYWQgQXJnX3ByZWNpc2lvblxuICAgIHwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogbm90ZSB0aGF0IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBkaWQgbm90IGlnbm9yZSAnLicgd2l0aG91dFxuICAgICAgICAgICBhIG51bWJlciAoYXMgaXQgZG9lcyBmb3IgcGFkZGluZyBpbmRpY2F0aW9ucyksIGJ1dFxuICAgICAgICAgICBpbnRlcnByZXRzIGl0IGFzICcuMCcgKilcbiAgICAgICAgcGFyc2VfYWZ0ZXJfcHJlY2lzaW9uIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ25cbiAgICAgICAgICBwYWQgKExpdF9wcmVjaXNpb24gMClcbiAgICAgIGVsc2VcbiAgICAgICAgaW52YWxpZF9mb3JtYXRfd2l0aG91dCAoc3RyX2luZCAtIDEpICcuJyBcInByZWNpc2lvblwiXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIGNvbnZlcnNpb24uICopXG4gIGFuZCBwYXJzZV9hZnRlcl9wcmVjaXNpb24gOiB0eXBlIHggeSB6IHQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gaW50IC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPlxuICAgICAgICAoeCwgeSkgcGFkZGluZyAtPiAoeiwgdCkgcHJlY2lzaW9uIC0+IChfLCBfLCBlLCBmKSBmbXRfZWJiID1cbiAgZnVuIHBjdF9pbmQgc3RyX2luZCBlbmRfaW5kIG1pbnVzIHBsdXMgaGFzaCBzcGFjZSBpZ24gcGFkIHByZWMgLT5cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGxldCBwYXJzZV9jb252ICh0eXBlIHUpICh0eXBlIHYpIChwYWRwcmVjIDogKHUsIHYpIHBhZGRpbmcpID1cbiAgICAgIHBhcnNlX2NvbnZlcnNpb24gcGN0X2luZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgcGx1cyBoYXNoIHNwYWNlIGlnbiBwYWRcbiAgICAgICAgcHJlYyBwYWRwcmVjIHN0ci5bc3RyX2luZF0gaW5cbiAgICAoKiBpbiBsZWdhY3kgbW9kZSwgc29tZSBmb3JtYXRzICglcyBhbmQgJVMpIGFjY2VwdCBhIHdlaXJkIG1peCBvZlxuICAgICAgIHBhZGRpbmcgYW5kIHByZWNpc2lvbiwgd2hpY2ggaXMgbWVyZ2VkIGFzIGEgc2luZ2xlIHBhZGRpbmdcbiAgICAgICBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGluICUuMTBzIHRoZSBwcmVjaXNpb24gaXMgaW1wbGljaXRseVxuICAgICAgIHVuZGVyc3Rvb2QgYXMgcGFkZGluZyAlMTBzLCBidXQgdGhlIGxlZnQtcGFkZGluZyBjb21wb25lbnQgbWF5XG4gICAgICAgYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBhIGxlZnQgcGFkZGluZyBvciBhIG5lZ2F0aXZlIHByZWNpc2lvbjpcbiAgICAgICAlLS4zcyBhbmQgJS4tM3MgYXJlIGVxdWl2YWxlbnQgdG8gJS0zcyAqKVxuICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgfCBOb19wYWRkaW5nIC0+IChcbiAgICAgIG1hdGNoIG1pbnVzLCBwcmVjIHdpdGhcbiAgICAgICAgfCBfLCBOb19wcmVjaXNpb24gLT4gcGFyc2VfY29udiBOb19wYWRkaW5nXG4gICAgICAgIHwgZmFsc2UsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoUmlnaHQsIG4pKVxuICAgICAgICB8IHRydWUsIExpdF9wcmVjaXNpb24gbiAtPiBwYXJzZV9jb252IChMaXRfcGFkZGluZyAoTGVmdCwgbikpXG4gICAgICAgIHwgZmFsc2UsIEFyZ19wcmVjaXNpb24gLT4gcGFyc2VfY29udiAoQXJnX3BhZGRpbmcgUmlnaHQpXG4gICAgICAgIHwgdHJ1ZSwgQXJnX3ByZWNpc2lvbiAtPiBwYXJzZV9jb252IChBcmdfcGFkZGluZyBMZWZ0KVxuICAgIClcbiAgICB8IHBhZCAtPiBwYXJzZV9jb252IHBhZFxuXG4gICgqIENhc2UgYW5hbHlzaXMgb24gY29udmVyc2lvbi4gKilcbiAgYW5kIHBhcnNlX2NvbnZlcnNpb24gOiB0eXBlIHggeSB6IHQgdSB2IGUgZiAuXG4gICAgICBpbnQgLT4gaW50IC0+IGludCAtPiBib29sIC0+IGJvb2wgLT4gYm9vbCAtPiBib29sIC0+ICh4LCB5KSBwYWRkaW5nIC0+XG4gICAgICAgICh6LCB0KSBwcmVjaXNpb24gLT4gKHUsIHYpIHBhZGRpbmcgLT4gY2hhciAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBwY3RfaW5kIHN0cl9pbmQgZW5kX2luZCBwbHVzIGhhc2ggc3BhY2UgaWduIHBhZCBwcmVjIHBhZHByZWMgc3ltYiAtPlxuICAgICgqIEZsYWdzIHVzZWQgdG8gY2hlY2sgb3B0aW9uIHVzYWdlcy9jb21wYXRpYmlsaXRpZXMuICopXG4gICAgbGV0IHBsdXNfdXNlZCAgPSByZWYgZmFsc2UgYW5kIGhhc2hfdXNlZCA9IHJlZiBmYWxzZVxuICAgIGFuZCBzcGFjZV91c2VkID0gcmVmIGZhbHNlIGFuZCBpZ25fdXNlZCAgID0gcmVmIGZhbHNlXG4gICAgYW5kIHBhZF91c2VkICAgPSByZWYgZmFsc2UgYW5kIHByZWNfdXNlZCAgPSByZWYgZmFsc2UgaW5cblxuICAgICgqIEFjY2VzcyB0byBvcHRpb25zLCB1cGRhdGUgZmxhZ3MuICopXG4gICAgbGV0IGdldF9wbHVzICAgICgpID0gcGx1c191c2VkICA6PSB0cnVlOyBwbHVzXG4gICAgYW5kIGdldF9oYXNoICAgKCkgPSBoYXNoX3VzZWQgOj0gdHJ1ZTsgaGFzaFxuICAgIGFuZCBnZXRfc3BhY2UgICAoKSA9IHNwYWNlX3VzZWQgOj0gdHJ1ZTsgc3BhY2VcbiAgICBhbmQgZ2V0X2lnbiAgICAgKCkgPSBpZ25fdXNlZCAgIDo9IHRydWU7IGlnblxuICAgIGFuZCBnZXRfcGFkICAgICAoKSA9IHBhZF91c2VkICAgOj0gdHJ1ZTsgcGFkXG4gICAgYW5kIGdldF9wcmVjICAgICgpID0gcHJlY191c2VkICA6PSB0cnVlOyBwcmVjXG4gICAgYW5kIGdldF9wYWRwcmVjICgpID0gcGFkX3VzZWQgICA6PSB0cnVlOyBwYWRwcmVjIGluXG5cbiAgICBsZXQgZ2V0X2ludF9wYWQgKCkgOiAoeCx5KSBwYWRkaW5nID1cbiAgICAgICgqICU1LjNkIGlzIGFjY2VwdGVkIGFuZCBtZWFuaW5nZnVsOiBwYWQgdG8gbGVuZ3RoIDUgd2l0aFxuICAgICAgICAgc3BhY2VzLCBidXQgZmlyc3QgcGFkIHdpdGggemVyb3MgdXB0byBsZW5ndGggMyAoMC1wYWRkaW5nXG4gICAgICAgICBpcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgXCJwcmVjaXNpb25cIiBmb3IgaW50ZWdlciBmb3JtYXRzKS5cblxuICAgICAgICAgJTA1LjNkIGlzIHJlZHVuZGFudDogcGFkIHRvIGxlbmd0aCA1ICp3aXRoIHplcm9zKiwgYnV0XG4gICAgICAgICBmaXJzdCBwYWQgd2l0aCB6ZXJvcy4uLiBUbyBhZGQgaW5zdWx0IHRvIHRoZSBpbmp1cnksIHRoZVxuICAgICAgICAgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIDAtcGFkZGluZyBpbmRpY2F0aW9uIGFuZFxuICAgICAgICAgZG9lcyB0aGUgNSBwYWRkaW5nIHdpdGggc3BhY2VzIGluc3RlYWQuIFdlIHJldXNlIHRoaXNcbiAgICAgICAgIGludGVycHJldGF0aW9uIGZvciBjb21wYXRpYmlsaXR5LCBidXQgc3RhdGljYWxseSByZWplY3QgdGhpc1xuICAgICAgICAgZm9ybWF0IHdoZW4gdGhlIGxlZ2FjeSBtb2RlIGlzIGRpc2FibGVkLCB0byBwcm90ZWN0IHN0cmljdFxuICAgICAgICAgdXNlcnMgZnJvbSB0aGlzIGNvcm5lciBjYXNlLiAqKVxuICAgICAgIG1hdGNoIGdldF9wYWQgKCksIGdldF9wcmVjICgpIHdpdGhcbiAgICAgICAgIHwgcGFkLCBOb19wcmVjaXNpb24gLT4gcGFkXG4gICAgICAgICB8IE5vX3BhZGRpbmcsIF8gICAgIC0+IE5vX3BhZGRpbmdcbiAgICAgICAgIHwgTGl0X3BhZGRpbmcgKFplcm9zLCBuKSwgXyAtPlxuICAgICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIG4pXG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IEFyZ19wYWRkaW5nIFplcm9zLCBfIC0+XG4gICAgICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcwJyBcInByZWNpc2lvblwiXG4gICAgICAgICB8IExpdF9wYWRkaW5nIF8gYXMgcGFkLCBfIC0+IHBhZFxuICAgICAgICAgfCBBcmdfcGFkZGluZyBfIGFzIHBhZCwgXyAtPiBwYWQgaW5cblxuICAgICgqIENoZWNrIHRoYXQgcGFkdHkgPD4gWmVyb3MuICopXG4gICAgbGV0IGNoZWNrX25vXzAgc3ltYiAodHlwZSBhIGIpIChwYWQgOiAoYSwgYikgcGFkZGluZykgOiAoYSxiKSBwYWRkaW5nID1cbiAgICAgIG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gcGFkXG4gICAgICB8IExpdF9wYWRkaW5nICgoTGVmdCB8IFJpZ2h0KSwgXykgLT4gcGFkXG4gICAgICB8IEFyZ19wYWRkaW5nIChMZWZ0IHwgUmlnaHQpIC0+IHBhZFxuICAgICAgfCBMaXRfcGFkZGluZyAoWmVyb3MsIHdpZHRoKSAtPlxuICAgICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKVxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiMFwiXG4gICAgICB8IEFyZ19wYWRkaW5nIFplcm9zIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIEFyZ19wYWRkaW5nIFJpZ2h0XG4gICAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCIwXCJcbiAgICBpblxuXG4gICAgKCogR2V0IHBhZGRpbmcgYXMgYSBwYWRfb3B0aW9uIChzZWUgXCIlX1wiLCBcIiV7XCIsIFwiJShcIiBhbmQgXCIlW1wiKS5cbiAgICAgICAobm8gbmVlZCBmb3IgbGVnYWN5IG1vZGUgdHdlYWtpbmcsIHRob3NlIHdlcmUgcmVqZWN0ZWQgYnkgdGhlXG4gICAgICAgbGVnYWN5IHBhcnNlciBhcyB3ZWxsKSAqKVxuICAgIGxldCBvcHRfb2ZfcGFkIGMgKHR5cGUgYSkgKHR5cGUgYikgKHBhZCA6IChhLCBiKSBwYWRkaW5nKSA9IG1hdGNoIHBhZCB3aXRoXG4gICAgICB8IE5vX3BhZGRpbmcgLT4gTm9uZVxuICAgICAgfCBMaXRfcGFkZGluZyAoUmlnaHQsIHdpZHRoKSAtPiBTb21lIHdpZHRoXG4gICAgICB8IExpdF9wYWRkaW5nIChaZXJvcywgd2lkdGgpIC0+XG4gICAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuIFNvbWUgd2lkdGhcbiAgICAgICAgZWxzZSBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicwJ1wiXG4gICAgICB8IExpdF9wYWRkaW5nIChMZWZ0LCB3aWR0aCkgLT5cbiAgICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gU29tZSB3aWR0aFxuICAgICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBjIFwiJy0nXCJcbiAgICAgIHwgQXJnX3BhZGRpbmcgXyAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgYyBcIicqJ1wiXG4gICAgaW5cbiAgICBsZXQgZ2V0X3BhZF9vcHQgYyA9IG9wdF9vZl9wYWQgYyAoZ2V0X3BhZCAoKSkgaW5cbiAgICBsZXQgZ2V0X3BhZHByZWNfb3B0IGMgPSBvcHRfb2ZfcGFkIGMgKGdldF9wYWRwcmVjICgpKSBpblxuXG4gICAgKCogR2V0IHByZWNpc2lvbiBhcyBhIHByZWNfb3B0aW9uIChzZWUgXCIlX2ZcIikuXG4gICAgICAgKG5vIG5lZWQgZm9yIGxlZ2FjeSBtb2RlIHR3ZWFraW5nLCB0aG9zZSB3ZXJlIHJlamVjdGVkIGJ5IHRoZVxuICAgICAgIGxlZ2FjeSBwYXJzZXIgYXMgd2VsbCkgKilcbiAgICBsZXQgZ2V0X3ByZWNfb3B0ICgpID0gbWF0Y2ggZ2V0X3ByZWMgKCkgd2l0aFxuICAgICAgfCBOb19wcmVjaXNpb24gICAgICAgLT4gTm9uZVxuICAgICAgfCBMaXRfcHJlY2lzaW9uIG5kZWMgLT4gU29tZSBuZGVjXG4gICAgICB8IEFyZ19wcmVjaXNpb24gICAgICAtPiBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgJ18nIFwiJyonXCJcbiAgICBpblxuXG4gICAgbGV0IGZtdF9yZXN1bHQgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICcsJyAtPlxuICAgICAgcGFyc2Ugc3RyX2luZCBlbmRfaW5kXG4gICAgfCAnYycgLT5cbiAgICAgIGxldCBjaGFyX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICVjICopXG4gICAgICAgIGlmIGdldF9pZ24gKClcbiAgICAgICAgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NoYXIsIGZtdF9yZXN0KSlcbiAgICAgICAgZWxzZSBGbXRfRUJCIChDaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBzY2FuX2Zvcm1hdCBmbXRfcmVzdCA9ICgqICUwYyAqKVxuICAgICAgICBpZiBnZXRfaWduICgpXG4gICAgICAgIHRoZW4gRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoSWdub3JlZF9zY2FuX25leHRfY2hhciwgZm10X3Jlc3QpKVxuICAgICAgICBlbHNlIEZtdF9FQkIgKFNjYW5fbmV4dF9jaGFyIGZtdF9yZXN0KVxuICAgICAgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBiZWdpbiBtYXRjaCBnZXRfcGFkX29wdCAnYycgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gY2hhcl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIDAgLT4gc2Nhbl9mb3JtYXQgZm10X3Jlc3RcbiAgICAgICAgfCBTb21lIF9uIC0+XG4gICAgICAgICAgIGlmIG5vdCBsZWdhY3lfYmVoYXZpb3JcbiAgICAgICAgICAgdGhlbiBpbnZhbGlkX25vbm51bGxfY2hhcl93aWR0aCBzdHJfaW5kXG4gICAgICAgICAgIGVsc2UgKCogbGVnYWN5IGlnbm9yZXMgJWMgd2lkdGhzICopIGNoYXJfZm9ybWF0IGZtdF9yZXN0XG4gICAgICBlbmRcbiAgICB8ICdDJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlbiBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChJZ25vcmVkX2NhbWxfY2hhcixmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKENhbWxfY2hhciBmbXRfcmVzdClcbiAgICB8ICdzJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zdHJpbmcgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKFN0cmluZyAocGFkJywgZm10X3Jlc3QnKSlcbiAgICB8ICdTJyAtPlxuICAgICAgbGV0IHBhZCA9IGNoZWNrX25vXzAgc3ltYiAoZ2V0X3BhZHByZWMgKCkpIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9jYW1sX3N0cmluZyAoZ2V0X3BhZHByZWNfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkZGluZ19mbXRfRUJCIChwYWQnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZGRpbmdfZm10X2ViYiBwYWQgZm10X3Jlc3QgaW5cbiAgICAgICAgRm10X0VCQiAoQ2FtbF9zdHJpbmcgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnZCcgfCAnaScgfCAneCcgfCAnWCcgfCAnbycgfCAndScgLT5cbiAgICAgIGxldCBpY29udiA9IGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIChnZXRfcGx1cyAoKSkgKGdldF9oYXNoICgpKVxuICAgICAgICAoZ2V0X3NwYWNlICgpKSBzeW1iIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQgKGljb252LCBnZXRfcGFkX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZHByZWNfZm10X0VCQiAocGFkJywgcHJlYycsIGZtdF9yZXN0JykgPVxuICAgICAgICAgIG1ha2VfcGFkcHJlY19mbXRfZWJiIChnZXRfaW50X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChJbnQgKGljb252LCBwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSlcbiAgICB8ICdOJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gVG9rZW5fY291bnRlciBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9zY2FuX2dldF9jb3VudGVyIGNvdW50ZXIgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2dldF9jb3VudGVyIChjb3VudGVyLCBmbXRfcmVzdCkpXG4gICAgfCAnbCcgfCAnbicgfCAnTCcgd2hlbiBzdHJfaW5kPWVuZF9pbmQgfHwgbm90IChpc19pbnRfYmFzZSBzdHIuW3N0cl9pbmRdKSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGxldCBjb3VudGVyID0gY291bnRlcl9vZl9jaGFyIHN5bWIgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9nZXRfY291bnRlciBjb3VudGVyIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgZm10X3Jlc3QpKVxuICAgIHwgJ2wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQzMiAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDMyIChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnbicgLT5cbiAgICAgIGxldCBpY29udiA9XG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCAoc3RyX2luZCArIDEpIChnZXRfcGx1cyAoKSlcbiAgICAgICAgICAoZ2V0X2hhc2ggKCkpIChnZXRfc3BhY2UgKCkpIHN0ci5bc3RyX2luZF0gaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX25hdGl2ZWludCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKE5hdGl2ZWludCAoaWNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ0wnIC0+XG4gICAgICBsZXQgaWNvbnYgPVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgKHN0cl9pbmQgKyAxKSAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSlcbiAgICAgICAgICAoZ2V0X3NwYWNlICgpKSBzdHIuW3N0cl9pbmRdIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuXG4gICAgICAgIGxldCBpZ25vcmVkID0gSWdub3JlZF9pbnQ2NCAoaWNvbnYsIGdldF9wYWRfb3B0ICdfJykgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgUGFkcHJlY19mbXRfRUJCIChwYWQnLCBwcmVjJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRwcmVjX2ZtdF9lYmIgKGdldF9pbnRfcGFkICgpKSAoZ2V0X3ByZWMgKCkpIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEludDY0IChpY29udiwgcGFkJywgcHJlYycsIGZtdF9yZXN0JykpXG4gICAgfCAnZicgfCAnZScgfCAnRScgfCAnZycgfCAnRycgfCAnRicgfCAnaCcgfCAnSCcgLT5cbiAgICAgIGxldCBmY29udiA9XG4gICAgICAgIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmRcbiAgICAgICAgICAoZ2V0X3BsdXMgKCkpIChnZXRfaGFzaCAoKSkgKGdldF9zcGFjZSAoKSkgc3ltYiBpblxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZmxvYXQgKGdldF9wYWRfb3B0ICdfJywgZ2V0X3ByZWNfb3B0ICgpKSBpblxuICAgICAgICBGbXRfRUJCIChJZ25vcmVkX3BhcmFtIChpZ25vcmVkLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBQYWRwcmVjX2ZtdF9FQkIgKHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpID1cbiAgICAgICAgICBtYWtlX3BhZHByZWNfZm10X2ViYiAoZ2V0X3BhZCAoKSkgKGdldF9wcmVjICgpKSBmbXRfcmVzdCBpblxuICAgICAgICBGbXRfRUJCIChGbG9hdCAoZmNvbnYsIHBhZCcsIHByZWMnLCBmbXRfcmVzdCcpKVxuICAgIHwgJ2InIHwgJ0InIC0+XG4gICAgICBsZXQgcGFkID0gY2hlY2tfbm9fMCBzeW1iIChnZXRfcGFkcHJlYyAoKSkgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Jvb2wgKGdldF9wYWRwcmVjX29wdCAnXycpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgbGV0IFBhZGRpbmdfZm10X0VCQiAocGFkJywgZm10X3Jlc3QnKSA9XG4gICAgICAgICAgbWFrZV9wYWRkaW5nX2ZtdF9lYmIgcGFkIGZtdF9yZXN0IGluXG4gICAgICAgIEZtdF9FQkIgKEJvb2wgKHBhZCcsIGZtdF9yZXN0JykpXG4gICAgfCAnYScgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBGbXRfRUJCIChBbHBoYSBmbXRfcmVzdClcbiAgICB8ICd0JyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKFRoZXRhIGZtdF9yZXN0KVxuICAgIHwgJ3InIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIHN0cl9pbmQgZW5kX2luZCBpblxuICAgICAgaWYgZ2V0X2lnbiAoKSB0aGVuIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKElnbm9yZWRfcmVhZGVyLCBmbXRfcmVzdCkpXG4gICAgICBlbHNlIEZtdF9FQkIgKFJlYWRlciBmbXRfcmVzdClcbiAgICB8ICchJyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZsdXNoIGZtdF9yZXN0KVxuICAgIHwgKCclJyB8ICdAJykgYXMgYyAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKENoYXJfbGl0ZXJhbCAoYywgZm10X3Jlc3QpKVxuICAgIHwgJ3snIC0+XG4gICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCAnfScgaW5cbiAgICAgIGxldCBGbXRfRUJCIHN1Yl9mbXQgPSBwYXJzZSBzdHJfaW5kIHN1Yl9lbmQgaW5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN1Yl9lbmQgKyAyKSBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2ZtdHR5ID0gZm10dHlfb2ZfZm10IHN1Yl9mbXQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfZm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X2FyZyAoZ2V0X3BhZF9vcHQgJ3snLCBzdWJfZm10dHksIGZtdF9yZXN0KSlcbiAgICB8ICcoJyAtPlxuICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCBzdHJfaW5kIGVuZF9pbmQgJyknIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdWJfZW5kICsgMikgZW5kX2luZCBpblxuICAgICAgbGV0IEZtdF9FQkIgc3ViX2ZtdCA9IHBhcnNlIHN0cl9pbmQgc3ViX2VuZCBpblxuICAgICAgbGV0IHN1Yl9mbXR0eSA9IGZtdHR5X29mX2ZtdCBzdWJfZm10IGluXG4gICAgICBpZiBnZXRfaWduICgpIHRoZW5cbiAgICAgICAgbGV0IGlnbm9yZWQgPSBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoZ2V0X3BhZF9vcHQgJ18nLCBzdWJfZm10dHkpIGluXG4gICAgICAgIEZtdF9FQkIgKElnbm9yZWRfcGFyYW0gKGlnbm9yZWQsIGZtdF9yZXN0KSlcbiAgICAgIGVsc2VcbiAgICAgICAgRm10X0VCQiAoRm9ybWF0X3N1YnN0IChnZXRfcGFkX29wdCAnKCcsIHN1Yl9mbXR0eSwgZm10X3Jlc3QpKVxuICAgIHwgJ1snIC0+XG4gICAgICBsZXQgbmV4dF9pbmQsIGNoYXJfc2V0ID0gcGFyc2VfY2hhcl9zZXQgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIGlmIGdldF9pZ24gKCkgdGhlblxuICAgICAgICBsZXQgaWdub3JlZCA9IElnbm9yZWRfc2Nhbl9jaGFyX3NldCAoZ2V0X3BhZF9vcHQgJ18nLCBjaGFyX3NldCkgaW5cbiAgICAgICAgRm10X0VCQiAoSWdub3JlZF9wYXJhbSAoaWdub3JlZCwgZm10X3Jlc3QpKVxuICAgICAgZWxzZVxuICAgICAgICBGbXRfRUJCIChTY2FuX2NoYXJfc2V0IChnZXRfcGFkX29wdCAnWycsIGNoYXJfc2V0LCBmbXRfcmVzdCkpXG4gICAgfCAnLScgfCAnKycgfCAnIycgfCAnICcgfCAnXycgLT5cbiAgICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogYXQgY2hhcmFjdGVyIG51bWJlciAlZCwgXFxcbiAgICAgICAgIGZsYWcgJUMgaXMgb25seSBhbGxvd2VkIGFmdGVyIHRoZSAnJSUnLCBiZWZvcmUgcGFkZGluZyBhbmQgcHJlY2lzaW9uXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgc3ltYlxuICAgIHwgXyAtPlxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgaW52YWxpZCBjb252ZXJzaW9uIFxcXCIlJSVjXFxcIlwiIHN0ciAoc3RyX2luZCAtIDEpIHN5bWJcbiAgICBpblxuICAgICgqIENoZWNrIGZvciB1bnVzZWQgb3B0aW9ucywgYW5kIHJlamVjdCB0aGVtIGFzIGluY29tcGF0aWJsZS5cblxuICAgICAgIFN1Y2ggY2hlY2tzIG5lZWQgdG8gYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsIGFzIHRoZSBsZWdhY3lcbiAgICAgICBwYXJzZXIgc2lsZW50bHkgaWdub3JlZCBpbmNvbXBhdGlibGUgZmxhZ3MuICopXG4gICAgaWYgbm90IGxlZ2FjeV9iZWhhdmlvciB0aGVuIGJlZ2luXG4gICAgaWYgbm90ICFwbHVzX3VzZWQgJiYgcGx1cyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcIicrJ1wiO1xuICAgIGlmIG5vdCAhaGFzaF91c2VkICYmIGhhc2ggdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIjtcbiAgICBpZiBub3QgIXNwYWNlX3VzZWQgJiYgc3BhY2UgdGhlblxuICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInICdcIjtcbiAgICBpZiBub3QgIXBhZF91c2VkICAmJiBQYWRkaW5nX0VCQiBwYWQgPD4gUGFkZGluZ19FQkIgTm9fcGFkZGluZyB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgc3ltYiBcImBwYWRkaW5nJ1wiO1xuICAgIGlmIG5vdCAhcHJlY191c2VkICYmIFByZWNpc2lvbl9FQkIgcHJlYyA8PiBQcmVjaXNpb25fRUJCIE5vX3ByZWNpc2lvbiB0aGVuXG4gICAgICBpbmNvbXBhdGlibGVfZmxhZyBwY3RfaW5kIHN0cl9pbmQgKGlmIGlnbiB0aGVuICdfJyBlbHNlIHN5bWIpXG4gICAgICAgIFwiYHByZWNpc2lvbidcIjtcbiAgICBpZiBpZ24gJiYgcGx1cyB0aGVuIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCAnXycgXCInKydcIjtcbiAgICBlbmQ7XG4gICAgKCogdGhpcyBsYXN0IHRlc3QgbXVzdCBub3QgYmUgZGlzYWJsZWQgaW4gbGVnYWN5IG1vZGUsXG4gICAgICAgYXMgaWdub3JpbmcgaXQgd291bGQgdHlwaWNhbGx5IHJlc3VsdCBpbiBhIGRpZmZlcmVudCB0eXBpbmdcbiAgICAgICB0aGFuIHdoYXQgdGhlIGxlZ2FjeSBwYXJzZXIgdXNlZCAqKVxuICAgIGlmIG5vdCAhaWduX3VzZWQgJiYgaWduIHRoZW5cbiAgICAgIGJlZ2luIG1hdGNoIHN5bWIgd2l0aFxuICAgICAgICAoKiBhcmd1bWVudC1sZXNzIGZvcm1hdHMgY2FuIHNhZmVseSBiZSBpZ25vcmVkIGluIGxlZ2FjeSBtb2RlICopXG4gICAgICAgIHwgKCdAJyB8ICclJyB8ICchJyB8ICcsJykgd2hlbiBsZWdhY3lfYmVoYXZpb3IgLT4gKClcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInXydcIlxuICAgICAgZW5kO1xuICAgIGZtdF9yZXN1bHRcblxuICAoKiBQYXJzZSBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIChhZnRlciAnQCcpLiAqKVxuICBhbmQgcGFyc2VfYWZ0ZXJfYXQgOiB0eXBlIGUgZiAuIGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKCdAJywgRW5kX29mX2Zvcm1hdCkpXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICdbJyAtPlxuICAgICAgICBwYXJzZV90YWcgZmFsc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICddJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoQ2xvc2VfYm94LCBmbXRfcmVzdCkpXG4gICAgICB8ICd7JyAtPlxuICAgICAgICBwYXJzZV90YWcgdHJ1ZSAoc3RyX2luZCArIDEpIGVuZF9pbmRcbiAgICAgIHwgJ30nIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChDbG9zZV90YWcsIGZtdF9yZXN0KSlcbiAgICAgIHwgJywnIC0+XG4gICAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChCcmVhayAoXCJALFwiLCAwLCAwKSwgZm10X3Jlc3QpKVxuICAgICAgfCAnICcgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEJyZWFrIChcIkAgXCIsIDEsIDApLCBmbXRfcmVzdCkpXG4gICAgICB8ICc7JyAtPlxuICAgICAgICBwYXJzZV9nb29kX2JyZWFrIChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCAnPycgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZGbHVzaCwgZm10X3Jlc3QpKVxuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRm9yY2VfbmV3bGluZSwgZm10X3Jlc3QpKVxuICAgICAgfCAnLicgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEZsdXNoX25ld2xpbmUsIGZtdF9yZXN0KSlcbiAgICAgIHwgJzwnIC0+XG4gICAgICAgIHBhcnNlX21hZ2ljX3NpemUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8ICdAJyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoRXNjYXBlZF9hdCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgd2hlbiBzdHJfaW5kICsgMSA8IGVuZF9pbmQgJiYgc3RyLltzdHJfaW5kICsgMV0gPSAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoc3RyX2luZCArIDIpIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19saXQgKEVzY2FwZWRfcGVyY2VudCwgZm10X3Jlc3QpKVxuICAgICAgfCAnJScgLT5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgICAgRm10X0VCQiAoQ2hhcl9saXRlcmFsICgnQCcsIGZtdF9yZXN0KSlcbiAgICAgIHwgYyAtPlxuICAgICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIChzdHJfaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBGbXRfRUJCIChGb3JtYXR0aW5nX2xpdCAoU2Nhbl9pbmRpYyBjLCBmbXRfcmVzdCkpXG5cbiAgKCogVHJ5IHRvIHJlYWQgdGhlIG9wdGlvbmFsIDxuYW1lPiBhZnRlciBcIkB7XCIgb3IgXCJAW1wiLiAqKVxuICBhbmQgcGFyc2VfdGFnIDogdHlwZSBlIGYgLiBib29sIC0+IGludCAtPiBpbnQgLT4gKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gaXNfb3Blbl90YWcgc3RyX2luZCBlbmRfaW5kIC0+XG4gICAgdHJ5XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgfCAnPCcgLT5cbiAgICAgICAgbGV0IGluZCA9IFN0cmluZy5pbmRleF9mcm9tIHN0ciAoc3RyX2luZCArIDEpICc+JyBpblxuICAgICAgICBpZiBpbmQgPj0gZW5kX2luZCB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN1Yl9zdHIgPSBTdHJpbmcuc3ViIHN0ciBzdHJfaW5kIChpbmQgLSBzdHJfaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSAoaW5kICsgMSkgZW5kX2luZCBpblxuICAgICAgICBsZXQgRm10X0VCQiBzdWJfZm10ID0gcGFyc2Ugc3RyX2luZCAoaW5kICsgMSkgaW5cbiAgICAgICAgbGV0IHN1Yl9mb3JtYXQgPSBGb3JtYXQgKHN1Yl9mbXQsIHN1Yl9zdHIpIGluXG4gICAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgICBpZiBpc19vcGVuX3RhZyB0aGVuIE9wZW5fdGFnIHN1Yl9mb3JtYXQgZWxzZSBPcGVuX2JveCBzdWJfZm9ybWF0IGluXG4gICAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfZ2VuIChmb3JtYXR0aW5nLCBmbXRfcmVzdCkpXG4gICAgICB8IF8gLT5cbiAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2Ugc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICBsZXQgc3ViX2Zvcm1hdCA9IEZvcm1hdCAoRW5kX29mX2Zvcm1hdCwgXCJcIikgaW5cbiAgICAgIGxldCBmb3JtYXR0aW5nID1cbiAgICAgICAgaWYgaXNfb3Blbl90YWcgdGhlbiBPcGVuX3RhZyBzdWJfZm9ybWF0IGVsc2UgT3Blbl9ib3ggc3ViX2Zvcm1hdCBpblxuICAgICAgRm10X0VCQiAoRm9ybWF0dGluZ19nZW4gKGZvcm1hdHRpbmcsIGZtdF9yZXN0KSlcblxuICAoKiBUcnkgdG8gcmVhZCB0aGUgb3B0aW9uYWwgPHdpZHRoIG9mZnNldD4gYWZ0ZXIgXCJAO1wiLiAqKVxuICBhbmQgcGFyc2VfZ29vZF9icmVhayA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBsZXQgbmV4dF9pbmQsIGZvcm1hdHRpbmdfbGl0ID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB8fCBzdHIuW3N0cl9pbmRdIDw+ICc8JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgbGV0IHN0cl9pbmRfMSA9IHBhcnNlX3NwYWNlcyAoc3RyX2luZCArIDEpIGVuZF9pbmQgaW5cbiAgICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXzFdIHdpdGhcbiAgICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IChcbiAgICAgICAgICBsZXQgc3RyX2luZF8yLCB3aWR0aCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8xIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIGxldCBzdHJfaW5kXzMgPSBwYXJzZV9zcGFjZXMgc3RyX2luZF8yIGVuZF9pbmQgaW5cbiAgICAgICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8zXSB3aXRoXG4gICAgICAgICAgICAgIHwgJz4nIC0+XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZC0yKSAoc3RyX2luZF8zLXN0cl9pbmQrMykgaW5cbiAgICAgICAgICAgICAgICBzdHJfaW5kXzMgKyAxLCBCcmVhayAocywgd2lkdGgsIDApXG4gICAgICAgICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgICAgICAgIGxldCBzdHJfaW5kXzQsIG9mZnNldCA9IHBhcnNlX2ludGVnZXIgc3RyX2luZF8zIGVuZF9pbmQgaW5cbiAgICAgICAgICAgICAgICBsZXQgc3RyX2luZF81ID0gcGFyc2Vfc3BhY2VzIHN0cl9pbmRfNCBlbmRfaW5kIGluXG4gICAgICAgICAgICAgICAgaWYgc3RyLltzdHJfaW5kXzVdIDw+ICc+JyB0aGVuIHJhaXNlIE5vdF9mb3VuZDtcbiAgICAgICAgICAgICAgICBsZXQgcyA9IFN0cmluZy5zdWIgc3RyIChzdHJfaW5kLTIpIChzdHJfaW5kXzUtc3RyX2luZCszKSBpblxuICAgICAgICAgICAgICAgIHN0cl9pbmRfNSArIDEsIEJyZWFrIChzLCB3aWR0aCwgb2Zmc2V0KVxuICAgICAgICAgICAgICB8IF8gLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIClcbiAgICAgICAgfCBfIC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgd2l0aCBOb3RfZm91bmQgfCBGYWlsdXJlIF8gLT5cbiAgICAgICAgc3RyX2luZCwgQnJlYWsgKFwiQDtcIiwgMSwgMClcbiAgICBpblxuICAgIGxldCBGbXRfRUJCIGZtdF9yZXN0ID0gcGFyc2UgbmV4dF9pbmQgZW5kX2luZCBpblxuICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIHRoZSBzaXplIGluIGEgPG4+LiAqKVxuICBhbmQgcGFyc2VfbWFnaWNfc2l6ZSA6IHR5cGUgZSBmIC4gaW50IC0+IGludCAtPiAoXywgXywgZSwgZikgZm10X2ViYiA9XG4gIGZ1biBzdHJfaW5kIGVuZF9pbmQgLT5cbiAgICBtYXRjaFxuICAgICAgdHJ5XG4gICAgICAgIGxldCBzdHJfaW5kXzEgPSBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kIGluXG4gICAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF8xXSB3aXRoXG4gICAgICAgIHwgJzAnIC4uICc5JyB8ICctJyAtPlxuICAgICAgICAgIGxldCBzdHJfaW5kXzIsIHNpemUgPSBwYXJzZV9pbnRlZ2VyIHN0cl9pbmRfMSBlbmRfaW5kIGluXG4gICAgICAgICAgbGV0IHN0cl9pbmRfMyA9IHBhcnNlX3NwYWNlcyBzdHJfaW5kXzIgZW5kX2luZCBpblxuICAgICAgICAgIGlmIHN0ci5bc3RyX2luZF8zXSA8PiAnPicgdGhlbiByYWlzZSBOb3RfZm91bmQ7XG4gICAgICAgICAgbGV0IHMgPSBTdHJpbmcuc3ViIHN0ciAoc3RyX2luZCAtIDIpIChzdHJfaW5kXzMgLSBzdHJfaW5kICsgMykgaW5cbiAgICAgICAgICBTb21lIChzdHJfaW5kXzMgKyAxLCBNYWdpY19zaXplIChzLCBzaXplKSlcbiAgICAgICAgfCBfIC0+IE5vbmVcbiAgICAgIHdpdGggTm90X2ZvdW5kIHwgRmFpbHVyZSBfIC0+XG4gICAgICAgIE5vbmVcbiAgICB3aXRoXG4gICAgfCBTb21lIChuZXh0X2luZCwgZm9ybWF0dGluZ19saXQpIC0+XG4gICAgICBsZXQgRm10X0VCQiBmbXRfcmVzdCA9IHBhcnNlIG5leHRfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChmb3JtYXR0aW5nX2xpdCwgZm10X3Jlc3QpKVxuICAgIHwgTm9uZSAtPlxuICAgICAgbGV0IEZtdF9FQkIgZm10X3Jlc3QgPSBwYXJzZSBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICAgIEZtdF9FQkIgKEZvcm1hdHRpbmdfbGl0IChTY2FuX2luZGljICc8JywgZm10X3Jlc3QpKVxuXG4gICgqIFBhcnNlIGFuZCBjb25zdHJ1Y3QgYSBjaGFyIHNldC4gKilcbiAgYW5kIHBhcnNlX2NoYXJfc2V0IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcblxuICAgIGxldCBjaGFyX3NldCA9IGNyZWF0ZV9jaGFyX3NldCAoKSBpblxuICAgIGxldCBhZGRfY2hhciBjID1cbiAgICAgIGFkZF9pbl9jaGFyX3NldCBjaGFyX3NldCBjO1xuICAgIGluXG4gICAgbGV0IGFkZF9yYW5nZSBjIGMnID1cbiAgICAgIGZvciBpID0gaW50X29mX2NoYXIgYyB0byBpbnRfb2ZfY2hhciBjJyBkb1xuICAgICAgICBhZGRfaW5fY2hhcl9zZXQgY2hhcl9zZXQgKGNoYXJfb2ZfaW50IGkpO1xuICAgICAgZG9uZTtcbiAgICBpblxuXG4gICAgbGV0IGZhaWxfc2luZ2xlX3BlcmNlbnQgc3RyX2luZCA9XG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6ICclJScgYWxvbmUgaXMgbm90IGFjY2VwdGVkIGluIGNoYXJhY3RlciBzZXRzLCBcXFxuICAgICAgICAgdXNlICUlJSUgaW5zdGVhZCBhdCBwb3NpdGlvbiAlZC5cIiBzdHIgc3RyX2luZFxuICAgIGluXG5cbiAgICAoKiBQYXJzZSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgY2hhciBzZXQuICopXG4gICAgbGV0IHJlYyBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIGxldCBjID0gc3RyLltzdHJfaW5kXSBpblxuICAgICAgcGFyc2VfY2hhcl9zZXRfYWZ0ZXJfY2hhciAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICAgKCogUGFyc2UgdGhlIGNvbnRlbnQgb2YgYSBjaGFyIHNldCB1bnRpbCB0aGUgZmlyc3QgJ10nLiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9jb250ZW50IHN0cl9pbmQgZW5kX2luZCA9XG4gICAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgICB8ICddJyAtPlxuICAgICAgICBzdHJfaW5kICsgMVxuICAgICAgfCAnLScgLT5cbiAgICAgICAgYWRkX2NoYXIgJy0nO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgICAgfCBjIC0+XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2FmdGVyX2NoYXIgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGNcblxuICAgICgqIFRlc3QgZm9yIHJhbmdlIGluIGNoYXIgc2V0LiAqKVxuICAgIGFuZCBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIHN0cl9pbmQgKyAxXG4gICAgICB8ICctJyAtPlxuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9taW51cyAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyB3aGVuIGMgPSAnJScgLT5cbiAgICAgICAgYWRkX2NoYXIgYyc7XG4gICAgICAgIHBhcnNlX2NoYXJfc2V0X2NvbnRlbnQgKHN0cl9pbmQgKyAxKSBlbmRfaW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGlmIGMgPSAnJScgdGhlbiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmQ7XG4gICAgICAgICgqIG5vdGUgdGhhdCAnQCcgYWxvbmUgaXMgYWNjZXB0ZWQsIGFzIGRvbmUgYnkgdGhlIGxlZ2FjeVxuICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjsgdGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWNhbGx5IHJlcXVpcmVzICVAXG4gICAgICAgICAgIHNvIHdlIGNvdWxkIHdhcm4gb24gdGhhdCAqKVxuICAgICAgICBhZGRfY2hhciBjO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9hZnRlcl9jaGFyIChzdHJfaW5kICsgMSkgZW5kX2luZCBjJ1xuXG4gICAgKCogTWFuYWdlIHJhbmdlIGluIGNoYXIgc2V0IChleGNlcHQgaWYgdGhlICctJyB0aGUgbGFzdCBjaGFyIGJlZm9yZSAnXScpICopXG4gICAgYW5kIHBhcnNlX2NoYXJfc2V0X2FmdGVyX21pbnVzIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmRdIHdpdGhcbiAgICAgIHwgJ10nIC0+XG4gICAgICAgIGFkZF9jaGFyIGM7XG4gICAgICAgIGFkZF9jaGFyICctJztcbiAgICAgICAgc3RyX2luZCArIDFcbiAgICAgIHwgJyUnIC0+XG4gICAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICBiZWdpbiBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICAgICAgfCAoJyUnIHwgJ0AnKSBhcyBjJyAtPlxuICAgICAgICAgICAgYWRkX3JhbmdlIGMgYyc7XG4gICAgICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMikgZW5kX2luZFxuICAgICAgICAgIHwgXyAtPiBmYWlsX3NpbmdsZV9wZXJjZW50IHN0cl9pbmRcbiAgICAgICAgZW5kXG4gICAgICB8IGMnIC0+XG4gICAgICAgIGFkZF9yYW5nZSBjIGMnO1xuICAgICAgICBwYXJzZV9jaGFyX3NldF9jb250ZW50IChzdHJfaW5kICsgMSkgZW5kX2luZFxuICAgIGluXG4gICAgbGV0IHN0cl9pbmQsIHJldmVyc2UgPVxuICAgICAgaWYgc3RyX2luZCA9IGVuZF9pbmQgdGhlbiB1bmV4cGVjdGVkX2VuZF9vZl9mb3JtYXQgZW5kX2luZDtcbiAgICAgIG1hdGNoIHN0ci5bc3RyX2luZF0gd2l0aFxuICAgICAgICB8ICdeJyAtPiBzdHJfaW5kICsgMSwgdHJ1ZVxuICAgICAgICB8IF8gLT4gc3RyX2luZCwgZmFsc2UgaW5cbiAgICBsZXQgbmV4dF9pbmQgPSBwYXJzZV9jaGFyX3NldF9zdGFydCBzdHJfaW5kIGVuZF9pbmQgaW5cbiAgICBsZXQgY2hhcl9zZXQgPSBmcmVlemVfY2hhcl9zZXQgY2hhcl9zZXQgaW5cbiAgICBuZXh0X2luZCwgKGlmIHJldmVyc2UgdGhlbiByZXZfY2hhcl9zZXQgY2hhcl9zZXQgZWxzZSBjaGFyX3NldClcblxuICAoKiBDb25zdW1lIGFsbCBuZXh0IHNwYWNlcywgcmFpc2UgYW4gRmFpbHVyZSBpZiBlbmRfaW5kIGlzIHJlYWNoZWQuICopXG4gIGFuZCBwYXJzZV9zcGFjZXMgc3RyX2luZCBlbmRfaW5kID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgIGlmIHN0ci5bc3RyX2luZF0gPSAnICcgdGhlbiBwYXJzZV9zcGFjZXMgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIGVsc2Ugc3RyX2luZFxuXG4gICgqIFJlYWQgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZyb20gdGhlIHN0cmluZywgcmFpc2UgYSBGYWlsdXJlIGlmIGVuZF9pbmQgaXNcbiAgICAgcmVhY2hlZC4gKilcbiAgYW5kIHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCBhY2MgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICAgIGxldCBuZXdfYWNjID0gYWNjICogMTAgKyAoaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJykgaW5cbiAgICAgIGlmIG5ld19hY2MgPiBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgICAgXCJpbnZhbGlkIGZvcm1hdCAlUzogaW50ZWdlciAlZCBpcyBncmVhdGVyIHRoYW4gdGhlIGxpbWl0ICVkXCJcbiAgICAgICAgICBzdHIgbmV3X2FjYyBTeXMubWF4X3N0cmluZ19sZW5ndGhcbiAgICAgIGVsc2VcbiAgICAgICAgcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIG5ld19hY2NcbiAgICB8IF8gLT4gc3RyX2luZCwgYWNjXG5cbiAgKCogUmVhZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgZnJvbSB0aGUgc3RyaW5nLCByYWlzZSBhIEZhaWx1cmVcbiAgICAgaWYgZW5kX2luZCBpcyByZWFjaGVkLiAqKVxuICBhbmQgcGFyc2VfaW50ZWdlciBzdHJfaW5kIGVuZF9pbmQgPVxuICAgIGlmIHN0cl9pbmQgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnMCcgLi4gJzknIC0+IHBhcnNlX3Bvc2l0aXZlIHN0cl9pbmQgZW5kX2luZCAwXG4gICAgfCAnLScgLT4gKFxuICAgICAgaWYgc3RyX2luZCArIDEgPSBlbmRfaW5kIHRoZW4gdW5leHBlY3RlZF9lbmRfb2ZfZm9ybWF0IGVuZF9pbmQ7XG4gICAgICBtYXRjaCBzdHIuW3N0cl9pbmQgKyAxXSB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgLT5cbiAgICAgICAgbGV0IG5leHRfaW5kLCBuID0gcGFyc2VfcG9zaXRpdmUgKHN0cl9pbmQgKyAxKSBlbmRfaW5kIDAgaW5cbiAgICAgICAgbmV4dF9pbmQsIC1uXG4gICAgICB8IGMgLT5cbiAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJkaWdpdFwiIGNcbiAgICApXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG4gICgqIEFkZCBhIGxpdGVyYWwgdG8gYSBmb3JtYXQgZnJvbSBhIGxpdGVyYWwgY2hhcmFjdGVyIHN1Yi1zZXF1ZW5jZS4gKilcbiAgYW5kIGFkZF9saXRlcmFsIDogdHlwZSBhIGQgZSBmIC5cbiAgICAgIGludCAtPiBpbnQgLT4gKGEsIF8sIF8sIGQsIGUsIGYpIGZtdCAtPlxuICAgICAgKF8sIF8sIGUsIGYpIGZtdF9lYmIgPVxuICBmdW4gbGl0X3N0YXJ0IHN0cl9pbmQgZm10IC0+IG1hdGNoIHN0cl9pbmQgLSBsaXRfc3RhcnQgd2l0aFxuICAgIHwgMCAgICAtPiBGbXRfRUJCIGZtdFxuICAgIHwgMSAgICAtPiBGbXRfRUJCIChDaGFyX2xpdGVyYWwgKHN0ci5bbGl0X3N0YXJ0XSwgZm10KSlcbiAgICB8IHNpemUgLT4gRm10X0VCQiAoU3RyaW5nX2xpdGVyYWwgKFN0cmluZy5zdWIgc3RyIGxpdF9zdGFydCBzaXplLCBmbXQpKVxuXG4gICgqIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN1Yi1mb3JtYXRcbiAgICAgKGkuZS4gdGhlIGNvcnJlc3BvbmRpbmcgXCIlfVwiIG9yIFwiJSlcIikgKilcbiAgYW5kIHNlYXJjaF9zdWJmb3JtYXRfZW5kIHN0cl9pbmQgZW5kX2luZCBjID1cbiAgICBpZiBzdHJfaW5kID0gZW5kX2luZCB0aGVuXG4gICAgICBmYWlsd2l0aF9tZXNzYWdlXG4gICAgICAgIFwiaW52YWxpZCBmb3JtYXQgJVM6IHVuY2xvc2VkIHN1Yi1mb3JtYXQsIFxcXG4gICAgICAgICBleHBlY3RlZCBcXFwiJSUlY1xcXCIgYXQgY2hhcmFjdGVyIG51bWJlciAlZFwiIHN0ciBjIGVuZF9pbmQ7XG4gICAgbWF0Y2ggc3RyLltzdHJfaW5kXSB3aXRoXG4gICAgfCAnJScgLT5cbiAgICAgIGlmIHN0cl9pbmQgKyAxID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgaWYgc3RyLltzdHJfaW5kICsgMV0gPSBjIHRoZW4gKCogRW5kIG9mIGZvcm1hdCBmb3VuZCAqKSBzdHJfaW5kIGVsc2VcbiAgICAgICAgYmVnaW4gbWF0Y2ggc3RyLltzdHJfaW5kICsgMV0gd2l0aFxuICAgICAgICB8ICdfJyAtPlxuICAgICAgICAgICgqIFNlYXJjaCBmb3IgXCIlXyhcIiBvciBcIiVfe1wiLiAqKVxuICAgICAgICAgIGlmIHN0cl9pbmQgKyAyID0gZW5kX2luZCB0aGVuIHVuZXhwZWN0ZWRfZW5kX29mX2Zvcm1hdCBlbmRfaW5kO1xuICAgICAgICAgIGJlZ2luIG1hdGNoIHN0ci5bc3RyX2luZCArIDJdIHdpdGhcbiAgICAgICAgICB8ICd7JyAtPlxuICAgICAgICAgICAgbGV0IHN1Yl9lbmQgPSBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDMpIGVuZF9pbmQgJ30nIGluXG4gICAgICAgICAgICBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3ViX2VuZCArIDIpIGVuZF9pbmQgY1xuICAgICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgICBsZXQgc3ViX2VuZCA9IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCAnKScgaW5cbiAgICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgICAgfCBfIC0+IHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMykgZW5kX2luZCBjXG4gICAgICAgICAgZW5kXG4gICAgICAgIHwgJ3snIC0+XG4gICAgICAgICAgKCogJXsuLi4lfSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICd9JyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJygnIC0+XG4gICAgICAgICAgKCogJSguLi4lKSBzdWItZm9ybWF0IGZvdW5kLiAqKVxuICAgICAgICAgIGxldCBzdWJfZW5kID0gc2VhcmNoX3N1YmZvcm1hdF9lbmQgKHN0cl9pbmQgKyAyKSBlbmRfaW5kICcpJyBpblxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdWJfZW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIHwgJ30nIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICUoLi4uJX0uICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJyknXCIgJ30nXG4gICAgICAgIHwgJyknIC0+XG4gICAgICAgICAgKCogRXJyb3I6ICV7Li4uJSkuICopXG4gICAgICAgICAgZXhwZWN0ZWRfY2hhcmFjdGVyIChzdHJfaW5kICsgMSkgXCJjaGFyYWN0ZXIgJ30nXCIgJyknXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgIHNlYXJjaF9zdWJmb3JtYXRfZW5kIChzdHJfaW5kICsgMikgZW5kX2luZCBjXG4gICAgICAgIGVuZFxuICAgIHwgXyAtPiBzZWFyY2hfc3ViZm9ybWF0X2VuZCAoc3RyX2luZCArIDEpIGVuZF9pbmQgY1xuXG4gICgqIENoZWNrIGlmIHN5bWIgaXMgYSB2YWxpZCBpbnQgY29udmVyc2lvbiBhZnRlciBcIiVsXCIsIFwiJW5cIiBvciBcIiVMXCIgKilcbiAgYW5kIGlzX2ludF9iYXNlIHN5bWIgPSBtYXRjaCBzeW1iIHdpdGhcbiAgICB8ICdkJyB8ICdpJyB8ICd4JyB8ICdYJyB8ICdvJyB8ICd1JyAtPiB0cnVlXG4gICAgfCBfIC0+IGZhbHNlXG5cbiAgKCogQ29udmVydCBhIGNoYXIgKGwsIG4gb3IgTCkgdG8gaXRzIGFzc29jaWF0ZWQgY291bnRlci4gKilcbiAgYW5kIGNvdW50ZXJfb2ZfY2hhciBzeW1iID0gbWF0Y2ggc3ltYiB3aXRoXG4gICAgfCAnbCcgLT4gTGluZV9jb3VudGVyICB8ICduJyAtPiBDaGFyX2NvdW50ZXJcbiAgICB8ICdMJyAtPiBUb2tlbl9jb3VudGVyIHwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzeW1iKSB0byBpdHMgYXNzb2NpYXRlZCBpbnRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBzcGFjZSBzeW1iID1cbiAgICBtYXRjaCBwbHVzLCBoYXNoLCBzcGFjZSwgc3ltYiB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnZCcgLT4gSW50X2QgIHwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgJ2knIC0+IEludF9pXG4gICAgfCBmYWxzZSwgZmFsc2UsICB0cnVlLCAnZCcgLT4gSW50X3NkIHwgZmFsc2UsIGZhbHNlLCAgdHJ1ZSwgJ2knIC0+IEludF9zaVxuICAgIHwgIHRydWUsIGZhbHNlLCBmYWxzZSwgJ2QnIC0+IEludF9wZCB8ICB0cnVlLCBmYWxzZSwgZmFsc2UsICdpJyAtPiBJbnRfcGlcbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd4JyAtPiBJbnRfeCAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnWCcgLT4gSW50X1hcbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICd4JyAtPiBJbnRfQ3ggfCBmYWxzZSwgIHRydWUsIGZhbHNlLCAnWCcgLT4gSW50X0NYXG4gICAgfCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAnbycgLT4gSW50X29cbiAgICB8IGZhbHNlLCAgdHJ1ZSwgZmFsc2UsICdvJyAtPiBJbnRfQ29cbiAgICB8IGZhbHNlLCBmYWxzZSwgZmFsc2UsICd1JyAtPiBJbnRfdVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2QnIC0+IEludF9DZFxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ2knIC0+IEludF9DaVxuICAgIHwgZmFsc2UsICB0cnVlLCBmYWxzZSwgJ3UnIC0+IEludF9DdVxuICAgIHwgXywgdHJ1ZSwgXywgJ3gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DeFxuICAgIHwgXywgdHJ1ZSwgXywgJ1gnIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9DWFxuICAgIHwgXywgdHJ1ZSwgXywgJ28nIHdoZW4gbGVnYWN5X2JlaGF2aW9yIC0+IEludF9Db1xuICAgIHwgXywgdHJ1ZSwgXywgKCdkJyB8ICdpJyB8ICd1JykgLT5cbiAgICAgIGlmIGxlZ2FjeV9iZWhhdmlvciB0aGVuICgqIGlnbm9yZSAqKVxuICAgICAgICBjb21wdXRlX2ludF9jb252IHBjdF9pbmQgc3RyX2luZCBwbHVzIGZhbHNlIHNwYWNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kIHN5bWIgXCInIydcIlxuICAgIHwgdHJ1ZSwgXywgdHJ1ZSwgXyAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW5cbiAgICAgICAgKCogcGx1cyBhbmQgc3BhY2U6IGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBwcmVmZXJzIHBsdXMgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIGZhbHNlIHN5bWJcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiXG4gICAgfCBmYWxzZSwgXywgdHJ1ZSwgXyAgICAtPlxuICAgICAgaWYgbGVnYWN5X2JlaGF2aW9yIHRoZW4gKCogaWdub3JlICopXG4gICAgICAgIGNvbXB1dGVfaW50X2NvbnYgcGN0X2luZCBzdHJfaW5kIHBsdXMgaGFzaCBmYWxzZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJyAnXCJcbiAgICB8IHRydWUsIF8sIGZhbHNlLCBfICAgIC0+XG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiAoKiBpZ25vcmUgKilcbiAgICAgICAgY29tcHV0ZV9pbnRfY29udiBwY3RfaW5kIHN0cl9pbmQgZmFsc2UgaGFzaCBzcGFjZSBzeW1iXG4gICAgICBlbHNlIGluY29tcGF0aWJsZV9mbGFnIHBjdF9pbmQgc3RyX2luZCBzeW1iIFwiJysnXCJcbiAgICB8IGZhbHNlLCBfLCBmYWxzZSwgXyAtPiBhc3NlcnQgZmFsc2VcblxuICAoKiBDb252ZXJ0IChwbHVzLCBzcGFjZSwgc3ltYikgdG8gaXRzIGFzc29jaWF0ZWQgZmxvYXRfY29udi4gKilcbiAgYW5kIGNvbXB1dGVfZmxvYXRfY29udiBwY3RfaW5kIHN0cl9pbmQgcGx1cyBoYXNoIHNwYWNlIHN5bWIgPVxuICAgIGxldCBmbGFnID0gbWF0Y2ggcGx1cywgc3BhY2Ugd2l0aFxuICAgIHwgZmFsc2UsIGZhbHNlIC0+IEZsb2F0X2ZsYWdfXG4gICAgfCBmYWxzZSwgIHRydWUgLT4gRmxvYXRfZmxhZ19zXG4gICAgfCAgdHJ1ZSwgZmFsc2UgLT4gRmxvYXRfZmxhZ19wXG4gICAgfCAgdHJ1ZSwgIHRydWUgLT5cbiAgICAgICgqIHBsdXMgYW5kIHNwYWNlOiBsZWdhY3kgaW1wbGVtZW50YXRpb24gcHJlZmVycyBwbHVzICopXG4gICAgICBpZiBsZWdhY3lfYmVoYXZpb3IgdGhlbiBGbG9hdF9mbGFnX3BcbiAgICAgIGVsc2UgaW5jb21wYXRpYmxlX2ZsYWcgcGN0X2luZCBzdHJfaW5kICcgJyBcIicrJ1wiIGluXG4gICAgbGV0IGtpbmQgPSBtYXRjaCBoYXNoLCBzeW1iIHdpdGhcbiAgICB8IF8sICdmJyAtPiBGbG9hdF9mXG4gICAgfCBfLCAnZScgLT4gRmxvYXRfZVxuICAgIHwgXywgJ0UnIC0+IEZsb2F0X0VcbiAgICB8IF8sICdnJyAtPiBGbG9hdF9nXG4gICAgfCBfLCAnRycgLT4gRmxvYXRfR1xuICAgIHwgXywgJ2gnIC0+IEZsb2F0X2hcbiAgICB8IF8sICdIJyAtPiBGbG9hdF9IXG4gICAgfCBmYWxzZSwgJ0YnIC0+IEZsb2F0X0ZcbiAgICB8IHRydWUsICdGJyAtPiBGbG9hdF9DRlxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgaW5cbiAgICBmbGFnLCBraW5kXG5cbiAgKCogUmFpc2UgW0ZhaWx1cmVdIHdpdGggYSBmcmllbmRseSBlcnJvciBtZXNzYWdlIGFib3V0IGluY29tcGF0aWJsZSBvcHRpb25zLiopXG4gIGFuZCBpbmNvbXBhdGlibGVfZmxhZyA6IHR5cGUgYSAuIGludCAtPiBpbnQgLT4gY2hhciAtPiBzdHJpbmcgLT4gYSA9XG4gICAgZnVuIHBjdF9pbmQgc3RyX2luZCBzeW1iIG9wdGlvbiAtPlxuICAgICAgbGV0IHN1YmZtdCA9IFN0cmluZy5zdWIgc3RyIHBjdF9pbmQgKHN0cl9pbmQgLSBwY3RfaW5kKSBpblxuICAgICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgICBcImludmFsaWQgZm9ybWF0ICVTOiBhdCBjaGFyYWN0ZXIgbnVtYmVyICVkLCBcXFxuICAgICAgICAgJXMgaXMgaW5jb21wYXRpYmxlIHdpdGggJyVjJyBpbiBzdWItZm9ybWF0ICVTXCJcbiAgICAgICAgc3RyIHBjdF9pbmQgb3B0aW9uIHN5bWIgc3ViZm10XG5cbiAgaW4gcGFyc2UgMCAoU3RyaW5nLmxlbmd0aCBzdHIpXG5cbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4gICAgICAgICAgICAgICAgICAoKiBHdWFyZGVkIHN0cmluZyB0byBmb3JtYXQgY29udmVyc2lvbnMgKilcblxuKCogQ29udmVydCBhIHN0cmluZyB0byBhIGZvcm1hdCBhY2NvcmRpbmcgdG8gYW4gZm10dHkuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2ZtdHR5IHN0ciBmbXR0eSA9XG4gIGxldCBGbXRfRUJCIGZtdCA9IGZtdF9lYmJfb2Zfc3RyaW5nIHN0ciBpblxuICB0cnkgRm9ybWF0ICh0eXBlX2Zvcm1hdCBmbXQgZm10dHksIHN0cilcbiAgd2l0aCBUeXBlX21pc21hdGNoIC0+XG4gICAgZmFpbHdpdGhfbWVzc2FnZVxuICAgICAgXCJiYWQgaW5wdXQ6IGZvcm1hdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gJVMgYW5kICVTXCJcbiAgICAgIHN0ciAoc3RyaW5nX29mX2ZtdHR5IGZtdHR5KVxuXG4oKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBhbiBvdGhlciBmb3JtYXQuICopXG4oKiBSYWlzZSBbRmFpbHVyZV0gd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIGNhc2Ugb2YgdHlwZSBtaXNtYXRjaC4gKilcbmxldCBmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCBzdHIgKEZvcm1hdCAoZm10Jywgc3RyJykpID1cbiAgbGV0IEZtdF9FQkIgZm10ID0gZm10X2ViYl9vZl9zdHJpbmcgc3RyIGluXG4gIHRyeSBGb3JtYXQgKHR5cGVfZm9ybWF0IGZtdCAoZm10dHlfb2ZfZm10IGZtdCcpLCBzdHIpXG4gIHdpdGggVHlwZV9taXNtYXRjaCAtPlxuICAgIGZhaWx3aXRoX21lc3NhZ2VcbiAgICAgIFwiYmFkIGlucHV0OiBmb3JtYXQgdHlwZSBtaXNtYXRjaCBiZXR3ZWVuICVTIGFuZCAlU1wiIHN0ciBzdHInXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIFhhdmllciBMZXJveSBhbmQgUGllcnJlIFdlaXMsIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0QmFzaWNzXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdFxuXG5sZXQga2ZwcmludGYgayBvIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGYgKGZ1biBhY2MgLT4gb3V0cHV0X2FjYyBvIGFjYzsgayBvKSBFbmRfb2ZfYWNjIGZtdFxubGV0IGticHJpbnRmIGsgYiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmIChmdW4gYWNjIC0+IGJ1ZnB1dF9hY2MgYiBhY2M7IGsgYikgRW5kX29mX2FjYyBmbXRcbmxldCBpa2ZwcmludGYgayBvYyAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfaXByaW50ZiBrIG9jIGZtdFxubGV0IGlrYnByaW50ZiA9IGlrZnByaW50ZlxuXG5sZXQgZnByaW50ZiBvYyBmbXQgPSBrZnByaW50ZiBpZ25vcmUgb2MgZm10XG5sZXQgYnByaW50ZiBiIGZtdCA9IGticHJpbnRmIGlnbm9yZSBiIGZtdFxubGV0IGlmcHJpbnRmIG9jIGZtdCA9IGlrZnByaW50ZiBpZ25vcmUgb2MgZm10XG5sZXQgaWJwcmludGYgYiBmbXQgPSBpa2JwcmludGYgaWdub3JlIGIgZm10XG5sZXQgcHJpbnRmIGZtdCA9IGZwcmludGYgc3Rkb3V0IGZtdFxubGV0IGVwcmludGYgZm10ID0gZnByaW50ZiBzdGRlcnIgZm10XG5cbmxldCBrc3ByaW50ZiBrIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbGV0IGsnIGFjYyA9XG4gICAgbGV0IGJ1ZiA9IEJ1ZmZlci5jcmVhdGUgNjQgaW5cbiAgICBzdHJwdXRfYWNjIGJ1ZiBhY2M7XG4gICAgayAoQnVmZmVyLmNvbnRlbnRzIGJ1ZikgaW5cbiAgbWFrZV9wcmludGYgaycgRW5kX29mX2FjYyBmbXRcblxubGV0IHNwcmludGYgZm10ID0ga3NwcmludGYgKGZ1biBzIC0+IHMpIGZtdFxuXG5sZXQga3ByaW50ZiA9IGtzcHJpbnRmXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUga2V5ID0gc3RyaW5nXG50eXBlIGRvYyA9IHN0cmluZ1xudHlwZSB1c2FnZV9tc2cgPSBzdHJpbmdcbnR5cGUgYW5vbl9mdW4gPSAoc3RyaW5nIC0+IHVuaXQpXG5cbnR5cGUgc3BlYyA9XG4gIHwgVW5pdCBvZiAodW5pdCAtPiB1bml0KSAgICAgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB1bml0IGFyZ3VtZW50ICopXG4gIHwgQm9vbCBvZiAoYm9vbCAtPiB1bml0KSAgICAgKCogQ2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBhIGJvb2wgYXJndW1lbnQgKilcbiAgfCBTZXQgb2YgYm9vbCByZWYgICAgICAgICAgICAoKiBTZXQgdGhlIHJlZmVyZW5jZSB0byB0cnVlICopXG4gIHwgQ2xlYXIgb2YgYm9vbCByZWYgICAgICAgICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gZmFsc2UgKilcbiAgfCBTdHJpbmcgb2YgKHN0cmluZyAtPiB1bml0KSAoKiBDYWxsIHRoZSBmdW5jdGlvbiB3aXRoIGEgc3RyaW5nIGFyZ3VtZW50ICopXG4gIHwgU2V0X3N0cmluZyBvZiBzdHJpbmcgcmVmICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIHN0cmluZyBhcmd1bWVudCAqKVxuICB8IEludCBvZiAoaW50IC0+IHVuaXQpICAgICAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYW4gaW50IGFyZ3VtZW50ICopXG4gIHwgU2V0X2ludCBvZiBpbnQgcmVmICAgICAgICAgKCogU2V0IHRoZSByZWZlcmVuY2UgdG8gdGhlIGludCBhcmd1bWVudCAqKVxuICB8IEZsb2F0IG9mIChmbG9hdCAtPiB1bml0KSAgICgqIENhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYSBmbG9hdCBhcmd1bWVudCAqKVxuICB8IFNldF9mbG9hdCBvZiBmbG9hdCByZWYgICAgICgqIFNldCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmbG9hdCBhcmd1bWVudCAqKVxuICB8IFR1cGxlIG9mIHNwZWMgbGlzdCAgICAgICAgICgqIFRha2Ugc2V2ZXJhbCBhcmd1bWVudHMgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWMgbGlzdCAqKVxuICB8IFN5bWJvbCBvZiBzdHJpbmcgbGlzdCAqIChzdHJpbmcgLT4gdW5pdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBUYWtlIG9uZSBvZiB0aGUgc3ltYm9scyBhcyBhcmd1bWVudCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzeW1ib2wuICopXG4gIHwgUmVzdCBvZiAoc3RyaW5nIC0+IHVuaXQpICAgKCogU3RvcCBpbnRlcnByZXRpbmcga2V5d29yZHMgYW5kIGNhbGwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2l0aCBlYWNoIHJlbWFpbmluZyBhcmd1bWVudCAqKVxuICB8IFJlc3RfYWxsIG9mIChzdHJpbmcgbGlzdCAtPiB1bml0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqIFN0b3AgaW50ZXJwcmV0aW5nIGtleXdvcmRzIGFuZCBjYWxsIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdpdGggYWxsIHJlbWFpbmluZyBhcmd1bWVudHMuICopXG4gIHwgRXhwYW5kIG9mIChzdHJpbmcgLT4gc3RyaW5nIGFycmF5KSAoKiBJZiB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyB0byBwcm9jZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgb2YgdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbXCItZm9vXCI7IFwiYXJnXCJdIEAgcmVzdF0gd2hlcmUgXCJmb29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVnaXN0ZXJlZCBhcyBbRXhwYW5kIGZdLCB0aGVuIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIFtmIFwiYXJnXCIgQCByZXN0XSBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC4gT25seSBhbGxvd2VkIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNdLiAqKVxuXG5leGNlcHRpb24gQmFkIG9mIHN0cmluZ1xuZXhjZXB0aW9uIEhlbHAgb2Ygc3RyaW5nXG5cbnR5cGUgZXJyb3IgPVxuICB8IFVua25vd24gb2Ygc3RyaW5nXG4gIHwgV3Jvbmcgb2Ygc3RyaW5nICogc3RyaW5nICogc3RyaW5nICAoKiBvcHRpb24sIGFjdHVhbCwgZXhwZWN0ZWQgKilcbiAgfCBNaXNzaW5nIG9mIHN0cmluZ1xuICB8IE1lc3NhZ2Ugb2Ygc3RyaW5nXG5cbmV4Y2VwdGlvbiBTdG9wIG9mIGVycm9yICgqIHVzZWQgaW50ZXJuYWxseSAqKVxuXG5vcGVuIFByaW50ZlxuXG5sZXQgcmVjIGFzc29jMyB4IGwgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiByYWlzZSBOb3RfZm91bmRcbiAgfCAoeTEsIHkyLCBfKSA6OiBfIHdoZW4geTEgPSB4IC0+IHkyXG4gIHwgXyA6OiB0IC0+IGFzc29jMyB4IHRcblxuXG5sZXQgc3BsaXQgcyA9XG4gIGxldCBpID0gU3RyaW5nLmluZGV4IHMgJz0nIGluXG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgU3RyaW5nLnN1YiBzIDAgaSwgU3RyaW5nLnN1YiBzIChpKzEpIChsZW4tKGkrMSkpXG5cblxubGV0IG1ha2Vfc3ltbGlzdCBwcmVmaXggc2VwIHN1ZmZpeCBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gXCI8bm9uZT5cIlxuICB8IGg6OnQgLT4gKExpc3QuZm9sZF9sZWZ0IChmdW4geCB5IC0+IHggXiBzZXAgXiB5KSAocHJlZml4IF4gaCkgdCkgXiBzdWZmaXhcblxuXG5sZXQgcHJpbnRfc3BlYyBidWYgKGtleSwgc3BlYywgZG9jKSA9XG4gIGlmIFN0cmluZy5sZW5ndGggZG9jID4gMCB0aGVuXG4gICAgbWF0Y2ggc3BlYyB3aXRoXG4gICAgfCBTeW1ib2wgKGwsIF8pIC0+XG4gICAgICAgIGJwcmludGYgYnVmIFwiICAlcyAlcyVzXFxuXCIga2V5IChtYWtlX3N5bWxpc3QgXCJ7XCIgXCJ8XCIgXCJ9XCIgbCkgZG9jXG4gICAgfCBfIC0+XG4gICAgICAgIGJwcmludGYgYnVmIFwiICAlcyAlc1xcblwiIGtleSBkb2NcblxuXG5sZXQgaGVscF9hY3Rpb24gKCkgPSByYWlzZSAoU3RvcCAoVW5rbm93biBcIi1oZWxwXCIpKVxuXG5sZXQgYWRkX2hlbHAgc3BlY2xpc3QgPVxuICBsZXQgYWRkMSA9XG4gICAgdHJ5IGlnbm9yZSAoYXNzb2MzIFwiLWhlbHBcIiBzcGVjbGlzdCk7IFtdXG4gICAgd2l0aCBOb3RfZm91bmQgLT5cbiAgICAgICAgICAgIFtcIi1oZWxwXCIsIFVuaXQgaGVscF9hY3Rpb24sIFwiIERpc3BsYXkgdGhpcyBsaXN0IG9mIG9wdGlvbnNcIl1cbiAgYW5kIGFkZDIgPVxuICAgIHRyeSBpZ25vcmUgKGFzc29jMyBcIi0taGVscFwiIHNwZWNsaXN0KTsgW11cbiAgICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgICAgICAgICAgW1wiLS1oZWxwXCIsIFVuaXQgaGVscF9hY3Rpb24sIFwiIERpc3BsYXkgdGhpcyBsaXN0IG9mIG9wdGlvbnNcIl1cbiAgaW5cbiAgc3BlY2xpc3QgQCAoYWRkMSBAIGFkZDIpXG5cblxubGV0IHVzYWdlX2IgYnVmIHNwZWNsaXN0IGVycm1zZyA9XG4gIGJwcmludGYgYnVmIFwiJXNcXG5cIiBlcnJtc2c7XG4gIExpc3QuaXRlciAocHJpbnRfc3BlYyBidWYpIChhZGRfaGVscCBzcGVjbGlzdClcblxuXG5sZXQgdXNhZ2Vfc3RyaW5nIHNwZWNsaXN0IGVycm1zZyA9XG4gIGxldCBiID0gQnVmZmVyLmNyZWF0ZSAyMDAgaW5cbiAgdXNhZ2VfYiBiIHNwZWNsaXN0IGVycm1zZztcbiAgQnVmZmVyLmNvbnRlbnRzIGJcblxuXG5sZXQgdXNhZ2Ugc3BlY2xpc3QgZXJybXNnID1cbiAgZXByaW50ZiBcIiVzXCIgKHVzYWdlX3N0cmluZyBzcGVjbGlzdCBlcnJtc2cpXG5cblxubGV0IGN1cnJlbnQgPSByZWYgMFxuXG5sZXQgYm9vbF9vZl9zdHJpbmdfb3B0IHggPVxuICB0cnkgU29tZSAoYm9vbF9vZl9zdHJpbmcgeClcbiAgd2l0aCBJbnZhbGlkX2FyZ3VtZW50IF8gLT4gTm9uZVxuXG5sZXQgaW50X29mX3N0cmluZ19vcHQgeCA9XG4gIHRyeSBTb21lIChpbnRfb2Zfc3RyaW5nIHgpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxubGV0IGZsb2F0X29mX3N0cmluZ19vcHQgeCA9XG4gIHRyeSBTb21lIChmbG9hdF9vZl9zdHJpbmcgeClcbiAgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZVxuXG5sZXQgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNfYXV4IGFsbG93X2V4cGFuZCBjdXJyZW50IGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgPVxuICBsZXQgaW5pdHBvcyA9ICFjdXJyZW50IGluXG4gIGxldCBjb252ZXJ0X2Vycm9yIGVycm9yID1cbiAgICAoKiBjb252ZXJ0IGFuIGludGVybmFsIGVycm9yIHRvIGEgQmFkL0hlbHAgZXhjZXB0aW9uXG4gICAgICAgKm9yKiBhZGQgdGhlIHByb2dyYW0gbmFtZSBhcyBhIHByZWZpeCBhbmQgdGhlIHVzYWdlIG1lc3NhZ2UgYXMgYSBzdWZmaXhcbiAgICAgICB0byBhbiB1c2VyLXJhaXNlZCBCYWQgZXhjZXB0aW9uLlxuICAgICopXG4gICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIDIwMCBpblxuICAgIGxldCBwcm9nbmFtZSA9XG4gICAgICBpZiBpbml0cG9zIDwgKEFycmF5Lmxlbmd0aCAhYXJndikgdGhlbiAhYXJndi4oaW5pdHBvcykgZWxzZSBcIig/KVwiIGluXG4gICAgYmVnaW4gbWF0Y2ggZXJyb3Igd2l0aFxuICAgICAgfCBVbmtub3duIFwiLWhlbHBcIiAtPiAoKVxuICAgICAgfCBVbmtub3duIFwiLS1oZWxwXCIgLT4gKClcbiAgICAgIHwgVW5rbm93biBzIC0+XG4gICAgICAgICAgYnByaW50ZiBiIFwiJXM6IHVua25vd24gb3B0aW9uICclcycuXFxuXCIgcHJvZ25hbWUgc1xuICAgICAgfCBNaXNzaW5nIHMgLT5cbiAgICAgICAgICBicHJpbnRmIGIgXCIlczogb3B0aW9uICclcycgbmVlZHMgYW4gYXJndW1lbnQuXFxuXCIgcHJvZ25hbWUgc1xuICAgICAgfCBXcm9uZyAob3B0LCBhcmcsIGV4cGVjdGVkKSAtPlxuICAgICAgICAgIGJwcmludGYgYiBcIiVzOiB3cm9uZyBhcmd1bWVudCAnJXMnOyBvcHRpb24gJyVzJyBleHBlY3RzICVzLlxcblwiXG4gICAgICAgICAgICAgICAgICBwcm9nbmFtZSBhcmcgb3B0IGV4cGVjdGVkXG4gICAgICB8IE1lc3NhZ2UgcyAtPiAoKiB1c2VyIGVycm9yIG1lc3NhZ2UgKilcbiAgICAgICAgICBicHJpbnRmIGIgXCIlczogJXMuXFxuXCIgcHJvZ25hbWUgc1xuICAgIGVuZDtcbiAgICB1c2FnZV9iIGIgIXNwZWNsaXN0IGVycm1zZztcbiAgICBpZiBlcnJvciA9IFVua25vd24gXCItaGVscFwiIHx8IGVycm9yID0gVW5rbm93biBcIi0taGVscFwiXG4gICAgdGhlbiBIZWxwIChCdWZmZXIuY29udGVudHMgYilcbiAgICBlbHNlIEJhZCAoQnVmZmVyLmNvbnRlbnRzIGIpXG4gIGluXG4gIGluY3IgY3VycmVudDtcbiAgd2hpbGUgIWN1cnJlbnQgPCAoQXJyYXkubGVuZ3RoICFhcmd2KSBkb1xuICAgIGJlZ2luIHRyeVxuICAgICAgbGV0IHMgPSAhYXJndi4oIWN1cnJlbnQpIGluXG4gICAgICBpZiBTdHJpbmcubGVuZ3RoIHMgPj0gMSAmJiBzLlswXSA9ICctJyB0aGVuIGJlZ2luXG4gICAgICAgIGxldCBhY3Rpb24sIGZvbGxvdyA9XG4gICAgICAgICAgdHJ5IGFzc29jMyBzICFzcGVjbGlzdCwgTm9uZVxuICAgICAgICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgICAgdHJ5XG4gICAgICAgICAgICBsZXQga2V5d29yZCwgYXJnID0gc3BsaXQgcyBpblxuICAgICAgICAgICAgYXNzb2MzIGtleXdvcmQgIXNwZWNsaXN0LCBTb21lIGFyZ1xuICAgICAgICAgIHdpdGggTm90X2ZvdW5kIC0+IHJhaXNlIChTdG9wIChVbmtub3duIHMpKVxuICAgICAgICBpblxuICAgICAgICBsZXQgbm9fYXJnICgpID1cbiAgICAgICAgICBtYXRjaCBmb2xsb3cgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBhcmcgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwibm8gYXJndW1lbnRcIikpKSBpblxuICAgICAgICBsZXQgZ2V0X2FyZyAoKSA9XG4gICAgICAgICAgbWF0Y2ggZm9sbG93IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgaWYgIWN1cnJlbnQgKyAxIDwgKEFycmF5Lmxlbmd0aCAhYXJndikgdGhlbiAhYXJndi4oIWN1cnJlbnQgKyAxKVxuICAgICAgICAgICAgICBlbHNlIHJhaXNlIChTdG9wIChNaXNzaW5nIHMpKVxuICAgICAgICAgIHwgU29tZSBhcmcgLT4gYXJnXG4gICAgICAgIGluXG4gICAgICAgIGxldCBjb25zdW1lX2FyZyAoKSA9XG4gICAgICAgICAgbWF0Y2ggZm9sbG93IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gaW5jciBjdXJyZW50XG4gICAgICAgICAgfCBTb21lIF8gLT4gKClcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IHJlYyB0cmVhdF9hY3Rpb24gPSBmdW5jdGlvblxuICAgICAgICB8IFVuaXQgZiAtPiBub19hcmcgKCk7IGYgKCk7XG4gICAgICAgIHwgQm9vbCBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggYm9vbF9vZl9zdHJpbmdfb3B0IGFyZyB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gcmFpc2UgKFN0b3AgKFdyb25nIChzLCBhcmcsIFwiYSBib29sZWFuXCIpKSlcbiAgICAgICAgICAgIHwgU29tZSBzIC0+IGYgc1xuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgU2V0IHIgLT4gbm9fYXJnICgpOyByIDo9IHRydWU7XG4gICAgICAgIHwgQ2xlYXIgciAtPiBub19hcmcgKCk7IHIgOj0gZmFsc2U7XG4gICAgICAgIHwgU3RyaW5nIGYgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBmIGFyZztcbiAgICAgICAgICAgIGNvbnN1bWVfYXJnICgpO1xuICAgICAgICB8IFN5bWJvbCAoc3ltYiwgZikgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBpZiBMaXN0Lm1lbSBhcmcgc3ltYiB0aGVuIGJlZ2luXG4gICAgICAgICAgICAgIGYgYXJnO1xuICAgICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgICAgIGVuZCBlbHNlIGJlZ2luXG4gICAgICAgICAgICAgIHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcIm9uZSBvZjogXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gKG1ha2Vfc3ltbGlzdCBcIlwiIFwiIFwiIFwiXCIgc3ltYikpKSlcbiAgICAgICAgICAgIGVuZFxuICAgICAgICB8IFNldF9zdHJpbmcgciAtPlxuICAgICAgICAgICAgciA6PSBnZXRfYXJnICgpO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgSW50IGYgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBpbnRfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImFuIGludGVnZXJcIikpKVxuICAgICAgICAgICAgfCBTb21lIHggLT4gZiB4XG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBTZXRfaW50IHIgLT5cbiAgICAgICAgICAgIGxldCBhcmcgPSBnZXRfYXJnICgpIGluXG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBpbnRfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImFuIGludGVnZXJcIikpKVxuICAgICAgICAgICAgfCBTb21lIHggLT4gciA6PSB4XG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBGbG9hdCBmIC0+XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggZmxvYXRfb2Zfc3RyaW5nX29wdCBhcmcgd2l0aFxuICAgICAgICAgICAgfCBOb25lIC0+IHJhaXNlIChTdG9wIChXcm9uZyAocywgYXJnLCBcImEgZmxvYXRcIikpKVxuICAgICAgICAgICAgfCBTb21lIHggLT4gZiB4XG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgfCBTZXRfZmxvYXQgciAtPlxuICAgICAgICAgICAgbGV0IGFyZyA9IGdldF9hcmcgKCkgaW5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIGZsb2F0X29mX3N0cmluZ19vcHQgYXJnIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPiByYWlzZSAoU3RvcCAoV3JvbmcgKHMsIGFyZywgXCJhIGZsb2F0XCIpKSlcbiAgICAgICAgICAgIHwgU29tZSB4IC0+IHIgOj0geFxuICAgICAgICAgICAgZW5kO1xuICAgICAgICAgICAgY29uc3VtZV9hcmcgKCk7XG4gICAgICAgIHwgVHVwbGUgc3BlY3MgLT5cbiAgICAgICAgICAgIG5vX2FyZyAoKTtcbiAgICAgICAgICAgIExpc3QuaXRlciB0cmVhdF9hY3Rpb24gc3BlY3M7XG4gICAgICAgIHwgUmVzdCBmIC0+XG4gICAgICAgICAgICBub19hcmcgKCk7XG4gICAgICAgICAgICB3aGlsZSAhY3VycmVudCA8IChBcnJheS5sZW5ndGggIWFyZ3YpIC0gMSBkb1xuICAgICAgICAgICAgICBmICFhcmd2LighY3VycmVudCArIDEpO1xuICAgICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgICAgIGRvbmU7XG4gICAgICAgIHwgUmVzdF9hbGwgZiAtPlxuICAgICAgICAgICAgbm9fYXJnICgpO1xuICAgICAgICAgICAgbGV0IGFjYyA9IHJlZiBbXSBpblxuICAgICAgICAgICAgd2hpbGUgIWN1cnJlbnQgPCBBcnJheS5sZW5ndGggIWFyZ3YgLSAxIGRvXG4gICAgICAgICAgICAgIGFjYyA6PSAhYXJndi4oIWN1cnJlbnQgKyAxKSA6OiAhYWNjO1xuICAgICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgICAgIGRvbmU7XG4gICAgICAgICAgICBmIChMaXN0LnJldiAhYWNjKVxuICAgICAgICB8IEV4cGFuZCBmIC0+XG4gICAgICAgICAgICBpZiBub3QgYWxsb3dfZXhwYW5kIHRoZW5cbiAgICAgICAgICAgICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgXCJBcmcuRXhwYW5kIGlzIGlzIG9ubHkgYWxsb3dlZCB3aXRoIFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcucGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNcIik7XG4gICAgICAgICAgICBsZXQgYXJnID0gZ2V0X2FyZyAoKSBpblxuICAgICAgICAgICAgbGV0IG5ld2FyZyA9IGYgYXJnIGluXG4gICAgICAgICAgICBjb25zdW1lX2FyZyAoKTtcbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSBBcnJheS5zdWIgIWFyZ3YgMCAoIWN1cnJlbnQgKyAxKVxuICAgICAgICAgICAgYW5kIGFmdGVyID1cbiAgICAgICAgICAgICAgQXJyYXkuc3ViICFhcmd2ICghY3VycmVudCArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAoKEFycmF5Lmxlbmd0aCAhYXJndikgLSAhY3VycmVudCAtIDEpIGluXG4gICAgICAgICAgICBhcmd2Oj0gQXJyYXkuY29uY2F0IFtiZWZvcmU7bmV3YXJnO2FmdGVyXTtcbiAgICAgICAgaW5cbiAgICAgICAgdHJlYXRfYWN0aW9uIGFjdGlvbiBlbmRcbiAgICAgIGVsc2UgYW5vbmZ1biBzXG4gICAgd2l0aCB8IEJhZCBtIC0+IHJhaXNlIChjb252ZXJ0X2Vycm9yIChNZXNzYWdlIG0pKTtcbiAgICAgICAgIHwgU3RvcCBlIC0+IHJhaXNlIChjb252ZXJ0X2Vycm9yIGUpO1xuICAgIGVuZDtcbiAgICBpbmNyIGN1cnJlbnRcbiAgZG9uZVxuXG5sZXQgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWMgY3VycmVudCBhcmd2IHNwZWNsaXN0IGFub25mdW4gZXJybXNnID1cbiAgcGFyc2VfYW5kX2V4cGFuZF9hcmd2X2R5bmFtaWNfYXV4IHRydWUgY3VycmVudCBhcmd2IHNwZWNsaXN0IGFub25mdW4gZXJybXNnXG5cbmxldCBwYXJzZV9hcmd2X2R5bmFtaWMgPyhjdXJyZW50PWN1cnJlbnQpIGFyZ3Ygc3BlY2xpc3QgYW5vbmZ1biBlcnJtc2cgPVxuICBwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pY19hdXggZmFsc2UgY3VycmVudCAocmVmIGFyZ3YpIHNwZWNsaXN0IGFub25mdW5cbiAgICBlcnJtc2dcblxuXG5sZXQgcGFyc2VfYXJndiA/KGN1cnJlbnQ9Y3VycmVudCkgYXJndiBzcGVjbGlzdCBhbm9uZnVuIGVycm1zZyA9XG4gIHBhcnNlX2FyZ3ZfZHluYW1pYyB+Y3VycmVudDpjdXJyZW50IGFyZ3YgKHJlZiBzcGVjbGlzdCkgYW5vbmZ1biBlcnJtc2dcblxuXG5sZXQgcGFyc2UgbCBmIG1zZyA9XG4gIHRyeVxuICAgIHBhcnNlX2FyZ3YgU3lzLmFyZ3YgbCBmIG1zZ1xuICB3aXRoXG4gIHwgQmFkIG1zZyAtPiBlcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMlxuICB8IEhlbHAgbXNnIC0+IHByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDBcblxuXG5sZXQgcGFyc2VfZHluYW1pYyBsIGYgbXNnID1cbiAgdHJ5XG4gICAgcGFyc2VfYXJndl9keW5hbWljIFN5cy5hcmd2IGwgZiBtc2dcbiAgd2l0aFxuICB8IEJhZCBtc2cgLT4gZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDJcbiAgfCBIZWxwIG1zZyAtPiBwcmludGYgXCIlc1wiIG1zZzsgZXhpdCAwXG5cbmxldCBwYXJzZV9leHBhbmQgbCBmIG1zZyA9XG4gIHRyeVxuICAgIGxldCBhcmd2ID0gcmVmIFN5cy5hcmd2IGluXG4gICAgbGV0IHNwZWMgPSByZWYgbCBpblxuICAgIGxldCBjdXJyZW50ID0gcmVmICghY3VycmVudCkgaW5cbiAgICBwYXJzZV9hbmRfZXhwYW5kX2FyZ3ZfZHluYW1pYyBjdXJyZW50IGFyZ3Ygc3BlYyBmIG1zZ1xuICB3aXRoXG4gIHwgQmFkIG1zZyAtPiBlcHJpbnRmIFwiJXNcIiBtc2c7IGV4aXQgMlxuICB8IEhlbHAgbXNnIC0+IHByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDBcblxuXG5sZXQgc2Vjb25kX3dvcmQgcyA9XG4gIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBsb29wIG4gPVxuICAgIGlmIG4gPj0gbGVuIHRoZW4gbGVuXG4gICAgZWxzZSBpZiBzLltuXSA9ICcgJyB0aGVuIGxvb3AgKG4rMSlcbiAgICBlbHNlIG5cbiAgaW5cbiAgbWF0Y2ggU3RyaW5nLmluZGV4IHMgJ1xcdCcgd2l0aFxuICB8IG4gLT4gbG9vcCAobisxKVxuICB8IGV4Y2VwdGlvbiBOb3RfZm91bmQgLT5cbiAgICAgIGJlZ2luIG1hdGNoIFN0cmluZy5pbmRleCBzICcgJyB3aXRoXG4gICAgICB8IG4gLT4gbG9vcCAobisxKVxuICAgICAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+IGxlblxuICAgICAgZW5kXG5cblxubGV0IG1heF9hcmdfbGVuIGN1ciAoa3dkLCBzcGVjLCBkb2MpID1cbiAgbWF0Y2ggc3BlYyB3aXRoXG4gIHwgU3ltYm9sIF8gLT4gSW50Lm1heCBjdXIgKFN0cmluZy5sZW5ndGgga3dkKVxuICB8IF8gLT4gSW50Lm1heCBjdXIgKFN0cmluZy5sZW5ndGgga3dkICsgc2Vjb25kX3dvcmQgZG9jKVxuXG5cbmxldCByZXBsYWNlX2xlYWRpbmdfdGFiIHMgPVxuICBsZXQgc2VlbiA9IHJlZiBmYWxzZSBpblxuICBTdHJpbmcubWFwIChmdW5jdGlvbiAnXFx0JyB3aGVuIG5vdCAhc2VlbiAtPiBzZWVuIDo9IHRydWU7ICcgJyB8IGMgLT4gYykgc1xuXG5sZXQgYWRkX3BhZGRpbmcgbGVuIGtzZCA9XG4gIG1hdGNoIGtzZCB3aXRoXG4gIHwgKF8sIF8sIFwiXCIpIC0+XG4gICAgICAoKiBEbyBub3QgcGFkIHVuZG9jdW1lbnRlZCBvcHRpb25zLCBzbyB0aGF0IHRoZXkgc3RpbGwgZG9uJ3Qgc2hvdyB1cCB3aGVuXG4gICAgICAgKiBydW4gdGhyb3VnaCBbdXNhZ2VdIG9yIFtwYXJzZV0uICopXG4gICAgICBrc2RcbiAgfCAoa3dkLCAoU3ltYm9sIF8gYXMgc3BlYyksIG1zZykgLT5cbiAgICAgIGxldCBjdXRjb2wgPSBzZWNvbmRfd29yZCBtc2cgaW5cbiAgICAgIGxldCBzcGFjZXMgPSBTdHJpbmcubWFrZSAoKEludC5tYXggMCAobGVuIC0gY3V0Y29sKSkgKyAzKSAnICcgaW5cbiAgICAgIChrd2QsIHNwZWMsIFwiXFxuXCIgXiBzcGFjZXMgXiByZXBsYWNlX2xlYWRpbmdfdGFiIG1zZylcbiAgfCAoa3dkLCBzcGVjLCBtc2cpIC0+XG4gICAgICBsZXQgY3V0Y29sID0gc2Vjb25kX3dvcmQgbXNnIGluXG4gICAgICBsZXQga3dkX2xlbiA9IFN0cmluZy5sZW5ndGgga3dkIGluXG4gICAgICBsZXQgZGlmZiA9IGxlbiAtIGt3ZF9sZW4gLSBjdXRjb2wgaW5cbiAgICAgIGlmIGRpZmYgPD0gMCB0aGVuXG4gICAgICAgIChrd2QsIHNwZWMsIHJlcGxhY2VfbGVhZGluZ190YWIgbXNnKVxuICAgICAgZWxzZVxuICAgICAgICBsZXQgc3BhY2VzID0gU3RyaW5nLm1ha2UgZGlmZiAnICcgaW5cbiAgICAgICAgbGV0IHByZWZpeCA9IFN0cmluZy5zdWIgKHJlcGxhY2VfbGVhZGluZ190YWIgbXNnKSAwIGN1dGNvbCBpblxuICAgICAgICBsZXQgc3VmZml4ID0gU3RyaW5nLnN1YiBtc2cgY3V0Y29sIChTdHJpbmcubGVuZ3RoIG1zZyAtIGN1dGNvbCkgaW5cbiAgICAgICAgKGt3ZCwgc3BlYywgcHJlZml4IF4gc3BhY2VzIF4gc3VmZml4KVxuXG5cbmxldCBhbGlnbiA/KGxpbWl0PW1heF9pbnQpIHNwZWNsaXN0ID1cbiAgbGV0IGNvbXBsZXRlZCA9IGFkZF9oZWxwIHNwZWNsaXN0IGluXG4gIGxldCBsZW4gPSBMaXN0LmZvbGRfbGVmdCBtYXhfYXJnX2xlbiAwIGNvbXBsZXRlZCBpblxuICBsZXQgbGVuID0gSW50Lm1pbiBsZW4gbGltaXQgaW5cbiAgTGlzdC5tYXAgKGFkZF9wYWRkaW5nIGxlbikgY29tcGxldGVkXG5cbmxldCB0cmltX2NyIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGlmIGxlbiA+IDAgJiYgU3RyaW5nLmdldCBzIChsZW4gLSAxKSA9ICdcXHInIHRoZW5cbiAgICBTdHJpbmcuc3ViIHMgMCAobGVuIC0gMSlcbiAgZWxzZVxuICAgIHNcblxubGV0IHJlYWRfYXV4IHRyaW0gc2VwIGZpbGUgPVxuICBsZXQgaWMgPSBvcGVuX2luX2JpbiBmaWxlIGluXG4gIGxldCBidWYgPSBCdWZmZXIuY3JlYXRlIDIwMCBpblxuICBsZXQgd29yZHMgPSByZWYgW10gaW5cbiAgbGV0IHN0YXNoICgpID1cbiAgICBsZXQgd29yZCA9IEJ1ZmZlci5jb250ZW50cyBidWYgaW5cbiAgICBsZXQgd29yZCA9IGlmIHRyaW0gdGhlbiB0cmltX2NyIHdvcmQgZWxzZSB3b3JkIGluXG4gICAgd29yZHMgOj0gd29yZCA6OiAhd29yZHM7XG4gICAgQnVmZmVyLmNsZWFyIGJ1ZlxuICBpblxuICBiZWdpblxuICAgIHRyeSB3aGlsZSB0cnVlIGRvXG4gICAgICAgIGxldCBjID0gaW5wdXRfY2hhciBpYyBpblxuICAgICAgICBpZiBjID0gc2VwIHRoZW4gc3Rhc2ggKCkgZWxzZSBCdWZmZXIuYWRkX2NoYXIgYnVmIGNcbiAgICAgIGRvbmVcbiAgICB3aXRoIEVuZF9vZl9maWxlIC0+ICgpXG4gIGVuZDtcbiAgaWYgQnVmZmVyLmxlbmd0aCBidWYgPiAwIHRoZW4gc3Rhc2ggKCk7XG4gIGNsb3NlX2luIGljO1xuICBBcnJheS5vZl9saXN0IChMaXN0LnJldiAhd29yZHMpXG5cbmxldCByZWFkX2FyZyA9IHJlYWRfYXV4IHRydWUgJ1xcbidcblxubGV0IHJlYWRfYXJnMCA9IHJlYWRfYXV4IGZhbHNlICdcXHgwMCdcblxubGV0IHdyaXRlX2F1eCBzZXAgZmlsZSBhcmdzID1cbiAgbGV0IG9jID0gb3Blbl9vdXRfYmluIGZpbGUgaW5cbiAgQXJyYXkuaXRlciAoZnVuIHMgLT4gZnByaW50ZiBvYyBcIiVzJWNcIiBzIHNlcCkgYXJncztcbiAgY2xvc2Vfb3V0IG9jXG5cbmxldCB3cml0ZV9hcmcgPSB3cml0ZV9hdXggJ1xcbidcblxubGV0IHdyaXRlX2FyZzAgPSB3cml0ZV9hdXggJ1xceDAwJ1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIFByaW50ZlxuXG50eXBlIHQgPSBleG4gPSAuLlxuXG5sZXQgcHJpbnRlcnMgPSBBdG9taWMubWFrZSBbXVxuXG5sZXQgbG9jZm10ID0gZm9ybWF0X29mX3N0cmluZyBcIkZpbGUgXFxcIiVzXFxcIiwgbGluZSAlZCwgY2hhcmFjdGVycyAlZC0lZDogJXNcIlxuXG5sZXQgZmllbGQgeCBpID1cbiAgbGV0IGYgPSBPYmouZmllbGQgeCBpIGluXG4gIGlmIG5vdCAoT2JqLmlzX2Jsb2NrIGYpIHRoZW5cbiAgICBzcHJpbnRmIFwiJWRcIiAoT2JqLm1hZ2ljIGYgOiBpbnQpICAgICAgICAgICAoKiBjYW4gYWxzbyBiZSBhIGNoYXIgKilcbiAgZWxzZSBpZiBPYmoudGFnIGYgPSBPYmouc3RyaW5nX3RhZyB0aGVuXG4gICAgc3ByaW50ZiBcIiVTXCIgKE9iai5tYWdpYyBmIDogc3RyaW5nKVxuICBlbHNlIGlmIE9iai50YWcgZiA9IE9iai5kb3VibGVfdGFnIHRoZW5cbiAgICBzdHJpbmdfb2ZfZmxvYXQgKE9iai5tYWdpYyBmIDogZmxvYXQpXG4gIGVsc2VcbiAgICBcIl9cIlxuXG5sZXQgcmVjIG90aGVyX2ZpZWxkcyB4IGkgPVxuICBpZiBpID49IE9iai5zaXplIHggdGhlbiBcIlwiXG4gIGVsc2Ugc3ByaW50ZiBcIiwgJXMlc1wiIChmaWVsZCB4IGkpIChvdGhlcl9maWVsZHMgeCAoaSsxKSlcblxubGV0IGZpZWxkcyB4ID1cbiAgbWF0Y2ggT2JqLnNpemUgeCB3aXRoXG4gIHwgMCAtPiBcIlwiXG4gIHwgMSAtPiBcIlwiXG4gIHwgMiAtPiBzcHJpbnRmIFwiKCVzKVwiIChmaWVsZCB4IDEpXG4gIHwgXyAtPiBzcHJpbnRmIFwiKCVzJXMpXCIgKGZpZWxkIHggMSkgKG90aGVyX2ZpZWxkcyB4IDIpXG5cbmxldCB1c2VfcHJpbnRlcnMgeCA9XG4gIGxldCByZWMgY29udiA9IGZ1bmN0aW9uXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAobWF0Y2ggaGQgeCB3aXRoXG4gICAgICAgICB8IE5vbmUgfCBleGNlcHRpb24gXyAtPiBjb252IHRsXG4gICAgICAgICB8IFNvbWUgcyAtPiBTb21lIHMpXG4gICAgfCBbXSAtPiBOb25lIGluXG4gIGNvbnYgKEF0b21pYy5nZXQgcHJpbnRlcnMpXG5cbmxldCBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgeCA9XG4gIGlmIE9iai50YWcgeCA8PiAwIHRoZW5cbiAgICAoKE9iai5tYWdpYyAoT2JqLmZpZWxkIHggMCkgOiBzdHJpbmcpLCBOb25lKVxuICBlbHNlXG4gICAgbGV0IGNvbnN0cnVjdG9yID1cbiAgICAgIChPYmoubWFnaWMgKE9iai5maWVsZCAoT2JqLmZpZWxkIHggMCkgMCkgOiBzdHJpbmcpIGluXG4gICAgKGNvbnN0cnVjdG9yLCBTb21lIChmaWVsZHMgeCkpXG5cbmxldCBzdHJpbmdfb2ZfZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIHQgPVxuICBsZXQgY29uc3RydWN0b3IsIGZpZWxkc19vcHQgPSBkZXN0cnVjdF9leHRfY29uc3RydWN0b3IgdCBpblxuICBtYXRjaCBmaWVsZHNfb3B0IHdpdGhcbiAgfCBOb25lIC0+IGNvbnN0cnVjdG9yXG4gIHwgU29tZSBmIC0+IGNvbnN0cnVjdG9yIF4gZlxuXG5sZXQgdG9fc3RyaW5nX2RlZmF1bHQgPSBmdW5jdGlvblxuICB8IE91dF9vZl9tZW1vcnkgLT4gXCJPdXQgb2YgbWVtb3J5XCJcbiAgfCBTdGFja19vdmVyZmxvdyAtPiBcIlN0YWNrIG92ZXJmbG93XCJcbiAgfCBNYXRjaF9mYWlsdXJlKGZpbGUsIGxpbmUsIGNoYXIpIC0+XG4gICAgICBzcHJpbnRmIGxvY2ZtdCBmaWxlIGxpbmUgY2hhciAoY2hhcis1KSBcIlBhdHRlcm4gbWF0Y2hpbmcgZmFpbGVkXCJcbiAgfCBBc3NlcnRfZmFpbHVyZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJBc3NlcnRpb24gZmFpbGVkXCJcbiAgfCBVbmRlZmluZWRfcmVjdXJzaXZlX21vZHVsZShmaWxlLCBsaW5lLCBjaGFyKSAtPlxuICAgICAgc3ByaW50ZiBsb2NmbXQgZmlsZSBsaW5lIGNoYXIgKGNoYXIrNikgXCJVbmRlZmluZWQgcmVjdXJzaXZlIG1vZHVsZVwiXG4gIHwgeCAtPlxuICAgICAgc3RyaW5nX29mX2V4dGVuc2lvbl9jb25zdHJ1Y3RvciAoT2JqLnJlcHIgeClcblxubGV0IHRvX3N0cmluZyBlID1cbiAgbWF0Y2ggdXNlX3ByaW50ZXJzIGUgd2l0aFxuICB8IFNvbWUgcyAtPiBzXG4gIHwgTm9uZSAtPiB0b19zdHJpbmdfZGVmYXVsdCBlXG5cbmxldCBwcmludCBmY3QgYXJnID1cbiAgdHJ5XG4gICAgZmN0IGFyZ1xuICB3aXRoIHggLT5cbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZmx1c2ggc3RkZXJyO1xuICAgIHJhaXNlIHhcblxubGV0IGNhdGNoIGZjdCBhcmcgPVxuICB0cnlcbiAgICBmY3QgYXJnXG4gIHdpdGggeCAtPlxuICAgIGZsdXNoIHN0ZG91dDtcbiAgICBlcHJpbnRmIFwiVW5jYXVnaHQgZXhjZXB0aW9uOiAlc1xcblwiICh0b19zdHJpbmcgeCk7XG4gICAgZXhpdCAyXG5cbnR5cGUgcmF3X2JhY2t0cmFjZV9zbG90XG50eXBlIHJhd19iYWNrdHJhY2VfZW50cnkgPSBwcml2YXRlIGludFxudHlwZSByYXdfYmFja3RyYWNlID0gcmF3X2JhY2t0cmFjZV9lbnRyeSBhcnJheVxuXG5sZXQgcmF3X2JhY2t0cmFjZV9lbnRyaWVzIGJ0ID0gYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2U6XG4gIHVuaXQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfZXhjZXB0aW9uX3Jhd19iYWNrdHJhY2VcIlxuXG5leHRlcm5hbCByYWlzZV93aXRoX2JhY2t0cmFjZTogZXhuIC0+IHJhd19iYWNrdHJhY2UgLT4gJ2FcbiAgPSBcIiVyYWlzZV93aXRoX2JhY2t0cmFjZVwiXG5cbnR5cGUgYmFja3RyYWNlX3Nsb3QgPVxuICB8IEtub3duX2xvY2F0aW9uIG9mIHtcbiAgICAgIGlzX3JhaXNlICAgIDogYm9vbDtcbiAgICAgIGZpbGVuYW1lICAgIDogc3RyaW5nO1xuICAgICAgbGluZV9udW1iZXIgOiBpbnQ7XG4gICAgICBzdGFydF9jaGFyICA6IGludDtcbiAgICAgIGVuZF9jaGFyICAgIDogaW50O1xuICAgICAgaXNfaW5saW5lICAgOiBib29sO1xuICAgICAgZGVmbmFtZSAgICAgOiBzdHJpbmc7XG4gICAgfVxuICB8IFVua25vd25fbG9jYXRpb24gb2Yge1xuICAgICAgaXNfcmFpc2UgOiBib29sXG4gICAgfVxuXG4oKiB0byBhdm9pZCB3YXJuaW5nICopXG5sZXQgXyA9IFtLbm93bl9sb2NhdGlvbiB7IGlzX3JhaXNlID0gZmFsc2U7IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIgPSAwOyBzdGFydF9jaGFyID0gMDsgZW5kX2NoYXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc19pbmxpbmUgPSBmYWxzZTsgZGVmbmFtZSA9IFwiXCIgfTtcbiAgICAgICAgIFVua25vd25fbG9jYXRpb24geyBpc19yYWlzZSA9IGZhbHNlIH1dXG5cbmV4dGVybmFsIGNvbnZlcnRfcmF3X2JhY2t0cmFjZV9zbG90OlxuICByYXdfYmFja3RyYWNlX3Nsb3QgLT4gYmFja3RyYWNlX3Nsb3QgPSBcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlX3Nsb3RcIlxuXG5leHRlcm5hbCBjb252ZXJ0X3Jhd19iYWNrdHJhY2U6XG4gIHJhd19iYWNrdHJhY2UgLT4gYmFja3RyYWNlX3Nsb3QgYXJyYXkgPSBcImNhbWxfY29udmVydF9yYXdfYmFja3RyYWNlXCJcblxubGV0IGNvbnZlcnRfcmF3X2JhY2t0cmFjZSBidCA9XG4gIHRyeSBTb21lIChjb252ZXJ0X3Jhd19iYWNrdHJhY2UgYnQpXG4gIHdpdGggRmFpbHVyZSBfIC0+IE5vbmVcblxubGV0IGZvcm1hdF9iYWNrdHJhY2Vfc2xvdCBwb3Mgc2xvdCA9XG4gIGxldCBpbmZvIGlzX3JhaXNlID1cbiAgICBpZiBpc19yYWlzZSB0aGVuXG4gICAgICBpZiBwb3MgPSAwIHRoZW4gXCJSYWlzZWQgYXRcIiBlbHNlIFwiUmUtcmFpc2VkIGF0XCJcbiAgICBlbHNlXG4gICAgICBpZiBwb3MgPSAwIHRoZW4gXCJSYWlzZWQgYnkgcHJpbWl0aXZlIG9wZXJhdGlvbiBhdFwiIGVsc2UgXCJDYWxsZWQgZnJvbVwiXG4gIGluXG4gIG1hdGNoIHNsb3Qgd2l0aFxuICB8IFVua25vd25fbG9jYXRpb24gbCAtPlxuICAgICAgaWYgbC5pc19yYWlzZSB0aGVuXG4gICAgICAgICgqIGNvbXBpbGVyLWluc2VydGVkIHJlLXJhaXNlLCBza2lwcGVkICopIE5vbmVcbiAgICAgIGVsc2VcbiAgICAgICAgU29tZSAoc3ByaW50ZiBcIiVzIHVua25vd24gbG9jYXRpb25cIiAoaW5mbyBmYWxzZSkpXG4gIHwgS25vd25fbG9jYXRpb24gbCAtPlxuICAgICAgU29tZSAoc3ByaW50ZiBcIiVzICVzIGluIGZpbGUgXFxcIiVzXFxcIiVzLCBsaW5lICVkLCBjaGFyYWN0ZXJzICVkLSVkXCJcbiAgICAgICAgICAgICAgKGluZm8gbC5pc19yYWlzZSkgbC5kZWZuYW1lIGwuZmlsZW5hbWVcbiAgICAgICAgICAgICAgKGlmIGwuaXNfaW5saW5lIHRoZW4gXCIgKGlubGluZWQpXCIgZWxzZSBcIlwiKVxuICAgICAgICAgICAgICBsLmxpbmVfbnVtYmVyIGwuc3RhcnRfY2hhciBsLmVuZF9jaGFyKVxuXG5sZXQgcHJpbnRfZXhjZXB0aW9uX2JhY2t0cmFjZSBvdXRjaGFuIGJhY2t0cmFjZSA9XG4gIG1hdGNoIGJhY2t0cmFjZSB3aXRoXG4gIHwgTm9uZSAtPlxuICAgICAgZnByaW50ZiBvdXRjaGFuXG4gICAgICAgIFwiKFByb2dyYW0gbm90IGxpbmtlZCB3aXRoIC1nLCBjYW5ub3QgcHJpbnQgc3RhY2sgYmFja3RyYWNlKVxcblwiXG4gIHwgU29tZSBhIC0+XG4gICAgICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIGEgLSAxIGRvXG4gICAgICAgIG1hdGNoIGZvcm1hdF9iYWNrdHJhY2Vfc2xvdCBpIGEuKGkpIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gKClcbiAgICAgICAgICB8IFNvbWUgc3RyIC0+IGZwcmludGYgb3V0Y2hhbiBcIiVzXFxuXCIgc3RyXG4gICAgICBkb25lXG5cbmxldCBwcmludF9yYXdfYmFja3RyYWNlIG91dGNoYW4gcmF3X2JhY2t0cmFjZSA9XG4gIHByaW50X2V4Y2VwdGlvbl9iYWNrdHJhY2Ugb3V0Y2hhbiAoY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2UpXG5cbigqIGNvbmZ1c2luZ2x5IG5hbWVkOiBwcmludHMgdGhlIGdsb2JhbCBjdXJyZW50IGJhY2t0cmFjZSAqKVxubGV0IHByaW50X2JhY2t0cmFjZSBvdXRjaGFuID1cbiAgcHJpbnRfcmF3X2JhY2t0cmFjZSBvdXRjaGFuIChnZXRfcmF3X2JhY2t0cmFjZSAoKSlcblxubGV0IGJhY2t0cmFjZV90b19zdHJpbmcgYmFja3RyYWNlID1cbiAgbWF0Y2ggYmFja3RyYWNlIHdpdGhcbiAgfCBOb25lIC0+XG4gICAgIFwiKFByb2dyYW0gbm90IGxpbmtlZCB3aXRoIC1nLCBjYW5ub3QgcHJpbnQgc3RhY2sgYmFja3RyYWNlKVxcblwiXG4gIHwgU29tZSBhIC0+XG4gICAgICBsZXQgYiA9IEJ1ZmZlci5jcmVhdGUgMTAyNCBpblxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBhIC0gMSBkb1xuICAgICAgICBtYXRjaCBmb3JtYXRfYmFja3RyYWNlX3Nsb3QgaSBhLihpKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+ICgpXG4gICAgICAgICAgfCBTb21lIHN0ciAtPiBicHJpbnRmIGIgXCIlc1xcblwiIHN0clxuICAgICAgZG9uZTtcbiAgICAgIEJ1ZmZlci5jb250ZW50cyBiXG5cbmxldCByYXdfYmFja3RyYWNlX3RvX3N0cmluZyByYXdfYmFja3RyYWNlID1cbiAgYmFja3RyYWNlX3RvX3N0cmluZyAoY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2UpXG5cbmxldCBiYWNrdHJhY2Vfc2xvdF9pc19yYWlzZSA9IGZ1bmN0aW9uXG4gIHwgS25vd25fbG9jYXRpb24gbCAtPiBsLmlzX3JhaXNlXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBsIC0+IGwuaXNfcmFpc2VcblxubGV0IGJhY2t0cmFjZV9zbG90X2lzX2lubGluZSA9IGZ1bmN0aW9uXG4gIHwgS25vd25fbG9jYXRpb24gbCAtPiBsLmlzX2lubGluZVxuICB8IFVua25vd25fbG9jYXRpb24gXyAtPiBmYWxzZVxuXG50eXBlIGxvY2F0aW9uID0ge1xuICBmaWxlbmFtZSA6IHN0cmluZztcbiAgbGluZV9udW1iZXIgOiBpbnQ7XG4gIHN0YXJ0X2NoYXIgOiBpbnQ7XG4gIGVuZF9jaGFyIDogaW50O1xufVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfbG9jYXRpb24gPSBmdW5jdGlvblxuICB8IFVua25vd25fbG9jYXRpb24gXyAtPiBOb25lXG4gIHwgS25vd25fbG9jYXRpb24gbCAtPlxuICAgIFNvbWUge1xuICAgICAgZmlsZW5hbWUgICAgPSBsLmZpbGVuYW1lO1xuICAgICAgbGluZV9udW1iZXIgPSBsLmxpbmVfbnVtYmVyO1xuICAgICAgc3RhcnRfY2hhciAgPSBsLnN0YXJ0X2NoYXI7XG4gICAgICBlbmRfY2hhciAgICA9IGwuZW5kX2NoYXI7XG4gICAgfVxuXG5sZXQgYmFja3RyYWNlX3Nsb3RfZGVmbmFtZSA9IGZ1bmN0aW9uXG4gIHwgVW5rbm93bl9sb2NhdGlvbiBfXG4gIHwgS25vd25fbG9jYXRpb24geyBkZWZuYW1lID0gXCJcIiB9IC0+IE5vbmVcbiAgfCBLbm93bl9sb2NhdGlvbiBsIC0+IFNvbWUgbC5kZWZuYW1lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHMgcmF3X2JhY2t0cmFjZSA9XG4gICgqIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IFNvbWUgaXNcbiAgICAgcmV0dXJuZWQgb25seSBpZiBhIHBhcnQgb2YgdGhlIHRyYWNlIGlzIHVzYWJsZS4gVGhpcyBnaXZlcyB1c1xuICAgICBhIGJpdCBtb3JlIHdvcmsgdGhhbiBqdXN0IGNvbnZlcnRfcmF3X2JhY2t0cmFjZSwgYnV0IGl0IG1ha2VzIHRoZVxuICAgICBBUEkgbW9yZSB1c2VyLWZyaWVuZGx5IC0tIG90aGVyd2lzZSBtb3N0IHVzZXJzIHdvdWxkIGhhdmUgdG9cbiAgICAgcmVpbXBsZW1lbnQgdGhlIFwiUHJvZ3JhbSBub3QgbGlua2VkIHdpdGggLWcsIHNvcnJ5XCIgbG9naWNcbiAgICAgdGhlbXNlbHZlcy4gKilcbiAgbWF0Y2ggY29udmVydF9yYXdfYmFja3RyYWNlIHJhd19iYWNrdHJhY2Ugd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGJhY2t0cmFjZSAtPlxuICAgICAgbGV0IHVzYWJsZV9zbG90ID0gZnVuY3Rpb25cbiAgICAgICAgfCBVbmtub3duX2xvY2F0aW9uIF8gLT4gZmFsc2VcbiAgICAgICAgfCBLbm93bl9sb2NhdGlvbiBfIC0+IHRydWUgaW5cbiAgICAgIGxldCByZWMgZXhpc3RzX3VzYWJsZSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgKC0xKSAtPiBmYWxzZVxuICAgICAgICB8IGkgLT4gdXNhYmxlX3Nsb3QgYmFja3RyYWNlLihpKSB8fCBleGlzdHNfdXNhYmxlIChpIC0gMSkgaW5cbiAgICAgIGlmIGV4aXN0c191c2FibGUgKEFycmF5Lmxlbmd0aCBiYWNrdHJhY2UgLSAxKVxuICAgICAgdGhlbiBTb21lIGJhY2t0cmFjZVxuICAgICAgZWxzZSBOb25lXG5cbmxldCBiYWNrdHJhY2Vfc2xvdHNfb2ZfcmF3X2VudHJ5IGVudHJ5ID1cbiAgYmFja3RyYWNlX3Nsb3RzIFt8IGVudHJ5IHxdXG5cbm1vZHVsZSBTbG90ID0gc3RydWN0XG4gIHR5cGUgdCA9IGJhY2t0cmFjZV9zbG90XG4gIGxldCBmb3JtYXQgPSBmb3JtYXRfYmFja3RyYWNlX3Nsb3RcbiAgbGV0IGlzX3JhaXNlID0gYmFja3RyYWNlX3Nsb3RfaXNfcmFpc2VcbiAgbGV0IGlzX2lubGluZSA9IGJhY2t0cmFjZV9zbG90X2lzX2lubGluZVxuICBsZXQgbG9jYXRpb24gPSBiYWNrdHJhY2Vfc2xvdF9sb2NhdGlvblxuICBsZXQgbmFtZSA9IGJhY2t0cmFjZV9zbG90X2RlZm5hbWVcbmVuZFxuXG5sZXQgcmF3X2JhY2t0cmFjZV9sZW5ndGggYnQgPSBBcnJheS5sZW5ndGggYnRcblxuZXh0ZXJuYWwgZ2V0X3Jhd19iYWNrdHJhY2Vfc2xvdCA6XG4gIHJhd19iYWNrdHJhY2UgLT4gaW50IC0+IHJhd19iYWNrdHJhY2Vfc2xvdCA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX3Nsb3RcIlxuXG5leHRlcm5hbCBnZXRfcmF3X2JhY2t0cmFjZV9uZXh0X3Nsb3QgOlxuICByYXdfYmFja3RyYWNlX3Nsb3QgLT4gcmF3X2JhY2t0cmFjZV9zbG90IG9wdGlvblxuICA9IFwiY2FtbF9yYXdfYmFja3RyYWNlX25leHRfc2xvdFwiXG5cbigqIGNvbmZ1c2luZ2x5IG5hbWVkOlxuICAgcmV0dXJucyB0aGUgKnN0cmluZyogY29ycmVzcG9uZGluZyB0byB0aGUgZ2xvYmFsIGN1cnJlbnQgYmFja3RyYWNlICopXG5sZXQgZ2V0X2JhY2t0cmFjZSAoKSA9IHJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIChnZXRfcmF3X2JhY2t0cmFjZSAoKSlcblxuZXh0ZXJuYWwgcmVjb3JkX2JhY2t0cmFjZTogYm9vbCAtPiB1bml0ID0gXCJjYW1sX3JlY29yZF9iYWNrdHJhY2VcIlxuZXh0ZXJuYWwgYmFja3RyYWNlX3N0YXR1czogdW5pdCAtPiBib29sID0gXCJjYW1sX2JhY2t0cmFjZV9zdGF0dXNcIlxuXG5sZXQgcmVjIHJlZ2lzdGVyX3ByaW50ZXIgZm4gPVxuICBsZXQgb2xkX3ByaW50ZXJzID0gQXRvbWljLmdldCBwcmludGVycyBpblxuICBsZXQgbmV3X3ByaW50ZXJzID0gZm4gOjogb2xkX3ByaW50ZXJzIGluXG4gIGxldCBzdWNjZXNzID0gQXRvbWljLmNvbXBhcmVfYW5kX3NldCBwcmludGVycyBvbGRfcHJpbnRlcnMgbmV3X3ByaW50ZXJzIGluXG4gIGlmIG5vdCBzdWNjZXNzIHRoZW4gcmVnaXN0ZXJfcHJpbnRlciBmblxuXG5leHRlcm5hbCBnZXRfY2FsbHN0YWNrOiBpbnQgLT4gcmF3X2JhY2t0cmFjZSA9IFwiY2FtbF9nZXRfY3VycmVudF9jYWxsc3RhY2tcIlxuXG5sZXQgZXhuX3Nsb3QgeCA9XG4gIGxldCB4ID0gT2JqLnJlcHIgeCBpblxuICBpZiBPYmoudGFnIHggPSAwIHRoZW4gT2JqLmZpZWxkIHggMCBlbHNlIHhcblxubGV0IGV4bl9zbG90X2lkIHggPVxuICBsZXQgc2xvdCA9IGV4bl9zbG90IHggaW5cbiAgKE9iai5vYmogKE9iai5maWVsZCBzbG90IDEpIDogaW50KVxuXG5sZXQgZXhuX3Nsb3RfbmFtZSB4ID1cbiAgbGV0IHNsb3QgPSBleG5fc2xvdCB4IGluXG4gIChPYmoub2JqIChPYmouZmllbGQgc2xvdCAwKSA6IHN0cmluZylcblxuZXh0ZXJuYWwgZ2V0X2RlYnVnX2luZm9fc3RhdHVzIDogdW5pdCAtPiBpbnQgPSBcImNhbWxfbWxfZGVidWdfaW5mb19zdGF0dXNcIlxuXG4oKiBEZXNjcmlwdGlvbnMgZm9yIGVycm9ycyBpbiBzdGFydHVwLmguIFNlZSBhbHNvIGJhY2t0cmFjZS5jICopXG5sZXQgZXJyb3JzID0gW3wgXCJcIjtcbiAgKCogRklMRV9OT1RfRk9VTkQgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIG5vdCBmb3VuZClcIjtcbiAgKCogQkFEX0JZVEVDT0RFICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQpXCI7XG4gICgqIFdST05HX01BR0lDICopXG4gIFwiKENhbm5vdCBwcmludCBsb2NhdGlvbnM6XFxuIFxcXG4gICAgICBieXRlY29kZSBleGVjdXRhYmxlIHByb2dyYW0gZmlsZSBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyKVwiO1xuICAoKiBOT19GRFMgKilcbiAgXCIoQ2Fubm90IHByaW50IGxvY2F0aW9uczpcXG4gXFxcbiAgICAgIGJ5dGVjb2RlIGV4ZWN1dGFibGUgcHJvZ3JhbSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQ7XFxuIFxcXG4gICAgICAtLSB0b28gbWFueSBvcGVuIGZpbGVzLiBUcnkgcnVubmluZyB3aXRoIE9DQU1MUlVOUEFSQU09Yj0yKVwiXG58XVxuXG5sZXQgZGVmYXVsdF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBleG4gcmF3X2JhY2t0cmFjZSA9XG4gIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICBwcmludF9yYXdfYmFja3RyYWNlIHN0ZGVyciByYXdfYmFja3RyYWNlO1xuICBsZXQgc3RhdHVzID0gZ2V0X2RlYnVnX2luZm9fc3RhdHVzICgpIGluXG4gIGlmIHN0YXR1cyA8IDAgdGhlblxuICAgIHByZXJyX2VuZGxpbmUgZXJyb3JzLihhYnMgc3RhdHVzKTtcbiAgZmx1c2ggc3RkZXJyXG5cbmxldCB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA9IHJlZiBkZWZhdWx0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyXG5cbmxldCBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgZm4gPSB1bmNhdWdodF9leGNlcHRpb25faGFuZGxlciA6PSBmblxuXG5sZXQgZW1wdHlfYmFja3RyYWNlIDogcmF3X2JhY2t0cmFjZSA9IFt8IHxdXG5cbmxldCB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgPVxuICB0cnlcbiAgICBnZXRfcmF3X2JhY2t0cmFjZSAoKVxuICB3aXRoIF8gKCogT3V0X29mX21lbW9yeT8gKikgLT5cbiAgICBlbXB0eV9iYWNrdHJhY2VcblxubGV0IGhhbmRsZV91bmNhdWdodF9leGNlcHRpb24nIGV4biBkZWJ1Z2dlcl9pbl91c2UgPVxuICB0cnlcbiAgICAoKiBHZXQgdGhlIGJhY2t0cmFjZSBub3csIGluIGNhc2Ugb25lIG9mIHRoZSBbYXRfZXhpdF0gZnVuY3Rpb25cbiAgICAgICBkZXN0cm95cyBpdC4gKilcbiAgICBsZXQgcmF3X2JhY2t0cmFjZSA9XG4gICAgICBpZiBkZWJ1Z2dlcl9pbl91c2UgKCogU2FtZSB0ZXN0IGFzIGluIFtydW50aW1lL3ByaW50ZXhjLmNdICopIHRoZW5cbiAgICAgICAgZW1wdHlfYmFja3RyYWNlXG4gICAgICBlbHNlXG4gICAgICAgIHRyeV9nZXRfcmF3X2JhY2t0cmFjZSAoKVxuICAgIGluXG4gICAgKHRyeSBTdGRsaWIuZG9fYXRfZXhpdCAoKSB3aXRoIF8gLT4gKCkpO1xuICAgIHRyeVxuICAgICAgIXVuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyIGV4biByYXdfYmFja3RyYWNlXG4gICAgd2l0aCBleG4nIC0+XG4gICAgICBsZXQgcmF3X2JhY2t0cmFjZScgPSB0cnlfZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvcjogZXhjZXB0aW9uICVzXFxuXCIgKHRvX3N0cmluZyBleG4pO1xuICAgICAgcHJpbnRfcmF3X2JhY2t0cmFjZSBzdGRlcnIgcmF3X2JhY2t0cmFjZTtcbiAgICAgIGVwcmludGYgXCJGYXRhbCBlcnJvciBpbiB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlcjogZXhjZXB0aW9uICVzXFxuXCJcbiAgICAgICAgKHRvX3N0cmluZyBleG4nKTtcbiAgICAgIHByaW50X3Jhd19iYWNrdHJhY2Ugc3RkZXJyIHJhd19iYWNrdHJhY2UnO1xuICAgICAgZmx1c2ggc3RkZXJyXG4gIHdpdGhcbiAgICB8IE91dF9vZl9tZW1vcnkgLT5cbiAgICAgICAgcHJlcnJfZW5kbGluZVxuICAgICAgICAgIFwiRmF0YWwgZXJyb3I6IG91dCBvZiBtZW1vcnkgaW4gdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXJcIlxuXG4oKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBbY2FtbF9mYXRhbF91bmNhdWdodF9leGNlcHRpb25dIGluXG4gICBbcnVudGltZS9wcmludGV4Yy5jXSB3aGljaCBleHBlY3RzIG5vIGV4Y2VwdGlvbiBpcyByYWlzZWQuICopXG5sZXQgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbiBleG4gZGVidWdnZXJfaW5fdXNlID1cbiAgdHJ5XG4gICAgaGFuZGxlX3VuY2F1Z2h0X2V4Y2VwdGlvbicgZXhuIGRlYnVnZ2VyX2luX3VzZVxuICB3aXRoIF8gLT5cbiAgICAoKiBUaGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludCAqKVxuICAgICgpXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+ICdhIC0+IHVuaXRcbiAgPSBcImNhbWxfcmVnaXN0ZXJfbmFtZWRfdmFsdWVcIlxuXG5sZXQgKCkgPVxuICByZWdpc3Rlcl9uYW1lZF92YWx1ZSBcIlByaW50ZXhjLmhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cIlxuICAgIGhhbmRsZV91bmNhdWdodF9leGNlcHRpb25cbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBPQ2FtbCBwcm9ncmFtbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMTggSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuZXh0ZXJuYWwgaWQgOiAnYSAtPiAnYSA9IFwiJWlkZW50aXR5XCJcbmxldCBjb25zdCBjIF8gPSBjXG5sZXQgZmxpcCBmIHggeSA9IGYgeSB4XG5sZXQgbmVnYXRlIHAgdiA9IG5vdCAocCB2KVxuXG5leGNlcHRpb24gRmluYWxseV9yYWlzZWQgb2YgZXhuXG5cbmxldCAoKSA9IFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgQEAgZnVuY3Rpb25cbnwgRmluYWxseV9yYWlzZWQgZXhuIC0+IFNvbWUgKFwiRnVuLkZpbmFsbHlfcmFpc2VkOiBcIiBeIFByaW50ZXhjLnRvX3N0cmluZyBleG4pXG58IF8gLT4gTm9uZVxuXG5sZXQgcHJvdGVjdCB+KGZpbmFsbHkgOiB1bml0IC0+IHVuaXQpIHdvcmsgPVxuICBsZXQgZmluYWxseV9ub19leG4gKCkgPVxuICAgIHRyeSBmaW5hbGx5ICgpIHdpdGggZSAtPlxuICAgICAgbGV0IGJ0ID0gUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIChGaW5hbGx5X3JhaXNlZCBlKSBidFxuICBpblxuICBtYXRjaCB3b3JrICgpIHdpdGhcbiAgfCByZXN1bHQgLT4gZmluYWxseV9ub19leG4gKCkgOyByZXN1bHRcbiAgfCBleGNlcHRpb24gd29ya19leG4gLT5cbiAgICAgIGxldCB3b3JrX2J0ID0gUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAgIGZpbmFsbHlfbm9fZXhuICgpIDtcbiAgICAgIFByaW50ZXhjLnJhaXNlX3dpdGhfYmFja3RyYWNlIHdvcmtfZXhuIHdvcmtfYnRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgRGFtaWVuIERvbGlnZXosIHByb2pldCBQYXJhLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgSmFjcXVlcy1IZW5yaSBKb3VyZGFuLCBwcm9qZXQgR2FsbGl1bSwgSU5SSUEgUGFyaXMgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYtMjAxNiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlICAgKilcbigqICAgICBldCBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBzdGF0ID0ge1xuICBtaW5vcl93b3JkcyA6IGZsb2F0O1xuICBwcm9tb3RlZF93b3JkcyA6IGZsb2F0O1xuICBtYWpvcl93b3JkcyA6IGZsb2F0O1xuICBtaW5vcl9jb2xsZWN0aW9ucyA6IGludDtcbiAgbWFqb3JfY29sbGVjdGlvbnMgOiBpbnQ7XG4gIGhlYXBfd29yZHMgOiBpbnQ7XG4gIGhlYXBfY2h1bmtzIDogaW50O1xuICBsaXZlX3dvcmRzIDogaW50O1xuICBsaXZlX2Jsb2NrcyA6IGludDtcbiAgZnJlZV93b3JkcyA6IGludDtcbiAgZnJlZV9ibG9ja3MgOiBpbnQ7XG4gIGxhcmdlc3RfZnJlZSA6IGludDtcbiAgZnJhZ21lbnRzIDogaW50O1xuICBjb21wYWN0aW9ucyA6IGludDtcbiAgdG9wX2hlYXBfd29yZHMgOiBpbnQ7XG4gIHN0YWNrX3NpemUgOiBpbnQ7XG4gIGZvcmNlZF9tYWpvcl9jb2xsZWN0aW9uczogaW50O1xufVxuXG50eXBlIGNvbnRyb2wgPSB7XG4gIG1pbm9yX2hlYXBfc2l6ZSA6IGludDtcbiAgbWFqb3JfaGVhcF9pbmNyZW1lbnQgOiBpbnQ7XG4gIHNwYWNlX292ZXJoZWFkIDogaW50O1xuICB2ZXJib3NlIDogaW50O1xuICBtYXhfb3ZlcmhlYWQgOiBpbnQ7XG4gIHN0YWNrX2xpbWl0IDogaW50O1xuICBhbGxvY2F0aW9uX3BvbGljeSA6IGludDtcbiAgd2luZG93X3NpemUgOiBpbnQ7XG4gIGN1c3RvbV9tYWpvcl9yYXRpbyA6IGludDtcbiAgY3VzdG9tX21pbm9yX3JhdGlvIDogaW50O1xuICBjdXN0b21fbWlub3JfbWF4X3NpemUgOiBpbnQ7XG59XG5cbmV4dGVybmFsIHN0YXQgOiB1bml0IC0+IHN0YXQgPSBcImNhbWxfZ2Nfc3RhdFwiXG5leHRlcm5hbCBxdWlja19zdGF0IDogdW5pdCAtPiBzdGF0ID0gXCJjYW1sX2djX3F1aWNrX3N0YXRcIlxuZXh0ZXJuYWwgY291bnRlcnMgOiB1bml0IC0+IChmbG9hdCAqIGZsb2F0ICogZmxvYXQpID0gXCJjYW1sX2djX2NvdW50ZXJzXCJcbmV4dGVybmFsIG1pbm9yX3dvcmRzIDogdW5pdCAtPiAoZmxvYXQgW0B1bmJveGVkXSlcbiAgPSBcImNhbWxfZ2NfbWlub3Jfd29yZHNcIiBcImNhbWxfZ2NfbWlub3Jfd29yZHNfdW5ib3hlZFwiXG5leHRlcm5hbCBnZXQgOiB1bml0IC0+IGNvbnRyb2wgPSBcImNhbWxfZ2NfZ2V0XCJcbmV4dGVybmFsIHNldCA6IGNvbnRyb2wgLT4gdW5pdCA9IFwiY2FtbF9nY19zZXRcIlxuZXh0ZXJuYWwgbWlub3IgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfbWlub3JcIlxuZXh0ZXJuYWwgbWFqb3Jfc2xpY2UgOiBpbnQgLT4gaW50ID0gXCJjYW1sX2djX21ham9yX3NsaWNlXCJcbmV4dGVybmFsIG1ham9yIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2djX21ham9yXCJcbmV4dGVybmFsIGZ1bGxfbWFqb3IgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfZ2NfZnVsbF9tYWpvclwiXG5leHRlcm5hbCBjb21wYWN0IDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2djX2NvbXBhY3Rpb25cIlxuZXh0ZXJuYWwgZ2V0X21pbm9yX2ZyZWUgOiB1bml0IC0+IGludCA9IFwiY2FtbF9nZXRfbWlub3JfZnJlZVwiXG5cbmxldCBldmVudGxvZ19wYXVzZSAoKSA9ICgpXG5sZXQgZXZlbnRsb2dfcmVzdW1lICgpID0gKClcblxub3BlbiBQcmludGZcblxubGV0IHByaW50X3N0YXQgYyA9XG4gIGxldCBzdCA9IHN0YXQgKCkgaW5cbiAgZnByaW50ZiBjIFwibWlub3JfY29sbGVjdGlvbnM6ICAgICAgJWRcXG5cIiBzdC5taW5vcl9jb2xsZWN0aW9ucztcbiAgZnByaW50ZiBjIFwibWFqb3JfY29sbGVjdGlvbnM6ICAgICAgJWRcXG5cIiBzdC5tYWpvcl9jb2xsZWN0aW9ucztcbiAgZnByaW50ZiBjIFwiY29tcGFjdGlvbnM6ICAgICAgICAgICAgJWRcXG5cIiBzdC5jb21wYWN0aW9ucztcbiAgZnByaW50ZiBjIFwiZm9yY2VkX21ham9yX2NvbGxlY3Rpb25zOiAlZFxcblwiIHN0LmZvcmNlZF9tYWpvcl9jb2xsZWN0aW9ucztcbiAgZnByaW50ZiBjIFwiXFxuXCI7XG4gIGxldCBsMSA9IFN0cmluZy5sZW5ndGggKHNwcmludGYgXCIlLjBmXCIgc3QubWlub3Jfd29yZHMpIGluXG4gIGZwcmludGYgYyBcIm1pbm9yX3dvcmRzOiAgICAlKi4wZlxcblwiIGwxIHN0Lm1pbm9yX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJwcm9tb3RlZF93b3JkczogJSouMGZcXG5cIiBsMSBzdC5wcm9tb3RlZF93b3JkcztcbiAgZnByaW50ZiBjIFwibWFqb3Jfd29yZHM6ICAgICUqLjBmXFxuXCIgbDEgc3QubWFqb3Jfd29yZHM7XG4gIGZwcmludGYgYyBcIlxcblwiO1xuICBsZXQgbDIgPSBTdHJpbmcubGVuZ3RoIChzcHJpbnRmIFwiJWRcIiBzdC50b3BfaGVhcF93b3JkcykgaW5cbiAgZnByaW50ZiBjIFwidG9wX2hlYXBfd29yZHM6ICUqZFxcblwiIGwyIHN0LnRvcF9oZWFwX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJoZWFwX3dvcmRzOiAgICAgJSpkXFxuXCIgbDIgc3QuaGVhcF93b3JkcztcbiAgZnByaW50ZiBjIFwibGl2ZV93b3JkczogICAgICUqZFxcblwiIGwyIHN0LmxpdmVfd29yZHM7XG4gIGZwcmludGYgYyBcImZyZWVfd29yZHM6ICAgICAlKmRcXG5cIiBsMiBzdC5mcmVlX3dvcmRzO1xuICBmcHJpbnRmIGMgXCJsYXJnZXN0X2ZyZWU6ICAgJSpkXFxuXCIgbDIgc3QubGFyZ2VzdF9mcmVlO1xuICBmcHJpbnRmIGMgXCJmcmFnbWVudHM6ICAgICAgJSpkXFxuXCIgbDIgc3QuZnJhZ21lbnRzO1xuICBmcHJpbnRmIGMgXCJcXG5cIjtcbiAgZnByaW50ZiBjIFwibGl2ZV9ibG9ja3M6ICVkXFxuXCIgc3QubGl2ZV9ibG9ja3M7XG4gIGZwcmludGYgYyBcImZyZWVfYmxvY2tzOiAlZFxcblwiIHN0LmZyZWVfYmxvY2tzO1xuICBmcHJpbnRmIGMgXCJoZWFwX2NodW5rczogJWRcXG5cIiBzdC5oZWFwX2NodW5rc1xuXG5cbmxldCBhbGxvY2F0ZWRfYnl0ZXMgKCkgPVxuICBsZXQgKG1pLCBwcm8sIG1hKSA9IGNvdW50ZXJzICgpIGluXG4gIChtaSArLiBtYSAtLiBwcm8pICouIGZsb2F0X29mX2ludCAoU3lzLndvcmRfc2l6ZSAvIDgpXG5cblxuZXh0ZXJuYWwgZmluYWxpc2UgOiAoJ2EgLT4gdW5pdCkgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9maW5hbF9yZWdpc3RlclwiXG5leHRlcm5hbCBmaW5hbGlzZV9sYXN0IDogKHVuaXQgLT4gdW5pdCkgLT4gJ2EgLT4gdW5pdCA9XG4gIFwiY2FtbF9maW5hbF9yZWdpc3Rlcl9jYWxsZWRfd2l0aG91dF92YWx1ZVwiXG5leHRlcm5hbCBmaW5hbGlzZV9yZWxlYXNlIDogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2ZpbmFsX3JlbGVhc2VcIlxuXG5cbnR5cGUgYWxhcm0gPSBib29sIEF0b21pYy50XG50eXBlIGFsYXJtX3JlYyA9IHthY3RpdmUgOiBhbGFybTsgZiA6IHVuaXQgLT4gdW5pdH1cblxubGV0IHJlYyBjYWxsX2FsYXJtIGFyZWMgPVxuICBpZiBBdG9taWMuZ2V0IGFyZWMuYWN0aXZlIHRoZW4gYmVnaW5cbiAgICBmaW5hbGlzZSBjYWxsX2FsYXJtIGFyZWM7XG4gICAgYXJlYy5mICgpO1xuICBlbmRcblxuXG5sZXQgY3JlYXRlX2FsYXJtIGYgPVxuICBsZXQgYXJlYyA9IHsgYWN0aXZlID0gQXRvbWljLm1ha2UgdHJ1ZTsgZiA9IGYgfSBpblxuICBmaW5hbGlzZSBjYWxsX2FsYXJtIGFyZWM7XG4gIGFyZWMuYWN0aXZlXG5cblxubGV0IGRlbGV0ZV9hbGFybSBhID0gQXRvbWljLnNldCBhIGZhbHNlXG5cbm1vZHVsZSBNZW1wcm9mID1cbiAgc3RydWN0XG4gICAgdHlwZSBhbGxvY2F0aW9uX3NvdXJjZSA9IE5vcm1hbCB8IE1hcnNoYWwgfCBDdXN0b21cbiAgICB0eXBlIGFsbG9jYXRpb24gPVxuICAgICAgeyBuX3NhbXBsZXMgOiBpbnQ7XG4gICAgICAgIHNpemUgOiBpbnQ7XG4gICAgICAgIHNvdXJjZSA6IGFsbG9jYXRpb25fc291cmNlO1xuICAgICAgICBjYWxsc3RhY2sgOiBQcmludGV4Yy5yYXdfYmFja3RyYWNlIH1cblxuICAgIHR5cGUgKCdtaW5vciwgJ21ham9yKSB0cmFja2VyID0ge1xuICAgICAgYWxsb2NfbWlub3I6IGFsbG9jYXRpb24gLT4gJ21pbm9yIG9wdGlvbjtcbiAgICAgIGFsbG9jX21ham9yOiBhbGxvY2F0aW9uIC0+ICdtYWpvciBvcHRpb247XG4gICAgICBwcm9tb3RlOiAnbWlub3IgLT4gJ21ham9yIG9wdGlvbjtcbiAgICAgIGRlYWxsb2NfbWlub3I6ICdtaW5vciAtPiB1bml0O1xuICAgICAgZGVhbGxvY19tYWpvcjogJ21ham9yIC0+IHVuaXQ7XG4gICAgfVxuXG4gICAgbGV0IG51bGxfdHJhY2tlciA9IHtcbiAgICAgIGFsbG9jX21pbm9yID0gKGZ1biBfIC0+IE5vbmUpO1xuICAgICAgYWxsb2NfbWFqb3IgPSAoZnVuIF8gLT4gTm9uZSk7XG4gICAgICBwcm9tb3RlID0gKGZ1biBfIC0+IE5vbmUpO1xuICAgICAgZGVhbGxvY19taW5vciA9IChmdW4gXyAtPiAoKSk7XG4gICAgICBkZWFsbG9jX21ham9yID0gKGZ1biBfIC0+ICgpKTtcbiAgICB9XG5cbiAgICBleHRlcm5hbCBjX3N0YXJ0IDpcbiAgICAgIGZsb2F0IC0+IGludCAtPiAoJ21pbm9yLCAnbWFqb3IpIHRyYWNrZXIgLT4gdW5pdFxuICAgICAgPSBcImNhbWxfbWVtcHJvZl9zdGFydFwiXG5cbiAgICBsZXQgc3RhcnRcbiAgICAgIH5zYW1wbGluZ19yYXRlXG4gICAgICA/KGNhbGxzdGFja19zaXplID0gbWF4X2ludClcbiAgICAgIHRyYWNrZXIgPVxuICAgICAgY19zdGFydCBzYW1wbGluZ19yYXRlIGNhbGxzdGFja19zaXplIHRyYWNrZXJcblxuICAgIGV4dGVybmFsIHN0b3AgOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfbWVtcHJvZl9zdG9wXCJcbiAgZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1lc3NhZ2UgZGlnZXN0IChNRDUpICopXG5cbnR5cGUgdCA9IHN0cmluZ1xuXG5sZXQgY29tcGFyZSA9IFN0cmluZy5jb21wYXJlXG5sZXQgZXF1YWwgPSBTdHJpbmcuZXF1YWxcblxuZXh0ZXJuYWwgdW5zYWZlX3N0cmluZzogc3RyaW5nIC0+IGludCAtPiBpbnQgLT4gdCA9IFwiY2FtbF9tZDVfc3RyaW5nXCJcbmV4dGVybmFsIGNoYW5uZWw6IGluX2NoYW5uZWwgLT4gaW50IC0+IHQgPSBcImNhbWxfbWQ1X2NoYW5cIlxuXG5sZXQgc3RyaW5nIHN0ciA9XG4gIHVuc2FmZV9zdHJpbmcgc3RyIDAgKFN0cmluZy5sZW5ndGggc3RyKVxuXG5sZXQgYnl0ZXMgYiA9IHN0cmluZyAoQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBiKVxuXG5sZXQgc3Vic3RyaW5nIHN0ciBvZnMgbGVuID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IFN0cmluZy5sZW5ndGggc3RyIC0gbGVuXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3Quc3Vic3RyaW5nXCJcbiAgZWxzZSB1bnNhZmVfc3RyaW5nIHN0ciBvZnMgbGVuXG5cbmxldCBzdWJieXRlcyBiIG9mcyBsZW4gPSBzdWJzdHJpbmcgKEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYikgb2ZzIGxlblxuXG5sZXQgZmlsZSBmaWxlbmFtZSA9XG4gIGxldCBpYyA9IG9wZW5faW5fYmluIGZpbGVuYW1lIGluXG4gIG1hdGNoIGNoYW5uZWwgaWMgKC0xKSB3aXRoXG4gICAgfCBkIC0+IGNsb3NlX2luIGljOyBkXG4gICAgfCBleGNlcHRpb24gZSAtPiBjbG9zZV9pbiBpYzsgcmFpc2UgZVxuXG5sZXQgb3V0cHV0IGNoYW4gZGlnZXN0ID1cbiAgb3V0cHV0X3N0cmluZyBjaGFuIGRpZ2VzdFxuXG5sZXQgaW5wdXQgY2hhbiA9IHJlYWxseV9pbnB1dF9zdHJpbmcgY2hhbiAxNlxuXG5sZXQgY2hhcl9oZXggbiA9XG4gIENoYXIudW5zYWZlX2NociAobiArIGlmIG4gPCAxMCB0aGVuIENoYXIuY29kZSAnMCcgZWxzZSAoQ2hhci5jb2RlICdhJyAtIDEwKSlcblxubGV0IHRvX2hleCBkID1cbiAgaWYgU3RyaW5nLmxlbmd0aCBkIDw+IDE2IHRoZW4gaW52YWxpZF9hcmcgXCJEaWdlc3QudG9faGV4XCI7XG4gIGxldCByZXN1bHQgPSBCeXRlcy5jcmVhdGUgMzIgaW5cbiAgZm9yIGkgPSAwIHRvIDE1IGRvXG4gICAgbGV0IHggPSBDaGFyLmNvZGUgZC5baV0gaW5cbiAgICBCeXRlcy51bnNhZmVfc2V0IHJlc3VsdCAoaSoyKSAoY2hhcl9oZXggKHggbHNyIDQpKTtcbiAgICBCeXRlcy51bnNhZmVfc2V0IHJlc3VsdCAoaSoyKzEpIChjaGFyX2hleCAoeCBsYW5kIDB4MGYpKTtcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXN1bHRcblxubGV0IGZyb21faGV4IHMgPVxuICBpZiBTdHJpbmcubGVuZ3RoIHMgPD4gMzIgdGhlbiBpbnZhbGlkX2FyZyBcIkRpZ2VzdC5mcm9tX2hleFwiO1xuICBsZXQgZGlnaXQgYyA9XG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCAnMCcuLic5JyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnMCdcbiAgICB8ICdBJy4uJ0YnIC0+IENoYXIuY29kZSBjIC0gQ2hhci5jb2RlICdBJyArIDEwXG4gICAgfCAnYScuLidmJyAtPiBDaGFyLmNvZGUgYyAtIENoYXIuY29kZSAnYScgKyAxMFxuICAgIHwgXyAtPiByYWlzZSAoSW52YWxpZF9hcmd1bWVudCBcIkRpZ2VzdC5mcm9tX2hleFwiKVxuICBpblxuICBsZXQgYnl0ZSBpID0gZGlnaXQgcy5baV0gbHNsIDQgKyBkaWdpdCBzLltpKzFdIGluXG4gIGxldCByZXN1bHQgPSBCeXRlcy5jcmVhdGUgMTYgaW5cbiAgZm9yIGkgPSAwIHRvIDE1IGRvXG4gICAgQnl0ZXMuc2V0IHJlc3VsdCBpIChDaGFyLmNociAoYnl0ZSAoMiAqIGkpKSk7XG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgcmVzdWx0XG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgTWFudWVsIFNlcnJhbm8gZXQgWGF2aWVyIExlcm95LCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAwIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIE1vZHVsZSBbQmlnYXJyYXldOiBsYXJnZSwgbXVsdGktZGltZW5zaW9uYWwsIG51bWVyaWNhbCBhcnJheXMgKilcblxuKCogVGhlc2UgdHlwZXMgaW4gbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGVzIGluXG4gICAuLi90eXBpbmcvdHlwZW9wdC5tbCAqKVxuXG50eXBlIGZsb2F0MzJfZWx0ID0gRmxvYXQzMl9lbHRcbnR5cGUgZmxvYXQ2NF9lbHQgPSBGbG9hdDY0X2VsdFxudHlwZSBpbnQ4X3NpZ25lZF9lbHQgPSBJbnQ4X3NpZ25lZF9lbHRcbnR5cGUgaW50OF91bnNpZ25lZF9lbHQgPSBJbnQ4X3Vuc2lnbmVkX2VsdFxudHlwZSBpbnQxNl9zaWduZWRfZWx0ID0gSW50MTZfc2lnbmVkX2VsdFxudHlwZSBpbnQxNl91bnNpZ25lZF9lbHQgPSBJbnQxNl91bnNpZ25lZF9lbHRcbnR5cGUgaW50MzJfZWx0ID0gSW50MzJfZWx0XG50eXBlIGludDY0X2VsdCA9IEludDY0X2VsdFxudHlwZSBpbnRfZWx0ID0gSW50X2VsdFxudHlwZSBuYXRpdmVpbnRfZWx0ID0gTmF0aXZlaW50X2VsdFxudHlwZSBjb21wbGV4MzJfZWx0ID0gQ29tcGxleDMyX2VsdFxudHlwZSBjb21wbGV4NjRfZWx0ID0gQ29tcGxleDY0X2VsdFxuXG50eXBlICgnYSwgJ2IpIGtpbmQgPVxuICAgIEZsb2F0MzIgOiAoZmxvYXQsIGZsb2F0MzJfZWx0KSBraW5kXG4gIHwgRmxvYXQ2NCA6IChmbG9hdCwgZmxvYXQ2NF9lbHQpIGtpbmRcbiAgfCBJbnQ4X3NpZ25lZCA6IChpbnQsIGludDhfc2lnbmVkX2VsdCkga2luZFxuICB8IEludDhfdW5zaWduZWQgOiAoaW50LCBpbnQ4X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDE2X3NpZ25lZCA6IChpbnQsIGludDE2X3NpZ25lZF9lbHQpIGtpbmRcbiAgfCBJbnQxNl91bnNpZ25lZCA6IChpbnQsIGludDE2X3Vuc2lnbmVkX2VsdCkga2luZFxuICB8IEludDMyIDogKGludDMyLCBpbnQzMl9lbHQpIGtpbmRcbiAgfCBJbnQ2NCA6IChpbnQ2NCwgaW50NjRfZWx0KSBraW5kXG4gIHwgSW50IDogKGludCwgaW50X2VsdCkga2luZFxuICB8IE5hdGl2ZWludCA6IChuYXRpdmVpbnQsIG5hdGl2ZWludF9lbHQpIGtpbmRcbiAgfCBDb21wbGV4MzIgOiAoQ29tcGxleC50LCBjb21wbGV4MzJfZWx0KSBraW5kXG4gIHwgQ29tcGxleDY0IDogKENvbXBsZXgudCwgY29tcGxleDY0X2VsdCkga2luZFxuICB8IENoYXIgOiAoY2hhciwgaW50OF91bnNpZ25lZF9lbHQpIGtpbmRcblxudHlwZSBjX2xheW91dCA9IENfbGF5b3V0X3R5cFxudHlwZSBmb3J0cmFuX2xheW91dCA9IEZvcnRyYW5fbGF5b3V0X3R5cCAoKiopXG5cbnR5cGUgJ2EgbGF5b3V0ID1cbiAgICBDX2xheW91dDogY19sYXlvdXQgbGF5b3V0XG4gIHwgRm9ydHJhbl9sYXlvdXQ6IGZvcnRyYW5fbGF5b3V0IGxheW91dFxuXG4oKiBLZWVwIHRob3NlIGNvbnN0YW50cyBpbiBzeW5jIHdpdGggdGhlIGNhbWxfYmFfa2luZCBlbnVtZXJhdGlvblxuICAgaW4gYmlnYXJyYXkuaCAqKVxuXG5sZXQgZmxvYXQzMiA9IEZsb2F0MzJcbmxldCBmbG9hdDY0ID0gRmxvYXQ2NFxubGV0IGludDhfc2lnbmVkID0gSW50OF9zaWduZWRcbmxldCBpbnQ4X3Vuc2lnbmVkID0gSW50OF91bnNpZ25lZFxubGV0IGludDE2X3NpZ25lZCA9IEludDE2X3NpZ25lZFxubGV0IGludDE2X3Vuc2lnbmVkID0gSW50MTZfdW5zaWduZWRcbmxldCBpbnQzMiA9IEludDMyXG5sZXQgaW50NjQgPSBJbnQ2NFxubGV0IGludCA9IEludFxubGV0IG5hdGl2ZWludCA9IE5hdGl2ZWludFxubGV0IGNvbXBsZXgzMiA9IENvbXBsZXgzMlxubGV0IGNvbXBsZXg2NCA9IENvbXBsZXg2NFxubGV0IGNoYXIgPSBDaGFyXG5cbmxldCBraW5kX3NpemVfaW5fYnl0ZXMgOiB0eXBlIGEgYi4gKGEsIGIpIGtpbmQgLT4gaW50ID0gZnVuY3Rpb25cbiAgfCBGbG9hdDMyIC0+IDRcbiAgfCBGbG9hdDY0IC0+IDhcbiAgfCBJbnQ4X3NpZ25lZCAtPiAxXG4gIHwgSW50OF91bnNpZ25lZCAtPiAxXG4gIHwgSW50MTZfc2lnbmVkIC0+IDJcbiAgfCBJbnQxNl91bnNpZ25lZCAtPiAyXG4gIHwgSW50MzIgLT4gNFxuICB8IEludDY0IC0+IDhcbiAgfCBJbnQgLT4gU3lzLndvcmRfc2l6ZSAvIDhcbiAgfCBOYXRpdmVpbnQgLT4gU3lzLndvcmRfc2l6ZSAvIDhcbiAgfCBDb21wbGV4MzIgLT4gOFxuICB8IENvbXBsZXg2NCAtPiAxNlxuICB8IENoYXIgLT4gMVxuXG4oKiBLZWVwIHRob3NlIGNvbnN0YW50cyBpbiBzeW5jIHdpdGggdGhlIGNhbWxfYmFfbGF5b3V0IGVudW1lcmF0aW9uXG4gICBpbiBiaWdhcnJheS5oICopXG5cbmxldCBjX2xheW91dCA9IENfbGF5b3V0XG5sZXQgZm9ydHJhbl9sYXlvdXQgPSBGb3J0cmFuX2xheW91dFxuXG5tb2R1bGUgR2VuYXJyYXkgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdFxuICBleHRlcm5hbCBjcmVhdGU6ICgnYSwgJ2IpIGtpbmQgLT4gJ2MgbGF5b3V0IC0+IGludCBhcnJheSAtPiAoJ2EsICdiLCAnYykgdFxuICAgICA9IFwiY2FtbF9iYV9jcmVhdGVcIlxuICBleHRlcm5hbCBnZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCBhcnJheSAtPiAnYVxuICAgICA9IFwiY2FtbF9iYV9nZXRfZ2VuZXJpY1wiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IGFycmF5IC0+ICdhIC0+IHVuaXRcbiAgICAgPSBcImNhbWxfYmFfc2V0X2dlbmVyaWNcIlxuXG4gIGxldCByZWMgY2xvb3AgYXJyIGlkeCBmIGNvbCBtYXggPVxuICAgIGlmIGNvbCA9IEFycmF5Lmxlbmd0aCBpZHggdGhlbiBzZXQgYXJyIGlkeCAoZiBpZHgpXG4gICAgZWxzZSBmb3IgaiA9IDAgdG8gcHJlZCBtYXguKGNvbCkgZG9cbiAgICAgICAgICAgaWR4Lihjb2wpIDwtIGo7XG4gICAgICAgICAgIGNsb29wIGFyciBpZHggZiAoc3VjYyBjb2wpIG1heFxuICAgICAgICAgZG9uZVxuICBsZXQgcmVjIGZsb29wIGFyciBpZHggZiBjb2wgbWF4ID1cbiAgICBpZiBjb2wgPCAwIHRoZW4gc2V0IGFyciBpZHggKGYgaWR4KVxuICAgIGVsc2UgZm9yIGogPSAxIHRvIG1heC4oY29sKSBkb1xuICAgICAgICAgICBpZHguKGNvbCkgPC0gajtcbiAgICAgICAgICAgZmxvb3AgYXJyIGlkeCBmIChwcmVkIGNvbCkgbWF4XG4gICAgICAgICBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW1zIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltcyBpblxuICAgIGxldCBkbGVuID0gQXJyYXkubGVuZ3RoIGRpbXMgaW5cbiAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgIHwgQ19sYXlvdXQgLT4gY2xvb3AgYXJyIChBcnJheS5tYWtlIGRsZW4gMCkgZiAwIGRpbXM7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZmxvb3AgYXJyIChBcnJheS5tYWtlIGRsZW4gMSkgZiAocHJlZCBkbGVuKSBkaW1zOyBhcnJcblxuICBleHRlcm5hbCBudW1fZGltczogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCJjYW1sX2JhX251bV9kaW1zXCJcbiAgZXh0ZXJuYWwgbnRoX2RpbTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCA9IFwiY2FtbF9iYV9kaW1cIlxuICBsZXQgZGltcyBhID1cbiAgICBsZXQgbiA9IG51bV9kaW1zIGEgaW5cbiAgICBsZXQgZCA9IEFycmF5Lm1ha2UgbiAwIGluXG4gICAgZm9yIGkgPSAwIHRvIG4tMSBkbyBkLihpKSA8LSBudGhfZGltIGEgaSBkb25lO1xuICAgIGRcblxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID1cbiAgICAoa2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycikpICogKEFycmF5LmZvbGRfbGVmdCAoICogKSAxIChkaW1zIGFycikpXG5cbiAgZXh0ZXJuYWwgc3ViX2xlZnQ6ICgnYSwgJ2IsIGNfbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgZXh0ZXJuYWwgc3ViX3JpZ2h0OiAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHNsaWNlX2xlZnQ6ICgnYSwgJ2IsIGNfbGF5b3V0KSB0IC0+IGludCBhcnJheSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EsICdiLCBjX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zbGljZVwiXG4gIGV4dGVybmFsIHNsaWNlX3JpZ2h0OiAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdCAtPiBpbnQgYXJyYXkgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc2xpY2VcIlxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0XG4gICAgID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuZW5kXG5cbm1vZHVsZSBBcnJheTAgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfHxdXG4gIGxldCBnZXQgYXJyID0gR2VuYXJyYXkuZ2V0IGFyciBbfHxdXG4gIGxldCBzZXQgYXJyID0gR2VuYXJyYXkuc2V0IGFyciBbfHxdXG4gIGV4dGVybmFsIGtpbmQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IpIGtpbmQgPSBcImNhbWxfYmFfa2luZFwiXG4gIGV4dGVybmFsIGxheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2MgbGF5b3V0ID0gXCJjYW1sX2JhX2xheW91dFwiXG5cbiAgZXh0ZXJuYWwgY2hhbmdlX2xheW91dDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2QgbGF5b3V0IC0+ICgnYSwgJ2IsICdkKSB0XG4gICAgPSBcImNhbWxfYmFfY2hhbmdlX2xheW91dFwiXG5cbiAgbGV0IHNpemVfaW5fYnl0ZXMgYXJyID0ga2luZF9zaXplX2luX2J5dGVzIChraW5kIGFycilcblxuICBleHRlcm5hbCBibGl0OiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgdCAtPiB1bml0ID0gXCJjYW1sX2JhX2JsaXRcIlxuICBleHRlcm5hbCBmaWxsOiAoJ2EsICdiLCAnYykgdCAtPiAnYSAtPiB1bml0ID0gXCJjYW1sX2JhX2ZpbGxcIlxuXG4gIGxldCBvZl92YWx1ZSBraW5kIGxheW91dCB2ID1cbiAgICBsZXQgYSA9IGNyZWF0ZSBraW5kIGxheW91dCBpblxuICAgIHNldCBhIHY7XG4gICAgYVxuICBsZXQgaW5pdCA9IG9mX3ZhbHVlXG5lbmRcblxubW9kdWxlIEFycmF5MSA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0ID0gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgbGV0IGNyZWF0ZSBraW5kIGxheW91dCBkaW0gPVxuICAgIEdlbmFycmF5LmNyZWF0ZSBraW5kIGxheW91dCBbfGRpbXxdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfMVwiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVjYW1sX2JhX3NldF8xXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzFcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8xXCJcbiAgZXh0ZXJuYWwgZGltOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8xXCJcbiAgZXh0ZXJuYWwga2luZDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYikga2luZCA9IFwiY2FtbF9iYV9raW5kXCJcbiAgZXh0ZXJuYWwgbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnYyBsYXlvdXQgPSBcImNhbWxfYmFfbGF5b3V0XCJcblxuICBleHRlcm5hbCBjaGFuZ2VfbGF5b3V0OiAoJ2EsICdiLCAnYykgdCAtPiAnZCBsYXlvdXQgLT4gKCdhLCAnYiwgJ2QpIHRcbiAgICA9IFwiY2FtbF9iYV9jaGFuZ2VfbGF5b3V0XCJcblxuICBsZXQgc2l6ZV9pbl9ieXRlcyBhcnIgPVxuICAgIChraW5kX3NpemVfaW5fYnl0ZXMgKGtpbmQgYXJyKSkgKiAoZGltIGFycilcblxuICBleHRlcm5hbCBzdWI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgJ2MpIHQgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlICh0eXBlIHQpIChhIDogKF8sIF8sIHQpIEdlbmFycmF5LnQpIG4gPVxuICAgIG1hdGNoIGxheW91dCBhIHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IChHZW5hcnJheS5zbGljZV9sZWZ0IGEgW3xufF0gOiAoXywgXywgdCkgR2VuYXJyYXkudClcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IChHZW5hcnJheS5zbGljZV9yaWdodCBhIFt8bnxdOiAoXywgXywgdCkgR2VuYXJyYXkudClcbiAgZXh0ZXJuYWwgYmxpdDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIHQgLT4gdW5pdCA9IFwiY2FtbF9iYV9ibGl0XCJcbiAgZXh0ZXJuYWwgZmlsbDogKCdhLCAnYiwgJ2MpIHQgLT4gJ2EgLT4gdW5pdCA9IFwiY2FtbF9iYV9maWxsXCJcbiAgbGV0IGNfaW5pdCBhcnIgZGltIGYgPVxuICAgIGZvciBpID0gMCB0byBwcmVkIGRpbSBkbyB1bnNhZmVfc2V0IGFyciBpIChmIGkpIGRvbmVcbiAgbGV0IGZvcnRyYW5faW5pdCBhcnIgZGltIGYgPVxuICAgIGZvciBpID0gMSB0byBkaW0gZG8gdW5zYWZlX3NldCBhcnIgaSAoZiBpKSBkb25lXG4gIGxldCBpbml0ICh0eXBlIHQpIGtpbmQgKGxheW91dCA6IHQgbGF5b3V0KSBkaW0gZiA9XG4gICAgbGV0IGFyciA9IGNyZWF0ZSBraW5kIGxheW91dCBkaW0gaW5cbiAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgIHwgQ19sYXlvdXQgLT4gY19pbml0IGFyciBkaW0gZjsgYXJyXG4gICAgfCBGb3J0cmFuX2xheW91dCAtPiBmb3J0cmFuX2luaXQgYXJyIGRpbSBmOyBhcnJcbiAgbGV0IG9mX2FycmF5ICh0eXBlIHQpIGtpbmQgKGxheW91dDogdCBsYXlvdXQpIGRhdGEgPVxuICAgIGxldCBiYSA9IGNyZWF0ZSBraW5kIGxheW91dCAoQXJyYXkubGVuZ3RoIGRhdGEpIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZGF0YSAtIDEgZG8gdW5zYWZlX3NldCBiYSAoaSArIG9mcykgZGF0YS4oaSkgZG9uZTtcbiAgICBiYVxuZW5kXG5cbm1vZHVsZSBBcnJheTIgPSBzdHJ1Y3RcbiAgdHlwZSAoISdhLCAhJ2IsICEnYykgdCA9ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gIGxldCBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yID1cbiAgICBHZW5hcnJheS5jcmVhdGUga2luZCBsYXlvdXQgW3xkaW0xOyBkaW0yfF1cbiAgZXh0ZXJuYWwgZ2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+ICdhID0gXCIlY2FtbF9iYV9yZWZfMlwiXG4gIGV4dGVybmFsIHNldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0ID0gXCIlY2FtbF9iYV9zZXRfMlwiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2FcbiAgICAgPSBcIiVjYW1sX2JhX3Vuc2FmZV9yZWZfMlwiXG4gIGV4dGVybmFsIHVuc2FmZV9zZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICAgICA9IFwiJWNhbWxfYmFfdW5zYWZlX3NldF8yXCJcbiAgZXh0ZXJuYWwgZGltMTogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMVwiXG4gIGV4dGVybmFsIGRpbTI6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzJcIlxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChkaW0xIGFycikgKiAoZGltMiBhcnIpXG5cbiAgZXh0ZXJuYWwgc3ViX2xlZnQ6ICgnYSwgJ2IsIGNfbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgY19sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgZXh0ZXJuYWwgc3ViX3JpZ2h0OlxuICAgICgnYSwgJ2IsIGZvcnRyYW5fbGF5b3V0KSB0IC0+IGludCAtPiBpbnQgLT4gKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHRcbiAgICAgPSBcImNhbWxfYmFfc3ViXCJcbiAgbGV0IHNsaWNlX2xlZnQgYSBuID0gR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bnxdXG4gIGxldCBzbGljZV9yaWdodCBhIG4gPSBHZW5hcnJheS5zbGljZV9yaWdodCBhIFt8bnxdXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbTEgZGltMiBmID1cbiAgICBmb3IgaSA9IDAgdG8gcHJlZCBkaW0xIGRvXG4gICAgICBmb3IgaiA9IDAgdG8gcHJlZCBkaW0yIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYXJyIGkgaiAoZiBpIGopXG4gICAgICBkb25lXG4gICAgZG9uZVxuICBsZXQgZm9ydHJhbl9pbml0IGFyciBkaW0xIGRpbTIgZiA9XG4gICAgZm9yIGogPSAxIHRvIGRpbTIgZG9cbiAgICAgIGZvciBpID0gMSB0byBkaW0xIGRvXG4gICAgICAgIHVuc2FmZV9zZXQgYXJyIGkgaiAoZiBpIGopXG4gICAgICBkb25lXG4gICAgZG9uZVxuICBsZXQgaW5pdCAodHlwZSB0KSBraW5kIChsYXlvdXQgOiB0IGxheW91dCkgZGltMSBkaW0yIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGluXG4gICAgbWF0Y2ggbGF5b3V0IHdpdGhcbiAgICB8IENfbGF5b3V0IC0+IGNfaW5pdCBhcnIgZGltMSBkaW0yIGY7IGFyclxuICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gZm9ydHJhbl9pbml0IGFyciBkaW0xIGRpbTIgZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgZGltMSA9IEFycmF5Lmxlbmd0aCBkYXRhIGluXG4gICAgbGV0IGRpbTIgPSBpZiBkaW0xID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkgaW5cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGluXG4gICAgbGV0IG9mcyA9XG4gICAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgICAgICBDX2xheW91dCAtPiAwXG4gICAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IDFcbiAgICBpblxuICAgIGZvciBpID0gMCB0byBkaW0xIC0gMSBkb1xuICAgICAgbGV0IHJvdyA9IGRhdGEuKGkpIGluXG4gICAgICBpZiBBcnJheS5sZW5ndGggcm93IDw+IGRpbTIgdGhlblxuICAgICAgICBpbnZhbGlkX2FyZyhcIkJpZ2FycmF5LkFycmF5Mi5vZl9hcnJheTogbm9uLXJlY3Rhbmd1bGFyIGRhdGFcIik7XG4gICAgICBmb3IgaiA9IDAgdG8gZGltMiAtIDEgZG9cbiAgICAgICAgdW5zYWZlX3NldCBiYSAoaSArIG9mcykgKGogKyBvZnMpIHJvdy4oailcbiAgICAgIGRvbmVcbiAgICBkb25lO1xuICAgIGJhXG5lbmRcblxubW9kdWxlIEFycmF5MyA9IHN0cnVjdFxuICB0eXBlICghJ2EsICEnYiwgISdjKSB0ID0gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgbGV0IGNyZWF0ZSBraW5kIGxheW91dCBkaW0xIGRpbTIgZGltMyA9XG4gICAgR2VuYXJyYXkuY3JlYXRlIGtpbmQgbGF5b3V0IFt8ZGltMTsgZGltMjsgZGltM3xdXG4gIGV4dGVybmFsIGdldDogKCdhLCAnYiwgJ2MpIHQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgPSBcIiVjYW1sX2JhX3JlZl8zXCJcbiAgZXh0ZXJuYWwgc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0XG4gICAgID0gXCIlY2FtbF9iYV9zZXRfM1wiXG4gIGV4dGVybmFsIHVuc2FmZV9nZXQ6ICgnYSwgJ2IsICdjKSB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+ICdhXG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfcmVmXzNcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0OiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiAnYSAtPiB1bml0XG4gICAgID0gXCIlY2FtbF9iYV91bnNhZmVfc2V0XzNcIlxuICBleHRlcm5hbCBkaW0xOiAoJ2EsICdiLCAnYykgdCAtPiBpbnQgPSBcIiVjYW1sX2JhX2RpbV8xXCJcbiAgZXh0ZXJuYWwgZGltMjogKCdhLCAnYiwgJ2MpIHQgLT4gaW50ID0gXCIlY2FtbF9iYV9kaW1fMlwiXG4gIGV4dGVybmFsIGRpbTM6ICgnYSwgJ2IsICdjKSB0IC0+IGludCA9IFwiJWNhbWxfYmFfZGltXzNcIlxuICBleHRlcm5hbCBraW5kOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiKSBraW5kID0gXCJjYW1sX2JhX2tpbmRcIlxuICBleHRlcm5hbCBsYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdjIGxheW91dCA9IFwiY2FtbF9iYV9sYXlvdXRcIlxuXG4gIGV4dGVybmFsIGNoYW5nZV9sYXlvdXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICdkIGxheW91dCAtPiAoJ2EsICdiLCAnZCkgdFxuICAgID0gXCJjYW1sX2JhX2NoYW5nZV9sYXlvdXRcIlxuXG4gIGxldCBzaXplX2luX2J5dGVzIGFyciA9XG4gICAgKGtpbmRfc2l6ZV9pbl9ieXRlcyAoa2luZCBhcnIpKSAqIChkaW0xIGFycikgKiAoZGltMiBhcnIpICogKGRpbTMgYXJyKVxuXG4gIGV4dGVybmFsIHN1Yl9sZWZ0OiAoJ2EsICdiLCBjX2xheW91dCkgdCAtPiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IsIGNfbGF5b3V0KSB0XG4gICAgID0gXCJjYW1sX2JhX3N1YlwiXG4gIGV4dGVybmFsIHN1Yl9yaWdodDpcbiAgICAgKCdhLCAnYiwgZm9ydHJhbl9sYXlvdXQpIHQgLT4gaW50IC0+IGludCAtPiAoJ2EsICdiLCBmb3J0cmFuX2xheW91dCkgdFxuICAgICA9IFwiY2FtbF9iYV9zdWJcIlxuICBsZXQgc2xpY2VfbGVmdF8xIGEgbiBtID0gR2VuYXJyYXkuc2xpY2VfbGVmdCBhIFt8bjsgbXxdXG4gIGxldCBzbGljZV9yaWdodF8xIGEgbiBtID0gR2VuYXJyYXkuc2xpY2VfcmlnaHQgYSBbfG47IG18XVxuICBsZXQgc2xpY2VfbGVmdF8yIGEgbiA9IEdlbmFycmF5LnNsaWNlX2xlZnQgYSBbfG58XVxuICBsZXQgc2xpY2VfcmlnaHRfMiBhIG4gPSBHZW5hcnJheS5zbGljZV9yaWdodCBhIFt8bnxdXG4gIGV4dGVybmFsIGJsaXQ6ICgnYSwgJ2IsICdjKSB0IC0+ICgnYSwgJ2IsICdjKSB0IC0+IHVuaXQgPSBcImNhbWxfYmFfYmxpdFwiXG4gIGV4dGVybmFsIGZpbGw6ICgnYSwgJ2IsICdjKSB0IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfYmFfZmlsbFwiXG4gIGxldCBjX2luaXQgYXJyIGRpbTEgZGltMiBkaW0zIGYgPVxuICAgIGZvciBpID0gMCB0byBwcmVkIGRpbTEgZG9cbiAgICAgIGZvciBqID0gMCB0byBwcmVkIGRpbTIgZG9cbiAgICAgICAgZm9yIGsgPSAwIHRvIHByZWQgZGltMyBkb1xuICAgICAgICAgIHVuc2FmZV9zZXQgYXJyIGkgaiBrIChmIGkgaiBrKVxuICAgICAgICBkb25lXG4gICAgICBkb25lXG4gICAgZG9uZVxuICBsZXQgZm9ydHJhbl9pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmID1cbiAgICBmb3IgayA9IDEgdG8gZGltMyBkb1xuICAgICAgZm9yIGogPSAxIHRvIGRpbTIgZG9cbiAgICAgICAgZm9yIGkgPSAxIHRvIGRpbTEgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IGFyciBpIGogayAoZiBpIGogaylcbiAgICAgICAgZG9uZVxuICAgICAgZG9uZVxuICAgIGRvbmVcbiAgbGV0IGluaXQgKHR5cGUgdCkga2luZCAobGF5b3V0IDogdCBsYXlvdXQpIGRpbTEgZGltMiBkaW0zIGYgPVxuICAgIGxldCBhcnIgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgaW5cbiAgICBtYXRjaCBsYXlvdXQgd2l0aFxuICAgIHwgQ19sYXlvdXQgLT4gY19pbml0IGFyciBkaW0xIGRpbTIgZGltMyBmOyBhcnJcbiAgICB8IEZvcnRyYW5fbGF5b3V0IC0+IGZvcnRyYW5faW5pdCBhcnIgZGltMSBkaW0yIGRpbTMgZjsgYXJyXG4gIGxldCBvZl9hcnJheSAodHlwZSB0KSBraW5kIChsYXlvdXQ6IHQgbGF5b3V0KSBkYXRhID1cbiAgICBsZXQgZGltMSA9IEFycmF5Lmxlbmd0aCBkYXRhIGluXG4gICAgbGV0IGRpbTIgPSBpZiBkaW0xID0gMCB0aGVuIDAgZWxzZSBBcnJheS5sZW5ndGggZGF0YS4oMCkgaW5cbiAgICBsZXQgZGltMyA9IGlmIGRpbTIgPSAwIHRoZW4gMCBlbHNlIEFycmF5Lmxlbmd0aCBkYXRhLigwKS4oMCkgaW5cbiAgICBsZXQgYmEgPSBjcmVhdGUga2luZCBsYXlvdXQgZGltMSBkaW0yIGRpbTMgaW5cbiAgICBsZXQgb2ZzID1cbiAgICAgIG1hdGNoIGxheW91dCB3aXRoXG4gICAgICAgIENfbGF5b3V0IC0+IDBcbiAgICAgIHwgRm9ydHJhbl9sYXlvdXQgLT4gMVxuICAgIGluXG4gICAgZm9yIGkgPSAwIHRvIGRpbTEgLSAxIGRvXG4gICAgICBsZXQgcm93ID0gZGF0YS4oaSkgaW5cbiAgICAgIGlmIEFycmF5Lmxlbmd0aCByb3cgPD4gZGltMiB0aGVuXG4gICAgICAgIGludmFsaWRfYXJnKFwiQmlnYXJyYXkuQXJyYXkzLm9mX2FycmF5OiBub24tY3ViaWMgZGF0YVwiKTtcbiAgICAgIGZvciBqID0gMCB0byBkaW0yIC0gMSBkb1xuICAgICAgICBsZXQgY29sID0gcm93LihqKSBpblxuICAgICAgICBpZiBBcnJheS5sZW5ndGggY29sIDw+IGRpbTMgdGhlblxuICAgICAgICAgIGludmFsaWRfYXJnKFwiQmlnYXJyYXkuQXJyYXkzLm9mX2FycmF5OiBub24tY3ViaWMgZGF0YVwiKTtcbiAgICAgICAgZm9yIGsgPSAwIHRvIGRpbTMgLSAxIGRvXG4gICAgICAgICAgdW5zYWZlX3NldCBiYSAoaSArIG9mcykgKGogKyBvZnMpIChrICsgb2ZzKSBjb2wuKGspXG4gICAgICAgIGRvbmVcbiAgICAgIGRvbmVcbiAgICBkb25lO1xuICAgIGJhXG5lbmRcblxuZXh0ZXJuYWwgZ2VuYXJyYXlfb2ZfYXJyYXkwOiAoJ2EsICdiLCAnYykgQXJyYXkwLnQgLT4gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgZ2VuYXJyYXlfb2ZfYXJyYXkxOiAoJ2EsICdiLCAnYykgQXJyYXkxLnQgLT4gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgZ2VuYXJyYXlfb2ZfYXJyYXkyOiAoJ2EsICdiLCAnYykgQXJyYXkyLnQgLT4gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgZ2VuYXJyYXlfb2ZfYXJyYXkzOiAoJ2EsICdiLCAnYykgQXJyYXkzLnQgLT4gKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnRcbiAgID0gXCIlaWRlbnRpdHlcIlxubGV0IGFycmF5MF9vZl9nZW5hcnJheSBhID1cbiAgaWYgR2VuYXJyYXkubnVtX2RpbXMgYSA9IDAgdGhlbiBhXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJCaWdhcnJheS5hcnJheTBfb2ZfZ2VuYXJyYXlcIlxubGV0IGFycmF5MV9vZl9nZW5hcnJheSBhID1cbiAgaWYgR2VuYXJyYXkubnVtX2RpbXMgYSA9IDEgdGhlbiBhXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJCaWdhcnJheS5hcnJheTFfb2ZfZ2VuYXJyYXlcIlxubGV0IGFycmF5Ml9vZl9nZW5hcnJheSBhID1cbiAgaWYgR2VuYXJyYXkubnVtX2RpbXMgYSA9IDIgdGhlbiBhXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJCaWdhcnJheS5hcnJheTJfb2ZfZ2VuYXJyYXlcIlxubGV0IGFycmF5M19vZl9nZW5hcnJheSBhID1cbiAgaWYgR2VuYXJyYXkubnVtX2RpbXMgYSA9IDMgdGhlbiBhXG4gIGVsc2UgaW52YWxpZF9hcmcgXCJCaWdhcnJheS5hcnJheTNfb2ZfZ2VuYXJyYXlcIlxuXG5leHRlcm5hbCByZXNoYXBlOlxuICAgKCdhLCAnYiwgJ2MpIEdlbmFycmF5LnQgLT4gaW50IGFycmF5IC0+ICgnYSwgJ2IsICdjKSBHZW5hcnJheS50XG4gICA9IFwiY2FtbF9iYV9yZXNoYXBlXCJcbmxldCByZXNoYXBlXzAgYSA9IHJlc2hhcGUgYSBbfHxdXG5sZXQgcmVzaGFwZV8xIGEgZGltMSA9IHJlc2hhcGUgYSBbfGRpbTF8XVxubGV0IHJlc2hhcGVfMiBhIGRpbTEgZGltMiA9IHJlc2hhcGUgYSBbfGRpbTE7ZGltMnxdXG5sZXQgcmVzaGFwZV8zIGEgZGltMSBkaW0yIGRpbTMgPSByZXNoYXBlIGEgW3xkaW0xO2RpbTI7ZGltM3xdXG5cbigqIEZvcmNlIGNhbWxfYmFfZ2V0X3sxLDIsMyxOfSB0byBiZSBsaW5rZWQgaW4sIHNpbmNlIHdlIGRvbid0IHJlZmVyXG4gICB0byB0aG9zZSBwcmltaXRpdmVzIGRpcmVjdGx5IGluIHRoaXMgZmlsZSAqKVxuXG5sZXQgXyA9XG4gIGxldCBfID0gR2VuYXJyYXkuZ2V0IGluXG4gIGxldCBfID0gQXJyYXkxLmdldCBpblxuICBsZXQgXyA9IEFycmF5Mi5nZXQgaW5cbiAgbGV0IF8gPSBBcnJheTMuZ2V0IGluXG4gICgpXG5cbltAQEBvY2FtbC53YXJuaW5nIFwiLTMyXCJdXG5leHRlcm5hbCBnZXQxOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfZ2V0XzFcIlxuZXh0ZXJuYWwgZ2V0MjogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX2dldF8yXCJcbmV4dGVybmFsIGdldDM6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9nZXRfM1wiXG5leHRlcm5hbCBzZXQxOiB1bml0IC0+IHVuaXQgPSBcImNhbWxfYmFfc2V0XzFcIlxuZXh0ZXJuYWwgc2V0MjogdW5pdCAtPiB1bml0ID0gXCJjYW1sX2JhX3NldF8yXCJcbmV4dGVybmFsIHNldDM6IHVuaXQgLT4gdW5pdCA9IFwiY2FtbF9iYV9zZXRfM1wiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICopXG4oKiAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDYW1iaXVtLCBDb2xsZWdlIGRlIEZyYW5jZSBhbmQgSW5yaWEgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIFBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciAqKVxuXG5leHRlcm5hbCByYW5kb21fc2VlZDogdW5pdCAtPiBpbnQgYXJyYXkgPSBcImNhbWxfc3lzX3JhbmRvbV9zZWVkXCJcblxubW9kdWxlIFN0YXRlID0gc3RydWN0XG5cbiAgb3BlbiBCaWdhcnJheVxuXG4gIHR5cGUgdCA9IChpbnQ2NCwgaW50NjRfZWx0LCBjX2xheW91dCkgQXJyYXkxLnRcblxuICBleHRlcm5hbCBuZXh0OiB0IC0+IChpbnQ2NFtAdW5ib3hlZF0pXG4gICAgICA9IFwiY2FtbF9seG1fbmV4dFwiIFwiY2FtbF9seG1fbmV4dF91bmJveGVkXCIgW0BAbm9hbGxvY11cblxuICBsZXQgY3JlYXRlICgpIDogdCA9XG4gICAgQXJyYXkxLmNyZWF0ZSBJbnQ2NCBDX2xheW91dCA0XG5cbiAgbGV0IHNldCBzIGkxIGkyIGkzIGk0ID1cbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDAgKEludDY0LmxvZ29yIGkxIDFMKTsgKCogbXVzdCBiZSBvZGQgKilcbiAgICBBcnJheTEudW5zYWZlX3NldCBzIDEgaTI7XG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAyIChpZiBpMyA8PiAwTCB0aGVuIGkzIGVsc2UgMUwpOyAoKiBtdXN0IG5vdCBiZSAwICopXG4gICAgQXJyYXkxLnVuc2FmZV9zZXQgcyAzIChpZiBpNCA8PiAwTCB0aGVuIGk0IGVsc2UgMkwpICgqIG11c3Qgbm90IGJlIDAgKilcblxuICBsZXQgbWsgaTEgaTIgaTMgaTQgPVxuICAgIGxldCBzID0gY3JlYXRlICgpIGluXG4gICAgc2V0IHMgaTEgaTIgaTMgaTQ7IHNcblxuICBsZXQgYXNzaWduIChkc3Q6IHQpIChzcmM6IHQpID1cbiAgICBBcnJheTEuYmxpdCBzcmMgZHN0XG5cbiAgbGV0IGNvcHkgcyA9XG4gICAgbGV0IHMnID0gY3JlYXRlKCkgaW4gYXNzaWduIHMnIHM7IHMnXG5cbiAgKCogVGhlIHNlZWQgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBJdCBjYW4gYmUganVzdCBvbmUgaW50ZWdlcixcbiAgICAgYnV0IGl0IGNhbiBhbHNvIGJlIDEyIG9yIG1vcmUgYnl0ZXMuICBUbyBoaWRlIHRoZSBkaWZmZXJlbmNlLFxuICAgICB3ZSBzZXJpYWxpemUgdGhlIGFycmF5IGFzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMsIHRoZW4gaGFzaCB0aGVcbiAgICAgc2VxdWVuY2Ugd2l0aCBNRDUgKERpZ2VzdC5ieXRlcykuICBNRDUgZ2l2ZXMgb25seSAxMjggYml0cyB3aGlsZVxuICAgICB3ZSBuZWVkIDI1NiBiaXRzLCBzbyB3ZSBoYXNoIHR3aWNlIHdpdGggZGlmZmVyZW50IHN1ZmZpeGVzLiAqKVxuICBsZXQgcmVpbml0IHMgc2VlZCA9XG4gICAgbGV0IG4gPSBBcnJheS5sZW5ndGggc2VlZCBpblxuICAgIGxldCBiID0gQnl0ZXMuY3JlYXRlIChuICogOCArIDEpIGluXG4gICAgZm9yIGkgPSAwIHRvIG4tMSBkb1xuICAgICAgQnl0ZXMuc2V0X2ludDY0X2xlIGIgKGkgKiA4KSAoSW50NjQub2ZfaW50IHNlZWQuKGkpKVxuICAgIGRvbmU7XG4gICAgQnl0ZXMuc2V0IGIgKG4gKiA4KSAnXFx4MDEnO1xuICAgIGxldCBkMSA9IERpZ2VzdC5ieXRlcyBiIGluXG4gICAgQnl0ZXMuc2V0IGIgKG4gKiA4KSAnXFx4MDInO1xuICAgIGxldCBkMiA9IERpZ2VzdC5ieXRlcyBiIGluXG4gICAgc2V0IHMgKFN0cmluZy5nZXRfaW50NjRfbGUgZDEgMClcbiAgICAgICAgICAoU3RyaW5nLmdldF9pbnQ2NF9sZSBkMSA4KVxuICAgICAgICAgIChTdHJpbmcuZ2V0X2ludDY0X2xlIGQyIDApXG4gICAgICAgICAgKFN0cmluZy5nZXRfaW50NjRfbGUgZDIgOClcblxuICBsZXQgbWFrZSBzZWVkID1cbiAgICBsZXQgcyA9IGNyZWF0ZSgpIGluIHJlaW5pdCBzIHNlZWQ7IHNcblxuICBsZXQgbWFrZV9zZWxmX2luaXQgKCkgPVxuICAgIG1ha2UgKHJhbmRvbV9zZWVkICgpKVxuXG4gICgqIFJldHVybiAzMCByYW5kb20gYml0cyBhcyBhbiBpbnRlZ2VyIDAgPD0geCA8IDEwNzM3NDE4MjQgKilcbiAgbGV0IGJpdHMgcyA9XG4gICAgSW50NjQudG9faW50IChuZXh0IHMpIGxhbmQgMHgzRkZGX0ZGRkZcblxuICAoKiBSZXR1cm4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpICopXG4gIGxldCByZWMgaW50YXV4IHMgbiA9XG4gICAgbGV0IHIgPSBiaXRzIHMgaW5cbiAgICBsZXQgdiA9IHIgbW9kIG4gaW5cbiAgICBpZiByIC0gdiA+IDB4M0ZGRkZGRkYgLSBuICsgMSB0aGVuIGludGF1eCBzIG4gZWxzZSB2XG5cbiAgbGV0IGludCBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA+IDB4M0ZGRkZGRkYgfHwgYm91bmQgPD0gMFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50XCJcbiAgICBlbHNlIGludGF1eCBzIGJvdW5kXG5cbiAgKCogUmV0dXJuIGFuIGludGVnZXIgYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS5cbiAgICAgW2JvdW5kXSBtYXkgYmUgYW55IHBvc2l0aXZlIFtpbnRdLiAqKVxuICBsZXQgcmVjIGludDYzYXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQ2NC50b19pbnQgKG5leHQgcykgbGFuZCBtYXhfaW50IGluXG4gICAgbGV0IHYgPSByIG1vZCBuIGluXG4gICAgaWYgciAtIHYgPiBtYXhfaW50IC0gbiArIDEgdGhlbiBpbnQ2M2F1eCBzIG4gZWxzZSB2XG5cbiAgbGV0IGZ1bGxfaW50IHMgYm91bmQgPVxuICAgIGlmIGJvdW5kIDw9IDAgdGhlblxuICAgICAgaW52YWxpZF9hcmcgXCJSYW5kb20uZnVsbF9pbnRcIlxuICAgIGVsc2UgaWYgYm91bmQgPiAweDNGRkZGRkZGIHRoZW5cbiAgICAgIGludDYzYXV4IHMgYm91bmRcbiAgICBlbHNlXG4gICAgICBpbnRhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiAzMiByYW5kb20gYml0cyBhcyBhbiBbaW50MzJdICopXG4gIGxldCBiaXRzMzIgcyA9XG4gICAgSW50NjQudG9faW50MzIgKG5leHQgcylcblxuICAoKiBSZXR1cm4gYW4gW2ludDMyXSBiZXR3ZWVuIDAgKGluY2x1ZGVkKSBhbmQgW2JvdW5kXSAoZXhjbHVkZWQpLiAqKVxuICBsZXQgcmVjIGludDMyYXV4IHMgbiA9XG4gICAgbGV0IHIgPSBJbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsIChiaXRzMzIgcykgMSBpblxuICAgIGxldCB2ID0gSW50MzIucmVtIHIgbiBpblxuICAgIGlmIEludDMyLihzdWIgciB2ID4gYWRkIChzdWIgbWF4X2ludCBuKSAxbClcbiAgICB0aGVuIGludDMyYXV4IHMgblxuICAgIGVsc2UgdlxuXG4gIGxldCBpbnQzMiBzIGJvdW5kID1cbiAgICBpZiBib3VuZCA8PSAwbFxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJSYW5kb20uaW50MzJcIlxuICAgIGVsc2UgaW50MzJhdXggcyBib3VuZFxuXG4gICgqIFJldHVybiA2NCByYW5kb20gYml0cyBhcyBhbiBbaW50NjRdICopXG4gIGxldCBiaXRzNjQgcyA9XG4gICAgbmV4dCBzXG5cbiAgKCogUmV0dXJuIGFuIFtpbnQ2NF0gYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS4gKilcbiAgbGV0IHJlYyBpbnQ2NGF1eCBzIG4gPVxuICAgIGxldCByID0gSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCAoYml0czY0IHMpIDEgaW5cbiAgICBsZXQgdiA9IEludDY0LnJlbSByIG4gaW5cbiAgICBpZiBJbnQ2NC4oc3ViIHIgdiA+IGFkZCAoc3ViIG1heF9pbnQgbikgMUwpXG4gICAgdGhlbiBpbnQ2NGF1eCBzIG5cbiAgICBlbHNlIHZcblxuICBsZXQgaW50NjQgcyBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMExcbiAgICB0aGVuIGludmFsaWRfYXJnIFwiUmFuZG9tLmludDY0XCJcbiAgICBlbHNlIGludDY0YXV4IHMgYm91bmRcblxuICAoKiBSZXR1cm4gMzIgb3IgNjQgcmFuZG9tIGJpdHMgYXMgYSBbbmF0aXZlaW50XSAqKVxuICBsZXQgbmF0aXZlYml0cyA9XG4gICAgaWYgTmF0aXZlaW50LnNpemUgPSAzMlxuICAgIHRoZW4gZnVuIHMgLT4gTmF0aXZlaW50Lm9mX2ludDMyIChiaXRzMzIgcylcbiAgICBlbHNlIGZ1biBzIC0+IEludDY0LnRvX25hdGl2ZWludCAoYml0czY0IHMpXG5cbiAgKCogUmV0dXJuIGEgW25hdGl2ZWludF0gYmV0d2VlbiAwIChpbmNsdWRlZCkgYW5kIFtib3VuZF0gKGV4Y2x1ZGVkKS4gKilcbiAgbGV0IG5hdGl2ZWludCA9XG4gICAgaWYgTmF0aXZlaW50LnNpemUgPSAzMlxuICAgIHRoZW4gZnVuIHMgYm91bmQgLT4gTmF0aXZlaW50Lm9mX2ludDMyIChpbnQzMiBzIChOYXRpdmVpbnQudG9faW50MzIgYm91bmQpKVxuICAgIGVsc2UgZnVuIHMgYm91bmQgLT4gSW50NjQudG9fbmF0aXZlaW50IChpbnQ2NCBzIChJbnQ2NC5vZl9uYXRpdmVpbnQgYm91bmQpKVxuXG4gICgqIFJldHVybiBhIGZsb2F0IDAgPCB4IDwgMSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYW1vbmcgdGhlXG4gICAgIG11bHRpcGxlcyBvZiAyXi01MyAqKVxuICBsZXQgcmVjIHJhd2Zsb2F0IHMgPVxuICAgIGxldCBiID0gbmV4dCBzIGluXG4gICAgbGV0IG4gPSBJbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIGIgMTEgaW5cbiAgICBpZiBuIDw+IDBMIHRoZW4gSW50NjQudG9fZmxvYXQgbiAqLiAweDEucC01MyBlbHNlIHJhd2Zsb2F0IHNcblxuICAoKiBSZXR1cm4gYSBmbG9hdCBiZXR3ZWVuIDAgYW5kIFtib3VuZF0gKilcbiAgbGV0IGZsb2F0IHMgYm91bmQgPSByYXdmbG9hdCBzICouIGJvdW5kXG5cbiAgKCogUmV0dXJuIGEgcmFuZG9tIEJvb2xlYW4gKilcbiAgbGV0IGJvb2wgcyA9IG5leHQgcyA8IDBMXG5cbiAgKCogU3BsaXQgYSBuZXcgUFJORyBvZmYgdGhlIGdpdmVuIFBSTkcgKilcbiAgbGV0IHNwbGl0IHMgPVxuICAgIGxldCBpMSA9IGJpdHM2NCBzIGluIGxldCBpMiA9IGJpdHM2NCBzIGluXG4gICAgbGV0IGkzID0gYml0czY0IHMgaW4gbGV0IGk0ID0gYml0czY0IHMgaW5cbiAgICBtayBpMSBpMiBpMyBpNFxuZW5kXG5cbmxldCBta19kZWZhdWx0ICgpID1cbiAgKCogVGhpcyBpcyB0aGUgc3RhdGUgb2J0YWluZWQgd2l0aCBbU3RhdGUubWFrZSBbfCAzMTQxNTkyNjUgfF1dLiAqKVxuICBTdGF0ZS5tayAoLTYxOTY4NzQyODk1Njc3MDUwOTdMKVxuICAgICAgICAgICA1ODY1NzMyNDk4MzM3MTMxODlMXG4gICAgICAgICAgICgtODU5MTI2ODgwMzg2NTA0MzQwN0wpXG4gICAgICAgICAgIDYzODg2MTM1OTU4NDk3NzIwNDRMXG5cbmxldCByYW5kb21fa2V5ID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudDpTdGF0ZS5zcGxpdCBta19kZWZhdWx0XG5cbmxldCBiaXRzICgpID0gU3RhdGUuYml0cyAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBpbnQgYm91bmQgPSBTdGF0ZS5pbnQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIGJvdW5kXG5sZXQgZnVsbF9pbnQgYm91bmQgPSBTdGF0ZS5mdWxsX2ludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnQzMiBib3VuZCA9IFN0YXRlLmludDMyIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IG5hdGl2ZWludCBib3VuZCA9IFN0YXRlLm5hdGl2ZWludCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgYm91bmRcbmxldCBpbnQ2NCBib3VuZCA9IFN0YXRlLmludDY0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBib3VuZFxubGV0IGZsb2F0IHNjYWxlID0gU3RhdGUuZmxvYXQgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpIHNjYWxlXG5sZXQgYm9vbCAoKSA9IFN0YXRlLmJvb2wgKERvbWFpbi5ETFMuZ2V0IHJhbmRvbV9rZXkpXG5sZXQgYml0czMyICgpID0gU3RhdGUuYml0czMyIChEb21haW4uRExTLmdldCByYW5kb21fa2V5KVxubGV0IGJpdHM2NCAoKSA9IFN0YXRlLmJpdHM2NCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBuYXRpdmViaXRzICgpID0gU3RhdGUubmF0aXZlYml0cyAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcblxubGV0IGZ1bGxfaW5pdCBzZWVkID0gU3RhdGUucmVpbml0IChEb21haW4uRExTLmdldCByYW5kb21fa2V5KSBzZWVkXG5sZXQgaW5pdCBzZWVkID0gZnVsbF9pbml0IFt8IHNlZWQgfF1cbmxldCBzZWxmX2luaXQgKCkgPSBmdWxsX2luaXQgKHJhbmRvbV9zZWVkKCkpXG5cbigqIFNwbGl0dGluZyAqKVxuXG5sZXQgc3BsaXQgKCkgPSBTdGF0ZS5zcGxpdCAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcblxuKCogTWFuaXB1bGF0aW5nIHRoZSBjdXJyZW50IHN0YXRlLiAqKVxuXG5sZXQgZ2V0X3N0YXRlICgpID0gU3RhdGUuY29weSAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSlcbmxldCBzZXRfc3RhdGUgcyA9IFN0YXRlLmFzc2lnbiAoRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleSkgc1xuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBIYXNoIHRhYmxlcyAqKVxuXG4oKiBXZSBkbyBkeW5hbWljIGhhc2hpbmcsIGFuZCByZXNpemUgdGhlIHRhYmxlIGFuZCByZWhhc2ggdGhlIGVsZW1lbnRzXG4gICB3aGVuIHRoZSBsb2FkIGZhY3RvciBiZWNvbWVzIHRvbyBoaWdoLiAqKVxuXG50eXBlICgnYSwgJ2IpIHQgPVxuICB7IG11dGFibGUgc2l6ZTogaW50OyAgICAgICAgICAgICAgICAgICAgICAgICgqIG51bWJlciBvZiBlbnRyaWVzICopXG4gICAgbXV0YWJsZSBkYXRhOiAoJ2EsICdiKSBidWNrZXRsaXN0IGFycmF5OyAgKCogdGhlIGJ1Y2tldHMgKilcbiAgICBzZWVkOiBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgKCogZm9yIHJhbmRvbWl6YXRpb24gKilcbiAgICBtdXRhYmxlIGluaXRpYWxfc2l6ZTogaW50OyAgICAgICAgICAgICAgICAoKiBpbml0aWFsIGFycmF5IHNpemUgKilcbiAgfVxuXG5hbmQgKCdhLCAnYikgYnVja2V0bGlzdCA9XG4gICAgRW1wdHlcbiAgfCBDb25zIG9mIHsgbXV0YWJsZSBrZXk6ICdhO1xuICAgICAgICAgICAgICBtdXRhYmxlIGRhdGE6ICdiO1xuICAgICAgICAgICAgICBtdXRhYmxlIG5leHQ6ICgnYSwgJ2IpIGJ1Y2tldGxpc3QgfVxuXG4oKiBUaGUgc2lnbiBvZiBpbml0aWFsX3NpemUgZW5jb2RlcyB0aGUgZmFjdCB0aGF0IGEgdHJhdmVyc2FsIGlzXG4gICBvbmdvaW5nIG9yIG5vdC5cblxuICAgVGhpcyBkaXNhYmxlcyB0aGUgZWZmaWNpZW50IGluIHBsYWNlIGltcGxlbWVudGF0aW9uIG9mIHJlc2l6aW5nLlxuKilcblxubGV0IG9uZ29pbmdfdHJhdmVyc2FsIGggPVxuICBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPCA0ICgqIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgaGFzaCB0YWJsZXMgKilcbiAgfHwgaC5pbml0aWFsX3NpemUgPCAwXG5cbmxldCBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGggPVxuICBoLmluaXRpYWxfc2l6ZSA8LSAtIGguaW5pdGlhbF9zaXplXG5cbigqIFRvIHBpY2sgcmFuZG9tIHNlZWRzIGlmIHJlcXVlc3RlZCAqKVxuXG5sZXQgcmFuZG9taXplZF9kZWZhdWx0ID1cbiAgbGV0IHBhcmFtcyA9XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJPQ0FNTFJVTlBBUkFNXCIgd2l0aCBOb3RfZm91bmQgLT5cbiAgICB0cnkgU3lzLmdldGVudiBcIkNBTUxSVU5QQVJBTVwiIHdpdGggTm90X2ZvdW5kIC0+IFwiXCIgaW5cbiAgU3RyaW5nLmNvbnRhaW5zIHBhcmFtcyAnUidcblxubGV0IHJhbmRvbWl6ZWQgPSBBdG9taWMubWFrZSByYW5kb21pemVkX2RlZmF1bHRcblxubGV0IHJhbmRvbWl6ZSAoKSA9IEF0b21pYy5zZXQgcmFuZG9taXplZCB0cnVlXG5sZXQgaXNfcmFuZG9taXplZCAoKSA9IEF0b21pYy5nZXQgcmFuZG9taXplZFxuXG5sZXQgcHJuZ19rZXkgPSBEb21haW4uRExTLm5ld19rZXkgUmFuZG9tLlN0YXRlLm1ha2Vfc2VsZl9pbml0XG5cbigqIEZ1bmN0aW9ucyB3aGljaCBhcHBlYXIgYmVmb3JlIHRoZSBmdW5jdG9yaWFsIGludGVyZmFjZSBtdXN0IGVpdGhlciBiZVxuICAgaW5kZXBlbmRlbnQgb2YgdGhlIGhhc2ggZnVuY3Rpb24gb3IgdGFrZSBpdCBhcyBhIHBhcmFtZXRlciAoc2VlICMyMjAyIGFuZFxuICAgY29kZSBiZWxvdyB0aGUgZnVuY3RvciBkZWZpbml0aW9ucy4gKilcblxuKCogQ3JlYXRpbmcgYSBmcmVzaCwgZW1wdHkgdGFibGUgKilcblxubGV0IHJlYyBwb3dlcl8yX2Fib3ZlIHggbiA9XG4gIGlmIHggPj0gbiB0aGVuIHhcbiAgZWxzZSBpZiB4ICogMiA+IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIHRoZW4geFxuICBlbHNlIHBvd2VyXzJfYWJvdmUgKHggKiAyKSBuXG5cbmxldCBjcmVhdGUgPyhyYW5kb20gPSBBdG9taWMuZ2V0IHJhbmRvbWl6ZWQpIGluaXRpYWxfc2l6ZSA9XG4gIGxldCBzID0gcG93ZXJfMl9hYm92ZSAxNiBpbml0aWFsX3NpemUgaW5cbiAgbGV0IHNlZWQgPVxuICAgIGlmIHJhbmRvbSB0aGVuIFJhbmRvbS5TdGF0ZS5iaXRzIChEb21haW4uRExTLmdldCBwcm5nX2tleSkgZWxzZSAwXG4gIGluXG4gIHsgaW5pdGlhbF9zaXplID0gczsgc2l6ZSA9IDA7IHNlZWQgPSBzZWVkOyBkYXRhID0gQXJyYXkubWFrZSBzIEVtcHR5IH1cblxubGV0IGNsZWFyIGggPVxuICBpZiBoLnNpemUgPiAwIHRoZW4gYmVnaW5cbiAgICBoLnNpemUgPC0gMDtcbiAgICBBcnJheS5maWxsIGguZGF0YSAwIChBcnJheS5sZW5ndGggaC5kYXRhKSBFbXB0eVxuICBlbmRcblxubGV0IHJlc2V0IGggPVxuICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIGguZGF0YSBpblxuICBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPCA0ICgqIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgaGFzaCB0YWJsZXMgKilcbiAgICB8fCBsZW4gPSBhYnMgaC5pbml0aWFsX3NpemUgdGhlblxuICAgIGNsZWFyIGhcbiAgZWxzZSBiZWdpblxuICAgIGguc2l6ZSA8LSAwO1xuICAgIGguZGF0YSA8LSBBcnJheS5tYWtlIChhYnMgaC5pbml0aWFsX3NpemUpIEVtcHR5XG4gIGVuZFxuXG5sZXQgY29weV9idWNrZXRsaXN0ID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPiBFbXB0eVxuICB8IENvbnMge2tleTsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGxldCByZWMgbG9vcCBwcmVjID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPiAoKVxuICAgICAgICB8IENvbnMge2tleTsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgICAgIGxldCByID0gQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSBpblxuICAgICAgICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICAgICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgICAgfCBDb25zIHByZWMgLT4gIHByZWMubmV4dCA8LSByXG4gICAgICAgICAgICBlbmQ7XG4gICAgICAgICAgICBsb29wIHIgbmV4dFxuICAgICAgaW5cbiAgICAgIGxldCByID0gQ29ucyB7a2V5OyBkYXRhOyBuZXh0fSBpblxuICAgICAgbG9vcCByIG5leHQ7XG4gICAgICByXG5cbmxldCBjb3B5IGggPSB7IGggd2l0aCBkYXRhID0gQXJyYXkubWFwIGNvcHlfYnVja2V0bGlzdCBoLmRhdGEgfVxuXG5sZXQgbGVuZ3RoIGggPSBoLnNpemVcblxubGV0IGluc2VydF9hbGxfYnVja2V0cyBpbmRleGZ1biBpbnBsYWNlIG9kYXRhIG5kYXRhID1cbiAgbGV0IG5zaXplID0gQXJyYXkubGVuZ3RoIG5kYXRhIGluXG4gIGxldCBuZGF0YV90YWlsID0gQXJyYXkubWFrZSBuc2l6ZSBFbXB0eSBpblxuICBsZXQgcmVjIGluc2VydF9idWNrZXQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IENvbnMge2tleTsgZGF0YTsgbmV4dH0gYXMgY2VsbCAtPlxuICAgICAgICBsZXQgY2VsbCA9XG4gICAgICAgICAgaWYgaW5wbGFjZSB0aGVuIGNlbGxcbiAgICAgICAgICBlbHNlIENvbnMge2tleTsgZGF0YTsgbmV4dCA9IEVtcHR5fVxuICAgICAgICBpblxuICAgICAgICBsZXQgbmlkeCA9IGluZGV4ZnVuIGtleSBpblxuICAgICAgICBiZWdpbiBtYXRjaCBuZGF0YV90YWlsLihuaWR4KSB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gbmRhdGEuKG5pZHgpIDwtIGNlbGw7XG4gICAgICAgIHwgQ29ucyB0YWlsIC0+IHRhaWwubmV4dCA8LSBjZWxsO1xuICAgICAgICBlbmQ7XG4gICAgICAgIG5kYXRhX3RhaWwuKG5pZHgpIDwtIGNlbGw7XG4gICAgICAgIGluc2VydF9idWNrZXQgbmV4dFxuICBpblxuICBmb3IgaSA9IDAgdG8gQXJyYXkubGVuZ3RoIG9kYXRhIC0gMSBkb1xuICAgIGluc2VydF9idWNrZXQgb2RhdGEuKGkpXG4gIGRvbmU7XG4gIGlmIGlucGxhY2UgdGhlblxuICAgIGZvciBpID0gMCB0byBuc2l6ZSAtIDEgZG9cbiAgICAgIG1hdGNoIG5kYXRhX3RhaWwuKGkpIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgIHwgQ29ucyB0YWlsIC0+IHRhaWwubmV4dCA8LSBFbXB0eVxuICAgIGRvbmVcblxubGV0IHJlc2l6ZSBpbmRleGZ1biBoID1cbiAgbGV0IG9kYXRhID0gaC5kYXRhIGluXG4gIGxldCBvc2l6ZSA9IEFycmF5Lmxlbmd0aCBvZGF0YSBpblxuICBsZXQgbnNpemUgPSBvc2l6ZSAqIDIgaW5cbiAgaWYgbnNpemUgPCBTeXMubWF4X2FycmF5X2xlbmd0aCB0aGVuIGJlZ2luXG4gICAgbGV0IG5kYXRhID0gQXJyYXkubWFrZSBuc2l6ZSBFbXB0eSBpblxuICAgIGxldCBpbnBsYWNlID0gbm90IChvbmdvaW5nX3RyYXZlcnNhbCBoKSBpblxuICAgIGguZGF0YSA8LSBuZGF0YTsgICAgICAgICAgKCogc28gdGhhdCBpbmRleGZ1biBzZWVzIHRoZSBuZXcgYnVja2V0IGNvdW50ICopXG4gICAgaW5zZXJ0X2FsbF9idWNrZXRzIChpbmRleGZ1biBoKSBpbnBsYWNlIG9kYXRhIG5kYXRhXG4gIGVuZFxuXG5sZXQgaXRlciBmIGggPVxuICBsZXQgcmVjIGRvX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICAoKVxuICAgIHwgQ29uc3trZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIGYga2V5IGRhdGE7IGRvX2J1Y2tldCBuZXh0IGluXG4gIGxldCBvbGRfdHJhdiA9IG9uZ29pbmdfdHJhdmVyc2FsIGggaW5cbiAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB0cnlcbiAgICBsZXQgZCA9IGguZGF0YSBpblxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZCAtIDEgZG9cbiAgICAgIGRvX2J1Y2tldCBkLihpKVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICB3aXRoIGV4biB3aGVuIG5vdCBvbGRfdHJhdiAtPlxuICAgIGZsaXBfb25nb2luZ190cmF2ZXJzYWwgaDtcbiAgICByYWlzZSBleG5cblxubGV0IHJlYyBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIHByZWMgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICBiZWdpbiBtYXRjaCBwcmVjIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBFbXB0eVxuICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIEVtcHR5XG4gICAgICBlbmRcbiAgfCAoQ29ucyAoe2tleTsgZGF0YTsgbmV4dH0gYXMgYykpIGFzIHNsb3QgLT5cbiAgICAgIGJlZ2luIG1hdGNoIGYga2V5IGRhdGEgd2l0aFxuICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgZmlsdGVyX21hcF9pbnBsYWNlX2J1Y2tldCBmIGggaSBwcmVjIG5leHRcbiAgICAgIHwgU29tZSBkYXRhIC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggcHJlYyB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBoLmRhdGEuKGkpIDwtIHNsb3RcbiAgICAgICAgICB8IENvbnMgYyAtPiBjLm5leHQgPC0gc2xvdFxuICAgICAgICAgIGVuZDtcbiAgICAgICAgICBjLmRhdGEgPC0gZGF0YTtcbiAgICAgICAgICBmaWx0ZXJfbWFwX2lucGxhY2VfYnVja2V0IGYgaCBpIHNsb3QgbmV4dFxuICAgICAgZW5kXG5cbmxldCBmaWx0ZXJfbWFwX2lucGxhY2UgZiBoID1cbiAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgbGV0IG9sZF90cmF2ID0gb25nb2luZ190cmF2ZXJzYWwgaCBpblxuICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gIHRyeVxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZCAtIDEgZG9cbiAgICAgIGZpbHRlcl9tYXBfaW5wbGFjZV9idWNrZXQgZiBoIGkgRW1wdHkgaC5kYXRhLihpKVxuICAgIGRvbmU7XG4gICAgaWYgbm90IG9sZF90cmF2IHRoZW4gZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoXG4gIHdpdGggZXhuIHdoZW4gbm90IG9sZF90cmF2IC0+XG4gICAgZmxpcF9vbmdvaW5nX3RyYXZlcnNhbCBoO1xuICAgIHJhaXNlIGV4blxuXG5sZXQgZm9sZCBmIGggaW5pdCA9XG4gIGxldCByZWMgZG9fYnVja2V0IGIgYWNjdSA9XG4gICAgbWF0Y2ggYiB3aXRoXG4gICAgICBFbXB0eSAtPlxuICAgICAgICBhY2N1XG4gICAgfCBDb25ze2tleTsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgZG9fYnVja2V0IG5leHQgKGYga2V5IGRhdGEgYWNjdSkgaW5cbiAgbGV0IG9sZF90cmF2ID0gb25nb2luZ190cmF2ZXJzYWwgaCBpblxuICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gIHRyeVxuICAgIGxldCBkID0gaC5kYXRhIGluXG4gICAgbGV0IGFjY3UgPSByZWYgaW5pdCBpblxuICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZCAtIDEgZG9cbiAgICAgIGFjY3UgOj0gZG9fYnVja2V0IGQuKGkpICFhY2N1XG4gICAgZG9uZTtcbiAgICBpZiBub3Qgb2xkX3RyYXYgdGhlbiBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgIWFjY3VcbiAgd2l0aCBleG4gd2hlbiBub3Qgb2xkX3RyYXYgLT5cbiAgICBmbGlwX29uZ29pbmdfdHJhdmVyc2FsIGg7XG4gICAgcmFpc2UgZXhuXG5cbnR5cGUgc3RhdGlzdGljcyA9IHtcbiAgbnVtX2JpbmRpbmdzOiBpbnQ7XG4gIG51bV9idWNrZXRzOiBpbnQ7XG4gIG1heF9idWNrZXRfbGVuZ3RoOiBpbnQ7XG4gIGJ1Y2tldF9oaXN0b2dyYW06IGludCBhcnJheVxufVxuXG5sZXQgcmVjIGJ1Y2tldF9sZW5ndGggYWNjdSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gYWNjdVxuICB8IENvbnN7bmV4dH0gLT4gYnVja2V0X2xlbmd0aCAoYWNjdSArIDEpIG5leHRcblxubGV0IHN0YXRzIGggPVxuICBsZXQgbWJsID1cbiAgICBBcnJheS5mb2xkX2xlZnQgKGZ1biBtIGIgLT4gSW50Lm1heCBtIChidWNrZXRfbGVuZ3RoIDAgYikpIDAgaC5kYXRhIGluXG4gIGxldCBoaXN0byA9IEFycmF5Lm1ha2UgKG1ibCArIDEpIDAgaW5cbiAgQXJyYXkuaXRlclxuICAgIChmdW4gYiAtPlxuICAgICAgbGV0IGwgPSBidWNrZXRfbGVuZ3RoIDAgYiBpblxuICAgICAgaGlzdG8uKGwpIDwtIGhpc3RvLihsKSArIDEpXG4gICAgaC5kYXRhO1xuICB7IG51bV9iaW5kaW5ncyA9IGguc2l6ZTtcbiAgICBudW1fYnVja2V0cyA9IEFycmF5Lmxlbmd0aCBoLmRhdGE7XG4gICAgbWF4X2J1Y2tldF9sZW5ndGggPSBtYmw7XG4gICAgYnVja2V0X2hpc3RvZ3JhbSA9IGhpc3RvIH1cblxuKCoqIHsxIEl0ZXJhdG9yc30gKilcblxubGV0IHRvX3NlcSB0YmwgPVxuICAoKiBjYXB0dXJlIGN1cnJlbnQgYXJyYXksIHNvIHRoYXQgZXZlbiBpZiB0aGUgdGFibGUgaXMgcmVzaXplZCB3ZVxuICAgICBrZWVwIGl0ZXJhdGluZyBvbiB0aGUgc2FtZSBhcnJheSAqKVxuICBsZXQgdGJsX2RhdGEgPSB0YmwuZGF0YSBpblxuICAoKiBzdGF0ZTogaW5kZXggKiBuZXh0IGJ1Y2tldCB0byB0cmF2ZXJzZSAqKVxuICBsZXQgcmVjIGF1eCBpIGJ1Y2sgKCkgPSBtYXRjaCBidWNrIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIGlmIGkgPSBBcnJheS5sZW5ndGggdGJsX2RhdGFcbiAgICAgICAgdGhlbiBTZXEuTmlsXG4gICAgICAgIGVsc2UgYXV4KGkrMSkgdGJsX2RhdGEuKGkpICgpXG4gICAgfCBDb25zIHtrZXk7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgIFNlcS5Db25zICgoa2V5LCBkYXRhKSwgYXV4IGkgbmV4dClcbiAgaW5cbiAgYXV4IDAgRW1wdHlcblxubGV0IHRvX3NlcV9rZXlzIG0gPSBTZXEubWFwIGZzdCAodG9fc2VxIG0pXG5cbmxldCB0b19zZXFfdmFsdWVzIG0gPSBTZXEubWFwIHNuZCAodG9fc2VxIG0pXG5cbigqIEZ1bmN0b3JpYWwgaW50ZXJmYWNlICopXG5cbm1vZHVsZSB0eXBlIEhhc2hlZFR5cGUgPVxuICBzaWdcbiAgICB0eXBlIHRcbiAgICB2YWwgZXF1YWw6IHQgLT4gdCAtPiBib29sXG4gICAgdmFsIGhhc2g6IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTZWVkZWRIYXNoZWRUeXBlID1cbiAgc2lnXG4gICAgdHlwZSB0XG4gICAgdmFsIGVxdWFsOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBzZWVkZWRfaGFzaDogaW50IC0+IHQgLT4gaW50XG4gIGVuZFxuXG5tb2R1bGUgdHlwZSBTID1cbiAgc2lnXG4gICAgdHlwZSBrZXlcbiAgICB0eXBlICEnYSB0XG4gICAgdmFsIGNyZWF0ZTogaW50IC0+ICdhIHRcbiAgICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgY29weTogJ2EgdCAtPiAnYSB0XG4gICAgdmFsIGFkZDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCByZW1vdmU6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgICB2YWwgZmluZDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgICB2YWwgZmluZF9vcHQ6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICAgIHZhbCBmaW5kX2FsbDogJ2EgdCAtPiBrZXkgLT4gJ2EgbGlzdFxuICAgIHZhbCByZXBsYWNlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgLT4gdW5pdFxuICAgIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gICAgdmFsIGl0ZXI6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZTogKGtleSAtPiAnYSAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmb2xkOiAoa2V5IC0+ICdhIC0+ICdiIC0+ICdiKSAtPiAnYSB0IC0+ICdiIC0+ICdiXG4gICAgdmFsIGxlbmd0aDogJ2EgdCAtPiBpbnRcbiAgICB2YWwgc3RhdHM6ICdhIHQgLT4gc3RhdGlzdGljc1xuICAgIHZhbCB0b19zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX2tleXMgOiBfIHQgLT4ga2V5IFNlcS50XG4gICAgdmFsIHRvX3NlcV92YWx1ZXMgOiAnYSB0IC0+ICdhIFNlcS50XG4gICAgdmFsIGFkZF9zZXEgOiAnYSB0IC0+IChrZXkgKiAnYSkgU2VxLnQgLT4gdW5pdFxuICAgIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIG9mX3NlcSA6IChrZXkgKiAnYSkgU2VxLnQgLT4gJ2EgdFxuICBlbmRcblxubW9kdWxlIHR5cGUgU2VlZGVkUyA9XG4gIHNpZ1xuICAgIHR5cGUga2V5XG4gICAgdHlwZSAhJ2EgdFxuICAgIHZhbCBjcmVhdGUgOiA/cmFuZG9tOmJvb2wgLT4gaW50IC0+ICdhIHRcbiAgICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgcmVzZXQgOiAnYSB0IC0+IHVuaXRcbiAgICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCBhZGQgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIHJlbW92ZSA6ICdhIHQgLT4ga2V5IC0+IHVuaXRcbiAgICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhXG4gICAgdmFsIGZpbmRfb3B0OiAnYSB0IC0+IGtleSAtPiAnYSBvcHRpb25cbiAgICB2YWwgZmluZF9hbGwgOiAnYSB0IC0+IGtleSAtPiAnYSBsaXN0XG4gICAgdmFsIHJlcGxhY2UgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gICAgdmFsIG1lbSA6ICdhIHQgLT4ga2V5IC0+IGJvb2xcbiAgICB2YWwgaXRlciA6IChrZXkgLT4gJ2EgLT4gdW5pdCkgLT4gJ2EgdCAtPiB1bml0XG4gICAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZTogKGtleSAtPiAnYSAtPiAnYSBvcHRpb24pIC0+ICdhIHQgLT4gdW5pdFxuICAgIHZhbCBmb2xkIDogKGtleSAtPiAnYSAtPiAnYiAtPiAnYikgLT4gJ2EgdCAtPiAnYiAtPiAnYlxuICAgIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICAgIHZhbCBzdGF0czogJ2EgdCAtPiBzdGF0aXN0aWNzXG4gICAgdmFsIHRvX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudFxuICAgIHZhbCB0b19zZXFfa2V5cyA6IF8gdCAtPiBrZXkgU2VxLnRcbiAgICB2YWwgdG9fc2VxX3ZhbHVlcyA6ICdhIHQgLT4gJ2EgU2VxLnRcbiAgICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gICAgdmFsIHJlcGxhY2Vfc2VxIDogJ2EgdCAtPiAoa2V5ICogJ2EpIFNlcS50IC0+IHVuaXRcbiAgICB2YWwgb2Zfc2VxIDogKGtleSAqICdhKSBTZXEudCAtPiAnYSB0XG4gIGVuZFxuXG5tb2R1bGUgTWFrZVNlZWRlZChIOiBTZWVkZWRIYXNoZWRUeXBlKTogKFNlZWRlZFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICB0eXBlIGtleSA9IEgudFxuICAgIHR5cGUgJ2EgaGFzaHRibCA9IChrZXksICdhKSB0XG4gICAgdHlwZSAnYSB0ID0gJ2EgaGFzaHRibFxuICAgIGxldCBjcmVhdGUgPSBjcmVhdGVcbiAgICBsZXQgY2xlYXIgPSBjbGVhclxuICAgIGxldCByZXNldCA9IHJlc2V0XG4gICAgbGV0IGNvcHkgPSBjb3B5XG5cbiAgICBsZXQga2V5X2luZGV4IGgga2V5ID1cbiAgICAgIChILnNlZWRlZF9oYXNoIGguc2VlZCBrZXkpIGxhbmQgKEFycmF5Lmxlbmd0aCBoLmRhdGEgLSAxKVxuXG4gICAgbGV0IGFkZCBoIGtleSBkYXRhID1cbiAgICAgIGxldCBpID0ga2V5X2luZGV4IGgga2V5IGluXG4gICAgICBsZXQgYnVja2V0ID0gQ29uc3trZXk7IGRhdGE7IG5leHQ9aC5kYXRhLihpKX0gaW5cbiAgICAgIGguZGF0YS4oaSkgPC0gYnVja2V0O1xuICAgICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgICBpZiBoLnNpemUgPiBBcnJheS5sZW5ndGggaC5kYXRhIGxzbCAxIHRoZW4gcmVzaXplIGtleV9pbmRleCBoXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9idWNrZXQgaCBpIGtleSBwcmVjID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICAoKVxuICAgICAgfCAoQ29ucyB7a2V5PWs7IG5leHR9KSBhcyBjIC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrIGtleVxuICAgICAgICAgIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIGguc2l6ZSA8LSBoLnNpemUgLSAxO1xuICAgICAgICAgICAgbWF0Y2ggcHJlYyB3aXRoXG4gICAgICAgICAgICB8IEVtcHR5IC0+IGguZGF0YS4oaSkgPC0gbmV4dFxuICAgICAgICAgICAgfCBDb25zIGMgLT4gYy5uZXh0IDwtIG5leHRcbiAgICAgICAgICBlbmRcbiAgICAgICAgICBlbHNlIHJlbW92ZV9idWNrZXQgaCBpIGtleSBjIG5leHRcblxuICAgIGxldCByZW1vdmUgaCBrZXkgPVxuICAgICAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgICAgIHJlbW92ZV9idWNrZXQgaCBpIGtleSBFbXB0eSBoLmRhdGEuKGkpXG5cbiAgICBsZXQgcmVjIGZpbmRfcmVjIGtleSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE7IG5leHR9IC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrZXkgayB0aGVuIGRhdGEgZWxzZSBmaW5kX3JlYyBrZXkgbmV4dFxuXG4gICAgbGV0IGZpbmQgaCBrZXkgPVxuICAgICAgbWF0Y2ggaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsxIHRoZW4gZDEgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQxIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgICAgIGlmIEguZXF1YWwga2V5IGsyIHRoZW4gZDIgZWxzZVxuICAgICAgICAgICAgICBtYXRjaCBuZXh0MiB3aXRoXG4gICAgICAgICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMyB0aGVuIGQzIGVsc2UgZmluZF9yZWMga2V5IG5leHQzXG5cbiAgICBsZXQgcmVjIGZpbmRfcmVjX29wdCBrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrIHRoZW4gU29tZSBkYXRhIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0XG5cbiAgICBsZXQgZmluZF9vcHQgaCBrZXkgPVxuICAgICAgbWF0Y2ggaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBDb25ze2tleT1rMTsgZGF0YT1kMTsgbmV4dD1uZXh0MX0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMSB0aGVuIFNvbWUgZDEgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQxIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICAgICAgICB8IENvbnN7a2V5PWsyOyBkYXRhPWQyOyBuZXh0PW5leHQyfSAtPlxuICAgICAgICAgICAgICBpZiBILmVxdWFsIGtleSBrMiB0aGVuIFNvbWUgZDIgZWxzZVxuICAgICAgICAgICAgICBtYXRjaCBuZXh0MiB3aXRoXG4gICAgICAgICAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgICAgICAgICB8IENvbnN7a2V5PWszOyBkYXRhPWQzOyBuZXh0PW5leHQzfSAtPlxuICAgICAgICAgICAgICAgICAgaWYgSC5lcXVhbCBrZXkgazMgdGhlbiBTb21lIGQzIGVsc2UgZmluZF9yZWNfb3B0IGtleSBuZXh0M1xuXG4gICAgbGV0IGZpbmRfYWxsIGgga2V5ID1cbiAgICAgIGxldCByZWMgZmluZF9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIFtdXG4gICAgICB8IENvbnN7a2V5PWs7IGRhdGE9ZDsgbmV4dH0gLT5cbiAgICAgICAgICBpZiBILmVxdWFsIGsga2V5XG4gICAgICAgICAgdGhlbiBkIDo6IGZpbmRfaW5fYnVja2V0IG5leHRcbiAgICAgICAgICBlbHNlIGZpbmRfaW5fYnVja2V0IG5leHQgaW5cbiAgICAgIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG4gICAgbGV0IHJlYyByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgdHJ1ZVxuICAgICAgfCBDb25zICh7a2V5PWs7IG5leHR9IGFzIHNsb3QpIC0+XG4gICAgICAgICAgaWYgSC5lcXVhbCBrIGtleVxuICAgICAgICAgIHRoZW4gKHNsb3Qua2V5IDwtIGtleTsgc2xvdC5kYXRhIDwtIGRhdGE7IGZhbHNlKVxuICAgICAgICAgIGVsc2UgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbmV4dFxuXG4gICAgbGV0IHJlcGxhY2UgaCBrZXkgZGF0YSA9XG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGtleSBpblxuICAgICAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gICAgICBpZiByZXBsYWNlX2J1Y2tldCBrZXkgZGF0YSBsIHRoZW4gYmVnaW5cbiAgICAgICAgaC5kYXRhLihpKSA8LSBDb25ze2tleTsgZGF0YTsgbmV4dD1sfTtcbiAgICAgICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUga2V5X2luZGV4IGhcbiAgICAgIGVuZFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBsZXQgcmVjIG1lbV9pbl9idWNrZXQgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIGZhbHNlXG4gICAgICB8IENvbnN7a2V5PWs7IG5leHR9IC0+XG4gICAgICAgICAgSC5lcXVhbCBrIGtleSB8fCBtZW1faW5fYnVja2V0IG5leHQgaW5cbiAgICAgIG1lbV9pbl9idWNrZXQgaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpXG5cbiAgICBsZXQgYWRkX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IGFkZCB0YmwgayB2KSBpXG5cbiAgICBsZXQgcmVwbGFjZV9zZXEgdGJsIGkgPVxuICAgICAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuXG4gICAgbGV0IGl0ZXIgPSBpdGVyXG4gICAgbGV0IGZpbHRlcl9tYXBfaW5wbGFjZSA9IGZpbHRlcl9tYXBfaW5wbGFjZVxuICAgIGxldCBmb2xkID0gZm9sZFxuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBsZXQgc3RhdHMgPSBzdGF0c1xuICAgIGxldCB0b19zZXEgPSB0b19zZXFcbiAgICBsZXQgdG9fc2VxX2tleXMgPSB0b19zZXFfa2V5c1xuICAgIGxldCB0b19zZXFfdmFsdWVzID0gdG9fc2VxX3ZhbHVlc1xuICBlbmRcblxubW9kdWxlIE1ha2UoSDogSGFzaGVkVHlwZSk6IChTIHdpdGggdHlwZSBrZXkgPSBILnQpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgICB0eXBlIHQgPSBILnRcbiAgICAgICAgbGV0IGVxdWFsID0gSC5lcXVhbFxuICAgICAgICBsZXQgc2VlZGVkX2hhc2ggKF9zZWVkOiBpbnQpIHggPSBILmhhc2ggeFxuICAgICAgZW5kKVxuICAgIGxldCBjcmVhdGUgc3ogPSBjcmVhdGUgfnJhbmRvbTpmYWxzZSBzelxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuICBlbmRcblxuKCogUG9seW1vcnBoaWMgaGFzaCBmdW5jdGlvbi1iYXNlZCB0YWJsZXMgKilcbigqIENvZGUgaW5jbHVkZWQgYmVsb3cgdGhlIGZ1bmN0b3JpYWwgaW50ZXJmYWNlIHRvIGd1YXJkIGFnYWluc3QgYWNjaWRlbnRhbFxuICAgdXNlIC0gc2VlICMyMjAyICopXG5cbmV4dGVybmFsIHNlZWRlZF9oYXNoX3BhcmFtIDpcbiAgaW50IC0+IGludCAtPiBpbnQgLT4gJ2EgLT4gaW50ID0gXCJjYW1sX2hhc2hcIiBbQEBub2FsbG9jXVxuXG5sZXQgaGFzaCB4ID0gc2VlZGVkX2hhc2hfcGFyYW0gMTAgMTAwIDAgeFxubGV0IGhhc2hfcGFyYW0gbjEgbjIgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIG4xIG4yIDAgeFxubGV0IHNlZWRlZF9oYXNoIHNlZWQgeCA9IHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBzZWVkIHhcblxubGV0IGtleV9pbmRleCBoIGtleSA9XG4gIGlmIE9iai5zaXplIChPYmoucmVwciBoKSA+PSA0XG4gIHRoZW4gKHNlZWRlZF9oYXNoX3BhcmFtIDEwIDEwMCBoLnNlZWQga2V5KSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcbiAgZWxzZSBpbnZhbGlkX2FyZyBcIkhhc2h0Ymw6IHVuc3VwcG9ydGVkIGhhc2ggdGFibGUgZm9ybWF0XCJcblxubGV0IGFkZCBoIGtleSBkYXRhID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgbGV0IGJ1Y2tldCA9IENvbnN7a2V5OyBkYXRhOyBuZXh0PWguZGF0YS4oaSl9IGluXG4gIGguZGF0YS4oaSkgPC0gYnVja2V0O1xuICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuXG5sZXQgcmVjIHJlbW92ZV9idWNrZXQgaCBpIGtleSBwcmVjID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgKClcbiAgfCAoQ29ucyB7a2V5PWs7IG5leHR9KSBhcyBjIC0+XG4gICAgICBpZiBjb21wYXJlIGsga2V5ID0gMFxuICAgICAgdGhlbiBiZWdpblxuICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgbWF0Y2ggcHJlYyB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gaC5kYXRhLihpKSA8LSBuZXh0XG4gICAgICAgIHwgQ29ucyBjIC0+IGMubmV4dCA8LSBuZXh0XG4gICAgICBlbmRcbiAgICAgIGVsc2UgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IGMgbmV4dFxuXG5sZXQgcmVtb3ZlIGgga2V5ID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgcmVtb3ZlX2J1Y2tldCBoIGkga2V5IEVtcHR5IGguZGF0YS4oaSlcblxubGV0IHJlYyBmaW5kX3JlYyBrZXkgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+XG4gICAgICByYWlzZSBOb3RfZm91bmRcbiAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgaWYgY29tcGFyZSBrZXkgayA9IDAgdGhlbiBkYXRhIGVsc2UgZmluZF9yZWMga2V5IG5leHRcblxubGV0IGZpbmQgaCBrZXkgPVxuICBtYXRjaCBoLmRhdGEuKGtleV9pbmRleCBoIGtleSkgd2l0aFxuICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICB8IENvbnN7a2V5PWsxOyBkYXRhPWQxOyBuZXh0PW5leHQxfSAtPlxuICAgICAgaWYgY29tcGFyZSBrZXkgazEgPSAwIHRoZW4gZDEgZWxzZVxuICAgICAgbWF0Y2ggbmV4dDEgd2l0aFxuICAgICAgfCBFbXB0eSAtPiByYWlzZSBOb3RfZm91bmRcbiAgICAgIHwgQ29uc3trZXk9azI7IGRhdGE9ZDI7IG5leHQ9bmV4dDJ9IC0+XG4gICAgICAgICAgaWYgY29tcGFyZSBrZXkgazIgPSAwIHRoZW4gZDIgZWxzZVxuICAgICAgICAgIG1hdGNoIG5leHQyIHdpdGhcbiAgICAgICAgICB8IEVtcHR5IC0+IHJhaXNlIE5vdF9mb3VuZFxuICAgICAgICAgIHwgQ29uc3trZXk9azM7IGRhdGE9ZDM7IG5leHQ9bmV4dDN9IC0+XG4gICAgICAgICAgICAgIGlmIGNvbXBhcmUga2V5IGszID0gMCB0aGVuIGQzIGVsc2UgZmluZF9yZWMga2V5IG5leHQzXG5cbmxldCByZWMgZmluZF9yZWNfb3B0IGtleSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIE5vbmVcbiAgfCBDb25ze2tleT1rOyBkYXRhOyBuZXh0fSAtPlxuICAgICAgaWYgY29tcGFyZSBrZXkgayA9IDAgdGhlbiBTb21lIGRhdGEgZWxzZSBmaW5kX3JlY19vcHQga2V5IG5leHRcblxubGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgbWF0Y2ggaC5kYXRhLihrZXlfaW5kZXggaCBrZXkpIHdpdGhcbiAgfCBFbXB0eSAtPiBOb25lXG4gIHwgQ29uc3trZXk9azE7IGRhdGE9ZDE7IG5leHQ9bmV4dDF9IC0+XG4gICAgICBpZiBjb21wYXJlIGtleSBrMSA9IDAgdGhlbiBTb21lIGQxIGVsc2VcbiAgICAgIG1hdGNoIG5leHQxIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgICAgfCBDb25ze2tleT1rMjsgZGF0YT1kMjsgbmV4dD1uZXh0Mn0gLT5cbiAgICAgICAgICBpZiBjb21wYXJlIGtleSBrMiA9IDAgdGhlbiBTb21lIGQyIGVsc2VcbiAgICAgICAgICBtYXRjaCBuZXh0MiB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBOb25lXG4gICAgICAgICAgfCBDb25ze2tleT1rMzsgZGF0YT1kMzsgbmV4dD1uZXh0M30gLT5cbiAgICAgICAgICAgICAgaWYgY29tcGFyZSBrZXkgazMgPSAwIHRoZW4gU29tZSBkMyBlbHNlIGZpbmRfcmVjX29wdCBrZXkgbmV4dDNcblxubGV0IGZpbmRfYWxsIGgga2V5ID1cbiAgbGV0IHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIFtdXG4gIHwgQ29uc3trZXk9azsgZGF0YTsgbmV4dH0gLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIGRhdGEgOjogZmluZF9pbl9idWNrZXQgbmV4dFxuICAgICAgZWxzZSBmaW5kX2luX2J1Y2tldCBuZXh0IGluXG4gIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgcmVjIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhID0gZnVuY3Rpb25cbiAgfCBFbXB0eSAtPlxuICAgICAgdHJ1ZVxuICB8IENvbnMgKHtrZXk9azsgbmV4dH0gYXMgc2xvdCkgLT5cbiAgICAgIGlmIGNvbXBhcmUgayBrZXkgPSAwXG4gICAgICB0aGVuIChzbG90LmtleSA8LSBrZXk7IHNsb3QuZGF0YSA8LSBkYXRhOyBmYWxzZSlcbiAgICAgIGVsc2UgcmVwbGFjZV9idWNrZXQga2V5IGRhdGEgbmV4dFxuXG5sZXQgcmVwbGFjZSBoIGtleSBkYXRhID1cbiAgbGV0IGkgPSBrZXlfaW5kZXggaCBrZXkgaW5cbiAgbGV0IGwgPSBoLmRhdGEuKGkpIGluXG4gIGlmIHJlcGxhY2VfYnVja2V0IGtleSBkYXRhIGwgdGhlbiBiZWdpblxuICAgIGguZGF0YS4oaSkgPC0gQ29uc3trZXk7IGRhdGE7IG5leHQ9bH07XG4gICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgaWYgaC5zaXplID4gQXJyYXkubGVuZ3RoIGguZGF0YSBsc2wgMSB0aGVuIHJlc2l6ZSBrZXlfaW5kZXggaFxuICBlbmRcblxubGV0IG1lbSBoIGtleSA9XG4gIGxldCByZWMgbWVtX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT5cbiAgICAgIGZhbHNlXG4gIHwgQ29uc3trZXk9azsgbmV4dH0gLT5cbiAgICAgIGNvbXBhcmUgayBrZXkgPSAwIHx8IG1lbV9pbl9idWNrZXQgbmV4dCBpblxuICBtZW1faW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGgga2V5KVxuXG5sZXQgYWRkX3NlcSB0YmwgaSA9XG4gIFNlcS5pdGVyIChmdW4gKGssdikgLT4gYWRkIHRibCBrIHYpIGlcblxubGV0IHJlcGxhY2Vfc2VxIHRibCBpID1cbiAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxubGV0IG9mX3NlcSBpID1cbiAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgdGJsXG5cbmxldCByZWJ1aWxkID8ocmFuZG9tID0gQXRvbWljLmdldCByYW5kb21pemVkKSBoID1cbiAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IChBcnJheS5sZW5ndGggaC5kYXRhKSBpblxuICBsZXQgc2VlZCA9XG4gICAgaWYgcmFuZG9tIHRoZW4gUmFuZG9tLlN0YXRlLmJpdHMgKERvbWFpbi5ETFMuZ2V0IHBybmdfa2V5KVxuICAgIGVsc2UgaWYgT2JqLnNpemUgKE9iai5yZXByIGgpID49IDQgdGhlbiBoLnNlZWRcbiAgICBlbHNlIDAgaW5cbiAgbGV0IGgnID0ge1xuICAgIHNpemUgPSBoLnNpemU7XG4gICAgZGF0YSA9IEFycmF5Lm1ha2UgcyBFbXB0eTtcbiAgICBzZWVkID0gc2VlZDtcbiAgICBpbml0aWFsX3NpemUgPSBpZiBPYmouc2l6ZSAoT2JqLnJlcHIgaCkgPj0gNCB0aGVuIGguaW5pdGlhbF9zaXplIGVsc2Ugc1xuICB9IGluXG4gIGluc2VydF9hbGxfYnVja2V0cyAoa2V5X2luZGV4IGgnKSBmYWxzZSBoLmRhdGEgaCcuZGF0YTtcbiAgaCdcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCoqIFdlYWsgYXJyYXkgb3BlcmF0aW9ucyAqKVxuXG50eXBlICEnYSB0XG5cbmV4dGVybmFsIGNyZWF0ZSA6IGludCAtPiAnYSB0ID0gXCJjYW1sX3dlYWtfY3JlYXRlXCJcblxuKCoqIG51bWJlciBvZiBhZGRpdGlvbmFsIHZhbHVlcyBpbiBhIHdlYWsgcG9pbnRlclxuICogICAgLSBMaW5rXG4gKiAgICAtIERhdGEgKilcbmxldCBhZGRpdGlvbmFsX3ZhbHVlcyA9IDIgKCogQ0FNTF9FUEhFX0ZJUlNUX0tFWSBpbiB3ZWFrLmggKilcblxubGV0IGNyZWF0ZSBsID1cbiAgaWYgbm90ICgwIDw9IGwgJiYgbCA8PSBPYmouRXBoZW1lcm9uLm1heF9lcGhlX2xlbmd0aCkgdGhlblxuICAgIGludmFsaWRfYXJnKFwiV2Vhay5jcmVhdGVcIik7XG4gIGNyZWF0ZSBsXG5cblxubGV0IGxlbmd0aCB4ID0gT2JqLnNpemUoT2JqLnJlcHIgeCkgLSBhZGRpdGlvbmFsX3ZhbHVlc1xuXG5sZXQgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIG1zZyA9XG4gIGlmIG5vdCAoMCA8PSBvICYmIG8gPCBsZW5ndGggZSkgdGhlblxuICAgIGludmFsaWRfYXJnKG1zZylcblxuZXh0ZXJuYWwgc2V0JyA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcImNhbWxfZXBoZV9zZXRfa2V5XCJcbmV4dGVybmFsIHVuc2V0IDogJ2EgdCAtPiBpbnQgLT4gdW5pdCA9IFwiY2FtbF9lcGhlX3Vuc2V0X2tleVwiXG5sZXQgc2V0IGUgbyB4ID1cbiAgcmFpc2VfaWZfaW52YWxpZF9vZmZzZXQgZSBvIFwiV2Vhay5zZXRcIjtcbiAgbWF0Y2ggeCB3aXRoXG4gIHwgTm9uZSAtPiB1bnNldCBlIG9cbiAgfCBTb21lIHggLT4gc2V0JyBlIG8geFxuXG5leHRlcm5hbCBnZXQgOiAnYSB0IC0+IGludCAtPiAnYSBvcHRpb24gPSBcImNhbWxfd2Vha19nZXRcIlxubGV0IGdldCBlIG8gPVxuICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJXZWFrLmdldFwiO1xuICBnZXQgZSBvXG5cbmV4dGVybmFsIGdldF9jb3B5IDogJ2EgdCAtPiBpbnQgLT4gJ2Egb3B0aW9uID0gXCJjYW1sX3dlYWtfZ2V0X2NvcHlcIlxubGV0IGdldF9jb3B5IGUgbyA9XG4gIHJhaXNlX2lmX2ludmFsaWRfb2Zmc2V0IGUgbyBcIldlYWsuZ2V0X2NvcHlcIjtcbiAgZ2V0X2NvcHkgZSBvXG5cbmV4dGVybmFsIGNoZWNrIDogJ2EgdCAtPiBpbnQgLT4gYm9vbCA9IFwiY2FtbF93ZWFrX2NoZWNrXCJcbmxldCBjaGVjayBlIG8gPVxuICByYWlzZV9pZl9pbnZhbGlkX29mZnNldCBlIG8gXCJXZWFrLmNoZWNrXCI7XG4gIGNoZWNrIGUgb1xuXG5leHRlcm5hbCBibGl0IDogJ2EgdCAtPiBpbnQgLT4gJ2EgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgPSBcImNhbWxfd2Vha19ibGl0XCJcblxuKCogYmxpdDogc3JjIHNyY29mZiBkc3QgZHN0b2ZmIGxlbiAqKVxubGV0IGJsaXQgZTEgbzEgZTIgbzIgbCA9XG4gIGlmIGwgPCAwIHx8IG8xIDwgMCB8fCBvMSA+IGxlbmd0aCBlMSAtIGxcbiAgICAgfHwgbzIgPCAwIHx8IG8yID4gbGVuZ3RoIGUyIC0gbFxuICB0aGVuIGludmFsaWRfYXJnIFwiV2Vhay5ibGl0XCJcbiAgZWxzZSBpZiBsIDw+IDAgdGhlbiBibGl0IGUxIG8xIGUyIG8yIGxcblxubGV0IGZpbGwgYXIgb2ZzIGxlbiB4ID1cbiAgaWYgb2ZzIDwgMCB8fCBsZW4gPCAwIHx8IG9mcyA+IGxlbmd0aCBhciAtIGxlblxuICB0aGVuIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IFwiV2Vhay5maWxsXCIpXG4gIGVsc2UgYmVnaW5cbiAgICBmb3IgaSA9IG9mcyB0byAob2ZzICsgbGVuIC0gMSkgZG9cbiAgICAgIHNldCBhciBpIHhcbiAgICBkb25lXG4gIGVuZFxuXG5cbigqKiBXZWFrIGhhc2ggdGFibGVzICopXG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdHlwZSBkYXRhXG4gIHR5cGUgdFxuICB2YWwgY3JlYXRlIDogaW50IC0+IHRcbiAgdmFsIGNsZWFyIDogdCAtPiB1bml0XG4gIHZhbCBtZXJnZSA6IHQgLT4gZGF0YSAtPiBkYXRhXG4gIHZhbCBhZGQgOiB0IC0+IGRhdGEgLT4gdW5pdFxuICB2YWwgcmVtb3ZlIDogdCAtPiBkYXRhIC0+IHVuaXRcbiAgdmFsIGZpbmQgOiB0IC0+IGRhdGEgLT4gZGF0YVxuICB2YWwgZmluZF9vcHQgOiB0IC0+IGRhdGEgLT4gZGF0YSBvcHRpb25cbiAgdmFsIGZpbmRfYWxsIDogdCAtPiBkYXRhIC0+IGRhdGEgbGlzdFxuICB2YWwgbWVtIDogdCAtPiBkYXRhIC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAoZGF0YSAtPiB1bml0KSAtPiB0IC0+IHVuaXRcbiAgdmFsIGZvbGQgOiAoZGF0YSAtPiAnYSAtPiAnYSkgLT4gdCAtPiAnYSAtPiAnYVxuICB2YWwgY291bnQgOiB0IC0+IGludFxuICB2YWwgc3RhdHMgOiB0IC0+IGludCAqIGludCAqIGludCAqIGludCAqIGludCAqIGludFxuZW5kXG5cbm1vZHVsZSBNYWtlIChIIDogSGFzaHRibC5IYXNoZWRUeXBlKSA6IChTIHdpdGggdHlwZSBkYXRhID0gSC50KSA9IHN0cnVjdFxuXG4gIHR5cGUgJ2Egd2Vha190ID0gJ2EgdFxuICBsZXQgd2Vha19jcmVhdGUgPSBjcmVhdGVcbiAgbGV0IGVtcHR5YnVja2V0ID0gd2Vha19jcmVhdGUgMFxuXG4gIHR5cGUgZGF0YSA9IEgudFxuXG4gIHR5cGUgdCA9IHtcbiAgICBtdXRhYmxlIHRhYmxlIDogZGF0YSB3ZWFrX3QgYXJyYXk7XG4gICAgbXV0YWJsZSBoYXNoZXMgOiBpbnQgYXJyYXkgYXJyYXk7XG4gICAgbXV0YWJsZSBsaW1pdCA6IGludDsgICAgICAgICAgICAgICAoKiBidWNrZXQgc2l6ZSBsaW1pdCAqKVxuICAgIG11dGFibGUgb3ZlcnNpemUgOiBpbnQ7ICAgICAgICAgICAgKCogbnVtYmVyIG9mIG92ZXJzaXplIGJ1Y2tldHMgKilcbiAgICBtdXRhYmxlIHJvdmVyIDogaW50OyAgICAgICAgICAgICAgICgqIGZvciBpbnRlcm5hbCBib29ra2VlcGluZyAqKVxuICB9XG5cbiAgbGV0IGdldF9pbmRleCB0IGggPSAoaCBsYW5kIG1heF9pbnQpIG1vZCAoQXJyYXkubGVuZ3RoIHQudGFibGUpXG5cbiAgbGV0IGxpbWl0ID0gN1xuICBsZXQgb3Zlcl9saW1pdCA9IDJcblxuICBsZXQgY3JlYXRlIHN6ID1cbiAgICBsZXQgc3ogPSBpZiBzeiA8IDcgdGhlbiA3IGVsc2Ugc3ogaW5cbiAgICBsZXQgc3ogPSBpZiBzeiA+IFN5cy5tYXhfYXJyYXlfbGVuZ3RoIHRoZW4gU3lzLm1heF9hcnJheV9sZW5ndGggZWxzZSBzeiBpblxuICAgIHtcbiAgICAgIHRhYmxlID0gQXJyYXkubWFrZSBzeiBlbXB0eWJ1Y2tldDtcbiAgICAgIGhhc2hlcyA9IEFycmF5Lm1ha2Ugc3ogW3wgfF07XG4gICAgICBsaW1pdCA9IGxpbWl0O1xuICAgICAgb3ZlcnNpemUgPSAwO1xuICAgICAgcm92ZXIgPSAwO1xuICAgIH1cblxuICBsZXQgY2xlYXIgdCA9XG4gICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCB0LnRhYmxlIC0gMSBkb1xuICAgICAgdC50YWJsZS4oaSkgPC0gZW1wdHlidWNrZXQ7XG4gICAgICB0Lmhhc2hlcy4oaSkgPC0gW3wgfF07XG4gICAgZG9uZTtcbiAgICB0LmxpbWl0IDwtIGxpbWl0O1xuICAgIHQub3ZlcnNpemUgPC0gMFxuXG5cbiAgbGV0IGZvbGQgZiB0IGluaXQgPVxuICAgIGxldCByZWMgZm9sZF9idWNrZXQgaSBiIGFjY3UgPVxuICAgICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuIGFjY3UgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgICB8IFNvbWUgdiAtPiBmb2xkX2J1Y2tldCAoaSsxKSBiIChmIHYgYWNjdSlcbiAgICAgIHwgTm9uZSAtPiBmb2xkX2J1Y2tldCAoaSsxKSBiIGFjY3VcbiAgICBpblxuICAgIEFycmF5LmZvbGRfcmlnaHQgKGZvbGRfYnVja2V0IDApIHQudGFibGUgaW5pdFxuXG5cbiAgbGV0IGl0ZXIgZiB0ID1cbiAgICBsZXQgcmVjIGl0ZXJfYnVja2V0IGkgYiA9XG4gICAgICBpZiBpID49IGxlbmd0aCBiIHRoZW4gKCkgZWxzZVxuICAgICAgbWF0Y2ggZ2V0IGIgaSB3aXRoXG4gICAgICB8IFNvbWUgdiAtPiBmIHY7IGl0ZXJfYnVja2V0IChpKzEpIGJcbiAgICAgIHwgTm9uZSAtPiBpdGVyX2J1Y2tldCAoaSsxKSBiXG4gICAgaW5cbiAgICBBcnJheS5pdGVyIChpdGVyX2J1Y2tldCAwKSB0LnRhYmxlXG5cblxuICBsZXQgaXRlcl93ZWFrIGYgdCA9XG4gICAgbGV0IHJlYyBpdGVyX2J1Y2tldCBpIGogYiA9XG4gICAgICBpZiBpID49IGxlbmd0aCBiIHRoZW4gKCkgZWxzZVxuICAgICAgbWF0Y2ggY2hlY2sgYiBpIHdpdGhcbiAgICAgIHwgdHJ1ZSAtPiBmIGIgdC5oYXNoZXMuKGopIGk7IGl0ZXJfYnVja2V0IChpKzEpIGogYlxuICAgICAgfCBmYWxzZSAtPiBpdGVyX2J1Y2tldCAoaSsxKSBqIGJcbiAgICBpblxuICAgIEFycmF5Lml0ZXJpIChpdGVyX2J1Y2tldCAwKSB0LnRhYmxlXG5cblxuICBsZXQgcmVjIGNvdW50X2J1Y2tldCBpIGIgYWNjdSA9XG4gICAgaWYgaSA+PSBsZW5ndGggYiB0aGVuIGFjY3UgZWxzZVxuICAgIGNvdW50X2J1Y2tldCAoaSsxKSBiIChhY2N1ICsgKGlmIGNoZWNrIGIgaSB0aGVuIDEgZWxzZSAwKSlcblxuXG4gIGxldCBjb3VudCB0ID1cbiAgICBBcnJheS5mb2xkX3JpZ2h0IChjb3VudF9idWNrZXQgMCkgdC50YWJsZSAwXG5cblxuICBsZXQgbmV4dF9zeiBuID0gSW50Lm1pbiAoMyAqIG4gLyAyICsgMykgU3lzLm1heF9hcnJheV9sZW5ndGhcbiAgbGV0IHByZXZfc3ogbiA9ICgobiAtIDMpICogMiArIDIpIC8gM1xuXG4gIGxldCB0ZXN0X3Nocmlua19idWNrZXQgdCA9XG4gICAgbGV0IGJ1Y2tldCA9IHQudGFibGUuKHQucm92ZXIpIGluXG4gICAgbGV0IGhidWNrZXQgPSB0Lmhhc2hlcy4odC5yb3ZlcikgaW5cbiAgICBsZXQgbGVuID0gbGVuZ3RoIGJ1Y2tldCBpblxuICAgIGxldCBwcmV2X2xlbiA9IHByZXZfc3ogbGVuIGluXG4gICAgbGV0IGxpdmUgPSBjb3VudF9idWNrZXQgMCBidWNrZXQgMCBpblxuICAgIGlmIGxpdmUgPD0gcHJldl9sZW4gdGhlbiBiZWdpblxuICAgICAgbGV0IHJlYyBsb29wIGkgaiA9XG4gICAgICAgIGlmIGogPj0gcHJldl9sZW4gdGhlbiBiZWdpblxuICAgICAgICAgIGlmIGNoZWNrIGJ1Y2tldCBpIHRoZW4gbG9vcCAoaSArIDEpIGpcbiAgICAgICAgICBlbHNlIGlmIGNoZWNrIGJ1Y2tldCBqIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIGJsaXQgYnVja2V0IGogYnVja2V0IGkgMTtcbiAgICAgICAgICAgIGhidWNrZXQuKGkpIDwtIGhidWNrZXQuKGopO1xuICAgICAgICAgICAgbG9vcCAoaSArIDEpIChqIC0gMSk7XG4gICAgICAgICAgZW5kIGVsc2UgbG9vcCBpIChqIC0gMSk7XG4gICAgICAgIGVuZDtcbiAgICAgIGluXG4gICAgICBsb29wIDAgKGxlbmd0aCBidWNrZXQgLSAxKTtcbiAgICAgIGlmIHByZXZfbGVuID0gMCB0aGVuIGJlZ2luXG4gICAgICAgIHQudGFibGUuKHQucm92ZXIpIDwtIGVtcHR5YnVja2V0O1xuICAgICAgICB0Lmhhc2hlcy4odC5yb3ZlcikgPC0gW3wgfF07XG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBsZXQgbmV3YnVja2V0ID0gd2Vha19jcmVhdGUgcHJldl9sZW4gaW5cbiAgICAgICAgYmxpdCBidWNrZXQgMCBuZXdidWNrZXQgMCBwcmV2X2xlbjtcbiAgICAgICAgdC50YWJsZS4odC5yb3ZlcikgPC0gbmV3YnVja2V0O1xuICAgICAgICB0Lmhhc2hlcy4odC5yb3ZlcikgPC0gQXJyYXkuc3ViIGhidWNrZXQgMCBwcmV2X2xlblxuICAgICAgZW5kO1xuICAgICAgaWYgbGVuID4gdC5saW1pdCAmJiBwcmV2X2xlbiA8PSB0LmxpbWl0IHRoZW4gdC5vdmVyc2l6ZSA8LSB0Lm92ZXJzaXplIC0gMTtcbiAgICBlbmQ7XG4gICAgdC5yb3ZlciA8LSAodC5yb3ZlciArIDEpIG1vZCAoQXJyYXkubGVuZ3RoIHQudGFibGUpXG5cblxuICBsZXQgcmVjIHJlc2l6ZSB0ID1cbiAgICBsZXQgb2xkbGVuID0gQXJyYXkubGVuZ3RoIHQudGFibGUgaW5cbiAgICBsZXQgbmV3bGVuID0gbmV4dF9zeiBvbGRsZW4gaW5cbiAgICBpZiBuZXdsZW4gPiBvbGRsZW4gdGhlbiBiZWdpblxuICAgICAgbGV0IG5ld3QgPSBjcmVhdGUgbmV3bGVuIGluXG4gICAgICBsZXQgYWRkX3dlYWsgb2Igb2ggb2kgPVxuICAgICAgICBsZXQgc2V0dGVyIG5iIG5pIF8gPSBibGl0IG9iIG9pIG5iIG5pIDEgaW5cbiAgICAgICAgbGV0IGggPSBvaC4ob2kpIGluXG4gICAgICAgIGFkZF9hdXggbmV3dCBzZXR0ZXIgTm9uZSBoIChnZXRfaW5kZXggbmV3dCBoKTtcbiAgICAgIGluXG4gICAgICBpdGVyX3dlYWsgYWRkX3dlYWsgdDtcbiAgICAgIHQudGFibGUgPC0gbmV3dC50YWJsZTtcbiAgICAgIHQuaGFzaGVzIDwtIG5ld3QuaGFzaGVzO1xuICAgICAgdC5saW1pdCA8LSBuZXd0LmxpbWl0O1xuICAgICAgdC5vdmVyc2l6ZSA8LSBuZXd0Lm92ZXJzaXplO1xuICAgICAgdC5yb3ZlciA8LSB0LnJvdmVyIG1vZCBBcnJheS5sZW5ndGggbmV3dC50YWJsZTtcbiAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgdC5saW1pdCA8LSBtYXhfaW50OyAgICAgICAgICAgICAoKiBtYXhpbXVtIHNpemUgYWxyZWFkeSByZWFjaGVkICopXG4gICAgICB0Lm92ZXJzaXplIDwtIDA7XG4gICAgZW5kXG5cbiAgYW5kIGFkZF9hdXggdCBzZXR0ZXIgZCBoIGluZGV4ID1cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGJlZ2luXG4gICAgICAgIGxldCBuZXdzeiA9XG4gICAgICAgICAgSW50Lm1pbiAoMyAqIHN6IC8gMiArIDMpIChTeXMubWF4X2FycmF5X2xlbmd0aCAtIGFkZGl0aW9uYWxfdmFsdWVzKVxuICAgICAgICBpblxuICAgICAgICBpZiBuZXdzeiA8PSBzeiB0aGVuIGZhaWx3aXRoIFwiV2Vhay5NYWtlOiBoYXNoIGJ1Y2tldCBjYW5ub3QgZ3JvdyBtb3JlXCI7XG4gICAgICAgIGxldCBuZXdidWNrZXQgPSB3ZWFrX2NyZWF0ZSBuZXdzeiBpblxuICAgICAgICBsZXQgbmV3aGFzaGVzID0gQXJyYXkubWFrZSBuZXdzeiAwIGluXG4gICAgICAgIGJsaXQgYnVja2V0IDAgbmV3YnVja2V0IDAgc3o7XG4gICAgICAgIEFycmF5LmJsaXQgaGFzaGVzIDAgbmV3aGFzaGVzIDAgc3o7XG4gICAgICAgIHNldHRlciBuZXdidWNrZXQgc3ogZDtcbiAgICAgICAgbmV3aGFzaGVzLihzeikgPC0gaDtcbiAgICAgICAgdC50YWJsZS4oaW5kZXgpIDwtIG5ld2J1Y2tldDtcbiAgICAgICAgdC5oYXNoZXMuKGluZGV4KSA8LSBuZXdoYXNoZXM7XG4gICAgICAgIGlmIHN6IDw9IHQubGltaXQgJiYgbmV3c3ogPiB0LmxpbWl0IHRoZW4gYmVnaW5cbiAgICAgICAgICB0Lm92ZXJzaXplIDwtIHQub3ZlcnNpemUgKyAxO1xuICAgICAgICAgIGZvciBfaSA9IDAgdG8gb3Zlcl9saW1pdCBkbyB0ZXN0X3Nocmlua19idWNrZXQgdCBkb25lO1xuICAgICAgICBlbmQ7XG4gICAgICAgIGlmIHQub3ZlcnNpemUgPiBBcnJheS5sZW5ndGggdC50YWJsZSAvIG92ZXJfbGltaXQgdGhlbiByZXNpemUgdDtcbiAgICAgIGVuZCBlbHNlIGlmIGNoZWNrIGJ1Y2tldCBpIHRoZW4gYmVnaW5cbiAgICAgICAgbG9vcCAoaSArIDEpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBzZXR0ZXIgYnVja2V0IGkgZDtcbiAgICAgICAgaGFzaGVzLihpKSA8LSBoO1xuICAgICAgZW5kO1xuICAgIGluXG4gICAgbG9vcCAwXG5cblxuICBsZXQgYWRkIHQgZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGFkZF9hdXggdCBzZXQgKFNvbWUgZCkgaCAoZ2V0X2luZGV4IHQgaClcblxuXG4gIGxldCBmaW5kX29yIHQgZCBpZm5vdGZvdW5kID1cbiAgICBsZXQgaCA9IEguaGFzaCBkIGluXG4gICAgbGV0IGluZGV4ID0gZ2V0X2luZGV4IHQgaCBpblxuICAgIGxldCBidWNrZXQgPSB0LnRhYmxlLihpbmRleCkgaW5cbiAgICBsZXQgaGFzaGVzID0gdC5oYXNoZXMuKGluZGV4KSBpblxuICAgIGxldCBzeiA9IGxlbmd0aCBidWNrZXQgaW5cbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpZiBpID49IHN6IHRoZW4gaWZub3Rmb3VuZCBoIGluZGV4XG4gICAgICBlbHNlIGlmIGggPSBoYXNoZXMuKGkpIHRoZW4gYmVnaW5cbiAgICAgICAgbWF0Y2ggZ2V0X2NvcHkgYnVja2V0IGkgd2l0aFxuICAgICAgICB8IFNvbWUgdiB3aGVuIEguZXF1YWwgdiBkXG4gICAgICAgICAgIC0+IGJlZ2luIG1hdGNoIGdldCBidWNrZXQgaSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSB2IC0+IHZcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgICAgICAgICBlbmRcbiAgICAgICAgfCBfIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgZW5kIGVsc2UgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcblxuXG4gIGxldCBtZXJnZSB0IGQgPVxuICAgIGZpbmRfb3IgdCBkIChmdW4gaCBpbmRleCAtPiBhZGRfYXV4IHQgc2V0IChTb21lIGQpIGggaW5kZXg7IGQpXG5cblxuICBsZXQgZmluZCB0IGQgPSBmaW5kX29yIHQgZCAoZnVuIF9oIF9pbmRleCAtPiByYWlzZSBOb3RfZm91bmQpXG5cbiAgbGV0IGZpbmRfb3B0IHQgZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGxldCBpbmRleCA9IGdldF9pbmRleCB0IGggaW5cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIE5vbmVcbiAgICAgIGVsc2UgaWYgaCA9IGhhc2hlcy4oaSkgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBnZXRfY29weSBidWNrZXQgaSB3aXRoXG4gICAgICAgIHwgU29tZSB2IHdoZW4gSC5lcXVhbCB2IGRcbiAgICAgICAgICAgLT4gYmVnaW4gbWF0Y2ggZ2V0IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgICAgICAgfCBTb21lIF8gYXMgdiAtPiB2XG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSlcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgIHwgXyAtPiBsb29wIChpICsgMSlcbiAgICAgIGVuZCBlbHNlIGxvb3AgKGkgKyAxKVxuICAgIGluXG4gICAgbG9vcCAwXG5cblxuICBsZXQgZmluZF9zaGFkb3cgdCBkIGlmZm91bmQgaWZub3Rmb3VuZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGxldCBpbmRleCA9IGdldF9pbmRleCB0IGggaW5cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgPVxuICAgICAgaWYgaSA+PSBzeiB0aGVuIGlmbm90Zm91bmRcbiAgICAgIGVsc2UgaWYgaCA9IGhhc2hlcy4oaSkgdGhlbiBiZWdpblxuICAgICAgICBtYXRjaCBnZXRfY29weSBidWNrZXQgaSB3aXRoXG4gICAgICAgIHwgU29tZSB2IHdoZW4gSC5lcXVhbCB2IGQgLT4gaWZmb3VuZCBidWNrZXQgaVxuICAgICAgICB8IF8gLT4gbG9vcCAoaSArIDEpXG4gICAgICBlbmQgZWxzZSBsb29wIChpICsgMSlcbiAgICBpblxuICAgIGxvb3AgMFxuXG5cbiAgbGV0IHJlbW92ZSB0IGQgPSBmaW5kX3NoYWRvdyB0IGQgKGZ1biB3IGkgLT4gc2V0IHcgaSBOb25lKSAoKVxuXG5cbiAgbGV0IG1lbSB0IGQgPSBmaW5kX3NoYWRvdyB0IGQgKGZ1biBfdyBfaSAtPiB0cnVlKSBmYWxzZVxuXG5cbiAgbGV0IGZpbmRfYWxsIHQgZCA9XG4gICAgbGV0IGggPSBILmhhc2ggZCBpblxuICAgIGxldCBpbmRleCA9IGdldF9pbmRleCB0IGggaW5cbiAgICBsZXQgYnVja2V0ID0gdC50YWJsZS4oaW5kZXgpIGluXG4gICAgbGV0IGhhc2hlcyA9IHQuaGFzaGVzLihpbmRleCkgaW5cbiAgICBsZXQgc3ogPSBsZW5ndGggYnVja2V0IGluXG4gICAgbGV0IHJlYyBsb29wIGkgYWNjdSA9XG4gICAgICBpZiBpID49IHN6IHRoZW4gYWNjdVxuICAgICAgZWxzZSBpZiBoID0gaGFzaGVzLihpKSB0aGVuIGJlZ2luXG4gICAgICAgIG1hdGNoIGdldF9jb3B5IGJ1Y2tldCBpIHdpdGhcbiAgICAgICAgfCBTb21lIHYgd2hlbiBILmVxdWFsIHYgZFxuICAgICAgICAgICAtPiBiZWdpbiBtYXRjaCBnZXQgYnVja2V0IGkgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgdiAtPiBsb29wIChpICsgMSkgKHYgOjogYWNjdSlcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKSBhY2N1XG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICB8IF8gLT4gbG9vcCAoaSArIDEpIGFjY3VcbiAgICAgIGVuZCBlbHNlIGxvb3AgKGkgKyAxKSBhY2N1XG4gICAgaW5cbiAgICBsb29wIDAgW11cblxuXG4gIGxldCBzdGF0cyB0ID1cbiAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHQudGFibGUgaW5cbiAgICBsZXQgbGVucyA9IEFycmF5Lm1hcCBsZW5ndGggdC50YWJsZSBpblxuICAgIEFycmF5LnNvcnQgY29tcGFyZSBsZW5zO1xuICAgIGxldCB0b3RsZW4gPSBBcnJheS5mb2xkX2xlZnQgKCArICkgMCBsZW5zIGluXG4gICAgKGxlbiwgY291bnQgdCwgdG90bGVuLCBsZW5zLigwKSwgbGVucy4obGVuLzIpLCBsZW5zLihsZW4tMSkpXG5cblxuZW5kXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBQaWVycmUgV2VpcywgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAxOTk2IEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIEEgcHJldHR5LXByaW50aW5nIGZhY2lsaXR5IGFuZCBkZWZpbml0aW9uIG9mIGZvcm1hdHRlcnMgZm9yICdwYXJhbGxlbCdcbiAgIChpLmUuIHVucmVsYXRlZCBvciBpbmRlcGVuZGVudCkgcHJldHR5LXByaW50aW5nIG9uIG11bHRpcGxlIG91dCBjaGFubmVscy4gKilcblxuKCpcbiAgIFRoZSBwcmV0dHktcHJpbnRpbmcgZW5naW5lIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy5cbiopXG5cbmxldCBpZCB4ID0geFxuXG4oKiBBIGRldm90ZWQgdHlwZSBmb3Igc2l6ZXMgdG8gYXZvaWQgY29uZnVzaW9uXG4gICBiZXR3ZWVuIHNpemVzIGFuZCBtZXJlIGludGVnZXJzLiAqKVxubW9kdWxlIFNpemUgOiBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIHRvX2ludCA6IHQgLT4gaW50XG4gIHZhbCBvZl9pbnQgOiBpbnQgLT4gdFxuICB2YWwgemVybyA6IHRcbiAgdmFsIHVua25vd24gOiB0XG4gIHZhbCBpc19rbm93biA6IHQgLT4gYm9vbFxuZW5kICA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnRcblxuICBsZXQgdG9faW50ID0gaWRcbiAgbGV0IG9mX2ludCA9IGlkXG4gIGxldCB6ZXJvID0gMFxuICBsZXQgdW5rbm93biA9IC0xXG4gIGxldCBpc19rbm93biBuID0gbiA+PSAwXG5lbmRcblxuXG5cbigqIFRoZSBwcmV0dHktcHJpbnRpbmcgYm94ZXMgZGVmaW5pdGlvbjpcbiAgIGEgcHJldHR5LXByaW50aW5nIGJveCBpcyBlaXRoZXJcbiAgIC0gaGJveDogaG9yaXpvbnRhbCBib3ggKG5vIGxpbmUgc3BsaXR0aW5nKVxuICAgLSB2Ym94OiB2ZXJ0aWNhbCBib3ggKGV2ZXJ5IGJyZWFrIGhpbnQgc3BsaXRzIHRoZSBsaW5lKVxuICAgLSBodmJveDogaG9yaXpvbnRhbC92ZXJ0aWNhbCBib3hcbiAgICAgKHRoZSBib3ggYmVoYXZlcyBhcyBhbiBob3Jpem9udGFsIGJveCBpZiBpdCBmaXRzIG9uXG4gICAgICB0aGUgY3VycmVudCBsaW5lLCBvdGhlcndpc2UgdGhlIGJveCBiZWhhdmVzIGFzIGEgdmVydGljYWwgYm94KVxuICAgLSBob3Zib3g6IGhvcml6b250YWwgb3IgdmVydGljYWwgY29tcGFjdGluZyBib3hcbiAgICAgKHRoZSBib3ggaXMgY29tcGFjdGluZyBtYXRlcmlhbCwgcHJpbnRpbmcgYXMgbXVjaCBtYXRlcmlhbCBhcyBwb3NzaWJsZVxuICAgICAgb24gZXZlcnkgbGluZXMpXG4gICAtIGJveDogaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBjb21wYWN0aW5nIGJveCB3aXRoIGVuaGFuY2VkIGJveCBzdHJ1Y3R1cmVcbiAgICAgKHRoZSBib3ggYmVoYXZlcyBhcyBhbiBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGJveCBidXQgYnJlYWsgaGludHMgc3BsaXRcbiAgICAgIHRoZSBsaW5lIGlmIHNwbGl0dGluZyB3b3VsZCBtb3ZlIHRvIHRoZSBsZWZ0KVxuKilcbnR5cGUgYm94X3R5cGUgPSBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3MuYmxvY2tfdHlwZSA9XG4gIHwgUHBfaGJveCB8IFBwX3Zib3ggfCBQcF9odmJveCB8IFBwX2hvdmJveCB8IFBwX2JveCB8IFBwX2ZpdHNcblxuXG4oKiBUaGUgcHJldHR5LXByaW50aW5nIHRva2VucyBkZWZpbml0aW9uOlxuICAgYXJlIGVpdGhlciB0ZXh0IHRvIHByaW50IG9yIHByZXR0eSBwcmludGluZ1xuICAgZWxlbWVudHMgdGhhdCBkcml2ZSBpbmRlbnRhdGlvbiBhbmQgbGluZSBzcGxpdHRpbmcuICopXG50eXBlIHBwX3Rva2VuID1cbiAgfCBQcF90ZXh0IG9mIHN0cmluZyAgICAgICAgICAoKiBub3JtYWwgdGV4dCAqKVxuICB8IFBwX2JyZWFrIG9mIHsgICAgICAgICAgICAgICgqIGNvbXBsZXRlIGJyZWFrICopXG4gICAgICBmaXRzOiBzdHJpbmcgKiBpbnQgKiBzdHJpbmc7ICAgKCogbGluZSBpcyBub3Qgc3BsaXQgKilcbiAgICAgIGJyZWFrczogc3RyaW5nICogaW50ICogc3RyaW5nOyAoKiBsaW5lIGlzIHNwbGl0ICopXG4gICAgfVxuICB8IFBwX3RicmVhayBvZiBpbnQgKiBpbnQgICAgICgqIGdvIHRvIG5leHQgdGFidWxhdGlvbiAqKVxuICB8IFBwX3N0YWIgICAgICAgICAgICAgICAgICAgICgqIHNldCBhIHRhYnVsYXRpb24gKilcbiAgfCBQcF9iZWdpbiBvZiBpbnQgKiBib3hfdHlwZSAoKiBiZWdpbm5pbmcgb2YgYSBib3ggKilcbiAgfCBQcF9lbmQgICAgICAgICAgICAgICAgICAgICAoKiBlbmQgb2YgYSBib3ggKilcbiAgfCBQcF90YmVnaW4gb2YgdGJveCAgICAgICAgICAoKiBiZWdpbm5pbmcgb2YgYSB0YWJ1bGF0aW9uIGJveCAqKVxuICB8IFBwX3RlbmQgICAgICAgICAgICAgICAgICAgICgqIGVuZCBvZiBhIHRhYnVsYXRpb24gYm94ICopXG4gIHwgUHBfbmV3bGluZSAgICAgICAgICAgICAgICAgKCogdG8gZm9yY2UgYSBuZXdsaW5lIGluc2lkZSBhIGJveCAqKVxuICB8IFBwX2lmX25ld2xpbmUgICAgICAgICAgICAgICgqIHRvIGRvIHNvbWV0aGluZyBvbmx5IGlmIHRoaXMgdmVyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgaGFzIGJlZW4gYnJva2VuICopXG4gIHwgUHBfb3Blbl90YWcgb2Ygc3RhZyAgICAgICAgICgqIG9wZW5pbmcgYSB0YWcgbmFtZSAqKVxuICB8IFBwX2Nsb3NlX3RhZyAgICAgICAgICAgICAgICgqIGNsb3NpbmcgdGhlIG1vc3QgcmVjZW50bHkgb3BlbiB0YWcgKilcblxuYW5kIHN0YWcgPSAuLlxuXG5hbmQgdGJveCA9IFBwX3Rib3ggb2YgaW50IGxpc3QgcmVmICAoKiBUYWJ1bGF0aW9uIGJveCAqKVxuXG50eXBlIHRhZyA9IHN0cmluZ1xudHlwZSBzdGFnICs9IFN0cmluZ190YWcgb2YgdGFnXG5cblxuKCogVGhlIHByZXR0eS1wcmludGVyIHF1ZXVlOlxuICAgcHJldHR5LXByaW50aW5nIG1hdGVyaWFsIGlzIG5vdCB3cml0dGVuIGluIHRoZSBvdXRwdXQgYXMgc29vbiBhcyBlbWl0dGVkO1xuICAgaW5zdGVhZCwgdGhlIG1hdGVyaWFsIGlzIHNpbXBseSByZWNvcmRlZCBpbiB0aGUgcHJldHR5LXByaW50ZXIgcXVldWUsXG4gICB1bnRpbCB0aGUgZW5jbG9zaW5nIGJveCBoYXMgYSBrbm93biBjb21wdXRlZCBzaXplIGFuZCBwcm9wZXIgc3BsaXR0aW5nXG4gICBkZWNpc2lvbnMgY2FuIGJlIG1hZGUuXG5cbiAgIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZSBjb250YWlucyBmb3JtYXR0aW5nIGVsZW1lbnRzIHRvIGJlIHByaW50ZWQuXG4gICBFYWNoIGZvcm1hdHRpbmcgZWxlbWVudCBpcyBhIHR1cGxlIChzaXplLCB0b2tlbiwgbGVuZ3RoKSwgd2hlcmVcbiAgIC0gbGVuZ3RoIGlzIHRoZSBkZWNsYXJlZCBsZW5ndGggb2YgdGhlIHRva2VuLFxuICAgLSBzaXplIGlzIGVmZmVjdGl2ZSBzaXplIG9mIHRoZSB0b2tlbiB3aGVuIGl0IGlzIHByaW50ZWRcbiAgICAgKHNpemUgaXMgc2V0IHdoZW4gdGhlIHNpemUgb2YgdGhlIGJveCBpcyBrbm93biwgc28gdGhhdCBzaXplIG9mIGJyZWFrXG4gICAgICBoaW50cyBhcmUgZGVmaW5pdGl2ZSkuICopXG50eXBlIHBwX3F1ZXVlX2VsZW0gPSB7XG4gIG11dGFibGUgc2l6ZSA6IFNpemUudDtcbiAgdG9rZW4gOiBwcF90b2tlbjtcbiAgbGVuZ3RoIDogaW50O1xufVxuXG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZSBkZWZpbml0aW9uLiAqKVxudHlwZSBwcF9xdWV1ZSA9IHBwX3F1ZXVlX2VsZW0gUXVldWUudFxuXG4oKiBUaGUgcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2suICopXG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBzY2FubmluZyBzdGFjazogc2Nhbm5pbmcgZWxlbWVudCBkZWZpbml0aW9uLiAqKVxudHlwZSBwcF9zY2FuX2VsZW0gPSB7XG4gIGxlZnRfdG90YWwgOiBpbnQ7ICgqIFZhbHVlIG9mIHBwX2xlZnRfdG90YWwgd2hlbiB0aGUgZWxlbWVudCB3YXMgZW5xdWV1ZWQuICopXG4gIHF1ZXVlX2VsZW0gOiBwcF9xdWV1ZV9lbGVtXG59XG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBmb3JtYXR0aW5nIHN0YWNrOlxuICAgdGhlIGZvcm1hdHRpbmcgc3RhY2sgY29udGFpbnMgdGhlIGRlc2NyaXB0aW9uIG9mIGFsbCB0aGUgY3VycmVudGx5IGFjdGl2ZVxuICAgYm94ZXM7IHRoZSBwcmV0dHktcHJpbnRlciBmb3JtYXR0aW5nIHN0YWNrIGlzIHVzZWQgdG8gc3BsaXQgdGhlIGxpbmVzXG4gICB3aGlsZSBwcmludGluZyB0b2tlbnMuICopXG5cbigqIFRoZSBwcmV0dHktcHJpbnRlciBmb3JtYXR0aW5nIHN0YWNrOiBmb3JtYXR0aW5nIHN0YWNrIGVsZW1lbnQgZGVmaW5pdGlvbi5cbiAgIEVhY2ggc3RhY2sgZWxlbWVudCBkZXNjcmliZXMgYSBwcmV0dHktcHJpbnRpbmcgYm94LiAqKVxudHlwZSBwcF9mb3JtYXRfZWxlbSA9IHsgYm94X3R5cGUgOiBib3hfdHlwZTsgd2lkdGggOiBpbnQgfVxuXG4oKiBUaGUgZm9ybWF0dGVyIGRlZmluaXRpb24uXG4gICBFYWNoIGZvcm1hdHRlciB2YWx1ZSBpcyBhIHByZXR0eS1wcmludGVyIGluc3RhbmNlIHdpdGggYWxsIGl0c1xuICAgbWFjaGluZXJ5LiAqKVxudHlwZSBmb3JtYXR0ZXIgPSB7XG4gICgqIFRoZSBwcmV0dHktcHJpbnRlciBzY2FubmluZyBzdGFjay4gKilcbiAgcHBfc2Nhbl9zdGFjayA6IHBwX3NjYW5fZWxlbSBTdGFjay50O1xuICAoKiBUaGUgcHJldHR5LXByaW50ZXIgZm9ybWF0dGluZyBzdGFjay4gKilcbiAgcHBfZm9ybWF0X3N0YWNrIDogcHBfZm9ybWF0X2VsZW0gU3RhY2sudDtcbiAgcHBfdGJveF9zdGFjayA6IHRib3ggU3RhY2sudDtcbiAgKCogVGhlIHByZXR0eS1wcmludGVyIHNlbWFudGljcyB0YWcgc3RhY2suICopXG4gIHBwX3RhZ19zdGFjayA6IHN0YWcgU3RhY2sudDtcbiAgcHBfbWFya19zdGFjayA6IHN0YWcgU3RhY2sudDtcbiAgKCogVmFsdWUgb2YgcmlnaHQgbWFyZ2luLiAqKVxuICBtdXRhYmxlIHBwX21hcmdpbiA6IGludDtcbiAgKCogTWluaW1hbCBzcGFjZSBsZWZ0IGJlZm9yZSBtYXJnaW4sIHdoZW4gb3BlbmluZyBhIGJveC4gKilcbiAgbXV0YWJsZSBwcF9taW5fc3BhY2VfbGVmdCA6IGludDtcbiAgKCogTWF4aW11bSB2YWx1ZSBvZiBpbmRlbnRhdGlvbjpcbiAgICAgbm8gYm94IGNhbiBiZSBvcGVuZWQgZnVydGhlci4gKilcbiAgbXV0YWJsZSBwcF9tYXhfaW5kZW50IDogaW50O1xuICAoKiBTcGFjZSByZW1haW5pbmcgb24gdGhlIGN1cnJlbnQgbGluZS4gKilcbiAgbXV0YWJsZSBwcF9zcGFjZV9sZWZ0IDogaW50O1xuICAoKiBDdXJyZW50IHZhbHVlIG9mIGluZGVudGF0aW9uLiAqKVxuICBtdXRhYmxlIHBwX2N1cnJlbnRfaW5kZW50IDogaW50O1xuICAoKiBUcnVlIHdoZW4gdGhlIGxpbmUgaGFzIGJlZW4gYnJva2VuIGJ5IHRoZSBwcmV0dHktcHJpbnRlci4gKilcbiAgbXV0YWJsZSBwcF9pc19uZXdfbGluZSA6IGJvb2w7XG4gICgqIFRvdGFsIHdpZHRoIG9mIHRva2VucyBhbHJlYWR5IHByaW50ZWQuICopXG4gIG11dGFibGUgcHBfbGVmdF90b3RhbCA6IGludDtcbiAgKCogVG90YWwgd2lkdGggb2YgdG9rZW5zIGV2ZXIgcHV0IGluIHF1ZXVlLiAqKVxuICBtdXRhYmxlIHBwX3JpZ2h0X3RvdGFsIDogaW50O1xuICAoKiBDdXJyZW50IG51bWJlciBvZiBvcGVuIGJveGVzLiAqKVxuICBtdXRhYmxlIHBwX2N1cnJfZGVwdGggOiBpbnQ7XG4gICgqIE1heGltdW0gbnVtYmVyIG9mIGJveGVzIHdoaWNoIGNhbiBiZSBzaW11bHRhbmVvdXNseSBvcGVuLiAqKVxuICBtdXRhYmxlIHBwX21heF9ib3hlcyA6IGludDtcbiAgKCogRWxsaXBzaXMgc3RyaW5nLiAqKVxuICBtdXRhYmxlIHBwX2VsbGlwc2lzIDogc3RyaW5nO1xuICAoKiBPdXRwdXQgZnVuY3Rpb24uICopXG4gIG11dGFibGUgcHBfb3V0X3N0cmluZyA6IHN0cmluZyAtPiBpbnQgLT4gaW50IC0+IHVuaXQ7XG4gICgqIEZsdXNoaW5nIGZ1bmN0aW9uLiAqKVxuICBtdXRhYmxlIHBwX291dF9mbHVzaCA6IHVuaXQgLT4gdW5pdDtcbiAgKCogT3V0cHV0IG9mIG5ldyBsaW5lcy4gKilcbiAgbXV0YWJsZSBwcF9vdXRfbmV3bGluZSA6IHVuaXQgLT4gdW5pdDtcbiAgKCogT3V0cHV0IG9mIGJyZWFrIGhpbnRzIHNwYWNlcy4gKilcbiAgbXV0YWJsZSBwcF9vdXRfc3BhY2VzIDogaW50IC0+IHVuaXQ7XG4gICgqIE91dHB1dCBvZiBpbmRlbnRhdGlvbiBvZiBuZXcgbGluZXMuICopXG4gIG11dGFibGUgcHBfb3V0X2luZGVudCA6IGludCAtPiB1bml0O1xuICAoKiBBcmUgdGFncyBwcmludGVkID8gKilcbiAgbXV0YWJsZSBwcF9wcmludF90YWdzIDogYm9vbDtcbiAgKCogQXJlIHRhZ3MgbWFya2VkID8gKilcbiAgbXV0YWJsZSBwcF9tYXJrX3RhZ3MgOiBib29sO1xuICAoKiBGaW5kIG9wZW5pbmcgYW5kIGNsb3NpbmcgbWFya2VycyBvZiB0YWdzLiAqKVxuICBtdXRhYmxlIHBwX21hcmtfb3Blbl90YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgbXV0YWJsZSBwcF9tYXJrX2Nsb3NlX3RhZyA6IHN0YWcgLT4gc3RyaW5nO1xuICBtdXRhYmxlIHBwX3ByaW50X29wZW5fdGFnIDogc3RhZyAtPiB1bml0O1xuICBtdXRhYmxlIHBwX3ByaW50X2Nsb3NlX3RhZyA6IHN0YWcgLT4gdW5pdDtcbiAgKCogVGhlIHByZXR0eS1wcmludGVyIHF1ZXVlLiAqKVxuICBwcF9xdWV1ZSA6IHBwX3F1ZXVlO1xufVxuXG5cbigqIFRoZSBmb3JtYXR0ZXIgc3BlY2lmaWMgdGFnIGhhbmRsaW5nIGZ1bmN0aW9ucy4gKilcbnR5cGUgZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zID0ge1xuICBtYXJrX29wZW5fc3RhZyA6IHN0YWcgLT4gc3RyaW5nO1xuICBtYXJrX2Nsb3NlX3N0YWcgOiBzdGFnIC0+IHN0cmluZztcbiAgcHJpbnRfb3Blbl9zdGFnIDogc3RhZyAtPiB1bml0O1xuICBwcmludF9jbG9zZV9zdGFnIDogc3RhZyAtPiB1bml0O1xufVxuXG5cbigqIFRoZSBmb3JtYXR0ZXIgZnVuY3Rpb25zIHRvIG91dHB1dCBtYXRlcmlhbC4gKilcbnR5cGUgZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgPSB7XG4gIG91dF9zdHJpbmcgOiBzdHJpbmcgLT4gaW50IC0+IGludCAtPiB1bml0O1xuICBvdXRfZmx1c2ggOiB1bml0IC0+IHVuaXQ7XG4gIG91dF9uZXdsaW5lIDogdW5pdCAtPiB1bml0O1xuICBvdXRfc3BhY2VzIDogaW50IC0+IHVuaXQ7XG4gIG91dF9pbmRlbnQgOiBpbnQgLT4gdW5pdDtcbn1cblxuXG4oKlxuXG4gIEF1eGlsaWFyaWVzIGFuZCBiYXNpYyBmdW5jdGlvbnMuXG5cbiopXG5cbigqIEVudGVyIGEgdG9rZW4gaW4gdGhlIHByZXR0eS1wcmludGVyIHF1ZXVlLiAqKVxubGV0IHBwX2VucXVldWUgc3RhdGUgdG9rZW4gPVxuICBzdGF0ZS5wcF9yaWdodF90b3RhbCA8LSBzdGF0ZS5wcF9yaWdodF90b3RhbCArIHRva2VuLmxlbmd0aDtcbiAgUXVldWUuYWRkIHRva2VuIHN0YXRlLnBwX3F1ZXVlXG5cblxubGV0IHBwX2NsZWFyX3F1ZXVlIHN0YXRlID1cbiAgc3RhdGUucHBfbGVmdF90b3RhbCA8LSAxOyBzdGF0ZS5wcF9yaWdodF90b3RhbCA8LSAxO1xuICBRdWV1ZS5jbGVhciBzdGF0ZS5wcF9xdWV1ZVxuXG5cbigqIFBwX2luZmluaXR5OiBsYXJnZSB2YWx1ZSBmb3IgZGVmYXVsdCB0b2tlbnMgc2l6ZS5cblxuICAgUHBfaW5maW5pdHkgaXMgZG9jdW1lbnRlZCBhcyBiZWluZyBncmVhdGVyIHRoYW4gMWUxMDsgdG8gYXZvaWRcbiAgIGNvbmZ1c2lvbiBhYm91dCB0aGUgd29yZCAnZ3JlYXRlcicsIHdlIGNob29zZSBwcF9pbmZpbml0eSBncmVhdGVyXG4gICB0aGFuIDFlMTAgKyAxOyBmb3IgY29ycmVjdCBoYW5kbGluZyBvZiB0ZXN0cyBpbiB0aGUgYWxnb3JpdGhtLFxuICAgcHBfaW5maW5pdHkgbXVzdCBiZSBldmVuIG9uZSBtb3JlIHRoYW4gMWUxMCArIDE7IGxldCdzIHN0YW5kIG9uIHRoZVxuICAgc2FmZSBzaWRlIGJ5IGNob29zaW5nIDEuZTEwKzEwLlxuXG4gICBQcF9pbmZpbml0eSBjb3VsZCBwcm9iYWJseSBiZSAxMDczNzQxODIzIHRoYXQgaXMgMl4zMCAtIDEsIHRoYXQgaXNcbiAgIHRoZSBtaW5pbWFsIHVwcGVyIGJvdW5kIGZvciBpbnRlZ2Vyczsgbm93IHRoYXQgbWF4X2ludCBpcyBkZWZpbmVkLFxuICAgdGhpcyBsaW1pdCBjb3VsZCBhbHNvIGJlIGRlZmluZWQgYXMgbWF4X2ludCAtIDEuXG5cbiAgIEhvd2V2ZXIsIGJlZm9yZSBzZXR0aW5nIHBwX2luZmluaXR5IHRvIHNvbWV0aGluZyBhcm91bmQgbWF4X2ludCwgd2VcbiAgIG11c3QgY2FyZWZ1bGx5IGRvdWJsZS1jaGVjayBhbGwgdGhlIGludGVnZXIgYXJpdGhtZXRpYyBvcGVyYXRpb25zXG4gICB0aGF0IGludm9sdmUgcHBfaW5maW5pdHksIHNpbmNlIGFueSBvdmVyZmxvdyB3b3VsZCB3cmVjayBoYXZvYyB0aGVcbiAgIHByZXR0eS1wcmludGluZyBhbGdvcml0aG0ncyBpbnZhcmlhbnRzLiBHaXZlbiB0aGF0IHRoaXMgYXJpdGhtZXRpY1xuICAgY29ycmVjdG5lc3MgY2hlY2sgaXMgZGlmZmljdWx0IGFuZCBlcnJvciBwcm9uZSBhbmQgZ2l2ZW4gdGhhdCAxZTEwXG4gICArIDEgaXMgaW4gcHJhY3RpY2UgbGFyZ2UgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkIHRvIGF0dGVtcHQgdG8gc2V0XG4gICBwcF9pbmZpbml0eSB0byB0aGUgdGhlb3JldGljYWxseSBtYXhpbXVtIGxpbWl0LiBJdCBpcyBub3Qgd29ydGggdGhlXG4gICBidXJkZW4gISAqKVxubGV0IHBwX2luZmluaXR5ID0gMTAwMDAwMDAxMFxuXG4oKiBPdXRwdXQgZnVuY3Rpb25zIGZvciB0aGUgZm9ybWF0dGVyLiAqKVxubGV0IHBwX291dHB1dF9zdHJpbmcgc3RhdGUgcyA9IHN0YXRlLnBwX291dF9zdHJpbmcgcyAwIChTdHJpbmcubGVuZ3RoIHMpXG5hbmQgcHBfb3V0cHV0X25ld2xpbmUgc3RhdGUgPSBzdGF0ZS5wcF9vdXRfbmV3bGluZSAoKVxuYW5kIHBwX291dHB1dF9zcGFjZXMgc3RhdGUgbiA9IHN0YXRlLnBwX291dF9zcGFjZXMgblxuYW5kIHBwX291dHB1dF9pbmRlbnQgc3RhdGUgbiA9IHN0YXRlLnBwX291dF9pbmRlbnQgblxuXG4oKiBGb3JtYXQgYSB0ZXh0dWFsIHRva2VuICopXG5sZXQgZm9ybWF0X3BwX3RleHQgc3RhdGUgc2l6ZSB0ZXh0ID1cbiAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9zcGFjZV9sZWZ0IC0gc2l6ZTtcbiAgcHBfb3V0cHV0X3N0cmluZyBzdGF0ZSB0ZXh0O1xuICBzdGF0ZS5wcF9pc19uZXdfbGluZSA8LSBmYWxzZVxuXG4oKiBGb3JtYXQgYSBzdHJpbmcgYnkgaXRzIGxlbmd0aCwgaWYgbm90IGVtcHR5ICopXG5sZXQgZm9ybWF0X3N0cmluZyBzdGF0ZSBzID1cbiAgaWYgcyA8PiBcIlwiIHRoZW4gZm9ybWF0X3BwX3RleHQgc3RhdGUgKFN0cmluZy5sZW5ndGggcykgc1xuXG4oKiBUbyBmb3JtYXQgYSBicmVhaywgaW5kZW50aW5nIGEgbmV3IGxpbmUuICopXG5sZXQgYnJlYWtfbmV3X2xpbmUgc3RhdGUgKGJlZm9yZSwgb2Zmc2V0LCBhZnRlcikgd2lkdGggPVxuICBmb3JtYXRfc3RyaW5nIHN0YXRlIGJlZm9yZTtcbiAgcHBfb3V0cHV0X25ld2xpbmUgc3RhdGU7XG4gIHN0YXRlLnBwX2lzX25ld19saW5lIDwtIHRydWU7XG4gIGxldCBpbmRlbnQgPSBzdGF0ZS5wcF9tYXJnaW4gLSB3aWR0aCArIG9mZnNldCBpblxuICAoKiBEb24ndCBpbmRlbnQgbW9yZSB0aGFuIHBwX21heF9pbmRlbnQuICopXG4gIGxldCByZWFsX2luZGVudCA9IEludC5taW4gc3RhdGUucHBfbWF4X2luZGVudCBpbmRlbnQgaW5cbiAgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgPC0gcmVhbF9pbmRlbnQ7XG4gIHN0YXRlLnBwX3NwYWNlX2xlZnQgPC0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfY3VycmVudF9pbmRlbnQ7XG4gIHBwX291dHB1dF9pbmRlbnQgc3RhdGUgc3RhdGUucHBfY3VycmVudF9pbmRlbnQ7XG4gIGZvcm1hdF9zdHJpbmcgc3RhdGUgYWZ0ZXJcblxuXG4oKiBUbyBmb3JjZSBhIGxpbmUgYnJlYWsgaW5zaWRlIGEgYm94OiBubyBvZmZzZXQgaXMgYWRkZWQuICopXG5sZXQgYnJlYWtfbGluZSBzdGF0ZSB3aWR0aCA9IGJyZWFrX25ld19saW5lIHN0YXRlIChcIlwiLCAwLCBcIlwiKSB3aWR0aFxuXG4oKiBUbyBmb3JtYXQgYSBicmVhayB0aGF0IGZpdHMgb24gdGhlIGN1cnJlbnQgbGluZS4gKilcbmxldCBicmVha19zYW1lX2xpbmUgc3RhdGUgKGJlZm9yZSwgd2lkdGgsIGFmdGVyKSA9XG4gIGZvcm1hdF9zdHJpbmcgc3RhdGUgYmVmb3JlO1xuICBzdGF0ZS5wcF9zcGFjZV9sZWZ0IDwtIHN0YXRlLnBwX3NwYWNlX2xlZnQgLSB3aWR0aDtcbiAgcHBfb3V0cHV0X3NwYWNlcyBzdGF0ZSB3aWR0aDtcbiAgZm9ybWF0X3N0cmluZyBzdGF0ZSBhZnRlclxuXG5cbigqIFRvIGluZGVudCBubyBtb3JlIHRoYW4gcHBfbWF4X2luZGVudCwgaWYgb25lIHRyaWVzIHRvIG9wZW4gYSBib3hcbiAgIGJleW9uZCBwcF9tYXhfaW5kZW50LCB0aGVuIHRoZSBib3ggaXMgcmVqZWN0ZWQgb24gdGhlIGxlZnRcbiAgIGJ5IHNpbXVsYXRpbmcgYSBicmVhay4gKilcbmxldCBwcF9mb3JjZV9icmVha19saW5lIHN0YXRlID1cbiAgbWF0Y2ggU3RhY2sudG9wX29wdCBzdGF0ZS5wcF9mb3JtYXRfc3RhY2sgd2l0aFxuICB8IE5vbmUgLT4gcHBfb3V0cHV0X25ld2xpbmUgc3RhdGVcbiAgfCBTb21lIHsgYm94X3R5cGU7IHdpZHRoIH0gLT5cbiAgICBpZiB3aWR0aCA+IHN0YXRlLnBwX3NwYWNlX2xlZnQgdGhlblxuICAgICAgbWF0Y2ggYm94X3R5cGUgd2l0aFxuICAgICAgfCBQcF9maXRzIHwgUHBfaGJveCAtPiAoKVxuICAgICAgfCBQcF92Ym94IHwgUHBfaHZib3ggfCBQcF9ob3Zib3ggfCBQcF9ib3ggLT4gYnJlYWtfbGluZSBzdGF0ZSB3aWR0aFxuXG5cbigqIFRvIHNraXAgYSB0b2tlbiwgaWYgdGhlIHByZXZpb3VzIGxpbmUgaGFzIGJlZW4gYnJva2VuLiAqKVxubGV0IHBwX3NraXBfdG9rZW4gc3RhdGUgPVxuICBtYXRjaCBRdWV1ZS50YWtlX29wdCBzdGF0ZS5wcF9xdWV1ZSB3aXRoXG4gIHwgTm9uZSAtPiAoKSAoKiBwcmludF9pZl9uZXdsaW5lIG11c3QgaGF2ZSBiZWVuIHRoZSBsYXN0IHByaW50aW5nIGNvbW1hbmQgKilcbiAgfCBTb21lIHsgc2l6ZTsgbGVuZ3RoOyBfIH0gLT5cbiAgICBzdGF0ZS5wcF9sZWZ0X3RvdGFsIDwtIHN0YXRlLnBwX2xlZnRfdG90YWwgLSBsZW5ndGg7XG4gICAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9zcGFjZV9sZWZ0ICsgU2l6ZS50b19pbnQgc2l6ZVxuXG5cbigqXG5cbiAgVGhlIG1haW4gcHJldHR5IHByaW50aW5nIGZ1bmN0aW9ucy5cblxuKilcblxuKCogRm9ybWF0dGluZyBhIHRva2VuIHdpdGggYSBnaXZlbiBzaXplLiAqKVxubGV0IGZvcm1hdF9wcF90b2tlbiBzdGF0ZSBzaXplID0gZnVuY3Rpb25cblxuICB8IFBwX3RleHQgcyAtPlxuICAgIGZvcm1hdF9wcF90ZXh0IHN0YXRlIHNpemUgc1xuXG4gIHwgUHBfYmVnaW4gKG9mZiwgdHkpIC0+XG4gICAgbGV0IGluc2VydGlvbl9wb2ludCA9IHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnQgaW5cbiAgICBpZiBpbnNlcnRpb25fcG9pbnQgPiBzdGF0ZS5wcF9tYXhfaW5kZW50IHRoZW5cbiAgICAgICgqIGNhbiBub3Qgb3BlbiBhIGJveCByaWdodCB0aGVyZS4gKilcbiAgICAgIGJlZ2luIHBwX2ZvcmNlX2JyZWFrX2xpbmUgc3RhdGUgZW5kO1xuICAgIGxldCB3aWR0aCA9IHN0YXRlLnBwX3NwYWNlX2xlZnQgLSBvZmYgaW5cbiAgICBsZXQgYm94X3R5cGUgPVxuICAgICAgbWF0Y2ggdHkgd2l0aFxuICAgICAgfCBQcF92Ym94IC0+IFBwX3Zib3hcbiAgICAgIHwgUHBfaGJveCB8IFBwX2h2Ym94IHwgUHBfaG92Ym94IHwgUHBfYm94IHwgUHBfZml0cyAtPlxuICAgICAgICBpZiBzaXplID4gc3RhdGUucHBfc3BhY2VfbGVmdCB0aGVuIHR5IGVsc2UgUHBfZml0cyBpblxuICAgIFN0YWNrLnB1c2ggeyBib3hfdHlwZTsgd2lkdGggfSBzdGF0ZS5wcF9mb3JtYXRfc3RhY2tcblxuICB8IFBwX2VuZCAtPlxuICAgIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfZm9ybWF0X3N0YWNrIHw+IGlnbm9yZVxuXG4gIHwgUHBfdGJlZ2luIChQcF90Ym94IF8gYXMgdGJveCkgLT5cbiAgICBTdGFjay5wdXNoIHRib3ggc3RhdGUucHBfdGJveF9zdGFja1xuXG4gIHwgUHBfdGVuZCAtPlxuICAgIFN0YWNrLnBvcF9vcHQgc3RhdGUucHBfdGJveF9zdGFjayB8PiBpZ25vcmVcblxuICB8IFBwX3N0YWIgLT5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX3Rib3hfc3RhY2sgd2l0aFxuICAgIHwgTm9uZSAtPiAoKSAoKiBObyBvcGVuIHRhYnVsYXRpb24gYm94LiAqKVxuICAgIHwgU29tZSAoUHBfdGJveCB0YWJzKSAtPlxuICAgICAgbGV0IHJlYyBhZGRfdGFiIG4gPSBmdW5jdGlvblxuICAgICAgICB8IFtdIC0+IFtuXVxuICAgICAgICB8IHggOjogbCBhcyBscyAtPiBpZiBuIDwgeCB0aGVuIG4gOjogbHMgZWxzZSB4IDo6IGFkZF90YWIgbiBsIGluXG4gICAgICB0YWJzIDo9IGFkZF90YWIgKHN0YXRlLnBwX21hcmdpbiAtIHN0YXRlLnBwX3NwYWNlX2xlZnQpICF0YWJzXG4gICAgZW5kXG5cbiAgfCBQcF90YnJlYWsgKG4sIG9mZikgLT5cbiAgICBsZXQgaW5zZXJ0aW9uX3BvaW50ID0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfc3BhY2VfbGVmdCBpblxuICAgIGJlZ2luIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfdGJveF9zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+ICgpICgqIE5vIG9wZW4gdGFidWxhdGlvbiBib3guICopXG4gICAgfCBTb21lIChQcF90Ym94IHRhYnMpIC0+XG4gICAgICBsZXQgdGFiID1cbiAgICAgICAgbWF0Y2ggIXRhYnMgd2l0aFxuICAgICAgICB8IFtdIC0+IGluc2VydGlvbl9wb2ludFxuICAgICAgICB8IGZpcnN0IDo6IF8gLT5cbiAgICAgICAgICBsZXQgcmVjIGZpbmQgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBoZWFkIDo6IHRhaWwgLT5cbiAgICAgICAgICAgICAgaWYgaGVhZCA+PSBpbnNlcnRpb25fcG9pbnQgdGhlbiBoZWFkIGVsc2UgZmluZCB0YWlsXG4gICAgICAgICAgICB8IFtdIC0+IGZpcnN0IGluXG4gICAgICAgICAgZmluZCAhdGFicyBpblxuICAgICAgbGV0IG9mZnNldCA9IHRhYiAtIGluc2VydGlvbl9wb2ludCBpblxuICAgICAgaWYgb2Zmc2V0ID49IDBcbiAgICAgIHRoZW4gYnJlYWtfc2FtZV9saW5lIHN0YXRlIChcIlwiLCBvZmZzZXQgKyBuLCBcIlwiKVxuICAgICAgZWxzZSBicmVha19uZXdfbGluZSBzdGF0ZSAoXCJcIiwgdGFiICsgb2ZmLCBcIlwiKSBzdGF0ZS5wcF9tYXJnaW5cbiAgICBlbmRcblxuICB8IFBwX25ld2xpbmUgLT5cbiAgICBiZWdpbiBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX2Zvcm1hdF9zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+IHBwX291dHB1dF9uZXdsaW5lIHN0YXRlICgqIE5vIG9wZW4gYm94LiAqKVxuICAgIHwgU29tZSB7IHdpZHRoOyBffSAtPiBicmVha19saW5lIHN0YXRlIHdpZHRoXG4gICAgZW5kXG5cbiAgfCBQcF9pZl9uZXdsaW5lIC0+XG4gICAgaWYgc3RhdGUucHBfY3VycmVudF9pbmRlbnQgIT0gc3RhdGUucHBfbWFyZ2luIC0gc3RhdGUucHBfc3BhY2VfbGVmdFxuICAgIHRoZW4gcHBfc2tpcF90b2tlbiBzdGF0ZVxuXG4gIHwgUHBfYnJlYWsgeyBmaXRzOyBicmVha3MgfSAtPlxuICAgIGxldCBiZWZvcmUsIG9mZiwgXyA9IGJyZWFrcyBpblxuICAgIGJlZ2luIG1hdGNoIFN0YWNrLnRvcF9vcHQgc3RhdGUucHBfZm9ybWF0X3N0YWNrIHdpdGhcbiAgICB8IE5vbmUgLT4gKCkgKCogTm8gb3BlbiBib3guICopXG4gICAgfCBTb21lIHsgYm94X3R5cGU7IHdpZHRoIH0gLT5cbiAgICAgIGJlZ2luIG1hdGNoIGJveF90eXBlIHdpdGhcbiAgICAgIHwgUHBfaG92Ym94IC0+XG4gICAgICAgIGlmIHNpemUgKyBTdHJpbmcubGVuZ3RoIGJlZm9yZSA+IHN0YXRlLnBwX3NwYWNlX2xlZnRcbiAgICAgICAgdGhlbiBicmVha19uZXdfbGluZSBzdGF0ZSBicmVha3Mgd2lkdGhcbiAgICAgICAgZWxzZSBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0c1xuICAgICAgfCBQcF9ib3ggLT5cbiAgICAgICAgKCogSGF2ZSB0aGUgbGluZSBqdXN0IGJlZW4gYnJva2VuIGhlcmUgPyAqKVxuICAgICAgICBpZiBzdGF0ZS5wcF9pc19uZXdfbGluZSB0aGVuIGJyZWFrX3NhbWVfbGluZSBzdGF0ZSBmaXRzIGVsc2VcbiAgICAgICAgaWYgc2l6ZSArIFN0cmluZy5sZW5ndGggYmVmb3JlID4gc3RhdGUucHBfc3BhY2VfbGVmdFxuICAgICAgICAgIHRoZW4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoIGVsc2VcbiAgICAgICAgKCogYnJlYWsgdGhlIGxpbmUgaGVyZSBsZWFkcyB0byBuZXcgaW5kZW50YXRpb24gPyAqKVxuICAgICAgICBpZiBzdGF0ZS5wcF9jdXJyZW50X2luZGVudCA+IHN0YXRlLnBwX21hcmdpbiAtIHdpZHRoICsgb2ZmXG4gICAgICAgIHRoZW4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICAgIGVsc2UgYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIHwgUHBfaHZib3ggLT4gYnJlYWtfbmV3X2xpbmUgc3RhdGUgYnJlYWtzIHdpZHRoXG4gICAgICB8IFBwX2ZpdHMgLT4gYnJlYWtfc2FtZV9saW5lIHN0YXRlIGZpdHNcbiAgICAgIHwgUHBfdmJveCAtPiBicmVha19uZXdfbGluZSBzdGF0ZSBicmVha3Mgd2lkdGhcbiAgICAgIHwgUHBfaGJveCAtPiBicmVha19zYW1lX2xpbmUgc3RhdGUgZml0c1xuICAgICAgZW5kXG4gICAgZW5kXG5cbiAgIHwgUHBfb3Blbl90YWcgdGFnX25hbWUgLT5cbiAgICAgbGV0IG1hcmtlciA9IHN0YXRlLnBwX21hcmtfb3Blbl90YWcgdGFnX25hbWUgaW5cbiAgICAgcHBfb3V0cHV0X3N0cmluZyBzdGF0ZSBtYXJrZXI7XG4gICAgIFN0YWNrLnB1c2ggdGFnX25hbWUgc3RhdGUucHBfbWFya19zdGFja1xuXG4gICB8IFBwX2Nsb3NlX3RhZyAtPlxuICAgICBiZWdpbiBtYXRjaCBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX21hcmtfc3RhY2sgd2l0aFxuICAgICB8IE5vbmUgLT4gKCkgKCogTm8gbW9yZSB0YWcgdG8gY2xvc2UuICopXG4gICAgIHwgU29tZSB0YWdfbmFtZSAtPlxuICAgICAgIGxldCBtYXJrZXIgPSBzdGF0ZS5wcF9tYXJrX2Nsb3NlX3RhZyB0YWdfbmFtZSBpblxuICAgICAgIHBwX291dHB1dF9zdHJpbmcgc3RhdGUgbWFya2VyXG4gICAgIGVuZFxuXG5cbigqIFByaW50IGlmIHRva2VuIHNpemUgaXMga25vd24gZWxzZSBwcmludGluZyBpcyBkZWxheWVkLlxuICAgUHJpbnRpbmcgaXMgZGVsYXllZCB3aGVuIHRoZSB0ZXh0IHdhaXRpbmcgaW4gdGhlIHF1ZXVlIHJlcXVpcmVzXG4gICBtb3JlIHJvb20gdG8gZm9ybWF0IHRoYW4gZXhpc3RzIG9uIHRoZSBjdXJyZW50IGxpbmUuICopXG5sZXQgcmVjIGFkdmFuY2VfbGVmdCBzdGF0ZSA9XG4gIG1hdGNoIFF1ZXVlLnBlZWtfb3B0IHN0YXRlLnBwX3F1ZXVlIHdpdGhcbiAgfCBOb25lIC0+ICgpICgqIE5vIHRva2VucyB0byBwcmludCAqKVxuICB8IFNvbWUgeyBzaXplOyB0b2tlbjsgbGVuZ3RoIH0gLT5cbiAgICBsZXQgcGVuZGluZ19jb3VudCA9IHN0YXRlLnBwX3JpZ2h0X3RvdGFsIC0gc3RhdGUucHBfbGVmdF90b3RhbCBpblxuICAgIGlmIFNpemUuaXNfa25vd24gc2l6ZSB8fCBwZW5kaW5nX2NvdW50ID49IHN0YXRlLnBwX3NwYWNlX2xlZnQgdGhlbiBiZWdpblxuICAgICAgUXVldWUudGFrZSBzdGF0ZS5wcF9xdWV1ZSB8PiBpZ25vcmU7ICgqIE5vdCBlbXB0eTogd2UgcGVlayBpbnRvIGl0ICopXG4gICAgICBsZXQgc2l6ZSA9IGlmIFNpemUuaXNfa25vd24gc2l6ZSB0aGVuIFNpemUudG9faW50IHNpemUgZWxzZSBwcF9pbmZpbml0eSBpblxuICAgICAgZm9ybWF0X3BwX3Rva2VuIHN0YXRlIHNpemUgdG9rZW47XG4gICAgICBzdGF0ZS5wcF9sZWZ0X3RvdGFsIDwtIGxlbmd0aCArIHN0YXRlLnBwX2xlZnRfdG90YWw7XG4gICAgICAoYWR2YW5jZV9sZWZ0IFtAdGFpbGNhbGxdKSBzdGF0ZVxuICAgIGVuZFxuXG5cbigqIFRvIGVucXVldWUgYSB0b2tlbiA6IHRyeSB0byBhZHZhbmNlLiAqKVxubGV0IGVucXVldWVfYWR2YW5jZSBzdGF0ZSB0b2sgPSBwcF9lbnF1ZXVlIHN0YXRlIHRvazsgYWR2YW5jZV9sZWZ0IHN0YXRlXG5cblxuKCogVG8gZW5xdWV1ZSBzdHJpbmdzLiAqKVxubGV0IGVucXVldWVfc3RyaW5nX2FzIHN0YXRlIHNpemUgcyA9XG4gIGVucXVldWVfYWR2YW5jZSBzdGF0ZSB7IHNpemU7IHRva2VuID0gUHBfdGV4dCBzOyBsZW5ndGggPSBTaXplLnRvX2ludCBzaXplIH1cblxuXG5sZXQgZW5xdWV1ZV9zdHJpbmcgc3RhdGUgcyA9XG4gIGVucXVldWVfc3RyaW5nX2FzIHN0YXRlIChTaXplLm9mX2ludCAoU3RyaW5nLmxlbmd0aCBzKSkgc1xuXG5cbigqIFJvdXRpbmVzIGZvciBzY2FuIHN0YWNrXG4gICBkZXRlcm1pbmUgc2l6ZSBvZiBib3hlcy4gKilcblxuKCogVGhlIHNjYW5fc3RhY2sgaXMgbmV2ZXIgZW1wdHkuICopXG5sZXQgaW5pdGlhbGl6ZV9zY2FuX3N0YWNrIHN0YWNrID1cbiAgU3RhY2suY2xlYXIgc3RhY2s7XG4gIGxldCBxdWV1ZV9lbGVtID0geyBzaXplID0gU2l6ZS51bmtub3duOyB0b2tlbiA9IFBwX3RleHQgXCJcIjsgbGVuZ3RoID0gMCB9IGluXG4gIFN0YWNrLnB1c2ggeyBsZWZ0X3RvdGFsID0gLTE7IHF1ZXVlX2VsZW0gfSBzdGFja1xuXG4oKiBTZXR0aW5nIHRoZSBzaXplIG9mIGJveGVzIG9uIHNjYW4gc3RhY2s6XG4gICBpZiB0eSA9IHRydWUgdGhlbiBzaXplIG9mIGJyZWFrIGlzIHNldCBlbHNlIHNpemUgb2YgYm94IGlzIHNldDtcbiAgIGluIGVhY2ggY2FzZSBwcF9zY2FuX3N0YWNrIGlzIHBvcHBlZC5cblxuICAgTm90ZTpcbiAgIFBhdHRlcm4gbWF0Y2hpbmcgb24gc2NhbiBzdGFjayBpcyBleGhhdXN0aXZlLCBzaW5jZSBzY2FuX3N0YWNrIGlzIG5ldmVyXG4gICBlbXB0eS5cbiAgIFBhdHRlcm4gbWF0Y2hpbmcgb24gdG9rZW4gaW4gc2NhbiBzdGFjayBpcyBhbHNvIGV4aGF1c3RpdmUsXG4gICBzaW5jZSBzY2FuX3B1c2ggaXMgdXNlZCBvbiBicmVha3MgYW5kIG9wZW5pbmcgb2YgYm94ZXMuICopXG5sZXQgc2V0X3NpemUgc3RhdGUgdHkgPVxuICBtYXRjaCBTdGFjay50b3Bfb3B0IHN0YXRlLnBwX3NjYW5fc3RhY2sgd2l0aFxuICB8IE5vbmUgLT4gKCkgKCogc2Nhbl9zdGFjayBpcyBuZXZlciBlbXB0eS4gKilcbiAgfCBTb21lIHsgbGVmdF90b3RhbDsgcXVldWVfZWxlbSB9IC0+XG4gICAgbGV0IHNpemUgPSBTaXplLnRvX2ludCBxdWV1ZV9lbGVtLnNpemUgaW5cbiAgICAoKiB0ZXN0IGlmIHNjYW4gc3RhY2sgY29udGFpbnMgYW55IGRhdGEgdGhhdCBpcyBub3Qgb2Jzb2xldGUuICopXG4gICAgaWYgbGVmdF90b3RhbCA8IHN0YXRlLnBwX2xlZnRfdG90YWwgdGhlblxuICAgICAgaW5pdGlhbGl6ZV9zY2FuX3N0YWNrIHN0YXRlLnBwX3NjYW5fc3RhY2tcbiAgICBlbHNlXG4gICAgICBtYXRjaCBxdWV1ZV9lbGVtLnRva2VuIHdpdGhcbiAgICAgIHwgUHBfYnJlYWsgXyB8IFBwX3RicmVhayAoXywgXykgLT5cbiAgICAgICAgaWYgdHkgdGhlbiBiZWdpblxuICAgICAgICAgIHF1ZXVlX2VsZW0uc2l6ZSA8LSBTaXplLm9mX2ludCAoc3RhdGUucHBfcmlnaHRfdG90YWwgKyBzaXplKTtcbiAgICAgICAgICBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX3NjYW5fc3RhY2sgfD4gaWdub3JlXG4gICAgICAgIGVuZFxuICAgICAgfCBQcF9iZWdpbiAoXywgXykgLT5cbiAgICAgICAgaWYgbm90IHR5IHRoZW4gYmVnaW5cbiAgICAgICAgICBxdWV1ZV9lbGVtLnNpemUgPC0gU2l6ZS5vZl9pbnQgKHN0YXRlLnBwX3JpZ2h0X3RvdGFsICsgc2l6ZSk7XG4gICAgICAgICAgU3RhY2sucG9wX29wdCBzdGF0ZS5wcF9zY2FuX3N0YWNrIHw+IGlnbm9yZVxuICAgICAgICBlbmRcbiAgICAgIHwgUHBfdGV4dCBfIHwgUHBfc3RhYiB8IFBwX3RiZWdpbiBfIHwgUHBfdGVuZCB8IFBwX2VuZFxuICAgICAgfCBQcF9uZXdsaW5lIHwgUHBfaWZfbmV3bGluZSB8IFBwX29wZW5fdGFnIF8gfCBQcF9jbG9zZV90YWcgLT5cbiAgICAgICAgKCkgKCogc2Nhbl9wdXNoIGlzIG9ubHkgdXNlZCBmb3IgYnJlYWtzIGFuZCBib3hlcy4gKilcblxuXG4oKiBQdXNoIGEgdG9rZW4gb24gcHJldHR5LXByaW50ZXIgc2Nhbm5pbmcgc3RhY2suXG4gICBJZiBiIGlzIHRydWUgc2V0X3NpemUgaXMgY2FsbGVkLiAqKVxubGV0IHNjYW5fcHVzaCBzdGF0ZSBiIHRva2VuID1cbiAgcHBfZW5xdWV1ZSBzdGF0ZSB0b2tlbjtcbiAgaWYgYiB0aGVuIHNldF9zaXplIHN0YXRlIHRydWU7XG4gIGxldCBlbGVtID0geyBsZWZ0X3RvdGFsID0gc3RhdGUucHBfcmlnaHRfdG90YWw7IHF1ZXVlX2VsZW0gPSB0b2tlbiB9IGluXG4gIFN0YWNrLnB1c2ggZWxlbSBzdGF0ZS5wcF9zY2FuX3N0YWNrXG5cblxuKCogVG8gb3BlbiBhIG5ldyBib3ggOlxuICAgdGhlIHVzZXIgbWF5IHNldCB0aGUgZGVwdGggYm91bmQgcHBfbWF4X2JveGVzXG4gICBhbnkgdGV4dCBuZXN0ZWQgZGVlcGVyIGlzIHByaW50ZWQgYXMgdGhlIGVsbGlwc2lzIHN0cmluZy4gKilcbmxldCBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IGJyX3R5ID1cbiAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSBzdGF0ZS5wcF9jdXJyX2RlcHRoICsgMTtcbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IHNpemUgPSBTaXplLm9mX2ludCAoLSBzdGF0ZS5wcF9yaWdodF90b3RhbCkgaW5cbiAgICBsZXQgZWxlbSA9IHsgc2l6ZTsgdG9rZW4gPSBQcF9iZWdpbiAoaW5kZW50LCBicl90eSk7IGxlbmd0aCA9IDAgfSBpblxuICAgIHNjYW5fcHVzaCBzdGF0ZSBmYWxzZSBlbGVtIGVsc2VcbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA9IHN0YXRlLnBwX21heF9ib3hlc1xuICB0aGVuIGVucXVldWVfc3RyaW5nIHN0YXRlIHN0YXRlLnBwX2VsbGlwc2lzXG5cblxuKCogVGhlIGJveCB3aGljaCBpcyBhbHdheXMgb3Blbi4gKilcbmxldCBwcF9vcGVuX3N5c19ib3ggc3RhdGUgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgMCBQcF9ob3Zib3hcblxuKCogQ2xvc2UgYSBib3gsIHNldHRpbmcgc2l6ZXMgb2YgaXRzIHN1YiBib3hlcy4gKilcbmxldCBwcF9jbG9zZV9ib3ggc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoID4gMSB0aGVuXG4gIGJlZ2luXG4gICAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgYmVnaW5cbiAgICAgIHBwX2VucXVldWUgc3RhdGUgeyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX2VuZDsgbGVuZ3RoID0gMCB9O1xuICAgICAgc2V0X3NpemUgc3RhdGUgdHJ1ZTsgc2V0X3NpemUgc3RhdGUgZmFsc2VcbiAgICBlbmQ7XG4gICAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSBzdGF0ZS5wcF9jdXJyX2RlcHRoIC0gMTtcbiAgZW5kXG5cblxuKCogT3BlbiBhIHRhZywgcHVzaGluZyBpdCBvbiB0aGUgdGFnIHN0YWNrLiAqKVxubGV0IHBwX29wZW5fc3RhZyBzdGF0ZSB0YWdfbmFtZSA9XG4gIGlmIHN0YXRlLnBwX3ByaW50X3RhZ3MgdGhlblxuICBiZWdpblxuICAgIFN0YWNrLnB1c2ggdGFnX25hbWUgc3RhdGUucHBfdGFnX3N0YWNrO1xuICAgIHN0YXRlLnBwX3ByaW50X29wZW5fdGFnIHRhZ19uYW1lXG4gIGVuZDtcbiAgaWYgc3RhdGUucHBfbWFya190YWdzIHRoZW5cbiAgICBsZXQgdG9rZW4gPSBQcF9vcGVuX3RhZyB0YWdfbmFtZSBpblxuICAgIHBwX2VucXVldWUgc3RhdGUgeyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbjsgbGVuZ3RoID0gMCB9XG5cblxuKCogQ2xvc2UgYSB0YWcsIHBvcHBpbmcgaXQgZnJvbSB0aGUgdGFnIHN0YWNrLiAqKVxubGV0IHBwX2Nsb3NlX3N0YWcgc3RhdGUgKCkgPVxuICBpZiBzdGF0ZS5wcF9tYXJrX3RhZ3MgdGhlblxuICAgIHBwX2VucXVldWUgc3RhdGUgeyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX2Nsb3NlX3RhZzsgbGVuZ3RoID0gMCB9O1xuICBpZiBzdGF0ZS5wcF9wcmludF90YWdzIHRoZW5cbiAgICBtYXRjaCBTdGFjay5wb3Bfb3B0IHN0YXRlLnBwX3RhZ19zdGFjayB3aXRoXG4gICAgfCBOb25lIC0+ICgpICgqIE5vIG1vcmUgdGFnIHRvIGNsb3NlLiAqKVxuICAgIHwgU29tZSB0YWdfbmFtZSAtPlxuICAgICAgc3RhdGUucHBfcHJpbnRfY2xvc2VfdGFnIHRhZ19uYW1lXG5cbmxldCBwcF9zZXRfcHJpbnRfdGFncyBzdGF0ZSBiID0gc3RhdGUucHBfcHJpbnRfdGFncyA8LSBiXG5sZXQgcHBfc2V0X21hcmtfdGFncyBzdGF0ZSBiID0gc3RhdGUucHBfbWFya190YWdzIDwtIGJcbmxldCBwcF9nZXRfcHJpbnRfdGFncyBzdGF0ZSAoKSA9IHN0YXRlLnBwX3ByaW50X3RhZ3NcbmxldCBwcF9nZXRfbWFya190YWdzIHN0YXRlICgpID0gc3RhdGUucHBfbWFya190YWdzXG5sZXQgcHBfc2V0X3RhZ3Mgc3RhdGUgYiA9XG4gIHBwX3NldF9wcmludF90YWdzIHN0YXRlIGI7IHBwX3NldF9tYXJrX3RhZ3Mgc3RhdGUgYlxuXG5cbigqIEhhbmRsaW5nIHRhZyBoYW5kbGluZyBmdW5jdGlvbnM6IGdldC9zZXQgZnVuY3Rpb25zLiAqKVxubGV0IHBwX2dldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgc3RhdGUgKCkgPSB7XG4gIG1hcmtfb3Blbl9zdGFnID0gc3RhdGUucHBfbWFya19vcGVuX3RhZztcbiAgbWFya19jbG9zZV9zdGFnID0gc3RhdGUucHBfbWFya19jbG9zZV90YWc7XG4gIHByaW50X29wZW5fc3RhZyA9IHN0YXRlLnBwX3ByaW50X29wZW5fdGFnO1xuICBwcmludF9jbG9zZV9zdGFnID0gc3RhdGUucHBfcHJpbnRfY2xvc2VfdGFnO1xufVxuXG5cbmxldCBwcF9zZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIHN0YXRlIHtcbiAgICAgbWFya19vcGVuX3N0YWcgPSBtb3Q7XG4gICAgIG1hcmtfY2xvc2Vfc3RhZyA9IG1jdDtcbiAgICAgcHJpbnRfb3Blbl9zdGFnID0gcG90O1xuICAgICBwcmludF9jbG9zZV9zdGFnID0gcGN0O1xuICB9ID1cbiAgc3RhdGUucHBfbWFya19vcGVuX3RhZyA8LSBtb3Q7XG4gIHN0YXRlLnBwX21hcmtfY2xvc2VfdGFnIDwtIG1jdDtcbiAgc3RhdGUucHBfcHJpbnRfb3Blbl90YWcgPC0gcG90O1xuICBzdGF0ZS5wcF9wcmludF9jbG9zZV90YWcgPC0gcGN0XG5cblxuKCogSW5pdGlhbGl6ZSBwcmV0dHktcHJpbnRlci4gKilcbmxldCBwcF9yaW5pdCBzdGF0ZSA9XG4gIHBwX2NsZWFyX3F1ZXVlIHN0YXRlO1xuICBpbml0aWFsaXplX3NjYW5fc3RhY2sgc3RhdGUucHBfc2Nhbl9zdGFjaztcbiAgU3RhY2suY2xlYXIgc3RhdGUucHBfZm9ybWF0X3N0YWNrO1xuICBTdGFjay5jbGVhciBzdGF0ZS5wcF90Ym94X3N0YWNrO1xuICBTdGFjay5jbGVhciBzdGF0ZS5wcF90YWdfc3RhY2s7XG4gIFN0YWNrLmNsZWFyIHN0YXRlLnBwX21hcmtfc3RhY2s7XG4gIHN0YXRlLnBwX2N1cnJlbnRfaW5kZW50IDwtIDA7XG4gIHN0YXRlLnBwX2N1cnJfZGVwdGggPC0gMDtcbiAgc3RhdGUucHBfc3BhY2VfbGVmdCA8LSBzdGF0ZS5wcF9tYXJnaW47XG4gIHBwX29wZW5fc3lzX2JveCBzdGF0ZVxuXG5sZXQgY2xlYXJfdGFnX3N0YWNrIHN0YXRlID1cbiAgU3RhY2suaXRlciAoZnVuIF8gLT4gcHBfY2xvc2Vfc3RhZyBzdGF0ZSAoKSkgc3RhdGUucHBfdGFnX3N0YWNrXG5cblxuKCogRmx1c2hpbmcgcHJldHR5LXByaW50ZXIgcXVldWUuICopXG5sZXQgcHBfZmx1c2hfcXVldWUgc3RhdGUgYiA9XG4gIGNsZWFyX3RhZ19zdGFjayBzdGF0ZTtcbiAgd2hpbGUgc3RhdGUucHBfY3Vycl9kZXB0aCA+IDEgZG9cbiAgICBwcF9jbG9zZV9ib3ggc3RhdGUgKClcbiAgZG9uZTtcbiAgc3RhdGUucHBfcmlnaHRfdG90YWwgPC0gcHBfaW5maW5pdHk7XG4gIGFkdmFuY2VfbGVmdCBzdGF0ZTtcbiAgaWYgYiB0aGVuIHBwX291dHB1dF9uZXdsaW5lIHN0YXRlO1xuICBwcF9yaW5pdCBzdGF0ZVxuXG4oKlxuXG4gIFByb2NlZHVyZXMgdG8gZm9ybWF0IHZhbHVlcyBhbmQgdXNlIGJveGVzLlxuXG4qKVxuXG4oKiBUbyBmb3JtYXQgYSBzdHJpbmcuICopXG5sZXQgcHBfcHJpbnRfYXNfc2l6ZSBzdGF0ZSBzaXplIHMgPVxuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzXG4gIHRoZW4gZW5xdWV1ZV9zdHJpbmdfYXMgc3RhdGUgc2l6ZSBzXG5cblxubGV0IHBwX3ByaW50X2FzIHN0YXRlIGlzaXplIHMgPVxuICBwcF9wcmludF9hc19zaXplIHN0YXRlIChTaXplLm9mX2ludCBpc2l6ZSkgc1xuXG5cbmxldCBwcF9wcmludF9zdHJpbmcgc3RhdGUgcyA9XG4gIHBwX3ByaW50X2FzIHN0YXRlIChTdHJpbmcubGVuZ3RoIHMpIHNcblxubGV0IHBwX3ByaW50X2J5dGVzIHN0YXRlIHMgPVxuICBwcF9wcmludF9hcyBzdGF0ZSAoQnl0ZXMubGVuZ3RoIHMpIChCeXRlcy50b19zdHJpbmcgcylcblxuKCogVG8gZm9ybWF0IGFuIGludGVnZXIuICopXG5sZXQgcHBfcHJpbnRfaW50IHN0YXRlIGkgPSBwcF9wcmludF9zdHJpbmcgc3RhdGUgKEludC50b19zdHJpbmcgaSlcblxuKCogVG8gZm9ybWF0IGEgZmxvYXQuICopXG5sZXQgcHBfcHJpbnRfZmxvYXQgc3RhdGUgZiA9IHBwX3ByaW50X3N0cmluZyBzdGF0ZSAoc3RyaW5nX29mX2Zsb2F0IGYpXG5cbigqIFRvIGZvcm1hdCBhIGJvb2xlYW4uICopXG5sZXQgcHBfcHJpbnRfYm9vbCBzdGF0ZSBiID0gcHBfcHJpbnRfc3RyaW5nIHN0YXRlIChzdHJpbmdfb2ZfYm9vbCBiKVxuXG4oKiBUbyBmb3JtYXQgYSBjaGFyLiAqKVxubGV0IHBwX3ByaW50X2NoYXIgc3RhdGUgYyA9XG4gIHBwX3ByaW50X2FzIHN0YXRlIDEgKFN0cmluZy5tYWtlIDEgYylcblxuXG4oKiBPcGVuaW5nIGJveGVzLiAqKVxubGV0IHBwX29wZW5faGJveCBzdGF0ZSAoKSA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSAwIFBwX2hib3hcbmFuZCBwcF9vcGVuX3Zib3ggc3RhdGUgaW5kZW50ID0gcHBfb3Blbl9ib3hfZ2VuIHN0YXRlIGluZGVudCBQcF92Ym94XG5cbmFuZCBwcF9vcGVuX2h2Ym94IHN0YXRlIGluZGVudCA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgUHBfaHZib3hcbmFuZCBwcF9vcGVuX2hvdmJveCBzdGF0ZSBpbmRlbnQgPSBwcF9vcGVuX2JveF9nZW4gc3RhdGUgaW5kZW50IFBwX2hvdmJveFxuYW5kIHBwX29wZW5fYm94IHN0YXRlIGluZGVudCA9IHBwX29wZW5fYm94X2dlbiBzdGF0ZSBpbmRlbnQgUHBfYm94XG5cblxuKCogUHJpbnRpbmcgcXVldWVkIHRleHQuXG5cbiAgIFtwcF9wcmludF9mbHVzaF0gcHJpbnRzIGFsbCBwZW5kaW5nIGl0ZW1zIGluIHRoZSBwcmV0dHktcHJpbnRlciBxdWV1ZSBhbmRcbiAgIHRoZW4gZmx1c2hlcyB0aGUgbG93IGxldmVsIG91dHB1dCBkZXZpY2Ugb2YgdGhlIGZvcm1hdHRlciB0byBhY3R1YWxseVxuICAgZGlzcGxheSBwcmludGluZyBtYXRlcmlhbC5cblxuICAgW3BwX3ByaW50X25ld2xpbmVdIGJlaGF2ZXMgYXMgW3BwX3ByaW50X2ZsdXNoXSBhZnRlciBwcmludGluZyBhbiBhZGRpdGlvbmFsXG4gICBuZXcgbGluZS4gKilcbmxldCBwcF9wcmludF9uZXdsaW5lIHN0YXRlICgpID1cbiAgcHBfZmx1c2hfcXVldWUgc3RhdGUgdHJ1ZTsgc3RhdGUucHBfb3V0X2ZsdXNoICgpXG5hbmQgcHBfcHJpbnRfZmx1c2ggc3RhdGUgKCkgPVxuICBwcF9mbHVzaF9xdWV1ZSBzdGF0ZSBmYWxzZTsgc3RhdGUucHBfb3V0X2ZsdXNoICgpXG5cblxuKCogVG8gZ2V0IGEgbmV3bGluZSB3aGVuIG9uZSBkb2VzIG5vdCB3YW50IHRvIGNsb3NlIHRoZSBjdXJyZW50IGJveC4gKilcbmxldCBwcF9mb3JjZV9uZXdsaW5lIHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgZW5xdWV1ZV9hZHZhbmNlIHN0YXRlIHsgc2l6ZSA9IFNpemUuemVybzsgdG9rZW4gPSBQcF9uZXdsaW5lOyBsZW5ndGggPSAwIH1cblxuXG4oKiBUbyBmb3JtYXQgc29tZXRoaW5nLCBvbmx5IGluIGNhc2UgdGhlIGxpbmUgaGFzIGp1c3QgYmVlbiBicm9rZW4uICopXG5sZXQgcHBfcHJpbnRfaWZfbmV3bGluZSBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZVxuICAgICAgeyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX2lmX25ld2xpbmU7IGxlbmd0aCA9IDAgfVxuXG5cbigqIEdlbmVyYWxpemVkIGJyZWFrIGhpbnQgdGhhdCBhbGxvd3MgcHJpbnRpbmcgc3RyaW5ncyBiZWZvcmUvYWZ0ZXJcbiAgIHNhbWUtbGluZSBvZmZzZXQgKHdpZHRoKSBvciBuZXctbGluZSBvZmZzZXQgKilcbmxldCBwcF9wcmludF9jdXN0b21fYnJlYWsgc3RhdGUgfmZpdHMgfmJyZWFrcyA9XG4gIGxldCBiZWZvcmUsIHdpZHRoLCBhZnRlciA9IGZpdHMgaW5cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgbGV0IHNpemUgPSBTaXplLm9mX2ludCAoLSBzdGF0ZS5wcF9yaWdodF90b3RhbCkgaW5cbiAgICBsZXQgdG9rZW4gPSBQcF9icmVhayB7IGZpdHM7IGJyZWFrcyB9IGluXG4gICAgbGV0IGxlbmd0aCA9IFN0cmluZy5sZW5ndGggYmVmb3JlICsgd2lkdGggKyBTdHJpbmcubGVuZ3RoIGFmdGVyIGluXG4gICAgbGV0IGVsZW0gPSB7IHNpemU7IHRva2VuOyBsZW5ndGggfSBpblxuICAgIHNjYW5fcHVzaCBzdGF0ZSB0cnVlIGVsZW1cblxuKCogUHJpbnRpbmcgYnJlYWsgaGludHM6XG4gICBBIGJyZWFrIGhpbnQgaW5kaWNhdGVzIHdoZXJlIGEgYm94IG1heSBiZSBicm9rZW4uXG4gICBJZiBsaW5lIGlzIGJyb2tlbiB0aGVuIG9mZnNldCBpcyBhZGRlZCB0byB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnRcbiAgIGJveCBlbHNlICh0aGUgdmFsdWUgb2YpIHdpZHRoIGJsYW5rcyBhcmUgcHJpbnRlZC4gKilcbmxldCBwcF9wcmludF9icmVhayBzdGF0ZSB3aWR0aCBvZmZzZXQgPVxuICBwcF9wcmludF9jdXN0b21fYnJlYWsgc3RhdGVcbiAgICB+Zml0czooXCJcIiwgd2lkdGgsIFwiXCIpIH5icmVha3M6KFwiXCIsIG9mZnNldCwgXCJcIilcblxuXG4oKiBQcmludCBhIHNwYWNlIDpcbiAgIGEgc3BhY2UgaXMgYSBicmVhayBoaW50IHRoYXQgcHJpbnRzIGEgc2luZ2xlIHNwYWNlIGlmIHRoZSBicmVhayBkb2VzIG5vdFxuICAgc3BsaXQgdGhlIGxpbmU7XG4gICBhIGN1dCBpcyBhIGJyZWFrIGhpbnQgdGhhdCBwcmludHMgbm90aGluZyBpZiB0aGUgYnJlYWsgZG9lcyBub3Qgc3BsaXQgdGhlXG4gICBsaW5lLiAqKVxubGV0IHBwX3ByaW50X3NwYWNlIHN0YXRlICgpID0gcHBfcHJpbnRfYnJlYWsgc3RhdGUgMSAwXG5hbmQgcHBfcHJpbnRfY3V0IHN0YXRlICgpID0gcHBfcHJpbnRfYnJlYWsgc3RhdGUgMCAwXG5cblxuKCogVGFidWxhdGlvbiBib3hlcy4gKilcbmxldCBwcF9vcGVuX3Rib3ggc3RhdGUgKCkgPVxuICBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwtIHN0YXRlLnBwX2N1cnJfZGVwdGggKyAxO1xuICBpZiBzdGF0ZS5wcF9jdXJyX2RlcHRoIDwgc3RhdGUucHBfbWF4X2JveGVzIHRoZW5cbiAgICBsZXQgc2l6ZSA9IFNpemUuemVybyBpblxuICAgIGxldCBlbGVtID0geyBzaXplOyB0b2tlbiA9IFBwX3RiZWdpbiAoUHBfdGJveCAocmVmIFtdKSk7IGxlbmd0aCA9IDAgfSBpblxuICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZSBlbGVtXG5cblxuKCogQ2xvc2UgYSB0YWJ1bGF0aW9uIGJveC4gKilcbmxldCBwcF9jbG9zZV90Ym94IHN0YXRlICgpID1cbiAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA+IDEgdGhlblxuICBiZWdpblxuICAgaWYgc3RhdGUucHBfY3Vycl9kZXB0aCA8IHN0YXRlLnBwX21heF9ib3hlcyB0aGVuXG4gICAgIGxldCBlbGVtID0geyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX3RlbmQ7IGxlbmd0aCA9IDAgfSBpblxuICAgICBlbnF1ZXVlX2FkdmFuY2Ugc3RhdGUgZWxlbTtcbiAgICAgc3RhdGUucHBfY3Vycl9kZXB0aCA8LSBzdGF0ZS5wcF9jdXJyX2RlcHRoIC0gMVxuICBlbmRcblxuXG4oKiBQcmludCBhIHRhYnVsYXRpb24gYnJlYWsuICopXG5sZXQgcHBfcHJpbnRfdGJyZWFrIHN0YXRlIHdpZHRoIG9mZnNldCA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBzaXplID0gU2l6ZS5vZl9pbnQgKC0gc3RhdGUucHBfcmlnaHRfdG90YWwpIGluXG4gICAgbGV0IGVsZW0gPSB7IHNpemU7IHRva2VuID0gUHBfdGJyZWFrICh3aWR0aCwgb2Zmc2V0KTsgbGVuZ3RoID0gd2lkdGggfSBpblxuICAgIHNjYW5fcHVzaCBzdGF0ZSB0cnVlIGVsZW1cblxuXG5sZXQgcHBfcHJpbnRfdGFiIHN0YXRlICgpID0gcHBfcHJpbnRfdGJyZWFrIHN0YXRlIDAgMFxuXG5sZXQgcHBfc2V0X3RhYiBzdGF0ZSAoKSA9XG4gIGlmIHN0YXRlLnBwX2N1cnJfZGVwdGggPCBzdGF0ZS5wcF9tYXhfYm94ZXMgdGhlblxuICAgIGxldCBlbGVtID0geyBzaXplID0gU2l6ZS56ZXJvOyB0b2tlbiA9IFBwX3N0YWI7IGxlbmd0aCA9IDAgfSBpblxuICAgIGVucXVldWVfYWR2YW5jZSBzdGF0ZSBlbGVtXG5cblxuKCpcblxuICBQcm9jZWR1cmVzIHRvIGNvbnRyb2wgdGhlIHByZXR0eS1wcmludGVyc1xuXG4qKVxuXG4oKiBTZXRfbWF4X2JveGVzLiAqKVxubGV0IHBwX3NldF9tYXhfYm94ZXMgc3RhdGUgbiA9IGlmIG4gPiAxIHRoZW4gc3RhdGUucHBfbWF4X2JveGVzIDwtIG5cblxuKCogVG8ga25vdyB0aGUgY3VycmVudCBtYXhpbXVtIG51bWJlciBvZiBib3hlcyBhbGxvd2VkLiAqKVxubGV0IHBwX2dldF9tYXhfYm94ZXMgc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXhfYm94ZXNcblxubGV0IHBwX292ZXJfbWF4X2JveGVzIHN0YXRlICgpID0gc3RhdGUucHBfY3Vycl9kZXB0aCA9IHN0YXRlLnBwX21heF9ib3hlc1xuXG4oKiBFbGxpcHNpcy4gKilcbmxldCBwcF9zZXRfZWxsaXBzaXNfdGV4dCBzdGF0ZSBzID0gc3RhdGUucHBfZWxsaXBzaXMgPC0gc1xuYW5kIHBwX2dldF9lbGxpcHNpc190ZXh0IHN0YXRlICgpID0gc3RhdGUucHBfZWxsaXBzaXNcblxuXG4oKiBUbyBzZXQgdGhlIG1hcmdpbiBvZiBwcmV0dHktcHJpbnRlci4gKilcbmxldCBwcF9saW1pdCBuID1cbiAgaWYgbiA8IHBwX2luZmluaXR5IHRoZW4gbiBlbHNlIHByZWQgcHBfaW5maW5pdHlcblxuXG4oKiBJbnRlcm5hbCBwcmV0dHktcHJpbnRlciBmdW5jdGlvbnMuICopXG5sZXQgcHBfc2V0X21pbl9zcGFjZV9sZWZ0IHN0YXRlIG4gPVxuICBpZiBuID49IDEgdGhlblxuICAgIGxldCBuID0gcHBfbGltaXQgbiBpblxuICAgIHN0YXRlLnBwX21pbl9zcGFjZV9sZWZ0IDwtIG47XG4gICAgc3RhdGUucHBfbWF4X2luZGVudCA8LSBzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9taW5fc3BhY2VfbGVmdDtcbiAgICBwcF9yaW5pdCBzdGF0ZVxuXG5cbigqIEluaXRpYWxseSwgd2UgaGF2ZSA6XG4gICBwcF9tYXhfaW5kZW50ID0gcHBfbWFyZ2luIC0gcHBfbWluX3NwYWNlX2xlZnQsIGFuZFxuICAgcHBfc3BhY2VfbGVmdCA9IHBwX21hcmdpbi4gKilcbmxldCBwcF9zZXRfbWF4X2luZGVudCBzdGF0ZSBuID1cbiAgaWYgbiA+IDEgdGhlblxuICAgIHBwX3NldF9taW5fc3BhY2VfbGVmdCBzdGF0ZSAoc3RhdGUucHBfbWFyZ2luIC0gbilcblxuXG5sZXQgcHBfZ2V0X21heF9pbmRlbnQgc3RhdGUgKCkgPSBzdGF0ZS5wcF9tYXhfaW5kZW50XG5cbmxldCBwcF9zZXRfbWFyZ2luIHN0YXRlIG4gPVxuICBpZiBuID49IDEgdGhlblxuICAgIGxldCBuID0gcHBfbGltaXQgbiBpblxuICAgIHN0YXRlLnBwX21hcmdpbiA8LSBuO1xuICAgIGxldCBuZXdfbWF4X2luZGVudCA9XG4gICAgICAoKiBUcnkgdG8gbWFpbnRhaW4gbWF4X2luZGVudCB0byBpdHMgYWN0dWFsIHZhbHVlLiAqKVxuICAgICAgaWYgc3RhdGUucHBfbWF4X2luZGVudCA8PSBzdGF0ZS5wcF9tYXJnaW5cbiAgICAgIHRoZW4gc3RhdGUucHBfbWF4X2luZGVudCBlbHNlXG4gICAgICAoKiBJZiBwb3NzaWJsZSBtYWludGFpbiBwcF9taW5fc3BhY2VfbGVmdCB0byBpdHMgYWN0dWFsIHZhbHVlLFxuICAgICAgICAgaWYgdGhpcyBsZWFkcyB0byBhIHRvbyBzbWFsbCBtYXhfaW5kZW50LCB0YWtlIGhhbGYgb2YgdGhlXG4gICAgICAgICBuZXcgbWFyZ2luLCBpZiBpdCBpcyBncmVhdGVyIHRoYW4gMS4gKilcbiAgICAgICBJbnQubWF4IChJbnQubWF4IChzdGF0ZS5wcF9tYXJnaW4gLSBzdGF0ZS5wcF9taW5fc3BhY2VfbGVmdClcbiAgICAgICAgICAgICAgICAoc3RhdGUucHBfbWFyZ2luIC8gMikpIDEgaW5cbiAgICAoKiBSZWJ1aWxkIGludmFyaWFudHMuICopXG4gICAgcHBfc2V0X21heF9pbmRlbnQgc3RhdGUgbmV3X21heF9pbmRlbnRcblxuXG4oKiogR2VvbWV0cnkgZnVuY3Rpb25zIGFuZCB0eXBlcyAqKVxudHlwZSBnZW9tZXRyeSA9IHsgbWF4X2luZGVudDppbnQ7IG1hcmdpbjogaW50fVxuXG5sZXQgdmFsaWRhdGVfZ2VvbWV0cnkge21hcmdpbjsgbWF4X2luZGVudH0gPVxuICBpZiBtYXhfaW5kZW50IDwgMiB0aGVuXG4gICAgRXJyb3IgXCJtYXhfaW5kZW50IDwgMlwiXG4gIGVsc2UgaWYgbWFyZ2luIDw9IG1heF9pbmRlbnQgdGhlblxuICAgIEVycm9yIFwibWFyZ2luIDw9IG1heF9pbmRlbnRcIlxuICBlbHNlIE9rICgpXG5cbmxldCBjaGVja19nZW9tZXRyeSBnZW9tZXRyeSA9XG4gIG1hdGNoIHZhbGlkYXRlX2dlb21ldHJ5IGdlb21ldHJ5IHdpdGhcbiAgfCBPayAoKSAtPiB0cnVlXG4gIHwgRXJyb3IgXyAtPiBmYWxzZVxuXG5sZXQgcHBfZ2V0X21hcmdpbiBzdGF0ZSAoKSA9IHN0YXRlLnBwX21hcmdpblxuXG5sZXQgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUge21hcmdpbjsgbWF4X2luZGVudH0gPVxuICBwcF9zZXRfbWFyZ2luIHN0YXRlIG1hcmdpbjtcbiAgcHBfc2V0X21heF9pbmRlbnQgc3RhdGUgbWF4X2luZGVudDtcbiAgKClcblxubGV0IHBwX3NldF9nZW9tZXRyeSBzdGF0ZSB+bWF4X2luZGVudCB+bWFyZ2luID1cbiAgbGV0IGdlb21ldHJ5ID0geyBtYXhfaW5kZW50OyBtYXJnaW4gfSBpblxuICBtYXRjaCB2YWxpZGF0ZV9nZW9tZXRyeSBnZW9tZXRyeSB3aXRoXG4gIHwgRXJyb3IgbXNnIC0+XG4gICAgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKFwiRm9ybWF0LnBwX3NldF9nZW9tZXRyeTogXCIgXiBtc2cpKVxuICB8IE9rICgpIC0+XG4gICAgcHBfc2V0X2Z1bGxfZ2VvbWV0cnkgc3RhdGUgZ2VvbWV0cnlcblxubGV0IHBwX3NhZmVfc2V0X2dlb21ldHJ5IHN0YXRlIH5tYXhfaW5kZW50IH5tYXJnaW4gPVxuICBsZXQgZ2VvbWV0cnkgPSB7IG1heF9pbmRlbnQ7IG1hcmdpbiB9IGluXG4gIG1hdGNoIHZhbGlkYXRlX2dlb21ldHJ5IGdlb21ldHJ5IHdpdGhcbiAgfCBFcnJvciBfbXNnIC0+XG4gICAgICgpXG4gIHwgT2sgKCkgLT5cbiAgICBwcF9zZXRfZnVsbF9nZW9tZXRyeSBzdGF0ZSBnZW9tZXRyeVxuXG5sZXQgcHBfZ2V0X2dlb21ldHJ5IHN0YXRlICgpID1cbiAgeyBtYXJnaW4gPSBwcF9nZXRfbWFyZ2luIHN0YXRlICgpOyBtYXhfaW5kZW50ID0gcHBfZ2V0X21heF9pbmRlbnQgc3RhdGUgKCkgfVxuXG5sZXQgcHBfdXBkYXRlX2dlb21ldHJ5IHN0YXRlIHVwZGF0ZSA9XG4gIGxldCBnZW9tZXRyeSA9IHBwX2dldF9nZW9tZXRyeSBzdGF0ZSAoKSBpblxuICBwcF9zZXRfZnVsbF9nZW9tZXRyeSBzdGF0ZSAodXBkYXRlIGdlb21ldHJ5KVxuXG4oKiBTZXR0aW5nIGEgZm9ybWF0dGVyIGJhc2ljIG91dHB1dCBmdW5jdGlvbnMuICopXG5sZXQgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHN0YXRlIHtcbiAgICAgIG91dF9zdHJpbmcgPSBmO1xuICAgICAgb3V0X2ZsdXNoID0gZztcbiAgICAgIG91dF9uZXdsaW5lID0gaDtcbiAgICAgIG91dF9zcGFjZXMgPSBpO1xuICAgICAgb3V0X2luZGVudCA9IGo7XG4gICAgfSA9XG4gIHN0YXRlLnBwX291dF9zdHJpbmcgPC0gZjtcbiAgc3RhdGUucHBfb3V0X2ZsdXNoIDwtIGc7XG4gIHN0YXRlLnBwX291dF9uZXdsaW5lIDwtIGg7XG4gIHN0YXRlLnBwX291dF9zcGFjZXMgPC0gaTtcbiAgc3RhdGUucHBfb3V0X2luZGVudCA8LSBqXG5cbmxldCBwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgc3RhdGUgKCkgPSB7XG4gIG91dF9zdHJpbmcgPSBzdGF0ZS5wcF9vdXRfc3RyaW5nO1xuICBvdXRfZmx1c2ggPSBzdGF0ZS5wcF9vdXRfZmx1c2g7XG4gIG91dF9uZXdsaW5lID0gc3RhdGUucHBfb3V0X25ld2xpbmU7XG4gIG91dF9zcGFjZXMgPSBzdGF0ZS5wcF9vdXRfc3BhY2VzO1xuICBvdXRfaW5kZW50ID0gc3RhdGUucHBfb3V0X2luZGVudDtcbn1cblxuXG4oKiBTZXR0aW5nIGEgZm9ybWF0dGVyIGJhc2ljIHN0cmluZyBvdXRwdXQgYW5kIGZsdXNoIGZ1bmN0aW9ucy4gKilcbmxldCBwcF9zZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgc3RhdGUgZiBnID1cbiAgc3RhdGUucHBfb3V0X3N0cmluZyA8LSBmOyBzdGF0ZS5wcF9vdXRfZmx1c2ggPC0gZ1xuXG5sZXQgcHBfZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHN0YXRlICgpID1cbiAgKHN0YXRlLnBwX291dF9zdHJpbmcsIHN0YXRlLnBwX291dF9mbHVzaClcblxuXG4oKiBUaGUgZGVmYXVsdCBmdW5jdGlvbiB0byBvdXRwdXQgbmV3IGxpbmVzLiAqKVxubGV0IGRpc3BsYXlfbmV3bGluZSBzdGF0ZSAoKSA9IHN0YXRlLnBwX291dF9zdHJpbmcgXCJcXG5cIiAwICAxXG5cbigqIFRoZSBkZWZhdWx0IGZ1bmN0aW9uIHRvIG91dHB1dCBzcGFjZXMuICopXG5sZXQgYmxhbmtfbGluZSA9IFN0cmluZy5tYWtlIDgwICcgJ1xubGV0IHJlYyBkaXNwbGF5X2JsYW5rcyBzdGF0ZSBuID1cbiAgaWYgbiA+IDAgdGhlblxuICBpZiBuIDw9IDgwIHRoZW4gc3RhdGUucHBfb3V0X3N0cmluZyBibGFua19saW5lIDAgbiBlbHNlXG4gIGJlZ2luXG4gICAgc3RhdGUucHBfb3V0X3N0cmluZyBibGFua19saW5lIDAgODA7XG4gICAgZGlzcGxheV9ibGFua3Mgc3RhdGUgKG4gLSA4MClcbiAgZW5kXG5cblxuKCogVGhlIGRlZmF1bHQgZnVuY3Rpb24gdG8gb3V0cHV0IGluZGVudGF0aW9uIG9mIG5ldyBsaW5lcy4gKilcbmxldCBkaXNwbGF5X2luZGVudCA9IGRpc3BsYXlfYmxhbmtzXG5cbigqIFNldHRpbmcgYSBmb3JtYXR0ZXIgYmFzaWMgb3V0cHV0IGZ1bmN0aW9ucyBhcyBwcmludGluZyB0byBhIGdpdmVuXG4gICBbU3RkbGliLm91dF9jaGFubmVsXSB2YWx1ZS4gKilcbmxldCBwcF9zZXRfZm9ybWF0dGVyX291dF9jaGFubmVsIHN0YXRlIG9jID1cbiAgc3RhdGUucHBfb3V0X3N0cmluZyA8LSBvdXRwdXRfc3Vic3RyaW5nIG9jO1xuICBzdGF0ZS5wcF9vdXRfZmx1c2ggPC0gKGZ1biAoKSAtPiBmbHVzaCBvYyk7XG4gIHN0YXRlLnBwX291dF9uZXdsaW5lIDwtIGRpc3BsYXlfbmV3bGluZSBzdGF0ZTtcbiAgc3RhdGUucHBfb3V0X3NwYWNlcyA8LSBkaXNwbGF5X2JsYW5rcyBzdGF0ZTtcbiAgc3RhdGUucHBfb3V0X2luZGVudCA8LSBkaXNwbGF5X2luZGVudCBzdGF0ZVxuXG4oKlxuXG4gIERlZmluaW5nIHNwZWNpZmljIGZvcm1hdHRlcnNcblxuKilcblxubGV0IGRlZmF1bHRfcHBfbWFya19vcGVuX3RhZyA9IGZ1bmN0aW9uXG4gIHwgU3RyaW5nX3RhZyBzIC0+IFwiPFwiIF4gcyBeIFwiPlwiXG4gIHwgXyAtPiBcIlwiXG5sZXQgZGVmYXVsdF9wcF9tYXJrX2Nsb3NlX3RhZyA9IGZ1bmN0aW9uXG4gIHwgU3RyaW5nX3RhZyBzIC0+IFwiPC9cIiBeIHMgXiBcIj5cIlxuICB8IF8gLT4gXCJcIlxuXG5sZXQgZGVmYXVsdF9wcF9wcmludF9vcGVuX3RhZyA9IGlnbm9yZVxubGV0IGRlZmF1bHRfcHBfcHJpbnRfY2xvc2VfdGFnID0gaWdub3JlXG5cbigqIEJ1aWxkaW5nIGEgZm9ybWF0dGVyIGdpdmVuIGl0cyBiYXNpYyBvdXRwdXQgZnVuY3Rpb25zLlxuICAgT3RoZXIgZmllbGRzIGdldCByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzLiAqKVxubGV0IHBwX21ha2VfZm9ybWF0dGVyIGYgZyBoIGkgaiA9XG4gICgqIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBmb3JtYXR0ZXIgY29udGFpbnMgYSBkdW1teSBib3guICopXG4gIGxldCBwcF9xdWV1ZSA9IFF1ZXVlLmNyZWF0ZSAoKSBpblxuICBsZXQgc3lzX3RvayA9XG4gICAgeyBzaXplID0gU2l6ZS51bmtub3duOyB0b2tlbiA9IFBwX2JlZ2luICgwLCBQcF9ob3Zib3gpOyBsZW5ndGggPSAwIH0gaW5cbiAgUXVldWUuYWRkIHN5c190b2sgcHBfcXVldWU7XG4gIGxldCBzY2FuX3N0YWNrID0gU3RhY2suY3JlYXRlICgpIGluXG4gIGluaXRpYWxpemVfc2Nhbl9zdGFjayBzY2FuX3N0YWNrO1xuICBTdGFjay5wdXNoIHsgbGVmdF90b3RhbCA9IDE7IHF1ZXVlX2VsZW0gPSBzeXNfdG9rIH0gc2Nhbl9zdGFjaztcbiAgbGV0IHBwX21hcmdpbiA9IDc4XG4gIGFuZCBwcF9taW5fc3BhY2VfbGVmdCA9IDEwIGluXG4gIHtcbiAgICBwcF9zY2FuX3N0YWNrID0gc2Nhbl9zdGFjaztcbiAgICBwcF9mb3JtYXRfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfdGJveF9zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKTtcbiAgICBwcF90YWdfc3RhY2sgPSBTdGFjay5jcmVhdGUgKCk7XG4gICAgcHBfbWFya19zdGFjayA9IFN0YWNrLmNyZWF0ZSAoKTtcbiAgICBwcF9tYXJnaW4gPSBwcF9tYXJnaW47XG4gICAgcHBfbWluX3NwYWNlX2xlZnQgPSBwcF9taW5fc3BhY2VfbGVmdDtcbiAgICBwcF9tYXhfaW5kZW50ID0gcHBfbWFyZ2luIC0gcHBfbWluX3NwYWNlX2xlZnQ7XG4gICAgcHBfc3BhY2VfbGVmdCA9IHBwX21hcmdpbjtcbiAgICBwcF9jdXJyZW50X2luZGVudCA9IDA7XG4gICAgcHBfaXNfbmV3X2xpbmUgPSB0cnVlO1xuICAgIHBwX2xlZnRfdG90YWwgPSAxO1xuICAgIHBwX3JpZ2h0X3RvdGFsID0gMTtcbiAgICBwcF9jdXJyX2RlcHRoID0gMTtcbiAgICBwcF9tYXhfYm94ZXMgPSBtYXhfaW50O1xuICAgIHBwX2VsbGlwc2lzID0gXCIuXCI7XG4gICAgcHBfb3V0X3N0cmluZyA9IGY7XG4gICAgcHBfb3V0X2ZsdXNoID0gZztcbiAgICBwcF9vdXRfbmV3bGluZSA9IGg7XG4gICAgcHBfb3V0X3NwYWNlcyA9IGk7XG4gICAgcHBfb3V0X2luZGVudCA9IGo7XG4gICAgcHBfcHJpbnRfdGFncyA9IGZhbHNlO1xuICAgIHBwX21hcmtfdGFncyA9IGZhbHNlO1xuICAgIHBwX21hcmtfb3Blbl90YWcgPSBkZWZhdWx0X3BwX21hcmtfb3Blbl90YWc7XG4gICAgcHBfbWFya19jbG9zZV90YWcgPSBkZWZhdWx0X3BwX21hcmtfY2xvc2VfdGFnO1xuICAgIHBwX3ByaW50X29wZW5fdGFnID0gZGVmYXVsdF9wcF9wcmludF9vcGVuX3RhZztcbiAgICBwcF9wcmludF9jbG9zZV90YWcgPSBkZWZhdWx0X3BwX3ByaW50X2Nsb3NlX3RhZztcbiAgICBwcF9xdWV1ZSA9IHBwX3F1ZXVlO1xuICB9XG5cblxuKCogQnVpbGQgYSBmb3JtYXR0ZXIgb3V0IG9mIGl0cyBvdXQgZnVuY3Rpb25zLiAqKVxubGV0IGZvcm1hdHRlcl9vZl9vdXRfZnVuY3Rpb25zIG91dF9mdW5zID1cbiAgcHBfbWFrZV9mb3JtYXR0ZXJcbiAgICBvdXRfZnVucy5vdXRfc3RyaW5nXG4gICAgb3V0X2Z1bnMub3V0X2ZsdXNoXG4gICAgb3V0X2Z1bnMub3V0X25ld2xpbmVcbiAgICBvdXRfZnVucy5vdXRfc3BhY2VzXG4gICAgb3V0X2Z1bnMub3V0X2luZGVudFxuXG5cbigqIE1ha2UgYSBmb3JtYXR0ZXIgd2l0aCBkZWZhdWx0IGZ1bmN0aW9ucyB0byBvdXRwdXQgc3BhY2VzLFxuICBpbmRlbnRhdGlvbiwgYW5kIG5ldyBsaW5lcy4gKilcbmxldCBtYWtlX2Zvcm1hdHRlciBvdXRwdXQgZmx1c2ggPVxuICBsZXQgcHBmID0gcHBfbWFrZV9mb3JtYXR0ZXIgb3V0cHV0IGZsdXNoIGlnbm9yZSBpZ25vcmUgaWdub3JlIGluXG4gIHBwZi5wcF9vdXRfbmV3bGluZSA8LSBkaXNwbGF5X25ld2xpbmUgcHBmO1xuICBwcGYucHBfb3V0X3NwYWNlcyA8LSBkaXNwbGF5X2JsYW5rcyBwcGY7XG4gIHBwZi5wcF9vdXRfaW5kZW50IDwtIGRpc3BsYXlfaW5kZW50IHBwZjtcbiAgcHBmXG5cblxuKCogTWFrZSBhIGZvcm1hdHRlciB3cml0aW5nIHRvIGEgZ2l2ZW4gW1N0ZGxpYi5vdXRfY2hhbm5lbF0gdmFsdWUuICopXG5sZXQgZm9ybWF0dGVyX29mX291dF9jaGFubmVsIG9jID1cbiAgbWFrZV9mb3JtYXR0ZXIgKG91dHB1dF9zdWJzdHJpbmcgb2MpIChmdW4gKCkgLT4gZmx1c2ggb2MpXG5cblxuKCogTWFrZSBhIGZvcm1hdHRlciB3cml0aW5nIHRvIGEgZ2l2ZW4gW0J1ZmZlci50XSB2YWx1ZS4gKilcbmxldCBmb3JtYXR0ZXJfb2ZfYnVmZmVyIGIgPVxuICBtYWtlX2Zvcm1hdHRlciAoQnVmZmVyLmFkZF9zdWJzdHJpbmcgYikgaWdub3JlXG5cblxuKCogQWxsb2NhdGluZyBidWZmZXIgZm9yIHByZXR0eS1wcmludGluZyBwdXJwb3Nlcy5cbiAgIERlZmF1bHQgYnVmZmVyIHNpemUgaXMgcHBfYnVmZmVyX3NpemUgb3IgNTEyLlxuKilcbmxldCBwcF9idWZmZXJfc2l6ZSA9IDUxMlxubGV0IHBwX21ha2VfYnVmZmVyICgpID0gQnVmZmVyLmNyZWF0ZSBwcF9idWZmZXJfc2l6ZVxuXG4oKiBUaGUgc3RhbmRhcmQgKHNoYXJlZCkgYnVmZmVyLiAqKVxubGV0IHN0ZGJ1ZiA9IHBwX21ha2VfYnVmZmVyICgpXG5cbigqIFByZWRlZmluZWQgZm9ybWF0dGVycyBzdGFuZGFyZCBmb3JtYXR0ZXIgdG8gcHJpbnRcbiAgIHRvIFtTdGRsaWIuc3Rkb3V0XSwgW1N0ZGxpYi5zdGRlcnJdLCBhbmQgeyFzdGRidWZ9LiAqKVxubGV0IHN0ZF9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwgU3RkbGliLnN0ZG91dFxuYW5kIGVycl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXJfb2Zfb3V0X2NoYW5uZWwgU3RkbGliLnN0ZGVyclxuYW5kIHN0cl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXJfb2ZfYnVmZmVyIHN0ZGJ1ZlxuXG4oKiBJbml0aWFsaXNlIGRvbWFpbiBsb2NhbCBzdGF0ZSAqKVxubW9kdWxlIERMUyA9IERvbWFpbi5ETFNcblxubGV0IHN0ZGJ1Zl9rZXkgPSBETFMubmV3X2tleSBwcF9tYWtlX2J1ZmZlclxubGV0IF8gPSBETFMuc2V0IHN0ZGJ1Zl9rZXkgc3RkYnVmXG5cbmxldCBzdHJfZm9ybWF0dGVyX2tleSA9IERMUy5uZXdfa2V5IChmdW4gKCkgLT5cbiAgZm9ybWF0dGVyX29mX2J1ZmZlciAoRExTLmdldCBzdGRidWZfa2V5KSlcbmxldCBfID0gRExTLnNldCBzdHJfZm9ybWF0dGVyX2tleSBzdHJfZm9ybWF0dGVyXG5cbmxldCBidWZmZXJlZF9vdXRfc3RyaW5nIGtleSBzdHIgb2ZzIGxlbiA9XG4gIEJ1ZmZlci5hZGRfc3Vic3RyaW5nIChEb21haW4uRExTLmdldCBrZXkpIHN0ciBvZnMgbGVuXG5cbmxldCBidWZmZXJlZF9vdXRfZmx1c2ggb2Mga2V5ICgpID1cbiAgbGV0IGJ1ZiA9IERvbWFpbi5ETFMuZ2V0IGtleSBpblxuICBsZXQgbGVuID0gQnVmZmVyLmxlbmd0aCBidWYgaW5cbiAgbGV0IHN0ciA9IEJ1ZmZlci5jb250ZW50cyBidWYgaW5cbiAgb3V0cHV0X3N1YnN0cmluZyBvYyBzdHIgMCBsZW4gO1xuICBTdGRsaWIuZmx1c2ggb2M7XG4gIEJ1ZmZlci5jbGVhciBidWZcblxubGV0IHN0ZF9idWZfa2V5ID0gRG9tYWluLkRMUy5uZXdfa2V5IChmdW4gKCkgLT4gQnVmZmVyLmNyZWF0ZSBwcF9idWZmZXJfc2l6ZSlcbmxldCBlcnJfYnVmX2tleSA9IERvbWFpbi5ETFMubmV3X2tleSAoZnVuICgpIC0+IEJ1ZmZlci5jcmVhdGUgcHBfYnVmZmVyX3NpemUpXG5cbmxldCBzdGRfZm9ybWF0dGVyX2tleSA9IERMUy5uZXdfa2V5IChmdW4gKCkgLT5cbiAgbGV0IHBwZiA9XG4gICAgcHBfbWFrZV9mb3JtYXR0ZXIgKGJ1ZmZlcmVkX291dF9zdHJpbmcgc3RkX2J1Zl9rZXkpXG4gICAgICAoYnVmZmVyZWRfb3V0X2ZsdXNoIFN0ZGxpYi5zdGRvdXQgc3RkX2J1Zl9rZXkpIGlnbm9yZSBpZ25vcmUgaWdub3JlXG4gIGluXG4gIHBwZi5wcF9vdXRfbmV3bGluZSA8LSBkaXNwbGF5X25ld2xpbmUgcHBmO1xuICBwcGYucHBfb3V0X3NwYWNlcyA8LSBkaXNwbGF5X2JsYW5rcyBwcGY7XG4gIHBwZi5wcF9vdXRfaW5kZW50IDwtIGRpc3BsYXlfaW5kZW50IHBwZjtcbiAgRG9tYWluLmF0X2V4aXQgKHBwX3ByaW50X2ZsdXNoIHBwZik7XG4gIHBwZilcbmxldCBfID0gRExTLnNldCBzdGRfZm9ybWF0dGVyX2tleSBzdGRfZm9ybWF0dGVyXG5cbmxldCBlcnJfZm9ybWF0dGVyX2tleSA9IERMUy5uZXdfa2V5IChmdW4gKCkgLT5cbiAgbGV0IHBwZiA9XG4gICAgcHBfbWFrZV9mb3JtYXR0ZXIgKGJ1ZmZlcmVkX291dF9zdHJpbmcgZXJyX2J1Zl9rZXkpXG4gICAgICAoYnVmZmVyZWRfb3V0X2ZsdXNoIFN0ZGxpYi5zdGRlcnIgZXJyX2J1Zl9rZXkpIGlnbm9yZSBpZ25vcmUgaWdub3JlXG4gIGluXG4gIHBwZi5wcF9vdXRfbmV3bGluZSA8LSBkaXNwbGF5X25ld2xpbmUgcHBmO1xuICBwcGYucHBfb3V0X3NwYWNlcyA8LSBkaXNwbGF5X2JsYW5rcyBwcGY7XG4gIHBwZi5wcF9vdXRfaW5kZW50IDwtIGRpc3BsYXlfaW5kZW50IHBwZjtcbiAgRG9tYWluLmF0X2V4aXQgKHBwX3ByaW50X2ZsdXNoIHBwZik7XG4gIHBwZilcbmxldCBfID0gRExTLnNldCBlcnJfZm9ybWF0dGVyX2tleSBlcnJfZm9ybWF0dGVyXG5cbmxldCBnZXRfc3RkX2Zvcm1hdHRlciAoKSA9IERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXlcbmxldCBnZXRfZXJyX2Zvcm1hdHRlciAoKSA9IERMUy5nZXQgZXJyX2Zvcm1hdHRlcl9rZXlcbmxldCBnZXRfc3RyX2Zvcm1hdHRlciAoKSA9IERMUy5nZXQgc3RyX2Zvcm1hdHRlcl9rZXlcbmxldCBnZXRfc3RkYnVmICgpID0gRExTLmdldCBzdGRidWZfa2V5XG5cbigqIFtmbHVzaF9idWZmZXJfZm9ybWF0dGVyIGJ1ZiBwcGZdIGZsdXNoZXMgZm9ybWF0dGVyIFtwcGZdLFxuICAgdGhlbiByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBidWZmZXIgW2J1Zl0gdGhhdCBpcyByZXNldC5cbiAgIEZvcm1hdHRlciBbcHBmXSBpcyBzdXBwb3NlZCB0byBwcmludCB0byBidWZmZXIgW2J1Zl0sIG90aGVyd2lzZSB0aGlzXG4gICBmdW5jdGlvbiBpcyBub3QgcmVhbGx5IHVzZWZ1bC4gKilcbmxldCBmbHVzaF9idWZmZXJfZm9ybWF0dGVyIGJ1ZiBwcGYgPVxuICBwcF9mbHVzaF9xdWV1ZSBwcGYgZmFsc2U7XG4gIGxldCBzID0gQnVmZmVyLmNvbnRlbnRzIGJ1ZiBpblxuICBCdWZmZXIucmVzZXQgYnVmO1xuICBzXG5cbigqIEZsdXNoIFtzdHJfZm9ybWF0dGVyXSBhbmQgZ2V0IHRoZSBjb250ZW50cyBvZiBbc3RkYnVmXS4gKilcbmxldCBmbHVzaF9zdHJfZm9ybWF0dGVyICgpID1cbiAgbGV0IHN0ZGJ1ZiA9IERMUy5nZXQgc3RkYnVmX2tleSBpblxuICBsZXQgc3RyX2Zvcm1hdHRlciA9IERMUy5nZXQgc3RyX2Zvcm1hdHRlcl9rZXkgaW5cbiAgZmx1c2hfYnVmZmVyX2Zvcm1hdHRlciBzdGRidWYgc3RyX2Zvcm1hdHRlclxuXG5sZXQgbWFrZV9zeW5jaHJvbml6ZWRfZm9ybWF0dGVyIG91dHB1dCBmbHVzaCA9XG4gIERMUy5uZXdfa2V5IChmdW4gKCkgLT5cbiAgICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSBwcF9idWZmZXJfc2l6ZSBpblxuICAgIGxldCBvdXRwdXQnID0gQnVmZmVyLmFkZF9zdWJzdHJpbmcgYnVmIGluXG4gICAgbGV0IGZsdXNoJyAoKSA9XG4gICAgICBvdXRwdXQgKEJ1ZmZlci5jb250ZW50cyBidWYpIDAgKEJ1ZmZlci5sZW5ndGggYnVmKTtcbiAgICAgIEJ1ZmZlci5jbGVhciBidWY7XG4gICAgICBmbHVzaCAoKVxuICAgIGluXG4gICAgbWFrZV9mb3JtYXR0ZXIgb3V0cHV0JyBmbHVzaCcpXG5cbmxldCBzeW5jaHJvbml6ZWRfZm9ybWF0dGVyX29mX291dF9jaGFubmVsIG9jID1cbiAgbWFrZV9zeW5jaHJvbml6ZWRfZm9ybWF0dGVyIChvdXRwdXRfc3Vic3RyaW5nIG9jKSAoZnVuICgpIC0+IGZsdXNoIG9jKVxuXG4oKlxuICBTeW1ib2xpYyBwcmV0dHktcHJpbnRpbmdcbiopXG5cbigqXG4gIFN5bWJvbGljIHByZXR0eS1wcmludGluZyBpcyBwcmV0dHktcHJpbnRpbmcgd2l0aCBubyBsb3cgbGV2ZWwgb3V0cHV0LlxuXG4gIFdoZW4gdXNpbmcgYSBzeW1ib2xpYyBmb3JtYXR0ZXIsIGFsbCByZWd1bGFyIHByZXR0eS1wcmludGluZyBhY3Rpdml0aWVzXG4gIG9jY3VyIGJ1dCBvdXRwdXQgbWF0ZXJpYWwgaXMgc3ltYm9saWMgYW5kIHN0b3JlZCBpbiBhIGJ1ZmZlciBvZiBvdXRwdXRcbiAgaXRlbXMuIEF0IHRoZSBlbmQgb2YgcHJldHR5LXByaW50aW5nLCBmbHVzaGluZyB0aGUgb3V0cHV0IGJ1ZmZlciBhbGxvd3NcbiAgcG9zdC1wcm9jZXNzaW5nIG9mIHN5bWJvbGljIG91dHB1dCBiZWZvcmUgbG93IGxldmVsIG91dHB1dCBvcGVyYXRpb25zLlxuKilcblxudHlwZSBzeW1ib2xpY19vdXRwdXRfaXRlbSA9XG4gIHwgT3V0cHV0X2ZsdXNoXG4gIHwgT3V0cHV0X25ld2xpbmVcbiAgfCBPdXRwdXRfc3RyaW5nIG9mIHN0cmluZ1xuICB8IE91dHB1dF9zcGFjZXMgb2YgaW50XG4gIHwgT3V0cHV0X2luZGVudCBvZiBpbnRcblxudHlwZSBzeW1ib2xpY19vdXRwdXRfYnVmZmVyID0ge1xuICBtdXRhYmxlIHN5bWJvbGljX291dHB1dF9jb250ZW50cyA6IHN5bWJvbGljX291dHB1dF9pdGVtIGxpc3Q7XG59XG5cbmxldCBtYWtlX3N5bWJvbGljX291dHB1dF9idWZmZXIgKCkgPVxuICB7IHN5bWJvbGljX291dHB1dF9jb250ZW50cyA9IFtdIH1cblxubGV0IGNsZWFyX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50cyA8LSBbXVxuXG5sZXQgZ2V0X3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgTGlzdC5yZXYgc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50c1xuXG5sZXQgZmx1c2hfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgPVxuICBsZXQgaXRlbXMgPSBnZXRfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2IgaW5cbiAgY2xlYXJfc3ltYm9saWNfb3V0cHV0X2J1ZmZlciBzb2I7XG4gIGl0ZW1zXG5cbmxldCBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIGl0ZW0gPVxuICBzb2Iuc3ltYm9saWNfb3V0cHV0X2NvbnRlbnRzIDwtIGl0ZW0gOjogc29iLnN5bWJvbGljX291dHB1dF9jb250ZW50c1xuXG5sZXQgZm9ybWF0dGVyX29mX3N5bWJvbGljX291dHB1dF9idWZmZXIgc29iID1cbiAgbGV0IHN5bWJvbGljX2ZsdXNoIHNvYiAoKSA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiBPdXRwdXRfZmx1c2hcbiAgYW5kIHN5bWJvbGljX25ld2xpbmUgc29iICgpID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIE91dHB1dF9uZXdsaW5lXG4gIGFuZCBzeW1ib2xpY19zdHJpbmcgc29iIHMgaSBuID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIChPdXRwdXRfc3RyaW5nIChTdHJpbmcuc3ViIHMgaSBuKSlcbiAgYW5kIHN5bWJvbGljX3NwYWNlcyBzb2IgbiA9XG4gICAgYWRkX3N5bWJvbGljX291dHB1dF9pdGVtIHNvYiAoT3V0cHV0X3NwYWNlcyBuKVxuICBhbmQgc3ltYm9saWNfaW5kZW50IHNvYiBuID1cbiAgICBhZGRfc3ltYm9saWNfb3V0cHV0X2l0ZW0gc29iIChPdXRwdXRfaW5kZW50IG4pIGluXG5cbiAgbGV0IGYgPSBzeW1ib2xpY19zdHJpbmcgc29iXG4gIGFuZCBnID0gc3ltYm9saWNfZmx1c2ggc29iXG4gIGFuZCBoID0gc3ltYm9saWNfbmV3bGluZSBzb2JcbiAgYW5kIGkgPSBzeW1ib2xpY19zcGFjZXMgc29iXG4gIGFuZCBqID0gc3ltYm9saWNfaW5kZW50IHNvYiBpblxuICBwcF9tYWtlX2Zvcm1hdHRlciBmIGcgaCBpIGpcblxuKCpcblxuICBCYXNpYyBmdW5jdGlvbnMgb24gdGhlICdzdGFuZGFyZCcgZm9ybWF0dGVyXG4gICh0aGUgZm9ybWF0dGVyIHRoYXQgcHJpbnRzIHRvIFtTdGRsaWIuc3Rkb3V0XSkuXG5cbiopXG5cbmxldCBvcGVuX2hib3ggdiA9IHBwX29wZW5faGJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG9wZW5fdmJveCB2ID0gcHBfb3Blbl92Ym94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Blbl9odmJveCB2ID0gcHBfb3Blbl9odmJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG9wZW5faG92Ym94IHYgPSBwcF9vcGVuX2hvdmJveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIG9wZW5fYm94IHYgPSBwcF9vcGVuX2JveCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGNsb3NlX2JveCB2ID0gcHBfY2xvc2VfYm94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgb3Blbl9zdGFnIHYgPSBwcF9vcGVuX3N0YWcgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBjbG9zZV9zdGFnIHYgPSBwcF9jbG9zZV9zdGFnIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfYXMgdiB3ID0gcHBfcHJpbnRfYXMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHYgd1xuYW5kIHByaW50X3N0cmluZyB2ID0gcHBfcHJpbnRfc3RyaW5nIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfYnl0ZXMgdiA9IHBwX3ByaW50X2J5dGVzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfaW50IHYgPSBwcF9wcmludF9pbnQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9mbG9hdCB2ID0gcHBfcHJpbnRfZmxvYXQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9jaGFyIHYgPSBwcF9wcmludF9jaGFyIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfYm9vbCB2ID0gcHBfcHJpbnRfYm9vbCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X2JyZWFrIHYgdyA9IHBwX3ByaW50X2JyZWFrIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2IHdcbmFuZCBwcmludF9jdXQgdiA9IHBwX3ByaW50X2N1dCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIHByaW50X3NwYWNlIHYgPSBwcF9wcmludF9zcGFjZSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGZvcmNlX25ld2xpbmUgdiA9IHBwX2ZvcmNlX25ld2xpbmUgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9mbHVzaCB2ID0gcHBfcHJpbnRfZmx1c2ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBwcmludF9uZXdsaW5lIHYgPSBwcF9wcmludF9uZXdsaW5lIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfaWZfbmV3bGluZSB2ID0gcHBfcHJpbnRfaWZfbmV3bGluZSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgb3Blbl90Ym94IHYgPSBwcF9vcGVuX3Rib3ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBjbG9zZV90Ym94IHYgPSBwcF9jbG9zZV90Ym94IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfdGJyZWFrIHYgdyA9IHBwX3ByaW50X3RicmVhayAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdiB3XG5cbmFuZCBzZXRfdGFiIHYgPSBwcF9zZXRfdGFiIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgcHJpbnRfdGFiIHYgPSBwcF9wcmludF90YWIgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9tYXJnaW4gdiA9IHBwX3NldF9tYXJnaW4gKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfbWFyZ2luIHYgPSBwcF9nZXRfbWFyZ2luIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5cbmFuZCBzZXRfbWF4X2luZGVudCB2ID0gcHBfc2V0X21heF9pbmRlbnQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfbWF4X2luZGVudCB2ID0gcHBfZ2V0X21heF9pbmRlbnQgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9nZW9tZXRyeSB+bWF4X2luZGVudCB+bWFyZ2luID1cbiAgcHBfc2V0X2dlb21ldHJ5IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB+bWF4X2luZGVudCB+bWFyZ2luXG5hbmQgc2FmZV9zZXRfZ2VvbWV0cnkgfm1heF9pbmRlbnQgfm1hcmdpbiA9XG4gIHBwX3NhZmVfc2V0X2dlb21ldHJ5IChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB+bWF4X2luZGVudCB+bWFyZ2luXG5hbmQgZ2V0X2dlb21ldHJ5IHYgPSBwcF9nZXRfZ2VvbWV0cnkgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCB1cGRhdGVfZ2VvbWV0cnkgdiA9IHBwX3VwZGF0ZV9nZW9tZXRyeSAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X21heF9ib3hlcyB2ID0gcHBfc2V0X21heF9ib3hlcyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9tYXhfYm94ZXMgdiA9IHBwX2dldF9tYXhfYm94ZXMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBvdmVyX21heF9ib3hlcyB2ID0gcHBfb3Zlcl9tYXhfYm94ZXMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9lbGxpcHNpc190ZXh0IHYgPSBwcF9zZXRfZWxsaXBzaXNfdGV4dCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9lbGxpcHNpc190ZXh0IHYgPSBwcF9nZXRfZWxsaXBzaXNfdGV4dCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCB2ID1cbiAgcHBfc2V0X2Zvcm1hdHRlcl9vdXRfY2hhbm5lbCAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2Zvcm1hdHRlcl9vdXRfZnVuY3Rpb25zIHYgPVxuICBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgdiA9XG4gIHBwX2dldF9mb3JtYXR0ZXJfb3V0X2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuXG5hbmQgc2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHYgdyA9XG4gIHBwX3NldF9mb3JtYXR0ZXJfb3V0cHV0X2Z1bmN0aW9ucyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdiB3XG5hbmQgZ2V0X2Zvcm1hdHRlcl9vdXRwdXRfZnVuY3Rpb25zIHYgPVxuICBwcF9nZXRfZm9ybWF0dGVyX291dHB1dF9mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuYW5kIHNldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgdiA9XG4gIHBwX3NldF9mb3JtYXR0ZXJfc3RhZ19mdW5jdGlvbnMgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBnZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIHYgPVxuICBwcF9nZXRfZm9ybWF0dGVyX3N0YWdfZnVuY3Rpb25zIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgc2V0X3ByaW50X3RhZ3MgdiA9XG4gIHBwX3NldF9wcmludF90YWdzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgZ2V0X3ByaW50X3RhZ3MgdiA9XG4gIHBwX2dldF9wcmludF90YWdzIChETFMuZ2V0IHN0ZF9mb3JtYXR0ZXJfa2V5KSB2XG5hbmQgc2V0X21hcmtfdGFncyB2ID1cbiAgcHBfc2V0X21hcmtfdGFncyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgdlxuYW5kIGdldF9tYXJrX3RhZ3MgdiA9XG4gIHBwX2dldF9tYXJrX3RhZ3MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcbmFuZCBzZXRfdGFncyB2ID1cbiAgcHBfc2V0X3RhZ3MgKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpIHZcblxuXG4oKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgKilcblxuKCogVG8gZm9ybWF0IGEgbGlzdCAqKVxubGV0IHJlYyBwcF9wcmludF9saXN0ID8ocHBfc2VwID0gcHBfcHJpbnRfY3V0KSBwcF92IHBwZiA9IGZ1bmN0aW9uXG4gIHwgW10gLT4gKClcbiAgfCBbdl0gLT4gcHBfdiBwcGYgdlxuICB8IHYgOjogdnMgLT5cbiAgICBwcF92IHBwZiB2O1xuICAgIHBwX3NlcCBwcGYgKCk7XG4gICAgcHBfcHJpbnRfbGlzdCB+cHBfc2VwIHBwX3YgcHBmIHZzXG5cbigqIFRvIGZvcm1hdCBhIHNlcXVlbmNlICopXG5sZXQgcmVjIHBwX3ByaW50X3NlcV9pbiB+cHBfc2VwIHBwX3YgcHBmIHNlcSA9XG4gIG1hdGNoIHNlcSAoKSB3aXRoXG4gIHwgU2VxLk5pbCAtPiAoKVxuICB8IFNlcS5Db25zICh2LCBzZXEpIC0+XG4gICAgcHBfc2VwIHBwZiAoKTtcbiAgICBwcF92IHBwZiB2O1xuICAgIHBwX3ByaW50X3NlcV9pbiB+cHBfc2VwIHBwX3YgcHBmIHNlcVxuXG5sZXQgcHBfcHJpbnRfc2VxID8ocHBfc2VwID0gcHBfcHJpbnRfY3V0KSBwcF92IHBwZiBzZXEgPVxuICBtYXRjaCBzZXEgKCkgd2l0aFxuICB8IFNlcS5OaWwgLT4gKClcbiAgfCBTZXEuQ29ucyAodiwgc2VxKSAtPlxuICAgIHBwX3YgcHBmIHY7XG4gICAgcHBfcHJpbnRfc2VxX2luIH5wcF9zZXAgcHBfdiBwcGYgc2VxXG5cbigqIFRvIGZvcm1hdCBmcmVlLWZsb3dpbmcgdGV4dCAqKVxubGV0IHBwX3ByaW50X3RleHQgcHBmIHMgPVxuICBsZXQgbGVuID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCBsZWZ0ID0gcmVmIDAgaW5cbiAgbGV0IHJpZ2h0ID0gcmVmIDAgaW5cbiAgbGV0IGZsdXNoICgpID1cbiAgICBwcF9wcmludF9zdHJpbmcgcHBmIChTdHJpbmcuc3ViIHMgIWxlZnQgKCFyaWdodCAtICFsZWZ0KSk7XG4gICAgaW5jciByaWdodDsgbGVmdCA6PSAhcmlnaHQ7XG4gIGluXG4gIHdoaWxlICghcmlnaHQgPD4gbGVuKSBkb1xuICAgIG1hdGNoIHMuWyFyaWdodF0gd2l0aFxuICAgICAgfCAnXFxuJyAtPlxuICAgICAgICBmbHVzaCAoKTtcbiAgICAgICAgcHBfZm9yY2VfbmV3bGluZSBwcGYgKClcbiAgICAgIHwgJyAnIC0+XG4gICAgICAgIGZsdXNoICgpOyBwcF9wcmludF9zcGFjZSBwcGYgKClcbiAgICAgICgqIHRoZXJlIGlzIG5vIHNwZWNpZmljIHN1cHBvcnQgZm9yICdcXHQnXG4gICAgICAgICBhcyBpdCBpcyB1bmNsZWFyIHdoYXQgYSByaWdodCBzZW1hbnRpY3Mgd291bGQgYmUgKilcbiAgICAgIHwgXyAtPiBpbmNyIHJpZ2h0XG4gIGRvbmU7XG4gIGlmICFsZWZ0IDw+IGxlbiB0aGVuIGZsdXNoICgpXG5cbmxldCBwcF9wcmludF9vcHRpb24gPyhub25lID0gZnVuIF8gKCkgLT4gKCkpIHBwX3YgcHBmID0gZnVuY3Rpb25cbnwgTm9uZSAtPiBub25lIHBwZiAoKVxufCBTb21lIHYgLT4gcHBfdiBwcGYgdlxuXG5sZXQgcHBfcHJpbnRfcmVzdWx0IH5vayB+ZXJyb3IgcHBmID0gZnVuY3Rpb25cbnwgT2sgdiAtPiBvayBwcGYgdlxufCBFcnJvciBlIC0+IGVycm9yIHBwZiBlXG5cbmxldCBwcF9wcmludF9laXRoZXIgfmxlZnQgfnJpZ2h0IHBwZiA9IGZ1bmN0aW9uXG58IEVpdGhlci5MZWZ0IGwgLT4gbGVmdCBwcGYgbFxufCBFaXRoZXIuUmlnaHQgciAtPiByaWdodCBwcGYgclxuXG4gKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5sZXQgY29tcHV0ZV90YWcgb3V0cHV0IHRhZ19hY2MgPVxuICBsZXQgYnVmID0gQnVmZmVyLmNyZWF0ZSAxNiBpblxuICBsZXQgcHBmID0gZm9ybWF0dGVyX29mX2J1ZmZlciBidWYgaW5cbiAgb3V0cHV0IHBwZiB0YWdfYWNjO1xuICBwcF9wcmludF9mbHVzaCBwcGYgKCk7XG4gIGxldCBsZW4gPSBCdWZmZXIubGVuZ3RoIGJ1ZiBpblxuICBpZiBsZW4gPCAyIHRoZW4gQnVmZmVyLmNvbnRlbnRzIGJ1ZlxuICBlbHNlIEJ1ZmZlci5zdWIgYnVmIDEgKGxlbiAtIDIpXG5cbiAoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuICBEZWZpbmluZyBjb250aW51YXRpb25zIHRvIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgb2ZcbiAgQ2FtbGludGVybmFsRm9ybWF0Lm1ha2VfcHJpbnRmLlxuXG4gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljc1xub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRcblxuKCogSW50ZXJwcmV0IGEgZm9ybWF0dGluZyBlbnRpdHkgb24gYSBmb3JtYXR0ZXIuICopXG5sZXQgb3V0cHV0X2Zvcm1hdHRpbmdfbGl0IHBwZiBmbXRpbmdfbGl0ID0gbWF0Y2ggZm10aW5nX2xpdCB3aXRoXG4gIHwgQ2xvc2VfYm94ICAgICAgICAgICAgICAgICAtPiBwcF9jbG9zZV9ib3ggcHBmICgpXG4gIHwgQ2xvc2VfdGFnICAgICAgICAgICAgICAgICAtPiBwcF9jbG9zZV9zdGFnIHBwZiAoKVxuICB8IEJyZWFrIChfLCB3aWR0aCwgb2Zmc2V0KSAgLT4gcHBfcHJpbnRfYnJlYWsgcHBmIHdpZHRoIG9mZnNldFxuICB8IEZGbHVzaCAgICAgICAgICAgICAgICAgICAgLT4gcHBfcHJpbnRfZmx1c2ggcHBmICgpXG4gIHwgRm9yY2VfbmV3bGluZSAgICAgICAgICAgICAtPiBwcF9mb3JjZV9uZXdsaW5lIHBwZiAoKVxuICB8IEZsdXNoX25ld2xpbmUgICAgICAgICAgICAgLT4gcHBfcHJpbnRfbmV3bGluZSBwcGYgKClcbiAgfCBNYWdpY19zaXplIChfLCBfKSAgICAgICAgIC0+ICgpXG4gIHwgRXNjYXBlZF9hdCAgICAgICAgICAgICAgICAtPiBwcF9wcmludF9jaGFyIHBwZiAnQCdcbiAgfCBFc2NhcGVkX3BlcmNlbnQgICAgICAgICAgIC0+IHBwX3ByaW50X2NoYXIgcHBmICclJ1xuICB8IFNjYW5faW5kaWMgYyAgICAgICAgICAgICAgLT4gcHBfcHJpbnRfY2hhciBwcGYgJ0AnOyBwcF9wcmludF9jaGFyIHBwZiBjXG5cbigqIFJlY3Vyc2l2ZWx5IG91dHB1dCBhbiBcImFjY3VtdWxhdG9yXCIgY29udGFpbmluZyBhIHJldmVyc2VkIGxpc3Qgb2ZcbiAgIHByaW50aW5nIGVudGl0aWVzIChzdHJpbmcsIGNoYXIsIGZsdXMsIC4uLikgaW4gYW4gb3V0cHV0X3N0cmVhbS4gKilcbigqIERpZmZlciBmcm9tIFByaW50Zi5vdXRwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBmb3JtYXR0aW5nLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBDYW1saW50ZXJuYWxGb3JtYXQubWFrZV9wcmludGYuICopXG5sZXQgcmVjIG91dHB1dF9hY2MgcHBmIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgKFN0cmluZy5tYWtlIDEgYyk7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmKSAtPlxuICAgIG91dHB1dF9hY2MgcHBmIHA7XG4gICAgb3V0cHV0X2Zvcm1hdHRpbmdfbGl0IHBwZiBmO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBwcF9vcGVuX3N0YWcgcHBmIChTdHJpbmdfdGFnIChjb21wdXRlX3RhZyBvdXRwdXRfYWNjIGFjYycpKVxuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgb3V0cHV0X2FjYyBwcGYgcDtcbiAgICBsZXQgKGluZGVudCwgYnR5KSA9IG9wZW5fYm94X29mX3N0cmluZyAoY29tcHV0ZV90YWcgb3V0cHV0X2FjYyBhY2MnKSBpblxuICAgIHBwX29wZW5fYm94X2dlbiBwcGYgaW5kZW50IGJ0eVxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gb3V0cHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfc3RyaW5nIHBwZiBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2NoYXIgcHBmIGM7XG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IG91dHB1dF9hY2MgcHBmIHA7IGYgcHBmO1xuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBvdXRwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9mbHVzaCBwcGYgKCk7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IG91dHB1dF9hY2MgcHBmIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCogUmVjdXJzaXZlbHkgb3V0cHV0IGFuIFwiYWNjdW11bGF0b3JcIiBjb250YWluaW5nIGEgcmV2ZXJzZWQgbGlzdCBvZlxuICAgcHJpbnRpbmcgZW50aXRpZXMgKHN0cmluZywgY2hhciwgZmx1cywgLi4uKSBpbiBhIGJ1ZmZlci4gKilcbigqIERpZmZlciBmcm9tIFByaW50Zi5idWZwdXRfYWNjIGJ5IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBmb3JtYXR0aW5nLiAqKVxuKCogVXNlZCBhcyBhIGNvbnRpbnVhdGlvbiBvZiBDYW1saW50ZXJuYWxGb3JtYXQubWFrZV9wcmludGYuICopXG5sZXQgcmVjIHN0cnB1dF9hY2MgcHBmIGFjYyA9IG1hdGNoIGFjYyB3aXRoXG4gIHwgQWNjX3N0cmluZ19saXRlcmFsIChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKEFjY19mb3JtYXR0aW5nX2xpdCAocCwgTWFnaWNfc2l6ZSAoXywgc2l6ZSkpLCBzKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgcHBfcHJpbnRfYXNfc2l6ZSBwcGYgKFNpemUub2ZfaW50IHNpemUpIHM7XG4gIHwgQWNjX2NoYXJfbGl0ZXJhbCAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAoQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBNYWdpY19zaXplIChfLCBzaXplKSksIGMpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9wcmludF9hc19zaXplIHBwZiAoU2l6ZS5vZl9pbnQgc2l6ZSkgKFN0cmluZy5tYWtlIDEgYyk7XG4gIHwgQWNjX2RlbGF5IChBY2NfZm9ybWF0dGluZ19saXQgKHAsIE1hZ2ljX3NpemUgKF8sIHNpemUpKSwgZikgLT5cbiAgICBzdHJwdXRfYWNjIHBwZiBwO1xuICAgIHBwX3ByaW50X2FzX3NpemUgcHBmIChTaXplLm9mX2ludCBzaXplKSAoZiAoKSk7XG4gIHwgQWNjX2Zvcm1hdHRpbmdfbGl0IChwLCBmKSAtPlxuICAgIHN0cnB1dF9hY2MgcHBmIHA7XG4gICAgb3V0cHV0X2Zvcm1hdHRpbmdfbGl0IHBwZiBmO1xuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fdGFnIGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBwcF9vcGVuX3N0YWcgcHBmIChTdHJpbmdfdGFnIChjb21wdXRlX3RhZyBzdHJwdXRfYWNjIGFjYycpKVxuICB8IEFjY19mb3JtYXR0aW5nX2dlbiAocCwgQWNjX29wZW5fYm94IGFjYycpIC0+XG4gICAgc3RycHV0X2FjYyBwcGYgcDtcbiAgICBsZXQgKGluZGVudCwgYnR5KSA9IG9wZW5fYm94X29mX3N0cmluZyAoY29tcHV0ZV90YWcgc3RycHV0X2FjYyBhY2MnKSBpblxuICAgIHBwX29wZW5fYm94X2dlbiBwcGYgaW5kZW50IGJ0eVxuICB8IEFjY19zdHJpbmdfbGl0ZXJhbCAocCwgcylcbiAgfCBBY2NfZGF0YV9zdHJpbmcgKHAsIHMpICAgLT4gc3RycHV0X2FjYyBwcGYgcDsgcHBfcHJpbnRfc3RyaW5nIHBwZiBzO1xuICB8IEFjY19jaGFyX2xpdGVyYWwgKHAsIGMpXG4gIHwgQWNjX2RhdGFfY2hhciAocCwgYykgICAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X2NoYXIgcHBmIGM7XG4gIHwgQWNjX2RlbGF5IChwLCBmKSAgICAgICAgIC0+IHN0cnB1dF9hY2MgcHBmIHA7IHBwX3ByaW50X3N0cmluZyBwcGYgKGYgKCkpO1xuICB8IEFjY19mbHVzaCBwICAgICAgICAgICAgICAtPiBzdHJwdXRfYWNjIHBwZiBwOyBwcF9wcmludF9mbHVzaCBwcGYgKCk7XG4gIHwgQWNjX2ludmFsaWRfYXJnIChwLCBtc2cpIC0+IHN0cnB1dF9hY2MgcHBmIHA7IGludmFsaWRfYXJnIG1zZztcbiAgfCBFbmRfb2ZfYWNjICAgICAgICAgICAgICAgLT4gKClcblxuKCpcblxuICBEZWZpbmluZyBbZnByaW50Zl0gYW5kIHZhcmlvdXMgZmxhdm9ycyBvZiBbZnByaW50Zl0uXG5cbiopXG5cbmxldCBrZnByaW50ZiBrIHBwZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gb3V0cHV0X2FjYyBwcGYgYWNjOyBrIHBwZilcbiAgICBFbmRfb2ZfYWNjIGZtdFxuXG5hbmQgaWtmcHJpbnRmIGsgcHBmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9pcHJpbnRmIGsgcHBmIGZtdFxuXG5sZXQgaWZwcmludGYgX3BwZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfaXByaW50ZiBpZ25vcmUgKCkgZm10XG5cbmxldCBmcHJpbnRmIHBwZiA9IGtmcHJpbnRmIGlnbm9yZSBwcGZcblxubGV0IHByaW50ZiAoRm9ybWF0IChmbXQsIF8pKSA9XG4gIG1ha2VfcHJpbnRmXG4gICAgKGZ1biBhY2MgLT4gb3V0cHV0X2FjYyAoRExTLmdldCBzdGRfZm9ybWF0dGVyX2tleSkgYWNjKVxuICAgIEVuZF9vZl9hY2MgZm10XG5cbmxldCBlcHJpbnRmIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbWFrZV9wcmludGZcbiAgICAoZnVuIGFjYyAtPiBvdXRwdXRfYWNjIChETFMuZ2V0IGVycl9mb3JtYXR0ZXJfa2V5KSBhY2MpXG4gICAgRW5kX29mX2FjYyBmbXRcblxubGV0IGtkcHJpbnRmIGsgKEZvcm1hdCAoZm10LCBfKSkgPVxuICBtYWtlX3ByaW50ZlxuICAgIChmdW4gYWNjIC0+IGsgKGZ1biBwcGYgLT4gb3V0cHV0X2FjYyBwcGYgYWNjKSlcbiAgICBFbmRfb2ZfYWNjIGZtdFxuXG5sZXQgZHByaW50ZiBmbXQgPSBrZHByaW50ZiAoZnVuIGkgLT4gaSkgZm10XG5cbmxldCBrc3ByaW50ZiBrIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbGV0IGIgPSBwcF9tYWtlX2J1ZmZlciAoKSBpblxuICBsZXQgcHBmID0gZm9ybWF0dGVyX29mX2J1ZmZlciBiIGluXG4gIGxldCBrIGFjYyA9XG4gICAgc3RycHV0X2FjYyBwcGYgYWNjO1xuICAgIGsgKGZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIgYiBwcGYpIGluXG4gIG1ha2VfcHJpbnRmIGsgRW5kX29mX2FjYyBmbXRcblxuXG5sZXQgc3ByaW50ZiBmbXQgPSBrc3ByaW50ZiBpZCBmbXRcblxubGV0IGthc3ByaW50ZiBrIChGb3JtYXQgKGZtdCwgXykpID1cbiAgbGV0IGIgPSBwcF9tYWtlX2J1ZmZlciAoKSBpblxuICBsZXQgcHBmID0gZm9ybWF0dGVyX29mX2J1ZmZlciBiIGluXG4gIGxldCBrIGFjYyA9XG4gICAgb3V0cHV0X2FjYyBwcGYgYWNjO1xuICAgIGsgKGZsdXNoX2J1ZmZlcl9mb3JtYXR0ZXIgYiBwcGYpIGluXG4gIG1ha2VfcHJpbnRmIGsgRW5kX29mX2FjYyBmbXRcblxuXG5sZXQgYXNwcmludGYgZm10ID0ga2FzcHJpbnRmIGlkIGZtdFxuXG4oKiBGbHVzaGluZyBzdGFuZGFyZCBmb3JtYXR0ZXJzIGF0IGVuZCBvZiBleGVjdXRpb24uICopXG5cbmxldCBmbHVzaF9zdGFuZGFyZF9mb3JtYXR0ZXJzICgpID1cbiAgcHBfcHJpbnRfZmx1c2ggKERMUy5nZXQgc3RkX2Zvcm1hdHRlcl9rZXkpICgpO1xuICBwcF9wcmludF9mbHVzaCAoRExTLmdldCBlcnJfZm9ybWF0dGVyX2tleSkgKClcblxubGV0ICgpID0gYXRfZXhpdCBmbHVzaF9zdGFuZGFyZF9mb3JtYXR0ZXJzXG5cbmxldCAoKSA9IERvbWFpbi5iZWZvcmVfZmlyc3Rfc3Bhd24gKGZ1biAoKSAtPlxuICBmbHVzaF9zdGFuZGFyZF9mb3JtYXR0ZXJzICgpO1xuICBsZXQgZnMgPSBwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgc3RkX2Zvcm1hdHRlciAoKSBpblxuICBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgc3RkX2Zvcm1hdHRlclxuICAgIHtmcyB3aXRoIG91dF9zdHJpbmcgPSBidWZmZXJlZF9vdXRfc3RyaW5nIHN0ZF9idWZfa2V5O1xuICAgICAgICAgICAgIG91dF9mbHVzaCA9IGJ1ZmZlcmVkX291dF9mbHVzaCBTdGRsaWIuc3Rkb3V0IHN0ZF9idWZfa2V5fTtcblxuICBsZXQgZnMgPSBwcF9nZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgZXJyX2Zvcm1hdHRlciAoKSBpblxuICBwcF9zZXRfZm9ybWF0dGVyX291dF9mdW5jdGlvbnMgZXJyX2Zvcm1hdHRlclxuICAgIHtmcyB3aXRoIG91dF9zdHJpbmcgPSBidWZmZXJlZF9vdXRfc3RyaW5nIGVycl9idWZfa2V5O1xuICAgICAgICAgICAgIG91dF9mbHVzaCA9IGJ1ZmZlcmVkX291dF9mbHVzaCBTdGRsaWIuc3RkZXJyIGVycl9idWZfa2V5fTtcbilcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFBpZXJyZSBXZWlzLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDIgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxub3BlbiBDYW1saW50ZXJuYWxGb3JtYXRCYXNpY3Ncbm9wZW4gQ2FtbGludGVybmFsRm9ybWF0XG5cbigqIGFsaWFzIHRvIGF2b2lkIHdhcm5pbmcgZm9yIGFtYmlndWl0eSBiZXR3ZWVuXG4gICBTdGRsaWIuZm9ybWF0NlxuICAgYW5kIENhbWxpbnRlcm5hbEZvcm1hdEJhc2ljcy5mb3JtYXQ2XG5cbiAgICh0aGUgZm9ybWVyIGlzIGluIGZhY3QgYW4gYWxpYXMgZm9yIHRoZSBsYXR0ZXIsXG4gICAgYnV0IHRoZSBhbWJpZ3VpdHkgd2FybmluZyBkb2Vzbid0IGNhcmUpXG4qKVxudHlwZSAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiA9XG4gICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBTdGRsaWIuZm9ybWF0NlxuXG5cbigqIFRoZSBydW4tdGltZSBsaWJyYXJ5IGZvciBzY2FubmVycy4gKilcblxuKCogU2Nhbm5pbmcgYnVmZmVycy4gKilcbm1vZHVsZSB0eXBlIFNDQU5OSU5HID0gc2lnXG5cbiAgdHlwZSBpbl9jaGFubmVsXG5cbiAgdHlwZSBzY2FuYnVmID0gaW5fY2hhbm5lbFxuXG4gIHR5cGUgZmlsZV9uYW1lID0gc3RyaW5nXG5cbiAgdmFsIHN0ZGluIDogaW5fY2hhbm5lbFxuICAoKiBUaGUgc2Nhbm5pbmcgYnVmZmVyIHJlYWRpbmcgZnJvbSBbU3RkbGliLnN0ZGluXS4gKilcblxuICB2YWwgbmV4dF9jaGFyIDogc2NhbmJ1ZiAtPiBjaGFyXG4gICgqIFtTY2FubmluZy5uZXh0X2NoYXIgaWJdIGFkdmFuY2UgdGhlIHNjYW5uaW5nIGJ1ZmZlciBmb3JcbiAgICAgb25lIGNoYXJhY3Rlci5cbiAgICAgSWYgbm8gbW9yZSBjaGFyYWN0ZXIgY2FuIGJlIHJlYWQsIHNldHMgYSBlbmQgb2YgZmlsZSBjb25kaXRpb24gYW5kXG4gICAgIHJldHVybnMgJ1xcMDAwJy4gKilcblxuICB2YWwgaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgOiBzY2FuYnVmIC0+IHVuaXRcbiAgKCogW1NjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliXSBtYXJrIHRoZSBjdXJyZW50X2NoYXIgYXMgYWxyZWFkeVxuICAgICBzY2FubmVkLiAqKVxuXG4gIHZhbCBwZWVrX2NoYXIgOiBzY2FuYnVmIC0+IGNoYXJcbiAgKCogW1NjYW5uaW5nLnBlZWtfY2hhciBpYl0gcmV0dXJucyB0aGUgY3VycmVudCBjaGFyIGF2YWlsYWJsZSBpblxuICAgICB0aGUgYnVmZmVyIG9yIHJlYWRzIG9uZSBpZiBuZWNlc3NhcnkgKHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzXG4gICAgIGFscmVhZHkgc2Nhbm5lZCkuXG4gICAgIElmIG5vIGNoYXJhY3RlciBjYW4gYmUgcmVhZCwgc2V0cyBhbiBlbmQgb2YgZmlsZSBjb25kaXRpb24gYW5kXG4gICAgIHJldHVybnMgJ1xcMDAwJy4gKilcblxuICB2YWwgY2hlY2tlZF9wZWVrX2NoYXIgOiBzY2FuYnVmIC0+IGNoYXJcbiAgKCogU2FtZSBhcyBbU2Nhbm5pbmcucGVla19jaGFyXSBhYm92ZSBidXQgYWx3YXlzIHJldHVybnMgYSB2YWxpZCBjaGFyIG9yXG4gICAgIGZhaWxzOiBpbnN0ZWFkIG9mIHJldHVybmluZyBhIG51bGwgY2hhciB3aGVuIHRoZSByZWFkaW5nIG1ldGhvZCBvZiB0aGVcbiAgICAgaW5wdXQgYnVmZmVyIGhhcyByZWFjaGVkIGFuIGVuZCBvZiBmaWxlLCB0aGUgZnVuY3Rpb24gcmFpc2VzIGV4Y2VwdGlvblxuICAgICBbRW5kX29mX2ZpbGVdLiAqKVxuXG4gIHZhbCBzdG9yZV9jaGFyIDogaW50IC0+IHNjYW5idWYgLT4gY2hhciAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLnN0b3JlX2NoYXIgbGltIGliIGNdIGFkZHMgW2NdIHRvIHRoZSB0b2tlbiBidWZmZXJcbiAgICAgb2YgdGhlIHNjYW5uaW5nIGJ1ZmZlciBbaWJdLiBJdCBhbHNvIGFkdmFuY2VzIHRoZSBzY2FubmluZyBidWZmZXIgZm9yXG4gICAgIG9uZSBjaGFyYWN0ZXIgYW5kIHJldHVybnMgW2xpbSAtIDFdLCBpbmRpY2F0aW5nIHRoZSBuZXcgbGltaXQgZm9yIHRoZVxuICAgICBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uICopXG5cbiAgdmFsIHNraXBfY2hhciA6IGludCAtPiBzY2FuYnVmIC0+IGludFxuICAoKiBbU2Nhbm5pbmcuc2tpcF9jaGFyIGxpbSBpYl0gaWdub3JlcyB0aGUgY3VycmVudCBjaGFyYWN0ZXIuICopXG5cbiAgdmFsIGlnbm9yZV9jaGFyIDogaW50IC0+IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5pZ25vcmVfY2hhciBpYiBsaW1dIGlnbm9yZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGFuZFxuICAgICBkZWNyZW1lbnRzIHRoZSBsaW1pdC4gKilcblxuICB2YWwgdG9rZW4gOiBzY2FuYnVmIC0+IHN0cmluZ1xuICAoKiBbU2Nhbm5pbmcudG9rZW4gaWJdIHJldHVybnMgdGhlIHN0cmluZyBzdG9yZWQgaW50byB0aGUgdG9rZW5cbiAgICAgYnVmZmVyIG9mIHRoZSBzY2FubmluZyBidWZmZXI6IGl0IHJldHVybnMgdGhlIHRva2VuIG1hdGNoZWQgYnkgdGhlXG4gICAgIGZvcm1hdC4gKilcblxuICB2YWwgcmVzZXRfdG9rZW4gOiBzY2FuYnVmIC0+IHVuaXRcbiAgKCogW1NjYW5uaW5nLnJlc2V0X3Rva2VuIGliXSByZXNldHMgdGhlIHRva2VuIGJ1ZmZlciBvZlxuICAgICB0aGUgZ2l2ZW4gc2Nhbm5pbmcgYnVmZmVyLiAqKVxuXG4gIHZhbCBjaGFyX2NvdW50IDogc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLmNoYXJfY291bnQgaWJdIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAgIHJlYWQgc28gZmFyIGZyb20gdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgbGluZV9jb3VudCA6IHNjYW5idWYgLT4gaW50XG4gICgqIFtTY2FubmluZy5saW5lX2NvdW50IGliXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgbmV3IGxpbmVcbiAgICAgY2hhcmFjdGVycyByZWFkIHNvIGZhciBmcm9tIHRoZSBnaXZlbiBidWZmZXIuICopXG5cbiAgdmFsIHRva2VuX2NvdW50IDogc2NhbmJ1ZiAtPiBpbnRcbiAgKCogW1NjYW5uaW5nLnRva2VuX2NvdW50IGliXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIHJlYWRcbiAgICAgc28gZmFyIGZyb20gW2liXS4gKilcblxuICB2YWwgZW9mIDogc2NhbmJ1ZiAtPiBib29sXG4gICgqIFtTY2FubmluZy5lb2YgaWJdIHJldHVybnMgdGhlIGVuZCBvZiBpbnB1dCBjb25kaXRpb25cbiAgICAgb2YgdGhlIGdpdmVuIGJ1ZmZlci4gKilcblxuICB2YWwgZW5kX29mX2lucHV0IDogc2NhbmJ1ZiAtPiBib29sXG4gICgqIFtTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWJdIHRlc3RzIHRoZSBlbmQgb2YgaW5wdXQgY29uZGl0aW9uXG4gICAgIG9mIHRoZSBnaXZlbiBidWZmZXIgKGlmIG5vIGNoYXIgaGFzIGV2ZXIgYmVlbiByZWFkLCBhbiBhdHRlbXB0IHRvXG4gICAgIHJlYWQgb25lIGlzIHBlcmZvcm1lZCkuICopXG5cbiAgdmFsIGJlZ2lubmluZ19vZl9pbnB1dCA6IHNjYW5idWYgLT4gYm9vbFxuICAoKiBbU2Nhbm5pbmcuYmVnaW5uaW5nX29mX2lucHV0IGliXSB0ZXN0cyB0aGUgYmVnaW5uaW5nIG9mIGlucHV0XG4gICAgIGNvbmRpdGlvbiBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiAqKVxuXG4gIHZhbCBuYW1lX29mX2lucHV0IDogc2NhbmJ1ZiAtPiBzdHJpbmdcbiAgKCogW1NjYW5uaW5nLm5hbWVfb2ZfaW5wdXQgaWJdIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlclxuICAgICBzb3VyY2UgZm9yIGlucHV0IGJ1ZmZlciBbaWJdLiAqKVxuXG4gIHZhbCBvcGVuX2luIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIG9wZW5faW5fYmluIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fZmlsZSA6IGZpbGVfbmFtZSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2ZpbGVfYmluIDogZmlsZV9uYW1lIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fc3RyaW5nIDogc3RyaW5nIC0+IGluX2NoYW5uZWxcbiAgdmFsIGZyb21fZnVuY3Rpb24gOiAodW5pdCAtPiBjaGFyKSAtPiBpbl9jaGFubmVsXG4gIHZhbCBmcm9tX2NoYW5uZWwgOiBTdGRsaWIuaW5fY2hhbm5lbCAtPiBpbl9jaGFubmVsXG5cbiAgdmFsIGNsb3NlX2luIDogaW5fY2hhbm5lbCAtPiB1bml0XG5cbmVuZFxuXG5cbm1vZHVsZSBTY2FubmluZyA6IFNDQU5OSU5HID0gc3RydWN0XG5cbiAgKCogVGhlIHJ1bi10aW1lIGxpYnJhcnkgZm9yIHNjYW5mLiAqKVxuXG4gIHR5cGUgZmlsZV9uYW1lID0gc3RyaW5nXG5cbiAgdHlwZSBpbl9jaGFubmVsX25hbWUgPVxuICAgIHwgRnJvbV9jaGFubmVsIG9mIFN0ZGxpYi5pbl9jaGFubmVsXG4gICAgfCBGcm9tX2ZpbGUgb2YgZmlsZV9uYW1lICogU3RkbGliLmluX2NoYW5uZWxcbiAgICB8IEZyb21fZnVuY3Rpb25cbiAgICB8IEZyb21fc3RyaW5nXG5cblxuICB0eXBlIGluX2NoYW5uZWwgPSB7XG4gICAgbXV0YWJsZSBpY19lb2YgOiBib29sO1xuICAgIG11dGFibGUgaWNfY3VycmVudF9jaGFyIDogY2hhcjtcbiAgICBtdXRhYmxlIGljX2N1cnJlbnRfY2hhcl9pc192YWxpZCA6IGJvb2w7XG4gICAgbXV0YWJsZSBpY19jaGFyX2NvdW50IDogaW50O1xuICAgIG11dGFibGUgaWNfbGluZV9jb3VudCA6IGludDtcbiAgICBtdXRhYmxlIGljX3Rva2VuX2NvdW50IDogaW50O1xuICAgIGljX2dldF9uZXh0X2NoYXIgOiB1bml0IC0+IGNoYXI7XG4gICAgaWNfdG9rZW5fYnVmZmVyIDogQnVmZmVyLnQ7XG4gICAgaWNfaW5wdXRfbmFtZSA6IGluX2NoYW5uZWxfbmFtZTtcbiAgfVxuXG5cbiAgdHlwZSBzY2FuYnVmID0gaW5fY2hhbm5lbFxuXG4gIGxldCBudWxsX2NoYXIgPSAnXFwwMDAnXG5cbiAgKCogUmVhZHMgYSBuZXcgY2hhcmFjdGVyIGZyb20gaW5wdXQgYnVmZmVyLlxuICAgICBOZXh0X2NoYXIgbmV2ZXIgZmFpbHMsIGV2ZW4gaW4gY2FzZSBvZiBlbmQgb2YgaW5wdXQ6XG4gICAgIGl0IHRoZW4gc2ltcGx5IHNldHMgdGhlIGVuZCBvZiBmaWxlIGNvbmRpdGlvbi4gKilcbiAgbGV0IG5leHRfY2hhciBpYiA9XG4gICAgdHJ5XG4gICAgICBsZXQgYyA9IGliLmljX2dldF9uZXh0X2NoYXIgKCkgaW5cbiAgICAgIGliLmljX2N1cnJlbnRfY2hhciA8LSBjO1xuICAgICAgaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDwtIHRydWU7XG4gICAgICBpYi5pY19jaGFyX2NvdW50IDwtIHN1Y2MgaWIuaWNfY2hhcl9jb3VudDtcbiAgICAgIGlmIGMgPSAnXFxuJyB0aGVuIGliLmljX2xpbmVfY291bnQgPC0gc3VjYyBpYi5pY19saW5lX2NvdW50O1xuICAgICAgYyB3aXRoXG4gICAgfCBFbmRfb2ZfZmlsZSAtPlxuICAgICAgbGV0IGMgPSBudWxsX2NoYXIgaW5cbiAgICAgIGliLmljX2N1cnJlbnRfY2hhciA8LSBjO1xuICAgICAgaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkIDwtIGZhbHNlO1xuICAgICAgaWIuaWNfZW9mIDwtIHRydWU7XG4gICAgICBjXG5cblxuICBsZXQgcGVla19jaGFyIGliID1cbiAgICBpZiBpYi5pY19jdXJyZW50X2NoYXJfaXNfdmFsaWRcbiAgICB0aGVuIGliLmljX2N1cnJlbnRfY2hhclxuICAgIGVsc2UgbmV4dF9jaGFyIGliXG5cblxuICAoKiBSZXR1cm5zIGEgdmFsaWQgY3VycmVudCBjaGFyIGZvciB0aGUgaW5wdXQgYnVmZmVyLiBJbiBwYXJ0aWN1bGFyXG4gICAgIG5vIGlycmVsZXZhbnQgbnVsbCBjaGFyYWN0ZXIgKGFzIHNldCBieSBbbmV4dF9jaGFyXSBpbiBjYXNlIG9mIGVuZFxuICAgICBvZiBpbnB1dCkgaXMgcmV0dXJuZWQsIHNpbmNlIFtFbmRfb2ZfZmlsZV0gaXMgcmFpc2VkIHdoZW5cbiAgICAgW25leHRfY2hhcl0gc2V0cyB0aGUgZW5kIG9mIGZpbGUgY29uZGl0aW9uIHdoaWxlIHRyeWluZyB0byByZWFkIGFcbiAgICAgbmV3IGNoYXJhY3Rlci4gKilcbiAgbGV0IGNoZWNrZWRfcGVla19jaGFyIGliID1cbiAgICBsZXQgYyA9IHBlZWtfY2hhciBpYiBpblxuICAgIGlmIGliLmljX2VvZiB0aGVuIHJhaXNlIEVuZF9vZl9maWxlO1xuICAgIGNcblxuXG4gIGxldCBlbmRfb2ZfaW5wdXQgaWIgPVxuICAgIGlnbm9yZSAocGVla19jaGFyIGliKTtcbiAgICBpYi5pY19lb2ZcblxuXG4gIGxldCBlb2YgaWIgPSBpYi5pY19lb2ZcblxuICBsZXQgYmVnaW5uaW5nX29mX2lucHV0IGliID0gaWIuaWNfY2hhcl9jb3VudCA9IDBcblxuICBsZXQgbmFtZV9vZl9pbnB1dCBpYiA9XG4gICAgbWF0Y2ggaWIuaWNfaW5wdXRfbmFtZSB3aXRoXG4gICAgfCBGcm9tX2NoYW5uZWwgX2ljIC0+IFwidW5uYW1lZCBTdGRsaWIgaW5wdXQgY2hhbm5lbFwiXG4gICAgfCBGcm9tX2ZpbGUgKGZuYW1lLCBfaWMpIC0+IGZuYW1lXG4gICAgfCBGcm9tX2Z1bmN0aW9uIC0+IFwidW5uYW1lZCBmdW5jdGlvblwiXG4gICAgfCBGcm9tX3N0cmluZyAtPiBcInVubmFtZWQgY2hhcmFjdGVyIHN0cmluZ1wiXG5cblxuICBsZXQgY2hhcl9jb3VudCBpYiA9XG4gICAgaWYgaWIuaWNfY3VycmVudF9jaGFyX2lzX3ZhbGlkXG4gICAgdGhlbiBpYi5pY19jaGFyX2NvdW50IC0gMVxuICAgIGVsc2UgaWIuaWNfY2hhcl9jb3VudFxuXG5cbiAgbGV0IGxpbmVfY291bnQgaWIgPSBpYi5pY19saW5lX2NvdW50XG5cbiAgbGV0IHJlc2V0X3Rva2VuIGliID0gQnVmZmVyLnJlc2V0IGliLmljX3Rva2VuX2J1ZmZlclxuXG4gIGxldCBpbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYiA9IGliLmljX2N1cnJlbnRfY2hhcl9pc192YWxpZCA8LSBmYWxzZVxuXG4gIGxldCB0b2tlbiBpYiA9XG4gICAgbGV0IHRva2VuX2J1ZmZlciA9IGliLmljX3Rva2VuX2J1ZmZlciBpblxuICAgIGxldCB0b2sgPSBCdWZmZXIuY29udGVudHMgdG9rZW5fYnVmZmVyIGluXG4gICAgQnVmZmVyLmNsZWFyIHRva2VuX2J1ZmZlcjtcbiAgICBpYi5pY190b2tlbl9jb3VudCA8LSBzdWNjIGliLmljX3Rva2VuX2NvdW50O1xuICAgIHRva1xuXG5cbiAgbGV0IHRva2VuX2NvdW50IGliID0gaWIuaWNfdG9rZW5fY291bnRcblxuICBsZXQgc2tpcF9jaGFyIHdpZHRoIGliID1cbiAgICBpbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYjtcbiAgICB3aWR0aFxuXG5cbiAgbGV0IGlnbm9yZV9jaGFyIHdpZHRoIGliID0gc2tpcF9jaGFyICh3aWR0aCAtIDEpIGliXG5cbiAgbGV0IHN0b3JlX2NoYXIgd2lkdGggaWIgYyA9XG4gICAgQnVmZmVyLmFkZF9jaGFyIGliLmljX3Rva2VuX2J1ZmZlciBjO1xuICAgIGlnbm9yZV9jaGFyIHdpZHRoIGliXG5cblxuICBsZXQgZGVmYXVsdF90b2tlbl9idWZmZXJfc2l6ZSA9IDEwMjRcblxuICBsZXQgY3JlYXRlIGluYW1lIG5leHQgPSB7XG4gICAgaWNfZW9mID0gZmFsc2U7XG4gICAgaWNfY3VycmVudF9jaGFyID0gbnVsbF9jaGFyO1xuICAgIGljX2N1cnJlbnRfY2hhcl9pc192YWxpZCA9IGZhbHNlO1xuICAgIGljX2NoYXJfY291bnQgPSAwO1xuICAgIGljX2xpbmVfY291bnQgPSAwO1xuICAgIGljX3Rva2VuX2NvdW50ID0gMDtcbiAgICBpY19nZXRfbmV4dF9jaGFyID0gbmV4dDtcbiAgICBpY190b2tlbl9idWZmZXIgPSBCdWZmZXIuY3JlYXRlIGRlZmF1bHRfdG9rZW5fYnVmZmVyX3NpemU7XG4gICAgaWNfaW5wdXRfbmFtZSA9IGluYW1lO1xuICB9XG5cblxuICBsZXQgZnJvbV9zdHJpbmcgcyA9XG4gICAgbGV0IGkgPSByZWYgMCBpblxuICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgICBsZXQgbmV4dCAoKSA9XG4gICAgICBpZiAhaSA+PSBsZW4gdGhlbiByYWlzZSBFbmRfb2ZfZmlsZSBlbHNlXG4gICAgICBsZXQgYyA9IHMuWyFpXSBpblxuICAgICAgaW5jciBpO1xuICAgICAgYyBpblxuICAgIGNyZWF0ZSBGcm9tX3N0cmluZyBuZXh0XG5cblxuICBsZXQgZnJvbV9mdW5jdGlvbiA9IGNyZWF0ZSBGcm9tX2Z1bmN0aW9uXG5cbiAgKCogU2Nhbm5pbmcgZnJvbSBhbiBpbnB1dCBjaGFubmVsLiAqKVxuXG4gICgqIFBvc2l0aW9uIG9mIHRoZSBwcm9ibGVtOlxuXG4gICAgIFdlIGNhbm5vdCBwcmV2ZW50IHRoZSBzY2FubmluZyBtZWNoYW5pc20gdG8gdXNlIG9uZSBsb29rYWhlYWQgY2hhcmFjdGVyLFxuICAgICBpZiBuZWVkZWQgYnkgdGhlIHNlbWFudGljcyBvZiB0aGUgZm9ybWF0IHN0cmluZyBzcGVjaWZpY2F0aW9ucyAoZS5nLiBhXG4gICAgIHRyYWlsaW5nICdza2lwIHNwYWNlJyBzcGVjaWZpY2F0aW9uIGluIHRoZSBmb3JtYXQgc3RyaW5nKTsgaW4gdGhpcyBjYXNlLFxuICAgICB0aGUgbWFuZGF0b3J5IGxvb2thaGVhZCBjaGFyYWN0ZXIgaXMgaW5kZWVkIHJlYWQgZnJvbSB0aGUgaW5wdXQgYW5kIG5vdFxuICAgICB1c2VkIHRvIHJldHVybiB0aGUgdG9rZW4gcmVhZC4gSXQgaXMgdGh1cyBtYW5kYXRvcnkgdG8gYmUgYWJsZSB0byBzdG9yZVxuICAgICBhbiB1bnVzZWQgbG9va2FoZWFkIGNoYXJhY3RlciBzb21ld2hlcmUgdG8gZ2V0IGl0IGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAgICAgb2YgdGhlIG5leHQgc2Nhbi5cblxuICAgICBUbyBjaXJjdW12ZW50IHRoaXMgcHJvYmxlbSwgYWxsIHRoZSBzY2FubmluZyBmdW5jdGlvbnMgZ2V0IGEgbG93IGxldmVsXG4gICAgIGlucHV0IGJ1ZmZlciBhcmd1bWVudCB3aGVyZSB0aGV5IHN0b3JlIHRoZSBsb29rYWhlYWQgY2hhcmFjdGVyIHdoZW5cbiAgICAgbmVlZGVkOyBhZGRpdGlvbmFsbHksIHRoZSBpbnB1dCBidWZmZXIgaXMgdGhlIG9ubHkgc291cmNlIG9mIGNoYXJhY3RlciBvZlxuICAgICBhIHNjYW5uZXIuIFRoZSBbc2NhbmJ1Zl0gaW5wdXQgYnVmZmVycyBhcmUgZGVmaW5lZCBpbiBtb2R1bGUgeyFTY2FubmluZ30uXG5cbiAgICAgTm93IHdlIHVuZGVyc3RhbmQgdGhhdCBpdCBpcyBleHRyZW1lbHkgaW1wb3J0YW50IHRoYXQgcmVsYXRlZCBhbmRcbiAgICAgc3VjY2Vzc2l2ZSBjYWxscyB0byBzY2FubmVycyBpbmRlZWQgcmVhZCBmcm9tIHRoZSBzYW1lIGlucHV0IGJ1ZmZlci5cbiAgICAgSW4gZWZmZWN0LCBpZiBhIHNjYW5uZXIgW3NjYW4xXSBpcyByZWFkaW5nIGZyb20gW2liMV0gYW5kIHN0b3JlcyBhblxuICAgICB1bnVzZWQgbG9va2FoZWFkIGNoYXJhY3RlciBbYzFdIGludG8gaXRzIGlucHV0IGJ1ZmZlciBbaWIxXSwgdGhlblxuICAgICBhbm90aGVyIHNjYW5uZXIgW3NjYW4yXSBub3QgcmVhZGluZyBmcm9tIHRoZSBzYW1lIGJ1ZmZlciBbaWIxXSB3aWxsIG1pc3NcbiAgICAgdGhlIGNoYXJhY3RlciBbYzFdLCBzZWVtaW5nbHkgdmFuaXNoZWQgaW4gdGhlIGFpciBmcm9tIHRoZSBwb2ludCBvZiB2aWV3XG4gICAgIG9mIFtzY2FuMl0uXG5cbiAgICAgVGhpcyBtZWNoYW5pc20gd29ya3MgcGVyZmVjdGx5IHRvIHJlYWQgZnJvbSBzdHJpbmdzLCBmcm9tIGZpbGVzLCBhbmQgZnJvbVxuICAgICBmdW5jdGlvbnMsIHNpbmNlIGluIHRob3NlIGNhc2VzLCBhbGxvY2F0aW5nIHR3byBidWZmZXJzIHJlYWRpbmcgZnJvbSB0aGVcbiAgICAgc2FtZSBzb3VyY2UgaXMgdW5uYXR1cmFsLlxuXG4gICAgIFN0aWxsLCB0aGVyZSBpcyBhIGRpZmZpY3VsdHkgaW4gdGhlIGNhc2Ugb2Ygc2Nhbm5pbmcgZnJvbSBhbiBpbnB1dFxuICAgICBjaGFubmVsLiBJbiBlZmZlY3QsIHdoZW4gc2Nhbm5pbmcgZnJvbSBhbiBpbnB1dCBjaGFubmVsIFtpY10sIHRoaXMgY2hhbm5lbFxuICAgICBtYXkgbm90IGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB3aXRoaW4gdGhpcyBsaWJyYXJ5LiBIZW5jZSwgaXQgbWF5IGJlXG4gICAgIHNoYXJlZCAodHdvIGZ1bmN0aW9ucyBvZiB0aGUgdXNlcidzIHByb2dyYW0gbWF5IHN1Y2Nlc3NpdmVseSByZWFkIGZyb21cbiAgICAgW2ljXSkuIFRoaXMgaXMgaGlnaGx5IGVycm9yIHByb25lIHNpbmNlLCBvbmUgb2YgdGhlIGZ1bmN0aW9uIG1heSBzZWVrIHRoZVxuICAgICBpbnB1dCBjaGFubmVsLCB3aGlsZSB0aGUgb3RoZXIgZnVuY3Rpb24gaGFzIHN0aWxsIGFuIHVudXNlZCBsb29rYWhlYWRcbiAgICAgY2hhcmFjdGVyIGluIGl0cyBpbnB1dCBidWZmZXIuIEluIGNvbmNsdXNpb24sIHlvdSBzaG91bGQgbmV2ZXIgbWl4IGRpcmVjdFxuICAgICBsb3cgbGV2ZWwgcmVhZGluZyBhbmQgaGlnaCBsZXZlbCBzY2FubmluZyBmcm9tIHRoZSBzYW1lIGlucHV0IGNoYW5uZWwuXG5cbiAgKilcblxuICAoKiBQZXJmb3JtIGJ1ZmZlcml6ZWQgaW5wdXQgdG8gaW1wcm92ZSBlZmZpY2llbmN5LiAqKVxuICBsZXQgZmlsZV9idWZmZXJfc2l6ZSA9IHJlZiAxMDI0XG5cbiAgKCogVGhlIHNjYW5uZXIgY2xvc2VzIHRoZSBpbnB1dCBjaGFubmVsIGF0IGVuZCBvZiBpbnB1dC4gKilcbiAgbGV0IHNjYW5fY2xvc2VfYXRfZW5kIGljID0gU3RkbGliLmNsb3NlX2luIGljOyByYWlzZSBFbmRfb2ZfZmlsZVxuXG4gICgqIFRoZSBzY2FubmVyIGRvZXMgbm90IGNsb3NlIHRoZSBpbnB1dCBjaGFubmVsIGF0IGVuZCBvZiBpbnB1dDpcbiAgICAgaXQganVzdCByYWlzZXMgW0VuZF9vZl9maWxlXS4gKilcbiAgbGV0IHNjYW5fcmFpc2VfYXRfZW5kIF9pYyA9IHJhaXNlIEVuZF9vZl9maWxlXG5cbiAgbGV0IGZyb21faWMgc2Nhbl9jbG9zZV9pYyBpbmFtZSBpYyA9XG4gICAgbGV0IGxlbiA9ICFmaWxlX2J1ZmZlcl9zaXplIGluXG4gICAgbGV0IGJ1ZiA9IEJ5dGVzLmNyZWF0ZSBsZW4gaW5cbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgbGV0IGxpbSA9IHJlZiAwIGluXG4gICAgbGV0IGVvZiA9IHJlZiBmYWxzZSBpblxuICAgIGxldCBuZXh0ICgpID1cbiAgICAgIGlmICFpIDwgIWxpbSB0aGVuIGJlZ2luIGxldCBjID0gQnl0ZXMuZ2V0IGJ1ZiAhaSBpbiBpbmNyIGk7IGMgZW5kIGVsc2VcbiAgICAgIGlmICFlb2YgdGhlbiByYWlzZSBFbmRfb2ZfZmlsZSBlbHNlIGJlZ2luXG4gICAgICAgIGxpbSA6PSBpbnB1dCBpYyBidWYgMCBsZW47XG4gICAgICAgIGlmICFsaW0gPSAwIHRoZW4gYmVnaW4gZW9mIDo9IHRydWU7IHNjYW5fY2xvc2VfaWMgaWMgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgICBpIDo9IDE7XG4gICAgICAgICAgQnl0ZXMuZ2V0IGJ1ZiAwXG4gICAgICAgIGVuZFxuICAgICAgZW5kIGluXG4gICAgY3JlYXRlIGluYW1lIG5leHRcblxuXG4gIGxldCBmcm9tX2ljX2Nsb3NlX2F0X2VuZCA9IGZyb21faWMgc2Nhbl9jbG9zZV9hdF9lbmRcbiAgbGV0IGZyb21faWNfcmFpc2VfYXRfZW5kID0gZnJvbV9pYyBzY2FuX3JhaXNlX2F0X2VuZFxuXG4gICgqIFRoZSBzY2FubmluZyBidWZmZXIgcmVhZGluZyBmcm9tIFtTdGRsaWIuc3RkaW5dLlxuICAgICBPbmUgY291bGQgdHJ5IHRvIGRlZmluZSBbc3RkaW5dIGFzIGEgc2Nhbm5pbmcgYnVmZmVyIHJlYWRpbmcgYSBjaGFyYWN0ZXJcbiAgICAgYXQgYSB0aW1lIChubyBidWZmZXJpemF0aW9uIGF0IGFsbCksIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZSB0b3AtbGV2ZWxcbiAgICAgaW50ZXJhY3Rpb24gd291bGQgYmUgd3JvbmcuIFRoaXMgaXMgZHVlIHRvIHNvbWUga2luZCBvZlxuICAgICAncmFjZSBjb25kaXRpb24nIHdoZW4gcmVhZGluZyBmcm9tIFtTdGRsaWIuc3RkaW5dLFxuICAgICBzaW5jZSB0aGUgaW50ZXJhY3RpdmUgY29tcGlsZXIgYW5kIFtTY2FuZi5zY2FuZl0gd2lsbCBzaW11bHRhbmVvdXNseVxuICAgICByZWFkIHRoZSBtYXRlcmlhbCB0aGV5IG5lZWQgZnJvbSBbU3RkbGliLnN0ZGluXTsgdGhlbiwgY29uZnVzaW9uXG4gICAgIHdpbGwgcmVzdWx0IGZyb20gd2hhdCBzaG91bGQgYmUgcmVhZCBieSB0aGUgdG9wLWxldmVsIGFuZCB3aGF0IHNob3VsZCBiZVxuICAgICByZWFkIGJ5IFtTY2FuZi5zY2FuZl0uXG4gICAgIFRoaXMgaXMgZXZlbiBtb3JlIGNvbXBsaWNhdGVkIGJ5IHRoZSBvbmUgY2hhcmFjdGVyIGxvb2thaGVhZCB0aGF0XG4gICAgIFtTY2FuZi5zY2FuZl0gaXMgc29tZXRpbWVzIG9ibGlnZWQgdG8gbWFpbnRhaW46IHRoZSBsb29rYWhlYWQgY2hhcmFjdGVyXG4gICAgIHdpbGwgYmUgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBbU2NhbmYuc2NhbmZdIGVudHJ5LCBzZWVtaW5nbHkgY29taW5nIGZyb21cbiAgICAgbm93aGVyZS5cbiAgICAgQWxzbyBubyBbRW5kX29mX2ZpbGVdIGlzIHJhaXNlZCB3aGVuIHJlYWRpbmcgZnJvbSBzdGRpbjogaWYgbm90IGVub3VnaFxuICAgICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiByZWFkLCB3ZSBzaW1wbHkgYXNrIHRvIHJlYWQgbW9yZS4gKilcbiAgbGV0IHN0ZGluID1cbiAgICBmcm9tX2ljIHNjYW5fcmFpc2VfYXRfZW5kXG4gICAgICAoRnJvbV9maWxlIChcIi1cIiwgU3RkbGliLnN0ZGluKSkgU3RkbGliLnN0ZGluXG5cbiAgbGV0IG9wZW5faW5fZmlsZSBvcGVuX2luIGZuYW1lID1cbiAgICBtYXRjaCBmbmFtZSB3aXRoXG4gICAgfCBcIi1cIiAtPiBzdGRpblxuICAgIHwgZm5hbWUgLT5cbiAgICAgIGxldCBpYyA9IG9wZW5faW4gZm5hbWUgaW5cbiAgICAgIGZyb21faWNfY2xvc2VfYXRfZW5kIChGcm9tX2ZpbGUgKGZuYW1lLCBpYykpIGljXG5cblxuICBsZXQgb3Blbl9pbiA9IG9wZW5faW5fZmlsZSBTdGRsaWIub3Blbl9pblxuICBsZXQgb3Blbl9pbl9iaW4gPSBvcGVuX2luX2ZpbGUgU3RkbGliLm9wZW5faW5fYmluXG5cbiAgbGV0IGZyb21fZmlsZSA9IG9wZW5faW5cbiAgbGV0IGZyb21fZmlsZV9iaW4gPSBvcGVuX2luX2JpblxuXG4gIGxldCBmcm9tX2NoYW5uZWwgaWMgPVxuICAgIGZyb21faWNfcmFpc2VfYXRfZW5kIChGcm9tX2NoYW5uZWwgaWMpIGljXG5cblxuICBsZXQgY2xvc2VfaW4gaWIgPVxuICAgIG1hdGNoIGliLmljX2lucHV0X25hbWUgd2l0aFxuICAgIHwgRnJvbV9jaGFubmVsIGljIC0+XG4gICAgICBTdGRsaWIuY2xvc2VfaW4gaWNcbiAgICB8IEZyb21fZmlsZSAoX2ZuYW1lLCBpYykgLT4gU3RkbGliLmNsb3NlX2luIGljXG4gICAgfCBGcm9tX2Z1bmN0aW9uIHwgRnJvbV9zdHJpbmcgLT4gKClcblxuZW5kXG5cblxuKCogRm9ybWF0dGVkIGlucHV0IGZ1bmN0aW9ucy4gKilcblxudHlwZSAoJ2EsICdiLCAnYywgJ2QpIHNjYW5uZXIgPVxuICAgICAoJ2EsIFNjYW5uaW5nLmluX2NoYW5uZWwsICdiLCAnYywgJ2EgLT4gJ2QsICdkKSBmb3JtYXQ2IC0+ICdjXG5cbnR5cGUgKCdhLCAnYiwgJ2MsICdkKSBzY2FubmVyX29wdCA9XG4gICAgICgnYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgJ2IsICdjLCAnYSAtPiAnZCBvcHRpb24sICdkKSBmb3JtYXQ2IC0+ICdjXG5cbigqIFJlcG9ydGluZyBlcnJvcnMuICopXG5leGNlcHRpb24gU2Nhbl9mYWlsdXJlIG9mIHN0cmluZ1xuXG5sZXQgYmFkX2lucHV0IHMgPSByYWlzZSAoU2Nhbl9mYWlsdXJlIHMpXG5cbmxldCBiYWRfaW5wdXRfZXNjYXBlIGMgPVxuICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiaWxsZWdhbCBlc2NhcGUgY2hhcmFjdGVyICVDXCIgYylcblxuXG5sZXQgYmFkX3Rva2VuX2xlbmd0aCBtZXNzYWdlID1cbiAgYmFkX2lucHV0XG4gICAgKFByaW50Zi5zcHJpbnRmXG4gICAgICAgXCJzY2FubmluZyBvZiAlcyBmYWlsZWQ6IFxcXG4gICAgICAgIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIHdhcyB0b28gc2hvcnQgZm9yIHRva2VuXCJcbiAgICAgICBtZXNzYWdlKVxuXG5cbmxldCBiYWRfZW5kX29mX2lucHV0IG1lc3NhZ2UgPVxuICBiYWRfaW5wdXRcbiAgICAoUHJpbnRmLnNwcmludGZcbiAgICAgICBcInNjYW5uaW5nIG9mICVzIGZhaWxlZDogXFxcbiAgICAgICAgcHJlbWF0dXJlIGVuZCBvZiBmaWxlIG9jY3VycmVkIGJlZm9yZSBlbmQgb2YgdG9rZW5cIlxuICAgICAgIG1lc3NhZ2UpXG5cblxubGV0IGJhZF9mbG9hdCAoKSA9XG4gIGJhZF9pbnB1dCBcIm5vIGRvdCBvciBleHBvbmVudCBwYXJ0IGZvdW5kIGluIGZsb2F0IHRva2VuXCJcblxuXG5sZXQgYmFkX2hleF9mbG9hdCAoKSA9XG4gIGJhZF9pbnB1dCBcIm5vdCBhIHZhbGlkIGZsb2F0IGluIGhleGFkZWNpbWFsIG5vdGF0aW9uXCJcblxuXG5sZXQgY2hhcmFjdGVyX21pc21hdGNoX2VyciBjIGNpID1cbiAgUHJpbnRmLnNwcmludGYgXCJsb29raW5nIGZvciAlQywgZm91bmQgJUNcIiBjIGNpXG5cblxubGV0IGNoYXJhY3Rlcl9taXNtYXRjaCBjIGNpID1cbiAgYmFkX2lucHV0IChjaGFyYWN0ZXJfbWlzbWF0Y2hfZXJyIGMgY2kpXG5cblxubGV0IHJlYyBza2lwX3doaXRlcyBpYiA9XG4gIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gIGlmIG5vdCAoU2Nhbm5pbmcuZW9mIGliKSB0aGVuIGJlZ2luXG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCAnICcgfCAnXFx0JyB8ICdcXG4nIHwgJ1xccicgLT5cbiAgICAgIFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliOyBza2lwX3doaXRlcyBpYlxuICAgIHwgXyAtPiAoKVxuICBlbmRcblxuXG4oKiBDaGVja2luZyB0aGF0IFtjXSBpcyBpbmRlZWQgaW4gdGhlIGlucHV0LCB0aGVuIHNraXBzIGl0LlxuICAgSW4gdGhpcyBjYXNlLCB0aGUgY2hhcmFjdGVyIFtjXSBoYXMgYmVlbiBleHBsaWNpdGx5IHNwZWNpZmllZCBpbiB0aGVcbiAgIGZvcm1hdCBhcyBiZWluZyBtYW5kYXRvcnkgaW4gdGhlIGlucHV0OyBoZW5jZSB3ZSBzaG91bGQgZmFpbCB3aXRoXG4gICBbRW5kX29mX2ZpbGVdIGluIGNhc2Ugb2YgZW5kX29mX2lucHV0LlxuICAgKFJlbWVtYmVyIHRoYXQgW1NjYW5fZmFpbHVyZV0gaXMgcmFpc2VkIG9ubHkgd2hlbiAod2UgY2FuIHByb3ZlIGJ5XG4gICBldmlkZW5jZSkgdGhhdCB0aGUgaW5wdXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4uIFdlIG11c3RcbiAgIHRodXMgZGlmZmVyZW50aWF0ZSBbRW5kX29mX2ZpbGVdIGFzIGFuIGVycm9yIGR1ZSB0byBsYWNrIG9mIGlucHV0LCBhbmRcbiAgIFtTY2FuX2ZhaWx1cmVdIHdoaWNoIGlzIGR1ZSB0byBwcm92YWJseSB3cm9uZyBpbnB1dC4gSSBhbSBub3Qgc3VyZSB0aGlzIGlzXG4gICB3b3J0aCB0aGUgYnVyZGVuOiBpdCBpcyBjb21wbGV4IGFuZCBzb21laG93IHN1YmxpbWluYWw7IHNob3VsZCBiZSBjbGVhcmVyXG4gICB0byBmYWlsIHdpdGggU2Nhbl9mYWlsdXJlIFwiTm90IGVub3VnaCBpbnB1dCB0byBjb21wbGV0ZSBzY2FubmluZ1wiISlcblxuICAgVGhhdCdzIHdoeSwgd2FpdGluZyBmb3IgYSBiZXR0ZXIgc29sdXRpb24sIHdlIHVzZSBjaGVja2VkX3BlZWtfY2hhciBoZXJlLlxuICAgV2UgYXJlIGFsc28gY2FyZWZ1bCB0byB0cmVhdCBcIlxcclxcblwiIGluIHRoZSBpbnB1dCBhcyBhbiBlbmQgb2YgbGluZSBtYXJrZXI6XG4gICBpdCBhbHdheXMgbWF0Y2hlcyBhICdcXG4nIHNwZWNpZmljYXRpb24gaW4gdGhlIGlucHV0IGZvcm1hdCBzdHJpbmcuICopXG5sZXQgcmVjIGNoZWNrX2NoYXIgaWIgYyA9XG4gIG1hdGNoIGMgd2l0aFxuICB8ICcgJyAtPiBza2lwX3doaXRlcyBpYlxuICB8ICdcXG4nIC0+IGNoZWNrX25ld2xpbmUgaWJcbiAgfCBjIC0+IGNoZWNrX3RoaXNfY2hhciBpYiBjXG5cbmFuZCBjaGVja190aGlzX2NoYXIgaWIgYyA9XG4gIGxldCBjaSA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIGlmIGNpID0gYyB0aGVuIFNjYW5uaW5nLmludmFsaWRhdGVfY3VycmVudF9jaGFyIGliIGVsc2VcbiAgY2hhcmFjdGVyX21pc21hdGNoIGMgY2lcblxuYW5kIGNoZWNrX25ld2xpbmUgaWIgPVxuICBsZXQgY2kgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBtYXRjaCBjaSB3aXRoXG4gIHwgJ1xcbicgLT4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWJcbiAgfCAnXFxyJyAtPiBTY2FubmluZy5pbnZhbGlkYXRlX2N1cnJlbnRfY2hhciBpYjsgY2hlY2tfdGhpc19jaGFyIGliICdcXG4nXG4gIHwgXyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcbicgY2lcblxuXG4oKiBFeHRyYWN0aW5nIHRva2VucyBmcm9tIHRoZSBvdXRwdXQgdG9rZW4gYnVmZmVyLiAqKVxuXG5sZXQgdG9rZW5fY2hhciBpYiA9IChTY2FubmluZy50b2tlbiBpYikuWzBdXG5cbmxldCB0b2tlbl9zdHJpbmcgPSBTY2FubmluZy50b2tlblxuXG5sZXQgdG9rZW5fYm9vbCBpYiA9XG4gIG1hdGNoIFNjYW5uaW5nLnRva2VuIGliIHdpdGhcbiAgfCBcInRydWVcIiAtPiB0cnVlXG4gIHwgXCJmYWxzZVwiIC0+IGZhbHNlXG4gIHwgcyAtPiBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiaW52YWxpZCBib29sZWFuICclcydcIiBzKVxuXG5cbigqIFRoZSB0eXBlIG9mIGludGVnZXIgY29udmVyc2lvbnMuICopXG50eXBlIGludGVnZXJfY29udmVyc2lvbiA9XG4gIHwgQl9jb252ZXJzaW9uICgqIFVuc2lnbmVkIGJpbmFyeSBjb252ZXJzaW9uICopXG4gIHwgRF9jb252ZXJzaW9uICgqIFNpZ25lZCBkZWNpbWFsIGNvbnZlcnNpb24gKilcbiAgfCBJX2NvbnZlcnNpb24gKCogU2lnbmVkIGludGVnZXIgY29udmVyc2lvbiAqKVxuICB8IE9fY29udmVyc2lvbiAoKiBVbnNpZ25lZCBvY3RhbCBjb252ZXJzaW9uICopXG4gIHwgVV9jb252ZXJzaW9uICgqIFVuc2lnbmVkIGRlY2ltYWwgY29udmVyc2lvbiAqKVxuICB8IFhfY29udmVyc2lvbiAoKiBVbnNpZ25lZCBoZXhhZGVjaW1hbCBjb252ZXJzaW9uICopXG5cblxubGV0IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyID0gZnVuY3Rpb25cbiAgfCAnYicgLT4gQl9jb252ZXJzaW9uXG4gIHwgJ2QnIC0+IERfY29udmVyc2lvblxuICB8ICdpJyAtPiBJX2NvbnZlcnNpb25cbiAgfCAnbycgLT4gT19jb252ZXJzaW9uXG4gIHwgJ3UnIC0+IFVfY29udmVyc2lvblxuICB8ICd4JyB8ICdYJyAtPiBYX2NvbnZlcnNpb25cbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuXG5cbigqIEV4dHJhY3QgYW4gaW50ZWdlciBsaXRlcmFsIHRva2VuLlxuICAgU2luY2UgdGhlIGZ1bmN0aW9ucyBTdGRsaWIuKmludCpfb2Zfc3RyaW5nIGRvIG5vdCBhY2NlcHQgYSBsZWFkaW5nICssXG4gICB3ZSBza2lwIGl0IGlmIG5lY2Vzc2FyeS4gKilcbmxldCB0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliID1cbiAgbGV0IHRvayA9XG4gICAgbWF0Y2ggY29udiB3aXRoXG4gICAgfCBEX2NvbnZlcnNpb24gfCBJX2NvbnZlcnNpb24gLT4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IFVfY29udmVyc2lvbiAtPiBcIjB1XCIgXiBTY2FubmluZy50b2tlbiBpYlxuICAgIHwgT19jb252ZXJzaW9uIC0+IFwiMG9cIiBeIFNjYW5uaW5nLnRva2VuIGliXG4gICAgfCBYX2NvbnZlcnNpb24gLT4gXCIweFwiIF4gU2Nhbm5pbmcudG9rZW4gaWJcbiAgICB8IEJfY29udmVyc2lvbiAtPiBcIjBiXCIgXiBTY2FubmluZy50b2tlbiBpYiBpblxuICBsZXQgbCA9IFN0cmluZy5sZW5ndGggdG9rIGluXG4gIGlmIGwgPSAwIHx8IHRvay5bMF0gPD4gJysnIHRoZW4gdG9rIGVsc2UgU3RyaW5nLnN1YiB0b2sgMSAobCAtIDEpXG5cblxuKCogQWxsIHRoZSBmdW5jdGlvbnMgdGhhdCBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgbnVtYmVyIHJhaXNlIHRoZSBleGNlcHRpb25cbiAgIEZhaWx1cmUgd2hlbiB0aGUgY29udmVyc2lvbiBpcyBub3QgcG9zc2libGUuXG4gICBUaGlzIGV4Y2VwdGlvbiBpcyB0aGVuIHRyYXBwZWQgaW4gW2tzY2FuZl0uICopXG5sZXQgdG9rZW5faW50IGNvbnYgaWIgPSBpbnRfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxuXG5sZXQgdG9rZW5fZmxvYXQgaWIgPSBmbG9hdF9vZl9zdHJpbmcgKFNjYW5uaW5nLnRva2VuIGliKVxuXG4oKiBUbyBzY2FuIG5hdGl2ZSBpbnRzLCBpbnQzMiBhbmQgaW50NjQgaW50ZWdlcnMuXG4gICBXZSBjYW5ub3QgYWNjZXNzIHRvIGNvbnZlcnNpb25zIHRvL2Zyb20gc3RyaW5ncyBmb3IgdGhvc2UgdHlwZXMsXG4gICBOYXRpdmVpbnQub2Zfc3RyaW5nLCBJbnQzMi5vZl9zdHJpbmcsIGFuZCBJbnQ2NC5vZl9zdHJpbmcsXG4gICBzaW5jZSB0aG9zZSBtb2R1bGVzIGFyZSBub3QgYXZhaWxhYmxlIHRvIFtTY2FuZl0uXG4gICBIb3dldmVyLCB3ZSBjYW4gYmluZCBhbmQgdXNlIHRoZSBjb3JyZXNwb25kaW5nIHByaW1pdGl2ZXMgdGhhdCBhcmVcbiAgIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZS4gKilcbmV4dGVybmFsIG5hdGl2ZWludF9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gbmF0aXZlaW50XG4gID0gXCJjYW1sX25hdGl2ZWludF9vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCBpbnQzMl9vZl9zdHJpbmcgOiBzdHJpbmcgLT4gaW50MzJcbiAgPSBcImNhbWxfaW50MzJfb2Zfc3RyaW5nXCJcblxuZXh0ZXJuYWwgaW50NjRfb2Zfc3RyaW5nIDogc3RyaW5nIC0+IGludDY0XG4gID0gXCJjYW1sX2ludDY0X29mX3N0cmluZ1wiXG5cblxubGV0IHRva2VuX25hdGl2ZWludCBjb252IGliID0gbmF0aXZlaW50X29mX3N0cmluZyAodG9rZW5faW50X2xpdGVyYWwgY29udiBpYilcbmxldCB0b2tlbl9pbnQzMiBjb252IGliID0gaW50MzJfb2Zfc3RyaW5nICh0b2tlbl9pbnRfbGl0ZXJhbCBjb252IGliKVxubGV0IHRva2VuX2ludDY0IGNvbnYgaWIgPSBpbnQ2NF9vZl9zdHJpbmcgKHRva2VuX2ludF9saXRlcmFsIGNvbnYgaWIpXG5cbigqIFNjYW5uaW5nIG51bWJlcnMuICopXG5cbigqIERpZ2l0cyBzY2FubmluZyBmdW5jdGlvbnMgc3VwcG9zZSB0aGF0IG9uZSBjaGFyYWN0ZXIgaGFzIGJlZW4gY2hlY2tlZCBhbmRcbiAgIGlzIGF2YWlsYWJsZSwgc2luY2UgdGhleSByZXR1cm4gYXQgZW5kIG9mIGZpbGUgd2l0aCB0aGUgY3VycmVudGx5IGZvdW5kXG4gICB0b2tlbiBzZWxlY3RlZC5cblxuICAgUHV0IGl0IGluIGFub3RoZXIgd2F5LCB0aGUgZGlnaXRzIHNjYW5uaW5nIGZ1bmN0aW9ucyBzY2FuIGZvciBhIHBvc3NpYmx5XG4gICBlbXB0eSBzZXF1ZW5jZSBvZiBkaWdpdHMsIChoZW5jZSwgYSBzdWNjZXNzZnVsIHNjYW5uaW5nIGZyb20gb25lIG9mIHRob3NlXG4gICBmdW5jdGlvbnMgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUgdG9rZW4gaXMgYSB3ZWxsLWZvcm1lZCBudW1iZXI6IHRvIGdldCBhXG4gICB0cnVlIG51bWJlciwgaXQgaXMgbWFuZGF0b3J5IHRvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIHZhbGlkIGRpZ2l0IGlzXG4gICBhdmFpbGFibGUgYmVmb3JlIGNhbGxpbmcgb25lIG9mIHRoZSBkaWdpdCBzY2FubmluZyBmdW5jdGlvbnMpLiAqKVxuXG4oKiBUaGUgZGVjaW1hbCBjYXNlIGlzIHRyZWF0ZWQgZXNwZWNpYWxseSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzLiAqKVxubGV0IHJlYyBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuICB8ICdfJyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliIGluXG4gICAgc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWJcbiAgfCBfIC0+IHdpZHRoXG5cblxubGV0IHNjYW5fZGVjaW1hbF9kaWdpdF9wbHVzIHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBcImRlY2ltYWwgZGlnaXRzXCIgZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcwJyAuLiAnOScgLT5cbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuICB8IGMgLT5cbiAgICBiYWRfaW5wdXQgKFByaW50Zi5zcHJpbnRmIFwiY2hhcmFjdGVyICVDIGlzIG5vdCBhIGRlY2ltYWwgZGlnaXRcIiBjKVxuXG5cbigqIFRvIHNjYW4gbnVtYmVycyBmcm9tIG90aGVyIGJhc2VzLCB3ZSB1c2UgYSBwcmVkaWNhdGUgYXJndW1lbnQgdG9cbiAgIHNjYW4gZGlnaXRzLiAqKVxubGV0IHNjYW5fZGlnaXRfc3RhciBkaWdpdHAgd2lkdGggaWIgPVxuICBsZXQgcmVjIHNjYW5fZGlnaXRzIHdpZHRoIGliID1cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCBlbHNlXG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgbWF0Y2ggYyB3aXRoXG4gICAgfCBjIHdoZW4gZGlnaXRwIGMgLT5cbiAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgc2Nhbl9kaWdpdHMgd2lkdGggaWJcbiAgICB8ICdfJyAtPlxuICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIgaW5cbiAgICAgIHNjYW5fZGlnaXRzIHdpZHRoIGliXG4gICAgfCBfIC0+IHdpZHRoIGluXG4gIHNjYW5fZGlnaXRzIHdpZHRoIGliXG5cblxubGV0IHNjYW5fZGlnaXRfcGx1cyBiYXNpcyBkaWdpdHAgd2lkdGggaWIgPVxuICAoKiBFbnN1cmUgd2UgaGF2ZSBnb3QgZW5vdWdoIHdpZHRoIGxlZnQsXG4gICAgIGFuZCByZWFkIGF0IGxlYXN0IG9uZSBkaWdpdC4gKilcbiAgaWYgd2lkdGggPSAwIHRoZW4gYmFkX3Rva2VuX2xlbmd0aCBcImRpZ2l0c1wiIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiBpblxuICBpZiBkaWdpdHAgYyB0aGVuXG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgc2Nhbl9kaWdpdF9zdGFyIGRpZ2l0cCB3aWR0aCBpYlxuICBlbHNlXG4gICAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcImNoYXJhY3RlciAlQyBpcyBub3QgYSB2YWxpZCAlcyBkaWdpdFwiIGMgYmFzaXMpXG5cblxubGV0IGlzX2JpbmFyeV9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICcxJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuXG5cbmxldCBzY2FuX2JpbmFyeV9pbnQgPSBzY2FuX2RpZ2l0X3BsdXMgXCJiaW5hcnlcIiBpc19iaW5hcnlfZGlnaXRcblxubGV0IGlzX29jdGFsX2RpZ2l0ID0gZnVuY3Rpb25cbiAgfCAnMCcgLi4gJzcnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxubGV0IHNjYW5fb2N0YWxfaW50ID0gc2Nhbl9kaWdpdF9wbHVzIFwib2N0YWxcIiBpc19vY3RhbF9kaWdpdFxuXG5sZXQgaXNfaGV4YV9kaWdpdCA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG5cblxubGV0IHNjYW5faGV4YWRlY2ltYWxfaW50ID0gc2Nhbl9kaWdpdF9wbHVzIFwiaGV4YWRlY2ltYWxcIiBpc19oZXhhX2RpZ2l0XG5cbigqIFNjYW4gYSBkZWNpbWFsIGludGVnZXIuICopXG5sZXQgc2Nhbl91bnNpZ25lZF9kZWNpbWFsX2ludCA9IHNjYW5fZGVjaW1hbF9kaWdpdF9wbHVzXG5cbmxldCBzY2FuX3NpZ24gd2lkdGggaWIgPVxuICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcrJyAtPiBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGNcbiAgfCAnLScgLT4gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjXG4gIHwgXyAtPiB3aWR0aFxuXG5cbmxldCBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIHNjYW5fdW5zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcblxuXG4oKiBTY2FuIGFuIHVuc2lnbmVkIGludGVnZXIgdGhhdCBjb3VsZCBiZSBnaXZlbiBpbiBhbnkgKGNvbW1vbikgYmFzaXMuXG4gICBJZiBkaWdpdHMgYXJlIHByZWZpeGVkIGJ5IG9uZSBvZiAweCwgMFgsIDBvLCBvciAwYiwgdGhlIG51bWJlciBpc1xuICAgYXNzdW1lZCB0byBiZSB3cml0dGVuIHJlc3BlY3RpdmVseSBpbiBoZXhhZGVjaW1hbCwgaGV4YWRlY2ltYWwsXG4gICBvY3RhbCwgb3IgYmluYXJ5LiAqKVxubGV0IHNjYW5fdW5zaWduZWRfaW50IHdpZHRoIGliID1cbiAgbWF0Y2ggU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgd2l0aFxuICB8ICcwJyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICAgIGJlZ2luIG1hdGNoIGMgd2l0aFxuICAgIHwgJ3gnIHwgJ1gnIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGliXG4gICAgfCAnbycgLT4gc2Nhbl9vY3RhbF9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgICB8ICdiJyAtPiBzY2FuX2JpbmFyeV9pbnQgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYykgaWJcbiAgICB8IF8gLT4gc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWIgZW5kXG4gIHwgXyAtPiBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG5cblxubGV0IHNjYW5fb3B0aW9uYWxseV9zaWduZWRfaW50IHdpZHRoIGliID1cbiAgbGV0IHdpZHRoID0gc2Nhbl9zaWduIHdpZHRoIGliIGluXG4gIHNjYW5fdW5zaWduZWRfaW50IHdpZHRoIGliXG5cblxubGV0IHNjYW5faW50X2NvbnZlcnNpb24gY29udiB3aWR0aCBpYiA9XG4gIG1hdGNoIGNvbnYgd2l0aFxuICB8IEJfY29udmVyc2lvbiAtPiBzY2FuX2JpbmFyeV9pbnQgd2lkdGggaWJcbiAgfCBEX2NvbnZlcnNpb24gLT4gc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCB3aWR0aCBpYlxuICB8IElfY29udmVyc2lvbiAtPiBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2ludCB3aWR0aCBpYlxuICB8IE9fY29udmVyc2lvbiAtPiBzY2FuX29jdGFsX2ludCB3aWR0aCBpYlxuICB8IFVfY29udmVyc2lvbiAtPiBzY2FuX3Vuc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gIHwgWF9jb252ZXJzaW9uIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IHdpZHRoIGliXG5cblxuKCogU2Nhbm5pbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKilcblxuKCogRnJhY3Rpb25hbCBwYXJ0IGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVkdWNlZCB0byAwIGRpZ2l0cy4gKilcbmxldCBzY2FuX2ZyYWN0aW9uYWxfcGFydCB3aWR0aCBpYiA9XG4gIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGggZWxzZVxuICBtYXRjaCBjIHdpdGhcbiAgfCAnMCcgLi4gJzknIGFzIGMgLT5cbiAgICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICB8IF8gLT4gd2lkdGhcblxuXG4oKiBFeHAgcGFydCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlZHVjZWQgdG8gMCBkaWdpdHMuICopXG5sZXQgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliID1cbiAgaWYgd2lkdGggPSAwIHRoZW4gd2lkdGggZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiB3aWR0aCBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICdlJyB8ICdFJyBhcyBjIC0+XG4gICAgc2Nhbl9vcHRpb25hbGx5X3NpZ25lZF9kZWNpbWFsX2ludCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjKSBpYlxuICB8IF8gLT4gd2lkdGhcblxuXG4oKiBTY2FuIHRoZSBpbnRlZ2VyIHBhcnQgb2YgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIChub3QgdXNpbmcgdGhlXG4gICBPQ2FtbCBsZXhpY2FsIGNvbnZlbnRpb24gc2luY2UgdGhlIGludGVnZXIgcGFydCBjYW4gYmUgZW1wdHkpOlxuICAgYW4gb3B0aW9uYWwgc2lnbiwgZm9sbG93ZWQgYnkgYSBwb3NzaWJseSBlbXB0eSBzZXF1ZW5jZSBvZiBkZWNpbWFsXG4gICBkaWdpdHMgKGUuZy4gLS4xKS4gKilcbmxldCBzY2FuX2ludGVnZXJfcGFydCB3aWR0aCBpYiA9XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBzY2FuX2RlY2ltYWxfZGlnaXRfc3RhciB3aWR0aCBpYlxuXG5cbigqXG4gICBGb3IgdGhlIHRpbWUgYmVpbmcgd2UgaGF2ZSAoYXMgZm91bmQgaW4gc2NhbmYubWxpKTpcbiAgIHRoZSBmaWVsZCB3aWR0aCBpcyBjb21wb3NlZCBvZiBhbiBvcHRpb25hbCBpbnRlZ2VyIGxpdGVyYWxcbiAgIGluZGljYXRpbmcgdGhlIG1heGltYWwgd2lkdGggb2YgdGhlIHRva2VuIHRvIHJlYWQuXG4gICBVbmZvcnR1bmF0ZWx5LCB0aGUgdHlwZS1jaGVja2VyIGxldCB0aGUgdXNlciB3cml0ZSBhbiBvcHRpb25hbCBwcmVjaXNpb24sXG4gICBzaW5jZSB0aGlzIGlzIHZhbGlkIGZvciBwcmludGYgZm9ybWF0IHN0cmluZ3MuXG5cbiAgIFRodXMsIHRoZSBuZXh0IHN0ZXAgZm9yIFNjYW5mIGlzIHRvIHN1cHBvcnQgYSBmdWxsIHdpZHRoIGFuZCBwcmVjaXNpb25cbiAgIGluZGljYXRpb24sIG1vcmUgb3IgbGVzcyBzaW1pbGFyIHRvIHRoZSBvbmUgZm9yIHByaW50ZiwgcG9zc2libHkgZXh0ZW5kZWRcbiAgIHRvIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgW21heCwgbWluXSByYW5nZSBmb3IgdGhlIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkXG4gICBmb3Igc3RyaW5ncy4gU29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzcGVjIGZvciBzY2FuZi5tbGk6XG5cbiAgIFRoZSBvcHRpb25hbCBbd2lkdGhdIGlzIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbWF4aW1hbFxuICAgd2lkdGggb2YgdGhlIHRva2VuIHJlYWQuIEZvciBpbnN0YW5jZSwgWyU2ZF0gcmVhZHMgYW4gaW50ZWdlcixcbiAgIGhhdmluZyBhdCBtb3N0IDYgY2hhcmFjdGVycy5cblxuICAgVGhlIG9wdGlvbmFsIFtwcmVjaXNpb25dIGlzIGEgZG90IFsuXSBmb2xsb3dlZCBieSBhbiBpbnRlZ2VyOlxuXG4gICAtIGluIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgY29udmVyc2lvbnMgKFslZl0sIFslZV0sIFslZ10sIFslRl0sIFslRV0sXG4gICBhbmQgWyVGXSBjb252ZXJzaW9ucywgdGhlIFtwcmVjaXNpb25dIGluZGljYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2ZcbiAgIGRpZ2l0cyB0aGF0IG1heSBmb2xsb3cgdGhlIGRlY2ltYWwgcG9pbnQuIEZvciBpbnN0YW5jZSwgWyUuNGZdIHJlYWRzIGFcbiAgIFtmbG9hdF0gd2l0aCBhdCBtb3N0IDQgZnJhY3Rpb25hbCBkaWdpdHMsXG5cbiAgIC0gaW4gdGhlIHN0cmluZyBjb252ZXJzaW9ucyAoWyVzXSwgWyVTXSwgWyVcXFsgcmFuZ2UgXFxdXSksIGFuZCBpbiB0aGVcbiAgIGludGVnZXIgbnVtYmVyIGNvbnZlcnNpb25zIChbJWldLCBbJWRdLCBbJXVdLCBbJXhdLCBbJW9dLCBhbmQgdGhlaXJcbiAgIFtpbnQzMl0sIFtpbnQ2NF0sIGFuZCBbbmF0aXZlX2ludF0gY29ycmVzcG9uZGVudCksIHRoZSBbcHJlY2lzaW9uXVxuICAgaW5kaWNhdGVzIHRoZSByZXF1aXJlZCBtaW5pbXVtIHdpZHRoIG9mIHRoZSB0b2tlbiByZWFkLFxuXG4gICAtIG9uIGFsbCBvdGhlciBjb252ZXJzaW9ucywgdGhlIHdpZHRoIGFuZCBwcmVjaXNpb24gc3BlY2lmeSB0aGUgW21heCwgbWluXVxuICAgcmFuZ2UgZm9yIHRoZSB3aWR0aCBvZiB0aGUgdG9rZW4gcmVhZC5cbiopXG5sZXQgc2Nhbl9mbG9hdCB3aWR0aCBwcmVjaXNpb24gaWIgPVxuICBsZXQgd2lkdGggPSBzY2FuX2ludGVnZXJfcGFydCB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgdGhlbiB3aWR0aCwgcHJlY2lzaW9uIGVsc2VcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgaWYgU2Nhbm5pbmcuZW9mIGliIHRoZW4gd2lkdGgsIHByZWNpc2lvbiBlbHNlXG4gIG1hdGNoIGMgd2l0aFxuICB8ICcuJyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGxldCBwcmVjaXNpb24gPSBJbnQubWluIHdpZHRoIHByZWNpc2lvbiBpblxuICAgIGxldCB3aWR0aCA9IHdpZHRoIC0gKHByZWNpc2lvbiAtIHNjYW5fZnJhY3Rpb25hbF9wYXJ0IHByZWNpc2lvbiBpYikgaW5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWIsIHByZWNpc2lvblxuICB8IF8gLT5cbiAgICBzY2FuX2V4cG9uZW50X3BhcnQgd2lkdGggaWIsIHByZWNpc2lvblxuXG5cbmxldCBjaGVja19jYXNlX2luc2Vuc2l0aXZlX3N0cmluZyB3aWR0aCBpYiBlcnJvciBzdHIgPVxuICBsZXQgbG93ZXJjYXNlIGMgPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJ0EnIC4uICdaJyAtPlxuICAgICAgY2hhcl9vZl9pbnQgKGludF9vZl9jaGFyIGMgLSBpbnRfb2ZfY2hhciAnQScgKyBpbnRfb2ZfY2hhciAnYScpXG4gICAgfCBfIC0+IGMgaW5cbiAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gIGxldCB3aWR0aCA9IHJlZiB3aWR0aCBpblxuICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgIGxldCBjID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgaWYgbG93ZXJjYXNlIGMgPD4gbG93ZXJjYXNlIHN0ci5baV0gdGhlbiBlcnJvciAoKTtcbiAgICBpZiAhd2lkdGggPSAwIHRoZW4gZXJyb3IgKCk7XG4gICAgd2lkdGggOj0gU2Nhbm5pbmcuc3RvcmVfY2hhciAhd2lkdGggaWIgYztcbiAgZG9uZTtcbiAgIXdpZHRoXG5cblxubGV0IHNjYW5faGV4X2Zsb2F0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICBsZXQgd2lkdGggPSBzY2FuX3NpZ24gd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gIHwgJzAnIGFzIGMgLT4gKFxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgIGxldCB3aWR0aCA9IGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGJhZF9oZXhfZmxvYXQgXCJ4XCIgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgbGV0IHdpZHRoID0gbWF0Y2ggU2Nhbm5pbmcucGVla19jaGFyIGliIHdpdGhcbiAgICAgICAgfCAnLicgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgfCBfIC0+IHNjYW5faGV4YWRlY2ltYWxfaW50IHdpZHRoIGliIGluXG4gICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICBsZXQgd2lkdGggPSBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgIHwgJy4nIGFzIGMgLT4gKFxuICAgICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgICAgICB8ICdwJyB8ICdQJyAtPiB3aWR0aFxuICAgICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICAgICAgICAgICAgICB3aWR0aCAtIChwcmVjaXNpb24gLSBzY2FuX2hleGFkZWNpbWFsX2ludCBwcmVjaXNpb24gaWIpXG4gICAgICAgICAgKVxuICAgICAgICAgIHwgXyAtPiB3aWR0aCBpblxuICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gd2lkdGggZWxzZVxuICAgICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgICAgfCAncCcgfCAnUCcgYXMgYyAtPlxuICAgICAgICAgICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICAgICAgICAgIHNjYW5fb3B0aW9uYWxseV9zaWduZWRfZGVjaW1hbF9pbnQgd2lkdGggaWJcbiAgICAgICAgICB8IF8gLT4gd2lkdGhcbiAgKVxuICB8ICduJyB8ICdOJyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9oZXhfZmxvYXQgKCk7XG4gICAgY2hlY2tfY2FzZV9pbnNlbnNpdGl2ZV9zdHJpbmcgd2lkdGggaWIgYmFkX2hleF9mbG9hdCBcImFuXCJcbiAgfCAnaScgfCAnSScgYXMgYyAtPlxuICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfaGV4X2Zsb2F0ICgpO1xuICAgIGNoZWNrX2Nhc2VfaW5zZW5zaXRpdmVfc3RyaW5nIHdpZHRoIGliIGJhZF9oZXhfZmxvYXQgXCJuZmluaXR5XCJcbiAgfCBfIC0+IGJhZF9oZXhfZmxvYXQgKClcblxuXG5sZXQgc2Nhbl9jYW1sX2Zsb2F0X3Jlc3Qgd2lkdGggcHJlY2lzaW9uIGliID1cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbGV0IHdpZHRoID0gc2Nhbl9kZWNpbWFsX2RpZ2l0X3N0YXIgd2lkdGggaWIgaW5cbiAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgbWF0Y2ggYyB3aXRoXG4gIHwgJy4nIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgKCogVGhlIGVmZmVjdGl2ZSB3aWR0aCBhdmFpbGFibGUgZm9yIHNjYW5uaW5nIHRoZSBmcmFjdGlvbmFsIHBhcnQgaXNcbiAgICAgICB0aGUgbWluaW11bSBvZiBkZWNsYXJlZCBwcmVjaXNpb24gYW5kIHdpZHRoIGxlZnQuICopXG4gICAgbGV0IHByZWNpc2lvbiA9IEludC5taW4gd2lkdGggcHJlY2lzaW9uIGluXG4gICAgKCogQWZ0ZXIgc2Nhbm5pbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB3aXRoIFtwcmVjaXNpb25dIHByb3Zpc2lvbmFsIHdpZHRoLFxuICAgICAgIFt3aWR0aF9wcmVjaXNpb25dIGlzIGxlZnQuICopXG4gICAgbGV0IHdpZHRoX3ByZWNpc2lvbiA9IHNjYW5fZnJhY3Rpb25hbF9wYXJ0IHByZWNpc2lvbiBpYiBpblxuICAgICgqIEhlbmNlLCBzY2FubmluZyB0aGUgZnJhY3Rpb25hbCBwYXJ0IHRvb2sgZXhhY3RseVxuICAgICAgIFtwcmVjaXNpb24gLSB3aWR0aF9wcmVjaXNpb25dIGNoYXJzLiAqKVxuICAgIGxldCBmcmFjX3dpZHRoID0gcHJlY2lzaW9uIC0gd2lkdGhfcHJlY2lzaW9uIGluXG4gICAgKCogQW5kIG5ldyBwcm92aXNpb25hbCB3aWR0aCBpcyBbd2lkdGggLSB3aWR0aF9wcmVjaXNpb24uICopXG4gICAgbGV0IHdpZHRoID0gd2lkdGggLSBmcmFjX3dpZHRoIGluXG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliXG4gIHwgJ2UnIHwgJ0UnIC0+XG4gICAgc2Nhbl9leHBvbmVudF9wYXJ0IHdpZHRoIGliXG4gIHwgXyAtPiBiYWRfZmxvYXQgKClcblxuXG5sZXQgc2Nhbl9jYW1sX2Zsb2F0IHdpZHRoIHByZWNpc2lvbiBpYiA9XG4gIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gIGxldCB3aWR0aCA9IHNjYW5fc2lnbiB3aWR0aCBpYiBpblxuICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICB8ICcwJyBhcyBjIC0+IChcbiAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2Zsb2F0ICgpO1xuICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAneCcgfCAnWCcgYXMgYyAtPiAoXG4gICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiBiYWRfZmxvYXQgKCk7XG4gICAgICBsZXQgd2lkdGggPSBzY2FuX2hleGFkZWNpbWFsX2ludCB3aWR0aCBpYiBpblxuICAgICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICAgIGxldCB3aWR0aCA9IG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgIHwgJy4nIGFzIGMgLT4gKFxuICAgICAgICAgIGxldCB3aWR0aCA9IFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYyBpblxuICAgICAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgICAgICBtYXRjaCBTY2FubmluZy5wZWVrX2NoYXIgaWIgd2l0aFxuICAgICAgICAgICAgfCAncCcgfCAnUCcgLT4gd2lkdGhcbiAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICBsZXQgcHJlY2lzaW9uID0gSW50Lm1pbiB3aWR0aCBwcmVjaXNpb24gaW5cbiAgICAgICAgICAgICAgd2lkdGggLSAocHJlY2lzaW9uIC0gc2Nhbl9oZXhhZGVjaW1hbF9pbnQgcHJlY2lzaW9uIGliKVxuICAgICAgICApXG4gICAgICAgIHwgJ3AnIHwgJ1AnIC0+IHdpZHRoXG4gICAgICAgIHwgXyAtPiBiYWRfZmxvYXQgKCkgaW5cbiAgICAgIGlmIHdpZHRoID0gMCB8fCBTY2FubmluZy5lbmRfb2ZfaW5wdXQgaWIgdGhlbiB3aWR0aCBlbHNlXG4gICAgICAgIG1hdGNoIFNjYW5uaW5nLnBlZWtfY2hhciBpYiB3aXRoXG4gICAgICAgIHwgJ3AnIHwgJ1AnIGFzIGMgLT5cbiAgICAgICAgICBsZXQgd2lkdGggPSBTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMgaW5cbiAgICAgICAgICBpZiB3aWR0aCA9IDAgfHwgU2Nhbm5pbmcuZW5kX29mX2lucHV0IGliIHRoZW4gYmFkX2hleF9mbG9hdCAoKTtcbiAgICAgICAgICBzY2FuX29wdGlvbmFsbHlfc2lnbmVkX2RlY2ltYWxfaW50IHdpZHRoIGliXG4gICAgICAgIHwgXyAtPiB3aWR0aFxuICAgIClcbiAgICB8IF8gLT5cbiAgICAgIHNjYW5fY2FtbF9mbG9hdF9yZXN0IHdpZHRoIHByZWNpc2lvbiBpYlxuICApXG4gIHwgJzEnIC4uICc5JyBhcyBjIC0+XG4gICAgbGV0IHdpZHRoID0gU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiBjIGluXG4gICAgaWYgd2lkdGggPSAwIHx8IFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIGJhZF9mbG9hdCAoKTtcbiAgICBzY2FuX2NhbWxfZmxvYXRfcmVzdCB3aWR0aCBwcmVjaXNpb24gaWJcbigqIFNwZWNpYWwgY2FzZSBvZiBuYW4gYW5kIGluZmluaXR5OlxuICB8ICdpJyAtPlxuICB8ICduJyAtPlxuKilcbiAgfCBfIC0+IGJhZF9mbG9hdCAoKVxuXG5cbigqIFNjYW4gYSByZWd1bGFyIHN0cmluZzpcbiAgIHN0b3BzIHdoZW4gZW5jb3VudGVyaW5nIGEgc3BhY2UsIGlmIG5vIHNjYW5uaW5nIGluZGljYXRpb24gaGFzIGJlZW4gZ2l2ZW47XG4gICBvdGhlcndpc2UsIHN0b3BzIHdoZW4gZW5jb3VudGVyaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzY2FubmluZ1xuICAgaW5kaWNhdGlvbiBbc3RwXS5cbiAgIEl0IGFsc28gc3RvcHMgYXQgZW5kIG9mIGZpbGUgb3Igd2hlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBoYXNcbiAgIGJlZW4gcmVhZC4gKilcbmxldCBzY2FuX3N0cmluZyBzdHAgd2lkdGggaWIgPVxuICBsZXQgcmVjIGxvb3Agd2lkdGggPVxuICAgIGlmIHdpZHRoID0gMCB0aGVuIHdpZHRoIGVsc2VcbiAgICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICAgIGlmIFNjYW5uaW5nLmVvZiBpYiB0aGVuIHdpZHRoIGVsc2VcbiAgICAgIG1hdGNoIHN0cCB3aXRoXG4gICAgICB8IFNvbWUgYycgd2hlbiBjID0gYycgLT4gU2Nhbm5pbmcuc2tpcF9jaGFyIHdpZHRoIGliXG4gICAgICB8IFNvbWUgXyAtPiBsb29wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpXG4gICAgICB8IE5vbmUgLT5cbiAgICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICAgIHwgJyAnIHwgJ1xcdCcgfCAnXFxuJyB8ICdcXHInIC0+IHdpZHRoXG4gICAgICAgIHwgXyAtPiBsb29wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpIGluXG4gIGxvb3Agd2lkdGhcblxuXG4oKiBTY2FuIGEgY2hhcjogcGVlayBzdHJpY3RseSBvbmUgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCwgd2hhdHNvZXZlci4gKilcbmxldCBzY2FuX2NoYXIgd2lkdGggaWIgPVxuICAoKiBUaGUgY2FzZSB3aWR0aCA9IDAgY291bGQgbm90IGhhcHBlbiBoZXJlLCBzaW5jZSBpdCBpcyB0ZXN0ZWQgYmVmb3JlXG4gICAgIGNhbGxpbmcgc2Nhbl9jaGFyLCBpbiB0aGUgbWFpbiBzY2FubmluZyBmdW5jdGlvbi5cbiAgICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIFwiYSBjaGFyYWN0ZXJcIiBlbHNlICopXG4gIFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgKFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliKVxuXG5cbmxldCBjaGFyX2Zvcl9iYWNrc2xhc2ggPSBmdW5jdGlvblxuICB8ICduJyAtPiAnXFwwMTAnXG4gIHwgJ3InIC0+ICdcXDAxMydcbiAgfCAnYicgLT4gJ1xcMDA4J1xuICB8ICd0JyAtPiAnXFwwMDknXG4gIHwgYyAtPiBjXG5cblxuKCogVGhlIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZmFjaWFsIHZhbHVlIG9mIGEgdmFsaWRcbiAgIGRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyLiAqKVxubGV0IGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjID0gaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICcwJ1xuXG5sZXQgY2hhcl9mb3JfZGVjaW1hbF9jb2RlIGMwIGMxIGMyID1cbiAgbGV0IGMgPVxuICAgIDEwMCAqIGRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMCArXG4gICAgIDEwICogZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMxICtcbiAgICAgICAgICBkZWNpbWFsX3ZhbHVlX29mX2NoYXIgYzIgaW5cbiAgaWYgYyA8IDAgfHwgYyA+IDI1NSB0aGVuXG4gICAgYmFkX2lucHV0XG4gICAgICAoUHJpbnRmLnNwcmludGZcbiAgICAgICAgIFwiYmFkIGNoYXJhY3RlciBkZWNpbWFsIGVuY29kaW5nIFxcXFwlYyVjJWNcIiBjMCBjMSBjMikgZWxzZVxuICBjaGFyX29mX2ludCBjXG5cblxuKCogVGhlIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZmFjaWFsIHZhbHVlIG9mIGEgdmFsaWRcbiAgIGhleGFkZWNpbWFsIGRpZ2l0IGNoYXJhY3Rlci4gKilcbmxldCBoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMgPVxuICBsZXQgZCA9IGludF9vZl9jaGFyIGMgaW5cbiAgKCogQ291bGQgYWxzbyBiZTpcbiAgICBpZiBkIDw9IGludF9vZl9jaGFyICc5JyB0aGVuIGQgLSBpbnRfb2ZfY2hhciAnMCcgZWxzZVxuICAgIGlmIGQgPD0gaW50X29mX2NoYXIgJ0YnIHRoZW4gMTAgKyBkIC0gaW50X29mX2NoYXIgJ0EnIGVsc2VcbiAgICBpZiBkIDw9IGludF9vZl9jaGFyICdmJyB0aGVuIDEwICsgZCAtIGludF9vZl9jaGFyICdhJyBlbHNlIGFzc2VydCBmYWxzZVxuICAqKVxuICBpZiBkID49IGludF9vZl9jaGFyICdhJyB0aGVuXG4gICAgZCAtIDg3ICgqIDEwICsgaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICdhJyAqKSBlbHNlXG4gIGlmIGQgPj0gaW50X29mX2NoYXIgJ0EnIHRoZW5cbiAgICBkIC0gNTUgICgqIDEwICsgaW50X29mX2NoYXIgYyAtIGludF9vZl9jaGFyICdBJyAqKSBlbHNlXG4gICAgZCAtIGludF9vZl9jaGFyICcwJ1xuXG5cbmxldCBjaGFyX2Zvcl9oZXhhZGVjaW1hbF9jb2RlIGMxIGMyID1cbiAgbGV0IGMgPVxuICAgIDE2ICogaGV4YWRlY2ltYWxfdmFsdWVfb2ZfY2hhciBjMSArXG4gICAgICAgICBoZXhhZGVjaW1hbF92YWx1ZV9vZl9jaGFyIGMyIGluXG4gIGlmIGMgPCAwIHx8IGMgPiAyNTUgdGhlblxuICAgIGJhZF9pbnB1dFxuICAgICAgKFByaW50Zi5zcHJpbnRmIFwiYmFkIGNoYXJhY3RlciBoZXhhZGVjaW1hbCBlbmNvZGluZyBcXFxcJWMlY1wiIGMxIGMyKSBlbHNlXG4gIGNoYXJfb2ZfaW50IGNcblxuXG4oKiBDYWxsZWQgaW4gcGFydGljdWxhciB3aGVuIGVuY291bnRlcmluZyAnXFxcXCcgYXMgc3RhcnRlciBvZiBhIGNoYXIuXG4gICBTdG9wcyBiZWZvcmUgdGhlIGNvcnJlc3BvbmRpbmcgJ1xcJycuICopXG5sZXQgY2hlY2tfbmV4dF9jaGFyIG1lc3NhZ2Ugd2lkdGggaWIgPVxuICBpZiB3aWR0aCA9IDAgdGhlbiBiYWRfdG9rZW5fbGVuZ3RoIG1lc3NhZ2UgZWxzZVxuICBsZXQgYyA9IFNjYW5uaW5nLnBlZWtfY2hhciBpYiBpblxuICBpZiBTY2FubmluZy5lb2YgaWIgdGhlbiBiYWRfZW5kX29mX2lucHV0IG1lc3NhZ2UgZWxzZVxuICBjXG5cblxubGV0IGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciA9IGNoZWNrX25leHRfY2hhciBcImEgQ2hhclwiXG5sZXQgY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgPSBjaGVja19uZXh0X2NoYXIgXCJhIFN0cmluZ1wiXG5cbmxldCBzY2FuX2JhY2tzbGFzaF9jaGFyIHdpZHRoIGliID1cbiAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIHdpZHRoIGliIHdpdGhcbiAgfCAnXFxcXCcgfCAnXFwnJyB8ICdcXFwiJyB8ICduJyB8ICd0JyB8ICdiJyB8ICdyJyBhcyBjIC0+XG4gICAgU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiAoY2hhcl9mb3JfYmFja3NsYXNoIGMpXG4gIHwgJzAnIC4uICc5JyBhcyBjIC0+XG4gICAgbGV0IGdldF9kaWdpdCAoKSA9XG4gICAgICBsZXQgYyA9IFNjYW5uaW5nLm5leHRfY2hhciBpYiBpblxuICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICB8ICcwJyAuLiAnOScgYXMgYyAtPiBjXG4gICAgICB8IGMgLT4gYmFkX2lucHV0X2VzY2FwZSBjIGluXG4gICAgbGV0IGMwID0gYyBpblxuICAgIGxldCBjMSA9IGdldF9kaWdpdCAoKSBpblxuICAgIGxldCBjMiA9IGdldF9kaWdpdCAoKSBpblxuICAgIFNjYW5uaW5nLnN0b3JlX2NoYXIgKHdpZHRoIC0gMikgaWIgKGNoYXJfZm9yX2RlY2ltYWxfY29kZSBjMCBjMSBjMilcbiAgfCAneCcgLT5cbiAgICBsZXQgZ2V0X2RpZ2l0ICgpID1cbiAgICAgIGxldCBjID0gU2Nhbm5pbmcubmV4dF9jaGFyIGliIGluXG4gICAgICBtYXRjaCBjIHdpdGhcbiAgICAgIHwgJzAnIC4uICc5JyB8ICdBJyAuLiAnRicgfCAnYScgLi4gJ2YnIGFzIGMgLT4gY1xuICAgICAgfCBjIC0+IGJhZF9pbnB1dF9lc2NhcGUgYyBpblxuICAgIGxldCBjMSA9IGdldF9kaWdpdCAoKSBpblxuICAgIGxldCBjMiA9IGdldF9kaWdpdCAoKSBpblxuICAgIFNjYW5uaW5nLnN0b3JlX2NoYXIgKHdpZHRoIC0gMikgaWIgKGNoYXJfZm9yX2hleGFkZWNpbWFsX2NvZGUgYzEgYzIpXG4gIHwgYyAtPlxuICAgIGJhZF9pbnB1dF9lc2NhcGUgY1xuXG5cbigqIFNjYW4gYSBjaGFyYWN0ZXIgKGFuIE9DYW1sIHRva2VuKS4gKilcbmxldCBzY2FuX2NhbWxfY2hhciB3aWR0aCBpYiA9XG5cbiAgbGV0IHJlYyBmaW5kX3N0YXJ0IHdpZHRoID1cbiAgICBtYXRjaCBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAnXFwnJyAtPiBmaW5kX2NoYXIgKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgYyAtPiBjaGFyYWN0ZXJfbWlzbWF0Y2ggJ1xcJycgY1xuXG4gIGFuZCBmaW5kX2NoYXIgd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3JfY2hhciB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxcXCcgLT5cbiAgICAgIGZpbmRfc3RvcCAoc2Nhbl9iYWNrc2xhc2hfY2hhciAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpIGliKVxuICAgIHwgYyAtPlxuICAgICAgZmluZF9zdG9wIChTY2FubmluZy5zdG9yZV9jaGFyIHdpZHRoIGliIGMpXG5cbiAgYW5kIGZpbmRfc3RvcCB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9jaGFyIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXCcnIC0+IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliXG4gICAgfCBjIC0+IGNoYXJhY3Rlcl9taXNtYXRjaCAnXFwnJyBjIGluXG5cbiAgZmluZF9zdGFydCB3aWR0aFxuXG5cbigqIFNjYW4gYSBkZWxpbWl0ZWQgc3RyaW5nIChhbiBPQ2FtbCB0b2tlbikuICopXG5sZXQgc2Nhbl9jYW1sX3N0cmluZyB3aWR0aCBpYiA9XG5cbiAgbGV0IHJlYyBmaW5kX3N0YXJ0IHdpZHRoID1cbiAgICBtYXRjaCBTY2FubmluZy5jaGVja2VkX3BlZWtfY2hhciBpYiB3aXRoXG4gICAgfCAnXFxcIicgLT4gZmluZF9zdG9wIChTY2FubmluZy5pZ25vcmVfY2hhciB3aWR0aCBpYilcbiAgICB8IGMgLT4gY2hhcmFjdGVyX21pc21hdGNoICdcXFwiJyBjXG5cbiAgYW5kIGZpbmRfc3RvcCB3aWR0aCA9XG4gICAgbWF0Y2ggY2hlY2tfbmV4dF9jaGFyX2Zvcl9zdHJpbmcgd2lkdGggaWIgd2l0aFxuICAgIHwgJ1xcXCInIC0+IFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliXG4gICAgfCAnXFxcXCcgLT4gc2Nhbl9iYWNrc2xhc2ggKFNjYW5uaW5nLmlnbm9yZV9jaGFyIHdpZHRoIGliKVxuICAgIHwgYyAtPiBmaW5kX3N0b3AgKFNjYW5uaW5nLnN0b3JlX2NoYXIgd2lkdGggaWIgYylcblxuICBhbmQgc2Nhbl9iYWNrc2xhc2ggd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICdcXHInIC0+IHNraXBfbmV3bGluZSAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCAnXFxuJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCAoc2Nhbl9iYWNrc2xhc2hfY2hhciB3aWR0aCBpYilcblxuICBhbmQgc2tpcF9uZXdsaW5lIHdpZHRoID1cbiAgICBtYXRjaCBjaGVja19uZXh0X2NoYXJfZm9yX3N0cmluZyB3aWR0aCBpYiB3aXRoXG4gICAgfCAnXFxuJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCAoU2Nhbm5pbmcuc3RvcmVfY2hhciB3aWR0aCBpYiAnXFxyJylcblxuICBhbmQgc2tpcF9zcGFjZXMgd2lkdGggPVxuICAgIG1hdGNoIGNoZWNrX25leHRfY2hhcl9mb3Jfc3RyaW5nIHdpZHRoIGliIHdpdGhcbiAgICB8ICcgJyAtPiBza2lwX3NwYWNlcyAoU2Nhbm5pbmcuaWdub3JlX2NoYXIgd2lkdGggaWIpXG4gICAgfCBfIC0+IGZpbmRfc3RvcCB3aWR0aCBpblxuXG4gIGZpbmRfc3RhcnQgd2lkdGhcblxuXG4oKiBTY2FuIGEgYm9vbGVhbiAoYW4gT0NhbWwgdG9rZW4pLiAqKVxubGV0IHNjYW5fYm9vbCBpYiA9XG4gIGxldCBjID0gU2Nhbm5pbmcuY2hlY2tlZF9wZWVrX2NoYXIgaWIgaW5cbiAgbGV0IG0gPVxuICAgIG1hdGNoIGMgd2l0aFxuICAgIHwgJ3QnIC0+IDRcbiAgICB8ICdmJyAtPiA1XG4gICAgfCBjIC0+XG4gICAgICBiYWRfaW5wdXRcbiAgICAgICAgKFByaW50Zi5zcHJpbnRmIFwidGhlIGNoYXJhY3RlciAlQyBjYW5ub3Qgc3RhcnQgYSBib29sZWFuXCIgYykgaW5cbiAgc2Nhbl9zdHJpbmcgTm9uZSBtIGliXG5cblxuKCogU2NhbiBhIHN0cmluZyBjb250YWluaW5nIGVsZW1lbnRzIGluIGNoYXJfc2V0IGFuZCB0ZXJtaW5hdGVkIGJ5IHNjYW5faW5kaWNcbiAgIGlmIHByb3ZpZGVkLiAqKVxubGV0IHNjYW5fY2hhcnNfaW5fY2hhcl9zZXQgY2hhcl9zZXQgc2Nhbl9pbmRpYyB3aWR0aCBpYiA9XG4gIGxldCByZWMgc2Nhbl9jaGFycyBpIHN0cCA9XG4gICAgbGV0IGMgPSBTY2FubmluZy5wZWVrX2NoYXIgaWIgaW5cbiAgICBpZiBpID4gMCAmJiBub3QgKFNjYW5uaW5nLmVvZiBpYikgJiZcbiAgICAgICBpc19pbl9jaGFyX3NldCBjaGFyX3NldCBjICYmXG4gICAgICAgaW50X29mX2NoYXIgYyA8PiBzdHAgdGhlblxuICAgICAgbGV0IF8gPSBTY2FubmluZy5zdG9yZV9jaGFyIG1heF9pbnQgaWIgYyBpblxuICAgICAgc2Nhbl9jaGFycyAoaSAtIDEpIHN0cCBpblxuICBtYXRjaCBzY2FuX2luZGljIHdpdGhcbiAgfCBOb25lIC0+IHNjYW5fY2hhcnMgd2lkdGggKC0xKTtcbiAgfCBTb21lIGMgLT5cbiAgICBzY2FuX2NoYXJzIHdpZHRoIChpbnRfb2ZfY2hhciBjKTtcbiAgICBpZiBub3QgKFNjYW5uaW5nLmVvZiBpYikgdGhlblxuICAgICAgbGV0IGNpID0gU2Nhbm5pbmcucGVla19jaGFyIGliIGluXG4gICAgICBpZiBjID0gY2lcbiAgICAgIHRoZW4gU2Nhbm5pbmcuaW52YWxpZGF0ZV9jdXJyZW50X2NoYXIgaWJcbiAgICAgIGVsc2UgY2hhcmFjdGVyX21pc21hdGNoIGMgY2lcblxuXG4oKiBUaGUgZ2xvYmFsIGVycm9yIHJlcG9ydCBmdW5jdGlvbiBmb3IgW1NjYW5mXS4gKilcbmxldCBzY2FuZl9iYWRfaW5wdXQgaWIgPSBmdW5jdGlvblxuICB8IFNjYW5fZmFpbHVyZSBzIHwgRmFpbHVyZSBzIC0+XG4gICAgbGV0IGkgPSBTY2FubmluZy5jaGFyX2NvdW50IGliIGluXG4gICAgYmFkX2lucHV0IChQcmludGYuc3ByaW50ZiBcInNjYW5mOiBiYWQgaW5wdXQgYXQgY2hhciBudW1iZXIgJWk6ICVzXCIgaSBzKVxuICB8IHggLT4gcmFpc2UgeFxuXG5cbigqIEdldCB0aGUgY29udGVudCBvZiBhIGNvdW50ZXIgZnJvbSBhbiBpbnB1dCBidWZmZXIuICopXG5sZXQgZ2V0X2NvdW50ZXIgaWIgY291bnRlciA9XG4gIG1hdGNoIGNvdW50ZXIgd2l0aFxuICB8IExpbmVfY291bnRlciAtPiBTY2FubmluZy5saW5lX2NvdW50IGliXG4gIHwgQ2hhcl9jb3VudGVyIC0+IFNjYW5uaW5nLmNoYXJfY291bnQgaWJcbiAgfCBUb2tlbl9jb3VudGVyIC0+IFNjYW5uaW5nLnRva2VuX2NvdW50IGliXG5cblxuKCogQ29tcHV0ZSB0aGUgd2lkdGggb2YgYSBwYWRkaW5nIG9wdGlvbiAoc2VlIFwiJTQye1wiIGFuZCBcIiUxMjMoXCIpLiAqKVxubGV0IHdpZHRoX29mX3BhZF9vcHQgcGFkX29wdCA9IG1hdGNoIHBhZF9vcHQgd2l0aFxuICB8IE5vbmUgLT4gbWF4X2ludFxuICB8IFNvbWUgd2lkdGggLT4gd2lkdGhcblxuXG5sZXQgc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmcgPVxuICBpZiBmbXRpbmcgPSBFc2NhcGVkX3BlcmNlbnQgdGhlbiAnJScsIFwiXCIgZWxzZVxuICAgIGxldCBzdHIgPSBzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm10aW5nIGluXG4gICAgbGV0IHN0cCA9IHN0ci5bMV0gaW5cbiAgICBsZXQgc3ViX3N0ciA9IFN0cmluZy5zdWIgc3RyIDIgKFN0cmluZy5sZW5ndGggc3RyIC0gMikgaW5cbiAgICBzdHAsIHN1Yl9zdHJcblxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogUmVhZGVyIG1hbmFnZW1lbnQgKilcblxuKCogQSBjYWxsIHRvIHRha2VfZm9ybWF0X3JlYWRlcnMgb24gYSBmb3JtYXQgaXMgZXZhbHVhdGVkIGludG8gZnVuY3Rpb25zXG4gICB0YWtpbmcgcmVhZGVycyBhcyBhcmd1bWVudHMgYW5kIGFnZ3JlZ2F0ZSB0aGVtIGludG8gYW4gaGV0ZXJvZ2VuZW91cyBsaXN0ICopXG4oKiBXaGVuIGFsbCByZWFkZXJzIGFyZSB0YWtlbiwgZmluYWxseSBwYXNzIHRoZSBsaXN0IG9mIHRoZSByZWFkZXJzIHRvIHRoZVxuICAgY29udGludWF0aW9uIGsuICopXG5sZXQgcmVjIHRha2VfZm9ybWF0X3JlYWRlcnMgOiB0eXBlIGEgYyBkIGUgZiAuXG4gICAgKChkLCBlKSBoZXRlcl9saXN0IC0+IGUpIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICBkID1cbmZ1biBrIGZtdCAtPiBtYXRjaCBmbXQgd2l0aFxuICB8IFJlYWRlciBmbXRfcmVzdCAtPlxuICAgIGZ1biByZWFkZXIgLT5cbiAgICAgIGxldCBuZXdfayByZWFkZXJzX3Jlc3QgPSBrIChDb25zIChyZWFkZXIsIHJlYWRlcnNfcmVzdCkpIGluXG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIG5ld19rIGZtdF9yZXN0XG4gIHwgQ2hhciByZXN0ICAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBDYW1sX2NoYXIgcmVzdCAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFN0cmluZyAoXywgcmVzdCkgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ2FtbF9zdHJpbmcgKF8sIHJlc3QpICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBJbnQgKF8sIF8sIF8sIHJlc3QpICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEludDMyIChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgTmF0aXZlaW50IChfLCBfLCBfLCByZXN0KSAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBJbnQ2NCAoXywgXywgXywgcmVzdCkgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IEZsb2F0IChfLCBfLCBfLCByZXN0KSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQm9vbCAoXywgcmVzdCkgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBBbHBoYSByZXN0ICAgICAgICAgICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IFRoZXRhIHJlc3QgICAgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgRmx1c2ggcmVzdCAgICAgICAgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTdHJpbmdfbGl0ZXJhbCAoXywgcmVzdCkgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuICB8IENoYXJfbGl0ZXJhbCAoXywgcmVzdCkgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgQ3VzdG9tIChfLCBfLCByZXN0KSAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcblxuICB8IFNjYW5fY2hhcl9zZXQgKF8sIF8sIHJlc3QpICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayByZXN0XG4gIHwgU2Nhbl9nZXRfY291bnRlciAoXywgcmVzdCkgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBTY2FuX25leHRfY2hhciByZXN0ICAgICAgICAgICAgICAtPiB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgcmVzdFxuXG4gIHwgRm9ybWF0dGluZ19saXQgKF8sIHJlc3QpICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10LCBfKSksIHJlc3QpIC0+XG4gICAgICB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgKGNvbmNhdF9mbXQgZm10IHJlc3QpXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCwgXykpLCByZXN0KSAtPlxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBrIChjb25jYXRfZm10IGZtdCByZXN0KVxuXG4gIHwgRm9ybWF0X2FyZyAoXywgXywgcmVzdCkgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIHJlc3RcbiAgfCBGb3JtYXRfc3Vic3QgKF8sIGZtdHR5LCByZXN0KSAgICAtPlxuICAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgKGVyYXNlX3JlbCAoc3ltbSBmbXR0eSkpIHJlc3RcbiAgfCBJZ25vcmVkX3BhcmFtIChpZ24sIHJlc3QpICAgICAgICAtPiB0YWtlX2lnbm9yZWRfZm9ybWF0X3JlYWRlcnMgayBpZ24gcmVzdFxuXG4gIHwgRW5kX29mX2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgLT4gayBOaWxcblxuKCogVGFrZSByZWFkZXJzIGFzc29jaWF0ZWQgdG8gYW4gZm10dHkgY29taW5nIGZyb20gYSBGb3JtYXRfc3Vic3QgXCIlKC4uLiUpXCIuICopXG5hbmQgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyA6IHR5cGUgeCB5IGEgYyBkIGUgZiAuXG4gICAgKChkLCBlKSBoZXRlcl9saXN0IC0+IGUpIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCB4LCB5KSBmbXR0eSAtPlxuICAgICAgKHksIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIHgsIGUsIGYpIGZtdCAtPiBkID1cbmZ1biBrIGZtdHR5IGZtdCAtPiBtYXRjaCBmbXR0eSB3aXRoXG4gIHwgUmVhZGVyX3R5IGZtdF9yZXN0IC0+XG4gICAgZnVuIHJlYWRlciAtPlxuICAgICAgbGV0IG5ld19rIHJlYWRlcnNfcmVzdCA9IGsgKENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSkgaW5cbiAgICAgIHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgbmV3X2sgZm10X3Jlc3QgZm10XG4gIHwgSWdub3JlZF9yZWFkZXJfdHkgZm10X3Jlc3QgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRfcmVzdCBmbXRcbiAgfCBDaGFyX3R5IHJlc3QgICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgU3RyaW5nX3R5IHJlc3QgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEludF90eSByZXN0ICAgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBJbnQzMl90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgTmF0aXZlaW50X3R5IHJlc3QgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEludDY0X3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBGbG9hdF90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgQm9vbF90eSByZXN0ICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEFscGhhX3R5IHJlc3QgICAgICAgICAgICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBUaGV0YV90eSByZXN0ICAgICAgICAgICAgICAgLT4gdGFrZV9mbXR0eV9mb3JtYXRfcmVhZGVycyBrIHJlc3QgZm10XG4gIHwgQW55X3R5IHJlc3QgICAgICAgICAgICAgICAgIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayByZXN0IGZtdFxuICB8IEZvcm1hdF9hcmdfdHkgKF8sIHJlc3QpICAgICAtPiB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgcmVzdCBmbXRcbiAgfCBFbmRfb2ZfZm10dHkgICAgICAgICAgICAgICAgLT4gdGFrZV9mb3JtYXRfcmVhZGVycyBrIGZtdFxuICB8IEZvcm1hdF9zdWJzdF90eSAodHkxLCB0eTIsIHJlc3QpIC0+XG4gICAgbGV0IHR5ID0gdHJhbnMgKHN5bW0gdHkxKSB0eTIgaW5cbiAgICB0YWtlX2ZtdHR5X2Zvcm1hdF9yZWFkZXJzIGsgKGNvbmNhdF9mbXR0eSB0eSByZXN0KSBmbXRcblxuKCogVGFrZSByZWFkZXJzIGFzc29jaWF0ZWQgdG8gYW4gaWdub3JlZCBwYXJhbWV0ZXIuICopXG5hbmQgdGFrZV9pZ25vcmVkX2Zvcm1hdF9yZWFkZXJzIDogdHlwZSB4IHkgYSBjIGQgZSBmIC5cbiAgICAoKGQsIGUpIGhldGVyX2xpc3QgLT4gZSkgLT4gKGEsIFNjYW5uaW5nLmluX2NoYW5uZWwsIGMsIGQsIHgsIHkpIGlnbm9yZWQgLT5cbiAgICAgICh5LCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCB4LCBlLCBmKSBmbXQgLT4gZCA9XG5mdW4gayBpZ24gZm10IC0+IG1hdGNoIGlnbiB3aXRoXG4gIHwgSWdub3JlZF9yZWFkZXIgLT5cbiAgICBmdW4gcmVhZGVyIC0+XG4gICAgICBsZXQgbmV3X2sgcmVhZGVyc19yZXN0ID0gayAoQ29ucyAocmVhZGVyLCByZWFkZXJzX3Jlc3QpKSBpblxuICAgICAgdGFrZV9mb3JtYXRfcmVhZGVycyBuZXdfayBmbXRcbiAgfCBJZ25vcmVkX2NoYXIgICAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfY2hhciAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3N0cmluZyBfICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2NhbWxfc3RyaW5nIF8gICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludCAoXywgXykgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludDMyIChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX25hdGl2ZWludCAoXywgXykgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2ludDY0IChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zsb2F0IChfLCBfKSAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Jvb2wgXyAgICAgICAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9hcmcgXyAgICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX2Zvcm1hdF9zdWJzdCAoXywgZm10dHkpIC0+IHRha2VfZm10dHlfZm9ybWF0X3JlYWRlcnMgayBmbXR0eSBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fY2hhcl9zZXQgXyAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fZ2V0X2NvdW50ZXIgXyAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcbiAgfCBJZ25vcmVkX3NjYW5fbmV4dF9jaGFyICAgICAgICAgIC0+IHRha2VfZm9ybWF0X3JlYWRlcnMgayBmbXRcblxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCogR2VuZXJpYyBzY2FubmluZyAqKVxuXG4oKiBNYWtlIGEgZ2VuZXJpYyBzY2FubmluZyBmdW5jdGlvbi4gKilcbigqIFNjYW4gYSBzdHJlYW0gYWNjb3JkaW5nIHRvIGEgZm9ybWF0IGFuZCByZWFkZXJzIG9idGFpbmVkIGJ5XG4gICB0YWtlX2Zvcm1hdF9yZWFkZXJzLCBhbmQgYWdncmVnYXRlIHNjYW5uZWQgdmFsdWVzIGludG8gYW5cbiAgIGhldGVyb2dlbmVvdXMgbGlzdC4gKilcbigqIFJldHVybiB0aGUgaGV0ZXJvZ2VuZW91cyBsaXN0IG9mIHNjYW5uZWQgdmFsdWVzLiAqKVxubGV0IHJlYyBtYWtlX3NjYW5mIDogdHlwZSBhIGMgZCBlIGYuXG4gICAgU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiAoYSwgU2Nhbm5pbmcuaW5fY2hhbm5lbCwgYywgZCwgZSwgZikgZm10IC0+XG4gICAgICAoZCwgZSkgaGV0ZXJfbGlzdCAtPiAoYSwgZikgaGV0ZXJfbGlzdCA9XG5mdW4gaWIgZm10IHJlYWRlcnMgLT4gbWF0Y2ggZm10IHdpdGhcbiAgfCBDaGFyIHJlc3QgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2hhciAwIGliIGluXG4gICAgbGV0IGMgPSB0b2tlbl9jaGFyIGliIGluXG4gICAgQ29ucyAoYywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgQ2FtbF9jaGFyIHJlc3QgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9jaGFyIDAgaWIgaW5cbiAgICBsZXQgYyA9IHRva2VuX2NoYXIgaWIgaW5cbiAgICBDb25zIChjLCBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVycylcblxuICB8IFN0cmluZyAocGFkLCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkpIC0+XG4gICAgbGV0IHN0cCwgc3RyID0gc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIChTb21lIHN0cCkgd2lkdGggaWIgaW5cbiAgICBsZXQgc3RyX3Jlc3QgPSBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHN0cl9yZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX3N0cmluZ1xuICB8IFN0cmluZyAocGFkLCBGb3JtYXR0aW5nX2dlbiAoT3Blbl90YWcgKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9zdHJpbmcgKFNvbWUgJ3snKSB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW5cbiAgICAgICAgICAgICAgICAgICB0b2tlbl9zdHJpbmdcbiAgfCBTdHJpbmcgKHBhZCwgRm9ybWF0dGluZ19nZW4gKE9wZW5fYm94IChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIChTb21lICdbJykgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuXG4gICAgICAgICAgICAgICAgICAgdG9rZW5fc3RyaW5nXG4gIHwgU3RyaW5nIChwYWQsIHJlc3QpIC0+XG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5fc3RyaW5nIE5vbmUgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIE5vX3ByZWNpc2lvbiBzY2FuIHRva2VuX3N0cmluZ1xuXG4gIHwgQ2FtbF9zdHJpbmcgKHBhZCwgcmVzdCkgLT5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9jYW1sX3N0cmluZyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgTm9fcHJlY2lzaW9uIHNjYW4gdG9rZW5fc3RyaW5nXG4gIHwgSW50IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9pbnQgYylcbiAgfCBJbnQzMiAoaWNvbnYsIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBsZXQgYyA9IGludGVnZXJfY29udmVyc2lvbl9vZl9jaGFyIChjaGFyX29mX2ljb252IGljb252KSBpblxuICAgIGxldCBzY2FuIHdpZHRoIF8gaWIgPSBzY2FuX2ludF9jb252ZXJzaW9uIGMgd2lkdGggaWIgaW5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2NhbiAodG9rZW5faW50MzIgYylcbiAgfCBOYXRpdmVpbnQgKGljb252LCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgbGV0IGMgPSBpbnRlZ2VyX2NvbnZlcnNpb25fb2ZfY2hhciAoY2hhcl9vZl9pY29udiBpY29udikgaW5cbiAgICBsZXQgc2NhbiB3aWR0aCBfIGliID0gc2Nhbl9pbnRfY29udmVyc2lvbiBjIHdpZHRoIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW4gKHRva2VuX25hdGl2ZWludCBjKVxuICB8IEludDY0IChpY29udiwgcGFkLCBwcmVjLCByZXN0KSAtPlxuICAgIGxldCBjID0gaW50ZWdlcl9jb252ZXJzaW9uX29mX2NoYXIgKGNoYXJfb2ZfaWNvbnYgaWNvbnYpIGluXG4gICAgbGV0IHNjYW4gd2lkdGggXyBpYiA9IHNjYW5faW50X2NvbnZlcnNpb24gYyB3aWR0aCBpYiBpblxuICAgIHBhZF9wcmVjX3NjYW5mIGliIHJlc3QgcmVhZGVycyBwYWQgcHJlYyBzY2FuICh0b2tlbl9pbnQ2NCBjKVxuICB8IEZsb2F0ICgoXywgKEZsb2F0X0YgfCBGbG9hdF9DRikpLCBwYWQsIHByZWMsIHJlc3QpIC0+XG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBwcmVjIHNjYW5fY2FtbF9mbG9hdCB0b2tlbl9mbG9hdFxuICB8IEZsb2F0ICgoXywgKEZsb2F0X2YgfCBGbG9hdF9lIHwgRmxvYXRfRSB8IEZsb2F0X2cgfCBGbG9hdF9HKSksXG4gICAgICAgICAgIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2Nhbl9mbG9hdCB0b2tlbl9mbG9hdFxuICB8IEZsb2F0ICgoXywgKEZsb2F0X2ggfCBGbG9hdF9IKSksIHBhZCwgcHJlYywgcmVzdCkgLT5cbiAgICBwYWRfcHJlY19zY2FuZiBpYiByZXN0IHJlYWRlcnMgcGFkIHByZWMgc2Nhbl9oZXhfZmxvYXQgdG9rZW5fZmxvYXRcbiAgfCBCb29sIChwYWQsIHJlc3QpIC0+XG4gICAgbGV0IHNjYW4gXyBfIGliID0gc2Nhbl9ib29sIGliIGluXG4gICAgcGFkX3ByZWNfc2NhbmYgaWIgcmVzdCByZWFkZXJzIHBhZCBOb19wcmVjaXNpb24gc2NhbiB0b2tlbl9ib29sXG4gIHwgQWxwaGEgXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlYVxcXCJcIlxuICB8IFRoZXRhIF8gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJXRcXFwiXCJcbiAgfCBDdXN0b20gXyAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlP1xcXCIgKGN1c3RvbSBjb252ZXJ0ZXIpXCJcbiAgfCBSZWFkZXIgZm10X3Jlc3QgLT5cbiAgICBiZWdpbiBtYXRjaCByZWFkZXJzIHdpdGhcbiAgICB8IENvbnMgKHJlYWRlciwgcmVhZGVyc19yZXN0KSAtPlxuICAgICAgICBsZXQgeCA9IHJlYWRlciBpYiBpblxuICAgICAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdF9yZXN0IHJlYWRlcnNfcmVzdClcbiAgICB8IE5pbCAtPlxuICAgICAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBtaXNzaW5nIHJlYWRlclwiXG4gICAgZW5kXG4gIHwgRmx1c2ggcmVzdCAtPlxuICAgIGlmIFNjYW5uaW5nLmVuZF9vZl9pbnB1dCBpYiB0aGVuIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG4gICAgZWxzZSBiYWRfaW5wdXQgXCJlbmQgb2YgaW5wdXQgbm90IGZvdW5kXCJcblxuICB8IFN0cmluZ19saXRlcmFsIChzdHIsIHJlc3QpIC0+XG4gICAgU3RyaW5nLml0ZXIgKGNoZWNrX2NoYXIgaWIpIHN0cjtcbiAgICBtYWtlX3NjYW5mIGliIHJlc3QgcmVhZGVyc1xuICB8IENoYXJfbGl0ZXJhbCAoY2hyLCByZXN0KSAtPlxuICAgIGNoZWNrX2NoYXIgaWIgY2hyO1xuICAgIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG5cbiAgfCBGb3JtYXRfYXJnIChwYWRfb3B0LCBmbXR0eSwgcmVzdCkgLT5cbiAgICBsZXQgXyA9IHNjYW5fY2FtbF9zdHJpbmcgKHdpZHRoX29mX3BhZF9vcHQgcGFkX29wdCkgaWIgaW5cbiAgICBsZXQgcyA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIGxldCBmbXQgPVxuICAgICAgdHJ5IGZvcm1hdF9vZl9zdHJpbmdfZm10dHkgcyBmbXR0eVxuICAgICAgd2l0aCBGYWlsdXJlIG1zZyAtPiBiYWRfaW5wdXQgbXNnXG4gICAgaW5cbiAgICBDb25zIChmbXQsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IEZvcm1hdF9zdWJzdCAocGFkX29wdCwgZm10dHksIHJlc3QpIC0+XG4gICAgbGV0IF8gPSBzY2FuX2NhbWxfc3RyaW5nICh3aWR0aF9vZl9wYWRfb3B0IHBhZF9vcHQpIGliIGluXG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgZm10LCBmbXQnID1cbiAgICAgIHRyeVxuICAgICAgICBsZXQgRm10X0VCQiBmbXQgPSBmbXRfZWJiX29mX3N0cmluZyBzIGluXG4gICAgICAgIGxldCBGbXRfRUJCIGZtdCcgPSBmbXRfZWJiX29mX3N0cmluZyBzIGluXG4gICAgICAgICgqIFRPRE86IGZpbmQgYSB3YXkgdG8gYXZvaWQgcmVwYXJzaW5nIHR3aWNlICopXG5cbiAgICAgICAgKCogVE9ETzogdGhlc2UgdHlwZS1jaGVja3MgYmVsb3cgKmNhbiogZmFpbCBiZWNhdXNlIG9mIHR5cGVcbiAgICAgICAgICAgYW1iaWd1aXR5IGluIHByZXNlbmNlIG9mIGlnbm9yZWQtcmVhZGVyczogXCIlX3IlZFwiIGFuZCBcIiVkJV9yXCJcbiAgICAgICAgICAgYXJlIHR5cGVkIGluIHRoZSBzYW1lIHdheS5cblxuICAgICAgICAgICAjIFNjYW5mLnNzY2FuZiBcIlxcXCIlX3IlZFxcXCIzXCIgXCIlKCVkJV9yJSlcIiBpZ25vcmVcbiAgICAgICAgICAgICAoZnVuIGZtdCBuIC0+IHN0cmluZ19vZl9mb3JtYXQgZm10LCBuKVxuICAgICAgICAgICBFeGNlcHRpb246IENhbWxpbnRlcm5hbEZvcm1hdC5UeXBlX21pc21hdGNoLlxuXG4gICAgICAgICAgIFdlIHNob3VsZCBwcm9wZXJseSBjYXRjaCB0aGlzIGV4Y2VwdGlvbi5cbiAgICAgICAgKilcbiAgICAgICAgdHlwZV9mb3JtYXQgZm10IChlcmFzZV9yZWwgZm10dHkpLFxuICAgICAgICB0eXBlX2Zvcm1hdCBmbXQnIChlcmFzZV9yZWwgKHN5bW0gZm10dHkpKVxuICAgICAgd2l0aCBGYWlsdXJlIG1zZyAtPiBiYWRfaW5wdXQgbXNnXG4gICAgaW5cbiAgICBDb25zIChGb3JtYXQgKGZtdCwgcyksXG4gICAgICAgICAgbWFrZV9zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnMpXG5cbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCBGb3JtYXR0aW5nX2xpdCAoZm10aW5nX2xpdCwgcmVzdCkpIC0+XG4gICAgbGV0IHN0cCwgc3RyID0gc3RvcHBlcl9vZl9mb3JtYXR0aW5nX2xpdCBmbXRpbmdfbGl0IGluXG4gICAgbGV0IHdpZHRoID0gd2lkdGhfb2ZfcGFkX29wdCB3aWR0aF9vcHQgaW5cbiAgICBzY2FuX2NoYXJzX2luX2NoYXJfc2V0IGNoYXJfc2V0IChTb21lIHN0cCkgd2lkdGggaWI7XG4gICAgbGV0IHMgPSB0b2tlbl9zdHJpbmcgaWIgaW5cbiAgICBsZXQgc3RyX3Jlc3QgPSBTdHJpbmdfbGl0ZXJhbCAoc3RyLCByZXN0KSBpblxuICAgIENvbnMgKHMsIG1ha2Vfc2NhbmYgaWIgc3RyX3Jlc3QgcmVhZGVycylcbiAgfCBTY2FuX2NoYXJfc2V0ICh3aWR0aF9vcHQsIGNoYXJfc2V0LCByZXN0KSAtPlxuICAgIGxldCB3aWR0aCA9IHdpZHRoX29mX3BhZF9vcHQgd2lkdGhfb3B0IGluXG4gICAgc2Nhbl9jaGFyc19pbl9jaGFyX3NldCBjaGFyX3NldCBOb25lIHdpZHRoIGliO1xuICAgIGxldCBzID0gdG9rZW5fc3RyaW5nIGliIGluXG4gICAgQ29ucyAocywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG4gIHwgU2Nhbl9nZXRfY291bnRlciAoY291bnRlciwgcmVzdCkgLT5cbiAgICBsZXQgY291bnQgPSBnZXRfY291bnRlciBpYiBjb3VudGVyIGluXG4gICAgQ29ucyAoY291bnQsIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzKVxuICB8IFNjYW5fbmV4dF9jaGFyIHJlc3QgLT5cbiAgICBsZXQgYyA9IFNjYW5uaW5nLmNoZWNrZWRfcGVla19jaGFyIGliIGluXG4gICAgQ29ucyAoYywgbWFrZV9zY2FuZiBpYiByZXN0IHJlYWRlcnMpXG5cbiAgfCBGb3JtYXR0aW5nX2xpdCAoZm9ybWF0dGluZ19saXQsIHJlc3QpIC0+XG4gICAgU3RyaW5nLml0ZXIgKGNoZWNrX2NoYXIgaWIpIChzdHJpbmdfb2ZfZm9ybWF0dGluZ19saXQgZm9ybWF0dGluZ19saXQpO1xuICAgIG1ha2Vfc2NhbmYgaWIgcmVzdCByZWFkZXJzXG4gIHwgRm9ybWF0dGluZ19nZW4gKE9wZW5fdGFnIChGb3JtYXQgKGZtdCcsIF8pKSwgcmVzdCkgLT5cbiAgICBjaGVja19jaGFyIGliICdAJzsgY2hlY2tfY2hhciBpYiAneyc7XG4gICAgbWFrZV9zY2FuZiBpYiAoY29uY2F0X2ZtdCBmbXQnIHJlc3QpIHJlYWRlcnNcbiAgfCBGb3JtYXR0aW5nX2dlbiAoT3Blbl9ib3ggKEZvcm1hdCAoZm10JywgXykpLCByZXN0KSAtPlxuICAgIGNoZWNrX2NoYXIgaWIgJ0AnOyBjaGVja19jaGFyIGliICdbJztcbiAgICBtYWtlX3NjYW5mIGliIChjb25jYXRfZm10IGZtdCcgcmVzdCkgcmVhZGVyc1xuXG4gIHwgSWdub3JlZF9wYXJhbSAoaWduLCByZXN0KSAtPlxuICAgIGxldCBQYXJhbV9mb3JtYXRfRUJCIGZtdCcgPSBwYXJhbV9mb3JtYXRfb2ZfaWdub3JlZF9mb3JtYXQgaWduIHJlc3QgaW5cbiAgICBiZWdpbiBtYXRjaCBtYWtlX3NjYW5mIGliIGZtdCcgcmVhZGVycyB3aXRoXG4gICAgfCBDb25zIChfLCBhcmdfcmVzdCkgLT4gYXJnX3Jlc3RcbiAgICB8IE5pbCAtPiBhc3NlcnQgZmFsc2VcbiAgICBlbmRcblxuICB8IEVuZF9vZl9mb3JtYXQgLT5cbiAgICBOaWxcblxuKCogQ2FzZSBhbmFseXNpcyBvbiBwYWRkaW5nIGFuZCBwcmVjaXNpb24uICopXG4oKiBSZWplY3QgZm9ybWF0cyBjb250YWluaW5nIFwiJSpcIiBvciBcIiUuKlwiLiAqKVxuKCogUGFzcyBwYWRkaW5nIGFuZCBwcmVjaXNpb24gdG8gdGhlIGdlbmVyaWMgc2Nhbm5lciBgc2NhbicuICopXG5hbmQgcGFkX3ByZWNfc2NhbmYgOiB0eXBlIGEgYyBkIGUgZiB4IHkgeiB0IC5cbiAgICBTY2FubmluZy5pbl9jaGFubmVsIC0+IChhLCBTY2FubmluZy5pbl9jaGFubmVsLCBjLCBkLCBlLCBmKSBmbXQgLT5cbiAgICAgIChkLCBlKSBoZXRlcl9saXN0IC0+ICh4LCB5KSBwYWRkaW5nIC0+ICh5LCB6IC0+IGEpIHByZWNpc2lvbiAtPlxuICAgICAgKGludCAtPiBpbnQgLT4gU2Nhbm5pbmcuaW5fY2hhbm5lbCAtPiB0KSAtPlxuICAgICAgKFNjYW5uaW5nLmluX2NoYW5uZWwgLT4geikgLT5cbiAgICAgICh4LCBmKSBoZXRlcl9saXN0ID1cbmZ1biBpYiBmbXQgcmVhZGVycyBwYWQgcHJlYyBzY2FuIHRva2VuIC0+IG1hdGNoIHBhZCwgcHJlYyB3aXRoXG4gIHwgTm9fcGFkZGluZywgTm9fcHJlY2lzaW9uIC0+XG4gICAgbGV0IF8gPSBzY2FuIG1heF9pbnQgbWF4X2ludCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IE5vX3BhZGRpbmcsIExpdF9wcmVjaXNpb24gcCAtPlxuICAgIGxldCBfID0gc2NhbiBtYXhfaW50IHAgaWIgaW5cbiAgICBsZXQgeCA9IHRva2VuIGliIGluXG4gICAgQ29ucyAoeCwgbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycylcbiAgfCBMaXRfcGFkZGluZyAoKFJpZ2h0IHwgWmVyb3MpLCB3KSwgTm9fcHJlY2lzaW9uIC0+XG4gICAgbGV0IF8gPSBzY2FuIHcgbWF4X2ludCBpYiBpblxuICAgIGxldCB4ID0gdG9rZW4gaWIgaW5cbiAgICBDb25zICh4LCBtYWtlX3NjYW5mIGliIGZtdCByZWFkZXJzKVxuICB8IExpdF9wYWRkaW5nICgoUmlnaHQgfCBaZXJvcyksIHcpLCBMaXRfcHJlY2lzaW9uIHAgLT5cbiAgICBsZXQgXyA9IHNjYW4gdyBwIGliIGluXG4gICAgbGV0IHggPSB0b2tlbiBpYiBpblxuICAgIENvbnMgKHgsIG1ha2Vfc2NhbmYgaWIgZm10IHJlYWRlcnMpXG4gIHwgTGl0X3BhZGRpbmcgKExlZnQsIF8pLCBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUtXFxcIlwiXG4gIHwgTGl0X3BhZGRpbmcgKChSaWdodCB8IFplcm9zKSwgXyksIEFyZ19wcmVjaXNpb24gLT5cbiAgICBpbnZhbGlkX2FyZyBcInNjYW5mOiBiYWQgY29udmVyc2lvbiBcXFwiJSpcXFwiXCJcbiAgfCBBcmdfcGFkZGluZyBfLCBfIC0+XG4gICAgaW52YWxpZF9hcmcgXCJzY2FuZjogYmFkIGNvbnZlcnNpb24gXFxcIiUqXFxcIlwiXG4gIHwgTm9fcGFkZGluZywgQXJnX3ByZWNpc2lvbiAtPlxuICAgIGludmFsaWRfYXJnIFwic2NhbmY6IGJhZCBjb252ZXJzaW9uIFxcXCIlKlxcXCJcIlxuXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuICAgICAgICAgICAgKCogRGVmaW5pbmcgW3NjYW5mXSBhbmQgdmFyaW91cyBmbGF2b3JzIG9mIFtzY2FuZl0gKilcblxubGV0IGtzY2FuZl9nZW4gaWIgZWYgYWYgKEZvcm1hdCAoZm10LCBzdHIpKSA9XG4gIGxldCByZWMgYXBwbHkgOiB0eXBlIGEgYiAuIGEgLT4gKGEsIGIpIGhldGVyX2xpc3QgLT4gYiA9XG4gICAgZnVuIGYgYXJncyAtPiBtYXRjaCBhcmdzIHdpdGhcbiAgICB8IENvbnMgKHgsIHIpIC0+IGFwcGx5IChmIHgpIHJcbiAgICB8IE5pbCAtPiBmXG4gIGluXG4gIGxldCBrIHJlYWRlcnMgZiA9XG4gICAgU2Nhbm5pbmcucmVzZXRfdG9rZW4gaWI7XG4gICAgbWF0Y2ggbWFrZV9zY2FuZiBpYiBmbXQgcmVhZGVycyB3aXRoXG4gICAgfCBleGNlcHRpb24gKFNjYW5fZmFpbHVyZSBfIHwgRmFpbHVyZSBfIHwgRW5kX29mX2ZpbGUgYXMgZXhjKSAtPlxuICAgICAgICBlZiBpYiBleGNcbiAgICB8IGV4Y2VwdGlvbiBJbnZhbGlkX2FyZ3VtZW50IG1zZyAtPlxuICAgICAgICBpbnZhbGlkX2FyZyAobXNnIF4gXCIgaW4gZm9ybWF0IFxcXCJcIiBeIFN0cmluZy5lc2NhcGVkIHN0ciBeIFwiXFxcIlwiKVxuICAgIHwgYXJncyAtPlxuICAgICAgICBhZiAoYXBwbHkgZiBhcmdzKVxuICBpblxuICB0YWtlX2Zvcm1hdF9yZWFkZXJzIGsgZm10XG5cbmxldCBrc2NhbmYgaWIgZWYgZm10ID1cbiAga3NjYW5mX2dlbiBpYiBlZiAoZnVuIHggLT4geCkgZm10XG5cbmxldCBrc2NhbmZfb3B0IGliIGZtdCA9XG4gIGtzY2FuZl9nZW4gaWIgKGZ1biBfIF8gLT4gTm9uZSkgKGZ1biB4IC0+IFNvbWUgeCkgZm10XG5cbigqKiopXG5cbmxldCBrYnNjYW5mID0ga3NjYW5mXG5sZXQgYnNjYW5mIGliIGZtdCA9IGtic2NhbmYgaWIgc2NhbmZfYmFkX2lucHV0IGZtdFxubGV0IGJzY2FuZl9vcHQgaWIgZm10ID0ga3NjYW5mX29wdCBpYiBmbXRcblxubGV0IGtzc2NhbmYgcyBlZiBmbXQgPSBrYnNjYW5mIChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBlZiBmbXRcbmxldCBzc2NhbmYgcyBmbXQgPSBrYnNjYW5mIChTY2FubmluZy5mcm9tX3N0cmluZyBzKSBzY2FuZl9iYWRfaW5wdXQgZm10XG5sZXQgc3NjYW5mX29wdCBzIGZtdCA9IGtzY2FuZl9vcHQgKFNjYW5uaW5nLmZyb21fc3RyaW5nIHMpIGZtdFxuXG5sZXQgc2NhbmYgZm10ID0ga3NjYW5mIFNjYW5uaW5nLnN0ZGluIHNjYW5mX2JhZF9pbnB1dCBmbXRcbmxldCBzY2FuZl9vcHQgZm10ID0ga3NjYW5mX29wdCBTY2FubmluZy5zdGRpbiBmbXRcblxuKCoqKilcblxuKCogU2Nhbm5pbmcgZm9ybWF0IHN0cmluZ3MuICopXG5sZXQgYnNjYW5mX2Zvcm1hdCA6XG4gIFNjYW5uaW5nLmluX2NoYW5uZWwgLT4gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT5cbiAgKCgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2IC0+ICdnKSAtPiAnZyA9XG4gIGZ1biBpYiBmb3JtYXQgZiAtPlxuICAgIGxldCBfID0gc2Nhbl9jYW1sX3N0cmluZyBtYXhfaW50IGliIGluXG4gICAgbGV0IHN0ciA9IHRva2VuX3N0cmluZyBpYiBpblxuICAgIGxldCBmbXQnID1cbiAgICAgIHRyeSBmb3JtYXRfb2Zfc3RyaW5nX2Zvcm1hdCBzdHIgZm9ybWF0XG4gICAgICB3aXRoIEZhaWx1cmUgbXNnIC0+IGJhZF9pbnB1dCBtc2cgaW5cbiAgICBmIGZtdCdcblxuXG5sZXQgc3NjYW5mX2Zvcm1hdCA6XG4gIHN0cmluZyAtPiAoJ2EsICdiLCAnYywgJ2QsICdlLCAnZikgZm9ybWF0NiAtPlxuICAoKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgLT4gJ2cpIC0+ICdnID1cbiAgZnVuIHMgZm9ybWF0IGYgLT4gYnNjYW5mX2Zvcm1hdCAoU2Nhbm5pbmcuZnJvbV9zdHJpbmcgcykgZm9ybWF0IGZcblxuXG5sZXQgZm9ybWF0X2Zyb21fc3RyaW5nIHMgZm10ID1cbiAgc3NjYW5mX2Zvcm1hdCAoXCJcXFwiXCIgXiBTdHJpbmcuZXNjYXBlZCBzIF4gXCJcXFwiXCIpIGZtdCAoZnVuIHggLT4geClcblxuXG5sZXQgdW5lc2NhcGVkIHMgPVxuICBzc2NhbmYgKFwiXFxcIlwiIF4gcyBeIFwiXFxcIlwiKSBcIiVTJSFcIiAoZnVuIHggLT4geClcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogUmVnaXN0ZXJpbmcgT0NhbWwgdmFsdWVzIHdpdGggdGhlIEMgcnVudGltZSBmb3IgbGF0ZXIgY2FsbGJhY2tzICopXG5cbmV4dGVybmFsIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIDogc3RyaW5nIC0+IE9iai50IC0+IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXCJjYW1sX3JlZ2lzdGVyX25hbWVkX3ZhbHVlXCJcblxubGV0IHJlZ2lzdGVyIG5hbWUgdiA9XG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIG5hbWUgKE9iai5yZXByIHYpXG5cbmxldCByZWdpc3Rlcl9leGNlcHRpb24gbmFtZSAoZXhuIDogZXhuKSA9XG4gIGxldCBleG4gPSBPYmoucmVwciBleG4gaW5cbiAgbGV0IHNsb3QgPSBpZiBPYmoudGFnIGV4biA9IE9iai5vYmplY3RfdGFnIHRoZW4gZXhuIGVsc2UgT2JqLmZpZWxkIGV4biAwIGluXG4gIHJlZ2lzdGVyX25hbWVkX3ZhbHVlIG5hbWUgc2xvdFxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgSmVyb21lIFZvdWlsbG9uLCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMjAwMiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG5vcGVuIE9ialxuXG4oKioqKiBPYmplY3QgcmVwcmVzZW50YXRpb24gKioqKilcblxuZXh0ZXJuYWwgc2V0X2lkOiAnYSAtPiAnYSA9IFwiY2FtbF9zZXRfb29faWRcIiBbQEBub2FsbG9jXVxuXG4oKioqKiBPYmplY3QgY29weSAqKioqKVxuXG5sZXQgY29weSBvID1cbiAgbGV0IG8gPSAoT2JqLm9iaiAoT2JqLmR1cCAoT2JqLnJlcHIgbykpKSBpblxuICBzZXRfaWQgb1xuXG4oKioqKiBDb21wcmVzc2lvbiBvcHRpb25zICoqKiopXG4oKiBQYXJhbWV0ZXJzICopXG50eXBlIHBhcmFtcyA9IHtcbiAgICBtdXRhYmxlIGNvbXBhY3RfdGFibGUgOiBib29sO1xuICAgIG11dGFibGUgY29weV9wYXJlbnQgOiBib29sO1xuICAgIG11dGFibGUgY2xlYW5fd2hlbl9jb3B5aW5nIDogYm9vbDtcbiAgICBtdXRhYmxlIHJldHJ5X2NvdW50IDogaW50O1xuICAgIG11dGFibGUgYnVja2V0X3NtYWxsX3NpemUgOiBpbnRcbiAgfVxuXG5sZXQgcGFyYW1zID0ge1xuICBjb21wYWN0X3RhYmxlID0gdHJ1ZTtcbiAgY29weV9wYXJlbnQgPSB0cnVlO1xuICBjbGVhbl93aGVuX2NvcHlpbmcgPSB0cnVlO1xuICByZXRyeV9jb3VudCA9IDM7XG4gIGJ1Y2tldF9zbWFsbF9zaXplID0gMTZcbn1cblxuKCoqKiogUGFyYW1ldGVycyAqKioqKVxuXG5sZXQgaW5pdGlhbF9vYmplY3Rfc2l6ZSA9IDJcblxuKCoqKiogSXRlbXMgKioqKilcblxudHlwZSBpdGVtID0gRHVtbXlBIHwgRHVtbXlCIHwgRHVtbXlDIG9mIGludFxubGV0IF8gPSBbRHVtbXlBOyBEdW1teUI7IER1bW15QyAwXSAoKiB0byBhdm9pZCB3YXJuaW5ncyAqKVxuXG5sZXQgZHVtbXlfaXRlbSA9IChtYWdpYyAoKSA6IGl0ZW0pXG5cbigqKioqIFR5cGVzICoqKiopXG5cbnR5cGUgdGFnXG50eXBlIGxhYmVsID0gaW50XG50eXBlIGNsb3N1cmUgPSBpdGVtXG50eXBlIHQgPSBEdW1teUEgfCBEdW1teUIgfCBEdW1teUMgb2YgaW50XG5sZXQgXyA9IFtEdW1teUE7IER1bW15QjsgRHVtbXlDIDBdICgqIHRvIGF2b2lkIHdhcm5pbmdzICopXG5cbnR5cGUgb2JqID0gdCBhcnJheVxuZXh0ZXJuYWwgcmV0IDogKG9iaiAtPiAnYSkgLT4gY2xvc3VyZSA9IFwiJWlkZW50aXR5XCJcblxuKCoqKiogTGFiZWxzICoqKiopXG5cbmxldCBwdWJsaWNfbWV0aG9kX2xhYmVsIHMgOiB0YWcgPVxuICBsZXQgYWNjdSA9IHJlZiAwIGluXG4gIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgYWNjdSA6PSAyMjMgKiAhYWNjdSArIENoYXIuY29kZSBzLltpXVxuICBkb25lO1xuICAoKiByZWR1Y2UgdG8gMzEgYml0cyAqKVxuICBhY2N1IDo9ICFhY2N1IGxhbmQgKDEgbHNsIDMxIC0gMSk7XG4gICgqIG1ha2UgaXQgc2lnbmVkIGZvciA2NCBiaXRzIGFyY2hpdGVjdHVyZXMgKilcbiAgbGV0IHRhZyA9IGlmICFhY2N1ID4gMHgzRkZGRkZGRiB0aGVuICFhY2N1IC0gKDEgbHNsIDMxKSBlbHNlICFhY2N1IGluXG4gICgqIFByaW50Zi5lcHJpbnRmIFwiJXMgPSAlZFxcblwiIHMgdGFnOyBmbHVzaCBzdGRlcnI7ICopXG4gIG1hZ2ljIHRhZ1xuXG4oKioqKiBTcGFyc2UgYXJyYXkgKioqKilcblxubW9kdWxlIFZhcnMgPVxuICBNYXAuTWFrZShzdHJ1Y3QgdHlwZSB0ID0gc3RyaW5nIGxldCBjb21wYXJlICh4OnQpIHkgPSBjb21wYXJlIHggeSBlbmQpXG50eXBlIHZhcnMgPSBpbnQgVmFycy50XG5cbm1vZHVsZSBNZXRocyA9XG4gIE1hcC5NYWtlKHN0cnVjdCB0eXBlIHQgPSBzdHJpbmcgbGV0IGNvbXBhcmUgKHg6dCkgeSA9IGNvbXBhcmUgeCB5IGVuZClcbnR5cGUgbWV0aHMgPSBsYWJlbCBNZXRocy50XG5tb2R1bGUgTGFicyA9XG4gIE1hcC5NYWtlKHN0cnVjdCB0eXBlIHQgPSBsYWJlbCBsZXQgY29tcGFyZSAoeDp0KSB5ID0gY29tcGFyZSB4IHkgZW5kKVxudHlwZSBsYWJzID0gYm9vbCBMYWJzLnRcblxuKCogVGhlIGNvbXBpbGVyIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgZmllbGQgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgW3NpemVdLiAqKVxudHlwZSB0YWJsZSA9XG4geyBtdXRhYmxlIHNpemU6IGludDtcbiAgIG11dGFibGUgbWV0aG9kczogY2xvc3VyZSBhcnJheTtcbiAgIG11dGFibGUgbWV0aG9kc19ieV9uYW1lOiBtZXRocztcbiAgIG11dGFibGUgbWV0aG9kc19ieV9sYWJlbDogbGFicztcbiAgIG11dGFibGUgcHJldmlvdXNfc3RhdGVzOlxuICAgICAobWV0aHMgKiBsYWJzICogKGxhYmVsICogaXRlbSkgbGlzdCAqIHZhcnMgKlxuICAgICAgbGFiZWwgbGlzdCAqIHN0cmluZyBsaXN0KSBsaXN0O1xuICAgbXV0YWJsZSBoaWRkZW5fbWV0aHM6IChsYWJlbCAqIGl0ZW0pIGxpc3Q7XG4gICBtdXRhYmxlIHZhcnM6IHZhcnM7XG4gICBtdXRhYmxlIGluaXRpYWxpemVyczogKG9iaiAtPiB1bml0KSBsaXN0IH1cblxubGV0IGR1bW15X3RhYmxlID1cbiAgeyBtZXRob2RzID0gW3wgZHVtbXlfaXRlbSB8XTtcbiAgICBtZXRob2RzX2J5X25hbWUgPSBNZXRocy5lbXB0eTtcbiAgICBtZXRob2RzX2J5X2xhYmVsID0gTGFicy5lbXB0eTtcbiAgICBwcmV2aW91c19zdGF0ZXMgPSBbXTtcbiAgICBoaWRkZW5fbWV0aHMgPSBbXTtcbiAgICB2YXJzID0gVmFycy5lbXB0eTtcbiAgICBpbml0aWFsaXplcnMgPSBbXTtcbiAgICBzaXplID0gMCB9XG5cbmxldCB0YWJsZV9jb3VudCA9IHJlZiAwXG5cbigqIGR1bW15X21ldCBzaG91bGQgYmUgYSBwb2ludGVyLCBzbyB1c2UgYW4gYXRvbSAqKVxubGV0IGR1bW15X21ldCA6IGl0ZW0gPSBvYmogKE9iai5uZXdfYmxvY2sgMCAwKVxuKCogaWYgZGVidWdnaW5nIGlzIG5lZWRlZCwgdGhpcyBjb3VsZCBiZSBhIGdvb2QgaWRlYTogKilcbigqIGxldCBkdW1teV9tZXQgKCkgPSBmYWlsd2l0aCBcIlVuZGVmaW5lZCBtZXRob2RcIiAqKVxuXG5sZXQgcmVjIGZpdF9zaXplIG4gPVxuICBpZiBuIDw9IDIgdGhlbiBuIGVsc2VcbiAgZml0X3NpemUgKChuKzEpLzIpICogMlxuXG5sZXQgbmV3X3RhYmxlIHB1Yl9sYWJlbHMgPVxuICBpbmNyIHRhYmxlX2NvdW50O1xuICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHB1Yl9sYWJlbHMgaW5cbiAgbGV0IG1ldGhvZHMgPSBBcnJheS5tYWtlIChsZW4qMisyKSBkdW1teV9tZXQgaW5cbiAgbWV0aG9kcy4oMCkgPC0gbWFnaWMgbGVuO1xuICBtZXRob2RzLigxKSA8LSBtYWdpYyAoZml0X3NpemUgbGVuICogU3lzLndvcmRfc2l6ZSAvIDggLSAxKTtcbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG8gbWV0aG9kcy4oaSoyKzMpIDwtIG1hZ2ljIHB1Yl9sYWJlbHMuKGkpIGRvbmU7XG4gIHsgbWV0aG9kcyA9IG1ldGhvZHM7XG4gICAgbWV0aG9kc19ieV9uYW1lID0gTWV0aHMuZW1wdHk7XG4gICAgbWV0aG9kc19ieV9sYWJlbCA9IExhYnMuZW1wdHk7XG4gICAgcHJldmlvdXNfc3RhdGVzID0gW107XG4gICAgaGlkZGVuX21ldGhzID0gW107XG4gICAgdmFycyA9IFZhcnMuZW1wdHk7XG4gICAgaW5pdGlhbGl6ZXJzID0gW107XG4gICAgc2l6ZSA9IGluaXRpYWxfb2JqZWN0X3NpemUgfVxuXG5sZXQgcmVzaXplIGFycmF5IG5ld19zaXplID1cbiAgbGV0IG9sZF9zaXplID0gQXJyYXkubGVuZ3RoIGFycmF5Lm1ldGhvZHMgaW5cbiAgaWYgbmV3X3NpemUgPiBvbGRfc2l6ZSB0aGVuIGJlZ2luXG4gICAgbGV0IG5ld19idWNrID0gQXJyYXkubWFrZSBuZXdfc2l6ZSBkdW1teV9tZXQgaW5cbiAgICBBcnJheS5ibGl0IGFycmF5Lm1ldGhvZHMgMCBuZXdfYnVjayAwIG9sZF9zaXplO1xuICAgIGFycmF5Lm1ldGhvZHMgPC0gbmV3X2J1Y2tcbiBlbmRcblxubGV0IHB1dCBhcnJheSBsYWJlbCBlbGVtZW50ID1cbiAgcmVzaXplIGFycmF5IChsYWJlbCArIDEpO1xuICBhcnJheS5tZXRob2RzLihsYWJlbCkgPC0gZWxlbWVudFxuXG4oKioqKiBDbGFzc2VzICoqKiopXG5cbmxldCBtZXRob2RfY291bnQgPSByZWYgMFxubGV0IGluc3RfdmFyX2NvdW50ID0gcmVmIDBcblxuKCogdHlwZSB0ICopXG50eXBlIG1ldGggPSBpdGVtXG5cbmxldCBuZXdfbWV0aG9kIHRhYmxlID1cbiAgbGV0IGluZGV4ID0gQXJyYXkubGVuZ3RoIHRhYmxlLm1ldGhvZHMgaW5cbiAgcmVzaXplIHRhYmxlIChpbmRleCArIDEpO1xuICBpbmRleFxuXG5sZXQgZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSBuYW1lID1cbiAgdHJ5XG4gICAgTWV0aHMuZmluZCBuYW1lIHRhYmxlLm1ldGhvZHNfYnlfbmFtZVxuICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgIGxldCBsYWJlbCA9IG5ld19tZXRob2QgdGFibGUgaW5cbiAgICB0YWJsZS5tZXRob2RzX2J5X25hbWUgPC0gTWV0aHMuYWRkIG5hbWUgbGFiZWwgdGFibGUubWV0aG9kc19ieV9uYW1lO1xuICAgIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gTGFicy5hZGQgbGFiZWwgdHJ1ZSB0YWJsZS5tZXRob2RzX2J5X2xhYmVsO1xuICAgIGxhYmVsXG5cbmxldCBnZXRfbWV0aG9kX2xhYmVscyB0YWJsZSBuYW1lcyA9XG4gIEFycmF5Lm1hcCAoZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSkgbmFtZXNcblxubGV0IHNldF9tZXRob2QgdGFibGUgbGFiZWwgZWxlbWVudCA9XG4gIGluY3IgbWV0aG9kX2NvdW50O1xuICBpZiBMYWJzLmZpbmQgbGFiZWwgdGFibGUubWV0aG9kc19ieV9sYWJlbCB0aGVuXG4gICAgcHV0IHRhYmxlIGxhYmVsIGVsZW1lbnRcbiAgZWxzZVxuICAgIHRhYmxlLmhpZGRlbl9tZXRocyA8LSAobGFiZWwsIGVsZW1lbnQpIDo6IHRhYmxlLmhpZGRlbl9tZXRoc1xuXG5sZXQgZ2V0X21ldGhvZCB0YWJsZSBsYWJlbCA9XG4gIHRyeSBMaXN0LmFzc29jIGxhYmVsIHRhYmxlLmhpZGRlbl9tZXRoc1xuICB3aXRoIE5vdF9mb3VuZCAtPiB0YWJsZS5tZXRob2RzLihsYWJlbClcblxubGV0IHRvX2xpc3QgYXJyID1cbiAgaWYgYXJyID09IG1hZ2ljIDAgdGhlbiBbXSBlbHNlIEFycmF5LnRvX2xpc3QgYXJyXG5cbmxldCBuYXJyb3cgdGFibGUgdmFycyB2aXJ0X21ldGhzIGNvbmNyX21ldGhzID1cbiAgbGV0IHZhcnMgPSB0b19saXN0IHZhcnNcbiAgYW5kIHZpcnRfbWV0aHMgPSB0b19saXN0IHZpcnRfbWV0aHNcbiAgYW5kIGNvbmNyX21ldGhzID0gdG9fbGlzdCBjb25jcl9tZXRocyBpblxuICBsZXQgdmlydF9tZXRoX2xhYnMgPSBMaXN0Lm1hcCAoZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSkgdmlydF9tZXRocyBpblxuICBsZXQgY29uY3JfbWV0aF9sYWJzID0gTGlzdC5tYXAgKGdldF9tZXRob2RfbGFiZWwgdGFibGUpIGNvbmNyX21ldGhzIGluXG4gIHRhYmxlLnByZXZpb3VzX3N0YXRlcyA8LVxuICAgICAodGFibGUubWV0aG9kc19ieV9uYW1lLCB0YWJsZS5tZXRob2RzX2J5X2xhYmVsLCB0YWJsZS5oaWRkZW5fbWV0aHMsXG4gICAgICB0YWJsZS52YXJzLCB2aXJ0X21ldGhfbGFicywgdmFycylcbiAgICAgOjogdGFibGUucHJldmlvdXNfc3RhdGVzO1xuICB0YWJsZS52YXJzIDwtXG4gICAgVmFycy5mb2xkXG4gICAgICAoZnVuIGxhYiBpbmZvIHR2YXJzIC0+XG4gICAgICAgIGlmIExpc3QubWVtIGxhYiB2YXJzIHRoZW4gVmFycy5hZGQgbGFiIGluZm8gdHZhcnMgZWxzZSB0dmFycylcbiAgICAgIHRhYmxlLnZhcnMgVmFycy5lbXB0eTtcbiAgbGV0IGJ5X25hbWUgPSByZWYgTWV0aHMuZW1wdHkgaW5cbiAgbGV0IGJ5X2xhYmVsID0gcmVmIExhYnMuZW1wdHkgaW5cbiAgTGlzdC5pdGVyMlxuICAgIChmdW4gbWV0IGxhYmVsIC0+XG4gICAgICAgYnlfbmFtZSA6PSBNZXRocy5hZGQgbWV0IGxhYmVsICFieV9uYW1lO1xuICAgICAgIGJ5X2xhYmVsIDo9XG4gICAgICAgICAgTGFicy5hZGQgbGFiZWxcbiAgICAgICAgICAgICh0cnkgTGFicy5maW5kIGxhYmVsIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgd2l0aCBOb3RfZm91bmQgLT4gdHJ1ZSlcbiAgICAgICAgICAgICFieV9sYWJlbClcbiAgICBjb25jcl9tZXRocyBjb25jcl9tZXRoX2xhYnM7XG4gIExpc3QuaXRlcjJcbiAgICAoZnVuIG1ldCBsYWJlbCAtPlxuICAgICAgIGJ5X25hbWUgOj0gTWV0aHMuYWRkIG1ldCBsYWJlbCAhYnlfbmFtZTtcbiAgICAgICBieV9sYWJlbCA6PSBMYWJzLmFkZCBsYWJlbCBmYWxzZSAhYnlfbGFiZWwpXG4gICAgdmlydF9tZXRocyB2aXJ0X21ldGhfbGFicztcbiAgdGFibGUubWV0aG9kc19ieV9uYW1lIDwtICFieV9uYW1lO1xuICB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIDwtICFieV9sYWJlbDtcbiAgdGFibGUuaGlkZGVuX21ldGhzIDwtXG4gICAgIExpc3QuZm9sZF9yaWdodFxuICAgICAgIChmdW4gKChsYWIsIF8pIGFzIG1ldCkgaG0gLT5cbiAgICAgICAgICBpZiBMaXN0Lm1lbSBsYWIgdmlydF9tZXRoX2xhYnMgdGhlbiBobSBlbHNlIG1ldDo6aG0pXG4gICAgICAgdGFibGUuaGlkZGVuX21ldGhzXG4gICAgICAgW11cblxubGV0IHdpZGVuIHRhYmxlID1cbiAgbGV0IChieV9uYW1lLCBieV9sYWJlbCwgc2F2ZWRfaGlkZGVuX21ldGhzLCBzYXZlZF92YXJzLCB2aXJ0X21ldGhzLCB2YXJzKSA9XG4gICAgTGlzdC5oZCB0YWJsZS5wcmV2aW91c19zdGF0ZXNcbiAgaW5cbiAgdGFibGUucHJldmlvdXNfc3RhdGVzIDwtIExpc3QudGwgdGFibGUucHJldmlvdXNfc3RhdGVzO1xuICB0YWJsZS52YXJzIDwtXG4gICAgIExpc3QuZm9sZF9sZWZ0XG4gICAgICAgKGZ1biBzIHYgLT4gVmFycy5hZGQgdiAoVmFycy5maW5kIHYgdGFibGUudmFycykgcylcbiAgICAgICBzYXZlZF92YXJzIHZhcnM7XG4gIHRhYmxlLm1ldGhvZHNfYnlfbmFtZSA8LSBieV9uYW1lO1xuICB0YWJsZS5tZXRob2RzX2J5X2xhYmVsIDwtIGJ5X2xhYmVsO1xuICB0YWJsZS5oaWRkZW5fbWV0aHMgPC1cbiAgICAgTGlzdC5mb2xkX3JpZ2h0XG4gICAgICAgKGZ1biAoKGxhYiwgXykgYXMgbWV0KSBobSAtPlxuICAgICAgICAgIGlmIExpc3QubWVtIGxhYiB2aXJ0X21ldGhzIHRoZW4gaG0gZWxzZSBtZXQ6OmhtKVxuICAgICAgIHRhYmxlLmhpZGRlbl9tZXRoc1xuICAgICAgIHNhdmVkX2hpZGRlbl9tZXRoc1xuXG5sZXQgbmV3X3Nsb3QgdGFibGUgPVxuICBsZXQgaW5kZXggPSB0YWJsZS5zaXplIGluXG4gIHRhYmxlLnNpemUgPC0gaW5kZXggKyAxO1xuICBpbmRleFxuXG5sZXQgbmV3X3ZhcmlhYmxlIHRhYmxlIG5hbWUgPVxuICB0cnkgVmFycy5maW5kIG5hbWUgdGFibGUudmFyc1xuICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgIGxldCBpbmRleCA9IG5ld19zbG90IHRhYmxlIGluXG4gICAgaWYgbmFtZSA8PiBcIlwiIHRoZW4gdGFibGUudmFycyA8LSBWYXJzLmFkZCBuYW1lIGluZGV4IHRhYmxlLnZhcnM7XG4gICAgaW5kZXhcblxubGV0IHRvX2FycmF5IGFyciA9XG4gIGlmIGFyciA9IE9iai5tYWdpYyAwIHRoZW4gW3x8XSBlbHNlIGFyclxuXG5sZXQgbmV3X21ldGhvZHNfdmFyaWFibGVzIHRhYmxlIG1ldGhzIHZhbHMgPVxuICBsZXQgbWV0aHMgPSB0b19hcnJheSBtZXRocyBpblxuICBsZXQgbm1ldGhzID0gQXJyYXkubGVuZ3RoIG1ldGhzIGFuZCBudmFscyA9IEFycmF5Lmxlbmd0aCB2YWxzIGluXG4gIGxldCByZXMgPSBBcnJheS5tYWtlIChubWV0aHMgKyBudmFscykgMCBpblxuICBmb3IgaSA9IDAgdG8gbm1ldGhzIC0gMSBkb1xuICAgIHJlcy4oaSkgPC0gZ2V0X21ldGhvZF9sYWJlbCB0YWJsZSBtZXRocy4oaSlcbiAgZG9uZTtcbiAgZm9yIGkgPSAwIHRvIG52YWxzIC0gMSBkb1xuICAgIHJlcy4oaStubWV0aHMpIDwtIG5ld192YXJpYWJsZSB0YWJsZSB2YWxzLihpKVxuICBkb25lO1xuICByZXNcblxubGV0IGdldF92YXJpYWJsZSB0YWJsZSBuYW1lID1cbiAgdHJ5IFZhcnMuZmluZCBuYW1lIHRhYmxlLnZhcnMgd2l0aCBOb3RfZm91bmQgLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBnZXRfdmFyaWFibGVzIHRhYmxlIG5hbWVzID1cbiAgQXJyYXkubWFwIChnZXRfdmFyaWFibGUgdGFibGUpIG5hbWVzXG5cbmxldCBhZGRfaW5pdGlhbGl6ZXIgdGFibGUgZiA9XG4gIHRhYmxlLmluaXRpYWxpemVycyA8LSBmOjp0YWJsZS5pbml0aWFsaXplcnNcblxuKCpcbm1vZHVsZSBLZXlzID1cbiAgTWFwLk1ha2Uoc3RydWN0IHR5cGUgdCA9IHRhZyBhcnJheSBsZXQgY29tcGFyZSAoeDp0KSB5ID0gY29tcGFyZSB4IHkgZW5kKVxubGV0IGtleV9tYXAgPSByZWYgS2V5cy5lbXB0eVxubGV0IGdldF9rZXkgdGFncyA6IGl0ZW0gPVxuICB0cnkgbWFnaWMgKEtleXMuZmluZCB0YWdzICFrZXlfbWFwIDogdGFnIGFycmF5KVxuICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgIGtleV9tYXAgOj0gS2V5cy5hZGQgdGFncyB0YWdzICFrZXlfbWFwO1xuICAgIG1hZ2ljIHRhZ3NcbiopXG5cbmxldCBjcmVhdGVfdGFibGUgcHVibGljX21ldGhvZHMgPVxuICBpZiBwdWJsaWNfbWV0aG9kcyA9PSBtYWdpYyAwIHRoZW4gbmV3X3RhYmxlIFt8fF0gZWxzZVxuICAoKiBbcHVibGljX21ldGhvZHNdIG11c3QgYmUgaW4gYXNjZW5kaW5nIG9yZGVyIGZvciBieXRlY29kZSAqKVxuICBsZXQgdGFncyA9IEFycmF5Lm1hcCBwdWJsaWNfbWV0aG9kX2xhYmVsIHB1YmxpY19tZXRob2RzIGluXG4gIGxldCB0YWJsZSA9IG5ld190YWJsZSB0YWdzIGluXG4gIEFycmF5Lml0ZXJpXG4gICAgKGZ1biBpIG1ldCAtPlxuICAgICAgbGV0IGxhYiA9IGkqMisyIGluXG4gICAgICB0YWJsZS5tZXRob2RzX2J5X25hbWUgIDwtIE1ldGhzLmFkZCBtZXQgbGFiIHRhYmxlLm1ldGhvZHNfYnlfbmFtZTtcbiAgICAgIHRhYmxlLm1ldGhvZHNfYnlfbGFiZWwgPC0gTGFicy5hZGQgbGFiIHRydWUgdGFibGUubWV0aG9kc19ieV9sYWJlbClcbiAgICBwdWJsaWNfbWV0aG9kcztcbiAgdGFibGVcblxubGV0IGluaXRfY2xhc3MgdGFibGUgPVxuICBpbnN0X3Zhcl9jb3VudCA6PSAhaW5zdF92YXJfY291bnQgKyB0YWJsZS5zaXplIC0gMTtcbiAgdGFibGUuaW5pdGlhbGl6ZXJzIDwtIExpc3QucmV2IHRhYmxlLmluaXRpYWxpemVycztcbiAgcmVzaXplIHRhYmxlICgzICsgbWFnaWMgdGFibGUubWV0aG9kcy4oMSkgKiAxNiAvIFN5cy53b3JkX3NpemUpXG5cbmxldCBpbmhlcml0cyBjbGEgdmFscyB2aXJ0X21ldGhzIGNvbmNyX21ldGhzIChfLCBzdXBlciwgXywgZW52KSB0b3AgPVxuICBuYXJyb3cgY2xhIHZhbHMgdmlydF9tZXRocyBjb25jcl9tZXRocztcbiAgbGV0IGluaXQgPVxuICAgIGlmIHRvcCB0aGVuIHN1cGVyIGNsYSBlbnYgZWxzZSBPYmoucmVwciAoc3VwZXIgY2xhKSBpblxuICB3aWRlbiBjbGE7XG4gIEFycmF5LmNvbmNhdFxuICAgIFtbfCByZXByIGluaXQgfF07XG4gICAgIG1hZ2ljIChBcnJheS5tYXAgKGdldF92YXJpYWJsZSBjbGEpICh0b19hcnJheSB2YWxzKSA6IGludCBhcnJheSk7XG4gICAgIEFycmF5Lm1hcFxuICAgICAgIChmdW4gbm0gLT4gcmVwciAoZ2V0X21ldGhvZCBjbGEgKGdldF9tZXRob2RfbGFiZWwgY2xhIG5tKSA6IGNsb3N1cmUpKVxuICAgICAgICh0b19hcnJheSBjb25jcl9tZXRocykgXVxuXG5sZXQgbWFrZV9jbGFzcyBwdWJfbWV0aHMgY2xhc3NfaW5pdCA9XG4gIGxldCB0YWJsZSA9IGNyZWF0ZV90YWJsZSBwdWJfbWV0aHMgaW5cbiAgbGV0IGVudl9pbml0ID0gY2xhc3NfaW5pdCB0YWJsZSBpblxuICBpbml0X2NsYXNzIHRhYmxlO1xuICAoZW52X2luaXQgKE9iai5yZXByIDApLCBjbGFzc19pbml0LCBlbnZfaW5pdCwgT2JqLnJlcHIgMClcblxudHlwZSBpbml0X3RhYmxlID0geyBtdXRhYmxlIGVudl9pbml0OiB0OyBtdXRhYmxlIGNsYXNzX2luaXQ6IHRhYmxlIC0+IHQgfVxuW0BAd2FybmluZyBcIi11bnVzZWQtZmllbGRcIl1cblxubGV0IG1ha2VfY2xhc3Nfc3RvcmUgcHViX21ldGhzIGNsYXNzX2luaXQgaW5pdF90YWJsZSA9XG4gIGxldCB0YWJsZSA9IGNyZWF0ZV90YWJsZSBwdWJfbWV0aHMgaW5cbiAgbGV0IGVudl9pbml0ID0gY2xhc3NfaW5pdCB0YWJsZSBpblxuICBpbml0X2NsYXNzIHRhYmxlO1xuICBpbml0X3RhYmxlLmNsYXNzX2luaXQgPC0gY2xhc3NfaW5pdDtcbiAgaW5pdF90YWJsZS5lbnZfaW5pdCA8LSBlbnZfaW5pdFxuXG5sZXQgZHVtbXlfY2xhc3MgbG9jID1cbiAgbGV0IHVuZGVmID0gZnVuIF8gLT4gcmFpc2UgKFVuZGVmaW5lZF9yZWN1cnNpdmVfbW9kdWxlIGxvYykgaW5cbiAgKE9iai5tYWdpYyB1bmRlZiwgdW5kZWYsIHVuZGVmLCBPYmoucmVwciAwKVxuXG4oKioqKiBPYmplY3RzICoqKiopXG5cbmxldCBjcmVhdGVfb2JqZWN0IHRhYmxlID1cbiAgKCogWFhYIEFwcGVsIGRlIFtvYmpfYmxvY2tdIHwgQ2FsbCB0byBbb2JqX2Jsb2NrXSAgKilcbiAgbGV0IG9iaiA9IE9iai5uZXdfYmxvY2sgT2JqLm9iamVjdF90YWcgdGFibGUuc2l6ZSBpblxuICAoKiBYWFggQXBwZWwgZGUgW2NhbWxfbW9kaWZ5XSB8IENhbGwgdG8gW2NhbWxfbW9kaWZ5XSAqKVxuICBPYmouc2V0X2ZpZWxkIG9iaiAwIChPYmoucmVwciB0YWJsZS5tZXRob2RzKTtcbiAgT2JqLm9iaiAoc2V0X2lkIG9iailcblxubGV0IGNyZWF0ZV9vYmplY3Rfb3B0IG9ial8wIHRhYmxlID1cbiAgaWYgKE9iai5tYWdpYyBvYmpfMCA6IGJvb2wpIHRoZW4gb2JqXzAgZWxzZSBiZWdpblxuICAgICgqIFhYWCBBcHBlbCBkZSBbb2JqX2Jsb2NrXSB8IENhbGwgdG8gW29ial9ibG9ja10gICopXG4gICAgbGV0IG9iaiA9IE9iai5uZXdfYmxvY2sgT2JqLm9iamVjdF90YWcgdGFibGUuc2l6ZSBpblxuICAgICgqIFhYWCBBcHBlbCBkZSBbY2FtbF9tb2RpZnldIHwgQ2FsbCB0byBbY2FtbF9tb2RpZnldICopXG4gICAgT2JqLnNldF9maWVsZCBvYmogMCAoT2JqLnJlcHIgdGFibGUubWV0aG9kcyk7XG4gICAgT2JqLm9iaiAoc2V0X2lkIG9iailcbiAgZW5kXG5cbmxldCByZWMgaXRlcl9mIG9iaiA9XG4gIGZ1bmN0aW9uXG4gICAgW10gICAtPiAoKVxuICB8IGY6OmwgLT4gZiBvYmo7IGl0ZXJfZiBvYmogbFxuXG5sZXQgcnVuX2luaXRpYWxpemVycyBvYmogdGFibGUgPVxuICBsZXQgaW5pdHMgPSB0YWJsZS5pbml0aWFsaXplcnMgaW5cbiAgaWYgaW5pdHMgPD4gW10gdGhlblxuICAgIGl0ZXJfZiBvYmogaW5pdHNcblxubGV0IHJ1bl9pbml0aWFsaXplcnNfb3B0IG9ial8wIG9iaiB0YWJsZSA9XG4gIGlmIChPYmoubWFnaWMgb2JqXzAgOiBib29sKSB0aGVuIG9iaiBlbHNlIGJlZ2luXG4gICAgbGV0IGluaXRzID0gdGFibGUuaW5pdGlhbGl6ZXJzIGluXG4gICAgaWYgaW5pdHMgPD4gW10gdGhlbiBpdGVyX2Ygb2JqIGluaXRzO1xuICAgIG9ialxuICBlbmRcblxubGV0IGNyZWF0ZV9vYmplY3RfYW5kX3J1bl9pbml0aWFsaXplcnMgb2JqXzAgdGFibGUgPVxuICBpZiAoT2JqLm1hZ2ljIG9ial8wIDogYm9vbCkgdGhlbiBvYmpfMCBlbHNlIGJlZ2luXG4gICAgbGV0IG9iaiA9IGNyZWF0ZV9vYmplY3QgdGFibGUgaW5cbiAgICBydW5faW5pdGlhbGl6ZXJzIG9iaiB0YWJsZTtcbiAgICBvYmpcbiAgZW5kXG5cbigqIEVxdWl2YWxlbnQgcHJpbWl0aXZlIGJlbG93XG5sZXQgc2VuZHNlbGYgb2JqIGxhYiA9XG4gIChtYWdpYyBvYmogOiAob2JqIC0+IHQpIGFycmF5IGFycmF5KS4oMCkuKGxhYikgb2JqXG4qKVxuZXh0ZXJuYWwgc2VuZCA6IG9iaiAtPiB0YWcgLT4gJ2EgPSBcIiVzZW5kXCJcbmV4dGVybmFsIHNlbmRjYWNoZSA6IG9iaiAtPiB0YWcgLT4gdCAtPiBpbnQgLT4gJ2EgPSBcIiVzZW5kY2FjaGVcIlxuZXh0ZXJuYWwgc2VuZHNlbGYgOiBvYmogLT4gbGFiZWwgLT4gJ2EgPSBcIiVzZW5kc2VsZlwiXG5leHRlcm5hbCBnZXRfcHVibGljX21ldGhvZCA6IG9iaiAtPiB0YWcgLT4gY2xvc3VyZVxuICAgID0gXCJjYW1sX2dldF9wdWJsaWNfbWV0aG9kXCIgW0BAbm9hbGxvY11cblxuKCoqKiogdGFibGUgY29sbGVjdGlvbiBhY2Nlc3MgKioqKilcblxudHlwZSB0YWJsZXMgPVxuICB8IEVtcHR5XG4gIHwgQ29ucyBvZiB7a2V5IDogY2xvc3VyZTsgbXV0YWJsZSBkYXRhOiB0YWJsZXM7IG11dGFibGUgbmV4dDogdGFibGVzfVxuXG5sZXQgc2V0X2RhdGEgdGFibGVzIHYgPSBtYXRjaCB0YWJsZXMgd2l0aFxuICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICB8IENvbnMgdGFibGVzIC0+IHRhYmxlcy5kYXRhIDwtIHZcbmxldCBzZXRfbmV4dCB0YWJsZXMgdiA9IG1hdGNoIHRhYmxlcyB3aXRoXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLm5leHQgPC0gdlxubGV0IGdldF9rZXkgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICB8IENvbnMgdGFibGVzIC0+IHRhYmxlcy5rZXlcbmxldCBnZXRfZGF0YSA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLmRhdGFcbmxldCBnZXRfbmV4dCA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gIHwgQ29ucyB0YWJsZXMgLT4gdGFibGVzLm5leHRcblxubGV0IGJ1aWxkX3BhdGggbiBrZXlzIHRhYmxlcyA9XG4gIGxldCByZXMgPSBDb25zIHtrZXkgPSBPYmoubWFnaWMgMDsgZGF0YSA9IEVtcHR5OyBuZXh0ID0gRW1wdHl9IGluXG4gIGxldCByID0gcmVmIHJlcyBpblxuICBmb3IgaSA9IDAgdG8gbiBkb1xuICAgIHIgOj0gQ29ucyB7a2V5ID0ga2V5cy4oaSk7IGRhdGEgPSAhcjsgbmV4dCA9IEVtcHR5fVxuICBkb25lO1xuICBzZXRfZGF0YSB0YWJsZXMgIXI7XG4gIHJlc1xuXG5sZXQgcmVjIGxvb2t1cF9rZXlzIGkga2V5cyB0YWJsZXMgPVxuICBpZiBpIDwgMCB0aGVuIHRhYmxlcyBlbHNlXG4gIGxldCBrZXkgPSBrZXlzLihpKSBpblxuICBsZXQgcmVjIGxvb2t1cF9rZXkgKHRhYmxlczp0YWJsZXMpID1cbiAgICBpZiBnZXRfa2V5IHRhYmxlcyA9PSBrZXkgdGhlblxuICAgICAgbWF0Y2ggZ2V0X2RhdGEgdGFibGVzIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IENvbnMgXyBhcyB0YWJsZXNfZGF0YSAtPlxuICAgICAgICAgIGxvb2t1cF9rZXlzIChpLTEpIGtleXMgdGFibGVzX2RhdGFcbiAgICBlbHNlXG4gICAgICBtYXRjaCBnZXRfbmV4dCB0YWJsZXMgd2l0aFxuICAgICAgfCBDb25zIF8gYXMgbmV4dCAtPiBsb29rdXBfa2V5IG5leHRcbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBsZXQgbmV4dCA6IHRhYmxlcyA9IENvbnMge2tleTsgZGF0YSA9IEVtcHR5OyBuZXh0ID0gRW1wdHl9IGluXG4gICAgICAgICAgc2V0X25leHQgdGFibGVzIG5leHQ7XG4gICAgICAgICAgYnVpbGRfcGF0aCAoaS0xKSBrZXlzIG5leHRcbiAgaW5cbiAgbG9va3VwX2tleSB0YWJsZXNcblxubGV0IGxvb2t1cF90YWJsZXMgcm9vdCBrZXlzID1cbiAgbWF0Y2ggZ2V0X2RhdGEgcm9vdCB3aXRoXG4gIHwgQ29ucyBfIGFzIHJvb3RfZGF0YSAtPlxuICAgIGxvb2t1cF9rZXlzIChBcnJheS5sZW5ndGgga2V5cyAtIDEpIGtleXMgcm9vdF9kYXRhXG4gIHwgRW1wdHkgLT5cbiAgICBidWlsZF9wYXRoIChBcnJheS5sZW5ndGgga2V5cyAtIDEpIGtleXMgcm9vdFxuXG4oKioqKiBidWlsdGluIG1ldGhvZHMgKioqKilcblxubGV0IGdldF9jb25zdCB4ID0gcmV0IChmdW4gX29iaiAtPiB4KVxubGV0IGdldF92YXIgbiAgID0gcmV0IChmdW4gb2JqIC0+IEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pXG5sZXQgZ2V0X2VudiBlIG4gPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKVxubGV0IGdldF9tZXRoIG4gID0gcmV0IChmdW4gb2JqIC0+IHNlbmRzZWxmIG9iaiBuKVxubGV0IHNldF92YXIgbiAgID0gcmV0IChmdW4gb2JqIHggLT4gQXJyYXkudW5zYWZlX3NldCBvYmogbiB4KVxubGV0IGFwcF9jb25zdCBmIHggPSByZXQgKGZ1biBfb2JqIC0+IGYgeClcbmxldCBhcHBfdmFyIGYgbiAgID0gcmV0IChmdW4gb2JqIC0+IGYgKEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pKVxubGV0IGFwcF9lbnYgZiBlIG4gPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBmIChBcnJheS51bnNhZmVfZ2V0IChPYmoubWFnaWMgKEFycmF5LnVuc2FmZV9nZXQgb2JqIGUpIDogb2JqKSBuKSlcbmxldCBhcHBfbWV0aCBmIG4gID0gcmV0IChmdW4gb2JqIC0+IGYgKHNlbmRzZWxmIG9iaiBuKSlcbmxldCBhcHBfY29uc3RfY29uc3QgZiB4IHkgPSByZXQgKGZ1biBfb2JqIC0+IGYgeCB5KVxubGV0IGFwcF9jb25zdF92YXIgZiB4IG4gICA9IHJldCAoZnVuIG9iaiAtPiBmIHggKEFycmF5LnVuc2FmZV9nZXQgb2JqIG4pKVxubGV0IGFwcF9jb25zdF9tZXRoIGYgeCBuID0gcmV0IChmdW4gb2JqIC0+IGYgeCAoc2VuZHNlbGYgb2JqIG4pKVxubGV0IGFwcF92YXJfY29uc3QgZiBuIHggPSByZXQgKGZ1biBvYmogLT4gZiAoQXJyYXkudW5zYWZlX2dldCBvYmogbikgeClcbmxldCBhcHBfbWV0aF9jb25zdCBmIG4geCA9IHJldCAoZnVuIG9iaiAtPiBmIChzZW5kc2VsZiBvYmogbikgeClcbmxldCBhcHBfY29uc3RfZW52IGYgeCBlIG4gPVxuICByZXQgKGZ1biBvYmogLT5cbiAgICBmIHggKEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pKVxubGV0IGFwcF9lbnZfY29uc3QgZiBlIG4geCA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIGYgKEFycmF5LnVuc2FmZV9nZXQgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldCBvYmogZSkgOiBvYmopIG4pIHgpXG5sZXQgbWV0aF9hcHBfY29uc3QgbiB4ID0gcmV0IChmdW4gb2JqIC0+IChzZW5kc2VsZiBvYmogbiA6IF8gLT4gXykgeClcbmxldCBtZXRoX2FwcF92YXIgbiBtID1cbiAgcmV0IChmdW4gb2JqIC0+IChzZW5kc2VsZiBvYmogbiA6IF8gLT4gXykgKEFycmF5LnVuc2FmZV9nZXQgb2JqIG0pKVxubGV0IG1ldGhfYXBwX2VudiBuIGUgbSA9XG4gIHJldCAoZnVuIG9iaiAtPiAoc2VuZHNlbGYgb2JqIG4gOiBfIC0+IF8pXG4gICAgICAoQXJyYXkudW5zYWZlX2dldCAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbSkpXG5sZXQgbWV0aF9hcHBfbWV0aCBuIG0gPVxuICByZXQgKGZ1biBvYmogLT4gKHNlbmRzZWxmIG9iaiBuIDogXyAtPiBfKSAoc2VuZHNlbGYgb2JqIG0pKVxubGV0IHNlbmRfY29uc3QgbSB4IGMgPVxuICByZXQgKGZ1biBvYmogLT4gc2VuZGNhY2hlIHggbSAoQXJyYXkudW5zYWZlX2dldCBvYmogMCkgYylcbmxldCBzZW5kX3ZhciBtIG4gYyA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIHNlbmRjYWNoZSAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBuKSA6IG9iaikgbVxuICAgICAgKEFycmF5LnVuc2FmZV9nZXQgb2JqIDApIGMpXG5sZXQgc2VuZF9lbnYgbSBlIG4gYyA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIHNlbmRjYWNoZVxuICAgICAgKE9iai5tYWdpYyAoQXJyYXkudW5zYWZlX2dldFxuICAgICAgICAgICAgICAgICAgICAoT2JqLm1hZ2ljIChBcnJheS51bnNhZmVfZ2V0IG9iaiBlKSA6IG9iaikgbikgOiBvYmopXG4gICAgICBtIChBcnJheS51bnNhZmVfZ2V0IG9iaiAwKSBjKVxubGV0IHNlbmRfbWV0aCBtIG4gYyA9XG4gIHJldCAoZnVuIG9iaiAtPlxuICAgIHNlbmRjYWNoZSAoc2VuZHNlbGYgb2JqIG4pIG0gKEFycmF5LnVuc2FmZV9nZXQgb2JqIDApIGMpXG5sZXQgbmV3X2NhY2hlIHRhYmxlID1cbiAgbGV0IG4gPSBuZXdfbWV0aG9kIHRhYmxlIGluXG4gIGxldCBuID1cbiAgICBpZiBuIG1vZCAyID0gMCB8fCBuID4gMiArIG1hZ2ljIHRhYmxlLm1ldGhvZHMuKDEpICogMTYgLyBTeXMud29yZF9zaXplXG4gICAgdGhlbiBuIGVsc2UgbmV3X21ldGhvZCB0YWJsZVxuICBpblxuICB0YWJsZS5tZXRob2RzLihuKSA8LSBPYmoubWFnaWMgMDtcbiAgblxuXG50eXBlIGltcGwgPVxuICAgIEdldENvbnN0XG4gIHwgR2V0VmFyXG4gIHwgR2V0RW52XG4gIHwgR2V0TWV0aFxuICB8IFNldFZhclxuICB8IEFwcENvbnN0XG4gIHwgQXBwVmFyXG4gIHwgQXBwRW52XG4gIHwgQXBwTWV0aFxuICB8IEFwcENvbnN0Q29uc3RcbiAgfCBBcHBDb25zdFZhclxuICB8IEFwcENvbnN0RW52XG4gIHwgQXBwQ29uc3RNZXRoXG4gIHwgQXBwVmFyQ29uc3RcbiAgfCBBcHBFbnZDb25zdFxuICB8IEFwcE1ldGhDb25zdFxuICB8IE1ldGhBcHBDb25zdFxuICB8IE1ldGhBcHBWYXJcbiAgfCBNZXRoQXBwRW52XG4gIHwgTWV0aEFwcE1ldGhcbiAgfCBTZW5kQ29uc3RcbiAgfCBTZW5kVmFyXG4gIHwgU2VuZEVudlxuICB8IFNlbmRNZXRoXG4gIHwgQ2xvc3VyZSBvZiBjbG9zdXJlXG5cbmxldCBtZXRob2RfaW1wbCB0YWJsZSBpIGFyciA9XG4gIGxldCBuZXh0ICgpID0gaW5jciBpOyBtYWdpYyBhcnIuKCFpKSBpblxuICBtYXRjaCBuZXh0KCkgd2l0aFxuICAgIEdldENvbnN0IC0+IGxldCB4IDogdCA9IG5leHQoKSBpbiBnZXRfY29uc3QgeFxuICB8IEdldFZhciAgIC0+IGxldCBuID0gbmV4dCgpIGluIGdldF92YXIgblxuICB8IEdldEVudiAgIC0+IGxldCBlID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluIGdldF9lbnYgZSBuXG4gIHwgR2V0TWV0aCAgLT4gbGV0IG4gPSBuZXh0KCkgaW4gZ2V0X21ldGggblxuICB8IFNldFZhciAgIC0+IGxldCBuID0gbmV4dCgpIGluIHNldF92YXIgblxuICB8IEFwcENvbnN0IC0+IGxldCBmID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIGFwcF9jb25zdCBmIHhcbiAgfCBBcHBWYXIgICAtPiBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQgKCkgaW4gYXBwX3ZhciBmIG5cbiAgfCBBcHBFbnYgICAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gIGxldCBlID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluXG4gICAgICBhcHBfZW52IGYgZSBuXG4gIHwgQXBwTWV0aCAgLT4gbGV0IGYgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0ICgpIGluIGFwcF9tZXRoIGYgblxuICB8IEFwcENvbnN0Q29uc3QgLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIGxldCB5ID0gbmV4dCgpIGluXG4gICAgICBhcHBfY29uc3RfY29uc3QgZiB4IHlcbiAgfCBBcHBDb25zdFZhciAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9jb25zdF92YXIgZiB4IG5cbiAgfCBBcHBDb25zdEVudiAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gbGV0IGUgPSBuZXh0ICgpIGluIGxldCBuID0gbmV4dCgpIGluXG4gICAgICBhcHBfY29uc3RfZW52IGYgeCBlIG5cbiAgfCBBcHBDb25zdE1ldGggLT5cbiAgICAgIGxldCBmID0gbmV4dCgpIGluIGxldCB4ID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCgpIGluXG4gICAgICBhcHBfY29uc3RfbWV0aCBmIHggblxuICB8IEFwcFZhckNvbnN0IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpblxuICAgICAgYXBwX3Zhcl9jb25zdCBmIG4geFxuICB8IEFwcEVudkNvbnN0IC0+XG4gICAgICBsZXQgZiA9IG5leHQoKSBpbiBsZXQgZSA9IG5leHQgKCkgaW4gbGV0IG4gPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9lbnZfY29uc3QgZiBlIG4geFxuICB8IEFwcE1ldGhDb25zdCAtPlxuICAgICAgbGV0IGYgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW5cbiAgICAgIGFwcF9tZXRoX2NvbnN0IGYgbiB4XG4gIHwgTWV0aEFwcENvbnN0IC0+XG4gICAgICBsZXQgbiA9IG5leHQoKSBpbiBsZXQgeCA9IG5leHQoKSBpbiBtZXRoX2FwcF9jb25zdCBuIHhcbiAgfCBNZXRoQXBwVmFyIC0+XG4gICAgICBsZXQgbiA9IG5leHQoKSBpbiBsZXQgbSA9IG5leHQoKSBpbiBtZXRoX2FwcF92YXIgbiBtXG4gIHwgTWV0aEFwcEVudiAtPlxuICAgICAgbGV0IG4gPSBuZXh0KCkgaW4gbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG0gPSBuZXh0KCkgaW5cbiAgICAgIG1ldGhfYXBwX2VudiBuIGUgbVxuICB8IE1ldGhBcHBNZXRoIC0+XG4gICAgICBsZXQgbiA9IG5leHQoKSBpbiBsZXQgbSA9IG5leHQoKSBpbiBtZXRoX2FwcF9tZXRoIG4gbVxuICB8IFNlbmRDb25zdCAtPlxuICAgICAgbGV0IG0gPSBuZXh0KCkgaW4gbGV0IHggPSBuZXh0KCkgaW4gc2VuZF9jb25zdCBtIHggKG5ld19jYWNoZSB0YWJsZSlcbiAgfCBTZW5kVmFyIC0+XG4gICAgICBsZXQgbSA9IG5leHQoKSBpbiBsZXQgbiA9IG5leHQgKCkgaW4gc2VuZF92YXIgbSBuIChuZXdfY2FjaGUgdGFibGUpXG4gIHwgU2VuZEVudiAtPlxuICAgICAgbGV0IG0gPSBuZXh0KCkgaW4gbGV0IGUgPSBuZXh0KCkgaW4gbGV0IG4gPSBuZXh0KCkgaW5cbiAgICAgIHNlbmRfZW52IG0gZSBuIChuZXdfY2FjaGUgdGFibGUpXG4gIHwgU2VuZE1ldGggLT5cbiAgICAgIGxldCBtID0gbmV4dCgpIGluIGxldCBuID0gbmV4dCAoKSBpbiBzZW5kX21ldGggbSBuIChuZXdfY2FjaGUgdGFibGUpXG4gIHwgQ2xvc3VyZSBfIGFzIGNsbyAtPiBtYWdpYyBjbG9cblxubGV0IHNldF9tZXRob2RzIHRhYmxlIG1ldGhvZHMgPVxuICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIG1ldGhvZHMgaW4gbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IGxlbiBkb1xuICAgIGxldCBsYWJlbCA9IG1ldGhvZHMuKCFpKSBpbiBsZXQgY2xvID0gbWV0aG9kX2ltcGwgdGFibGUgaSBtZXRob2RzIGluXG4gICAgc2V0X21ldGhvZCB0YWJsZSBsYWJlbCBjbG87XG4gICAgaW5jciBpXG4gIGRvbmVcblxuKCoqKiogU3RhdGlzdGljcyAqKioqKVxuXG50eXBlIHN0YXRzID1cbiAgeyBjbGFzc2VzOiBpbnQ7IG1ldGhvZHM6IGludDsgaW5zdF92YXJzOiBpbnQ7IH1cblxubGV0IHN0YXRzICgpID1cbiAgeyBjbGFzc2VzID0gIXRhYmxlX2NvdW50O1xuICAgIG1ldGhvZHMgPSAhbWV0aG9kX2NvdW50OyBpbnN0X3ZhcnMgPSAhaW5zdF92YXJfY291bnQ7IH1cbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDIwMDQgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxudHlwZSBzaGFwZSA9XG4gIHwgRnVuY3Rpb25cbiAgfCBMYXp5XG4gIHwgQ2xhc3NcbiAgfCBNb2R1bGUgb2Ygc2hhcGUgYXJyYXlcbiAgfCBWYWx1ZSBvZiBPYmoudFxuXG5sZXQgcmVjIGluaXRfbW9kX2ZpZWxkIG1vZHUgaSBsb2Mgc2hhcGUgPVxuICBsZXQgaW5pdCA9XG4gICAgbWF0Y2ggc2hhcGUgd2l0aFxuICAgIHwgRnVuY3Rpb24gLT5cbiAgICAgICBsZXQgcmVjIGZuICh4IDogJ2EpID1cbiAgICAgICAgIGxldCBmbicgOiAnYSAtPiAnYiA9IE9iai5vYmogKE9iai5maWVsZCBtb2R1IGkpIGluXG4gICAgICAgICBpZiBmbiA9PSBmbicgdGhlblxuICAgICAgICAgICByYWlzZSAoVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgbG9jKVxuICAgICAgICAgZWxzZVxuICAgICAgICAgICBmbicgeCBpblxuICAgICAgIE9iai5yZXByIGZuXG4gICAgfCBMYXp5IC0+XG4gICAgICAgbGV0IHJlYyBsID1cbiAgICAgICAgIGxhenkgKFxuICAgICAgICAgICBsZXQgbCcgPSBPYmoub2JqIChPYmouZmllbGQgbW9kdSBpKSBpblxuICAgICAgICAgICBpZiBsID09IGwnIHRoZW5cbiAgICAgICAgICAgICByYWlzZSAoVW5kZWZpbmVkX3JlY3Vyc2l2ZV9tb2R1bGUgbG9jKVxuICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgTGF6eS5mb3JjZSBsJykgaW5cbiAgICAgICBPYmoucmVwciBsXG4gICAgfCBDbGFzcyAtPlxuICAgICAgIE9iai5yZXByIChDYW1saW50ZXJuYWxPTy5kdW1teV9jbGFzcyBsb2MpXG4gICAgfCBNb2R1bGUgY29tcHMgLT5cbiAgICAgICBPYmoucmVwciAoaW5pdF9tb2RfYmxvY2sgbG9jIGNvbXBzKVxuICAgIHwgVmFsdWUgdiAtPiB2XG4gIGluXG4gIE9iai5zZXRfZmllbGQgbW9kdSBpIGluaXRcblxuYW5kIGluaXRfbW9kX2Jsb2NrIGxvYyBjb21wcyA9XG4gIGxldCBsZW5ndGggPSBBcnJheS5sZW5ndGggY29tcHMgaW5cbiAgbGV0IG1vZHUgPSBPYmoubmV3X2Jsb2NrIDAgbGVuZ3RoIGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggLSAxIGRvXG4gICAgaW5pdF9tb2RfZmllbGQgbW9kdSBpIGxvYyBjb21wcy4oaSlcbiAgZG9uZTtcbiAgbW9kdVxuXG5sZXQgaW5pdF9tb2QgbG9jIHNoYXBlID1cbiAgbWF0Y2ggc2hhcGUgd2l0aFxuICB8IE1vZHVsZSBjb21wcyAtPlxuICAgICBPYmoucmVwciAoaW5pdF9tb2RfYmxvY2sgbG9jIGNvbXBzKVxuICB8IF8gLT4gZmFpbHdpdGggXCJDYW1saW50ZXJuYWxNb2QuaW5pdF9tb2Q6IG5vdCBhIG1vZHVsZVwiXG5cbmxldCByZWMgdXBkYXRlX21vZF9maWVsZCBtb2R1IGkgc2hhcGUgbiA9XG4gIG1hdGNoIHNoYXBlIHdpdGhcbiAgfCBGdW5jdGlvbiB8IExhenkgLT5cbiAgICAgT2JqLnNldF9maWVsZCBtb2R1IGkgblxuICB8IFZhbHVlIF8gLT5cbiAgICAgKCkgKCogdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlcmUgKilcbiAgfCBDbGFzcyAtPlxuICAgICBhc3NlcnQgKE9iai50YWcgbiA9IDAgJiYgT2JqLnNpemUgbiA9IDQpO1xuICAgICBsZXQgY2wgPSBPYmouZmllbGQgbW9kdSBpIGluXG4gICAgIGZvciBqID0gMCB0byAzIGRvXG4gICAgICAgT2JqLnNldF9maWVsZCBjbCBqIChPYmouZmllbGQgbiBqKVxuICAgICBkb25lXG4gIHwgTW9kdWxlIGNvbXBzIC0+XG4gICAgIHVwZGF0ZV9tb2RfYmxvY2sgY29tcHMgKE9iai5maWVsZCBtb2R1IGkpIG5cblxuYW5kIHVwZGF0ZV9tb2RfYmxvY2sgY29tcHMgbyBuID1cbiAgYXNzZXJ0IChPYmoudGFnIG4gPSAwICYmIE9iai5zaXplIG4gPj0gQXJyYXkubGVuZ3RoIGNvbXBzKTtcbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBjb21wcyAtIDEgZG9cbiAgICB1cGRhdGVfbW9kX2ZpZWxkIG8gaSBjb21wcy4oaSkgKE9iai5maWVsZCBuIGkpXG4gIGRvbmVcblxubGV0IHVwZGF0ZV9tb2Qgc2hhcGUgbyBuID1cbiAgbWF0Y2ggc2hhcGUgd2l0aFxuICB8IE1vZHVsZSBjb21wcyAtPlxuICAgICB1cGRhdGVfbW9kX2Jsb2NrIGNvbXBzIG8gblxuICB8IF8gLT4gZmFpbHdpdGggXCJDYW1saW50ZXJuYWxNb2QudXBkYXRlX21vZDogbm90IGEgbW9kdWxlXCJcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgIERhbWllbiBEb2xpZ2V6LCBwcm9qZXQgUGFyYSwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTcgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubW9kdWxlIHR5cGUgU2VlZGVkUyA9IHNpZ1xuXG4gIHR5cGUga2V5XG4gIHR5cGUgISdhIHRcbiAgdmFsIGNyZWF0ZSA6ID9yYW5kb20gKCp0aHdhcnQgdG9vbHMvc3luY19zdGRsaWJfZG9jcyopIDogYm9vbCAtPiBpbnQgLT4gJ2EgdFxuICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gIHZhbCBjb3B5IDogJ2EgdCAtPiAnYSB0XG4gIHZhbCBhZGQgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gIHZhbCBmaW5kIDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgdmFsIGZpbmRfb3B0IDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gIHZhbCBmaW5kX2FsbCA6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgdmFsIHJlcGxhY2UgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICB2YWwgc3RhdHMgOiAnYSB0IC0+IEhhc2h0Ymwuc3RhdGlzdGljc1xuICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgdmFsIGNsZWFuOiAnYSB0IC0+IHVuaXRcbiAgdmFsIHN0YXRzX2FsaXZlOiAnYSB0IC0+IEhhc2h0Ymwuc3RhdGlzdGljc1xuICAgICgqKiBzYW1lIGFzIHshc3RhdHN9IGJ1dCBvbmx5IGNvdW50IHRoZSBhbGl2ZSBiaW5kaW5ncyAqKVxuZW5kXG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcblxuICB0eXBlIGtleVxuICB0eXBlICEnYSB0XG4gIHZhbCBjcmVhdGUgOiBpbnQgLT4gJ2EgdFxuICB2YWwgY2xlYXIgOiAnYSB0IC0+IHVuaXRcbiAgdmFsIHJlc2V0IDogJ2EgdCAtPiB1bml0XG4gIHZhbCBjb3B5IDogJ2EgdCAtPiAnYSB0XG4gIHZhbCBhZGQgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gIHZhbCByZW1vdmUgOiAnYSB0IC0+IGtleSAtPiB1bml0XG4gIHZhbCBmaW5kIDogJ2EgdCAtPiBrZXkgLT4gJ2FcbiAgdmFsIGZpbmRfb3B0IDogJ2EgdCAtPiBrZXkgLT4gJ2Egb3B0aW9uXG4gIHZhbCBmaW5kX2FsbCA6ICdhIHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgdmFsIHJlcGxhY2UgOiAnYSB0IC0+IGtleSAtPiAnYSAtPiB1bml0XG4gIHZhbCBtZW0gOiAnYSB0IC0+IGtleSAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICB2YWwgc3RhdHMgOiAnYSB0IC0+IEhhc2h0Ymwuc3RhdGlzdGljc1xuICB2YWwgYWRkX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCByZXBsYWNlX3NlcSA6ICdhIHQgLT4gKGtleSAqICdhKSBTZXEudCAtPiB1bml0XG4gIHZhbCBvZl9zZXEgOiAoa2V5ICogJ2EpIFNlcS50IC0+ICdhIHRcbiAgdmFsIGNsZWFuOiAnYSB0IC0+IHVuaXRcbiAgdmFsIHN0YXRzX2FsaXZlOiAnYSB0IC0+IEhhc2h0Ymwuc3RhdGlzdGljc1xuICAgICgqKiBzYW1lIGFzIHshc3RhdHN9IGJ1dCBvbmx5IGNvdW50IHRoZSBhbGl2ZSBiaW5kaW5ncyAqKVxuZW5kXG5cbm1vZHVsZSBHZW5IYXNoVGFibGUgPSBzdHJ1Y3RcblxuICB0eXBlIGVxdWFsID1cbiAgfCBFVHJ1ZSB8IEVGYWxzZVxuICB8IEVEZWFkICgqKiB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgcmVjbGFpbWVkIHRoZSBkYXRhICopXG5cbiAgbW9kdWxlIE1ha2VTZWVkZWQoSDogc2lnXG4gICAgdHlwZSB0XG4gICAgdHlwZSAnYSBjb250YWluZXJcbiAgICB2YWwgY3JlYXRlOiB0IC0+ICdhIC0+ICdhIGNvbnRhaW5lclxuICAgIHZhbCBzZWVkZWRfaGFzaDogaW50IC0+IHQgLT4gaW50XG4gICAgdmFsIGVxdWFsOiAnYSBjb250YWluZXIgLT4gdCAtPiBlcXVhbFxuICAgIHZhbCBnZXRfZGF0YTogJ2EgY29udGFpbmVyIC0+ICdhIG9wdGlvblxuICAgIHZhbCBzZXRfa2V5X2RhdGE6ICdhIGNvbnRhaW5lciAtPiB0IC0+ICdhIC0+IHVuaXRcbiAgICB2YWwgY2hlY2tfa2V5OiAnYSBjb250YWluZXIgLT4gYm9vbFxuICBlbmQpIDogU2VlZGVkUyB3aXRoIHR5cGUga2V5ID0gSC50XG4gID0gc3RydWN0XG5cbiAgICB0eXBlICdhIHQgPVxuICAgICAgeyBtdXRhYmxlIHNpemU6IGludDsgICAgICAgICAgICAgICAgICAoKiBudW1iZXIgb2YgZW50cmllcyAqKVxuICAgICAgICBtdXRhYmxlIGRhdGE6ICdhIGJ1Y2tldGxpc3QgYXJyYXk7ICAoKiB0aGUgYnVja2V0cyAqKVxuICAgICAgICBzZWVkOiBpbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBmb3IgcmFuZG9taXphdGlvbiAqKVxuICAgICAgICBpbml0aWFsX3NpemU6IGludDsgICAgICAgICAgICAgICAgICAoKiBpbml0aWFsIGFycmF5IHNpemUgKilcbiAgICAgIH1cblxuICAgIGFuZCAnYSBidWNrZXRsaXN0ID1cbiAgICB8IEVtcHR5XG4gICAgfCBDb25zIG9mIGludCAoKiBoYXNoIG9mIHRoZSBrZXkgKikgKiAnYSBILmNvbnRhaW5lciAqICdhIGJ1Y2tldGxpc3RcblxuICAgICgqKiB0aGUgaGFzaCBvZiB0aGUga2V5IGlzIGtlcHQgaW4gb3JkZXIgdG8gdGVzdCB0aGUgZXF1YWxpdHkgb2YgdGhlIGhhc2hcbiAgICAgIGJlZm9yZSB0aGUga2V5LiBTYW1lIHJlYXNvbiBhcyBmb3IgV2Vhay5NYWtlICopXG5cbiAgICB0eXBlIGtleSA9IEgudFxuXG4gICAgbGV0IHJlYyBwb3dlcl8yX2Fib3ZlIHggbiA9XG4gICAgICBpZiB4ID49IG4gdGhlbiB4XG4gICAgICBlbHNlIGlmIHggKiAyID4gU3lzLm1heF9hcnJheV9sZW5ndGggdGhlbiB4XG4gICAgICBlbHNlIHBvd2VyXzJfYWJvdmUgKHggKiAyKSBuXG5cbiAgICBsZXQgcHJuZyA9IGxhenkgKFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdCgpKVxuXG4gICAgbGV0IGNyZWF0ZSA/KHJhbmRvbSA9IChIYXNodGJsLmlzX3JhbmRvbWl6ZWQgKCkpKSBpbml0aWFsX3NpemUgPVxuICAgICAgbGV0IHMgPSBwb3dlcl8yX2Fib3ZlIDE2IGluaXRpYWxfc2l6ZSBpblxuICAgICAgbGV0IHNlZWQgPSBpZiByYW5kb20gdGhlbiBSYW5kb20uU3RhdGUuYml0cyAoTGF6eS5mb3JjZSBwcm5nKSBlbHNlIDAgaW5cbiAgICAgIHsgaW5pdGlhbF9zaXplID0gczsgc2l6ZSA9IDA7IHNlZWQgPSBzZWVkOyBkYXRhID0gQXJyYXkubWFrZSBzIEVtcHR5IH1cblxuICAgIGxldCBjbGVhciBoID1cbiAgICAgIGguc2l6ZSA8LSAwO1xuICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBoLmRhdGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAgIGguZGF0YS4oaSkgPC0gRW1wdHlcbiAgICAgIGRvbmVcblxuICAgIGxldCByZXNldCBoID1cbiAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggaC5kYXRhIGluXG4gICAgICBpZiBsZW4gPSBoLmluaXRpYWxfc2l6ZSB0aGVuXG4gICAgICAgIGNsZWFyIGhcbiAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgaC5zaXplIDwtIDA7XG4gICAgICAgIGguZGF0YSA8LSBBcnJheS5tYWtlIGguaW5pdGlhbF9zaXplIEVtcHR5XG4gICAgICBlbmRcblxuICAgIGxldCBjb3B5IGggPSB7IGggd2l0aCBkYXRhID0gQXJyYXkuY29weSBoLmRhdGEgfVxuXG4gICAgbGV0IGtleV9pbmRleCBoIGhrZXkgPVxuICAgICAgaGtleSBsYW5kIChBcnJheS5sZW5ndGggaC5kYXRhIC0gMSlcblxuICAgIGxldCBjbGVhbiBoID1cbiAgICAgIGxldCByZWMgZG9fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgICAgRW1wdHlcbiAgICAgICAgfCBDb25zKF8sIGMsIHJlc3QpIHdoZW4gbm90IChILmNoZWNrX2tleSBjKSAtPlxuICAgICAgICAgICAgaC5zaXplIDwtIGguc2l6ZSAtIDE7XG4gICAgICAgICAgICBkb19idWNrZXQgcmVzdFxuICAgICAgICB8IENvbnMoaGtleSwgYywgcmVzdCkgLT5cbiAgICAgICAgICAgIENvbnMoaGtleSwgYywgZG9fYnVja2V0IHJlc3QpXG4gICAgICBpblxuICAgICAgbGV0IGQgPSBoLmRhdGEgaW5cbiAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggZCAtIDEgZG9cbiAgICAgICAgZC4oaSkgPC0gZG9fYnVja2V0IGQuKGkpXG4gICAgICBkb25lXG5cbiAgICAoKiogcmVzaXplIGlzIHRoZSBvbmx5IGZ1bmN0aW9uIHRvIGRvIHRoZSBhY3R1YWwgY2xlYW5pbmcgb2YgZGVhZCBrZXlzXG4gICAgICAgIChyZW1vdmUgZG9lcyBpdCBqdXN0IGJlY2F1c2UgaXQgY291bGQpLlxuXG4gICAgICAgIFRoZSBnb2FsIGlzIHRvOlxuXG4gICAgICAgIC0gbm90IHJlc2l6ZSBpbmZpbml0ZWx5IHdoZW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgYWxpdmUga2V5cyBpc1xuICAgICAgICBib3VuZGVkIGJ1dCBrZXlzIGFyZSBjb250aW51b3VzbHkgYWRkZWQuIFRoYXQgd291bGQgaGFwcGVuIGlmXG4gICAgICAgIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJlc2l6ZS5cbiAgICAgICAgLSBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIGVhY2ggYWRkaXRpb24sIHRoYXQgd291bGQgaGFwcGVuIGlmIHRoaXNcbiAgICAgICAgZnVuY3Rpb24gZG9uJ3QgcmVzaXplIGV2ZW4gd2hlbiBvbmx5IG9uZSBrZXkgaXMgZGVhZC5cblxuICAgICAgICBTbyB0aGUgYWxnb3JpdGhtOlxuICAgICAgICAtIGNsZWFuIHRoZSBrZXlzIGJlZm9yZSByZXNpemluZ1xuICAgICAgICAtIGlmIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGtleXMgaXMgbGVzcyB0aGFuIGhhbGYgdGhlIHNpemUgb2YgdGhlXG4gICAgICAgIGFycmF5LCBkb24ndCByZXNpemUuXG4gICAgICAgIC0gaWYgaXQgaXMgbW9yZSwgcmVzaXplLlxuXG4gICAgICAgIFRoZSBzZWNvbmQgcHJvYmxlbSByZW1haW5zIGlmIHRoZSB0YWJsZSByZWFjaGVzIHshU3lzLm1heF9hcnJheV9sZW5ndGh9LlxuXG4gICAgKilcbiAgICBsZXQgcmVzaXplIGggPVxuICAgICAgbGV0IG9kYXRhID0gaC5kYXRhIGluXG4gICAgICBsZXQgb3NpemUgPSBBcnJheS5sZW5ndGggb2RhdGEgaW5cbiAgICAgIGxldCBuc2l6ZSA9IG9zaXplICogMiBpblxuICAgICAgY2xlYW4gaDtcbiAgICAgIGlmIG5zaXplIDwgU3lzLm1heF9hcnJheV9sZW5ndGggJiYgaC5zaXplID49IG9zaXplIGxzciAxIHRoZW4gYmVnaW5cbiAgICAgICAgbGV0IG5kYXRhID0gQXJyYXkubWFrZSBuc2l6ZSBFbXB0eSBpblxuICAgICAgICBoLmRhdGEgPC0gbmRhdGE7ICAgICAgICgqIHNvIHRoYXQga2V5X2luZGV4IHNlZXMgdGhlIG5ldyBidWNrZXQgY291bnQgKilcbiAgICAgICAgbGV0IHJlYyBpbnNlcnRfYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIEVtcHR5IC0+ICgpXG4gICAgICAgICAgfCBDb25zKGhrZXksIGRhdGEsIHJlc3QpIC0+XG4gICAgICAgICAgICAgIGluc2VydF9idWNrZXQgcmVzdDsgKCogcHJlc2VydmUgb3JpZ2luYWwgb3JkZXIgb2YgZWxlbWVudHMgKilcbiAgICAgICAgICAgICAgbGV0IG5pZHggPSBrZXlfaW5kZXggaCBoa2V5IGluXG4gICAgICAgICAgICAgIG5kYXRhLihuaWR4KSA8LSBDb25zKGhrZXksIGRhdGEsIG5kYXRhLihuaWR4KSkgaW5cbiAgICAgICAgZm9yIGkgPSAwIHRvIG9zaXplIC0gMSBkb1xuICAgICAgICAgIGluc2VydF9idWNrZXQgb2RhdGEuKGkpXG4gICAgICAgIGRvbmVcbiAgICAgIGVuZFxuXG4gICAgbGV0IGFkZCBoIGtleSBpbmZvID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGhrZXkgaW5cbiAgICAgIGxldCBjb250YWluZXIgPSBILmNyZWF0ZSBrZXkgaW5mbyBpblxuICAgICAgbGV0IGJ1Y2tldCA9IENvbnMoaGtleSwgY29udGFpbmVyLCBoLmRhdGEuKGkpKSBpblxuICAgICAgaC5kYXRhLihpKSA8LSBidWNrZXQ7XG4gICAgICBoLnNpemUgPC0gaC5zaXplICsgMTtcbiAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUgaFxuXG4gICAgbGV0IHJlbW92ZSBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IHJlYyByZW1vdmVfYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgICAgfCBFbXB0eSAtPiBFbXB0eVxuICAgICAgICB8IENvbnMoaGssIGMsIG5leHQpIHdoZW4gaGtleSA9IGhrIC0+XG4gICAgICAgICAgICBiZWdpbiBtYXRjaCBILmVxdWFsIGMga2V5IHdpdGhcbiAgICAgICAgICAgIHwgRVRydWUgLT4gaC5zaXplIDwtIGguc2l6ZSAtIDE7IG5leHRcbiAgICAgICAgICAgIHwgRUZhbHNlIC0+IENvbnMoaGssIGMsIHJlbW92ZV9idWNrZXQgbmV4dClcbiAgICAgICAgICAgIHwgRURlYWQgLT5cbiAgICAgICAgICAgICAgICAoKiBUaGUgZGVhZCBrZXkgaXMgYXV0b21hdGljYWxseSByZW1vdmVkLiBJdCBpcyBhY2NlcHRhYmxlXG4gICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGZ1bmN0aW9uIHNpbmNlIGl0IGFscmVhZHkgcmVtb3ZlcyBhIGJpbmRpbmcgKilcbiAgICAgICAgICAgICAgICBoLnNpemUgPC0gaC5zaXplIC0gMTtcbiAgICAgICAgICAgICAgICByZW1vdmVfYnVja2V0IG5leHRcbiAgICAgICAgICAgIGVuZFxuICAgICAgICB8IENvbnMoaGssYyxuZXh0KSAtPiBDb25zKGhrLCBjLCByZW1vdmVfYnVja2V0IG5leHQpIGluXG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGhrZXkgaW5cbiAgICAgIGguZGF0YS4oaSkgPC0gcmVtb3ZlX2J1Y2tldCBoLmRhdGEuKGkpXG5cbiAgICAoKiogeyFmaW5kfSBkb24ndCByZW1vdmUgZGVhZCBrZXlzIGJlY2F1c2UgaXQgd291bGQgYmUgc3VycHJpc2luZyBmb3JcbiAgICAgICAgdGhlIHVzZXIgdGhhdCBhIHJlYWQtb25seSBmdW5jdGlvbiBtdXRhdGVzIHRoZSBzdGF0ZSAoZWcuIGNvbmN1cnJlbnRcbiAgICAgICAgYWNjZXNzKS4gU2FtZSBmb3IgeyFtZW19LlxuICAgICopXG4gICAgbGV0IHJlYyBmaW5kX3JlYyBrZXkgaGtleSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgICAgcmFpc2UgTm90X2ZvdW5kXG4gICAgICB8IENvbnMoaGssIGMsIHJlc3QpIHdoZW4gaGtleSA9IGhrICAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgIHwgRVRydWUgLT5cbiAgICAgICAgICAgICAgYmVnaW4gbWF0Y2ggSC5nZXRfZGF0YSBjIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAoKiBUaGlzIGNhc2UgaXMgbm90IGltcG9zc2libGUgYmVjYXVzZSB0aGUgZ2MgY2FuIHJ1biBiZXR3ZWVuXG4gICAgICAgICAgICAgICAgICAgICAgSC5lcXVhbCBhbmQgSC5nZXRfZGF0YSAqKVxuICAgICAgICAgICAgICAgICAgZmluZF9yZWMga2V5IGhrZXkgcmVzdFxuICAgICAgICAgICAgICB8IFNvbWUgZCAtPiBkXG4gICAgICAgICAgICAgIGVuZFxuICAgICAgICAgIHwgRUZhbHNlIC0+IGZpbmRfcmVjIGtleSBoa2V5IHJlc3RcbiAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgIGZpbmRfcmVjIGtleSBoa2V5IHJlc3RcbiAgICAgICAgICBlbmRcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPlxuICAgICAgICAgIGZpbmRfcmVjIGtleSBoa2V5IHJlc3RcblxuICAgIGxldCBmaW5kIGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICAoKiBUT0RPIGlubGluZSAzIGl0ZXJhdGlvbnMgKilcbiAgICAgIGZpbmRfcmVjIGtleSBoa2V5IChoLmRhdGEuKGtleV9pbmRleCBoIGhrZXkpKVxuXG4gICAgbGV0IHJlYyBmaW5kX3JlY19vcHQga2V5IGhrZXkgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICAgIE5vbmVcbiAgICAgIHwgQ29ucyhoaywgYywgcmVzdCkgd2hlbiBoa2V5ID0gaGsgIC0+XG4gICAgICAgICAgYmVnaW4gbWF0Y2ggSC5lcXVhbCBjIGtleSB3aXRoXG4gICAgICAgICAgfCBFVHJ1ZSAtPlxuICAgICAgICAgICAgICBiZWdpbiBtYXRjaCBILmdldF9kYXRhIGMgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICgqIFRoaXMgY2FzZSBpcyBub3QgaW1wb3NzaWJsZSBiZWNhdXNlIHRoZSBnYyBjYW4gcnVuIGJldHdlZW5cbiAgICAgICAgICAgICAgICAgICAgICBILmVxdWFsIGFuZCBILmdldF9kYXRhICopXG4gICAgICAgICAgICAgICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuICAgICAgICAgICAgICB8IFNvbWUgXyBhcyBkIC0+IGRcbiAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgfCBFRmFsc2UgLT4gZmluZF9yZWNfb3B0IGtleSBoa2V5IHJlc3RcbiAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgIGZpbmRfcmVjX29wdCBrZXkgaGtleSByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT5cbiAgICAgICAgICBmaW5kX3JlY19vcHQga2V5IGhrZXkgcmVzdFxuXG4gICAgbGV0IGZpbmRfb3B0IGgga2V5ID1cbiAgICAgIGxldCBoa2V5ID0gSC5zZWVkZWRfaGFzaCBoLnNlZWQga2V5IGluXG4gICAgICAoKiBUT0RPIGlubGluZSAzIGl0ZXJhdGlvbnMgKilcbiAgICAgIGZpbmRfcmVjX29wdCBrZXkgaGtleSAoaC5kYXRhLihrZXlfaW5kZXggaCBoa2V5KSlcblxuICAgIGxldCBmaW5kX2FsbCBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IHJlYyBmaW5kX2luX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IFtdXG4gICAgICB8IENvbnMoaGssIGMsIHJlc3QpIHdoZW4gaGtleSA9IGhrICAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgIHwgRVRydWUgLT4gYmVnaW4gbWF0Y2ggSC5nZXRfZGF0YSBjIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICBmaW5kX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgICAgIHwgU29tZSBkIC0+IGQ6OmZpbmRfaW5fYnVja2V0IHJlc3RcbiAgICAgICAgICAgIGVuZFxuICAgICAgICAgIHwgRUZhbHNlIC0+IGZpbmRfaW5fYnVja2V0IHJlc3RcbiAgICAgICAgICB8IEVEZWFkIC0+XG4gICAgICAgICAgICAgIGZpbmRfaW5fYnVja2V0IHJlc3RcbiAgICAgICAgICBlbmRcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPlxuICAgICAgICAgIGZpbmRfaW5fYnVja2V0IHJlc3QgaW5cbiAgICAgIGZpbmRfaW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGggaGtleSlcblxuXG4gICAgbGV0IHJlcGxhY2UgaCBrZXkgaW5mbyA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IHJlYyByZXBsYWNlX2J1Y2tldCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgRW1wdHkgLT4gcmFpc2UgTm90X2ZvdW5kXG4gICAgICAgIHwgQ29ucyhoaywgYywgbmV4dCkgd2hlbiBoa2V5ID0gaGsgLT5cbiAgICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgICAgfCBFVHJ1ZSAtPiBILnNldF9rZXlfZGF0YSBjIGtleSBpbmZvXG4gICAgICAgICAgICB8IEVGYWxzZSB8IEVEZWFkIC0+IHJlcGxhY2VfYnVja2V0IG5leHRcbiAgICAgICAgICAgIGVuZFxuICAgICAgICB8IENvbnMoXyxfLG5leHQpIC0+IHJlcGxhY2VfYnVja2V0IG5leHRcbiAgICAgIGluXG4gICAgICBsZXQgaSA9IGtleV9pbmRleCBoIGhrZXkgaW5cbiAgICAgIGxldCBsID0gaC5kYXRhLihpKSBpblxuICAgICAgdHJ5XG4gICAgICAgIHJlcGxhY2VfYnVja2V0IGxcbiAgICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgIGxldCBjb250YWluZXIgPSBILmNyZWF0ZSBrZXkgaW5mbyBpblxuICAgICAgICBoLmRhdGEuKGkpIDwtIENvbnMoaGtleSwgY29udGFpbmVyLCBsKTtcbiAgICAgICAgaC5zaXplIDwtIGguc2l6ZSArIDE7XG4gICAgICAgIGlmIGguc2l6ZSA+IEFycmF5Lmxlbmd0aCBoLmRhdGEgbHNsIDEgdGhlbiByZXNpemUgaFxuXG4gICAgbGV0IG1lbSBoIGtleSA9XG4gICAgICBsZXQgaGtleSA9IEguc2VlZGVkX2hhc2ggaC5zZWVkIGtleSBpblxuICAgICAgbGV0IHJlYyBtZW1faW5fYnVja2V0ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT5cbiAgICAgICAgICBmYWxzZVxuICAgICAgfCBDb25zKGhrLCBjLCByZXN0KSB3aGVuIGhrID0gaGtleSAtPlxuICAgICAgICAgIGJlZ2luIG1hdGNoIEguZXF1YWwgYyBrZXkgd2l0aFxuICAgICAgICAgIHwgRVRydWUgLT4gdHJ1ZVxuICAgICAgICAgIHwgRUZhbHNlIHwgRURlYWQgLT4gbWVtX2luX2J1Y2tldCByZXN0XG4gICAgICAgICAgZW5kXG4gICAgICB8IENvbnMoX2hrLCBfYywgcmVzdCkgLT4gbWVtX2luX2J1Y2tldCByZXN0IGluXG4gICAgICBtZW1faW5fYnVja2V0IGguZGF0YS4oa2V5X2luZGV4IGggaGtleSlcblxuICAgIGxldCBsZW5ndGggaCA9IGguc2l6ZVxuXG4gICAgbGV0IHJlYyBidWNrZXRfbGVuZ3RoIGFjY3UgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgICB8IENvbnMoXywgXywgcmVzdCkgLT4gYnVja2V0X2xlbmd0aCAoYWNjdSArIDEpIHJlc3RcblxuICAgIGxldCBzdGF0cyBoID1cbiAgICAgIGxldCBtYmwgPVxuICAgICAgICBBcnJheS5mb2xkX2xlZnQgKGZ1biBtIGIgLT4gSW50Lm1heCBtIChidWNrZXRfbGVuZ3RoIDAgYikpIDAgaC5kYXRhIGluXG4gICAgICBsZXQgaGlzdG8gPSBBcnJheS5tYWtlIChtYmwgKyAxKSAwIGluXG4gICAgICBBcnJheS5pdGVyXG4gICAgICAgIChmdW4gYiAtPlxuICAgICAgICAgICBsZXQgbCA9IGJ1Y2tldF9sZW5ndGggMCBiIGluXG4gICAgICAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgICAgICBoLmRhdGE7XG4gICAgICB7IEhhc2h0YmwubnVtX2JpbmRpbmdzID0gaC5zaXplO1xuICAgICAgICBudW1fYnVja2V0cyA9IEFycmF5Lmxlbmd0aCBoLmRhdGE7XG4gICAgICAgIG1heF9idWNrZXRfbGVuZ3RoID0gbWJsO1xuICAgICAgICBidWNrZXRfaGlzdG9ncmFtID0gaGlzdG8gfVxuXG4gICAgbGV0IHJlYyBidWNrZXRfbGVuZ3RoX2FsaXZlIGFjY3UgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgICB8IENvbnMoXywgYywgcmVzdCkgd2hlbiBILmNoZWNrX2tleSBjIC0+XG4gICAgICAgICAgYnVja2V0X2xlbmd0aF9hbGl2ZSAoYWNjdSArIDEpIHJlc3RcbiAgICAgIHwgQ29ucyhfLCBfLCByZXN0KSAtPiBidWNrZXRfbGVuZ3RoX2FsaXZlIGFjY3UgcmVzdFxuXG4gICAgbGV0IHN0YXRzX2FsaXZlIGggPVxuICAgICAgbGV0IHNpemUgPSByZWYgMCBpblxuICAgICAgbGV0IG1ibCA9XG4gICAgICAgIEFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgIChmdW4gbSBiIC0+IEludC5tYXggbSAoYnVja2V0X2xlbmd0aF9hbGl2ZSAwIGIpKSAwIGguZGF0YVxuICAgICAgaW5cbiAgICAgIGxldCBoaXN0byA9IEFycmF5Lm1ha2UgKG1ibCArIDEpIDAgaW5cbiAgICAgIEFycmF5Lml0ZXJcbiAgICAgICAgKGZ1biBiIC0+XG4gICAgICAgICAgIGxldCBsID0gYnVja2V0X2xlbmd0aF9hbGl2ZSAwIGIgaW5cbiAgICAgICAgICAgc2l6ZSA6PSAhc2l6ZSArIGw7XG4gICAgICAgICAgIGhpc3RvLihsKSA8LSBoaXN0by4obCkgKyAxKVxuICAgICAgICBoLmRhdGE7XG4gICAgICB7IEhhc2h0YmwubnVtX2JpbmRpbmdzID0gIXNpemU7XG4gICAgICAgIG51bV9idWNrZXRzID0gQXJyYXkubGVuZ3RoIGguZGF0YTtcbiAgICAgICAgbWF4X2J1Y2tldF9sZW5ndGggPSBtYmw7XG4gICAgICAgIGJ1Y2tldF9oaXN0b2dyYW0gPSBoaXN0byB9XG5cbiAgICBsZXQgYWRkX3NlcSB0YmwgaSA9XG4gICAgICBTZXEuaXRlciAoZnVuIChrLHYpIC0+IGFkZCB0YmwgayB2KSBpXG5cbiAgICBsZXQgcmVwbGFjZV9zZXEgdGJsIGkgPVxuICAgICAgU2VxLml0ZXIgKGZ1biAoayx2KSAtPiByZXBsYWNlIHRibCBrIHYpIGlcblxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBPYmpFcGggPSBPYmouRXBoZW1lcm9uXG5cbmxldCBfb2JqX29wdCA6IE9iai50IG9wdGlvbiAtPiAnYSBvcHRpb24gPSBmdW4geCAtPlxuICBtYXRjaCB4IHdpdGhcbiAgfCBOb25lIC0+IHhcbiAgfCBTb21lIHYgLT4gU29tZSAoT2JqLm9iaiB2KVxuXG4oKiogVGhlIHByZXZpb3VzIGZ1bmN0aW9uIGlzIHR5cGVkIHNvIHRoaXMgb25lIGlzIGFsc28gY29ycmVjdCAqKVxubGV0IG9ial9vcHQgOiBPYmoudCBvcHRpb24gLT4gJ2Egb3B0aW9uID0gZnVuIHggLT4gT2JqLm1hZ2ljIHhcblxuXG5tb2R1bGUgSzEgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2ssJ2QpIHQgPSBPYmpFcGgudFxuXG4gIGxldCBjcmVhdGUgKCkgOiAoJ2ssJ2QpIHQgPSBPYmpFcGguY3JlYXRlIDFcblxuICBsZXQgZ2V0X2tleSAodDooJ2ssJ2QpIHQpIDogJ2sgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCAwKVxuICBsZXQgc2V0X2tleSAodDooJ2ssJ2QpIHQpIChrOidrKSA6IHVuaXQgPSBPYmpFcGguc2V0X2tleSB0IDAgKE9iai5yZXByIGspXG4gIGxldCBjaGVja19rZXkgKHQ6KCdrLCdkKSB0KSA6IGJvb2wgPSBPYmpFcGguY2hlY2tfa2V5IHQgMFxuXG4gIGxldCBnZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogJ2Qgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9kYXRhIHQpXG4gIGxldCBzZXRfZGF0YSAodDooJ2ssJ2QpIHQpIChkOidkKSA6IHVuaXQgPSBPYmpFcGguc2V0X2RhdGEgdCAoT2JqLnJlcHIgZClcbiAgbGV0IHVuc2V0X2RhdGEgKHQ6KCdrLCdkKSB0KSA6IHVuaXQgPSBPYmpFcGgudW5zZXRfZGF0YSB0XG5cbiAgbGV0IG1ha2Uga2V5IGRhdGEgPVxuICAgIGxldCBlcGggPSBjcmVhdGUgKCkgaW5cbiAgICBzZXRfZGF0YSBlcGggZGF0YTtcbiAgICBzZXRfa2V5IGVwaCBrZXk7XG4gICAgZXBoXG5cbiAgbGV0IHF1ZXJ5IGVwaCBrZXkgPVxuICAgIG1hdGNoIGdldF9rZXkgZXBoIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXkgLT4gZ2V0X2RhdGEgZXBoXG4gICAgfCBTb21lIF8gLT4gTm9uZVxuXG4gIG1vZHVsZSBNYWtlU2VlZGVkIChIOkhhc2h0YmwuU2VlZGVkSGFzaGVkVHlwZSkgPVxuICAgIEdlbkhhc2hUYWJsZS5NYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgdHlwZSAnYSBjb250YWluZXIgPSAoSC50LCdhKSB0XG4gICAgICB0eXBlIHQgPSBILnRcbiAgICAgIGxldCBjcmVhdGUgayBkID1cbiAgICAgICAgbGV0IGMgPSBjcmVhdGUgKCkgaW5cbiAgICAgICAgc2V0X2RhdGEgYyBkO1xuICAgICAgICBzZXRfa2V5IGMgaztcbiAgICAgICAgY1xuICAgICAgbGV0IHNlZWRlZF9oYXNoID0gSC5zZWVkZWRfaGFzaFxuICAgICAgbGV0IGVxdWFsIGMgayA9XG4gICAgICAgICgqIHshZ2V0X2tleV9jb3B5fSBpcyBub3QgdXNlZCBiZWNhdXNlIHRoZSBlcXVhbGl0eSBvZiB0aGUgdXNlciBjYW4gYmVcbiAgICAgICAgICAgIHRoZSBwaHlzaWNhbCBlcXVhbGl0eSAqKVxuICAgICAgICBtYXRjaCBnZXRfa2V5IGMgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gR2VuSGFzaFRhYmxlLkVEZWFkXG4gICAgICAgIHwgU29tZSBrJyAtPlxuICAgICAgICAgICAgaWYgSC5lcXVhbCBrIGsnIHRoZW4gR2VuSGFzaFRhYmxlLkVUcnVlIGVsc2UgR2VuSGFzaFRhYmxlLkVGYWxzZVxuICAgICAgbGV0IGdldF9kYXRhID0gZ2V0X2RhdGFcbiAgICAgIGxldCBzZXRfa2V5X2RhdGEgYyBrIGQgPVxuICAgICAgICB1bnNldF9kYXRhIGM7XG4gICAgICAgIHNldF9rZXkgYyBrO1xuICAgICAgICBzZXRfZGF0YSBjIGRcbiAgICAgIGxldCBjaGVja19rZXkgPSBjaGVja19rZXlcbiAgICBlbmQpXG5cbiAgbW9kdWxlIE1ha2UoSDogSGFzaHRibC5IYXNoZWRUeXBlKTogKFMgd2l0aCB0eXBlIGtleSA9IEgudCkgPVxuICBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1ha2VTZWVkZWQoc3RydWN0XG4gICAgICAgIHR5cGUgdCA9IEgudFxuICAgICAgICBsZXQgZXF1YWwgPSBILmVxdWFsXG4gICAgICAgIGxldCBzZWVkZWRfaGFzaCAoX3NlZWQ6IGludCkgeCA9IEguaGFzaCB4XG4gICAgICBlbmQpXG4gICAgbGV0IGNyZWF0ZSBzeiA9IGNyZWF0ZSB+cmFuZG9tOmZhbHNlIHN6XG4gICAgbGV0IG9mX3NlcSBpID1cbiAgICAgIGxldCB0YmwgPSBjcmVhdGUgMTYgaW5cbiAgICAgIHJlcGxhY2Vfc2VxIHRibCBpO1xuICAgICAgdGJsXG4gIGVuZFxuXG4gIG1vZHVsZSBCdWNrZXQgPSBzdHJ1Y3RcblxuICAgIHR5cGUgbm9ucmVjICgnaywgJ2QpIHQgPSAoJ2ssICdkKSB0IGxpc3QgcmVmXG4gICAgbGV0IGsxX21ha2UgPSBtYWtlXG4gICAgbGV0IG1ha2UgKCkgPSByZWYgW11cbiAgICBsZXQgYWRkIGIgayBkID0gYiA6PSBrMV9tYWtlIGsgZCA6OiAhYlxuXG4gICAgbGV0IHRlc3Rfa2V5IGsgZSA9XG4gICAgICBtYXRjaCBnZXRfa2V5IGUgd2l0aFxuICAgICAgfCBTb21lIHggd2hlbiB4ID09IGsgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGZhbHNlXG5cbiAgICBsZXQgcmVtb3ZlIGIgayA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5IGsgaCAtPiBiIDo9IExpc3QucmV2X2FwcGVuZCBhY2MgdFxuICAgICAgICB8IGggOjogdCAtPiBsb29wIHQgKGggOjogYWNjKVxuICAgICAgaW5cbiAgICAgIGxvb3AgIWIgW11cblxuICAgIGxldCBmaW5kIGIgayA9XG4gICAgICBtYXRjaCBMaXN0LmZpbmRfb3B0ICh0ZXN0X2tleSBrKSAhYiB3aXRoXG4gICAgICB8IFNvbWUgZSAtPiBnZXRfZGF0YSBlXG4gICAgICB8IE5vbmUgLT4gTm9uZVxuXG4gICAgbGV0IGxlbmd0aCBiID0gTGlzdC5sZW5ndGggIWJcbiAgICBsZXQgY2xlYXIgYiA9IGIgOj0gW11cblxuICBlbmRcblxuZW5kXG5cbm1vZHVsZSBLMiA9IHN0cnVjdFxuICB0eXBlICgnazEsICdrMiwgJ2QpIHQgPSBPYmpFcGgudFxuXG4gIGxldCBjcmVhdGUgKCkgOiAoJ2sxLCdrMiwnZCkgdCA9IE9iakVwaC5jcmVhdGUgMlxuXG4gIGxldCBnZXRfa2V5MSAodDooJ2sxLCdrMiwnZCkgdCkgOiAnazEgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCAwKVxuICBsZXQgc2V0X2tleTEgKHQ6KCdrMSwnazIsJ2QpIHQpIChrOidrMSkgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2tleSB0IDAgKE9iai5yZXByIGspXG4gIGxldCBjaGVja19rZXkxICh0OignazEsJ2syLCdkKSB0KSA6IGJvb2wgPSBPYmpFcGguY2hlY2tfa2V5IHQgMFxuXG4gIGxldCBnZXRfa2V5MiAodDooJ2sxLCdrMiwnZCkgdCkgOiAnazIgb3B0aW9uID0gb2JqX29wdCAoT2JqRXBoLmdldF9rZXkgdCAxKVxuICBsZXQgc2V0X2tleTIgKHQ6KCdrMSwnazIsJ2QpIHQpIChrOidrMikgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2tleSB0IDEgKE9iai5yZXByIGspXG4gIGxldCBjaGVja19rZXkyICh0OignazEsJ2syLCdkKSB0KSA6IGJvb2wgPSBPYmpFcGguY2hlY2tfa2V5IHQgMVxuXG4gIGxldCBnZXRfZGF0YSAodDooJ2sxLCdrMiwnZCkgdCkgOiAnZCBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2RhdGEgdClcbiAgbGV0IHNldF9kYXRhICh0OignazEsJ2syLCdkKSB0KSAoZDonZCkgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2RhdGEgdCAoT2JqLnJlcHIgZClcbiAgbGV0IHVuc2V0X2RhdGEgKHQ6KCdrMSwnazIsJ2QpIHQpIDogdW5pdCA9IE9iakVwaC51bnNldF9kYXRhIHRcblxuICBsZXQgbWFrZSBrZXkxIGtleTIgZGF0YSA9XG4gICAgbGV0IGVwaCA9IGNyZWF0ZSAoKSBpblxuICAgIHNldF9kYXRhIGVwaCBkYXRhO1xuICAgIHNldF9rZXkxIGVwaCBrZXkxO1xuICAgIHNldF9rZXkyIGVwaCBrZXkyO1xuICAgIGlnbm9yZSAoU3lzLm9wYXF1ZV9pZGVudGl0eSBrZXkxKTtcbiAgICBlcGhcblxuICBsZXQgcXVlcnkgZXBoIGtleTEga2V5MiA9XG4gICAgbWF0Y2ggZ2V0X2tleTEgZXBoIHdpdGhcbiAgICB8IE5vbmUgLT4gTm9uZVxuICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXkxIC0+XG4gICAgICAgIGJlZ2luIG1hdGNoIGdldF9rZXkyIGVwaCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgIHwgU29tZSBrIHdoZW4gayA9PSBrZXkyIC0+IGdldF9kYXRhIGVwaFxuICAgICAgICB8IFNvbWUgXyAtPiBOb25lXG4gICAgICAgIGVuZFxuICAgIHwgU29tZSBfIC0+IE5vbmVcblxuICBtb2R1bGUgTWFrZVNlZWRlZFxuICAgICAgKEgxOkhhc2h0YmwuU2VlZGVkSGFzaGVkVHlwZSlcbiAgICAgIChIMjpIYXNodGJsLlNlZWRlZEhhc2hlZFR5cGUpID1cbiAgICBHZW5IYXNoVGFibGUuTWFrZVNlZWRlZChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgY29udGFpbmVyID0gKEgxLnQsSDIudCwnYSkgdFxuICAgICAgdHlwZSB0ID0gSDEudCAqIEgyLnRcbiAgICAgIGxldCBjcmVhdGUgKGsxLGsyKSBkID1cbiAgICAgICAgbGV0IGMgPSBjcmVhdGUgKCkgaW5cbiAgICAgICAgc2V0X2RhdGEgYyBkO1xuICAgICAgICBzZXRfa2V5MSBjIGsxOyBzZXRfa2V5MiBjIGsyO1xuICAgICAgICBjXG4gICAgICBsZXQgc2VlZGVkX2hhc2ggc2VlZCAoazEsazIpID1cbiAgICAgICAgSDEuc2VlZGVkX2hhc2ggc2VlZCBrMSArIEgyLnNlZWRlZF9oYXNoIHNlZWQgazIgKiA2NTU5OVxuICAgICAgbGV0IGVxdWFsIGMgKGsxLGsyKSA9XG4gICAgICAgIG1hdGNoIGdldF9rZXkxIGMsIGdldF9rZXkyIGMgd2l0aFxuICAgICAgICB8IE5vbmUsIF8gfCBfICwgTm9uZSAtPiBHZW5IYXNoVGFibGUuRURlYWRcbiAgICAgICAgfCBTb21lIGsxJywgU29tZSBrMicgLT5cbiAgICAgICAgICAgIGlmIEgxLmVxdWFsIGsxIGsxJyAmJiBIMi5lcXVhbCBrMiBrMidcbiAgICAgICAgICAgIHRoZW4gR2VuSGFzaFRhYmxlLkVUcnVlIGVsc2UgR2VuSGFzaFRhYmxlLkVGYWxzZVxuICAgICAgbGV0IGdldF9kYXRhID0gZ2V0X2RhdGFcbiAgICAgIGxldCBzZXRfa2V5X2RhdGEgYyAoazEsazIpIGQgPVxuICAgICAgICB1bnNldF9kYXRhIGM7XG4gICAgICAgIHNldF9rZXkxIGMgazE7IHNldF9rZXkyIGMgazI7XG4gICAgICAgIHNldF9kYXRhIGMgZFxuICAgICAgbGV0IGNoZWNrX2tleSBjID0gY2hlY2tfa2V5MSBjICYmIGNoZWNrX2tleTIgY1xuICAgIGVuZClcblxuICBtb2R1bGUgTWFrZShIMTogSGFzaHRibC5IYXNoZWRUeXBlKShIMjogSGFzaHRibC5IYXNoZWRUeXBlKTpcbiAgICAoUyB3aXRoIHR5cGUga2V5ID0gSDEudCAqIEgyLnQpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkXG4gICAgICAgIChzdHJ1Y3RcbiAgICAgICAgICB0eXBlIHQgPSBIMS50XG4gICAgICAgICAgbGV0IGVxdWFsID0gSDEuZXF1YWxcbiAgICAgICAgICBsZXQgc2VlZGVkX2hhc2ggKF9zZWVkOiBpbnQpIHggPSBIMS5oYXNoIHhcbiAgICAgICAgZW5kKVxuICAgICAgICAoc3RydWN0XG4gICAgICAgICAgdHlwZSB0ID0gSDIudFxuICAgICAgICAgIGxldCBlcXVhbCA9IEgyLmVxdWFsXG4gICAgICAgICAgbGV0IHNlZWRlZF9oYXNoIChfc2VlZDogaW50KSB4ID0gSDIuaGFzaCB4XG4gICAgICAgIGVuZClcbiAgICBsZXQgY3JlYXRlIHN6ID0gY3JlYXRlIH5yYW5kb206ZmFsc2Ugc3pcbiAgICBsZXQgb2Zfc2VxIGkgPVxuICAgICAgbGV0IHRibCA9IGNyZWF0ZSAxNiBpblxuICAgICAgcmVwbGFjZV9zZXEgdGJsIGk7XG4gICAgICB0YmxcbiAgZW5kXG5cbiAgbW9kdWxlIEJ1Y2tldCA9IHN0cnVjdFxuXG4gICAgdHlwZSBub25yZWMgKCdrMSwgJ2syLCAnZCkgdCA9ICgnazEsICdrMiwgJ2QpIHQgbGlzdCByZWZcbiAgICBsZXQgazJfbWFrZSA9IG1ha2VcbiAgICBsZXQgbWFrZSAoKSA9IHJlZiBbXVxuICAgIGxldCBhZGQgYiBrMSBrMiBkID0gYiA6PSBrMl9tYWtlIGsxIGsyIGQgOjogIWJcblxuICAgIGxldCB0ZXN0X2tleXMgazEgazIgZSA9XG4gICAgICBtYXRjaCBnZXRfa2V5MSBlLCBnZXRfa2V5MiBlIHdpdGhcbiAgICAgIHwgU29tZSB4MSwgU29tZSB4MiB3aGVuIHgxID09IGsxICYmIHgyID09IGsyIC0+IHRydWVcbiAgICAgIHwgXyAtPiBmYWxzZVxuXG4gICAgbGV0IHJlbW92ZSBiIGsxIGsyID1cbiAgICAgIGxldCByZWMgbG9vcCBsIGFjYyA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IFtdIC0+ICgpXG4gICAgICAgIHwgaCA6OiB0IHdoZW4gdGVzdF9rZXlzIGsxIGsyIGggLT4gYiA6PSBMaXN0LnJldl9hcHBlbmQgYWNjIHRcbiAgICAgICAgfCBoIDo6IHQgLT4gbG9vcCB0IChoIDo6IGFjYylcbiAgICAgIGluXG4gICAgICBsb29wICFiIFtdXG5cbiAgICBsZXQgZmluZCBiIGsxIGsyID1cbiAgICAgIG1hdGNoIExpc3QuZmluZF9vcHQgKHRlc3Rfa2V5cyBrMSBrMikgIWIgd2l0aFxuICAgICAgfCBTb21lIGUgLT4gZ2V0X2RhdGEgZVxuICAgICAgfCBOb25lIC0+IE5vbmVcblxuICAgIGxldCBsZW5ndGggYiA9IExpc3QubGVuZ3RoICFiXG4gICAgbGV0IGNsZWFyIGIgPSBiIDo9IFtdXG5cbiAgZW5kXG5cbmVuZFxuXG5tb2R1bGUgS24gPSBzdHJ1Y3RcbiAgdHlwZSAoJ2ssJ2QpIHQgPSBPYmpFcGgudFxuXG4gIGxldCBjcmVhdGUgbiA6ICgnaywnZCkgdCA9IE9iakVwaC5jcmVhdGUgblxuICBsZXQgbGVuZ3RoIChrOignaywnZCkgdCkgOiBpbnQgPSBPYmpFcGgubGVuZ3RoIGtcblxuICBsZXQgZ2V0X2tleSAodDooJ2ssJ2QpIHQpIChuOmludCkgOiAnayBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2tleSB0IG4pXG4gIGxldCBzZXRfa2V5ICh0OignaywnZCkgdCkgKG46aW50KSAoazonaykgOiB1bml0ID1cbiAgICBPYmpFcGguc2V0X2tleSB0IG4gKE9iai5yZXByIGspXG4gIGxldCBjaGVja19rZXkgKHQ6KCdrLCdkKSB0KSAobjppbnQpIDogYm9vbCA9IE9iakVwaC5jaGVja19rZXkgdCBuXG5cbiAgbGV0IGdldF9kYXRhICh0OignaywnZCkgdCkgOiAnZCBvcHRpb24gPSBvYmpfb3B0IChPYmpFcGguZ2V0X2RhdGEgdClcbiAgbGV0IHNldF9kYXRhICh0OignaywnZCkgdCkgKGQ6J2QpIDogdW5pdCA9IE9iakVwaC5zZXRfZGF0YSB0IChPYmoucmVwciBkKVxuICBsZXQgdW5zZXRfZGF0YSAodDooJ2ssJ2QpIHQpIDogdW5pdCA9IE9iakVwaC51bnNldF9kYXRhIHRcblxuICBsZXQgbWFrZSBrZXlzIGRhdGEgPVxuICAgIGxldCBsID0gQXJyYXkubGVuZ3RoIGtleXMgaW5cbiAgICBsZXQgZXBoID0gY3JlYXRlIGwgaW5cbiAgICBzZXRfZGF0YSBlcGggZGF0YTtcbiAgICBmb3IgaSA9IDAgdG8gbCAtIDEgZG8gc2V0X2tleSBlcGggaSBrZXlzLihpKSBkb25lO1xuICAgIGVwaFxuXG4gIGxldCBxdWVyeSBlcGgga2V5cyA9XG4gICAgbGV0IGwgPSBsZW5ndGggZXBoIGluXG4gICAgdHJ5XG4gICAgICBpZiBsIDw+IEFycmF5Lmxlbmd0aCBrZXlzIHRoZW4gcmFpc2UgRXhpdDtcbiAgICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgICBtYXRjaCBnZXRfa2V5IGVwaCBpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHJhaXNlIEV4aXRcbiAgICAgICAgfCBTb21lIGsgd2hlbiBrID09IGtleXMuKGkpIC0+ICgpXG4gICAgICAgIHwgU29tZSBfIC0+IHJhaXNlIEV4aXRcbiAgICAgIGRvbmU7XG4gICAgICBnZXRfZGF0YSBlcGhcbiAgICB3aXRoIEV4aXQgLT4gTm9uZVxuXG4gIG1vZHVsZSBNYWtlU2VlZGVkIChIOkhhc2h0YmwuU2VlZGVkSGFzaGVkVHlwZSkgPVxuICAgIEdlbkhhc2hUYWJsZS5NYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgdHlwZSAnYSBjb250YWluZXIgPSAoSC50LCdhKSB0XG4gICAgICB0eXBlIHQgPSBILnQgYXJyYXlcbiAgICAgIGxldCBjcmVhdGUgayBkID1cbiAgICAgICAgbGV0IGMgPSBjcmVhdGUgKEFycmF5Lmxlbmd0aCBrKSBpblxuICAgICAgICBzZXRfZGF0YSBjIGQ7XG4gICAgICAgIGZvciBpPTAgdG8gQXJyYXkubGVuZ3RoIGsgLTEgZG9cbiAgICAgICAgICBzZXRfa2V5IGMgaSBrLihpKTtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgY1xuICAgICAgbGV0IHNlZWRlZF9oYXNoIHNlZWQgayA9XG4gICAgICAgIGxldCBoID0gcmVmIDAgaW5cbiAgICAgICAgZm9yIGk9MCB0byBBcnJheS5sZW5ndGggayAtMSBkb1xuICAgICAgICAgIGggOj0gSC5zZWVkZWRfaGFzaCBzZWVkIGsuKGkpICogNjU1OTkgKyAhaDtcbiAgICAgICAgZG9uZTtcbiAgICAgICAgIWhcbiAgICAgIGxldCBlcXVhbCBjIGsgPVxuICAgICAgICBsZXQgbGVuICA9IEFycmF5Lmxlbmd0aCBrIGluXG4gICAgICAgIGxldCBsZW4nID0gbGVuZ3RoIGMgaW5cbiAgICAgICAgaWYgbGVuICE9IGxlbicgdGhlbiBHZW5IYXNoVGFibGUuRUZhbHNlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsZXQgcmVjIGVxdWFsX2FycmF5IGsgYyBpID1cbiAgICAgICAgICAgIGlmIGkgPCAwIHRoZW4gR2VuSGFzaFRhYmxlLkVUcnVlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIG1hdGNoIGdldF9rZXkgYyBpIHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+IEdlbkhhc2hUYWJsZS5FRGVhZFxuICAgICAgICAgICAgICB8IFNvbWUga2kgLT5cbiAgICAgICAgICAgICAgICAgIGlmIEguZXF1YWwgay4oaSkga2lcbiAgICAgICAgICAgICAgICAgIHRoZW4gZXF1YWxfYXJyYXkgayBjIChpLTEpXG4gICAgICAgICAgICAgICAgICBlbHNlIEdlbkhhc2hUYWJsZS5FRmFsc2VcbiAgICAgICAgICBpblxuICAgICAgICAgIGVxdWFsX2FycmF5IGsgYyAobGVuLTEpXG4gICAgICBsZXQgZ2V0X2RhdGEgPSBnZXRfZGF0YVxuICAgICAgbGV0IHNldF9rZXlfZGF0YSBjIGsgZCA9XG4gICAgICAgIHVuc2V0X2RhdGEgYztcbiAgICAgICAgZm9yIGk9MCB0byBBcnJheS5sZW5ndGggayAtMSBkb1xuICAgICAgICAgIHNldF9rZXkgYyBpIGsuKGkpO1xuICAgICAgICBkb25lO1xuICAgICAgICBzZXRfZGF0YSBjIGRcbiAgICAgIGxldCBjaGVja19rZXkgYyA9XG4gICAgICAgIGxldCByZWMgY2hlY2sgYyBpID1cbiAgICAgICAgICBpIDwgMCB8fCAoY2hlY2tfa2V5IGMgaSAmJiBjaGVjayBjIChpLTEpKSBpblxuICAgICAgICBjaGVjayBjIChsZW5ndGggYyAtIDEpXG4gICAgZW5kKVxuXG4gIG1vZHVsZSBNYWtlKEg6IEhhc2h0YmwuSGFzaGVkVHlwZSk6IChTIHdpdGggdHlwZSBrZXkgPSBILnQgYXJyYXkpID1cbiAgc3RydWN0XG4gICAgaW5jbHVkZSBNYWtlU2VlZGVkKHN0cnVjdFxuICAgICAgICB0eXBlIHQgPSBILnRcbiAgICAgICAgbGV0IGVxdWFsID0gSC5lcXVhbFxuICAgICAgICBsZXQgc2VlZGVkX2hhc2ggKF9zZWVkOiBpbnQpIHggPSBILmhhc2ggeFxuICAgICAgZW5kKVxuICAgIGxldCBjcmVhdGUgc3ogPSBjcmVhdGUgfnJhbmRvbTpmYWxzZSBzelxuICAgIGxldCBvZl9zZXEgaSA9XG4gICAgICBsZXQgdGJsID0gY3JlYXRlIDE2IGluXG4gICAgICByZXBsYWNlX3NlcSB0YmwgaTtcbiAgICAgIHRibFxuICBlbmRcblxuICBtb2R1bGUgQnVja2V0ID0gc3RydWN0XG5cbiAgICB0eXBlIG5vbnJlYyAoJ2ssICdkKSB0ID0gKCdrLCAnZCkgdCBsaXN0IHJlZlxuICAgIGxldCBrbl9tYWtlID0gbWFrZVxuICAgIGxldCBtYWtlICgpID0gcmVmIFtdXG4gICAgbGV0IGFkZCBiIGsgZCA9IGIgOj0ga25fbWFrZSBrIGQgOjogIWJcblxuICAgIGxldCB0ZXN0X2tleXMgayBlID1cbiAgICAgIHRyeVxuICAgICAgICBpZiBsZW5ndGggZSA8PiBBcnJheS5sZW5ndGggayB0aGVuIHJhaXNlIEV4aXQ7XG4gICAgICAgIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggayAtIDEgZG9cbiAgICAgICAgICBtYXRjaCBnZXRfa2V5IGUgaSB3aXRoXG4gICAgICAgICAgfCBTb21lIHggd2hlbiB4ID09IGsuKGkpIC0+ICgpXG4gICAgICAgICAgfCBfIC0+IHJhaXNlIEV4aXRcbiAgICAgICAgZG9uZTtcbiAgICAgICAgdHJ1ZVxuICAgICAgd2l0aCBFeGl0IC0+IGZhbHNlXG5cbiAgICBsZXQgcmVtb3ZlIGIgayA9XG4gICAgICBsZXQgcmVjIGxvb3AgbCBhY2MgPVxuICAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICAgfCBbXSAtPiAoKVxuICAgICAgICB8IGggOjogdCB3aGVuIHRlc3Rfa2V5cyBrIGggLT4gYiA6PSBMaXN0LnJldl9hcHBlbmQgYWNjIHRcbiAgICAgICAgfCBoIDo6IHQgLT4gbG9vcCB0IChoIDo6IGFjYylcbiAgICAgIGluXG4gICAgICBsb29wICFiIFtdXG5cbiAgICBsZXQgZmluZCBiIGsgPVxuICAgICAgbWF0Y2ggTGlzdC5maW5kX29wdCAodGVzdF9rZXlzIGspICFiIHdpdGhcbiAgICAgIHwgU29tZSBlIC0+IGdldF9kYXRhIGVcbiAgICAgIHwgTm9uZSAtPiBOb25lXG5cbiAgICBsZXQgbGVuZ3RoIGIgPSBMaXN0Lmxlbmd0aCAhYlxuICAgIGxldCBjbGVhciBiID0gYiA6PSBbXVxuXG4gIGVuZFxuXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICBYYXZpZXIgTGVyb3kgYW5kIERhbWllbiBEb2xpZ2V6LCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICAgKilcbigqICAgICBlbiBBdXRvbWF0aXF1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgICAgKilcbigqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuMSwgd2l0aCB0aGUgICAgICAgICAgKilcbigqICAgc3BlY2lhbCBleGNlcHRpb24gb24gbGlua2luZyBkZXNjcmliZWQgaW4gdGhlIGZpbGUgTElDRU5TRS4gICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxubGV0IGdlbmVyaWNfcXVvdGUgcXVvdGVxdW90ZSBzID1cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIChsICsgMjApIGluXG4gIEJ1ZmZlci5hZGRfY2hhciBiICdcXCcnO1xuICBmb3IgaSA9IDAgdG8gbCAtIDEgZG9cbiAgICBpZiBzLltpXSA9ICdcXCcnXG4gICAgdGhlbiBCdWZmZXIuYWRkX3N0cmluZyBiIHF1b3RlcXVvdGVcbiAgICBlbHNlIEJ1ZmZlci5hZGRfY2hhciBiICBzLltpXVxuICBkb25lO1xuICBCdWZmZXIuYWRkX2NoYXIgYiAnXFwnJztcbiAgQnVmZmVyLmNvbnRlbnRzIGJcblxuKCogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBPcGVuIEdyb3VwIHNwZWNpZmljYXRpb24gZm91bmQgaGVyZTpcbiAgW1sxXV0gaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2Jhc2VuYW1lLmh0bWxcbiAgSW4gc3RlcCAxIG9mIFtbMV1dLCB3ZSBjaG9vc2UgdG8gcmV0dXJuIFwiLlwiIGZvciBlbXB0eSBpbnB1dC5cbiAgICAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPQ2FtbClcbiAgSW4gc3RlcCAyLCB3ZSBjaG9vc2UgdG8gcHJvY2VzcyBcIi8vXCIgbm9ybWFsbHkuXG4gIFN0ZXAgNiBpcyBub3QgaW1wbGVtZW50ZWQ6IHdlIGNvbnNpZGVyIHRoYXQgdGhlIFtzdWZmaXhdIG9wZXJhbmQgaXNcbiAgICBhbHdheXMgYWJzZW50LiAgU3VmZml4ZXMgYXJlIGhhbmRsZWQgYnkgW2Nob3Bfc3VmZml4XSBhbmQgW2Nob3BfZXh0ZW5zaW9uXS5cbiopXG5sZXQgZ2VuZXJpY19iYXNlbmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWUgbmFtZSA9XG4gIGxldCByZWMgZmluZF9lbmQgbiA9XG4gICAgaWYgbiA8IDAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCAxXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIGZpbmRfZW5kIChuIC0gMSlcbiAgICBlbHNlIGZpbmRfYmVnIG4gKG4gKyAxKVxuICBhbmQgZmluZF9iZWcgbiBwID1cbiAgICBpZiBuIDwgMCB0aGVuIFN0cmluZy5zdWIgbmFtZSAwIHBcbiAgICBlbHNlIGlmIGlzX2Rpcl9zZXAgbmFtZSBuIHRoZW4gU3RyaW5nLnN1YiBuYW1lIChuICsgMSkgKHAgLSBuIC0gMSlcbiAgICBlbHNlIGZpbmRfYmVnIChuIC0gMSkgcFxuICBpblxuICBpZiBuYW1lID0gXCJcIlxuICB0aGVuIGN1cnJlbnRfZGlyX25hbWVcbiAgZWxzZSBmaW5kX2VuZCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gMSlcblxuKCogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBPcGVuIEdyb3VwIHNwZWNpZmljYXRpb24gZm91bmQgaGVyZTpcbiAgW1syXV0gaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2Rpcm5hbWUuaHRtbFxuICBJbiBzdGVwIDYgb2YgW1syXV0sIHdlIGNob29zZSB0byBwcm9jZXNzIFwiLy9cIiBub3JtYWxseS5cbiopXG5sZXQgZ2VuZXJpY19kaXJuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZSBuYW1lID1cbiAgbGV0IHJlYyB0cmFpbGluZ19zZXAgbiA9XG4gICAgaWYgbiA8IDAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCAxXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIHRyYWlsaW5nX3NlcCAobiAtIDEpXG4gICAgZWxzZSBiYXNlIG5cbiAgYW5kIGJhc2UgbiA9XG4gICAgaWYgbiA8IDAgdGhlbiBjdXJyZW50X2Rpcl9uYW1lXG4gICAgZWxzZSBpZiBpc19kaXJfc2VwIG5hbWUgbiB0aGVuIGludGVybWVkaWF0ZV9zZXAgblxuICAgIGVsc2UgYmFzZSAobiAtIDEpXG4gIGFuZCBpbnRlcm1lZGlhdGVfc2VwIG4gPVxuICAgIGlmIG4gPCAwIHRoZW4gU3RyaW5nLnN1YiBuYW1lIDAgMVxuICAgIGVsc2UgaWYgaXNfZGlyX3NlcCBuYW1lIG4gdGhlbiBpbnRlcm1lZGlhdGVfc2VwIChuIC0gMSlcbiAgICBlbHNlIFN0cmluZy5zdWIgbmFtZSAwIChuICsgMSlcbiAgaW5cbiAgaWYgbmFtZSA9IFwiXCJcbiAgdGhlbiBjdXJyZW50X2Rpcl9uYW1lXG4gIGVsc2UgdHJhaWxpbmdfc2VwIChTdHJpbmcubGVuZ3RoIG5hbWUgLSAxKVxuXG5tb2R1bGUgdHlwZSBTWVNERVBTID0gc2lnXG4gIHZhbCBudWxsIDogc3RyaW5nXG4gIHZhbCBjdXJyZW50X2Rpcl9uYW1lIDogc3RyaW5nXG4gIHZhbCBwYXJlbnRfZGlyX25hbWUgOiBzdHJpbmdcbiAgdmFsIGRpcl9zZXAgOiBzdHJpbmdcbiAgdmFsIGlzX2Rpcl9zZXAgOiBzdHJpbmcgLT4gaW50IC0+IGJvb2xcbiAgdmFsIGlzX3JlbGF0aXZlIDogc3RyaW5nIC0+IGJvb2xcbiAgdmFsIGlzX2ltcGxpY2l0IDogc3RyaW5nIC0+IGJvb2xcbiAgdmFsIGNoZWNrX3N1ZmZpeCA6IHN0cmluZyAtPiBzdHJpbmcgLT4gYm9vbFxuICB2YWwgY2hvcF9zdWZmaXhfb3B0IDogc3VmZml4OnN0cmluZyAtPiBzdHJpbmcgLT4gc3RyaW5nIG9wdGlvblxuICB2YWwgdGVtcF9kaXJfbmFtZSA6IHN0cmluZ1xuICB2YWwgcXVvdGUgOiBzdHJpbmcgLT4gc3RyaW5nXG4gIHZhbCBxdW90ZV9jb21tYW5kIDpcbiAgICBzdHJpbmcgLT4gP3N0ZGluOiBzdHJpbmcgLT4gP3N0ZG91dDogc3RyaW5nIC0+ID9zdGRlcnI6IHN0cmluZ1xuICAgICAgICAgICAtPiBzdHJpbmcgbGlzdCAtPiBzdHJpbmdcbiAgdmFsIGJhc2VuYW1lIDogc3RyaW5nIC0+IHN0cmluZ1xuICB2YWwgZGlybmFtZSA6IHN0cmluZyAtPiBzdHJpbmdcbmVuZFxuXG5tb2R1bGUgVW5peCA6IFNZU0RFUFMgPSBzdHJ1Y3RcbiAgbGV0IG51bGwgPSBcIi9kZXYvbnVsbFwiXG4gIGxldCBjdXJyZW50X2Rpcl9uYW1lID0gXCIuXCJcbiAgbGV0IHBhcmVudF9kaXJfbmFtZSA9IFwiLi5cIlxuICBsZXQgZGlyX3NlcCA9IFwiL1wiXG4gIGxldCBpc19kaXJfc2VwIHMgaSA9IHMuW2ldID0gJy8nXG4gIGxldCBpc19yZWxhdGl2ZSBuID0gU3RyaW5nLmxlbmd0aCBuIDwgMSB8fCBuLlswXSA8PiAnLydcbiAgbGV0IGlzX2ltcGxpY2l0IG4gPVxuICAgIGlzX3JlbGF0aXZlIG5cbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMiB8fCBTdHJpbmcuc3ViIG4gMCAyIDw+IFwiLi9cIilcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMyB8fCBTdHJpbmcuc3ViIG4gMCAzIDw+IFwiLi4vXCIpXG4gIGxldCBjaGVja19zdWZmaXggbmFtZSBzdWZmID1cbiAgICBTdHJpbmcuZW5kc193aXRoIH5zdWZmaXg6c3VmZiBuYW1lXG5cbiAgbGV0IGNob3Bfc3VmZml4X29wdCB+c3VmZml4IGZpbGVuYW1lID1cbiAgICBsZXQgbGVuX3MgPSBTdHJpbmcubGVuZ3RoIHN1ZmZpeCBhbmQgbGVuX2YgPSBTdHJpbmcubGVuZ3RoIGZpbGVuYW1lIGluXG4gICAgaWYgbGVuX2YgPj0gbGVuX3MgdGhlblxuICAgICAgbGV0IHIgPSBTdHJpbmcuc3ViIGZpbGVuYW1lIChsZW5fZiAtIGxlbl9zKSBsZW5fcyBpblxuICAgICAgaWYgciA9IHN1ZmZpeCB0aGVuXG4gICAgICAgIFNvbWUgKFN0cmluZy5zdWIgZmlsZW5hbWUgMCAobGVuX2YgLSBsZW5fcykpXG4gICAgICBlbHNlXG4gICAgICAgIE5vbmVcbiAgICBlbHNlXG4gICAgICBOb25lXG5cbiAgbGV0IHRlbXBfZGlyX25hbWUgPVxuICAgIHRyeSBTeXMuZ2V0ZW52IFwiVE1QRElSXCIgd2l0aCBOb3RfZm91bmQgLT4gXCIvdG1wXCJcbiAgbGV0IHF1b3RlID0gZ2VuZXJpY19xdW90ZSBcIidcXFxcJydcIlxuICBsZXQgcXVvdGVfY29tbWFuZCBjbWQgP3N0ZGluID9zdGRvdXQgP3N0ZGVyciBhcmdzID1cbiAgICBTdHJpbmcuY29uY2F0IFwiIFwiIChMaXN0Lm1hcCBxdW90ZSAoY21kIDo6IGFyZ3MpKVxuICAgIF4gKG1hdGNoIHN0ZGluICB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBcIiA8XCIgXiBxdW90ZSBmKVxuICAgIF4gKG1hdGNoIHN0ZG91dCB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBcIiA+XCIgXiBxdW90ZSBmKVxuICAgIF4gKG1hdGNoIHN0ZGVyciB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBpZiBzdGRlcnIgPSBzdGRvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gXCIgMj4mMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwiIDI+XCIgXiBxdW90ZSBmKVxuICBsZXQgYmFzZW5hbWUgPSBnZW5lcmljX2Jhc2VuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZVxuICBsZXQgZGlybmFtZSA9IGdlbmVyaWNfZGlybmFtZSBpc19kaXJfc2VwIGN1cnJlbnRfZGlyX25hbWVcbmVuZFxuXG5tb2R1bGUgV2luMzIgOiBTWVNERVBTID0gc3RydWN0XG4gIGxldCBudWxsID0gXCJOVUxcIlxuICBsZXQgY3VycmVudF9kaXJfbmFtZSA9IFwiLlwiXG4gIGxldCBwYXJlbnRfZGlyX25hbWUgPSBcIi4uXCJcbiAgbGV0IGRpcl9zZXAgPSBcIlxcXFxcIlxuICBsZXQgaXNfZGlyX3NlcCBzIGkgPSBsZXQgYyA9IHMuW2ldIGluIGMgPSAnLycgfHwgYyA9ICdcXFxcJyB8fCBjID0gJzonXG4gIGxldCBpc19yZWxhdGl2ZSBuID1cbiAgICAoU3RyaW5nLmxlbmd0aCBuIDwgMSB8fCBuLlswXSA8PiAnLycpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDEgfHwgbi5bMF0gPD4gJ1xcXFwnKVxuICAgICYmIChTdHJpbmcubGVuZ3RoIG4gPCAyIHx8IG4uWzFdIDw+ICc6JylcbiAgbGV0IGlzX2ltcGxpY2l0IG4gPVxuICAgIGlzX3JlbGF0aXZlIG5cbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMiB8fCBTdHJpbmcuc3ViIG4gMCAyIDw+IFwiLi9cIilcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMiB8fCBTdHJpbmcuc3ViIG4gMCAyIDw+IFwiLlxcXFxcIilcbiAgICAmJiAoU3RyaW5nLmxlbmd0aCBuIDwgMyB8fCBTdHJpbmcuc3ViIG4gMCAzIDw+IFwiLi4vXCIpXG4gICAgJiYgKFN0cmluZy5sZW5ndGggbiA8IDMgfHwgU3RyaW5nLnN1YiBuIDAgMyA8PiBcIi4uXFxcXFwiKVxuICBsZXQgY2hlY2tfc3VmZml4IG5hbWUgc3VmZiA9XG4gICBTdHJpbmcubGVuZ3RoIG5hbWUgPj0gU3RyaW5nLmxlbmd0aCBzdWZmICYmXG4gICAobGV0IHMgPSBTdHJpbmcuc3ViIG5hbWUgKFN0cmluZy5sZW5ndGggbmFtZSAtIFN0cmluZy5sZW5ndGggc3VmZilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nLmxlbmd0aCBzdWZmKSBpblxuICAgIFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgcyA9IFN0cmluZy5sb3dlcmNhc2VfYXNjaWkgc3VmZilcblxuICBsZXQgY2hvcF9zdWZmaXhfb3B0IH5zdWZmaXggZmlsZW5hbWUgPVxuICAgIGxldCBsZW5fcyA9IFN0cmluZy5sZW5ndGggc3VmZml4IGFuZCBsZW5fZiA9IFN0cmluZy5sZW5ndGggZmlsZW5hbWUgaW5cbiAgICBpZiBsZW5fZiA+PSBsZW5fcyB0aGVuXG4gICAgICBsZXQgciA9IFN0cmluZy5zdWIgZmlsZW5hbWUgKGxlbl9mIC0gbGVuX3MpIGxlbl9zIGluXG4gICAgICBpZiBTdHJpbmcubG93ZXJjYXNlX2FzY2lpIHIgPSBTdHJpbmcubG93ZXJjYXNlX2FzY2lpIHN1ZmZpeCB0aGVuXG4gICAgICAgIFNvbWUgKFN0cmluZy5zdWIgZmlsZW5hbWUgMCAobGVuX2YgLSBsZW5fcykpXG4gICAgICBlbHNlXG4gICAgICAgIE5vbmVcbiAgICBlbHNlXG4gICAgICBOb25lXG5cblxuICBsZXQgdGVtcF9kaXJfbmFtZSA9XG4gICAgdHJ5IFN5cy5nZXRlbnYgXCJURU1QXCIgd2l0aCBOb3RfZm91bmQgLT4gXCIuXCJcbiAgbGV0IHF1b3RlIHMgPVxuICAgIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIChsICsgMjApIGluXG4gICAgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXCInO1xuICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgIGlmIGkgPSBsIHRoZW4gQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXCInIGVsc2VcbiAgICAgIG1hdGNoIHMuW2ldIHdpdGhcbiAgICAgIHwgJ1xcXCInIC0+IGxvb3BfYnMgMCBpO1xuICAgICAgfCAnXFxcXCcgLT4gbG9vcF9icyAwIGk7XG4gICAgICB8IGMgICAgLT4gQnVmZmVyLmFkZF9jaGFyIGIgYzsgbG9vcCAoaSsxKTtcbiAgICBhbmQgbG9vcF9icyBuIGkgPVxuICAgICAgaWYgaSA9IGwgdGhlbiBiZWdpblxuICAgICAgICBCdWZmZXIuYWRkX2NoYXIgYiAnXFxcIic7XG4gICAgICAgIGFkZF9icyBuO1xuICAgICAgZW5kIGVsc2UgYmVnaW5cbiAgICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgICB8ICdcXFwiJyAtPiBhZGRfYnMgKDIqbisxKTsgQnVmZmVyLmFkZF9jaGFyIGIgJ1xcXCInOyBsb29wIChpKzEpO1xuICAgICAgICB8ICdcXFxcJyAtPiBsb29wX2JzIChuKzEpIChpKzEpO1xuICAgICAgICB8IF8gICAgLT4gYWRkX2JzIG47IGxvb3AgaVxuICAgICAgZW5kXG4gICAgYW5kIGFkZF9icyBuID0gZm9yIF9qID0gMSB0byBuIGRvIEJ1ZmZlci5hZGRfY2hhciBiICdcXFxcJzsgZG9uZVxuICAgIGluXG4gICAgbG9vcCAwO1xuICAgIEJ1ZmZlci5jb250ZW50cyBiXG4oKlxuUXVvdGluZyBjb21tYW5kcyBmb3IgZXhlY3V0aW9uIGJ5IGNtZC5leGUgaXMgZGlmZmljdWx0LlxuMS0gRWFjaCBhcmd1bWVudCBpcyBmaXJzdCBxdW90ZWQgdXNpbmcgdGhlIFwicXVvdGVcIiBmdW5jdGlvbiBhYm92ZSwgdG9cbiAgIHByb3RlY3QgaXQgYWdhaW5zdCB0aGUgcHJvY2Vzc2luZyBwZXJmb3JtZWQgYnkgdGhlIEMgcnVudGltZSBzeXN0ZW0sXG4gICB0aGVuIGNtZC5leGUncyBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgd2l0aCAnXicsIHVzaW5nXG4gICB0aGUgXCJxdW90ZV9jbWRcIiBmdW5jdGlvbiBiZWxvdy4gIEZvciBtb3JlIGRldGFpbHMsIHNlZVxuICAgaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdHdpc3R5bGl0dGxlcGFzc2FnZXNhbGxhbGlrZS8yMDExLzA0LzIzXG4yLSBUaGUgY29tbWFuZCBhbmQgdGhlIHJlZGlyZWN0aW9uIGZpbGVzLCBpZiBhbnksIG11c3QgYmUgZG91YmxlLXF1b3RlZFxuICAgaW4gY2FzZSB0aGV5IGNvbnRhaW4gc3BhY2VzLiAgVGhpcyBxdW90aW5nIGlzIGludGVycHJldGVkIGJ5IGNtZC5leGUsXG4gICBub3QgYnkgdGhlIEMgcnVudGltZSBzeXN0ZW0sIGhlbmNlIHRoZSBcInF1b3RlXCIgZnVuY3Rpb24gYWJvdmVcbiAgIGNhbm5vdCBiZSB1c2VkLiAgVGhlIHR3byBjaGFyYWN0ZXJzIHdlIGRvbid0IGtub3cgaG93IHRvIHF1b3RlXG4gICBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIGNtZC5leGUgc3RyaW5nIGFyZSBkb3VibGUtcXVvdGUgYW5kIHBlcmNlbnQuXG4gICBXZSBqdXN0IGZhaWwgaWYgdGhlIGNvbW1hbmQgbmFtZSBvciB0aGUgcmVkaXJlY3Rpb24gZmlsZSBuYW1lc1xuICAgY29udGFpbiBhIGRvdWJsZSBxdW90ZSAobm90IGFsbG93ZWQgaW4gV2luZG93cyBmaWxlIG5hbWVzLCBhbnl3YXkpXG4gICBvciBhIHBlcmNlbnQuICBTZWUgZnVuY3Rpb24gXCJxdW90ZV9jbWRfZmlsZW5hbWVcIiBiZWxvdy5cbjMtIFRoZSB3aG9sZSBzdHJpbmcgcGFzc2VkIHRvIFN5cy5jb21tYW5kIGlzIHRoZW4gZW5jbG9zZWQgaW4gZG91YmxlXG4gICBxdW90ZXMsIHdoaWNoIGFyZSBpbW1lZGlhdGVseSBzdHJpcHBlZCBieSBjbWQuZXhlLiAgT3RoZXJ3aXNlLFxuICAgc29tZSBvZiB0aGUgZG91YmxlIHF1b3RlcyBmcm9tIHN0ZXAgMiBhYm92ZSBjYW4gYmUgbWlzcGFyc2VkLlxuICAgU2VlIGUuZy4gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk5NjUxNDFcbiopXG4gIGxldCBxdW90ZV9jbWQgcyA9XG4gICAgbGV0IGIgPSBCdWZmZXIuY3JlYXRlIChTdHJpbmcubGVuZ3RoIHMgKyAyMCkgaW5cbiAgICBTdHJpbmcuaXRlclxuICAgICAgKGZ1biBjIC0+XG4gICAgICAgIG1hdGNoIGMgd2l0aFxuICAgICAgICB8ICcoJyB8ICcpJyB8ICchJyB8ICdeJyB8ICclJyB8ICdcXFwiJyB8ICc8JyB8ICc+JyB8ICcmJyB8ICd8JyAtPlxuICAgICAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGIgJ14nOyBCdWZmZXIuYWRkX2NoYXIgYiBjXG4gICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGIgYylcbiAgICAgIHM7XG4gICAgQnVmZmVyLmNvbnRlbnRzIGJcbiAgbGV0IHF1b3RlX2NtZF9maWxlbmFtZSBmID1cbiAgICBpZiBTdHJpbmcuY29udGFpbnMgZiAnXFxcIicgfHwgU3RyaW5nLmNvbnRhaW5zIGYgJyUnIHRoZW5cbiAgICAgIGZhaWx3aXRoIChcIkZpbGVuYW1lLnF1b3RlX2NvbW1hbmQ6IGJhZCBmaWxlIG5hbWUgXCIgXiBmKVxuICAgIGVsc2UgaWYgU3RyaW5nLmNvbnRhaW5zIGYgJyAnIHRoZW5cbiAgICAgIFwiXFxcIlwiIF4gZiBeIFwiXFxcIlwiXG4gICAgZWxzZVxuICAgICAgZlxuICAoKiBSZWRpcmVjdGlvbnMgaW4gY21kLmV4ZTogc2VlIGh0dHBzOi8vc3M2NC5jb20vbnQvc3ludGF4LXJlZGlyZWN0aW9uLmh0bWxcbiAgICAgYW5kIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3ByZXZpb3VzLXZlcnNpb25zL3dpbmRvd3MvaXQtcHJvL3dpbmRvd3MteHAvYmI0OTA5ODIodj10ZWNobmV0LjEwKVxuICAqKVxuICBsZXQgcXVvdGVfY29tbWFuZCBjbWQgP3N0ZGluID9zdGRvdXQgP3N0ZGVyciBhcmdzID1cbiAgICBTdHJpbmcuY29uY2F0IFwiXCIgW1xuICAgICAgXCJcXFwiXCI7XG4gICAgICBxdW90ZV9jbWRfZmlsZW5hbWUgY21kO1xuICAgICAgXCIgXCI7XG4gICAgICBxdW90ZV9jbWQgKFN0cmluZy5jb25jYXQgXCIgXCIgKExpc3QubWFwIHF1b3RlIGFyZ3MpKTtcbiAgICAgIChtYXRjaCBzdGRpbiAgd2l0aCBOb25lIC0+IFwiXCIgfCBTb21lIGYgLT4gXCIgPFwiIF4gcXVvdGVfY21kX2ZpbGVuYW1lIGYpO1xuICAgICAgKG1hdGNoIHN0ZG91dCB3aXRoIE5vbmUgLT4gXCJcIiB8IFNvbWUgZiAtPiBcIiA+XCIgXiBxdW90ZV9jbWRfZmlsZW5hbWUgZik7XG4gICAgICAobWF0Y2ggc3RkZXJyIHdpdGggTm9uZSAtPiBcIlwiIHwgU29tZSBmIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RkZXJyID0gc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBcIiAyPiYxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwiIDI+XCIgXiBxdW90ZV9jbWRfZmlsZW5hbWUgZik7XG4gICAgICBcIlxcXCJcIlxuICAgIF1cbiAgbGV0IGhhc19kcml2ZSBzID1cbiAgICBsZXQgaXNfbGV0dGVyID0gZnVuY3Rpb25cbiAgICAgIHwgJ0EnIC4uICdaJyB8ICdhJyAuLiAneicgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGZhbHNlXG4gICAgaW5cbiAgICBTdHJpbmcubGVuZ3RoIHMgPj0gMiAmJiBpc19sZXR0ZXIgcy5bMF0gJiYgcy5bMV0gPSAnOidcbiAgbGV0IGRyaXZlX2FuZF9wYXRoIHMgPVxuICAgIGlmIGhhc19kcml2ZSBzXG4gICAgdGhlbiAoU3RyaW5nLnN1YiBzIDAgMiwgU3RyaW5nLnN1YiBzIDIgKFN0cmluZy5sZW5ndGggcyAtIDIpKVxuICAgIGVsc2UgKFwiXCIsIHMpXG4gIGxldCBkaXJuYW1lIHMgPVxuICAgIGxldCAoZHJpdmUsIHBhdGgpID0gZHJpdmVfYW5kX3BhdGggcyBpblxuICAgIGxldCBkaXIgPSBnZW5lcmljX2Rpcm5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lIHBhdGggaW5cbiAgICBkcml2ZSBeIGRpclxuICBsZXQgYmFzZW5hbWUgcyA9XG4gICAgbGV0IChfZHJpdmUsIHBhdGgpID0gZHJpdmVfYW5kX3BhdGggcyBpblxuICAgIGdlbmVyaWNfYmFzZW5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lIHBhdGhcbmVuZFxuXG5tb2R1bGUgQ3lnd2luIDogU1lTREVQUyA9IHN0cnVjdFxuICBsZXQgbnVsbCA9IFwiL2Rldi9udWxsXCJcbiAgbGV0IGN1cnJlbnRfZGlyX25hbWUgPSBcIi5cIlxuICBsZXQgcGFyZW50X2Rpcl9uYW1lID0gXCIuLlwiXG4gIGxldCBkaXJfc2VwID0gXCIvXCJcbiAgbGV0IGlzX2Rpcl9zZXAgPSBXaW4zMi5pc19kaXJfc2VwXG4gIGxldCBpc19yZWxhdGl2ZSA9IFdpbjMyLmlzX3JlbGF0aXZlXG4gIGxldCBpc19pbXBsaWNpdCA9IFdpbjMyLmlzX2ltcGxpY2l0XG4gIGxldCBjaGVja19zdWZmaXggPSBXaW4zMi5jaGVja19zdWZmaXhcbiAgbGV0IGNob3Bfc3VmZml4X29wdCA9IFdpbjMyLmNob3Bfc3VmZml4X29wdFxuICBsZXQgdGVtcF9kaXJfbmFtZSA9IFVuaXgudGVtcF9kaXJfbmFtZVxuICBsZXQgcXVvdGUgPSBVbml4LnF1b3RlXG4gIGxldCBxdW90ZV9jb21tYW5kID0gVW5peC5xdW90ZV9jb21tYW5kXG4gIGxldCBiYXNlbmFtZSA9IGdlbmVyaWNfYmFzZW5hbWUgaXNfZGlyX3NlcCBjdXJyZW50X2Rpcl9uYW1lXG4gIGxldCBkaXJuYW1lID0gZ2VuZXJpY19kaXJuYW1lIGlzX2Rpcl9zZXAgY3VycmVudF9kaXJfbmFtZVxuZW5kXG5cbm1vZHVsZSBTeXNkZXBzID1cbiAgKHZhbCAobWF0Y2ggU3lzLm9zX3R5cGUgd2l0aFxuICAgICAgIHwgXCJXaW4zMlwiIC0+IChtb2R1bGUgV2luMzI6IFNZU0RFUFMpXG4gICAgICAgfCBcIkN5Z3dpblwiIC0+IChtb2R1bGUgQ3lnd2luOiBTWVNERVBTKVxuICAgICAgIHwgXyAtPiAobW9kdWxlIFVuaXg6IFNZU0RFUFMpKSlcblxuaW5jbHVkZSBTeXNkZXBzXG5cbmxldCBjb25jYXQgZGlybmFtZSBmaWxlbmFtZSA9XG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBkaXJuYW1lIGluXG4gIGlmIGwgPSAwIHx8IGlzX2Rpcl9zZXAgZGlybmFtZSAobC0xKVxuICB0aGVuIGRpcm5hbWUgXiBmaWxlbmFtZVxuICBlbHNlIGRpcm5hbWUgXiBkaXJfc2VwIF4gZmlsZW5hbWVcblxubGV0IGNob3Bfc3VmZml4IG5hbWUgc3VmZiA9XG4gIGlmIGNoZWNrX3N1ZmZpeCBuYW1lIHN1ZmZcbiAgdGhlbiBTdHJpbmcuc3ViIG5hbWUgMCAoU3RyaW5nLmxlbmd0aCBuYW1lIC0gU3RyaW5nLmxlbmd0aCBzdWZmKVxuICBlbHNlIGludmFsaWRfYXJnIFwiRmlsZW5hbWUuY2hvcF9zdWZmaXhcIlxuXG5sZXQgZXh0ZW5zaW9uX2xlbiBuYW1lID1cbiAgbGV0IHJlYyBjaGVjayBpMCBpID1cbiAgICBpZiBpIDwgMCB8fCBpc19kaXJfc2VwIG5hbWUgaSB0aGVuIDBcbiAgICBlbHNlIGlmIG5hbWUuW2ldID0gJy4nIHRoZW4gY2hlY2sgaTAgKGkgLSAxKVxuICAgIGVsc2UgU3RyaW5nLmxlbmd0aCBuYW1lIC0gaTBcbiAgaW5cbiAgbGV0IHJlYyBzZWFyY2hfZG90IGkgPVxuICAgIGlmIGkgPCAwIHx8IGlzX2Rpcl9zZXAgbmFtZSBpIHRoZW4gMFxuICAgIGVsc2UgaWYgbmFtZS5baV0gPSAnLicgdGhlbiBjaGVjayBpIChpIC0gMSlcbiAgICBlbHNlIHNlYXJjaF9kb3QgKGkgLSAxKVxuICBpblxuICBzZWFyY2hfZG90IChTdHJpbmcubGVuZ3RoIG5hbWUgLSAxKVxuXG5sZXQgZXh0ZW5zaW9uIG5hbWUgPVxuICBsZXQgbCA9IGV4dGVuc2lvbl9sZW4gbmFtZSBpblxuICBpZiBsID0gMCB0aGVuIFwiXCIgZWxzZSBTdHJpbmcuc3ViIG5hbWUgKFN0cmluZy5sZW5ndGggbmFtZSAtIGwpIGxcblxubGV0IGNob3BfZXh0ZW5zaW9uIG5hbWUgPVxuICBsZXQgbCA9IGV4dGVuc2lvbl9sZW4gbmFtZSBpblxuICBpZiBsID0gMCB0aGVuIGludmFsaWRfYXJnIFwiRmlsZW5hbWUuY2hvcF9leHRlbnNpb25cIlxuICBlbHNlIFN0cmluZy5zdWIgbmFtZSAwIChTdHJpbmcubGVuZ3RoIG5hbWUgLSBsKVxuXG5sZXQgcmVtb3ZlX2V4dGVuc2lvbiBuYW1lID1cbiAgbGV0IGwgPSBleHRlbnNpb25fbGVuIG5hbWUgaW5cbiAgaWYgbCA9IDAgdGhlbiBuYW1lIGVsc2UgU3RyaW5nLnN1YiBuYW1lIDAgKFN0cmluZy5sZW5ndGggbmFtZSAtIGwpXG5cbmV4dGVybmFsIG9wZW5fZGVzYzogc3RyaW5nIC0+IG9wZW5fZmxhZyBsaXN0IC0+IGludCAtPiBpbnQgPSBcImNhbWxfc3lzX29wZW5cIlxuZXh0ZXJuYWwgY2xvc2VfZGVzYzogaW50IC0+IHVuaXQgPSBcImNhbWxfc3lzX2Nsb3NlXCJcblxubGV0IHBybmdfa2V5ID1cbiAgRG9tYWluLkRMUy5uZXdfa2V5IFJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdFxuXG5sZXQgdGVtcF9maWxlX25hbWUgdGVtcF9kaXIgcHJlZml4IHN1ZmZpeCA9XG4gIGxldCByYW5kb21fc3RhdGUgPSBEb21haW4uRExTLmdldCBwcm5nX2tleSBpblxuICBsZXQgcm5kID0gKFJhbmRvbS5TdGF0ZS5iaXRzIHJhbmRvbV9zdGF0ZSkgbGFuZCAweEZGRkZGRiBpblxuICBjb25jYXQgdGVtcF9kaXIgKFByaW50Zi5zcHJpbnRmIFwiJXMlMDZ4JXNcIiBwcmVmaXggcm5kIHN1ZmZpeClcblxubGV0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZSA9XG4gIERvbWFpbi5ETFMubmV3X2tleSB+c3BsaXRfZnJvbV9wYXJlbnQ6RnVuLmlkIChmdW4gKCkgLT4gdGVtcF9kaXJfbmFtZSlcblxubGV0IHNldF90ZW1wX2Rpcl9uYW1lIHMgPSBEb21haW4uRExTLnNldCBjdXJyZW50X3RlbXBfZGlyX25hbWUgc1xubGV0IGdldF90ZW1wX2Rpcl9uYW1lICgpID0gRG9tYWluLkRMUy5nZXQgY3VycmVudF90ZW1wX2Rpcl9uYW1lXG5cbmxldCB0ZW1wX2ZpbGUgPyh0ZW1wX2RpciA9IERvbWFpbi5ETFMuZ2V0IGN1cnJlbnRfdGVtcF9kaXJfbmFtZSkgcHJlZml4IHN1ZmZpeCA9XG4gIGxldCByZWMgdHJ5X25hbWUgY291bnRlciA9XG4gICAgbGV0IG5hbWUgPSB0ZW1wX2ZpbGVfbmFtZSB0ZW1wX2RpciBwcmVmaXggc3VmZml4IGluXG4gICAgdHJ5XG4gICAgICBjbG9zZV9kZXNjKG9wZW5fZGVzYyBuYW1lIFtPcGVuX3dyb25seTsgT3Blbl9jcmVhdDsgT3Blbl9leGNsXSAwbzYwMCk7XG4gICAgICBuYW1lXG4gICAgd2l0aCBTeXNfZXJyb3IgXyBhcyBlIC0+XG4gICAgICBpZiBjb3VudGVyID49IDEwMDAgdGhlbiByYWlzZSBlIGVsc2UgdHJ5X25hbWUgKGNvdW50ZXIgKyAxKVxuICBpbiB0cnlfbmFtZSAwXG5cbmxldCBvcGVuX3RlbXBfZmlsZSA/KG1vZGUgPSBbT3Blbl90ZXh0XSkgPyhwZXJtcyA9IDBvNjAwKVxuICAgID8odGVtcF9kaXIgPSBEb21haW4uRExTLmdldCBjdXJyZW50X3RlbXBfZGlyX25hbWUpXG4gICAgcHJlZml4IHN1ZmZpeCA9XG4gIGxldCByZWMgdHJ5X25hbWUgY291bnRlciA9XG4gICAgbGV0IG5hbWUgPSB0ZW1wX2ZpbGVfbmFtZSB0ZW1wX2RpciBwcmVmaXggc3VmZml4IGluXG4gICAgdHJ5XG4gICAgICAobmFtZSxcbiAgICAgICBvcGVuX291dF9nZW4gKE9wZW5fd3Jvbmx5OjpPcGVuX2NyZWF0OjpPcGVuX2V4Y2w6Om1vZGUpIHBlcm1zIG5hbWUpXG4gICAgd2l0aCBTeXNfZXJyb3IgXyBhcyBlIC0+XG4gICAgICBpZiBjb3VudGVyID49IDEwMDAgdGhlbiByYWlzZSBlIGVsc2UgdHJ5X25hbWUgKGNvdW50ZXIgKyAxKVxuICBpbiB0cnlfbmFtZSAwXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDAyIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbigqIENvbXBsZXggbnVtYmVycyAqKVxuXG50eXBlIHQgPSB7IHJlOiBmbG9hdDsgaW06IGZsb2F0IH1cblxubGV0IHplcm8gPSB7IHJlID0gMC4wOyBpbSA9IDAuMCB9XG5sZXQgb25lID0geyByZSA9IDEuMDsgaW0gPSAwLjAgfVxubGV0IGkgPSB7IHJlID0gMC4wOyBpbSA9IDEuMCB9XG5cbmxldCBhZGQgeCB5ID0geyByZSA9IHgucmUgKy4geS5yZTsgaW0gPSB4LmltICsuIHkuaW0gfVxuXG5sZXQgc3ViIHggeSA9IHsgcmUgPSB4LnJlIC0uIHkucmU7IGltID0geC5pbSAtLiB5LmltIH1cblxubGV0IG5lZyB4ID0geyByZSA9IC0uIHgucmU7IGltID0gLS4geC5pbSB9XG5cbmxldCBjb25qIHggPSB7IHJlID0geC5yZTsgaW0gPSAtLiB4LmltIH1cblxubGV0IG11bCB4IHkgPSB7IHJlID0geC5yZSAqLiB5LnJlIC0uIHguaW0gKi4geS5pbTtcbiAgICAgICAgICAgICAgICBpbSA9IHgucmUgKi4geS5pbSArLiB4LmltICouIHkucmUgfVxuXG5sZXQgZGl2IHggeSA9XG4gIGlmIGFic19mbG9hdCB5LnJlID49IGFic19mbG9hdCB5LmltIHRoZW5cbiAgICBsZXQgciA9IHkuaW0gLy4geS5yZSBpblxuICAgIGxldCBkID0geS5yZSArLiByICouIHkuaW0gaW5cbiAgICB7IHJlID0gKHgucmUgKy4gciAqLiB4LmltKSAvLiBkO1xuICAgICAgaW0gPSAoeC5pbSAtLiByICouIHgucmUpIC8uIGQgfVxuICBlbHNlXG4gICAgbGV0IHIgPSB5LnJlIC8uIHkuaW0gaW5cbiAgICBsZXQgZCA9IHkuaW0gKy4gciAqLiB5LnJlIGluXG4gICAgeyByZSA9IChyICouIHgucmUgKy4geC5pbSkgLy4gZDtcbiAgICAgIGltID0gKHIgKi4geC5pbSAtLiB4LnJlKSAvLiBkIH1cblxubGV0IGludiB4ID0gZGl2IG9uZSB4XG5cbmxldCBub3JtMiB4ID0geC5yZSAqLiB4LnJlICsuIHguaW0gKi4geC5pbVxuXG5sZXQgbm9ybSB4ID0gRmxvYXQuaHlwb3QgeC5yZSB4LmltXG5cbmxldCBhcmcgeCA9IGF0YW4yIHguaW0geC5yZVxuXG5sZXQgcG9sYXIgbiBhID0geyByZSA9IGNvcyBhICouIG47IGltID0gc2luIGEgKi4gbiB9XG5cbmxldCBzcXJ0IHggPVxuICBpZiB4LnJlID0gMC4wICYmIHguaW0gPSAwLjAgdGhlbiB7IHJlID0gMC4wOyBpbSA9IDAuMCB9XG4gIGVsc2UgYmVnaW5cbiAgICBsZXQgciA9IGFic19mbG9hdCB4LnJlIGFuZCBpID0gYWJzX2Zsb2F0IHguaW0gaW5cbiAgICBsZXQgdyA9XG4gICAgICBpZiByID49IGkgdGhlbiBiZWdpblxuICAgICAgICBsZXQgcSA9IGkgLy4gciBpblxuICAgICAgICBzcXJ0KHIpICouIHNxcnQoMC41ICouICgxLjAgKy4gc3FydCgxLjAgKy4gcSAqLiBxKSkpXG4gICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICBsZXQgcSA9IHIgLy4gaSBpblxuICAgICAgICBzcXJ0KGkpICouIHNxcnQoMC41ICouIChxICsuIHNxcnQoMS4wICsuIHEgKi4gcSkpKVxuICAgICAgZW5kIGluXG4gICAgaWYgeC5yZSA+PSAwLjBcbiAgICB0aGVuIHsgcmUgPSB3OyAgaW0gPSAwLjUgKi4geC5pbSAvLiB3IH1cbiAgICBlbHNlIHsgcmUgPSAwLjUgKi4gaSAvLiB3OyAgaW0gPSBpZiB4LmltID49IDAuMCB0aGVuIHcgZWxzZSAtLiB3IH1cbiAgZW5kXG5cbmxldCBleHAgeCA9XG4gIGxldCBlID0gZXhwIHgucmUgaW4geyByZSA9IGUgKi4gY29zIHguaW07IGltID0gZSAqLiBzaW4geC5pbSB9XG5cbmxldCBsb2cgeCA9IHsgcmUgPSBsb2cgKG5vcm0geCk7IGltID0gYXRhbjIgeC5pbSB4LnJlIH1cblxubGV0IHBvdyB4IHkgPSBleHAgKG11bCB5IChsb2cgeCkpXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDIxIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IGluX2NoYW5uZWxcblxudHlwZSBvcGVuX2ZsYWcgPSBTdGRsaWIub3Blbl9mbGFnID1cbiAgfCBPcGVuX3Jkb25seVxuICB8IE9wZW5fd3Jvbmx5XG4gIHwgT3Blbl9hcHBlbmRcbiAgfCBPcGVuX2NyZWF0XG4gIHwgT3Blbl90cnVuY1xuICB8IE9wZW5fZXhjbFxuICB8IE9wZW5fYmluYXJ5XG4gIHwgT3Blbl90ZXh0XG4gIHwgT3Blbl9ub25ibG9ja1xuXG5sZXQgc3RkaW4gPSBTdGRsaWIuc3RkaW5cbmxldCBvcGVuX2JpbiA9IFN0ZGxpYi5vcGVuX2luX2JpblxubGV0IG9wZW5fdGV4dCA9IFN0ZGxpYi5vcGVuX2luXG5sZXQgb3Blbl9nZW4gPSBTdGRsaWIub3Blbl9pbl9nZW5cblxubGV0IHdpdGhfb3BlbiBvcGVuZnVuIHMgZiA9XG4gIGxldCBpYyA9IG9wZW5mdW4gcyBpblxuICBGdW4ucHJvdGVjdCB+ZmluYWxseTooZnVuICgpIC0+IFN0ZGxpYi5jbG9zZV9pbl9ub2VyciBpYylcbiAgICAoZnVuICgpIC0+IGYgaWMpXG5cbmxldCB3aXRoX29wZW5fYmluIHMgZiA9XG4gIHdpdGhfb3BlbiBTdGRsaWIub3Blbl9pbl9iaW4gcyBmXG5cbmxldCB3aXRoX29wZW5fdGV4dCBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5faW4gcyBmXG5cbmxldCB3aXRoX29wZW5fZ2VuIGZsYWdzIHBlcm0gcyBmID1cbiAgd2l0aF9vcGVuIChTdGRsaWIub3Blbl9pbl9nZW4gZmxhZ3MgcGVybSkgcyBmXG5cbmxldCBzZWVrID0gU3RkbGliLkxhcmdlRmlsZS5zZWVrX2luXG5sZXQgcG9zID0gU3RkbGliLkxhcmdlRmlsZS5wb3NfaW5cbmxldCBsZW5ndGggPSBTdGRsaWIuTGFyZ2VGaWxlLmluX2NoYW5uZWxfbGVuZ3RoXG5sZXQgY2xvc2UgPSBTdGRsaWIuY2xvc2VfaW5cbmxldCBjbG9zZV9ub2VyciA9IFN0ZGxpYi5jbG9zZV9pbl9ub2VyclxuXG5sZXQgaW5wdXRfY2hhciBpYyA9XG4gIG1hdGNoIFN0ZGxpYi5pbnB1dF9jaGFyIGljIHdpdGhcbiAgfCBjIC0+IFNvbWUgY1xuICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPiBOb25lXG5cbmxldCBpbnB1dF9ieXRlIGljID1cbiAgbWF0Y2ggU3RkbGliLmlucHV0X2J5dGUgaWMgd2l0aFxuICB8IG4gLT4gU29tZSBuXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxubGV0IGlucHV0X2xpbmUgaWMgPVxuICBtYXRjaCBTdGRsaWIuaW5wdXRfbGluZSBpYyB3aXRoXG4gIHwgcyAtPiBTb21lIHNcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgaW5wdXQgPSBTdGRsaWIuaW5wdXRcblxubGV0IHJlYWxseV9pbnB1dCBpYyBidWYgcG9zIGxlbiA9XG4gIG1hdGNoIFN0ZGxpYi5yZWFsbHlfaW5wdXQgaWMgYnVmIHBvcyBsZW4gd2l0aFxuICB8ICgpIC0+IFNvbWUgKClcbiAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gTm9uZVxuXG5sZXQgcmVhbGx5X2lucHV0X3N0cmluZyBpYyBsZW4gPVxuICBtYXRjaCBTdGRsaWIucmVhbGx5X2lucHV0X3N0cmluZyBpYyBsZW4gd2l0aFxuICB8IHMgLT4gU29tZSBzXG4gIHwgZXhjZXB0aW9uIEVuZF9vZl9maWxlIC0+IE5vbmVcblxuKCogUmVhZCB1cCB0byBbbGVuXSBieXRlcyBpbnRvIFtidWZdLCBzdGFydGluZyBhdCBbb2ZzXS4gUmV0dXJuIHRvdGFsIGJ5dGVzXG4gICByZWFkLiAqKVxubGV0IHJlYWRfdXB0byBpYyBidWYgb2ZzIGxlbiA9XG4gIGxldCByZWMgbG9vcCBvZnMgbGVuID1cbiAgICBpZiBsZW4gPSAwIHRoZW4gb2ZzXG4gICAgZWxzZSBiZWdpblxuICAgICAgbGV0IHIgPSBTdGRsaWIuaW5wdXQgaWMgYnVmIG9mcyBsZW4gaW5cbiAgICAgIGlmIHIgPSAwIHRoZW5cbiAgICAgICAgb2ZzXG4gICAgICBlbHNlXG4gICAgICAgIGxvb3AgKG9mcyArIHIpIChsZW4gLSByKVxuICAgIGVuZFxuICBpblxuICBsb29wIG9mcyBsZW4gLSBvZnNcblxuKCogQmVzdCBlZmZvcnQgYXR0ZW1wdCB0byByZXR1cm4gYSBidWZmZXIgd2l0aCA+PSAob2ZzICsgbikgYnl0ZXMgb2Ygc3RvcmFnZSxcbiAgIGFuZCBzdWNoIHRoYXQgaXQgY29pbmNpZGVzIHdpdGggW2J1Zl0gYXQgaW5kaWNlcyA8IFtvZnNdLlxuXG4gICBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIGVxdWFsIHRvIFtidWZdIGl0c2VsZiBpZiBpdCBhbHJlYWR5IGhhcyBzdWZmaWNpZW50XG4gICBmcmVlIHNwYWNlLlxuXG4gICBUaGUgcmV0dXJuZWQgYnVmZmVyIG1heSBoYXZlICpmZXdlciogdGhhbiBbb2ZzICsgbl0gYnl0ZXMgb2Ygc3RvcmFnZSBpZiB0aGlzXG4gICBudW1iZXIgaXMgPiBbU3lzLm1heF9zdHJpbmdfbGVuZ3RoXS4gSG93ZXZlciB0aGUgcmV0dXJuZWQgYnVmZmVyIHdpbGxcbiAgICphbHdheXMqIGhhdmUgPiBbb2ZzXSBieXRlcyBvZiBzdG9yYWdlLiBJbiB0aGUgbGltaXRpbmcgY2FzZSB3aGVuIFtvZnMgPSBsZW5cbiAgID0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXSAoc28gdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVzaXplIHRoZSBidWZmZXIgYXRcbiAgIGFsbCksIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICopXG5cbmxldCBlbnN1cmUgYnVmIG9mcyBuID1cbiAgbGV0IGxlbiA9IEJ5dGVzLmxlbmd0aCBidWYgaW5cbiAgaWYgbGVuID49IG9mcyArIG4gdGhlbiBidWZcbiAgZWxzZSBiZWdpblxuICAgIGxldCBuZXdfbGVuID0gcmVmIGxlbiBpblxuICAgIHdoaWxlICFuZXdfbGVuIDwgb2ZzICsgbiBkb1xuICAgICAgbmV3X2xlbiA6PSAyICogIW5ld19sZW4gKyAxXG4gICAgZG9uZTtcbiAgICBsZXQgbmV3X2xlbiA9ICFuZXdfbGVuIGluXG4gICAgbGV0IG5ld19sZW4gPVxuICAgICAgaWYgbmV3X2xlbiA8PSBTeXMubWF4X3N0cmluZ19sZW5ndGggdGhlblxuICAgICAgICBuZXdfbGVuXG4gICAgICBlbHNlIGlmIG9mcyA8IFN5cy5tYXhfc3RyaW5nX2xlbmd0aCB0aGVuXG4gICAgICAgIFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICAgICAgZWxzZVxuICAgICAgICBmYWlsd2l0aCBcIkluX2NoYW5uZWwuaW5wdXRfYWxsOiBjaGFubmVsIGNvbnRlbnQgXFxcbiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIG1heGltdW0gc3RyaW5nIGxlbmd0aFwiXG4gICAgaW5cbiAgICBsZXQgbmV3X2J1ZiA9IEJ5dGVzLmNyZWF0ZSBuZXdfbGVuIGluXG4gICAgQnl0ZXMuYmxpdCBidWYgMCBuZXdfYnVmIDAgb2ZzO1xuICAgIG5ld19idWZcbiAgZW5kXG5cbmxldCBpbnB1dF9hbGwgaWMgPVxuICBsZXQgY2h1bmtfc2l6ZSA9IDY1NTM2IGluICgqIElPX0JVRkZFUl9TSVpFICopXG4gIGxldCBpbml0aWFsX3NpemUgPVxuICAgIHRyeVxuICAgICAgU3RkbGliLmluX2NoYW5uZWxfbGVuZ3RoIGljIC0gU3RkbGliLnBvc19pbiBpY1xuICAgIHdpdGggU3lzX2Vycm9yIF8gLT5cbiAgICAgIC0xXG4gIGluXG4gIGxldCBpbml0aWFsX3NpemUgPSBpZiBpbml0aWFsX3NpemUgPCAwIHRoZW4gY2h1bmtfc2l6ZSBlbHNlIGluaXRpYWxfc2l6ZSBpblxuICBsZXQgaW5pdGlhbF9zaXplID1cbiAgICBpZiBpbml0aWFsX3NpemUgPD0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoIHRoZW5cbiAgICAgIGluaXRpYWxfc2l6ZVxuICAgIGVsc2VcbiAgICAgIFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxuICBpblxuICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIGluaXRpYWxfc2l6ZSBpblxuICBsZXQgbnJlYWQgPSByZWFkX3VwdG8gaWMgYnVmIDAgaW5pdGlhbF9zaXplIGluXG4gIGlmIG5yZWFkIDwgaW5pdGlhbF9zaXplIHRoZW4gKCogRU9GIHJlYWNoZWQsIGJ1ZmZlciBwYXJ0aWFsbHkgZmlsbGVkICopXG4gICAgQnl0ZXMuc3ViX3N0cmluZyBidWYgMCBucmVhZFxuICBlbHNlIGJlZ2luICgqIG5yZWFkID0gaW5pdGlhbF9zaXplLCBtYXliZSBFT0YgcmVhY2hlZCAqKVxuICAgIG1hdGNoIFN0ZGxpYi5pbnB1dF9jaGFyIGljIHdpdGhcbiAgICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAtPlxuICAgICAgICAoKiBFT0YgcmVhY2hlZCwgYnVmZmVyIGlzIGNvbXBsZXRlbHkgZmlsbGVkICopXG4gICAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgYnVmXG4gICAgfCBjIC0+XG4gICAgICAgICgqIEVPRiBub3QgcmVhY2hlZCAqKVxuICAgICAgICBsZXQgcmVjIGxvb3AgYnVmIG9mcyA9XG4gICAgICAgICAgbGV0IGJ1ZiA9IGVuc3VyZSBidWYgb2ZzIGNodW5rX3NpemUgaW5cbiAgICAgICAgICBsZXQgcmVtID0gQnl0ZXMubGVuZ3RoIGJ1ZiAtIG9mcyBpblxuICAgICAgICAgICgqIFtyZW1dIGNhbiBiZSA8IFtjaHVua19zaXplXSBpZiBidWZmZXIgc2l6ZSBjbG9zZSB0b1xuICAgICAgICAgICAgIFtTeXMubWF4X3N0cmluZ19sZW5ndGhdICopXG4gICAgICAgICAgbGV0IHIgPSByZWFkX3VwdG8gaWMgYnVmIG9mcyByZW0gaW5cbiAgICAgICAgICBpZiByIDwgcmVtIHRoZW4gKCogRU9GIHJlYWNoZWQgKilcbiAgICAgICAgICAgIEJ5dGVzLnN1Yl9zdHJpbmcgYnVmIDAgKG9mcyArIHIpXG4gICAgICAgICAgZWxzZSAoKiByID0gcmVtICopXG4gICAgICAgICAgICBsb29wIGJ1ZiAob2ZzICsgcmVtKVxuICAgICAgICBpblxuICAgICAgICBsZXQgYnVmID0gZW5zdXJlIGJ1ZiBucmVhZCAoY2h1bmtfc2l6ZSArIDEpIGluXG4gICAgICAgIEJ5dGVzLnNldCBidWYgbnJlYWQgYztcbiAgICAgICAgbG9vcCBidWYgKG5yZWFkICsgMSlcbiAgZW5kXG5cbmxldCBzZXRfYmluYXJ5X21vZGUgPSBTdGRsaWIuc2V0X2JpbmFyeV9tb2RlX2luXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICBYYXZpZXIgTGVyb3ksIHByb2pldCBDcmlzdGFsLCBJTlJJQSBSb2NxdWVuY291cnQgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDIxIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgICAgICopXG4oKiAgICAgZW4gQXV0b21hdGlxdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgdCA9IG91dF9jaGFubmVsXG5cbnR5cGUgb3Blbl9mbGFnID0gU3RkbGliLm9wZW5fZmxhZyA9XG4gIHwgT3Blbl9yZG9ubHlcbiAgfCBPcGVuX3dyb25seVxuICB8IE9wZW5fYXBwZW5kXG4gIHwgT3Blbl9jcmVhdFxuICB8IE9wZW5fdHJ1bmNcbiAgfCBPcGVuX2V4Y2xcbiAgfCBPcGVuX2JpbmFyeVxuICB8IE9wZW5fdGV4dFxuICB8IE9wZW5fbm9uYmxvY2tcblxubGV0IHN0ZG91dCA9IFN0ZGxpYi5zdGRvdXRcbmxldCBzdGRlcnIgPSBTdGRsaWIuc3RkZXJyXG5sZXQgb3Blbl9iaW4gPSBTdGRsaWIub3Blbl9vdXRfYmluXG5sZXQgb3Blbl90ZXh0ID0gU3RkbGliLm9wZW5fb3V0XG5sZXQgb3Blbl9nZW4gPSBTdGRsaWIub3Blbl9vdXRfZ2VuXG5cbmxldCB3aXRoX29wZW4gb3BlbmZ1biBzIGYgPVxuICBsZXQgb2MgPSBvcGVuZnVuIHMgaW5cbiAgRnVuLnByb3RlY3QgfmZpbmFsbHk6KGZ1biAoKSAtPiBTdGRsaWIuY2xvc2Vfb3V0X25vZXJyIG9jKVxuICAgIChmdW4gKCkgLT4gZiBvYylcblxubGV0IHdpdGhfb3Blbl9iaW4gcyBmID1cbiAgd2l0aF9vcGVuIFN0ZGxpYi5vcGVuX291dF9iaW4gcyBmXG5cbmxldCB3aXRoX29wZW5fdGV4dCBzIGYgPVxuICB3aXRoX29wZW4gU3RkbGliLm9wZW5fb3V0IHMgZlxuXG5sZXQgd2l0aF9vcGVuX2dlbiBmbGFncyBwZXJtIHMgZiA9XG4gIHdpdGhfb3BlbiAoU3RkbGliLm9wZW5fb3V0X2dlbiBmbGFncyBwZXJtKSBzIGZcblxubGV0IHNlZWsgPSBTdGRsaWIuTGFyZ2VGaWxlLnNlZWtfb3V0XG5sZXQgcG9zID0gU3RkbGliLkxhcmdlRmlsZS5wb3Nfb3V0XG5sZXQgbGVuZ3RoID0gU3RkbGliLkxhcmdlRmlsZS5vdXRfY2hhbm5lbF9sZW5ndGhcbmxldCBjbG9zZSA9IFN0ZGxpYi5jbG9zZV9vdXRcbmxldCBjbG9zZV9ub2VyciA9IFN0ZGxpYi5jbG9zZV9vdXRfbm9lcnJcbmxldCBmbHVzaCA9IFN0ZGxpYi5mbHVzaFxubGV0IGZsdXNoX2FsbCA9IFN0ZGxpYi5mbHVzaF9hbGxcbmxldCBvdXRwdXRfY2hhciA9IFN0ZGxpYi5vdXRwdXRfY2hhclxubGV0IG91dHB1dF9ieXRlID0gU3RkbGliLm91dHB1dF9ieXRlXG5sZXQgb3V0cHV0X3N0cmluZyA9IFN0ZGxpYi5vdXRwdXRfc3RyaW5nXG5sZXQgb3V0cHV0X2J5dGVzID0gU3RkbGliLm91dHB1dF9ieXRlc1xubGV0IG91dHB1dCA9IFN0ZGxpYi5vdXRwdXRcbmxldCBvdXRwdXRfc3Vic3RyaW5nID0gU3RkbGliLm91dHB1dF9zdWJzdHJpbmdcbmxldCBzZXRfYmluYXJ5X21vZGUgPSBTdGRsaWIuc2V0X2JpbmFyeV9tb2RlX291dFxuXG5leHRlcm5hbCBzZXRfYnVmZmVyZWQgOiB0IC0+IGJvb2wgLT4gdW5pdCA9IFwiY2FtbF9tbF9zZXRfYnVmZmVyZWRcIlxuXG5leHRlcm5hbCBpc19idWZmZXJlZCA6IHQgLT4gYm9vbCA9IFwiY2FtbF9tbF9pc19idWZmZXJlZFwiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9DYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgIEtDIFNpdmFyYW1ha3Jpc2huYW4sIEluZGlhbiBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgTWFkcmFzICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIENvcHlyaWdodCAyMDIxIEluZGlhbiBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgTWFkcmFzICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mICAgICopXG4oKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEsIHdpdGggdGhlICAgICAgICAgICopXG4oKiAgIHNwZWNpYWwgZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIHRoZSBmaWxlIExJQ0VOU0UuICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgJ2EgdCA9IC4uXG5leHRlcm5hbCBwZXJmb3JtIDogJ2EgdCAtPiAnYSA9IFwiJXBlcmZvcm1cIlxuXG50eXBlIGV4biArPSBVbmhhbmRsZWQ6ICdhIHQgLT4gZXhuXG5leGNlcHRpb24gQ29udGludWF0aW9uX2FscmVhZHlfcmVzdW1lZFxuXG5sZXQgKCkgPVxuICBsZXQgcHJpbnRlciA9IGZ1bmN0aW9uXG4gICAgfCBVbmhhbmRsZWQgeCAtPlxuICAgICAgICBsZXQgbXNnID0gUHJpbnRmLnNwcmludGYgXCJTdGRsaWIuRWZmZWN0LlVuaGFuZGxlZCglcylcIlxuICAgICAgICAgICAgKFByaW50ZXhjLnN0cmluZ19vZl9leHRlbnNpb25fY29uc3RydWN0b3IgQEAgT2JqLnJlcHIgeClcbiAgICAgICAgaW5cbiAgICAgICAgU29tZSBtc2dcbiAgICB8IF8gLT4gTm9uZVxuICBpblxuICBQcmludGV4Yy5yZWdpc3Rlcl9wcmludGVyIHByaW50ZXJcblxuKCogUmVnaXN0ZXIgdGhlIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gYWNjZXNzIGl0ICopXG50eXBlIF8gdCArPSBTaG91bGRfbm90X3NlZV90aGlzX18gOiB1bml0IHRcbmxldCBfID0gQ2FsbGJhY2sucmVnaXN0ZXJfZXhjZXB0aW9uIFwiRWZmZWN0LlVuaGFuZGxlZFwiXG4gICAgICAgICAgKFVuaGFuZGxlZCBTaG91bGRfbm90X3NlZV90aGlzX18pXG5sZXQgXyA9IENhbGxiYWNrLnJlZ2lzdGVyX2V4Y2VwdGlvbiBcIkVmZmVjdC5Db250aW51YXRpb25fYWxyZWFkeV9yZXN1bWVkXCJcbiAgICAgICAgICBDb250aW51YXRpb25fYWxyZWFkeV9yZXN1bWVkXG5cbnR5cGUgKCdhLCAnYikgc3RhY2tcblxuZXh0ZXJuYWwgcmVzdW1lIDogKCdhLCAnYikgc3RhY2sgLT4gKCdjIC0+ICdhKSAtPiAnYyAtPiAnYiA9IFwiJXJlc3VtZVwiXG5leHRlcm5hbCBydW5zdGFjayA6ICgnYSwgJ2IpIHN0YWNrIC0+ICgnYyAtPiAnYSkgLT4gJ2MgLT4gJ2IgPSBcIiVydW5zdGFja1wiXG5cbm1vZHVsZSBEZWVwID0gc3RydWN0XG5cbiAgdHlwZSAoJ2EsJ2IpIGNvbnRpbnVhdGlvblxuICB0eXBlIGxhc3RfZmliZXJcblxuICBleHRlcm5hbCB0YWtlX2NvbnRfbm9leGMgOiAoJ2EsICdiKSBjb250aW51YXRpb24gLT4gKCdhLCAnYikgc3RhY2sgPVxuICAgIFwiY2FtbF9jb250aW51YXRpb25fdXNlX25vZXhjXCIgW0BAbm9hbGxvY11cbiAgZXh0ZXJuYWwgYWxsb2Nfc3RhY2sgOlxuICAgICgnYSAtPiAnYikgLT5cbiAgICAoZXhuIC0+ICdiKSAtPlxuICAgICgnYyB0IC0+ICgnYywgJ2IpIGNvbnRpbnVhdGlvbiAtPiBsYXN0X2ZpYmVyIC0+ICdiKSAtPlxuICAgICgnYSwgJ2IpIHN0YWNrID0gXCJjYW1sX2FsbG9jX3N0YWNrXCJcblxuICBsZXQgY29udGludWUgayB2ID0gcmVzdW1lICh0YWtlX2NvbnRfbm9leGMgaykgKGZ1biB4IC0+IHgpIHZcblxuICBsZXQgZGlzY29udGludWUgayBlID0gcmVzdW1lICh0YWtlX2NvbnRfbm9leGMgaykgKGZ1biBlIC0+IHJhaXNlIGUpIGVcblxuICBsZXQgZGlzY29udGludWVfd2l0aF9iYWNrdHJhY2UgayBlIGJ0ID0gcmVzdW1lICh0YWtlX2NvbnRfbm9leGMgaykgKGZ1biBlIC0+XG4gICAgUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgZSBidCkgZVxuXG4gIHR5cGUgKCdhLCdiKSBoYW5kbGVyID1cbiAgICB7IHJldGM6ICdhIC0+ICdiO1xuICAgICAgZXhuYzogZXhuIC0+ICdiO1xuICAgICAgZWZmYzogJ2MuJ2MgdCAtPiAoKCdjLCdiKSBjb250aW51YXRpb24gLT4gJ2IpIG9wdGlvbiB9XG5cbiAgZXh0ZXJuYWwgcmVwZXJmb3JtIDpcbiAgICAnYSB0IC0+ICgnYSwgJ2IpIGNvbnRpbnVhdGlvbiAtPiBsYXN0X2ZpYmVyIC0+ICdiID0gXCIlcmVwZXJmb3JtXCJcblxuICBsZXQgbWF0Y2hfd2l0aCBjb21wIGFyZyBoYW5kbGVyID1cbiAgICBsZXQgZWZmYyBlZmYgayBsYXN0X2ZpYmVyID1cbiAgICAgIG1hdGNoIGhhbmRsZXIuZWZmYyBlZmYgd2l0aFxuICAgICAgfCBTb21lIGYgLT4gZiBrXG4gICAgICB8IE5vbmUgLT4gcmVwZXJmb3JtIGVmZiBrIGxhc3RfZmliZXJcbiAgICBpblxuICAgIGxldCBzID0gYWxsb2Nfc3RhY2sgaGFuZGxlci5yZXRjIGhhbmRsZXIuZXhuYyBlZmZjIGluXG4gICAgcnVuc3RhY2sgcyBjb21wIGFyZ1xuXG4gIHR5cGUgJ2EgZWZmZWN0X2hhbmRsZXIgPVxuICAgIHsgZWZmYzogJ2IuICdiIHQgLT4gKCgnYiwnYSkgY29udGludWF0aW9uIC0+ICdhKSBvcHRpb24gfVxuXG4gIGxldCB0cnlfd2l0aCBjb21wIGFyZyBoYW5kbGVyID1cbiAgICBsZXQgZWZmYycgZWZmIGsgbGFzdF9maWJlciA9XG4gICAgICBtYXRjaCBoYW5kbGVyLmVmZmMgZWZmIHdpdGhcbiAgICAgIHwgU29tZSBmIC0+IGYga1xuICAgICAgfCBOb25lIC0+IHJlcGVyZm9ybSBlZmYgayBsYXN0X2ZpYmVyXG4gICAgaW5cbiAgICBsZXQgcyA9IGFsbG9jX3N0YWNrIChmdW4geCAtPiB4KSAoZnVuIGUgLT4gcmFpc2UgZSkgZWZmYycgaW5cbiAgICBydW5zdGFjayBzIGNvbXAgYXJnXG5cbiAgZXh0ZXJuYWwgZ2V0X2NhbGxzdGFjayA6XG4gICAgKCdhLCdiKSBjb250aW51YXRpb24gLT4gaW50IC0+IFByaW50ZXhjLnJhd19iYWNrdHJhY2UgPVxuICAgIFwiY2FtbF9nZXRfY29udGludWF0aW9uX2NhbGxzdGFja1wiXG5lbmRcblxubW9kdWxlIFNoYWxsb3cgPSBzdHJ1Y3RcblxuICB0eXBlICgnYSwnYikgY29udGludWF0aW9uXG4gIHR5cGUgbGFzdF9maWJlclxuXG4gIGV4dGVybmFsIGFsbG9jX3N0YWNrIDpcbiAgICAoJ2EgLT4gJ2IpIC0+XG4gICAgKGV4biAtPiAnYikgLT5cbiAgICAoJ2MgdCAtPiAoJ2MsICdiKSBjb250aW51YXRpb24gLT4gbGFzdF9maWJlciAtPiAnYikgLT5cbiAgICAoJ2EsICdiKSBzdGFjayA9IFwiY2FtbF9hbGxvY19zdGFja1wiXG5cblxuICBsZXQgZmliZXIgOiB0eXBlIGEgYi4gKGEgLT4gYikgLT4gKGEsIGIpIGNvbnRpbnVhdGlvbiA9IGZ1biBmIC0+XG4gICAgbGV0IG1vZHVsZSBNID0gc3RydWN0IHR5cGUgXyB0ICs9IEluaXRpYWxfc2V0dXBfXyA6IGEgdCBlbmQgaW5cbiAgICBsZXQgZXhjZXB0aW9uIEUgb2YgKGEsYikgY29udGludWF0aW9uIGluXG4gICAgbGV0IGYnICgpID0gZiAocGVyZm9ybSBNLkluaXRpYWxfc2V0dXBfXykgaW5cbiAgICBsZXQgZXJyb3IgXyA9IGZhaWx3aXRoIFwiaW1wb3NzaWJsZVwiIGluXG4gICAgbGV0IGVmZmMgZWZmIGsgX2xhc3RfZmliZXIgPVxuICAgICAgbWF0Y2ggZWZmIHdpdGhcbiAgICAgIHwgTS5Jbml0aWFsX3NldHVwX18gLT4gcmFpc2Vfbm90cmFjZSAoRSBrKVxuICAgICAgfCBfIC0+IGVycm9yICgpXG4gICAgaW5cbiAgICBsZXQgcyA9IGFsbG9jX3N0YWNrIGVycm9yIGVycm9yIGVmZmMgaW5cbiAgICBtYXRjaCBydW5zdGFjayBzIGYnICgpIHdpdGhcbiAgICB8IGV4Y2VwdGlvbiBFIGsgLT4ga1xuICAgIHwgXyAtPiBlcnJvciAoKVxuXG4gIHR5cGUgKCdhLCdiKSBoYW5kbGVyID1cbiAgICB7IHJldGM6ICdhIC0+ICdiO1xuICAgICAgZXhuYzogZXhuIC0+ICdiO1xuICAgICAgZWZmYzogJ2MuJ2MgdCAtPiAoKCdjLCdhKSBjb250aW51YXRpb24gLT4gJ2IpIG9wdGlvbiB9XG5cbiAgZXh0ZXJuYWwgdXBkYXRlX2hhbmRsZXIgOlxuICAgICgnYSwnYikgY29udGludWF0aW9uIC0+XG4gICAgKCdiIC0+ICdjKSAtPlxuICAgIChleG4gLT4gJ2MpIC0+XG4gICAgKCdkIHQgLT4gKCdkLCdiKSBjb250aW51YXRpb24gLT4gbGFzdF9maWJlciAtPiAnYykgLT5cbiAgICAoJ2EsJ2MpIHN0YWNrID0gXCJjYW1sX2NvbnRpbnVhdGlvbl91c2VfYW5kX3VwZGF0ZV9oYW5kbGVyX25vZXhjXCIgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCByZXBlcmZvcm0gOlxuICAgICdhIHQgLT4gKCdhLCAnYikgY29udGludWF0aW9uIC0+IGxhc3RfZmliZXIgLT4gJ2MgPSBcIiVyZXBlcmZvcm1cIlxuXG4gIGxldCBjb250aW51ZV9nZW4gayByZXN1bWVfZnVuIHYgaGFuZGxlciA9XG4gICAgbGV0IGVmZmMgZWZmIGsgbGFzdF9maWJlciA9XG4gICAgICBtYXRjaCBoYW5kbGVyLmVmZmMgZWZmIHdpdGhcbiAgICAgIHwgU29tZSBmIC0+IGYga1xuICAgICAgfCBOb25lIC0+IHJlcGVyZm9ybSBlZmYgayBsYXN0X2ZpYmVyXG4gICAgaW5cbiAgICBsZXQgc3RhY2sgPSB1cGRhdGVfaGFuZGxlciBrIGhhbmRsZXIucmV0YyBoYW5kbGVyLmV4bmMgZWZmYyBpblxuICAgIHJlc3VtZSBzdGFjayByZXN1bWVfZnVuIHZcblxuICBsZXQgY29udGludWVfd2l0aCBrIHYgaGFuZGxlciA9XG4gICAgY29udGludWVfZ2VuIGsgKGZ1biB4IC0+IHgpIHYgaGFuZGxlclxuXG4gIGxldCBkaXNjb250aW51ZV93aXRoIGsgdiBoYW5kbGVyID1cbiAgICBjb250aW51ZV9nZW4gayAoZnVuIGUgLT4gcmFpc2UgZSkgdiBoYW5kbGVyXG5cbiAgbGV0IGRpc2NvbnRpbnVlX3dpdGhfYmFja3RyYWNlIGsgdiBidCBoYW5kbGVyID1cbiAgICBjb250aW51ZV9nZW4gayAoZnVuIGUgLT4gUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgZSBidCkgdiBoYW5kbGVyXG5cbiAgZXh0ZXJuYWwgZ2V0X2NhbGxzdGFjayA6XG4gICAgKCdhLCdiKSBjb250aW51YXRpb24gLT4gaW50IC0+IFByaW50ZXhjLnJhd19iYWNrdHJhY2UgPVxuICAgIFwiY2FtbF9nZXRfY29udGludWF0aW9uX2NhbGxzdGFja1wiXG5lbmRcbiIsIigqIGdlbmVyYXRlZCBieSBkdW5lICopXG5cbigqKiBAY2Fub25pY2FsIEpzb29fcnVudGltZS5SdW50aW1lX3ZlcnNpb24gKilcbm1vZHVsZSBSdW50aW1lX3ZlcnNpb24gPSBKc29vX3J1bnRpbWVfX1J1bnRpbWVfdmVyc2lvblxuXG5tb2R1bGUgSnNvb19ydW50aW1lX18gPSBzdHJ1Y3QgZW5kXG5bQEBkZXByZWNhdGVkIFwidGhpcyBtb2R1bGUgaXMgc2hhZG93ZWRcIl1cbiIsIm1vZHVsZSBKcyA9IHN0cnVjdFxuICB0eXBlIHRcblxuICB0eXBlICdhIGpzX2FycmF5ID0gdFxuXG4gIHR5cGUgKCdhLCAnYikgbWV0aF9jYWxsYmFjayA9IHRcblxuICBleHRlcm5hbCBzdHJpbmcgOiBzdHJpbmcgLT4gdCA9IFwiY2FtbF9qc3N0cmluZ19vZl9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIHRvX3N0cmluZyA6IHQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9qc3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgYnl0ZXN0cmluZyA6IHN0cmluZyAtPiB0ID0gXCJjYW1sX2pzYnl0ZXNfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19ieXRlc3RyaW5nIDogdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzYnl0ZXNcIlxuXG4gIGV4dGVybmFsIGJvb2wgOiBib29sIC0+IHQgPSBcImNhbWxfanNfZnJvbV9ib29sXCJcblxuICBleHRlcm5hbCB0b19ib29sIDogdCAtPiBib29sID0gXCJjYW1sX2pzX3RvX2Jvb2xcIlxuXG4gIGV4dGVybmFsIGFycmF5IDogJ2EgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19mcm9tX2FycmF5XCJcblxuICBleHRlcm5hbCB0b19hcnJheSA6IHQgLT4gJ2EgYXJyYXkgPSBcImNhbWxfanNfdG9fYXJyYXlcIlxuXG4gIGV4dGVybmFsIG51bWJlcl9vZl9mbG9hdCA6IGZsb2F0IC0+IHQgPSBcImNhbWxfanNfZnJvbV9mbG9hdFwiXG5cbiAgZXh0ZXJuYWwgZmxvYXRfb2ZfbnVtYmVyIDogdCAtPiBmbG9hdCA9IFwiY2FtbF9qc190b19mbG9hdFwiXG5cbiAgZXh0ZXJuYWwgdHlwZW9mIDogdCAtPiB0ID0gXCJjYW1sX2pzX3R5cGVvZlwiXG5cbiAgZXh0ZXJuYWwgaW5zdGFuY2VvZiA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2luc3RhbmNlb2ZcIlxuXG4gIGV4dGVybmFsIGRlYnVnZ2VyIDogdW5pdCAtPiB1bml0ID0gXCJkZWJ1Z2dlclwiXG5cbiAgZXh0ZXJuYWwgZ2V0IDogdCAtPiB0IC0+IHQgPSBcImNhbWxfanNfZ2V0XCJcblxuICBleHRlcm5hbCBzZXQgOiB0IC0+IHQgLT4gdCAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbiAgZXh0ZXJuYWwgZGVsZXRlIDogdCAtPiB0IC0+IHVuaXQgPSBcImNhbWxfanNfZGVsZXRlXCJcblxuICBleHRlcm5hbCBjYWxsIDogdCAtPiB0IC0+IHQgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19jYWxsXCJcblxuICBleHRlcm5hbCBmdW5fY2FsbCA6IHQgLT4gdCBhcnJheSAtPiB0ID0gXCJjYW1sX2pzX2Z1bl9jYWxsXCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGwgOiB0IC0+IHN0cmluZyAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbWV0aF9jYWxsXCJcblxuICBleHRlcm5hbCBuZXdfb2JqIDogdCAtPiB0IGFycmF5IC0+IHQgPSBcImNhbWxfanNfbmV3XCJcblxuICBleHRlcm5hbCBuZXdfb2JqX2FyciA6IHQgLT4gdCBqc19hcnJheSAtPiB0ID0gXCJjYW1sX29qc19uZXdfYXJyXCJcblxuICBleHRlcm5hbCBvYmogOiAoc3RyaW5nICogdCkgYXJyYXkgLT4gdCA9IFwiY2FtbF9qc19vYmplY3RcIlxuXG4gIGV4dGVybmFsIGVxdWFscyA6IHQgLT4gdCAtPiBib29sID0gXCJjYW1sX2pzX2VxdWFsc1wiXG5cbiAgZXh0ZXJuYWwgcHVyZV9leHByIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2pzX3B1cmVfZXhwclwiXG5cbiAgZXh0ZXJuYWwgZXZhbF9zdHJpbmcgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXZhbF9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGpzX2V4cHIgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfZXhwclwiXG5cbiAgZXh0ZXJuYWwgcHVyZV9qc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX3B1cmVfanNfZXhwclwiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2sgOiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3Vuc2FmZVwiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICh0IGpzX2FycmF5IC0+ICdiKSAtPiAoJ2MsIHQganNfYXJyYXkgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2EgLT4gJ2IpIC0+ICgnYywgJ2EgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFjayA6ICgnYiAtPiAnYSkgLT4gKCdiLCAnYSkgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja191bnNhZmVcIlxuXG4gIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfc3RyaWN0XCJcblxuICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrX3dpdGhfYXJndW1lbnRzIDpcbiAgICAoJ2IgLT4gdCBqc19hcnJheSAtPiAnYSkgLT4gKCdiLCB0IGpzX2FycmF5IC0+ICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgZXh0ZXJuYWwgd3JhcF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tcIlxuXG4gIGV4dGVybmFsIHdyYXBfbWV0aF9jYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdhLCAnYikgbWV0aF9jYWxsYmFja1xuICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja1wiXG5lbmRcblxubW9kdWxlIFN5cyA9IHN0cnVjdFxuICB0eXBlICdhIGNhbGxiYWNrID0gJ2FcblxuICBleHRlcm5hbCBjcmVhdGVfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IGNvbnRlbnQ6c3RyaW5nIC0+IHVuaXQgPSBcImNhbWxfY3JlYXRlX2ZpbGVcIlxuXG4gIGV4dGVybmFsIHJlYWRfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IHN0cmluZyA9IFwiY2FtbF9yZWFkX2ZpbGVfY29udGVudFwiXG5cbiAgZXh0ZXJuYWwgc2V0X2NoYW5uZWxfb3V0cHV0JyA6IG91dF9jaGFubmVsIC0+IChqc19zdHJpbmc6SnMudCAtPiB1bml0KSBjYWxsYmFjayAtPiB1bml0XG4gICAgPSBcImNhbWxfbWxfc2V0X2NoYW5uZWxfb3V0cHV0XCJcblxuICBleHRlcm5hbCBzZXRfY2hhbm5lbF9pbnB1dCcgOiBpbl9jaGFubmVsIC0+ICh1bml0IC0+IHN0cmluZykgY2FsbGJhY2sgLT4gdW5pdFxuICAgID0gXCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbFwiXG5cbiAgZXh0ZXJuYWwgbW91bnRfcG9pbnQgOiB1bml0IC0+IHN0cmluZyBsaXN0ID0gXCJjYW1sX2xpc3RfbW91bnRfcG9pbnRcIlxuXG4gIGV4dGVybmFsIG1vdW50X2F1dG9sb2FkIDogc3RyaW5nIC0+IChzdHJpbmcgLT4gc3RyaW5nIC0+IHN0cmluZyBvcHRpb24pIGNhbGxiYWNrIC0+IHVuaXRcbiAgICA9IFwiY2FtbF9tb3VudF9hdXRvbG9hZFwiXG5cbiAgZXh0ZXJuYWwgdW5tb3VudCA6IHN0cmluZyAtPiB1bml0ID0gXCJjYW1sX3VubW91bnRcIlxuXG4gIG1vZHVsZSBDb25maWcgPSBzdHJ1Y3RcbiAgICBleHRlcm5hbCB1c2VfanNfc3RyaW5nIDogdW5pdCAtPiBib29sID0gXCJjYW1sX2pzb29fZmxhZ3NfdXNlX2pzX3N0cmluZ1wiXG5cbiAgICBleHRlcm5hbCBlZmZlY3RzIDogdW5pdCAtPiBib29sID0gXCJjYW1sX2pzb29fZmxhZ3NfZWZmZWN0c1wiXG4gIGVuZFxuXG4gIGxldCB2ZXJzaW9uID0gUnVudGltZV92ZXJzaW9uLnNcblxuICBsZXQgZ2l0X3ZlcnNpb24gPSBSdW50aW1lX3ZlcnNpb24uZ2l0X3ZlcnNpb25cbmVuZFxuXG5tb2R1bGUgRXJyb3IgOiBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIHJhaXNlXyA6IHQgLT4gJ2FcblxuICB2YWwgYXR0YWNoX2pzX2JhY2t0cmFjZSA6IGV4biAtPiBmb3JjZTpib29sIC0+IGV4blxuICAoKiogQXR0YWNoIGEgSmF2YXNTY3JpcHQgZXJyb3IgdG8gYW4gT0NhbWwgZXhjZXB0aW9uLiAgaWYgW2ZvcmNlID0gZmFsc2VdIGFuZCBhXG4gICAgSmF2YXNTY3JpcHQgZXJyb3IgaXMgYWxyZWFkeSBhdHRhY2hlZCwgaXQgd2lsbCBkbyBub3RoaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB0b1xuICAgIHN0b3JlIGFuZCByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBKYXZhU2NyaXB0IHN0YWNrIHRyYWNlcy5cblxuICAgIEF0dGFjaGluZyBKYXZhc1NjcmlwdCBlcnJvcnMgd2lsbCBoYXBwZW4gYXV0b21hdGljYWxseSB3aGVuIGNvbXBpbGluZyB3aXRoXG4gICAgWy0tZW5hYmxlIHdpdGgtanMtZXJyb3JdLiAqKVxuXG4gIHZhbCBvZl9leG4gOiBleG4gLT4gdCBvcHRpb25cbiAgKCoqIEV4dHJhY3QgYSBKYXZhU2NyaXB0IGVycm9yIGF0dGFjaGVkIHRvIGFuIE9DYW1sIGV4Y2VwdGlvbiwgaWYgYW55LiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgICAgIGluc3BlY3QgYW4gZXZlbnR1YWwgc3RhY2sgc3RyYWNlLCBlc3BlY2lhbGx5IHdoZW4gc291cmNlbWFwIGlzIGVuYWJsZWQuICopXG5cbiAgZXhjZXB0aW9uIEV4biBvZiB0XG4gICgqKiBUaGUgW0Vycm9yXSBleGNlcHRpb24gd3JhcCBqYXZhc2NyaXB0IGV4Y2VwdGlvbnMgd2hlbiBjYXVnaHQgYnkgT0NhbWwgY29kZS5cbiAgICAgIEluIGNhc2UgdGhlIGphdmFzY3JpcHQgZXhjZXB0aW9uIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBqYXZhc2NyaXB0IFtFcnJvcl0sXG4gICAgICBpdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYW5kIHdyYXBwZWQgaW50byBhIFtGYWlsdXJlXSBleGNlcHRpb24uXG4gICopXG5lbmQgPSBzdHJ1Y3RcbiAgdHlwZSB0XG5cbiAgZXhjZXB0aW9uIEV4biBvZiB0XG5cbiAgbGV0IF8gPSBDYWxsYmFjay5yZWdpc3Rlcl9leGNlcHRpb24gXCJqc0Vycm9yXCIgKEV4biAoT2JqLm1hZ2ljIFt8fF0pKVxuXG4gIGxldCByYWlzZV8gOiB0IC0+ICdhID0gSnMuanNfZXhwciBcIihmdW5jdGlvbiAoZXhuKSB7IHRocm93IGV4biB9KVwiXG5cbiAgZXh0ZXJuYWwgb2ZfZXhuIDogZXhuIC0+IHQgb3B0aW9uID0gXCJjYW1sX2pzX2Vycm9yX29wdGlvbl9vZl9leGNlcHRpb25cIlxuXG4gIGV4dGVybmFsIGF0dGFjaF9qc19iYWNrdHJhY2UgOiBleG4gLT4gZm9yY2U6Ym9vbCAtPiBleG4gPSBcImNhbWxfZXhuX3dpdGhfanNfYmFja3RyYWNlXCJcbmVuZFxuXG5bQEBAb2NhbWwud2FybmluZyBcIi0zMi02MFwiXVxuXG5tb2R1bGUgRm9yX2NvbXBhdGliaWxpdHlfb25seSA9IHN0cnVjdFxuICAoKiBBZGQgcHJpbWl0aXZlcyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiBFeGlzdGluZyB1c2VycyBtaWdodFxuICAgICBkZXBlbmQgb24gaXQgKGUuZy4gZ2VuX2pzX2FwaSksIHdlIGRvbnQgd2FudCB0aGUgb2NhbWwgY29tcGlsZXJcbiAgICAgdG8gY29tcGxhaW4gYWJvdXQgdGhlc2VzIG1pc3NpbmcgcHJpbWl0aXZlcy4gKilcblxuICBleHRlcm5hbCBjYW1sX2pzX2Zyb21fc3RyaW5nIDogc3RyaW5nIC0+IEpzLnQgPSBcImNhbWxfanNfZnJvbV9zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfanNfdG9fYnl0ZV9zdHJpbmcgOiBKcy50IC0+IHN0cmluZyA9IFwiY2FtbF9qc190b19ieXRlX3N0cmluZ1wiXG5cbiAgZXh0ZXJuYWwgY2FtbF9qc190b19zdHJpbmcgOiBKcy50IC0+IHN0cmluZyA9IFwiY2FtbF9qc190b19zdHJpbmdcIlxuXG4gIGV4dGVybmFsIGNhbWxfbGlzdF9vZl9qc19hcnJheSA6ICdhIEpzLmpzX2FycmF5IC0+ICdhIGxpc3QgPSBcImNhbWxfbGlzdF9vZl9qc19hcnJheVwiXG5cbiAgZXh0ZXJuYWwgY2FtbF9saXN0X3RvX2pzX2FycmF5IDogJ2EgbGlzdCAtPiAnYSBKcy5qc19hcnJheSA9IFwiY2FtbF9saXN0X3RvX2pzX2FycmF5XCJcblxuICBleHRlcm5hbCB2YXJpYWJsZSA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc192YXJcIlxuZW5kXG5cbm1vZHVsZSBUeXBlZF9hcnJheSA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHR5cGVkQXJyYXkgPSBKcy50XG5cbiAgdHlwZSBhcnJheUJ1ZmZlciA9IEpzLnRcblxuICB0eXBlIHVpbnQ4QXJyYXkgPSBKcy50XG5cbiAgZXh0ZXJuYWwga2luZCA6ICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYikgQmlnYXJyYXkua2luZFxuICAgID0gXCJjYW1sX2JhX2tpbmRfb2ZfdHlwZWRfYXJyYXlcIlxuXG4gIGV4dGVybmFsIGZyb21fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IsIEJpZ2FycmF5LmNfbGF5b3V0KSBCaWdhcnJheS5HZW5hcnJheS50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXlcbiAgICA9IFwiY2FtbF9iYV90b190eXBlZF9hcnJheVwiXG5cbiAgZXh0ZXJuYWwgdG9fZ2VuYXJyYXkgOlxuICAgICgnYSwgJ2IpIHR5cGVkQXJyYXkgLT4gKCdhLCAnYiwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkdlbmFycmF5LnRcbiAgICA9IFwiY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5XCJcblxuICBtb2R1bGUgQmlnc3RyaW5nID0gc3RydWN0XG4gICAgdHlwZSB0ID0gKGNoYXIsIEJpZ2FycmF5LmludDhfdW5zaWduZWRfZWx0LCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuQXJyYXkxLnRcblxuICAgIGV4dGVybmFsIHRvX2FycmF5QnVmZmVyIDogdCAtPiBhcnJheUJ1ZmZlciA9IFwiYmlnc3RyaW5nX3RvX2FycmF5X2J1ZmZlclwiXG5cbiAgICBleHRlcm5hbCB0b191aW50OEFycmF5IDogdCAtPiB1aW50OEFycmF5ID0gXCJiaWdzdHJpbmdfdG9fdHlwZWRfYXJyYXlcIlxuXG4gICAgZXh0ZXJuYWwgb2ZfYXJyYXlCdWZmZXIgOiBhcnJheUJ1ZmZlciAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfYXJyYXlfYnVmZmVyXCJcblxuICAgIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IHQgPSBcImJpZ3N0cmluZ19vZl90eXBlZF9hcnJheVwiXG4gIGVuZFxuXG4gIGV4dGVybmFsIG9mX3VpbnQ4QXJyYXkgOiB1aW50OEFycmF5IC0+IHN0cmluZyA9IFwiY2FtbF9zdHJpbmdfb2ZfYXJyYXlcIlxuZW5kXG5cbm1vZHVsZSBJbnQ2NCA9IHN0cnVjdFxuICBleHRlcm5hbCBjcmVhdGVfaW50NjRfbG9fbWlfaGkgOiBpbnQgLT4gaW50IC0+IGludCAtPiBJbnQ2NC50XG4gICAgPSBcImNhbWxfaW50NjRfY3JlYXRlX2xvX21pX2hpXCJcbmVuZFxuIiwiKCogZ2VuZXJhdGVkIGJ5IGR1bmUgKilcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuQ1NTICopXG5tb2R1bGUgQ1NTID0gSnNfb2Zfb2NhbWxfX0NTU1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Eb20gKilcbm1vZHVsZSBEb20gPSBKc19vZl9vY2FtbF9fRG9tXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkRvbV9ldmVudHMgKilcbm1vZHVsZSBEb21fZXZlbnRzID0gSnNfb2Zfb2NhbWxfX0RvbV9ldmVudHNcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRG9tX2h0bWwgKilcbm1vZHVsZSBEb21faHRtbCA9IEpzX29mX29jYW1sX19Eb21faHRtbFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5Eb21fc3ZnICopXG5tb2R1bGUgRG9tX3N2ZyA9IEpzX29mX29jYW1sX19Eb21fc3ZnXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkV2ZW50U291cmNlICopXG5tb2R1bGUgRXZlbnRTb3VyY2UgPSBKc19vZl9vY2FtbF9fRXZlbnRTb3VyY2VcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuRmlsZSAqKVxubW9kdWxlIEZpbGUgPSBKc19vZl9vY2FtbF9fRmlsZVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5GaXJlYnVnICopXG5tb2R1bGUgRmlyZWJ1ZyA9IEpzX29mX29jYW1sX19GaXJlYnVnXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkZvcm0gKilcbm1vZHVsZSBGb3JtID0gSnNfb2Zfb2NhbWxfX0Zvcm1cblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuR2VvbG9jYXRpb24gKilcbm1vZHVsZSBHZW9sb2NhdGlvbiA9IEpzX29mX29jYW1sX19HZW9sb2NhdGlvblxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5JbXBvcnQgKilcbm1vZHVsZSBJbXBvcnQgPSBKc19vZl9vY2FtbF9fSW1wb3J0XG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkludGVyc2VjdGlvbk9ic2VydmVyICopXG5tb2R1bGUgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBKc19vZl9vY2FtbF9fSW50ZXJzZWN0aW9uT2JzZXJ2ZXJcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSW50bCAqKVxubW9kdWxlIEludGwgPSBKc19vZl9vY2FtbF9fSW50bFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5KcyAqKVxubW9kdWxlIEpzID0gSnNfb2Zfb2NhbWxfX0pzXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLkpzb24gKilcbm1vZHVsZSBKc29uID0gSnNfb2Zfb2NhbWxfX0pzb25cblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuSnN0YWJsZSAqKVxubW9kdWxlIEpzdGFibGUgPSBKc19vZl9vY2FtbF9fSnN0YWJsZVxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5MaWJfdmVyc2lvbiAqKVxubW9kdWxlIExpYl92ZXJzaW9uID0gSnNfb2Zfb2NhbWxfX0xpYl92ZXJzaW9uXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLk11dGF0aW9uT2JzZXJ2ZXIgKilcbm1vZHVsZSBNdXRhdGlvbk9ic2VydmVyID0gSnNfb2Zfb2NhbWxfX011dGF0aW9uT2JzZXJ2ZXJcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuUGVyZm9ybWFuY2VPYnNlcnZlciAqKVxubW9kdWxlIFBlcmZvcm1hbmNlT2JzZXJ2ZXIgPSBKc19vZl9vY2FtbF9fUGVyZm9ybWFuY2VPYnNlcnZlclxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5SZWdleHAgKilcbm1vZHVsZSBSZWdleHAgPSBKc19vZl9vY2FtbF9fUmVnZXhwXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlJlc2l6ZU9ic2VydmVyICopXG5tb2R1bGUgUmVzaXplT2JzZXJ2ZXIgPSBKc19vZl9vY2FtbF9fUmVzaXplT2JzZXJ2ZXJcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuU3lzX2pzICopXG5tb2R1bGUgU3lzX2pzID0gSnNfb2Zfb2NhbWxfX1N5c19qc1xuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5UeXBlZF9hcnJheSAqKVxubW9kdWxlIFR5cGVkX2FycmF5ID0gSnNfb2Zfb2NhbWxfX1R5cGVkX2FycmF5XG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLlVybCAqKVxubW9kdWxlIFVybCA9IEpzX29mX29jYW1sX19VcmxcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuV2ViR0wgKilcbm1vZHVsZSBXZWJHTCA9IEpzX29mX29jYW1sX19XZWJHTFxuXG4oKiogQGNhbm9uaWNhbCBKc19vZl9vY2FtbC5XZWJTb2NrZXRzICopXG5tb2R1bGUgV2ViU29ja2V0cyA9IEpzX29mX29jYW1sX19XZWJTb2NrZXRzXG5cbigqKiBAY2Fub25pY2FsIEpzX29mX29jYW1sLldvcmtlciAqKVxubW9kdWxlIFdvcmtlciA9IEpzX29mX29jYW1sX19Xb3JrZXJcblxuKCoqIEBjYW5vbmljYWwgSnNfb2Zfb2NhbWwuWG1sSHR0cFJlcXVlc3QgKilcbm1vZHVsZSBYbWxIdHRwUmVxdWVzdCA9IEpzX29mX29jYW1sX19YbWxIdHRwUmVxdWVzdFxuXG5tb2R1bGUgSnNfb2Zfb2NhbWxfXyA9IHN0cnVjdCBlbmRcbltAQGRlcHJlY2F0ZWQgXCJ0aGlzIG1vZHVsZSBpcyBzaGFkb3dlZFwiXVxuIiwiKCogSnNfb2Zfb2NhbWxcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIGV4dGVybmFsICggPCApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcblxuICBleHRlcm5hbCAoIDw9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbGVzc2VxdWFsXCJcblxuICBleHRlcm5hbCAoIDw+ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlbm90ZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBleHRlcm5hbCAoID4gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG5cbiAgZXh0ZXJuYWwgKCA+PSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJlcXVhbFwiXG5cbiAgZXh0ZXJuYWwgY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG4gIGV4dGVybmFsIGVxdWFsIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmVuZFxuXG5tb2R1bGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBleHRlcm5hbCAoIDwgKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcblxuICBleHRlcm5hbCAoIDw9ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuXG4gIGV4dGVybmFsICggPD4gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcblxuICBleHRlcm5hbCAoID0gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWVxdWFsXCJcblxuICBleHRlcm5hbCAoID4gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcblxuICBleHRlcm5hbCAoID49ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuXG4gIGV4dGVybmFsIGNvbXBhcmUgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWNvbXBhcmVcIlxuXG4gIGV4dGVybmFsIGVxdWFsIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZXF1YWxcIlxuXG4gIGxldCBtYXggKHggOiBpbnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuXG4gIGxldCBtaW4gKHggOiBpbnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBTdHJpbmcgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTdHJpbmdcblxuICBsZXQgZXF1YWwgKHggOiBzdHJpbmcpICh5IDogc3RyaW5nKSA9IFBvbHkuZXF1YWwgeCB5XG5lbmRcblxubW9kdWxlIENoYXIgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBDaGFyXG5cbiAgbGV0IGVxdWFsICh4IDogY2hhcikgKHkgOiBjaGFyKSA9IFBvbHkuZXF1YWwgeCB5XG5lbmRcblxuaW5jbHVkZSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIErDqXLDtG1lIFZvdWlsbG9uXG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG4oKiBUaGlzIGxvY2FsIG1vZHVsZSBbSnNdIGlzIG5lZWRlZCBzbyB0aGF0IHRoZSBwcHhfanMgZXh0ZW5zaW9uIHdvcmsgd2l0aGluIHRoYXQgZmlsZS4gKilcbm1vZHVsZSBKcyA9IHN0cnVjdFxuICB0eXBlICsnYSB0XG5cbiAgdHlwZSAoLSdhLCArJ2IpIG1ldGhfY2FsbGJhY2tcblxuICBtb2R1bGUgVW5zYWZlID0gc3RydWN0XG4gICAgdHlwZSB0b3BcblxuICAgIHR5cGUgYW55ID0gdG9wIHRcblxuICAgIHR5cGUgYW55X2pzX2FycmF5ID0gYW55XG5cbiAgICBleHRlcm5hbCBpbmplY3QgOiAnYSAtPiBhbnkgPSBcIiVpZGVudGl0eVwiXG5cbiAgICBleHRlcm5hbCBjb2VyY2UgOiBfIHQgLT4gXyB0ID0gXCIlaWRlbnRpdHlcIlxuXG4gICAgZXh0ZXJuYWwgZ2V0IDogJ2EgLT4gJ2IgLT4gJ2MgPSBcImNhbWxfanNfZ2V0XCJcblxuICAgIGV4dGVybmFsIHNldCA6ICdhIC0+ICdiIC0+ICdjIC0+IHVuaXQgPSBcImNhbWxfanNfc2V0XCJcblxuICAgIGV4dGVybmFsIGRlbGV0ZSA6ICdhIC0+ICdiIC0+IHVuaXQgPSBcImNhbWxfanNfZGVsZXRlXCJcblxuICAgIGV4dGVybmFsIGNhbGwgOiAnYSAtPiAnYiAtPiBhbnkgYXJyYXkgLT4gJ2MgPSBcImNhbWxfanNfY2FsbFwiXG5cbiAgICBleHRlcm5hbCBmdW5fY2FsbCA6ICdhIC0+IGFueSBhcnJheSAtPiAnYiA9IFwiY2FtbF9qc19mdW5fY2FsbFwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGwgOiAnYSAtPiBzdHJpbmcgLT4gYW55IGFycmF5IC0+ICdiID0gXCJjYW1sX2pzX21ldGhfY2FsbFwiXG5cbiAgICBleHRlcm5hbCBuZXdfb2JqIDogJ2EgLT4gYW55IGFycmF5IC0+ICdiID0gXCJjYW1sX2pzX25ld1wiXG5cbiAgICBleHRlcm5hbCBuZXdfb2JqX2FyciA6ICdhIC0+IGFueV9qc19hcnJheSAtPiAnYiA9IFwiY2FtbF9vanNfbmV3X2FyclwiXG5cbiAgICBleHRlcm5hbCBvYmogOiAoc3RyaW5nICogYW55KSBhcnJheSAtPiAnYSA9IFwiY2FtbF9qc19vYmplY3RcIlxuXG4gICAgZXh0ZXJuYWwgZXF1YWxzIDogJ2EgLT4gJ2IgLT4gYm9vbCA9IFwiY2FtbF9qc19lcXVhbHNcIlxuXG4gICAgZXh0ZXJuYWwgcHVyZV9leHByIDogKHVuaXQgLT4gJ2EpIC0+ICdhID0gXCJjYW1sX2pzX3B1cmVfZXhwclwiXG5cbiAgICBleHRlcm5hbCBldmFsX3N0cmluZyA6IHN0cmluZyAtPiAnYSA9IFwiY2FtbF9qc19ldmFsX3N0cmluZ1wiXG5cbiAgICBleHRlcm5hbCBqc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX2pzX2V4cHJcIlxuXG4gICAgZXh0ZXJuYWwgcHVyZV9qc19leHByIDogc3RyaW5nIC0+ICdhID0gXCJjYW1sX3B1cmVfanNfZXhwclwiXG5cbiAgICBsZXQgZ2xvYmFsID0gcHVyZV9qc19leHByIFwiZ2xvYmFsVGhpc1wiXG5cbiAgICBleHRlcm5hbCBjYWxsYmFjayA6ICgnYSAtPiAnYikgLT4gKCdjLCAnYSAtPiAnYikgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja191bnNhZmVcIlxuXG4gICAgZXh0ZXJuYWwgY2FsbGJhY2tfd2l0aF9hcmd1bWVudHMgOlxuICAgICAgKGFueV9qc19hcnJheSAtPiAnYikgLT4gKCdjLCBhbnlfanNfYXJyYXkgLT4gJ2IpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfY2FsbGJhY2tfYXJndW1lbnRzXCJcblxuICAgIGV4dGVybmFsIGNhbGxiYWNrX3dpdGhfYXJpdHkgOiBpbnQgLT4gKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX2NhbGxiYWNrX3N0cmljdFwiXG5cbiAgICBleHRlcm5hbCBtZXRoX2NhbGxiYWNrIDogKCdiIC0+ICdhKSAtPiAoJ2IsICdhKSBtZXRoX2NhbGxiYWNrXG4gICAgICA9IFwiY2FtbF9qc193cmFwX21ldGhfY2FsbGJhY2tfdW5zYWZlXCJcblxuICAgIGV4dGVybmFsIG1ldGhfY2FsbGJhY2tfd2l0aF9hcml0eSA6IGludCAtPiAoJ2IgLT4gJ2EpIC0+ICgnYiwgJ2EpIG1ldGhfY2FsbGJhY2tcbiAgICAgID0gXCJjYW1sX2pzX3dyYXBfbWV0aF9jYWxsYmFja19zdHJpY3RcIlxuXG4gICAgZXh0ZXJuYWwgbWV0aF9jYWxsYmFja193aXRoX2FyZ3VtZW50cyA6XG4gICAgICAoJ2IgLT4gYW55X2pzX2FycmF5IC0+ICdhKSAtPiAoJ2IsIGFueV9qc19hcnJheSAtPiAnYSkgbWV0aF9jYWxsYmFja1xuICAgICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrX2FyZ3VtZW50c1wiXG5cbiAgICAoKiBERVBSRUNBVEVEICopXG4gICAgZXh0ZXJuYWwgdmFyaWFibGUgOiBzdHJpbmcgLT4gJ2EgPSBcImNhbWxfanNfdmFyXCJcbiAgZW5kXG5cbiAgKCoqKiopXG5cbiAgdHlwZSAnYSBvcHQgPSAnYVxuXG4gIHR5cGUgJ2Egb3B0ZGVmID0gJ2FcblxuICBleHRlcm5hbCBkZWJ1Z2dlciA6IHVuaXQgLT4gdW5pdCA9IFwiZGVidWdnZXJcIlxuXG4gIGxldCBudWxsIDogJ2Egb3B0ID0gVW5zYWZlLnB1cmVfanNfZXhwciBcIm51bGxcIlxuXG4gIGV4dGVybmFsIHNvbWUgOiAnYSAtPiAnYSBvcHQgPSBcIiVpZGVudGl0eVwiXG5cbiAgbGV0IHVuZGVmaW5lZCA6ICdhIG9wdGRlZiA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJ1bmRlZmluZWRcIlxuXG4gIGV4dGVybmFsIGRlZiA6ICdhIC0+ICdhIG9wdGRlZiA9IFwiJWlkZW50aXR5XCJcblxuICBtb2R1bGUgdHlwZSBPUFQgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBlbXB0eSA6ICdhIHRcblxuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG5cbiAgICB2YWwgbWFwIDogJ2EgdCAtPiAoJ2EgLT4gJ2IpIC0+ICdiIHRcblxuICAgIHZhbCBiaW5kIDogJ2EgdCAtPiAoJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuXG4gICAgdmFsIHRlc3QgOiAnYSB0IC0+IGJvb2xcblxuICAgIHZhbCBpdGVyIDogJ2EgdCAtPiAoJ2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICAgdmFsIGNhc2UgOiAnYSB0IC0+ICh1bml0IC0+ICdiKSAtPiAoJ2EgLT4gJ2IpIC0+ICdiXG5cbiAgICB2YWwgZ2V0IDogJ2EgdCAtPiAodW5pdCAtPiAnYSkgLT4gJ2FcblxuICAgIHZhbCBvcHRpb24gOiAnYSBvcHRpb24gLT4gJ2EgdFxuXG4gICAgdmFsIHRvX29wdGlvbiA6ICdhIHQgLT4gJ2Egb3B0aW9uXG4gIGVuZFxuXG4gIG1vZHVsZSBPcHQgOiBPUFQgd2l0aCB0eXBlICdhIHQgPSAnYSBvcHQgPSBzdHJ1Y3RcbiAgICB0eXBlICdhIHQgPSAnYSBvcHRcblxuICAgIGxldCBlbXB0eSA9IG51bGxcblxuICAgIGxldCByZXR1cm4gPSBzb21lXG5cbiAgICBsZXQgbWFwIHggZiA9IGlmIFVuc2FmZS5lcXVhbHMgeCBudWxsIHRoZW4gbnVsbCBlbHNlIHJldHVybiAoZiB4KVxuXG4gICAgbGV0IGJpbmQgeCBmID0gaWYgVW5zYWZlLmVxdWFscyB4IG51bGwgdGhlbiBudWxsIGVsc2UgZiB4XG5cbiAgICBsZXQgdGVzdCB4ID0gbm90IChVbnNhZmUuZXF1YWxzIHggbnVsbClcblxuICAgIGxldCBpdGVyIHggZiA9IGlmIG5vdCAoVW5zYWZlLmVxdWFscyB4IG51bGwpIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIFVuc2FmZS5lcXVhbHMgeCBudWxsIHRoZW4gZiAoKSBlbHNlIGcgeFxuXG4gICAgbGV0IGdldCB4IGYgPSBpZiBVbnNhZmUuZXF1YWxzIHggbnVsbCB0aGVuIGYgKCkgZWxzZSB4XG5cbiAgICBsZXQgb3B0aW9uIHggPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gZW1wdHlcbiAgICAgIHwgU29tZSB4IC0+IHJldHVybiB4XG5cbiAgICBsZXQgdG9fb3B0aW9uIHggPSBjYXNlIHggKGZ1biAoKSAtPiBOb25lKSAoZnVuIHggLT4gU29tZSB4KVxuICBlbmRcblxuICBtb2R1bGUgT3B0ZGVmIDogT1BUIHdpdGggdHlwZSAnYSB0ID0gJ2Egb3B0ZGVmID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gJ2Egb3B0ZGVmXG5cbiAgICBsZXQgZW1wdHkgPSB1bmRlZmluZWRcblxuICAgIGxldCByZXR1cm4gPSBkZWZcblxuICAgIGxldCBtYXAgeCBmID0gaWYgeCA9PSB1bmRlZmluZWQgdGhlbiB1bmRlZmluZWQgZWxzZSByZXR1cm4gKGYgeClcblxuICAgIGxldCBiaW5kIHggZiA9IGlmIHggPT0gdW5kZWZpbmVkIHRoZW4gdW5kZWZpbmVkIGVsc2UgZiB4XG5cbiAgICBsZXQgdGVzdCB4ID0geCAhPSB1bmRlZmluZWRcblxuICAgIGxldCBpdGVyIHggZiA9IGlmIHggIT0gdW5kZWZpbmVkIHRoZW4gZiB4XG5cbiAgICBsZXQgY2FzZSB4IGYgZyA9IGlmIHggPT0gdW5kZWZpbmVkIHRoZW4gZiAoKSBlbHNlIGcgeFxuXG4gICAgbGV0IGdldCB4IGYgPSBpZiB4ID09IHVuZGVmaW5lZCB0aGVuIGYgKCkgZWxzZSB4XG5cbiAgICBsZXQgb3B0aW9uIHggPVxuICAgICAgbWF0Y2ggeCB3aXRoXG4gICAgICB8IE5vbmUgLT4gZW1wdHlcbiAgICAgIHwgU29tZSB4IC0+IHJldHVybiB4XG5cbiAgICBsZXQgdG9fb3B0aW9uIHggPSBjYXNlIHggKGZ1biAoKSAtPiBOb25lKSAoZnVuIHggLT4gU29tZSB4KVxuICBlbmRcblxuICAoKioqKilcblxuICBsZXQgY29lcmNlIHggZiBnID0gT3B0LmdldCAoZiB4KSAoZnVuICgpIC0+IGcgeClcblxuICBsZXQgY29lcmNlX29wdCB4IGYgZyA9IE9wdC5nZXQgKE9wdC5iaW5kIHggZikgKGZ1biAoKSAtPiBnIHgpXG5cbiAgKCoqKiopXG5cbiAgdHlwZSArJ2EgbWV0aFxuXG4gIHR5cGUgKydhIGdlbl9wcm9wXG5cbiAgdHlwZSAnYSByZWFkb25seV9wcm9wID0gPCBnZXQgOiAnYSA+IGdlbl9wcm9wXG5cbiAgdHlwZSAnYSB3cml0ZW9ubHlfcHJvcCA9IDwgc2V0IDogJ2EgLT4gdW5pdCA+IGdlbl9wcm9wXG5cbiAgdHlwZSAnYSBwcm9wID0gPCBnZXQgOiAnYSA7IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgJ2Egb3B0ZGVmX3Byb3AgPSA8IGdldCA6ICdhIG9wdGRlZiA7IHNldCA6ICdhIC0+IHVuaXQgPiBnZW5fcHJvcFxuXG4gIHR5cGUgKydhIGNvbnN0clxuXG4gICgqKioqKVxuXG4gIHR5cGUgJ2EgY2FsbGJhY2sgPSAodW5pdCwgJ2EpIG1ldGhfY2FsbGJhY2tcblxuICBleHRlcm5hbCB3cmFwX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2MsICdhIC0+ICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9jYWxsYmFja1wiXG5cbiAgZXh0ZXJuYWwgd3JhcF9tZXRoX2NhbGxiYWNrIDogKCdhIC0+ICdiKSAtPiAoJ2EsICdiKSBtZXRoX2NhbGxiYWNrXG4gICAgPSBcImNhbWxfanNfd3JhcF9tZXRoX2NhbGxiYWNrXCJcblxuICAoKioqKilcblxuICBsZXQgX3RydWUgPSBVbnNhZmUucHVyZV9qc19leHByIFwidHJ1ZVwiXG5cbiAgbGV0IF9mYWxzZSA9IFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJmYWxzZVwiXG5cbiAgdHlwZSBtYXRjaF9yZXN1bHRfaGFuZGxlXG5cbiAgdHlwZSBzdHJpbmdfYXJyYXlcblxuICBjbGFzcyB0eXBlIGpzX3N0cmluZyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB2YWx1ZU9mIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgY2hhckF0IDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGNoYXJDb2RlQXQgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgICAoKiBUaGlzIG1heSByZXR1cm4gTmFOLi4uICopXG4gICAgICBtZXRob2QgY29uY2F0IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgY29uY2F0XzIgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBjb25jYXRfMyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGNvbmNhdF80IDpcbiAgICAgICAganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgaW5kZXhPZiA6IGpzX3N0cmluZyB0IC0+IGludCBtZXRoXG5cbiAgICAgIG1ldGhvZCBpbmRleE9mX2Zyb20gOiBqc19zdHJpbmcgdCAtPiBpbnQgLT4gaW50IG1ldGhcblxuICAgICAgbWV0aG9kIGxhc3RJbmRleE9mIDoganNfc3RyaW5nIHQgLT4gaW50IG1ldGhcblxuICAgICAgbWV0aG9kIGxhc3RJbmRleE9mX2Zyb20gOiBqc19zdHJpbmcgdCAtPiBpbnQgLT4gaW50IG1ldGhcblxuICAgICAgbWV0aG9kIGxvY2FsZUNvbXBhcmUgOiBqc19zdHJpbmcgdCAtPiBmbG9hdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBfbWF0Y2ggOiByZWdFeHAgdCAtPiBtYXRjaF9yZXN1bHRfaGFuZGxlIHQgb3B0IG1ldGhcblxuICAgICAgbWV0aG9kIG5vcm1hbGl6ZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIG5vcm1hbGl6ZV9mb3JtIDogbm9ybWFsaXphdGlvbiB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHJlcGxhY2UgOiByZWdFeHAgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCByZXBsYWNlX3N0cmluZyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNlYXJjaCA6IHJlZ0V4cCB0IC0+IGludCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc2xpY2VfZW5kIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNwbGl0IDoganNfc3RyaW5nIHQgLT4gc3RyaW5nX2FycmF5IHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3BsaXRfbGltaXRlZCA6IGpzX3N0cmluZyB0IC0+IGludCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzcGxpdF9yZWdFeHAgOiByZWdFeHAgdCAtPiBzdHJpbmdfYXJyYXkgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCBzcGxpdF9yZWdFeHBMaW1pdGVkIDogcmVnRXhwIHQgLT4gaW50IC0+IHN0cmluZ19hcnJheSB0IG1ldGhcblxuICAgICAgbWV0aG9kIHN1YnN0cmluZyA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2Qgc3Vic3RyaW5nX3RvRW5kIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRvTG93ZXJDYXNlIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdG9Mb2NhbGVMb3dlckNhc2UgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0b1VwcGVyQ2FzZSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHRvTG9jYWxlVXBwZXJDYXNlIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgICBtZXRob2QgdHJpbSA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gICAgZW5kXG5cbiAgYW5kIHJlZ0V4cCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgZXhlYyA6IGpzX3N0cmluZyB0IC0+IG1hdGNoX3Jlc3VsdF9oYW5kbGUgdCBvcHQgbWV0aFxuXG4gICAgICBtZXRob2QgdGVzdCA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgICAgbWV0aG9kIHNvdXJjZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGdsb2JhbCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBpZ25vcmVDYXNlIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG11bHRpbGluZSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBsYXN0SW5kZXggOiBpbnQgcHJvcFxuICAgIGVuZFxuXG4gIGFuZCBub3JtYWxpemF0aW9uID0ganNfc3RyaW5nXG5cbiAgKCogc3RyaW5nIGlzIHVzZWQgYnkgcHB4X2pzLCBpdCBuZWVkcyB0byBjb21lIGJlZm9yZSBhbnkgdXNlIG9mIHRoZVxuICAgICBuZXcgc3ludGF4IGluIHRoaXMgZmlsZSAqKVxuICBleHRlcm5hbCBzdHJpbmcgOiBzdHJpbmcgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNzdHJpbmdfb2Zfc3RyaW5nXCJcblxuICBleHRlcm5hbCB0b19zdHJpbmcgOiBqc19zdHJpbmcgdCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2pzc3RyaW5nXCJcblxuICBsZXQgbmZjID0gc3RyaW5nIFwiTkZDXCJcblxuICBsZXQgbmZkID0gc3RyaW5nIFwiTkZEXCJcblxuICBsZXQgbmZrYyA9IHN0cmluZyBcIk5GS0NcIlxuXG4gIGxldCBuZmtkID0gc3RyaW5nIFwiTkZLRFwiXG5lbmRcblxuaW5jbHVkZSBKc1xuXG5jbGFzcyB0eXBlIHN0cmluZ19jb25zdHIgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZnJvbUNoYXJDb2RlIDogaW50IC0+IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmxldCBzdHJpbmdfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9TdHJpbmdcblxubGV0IHJlZ0V4cCA9IFVuc2FmZS5nbG9iYWwjIy5fUmVnRXhwXG5cbmxldCByZWdFeHBfY29weSA9IHJlZ0V4cFxuXG5sZXQgcmVnRXhwX3dpdGhGbGFncyA9IHJlZ0V4cFxuXG5jbGFzcyB0eXBlIFsnYV0ganNfYXJyYXkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgY29uY2F0IDogJ2EganNfYXJyYXkgdCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBqb2luIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHBvcCA6ICdhIG9wdGRlZiBtZXRoXG5cbiAgICBtZXRob2QgcHVzaCA6ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgcHVzaF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBwdXNoXzMgOiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHB1c2hfNCA6ICdhIC0+ICdhIC0+ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgcmV2ZXJzZSA6ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNoaWZ0IDogJ2Egb3B0ZGVmIG1ldGhcblxuICAgIG1ldGhvZCBzbGljZSA6IGludCAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2VfZW5kIDogaW50IC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNvcnQgOiAoJ2EgLT4gJ2EgLT4gZmxvYXQpIGNhbGxiYWNrIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNvcnRfYXNTdHJpbmdzIDogJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaWNlIDogaW50IC0+IGludCAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpY2VfMSA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc3BsaWNlXzIgOiBpbnQgLT4gaW50IC0+ICdhIC0+ICdhIC0+ICdhIGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNwbGljZV8zIDogaW50IC0+IGludCAtPiAnYSAtPiAnYSAtPiAnYSAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBzcGxpY2VfNCA6IGludCAtPiBpbnQgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EgLT4gJ2EganNfYXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2QgdW5zaGlmdCA6ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgdW5zaGlmdF8yIDogJ2EgLT4gJ2EgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCB1bnNoaWZ0XzMgOiAnYSAtPiAnYSAtPiAnYSAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc2hpZnRfNCA6ICdhIC0+ICdhIC0+ICdhIC0+ICdhIC0+IGludCBtZXRoXG5cbiAgICBtZXRob2Qgc29tZSA6ICgnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiBib29sIHQpIGNhbGxiYWNrIC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZXZlcnkgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gYm9vbCB0KSBjYWxsYmFjayAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGZvckVhY2ggOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gdW5pdCkgY2FsbGJhY2sgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbWFwIDogKCdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdiKSBjYWxsYmFjayAtPiAnYiBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBmaWx0ZXIgOiAoJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gYm9vbCB0KSBjYWxsYmFjayAtPiAnYSBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCByZWR1Y2VfaW5pdCA6XG4gICAgICAoJ2IgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiIC0+ICdiIG1ldGhcblxuICAgIG1ldGhvZCByZWR1Y2UgOiAoJ2EgLT4gJ2EgLT4gaW50IC0+ICdhIGpzX2FycmF5IHQgLT4gJ2EpIGNhbGxiYWNrIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCByZWR1Y2VSaWdodF9pbml0IDpcbiAgICAgICgnYiAtPiAnYSAtPiBpbnQgLT4gJ2EganNfYXJyYXkgdCAtPiAnYikgY2FsbGJhY2sgLT4gJ2IgLT4gJ2IgbWV0aFxuXG4gICAgbWV0aG9kIHJlZHVjZVJpZ2h0IDogKCdhIC0+ICdhIC0+IGludCAtPiAnYSBqc19hcnJheSB0IC0+ICdhKSBjYWxsYmFjayAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHByb3BcbiAgZW5kXG5cbmxldCBvYmplY3RfY29uc3RydWN0b3IgPSBVbnNhZmUuZ2xvYmFsIyMuX09iamVjdFxuXG5sZXQgb2JqZWN0X2tleXMgbyA6IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgPSBvYmplY3RfY29uc3RydWN0b3IjI2tleXMgb1xuXG5sZXQgYXJyYXlfY29uc3RydWN0b3IgPSBVbnNhZmUuZ2xvYmFsIyMuX0FycmF5XG5cbmxldCBhcnJheV9lbXB0eSA9IGFycmF5X2NvbnN0cnVjdG9yXG5cbmxldCBhcnJheV9sZW5ndGggPSBhcnJheV9jb25zdHJ1Y3RvclxuXG5sZXQgYXJyYXlfZ2V0IDogJ2EgI2pzX2FycmF5IHQgLT4gaW50IC0+ICdhIG9wdGRlZiA9IFVuc2FmZS5nZXRcblxubGV0IGFycmF5X3NldCA6ICdhICNqc19hcnJheSB0IC0+IGludCAtPiAnYSAtPiB1bml0ID0gVW5zYWZlLnNldFxuXG5sZXQgYXJyYXlfbWFwX3BvbHkgOlxuICAgICdhICNqc19hcnJheSB0IC0+ICgnYSAtPiBpbnQgLT4gJ2EgI2pzX2FycmF5IHQgLT4gJ2IpIGNhbGxiYWNrIC0+ICdiICNqc19hcnJheSB0ID1cbiBmdW4gYSBjYiAtPiAoVW5zYWZlLmNvZXJjZSBhKSMjbWFwIGNiXG5cbmxldCBhcnJheV9tYXAgZiBhID0gYXJyYXlfbWFwX3BvbHkgYSAod3JhcF9jYWxsYmFjayAoZnVuIHggX2lkeCBfIC0+IGYgeCkpXG5cbmxldCBhcnJheV9tYXBpIGYgYSA9IGFycmF5X21hcF9wb2x5IGEgKHdyYXBfY2FsbGJhY2sgKGZ1biB4IGlkeCBfIC0+IGYgaWR4IHgpKVxuXG5jbGFzcyB0eXBlIG1hdGNoX3Jlc3VsdCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgW2pzX3N0cmluZyB0XSBqc19hcnJheVxuXG4gICAgbWV0aG9kIGluZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbnB1dCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBzdHJfYXJyYXkgOiBzdHJpbmdfYXJyYXkgdCAtPiBqc19zdHJpbmcgdCBqc19hcnJheSB0ID0gVW5zYWZlLmNvZXJjZVxuXG5sZXQgbWF0Y2hfcmVzdWx0IDogbWF0Y2hfcmVzdWx0X2hhbmRsZSB0IC0+IG1hdGNoX3Jlc3VsdCB0ID0gVW5zYWZlLmNvZXJjZVxuXG5jbGFzcyB0eXBlIG51bWJlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1N0cmluZ19yYWRpeCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9GaXhlZCA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9FeHBvbmVudGlhbCA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b0V4cG9uZW50aWFsX2RpZ2l0cyA6IGludCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9QcmVjaXNpb24gOiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuZXh0ZXJuYWwgbnVtYmVyX29mX2Zsb2F0IDogZmxvYXQgLT4gbnVtYmVyIHQgPSBcImNhbWxfanNfZnJvbV9mbG9hdFwiXG5cbmV4dGVybmFsIGZsb2F0X29mX251bWJlciA6IG51bWJlciB0IC0+IGZsb2F0ID0gXCJjYW1sX2pzX3RvX2Zsb2F0XCJcblxuY2xhc3MgdHlwZSBkYXRlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvRGF0ZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB0b1RpbWVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVTdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9Mb2NhbGVEYXRlU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvTG9jYWxlVGltZVN0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCB2YWx1ZU9mIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFRpbWUgOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RnVsbFllYXIgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ0Z1bGxZZWFyIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRNb250aCA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDTW9udGggOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldERhdGUgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ0RhdGUgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldERheSA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDRGF5IDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRIb3VycyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDSG91cnMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldE1pbnV0ZXMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ01pbnV0ZXMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNlY29uZHMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVUQ1NlY29uZHMgOiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldE1pbGxpc2Vjb25kcyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VVRDTWlsbGlzZWNvbmRzIDogaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRUaW1lem9uZU9mZnNldCA6IGludCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VGltZSA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRGdWxsWWVhciA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDRnVsbFllYXIgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldE1vbnRoIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENNb250aCA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RGF0ZSA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDRGF0ZSA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RGF5IDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENEYXkgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEhvdXJzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENIb3VycyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0TWludXRlcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDTWludXRlcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U2Vjb25kcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VVRDU2Vjb25kcyA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0TWlsbGlzZWNvbmRzIDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVVENNaWxsaXNlY29uZHMgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHRvVVRDU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvSVNPU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvSlNPTiA6ICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZGF0ZV9jb25zdHIgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19tb250aCA6IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfZGF5IDogaW50IC0+IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgX1VUQ19ob3VyIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBfVVRDX21pbiA6IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfc2VjIDogaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIF9VVENfbXMgOiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG5vdyA6IGZsb2F0IG1ldGhcbiAgZW5kXG5cbmxldCBkYXRlX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fRGF0ZVxuXG5sZXQgZGF0ZSA6IGRhdGVfY29uc3RyIHQgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9ub3cgOiBkYXRlIHQgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfZnJvbVRpbWVWYWx1ZSA6IChmbG9hdCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX21vbnRoIDogKGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9kYXkgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gZGF0ZSB0KSBjb25zdHIgPSBkYXRlX2NvbnN0clxuXG5sZXQgZGF0ZV9ob3VyIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBkYXRlIHQpIGNvbnN0ciA9IGRhdGVfY29uc3RyXG5cbmxldCBkYXRlX21pbiA6IChpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfc2VjIDogKGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID0gZGF0ZV9jb25zdHJcblxubGV0IGRhdGVfbXMgOiAoaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGRhdGUgdCkgY29uc3RyID1cbiAgZGF0ZV9jb25zdHJcblxuY2xhc3MgdHlwZSBtYXRoID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF9FIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MTjIgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xOMTAgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xPRzJFIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MT0cxMEUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BJIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TUVJUMV8yXyA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1FSVDIgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWJzIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGFjb3MgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgYXNpbiA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGF0YW4yIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGNlaWwgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgY29zIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGV4cCA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBmbG9vciA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBsb2cgOiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgbWF4IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1heF8zIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1heF80IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIG1pbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtaW5fMyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBtaW5fNCA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBwb3cgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgcmFuZG9tIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHJvdW5kIDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNpbiA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHRhbiA6IGZsb2F0IC0+IGZsb2F0IG1ldGhcbiAgZW5kXG5cbmxldCBtYXRoID0gVW5zYWZlLmdsb2JhbCMjLl9NYXRoXG5cbmNsYXNzIHR5cGUgZXJyb3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtZXNzYWdlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0YWNrIDoganNfc3RyaW5nIHQgb3B0ZGVmIHByb3BcblxuICAgIG1ldGhvZCB0b1N0cmluZyA6IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmxldCBlcnJvcl9jb25zdHIgPSBVbnNhZmUuZ2xvYmFsIyMuX0Vycm9yXG5cbm1vZHVsZSBKc19lcnJvciA9IHN0cnVjdFxuICB0eXBlIGVycm9yX3QgPSBlcnJvciB0XG5cbiAgaW5jbHVkZSBKc29vX3J1bnRpbWUuRXJyb3JcblxuICBleHRlcm5hbCBvZl9lcnJvciA6IGVycm9yX3QgLT4gdCA9IFwiJWlkZW50aXR5XCJcblxuICBleHRlcm5hbCB0b19lcnJvciA6IHQgLT4gZXJyb3JfdCA9IFwiJWlkZW50aXR5XCJcblxuICBsZXQgbmFtZSBlID0gdG9fc3RyaW5nICh0b19lcnJvciBlKSMjLm5hbWVcblxuICBsZXQgbWVzc2FnZSBlID0gdG9fc3RyaW5nICh0b19lcnJvciBlKSMjLm1lc3NhZ2VcblxuICBsZXQgc3RhY2sgKGUgOiB0KSA6IHN0cmluZyBvcHRpb24gPVxuICAgIE9wdC50b19vcHRpb24gKE9wdC5tYXAgKHRvX2Vycm9yIGUpIyMuc3RhY2sgdG9fc3RyaW5nKVxuXG4gIGxldCB0b19zdHJpbmcgZSA9IHRvX3N0cmluZyAodG9fZXJyb3IgZSkjI3RvU3RyaW5nXG5lbmRcblxubW9kdWxlIE1hZ2ljID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFQgPSBzaWdcbiAgICBleGNlcHRpb24gRXJyb3Igb2YgZXJyb3IgdFxuICBlbmRcblxuICB0eXBlICgnYSwgJ2IpIGVxID0gRXEgOiAoJ2EsICdhKSBlcVxuXG4gIGxldCAoZXEgOiAoZXJyb3IgdCwgSnNfZXJyb3IudCkgZXEpID0gT2JqLm1hZ2ljIEVxXG5cbiAgbGV0IG0gPVxuICAgIG1hdGNoIGVxIHdpdGhcbiAgICB8IEVxIC0+XG4gICAgICAgIChtb2R1bGUgc3RydWN0XG4gICAgICAgICAgZXhjZXB0aW9uIEVycm9yID0gSnNfZXJyb3IuRXhuXG4gICAgICAgIGVuZCA6IFQpXG5cbiAgbW9kdWxlIEVycm9yID0gKHZhbCBtIDogVClcbmVuZFxuXG5pbmNsdWRlIE1hZ2ljLkVycm9yXG5cbmxldCByYWlzZV9qc19lcnJvciBlID0gSnNfZXJyb3IucmFpc2VfIChKc19lcnJvci5vZl9lcnJvciBlKVxuXG5sZXQgc3RyaW5nX29mX2Vycm9yIGUgPSBKc19lcnJvci50b19zdHJpbmcgKEpzX2Vycm9yLm9mX2Vycm9yIGUpXG5cbmxldCBleG5fd2l0aF9qc19iYWNrdHJhY2UgPSBKc19lcnJvci5hdHRhY2hfanNfYmFja3RyYWNlXG5cbmV4dGVybmFsIGpzX2Vycm9yX29mX2V4biA6IGV4biAtPiBlcnJvciB0IG9wdCA9IFwiY2FtbF9qc19lcnJvcl9vZl9leGNlcHRpb25cIlxuXG5jbGFzcyB0eXBlIGpzb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgcGFyc2UgOiBqc19zdHJpbmcgdCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2Qgc3RyaW5naWZ5IDogJ2EgLT4ganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxubGV0IF9KU09OIDoganNvbiB0ID0gVW5zYWZlLmdsb2JhbCMjLl9KU09OXG5cbmxldCBkZWNvZGVVUkkgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZGVjb2RlVVJJIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZGVjb2RlVVJJQ29tcG9uZW50IChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmRlY29kZVVSSUNvbXBvbmVudCBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IGVuY29kZVVSSSAocyA6IGpzX3N0cmluZyB0KSA6IGpzX3N0cmluZyB0ID1cbiAgVW5zYWZlLmZ1bl9jYWxsIFVuc2FmZS5nbG9iYWwjIy5lbmNvZGVVUkkgW3wgVW5zYWZlLmluamVjdCBzIHxdXG5cbmxldCBlbmNvZGVVUklDb21wb25lbnQgKHMgOiBqc19zdHJpbmcgdCkgOiBqc19zdHJpbmcgdCA9XG4gIFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuZW5jb2RlVVJJQ29tcG9uZW50IFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5sZXQgZXNjYXBlIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLmVzY2FwZSBbfCBVbnNhZmUuaW5qZWN0IHMgfF1cblxubGV0IHVuZXNjYXBlIChzIDoganNfc3RyaW5nIHQpIDoganNfc3RyaW5nIHQgPVxuICBVbnNhZmUuZnVuX2NhbGwgVW5zYWZlLmdsb2JhbCMjLnVuZXNjYXBlIFt8IFVuc2FmZS5pbmplY3QgcyB8XVxuXG5leHRlcm5hbCBib29sIDogYm9vbCAtPiBib29sIHQgPSBcImNhbWxfanNfZnJvbV9ib29sXCJcblxuZXh0ZXJuYWwgdG9fYm9vbCA6IGJvb2wgdCAtPiBib29sID0gXCJjYW1sX2pzX3RvX2Jvb2xcIlxuXG5leHRlcm5hbCBhcnJheSA6ICdhIGFycmF5IC0+ICdhIGpzX2FycmF5IHQgPSBcImNhbWxfanNfZnJvbV9hcnJheVwiXG5cbmV4dGVybmFsIHRvX2FycmF5IDogJ2EganNfYXJyYXkgdCAtPiAnYSBhcnJheSA9IFwiY2FtbF9qc190b19hcnJheVwiXG5cbmV4dGVybmFsIGJ5dGVzdHJpbmcgOiBzdHJpbmcgLT4ganNfc3RyaW5nIHQgPSBcImNhbWxfanNieXRlc19vZl9zdHJpbmdcIlxuXG5leHRlcm5hbCB0b19ieXRlc3RyaW5nIDoganNfc3RyaW5nIHQgLT4gc3RyaW5nID0gXCJjYW1sX3N0cmluZ19vZl9qc2J5dGVzXCJcblxuZXh0ZXJuYWwgdHlwZW9mIDogXyB0IC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzX3R5cGVvZlwiXG5cbmV4dGVybmFsIGluc3RhbmNlb2YgOiBfIHQgLT4gXyBjb25zdHIgLT4gYm9vbCA9IFwiY2FtbF9qc19pbnN0YW5jZW9mXCJcblxubGV0IGlzTmFOIChpIDogJ2EpIDogYm9vbCA9XG4gIHRvX2Jvb2wgKFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMuaXNOYU4gW3wgVW5zYWZlLmluamVjdCBpIHxdKVxuXG5sZXQgcGFyc2VJbnQgKHMgOiBqc19zdHJpbmcgdCkgOiBpbnQgPVxuICBsZXQgcyA9IFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMucGFyc2VJbnQgW3wgVW5zYWZlLmluamVjdCBzIHxdIGluXG4gIGlmIGlzTmFOIHMgdGhlbiBmYWlsd2l0aCBcInBhcnNlSW50XCIgZWxzZSBzXG5cbmxldCBwYXJzZUZsb2F0IChzIDoganNfc3RyaW5nIHQpIDogZmxvYXQgPVxuICBsZXQgcyA9IFVuc2FmZS5mdW5fY2FsbCBVbnNhZmUuZ2xvYmFsIyMucGFyc2VGbG9hdCBbfCBVbnNhZmUuaW5qZWN0IHMgfF0gaW5cbiAgaWYgaXNOYU4gcyB0aGVuIGZhaWx3aXRoIFwicGFyc2VGbG9hdFwiIGVsc2Ugc1xuXG5sZXQgXyA9XG4gIFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgKGZ1bmN0aW9uXG4gICAgICB8IEpzX2Vycm9yLkV4biBlIC0+IFNvbWUgKEpzX2Vycm9yLnRvX3N0cmluZyBlKVxuICAgICAgfCBfIC0+IE5vbmUpXG5cbmxldCBfID1cbiAgUHJpbnRleGMucmVnaXN0ZXJfcHJpbnRlciAoZnVuIGUgLT5cbiAgICAgIGxldCBlIDogPCAuLiA+IHQgPSBPYmoubWFnaWMgZSBpblxuICAgICAgaWYgaW5zdGFuY2VvZiBlIGFycmF5X2NvbnN0cnVjdG9yIHRoZW4gTm9uZSBlbHNlIFNvbWUgKHRvX3N0cmluZyBlIyN0b1N0cmluZykpXG5cbmxldCBleHBvcnRfanMgKGZpZWxkIDoganNfc3RyaW5nIHQpIHggPVxuICBVbnNhZmUuc2V0XG4gICAgKFVuc2FmZS5wdXJlX2pzX2V4cHIgXCJqc29vX2V4cG9ydHNcIilcbiAgICBmaWVsZFxuICAgIChpZiBTdHJpbmcuZXF1YWwgKEpzLnRvX3N0cmluZyAodHlwZW9mIChPYmoubWFnaWMgeCkpKSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKCogZnVuY3Rpb24gd2l0aCBhcml0eS9sZW5ndGggZXF1YWwgdG8gemVybyBhcmUgYWxyZWFkeSB3cmFwcGVkICopXG4gICAgICAgICYmIFVuc2FmZS5nZXQgKE9iai5tYWdpYyB4KSAoSnMuc3RyaW5nIFwibGVuZ3RoXCIpID4gMFxuICAgIHRoZW4gT2JqLm1hZ2ljICh3cmFwX2NhbGxiYWNrIChPYmoubWFnaWMgeCkpXG4gICAgZWxzZSB4KVxuXG5sZXQgZXhwb3J0IGZpZWxkIHggPSBleHBvcnRfanMgKHN0cmluZyBmaWVsZCkgeFxuXG5sZXQgZXhwb3J0X2FsbCBvYmogPVxuICBsZXQga2V5cyA9IG9iamVjdF9rZXlzIG9iaiBpblxuICBrZXlzIyNmb3JFYWNoXG4gICAgKHdyYXBfY2FsbGJhY2sgKGZ1biAoa2V5IDoganNfc3RyaW5nIHQpIF8gXyAtPiBleHBvcnRfanMga2V5IChVbnNhZmUuZ2V0IG9iaiBrZXkpKSlcblxuKCoqKiopXG5cbigqIERFUFJFQ0FURUQgKilcblxudHlwZSBmbG9hdF9wcm9wID0gZmxvYXQgcHJvcFxuXG5leHRlcm5hbCBmbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlaWRlbnRpdHlcIlxuXG5leHRlcm5hbCB0b19mbG9hdCA6IGZsb2F0IC0+IGZsb2F0ID0gXCIlaWRlbnRpdHlcIlxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIFsnbm9kZV0gbm9kZUxpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBsaXN0X29mX25vZGVMaXN0IChub2RlTGlzdCA6ICdhIG5vZGVMaXN0IHQpID1cbiAgbGV0IGxlbmd0aCA9IG5vZGVMaXN0IyMubGVuZ3RoIGluXG4gIGxldCByZWMgYWRkX2l0ZW0gYWNjIGkgPVxuICAgIGlmIGkgPCBsZW5ndGhcbiAgICB0aGVuXG4gICAgICBtYXRjaCBPcHQudG9fb3B0aW9uIChub2RlTGlzdCMjaXRlbSBpKSB3aXRoXG4gICAgICB8IE5vbmUgLT4gYWRkX2l0ZW0gYWNjIChpICsgMSlcbiAgICAgIHwgU29tZSBlIC0+IGFkZF9pdGVtIChlIDo6IGFjYykgKGkgKyAxKVxuICAgIGVsc2UgTGlzdC5yZXYgYWNjXG4gIGluXG4gIGFkZF9pdGVtIFtdIDBcblxudHlwZSBub2RlVHlwZSA9XG4gIHwgT1RIRVJcbiAgKCogV2lsbCBub3QgaGFwcGVuICopXG4gIHwgRUxFTUVOVFxuICB8IEFUVFJJQlVURVxuICB8IFRFWFRcbiAgfCBDREFUQV9TRUNUSU9OXG4gIHwgRU5USVRZX1JFRkVSRU5DRVxuICB8IEVOVElUWVxuICB8IFBST0NFU1NJTkdfSU5TVFJVQ1RJT05cbiAgfCBDT01NRU5UXG4gIHwgRE9DVU1FTlRcbiAgfCBET0NVTUVOVF9UWVBFXG4gIHwgRE9DVU1FTlRfRlJBR01FTlRcbiAgfCBOT1RBVElPTlxuXG5tb2R1bGUgRG9jdW1lbnRQb3NpdGlvbiA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnRcblxuICB0eXBlIG1hc2sgPSBpbnRcblxuICBsZXQgZGlzY29ubmVjdGVkID0gMHgwMVxuXG4gIGxldCBwcmVjZWRpbmcgPSAweDAyXG5cbiAgbGV0IGZvbGxvd2luZyA9IDB4MDRcblxuICBsZXQgY29udGFpbnMgPSAweDA4XG5cbiAgbGV0IGNvbnRhaW5lZF9ieSA9IDB4MTBcblxuICBsZXQgaW1wbGVtZW50YXRpb25fc3BlY2lmaWMgPSAweDIwXG5cbiAgbGV0IGhhcyB0IG1hc2sgPSB0IGxhbmQgbWFzayA9IG1hc2tcblxuICBsZXQgYWRkIHggeSA9IHggbG9yIHlcblxuICBsZXQgKCArICkgPSBhZGRcbmVuZFxuXG5jbGFzcyB0eXBlIG5vZGUgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgbm9kZU5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgbm9kZVZhbHVlIDoganNfc3RyaW5nIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBub2RlVHlwZSA6IG5vZGVUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXJlbnROb2RlIDogbm9kZSB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgY2hpbGROb2RlcyA6IG5vZGUgbm9kZUxpc3QgdCBwcm9wXG5cbiAgICBtZXRob2QgZmlyc3RDaGlsZCA6IG5vZGUgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RDaGlsZCA6IG5vZGUgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIHByZXZpb3VzU2libGluZyA6IG5vZGUgdCBvcHQgcHJvcFxuXG4gICAgbWV0aG9kIG5leHRTaWJsaW5nIDogbm9kZSB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZXNwYWNlVVJJIDoganNfc3RyaW5nIHQgb3B0IHByb3BcblxuICAgIG1ldGhvZCBpbnNlcnRCZWZvcmUgOiBub2RlIHQgLT4gbm9kZSB0IG9wdCAtPiBub2RlIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2VDaGlsZCA6IG5vZGUgdCAtPiBub2RlIHQgLT4gbm9kZSB0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVDaGlsZCA6IG5vZGUgdCAtPiBub2RlIHQgbWV0aFxuXG4gICAgbWV0aG9kIGFwcGVuZENoaWxkIDogbm9kZSB0IC0+IG5vZGUgdCBtZXRoXG5cbiAgICBtZXRob2QgaGFzQ2hpbGROb2RlcyA6IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvbmVOb2RlIDogYm9vbCB0IC0+IG5vZGUgdCBtZXRoXG5cbiAgICBtZXRob2QgY29tcGFyZURvY3VtZW50UG9zaXRpb24gOiBub2RlIHQgLT4gRG9jdW1lbnRQb3NpdGlvbi50IG1ldGhcblxuICAgIG1ldGhvZCBsb29rdXBOYW1lc3BhY2VVUkkgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGxvb2t1cFByZWZpeCA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG4gIGVuZFxuXG5sZXQgYXBwZW5kQ2hpbGQgKHAgOiAjbm9kZSB0KSAobiA6ICNub2RlIHQpID0gaWdub3JlIChwIyNhcHBlbmRDaGlsZCAobiA6PiBub2RlIHQpKVxuXG5sZXQgcmVtb3ZlQ2hpbGQgKHAgOiAjbm9kZSB0KSAobiA6ICNub2RlIHQpID0gaWdub3JlIChwIyNyZW1vdmVDaGlsZCAobiA6PiBub2RlIHQpKVxuXG5sZXQgcmVwbGFjZUNoaWxkIChwIDogI25vZGUgdCkgKG4gOiAjbm9kZSB0KSAobyA6ICNub2RlIHQpID1cbiAgaWdub3JlIChwIyNyZXBsYWNlQ2hpbGQgKG4gOj4gbm9kZSB0KSAobyA6PiBub2RlIHQpKVxuXG5sZXQgaW5zZXJ0QmVmb3JlIChwIDogI25vZGUgdCkgKG4gOiAjbm9kZSB0KSAobyA6ICNub2RlIHQgb3B0KSA9XG4gIGlnbm9yZSAocCMjaW5zZXJ0QmVmb3JlIChuIDo+IG5vZGUgdCkgKG8gOj4gbm9kZSB0IG9wdCkpXG5cbigqKiBTcGVjaWZpY2F0aW9uIG9mIFtBdHRyXSBvYmplY3RzLiAqKVxuY2xhc3MgdHlwZSBhdHRyID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBub2RlXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzcGVjaWZpZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG93bmVyRWxlbWVudCA6IGVsZW1lbnQgdCBwcm9wXG4gIGVuZFxuXG4oKiogU3BlY2lmaWNhdGlvbiBvZiBbTmFtZWROb2RlTWFwXSBvYmplY3RzLiAqKVxuYW5kIFsnbm9kZV0gbmFtZWROb2RlTWFwID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGdldE5hbWVkSXRlbSA6IGpzX3N0cmluZyB0IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzZXROYW1lZEl0ZW0gOiAnbm9kZSB0IC0+ICdub2RlIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVOYW1lZEl0ZW0gOiBqc19zdHJpbmcgdCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiAnbm9kZSB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqKiBTcGVjaWZpY2F0aW9uIG9mIFtFbGVtZW50XSBvYmplY3RzLiAqKVxuYW5kIGVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG5vZGVcblxuICAgIG1ldGhvZCB0YWdOYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldEF0dHJpYnV0ZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0QXR0cmlidXRlIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlQXR0cmlidXRlIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaGFzQXR0cmlidXRlIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBdHRyaWJ1dGVOUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0QXR0cmlidXRlTlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVBdHRyaWJ1dGVOUyA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGhhc0F0dHJpYnV0ZU5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBdHRyaWJ1dGVOb2RlIDoganNfc3RyaW5nIHQgLT4gYXR0ciB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0QXR0cmlidXRlTm9kZSA6IGF0dHIgdCAtPiBhdHRyIHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVBdHRyaWJ1dGVOb2RlIDogYXR0ciB0IC0+IGF0dHIgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QXR0cmlidXRlTm9kZU5TIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gYXR0ciB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0QXR0cmlidXRlTm9kZU5TIDogYXR0ciB0IC0+IGF0dHIgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRzQnlUYWdOYW1lIDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCBub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVzIDogYXR0ciBuYW1lZE5vZGVNYXAgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGNoYXJhY3RlckRhdGEgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG5vZGVcblxuICAgIG1ldGhvZCBkYXRhIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3VianNfc3RyaW5nRGF0YSA6IGludCAtPiBpbnQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGFwcGVuZERhdGEgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbnNlcnREYXRhIDogaW50IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZURhdGEgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcGxhY2VEYXRhIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgY29tbWVudCA9IGNoYXJhY3RlckRhdGFcblxuY2xhc3MgdHlwZSB0ZXh0ID0gY2hhcmFjdGVyRGF0YVxuXG5jbGFzcyB0eXBlIGRvY3VtZW50RnJhZ21lbnQgPSBub2RlXG5cbmNsYXNzIHR5cGUgWydlbGVtZW50XSBkb2N1bWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbm9kZVxuXG4gICAgbWV0aG9kIGRvY3VtZW50RWxlbWVudCA6ICdlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQgOiBkb2N1bWVudEZyYWdtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUVsZW1lbnQgOiBqc19zdHJpbmcgdCAtPiAnZWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVFbGVtZW50TlMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiAnZWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVUZXh0Tm9kZSA6IGpzX3N0cmluZyB0IC0+IHRleHQgdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlQXR0cmlidXRlIDoganNfc3RyaW5nIHQgLT4gYXR0ciB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVDb21tZW50IDoganNfc3RyaW5nIHQgLT4gY29tbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50QnlJZCA6IGpzX3N0cmluZyB0IC0+ICdlbGVtZW50IHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50c0J5VGFnTmFtZSA6IGpzX3N0cmluZyB0IC0+ICdlbGVtZW50IG5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGltcG9ydE5vZGUgOiBlbGVtZW50IHQgLT4gYm9vbCB0IC0+ICdlbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGFkb3B0Tm9kZSA6IGVsZW1lbnQgdCAtPiAnZWxlbWVudCB0IG1ldGhcbiAgZW5kXG5cbnR5cGUgbm9kZV90eXBlID1cbiAgfCBFbGVtZW50IG9mIGVsZW1lbnQgdFxuICB8IEF0dHIgb2YgYXR0ciB0XG4gIHwgVGV4dCBvZiB0ZXh0IHRcbiAgfCBPdGhlciBvZiBub2RlIHRcblxubGV0IG5vZGVUeXBlIGUgPVxuICBtYXRjaCBlIyMubm9kZVR5cGUgd2l0aFxuICB8IEVMRU1FTlQgLT4gRWxlbWVudCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICB8IEFUVFJJQlVURSAtPiBBdHRyIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gIHwgQ0RBVEFfU0VDVElPTiB8IFRFWFQgLT4gVGV4dCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICB8IF8gLT4gT3RoZXIgKGUgOj4gbm9kZSB0KVxuXG5tb2R1bGUgQ29lcmNlVG8gPSBzdHJ1Y3RcbiAgbGV0IGNhc3QgKGUgOiAjbm9kZSBKcy50KSB0ID1cbiAgICBpZiBlIyMubm9kZVR5cGUgPT0gdCB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSkgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGVsZW1lbnQgZSA6IGVsZW1lbnQgSnMudCBKcy5vcHQgPSBjYXN0IGUgRUxFTUVOVFxuXG4gIGxldCB0ZXh0IGUgOiB0ZXh0IEpzLnQgSnMub3B0ID1cbiAgICBpZiBlIyMubm9kZVR5cGUgPT0gVEVYVCB8fCBlIyMubm9kZVR5cGUgPT0gQ0RBVEFfU0VDVElPTlxuICAgIHRoZW4gSnMuc29tZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBhdHRyIGUgOiBhdHRyIEpzLnQgSnMub3B0ID0gY2FzdCBlIEFUVFJJQlVURVxuZW5kXG5cbnR5cGUgKCdhLCAnYikgZXZlbnRfbGlzdGVuZXIgPSAoJ2EsICdiIC0+IGJvb2wgdCkgbWV0aF9jYWxsYmFjayBvcHRcbigqKiBUaGUgdHlwZSBvZiBldmVudCBsaXN0ZW5lciBmdW5jdGlvbnMuICBUaGUgZmlyc3QgdHlwZSBwYXJhbWV0ZXJcbiAgICAgIFsnYV0gaXMgdGhlIHR5cGUgb2YgdGhlIHRhcmdldCBvYmplY3Q7IHRoZSBzZWNvbmQgcGFyYW1ldGVyXG4gICAgICBbJ2JdIGlzIHRoZSB0eXBlIG9mIHRoZSBldmVudCBvYmplY3QuICopXG5cbmNsYXNzIHR5cGUgWydhXSBldmVudCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiAnYSB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFRhcmdldCA6ICdhIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgICgqIExlZ2FjeSBtZXRob2RzICopXG4gICAgbWV0aG9kIHNyY0VsZW1lbnQgOiAnYSB0IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIFsnYSwgJ2JdIGN1c3RvbUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbJ2FdIGV2ZW50XG5cbiAgICBtZXRob2QgZGV0YWlsIDogJ2IgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBub19oYW5kbGVyIDogKCdhLCAnYikgZXZlbnRfbGlzdGVuZXIgPSBKcy5udWxsXG5cbmxldCB3aW5kb3dfZXZlbnQgKCkgOiAnYSAjZXZlbnQgdCA9IEpzLlVuc2FmZS5wdXJlX2pzX2V4cHIgXCJldmVudFwiXG5cbigqIFRoZSBmdW5jdGlvbiBwcmV2ZW50RGVmYXVsdCBtdXN0IGJlIGNhbGxlZCBleHBsaWNpdGx5IHdoZW5cbiAgIHVzaW5nIGFkZEV2ZW50TGlzdGVuZXIuLi4gKilcbmxldCBoYW5kbGVyIGYgPVxuICBKcy5zb21lXG4gICAgKEpzLlVuc2FmZS5jYWxsYmFjayAoZnVuIGUgLT5cbiAgICAgICAgICgqIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJuZXQgZXhwbG9yZXIgdmVyc2lvbiwgZSBjYW4gYmUgbnVsbCBvciB1bmRlZmluZWQuICopXG4gICAgICAgICBpZiBub3QgKEpzLk9wdC50ZXN0IChzb21lIGUpKVxuICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgIGxldCBlID0gd2luZG93X2V2ZW50ICgpIGluXG4gICAgICAgICAgIGxldCByZXMgPSBmIGUgaW5cbiAgICAgICAgICAgaWYgbm90IChKcy50b19ib29sIHJlcykgdGhlbiBlIyMucmV0dXJuVmFsdWUgOj0gcmVzO1xuICAgICAgICAgICByZXMpXG4gICAgICAgICBlbHNlXG4gICAgICAgICAgIGxldCByZXMgPSBmIGUgaW5cbiAgICAgICAgICAgaWYgbm90IChKcy50b19ib29sIHJlcykgdGhlbiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjcHJldmVudERlZmF1bHQ7XG4gICAgICAgICAgIHJlcykpXG5cbmxldCBmdWxsX2hhbmRsZXIgZiA9XG4gIEpzLnNvbWVcbiAgICAoSnMuVW5zYWZlLm1ldGhfY2FsbGJhY2sgKGZ1biB0aGlzIGUgLT5cbiAgICAgICAgICgqIGRlcGVuZGluZyBvbiB0aGUgaW50ZXJuZXQgZXhwbG9yZXIgdmVyc2lvbiwgZSBjYW4gYmUgbnVsbCBvciB1bmRlZmluZWQgKilcbiAgICAgICAgIGlmIG5vdCAoSnMuT3B0LnRlc3QgKHNvbWUgZSkpXG4gICAgICAgICB0aGVuIChcbiAgICAgICAgICAgbGV0IGUgPSB3aW5kb3dfZXZlbnQgKCkgaW5cbiAgICAgICAgICAgbGV0IHJlcyA9IGYgdGhpcyBlIGluXG4gICAgICAgICAgIGlmIG5vdCAoSnMudG9fYm9vbCByZXMpIHRoZW4gZSMjLnJldHVyblZhbHVlIDo9IHJlcztcbiAgICAgICAgICAgcmVzKVxuICAgICAgICAgZWxzZVxuICAgICAgICAgICBsZXQgcmVzID0gZiB0aGlzIGUgaW5cbiAgICAgICAgICAgaWYgbm90IChKcy50b19ib29sIHJlcykgdGhlbiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjcHJldmVudERlZmF1bHQ7XG4gICAgICAgICAgIHJlcykpXG5cbmxldCBpbnZva2VfaGFuZGxlciAoZiA6ICgnYSwgJ2IpIGV2ZW50X2xpc3RlbmVyKSAodGhpcyA6ICdhKSAoZXZlbnQgOiAnYikgOiBib29sIHQgPVxuICBKcy5VbnNhZmUuY2FsbCBmIHRoaXMgW3wgSnMuVW5zYWZlLmluamVjdCBldmVudCB8XVxuXG5sZXQgZXZlbnRUYXJnZXQgKGUgOiAoPCAuLiA+IGFzICdhKSAjZXZlbnQgdCkgOiAnYSB0ID1cbiAgbGV0IHRhcmdldCA9XG4gICAgT3B0LmdldCBlIyMudGFyZ2V0IChmdW4gKCkgLT4gT3B0LmdldCBlIyMuc3JjRWxlbWVudCAoZnVuICgpIC0+IHJhaXNlIE5vdF9mb3VuZCkpXG4gIGluXG4gIGlmIEpzLmluc3RhbmNlb2YgdGFyZ2V0IEpzLlVuc2FmZS5nbG9iYWwjIy5fTm9kZVxuICB0aGVuXG4gICAgKCogV29ya2Fyb3VuZCBmb3IgU2FmYXJpIGJ1ZyAqKVxuICAgIGxldCB0YXJnZXQnIDogbm9kZSBKcy50ID0gSnMuVW5zYWZlLmNvZXJjZSB0YXJnZXQgaW5cbiAgICBpZiB0YXJnZXQnIyMubm9kZVR5cGUgPT0gVEVYVFxuICAgIHRoZW4gSnMuVW5zYWZlLmNvZXJjZSAoT3B0LmdldCB0YXJnZXQnIyMucGFyZW50Tm9kZSAoZnVuICgpIC0+IGFzc2VydCBmYWxzZSkpXG4gICAgZWxzZSB0YXJnZXRcbiAgZWxzZSB0YXJnZXRcblxubW9kdWxlIEV2ZW50ID0gc3RydWN0XG4gIHR5cGUgJ2EgdHlwID0gSnMuanNfc3RyaW5nIEpzLnRcblxuICBsZXQgbWFrZSBzID0gSnMuc3RyaW5nIHNcbmVuZFxuXG50eXBlIGV2ZW50X2xpc3RlbmVyX2lkID0gdW5pdCAtPiB1bml0XG5cbmNsYXNzIHR5cGUgZXZlbnRfbGlzdGVuZXJfb3B0aW9ucyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjYXB0dXJlIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25jZSA6IGJvb2wgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhc3NpdmUgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCBhZGRFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgKGUgOiAoPCAuLiA+IGFzICdhKSB0KSB0eXAgP2NhcHR1cmUgP29uY2UgP3Bhc3NpdmUgaCA9XG4gIGlmIChKcy5VbnNhZmUuY29lcmNlIGUpIyMuYWRkRXZlbnRMaXN0ZW5lciA9PSBKcy51bmRlZmluZWRcbiAgdGhlblxuICAgIGxldCBldiA9IChKcy5zdHJpbmcgXCJvblwiKSMjY29uY2F0IHR5cCBpblxuICAgIGxldCBjYWxsYmFjayBlID0gSnMuVW5zYWZlLmNhbGwgKGgsIGUsIFt8fF0pIGluXG4gICAgbGV0ICgpID0gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI2F0dGFjaEV2ZW50IGV2IGNhbGxiYWNrIGluXG4gICAgZnVuICgpIC0+IChKcy5VbnNhZmUuY29lcmNlIGUpIyNkZXRhY2hFdmVudCBldiBjYWxsYmFja1xuICBlbHNlXG4gICAgbGV0IG9wdHMgOiBldmVudF9saXN0ZW5lcl9vcHRpb25zIHQgPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgICBsZXQgaXRlciB0IGYgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IE5vbmUgLT4gKClcbiAgICAgIHwgU29tZSBiIC0+IGYgYlxuICAgIGluXG4gICAgaXRlciBjYXB0dXJlIChmdW4gYiAtPiBvcHRzIyMuY2FwdHVyZSA6PSBiKTtcbiAgICBpdGVyIG9uY2UgKGZ1biBiIC0+IG9wdHMjIy5vbmNlIDo9IGIpO1xuICAgIGl0ZXIgcGFzc2l2ZSAoZnVuIGIgLT4gb3B0cyMjLnBhc3NpdmUgOj0gYik7XG4gICAgbGV0ICgpID0gKEpzLlVuc2FmZS5jb2VyY2UgZSkjI2FkZEV2ZW50TGlzdGVuZXIgdHlwIGggb3B0cyBpblxuICAgIGZ1biAoKSAtPiAoSnMuVW5zYWZlLmNvZXJjZSBlKSMjcmVtb3ZlRXZlbnRMaXN0ZW5lciB0eXAgaCBvcHRzXG5cbmxldCBhZGRFdmVudExpc3RlbmVyIChlIDogKDwgLi4gPiBhcyAnYSkgdCkgdHlwIGggY2FwdCA9XG4gIGFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyBlIHR5cCB+Y2FwdHVyZTpjYXB0IGhcblxubGV0IHJlbW92ZUV2ZW50TGlzdGVuZXIgaWQgPSBpZCAoKVxuXG5sZXQgcHJldmVudERlZmF1bHQgZXYgPVxuICBpZiBKcy5PcHRkZWYudGVzdCAoSnMuVW5zYWZlLmNvZXJjZSBldikjIy5wcmV2ZW50RGVmYXVsdCAoKiBJRSBoYWNrICopXG4gIHRoZW4gKEpzLlVuc2FmZS5jb2VyY2UgZXYpIyNwcmV2ZW50RGVmYXVsdFxuICBlbHNlIChKcy5VbnNhZmUuY29lcmNlIGV2KSMjLnJldHVyblZhbHVlIDo9IEpzLmJvb2wgZmFsc2VcblxubGV0IGNyZWF0ZUN1c3RvbUV2ZW50ID9idWJibGVzID9jYW5jZWxhYmxlID9kZXRhaWwgdHlwID1cbiAgbGV0IG9wdF9pdGVyIGYgPSBmdW5jdGlvblxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSB4IC0+IGYgeFxuICBpblxuICBsZXQgb3B0cyA9IFVuc2FmZS5vYmogW3x8XSBpblxuICBvcHRfaXRlciAoZnVuIHggLT4gb3B0cyMjLmJ1YmJsZXMgOj0gYm9vbCB4KSBidWJibGVzO1xuICBvcHRfaXRlciAoZnVuIHggLT4gb3B0cyMjLmNhbmNlbGFibGUgOj0gYm9vbCB4KSBjYW5jZWxhYmxlO1xuICBvcHRfaXRlciAoZnVuIHggLT4gb3B0cyMjLmRldGFpbCA6PSBzb21lIHgpIGRldGFpbDtcbiAgbGV0IGNvbnN0ciA6XG4gICAgICAoICAgKCdhLCAnYikgI2N1c3RvbUV2ZW50IEpzLnQgRXZlbnQudHlwXG4gICAgICAgLT4gPCBkZXRhaWwgOiAnYiBvcHQgcHJvcCA+IHRcbiAgICAgICAtPiAoJ2EsICdiKSBjdXN0b21FdmVudCB0KVxuICAgICAgY29uc3RyID1cbiAgICBVbnNhZmUuZ2xvYmFsIyMuX0N1c3RvbUV2ZW50XG4gIGluXG4gIG5ldyVqcyBjb25zdHIgdHlwIG9wdHNcblxuKCogSUUgPCA5ICopXG5cbmNsYXNzIHR5cGUgc3RyaW5nTGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250YWlucyA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG4gIGVuZFxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMiBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcbm9wZW4gSnNcblxudHlwZSB1aW50MzIgPSBmbG9hdFxuXG5jbGFzcyB0eXBlIGFycmF5QnVmZmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGJ5dGVMZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNsaWNlIDogaW50IC0+IGludCAtPiBhcnJheUJ1ZmZlciB0IG1ldGhcblxuICAgIG1ldGhvZCBzbGljZV90b0VuZCA6IGludCAtPiBhcnJheUJ1ZmZlciB0IG1ldGhcbiAgZW5kXG5cbmxldCBhcnJheUJ1ZmZlciA6IChpbnQgLT4gYXJyYXlCdWZmZXIgdCkgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9BcnJheUJ1ZmZlclxuXG5jbGFzcyB0eXBlIGFycmF5QnVmZmVyVmlldyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBidWZmZXIgOiBhcnJheUJ1ZmZlciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBieXRlT2Zmc2V0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBieXRlTGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgWydhLCAnYl0gdHlwZWRBcnJheSA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgYXJyYXlCdWZmZXJWaWV3XG5cbiAgICBtZXRob2QgX0JZVEVTX1BFUl9FTEVNRU5UIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNldF9mcm9tQXJyYXkgOiAnYSBqc19hcnJheSB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRfZnJvbVR5cGVkQXJyYXkgOiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YmFycmF5IDogaW50IC0+IGludCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIHN1YmFycmF5X3RvRW5kIDogaW50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+ICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2VfdG9FbmQgOiBpbnQgLT4gKCdhLCAnYikgdHlwZWRBcnJheSB0IG1ldGhcblxuICAgICgqIFRoaXMgZmFrZSBtZXRob2QgaXMgbmVlZGVkIGZvciB0eXBpbmcgcHVycG9zZXMuXG4gICAgICAgV2l0aG91dCBpdCwgWydiXSB3b3VsZCBub3QgYmUgY29uc3RyYWluZWQuICopXG4gICAgbWV0aG9kIF9jb250ZW50X3R5cGVfIDogJ2Igb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbnR5cGUgaW50OEFycmF5ID0gKGludCwgQmlnYXJyYXkuaW50OF9zaWduZWRfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgdWludDhBcnJheSA9IChpbnQsIEJpZ2FycmF5LmludDhfdW5zaWduZWRfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgaW50MTZBcnJheSA9IChpbnQsIEJpZ2FycmF5LmludDE2X3NpZ25lZF9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSB1aW50MTZBcnJheSA9IChpbnQsIEJpZ2FycmF5LmludDE2X3Vuc2lnbmVkX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIGludDMyQXJyYXkgPSAoaW50MzIsIEJpZ2FycmF5LmludDMyX2VsdCkgdHlwZWRBcnJheVxuXG50eXBlIHVpbnQzMkFycmF5ID0gKGludDMyLCBCaWdhcnJheS5pbnQzMl9lbHQpIHR5cGVkQXJyYXlcblxudHlwZSBmbG9hdDMyQXJyYXkgPSAoZmxvYXQsIEJpZ2FycmF5LmZsb2F0MzJfZWx0KSB0eXBlZEFycmF5XG5cbnR5cGUgZmxvYXQ2NEFycmF5ID0gKGZsb2F0LCBCaWdhcnJheS5mbG9hdDY0X2VsdCkgdHlwZWRBcnJheVxuXG5leHRlcm5hbCBraW5kIDogKCdhLCAnYikgdHlwZWRBcnJheSB0IC0+ICgnYSwgJ2IpIEJpZ2FycmF5LmtpbmRcbiAgPSBcImNhbWxfYmFfa2luZF9vZl90eXBlZF9hcnJheVwiXG5cbmV4dGVybmFsIGZyb21fZ2VuYXJyYXkgOlxuICAoJ2EsICdiLCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuR2VuYXJyYXkudCAtPiAoJ2EsICdiKSB0eXBlZEFycmF5IHRcbiAgPSBcImNhbWxfYmFfdG9fdHlwZWRfYXJyYXlcIlxuXG5leHRlcm5hbCB0b19nZW5hcnJheSA6XG4gICgnYSwgJ2IpIHR5cGVkQXJyYXkgdCAtPiAoJ2EsICdiLCBCaWdhcnJheS5jX2xheW91dCkgQmlnYXJyYXkuR2VuYXJyYXkudFxuICA9IFwiY2FtbF9iYV9mcm9tX3R5cGVkX2FycmF5XCJcblxubGV0IGludDhBcnJheSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50OEFycmF5XG5cbmxldCBpbnQ4QXJyYXlfZnJvbUFycmF5ID0gaW50OEFycmF5XG5cbmxldCBpbnQ4QXJyYXlfZnJvbVR5cGVkQXJyYXkgPSBpbnQ4QXJyYXlcblxubGV0IGludDhBcnJheV9mcm9tQnVmZmVyID0gaW50OEFycmF5XG5cbmxldCBpbnQ4QXJyYXlfaW5CdWZmZXIgPSBpbnQ4QXJyYXlcblxubGV0IHVpbnQ4QXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1VpbnQ4QXJyYXlcblxubGV0IHVpbnQ4QXJyYXlfZnJvbUFycmF5ID0gdWludDhBcnJheVxuXG5sZXQgdWludDhBcnJheV9mcm9tVHlwZWRBcnJheSA9IHVpbnQ4QXJyYXlcblxubGV0IHVpbnQ4QXJyYXlfZnJvbUJ1ZmZlciA9IHVpbnQ4QXJyYXlcblxubGV0IHVpbnQ4QXJyYXlfaW5CdWZmZXIgPSB1aW50OEFycmF5XG5cbmxldCBpbnQxNkFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnQxNkFycmF5XG5cbmxldCBpbnQxNkFycmF5X2Zyb21BcnJheSA9IGludDE2QXJyYXlcblxubGV0IGludDE2QXJyYXlfZnJvbVR5cGVkQXJyYXkgPSBpbnQxNkFycmF5XG5cbmxldCBpbnQxNkFycmF5X2Zyb21CdWZmZXIgPSBpbnQxNkFycmF5XG5cbmxldCBpbnQxNkFycmF5X2luQnVmZmVyID0gaW50MTZBcnJheVxuXG5sZXQgdWludDE2QXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1VpbnQxNkFycmF5XG5cbmxldCB1aW50MTZBcnJheV9mcm9tQXJyYXkgPSB1aW50MTZBcnJheVxuXG5sZXQgdWludDE2QXJyYXlfZnJvbVR5cGVkQXJyYXkgPSB1aW50MTZBcnJheVxuXG5sZXQgdWludDE2QXJyYXlfZnJvbUJ1ZmZlciA9IHVpbnQxNkFycmF5XG5cbmxldCB1aW50MTZBcnJheV9pbkJ1ZmZlciA9IHVpbnQxNkFycmF5XG5cbmxldCBpbnQzMkFycmF5ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnQzMkFycmF5XG5cbmxldCBpbnQzMkFycmF5X2Zyb21BcnJheSA9IGludDMyQXJyYXlcblxubGV0IGludDMyQXJyYXlfZnJvbVR5cGVkQXJyYXkgPSBpbnQzMkFycmF5XG5cbmxldCBpbnQzMkFycmF5X2Zyb21CdWZmZXIgPSBpbnQzMkFycmF5XG5cbmxldCBpbnQzMkFycmF5X2luQnVmZmVyID0gaW50MzJBcnJheVxuXG5sZXQgdWludDMyQXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1VpbnQzMkFycmF5XG5cbmxldCB1aW50MzJBcnJheV9mcm9tQXJyYXkgPSB1aW50MzJBcnJheVxuXG5sZXQgdWludDMyQXJyYXlfZnJvbVR5cGVkQXJyYXkgPSB1aW50MzJBcnJheVxuXG5sZXQgdWludDMyQXJyYXlfZnJvbUJ1ZmZlciA9IHVpbnQzMkFycmF5XG5cbmxldCB1aW50MzJBcnJheV9pbkJ1ZmZlciA9IHVpbnQzMkFycmF5XG5cbmxldCBmbG9hdDMyQXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0Zsb2F0MzJBcnJheVxuXG5sZXQgZmxvYXQzMkFycmF5X2Zyb21BcnJheSA9IGZsb2F0MzJBcnJheVxuXG5sZXQgZmxvYXQzMkFycmF5X2Zyb21UeXBlZEFycmF5ID0gZmxvYXQzMkFycmF5XG5cbmxldCBmbG9hdDMyQXJyYXlfZnJvbUJ1ZmZlciA9IGZsb2F0MzJBcnJheVxuXG5sZXQgZmxvYXQzMkFycmF5X2luQnVmZmVyID0gZmxvYXQzMkFycmF5XG5cbmxldCBmbG9hdDY0QXJyYXkgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0Zsb2F0NjRBcnJheVxuXG5sZXQgZmxvYXQ2NEFycmF5X2Zyb21BcnJheSA9IGZsb2F0NjRBcnJheVxuXG5sZXQgZmxvYXQ2NEFycmF5X2Zyb21UeXBlZEFycmF5ID0gZmxvYXQ2NEFycmF5XG5cbmxldCBmbG9hdDY0QXJyYXlfZnJvbUJ1ZmZlciA9IGZsb2F0NjRBcnJheVxuXG5sZXQgZmxvYXQ2NEFycmF5X2luQnVmZmVyID0gZmxvYXQ2NEFycmF5XG5cbmxldCBzZXQgOiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gaW50IC0+ICdhIC0+IHVuaXQgPVxuIGZ1biBhIGkgdiAtPiBhcnJheV9zZXQgKFVuc2FmZS5jb2VyY2UgYSkgaSB2XG5cbmxldCBnZXQgOiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gaW50IC0+ICdhIG9wdGRlZiA9IGZ1biBhIGkgLT4gSnMuVW5zYWZlLmdldCBhIGlcblxubGV0IHVuc2FmZV9nZXQgOiAoJ2EsICdiKSB0eXBlZEFycmF5IHQgLT4gaW50IC0+ICdhID0gZnVuIGEgaSAtPiBKcy5VbnNhZmUuZ2V0IGEgaVxuXG5jbGFzcyB0eXBlIGRhdGFWaWV3ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBhcnJheUJ1ZmZlclZpZXdcblxuICAgIG1ldGhvZCBnZXRJbnQ4IDogaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VWludDggOiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRJbnQxNiA6IGludCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEludDE2XyA6IGludCAtPiBib29sIHQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVaW50MTYgOiBpbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBnZXRVaW50MTZfIDogaW50IC0+IGJvb2wgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEludDMyIDogaW50IC0+IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW50MzJfIDogaW50IC0+IGJvb2wgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVpbnQzMiA6IGludCAtPiB1aW50MzIgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVpbnQzMl8gOiBpbnQgLT4gYm9vbCB0IC0+IHVpbnQzMiBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RmxvYXQzMiA6IGludCAtPiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RmxvYXQzMl8gOiBpbnQgLT4gYm9vbCB0IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRGbG9hdDY0IDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRGbG9hdDY0XyA6IGludCAtPiBib29sIHQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludDggOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVpbnQ4IDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnQxNiA6IGludCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50MTZfIDogaW50IC0+IGludCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VWludDE2IDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRVaW50MTZfIDogaW50IC0+IGludCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0SW50MzIgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEludDMyXyA6IGludCAtPiBpbnQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFVpbnQzMiA6IGludCAtPiB1aW50MzIgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VWludDMyXyA6IGludCAtPiB1aW50MzIgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEZsb2F0MzIgOiBpbnQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RmxvYXQzMl8gOiBpbnQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEZsb2F0NjQgOiBpbnQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RmxvYXQ2NF8gOiBpbnQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxubGV0IGRhdGFWaWV3ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9EYXRhVmlld1xuXG5sZXQgZGF0YVZpZXdfaW5CdWZmZXIgPSBkYXRhVmlld1xuXG5tb2R1bGUgQmlnc3RyaW5nID0gc3RydWN0XG4gIHR5cGUgdCA9IChjaGFyLCBCaWdhcnJheS5pbnQ4X3Vuc2lnbmVkX2VsdCwgQmlnYXJyYXkuY19sYXlvdXQpIEJpZ2FycmF5LkFycmF5MS50XG5cbiAgZXh0ZXJuYWwgdG9fYXJyYXlCdWZmZXIgOiB0IC0+IGFycmF5QnVmZmVyIEpzLnQgPSBcImJpZ3N0cmluZ190b19hcnJheV9idWZmZXJcIlxuXG4gIGV4dGVybmFsIHRvX3VpbnQ4QXJyYXkgOiB0IC0+IHVpbnQ4QXJyYXkgSnMudCA9IFwiYmlnc3RyaW5nX3RvX3R5cGVkX2FycmF5XCJcblxuICBleHRlcm5hbCBvZl9hcnJheUJ1ZmZlciA6IGFycmF5QnVmZmVyIEpzLnQgLT4gdCA9IFwiYmlnc3RyaW5nX29mX2FycmF5X2J1ZmZlclwiXG5cbiAgZXh0ZXJuYWwgb2ZfdWludDhBcnJheSA6IHVpbnQ4QXJyYXkgSnMudCAtPiB0ID0gXCJiaWdzdHJpbmdfb2ZfdHlwZWRfYXJyYXlcIlxuZW5kXG5cbm1vZHVsZSBTdHJpbmcgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgb2ZfdWludDhBcnJheSA6IHVpbnQ4QXJyYXkgSnMudCAtPiBzdHJpbmcgPSBcImNhbWxfc3RyaW5nX29mX2FycmF5XCJcblxuICBsZXQgb2ZfYXJyYXlCdWZmZXIgYWIgPVxuICAgIGxldCB1aW50OCA9IG5ldyVqcyB1aW50OEFycmF5X2Zyb21CdWZmZXIgYWIgaW5cbiAgICBvZl91aW50OEFycmF5IHVpbnQ4XG5lbmRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGllcnJlIENoYW1iYXJ0XG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiBEb21cbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIGJsb2IgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgc2l6ZSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2xpY2UgOiBpbnQgLT4gaW50IC0+IGJsb2IgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2xpY2Vfd2l0aENvbnRlbnRUeXBlIDogaW50IC0+IGludCAtPiBqc19zdHJpbmcgdCAtPiBibG9iIHQgbWV0aFxuICBlbmRcblxubGV0IGJsb2JfY29uc3RyID0gVW5zYWZlLmdsb2JhbCMjLl9CbG9iXG5cbnR5cGUgJ2EgbWFrZV9ibG9iID1cbiAgP2NvbnRlbnRUeXBlOnN0cmluZyAtPiA/ZW5kaW5nczpbIGBUcmFuc3BhcmVudCB8IGBOYXRpdmUgXSAtPiAnYSAtPiBibG9iIHRcblxubGV0IHJlYyBmaWx0ZXJfbWFwIGYgPSBmdW5jdGlvblxuICB8IFtdIC0+IFtdXG4gIHwgdiA6OiBxIC0+IChcbiAgICAgIG1hdGNoIGYgdiB3aXRoXG4gICAgICB8IE5vbmUgLT4gZmlsdGVyX21hcCBmIHFcbiAgICAgIHwgU29tZSB2JyAtPiB2JyA6OiBmaWx0ZXJfbWFwIGYgcSlcblxubGV0IG1ha2VfYmxvYl9vcHRpb25zIGNvbnRlbnRUeXBlIGVuZGluZ3MgPVxuICBsZXQgb3B0aW9ucyA9XG4gICAgZmlsdGVyX21hcFxuICAgICAgKGZ1biAobmFtZSwgdikgLT5cbiAgICAgICAgbWF0Y2ggdiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgIHwgU29tZSB2IC0+IFNvbWUgKG5hbWUsIFVuc2FmZS5pbmplY3QgKHN0cmluZyB2KSkpXG4gICAgICBbIFwidHlwZVwiLCBjb250ZW50VHlwZVxuICAgICAgOyAoIFwiZW5kaW5nc1wiXG4gICAgICAgICwgbWF0Y2ggZW5kaW5ncyB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgICAgICB8IFNvbWUgYFRyYW5zcGFyZW50IC0+IFNvbWUgXCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgfCBTb21lIGBOYXRpdmUgLT4gU29tZSBcIm5hdGl2ZVwiIClcbiAgICAgIF1cbiAgaW5cbiAgbWF0Y2ggb3B0aW9ucyB3aXRoXG4gIHwgW10gLT4gdW5kZWZpbmVkXG4gIHwgbCAtPiBVbnNhZmUub2JqIChBcnJheS5vZl9saXN0IGwpXG5cbmxldCBibG9iX3JhdyA/Y29udGVudFR5cGUgP2VuZGluZ3MgYSA9XG4gIGxldCBvcHRpb25zID0gbWFrZV9ibG9iX29wdGlvbnMgY29udGVudFR5cGUgZW5kaW5ncyBpblxuICBuZXclanMgYmxvYl9jb25zdHIgKGFycmF5IGEpIG9wdGlvbnNcblxubGV0IGJsb2JfZnJvbV9zdHJpbmcgP2NvbnRlbnRUeXBlID9lbmRpbmdzIHMgPVxuICBibG9iX3JhdyA/Y29udGVudFR5cGUgP2VuZGluZ3MgW3wgc3RyaW5nIHMgfF1cblxubGV0IGJsb2JfZnJvbV9hbnkgP2NvbnRlbnRUeXBlID9lbmRpbmdzIGwgPVxuICBsZXQgbCA9XG4gICAgTGlzdC5tYXBcbiAgICAgIChmdW5jdGlvblxuICAgICAgICB8IGBhcnJheUJ1ZmZlciBhIC0+IFVuc2FmZS5pbmplY3QgYVxuICAgICAgICB8IGBhcnJheUJ1ZmZlclZpZXcgYSAtPiBVbnNhZmUuaW5qZWN0IGFcbiAgICAgICAgfCBgc3RyaW5nIHMgLT4gVW5zYWZlLmluamVjdCAoc3RyaW5nIHMpXG4gICAgICAgIHwgYGpzX3N0cmluZyBzIC0+IFVuc2FmZS5pbmplY3Qgc1xuICAgICAgICB8IGBibG9iIGIgLT4gVW5zYWZlLmluamVjdCBiKVxuICAgICAgbFxuICBpblxuICBibG9iX3JhdyA/Y29udGVudFR5cGUgP2VuZGluZ3MgKEFycmF5Lm9mX2xpc3QgbClcblxuY2xhc3MgdHlwZSBmaWxlID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBibG9iXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsYXN0TW9kaWZpZWREYXRlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW4gZmlyZWZveCAzLjAtMy41IGZpbGUubmFtZSBpcyBub3QgYXZhaWxhYmxlLCB3ZSB1c2UgdGhlIG5vbnN0YW5kYXJkIGZpbGVOYW1lIGluc3RlYWQgKilcbmNsYXNzIHR5cGUgZmlsZV9uYW1lX29ubHkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsZU5hbWUgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IGZpbGVuYW1lIGZpbGUgPVxuICBsZXQgZmlsZSA6IGZpbGVfbmFtZV9vbmx5IHQgPSBKcy5VbnNhZmUuY29lcmNlIGZpbGUgaW5cbiAgbWF0Y2ggT3B0ZGVmLnRvX29wdGlvbiBmaWxlIyMubmFtZSB3aXRoXG4gIHwgTm9uZSAtPiAoXG4gICAgICBtYXRjaCBPcHRkZWYudG9fb3B0aW9uIGZpbGUjIy5maWxlTmFtZSB3aXRoXG4gICAgICB8IE5vbmUgLT4gZmFpbHdpdGggXCJjYW4ndCByZXRyaWV2ZSBmaWxlIG5hbWU6IG5vdCBpbXBsZW1lbnRlZFwiXG4gICAgICB8IFNvbWUgbmFtZSAtPiBuYW1lKVxuICB8IFNvbWUgbmFtZSAtPiBuYW1lXG5cbnR5cGUgZmlsZV9hbnkgPSA8ID4gdFxuXG5sZXQgZG9jX2NvbnN0ciA9IFVuc2FmZS5nbG9iYWwjIy5fRG9jdW1lbnRcblxubW9kdWxlIENvZXJjZVRvID0gc3RydWN0XG4gIGV4dGVybmFsIGpzb24gOiBmaWxlX2FueSAtPiAnYSBPcHQudCA9IFwiJWlkZW50aXR5XCJcblxuICBsZXQgZG9jdW1lbnQgKGUgOiBmaWxlX2FueSkgPVxuICAgIGlmIGluc3RhbmNlb2YgZSBkb2NfY29uc3RyXG4gICAgdGhlbiBKcy5zb21lIChVbnNhZmUuY29lcmNlIGUgOiBlbGVtZW50IGRvY3VtZW50IHQpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGJsb2IgKGUgOiBmaWxlX2FueSkgPVxuICAgIGlmIGluc3RhbmNlb2YgZSBibG9iX2NvbnN0ciB0aGVuIEpzLnNvbWUgKFVuc2FmZS5jb2VyY2UgZSA6ICNibG9iIHQpIGVsc2UgSnMubnVsbFxuXG4gIGxldCBzdHJpbmcgKGUgOiBmaWxlX2FueSkgPVxuICAgIGlmIHR5cGVvZiBlID09IHN0cmluZyBcInN0cmluZ1wiXG4gICAgdGhlbiBKcy5zb21lIChVbnNhZmUuY29lcmNlIGUgOiBqc19zdHJpbmcgdClcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgYXJyYXlCdWZmZXIgKGUgOiBmaWxlX2FueSkgPVxuICAgIGlmIGluc3RhbmNlb2YgZSBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclxuICAgIHRoZW4gSnMuc29tZSAoVW5zYWZlLmNvZXJjZSBlIDogVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgdClcbiAgICBlbHNlIEpzLm51bGxcbmVuZFxuXG5jbGFzcyB0eXBlIGZpbGVMaXN0ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbZmlsZV0gRG9tLm5vZGVMaXN0XG4gIGVuZFxuXG5jbGFzcyB0eXBlIGZpbGVFcnJvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjb2RlIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgWydhXSBwcm9ncmVzc0V2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbJ2FdIGV2ZW50XG5cbiAgICBtZXRob2QgbGVuZ3RoQ29tcHV0YWJsZSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbG9hZGVkIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0b3RhbCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHByb2dyZXNzRXZlbnRUYXJnZXQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIG1ldGhvZCBvbmxvYWRzdGFydCA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wcm9ncmVzcyA6ICgnc2VsZiB0LCAnc2VsZiBwcm9ncmVzc0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb2FkIDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmFib3J0IDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmVycm9yIDogKCdzZWxmIHQsICdzZWxmIHByb2dyZXNzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvYWRlbmQgOiAoJ3NlbGYgdCwgJ3NlbGYgcHJvZ3Jlc3NFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxudHlwZSByZWFkeVN0YXRlID1cbiAgfCBFTVBUWVxuICB8IExPQURJTkdcbiAgfCBET05FXG5cbmNsYXNzIHR5cGUgZmlsZVJlYWRlciA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgbWV0aG9kIHJlYWRBc0FycmF5QnVmZmVyIDogI2Jsb2IgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkQXNCaW5hcnlTdHJpbmcgOiAjYmxvYiB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWRBc1RleHQgOiAjYmxvYiB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWRBc1RleHRfd2l0aEVuY29kaW5nIDogI2Jsb2IgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkQXNEYXRhVVJMIDogI2Jsb2IgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhYm9ydCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiByZWFkeVN0YXRlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXN1bHQgOiBmaWxlX2FueSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZXJyb3IgOiBmaWxlRXJyb3IgdCByZWFkb25seV9wcm9wXG5cbiAgICBpbmhlcml0IHByb2dyZXNzRXZlbnRUYXJnZXRcbiAgZW5kXG5cbm1vZHVsZSBSZWFkZXJFdmVudCA9IHN0cnVjdFxuICB0eXBlIHR5cCA9IGZpbGVSZWFkZXIgcHJvZ3Jlc3NFdmVudCB0IERvbS5FdmVudC50eXBcblxuICBsZXQgbG9hZHN0YXJ0ID0gRXZlbnQubWFrZSBcImxvYWRzdGFydFwiXG5cbiAgbGV0IHByb2dyZXNzID0gRXZlbnQubWFrZSBcInByb2dyZXNzXCJcblxuICBsZXQgYWJvcnQgPSBFdmVudC5tYWtlIFwiYWJvcnRcIlxuXG4gIGxldCBlcnJvciA9IEV2ZW50Lm1ha2UgXCJlcnJvclwiXG5cbiAgbGV0IGxvYWQgPSBFdmVudC5tYWtlIFwibG9hZFwiXG5cbiAgbGV0IGxvYWRlbmQgPSBFdmVudC5tYWtlIFwibG9hZGVuZFwiXG5lbmRcblxubGV0IGZpbGVSZWFkZXIgOiBmaWxlUmVhZGVyIHQgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9GaWxlUmVhZGVyXG5cbmxldCBhZGRFdmVudExpc3RlbmVyID0gRG9tLmFkZEV2ZW50TGlzdGVuZXJcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxuZXh0ZXJuYWwgY2FtbF9qc19vbl9pZSA6IHVuaXQgLT4gYm9vbCB0ID0gXCJjYW1sX2pzX29uX2llXCJcblxubGV0IG9uSUUgPSBKcy50b19ib29sIChjYW1sX2pzX29uX2llICgpKVxuXG5leHRlcm5hbCBodG1sX2VzY2FwZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0ID0gXCJjYW1sX2pzX2h0bWxfZXNjYXBlXCJcblxuZXh0ZXJuYWwgZGVjb2RlX2h0bWxfZW50aXRpZXMgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCA9IFwiY2FtbF9qc19odG1sX2VudGl0aWVzXCJcblxuY2xhc3MgdHlwZSBjc3NTdHlsZURlY2xhcmF0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHNldFByb3BlcnR5IDpcbiAgICAgIGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdGRlZiAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UHJvcGVydHlWYWx1ZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQcm9wZXJ0eVByaW9yaXR5IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZVByb3BlcnR5IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGFuaW1hdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25EZWxheSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25EaXJlY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uRHVyYXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uRmlsbE1vZGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uTmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRpb25QbGF5U3RhdGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kQXR0YWNobWVudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kQ29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYmFja2dyb3VuZEltYWdlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJhY2tncm91bmRQb3NpdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBiYWNrZ3JvdW5kUmVwZWF0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJCb3R0b20gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQm90dG9tQ29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQm90dG9tU3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQm90dG9tV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQ29sbGFwc2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQ29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyTGVmdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJMZWZ0Q29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyTGVmdFN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlckxlZnRXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJSYWRpdXMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyUmlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyUmlnaHRDb2xvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJSaWdodFN0eWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlclJpZ2h0V2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyU3BhY2luZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBib3JkZXJUb3AgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyVG9wQ29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyVG9wU3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyVG9wV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYm90dG9tIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNhcHRpb25TaWRlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsZWFyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsaXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29udGVudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb3VudGVySW5jcmVtZW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvdW50ZXJSZXNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjc3NGbG9hdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjc3NUZXh0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGN1cnNvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkaXJlY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGlzcGxheSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBlbXB0eUNlbGxzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZpbGwgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9udCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250RmFtaWx5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnRTaXplIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvbnRTdHlsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250VmFyaWFudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb250V2VpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsZWZ0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxldHRlclNwYWNpbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGluZUhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsaXN0U3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGlzdFN0eWxlSW1hZ2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGlzdFN0eWxlUG9zaXRpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbGlzdFN0eWxlVHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW4gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luQm90dG9tIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbkxlZnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luUmlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luVG9wIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1heEhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXhXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtaW5IZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWluV2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3BhY2l0eSA6IGpzX3N0cmluZyB0IG9wdGRlZiBwcm9wXG5cbiAgICBtZXRob2Qgb3V0bGluZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdXRsaW5lQ29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3V0bGluZU9mZnNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdXRsaW5lU3R5bGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3V0bGluZVdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG92ZXJmbG93IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG92ZXJmbG93WCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvdmVyZmxvd1kgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGFkZGluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWRkaW5nQm90dG9tIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZGRpbmdMZWZ0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZGRpbmdSaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwYWRkaW5nVG9wIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VCcmVha0FmdGVyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VCcmVha0JlZm9yZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBwb2ludGVyRXZlbnRzIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHBvc2l0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0cm9rZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdHJva2VXaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YWJsZUxheW91dCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGV4dEFuY2hvciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0RGVjb3JhdGlvbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0SW5kZW50IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRUcmFuc2Zvcm0gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdG9wIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRyYW5zZm9ybSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2ZXJ0aWNhbEFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZpc2liaWxpdHkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2hpdGVTcGFjZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3b3JkU3BhY2luZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB6SW5kZXggOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG50eXBlICgnYSwgJ2IpIGV2ZW50X2xpc3RlbmVyID0gKCdhLCAnYikgRG9tLmV2ZW50X2xpc3RlbmVyXG5cbnR5cGUgbW91c2VfYnV0dG9uID1cbiAgfCBOb19idXR0b25cbiAgfCBMZWZ0X2J1dHRvblxuICB8IE1pZGRsZV9idXR0b25cbiAgfCBSaWdodF9idXR0b25cblxudHlwZSBkZWx0YV9tb2RlID1cbiAgfCBEZWx0YV9waXhlbFxuICB8IERlbHRhX2xpbmVcbiAgfCBEZWx0YV9wYWdlXG5cbmNsYXNzIHR5cGUgZXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtlbGVtZW50XSBEb20uZXZlbnRcbiAgZW5kXG5cbmFuZCBbJ2FdIGN1c3RvbUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbZWxlbWVudCwgJ2FdIERvbS5jdXN0b21FdmVudFxuICBlbmRcblxuYW5kIGZvY3VzRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgcmVsYXRlZFRhcmdldCA6IGVsZW1lbnQgdCBvcHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBtb3VzZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHJlbGF0ZWRUYXJnZXQgOiBlbGVtZW50IHQgb3B0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50WCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50WSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuWCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuWSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0WCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0WSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3RybEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2hpZnRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsdEtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWV0YUtleSA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYnV0dG9uIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aGljaCA6IG1vdXNlX2J1dHRvbiBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZyb21FbGVtZW50IDogZWxlbWVudCB0IG9wdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRvRWxlbWVudCA6IGVsZW1lbnQgdCBvcHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYWdlWCA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VZIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQga2V5Ym9hcmRFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBhbHRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNoaWZ0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdHJsS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZXRhS2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsb2NhdGlvbiA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qga2V5IDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb2RlIDoganNfc3RyaW5nIHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aGljaCA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJDb2RlIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qga2V5Q29kZSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0TW9kaWZpZXJTdGF0ZSA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2Qga2V5SWRlbnRpZmllciA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgbW91c2V3aGVlbEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgKCogQWxsIG1vZGVybiBicm93c2VycyAqKVxuICAgIGluaGVyaXQgbW91c2VFdmVudFxuXG4gICAgbWV0aG9kIHdoZWVsRGVsdGEgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdoZWVsRGVsdGFYIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2hlZWxEZWx0YVkgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZWx0YVggOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGVsdGFZIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRlbHRhWiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZWx0YU1vZGUgOiBkZWx0YV9tb2RlIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBtb3VzZVNjcm9sbEV2ZW50ID1cbiAgb2JqZWN0XG4gICAgKCogRmlyZWZveCAqKVxuICAgIGluaGVyaXQgbW91c2VFdmVudFxuXG4gICAgbWV0aG9kIGRldGFpbCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXhpcyA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9IT1JJWk9OVEFMX0FYSVMgOiBpbnQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVElDQUxfQVhJUyA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHRvdWNoRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgdG91Y2hlcyA6IHRvdWNoTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YXJnZXRUb3VjaGVzIDogdG91Y2hMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNoYW5nZWRUb3VjaGVzIDogdG91Y2hMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN0cmxLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNoaWZ0S2V5IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbHRLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1ldGFLZXkgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlbGF0ZWRUYXJnZXQgOiBlbGVtZW50IHQgb3B0IG9wdGRlZiByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgdG91Y2hMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiB0b3VjaCB0IG9wdGRlZiBtZXRoXG4gIGVuZFxuXG5hbmQgdG91Y2ggPVxuICBvYmplY3RcbiAgICBtZXRob2QgaWRlbnRpZmllciA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGFyZ2V0IDogZWxlbWVudCB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuWCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuWSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50WCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50WSA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFnZVggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhZ2VZIDogaW50IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBzdWJtaXRFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBzdWJtaXR0ZXIgOiBlbGVtZW50IHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBkcmFnRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG1vdXNlRXZlbnRcblxuICAgIG1ldGhvZCBkYXRhVHJhbnNmZXIgOiBkYXRhVHJhbnNmZXIgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgY2xpcGJvYXJkRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2QgY2xpcGJvYXJkRGF0YSA6IGRhdGFUcmFuc2ZlciB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBkYXRhVHJhbnNmZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZHJvcEVmZmVjdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBlZmZlY3RBbGxvd2VkIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZpbGVzIDogRmlsZS5maWxlTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0eXBlcyA6IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFkZEVsZW1lbnQgOiBlbGVtZW50IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJEYXRhIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJEYXRhX2FsbCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldERhdGEgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RGF0YSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldERyYWdJbWFnZSA6IGVsZW1lbnQgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuYW5kIGV2ZW50VGFyZ2V0ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBtZXRob2Qgb25jbGljayA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kYmxjbGljayA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tb3VzZWRvd24gOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubW91c2V1cCA6ICgnc2VsZiB0LCBtb3VzZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25tb3VzZW92ZXIgOiAoJ3NlbGYgdCwgbW91c2VFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ubW91c2Vtb3ZlIDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1vdXNlb3V0IDogKCdzZWxmIHQsIG1vdXNlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmtleXByZXNzIDogKCdzZWxmIHQsIGtleWJvYXJkRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmtleWRvd24gOiAoJ3NlbGYgdCwga2V5Ym9hcmRFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ua2V5dXAgOiAoJ3NlbGYgdCwga2V5Ym9hcmRFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc2Nyb2xsIDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb253aGVlbCA6ICgnc2VsZiB0LCBtb3VzZXdoZWVsRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWdzdGFydCA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWdlbmQgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnZW50ZXIgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcmFnb3ZlciA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWdsZWF2ZSA6ICgnc2VsZiB0LCBkcmFnRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmRyYWcgOiAoJ3NlbGYgdCwgZHJhZ0V2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25kcm9wIDogKCdzZWxmIHQsIGRyYWdFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uYW5pbWF0aW9uc3RhcnQgOiAoJ3NlbGYgdCwgYW5pbWF0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmFuaW1hdGlvbmVuZCA6ICgnc2VsZiB0LCBhbmltYXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uYW5pbWF0aW9uaXRlcmF0aW9uIDpcbiAgICAgICgnc2VsZiB0LCBhbmltYXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uYW5pbWF0aW9uY2FuY2VsIDogKCdzZWxmIHQsIGFuaW1hdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb250cmFuc2l0aW9ucnVuIDogKCdzZWxmIHQsIHRyYW5zaXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9udHJhbnNpdGlvbnN0YXJ0IDogKCdzZWxmIHQsIHRyYW5zaXRpb25FdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9udHJhbnNpdGlvbmVuZCA6ICgnc2VsZiB0LCB0cmFuc2l0aW9uRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnRyYW5zaXRpb25jYW5jZWwgOiAoJ3NlbGYgdCwgdHJhbnNpdGlvbkV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25nb3Rwb2ludGVyY2FwdHVyZSA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvc3Rwb2ludGVyY2FwdHVyZSA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJlbnRlciA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJjYW5jZWwgOiAoJ3NlbGYgdCwgcG9pbnRlckV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wb2ludGVyZG93biA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJsZWF2ZSA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJtb3ZlIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcm91dCA6ICgnc2VsZiB0LCBwb2ludGVyRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBvaW50ZXJvdmVyIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucG9pbnRlcnVwIDogKCdzZWxmIHQsIHBvaW50ZXJFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRpc3BhdGNoRXZlbnQgOiBldmVudCB0IC0+IGJvb2wgdCBtZXRoXG4gIGVuZFxuXG5hbmQgcG9wU3RhdGVFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBzdGF0ZSA6IEpzLlVuc2FmZS5hbnkgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHBvaW50ZXJFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgbW91c2VFdmVudFxuXG4gICAgbWV0aG9kIHBvaW50ZXJJZCA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZXNzdXJlIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhbmdlbnRpYWxQcmVzc3VyZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aWx0WCA6IGludCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGlsdFkgOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHR3aXN0IDogaW50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwb2ludGVyVHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpc1ByaW1hcnkgOiBib29sIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHN0b3JhZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBrZXkgOiBqc19zdHJpbmcgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9sZFZhbHVlIDoganNfc3RyaW5nIHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuZXdWYWx1ZSA6IGpzX3N0cmluZyB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXJsIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0b3JhZ2VBcmVhIDogc3RvcmFnZSB0IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgc3RvcmFnZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGtleSA6IGludCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEl0ZW0gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEl0ZW0gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCByZW1vdmVJdGVtIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXIgOiB1bml0IG1ldGhcbiAgZW5kXG5cbmFuZCBoYXNoQ2hhbmdlRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG5cbiAgICBtZXRob2Qgb2xkVVJMIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5ld1VSTCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBhbmltYXRpb25FdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBhbmltYXRpb25OYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVsYXBzZWRUaW1lIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBzZXVkb0VsZW1lbnQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgdHJhbnNpdGlvbkV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIHByb3BlcnR5TmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbGFwc2VkVGltZSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwc2V1ZG9FbGVtZW50IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIG1lZGlhRXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGV2ZW50XG4gIGVuZFxuXG5hbmQgbWVzc2FnZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIGRhdGEgOiBVbnNhZmUuYW55IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc291cmNlIDogVW5zYWZlLmFueSBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIG5vZGVTZWxlY3RvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBxdWVyeVNlbGVjdG9yIDoganNfc3RyaW5nIHQgLT4gZWxlbWVudCB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgcXVlcnlTZWxlY3RvckFsbCA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgRG9tLm5vZGVMaXN0IHQgbWV0aFxuICBlbmRcblxuYW5kIHRva2VuTGlzdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4ganNfc3RyaW5nIHQgb3B0ZGVmIG1ldGhcblxuICAgIG1ldGhvZCBjb250YWlucyA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgYWRkIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdG9nZ2xlIDoganNfc3RyaW5nIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJpbmdpZmllciA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmFuZCBlbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBEb20uZWxlbWVudFxuXG4gICAgaW5oZXJpdCBub2RlU2VsZWN0b3JcblxuICAgIG1ldGhvZCBpZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0aXRsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBsYW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRpciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjbGFzc05hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xhc3NMaXN0IDogdG9rZW5MaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsb3Nlc3QgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBzdHlsZSA6IGNzc1N0eWxlRGVjbGFyYXRpb24gdCBwcm9wXG5cbiAgICBtZXRob2QgaW5uZXJIVE1MIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG91dGVySFRNTCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0Q29udGVudCA6IGpzX3N0cmluZyB0IG9wdCBwcm9wXG5cbiAgICBtZXRob2QgaW5uZXJUZXh0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudExlZnQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudFRvcCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xpZW50V2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsaWVudEhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0TGVmdCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0VG9wIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRQYXJlbnQgOiBlbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvZmZzZXRXaWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2Zmc2V0SGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JvbGxMZWZ0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzY3JvbGxUb3AgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbFdpZHRoIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzY3JvbGxIZWlnaHQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGdldENsaWVudFJlY3RzIDogY2xpZW50UmVjdExpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IDogY2xpZW50UmVjdCB0IG1ldGhcblxuICAgIG1ldGhvZCBzY3JvbGxJbnRvVmlldyA6IGJvb2wgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGljayA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZvY3VzIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmx1ciA6IHVuaXQgbWV0aFxuXG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuICBlbmRcblxuYW5kIGNsaWVudFJlY3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdG9wIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJpZ2h0IDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJvdHRvbSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsZWZ0IDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogZmxvYXQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBmbG9hdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGNsaWVudFJlY3RMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXRlbSA6IGludCAtPiBjbGllbnRSZWN0IHQgb3B0IG1ldGhcbiAgZW5kXG5cbmxldCBub19oYW5kbGVyIDogKCdhLCAnYikgZXZlbnRfbGlzdGVuZXIgPSBEb20ubm9faGFuZGxlclxuXG5sZXQgaGFuZGxlciA9IERvbS5oYW5kbGVyXG5cbmxldCBmdWxsX2hhbmRsZXIgPSBEb20uZnVsbF9oYW5kbGVyXG5cbmxldCBpbnZva2VfaGFuZGxlciA9IERvbS5pbnZva2VfaGFuZGxlclxuXG5tb2R1bGUgRXZlbnQgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0eXAgPSAnYSBEb20uRXZlbnQudHlwXG5cbiAgbGV0IGNsaWNrID0gRG9tLkV2ZW50Lm1ha2UgXCJjbGlja1wiXG5cbiAgbGV0IGNvcHkgPSBEb20uRXZlbnQubWFrZSBcImNvcHlcIlxuXG4gIGxldCBjdXQgPSBEb20uRXZlbnQubWFrZSBcImN1dFwiXG5cbiAgbGV0IHBhc3RlID0gRG9tLkV2ZW50Lm1ha2UgXCJwYXN0ZVwiXG5cbiAgbGV0IGRibGNsaWNrID0gRG9tLkV2ZW50Lm1ha2UgXCJkYmxjbGlja1wiXG5cbiAgbGV0IG1vdXNlZG93biA9IERvbS5FdmVudC5tYWtlIFwibW91c2Vkb3duXCJcblxuICBsZXQgbW91c2V1cCA9IERvbS5FdmVudC5tYWtlIFwibW91c2V1cFwiXG5cbiAgbGV0IG1vdXNlb3ZlciA9IERvbS5FdmVudC5tYWtlIFwibW91c2VvdmVyXCJcblxuICBsZXQgbW91c2Vtb3ZlID0gRG9tLkV2ZW50Lm1ha2UgXCJtb3VzZW1vdmVcIlxuXG4gIGxldCBtb3VzZW91dCA9IERvbS5FdmVudC5tYWtlIFwibW91c2VvdXRcIlxuXG4gIGxldCBrZXlwcmVzcyA9IERvbS5FdmVudC5tYWtlIFwia2V5cHJlc3NcIlxuXG4gIGxldCBrZXlkb3duID0gRG9tLkV2ZW50Lm1ha2UgXCJrZXlkb3duXCJcblxuICBsZXQga2V5dXAgPSBEb20uRXZlbnQubWFrZSBcImtleXVwXCJcblxuICBsZXQgbW91c2V3aGVlbCA9IERvbS5FdmVudC5tYWtlIFwibW91c2V3aGVlbFwiXG5cbiAgbGV0IHdoZWVsID0gRG9tLkV2ZW50Lm1ha2UgXCJ3aGVlbFwiXG5cbiAgbGV0IF9ET01Nb3VzZVNjcm9sbCA9IERvbS5FdmVudC5tYWtlIFwiRE9NTW91c2VTY3JvbGxcIlxuXG4gIGxldCB0b3VjaHN0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJ0b3VjaHN0YXJ0XCJcblxuICBsZXQgdG91Y2htb3ZlID0gRG9tLkV2ZW50Lm1ha2UgXCJ0b3VjaG1vdmVcIlxuXG4gIGxldCB0b3VjaGVuZCA9IERvbS5FdmVudC5tYWtlIFwidG91Y2hlbmRcIlxuXG4gIGxldCB0b3VjaGNhbmNlbCA9IERvbS5FdmVudC5tYWtlIFwidG91Y2hjYW5jZWxcIlxuXG4gIGxldCBkcmFnc3RhcnQgPSBEb20uRXZlbnQubWFrZSBcImRyYWdzdGFydFwiXG5cbiAgbGV0IGRyYWdlbmQgPSBEb20uRXZlbnQubWFrZSBcImRyYWdlbmRcIlxuXG4gIGxldCBkcmFnZW50ZXIgPSBEb20uRXZlbnQubWFrZSBcImRyYWdlbnRlclwiXG5cbiAgbGV0IGRyYWdvdmVyID0gRG9tLkV2ZW50Lm1ha2UgXCJkcmFnb3ZlclwiXG5cbiAgbGV0IGRyYWdsZWF2ZSA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ2xlYXZlXCJcblxuICBsZXQgZHJhZyA9IERvbS5FdmVudC5tYWtlIFwiZHJhZ1wiXG5cbiAgbGV0IGRyb3AgPSBEb20uRXZlbnQubWFrZSBcImRyb3BcIlxuXG4gIGxldCBoYXNoY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJoYXNoY2hhbmdlXCJcblxuICBsZXQgY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJjaGFuZ2VcIlxuXG4gIGxldCBpbnB1dCA9IERvbS5FdmVudC5tYWtlIFwiaW5wdXRcIlxuXG4gIGxldCB0aW1ldXBkYXRlID0gRG9tLkV2ZW50Lm1ha2UgXCJ0aW1ldXBkYXRlXCJcblxuICBsZXQgc3VibWl0ID0gRG9tLkV2ZW50Lm1ha2UgXCJzdWJtaXRcIlxuXG4gIGxldCBzY3JvbGwgPSBEb20uRXZlbnQubWFrZSBcInNjcm9sbFwiXG5cbiAgbGV0IGZvY3VzID0gRG9tLkV2ZW50Lm1ha2UgXCJmb2N1c1wiXG5cbiAgbGV0IGJsdXIgPSBEb20uRXZlbnQubWFrZSBcImJsdXJcIlxuXG4gIGxldCBsb2FkID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2FkXCJcblxuICBsZXQgdW5sb2FkID0gRG9tLkV2ZW50Lm1ha2UgXCJ1bmxvYWRcIlxuXG4gIGxldCBiZWZvcmV1bmxvYWQgPSBEb20uRXZlbnQubWFrZSBcImJlZm9yZXVubG9hZFwiXG5cbiAgbGV0IHJlc2l6ZSA9IERvbS5FdmVudC5tYWtlIFwicmVzaXplXCJcblxuICBsZXQgb3JpZW50YXRpb25jaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcIm9yaWVudGF0aW9uY2hhbmdlXCJcblxuICBsZXQgcG9wc3RhdGUgPSBEb20uRXZlbnQubWFrZSBcInBvcHN0YXRlXCJcblxuICBsZXQgZXJyb3IgPSBEb20uRXZlbnQubWFrZSBcImVycm9yXCJcblxuICBsZXQgYWJvcnQgPSBEb20uRXZlbnQubWFrZSBcImFib3J0XCJcblxuICBsZXQgc2VsZWN0ID0gRG9tLkV2ZW50Lm1ha2UgXCJzZWxlY3RcIlxuXG4gIGxldCBvbmxpbmUgPSBEb20uRXZlbnQubWFrZSBcIm9ubGluZVwiXG5cbiAgbGV0IG9mZmxpbmUgPSBEb20uRXZlbnQubWFrZSBcIm9mZmxpbmVcIlxuXG4gIGxldCBjaGVja2luZyA9IERvbS5FdmVudC5tYWtlIFwiY2hlY2tpbmdcIlxuXG4gIGxldCBub3VwZGF0ZSA9IERvbS5FdmVudC5tYWtlIFwibm91cGRhdGVcIlxuXG4gIGxldCBkb3dubG9hZGluZyA9IERvbS5FdmVudC5tYWtlIFwiZG93bmxvYWRpbmdcIlxuXG4gIGxldCBwcm9ncmVzcyA9IERvbS5FdmVudC5tYWtlIFwicHJvZ3Jlc3NcIlxuXG4gIGxldCB1cGRhdGVyZWFkeSA9IERvbS5FdmVudC5tYWtlIFwidXBkYXRlcmVhZHlcIlxuXG4gIGxldCBjYWNoZWQgPSBEb20uRXZlbnQubWFrZSBcImNhY2hlZFwiXG5cbiAgbGV0IG9ic29sZXRlID0gRG9tLkV2ZW50Lm1ha2UgXCJvYnNvbGV0ZVwiXG5cbiAgbGV0IGRvbUNvbnRlbnRMb2FkZWQgPSBEb20uRXZlbnQubWFrZSBcIkRPTUNvbnRlbnRMb2FkZWRcIlxuXG4gIGxldCBhbmltYXRpb25zdGFydCA9IERvbS5FdmVudC5tYWtlIFwiYW5pbWF0aW9uc3RhcnRcIlxuXG4gIGxldCBhbmltYXRpb25lbmQgPSBEb20uRXZlbnQubWFrZSBcImFuaW1hdGlvbmVuZFwiXG5cbiAgbGV0IGFuaW1hdGlvbml0ZXJhdGlvbiA9IERvbS5FdmVudC5tYWtlIFwiYW5pbWF0aW9uaXRlcmF0aW9uXCJcblxuICBsZXQgYW5pbWF0aW9uY2FuY2VsID0gRG9tLkV2ZW50Lm1ha2UgXCJhbmltYXRpb25jYW5jZWxcIlxuXG4gIGxldCB0cmFuc2l0aW9ucnVuID0gRG9tLkV2ZW50Lm1ha2UgXCJ0cmFuc2l0aW9ucnVuXCJcblxuICBsZXQgdHJhbnNpdGlvbnN0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJ0cmFuc2l0aW9uc3RhcnRcIlxuXG4gIGxldCB0cmFuc2l0aW9uZW5kID0gRG9tLkV2ZW50Lm1ha2UgXCJ0cmFuc2l0aW9uZW5kXCJcblxuICBsZXQgdHJhbnNpdGlvbmNhbmNlbCA9IERvbS5FdmVudC5tYWtlIFwidHJhbnNpdGlvbmNhbmNlbFwiXG5cbiAgbGV0IGNhbnBsYXkgPSBEb20uRXZlbnQubWFrZSBcImNhbnBsYXlcIlxuXG4gIGxldCBjYW5wbGF5dGhyb3VnaCA9IERvbS5FdmVudC5tYWtlIFwiY2FucGxheXRocm91Z2hcIlxuXG4gIGxldCBkdXJhdGlvbmNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwiZHVyYXRpb25jaGFuZ2VcIlxuXG4gIGxldCBlbXB0aWVkID0gRG9tLkV2ZW50Lm1ha2UgXCJlbXB0aWVkXCJcblxuICBsZXQgZW5kZWQgPSBEb20uRXZlbnQubWFrZSBcImVuZGVkXCJcblxuICBsZXQgZ290cG9pbnRlcmNhcHR1cmUgPSBEb20uRXZlbnQubWFrZSBcImdvdHBvaW50ZXJjYXB0dXJlXCJcblxuICBsZXQgbG9hZGVkZGF0YSA9IERvbS5FdmVudC5tYWtlIFwibG9hZGVkZGF0YVwiXG5cbiAgbGV0IGxvYWRlZG1ldGFkYXRhID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2FkZWRtZXRhZGF0YVwiXG5cbiAgbGV0IGxvYWRzdGFydCA9IERvbS5FdmVudC5tYWtlIFwibG9hZHN0YXJ0XCJcblxuICBsZXQgbG9zdHBvaW50ZXJjYXB0dXJlID0gRG9tLkV2ZW50Lm1ha2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIlxuXG4gIGxldCBtZXNzYWdlID0gRG9tLkV2ZW50Lm1ha2UgXCJtZXNzYWdlXCJcblxuICBsZXQgcGF1c2UgPSBEb20uRXZlbnQubWFrZSBcInBhdXNlXCJcblxuICBsZXQgcGxheSA9IERvbS5FdmVudC5tYWtlIFwicGxheVwiXG5cbiAgbGV0IHBsYXlpbmcgPSBEb20uRXZlbnQubWFrZSBcInBsYXlpbmdcIlxuXG4gIGxldCBwb2ludGVyZW50ZXIgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJlbnRlclwiXG5cbiAgbGV0IHBvaW50ZXJjYW5jZWwgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJjYW5jZWxcIlxuXG4gIGxldCBwb2ludGVyZG93biA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcmRvd25cIlxuXG4gIGxldCBwb2ludGVybGVhdmUgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJsZWF2ZVwiXG5cbiAgbGV0IHBvaW50ZXJtb3ZlID0gRG9tLkV2ZW50Lm1ha2UgXCJwb2ludGVybW92ZVwiXG5cbiAgbGV0IHBvaW50ZXJvdXQgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJvdXRcIlxuXG4gIGxldCBwb2ludGVyb3ZlciA9IERvbS5FdmVudC5tYWtlIFwicG9pbnRlcm92ZXJcIlxuXG4gIGxldCBwb2ludGVydXAgPSBEb20uRXZlbnQubWFrZSBcInBvaW50ZXJ1cFwiXG5cbiAgbGV0IHJhdGVjaGFuZ2UgPSBEb20uRXZlbnQubWFrZSBcInJhdGVjaGFuZ2VcIlxuXG4gIGxldCBzZWVrZWQgPSBEb20uRXZlbnQubWFrZSBcInNlZWtlZFwiXG5cbiAgbGV0IHNlZWtpbmcgPSBEb20uRXZlbnQubWFrZSBcInNlZWtpbmdcIlxuXG4gIGxldCBzdGFsbGVkID0gRG9tLkV2ZW50Lm1ha2UgXCJzdGFsbGVkXCJcblxuICBsZXQgc3VzcGVuZCA9IERvbS5FdmVudC5tYWtlIFwic3VzcGVuZFwiXG5cbiAgbGV0IHZvbHVtZWNoYW5nZSA9IERvbS5FdmVudC5tYWtlIFwidm9sdW1lY2hhbmdlXCJcblxuICBsZXQgd2FpdGluZyA9IERvbS5FdmVudC5tYWtlIFwid2FpdGluZ1wiXG5cbiAgbGV0IG1ha2UgPSBEb20uRXZlbnQubWFrZVxuZW5kXG5cbnR5cGUgZXZlbnRfbGlzdGVuZXJfaWQgPSBEb20uZXZlbnRfbGlzdGVuZXJfaWRcblxubGV0IGFkZEV2ZW50TGlzdGVuZXIgPSBEb20uYWRkRXZlbnRMaXN0ZW5lclxuXG5sZXQgYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zID0gRG9tLmFkZEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9uc1xuXG5sZXQgcmVtb3ZlRXZlbnRMaXN0ZW5lciA9IERvbS5yZW1vdmVFdmVudExpc3RlbmVyXG5cbmxldCBjcmVhdGVDdXN0b21FdmVudCA9IERvbS5jcmVhdGVDdXN0b21FdmVudFxuXG5jbGFzcyB0eXBlIFsnbm9kZV0gY29sbGVjdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGl0ZW0gOiBpbnQgLT4gJ25vZGUgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIG5hbWVkSXRlbSA6IGpzX3N0cmluZyB0IC0+ICdub2RlIHQgb3B0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaHRtbEVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgaGVhZEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBwcm9maWxlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBsaW5rRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBjaGFyc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNyb3Nzb3JpZ2luIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhyZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHJlZmxhbmcgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWVkaWEgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVsIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJldiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRpdGxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHRleHQgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG1ldGFFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY29udGVudCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBodHRwRXF1aXYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzY2hlbWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGJhc2VFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgaHJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHN0eWxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBtZWRpYSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYm9keUVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgZm9ybUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBlbGVtZW50cyA6IGVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2VwdENoYXJzZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGVuY3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX21ldGhvZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3VibWl0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVzZXQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBvbnN1Ym1pdCA6ICgnc2VsZiB0LCBzdWJtaXRFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBvcHRHcm91cEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbGFiZWwgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG9wdGlvbkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG9wdEdyb3VwRWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGVmYXVsdFNlbGVjdGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0IDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGluZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWxlY3RlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHNlbGVjdEVsZW1lbnQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGVkSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvcHRpb25zIDogb3B0aW9uRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBtdWx0aXBsZSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzaXplIDogaW50IHByb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgYWRkIDogI29wdEdyb3VwRWxlbWVudCB0IC0+ICNvcHRHcm91cEVsZW1lbnQgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlIDogaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcXVpcmVkIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25jaGFuZ2UgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uaW5wdXQgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBpbnB1dEVsZW1lbnQgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGRlZmF1bHRWYWx1ZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkZWZhdWx0Q2hlY2tlZCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2VwdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWx0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoZWNrZWQgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBtYXhMZW5ndGggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZE9ubHkgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlcXVpcmVkIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2l6ZSA6IGludCBwcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1c2VNYXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmlsZXMgOiBGaWxlLmZpbGVMaXN0IHQgb3B0ZGVmIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwbGFjZWhvbGRlciA6IGpzX3N0cmluZyB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uRGlyZWN0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdGlvblN0YXJ0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25FbmQgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIG9uc2VsZWN0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmNoYW5nZSA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25pbnB1dCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25ibHVyIDogKCdzZWxmIHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZm9jdXMgOiAoJ3NlbGYgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRleHRBcmVhRWxlbWVudCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZGVmYXVsdFZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbHMgOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWRPbmx5IDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCByb3dzIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25EaXJlY3Rpb24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2VsZWN0aW9uRW5kIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzZWxlY3Rpb25TdGFydCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNlbGVjdCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlcXVpcmVkIDogYm9vbCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGxhY2Vob2xkZXIgOiBqc19zdHJpbmcgdCB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc2VsZWN0IDogKCdzZWxmIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmNoYW5nZSA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25pbnB1dCA6ICgnc2VsZiB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25ibHVyIDogKCdzZWxmIHQsIGZvY3VzRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZm9jdXMgOiAoJ3NlbGYgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGJ1dHRvbkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkaXNhYmxlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0YWJJbmRleCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdmFsdWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGxhYmVsRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWNjZXNzS2V5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGh0bWxGb3IgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGZpZWxkU2V0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGZvcm0gOiBmb3JtRWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGxlZ2VuZEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBmb3JtIDogZm9ybUVsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY2Vzc0tleSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdUxpc3RFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIG9MaXN0RWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBkTGlzdEVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgbGlFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGRpdkVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgcGFyYWdyYXBoRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBoZWFkaW5nRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBxdW90ZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjaXRlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwcmVFbGVtZW50ID0gZWxlbWVudFxuXG5jbGFzcyB0eXBlIGJyRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSBockVsZW1lbnQgPSBlbGVtZW50XG5cbmNsYXNzIHR5cGUgbW9kRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNpdGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGF0ZVRpbWUgOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGFuY2hvckVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hhcnNldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb29yZHMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaHJlZiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBocmVmbGFuZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlbCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZXYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhcGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgaW1hZ2VFbGVtZW50ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhbHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHVzZU1hcCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBpc01hcCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgbmF0dXJhbFdpZHRoIDogaW50IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmF0dXJhbEhlaWdodCA6IGludCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbXBsZXRlIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBvbmxvYWQgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uYWJvcnQgOiAoJ3NlbGYgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBvYmplY3RFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZm9ybSA6IGZvcm1FbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb2RlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFyY2hpdmUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29kZUJhc2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29kZVR5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGF0YSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBkZWNsYXJlIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdGFuZGJ5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRhYkluZGV4IDogaW50IHByb3BcblxuICAgIG1ldGhvZCBfdHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB1c2VNYXAgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZG9jdW1lbnQgOiBEb20uZWxlbWVudCBEb20uZG9jdW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwYXJhbUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlVHlwZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgYXJlYUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBhY2Nlc3NLZXkgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYWx0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvb3JkcyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBocmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5vSHJlZiA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhcGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdGFiSW5kZXggOiBpbnQgcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbWFwRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGFyZWFzIDogYXJlYUVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBzY3JpcHRFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgdGV4dCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjaGFyc2V0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRlZmVyIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX3R5cGUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYXN5bmMgOiBib29sIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBlbWJlZEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB0YWJsZUNlbGxFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgY2VsbEluZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhYmJyIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGF4aXMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hPZmYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29sU3BhbiA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgaGVhZGVycyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByb3dTcGFuIDogaW50IHByb3BcblxuICAgIG1ldGhvZCBzY29wZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB2QWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHRhYmxlUm93RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIHJvd0luZGV4IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWN0aW9uUm93SW5kZXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNlbGxzIDogdGFibGVDZWxsRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNoT2ZmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBpbnNlcnRDZWxsIDogaW50IC0+IHRhYmxlQ2VsbEVsZW1lbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlQ2VsbCA6IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGFibGVDb2xFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hPZmYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3BhbiA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgdkFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSB0YWJsZVNlY3Rpb25FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgYWxpZ24gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2hPZmYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgdkFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJvd3MgOiB0YWJsZVJvd0VsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbnNlcnRSb3cgOiBpbnQgLT4gdGFibGVSb3dFbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVJvdyA6IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGFibGVDYXB0aW9uRWxlbWVudCA9IGVsZW1lbnRcblxuY2xhc3MgdHlwZSB0YWJsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjYXB0aW9uIDogdGFibGVDYXB0aW9uRWxlbWVudCB0IHByb3BcblxuICAgIG1ldGhvZCB0SGVhZCA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCBwcm9wXG5cbiAgICBtZXRob2QgdEZvb3QgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgcHJvcFxuXG4gICAgbWV0aG9kIHJvd3MgOiB0YWJsZVJvd0VsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0Qm9kaWVzIDogdGFibGVTZWN0aW9uRWxlbWVudCBjb2xsZWN0aW9uIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsaWduIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJvcmRlciA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjZWxsUGFkZGluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjZWxsU3BhY2luZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBmcmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBydWxlcyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzdW1tYXJ5IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNyZWF0ZVRIZWFkIDogdGFibGVTZWN0aW9uRWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVUSGVhZCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVRGb290IDogdGFibGVTZWN0aW9uRWxlbWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVURm9vdCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUNhcHRpb24gOiB0YWJsZUNhcHRpb25FbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUNhcHRpb24gOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpbnNlcnRSb3cgOiBpbnQgLT4gdGFibGVSb3dFbGVtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVJvdyA6IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdGltZVJhbmdlcyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsZW5ndGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXJ0IDogaW50IC0+IGZsb2F0IG1ldGhcblxuICAgIG1ldGhvZCBlbmRfIDogaW50IC0+IGZsb2F0IG1ldGhcbiAgZW5kXG5cbnR5cGUgbmV0d29ya1N0YXRlID1cbiAgfCBORVRXT1JLX0VNUFRZXG4gIHwgTkVUV09SS19JRExFXG4gIHwgTkVUV09SS19MT0FESU5HXG4gIHwgTkVUV09SS19OT19TT1VSQ0VcblxudHlwZSByZWFkeVN0YXRlID1cbiAgfCBIQVZFX05PVEhJTkdcbiAgfCBIQVZFX01FVEFEQVRBXG4gIHwgSEFWRV9DVVJSRU5UX0RBVEFcbiAgfCBIQVZFX0ZVVFVSRV9EQVRBXG4gIHwgSEFWRV9FTk9VR0hfREFUQVxuXG4oKiBodHRwOi8vd3d3Lnczc2Nob29scy5jb20vdGFncy9yZWZfYXZfZG9tLmFzcCAqKVxuKCogb25seSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgYWxsIGJyb3dzZXIuIChJRTkrKSAqKVxuY2xhc3MgdHlwZSBtZWRpYUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCBjYW5QbGF5VHlwZSA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBsb2FkIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcGxheSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHBhdXNlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXV0b3BsYXkgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGJ1ZmZlcmVkIDogdGltZVJhbmdlcyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250cm9scyA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgY3VycmVudFNyYyA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdXJyZW50VGltZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBkdXJhdGlvbiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbmRlZCA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbG9vcCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbWVkaWFncm91cCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtdXRlZCA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgbmV0d29ya1N0YXRlX2ludCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmV0d29ya1N0YXRlIDogbmV0d29ya1N0YXRlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXVzZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBsYXliYWNrUmF0ZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBwbGF5ZWQgOiB0aW1lUmFuZ2VzIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZWxvYWQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZV9pbnQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGUgOiByZWFkeVN0YXRlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzZWVrYWJsZSA6IHRpbWVSYW5nZXMgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2Vla2luZyA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3JjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZvbHVtZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBvbmNhbnBsYXkgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uY2FucGxheXRocm91Z2ggOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZHVyYXRpb25jaGFuZ2UgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZW1wdGllZCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25lbmRlZCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25sb2FkZWRkYXRhIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvYWRlZG1ldGFkYXRhIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbmxvYWRzdGFydCA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wYXVzZSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25wbGF5IDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnBsYXlpbmcgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ucmF0ZWNoYW5nZSA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zZWVrZWQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uc2Vla2luZyA6ICgnc2VsZiB0LCBtZWRpYUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25zdGFsbGVkIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbnN1c3BlbmQgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9udm9sdW1lY2hhbmdlIDogKCdzZWxmIHQsIG1lZGlhRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbndhaXRpbmcgOiAoJ3NlbGYgdCwgbWVkaWFFdmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBhdWRpb0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG1lZGlhRWxlbWVudFxuICBlbmRcblxuY2xhc3MgdHlwZSB2aWRlb0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IG1lZGlhRWxlbWVudFxuICBlbmRcblxudHlwZSBjb250ZXh0ID0ganNfc3RyaW5nIHRcblxubGV0IF8yZF8gPSBKcy5zdHJpbmcgXCIyZFwiXG5cbnR5cGUgY2FudmFzUGF0dGVyblxuXG5jbGFzcyB0eXBlIGNhbnZhc0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIG1ldGhvZCB3aWR0aCA6IGludCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogaW50IHByb3BcblxuICAgIG1ldGhvZCB0b0RhdGFVUkwgOiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9EYXRhVVJMX3R5cGUgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9EYXRhVVJMX3R5cGVfY29tcHJlc3Npb24gOiBqc19zdHJpbmcgdCAtPiBmbG9hdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q29udGV4dCA6IGpzX3N0cmluZyB0IC0+IGNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB0IG1ldGhcbiAgZW5kXG5cbmFuZCBjYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY2FudmFzIDogY2FudmFzRWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzYXZlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVzdG9yZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNjYWxlIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgcm90YXRlIDogZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdHJhbnNsYXRlIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdHJhbnNmb3JtIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VHJhbnNmb3JtIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2xvYmFsQWxwaGEgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHN0cm9rZVN0eWxlIDoganNfc3RyaW5nIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdHJva2VTdHlsZV9ncmFkaWVudCA6IGNhbnZhc0dyYWRpZW50IHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdHJva2VTdHlsZV9wYXR0ZXJuIDogY2FudmFzUGF0dGVybiB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsbFN0eWxlIDoganNfc3RyaW5nIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWxsU3R5bGVfZ3JhZGllbnQgOiBjYW52YXNHcmFkaWVudCB0IHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsbFN0eWxlX3BhdHRlcm4gOiBjYW52YXNQYXR0ZXJuIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjcmVhdGVMaW5lYXJHcmFkaWVudCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBjYW52YXNHcmFkaWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVSYWRpYWxHcmFkaWVudCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBjYW52YXNHcmFkaWVudCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVQYXR0ZXJuIDogaW1hZ2VFbGVtZW50IHQgLT4ganNfc3RyaW5nIHQgLT4gY2FudmFzUGF0dGVybiB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVQYXR0ZXJuX2Zyb21DYW52YXMgOlxuICAgICAgY2FudmFzRWxlbWVudCB0IC0+IGpzX3N0cmluZyB0IC0+IGNhbnZhc1BhdHRlcm4gdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUGF0dGVybl9mcm9tVmlkZW8gOiB2aWRlb0VsZW1lbnQgdCAtPiBqc19zdHJpbmcgdCAtPiBjYW52YXNQYXR0ZXJuIHQgbWV0aFxuXG4gICAgbWV0aG9kIGxpbmVXaWR0aCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBsaW5lQ2FwIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxpbmVKb2luIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1pdGVyTGltaXQgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhZG93T2Zmc2V0WCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBzaGFkb3dPZmZzZXRZIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHNoYWRvd0JsdXIgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2Qgc2hhZG93Q29sb3IgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY2xlYXJSZWN0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmlsbFJlY3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJva2VSZWN0IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmVnaW5QYXRoIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvc2VQYXRoIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbW92ZVRvIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbGluZVRvIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcXVhZHJhdGljQ3VydmVUbyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJlemllckN1cnZlVG8gOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhcmNUbyA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlY3QgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhcmMgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmlsbCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0cm9rZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsaXAgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBpc1BvaW50SW5QYXRoIDogZmxvYXQgLT4gZmxvYXQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3Rm9jdXNSaW5nIDogI2VsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBib29sIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBmb250IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHRleHRBbGlnbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0ZXh0QmFzZWxpbmUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZmlsbFRleHQgOiBqc19zdHJpbmcgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmaWxsVGV4dF93aXRoV2lkdGggOiBqc19zdHJpbmcgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJva2VUZXh0IDoganNfc3RyaW5nIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Ryb2tlVGV4dF93aXRoV2lkdGggOiBqc19zdHJpbmcgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBtZWFzdXJlVGV4dCA6IGpzX3N0cmluZyB0IC0+IHRleHRNZXRyaWNzIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZSA6IGltYWdlRWxlbWVudCB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV93aXRoU2l6ZSA6XG4gICAgICBpbWFnZUVsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnVsbCA6XG4gICAgICAgICBpbWFnZUVsZW1lbnQgdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnJvbUNhbnZhcyA6IGNhbnZhc0VsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnJvbUNhbnZhc1dpdGhTaXplIDpcbiAgICAgIGNhbnZhc0VsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnVsbEZyb21DYW52YXMgOlxuICAgICAgICAgY2FudmFzRWxlbWVudCB0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdJbWFnZV9mcm9tVmlkZW9XaXRoVmlkZW8gOiB2aWRlb0VsZW1lbnQgdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBkcmF3SW1hZ2VfZnJvbVZpZGVvV2l0aFNpemUgOlxuICAgICAgdmlkZW9FbGVtZW50IHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZHJhd0ltYWdlX2Z1bGxGcm9tVmlkZW8gOlxuICAgICAgICAgdmlkZW9FbGVtZW50IHRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gZmxvYXRcbiAgICAgIC0+IGZsb2F0XG4gICAgICAtPiBmbG9hdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlSW1hZ2VEYXRhIDogaW50IC0+IGludCAtPiBpbWFnZURhdGEgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW1hZ2VEYXRhIDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gaW1hZ2VEYXRhIHQgbWV0aFxuXG4gICAgbWV0aG9kIHB1dEltYWdlRGF0YSA6IGltYWdlRGF0YSB0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuYW5kIGNhbnZhc0dyYWRpZW50ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFkZENvbG9yU3RvcCA6IGZsb2F0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuYW5kIHRleHRNZXRyaWNzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHdpZHRoIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIGltYWdlRGF0YSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB3aWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkYXRhIDogY2FudmFzUGl4ZWxBcnJheSB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBjYW52YXNQaXhlbEFycmF5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxlbmd0aCA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5leHRlcm5hbCBwaXhlbF9nZXQgOiBjYW52YXNQaXhlbEFycmF5IHQgLT4gaW50IC0+IGludCA9IFwiY2FtbF9qc19nZXRcIlxuXG5leHRlcm5hbCBwaXhlbF9zZXQgOiBjYW52YXNQaXhlbEFycmF5IHQgLT4gaW50IC0+IGludCAtPiB1bml0ID0gXCJjYW1sX2pzX3NldFwiXG5cbmNsYXNzIHR5cGUgcmFuZ2UgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY29sbGFwc2VkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGFydE9mZnNldCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZW5kT2Zmc2V0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGFydENvbnRhaW5lciA6IERvbS5ub2RlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGVuZENvbnRhaW5lciA6IERvbS5ub2RlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNldFN0YXJ0IDogRG9tLm5vZGUgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RW5kIDogRG9tLm5vZGUgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U3RhcnRCZWZvcmUgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldEVuZEJlZm9yZSA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U3RhcnRBZnRlciA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0RW5kQWZ0ZXIgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbGVjdE5vZGUgOiBEb20ubm9kZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbGVjdE5vZGVDb250ZW50cyA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29sbGFwc2UgOiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvbmVDb250ZW50cyA6IERvbS5kb2N1bWVudEZyYWdtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGV4dHJhY3RDb250ZW50cyA6IERvbS5kb2N1bWVudEZyYWdtZW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUNvbnRlbnRzIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5zZXJ0Tm9kZSA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3Vycm91bmRDb250ZW50cyA6IERvbS5ub2RlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvbmVSYW5nZSA6IHJhbmdlIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRvU3RyaW5nIDoganNfc3RyaW5nIHQgbWV0aFxuICBlbmRcblxuKCoqIEluZm9ybWF0aW9uIG9uIGN1cnJlbnQgc2VsZWN0aW9uICopXG5jbGFzcyB0eXBlIHNlbGVjdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhbmNob3JOb2RlIDogRG9tLm5vZGUgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYW5jaG9yT2Zmc2V0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmb2N1c05vZGUgOiBEb20ubm9kZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmb2N1c09mZnNldCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaXNDb2xsYXBzZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJhbmdlQ291bnQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldFJhbmdlQXQgOiBpbnQgLT4gcmFuZ2UgdCBtZXRoXG5cbiAgICBtZXRob2QgY29sbGFwc2UgOiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXh0ZW5kIDogRG9tLm5vZGUgdCAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbW9kaWZ5IDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29sbGFwc2VUb1N0YXJ0IDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29sbGFwc2VUb0VuZCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbGVjdEFsbENoaWxkcmVuIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhZGRSYW5nZSA6IHJhbmdlIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlUmFuZ2UgOiByYW5nZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbW92ZUFsbFJhbmdlcyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUZyb21Eb2N1bWVudCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbnRhaW5zTm9kZSA6IERvbS5ub2RlIHQgLT4gYm9vbCB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgdG9TdHJpbmcgOiBqc19zdHJpbmcgdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGRvY3VtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbZWxlbWVudF0gRG9tLmRvY3VtZW50XG5cbiAgICBpbmhlcml0IG5vZGVTZWxlY3RvclxuXG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIHRpdGxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHJlZmVycmVyIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRvbWFpbiA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBfVVJMIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlYWQgOiBoZWFkRWxlbWVudCB0IHByb3BcblxuICAgIG1ldGhvZCBib2R5IDogYm9keUVsZW1lbnQgdCBwcm9wXG5cbiAgICBtZXRob2QgZG9jdW1lbnRFbGVtZW50IDogaHRtbEVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW1hZ2VzIDogaW1hZ2VFbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXBwbGV0cyA6IGVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsaW5rcyA6IGVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmb3JtcyA6IGZvcm1FbGVtZW50IGNvbGxlY3Rpb24gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYW5jaG9ycyA6IGVsZW1lbnQgY29sbGVjdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb29raWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZGVzaWduTW9kZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvcGVuXyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsb3NlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgd3JpdGUgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBleGVjQ29tbWFuZCA6IGpzX3N0cmluZyB0IC0+IGJvb2wgdCAtPiBqc19zdHJpbmcgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlUmFuZ2UgOiByYW5nZSB0IG1ldGhcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgOiBqc19zdHJpbmcgdCAtPiBlbGVtZW50IERvbS5ub2RlTGlzdCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50c0J5TmFtZSA6IGpzX3N0cmluZyB0IC0+IGVsZW1lbnQgRG9tLm5vZGVMaXN0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGFjdGl2ZUVsZW1lbnQgOiBlbGVtZW50IHQgb3B0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoaWRkZW4gOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uZnVsbHNjcmVlbmNoYW5nZSA6IChkb2N1bWVudCB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ud2Via2l0ZnVsbHNjcmVlbmNoYW5nZSA6IChkb2N1bWVudCB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuICBlbmRcblxudHlwZSBpbnRlcnZhbF9pZFxuXG50eXBlIHRpbWVvdXRfaWRcblxudHlwZSBhbmltYXRpb25fZnJhbWVfcmVxdWVzdF9pZFxuXG5jbGFzcyB0eXBlIGxvY2F0aW9uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGhyZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcHJvdG9jb2wgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaG9zdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBob3N0bmFtZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBvcmlnaW4gOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBvcnQgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgcGF0aG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgc2VhcmNoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGhhc2ggOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgYXNzaWduIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHJlbG9hZCA6IHVuaXQgbWV0aFxuICBlbmRcblxubGV0IGxvY2F0aW9uX29yaWdpbiAobG9jIDogbG9jYXRpb24gdCkgPVxuICBPcHRkZWYuY2FzZVxuICAgIGxvYyMjLm9yaWdpblxuICAgIChmdW4gKCkgLT5cbiAgICAgIGxldCBwcm90b2NvbCA9IGxvYyMjLnByb3RvY29sIGluXG4gICAgICBsZXQgaG9zdG5hbWUgPSBsb2MjIy5ob3N0bmFtZSBpblxuICAgICAgbGV0IHBvcnQgPSBsb2MjIy5wb3J0IGluXG4gICAgICBpZiBwcm90b2NvbCMjLmxlbmd0aCA9IDAgJiYgaG9zdG5hbWUjIy5sZW5ndGggPSAwXG4gICAgICB0aGVuIEpzLnN0cmluZyBcIlwiXG4gICAgICBlbHNlXG4gICAgICAgIGxldCBvcmlnaW4gPSBwcm90b2NvbCMjY29uY2F0XzIgKEpzLnN0cmluZyBcIi8vXCIpIGhvc3RuYW1lIGluXG4gICAgICAgIGlmIHBvcnQjIy5sZW5ndGggPiAwIHRoZW4gb3JpZ2luIyNjb25jYXRfMiAoSnMuc3RyaW5nIFwiOlwiKSBsb2MjIy5wb3J0IGVsc2Ugb3JpZ2luKVxuICAgIChmdW4gbyAtPiBvKVxuXG5jbGFzcyB0eXBlIGhpc3RvcnkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdGF0ZSA6IEpzLlVuc2FmZS5hbnkgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdvIDogaW50IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiYWNrIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZm9yd2FyZCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHB1c2hTdGF0ZSA6ICdhLiAnYSAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVwbGFjZVN0YXRlIDogJ2EuICdhIC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmNsYXNzIHR5cGUgdW5kb01hbmFnZXIgPSBvYmplY3QgZW5kXG5cbmNsYXNzIHR5cGUgbmF2aWdhdG9yID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGFwcENvZGVOYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFwcE5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXBwVmVyc2lvbiA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb29raWVFbmFibGVkIDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbkxpbmUgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBsYXRmb3JtIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZlbmRvciA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1c2VyQWdlbnQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGFuZ3VhZ2UgOiBqc19zdHJpbmcgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVzZXJMYW5ndWFnZSA6IGpzX3N0cmluZyB0IG9wdGRlZiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbWF4VG91Y2hQb2ludHMgOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBzY3JlZW4gPVxuICBvYmplY3RcbiAgICBtZXRob2Qgd2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXZhaWxXaWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXZhaWxIZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBhcHBsaWNhdGlvbkNhY2hlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHN0YXR1cyA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXBkYXRlIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYWJvcnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzd2FwQ2FjaGUgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBvbmNoZWNraW5nIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uZXJyb3IgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25ub3VwZGF0ZSA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmRvd25sb2FkaW5nIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ucHJvZ3Jlc3MgOiAoYXBwbGljYXRpb25DYWNoZSB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb251cGRhdGVyZWFkeSA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmNhY2hlZCA6IChhcHBsaWNhdGlvbkNhY2hlIHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbm9ic29sZXRlIDogKGFwcGxpY2F0aW9uQ2FjaGUgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgaW5oZXJpdCBldmVudFRhcmdldFxuICBlbmRcblxuY2xhc3MgdHlwZSBfVVJMID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNyZWF0ZU9iamVjdFVSTCA6ICNGaWxlLmJsb2IgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgcmV2b2tlT2JqZWN0VVJMIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHdpbmRvdyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCBkb2N1bWVudCA6IGRvY3VtZW50IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFwcGxpY2F0aW9uQ2FjaGUgOiBhcHBsaWNhdGlvbkNhY2hlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbG9jYXRpb24gOiBsb2NhdGlvbiB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoaXN0b3J5IDogaGlzdG9yeSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB1bmRvTWFuYWdlciA6IHVuZG9NYW5hZ2VyIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5hdmlnYXRvciA6IG5hdmlnYXRvciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRTZWxlY3Rpb24gOiBzZWxlY3Rpb24gdCBtZXRoXG5cbiAgICBtZXRob2QgY2xvc2UgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbG9zZWQgOiBib29sIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0b3AgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmb2N1cyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsdXIgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzY3JvbGwgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNjcm9sbEJ5IDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXNzaW9uU3RvcmFnZSA6IHN0b3JhZ2UgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxvY2FsU3RvcmFnZSA6IHN0b3JhZ2UgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRvcCA6IHdpbmRvdyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwYXJlbnQgOiB3aW5kb3cgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZnJhbWVFbGVtZW50IDogZWxlbWVudCB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb3Blbl8gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgLT4gd2luZG93IHQgb3B0IG1ldGhcblxuICAgIG1ldGhvZCBhbGVydCA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbmZpcm0gOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHByb21wdCA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IG9wdCBtZXRoXG5cbiAgICBtZXRob2QgcHJpbnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRJbnRlcnZhbCA6ICh1bml0IC0+IHVuaXQpIEpzLmNhbGxiYWNrIC0+IGZsb2F0IC0+IGludGVydmFsX2lkIG1ldGhcblxuICAgIG1ldGhvZCBjbGVhckludGVydmFsIDogaW50ZXJ2YWxfaWQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VGltZW91dCA6ICh1bml0IC0+IHVuaXQpIEpzLmNhbGxiYWNrIC0+IGZsb2F0IC0+IHRpbWVvdXRfaWQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyVGltZW91dCA6IHRpbWVvdXRfaWQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDpcbiAgICAgIChmbG9hdCAtPiB1bml0KSBKcy5jYWxsYmFjayAtPiBhbmltYXRpb25fZnJhbWVfcmVxdWVzdF9pZCBtZXRoXG5cbiAgICBtZXRob2QgY2FuY2VsQW5pbWF0aW9uRnJhbWUgOiBhbmltYXRpb25fZnJhbWVfcmVxdWVzdF9pZCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzY3JlZW4gOiBzY3JlZW4gdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5uZXJXaWR0aCA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaW5uZXJIZWlnaHQgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG91dGVyV2lkdGggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG91dGVySGVpZ2h0IDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRDb21wdXRlZFN0eWxlIDogI2VsZW1lbnQgdCAtPiBjc3NTdHlsZURlY2xhcmF0aW9uIHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENvbXB1dGVkU3R5bGVfcHNldWRvRWx0IDpcbiAgICAgICNlbGVtZW50IHQgLT4ganNfc3RyaW5nIHQgLT4gY3NzU3R5bGVEZWNsYXJhdGlvbiB0IG1ldGhcblxuICAgIG1ldGhvZCBhdG9iIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGJ0b2EgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2Qgb25sb2FkIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb251bmxvYWQgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbmJlZm9yZXVubG9hZCA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9uYmx1ciA6ICh3aW5kb3cgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25mb2N1cyA6ICh3aW5kb3cgdCwgZm9jdXNFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25yZXNpemUgOiAod2luZG93IHQsIGV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHByb3BcblxuICAgIG1ldGhvZCBvbm9yaWVudGF0aW9uY2hhbmdlIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25wb3BzdGF0ZSA6ICh3aW5kb3cgdCwgcG9wU3RhdGVFdmVudCB0KSBldmVudF9saXN0ZW5lciBwcm9wXG5cbiAgICBtZXRob2Qgb25oYXNoY2hhbmdlIDogKHdpbmRvdyB0LCBoYXNoQ2hhbmdlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgcHJvcFxuXG4gICAgbWV0aG9kIG9ub25saW5lIDogKHdpbmRvdyB0LCBldmVudCB0KSBldmVudF9saXN0ZW5lciB3cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ub2ZmbGluZSA6ICh3aW5kb3cgdCwgZXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVVJMIDogX1VSTCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkZXZpY2VQaXhlbFJhdGlvIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IHdpbmRvdyA6IHdpbmRvdyB0ID0gSnMuVW5zYWZlLmdsb2JhbFxuXG4oKiBUaGUgdG9wbGV2ZWwgb2JqZWN0ICopXG5cbmxldCBkb2N1bWVudCA9IHdpbmRvdyMjLmRvY3VtZW50XG5cbmxldCBnZXRFbGVtZW50QnlJZCBpZCA9XG4gIEpzLk9wdC5jYXNlXG4gICAgKGRvY3VtZW50IyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIGlkKSlcbiAgICAoZnVuICgpIC0+IHJhaXNlIE5vdF9mb3VuZClcbiAgICAoZnVuIHBub2RlIC0+IHBub2RlKVxuXG5sZXQgZ2V0RWxlbWVudEJ5SWRfZXhuIGlkID1cbiAgSnMuT3B0LmNhc2VcbiAgICAoZG9jdW1lbnQjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgaWQpKVxuICAgIChmdW4gKCkgLT4gZmFpbHdpdGggKFByaW50Zi5zcHJpbnRmIFwiZ2V0RWxlbWVudEJ5SWRfZXhuOiAlUyBub3QgZm91bmRcIiBpZCkpXG4gICAgKGZ1biBwbm9kZSAtPiBwbm9kZSlcblxubGV0IGdldEVsZW1lbnRCeUlkX29wdCBpZCA9IEpzLk9wdC50b19vcHRpb24gKGRvY3VtZW50IyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIGlkKSlcblxubGV0IGdldEVsZW1lbnRCeUlkX2NvZXJjZSBpZCBjb2VyY2UgPVxuICBKcy5PcHQuY2FzZVxuICAgIChkb2N1bWVudCMjZ2V0RWxlbWVudEJ5SWQgKEpzLnN0cmluZyBpZCkpXG4gICAgKGZ1biAoKSAtPiBOb25lKVxuICAgIChmdW4gZSAtPiBKcy5PcHQudG9fb3B0aW9uIChjb2VyY2UgZSkpXG5cbigqKioqKVxuXG5jbGFzcyB0eXBlIGZyYW1lU2V0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgbWV0aG9kIGNvbHMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgcm93cyA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgZnJhbWVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZnJhbWVCb3JkZXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbG9uZ0Rlc2MgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgbWFyZ2luSGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbldpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgbm9SZXNpemUgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbGluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29udGVudERvY3VtZW50IDogZG9jdW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBpRnJhbWVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBtZXRob2QgZnJhbWVCb3JkZXIgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGxvbmdEZXNjIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG1hcmdpbkhlaWdodCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtYXJnaW5XaWR0aCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHNjcm9sbGluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBzcmMgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgY29udGVudERvY3VtZW50IDogZG9jdW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnRXaW5kb3cgOiB3aW5kb3cgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKioqKilcblxuKCpYWFggU2hvdWxkIHByb3ZpZGUgY3JlYXRpb24gZnVuY3Rpb25zIGEgbGEgbGFibGd0ay4uLiAqKVxuXG5sZXQgb3B0X2l0ZXIgeCBmID1cbiAgbWF0Y2ggeCB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgdiAtPiBmIHZcblxubGV0IGNyZWF0ZUVsZW1lbnQgKGRvYyA6IGRvY3VtZW50IHQpIG5hbWUgPSBkb2MjI2NyZWF0ZUVsZW1lbnQgKEpzLnN0cmluZyBuYW1lKVxuXG5sZXQgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgbmFtZSA9IEpzLlVuc2FmZS5jb2VyY2UgKGNyZWF0ZUVsZW1lbnQgZG9jIG5hbWUpXG5cbmxldCBjcmVhdGVFbGVtZW50U3ludGF4ID0gcmVmIGBVbmtub3duXG5cbmxldCByZWMgdW5zYWZlQ3JlYXRlRWxlbWVudEV4ID9fdHlwZSA/bmFtZSBkb2MgZWx0ID1cbiAgaWYgUG9seS4oX3R5cGUgPSBOb25lKSAmJiBQb2x5LihuYW1lID0gTm9uZSlcbiAgdGhlbiBKcy5VbnNhZmUuY29lcmNlIChjcmVhdGVFbGVtZW50IGRvYyBlbHQpXG4gIGVsc2VcbiAgICBtYXRjaCAhY3JlYXRlRWxlbWVudFN5bnRheCB3aXRoXG4gICAgfCBgU3RhbmRhcmQgLT5cbiAgICAgICAgbGV0IHJlcyA9IEpzLlVuc2FmZS5jb2VyY2UgKGNyZWF0ZUVsZW1lbnQgZG9jIGVsdCkgaW5cbiAgICAgICAgb3B0X2l0ZXIgX3R5cGUgKGZ1biB0IC0+IHJlcyMjLl90eXBlIDo9IHQpO1xuICAgICAgICBvcHRfaXRlciBuYW1lIChmdW4gbiAtPiByZXMjIy5uYW1lIDo9IG4pO1xuICAgICAgICByZXNcbiAgICB8IGBFeHRlbmRlZCAtPlxuICAgICAgICBsZXQgYSA9IG5ldyVqcyBKcy5hcnJheV9lbXB0eSBpblxuICAgICAgICBpZ25vcmUgKGEjI3B1c2hfMiAoSnMuc3RyaW5nIFwiPFwiKSAoSnMuc3RyaW5nIGVsdCkpO1xuICAgICAgICBvcHRfaXRlciBfdHlwZSAoZnVuIHQgLT5cbiAgICAgICAgICAgIGlnbm9yZSAoYSMjcHVzaF8zIChKcy5zdHJpbmcgXCIgdHlwZT1cXFwiXCIpIChodG1sX2VzY2FwZSB0KSAoSnMuc3RyaW5nIFwiXFxcIlwiKSkpO1xuICAgICAgICBvcHRfaXRlciBuYW1lIChmdW4gbiAtPlxuICAgICAgICAgICAgaWdub3JlIChhIyNwdXNoXzMgKEpzLnN0cmluZyBcIiBuYW1lPVxcXCJcIikgKGh0bWxfZXNjYXBlIG4pIChKcy5zdHJpbmcgXCJcXFwiXCIpKSk7XG4gICAgICAgIGlnbm9yZSAoYSMjcHVzaCAoSnMuc3RyaW5nIFwiPlwiKSk7XG4gICAgICAgIEpzLlVuc2FmZS5jb2VyY2UgKGRvYyMjY3JlYXRlRWxlbWVudCAoYSMjam9pbiAoSnMuc3RyaW5nIFwiXCIpKSlcbiAgICB8IGBVbmtub3duIC0+XG4gICAgICAgIGNyZWF0ZUVsZW1lbnRTeW50YXggOj1cbiAgICAgICAgICBpZiB0cnlcbiAgICAgICAgICAgICAgIGxldCBlbCA6IGlucHV0RWxlbWVudCBKcy50ID1cbiAgICAgICAgICAgICAgICAgSnMuVW5zYWZlLmNvZXJjZVxuICAgICAgICAgICAgICAgICAgIChkb2N1bWVudCMjY3JlYXRlRWxlbWVudCAoSnMuc3RyaW5nIFwiPGlucHV0IG5hbWU9XFxcInhcXFwiPlwiKSlcbiAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICBlbCMjLnRhZ05hbWUjI3RvTG93ZXJDYXNlID09IEpzLnN0cmluZyBcImlucHV0XCJcbiAgICAgICAgICAgICAgICYmIGVsIyMubmFtZSA9PSBKcy5zdHJpbmcgXCJ4XCJcbiAgICAgICAgICAgICB3aXRoIF8gLT4gZmFsc2VcbiAgICAgICAgICB0aGVuIGBFeHRlbmRlZFxuICAgICAgICAgIGVsc2UgYFN0YW5kYXJkO1xuICAgICAgICB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBlbHRcblxubGV0IGNyZWF0ZUh0bWwgZG9jIDogaHRtbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaHRtbFwiXG5cbmxldCBjcmVhdGVIZWFkIGRvYyA6IGhlYWRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImhlYWRcIlxuXG5sZXQgY3JlYXRlTGluayBkb2MgOiBsaW5rRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJsaW5rXCJcblxubGV0IGNyZWF0ZVRpdGxlIGRvYyA6IHRpdGxlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0aXRsZVwiXG5cbmxldCBjcmVhdGVNZXRhIGRvYyA6IG1ldGFFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1ldGFcIlxuXG5sZXQgY3JlYXRlQmFzZSBkb2MgOiBiYXNlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJiYXNlXCJcblxubGV0IGNyZWF0ZVN0eWxlIGRvYyA6IHN0eWxlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzdHlsZVwiXG5cbmxldCBjcmVhdGVCb2R5IGRvYyA6IGJvZHlFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImJvZHlcIlxuXG5sZXQgY3JlYXRlRm9ybSBkb2MgOiBmb3JtRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb3JtXCJcblxubGV0IGNyZWF0ZU9wdGdyb3VwIGRvYyA6IG9wdEdyb3VwRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJvcHRncm91cFwiXG5cbmxldCBjcmVhdGVPcHRpb24gZG9jIDogb3B0aW9uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJvcHRpb25cIlxuXG5sZXQgY3JlYXRlU2VsZWN0ID9fdHlwZSA/bmFtZSBkb2MgOiBzZWxlY3RFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBcInNlbGVjdFwiXG5cbmxldCBjcmVhdGVJbnB1dCA/X3R5cGUgP25hbWUgZG9jIDogaW5wdXRFbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBcImlucHV0XCJcblxubGV0IGNyZWF0ZVRleHRhcmVhID9fdHlwZSA/bmFtZSBkb2MgOiB0ZXh0QXJlYUVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnRFeCA/X3R5cGUgP25hbWUgZG9jIFwidGV4dGFyZWFcIlxuXG5sZXQgY3JlYXRlQnV0dG9uID9fdHlwZSA/bmFtZSBkb2MgOiBidXR0b25FbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50RXggP190eXBlID9uYW1lIGRvYyBcImJ1dHRvblwiXG5cbmxldCBjcmVhdGVMYWJlbCBkb2MgOiBsYWJlbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGFiZWxcIlxuXG5sZXQgY3JlYXRlRmllbGRzZXQgZG9jIDogZmllbGRTZXRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZpZWxkc2V0XCJcblxubGV0IGNyZWF0ZUxlZ2VuZCBkb2MgOiBsZWdlbmRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxlZ2VuZFwiXG5cbmxldCBjcmVhdGVVbCBkb2MgOiB1TGlzdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidWxcIlxuXG5sZXQgY3JlYXRlT2wgZG9jIDogb0xpc3RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm9sXCJcblxubGV0IGNyZWF0ZURsIGRvYyA6IGRMaXN0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJkbFwiXG5cbmxldCBjcmVhdGVMaSBkb2MgOiBsaUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGlcIlxuXG5sZXQgY3JlYXRlRGl2IGRvYyA6IGRpdkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZGl2XCJcblxubGV0IGNyZWF0ZUVtYmVkIGRvYyA6IGVtYmVkRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJlbWJlZFwiXG5cbmxldCBjcmVhdGVQIGRvYyA6IHBhcmFncmFwaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicFwiXG5cbmxldCBjcmVhdGVIMSBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoMVwiXG5cbmxldCBjcmVhdGVIMiBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoMlwiXG5cbmxldCBjcmVhdGVIMyBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoM1wiXG5cbmxldCBjcmVhdGVINCBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoNFwiXG5cbmxldCBjcmVhdGVINSBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoNVwiXG5cbmxldCBjcmVhdGVINiBkb2MgOiBoZWFkaW5nRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJoNlwiXG5cbmxldCBjcmVhdGVRIGRvYyA6IHF1b3RlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJxXCJcblxubGV0IGNyZWF0ZUJsb2NrcXVvdGUgZG9jIDogcXVvdGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImJsb2NrcXVvdGVcIlxuXG5sZXQgY3JlYXRlUHJlIGRvYyA6IHByZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicHJlXCJcblxubGV0IGNyZWF0ZUJyIGRvYyA6IGJyRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJiclwiXG5cbmxldCBjcmVhdGVIciBkb2MgOiBockVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaHJcIlxuXG5sZXQgY3JlYXRlSW5zIGRvYyA6IG1vZEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaW5zXCJcblxubGV0IGNyZWF0ZURlbCBkb2MgOiBtb2RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImRlbFwiXG5cbmxldCBjcmVhdGVBIGRvYyA6IGFuY2hvckVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYVwiXG5cbmxldCBjcmVhdGVJbWcgZG9jIDogaW1hZ2VFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImltZ1wiXG5cbmxldCBjcmVhdGVPYmplY3QgZG9jIDogb2JqZWN0RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJvYmplY3RcIlxuXG5sZXQgY3JlYXRlUGFyYW0gZG9jIDogcGFyYW1FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBhcmFtXCJcblxubGV0IGNyZWF0ZU1hcCBkb2MgOiBtYXBFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1hcFwiXG5cbmxldCBjcmVhdGVBcmVhIGRvYyA6IGFyZWFFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFyZWFcIlxuXG5sZXQgY3JlYXRlU2NyaXB0IGRvYyA6IHNjcmlwdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic2NyaXB0XCJcblxubGV0IGNyZWF0ZVRhYmxlIGRvYyA6IHRhYmxlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0YWJsZVwiXG5cbmxldCBjcmVhdGVDYXB0aW9uIGRvYyA6IHRhYmxlQ2FwdGlvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY2FwdGlvblwiXG5cbmxldCBjcmVhdGVDb2wgZG9jIDogdGFibGVDb2xFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNvbFwiXG5cbmxldCBjcmVhdGVDb2xncm91cCBkb2MgOiB0YWJsZUNvbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY29sZ3JvdXBcIlxuXG5sZXQgY3JlYXRlVGhlYWQgZG9jIDogdGFibGVTZWN0aW9uRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0aGVhZFwiXG5cbmxldCBjcmVhdGVUZm9vdCBkb2MgOiB0YWJsZVNlY3Rpb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRmb290XCJcblxubGV0IGNyZWF0ZVRib2R5IGRvYyA6IHRhYmxlU2VjdGlvbkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGJvZHlcIlxuXG5sZXQgY3JlYXRlVHIgZG9jIDogdGFibGVSb3dFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRyXCJcblxubGV0IGNyZWF0ZVRoIGRvYyA6IHRhYmxlQ2VsbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwidGhcIlxuXG5sZXQgY3JlYXRlVGQgZG9jIDogdGFibGVDZWxsRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0ZFwiXG5cbmxldCBjcmVhdGVTdWIgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzdWJcIlxuXG5sZXQgY3JlYXRlU3VwIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic3VwXCJcblxubGV0IGNyZWF0ZVNwYW4gZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzcGFuXCJcblxubGV0IGNyZWF0ZVR0IGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwidHRcIlxuXG5sZXQgY3JlYXRlSSBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImlcIlxuXG5sZXQgY3JlYXRlQiBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImJcIlxuXG5sZXQgY3JlYXRlQmlnIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiYmlnXCJcblxubGV0IGNyZWF0ZVNtYWxsIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwic21hbGxcIlxuXG5sZXQgY3JlYXRlRW0gZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJlbVwiXG5cbmxldCBjcmVhdGVTdHJvbmcgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzdHJvbmdcIlxuXG5sZXQgY3JlYXRlQ2l0ZSBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImNpdGVcIlxuXG5sZXQgY3JlYXRlRGZuIGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwiZGZuXCJcblxubGV0IGNyZWF0ZUNvZGUgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJjb2RlXCJcblxubGV0IGNyZWF0ZVNhbXAgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJzYW1wXCJcblxubGV0IGNyZWF0ZUtiZCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImtiZFwiXG5cbmxldCBjcmVhdGVWYXIgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJ2YXJcIlxuXG5sZXQgY3JlYXRlQWJiciBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImFiYnJcIlxuXG5sZXQgY3JlYXRlRGQgZG9jID0gY3JlYXRlRWxlbWVudCBkb2MgXCJkZFwiXG5cbmxldCBjcmVhdGVEdCBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImR0XCJcblxubGV0IGNyZWF0ZU5vc2NyaXB0IGRvYyA9IGNyZWF0ZUVsZW1lbnQgZG9jIFwibm9zY3JpcHRcIlxuXG5sZXQgY3JlYXRlQWRkcmVzcyBkb2MgPSBjcmVhdGVFbGVtZW50IGRvYyBcImFkZHJlc3NcIlxuXG5sZXQgY3JlYXRlRnJhbWVzZXQgZG9jIDogZnJhbWVTZXRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZyYW1lc2V0XCJcblxubGV0IGNyZWF0ZUZyYW1lIGRvYyA6IGZyYW1lRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmcmFtZVwiXG5cbmxldCBjcmVhdGVJZnJhbWUgZG9jIDogaUZyYW1lRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJpZnJhbWVcIlxuXG5sZXQgY3JlYXRlQXVkaW8gZG9jIDogYXVkaW9FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImF1ZGlvXCJcblxubGV0IGNyZWF0ZVZpZGVvIGRvYyA6IGF1ZGlvRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ2aWRlb1wiXG5cbmV4Y2VwdGlvbiBDYW52YXNfbm90X2F2YWlsYWJsZVxuXG5sZXQgY3JlYXRlQ2FudmFzIGRvYyA6IGNhbnZhc0VsZW1lbnQgdCA9XG4gIGxldCBjID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjYW52YXNcIiBpblxuICBpZiBub3QgKE9wdC50ZXN0IGMjIy5nZXRDb250ZXh0KSB0aGVuIHJhaXNlIENhbnZhc19ub3RfYXZhaWxhYmxlO1xuICBjXG5cbmxldCBodG1sX2VsZW1lbnQgOiBodG1sRWxlbWVudCB0IGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSFRNTEVsZW1lbnRcblxubW9kdWxlIENvZXJjZVRvID0gc3RydWN0XG4gIGxldCBlbGVtZW50IDogI0RvbS5ub2RlIEpzLnQgLT4gZWxlbWVudCBKcy50IEpzLm9wdCA9XG4gICAgaWYgZGVmIGh0bWxfZWxlbWVudCA9PSB1bmRlZmluZWRcbiAgICB0aGVuXG4gICAgICAoKiBpZSA8IDkgZG9lcyBub3QgaGF2ZSBIVE1MRWxlbWVudDogd2UgaGF2ZSB0byBjaGVhdCB0byBjaGVja1xuICAgICAgICAgdGhhdCBzb21ldGhpbmcgaXMgYW4gaHRtbCBlbGVtZW50ICopXG4gICAgICBmdW4gZSAtPlxuICAgICAgaWYgZGVmIChKcy5VbnNhZmUuY29lcmNlIGUpIyMuaW5uZXJIVE1MID09IHVuZGVmaW5lZFxuICAgICAgdGhlbiBKcy5udWxsXG4gICAgICBlbHNlIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICBlbHNlXG4gICAgICBmdW4gZSAtPlxuICAgICAgaWYgSnMuaW5zdGFuY2VvZiBlIGh0bWxfZWxlbWVudCB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSkgZWxzZSBKcy5udWxsXG5cbiAgbGV0IHVuc2FmZUNvZXJjZSB0YWcgKGUgOiAjZWxlbWVudCB0KSA9XG4gICAgaWYgZSMjLnRhZ05hbWUjI3RvTG93ZXJDYXNlID09IEpzLnN0cmluZyB0YWdcbiAgICB0aGVuIEpzLnNvbWUgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICBlbHNlIEpzLm51bGxcblxuICBsZXQgYSBlID0gdW5zYWZlQ29lcmNlIFwiYVwiIGVcblxuICBsZXQgYXJlYSBlID0gdW5zYWZlQ29lcmNlIFwiYXJlYVwiIGVcblxuICBsZXQgYmFzZSBlID0gdW5zYWZlQ29lcmNlIFwiYmFzZVwiIGVcblxuICBsZXQgYmxvY2txdW90ZSBlID0gdW5zYWZlQ29lcmNlIFwiYmxvY2txdW90ZVwiIGVcblxuICBsZXQgYm9keSBlID0gdW5zYWZlQ29lcmNlIFwiYm9keVwiIGVcblxuICBsZXQgYnIgZSA9IHVuc2FmZUNvZXJjZSBcImJyXCIgZVxuXG4gIGxldCBidXR0b24gZSA9IHVuc2FmZUNvZXJjZSBcImJ1dHRvblwiIGVcblxuICBsZXQgY2FudmFzIGUgPSB1bnNhZmVDb2VyY2UgXCJjYW52YXNcIiBlXG5cbiAgbGV0IGNhcHRpb24gZSA9IHVuc2FmZUNvZXJjZSBcImNhcHRpb25cIiBlXG5cbiAgbGV0IGNvbCBlID0gdW5zYWZlQ29lcmNlIFwiY29sXCIgZVxuXG4gIGxldCBjb2xncm91cCBlID0gdW5zYWZlQ29lcmNlIFwiY29sZ3JvdXBcIiBlXG5cbiAgbGV0IGRlbCBlID0gdW5zYWZlQ29lcmNlIFwiZGVsXCIgZVxuXG4gIGxldCBkaXYgZSA9IHVuc2FmZUNvZXJjZSBcImRpdlwiIGVcblxuICBsZXQgZGwgZSA9IHVuc2FmZUNvZXJjZSBcImRsXCIgZVxuXG4gIGxldCBmaWVsZHNldCBlID0gdW5zYWZlQ29lcmNlIFwiZmllbGRzZXRcIiBlXG5cbiAgbGV0IGVtYmVkIGUgPSB1bnNhZmVDb2VyY2UgXCJlbWJlZFwiIGVcblxuICBsZXQgZm9ybSBlID0gdW5zYWZlQ29lcmNlIFwiZm9ybVwiIGVcblxuICBsZXQgZnJhbWVzZXQgZSA9IHVuc2FmZUNvZXJjZSBcImZyYW1lc2V0XCIgZVxuXG4gIGxldCBmcmFtZSBlID0gdW5zYWZlQ29lcmNlIFwiZnJhbWVcIiBlXG5cbiAgbGV0IGgxIGUgPSB1bnNhZmVDb2VyY2UgXCJoMVwiIGVcblxuICBsZXQgaDIgZSA9IHVuc2FmZUNvZXJjZSBcImgyXCIgZVxuXG4gIGxldCBoMyBlID0gdW5zYWZlQ29lcmNlIFwiaDNcIiBlXG5cbiAgbGV0IGg0IGUgPSB1bnNhZmVDb2VyY2UgXCJoNFwiIGVcblxuICBsZXQgaDUgZSA9IHVuc2FmZUNvZXJjZSBcImg1XCIgZVxuXG4gIGxldCBoNiBlID0gdW5zYWZlQ29lcmNlIFwiaDZcIiBlXG5cbiAgbGV0IGhlYWQgZSA9IHVuc2FmZUNvZXJjZSBcImhlYWRcIiBlXG5cbiAgbGV0IGhyIGUgPSB1bnNhZmVDb2VyY2UgXCJoclwiIGVcblxuICBsZXQgaHRtbCBlID0gdW5zYWZlQ29lcmNlIFwiaHRtbFwiIGVcblxuICBsZXQgaWZyYW1lIGUgPSB1bnNhZmVDb2VyY2UgXCJpZnJhbWVcIiBlXG5cbiAgbGV0IGltZyBlID0gdW5zYWZlQ29lcmNlIFwiaW1nXCIgZVxuXG4gIGxldCBpbnB1dCBlID0gdW5zYWZlQ29lcmNlIFwiaW5wdXRcIiBlXG5cbiAgbGV0IGlucyBlID0gdW5zYWZlQ29lcmNlIFwiaW5zXCIgZVxuXG4gIGxldCBsYWJlbCBlID0gdW5zYWZlQ29lcmNlIFwibGFiZWxcIiBlXG5cbiAgbGV0IGxlZ2VuZCBlID0gdW5zYWZlQ29lcmNlIFwibGVnZW5kXCIgZVxuXG4gIGxldCBsaSBlID0gdW5zYWZlQ29lcmNlIFwibGlcIiBlXG5cbiAgbGV0IGxpbmsgZSA9IHVuc2FmZUNvZXJjZSBcImxpbmtcIiBlXG5cbiAgbGV0IG1hcCBlID0gdW5zYWZlQ29lcmNlIFwibWFwXCIgZVxuXG4gIGxldCBtZXRhIGUgPSB1bnNhZmVDb2VyY2UgXCJtZXRhXCIgZVxuXG4gIGxldCBfb2JqZWN0IGUgPSB1bnNhZmVDb2VyY2UgXCJvYmplY3RcIiBlXG5cbiAgbGV0IG9sIGUgPSB1bnNhZmVDb2VyY2UgXCJvbFwiIGVcblxuICBsZXQgb3B0Z3JvdXAgZSA9IHVuc2FmZUNvZXJjZSBcIm9wdGdyb3VwXCIgZVxuXG4gIGxldCBvcHRpb24gZSA9IHVuc2FmZUNvZXJjZSBcIm9wdGlvblwiIGVcblxuICBsZXQgcCBlID0gdW5zYWZlQ29lcmNlIFwicFwiIGVcblxuICBsZXQgcGFyYW0gZSA9IHVuc2FmZUNvZXJjZSBcInBhcmFtXCIgZVxuXG4gIGxldCBwcmUgZSA9IHVuc2FmZUNvZXJjZSBcInByZVwiIGVcblxuICBsZXQgcSBlID0gdW5zYWZlQ29lcmNlIFwicVwiIGVcblxuICBsZXQgc2NyaXB0IGUgPSB1bnNhZmVDb2VyY2UgXCJzY3JpcHRcIiBlXG5cbiAgbGV0IHNlbGVjdCBlID0gdW5zYWZlQ29lcmNlIFwic2VsZWN0XCIgZVxuXG4gIGxldCBzdHlsZSBlID0gdW5zYWZlQ29lcmNlIFwic3R5bGVcIiBlXG5cbiAgbGV0IHRhYmxlIGUgPSB1bnNhZmVDb2VyY2UgXCJ0YWJsZVwiIGVcblxuICBsZXQgdGJvZHkgZSA9IHVuc2FmZUNvZXJjZSBcInRib2R5XCIgZVxuXG4gIGxldCB0ZCBlID0gdW5zYWZlQ29lcmNlIFwidGRcIiBlXG5cbiAgbGV0IHRleHRhcmVhIGUgPSB1bnNhZmVDb2VyY2UgXCJ0ZXh0YXJlYVwiIGVcblxuICBsZXQgdGZvb3QgZSA9IHVuc2FmZUNvZXJjZSBcInRmb290XCIgZVxuXG4gIGxldCB0aCBlID0gdW5zYWZlQ29lcmNlIFwidGhcIiBlXG5cbiAgbGV0IHRoZWFkIGUgPSB1bnNhZmVDb2VyY2UgXCJ0aGVhZFwiIGVcblxuICBsZXQgdGl0bGUgZSA9IHVuc2FmZUNvZXJjZSBcInRpdGxlXCIgZVxuXG4gIGxldCB0ciBlID0gdW5zYWZlQ29lcmNlIFwidHJcIiBlXG5cbiAgbGV0IHVsIGUgPSB1bnNhZmVDb2VyY2UgXCJ1bFwiIGVcblxuICBsZXQgYXVkaW8gZSA9IHVuc2FmZUNvZXJjZSBcImF1ZGlvXCIgZVxuXG4gIGxldCB2aWRlbyBlID0gdW5zYWZlQ29lcmNlIFwidmlkZW9cIiBlXG5cbiAgbGV0IHVuc2FmZUNvZXJjZUV2ZW50IGNvbnN0ciAoZXYgOiAjZXZlbnQgdCkgPVxuICAgIGlmIGRlZiBjb25zdHIgIT0gdW5kZWZpbmVkICYmIEpzLmluc3RhbmNlb2YgZXYgY29uc3RyXG4gICAgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGV2KVxuICAgIGVsc2UgSnMubnVsbFxuXG4gIGxldCBtb3VzZUV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9Nb3VzZUV2ZW50IGV2XG5cbiAgbGV0IGtleWJvYXJkRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX0tleWJvYXJkRXZlbnQgZXZcblxuICBsZXQgd2hlZWxFdmVudCBldiA9IHVuc2FmZUNvZXJjZUV2ZW50IEpzLlVuc2FmZS5nbG9iYWwjIy5fV2hlZWxFdmVudCBldlxuXG4gIGxldCBtb3VzZVNjcm9sbEV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9Nb3VzZVNjcm9sbEV2ZW50IGV2XG5cbiAgbGV0IHBvcFN0YXRlRXZlbnQgZXYgPSB1bnNhZmVDb2VyY2VFdmVudCBKcy5VbnNhZmUuZ2xvYmFsIyMuX1BvcFN0YXRlRXZlbnQgZXZcblxuICBsZXQgbWVzc2FnZUV2ZW50IGV2ID0gdW5zYWZlQ29lcmNlRXZlbnQgSnMuVW5zYWZlLmdsb2JhbCMjLl9NZXNzYWdlRXZlbnQgZXZcbmVuZFxuXG4oKioqKilcblxubGV0IGV2ZW50VGFyZ2V0ID0gRG9tLmV2ZW50VGFyZ2V0XG5cbmxldCBldmVudFJlbGF0ZWRUYXJnZXQgKGUgOiAjbW91c2VFdmVudCB0KSA9XG4gIE9wdGRlZi5nZXQgZSMjLnJlbGF0ZWRUYXJnZXQgKGZ1biAoKSAtPlxuICAgICAgbWF0Y2ggSnMudG9fc3RyaW5nIGUjIy5fdHlwZSB3aXRoXG4gICAgICB8IFwibW91c2VvdmVyXCIgLT4gT3B0ZGVmLmdldCBlIyMuZnJvbUVsZW1lbnQgKGZ1biAoKSAtPiBhc3NlcnQgZmFsc2UpXG4gICAgICB8IFwibW91c2VvdXRcIiAtPiBPcHRkZWYuZ2V0IGUjIy50b0VsZW1lbnQgKGZ1biAoKSAtPiBhc3NlcnQgZmFsc2UpXG4gICAgICB8IF8gLT4gSnMubnVsbClcblxubGV0IGV2ZW50QWJzb2x1dGVQb3NpdGlvbicgKGUgOiAjbW91c2VFdmVudCB0KSA9XG4gIGxldCBib2R5ID0gZG9jdW1lbnQjIy5ib2R5IGluXG4gIGxldCBodG1sID0gZG9jdW1lbnQjIy5kb2N1bWVudEVsZW1lbnQgaW5cbiAgKCBlIyMuY2xpZW50WCArIGJvZHkjIy5zY3JvbGxMZWZ0ICsgaHRtbCMjLnNjcm9sbExlZnRcbiAgLCBlIyMuY2xpZW50WSArIGJvZHkjIy5zY3JvbGxUb3AgKyBodG1sIyMuc2Nyb2xsVG9wIClcblxubGV0IGV2ZW50QWJzb2x1dGVQb3NpdGlvbiAoZSA6ICNtb3VzZUV2ZW50IHQpID1cbiAgT3B0ZGVmLmNhc2VcbiAgICBlIyMucGFnZVhcbiAgICAoZnVuICgpIC0+IGV2ZW50QWJzb2x1dGVQb3NpdGlvbicgZSlcbiAgICAoZnVuIHggLT4gT3B0ZGVmLmNhc2UgZSMjLnBhZ2VZIChmdW4gKCkgLT4gZXZlbnRBYnNvbHV0ZVBvc2l0aW9uJyBlKSAoZnVuIHkgLT4geCwgeSkpXG5cbmxldCBlbGVtZW50Q2xpZW50UG9zaXRpb24gKGUgOiAjZWxlbWVudCB0KSA9XG4gIGxldCByID0gZSMjZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGluXG4gIGxldCBib2R5ID0gZG9jdW1lbnQjIy5ib2R5IGluXG4gIGxldCBodG1sID0gZG9jdW1lbnQjIy5kb2N1bWVudEVsZW1lbnQgaW5cbiAgKCB0cnVuY2F0ZSByIyMubGVmdCAtIGJvZHkjIy5jbGllbnRMZWZ0IC0gaHRtbCMjLmNsaWVudExlZnRcbiAgLCB0cnVuY2F0ZSByIyMudG9wIC0gYm9keSMjLmNsaWVudFRvcCAtIGh0bWwjIy5jbGllbnRUb3AgKVxuXG5sZXQgZ2V0RG9jdW1lbnRTY3JvbGwgKCkgPVxuICBsZXQgYm9keSA9IGRvY3VtZW50IyMuYm9keSBpblxuICBsZXQgaHRtbCA9IGRvY3VtZW50IyMuZG9jdW1lbnRFbGVtZW50IGluXG4gIGJvZHkjIy5zY3JvbGxMZWZ0ICsgaHRtbCMjLnNjcm9sbExlZnQsIGJvZHkjIy5zY3JvbGxUb3AgKyBodG1sIyMuc2Nyb2xsVG9wXG5cbmxldCBidXR0b25QcmVzc2VkIChldiA6ICNtb3VzZUV2ZW50IEpzLnQpID1cbiAgSnMuT3B0ZGVmLmNhc2VcbiAgICBldiMjLndoaWNoXG4gICAgKGZ1biAoKSAtPlxuICAgICAgbWF0Y2ggZXYjIy5idXR0b24gd2l0aFxuICAgICAgfCAxIC0+IExlZnRfYnV0dG9uXG4gICAgICB8IDIgLT4gUmlnaHRfYnV0dG9uXG4gICAgICB8IDQgLT4gTWlkZGxlX2J1dHRvblxuICAgICAgfCBfIC0+IE5vX2J1dHRvbilcbiAgICAoZnVuIHggLT4geClcblxubGV0IGFkZE1vdXNld2hlZWxFdmVudExpc3RlbmVyV2l0aE9wdGlvbnMgZSA/Y2FwdHVyZSA/b25jZSA/cGFzc2l2ZSBoID1cbiAgYWRkRXZlbnRMaXN0ZW5lcldpdGhPcHRpb25zXG4gICAgP2NhcHR1cmVcbiAgICA/b25jZVxuICAgID9wYXNzaXZlXG4gICAgZVxuICAgIEV2ZW50LndoZWVsXG4gICAgKGhhbmRsZXIgKGZ1biAoZSA6IG1vdXNld2hlZWxFdmVudCB0KSAtPlxuICAgICAgICAgbGV0IGR4ID0gLU9wdGRlZi5nZXQgZSMjLndoZWVsRGVsdGFYIChmdW4gKCkgLT4gMCkgLyA0MCBpblxuICAgICAgICAgbGV0IGR5ID0gLU9wdGRlZi5nZXQgZSMjLndoZWVsRGVsdGFZIChmdW4gKCkgLT4gZSMjLndoZWVsRGVsdGEpIC8gNDAgaW5cbiAgICAgICAgIGggKGUgOj4gbW91c2VFdmVudCB0KSB+ZHggfmR5KSlcblxubGV0IGFkZE1vdXNld2hlZWxFdmVudExpc3RlbmVyIGUgaCBjYXB0ID1cbiAgYWRkTW91c2V3aGVlbEV2ZW50TGlzdGVuZXJXaXRoT3B0aW9ucyB+Y2FwdHVyZTpjYXB0IGUgaFxuXG4oKioqKiopXG5cbm1vZHVsZSBLZXlib2FyZF9jb2RlID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBVbmlkZW50aWZpZWRcbiAgICAoKiBBbHBoYWJldGljIENoYXJhY3RlcnMgKilcbiAgICB8IEtleUFcbiAgICB8IEtleUJcbiAgICB8IEtleUNcbiAgICB8IEtleURcbiAgICB8IEtleUVcbiAgICB8IEtleUZcbiAgICB8IEtleUdcbiAgICB8IEtleUhcbiAgICB8IEtleUlcbiAgICB8IEtleUpcbiAgICB8IEtleUtcbiAgICB8IEtleUxcbiAgICB8IEtleU1cbiAgICB8IEtleU5cbiAgICB8IEtleU9cbiAgICB8IEtleVBcbiAgICB8IEtleVFcbiAgICB8IEtleVJcbiAgICB8IEtleVNcbiAgICB8IEtleVRcbiAgICB8IEtleVVcbiAgICB8IEtleVZcbiAgICB8IEtleVdcbiAgICB8IEtleVhcbiAgICB8IEtleVlcbiAgICB8IEtleVpcbiAgICAoKiBEaWdpdHMgKilcbiAgICB8IERpZ2l0MFxuICAgIHwgRGlnaXQxXG4gICAgfCBEaWdpdDJcbiAgICB8IERpZ2l0M1xuICAgIHwgRGlnaXQ0XG4gICAgfCBEaWdpdDVcbiAgICB8IERpZ2l0NlxuICAgIHwgRGlnaXQ3XG4gICAgfCBEaWdpdDhcbiAgICB8IERpZ2l0OVxuICAgIHwgTWludXNcbiAgICB8IEVxdWFsXG4gICAgKCogV2hpdGVzcGFjZSAqKVxuICAgIHwgVGFiXG4gICAgfCBFbnRlclxuICAgIHwgU3BhY2VcbiAgICAoKiBFZGl0aW5nICopXG4gICAgfCBFc2NhcGVcbiAgICB8IEJhY2tzcGFjZVxuICAgIHwgSW5zZXJ0XG4gICAgfCBEZWxldGVcbiAgICB8IENhcHNMb2NrXG4gICAgKCogTWlzYyBQcmludGFibGUgKilcbiAgICB8IEJyYWNrZXRMZWZ0XG4gICAgfCBCcmFja2V0UmlnaHRcbiAgICB8IFNlbWljb2xvblxuICAgIHwgUXVvdGVcbiAgICB8IEJhY2txdW90ZVxuICAgIHwgQmFja3NsYXNoXG4gICAgfCBDb21tYVxuICAgIHwgUGVyaW9kXG4gICAgfCBTbGFzaFxuICAgICgqIEZ1bmN0aW9uIGtleXMgKilcbiAgICB8IEYxXG4gICAgfCBGMlxuICAgIHwgRjNcbiAgICB8IEY0XG4gICAgfCBGNVxuICAgIHwgRjZcbiAgICB8IEY3XG4gICAgfCBGOFxuICAgIHwgRjlcbiAgICB8IEYxMFxuICAgIHwgRjExXG4gICAgfCBGMTJcbiAgICAoKiBOdW1wYWQga2V5cyAqKVxuICAgIHwgTnVtcGFkMFxuICAgIHwgTnVtcGFkMVxuICAgIHwgTnVtcGFkMlxuICAgIHwgTnVtcGFkM1xuICAgIHwgTnVtcGFkNFxuICAgIHwgTnVtcGFkNVxuICAgIHwgTnVtcGFkNlxuICAgIHwgTnVtcGFkN1xuICAgIHwgTnVtcGFkOFxuICAgIHwgTnVtcGFkOVxuICAgIHwgTnVtcGFkTXVsdGlwbHlcbiAgICB8IE51bXBhZFN1YnRyYWN0XG4gICAgfCBOdW1wYWRBZGRcbiAgICB8IE51bXBhZERlY2ltYWxcbiAgICB8IE51bXBhZEVxdWFsXG4gICAgfCBOdW1wYWRFbnRlclxuICAgIHwgTnVtcGFkRGl2aWRlXG4gICAgfCBOdW1Mb2NrXG4gICAgKCogTW9kaWZpZXIga2V5cyAqKVxuICAgIHwgQ29udHJvbExlZnRcbiAgICB8IENvbnRyb2xSaWdodFxuICAgIHwgTWV0YUxlZnRcbiAgICB8IE1ldGFSaWdodFxuICAgIHwgU2hpZnRMZWZ0XG4gICAgfCBTaGlmdFJpZ2h0XG4gICAgfCBBbHRMZWZ0XG4gICAgfCBBbHRSaWdodFxuICAgICgqIEFycm93IGtleXMgKilcbiAgICB8IEFycm93TGVmdFxuICAgIHwgQXJyb3dSaWdodFxuICAgIHwgQXJyb3dVcFxuICAgIHwgQXJyb3dEb3duXG4gICAgKCogTmF2aWdhdGlvbiAqKVxuICAgIHwgUGFnZVVwXG4gICAgfCBQYWdlRG93blxuICAgIHwgSG9tZVxuICAgIHwgRW5kXG4gICAgKCogU291bmQgKilcbiAgICB8IFZvbHVtZU11dGVcbiAgICB8IFZvbHVtZURvd25cbiAgICB8IFZvbHVtZVVwXG4gICAgKCogTWVkaWEgKilcbiAgICB8IE1lZGlhVHJhY2tQcmV2aW91c1xuICAgIHwgTWVkaWFUcmFja05leHRcbiAgICB8IE1lZGlhUGxheVBhdXNlXG4gICAgfCBNZWRpYVN0b3BcbiAgICAoKiBCcm93c2VyIHNwZWNpYWwgKilcbiAgICB8IENvbnRleHRNZW51XG4gICAgfCBCcm93c2VyU2VhcmNoXG4gICAgfCBCcm93c2VySG9tZVxuICAgIHwgQnJvd3NlckZhdm9yaXRlc1xuICAgIHwgQnJvd3NlclJlZnJlc2hcbiAgICB8IEJyb3dzZXJTdG9wXG4gICAgfCBCcm93c2VyRm9yd2FyZFxuICAgIHwgQnJvd3NlckJhY2tcbiAgICAoKiBNaXNjICopXG4gICAgfCBPU0xlZnRcbiAgICB8IE9TUmlnaHRcbiAgICB8IFNjcm9sbExvY2tcbiAgICB8IFByaW50U2NyZWVuXG4gICAgfCBJbnRsQmFja3NsYXNoXG4gICAgfCBJbnRsWWVuXG4gICAgfCBQYXVzZVxuXG4gIGxldCB0cnlfY29kZSB2ID1cbiAgICBtYXRjaCBKcy50b19zdHJpbmcgdiB3aXRoXG4gICAgKCogQWxwaGFiZXRpYyBDaGFyYWN0ZXJzICopXG4gICAgfCBcIktleUFcIiAtPiBLZXlBXG4gICAgfCBcIktleUJcIiAtPiBLZXlCXG4gICAgfCBcIktleUNcIiAtPiBLZXlDXG4gICAgfCBcIktleURcIiAtPiBLZXlEXG4gICAgfCBcIktleUVcIiAtPiBLZXlFXG4gICAgfCBcIktleUZcIiAtPiBLZXlGXG4gICAgfCBcIktleUdcIiAtPiBLZXlHXG4gICAgfCBcIktleUhcIiAtPiBLZXlIXG4gICAgfCBcIktleUlcIiAtPiBLZXlJXG4gICAgfCBcIktleUpcIiAtPiBLZXlKXG4gICAgfCBcIktleUtcIiAtPiBLZXlLXG4gICAgfCBcIktleUxcIiAtPiBLZXlMXG4gICAgfCBcIktleU1cIiAtPiBLZXlNXG4gICAgfCBcIktleU5cIiAtPiBLZXlOXG4gICAgfCBcIktleU9cIiAtPiBLZXlPXG4gICAgfCBcIktleVBcIiAtPiBLZXlQXG4gICAgfCBcIktleVFcIiAtPiBLZXlRXG4gICAgfCBcIktleVJcIiAtPiBLZXlSXG4gICAgfCBcIktleVNcIiAtPiBLZXlTXG4gICAgfCBcIktleVRcIiAtPiBLZXlUXG4gICAgfCBcIktleVVcIiAtPiBLZXlVXG4gICAgfCBcIktleVZcIiAtPiBLZXlWXG4gICAgfCBcIktleVdcIiAtPiBLZXlXXG4gICAgfCBcIktleVhcIiAtPiBLZXlYXG4gICAgfCBcIktleVlcIiAtPiBLZXlZXG4gICAgfCBcIktleVpcIiAtPiBLZXlaXG4gICAgKCogRGlnaXRzICopXG4gICAgfCBcIkRpZ2l0MFwiIC0+IERpZ2l0MFxuICAgIHwgXCJEaWdpdDFcIiAtPiBEaWdpdDFcbiAgICB8IFwiRGlnaXQyXCIgLT4gRGlnaXQyXG4gICAgfCBcIkRpZ2l0M1wiIC0+IERpZ2l0M1xuICAgIHwgXCJEaWdpdDRcIiAtPiBEaWdpdDRcbiAgICB8IFwiRGlnaXQ1XCIgLT4gRGlnaXQ1XG4gICAgfCBcIkRpZ2l0NlwiIC0+IERpZ2l0NlxuICAgIHwgXCJEaWdpdDdcIiAtPiBEaWdpdDdcbiAgICB8IFwiRGlnaXQ4XCIgLT4gRGlnaXQ4XG4gICAgfCBcIkRpZ2l0OVwiIC0+IERpZ2l0OVxuICAgIHwgXCJNaW51c1wiIC0+IE1pbnVzXG4gICAgfCBcIkVxdWFsXCIgLT4gRXF1YWxcbiAgICAoKiBXaGl0ZXNwYWNlICopXG4gICAgfCBcIlRhYlwiIC0+IFRhYlxuICAgIHwgXCJFbnRlclwiIC0+IEVudGVyXG4gICAgfCBcIlNwYWNlXCIgLT4gU3BhY2VcbiAgICAoKiBFZGl0aW5nICopXG4gICAgfCBcIkVzY2FwZVwiIC0+IEVzY2FwZVxuICAgIHwgXCJCYWNrc3BhY2VcIiAtPiBCYWNrc3BhY2VcbiAgICB8IFwiSW5zZXJ0XCIgLT4gSW5zZXJ0XG4gICAgfCBcIkRlbGV0ZVwiIC0+IERlbGV0ZVxuICAgIHwgXCJDYXBzTG9ja1wiIC0+IENhcHNMb2NrXG4gICAgKCogTWlzYyBQcmludGFibGUgKilcbiAgICB8IFwiQnJhY2tldExlZnRcIiAtPiBCcmFja2V0TGVmdFxuICAgIHwgXCJCcmFja2V0UmlnaHRcIiAtPiBCcmFja2V0UmlnaHRcbiAgICB8IFwiU2VtaWNvbG9uXCIgLT4gU2VtaWNvbG9uXG4gICAgfCBcIlF1b3RlXCIgLT4gUXVvdGVcbiAgICB8IFwiQmFja3F1b3RlXCIgLT4gQmFja3F1b3RlXG4gICAgfCBcIkJhY2tzbGFzaFwiIC0+IEJhY2tzbGFzaFxuICAgIHwgXCJDb21tYVwiIC0+IENvbW1hXG4gICAgfCBcIlBlcmlvZFwiIC0+IFBlcmlvZFxuICAgIHwgXCJTbGFzaFwiIC0+IFNsYXNoXG4gICAgKCogRnVuY3Rpb24ga2V5cyAqKVxuICAgIHwgXCJGMVwiIC0+IEYxXG4gICAgfCBcIkYyXCIgLT4gRjJcbiAgICB8IFwiRjNcIiAtPiBGM1xuICAgIHwgXCJGNFwiIC0+IEY0XG4gICAgfCBcIkY1XCIgLT4gRjVcbiAgICB8IFwiRjZcIiAtPiBGNlxuICAgIHwgXCJGN1wiIC0+IEY3XG4gICAgfCBcIkY4XCIgLT4gRjhcbiAgICB8IFwiRjlcIiAtPiBGOVxuICAgIHwgXCJGMTBcIiAtPiBGMTBcbiAgICB8IFwiRjExXCIgLT4gRjExXG4gICAgfCBcIkYxMlwiIC0+IEYxMlxuICAgICgqIE51bXBhZCBrZXlzICopXG4gICAgfCBcIk51bXBhZDBcIiAtPiBOdW1wYWQwXG4gICAgfCBcIk51bXBhZDFcIiAtPiBOdW1wYWQxXG4gICAgfCBcIk51bXBhZDJcIiAtPiBOdW1wYWQyXG4gICAgfCBcIk51bXBhZDNcIiAtPiBOdW1wYWQzXG4gICAgfCBcIk51bXBhZDRcIiAtPiBOdW1wYWQ0XG4gICAgfCBcIk51bXBhZDVcIiAtPiBOdW1wYWQ1XG4gICAgfCBcIk51bXBhZDZcIiAtPiBOdW1wYWQ2XG4gICAgfCBcIk51bXBhZDdcIiAtPiBOdW1wYWQ3XG4gICAgfCBcIk51bXBhZDhcIiAtPiBOdW1wYWQ4XG4gICAgfCBcIk51bXBhZDlcIiAtPiBOdW1wYWQ5XG4gICAgfCBcIk51bXBhZE11bHRpcGx5XCIgLT4gTnVtcGFkTXVsdGlwbHlcbiAgICB8IFwiTnVtcGFkU3VidHJhY3RcIiAtPiBOdW1wYWRTdWJ0cmFjdFxuICAgIHwgXCJOdW1wYWRBZGRcIiAtPiBOdW1wYWRBZGRcbiAgICB8IFwiTnVtcGFkRGVjaW1hbFwiIC0+IE51bXBhZERlY2ltYWxcbiAgICB8IFwiTnVtcGFkRXF1YWxcIiAtPiBOdW1wYWRFcXVhbFxuICAgIHwgXCJOdW1wYWRFbnRlclwiIC0+IE51bXBhZEVudGVyXG4gICAgfCBcIk51bXBhZERpdmlkZVwiIC0+IE51bXBhZERpdmlkZVxuICAgIHwgXCJOdW1Mb2NrXCIgLT4gTnVtTG9ja1xuICAgICgqIE1vZGlmaWVyIGtleXMgKilcbiAgICB8IFwiQ29udHJvbExlZnRcIiAtPiBDb250cm9sTGVmdFxuICAgIHwgXCJDb250cm9sUmlnaHRcIiAtPiBDb250cm9sUmlnaHRcbiAgICB8IFwiTWV0YUxlZnRcIiAtPiBNZXRhTGVmdFxuICAgIHwgXCJNZXRhUmlnaHRcIiAtPiBNZXRhUmlnaHRcbiAgICB8IFwiU2hpZnRMZWZ0XCIgLT4gU2hpZnRMZWZ0XG4gICAgfCBcIlNoaWZ0UmlnaHRcIiAtPiBTaGlmdFJpZ2h0XG4gICAgfCBcIkFsdExlZnRcIiAtPiBBbHRMZWZ0XG4gICAgfCBcIkFsdFJpZ2h0XCIgLT4gQWx0UmlnaHRcbiAgICAoKiBBcnJvdyBrZXlzICopXG4gICAgfCBcIkFycm93TGVmdFwiIC0+IEFycm93TGVmdFxuICAgIHwgXCJBcnJvd1JpZ2h0XCIgLT4gQXJyb3dSaWdodFxuICAgIHwgXCJBcnJvd1VwXCIgLT4gQXJyb3dVcFxuICAgIHwgXCJBcnJvd0Rvd25cIiAtPiBBcnJvd0Rvd25cbiAgICAoKiBOYXZpZ2F0aW9uICopXG4gICAgfCBcIlBhZ2VVcFwiIC0+IFBhZ2VVcFxuICAgIHwgXCJQYWdlRG93blwiIC0+IFBhZ2VEb3duXG4gICAgfCBcIkhvbWVcIiAtPiBIb21lXG4gICAgfCBcIkVuZFwiIC0+IEVuZFxuICAgICgqIFNvdW5kICopXG4gICAgfCBcIlZvbHVtZU11dGVcIiAtPiBWb2x1bWVNdXRlXG4gICAgfCBcIlZvbHVtZURvd25cIiAtPiBWb2x1bWVEb3duXG4gICAgfCBcIlZvbHVtZVVwXCIgLT4gVm9sdW1lVXBcbiAgICAoKiBNZWRpYSAqKVxuICAgIHwgXCJNZWRpYVRyYWNrUHJldmlvdXNcIiAtPiBNZWRpYVRyYWNrUHJldmlvdXNcbiAgICB8IFwiTWVkaWFUcmFja05leHRcIiAtPiBNZWRpYVRyYWNrTmV4dFxuICAgIHwgXCJNZWRpYVBsYXlQYXVzZVwiIC0+IE1lZGlhUGxheVBhdXNlXG4gICAgfCBcIk1lZGlhU3RvcFwiIC0+IE1lZGlhU3RvcFxuICAgICgqIEJyb3dzZXIgc3BlY2lhbCAqKVxuICAgIHwgXCJDb250ZXh0TWVudVwiIC0+IENvbnRleHRNZW51XG4gICAgfCBcIkJyb3dzZXJTZWFyY2hcIiAtPiBCcm93c2VyU2VhcmNoXG4gICAgfCBcIkJyb3dzZXJIb21lXCIgLT4gQnJvd3NlckhvbWVcbiAgICB8IFwiQnJvd3NlckZhdm9yaXRlc1wiIC0+IEJyb3dzZXJGYXZvcml0ZXNcbiAgICB8IFwiQnJvd3NlclJlZnJlc2hcIiAtPiBCcm93c2VyUmVmcmVzaFxuICAgIHwgXCJCcm93c2VyU3RvcFwiIC0+IEJyb3dzZXJTdG9wXG4gICAgfCBcIkJyb3dzZXJGb3J3YXJkXCIgLT4gQnJvd3NlckZvcndhcmRcbiAgICB8IFwiQnJvd3NlckJhY2tcIiAtPiBCcm93c2VyQmFja1xuICAgICgqIE1pc2MgKilcbiAgICB8IFwiT1NMZWZ0XCIgLT4gT1NMZWZ0XG4gICAgfCBcIk9TUmlnaHRcIiAtPiBPU1JpZ2h0XG4gICAgfCBcIlNjcm9sbExvY2tcIiAtPiBTY3JvbGxMb2NrXG4gICAgfCBcIlByaW50U2NyZWVuXCIgLT4gUHJpbnRTY3JlZW5cbiAgICB8IFwiSW50bEJhY2tzbGFzaFwiIC0+IEludGxCYWNrc2xhc2hcbiAgICB8IFwiSW50bFllblwiIC0+IEludGxZZW5cbiAgICB8IFwiUGF1c2VcIiAtPiBQYXVzZVxuICAgIHwgXyAtPiBVbmlkZW50aWZpZWRcblxuICBsZXQgdHJ5X2tleV9jb2RlX2xlZnQgPSBmdW5jdGlvblxuICAgIHwgMTYgLT4gU2hpZnRMZWZ0XG4gICAgfCAxNyAtPiBDb250cm9sTGVmdFxuICAgIHwgMTggLT4gQWx0TGVmdFxuICAgIHwgOTEgLT4gTWV0YUxlZnRcbiAgICB8IF8gLT4gVW5pZGVudGlmaWVkXG5cbiAgbGV0IHRyeV9rZXlfY29kZV9yaWdodCA9IGZ1bmN0aW9uXG4gICAgfCAxNiAtPiBTaGlmdFJpZ2h0XG4gICAgfCAxNyAtPiBDb250cm9sUmlnaHRcbiAgICB8IDE4IC0+IEFsdFJpZ2h0XG4gICAgfCA5MSAtPiBNZXRhUmlnaHRcbiAgICB8IF8gLT4gVW5pZGVudGlmaWVkXG5cbiAgbGV0IHRyeV9rZXlfY29kZV9udW1wYWQgPSBmdW5jdGlvblxuICAgIHwgNDYgLT4gTnVtcGFkRGVjaW1hbFxuICAgIHwgNDUgLT4gTnVtcGFkMFxuICAgIHwgMzUgLT4gTnVtcGFkMVxuICAgIHwgNDAgLT4gTnVtcGFkMlxuICAgIHwgMzQgLT4gTnVtcGFkM1xuICAgIHwgMzcgLT4gTnVtcGFkNFxuICAgIHwgMTIgLT4gTnVtcGFkNVxuICAgIHwgMzkgLT4gTnVtcGFkNlxuICAgIHwgMzYgLT4gTnVtcGFkN1xuICAgIHwgMzggLT4gTnVtcGFkOFxuICAgIHwgMzMgLT4gTnVtcGFkOVxuICAgIHwgMTMgLT4gTnVtcGFkRW50ZXJcbiAgICB8IDExMSAtPiBOdW1wYWREaXZpZGVcbiAgICB8IDEwNyAtPiBOdW1wYWRBZGRcbiAgICB8IDEwOSAtPiBOdW1wYWRTdWJ0cmFjdFxuICAgIHwgMTA2IC0+IE51bXBhZE11bHRpcGx5XG4gICAgfCAxMTAgLT4gTnVtcGFkRGVjaW1hbFxuICAgIHwgOTYgLT4gTnVtcGFkMFxuICAgIHwgOTcgLT4gTnVtcGFkMVxuICAgIHwgOTggLT4gTnVtcGFkMlxuICAgIHwgOTkgLT4gTnVtcGFkM1xuICAgIHwgMTAwIC0+IE51bXBhZDRcbiAgICB8IDEwMSAtPiBOdW1wYWQ1XG4gICAgfCAxMDIgLT4gTnVtcGFkNlxuICAgIHwgMTAzIC0+IE51bXBhZDdcbiAgICB8IDEwNCAtPiBOdW1wYWQ4XG4gICAgfCAxMDUgLT4gTnVtcGFkOVxuICAgIHwgXyAtPiBVbmlkZW50aWZpZWRcblxuICBsZXQgdHJ5X2tleV9jb2RlX25vcm1hbCA9IGZ1bmN0aW9uXG4gICAgfCAyNyAtPiBFc2NhcGVcbiAgICB8IDExMiAtPiBGMVxuICAgIHwgMTEzIC0+IEYyXG4gICAgfCAxMTQgLT4gRjNcbiAgICB8IDExNSAtPiBGNFxuICAgIHwgMTE2IC0+IEY1XG4gICAgfCAxMTcgLT4gRjZcbiAgICB8IDExOCAtPiBGN1xuICAgIHwgMTE5IC0+IEY4XG4gICAgfCAxMjAgLT4gRjlcbiAgICB8IDEyMSAtPiBGMTBcbiAgICB8IDEyMiAtPiBGMTFcbiAgICB8IDEyMyAtPiBGMTJcbiAgICB8IDQyIC0+IFByaW50U2NyZWVuXG4gICAgfCAxNDUgLT4gU2Nyb2xsTG9ja1xuICAgIHwgMTkgLT4gUGF1c2VcbiAgICB8IDE5MiAtPiBCYWNrcXVvdGVcbiAgICB8IDQ5IC0+IERpZ2l0MVxuICAgIHwgNTAgLT4gRGlnaXQyXG4gICAgfCA1MSAtPiBEaWdpdDNcbiAgICB8IDUyIC0+IERpZ2l0NFxuICAgIHwgNTMgLT4gRGlnaXQ1XG4gICAgfCA1NCAtPiBEaWdpdDZcbiAgICB8IDU1IC0+IERpZ2l0N1xuICAgIHwgNTYgLT4gRGlnaXQ4XG4gICAgfCA1NyAtPiBEaWdpdDlcbiAgICB8IDQ4IC0+IERpZ2l0MFxuICAgIHwgMTg5IC0+IE1pbnVzXG4gICAgfCAxODcgLT4gRXF1YWxcbiAgICB8IDggLT4gQmFja3NwYWNlXG4gICAgfCA5IC0+IFRhYlxuICAgIHwgODEgLT4gS2V5UVxuICAgIHwgODcgLT4gS2V5V1xuICAgIHwgNjkgLT4gS2V5RVxuICAgIHwgODIgLT4gS2V5UlxuICAgIHwgODQgLT4gS2V5VFxuICAgIHwgODkgLT4gS2V5WVxuICAgIHwgODUgLT4gS2V5VVxuICAgIHwgNzMgLT4gS2V5SVxuICAgIHwgNzkgLT4gS2V5T1xuICAgIHwgODAgLT4gS2V5UFxuICAgIHwgMjE5IC0+IEJyYWNrZXRMZWZ0XG4gICAgfCAyMjEgLT4gQnJhY2tldFJpZ2h0XG4gICAgfCAyMjAgLT4gQmFja3NsYXNoXG4gICAgfCAyMCAtPiBDYXBzTG9ja1xuICAgIHwgNjUgLT4gS2V5QVxuICAgIHwgODMgLT4gS2V5U1xuICAgIHwgNjggLT4gS2V5RFxuICAgIHwgNzAgLT4gS2V5RlxuICAgIHwgNzEgLT4gS2V5R1xuICAgIHwgNzIgLT4gS2V5SFxuICAgIHwgNzQgLT4gS2V5SlxuICAgIHwgNzUgLT4gS2V5S1xuICAgIHwgNzYgLT4gS2V5TFxuICAgIHwgMTg2IC0+IFNlbWljb2xvblxuICAgIHwgMjIyIC0+IFF1b3RlXG4gICAgfCAxMyAtPiBFbnRlclxuICAgIHwgOTAgLT4gS2V5WlxuICAgIHwgODggLT4gS2V5WFxuICAgIHwgNjcgLT4gS2V5Q1xuICAgIHwgODYgLT4gS2V5VlxuICAgIHwgNjYgLT4gS2V5QlxuICAgIHwgNzggLT4gS2V5TlxuICAgIHwgNzcgLT4gS2V5TVxuICAgIHwgMTg4IC0+IENvbW1hXG4gICAgfCAxOTAgLT4gUGVyaW9kXG4gICAgfCAxOTEgLT4gU2xhc2hcbiAgICB8IDMyIC0+IFNwYWNlXG4gICAgfCA5MyAtPiBDb250ZXh0TWVudVxuICAgIHwgNDUgLT4gSW5zZXJ0XG4gICAgfCAzNiAtPiBIb21lXG4gICAgfCAzMyAtPiBQYWdlVXBcbiAgICB8IDQ2IC0+IERlbGV0ZVxuICAgIHwgMzUgLT4gRW5kXG4gICAgfCAzNCAtPiBQYWdlRG93blxuICAgIHwgMzcgLT4gQXJyb3dMZWZ0XG4gICAgfCA0MCAtPiBBcnJvd0Rvd25cbiAgICB8IDM5IC0+IEFycm93UmlnaHRcbiAgICB8IDM4IC0+IEFycm93VXBcbiAgICB8IF8gLT4gVW5pZGVudGlmaWVkXG5cbiAgbGV0IG1ha2VfdW5pZGVudGlmaWVkIF8gPSBVbmlkZW50aWZpZWRcblxuICBsZXQgdHJ5X25leHQgdmFsdWUgZiA9IGZ1bmN0aW9uXG4gICAgfCBVbmlkZW50aWZpZWQgLT4gT3B0ZGVmLmNhc2UgdmFsdWUgbWFrZV91bmlkZW50aWZpZWQgZlxuICAgIHwgdiAtPiB2XG5cbiAgbGV0IHJ1bl9uZXh0IHZhbHVlIGYgPSBmdW5jdGlvblxuICAgIHwgVW5pZGVudGlmaWVkIC0+IGYgdmFsdWVcbiAgICB8IHYgLT4gdlxuXG4gIGxldCBnZXRfa2V5X2NvZGUgZXZ0ID0gZXZ0IyMua2V5Q29kZVxuXG4gIGxldCB0cnlfa2V5X2xvY2F0aW9uIGV2dCA9XG4gICAgbWF0Y2ggZXZ0IyMubG9jYXRpb24gd2l0aFxuICAgIHwgMSAtPiBydW5fbmV4dCAoZ2V0X2tleV9jb2RlIGV2dCkgdHJ5X2tleV9jb2RlX2xlZnRcbiAgICB8IDIgLT4gcnVuX25leHQgKGdldF9rZXlfY29kZSBldnQpIHRyeV9rZXlfY29kZV9yaWdodFxuICAgIHwgMyAtPiBydW5fbmV4dCAoZ2V0X2tleV9jb2RlIGV2dCkgdHJ5X2tleV9jb2RlX251bXBhZFxuICAgIHwgXyAtPiBtYWtlX3VuaWRlbnRpZmllZFxuXG4gIGxldCAoIHw+ICkgeCBmID0gZiB4XG5cbiAgbGV0IG9mX2V2ZW50IGV2dCA9XG4gICAgVW5pZGVudGlmaWVkXG4gICAgfD4gdHJ5X25leHQgZXZ0IyMuY29kZSB0cnlfY29kZVxuICAgIHw+IHRyeV9rZXlfbG9jYXRpb24gZXZ0XG4gICAgfD4gcnVuX25leHQgKGdldF9rZXlfY29kZSBldnQpIHRyeV9rZXlfY29kZV9ub3JtYWxcblxuICBsZXQgb2Zfa2V5X2NvZGUgPSB0cnlfa2V5X2NvZGVfbm9ybWFsXG5lbmRcblxubW9kdWxlIEtleWJvYXJkX2tleSA9IHN0cnVjdFxuICB0eXBlIHQgPSBVY2hhci50IG9wdGlvblxuXG4gIGxldCBjaGFyX29mX2ludCB2YWx1ZSA9XG4gICAgaWYgMCA8IHZhbHVlIHRoZW4gdHJ5IFNvbWUgKFVjaGFyLm9mX2ludCB2YWx1ZSkgd2l0aCBfIC0+IE5vbmUgZWxzZSBOb25lXG5cbiAgbGV0IGVtcHR5X3N0cmluZyBfID0gSnMuc3RyaW5nIFwiXCJcblxuICBsZXQgbm9uZSBfID0gTm9uZVxuXG4gIGxldCBvZl9ldmVudCBldnQgPVxuICAgIGxldCBrZXkgPSBPcHRkZWYuZ2V0IGV2dCMjLmtleSBlbXB0eV9zdHJpbmcgaW5cbiAgICBtYXRjaCBrZXkjIy5sZW5ndGggd2l0aFxuICAgIHwgMCAtPiBPcHRkZWYuY2FzZSBldnQjIy5jaGFyQ29kZSBub25lIGNoYXJfb2ZfaW50XG4gICAgfCAxIC0+IGNoYXJfb2ZfaW50IChpbnRfb2ZfZmxvYXQgKGtleSMjY2hhckNvZGVBdCAwKSlcbiAgICB8IF8gLT4gTm9uZVxuZW5kXG5cbigqKioqKilcblxubGV0IGVsZW1lbnQgOiAjRG9tLmVsZW1lbnQgdCAtPiBlbGVtZW50IHQgPSBKcy5VbnNhZmUuY29lcmNlXG5cbnR5cGUgdGFnZ2VkRWxlbWVudCA9XG4gIHwgQSBvZiBhbmNob3JFbGVtZW50IHRcbiAgfCBBcmVhIG9mIGFyZWFFbGVtZW50IHRcbiAgfCBBdWRpbyBvZiBhdWRpb0VsZW1lbnQgdFxuICB8IEJhc2Ugb2YgYmFzZUVsZW1lbnQgdFxuICB8IEJsb2NrcXVvdGUgb2YgcXVvdGVFbGVtZW50IHRcbiAgfCBCb2R5IG9mIGJvZHlFbGVtZW50IHRcbiAgfCBCciBvZiBickVsZW1lbnQgdFxuICB8IEJ1dHRvbiBvZiBidXR0b25FbGVtZW50IHRcbiAgfCBDYW52YXMgb2YgY2FudmFzRWxlbWVudCB0XG4gIHwgQ2FwdGlvbiBvZiB0YWJsZUNhcHRpb25FbGVtZW50IHRcbiAgfCBDb2wgb2YgdGFibGVDb2xFbGVtZW50IHRcbiAgfCBDb2xncm91cCBvZiB0YWJsZUNvbEVsZW1lbnQgdFxuICB8IERlbCBvZiBtb2RFbGVtZW50IHRcbiAgfCBEaXYgb2YgZGl2RWxlbWVudCB0XG4gIHwgRGwgb2YgZExpc3RFbGVtZW50IHRcbiAgfCBFbWJlZCBvZiBlbWJlZEVsZW1lbnQgdFxuICB8IEZpZWxkc2V0IG9mIGZpZWxkU2V0RWxlbWVudCB0XG4gIHwgRm9ybSBvZiBmb3JtRWxlbWVudCB0XG4gIHwgRnJhbWVzZXQgb2YgZnJhbWVTZXRFbGVtZW50IHRcbiAgfCBGcmFtZSBvZiBmcmFtZUVsZW1lbnQgdFxuICB8IEgxIG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBIMiBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSDMgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEg0IG9mIGhlYWRpbmdFbGVtZW50IHRcbiAgfCBINSBvZiBoZWFkaW5nRWxlbWVudCB0XG4gIHwgSDYgb2YgaGVhZGluZ0VsZW1lbnQgdFxuICB8IEhlYWQgb2YgaGVhZEVsZW1lbnQgdFxuICB8IEhyIG9mIGhyRWxlbWVudCB0XG4gIHwgSHRtbCBvZiBodG1sRWxlbWVudCB0XG4gIHwgSWZyYW1lIG9mIGlGcmFtZUVsZW1lbnQgdFxuICB8IEltZyBvZiBpbWFnZUVsZW1lbnQgdFxuICB8IElucHV0IG9mIGlucHV0RWxlbWVudCB0XG4gIHwgSW5zIG9mIG1vZEVsZW1lbnQgdFxuICB8IExhYmVsIG9mIGxhYmVsRWxlbWVudCB0XG4gIHwgTGVnZW5kIG9mIGxlZ2VuZEVsZW1lbnQgdFxuICB8IExpIG9mIGxpRWxlbWVudCB0XG4gIHwgTGluayBvZiBsaW5rRWxlbWVudCB0XG4gIHwgTWFwIG9mIG1hcEVsZW1lbnQgdFxuICB8IE1ldGEgb2YgbWV0YUVsZW1lbnQgdFxuICB8IE9iamVjdCBvZiBvYmplY3RFbGVtZW50IHRcbiAgfCBPbCBvZiBvTGlzdEVsZW1lbnQgdFxuICB8IE9wdGdyb3VwIG9mIG9wdEdyb3VwRWxlbWVudCB0XG4gIHwgT3B0aW9uIG9mIG9wdGlvbkVsZW1lbnQgdFxuICB8IFAgb2YgcGFyYW1FbGVtZW50IHRcbiAgfCBQYXJhbSBvZiBwYXJhbUVsZW1lbnQgdFxuICB8IFByZSBvZiBwcmVFbGVtZW50IHRcbiAgfCBRIG9mIHF1b3RlRWxlbWVudCB0XG4gIHwgU2NyaXB0IG9mIHNjcmlwdEVsZW1lbnQgdFxuICB8IFNlbGVjdCBvZiBzZWxlY3RFbGVtZW50IHRcbiAgfCBTdHlsZSBvZiBzdHlsZUVsZW1lbnQgdFxuICB8IFRhYmxlIG9mIHRhYmxlRWxlbWVudCB0XG4gIHwgVGJvZHkgb2YgdGFibGVTZWN0aW9uRWxlbWVudCB0XG4gIHwgVGQgb2YgdGFibGVDZWxsRWxlbWVudCB0XG4gIHwgVGV4dGFyZWEgb2YgdGV4dEFyZWFFbGVtZW50IHRcbiAgfCBUZm9vdCBvZiB0YWJsZVNlY3Rpb25FbGVtZW50IHRcbiAgfCBUaCBvZiB0YWJsZUNlbGxFbGVtZW50IHRcbiAgfCBUaGVhZCBvZiB0YWJsZVNlY3Rpb25FbGVtZW50IHRcbiAgfCBUaXRsZSBvZiB0aXRsZUVsZW1lbnQgdFxuICB8IFRyIG9mIHRhYmxlUm93RWxlbWVudCB0XG4gIHwgVWwgb2YgdUxpc3RFbGVtZW50IHRcbiAgfCBWaWRlbyBvZiB2aWRlb0VsZW1lbnQgdFxuICB8IE90aGVyIG9mIGVsZW1lbnQgdFxuXG5sZXQgb3RoZXIgZSA9IE90aGVyIChlIDogI2VsZW1lbnQgdCA6PiBlbGVtZW50IHQpXG5cbmxldCB0YWdnZWQgKGUgOiAjZWxlbWVudCB0KSA9XG4gIGxldCB0YWcgPSBKcy50b19ieXRlc3RyaW5nIGUjIy50YWdOYW1lIyN0b0xvd2VyQ2FzZSBpblxuICBpZiBTdHJpbmcubGVuZ3RoIHRhZyA9IDBcbiAgdGhlbiBvdGhlciBlXG4gIGVsc2VcbiAgICBtYXRjaCBTdHJpbmcudW5zYWZlX2dldCB0YWcgMCB3aXRoXG4gICAgfCAnYScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiYVwiIC0+IEEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImFyZWFcIiAtPiBBcmVhIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJhdWRpb1wiIC0+IEF1ZGlvIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ2InIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcImJhc2VcIiAtPiBCYXNlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJibG9ja3F1b3RlXCIgLT4gQmxvY2txdW90ZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiYm9keVwiIC0+IEJvZHkgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImJyXCIgLT4gQnIgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImJ1dHRvblwiIC0+IEJ1dHRvbiAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdjJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJjYW52YXNcIiAtPiBDYW52YXMgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImNhcHRpb25cIiAtPiBDYXB0aW9uIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJjb2xcIiAtPiBDb2wgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImNvbGdyb3VwXCIgLT4gQ29sZ3JvdXAgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnZCcgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiZGVsXCIgLT4gRGVsIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJkaXZcIiAtPiBEaXYgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImRsXCIgLT4gRGwgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnZScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiZW1iZWRcIiAtPiBFbWJlZCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdmJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJmaWVsZHNldFwiIC0+IEZpZWxkc2V0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJmb3JtXCIgLT4gRm9ybSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiZnJhbWVzZXRcIiAtPiBGcmFtZXNldCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiZnJhbWVcIiAtPiBGcmFtZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdoJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJoMVwiIC0+IEgxIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoMlwiIC0+IEgyIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoM1wiIC0+IEgzIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoNFwiIC0+IEg0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoNVwiIC0+IEg1IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoNlwiIC0+IEg2IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJoZWFkXCIgLT4gSGVhZCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaHJcIiAtPiBIciAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwiaHRtbFwiIC0+IEh0bWwgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnaScgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwiaWZyYW1lXCIgLT4gSWZyYW1lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJpbWdcIiAtPiBJbWcgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImlucHV0XCIgLT4gSW5wdXQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImluc1wiIC0+IElucyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdsJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJsYWJlbFwiIC0+IExhYmVsIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJsZWdlbmRcIiAtPiBMZWdlbmQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImxpXCIgLT4gTGkgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcImxpbmtcIiAtPiBMaW5rIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ20nIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcIm1hcFwiIC0+IE1hcCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwibWV0YVwiIC0+IE1ldGEgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAnbycgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwib2JqZWN0XCIgLT4gT2JqZWN0IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJvbFwiIC0+IE9sIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJvcHRncm91cFwiIC0+IE9wdGdyb3VwIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJvcHRpb25cIiAtPiBPcHRpb24gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAncCcgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwicFwiIC0+IFAgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInBhcmFtXCIgLT4gUGFyYW0gKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInByZVwiIC0+IFByZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdxJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJxXCIgLT4gUSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICdzJyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJzY3JpcHRcIiAtPiBTY3JpcHQgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBcInNlbGVjdFwiIC0+IFNlbGVjdCAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IFwic3R5bGVcIiAtPiBTdHlsZSAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8ICd0JyAtPiAoXG4gICAgICAgIG1hdGNoIHRhZyB3aXRoXG4gICAgICAgIHwgXCJ0YWJsZVwiIC0+IFRhYmxlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0Ym9keVwiIC0+IFRib2R5IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0ZFwiIC0+IFRkIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0ZXh0YXJlYVwiIC0+IFRleHRhcmVhIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0Zm9vdFwiIC0+IFRmb290IChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0aFwiIC0+IFRoIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0aGVhZFwiIC0+IFRoZWFkIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0aXRsZVwiIC0+IFRpdGxlIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXCJ0clwiIC0+IFRyIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgICAgIHwgXyAtPiBvdGhlciBlKVxuICAgIHwgJ3UnIC0+IChcbiAgICAgICAgbWF0Y2ggdGFnIHdpdGhcbiAgICAgICAgfCBcInVsXCIgLT4gVWwgKEpzLlVuc2FmZS5jb2VyY2UgZSlcbiAgICAgICAgfCBfIC0+IG90aGVyIGUpXG4gICAgfCAndicgLT4gKFxuICAgICAgICBtYXRjaCB0YWcgd2l0aFxuICAgICAgICB8IFwidmlkZW9cIiAtPiBWaWRlbyAoSnMuVW5zYWZlLmNvZXJjZSBlKVxuICAgICAgICB8IF8gLT4gb3RoZXIgZSlcbiAgICB8IF8gLT4gb3RoZXIgZVxuXG5sZXQgb3B0X3RhZ2dlZCBlID0gT3B0LmNhc2UgZSAoZnVuICgpIC0+IE5vbmUpIChmdW4gZSAtPiBTb21lICh0YWdnZWQgZSkpXG5cbnR5cGUgdGFnZ2VkRXZlbnQgPVxuICB8IE1vdXNlRXZlbnQgb2YgbW91c2VFdmVudCB0XG4gIHwgS2V5Ym9hcmRFdmVudCBvZiBrZXlib2FyZEV2ZW50IHRcbiAgfCBNZXNzYWdlRXZlbnQgb2YgbWVzc2FnZUV2ZW50IHRcbiAgfCBNb3VzZXdoZWVsRXZlbnQgb2YgbW91c2V3aGVlbEV2ZW50IHRcbiAgfCBNb3VzZVNjcm9sbEV2ZW50IG9mIG1vdXNlU2Nyb2xsRXZlbnQgdFxuICB8IFBvcFN0YXRlRXZlbnQgb2YgcG9wU3RhdGVFdmVudCB0XG4gIHwgT3RoZXJFdmVudCBvZiBldmVudCB0XG5cbmxldCB0YWdnZWRFdmVudCAoZXYgOiAjZXZlbnQgSnMudCkgPVxuICBKcy5PcHQuY2FzZVxuICAgIChDb2VyY2VUby5tb3VzZUV2ZW50IGV2KVxuICAgIChmdW4gKCkgLT5cbiAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgIChDb2VyY2VUby5rZXlib2FyZEV2ZW50IGV2KVxuICAgICAgICAoZnVuICgpIC0+XG4gICAgICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgICAgIChDb2VyY2VUby53aGVlbEV2ZW50IGV2KVxuICAgICAgICAgICAgKGZ1biAoKSAtPlxuICAgICAgICAgICAgICBKcy5PcHQuY2FzZVxuICAgICAgICAgICAgICAgIChDb2VyY2VUby5tb3VzZVNjcm9sbEV2ZW50IGV2KVxuICAgICAgICAgICAgICAgIChmdW4gKCkgLT5cbiAgICAgICAgICAgICAgICAgIEpzLk9wdC5jYXNlXG4gICAgICAgICAgICAgICAgICAgIChDb2VyY2VUby5wb3BTdGF0ZUV2ZW50IGV2KVxuICAgICAgICAgICAgICAgICAgICAoZnVuICgpIC0+XG4gICAgICAgICAgICAgICAgICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIChDb2VyY2VUby5tZXNzYWdlRXZlbnQgZXYpXG4gICAgICAgICAgICAgICAgICAgICAgICAoZnVuICgpIC0+IE90aGVyRXZlbnQgKGV2IDo+IGV2ZW50IHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKGZ1biBldiAtPiBNZXNzYWdlRXZlbnQgZXYpKVxuICAgICAgICAgICAgICAgICAgICAoZnVuIGV2IC0+IFBvcFN0YXRlRXZlbnQgZXYpKVxuICAgICAgICAgICAgICAgIChmdW4gZXYgLT4gTW91c2VTY3JvbGxFdmVudCBldikpXG4gICAgICAgICAgICAoZnVuIGV2IC0+IE1vdXNld2hlZWxFdmVudCBldikpXG4gICAgICAgIChmdW4gZXYgLT4gS2V5Ym9hcmRFdmVudCBldikpXG4gICAgKGZ1biBldiAtPiBNb3VzZUV2ZW50IGV2KVxuXG5sZXQgb3B0X3RhZ2dlZEV2ZW50IGV2ID0gT3B0LmNhc2UgZXYgKGZ1biAoKSAtPiBOb25lKSAoZnVuIGV2IC0+IFNvbWUgKHRhZ2dlZEV2ZW50IGV2KSlcblxubGV0IHN0b3BQcm9wYWdhdGlvbiBldiA9XG4gIGxldCBlID0gSnMuVW5zYWZlLmNvZXJjZSBldiBpblxuICBPcHRkZWYuY2FzZVxuICAgIGUjIy5zdG9wUHJvcGFnYXRpb25cbiAgICAoZnVuICgpIC0+IGUjIy5jYW5jZWxCdWJibGUgOj0gSnMuX3RydWUpXG4gICAgKGZ1biBfIC0+IGUjI19zdG9wUHJvcGFnYXRpb24pXG5cbmxldCBfcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogKHVuaXQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgLT4gdW5pdCA9XG4gIEpzLlVuc2FmZS5wdXJlX2V4cHIgKGZ1biBfIC0+XG4gICAgICBsZXQgdyA9IEpzLlVuc2FmZS5jb2VyY2Ugd2luZG93IGluXG4gICAgICBsZXQgbCA9XG4gICAgICAgIFsgdyMjLnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA7IHcjIy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOyB3IyMud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICAgIDsgdyMjLm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOyB3IyMubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgXVxuICAgICAgaW5cbiAgICAgIHRyeVxuICAgICAgICBsZXQgcmVxID0gTGlzdC5maW5kIChmdW4gYyAtPiBKcy5PcHRkZWYudGVzdCBjKSBsIGluXG4gICAgICAgIGZ1biBjYWxsYmFjayAtPiBKcy5VbnNhZmUuZnVuX2NhbGwgcmVxIFt8IEpzLlVuc2FmZS5pbmplY3QgY2FsbGJhY2sgfF1cbiAgICAgIHdpdGggTm90X2ZvdW5kIC0+XG4gICAgICAgIGxldCBub3cgKCkgPSAobmV3JWpzIEpzLmRhdGVfbm93KSMjZ2V0VGltZSBpblxuICAgICAgICBsZXQgbGFzdCA9IHJlZiAobm93ICgpKSBpblxuICAgICAgICBmdW4gY2FsbGJhY2sgLT5cbiAgICAgICAgICBsZXQgdCA9IG5vdyAoKSBpblxuICAgICAgICAgIGxldCBkdCA9ICFsYXN0ICsuICgxMDAwLiAvLiA2MC4pIC0uIHQgaW5cbiAgICAgICAgICBsZXQgZHQgPSBpZiBQb2x5LihkdCA8IDAuKSB0aGVuIDAuIGVsc2UgZHQgaW5cbiAgICAgICAgICBsYXN0IDo9IHQ7XG4gICAgICAgICAgaWdub3JlICh3aW5kb3cjI3NldFRpbWVvdXQgY2FsbGJhY2sgZHQpKVxuXG4oKioqKilcblxubGV0IGhhc1B1c2hTdGF0ZSAoKSA9IEpzLk9wdGRlZi50ZXN0IChKcy5VbnNhZmUuY29lcmNlIHdpbmRvdyMjLmhpc3RvcnkpIyMucHVzaFN0YXRlXG5cbmxldCBoYXNQbGFjZWhvbGRlciAoKSA9XG4gIGxldCBpID0gY3JlYXRlSW5wdXQgZG9jdW1lbnQgaW5cbiAgSnMuT3B0ZGVmLnRlc3QgKEpzLlVuc2FmZS5jb2VyY2UgaSkjIy5wbGFjZWhvbGRlclxuXG5sZXQgaGFzUmVxdWlyZWQgKCkgPVxuICBsZXQgaSA9IGNyZWF0ZUlucHV0IGRvY3VtZW50IGluXG4gIEpzLk9wdGRlZi50ZXN0IChKcy5VbnNhZmUuY29lcmNlIGkpIyMucmVxdWlyZWRcblxubGV0IG92ZXJmbG93X2xpbWl0ID0gMjE0NzQ4M18wMDAuXG5cbigqIG1zICopXG5cbnR5cGUgdGltZW91dF9pZF9zYWZlID0gdGltZW91dF9pZCBvcHRpb24gcmVmXG5cbmxldCBzZXRUaW1lb3V0IGNhbGxiYWNrIGQgOiB0aW1lb3V0X2lkX3NhZmUgPVxuICBsZXQgaWQgPSByZWYgTm9uZSBpblxuICBsZXQgcmVjIGxvb3AgZCAoKSA9XG4gICAgbGV0IHN0ZXAsIHJlbWFpbiA9XG4gICAgICBpZiBQb2x5LihkID4gb3ZlcmZsb3dfbGltaXQpIHRoZW4gb3ZlcmZsb3dfbGltaXQsIGQgLS4gb3ZlcmZsb3dfbGltaXQgZWxzZSBkLCAwLlxuICAgIGluXG4gICAgbGV0IGNiID0gaWYgUG9seS4ocmVtYWluID0gMC4pIHRoZW4gY2FsbGJhY2sgZWxzZSBsb29wIHJlbWFpbiBpblxuICAgIGlkIDo9IFNvbWUgKHdpbmRvdyMjc2V0VGltZW91dCAoSnMud3JhcF9jYWxsYmFjayBjYikgc3RlcClcbiAgaW5cbiAgbG9vcCBkICgpO1xuICBpZFxuXG5sZXQgY2xlYXJUaW1lb3V0IChpZCA6IHRpbWVvdXRfaWRfc2FmZSkgPVxuICBtYXRjaCAhaWQgd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIHggLT5cbiAgICAgIGlkIDo9IE5vbmU7XG4gICAgICB3aW5kb3cjI2NsZWFyVGltZW91dCB4XG5cbmxldCBqc19hcnJheV9vZl9jb2xsZWN0aW9uIChjIDogI2VsZW1lbnQgY29sbGVjdGlvbiBKcy50KSA6ICNlbGVtZW50IEpzLnQgSnMuanNfYXJyYXkgSnMudFxuICAgID1cbiAgSnMuVW5zYWZlLihtZXRoX2NhbGwgKGpzX2V4cHIgXCJbXS5zbGljZVwiKSBcImNhbGxcIiBbfCBpbmplY3QgYyB8XSlcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEgUGllcnJlIENoYW1iYXJ0XG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiBKc1xub3BlbiBEb21faHRtbFxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgZm9ybURhdGEgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYXBwZW5kIDoganNfc3RyaW5nIHQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXBwZW5kX2Jsb2IgOiBqc19zdHJpbmcgdCAtPiBGaWxlLmJsb2IgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmxldCBmb3JtRGF0YSA6IGZvcm1EYXRhIHQgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9Gb3JtRGF0YVxuXG5sZXQgZm9ybURhdGFfZm9ybSA6IChmb3JtRWxlbWVudCB0IC0+IGZvcm1EYXRhIHQpIGNvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRm9ybURhdGFcblxudHlwZSBmb3JtX2VsdCA9XG4gIFsgYFN0cmluZyBvZiBqc19zdHJpbmcgdFxuICB8IGBGaWxlIG9mIEZpbGUuZmlsZSB0XG4gIF1cblxudHlwZSBmb3JtX2NvbnRlbnRzID1cbiAgWyBgRmllbGRzIG9mIChzdHJpbmcgKiBmb3JtX2VsdCkgbGlzdCByZWZcbiAgfCBgRm9ybURhdGEgb2YgZm9ybURhdGEgdFxuICBdXG5cbmxldCByZWMgZmlsdGVyX21hcCBmID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBbXVxuICB8IHYgOjogcSAtPiAoXG4gICAgICBtYXRjaCBmIHYgd2l0aFxuICAgICAgfCBOb25lIC0+IGZpbHRlcl9tYXAgZiBxXG4gICAgICB8IFNvbWUgdicgLT4gdicgOjogZmlsdGVyX21hcCBmIHEpXG5cbmNsYXNzIHR5cGUgc3VibWl0dGFibGVFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGRpc2FibGVkIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBuYW1lIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxubGV0IGhhdmVfY29udGVudCAoZWx0IDogc3VibWl0dGFibGVFbGVtZW50IHQpID1cbiAgZWx0IyMubmFtZSMjLmxlbmd0aCA+IDAgJiYgbm90IChKcy50b19ib29sIGVsdCMjLmRpc2FibGVkKVxuXG5sZXQgZ2V0X3RleHRhcmVhX3ZhbCAoZWx0IDogdGV4dEFyZWFFbGVtZW50IHQpID1cbiAgaWYgaGF2ZV9jb250ZW50IChlbHQgOj4gc3VibWl0dGFibGVFbGVtZW50IHQpXG4gIHRoZW5cbiAgICBsZXQgbmFtZSA9IHRvX3N0cmluZyBlbHQjIy5uYW1lIGluXG4gICAgWyBuYW1lLCBgU3RyaW5nIGVsdCMjLnZhbHVlIF1cbiAgZWxzZSBbXVxuXG5sZXQgZ2V0X3NlbGVjdF92YWwgKGVsdCA6IHNlbGVjdEVsZW1lbnQgdCkgPVxuICBpZiBoYXZlX2NvbnRlbnQgKGVsdCA6PiBzdWJtaXR0YWJsZUVsZW1lbnQgdClcbiAgdGhlblxuICAgIGxldCBuYW1lID0gdG9fc3RyaW5nIGVsdCMjLm5hbWUgaW5cbiAgICBpZiB0b19ib29sIGVsdCMjLm11bHRpcGxlXG4gICAgdGhlblxuICAgICAgbGV0IG9wdGlvbnMgPVxuICAgICAgICBBcnJheS5pbml0IGVsdCMjLm9wdGlvbnMjIy5sZW5ndGggKGZ1biBpIC0+IE9wdC50b19vcHRpb24gKGVsdCMjLm9wdGlvbnMjI2l0ZW0gaSkpXG4gICAgICBpblxuICAgICAgZmlsdGVyX21hcFxuICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICB8IE5vbmUgLT4gTm9uZVxuICAgICAgICAgIHwgU29tZSBlIC0+XG4gICAgICAgICAgICAgIGlmIEpzLnRvX2Jvb2wgZSMjLnNlbGVjdGVkIHRoZW4gU29tZSAobmFtZSwgYFN0cmluZyBlIyMudmFsdWUpIGVsc2UgTm9uZSlcbiAgICAgICAgKEFycmF5LnRvX2xpc3Qgb3B0aW9ucylcbiAgICBlbHNlIFsgbmFtZSwgYFN0cmluZyBlbHQjIy52YWx1ZSBdXG4gIGVsc2UgW11cblxuY2xhc3MgdHlwZSBmaWxlX2lucHV0ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBpbnB1dEVsZW1lbnRcblxuICAgIG1ldGhvZCBmaWxlcyA6IEZpbGUuZmlsZUxpc3QgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG11bHRpcGxlIDogYm9vbCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IGdldF9pbnB1dF92YWwgPyhnZXQgPSBmYWxzZSkgKGVsdCA6IGlucHV0RWxlbWVudCB0KSA9XG4gIGlmIGhhdmVfY29udGVudCAoZWx0IDo+IHN1Ym1pdHRhYmxlRWxlbWVudCB0KVxuICB0aGVuXG4gICAgbGV0IG5hbWUgPSB0b19zdHJpbmcgZWx0IyMubmFtZSBpblxuICAgIGxldCB2YWx1ZSA9IGVsdCMjLnZhbHVlIGluXG4gICAgbWF0Y2ggdG9fYnl0ZXN0cmluZyBlbHQjIy5fdHlwZSMjdG9Mb3dlckNhc2Ugd2l0aFxuICAgIHwgXCJjaGVja2JveFwiIHwgXCJyYWRpb1wiIC0+XG4gICAgICAgIGlmIHRvX2Jvb2wgZWx0IyMuY2hlY2tlZCB0aGVuIFsgbmFtZSwgYFN0cmluZyB2YWx1ZSBdIGVsc2UgW11cbiAgICB8IFwic3VibWl0XCIgfCBcInJlc2V0XCIgLT4gW11cbiAgICB8IFwidGV4dFwiIHwgXCJwYXNzd29yZFwiIC0+IFsgbmFtZSwgYFN0cmluZyB2YWx1ZSBdXG4gICAgfCBcImZpbGVcIiAtPiAoXG4gICAgICAgIGlmIGdldFxuICAgICAgICB0aGVuIFsgbmFtZSwgYFN0cmluZyB2YWx1ZSBdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBsZXQgZWx0IDogZmlsZV9pbnB1dCB0ID0gVW5zYWZlLmNvZXJjZSBlbHQgaW5cbiAgICAgICAgICBtYXRjaCBPcHRkZWYudG9fb3B0aW9uIGVsdCMjLmZpbGVzIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gW11cbiAgICAgICAgICB8IFNvbWUgbGlzdCAtPiAoXG4gICAgICAgICAgICAgIGlmIGxpc3QjIy5sZW5ndGggPSAwXG4gICAgICAgICAgICAgIHRoZW4gWyBuYW1lLCBgU3RyaW5nIChKcy5zdHJpbmcgXCJcIikgXVxuICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWF0Y2ggT3B0ZGVmLnRvX29wdGlvbiBlbHQjIy5tdWx0aXBsZSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIHwgU29tZSBmYWxzZSAtPiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoIE9wdC50b19vcHRpb24gKGxpc3QjI2l0ZW0gMCkgd2l0aFxuICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gW11cbiAgICAgICAgICAgICAgICAgICAgfCBTb21lIGZpbGUgLT4gWyBuYW1lLCBgRmlsZSBmaWxlIF0pXG4gICAgICAgICAgICAgICAgfCBTb21lIHRydWUgLT5cbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyX21hcFxuICAgICAgICAgICAgICAgICAgICAgIChmdW4gZiAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggT3B0LnRvX29wdGlvbiBmIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgZmlsZSAtPiBTb21lIChuYW1lLCBgRmlsZSBmaWxlKSlcbiAgICAgICAgICAgICAgICAgICAgICAoQXJyYXkudG9fbGlzdCAoQXJyYXkuaW5pdCBsaXN0IyMubGVuZ3RoIChmdW4gaSAtPiBsaXN0IyNpdGVtIGkpKSkpKVxuICAgIHwgXyAtPiBbIG5hbWUsIGBTdHJpbmcgdmFsdWUgXVxuICBlbHNlIFtdXG5cbmxldCBnZXRfZm9ybV9lbGVtZW50cyAoZm9ybSA6IGZvcm1FbGVtZW50IHQpID1cbiAgbGV0IHJlYyBsb29wIGFjYyBpID1cbiAgICBpZiBpIDwgMFxuICAgIHRoZW4gYWNjXG4gICAgZWxzZVxuICAgICAgbWF0Y2ggT3B0LnRvX29wdGlvbiAoZm9ybSMjLmVsZW1lbnRzIyNpdGVtIGkpIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBsb29wIGFjYyAoaSAtIGkpXG4gICAgICB8IFNvbWUgeCAtPiBsb29wICh4IDo6IGFjYykgKGkgLSAxKVxuICBpblxuICBsb29wIFtdIChmb3JtIyMuZWxlbWVudHMjIy5sZW5ndGggLSAxKVxuXG5sZXQgZ2V0X2VsZW1lbnRfY29udGVudCA/Z2V0IHYgPVxuICBtYXRjaCB0YWdnZWQgdiB3aXRoXG4gIHwgU2VsZWN0IHYgLT4gZ2V0X3NlbGVjdF92YWwgdlxuICB8IElucHV0IHYgLT4gZ2V0X2lucHV0X3ZhbCA/Z2V0IHZcbiAgfCBUZXh0YXJlYSB2IC0+IGdldF90ZXh0YXJlYV92YWwgdlxuICB8IF8gLT4gW11cblxubGV0IGZvcm1fZWxlbWVudHMgP2dldCAoZm9ybSA6IGZvcm1FbGVtZW50IHQpID1cbiAgTGlzdC5mbGF0dGVuIChMaXN0Lm1hcCAoZnVuIHYgLT4gZ2V0X2VsZW1lbnRfY29udGVudCA/Z2V0IHYpIChnZXRfZm9ybV9lbGVtZW50cyBmb3JtKSlcblxubGV0IGFwcGVuZCAoZm9ybV9jb250ZW50cyA6IGZvcm1fY29udGVudHMpIChmb3JtX2VsdCA6IHN0cmluZyAqIGZvcm1fZWx0KSA9XG4gIG1hdGNoIGZvcm1fY29udGVudHMgd2l0aFxuICB8IGBGaWVsZHMgbGlzdCAtPiBsaXN0IDo9IGZvcm1fZWx0IDo6ICFsaXN0XG4gIHwgYEZvcm1EYXRhIGYgLT4gKFxuICAgICAgbWF0Y2ggZm9ybV9lbHQgd2l0aFxuICAgICAgfCBuYW1lLCBgU3RyaW5nIHMgLT4gZiMjYXBwZW5kIChzdHJpbmcgbmFtZSkgc1xuICAgICAgfCBuYW1lLCBgRmlsZSBmaWxlIC0+IGYjI2FwcGVuZF9ibG9iIChzdHJpbmcgbmFtZSkgKGZpbGUgOj4gRmlsZS5ibG9iIHQpKVxuXG5sZXQgZW1wdHlfZm9ybV9jb250ZW50cyAoKSA9XG4gIG1hdGNoIE9wdGRlZi50b19vcHRpb24gKEpzLmRlZiBmb3JtRGF0YSkgd2l0aFxuICB8IE5vbmUgLT4gYEZpZWxkcyAocmVmIFtdKVxuICB8IFNvbWUgY29uc3RyIC0+IGBGb3JtRGF0YSAobmV3JWpzIGNvbnN0cilcblxubGV0IHBvc3RfZm9ybV9jb250ZW50cyBmb3JtID1cbiAgbGV0IGNvbnRlbnRzID0gZW1wdHlfZm9ybV9jb250ZW50cyAoKSBpblxuICBMaXN0Lml0ZXIgKGFwcGVuZCBjb250ZW50cykgKGZvcm1fZWxlbWVudHMgZm9ybSk7XG4gIGNvbnRlbnRzXG5cbmxldCBnZXRfZm9ybV9jb250ZW50cyBmb3JtID1cbiAgTGlzdC5tYXBcbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgbmFtZSwgYFN0cmluZyBzIC0+IG5hbWUsIHRvX3N0cmluZyBzXG4gICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuICAgIChmb3JtX2VsZW1lbnRzIH5nZXQ6dHJ1ZSBmb3JtKVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBKw6lyw7RtZSBWb3VpbGxvblxuICogTGFib3JhdG9pcmUgUFBTIC0gQ05SUyBVbml2ZXJzaXTDqSBQYXJpcyBEaWRlcm90XG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4gSnNcbm9wZW4hIEltcG9ydFxuXG50eXBlIHJlYWR5U3RhdGUgPVxuICB8IFVOU0VOVFxuICB8IE9QRU5FRFxuICB8IEhFQURFUlNfUkVDRUlWRURcbiAgfCBMT0FESU5HXG4gIHwgRE9ORVxuXG50eXBlIF8gcmVzcG9uc2UgPVxuICB8IEFycmF5QnVmZmVyIDogVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXIgdCBPcHQudCByZXNwb25zZVxuICB8IEJsb2IgOiAjRmlsZS5ibG9iIHQgT3B0LnQgcmVzcG9uc2VcbiAgfCBEb2N1bWVudCA6IERvbS5lbGVtZW50IERvbS5kb2N1bWVudCB0IE9wdC50IHJlc3BvbnNlXG4gIHwgSlNPTiA6ICdhIE9wdC50IHJlc3BvbnNlXG4gIHwgVGV4dCA6IGpzX3N0cmluZyB0IHJlc3BvbnNlXG4gIHwgRGVmYXVsdCA6IHN0cmluZyByZXNwb25zZVxuXG5jbGFzcyB0eXBlIHhtbEh0dHBSZXF1ZXN0ID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBtZXRob2Qgb25yZWFkeXN0YXRlY2hhbmdlIDogKHVuaXQgLT4gdW5pdCkgSnMuY2FsbGJhY2sgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDogcmVhZHlTdGF0ZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX29wZW4gOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgX29wZW5fZnVsbCA6XG4gICAgICAgICBqc19zdHJpbmcgdFxuICAgICAgLT4ganNfc3RyaW5nIHRcbiAgICAgIC0+IGJvb2wgdFxuICAgICAgLT4ganNfc3RyaW5nIHQgb3B0XG4gICAgICAtPiBqc19zdHJpbmcgdCBvcHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFJlcXVlc3RIZWFkZXIgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBvdmVycmlkZU1pbWVUeXBlIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VuZCA6IGpzX3N0cmluZyB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZW5kX2Jsb2IgOiAjRmlsZS5ibG9iIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9kb2N1bWVudCA6IERvbS5lbGVtZW50IERvbS5kb2N1bWVudCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNlbmRfZm9ybURhdGEgOiBGb3JtLmZvcm1EYXRhIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYWJvcnQgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGF0dXMgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN0YXR1c1RleHQgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0UmVzcG9uc2VIZWFkZXIgOiBqc19zdHJpbmcgdCAtPiBqc19zdHJpbmcgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEFsbFJlc3BvbnNlSGVhZGVycyA6IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCByZXNwb25zZSA6IEZpbGUuZmlsZV9hbnkgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlc3BvbnNlVGV4dCA6IGpzX3N0cmluZyB0IG9wdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVzcG9uc2VYTUwgOiBEb20uZWxlbWVudCBEb20uZG9jdW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlc3BvbnNlVHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB3aXRoQ3JlZGVudGlhbHMgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcblxuICAgIGluaGVyaXQgRmlsZS5wcm9ncmVzc0V2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2Qgb250aW1lb3V0IDpcbiAgICAgICgnc2VsZiB0LCAnc2VsZiBGaWxlLnByb2dyZXNzRXZlbnQgdCkgRG9tLmV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgdXBsb2FkIDogeG1sSHR0cFJlcXVlc3RVcGxvYWQgdCBvcHRkZWYgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuYW5kIHhtbEh0dHBSZXF1ZXN0VXBsb2FkID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBpbmhlcml0IEZpbGUucHJvZ3Jlc3NFdmVudFRhcmdldFxuICBlbmRcblxubW9kdWxlIEV2ZW50ID0gc3RydWN0XG4gIHR5cGUgdHlwID0geG1sSHR0cFJlcXVlc3QgRmlsZS5wcm9ncmVzc0V2ZW50IHQgRG9tLkV2ZW50LnR5cFxuXG4gIGxldCByZWFkeXN0YXRlY2hhbmdlID0gRG9tLkV2ZW50Lm1ha2UgXCJyZWFkeXN0YXRlY2hhbmdlXCJcblxuICBsZXQgbG9hZHN0YXJ0ID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2Fkc3RhcnRcIlxuXG4gIGxldCBwcm9ncmVzcyA9IERvbS5FdmVudC5tYWtlIFwicHJvZ3Jlc3NcIlxuXG4gIGxldCBhYm9ydCA9IERvbS5FdmVudC5tYWtlIFwiYWJvcnRcIlxuXG4gIGxldCBlcnJvciA9IERvbS5FdmVudC5tYWtlIFwiZXJyb3JcIlxuXG4gIGxldCBsb2FkID0gRG9tLkV2ZW50Lm1ha2UgXCJsb2FkXCJcblxuICBsZXQgdGltZW91dCA9IERvbS5FdmVudC5tYWtlIFwidGltZW91dFwiXG5cbiAgbGV0IGxvYWRlbmQgPSBEb20uRXZlbnQubWFrZSBcImxvYWRlbmRcIlxuZW5kXG5cbmV4dGVybmFsIGNyZWF0ZSA6IHVuaXQgLT4geG1sSHR0cFJlcXVlc3QgSnMudCA9IFwiY2FtbF94bWxodHRwcmVxdWVzdF9jcmVhdGVcIlxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNSBPQ2FtbFBybzogR3LDqWdvaXJlIEhlbnJ5LCDDh2HEn2RhxZ8gQm96bWFuLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuIERvbV9odG1sXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBbJ2EsICdiXSB3b3JrZXIgPVxuICBvYmplY3QgKCdzZWxmKVxuICAgIGluaGVyaXQgZXZlbnRUYXJnZXRcblxuICAgIG1ldGhvZCBvbmVycm9yIDogKCdzZWxmIHQsIGVycm9yRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1lc3NhZ2UgOiAoJ3NlbGYgdCwgJ2IgbWVzc2FnZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgcG9zdE1lc3NhZ2UgOiAnYSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXJtaW5hdGUgOiB1bml0IG1ldGhcbiAgZW5kXG5cbmFuZCBlcnJvckV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBldmVudFxuXG4gICAgbWV0aG9kIG1lc3NhZ2UgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZmlsZW5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbGluZW5vIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb2xubyA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZXJyb3IgOiBVbnNhZmUuYW55IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmFuZCBbJ2FdIG1lc3NhZ2VFdmVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZXZlbnRcblxuICAgIG1ldGhvZCBkYXRhIDogJ2EgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IHdvcmtlciA9IFVuc2FmZS5nbG9iYWwjIy5fV29ya2VyXG5cbmxldCBjcmVhdGUgc2NyaXB0ID0gbmV3JWpzIHdvcmtlciAoc3RyaW5nIHNjcmlwdClcblxubGV0IGltcG9ydF9zY3JpcHRzIHNjcmlwdHMgOiB1bml0ID1cbiAgaWYgVW5zYWZlLmdsb2JhbCMjLmltcG9ydFNjcmlwdHMgPT0gdW5kZWZpbmVkXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJXb3JrZXIuaW1wb3J0X3NjcmlwdHMgaXMgdW5kZWZpbmVkXCI7XG4gIFVuc2FmZS5mdW5fY2FsbFxuICAgIFVuc2FmZS5nbG9iYWwjIy5pbXBvcnRTY3JpcHRzXG4gICAgKEFycmF5Lm1hcCAoZnVuIHMgLT4gVW5zYWZlLmluamVjdCAoc3RyaW5nIHMpKSAoQXJyYXkub2ZfbGlzdCBzY3JpcHRzKSlcblxubGV0IHNldF9vbm1lc3NhZ2UgaGFuZGxlciA9XG4gIGlmIFVuc2FmZS5nbG9iYWwjIy5vbm1lc3NhZ2UgPT0gdW5kZWZpbmVkXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJXb3JrZXIub25tZXNzYWdlIGlzIHVuZGVmaW5lZFwiO1xuICBsZXQganNfaGFuZGxlciAoZXYgOiAnYSBtZXNzYWdlRXZlbnQgSnMudCkgPSBoYW5kbGVyIGV2IyMuZGF0YSBpblxuICBVbnNhZmUuZ2xvYmFsIyMub25tZXNzYWdlIDo9IHdyYXBfY2FsbGJhY2sganNfaGFuZGxlclxuXG5sZXQgcG9zdF9tZXNzYWdlIG1zZyA9XG4gIGlmIFVuc2FmZS5nbG9iYWwjIy5wb3N0TWVzc2FnZSA9PSB1bmRlZmluZWRcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIldvcmtlci5vbm1lc3NhZ2UgaXMgdW5kZWZpbmVkXCI7XG4gIFVuc2FmZS5nbG9iYWwjI3Bvc3RNZXNzYWdlIG1zZ1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMiBKYWNxdWVzLVBhc2NhbCBEZXBsYWl4XG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiEgSW1wb3J0XG5cbnR5cGUgcmVhZHlTdGF0ZSA9XG4gIHwgQ09OTkVDVElOR1xuICB8IE9QRU5cbiAgfCBDTE9TSU5HXG4gIHwgQ0xPU0VEXG5cbmNsYXNzIHR5cGUgWydhXSBjbG9zZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbJ2FdIERvbS5ldmVudFxuXG4gICAgbWV0aG9kIGNvZGUgOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlYXNvbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3YXNDbGVhbiA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIFsnYV0gbWVzc2FnZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbJ2FdIERvbS5ldmVudFxuXG4gICAgbWV0aG9kIGRhdGEgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZGF0YV9idWZmZXIgOiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkYXRhX2Jsb2IgOiBGaWxlLmJsb2IgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHdlYlNvY2tldCA9XG4gIG9iamVjdCAoJ3NlbGYpXG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIHVybCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZWFkeVN0YXRlIDogcmVhZHlTdGF0ZSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYnVmZmVyZWRBbW91bnQgOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9ub3BlbiA6XG4gICAgICAoJ3NlbGYgSnMudCwgJ3NlbGYgRG9tLmV2ZW50IEpzLnQpIERvbS5ldmVudF9saXN0ZW5lciBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9uY2xvc2UgOlxuICAgICAgKCdzZWxmIEpzLnQsICdzZWxmIGNsb3NlRXZlbnQgSnMudCkgRG9tLmV2ZW50X2xpc3RlbmVyIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25lcnJvciA6XG4gICAgICAoJ3NlbGYgSnMudCwgJ3NlbGYgRG9tLmV2ZW50IEpzLnQpIERvbS5ldmVudF9saXN0ZW5lciBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGV4dGVuc2lvbnMgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJvdG9jb2wgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2xvc2UgOiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBjbG9zZV93aXRoQ29kZSA6IGludCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBjbG9zZV93aXRoQ29kZUFuZFJlYXNvbiA6IGludCAtPiBKcy5qc19zdHJpbmcgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBvbm1lc3NhZ2UgOlxuICAgICAgKCdzZWxmIEpzLnQsICdzZWxmIG1lc3NhZ2VFdmVudCBKcy50KSBEb20uZXZlbnRfbGlzdGVuZXIgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBiaW5hcnlUeXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgbWV0aG9kIHNlbmQgOiBKcy5qc19zdHJpbmcgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBzZW5kX2J1ZmZlciA6IFR5cGVkX2FycmF5LmFycmF5QnVmZmVyIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgc2VuZF9ibG9iIDogRmlsZS5ibG9iIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgd2ViU29ja2V0ID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9XZWJTb2NrZXRcblxubGV0IHdlYlNvY2tldF93aXRoUHJvdG9jb2wgPSB3ZWJTb2NrZXRcblxubGV0IHdlYlNvY2tldF93aXRoUHJvdG9jb2xzID0gd2ViU29ja2V0XG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCB3ZWJTb2NrZXRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxuKCoqIDUuMSBUeXBlcyAqKVxuXG50eXBlIHNpemVpID0gaW50XG5cbnR5cGUgc2l6ZWlwdHIgPSBpbnRcblxudHlwZSBpbnRwdHIgPSBpbnRcblxudHlwZSB1aW50ID0gaW50XG5cbnR5cGUgY2xhbXBmID0gZmxvYXRcblxudHlwZSB2b2lkXG5cbnR5cGUgY2xlYXJCdWZmZXJNYXNrID0gaW50XG5cbnR5cGUgYmVnaW5Nb2RlXG5cbnR5cGUgYmxlbmRpbmdGYWN0b3JcblxudHlwZSBibGVuZE1vZGVcblxudHlwZSBidWZmZXJUYXJnZXRcblxudHlwZSBidWZmZXJVc2FnZVxuXG50eXBlIGN1bGxGYWNlTW9kZVxuXG50eXBlIGRlcHRoRnVuY3Rpb25cblxudHlwZSBlbmFibGVDYXBcblxudHlwZSBlcnJvckNvZGVcblxudHlwZSBmcm9udEZhY2VEaXJcblxudHlwZSBoaW50VGFyZ2V0XG5cbnR5cGUgaGludE1vZGVcblxudHlwZSB0ZXh0dXJlVW5pdCA9IGludFxuXG50eXBlICdhIHBpeGVsU3RvcmVQYXJhbVxuXG50eXBlIHN0ZW5jaWxPcFxuXG50eXBlIGZiVGFyZ2V0XG5cbnR5cGUgYXR0YWNobWVudFBvaW50XG5cbnR5cGUgcmJUYXJnZXRcblxudHlwZSB0ZXhUYXJnZXRcblxudHlwZSAnYSBwYXJhbWV0ZXJcblxudHlwZSAnYSBidWZmZXJQYXJhbWV0ZXJcblxudHlwZSAnYSB2ZXJ0ZXhBdHRyaWJQYXJhbVxuXG50eXBlIHZlcnRleEF0dHJpYlBvaW50ZXJQYXJhbVxuXG50eXBlICdhIGF0dGFjaFBhcmFtXG5cbnR5cGUgZnJhbWVidWZmZXJTdGF0dXNcblxudHlwZSAnYSByZW5kZXJidWZmZXJQYXJhbVxuXG50eXBlIGZvcm1hdFxuXG50eXBlIHBpeGVsRm9ybWF0XG5cbnR5cGUgcGl4ZWxUeXBlXG5cbnR5cGUgJ2EgdGV4UGFyYW1cblxudHlwZSBkYXRhVHlwZVxuXG50eXBlIHNoYWRlclR5cGVcblxudHlwZSAnYSBwcm9ncmFtUGFyYW1cblxudHlwZSAnYSBzaGFkZXJQYXJhbVxuXG50eXBlIHRleHR1cmVGaWx0ZXJcblxudHlwZSB3cmFwTW9kZVxuXG50eXBlIHRleEZpbHRlclxuXG50eXBlIHVuaWZvcm1UeXBlXG5cbnR5cGUgY29sb3JzcGFjZUNvbnZlcnNpb25cblxudHlwZSBzaGFkZXJQcmVjaXNpb25UeXBlXG5cbnR5cGUgb2JqZWN0VHlwZVxuXG4oKiogNS4yIFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMgKilcbmNsYXNzIHR5cGUgY29udGV4dEF0dHJpYnV0ZXMgPVxuICBvYmplY3RcbiAgICBtZXRob2QgYWxwaGEgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIGRlcHRoIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBzdGVuY2lsIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBhbnRpYWxpYXMgOiBib29sIHQgcHJvcFxuXG4gICAgbWV0aG9kIHByZW11bHRpcGxpZWRBbHBoYSA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2QgcHJlc2VydmVEcmF3aW5nQnVmZmVyIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBwcmVmZXJMb3dQb3dlclRvSGlnaFBlcmZvcm1hbmNlIDogYm9vbCB0IHByb3BcblxuICAgIG1ldGhvZCBmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0IDogYm9vbCB0IHByb3BcbiAgZW5kXG5cbmxldCBkZWZhdWx0Q29udGV4dEF0dHJpYnV0ZXMgPVxuICBKcy5VbnNhZmUuKFxuICAgIG9ialxuICAgICAgW3wgXCJhbHBoYVwiLCBpbmplY3QgX3RydWVcbiAgICAgICA7IFwiZGVwdGhcIiwgaW5qZWN0IF90cnVlXG4gICAgICAgOyBcInN0ZW5jaWxcIiwgaW5qZWN0IF9mYWxzZVxuICAgICAgIDsgXCJhbnRpYWxpYXNcIiwgaW5qZWN0IF90cnVlXG4gICAgICAgOyBcInByZW11bHRpcGxpZWRBbHBoYVwiLCBpbmplY3QgX2ZhbHNlXG4gICAgICAgOyBcInByZXNlcnZlRHJhd2luZ0J1ZmZlclwiLCBpbmplY3QgX2ZhbHNlXG4gICAgICAgOyBcInByZWZlckxvd1Bvd2VyVG9IaWdoUGVyZm9ybWFuY2VcIiwgaW5qZWN0IF9mYWxzZVxuICAgICAgIDsgXCJmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0XCIsIGluamVjdCBfZmFsc2VcbiAgICAgIHxdKVxuXG50eXBlIGJ1ZmZlclxuXG50eXBlIGZyYW1lYnVmZmVyXG5cbnR5cGUgcHJvZ3JhbVxuXG50eXBlIHJlbmRlcmJ1ZmZlclxuXG50eXBlIHNoYWRlclxuXG50eXBlIHRleHR1cmVcblxudHlwZSAnYSB1bmlmb3JtTG9jYXRpb25cblxuY2xhc3MgdHlwZSBhY3RpdmVJbmZvID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHNpemUgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF90eXBlIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG5hbWUgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHNoYWRlclByZWNpc2lvbkZvcm1hdCA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCByYW5nZU1pbiA6IGludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmFuZ2VNYXggOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZWNpc2lvbiA6IGludCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHJlbmRlcmluZ0NvbnRleHQgPVxuICBvYmplY3RcblxuICAgICgqKiA1LjEzLjEgQXR0cmlidXRlcyAqKVxuXG4gICAgbWV0aG9kIGNhbnZhcyA6IERvbV9odG1sLmNhbnZhc0VsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZHJhd2luZ0J1ZmZlcldpZHRoIDogc2l6ZWkgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGRyYXdpbmdCdWZmZXJIZWlnaHQgOiBzaXplaSByZWFkb25seV9wcm9wXG5cbiAgICAoKiogNS4xMy4yIEdldHRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRleHQgKilcblxuICAgIG1ldGhvZCBnZXRDb250ZXh0QXR0cmlidXRlcyA6IGNvbnRleHRBdHRyaWJ1dGVzIHQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMyBTZXR0aW5nIGFuZCBnZXR0aW5nIHN0YXRlICopXG5cbiAgICBtZXRob2QgYWN0aXZlVGV4dHVyZSA6IHRleHR1cmVVbml0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsZW5kQ29sb3IgOiBjbGFtcGYgLT4gY2xhbXBmIC0+IGNsYW1wZiAtPiBjbGFtcGYgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmxlbmRFcXVhdGlvbiA6IGJsZW5kTW9kZSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBibGVuZEVxdWF0aW9uU2VwYXJhdGUgOiBibGVuZE1vZGUgLT4gYmxlbmRNb2RlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsZW5kRnVuYyA6IGJsZW5kaW5nRmFjdG9yIC0+IGJsZW5kaW5nRmFjdG9yIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJsZW5kRnVuY1NlcGFyYXRlIDpcbiAgICAgIGJsZW5kaW5nRmFjdG9yIC0+IGJsZW5kaW5nRmFjdG9yIC0+IGJsZW5kaW5nRmFjdG9yIC0+IGJsZW5kaW5nRmFjdG9yIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNsZWFyQ29sb3IgOiBjbGFtcGYgLT4gY2xhbXBmIC0+IGNsYW1wZiAtPiBjbGFtcGYgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2xlYXJEZXB0aCA6IGNsYW1wZiAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjbGVhclN0ZW5jaWwgOiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29sb3JNYXNrIDogYm9vbCB0IC0+IGJvb2wgdCAtPiBib29sIHQgLT4gYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGN1bGxGYWNlIDogY3VsbEZhY2VNb2RlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlcHRoRnVuYyA6IGRlcHRoRnVuY3Rpb24gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVwdGhNYXNrIDogYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlcHRoUmFuZ2UgOiBjbGFtcGYgLT4gY2xhbXBmIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRpc2FibGUgOiBlbmFibGVDYXAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZW5hYmxlIDogZW5hYmxlQ2FwIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGZyb250RmFjZSA6IGZyb250RmFjZURpciAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQYXJhbWV0ZXIgOiAnYS4gJ2EgcGFyYW1ldGVyIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBnZXRFcnJvciA6IGVycm9yQ29kZSBtZXRoXG5cbiAgICBtZXRob2QgaGludCA6IGhpbnRUYXJnZXQgLT4gaGludE1vZGUgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaXNFbmFibGVkIDogZW5hYmxlQ2FwIC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgbGluZVdpZHRoIDogZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgcGl4ZWxTdG9yZWkgOiAnYS4gJ2EgcGl4ZWxTdG9yZVBhcmFtIC0+ICdhIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHBvbHlnb25PZmZzZXQgOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzYW1wbGVDb3ZlcmFnZSA6IGNsYW1wZiAtPiBib29sIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbEZ1bmMgOiBkZXB0aEZ1bmN0aW9uIC0+IGludCAtPiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxGdW5jU2VwYXJhdGUgOiBjdWxsRmFjZU1vZGUgLT4gZGVwdGhGdW5jdGlvbiAtPiBpbnQgLT4gdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzdGVuY2lsTWFzayA6IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc3RlbmNpbE1hc2tTZXBhcmF0ZSA6IGN1bGxGYWNlTW9kZSAtPiB1aW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxPcCA6IHN0ZW5jaWxPcCAtPiBzdGVuY2lsT3AgLT4gc3RlbmNpbE9wIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHN0ZW5jaWxPcFNlcGFyYXRlIDpcbiAgICAgIGN1bGxGYWNlTW9kZSAtPiBzdGVuY2lsT3AgLT4gc3RlbmNpbE9wIC0+IHN0ZW5jaWxPcCAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjQgVmlld2luZyBhbmQgY2xpcHBpbmcgKilcblxuICAgIG1ldGhvZCBzY2lzc29yIDogaW50IC0+IGludCAtPiBzaXplaSAtPiBzaXplaSAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2aWV3cG9ydCA6IGludCAtPiBpbnQgLT4gc2l6ZWkgLT4gc2l6ZWkgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy41IEJ1ZmZlciBvYmplY3RzICopXG5cbiAgICBtZXRob2QgYmluZEJ1ZmZlciA6IGJ1ZmZlclRhcmdldCAtPiBidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiaW5kQnVmZmVyXyA6IGJ1ZmZlclRhcmdldCAtPiBidWZmZXIgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYnVmZmVyRGF0YV9jcmVhdGUgOiBidWZmZXJUYXJnZXQgLT4gc2l6ZWlwdHIgLT4gYnVmZmVyVXNhZ2UgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYnVmZmVyRGF0YSA6XG4gICAgICBidWZmZXJUYXJnZXQgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0IC0+IGJ1ZmZlclVzYWdlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJ1ZmZlckRhdGFfcmF3IDpcbiAgICAgIGJ1ZmZlclRhcmdldCAtPiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciB0IC0+IGJ1ZmZlclVzYWdlIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJ1ZmZlclN1YkRhdGEgOlxuICAgICAgYnVmZmVyVGFyZ2V0IC0+IGludHB0ciAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYnVmZmVyU3ViRGF0YV9yYXcgOlxuICAgICAgYnVmZmVyVGFyZ2V0IC0+IGludHB0ciAtPiBUeXBlZF9hcnJheS5hcnJheUJ1ZmZlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZUJ1ZmZlciA6IGJ1ZmZlciB0IG1ldGhcblxuICAgIG1ldGhvZCBkZWxldGVCdWZmZXIgOiBidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRCdWZmZXJQYXJhbWV0ZXIgOiAnYS4gYnVmZmVyVGFyZ2V0IC0+ICdhIGJ1ZmZlclBhcmFtZXRlciAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgaXNCdWZmZXIgOiBidWZmZXIgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgKCoqIDUuMTMuNiBGcmFtZWJ1ZmZlciBvYmplY3RzICopXG5cbiAgICBtZXRob2QgYmluZEZyYW1lYnVmZmVyIDogZmJUYXJnZXQgLT4gZnJhbWVidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiaW5kRnJhbWVidWZmZXJfIDogZmJUYXJnZXQgLT4gZnJhbWVidWZmZXIgdCBvcHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyA6IGZiVGFyZ2V0IC0+IGZyYW1lYnVmZmVyU3RhdHVzIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVGcmFtZWJ1ZmZlciA6IGZyYW1lYnVmZmVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZUZyYW1lYnVmZmVyIDogZnJhbWVidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciA6XG4gICAgICBmYlRhcmdldCAtPiBhdHRhY2htZW50UG9pbnQgLT4gcmJUYXJnZXQgLT4gcmVuZGVyYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZnJhbWVidWZmZXJUZXh0dXJlMkQgOlxuICAgICAgZmJUYXJnZXQgLT4gYXR0YWNobWVudFBvaW50IC0+IHRleFRhcmdldCAtPiB0ZXh0dXJlIHQgLT4gaW50IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlciA6XG4gICAgICAnYS4gZmJUYXJnZXQgLT4gYXR0YWNobWVudFBvaW50IC0+ICdhIGF0dGFjaFBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBpc0ZyYW1lYnVmZmVyIDogZnJhbWVidWZmZXIgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgKCoqIDUuMTMuNyBSZW5kZXJidWZmZXIgb2JqZWN0cyAqKVxuXG4gICAgbWV0aG9kIGJpbmRSZW5kZXJidWZmZXIgOiByYlRhcmdldCAtPiByZW5kZXJidWZmZXIgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBiaW5kUmVuZGVyYnVmZmVyXyA6IHJiVGFyZ2V0IC0+IHJlbmRlcmJ1ZmZlciB0IG9wdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVSZW5kZXJidWZmZXIgOiByZW5kZXJidWZmZXIgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlUmVuZGVyYnVmZmVyIDogcmVuZGVyYnVmZmVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyIDogJ2EuIHJiVGFyZ2V0IC0+ICdhIHJlbmRlcmJ1ZmZlclBhcmFtIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBpc1JlbmRlcmJ1ZmZlciA6IHJlbmRlcmJ1ZmZlciB0IC0+IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgcmVuZGVyYnVmZmVyU3RvcmFnZSA6IHJiVGFyZ2V0IC0+IGZvcm1hdCAtPiBzaXplaSAtPiBzaXplaSAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjggVGV4dHVyZSBvYmplY3RzICopXG5cbiAgICBtZXRob2QgYmluZFRleHR1cmUgOiB0ZXhUYXJnZXQgLT4gdGV4dHVyZSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGJpbmRUZXh0dXJlXyA6IHRleFRhcmdldCAtPiB0ZXh0dXJlIHQgb3B0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbXByZXNzZWRUZXhJbWFnZTJEIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBpbnRcbiAgICAgIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29tcHJlc3NlZFRleFN1YkltYWdlMkQgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiAjVHlwZWRfYXJyYXkuYXJyYXlCdWZmZXJWaWV3IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNvcHlUZXhJbWFnZTJEIDpcbiAgICAgIHRleFRhcmdldCAtPiBpbnQgLT4gcGl4ZWxGb3JtYXQgLT4gaW50IC0+IGludCAtPiBzaXplaSAtPiBzaXplaSAtPiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29weVRleFN1YkltYWdlMkQgOlxuICAgICAgdGV4VGFyZ2V0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiBpbnQgLT4gc2l6ZWkgLT4gc2l6ZWkgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlVGV4dHVyZSA6IHRleHR1cmUgdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlVGV4dHVyZSA6IHRleHR1cmUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZW5lcmF0ZU1pcG1hcCA6IHRleFRhcmdldCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRUZXhQYXJhbWV0ZXIgOiB0ZXhUYXJnZXQgLT4gJ2EgdGV4UGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGlzVGV4dHVyZSA6IHRleHR1cmUgdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfbmV3IDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IHZvaWQgb3B0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhJbWFnZTJEX2Zyb21WaWV3IDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9mcm9tSW1hZ2VEYXRhIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuaW1hZ2VEYXRhIHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfZnJvbUltYWdlIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuaW1hZ2VFbGVtZW50IHRcbiAgICAgIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRleEltYWdlMkRfZnJvbUNhbnZhcyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLmNhbnZhc0VsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4SW1hZ2UyRF9mcm9tVmlkZW8gOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC52aWRlb0VsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiB7W1xuICAgICAgICBtZXRob2QgdGV4UGFyYW1ldGVyZiA6IHRleFRhcmdldCAtPiB0ZXhQYXJhbSAtPiBmbG9hdCAtPiB1bml0IG1ldGhcbiAgICAgICBdfVxuICAgICopXG4gICAgbWV0aG9kIHRleFBhcmFtZXRlcmkgOiB0ZXhUYXJnZXQgLT4gJ2EgdGV4UGFyYW0gLT4gJ2EgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4U3ViSW1hZ2UyRF9mcm9tVmlldyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHNpemVpXG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gI1R5cGVkX2FycmF5LmFycmF5QnVmZmVyVmlldyB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhTdWJJbWFnZTJEX2Zyb21JbWFnZURhdGEgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5pbWFnZURhdGEgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4U3ViSW1hZ2UyRF9mcm9tSW1hZ2UgOlxuICAgICAgICAgdGV4VGFyZ2V0XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBwaXhlbEZvcm1hdFxuICAgICAgLT4gcGl4ZWxUeXBlXG4gICAgICAtPiBEb21faHRtbC5pbWFnZUVsZW1lbnQgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGV4U3ViSW1hZ2UyRF9mcm9tQ2FudmFzIDpcbiAgICAgICAgIHRleFRhcmdldFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gcGl4ZWxGb3JtYXRcbiAgICAgIC0+IHBpeGVsVHlwZVxuICAgICAgLT4gRG9tX2h0bWwuY2FudmFzRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0ZXhTdWJJbWFnZTJEX2Zyb21WaWRlbyA6XG4gICAgICAgICB0ZXhUYXJnZXRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+IERvbV9odG1sLnZpZGVvRWxlbWVudCB0XG4gICAgICAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjkgUHJvZ3JhbXMgYW5kIFNoYWRlcnMgKilcblxuICAgIG1ldGhvZCBhdHRhY2hTaGFkZXIgOiBwcm9ncmFtIHQgLT4gc2hhZGVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYmluZEF0dHJpYkxvY2F0aW9uIDogcHJvZ3JhbSB0IC0+IHVpbnQgLT4ganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgY29tcGlsZVNoYWRlciA6IHNoYWRlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVByb2dyYW0gOiBwcm9ncmFtIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNoYWRlciA6IHNoYWRlclR5cGUgLT4gc2hhZGVyIHQgbWV0aFxuXG4gICAgbWV0aG9kIGRlbGV0ZVByb2dyYW0gOiBwcm9ncmFtIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVsZXRlU2hhZGVyIDogc2hhZGVyIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGV0YWNoU2hhZGVyIDogcHJvZ3JhbSB0IC0+IHNoYWRlciB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEF0dGFjaGVkU2hhZGVycyA6IHByb2dyYW0gdCAtPiBzaGFkZXIgdCBqc19hcnJheSB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQcm9ncmFtUGFyYW1ldGVyIDogJ2EuIHByb2dyYW0gdCAtPiAnYSBwcm9ncmFtUGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGdldFByb2dyYW1JbmZvTG9nIDogcHJvZ3JhbSB0IC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRTaGFkZXJQYXJhbWV0ZXIgOiAnYS4gc2hhZGVyIHQgLT4gJ2Egc2hhZGVyUGFyYW0gLT4gJ2EgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA6XG4gICAgICBzaGFkZXJUeXBlIC0+IHNoYWRlclByZWNpc2lvblR5cGUgLT4gc2hhZGVyUHJlY2lzaW9uRm9ybWF0IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNoYWRlckluZm9Mb2cgOiBzaGFkZXIgdCAtPiBqc19zdHJpbmcgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2hhZGVyU291cmNlIDogc2hhZGVyIHQgLT4ganNfc3RyaW5nIHQgbWV0aFxuXG4gICAgbWV0aG9kIGlzUHJvZ3JhbSA6IHByb2dyYW0gdCAtPiBib29sIHQgbWV0aFxuXG4gICAgbWV0aG9kIGlzU2hhZGVyIDogc2hhZGVyIHQgLT4gYm9vbCB0IG1ldGhcblxuICAgIG1ldGhvZCBsaW5rUHJvZ3JhbSA6IHByb2dyYW0gdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzaGFkZXJTb3VyY2UgOiBzaGFkZXIgdCAtPiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1c2VQcm9ncmFtIDogcHJvZ3JhbSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZhbGlkYXRlUHJvZ3JhbSA6IHByb2dyYW0gdCAtPiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjEwIFVuaWZvcm1zIGFuZCBhdHRyaWJ1dGVzICopXG5cbiAgICBtZXRob2QgZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IDogdWludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSA6IHVpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0QWN0aXZlQXR0cmliIDogcHJvZ3JhbSB0IC0+IHVpbnQgLT4gYWN0aXZlSW5mbyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBY3RpdmVVbmlmb3JtIDogcHJvZ3JhbSB0IC0+IHVpbnQgLT4gYWN0aXZlSW5mbyB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRBdHRyaWJMb2NhdGlvbiA6IHByb2dyYW0gdCAtPiBqc19zdHJpbmcgdCAtPiBpbnQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFVuaWZvcm0gOiAnYSAnYi4gcHJvZ3JhbSB0IC0+ICdhIHVuaWZvcm1Mb2NhdGlvbiB0IC0+ICdiIG1ldGhcblxuICAgIG1ldGhvZCBnZXRVbmlmb3JtTG9jYXRpb24gOiAnYS4gcHJvZ3JhbSB0IC0+IGpzX3N0cmluZyB0IC0+ICdhIHVuaWZvcm1Mb2NhdGlvbiB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRWZXJ0ZXhBdHRyaWIgOiAnYS4gdWludCAtPiAnYSB2ZXJ0ZXhBdHRyaWJQYXJhbSAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgZ2V0VmVydGV4QXR0cmliT2Zmc2V0IDogdWludCAtPiB2ZXJ0ZXhBdHRyaWJQb2ludGVyUGFyYW0gLT4gc2l6ZWlwdHIgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xZiA6IGZsb2F0IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0xZnZfdHlwZWQgOlxuICAgICAgZmxvYXQgdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFmdiA6IGZsb2F0IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFpIDogaW50IHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMWl2X3R5cGVkIDpcbiAgICAgIGludCB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTFpdiA6IGludCB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMmYgOiBbIGB2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJmdl90eXBlZCA6XG4gICAgICBbIGB2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTJmdiA6IFsgYHZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0yaSA6IFsgYGl2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMml2IDogWyBgaXZlYzIgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtMml2X3R5cGVkIDpcbiAgICAgIFsgYGl2ZWMyIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm0zZiA6IFsgYHZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2Z2X3R5cGVkIDpcbiAgICAgIFsgYHZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2Z2IDogWyBgdmVjMyBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTNpIDogWyBgaXZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2l2IDogWyBgaXZlYzMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtM2l2X3R5cGVkIDpcbiAgICAgIFsgYGl2ZWMzIF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00ZiA6XG4gICAgICBbIGB2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRmdl90eXBlZCA6XG4gICAgICBbIGB2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybTRmdiA6IFsgYHZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm00aSA6XG4gICAgICBbIGBpdmVjNCBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGludCAtPiBpbnQgLT4gaW50IC0+IGludCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGl2IDogWyBgaXZlYzQgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBpbnQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtNGl2X3R5cGVkIDpcbiAgICAgIFsgYGl2ZWM0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gVHlwZWRfYXJyYXkuaW50MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXgyZnYgOlxuICAgICAgWyBgbWF0MiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVuaWZvcm1NYXRyaXgyZnZfdHlwZWQgOlxuICAgICAgWyBgbWF0MiBdIHVuaWZvcm1Mb2NhdGlvbiB0IC0+IGJvb2wgdCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4M2Z2IDpcbiAgICAgIFsgYG1hdDMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bmlmb3JtTWF0cml4M2Z2X3R5cGVkIDpcbiAgICAgIFsgYG1hdDMgXSB1bmlmb3JtTG9jYXRpb24gdCAtPiBib29sIHQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDRmdiA6XG4gICAgICBbIGBtYXQ0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdW5pZm9ybU1hdHJpeDRmdl90eXBlZCA6XG4gICAgICBbIGBtYXQ0IF0gdW5pZm9ybUxvY2F0aW9uIHQgLT4gYm9vbCB0IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjFmIDogdWludCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIxZnYgOiB1aW50IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMWZ2X3R5cGVkIDogdWludCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIyZiA6IHVpbnQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliMmZ2IDogdWludCAtPiBmbG9hdCBqc19hcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjJmdl90eXBlZCA6IHVpbnQgLT4gVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliM2YgOiB1aW50IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjNmdiA6IHVpbnQgLT4gZmxvYXQganNfYXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWIzZnZfdHlwZWQgOiB1aW50IC0+IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHZlcnRleEF0dHJpYjRmIDogdWludCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWI0ZnYgOiB1aW50IC0+IGZsb2F0IGpzX2FycmF5IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdmVydGV4QXR0cmliNGZ2X3R5cGVkIDogdWludCAtPiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB2ZXJ0ZXhBdHRyaWJQb2ludGVyIDpcbiAgICAgIHVpbnQgLT4gaW50IC0+IGRhdGFUeXBlIC0+IGJvb2wgdCAtPiBzaXplaSAtPiBpbnRwdHIgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy4xMSBXcml0aW5nIHRvIHRoZSBkcmF3aW5nIGJ1ZmZlciAqKVxuXG4gICAgbWV0aG9kIGNsZWFyIDogY2xlYXJCdWZmZXJNYXNrIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdBcnJheXMgOiBiZWdpbk1vZGUgLT4gaW50IC0+IHNpemVpIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRyYXdFbGVtZW50cyA6IGJlZ2luTW9kZSAtPiBzaXplaSAtPiBkYXRhVHlwZSAtPiBpbnRwdHIgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmluaXNoIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZmx1c2ggOiB1bml0IG1ldGhcblxuICAgICgqKiA1LjEzLjEyIFJlYWRpbmcgYmFjayBwaXhlbHMgKilcblxuICAgIG1ldGhvZCByZWFkUGl4ZWxzIDpcbiAgICAgICAgIGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBzaXplaVxuICAgICAgLT4gc2l6ZWlcbiAgICAgIC0+IHBpeGVsRm9ybWF0XG4gICAgICAtPiBwaXhlbFR5cGVcbiAgICAgIC0+ICNUeXBlZF9hcnJheS5hcnJheUJ1ZmZlclZpZXcgdFxuICAgICAgLT4gdW5pdCBtZXRoXG5cbiAgICAoKiogNS4xMy4xMyBEZXRlY3RpbmcgY29udGV4dCBsb3N0IGV2ZW50cyAqKVxuXG4gICAgbWV0aG9kIGlzQ29udGV4dExvc3QgOiBib29sIHQgbWV0aFxuXG4gICAgKCoqIDUuMTMuMTQgRGV0ZWN0aW5nIGFuZCBlbmFibGluZyBleHRlbnNpb25zICopXG5cbiAgICBtZXRob2QgZ2V0U3VwcG9ydGVkRXh0ZW5zaW9ucyA6IGpzX3N0cmluZyB0IGpzX2FycmF5IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldEV4dGVuc2lvbiA6ICdhLiBqc19zdHJpbmcgdCAtPiAnYSB0IG9wdCBtZXRoXG5cbiAgICAoKiBVbnR5cGVkISAqKVxuICAgICgqKiBDb25zdGFudHMgKilcblxuICAgIG1ldGhvZCBfREVQVEhfQlVGRkVSX0JJVF8gOiBjbGVhckJ1ZmZlck1hc2sgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JVRkZFUl9CSVRfIDogY2xlYXJCdWZmZXJNYXNrIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09MT1JfQlVGRkVSX0JJVF8gOiBjbGVhckJ1ZmZlck1hc2sgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT0lOVFMgOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FUyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVfTE9PUF8gOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FX1NUUklQXyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RSSUFOR0xFUyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RSSUFOR0xFX1NUUklQXyA6IGJlZ2luTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RSSUFOR0xFX0ZBTl8gOiBiZWdpbk1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9aRVJPIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkUgOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NSQ19DT0xPUl8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19TUkNfQ09MT1JfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TUkNfQUxQSEFfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfU1JDX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRFNUX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX0RTVF9BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RTVF9DT0xPUl8gOiBibGVuZGluZ0ZhY3RvciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX09ORV9NSU5VU19EU1RfQ09MT1JfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TUkNfQUxQSEFfU0FUVVJBVEVfIDogYmxlbmRpbmdGYWN0b3IgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GVU5DX0FERF8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GVU5DX1NVQlRSQUNUXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DT05TVEFOVF9DT0xPUl8gOiBibGVuZE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1JfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09OU1RBTlRfQUxQSEFfIDogYmxlbmRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBXyA6IGJsZW5kTW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FSUkFZX0JVRkZFUl8gOiBidWZmZXJUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9FTEVNRU5UX0FSUkFZX0JVRkZFUl8gOiBidWZmZXJUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVFJFQU1fRFJBV18gOiBidWZmZXJVc2FnZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NUQVRJQ19EUkFXXyA6IGJ1ZmZlclVzYWdlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRFlOQU1JQ19EUkFXXyA6IGJ1ZmZlclVzYWdlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJPTlQgOiBjdWxsRmFjZU1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CQUNLIDogY3VsbEZhY2VNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJPTlRfQU5EX0JBQ0tfIDogY3VsbEZhY2VNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1VMTF9GQUNFXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRElUSEVSIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9URVNUXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1RFU1RfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0NJU1NPUl9URVNUXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPTFlHT05fT0ZGU0VUX0ZJTExfIDogZW5hYmxlQ2FwIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFXyA6IGVuYWJsZUNhcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRV9DT1ZFUkFHRV8gOiBlbmFibGVDYXAgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OT19FUlJPUl8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlZBTElEX0VOVU1fIDogZXJyb3JDb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5WQUxJRF9WQUxVRV8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlZBTElEX09QRVJBVElPTl8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9PVVRfT0ZfTUVNT1JZXyA6IGVycm9yQ29kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NPTlRFWFRfTE9TVF9XRUJHTF8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl8gOiBlcnJvckNvZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVyA6IGZyb250RmFjZURpciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0NDVyA6IGZyb250RmFjZURpciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RPTlRfQ0FSRV8gOiBoaW50TW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZBU1RFU1QgOiBoaW50TW9kZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05JQ0VTVCA6IGhpbnRNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfR0VORVJBVEVfTUlQTUFQX0hJTlRfIDogaGludFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0VRVUFUSU9OXyA6IGJsZW5kTW9kZSBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9FUVVBVElPTl9SR0JfIDogYmxlbmRNb2RlIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX0VRVUFUSU9OX0FMUEhBXyA6IGJsZW5kTW9kZSBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9EU1RfUkdCXyA6IGJsZW5kaW5nRmFjdG9yIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX1NSQ19SR0JfIDogYmxlbmRpbmdGYWN0b3IgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxFTkRfRFNUX0FMUEhBXyA6IGJsZW5kaW5nRmFjdG9yIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX1NSQ19BTFBIQV8gOiBibGVuZGluZ0ZhY3RvciBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CTEVORF9DT0xPUl8gOiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BUlJBWV9CVUZGRVJfQklORElOR18gOiBidWZmZXIgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElOR18gOiBidWZmZXIgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1VMTF9GQUNFX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JMRU5EX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RJVEhFUl9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1RFU1RfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfVEVTVF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQ0lTU09SX1RFU1RfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUE9MWUdPTl9PRkZTRVRfRklMTF9QQVJBTSA6IGJvb2wgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FX1dJRFRIXyA6IGZsb2F0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRV8gOiBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0VfIDogVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1VMTF9GQUNFX01PREVfIDogY3VsbEZhY2VNb2RlIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZST05UX0ZBQ0VfIDogZnJvbnRGYWNlRGlyIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1JBTkdFXyA6IFR5cGVkX2FycmF5LmZsb2F0MzJBcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX1dSSVRFTUFTS18gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfQ0xFQVJfVkFMVUVfIDogZmxvYXQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfRlVOQ18gOiBkZXB0aEZ1bmN0aW9uIHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQ0xFQVJfVkFMVUVfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfRlVOQ18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9GQUlMXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTF8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1NfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfUkVGXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX1ZBTFVFX01BU0tfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfV1JJVEVNQVNLXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfRlVOQ18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU1RFTkNJTF9CQUNLX0ZBSUxfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUxfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1NfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19SRUZfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WSUVXUE9SVCA6IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQ0lTU09SX0JPWF8gOiBUeXBlZF9hcnJheS5pbnQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09MT1JfQ0xFQVJfVkFMVUVfIDogVHlwZWRfYXJyYXkuZmxvYXQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09MT1JfV1JJVEVNQVNLXyA6IGJvb2wgdCBqc19hcnJheSB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19BTElHTk1FTlRfUEFSQU0gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUEFDS19BTElHTk1FTlRfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9URVhUVVJFX1NJWkVfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9WSUVXUE9SVF9ESU1TXyA6IFR5cGVkX2FycmF5LmludDMyQXJyYXkgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVUJQSVhFTF9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRURfQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfR1JFRU5fQklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQkxVRV9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BTFBIQV9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9CSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0JJVFNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPTFlHT05fT0ZGU0VUX1VOSVRTXyA6IGZsb2F0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUl8gOiBmbG9hdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0JJTkRJTkdfMkRfIDogdGV4dHVyZSB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfIDogdGV4dHVyZSB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TQU1QTEVfQlVGRkVSU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFX0NPVkVSQUdFX1ZBTFVFXyA6IGZsb2F0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlRfIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFNfIDpcbiAgICAgIFR5cGVkX2FycmF5LnVpbnQzMkFycmF5IHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfR0VORVJBVEVfTUlQTUFQX0hJTlRfUEFSQU1fIDogaGludE1vZGUgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQlVGRkVSX1NJWkVfIDogaW50IGJ1ZmZlclBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0JVRkZFUl9VU0FHRV8gOiBidWZmZXJVc2FnZSBidWZmZXJQYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CWVRFIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9CWVRFX0RUIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TSE9SVCA6IGRhdGFUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfU0hPUlRfIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlQgOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX0lOVF8gOiBkYXRhVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUIDogZGF0YVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9CWVRFXyA6IHBpeGVsVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfIDogcGl4ZWxUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5TSUdORURfU0hPUlRfNV81XzVfMV8gOiBwaXhlbFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlNJR05FRF9TSE9SVF81XzZfNV8gOiBwaXhlbFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BTFBIQSA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkdCIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SR0JBIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MVU1JTkFOQ0UgOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xVTUlOQU5DRV9BTFBIQV8gOiBwaXhlbEZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfSU5ERVhfIDogcGl4ZWxGb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERVBUSF9TVEVOQ0lMXyA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfQ09NUE9ORU5UXyA6IHBpeGVsRm9ybWF0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBR01FTlRfU0hBREVSXyA6IHNoYWRlclR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfU0hBREVSXyA6IHNoYWRlclR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVkVSVEVYX0FUVFJJQlNfIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVkFSWUlOR19WRUNUT1JTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SU18gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0hBREVSX1RZUEVfIDogc2hhZGVyVHlwZSBzaGFkZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFTEVURV9TVEFUVVNfIDogYm9vbCB0IHNoYWRlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09NUElMRV9TVEFUVVNfIDogYm9vbCB0IHNoYWRlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVMRVRFX1NUQVRVU19QUk9HIDogYm9vbCB0IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTktfU1RBVFVTXyA6IGJvb2wgdCBwcm9ncmFtUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WQUxJREFURV9TVEFUVVNfIDogYm9vbCB0IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FUVEFDSEVEX1NIQURFUlNfIDogaW50IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FDVElWRV9VTklGT1JNU18gOiBpbnQgcHJvZ3JhbVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQUNUSVZFX0FUVFJJQlVURVNfIDogaW50IHByb2dyYW1QYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTl8gOiBqc19zdHJpbmcgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DVVJSRU5UX1BST0dSQU1fIDogcHJvZ3JhbSB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRU5ET1IgOiBqc19zdHJpbmcgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJFUiA6IGpzX3N0cmluZyB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlNJT04gOiBqc19zdHJpbmcgdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFXyA6IGludCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9BQ1RJVkVfVEVYVFVSRV8gOiBpbnQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQklORElOR18gOiBmcmFtZWJ1ZmZlciB0IG9wdCBwYXJhbWV0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfQklORElOR18gOiByZW5kZXJidWZmZXIgdCBvcHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUFYX1JFTkRFUkJVRkZFUl9TSVpFIDogaW50IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05FVkVSIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xFU1MgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRVFVQUwgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTEVRVUFMIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0dSRUFURVIgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTk9URVFVQUwgOiBkZXB0aEZ1bmN0aW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfR0VRVUFMIDogZGVwdGhGdW5jdGlvbiByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0FMV0FZUyA6IGRlcHRoRnVuY3Rpb24gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9LRUVQIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVQTEFDRSA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOQ1IgOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ERUNSIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5WRVJUIDogc3RlbmNpbE9wIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5DUl9XUkFQXyA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFQ1JfV1JBUF8gOiBzdGVuY2lsT3AgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9aRVJPXyA6IHN0ZW5jaWxPcCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX05FQVJFU1QgOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MSU5FQVIgOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUXyA6IHRleEZpbHRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xJTkVBUl9NSVBNQVBfTkVBUkVTVF8gOiB0ZXhGaWx0ZXIgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ORUFSRVNUX01JUE1BUF9MSU5FQVJfIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTElORUFSX01JUE1BUF9MSU5FQVJfIDogdGV4RmlsdGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9NQUdfRklMVEVSXyA6IHRleEZpbHRlciB0ZXhQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfTUlOX0ZJTFRFUl8gOiB0ZXhGaWx0ZXIgdGV4UGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX1dSQVBfU18gOiB3cmFwTW9kZSB0ZXhQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfV1JBUF9UXyA6IHdyYXBNb2RlIHRleFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTk9ORV9PVCA6IG9iamVjdFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX09UIDogb2JqZWN0VHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9PVCA6IG9iamVjdFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFXzJEXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZXyA6IHRleFRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl8gOiB0ZXhUYXJnZXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfIDogdGV4VGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTAgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTMgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU0IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFNSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTYgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkU3IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFOCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTkgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxMCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTExIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTIgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxMyA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE0IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTUgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxNiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTE3IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMTggOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUxOSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTIwIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjEgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyMiA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTIzIDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjQgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyNSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI2IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMjcgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUyOCA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVEVYVFVSRTI5IDogdGV4dHVyZVVuaXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9URVhUVVJFMzAgOiB0ZXh0dXJlVW5pdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RFWFRVUkUzMSA6IHRleHR1cmVVbml0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVQRUFUIDogd3JhcE1vZGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9DTEFNUF9UT19FREdFXyA6IHdyYXBNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUlSUk9SRURfUkVQRUFUXyA6IHdyYXBNb2RlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9WRUMyXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfVkVDM18gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX1ZFQzRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9JTlRfVkVDMl8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0lOVF9WRUMzXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfSU5UX1ZFQzRfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9CT09MXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQk9PTF9WRUMyXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQk9PTF9WRUMzXyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQk9PTF9WRUM0XyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRkxPQVRfTUFUMl8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZMT0FUX01BVDNfIDogdW5pZm9ybVR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GTE9BVF9NQVQ0XyA6IHVuaWZvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfU0FNUExFUl8yRF8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NBTVBMRVJfQ1VCRV8gOiB1bmlmb3JtVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRF8gOiBib29sIHQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkVfIDogaW50IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREVfIDogaW50IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFXyA6IGludCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRF8gOiBib29sIHQgdmVydGV4QXR0cmliUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVJfIDogdmVydGV4QXR0cmliUG9pbnRlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElOR18gOlxuICAgICAgYnVmZmVyIHQgb3B0IHZlcnRleEF0dHJpYlBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ1VSUkVOVF9WRVJURVhfQVRUUklCXyA6XG4gICAgICBUeXBlZF9hcnJheS5mbG9hdDMyQXJyYXkgdCB2ZXJ0ZXhBdHRyaWJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0xPV19GTE9BVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTUVESVVNX0ZMT0FUXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ISUdIX0ZMT0FUXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9MT1dfSU5UXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9NRURJVU1fSU5UXyA6IHNoYWRlclByZWNpc2lvblR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9ISUdIX0lOVF8gOiBzaGFkZXJQcmVjaXNpb25UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVIgOiBmYlRhcmdldCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUiA6IHJiVGFyZ2V0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkdCQTQgOiBmb3JtYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SR0I1X0ExXyA6IGZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JHQjU2NSA6IGZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0RFUFRIX0NPTVBPTkVOVDE2XyA6IGZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1NURU5DSUxfSU5ERVg4XyA6IGZvcm1hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9XSURUSF8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9SRU5ERVJCVUZGRVJfSEVJR0hUXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfIDogZm9ybWF0IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX1JFRF9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFXyA6IGludCByZW5kZXJidWZmZXJQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfIDogaW50IHJlbmRlcmJ1ZmZlclBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV8gOiBpbnQgcmVuZGVyYnVmZmVyUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFXyA6IG9iamVjdFR5cGUgYXR0YWNoUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX1JFTkRFUkJVRkZFUiA6XG4gICAgICByZW5kZXJidWZmZXIgdCBhdHRhY2hQYXJhbSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUVfVEVYVFVSRSA6XG4gICAgICB0ZXh0dXJlIHQgYXR0YWNoUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfIDogaW50IGF0dGFjaFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfIDogaW50IGF0dGFjaFBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQ09MT1JfQVRUQUNITUVOVDBfIDogYXR0YWNobWVudFBvaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfQVRUQUNITUVOVF8gOiBhdHRhY2htZW50UG9pbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9TVEVOQ0lMX0FUVEFDSE1FTlRfIDogYXR0YWNobWVudFBvaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UXyA6IGF0dGFjaG1lbnRQb2ludCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX0ZSQU1FQlVGRkVSX0NPTVBMRVRFXyA6IGZyYW1lYnVmZmVyU3RhdHVzIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UXyA6IGZyYW1lYnVmZmVyU3RhdHVzIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfIDogZnJhbWVidWZmZXJTdGF0dXMgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfIDogZnJhbWVidWZmZXJTdGF0dXMgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF8gOiBmcmFtZWJ1ZmZlclN0YXR1cyByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19GTElQX1lfV0VCR0xfUEFSQU0gOiBib29sIHQgcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMX1BBUkFNIDogYm9vbCB0IHBhcmFtZXRlciByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1VOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0xfUEFSQU0gOlxuICAgICAgY29sb3JzcGFjZUNvbnZlcnNpb24gcGFyYW1ldGVyIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfTk9ORSA6IGNvbG9yc3BhY2VDb252ZXJzaW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfQlJPV1NFUl9ERUZBVUxUX1dFQkdMXyA6IGNvbG9yc3BhY2VDb252ZXJzaW9uIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0FMSUdOTUVOVF8gOiBpbnQgcGl4ZWxTdG9yZVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX0ZMSVBfWV9XRUJHTF8gOiBib29sIHQgcGl4ZWxTdG9yZVBhcmFtIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMXyA6IGJvb2wgdCBwaXhlbFN0b3JlUGFyYW0gcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMXyA6IGludCBwaXhlbFN0b3JlUGFyYW0gcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCoqIDUuMTQgV2ViR0xDb250ZXh0RXZlbnQgKilcblxuY2xhc3MgdHlwZSBjb250ZXh0RXZlbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50XG5cbiAgICBtZXRob2Qgc3RhdHVzTWVzc2FnZSA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbm1vZHVsZSBFdmVudCA9IHN0cnVjdFxuICBsZXQgd2ViZ2xjb250ZXh0bG9zdCA9IERvbV9odG1sLkV2ZW50Lm1ha2UgXCJ3ZWJnbGNvbnRleHRsb3N0XCJcblxuICBsZXQgd2ViZ2xjb250ZXh0cmVzdG9yZWQgPSBEb21faHRtbC5FdmVudC5tYWtlIFwid2ViZ2xjb250ZXh0cmVzdG9yZWRcIlxuXG4gIGxldCB3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yID0gRG9tX2h0bWwuRXZlbnQubWFrZSBcIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3JcIlxuZW5kXG5cbigqKioqKVxuXG5jbGFzcyB0eXBlIGNhbnZhc0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgZ2V0Q29udGV4dCA6IGpzX3N0cmluZyB0IC0+IHJlbmRlcmluZ0NvbnRleHQgdCBvcHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENvbnRleHRfIDoganNfc3RyaW5nIHQgLT4gY29udGV4dEF0dHJpYnV0ZXMgdCAtPiByZW5kZXJpbmdDb250ZXh0IHQgb3B0IG1ldGhcbiAgZW5kXG5cbmxldCBnZXRDb250ZXh0IChjIDogRG9tX2h0bWwuY2FudmFzRWxlbWVudCB0KSA9XG4gIGxldCBjIDogY2FudmFzRWxlbWVudCB0ID0gSnMuVW5zYWZlLmNvZXJjZSBjIGluXG4gIGxldCBjdHggPSBjIyNnZXRDb250ZXh0IChKcy5zdHJpbmcgXCJ3ZWJnbFwiKSBpblxuICBpZiBPcHQudGVzdCBjdHggdGhlbiBjdHggZWxzZSBjICMjIChnZXRDb250ZXh0IChKcy5zdHJpbmcgXCJleHBlcmltZW50YWwtd2ViZ2xcIikpXG5cbmxldCBnZXRDb250ZXh0V2l0aEF0dHJpYnV0ZXMgKGMgOiBEb21faHRtbC5jYW52YXNFbGVtZW50IHQpIGF0dHJpYnMgPVxuICBsZXQgYyA6IGNhbnZhc0VsZW1lbnQgdCA9IEpzLlVuc2FmZS5jb2VyY2UgYyBpblxuICBsZXQgY3R4ID0gYyMjZ2V0Q29udGV4dF8gKEpzLnN0cmluZyBcIndlYmdsXCIpIGF0dHJpYnMgaW5cbiAgaWYgT3B0LnRlc3QgY3R4IHRoZW4gY3R4IGVsc2UgYyMjZ2V0Q29udGV4dF8gKEpzLnN0cmluZyBcImV4cGVyaW1lbnRhbC13ZWJnbFwiKSBhdHRyaWJzXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDEwIFJhcGhhw6tsIFByb3VzdCwgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbnR5cGUgcmVnZXhwID0gSnMucmVnRXhwIEpzLnRcblxudHlwZSByZXN1bHQgPSBKcy5tYXRjaF9yZXN1bHQgSnMudFxuXG5sZXQgcmVnZXhwIHMgPSBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyAoSnMuYnl0ZXN0cmluZyBzKSAoSnMuc3RyaW5nIFwiZ1wiKVxuXG5sZXQgcmVnZXhwX2Nhc2VfZm9sZCBzID0gbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgKEpzLmJ5dGVzdHJpbmcgcykgKEpzLnN0cmluZyBcImdpXCIpXG5cbmxldCByZWdleHBfd2l0aF9mbGFnIHMgZiA9XG4gIG5ldyVqcyBKcy5yZWdFeHBfd2l0aEZsYWdzIChKcy5ieXRlc3RyaW5nIHMpIChKcy5zdHJpbmcgKFwiZ1wiIF4gZikpXG5cbmxldCBibHVudF9zdHJfYXJyYXlfZ2V0IGEgaSA9XG4gIEpzLnRvX2J5dGVzdHJpbmcgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCBhIGkpIChmdW4gKCkgLT4gYXNzZXJ0IGZhbHNlKSlcblxubGV0IHN0cmluZ19tYXRjaCByIHMgaSA9XG4gIHIjIy5sYXN0SW5kZXggOj0gaTtcbiAgSnMuT3B0LnRvX29wdGlvbiAoSnMuT3B0Lm1hcCAociMjZXhlYyAoSnMuYnl0ZXN0cmluZyBzKSkgSnMubWF0Y2hfcmVzdWx0KVxuXG5sZXQgc2VhcmNoIHIgcyBpID1cbiAgciMjLmxhc3RJbmRleCA6PSBpO1xuICBKcy5PcHQudG9fb3B0aW9uXG4gICAgKEpzLk9wdC5tYXBcbiAgICAgICAociMjZXhlYyAoSnMuYnl0ZXN0cmluZyBzKSlcbiAgICAgICAoZnVuIHJlc19wcmUgLT5cbiAgICAgICAgIGxldCByZXMgPSBKcy5tYXRjaF9yZXN1bHQgcmVzX3ByZSBpblxuICAgICAgICAgcmVzIyMuaW5kZXgsIHJlcykpXG5cbmxldCBzZWFyY2hfZm9yd2FyZCA9IHNlYXJjaFxuXG5sZXQgbWF0Y2hlZF9zdHJpbmcgciA9IGJsdW50X3N0cl9hcnJheV9nZXQgciAwXG5cbmxldCBtYXRjaGVkX2dyb3VwIHIgaSA9XG4gIEpzLk9wdGRlZi50b19vcHRpb24gKEpzLk9wdGRlZi5tYXAgKEpzLmFycmF5X2dldCByIGkpIEpzLnRvX2J5dGVzdHJpbmcpXG5cbmxldCBxdW90ZV9yZXBsX3JlID0gbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgKEpzLnN0cmluZyBcIlskXVwiKSAoSnMuc3RyaW5nIFwiZ1wiKVxuXG5sZXQgcXVvdGVfcmVwbCBzID0gKEpzLmJ5dGVzdHJpbmcgcykjI3JlcGxhY2UgcXVvdGVfcmVwbF9yZSAoSnMuc3RyaW5nIFwiJCQkJFwiKVxuXG5sZXQgZ2xvYmFsX3JlcGxhY2UgciBzIHNfYnkgPVxuICByIyMubGFzdEluZGV4IDo9IDA7XG4gIEpzLnRvX2J5dGVzdHJpbmcgKEpzLmJ5dGVzdHJpbmcgcykgIyMgKHJlcGxhY2UgciAocXVvdGVfcmVwbCBzX2J5KSlcblxubGV0IHJlcGxhY2VfZmlyc3QgciBzIHNfYnkgPVxuICBsZXQgZmxhZ3MgPVxuICAgIG1hdGNoIEpzLnRvX2Jvb2wgciMjLmlnbm9yZUNhc2UsIEpzLnRvX2Jvb2wgciMjLm11bHRpbGluZSB3aXRoXG4gICAgfCBmYWxzZSwgZmFsc2UgLT4gSnMuc3RyaW5nIFwiXCJcbiAgICB8IGZhbHNlLCB0cnVlIC0+IEpzLnN0cmluZyBcIm1cIlxuICAgIHwgdHJ1ZSwgZmFsc2UgLT4gSnMuc3RyaW5nIFwiaVwiXG4gICAgfCB0cnVlLCB0cnVlIC0+IEpzLnN0cmluZyBcIm1pXCJcbiAgaW5cbiAgbGV0IHInID0gbmV3JWpzIEpzLnJlZ0V4cF93aXRoRmxhZ3MgciMjLnNvdXJjZSBmbGFncyBpblxuICBKcy50b19ieXRlc3RyaW5nIChKcy5ieXRlc3RyaW5nIHMpICMjIChyZXBsYWNlIHInIChxdW90ZV9yZXBsIHNfYnkpKVxuXG5sZXQgbGlzdF9vZl9qc19hcnJheSBhID1cbiAgbGV0IHJlYyBhdXggYWNjdSBpZHggPVxuICAgIGlmIGlkeCA8IDAgdGhlbiBhY2N1IGVsc2UgYXV4IChibHVudF9zdHJfYXJyYXlfZ2V0IGEgaWR4IDo6IGFjY3UpIChpZHggLSAxKVxuICBpblxuICBhdXggW10gKGEjIy5sZW5ndGggLSAxKVxuXG5sZXQgc3BsaXQgciBzID1cbiAgciMjLmxhc3RJbmRleCA6PSAwO1xuICBsaXN0X29mX2pzX2FycmF5IChKcy5zdHJfYXJyYXkgKEpzLmJ5dGVzdHJpbmcgcykgIyMgKHNwbGl0X3JlZ0V4cCByKSlcblxubGV0IGJvdW5kZWRfc3BsaXQgciBzIGkgPVxuICByIyMubGFzdEluZGV4IDo9IDA7XG4gIGxpc3Rfb2ZfanNfYXJyYXkgKEpzLnN0cl9hcnJheSAoSnMuYnl0ZXN0cmluZyBzKSAjIyAoc3BsaXRfcmVnRXhwTGltaXRlZCByIGkpKVxuXG4oKiBNb3JlIGNvbnN0cnVjdG9ycyAqKVxuXG5sZXQgcXVvdGVfcmUgPSByZWdleHAgXCJbXFxcXF1bKClcXFxcXFxcXHwrKi4/e31eJF1cIlxuXG5sZXQgcXVvdGUgcyA9IEpzLnRvX2J5dGVzdHJpbmcgKEpzLmJ5dGVzdHJpbmcgcykgIyMgKHJlcGxhY2UgcXVvdGVfcmUgKEpzLnN0cmluZyBcIlxcXFwkJlwiKSlcblxubGV0IHJlZ2V4cF9zdHJpbmcgcyA9IHJlZ2V4cCAocXVvdGUgcylcblxubGV0IHJlZ2V4cF9zdHJpbmdfY2FzZV9mb2xkIHMgPSByZWdleHBfY2FzZV9mb2xkIChxdW90ZSBzKVxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxMCBSYXBoYcOrbCBQcm91c3RcbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbigqIFVybCB0YW1wZXJpbmcuICopXG5cbmxldCBzcGxpdCBjIHMgPSBKcy5zdHJfYXJyYXkgKHMjI3NwbGl0IChKcy5zdHJpbmcgKFN0cmluZy5tYWtlIDEgYykpKVxuXG5sZXQgc3BsaXRfMiBjIHMgPVxuICBsZXQgaW5kZXggPSBzIyNpbmRleE9mIChKcy5zdHJpbmcgKFN0cmluZy5tYWtlIDEgYykpIGluXG4gIGlmIGluZGV4IDwgMCB0aGVuIEpzLnVuZGVmaW5lZCBlbHNlIEpzLmRlZiAocyMjc2xpY2UgMCBpbmRleCwgcyMjc2xpY2VfZW5kIChpbmRleCArIDEpKVxuXG5leGNlcHRpb24gTG9jYWxfZXhuXG5cbmxldCBpbnRlcnJ1cHQgKCkgPSByYWlzZSBMb2NhbF9leG5cblxuKCogdXJsIChBS0EgcGVyY2VudCkgZW5jb2RpbmcvZGVjb2RpbmcgKilcblxubGV0IHBsdXNfcmUgPSBSZWdleHAucmVnZXhwX3N0cmluZyBcIitcIlxuXG5sZXQgZXNjYXBlX3BsdXMgcyA9IFJlZ2V4cC5nbG9iYWxfcmVwbGFjZSBwbHVzX3JlIHMgXCIlMkJcIlxuXG5sZXQgdW5lc2NhcGVfcGx1cyBzID0gUmVnZXhwLmdsb2JhbF9yZXBsYWNlIHBsdXNfcmUgcyBcIiBcIlxuXG5sZXQgcGx1c19yZV9qc19zdHJpbmcgPSBuZXclanMgSnMucmVnRXhwX3dpdGhGbGFncyAoSnMuc3RyaW5nIFwiXFxcXCtcIikgKEpzLnN0cmluZyBcImdcIilcblxubGV0IHVuZXNjYXBlX3BsdXNfanNfc3RyaW5nIHMgPVxuICBwbHVzX3JlX2pzX3N0cmluZyMjLmxhc3RJbmRleCA6PSAwO1xuICBzIyNyZXBsYWNlIHBsdXNfcmVfanNfc3RyaW5nIChKcy5zdHJpbmcgXCIgXCIpXG5cbmxldCB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBzID1cbiAgSnMudG9fYnl0ZXN0cmluZyAoSnMudW5lc2NhcGUgKHVuZXNjYXBlX3BsdXNfanNfc3RyaW5nIHMpKVxuXG5sZXQgdXJsZGVjb2RlIHMgPSBKcy50b19ieXRlc3RyaW5nIChKcy51bmVzY2FwZSAoSnMuYnl0ZXN0cmluZyAodW5lc2NhcGVfcGx1cyBzKSkpXG5cbigqbGV0IHVybGVuY29kZV9qc19zdHJpbmdfc3RyaW5nIHMgPVxuICBKcy50b19ieXRlc3RyaW5nIChKcy5lc2NhcGUgcykqKVxuXG5sZXQgdXJsZW5jb2RlID8od2l0aF9wbHVzID0gdHJ1ZSkgcyA9XG4gIGlmIHdpdGhfcGx1c1xuICB0aGVuIGVzY2FwZV9wbHVzIChKcy50b19ieXRlc3RyaW5nIChKcy5lc2NhcGUgKEpzLmJ5dGVzdHJpbmcgcykpKVxuICBlbHNlIEpzLnRvX2J5dGVzdHJpbmcgKEpzLmVzY2FwZSAoSnMuYnl0ZXN0cmluZyBzKSlcblxudHlwZSBodHRwX3VybCA9XG4gIHsgaHVfaG9zdCA6IHN0cmluZyAgKCoqIFRoZSBob3N0IHBhcnQgb2YgdGhlIHVybC4gKilcbiAgOyBodV9wb3J0IDogaW50ICAoKiogVGhlIHBvcnQgZm9yIHRoZSBjb25uZWN0aW9uIGlmIGFueS4gKilcbiAgOyBodV9wYXRoIDogc3RyaW5nIGxpc3QgICgqKiBUaGUgcGF0aCBzcGxpdCBvbiBbJy8nXSBjaGFyYWN0ZXJzLiAqKVxuICA7IGh1X3BhdGhfc3RyaW5nIDogc3RyaW5nICAoKiogVGhlIG9yaWdpbmFsIGVudGlyZSBwYXRoLiAqKVxuICA7IGh1X2FyZ3VtZW50cyA6IChzdHJpbmcgKiBzdHJpbmcpIGxpc3RcbiAgICAgICAgKCoqIEFyZ3VtZW50cyBhcyBhIGZpZWxkLXZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGlvbiBsaXN0LiopXG4gIDsgaHVfZnJhZ21lbnQgOiBzdHJpbmcgICgqKiBUaGUgZnJhZ21lbnQgcGFydCAoYWZ0ZXIgdGhlIFsnIyddIGNoYXJhY3RlcikuICopXG4gIH1cbigqKiBUaGUgdHlwZSBmb3IgSFRUUCB1cmwuICopXG5cbnR5cGUgZmlsZV91cmwgPVxuICB7IGZ1X3BhdGggOiBzdHJpbmcgbGlzdFxuICA7IGZ1X3BhdGhfc3RyaW5nIDogc3RyaW5nXG4gIDsgZnVfYXJndW1lbnRzIDogKHN0cmluZyAqIHN0cmluZykgbGlzdFxuICA7IGZ1X2ZyYWdtZW50IDogc3RyaW5nXG4gIH1cbigqKiBUaGUgdHlwZSBmb3IgbG9jYWwgZmlsZSB1cmxzLiAqKVxuXG50eXBlIHVybCA9XG4gIHwgSHR0cCBvZiBodHRwX3VybFxuICB8IEh0dHBzIG9mIGh0dHBfdXJsXG4gIHwgRmlsZSBvZiBmaWxlX3VybFxuICAgICAgKCoqIFRoZSB0eXBlIGZvciB1cmxzLiBbRmlsZV0gaXMgZm9yIGxvY2FsIGZpbGVzIGFuZCBbRXhvdGljIHNdIGlzIGZvclxuICAgIHVua25vd24vdW5zdXBwb3J0ZWQgcHJvdG9jb2xzLiAqKVxuXG5leGNlcHRpb24gTm90X2FuX2h0dHBfcHJvdG9jb2xcblxubGV0IGlzX3NlY3VyZSBwcm90X3N0cmluZyA9XG4gIG1hdGNoIEpzLnRvX2J5dGVzdHJpbmcgcHJvdF9zdHJpbmcjI3RvTG93ZXJDYXNlIHdpdGhcbiAgfCBcImh0dHBzOlwiIHwgXCJodHRwc1wiIC0+IHRydWVcbiAgfCBcImh0dHA6XCIgfCBcImh0dHBcIiAtPiBmYWxzZVxuICB8IFwiZmlsZTpcIiB8IFwiZmlsZVwiIHwgXyAtPiByYWlzZSBOb3RfYW5faHR0cF9wcm90b2NvbFxuXG4oKiBwb3J0IG51bWJlciAqKVxubGV0IGRlZmF1bHRfaHR0cF9wb3J0ID0gODBcblxubGV0IGRlZmF1bHRfaHR0cHNfcG9ydCA9IDQ0M1xuXG4oKiBwYXRoICopXG5sZXQgcGF0aF9vZl9wYXRoX3N0cmluZyBzID1cbiAgbGV0IGwgPSBTdHJpbmcubGVuZ3RoIHMgaW5cbiAgbGV0IHJlYyBhdXggaSA9XG4gICAgbGV0IGogPSB0cnkgU3RyaW5nLmluZGV4X2Zyb20gcyBpICcvJyB3aXRoIE5vdF9mb3VuZCAtPiBsIGluXG4gICAgbGV0IHdvcmQgPSBTdHJpbmcuc3ViIHMgaSAoaiAtIGkpIGluXG4gICAgaWYgaiA+PSBsIHRoZW4gWyB3b3JkIF0gZWxzZSB3b3JkIDo6IGF1eCAoaiArIDEpXG4gIGluXG4gIG1hdGNoIGF1eCAwIHdpdGhcbiAgfCBbIFwiXCIgXSAtPiBbXVxuICB8IFsgXCJcIjsgXCJcIiBdIC0+IFsgXCJcIiBdXG4gIHwgYSAtPiBhXG5cbigqIEFyZ3VtZW50cyAqKVxubGV0IGVuY29kZV9hcmd1bWVudHMgbCA9XG4gIFN0cmluZy5jb25jYXQgXCImXCIgKExpc3QubWFwIChmdW4gKG4sIHYpIC0+IHVybGVuY29kZSBuIF4gXCI9XCIgXiB1cmxlbmNvZGUgdikgbClcblxubGV0IGRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nIHMgPVxuICBsZXQgYXJyID0gc3BsaXQgJyYnIHMgaW5cbiAgbGV0IGxlbiA9IGFyciMjLmxlbmd0aCBpblxuICBsZXQgbmFtZV92YWx1ZV9zcGxpdCBzID0gc3BsaXRfMiAnPScgcyBpblxuICBsZXQgcmVjIGF1eCBhY2MgaWR4ID1cbiAgICBpZiBpZHggPCAwXG4gICAgdGhlbiBhY2NcbiAgICBlbHNlXG4gICAgICB0cnlcbiAgICAgICAgYXV4XG4gICAgICAgICAgKEpzLk9wdGRlZi5jYXNlIChKcy5hcnJheV9nZXQgYXJyIGlkeCkgaW50ZXJydXB0IChmdW4gcyAtPlxuICAgICAgICAgICAgICAgSnMuT3B0ZGVmLmNhc2UgKG5hbWVfdmFsdWVfc3BsaXQgcykgaW50ZXJydXB0IChmdW4gKHgsIHkpIC0+XG4gICAgICAgICAgICAgICAgICAgbGV0IGdldCA9IHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIGluXG4gICAgICAgICAgICAgICAgICAgZ2V0IHgsIGdldCB5KSlcbiAgICAgICAgICA6OiBhY2MpXG4gICAgICAgICAgKHByZWQgaWR4KVxuICAgICAgd2l0aCBMb2NhbF9leG4gLT4gYXV4IGFjYyAocHJlZCBpZHgpXG4gIGluXG4gIGF1eCBbXSAobGVuIC0gMSlcblxubGV0IGRlY29kZV9hcmd1bWVudHMgcyA9IGRlY29kZV9hcmd1bWVudHNfanNfc3RyaW5nIChKcy5ieXRlc3RyaW5nIHMpXG5cbmxldCB1cmxfcmUgPVxuICBuZXclanMgSnMucmVnRXhwXG4gICAgKEpzLmJ5dGVzdHJpbmdcbiAgICAgICBcIl4oW0hoXVtUdF1bVHRdW1BwXVtTc10/KTovLyhbMC05YS16QS1aLi1dK3xcXFxcW1swLTlhLXpBLVouLV0rXFxcXF18XFxcXFtbMC05QS1GYS1mOi5dK1xcXFxdKT8oOihbMC05XSspKT8oLyhbXlxcXFw/I10qKShcXFxcPyhbXiNdKikpPygjKC4qKSk/KT8kXCIpXG5cbmxldCBmaWxlX3JlID1cbiAgbmV3JWpzIEpzLnJlZ0V4cFxuICAgIChKcy5ieXRlc3RyaW5nIFwiXihbRmZdW0lpXVtMbF1bRWVdKTovLyhbXlxcXFw/I10qKShcXFxcPyhbXiNdKikpPygjKC4qKSk/JFwiKVxuXG5sZXQgdXJsX29mX2pzX3N0cmluZyBzID1cbiAgSnMuT3B0LmNhc2VcbiAgICAodXJsX3JlIyNleGVjIHMpXG4gICAgKGZ1biAoKSAtPlxuICAgICAgSnMuT3B0LmNhc2VcbiAgICAgICAgKGZpbGVfcmUjI2V4ZWMgcylcbiAgICAgICAgKGZ1biAoKSAtPiBOb25lKVxuICAgICAgICAoZnVuIGhhbmRsZSAtPlxuICAgICAgICAgIGxldCByZXMgPSBKcy5tYXRjaF9yZXN1bHQgaGFuZGxlIGluXG4gICAgICAgICAgbGV0IHBhdGhfc3RyID1cbiAgICAgICAgICAgIHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDIpIGludGVycnVwdClcbiAgICAgICAgICBpblxuICAgICAgICAgIFNvbWVcbiAgICAgICAgICAgIChGaWxlXG4gICAgICAgICAgICAgICB7IGZ1X3BhdGggPSBwYXRoX29mX3BhdGhfc3RyaW5nIHBhdGhfc3RyXG4gICAgICAgICAgICAgICA7IGZ1X3BhdGhfc3RyaW5nID0gcGF0aF9zdHJcbiAgICAgICAgICAgICAgIDsgZnVfYXJndW1lbnRzID1cbiAgICAgICAgICAgICAgICAgICBkZWNvZGVfYXJndW1lbnRzX2pzX3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgNCkgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKVxuICAgICAgICAgICAgICAgOyBmdV9mcmFnbWVudCA9XG4gICAgICAgICAgICAgICAgICAgSnMudG9fYnl0ZXN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgNikgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKVxuICAgICAgICAgICAgICAgfSkpKVxuICAgIChmdW4gaGFuZGxlIC0+XG4gICAgICBsZXQgcmVzID0gSnMubWF0Y2hfcmVzdWx0IGhhbmRsZSBpblxuICAgICAgbGV0IHNzbCA9IGlzX3NlY3VyZSAoSnMuT3B0ZGVmLmdldCAoSnMuYXJyYXlfZ2V0IHJlcyAxKSBpbnRlcnJ1cHQpIGluXG4gICAgICBsZXQgcG9ydF9vZl9zdHJpbmcgPSBmdW5jdGlvblxuICAgICAgICB8IFwiXCIgLT4gaWYgc3NsIHRoZW4gNDQzIGVsc2UgODBcbiAgICAgICAgfCBzIC0+IGludF9vZl9zdHJpbmcgc1xuICAgICAgaW5cbiAgICAgIGxldCBwYXRoX3N0ciA9XG4gICAgICAgIHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nXG4gICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgNikgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKVxuICAgICAgaW5cbiAgICAgIGxldCB1cmwgPVxuICAgICAgICB7IGh1X2hvc3QgPVxuICAgICAgICAgICAgdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgMikgaW50ZXJydXB0KVxuICAgICAgICA7IGh1X3BvcnQgPVxuICAgICAgICAgICAgcG9ydF9vZl9zdHJpbmdcbiAgICAgICAgICAgICAgKEpzLnRvX2J5dGVzdHJpbmdcbiAgICAgICAgICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgNCkgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKSlcbiAgICAgICAgOyBodV9wYXRoID0gcGF0aF9vZl9wYXRoX3N0cmluZyBwYXRoX3N0clxuICAgICAgICA7IGh1X3BhdGhfc3RyaW5nID0gcGF0aF9zdHJcbiAgICAgICAgOyBodV9hcmd1bWVudHMgPVxuICAgICAgICAgICAgZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmdcbiAgICAgICAgICAgICAgKEpzLk9wdGRlZi5nZXQgKEpzLmFycmF5X2dldCByZXMgOCkgKGZ1biAoKSAtPiBKcy5ieXRlc3RyaW5nIFwiXCIpKVxuICAgICAgICA7IGh1X2ZyYWdtZW50ID1cbiAgICAgICAgICAgIHVybGRlY29kZV9qc19zdHJpbmdfc3RyaW5nXG4gICAgICAgICAgICAgIChKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQgcmVzIDEwKSAoZnVuICgpIC0+IEpzLmJ5dGVzdHJpbmcgXCJcIikpXG4gICAgICAgIH1cbiAgICAgIGluXG4gICAgICBTb21lIChpZiBzc2wgdGhlbiBIdHRwcyB1cmwgZWxzZSBIdHRwIHVybCkpXG5cbmxldCB1cmxfb2Zfc3RyaW5nIHMgPSB1cmxfb2ZfanNfc3RyaW5nIChKcy5ieXRlc3RyaW5nIHMpXG5cbmxldCBzdHJpbmdfb2ZfdXJsID0gZnVuY3Rpb25cbiAgfCBGaWxlIHsgZnVfcGF0aCA9IHBhdGg7IGZ1X2FyZ3VtZW50cyA9IGFyZ3M7IGZ1X2ZyYWdtZW50ID0gZnJhZzsgXyB9IC0+IChcbiAgICAgIFwiZmlsZTovL1wiXG4gICAgICBeIFN0cmluZy5jb25jYXQgXCIvXCIgKExpc3QubWFwIChmdW4geCAtPiB1cmxlbmNvZGUgeCkgcGF0aClcbiAgICAgIF4gKG1hdGNoIGFyZ3Mgd2l0aFxuICAgICAgICB8IFtdIC0+IFwiXCJcbiAgICAgICAgfCBsIC0+IFwiP1wiIF4gZW5jb2RlX2FyZ3VtZW50cyBsKVxuICAgICAgXlxuICAgICAgbWF0Y2ggZnJhZyB3aXRoXG4gICAgICB8IFwiXCIgLT4gXCJcIlxuICAgICAgfCBzIC0+IFwiI1wiIF4gdXJsZW5jb2RlIHMpXG4gIHwgSHR0cFxuICAgICAgeyBodV9ob3N0ID0gaG9zdFxuICAgICAgOyBodV9wb3J0ID0gcG9ydFxuICAgICAgOyBodV9wYXRoID0gcGF0aFxuICAgICAgOyBodV9hcmd1bWVudHMgPSBhcmdzXG4gICAgICA7IGh1X2ZyYWdtZW50ID0gZnJhZ1xuICAgICAgOyBfXG4gICAgICB9IC0+IChcbiAgICAgIFwiaHR0cDovL1wiXG4gICAgICBeIHVybGVuY29kZSBob3N0XG4gICAgICBeIChtYXRjaCBwb3J0IHdpdGhcbiAgICAgICAgfCA4MCAtPiBcIlwiXG4gICAgICAgIHwgbiAtPiBcIjpcIiBeIHN0cmluZ19vZl9pbnQgbilcbiAgICAgIF4gXCIvXCJcbiAgICAgIF4gU3RyaW5nLmNvbmNhdCBcIi9cIiAoTGlzdC5tYXAgKGZ1biB4IC0+IHVybGVuY29kZSB4KSBwYXRoKVxuICAgICAgXiAobWF0Y2ggYXJncyB3aXRoXG4gICAgICAgIHwgW10gLT4gXCJcIlxuICAgICAgICB8IGwgLT4gXCI/XCIgXiBlbmNvZGVfYXJndW1lbnRzIGwpXG4gICAgICBeXG4gICAgICBtYXRjaCBmcmFnIHdpdGhcbiAgICAgIHwgXCJcIiAtPiBcIlwiXG4gICAgICB8IHMgLT4gXCIjXCIgXiB1cmxlbmNvZGUgcylcbiAgfCBIdHRwc1xuICAgICAgeyBodV9ob3N0ID0gaG9zdFxuICAgICAgOyBodV9wb3J0ID0gcG9ydFxuICAgICAgOyBodV9wYXRoID0gcGF0aFxuICAgICAgOyBodV9hcmd1bWVudHMgPSBhcmdzXG4gICAgICA7IGh1X2ZyYWdtZW50ID0gZnJhZ1xuICAgICAgOyBfXG4gICAgICB9IC0+IChcbiAgICAgIFwiaHR0cHM6Ly9cIlxuICAgICAgXiB1cmxlbmNvZGUgaG9zdFxuICAgICAgXiAobWF0Y2ggcG9ydCB3aXRoXG4gICAgICAgIHwgNDQzIC0+IFwiXCJcbiAgICAgICAgfCBuIC0+IFwiOlwiIF4gc3RyaW5nX29mX2ludCBuKVxuICAgICAgXiBcIi9cIlxuICAgICAgXiBTdHJpbmcuY29uY2F0IFwiL1wiIChMaXN0Lm1hcCAoZnVuIHggLT4gdXJsZW5jb2RlIHgpIHBhdGgpXG4gICAgICBeIChtYXRjaCBhcmdzIHdpdGhcbiAgICAgICAgfCBbXSAtPiBcIlwiXG4gICAgICAgIHwgbCAtPiBcIj9cIiBeIGVuY29kZV9hcmd1bWVudHMgbClcbiAgICAgIF5cbiAgICAgIG1hdGNoIGZyYWcgd2l0aFxuICAgICAgfCBcIlwiIC0+IFwiXCJcbiAgICAgIHwgcyAtPiBcIiNcIiBeIHVybGVuY29kZSBzKVxuXG5tb2R1bGUgQ3VycmVudCA9IHN0cnVjdFxuICBsZXQgbCA9XG4gICAgaWYgSnMuT3B0ZGVmLnRlc3QgKEpzLk9wdGRlZi5yZXR1cm4gRG9tX2h0bWwud2luZG93IyMubG9jYXRpb24pXG4gICAgdGhlbiBEb21faHRtbC53aW5kb3cjIy5sb2NhdGlvblxuICAgIGVsc2VcbiAgICAgIGxldCBlbXB0eSA9IEpzLnN0cmluZyBcIlwiIGluXG4gICAgICBvYmplY3QlanNcbiAgICAgICAgdmFsIG11dGFibGUgaHJlZiA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgcHJvdG9jb2wgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIGhvc3QgPSBlbXB0eVxuXG4gICAgICAgIHZhbCBtdXRhYmxlIGhvc3RuYW1lID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBwb3J0ID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBwYXRobmFtZSA9IGVtcHR5XG5cbiAgICAgICAgdmFsIG11dGFibGUgc2VhcmNoID0gZW1wdHlcblxuICAgICAgICB2YWwgbXV0YWJsZSBoYXNoID0gZW1wdHlcblxuICAgICAgICB2YWwgb3JpZ2luID0gSnMudW5kZWZpbmVkXG5cbiAgICAgICAgbWV0aG9kIHJlbG9hZCA9ICgpXG5cbiAgICAgICAgbWV0aG9kIHJlcGxhY2UgXyA9ICgpXG5cbiAgICAgICAgbWV0aG9kIGFzc2lnbiBfID0gKClcbiAgICAgIGVuZFxuXG4gIGxldCBob3N0ID0gdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgbCMjLmhvc3RuYW1lXG5cbiAgbGV0IHByb3RvY29sID0gdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgbCMjLnByb3RvY29sXG5cbiAgbGV0IHBvcnQgPVxuICAgIChmdW4gKCkgLT5cbiAgICAgIHRyeSBTb21lIChpbnRfb2Zfc3RyaW5nIChKcy50b19ieXRlc3RyaW5nIGwjIy5wb3J0KSkgd2l0aCBGYWlsdXJlIF8gLT4gTm9uZSlcbiAgICAgICgpXG5cbiAgbGV0IHBhdGhfc3RyaW5nID0gdXJsZGVjb2RlX2pzX3N0cmluZ19zdHJpbmcgbCMjLnBhdGhuYW1lXG5cbiAgbGV0IHBhdGggPSBwYXRoX29mX3BhdGhfc3RyaW5nIHBhdGhfc3RyaW5nXG5cbiAgbGV0IGFyZ3VtZW50cyA9XG4gICAgZGVjb2RlX2FyZ3VtZW50c19qc19zdHJpbmdcbiAgICAgIChpZiBsIyMuc2VhcmNoIyNjaGFyQXQgMCA9PSBKcy5zdHJpbmcgXCI/XCJcbiAgICAgIHRoZW4gbCMjLnNlYXJjaCMjc2xpY2VfZW5kIDFcbiAgICAgIGVsc2UgbCMjLnNlYXJjaClcblxuICBsZXQgZ2V0X2ZyYWdtZW50ICgpID1cbiAgICAoKiBsb2NhdGlvbi5oYXNoIGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXJcbiAgICAgICBGaXJlZm94IGJ1ZyA6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQ4MzMwNCAqKVxuICAgICgqIGxldCBzID0gSnMudG9fYnl0ZXN0cmluZyAobCMjaGFzaCkgaW4gKilcbiAgICAoKiBpZiBTdHJpbmcubGVuZ3RoIHMgPiAwICYmIHMuWzBdID0gJyMnICopXG4gICAgKCogdGhlbiBTdHJpbmcuc3ViIHMgMSAoU3RyaW5nLmxlbmd0aCBzIC0gMSkgKilcbiAgICAoKiBlbHNlIHM7ICopXG4gICAgSnMuT3B0LmNhc2VcbiAgICAgIChsIyMuaHJlZiMjX21hdGNoIChuZXclanMgSnMucmVnRXhwIChKcy5zdHJpbmcgXCIjKC4qKVwiKSkpXG4gICAgICAoZnVuICgpIC0+IFwiXCIpXG4gICAgICAoZnVuIHJlcyAtPlxuICAgICAgICBsZXQgcmVzID0gSnMubWF0Y2hfcmVzdWx0IHJlcyBpblxuICAgICAgICBKcy50b19zdHJpbmcgKEpzLlVuc2FmZS5nZXQgcmVzIDEpKVxuXG4gIGxldCBzZXRfZnJhZ21lbnQgcyA9IGwjIy5oYXNoIDo9IEpzLmJ5dGVzdHJpbmcgKHVybGVuY29kZSBzKVxuXG4gIGxldCBnZXQgKCkgPSB1cmxfb2ZfanNfc3RyaW5nIGwjIy5ocmVmXG5cbiAgbGV0IHNldCB1ID0gbCMjLmhyZWYgOj0gSnMuYnl0ZXN0cmluZyAoc3RyaW5nX29mX3VybCB1KVxuXG4gIGxldCBhc19zdHJpbmcgPSB1cmxkZWNvZGVfanNfc3RyaW5nX3N0cmluZyBsIyMuaHJlZlxuZW5kXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE0IEh1Z28gSGV1emFyZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbmV4dGVybmFsIGNyZWF0ZV9maWxlIDogbmFtZTpzdHJpbmcgLT4gY29udGVudDpzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF9jcmVhdGVfZmlsZVwiXG5cbmV4dGVybmFsIHJlYWRfZmlsZSA6IG5hbWU6c3RyaW5nIC0+IHN0cmluZyA9IFwiY2FtbF9yZWFkX2ZpbGVfY29udGVudFwiXG5cbmxldCB1cGRhdGVfZmlsZSB+bmFtZSB+Y29udGVudCA9XG4gIGxldCBvYyA9IG9wZW5fb3V0IG5hbWUgaW5cbiAgb3V0cHV0X3N0cmluZyBvYyBjb250ZW50O1xuICBjbG9zZV9vdXQgb2NcblxuZXh0ZXJuYWwgc2V0X2NoYW5uZWxfb3V0cHV0JyA6XG4gIG91dF9jaGFubmVsIC0+IChKcy5qc19zdHJpbmcgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFjayAtPiB1bml0XG4gID0gXCJjYW1sX21sX3NldF9jaGFubmVsX291dHB1dFwiXG5cbmV4dGVybmFsIHNldF9jaGFubmVsX2lucHV0JyA6IGluX2NoYW5uZWwgLT4gKHVuaXQgLT4gc3RyaW5nKSBKcy5jYWxsYmFjayAtPiB1bml0XG4gID0gXCJjYW1sX21sX3NldF9jaGFubmVsX3JlZmlsbFwiXG5cbmxldCBzZXRfY2hhbm5lbF9mbHVzaGVyIChvdXRfY2hhbm5lbCA6IG91dF9jaGFubmVsKSAoZiA6IHN0cmluZyAtPiB1bml0KSA9XG4gIGxldCBmJyA6IChKcy5qc19zdHJpbmcgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFjayA9XG4gICAgSnMud3JhcF9jYWxsYmFjayAoZnVuIHMgLT4gZiAoSnMudG9fYnl0ZXN0cmluZyBzKSlcbiAgaW5cbiAgc2V0X2NoYW5uZWxfb3V0cHV0JyBvdXRfY2hhbm5lbCBmJ1xuXG5sZXQgc2V0X2NoYW5uZWxfZmlsbGVyIChpbl9jaGFubmVsIDogaW5fY2hhbm5lbCkgKGYgOiB1bml0IC0+IHN0cmluZykgPVxuICBsZXQgZicgOiAodW5pdCAtPiBzdHJpbmcpIEpzLmNhbGxiYWNrID0gSnMud3JhcF9jYWxsYmFjayBmIGluXG4gIHNldF9jaGFubmVsX2lucHV0JyBpbl9jaGFubmVsIGYnXG5cbmV4dGVybmFsIG1vdW50X3BvaW50IDogdW5pdCAtPiBzdHJpbmcgbGlzdCA9IFwiY2FtbF9saXN0X21vdW50X3BvaW50XCJcblxuZXh0ZXJuYWwgbW91bnRfYXV0b2xvYWQgOlxuICBzdHJpbmcgLT4gKHN0cmluZyAtPiBzdHJpbmcgLT4gc3RyaW5nIG9wdGlvbikgSnMuY2FsbGJhY2sgLT4gdW5pdFxuICA9IFwiY2FtbF9tb3VudF9hdXRvbG9hZFwiXG5cbmV4dGVybmFsIHVubW91bnQgOiBzdHJpbmcgLT4gdW5pdCA9IFwiY2FtbF91bm1vdW50XCJcblxubGV0IG1vdW50IH5wYXRoIGYgPVxuICBtb3VudF9hdXRvbG9hZCBwYXRoIChKcy53cmFwX2NhbGxiYWNrIChmdW4gcHJlZml4IHBhdGggLT4gZiB+cHJlZml4IH5wYXRoKSlcblxubGV0IHVubW91bnQgfnBhdGggPSB1bm1vdW50IHBhdGhcblxubGV0IGpzX29mX29jYW1sX3ZlcnNpb24gPVxuICBpZiBTdHJpbmcuZXF1YWwgTGliX3ZlcnNpb24uZ2l0X3ZlcnNpb24gXCJcIlxuICB0aGVuIExpYl92ZXJzaW9uLnNcbiAgZWxzZSBMaWJfdmVyc2lvbi5zIF4gXCIrXCIgXiBMaWJfdmVyc2lvbi5naXRfdmVyc2lvblxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxOSBBbGV4YW5kZXIgWWFuaW5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIHJlc2l6ZU9ic2VydmVyU2l6ZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBpbmxpbmVTaXplIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJsb2NrU2l6ZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcmVzaXplT2JzZXJ2ZXJFbnRyeSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB0YXJnZXQgOiBEb20ubm9kZSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250ZW50UmVjdCA6IERvbV9odG1sLmNsaWVudFJlY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYm9yZGVyQm94U2l6ZSA6IHJlc2l6ZU9ic2VydmVyU2l6ZSBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNvbnRlbnRCb3hTaXplIDogcmVzaXplT2JzZXJ2ZXJTaXplIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHJlc2l6ZU9ic2VydmVyT3B0aW9ucyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBib3ggOiBKcy5qc19zdHJpbmcgSnMudCBKcy53cml0ZW9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSByZXNpemVPYnNlcnZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBvYnNlcnZlIDogI0RvbS5ub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgb2JzZXJ2ZV93aXRoT3B0aW9ucyA6XG4gICAgICAjRG9tLm5vZGUgSnMudCAtPiByZXNpemVPYnNlcnZlck9wdGlvbnMgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB1bm9ic2VydmUgOiAjRG9tLm5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBkaXNjb25uZWN0IDogdW5pdCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgZW1wdHlfcmVzaXplX29ic2VydmVyX29wdGlvbnMgKCkgOiByZXNpemVPYnNlcnZlck9wdGlvbnMgSnMudCA9IEpzLlVuc2FmZS5vYmogW3x8XVxuXG5sZXQgcmVzaXplT2JzZXJ2ZXIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1Jlc2l6ZU9ic2VydmVyXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCByZXNpemVPYnNlcnZlclxuXG5sZXQgcmVzaXplT2JzZXJ2ZXIgOlxuICAgICggICAocmVzaXplT2JzZXJ2ZXJFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLnQgLT4gcmVzaXplT2JzZXJ2ZXIgSnMudCAtPiB1bml0KVxuICAgICAgICBKcy5jYWxsYmFja1xuICAgICAtPiByZXNpemVPYnNlcnZlciBKcy50KVxuICAgIEpzLmNvbnN0ciA9XG4gIHJlc2l6ZU9ic2VydmVyXG5cbmxldCBvYnNlcnZlXG4gICAgfihub2RlIDogI0RvbS5ub2RlIEpzLnQpXG4gICAgfihmIDogcmVzaXplT2JzZXJ2ZXJFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLnQgLT4gcmVzaXplT2JzZXJ2ZXIgSnMudCAtPiB1bml0KVxuICAgID8oYm94IDogSnMuanNfc3RyaW5nIEpzLnQgb3B0aW9uKVxuICAgICgpIDogcmVzaXplT2JzZXJ2ZXIgSnMudCA9XG4gIGxldCBvYnMgPSBuZXclanMgcmVzaXplT2JzZXJ2ZXIgKEpzLndyYXBfY2FsbGJhY2sgZikgaW5cbiAgKG1hdGNoIGJveCB3aXRoXG4gIHwgTm9uZSAtPiBvYnMjI29ic2VydmUgbm9kZVxuICB8IFNvbWUgYm94IC0+XG4gICAgICBsZXQgb3B0cyA9IGVtcHR5X3Jlc2l6ZV9vYnNlcnZlcl9vcHRpb25zICgpIGluXG4gICAgICBvcHRzIyMuYm94IDo9IGJveDtcbiAgICAgIG9icyMjb2JzZXJ2ZV93aXRoT3B0aW9ucyBub2RlIG9wdHMpO1xuICBvYnNcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjEgUGhpbGlwIFdoaXRlXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbm9wZW4hIEltcG9ydFxuXG5jbGFzcyB0eXBlIHBlcmZvcm1hbmNlT2JzZXJ2ZXJJbml0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGVudHJ5VHlwZXMgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLndyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBlcmZvcm1hbmNlRW50cnkgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbmFtZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBlbnRyeVR5cGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3RhcnRUaW1lIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGR1cmF0aW9uIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBwZXJmb3JtYW5jZU9ic2VydmVyRW50cnlMaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGdldEVudHJpZXMgOiBwZXJmb3JtYW5jZUVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBlcmZvcm1hbmNlT2JzZXJ2ZXIgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgb2JzZXJ2ZSA6IHBlcmZvcm1hbmNlT2JzZXJ2ZXJJbml0IEpzLnQgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgZGlzY29ubmVjdCA6IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHRha2VSZWNvcmRzIDogcGVyZm9ybWFuY2VFbnRyeSBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICBlbmRcblxubGV0IHBlcmZvcm1hbmNlT2JzZXJ2ZXIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX1BlcmZvcm1hbmNlT2JzZXJ2ZXJcblxubGV0IGlzX3N1cHBvcnRlZCAoKSA9IEpzLk9wdGRlZi50ZXN0IHBlcmZvcm1hbmNlT2JzZXJ2ZXJcblxubGV0IHBlcmZvcm1hbmNlT2JzZXJ2ZXIgOlxuICAgICggICAocGVyZm9ybWFuY2VPYnNlcnZlckVudHJ5TGlzdCBKcy50IC0+IHBlcmZvcm1hbmNlT2JzZXJ2ZXIgSnMudCAtPiB1bml0KSBKcy5jYWxsYmFja1xuICAgICAtPiBwZXJmb3JtYW5jZU9ic2VydmVyIEpzLnQpXG4gICAgSnMuY29uc3RyID1cbiAgcGVyZm9ybWFuY2VPYnNlcnZlclxuXG5sZXQgb2JzZXJ2ZSB+ZW50cnlfdHlwZXMgfmYgPVxuICBsZXQgZW50cnlfdHlwZXMgPSBlbnRyeV90eXBlcyB8PiBMaXN0Lm1hcCBKcy5zdHJpbmcgfD4gQXJyYXkub2ZfbGlzdCB8PiBKcy5hcnJheSBpblxuICBsZXQgcGVyZm9ybWFuY2Vfb2JzZXJ2ZXJfaW5pdCA6IHBlcmZvcm1hbmNlT2JzZXJ2ZXJJbml0IEpzLnQgPSBKcy5VbnNhZmUub2JqIFt8fF0gaW5cbiAgbGV0ICgpID0gcGVyZm9ybWFuY2Vfb2JzZXJ2ZXJfaW5pdCMjLmVudHJ5VHlwZXMgOj0gZW50cnlfdHlwZXMgaW5cbiAgbGV0IG9icyA9IG5ldyVqcyBwZXJmb3JtYW5jZU9ic2VydmVyIChKcy53cmFwX2NhbGxiYWNrIGYpIGluXG4gIGxldCAoKSA9IG9icyMjb2JzZXJ2ZSBwZXJmb3JtYW5jZV9vYnNlcnZlcl9pbml0IGluXG4gIG9ic1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNSBTdMOpcGhhbmUgTGVncmFuZFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxub3BlbiEgSW1wb3J0XG5cbmNsYXNzIHR5cGUgbXV0YXRpb25PYnNlcnZlckluaXQgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY2hpbGRMaXN0IDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZXMgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgY2hhcmFjdGVyRGF0YSA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdWJ0cmVlIDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGF0dHJpYnV0ZU9sZFZhbHVlIDogYm9vbCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNoYXJhY3RlckRhdGFPbGRWYWx1ZSA6IGJvb2wgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVGaWx0ZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLndyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIG11dGF0aW9uUmVjb3JkID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIF90eXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHRhcmdldCA6IERvbS5ub2RlIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFkZGVkTm9kZXMgOiBEb20ubm9kZSBEb20ubm9kZUxpc3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVtb3ZlZE5vZGVzIDogRG9tLm5vZGUgRG9tLm5vZGVMaXN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZXZpb3VzU2libGluZyA6IERvbS5ub2RlIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBuZXh0U2libGluZyA6IERvbS5ub2RlIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVOYW1lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhdHRyaWJ1dGVOYW1lc3BhY2UgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG9sZFZhbHVlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgbXV0YXRpb25PYnNlcnZlciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBvYnNlcnZlIDogI0RvbS5ub2RlIEpzLnQgLT4gbXV0YXRpb25PYnNlcnZlckluaXQgSnMudCAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBkaXNjb25uZWN0IDogdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2QgdGFrZVJlY29yZHMgOiBtdXRhdGlvblJlY29yZCBKcy50IEpzLmpzX2FycmF5IEpzLnQgSnMubWV0aFxuICBlbmRcblxubGV0IGVtcHR5X211dGF0aW9uX29ic2VydmVyX2luaXQgKCkgOiBtdXRhdGlvbk9ic2VydmVySW5pdCBKcy50ID0gSnMuVW5zYWZlLm9iaiBbfHxdXG5cbmxldCBtdXRhdGlvbk9ic2VydmVyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9NdXRhdGlvbk9ic2VydmVyXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCBtdXRhdGlvbk9ic2VydmVyXG5cbmxldCBtdXRhdGlvbk9ic2VydmVyIDpcbiAgICAoICAgKG11dGF0aW9uUmVjb3JkIEpzLnQgSnMuanNfYXJyYXkgSnMudCAtPiBtdXRhdGlvbk9ic2VydmVyIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgLT4gbXV0YXRpb25PYnNlcnZlciBKcy50KVxuICAgIEpzLmNvbnN0ciA9XG4gIG11dGF0aW9uT2JzZXJ2ZXJcblxubGV0IG9ic2VydmVcbiAgICB+KG5vZGUgOiAjRG9tLm5vZGUgSnMudClcbiAgICB+KGYgOiBtdXRhdGlvblJlY29yZCBKcy50IEpzLmpzX2FycmF5IEpzLnQgLT4gbXV0YXRpb25PYnNlcnZlciBKcy50IC0+IHVuaXQpXG4gICAgPyhjaGlsZF9saXN0IDogYm9vbCBvcHRpb24pXG4gICAgPyhhdHRyaWJ1dGVzIDogYm9vbCBvcHRpb24pXG4gICAgPyhjaGFyYWN0ZXJfZGF0YSA6IGJvb2wgb3B0aW9uKVxuICAgID8oc3VidHJlZSA6IGJvb2wgb3B0aW9uKVxuICAgID8oYXR0cmlidXRlX29sZF92YWx1ZSA6IGJvb2wgb3B0aW9uKVxuICAgID8oY2hhcmFjdGVyX2RhdGFfb2xkX3ZhbHVlIDogYm9vbCBvcHRpb24pXG4gICAgPyhhdHRyaWJ1dGVfZmlsdGVyIDogSnMuanNfc3RyaW5nIEpzLnQgbGlzdCBvcHRpb24pXG4gICAgKCkgOiBtdXRhdGlvbk9ic2VydmVyIEpzLnQgPVxuICBsZXQgb3B0X2l0ZXIgeCBmID1cbiAgICBtYXRjaCB4IHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgeCAtPiBmIHhcbiAgaW5cbiAgbGV0IG9icyA9IG5ldyVqcyBtdXRhdGlvbk9ic2VydmVyIChKcy53cmFwX2NhbGxiYWNrIGYpIGluXG4gIGxldCBjZmcgPSBlbXB0eV9tdXRhdGlvbl9vYnNlcnZlcl9pbml0ICgpIGluXG4gIGxldCAoKSA9IG9wdF9pdGVyIGNoaWxkX2xpc3QgKGZ1biB2IC0+IGNmZyMjLmNoaWxkTGlzdCA6PSB2KSBpblxuICBsZXQgKCkgPSBvcHRfaXRlciBhdHRyaWJ1dGVzIChmdW4gdiAtPiBjZmcjIy5hdHRyaWJ1dGVzIDo9IHYpIGluXG4gIGxldCAoKSA9IG9wdF9pdGVyIGNoYXJhY3Rlcl9kYXRhIChmdW4gdiAtPiBjZmcjIy5jaGFyYWN0ZXJEYXRhIDo9IHYpIGluXG4gIGxldCAoKSA9IG9wdF9pdGVyIHN1YnRyZWUgKGZ1biB2IC0+IGNmZyMjLnN1YnRyZWUgOj0gdikgaW5cbiAgbGV0ICgpID0gb3B0X2l0ZXIgYXR0cmlidXRlX29sZF92YWx1ZSAoZnVuIHYgLT4gY2ZnIyMuYXR0cmlidXRlT2xkVmFsdWUgOj0gdikgaW5cbiAgbGV0ICgpID1cbiAgICBvcHRfaXRlciBjaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWUgKGZ1biB2IC0+IGNmZyMjLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSA6PSB2KVxuICBpblxuICBsZXQgKCkgPVxuICAgIG9wdF9pdGVyIGF0dHJpYnV0ZV9maWx0ZXIgKGZ1biBsIC0+XG4gICAgICAgIGNmZyMjLmF0dHJpYnV0ZUZpbHRlciA6PSBKcy5hcnJheSAoQXJyYXkub2ZfbGlzdCBsKSlcbiAgaW5cbiAgbGV0ICgpID0gb2JzIyNvYnNlcnZlIG5vZGUgY2ZnIGluXG4gIG9ic1xuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCBQaWVycmUgQ2hhbWJhcnQgMjAxMi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG50eXBlICdhIHQgPSA8ID4gSnMudFxuXG5sZXQgb2JqID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9PYmplY3RcblxubGV0IGNyZWF0ZSAoKSA6ICdhIHQgPSBuZXclanMgb2JqXG5cbmxldCBhZGQgKHQgOiAnYSB0KSAoayA6IEpzLmpzX3N0cmluZyBKcy50KSAodiA6ICdhKSA9XG4gICgqICdfJyBpcyBhZGRlZCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvYmplY3RzIG1ldGhvZHMgKilcbiAgSnMuVW5zYWZlLnNldCB0IChrIyNjb25jYXQgKEpzLnN0cmluZyBcIl9cIikpIHZcblxubGV0IHJlbW92ZSAodCA6ICdhIHQpIChrIDogSnMuanNfc3RyaW5nIEpzLnQpID1cbiAgSnMuVW5zYWZlLmRlbGV0ZSB0IChrIyNjb25jYXQgKEpzLnN0cmluZyBcIl9cIikpXG5cbmxldCBmaW5kICh0IDogJ2EgdCkgKGsgOiBKcy5qc19zdHJpbmcgSnMudCkgOiAnYSBKcy5PcHRkZWYudCA9XG4gIEpzLlVuc2FmZS5nZXQgdCAoayMjY29uY2F0IChKcy5zdHJpbmcgXCJfXCIpKVxuXG5sZXQga2V5cyAodCA6ICdhIHQpIDogSnMuanNfc3RyaW5nIEpzLnQgbGlzdCA9XG4gIGxldCBrZXlfYXJyYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50ID1cbiAgICBKcy5VbnNhZmUuZ2xvYmFsIyMuX09iamVjdCMja2V5cyB0XG4gIGluXG4gIGxldCByZXMgPSByZWYgW10gaW5cbiAgZm9yIGkgPSAwIHRvIHByZWQga2V5X2FycmF5IyMubGVuZ3RoIGRvXG4gICAgbGV0IGtleSA9XG4gICAgICBKcy5PcHRkZWYuZ2V0IChKcy5hcnJheV9nZXQga2V5X2FycmF5IGkpIChmdW4gKCkgLT4gZmFpbHdpdGggXCJKc3RhYmxlLmtleXNcIilcbiAgICBpblxuICAgIHJlcyA6PSBrZXkjI3N1YnN0cmluZyAwIChwcmVkIGtleSMjLmxlbmd0aCkgOjogIXJlc1xuICBkb25lO1xuICBMaXN0LnJldiAhcmVzXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IEdyw6lnb2lyZSBIZW5yeSAyMDEwLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBqc29uID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBhcnNlIDogJ2EuIGpzX3N0cmluZyB0IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBwYXJzZV8gOlxuICAgICAgJ2EgJ2IgJ2MgJ2QuIGpzX3N0cmluZyB0IC0+ICgnYiB0LCBqc19zdHJpbmcgdCAtPiAnYyAtPiAnZCkgbWV0aF9jYWxsYmFjayAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2Qgc3RyaW5naWZ5IDogJ2EuICdhIC0+IGpzX3N0cmluZyB0IG1ldGhcblxuICAgIG1ldGhvZCBzdHJpbmdpZnlfIDpcbiAgICAgICdhICdiICdjICdkLiAnYSAtPiAoJ2IsIGpzX3N0cmluZyB0IC0+ICdjIC0+ICdkKSBtZXRoX2NhbGxiYWNrIC0+IGpzX3N0cmluZyB0IG1ldGhcbiAgZW5kXG5cbmxldCBqc29uIDoganNvbiBKcy50ID0gVW5zYWZlLmdsb2JhbCMjLl9KU09OXG5cbmxldCBpbnB1dF9yZXZpdmVyID1cbiAgbGV0IHJldml2ZXIgX3RoaXMgX2tleSAodmFsdWUgOiBVbnNhZmUuYW55KSA6IE9iai50ID1cbiAgICBpZiB0eXBlb2YgdmFsdWUgPT0gc3RyaW5nIFwic3RyaW5nXCJcbiAgICB0aGVuIE9iai5yZXByICh0b19ieXRlc3RyaW5nIChVbnNhZmUuY29lcmNlIHZhbHVlKSlcbiAgICBlbHNlIGlmIGluc3RhbmNlb2YgdmFsdWUgSnMuYXJyYXlfZW1wdHlcbiAgICAgICAgICAgICYmIChVbnNhZmUuY29lcmNlIHZhbHVlKSMjLmxlbmd0aCA9PSA0XG4gICAgICAgICAgICAmJiBVbnNhZmUuZ2V0IHZhbHVlIDAgPT0gMjU1XG4gICAgdGhlblxuICAgICAgT2JqLnJlcHJcbiAgICAgICAgKEpzb29fcnVudGltZS5JbnQ2NC5jcmVhdGVfaW50NjRfbG9fbWlfaGlcbiAgICAgICAgICAgKFVuc2FmZS5nZXQgdmFsdWUgMSlcbiAgICAgICAgICAgKFVuc2FmZS5nZXQgdmFsdWUgMilcbiAgICAgICAgICAgKFVuc2FmZS5nZXQgdmFsdWUgMykpXG4gICAgZWxzZSBPYmoucmVwciB2YWx1ZVxuICBpblxuICB3cmFwX21ldGhfY2FsbGJhY2sgcmV2aXZlclxuXG5sZXQgdW5zYWZlX2lucHV0IHMgPSBqc29uIyNwYXJzZV8gcyBpbnB1dF9yZXZpdmVyXG5cbmNsYXNzIHR5cGUgb2JqID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGNvbnN0cnVjdG9yIDogJ2EuICdhIGNvbnN0ciBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5sZXQgbWxJbnQ2NF9jb25zdHIgPVxuICBsZXQgZHVtbXlfaW50NjQgPSAxTCBpblxuICBsZXQgZHVtbXlfb2JqIDogb2JqIHQgPSBPYmoubWFnaWMgZHVtbXlfaW50NjQgaW5cbiAgZHVtbXlfb2JqIyMuY29uc3RydWN0b3JcblxubGV0IG91dHB1dF9yZXZpdmVyIF9rZXkgKHZhbHVlIDogVW5zYWZlLmFueSkgOiBPYmoudCA9XG4gIGlmIE9iai50YWcgKE9iai5yZXByIHZhbHVlKSA9IE9iai5zdHJpbmdfdGFnXG4gIHRoZW4gT2JqLnJlcHIgKGJ5dGVzdHJpbmcgKE9iai5tYWdpYyB2YWx1ZSA6IHN0cmluZykpXG4gIGVsc2UgaWYgaW5zdGFuY2VvZiB2YWx1ZSBtbEludDY0X2NvbnN0clxuICB0aGVuXG4gICAgbGV0IHZhbHVlID0gVW5zYWZlLmNvZXJjZSB2YWx1ZSBpblxuICAgIE9iai5yZXByIChhcnJheSBbfCAyNTU7IHZhbHVlIyMubG87IHZhbHVlIyMubWk7IHZhbHVlIyMuaGkgfF0pXG4gIGVsc2UgT2JqLnJlcHIgdmFsdWVcblxubGV0IG91dHB1dCBvYmogPSBqc29uIyNzdHJpbmdpZnlfIG9iaiAoSnMud3JhcF9jYWxsYmFjayBvdXRwdXRfcmV2aXZlcilcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmFwaGHDq2wgUHJvdXN0XG4gKiBMYWJvcmF0b2lyZSBQUFMgLSBDTlJTIFVuaXZlcnNpdMOpIFBhcmlzIERpZGVyb3RcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcblxub3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBDb2xvciA9IHN0cnVjdFxuICAoKiBUaGUgdHlwZSBvZiBDU1MgY29sb3JzLiBGaXJzdCBieSBuYW1lIGFuZCB0aGVuIGJ5IGNvbnN0cnVjdG9yLiAqKVxuICB0eXBlIG5hbWUgPVxuICAgIHwgQWxpY2VibHVlXG4gICAgfCBBbnRpcXVld2hpdGVcbiAgICB8IEFxdWFcbiAgICB8IEFxdWFtYXJpbmVcbiAgICB8IEF6dXJlXG4gICAgfCBCZWlnZVxuICAgIHwgQmlzcXVlXG4gICAgfCBCbGFja1xuICAgIHwgQmxhbmNoZWRhbG1vbmRcbiAgICB8IEJsdWVcbiAgICB8IEJsdWV2aW9sZXRcbiAgICB8IEJyb3duXG4gICAgfCBCdXJseXdvb2RcbiAgICB8IENhZGV0Ymx1ZVxuICAgIHwgQ2hhcnRyZXVzZVxuICAgIHwgQ2hvY29sYXRlXG4gICAgfCBDb3JhbFxuICAgIHwgQ29ybmZsb3dlcmJsdWVcbiAgICB8IENvcm5zaWxrXG4gICAgfCBDcmltc29uXG4gICAgfCBDeWFuXG4gICAgfCBEYXJrYmx1ZVxuICAgIHwgRGFya2N5YW5cbiAgICB8IERhcmtnb2xkZW5yb2RcbiAgICB8IERhcmtncmF5XG4gICAgfCBEYXJrZ3JlZW5cbiAgICB8IERhcmtncmV5XG4gICAgfCBEYXJra2hha2lcbiAgICB8IERhcmttYWdlbnRhXG4gICAgfCBEYXJrb2xpdmVncmVlblxuICAgIHwgRGFya29yYW5nZVxuICAgIHwgRGFya29yY2hpZFxuICAgIHwgRGFya3JlZFxuICAgIHwgRGFya3NhbG1vblxuICAgIHwgRGFya3NlYWdyZWVuXG4gICAgfCBEYXJrc2xhdGVibHVlXG4gICAgfCBEYXJrc2xhdGVncmF5XG4gICAgfCBEYXJrc2xhdGVncmV5XG4gICAgfCBEYXJrdHVycXVvaXNlXG4gICAgfCBEYXJrdmlvbGV0XG4gICAgfCBEZWVwcGlua1xuICAgIHwgRGVlcHNreWJsdWVcbiAgICB8IERpbWdyYXlcbiAgICB8IERpbWdyZXlcbiAgICB8IERvZGdlcmJsdWVcbiAgICB8IEZpcmVicmlja1xuICAgIHwgRmxvcmFsd2hpdGVcbiAgICB8IEZvcmVzdGdyZWVuXG4gICAgfCBGdWNoc2lhXG4gICAgfCBHYWluc2Jvcm9cbiAgICB8IEdob3N0d2hpdGVcbiAgICB8IEdvbGRcbiAgICB8IEdvbGRlbnJvZFxuICAgIHwgR3JheVxuICAgIHwgR3JleVxuICAgIHwgR3JlZW5cbiAgICB8IEdyZWVueWVsbG93XG4gICAgfCBIb25leWRld1xuICAgIHwgSG90cGlua1xuICAgIHwgSW5kaWFucmVkXG4gICAgfCBJbmRpZ29cbiAgICB8IEl2b3J5XG4gICAgfCBLaGFraVxuICAgIHwgTGF2ZW5kZXJcbiAgICB8IExhdmVuZGVyYmx1c2hcbiAgICB8IExhd25ncmVlblxuICAgIHwgTGVtb25jaGlmZm9uXG4gICAgfCBMaWdodGJsdWVcbiAgICB8IExpZ2h0Y29yYWxcbiAgICB8IExpZ2h0Y3lhblxuICAgIHwgTGlnaHRnb2xkZW5yb2R5ZWxsb3dcbiAgICB8IExpZ2h0Z3JheVxuICAgIHwgTGlnaHRncmVlblxuICAgIHwgTGlnaHRncmV5XG4gICAgfCBMaWdodHBpbmtcbiAgICB8IExpZ2h0c2FsbW9uXG4gICAgfCBMaWdodHNlYWdyZWVuXG4gICAgfCBMaWdodHNreWJsdWVcbiAgICB8IExpZ2h0c2xhdGVncmF5XG4gICAgfCBMaWdodHNsYXRlZ3JleVxuICAgIHwgTGlnaHRzdGVlbGJsdWVcbiAgICB8IExpZ2h0eWVsbG93XG4gICAgfCBMaW1lXG4gICAgfCBMaW1lZ3JlZW5cbiAgICB8IExpbmVuXG4gICAgfCBNYWdlbnRhXG4gICAgfCBNYXJvb25cbiAgICB8IE1lZGl1bWFxdWFtYXJpbmVcbiAgICB8IE1lZGl1bWJsdWVcbiAgICB8IE1lZGl1bW9yY2hpZFxuICAgIHwgTWVkaXVtcHVycGxlXG4gICAgfCBNZWRpdW1zZWFncmVlblxuICAgIHwgTWVkaXVtc2xhdGVibHVlXG4gICAgfCBNZWRpdW1zcHJpbmdncmVlblxuICAgIHwgTWVkaXVtdHVycXVvaXNlXG4gICAgfCBNZWRpdW12aW9sZXRyZWRcbiAgICB8IE1pZG5pZ2h0Ymx1ZVxuICAgIHwgTWludGNyZWFtXG4gICAgfCBNaXN0eXJvc2VcbiAgICB8IE1vY2Nhc2luXG4gICAgfCBOYXZham93aGl0ZVxuICAgIHwgTmF2eVxuICAgIHwgT2xkbGFjZVxuICAgIHwgT2xpdmVcbiAgICB8IE9saXZlZHJhYlxuICAgIHwgT3JhbmdlXG4gICAgfCBPcmFuZ2VyZWRcbiAgICB8IE9yY2hpZFxuICAgIHwgUGFsZWdvbGRlbnJvZFxuICAgIHwgUGFsZWdyZWVuXG4gICAgfCBQYWxldHVycXVvaXNlXG4gICAgfCBQYWxldmlvbGV0cmVkXG4gICAgfCBQYXBheWF3aGlwXG4gICAgfCBQZWFjaHB1ZmZcbiAgICB8IFBlcnVcbiAgICB8IFBpbmtcbiAgICB8IFBsdW1cbiAgICB8IFBvd2RlcmJsdWVcbiAgICB8IFB1cnBsZVxuICAgIHwgUmVkXG4gICAgfCBSb3N5YnJvd25cbiAgICB8IFJveWFsYmx1ZVxuICAgIHwgU2FkZGxlYnJvd25cbiAgICB8IFNhbG1vblxuICAgIHwgU2FuZHlicm93blxuICAgIHwgU2VhZ3JlZW5cbiAgICB8IFNlYXNoZWxsXG4gICAgfCBTaWVubmFcbiAgICB8IFNpbHZlclxuICAgIHwgU2t5Ymx1ZVxuICAgIHwgU2xhdGVibHVlXG4gICAgfCBTbGF0ZWdyYXlcbiAgICB8IFNsYXRlZ3JleVxuICAgIHwgU25vd1xuICAgIHwgU3ByaW5nZ3JlZW5cbiAgICB8IFN0ZWVsYmx1ZVxuICAgIHwgVGFuXG4gICAgfCBUZWFsXG4gICAgfCBUaGlzdGxlXG4gICAgfCBUb21hdG9cbiAgICB8IFR1cnF1b2lzZVxuICAgIHwgVmlvbGV0XG4gICAgfCBXaGVhdFxuICAgIHwgV2hpdGVcbiAgICB8IFdoaXRlc21va2VcbiAgICB8IFllbGxvd1xuICAgIHwgWWVsbG93Z3JlZW5cblxuICBsZXQgc3RyaW5nX29mX25hbWUgPSBmdW5jdGlvblxuICAgIHwgQWxpY2VibHVlIC0+IFwiYWxpY2VibHVlXCJcbiAgICB8IEFudGlxdWV3aGl0ZSAtPiBcImFudGlxdWV3aGl0ZVwiXG4gICAgfCBBcXVhIC0+IFwiYXF1YVwiXG4gICAgfCBBcXVhbWFyaW5lIC0+IFwiYXF1YW1hcmluZVwiXG4gICAgfCBBenVyZSAtPiBcImF6dXJlXCJcbiAgICB8IEJlaWdlIC0+IFwiYmVpZ2VcIlxuICAgIHwgQmlzcXVlIC0+IFwiYmlzcXVlXCJcbiAgICB8IEJsYWNrIC0+IFwiYmxhY2tcIlxuICAgIHwgQmxhbmNoZWRhbG1vbmQgLT4gXCJibGFuY2hlZGFsbW9uZFwiXG4gICAgfCBCbHVlIC0+IFwiYmx1ZVwiXG4gICAgfCBCbHVldmlvbGV0IC0+IFwiYmx1ZXZpb2xldFwiXG4gICAgfCBCcm93biAtPiBcImJyb3duXCJcbiAgICB8IEJ1cmx5d29vZCAtPiBcImJ1cmx5d29vZFwiXG4gICAgfCBDYWRldGJsdWUgLT4gXCJjYWRldGJsdWVcIlxuICAgIHwgQ2hhcnRyZXVzZSAtPiBcImNoYXJ0cmV1c2VcIlxuICAgIHwgQ2hvY29sYXRlIC0+IFwiY2hvY29sYXRlXCJcbiAgICB8IENvcmFsIC0+IFwiY29yYWxcIlxuICAgIHwgQ29ybmZsb3dlcmJsdWUgLT4gXCJjb3JuZmxvd2VyYmx1ZVwiXG4gICAgfCBDb3Juc2lsayAtPiBcImNvcm5zaWxrXCJcbiAgICB8IENyaW1zb24gLT4gXCJjcmltc29uXCJcbiAgICB8IEN5YW4gLT4gXCJjeWFuXCJcbiAgICB8IERhcmtibHVlIC0+IFwiZGFya2JsdWVcIlxuICAgIHwgRGFya2N5YW4gLT4gXCJkYXJrY3lhblwiXG4gICAgfCBEYXJrZ29sZGVucm9kIC0+IFwiZGFya2dvbGRlbnJvZFwiXG4gICAgfCBEYXJrZ3JheSAtPiBcImRhcmtncmF5XCJcbiAgICB8IERhcmtncmVlbiAtPiBcImRhcmtncmVlblwiXG4gICAgfCBEYXJrZ3JleSAtPiBcImRhcmtncmV5XCJcbiAgICB8IERhcmtraGFraSAtPiBcImRhcmtraGFraVwiXG4gICAgfCBEYXJrbWFnZW50YSAtPiBcImRhcmttYWdlbnRhXCJcbiAgICB8IERhcmtvbGl2ZWdyZWVuIC0+IFwiZGFya29saXZlZ3JlZW5cIlxuICAgIHwgRGFya29yYW5nZSAtPiBcImRhcmtvcmFuZ2VcIlxuICAgIHwgRGFya29yY2hpZCAtPiBcImRhcmtvcmNoaWRcIlxuICAgIHwgRGFya3JlZCAtPiBcImRhcmtyZWRcIlxuICAgIHwgRGFya3NhbG1vbiAtPiBcImRhcmtzYWxtb25cIlxuICAgIHwgRGFya3NlYWdyZWVuIC0+IFwiZGFya3NlYWdyZWVuXCJcbiAgICB8IERhcmtzbGF0ZWJsdWUgLT4gXCJkYXJrc2xhdGVibHVlXCJcbiAgICB8IERhcmtzbGF0ZWdyYXkgLT4gXCJkYXJrc2xhdGVncmF5XCJcbiAgICB8IERhcmtzbGF0ZWdyZXkgLT4gXCJkYXJrc2xhdGVncmV5XCJcbiAgICB8IERhcmt0dXJxdW9pc2UgLT4gXCJkYXJrdHVycXVvaXNlXCJcbiAgICB8IERhcmt2aW9sZXQgLT4gXCJkYXJrdmlvbGV0XCJcbiAgICB8IERlZXBwaW5rIC0+IFwiZGVlcHBpbmtcIlxuICAgIHwgRGVlcHNreWJsdWUgLT4gXCJkZWVwc2t5Ymx1ZVwiXG4gICAgfCBEaW1ncmF5IC0+IFwiZGltZ3JheVwiXG4gICAgfCBEaW1ncmV5IC0+IFwiZGltZ3JleVwiXG4gICAgfCBEb2RnZXJibHVlIC0+IFwiZG9kZ2VyYmx1ZVwiXG4gICAgfCBGaXJlYnJpY2sgLT4gXCJmaXJlYnJpY2tcIlxuICAgIHwgRmxvcmFsd2hpdGUgLT4gXCJmbG9yYWx3aGl0ZVwiXG4gICAgfCBGb3Jlc3RncmVlbiAtPiBcImZvcmVzdGdyZWVuXCJcbiAgICB8IEZ1Y2hzaWEgLT4gXCJmdWNoc2lhXCJcbiAgICB8IEdhaW5zYm9ybyAtPiBcImdhaW5zYm9yb1wiXG4gICAgfCBHaG9zdHdoaXRlIC0+IFwiZ2hvc3R3aGl0ZVwiXG4gICAgfCBHb2xkIC0+IFwiZ29sZFwiXG4gICAgfCBHb2xkZW5yb2QgLT4gXCJnb2xkZW5yb2RcIlxuICAgIHwgR3JheSAtPiBcImdyYXlcIlxuICAgIHwgR3JlZW4gLT4gXCJncmVlblwiXG4gICAgfCBHcmVlbnllbGxvdyAtPiBcImdyZWVueWVsbG93XCJcbiAgICB8IEdyZXkgLT4gXCJncmV5XCJcbiAgICB8IEhvbmV5ZGV3IC0+IFwiaG9uZXlkZXdcIlxuICAgIHwgSG90cGluayAtPiBcImhvdHBpbmtcIlxuICAgIHwgSW5kaWFucmVkIC0+IFwiaW5kaWFucmVkXCJcbiAgICB8IEluZGlnbyAtPiBcImluZGlnb1wiXG4gICAgfCBJdm9yeSAtPiBcIml2b3J5XCJcbiAgICB8IEtoYWtpIC0+IFwia2hha2lcIlxuICAgIHwgTGF2ZW5kZXIgLT4gXCJsYXZlbmRlclwiXG4gICAgfCBMYXZlbmRlcmJsdXNoIC0+IFwibGF2ZW5kZXJibHVzaFwiXG4gICAgfCBMYXduZ3JlZW4gLT4gXCJsYXduZ3JlZW5cIlxuICAgIHwgTGVtb25jaGlmZm9uIC0+IFwibGVtb25jaGlmZm9uXCJcbiAgICB8IExpZ2h0Ymx1ZSAtPiBcImxpZ2h0Ymx1ZVwiXG4gICAgfCBMaWdodGNvcmFsIC0+IFwibGlnaHRjb3JhbFwiXG4gICAgfCBMaWdodGN5YW4gLT4gXCJsaWdodGN5YW5cIlxuICAgIHwgTGlnaHRnb2xkZW5yb2R5ZWxsb3cgLT4gXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiXG4gICAgfCBMaWdodGdyYXkgLT4gXCJsaWdodGdyYXlcIlxuICAgIHwgTGlnaHRncmVlbiAtPiBcImxpZ2h0Z3JlZW5cIlxuICAgIHwgTGlnaHRncmV5IC0+IFwibGlnaHRncmV5XCJcbiAgICB8IExpZ2h0cGluayAtPiBcImxpZ2h0cGlua1wiXG4gICAgfCBMaWdodHNhbG1vbiAtPiBcImxpZ2h0c2FsbW9uXCJcbiAgICB8IExpZ2h0c2VhZ3JlZW4gLT4gXCJsaWdodHNlYWdyZWVuXCJcbiAgICB8IExpZ2h0c2t5Ymx1ZSAtPiBcImxpZ2h0c2t5Ymx1ZVwiXG4gICAgfCBMaWdodHNsYXRlZ3JheSAtPiBcImxpZ2h0c2xhdGVncmF5XCJcbiAgICB8IExpZ2h0c2xhdGVncmV5IC0+IFwibGlnaHRzbGF0ZWdyZXlcIlxuICAgIHwgTGlnaHRzdGVlbGJsdWUgLT4gXCJsaWdodHN0ZWVsYmx1ZVwiXG4gICAgfCBMaWdodHllbGxvdyAtPiBcImxpZ2h0eWVsbG93XCJcbiAgICB8IExpbWUgLT4gXCJsaW1lXCJcbiAgICB8IExpbWVncmVlbiAtPiBcImxpbWVncmVlblwiXG4gICAgfCBMaW5lbiAtPiBcImxpbmVuXCJcbiAgICB8IE1hZ2VudGEgLT4gXCJtYWdlbnRhXCJcbiAgICB8IE1hcm9vbiAtPiBcIm1hcm9vblwiXG4gICAgfCBNZWRpdW1hcXVhbWFyaW5lIC0+IFwibWVkaXVtYXF1YW1hcmluZVwiXG4gICAgfCBNZWRpdW1ibHVlIC0+IFwibWVkaXVtYmx1ZVwiXG4gICAgfCBNZWRpdW1vcmNoaWQgLT4gXCJtZWRpdW1vcmNoaWRcIlxuICAgIHwgTWVkaXVtcHVycGxlIC0+IFwibWVkaXVtcHVycGxlXCJcbiAgICB8IE1lZGl1bXNlYWdyZWVuIC0+IFwibWVkaXVtc2VhZ3JlZW5cIlxuICAgIHwgTWVkaXVtc2xhdGVibHVlIC0+IFwibWVkaXVtc2xhdGVibHVlXCJcbiAgICB8IE1lZGl1bXNwcmluZ2dyZWVuIC0+IFwibWVkaXVtc3ByaW5nZ3JlZW5cIlxuICAgIHwgTWVkaXVtdHVycXVvaXNlIC0+IFwibWVkaXVtdHVycXVvaXNlXCJcbiAgICB8IE1lZGl1bXZpb2xldHJlZCAtPiBcIm1lZGl1bXZpb2xldHJlZFwiXG4gICAgfCBNaWRuaWdodGJsdWUgLT4gXCJtaWRuaWdodGJsdWVcIlxuICAgIHwgTWludGNyZWFtIC0+IFwibWludGNyZWFtXCJcbiAgICB8IE1pc3R5cm9zZSAtPiBcIm1pc3R5cm9zZVwiXG4gICAgfCBNb2NjYXNpbiAtPiBcIm1vY2Nhc2luXCJcbiAgICB8IE5hdmFqb3doaXRlIC0+IFwibmF2YWpvd2hpdGVcIlxuICAgIHwgTmF2eSAtPiBcIm5hdnlcIlxuICAgIHwgT2xkbGFjZSAtPiBcIm9sZGxhY2VcIlxuICAgIHwgT2xpdmUgLT4gXCJvbGl2ZVwiXG4gICAgfCBPbGl2ZWRyYWIgLT4gXCJvbGl2ZWRyYWJcIlxuICAgIHwgT3JhbmdlIC0+IFwib3JhbmdlXCJcbiAgICB8IE9yYW5nZXJlZCAtPiBcIm9yYW5nZXJlZFwiXG4gICAgfCBPcmNoaWQgLT4gXCJvcmNoaWRcIlxuICAgIHwgUGFsZWdvbGRlbnJvZCAtPiBcInBhbGVnb2xkZW5yb2RcIlxuICAgIHwgUGFsZWdyZWVuIC0+IFwicGFsZWdyZWVuXCJcbiAgICB8IFBhbGV0dXJxdW9pc2UgLT4gXCJwYWxldHVycXVvaXNlXCJcbiAgICB8IFBhbGV2aW9sZXRyZWQgLT4gXCJwYWxldmlvbGV0cmVkXCJcbiAgICB8IFBhcGF5YXdoaXAgLT4gXCJwYXBheWF3aGlwXCJcbiAgICB8IFBlYWNocHVmZiAtPiBcInBlYWNocHVmZlwiXG4gICAgfCBQZXJ1IC0+IFwicGVydVwiXG4gICAgfCBQaW5rIC0+IFwicGlua1wiXG4gICAgfCBQbHVtIC0+IFwicGx1bVwiXG4gICAgfCBQb3dkZXJibHVlIC0+IFwicG93ZGVyYmx1ZVwiXG4gICAgfCBQdXJwbGUgLT4gXCJwdXJwbGVcIlxuICAgIHwgUmVkIC0+IFwicmVkXCJcbiAgICB8IFJvc3licm93biAtPiBcInJvc3licm93blwiXG4gICAgfCBSb3lhbGJsdWUgLT4gXCJyb3lhbGJsdWVcIlxuICAgIHwgU2FkZGxlYnJvd24gLT4gXCJzYWRkbGVicm93blwiXG4gICAgfCBTYWxtb24gLT4gXCJzYWxtb25cIlxuICAgIHwgU2FuZHlicm93biAtPiBcInNhbmR5YnJvd25cIlxuICAgIHwgU2VhZ3JlZW4gLT4gXCJzZWFncmVlblwiXG4gICAgfCBTZWFzaGVsbCAtPiBcInNlYXNoZWxsXCJcbiAgICB8IFNpZW5uYSAtPiBcInNpZW5uYVwiXG4gICAgfCBTaWx2ZXIgLT4gXCJzaWx2ZXJcIlxuICAgIHwgU2t5Ymx1ZSAtPiBcInNreWJsdWVcIlxuICAgIHwgU2xhdGVibHVlIC0+IFwic2xhdGVibHVlXCJcbiAgICB8IFNsYXRlZ3JheSAtPiBcInNsYXRlZ3JheVwiXG4gICAgfCBTbGF0ZWdyZXkgLT4gXCJzbGF0ZWdyZXlcIlxuICAgIHwgU25vdyAtPiBcInNub3dcIlxuICAgIHwgU3ByaW5nZ3JlZW4gLT4gXCJzcHJpbmdncmVlblwiXG4gICAgfCBTdGVlbGJsdWUgLT4gXCJzdGVlbGJsdWVcIlxuICAgIHwgVGFuIC0+IFwidGFuXCJcbiAgICB8IFRlYWwgLT4gXCJ0ZWFsXCJcbiAgICB8IFRoaXN0bGUgLT4gXCJ0aGlzdGxlXCJcbiAgICB8IFRvbWF0byAtPiBcInRvbWF0b1wiXG4gICAgfCBUdXJxdW9pc2UgLT4gXCJ0dXJxdW9pc2VcIlxuICAgIHwgVmlvbGV0IC0+IFwidmlvbGV0XCJcbiAgICB8IFdoZWF0IC0+IFwid2hlYXRcIlxuICAgIHwgV2hpdGUgLT4gXCJ3aGl0ZVwiXG4gICAgfCBXaGl0ZXNtb2tlIC0+IFwid2hpdGVzbW9rZVwiXG4gICAgfCBZZWxsb3cgLT4gXCJ5ZWxsb3dcIlxuICAgIHwgWWVsbG93Z3JlZW4gLT4gXCJ5ZWxsb3dncmVlblwiXG5cbiAgbGV0IG5hbWVfb2Zfc3RyaW5nID0gZnVuY3Rpb25cbiAgICB8IFwiYWxpY2VibHVlXCIgLT4gQWxpY2VibHVlXG4gICAgfCBcImFudGlxdWV3aGl0ZVwiIC0+IEFudGlxdWV3aGl0ZVxuICAgIHwgXCJhcXVhXCIgLT4gQXF1YVxuICAgIHwgXCJhcXVhbWFyaW5lXCIgLT4gQXF1YW1hcmluZVxuICAgIHwgXCJhenVyZVwiIC0+IEF6dXJlXG4gICAgfCBcImJlaWdlXCIgLT4gQmVpZ2VcbiAgICB8IFwiYmlzcXVlXCIgLT4gQmlzcXVlXG4gICAgfCBcImJsYWNrXCIgLT4gQmxhY2tcbiAgICB8IFwiYmxhbmNoZWRhbG1vbmRcIiAtPiBCbGFuY2hlZGFsbW9uZFxuICAgIHwgXCJibHVlXCIgLT4gQmx1ZVxuICAgIHwgXCJibHVldmlvbGV0XCIgLT4gQmx1ZXZpb2xldFxuICAgIHwgXCJicm93blwiIC0+IEJyb3duXG4gICAgfCBcImJ1cmx5d29vZFwiIC0+IEJ1cmx5d29vZFxuICAgIHwgXCJjYWRldGJsdWVcIiAtPiBDYWRldGJsdWVcbiAgICB8IFwiY2hhcnRyZXVzZVwiIC0+IENoYXJ0cmV1c2VcbiAgICB8IFwiY2hvY29sYXRlXCIgLT4gQ2hvY29sYXRlXG4gICAgfCBcImNvcmFsXCIgLT4gQ29yYWxcbiAgICB8IFwiY29ybmZsb3dlcmJsdWVcIiAtPiBDb3JuZmxvd2VyYmx1ZVxuICAgIHwgXCJjb3Juc2lsa1wiIC0+IENvcm5zaWxrXG4gICAgfCBcImNyaW1zb25cIiAtPiBDcmltc29uXG4gICAgfCBcImN5YW5cIiAtPiBDeWFuXG4gICAgfCBcImRhcmtibHVlXCIgLT4gRGFya2JsdWVcbiAgICB8IFwiZGFya2N5YW5cIiAtPiBEYXJrY3lhblxuICAgIHwgXCJkYXJrZ29sZGVucm9kXCIgLT4gRGFya2dvbGRlbnJvZFxuICAgIHwgXCJkYXJrZ3JheVwiIC0+IERhcmtncmF5XG4gICAgfCBcImRhcmtncmVlblwiIC0+IERhcmtncmVlblxuICAgIHwgXCJkYXJrZ3JleVwiIC0+IERhcmtncmV5XG4gICAgfCBcImRhcmtraGFraVwiIC0+IERhcmtraGFraVxuICAgIHwgXCJkYXJrbWFnZW50YVwiIC0+IERhcmttYWdlbnRhXG4gICAgfCBcImRhcmtvbGl2ZWdyZWVuXCIgLT4gRGFya29saXZlZ3JlZW5cbiAgICB8IFwiZGFya29yYW5nZVwiIC0+IERhcmtvcmFuZ2VcbiAgICB8IFwiZGFya29yY2hpZFwiIC0+IERhcmtvcmNoaWRcbiAgICB8IFwiZGFya3JlZFwiIC0+IERhcmtyZWRcbiAgICB8IFwiZGFya3NhbG1vblwiIC0+IERhcmtzYWxtb25cbiAgICB8IFwiZGFya3NlYWdyZWVuXCIgLT4gRGFya3NlYWdyZWVuXG4gICAgfCBcImRhcmtzbGF0ZWJsdWVcIiAtPiBEYXJrc2xhdGVibHVlXG4gICAgfCBcImRhcmtzbGF0ZWdyYXlcIiAtPiBEYXJrc2xhdGVncmF5XG4gICAgfCBcImRhcmtzbGF0ZWdyZXlcIiAtPiBEYXJrc2xhdGVncmV5XG4gICAgfCBcImRhcmt0dXJxdW9pc2VcIiAtPiBEYXJrdHVycXVvaXNlXG4gICAgfCBcImRhcmt2aW9sZXRcIiAtPiBEYXJrdmlvbGV0XG4gICAgfCBcImRlZXBwaW5rXCIgLT4gRGVlcHBpbmtcbiAgICB8IFwiZGVlcHNreWJsdWVcIiAtPiBEZWVwc2t5Ymx1ZVxuICAgIHwgXCJkaW1ncmF5XCIgLT4gRGltZ3JheVxuICAgIHwgXCJkaW1ncmV5XCIgLT4gRGltZ3JleVxuICAgIHwgXCJkb2RnZXJibHVlXCIgLT4gRG9kZ2VyYmx1ZVxuICAgIHwgXCJmaXJlYnJpY2tcIiAtPiBGaXJlYnJpY2tcbiAgICB8IFwiZmxvcmFsd2hpdGVcIiAtPiBGbG9yYWx3aGl0ZVxuICAgIHwgXCJmb3Jlc3RncmVlblwiIC0+IEZvcmVzdGdyZWVuXG4gICAgfCBcImZ1Y2hzaWFcIiAtPiBGdWNoc2lhXG4gICAgfCBcImdhaW5zYm9yb1wiIC0+IEdhaW5zYm9yb1xuICAgIHwgXCJnaG9zdHdoaXRlXCIgLT4gR2hvc3R3aGl0ZVxuICAgIHwgXCJnb2xkXCIgLT4gR29sZFxuICAgIHwgXCJnb2xkZW5yb2RcIiAtPiBHb2xkZW5yb2RcbiAgICB8IFwiZ3JheVwiIC0+IEdyYXlcbiAgICB8IFwiZ3JlZW5cIiAtPiBHcmVlblxuICAgIHwgXCJncmVlbnllbGxvd1wiIC0+IEdyZWVueWVsbG93XG4gICAgfCBcImdyZXlcIiAtPiBHcmV5XG4gICAgfCBcImhvbmV5ZGV3XCIgLT4gSG9uZXlkZXdcbiAgICB8IFwiaG90cGlua1wiIC0+IEhvdHBpbmtcbiAgICB8IFwiaW5kaWFucmVkXCIgLT4gSW5kaWFucmVkXG4gICAgfCBcImluZGlnb1wiIC0+IEluZGlnb1xuICAgIHwgXCJpdm9yeVwiIC0+IEl2b3J5XG4gICAgfCBcImtoYWtpXCIgLT4gS2hha2lcbiAgICB8IFwibGF2ZW5kZXJcIiAtPiBMYXZlbmRlclxuICAgIHwgXCJsYXZlbmRlcmJsdXNoXCIgLT4gTGF2ZW5kZXJibHVzaFxuICAgIHwgXCJsYXduZ3JlZW5cIiAtPiBMYXduZ3JlZW5cbiAgICB8IFwibGVtb25jaGlmZm9uXCIgLT4gTGVtb25jaGlmZm9uXG4gICAgfCBcImxpZ2h0Ymx1ZVwiIC0+IExpZ2h0Ymx1ZVxuICAgIHwgXCJsaWdodGNvcmFsXCIgLT4gTGlnaHRjb3JhbFxuICAgIHwgXCJsaWdodGN5YW5cIiAtPiBMaWdodGN5YW5cbiAgICB8IFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIiAtPiBMaWdodGdvbGRlbnJvZHllbGxvd1xuICAgIHwgXCJsaWdodGdyYXlcIiAtPiBMaWdodGdyYXlcbiAgICB8IFwibGlnaHRncmVlblwiIC0+IExpZ2h0Z3JlZW5cbiAgICB8IFwibGlnaHRncmV5XCIgLT4gTGlnaHRncmV5XG4gICAgfCBcImxpZ2h0cGlua1wiIC0+IExpZ2h0cGlua1xuICAgIHwgXCJsaWdodHNhbG1vblwiIC0+IExpZ2h0c2FsbW9uXG4gICAgfCBcImxpZ2h0c2VhZ3JlZW5cIiAtPiBMaWdodHNlYWdyZWVuXG4gICAgfCBcImxpZ2h0c2t5Ymx1ZVwiIC0+IExpZ2h0c2t5Ymx1ZVxuICAgIHwgXCJsaWdodHNsYXRlZ3JheVwiIC0+IExpZ2h0c2xhdGVncmF5XG4gICAgfCBcImxpZ2h0c2xhdGVncmV5XCIgLT4gTGlnaHRzbGF0ZWdyZXlcbiAgICB8IFwibGlnaHRzdGVlbGJsdWVcIiAtPiBMaWdodHN0ZWVsYmx1ZVxuICAgIHwgXCJsaWdodHllbGxvd1wiIC0+IExpZ2h0eWVsbG93XG4gICAgfCBcImxpbWVcIiAtPiBMaW1lXG4gICAgfCBcImxpbWVncmVlblwiIC0+IExpbWVncmVlblxuICAgIHwgXCJsaW5lblwiIC0+IExpbmVuXG4gICAgfCBcIm1hZ2VudGFcIiAtPiBNYWdlbnRhXG4gICAgfCBcIm1hcm9vblwiIC0+IE1hcm9vblxuICAgIHwgXCJtZWRpdW1hcXVhbWFyaW5lXCIgLT4gTWVkaXVtYXF1YW1hcmluZVxuICAgIHwgXCJtZWRpdW1ibHVlXCIgLT4gTWVkaXVtYmx1ZVxuICAgIHwgXCJtZWRpdW1vcmNoaWRcIiAtPiBNZWRpdW1vcmNoaWRcbiAgICB8IFwibWVkaXVtcHVycGxlXCIgLT4gTWVkaXVtcHVycGxlXG4gICAgfCBcIm1lZGl1bXNlYWdyZWVuXCIgLT4gTWVkaXVtc2VhZ3JlZW5cbiAgICB8IFwibWVkaXVtc2xhdGVibHVlXCIgLT4gTWVkaXVtc2xhdGVibHVlXG4gICAgfCBcIm1lZGl1bXNwcmluZ2dyZWVuXCIgLT4gTWVkaXVtc3ByaW5nZ3JlZW5cbiAgICB8IFwibWVkaXVtdHVycXVvaXNlXCIgLT4gTWVkaXVtdHVycXVvaXNlXG4gICAgfCBcIm1lZGl1bXZpb2xldHJlZFwiIC0+IE1lZGl1bXZpb2xldHJlZFxuICAgIHwgXCJtaWRuaWdodGJsdWVcIiAtPiBNaWRuaWdodGJsdWVcbiAgICB8IFwibWludGNyZWFtXCIgLT4gTWludGNyZWFtXG4gICAgfCBcIm1pc3R5cm9zZVwiIC0+IE1pc3R5cm9zZVxuICAgIHwgXCJtb2NjYXNpblwiIC0+IE1vY2Nhc2luXG4gICAgfCBcIm5hdmFqb3doaXRlXCIgLT4gTmF2YWpvd2hpdGVcbiAgICB8IFwibmF2eVwiIC0+IE5hdnlcbiAgICB8IFwib2xkbGFjZVwiIC0+IE9sZGxhY2VcbiAgICB8IFwib2xpdmVcIiAtPiBPbGl2ZVxuICAgIHwgXCJvbGl2ZWRyYWJcIiAtPiBPbGl2ZWRyYWJcbiAgICB8IFwib3JhbmdlXCIgLT4gT3JhbmdlXG4gICAgfCBcIm9yYW5nZXJlZFwiIC0+IE9yYW5nZXJlZFxuICAgIHwgXCJvcmNoaWRcIiAtPiBPcmNoaWRcbiAgICB8IFwicGFsZWdvbGRlbnJvZFwiIC0+IFBhbGVnb2xkZW5yb2RcbiAgICB8IFwicGFsZWdyZWVuXCIgLT4gUGFsZWdyZWVuXG4gICAgfCBcInBhbGV0dXJxdW9pc2VcIiAtPiBQYWxldHVycXVvaXNlXG4gICAgfCBcInBhbGV2aW9sZXRyZWRcIiAtPiBQYWxldmlvbGV0cmVkXG4gICAgfCBcInBhcGF5YXdoaXBcIiAtPiBQYXBheWF3aGlwXG4gICAgfCBcInBlYWNocHVmZlwiIC0+IFBlYWNocHVmZlxuICAgIHwgXCJwZXJ1XCIgLT4gUGVydVxuICAgIHwgXCJwaW5rXCIgLT4gUGlua1xuICAgIHwgXCJwbHVtXCIgLT4gUGx1bVxuICAgIHwgXCJwb3dkZXJibHVlXCIgLT4gUG93ZGVyYmx1ZVxuICAgIHwgXCJwdXJwbGVcIiAtPiBQdXJwbGVcbiAgICB8IFwicmVkXCIgLT4gUmVkXG4gICAgfCBcInJvc3licm93blwiIC0+IFJvc3licm93blxuICAgIHwgXCJyb3lhbGJsdWVcIiAtPiBSb3lhbGJsdWVcbiAgICB8IFwic2FkZGxlYnJvd25cIiAtPiBTYWRkbGVicm93blxuICAgIHwgXCJzYWxtb25cIiAtPiBTYWxtb25cbiAgICB8IFwic2FuZHlicm93blwiIC0+IFNhbmR5YnJvd25cbiAgICB8IFwic2VhZ3JlZW5cIiAtPiBTZWFncmVlblxuICAgIHwgXCJzZWFzaGVsbFwiIC0+IFNlYXNoZWxsXG4gICAgfCBcInNpZW5uYVwiIC0+IFNpZW5uYVxuICAgIHwgXCJzaWx2ZXJcIiAtPiBTaWx2ZXJcbiAgICB8IFwic2t5Ymx1ZVwiIC0+IFNreWJsdWVcbiAgICB8IFwic2xhdGVibHVlXCIgLT4gU2xhdGVibHVlXG4gICAgfCBcInNsYXRlZ3JheVwiIC0+IFNsYXRlZ3JheVxuICAgIHwgXCJzbGF0ZWdyZXlcIiAtPiBTbGF0ZWdyZXlcbiAgICB8IFwic25vd1wiIC0+IFNub3dcbiAgICB8IFwic3ByaW5nZ3JlZW5cIiAtPiBTcHJpbmdncmVlblxuICAgIHwgXCJzdGVlbGJsdWVcIiAtPiBTdGVlbGJsdWVcbiAgICB8IFwidGFuXCIgLT4gVGFuXG4gICAgfCBcInRlYWxcIiAtPiBUZWFsXG4gICAgfCBcInRoaXN0bGVcIiAtPiBUaGlzdGxlXG4gICAgfCBcInRvbWF0b1wiIC0+IFRvbWF0b1xuICAgIHwgXCJ0dXJxdW9pc2VcIiAtPiBUdXJxdW9pc2VcbiAgICB8IFwidmlvbGV0XCIgLT4gVmlvbGV0XG4gICAgfCBcIndoZWF0XCIgLT4gV2hlYXRcbiAgICB8IFwid2hpdGVcIiAtPiBXaGl0ZVxuICAgIHwgXCJ3aGl0ZXNtb2tlXCIgLT4gV2hpdGVzbW9rZVxuICAgIHwgXCJ5ZWxsb3dcIiAtPiBZZWxsb3dcbiAgICB8IFwieWVsbG93Z3JlZW5cIiAtPiBZZWxsb3dncmVlblxuICAgIHwgcyAtPiByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAocyBeIFwiIGlzIG5vdCBhIHZhbGlkIGNvbG9yIG5hbWVcIikpXG5cbiAgbGV0IHJnYl9vZl9uYW1lID0gZnVuY3Rpb25cbiAgICB8IEFsaWNlYmx1ZSAtPiAyNDAsIDI0OCwgMjU1XG4gICAgfCBBbnRpcXVld2hpdGUgLT4gMjUwLCAyMzUsIDIxNVxuICAgIHwgQXF1YSAtPiAwLCAyNTUsIDI1NVxuICAgIHwgQXF1YW1hcmluZSAtPiAxMjcsIDI1NSwgMjEyXG4gICAgfCBBenVyZSAtPiAyNDAsIDI1NSwgMjU1XG4gICAgfCBCZWlnZSAtPiAyNDUsIDI0NSwgMjIwXG4gICAgfCBCaXNxdWUgLT4gMjU1LCAyMjgsIDE5NlxuICAgIHwgQmxhY2sgLT4gMCwgMCwgMFxuICAgIHwgQmxhbmNoZWRhbG1vbmQgLT4gMjU1LCAyMzUsIDIwNVxuICAgIHwgQmx1ZSAtPiAwLCAwLCAyNTVcbiAgICB8IEJsdWV2aW9sZXQgLT4gMTM4LCA0MywgMjI2XG4gICAgfCBCcm93biAtPiAxNjUsIDQyLCA0MlxuICAgIHwgQnVybHl3b29kIC0+IDIyMiwgMTg0LCAxMzVcbiAgICB8IENhZGV0Ymx1ZSAtPiA5NSwgMTU4LCAxNjBcbiAgICB8IENoYXJ0cmV1c2UgLT4gMTI3LCAyNTUsIDBcbiAgICB8IENob2NvbGF0ZSAtPiAyMTAsIDEwNSwgMzBcbiAgICB8IENvcmFsIC0+IDI1NSwgMTI3LCA4MFxuICAgIHwgQ29ybmZsb3dlcmJsdWUgLT4gMTAwLCAxNDksIDIzN1xuICAgIHwgQ29ybnNpbGsgLT4gMjU1LCAyNDgsIDIyMFxuICAgIHwgQ3JpbXNvbiAtPiAyMjAsIDIwLCA2MFxuICAgIHwgQ3lhbiAtPiAwLCAyNTUsIDI1NVxuICAgIHwgRGFya2JsdWUgLT4gMCwgMCwgMTM5XG4gICAgfCBEYXJrY3lhbiAtPiAwLCAxMzksIDEzOVxuICAgIHwgRGFya2dvbGRlbnJvZCAtPiAxODQsIDEzNCwgMTFcbiAgICB8IERhcmtncmF5IC0+IDE2OSwgMTY5LCAxNjlcbiAgICB8IERhcmtncmVlbiAtPiAwLCAxMDAsIDBcbiAgICB8IERhcmtncmV5IC0+IDE2OSwgMTY5LCAxNjlcbiAgICB8IERhcmtraGFraSAtPiAxODksIDE4MywgMTA3XG4gICAgfCBEYXJrbWFnZW50YSAtPiAxMzksIDAsIDEzOVxuICAgIHwgRGFya29saXZlZ3JlZW4gLT4gODUsIDEwNywgNDdcbiAgICB8IERhcmtvcmFuZ2UgLT4gMjU1LCAxNDAsIDBcbiAgICB8IERhcmtvcmNoaWQgLT4gMTUzLCA1MCwgMjA0XG4gICAgfCBEYXJrcmVkIC0+IDEzOSwgMCwgMFxuICAgIHwgRGFya3NhbG1vbiAtPiAyMzMsIDE1MCwgMTIyXG4gICAgfCBEYXJrc2VhZ3JlZW4gLT4gMTQzLCAxODgsIDE0M1xuICAgIHwgRGFya3NsYXRlYmx1ZSAtPiA3MiwgNjEsIDEzOVxuICAgIHwgRGFya3NsYXRlZ3JheSAtPiA0NywgNzksIDc5XG4gICAgfCBEYXJrc2xhdGVncmV5IC0+IDQ3LCA3OSwgNzlcbiAgICB8IERhcmt0dXJxdW9pc2UgLT4gMCwgMjA2LCAyMDlcbiAgICB8IERhcmt2aW9sZXQgLT4gMTQ4LCAwLCAyMTFcbiAgICB8IERlZXBwaW5rIC0+IDI1NSwgMjAsIDE0N1xuICAgIHwgRGVlcHNreWJsdWUgLT4gMCwgMTkxLCAyNTVcbiAgICB8IERpbWdyYXkgLT4gMTA1LCAxMDUsIDEwNVxuICAgIHwgRGltZ3JleSAtPiAxMDUsIDEwNSwgMTA1XG4gICAgfCBEb2RnZXJibHVlIC0+IDMwLCAxNDQsIDI1NVxuICAgIHwgRmlyZWJyaWNrIC0+IDE3OCwgMzQsIDM0XG4gICAgfCBGbG9yYWx3aGl0ZSAtPiAyNTUsIDI1MCwgMjQwXG4gICAgfCBGb3Jlc3RncmVlbiAtPiAzNCwgMTM5LCAzNFxuICAgIHwgRnVjaHNpYSAtPiAyNTUsIDAsIDI1NVxuICAgIHwgR2FpbnNib3JvIC0+IDIyMCwgMjIwLCAyMjBcbiAgICB8IEdob3N0d2hpdGUgLT4gMjQ4LCAyNDgsIDI1NVxuICAgIHwgR29sZCAtPiAyNTUsIDIxNSwgMFxuICAgIHwgR29sZGVucm9kIC0+IDIxOCwgMTY1LCAzMlxuICAgIHwgR3JheSAtPiAxMjgsIDEyOCwgMTI4XG4gICAgfCBHcmVlbiAtPiAwLCAxMjgsIDBcbiAgICB8IEdyZWVueWVsbG93IC0+IDE3MywgMjU1LCA0N1xuICAgIHwgR3JleSAtPiAxMjgsIDEyOCwgMTI4XG4gICAgfCBIb25leWRldyAtPiAyNDAsIDI1NSwgMjQwXG4gICAgfCBIb3RwaW5rIC0+IDI1NSwgMTA1LCAxODBcbiAgICB8IEluZGlhbnJlZCAtPiAyMDUsIDkyLCA5MlxuICAgIHwgSW5kaWdvIC0+IDc1LCAwLCAxMzBcbiAgICB8IEl2b3J5IC0+IDI1NSwgMjU1LCAyNDBcbiAgICB8IEtoYWtpIC0+IDI0MCwgMjMwLCAxNDBcbiAgICB8IExhdmVuZGVyIC0+IDIzMCwgMjMwLCAyNTBcbiAgICB8IExhdmVuZGVyYmx1c2ggLT4gMjU1LCAyNDAsIDI0NVxuICAgIHwgTGF3bmdyZWVuIC0+IDEyNCwgMjUyLCAwXG4gICAgfCBMZW1vbmNoaWZmb24gLT4gMjU1LCAyNTAsIDIwNVxuICAgIHwgTGlnaHRibHVlIC0+IDE3MywgMjE2LCAyMzBcbiAgICB8IExpZ2h0Y29yYWwgLT4gMjQwLCAxMjgsIDEyOFxuICAgIHwgTGlnaHRjeWFuIC0+IDIyNCwgMjU1LCAyNTVcbiAgICB8IExpZ2h0Z29sZGVucm9keWVsbG93IC0+IDI1MCwgMjUwLCAyMTBcbiAgICB8IExpZ2h0Z3JheSAtPiAyMTEsIDIxMSwgMjExXG4gICAgfCBMaWdodGdyZWVuIC0+IDE0NCwgMjM4LCAxNDRcbiAgICB8IExpZ2h0Z3JleSAtPiAyMTEsIDIxMSwgMjExXG4gICAgfCBMaWdodHBpbmsgLT4gMjU1LCAxODIsIDE5M1xuICAgIHwgTGlnaHRzYWxtb24gLT4gMjU1LCAxNjAsIDEyMlxuICAgIHwgTGlnaHRzZWFncmVlbiAtPiAzMiwgMTc4LCAxNzBcbiAgICB8IExpZ2h0c2t5Ymx1ZSAtPiAxMzUsIDIwNiwgMjUwXG4gICAgfCBMaWdodHNsYXRlZ3JheSAtPiAxMTksIDEzNiwgMTUzXG4gICAgfCBMaWdodHNsYXRlZ3JleSAtPiAxMTksIDEzNiwgMTUzXG4gICAgfCBMaWdodHN0ZWVsYmx1ZSAtPiAxNzYsIDE5NiwgMjIyXG4gICAgfCBMaWdodHllbGxvdyAtPiAyNTUsIDI1NSwgMjI0XG4gICAgfCBMaW1lIC0+IDAsIDI1NSwgMFxuICAgIHwgTGltZWdyZWVuIC0+IDUwLCAyMDUsIDUwXG4gICAgfCBMaW5lbiAtPiAyNTAsIDI0MCwgMjMwXG4gICAgfCBNYWdlbnRhIC0+IDI1NSwgMCwgMjU1XG4gICAgfCBNYXJvb24gLT4gMTI4LCAwLCAwXG4gICAgfCBNZWRpdW1hcXVhbWFyaW5lIC0+IDEwMiwgMjA1LCAxNzBcbiAgICB8IE1lZGl1bWJsdWUgLT4gMCwgMCwgMjA1XG4gICAgfCBNZWRpdW1vcmNoaWQgLT4gMTg2LCA4NSwgMjExXG4gICAgfCBNZWRpdW1wdXJwbGUgLT4gMTQ3LCAxMTIsIDIxOVxuICAgIHwgTWVkaXVtc2VhZ3JlZW4gLT4gNjAsIDE3OSwgMTEzXG4gICAgfCBNZWRpdW1zbGF0ZWJsdWUgLT4gMTIzLCAxMDQsIDIzOFxuICAgIHwgTWVkaXVtc3ByaW5nZ3JlZW4gLT4gMCwgMjUwLCAxNTRcbiAgICB8IE1lZGl1bXR1cnF1b2lzZSAtPiA3MiwgMjA5LCAyMDRcbiAgICB8IE1lZGl1bXZpb2xldHJlZCAtPiAxOTksIDIxLCAxMzNcbiAgICB8IE1pZG5pZ2h0Ymx1ZSAtPiAyNSwgMjUsIDExMlxuICAgIHwgTWludGNyZWFtIC0+IDI0NSwgMjU1LCAyNTBcbiAgICB8IE1pc3R5cm9zZSAtPiAyNTUsIDIyOCwgMjI1XG4gICAgfCBNb2NjYXNpbiAtPiAyNTUsIDIyOCwgMTgxXG4gICAgfCBOYXZham93aGl0ZSAtPiAyNTUsIDIyMiwgMTczXG4gICAgfCBOYXZ5IC0+IDAsIDAsIDEyOFxuICAgIHwgT2xkbGFjZSAtPiAyNTMsIDI0NSwgMjMwXG4gICAgfCBPbGl2ZSAtPiAxMjgsIDEyOCwgMFxuICAgIHwgT2xpdmVkcmFiIC0+IDEwNywgMTQyLCAzNVxuICAgIHwgT3JhbmdlIC0+IDI1NSwgMTY1LCAwXG4gICAgfCBPcmFuZ2VyZWQgLT4gMjU1LCA2OSwgMFxuICAgIHwgT3JjaGlkIC0+IDIxOCwgMTEyLCAyMTRcbiAgICB8IFBhbGVnb2xkZW5yb2QgLT4gMjM4LCAyMzIsIDE3MFxuICAgIHwgUGFsZWdyZWVuIC0+IDE1MiwgMjUxLCAxNTJcbiAgICB8IFBhbGV0dXJxdW9pc2UgLT4gMTc1LCAyMzgsIDIzOFxuICAgIHwgUGFsZXZpb2xldHJlZCAtPiAyMTksIDExMiwgMTQ3XG4gICAgfCBQYXBheWF3aGlwIC0+IDI1NSwgMjM5LCAyMTNcbiAgICB8IFBlYWNocHVmZiAtPiAyNTUsIDIxOCwgMTg1XG4gICAgfCBQZXJ1IC0+IDIwNSwgMTMzLCA2M1xuICAgIHwgUGluayAtPiAyNTUsIDE5MiwgMjAzXG4gICAgfCBQbHVtIC0+IDIyMSwgMTYwLCAyMjFcbiAgICB8IFBvd2RlcmJsdWUgLT4gMTc2LCAyMjQsIDIzMFxuICAgIHwgUHVycGxlIC0+IDEyOCwgMCwgMTI4XG4gICAgfCBSZWQgLT4gMjU1LCAwLCAwXG4gICAgfCBSb3N5YnJvd24gLT4gMTg4LCAxNDMsIDE0M1xuICAgIHwgUm95YWxibHVlIC0+IDY1LCAxMDUsIDIyNVxuICAgIHwgU2FkZGxlYnJvd24gLT4gMTM5LCA2OSwgMTlcbiAgICB8IFNhbG1vbiAtPiAyNTAsIDEyOCwgMTE0XG4gICAgfCBTYW5keWJyb3duIC0+IDI0NCwgMTY0LCA5NlxuICAgIHwgU2VhZ3JlZW4gLT4gNDYsIDEzOSwgODdcbiAgICB8IFNlYXNoZWxsIC0+IDI1NSwgMjQ1LCAyMzhcbiAgICB8IFNpZW5uYSAtPiAxNjAsIDgyLCA0NVxuICAgIHwgU2lsdmVyIC0+IDE5MiwgMTkyLCAxOTJcbiAgICB8IFNreWJsdWUgLT4gMTM1LCAyMDYsIDIzNVxuICAgIHwgU2xhdGVibHVlIC0+IDEwNiwgOTAsIDIwNVxuICAgIHwgU2xhdGVncmF5IC0+IDExMiwgMTI4LCAxNDRcbiAgICB8IFNsYXRlZ3JleSAtPiAxMTIsIDEyOCwgMTQ0XG4gICAgfCBTbm93IC0+IDI1NSwgMjUwLCAyNTBcbiAgICB8IFNwcmluZ2dyZWVuIC0+IDAsIDI1NSwgMTI3XG4gICAgfCBTdGVlbGJsdWUgLT4gNzAsIDEzMCwgMTgwXG4gICAgfCBUYW4gLT4gMjEwLCAxODAsIDE0MFxuICAgIHwgVGVhbCAtPiAwLCAxMjgsIDEyOFxuICAgIHwgVGhpc3RsZSAtPiAyMTYsIDE5MSwgMjE2XG4gICAgfCBUb21hdG8gLT4gMjU1LCA5OSwgNzFcbiAgICB8IFR1cnF1b2lzZSAtPiA2NCwgMjI0LCAyMDhcbiAgICB8IFZpb2xldCAtPiAyMzgsIDEzMCwgMjM4XG4gICAgfCBXaGVhdCAtPiAyNDUsIDIyMiwgMTc5XG4gICAgfCBXaGl0ZSAtPiAyNTUsIDI1NSwgMjU1XG4gICAgfCBXaGl0ZXNtb2tlIC0+IDI0NSwgMjQ1LCAyNDVcbiAgICB8IFllbGxvdyAtPiAyNTUsIDI1NSwgMFxuICAgIHwgWWVsbG93Z3JlZW4gLT4gMTU0LCAyMDUsIDUwXG5cbiAgdHlwZSB0ID1cbiAgICB8IE5hbWUgb2YgbmFtZVxuICAgIHwgUkdCIG9mIChpbnQgKiBpbnQgKiBpbnQpXG4gICAgICAgICgqKiBSZWQsIEdyZWVuIGFuZCBCbHVlIHZhbHVlcy4gQ2xpcHBlZCB0byBbWzAuLjI1NV1dIGJ5IG1vc3QgKEFsbD8pXG4gICAgICAgICAgICBicm93c2Vycy4gKilcbiAgICB8IFJHQl9wZXJjZW50IG9mIChpbnQgKiBpbnQgKiBpbnQpXG4gICAgICAgICgqKiBSR0IgY2hhbm5lbHMgYXJlIHNwZWNpZmllZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgbWF4aW1hbCB2YWx1ZS4gKilcbiAgICB8IFJHQkEgb2YgKGludCAqIGludCAqIGludCAqIGZsb2F0KVxuICAgICAgICAoKiogU2FtZSBhcyBSR0Igd2l0aCBhZGRpdGlvbmFsIHRyYW5zcGFyZW5jeSBhcmd1bWVudC4gT3BhY2l0eSBzaG91bGQgYmUgaW5cbiAgICAgICAgICAgIFswLl0gKGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQpIGFuZCBbMS5dIChjb21wbGV0ZWx5IG9wYXF1ZSkuICopXG4gICAgfCBSR0JBX3BlcmNlbnQgb2YgKGludCAqIGludCAqIGludCAqIGZsb2F0KVxuICAgICAgICAoKiogUkdCIGNoYW5uZWxzIHNwZWNpZmllZCBhcyBwZXJjZW50YWdlIG9mIHRoZWlyIG1heGltYWwgdmFsdWUuIEFscGhhXG4gICAgICAgICAgICBjaGFubmVsIChvcGFjaXR5KSBpcyBzdGlsbCBhIFswLl0gdG8gWzEuXSBmbG9hdC4gKilcbiAgICB8IEhTTCBvZiAoaW50ICogaW50ICogaW50KVxuICAgICAgICAoKiogSHVlLCBTYXR1cmF0aW9uIGFuZCBMaWdodG5lc3MgdmFsdWVzLiBIdWUgaXMgYW4gYW5nbGUgaW4gZGVncmVlIChpblxuICAgICAgICAgICAgaW50ZXJ2YWwgW1swLi4zNjBbXSkuIFNhdHVyYXRpb24gaXMgYSBwZXJjZW50YWdlIChbWzAuLjEwMF1dKSB3aXRoIFswXVxuICAgICAgICAgICAgYmVpbmcgY29sb3JsZXNzLiBMaWdodG5lc3MgaXMgYWxzbyBhIHBlcmNlbnRhZ2UgKFtbMC4uMTAwXV0pIHdpdGggWzBdXG4gICAgICAgICAgICBiZWluZyBibGFjay4gKilcbiAgICB8IEhTTEEgb2YgKGludCAqIGludCAqIGludCAqIGZsb2F0KVxuICAgICAgICAoKiogU2FtZSBhcyBIU0wgd2l0aCBhbiBvcGFjaXR5IGFyZ3VtZW50IGJldHdlZW4gWzAuXSBhbmQgWzEuXS4gKilcblxuICBsZXQgcmdiID9hIHIgZyBiID1cbiAgICBtYXRjaCBhIHdpdGhcbiAgICB8IE5vbmUgLT4gUkdCIChyLCBnLCBiKVxuICAgIHwgU29tZSBhIC0+IFJHQkEgKHIsIGcsIGIsIGEpXG5cbiAgbGV0IGhzbCA/YSBoIHMgbCA9XG4gICAgbWF0Y2ggYSB3aXRoXG4gICAgfCBOb25lIC0+IEhTTCAoaCwgcywgbClcbiAgICB8IFNvbWUgYSAtPiBIU0xBIChoLCBzLCBsLCBhKVxuXG4gIGxldCBzdHJpbmdfb2ZfdCA9IGZ1bmN0aW9uXG4gICAgfCBOYW1lIG4gLT4gc3RyaW5nX29mX25hbWUgblxuICAgIHwgUkdCIChyLCBnLCBiKSAtPiBQcmludGYuc3ByaW50ZiBcInJnYiglZCwlZCwlZClcIiByIGcgYlxuICAgIHwgUkdCX3BlcmNlbnQgKHIsIGcsIGIpIC0+IFByaW50Zi5zcHJpbnRmIFwicmdiKCVkJSUsJWQlJSwlZCUlKVwiIHIgZyBiXG4gICAgfCBSR0JBIChyLCBnLCBiLCBhKSAtPiBQcmludGYuc3ByaW50ZiBcInJnYmEoJWQsJWQsJWQsJWYpXCIgciBnIGIgYVxuICAgIHwgUkdCQV9wZXJjZW50IChyLCBnLCBiLCBhKSAtPiBQcmludGYuc3ByaW50ZiBcInJnYmEoJWQlJSwlZCUlLCVkJSUsJWYpXCIgciBnIGIgYVxuICAgIHwgSFNMIChoLCBzLCBsKSAtPiBQcmludGYuc3ByaW50ZiBcImhzbCglZCwlZCUlLCVkJSUpXCIgaCBzIGxcbiAgICB8IEhTTEEgKGgsIHMsIGwsIGEpIC0+IFByaW50Zi5zcHJpbnRmIFwiaHNsYSglZCwlZCUlLCVkJSUsJWYpXCIgaCBzIGwgYVxuXG4gIGxldCBoZXhfb2ZfcmdiIChyZWQsIGdyZWVuLCBibHVlKSA9XG4gICAgbGV0IGluX3JhbmdlIGkgPVxuICAgICAgaWYgaSA8IDAgfHwgaSA+IDI1NVxuICAgICAgdGhlbiByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoc3RyaW5nX29mX2ludCBpIF4gXCIgaXMgb3V0IG9mIHZhbGlkIHJhbmdlXCIpKVxuICAgIGluXG4gICAgaW5fcmFuZ2UgcmVkO1xuICAgIGluX3JhbmdlIGdyZWVuO1xuICAgIGluX3JhbmdlIGJsdWU7XG4gICAgUHJpbnRmLnNwcmludGYgXCIjJTAyWCUwMlglMDJYXCIgcmVkIGdyZWVuIGJsdWVcblxuICAoKiBPY2FtbCA8LT4gSlMgcmVwcmVzZW50YXRpb24gKilcbiAgdHlwZSBqc190ID0gSnMuanNfc3RyaW5nIEpzLnRcblxuICAoKiBUT0RPPyBiZSBtb3JlIHJlc3RyaWN0aXZlLCBjbGlwIHZhbHVlcyBpbnRvIHN0YW5kYXJkIHJhbmdlICopXG4gIGxldCBqc190X29mX2pzX3N0cmluZyBzID1cbiAgICBsZXQgcmdiX3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHAgKEpzLmJ5dGVzdHJpbmcgXCJecmdiXFxcXChcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqLFxcXFxzKlxcXFxkKlxcXFwpJFwiKVxuICAgIGluXG4gICAgbGV0IHJnYl9wY3RfcmUgPVxuICAgICAgbmV3JWpzIEpzLnJlZ0V4cCAoSnMuYnl0ZXN0cmluZyBcIl5yZ2JcXFxcKFxcXFxzKlxcXFxkKiUsXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColXFxcXCkkXCIpXG4gICAgaW5cbiAgICBsZXQgcmdiYV9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwXG4gICAgICAgIChKcy5ieXRlc3RyaW5nIFwiXnJnYmFcXFxcKFxcXFxzKlxcXFxkKixcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqLFxcXFxkKlxcXFwuP1xcXFxkKlxcXFwpJFwiKVxuICAgIGluXG4gICAgbGV0IHJnYmFfcGN0X3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHBcbiAgICAgICAgKEpzLmJ5dGVzdHJpbmcgXCJecmdiYVxcXFwoXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiUsXFxcXGQqXFxcXC4/XFxcXGQqXFxcXCkkXCIpXG4gICAgaW5cbiAgICBsZXQgaHNsX3JlID1cbiAgICAgIG5ldyVqcyBKcy5yZWdFeHAgKEpzLmJ5dGVzdHJpbmcgXCJeaHNsXFxcXChcXFxccypcXFxcZCosXFxcXHMqXFxcXGQqJSxcXFxccypcXFxcZColXFxcXCkkXCIpXG4gICAgaW5cbiAgICBsZXQgaHNsYV9yZSA9XG4gICAgICBuZXclanMgSnMucmVnRXhwXG4gICAgICAgIChKcy5ieXRlc3RyaW5nIFwiXmhzbGFcXFxcKFxcXFxzKlxcXFxkKixcXFxccypcXFxcZColLFxcXFxzKlxcXFxkKiUsXFxcXGQqXFxcXC4/XFxcXGQqXFxcXCkkXCIpXG4gICAgaW5cbiAgICBpZiBKcy50b19ib29sIChyZ2JfcmUjI3Rlc3QgcylcbiAgICAgICB8fCBKcy50b19ib29sIChyZ2JhX3JlIyN0ZXN0IHMpXG4gICAgICAgfHwgSnMudG9fYm9vbCAocmdiX3BjdF9yZSMjdGVzdCBzKVxuICAgICAgIHx8IEpzLnRvX2Jvb2wgKHJnYmFfcGN0X3JlIyN0ZXN0IHMpXG4gICAgICAgfHwgSnMudG9fYm9vbCAoaHNsX3JlIyN0ZXN0IHMpXG4gICAgICAgfHwgSnMudG9fYm9vbCAoaHNsYV9yZSMjdGVzdCBzKVxuICAgIHRoZW4gc1xuICAgIGVsc2UgaWYgTGlzdC5tZW1cbiAgICAgICAgICAgICAgKEpzLnRvX3N0cmluZyBzKVxuICAgICAgICAgICAgICBbIFwiYWxpY2VibHVlXCJcbiAgICAgICAgICAgICAgOyBcImFudGlxdWV3aGl0ZVwiXG4gICAgICAgICAgICAgIDsgXCJhcXVhXCJcbiAgICAgICAgICAgICAgOyBcImFxdWFtYXJpbmVcIlxuICAgICAgICAgICAgICA7IFwiYXp1cmVcIlxuICAgICAgICAgICAgICA7IFwiYmVpZ2VcIlxuICAgICAgICAgICAgICA7IFwiYmlzcXVlXCJcbiAgICAgICAgICAgICAgOyBcImJsYWNrXCJcbiAgICAgICAgICAgICAgOyBcImJsYW5jaGVkYWxtb25kXCJcbiAgICAgICAgICAgICAgOyBcImJsdWVcIlxuICAgICAgICAgICAgICA7IFwiYmx1ZXZpb2xldFwiXG4gICAgICAgICAgICAgIDsgXCJicm93blwiXG4gICAgICAgICAgICAgIDsgXCJidXJseXdvb2RcIlxuICAgICAgICAgICAgICA7IFwiY2FkZXRibHVlXCJcbiAgICAgICAgICAgICAgOyBcImNoYXJ0cmV1c2VcIlxuICAgICAgICAgICAgICA7IFwiY2hvY29sYXRlXCJcbiAgICAgICAgICAgICAgOyBcImNvcmFsXCJcbiAgICAgICAgICAgICAgOyBcImNvcm5mbG93ZXJibHVlXCJcbiAgICAgICAgICAgICAgOyBcImNvcm5zaWxrXCJcbiAgICAgICAgICAgICAgOyBcImNyaW1zb25cIlxuICAgICAgICAgICAgICA7IFwiY3lhblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrY3lhblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrZ29sZGVucm9kXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtncmF5XCJcbiAgICAgICAgICAgICAgOyBcImRhcmtncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJra2hha2lcIlxuICAgICAgICAgICAgICA7IFwiZGFya21hZ2VudGFcIlxuICAgICAgICAgICAgICA7IFwiZGFya29saXZlZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwiZGFya29yYW5nZVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrb3JjaGlkXCJcbiAgICAgICAgICAgICAgOyBcImRhcmtyZWRcIlxuICAgICAgICAgICAgICA7IFwiZGFya3NhbG1vblwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrc2VhZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwiZGFya3NsYXRlYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrc2xhdGVncmF5XCJcbiAgICAgICAgICAgICAgOyBcImRhcmtzbGF0ZWdyZXlcIlxuICAgICAgICAgICAgICA7IFwiZGFya3R1cnF1b2lzZVwiXG4gICAgICAgICAgICAgIDsgXCJkYXJrdmlvbGV0XCJcbiAgICAgICAgICAgICAgOyBcImRlZXBwaW5rXCJcbiAgICAgICAgICAgICAgOyBcImRlZXBza3libHVlXCJcbiAgICAgICAgICAgICAgOyBcImRpbWdyYXlcIlxuICAgICAgICAgICAgICA7IFwiZGltZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJkb2RnZXJibHVlXCJcbiAgICAgICAgICAgICAgOyBcImZpcmVicmlja1wiXG4gICAgICAgICAgICAgIDsgXCJmbG9yYWx3aGl0ZVwiXG4gICAgICAgICAgICAgIDsgXCJmb3Jlc3RncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJmdWNoc2lhXCJcbiAgICAgICAgICAgICAgOyBcImdhaW5zYm9yb1wiXG4gICAgICAgICAgICAgIDsgXCJnaG9zdHdoaXRlXCJcbiAgICAgICAgICAgICAgOyBcImdvbGRcIlxuICAgICAgICAgICAgICA7IFwiZ29sZGVucm9kXCJcbiAgICAgICAgICAgICAgOyBcImdyYXlcIlxuICAgICAgICAgICAgICA7IFwiZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwiZ3JlZW55ZWxsb3dcIlxuICAgICAgICAgICAgICA7IFwiZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJob25leWRld1wiXG4gICAgICAgICAgICAgIDsgXCJob3RwaW5rXCJcbiAgICAgICAgICAgICAgOyBcImluZGlhbnJlZFwiXG4gICAgICAgICAgICAgIDsgXCJpbmRpZ29cIlxuICAgICAgICAgICAgICA7IFwiaXZvcnlcIlxuICAgICAgICAgICAgICA7IFwia2hha2lcIlxuICAgICAgICAgICAgICA7IFwibGF2ZW5kZXJcIlxuICAgICAgICAgICAgICA7IFwibGF2ZW5kZXJibHVzaFwiXG4gICAgICAgICAgICAgIDsgXCJsYXduZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibGVtb25jaGlmZm9uXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGNvcmFsXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0Y3lhblwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGdvbGRlbnJvZHllbGxvd1wiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGdyYXlcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJsaWdodGdyZXlcIlxuICAgICAgICAgICAgICA7IFwibGlnaHRwaW5rXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c2FsbW9uXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c2VhZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwibGlnaHRza3libHVlXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c2xhdGVncmF5XCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c2xhdGVncmV5XCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0c3RlZWxibHVlXCJcbiAgICAgICAgICAgICAgOyBcImxpZ2h0eWVsbG93XCJcbiAgICAgICAgICAgICAgOyBcImxpbWVcIlxuICAgICAgICAgICAgICA7IFwibGltZWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcImxpbmVuXCJcbiAgICAgICAgICAgICAgOyBcIm1hZ2VudGFcIlxuICAgICAgICAgICAgICA7IFwibWFyb29uXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bWFxdWFtYXJpbmVcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1vcmNoaWRcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtcHVycGxlXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXNlYWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcIm1lZGl1bXNsYXRlYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW1zcHJpbmdncmVlblwiXG4gICAgICAgICAgICAgIDsgXCJtZWRpdW10dXJxdW9pc2VcIlxuICAgICAgICAgICAgICA7IFwibWVkaXVtdmlvbGV0cmVkXCJcbiAgICAgICAgICAgICAgOyBcIm1pZG5pZ2h0Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJtaW50Y3JlYW1cIlxuICAgICAgICAgICAgICA7IFwibWlzdHlyb3NlXCJcbiAgICAgICAgICAgICAgOyBcIm1vY2Nhc2luXCJcbiAgICAgICAgICAgICAgOyBcIm5hdmFqb3doaXRlXCJcbiAgICAgICAgICAgICAgOyBcIm5hdnlcIlxuICAgICAgICAgICAgICA7IFwib2xkbGFjZVwiXG4gICAgICAgICAgICAgIDsgXCJvbGl2ZVwiXG4gICAgICAgICAgICAgIDsgXCJvbGl2ZWRyYWJcIlxuICAgICAgICAgICAgICA7IFwib3JhbmdlXCJcbiAgICAgICAgICAgICAgOyBcIm9yYW5nZXJlZFwiXG4gICAgICAgICAgICAgIDsgXCJvcmNoaWRcIlxuICAgICAgICAgICAgICA7IFwicGFsZWdvbGRlbnJvZFwiXG4gICAgICAgICAgICAgIDsgXCJwYWxlZ3JlZW5cIlxuICAgICAgICAgICAgICA7IFwicGFsZXR1cnF1b2lzZVwiXG4gICAgICAgICAgICAgIDsgXCJwYWxldmlvbGV0cmVkXCJcbiAgICAgICAgICAgICAgOyBcInBhcGF5YXdoaXBcIlxuICAgICAgICAgICAgICA7IFwicGVhY2hwdWZmXCJcbiAgICAgICAgICAgICAgOyBcInBlcnVcIlxuICAgICAgICAgICAgICA7IFwicGlua1wiXG4gICAgICAgICAgICAgIDsgXCJwbHVtXCJcbiAgICAgICAgICAgICAgOyBcInBvd2RlcmJsdWVcIlxuICAgICAgICAgICAgICA7IFwicHVycGxlXCJcbiAgICAgICAgICAgICAgOyBcInJlZFwiXG4gICAgICAgICAgICAgIDsgXCJyb3N5YnJvd25cIlxuICAgICAgICAgICAgICA7IFwicm95YWxibHVlXCJcbiAgICAgICAgICAgICAgOyBcInNhZGRsZWJyb3duXCJcbiAgICAgICAgICAgICAgOyBcInNhbG1vblwiXG4gICAgICAgICAgICAgIDsgXCJzYW5keWJyb3duXCJcbiAgICAgICAgICAgICAgOyBcInNlYWdyZWVuXCJcbiAgICAgICAgICAgICAgOyBcInNlYXNoZWxsXCJcbiAgICAgICAgICAgICAgOyBcInNpZW5uYVwiXG4gICAgICAgICAgICAgIDsgXCJzaWx2ZXJcIlxuICAgICAgICAgICAgICA7IFwic2t5Ymx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJzbGF0ZWJsdWVcIlxuICAgICAgICAgICAgICA7IFwic2xhdGVncmF5XCJcbiAgICAgICAgICAgICAgOyBcInNsYXRlZ3JleVwiXG4gICAgICAgICAgICAgIDsgXCJzbm93XCJcbiAgICAgICAgICAgICAgOyBcInNwcmluZ2dyZWVuXCJcbiAgICAgICAgICAgICAgOyBcInN0ZWVsYmx1ZVwiXG4gICAgICAgICAgICAgIDsgXCJ0YW5cIlxuICAgICAgICAgICAgICA7IFwidGVhbFwiXG4gICAgICAgICAgICAgIDsgXCJ0aGlzdGxlXCJcbiAgICAgICAgICAgICAgOyBcInRvbWF0b1wiXG4gICAgICAgICAgICAgIDsgXCJ0dXJxdW9pc2VcIlxuICAgICAgICAgICAgICA7IFwidmlvbGV0XCJcbiAgICAgICAgICAgICAgOyBcIndoZWF0XCJcbiAgICAgICAgICAgICAgOyBcIndoaXRlXCJcbiAgICAgICAgICAgICAgOyBcIndoaXRlc21va2VcIlxuICAgICAgICAgICAgICA7IFwieWVsbG93XCJcbiAgICAgICAgICAgICAgOyBcInllbGxvd2dyZWVuXCJcbiAgICAgICAgICAgICAgXVxuICAgIHRoZW4gc1xuICAgIGVsc2UgcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKEpzLnRvX3N0cmluZyBzIF4gXCIgaXMgbm90IGEgdmFsaWQgY29sb3JcIikpXG5cbiAgbGV0IG5hbWUgY24gPSBKcy5zdHJpbmcgKHN0cmluZ19vZl9uYW1lIGNuKVxuXG4gIGxldCBqcyA9IGZ1bmN0aW9uXG4gICAgfCBOYW1lIG4gLT4gbmFtZSBuXG4gICAgfCAoUkdCIF8gfCBSR0JfcGVyY2VudCBfIHwgUkdCQSBfIHwgUkdCQV9wZXJjZW50IF8gfCBIU0wgXyB8IEhTTEEgXykgYXMgYyAtPlxuICAgICAgICBKcy5zdHJpbmcgKHN0cmluZ19vZl90IGMpXG5cbiAgbGV0IG1sIGMgPVxuICAgIGxldCBzID0gSnMudG9fc3RyaW5nIGMgaW5cbiAgICB0cnkgTmFtZSAobmFtZV9vZl9zdHJpbmcgcylcbiAgICB3aXRoIEludmFsaWRfYXJndW1lbnQgXyAtPiAoXG4gICAgICBsZXQgZmFpbCAoKSA9IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChzIF4gXCIgaXMgbm90IGEgdmFsaWQgY29sb3JcIikpIGluXG4gICAgICBsZXQgcmVfcmdiID1cbiAgICAgICAgUmVnZXhwLnJlZ2V4cCBcIihyZ2JhPylcXFxcKCg/OihcXFxcZCopLChcXFxcZCopLChcXFxcZCopKD86LChcXFxcZCooPzpcXFxcLlxcXFxkKik/KSk/KVxcXFwpXCJcbiAgICAgIGluXG4gICAgICBsZXQgcmVfcmdiX3BjdCA9XG4gICAgICAgIFJlZ2V4cC5yZWdleHAgXCIocmdiYT8pXFxcXCgoPzooXFxcXGQqKSUsKFxcXFxkKiklLChcXFxcZCopJSg/OiwoXFxcXGQqKD86XFxcXC5cXFxcZCopPykpPylcXFxcKVwiXG4gICAgICBpblxuICAgICAgbGV0IHJlX2hzbCA9XG4gICAgICAgIFJlZ2V4cC5yZWdleHAgXCIoaHNsYT8pXFxcXCgoPzooXFxcXGQqKSwoXFxcXGQqKSUsKFxcXFxkKiklKD86LChcXFxcZCooPzpcXFxcLlxcXFxkKik/KSk/KVxcXFwpXCJcbiAgICAgIGluXG4gICAgICBsZXQgaV9vZl9zX28gPSBmdW5jdGlvblxuICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICB8IFNvbWUgaSAtPiAoXG4gICAgICAgICAgICB0cnkgaW50X29mX3N0cmluZyBpXG4gICAgICAgICAgICB3aXRoIEludmFsaWRfYXJndW1lbnQgcyB8IEZhaWx1cmUgcyAtPlxuICAgICAgICAgICAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoXCJjb2xvciBjb252ZXJzaW9uIGVycm9yIChcIiBeIGkgXiBcIik6IFwiIF4gcykpKVxuICAgICAgaW5cbiAgICAgIGxldCBmX29mX3MgZiA9XG4gICAgICAgIHRyeSBmbG9hdF9vZl9zdHJpbmcgZlxuICAgICAgICB3aXRoIEludmFsaWRfYXJndW1lbnQgcyB8IEZhaWx1cmUgcyAtPlxuICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcImNvbG9yIGNvbnZlcnNpb24gZXJyb3IgKFwiIF4gZiBeIFwiKTogXCIgXiBzKSlcbiAgICAgIGluXG4gICAgICBtYXRjaCBSZWdleHAuc3RyaW5nX21hdGNoIHJlX3JnYiBzIDAgd2l0aFxuICAgICAgfCBTb21lIHIgLT4gKFxuICAgICAgICAgIGxldCByZWQgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDIgaW5cbiAgICAgICAgICBsZXQgZ3JlZW4gPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDMgaW5cbiAgICAgICAgICBsZXQgYmx1ZSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNCBpblxuICAgICAgICAgIGxldCBhbHBoYSA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgNSBpblxuICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMSB3aXRoXG4gICAgICAgICAgfCBTb21lIFwicmdiXCIgLT4gKFxuICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSBfIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgfCBOb25lIC0+IFJHQiAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSkpXG4gICAgICAgICAgfCBTb21lIFwicmdiYVwiIC0+IChcbiAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgICAgICB8IFNvbWUgYSAtPiBSR0JBIChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlLCBmX29mX3MgYSkpXG4gICAgICAgICAgfCBTb21lIF8gfCBOb25lIC0+IGZhaWwgKCkpXG4gICAgICB8IE5vbmUgLT4gKFxuICAgICAgICAgIG1hdGNoIFJlZ2V4cC5zdHJpbmdfbWF0Y2ggcmVfcmdiX3BjdCBzIDAgd2l0aFxuICAgICAgICAgIHwgU29tZSByIC0+IChcbiAgICAgICAgICAgICAgbGV0IHJlZCA9IFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMiBpblxuICAgICAgICAgICAgICBsZXQgZ3JlZW4gPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDMgaW5cbiAgICAgICAgICAgICAgbGV0IGJsdWUgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDQgaW5cbiAgICAgICAgICAgICAgbGV0IGFscGhhID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA1IGluXG4gICAgICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMSB3aXRoXG4gICAgICAgICAgICAgIHwgU29tZSBcInJnYlwiIC0+IChcbiAgICAgICAgICAgICAgICAgIG1hdGNoIGFscGhhIHdpdGhcbiAgICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBSR0JfcGVyY2VudCAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSkpXG4gICAgICAgICAgICAgIHwgU29tZSBcInJnYmFcIiAtPiAoXG4gICAgICAgICAgICAgICAgICBtYXRjaCBhbHBoYSB3aXRoXG4gICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgICAgICAgICAgfCBTb21lIGEgLT5cbiAgICAgICAgICAgICAgICAgICAgICBSR0JBX3BlcmNlbnQgKGlfb2Zfc19vIHJlZCwgaV9vZl9zX28gZ3JlZW4sIGlfb2Zfc19vIGJsdWUsIGZfb2ZfcyBhKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB8IFNvbWUgXyB8IE5vbmUgLT4gZmFpbCAoKSlcbiAgICAgICAgICB8IE5vbmUgLT4gKFxuICAgICAgICAgICAgICBtYXRjaCBSZWdleHAuc3RyaW5nX21hdGNoIHJlX2hzbCBzIDAgd2l0aFxuICAgICAgICAgICAgICB8IFNvbWUgciAtPiAoXG4gICAgICAgICAgICAgICAgICBsZXQgcmVkID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAyIGluXG4gICAgICAgICAgICAgICAgICBsZXQgZ3JlZW4gPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDMgaW5cbiAgICAgICAgICAgICAgICAgIGxldCBibHVlID0gUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciA0IGluXG4gICAgICAgICAgICAgICAgICBsZXQgYWxwaGEgPSBSZWdleHAubWF0Y2hlZF9ncm91cCByIDUgaW5cbiAgICAgICAgICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMSB3aXRoXG4gICAgICAgICAgICAgICAgICB8IFNvbWUgXCJoc2xcIiAtPiAoXG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBfIC0+IGZhaWwgKClcbiAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT4gSFNMIChpX29mX3NfbyByZWQsIGlfb2Zfc19vIGdyZWVuLCBpX29mX3NfbyBibHVlKSlcbiAgICAgICAgICAgICAgICAgIHwgU29tZSBcImhzbGFcIiAtPiAoXG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYWxwaGEgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgICAgICAgICAgICAgfCBTb21lIGEgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgSFNMQSAoaV9vZl9zX28gcmVkLCBpX29mX3NfbyBncmVlbiwgaV9vZl9zX28gYmx1ZSwgZl9vZl9zIGEpKVxuICAgICAgICAgICAgICAgICAgfCBTb21lIF8gfCBOb25lIC0+IGZhaWwgKCkpXG4gICAgICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpKSkpXG5lbmRcblxubW9kdWxlIExlbmd0aCA9IHN0cnVjdFxuICAoKiBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXZhbHVlcy8jbGVuZ3RocyAqKVxuXG4gICgqIFRPRE86XG4gICAgIHtbXG4gICAgICAgdHlwZSBqc190ID0gcHJpdmF0ZSBKcy5zdHJpbmcgSnMudFxuICAgICAgIHZhbCBqc190X29mX3RcbiAgICAgICB2YWwgdF9vZl9qc190XG4gICAgICAgdmFsIHRfb2Zfc3RyaW5nXG4gICAgIF19XG4gICopXG5cbiAgdHlwZSB0ID1cbiAgICB8IFplcm9cbiAgICAoKiByZWxhdGl2ZSAqKVxuICAgIHwgRW0gb2YgZmxvYXRcbiAgICB8IEV4IG9mIGZsb2F0XG4gICAgfCBQeCBvZiBmbG9hdFxuICAgIHwgR2Qgb2YgZmxvYXRcbiAgICB8IFJlbSBvZiBmbG9hdFxuICAgIHwgVncgb2YgZmxvYXRcbiAgICB8IFZoIG9mIGZsb2F0XG4gICAgfCBWbSBvZiBmbG9hdFxuICAgIHwgQ2ggb2YgZmxvYXRcbiAgICAoKiBhYnNvbHV0ZSAqKVxuICAgIHwgTW0gb2YgZmxvYXRcbiAgICB8IENtIG9mIGZsb2F0XG4gICAgfCBJbiBvZiBmbG9hdFxuICAgIHwgUHQgb2YgZmxvYXRcbiAgICB8IFBjIG9mIGZsb2F0XG5cbiAgbGV0IHN0cmluZ19vZl90ID0gZnVuY3Rpb25cbiAgICB8IFplcm8gLT4gXCIwXCJcbiAgICB8IEVtIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImVtXCJcbiAgICB8IEV4IGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImV4XCJcbiAgICB8IFB4IGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcInB4XCJcbiAgICB8IEdkIGYgLT4gUHJpbnRmLnNwcmludGYgXCIlZiVzXCIgZiBcImdkXCJcbiAgICB8IFJlbSBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJyZW1cIlxuICAgIHwgVncgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwidndcIlxuICAgIHwgVmggZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwidmhcIlxuICAgIHwgVm0gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwidm1cIlxuICAgIHwgQ2ggZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiY2hcIlxuICAgIHwgTW0gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwibW1cIlxuICAgIHwgQ20gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiY21cIlxuICAgIHwgSW4gZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwiaW5cIlxuICAgIHwgUHQgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwicHRcIlxuICAgIHwgUGMgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwicGNcIlxuXG4gIHR5cGUganNfdCA9IEpzLmpzX3N0cmluZyBKcy50XG5cbiAgbGV0IGpzIHQgPSBKcy5zdHJpbmcgKHN0cmluZ19vZl90IHQpXG5cbiAgbGV0IG1sIHQgPVxuICAgIGxldCBzID0gSnMudG9fc3RyaW5nIHQgaW5cbiAgICBpZiBTdHJpbmcuZXF1YWwgcyBcIjBcIlxuICAgIHRoZW4gWmVyb1xuICAgIGVsc2VcbiAgICAgIGxldCBmYWlsICgpID0gcmFpc2UgKEludmFsaWRfYXJndW1lbnQgKHMgXiBcIiBpcyBub3QgYSB2YWxpZCBsZW5ndGhcIikpIGluXG4gICAgICBsZXQgcmUgPSBSZWdleHAucmVnZXhwIFwiXihcXFxcZCooPzpcXFxcLlxcXFxkKik/KVxcXFxzKihcXFxcUyopJFwiIGluXG4gICAgICBtYXRjaCBSZWdleHAuc3RyaW5nX21hdGNoIHJlIHMgMCB3aXRoXG4gICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgfCBTb21lIHIgLT4gKFxuICAgICAgICAgIGxldCBmID1cbiAgICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMSB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgICAgICAgICAgfCBTb21lIGYgLT4gKFxuICAgICAgICAgICAgICAgIHRyeSBmbG9hdF9vZl9zdHJpbmcgZlxuICAgICAgICAgICAgICAgIHdpdGggSW52YWxpZF9hcmd1bWVudCBzIC0+XG4gICAgICAgICAgICAgICAgICByYWlzZSAoSW52YWxpZF9hcmd1bWVudCAoXCJsZW5ndGggY29udmVyc2lvbiBlcnJvcjogXCIgXiBzKSkpXG4gICAgICAgICAgaW5cbiAgICAgICAgICBtYXRjaCBSZWdleHAubWF0Y2hlZF9ncm91cCByIDIgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBmYWlsICgpXG4gICAgICAgICAgfCBTb21lIFwiZW1cIiAtPiBFbSBmXG4gICAgICAgICAgfCBTb21lIFwiZXhcIiAtPiBFeCBmXG4gICAgICAgICAgfCBTb21lIFwicHhcIiAtPiBQeCBmXG4gICAgICAgICAgfCBTb21lIFwiZ2RcIiAtPiBHZCBmXG4gICAgICAgICAgfCBTb21lIFwicmVtXCIgLT4gUmVtIGZcbiAgICAgICAgICB8IFNvbWUgXCJ2d1wiIC0+IFZ3IGZcbiAgICAgICAgICB8IFNvbWUgXCJ2aFwiIC0+IFZoIGZcbiAgICAgICAgICB8IFNvbWUgXCJ2bVwiIC0+IFZtIGZcbiAgICAgICAgICB8IFNvbWUgXCJjaFwiIC0+IENoIGZcbiAgICAgICAgICB8IFNvbWUgXCJtbVwiIC0+IE1tIGZcbiAgICAgICAgICB8IFNvbWUgXCJjbVwiIC0+IENtIGZcbiAgICAgICAgICB8IFNvbWUgXCJpblwiIC0+IEluIGZcbiAgICAgICAgICB8IFNvbWUgXCJwdFwiIC0+IFB0IGZcbiAgICAgICAgICB8IFNvbWUgXCJwY1wiIC0+IFBjIGZcbiAgICAgICAgICB8IFNvbWUgXyAtPiBmYWlsICgpKVxuZW5kXG5cbm1vZHVsZSBBbmdsZSA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgRGVnIG9mIGZsb2F0XG4gICAgfCBHcmFkIG9mIGZsb2F0XG4gICAgfCBSYWQgb2YgZmxvYXRcbiAgICB8IFR1cm5zIG9mIGZsb2F0XG5cbiAgbGV0IHN0cmluZ19vZl90ID0gZnVuY3Rpb25cbiAgICB8IERlZyBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJkZWdcIlxuICAgIHwgR3JhZCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJncmFkXCJcbiAgICB8IFJhZCBmIC0+IFByaW50Zi5zcHJpbnRmIFwiJWYlc1wiIGYgXCJyYWRcIlxuICAgIHwgVHVybnMgZiAtPiBQcmludGYuc3ByaW50ZiBcIiVmJXNcIiBmIFwidHVybnNcIlxuXG4gIHR5cGUganNfdCA9IEpzLmpzX3N0cmluZyBKcy50XG5cbiAgbGV0IGpzIHQgPSBKcy5zdHJpbmcgKHN0cmluZ19vZl90IHQpXG5cbiAgbGV0IG1sIGogPVxuICAgIGxldCBzID0gSnMudG9fc3RyaW5nIGogaW5cbiAgICBsZXQgcmUgPSBSZWdleHAucmVnZXhwIFwiXihcXFxcZCooPzpcXFxcLlxcXFxkKikpKGRlZ3xncmFkfHJhZHx0dXJucykkXCIgaW5cbiAgICBsZXQgZmFpbCAoKSA9IHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChzIF4gXCIgaXMgbm90IGEgdmFsaWQgbGVuZ3RoXCIpKSBpblxuICAgIG1hdGNoIFJlZ2V4cC5zdHJpbmdfbWF0Y2ggcmUgcyAwIHdpdGhcbiAgICB8IE5vbmUgLT4gZmFpbCAoKVxuICAgIHwgU29tZSByIC0+IChcbiAgICAgICAgbGV0IGYgPVxuICAgICAgICAgIG1hdGNoIFJlZ2V4cC5tYXRjaGVkX2dyb3VwIHIgMSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGZhaWwgKClcbiAgICAgICAgICB8IFNvbWUgZiAtPiAoXG4gICAgICAgICAgICAgIHRyeSBmbG9hdF9vZl9zdHJpbmcgZlxuICAgICAgICAgICAgICB3aXRoIEludmFsaWRfYXJndW1lbnQgcyAtPlxuICAgICAgICAgICAgICAgIHJhaXNlIChJbnZhbGlkX2FyZ3VtZW50IChcImxlbmd0aCBjb252ZXJzaW9uIGVycm9yOiBcIiBeIHMpKSlcbiAgICAgICAgaW5cbiAgICAgICAgbWF0Y2ggUmVnZXhwLm1hdGNoZWRfZ3JvdXAgciAyIHdpdGhcbiAgICAgICAgfCBTb21lIFwiZGVnXCIgLT4gRGVnIGZcbiAgICAgICAgfCBTb21lIFwiZ3JhZFwiIC0+IEdyYWQgZlxuICAgICAgICB8IFNvbWUgXCJyYWRcIiAtPiBSYWQgZlxuICAgICAgICB8IFNvbWUgXCJ0dXJuc1wiIC0+IFR1cm5zIGZcbiAgICAgICAgfCBTb21lIF8gfCBOb25lIC0+IGZhaWwgKCkpXG5lbmRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG4oKiogSmF2YXNjcmlwdCBldmVudHMuICopXG5cbm9wZW4hIEltcG9ydFxubW9kdWxlIFR5cCA9IERvbV9odG1sLkV2ZW50XG5cbnR5cGUgbGlzdGVuZXIgPSBEb21faHRtbC5ldmVudF9saXN0ZW5lcl9pZFxuXG5sZXQgbGlzdGVuID8oY2FwdHVyZSA9IGZhbHNlKSB0YXJnZXQgdHlwIGNiID1cbiAgRG9tX2h0bWwuYWRkRXZlbnRMaXN0ZW5lclxuICAgIHRhcmdldFxuICAgIHR5cFxuICAgIChEb21faHRtbC5mdWxsX2hhbmRsZXIgKGZ1biBuIGUgLT4gSnMuYm9vbCAoY2IgbiBlKSkpXG4gICAgKEpzLmJvb2wgY2FwdHVyZSlcblxubGV0IHN0b3BfbGlzdGVuID0gRG9tX2h0bWwucmVtb3ZlRXZlbnRMaXN0ZW5lclxuIiwiKCogSnNfb2Zfb2NhbWwgbGlicmFyeVxuICogaHR0cDovL3d3dy5vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9cbiAqIENvcHlyaWdodCAoQykgMjAxNCBIdWdvIEhldXphcmRcbiAqIENvcHlyaWdodCAoQykgMjAxNCBKw6lyw7RtZSBWb3VpbGxvblxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxubGV0IHhtbG5zID0gSnMuc3RyaW5nIFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuXG4oKiB0cmFuc2xhdGUgc3BlYyBmcm9tIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWRy9pZGwuaHRtbCAqKVxuKCogaHR0cDovL3d3dy53My5vcmcvVFIvU1ZHL3N0cnVjdC5odG1sICopXG5cbnR5cGUgZXJyb3JfY29kZSA9XG4gIHwgV1JPTkdfVFlQRV9FUlJcbiAgfCBJTlZBTElEX1ZBTFVFX0VSUlxuICB8IE1BVFJJWF9OT1RfSU5WRVJUQUJMRVxuXG5jbGFzcyB0eXBlIHN2Z19lcnJvciA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgSnMuZXJyb3JcblxuICAgIG1ldGhvZCBjb2RlIDogZXJyb3JfY29kZSB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmV4Y2VwdGlvbiBTVkdFcnJvciBvZiBzdmdfZXJyb3JcblxudHlwZSBsZW5ndGhVbml0VHlwZSA9XG4gIHwgTEVOR1RIVFlQRV9VTktOT1dOXG4gIHwgTEVOR1RIVFlQRV9OVU1CRVJcbiAgfCBMRU5HVEhUWVBFX1BFUkNFTlRBR0VcbiAgfCBMRU5HVEhUWVBFX0VNU1xuICB8IExFTkdUSFRZUEVfRVhTXG4gIHwgTEVOR1RIVFlQRV9QWFxuICB8IExFTkdUSFRZUEVfQ01cbiAgfCBMRU5HVEhUWVBFX01NXG4gIHwgTEVOR1RIVFlQRV9JTlxuICB8IExFTkdUSFRZUEVfUFRcbiAgfCBMRU5HVEhUWVBFX1BDXG5cbnR5cGUgYW5nbGVVbml0VHlwZSA9XG4gIHwgQU5HTEVUWVBFX1VOS05PV05cbiAgfCBBTkdMRVRZUEVfVU5TUEVDSUZJRURcbiAgfCBBTkdMRVRZUEVfREVHXG4gIHwgQU5HTEVUWVBFX1JBRFxuICB8IEFOR0xFVFlQRV9HUkFEXG5cbnR5cGUgY29sb3JUeXBlID1cbiAgfCBDT0xPUlRZUEVfVU5LTk9XTlxuICB8IENPTE9SVFlQRV9SR0JDT0xPUlxuICB8IENPTE9SVFlQRV9SR0JDT0xPUl9JQ0NDT0xPUlxuICB8IENPTE9SVFlQRV9DVVJSRU5UQ09MT1JcblxudHlwZSBhbGlnbm1lbnRUeXBlID1cbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1VOS05PV05cbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX05PTkVcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUlOXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlEWU1JTlxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1BWFlNSU5cbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUlEXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlEWU1JRFxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1BWFlNSURcbiAgfCBQUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUFYXG4gIHwgUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlEWU1BWFxuICB8IFBSRVNFUlZFQVNQRUNUUkFUSU9fWE1BWFlNQVhcblxudHlwZSBtZWV0T3JTbGljZVR5cGUgPVxuICB8IE1FRVRPUlNMSUNFX1VOS05PV05cbiAgfCBNRUVUT1JTTElDRV9NRUVUXG4gIHwgTUVFVE9SU0xJQ0VfU0xJQ0VcblxudHlwZSB0cmFuc2Zvcm1UeXBlID1cbiAgfCBUUkFOU0ZPUk1fVU5LTk9XTlxuICB8IFRSQU5TRk9STV9NQVRSSVhcbiAgfCBUUkFOU0ZPUk1fVFJBTlNMQVRFXG4gIHwgVFJBTlNGT1JNX1NDQUxFXG4gIHwgVFJBTlNGT1JNX1JPVEFURVxuICB8IFRSQU5TRk9STV9TS0VXWFxuICB8IFRSQU5TRk9STV9TS0VXWVxuXG50eXBlIHpvb21BbmRQYW5UeXBlID1cbiAgfCBaT09NQU5EUEFOX1VOS05PV05cbiAgfCBaT09NQU5EUEFOX0RJU0FCTEVcbiAgfCBaT09NQU5EUEFOX01BR05JRllcblxudHlwZSBsZW5ndGhBZGp1c3QgPVxuICB8IExFTkdUSEFESlVTVF9VTktOT1dOXG4gIHwgTEVOR1RIQURKVVNUX1NQQUNJTkdcbiAgfCBMRU5HVEhBREpVU1RfU1BBQ0lOR0FOREdMWVBIU1xuXG50eXBlIHVuaXRUeXBlID1cbiAgfCBVTklUX1RZUEVfVU5LTk9XTlxuICB8IFVOSVRfVFlQRV9VU0VSU1BBQ0VPTlVTRVxuICB8IFVOSVRfVFlQRV9PQkpFQ1RCT1VORElOR0JPWFxuXG4oKiBpbnRlcmZhY2UgU1ZHUmVuZGVyaW5nSW50ZW50ICopXG50eXBlIGludGVudFR5cGUgPVxuICB8IFJFTkRFUklOR19JTlRFTlRfVU5LTk9XTlxuICB8IFJFTkRFUklOR19JTlRFTlRfQVVUT1xuICB8IFJFTkRFUklOR19JTlRFTlRfUEVSQ0VQVFVBTFxuICB8IFJFTkRFUklOR19JTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDXG4gIHwgUkVOREVSSU5HX0lOVEVOVF9TQVRVUkFUSU9OXG4gIHwgUkVOREVSSU5HX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUNcblxuKCogUGF0aCBTZWdtZW50IFR5cGVzICopXG50eXBlIHBhdGhTZWdtZW50VHlwZSA9XG4gIHwgUEFUSFNFR19VTktOT1dOXG4gIHwgUEFUSFNFR19DTE9TRVBBVEhcbiAgfCBQQVRIU0VHX01PVkVUT19BQlNcbiAgfCBQQVRIU0VHX01PVkVUT19SRUxcbiAgfCBQQVRIU0VHX0xJTkVUT19BQlNcbiAgfCBQQVRIU0VHX0xJTkVUT19SRUxcbiAgfCBQQVRIU0VHX0NVUlZFVE9fQ1VCSUNfQUJTXG4gIHwgUEFUSFNFR19DVVJWRVRPX0NVQklDX1JFTFxuICB8IFBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfQUJTXG4gIHwgUEFUSFNFR19DVVJWRVRPX1FVQURSQVRJQ19SRUxcbiAgfCBQQVRIU0VHX0FSQ19BQlNcbiAgfCBQQVRIU0VHX0FSQ19SRUxcbiAgfCBQQVRIU0VHX0xJTkVUT19IT1JJWk9OVEFMX0FCU1xuICB8IFBBVEhTRUdfTElORVRPX0hPUklaT05UQUxfUkVMXG4gIHwgUEFUSFNFR19MSU5FVE9fVkVSVElDQUxfQUJTXG4gIHwgUEFUSFNFR19MSU5FVE9fVkVSVElDQUxfUkVMXG4gIHwgUEFUSFNFR19DVVJWRVRPX0NVQklDX1NNT09USF9BQlNcbiAgfCBQQVRIU0VHX0NVUlZFVE9fQ1VCSUNfU01PT1RIX1JFTFxuICB8IFBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfU01PT1RIX0FCU1xuICB8IFBBVEhTRUdfQ1VSVkVUT19RVUFEUkFUSUNfU01PT1RIX1JFTFxuXG4oKiB0ZXh0UGF0aCBNZXRob2QgVHlwZXMgKilcbnR5cGUgdGV4dFBhdGhNZXRob2RUeXBlID1cbiAgfCBURVhUUEFUSF9NRVRIT0RUWVBFX1VOS05PV05cbiAgfCBURVhUUEFUSF9NRVRIT0RUWVBFX0FMSUdOXG4gIHwgVEVYVFBBVEhfTUVUSE9EVFlQRV9TVFJFVENIXG5cbigqIHRleHRQYXRoIFNwYWNpbmcgVHlwZXMgKilcbnR5cGUgdGV4dFBhdGhTcGFjaW5nVHlwZSA9XG4gIHwgVEVYVFBBVEhfU1BBQ0lOR1RZUEVfVU5LTk9XTlxuICB8IFRFWFRQQVRIX1NQQUNJTkdUWVBFX0FVVE9cbiAgfCBURVhUUEFUSF9TUEFDSU5HVFlQRV9FWEFDVFxuXG4oKiBTcHJlYWQgTWV0aG9kIFR5cGVzICopXG50eXBlIHNwcmVhZE1ldGhvZFR5cGUgPVxuICB8IFNQUkVBRE1FVEhPRF9VTktOT1dOXG4gIHwgU1BSRUFETUVUSE9EX1BBRFxuICB8IFNQUkVBRE1FVEhPRF9SRUZMRUNUXG4gIHwgU1BSRUFETUVUSE9EX1JFUEVBVFxuXG50eXBlIHN1c3BlbmRIYW5kbGVJRFxuXG4oKioqKilcblxuY2xhc3MgdHlwZSBbJ2FdIGFuaW1hdGVkID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGJhc2VWYWwgOiAnYSBwcm9wXG5cbiAgICBtZXRob2QgYW5pbVZhbCA6ICdhIHByb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgWydhXSBsaXN0ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIG51bWJlck9mSXRlbXMgOiBpbnQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGNsZWFyIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5pdGlhbGl6ZSA6ICdhIC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBnZXRJdGVtIDogaW50IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCBpbnNlcnRJdGVtQmVmb3JlIDogJ2EgLT4gaW50IC0+ICdhIG1ldGhcblxuICAgIG1ldGhvZCByZXBsYWNlSXRlbSA6ICdhIC0+IGludCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgcmVtb3ZlSXRlbSA6IGludCAtPiAnYSBtZXRoXG5cbiAgICBtZXRob2QgYXBwZW5kSXRlbSA6ICdhIC0+ICdhIG1ldGhcbiAgZW5kXG5cbigqKioqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBlbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBEb20uZWxlbWVudFxuXG4gICAgbWV0aG9kIGlkIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHhtbGJhc2UgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2Qgb3duZXJTVkdFbGVtZW50IDogc3ZnRWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2aWV3cG9ydEVsZW1lbnQgOiBlbGVtZW50IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkU3RyaW5nICopXG5hbmQgYW5pbWF0ZWRTdHJpbmcgPSBbanNfc3RyaW5nIHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZEJvb2xlYW4gKilcbmFuZCBhbmltYXRlZEJvb2xlYW4gPSBbYm9vbCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU3RyaW5nTGlzdCAqKVxuYW5kIHN0cmluZ0xpc3QgPSBbanNfc3RyaW5nIHRdIGxpc3RcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gKilcbmFuZCBhbmltYXRlZEVudW1lcmF0aW9uID0gW2ludCAoKnNob3J0KildIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZEludGVnZXIgKilcbmFuZCBhbmltYXRlZEludGVnZXIgPSBbaW50XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWROdW1iZXIgKilcbmFuZCBhbmltYXRlZE51bWJlciA9IFtmbG9hdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR051bWJlckxpc3QgKilcbmFuZCBudW1iZXJMaXN0ID0gW251bWJlciB0XSBsaXN0XG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZE51bWJlckxpc3QgKilcbmFuZCBhbmltYXRlZE51bWJlckxpc3QgPSBbbnVtYmVyTGlzdCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTGVuZ3RoICopXG5hbmQgbGVuZ3RoID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHVuaXRUeXBlIDogbGVuZ3RoVW5pdFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHZhbHVlSW5TcGVjaWZpZWRVbml0cyA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZUFzU3RyaW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIG5ld1ZhbHVlU3BlY2lmaWVkVW5pdHMgOiBsZW5ndGhVbml0VHlwZSAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb252ZXJ0VG9TcGVjaWZpZWRVbml0cyA6IGxlbmd0aFVuaXRUeXBlIC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkTGVuZ3RoICopXG5hbmQgYW5pbWF0ZWRMZW5ndGggPSBbbGVuZ3RoIHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdMZW5ndGhMaXN0ICopXG5hbmQgbGVuZ3RoTGlzdCA9IFtsZW5ndGggdF0gbGlzdFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRMZW5ndGhMaXN0ICopXG5hbmQgYW5pbWF0ZWRMZW5ndGhMaXN0ID0gW2xlbmd0aExpc3QgdF0gYW5pbWF0ZWRcblxuKCogaW50ZXJmYWNlIFNWR0FuZ2xlICopXG5hbmQgYW5nbGUgPVxuICBvYmplY3RcbiAgICBtZXRob2QgdW5pdFR5cGUgOiBhbmdsZVVuaXRUeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2YWx1ZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB2YWx1ZUluU3BlY2lmaWVkVW5pdHMgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgdmFsdWVBc1N0cmluZyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBuZXdWYWx1ZVNwZWNpZmllZFVuaXRzIDogYW5nbGVVbml0VHlwZSAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBjb252ZXJ0VG9TcGVjaWZpZWRVbml0cyA6IGFuZ2xlVW5pdFR5cGUgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZWRBbmdsZSAqKVxuYW5kIGFuaW1hdGVkQW5nbGUgPSBbYW5nbGUgdF0gYW5pbWF0ZWRcblxuKCogWFhYWFggTW92ZSBpdCAqKVxuYW5kIHJnYkNvbG9yID0gb2JqZWN0IGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQ29sb3IgKilcbmFuZCBjb2xvciA9XG4gIG9iamVjdFxuICAgICgqIFhYWCBpbmhlcml0IGNzc1ZhbHVlICopXG4gICAgbWV0aG9kIGNvbG9yVHlwZSA6IGNvbG9yVHlwZSByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmdiQ29sb3IgOiByZ2JDb2xvciB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpY2NDb2xvciA6IGljY0NvbG9yIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNldFJHQkNvbG9yIDoganNfc3RyaW5nIHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0UkdCQ29sb3JJQ0NDb2xvciA6IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldENvbG9yIDogY29sb3JUeXBlIC0+IGpzX3N0cmluZyB0IC0+IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0lDQ0NvbG9yICopXG5hbmQgaWNjQ29sb3IgPVxuICBvYmplY3RcbiAgICBtZXRob2QgY29sb3JQcm9maWxlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGNvbG9ycyA6IG51bWJlckxpc3QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUmVjdCAqKVxuYW5kIHJlY3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFJlY3QgKilcbmFuZCBhbmltYXRlZFJlY3QgPSBbcmVjdCB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU3R5bGFibGUgKilcbmFuZCBzdHlsYWJsZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBjbGFzc05hbWUgOiBhbmltYXRlZFN0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzdHlsZSA6IERvbV9odG1sLmNzc1N0eWxlRGVjbGFyYXRpb24gdCByZWFkb25seV9wcm9wXG4gICAgKCogICBDU1NWYWx1ZSBnZXRQcmVzZW50YXRpb25BdHRyaWJ1dGUoaW4gRE9NU3RyaW5nIG5hbWUpOyAqKVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0xvY2F0YWJsZSAqKVxuYW5kIGxvY2F0YWJsZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBuZWFyZXN0Vmlld3BvcnRFbGVtZW50IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmYXJ0aGVzdFZpZXdwb3J0RWxlbWVudCA6IGVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0QkJveCA6IHJlY3QgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q1RNIDogbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFNjcmVlbkNUTSA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRUcmFuc2Zvcm1Ub0VsZW1lbnQgOiBlbGVtZW50IHQgLT4gbWF0cml4IHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RyYW5zZm9ybWFibGUgKilcbmFuZCB0cmFuc2Zvcm1hYmxlID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBsb2NhdGFibGVcblxuICAgIG1ldGhvZCB0cmFuc2Zvcm0gOiBhbmltYXRlZFRyYW5zZm9ybUxpc3QgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVGVzdHMgKilcbmFuZCB0ZXN0cyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCByZXF1aXJlZEZlYXR1cmVzIDogc3RyaW5nTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByZXF1aXJlZEV4dGVuc2lvbnMgOiBzdHJpbmdMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHN5c3RlbUxhbmd1YWdlIDogc3RyaW5nTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoYXNFeHRlbnNpb24gOiBqc19zdHJpbmcgdCAtPiBib29sIHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0xhbmdTcGFjZSAqKVxuYW5kIGxhbmdTcGFjZSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB4bWxsYW5nIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHhtbHNwYWNlIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQgKilcbmFuZCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQgOiBhbmltYXRlZEJvb2xlYW4gdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRml0VG9WaWV3Qm94ICopXG5hbmQgZml0VG9WaWV3Qm94ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHZpZXdCb3ggOiBhbmltYXRlZFJlY3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcHJlc2VydmVBc3BlY3RSYXRpbyA6IGFuaW1hdGVkUHJlc2VydmVBc3BlY3RSYXRpbyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdab29tQW5kUGFuICopXG5hbmQgem9vbUFuZFBhbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB6b29tQW5kUGFuIDogem9vbUFuZFBhblR5cGUgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1ZpZXdTcGVjICopXG5hbmQgdmlld1NwZWMgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHpvb21BbmRQYW5cblxuICAgIGluaGVyaXQgZml0VG9WaWV3Qm94XG5cbiAgICBtZXRob2QgdHJhbnNmb3JtIDogdHJhbnNmb3JtTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2aWV3VGFyZ2V0IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB2aWV3Qm94U3RyaW5nIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHByZXNlcnZlQXNwZWN0UmF0aW9TdHJpbmcgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdHJhbnNmb3JtU3RyaW5nIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHZpZXdUYXJnZXRTdHJpbmcgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVVJJUmVmZXJlbmNlICopXG5hbmQgdXJpUmVmZXJlbmNlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGhyZWYgOiBhbmltYXRlZFN0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdDU1NSdWxlIDogQ1NTUnVsZSAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDT0xPUl9QUk9GSUxFX1JVTEUgPSA3OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0RvY3VtZW50ICopXG5hbmQgZG9jdW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFtlbGVtZW50XSBEb20uZG9jdW1lbnRcblxuICAgICgqWFhYIGluaGVyaXQgZG9jdW1lbnRFdmVudCAqKVxuICAgIG1ldGhvZCB0aXRsZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCByZWZlcnJlciA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBkb21haW4gOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgX1VSTCA6IGpzX3N0cmluZyB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByb290RWxlbWVudCA6IHN2Z0VsZW1lbnQgdCBvcHQgcmVhZG9ubHlfcHJvcFxuICAgICgqIHJvb3RFbGVtZW50IHdpbGwgYmUgbnVsbCBvciB1bmRlZmluZWQgaW4gYW4gaHRtbCBjb250ZXh0ICopXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHU1ZHRWxlbWVudCAqKVxuYW5kIHN2Z0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgbG9jYXRhYmxlXG5cbiAgICBpbmhlcml0IGZpdFRvVmlld0JveFxuXG4gICAgaW5oZXJpdCB6b29tQW5kUGFuXG5cbiAgICAoKlhYWCBpbmhlcml0IGRvY3VtZW50ZXZlbnQsIHZpZXdjc3MsIGRvY3VtZW50Y3NzICopXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb250ZW50U2NyaXB0VHlwZSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBjb250ZW50U3R5bGVUeXBlIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIHZpZXdwb3J0IDogcmVjdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwaXhlbFVuaXRUb01pbGxpbWV0ZXJYIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBpeGVsVW5pdFRvTWlsbGltZXRlclkgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2NyZWVuUGl4ZWxVbml0VG9NaWxsaW1ldGVyWCA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBzY3JlZW5QaXhlbFVuaXRUb01pbGxpbWV0ZXJZIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHVzZUN1cnJlbnRWaWV3IDogYm9vbCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjdXJyZW50VmlldyA6IHZpZXdTcGVjIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGN1cnJlbnRTY2FsZSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCBjdXJyZW50VHJhbnNsYXRlIDogcG9pbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc3VzcGVuZFJlZHJhdyA6IGludCAtPiBzdXNwZW5kSGFuZGxlSUQgbWV0aFxuXG4gICAgbWV0aG9kIHVuc3VzcGVuZFJlZHJhdyA6IHN1c3BlbmRIYW5kbGVJRCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB1bnN1c3BlbmRSZWRyYXdBbGwgOiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBmb3JjZVJlZHJhdyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHBhdXNlQW5pbWF0aW9ucyA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHVucGF1c2VBbmltYXRpb25zIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYW5pbWF0aW9uc1BhdXNlZCA6IGJvb2wgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q3VycmVudFRpbWUgOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0Q3VycmVudFRpbWUgOiBpbnQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0SW50ZXJzZWN0aW9uTGlzdCA6IHJlY3QgdCAtPiBlbGVtZW50IHQgLT4gZWxlbWVudCBEb20ubm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RW5jbG9zdXJlTGlzdCA6IHJlY3QgdCAtPiBlbGVtZW50IHQgLT4gZWxlbWVudCBEb20ubm9kZUxpc3QgdCBtZXRoXG5cbiAgICBtZXRob2QgY2hlY2tJbnRlcnNlY3Rpb24gOiBlbGVtZW50IHQgLT4gcmVjdCB0IC0+IGJvb2wgdFxuXG4gICAgbWV0aG9kIGNoZWNrRW5jbG9zdXJlIDogZWxlbWVudCB0IC0+IHJlY3QgdCAtPiBib29sIHRcblxuICAgIG1ldGhvZCBkZXNlbGVjdEFsbCA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR051bWJlciA6IG51bWJlciB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdMZW5ndGggOiBsZW5ndGggdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHQW5nbGUgOiBhbmdsZSB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQb2ludCA6IHBvaW50IHQgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR01hdHJpeCA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdSZWN0IDogcmVjdCB0IG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdUcmFuc2Zvcm0gOiB0cmFuc2Zvcm0gdCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHVHJhbnNmb3JtRnJvbU1hdHJpeCA6IG1hdHJpeCB0IC0+IHRyYW5zZm9ybSB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRFbGVtZW50QnlJZCA6IGpzX3N0cmluZyB0IC0+IERvbS5lbGVtZW50IHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0dFbGVtZW50ICopXG5hbmQgZ0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0RlZnNFbGVtZW50ICopXG5hbmQgZGVmc0VsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuICAgICgqIFhYWFhYWFggPyBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0ICopXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRGVzY0VsZW1lbnQgKilcbmFuZCBkZXNjRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgICAoKiBYWFhYWFhYID8gaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldCAqKVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RpdGxlRWxlbWVudCAqKVxuYW5kIHRpdGxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdTeW1ib2xFbGVtZW50ICopXG5hbmQgc3ltYm9sRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCBmaXRUb1ZpZXdCb3hcblxuICAgIGluaGVyaXQgRG9tX2h0bWwuZXZlbnRUYXJnZXRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdVc2VFbGVtZW50ICopXG5hbmQgdXNlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpbnN0YW5jZVJvb3QgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYW5pbWF0ZWRJbnN0YW5jZVJvb3QgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG5hbmQgZWxlbWVudEluc3RhbmNlID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIGNvcnJlc3BvbmRpbmdFbGVtZW50IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjb3JyZXNwb25kaW5nVXNlRWxlbWVudCA6IHVzZUVsZW1lbnQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcGFyZW50Tm9kZSA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjaGlsZE5vZGVzIDogZWxlbWVudEluc3RhbmNlTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaXJzdENoaWxkIDogZWxlbWVudEluc3RhbmNlIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RDaGlsZCA6IGVsZW1lbnRJbnN0YW5jZSB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBwcmV2aW91c1NpYmxpbmcgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgbmV4dFNpYmxpbmcgOiBlbGVtZW50SW5zdGFuY2UgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRWxlbWVudEluc3RhbmNlTGlzdCAqKVxuYW5kIGVsZW1lbnRJbnN0YW5jZUxpc3QgPVxuICBvYmplY3RcbiAgICBtZXRob2QgbGVuZ3RoIDogaW50IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBpdGVtIDogaW50IC0+IGVsZW1lbnRJbnN0YW5jZSB0XG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHSW1hZ2VFbGVtZW50ICopXG5hbmQgaW1hZ2VFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICAgICgqIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW8gcHJlc2VydmVBc3BlY3RSYXRpbyAqKVxuICBlbmRcblxuYW5kIHN3aXRjaEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuICBlbmRcblxuKCogWFhYIGRlcHJlY2F0ZWQgPT4gaW50ZXJmYWNlIEdldFNWR0RvY3VtZW50ID0+IFNWR0RvY3VtZW50IGdldFNWR0RvY3VtZW50KCkgKilcblxuKCogaW50ZXJmYWNlIFNWR1N0eWxlRWxlbWVudCAqKVxuYW5kIHN0eWxlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIG1ldGhvZCB0eXBlXyA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCBtZWRpYSA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB0aXRsZSA6IGpzX3N0cmluZyB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQb2ludCAqKVxuYW5kIHBvaW50ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHggOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtYXRyaXhUcmFuc2Zvcm0gOiBtYXRyaXggdCAtPiBwb2ludCB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQb2ludExpc3QgKilcbmFuZCBwb2ludExpc3QgPSBbcG9pbnQgdF0gbGlzdFxuXG4oKiBpbnRlcmZhY2UgU1ZHTWF0cml4ICopXG5hbmQgbWF0cml4ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGEgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYiA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGQgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZSA6IGZsb2F0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmIDogZmxvYXQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG11bHRpcGx5IDogbWF0cml4IHQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIGludmVyc2UgOiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2QgdHJhbnNsYXRlIDogZmxvYXQgLT4gZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNjYWxlIDogZmxvYXQgLT4gbWF0cml4IHQgbWV0aFxuXG4gICAgbWV0aG9kIHNjYWxlTm9uVW5pZm9ybSA6IGZsb2F0IC0+IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCByb3RhdGUgOiBmbG9hdCAtPiBtYXRyaXggdCBtZXRoXG5cbiAgICBtZXRob2Qgcm90YXRlRnJvbVZlY3RvciA6IGZsb2F0IC0+IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBmbGlwWCA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBmbGlwWSA6IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBza2V3WCA6IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcblxuICAgIG1ldGhvZCBza2V3WSA6IGZsb2F0IC0+IG1hdHJpeCB0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdUcmFuc2Zvcm0gKilcbmFuZCB0cmFuc2Zvcm0gPVxuICBvYmplY3RcbiAgICBtZXRob2QgX3R5cGUgOiB0cmFuc2Zvcm1UeXBlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtYXRyaXggOiBtYXRyaXggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYW5nbGUgOiBmbG9hdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2V0TWF0cml4IDogbWF0cml4IHQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0VHJhbnNsYXRlIDogZmxvYXQgLT4gZmxvYXQgLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2Qgc2V0U2NhbGUgOiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRSb3RhdGUgOiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBzZXRTa2V3WCA6IGZsb2F0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHNldFNrZXdZIDogZmxvYXQgLT4gdW5pdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHVHJhbnNmb3JtTGlzdCAqKVxuYW5kIHRyYW5zZm9ybUxpc3QgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IFt0cmFuc2Zvcm0gdF0gbGlzdFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1RyYW5zZm9ybUZyb21NYXRyaXggOiBtYXRyaXggLT4gdHJhbnNmb3JtIHQgbWV0aFxuXG4gICAgbWV0aG9kIGNvbnNvbGlkYXRlIDogdHJhbnNmb3JtIHQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVkVHJhbnNmb3JtTGlzdCAqKVxuYW5kIGFuaW1hdGVkVHJhbnNmb3JtTGlzdCA9IFt0cmFuc2Zvcm1MaXN0IHRdIGFuaW1hdGVkXG5cbigqIGludGVyZmFjZSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvICopXG5hbmQgcHJlc2VydmVBc3BlY3RSYXRpbyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBhbGlnbiA6IGFsaWdubWVudFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1lZXRPclNsaWNlIDogbWVldE9yU2xpY2VUeXBlIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW8gKilcbmFuZCBhbmltYXRlZFByZXNlcnZlQXNwZWN0UmF0aW8gPSBbcHJlc2VydmVBc3BlY3RSYXRpbyB0XSBhbmltYXRlZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZyAqKVxuYW5kIHBhdGhTZWcgPVxuICBvYmplY3RcbiAgICBtZXRob2QgcGF0aFNlZ1R5cGUgOiBwYXRoU2VnbWVudFR5cGUgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHBhdGhTZWdUeXBlQXNMZXR0ZXIgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0Nsb3NlUGF0aCAqKVxuYW5kIHBhdGhTZWdDbG9zZVBhdGggPSBwYXRoU2VnXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTW92ZXRvQWJzICopXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ01vdmV0b1JlbCAqKVxuYW5kIHBhdGhTZWdNb3ZldG8gPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0xpbmV0b0FicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9SZWwgKilcbmFuZCBwYXRoU2VnTGluZXRvID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b0N1YmljUmVsICopXG5hbmQgcGF0aFNlZ0N1cnZldG9DdWJpYyA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgcGF0aFNlZ1xuXG4gICAgbWV0aG9kIHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB4MSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5MSA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB4MiA6IGZsb2F0IHByb3BcblxuICAgIG1ldGhvZCB5MiA6IGZsb2F0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0FicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljUmVsICopXG5hbmQgcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWMgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeDEgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgeTEgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGF0aFNlZ0FyY0FicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdBcmNSZWwqKVxuYW5kIHBhdGhTZWdBcmMgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB5IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHIxIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHIyIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGFuZ2xlIDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIGxhcmdlQXJjRmxhZyA6IGJvb2wgdCBwcm9wXG5cbiAgICBtZXRob2Qgc3dlZXBGbGFnIDogYm9vbCB0IHByb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvSG9yaXpvbnRhbEFicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdMaW5ldG9Ib3Jpem9udGFsUmVsICopXG5hbmQgcGF0aFNlZ0xpbmV0b0hvcml6b250YWwgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB4IDogZmxvYXRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvVmVydGljYWxBYnMgKilcbigqIGludGVyZmFjZSBTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwgKilcbmFuZCBwYXRoU2VnTGluZXRvVmVydGljYWwgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHBhdGhTZWdcblxuICAgIG1ldGhvZCB5IDogZmxvYXRcbiAgZW5kXG5cbmFuZCBwYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0XG5cbiAgICBtZXRob2QgeSA6IGZsb2F0XG5cbiAgICBtZXRob2QgeDIgOiBmbG9hdFxuXG4gICAgbWV0aG9kIHkyIDogZmxvYXRcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyAqKVxuKCogaW50ZXJmYWNlIFNWR1BhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoUmVsICAqKVxuYW5kIHBhdGhTZWdDdXJ2ZXRvUXVhZHJhdGljU21vb3RoID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBwYXRoU2VnXG5cbiAgICBtZXRob2QgeCA6IGZsb2F0XG5cbiAgICBtZXRob2QgeSA6IGZsb2F0XG4gIGVuZFxuXG5hbmQgcGF0aFNlZ0xpc3QgPSBbcGF0aFNlZyB0XSBsaXN0XG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFBhdGhEYXRhICopXG5hbmQgYW5pbWF0ZWRQYXRoRGF0YSA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBwYXRoU2VnTGlzdCA6IHBhdGhTZWdMaXN0IHQgcHJvcFxuXG4gICAgbWV0aG9kIG5vcm1hbGl6ZWRQYXRoU2VnTGlzdCA6IHBhdGhTZWdMaXN0IHQgcHJvcFxuXG4gICAgbWV0aG9kIGFuaW1hdGVkUGF0aFNlZ0xpc3QgOiBwYXRoU2VnTGlzdCB0IHByb3BcblxuICAgIG1ldGhvZCBhbmltYXRlZE5vcm1hbGl6ZWRQYXRoU2VnTGlzdCA6IHBhdGhTZWdMaXN0IHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BhdGhFbGVtZW50ICopXG5hbmQgcGF0aEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgaW5oZXJpdCBhbmltYXRlZFBhdGhEYXRhXG5cbiAgICBtZXRob2QgcGF0aExlbmd0aCA6IGFuaW1hdGVkTnVtYmVyIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldFRvdGFsTGVuZ3RoIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFBvaW50QXRMZW5ndGggOiBmbG9hdCAtPiBwb2ludCB0IG1ldGhcblxuICAgIG1ldGhvZCBnZXRQYXRoU2VnQXRMZW5ndGggOiBmbG9hdCAtPiBpbnRcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ2xvc2VQYXRoIDogcGF0aFNlZ0Nsb3NlUGF0aCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ01vdmV0b0FicyA6IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdNb3ZldG8gbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdNb3ZldG9SZWwgOiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnTW92ZXRvIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvQWJzIDogZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0xpbmV0byBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1JlbCA6IGZsb2F0IC0+IGZsb2F0IC0+IHBhdGhTZWdMaW5ldG8gbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNBYnMgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9DdWJpYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1JlbCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b0N1YmljIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY0FicyA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNSZWwgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWMgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdBcmNBYnMgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gYm9vbCB0IC0+IGJvb2wgdCAtPiBwYXRoU2VnQXJjIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQXJjUmVsIDpcbiAgICAgIGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wgdCAtPiBib29sIHQgLT4gcGF0aFNlZ0FyYyBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxBYnMgOiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvSG9yaXpvbnRhbCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b0hvcml6b250YWxSZWwgOiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvSG9yaXpvbnRhbCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0xpbmV0b1ZlcnRpY2FsQWJzIDogZmxvYXQgLT4gcGF0aFNlZ0xpbmV0b1ZlcnRpY2FsIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnTGluZXRvVmVydGljYWxSZWwgOiBmbG9hdCAtPiBwYXRoU2VnTGluZXRvVmVydGljYWwgbWV0aFxuXG4gICAgbWV0aG9kIGNyZWF0ZVNWR1BhdGhTZWdDdXJ2ZXRvQ3ViaWNTbW9vdGhBYnMgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9DdWJpY1Ntb290aFJlbCA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b0N1YmljU21vb3RoIG1ldGhcblxuICAgIG1ldGhvZCBjcmVhdGVTVkdQYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aEFicyA6XG4gICAgICBmbG9hdCAtPiBmbG9hdCAtPiBwYXRoU2VnQ3VydmV0b1F1YWRyYXRpY1Ntb290aCBtZXRoXG5cbiAgICBtZXRob2QgY3JlYXRlU1ZHUGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGhSZWwgOlxuICAgICAgZmxvYXQgLT4gZmxvYXQgLT4gcGF0aFNlZ0N1cnZldG9RdWFkcmF0aWNTbW9vdGggbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1JlY3RFbGVtZW50ICopXG5hbmQgcmVjdEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJ5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQ2lyY2xlRWxlbWVudCAqKVxuYW5kIGNpcmNsZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgbWV0aG9kIGN4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3kgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRWxsaXBzZUVsZW1lbnQgKilcbmFuZCBlbGxpcHNlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgY3ggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJ4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcnkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdMaW5lRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBsaW5lRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBpbmhlcml0IERvbV9odG1sLmV2ZW50VGFyZ2V0XG5cbiAgICBtZXRob2QgeDEgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5MSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHgyIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeTIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRlZFBvaW50cyAqKVxuYW5kIGFuaW1hdGVkUG9pbnRzID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHBvaW50cyA6IHBvaW50TGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhbmltYXRlZHBvaW50cyA6IHBvaW50TGlzdCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQb2x5bGluZUVsZW1lbnQgKilcbmFuZCBwb2x5TGluZUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgaW5oZXJpdCBhbmltYXRlZFBvaW50c1xuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1BvbHlnb25FbGVtZW50ICopXG5hbmQgcG9seWdvbkVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdGVzdHNcblxuICAgIGluaGVyaXQgbGFuZ1NwYWNlXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuXG4gICAgaW5oZXJpdCBhbmltYXRlZFBvaW50c1xuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RleHRDb250ZW50RWxlbWVudCAqKVxuYW5kIHRleHRDb250ZW50RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCBEb21faHRtbC5ldmVudFRhcmdldFxuXG4gICAgbWV0aG9kIHRleHRMZW5ndGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsZW5ndGhBZGp1c3QgOiBsZW5ndGhBZGp1c3QgYW5pbWF0ZWQgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZ2V0TnVtYmVyT2ZDaGFycyA6IGludCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoIDogZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFN1YlN0cmluZ0xlbmd0aCA6IGludCAtPiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldFN0YXJ0UG9zaXRpb25PZkNoYXIgOiBpbnQgLT4gcG9pbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RW5kUG9zaXRpb25PZkNoYXIgOiBpbnQgLT4gcG9pbnQgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0RXh0ZW50T2ZDaGFyIDogaW50IC0+IHJlY3QgdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Um90YXRpb25PZkNoYXIgOiBpbnQgLT4gZmxvYXQgbWV0aFxuXG4gICAgbWV0aG9kIGdldENoYXJOdW1BdFBvc2l0aW9uIDogcG9pbnQgLT4gaW50IG1ldGhcblxuICAgIG1ldGhvZCBzZWxlY3RTdWJTdHJpbmcgOiBpbnQgLT4gaW50IC0+IHVuaXQgbWV0aFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQgKilcbmFuZCB0ZXh0UG9zaXRpb25pbmdFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB0ZXh0Q29udGVudEVsZW1lbnRcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGhMaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZHggOiBhbmltYXRlZExlbmd0aExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZHkgOiBhbmltYXRlZExlbmd0aExpc3QgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgcm90YXRlIDogYW5pbWF0ZWROdW1iZXJMaXN0IHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RleHRFbGVtZW50ICopXG5hbmQgdGV4dEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHRleHRQb3NpdGlvbmluZ0VsZW1lbnRcblxuICAgIGluaGVyaXQgdHJhbnNmb3JtYWJsZVxuICBlbmRcblxuYW5kIHRzcGFuRWxlbWVudCA9IHRleHRQb3NpdGlvbmluZ0VsZW1lbnRcblxuYW5kIHRyZWZFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCB0ZXh0UG9zaXRpb25pbmdFbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1RleHRQYXRoRWxlbWVudCAqKVxuYW5kIHRleHRQYXRoRWxlbWVudE1ldGhvZCA9IFt0ZXh0UGF0aE1ldGhvZFR5cGVdIGFuaW1hdGVkXG5cbmFuZCB0ZXh0UGF0aEVsZW1lbnRTcGFjaW5nID0gW3RleHRQYXRoU3BhY2luZ1R5cGVdIGFuaW1hdGVkXG5cbmFuZCB0ZXh0UGF0aEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHRleHRDb250ZW50RWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIG1ldGhvZCBzdGFydE9mZnNldCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1ldGhvZF8gOiB0ZXh0UGF0aEVsZW1lbnRNZXRob2QgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNwYWNpbmcgOiB0ZXh0UGF0aEVsZW1lbnRTcGFjaW5nIHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdBbHRHbHlwaEVsZW1lbnQgKilcbmFuZCBhbHRHbHlwaEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IHRleHRQb3NpdGlvbmluZ0VsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBtZXRob2QgZ2x5cGhSZWYgOiBqc19zdHJpbmcgdCBwcm9wXG5cbiAgICBtZXRob2QgZm9ybWF0IDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FsdEdseXBoRGVmRWxlbWVudCAqKVxuYW5kIGFsdEdseXBoRGVmRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0FsdEdseXBoSXRlbUVsZW1lbnQgKilcbmFuZCBhbHRHbHlwaEl0ZW1FbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHR2x5cGhSZWZFbGVtZW50ICopXG5hbmQgZ2x5cGhSZWZFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgbWV0aG9kIGdseXBoUmVmIDoganNfc3RyaW5nIHQgcHJvcFxuXG4gICAgbWV0aG9kIGZvcm1hdCA6IGpzX3N0cmluZyB0IHByb3BcblxuICAgIG1ldGhvZCB4IDogZmxvYXQgcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgZHggOiBmbG9hdCBwcm9wXG5cbiAgICBtZXRob2QgZHkgOiBmbG9hdCBwcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHUGFpbnQgOiBTVkdDb2xvciB7ICopXG5cbigqICAgLy8gUGFpbnQgVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9SR0JDT0xPUiA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfUkdCQ09MT1JfSUNDQ09MT1IgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX05PTkUgPSAxMDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfQ1VSUkVOVENPTE9SID0gMTAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VSSV9OT05FID0gMTAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VSSV9DVVJSRU5UQ09MT1IgPSAxMDQ7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19QQUlOVFRZUEVfVVJJX1JHQkNPTE9SID0gMTA1OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfUEFJTlRUWVBFX1VSSV9SR0JDT0xPUl9JQ0NDT0xPUiA9IDEwNjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1BBSU5UVFlQRV9VUkkgPSAxMDc7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHBhaW50VHlwZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1cmk7ICopXG5cbigqICAgdm9pZCBzZXRVcmkoaW4gRE9NU3RyaW5nIHVyaSk7ICopXG4oKiAgIHZvaWQgc2V0UGFpbnQoaW4gdW5zaWduZWQgc2hvcnQgcGFpbnRUeXBlLCBpbiBET01TdHJpbmcgdXJpLCBpbiBET01TdHJpbmcgcmdiQ29sb3IsIGluIERPTVN0cmluZyBpY2NDb2xvcikgcmFpc2VzKFNWR0V4Y2VwdGlvbik7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHTWFya2VyRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0xhbmdTcGFjZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHU3R5bGFibGUsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpdFRvVmlld0JveCB7ICopXG5cbigqICAgLy8gTWFya2VyIFVuaXQgVHlwZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUlVOSVRTX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSVU5JVFNfVVNFUlNQQUNFT05VU0UgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSVU5JVFNfU1RST0tFV0lEVEggPSAyOyAqKVxuXG4oKiAgIC8vIE1hcmtlciBPcmllbnRhdGlvbiBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfTUFSS0VSX09SSUVOVF9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01BUktFUl9PUklFTlRfQVVUTyA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NQVJLRVJfT1JJRU5UX0FOR0xFID0gMjsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggcmVmWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIHJlZlk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG1hcmtlclVuaXRzOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggbWFya2VyV2lkdGg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCBtYXJrZXJIZWlnaHQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIG9yaWVudFR5cGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEFuZ2xlIG9yaWVudEFuZ2xlOyAqKVxuXG4oKiAgIHZvaWQgc2V0T3JpZW50VG9BdXRvKCkgcmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiAgIHZvaWQgc2V0T3JpZW50VG9BbmdsZShpbiBTVkdBbmdsZSBhbmdsZSkgcmFpc2VzKERPTUV4Y2VwdGlvbik7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHQ29sb3JQcm9maWxlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR1VSSVJlZmVyZW5jZSwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHUmVuZGVyaW5nSW50ZW50IHsgKilcbigqICAgYXR0cmlidXRlIERPTVN0cmluZyBsb2NhbDsgKilcbigqICAgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lOyAqKVxuKCogICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVuZGVyaW5nSW50ZW50OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0NvbG9yUHJvZmlsZVJ1bGUgOiBTVkdDU1NSdWxlLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdSZW5kZXJpbmdJbnRlbnQgeyAqKVxuKCogICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNyYyBzZXRyYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqICAgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lIHNldHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVuZGVyaW5nSW50ZW50IHNldHJhaXNlcyhET01FeGNlcHRpb24pOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0dyYWRpZW50RWxlbWVudCAqKVxuYW5kIGFuaW1hdGVkU3ByZWFkTWV0aG9kID0gW3NwcmVhZE1ldGhvZFR5cGVdIGFuaW1hdGVkXG5cbmFuZCBncmFkaWVudEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIGdyYWRpZW50VW5pdHM7ICopXG4gICAgbWV0aG9kIGdyYWRpZW50VHJhbnNmb3JtIDogYW5pbWF0ZWRUcmFuc2Zvcm1MaXN0IHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNwcmVhZE1ldGhvZCA6IGFuaW1hdGVkU3ByZWFkTWV0aG9kIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0xpbmVhckdyYWRpZW50RWxlbWVudCAqKVxuYW5kIGxpbmVhckdyYWRpZW50RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZ3JhZGllbnRFbGVtZW50XG5cbiAgICBtZXRob2QgeDEgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5MSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHgyIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeTIgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdSYWRpYWxHcmFkaWVudEVsZW1lbnQgKilcbmFuZCByYWRpYWxHcmFkaWVudEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGdyYWRpZW50RWxlbWVudFxuXG4gICAgbWV0aG9kIGN4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY3kgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgZnggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1N0b3BFbGVtZW50ICopXG5hbmQgc3RvcEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcblxuICAgIG1ldGhvZCBvZmZzZXQgOiBhbmltYXRlZE51bWJlciB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdQYXR0ZXJuRWxlbWVudCAqKVxuYW5kIHBhdHRlcm5FbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHVyaVJlZmVyZW5jZVxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCBmaXRUb1ZpZXdCb3hcblxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gcGF0dGVyblVuaXRzOyAqKVxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gcGF0dGVybkNvbnRlbnRVbml0czsgKilcbiAgICBtZXRob2QgcGF0dGVyblRyYW5zZm9ybSA6IGFuaW1hdGVkVHJhbnNmb3JtTGlzdCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQ2xpcFBhdGhFbGVtZW50ICopXG5hbmQgY2xpcFBhdGhFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIGNsaXBQYXRoVW5pdHM7ICopXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHTWFza0VsZW1lbnQgKilcbmFuZCBtYXNrRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBtYXNrVW5pdHM7ICopXG4gICAgKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBtYXNrQ29udGVudFVuaXRzOyAqKVxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpZHRoIDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgaGVpZ2h0IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHRmlsdGVyRWxlbWVudCAqKVxuYW5kIGZpbHRlckVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICAoKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIGZpbHRlclVuaXRzOyAqKVxuICAgICgqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gcHJpbWl0aXZlVW5pdHM7ICopXG4gICAgbWV0aG9kIHggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB5IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgd2lkdGggOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBoZWlnaHQgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBmaWx0ZXJSZXNYIDogYW5pbWF0ZWRJbnRlZ2VyIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGZpbHRlclJlc1kgOiBhbmltYXRlZEludGVnZXIgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgc2V0RmlsdGVyUmVzIDogaW50IC0+IGludCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgOiBTVkdTdHlsYWJsZSB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZExlbmd0aCB4OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggeTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTGVuZ3RoIHdpZHRoOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRMZW5ndGggaGVpZ2h0OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgcmVzdWx0OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFQmxlbmRFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gQmxlbmQgTW9kZSBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX05PUk1BTCA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfTVVMVElQTFkgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVCTEVORF9NT0RFX1NDUkVFTiA9IDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUJMRU5EX01PREVfREFSS0VOID0gNDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQkxFTkRfTU9ERV9MSUdIVEVOID0gNTsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBtb2RlOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFQ29sb3JNYXRyaXhFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gQ29sb3IgTWF0cml4IFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTE9STUFUUklYX1RZUEVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTE9STUFUUklYX1RZUEVfTUFUUklYID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09MT1JNQVRSSVhfVFlQRV9TQVRVUkFURSA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTE9STUFUUklYX1RZUEVfSFVFUk9UQVRFID0gMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09MT1JNQVRSSVhfVFlQRV9MVU1JTkFOQ0VUT0FMUEhBID0gNDsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiB0eXBlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXJMaXN0IHZhbHVlczsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUNvbXBvbmVudFRyYW5zZmVyRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50IDogU1ZHRWxlbWVudCB7ICopXG5cbigqICAgLy8gQ29tcG9uZW50IFRyYW5zZmVyIFR5cGVzICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfSURFTlRJVFkgPSAxOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT05FTlRUUkFOU0ZFUl9UWVBFX1RBQkxFID0gMjsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9ESVNDUkVURSA9IDM7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPTkVOVFRSQU5TRkVSX1RZUEVfTElORUFSID0gNDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9ORU5UVFJBTlNGRVJfVFlQRV9HQU1NQSA9IDU7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gdHlwZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyTGlzdCB0YWJsZVZhbHVlczsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNsb3BlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgaW50ZXJjZXB0OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgYW1wbGl0dWRlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZXhwb25lbnQ7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBvZmZzZXQ7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVGdW5jUkVsZW1lbnQgOiBTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudCB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVGdW5jR0VsZW1lbnQgOiBTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudCB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVGdW5jQkVsZW1lbnQgOiBTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudCB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVGdW5jQUVsZW1lbnQgOiBTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudCB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVDb21wb3NpdGVFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIENvbXBvc2l0ZSBPcGVyYXRvcnMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0ZFQ09NUE9TSVRFX09QRVJBVE9SX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfT1ZFUiA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9JTiA9IDI7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9PVVQgPSAzOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfQVRPUCA9IDQ7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19GRUNPTVBPU0lURV9PUEVSQVRPUl9YT1IgPSA1OyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRkVDT01QT1NJVEVfT1BFUkFUT1JfQVJJVEhNRVRJQyA9IDY7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gb3BlcmF0b3I7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGsyOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgazM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrNDsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIC8vIEVkZ2UgTW9kZSBWYWx1ZXMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0VER0VNT0RFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRURHRU1PREVfRFVQTElDQVRFID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0VER0VNT0RFX1dSQVAgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfRURHRU1PREVfTk9ORSA9IDM7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkSW50ZWdlciBvcmRlclg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEludGVnZXIgb3JkZXJZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXJMaXN0IGtlcm5lbE1hdHJpeDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGRpdmlzb3I7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBiaWFzOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRJbnRlZ2VyIHRhcmdldFg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEludGVnZXIgdGFyZ2V0WTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gZWRnZU1vZGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRCb29sZWFuIHByZXNlcnZlQWxwaGE7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3VyZmFjZVNjYWxlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZGlmZnVzZUNvbnN0YW50OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBrZXJuZWxVbml0TGVuZ3RoWTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRURpc3RhbnRMaWdodEVsZW1lbnQgOiBTVkdFbGVtZW50IHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGF6aW11dGg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBlbGV2YXRpb247ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVQb2ludExpZ2h0RWxlbWVudCA6IFNWR0VsZW1lbnQgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgeDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB6OyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFU3BvdExpZ2h0RWxlbWVudCA6IFNWR0VsZW1lbnQgeyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgeDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHk7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciB6OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgcG9pbnRzQXRYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgcG9pbnRzQXRZOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgcG9pbnRzQXRaOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3BlY3VsYXJFeHBvbmVudDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGxpbWl0aW5nQ29uZUFuZ2xlOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcblxuKCogICAvLyBDaGFubmVsIFNlbGVjdG9ycyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfQ0hBTk5FTF9VTktOT1dOID0gMDsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0NIQU5ORUxfUiA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19DSEFOTkVMX0cgPSAyOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfQ0hBTk5FTF9CID0gMzsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX0NIQU5ORUxfQSA9IDQ7ICopXG5cbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHNjYWxlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiB4Q2hhbm5lbFNlbGVjdG9yOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiB5Q2hhbm5lbFNlbGVjdG9yOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFRmxvb2RFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdGaWx0ZXJQcmltaXRpdmVTdGFuZGFyZEF0dHJpYnV0ZXMgeyAqKVxuXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzdGREZXZpYXRpb25YOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3RkRGV2aWF0aW9uWTsgKilcblxuKCogICB2b2lkIHNldFN0ZERldmlhdGlvbihpbiBmbG9hdCBzdGREZXZpYXRpb25YLCBpbiBmbG9hdCBzdGREZXZpYXRpb25ZKSByYWlzZXMoRE9NRXhjZXB0aW9uKTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdGRUltYWdlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdVUklSZWZlcmVuY2UsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdMYW5nU3BhY2UsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdFeHRlcm5hbFJlc291cmNlc1JlcXVpcmVkLCAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkUHJlc2VydmVBc3BlY3RSYXRpbyBwcmVzZXJ2ZUFzcGVjdFJhdGlvOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFTWVyZ2VFbGVtZW50IDogU1ZHRWxlbWVudCwgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVNZXJnZU5vZGVFbGVtZW50IDogU1ZHRWxlbWVudCB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVNb3JwaG9sb2d5RWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gTW9ycGhvbG9neSBPcGVyYXRvcnMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01PUlBIT0xPR1lfT1BFUkFUT1JfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19NT1JQSE9MT0dZX09QRVJBVE9SX0VST0RFID0gMTsgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX01PUlBIT0xPR1lfT1BFUkFUT1JfRElMQVRFID0gMjsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRTdHJpbmcgaW4xOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbiBvcGVyYXRvcjsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIHJhZGl1c1g7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciByYWRpdXNZOyAqKVxuKCogfTsgKilcblxuKCogaW50ZXJmYWNlIFNWR0ZFT2Zmc2V0RWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHRmlsdGVyUHJpbWl0aXZlU3RhbmRhcmRBdHRyaWJ1dGVzIHsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkU3RyaW5nIGluMTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGR4OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgZHk7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzdXJmYWNlU2NhbGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBzcGVjdWxhckNvbnN0YW50OyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc3BlY3VsYXJFeHBvbmVudDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkTnVtYmVyIGtlcm5lbFVuaXRMZW5ndGhYOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIga2VybmVsVW5pdExlbmd0aFk7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVUaWxlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZFN0cmluZyBpbjE7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRkVUdXJidWxlbmNlRWxlbWVudCA6IFNWR0VsZW1lbnQsICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0ZpbHRlclByaW1pdGl2ZVN0YW5kYXJkQXR0cmlidXRlcyB7ICopXG5cbigqICAgLy8gVHVyYnVsZW5jZSBUeXBlcyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfVFVSQlVMRU5DRV9UWVBFX1VOS05PV04gPSAwOyAqKVxuKCogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBTVkdfVFVSQlVMRU5DRV9UWVBFX0ZSQUNUQUxOT0lTRSA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19UVVJCVUxFTkNFX1RZUEVfVFVSQlVMRU5DRSA9IDI7ICopXG5cbigqICAgLy8gU3RpdGNoIE9wdGlvbnMgKilcbigqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1ZHX1NUSVRDSFRZUEVfVU5LTk9XTiA9IDA7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19TVElUQ0hUWVBFX1NUSVRDSCA9IDE7ICopXG4oKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNWR19TVElUQ0hUWVBFX05PU1RJVENIID0gMjsgKilcblxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgYmFzZUZyZXF1ZW5jeVg7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZE51bWJlciBiYXNlRnJlcXVlbmN5WTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkSW50ZWdlciBudW1PY3RhdmVzOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHQW5pbWF0ZWROdW1iZXIgc2VlZDsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR0FuaW1hdGVkRW51bWVyYXRpb24gc3RpdGNoVGlsZXM7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTVkdBbmltYXRlZEVudW1lcmF0aW9uIHR5cGU7ICopXG4oKiB9OyAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHQ3Vyc29yRWxlbWVudCAqKVxuYW5kIGN1cnNvckVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIG1ldGhvZCB4IDogYW5pbWF0ZWRMZW5ndGggdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgeSA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FFbGVtZW50ICopXG5hbmQgYUVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgdXJpUmVmZXJlbmNlXG5cbiAgICBpbmhlcml0IHRlc3RzXG5cbiAgICBpbmhlcml0IGxhbmdTcGFjZVxuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG5cbiAgICBpbmhlcml0IHRyYW5zZm9ybWFibGVcblxuICAgIG1ldGhvZCB0YXJnZXQgOiBhbmltYXRlZFN0cmluZyB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdWaWV3RWxlbWVudCAqKVxuYW5kIHZpZXdFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBlbGVtZW50XG5cbiAgICBpbmhlcml0IGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcblxuICAgIGluaGVyaXQgZml0VG9WaWV3Qm94XG5cbiAgICBpbmhlcml0IHpvb21BbmRQYW5cblxuICAgIG1ldGhvZCB2aWV3VGFyZ2V0IDogc3RyaW5nTGlzdCB0IHJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdTY3JpcHRFbGVtZW50ICopXG5hbmQgc2NyaXB0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgbWV0aG9kIHR5cGVfIDoganNfc3RyaW5nIHQgcHJvcFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1pvb21FdmVudCA6IFVJRXZlbnQgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR1JlY3Qgem9vbVJlY3RTY3JlZW47ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBwcmV2aW91c1NjYWxlOyAqKVxuKCogICByZWFkb25seSBhdHRyaWJ1dGUgU1ZHUG9pbnQgcHJldmlvdXNUcmFuc2xhdGU7ICopXG4oKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBuZXdTY2FsZTsgKilcbigqICAgcmVhZG9ubHkgYXR0cmlidXRlIFNWR1BvaW50IG5ld1RyYW5zbGF0ZTsgKilcbigqIH07ICopXG5cbigqIGludGVyZmFjZSBTVkdBbmltYXRpb25FbGVtZW50ICopXG5hbmQgYW5pbWF0aW9uRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXG5cbiAgICAoKiBpbmhlcml0IGVsZW1lbnRUaW1lQ29udHJvbCAqKVxuICAgIG1ldGhvZCB0YXJnZXRFbGVtZW50IDogZWxlbWVudCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBnZXRTdGFydFRpbWUgOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0Q3VycmVudFRpbWUgOiBmbG9hdCBtZXRoXG5cbiAgICBtZXRob2QgZ2V0U2ltcGxlRHVyYXRpb24gOiBmbG9hdCBtZXRoXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZUVsZW1lbnQgKilcbmFuZCBhbmltYXRlRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgYW5pbWF0aW9uRWxlbWVudFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR1NldEVsZW1lbnQgKilcbmFuZCBzZXRFbGVtZW50ID0gYW5pbWF0aW9uRWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnQgKilcbmFuZCBhbmltYXRlTW90aW9uRWxlbWVudCA9IGFuaW1hdGlvbkVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR01QYXRoRWxlbWVudCAqKVxuYW5kIG1QYXRoRWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB1cmlSZWZlcmVuY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuICBlbmRcblxuKCogaW50ZXJmYWNlIFNWR0FuaW1hdGVDb2xvckVsZW1lbnQgKilcbmFuZCBhbmltYXRlQ29sb3JFbGVtZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBhbmltYXRpb25FbGVtZW50XG5cbiAgICBpbmhlcml0IHN0eWxhYmxlXG4gIGVuZFxuXG4oKiBpbnRlcmZhY2UgU1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQgKilcbmFuZCBhbmltYXRlVHJhbnNmb3JtRWxlbWVudCA9IGFuaW1hdGlvbkVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRFbGVtZW50ICopXG5hbmQgZm9udEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdHbHlwaEVsZW1lbnQgKilcbigqIGludGVyZmFjZSBTVkdNaXNzaW5nR2x5cGhFbGVtZW50KilcbmFuZCBnbHlwaEVsZW1lbnQgPVxuICBvYmplY3RcbiAgICBpbmhlcml0IGVsZW1lbnRcblxuICAgIGluaGVyaXQgc3R5bGFibGVcbiAgZW5kXG5cbigqIGludGVyZmFjZSBTVkdIS2VybkVsZW1lbnQgOiBTVkdFbGVtZW50ICopXG4oKiBpbnRlcmZhY2UgU1ZHVktlcm5FbGVtZW50IDogU1ZHRWxlbWVudCAqKVxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEZhY2VFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvbnRGYWNlRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRGYWNlU3JjRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb250RmFjZVNyY0VsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb250RmFjZVVyaUVsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9udEZhY2VVcmlFbGVtZW50ID0gZWxlbWVudFxuXG4oKiBpbnRlcmZhY2UgU1ZHRm9udEZhY2VGb3JtYXRFbGVtZW50ICopXG5jbGFzcyB0eXBlIGZvbnRGYWNlRm9ybWF0RWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR0ZvbnRGYWNlTmFtZUVsZW1lbnQgKilcbmNsYXNzIHR5cGUgZm9udEZhY2VOYW1lRWxlbWVudCA9IGVsZW1lbnRcblxuKCogaW50ZXJmYWNlIFNWR01ldGFkYXRhRWxlbWVudCAqKVxuY2xhc3MgdHlwZSBtZXRhZGF0YUVsZW1lbnQgPSBlbGVtZW50XG5cbigqIGludGVyZmFjZSBTVkdGb3JlaWduT2JqZWN0RWxlbWVudCAqKVxuY2xhc3MgdHlwZSBmb3JlaWduT2JqZWN0RWxlbWVudCA9XG4gIG9iamVjdFxuICAgIGluaGVyaXQgZWxlbWVudFxuXG4gICAgaW5oZXJpdCB0ZXN0c1xuXG4gICAgaW5oZXJpdCBsYW5nU3BhY2VcblxuICAgIGluaGVyaXQgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZFxuXG4gICAgaW5oZXJpdCBzdHlsYWJsZVxuXG4gICAgaW5oZXJpdCB0cmFuc2Zvcm1hYmxlXG5cbiAgICBtZXRob2QgeCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHkgOiBhbmltYXRlZExlbmd0aCB0IHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB3aWR0aCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlaWdodCA6IGFuaW1hdGVkTGVuZ3RoIHQgcmVhZG9ubHlfcHJvcFxuICBlbmRcblxubGV0IGNyZWF0ZUVsZW1lbnQgKGRvYyA6IGRvY3VtZW50IHQpIG5hbWUgPSBkb2MjI2NyZWF0ZUVsZW1lbnROUyB4bWxucyAoSnMuc3RyaW5nIG5hbWUpXG5cbmxldCB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBuYW1lID0gSnMuVW5zYWZlLmNvZXJjZSAoY3JlYXRlRWxlbWVudCBkb2MgbmFtZSlcblxubGV0IGNyZWF0ZUEgZG9jIDogYUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYVwiXG5cbmxldCBjcmVhdGVBbHRHbHlwaCBkb2MgOiBhbHRHbHlwaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYWx0Z2x5cGhcIlxuXG5sZXQgY3JlYXRlQWx0R2x5cGhEZWYgZG9jIDogYWx0R2x5cGhEZWZFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFsdGdseXBoZGVmXCJcblxubGV0IGNyZWF0ZUFsdEdseXBoSXRlbSBkb2MgOiBhbHRHbHlwaEl0ZW1FbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFsdGdseXBoaXRlbVwiXG5cbmxldCBjcmVhdGVBbmltYXRlIGRvYyA6IGFuaW1hdGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFuaW1hdGVcIlxuXG5sZXQgY3JlYXRlQW5pbWF0ZUNvbG9yIGRvYyA6IGFuaW1hdGVDb2xvckVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYW5pbWF0ZWNvbG9yXCJcblxubGV0IGNyZWF0ZUFuaW1hdGVNb3Rpb24gZG9jIDogYW5pbWF0ZU1vdGlvbkVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiYW5pbWF0ZW1vdGlvblwiXG5cbmxldCBjcmVhdGVBbmltYXRlVHJhbnNmb3JtIGRvYyA6IGFuaW1hdGVUcmFuc2Zvcm1FbGVtZW50IHQgPVxuICB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImFuaW1hdGV0cmFuc2Zvcm1cIlxuXG5sZXQgY3JlYXRlQ2lyY2xlIGRvYyA6IGNpcmNsZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiY2lyY2xlXCJcblxubGV0IGNyZWF0ZUNsaXBQYXRoIGRvYyA6IGNsaXBQYXRoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJjbGlwcGF0aFwiXG5cbigqIGxldCBjcmVhdGVDb2xvclByb2ZpbGUgZG9jIDogY29sb3JQcm9maWxlIHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImNvbG9yLXByb2ZpbGVcIiAqKVxubGV0IGNyZWF0ZUN1cnNvciBkb2MgOiBjdXJzb3JFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImN1cnNvclwiXG5cbmxldCBjcmVhdGVEZWZzIGRvYyA6IGRlZnNFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImRlZnNcIlxuXG5sZXQgY3JlYXRlRGVzYyBkb2MgOiBkZXNjRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJkZXNjXCJcblxubGV0IGNyZWF0ZUVsbGlwc2UgZG9jIDogZWxsaXBzZUVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZWxsaXBzZVwiXG5cbigqIGxldCBjcmVhdGVGZSogKilcbmxldCBjcmVhdGVGaWx0ZXIgZG9jIDogZmlsdGVyRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmaWx0ZXJcIlxuXG5sZXQgY3JlYXRlRm9udCBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250XCJcblxubGV0IGNyZWF0ZUZvbnRGYWNlIGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnQtZmFjZVwiXG5cbmxldCBjcmVhdGVGb250RmFjZUZvcm1hdCBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250LWZhY2UtZm9ybWF0XCJcblxubGV0IGNyZWF0ZUZvbnRGYWNlTmFtZSBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250LWZhY2UtbmFtZVwiXG5cbmxldCBjcmVhdGVGb250RmFjZVNyYyBkb2MgOiBmb250RWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb250LWZhY2Utc3JjXCJcblxubGV0IGNyZWF0ZUZvbnRGYWNlVXJpIGRvYyA6IGZvbnRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImZvbnQtZmFjZS11cmlcIlxuXG5sZXQgY3JlYXRlRm9yZWlnbk9iamVjdCBkb2MgOiBmb3JlaWduT2JqZWN0RWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJmb3JlaWduT2JqZWN0XCJcblxubGV0IGNyZWF0ZUcgZG9jIDogZ0VsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZ1wiXG5cbmxldCBjcmVhdGVHbHlwaCBkb2MgOiBnbHlwaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiZ2x5cGhcIlxuXG5sZXQgY3JlYXRlR2x5cGhSZWYgZG9jIDogZ2x5cGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImdseXBocmVmXCJcblxubGV0IGNyZWF0ZWhrZXJuIGRvYyA6IGVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwiaGtlcm5cIlxuXG5sZXQgY3JlYXRlSW1hZ2UgZG9jIDogaW1hZ2VFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImltYWdlXCJcblxubGV0IGNyZWF0ZUxpbmVFbGVtZW50IGRvYyA6IGxpbmVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcImxpbmVcIlxuXG5sZXQgY3JlYXRlTGluZWFyRWxlbWVudCBkb2MgOiBsaW5lYXJHcmFkaWVudEVsZW1lbnQgdCA9XG4gIHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibGluZWFyZ3JhZGllbnRcIlxuXG4oKiBsZXQgY3JlYXRlTWFya2VyIGRvYyA6IG1hcmtlckVsZW1lbnQgKilcbmxldCBjcmVhdGVNYXNrIGRvYyA6IG1hc2tFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1hc2tcIlxuXG5sZXQgY3JlYXRlTWV0YURhdGEgZG9jIDogbWV0YWRhdGFFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcIm1ldGFkYXRhXCJcblxubGV0IGNyZWF0ZU1pc3NpbmdHbHlwaCBkb2MgOiBnbHlwaEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibWlzc2luZy1nbHlwaFwiXG5cbmxldCBjcmVhdGVNUGF0aCBkb2MgOiBtUGF0aEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwibXBhdGhcIlxuXG5sZXQgY3JlYXRlUGF0aCBkb2MgOiBwYXRoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJwYXRoXCJcblxubGV0IGNyZWF0ZVBhdHRlcm4gZG9jIDogcGF0dGVybkVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwicGF0dGVyblwiXG5cbmxldCBjcmVhdGVQb2x5Z29uIGRvYyA6IHBvbHlnb25FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBvbHlnb25cIlxuXG5sZXQgY3JlYXRlUG9seWxpbmUgZG9jIDogcG9seUxpbmVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInBvbHlsaW5lXCJcblxubGV0IGNyZWF0ZVJhZGlhbGdyYWRpZW50IGRvYyA6IHJhZGlhbEdyYWRpZW50RWxlbWVudCB0ID1cbiAgdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJyYWRpYWxncmFkaWVudFwiXG5cbmxldCBjcmVhdGVSZWN0IGRvYyA6IHJlY3RFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInJlY3RcIlxuXG5sZXQgY3JlYXRlU2NyaXB0IGRvYyA6IHNjcmlwdEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic2NyaXB0XCJcblxubGV0IGNyZWF0ZVNldCBkb2MgOiBzZXRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInNldFwiXG5cbmxldCBjcmVhdGVTdG9wIGRvYyA6IHN0b3BFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN0b3BcIlxuXG5sZXQgY3JlYXRlU3R5bGUgZG9jIDogc3R5bGVFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN0eWxlXCJcblxubGV0IGNyZWF0ZVN2ZyBkb2MgOiBzdmdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInN2Z1wiXG5cbmxldCBjcmVhdGVTd2l0Y2ggZG9jIDogc3dpdGNoRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJzd2l0Y2hcIlxuXG5sZXQgY3JlYXRlU3ltYm9sIGRvYyA6IHN5bWJvbEVsZW1lbnQgdCA9IHVuc2FmZUNyZWF0ZUVsZW1lbnQgZG9jIFwic3ltYm9sXCJcblxubGV0IGNyZWF0ZVRleHRFbGVtZW50IGRvYyA6IHRleHRFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRleHRcIlxuXG5sZXQgY3JlYXRlVGV4dHBhdGggZG9jIDogdGV4dFBhdGhFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRleHRwYXRoXCJcblxubGV0IGNyZWF0ZVRpdGxlIGRvYyA6IHRpdGxlRWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ0aXRsZVwiXG5cbmxldCBjcmVhdGVUcmVmIGRvYyA6IHRyZWZFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRyZWZcIlxuXG5sZXQgY3JlYXRlVHNwYW4gZG9jIDogdHNwYW5FbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInRzcGFuXCJcblxubGV0IGNyZWF0ZVVzZSBkb2MgOiB1c2VFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInVzZVwiXG5cbmxldCBjcmVhdGVWaWV3IGRvYyA6IHZpZXdFbGVtZW50IHQgPSB1bnNhZmVDcmVhdGVFbGVtZW50IGRvYyBcInZpZXdcIlxuXG5sZXQgY3JlYXRldmtlcm4gZG9jIDogZWxlbWVudCB0ID0gdW5zYWZlQ3JlYXRlRWxlbWVudCBkb2MgXCJ2a2VyblwiXG5cbigqKioqKVxuXG5sZXQgc3ZnX2VsZW1lbnQgOiBlbGVtZW50IHQgY29uc3RyID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9TVkdFbGVtZW50XG5cbmxldCBkb2N1bWVudCA9IEpzLlVuc2FmZS5nbG9iYWwjIy5kb2N1bWVudFxuXG5sZXQgZ2V0RWxlbWVudEJ5SWQgaWQgOiBlbGVtZW50IHQgPVxuICBKcy5PcHQuY2FzZVxuICAgIChKcy5VbnNhZmUuZ2xvYmFsIyMuZG9jdW1lbnQjI2dldEVsZW1lbnRCeUlkIChKcy5zdHJpbmcgaWQpKVxuICAgIChmdW4gKCkgLT4gcmFpc2UgTm90X2ZvdW5kKVxuICAgIChmdW4gZSAtPiBpZiBKcy5pbnN0YW5jZW9mIGUgc3ZnX2VsZW1lbnQgdGhlbiBlIGVsc2UgcmFpc2UgTm90X2ZvdW5kKVxuXG5tb2R1bGUgQ29lcmNlVG8gPSBzdHJ1Y3RcbiAgbGV0IGVsZW1lbnQgKGUgOiAjRG9tLm5vZGUgSnMudCkgOiBlbGVtZW50IEpzLnQgSnMub3B0ID1cbiAgICBpZiBKcy5pbnN0YW5jZW9mIGUgc3ZnX2VsZW1lbnQgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpIGVsc2UgSnMubnVsbFxuXG4gIGxldCB1bnNhZmVDb2VyY2UgKGUgOiAjZWxlbWVudCB0KSB0YWcgPVxuICAgIGlmIGUjIy50YWdOYW1lIyN0b0xvd2VyQ2FzZSA9PSBKcy5zdHJpbmcgdGFnXG4gICAgdGhlbiBKcy5zb21lIChKcy5VbnNhZmUuY29lcmNlIGUpXG4gICAgZWxzZSBKcy5udWxsXG5cbiAgbGV0IGEgZSA6IGFFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhXCJcblxuICBsZXQgYWx0R2x5cGggZSA6IGFsdEdseXBoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYWx0Z2x5cGhcIlxuXG4gIGxldCBhbHRHbHlwaERlZiBlIDogYWx0R2x5cGhEZWZFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbHRnbHlwaGRlZlwiXG5cbiAgbGV0IGFsdEdseXBoSXRlbSBlIDogYWx0R2x5cGhJdGVtRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiYWx0Z2x5cGhpdGVtXCJcblxuICBsZXQgYW5pbWF0ZSBlIDogYW5pbWF0ZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFuaW1hdGVcIlxuXG4gIGxldCBhbmltYXRlQ29sb3IgZSA6IGFuaW1hdGVDb2xvckVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImFuaW1hdGVjb2xvclwiXG5cbiAgbGV0IGFuaW1hdGVNb3Rpb24gZSA6IGFuaW1hdGVNb3Rpb25FbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJhbmltYXRlbW90aW9uXCJcblxuICBsZXQgYW5pbWF0ZVRyYW5zZm9ybSBlIDogYW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnQgdCBvcHQgPVxuICAgIHVuc2FmZUNvZXJjZSBlIFwiYW5pbWF0ZXRyYW5zZm9ybVwiXG5cbiAgbGV0IGNpcmNsZSBlIDogY2lyY2xlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiY2lyY2xlXCJcblxuICBsZXQgY2xpcFBhdGggZSA6IGNsaXBQYXRoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiY2xpcHBhdGhcIlxuXG4gICgqIGxldCBDb2xvclByb2ZpbGUgZSA6IGNvbG9yUHJvZmlsZSB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiY29sb3ItcHJvZmlsZVwiICopXG4gIGxldCBjdXJzb3IgZSA6IGN1cnNvckVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImN1cnNvclwiXG5cbiAgbGV0IGRlZnMgZSA6IGRlZnNFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJkZWZzXCJcblxuICBsZXQgZGVzYyBlIDogZGVzY0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImRlc2NcIlxuXG4gIGxldCBlbGxpcHNlIGUgOiBlbGxpcHNlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZWxsaXBzZVwiXG5cbiAgKCogbGV0IEZlKiAqKVxuICBsZXQgZmlsdGVyIGUgOiBmaWx0ZXJFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmaWx0ZXJcIlxuXG4gIGxldCBmb250IGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udFwiXG5cbiAgbGV0IGZvbnRGYWNlIGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udC1mYWNlXCJcblxuICBsZXQgZm9udEZhY2VGb3JtYXQgZSA6IGZvbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJmb250LWZhY2UtZm9ybWF0XCJcblxuICBsZXQgZm9udEZhY2VOYW1lIGUgOiBmb250RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9udC1mYWNlLW5hbWVcIlxuXG4gIGxldCBmb250RmFjZVNyYyBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnQtZmFjZS1zcmNcIlxuXG4gIGxldCBmb250RmFjZVVyaSBlIDogZm9udEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImZvbnQtZmFjZS11cmlcIlxuXG4gIGxldCBmb3JlaWduT2JqZWN0IGUgOiBmb3JlaWduT2JqZWN0RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZm9yZWlnbm9iamVjdFwiXG5cbiAgbGV0IGcgZSA6IGdFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJnXCJcblxuICBsZXQgZ2x5cGggZSA6IGdseXBoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwiZ2x5cGhcIlxuXG4gIGxldCBnbHlwaFJlZiBlIDogZ2x5cGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJnbHlwaHJlZlwiXG5cbiAgbGV0IGhrZXJuIGUgOiBlbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJoa2VyblwiXG5cbiAgbGV0IGltYWdlIGUgOiBpbWFnZUVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcImltYWdlXCJcblxuICBsZXQgbGluZUVsZW1lbnQgZSA6IGxpbmVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJsaW5lXCJcblxuICBsZXQgbGluZWFyRWxlbWVudCBlIDogbGluZWFyR3JhZGllbnRFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJsaW5lYXJncmFkaWVudFwiXG5cbiAgKCogbGV0IE1hcmtlciBlIDogbWFya2VyRWxlbWVudCAqKVxuICBsZXQgbWFzayBlIDogbWFza0VsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcIm1hc2tcIlxuXG4gIGxldCBtZXRhRGF0YSBlIDogbWV0YWRhdGFFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJtZXRhZGF0YVwiXG5cbiAgbGV0IG1pc3NpbmdHbHlwaCBlIDogZ2x5cGhFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJtaXNzaW5nLWdseXBoXCJcblxuICBsZXQgbVBhdGggZSA6IG1QYXRoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwibXBhdGhcIlxuXG4gIGxldCBwYXRoIGUgOiBwYXRoRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwicGF0aFwiXG5cbiAgbGV0IHBhdHRlcm4gZSA6IHBhdHRlcm5FbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJwYXR0ZXJuXCJcblxuICBsZXQgcG9seWdvbiBlIDogcG9seWdvbkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInBvbHlnb25cIlxuXG4gIGxldCBwb2x5bGluZSBlIDogcG9seUxpbmVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJwb2x5bGluZVwiXG5cbiAgbGV0IHJhZGlhbGdyYWRpZW50IGUgOiByYWRpYWxHcmFkaWVudEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInJhZGlhbGdyYWRpZW50XCJcblxuICBsZXQgcmVjdCBlIDogcmVjdEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInJlY3RcIlxuXG4gIGxldCBzY3JpcHQgZSA6IHNjcmlwdEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInNjcmlwdFwiXG5cbiAgbGV0IHNldCBlIDogc2V0RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic2V0XCJcblxuICBsZXQgc3RvcCBlIDogc3RvcEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInN0b3BcIlxuXG4gIGxldCBzdHlsZSBlIDogc3R5bGVFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzdHlsZVwiXG5cbiAgbGV0IHN2ZyBlIDogc3ZnRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwic3ZnXCJcblxuICBsZXQgc3dpdGNoIGUgOiBzd2l0Y2hFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJzd2l0Y2hcIlxuXG4gIGxldCBzeW1ib2wgZSA6IHN5bWJvbEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInN5bWJvbFwiXG5cbiAgbGV0IHRleHRFbGVtZW50IGUgOiB0ZXh0RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidGV4dFwiXG5cbiAgbGV0IHRleHRwYXRoIGUgOiB0ZXh0UGF0aEVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInRleHRwYXRoXCJcblxuICBsZXQgdGl0bGUgZSA6IHRpdGxlRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidGl0bGVcIlxuXG4gIGxldCB0cmVmIGUgOiB0cmVmRWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidHJlZlwiXG5cbiAgbGV0IHRzcGFuIGUgOiB0c3BhbkVsZW1lbnQgdCBvcHQgPSB1bnNhZmVDb2VyY2UgZSBcInRzcGFuXCJcblxuICBsZXQgdXNlIGUgOiB1c2VFbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ1c2VcIlxuXG4gIGxldCB2aWV3IGUgOiB2aWV3RWxlbWVudCB0IG9wdCA9IHVuc2FmZUNvZXJjZSBlIFwidmlld1wiXG5cbiAgbGV0IHZrZXJuIGUgOiBlbGVtZW50IHQgb3B0ID0gdW5zYWZlQ29lcmNlIGUgXCJ2a2VyblwiXG5lbmRcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTQgSHVnbyBIZXV6YXJkXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5cbigqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFNvdXJjZSAqKVxub3BlbiBKc1xub3BlbiBEb21cbm9wZW4hIEltcG9ydFxuXG50eXBlIHN0YXRlID1cbiAgfCBDT05ORUNUSU5HXG4gIHwgT1BFTlxuICB8IENMT1NFRFxuXG5jbGFzcyB0eXBlIFsnYV0gbWVzc2FnZUV2ZW50ID1cbiAgb2JqZWN0XG4gICAgaW5oZXJpdCBbJ2FdIERvbS5ldmVudFxuXG4gICAgbWV0aG9kIGRhdGEgOiBqc19zdHJpbmcgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb3JpZ2luIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGxhc3RFdmVudElkIDoganNfc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuICAgICgqIG1ldGhvZCBzb3VyY2UgOiB1bml0ICopXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGV2ZW50U291cmNlID1cbiAgb2JqZWN0ICgnc2VsZilcbiAgICBtZXRob2QgdXJsIDogc3RyaW5nIHQgcmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHdpdGhDcmVkZW50aWFscyA6IGJvb2wgdCByZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgcmVhZHlTdGF0ZSA6IHN0YXRlIHJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBjbG9zZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIG9ub3BlbiA6ICgnc2VsZiB0LCAnc2VsZiBtZXNzYWdlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBvbm1lc3NhZ2UgOiAoJ3NlbGYgdCwgJ3NlbGYgbWVzc2FnZUV2ZW50IHQpIGV2ZW50X2xpc3RlbmVyIHdyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb25lcnJvciA6ICgnc2VsZiB0LCAnc2VsZiBtZXNzYWdlRXZlbnQgdCkgZXZlbnRfbGlzdGVuZXIgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgb3B0aW9ucyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCB3aXRoQ3JlZGVudGlhbHMgOiBib29sIHQgd3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmxldCB3aXRoQ3JlZGVudGlhbHMgYiA6IG9wdGlvbnMgdCA9XG4gIGxldCBpbml0ID0gSnMuVW5zYWZlLm9iaiBbfHxdIGluXG4gIGluaXQjIy53aXRoQ3JlZGVudGlhbHMgOj0gSnMuYm9vbCBiO1xuICBpbml0XG5cbmxldCBldmVudFNvdXJjZSA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fRXZlbnRTb3VyY2VcblxubGV0IGV2ZW50U291cmNlX29wdGlvbnMgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0V2ZW50U291cmNlXG5cbmxldCBhZGRFdmVudExpc3RlbmVyID0gRG9tLmFkZEV2ZW50TGlzdGVuZXJcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTAgSsOpcsO0bWUgVm91aWxsb25cbiAqIExhYm9yYXRvaXJlIFBQUyAtIENOUlMgVW5pdmVyc2l0w6kgUGFyaXMgRGlkZXJvdFxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdpdGggbGlua2luZyBleGNlcHRpb247XG4gKiBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS5cbiAqKVxuXG5vcGVuIEpzXG5vcGVuISBJbXBvcnRcblxuY2xhc3MgdHlwZSBjb25zb2xlID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIGxvZyA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzYgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBsb2dfNyA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgbG9nXzggOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVidWcgOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlYnVnXzIgOiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGVidWdfMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlYnVnXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRlYnVnXzUgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5mbyA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5mb18yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluZm9fMyA6IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGluZm9fNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgaW5mb181IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdhcm4gOiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdhcm5fMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3YXJuXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB3YXJuXzQgOiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHdhcm5fNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlcnJvciA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXJyb3JfMiA6IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBlcnJvcl8zIDogXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXJyb3JfNCA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZXJyb3JfNSA6IF8gLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBhc3NlcnRfIDogYm9vbCB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF8xIDogYm9vbCB0IC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XzIgOiBib29sIHQgLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF8zIDogYm9vbCB0IC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGFzc2VydF80IDogYm9vbCB0IC0+IF8gLT4gXyAtPiBfIC0+IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgYXNzZXJ0XzUgOiBib29sIHQgLT4gXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGRpciA6IF8gLT4gdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgZGlyeG1sIDogRG9tLm5vZGUgdCAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCB0cmFjZSA6IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cF8yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cF80IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cF81IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwQ29sbGFwc2VkIDogXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cENvbGxhcHNlZF8yIDogXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwQ29sbGFwc2VkXzMgOiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cENvbGxhcHNlZF80IDogXyAtPiBfIC0+IF8gLT4gXyAtPiB1bml0IG1ldGhcblxuICAgIG1ldGhvZCBncm91cENvbGxhcHNlZF81IDogXyAtPiBfIC0+IF8gLT4gXyAtPiBfIC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIGdyb3VwRW5kIDogdW5pdCBtZXRoXG5cbiAgICBtZXRob2QgdGltZSA6IGpzX3N0cmluZyB0IC0+IHVuaXQgbWV0aFxuXG4gICAgbWV0aG9kIHRpbWVFbmQgOiBqc19zdHJpbmcgdCAtPiB1bml0IG1ldGhcbiAgZW5kXG5cbmV4dGVybmFsIGdldF9jb25zb2xlIDogdW5pdCAtPiBjb25zb2xlIHQgPSBcImNhbWxfanNfZ2V0X2NvbnNvbGVcIlxuXG5sZXQgY29uc29sZSA9IGdldF9jb25zb2xlICgpXG4iLCIoKiBKc19vZl9vY2FtbCBsaWJyYXJ5XG4gKiBodHRwOi8vd3d3Lm9jc2lnZW4ub3JnL2pzX29mX29jYW1sL1xuICogQ29weXJpZ2h0IChDKSAyMDE1IFN0w6lwaGFuZSBMZWdyYW5kXG4gKlxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd2l0aCBsaW5raW5nIGV4Y2VwdGlvbjtcbiAqIGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLlxuICopXG5vcGVuISBJbXBvcnRcblxudHlwZSBwb3NpdGlvbkVycm9yQ29kZVxuXG50eXBlIHdhdGNoSWRcblxuY2xhc3MgdHlwZSBjb29yZGluYXRlcyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBsYXRpdHVkZSA6IGZsb2F0IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBsb25naXR1ZGUgOiBmbG9hdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYWx0aXR1ZGUgOiBmbG9hdCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFjY3VyYWN5IDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGFsdGl0dWRlQWNjdXJhY3kgOiBmbG9hdCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGhlYWRpbmcgOiBmbG9hdCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHNwZWVkIDogZmxvYXQgSnMub3B0IEpzLnJlYWRvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcG9zaXRpb24gPVxuICBvYmplY3RcbiAgICBtZXRob2QgY29vcmRzIDogY29vcmRpbmF0ZXMgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGltZXN0YW1wIDogSnMuZGF0ZSBKcy5yZWFkb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIHBvc2l0aW9uT3B0aW9ucyA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBlbmFibGVIaWdoQWNjdXJhY3kgOiBib29sIEpzLndyaXRlb25seV9wcm9wXG5cbiAgICBtZXRob2QgdGltZW91dCA6IGludCBKcy53cml0ZW9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIG1heGltdW1BZ2UgOiBpbnQgSnMud3JpdGVvbmx5X3Byb3BcbiAgZW5kXG5cbmNsYXNzIHR5cGUgcG9zaXRpb25FcnJvciA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBfUEVSTUlTU0lPTl9ERU5JRURfIDogcG9zaXRpb25FcnJvckNvZGUgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9QT1NJVElPTl9VTkFWQUlMQUJMRV8gOiBwb3NpdGlvbkVycm9yQ29kZSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgX1RJTUVPVVQgOiBwb3NpdGlvbkVycm9yQ29kZSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgY29kZSA6IHBvc2l0aW9uRXJyb3JDb2RlIEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBtZXNzYWdlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBnZW9sb2NhdGlvbiA9XG4gIG9iamVjdFxuICAgIG1ldGhvZCBnZXRDdXJyZW50UG9zaXRpb24gOlxuICAgICAgICAgKHBvc2l0aW9uIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgIC0+IChwb3NpdGlvbkVycm9yIEpzLnQgLT4gdW5pdCkgSnMuY2FsbGJhY2tcbiAgICAgIC0+IHBvc2l0aW9uT3B0aW9ucyBKcy50XG4gICAgICAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB3YXRjaFBvc2l0aW9uIDpcbiAgICAgICAgIChwb3NpdGlvbiBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgICAtPiAocG9zaXRpb25FcnJvciBKcy50IC0+IHVuaXQpIEpzLmNhbGxiYWNrXG4gICAgICAtPiBwb3NpdGlvbk9wdGlvbnMgSnMudFxuICAgICAgLT4gd2F0Y2hJZCBKcy5tZXRoXG5cbiAgICBtZXRob2QgY2xlYXJXYXRjaCA6IHdhdGNoSWQgLT4gdW5pdCBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgZW1wdHlfcG9zaXRpb25fb3B0aW9ucyAoKSA9IEpzLlVuc2FmZS5vYmogW3x8XVxuXG5sZXQgZ2VvbG9jYXRpb24gPVxuICBsZXQgeCA9IEpzLlVuc2FmZS5nbG9iYWwjIy5uYXZpZ2F0b3IgaW5cbiAgaWYgSnMuT3B0ZGVmLnRlc3QgeCB0aGVuIHgjIy5nZW9sb2NhdGlvbiBlbHNlIHhcblxuKCogdW5kZWZpbmVkICopXG5cbmxldCBpc19zdXBwb3J0ZWQgKCkgPSBKcy5PcHRkZWYudGVzdCBnZW9sb2NhdGlvblxuIiwiY2xhc3MgdHlwZSBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5ID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHRhcmdldCA6IERvbS5ub2RlIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGJvdW5kaW5nQ2xpZW50UmVjdCA6IERvbV9odG1sLmNsaWVudFJlY3QgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgcm9vdEJvdW5kcyA6IERvbV9odG1sLmNsaWVudFJlY3QgSnMudCBKcy5vcHQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGludGVyc2VjdGlvblJlY3QgOiBEb21faHRtbC5jbGllbnRSZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGludGVyc2VjdGlvblJhdGlvIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGlzSW50ZXJzZWN0aW5nIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aW1lIDogZmxvYXQgSnMucmVhZG9ubHlfcHJvcFxuICBlbmRcblxuY2xhc3MgdHlwZSBpbnRlcnNlY3Rpb25PYnNlcnZlck9wdGlvbnMgPVxuICBvYmplY3RcbiAgICBtZXRob2Qgcm9vdCA6IERvbS5ub2RlIEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCByb290TWFyZ2luIDogSnMuanNfc3RyaW5nIEpzLnQgSnMud3JpdGVvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aHJlc2hvbGQgOiBmbG9hdCBKcy5qc19hcnJheSBKcy50IEpzLndyaXRlb25seV9wcm9wXG4gIGVuZFxuXG5jbGFzcyB0eXBlIGludGVyc2VjdGlvbk9ic2VydmVyID1cbiAgb2JqZWN0XG4gICAgbWV0aG9kIHJvb3QgOiBEb20ubm9kZSBKcy50IEpzLm9wdCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgcm9vdE1hcmdpbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCB0aHJlc2hvbGRzIDogZmxvYXQgSnMuanNfYXJyYXkgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2Qgb2JzZXJ2ZSA6ICNEb20ubm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHVub2JzZXJ2ZSA6ICNEb20ubm9kZSBKcy50IC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGRpc2Nvbm5lY3QgOiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCB0YWtlUmVjb3JkcyA6IGludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgSnMudCBKcy5qc19hcnJheSBKcy5tZXRoXG4gIGVuZFxuXG5sZXQgZW1wdHlfaW50ZXJzZWN0aW9uX29ic2VydmVyX29wdGlvbnMgKCkgOiBpbnRlcnNlY3Rpb25PYnNlcnZlck9wdGlvbnMgSnMudCA9XG4gIEpzLlVuc2FmZS5vYmogW3x8XVxuXG5sZXQgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJfdW5zYWZlID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRlcnNlY3Rpb25PYnNlcnZlclxuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgaW50ZXJzZWN0aW9uT2JzZXJ2ZXJfdW5zYWZlXG5cbmxldCBpbnRlcnNlY3Rpb25PYnNlcnZlciA6XG4gICAgKCAgICggICBpbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5IEpzLnQgSnMuanNfYXJyYXkgSnMudFxuICAgICAgICAgLT4gaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgSnMudFxuICAgICAgICAgLT4gdW5pdClcbiAgICAgICAgSnMuY2FsbGJhY2tcbiAgICAgLT4gaW50ZXJzZWN0aW9uT2JzZXJ2ZXJPcHRpb25zIEpzLnRcbiAgICAgLT4gaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgSnMudClcbiAgICBKcy5jb25zdHIgPVxuICBpbnRlcnNlY3Rpb25PYnNlcnZlcl91bnNhZmVcbiIsIigqIEpzX29mX29jYW1sIGxpYnJhcnlcbiAqIGh0dHA6Ly93d3cub2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTggU3TDqXBoYW5lIExlZ3JhbmRcbiAqXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uO1xuICogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuICpcbiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuXG4gKilcbm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgdHlwZSBTaGFyZWQgPSBzaWdcbiAgY2xhc3MgdHlwZSBvYmplY3Rfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlTWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcbiAgICBlbmRcblxuICB2YWwgb2JqZWN0X29wdGlvbnMgOiB1bml0IC0+IG9iamVjdF9vcHRpb25zIEpzLnRcblxuICBjbGFzcyB0eXBlIF9vYmplY3QgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIHN1cHBvcnRlZExvY2FsZXNPZiA6XG4gICAgICAgICAgIEpzLmpzX3N0cmluZyBKcy50IEpzLmpzX2FycmF5IEpzLnRcbiAgICAgICAgLT4gb2JqZWN0X29wdGlvbnMgSnMudCBKcy5vcHRkZWZcbiAgICAgICAgLT4gSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxubW9kdWxlIFNoYXJlZCA6IFNoYXJlZCA9IHN0cnVjdFxuICBjbGFzcyB0eXBlIG9iamVjdF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuICAgIGVuZFxuXG4gIGxldCBvYmplY3Rfb3B0aW9ucyAoKSA9XG4gICAgb2JqZWN0JWpzXG4gICAgICB2YWwgbXV0YWJsZSBsb2NhbGVNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgX29iamVjdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2Qgc3VwcG9ydGVkTG9jYWxlc09mIDpcbiAgICAgICAgICAgSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudFxuICAgICAgICAtPiBvYmplY3Rfb3B0aW9ucyBKcy50IEpzLm9wdGRlZlxuICAgICAgICAtPiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5tb2R1bGUgQ29sbGF0b3IgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBTaGFyZWRcblxuICBjbGFzcyB0eXBlIHJlc29sdmVkX29wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIHVzYWdlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2Qgc2Vuc2l0aXZpdHkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBpZ25vcmVQdW5jdHVhdGlvbiA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBjb2xsYXRpb24gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1lcmljIDogYm9vbCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGNhc2VGaXJzdCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIG9wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB1c2FnZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHNlbnNpdGl2aXR5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgaWdub3JlUHVuY3R1YXRpb24gOiBib29sIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbnVtZXJpYyA6IGJvb2wgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBjYXNlRmlyc3QgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG4gICAgZW5kXG5cbiAgbGV0IG9wdGlvbnMgKCkgPVxuICAgIG9iamVjdCVqc1xuICAgICAgdmFsIG11dGFibGUgbG9jYWxlTWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcblxuICAgICAgdmFsIG11dGFibGUgdXNhZ2UgPSBKcy5zdHJpbmcgXCJzb3J0XCJcblxuICAgICAgdmFsIG11dGFibGUgc2Vuc2l0aXZpdHkgPSBKcy5zdHJpbmcgXCJ2YXJpYW50XCJcblxuICAgICAgdmFsIG11dGFibGUgaWdub3JlUHVuY3R1YXRpb24gPSBKcy5fZmFsc2VcblxuICAgICAgdmFsIG11dGFibGUgbnVtZXJpYyA9IEpzLl9mYWxzZVxuXG4gICAgICB2YWwgbXV0YWJsZSBjYXNlRmlyc3QgPSBKcy5zdHJpbmcgXCJmYWxzZVwiXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSB0ID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBjb21wYXJlIDogKEpzLmpzX3N0cmluZyBKcy50IC0+IEpzLmpzX3N0cmluZyBKcy50IC0+IGludCkgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgcmVzb2x2ZWRPcHRpb25zIDogdW5pdCAtPiByZXNvbHZlZF9vcHRpb25zIEpzLnQgSnMubWV0aFxuICAgIGVuZFxuZW5kXG5cbm1vZHVsZSBEYXRlVGltZUZvcm1hdCA9IHN0cnVjdFxuICBpbmNsdWRlIFNoYXJlZFxuXG4gIGNsYXNzIHR5cGUgcmVzb2x2ZWRfb3B0aW9ucyA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgbG9jYWxlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgY2FsZW5kYXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1iZXJpbmdTeXN0ZW0gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCB0aW1lWm9uZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGhvdXIxMiA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCB3ZWVrZGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIGVyYSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCB5ZWFyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1vbnRoIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIGRheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBob3VyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1pbnV0ZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBzZWNvbmQgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgdGltZVpvbmVOYW1lIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIG9wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGRhdGVTdHlsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB0aW1lU3R5bGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgY2FsZW5kYXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgZGF5UGVyaW9kIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG51bWJlcmluZ1N5c3RlbSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBsb2NhbGVNYXRjaGVyIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucHJvcFxuXG4gICAgICBtZXRob2QgdGltZVpvbmUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgaG91cjEyIDogYm9vbCBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBob3VyQ3ljbGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgZm9ybWF0TWF0Y2hlciA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHdlZWtkYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgZXJhIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHllYXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbW9udGggOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgZGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGhvdXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWludXRlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHNlY29uZCA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB0aW1lWm9uZU5hbWUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuICAgIGVuZFxuXG4gIGxldCBvcHRpb25zICgpIDogb3B0aW9ucyBKcy50ID1cbiAgICBvYmplY3QlanNcbiAgICAgIHZhbCBtdXRhYmxlIGRhdGVTdHlsZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB0aW1lU3R5bGUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgY2FsZW5kYXIgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgZGF5UGVyaW9kID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG51bWJlcmluZ1N5c3RlbSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBsb2NhbGVNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSB0aW1lWm9uZSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBob3VyMTIgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgaG91ckN5Y2xlID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGZvcm1hdE1hdGNoZXIgPSBKcy5zdHJpbmcgXCJiZXN0IGZpdFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIHdlZWtkYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgZXJhID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHllYXIgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbW9udGggPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgZGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGhvdXIgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWludXRlID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHNlY29uZCA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBmcmFjdGlvbmFsU2Vjb25kRGlnaXRzID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHRpbWVab25lTmFtZSA9IEpzLnVuZGVmaW5lZFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgZm9ybWF0X3BhcnQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIF90eXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgX3ZhbHVlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgZm9ybWF0IDogKEpzLmRhdGUgSnMudCAtPiBKcy5qc19zdHJpbmcgSnMudCkgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgZm9ybWF0VG9QYXJ0cyA6XG4gICAgICAgIEpzLmRhdGUgSnMudCBKcy5vcHRkZWYgLT4gZm9ybWF0X3BhcnQgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcblxuICAgICAgbWV0aG9kIHJlc29sdmVkT3B0aW9ucyA6IHVuaXQgLT4gcmVzb2x2ZWRfb3B0aW9ucyBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5tb2R1bGUgTnVtYmVyRm9ybWF0ID0gc3RydWN0XG4gIGluY2x1ZGUgU2hhcmVkXG5cbiAgY2xhc3MgdHlwZSByZXNvbHZlZF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1iZXJpbmdTeXN0ZW0gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBzdHlsZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIGN1cnJlbmN5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIGN1cnJlbmN5RGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCB1c2VHcm91cGluZyA6IGJvb2wgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtSW50ZWdlckRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG4gICAgZW5kXG5cbiAgY2xhc3MgdHlwZSBvcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBjb21wYWN0RGlzcGxheSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBjdXJyZW5jeSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBjdXJyZW5jeURpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgY3VycmVuY3lTaWduIDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBub3RhdGlvbiA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBudW1iZXJpbmdTeXN0ZW0gOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgc2lnbkRpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2Qgc3R5bGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCB1bml0IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHVuaXREaXNwbGF5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHVzZUdyb3VwaW5nIDogYm9vbCBKcy50IEpzLnByb3BcblxuICAgICAgbWV0aG9kIHJvdW5kaW5nTW9kZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCByb3VuZGluZ1ByaW9yaXR5IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHJvdW5kaW5nSW5jcmVtZW50IDogSnMuanNfc3RyaW5nIEpzLnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIHRyYWlsaW5nWmVyb0Rpc3BsYXkgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bUludGVnZXJEaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuXG4gICAgICBtZXRob2QgbWF4aW11bUZyYWN0aW9uRGlnaXRzIDogaW50IEpzLm9wdGRlZiBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmIEpzLnByb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA6IGludCBKcy5vcHRkZWYgSnMucHJvcFxuICAgIGVuZFxuXG4gIGxldCBvcHRpb25zICgpIDogb3B0aW9ucyBKcy50ID1cbiAgICBvYmplY3QlanNcbiAgICAgIHZhbCBtdXRhYmxlIGNvbXBhY3REaXNwbGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGN1cnJlbmN5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIGN1cnJlbmN5RGlzcGxheSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBjdXJyZW5jeVNpZ24gPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbG9jYWxlTWF0Y2hlciA9IEpzLnN0cmluZyBcImJlc3QgZml0XCJcblxuICAgICAgdmFsIG11dGFibGUgbm90YXRpb24gPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbnVtYmVyaW5nU3lzdGVtID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHNpZ25EaXNwbGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIHN0eWxlID0gSnMuc3RyaW5nIFwiZGVjaW1hbFwiXG5cbiAgICAgIHZhbCBtdXRhYmxlIHVuaXQgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgdW5pdERpc3BsYXkgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgdXNlR3JvdXBpbmcgPSBKcy5fdHJ1ZVxuXG4gICAgICB2YWwgbXV0YWJsZSByb3VuZGluZ01vZGUgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgcm91bmRpbmdQcmlvcml0eSA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSByb3VuZGluZ0luY3JlbWVudCA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSB0cmFpbGluZ1plcm9EaXNwbGF5ID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1pbmltdW1JbnRlZ2VyRGlnaXRzID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1pbmltdW1GcmFjdGlvbkRpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuXG4gICAgICB2YWwgbXV0YWJsZSBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSBKcy51bmRlZmluZWRcblxuICAgICAgdmFsIG11dGFibGUgbWluaW11bVNpZ25pZmljYW50RGlnaXRzID0gSnMudW5kZWZpbmVkXG5cbiAgICAgIHZhbCBtdXRhYmxlIG1heGltdW1TaWduaWZpY2FudERpZ2l0cyA9IEpzLnVuZGVmaW5lZFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgZm9ybWF0X3BhcnQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIF90eXBlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgICBtZXRob2QgX3ZhbHVlIDogSnMuanNfc3RyaW5nIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIGVuZFxuXG4gIGNsYXNzIHR5cGUgdCA9XG4gICAgb2JqZWN0XG4gICAgICBtZXRob2QgZm9ybWF0IDogKEpzLm51bWJlciBKcy50IC0+IEpzLmpzX3N0cmluZyBKcy50KSBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBmb3JtYXRUb1BhcnRzIDpcbiAgICAgICAgSnMubnVtYmVyIEpzLnQgSnMub3B0ZGVmIC0+IGZvcm1hdF9wYXJ0IEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5tZXRoXG5cbiAgICAgIG1ldGhvZCByZXNvbHZlZE9wdGlvbnMgOiB1bml0IC0+IHJlc29sdmVkX29wdGlvbnMgSnMudCBKcy5tZXRoXG4gICAgZW5kXG5lbmRcblxubW9kdWxlIFBsdXJhbFJ1bGVzID0gc3RydWN0XG4gIGluY2x1ZGUgU2hhcmVkXG5cbiAgY2xhc3MgdHlwZSByZXNvbHZlZF9vcHRpb25zID1cbiAgICBvYmplY3RcbiAgICAgIG1ldGhvZCBsb2NhbGUgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBwbHVyYWxDYXRlZ29yaWVzIDogSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCBKcy5yZWFkb25seV9wcm9wXG5cbiAgICAgIG1ldGhvZCBfdHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgICAgbWV0aG9kIG1pbmltdW1JbnRlZ2VyRGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcblxuICAgICAgbWV0aG9kIG1heGltdW1GcmFjdGlvbkRpZ2l0cyA6IGludCBKcy5vcHRkZWZfcHJvcFxuXG4gICAgICBtZXRob2QgbWluaW11bVNpZ25pZmljYW50RGlnaXRzIDogaW50IEpzLm9wdGRlZl9wcm9wXG5cbiAgICAgIG1ldGhvZCBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHMgOiBpbnQgSnMub3B0ZGVmX3Byb3BcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIG9wdGlvbnMgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIGxvY2FsZU1hdGNoZXIgOiBKcy5qc19zdHJpbmcgSnMudCBKcy5wcm9wXG5cbiAgICAgIG1ldGhvZCBfdHlwZSA6IEpzLmpzX3N0cmluZyBKcy50IEpzLnByb3BcbiAgICBlbmRcblxuICBsZXQgb3B0aW9ucyAoKSA6IG9wdGlvbnMgSnMudCA9XG4gICAgb2JqZWN0JWpzXG4gICAgICB2YWwgbXV0YWJsZSBsb2NhbGVNYXRjaGVyID0gSnMuc3RyaW5nIFwiYmVzdCBmaXRcIlxuXG4gICAgICB2YWwgbXV0YWJsZSBfdHlwZSA9IEpzLnN0cmluZyBcImNhcmRpbmFsXCJcbiAgICBlbmRcblxuICBjbGFzcyB0eXBlIHQgPVxuICAgIG9iamVjdFxuICAgICAgbWV0aG9kIHNlbGVjdCA6IEpzLm51bWJlciBKcy50IC0+IEpzLmpzX3N0cmluZyBKcy50IEpzLm1ldGhcblxuICAgICAgbWV0aG9kIHJlc29sdmVkT3B0aW9ucyA6IHVuaXQgLT4gcmVzb2x2ZWRfb3B0aW9ucyBKcy50IEpzLm1ldGhcbiAgICBlbmRcbmVuZFxuXG5jbGFzcyB0eXBlIGludGwgPVxuICBvYmplY3RcbiAgICBtZXRob2QgX0NvbGxhdG9yIDogQ29sbGF0b3IuX29iamVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfRGF0ZVRpbWVGb3JtYXQgOiBEYXRlVGltZUZvcm1hdC5fb2JqZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIF9OdW1iZXJGb3JtYXQgOiBOdW1iZXJGb3JtYXQuX29iamVjdCBKcy50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBfUGx1cmFsUnVsZXMgOiBQbHVyYWxSdWxlcy5fb2JqZWN0IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIGdldENhbm9uaWNhbExvY2FsZXMgOlxuICAgICAgSnMuanNfc3RyaW5nIEpzLnQgSnMuanNfYXJyYXkgSnMudCAtPiBKcy5qc19zdHJpbmcgSnMudCBKcy5qc19hcnJheSBKcy50IEpzLm1ldGhcbiAgZW5kXG5cbmxldCBpbnRsID0gSnMuVW5zYWZlLmdsb2JhbCMjLl9JbnRsXG5cbmxldCBjb2xsYXRvcl9jb25zdHIgPSBKcy5VbnNhZmUuZ2xvYmFsIyMuX0ludGwjIy5fQ29sbGF0b3JcblxubGV0IGRhdGVUaW1lRm9ybWF0X2NvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50bCMjLl9EYXRlVGltZUZvcm1hdFxuXG5sZXQgbnVtYmVyRm9ybWF0X2NvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50bCMjLl9OdW1iZXJGb3JtYXRcblxubGV0IHBsdXJhbFJ1bGVzX2NvbnN0ciA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fSW50bCMjLl9QbHVyYWxSdWxlc1xuXG5sZXQgaXNfc3VwcG9ydGVkICgpID0gSnMuT3B0ZGVmLnRlc3QgaW50bFxuIiwibW9kdWxlIHR5cGUgUyA9IHNpZ1xuICB2YWwgcHJlX3Rlc3RfaG9vayA6IHVuaXQgLT4gdW5pdFxuZW5kXG5cbmxldCBwcmVfdGVzdF9ob29rID0gaWdub3JlXG4iLCJbQEBAb2NhbWwud2FybmluZyBcIi0zXCJdXG5cbigqIGJsaXRfc3RyaW5nIGRvZXNuJ3QgZXhpc3QgaW4gW1N0ZExhYmVscy5CeXRlc10uLi4gICopXG5sZXQgYnl0ZXNfYmxpdF9zdHJpbmcgfnNyYyB+c3JjX3BvcyB+ZHN0IH5kc3RfcG9zIH5sZW4gPVxuICBCeXRlcy5ibGl0X3N0cmluZyBzcmMgc3JjX3BvcyBkc3QgZHN0X3BvcyBsZW5cbjs7XG5cbm9wZW4gU3RkTGFiZWxzXG5vcGVuIEZvcm1hdFxuXG4oKiogVHlwZSBvZiBTLWV4cHJlc3Npb25zICopXG50eXBlIHQgPVxuICB8IEF0b20gb2Ygc3RyaW5nXG4gIHwgTGlzdCBvZiB0IGxpc3RcblxubGV0IHNleHBfb2ZfdCB0ID0gdFxubGV0IHRfb2Zfc2V4cCB0ID0gdFxuXG5sZXQgcmVjIGNvbXBhcmVfbGlzdCBhIGIgPVxuICBtYXRjaCBhLCBiIHdpdGhcbiAgfCBbXSwgW10gLT4gMFxuICB8IFtdLCBfIC0+IC0xXG4gIHwgXywgW10gLT4gMVxuICB8IHggOjogeHMsIHkgOjogeXMgLT5cbiAgICBsZXQgcmVzID0gY29tcGFyZSB4IHkgaW5cbiAgICBpZiByZXMgPD4gMCB0aGVuIHJlcyBlbHNlIGNvbXBhcmVfbGlzdCB4cyB5c1xuXG5hbmQgY29tcGFyZSBhIGIgPVxuICBpZiBhID09IGJcbiAgdGhlbiAwXG4gIGVsc2UgKFxuICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgIHwgQXRvbSBhLCBBdG9tIGIgLT4gU3RyaW5nLmNvbXBhcmUgYSBiXG4gICAgfCBBdG9tIF8sIF8gLT4gLTFcbiAgICB8IF8sIEF0b20gXyAtPiAxXG4gICAgfCBMaXN0IGEsIExpc3QgYiAtPiBjb21wYXJlX2xpc3QgYSBiKVxuOztcblxubGV0IGVxdWFsIGEgYiA9IGNvbXBhcmUgYSBiID0gMFxuXG5leGNlcHRpb24gTm90X2ZvdW5kX3Mgb2YgdFxuZXhjZXB0aW9uIE9mX3NleHBfZXJyb3Igb2YgZXhuICogdFxuXG5tb2R1bGUgUHJpbnRpbmcgPSBzdHJ1Y3RcbiAgKCogRGVmYXVsdCBpbmRlbnRhdGlvbiBsZXZlbCBmb3IgaHVtYW4tcmVhZGFibGUgY29udmVyc2lvbnMgKilcblxuICBsZXQgZGVmYXVsdF9pbmRlbnQgPSByZWYgMVxuXG4gICgqIEVzY2FwaW5nIG9mIHN0cmluZ3MgdXNlZCBhcyBhdG9tcyBpbiBTLWV4cHJlc3Npb25zICopXG5cbiAgbGV0IG11c3RfZXNjYXBlIHN0ciA9XG4gICAgbGV0IGxlbiA9IFN0cmluZy5sZW5ndGggc3RyIGluXG4gICAgbGVuID0gMFxuICAgIHx8XG4gICAgbGV0IHJlYyBsb29wIHN0ciBpeCA9XG4gICAgICBtYXRjaCBzdHIuW2l4XSB3aXRoXG4gICAgICB8ICdcIicgfCAnKCcgfCAnKScgfCAnOycgfCAnXFxcXCcgLT4gdHJ1ZVxuICAgICAgfCAnfCcgLT5cbiAgICAgICAgaXggPiAwXG4gICAgICAgICYmXG4gICAgICAgIGxldCBuZXh0ID0gaXggLSAxIGluXG4gICAgICAgIENoYXIuZXF1YWwgc3RyLltuZXh0XSAnIycgfHwgbG9vcCBzdHIgbmV4dFxuICAgICAgfCAnIycgLT5cbiAgICAgICAgaXggPiAwXG4gICAgICAgICYmXG4gICAgICAgIGxldCBuZXh0ID0gaXggLSAxIGluXG4gICAgICAgIENoYXIuZXF1YWwgc3RyLltuZXh0XSAnfCcgfHwgbG9vcCBzdHIgbmV4dFxuICAgICAgfCAnXFwwMDAnIC4uICdcXDAzMicgfCAnXFwxMjcnIC4uICdcXDI1NScgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGl4ID4gMCAmJiBsb29wIHN0ciAoaXggLSAxKVxuICAgIGluXG4gICAgbG9vcCBzdHIgKGxlbiAtIDEpXG4gIDs7XG5cbiAgbGV0IGVzY2FwZWQgcyA9XG4gICAgbGV0IG4gPSByZWYgMCBpblxuICAgIGZvciBpID0gMCB0byBTdHJpbmcubGVuZ3RoIHMgLSAxIGRvXG4gICAgICBuXG4gICAgICA6PSAhblxuICAgICAgICAgK1xuICAgICAgICAgbWF0Y2ggU3RyaW5nLnVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgICAgIHwgJ1xcXCInIHwgJ1xcXFwnIHwgJ1xcbicgfCAnXFx0JyB8ICdcXHInIHwgJ1xcYicgLT4gMlxuICAgICAgICAgfCAnICcgLi4gJ34nIC0+IDFcbiAgICAgICAgIHwgXyAtPiA0XG4gICAgZG9uZTtcbiAgICBpZiAhbiA9IFN0cmluZy5sZW5ndGggc1xuICAgIHRoZW4gc1xuICAgIGVsc2UgKFxuICAgICAgbGV0IHMnID0gQnl0ZXMuY3JlYXRlICFuIGluXG4gICAgICBuIDo9IDA7XG4gICAgICBmb3IgaSA9IDAgdG8gU3RyaW5nLmxlbmd0aCBzIC0gMSBkb1xuICAgICAgICAobWF0Y2ggU3RyaW5nLnVuc2FmZV9nZXQgcyBpIHdpdGhcbiAgICAgICAgIHwgKCdcXFwiJyB8ICdcXFxcJykgYXMgYyAtPlxuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuICdcXFxcJztcbiAgICAgICAgICAgaW5jciBuO1xuICAgICAgICAgICBCeXRlcy51bnNhZmVfc2V0IHMnICFuIGNcbiAgICAgICAgIHwgJ1xcbicgLT5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnbidcbiAgICAgICAgIHwgJ1xcdCcgLT5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAndCdcbiAgICAgICAgIHwgJ1xccicgLT5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAncidcbiAgICAgICAgIHwgJ1xcYicgLT5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnYidcbiAgICAgICAgIHwgJyAnIC4uICd+JyBhcyBjIC0+IEJ5dGVzLnVuc2FmZV9zZXQgcycgIW4gY1xuICAgICAgICAgfCBjIC0+XG4gICAgICAgICAgIGxldCBhID0gQ2hhci5jb2RlIGMgaW5cbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAnXFxcXCc7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAoQ2hhci5jaHIgKDQ4ICsgKGEgLyAxMDApKSk7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAoQ2hhci5jaHIgKDQ4ICsgKGEgLyAxMCBtb2QgMTApKSk7XG4gICAgICAgICAgIGluY3IgbjtcbiAgICAgICAgICAgQnl0ZXMudW5zYWZlX3NldCBzJyAhbiAoQ2hhci5jaHIgKDQ4ICsgKGEgbW9kIDEwKSkpKTtcbiAgICAgICAgaW5jciBuXG4gICAgICBkb25lO1xuICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzJylcbiAgOztcblxuICBsZXQgZXNjX3N0ciBzdHIgPVxuICAgIGxldCBlc3RyID0gZXNjYXBlZCBzdHIgaW5cbiAgICBsZXQgZWxlbiA9IFN0cmluZy5sZW5ndGggZXN0ciBpblxuICAgIGxldCByZXMgPSBCeXRlcy5jcmVhdGUgKGVsZW4gKyAyKSBpblxuICAgIGJ5dGVzX2JsaXRfc3RyaW5nIH5zcmM6ZXN0ciB+c3JjX3BvczowIH5kc3Q6cmVzIH5kc3RfcG9zOjEgfmxlbjplbGVuO1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgcmVzIDAgJ1wiJztcbiAgICBCeXRlcy51bnNhZmVfc2V0IHJlcyAoZWxlbiArIDEpICdcIic7XG4gICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyByZXNcbiAgOztcblxuICBsZXQgaW5kZXhfb2ZfbmV3bGluZSBzdHIgc3RhcnQgPVxuICAgIHRyeSBTb21lIChTdHJpbmcuaW5kZXhfZnJvbSBzdHIgc3RhcnQgJ1xcbicpIHdpdGhcbiAgICB8IE5vdF9mb3VuZCAtPiBOb25lXG4gIDs7XG5cbiAgbGV0IGdldF9zdWJzdHJpbmcgc3RyIGluZGV4IGVuZF9wb3Nfb3B0ID1cbiAgICBsZXQgZW5kX3BvcyA9XG4gICAgICBtYXRjaCBlbmRfcG9zX29wdCB3aXRoXG4gICAgICB8IE5vbmUgLT4gU3RyaW5nLmxlbmd0aCBzdHJcbiAgICAgIHwgU29tZSBlbmRfcG9zIC0+IGVuZF9wb3NcbiAgICBpblxuICAgIFN0cmluZy5zdWIgc3RyIH5wb3M6aW5kZXggfmxlbjooZW5kX3BvcyAtIGluZGV4KVxuICA7O1xuXG4gIGxldCBpc19vbmVfbGluZSBzdHIgPVxuICAgIG1hdGNoIGluZGV4X29mX25ld2xpbmUgc3RyIDAgd2l0aFxuICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgfCBTb21lIGluZGV4IC0+IGluZGV4ICsgMSA9IFN0cmluZy5sZW5ndGggc3RyXG4gIDs7XG5cbiAgbGV0IHBwX2h1bV9tYXliZV9lc2Nfc3RyIHBwZiBzdHIgPVxuICAgIGlmIG5vdCAobXVzdF9lc2NhcGUgc3RyKVxuICAgIHRoZW4gcHBfcHJpbnRfc3RyaW5nIHBwZiBzdHJcbiAgICBlbHNlIGlmIGlzX29uZV9saW5lIHN0clxuICAgIHRoZW4gcHBfcHJpbnRfc3RyaW5nIHBwZiAoZXNjX3N0ciBzdHIpXG4gICAgZWxzZSAoXG4gICAgICBsZXQgcmVjIGxvb3AgaW5kZXggPVxuICAgICAgICBsZXQgbmV4dF9uZXdsaW5lID0gaW5kZXhfb2ZfbmV3bGluZSBzdHIgaW5kZXggaW5cbiAgICAgICAgbGV0IG5leHRfbGluZSA9IGdldF9zdWJzdHJpbmcgc3RyIGluZGV4IG5leHRfbmV3bGluZSBpblxuICAgICAgICBwcF9wcmludF9zdHJpbmcgcHBmIChlc2NhcGVkIG5leHRfbGluZSk7XG4gICAgICAgIG1hdGNoIG5leHRfbmV3bGluZSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICB8IFNvbWUgbmV3bGluZV9pbmRleCAtPlxuICAgICAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgXCJcXFxcXCI7XG4gICAgICAgICAgcHBfZm9yY2VfbmV3bGluZSBwcGYgKCk7XG4gICAgICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIlxcXFxuXCI7XG4gICAgICAgICAgbG9vcCAobmV3bGluZV9pbmRleCArIDEpXG4gICAgICBpblxuICAgICAgcHBfb3Blbl9ib3ggcHBmIDA7XG4gICAgICAoKiB0aGUgbGVhZGluZyBzcGFjZSBpcyB0byBsaW5lIHVwIHRoZSBsaW5lcyAqKVxuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIiBcXFwiXCI7XG4gICAgICBsb29wIDA7XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiXFxcIlwiO1xuICAgICAgcHBfY2xvc2VfYm94IHBwZiAoKSlcbiAgOztcblxuICBsZXQgbWFjaF9tYXliZV9lc2Nfc3RyIHN0ciA9IGlmIG11c3RfZXNjYXBlIHN0ciB0aGVuIGVzY19zdHIgc3RyIGVsc2Ugc3RyXG5cbiAgKCogT3V0cHV0IG9mIFMtZXhwcmVzc2lvbnMgdG8gZm9ybWF0dGVycyAqKVxuXG4gIGxldCByZWMgcHBfaHVtX2luZGVudCBpbmRlbnQgcHBmID0gZnVuY3Rpb25cbiAgICB8IEF0b20gc3RyIC0+IHBwX2h1bV9tYXliZV9lc2Nfc3RyIHBwZiBzdHJcbiAgICB8IExpc3QgKGggOjogdCkgLT5cbiAgICAgIHBwX29wZW5fYm94IHBwZiBpbmRlbnQ7XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiKFwiO1xuICAgICAgcHBfaHVtX2luZGVudCBpbmRlbnQgcHBmIGg7XG4gICAgICBwcF9odW1fcmVzdCBpbmRlbnQgcHBmIHRcbiAgICB8IExpc3QgW10gLT4gcHBfcHJpbnRfc3RyaW5nIHBwZiBcIigpXCJcblxuICBhbmQgcHBfaHVtX3Jlc3QgaW5kZW50IHBwZiA9IGZ1bmN0aW9uXG4gICAgfCBoIDo6IHQgLT5cbiAgICAgIHBwX3ByaW50X3NwYWNlIHBwZiAoKTtcbiAgICAgIHBwX2h1bV9pbmRlbnQgaW5kZW50IHBwZiBoO1xuICAgICAgcHBfaHVtX3Jlc3QgaW5kZW50IHBwZiB0XG4gICAgfCBbXSAtPlxuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIilcIjtcbiAgICAgIHBwX2Nsb3NlX2JveCBwcGYgKClcbiAgOztcblxuICBsZXQgcmVjIHBwX21hY2hfaW50ZXJuYWwgbWF5X25lZWRfc3BhY2UgcHBmID0gZnVuY3Rpb25cbiAgICB8IEF0b20gc3RyIC0+XG4gICAgICBsZXQgc3RyJyA9IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHIgaW5cbiAgICAgIGxldCBuZXdfbWF5X25lZWRfc3BhY2UgPSBzdHInID09IHN0ciBpblxuICAgICAgaWYgbWF5X25lZWRfc3BhY2UgJiYgbmV3X21heV9uZWVkX3NwYWNlIHRoZW4gcHBfcHJpbnRfc3RyaW5nIHBwZiBcIiBcIjtcbiAgICAgIHBwX3ByaW50X3N0cmluZyBwcGYgc3RyJztcbiAgICAgIG5ld19tYXlfbmVlZF9zcGFjZVxuICAgIHwgTGlzdCAoaCA6OiB0KSAtPlxuICAgICAgcHBfcHJpbnRfc3RyaW5nIHBwZiBcIihcIjtcbiAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IHBwX21hY2hfaW50ZXJuYWwgZmFsc2UgcHBmIGggaW5cbiAgICAgIHBwX21hY2hfcmVzdCBtYXlfbmVlZF9zcGFjZSBwcGYgdDtcbiAgICAgIGZhbHNlXG4gICAgfCBMaXN0IFtdIC0+XG4gICAgICBwcF9wcmludF9zdHJpbmcgcHBmIFwiKClcIjtcbiAgICAgIGZhbHNlXG5cbiAgYW5kIHBwX21hY2hfcmVzdCBtYXlfbmVlZF9zcGFjZSBwcGYgPSBmdW5jdGlvblxuICAgIHwgaCA6OiB0IC0+XG4gICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBwcF9tYWNoX2ludGVybmFsIG1heV9uZWVkX3NwYWNlIHBwZiBoIGluXG4gICAgICBwcF9tYWNoX3Jlc3QgbWF5X25lZWRfc3BhY2UgcHBmIHRcbiAgICB8IFtdIC0+IHBwX3ByaW50X3N0cmluZyBwcGYgXCIpXCJcbiAgOztcblxuICBsZXQgcHBfaHVtIHBwZiBzZXhwID0gcHBfaHVtX2luZGVudCAhZGVmYXVsdF9pbmRlbnQgcHBmIHNleHBcbiAgbGV0IHBwX21hY2ggcHBmIHNleHAgPSBpZ25vcmUgKHBwX21hY2hfaW50ZXJuYWwgZmFsc2UgcHBmIHNleHApXG4gIGxldCBwcCA9IHBwX21hY2hcblxuICAoKiBTZXhwIHNpemUgKilcblxuICBsZXQgcmVjIHNpemVfbG9vcCAoKHYsIGMpIGFzIGFjYykgPSBmdW5jdGlvblxuICAgIHwgQXRvbSBzdHIgLT4gdiArIDEsIGMgKyBTdHJpbmcubGVuZ3RoIHN0clxuICAgIHwgTGlzdCBsc3QgLT4gTGlzdC5mb2xkX2xlZnQgbHN0IH5pbml0OmFjYyB+ZjpzaXplX2xvb3BcbiAgOztcblxuICBsZXQgc2l6ZSBzZXhwID0gc2l6ZV9sb29wICgwLCAwKSBzZXhwXG5cbiAgKCogQnVmZmVyIGNvbnZlcnNpb25zICopXG5cbiAgbGV0IHRvX2J1ZmZlcl9odW0gfmJ1ZiA/KGluZGVudCA9ICFkZWZhdWx0X2luZGVudCkgc2V4cCA9XG4gICAgbGV0IHBwZiA9IEZvcm1hdC5mb3JtYXR0ZXJfb2ZfYnVmZmVyIGJ1ZiBpblxuICAgIEZvcm1hdC5mcHJpbnRmIHBwZiBcIiVhQD9cIiAocHBfaHVtX2luZGVudCBpbmRlbnQpIHNleHBcbiAgOztcblxuICBsZXQgdG9fYnVmZmVyX21hY2ggfmJ1ZiBzZXhwID1cbiAgICBsZXQgcmVjIGxvb3AgbWF5X25lZWRfc3BhY2UgPSBmdW5jdGlvblxuICAgICAgfCBBdG9tIHN0ciAtPlxuICAgICAgICBsZXQgc3RyJyA9IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHIgaW5cbiAgICAgICAgbGV0IG5ld19tYXlfbmVlZF9zcGFjZSA9IHN0cicgPT0gc3RyIGluXG4gICAgICAgIGlmIG1heV9uZWVkX3NwYWNlICYmIG5ld19tYXlfbmVlZF9zcGFjZSB0aGVuIEJ1ZmZlci5hZGRfY2hhciBidWYgJyAnO1xuICAgICAgICBCdWZmZXIuYWRkX3N0cmluZyBidWYgc3RyJztcbiAgICAgICAgbmV3X21heV9uZWVkX3NwYWNlXG4gICAgICB8IExpc3QgKGggOjogdCkgLT5cbiAgICAgICAgQnVmZmVyLmFkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IGxvb3AgZmFsc2UgaCBpblxuICAgICAgICBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgdDtcbiAgICAgICAgZmFsc2VcbiAgICAgIHwgTGlzdCBbXSAtPlxuICAgICAgICBCdWZmZXIuYWRkX3N0cmluZyBidWYgXCIoKVwiO1xuICAgICAgICBmYWxzZVxuICAgIGFuZCBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgPSBmdW5jdGlvblxuICAgICAgfCBoIDo6IHQgLT5cbiAgICAgICAgbGV0IG1heV9uZWVkX3NwYWNlID0gbG9vcCBtYXlfbmVlZF9zcGFjZSBoIGluXG4gICAgICAgIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSB0XG4gICAgICB8IFtdIC0+IEJ1ZmZlci5hZGRfY2hhciBidWYgJyknXG4gICAgaW5cbiAgICBpZ25vcmUgKGxvb3AgZmFsc2Ugc2V4cClcbiAgOztcblxuICBsZXQgdG9fYnVmZmVyID0gdG9fYnVmZmVyX21hY2hcblxuICBsZXQgdG9fYnVmZmVyX2dlbiB+YnVmIH5hZGRfY2hhciB+YWRkX3N0cmluZyBzZXhwID1cbiAgICBsZXQgcmVjIGxvb3AgbWF5X25lZWRfc3BhY2UgPSBmdW5jdGlvblxuICAgICAgfCBBdG9tIHN0ciAtPlxuICAgICAgICBsZXQgc3RyJyA9IG1hY2hfbWF5YmVfZXNjX3N0ciBzdHIgaW5cbiAgICAgICAgbGV0IG5ld19tYXlfbmVlZF9zcGFjZSA9IHN0cicgPT0gc3RyIGluXG4gICAgICAgIGlmIG1heV9uZWVkX3NwYWNlICYmIG5ld19tYXlfbmVlZF9zcGFjZSB0aGVuIGFkZF9jaGFyIGJ1ZiAnICc7XG4gICAgICAgIGFkZF9zdHJpbmcgYnVmIHN0cic7XG4gICAgICAgIG5ld19tYXlfbmVlZF9zcGFjZVxuICAgICAgfCBMaXN0IChoIDo6IHQpIC0+XG4gICAgICAgIGFkZF9jaGFyIGJ1ZiAnKCc7XG4gICAgICAgIGxldCBtYXlfbmVlZF9zcGFjZSA9IGxvb3AgZmFsc2UgaCBpblxuICAgICAgICBsb29wX3Jlc3QgbWF5X25lZWRfc3BhY2UgdDtcbiAgICAgICAgZmFsc2VcbiAgICAgIHwgTGlzdCBbXSAtPlxuICAgICAgICBhZGRfc3RyaW5nIGJ1ZiBcIigpXCI7XG4gICAgICAgIGZhbHNlXG4gICAgYW5kIGxvb3BfcmVzdCBtYXlfbmVlZF9zcGFjZSA9IGZ1bmN0aW9uXG4gICAgICB8IGggOjogdCAtPlxuICAgICAgICBsZXQgbWF5X25lZWRfc3BhY2UgPSBsb29wIG1heV9uZWVkX3NwYWNlIGggaW5cbiAgICAgICAgbG9vcF9yZXN0IG1heV9uZWVkX3NwYWNlIHRcbiAgICAgIHwgW10gLT4gYWRkX2NoYXIgYnVmICcpJ1xuICAgIGluXG4gICAgaWdub3JlIChsb29wIGZhbHNlIHNleHApXG4gIDs7XG5cbiAgKCogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHRoaW5nIG9uIHRoZSBtaW5vciBoZWFwIGlzIDI1NiB3b3Jkcy5cbiAgICAgUHJldmlvdXNseSwgdGhpcyBzaXplIG9mIHRoZSByZXR1cm5lZCBidWZmZXIgaGVyZSB3YXMgNDA5NiBieXRlcywgd2hpY2hcbiAgICAgY2F1c2VkIHRoZSBCdWZmZXIgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSAqbWFqb3IqIGhlYXAgZXZlcnkgdGltZS5cblxuICAgICBBY2NvcmRpbmcgdG8gYSBzaW1wbGUgYmVuY2htYXJrIGJ5IFJvbiwgd2UgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yXG4gICAgIHNtYWxsIHMtZXhwcmVzc2lvbnMgYnkgYSBmYWN0b3Igb2YgfjQgaWYgd2Ugb25seSBhbGxvY2F0ZSAxMDI0IGJ5dGVzXG4gICAgICgxMjggd29yZHMgKyBzb21lIHNtYWxsIG92ZXJoZWFkKSB3b3J0aCBvZiBidWZmZXIgaW5pdGlhbGx5LiAgQW5kIG9uZVxuICAgICBjYW4gYXJndWUgdGhhdCBpZiBpdCdzIGZyZWUgdG8gYWxsb2NhdGUgc3RyaW5ncyBzbWFsbGVyIHRoYW4gMjU2IHdvcmRzLFxuICAgICBsYXJnZSBzLWV4cHJlc3Npb25zIHJlcXVpcmluZyBsYXJnZXIgZXhwZW5zaXZlIGJ1ZmZlcnMgd29uJ3Qgbm90aWNlXG4gICAgIHRoZSBleHRyYSB0d28gZG91YmxpbmdzIGZyb20gMTAyNCBieXRlcyB0byAyMDQ4IGFuZCA0MDk2LiBBbmQgZXNwZWNpYWxseVxuICAgICBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgYXBwbGljYXRpb25zIHRvIGFsd2F5cyBwYXNzIGluIGEgbGFyZ2VyIGJ1ZmZlciB0b1xuICAgICB1c2UuICopXG4gIGxldCBidWZmZXIgKCkgPSBCdWZmZXIuY3JlYXRlIDEwMjRcblxuICAoKiBTdHJpbmcgY29udmVyc2lvbnMgKilcblxuICBsZXQgdG9fc3RyaW5nX2h1bSA/aW5kZW50ID0gZnVuY3Rpb25cbiAgICB8IEF0b20gc3RyXG4gICAgICB3aGVuIG1hdGNoIGluZGV4X29mX25ld2xpbmUgc3RyIDAgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgICB8IFNvbWUgXyAtPiBmYWxzZSAtPiBtYWNoX21heWJlX2VzY19zdHIgc3RyXG4gICAgfCBzZXhwIC0+XG4gICAgICBsZXQgYnVmID0gYnVmZmVyICgpIGluXG4gICAgICB0b19idWZmZXJfaHVtID9pbmRlbnQgc2V4cCB+YnVmO1xuICAgICAgQnVmZmVyLmNvbnRlbnRzIGJ1ZlxuICA7O1xuXG4gIGxldCB0b19zdHJpbmdfbWFjaCA9IGZ1bmN0aW9uXG4gICAgfCBBdG9tIHN0ciAtPiBtYWNoX21heWJlX2VzY19zdHIgc3RyXG4gICAgfCBzZXhwIC0+XG4gICAgICBsZXQgYnVmID0gYnVmZmVyICgpIGluXG4gICAgICB0b19idWZmZXJfbWFjaCBzZXhwIH5idWY7XG4gICAgICBCdWZmZXIuY29udGVudHMgYnVmXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ19tYWNoXG5lbmRcblxuaW5jbHVkZSBQcmludGluZ1xuXG5sZXQgb2ZfZmxvYXRfc3R5bGUgOiBbIGBVbmRlcnNjb3JlcyB8IGBOb191bmRlcnNjb3JlcyBdIHJlZiA9IHJlZiBgTm9fdW5kZXJzY29yZXNcbmxldCBvZl9pbnRfc3R5bGUgOiBbIGBVbmRlcnNjb3JlcyB8IGBOb191bmRlcnNjb3JlcyBdIHJlZiA9IHJlZiBgTm9fdW5kZXJzY29yZXNcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmludGluZ1xuZW5kXG5cbmxldCBtZXNzYWdlIG5hbWUgZmllbGRzID1cbiAgbGV0IHJlYyBjb252X2ZpZWxkcyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBbXVxuICAgIHwgKGZuYW1lLCBmc2V4cCkgOjogcmVzdCAtPlxuICAgICAgKG1hdGNoIGZuYW1lIHdpdGhcbiAgICAgICB8IFwiXCIgLT4gZnNleHAgOjogY29udl9maWVsZHMgcmVzdFxuICAgICAgIHwgXyAtPiBMaXN0IFsgQXRvbSBmbmFtZTsgZnNleHAgXSA6OiBjb252X2ZpZWxkcyByZXN0KVxuICBpblxuICBMaXN0IChBdG9tIG5hbWUgOjogY29udl9maWVsZHMgZmllbGRzKVxuOztcbiIsIigqKiBSZXByZXNlbnRhdGlvbiBvZiBTLWV4cHJlc3Npb24gZ3JhbW1hcnMgKilcblxuKCoqIFRoaXMgbW9kdWxlIGRlZmluZXMgYSByZXByZXNlbnRhdGlvbiBmb3Igcy1leHByZXNzaW9uIGdyYW1tYXJzLiBVc2luZyBwcHhfc2V4cF9jb252XG4gICAgYW5kIFtbQEBkZXJpdmluZyBzZXhwX2dyYW1tYXJdXSBwcm9kdWNlcyBhIGdyYW1tYXIgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGRlcml2ZWRcbiAgICBbb2Zfc2V4cF0gZm9yIGEgZ2l2ZW4gdHlwZS5cblxuICAgIEFzIHdpdGggb3RoZXIgZGVyaXZlZCBkZWZpbml0aW9ucywgcG9seW1vcnBoaWMgdHlwZXMgZGVyaXZlIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhXG4gICAgZ3JhbW1hciBmb3IgZWFjaCB0eXBlIGFyZ3VtZW50IGFuZCBwcm9kdWNlcyBhIGdyYW1tYXIgZm9yIHRoZSBtb25vbW9ycGhpemVkIHR5cGUuXG5cbiAgICBNb25vbW9ycGhpYyB0eXBlcyBkZXJpdmUgYSBncmFtbWFyIGRpcmVjdGx5LiBUbyBhdm9pZCB0b3AtbGV2ZWwgc2lkZSBlZmZlY3RzLFxuICAgIFtbQEBkZXJpdmluZyBzZXhwX2dyYW1tYXJdXSB3cmFwcyBncmFtbWFycyBpbiB0aGUgW0xhenldIGNvbnN0cnVjdG9yIGFzIG5lZWRlZC5cblxuICAgIFRoaXMgdHlwZSBtYXkgY2hhbmdlIG92ZXIgdGltZSBhcyBvdXIgbmVlZHMgZm9yIGV4cHJlc3NpdmUgZ3JhbW1hcnMgY2hhbmdlLiBXZSB3aWxsXG4gICAgYXR0ZW1wdCB0byBtYWtlIGNoYW5nZXMgYmFja3dhcmQtY29tcGF0aWJsZSwgb3IgYXQgbGVhc3QgcHJvdmlkZSBhIHJlYXNvbmFibGUgdXBncmFkZVxuICAgIHBhdGguICopXG5cbltAQEB3YXJuaW5nIFwiLTMwXCJdICgqIGFsbG93IGR1cGxpY2F0ZSBmaWVsZCBuYW1lcyAqKVxuXG4oKiogR3JhbW1hciBvZiBhIHNleHAuICopXG50eXBlIGdyYW1tYXIgPVxuICB8IEFueSBvZiBzdHJpbmcgKCoqIGFjY2VwdHMgYW55IHNleHA7IHN0cmluZyBpcyBhIHR5cGUgbmFtZSBmb3IgaHVtYW4gcmVhZGFiaWxpdHkgKilcbiAgfCBCb29sICgqKiBhY2NlcHRzIHRoZSBhdG9tcyBcInRydWVcIiBvciBcImZhbHNlXCIsIG1vZHVsbyBjYXBpdGFsaXphdGlvbiAqKVxuICB8IENoYXIgKCoqIGFjY2VwdHMgYW55IHNpbmdsZS1jaGFyYWN0ZXIgYXRvbSAqKVxuICB8IEludGVnZXIgKCoqIGFjY2VwdHMgYW55IGF0b20gbWF0Y2hpbmcgb2NhbWwgaW50ZWdlciBzeW50YXgsIHJlZ2FyZGxlc3Mgb2YgYml0IHdpZHRoICopXG4gIHwgRmxvYXQgKCoqIGFjY2VwdHMgYW55IGF0b20gbWF0Y2hpbmcgb2NhbWwgZmxvYXQgc3ludGF4ICopXG4gIHwgU3RyaW5nICgqKiBhY2NlcHRzIGFueSBhdG9tICopXG4gIHwgT3B0aW9uIG9mIGdyYW1tYXIgKCoqIGFjY2VwdHMgYW4gb3B0aW9uLCBib3RoIFtOb25lXSB2cyBbU29tZSBfXSBhbmQgWygpXSB2cyBbKF8pXS4gKilcbiAgfCBMaXN0IG9mIGxpc3RfZ3JhbW1hciAoKiogYWNjZXB0cyBhIGxpc3QgKilcbiAgfCBWYXJpYW50IG9mIHZhcmlhbnQgKCoqIGFjY2VwdHMgY2xhdXNlcyBrZXllZCBieSBhIGxlYWRpbmcgb3Igc29sZSBhdG9tICopXG4gIHwgVW5pb24gb2YgZ3JhbW1hciBsaXN0ICgqKiBhY2NlcHRzIGEgc2V4cCBpZiBhbnkgb2YgdGhlIGxpc3RlZCBncmFtbWFycyBhY2NlcHRzIGl0ICopXG4gIHwgVGFnZ2VkIG9mIGdyYW1tYXIgd2l0aF90YWdcbiAgKCoqIGFubm90YXRlcyBhIGdyYW1tYXIgd2l0aCBhIGNsaWVudC1zcGVjaWZpYyBrZXkvdmFsdWUgcGFpciAqKVxuICB8IFR5dmFyIG9mIHN0cmluZ1xuICAoKiogTmFtZSBvZiBhIHR5cGUgdmFyaWFibGUsIGUuZy4gW1R5dmFyIFwiYVwiXSBmb3IgWydhXS4gT25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGJvZHkgb2ZcbiAgICAgIHRoZSBpbm5lcm1vc3QgZW5jbG9zaW5nIFtkZWZuXSBkZWZpbmVzIGEgY29ycmVzcG9uZGluZyB0eXBlIHZhcmlhYmxlLiAqKVxuICB8IFR5Y29uIG9mIHN0cmluZyAqIGdyYW1tYXIgbGlzdFxuICAoKiogVHlwZSBjb25zdHJ1Y3RvciBhcHBsaWVkIHRvIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUsIFtUeWNvbiAoXCJsaXN0XCIsIFsgSW50ZWdlciBdKV1cbiAgICAgIHJlcHJlc2VudHMgW2ludCBsaXN0XS4gT25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGlubmVybW9zdCBlbmNsb3NpbmcgW1JlY3Vyc2l2ZV1cbiAgICAgIGdyYW1tYXIgZGVmaW5lcyBhIGNvcnJlc3BvbmRpbmcgdHlwZSBjb25zdHJ1Y3Rvci4gKilcbiAgfCBSZWN1cnNpdmUgb2YgZ3JhbW1hciAqIGRlZm4gbGlzdFxuICAoKiogW1JlY3Vyc2l2ZSAoZ3JhbW1hciwgZGVmaW5pdGlvbnMpXSBhbGxvd3MgW2dyYW1tYXJdIHRvIHJlZmVyIHRvIHR5cGUgY29uc3RydWN0b3JzXG4gICAgICBmcm9tIHRoZSBtdXR1YWxseSByZWN1cnNpdmUgW2RlZmluaXRpb25zXS4gVGhlIGRlZmluaXRpb25zIG1heSBhbHNvIHJlZmVyIHRvIGVhY2hcbiAgICAgIG90aGVycycgdHlwZSBjb25zdHJ1Y3RvcnMuXG5cbiAgICAgIE9yZGluYXJpbHksIFtncmFtbWFyXSBpdHNlbGYgaXMganVzdCBhIFtUeWNvbl0gYXJndW1lbnQsIGFsdGhvdWdoIHRlY2huaWNhbGx5IGl0IGNhblxuICAgICAgYmUgYW55IGdyYW1tYXIuXG5cbiAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGRlZmluZSBhIGJpbmFyeSB0cmVlIHBhcmFtZXRlcml6ZWQgYnkgYSB0eXBlXG4gICAgICBzdG9yZWQgYXQgaXRzIGxlYXZlcy5cblxuICAgICAge1tcbiAgICAgICAgbGV0IGRlZm5zID1cbiAgICAgICAgICBbIHsgdHljb24gPSBcInRyZWVcIlxuICAgICAgICAgICAgOyB0eXZhcnMgPSBbXCJhXCJdXG4gICAgICAgICAgICA7IGdyYW1tYXIgPVxuICAgICAgICAgICAgICAgIFZhcmlhbnRcbiAgICAgICAgICAgICAgICAgIHsgbmFtZV9raW5kID0gQ2FwaXRhbGl6ZWRcbiAgICAgICAgICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgWyB7IG5hbWUgPSBcIk5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOyBhcmdzID0gQ29ucyAoVHljb24gKFwibm9kZVwiLCBbVHl2YXIgXCJhXCJdKSwgRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgOyB7IG5hbWUgPSBcIlRyZWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOyBhcmdzID0gQ29ucyAoVHljb24gKFwibGVhZlwiLCBbVHl2YXIgXCJhXCJdKSwgRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDsgeyB0eWNvbiA9IFwibm9kZVwiXG4gICAgICAgICAgICA7IHR5dmFycyA9IFtcImFcIl1cbiAgICAgICAgICAgIDsgZ3JhbW1hciA9IExpc3QgKE1hbnkgKFR5Y29uIFwidHJlZVwiLCBbVHl2YXIgXCJhXCJdKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA7IHsgdHljb24gPSBcImxlYWZcIlxuICAgICAgICAgICAgOyB0eXZhcnMgPSBbXCJhXCJdXG4gICAgICAgICAgICA7IGdyYW1tYXIgPSBbVHl2YXIgXCJhXCJdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICA7O1xuICAgICAgXX1cblxuICAgICAgTm9ybWFsbHksIHRoZSB0eXBlIG9mIGEgdHJlZSBzdG9yaW5nIGludGVnZXJzIHdvdWxkIGJlIHdyaXR0ZW4gbGlrZSB0aGlzOlxuXG4gICAgICB7W1xuICAgICAgICBSZWN1cnNpdmUgKFR5Y29uIChcInRyZWVcIiwgWyBJbnRlZ2VyIF0pLCBkZWZucylcbiAgICAgIF19XG5cbiAgICAgIEl0IGlzIGVxdWl2YWxlbnQsIHRob3VnaCBuZWVkbGVzc2x5IHZlcmJvc2UsIHRvIHJlcGxhY2UgdGhlIFtUeWNvbl0gcmVmZXJlbmNlIHdpdGhcbiAgICAgIHRoZSBncmFtbWFyIG9mIFtcInRyZWVcIl0sIHN1YnN0aXR1dGluZyBbSW50ZWdlcl0gZm9yIFtUeXZhciBcImFcIl06XG5cbiAgICAgIHtbXG4gICAgICAgIFJlY3Vyc2l2ZVxuICAgICAgICAgICggVmFyaWFudFxuICAgICAgICAgICAgICB7IG5hbWVfa2luZCA9IENhcGl0YWxpemVkXG4gICAgICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgICAgICBbIHsgbmFtZSA9IFwiTm9kZVwiXG4gICAgICAgICAgICAgICAgICAgIDsgYXJncyA9IENvbnMgKFR5Y29uIChcIm5vZGVcIiwgW1R5dmFyIFwiYVwiXSksIEVtcHR5KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA7IHsgbmFtZSA9IFwiVHJlZVwiXG4gICAgICAgICAgICAgICAgICAgIDsgYXJncyA9IENvbnMgKFR5Y29uIChcImxlYWZcIiwgW1R5dmFyIFwiYVwiXSksIEVtcHR5KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAsIGRlZm5zIClcbiAgICAgIF19XG4gICopXG4gIHwgTGF6eSBvZiBncmFtbWFyIGxhenlfdFxuICAoKiogTGF6aWx5IGNvbXB1dGVkIGdyYW1tYXIuIFVzZSBbTGF6eV0gdG8gYXZvaWQgdG9wLWxldmVsIHNpZGUgZWZmZWN0cy4gVG8gZGVmaW5lXG4gICAgICByZWN1cnNpdmUgZ3JhbW1hcnMsIHVzZSBbUmVjdXJzaXZlXSBpbnN0ZWFkLiAqKVxuXG4oKiogR3JhbW1hciBvZiBhIGxpc3Qgb2Ygc2V4cHMuICopXG5hbmQgbGlzdF9ncmFtbWFyID1cbiAgfCBFbXB0eSAoKiogYWNjZXB0cyBhbiBlbXB0eSBsaXN0IG9mIHNleHBzICopXG4gIHwgQ29ucyBvZiBncmFtbWFyICogbGlzdF9ncmFtbWFyXG4gICgqKiBhY2NlcHRzIGEgbm9uLWVtcHR5IGxpc3Qgd2l0aCBoZWFkIGFuZCB0YWlsIG1hdGNoaW5nIHRoZSBnaXZlbiBncmFtbWFycyAqKVxuICB8IE1hbnkgb2YgZ3JhbW1hciAoKiogYWNjZXB0cyB6ZXJvIG9yIG1vcmUgc2V4cHMsIGVhY2ggbWF0Y2hpbmcgdGhlIGdpdmVuIGdyYW1tYXIgKilcbiAgfCBGaWVsZHMgb2YgcmVjb3JkICgqKiBhY2NlcHRzIHNleHBzIHJlcHJlc2VudGluZyBmaWVsZHMgb2YgYSByZWNvcmQgKilcblxuKCoqIENhc2Ugc2Vuc2l0aXZpdHkgb3B0aW9ucyBmb3IgbmFtZXMgb2YgdmFyaWFudCBjb25zdHJ1Y3RvcnMuICopXG5hbmQgY2FzZV9zZW5zaXRpdml0eSA9XG4gIHwgQ2FzZV9pbnNlbnNpdGl2ZSAoKiogQ29tcGFyaXNvbiBpcyBjYXNlIGluc2Vuc2l0aXZlLiBVc2VkIGZvciBjdXN0b20gcGFyc2Vycy4gKilcbiAgfCBDYXNlX3NlbnNpdGl2ZSAoKiogQ29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4gVXNlZCBmb3IgcG9seW1vcnBoaWMgdmFyaWFudHMuICopXG4gIHwgQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAoKiogQ29tcGFyaXNvbiBpcyBjYXNlIGluc2Vuc2l0aXZlIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIGFuZCBjYXNlIHNlbnNpdGl2ZSBhZnRlcndhcmQuXG4gICAgICBVc2VkIGZvciByZWd1bGFyIHZhcmlhbnRzLiAqKVxuXG4oKiogR3JhbW1hciBvZiB2YXJpYW50cy4gQWNjZXB0cyBhbnkgc2V4cCBtYXRjaGluZyBvbmUgb2YgdGhlIGNsYXVzZXMuICopXG5hbmQgdmFyaWFudCA9XG4gIHsgY2FzZV9zZW5zaXRpdml0eSA6IGNhc2Vfc2Vuc2l0aXZpdHlcbiAgOyBjbGF1c2VzIDogY2xhdXNlIHdpdGhfdGFnX2xpc3QgbGlzdFxuICB9XG5cbigqKiBHcmFtbWFyIG9mIGEgc2luZ2xlIHZhcmlhbnQgY2xhdXNlLiBBY2NlcHRzIHNleHBzIGJhc2VkIG9uIHRoZSBbY2xhdXNlX2tpbmRdLiAqKVxuYW5kIGNsYXVzZSA9XG4gIHsgbmFtZSA6IHN0cmluZ1xuICA7IGNsYXVzZV9raW5kIDogY2xhdXNlX2tpbmRcbiAgfVxuXG4oKiogR3JhbW1hciBvZiBhIHNpbmdsZSB2YXJpYW50IGNsYXVzZSdzIGNvbnRlbnRzLiBbQXRvbV9jbGF1c2VdIGFjY2VwdHMgYW4gYXRvbSBtYXRjaGluZ1xuICAgIHRoZSBjbGF1c2UncyBuYW1lLiBbTGlzdF9jbGF1c2VdIGFjY2VwdHMgYSBsaXN0IHdob3NlIGhlYWQgaXMgYW4gYXRvbSBtYXRjaGluZyB0aGVcbiAgICBjbGF1c2UncyBuYW1lIGFuZCB3aG9zZSB0YWlsIG1hdGNoZXMgW2FyZ3NdLiBUaGUgY2xhdXNlJ3MgbmFtZSBpcyBtYXRjaGVkIG1vZHVsbyB0aGVcbiAgICB2YXJpYW50J3MgW25hbWVfa2luZF0uICopXG5hbmQgY2xhdXNlX2tpbmQgPVxuICB8IEF0b21fY2xhdXNlXG4gIHwgTGlzdF9jbGF1c2Ugb2YgeyBhcmdzIDogbGlzdF9ncmFtbWFyIH1cblxuKCoqIEdyYW1tYXIgb2YgYSByZWNvcmQuIEFjY2VwdHMgYW55IGxpc3Qgb2Ygc2V4cHMgc3BlY2lmeWluZyBlYWNoIG9mIHRoZSBmaWVsZHMsXG4gICAgcmVnYXJkbGVzcyBvZiBvcmRlci4gSWYgW2FsbG93X2V4dHJhX2ZpZWxkc10gaXMgc3BlY2lmaWVkLCBpZ25vcmVzIHNleHBzIHdpdGggbmFtZXNcbiAgICBub3QgZm91bmQgaW4gW2ZpZWxkc10uICopXG5hbmQgcmVjb3JkID1cbiAgeyBhbGxvd19leHRyYV9maWVsZHMgOiBib29sXG4gIDsgZmllbGRzIDogZmllbGQgd2l0aF90YWdfbGlzdCBsaXN0XG4gIH1cblxuKCoqIEdyYW1tYXIgb2YgYSByZWNvcmQgZmllbGQuIEEgZmllbGQgbXVzdCBzaG93IHVwIGV4YWN0bHkgb25jZSBpbiBhIHJlY29yZCBpZlxuICAgIFtyZXF1aXJlZF0sIG9yIGF0IG1vc3Qgb25jZSBvdGhlcndpc2UuIEFjY2VwdHMgYSBsaXN0IGhlYWRlZCBieSBbbmFtZV0gYXMgYW4gYXRvbSxcbiAgICBmb2xsb3dlZCBieSBzZXhwcyBtYXRjaGluZyBbYXJnc10uICopXG5hbmQgZmllbGQgPVxuICB7IG5hbWUgOiBzdHJpbmdcbiAgOyByZXF1aXJlZCA6IGJvb2xcbiAgOyBhcmdzIDogbGlzdF9ncmFtbWFyXG4gIH1cblxuKCoqIEdyYW1tYXIgdGFnZ2VkIHdpdGggY2xpZW50LXNwZWNpZmljIGtleS92YWx1ZSBwYWlyLiAqKVxuYW5kICdhIHdpdGhfdGFnID1cbiAgeyBrZXkgOiBzdHJpbmdcbiAgOyB2YWx1ZSA6IFNleHAudFxuICA7IGdyYW1tYXIgOiAnYVxuICB9XG5cbmFuZCAnYSB3aXRoX3RhZ19saXN0ID1cbiAgfCBUYWcgb2YgJ2Egd2l0aF90YWdfbGlzdCB3aXRoX3RhZ1xuICB8IE5vX3RhZyBvZiAnYVxuXG4oKiogR3JhbW1hciBvZiBhIHJlY3Vyc2l2ZSB0eXBlIGRlZmluaXRpb24uIE5hbWVzIHRoZSBbdHljb25dIGJlaW5nIGRlZmluZWQsIGFuZCB0aGVcbiAgICBbdHl2YXJzXSBpdCB0YWtlcyBhcyBwYXJhbWV0ZXJzLiBTcGVjaWZpZXMgdGhlIFtncmFtbWFyXSBvZiB0aGUgW3R5Y29uXS4gVGhlIGdyYW1tYXJcbiAgICBtYXkgcmVmZXIgdG8gYW55IG9mIHRoZSBbdHl2YXJzXSwgYW5kIHRvIGFueSBvZiB0aGUgW3R5Y29uXXMgZnJvbSB0aGUgc2FtZSBzZXQgb2ZcbiAgICBbUmVjdXJzaXZlXSBkZWZpbml0aW9ucy4gKilcbmFuZCBkZWZuID1cbiAgeyB0eWNvbiA6IHN0cmluZ1xuICA7IHR5dmFycyA6IHN0cmluZyBsaXN0XG4gIDsgZ3JhbW1hciA6IGdyYW1tYXJcbiAgfVxuXG4oKiogVG9wLWxldmVsIGdyYW1tYXIgdHlwZS4gSGFzIGEgcGhhbnRvbSB0eXBlIHBhcmFtZXRlciB0byBhc3NvY2lhdGUgZWFjaCBncmFtbWFyIHdpdGhcbiAgICB0aGUgdHlwZSBpdHMgc2V4cHMgcmVwcmVzZW50LiBUaGlzIG1ha2VzIGl0IGhhcmRlciB0byBhcHBseSBncmFtbWFycyB0byB0aGUgd3JvbmdcbiAgICB0eXBlLCB3aGlsZSBncmFtbWFycyBjYW4gc3RpbGwgYmUgZWFzaWx5IGNvZXJjZWQgdG8gYSBuZXcgdHlwZSBpZiBuZWVkZWQuICopXG50eXBlIF8gdCA9IHsgdW50eXBlZCA6IGdyYW1tYXIgfSBbQEB1bmJveGVkXVxuXG5sZXQgY29lcmNlICh0eXBlIGEgYikgKHsgdW50eXBlZCA9IF8gfSBhcyB0IDogYSB0KSA6IGIgdCA9IHRcblxuKCoqIFRoaXMgcmVzZXJ2ZWQga2V5IGlzIHVzZWQgZm9yIGFsbCB0YWdzIGdlbmVyYXRlZCBmcm9tIGRvYyBjb21tZW50cy4gKilcbmxldCBkb2NfY29tbWVudF90YWcgPSBcInNleHBfZ3JhbW1hci5kb2NfY29tbWVudFwiXG4iLCJsZXQgdW5pdF9zZXhwX2dyYW1tYXIgOiB1bml0IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gTGlzdCBFbXB0eSB9XG5sZXQgYm9vbF9zZXhwX2dyYW1tYXIgOiBib29sIFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gQm9vbCB9XG5sZXQgc3RyaW5nX3NleHBfZ3JhbW1hciA6IHN0cmluZyBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IFN0cmluZyB9XG5sZXQgYnl0ZXNfc2V4cF9ncmFtbWFyIDogYnl0ZXMgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBTdHJpbmcgfVxubGV0IGNoYXJfc2V4cF9ncmFtbWFyIDogY2hhciBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IENoYXIgfVxubGV0IGludF9zZXhwX2dyYW1tYXIgOiBpbnQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBJbnRlZ2VyIH1cbmxldCBmbG9hdF9zZXhwX2dyYW1tYXIgOiBmbG9hdCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEZsb2F0IH1cbmxldCBpbnQzMl9zZXhwX2dyYW1tYXIgOiBpbnQzMiBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEludGVnZXIgfVxubGV0IGludDY0X3NleHBfZ3JhbW1hciA6IGludDY0IFNleHBfZ3JhbW1hci50ID0geyB1bnR5cGVkID0gSW50ZWdlciB9XG5sZXQgbmF0aXZlaW50X3NleHBfZ3JhbW1hciA6IG5hdGl2ZWludCBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IEludGVnZXIgfVxubGV0IHNleHBfdF9zZXhwX2dyYW1tYXIgOiBTZXhwLnQgU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBBbnkgXCJTZXhwLnRcIiB9XG5sZXQgcmVmX3NleHBfZ3JhbW1hciBncmFtbWFyID0gU2V4cF9ncmFtbWFyLmNvZXJjZSBncmFtbWFyXG5sZXQgbGF6eV90X3NleHBfZ3JhbW1hciBncmFtbWFyID0gU2V4cF9ncmFtbWFyLmNvZXJjZSBncmFtbWFyXG5cbmxldCBvcHRpb25fc2V4cF9ncmFtbWFyICh7IHVudHlwZWQgfSA6IF8gU2V4cF9ncmFtbWFyLnQpIDogXyBvcHRpb24gU2V4cF9ncmFtbWFyLnQgPVxuICB7IHVudHlwZWQgPSBPcHRpb24gdW50eXBlZCB9XG47O1xuXG5sZXQgbGlzdF9zZXhwX2dyYW1tYXIgKHsgdW50eXBlZCB9IDogXyBTZXhwX2dyYW1tYXIudCkgOiBfIGxpc3QgU2V4cF9ncmFtbWFyLnQgPVxuICB7IHVudHlwZWQgPSBMaXN0IChNYW55IHVudHlwZWQpIH1cbjs7XG5cbmxldCBhcnJheV9zZXhwX2dyYW1tYXIgKHsgdW50eXBlZCB9IDogXyBTZXhwX2dyYW1tYXIudCkgOiBfIGFycmF5IFNleHBfZ3JhbW1hci50ID1cbiAgeyB1bnR5cGVkID0gTGlzdCAoTWFueSB1bnR5cGVkKSB9XG47O1xuXG5sZXQgZW1wdHlfc2V4cF9ncmFtbWFyIDogXyBTZXhwX2dyYW1tYXIudCA9IHsgdW50eXBlZCA9IFVuaW9uIFtdIH1cbmxldCBvcGFxdWVfc2V4cF9ncmFtbWFyID0gZW1wdHlfc2V4cF9ncmFtbWFyXG5sZXQgZnVuX3NleHBfZ3JhbW1hciA9IGVtcHR5X3NleHBfZ3JhbW1hclxuIiwiKCogVXRpbGl0eSBNb2R1bGUgZm9yIFMtZXhwcmVzc2lvbiBDb252ZXJzaW9ucyAqKVxuXG5vcGVuIFN0ZExhYmVsc1xub3BlbiBNb3JlTGFiZWxzXG5vcGVuIFByaW50Zlxub3BlbiBTZXhwXG5cbigqIENvbnZlcnNpb24gb2YgT0NhbWwtdmFsdWVzIHRvIFMtZXhwcmVzc2lvbnMgKilcbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxuKCogJyUuMTdnJyBpcyBndWFyYW50ZWVkIHRvIGJlIHJvdW5kLXRyaXBwYWJsZS5cblxuICAgJyUuMTVnJyB3aWxsIGJlIHJvdW5kLXRyaXBwYWJsZSBhbmQgbm90IGhhdmUgbm9pc2UgYXQgdGhlIGxhc3QgZGlnaXQgb3IgdHdvIGZvciBhIGZsb2F0XG4gICB3aGljaCB3YXMgY29udmVydGVkIGZyb20gYSBkZWNpbWFsIChzdHJpbmcpIHdpdGggPD0gMTUgc2lnbmlmaWNhbnQgZGlnaXRzLiAgU28gaXQnc1xuICAgd29ydGggdHJ5aW5nIGZpcnN0IHRvIGF2b2lkIHRoaW5ncyBsaWtlIFwiMy4xNDAwMDAwMDAwMDAwMDAxXCIuXG5cbiAgIFNlZSBjb21tZW50IGFib3ZlIFt0b19zdHJpbmdfcm91bmRfdHJpcHBhYmxlXSBpbiB7IUNvcmUuRmxvYXR9IGZvclxuICAgZGV0YWlsZWQgZXhwbGFuYXRpb24gYW5kIGV4YW1wbGVzLiAqKVxubGV0IGRlZmF1bHRfc3RyaW5nX29mX2Zsb2F0ID1cbiAgcmVmIChmdW4geCAtPlxuICAgIGxldCB5ID0gZm9ybWF0X2Zsb2F0IFwiJS4xNUdcIiB4IGluXG4gICAgaWYgZmxvYXRfb2Zfc3RyaW5nIHkgPSB4IHRoZW4geSBlbHNlIGZvcm1hdF9mbG9hdCBcIiUuMTdHXCIgeClcbjs7XG5cbmxldCByZWFkX29sZF9vcHRpb25fZm9ybWF0ID0gcmVmIHRydWVcbmxldCB3cml0ZV9vbGRfb3B0aW9uX2Zvcm1hdCA9IHJlZiB0cnVlXG5sZXQgbGlzdF9tYXAgZiBsID0gTGlzdC5yZXYgKExpc3QucmV2X21hcCBsIH5mKVxubGV0IHNleHBfb2ZfdW5pdCAoKSA9IExpc3QgW11cbmxldCBzZXhwX29mX2Jvb2wgYiA9IEF0b20gKHN0cmluZ19vZl9ib29sIGIpXG5sZXQgc2V4cF9vZl9zdHJpbmcgc3RyID0gQXRvbSBzdHJcbmxldCBzZXhwX29mX2J5dGVzIGJ5dGVzID0gQXRvbSAoQnl0ZXMudG9fc3RyaW5nIGJ5dGVzKVxubGV0IHNleHBfb2ZfY2hhciBjID0gQXRvbSAoU3RyaW5nLm1ha2UgMSBjKVxubGV0IHNleHBfb2ZfaW50IG4gPSBBdG9tIChzdHJpbmdfb2ZfaW50IG4pXG5sZXQgc2V4cF9vZl9mbG9hdCBuID0gQXRvbSAoIWRlZmF1bHRfc3RyaW5nX29mX2Zsb2F0IG4pXG5sZXQgc2V4cF9vZl9pbnQzMiBuID0gQXRvbSAoSW50MzIudG9fc3RyaW5nIG4pXG5sZXQgc2V4cF9vZl9pbnQ2NCBuID0gQXRvbSAoSW50NjQudG9fc3RyaW5nIG4pXG5sZXQgc2V4cF9vZl9uYXRpdmVpbnQgbiA9IEF0b20gKE5hdGl2ZWludC50b19zdHJpbmcgbilcbmxldCBzZXhwX29mX3JlZiBzZXhwX29mX19hIHJmID0gc2V4cF9vZl9fYSAhcmZcbmxldCBzZXhwX29mX2xhenlfdCBzZXhwX29mX19hIGx2ID0gc2V4cF9vZl9fYSAoTGF6eS5mb3JjZSBsdilcblxubGV0IHNleHBfb2Zfb3B0aW9uIHNleHBfb2ZfX2EgPSBmdW5jdGlvblxuICB8IFNvbWUgeCB3aGVuICF3cml0ZV9vbGRfb3B0aW9uX2Zvcm1hdCAtPiBMaXN0IFsgc2V4cF9vZl9fYSB4IF1cbiAgfCBTb21lIHggLT4gTGlzdCBbIEF0b20gXCJzb21lXCI7IHNleHBfb2ZfX2EgeCBdXG4gIHwgTm9uZSB3aGVuICF3cml0ZV9vbGRfb3B0aW9uX2Zvcm1hdCAtPiBMaXN0IFtdXG4gIHwgTm9uZSAtPiBBdG9tIFwibm9uZVwiXG47O1xuXG5sZXQgc2V4cF9vZl9wYWlyIHNleHBfb2ZfX2Egc2V4cF9vZl9fYiAoYSwgYikgPSBMaXN0IFsgc2V4cF9vZl9fYSBhOyBzZXhwX29mX19iIGIgXVxuXG5sZXQgc2V4cF9vZl90cmlwbGUgc2V4cF9vZl9fYSBzZXhwX29mX19iIHNleHBfb2ZfX2MgKGEsIGIsIGMpID1cbiAgTGlzdCBbIHNleHBfb2ZfX2EgYTsgc2V4cF9vZl9fYiBiOyBzZXhwX29mX19jIGMgXVxuOztcblxuKCogTGlzdC5yZXYgKExpc3QucmV2X21hcCAuLi4pIGlzIHRhaWwgcmVjdXJzaXZlLCB0aGUgT0NhbWwgc3RhbmRhcmRcbiAgIGxpYnJhcnkgTGlzdC5tYXAgaXMgTk9ULiAqKVxubGV0IHNleHBfb2ZfbGlzdCBzZXhwX29mX19hIGxzdCA9IExpc3QgKExpc3QucmV2IChMaXN0LnJldl9tYXAgbHN0IH5mOnNleHBfb2ZfX2EpKVxuXG5sZXQgc2V4cF9vZl9hcnJheSBzZXhwX29mX19hIGFyID1cbiAgbGV0IGxzdF9yZWYgPSByZWYgW10gaW5cbiAgZm9yIGkgPSBBcnJheS5sZW5ndGggYXIgLSAxIGRvd250byAwIGRvXG4gICAgbHN0X3JlZiA6PSBzZXhwX29mX19hIGFyLihpKSA6OiAhbHN0X3JlZlxuICBkb25lO1xuICBMaXN0ICFsc3RfcmVmXG47O1xuXG5sZXQgc2V4cF9vZl9oYXNodGJsIHNleHBfb2Zfa2V5IHNleHBfb2ZfdmFsIGh0YmwgPVxuICBsZXQgY29sbCB+a2V5OmsgfmRhdGE6diBhY2MgPSBMaXN0IFsgc2V4cF9vZl9rZXkgazsgc2V4cF9vZl92YWwgdiBdIDo6IGFjYyBpblxuICBMaXN0IChIYXNodGJsLmZvbGQgaHRibCB+aW5pdDpbXSB+Zjpjb2xsKVxuOztcblxubGV0IHNleHBfb2Zfb3BhcXVlIF8gPSBBdG9tIFwiPG9wYXF1ZT5cIlxubGV0IHNleHBfb2ZfZnVuIF8gPSBBdG9tIFwiPGZ1bj5cIlxuXG4oKiBFeGNlcHRpb24gY29udmVydGVyIHJlZ2lzdHJhdGlvbiBhbmQgbG9va3VwICopXG5cbm1vZHVsZSBFeG5fY29udmVydGVyID0gc3RydWN0XG4gICgqIFRoZXNlIGV4Y2VwdGlvbiByZWdpc3RyYXRpb24gZnVuY3Rpb25zIGFzc3VtZSB0aGF0IGNvbnRleHQtc3dpdGNoZXNcbiAgICAgY2Fubm90IGhhcHBlbiB1bmxlc3MgdGhlcmUgaXMgYW4gYWxsb2NhdGlvbi4gIEl0IGlzIHJlYXNvbmFibGUgdG8gZXhwZWN0XG4gICAgIHRoYXQgdGhpcyB3aWxsIHJlbWFpbiB0cnVlIGZvciB0aGUgZm9yZXNlZWFibGUgZnV0dXJlLiAgVGhhdCB3YXkgd2VcbiAgICAgYXZvaWQgdXNpbmcgbXV0ZXhlcyBhbmQgdGh1cyBhIGRlcGVuZGVuY3kgb24gdGhlIHRocmVhZHMgbGlicmFyeS4gKilcblxuICAoKiBGYXN0IGFuZCBhdXRvbWF0aWMgZXhjZXB0aW9uIHJlZ2lzdHJhdGlvbiAqKVxuXG4gIG1vZHVsZSBSZWdpc3RyYXRpb24gPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPVxuICAgICAgeyBzZXhwX29mX2V4biA6IGV4biAtPiBTZXhwLnRcbiAgICAgIDsgKCogSWYgW3ByaW50ZXhjID0gdHJ1ZV0gdGhlbiB0aGlzIHNleHAgY29udmVydGVyIGlzIHVzZWQgZm9yIFByaW50ZXhjLnRvX3N0cmluZyAqKVxuICAgICAgICBwcmludGV4YyA6IGJvb2xcbiAgICAgIH1cbiAgZW5kXG5cbiAgbW9kdWxlIEV4bl90YWJsZSA9IEVwaGVtZXJvbi5LMS5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgdCA9IGV4dGVuc2lvbl9jb25zdHJ1Y3RvclxuXG4gICAgICBsZXQgZXF1YWwgPSAoID09IClcbiAgICAgIGxldCBoYXNoID0gT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5pZFxuICAgIGVuZClcblxuICBsZXQgdGhlX2V4bl90YWJsZSA6IFJlZ2lzdHJhdGlvbi50IEV4bl90YWJsZS50ID0gRXhuX3RhYmxlLmNyZWF0ZSAxN1xuXG4gICgqIEVwaGVtZXJvbnMgYXJlIHVzZWQgc28gdGhhdCBbc2V4cF9vZl9leG5dIGNsb3N1cmUgZG9uJ3Qga2VlcCB0aGVcbiAgICAgZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIGxpdmUuICopXG4gIGxldCBhZGQgPyhwcmludGV4YyA9IHRydWUpID9maW5hbGlzZTpfIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciBzZXhwX29mX2V4biA9XG4gICAgRXhuX3RhYmxlLmFkZCB0aGVfZXhuX3RhYmxlIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciB7IHNleHBfb2ZfZXhuOyBwcmludGV4YyB9XG4gIDs7XG5cbiAgbGV0IGZpbmRfYXV0byB+Zm9yX3ByaW50ZXhjIGV4biA9XG4gICAgbGV0IGV4dGVuc2lvbl9jb25zdHJ1Y3RvciA9IE9iai5FeHRlbnNpb25fY29uc3RydWN0b3Iub2ZfdmFsIGV4biBpblxuICAgIG1hdGNoIEV4bl90YWJsZS5maW5kX29wdCB0aGVfZXhuX3RhYmxlIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgeyBzZXhwX29mX2V4bjsgcHJpbnRleGMgfSAtPlxuICAgICAgKG1hdGNoIGZvcl9wcmludGV4YywgcHJpbnRleGMgd2l0aFxuICAgICAgIHwgZmFsc2UsIF8gfCBfLCB0cnVlIC0+IFNvbWUgKHNleHBfb2ZfZXhuIGV4bilcbiAgICAgICB8IHRydWUsIGZhbHNlIC0+IE5vbmUpXG4gIDs7XG5cbiAgbW9kdWxlIEZvcl91bml0X3Rlc3RzX29ubHkgPSBzdHJ1Y3RcbiAgICBsZXQgc2l6ZSAoKSA9IChFeG5fdGFibGUuc3RhdHNfYWxpdmUgdGhlX2V4bl90YWJsZSkubnVtX2JpbmRpbmdzXG4gIGVuZFxuZW5kXG5cbmxldCBzZXhwX29mX2V4bl9vcHRfZm9yX3ByaW50ZXhjIGV4biA9IEV4bl9jb252ZXJ0ZXIuZmluZF9hdXRvIH5mb3JfcHJpbnRleGM6dHJ1ZSBleG5cbmxldCBzZXhwX29mX2V4bl9vcHQgZXhuID0gRXhuX2NvbnZlcnRlci5maW5kX2F1dG8gfmZvcl9wcmludGV4YzpmYWxzZSBleG5cblxubGV0IHNleHBfb2ZfZXhuIGV4biA9XG4gIG1hdGNoIHNleHBfb2ZfZXhuX29wdCBleG4gd2l0aFxuICB8IE5vbmUgLT4gTGlzdCBbIEF0b20gKFByaW50ZXhjLnRvX3N0cmluZyBleG4pIF1cbiAgfCBTb21lIHNleHAgLT4gc2V4cFxuOztcblxubGV0IGV4bl90b19zdHJpbmcgZSA9IFNleHAudG9fc3RyaW5nX2h1bSAoc2V4cF9vZl9leG4gZSlcblxuKCoge1tleGNlcHRpb24gQmxhaCBbQEBkZXJpdmluZyBzZXhwXV19IGdlbmVyYXRlcyBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uXG4gICBbRXhuX2NvbnZlcnRlci5hZGRdIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgU28gd2UgYXJlIGd1YXJhbnRlZCB0aGF0IGFzIHNvb24gYXMgd2VcbiAgIG1hcmsgYW4gZXhjZXB0aW9uIGFzIHNleHBhYmxlLCB0aGlzIG1vZHVsZSB3aWxsIGJlIGxpbmtlZCBpbiBhbmQgdGhpcyBwcmludGVyIHdpbGwgYmVcbiAgIHJlZ2lzdGVyZWQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC4gKilcbmxldCAoKSA9XG4gIFByaW50ZXhjLnJlZ2lzdGVyX3ByaW50ZXIgKGZ1biBleG4gLT5cbiAgICBtYXRjaCBzZXhwX29mX2V4bl9vcHRfZm9yX3ByaW50ZXhjIGV4biB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgc2V4cCAtPiBTb21lIChTZXhwLnRvX3N0cmluZ19odW0gfmluZGVudDoyIHNleHApKVxuOztcblxubGV0IHByaW50ZXhjX3ByZWZlcl9zZXhwIGV4biA9XG4gIG1hdGNoIHNleHBfb2ZfZXhuX29wdCBleG4gd2l0aFxuICB8IE5vbmUgLT4gUHJpbnRleGMudG9fc3RyaW5nIGV4blxuICB8IFNvbWUgc2V4cCAtPiBTZXhwLnRvX3N0cmluZ19odW0gfmluZGVudDoyIHNleHBcbjs7XG5cbigqIENvbnZlcnNpb24gb2YgUy1leHByZXNzaW9ucyB0byBPQ2FtbC12YWx1ZXMgKilcblxuZXhjZXB0aW9uIE9mX3NleHBfZXJyb3IgPSBTZXhwLk9mX3NleHBfZXJyb3JcblxubGV0IHJlY29yZF9jaGVja19leHRyYV9maWVsZHMgPSByZWYgdHJ1ZVxubGV0IG9mX3NleHBfZXJyb3JfZXhuIGV4YyBzZXhwID0gcmFpc2UgKE9mX3NleHBfZXJyb3IgKGV4Yywgc2V4cCkpXG5sZXQgb2Zfc2V4cF9lcnJvciB3aGF0IHNleHAgPSByYWlzZSAoT2Zfc2V4cF9lcnJvciAoRmFpbHVyZSB3aGF0LCBzZXhwKSlcblxubGV0IHVuaXRfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBbXSAtPiAoKVxuICB8IEF0b20gXyB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwidW5pdF9vZl9zZXhwOiBlbXB0eSBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBib29sX29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gKFwidHJ1ZVwiIHwgXCJUcnVlXCIpIC0+IHRydWVcbiAgfCBBdG9tIChcImZhbHNlXCIgfCBcIkZhbHNlXCIpIC0+IGZhbHNlXG4gIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJib29sX29mX3NleHA6IHVua25vd24gc3RyaW5nXCIgc2V4cFxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiYm9vbF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBzdHJpbmdfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT4gc3RyXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJzdHJpbmdfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgYnl0ZXNfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT4gQnl0ZXMub2Zfc3RyaW5nIHN0clxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiYnl0ZXNfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgY2hhcl9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgIGlmIFN0cmluZy5sZW5ndGggc3RyIDw+IDFcbiAgICB0aGVuIG9mX3NleHBfZXJyb3IgXCJjaGFyX29mX3NleHA6IGF0b20gc3RyaW5nIG11c3QgY29udGFpbiBvbmUgY2hhcmFjdGVyIG9ubHlcIiBzZXhwO1xuICAgIHN0ci5bMF1cbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImNoYXJfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgaW50X29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgKHRyeSBpbnRfb2Zfc3RyaW5nIHN0ciB3aXRoXG4gICAgIHwgZXhjIC0+IG9mX3NleHBfZXJyb3IgKFwiaW50X29mX3NleHA6IFwiIF4gZXhuX3RvX3N0cmluZyBleGMpIHNleHApXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJpbnRfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgZmxvYXRfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgQXRvbSBzdHIgLT5cbiAgICAodHJ5IGZsb2F0X29mX3N0cmluZyBzdHIgd2l0aFxuICAgICB8IGV4YyAtPiBvZl9zZXhwX2Vycm9yIChcImZsb2F0X29mX3NleHA6IFwiIF4gZXhuX3RvX3N0cmluZyBleGMpIHNleHApXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJmbG9hdF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBpbnQzMl9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBBdG9tIHN0ciAtPlxuICAgICh0cnkgSW50MzIub2Zfc3RyaW5nIHN0ciB3aXRoXG4gICAgIHwgZXhjIC0+IG9mX3NleHBfZXJyb3IgKFwiaW50MzJfb2Zfc2V4cDogXCIgXiBleG5fdG9fc3RyaW5nIGV4Yykgc2V4cClcbiAgfCBMaXN0IF8gLT4gb2Zfc2V4cF9lcnJvciBcImludDMyX29mX3NleHA6IGF0b20gbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGludDY0X29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgKHRyeSBJbnQ2NC5vZl9zdHJpbmcgc3RyIHdpdGhcbiAgICAgfCBleGMgLT4gb2Zfc2V4cF9lcnJvciAoXCJpbnQ2NF9vZl9zZXhwOiBcIiBeIGV4bl90b19zdHJpbmcgZXhjKSBzZXhwKVxuICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiaW50NjRfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgbmF0aXZlaW50X29mX3NleHAgc2V4cCA9XG4gIG1hdGNoIHNleHAgd2l0aFxuICB8IEF0b20gc3RyIC0+XG4gICAgKHRyeSBOYXRpdmVpbnQub2Zfc3RyaW5nIHN0ciB3aXRoXG4gICAgIHwgZXhjIC0+IG9mX3NleHBfZXJyb3IgKFwibmF0aXZlaW50X29mX3NleHA6IFwiIF4gZXhuX3RvX3N0cmluZyBleGMpIHNleHApXG4gIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJuYXRpdmVpbnRfb2Zfc2V4cDogYXRvbSBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgcmVmX29mX3NleHAgYV9fb2Zfc2V4cCBzZXhwID0gcmVmIChhX19vZl9zZXhwIHNleHApXG5sZXQgbGF6eV90X29mX3NleHAgYV9fb2Zfc2V4cCBzZXhwID0gTGF6eS5mcm9tX3ZhbCAoYV9fb2Zfc2V4cCBzZXhwKVxuXG5sZXQgb3B0aW9uX29mX3NleHAgYV9fb2Zfc2V4cCBzZXhwID1cbiAgaWYgIXJlYWRfb2xkX29wdGlvbl9mb3JtYXRcbiAgdGhlbiAoXG4gICAgbWF0Y2ggc2V4cCB3aXRoXG4gICAgfCBMaXN0IFtdIHwgQXRvbSAoXCJub25lXCIgfCBcIk5vbmVcIikgLT4gTm9uZVxuICAgIHwgTGlzdCBbIGVsIF0gfCBMaXN0IFsgQXRvbSAoXCJzb21lXCIgfCBcIlNvbWVcIik7IGVsIF0gLT4gU29tZSAoYV9fb2Zfc2V4cCBlbClcbiAgICB8IExpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwib3B0aW9uX29mX3NleHA6IGxpc3QgbXVzdCByZXByZXNlbnQgb3B0aW9uYWwgdmFsdWVcIiBzZXhwXG4gICAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcIm9wdGlvbl9vZl9zZXhwOiBvbmx5IG5vbmUgY2FuIGJlIGF0b21cIiBzZXhwKVxuICBlbHNlIChcbiAgICBtYXRjaCBzZXhwIHdpdGhcbiAgICB8IEF0b20gKFwibm9uZVwiIHwgXCJOb25lXCIpIC0+IE5vbmVcbiAgICB8IExpc3QgWyBBdG9tIChcInNvbWVcIiB8IFwiU29tZVwiKTsgZWwgXSAtPiBTb21lIChhX19vZl9zZXhwIGVsKVxuICAgIHwgQXRvbSBfIC0+IG9mX3NleHBfZXJyb3IgXCJvcHRpb25fb2Zfc2V4cDogb25seSBub25lIGNhbiBiZSBhdG9tXCIgc2V4cFxuICAgIHwgTGlzdCBfIC0+IG9mX3NleHBfZXJyb3IgXCJvcHRpb25fb2Zfc2V4cDogbGlzdCBtdXN0IGJlIChzb21lIGVsKVwiIHNleHApXG47O1xuXG5sZXQgcGFpcl9vZl9zZXhwIGFfX29mX3NleHAgYl9fb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBbIGFfc2V4cDsgYl9zZXhwIF0gLT5cbiAgICBsZXQgYSA9IGFfX29mX3NleHAgYV9zZXhwIGluXG4gICAgbGV0IGIgPSBiX19vZl9zZXhwIGJfc2V4cCBpblxuICAgIGEsIGJcbiAgfCBMaXN0IF8gLT5cbiAgICBvZl9zZXhwX2Vycm9yIFwicGFpcl9vZl9zZXhwOiBsaXN0IG11c3QgY29udGFpbiBleGFjdGx5IHR3byBlbGVtZW50cyBvbmx5XCIgc2V4cFxuICB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwicGFpcl9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCB0cmlwbGVfb2Zfc2V4cCBhX19vZl9zZXhwIGJfX29mX3NleHAgY19fb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBbIGFfc2V4cDsgYl9zZXhwOyBjX3NleHAgXSAtPlxuICAgIGxldCBhID0gYV9fb2Zfc2V4cCBhX3NleHAgaW5cbiAgICBsZXQgYiA9IGJfX29mX3NleHAgYl9zZXhwIGluXG4gICAgbGV0IGMgPSBjX19vZl9zZXhwIGNfc2V4cCBpblxuICAgIGEsIGIsIGNcbiAgfCBMaXN0IF8gLT5cbiAgICBvZl9zZXhwX2Vycm9yIFwidHJpcGxlX29mX3NleHA6IGxpc3QgbXVzdCBjb250YWluIGV4YWN0bHkgdGhyZWUgZWxlbWVudHMgb25seVwiIHNleHBcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcInRyaXBsZV9vZl9zZXhwOiBsaXN0IG5lZWRlZFwiIHNleHBcbjs7XG5cbmxldCBsaXN0X29mX3NleHAgYV9fb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBsc3QgLT5cbiAgICBsZXQgcmV2X2xzdCA9IExpc3QucmV2X21hcCBsc3QgfmY6YV9fb2Zfc2V4cCBpblxuICAgIExpc3QucmV2IHJldl9sc3RcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcImxpc3Rfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgYXJyYXlfb2Zfc2V4cCBhX19vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBMaXN0IFtdIC0+IFt8fF1cbiAgfCBMaXN0IChoIDo6IHQpIC0+XG4gICAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIHQgKyAxIGluXG4gICAgbGV0IHJlcyA9IEFycmF5Lm1ha2UgbGVuIChhX19vZl9zZXhwIGgpIGluXG4gICAgbGV0IHJlYyBsb29wIGkgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiByZXNcbiAgICAgIHwgaCA6OiB0IC0+XG4gICAgICAgIHJlcy4oaSkgPC0gYV9fb2Zfc2V4cCBoO1xuICAgICAgICBsb29wIChpICsgMSkgdFxuICAgIGluXG4gICAgbG9vcCAxIHRcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcImFycmF5X29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuOztcblxubGV0IGhhc2h0Ymxfb2Zfc2V4cCBrZXlfb2Zfc2V4cCB2YWxfb2Zfc2V4cCBzZXhwID1cbiAgbWF0Y2ggc2V4cCB3aXRoXG4gIHwgTGlzdCBsc3QgLT5cbiAgICBsZXQgaHRibCA9IEhhc2h0YmwuY3JlYXRlIDAgaW5cbiAgICBsZXQgYWN0ID0gZnVuY3Rpb25cbiAgICAgIHwgTGlzdCBbIGtfc2V4cDsgdl9zZXhwIF0gLT5cbiAgICAgICAgSGFzaHRibC5hZGQgaHRibCB+a2V5OihrZXlfb2Zfc2V4cCBrX3NleHApIH5kYXRhOih2YWxfb2Zfc2V4cCB2X3NleHApXG4gICAgICB8IExpc3QgXyB8IEF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwiaGFzaHRibF9vZl9zZXhwOiB0dXBsZSBsaXN0IG5lZWRlZFwiIHNleHBcbiAgICBpblxuICAgIExpc3QuaXRlciBsc3QgfmY6YWN0O1xuICAgIGh0YmxcbiAgfCBBdG9tIF8gLT4gb2Zfc2V4cF9lcnJvciBcImhhc2h0Ymxfb2Zfc2V4cDogbGlzdCBuZWVkZWRcIiBzZXhwXG47O1xuXG5sZXQgb3BhcXVlX29mX3NleHAgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgXCJvcGFxdWVfb2Zfc2V4cDogY2Fubm90IGNvbnZlcnQgb3BhcXVlIHZhbHVlc1wiIHNleHBcbjs7XG5cbmxldCBmdW5fb2Zfc2V4cCBzZXhwID0gb2Zfc2V4cF9lcnJvciBcImZ1bl9vZl9zZXhwOiBjYW5ub3QgY29udmVydCBmdW5jdGlvbiB2YWx1ZXNcIiBzZXhwXG5cbigqIFNleHAgR3JhbW1hcnMgKilcblxuaW5jbHVkZSBTZXhwX2NvbnZfZ3JhbW1hclxuXG4oKiBSZWdpc3RlcmluZyBkZWZhdWx0IGV4Y2VwdGlvbiBwcmludGVycyAqKVxuXG5sZXQgZ2V0X2ZsY19lcnJvciBuYW1lIChmaWxlLCBsaW5lLCBjaHIpID0gQXRvbSAoc3ByaW50ZiBcIiVzICVzOiVkOiVkXCIgbmFtZSBmaWxlIGxpbmUgY2hyKVxuXG5sZXQgKCkgPVxuICBMaXN0Lml0ZXJcbiAgICB+ZjooZnVuIChleHRlbnNpb25fY29uc3RydWN0b3IsIGhhbmRsZXIpIC0+XG4gICAgICBFeG5fY29udmVydGVyLmFkZCB+cHJpbnRleGM6ZmFsc2UgfmZpbmFsaXNlOmZhbHNlIGV4dGVuc2lvbl9jb25zdHJ1Y3RvciBoYW5kbGVyKVxuICAgIFsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBBc3NlcnRfZmFpbHVyZV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBBc3NlcnRfZmFpbHVyZSBhcmcgLT4gZ2V0X2ZsY19lcnJvciBcIkFzc2VydF9mYWlsdXJlXCIgYXJnXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBFeGl0XVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEV4aXQgLT4gQXRvbSBcIkV4aXRcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgRW5kX29mX2ZpbGVdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgRW5kX29mX2ZpbGUgLT4gQXRvbSBcIkVuZF9vZl9maWxlXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIEZhaWx1cmVdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgRmFpbHVyZSBhcmcgLT4gTGlzdCBbIEF0b20gXCJGYWlsdXJlXCI7IEF0b20gYXJnIF1cbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIE5vdF9mb3VuZF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBOb3RfZm91bmQgLT4gQXRvbSBcIk5vdF9mb3VuZFwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBJbnZhbGlkX2FyZ3VtZW50XVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IEludmFsaWRfYXJndW1lbnQgYXJnIC0+IExpc3QgWyBBdG9tIFwiSW52YWxpZF9hcmd1bWVudFwiOyBBdG9tIGFyZyBdXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBNYXRjaF9mYWlsdXJlXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IE1hdGNoX2ZhaWx1cmUgYXJnIC0+IGdldF9mbGNfZXJyb3IgXCJNYXRjaF9mYWlsdXJlXCIgYXJnXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBOb3RfZm91bmRfc11cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBOb3RfZm91bmRfcyBhcmcgLT4gTGlzdCBbIEF0b20gXCJOb3RfZm91bmRfc1wiOyBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgU3lzX2Vycm9yXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFN5c19lcnJvciBhcmcgLT4gTGlzdCBbIEF0b20gXCJTeXNfZXJyb3JcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgQXJnLkhlbHBdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgQXJnLkhlbHAgYXJnIC0+IExpc3QgWyBBdG9tIFwiQXJnLkhlbHBcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgQXJnLkJhZF1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBBcmcuQmFkIGFyZyAtPiBMaXN0IFsgQXRvbSBcIkFyZy5CYWRcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgTGF6eS5VbmRlZmluZWRdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgTGF6eS5VbmRlZmluZWQgLT4gQXRvbSBcIkxhenkuVW5kZWZpbmVkXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFBhcnNpbmcuUGFyc2VfZXJyb3JdXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgUGFyc2luZy5QYXJzZV9lcnJvciAtPiBBdG9tIFwiUGFyc2luZy5QYXJzZV9lcnJvclwiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIDsgKCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBRdWV1ZS5FbXB0eV1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBRdWV1ZS5FbXB0eSAtPiBBdG9tIFwiUXVldWUuRW1wdHlcIlxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgU2NhbmYuU2Nhbl9mYWlsdXJlXVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IFNjYW5mLlNjYW5fZmFpbHVyZSBhcmcgLT4gTGlzdCBbIEF0b20gXCJTY2FuZi5TY2FuX2ZhaWx1cmVcIjsgQXRvbSBhcmcgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICA7ICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgU3RhY2suRW1wdHldXG4gICAgICAsIGZ1bmN0aW9uXG4gICAgICAgIHwgU3RhY2suRW1wdHkgLT4gQXRvbSBcIlN0YWNrLkVtcHR5XCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSApXG4gICAgOyAoIFslZXh0ZW5zaW9uX2NvbnN0cnVjdG9yIFN5cy5CcmVha11cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBTeXMuQnJlYWsgLT4gQXRvbSBcIlN5cy5CcmVha1wiXG4gICAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UgKVxuICAgIF1cbjs7XG5cbmxldCAoKSA9XG4gIExpc3QuaXRlclxuICAgIH5mOihmdW4gKGV4dGVuc2lvbl9jb25zdHJ1Y3RvciwgaGFuZGxlcikgLT5cbiAgICAgIEV4bl9jb252ZXJ0ZXIuYWRkIH5wcmludGV4Yzp0cnVlIH5maW5hbGlzZTpmYWxzZSBleHRlbnNpb25fY29uc3RydWN0b3IgaGFuZGxlcilcbiAgICBbICggWyVleHRlbnNpb25fY29uc3RydWN0b3IgT2Zfc2V4cF9lcnJvcl1cbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBPZl9zZXhwX2Vycm9yIChleGMsIHNleHApIC0+XG4gICAgICAgICAgTGlzdCBbIEF0b20gXCJTZXhwbGliLkNvbnYuT2Zfc2V4cF9lcnJvclwiOyBzZXhwX29mX2V4biBleGM7IHNleHAgXVxuICAgICAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlIClcbiAgICBdXG47O1xuXG5leHRlcm5hbCBpZ25vcmUgOiBfIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuZXh0ZXJuYWwgKCA9ICkgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuIiwiKCogQ29udl9lcnJvcjogTW9kdWxlIGZvciBIYW5kbGluZyBFcnJvcnMgZHVyaW5nIEF1dG9tYXRlZCBTLWV4cHJlc3Npb25cbiAgIENvbnZlcnNpb25zICopXG5cbm9wZW4gU3RkTGFiZWxzXG5vcGVuIFByaW50Zlxub3BlbiBTZXhwX2NvbnZcblxuZXhjZXB0aW9uIE9mX3NleHBfZXJyb3IgPSBPZl9zZXhwX2Vycm9yXG5cbigqIEVycm9ycyBjb25jZXJuaW5nIHR1cGxlcyAqKVxuXG5sZXQgdHVwbGVfb2Zfc2l6ZV9uX2V4cGVjdGVkIGxvYyBuIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChzcHJpbnRmIFwiJXNfb2Zfc2V4cDogdHVwbGUgb2Ygc2l6ZSAlZCBleHBlY3RlZFwiIGxvYyBuKSBzZXhwXG47O1xuXG4oKiBFcnJvcnMgY29uY2VybmluZyBzdW0gdHlwZXMgKilcblxubGV0IHN0YWdfbm9fYXJncyBsb2Mgc2V4cCA9XG4gIG9mX3NleHBfZXJyb3IgKGxvYyBeIFwiX29mX3NleHA6IHRoaXMgY29uc3RydWN0b3IgZG9lcyBub3QgdGFrZSBhcmd1bWVudHNcIikgc2V4cFxuOztcblxubGV0IHN0YWdfaW5jb3JyZWN0X25fYXJncyBsb2MgdGFnIHNleHAgPVxuICBsZXQgbXNnID0gc3ByaW50ZiBcIiVzX29mX3NleHA6IHN1bSB0YWcgJVMgaGFzIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzXCIgbG9jIHRhZyBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgc3RhZ190YWtlc19hcmdzIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogdGhpcyBjb25zdHJ1Y3RvciByZXF1aXJlcyBhcmd1bWVudHNcIikgc2V4cFxuOztcblxubGV0IG5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogZXhwZWN0ZWQgYSB2YXJpYW50IHR5cGUsIHNhdyBhIG5lc3RlZCBsaXN0XCIpIHNleHBcbjs7XG5cbmxldCBlbXB0eV9saXN0X2ludmFsaWRfc3VtIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogZXhwZWN0ZWQgYSB2YXJpYW50IHR5cGUsIHNhdyBhbiBlbXB0eSBsaXN0XCIpIHNleHBcbjs7XG5cbmxldCB1bmV4cGVjdGVkX3N0YWcgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiB1bmV4cGVjdGVkIHZhcmlhbnQgY29uc3RydWN0b3JcIikgc2V4cFxuOztcblxuKCogRXJyb3JzIGNvbmNlcm5pbmcgcmVjb3JkcyAqKVxuXG5sZXQgcmVjb3JkX3NleHBfYm9vbF93aXRoX3BheWxvYWQgbG9jIHNleHAgPVxuICBsZXQgbXNnID1cbiAgICBsb2MgXiBcIl9vZl9zZXhwOiByZWNvcmQgY29udmVyc2lvbjogYSBbc2V4cC5ib29sXSBmaWVsZCB3YXMgZ2l2ZW4gYSBwYXlsb2FkLlwiXG4gIGluXG4gIG9mX3NleHBfZXJyb3IgbXNnIHNleHBcbjs7XG5cbmxldCByZWNvcmRfb25seV9wYWlyc19leHBlY3RlZCBsb2Mgc2V4cCA9XG4gIGxldCBtc2cgPVxuICAgIGxvY1xuICAgIF4gXCJfb2Zfc2V4cDogcmVjb3JkIGNvbnZlcnNpb246IG9ubHkgcGFpcnMgZXhwZWN0ZWQsIHRoZWlyIGZpcnN0IGVsZW1lbnQgbXVzdCBiZSBhbiBcXFxuICAgICAgIGF0b21cIlxuICBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX3N1cGVyZmx1b3VzX2ZpZWxkcyB+d2hhdCB+bG9jIHJldl9mbGRfbmFtZXMgc2V4cCA9XG4gIGxldCBmbGRfbmFtZXNfc3RyID0gU3RyaW5nLmNvbmNhdCAoTGlzdC5yZXYgcmV2X2ZsZF9uYW1lcykgfnNlcDpcIiBcIiBpblxuICBsZXQgbXNnID0gc3ByaW50ZiBcIiVzX29mX3NleHA6ICVzOiAlc1wiIGxvYyB3aGF0IGZsZF9uYW1lc19zdHIgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxubGV0IHJlY29yZF9kdXBsaWNhdGVfZmllbGRzIGxvYyByZXZfZmxkX25hbWVzIHNleHAgPVxuICByZWNvcmRfc3VwZXJmbHVvdXNfZmllbGRzIH53aGF0OlwiZHVwbGljYXRlIGZpZWxkc1wiIH5sb2MgcmV2X2ZsZF9uYW1lcyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX2V4dHJhX2ZpZWxkcyBsb2MgcmV2X2ZsZF9uYW1lcyBzZXhwID1cbiAgcmVjb3JkX3N1cGVyZmx1b3VzX2ZpZWxkcyB+d2hhdDpcImV4dHJhIGZpZWxkc1wiIH5sb2MgcmV2X2ZsZF9uYW1lcyBzZXhwXG47O1xuXG5sZXQgcmVjIHJlY29yZF9nZXRfdW5kZWZpbmVkX2xvb3AgZmllbGRzID0gZnVuY3Rpb25cbiAgfCBbXSAtPiBTdHJpbmcuY29uY2F0IChMaXN0LnJldiBmaWVsZHMpIH5zZXA6XCIgXCJcbiAgfCAodHJ1ZSwgZmllbGQpIDo6IHJlc3QgLT4gcmVjb3JkX2dldF91bmRlZmluZWRfbG9vcCAoZmllbGQgOjogZmllbGRzKSByZXN0XG4gIHwgXyA6OiByZXN0IC0+IHJlY29yZF9nZXRfdW5kZWZpbmVkX2xvb3AgZmllbGRzIHJlc3Rcbjs7XG5cbmxldCByZWNvcmRfdW5kZWZpbmVkX2VsZW1lbnRzIGxvYyBzZXhwIGxzdCA9XG4gIGxldCB1bmRlZmluZWQgPSByZWNvcmRfZ2V0X3VuZGVmaW5lZF9sb29wIFtdIGxzdCBpblxuICBsZXQgbXNnID1cbiAgICBzcHJpbnRmIFwiJXNfb2Zfc2V4cDogdGhlIGZvbGxvd2luZyByZWNvcmQgZWxlbWVudHMgd2VyZSB1bmRlZmluZWQ6ICVzXCIgbG9jIHVuZGVmaW5lZFxuICBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX2xpc3RfaW5zdGVhZF9hdG9tIGxvYyBzZXhwID1cbiAgbGV0IG1zZyA9IGxvYyBeIFwiX29mX3NleHA6IGxpc3QgaW5zdGVhZCBvZiBhdG9tIGZvciByZWNvcmQgZXhwZWN0ZWRcIiBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcmVjb3JkX3BvbHlfZmllbGRfdmFsdWUgbG9jIHNleHAgPVxuICBsZXQgbXNnID1cbiAgICBsb2NcbiAgICBeIFwiX29mX3NleHA6IGNhbm5vdCBjb252ZXJ0IHZhbHVlcyBvZiB0eXBlcyByZXN1bHRpbmcgZnJvbSBwb2x5bW9ycGhpYyByZWNvcmQgZmllbGRzXCJcbiAgaW5cbiAgb2Zfc2V4cF9lcnJvciBtc2cgc2V4cFxuOztcblxuKCogRXJyb3JzIGNvbmNlcm5pbmcgcG9seW1vcnBoaWMgdmFyaWFudHMgKilcblxuZXhjZXB0aW9uIE5vX3ZhcmlhbnRfbWF0Y2hcblxubGV0IG5vX3ZhcmlhbnRfbWF0Y2ggKCkgPSByYWlzZSBOb192YXJpYW50X21hdGNoXG5cbmxldCBub19tYXRjaGluZ192YXJpYW50X2ZvdW5kIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogbm8gbWF0Y2hpbmcgdmFyaWFudCBmb3VuZFwiKSBzZXhwXG47O1xuXG5sZXQgcHRhZ19ub19hcmdzIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogcG9seW1vcnBoaWMgdmFyaWFudCBkb2VzIG5vdCB0YWtlIGFyZ3VtZW50c1wiKSBzZXhwXG47O1xuXG5sZXQgcHRhZ19pbmNvcnJlY3Rfbl9hcmdzIGxvYyBjbnN0ciBzZXhwID1cbiAgbGV0IG1zZyA9XG4gICAgc3ByaW50ZlxuICAgICAgXCIlc19vZl9zZXhwOiBwb2x5bW9ycGhpYyB2YXJpYW50IHRhZyAlUyBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHNcIlxuICAgICAgbG9jXG4gICAgICBjbnN0clxuICBpblxuICBvZl9zZXhwX2Vycm9yIG1zZyBzZXhwXG47O1xuXG5sZXQgcHRhZ190YWtlc19hcmdzIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogcG9seW1vcnBoaWMgdmFyaWFudCB0YWcgdGFrZXMgYW4gYXJndW1lbnRcIikgc2V4cFxuOztcblxubGV0IG5lc3RlZF9saXN0X2ludmFsaWRfcG9seV92YXIgbG9jIHNleHAgPVxuICBvZl9zZXhwX2Vycm9yIChsb2MgXiBcIl9vZl9zZXhwOiBhIG5lc3RlZCBsaXN0IGlzIGFuIGludmFsaWQgcG9seW1vcnBoaWMgdmFyaWFudFwiKSBzZXhwXG47O1xuXG5sZXQgZW1wdHlfbGlzdF9pbnZhbGlkX3BvbHlfdmFyIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogdGhlIGVtcHR5IGxpc3QgaXMgYW4gaW52YWxpZCBwb2x5bW9ycGhpYyB2YXJpYW50XCIpIHNleHBcbjs7XG5cbmxldCBlbXB0eV90eXBlIGxvYyBzZXhwID1cbiAgb2Zfc2V4cF9lcnJvciAobG9jIF4gXCJfb2Zfc2V4cDogdHJ5aW5nIHRvIGNvbnZlcnQgYW4gZW1wdHkgdHlwZVwiKSBzZXhwXG47O1xuIiwiKCoqIFByaW1pdGl2ZXMgZm9yIHBvbHltb3JwaGljIGNvbXBhcmUuICopXG5cbigqXyBQb2x5bW9ycGhpYyBjb21waWxlciBwcmltaXRpdmVzIGNhbid0IGJlIGFsaWFzZXMgYXMgdGhpcyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gIGlubGluaW5nLiAoSWYgYWxpYXNlZCB3aXRob3V0IGEgdHlwZSBhbm5vdGF0aW9uLCB0aGUgY29tcGlsZXIgd291bGQgaW1wbGVtZW50IHRoZW1cbiAgdXNpbmcgdGhlIGdlbmVyaWMgY29kZSBkb2luZyBhIEMgY2FsbCwgYW5kIGl0J3MgdGhpcyBjb2RlIHRoYXQgd291bGQgYmUgaW5saW5lZC4pIEFzIGFcbiAgcmVzdWx0IHdlIGhhdmUgdG8gY29weSB0aGUgW2V4dGVybmFsIC4uLl0gZGVjbGFyYXRpb24gaGVyZS4gKilcbmV4dGVybmFsICggPCApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWxlc3N0aGFuXCJcbmV4dGVybmFsICggPD0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuZXh0ZXJuYWwgKCA8PiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcbmV4dGVybmFsICggPSApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWVxdWFsXCJcbmV4dGVybmFsICggPiApIDogJ2EgLT4gJ2EgLT4gYm9vbCA9IFwiJWdyZWF0ZXJ0aGFuXCJcbmV4dGVybmFsICggPj0gKSA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZXh0ZXJuYWwgYXNjZW5kaW5nIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5leHRlcm5hbCBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50ID0gXCIlY29tcGFyZVwiXG5leHRlcm5hbCBlcXVhbCA6ICdhIC0+ICdhIC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbmxldCBkZXNjZW5kaW5nIHggeSA9IGNvbXBhcmUgeSB4XG5sZXQgbWF4ID0gQ2FtbC5tYXhcbmxldCBtaW4gPSBDYW1sLm1pblxuIiwiKCogVGhpcyBtb2R1bGUgaXMgaW5jbHVkZWQgaW4gW0ltcG9ydF0uICBJdCBpcyBhaW1lZCBhdCBtb2R1bGVzIHRoYXQgZGVmaW5lIHRoZSBzdGFuZGFyZFxuICAgY29tYmluYXRvcnMgZm9yIFtzZXhwX29mXSwgW29mX3NleHBdLCBbY29tcGFyZV0gYW5kIFtoYXNoXSBhbmQgYXJlIGluY2x1ZGVkIGluXG4gICBbSW1wb3J0XS4gKilcblxuaW5jbHVkZSAoXG4gIFNoYWRvd19zdGRsaWIgOlxuICAgIG1vZHVsZSB0eXBlIG9mIHN0cnVjdFxuICAgIGluY2x1ZGUgU2hhZG93X3N0ZGxpYlxuICBlbmRcbiAgd2l0aCB0eXBlICdhIHJlZiA6PSAnYSByZWZcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBmb3JtYXQgOj0gKCdhLCAnYiwgJ2MpIGZvcm1hdFxuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0IDo9ICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NFxuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgOj0gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDZcbiAgKCogVGhlc2UgbW9kdWxlcyBhcmUgcmVkZWZpbmVkIGluIEJhc2UgKilcbiAgd2l0aCBtb2R1bGUgQXJyYXkgOj0gU2hhZG93X3N0ZGxpYi5BcnJheVxuICB3aXRoIG1vZHVsZSBBdG9taWMgOj0gU2hhZG93X3N0ZGxpYi5BdG9taWNcbiAgd2l0aCBtb2R1bGUgQm9vbCA6PSBTaGFkb3dfc3RkbGliLkJvb2xcbiAgd2l0aCBtb2R1bGUgQnVmZmVyIDo9IFNoYWRvd19zdGRsaWIuQnVmZmVyXG4gIHdpdGggbW9kdWxlIEJ5dGVzIDo9IFNoYWRvd19zdGRsaWIuQnl0ZXNcbiAgd2l0aCBtb2R1bGUgQ2hhciA6PSBTaGFkb3dfc3RkbGliLkNoYXJcbiAgd2l0aCBtb2R1bGUgRWl0aGVyIDo9IFNoYWRvd19zdGRsaWIuRWl0aGVyXG4gIHdpdGggbW9kdWxlIEZsb2F0IDo9IFNoYWRvd19zdGRsaWIuRmxvYXRcbiAgd2l0aCBtb2R1bGUgSGFzaHRibCA6PSBTaGFkb3dfc3RkbGliLkhhc2h0YmxcbiAgd2l0aCBtb2R1bGUgSW50IDo9IFNoYWRvd19zdGRsaWIuSW50XG4gIHdpdGggbW9kdWxlIEludDMyIDo9IFNoYWRvd19zdGRsaWIuSW50MzJcbiAgd2l0aCBtb2R1bGUgSW50NjQgOj0gU2hhZG93X3N0ZGxpYi5JbnQ2NFxuICB3aXRoIG1vZHVsZSBMYXp5IDo9IFNoYWRvd19zdGRsaWIuTGF6eVxuICB3aXRoIG1vZHVsZSBMaXN0IDo9IFNoYWRvd19zdGRsaWIuTGlzdFxuICB3aXRoIG1vZHVsZSBNYXAgOj0gU2hhZG93X3N0ZGxpYi5NYXBcbiAgd2l0aCBtb2R1bGUgTmF0aXZlaW50IDo9IFNoYWRvd19zdGRsaWIuTmF0aXZlaW50XG4gIHdpdGggbW9kdWxlIE9wdGlvbiA6PSBTaGFkb3dfc3RkbGliLk9wdGlvblxuICB3aXRoIG1vZHVsZSBQcmludGYgOj0gU2hhZG93X3N0ZGxpYi5QcmludGZcbiAgd2l0aCBtb2R1bGUgUXVldWUgOj0gU2hhZG93X3N0ZGxpYi5RdWV1ZVxuICB3aXRoIG1vZHVsZSBSYW5kb20gOj0gU2hhZG93X3N0ZGxpYi5SYW5kb21cbiAgd2l0aCBtb2R1bGUgUmVzdWx0IDo9IFNoYWRvd19zdGRsaWIuUmVzdWx0XG4gIHdpdGggbW9kdWxlIFNldCA6PSBTaGFkb3dfc3RkbGliLlNldFxuICB3aXRoIG1vZHVsZSBTdGFjayA6PSBTaGFkb3dfc3RkbGliLlN0YWNrXG4gIHdpdGggbW9kdWxlIFN0cmluZyA6PSBTaGFkb3dfc3RkbGliLlN0cmluZ1xuICB3aXRoIG1vZHVsZSBTeXMgOj0gU2hhZG93X3N0ZGxpYi5TeXNcbiAgd2l0aCBtb2R1bGUgVWNoYXIgOj0gU2hhZG93X3N0ZGxpYi5VY2hhclxuICB3aXRoIG1vZHVsZSBVbml0IDo9IFNoYWRvd19zdGRsaWIuVW5pdCkgW0BvY2FtbC53YXJuaW5nIFwiLTNcIl1cblxudHlwZSAnYSByZWYgPSAnYSBDYW1sLnJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cblxuKCogUmVzaHVmZmxlIFtDYW1sXSBzbyB0aGF0IHdlIGNob29zZSB0aGUgbW9kdWxlcyB1c2luZyBsYWJlbHMgd2hlbiBhdmFpbGFibGUuICopXG5tb2R1bGUgQ2FtbCA9IHN0cnVjdFxuXG4gIGluY2x1ZGUgQ2FtbFxuXG4gIG1vZHVsZSBBcmcgPSBDYW1sLkFyZyAoKiogQGNhbm9uaWNhbCBDYW1sLkFyZyAqKVxuXG4gIG1vZHVsZSBBcnJheSA9IENhbWwuU3RkTGFiZWxzLkFycmF5ICgqKiBAY2Fub25pY2FsIENhbWwuU3RkTGFiZWxzLkFycmF5ICopXG5cbiAgbW9kdWxlIEJvb2wgPSBDYW1sLkJvb2wgKCoqIEBjYW5vbmljYWwgQ2FtbC5Cb29sICopXG5cbiAgbW9kdWxlIEJ1ZmZlciA9IENhbWwuQnVmZmVyICgqKiBAY2Fub25pY2FsIENhbWwuQnVmZmVyICopXG5cbiAgbW9kdWxlIEJ5dGVzID0gQ2FtbC5TdGRMYWJlbHMuQnl0ZXMgKCoqIEBjYW5vbmljYWwgQ2FtbC5TdGRMYWJlbHMuQnl0ZXMgKilcblxuICBtb2R1bGUgQ2hhciA9IENhbWwuQ2hhciAoKiogQGNhbm9uaWNhbCBDYW1sLkNoYXIgKilcblxuICBtb2R1bGUgRXBoZW1lcm9uID0gQ2FtbC5FcGhlbWVyb24gKCoqIEBjYW5vbmljYWwgQ2FtbC5FcGhlbWVyb24gKilcblxuICBtb2R1bGUgRmxvYXQgPSBDYW1sLkZsb2F0ICgqKiBAY2Fub25pY2FsIENhbWwuRmxvYXQgKilcblxuICBtb2R1bGUgRm9ybWF0ID0gQ2FtbC5Gb3JtYXQgKCoqIEBjYW5vbmljYWwgQ2FtbC5Gb3JtYXQgKilcblxuICBtb2R1bGUgRnVuID0gQ2FtbC5GdW4gKCoqIEBjYW5vbmljYWwgQ2FtbC5GdW4gKilcblxuICBtb2R1bGUgR2MgPSBDYW1sLkdjICgqKiBAY2Fub25pY2FsIENhbWwuR2MgKilcblxuICBtb2R1bGUgSGFzaHRibCA9IENhbWwuTW9yZUxhYmVscy5IYXNodGJsICgqKiBAY2Fub25pY2FsIENhbWwuTW9yZUxhYmVscy5IYXNodGJsICopXG5cbiAgbW9kdWxlIEludDMyID0gQ2FtbC5JbnQzMiAoKiogQGNhbm9uaWNhbCBDYW1sLkludDMyICopXG5cbiAgbW9kdWxlIEludCA9IENhbWwuSW50ICgqKiBAY2Fub25pY2FsIENhbWwuSW50ICopXG5cbiAgbW9kdWxlIEludDY0ID0gQ2FtbC5JbnQ2NCAoKiogQGNhbm9uaWNhbCBDYW1sLkludDY0ICopXG5cbiAgbW9kdWxlIExhenkgPSBDYW1sLkxhenkgKCoqIEBjYW5vbmljYWwgQ2FtbC5MYXp5ICopXG5cbiAgbW9kdWxlIExleGluZyA9IENhbWwuTGV4aW5nICgqKiBAY2Fub25pY2FsIENhbWwuTGV4aW5nICopXG5cbiAgbW9kdWxlIExpc3QgPSBDYW1sLlN0ZExhYmVscy5MaXN0ICgqKiBAY2Fub25pY2FsIENhbWwuU3RkTGFiZWxzLkxpc3QgKilcblxuICBtb2R1bGUgTWFwID0gQ2FtbC5Nb3JlTGFiZWxzLk1hcCAoKiogQGNhbm9uaWNhbCBDYW1sLk1vcmVMYWJlbHMuTWFwICopXG5cbiAgbW9kdWxlIE5hdGl2ZWludCA9IENhbWwuTmF0aXZlaW50ICgqKiBAY2Fub25pY2FsIENhbWwuTmF0aXZlaW50ICopXG5cbiAgbW9kdWxlIE9iaiA9IENhbWwuT2JqICgqKiBAY2Fub25pY2FsIENhbWwuT2JqICopXG5cbiAgbW9kdWxlIE9wdGlvbiA9IENhbWwuT3B0aW9uICgqKiBAY2Fub25pY2FsIENhbWwuT3B0aW9uICopXG5cbiAgbW9kdWxlIFBhcnNpbmcgPSBDYW1sLlBhcnNpbmcgKCoqIEBjYW5vbmljYWwgQ2FtbC5QYXJzaW5nICopXG5cbiAgbW9kdWxlIFByaW50ZXhjID0gQ2FtbC5QcmludGV4YyAoKiogQGNhbm9uaWNhbCBDYW1sLlByaW50ZXhjICopXG5cbiAgbW9kdWxlIFByaW50ZiA9IENhbWwuUHJpbnRmICgqKiBAY2Fub25pY2FsIENhbWwuUHJpbnRmICopXG5cbiAgbW9kdWxlIFF1ZXVlID0gQ2FtbC5RdWV1ZSAoKiogQGNhbm9uaWNhbCBDYW1sLlF1ZXVlICopXG5cbiAgbW9kdWxlIFJhbmRvbSA9IENhbWwuUmFuZG9tICgqKiBAY2Fub25pY2FsIENhbWwuUmFuZG9tICopXG5cbiAgbW9kdWxlIFJlc3VsdCA9IENhbWwuUmVzdWx0ICgqKiBAY2Fub25pY2FsIENhbWwuUmVzdWx0ICopXG5cbiAgbW9kdWxlIFNjYW5mID0gQ2FtbC5TY2FuZiAoKiogQGNhbm9uaWNhbCBDYW1sLlNjYW5mICopXG5cbiAgbW9kdWxlIFNlcSA9IENhbWwuU2VxICgqKiBAY2Fub25pY2FsIENhbWwuU2VxICopXG5cbiAgbW9kdWxlIFNldCA9IENhbWwuTW9yZUxhYmVscy5TZXQgKCoqIEBjYW5vbmljYWwgQ2FtbC5Nb3JlTGFiZWxzLlNldCAqKVxuXG4gIG1vZHVsZSBTdGFjayA9IENhbWwuU3RhY2sgKCoqIEBjYW5vbmljYWwgQ2FtbC5TdGFjayAqKVxuXG4gIG1vZHVsZSBTdHJpbmcgPSBDYW1sLlN0ZExhYmVscy5TdHJpbmcgKCoqIEBjYW5vbmljYWwgQ2FtbC5TdGRMYWJlbHMuU3RyaW5nICopXG5cbiAgbW9kdWxlIFN5cyA9IENhbWwuU3lzICgqKiBAY2Fub25pY2FsIENhbWwuU3lzICopXG5cbiAgbW9kdWxlIFVjaGFyID0gQ2FtbC5VY2hhciAoKiogQGNhbm9uaWNhbCBDYW1sLlVjaGFyICopXG5cbiAgbW9kdWxlIFVuaXQgPSBDYW1sLlVuaXQgKCoqIEBjYW5vbmljYWwgQ2FtbC5Vbml0ICopXG5cbiAgZXhjZXB0aW9uIE5vdF9mb3VuZCA9IENhbWwuTm90X2ZvdW5kXG5lbmRcblxuZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcblxuKCogVGhlc2UgbmVlZCB0byBiZSBkZWNsYXJlZCBhcyBhbiBleHRlcm5hbCB0byBnZXQgdGhlIGxhenkgYmVoYXZpb3IgKilcbmV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG5leHRlcm5hbCAoIHx8ICkgOiBib29sIC0+IGJvb2wgLT4gYm9vbCA9IFwiJXNlcXVvclwiXG5leHRlcm5hbCBub3QgOiBib29sIC0+IGJvb2wgPSBcIiVib29sbm90XCJcblxuKCogV2UgdXNlIFtPYmoubWFnaWNdIGhlcmUgYXMgb3RoZXIgaW1wbGVtZW50YXRpb25zIGdlbmVyYXRlIGEgY29uZGl0aW9uYWwganVtcCBhbmQgdGhlXG4gICBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlIGlzIG5vdGljZWFibGUuICopXG5sZXQgYm9vbF90b19pbnQgKHggOiBib29sKSA6IGludCA9IENhbWwuT2JqLm1hZ2ljIHhcblxuKCogVGhpcyBuZWVkIHRvIGJlIGRlY2xhcmVkIGFzIGFuIGV4dGVybmFsIGZvciB0aGUgd2FybmluZ3MgdG8gd29yayBwcm9wZXJseSAqKVxuZXh0ZXJuYWwgaWdub3JlIDogXyAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxubGV0ICggIT0gKSA9IENhbWwuKCAhPSApXG5sZXQgKCAqICkgPSBDYW1sLiggKiApXG5sZXQgKCAqKiApID0gQ2FtbC4oICoqIClcbmxldCAoICouICkgPSBDYW1sLiggKi4gKVxubGV0ICggKyApID0gQ2FtbC4oICsgKVxubGV0ICggKy4gKSA9IENhbWwuKCArLiApXG5sZXQgKCAtICkgPSBDYW1sLiggLSApXG5sZXQgKCAtLiApID0gQ2FtbC4oIC0uIClcbmxldCAoIC8gKSA9IENhbWwuKCAvIClcbmxldCAoIC8uICkgPSBDYW1sLiggLy4gKVxuXG5tb2R1bGUgUG9seSA9IFBvbHkwICgqKiBAY2Fub25pY2FsIEJhc2UuUG9seSAqKVxuXG5tb2R1bGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICAoKiBEZWNsYXJlZCBhcyBleHRlcm5hbHMgc28gdGhhdCB0aGUgY29tcGlsZXIgc2tpcHMgdGhlIGNhbWxfYXBwbHlfWCB3cmFwcGluZyBldmVuIHdoZW5cbiAgICAgY29tcGlsaW5nIHdpdGhvdXQgY3Jvc3MgbGlicmFyeSBpbmxpbmluZy4gKilcbiAgZXh0ZXJuYWwgKCA9ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG4gIGV4dGVybmFsICggPD4gKSA6IGludCAtPiBpbnQgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcbiAgZXh0ZXJuYWwgKCA8ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG4gIGV4dGVybmFsICggPiApIDogaW50IC0+IGludCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuICBleHRlcm5hbCAoIDw9ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuICBleHRlcm5hbCAoID49ICkgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuICBleHRlcm5hbCBjb21wYXJlIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbiAgZXh0ZXJuYWwgZXF1YWwgOiBpbnQgLT4gaW50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgbGV0IGFzY2VuZGluZyAoeCA6IGludCkgeSA9IGNvbXBhcmUgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogaW50KSB5ID0gY29tcGFyZSB5IHhcbiAgbGV0IG1heCAoeCA6IGludCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBpbnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbmluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5tb2R1bGUgSW50MzJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA8ICkgeCB5XG4gIGxldCAoIDw9ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IENhbWwuSW50MzIudCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPSApIHggeVxuICBsZXQgKCA+ICkgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LmFzY2VuZGluZyB4IHlcbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBDYW1sLkludDMyLnQpIHkgPSBQb2x5LmVxdWFsIHggeVxuICBsZXQgbWF4ICh4IDogQ2FtbC5JbnQzMi50KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IENhbWwuSW50MzIudCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICAoKiBEZWNsYXJlZCBhcyBleHRlcm5hbHMgc28gdGhhdCB0aGUgY29tcGlsZXIgc2tpcHMgdGhlIGNhbWxfYXBwbHlfWCB3cmFwcGluZyBldmVuIHdoZW5cbiAgICAgY29tcGlsaW5nIHdpdGhvdXQgY3Jvc3MgbGlicmFyeSBpbmxpbmluZy4gKilcbiAgZXh0ZXJuYWwgKCA9ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG4gIGV4dGVybmFsICggPD4gKSA6IENhbWwuSW50NjQudCAtPiBDYW1sLkludDY0LnQgLT4gYm9vbCA9IFwiJW5vdGVxdWFsXCJcbiAgZXh0ZXJuYWwgKCA8ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVsZXNzdGhhblwiXG4gIGV4dGVybmFsICggPiApIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBib29sID0gXCIlZ3JlYXRlcnRoYW5cIlxuICBleHRlcm5hbCAoIDw9ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVsZXNzZXF1YWxcIlxuICBleHRlcm5hbCAoID49ICkgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuICBleHRlcm5hbCBjb21wYXJlIDogQ2FtbC5JbnQ2NC50IC0+IENhbWwuSW50NjQudCAtPiBpbnQgPSBcIiVjb21wYXJlXCJcbiAgZXh0ZXJuYWwgZXF1YWwgOiBDYW1sLkludDY0LnQgLT4gQ2FtbC5JbnQ2NC50IC0+IGJvb2wgPSBcIiVlcXVhbFwiXG5cbiAgbGV0IGFzY2VuZGluZyAoeCA6IENhbWwuSW50NjQudCkgeSA9IFBvbHkuYXNjZW5kaW5nIHggeVxuICBsZXQgZGVzY2VuZGluZyAoeCA6IENhbWwuSW50NjQudCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IG1heCAoeCA6IENhbWwuSW50NjQudCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBDYW1sLkludDY0LnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBDYW1sLk5hdGl2ZWludC50KSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IENhbWwuTmF0aXZlaW50LnQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogQ2FtbC5OYXRpdmVpbnQudCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIEJvb2xfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IGJvb2wpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBib29sKSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogYm9vbCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBib29sKSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBib29sKSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogYm9vbCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBib29sKSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBib29sKSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IGJvb2wpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogYm9vbCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIENoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IGNoYXIpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogY2hhcikgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogY2hhcikgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogY2hhcikgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiBjaGFyKSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiBjaGFyKSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogY2hhcikgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiBjaGFyKSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiBjaGFyKSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IGNoYXIpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogY2hhcikgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubW9kdWxlIFVjaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgaSB4ID0gQ2FtbC5VY2hhci50b19pbnQgeFxuICBsZXQgKCA8ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIChpIHgpIChpIHkpXG4gIGxldCAoIDw9ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSAoaSB4KSAoaSB5KVxuICBsZXQgKCA8PiApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw+ICkgKGkgeCkgKGkgeSlcbiAgbGV0ICggPSApICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID0gKSAoaSB4KSAoaSB5KVxuICBsZXQgKCA+ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPiApIChpIHgpIChpIHkpXG4gIGxldCAoID49ICkgKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSAoaSB4KSAoaSB5KVxuXG4gIGxldCBhc2NlbmRpbmcgKHggOiBDYW1sLlVjaGFyLnQpIHkgPVxuICAgIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuYXNjZW5kaW5nIChpIHgpIChpIHkpXG4gIDs7XG5cbiAgbGV0IGRlc2NlbmRpbmcgKHggOiBDYW1sLlVjaGFyLnQpIHkgPVxuICAgIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuZGVzY2VuZGluZyAoaSB4KSAoaSB5KVxuICA7O1xuXG4gIGxldCBjb21wYXJlICh4IDogQ2FtbC5VY2hhci50KSB5ID0gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5jb21wYXJlIChpIHgpIChpIHkpXG4gIGxldCBlcXVhbCAoeCA6IENhbWwuVWNoYXIudCkgeSA9IEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuZXF1YWwgKGkgeCkgKGkgeSlcbiAgbGV0IG1heCAoeCA6IENhbWwuVWNoYXIudCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBDYW1sLlVjaGFyLnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IGZsb2F0KSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogZmxvYXQpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IGZsb2F0KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogZmxvYXQpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogZmxvYXQpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IGZsb2F0KSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IGZsb2F0KSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IGZsb2F0KSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG5tb2R1bGUgU3RyaW5nX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBzdHJpbmcpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogc3RyaW5nKSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IHN0cmluZykgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogc3RyaW5nKSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogc3RyaW5nKSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IHN0cmluZykgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogc3RyaW5nKSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IHN0cmluZykgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBzdHJpbmcpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbm1vZHVsZSBCeXRlc19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgPSBzdHJ1Y3RcbiAgbGV0ICggPCApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPD0gKSB4IHlcbiAgbGV0ICggPD4gKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oIDw+ICkgeCB5XG4gIGxldCAoID0gKSAoeCA6IGJ5dGVzKSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPiApIHggeVxuICBsZXQgKCA+PSApICh4IDogYnl0ZXMpIHkgPSBQb2x5LiggPj0gKSB4IHlcbiAgbGV0IGFzY2VuZGluZyAoeCA6IGJ5dGVzKSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogYnl0ZXMpIHkgPSBQb2x5LmRlc2NlbmRpbmcgeCB5XG4gIGxldCBjb21wYXJlICh4IDogYnl0ZXMpIHkgPSBQb2x5LmNvbXBhcmUgeCB5XG4gIGxldCBlcXVhbCAoeCA6IGJ5dGVzKSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IGJ5dGVzKSB5ID0gaWYgeCA+PSB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1pbiAoeCA6IGJ5dGVzKSB5ID0gaWYgeCA8PSB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG4oKiBUaGlzIG5lZWRzIHRvIGJlIGRlZmluZWQgYXMgYW4gZXh0ZXJuYWwgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIHNwZWNpYWxpemUgaXQgYXMgYVxuICAgZGlyZWN0IHNldCBvciBjYW1sX21vZGlmeSAqKVxuZXh0ZXJuYWwgKCA6PSApIDogJ2EgcmVmIC0+ICdhIC0+IHVuaXQgPSBcIiVzZXRmaWVsZDBcIlxuXG4oKiBUaGVzZSBuZWVkIHRvIGJlIGRlZmluZWQgYXMgYW4gZXh0ZXJuYWwgb3RoZXJ3aXNlIHRoZSBjb21waWxlciB3b24ndCB1bmJveFxuICAgcmVmZXJlbmNlcyAqKVxuZXh0ZXJuYWwgKCAhICkgOiAnYSByZWYgLT4gJ2EgPSBcIiVmaWVsZDBcIlxuZXh0ZXJuYWwgcmVmIDogJ2EgLT4gJ2EgcmVmID0gXCIlbWFrZW11dGFibGVcIlxuXG5sZXQgKCBAICkgPSBDYW1sLiggQCApXG5sZXQgKCBeICkgPSBDYW1sLiggXiApXG5sZXQgKCB+LSApID0gQ2FtbC4oIH4tIClcbmxldCAoIH4tLiApID0gQ2FtbC4oIH4tLiApXG5sZXQgKCBhc3IgKSA9IENhbWwuKCBhc3IgKVxubGV0ICggbGFuZCApID0gQ2FtbC4oIGxhbmQgKVxubGV0IGxub3QgPSBDYW1sLmxub3RcbmxldCAoIGxvciApID0gQ2FtbC4oIGxvciApXG5sZXQgKCBsc2wgKSA9IENhbWwuKCBsc2wgKVxubGV0ICggbHNyICkgPSBDYW1sLiggbHNyIClcbmxldCAoIGx4b3IgKSA9IENhbWwuKCBseG9yIClcbmxldCAoIG1vZCApID0gQ2FtbC4oIG1vZCApXG5sZXQgYWJzID0gQ2FtbC5hYnNcbmxldCBmYWlsd2l0aCA9IENhbWwuZmFpbHdpdGhcbmxldCBmc3QgPSBDYW1sLmZzdFxubGV0IGludmFsaWRfYXJnID0gQ2FtbC5pbnZhbGlkX2FyZ1xubGV0IHNuZCA9IENhbWwuc25kXG5cbigqIFtyYWlzZV0gbmVlZHMgdG8gYmUgZGVmaW5lZCBhcyBhbiBleHRlcm5hbCBhcyB0aGUgY29tcGlsZXIgYXV0b21hdGljYWxseSByZXBsYWNlc1xuICAgJyVyYWlzZScgYnkgJyVyZXJhaXNlJyB3aGVuIGFwcHJvcHJpYXRlLiAqKVxuZXh0ZXJuYWwgcmFpc2UgOiBleG4gLT4gXyA9IFwiJXJhaXNlXCJcblxubGV0IHBoeXNfZXF1YWwgPSBDYW1sLiggPT0gKVxubGV0IGRlY3IgPSBDYW1sLmRlY3JcbmxldCBpbmNyID0gQ2FtbC5pbmNyXG5cbigqIHVzZWQgYnkgc2V4cF9jb252LCB3aGljaCBmbG9hdDAgZGVwZW5kcyBvbiB0aHJvdWdoIG9wdGlvbiAqKVxubGV0IGZsb2F0X29mX3N0cmluZyA9IENhbWwuZmxvYXRfb2Zfc3RyaW5nXG5cbigqIFthbV90ZXN0aW5nXSBpcyB1c2VkIGluIGEgZmV3IHBsYWNlcyB0byBiZWhhdmUgZGlmZmVyZW50bHkgd2hlbiBpbiB0ZXN0aW5nIG1vZGUsIHN1Y2hcbiAgIGFzIGluIFtyYW5kb20ubWxdLiAgW2FtX3Rlc3RpbmddIGlzIGltcGxlbWVudGVkIHVzaW5nIFtCYXNlX2FtX3Rlc3RpbmddLCBhIHdlYWsgQy9qc1xuICAgcHJpbWl0aXZlIHRoYXQgcmV0dXJucyBbZmFsc2VdLCBidXQgd2hlbiBsaW5raW5nIGFuIGlubGluZS10ZXN0LXJ1bm5lciBleGVjdXRhYmxlLCBpc1xuICAgb3ZlcnJpZGRlbiBieSBhbm90aGVyIHByaW1pdGl2ZSB0aGF0IHJldHVybnMgW3RydWVdLiAqKVxuZXh0ZXJuYWwgYW1fdGVzdGluZyA6IHVuaXQgLT4gYm9vbCA9IFwiQmFzZV9hbV90ZXN0aW5nXCJcblxubGV0IGFtX3Rlc3RpbmcgPSBhbV90ZXN0aW5nICgpXG4iLCJvcGVuISBJbXBvcnQwXG5pbmNsdWRlIENhbWwuUHJpbnRmXG5cbigqKiBmYWlsd2l0aCwgaW52YWxpZF9hcmcsIGFuZCBleGl0IGFjY2VwdGluZyBwcmludGYncyBmb3JtYXQuICopXG5cbmxldCBmYWlsd2l0aGYgZm10ID0ga3NwcmludGYgKGZ1biBzICgpIC0+IGZhaWx3aXRoIHMpIGZtdFxubGV0IGludmFsaWRfYXJnZiBmbXQgPSBrc3ByaW50ZiAoZnVuIHMgKCkgLT4gaW52YWxpZF9hcmcgcykgZm10XG4iLCIoKiBbU3lzMF0gZGVmaW5lcyBmdW5jdGlvbnMgdGhhdCBhcmUgcHJpbWl0aXZlcyBvciBjYW4gYmUgc2ltcGx5IGRlZmluZWQgaW5cbiAgIHRlcm1zIG9mIFtDYW1sLlN5c10uICBbU3lzMF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZSBwYXJ0IG9mXG4gICBbQ2FtbC5TeXNdIHRoYXQgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyIHRoYW4gc3lzLm1sXG4gICBzaG91bGQgdXNlIFtDYW1sLlN5c10uIFtTeXMwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZVxuICAgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLiAgQWxsIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSB0aGVzZVxuICAgZnVuY3Rpb25zIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5TeXNdIGluIGJ1aWxkIG9yZGVyIHNob3VsZCBkb1xuICAgW21vZHVsZSBTeXMgPSBTeXMwXS4gIERlZmluaW5nIFttb2R1bGUgU3lzID0gU3lzMF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZVxuICAgaXQgcHJldmVudHMgb2NhbWxkZXAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5TeXNdLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5cbnR5cGUgYmFja2VuZF90eXBlID0gQ2FtbC5TeXMuYmFja2VuZF90eXBlID1cbiAgfCBOYXRpdmVcbiAgfCBCeXRlY29kZVxuICB8IE90aGVyIG9mIHN0cmluZ1xuXG5sZXQgYmFja2VuZF90eXBlID0gQ2FtbC5TeXMuYmFja2VuZF90eXBlXG5sZXQgaW50ZXJhY3RpdmUgPSBDYW1sLlN5cy5pbnRlcmFjdGl2ZVxubGV0IG9zX3R5cGUgPSBDYW1sLlN5cy5vc190eXBlXG5sZXQgdW5peCA9IENhbWwuU3lzLnVuaXhcbmxldCB3aW4zMiA9IENhbWwuU3lzLndpbjMyXG5sZXQgY3lnd2luID0gQ2FtbC5TeXMuY3lnd2luXG5sZXQgd29yZF9zaXplX2luX2JpdHMgPSBDYW1sLlN5cy53b3JkX3NpemVcbmxldCBpbnRfc2l6ZV9pbl9iaXRzID0gQ2FtbC5TeXMuaW50X3NpemVcbmxldCBiaWdfZW5kaWFuID0gQ2FtbC5TeXMuYmlnX2VuZGlhblxubGV0IG1heF9zdHJpbmdfbGVuZ3RoID0gQ2FtbC5TeXMubWF4X3N0cmluZ19sZW5ndGhcbmxldCBtYXhfYXJyYXlfbGVuZ3RoID0gQ2FtbC5TeXMubWF4X2FycmF5X2xlbmd0aFxubGV0IHJ1bnRpbWVfdmFyaWFudCA9IENhbWwuU3lzLnJ1bnRpbWVfdmFyaWFudFxubGV0IHJ1bnRpbWVfcGFyYW1ldGVycyA9IENhbWwuU3lzLnJ1bnRpbWVfcGFyYW1ldGVyc1xubGV0IGFyZ3YgPSBDYW1sLlN5cy5hcmd2XG5sZXQgZ2V0X2FyZ3YgKCkgPSBDYW1sLlN5cy5hcmd2XG5sZXQgb2NhbWxfdmVyc2lvbiA9IENhbWwuU3lzLm9jYW1sX3ZlcnNpb25cbmxldCBlbmFibGVfcnVudGltZV93YXJuaW5ncyA9IENhbWwuU3lzLmVuYWJsZV9ydW50aW1lX3dhcm5pbmdzXG5sZXQgcnVudGltZV93YXJuaW5nc19lbmFibGVkID0gQ2FtbC5TeXMucnVudGltZV93YXJuaW5nc19lbmFibGVkXG5cbmxldCBnZXRlbnZfZXhuIHZhciA9XG4gIHRyeSBDYW1sLlN5cy5nZXRlbnYgdmFyIHdpdGhcbiAgfCBDYW1sLk5vdF9mb3VuZCAtPlxuICAgIFByaW50Zi5mYWlsd2l0aGYgXCJTeXMuZ2V0ZW52X2V4bjogZW52aXJvbm1lbnQgdmFyaWFibGUgJXMgaXMgbm90IHNldFwiIHZhciAoKVxuOztcblxubGV0IGdldGVudiB2YXIgPVxuICBtYXRjaCBDYW1sLlN5cy5nZXRlbnYgdmFyIHdpdGhcbiAgfCB4IC0+IFNvbWUgeFxuICB8IGV4Y2VwdGlvbiBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5leHRlcm5hbCBvcGFxdWVfaWRlbnRpdHkgOiAnYSAtPiAnYSA9IFwiJW9wYXF1ZVwiXG5cbmV4Y2VwdGlvbiBCcmVhayA9IENhbWwuU3lzLkJyZWFrXG4iLCIoKiBbQXJyYXkwXSBkZWZpbmVzIGFycmF5IGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHkgZGVmaW5lZCBpbiB0ZXJtc1xuICAgb2YgW0NhbWwuQXJyYXldLiAgW0FycmF5MF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZSBwYXJ0IG9mIFtDYW1sLkFycmF5XVxuICAgdGhhdCBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXIgdGhhbiBhcnJheTAubWwgc2hvdWxkIHVzZSBbQ2FtbC5BcnJheV0uXG4gICBbQXJyYXkwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuICBBbGxcbiAgIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBhcnJheXMgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLkFycmF5XSBpbiBidWlsZCBvcmRlciBzaG91bGRcbiAgIGRvIFttb2R1bGUgQXJyYXkgPSBBcnJheTBdLiAgVGhpcyBpbmNsdWRlcyB1c2VzIG9mIHN1YnNjcmlwdCBzeW50YXggKFt4LihpKV0sIFt4LihpKSA8LVxuICAgZV0pLCB3aGljaCB0aGUgT0NhbWwgcGFyc2VyIGRlc3VnYXJzIGludG8gY2FsbHMgdG8gW0FycmF5LmdldF0gYW5kIFtBcnJheS5zZXRdLlxuICAgRGVmaW5pbmcgW21vZHVsZSBBcnJheSA9IEFycmF5MF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdCBwcmV2ZW50cyBvY2FtbGRlcCBmcm9tXG4gICBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5BcnJheV0uICopXG5cbm9wZW4hIEltcG9ydDBcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5cbm1vZHVsZSBBcnJheSA9IHN0cnVjdFxuICBleHRlcm5hbCBjcmVhdGUgOiBpbnQgLT4gJ2EgLT4gJ2EgYXJyYXkgPSBcImNhbWxfbWFrZV92ZWN0XCJcbiAgZXh0ZXJuYWwgY3JlYXRlX2Zsb2F0X3VuaW5pdGlhbGl6ZWQgOiBpbnQgLT4gZmxvYXQgYXJyYXkgPSBcImNhbWxfbWFrZV9mbG9hdF92ZWN0XCJcbiAgZXh0ZXJuYWwgZ2V0IDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhID0gXCIlYXJyYXlfc2FmZV9nZXRcIlxuICBleHRlcm5hbCBsZW5ndGggOiAnYSBhcnJheSAtPiBpbnQgPSBcIiVhcnJheV9sZW5ndGhcIlxuICBleHRlcm5hbCBzZXQgOiAnYSBhcnJheSAtPiBpbnQgLT4gJ2EgLT4gdW5pdCA9IFwiJWFycmF5X3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6ICdhIGFycmF5IC0+IGludCAtPiAnYSA9IFwiJWFycmF5X3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogJ2EgYXJyYXkgLT4gaW50IC0+ICdhIC0+IHVuaXQgPSBcIiVhcnJheV91bnNhZmVfc2V0XCJcblxuICBleHRlcm5hbCB1bnNhZmVfYmxpdFxuICAgIDogIHNyYzonYSBhcnJheVxuICAgIC0+IHNyY19wb3M6aW50XG4gICAgLT4gZHN0OidhIGFycmF5XG4gICAgLT4gZHN0X3BvczppbnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gdW5pdFxuICAgID0gXCJjYW1sX2FycmF5X2JsaXRcIlxuZW5kXG5cbmluY2x1ZGUgQXJyYXlcblxubGV0IG1heF9sZW5ndGggPSBTeXMubWF4X2FycmF5X2xlbmd0aFxuXG5sZXQgY3JlYXRlIH5sZW4geCA9XG4gIHRyeSBjcmVhdGUgbGVuIHggd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgXyAtPiBpbnZhbGlkX2FyZ2YgXCJBcnJheS5jcmVhdGUgfmxlbjolZDogaW52YWxpZCBsZW5ndGhcIiBsZW4gKClcbjs7XG5cbmxldCBjcmVhdGVfZmxvYXRfdW5pbml0aWFsaXplZCB+bGVuID1cbiAgdHJ5IGNyZWF0ZV9mbG9hdF91bmluaXRpYWxpemVkIGxlbiB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBfIC0+XG4gICAgaW52YWxpZF9hcmdmIFwiQXJyYXkuY3JlYXRlX2Zsb2F0X3VuaW5pdGlhbGl6ZWQgfmxlbjolZDogaW52YWxpZCBsZW5ndGhcIiBsZW4gKClcbjs7XG5cbmxldCBhcHBlbmQgPSBDYW1sLkFycmF5LmFwcGVuZFxubGV0IGJsaXQgPSBDYW1sLkFycmF5LmJsaXRcbmxldCBjb25jYXQgPSBDYW1sLkFycmF5LmNvbmNhdFxubGV0IGNvcHkgPSBDYW1sLkFycmF5LmNvcHlcbmxldCBmaWxsID0gQ2FtbC5BcnJheS5maWxsXG5sZXQgaW5pdCA9IENhbWwuQXJyYXkuaW5pdFxubGV0IG1ha2VfbWF0cml4ID0gQ2FtbC5BcnJheS5tYWtlX21hdHJpeFxubGV0IG9mX2xpc3QgPSBDYW1sLkFycmF5Lm9mX2xpc3RcbmxldCBzdWIgPSBDYW1sLkFycmF5LnN1YlxubGV0IHRvX2xpc3QgPSBDYW1sLkFycmF5LnRvX2xpc3RcblxuKCogVGhlc2UgYXJlIGV0YSBleHBhbmRlZCBpbiBvcmRlciB0byBwZXJtdXRlIHBhcmFtZXRlciBvcmRlciB0byBmb2xsb3cgQmFzZVxuICAgY29udmVudGlvbnMuICopXG5sZXQgZm9sZCB0IH5pbml0IH5mID0gQ2FtbC5BcnJheS5mb2xkX2xlZnQgdCB+aW5pdCB+ZlxubGV0IGZvbGRfcmlnaHQgdCB+ZiB+aW5pdCA9IENhbWwuQXJyYXkuZm9sZF9yaWdodCB0IH5mIH5pbml0XG5sZXQgaXRlciB0IH5mID0gQ2FtbC5BcnJheS5pdGVyIHQgfmZcbmxldCBpdGVyaSB0IH5mID0gQ2FtbC5BcnJheS5pdGVyaSB0IH5mXG5sZXQgbWFwIHQgfmYgPSBDYW1sLkFycmF5Lm1hcCB0IH5mXG5sZXQgbWFwaSB0IH5mID0gQ2FtbC5BcnJheS5tYXBpIHQgfmZcbmxldCBzdGFibGVfc29ydCB0IH5jb21wYXJlID0gQ2FtbC5BcnJheS5zdGFibGVfc29ydCB0IH5jbXA6Y29tcGFyZVxuXG5sZXQgc3dhcCB0IGkgaiA9XG4gIGxldCBlbHRfaSA9IHQuKGkpIGluXG4gIGxldCBlbHRfaiA9IHQuKGopIGluXG4gIHVuc2FmZV9zZXQgdCBpIGVsdF9qO1xuICB1bnNhZmVfc2V0IHQgaiBlbHRfaVxuOztcbiIsIigqIFtDaGFyMF0gZGVmaW5lcyBjaGFyIGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHkgZGVmaW5lZCBpbiB0ZXJtcyBvZlxuICAgW0NhbWwuQ2hhcl0uICBbQ2hhcjBdIGlzIGludGVuZGVkIHRvIGNvbXBsZXRlbHkgZXhwcmVzcyB0aGUgcGFydCBvZiBbQ2FtbC5DaGFyXSB0aGF0XG4gICBbQmFzZV0gdXNlcyAtLSBubyBvdGhlciBmaWxlIGluIEJhc2Ugb3RoZXIgdGhhbiBjaGFyMC5tbCBzaG91bGQgdXNlIFtDYW1sLkNoYXJdLlxuICAgW0NoYXIwXSBoYXMgZmV3IGRlcGVuZGVuY2llcywgYW5kIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuICBBbGxcbiAgIEJhc2UgZmlsZXMgdGhhdCBuZWVkIHRvIHVzZSBjaGFycyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuQ2hhcl0gaW4gYnVpbGQgb3JkZXIgc2hvdWxkIGRvXG4gICBbbW9kdWxlIENoYXIgPSBDaGFyMF0uICBEZWZpbmluZyBbbW9kdWxlIENoYXIgPSBDaGFyMF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdFxuICAgcHJldmVudHMgb2NhbWxkZXAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5DaGFyXS4gKilcblxub3BlbiEgSW1wb3J0MFxuXG5sZXQgZmFpbHdpdGhmID0gUHJpbnRmLmZhaWx3aXRoZlxubGV0IGVzY2FwZWQgPSBDYW1sLkNoYXIuZXNjYXBlZFxubGV0IGxvd2VyY2FzZSA9IENhbWwuQ2hhci5sb3dlcmNhc2VfYXNjaWlcbmxldCB0b19pbnQgPSBDYW1sLkNoYXIuY29kZVxubGV0IHVuc2FmZV9vZl9pbnQgPSBDYW1sLkNoYXIudW5zYWZlX2NoclxubGV0IHVwcGVyY2FzZSA9IENhbWwuQ2hhci51cHBlcmNhc2VfYXNjaWlcblxuKCogV2UgdXNlIG91ciBvd24gcmFuZ2UgdGVzdCB3aGVuIGNvbnZlcnRpbmcgaW50ZWdlcnMgdG8gY2hhcnMgcmF0aGVyIHRoYW5cbiAgIGNhbGxpbmcgW0NhbWwuQ2hhci5jaHJdIGJlY2F1c2UgaXQncyBzaW1wbGUgYW5kIGl0IHNhdmVzIHVzIGEgZnVuY3Rpb24gY2FsbFxuICAgYW5kIHRoZSB0cnktd2l0aCAoZXhjZXB0aW9ucyBjb3N0LCBlc3BlY2lhbGx5IGluIHRoZSB3b3JsZCB3aXRoIGJhY2t0cmFjZXMpLiAqKVxubGV0IGludF9pc19vayBpID0gMCA8PSBpICYmIGkgPD0gMjU1XG5sZXQgbWluX3ZhbHVlID0gdW5zYWZlX29mX2ludCAwXG5sZXQgbWF4X3ZhbHVlID0gdW5zYWZlX29mX2ludCAyNTVcbmxldCBvZl9pbnQgaSA9IGlmIGludF9pc19vayBpIHRoZW4gU29tZSAodW5zYWZlX29mX2ludCBpKSBlbHNlIE5vbmVcblxubGV0IG9mX2ludF9leG4gaSA9XG4gIGlmIGludF9pc19vayBpXG4gIHRoZW4gdW5zYWZlX29mX2ludCBpXG4gIGVsc2UgZmFpbHdpdGhmIFwiQ2hhci5vZl9pbnRfZXhuIGdvdCBpbnRlZ2VyIG91dCBvZiByYW5nZTogJWRcIiBpICgpXG47O1xuXG5sZXQgZXF1YWwgKHQxIDogY2hhcikgdDIgPSBQb2x5LmVxdWFsIHQxIHQyXG4iLCIoKiBbSW50MF0gZGVmaW5lcyBpbnRlZ2VyIGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHlcbiAgIGRlZmluZWQgaW4gdGVybXMgb2YgW0NhbWxdLiBbSW50MF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZVxuICAgcGFydCBvZiBbQ2FtbF0gdGhhdCBbQmFzZV0gdXNlcyBmb3IgaW50ZWdlcnMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyXG4gICB0aGFuIGludDAubWwgc2hvdWxkIHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgdGhyb3VnaCBbQ2FtbF0uIFtJbnQwXSBoYXNcbiAgIGZldyBkZXBlbmRlbmNpZXMsIGFuZCBzbyBpcyBhdmFpbGFibGUgZWFybHkgaW4gQmFzZSdzIGJ1aWxkIG9yZGVyLlxuXG4gICBBbGwgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIGludHMgYW5kIGNvbWUgYmVmb3JlIFtCYXNlLkludF0gaW4gYnVpbGRcbiAgIG9yZGVyIHNob3VsZCBkbzpcblxuICAge1tcbiAgICAgbW9kdWxlIEludCAgPSBJbnQwXG4gICBdfVxuXG4gICBEZWZpbmluZyBbbW9kdWxlIEludCA9IEludDBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXQgcHJldmVudHMgb2NhbWxkZXBcbiAgIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuSW50XS4gKilcblxubGV0IHRvX3N0cmluZyA9IENhbWwuc3RyaW5nX29mX2ludFxubGV0IG9mX3N0cmluZyA9IENhbWwuaW50X29mX3N0cmluZ1xubGV0IHRvX2Zsb2F0ID0gQ2FtbC5mbG9hdF9vZl9pbnRcbmxldCBvZl9mbG9hdCA9IENhbWwuaW50X29mX2Zsb2F0XG5sZXQgbWF4X3ZhbHVlID0gQ2FtbC5tYXhfaW50XG5sZXQgbWluX3ZhbHVlID0gQ2FtbC5taW5faW50XG5sZXQgc3VjYyA9IENhbWwuc3VjY1xuIiwiKCogW0xpc3QwXSBkZWZpbmVzIGxpc3QgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseSBkZWZpbmVkIGluIHRlcm1zIG9mXG4gICBbQ2FtbC5MaXN0XS4gIFtMaXN0MF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZSBwYXJ0IG9mIFtDYW1sLkxpc3RdIHRoYXRcbiAgIFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlciB0aGFuIGxpc3QwLm1sIHNob3VsZCB1c2UgW0NhbWwuTGlzdF0uXG4gICBbTGlzdDBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2UncyBidWlsZCBvcmRlci4gIEFsbFxuICAgQmFzZSBmaWxlcyB0aGF0IG5lZWQgdG8gdXNlIGxpc3RzIGFuZCBjb21lIGJlZm9yZSBbQmFzZS5MaXN0XSBpbiBidWlsZCBvcmRlciBzaG91bGQgZG9cbiAgIFttb2R1bGUgTGlzdCA9IExpc3QwXS4gIERlZmluaW5nIFttb2R1bGUgTGlzdCA9IExpc3QwXSBpcyBhbHNvIG5lY2Vzc2FyeSBiZWNhdXNlIGl0XG4gICBwcmV2ZW50cyBvY2FtbGRlcCBmcm9tIG1pc3Rha2VubHkgY2F1c2luZyBhIGZpbGUgdG8gZGVwZW5kIG9uIFtCYXNlLkxpc3RdLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5cbmxldCBoZF9leG4gPSBDYW1sLkxpc3QuaGRcbmxldCBsZW5ndGggPSBDYW1sLkxpc3QubGVuZ3RoXG5sZXQgcmV2X2FwcGVuZCA9IENhbWwuTGlzdC5yZXZfYXBwZW5kXG5sZXQgdGxfZXhuID0gQ2FtbC5MaXN0LnRsXG5sZXQgdW56aXAgPSBDYW1sLkxpc3Quc3BsaXRcblxuKCogVGhlc2UgYXJlIGV0YSBleHBhbmRlZCBpbiBvcmRlciB0byBwZXJtdXRlIHBhcmFtZXRlciBvcmRlciB0byBmb2xsb3cgQmFzZVxuICAgY29udmVudGlvbnMuICopXG5sZXQgZXhpc3RzIHQgfmYgPSBDYW1sLkxpc3QuZXhpc3RzIHQgfmZcbmxldCBleGlzdHMyX29rIGwxIGwyIH5mID0gQ2FtbC5MaXN0LmV4aXN0czIgbDEgbDIgfmZcbmxldCBmb2xkIHQgfmluaXQgfmYgPSBDYW1sLkxpc3QuZm9sZF9sZWZ0IHQgfmYgfmluaXRcbmxldCBmb2xkMl9vayBsMSBsMiB+aW5pdCB+ZiA9IENhbWwuTGlzdC5mb2xkX2xlZnQyIGwxIGwyIH5pbml0IH5mXG5sZXQgZm9yX2FsbCB0IH5mID0gQ2FtbC5MaXN0LmZvcl9hbGwgdCB+ZlxubGV0IGZvcl9hbGwyX29rIGwxIGwyIH5mID0gQ2FtbC5MaXN0LmZvcl9hbGwyIGwxIGwyIH5mXG5sZXQgaXRlciB0IH5mID0gQ2FtbC5MaXN0Lml0ZXIgdCB+ZlxubGV0IGl0ZXIyX29rIGwxIGwyIH5mID0gQ2FtbC5MaXN0Lml0ZXIyIGwxIGwyIH5mXG5sZXQgbm9udGFpbF9tYXAgdCB+ZiA9IENhbWwuTGlzdC5tYXAgdCB+ZlxubGV0IG5vbnRhaWxfbWFwaSB0IH5mID0gQ2FtbC5MaXN0Lm1hcGkgdCB+ZlxubGV0IHBhcnRpdGlvbiB0IH5mID0gQ2FtbC5MaXN0LnBhcnRpdGlvbiB0IH5mXG5sZXQgcmV2X21hcCB0IH5mID0gQ2FtbC5MaXN0LnJldl9tYXAgdCB+ZlxubGV0IHJldl9tYXAyX29rIGwxIGwyIH5mID0gQ2FtbC5MaXN0LnJldl9tYXAyIGwxIGwyIH5mXG5sZXQgc29ydCBsIH5jb21wYXJlID0gQ2FtbC5MaXN0LnNvcnQgbCB+Y21wOmNvbXBhcmVcbmxldCBzdGFibGVfc29ydCBsIH5jb21wYXJlID0gQ2FtbC5MaXN0LnN0YWJsZV9zb3J0IGwgfmNtcDpjb21wYXJlXG5cbmxldCByZXYgPSBmdW5jdGlvblxuICB8IChbXSB8IFsgXyBdKSBhcyByZXMgLT4gcmVzXG4gIHwgeCA6OiB5IDo6IHJlc3QgLT4gcmV2X2FwcGVuZCByZXN0IFsgeTsgeCBdXG47O1xuXG5sZXQgZm9sZF9yaWdodCBsIH5mIH5pbml0ID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gaW5pdCAoKiBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBbfmZdIGJlbG93ICopXG4gIHwgXyAtPiBmb2xkIH5mOihmdW4gYSBiIC0+IGYgYiBhKSB+aW5pdCAocmV2IGwpXG47O1xuIiwiKCpcbiAgIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byB0aGUgcnVudGltZSBzdXBwb3J0IGZvciBbcHB4X2hhc2hdLlxuXG4gICBUaGUgW3BweF9oYXNoXSBzeW50YXggZXh0ZW5zaW9uIHN1cHBvcnRzOiBbQEBkZXJpdmluZyBoYXNoXSBhbmQgWyVoYXNoX2ZvbGQ6IFRZUEVdIGFuZFxuICAgWyVoYXNoOiBUWVBFXVxuXG4gICBGb3IgdHlwZSBbdF0gYSBmdW5jdGlvbiBbaGFzaF9mb2xkX3RdIG9mIHR5cGUgW0hhc2guc3RhdGUgLT4gdCAtPiBIYXNoLnN0YXRlXSBpc1xuICAgZ2VuZXJhdGVkLlxuXG4gICBUaGUgZ2VuZXJhdGVkIFtoYXNoX2ZvbGRfPFQ+XSBmdW5jdGlvbiBpcyBjb21wb3NpdGlvbmFsLCBmb2xsb3dpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGVcbiAgIHR5cGU7IGFsbG93aW5nIHVzZXIgb3ZlcnJpZGVzIGF0IGV2ZXJ5IGxldmVsLiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIG9jYW1sJ3MgYnVpbHRpblxuICAgcG9seW1vcnBoaWMgaGFzaGluZyBbSGFzaHRibC5oYXNoXSB3aGljaCBpZ25vcmVzIHVzZXIgb3ZlcnJpZGVzLlxuXG4gICBUaGUgZ2VuZXJhdG9yIGFsc28gcHJvdmlkZXMgYSBkaXJlY3QgaGFzaC1mdW5jdGlvbiBbaGFzaF0gKG5hbWVkIFtoYXNoXzxUPl0gd2hlbiA8VD4gIT1cbiAgIFwidFwiKSBvZiB0eXBlOiBbdCAtPiBIYXNoLmhhc2hfdmFsdWVdLlxuXG4gICBUaGUgZm9sZGluZyBoYXNoIGZ1bmN0aW9uIGNhbiBiZSBhY2Nlc3NlZCBhcyBbJWhhc2hfZm9sZDogVFlQRV1cbiAgIFRoZSBkaXJlY3QgaGFzaCBmdW5jdGlvbiBjYW4gYmUgYWNjZXNzZWQgYXMgWyVoYXNoOiBUWVBFXVxuKilcblxub3BlbiEgSW1wb3J0MFxubW9kdWxlIEFycmF5ID0gQXJyYXkwXG5tb2R1bGUgQ2hhciA9IENoYXIwXG5tb2R1bGUgSW50ID0gSW50MFxubW9kdWxlIExpc3QgPSBMaXN0MFxuaW5jbHVkZSBIYXNoX2ludGZcblxuKCoqIEJ1aWx0aW4gZm9sZGluZy1zdHlsZSBoYXNoIGZ1bmN0aW9ucywgYWJzdHJhY3RlZCBvdmVyIFtIYXNoX2ludGYuU10gKilcbm1vZHVsZSBGb2xkaW5nIChIYXNoIDogSGFzaF9pbnRmLlMpIDpcbiAgSGFzaF9pbnRmLkJ1aWx0aW5faW50ZlxuICB3aXRoIHR5cGUgc3RhdGUgPSBIYXNoLnN0YXRlXG4gICBhbmQgdHlwZSBoYXNoX3ZhbHVlID0gSGFzaC5oYXNoX3ZhbHVlID0gc3RydWN0XG4gIHR5cGUgc3RhdGUgPSBIYXNoLnN0YXRlXG4gIHR5cGUgaGFzaF92YWx1ZSA9IEhhc2guaGFzaF92YWx1ZVxuICB0eXBlICdhIGZvbGRlciA9IHN0YXRlIC0+ICdhIC0+IHN0YXRlXG5cbiAgbGV0IGhhc2hfZm9sZF91bml0IHMgKCkgPSBzXG4gIGxldCBoYXNoX2ZvbGRfaW50ID0gSGFzaC5mb2xkX2ludFxuICBsZXQgaGFzaF9mb2xkX2ludDY0ID0gSGFzaC5mb2xkX2ludDY0XG4gIGxldCBoYXNoX2ZvbGRfZmxvYXQgPSBIYXNoLmZvbGRfZmxvYXRcbiAgbGV0IGhhc2hfZm9sZF9zdHJpbmcgPSBIYXNoLmZvbGRfc3RyaW5nXG4gIGxldCBhc19pbnQgZiBzIHggPSBoYXNoX2ZvbGRfaW50IHMgKGYgeClcblxuICAoKiBUaGlzIGlnbm9yZXMgdGhlIHNpZ24gYml0IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBidXQgaXQncyB1bmxpa2VseSB0byBsZWFkIHRvXG4gICAgIGZyZXF1ZW50IGNvbGxpc2lvbnMgKG1pbl92YWx1ZSBjb2xsaWRpbmcgd2l0aCAwIGlzIHRoZSBtb3N0IGxpa2VseSBvbmUpLiAgKilcbiAgbGV0IGhhc2hfZm9sZF9pbnQzMiA9IGFzX2ludCBDYW1sLkludDMyLnRvX2ludFxuICBsZXQgaGFzaF9mb2xkX2NoYXIgPSBhc19pbnQgQ2hhci50b19pbnRcblxuICBsZXQgaGFzaF9mb2xkX2Jvb2wgPVxuICAgIGFzX2ludCAoZnVuY3Rpb25cbiAgICAgIHwgdHJ1ZSAtPiAxXG4gICAgICB8IGZhbHNlIC0+IDApXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9uYXRpdmVpbnQgcyB4ID0gaGFzaF9mb2xkX2ludDY0IHMgKENhbWwuSW50NjQub2ZfbmF0aXZlaW50IHgpXG5cbiAgbGV0IGhhc2hfZm9sZF9vcHRpb24gaGFzaF9mb2xkX2VsZW0gcyA9IGZ1bmN0aW9uXG4gICAgfCBOb25lIC0+IGhhc2hfZm9sZF9pbnQgcyAwXG4gICAgfCBTb21lIHggLT4gaGFzaF9mb2xkX2VsZW0gKGhhc2hfZm9sZF9pbnQgcyAxKSB4XG4gIDs7XG5cbiAgbGV0IHJlYyBoYXNoX2ZvbGRfbGlzdF9ib2R5IGhhc2hfZm9sZF9lbGVtIHMgbGlzdCA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiBzXG4gICAgfCB4IDo6IHhzIC0+IGhhc2hfZm9sZF9saXN0X2JvZHkgaGFzaF9mb2xkX2VsZW0gKGhhc2hfZm9sZF9lbGVtIHMgeCkgeHNcbiAgOztcblxuICBsZXQgaGFzaF9mb2xkX2xpc3QgaGFzaF9mb2xkX2VsZW0gcyBsaXN0ID1cbiAgICAoKiBUaGUgW2xlbmd0aF0gb2YgdGhlIGxpc3QgbXVzdCBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaGFzaC1zdGF0ZSBzbyB2YWx1ZXMgb2ZcbiAgICAgICB0eXBlcyBzdWNoIGFzIFt1bml0IGxpc3RdIC0gKFtdLCBbKCldLCBbKCk7KCldLC4uKSBhcmUgaGFzaGVkIGRpZmZlcmVudGx5LiAqKVxuICAgICgqIFRoZSBbbGVuZ3RoXSBtdXN0IGNvbWUgYmVmb3JlIHRoZSBlbGVtZW50cyB0byBhdm9pZCBhIHZpb2xhdGlvbiBvZiB0aGUgcnVsZVxuICAgICAgIGVuZm9yY2VkIGJ5IFBlcmZlY3RfaGFzaC4gKilcbiAgICBsZXQgcyA9IGhhc2hfZm9sZF9pbnQgcyAoTGlzdC5sZW5ndGggbGlzdCkgaW5cbiAgICBsZXQgcyA9IGhhc2hfZm9sZF9saXN0X2JvZHkgaGFzaF9mb2xkX2VsZW0gcyBsaXN0IGluXG4gICAgc1xuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfbGF6eV90IGhhc2hfZm9sZF9lbGVtIHMgeCA9IGhhc2hfZm9sZF9lbGVtIHMgKENhbWwuTGF6eS5mb3JjZSB4KVxuICBsZXQgaGFzaF9mb2xkX3JlZl9mcm96ZW4gaGFzaF9mb2xkX2VsZW0gcyB4ID0gaGFzaF9mb2xkX2VsZW0gcyAheFxuXG4gIGxldCByZWMgaGFzaF9mb2xkX2FycmF5X2Zyb3plbl9pIGhhc2hfZm9sZF9lbGVtIHMgYXJyYXkgaSA9XG4gICAgaWYgaSA9IEFycmF5Lmxlbmd0aCBhcnJheVxuICAgIHRoZW4gc1xuICAgIGVsc2UgKFxuICAgICAgbGV0IGUgPSBBcnJheS51bnNhZmVfZ2V0IGFycmF5IGkgaW5cbiAgICAgIGhhc2hfZm9sZF9hcnJheV9mcm96ZW5faSBoYXNoX2ZvbGRfZWxlbSAoaGFzaF9mb2xkX2VsZW0gcyBlKSBhcnJheSAoaSArIDEpKVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfYXJyYXlfZnJvemVuIGhhc2hfZm9sZF9lbGVtIHMgYXJyYXkgPVxuICAgIGhhc2hfZm9sZF9hcnJheV9mcm96ZW5faVxuICAgICAgKCogW2xlbmd0aF0gbXVzdCBiZSBpbmNvcnBvcmF0ZWQgZm9yIGFycmF5cywgYXMgaXQgaXMgZm9yIGxpc3RzLiBTZWUgY29tbWVudCBhYm92ZSAqKVxuICAgICAgaGFzaF9mb2xkX2VsZW1cbiAgICAgIChoYXNoX2ZvbGRfaW50IHMgKEFycmF5Lmxlbmd0aCBhcnJheSkpXG4gICAgICBhcnJheVxuICAgICAgMFxuICA7O1xuXG4gICgqIHRoZSBkdXBsaWNhdGlvbiBoZXJlIGlzIGJlY2F1c2Ugd2UgdGhpbmtcbiAgICAgb2NhbWwgY2FuJ3QgZWxpbWluYXRlIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGxzIG90aGVyd2lzZS4gKilcbiAgbGV0IGhhc2hfbmF0aXZlaW50IHggPVxuICAgIEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9uYXRpdmVpbnQgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICA7O1xuXG4gIGxldCBoYXNoX2ludDY0IHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfaW50NjQgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICBsZXQgaGFzaF9pbnQzMiB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2ludDMyIChIYXNoLnJlc2V0IChIYXNoLmFsbG9jICgpKSkgeClcbiAgbGV0IGhhc2hfY2hhciB4ID0gSGFzaC5nZXRfaGFzaF92YWx1ZSAoaGFzaF9mb2xkX2NoYXIgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICBsZXQgaGFzaF9pbnQgeCA9IEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9pbnQgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICBsZXQgaGFzaF9ib29sIHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfYm9vbCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG5cbiAgbGV0IGhhc2hfc3RyaW5nIHggPVxuICAgIEhhc2guZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF9zdHJpbmcgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICA7O1xuXG4gIGxldCBoYXNoX2Zsb2F0IHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfZmxvYXQgKEhhc2gucmVzZXQgKEhhc2guYWxsb2MgKCkpKSB4KVxuICBsZXQgaGFzaF91bml0IHggPSBIYXNoLmdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfdW5pdCAoSGFzaC5yZXNldCAoSGFzaC5hbGxvYyAoKSkpIHgpXG5lbmRcblxubW9kdWxlIEYgKEhhc2ggOiBIYXNoX2ludGYuUykgOlxuICBIYXNoX2ludGYuRnVsbFxuICB3aXRoIHR5cGUgaGFzaF92YWx1ZSA9IEhhc2guaGFzaF92YWx1ZVxuICAgYW5kIHR5cGUgc3RhdGUgPSBIYXNoLnN0YXRlXG4gICBhbmQgdHlwZSBzZWVkID0gSGFzaC5zZWVkID0gc3RydWN0XG4gIGluY2x1ZGUgSGFzaFxuXG4gIHR5cGUgJ2EgZm9sZGVyID0gc3RhdGUgLT4gJ2EgLT4gc3RhdGVcblxuICBsZXQgY3JlYXRlID9zZWVkICgpID0gcmVzZXQgP3NlZWQgKGFsbG9jICgpKVxuICBsZXQgb2ZfZm9sZCBoYXNoX2ZvbGRfdCB0ID0gZ2V0X2hhc2hfdmFsdWUgKGhhc2hfZm9sZF90IChjcmVhdGUgKCkpIHQpXG5cbiAgbW9kdWxlIEJ1aWx0aW4gPSBGb2xkaW5nIChIYXNoKVxuXG4gIGxldCBydW4gP3NlZWQgZm9sZGVyIHggPVxuICAgIEhhc2guZ2V0X2hhc2hfdmFsdWUgKGZvbGRlciAoSGFzaC5yZXNldCA/c2VlZCAoSGFzaC5hbGxvYyAoKSkpIHgpXG4gIDs7XG5lbmRcblxubW9kdWxlIEludGVybmFsaGFzaCA6IHNpZ1xuICBpbmNsdWRlXG4gICAgSGFzaF9pbnRmLlNcbiAgICB3aXRoIHR5cGUgc3RhdGUgPSBCYXNlX2ludGVybmFsaGFzaF90eXBlcy5zdGF0ZVxuICAgICAoKiBXZSBnaXZlIGEgY29uY3JldGUgdHlwZSBmb3IgW3N0YXRlXSwgYWxiZWl0IG9ubHkgcGFydGlhbGx5IGV4cG9zZWQgKHNlZVxuICAgICAgICBCYXNlX2ludGVybmFsaGFzaF90eXBlcyksIHNvIHRoYXQgaXQgdW5pZmllcyB3aXRoIHRoZSBzYW1lIHR5cGUgaW4gW0Jhc2VfYm9vdF0sXG4gICAgICAgIGFuZCB0byBhbGxvdyBvcHRpbWl6YXRpb25zIGZvciB0aGUgaW1tZWRpYXRlIHR5cGUuICopXG4gICAgIGFuZCB0eXBlIHNlZWQgPSBCYXNlX2ludGVybmFsaGFzaF90eXBlcy5zZWVkXG4gICAgIGFuZCB0eXBlIGhhc2hfdmFsdWUgPSBCYXNlX2ludGVybmFsaGFzaF90eXBlcy5oYXNoX3ZhbHVlXG5cbiAgZXh0ZXJuYWwgZm9sZF9pbnQ2NCA6IHN0YXRlIC0+IGludDY0IC0+IHN0YXRlID0gXCJCYXNlX2ludGVybmFsaGFzaF9mb2xkX2ludDY0XCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBmb2xkX2ludCA6IHN0YXRlIC0+IGludCAtPiBzdGF0ZSA9IFwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9pbnRcIiBbQEBub2FsbG9jXVxuXG4gIGV4dGVybmFsIGZvbGRfZmxvYXQgOiBzdGF0ZSAtPiBmbG9hdCAtPiBzdGF0ZSA9IFwiQmFzZV9pbnRlcm5hbGhhc2hfZm9sZF9mbG9hdFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgZm9sZF9zdHJpbmcgOiBzdGF0ZSAtPiBzdHJpbmcgLT4gc3RhdGUgPSBcIkJhc2VfaW50ZXJuYWxoYXNoX2ZvbGRfc3RyaW5nXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBnZXRfaGFzaF92YWx1ZSA6IHN0YXRlIC0+IGhhc2hfdmFsdWUgPSBcIkJhc2VfaW50ZXJuYWxoYXNoX2dldF9oYXNoX3ZhbHVlXCJcbiAgW0BAbm9hbGxvY11cbmVuZCA9IHN0cnVjdFxuICBsZXQgZGVzY3JpcHRpb24gPSBcImludGVybmFsaGFzaFwiXG5cbiAgaW5jbHVkZSBCYXNlX2ludGVybmFsaGFzaF90eXBlc1xuXG4gIGxldCBhbGxvYyAoKSA9IGNyZWF0ZV9zZWVkZWQgMFxuICBsZXQgcmVzZXQgPyhzZWVkID0gMCkgX3QgPSBjcmVhdGVfc2VlZGVkIHNlZWRcblxuICBtb2R1bGUgRm9yX3Rlc3RzID0gc3RydWN0XG4gICAgbGV0IGNvbXBhcmVfc3RhdGUgKGEgOiBzdGF0ZSkgKGIgOiBzdGF0ZSkgPSBjb21wYXJlIChhIDo+IGludCkgKGIgOj4gaW50KVxuICAgIGxldCBzdGF0ZV90b19zdHJpbmcgKHN0YXRlIDogc3RhdGUpID0gSW50LnRvX3N0cmluZyAoc3RhdGUgOj4gaW50KVxuICBlbmRcbmVuZFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICBpbmNsdWRlIEludGVybmFsaGFzaFxuXG4gIHR5cGUgJ2EgZm9sZGVyID0gc3RhdGUgLT4gJ2EgLT4gc3RhdGVcblxuICBsZXQgY3JlYXRlID9zZWVkICgpID0gcmVzZXQgP3NlZWQgKGFsbG9jICgpKVxuICBsZXQgcnVuID9zZWVkIGZvbGRlciB4ID0gZ2V0X2hhc2hfdmFsdWUgKGZvbGRlciAocmVzZXQgP3NlZWQgKGFsbG9jICgpKSkgeClcbiAgbGV0IG9mX2ZvbGQgaGFzaF9mb2xkX3QgdCA9IGdldF9oYXNoX3ZhbHVlIChoYXNoX2ZvbGRfdCAoY3JlYXRlICgpKSB0KVxuXG4gIG1vZHVsZSBCdWlsdGluID0gc3RydWN0XG4gICAgbW9kdWxlIEZvbGRpbmcgPSBGb2xkaW5nIChJbnRlcm5hbGhhc2gpXG4gICAgaW5jbHVkZSBGb2xkaW5nXG5cbiAgICAoKiBbRm9sZGluZ10gcHJvdmlkZXMgc29tZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIFtoYXNoXypdIGZ1bmN0aW9ucyBiZWxvdyxcbiAgICAgICBidXQgdGhleSBhcmUgaW5lZmZpY2llbnQgZm9yIHNvbWUgdXNlLWNhc2VzIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUgW2hhc2hfZm9sZF1cbiAgICAgICBmdW5jdGlvbnMuIEF0IHRoaXMgcG9pbnQsIHRoZSBbaGFzaF92YWx1ZV0gdHlwZSBoYXMgYmVlbiBmaXhlZCB0byBbaW50XSwgc28gdGhpc1xuICAgICAgIG1vZHVsZSBjYW4gcHJvdmlkZSBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMuICopXG5cbiAgICBsZXQgaGFzaF9jaGFyID0gQ2hhcjAudG9faW50XG5cbiAgICAoKiBUaGlzIGhhc2ggd2FzIGNob3NlbiBmcm9tIGhlcmU6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2JhZGJveS82MjY3NzQzXG5cbiAgICAgICBJdCBhdHRlbXB0cyB0byBmdWxmaWxsIHRoZSBwcmltYXJ5IGdvYWxzIG9mIGEgbm9uLWNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbjpcblxuICAgICAgIC0gYSBiaXQgY2hhbmdlIGluIHRoZSBpbnB1dCBzaG91bGQgY2hhbmdlIH4xLzIgb2YgdGhlIG91dHB1dCBiaXRzXG4gICAgICAgLSB0aGUgb3V0cHV0IHNob3VsZCBiZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBvdXRwdXQgcmFuZ2VcbiAgICAgICAtIGlucHV0cyB0aGF0IGFyZSBjbG9zZSB0byBlYWNoIG90aGVyIHNob3VsZG4ndCBsZWFkIHRvIG91dHB1dHMgdGhhdCBhcmUgY2xvc2UgdG9cbiAgICAgICAgIGVhY2ggb3RoZXIuXG4gICAgICAgLSBhbGwgYml0cyBvZiB0aGUgaW5wdXQgYXJlIHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUgb3V0cHV0XG5cbiAgICAgICBJbiBvdXIgY2FzZSB3ZSBhbHNvIHdhbnQgaXQgdG8gYmUgZmFzdCwgbm9uLWFsbG9jYXRpbmcsIGFuZCBpbmxpbmFibGUuICAqKVxuICAgIGxldFtAaW5saW5lIGFsd2F5c10gaGFzaF9pbnQgKHQgOiBpbnQpID1cbiAgICAgIGxldCB0ID0gbG5vdCB0ICsgKHQgbHNsIDIxKSBpblxuICAgICAgbGV0IHQgPSB0IGx4b3IgKHQgbHNyIDI0KSBpblxuICAgICAgbGV0IHQgPSB0ICsgKHQgbHNsIDMpICsgKHQgbHNsIDgpIGluXG4gICAgICBsZXQgdCA9IHQgbHhvciAodCBsc3IgMTQpIGluXG4gICAgICBsZXQgdCA9IHQgKyAodCBsc2wgMikgKyAodCBsc2wgNCkgaW5cbiAgICAgIGxldCB0ID0gdCBseG9yICh0IGxzciAyOCkgaW5cbiAgICAgIHQgKyAodCBsc2wgMzEpXG4gICAgOztcblxuICAgIGxldCBoYXNoX2Jvb2wgeCA9IGlmIHggdGhlbiAxIGVsc2UgMFxuXG4gICAgZXh0ZXJuYWwgaGFzaF9mbG9hdCA6IGZsb2F0IC0+IGludCA9IFwiQmFzZV9oYXNoX2RvdWJsZVwiIFtAQG5vYWxsb2NdXG5cbiAgICBsZXQgaGFzaF91bml0ICgpID0gMFxuICBlbmRcbmVuZFxuXG5pbmNsdWRlIFRcbiIsIm9wZW4gSW1wb3J0MFxuXG5sZXQgcGh5c19lcXVhbCA9IHBoeXNfZXF1YWxcblxuZXh0ZXJuYWwgcG9seW1vcnBoaWNfY29tcGFyZSA6ICdhIC0+ICdhIC0+IGludCA9IFwiJWNvbXBhcmVcIlxuZXh0ZXJuYWwgcG9seW1vcnBoaWNfZXF1YWwgOiAnYSAtPiAnYSAtPiBib29sID0gXCIlZXF1YWxcIlxuZXh0ZXJuYWwgKCAmJiApIDogYm9vbCAtPiBib29sIC0+IGJvb2wgPSBcIiVzZXF1YW5kXCJcblxubGV0IGNvbXBhcmVfYWJzdHJhY3QgfnR5cGVfbmFtZSBfIF8gPVxuICBQcmludGYua3NwcmludGZcbiAgICBmYWlsd2l0aFxuICAgIFwiQ29tcGFyZSBjYWxsZWQgb24gdGhlIHR5cGUgJXMsIHdoaWNoIGlzIGFic3RyYWN0IGluIGFuIGltcGxlbWVudGF0aW9uLlwiXG4gICAgdHlwZV9uYW1lXG47O1xuXG5sZXQgZXF1YWxfYWJzdHJhY3QgfnR5cGVfbmFtZSBfIF8gPVxuICBQcmludGYua3NwcmludGZcbiAgICBmYWlsd2l0aFxuICAgIFwiRXF1YWwgY2FsbGVkIG9uIHRoZSB0eXBlICVzLCB3aGljaCBpcyBhYnN0cmFjdCBpbiBhbiBpbXBsZW1lbnRhdGlvbi5cIlxuICAgIHR5cGVfbmFtZVxuOztcblxudHlwZSAnYSBjb21wYXJlID0gJ2EgLT4gJ2EgLT4gaW50XG50eXBlICdhIGVxdWFsID0gJ2EgLT4gJ2EgLT4gYm9vbFxuXG5tb2R1bGUgQ29tcGFyYWJsZSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgY29tcGFyZSA6IHQgY29tcGFyZVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiAnYSBjb21wYXJlIC0+ICdhIHQgY29tcGFyZVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiAnYSBjb21wYXJlIC0+ICdiIGNvbXBhcmUgLT4gKCdhLCAnYikgdCBjb21wYXJlXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgdmFsIGNvbXBhcmUgOiAnYSBjb21wYXJlIC0+ICdiIGNvbXBhcmUgLT4gJ2MgY29tcGFyZSAtPiAoJ2EsICdiLCAnYykgdCBjb21wYXJlXG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBFcXVhbCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICB2YWwgZXF1YWwgOiB0IGVxdWFsXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMxID0gc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgZXF1YWwgOiAnYSBlcXVhbCAtPiAnYSB0IGVxdWFsXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgZXF1YWwgOiAnYSBlcXVhbCAtPiAnYiBlcXVhbCAtPiAoJ2EsICdiKSB0IGVxdWFsXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgdmFsIGVxdWFsIDogJ2EgZXF1YWwgLT4gJ2IgZXF1YWwgLT4gJ2MgZXF1YWwgLT4gKCdhLCAnYiwgJ2MpIHQgZXF1YWxcbiAgZW5kXG5lbmRcblxubW9kdWxlIEJ1aWx0aW4gPSBzdHJ1Y3RcbiAgbGV0IGNvbXBhcmVfYm9vbCA6IGJvb2wgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9jaGFyIDogY2hhciBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX2Zsb2F0IDogZmxvYXQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9pbnQgOiBpbnQgY29tcGFyZSA9IFBvbHkuY29tcGFyZVxuICBsZXQgY29tcGFyZV9pbnQzMiA6IGludDMyIGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcbiAgbGV0IGNvbXBhcmVfaW50NjQgOiBpbnQ2NCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX25hdGl2ZWludCA6IG5hdGl2ZWludCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX3N0cmluZyA6IHN0cmluZyBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gIGxldCBjb21wYXJlX3VuaXQgOiB1bml0IGNvbXBhcmUgPSBQb2x5LmNvbXBhcmVcblxuICBsZXQgY29tcGFyZV9hcnJheSBjb21wYXJlX2VsdCBhIGIgPVxuICAgIGlmIHBoeXNfZXF1YWwgYSBiXG4gICAgdGhlbiAwXG4gICAgZWxzZSAoXG4gICAgICBsZXQgbGVuX2EgPSBBcnJheTAubGVuZ3RoIGEgaW5cbiAgICAgIGxldCBsZW5fYiA9IEFycmF5MC5sZW5ndGggYiBpblxuICAgICAgbGV0IHJldCA9IGNvbXBhcmUgbGVuX2EgbGVuX2IgaW5cbiAgICAgIGlmIHJldCA8PiAwXG4gICAgICB0aGVuIHJldFxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgICAgICBpZiBpID0gbGVuX2FcbiAgICAgICAgICB0aGVuIDBcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCBsID0gQXJyYXkwLnVuc2FmZV9nZXQgYSBpXG4gICAgICAgICAgICBhbmQgciA9IEFycmF5MC51bnNhZmVfZ2V0IGIgaSBpblxuICAgICAgICAgICAgbGV0IHJlcyA9IGNvbXBhcmVfZWx0IGwgciBpblxuICAgICAgICAgICAgaWYgcmVzIDw+IDAgdGhlbiByZXMgZWxzZSBsb29wIChpICsgMSkpXG4gICAgICAgIGluXG4gICAgICAgIGxvb3AgMCkpXG4gIDs7XG5cbiAgbGV0IHJlYyBjb21wYXJlX2xpc3QgY29tcGFyZV9lbHQgYSBiID1cbiAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IFtdLCBbXSAtPiAwXG4gICAgfCBbXSwgXyAtPiAtMVxuICAgIHwgXywgW10gLT4gMVxuICAgIHwgeCA6OiB4cywgeSA6OiB5cyAtPlxuICAgICAgbGV0IHJlcyA9IGNvbXBhcmVfZWx0IHggeSBpblxuICAgICAgaWYgcmVzIDw+IDAgdGhlbiByZXMgZWxzZSBjb21wYXJlX2xpc3QgY29tcGFyZV9lbHQgeHMgeXNcbiAgOztcblxuICBsZXQgY29tcGFyZV9vcHRpb24gY29tcGFyZV9lbHQgYSBiID1cbiAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IE5vbmUsIE5vbmUgLT4gMFxuICAgIHwgTm9uZSwgU29tZSBfIC0+IC0xXG4gICAgfCBTb21lIF8sIE5vbmUgLT4gMVxuICAgIHwgU29tZSBhLCBTb21lIGIgLT4gY29tcGFyZV9lbHQgYSBiXG4gIDs7XG5cbiAgbGV0IGNvbXBhcmVfcmVmIGNvbXBhcmVfZWx0IGEgYiA9IGNvbXBhcmVfZWx0ICFhICFiXG4gIGxldCBlcXVhbF9ib29sIDogYm9vbCBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX2NoYXIgOiBjaGFyIGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfaW50IDogaW50IGVxdWFsID0gUG9seS5lcXVhbFxuICBsZXQgZXF1YWxfaW50MzIgOiBpbnQzMiBlcXVhbCA9IFBvbHkuZXF1YWxcbiAgbGV0IGVxdWFsX2ludDY0IDogaW50NjQgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF9zdHJpbmcgOiBzdHJpbmcgZXF1YWwgPSBQb2x5LmVxdWFsXG4gIGxldCBlcXVhbF91bml0IDogdW5pdCBlcXVhbCA9IFBvbHkuZXF1YWxcblxuICAoKiBbUG9seS5lcXVhbF0gaXMgSUVFRSBjb21wbGlhbnQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQgaGVyZS4gKilcbiAgbGV0IGVxdWFsX2Zsb2F0IHggeSA9IGVxdWFsX2ludCAoY29tcGFyZV9mbG9hdCB4IHkpIDBcblxuICBsZXQgZXF1YWxfYXJyYXkgZXF1YWxfZWx0IGEgYiA9XG4gICAgcGh5c19lcXVhbCBhIGJcbiAgICB8fFxuICAgIGxldCBsZW5fYSA9IEFycmF5MC5sZW5ndGggYSBpblxuICAgIGxldCBsZW5fYiA9IEFycmF5MC5sZW5ndGggYiBpblxuICAgIGVxdWFsIGxlbl9hIGxlbl9iXG4gICAgJiZcbiAgICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgICBpID0gbGVuX2FcbiAgICAgIHx8XG4gICAgICBsZXQgbCA9IEFycmF5MC51bnNhZmVfZ2V0IGEgaVxuICAgICAgYW5kIHIgPSBBcnJheTAudW5zYWZlX2dldCBiIGkgaW5cbiAgICAgIGVxdWFsX2VsdCBsIHIgJiYgbG9vcCAoaSArIDEpXG4gICAgaW5cbiAgICBsb29wIDBcbiAgOztcblxuICBsZXQgcmVjIGVxdWFsX2xpc3QgZXF1YWxfZWx0IGEgYiA9XG4gICAgbWF0Y2ggYSwgYiB3aXRoXG4gICAgfCBbXSwgW10gLT4gdHJ1ZVxuICAgIHwgW10sIF8gfCBfLCBbXSAtPiBmYWxzZVxuICAgIHwgeCA6OiB4cywgeSA6OiB5cyAtPiBlcXVhbF9lbHQgeCB5ICYmIGVxdWFsX2xpc3QgZXF1YWxfZWx0IHhzIHlzXG4gIDs7XG5cbiAgbGV0IGVxdWFsX29wdGlvbiBlcXVhbF9lbHQgYSBiID1cbiAgICBtYXRjaCBhLCBiIHdpdGhcbiAgICB8IE5vbmUsIE5vbmUgLT4gdHJ1ZVxuICAgIHwgTm9uZSwgU29tZSBfIHwgU29tZSBfLCBOb25lIC0+IGZhbHNlXG4gICAgfCBTb21lIGEsIFNvbWUgYiAtPiBlcXVhbF9lbHQgYSBiXG4gIDs7XG5cbiAgbGV0IGVxdWFsX3JlZiBlcXVhbF9lbHQgYSBiID0gZXF1YWxfZWx0ICFhICFiXG5lbmRcbiIsIigqKiBUaGlzIG1vZHVsZSBpcyBmb3IgdXNlIGJ5IHBweF9oYXNoLCBhbmQgaXMgdGh1cyBub3QgaW4gdGhlIGludGVyZmFjZSBvZiBCYXNlLiAqKVxubW9kdWxlIFN0ZCA9IHN0cnVjdFxuICBtb2R1bGUgSGFzaCA9IEhhc2ggKCoqIEBjYW5vbmljYWwgQmFzZS5IYXNoICopXG5lbmRcblxudHlwZSAnYSBoYXNoX2ZvbGQgPSBTdGQuSGFzaC5zdGF0ZSAtPiAnYSAtPiBTdGQuSGFzaC5zdGF0ZVxuXG5tb2R1bGUgSGFzaGFibGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGhhc2hfZm9sZF90IDogdCBoYXNoX2ZvbGRcbiAgICB2YWwgaGFzaCA6IHQgLT4gU3RkLkhhc2guaGFzaF92YWx1ZVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGhhc2hfZm9sZF90IDogJ2EgaGFzaF9mb2xkIC0+ICdhIHQgaGFzaF9mb2xkXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgaGFzaF9mb2xkX3QgOiAnYSBoYXNoX2ZvbGQgLT4gJ2IgaGFzaF9mb2xkIC0+ICgnYSwgJ2IpIHQgaGFzaF9mb2xkXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMzID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiLCAnYykgdFxuXG4gICAgdmFsIGhhc2hfZm9sZF90XG4gICAgICA6ICAnYSBoYXNoX2ZvbGRcbiAgICAgIC0+ICdiIGhhc2hfZm9sZFxuICAgICAgLT4gJ2MgaGFzaF9mb2xkXG4gICAgICAtPiAoJ2EsICdiLCAnYykgdCBoYXNoX2ZvbGRcbiAgZW5kXG5lbmRcbiIsIm9wZW4gSGFzaC5CdWlsdGluXG5vcGVuIFBweF9jb21wYXJlX2xpYi5CdWlsdGluXG5pbmNsdWRlIFNleHBsaWIwLlNleHBcblxuKCoqIFR5cGUgb2YgUy1leHByZXNzaW9ucyAqKVxudHlwZSB0ID0gU2V4cGxpYjAuU2V4cC50ID1cbiAgfCBBdG9tIG9mIHN0cmluZ1xuICB8IExpc3Qgb2YgdCBsaXN0XG5bQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxubGV0IHJlYyBjb21wYXJlID1cbiAgKGZ1biBhX18wMDFfIGJfXzAwMl8gLT5cbiAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDAxXyBiX18wMDJfXG4gICAgIHRoZW4gMFxuICAgICBlbHNlIChcbiAgICAgICBtYXRjaCBhX18wMDFfLCBiX18wMDJfIHdpdGhcbiAgICAgICB8IEF0b20gX2FfXzAwM18sIEF0b20gX2JfXzAwNF8gLT4gY29tcGFyZV9zdHJpbmcgX2FfXzAwM18gX2JfXzAwNF9cbiAgICAgICB8IEF0b20gXywgXyAtPiAtMVxuICAgICAgIHwgXywgQXRvbSBfIC0+IDFcbiAgICAgICB8IExpc3QgX2FfXzAwNV8sIExpc3QgX2JfXzAwNl8gLT4gY29tcGFyZV9saXN0IGNvbXBhcmUgX2FfXzAwNV8gX2JfXzAwNl8pXG4gICAgICAgOiB0IC0+IHQgLT4gaW50KVxuOztcblxubGV0IHJlYyAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgKGZ1biBoc3YgYXJnIC0+XG4gICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgIHwgQXRvbSBfYTAgLT5cbiAgICAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwIGluXG4gICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgIGhhc2hfZm9sZF9zdHJpbmcgaHN2IF9hMFxuICAgICB8IExpc3QgX2EwIC0+XG4gICAgICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMSBpblxuICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICBoYXNoX2ZvbGRfbGlzdCBoYXNoX2ZvbGRfdCBoc3YgX2EwXG4gICAgICAgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG5cbmFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgbGV0IGZ1bmMgYXJnID1cbiAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgIGhhc2hfZm9sZF90IGhzdiBhcmcpXG4gIGluXG4gIGZ1biB4IC0+IGZ1bmMgeFxuOztcblxuW0BAQGVuZF1cblxubGV0IHRfc2V4cF9ncmFtbWFyID0gU2V4cGxpYjAuU2V4cF9jb252LnNleHBfdF9zZXhwX2dyYW1tYXJcbmxldCBvZl9zdHJpbmcgPSAoKVxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIFN5cyA9IFN5czBcblxudHlwZSB0ID1cbiAgfCBXMzJcbiAgfCBXNjRcbltAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG5sZXQgc2V4cF9vZl90ID1cbiAgKGZ1bmN0aW9uXG4gICAgfCBXMzIgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiVzMyXCJcbiAgICB8IFc2NCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJXNjRcIlxuICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgbnVtX2JpdHMgPSBmdW5jdGlvblxuICB8IFczMiAtPiAzMlxuICB8IFc2NCAtPiA2NFxuOztcblxubGV0IHdvcmRfc2l6ZSA9XG4gIG1hdGNoIFN5cy53b3JkX3NpemVfaW5fYml0cyB3aXRoXG4gIHwgMzIgLT4gVzMyXG4gIHwgNjQgLT4gVzY0XG4gIHwgXyAtPiBmYWlsd2l0aCBcInVua25vd24gd29yZCBzaXplXCJcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxubGV0IHIgPSByZWYgWyBcIkJhc2UuU2V4cC5wcF9odW1cIiBdXG5sZXQgYWxsICgpID0gIXJcbmxldCByZWdpc3RlciBwID0gciA6PSBwIDo6ICFyXG5cbm1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgdHlwZSB0XG5cbiAgdmFsIHBwIDogRm9ybWF0dGVyLnQgLT4gdCAtPiB1bml0XG5lbmRcblxubW9kdWxlIFJlZ2lzdGVyX3BwIChNIDogc2lnXG4gICAgaW5jbHVkZSBTXG5cbiAgICB2YWwgbW9kdWxlX25hbWUgOiBzdHJpbmdcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgaW5jbHVkZSBNXG5cbiAgbGV0ICgpID0gcmVnaXN0ZXIgKE0ubW9kdWxlX25hbWUgXiBcIi5wcFwiKVxuZW5kXG5cbm1vZHVsZSBSZWdpc3RlciAoTSA6IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIG1vZHVsZV9uYW1lIDogc3RyaW5nXG4gICAgdmFsIHRvX3N0cmluZyA6IHQgLT4gc3RyaW5nXG4gIGVuZCkgPVxuICBSZWdpc3Rlcl9wcCAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICBsZXQgcHAgZm9ybWF0dGVyIHQgPSBDYW1sLkZvcm1hdC5wcF9wcmludF9zdHJpbmcgZm9ybWF0dGVyIChNLnRvX3N0cmluZyB0KVxuICBlbmQpXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSB0ID0gZXhuIFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG5sZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfZXhuIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG5cbltAQEBlbmRdXG5cbmxldCBleGl0ID0gQ2FtbC5leGl0XG5cbmV4Y2VwdGlvbiBGaW5hbGx5IG9mIHQgKiB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG5sZXQgKCkgPVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGQgWyVleHRlbnNpb25fY29uc3RydWN0b3IgRmluYWxseV0gKGZ1bmN0aW9uXG4gICAgfCBGaW5hbGx5IChhcmcwX18wMDFfLCBhcmcxX18wMDJfKSAtPlxuICAgICAgbGV0IHJlczBfXzAwM18gPSBzZXhwX29mX3QgYXJnMF9fMDAxX1xuICAgICAgYW5kIHJlczFfXzAwNF8gPSBzZXhwX29mX3QgYXJnMV9fMDAyXyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiZXhuLm1sLkZpbmFsbHlcIjsgcmVzMF9fMDAzXzsgcmVzMV9fMDA0XyBdXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbjs7XG5cbltAQEBlbmRdXG5cbmV4Y2VwdGlvbiBSZXJhaXNlZCBvZiBzdHJpbmcgKiB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG5sZXQgKCkgPVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGQgWyVleHRlbnNpb25fY29uc3RydWN0b3IgUmVyYWlzZWRdIChmdW5jdGlvblxuICAgIHwgUmVyYWlzZWQgKGFyZzBfXzAwNV8sIGFyZzFfXzAwNl8pIC0+XG4gICAgICBsZXQgcmVzMF9fMDA3XyA9IHNleHBfb2Zfc3RyaW5nIGFyZzBfXzAwNV9cbiAgICAgIGFuZCByZXMxX18wMDhfID0gc2V4cF9vZl90IGFyZzFfXzAwNl8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICBbIFNleHBsaWIwLlNleHAuQXRvbSBcImV4bi5tbC5SZXJhaXNlZFwiOyByZXMwX18wMDdfOyByZXMxX18wMDhfIF1cbiAgICB8IF8gLT4gYXNzZXJ0IGZhbHNlKVxuOztcblxuW0BAQGVuZF1cblxuZXhjZXB0aW9uIFNleHAgb2YgU2V4cC50XG5cbigqIFdlIGluc3RhbGwgYSBjdXN0b20gZXhuLWNvbnZlcnRlciByYXRoZXIgdGhhbiB1c2U6XG5cbiAgIHtbXG4gICAgIGV4Y2VwdGlvbiBTZXhwIG9mIFNleHAudCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cbiAgICAgKCogLi4uICopXG4gICAgIFtAQEBlbmRdXG4gICBdfVxuXG4gICB0byBlbGltaW5hdGUgdGhlIGV4dHJhIHdyYXBwaW5nIG9mIFsoU2V4cCAuLi4pXS4gKilcbmxldCAoKSA9XG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTZXhwXSAoZnVuY3Rpb25cbiAgICB8IFNleHAgdCAtPiB0XG4gICAgfCBfIC0+XG4gICAgICAoKiBSZWFjaGluZyB0aGlzIGJyYW5jaCBpbmRpY2F0ZXMgYSBidWcgaW4gc2V4cGxpYi4gKilcbiAgICAgIGFzc2VydCBmYWxzZSlcbjs7XG5cbmxldCBjcmVhdGVfcyBzZXhwID0gU2V4cCBzZXhwXG5cbmxldCByYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSB0IGJhY2t0cmFjZSA9XG4gIENhbWwuUHJpbnRleGMucmFpc2Vfd2l0aF9iYWNrdHJhY2UgdCBiYWNrdHJhY2Vcbjs7XG5cbmV4dGVybmFsIGlzX3BoeXNfZXF1YWxfbW9zdF9yZWNlbnQgOiB0IC0+IGJvb2wgPSBcIkJhc2VfY2FtbF9leG5faXNfbW9zdF9yZWNlbnRfZXhuXCJcblxubGV0IHJlcmFpc2UgZXhuIHN0ciA9XG4gIGxldCBleG4nID0gUmVyYWlzZWQgKHN0ciwgZXhuKSBpblxuICBpZiBpc19waHlzX2VxdWFsX21vc3RfcmVjZW50IGV4blxuICB0aGVuIChcbiAgICBsZXQgYnQgPSBDYW1sLlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpIGluXG4gICAgcmFpc2Vfd2l0aF9vcmlnaW5hbF9iYWNrdHJhY2UgZXhuJyBidClcbiAgZWxzZSByYWlzZSBleG4nXG47O1xuXG5sZXQgcmVyYWlzZWYgZXhjIGZvcm1hdCA9IFByaW50Zi5rc3ByaW50ZiAoZnVuIHN0ciAoKSAtPiByZXJhaXNlIGV4YyBzdHIpIGZvcm1hdFxubGV0IHRvX3N0cmluZyBleGMgPSBTZXhwLnRvX3N0cmluZ19odW0gfmluZGVudDoyIChzZXhwX29mX2V4biBleGMpXG5sZXQgdG9fc3RyaW5nX21hY2ggZXhjID0gU2V4cC50b19zdHJpbmdfbWFjaCAoc2V4cF9vZl9leG4gZXhjKVxubGV0IHNleHBfb2ZfdCA9IHNleHBfb2ZfZXhuXG5cbmxldCBwcm90ZWN0eCB+ZiB4IH4oZmluYWxseSA6IF8gLT4gdW5pdCkgPVxuICBtYXRjaCBmIHggd2l0aFxuICB8IHJlcyAtPlxuICAgIGZpbmFsbHkgeDtcbiAgICByZXNcbiAgfCBleGNlcHRpb24gZXhuIC0+XG4gICAgbGV0IGJ0ID0gQ2FtbC5QcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgIChtYXRjaCBmaW5hbGx5IHggd2l0aFxuICAgICB8ICgpIC0+IHJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIGV4biBidFxuICAgICB8IGV4Y2VwdGlvbiBmaW5hbF9leG4gLT5cbiAgICAgICAoKiBVbmZvcnR1bmF0ZWx5LCB0aGUgYmFja3RyYWNlIG9mIHRoZSBbZmluYWxfZXhuXSBpcyBkaXNjYXJkZWQgaGVyZS4gKilcbiAgICAgICByYWlzZV93aXRoX29yaWdpbmFsX2JhY2t0cmFjZSAoRmluYWxseSAoZXhuLCBmaW5hbF9leG4pKSBidClcbjs7XG5cbmxldCBwcm90ZWN0IH5mIH5maW5hbGx5ID0gcHJvdGVjdHggfmYgKCkgfmZpbmFsbHlcblxubGV0IGRvZXNfcmFpc2UgKHR5cGUgYSkgKGYgOiB1bml0IC0+IGEpID1cbiAgdHJ5XG4gICAgaWdub3JlIChmICgpIDogYSk7XG4gICAgZmFsc2VcbiAgd2l0aFxuICB8IF8gLT4gdHJ1ZVxuOztcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3Rlcl9wcCAoc3RydWN0XG4gICAgdHlwZSB0ID0gZXhuXG5cbiAgICBsZXQgcHAgcHBmIHQgPVxuICAgICAgbWF0Y2ggc2V4cF9vZl9leG5fb3B0IHQgd2l0aFxuICAgICAgfCBTb21lIHNleHAgLT4gU2V4cC5wcF9odW0gcHBmIHNleHBcbiAgICAgIHwgTm9uZSAtPiBDYW1sLkZvcm1hdC5wcF9wcmludF9zdHJpbmcgcHBmIChDYW1sLlByaW50ZXhjLnRvX3N0cmluZyB0KVxuICAgIDs7XG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuRXhuXCJcbiAgZW5kKVxuXG5sZXQgcHJpbnRfd2l0aF9iYWNrdHJhY2UgZXhjIHJhd19iYWNrdHJhY2UgPVxuICBDYW1sLkZvcm1hdC5lcHJpbnRmIFwiQFs8Mj5VbmNhdWdodCBleGNlcHRpb246QFxcbkBcXG5AWyVhQF1AXUBcXG5ALlwiIHBwIGV4YztcbiAgaWYgQ2FtbC5QcmludGV4Yy5iYWNrdHJhY2Vfc3RhdHVzICgpXG4gIHRoZW4gQ2FtbC5QcmludGV4Yy5wcmludF9yYXdfYmFja3RyYWNlIENhbWwuc3RkZXJyIHJhd19iYWNrdHJhY2U7XG4gIENhbWwuZmx1c2ggQ2FtbC5zdGRlcnJcbjs7XG5cbmxldCBzZXRfdW5jYXVnaHRfZXhjZXB0aW9uX2hhbmRsZXIgKCkgPVxuICBDYW1sLlByaW50ZXhjLnNldF91bmNhdWdodF9leGNlcHRpb25faGFuZGxlciBwcmludF93aXRoX2JhY2t0cmFjZVxuOztcblxubGV0IGhhbmRsZV91bmNhdWdodF9hdXggfmRvX2F0X2V4aXQgfmV4aXQgZiA9XG4gIHRyeSBmICgpIHdpdGhcbiAgfCBleGMgLT5cbiAgICBsZXQgcmF3X2JhY2t0cmFjZSA9IENhbWwuUHJpbnRleGMuZ2V0X3Jhd19iYWNrdHJhY2UgKCkgaW5cbiAgICAoKiBPbmUgcmVhc29uIHRvIHJ1biBbZG9fYXRfZXhpdF0gaGFuZGxlcnMgYmVmb3JlIHByaW50aW5nIG91dCB0aGUgZXJyb3IgbWVzc2FnZSBpc1xuICAgICAgIHRoYXQgaXQgaGVscHMgY3Vyc2VzIGFwcGxpY2F0aW9ucyBicmluZyB0aGUgdGVybWluYWwgaW4gYSBnb29kIHN0YXRlLCBvdGhlcndpc2UgdGhlXG4gICAgICAgZXJyb3IgbWVzc2FnZSBtaWdodCBnZXQgY29ycnVwdGVkLiAgQWxzbywgdGhlIE9DYW1sIHRvcC1sZXZlbCB1bmNhdWdodCBleGNlcHRpb25cbiAgICAgICBoYW5kbGVyIGRvZXMgdGhlIHNhbWUuICopXG4gICAgaWYgZG9fYXRfZXhpdFxuICAgIHRoZW4gKFxuICAgICAgdHJ5IENhbWwuZG9fYXRfZXhpdCAoKSB3aXRoXG4gICAgICB8IF8gLT4gKCkpO1xuICAgICh0cnkgcHJpbnRfd2l0aF9iYWNrdHJhY2UgZXhjIHJhd19iYWNrdHJhY2Ugd2l0aFxuICAgICB8IF8gLT5cbiAgICAgICAodHJ5XG4gICAgICAgICAgQ2FtbC5QcmludGYuZXByaW50ZiBcIkV4bi5oYW5kbGVfdW5jYXVnaHQgY291bGQgbm90IHByaW50OyBleGl0aW5nIGFueXdheVxcbiUhXCJcbiAgICAgICAgd2l0aFxuICAgICAgICB8IF8gLT4gKCkpKTtcbiAgICBleGl0IDFcbjs7XG5cbmxldCBoYW5kbGVfdW5jYXVnaHRfYW5kX2V4aXQgZiA9IGhhbmRsZV91bmNhdWdodF9hdXggZiB+ZXhpdCB+ZG9fYXRfZXhpdDp0cnVlXG5cbmxldCBoYW5kbGVfdW5jYXVnaHQgfmV4aXQ6bXVzdF9leGl0IGYgPVxuICBoYW5kbGVfdW5jYXVnaHRfYXV4IGYgfmV4aXQ6KGlmIG11c3RfZXhpdCB0aGVuIGV4aXQgZWxzZSBpZ25vcmUpIH5kb19hdF9leGl0Om11c3RfZXhpdFxuOztcblxubGV0IHJlcmFpc2VfdW5jYXVnaHQgc3RyIGZ1bmMgPVxuICB0cnkgZnVuYyAoKSB3aXRoXG4gIHwgZXhuIC0+XG4gICAgbGV0IGJ0ID0gQ2FtbC5QcmludGV4Yy5nZXRfcmF3X2JhY2t0cmFjZSAoKSBpblxuICAgIHJhaXNlX3dpdGhfb3JpZ2luYWxfYmFja3RyYWNlIChSZXJhaXNlZCAoc3RyLCBleG4pKSBidFxuOztcblxuZXh0ZXJuYWwgY2xlYXJfYmFja3RyYWNlIDogdW5pdCAtPiB1bml0ID0gXCJCYXNlX2NsZWFyX2NhbWxfYmFja3RyYWNlX3Bvc1wiIFtAQG5vYWxsb2NdXG5cbmxldCByYWlzZV93aXRob3V0X2JhY2t0cmFjZSBlID1cbiAgKCogV2UgY2xlYXIgdGhlIGJhY2t0cmFjZSB0byByZWR1Y2UgY29uZnVzaW9uLCBzbyB0aGF0IHBlb3BsZSBkb24ndCB0aGluayB3aGF0ZXZlclxuICAgICBpcyBzdG9yZWQgY29ycmVzcG9uZHMgdG8gdGhpcyByYWlzZS4gKilcbiAgY2xlYXJfYmFja3RyYWNlICgpO1xuICBDYW1sLnJhaXNlX25vdHJhY2UgZVxuOztcblxubGV0IGluaXRpYWxpemVfbW9kdWxlICgpID0gc2V0X3VuY2F1Z2h0X2V4Y2VwdGlvbl9oYW5kbGVyICgpXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGxldCBjbGVhcl9iYWNrdHJhY2UgPSBjbGVhcl9iYWNrdHJhY2VcbmVuZFxuIiwiKCogYmVsb25ncyBpbiBDb21tb24sIGJ1dCBtb3ZlZCBoZXJlIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyAqKVxuXG5vcGVuISBJbXBvcnRcblxudHlwZSAnYSByZXR1cm4gPSB7IHJldHVybiA6ICdiLiAnYSAtPiAnYiB9IFtAQHVuYm94ZWRdXG5cbmxldCB3aXRoX3JldHVybiAodHlwZSBhKSBmID1cbiAgbGV0IG1vZHVsZSBNID0gc3RydWN0XG4gICAgKCogUmFpc2VkIHRvIGluZGljYXRlIH5yZXR1cm4gd2FzIGNhbGxlZC4gIExvY2FsIHNvIHRoYXQgdGhlIGV4Y2VwdGlvbiBpcyB0aWVkIHRvIGFcbiAgICAgICBwYXJ0aWN1bGFyIGNhbGwgb2YgW3dpdGhfcmV0dXJuXS4gKilcbiAgICBleGNlcHRpb24gUmV0dXJuIG9mIGFcbiAgZW5kXG4gIGluXG4gIGxldCBpc19hbGl2ZSA9IHJlZiB0cnVlIGluXG4gIGxldCByZXR1cm4gYSA9XG4gICAgaWYgbm90ICFpc19hbGl2ZVxuICAgIHRoZW4gZmFpbHdpdGggXCJ1c2Ugb2YgW3JldHVybl0gZnJvbSBhIFt3aXRoX3JldHVybl0gdGhhdCBhbHJlYWR5IHJldHVybmVkXCI7XG4gICAgRXhuLnJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIChNLlJldHVybiBhKVxuICBpblxuICB0cnlcbiAgICBsZXQgYSA9IGYgeyByZXR1cm4gfSBpblxuICAgIGlzX2FsaXZlIDo9IGZhbHNlO1xuICAgIGFcbiAgd2l0aFxuICB8IGV4biAtPlxuICAgIGlzX2FsaXZlIDo9IGZhbHNlO1xuICAgIChtYXRjaCBleG4gd2l0aFxuICAgICB8IE0uUmV0dXJuIGEgLT4gYVxuICAgICB8IF8gLT4gcmFpc2UgZXhuKVxuOztcblxubGV0IHdpdGhfcmV0dXJuX29wdGlvbiBmID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByZXR1cm4gLT5cbiAgICBmIHsgcmV0dXJuID0gKGZ1biBhIC0+IHJldHVybi5yZXR1cm4gKFNvbWUgYSkpIH07XG4gICAgTm9uZSlcbjs7XG5cbmxldCBwcmVwZW5kIHsgcmV0dXJuIH0gfmYgPSB7IHJldHVybiA9IChmdW4geCAtPiByZXR1cm4gKGYgeCkpIH1cbiIsIm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgdHlwZSBCYXNpYyA9IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgYmluZCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuICB2YWwgcmV0dXJuIDogJ2EgLT4gJ2EgdFxuXG4gICgqKiBUaGUgZm9sbG93aW5nIGlkZW50aXRpZXMgb3VnaHQgdG8gaG9sZCAoZm9yIHNvbWUgdmFsdWUgb2YgPSk6XG5cbiAgICAgIC0gW3JldHVybiB4ID4+PSBmID0gZiB4XVxuICAgICAgLSBbdCA+Pj0gZnVuIHggLT4gcmV0dXJuIHggPSB0XVxuICAgICAgLSBbKHQgPj49IGYpID4+PSBnID0gdCA+Pj0gZnVuIHggLT4gKGYgeCA+Pj0gZyldXG5cbiAgICAgIE5vdGU6IFs+Pj1dIGlzIHRoZSBpbmZpeCBub3RhdGlvbiBmb3IgW2JpbmRdKSAqKVxuXG4gICgqKiBUaGUgW21hcF0gYXJndW1lbnQgdG8gW01vbmFkLk1ha2VdIHNheXMgaG93IHRvIGltcGxlbWVudCB0aGUgbW9uYWQncyBbbWFwXSBmdW5jdGlvbi5cbiAgICAgIFtgRGVmaW5lX3VzaW5nX2JpbmRdIG1lYW5zIHRvIGRlZmluZSBbbWFwIHQgfmYgPSBiaW5kIHQgfmY6KGZ1biBhIC0+IHJldHVybiAoZiBhKSldLlxuICAgICAgW2BDdXN0b21dIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgcHJlc3VtYWJseSB3aXRoIHNvbWV0aGluZyBtb3JlXG4gICAgICBlZmZpY2llbnQuXG5cbiAgICAgIFNvbWUgb3RoZXIgZnVuY3Rpb25zIHJldHVybmVkIGJ5IFtNb25hZC5NYWtlXSBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiBbbWFwXSwgc29cbiAgICAgIHBhc3NpbmcgaW4gYSBtb3JlIGVmZmljaWVudCBbbWFwXSB3aWxsIGltcHJvdmUgdGhlaXIgZWZmaWNpZW5jeSBhcyB3ZWxsLiAqKVxuICB2YWwgbWFwIDogWyBgRGVmaW5lX3VzaW5nX2JpbmQgfCBgQ3VzdG9tIG9mICdhIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICdiIHQgXVxuZW5kXG5cbm1vZHVsZSB0eXBlIEluZml4ID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gICgqKiBbdCA+Pj0gZl0gcmV0dXJucyBhIGNvbXB1dGF0aW9uIHRoYXQgc2VxdWVuY2VzIHRoZSBjb21wdXRhdGlvbnMgcmVwcmVzZW50ZWQgYnkgdHdvXG4gICAgICBtb25hZCBlbGVtZW50cy4gIFRoZSByZXN1bHRpbmcgY29tcHV0YXRpb24gZmlyc3QgZG9lcyBbdF0gdG8geWllbGQgYSB2YWx1ZSBbdl0sIGFuZFxuICAgICAgdGhlbiBydW5zIHRoZSBjb21wdXRhdGlvbiByZXR1cm5lZCBieSBbZiB2XS4gKilcbiAgdmFsICggPj49ICkgOiAnYSB0IC0+ICgnYSAtPiAnYiB0KSAtPiAnYiB0XG5cbiAgKCoqIFt0ID4+fCBmXSBpcyBbdCA+Pj0gKGZ1biBhIC0+IHJldHVybiAoZiBhKSldLiAqKVxuICB2YWwgKCA+PnwgKSA6ICdhIHQgLT4gKCdhIC0+ICdiKSAtPiAnYiB0XG5lbmRcblxubW9kdWxlIHR5cGUgU3ludGF4ID0gc2lnXG4gICgqKiBPcGVuaW5nIGEgbW9kdWxlIG9mIHRoaXMgdHlwZSBhbGxvd3Mgb25lIHRvIHVzZSB0aGUgWyViaW5kXSBhbmQgWyVtYXBdIHN5bnRheFxuICAgICAgZXh0ZW5zaW9ucyBkZWZpbmVkIGJ5IHBweF9sZXQsIGFuZCBicmluZ3MgW3JldHVybl0gaW50byBzY29wZS4gKilcblxuICB0eXBlICdhIHRcblxuICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgICgqKiBUaGVzZSBhcmUgY29udmVuaWVudCB0byBoYXZlIGluIHNjb3BlIHdoZW4gcHJvZ3JhbW1pbmcgd2l0aCBhIG1vbmFkOiAqKVxuXG4gICAgdmFsIHJldHVybiA6ICdhIC0+ICdhIHRcblxuICAgIGluY2x1ZGUgSW5maXggd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICAgIHZhbCByZXR1cm4gOiAnYSAtPiAnYSB0XG4gICAgICB2YWwgYmluZCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuICAgICAgdmFsIG1hcCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICdiIHRcbiAgICAgIHZhbCBib3RoIDogJ2EgdCAtPiAnYiB0IC0+ICgnYSAqICdiKSB0XG5cbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA6IHNpZyBlbmRcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxubW9kdWxlIHR5cGUgU193aXRob3V0X3N5bnRheCA9IHNpZ1xuICB0eXBlICdhIHRcblxuICBpbmNsdWRlIEluZml4IHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgbW9kdWxlIE1vbmFkX2luZml4IDogSW5maXggd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuXG4gICgqKiBbYmluZCB0IH5mXSA9IFt0ID4+PSBmXSAqKVxuICB2YWwgYmluZCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IgdCkgLT4gJ2IgdFxuXG4gICgqKiBbcmV0dXJuIHZdIHJldHVybnMgdGhlICh0cml2aWFsKSBjb21wdXRhdGlvbiB0aGF0IHJldHVybnMgdi4gKilcbiAgdmFsIHJldHVybiA6ICdhIC0+ICdhIHRcblxuICAoKiogW21hcCB0IH5mXSBpcyB0ID4+fCBmLiAqKVxuICB2YWwgbWFwIDogJ2EgdCAtPiBmOignYSAtPiAnYikgLT4gJ2IgdFxuXG4gICgqKiBbam9pbiB0XSBpcyBbdCA+Pj0gKGZ1biB0JyAtPiB0JyldLiAqKVxuICB2YWwgam9pbiA6ICdhIHQgdCAtPiAnYSB0XG5cbiAgKCoqIFtpZ25vcmVfbSB0XSBpcyBbbWFwIHQgfmY6KGZ1biBfIC0+ICgpKV0uICBbaWdub3JlX21dIHVzZWQgdG8gYmUgY2FsbGVkIFtpZ25vcmVdLFxuICAgICAgYnV0IHdlIGRlY2lkZWQgdGhhdCB3YXMgYSBiYWQgbmFtZSwgYmVjYXVzZSBpdCBzaGFkb3dlZCB0aGUgd2lkZWx5IHVzZWRcbiAgICAgIFtDYW1sLmlnbm9yZV0uICBTb21lIG1vbmFkcyBzdGlsbCBkbyBbbGV0IGlnbm9yZSA9IGlnbm9yZV9tXSBmb3IgaGlzdG9yaWNhbFxuICAgICAgcmVhc29ucy4gKilcbiAgdmFsIGlnbm9yZV9tIDogJ2EgdCAtPiB1bml0IHRcblxuICB2YWwgYWxsIDogJ2EgdCBsaXN0IC0+ICdhIGxpc3QgdFxuXG4gICgqKiBMaWtlIFthbGxdLCBidXQgZW5zdXJlcyB0aGF0IGV2ZXJ5IG1vbmFkaWMgdmFsdWUgaW4gdGhlIGxpc3QgcHJvZHVjZXMgYSB1bml0IHZhbHVlLFxuICAgICAgYWxsIG9mIHdoaWNoIGFyZSBkaXNjYXJkZWQgcmF0aGVyIHRoYW4gYmVpbmcgY29sbGVjdGVkIGludG8gYSBsaXN0LiAqKVxuICB2YWwgYWxsX3VuaXQgOiB1bml0IHQgbGlzdCAtPiB1bml0IHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgJ2EgdFxuXG4gIGluY2x1ZGUgU193aXRob3V0X3N5bnRheCB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIGluY2x1ZGUgU3ludGF4IHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBCYXNpYzIgPSBzaWdcbiAgKCoqIE11bHRpIHBhcmFtZXRlciBtb25hZC4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgZ2V0cyB1bmlmaWVkIGFjcm9zcyBhbGwgdGhlIGNvbXB1dGF0aW9uLlxuICAgICAgVGhpcyBpcyB1c2VkIHRvIGVuY29kZSBtb25hZHMgd29ya2luZyBvbiBhIG11bHRpIHBhcmFtZXRlciBkYXRhIHN0cnVjdHVyZSBsaWtlXG4gICAgICAoWygnYSwnYikgcmVzdWx0XSkuICopXG5cbiAgdHlwZSAoJ2EsICdlKSB0XG5cbiAgdmFsIGJpbmQgOiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2UpIHQpIC0+ICgnYiwgJ2UpIHRcbiAgdmFsIG1hcCA6IFsgYERlZmluZV91c2luZ19iaW5kIHwgYEN1c3RvbSBvZiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdlKSB0IF1cbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXykgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEluZml4MiA9IHNpZ1xuICAoKiogU2FtZSBhcyB7IUluZml4fSwgZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0d28gYXJndW1lbnRzLiBUaGUgc2Vjb25kIGlzIGFsd2F5cyBqdXN0XG4gICAgICBwYXNzZWQgdGhyb3VnaC4gKilcblxuICB0eXBlICgnYSwgJ2UpIHRcblxuICB2YWwgKCA+Pj0gKSA6ICgnYSwgJ2UpIHQgLT4gKCdhIC0+ICgnYiwgJ2UpIHQpIC0+ICgnYiwgJ2UpIHRcbiAgdmFsICggPj58ICkgOiAoJ2EsICdlKSB0IC0+ICgnYSAtPiAnYikgLT4gKCdiLCAnZSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFN5bnRheDIgPSBzaWdcbiAgdHlwZSAoJ2EsICdlKSB0XG5cbiAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfKSB0XG5cbiAgICBpbmNsdWRlIEluZml4MiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA6PSAoJ2EsICdlKSB0XG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgICAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXykgdFxuICAgICAgdmFsIGJpbmQgOiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2UpIHQpIC0+ICgnYiwgJ2UpIHRcbiAgICAgIHZhbCBtYXAgOiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdlKSB0XG4gICAgICB2YWwgYm90aCA6ICgnYSwgJ2UpIHQgLT4gKCdiLCAnZSkgdCAtPiAoJ2EgKiAnYiwgJ2UpIHRcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzIDogc2lnIGVuZFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAoKiogVGhlIHNhbWUgYXMgeyFTfSBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHR3byBhcmd1bWVudHMuIFRoZSBzZWNvbmQgaXMgYWx3YXlzIGp1c3RcbiAgICAgIHBhc3NlZCB0aHJvdWdoLiAqKVxuXG4gIHR5cGUgKCdhLCAnZSkgdFxuXG4gIGluY2x1ZGUgSW5maXgyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIHRcbiAgaW5jbHVkZSBTeW50YXgyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIHRcbiAgbW9kdWxlIE1vbmFkX2luZml4IDogSW5maXgyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZSkgdCkgLT4gKCdiLCAnZSkgdFxuICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCBfKSB0XG4gIHZhbCBtYXAgOiAoJ2EsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdlKSB0XG4gIHZhbCBqb2luIDogKCgnYSwgJ2UpIHQsICdlKSB0IC0+ICgnYSwgJ2UpIHRcbiAgdmFsIGlnbm9yZV9tIDogKF8sICdlKSB0IC0+ICh1bml0LCAnZSkgdFxuICB2YWwgYWxsIDogKCdhLCAnZSkgdCBsaXN0IC0+ICgnYSBsaXN0LCAnZSkgdFxuICB2YWwgYWxsX3VuaXQgOiAodW5pdCwgJ2UpIHQgbGlzdCAtPiAodW5pdCwgJ2UpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBCYXNpYzMgPSBzaWdcbiAgKCoqIE11bHRpIHBhcmFtZXRlciBtb25hZC4gVGhlIHNlY29uZCBhbmQgdGhpcmQgcGFyYW1ldGVycyBnZXQgdW5pZmllZCBhY3Jvc3MgYWxsIHRoZVxuICAgICAgY29tcHV0YXRpb24uICopXG5cbiAgdHlwZSAoJ2EsICdkLCAnZSkgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZCwgJ2UpIHQpIC0+ICgnYiwgJ2QsICdlKSB0XG5cbiAgdmFsIG1hcFxuICAgIDogWyBgRGVmaW5lX3VzaW5nX2JpbmQgfCBgQ3VzdG9tIG9mICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdkLCAnZSkgdCBdXG5cbiAgdmFsIHJldHVybiA6ICdhIC0+ICgnYSwgXywgXykgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEluZml4MyA9IHNpZ1xuICAoKiogU2FtZSBhcyBJbmZpeCwgZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0aHJlZSBhcmd1bWVudHMuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIGFyZVxuICAgICAgYWx3YXlzIGp1c3QgcGFzc2VkIHRocm91Z2guICopXG5cbiAgdHlwZSAoJ2EsICdkLCAnZSkgdFxuXG4gIHZhbCAoID4+PSApIDogKCdhLCAnZCwgJ2UpIHQgLT4gKCdhIC0+ICgnYiwgJ2QsICdlKSB0KSAtPiAoJ2IsICdkLCAnZSkgdFxuICB2YWwgKCA+PnwgKSA6ICgnYSwgJ2QsICdlKSB0IC0+ICgnYSAtPiAnYikgLT4gKCdiLCAnZCwgJ2UpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTeW50YXgzID0gc2lnXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHRcblxuICBtb2R1bGUgTGV0X3N5bnRheCA6IHNpZ1xuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8sIF8pIHRcblxuICAgIGluY2x1ZGUgSW5maXgzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgdFxuXG4gICAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8sIF8pIHRcbiAgICAgIHZhbCBiaW5kIDogKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZCwgJ2UpIHQpIC0+ICgnYiwgJ2QsICdlKSB0XG4gICAgICB2YWwgbWFwIDogKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2QsICdlKSB0XG4gICAgICB2YWwgYm90aCA6ICgnYSwgJ2QsICdlKSB0IC0+ICgnYiwgJ2QsICdlKSB0IC0+ICgnYSAqICdiLCAnZCwgJ2UpIHRcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzIDogc2lnIGVuZFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAoKiogVGhlIHNhbWUgYXMgeyFTfSBleGNlcHQgdGhlIG1vbmFkIHR5cGUgaGFzIHRocmVlIGFyZ3VtZW50cy4gVGhlIHNlY29uZFxuICAgICAgYW5kIHRoaXJkIGFyZSBhbHdheXMganVzdCBwYXNzZWQgdGhyb3VnaC4gKilcblxuICB0eXBlICgnYSwgJ2QsICdlKSB0XG5cbiAgaW5jbHVkZSBJbmZpeDMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSB0XG4gIGluY2x1ZGUgU3ludGF4MyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIHRcbiAgbW9kdWxlIE1vbmFkX2luZml4IDogSW5maXgzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gKCdiLCAnZCwgJ2UpIHQpIC0+ICgnYiwgJ2QsICdlKSB0XG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8sIF8pIHRcbiAgdmFsIG1hcCA6ICgnYSwgJ2QsICdlKSB0IC0+IGY6KCdhIC0+ICdiKSAtPiAoJ2IsICdkLCAnZSkgdFxuICB2YWwgam9pbiA6ICgoJ2EsICdkLCAnZSkgdCwgJ2QsICdlKSB0IC0+ICgnYSwgJ2QsICdlKSB0XG4gIHZhbCBpZ25vcmVfbSA6IChfLCAnZCwgJ2UpIHQgLT4gKHVuaXQsICdkLCAnZSkgdFxuICB2YWwgYWxsIDogKCdhLCAnZCwgJ2UpIHQgbGlzdCAtPiAoJ2EgbGlzdCwgJ2QsICdlKSB0XG4gIHZhbCBhbGxfdW5pdCA6ICh1bml0LCAnZCwgJ2UpIHQgbGlzdCAtPiAodW5pdCwgJ2QsICdlKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQmFzaWNfaW5kZXhlZCA9IHNpZ1xuICAoKiogSW5kZXhlZCBtb25hZCwgaW4gdGhlIHN0eWxlIG9mIEF0a2V5LiBUaGUgc2Vjb25kIGFuZCB0aGlyZCBwYXJhbWV0ZXJzIGFyZSBjb21wb3NlZFxuICAgICAgYWNyb3NzIGFsbCBjb21wdXRhdGlvbi4gVG8gc2VlIHRoaXMgbW9yZSBjbGVhcmx5LCB5b3UgY2FuIGxvb2sgYXQgdGhlIHR5cGUgb2YgYmluZDpcblxuICAgICAge1tcbiAgICAgICAgdmFsIGJpbmQgOiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAoJ2IsICdqLCAnaykgdCkgLT4gKCdiLCAnaSwgJ2spIHRcbiAgICAgIF19XG5cbiAgICAgIGFuZCBpc29sYXRlIHNvbWUgb2YgdGhlIHR5cGUgdmFyaWFibGVzIHRvIHNlZSB0aGVpciBpbmRpdmlkdWFsIGJlaGF2aW9yczpcblxuICAgICAge1tcbiAgICAgICAgdmFsIGJpbmQgOiAnYSAgICAgICAgICAgICAtPiBmOignYSAtPiAgJ2IgICAgICAgICAgICkgLT4gICdiXG4gICAgICAgIHZhbCBiaW5kIDogICAgICAnaSwgJ2ogICAgLT4gICAgICAgICAgICAgICAnaiwgJ2sgICAgIC0+ICAgICAnaSwgJ2tcbiAgICAgIF19XG5cbiAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEF0a2V5LXN0eWxlIGluZGV4ZWQgbW9uYWRzLCBzZWU6XG5cbiAgICAgIHt2XG4gICAgICAgIFBhcmFtZXRlcmlzZWQgTm90aW9ucyBvZiBDb21wdXRhdGlvblxuICAgICAgICBSb2JlcnQgQXRrZXlcbiAgICAgICAgaHR0cDovL2JlbnRuaWIub3JnL3BhcmFtbm90aW9ucy1qZnAucGRmXG4gICAgICB2fSAqKVxuXG4gIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICB2YWwgYmluZCA6ICgnYSwgJ2ksICdqKSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrKSB0KSAtPiAoJ2IsICdpLCAnaykgdFxuXG4gIHZhbCBtYXBcbiAgICA6IFsgYERlZmluZV91c2luZ19iaW5kIHwgYEN1c3RvbSBvZiAoJ2EsICdpLCAnaikgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2opIHQgXVxuXG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSkgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIEluZml4X2luZGV4ZWQgPSBzaWdcbiAgKCoqIFNhbWUgYXMgeyFJbmZpeH0sIGV4Y2VwdCB0aGUgbW9uYWQgdHlwZSBoYXMgdGhyZWUgYXJndW1lbnRzLiBUaGUgc2Vjb25kIGFuZFxuICAgICAgdGhpcmQgYXJlIGNvbXBvc2VkIGFjcm9zcyBhbGwgY29tcHV0YXRpb24uICopXG5cbiAgdHlwZSAoJ2EsICdpLCAnaikgdFxuXG4gIHZhbCAoID4+PSApIDogKCdhLCAnaSwgJ2opIHQgLT4gKCdhIC0+ICgnYiwgJ2osICdrKSB0KSAtPiAoJ2IsICdpLCAnaykgdFxuICB2YWwgKCA+PnwgKSA6ICgnYSwgJ2ksICdqKSB0IC0+ICgnYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2opIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTeW50YXhfaW5kZXhlZCA9IHNpZ1xuICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgbW9kdWxlIExldF9zeW50YXggOiBzaWdcbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2kpIHRcblxuICAgIGluY2x1ZGUgSW5maXhfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIHRcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4IDogc2lnXG4gICAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2kpIHRcbiAgICAgIHZhbCBiaW5kIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2spIHQpIC0+ICgnYiwgJ2ksICdrKSB0XG4gICAgICB2YWwgbWFwIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqKSB0XG4gICAgICB2YWwgYm90aCA6ICgnYSwgJ2ksICdqKSB0IC0+ICgnYiwgJ2osICdrKSB0IC0+ICgnYSAqICdiLCAnaSwgJ2spIHRcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzIDogc2lnIGVuZFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTX2luZGV4ZWQgPSBzaWdcbiAgKCoqIFRoZSBzYW1lIGFzIHshU30gZXhjZXB0IHRoZSBtb25hZCB0eXBlIGhhcyB0aHJlZSBhcmd1bWVudHMuIFRoZSBzZWNvbmQgYW5kXG4gICAgICB0aGlyZCBhcmUgY29tcG9zZWQgYWNyb3NzIGFsbCBjb21wdXRhdGlvbi4gKilcblxuICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgaW5jbHVkZSBJbmZpeF9pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgdFxuICBpbmNsdWRlIFN5bnRheF9pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgdFxuICBtb2R1bGUgTW9uYWRfaW5maXggOiBJbmZpeF9pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgdFxuXG4gIHZhbCBiaW5kIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gKCdiLCAnaiwgJ2spIHQpIC0+ICgnYiwgJ2ksICdrKSB0XG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSkgdFxuICB2YWwgbWFwIDogKCdhLCAnaSwgJ2opIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqKSB0XG4gIHZhbCBqb2luIDogKCgnYSwgJ2osICdrKSB0LCAnaSwgJ2opIHQgLT4gKCdhLCAnaSwgJ2spIHRcbiAgdmFsIGlnbm9yZV9tIDogKF8sICdpLCAnaikgdCAtPiAodW5pdCwgJ2ksICdqKSB0XG4gIHZhbCBhbGwgOiAoJ2EsICdpLCAnaSkgdCBsaXN0IC0+ICgnYSBsaXN0LCAnaSwgJ2kpIHRcbiAgdmFsIGFsbF91bml0IDogKHVuaXQsICdpLCAnaSkgdCBsaXN0IC0+ICh1bml0LCAnaSwgJ2kpIHRcbmVuZFxuXG5tb2R1bGUgU190b19TMiAoWCA6IFMpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50XG5lbmRcblxubW9kdWxlIFMyX3RvX1MzIChYIDogUzIpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnRcbmVuZFxuXG5tb2R1bGUgU190b19TX2luZGV4ZWQgKFggOiBTKSA6IFNfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgPSAnYSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdpLCAnaikgdCA9ICdhIFgudFxuZW5kXG5cbm1vZHVsZSBTMl90b19TIChYIDogUzIpIDogUyB3aXRoIHR5cGUgJ2EgdCA9ICgnYSwgdW5pdCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgJ2EgdCA9ICgnYSwgdW5pdCkgWC50XG5lbmRcblxubW9kdWxlIFMzX3RvX1MyIChYIDogUzMpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgPSAoJ2EsICdlLCB1bml0KSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSwgdW5pdCkgWC50XG5lbmRcblxubW9kdWxlIFNfaW5kZXhlZF90b19TMiAoWCA6IFNfaW5kZXhlZCkgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UsICdlKSBYLnQgPVxuc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UsICdlKSBYLnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBNb25hZCA9IHNpZ1xuICAoKiogQSBtb25hZCBpcyBhbiBhYnN0cmFjdGlvbiBvZiB0aGUgY29uY2VwdCBvZiBzZXF1ZW5jaW5nIG9mIGNvbXB1dGF0aW9ucy4gIEEgdmFsdWUgb2ZcbiAgICAgIHR5cGUgWydhIG1vbmFkXSByZXByZXNlbnRzIGEgY29tcHV0YXRpb24gdGhhdCByZXR1cm5zIGEgdmFsdWUgb2YgdHlwZSBbJ2FdLiAqKVxuXG4gIG1vZHVsZSB0eXBlIEJhc2ljID0gQmFzaWNcbiAgbW9kdWxlIHR5cGUgQmFzaWMyID0gQmFzaWMyXG4gIG1vZHVsZSB0eXBlIEJhc2ljMyA9IEJhc2ljM1xuICBtb2R1bGUgdHlwZSBCYXNpY19pbmRleGVkID0gQmFzaWNfaW5kZXhlZFxuICBtb2R1bGUgdHlwZSBJbmZpeCA9IEluZml4XG4gIG1vZHVsZSB0eXBlIEluZml4MiA9IEluZml4MlxuICBtb2R1bGUgdHlwZSBJbmZpeDMgPSBJbmZpeDNcbiAgbW9kdWxlIHR5cGUgSW5maXhfaW5kZXhlZCA9IEluZml4X2luZGV4ZWRcbiAgbW9kdWxlIHR5cGUgU3ludGF4ID0gU3ludGF4XG4gIG1vZHVsZSB0eXBlIFN5bnRheDIgPSBTeW50YXgyXG4gIG1vZHVsZSB0eXBlIFN5bnRheDMgPSBTeW50YXgzXG4gIG1vZHVsZSB0eXBlIFN5bnRheF9pbmRleGVkID0gU3ludGF4X2luZGV4ZWRcbiAgbW9kdWxlIHR5cGUgU193aXRob3V0X3N5bnRheCA9IFNfd2l0aG91dF9zeW50YXhcbiAgbW9kdWxlIHR5cGUgUyA9IFNcbiAgbW9kdWxlIHR5cGUgUzIgPSBTMlxuICBtb2R1bGUgdHlwZSBTMyA9IFMzXG4gIG1vZHVsZSB0eXBlIFNfaW5kZXhlZCA9IFNfaW5kZXhlZFxuXG4gIG1vZHVsZSBNYWtlIChYIDogQmFzaWMpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBYLnRcbiAgbW9kdWxlIE1ha2UyIChYIDogQmFzaWMyKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIFgudFxuICBtb2R1bGUgTWFrZTMgKFggOiBCYXNpYzMpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSBYLnRcblxuICBtb2R1bGUgTWFrZV9pbmRleGVkIChYIDogQmFzaWNfaW5kZXhlZCkgOlxuICAgIFNfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIFgudFxuXG4gICgqKiBEZWZpbmUgYSBtb25hZCB0aHJvdWdoIGFuIGlzb21vcnBoaXNtIHdpdGggYW4gZXhpc3RpbmcgbW9uYWQuIEZvciBleGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlICdhIHQgPSB7IHZhbHVlIDogJ2EgfVxuXG4gICAgICAgIGluY2x1ZGUgTW9uYWQuT2ZfbW9uYWQgKE1vbmFkLklkZW50KSAoc3RydWN0XG4gICAgICAgICAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgICAgICAgICBsZXQgdG9fbW9uYWQgeyB2YWx1ZSB9ID0gdmFsdWVcbiAgICAgICAgICAgIGxldCBvZl9tb25hZCB2YWx1ZSA9IHsgdmFsdWUgfVxuICAgICAgICAgIGVuZClcbiAgICAgIF19ICopXG4gIG1vZHVsZSBPZl9tb25hZFxuICAgICAgKE1vbmFkIDogUykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgIHR5cGUgJ2EgdFxuXG4gICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAnYSB0IC0+ICdhIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICdhIE1vbmFkLnQgLT4gJ2EgdFxuICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIE0udFxuXG4gIG1vZHVsZSBPZl9tb25hZDJcbiAgICAgIChNb25hZCA6IFMyKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnYikgdCAtPiAoJ2EsICdiKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnYikgTW9uYWQudCAtPiAoJ2EsICdiKSB0XG4gICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSBNLnRcblxuICBtb2R1bGUgT2ZfbW9uYWQzXG4gICAgICAoTW9uYWQgOiBTMykgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdiLCAnYykgdCAtPiAoJ2EsICdiLCAnYykgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9tb25hZCA6ICgnYSwgJ2IsICdjKSBNb25hZC50IC0+ICgnYSwgJ2IsICdjKSB0XG4gICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTMyB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIE0udFxuXG4gIG1vZHVsZSBPZl9tb25hZF9pbmRleGVkXG4gICAgICAoTW9uYWQgOiBTX2luZGV4ZWQpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnaSwgJ2opIHRcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdpLCAnaikgdCAtPiAoJ2EsICdpLCAnaikgTW9uYWQudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdpLCAnaikgTW9uYWQudCAtPiAoJ2EsICdpLCAnaikgdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFNfaW5kZXhlZCB3aXRoIHR5cGUgKCdhLCAnaSwgJ2opIHQgOj0gKCdhLCAnaSwgJ2opIE0udFxuXG4gIG1vZHVsZSBJZGVudCA6IFMgd2l0aCB0eXBlICdhIHQgPSAnYVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBMaXN0ID0gTGlzdDBcbmluY2x1ZGUgTW9uYWRfaW50ZlxuXG5tb2R1bGUgdHlwZSBCYXNpY19nZW5lcmFsID0gc2lnXG4gIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuXG4gIHZhbCBiaW5kXG4gICAgOiAgKCdhLCAnaSwgJ2osICdkLCAnZSkgdFxuICAgIC0+IGY6KCdhIC0+ICgnYiwgJ2osICdrLCAnZCwgJ2UpIHQpXG4gICAgLT4gKCdiLCAnaSwgJ2ssICdkLCAnZSkgdFxuXG4gIHZhbCBtYXBcbiAgICA6IFsgYERlZmluZV91c2luZ19iaW5kXG4gICAgICB8IGBDdXN0b20gb2YgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnaSwgJ2osICdkLCAnZSkgdFxuICAgICAgXVxuXG4gIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsICdpLCAnaSwgJ2QsICdlKSB0XG5lbmRcblxubW9kdWxlIE1ha2VfZ2VuZXJhbCAoTSA6IEJhc2ljX2dlbmVyYWwpID0gc3RydWN0XG4gIGxldCBiaW5kID0gTS5iaW5kXG4gIGxldCByZXR1cm4gPSBNLnJldHVyblxuICBsZXQgbWFwX3ZpYV9iaW5kIG1hIH5mID0gTS5iaW5kIG1hIH5mOihmdW4gYSAtPiBNLnJldHVybiAoZiBhKSlcblxuICBsZXQgbWFwID1cbiAgICBtYXRjaCBNLm1hcCB3aXRoXG4gICAgfCBgRGVmaW5lX3VzaW5nX2JpbmQgLT4gbWFwX3ZpYV9iaW5kXG4gICAgfCBgQ3VzdG9tIHggLT4geFxuICA7O1xuXG4gIG1vZHVsZSBNb25hZF9pbmZpeCA9IHN0cnVjdFxuICAgIGxldCAoID4+PSApIHQgZiA9IGJpbmQgdCB+ZlxuICAgIGxldCAoID4+fCApIHQgZiA9IG1hcCB0IH5mXG4gIGVuZFxuXG4gIGluY2x1ZGUgTW9uYWRfaW5maXhcblxuICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cblxuICAgIGluY2x1ZGUgTW9uYWRfaW5maXhcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICBsZXQgYmluZCA9IGJpbmRcbiAgICAgIGxldCBtYXAgPSBtYXBcbiAgICAgIGxldCBib3RoIGEgYiA9IGEgPj49IGZ1biBhIC0+IGIgPj58IGZ1biBiIC0+IGEsIGJcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzID0gc3RydWN0IGVuZFxuICAgIGVuZFxuICBlbmRcblxuICBsZXQgam9pbiB0ID0gdCA+Pj0gZnVuIHQnIC0+IHQnXG4gIGxldCBpZ25vcmVfbSB0ID0gbWFwIHQgfmY6KGZ1biBfIC0+ICgpKVxuXG4gIGxldCBhbGwgPVxuICAgIGxldCByZWMgbG9vcCB2cyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IHJldHVybiAoTGlzdC5yZXYgdnMpXG4gICAgICB8IHQgOjogdHMgLT4gdCA+Pj0gZnVuIHYgLT4gbG9vcCAodiA6OiB2cykgdHNcbiAgICBpblxuICAgIGZ1biB0cyAtPiBsb29wIFtdIHRzXG4gIDs7XG5cbiAgbGV0IHJlYyBhbGxfdW5pdCA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXR1cm4gKClcbiAgICB8IHQgOjogdHMgLT4gdCA+Pj0gZnVuICgpIC0+IGFsbF91bml0IHRzXG4gIDs7XG5lbmRcblxubW9kdWxlIE1ha2VfaW5kZXhlZCAoTSA6IEJhc2ljX2luZGV4ZWQpIDpcbiAgU19pbmRleGVkIHdpdGggdHlwZSAoJ2EsICdpLCAnaikgdCA6PSAoJ2EsICdpLCAnaikgTS50ID0gTWFrZV9nZW5lcmFsIChzdHJ1Y3RcbiAgICBpbmNsdWRlIE1cblxuICAgIHR5cGUgKCdhLCAnaSwgJ2osICdkLCAnZSkgdCA9ICgnYSwgJ2ksICdqKSBNLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZTMgKE0gOiBCYXNpYzMpIDogUzMgd2l0aCB0eXBlICgnYSwgJ2QsICdlKSB0IDo9ICgnYSwgJ2QsICdlKSBNLnQgPVxuICBNYWtlX2dlbmVyYWwgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCwgJ2UpIE0udFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlMiAoTSA6IEJhc2ljMikgOiBTMiB3aXRoIHR5cGUgKCdhLCAnZCkgdCA6PSAoJ2EsICdkKSBNLnQgPSBNYWtlX2dlbmVyYWwgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgTS50XG4gIGVuZClcblxubW9kdWxlIE1ha2UgKE0gOiBCYXNpYykgOiBTIHdpdGggdHlwZSAnYSB0IDo9ICdhIE0udCA9IE1ha2VfZ2VuZXJhbCAoc3RydWN0XG4gICAgaW5jbHVkZSBNXG5cbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAnYSBNLnRcbiAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWRfZ2VuZXJhbCAoTW9uYWQgOiBzaWdcbiAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcblxuICAgIHZhbCBiaW5kXG4gICAgICA6ICAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG4gICAgICAtPiBmOignYSAtPiAoJ2IsICdqLCAnaywgJ2QsICdlKSB0KVxuICAgICAgLT4gKCdiLCAnaSwgJ2ssICdkLCAnZSkgdFxuXG4gICAgdmFsIG1hcCA6ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2ksICdqLCAnZCwgJ2UpIHRcbiAgICB2YWwgcmV0dXJuIDogJ2EgLT4gKCdhLCAnaSwgJ2ksICdkLCAnZSkgdFxuICBlbmQpIChNIDogc2lnXG4gICAgICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0XG5cbiAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0IC0+ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIE1vbmFkLnRcbiAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdpLCAnaiwgJ2QsICdlKSBNb25hZC50IC0+ICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHRcbiAgICAgICAgZW5kKSA9XG4gIE1ha2VfZ2VuZXJhbCAoc3RydWN0XG4gICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnaSwgJ2osICdkLCAnZSkgTS50XG5cbiAgICBsZXQgcmV0dXJuIGEgPSBNLm9mX21vbmFkIChNb25hZC5yZXR1cm4gYSlcbiAgICBsZXQgYmluZCB0IH5mID0gTS5vZl9tb25hZCAoTW9uYWQuYmluZCAoTS50b19tb25hZCB0KSB+ZjooZnVuIGEgLT4gTS50b19tb25hZCAoZiBhKSkpXG4gICAgbGV0IG1hcCA9IGBDdXN0b20gKGZ1biB0IH5mIC0+IE0ub2ZfbW9uYWQgKE1vbmFkLm1hcCAoTS50b19tb25hZCB0KSB+ZikpXG4gIGVuZClcblxubW9kdWxlIE9mX21vbmFkX2luZGV4ZWRcbiAgICAoTW9uYWQgOiBTX2luZGV4ZWQpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2ksICdqKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19tb25hZCA6ICgnYSwgJ2ksICdqKSB0IC0+ICgnYSwgJ2ksICdqKSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgb2ZfbW9uYWQgOiAoJ2EsICdpLCAnaikgTW9uYWQudCAtPiAoJ2EsICdpLCAnaikgdFxuICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCkgPVxuICBPZl9tb25hZF9nZW5lcmFsXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNb25hZFxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdpLCAnaikgTW9uYWQudFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1cblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnaSwgJ2opIE0udFxuICAgIGVuZClcblxubW9kdWxlIE9mX21vbmFkM1xuICAgIChNb25hZCA6IFMzKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnYiwgJ2MpIE1vbmFkLnQgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgICAgICAgICAgICAgIGVuZCkgPVxuICBPZl9tb25hZF9nZW5lcmFsXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNb25hZFxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAoJ2EsICdkLCAnZSkgTW9uYWQudFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1cblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCwgJ2UpIE0udFxuICAgIGVuZClcblxubW9kdWxlIE9mX21vbmFkMlxuICAgIChNb25hZCA6IFMyKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgICAgICAgICAgICAgICAgICB2YWwgdG9fbW9uYWQgOiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIE1vbmFkLnRcbiAgICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogKCdhLCAnYikgTW9uYWQudCAtPiAoJ2EsICdiKSB0XG4gICAgICAgICAgICAgICAgICBlbmQpID1cbiAgT2ZfbW9uYWRfZ2VuZXJhbFxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTW9uYWRcblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgTW9uYWQudFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIE1cblxuICAgICAgdHlwZSAoJ2EsICdpLCAnaiwgJ2QsICdlKSB0ID0gKCdhLCAnZCkgTS50XG4gICAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWRcbiAgICAoTW9uYWQgOiBTKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgIHR5cGUgJ2EgdFxuXG4gICAgICAgICAgICAgICAgICAgdmFsIHRvX21vbmFkIDogJ2EgdCAtPiAnYSBNb25hZC50XG4gICAgICAgICAgICAgICAgICAgdmFsIG9mX21vbmFkIDogJ2EgTW9uYWQudCAtPiAnYSB0XG4gICAgICAgICAgICAgICAgIGVuZCkgPVxuICBPZl9tb25hZF9nZW5lcmFsXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBNb25hZFxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAnYSBNb25hZC50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIGluY2x1ZGUgTVxuXG4gICAgICB0eXBlICgnYSwgJ2ksICdqLCAnZCwgJ2UpIHQgPSAnYSBNLnRcbiAgICBlbmQpXG5cbm1vZHVsZSBJZGVudCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYVxuXG4gIGluY2x1ZGUgTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgICBsZXQgYmluZCBhIH5mID0gZiBhXG4gICAgICBsZXQgcmV0dXJuIGEgPSBhXG4gICAgICBsZXQgbWFwID0gYEN1c3RvbSAoZnVuIGEgfmYgLT4gZiBhKVxuICAgIGVuZClcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEFwcGxpY2F0aXZlX2ludGZcbm1vZHVsZSBMaXN0ID0gTGlzdDBcblxuKCoqIFRoaXMgbW9kdWxlIHNlcnZlcyBtb3N0bHkgYXMgYSBwYXJ0aWFsIGNoZWNrIHRoYXQgW1MyXSBhbmQgW1NdIGFyZSBpbiBzeW5jLCBidXRcbiAgICBhY3R1YWxseSBjYWxsaW5nIGl0IGlzIG9jY2FzaW9uYWxseSB1c2VmdWwuICopXG5tb2R1bGUgU190b19TMiAoWCA6IFMpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50XG5lbmRcblxubW9kdWxlIFMyX3RvX1MgKFggOiBTMikgOiBTIHdpdGggdHlwZSAnYSB0ID0gKCdhLCB1bml0KSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAnYSB0ID0gKCdhLCB1bml0KSBYLnRcbmVuZFxuXG5tb2R1bGUgUzJfdG9fUzMgKFggOiBTMikgOiBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBYXG5cbiAgdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudFxuZW5kXG5cbm1vZHVsZSBTM190b19TMiAoWCA6IFMzKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdkKSB0ID0gKCdhLCAnZCwgdW5pdCkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIHR5cGUgKCdhLCAnZCkgdCA9ICgnYSwgJ2QsIHVuaXQpIFgudFxuZW5kXG5cbm1vZHVsZSBNYWtlMyAoWCA6IEJhc2ljMykgOiBTMyB3aXRoIHR5cGUgKCdhLCAnZCwgJ2UpIHQgOj0gKCdhLCAnZCwgJ2UpIFgudCA9IHN0cnVjdFxuICBpbmNsdWRlIFhcblxuICBsZXQgKCA8Kj4gKSA9IGFwcGx5XG4gIGxldCBkZXJpdmVkX21hcCB0IH5mID0gcmV0dXJuIGYgPCo+IHRcblxuICBsZXQgbWFwID1cbiAgICBtYXRjaCBYLm1hcCB3aXRoXG4gICAgfCBgRGVmaW5lX3VzaW5nX2FwcGx5IC0+IGRlcml2ZWRfbWFwXG4gICAgfCBgQ3VzdG9tIHggLT4geFxuICA7O1xuXG4gIGxldCAoID4+fCApIHQgZiA9IG1hcCB0IH5mXG4gIGxldCBtYXAyIHRhIHRiIH5mID0gbWFwIH5mIHRhIDwqPiB0YlxuICBsZXQgbWFwMyB0YSB0YiB0YyB+ZiA9IG1hcCB+ZiB0YSA8Kj4gdGIgPCo+IHRjXG4gIGxldCBhbGwgdHMgPSBMaXN0LmZvbGRfcmlnaHQgdHMgfmluaXQ6KHJldHVybiBbXSkgfmY6KG1hcDIgfmY6KGZ1biB4IHhzIC0+IHggOjogeHMpKVxuICBsZXQgYm90aCB0YSB0YiA9IG1hcDIgdGEgdGIgfmY6KGZ1biBhIGIgLT4gYSwgYilcbiAgbGV0ICggKj4gKSB1IHYgPSByZXR1cm4gKGZ1biAoKSB5IC0+IHkpIDwqPiB1IDwqPiB2XG4gIGxldCAoIDwqICkgdSB2ID0gcmV0dXJuIChmdW4geCAoKSAtPiB4KSA8Kj4gdSA8Kj4gdlxuICBsZXQgYWxsX3VuaXQgdHMgPSBMaXN0LmZvbGQgdHMgfmluaXQ6KHJldHVybiAoKSkgfmY6KCAqPiApXG5cbiAgbW9kdWxlIEFwcGxpY2F0aXZlX2luZml4ID0gc3RydWN0XG4gICAgbGV0ICggPCo+ICkgPSAoIDwqPiApXG4gICAgbGV0ICggKj4gKSA9ICggKj4gKVxuICAgIGxldCAoIDwqICkgPSAoIDwqIClcbiAgICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgZW5kXG5lbmRcblxubW9kdWxlIE1ha2UyIChYIDogQmFzaWMyKSA6IFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIFgudCA9IE1ha2UzIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFhcblxuICAgIHR5cGUgKCdhLCAnZCwgJ2UpIHQgPSAoJ2EsICdkKSBYLnRcbiAgZW5kKVxuXG5tb2R1bGUgTWFrZSAoWCA6IEJhc2ljKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgWC50ID0gTWFrZTIgKHN0cnVjdFxuICAgIGluY2x1ZGUgWFxuXG4gICAgdHlwZSAoJ2EsICdlKSB0ID0gJ2EgWC50XG4gIGVuZClcblxubW9kdWxlIE1ha2VfbGV0X3N5bnRheDNcbiAgICAoWCA6IEZvcl9sZXRfc3ludGF4MykgKEludGYgOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHR5cGUgU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKVxuICAgIChJbXBsIDogSW50Zi5TKSA9XG5zdHJ1Y3RcbiAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFhcblxuICAgIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgICBpbmNsdWRlIFhcbiAgICAgIG1vZHVsZSBPcGVuX29uX3JocyA9IEltcGxcbiAgICBlbmRcbiAgZW5kXG5lbmRcblxubW9kdWxlIE1ha2VfbGV0X3N5bnRheDJcbiAgICAoWCA6IEZvcl9sZXRfc3ludGF4MikgKEludGYgOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHR5cGUgU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKVxuICAgIChJbXBsIDogSW50Zi5TKSA9XG4gIE1ha2VfbGV0X3N5bnRheDNcbiAgICAoc3RydWN0XG4gICAgICBpbmNsdWRlIFhcblxuICAgICAgdHlwZSAoJ2EsICdkLCBfKSB0ID0gKCdhLCAnZCkgWC50XG4gICAgZW5kKVxuICAgIChJbnRmKVxuICAgIChJbXBsKVxuXG5tb2R1bGUgTWFrZV9sZXRfc3ludGF4XG4gICAgKFggOiBGb3JfbGV0X3N5bnRheCkgKEludGYgOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgdHlwZSBTXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZClcbiAgICAoSW1wbCA6IEludGYuUykgPVxuICBNYWtlX2xldF9zeW50YXgyXG4gICAgKHN0cnVjdFxuICAgICAgaW5jbHVkZSBYXG5cbiAgICAgIHR5cGUgKCdhLCBfKSB0ID0gJ2EgWC50XG4gICAgZW5kKVxuICAgIChJbnRmKVxuICAgIChJbXBsKVxuXG4oKiogVGhpcyBmdW5jdG9yIGNsb3NlbHkgcmVzZW1ibGVzIFtNYWtlM10sIGFuZCBpbmRlZWQgaXQgY291bGQgYmUgaW1wbGVtZW50ZWRcbiAgICBtdWNoIHNob3J0ZXIgaW4gdGVybXMgb2YgW01ha2UzXS4gSG93ZXZlciwgd2UgaW1wbGVtZW50IGl0IGJ5IGhhbmQgc28gdGhhdFxuICAgIHRoZSByZXN1bHRpbmcgZnVuY3Rpb25zIGFyZSBtb3JlIGVmZmljaWVudCwgZS5nLiB1c2luZyBbbWFwMl0gZGlyZWN0bHkgaW5zdGVhZCBvZlxuICAgIGRlZmluaW5nIFthcHBseV0gaW4gdGVybXMgb2YgaXQgYW5kIHRoZW4gW21hcDJdIGluIHRlcm1zIG9mIHRoYXQuIEZvciBtb3N0XG4gICAgYXBwbGljYXRpdmVzIHRoaXMgZG9lcyBub3QgbWF0dGVyLCBidXQgZm9yIHNvbWUgKHN1Y2ggYXMgQm9uc2FpLlZhbHVlLnQpLCBpdCBoYXMgYVxuICAgIGxhcmdlciBpbXBhY3QuICopXG5tb2R1bGUgTWFrZTNfdXNpbmdfbWFwMiAoWCA6IEJhc2ljM191c2luZ19tYXAyKSA6XG4gIFMzIHdpdGggdHlwZSAoJ2EsICdkLCAnZSkgdCA6PSAoJ2EsICdkLCAnZSkgWC50ID0gc3RydWN0XG4gIGluY2x1ZGUgWFxuXG4gIGxldCBhcHBseSB0ZiB0YSA9IG1hcDIgdGYgdGEgfmY6KGZ1biBmIGEgLT4gZiBhKVxuICBsZXQgKCA8Kj4gKSA9IGFwcGx5XG4gIGxldCBkZXJpdmVkX21hcCB0IH5mID0gcmV0dXJuIGYgPCo+IHRcblxuICBsZXQgbWFwID1cbiAgICBtYXRjaCBYLm1hcCB3aXRoXG4gICAgfCBgRGVmaW5lX3VzaW5nX21hcDIgLT4gZGVyaXZlZF9tYXBcbiAgICB8IGBDdXN0b20geCAtPiB4XG4gIDs7XG5cbiAgbGV0ICggPj58ICkgdCBmID0gbWFwIHQgfmZcbiAgbGV0IGJvdGggdGEgdGIgPSBtYXAyIHRhIHRiIH5mOihmdW4gYSBiIC0+IGEsIGIpXG4gIGxldCBtYXAzIHRhIHRiIHRjIH5mID0gbWFwMiAobWFwMiB0YSB0YiB+ZikgdGMgfmY6KGZ1biBmYWIgYyAtPiBmYWIgYylcbiAgbGV0IGFsbCB0cyA9IExpc3QuZm9sZF9yaWdodCB0cyB+aW5pdDoocmV0dXJuIFtdKSB+ZjoobWFwMiB+ZjooZnVuIHggeHMgLT4geCA6OiB4cykpXG4gIGxldCAoICo+ICkgdSB2ID0gbWFwMiB1IHYgfmY6KGZ1biAoKSB5IC0+IHkpXG4gIGxldCAoIDwqICkgdSB2ID0gbWFwMiB1IHYgfmY6KGZ1biB4ICgpIC0+IHgpXG4gIGxldCBhbGxfdW5pdCB0cyA9IExpc3QuZm9sZCB0cyB+aW5pdDoocmV0dXJuICgpKSB+ZjooICo+IClcblxuICBtb2R1bGUgQXBwbGljYXRpdmVfaW5maXggPSBzdHJ1Y3RcbiAgICBsZXQgKCA8Kj4gKSA9ICggPCo+IClcbiAgICBsZXQgKCAqPiApID0gKCAqPiApXG4gICAgbGV0ICggPCogKSA9ICggPCogKVxuICAgIGxldCAoID4+fCApID0gKCA+PnwgKVxuICBlbmRcbmVuZFxuXG5tb2R1bGUgTWFrZTJfdXNpbmdfbWFwMiAoWCA6IEJhc2ljMl91c2luZ19tYXAyKSA6XG4gIFMyIHdpdGggdHlwZSAoJ2EsICdlKSB0IDo9ICgnYSwgJ2UpIFgudCA9IE1ha2UzX3VzaW5nX21hcDIgKHN0cnVjdFxuICAgIGluY2x1ZGUgWFxuXG4gICAgdHlwZSAoJ2EsICdkLCAnZSkgdCA9ICgnYSwgJ2QpIFgudFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlX3VzaW5nX21hcDIgKFggOiBCYXNpY191c2luZ19tYXAyKSA6IFMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgWC50ID1cbiAgTWFrZTJfdXNpbmdfbWFwMiAoc3RydWN0XG4gICAgaW5jbHVkZSBYXG5cbiAgICB0eXBlICgnYSwgJ2UpIHQgPSAnYSBYLnRcbiAgZW5kKVxuXG5tb2R1bGUgT2ZfbW9uYWQyIChNIDogTW9uYWQuUzIpIDogUzIgd2l0aCB0eXBlICgnYSwgJ2UpIHQgOj0gKCdhLCAnZSkgTS50ID0gTWFrZTIgKHN0cnVjdFxuICAgIHR5cGUgKCdhLCAnZSkgdCA9ICgnYSwgJ2UpIE0udFxuXG4gICAgbGV0IHJldHVybiA9IE0ucmV0dXJuXG4gICAgbGV0IGFwcGx5IG1mIG14ID0gTS5iaW5kIG1mIH5mOihmdW4gZiAtPiBNLm1hcCBteCB+ZilcbiAgICBsZXQgbWFwID0gYEN1c3RvbSBNLm1hcFxuICBlbmQpXG5cbm1vZHVsZSBPZl9tb25hZCAoTSA6IE1vbmFkLlMpIDogUyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBNLnQgPSBPZl9tb25hZDIgKHN0cnVjdFxuICAgIGluY2x1ZGUgTVxuXG4gICAgdHlwZSAoJ2EsIF8pIHQgPSAnYSBNLnRcbiAgZW5kKVxuXG5tb2R1bGUgQ29tcG9zZSAoRiA6IFMpIChHIDogUykgOiBTIHdpdGggdHlwZSAnYSB0ID0gJ2EgRi50IEcudCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBGLnQgRy50XG5cbiAgaW5jbHVkZSBNYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICAgIGxldCByZXR1cm4gYSA9IEcucmV0dXJuIChGLnJldHVybiBhKVxuICAgICAgbGV0IGFwcGx5IHRmIHR4ID0gRy5hcHBseSAoRy5tYXAgfmY6Ri5hcHBseSB0ZikgdHhcbiAgICAgIGxldCBjdXN0b21fbWFwIHQgfmYgPSBHLm1hcCB+ZjooRi5tYXAgfmYpIHRcbiAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIGN1c3RvbV9tYXBcbiAgICBlbmQpXG5lbmRcblxubW9kdWxlIFBhaXIgKEYgOiBTKSAoRyA6IFMpIDogUyB3aXRoIHR5cGUgJ2EgdCA9ICdhIEYudCAqICdhIEcudCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBGLnQgKiAnYSBHLnRcblxuICBpbmNsdWRlIE1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgICAgbGV0IHJldHVybiBhID0gRi5yZXR1cm4gYSwgRy5yZXR1cm4gYVxuICAgICAgbGV0IGFwcGx5IHRmIHR4ID0gRi5hcHBseSAoZnN0IHRmKSAoZnN0IHR4KSwgRy5hcHBseSAoc25kIHRmKSAoc25kIHR4KVxuICAgICAgbGV0IGN1c3RvbV9tYXAgdCB+ZiA9IEYubWFwIH5mIChmc3QgdCksIEcubWFwIH5mIChzbmQgdClcbiAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIGN1c3RvbV9tYXBcbiAgICBlbmQpXG5lbmRcbiIsIigqIFtCeXRlczBdIGRlZmluZXMgc3RyaW5nIGZ1bmN0aW9ucyB0aGF0IGFyZSBwcmltaXRpdmVzIG9yIGNhbiBiZSBzaW1wbHlcbiAgIGRlZmluZWQgaW4gdGVybXMgb2YgW0NhbWwuQnl0ZXNdLiBbQnl0ZXMwXSBpcyBpbnRlbmRlZCB0byBjb21wbGV0ZWx5IGV4cHJlc3NcbiAgIHRoZSBwYXJ0IG9mIFtDYW1sLkJ5dGVzXSB0aGF0IFtCYXNlXSB1c2VzIC0tIG5vIG90aGVyIGZpbGUgaW4gQmFzZSBvdGhlclxuICAgdGhhbiBieXRlczAubWwgc2hvdWxkIHVzZSBbQ2FtbC5CeXRlc10uIFtCeXRlczBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmRcbiAgIHNvIGlzIGF2YWlsYWJsZSBlYXJseSBpbiBCYXNlJ3MgYnVpbGQgb3JkZXIuXG5cbiAgIEFsbCBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2Ugc3RyaW5ncyBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuQnl0ZXNdIGluXG4gICBidWlsZCBvcmRlciBzaG91bGQgZG86XG5cbiAgIHtbXG4gICAgIG1vZHVsZSBCeXRlcyAgPSBCeXRlczBcbiAgIF19XG5cbiAgIERlZmluaW5nIFttb2R1bGUgQnl0ZXMgPSBCeXRlczBdIGlzIGFsc28gbmVjZXNzYXJ5IGJlY2F1c2UgaXQgcHJldmVudHNcbiAgIG9jYW1sZGVwIGZyb20gbWlzdGFrZW5seSBjYXVzaW5nIGEgZmlsZSB0byBkZXBlbmQgb24gW0Jhc2UuQnl0ZXNdLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5tb2R1bGUgU3lzID0gU3lzMFxuXG5tb2R1bGUgUHJpbWl0aXZlcyA9IHN0cnVjdFxuICBleHRlcm5hbCBnZXQgOiBieXRlcyAtPiBpbnQgLT4gY2hhciA9IFwiJWJ5dGVzX3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgbGVuZ3RoIDogYnl0ZXMgLT4gaW50ID0gXCIlYnl0ZXNfbGVuZ3RoXCJcbiAgZXh0ZXJuYWwgdW5zYWZlX2dldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyID0gXCIlYnl0ZXNfdW5zYWZlX2dldFwiXG4gIGV4dGVybmFsIHNldCAgICAgICAgOiBieXRlcyAtPiBpbnQgLT4gY2hhciAtPiB1bml0ID0gXCIlYnl0ZXNfc2FmZV9zZXRcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0IDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3Vuc2FmZV9zZXRcIlxuXG4gICgqIFt1bnNhZmVfYmxpdF9zdHJpbmddIGlzIG5vdCBleHBvcnRlZCBpbiB0aGUgW3N0ZGxpYl0gc28gd2UgZXhwb3J0IGl0IGhlcmUgKilcbiAgZXh0ZXJuYWwgdW5zYWZlX2JsaXRfc3RyaW5nXG4gICAgOiAgc3JjOnN0cmluZ1xuICAgIC0+IHNyY19wb3M6aW50XG4gICAgLT4gZHN0OmJ5dGVzXG4gICAgLT4gZHN0X3BvczppbnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gdW5pdFxuICAgID0gXCJjYW1sX2JsaXRfc3RyaW5nXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCB1bnNhZmVfZ2V0X2ludDY0IDogYnl0ZXMgLT4gaW50IC0+IGludDY0ID0gXCIlY2FtbF9ieXRlc19nZXQ2NHVcIlxuICBleHRlcm5hbCB1bnNhZmVfc2V0X2ludDY0IDogYnl0ZXMgLT4gaW50IC0+IGludDY0IC0+IHVuaXQgPSBcIiVjYW1sX2J5dGVzX3NldDY0dVwiXG5lbmRcblxuaW5jbHVkZSBQcmltaXRpdmVzXG5cbmxldCBtYXhfbGVuZ3RoID0gU3lzLm1heF9zdHJpbmdfbGVuZ3RoXG5sZXQgYmxpdCA9IENhbWwuQnl0ZXMuYmxpdFxubGV0IGJsaXRfc3RyaW5nID0gQ2FtbC5CeXRlcy5ibGl0X3N0cmluZ1xubGV0IGNvbXBhcmUgPSBDYW1sLkJ5dGVzLmNvbXBhcmVcbmxldCBjb3B5ID0gQ2FtbC5CeXRlcy5jb3B5XG5sZXQgY3JlYXRlID0gQ2FtbC5CeXRlcy5jcmVhdGVcbmxldCBmaWxsID0gQ2FtbC5CeXRlcy5maWxsXG5sZXQgbWFrZSA9IENhbWwuQnl0ZXMubWFrZVxubGV0IG1hcCA9IENhbWwuQnl0ZXMubWFwXG5sZXQgbWFwaSA9IENhbWwuQnl0ZXMubWFwaVxubGV0IHN1YiA9IENhbWwuQnl0ZXMuc3ViXG5sZXQgdW5zYWZlX2JsaXQgPSBDYW1sLkJ5dGVzLnVuc2FmZV9ibGl0XG5sZXQgdG9fc3RyaW5nID0gQ2FtbC5CeXRlcy50b19zdHJpbmdcbmxldCBvZl9zdHJpbmcgPSBDYW1sLkJ5dGVzLm9mX3N0cmluZ1xubGV0IHVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6cyA9IENhbWwuQnl0ZXMudW5zYWZlX3RvX3N0cmluZyBzXG5sZXQgdW5zYWZlX29mX3N0cmluZ19wcm9taXNlX25vX211dGF0aW9uID0gQ2FtbC5CeXRlcy51bnNhZmVfb2Zfc3RyaW5nXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSAoJ2EsICd3aXRuZXNzKSB0ID1cbiAgeyBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50XG4gIDsgc2V4cF9vZl90IDogJ2EgLT4gU2V4cC50XG4gIH1cblxudHlwZSAoJ2EsICdiKSBjb21wYXJhdG9yID0gKCdhLCAnYikgdFxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgdFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBjb21wYXJhdG9yIDogKHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSB0eXBlIFMxID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBjb21wYXJhdG9yIDogKCdhIHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfZmMgPSBzaWdcbiAgdHlwZSBjb21wYXJhYmxlX3RcblxuICBpbmNsdWRlIFMgd2l0aCB0eXBlIHQgOj0gY29tcGFyYWJsZV90XG5lbmRcblxubW9kdWxlIE1vZHVsZSA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHQgPSAobW9kdWxlIFMgd2l0aCB0eXBlIHQgPSAnYSBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSAnYilcbmVuZFxuXG5sZXQgbWFrZSAodHlwZSB0KSB+Y29tcGFyZSB+c2V4cF9vZl90ID1cbiAgKG1vZHVsZSBzdHJ1Y3RcbiAgICB0eXBlIGNvbXBhcmFibGVfdCA9IHRcbiAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gICAgbGV0IGNvbXBhcmF0b3IgPSB7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGVuZCA6IFNfZmNcbiAgICB3aXRoIHR5cGUgY29tcGFyYWJsZV90ID0gdClcbjs7XG5cbm1vZHVsZSBTX3RvX1MxIChTIDogUykgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gUy50XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gUy5jb21wYXJhdG9yX3dpdG5lc3NcblxuICBvcGVuIFNcblxuICBsZXQgY29tcGFyYXRvciA9IGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgTWFrZSAoTSA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgPVxuc3RydWN0XG4gIGluY2x1ZGUgTVxuXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBNLnsgY29tcGFyZTsgc2V4cF9vZl90IH1cbmVuZFxuXG5tb2R1bGUgTWFrZTEgKE0gOiBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBjb21wYXJlIDogJ2EgdCAtPiAnYSB0IC0+IGludFxuICAgIHZhbCBzZXhwX29mX3QgOiAnYSB0IC0+IFNleHAudFxuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yID0gTS57IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5lbmRcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2FcblxuICBpbmNsdWRlIE1ha2UxIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG5cbiAgICAgIGxldCBjb21wYXJlID0gUG9seS5jb21wYXJlXG4gICAgICBsZXQgc2V4cF9vZl90IF8gPSBTZXhwLkF0b20gXCJfXCJcbiAgICBlbmQpXG5lbmRcblxubW9kdWxlIHR5cGUgRGVyaXZlZCA9IHNpZ1xuICB0eXBlICdhIHRcbiAgdHlwZSAnY21wIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBjb21wYXJhdG9yIDogKCdhLCAnY21wKSBjb21wYXJhdG9yIC0+ICgnYSB0LCAnY21wIGNvbXBhcmF0b3Jfd2l0bmVzcykgY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSBEZXJpdmVkIChNIDogc2lnXG4gICAgdHlwZSAnYSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5cbiAgICB2YWwgc2V4cF9vZl90IDogKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgJ2NtcCBjb21wYXJhdG9yX3dpdG5lc3NcblxuICBsZXQgY29tcGFyYXRvciBhID1cbiAgICB7IGNvbXBhcmUgPSBNLmNvbXBhcmUgYS5jb21wYXJlOyBzZXhwX29mX3QgPSBNLnNleHBfb2ZfdCBhLnNleHBfb2ZfdCB9XG4gIDs7XG5lbmRcblxubW9kdWxlIHR5cGUgRGVyaXZlZDIgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgKCdjbXBfYSwgJ2NtcF9iKSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgY29tcGFyYXRvclxuICAgIDogICgnYSwgJ2NtcF9hKSBjb21wYXJhdG9yXG4gICAgLT4gKCdiLCAnY21wX2IpIGNvbXBhcmF0b3JcbiAgICAtPiAoKCdhLCAnYikgdCwgKCdjbXBfYSwgJ2NtcF9iKSBjb21wYXJhdG9yX3dpdG5lc3MpIGNvbXBhcmF0b3JcbmVuZFxuXG5tb2R1bGUgRGVyaXZlZDIgKE0gOiBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICAgIHZhbCBzZXhwX29mX3RcbiAgICAgIDogICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2IgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdhLCAnYikgdFxuICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpID1cbnN0cnVjdFxuICB0eXBlICgnY21wX2EsICdjbXBfYikgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgbGV0IGNvbXBhcmF0b3IgYSBiID1cbiAgICB7IGNvbXBhcmUgPSBNLmNvbXBhcmUgYS5jb21wYXJlIGIuY29tcGFyZVxuICAgIDsgc2V4cF9vZl90ID0gTS5zZXhwX29mX3QgYS5zZXhwX29mX3QgYi5zZXhwX29mX3RcbiAgICB9XG4gIDs7XG5lbmRcblxubW9kdWxlIHR5cGUgRGVyaXZlZF9waGFudG9tID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICdjbXAgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGNvbXBhcmF0b3JcbiAgICA6ICAoJ2EsICdjbXApIGNvbXBhcmF0b3JcbiAgICAtPiAoKCdhLCBfKSB0LCAnY21wIGNvbXBhcmF0b3Jfd2l0bmVzcykgY29tcGFyYXRvclxuZW5kXG5cbm1vZHVsZSBEZXJpdmVkX3BoYW50b20gKE0gOiBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRcblxuICAgIHZhbCBjb21wYXJlIDogKCdhIC0+ICdhIC0+IGludCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGludFxuICAgIHZhbCBzZXhwX29mX3QgOiAoJ2EgLT4gU2V4cC50KSAtPiAoJ2EsIF8pIHQgLT4gU2V4cC50XG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgJ2NtcF9hIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yIGEgPVxuICAgIHsgY29tcGFyZSA9IE0uY29tcGFyZSBhLmNvbXBhcmU7IHNleHBfb2ZfdCA9IE0uc2V4cF9vZl90IGEuc2V4cF9vZl90IH1cbiAgOztcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgKCdmLCAncykgdCA9XG4gIHwgRmlyc3Qgb2YgJ2ZcbiAgfCBTZWNvbmQgb2YgJ3NcbltAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCBjb21wYXJlIDpcbiAgJ2YgJ3MuICgnZiAtPiAnZiAtPiBpbnQpIC0+ICgncyAtPiAncyAtPiBpbnQpIC0+ICgnZiwgJ3MpIHQgLT4gKCdmLCAncykgdCAtPiBpbnRcbiAgPVxuICBmdW4gX2NtcF9fZiBfY21wX19zIGFfXzAwMV8gYl9fMDAyXyAtPlxuICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDFfIGJfXzAwMl9cbiAgdGhlbiAwXG4gIGVsc2UgKFxuICAgIG1hdGNoIGFfXzAwMV8sIGJfXzAwMl8gd2l0aFxuICAgIHwgRmlyc3QgX2FfXzAwM18sIEZpcnN0IF9iX18wMDRfIC0+IF9jbXBfX2YgX2FfXzAwM18gX2JfXzAwNF9cbiAgICB8IEZpcnN0IF8sIF8gLT4gLTFcbiAgICB8IF8sIEZpcnN0IF8gLT4gMVxuICAgIHwgU2Vjb25kIF9hX18wMDVfLCBTZWNvbmQgX2JfXzAwNl8gLT4gX2NtcF9fcyBfYV9fMDA1XyBfYl9fMDA2Xylcbjs7XG5cbmxldCBoYXNoX2ZvbGRfdFxuICA6IHR5cGUgZiBzLlxuICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gZiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgLT4gKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBzIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAtPiAoZiwgcykgdFxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICA9XG4gIGZ1biBfaGFzaF9mb2xkX2YgX2hhc2hfZm9sZF9zIGhzdiBhcmcgLT5cbiAgbWF0Y2ggYXJnIHdpdGhcbiAgfCBGaXJzdCBfYTAgLT5cbiAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwIGluXG4gICAgbGV0IGhzdiA9IGhzdiBpblxuICAgIF9oYXNoX2ZvbGRfZiBoc3YgX2EwXG4gIHwgU2Vjb25kIF9hMCAtPlxuICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDEgaW5cbiAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgX2hhc2hfZm9sZF9zIGhzdiBfYTBcbjs7XG5cbmxldCB0X29mX3NleHAgOlxuICAnZiAncy5cbiAgKFNleHBsaWIwLlNleHAudCAtPiAnZikgLT4gKFNleHBsaWIwLlNleHAudCAtPiAncykgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICgnZiwgJ3MpIHRcbiAgPVxuICBmdW4gKHR5cGUgZl9fMDIzXyBzX18wMjRfKVxuICAgICAgOiAgKChTZXhwbGliMC5TZXhwLnQgLT4gZl9fMDIzXykgLT4gKFNleHBsaWIwLlNleHAudCAtPiBzX18wMjRfKSAtPiBTZXhwbGliMC5TZXhwLnRcbiAgICAgICAgICAtPiAoZl9fMDIzXywgc19fMDI0XykgdCkgLT5cbiAgICBsZXQgZXJyb3Jfc291cmNlX18wMTFfID0gXCJlaXRoZXIwLm1sLnRcIiBpblxuICAgIGZ1biBfb2ZfZl9fMDA3XyBfb2Zfc19fMDA4XyAtPiBmdW5jdGlvblxuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJmaXJzdFwiIHwgXCJGaXJzdFwiKSBhcyBfdGFnX18wMTRfKSA6OiBzZXhwX2FyZ3NfXzAxNV8pIGFzXG4gICAgICAgIF9zZXhwX18wMTNfIC0+XG4gICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAxNV8gd2l0aFxuICAgICAgICAgfCBbIGFyZzBfXzAxNl8gXSAtPlxuICAgICAgICAgICBsZXQgcmVzMF9fMDE3XyA9IF9vZl9mX18wMDdfIGFyZzBfXzAxNl8gaW5cbiAgICAgICAgICAgRmlyc3QgcmVzMF9fMDE3X1xuICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAxMV9cbiAgICAgICAgICAgICBfdGFnX18wMTRfXG4gICAgICAgICAgICAgX3NleHBfXzAxM18pXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcInNlY29uZFwiIHwgXCJTZWNvbmRcIikgYXMgX3RhZ19fMDE5XykgOjogc2V4cF9hcmdzX18wMjBfKSBhc1xuICAgICAgICBfc2V4cF9fMDE4XyAtPlxuICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMjBfIHdpdGhcbiAgICAgICAgIHwgWyBhcmcwX18wMjFfIF0gLT5cbiAgICAgICAgICAgbGV0IHJlczBfXzAyMl8gPSBfb2Zfc19fMDA4XyBhcmcwX18wMjFfIGluXG4gICAgICAgICAgIFNlY29uZCByZXMwX18wMjJfXG4gICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDExX1xuICAgICAgICAgICAgIF90YWdfXzAxOV9cbiAgICAgICAgICAgICBfc2V4cF9fMDE4XylcbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImZpcnN0XCIgfCBcIkZpcnN0XCIpIGFzIHNleHBfXzAxMl8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAxMV8gc2V4cF9fMDEyX1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwic2Vjb25kXCIgfCBcIlNlY29uZFwiKSBhcyBzZXhwX18wMTJfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMTFfIHNleHBfXzAxMl9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMTBfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAxMV8gc2V4cF9fMDEwX1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDEwXyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAxMV8gc2V4cF9fMDEwX1xuICAgICAgfCBzZXhwX18wMTBfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMTFfIHNleHBfXzAxMF9cbjs7XG5cbmxldCBzZXhwX29mX3QgOlxuICAnZiAncy5cbiAgKCdmIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdzIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdmLCAncykgdCAtPiBTZXhwbGliMC5TZXhwLnRcbiAgPVxuICBmdW4gKHR5cGUgZl9fMDMxXyBzX18wMzJfKVxuICAgICAgOiAgKChmX18wMzFfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKHNfXzAzMl8gLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAgIC0+IChmX18wMzFfLCBzX18wMzJfKSB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICBmdW4gX29mX2ZfXzAyNV8gX29mX3NfXzAyNl8gLT4gZnVuY3Rpb25cbiAgICAgIHwgRmlyc3QgYXJnMF9fMDI3XyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDI4XyA9IF9vZl9mX18wMjVfIGFyZzBfXzAyN18gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiRmlyc3RcIjsgcmVzMF9fMDI4XyBdXG4gICAgICB8IFNlY29uZCBhcmcwX18wMjlfIC0+XG4gICAgICAgIGxldCByZXMwX18wMzBfID0gX29mX3NfXzAyNl8gYXJnMF9fMDI5XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJTZWNvbmRcIjsgcmVzMF9fMDMwXyBdXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAnZiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAtPiAncyBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAtPiAoJ2YsICdzKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA9XG4gIGZ1biBfJ2Zfc2V4cF9ncmFtbWFyIF8nc19zZXhwX2dyYW1tYXIgLT5cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkZpcnN0XCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydmX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDsgTm9fdGFnXG4gICAgICAgICAgICAgICAgeyBuYW1lID0gXCJTZWNvbmRcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ3Nfc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9XG4gIH1cbjs7XG5cbltAQEBlbmRdXG4iLCIoKiBUaGUgdHlwZSBbdF0gc2hvdWxkIGJlIGFic3RyYWN0IHRvIG1ha2UgdGhlIGZzZXQgYW5kIHNldCBmdW5jdGlvbnMgdW5hdmFpbGFibGVcbiAgIGZvciBwcml2YXRlIHR5cGVzIGF0IHRoZSBsZXZlbCBvZiB0eXBlcyAoYW5kIG5vdCBieSBwdXR0aW5nIE5vbmUgaW4gdGhlIGZpZWxkKS5cbiAgIFVuZm9ydHVuYXRlbHksIG1ha2luZyB0aGUgdHlwZSBhYnN0cmFjdCBtZWFucyB0aGF0IHdoZW4gY3JlYXRpbmcgZmllbGRzICh0aHJvdWdoXG4gICBhIFtjcmVhdGVdIGZ1bmN0aW9uKSB2YWx1ZSByZXN0cmljdGlvbiBraWNrcyBpbi4gVGhpcyBpcyB3b3JrZWQgYXJvdW5kIGJ5IGluc3RlYWRcbiAgIG5vdCBtYWtpbmcgdGhlIHR5cGUgYWJzdHJhY3QsIGJ1dCBmb3JjaW5nIGFueW9uZSBicmVha2luZyB0aGUgYWJzdHJhY3Rpb24gdG8gdXNlXG4gICB0aGUgW0Zvcl9nZW5lcmF0ZWRfY29kZV0gbW9kdWxlLCBtYWtpbmcgaXQgb2J2aW91cyB0byBhbnkgcmVhZGVyIHRoYXQgc29tZXRoaW5nIHVnbHlcbiAgIGlzIGdvaW5nIG9uLlxuICAgdF93aXRoX3Blcm0gKGFuZCBkZXJpdmF0aXZlcykgaXMgdGhlIHR5cGUgdGhhdCB1c2VycyByZWFsbHkgdXNlLiBJdCBpcyBhIGNvbnN0cnVjdG9yXG4gICBiZWNhdXNlOlxuICAgMS4gaXQgbWFrZXMgdHlwZSBlcnJvcnMgbW9yZSByZWFkYWJsZSAobGVzcyBhbGlhc2luZylcbiAgIDIuIHRoZSB0eXBlciBpbiBvY2FtbCA0LjAxIGFsbG93cyB0aGlzOlxuXG4gICB7W1xuICAgICBtb2R1bGUgQSA9IHN0cnVjdFxuICAgICAgIHR5cGUgdCA9IHthIDogaW50fVxuICAgICBlbmRcbiAgICAgdHlwZSB0ID0gQS50XG4gICAgIGxldCBmICh4IDogdCkgPSB4LmFcbiAgIF19XG5cbiAgIChhbHRob3VnaCB3aXRoIFdhcm5pbmcgNDA6IGEgaXMgdXNlZCBvdXQgb2Ygc2NvcGUpXG4gICB3aGljaCBtZWFucyB0aGF0IGlmIFt0X3dpdGhfcGVybV0gd2FzIHJlYWxseSBhbiBhbGlhcyBvbiBbRm9yX2dlbmVyYXRlZF9jb2RlLnRdLFxuICAgcGVvcGxlIGNvdWxkIHNheSBbdC5zZXR0ZXJdIGFuZCBicmVhayB0aGUgYWJzdHJhY3Rpb24gd2l0aCBubyBpbmRpY2F0aW9uIHRoYXRcbiAgIHNvbWV0aGluZyB1Z2x5IGlzIGdvaW5nIG9uIGluIHRoZSBzb3VyY2UgY29kZS5cbiAgIFRoZSB3YXJuaW5nIGlzIChJIHRoaW5rKSBmb3IgcGVvcGxlIHdobyB3YW50IHRvIG1ha2UgdGhlaXIgY29kZSBjb21wYXRpYmxlIHdpdGhcbiAgIHByZXZpb3VzIHZlcnNpb25zIG9mIG9jYW1sLCBzbyB3ZSBtYXkgdmVyeSB3ZWxsIHR1cm4gaXQgb2ZmLlxuXG4gICBUaGUgdHlwZSB0X3dpdGhfcGVybSBjb3VsZCBhbHNvIGhhdmUgYmVlbiBhIFt1bml0IC0+IEZvcl9nZW5lcmF0ZWRfY29kZS50XSB0byB3b3JrXG4gICBhcm91bmQgdmFsdWUgcmVzdHJpY3Rpb24gYW5kIHRoZW4gW0Zvcl9nZW5lcmF0ZWRfY29kZS50XSB3b3VsZCBoYXZlIGJlZW4gYSBwcm9wZXJcbiAgIGFic3RyYWN0IHR5cGUsIGJ1dCBpdCBsb29rcyBsaWtlIGl0IGNvdWxkIGltcGFjdCBwZXJmb3JtYW5jZSAoZm9yIGV4YW1wbGUsIGEgZm9sZCBvbiBhXG4gICByZWNvcmQgdHlwZSB3aXRoIDQwIGZpZWxkcyB3b3VsZCBhY3R1YWxseSBhbGxvY2F0ZSB0aGUgNDAgW0Zvcl9nZW5lcmF0ZWRfY29kZS50XSdzIGF0XG4gICBldmVyeSBzaW5nbGUgZm9sZC4pICopXG5cbm1vZHVsZSBGb3JfZ2VuZXJhdGVkX2NvZGUgPSBzdHJ1Y3RcbiAgdHlwZSAoJ3Blcm0sICdyZWNvcmQsICdmaWVsZCkgdCA9XG4gICAgeyBmb3JjZV92YXJpYW5jZSA6ICdwZXJtIC0+IHVuaXRcbiAgICA7ICgqIGZvcmNlIFt0XSB0byBiZSBjb250cmF2YXJpYW50IGluIFsncGVybV0sIGJlY2F1c2UgcGhhbnRvbSB0eXBlIHZhcmlhYmxlcyBvblxuICAgICAgICAgY29uY3JldGUgdHlwZXMgZG9uJ3Qgd29yayB0aGF0IHdlbGwgb3RoZXJ3aXNlICh1c2luZyA6PiBjYW4gcmVtb3ZlIHRoZW0gZWFzaWx5KSAqKVxuICAgICAgbmFtZSA6IHN0cmluZ1xuICAgIDsgc2V0dGVyIDogKCdyZWNvcmQgLT4gJ2ZpZWxkIC0+IHVuaXQpIG9wdGlvblxuICAgIDsgZ2V0dGVyIDogJ3JlY29yZCAtPiAnZmllbGRcbiAgICA7IGZzZXQgOiAncmVjb3JkIC0+ICdmaWVsZCAtPiAncmVjb3JkXG4gICAgfVxuXG4gIGxldCBvcGFxdWVfaWRlbnRpdHkgPSBTeXMwLm9wYXF1ZV9pZGVudGl0eVxuZW5kXG5cbnR5cGUgKCdwZXJtLCAncmVjb3JkLCAnZmllbGQpIHRfd2l0aF9wZXJtID1cbiAgfCBGaWVsZCBvZiAoJ3Blcm0sICdyZWNvcmQsICdmaWVsZCkgRm9yX2dlbmVyYXRlZF9jb2RlLnRcbltAQHVuYm94ZWRdXG5cbnR5cGUgKCdyZWNvcmQsICdmaWVsZCkgdCA9IChbIGBSZWFkIHwgYFNldF9hbmRfY3JlYXRlIF0sICdyZWNvcmQsICdmaWVsZCkgdF93aXRoX3Blcm1cbnR5cGUgKCdyZWNvcmQsICdmaWVsZCkgcmVhZG9ubHlfdCA9IChbIGBSZWFkIF0sICdyZWNvcmQsICdmaWVsZCkgdF93aXRoX3Blcm1cblxubGV0IG5hbWUgKEZpZWxkIGZpZWxkKSA9IGZpZWxkLm5hbWVcbmxldCBnZXQgKEZpZWxkIGZpZWxkKSByID0gZmllbGQuZ2V0dGVyIHJcbmxldCBmc2V0IChGaWVsZCBmaWVsZCkgciB2ID0gZmllbGQuZnNldCByIHZcbmxldCBzZXR0ZXIgKEZpZWxkIGZpZWxkKSA9IGZpZWxkLnNldHRlclxuXG50eXBlICgncGVybSwgJ3JlY29yZCwgJ3Jlc3VsdCkgdXNlciA9XG4gIHsgZiA6ICdmaWVsZC4gKCdwZXJtLCAncmVjb3JkLCAnZmllbGQpIHRfd2l0aF9wZXJtIC0+ICdyZXN1bHQgfVxuXG5sZXQgbWFwIChGaWVsZCBmaWVsZCkgciB+ZiA9IGZpZWxkLmZzZXQgciAoZiAoZmllbGQuZ2V0dGVyIHIpKVxuXG5sZXQgdXBkYXRlciAoRmllbGQgZmllbGQpID1cbiAgbWF0Y2ggZmllbGQuc2V0dGVyIHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIHNldHRlciAtPiBTb21lIChmdW4gciB+ZiAtPiBzZXR0ZXIgciAoZiAoZmllbGQuZ2V0dGVyIHIpKSlcbjs7XG4iLCIoKiBbU3RyaW5nMF0gZGVmaW5lcyBzdHJpbmcgZnVuY3Rpb25zIHRoYXQgYXJlIHByaW1pdGl2ZXMgb3IgY2FuIGJlIHNpbXBseSBkZWZpbmVkIGluXG4gICB0ZXJtcyBvZiBbQ2FtbC5TdHJpbmddLiBbU3RyaW5nMF0gaXMgaW50ZW5kZWQgdG8gY29tcGxldGVseSBleHByZXNzIHRoZSBwYXJ0IG9mXG4gICBbQ2FtbC5TdHJpbmddIHRoYXQgW0Jhc2VdIHVzZXMgLS0gbm8gb3RoZXIgZmlsZSBpbiBCYXNlIG90aGVyIHRoYW4gc3RyaW5nMC5tbCBzaG91bGRcbiAgIHVzZSBbQ2FtbC5TdHJpbmddLiAgW1N0cmluZzBdIGhhcyBmZXcgZGVwZW5kZW5jaWVzLCBhbmQgc28gaXMgYXZhaWxhYmxlIGVhcmx5IGluIEJhc2Unc1xuICAgYnVpbGQgb3JkZXIuXG5cbiAgIEFsbCBCYXNlIGZpbGVzIHRoYXQgbmVlZCB0byB1c2Ugc3RyaW5ncywgaW5jbHVkaW5nIHRoZSBzdWJzY3JpcHQgc3ludGF4XG4gICBbeC4oaSldIG9yIFt4LihpKSA8LSBlXSB3aGljaCB0aGUgT0NhbWwgcGFyc2VyIGRlc3VnYXJzIGludG8gY2FsbHMgdG9cbiAgIFtTdHJpbmddLCBhbmQgY29tZSBiZWZvcmUgW0Jhc2UuU3RyaW5nXSBpbiBidWlsZCBvcmRlciBzaG91bGQgZG9cblxuICAge1tcbiAgICAgbW9kdWxlIFN0cmluZyA9IFN0cmluZzBcbiAgIF19XG5cbiAgIERlZmluaW5nIFttb2R1bGUgU3RyaW5nID0gU3RyaW5nMF0gaXMgYWxzbyBuZWNlc3NhcnkgYmVjYXVzZSBpdCBwcmV2ZW50c1xuICAgb2NhbWxkZXAgZnJvbSBtaXN0YWtlbmx5IGNhdXNpbmcgYSBmaWxlIHRvIGRlcGVuZCBvbiBbQmFzZS5TdHJpbmddLiAqKVxuXG5vcGVuISBJbXBvcnQwXG5tb2R1bGUgQnl0ZXMgPSBCeXRlczBcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbm1vZHVsZSBTdHJpbmcgPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3NhZmVfZ2V0XCJcbiAgZXh0ZXJuYWwgbGVuZ3RoIDogc3RyaW5nIC0+IGludCA9IFwiJXN0cmluZ19sZW5ndGhcIlxuICBleHRlcm5hbCB1bnNhZmVfZ2V0IDogc3RyaW5nIC0+IGludCAtPiBjaGFyID0gXCIlc3RyaW5nX3Vuc2FmZV9nZXRcIlxuICBleHRlcm5hbCBzZXQgICAgICAgIDogYnl0ZXMgLT4gaW50IC0+IGNoYXIgLT4gdW5pdCA9IFwiJWJ5dGVzX3NhZmVfc2V0XCJcbiAgZXh0ZXJuYWwgdW5zYWZlX3NldCA6IGJ5dGVzIC0+IGludCAtPiBjaGFyIC0+IHVuaXQgPSBcIiVieXRlc191bnNhZmVfc2V0XCJcbmVuZFxuXG5pbmNsdWRlIFN0cmluZ1xuXG5sZXQgbWF4X2xlbmd0aCA9IFN5cy5tYXhfc3RyaW5nX2xlbmd0aFxubGV0ICggXiApID0gKCBeIClcbmxldCBjYXBpdGFsaXplID0gQ2FtbC5TdHJpbmcuY2FwaXRhbGl6ZV9hc2NpaVxubGV0IGNvbXBhcmUgPSBDYW1sLlN0cmluZy5jb21wYXJlXG5cbmxldCBjb3B5IHggPVxuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nXG4gICAgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6XG4gICAgICAoQnl0ZXMub2Zfc3RyaW5nIHgpXG47O1xuXG5sZXQgZXNjYXBlZCA9IENhbWwuU3RyaW5nLmVzY2FwZWRcbmxldCBsb3dlcmNhc2UgPSBDYW1sLlN0cmluZy5sb3dlcmNhc2VfYXNjaWlcbmxldCBtYWtlID0gQ2FtbC5TdHJpbmcubWFrZVxubGV0IHN1YiA9IENhbWwuU3RyaW5nLnN1YlxubGV0IHVuY2FwaXRhbGl6ZSA9IENhbWwuU3RyaW5nLnVuY2FwaXRhbGl6ZV9hc2NpaVxubGV0IHVuc2FmZV9ibGl0ID0gQ2FtbC5TdHJpbmcudW5zYWZlX2JsaXRcbmxldCB1cHBlcmNhc2UgPSBDYW1sLlN0cmluZy51cHBlcmNhc2VfYXNjaWlcblxubGV0IGNvbmNhdCA/KHNlcCA9IFwiXCIpIGwgPVxuICBtYXRjaCBsIHdpdGhcbiAgfCBbXSAtPiBcIlwiXG4gICgqIFRoZSBzdGRsaWIgZG9lcyBub3Qgc3BlY2lhbGl6ZSB0aGlzIGNhc2UgYmVjYXVzZSBpdCBjb3VsZCBicmVhayBleGlzdGluZyBwcm9qZWN0cy4gKilcbiAgfCBbIHggXSAtPiB4XG4gIHwgbCAtPiBDYW1sLlN0cmluZy5jb25jYXQgfnNlcCBsXG47O1xuXG4oKiBUaGVzZSBhcmUgZXRhIGV4cGFuZGVkIGluIG9yZGVyIHRvIHBlcm11dGUgcGFyYW1ldGVyIG9yZGVyIHRvIGZvbGxvdyBCYXNlXG4gICBjb252ZW50aW9ucy4gKilcbmxldCBpdGVyIHQgfmYgPSBDYW1sLlN0cmluZy5pdGVyIHQgfmZcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEludCA9IEludDBcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IENhbWwuTGV4aW5nLnBvc2l0aW9uID1cbiAgICB7IHBvc19mbmFtZSA6IHN0cmluZ1xuICAgIDsgcG9zX2xudW0gOiBpbnRcbiAgICA7IHBvc19ib2wgOiBpbnRcbiAgICA7IHBvc19jbnVtIDogaW50XG4gICAgfVxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA9XG4gICAgKGZ1biBhX18wMDFfIGJfXzAwMl8gLT5cbiAgICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDFfIGJfXzAwMl9cbiAgICAgICB0aGVuIDBcbiAgICAgICBlbHNlIChcbiAgICAgICAgIG1hdGNoIGNvbXBhcmVfc3RyaW5nIGFfXzAwMV8ucG9zX2ZuYW1lIGJfXzAwMl8ucG9zX2ZuYW1lIHdpdGhcbiAgICAgICAgIHwgMCAtPlxuICAgICAgICAgICAobWF0Y2ggY29tcGFyZV9pbnQgYV9fMDAxXy5wb3NfbG51bSBiX18wMDJfLnBvc19sbnVtIHdpdGhcbiAgICAgICAgICAgIHwgMCAtPlxuICAgICAgICAgICAgICAobWF0Y2ggY29tcGFyZV9pbnQgYV9fMDAxXy5wb3NfYm9sIGJfXzAwMl8ucG9zX2JvbCB3aXRoXG4gICAgICAgICAgICAgICB8IDAgLT4gY29tcGFyZV9pbnQgYV9fMDAxXy5wb3NfY251bSBiX18wMDJfLnBvc19jbnVtXG4gICAgICAgICAgICAgICB8IG4gLT4gbilcbiAgICAgICAgICAgIHwgbiAtPiBuKVxuICAgICAgICAgfCBuIC0+IG4pXG4gICAgICAgICA6IHQgLT4gdCAtPiBpbnQpXG4gIDs7XG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGZ1biBoc3YgYXJnIC0+XG4gICAgICBsZXQgaHN2ID1cbiAgICAgICAgbGV0IGhzdiA9XG4gICAgICAgICAgbGV0IGhzdiA9XG4gICAgICAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgICAgICBoYXNoX2ZvbGRfc3RyaW5nIGhzdiBhcmcucG9zX2ZuYW1lXG4gICAgICAgICAgaW5cbiAgICAgICAgICBoYXNoX2ZvbGRfaW50IGhzdiBhcmcucG9zX2xudW1cbiAgICAgICAgaW5cbiAgICAgICAgaGFzaF9mb2xkX2ludCBoc3YgYXJnLnBvc19ib2xcbiAgICAgIGluXG4gICAgICBoYXNoX2ZvbGRfaW50IGhzdiBhcmcucG9zX2NudW1cbiAgOztcblxuICBsZXQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgYXJnID1cbiAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICAgIGhhc2hfZm9sZF90IGhzdiBhcmcpXG4gICAgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgc2V4cF9vZl90ID1cbiAgICAoZnVuIHsgcG9zX2ZuYW1lID0gcG9zX2ZuYW1lX18wMDRfXG4gICAgICAgICA7IHBvc19sbnVtID0gcG9zX2xudW1fXzAwNl9cbiAgICAgICAgIDsgcG9zX2JvbCA9IHBvc19ib2xfXzAwOF9cbiAgICAgICAgIDsgcG9zX2NudW0gPSBwb3NfY251bV9fMDEwX1xuICAgICAgICAgfSAtPlxuICAgICAgbGV0IGJuZHNfXzAwM18gPSBbXSBpblxuICAgICAgbGV0IGJuZHNfXzAwM18gPVxuICAgICAgICBsZXQgYXJnX18wMTFfID0gc2V4cF9vZl9pbnQgcG9zX2NudW1fXzAxMF8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwicG9zX2NudW1cIjsgYXJnX18wMTFfIF0gOjogYm5kc19fMDAzX1xuICAgICAgaW5cbiAgICAgIGxldCBibmRzX18wMDNfID1cbiAgICAgICAgbGV0IGFyZ19fMDA5XyA9IHNleHBfb2ZfaW50IHBvc19ib2xfXzAwOF8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwicG9zX2JvbFwiOyBhcmdfXzAwOV8gXSA6OiBibmRzX18wMDNfXG4gICAgICBpblxuICAgICAgbGV0IGJuZHNfXzAwM18gPVxuICAgICAgICBsZXQgYXJnX18wMDdfID0gc2V4cF9vZl9pbnQgcG9zX2xudW1fXzAwNl8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwicG9zX2xudW1cIjsgYXJnX18wMDdfIF0gOjogYm5kc19fMDAzX1xuICAgICAgaW5cbiAgICAgIGxldCBibmRzX18wMDNfID1cbiAgICAgICAgbGV0IGFyZ19fMDA1XyA9IHNleHBfb2Zfc3RyaW5nIHBvc19mbmFtZV9fMDA0XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJwb3NfZm5hbWVcIjsgYXJnX18wMDVfIF0gOjogYm5kc19fMDAzX1xuICAgICAgaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBibmRzX18wMDNfXG4gICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxuKCogVGhpcyBpcyB0aGUgc2FtZSBmdW5jdGlvbiBhcyBQcHhfaGVyZS5saWZ0X3Bvc2l0aW9uX2FzX3N0cmluZy4gKilcbmxldCBtYWtlX2xvY2F0aW9uX3N0cmluZyB+cG9zX2ZuYW1lIH5wb3NfbG51bSB+cG9zX2NudW0gfnBvc19ib2wgPVxuICBTdHJpbmcuY29uY2F0XG4gICAgWyBwb3NfZm5hbWU7IFwiOlwiOyBJbnQudG9fc3RyaW5nIHBvc19sbnVtOyBcIjpcIjsgSW50LnRvX3N0cmluZyAocG9zX2NudW0gLSBwb3NfYm9sKSBdXG47O1xuXG5sZXQgdG9fc3RyaW5nIHsgQ2FtbC5MZXhpbmcucG9zX2ZuYW1lOyBwb3NfbG51bTsgcG9zX2NudW07IHBvc19ib2wgfSA9XG4gIG1ha2VfbG9jYXRpb25fc3RyaW5nIH5wb3NfZm5hbWUgfnBvc19sbnVtIH5wb3NfY251bSB+cG9zX2JvbFxuOztcblxubGV0IHNleHBfb2ZfdCB0ID0gU2V4cC5BdG9tICh0b19zdHJpbmcgdClcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBMaXN0MFxuXG5sZXQgaXNfZW1wdHkgPSBmdW5jdGlvblxuICB8IFtdIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgcGFydGl0aW9uX21hcCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHQgZnN0IHNuZCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiByZXYgZnN0LCByZXYgc25kXG4gICAgfCB4IDo6IHQgLT5cbiAgICAgIChtYXRjaCAoZiB4IDogXyBFaXRoZXIwLnQpIHdpdGhcbiAgICAgICB8IEZpcnN0IHkgLT4gbG9vcCB0ICh5IDo6IGZzdCkgc25kXG4gICAgICAgfCBTZWNvbmQgeSAtPiBsb29wIHQgZnN0ICh5IDo6IHNuZCkpXG4gIGluXG4gIGxvb3AgdCBbXSBbXVxuOztcbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEVpdGhlciA9IEVpdGhlcjBcblxudHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgQ2FtbC5yZXN1bHQgPVxuICB8IE9rIG9mICdhXG4gIHwgRXJyb3Igb2YgJ2JcbltAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXIsIGNvbXBhcmUsIGVxdWFsLCBoYXNoXVxuXG5sZXQgdF9vZl9zZXhwIDpcbiAgJ2EgJ2IuXG4gIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gJ2IpIC0+IFNleHBsaWIwLlNleHAudCAtPiAoJ2EsICdiKSB0XG4gID1cbiAgZnVuICh0eXBlIGFfXzAxN18gYl9fMDE4XylcbiAgICAgIDogICgoU2V4cGxpYjAuU2V4cC50IC0+IGFfXzAxN18pIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gYl9fMDE4XykgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgICAgICAgLT4gKGFfXzAxN18sIGJfXzAxOF8pIHQpIC0+XG4gICAgbGV0IGVycm9yX3NvdXJjZV9fMDA1XyA9IFwicmVzdWx0Lm1sLnRcIiBpblxuICAgIGZ1biBfb2ZfYV9fMDAxXyBfb2ZfYl9fMDAyXyAtPiBmdW5jdGlvblxuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJva1wiIHwgXCJPa1wiKSBhcyBfdGFnX18wMDhfKSA6OiBzZXhwX2FyZ3NfXzAwOV8pIGFzXG4gICAgICAgIF9zZXhwX18wMDdfIC0+XG4gICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAwOV8gd2l0aFxuICAgICAgICAgfCBbIGFyZzBfXzAxMF8gXSAtPlxuICAgICAgICAgICBsZXQgcmVzMF9fMDExXyA9IF9vZl9hX18wMDFfIGFyZzBfXzAxMF8gaW5cbiAgICAgICAgICAgT2sgcmVzMF9fMDExX1xuICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAwNV9cbiAgICAgICAgICAgICBfdGFnX18wMDhfXG4gICAgICAgICAgICAgX3NleHBfXzAwN18pXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImVycm9yXCIgfCBcIkVycm9yXCIpIGFzIF90YWdfXzAxM18pIDo6IHNleHBfYXJnc19fMDE0XykgYXNcbiAgICAgICAgX3NleHBfXzAxMl8gLT5cbiAgICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDE0XyB3aXRoXG4gICAgICAgICB8IFsgYXJnMF9fMDE1XyBdIC0+XG4gICAgICAgICAgIGxldCByZXMwX18wMTZfID0gX29mX2JfXzAwMl8gYXJnMF9fMDE1XyBpblxuICAgICAgICAgICBFcnJvciByZXMwX18wMTZfXG4gICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDA1X1xuICAgICAgICAgICAgIF90YWdfXzAxM19cbiAgICAgICAgICAgICBfc2V4cF9fMDEyXylcbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm9rXCIgfCBcIk9rXCIpIGFzIHNleHBfXzAwNl8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA2X1xuICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiZXJyb3JcIiB8IFwiRXJyb3JcIikgYXMgc2V4cF9fMDA2XyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDZfXG4gICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbiAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNF9cbiAgICAgIHwgc2V4cF9fMDA0XyAtPlxuICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG47O1xuXG5sZXQgc2V4cF9vZl90IDpcbiAgJ2EgJ2IuXG4gICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgnYiAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICgnYSwgJ2IpIHQgLT4gU2V4cGxpYjAuU2V4cC50XG4gID1cbiAgZnVuICh0eXBlIGFfXzAyNV8gYl9fMDI2XylcbiAgICAgIDogICgoYV9fMDI1XyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IChiX18wMjZfIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgICAtPiAoYV9fMDI1XywgYl9fMDI2XykgdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgZnVuIF9vZl9hX18wMTlfIF9vZl9iX18wMjBfIC0+IGZ1bmN0aW9uXG4gICAgICB8IE9rIGFyZzBfXzAyMV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAyMl8gPSBfb2ZfYV9fMDE5XyBhcmcwX18wMjFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIk9rXCI7IHJlczBfXzAyMl8gXVxuICAgICAgfCBFcnJvciBhcmcwX18wMjNfIC0+XG4gICAgICAgIGxldCByZXMwX18wMjRfID0gX29mX2JfXzAyMF8gYXJnMF9fMDIzXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJFcnJvclwiOyByZXMwX18wMjRfIF1cbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOlxuICAgICAgICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgIC0+ICdiIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgIC0+ICgnYSwgJ2IpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgXydiX3NleHBfZ3JhbW1hciAtPlxuICB7IHVudHlwZWQgPVxuICAgICAgVmFyaWFudFxuICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICBbIE5vX3RhZ1xuICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiT2tcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkVycm9yXCJcbiAgICAgICAgICAgICAgICA7IGNsYXVzZV9raW5kID1cbiAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydiX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5sZXQgY29tcGFyZSA6XG4gICdhICdiLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAoJ2IgLT4gJ2IgLT4gaW50KSAtPiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHQgLT4gaW50XG4gID1cbiAgZnVuIF9jbXBfX2EgX2NtcF9fYiBhX18wMjdfIGJfXzAyOF8gLT5cbiAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDI3XyBiX18wMjhfXG4gIHRoZW4gMFxuICBlbHNlIChcbiAgICBtYXRjaCBhX18wMjdfLCBiX18wMjhfIHdpdGhcbiAgICB8IE9rIF9hX18wMjlfLCBPayBfYl9fMDMwXyAtPiBfY21wX19hIF9hX18wMjlfIF9iX18wMzBfXG4gICAgfCBPayBfLCBfIC0+IC0xXG4gICAgfCBfLCBPayBfIC0+IDFcbiAgICB8IEVycm9yIF9hX18wMzFfLCBFcnJvciBfYl9fMDMyXyAtPiBfY21wX19iIF9hX18wMzFfIF9iX18wMzJfKVxuOztcblxubGV0IGVxdWFsIDpcbiAgJ2EgJ2IuICgnYSAtPiAnYSAtPiBib29sKSAtPiAoJ2IgLT4gJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGJvb2xcbiAgPVxuICBmdW4gX2NtcF9fYSBfY21wX19iIGFfXzAzM18gYl9fMDM0XyAtPlxuICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMzNfIGJfXzAzNF9cbiAgdGhlbiB0cnVlXG4gIGVsc2UgKFxuICAgIG1hdGNoIGFfXzAzM18sIGJfXzAzNF8gd2l0aFxuICAgIHwgT2sgX2FfXzAzNV8sIE9rIF9iX18wMzZfIC0+IF9jbXBfX2EgX2FfXzAzNV8gX2JfXzAzNl9cbiAgICB8IE9rIF8sIF8gLT4gZmFsc2VcbiAgICB8IF8sIE9rIF8gLT4gZmFsc2VcbiAgICB8IEVycm9yIF9hX18wMzdfLCBFcnJvciBfYl9fMDM4XyAtPiBfY21wX19iIF9hX18wMzdfIF9iX18wMzhfKVxuOztcblxubGV0IGhhc2hfZm9sZF90XG4gIDogdHlwZSBhIGIuXG4gICAgKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgIC0+IChhLCBiKSB0XG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gID1cbiAgZnVuIF9oYXNoX2ZvbGRfYSBfaGFzaF9mb2xkX2IgaHN2IGFyZyAtPlxuICBtYXRjaCBhcmcgd2l0aFxuICB8IE9rIF9hMCAtPlxuICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDAgaW5cbiAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgX2hhc2hfZm9sZF9hIGhzdiBfYTBcbiAgfCBFcnJvciBfYTAgLT5cbiAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxIGluXG4gICAgbGV0IGhzdiA9IGhzdiBpblxuICAgIF9oYXNoX2ZvbGRfYiBoc3YgX2EwXG47O1xuXG5bQEBAZW5kXVxuXG5pbmNsdWRlIE1vbmFkLk1ha2UyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuXG4gICAgbGV0IGJpbmQgeCB+ZiA9XG4gICAgICBtYXRjaCB4IHdpdGhcbiAgICAgIHwgRXJyb3IgXyBhcyB4IC0+IHhcbiAgICAgIHwgT2sgeCAtPiBmIHhcbiAgICA7O1xuXG4gICAgbGV0IG1hcCB4IH5mID1cbiAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgfCBFcnJvciBfIGFzIHggLT4geFxuICAgICAgfCBPayB4IC0+IE9rIChmIHgpXG4gICAgOztcblxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgIGxldCByZXR1cm4geCA9IE9rIHhcbiAgZW5kKVxuXG5sZXQgaW52YXJpYW50IGNoZWNrX29rIGNoZWNrX2Vycm9yIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBPayBvayAtPiBjaGVja19vayBva1xuICB8IEVycm9yIGVycm9yIC0+IGNoZWNrX2Vycm9yIGVycm9yXG47O1xuXG5sZXQgZmFpbCB4ID0gRXJyb3IgeFxubGV0IGZhaWxmIGZvcm1hdCA9IFByaW50Zi5rc3ByaW50ZiBmYWlsIGZvcm1hdFxuXG5sZXQgbWFwX2Vycm9yIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBPayBfIGFzIHggLT4geFxuICB8IEVycm9yIHggLT4gRXJyb3IgKGYgeClcbjs7XG5cbm1vZHVsZSBFcnJvciA9IE1vbmFkLk1ha2UyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdiLCAnYSkgdFxuXG4gICAgbGV0IGJpbmQgeCB+ZiA9XG4gICAgICBtYXRjaCB4IHdpdGhcbiAgICAgIHwgT2sgXyBhcyBvayAtPiBva1xuICAgICAgfCBFcnJvciBlIC0+IGYgZVxuICAgIDs7XG5cbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBfZXJyb3JcbiAgICBsZXQgcmV0dXJuIGUgPSBFcnJvciBlXG4gIGVuZClcblxubGV0IGlzX29rID0gZnVuY3Rpb25cbiAgfCBPayBfIC0+IHRydWVcbiAgfCBFcnJvciBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfZXJyb3IgPSBmdW5jdGlvblxuICB8IE9rIF8gLT4gZmFsc2VcbiAgfCBFcnJvciBfIC0+IHRydWVcbjs7XG5cbmxldCBvayA9IGZ1bmN0aW9uXG4gIHwgT2sgeCAtPiBTb21lIHhcbiAgfCBFcnJvciBfIC0+IE5vbmVcbjs7XG5cbmxldCBlcnJvciA9IGZ1bmN0aW9uXG4gIHwgT2sgXyAtPiBOb25lXG4gIHwgRXJyb3IgeCAtPiBTb21lIHhcbjs7XG5cbmxldCBvZl9vcHRpb24gb3B0IH5lcnJvciA9XG4gIG1hdGNoIG9wdCB3aXRoXG4gIHwgU29tZSB4IC0+IE9rIHhcbiAgfCBOb25lIC0+IEVycm9yIGVycm9yXG47O1xuXG5sZXQgaXRlciB2IH5mID1cbiAgbWF0Y2ggdiB3aXRoXG4gIHwgT2sgeCAtPiBmIHhcbiAgfCBFcnJvciBfIC0+ICgpXG47O1xuXG5sZXQgaXRlcl9lcnJvciB2IH5mID1cbiAgbWF0Y2ggdiB3aXRoXG4gIHwgT2sgXyAtPiAoKVxuICB8IEVycm9yIHggLT4gZiB4XG47O1xuXG5sZXQgdG9fZWl0aGVyIDogXyB0IC0+IF8gRWl0aGVyLnQgPSBmdW5jdGlvblxuICB8IE9rIHggLT4gRmlyc3QgeFxuICB8IEVycm9yIHggLT4gU2Vjb25kIHhcbjs7XG5cbmxldCBvZl9laXRoZXIgOiBfIEVpdGhlci50IC0+IF8gdCA9IGZ1bmN0aW9uXG4gIHwgRmlyc3QgeCAtPiBPayB4XG4gIHwgU2Vjb25kIHggLT4gRXJyb3IgeFxuOztcblxubGV0IG9rX2lmX3RydWUgYm9vbCB+ZXJyb3IgPSBpZiBib29sIHRoZW4gT2sgKCkgZWxzZSBFcnJvciBlcnJvclxuXG5sZXQgdHJ5X3dpdGggZiA9XG4gIHRyeSBPayAoZiAoKSkgd2l0aFxuICB8IGV4biAtPiBFcnJvciBleG5cbjs7XG5cbmxldCBva19leG4gPSBmdW5jdGlvblxuICB8IE9rIHggLT4geFxuICB8IEVycm9yIGV4biAtPiByYWlzZSBleG5cbjs7XG5cbmxldCBva19vcl9mYWlsd2l0aCA9IGZ1bmN0aW9uXG4gIHwgT2sgeCAtPiB4XG4gIHwgRXJyb3Igc3RyIC0+IGZhaWx3aXRoIHN0clxuOztcblxubW9kdWxlIEV4cG9ydCA9IHN0cnVjdFxuICB0eXBlICgnb2ssICdlcnIpIF9yZXN1bHQgPSAoJ29rLCAnZXJyKSB0ID1cbiAgICB8IE9rIG9mICdva1xuICAgIHwgRXJyb3Igb2YgJ2VyclxuXG4gIGxldCBpc19lcnJvciA9IGlzX2Vycm9yXG4gIGxldCBpc19vayA9IGlzX29rXG5lbmRcblxubGV0IGNvbWJpbmUgdDEgdDIgfm9rIH5lcnIgPVxuICBtYXRjaCB0MSwgdDIgd2l0aFxuICB8IE9rIF8sIEVycm9yIGUgfCBFcnJvciBlLCBPayBfIC0+IEVycm9yIGVcbiAgfCBPayBvazEsIE9rIG9rMiAtPiBPayAob2sgb2sxIG9rMilcbiAgfCBFcnJvciBlcnIxLCBFcnJvciBlcnIyIC0+IEVycm9yIChlcnIgZXJyMSBlcnIyKVxuOztcblxubGV0IGNvbWJpbmVfZXJyb3JzIGwgPVxuICBsZXQgb2ssIGVycnMgPSBMaXN0MS5wYXJ0aXRpb25fbWFwIGwgfmY6dG9fZWl0aGVyIGluXG4gIG1hdGNoIGVycnMgd2l0aFxuICB8IFtdIC0+IE9rIG9rXG4gIHwgXyA6OiBfIC0+IEVycm9yIGVycnNcbjs7XG5cbmxldCBjb21iaW5lX2Vycm9yc191bml0IGwgPSBtYXAgKGNvbWJpbmVfZXJyb3JzIGwpIH5mOihmdW4gKF8gOiB1bml0IGxpc3QpIC0+ICgpKVxuXG4oKiBkZXByZWNhdGVkIGJpbmRpbmcgZm9yIGV4cG9ydCBvbmx5ICopXG5sZXQgb2tfZnN0ID0gdG9fZWl0aGVyXG4iLCIoKiogUHJvdmlkZXMgZ2VuZXJpYyBzaWduYXR1cmVzIGZvciBjb250YWluZXIgZGF0YSBzdHJ1Y3R1cmVzLlxuXG4gICAgVGhlc2Ugc2lnbmF0dXJlcyBpbmNsdWRlIGZ1bmN0aW9ucyAoW2l0ZXJdLCBbZm9sZF0sIFtleGlzdHNdLCBbZm9yX2FsbF0sIC4uLikgdGhhdFxuICAgIHlvdSB3b3VsZCBleHBlY3QgdG8gZmluZCBpbiBhbnkgY29udGFpbmVyLiBVc2VkIGJ5IGluY2x1ZGluZyBbQ29udGFpbmVyLlMwXSBvclxuICAgIFtDb250YWluZXIuUzFdIGluIHRoZSBzaWduYXR1cmUgZm9yIGV2ZXJ5IGNvbnRhaW5lci1saWtlIGRhdGEgc3RydWN0dXJlIChbQXJyYXldLFxuICAgIFtMaXN0XSwgW1N0cmluZ10sIC4uLikgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBpbnRlcmZhY2UuICopXG5cbm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgRXhwb3J0ID0gc3RydWN0XG4gICgqKiBbQ29udGludWVfb3Jfc3RvcC50XSBpcyB1c2VkIGJ5IHRoZSBbZl0gYXJndW1lbnQgdG8gW2ZvbGRfdW50aWxdIGluIG9yZGVyIHRvXG4gICAgICBpbmRpY2F0ZSB3aGV0aGVyIGZvbGRpbmcgc2hvdWxkIGNvbnRpbnVlLCBvciBzdG9wIGVhcmx5LlxuXG4gICAgICBAY2Fub25pY2FsIEJhc2UuQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3BcbiAgKilcbiAgbW9kdWxlIENvbnRpbnVlX29yX3N0b3AgPSBzdHJ1Y3RcbiAgICB0eXBlICgnYSwgJ2IpIHQgPVxuICAgICAgfCBDb250aW51ZSBvZiAnYVxuICAgICAgfCBTdG9wIG9mICdiXG4gIGVuZFxuZW5kXG5cbmluY2x1ZGUgRXhwb3J0XG5cbigqKiBAY2Fub25pY2FsIEJhc2UuQ29udGFpbmVyLlN1bW1hYmxlICopXG5tb2R1bGUgdHlwZSBTdW1tYWJsZSA9IHNpZ1xuICB0eXBlIHRcblxuICAoKiogVGhlIHJlc3VsdCBvZiBzdW1taW5nIG5vIHZhbHVlcy4gKilcbiAgdmFsIHplcm8gOiB0XG5cbiAgKCoqIEFuIG9wZXJhdGlvbiB0aGF0IGNvbWJpbmVzIHR3byBbdF0ncyBhbmQgaGFuZGxlcyBbemVybyArIHhdIGJ5IGp1c3QgcmV0dXJuaW5nIFt4XSxcbiAgICAgIGFzIHdlbGwgYXMgaW4gdGhlIHN5bW1ldHJpYyBjYXNlLiAqKVxuICB2YWwgKCArICkgOiB0IC0+IHQgLT4gdFxuZW5kXG5cbigqKiBTaWduYXR1cmUgZm9yIG1vbm9tb3JwaGljIGNvbnRhaW5lciAtIGEgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIGVsZW1lbnQgdHlwZSwgZS5nLixcbiAgICBzdHJpbmcsIHdoaWNoIGlzIGEgY29udGFpbmVyIG9mIGNoYXJhY3RlcnMgKFt0eXBlIGVsdCA9IGNoYXJdKSBhbmQgbmV2ZXIgb2YgYW55dGhpbmdcbiAgICBlbHNlLiAqKVxubW9kdWxlIHR5cGUgUzAgPSBzaWdcbiAgdHlwZSB0XG4gIHR5cGUgZWx0XG5cbiAgKCoqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIHRoZXJlLCB1c2luZyBlcXVhbGl0eSBvbiBbZWx0XXMuICopXG4gIHZhbCBtZW0gOiB0IC0+IGVsdCAtPiBib29sXG5cbiAgdmFsIGxlbmd0aCA6IHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IHQgLT4gYm9vbFxuXG4gICgqKiBbaXRlcl0gbXVzdCBhbGxvdyBleGNlcHRpb25zIHJhaXNlZCBpbiBbZl0gdG8gZXNjYXBlLCB0ZXJtaW5hdGluZyB0aGUgaXRlcmF0aW9uXG4gICAgICBjbGVhbmx5LiAgVGhlIHNhbWUgaG9sZHMgZm9yIGFsbCBmdW5jdGlvbnMgYmVsb3cgdGFraW5nIGFuIFtmXS4gKilcbiAgdmFsIGl0ZXIgOiB0IC0+IGY6KGVsdCAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIFtmb2xkIHQgfmluaXQgfmZdIHJldHVybnMgW2YgKC4uLiBmIChmIChmIGluaXQgZTEpIGUyKSBlMyAuLi4pIGVuXSwgd2hlcmUgW2UxLi5lbl1cbiAgICAgIGFyZSB0aGUgZWxlbWVudHMgb2YgW3RdLiAqKVxuICB2YWwgZm9sZCA6IHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbZm9sZF9yZXN1bHQgdCB+aW5pdCB+Zl0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdIHRoYXQgcnVucyBpbiB0aGVcbiAgICAgIFtSZXN1bHRdIG1vbmFkLiAgSWYgW2ZdIHJldHVybnMgYW4gW0Vycm9yIF9dLCB0aGF0IHZhbHVlIGlzIHJldHVybmVkIHdpdGhvdXQgYW55XG4gICAgICBhZGRpdGlvbmFsIGludm9jYXRpb25zIG9mIFtmXS4gKilcbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgKCoqIFtmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaF0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdLiBJZiBbZl1cbiAgICAgIHJldHVybnMgW1N0b3AgX10gdGhlIGNvbXB1dGF0aW9uIGNlYXNlcyBhbmQgcmVzdWx0cyBpbiB0aGF0IHZhbHVlLiBJZiBbZl0gcmV0dXJuc1xuICAgICAgW0NvbnRpbnVlIF9dLCB0aGUgZm9sZCB3aWxsIHByb2NlZWQuIElmIFtmXSBuZXZlciByZXR1cm5zIFtTdG9wIF9dLCB0aGUgZmluYWwgcmVzdWx0XG4gICAgICBpcyBjb21wdXRlZCBieSBbZmluaXNoXS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBtYXliZV9uZWdhdGl2ZSA9XG4gICAgICAgICAgfCBGb3VuZF9uZWdhdGl2ZSBvZiBpbnRcbiAgICAgICAgICB8IEFsbF9ub25uZWdhdGl2ZSBvZiB7IHN1bSA6IGludCB9XG5cbiAgICAgICAgKCoqIFtmaXJzdF9uZWdfb3Jfc3VtIGxpc3RdIHJldHVybnMgdGhlIGZpcnN0IG5lZ2F0aXZlIG51bWJlciBpbiBbbGlzdF0sIGlmIGFueSxcbiAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGxpc3QuICopXG4gICAgICAgIGxldCBmaXJzdF9uZWdfb3Jfc3VtID1cbiAgICAgICAgICBMaXN0LmZvbGRfdW50aWwgfmluaXQ6MFxuICAgICAgICAgICAgfmY6KGZ1biBzdW0geCAtPlxuICAgICAgICAgICAgICBpZiB4IDwgMFxuICAgICAgICAgICAgICB0aGVuIFN0b3AgKEZvdW5kX25lZ2F0aXZlIHgpXG4gICAgICAgICAgICAgIGVsc2UgQ29udGludWUgKHN1bSArIHgpKVxuICAgICAgICAgICAgfmZpbmlzaDooZnVuIHN1bSAtPiBBbGxfbm9ubmVnYXRpdmUgeyBzdW0gfSlcbiAgICAgICAgOztcblxuICAgICAgICBsZXQgeCA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IDM7IDQ7IDVdXG4gICAgICAgIHZhbCB4IDogbWF5YmVfbmVnYXRpdmUgPSBBbGxfbm9ubmVnYXRpdmUge3N1bSA9IDE1fVxuXG4gICAgICAgIGxldCB5ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgLTM7IDQ7IDVdXG4gICAgICAgIHZhbCB5IDogbWF5YmVfbmVnYXRpdmUgPSBGb3VuZF9uZWdhdGl2ZSAtM1xuICAgICAgXX0gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gZWx0IC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlcmUgZXhpc3RzIGFuIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm92aWRlZFxuICAgICAgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXS4gVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZXhpc3RzIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXSBmb3IgYWxsXG4gICAgICBlbGVtZW50cy4gVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZm9yX2FsbCA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGJvb2xcblxuICAoKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBjb3VudCA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGludFxuXG4gICgqKiBSZXR1cm5zIHRoZSBzdW0gb2YgW2YgaV0gZm9yIGFsbCBbaV0gaW4gdGhlIGNvbnRhaW5lci4gKilcbiAgdmFsIHN1bSA6IChtb2R1bGUgU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKSAtPiB0IC0+IGY6KGVsdCAtPiAnc3VtKSAtPiAnc3VtXG5cbiAgKCoqIFJldHVybnMgYXMgYW4gW29wdGlvbl0gdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIFtmXSBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGZpbmQgOiB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBlbHQgb3B0aW9uXG5cbiAgKCoqIFJldHVybnMgdGhlIGZpcnN0IGV2YWx1YXRpb24gb2YgW2ZdIHRoYXQgcmV0dXJucyBbU29tZV0sIGFuZCByZXR1cm5zIFtOb25lXSBpZiB0aGVyZVxuICAgICAgaXMgbm8gc3VjaCBlbGVtZW50LiAgKilcbiAgdmFsIGZpbmRfbWFwIDogdCAtPiBmOihlbHQgLT4gJ2Egb3B0aW9uKSAtPiAnYSBvcHRpb25cblxuICB2YWwgdG9fbGlzdCA6IHQgLT4gZWx0IGxpc3RcbiAgdmFsIHRvX2FycmF5IDogdCAtPiBlbHQgYXJyYXlcblxuICAoKiogUmV0dXJucyBhIG1pbiAocmVzcC4gbWF4KSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gdXNpbmcgdGhlIHByb3ZpZGVkIFtjb21wYXJlXVxuICAgICAgZnVuY3Rpb24uIEluIGNhc2Ugb2YgYSB0aWUsIHRoZSBmaXJzdCBlbGVtZW50IGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgdGhlXG4gICAgICBjb2xsZWN0aW9uIGlzIHJldHVybmVkLiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBbZm9sZF0gc28gaXQgaGFzIHRoZSBzYW1lXG4gICAgICBjb21wbGV4aXR5IGFzIFtmb2xkXS4gUmV0dXJucyBbTm9uZV0gaWZmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiAqKVxuICB2YWwgbWluX2VsdCA6IHQgLT4gY29tcGFyZTooZWx0IC0+IGVsdCAtPiBpbnQpIC0+IGVsdCBvcHRpb25cblxuICB2YWwgbWF4X2VsdCA6IHQgLT4gY29tcGFyZTooZWx0IC0+IGVsdCAtPiBpbnQpIC0+IGVsdCBvcHRpb25cbmVuZFxuXG5tb2R1bGUgdHlwZSBTMF9waGFudG9tID0gc2lnXG4gIHR5cGUgZWx0XG4gIHR5cGUgJ2EgdFxuXG4gICgqKiBDaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyB0aGVyZSwgdXNpbmcgZXF1YWxpdHkgb24gW2VsdF1zLiAqKVxuICB2YWwgbWVtIDogXyB0IC0+IGVsdCAtPiBib29sXG5cbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogXyB0IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiBfIHQgLT4gZjooZWx0IC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogW2ZvbGQgdCB+aW5pdCB+Zl0gcmV0dXJucyBbZiAoLi4uIGYgKGYgKGYgaW5pdCBlMSkgZTIpIGUzIC4uLikgZW5dLCB3aGVyZSBbZTEuLmVuXVxuICAgICAgYXJlIHRoZSBlbGVtZW50cyBvZiBbdF0uICopXG4gIHZhbCBmb2xkIDogXyB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2ZvbGRfcmVzdWx0IHQgfmluaXQgfmZdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXSB0aGF0IHJ1bnMgaW4gdGhlXG4gICAgICBbUmVzdWx0XSBtb25hZC4gIElmIFtmXSByZXR1cm5zIGFuIFtFcnJvciBfXSwgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCB3aXRob3V0IGFueVxuICAgICAgYWRkaXRpb25hbCBpbnZvY2F0aW9ucyBvZiBbZl0uICopXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogIF8gdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+IGVsdCAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgKCoqIFtmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaF0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdLiBJZiBbZl1cbiAgICAgIHJldHVybnMgW1N0b3AgX10gdGhlIGNvbXB1dGF0aW9uIGNlYXNlcyBhbmQgcmVzdWx0cyBpbiB0aGF0IHZhbHVlLiBJZiBbZl0gcmV0dXJuc1xuICAgICAgW0NvbnRpbnVlIF9dLCB0aGUgZm9sZCB3aWxsIHByb2NlZWQuIElmIFtmXSBuZXZlciByZXR1cm5zIFtTdG9wIF9dLCB0aGUgZmluYWwgcmVzdWx0XG4gICAgICBpcyBjb21wdXRlZCBieSBbZmluaXNoXS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBtYXliZV9uZWdhdGl2ZSA9XG4gICAgICAgICAgfCBGb3VuZF9uZWdhdGl2ZSBvZiBpbnRcbiAgICAgICAgICB8IEFsbF9ub25uZWdhdGl2ZSBvZiB7IHN1bSA6IGludCB9XG5cbiAgICAgICAgKCoqIFtmaXJzdF9uZWdfb3Jfc3VtIGxpc3RdIHJldHVybnMgdGhlIGZpcnN0IG5lZ2F0aXZlIG51bWJlciBpbiBbbGlzdF0sIGlmIGFueSxcbiAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGxpc3QuICopXG4gICAgICAgIGxldCBmaXJzdF9uZWdfb3Jfc3VtID1cbiAgICAgICAgICBMaXN0LmZvbGRfdW50aWwgfmluaXQ6MFxuICAgICAgICAgICAgfmY6KGZ1biBzdW0geCAtPlxuICAgICAgICAgICAgICBpZiB4IDwgMFxuICAgICAgICAgICAgICB0aGVuIFN0b3AgKEZvdW5kX25lZ2F0aXZlIHgpXG4gICAgICAgICAgICAgIGVsc2UgQ29udGludWUgKHN1bSArIHgpKVxuICAgICAgICAgICAgfmZpbmlzaDooZnVuIHN1bSAtPiBBbGxfbm9ubmVnYXRpdmUgeyBzdW0gfSlcbiAgICAgICAgOztcblxuICAgICAgICBsZXQgeCA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IDM7IDQ7IDVdXG4gICAgICAgIHZhbCB4IDogbWF5YmVfbmVnYXRpdmUgPSBBbGxfbm9ubmVnYXRpdmUge3N1bSA9IDE1fVxuXG4gICAgICAgIGxldCB5ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgLTM7IDQ7IDVdXG4gICAgICAgIHZhbCB5IDogbWF5YmVfbmVnYXRpdmUgPSBGb3VuZF9uZWdhdGl2ZSAtM1xuICAgICAgXX0gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICBfIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiBlbHQgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGVyZSBleGlzdHMgYW4gZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkXG4gICAgICBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZXhpc3RzIDogXyB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdIGZvciBhbGxcbiAgICAgIGVsZW1lbnRzLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZm9yX2FsbCA6IF8gdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGNvdW50IDogXyB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBpbnRcblxuICAoKiogUmV0dXJucyB0aGUgc3VtIG9mIFtmIGldIGZvciBhbGwgW2ldIGluIHRoZSBjb250YWluZXIuIFRoZSBvcmRlciBpbiB3aGljaCB0aGVcbiAgICAgIGVsZW1lbnRzIHdpbGwgYmUgc3VtbWVkIGlzIHVuc3BlY2lmaWVkLiAqKVxuICB2YWwgc3VtIDogKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pIC0+IF8gdCAtPiBmOihlbHQgLT4gJ3N1bSkgLT4gJ3N1bVxuXG4gICgqKiBSZXR1cm5zIGFzIGFuIFtvcHRpb25dIHRoZSBmaXJzdCBlbGVtZW50IGZvciB3aGljaCBbZl0gZXZhbHVhdGVzIHRvIHRydWUuICopXG4gIHZhbCBmaW5kIDogXyB0IC0+IGY6KGVsdCAtPiBib29sKSAtPiBlbHQgb3B0aW9uXG5cbiAgKCoqIFJldHVybnMgdGhlIGZpcnN0IGV2YWx1YXRpb24gb2YgW2ZdIHRoYXQgcmV0dXJucyBbU29tZV0sIGFuZCByZXR1cm5zIFtOb25lXSBpZiB0aGVyZVxuICAgICAgaXMgbm8gc3VjaCBlbGVtZW50LiAgKilcbiAgdmFsIGZpbmRfbWFwIDogXyB0IC0+IGY6KGVsdCAtPiAnYSBvcHRpb24pIC0+ICdhIG9wdGlvblxuXG4gIHZhbCB0b19saXN0IDogXyB0IC0+IGVsdCBsaXN0XG4gIHZhbCB0b19hcnJheSA6IF8gdCAtPiBlbHQgYXJyYXlcblxuICAoKiogUmV0dXJucyBhIG1pbiAocmVzcCBtYXgpIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgW2NvbXBhcmVdXG4gICAgICBmdW5jdGlvbiwgb3IgW05vbmVdIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiAgSW4gY2FzZSBvZiBhIHRpZSwgdGhlIGZpcnN0IGVsZW1lbnRcbiAgICAgIGVuY291bnRlcmVkIHdoaWxlIHRyYXZlcnNpbmcgdGhlIGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQuICopXG4gIHZhbCBtaW5fZWx0IDogXyB0IC0+IGNvbXBhcmU6KGVsdCAtPiBlbHQgLT4gaW50KSAtPiBlbHQgb3B0aW9uXG5cbiAgdmFsIG1heF9lbHQgOiBfIHQgLT4gY29tcGFyZTooZWx0IC0+IGVsdCAtPiBpbnQpIC0+IGVsdCBvcHRpb25cbmVuZFxuXG4oKiogU2lnbmF0dXJlIGZvciBwb2x5bW9ycGhpYyBjb250YWluZXIsIGUuZy4sIFsnYSBsaXN0XSBvciBbJ2EgYXJyYXldLiAqKVxubW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgKCoqIENoZWNrcyB3aGV0aGVyIHRoZSBwcm92aWRlZCBlbGVtZW50IGlzIHRoZXJlLCB1c2luZyBbZXF1YWxdLiAqKVxuICB2YWwgbWVtIDogJ2EgdCAtPiAnYSAtPiBlcXVhbDooJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gIHZhbCBsZW5ndGggOiAnYSB0IC0+IGludFxuICB2YWwgaXNfZW1wdHkgOiAnYSB0IC0+IGJvb2xcbiAgdmFsIGl0ZXIgOiAnYSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogW2ZvbGQgdCB+aW5pdCB+Zl0gcmV0dXJucyBbZiAoLi4uIGYgKGYgKGYgaW5pdCBlMSkgZTIpIGUzIC4uLikgZW5dLCB3aGVyZSBbZTEuLmVuXVxuICAgICAgYXJlIHRoZSBlbGVtZW50cyBvZiBbdF0gICopXG4gIHZhbCBmb2xkIDogJ2EgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2ZvbGRfcmVzdWx0IHQgfmluaXQgfmZdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXSB0aGF0IHJ1bnMgaW4gdGhlXG4gICAgICBbUmVzdWx0XSBtb25hZC4gIElmIFtmXSByZXR1cm5zIGFuIFtFcnJvciBfXSwgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCB3aXRob3V0IGFueVxuICAgICAgYWRkaXRpb25hbCBpbnZvY2F0aW9ucyBvZiBbZl0uICopXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50XG5cbiAgKCoqIFtmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaF0gaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHZlcnNpb24gb2YgW2ZvbGRdLiBJZiBbZl1cbiAgICAgIHJldHVybnMgW1N0b3AgX10gdGhlIGNvbXB1dGF0aW9uIGNlYXNlcyBhbmQgcmVzdWx0cyBpbiB0aGF0IHZhbHVlLiBJZiBbZl0gcmV0dXJuc1xuICAgICAgW0NvbnRpbnVlIF9dLCB0aGUgZm9sZCB3aWxsIHByb2NlZWQuIElmIFtmXSBuZXZlciByZXR1cm5zIFtTdG9wIF9dLCB0aGUgZmluYWwgcmVzdWx0XG4gICAgICBpcyBjb21wdXRlZCBieSBbZmluaXNoXS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBtYXliZV9uZWdhdGl2ZSA9XG4gICAgICAgICAgfCBGb3VuZF9uZWdhdGl2ZSBvZiBpbnRcbiAgICAgICAgICB8IEFsbF9ub25uZWdhdGl2ZSBvZiB7IHN1bSA6IGludCB9XG5cbiAgICAgICAgKCoqIFtmaXJzdF9uZWdfb3Jfc3VtIGxpc3RdIHJldHVybnMgdGhlIGZpcnN0IG5lZ2F0aXZlIG51bWJlciBpbiBbbGlzdF0sIGlmIGFueSxcbiAgICAgICAgICAgIG90aGVyd2lzZSByZXR1cm5zIHRoZSBzdW0gb2YgdGhlIGxpc3QuICopXG4gICAgICAgIGxldCBmaXJzdF9uZWdfb3Jfc3VtID1cbiAgICAgICAgICBMaXN0LmZvbGRfdW50aWwgfmluaXQ6MFxuICAgICAgICAgICAgfmY6KGZ1biBzdW0geCAtPlxuICAgICAgICAgICAgICBpZiB4IDwgMFxuICAgICAgICAgICAgICB0aGVuIFN0b3AgKEZvdW5kX25lZ2F0aXZlIHgpXG4gICAgICAgICAgICAgIGVsc2UgQ29udGludWUgKHN1bSArIHgpKVxuICAgICAgICAgICAgfmZpbmlzaDooZnVuIHN1bSAtPiBBbGxfbm9ubmVnYXRpdmUgeyBzdW0gfSlcbiAgICAgICAgOztcblxuICAgICAgICBsZXQgeCA9IGZpcnN0X25lZ19vcl9zdW0gWzE7IDI7IDM7IDQ7IDVdXG4gICAgICAgIHZhbCB4IDogbWF5YmVfbmVnYXRpdmUgPSBBbGxfbm9ubmVnYXRpdmUge3N1bSA9IDE1fVxuXG4gICAgICAgIGxldCB5ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgLTM7IDQ7IDVdXG4gICAgICAgIHZhbCB5IDogbWF5YmVfbmVnYXRpdmUgPSBGb3VuZF9uZWdhdGl2ZSAtM1xuICAgICAgXX0gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2ZpbmFsKSBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gICgqKiBSZXR1cm5zIFt0cnVlXSBpZiBhbmQgb25seSBpZiB0aGVyZSBleGlzdHMgYW4gZWxlbWVudCBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkXG4gICAgICBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZXhpc3RzIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdIGZvciBhbGxcbiAgICAgIGVsZW1lbnRzLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZm9yX2FsbCA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZm9yIHdoaWNoIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGNvdW50IDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBpbnRcblxuICAoKiogUmV0dXJucyB0aGUgc3VtIG9mIFtmIGldIGZvciBhbGwgW2ldIGluIHRoZSBjb250YWluZXIuICopXG4gIHZhbCBzdW0gOiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSkgLT4gJ2EgdCAtPiBmOignYSAtPiAnc3VtKSAtPiAnc3VtXG5cbiAgKCoqIFJldHVybnMgYXMgYW4gW29wdGlvbl0gdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIFtmXSBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIG9wdGlvblxuXG4gICgqKiBSZXR1cm5zIHRoZSBmaXJzdCBldmFsdWF0aW9uIG9mIFtmXSB0aGF0IHJldHVybnMgW1NvbWVdLCBhbmQgcmV0dXJucyBbTm9uZV0gaWYgdGhlcmVcbiAgICAgIGlzIG5vIHN1Y2ggZWxlbWVudC4gICopXG4gIHZhbCBmaW5kX21hcCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiBvcHRpb25cblxuICB2YWwgdG9fbGlzdCA6ICdhIHQgLT4gJ2EgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiAnYSB0IC0+ICdhIGFycmF5XG5cbiAgKCoqIFJldHVybnMgYSBtaW5pbXVtIChyZXNwIG1heGltdW0pIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWRcbiAgICAgIFtjb21wYXJlXSBmdW5jdGlvbiwgb3IgW05vbmVdIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiBJbiBjYXNlIG9mIGEgdGllLCB0aGUgZmlyc3RcbiAgICAgIGVsZW1lbnQgZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGUgY29sbGVjdGlvbiBpcyByZXR1cm5lZC4gVGhlIGltcGxlbWVudGF0aW9uXG4gICAgICB1c2VzIFtmb2xkXSBzbyBpdCBoYXMgdGhlIHNhbWUgY29tcGxleGl0eSBhcyBbZm9sZF0uICopXG4gIHZhbCBtaW5fZWx0IDogJ2EgdCAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0IDogJ2EgdCAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpIC0+ICdhIG9wdGlvblxuZW5kXG5cbm1vZHVsZSB0eXBlIFMxX3BoYW50b21faW52YXJpYW50ID0gc2lnXG4gIHR5cGUgKCdhLCAncGhhbnRvbSkgdFxuXG4gICgqKiBDaGVja3Mgd2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBpcyB0aGVyZSwgdXNpbmcgW2VxdWFsXS4gKilcbiAgdmFsIG1lbSA6ICgnYSwgXykgdCAtPiAnYSAtPiBlcXVhbDooJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gIHZhbCBsZW5ndGggOiAoXywgXykgdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgaXRlciA6ICgnYSwgXykgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIFtmb2xkIHQgfmluaXQgfmZdIHJldHVybnMgW2YgKC4uLiBmIChmIChmIGluaXQgZTEpIGUyKSBlMyAuLi4pIGVuXSwgd2hlcmUgW2UxLi5lbl1cbiAgICAgIGFyZSB0aGUgZWxlbWVudHMgb2YgW3RdLiAqKVxuICB2YWwgZm9sZCA6ICgnYSwgXykgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2ZvbGRfcmVzdWx0IHQgfmluaXQgfmZdIGlzIGEgc2hvcnQtY2lyY3VpdGluZyB2ZXJzaW9uIG9mIFtmb2xkXSB0aGF0IHJ1bnMgaW4gdGhlXG4gICAgICBbUmVzdWx0XSBtb25hZC4gIElmIFtmXSByZXR1cm5zIGFuIFtFcnJvciBfXSwgdGhhdCB2YWx1ZSBpcyByZXR1cm5lZCB3aXRob3V0IGFueVxuICAgICAgYWRkaXRpb25hbCBpbnZvY2F0aW9ucyBvZiBbZl0uICopXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICAoKiogW2ZvbGRfdW50aWwgdCB+aW5pdCB+ZiB+ZmluaXNoXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0uIElmIFtmXVxuICAgICAgcmV0dXJucyBbU3RvcCBfXSB0aGUgY29tcHV0YXRpb24gY2Vhc2VzIGFuZCByZXN1bHRzIGluIHRoYXQgdmFsdWUuIElmIFtmXSByZXR1cm5zXG4gICAgICBbQ29udGludWUgX10sIHRoZSBmb2xkIHdpbGwgcHJvY2VlZC4gSWYgW2ZdIG5ldmVyIHJldHVybnMgW1N0b3AgX10sIHRoZSBmaW5hbCByZXN1bHRcbiAgICAgIGlzIGNvbXB1dGVkIGJ5IFtmaW5pc2hdLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIG1heWJlX25lZ2F0aXZlID1cbiAgICAgICAgICB8IEZvdW5kX25lZ2F0aXZlIG9mIGludFxuICAgICAgICAgIHwgQWxsX25vbm5lZ2F0aXZlIG9mIHsgc3VtIDogaW50IH1cblxuICAgICAgICAoKiogW2ZpcnN0X25lZ19vcl9zdW0gbGlzdF0gcmV0dXJucyB0aGUgZmlyc3QgbmVnYXRpdmUgbnVtYmVyIGluIFtsaXN0XSwgaWYgYW55LFxuICAgICAgICAgICAgb3RoZXJ3aXNlIHJldHVybnMgdGhlIHN1bSBvZiB0aGUgbGlzdC4gKilcbiAgICAgICAgbGV0IGZpcnN0X25lZ19vcl9zdW0gPVxuICAgICAgICAgIExpc3QuZm9sZF91bnRpbCB+aW5pdDowXG4gICAgICAgICAgICB+ZjooZnVuIHN1bSB4IC0+XG4gICAgICAgICAgICAgIGlmIHggPCAwXG4gICAgICAgICAgICAgIHRoZW4gU3RvcCAoRm91bmRfbmVnYXRpdmUgeClcbiAgICAgICAgICAgICAgZWxzZSBDb250aW51ZSAoc3VtICsgeCkpXG4gICAgICAgICAgICB+ZmluaXNoOihmdW4gc3VtIC0+IEFsbF9ub25uZWdhdGl2ZSB7IHN1bSB9KVxuICAgICAgICA7O1xuXG4gICAgICAgIGxldCB4ID0gZmlyc3RfbmVnX29yX3N1bSBbMTsgMjsgMzsgNDsgNV1cbiAgICAgICAgdmFsIHggOiBtYXliZV9uZWdhdGl2ZSA9IEFsbF9ub25uZWdhdGl2ZSB7c3VtID0gMTV9XG5cbiAgICAgICAgbGV0IHkgPSBmaXJzdF9uZWdfb3Jfc3VtIFsxOyAyOyAtMzsgNDsgNV1cbiAgICAgICAgdmFsIHkgOiBtYXliZV9uZWdhdGl2ZSA9IEZvdW5kX25lZ2F0aXZlIC0zXG4gICAgICBdfSAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIC0+ICgnYWNjdW0sICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2FjY3VtIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICAoKiogUmV0dXJucyBbdHJ1ZV0gaWYgYW5kIG9ubHkgaWYgdGhlcmUgZXhpc3RzIGFuIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSBwcm92aWRlZFxuICAgICAgZnVuY3Rpb24gZXZhbHVhdGVzIHRvIFt0cnVlXS4gIFRoaXMgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIG9wZXJhdGlvbi4gKilcbiAgdmFsIGV4aXN0cyA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgW3RydWVdIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBldmFsdWF0ZXMgdG8gW3RydWVdIGZvciBhbGxcbiAgICAgIGVsZW1lbnRzLiAgVGhpcyBpcyBhIHNob3J0LWNpcmN1aXRpbmcgb3BlcmF0aW9uLiAqKVxuICB2YWwgZm9yX2FsbCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3Igd2hpY2ggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGV2YWx1YXRlcyB0byB0cnVlLiAqKVxuICB2YWwgY291bnQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gaW50XG5cbiAgKCoqIFJldHVybnMgdGhlIHN1bSBvZiBbZiBpXSBmb3IgYWxsIFtpXSBpbiB0aGUgY29udGFpbmVyLiAqKVxuICB2YWwgc3VtIDogKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pIC0+ICgnYSwgXykgdCAtPiBmOignYSAtPiAnc3VtKSAtPiAnc3VtXG5cbiAgKCoqIFJldHVybnMgYXMgYW4gW29wdGlvbl0gdGhlIGZpcnN0IGVsZW1lbnQgZm9yIHdoaWNoIFtmXSBldmFsdWF0ZXMgdG8gdHJ1ZS4gKilcbiAgdmFsIGZpbmQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIFJldHVybnMgdGhlIGZpcnN0IGV2YWx1YXRpb24gb2YgW2ZdIHRoYXQgcmV0dXJucyBbU29tZV0sIGFuZCByZXR1cm5zIFtOb25lXSBpZiB0aGVyZVxuICAgICAgaXMgbm8gc3VjaCBlbGVtZW50LiAgKilcbiAgdmFsIGZpbmRfbWFwIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG5cbiAgdmFsIHRvX2xpc3QgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiAoJ2EsIF8pIHQgLT4gJ2EgYXJyYXlcblxuICAoKiogUmV0dXJucyBhIG1pbiAocmVzcCBtYXgpIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiB1c2luZyB0aGUgcHJvdmlkZWQgW2NvbXBhcmVdXG4gICAgICBmdW5jdGlvbi4gSW4gY2FzZSBvZiBhIHRpZSwgdGhlIGZpcnN0IGVsZW1lbnQgZW5jb3VudGVyZWQgd2hpbGUgdHJhdmVyc2luZyB0aGVcbiAgICAgIGNvbGxlY3Rpb24gaXMgcmV0dXJuZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIFtmb2xkXSBzbyBpdCBoYXMgdGhlIHNhbWUgY29tcGxleGl0eVxuICAgICAgYXMgW2ZvbGRdLiBSZXR1cm5zIFtOb25lXSBpZmYgdGhlIGNvbGxlY3Rpb24gaXMgZW1wdHkuICopXG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludCkgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIG1heF9lbHQgOiAoJ2EsIF8pIHQgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBvcHRpb25cbmVuZFxuXG5tb2R1bGUgdHlwZSBTMV9waGFudG9tID0gc2lnXG4gIHR5cGUgKCdhLCArJ3BoYW50b20pIHRcblxuICBpbmNsdWRlIFMxX3BoYW50b21faW52YXJpYW50IHdpdGggdHlwZSAoJ2EsICdwaGFudG9tKSB0IDo9ICgnYSwgJ3BoYW50b20pIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBHZW5lcmljID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlICdhIGVsdFxuXG4gIHZhbCBsZW5ndGggOiBfIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IF8gdCAtPiBib29sXG4gIHZhbCBpdGVyIDogJ2EgdCAtPiBmOignYSBlbHQgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgZm9sZCA6ICdhIHQgLT4gaW5pdDonYWNjdW0gLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogICdhIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSBlbHQgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGV4aXN0cyA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGwgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGludFxuICB2YWwgc3VtIDogKG1vZHVsZSBTdW1tYWJsZSB3aXRoIHR5cGUgdCA9ICdzdW0pIC0+ICdhIHQgLT4gZjooJ2EgZWx0IC0+ICdzdW0pIC0+ICdzdW1cbiAgdmFsIGZpbmQgOiAnYSB0IC0+IGY6KCdhIGVsdCAtPiBib29sKSAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBmaW5kX21hcCA6ICdhIHQgLT4gZjooJ2EgZWx0IC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG4gIHZhbCB0b19saXN0IDogJ2EgdCAtPiAnYSBlbHQgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiAnYSB0IC0+ICdhIGVsdCBhcnJheVxuICB2YWwgbWluX2VsdCA6ICdhIHQgLT4gY29tcGFyZTooJ2EgZWx0IC0+ICdhIGVsdCAtPiBpbnQpIC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIG1heF9lbHQgOiAnYSB0IC0+IGNvbXBhcmU6KCdhIGVsdCAtPiAnYSBlbHQgLT4gaW50KSAtPiAnYSBlbHQgb3B0aW9uXG5lbmRcblxubW9kdWxlIHR5cGUgR2VuZXJpY19waGFudG9tID0gc2lnXG4gIHR5cGUgKCdhLCAncGhhbnRvbSkgdFxuICB0eXBlICdhIGVsdFxuXG4gIHZhbCBsZW5ndGggOiAoXywgXykgdCAtPiBpbnRcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgaXRlciA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgZm9sZCA6ICgnYSwgXykgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudClcbiAgICAtPiAoJ2FjY3VtLCAnZSkgUmVzdWx0LnRcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnYSwgXykgdFxuICAgIC0+IGluaXQ6J2FjY3VtXG4gICAgLT4gZjooJ2FjY3VtIC0+ICdhIGVsdCAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2N1bSAtPiAnZmluYWwpXG4gICAgLT4gJ2ZpbmFsXG5cbiAgdmFsIGV4aXN0cyA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbCA6ICgnYSwgXykgdCAtPiBmOignYSBlbHQgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+IGludFxuXG4gIHZhbCBzdW1cbiAgICA6ICAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSlcbiAgICAtPiAoJ2EsIF8pIHRcbiAgICAtPiBmOignYSBlbHQgLT4gJ3N1bSlcbiAgICAtPiAnc3VtXG5cbiAgdmFsIGZpbmQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIGZpbmRfbWFwIDogKCdhLCBfKSB0IC0+IGY6KCdhIGVsdCAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuICB2YWwgdG9fbGlzdCA6ICgnYSwgXykgdCAtPiAnYSBlbHQgbGlzdFxuICB2YWwgdG9fYXJyYXkgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IGFycmF5XG4gIHZhbCBtaW5fZWx0IDogKCdhLCBfKSB0IC0+IGNvbXBhcmU6KCdhIGVsdCAtPiAnYSBlbHQgLT4gaW50KSAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+IGNvbXBhcmU6KCdhIGVsdCAtPiAnYSBlbHQgLT4gaW50KSAtPiAnYSBlbHQgb3B0aW9uXG5lbmRcblxubW9kdWxlIHR5cGUgTWFrZV9nZW5fYXJnID0gc2lnXG4gIHR5cGUgJ2EgdFxuICB0eXBlICdhIGVsdFxuXG4gIHZhbCBmb2xkIDogJ2EgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgZWx0IC0+ICdhY2N1bSkgLT4gJ2FjY3VtXG5cbiAgKCoqIFRoZSBbaXRlcl0gYXJndW1lbnQgdG8gW0NvbnRhaW5lci5NYWtlXSBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB0aGVcbiAgICAgIGNvbnRhaW5lcidzIFtpdGVyXSBmdW5jdGlvbi4gIFtgRGVmaW5lX3VzaW5nX2ZvbGRdIG1lYW5zIHRvIGRlZmluZSBbaXRlcl1cbiAgICAgIHZpYTpcblxuICAgICAge1tcbiAgICAgICAgaXRlciB0IH5mID0gQ29udGFpbmVyLml0ZXIgfmZvbGQgdCB+ZlxuICAgICAgXX1cblxuICAgICAgW2BDdXN0b21dIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwgcHJlc3VtYWJseSB3aXRoIHNvbWV0aGluZyBtb3JlXG4gICAgICBlZmZpY2llbnQuICBTZXZlcmFsIG90aGVyIGZ1bmN0aW9ucyByZXR1cm5lZCBieSBbQ29udGFpbmVyLk1ha2VdIGFyZSBkZWZpbmVkIGluXG4gICAgICB0ZXJtcyBvZiBbaXRlcl0sIHNvIHBhc3NpbmcgaW4gYSBtb3JlIGVmZmljaWVudCBbaXRlcl0gd2lsbCBpbXByb3ZlIHRoZWlyIGVmZmljaWVuY3lcbiAgICAgIGFzIHdlbGwuICopXG4gIHZhbCBpdGVyIDogWyBgRGVmaW5lX3VzaW5nX2ZvbGQgfCBgQ3VzdG9tIG9mICdhIHQgLT4gZjooJ2EgZWx0IC0+IHVuaXQpIC0+IHVuaXQgXVxuXG4gICgqKiBUaGUgW2xlbmd0aF0gYXJndW1lbnQgdG8gW0NvbnRhaW5lci5NYWtlXSBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB0aGVcbiAgICAgIGNvbnRhaW5lcidzIFtsZW5ndGhdIGZ1bmN0aW9uLiAgW2BEZWZpbmVfdXNpbmdfZm9sZF0gbWVhbnMgdG8gZGVmaW5lXG4gICAgICBbbGVuZ3RoXSB2aWE6XG5cbiAgICAgIHtbXG4gICAgICAgIGxlbmd0aCB0IH5mID0gQ29udGFpbmVyLmxlbmd0aCB+Zm9sZCB0IH5mXG4gICAgICBdfVxuXG4gICAgICBbYEN1c3RvbV0gb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCBwcmVzdW1hYmx5IHdpdGggc29tZXRoaW5nIG1vcmVcbiAgICAgIGVmZmljaWVudC4gIFNldmVyYWwgb3RoZXIgZnVuY3Rpb25zIHJldHVybmVkIGJ5IFtDb250YWluZXIuTWFrZV0gYXJlIGRlZmluZWQgaW5cbiAgICAgIHRlcm1zIG9mIFtsZW5ndGhdLCBzbyBwYXNzaW5nIGluIGEgbW9yZSBlZmZpY2llbnQgW2xlbmd0aF0gd2lsbCBpbXByb3ZlIHRoZWlyXG4gICAgICBlZmZpY2llbmN5IGFzIHdlbGwuICopXG4gIHZhbCBsZW5ndGggOiBbIGBEZWZpbmVfdXNpbmdfZm9sZCB8IGBDdXN0b20gb2YgJ2EgdCAtPiBpbnQgXVxuZW5kXG5cbm1vZHVsZSB0eXBlIE1ha2VfYXJnID0gTWFrZV9nZW5fYXJnIHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgTW9uYWQuSWRlbnQudFxuXG5tb2R1bGUgdHlwZSBNYWtlMF9hcmcgPSBzaWdcbiAgbW9kdWxlIEVsdCA6IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGVxdWFsIDogdCAtPiB0IC0+IGJvb2xcbiAgZW5kXG5cbiAgdHlwZSB0XG5cbiAgaW5jbHVkZSBNYWtlX2dlbl9hcmcgd2l0aCB0eXBlICdhIHQgOj0gdCBhbmQgdHlwZSAnYSBlbHQgOj0gRWx0LnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBDb250YWluZXIgPSBzaWdcbiAgaW5jbHVkZSBtb2R1bGUgdHlwZSBvZiBzdHJ1Y3RcbiAgICBpbmNsdWRlIEV4cG9ydFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMCA9IFMwXG4gIG1vZHVsZSB0eXBlIFMwX3BoYW50b20gPSBTMF9waGFudG9tXG4gIG1vZHVsZSB0eXBlIFMxID0gUzFcbiAgbW9kdWxlIHR5cGUgUzFfcGhhbnRvbV9pbnZhcmlhbnQgPSBTMV9waGFudG9tX2ludmFyaWFudFxuICBtb2R1bGUgdHlwZSBTMV9waGFudG9tID0gUzFfcGhhbnRvbVxuICBtb2R1bGUgdHlwZSBHZW5lcmljID0gR2VuZXJpY1xuICBtb2R1bGUgdHlwZSBHZW5lcmljX3BoYW50b20gPSBHZW5lcmljX3BoYW50b21cbiAgbW9kdWxlIHR5cGUgU3VtbWFibGUgPSBTdW1tYWJsZVxuXG4gICgqKiBHZW5lcmljIGRlZmluaXRpb25zIG9mIGNvbnRhaW5lciBvcGVyYXRpb25zIGluIHRlcm1zIG9mIFtmb2xkXS5cblxuICAgICAgRS5nLjogW2l0ZXIgfmZvbGQgdCB+ZiA9IGZvbGQgdCB+aW5pdDooKSB+ZjooZnVuICgpIGEgLT4gZiBhKV0uICopXG5cbiAgdHlwZSAoJ3QsICdhLCAnYWNjdW0pIGZvbGQgPSAndCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cbiAgdHlwZSAoJ3QsICdhKSBpdGVyID0gJ3QgLT4gZjooJ2EgLT4gdW5pdCkgLT4gdW5pdFxuICB0eXBlICd0IGxlbmd0aCA9ICd0IC0+IGludFxuXG4gIHZhbCBpdGVyIDogZm9sZDooJ3QsICdhLCB1bml0KSBmb2xkIC0+ICgndCwgJ2EpIGl0ZXJcbiAgdmFsIGNvdW50IDogZm9sZDooJ3QsICdhLCBpbnQpIGZvbGQgLT4gJ3QgLT4gZjooJ2EgLT4gYm9vbCkgLT4gaW50XG5cbiAgdmFsIG1pbl9lbHRcbiAgICA6ICBmb2xkOigndCwgJ2EsICdhIG9wdGlvbikgZm9sZFxuICAgIC0+ICd0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2EgLT4gaW50KVxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0XG4gICAgOiAgZm9sZDooJ3QsICdhLCAnYSBvcHRpb24pIGZvbGRcbiAgICAtPiAndFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdhIC0+IGludClcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgbGVuZ3RoIDogZm9sZDooJ3QsIF8sIGludCkgZm9sZCAtPiAndCAtPiBpbnRcbiAgdmFsIHRvX2xpc3QgOiBmb2xkOigndCwgJ2EsICdhIGxpc3QpIGZvbGQgLT4gJ3QgLT4gJ2EgbGlzdFxuXG4gIHZhbCBzdW1cbiAgICA6ICBmb2xkOigndCwgJ2EsICdzdW0pIGZvbGRcbiAgICAtPiAobW9kdWxlIFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gJ3N1bSlcbiAgICAtPiAndFxuICAgIC0+IGY6KCdhIC0+ICdzdW0pXG4gICAgLT4gJ3N1bVxuXG4gIHZhbCBmb2xkX3Jlc3VsdFxuICAgIDogIGZvbGQ6KCd0LCAnYSwgJ2IpIGZvbGRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gJ2EgLT4gKCdiLCAnZSkgUmVzdWx0LnQpXG4gICAgLT4gJ3RcbiAgICAtPiAoJ2IsICdlKSBSZXN1bHQudFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgZm9sZDooJ3QsICdhLCAnYikgZm9sZFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiAnYSAtPiAoJ2IsICdmaW5hbCkgQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2IgLT4gJ2ZpbmFsKVxuICAgIC0+ICd0XG4gICAgLT4gJ2ZpbmFsXG5cbiAgKCoqIEdlbmVyaWMgZGVmaW5pdGlvbnMgb2YgY29udGFpbmVyIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgW2l0ZXJdIGFuZCBbbGVuZ3RoXS4gKilcbiAgdmFsIGlzX2VtcHR5IDogaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+IGJvb2xcblxuICB2YWwgZXhpc3RzIDogaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+IGY6KCdhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGwgOiBpdGVyOigndCwgJ2EpIGl0ZXIgLT4gJ3QgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZmluZCA6IGl0ZXI6KCd0LCAnYSkgaXRlciAtPiAndCAtPiBmOignYSAtPiBib29sKSAtPiAnYSBvcHRpb25cbiAgdmFsIGZpbmRfbWFwIDogaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2Igb3B0aW9uXG4gIHZhbCB0b19hcnJheSA6IGxlbmd0aDondCBsZW5ndGggLT4gaXRlcjooJ3QsICdhKSBpdGVyIC0+ICd0IC0+ICdhIGFycmF5XG5cbiAgKCoqIFRoZSBpZGlvbSBmb3IgdXNpbmcgW0NvbnRhaW5lci5NYWtlXSBpcyB0byBiaW5kIHRoZSByZXN1bHRpbmcgbW9kdWxlIGFuZCB0b1xuICAgICAgZXhwbGljaXRseSBpbXBvcnQgZWFjaCBvZiB0aGUgZnVuY3Rpb25zIHRoYXQgb25lIHdhbnRzOlxuXG4gICAgICB7W1xuICAgICAgICBtb2R1bGUgQyA9IENvbnRhaW5lci5NYWtlIChzdHJ1Y3QgLi4uIGVuZClcbiAgICAgICAgbGV0IGNvdW50ICAgID0gQy5jb3VudFxuICAgICAgICBsZXQgZXhpc3RzICAgPSBDLmV4aXN0c1xuICAgICAgICBsZXQgZmluZCAgICAgPSBDLmZpbmRcbiAgICAgICAgKCogLi4uICopXG4gICAgICBdfVxuXG4gICAgICBUaGlzIGlzIHByZWZlcmFibGUgdG86XG5cbiAgICAgIHtbXG4gICAgICAgIGluY2x1ZGUgQ29udGFpbmVyLk1ha2UgKHN0cnVjdCAuLi4gZW5kKVxuICAgICAgXX1cblxuICAgICAgYmVjYXVzZSB0aGUgW2luY2x1ZGVdIG1ha2VzIGl0IHRvbyBlYXN5IHRvIHNoYWRvdyBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMgb2ZcbiAgICAgIGNvbnRhaW5lciBmdW5jdGlvbnMgKFtsZW5ndGhdIGJlaW5nIGEgY29tbW9uIG9uZSkuXG5cbiAgICAgIFtDb250YWluZXIuTWFrZTBdIGlzIGxpa2UgW0NvbnRhaW5lci5NYWtlXSwgYnV0IGZvciBtb25vbW9ycGhpYyBjb250YWluZXJzIGxpa2VcbiAgICAgIFtzdHJpbmddLiAqKVxuICBtb2R1bGUgTWFrZSAoVCA6IE1ha2VfYXJnKSA6IFMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIFQudFxuXG4gIG1vZHVsZSBNYWtlMCAoVCA6IE1ha2UwX2FyZykgOiBTMCB3aXRoIHR5cGUgdCA6PSBULnQgYW5kIHR5cGUgZWx0IDo9IFQuRWx0LnRcblxuICBtb2R1bGUgTWFrZV9nZW4gKFQgOiBNYWtlX2dlbl9hcmcpIDpcbiAgICBHZW5lcmljIHdpdGggdHlwZSAnYSB0IDo9ICdhIFQudCBhbmQgdHlwZSAnYSBlbHQgOj0gJ2EgVC5lbHRcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbm1vZHVsZSBMaXN0ID0gTGlzdDBcbmluY2x1ZGUgQ29udGFpbmVyX2ludGZcblxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cblxudHlwZSAoJ3QsICdhLCAnYWNjdW0pIGZvbGQgPSAndCAtPiBpbml0OidhY2N1bSAtPiBmOignYWNjdW0gLT4gJ2EgLT4gJ2FjY3VtKSAtPiAnYWNjdW1cbnR5cGUgKCd0LCAnYSkgaXRlciA9ICd0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbnR5cGUgJ3QgbGVuZ3RoID0gJ3QgLT4gaW50XG5cbmxldCBpdGVyIH5mb2xkIHQgfmYgPSBmb2xkIHQgfmluaXQ6KCkgfmY6KGZ1biAoKSBhIC0+IGYgYSlcbmxldCBjb3VudCB+Zm9sZCB0IH5mID0gZm9sZCB0IH5pbml0OjAgfmY6KGZ1biBuIGEgLT4gaWYgZiBhIHRoZW4gbiArIDEgZWxzZSBuKVxuXG5sZXQgc3VtICh0eXBlIGEpIH5mb2xkIChtb2R1bGUgTSA6IFN1bW1hYmxlIHdpdGggdHlwZSB0ID0gYSkgdCB+ZiA9XG4gIGZvbGQgdCB+aW5pdDpNLnplcm8gfmY6KGZ1biBuIGEgLT4gTS4oICsgKSBuIChmIGEpKVxuOztcblxubGV0IGZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHQgPVxuICB3aXRoX3JldHVybiAoZnVuIHsgcmV0dXJuIH0gLT5cbiAgICBSZXN1bHQuT2tcbiAgICAgIChmb2xkIHQgfmluaXQgfmY6KGZ1biBhY2MgaXRlbSAtPlxuICAgICAgICAgbWF0Y2ggZiBhY2MgaXRlbSB3aXRoXG4gICAgICAgICB8IFJlc3VsdC5PayB4IC0+IHhcbiAgICAgICAgIHwgRXJyb3IgXyBhcyBlIC0+IHJldHVybiBlKSkpXG47O1xuXG5sZXQgZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB+ZmluaXNoIHQgPVxuICB3aXRoX3JldHVybiAoZnVuIHsgcmV0dXJuIH0gLT5cbiAgICBmaW5pc2hcbiAgICAgIChmb2xkIHQgfmluaXQgfmY6KGZ1biBhY2MgaXRlbSAtPlxuICAgICAgICAgbWF0Y2ggZiBhY2MgaXRlbSB3aXRoXG4gICAgICAgICB8IENvbnRpbnVlX29yX3N0b3AuQ29udGludWUgeCAtPiB4XG4gICAgICAgICB8IFN0b3AgeCAtPiByZXR1cm4geCkpKVxuOztcblxubGV0IG1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZSA9XG4gIGZvbGQgdCB+aW5pdDpOb25lIH5mOihmdW4gYWNjIGVsdCAtPlxuICAgIG1hdGNoIGFjYyB3aXRoXG4gICAgfCBOb25lIC0+IFNvbWUgZWx0XG4gICAgfCBTb21lIG1pbiAtPiBpZiBjb21wYXJlIG1pbiBlbHQgPiAwIHRoZW4gU29tZSBlbHQgZWxzZSBhY2MpXG47O1xuXG5sZXQgbWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlID1cbiAgZm9sZCB0IH5pbml0Ok5vbmUgfmY6KGZ1biBhY2MgZWx0IC0+XG4gICAgbWF0Y2ggYWNjIHdpdGhcbiAgICB8IE5vbmUgLT4gU29tZSBlbHRcbiAgICB8IFNvbWUgbWF4IC0+IGlmIGNvbXBhcmUgbWF4IGVsdCA8IDAgdGhlbiBTb21lIGVsdCBlbHNlIGFjYylcbjs7XG5cbmxldCBsZW5ndGggfmZvbGQgYyA9IGZvbGQgYyB+aW5pdDowIH5mOihmdW4gYWNjIF8gLT4gYWNjICsgMSlcblxubGV0IGlzX2VtcHR5IH5pdGVyIGMgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyIGMgfmY6KGZ1biBfIC0+IHIucmV0dXJuIGZhbHNlKTtcbiAgICB0cnVlKVxuOztcblxubGV0IGV4aXN0cyB+aXRlciBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlciBjIH5mOihmdW4geCAtPiBpZiBmIHggdGhlbiByLnJldHVybiB0cnVlKTtcbiAgICBmYWxzZSlcbjs7XG5cbmxldCBmb3JfYWxsIH5pdGVyIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyIGMgfmY6KGZ1biB4IC0+IGlmIG5vdCAoZiB4KSB0aGVuIHIucmV0dXJuIGZhbHNlKTtcbiAgICB0cnVlKVxuOztcblxubGV0IGZpbmRfbWFwIH5pdGVyIHQgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyIHQgfmY6KGZ1biB4IC0+XG4gICAgICBtYXRjaCBmIHggd2l0aFxuICAgICAgfCBOb25lIC0+ICgpXG4gICAgICB8IFNvbWUgXyBhcyByZXMgLT4gci5yZXR1cm4gcmVzKTtcbiAgICBOb25lKVxuOztcblxubGV0IGZpbmQgfml0ZXIgYyB+ZiA9XG4gIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgYyB+ZjooZnVuIHggLT4gaWYgZiB4IHRoZW4gci5yZXR1cm4gKFNvbWUgeCkpO1xuICAgIE5vbmUpXG47O1xuXG5sZXQgdG9fbGlzdCB+Zm9sZCBjID0gTGlzdC5yZXYgKGZvbGQgYyB+aW5pdDpbXSB+ZjooZnVuIGFjYyB4IC0+IHggOjogYWNjKSlcblxubGV0IHRvX2FycmF5IH5sZW5ndGggfml0ZXIgYyA9XG4gIGxldCBhcnJheSA9IHJlZiBbfHxdIGluXG4gIGxldCBpID0gcmVmIDAgaW5cbiAgaXRlciBjIH5mOihmdW4geCAtPlxuICAgIGlmICFpID0gMCB0aGVuIGFycmF5IDo9IEFycmF5LmNyZWF0ZSB+bGVuOihsZW5ndGggYykgeDtcbiAgICAhYXJyYXkuKCFpKSA8LSB4O1xuICAgIGluY3IgaSk7XG4gICFhcnJheVxuOztcblxubW9kdWxlIE1ha2VfZ2VuIChUIDogTWFrZV9nZW5fYXJnKSA6IHNpZ1xuICBpbmNsdWRlIEdlbmVyaWMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgVC50IHdpdGggdHlwZSAnYSBlbHQgOj0gJ2EgVC5lbHRcbmVuZCA9IHN0cnVjdFxuICBsZXQgZm9sZCA9IFQuZm9sZFxuXG4gIGxldCBpdGVyID1cbiAgICBtYXRjaCBULml0ZXIgd2l0aFxuICAgIHwgYEN1c3RvbSBpdGVyIC0+IGl0ZXJcbiAgICB8IGBEZWZpbmVfdXNpbmdfZm9sZCAtPiBmdW4gdCB+ZiAtPiBpdGVyIH5mb2xkIHQgfmZcbiAgOztcblxuICBsZXQgbGVuZ3RoID1cbiAgICBtYXRjaCBULmxlbmd0aCB3aXRoXG4gICAgfCBgQ3VzdG9tIGxlbmd0aCAtPiBsZW5ndGhcbiAgICB8IGBEZWZpbmVfdXNpbmdfZm9sZCAtPiBmdW4gdCAtPiBsZW5ndGggfmZvbGQgdFxuICA7O1xuXG4gIGxldCBpc19lbXB0eSB0ID0gaXNfZW1wdHkgfml0ZXIgdFxuICBsZXQgc3VtIG0gdCA9IHN1bSB+Zm9sZCBtIHRcbiAgbGV0IGNvdW50IHQgfmYgPSBjb3VudCB+Zm9sZCB0IH5mXG4gIGxldCBleGlzdHMgdCB+ZiA9IGV4aXN0cyB+aXRlciB0IH5mXG4gIGxldCBmb3JfYWxsIHQgfmYgPSBmb3JfYWxsIH5pdGVyIHQgfmZcbiAgbGV0IGZpbmRfbWFwIHQgfmYgPSBmaW5kX21hcCB+aXRlciB0IH5mXG4gIGxldCBmaW5kIHQgfmYgPSBmaW5kIH5pdGVyIHQgfmZcbiAgbGV0IHRvX2xpc3QgdCA9IHRvX2xpc3QgfmZvbGQgdFxuICBsZXQgdG9fYXJyYXkgdCA9IHRvX2FycmF5IH5sZW5ndGggfml0ZXIgdFxuICBsZXQgbWluX2VsdCB0IH5jb21wYXJlID0gbWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG4gIGxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBtYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcbiAgbGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBmb2xkX3Jlc3VsdCB0IH5mb2xkIH5pbml0IH5mXG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaCA9IGZvbGRfdW50aWwgdCB+Zm9sZCB+aW5pdCB+ZiB+ZmluaXNoXG5lbmRcblxubW9kdWxlIE1ha2UgKFQgOiBNYWtlX2FyZykgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBNYWtlX2dlbiAoc3RydWN0XG4gICAgICBpbmNsdWRlIFRcblxuICAgICAgdHlwZSAnYSBlbHQgPSAnYVxuICAgIGVuZClcblxuICBsZXQgbWVtIHQgYSB+ZXF1YWwgPSBleGlzdHMgdCB+ZjooZXF1YWwgYSlcbmVuZFxuXG5tb2R1bGUgTWFrZTAgKFQgOiBNYWtlMF9hcmcpID0gc3RydWN0XG4gIGluY2x1ZGUgTWFrZV9nZW4gKHN0cnVjdFxuICAgICAgaW5jbHVkZSBUXG5cbiAgICAgIHR5cGUgJ2EgdCA9IFQudFxuICAgICAgdHlwZSAnYSBlbHQgPSBULkVsdC50XG4gICAgZW5kKVxuXG4gIGxldCBtZW0gdCBlbHQgPSBleGlzdHMgdCB+ZjooVC5FbHQuZXF1YWwgZWx0KVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQ2FtbC5MYXp5XG5cbnR5cGUgJ2EgdCA9ICdhIGxhenlfdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID0gbGF6eV90X29mX3NleHBcbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPSBzZXhwX29mX2xhenlfdFxuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBsYXp5X3Rfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbjs7XG5cbltAQEBlbmRdXG5cbmxldCBtYXAgdCB+ZiA9IGxhenkgKGYgKGZvcmNlIHQpKVxuXG5sZXQgY29tcGFyZSBjb21wYXJlX2EgdDEgdDIgPVxuICBpZiBwaHlzX2VxdWFsIHQxIHQyIHRoZW4gMCBlbHNlIGNvbXBhcmVfYSAoZm9yY2UgdDEpIChmb3JjZSB0Milcbjs7XG5cbmxldCBlcXVhbCBlcXVhbF9hIHQxIHQyID0gaWYgcGh5c19lcXVhbCB0MSB0MiB0aGVuIHRydWUgZWxzZSBlcXVhbF9hIChmb3JjZSB0MSkgKGZvcmNlIHQyKVxubGV0IGhhc2hfZm9sZF90ID0gSGFzaC5CdWlsdGluLmhhc2hfZm9sZF9sYXp5X3RcblxuaW5jbHVkZSBNb25hZC5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IHJldHVybiB4ID0gZnJvbV92YWwgeFxuICAgIGxldCBiaW5kIHQgfmYgPSBsYXp5IChmb3JjZSAoZiAoZm9yY2UgdCkpKVxuICAgIGxldCBtYXAgPSBtYXBcbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgZW5kKVxuXG5tb2R1bGUgVF91bmZvcmNpbmcgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSB0ID1cbiAgICBpZiBpc192YWwgdCB0aGVuIHNleHBfb2ZfYSAoZm9yY2UgdCkgZWxzZSBzZXhwX29mX3N0cmluZyBcIjx1bmZvcmNlZCBsYXp5PlwiXG4gIDs7XG5lbmRcbiIsIigqIFNwbGl0IG9mZiB0byBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5IHdpdGggW09yX2Vycm9yXS4gKilcblxub3BlbiEgSW1wb3J0XG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5cbmxldCBzbG93X2NoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoID1cbiAgaWYgcG9zIDwgMCB0aGVuIGludmFsaWRfYXJnZiBcIk5lZ2F0aXZlIHBvc2l0aW9uOiAlZFwiIHBvcyAoKTtcbiAgaWYgbGVuIDwgMCB0aGVuIGludmFsaWRfYXJnZiBcIk5lZ2F0aXZlIGxlbmd0aDogJWRcIiBsZW4gKCk7XG4gICgqIFdlIHVzZSBbcG9zID4gdG90YWxfbGVuZ3RoIC0gbGVuXSByYXRoZXIgdGhhbiBbcG9zICsgbGVuID4gdG90YWxfbGVuZ3RoXSB0byBhdm9pZCB0aGVcbiAgICAgcG9zc2liaWxpdHkgb2Ygb3ZlcmZsb3cuICopXG4gIGlmIHBvcyA+IHRvdGFsX2xlbmd0aCAtIGxlblxuICB0aGVuIGludmFsaWRfYXJnZiBcInBvcyArIGxlbiBwYXN0IGVuZDogJWQgKyAlZCA+ICVkXCIgcG9zIGxlbiB0b3RhbF9sZW5ndGggKClcbltAQGNvbGRdIFtAQGlubGluZSBuZXZlcl0gW0BAbG9jYWwgbmV2ZXJdIFtAQHNwZWNpYWxpc2UgbmV2ZXJdXG47O1xuXG5sZXQgY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGggPVxuICAoKiBUaGlzIGlzIGJldHRlciB0aGFuIFtzbG93X2NoZWNrX3Bvc19sZW5fZXhuXSBmb3IgdHdvIHJlYXNvbnM6XG5cbiAgICAgLSBtdWNoIGxlc3MgaW5saW5lZCBjb2RlXG4gICAgIC0gb25seSBvbmUgY29uZGl0aW9uYWwganVtcFxuXG4gICAgIFRoZSByZWFzb24gaXQgd29ya3MgaXMgdGhhdCBjaGVja2luZyBbPCAwXSBpcyB0ZXN0aW5nIHRoZSBoaWdoZXN0IG9yZGVyIGJpdCwgc29cbiAgICAgW2EgPCAwIHx8IGIgPCAwXSBpcyB0aGUgc2FtZSBhcyBbYSBsb3IgYiA8IDBdLlxuXG4gICAgIFtwb3MgKyBsZW5dIGNhbiBvdmVyZmxvdywgc28gW3BvcyA+IHRvdGFsX2xlbmd0aCAtIGxlbl0gaXMgbm90IGVxdWl2YWxlbnQgdG9cbiAgICAgW3RvdGFsX2xlbmd0aCAtIGxlbiAtIHBvcyA8IDBdLCB3ZSBuZWVkIHRvIHRlc3QgZm9yIFtwb3MgKyBsZW5dIG92ZXJmbG93IGFzXG4gICAgIHdlbGwuICopXG4gIGxldCBzdG9wID0gcG9zICsgbGVuIGluXG4gIGlmIHBvcyBsb3IgbGVuIGxvciBzdG9wIGxvciAodG90YWxfbGVuZ3RoIC0gc3RvcCkgPCAwXG4gIHRoZW4gc2xvd19jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aFxuOztcblxubGV0IGdldF9wb3NfbGVuX2V4biA/KHBvcyA9IDApID9sZW4gKCkgfnRvdGFsX2xlbmd0aCA9XG4gIGxldCBsZW4gPVxuICAgIG1hdGNoIGxlbiB3aXRoXG4gICAgfCBTb21lIGkgLT4gaVxuICAgIHwgTm9uZSAtPiB0b3RhbF9sZW5ndGggLSBwb3NcbiAgaW5cbiAgY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGg7XG4gIHBvcywgbGVuXG47O1xuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBsZXQgc2xvd19jaGVja19wb3NfbGVuX2V4biA9IHNsb3dfY2hlY2tfcG9zX2xlbl9leG5cbmVuZFxuIiwiXG5tb2R1bGUgUmVwciA9IHN0cnVjdFxuICBvcGVuIENhbWwuQmlnYXJyYXlcblxuICB0eXBlIHQgPSAoaW50NjQsIGludDY0X2VsdCwgY19sYXlvdXQpIEFycmF5MS50XG5cbiAgbGV0IG9mX3N0YXRlIDogQ2FtbC5SYW5kb20uU3RhdGUudCAtPiB0ID0gQ2FtbC5PYmoubWFnaWNcbmVuZFxuXG5sZXQgYXNzaWduIGRzdCBzcmMgPVxuICBsZXQgZHN0ID0gUmVwci5vZl9zdGF0ZSAoTGF6eS5mb3JjZSBkc3QpIGluXG4gIGxldCBzcmMgPSBSZXByLm9mX3N0YXRlIChMYXp5LmZvcmNlIHNyYykgaW5cbiAgQ2FtbC5CaWdhcnJheS5BcnJheTEuYmxpdCBzcmMgZHN0XG5cbmxldCBtYWtlX2RlZmF1bHQgZGVmYXVsdCA9XG4gIGxldCBzcGxpdF9mcm9tX3BhcmVudCB2ID1cbiAgICBDYW1sLkxhenkubWFwX3ZhbCBDYW1sLlJhbmRvbS5TdGF0ZS5zcGxpdCB2XG4gIGluXG4gIENhbWwuRG9tYWluLkRMUy5uZXdfa2V5IH5zcGxpdF9mcm9tX3BhcmVudCAoZnVuICgpIC0+IGRlZmF1bHQpXG5cbmxldCBnZXRfc3RhdGUgcmFuZG9tX2tleSA9IENhbWwuRG9tYWluLkRMUy5nZXQgcmFuZG9tX2tleVxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgSW50ID0gSW50MFxubW9kdWxlIENoYXIgPSBDaGFyMFxuXG4oKiBVbmZvcnR1bmF0ZWx5LCBiZWNhdXNlIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGRvZXMgbm90IGV4cG9zZVxuICAgW0NhbWwuUmFuZG9tLlN0YXRlLmRlZmF1bHRdLCB3ZSBoYXZlIHRvIGNvbnN0cnVjdCBvdXIgb3duLiAgV2UgdGhlbiBidWlsZCB0aGVcbiAgIFtDYW1sLlJhbmRvbS5pbnRdLCBbQ2FtbC5SYW5kb20uYm9vbF0gZnVuY3Rpb25zIGFuZCBmcmllbmRzIHVzaW5nIHRoYXQgZGVmYXVsdCBzdGF0ZSBpblxuICAgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIHN0YW5kYXJkIGxpYnJhcnkuXG5cbiAgIE9uZSBvdGhlciB0cmlja2luZXNzIGlzIHRoYXQgd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIHVuZXhwb3NlZCBbQ2FtbC5SYW5kb20uU3RhdGUuYXNzaWduXVxuICAgZnVuY3Rpb24sIHdoaWNoIGFjY2Vzc2VzIHRoZSB1bmV4cG9zZWQgc3RhdGUgcmVwcmVzZW50YXRpb24uICBTbywgd2UgY29weSB0aGVcbiAgIFtTdGF0ZS5yZXByXSB0eXBlIGRlZmluaXRpb24gYW5kIFthc3NpZ25dIGZ1bmN0aW9uIHRvIGhlcmUgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSxcbiAgIGFuZCB1c2UgW09iai5tYWdpY10gdG8gZ2V0IGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4gKilcblxuKCogUmVncmVzc2lvbiB0ZXN0cyBvdWdodCB0byBiZSBkZXRlcm1pbmlzdGljIGJlY2F1c2UgdGhhdCB3YXkgYW55b25lIHdobyBicmVha3MgdGhlIHRlc3RcbiAgIGtub3dzIHRoYXQgaXQncyB0aGVpciBjb2RlIHRoYXQgYnJva2UgdGhlIHRlc3QuICBJZiB0ZXN0cyBhcmUgbm9uZGV0ZXJtaW5pc3RpYywgYSB0ZXN0XG4gICBmYWlsdXJlIG1heSBpbnN0ZWFkIGhhcHBlbiBiZWNhdXNlIHRoZSB0ZXN0IHJ1bm5lciBnb3QgdW5sdWNreSBhbmQgdW5jb3ZlcmVkIGFuXG4gICBleGlzdGluZyBidWcgaW4gdGhlIGNvZGUgc3VwcG9zZWRseSBiZWluZyBcInByb3RlY3RlZFwiIGJ5IHRoZSB0ZXN0IGluIHF1ZXN0aW9uLiAqKVxubGV0IGZvcmJpZF9ub25kZXRlcm1pbmlzbV9pbl90ZXN0cyB+YWxsb3dfaW5fdGVzdHMgPVxuICBpZiBhbV90ZXN0aW5nXG4gIHRoZW4gKFxuICAgIG1hdGNoIGFsbG93X2luX3Rlc3RzIHdpdGhcbiAgICB8IFNvbWUgdHJ1ZSAtPiAoKVxuICAgIHwgTm9uZSB8IFNvbWUgZmFsc2UgLT5cbiAgICAgIGZhaWx3aXRoXG4gICAgICAgIFwiaW5pdGlhbGl6aW5nIFJhbmRvbSB3aXRoIGEgbm9uZGV0ZXJtaW5pc3RpYyBzZWVkIGlzIGZvcmJpZGRlbiBpbiBpbmxpbmUgdGVzdHNcIilcbjs7XG5cbmV4dGVybmFsIHJhbmRvbV9zZWVkIDogdW5pdCAtPiBpbnQgYXJyYXkgPSBcImNhbWxfc3lzX3JhbmRvbV9zZWVkXCJcblxubGV0IHJhbmRvbV9zZWVkID9hbGxvd19pbl90ZXN0cyAoKSA9XG4gIGZvcmJpZF9ub25kZXRlcm1pbmlzbV9pbl90ZXN0cyB+YWxsb3dfaW5fdGVzdHM7XG4gIHJhbmRvbV9zZWVkICgpXG47O1xuXG5tb2R1bGUgU3RhdGUgPSBzdHJ1Y3RcbiAgKCogV2UgYWxsb3cgbGF6aW5lc3Mgb25seSBmb3IgdGhlIGRlZmluaXRpb24gb2YgW2RlZmF1bHRdLCBiZWxvdywgd2hpY2ggbWF5IGxhemlseSBjYWxsXG4gICAgIFttYWtlX3NlbGZfaW5pdF0uIEZvciBhbGwgb3RoZXIgcHVycG9zZXMsIHdlIGNyZWF0ZSBhbmQgdXNlIFt0XSBlYWdlcmx5LiAqKVxuICB0eXBlIHQgPSBDYW1sLlJhbmRvbS5TdGF0ZS50IExhenkudFxuXG4gIGxldCBiaXRzIHQgPSBDYW1sLlJhbmRvbS5TdGF0ZS5iaXRzIChMYXp5LmZvcmNlIHQpXG4gIGxldCBib29sIHQgPSBDYW1sLlJhbmRvbS5TdGF0ZS5ib29sIChMYXp5LmZvcmNlIHQpXG4gIGxldCBpbnQgdCB4ID0gQ2FtbC5SYW5kb20uU3RhdGUuaW50IChMYXp5LmZvcmNlIHQpIHhcbiAgbGV0IGludDMyIHQgeCA9IENhbWwuUmFuZG9tLlN0YXRlLmludDMyIChMYXp5LmZvcmNlIHQpIHhcbiAgbGV0IGludDY0IHQgeCA9IENhbWwuUmFuZG9tLlN0YXRlLmludDY0IChMYXp5LmZvcmNlIHQpIHhcbiAgbGV0IG5hdGl2ZWludCB0IHggPSBDYW1sLlJhbmRvbS5TdGF0ZS5uYXRpdmVpbnQgKExhenkuZm9yY2UgdCkgeFxuICBsZXQgbWFrZSBzZWVkID0gTGF6eS5mcm9tX3ZhbCAoQ2FtbC5SYW5kb20uU3RhdGUubWFrZSBzZWVkKVxuICBsZXQgY29weSB0ID0gTGF6eS5mcm9tX3ZhbCAoQ2FtbC5SYW5kb20uU3RhdGUuY29weSAoTGF6eS5mb3JjZSB0KSlcbiAgbGV0IGNoYXIgdCA9IGludCB0IDI1NiB8PiBDaGFyLnVuc2FmZV9vZl9pbnRcbiAgbGV0IGFzY2lpIHQgPSBpbnQgdCAxMjggfD4gQ2hhci51bnNhZmVfb2ZfaW50XG5cbiAgbGV0IG1ha2Vfc2VsZl9pbml0ID9hbGxvd19pbl90ZXN0cyAoKSA9XG4gICAgZm9yYmlkX25vbmRldGVybWluaXNtX2luX3Rlc3RzIH5hbGxvd19pbl90ZXN0cztcbiAgICBMYXp5LmZyb21fdmFsIChDYW1sLlJhbmRvbS5TdGF0ZS5tYWtlX3NlbGZfaW5pdCAoKSlcbiAgOztcblxuICBsZXQgYXNzaWduID0gUmFuZG9tX3JlcHIuYXNzaWduXG5cbiAgbGV0IGZ1bGxfaW5pdCB0IHNlZWQgPSBhc3NpZ24gdCAobWFrZSBzZWVkKVxuXG4gIGxldCBkZWZhdWx0ID1cbiAgICBpZiBhbV90ZXN0aW5nXG4gICAgdGhlbiAoXG4gICAgICAoKiBXZSBkZWZpbmUgQmFzZSdzIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGFzIGEgY29weSBvZiBPQ2FtbCdzIGRlZmF1bHQgcmFuZG9tIHN0YXRlLlxuICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHByb2dyYW1zIHRoYXQgdXNlIEJhc2UuUmFuZG9tIHdpbGwgc2VlIHRoZSBzYW1lIHNlcXVlbmNlIG9mXG4gICAgICAgICByYW5kb20gYml0cyBhcyBpZiB0aGV5IGhhZCB1c2VkIENhbWwuUmFuZG9tLiBIb3dldmVyLCBiZWNhdXNlIFtnZXRfc3RhdGVdIHJldHVybnNcbiAgICAgICAgIGEgY29weSwgQmFzZS5SYW5kb20gYW5kIE9DYW1sLlJhbmRvbSBhcmUgbm90IHVzaW5nIHRoZSBzYW1lIHN0YXRlLiBJZiBhIHByb2dyYW1cbiAgICAgICAgIHVzZWQgYm90aCwgZWFjaCBvZiB0aGVtIHdvdWxkIGdvIHRocm91Z2ggdGhlIHNhbWUgc2VxdWVuY2Ugb2YgcmFuZG9tIGJpdHMuIFRvXG4gICAgICAgICBhdm9pZCB0aGF0LCB3ZSByZXNldCBPQ2FtbCdzIHJhbmRvbSBzdGF0ZSB0byBhIGRpZmZlcmVudCBzZWVkLCBnaXZpbmcgaXQgYVxuICAgICAgICAgZGlmZmVyZW50IHNlcXVlbmNlLiAqKVxuICAgICAgbGV0IHQgPSBDYW1sLlJhbmRvbS5nZXRfc3RhdGUgKCkgaW5cbiAgICAgIENhbWwuUmFuZG9tLmluaXQgMTM3O1xuICAgICAgTGF6eS5mcm9tX3ZhbCB0KVxuICAgIGVsc2VcbiAgICAgIGxhenlcbiAgICAgICAgKCogT3V0c2lkZSBvZiB0ZXN0cywgd2UgaW5pdGlhbGl6ZSByYW5kb20gc3RhdGUgbm9uZGV0ZXJtaW5pc3RpY2FsbHkgYW5kIGxhemlseS5cbiAgICAgICAgICAgV2UgZm9yY2UgdGhlIHJhbmRvbSBpbml0aWFsaXphdGlvbiB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG8gbm90IHBheSBhbnkgY29zdFxuICAgICAgICAgICBmb3IgaXQgaW4gcHJvZ3JhbXMgdGhhdCBkbyBub3QgdXNlIHJhbmRvbW5lc3MuICopXG4gICAgICAgIChMYXp5LmZvcmNlIChtYWtlX3NlbGZfaW5pdCAoKSkpXG4gIDs7XG5cbiAgbGV0IGludF9vbl82NGJpdHMgdCBib3VuZCA9XG4gICAgaWYgYm91bmQgPD0gMHgzRkZGRkZGRiAoKiAoMSBsc2wgMzApIC0gMSAqKVxuICAgIHRoZW4gaW50IHQgYm91bmRcbiAgICBlbHNlIENhbWwuSW50NjQudG9faW50IChpbnQ2NCB0IChDYW1sLkludDY0Lm9mX2ludCBib3VuZCkpXG4gIDs7XG5cbiAgbGV0IGludF9vbl8zMmJpdHMgdCBib3VuZCA9XG4gICAgKCogTm90IGFsd2F5cyB0cnVlIHdpdGggdGhlIEphdmFTY3JpcHQgYmFja2VuZC4gKilcbiAgICBpZiBib3VuZCA8PSAweDNGRkZGRkZGICgqICgxIGxzbCAzMCkgLSAxICopXG4gICAgdGhlbiBpbnQgdCBib3VuZFxuICAgIGVsc2UgQ2FtbC5JbnQzMi50b19pbnQgKGludDMyIHQgKENhbWwuSW50MzIub2ZfaW50IGJvdW5kKSlcbiAgOztcblxuICBsZXQgaW50ID1cbiAgICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgICB8IFc2NCAtPiBpbnRfb25fNjRiaXRzXG4gICAgfCBXMzIgLT4gaW50X29uXzMyYml0c1xuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX2ludDY0ID1cbiAgICBsZXQgb3BlbiBDYW1sLkludDY0IGluXG4gICAgbGV0IGJpdHMgc3RhdGUgPSBvZl9pbnQgKGJpdHMgc3RhdGUpIGluXG4gICAgZnVuIHN0YXRlIC0+XG4gICAgICBsb2d4b3JcbiAgICAgICAgKGJpdHMgc3RhdGUpXG4gICAgICAgIChsb2d4b3IgKHNoaWZ0X2xlZnQgKGJpdHMgc3RhdGUpIDMwKSAoc2hpZnRfbGVmdCAoYml0cyBzdGF0ZSkgNjApKVxuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX2ludDMyID1cbiAgICBsZXQgb3BlbiBDYW1sLkludDMyIGluXG4gICAgbGV0IGJpdHMgc3RhdGUgPSBvZl9pbnQgKGJpdHMgc3RhdGUpIGluXG4gICAgZnVuIHN0YXRlIC0+IGxvZ3hvciAoYml0cyBzdGF0ZSkgKHNoaWZ0X2xlZnQgKGJpdHMgc3RhdGUpIDMwKVxuICA7O1xuXG4gIGxldCBmdWxsX3JhbmdlX2ludF9vbl82NGJpdHMgc3RhdGUgPSBDYW1sLkludDY0LnRvX2ludCAoZnVsbF9yYW5nZV9pbnQ2NCBzdGF0ZSlcbiAgbGV0IGZ1bGxfcmFuZ2VfaW50X29uXzMyYml0cyBzdGF0ZSA9IENhbWwuSW50MzIudG9faW50IChmdWxsX3JhbmdlX2ludDMyIHN0YXRlKVxuXG4gIGxldCBmdWxsX3JhbmdlX2ludCA9XG4gICAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gICAgfCBXNjQgLT4gZnVsbF9yYW5nZV9pbnRfb25fNjRiaXRzXG4gICAgfCBXMzIgLT4gZnVsbF9yYW5nZV9pbnRfb25fMzJiaXRzXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzY0Yml0cyBzdGF0ZSA9XG4gICAgQ2FtbC5JbnQ2NC50b19uYXRpdmVpbnQgKGZ1bGxfcmFuZ2VfaW50NjQgc3RhdGUpXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfbmF0aXZlaW50X29uXzMyYml0cyBzdGF0ZSA9XG4gICAgQ2FtbC5OYXRpdmVpbnQub2ZfaW50MzIgKGZ1bGxfcmFuZ2VfaW50MzIgc3RhdGUpXG4gIDs7XG5cbiAgbGV0IGZ1bGxfcmFuZ2VfbmF0aXZlaW50ID1cbiAgICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgICB8IFc2NCAtPiBmdWxsX3JhbmdlX25hdGl2ZWludF9vbl82NGJpdHNcbiAgICB8IFczMiAtPiBmdWxsX3JhbmdlX25hdGl2ZWludF9vbl8zMmJpdHNcbiAgOztcblxuICBsZXQgcmFpc2VfY3Jvc3NlZF9ib3VuZHMgbmFtZSBsb3dlcl9ib3VuZCB1cHBlcl9ib3VuZCBzdHJpbmdfb2ZfYm91bmQgPVxuICAgIFByaW50Zi5mYWlsd2l0aGZcbiAgICAgIFwiUmFuZG9tLiVzOiBjcm9zc2VkIGJvdW5kcyBbJXMgPiAlc11cIlxuICAgICAgbmFtZVxuICAgICAgKHN0cmluZ19vZl9ib3VuZCBsb3dlcl9ib3VuZClcbiAgICAgIChzdHJpbmdfb2ZfYm91bmQgdXBwZXJfYm91bmQpXG4gICAgICAoKVxuICBbQEBjb2xkXSBbQEBpbmxpbmUgbmV2ZXJdIFtAQGxvY2FsIG5ldmVyXSBbQEBzcGVjaWFsaXNlIG5ldmVyXVxuICA7O1xuXG4gIGxldCBpbnRfaW5jbCA9XG4gICAgbGV0IHJlYyBpbl9yYW5nZSBzdGF0ZSBsbyBoaSA9XG4gICAgICBsZXQgaW50ID0gZnVsbF9yYW5nZV9pbnQgc3RhdGUgaW5cbiAgICAgIGlmIGludCA+PSBsbyAmJiBpbnQgPD0gaGkgdGhlbiBpbnQgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICAgIGluXG4gICAgZnVuIHN0YXRlIGxvIGhpIC0+XG4gICAgICBpZiBsbyA+IGhpIHRoZW4gcmFpc2VfY3Jvc3NlZF9ib3VuZHMgXCJpbnRcIiBsbyBoaSBJbnQudG9fc3RyaW5nO1xuICAgICAgbGV0IGRpZmYgPSBoaSAtIGxvIGluXG4gICAgICBpZiBkaWZmID0gSW50Lm1heF92YWx1ZVxuICAgICAgdGhlbiBsbyArIChmdWxsX3JhbmdlX2ludCBzdGF0ZSBsYW5kIEludC5tYXhfdmFsdWUpXG4gICAgICBlbHNlIGlmIGRpZmYgPj0gMFxuICAgICAgdGhlbiBsbyArIGludCBzdGF0ZSAoSW50LnN1Y2MgZGlmZilcbiAgICAgIGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgOztcblxuICBsZXQgaW50MzJfaW5jbCA9XG4gICAgbGV0IG9wZW4gSW50MzJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgbGV0IHJlYyBpbl9yYW5nZSBzdGF0ZSBsbyBoaSA9XG4gICAgICBsZXQgaW50ID0gZnVsbF9yYW5nZV9pbnQzMiBzdGF0ZSBpblxuICAgICAgaWYgaW50ID49IGxvICYmIGludCA8PSBoaSB0aGVuIGludCBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gICAgaW5cbiAgICBsZXQgb3BlbiBDYW1sLkludDMyIGluXG4gICAgZnVuIHN0YXRlIGxvIGhpIC0+XG4gICAgICBpZiBsbyA+IGhpIHRoZW4gcmFpc2VfY3Jvc3NlZF9ib3VuZHMgXCJpbnQzMlwiIGxvIGhpIHRvX3N0cmluZztcbiAgICAgIGxldCBkaWZmID0gc3ViIGhpIGxvIGluXG4gICAgICBpZiBkaWZmID0gbWF4X2ludFxuICAgICAgdGhlbiBhZGQgbG8gKGxvZ2FuZCAoZnVsbF9yYW5nZV9pbnQzMiBzdGF0ZSkgbWF4X2ludClcbiAgICAgIGVsc2UgaWYgZGlmZiA+PSAwbFxuICAgICAgdGhlbiBhZGQgbG8gKGludDMyIHN0YXRlIChzdWNjIGRpZmYpKVxuICAgICAgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICA7O1xuXG4gIGxldCBuYXRpdmVpbnRfaW5jbCA9XG4gICAgbGV0IG9wZW4gTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGxldCByZWMgaW5fcmFuZ2Ugc3RhdGUgbG8gaGkgPVxuICAgICAgbGV0IGludCA9IGZ1bGxfcmFuZ2VfbmF0aXZlaW50IHN0YXRlIGluXG4gICAgICBpZiBpbnQgPj0gbG8gJiYgaW50IDw9IGhpIHRoZW4gaW50IGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgICBpblxuICAgIGxldCBvcGVuIENhbWwuTmF0aXZlaW50IGluXG4gICAgZnVuIHN0YXRlIGxvIGhpIC0+XG4gICAgICBpZiBsbyA+IGhpIHRoZW4gcmFpc2VfY3Jvc3NlZF9ib3VuZHMgXCJuYXRpdmVpbnRcIiBsbyBoaSB0b19zdHJpbmc7XG4gICAgICBsZXQgZGlmZiA9IHN1YiBoaSBsbyBpblxuICAgICAgaWYgZGlmZiA9IG1heF9pbnRcbiAgICAgIHRoZW4gYWRkIGxvIChsb2dhbmQgKGZ1bGxfcmFuZ2VfbmF0aXZlaW50IHN0YXRlKSBtYXhfaW50KVxuICAgICAgZWxzZSBpZiBkaWZmID49IDBuXG4gICAgICB0aGVuIGFkZCBsbyAobmF0aXZlaW50IHN0YXRlIChzdWNjIGRpZmYpKVxuICAgICAgZWxzZSBpbl9yYW5nZSBzdGF0ZSBsbyBoaVxuICA7O1xuXG4gIGxldCBpbnQ2NF9pbmNsID1cbiAgICBsZXQgb3BlbiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgICBsZXQgcmVjIGluX3JhbmdlIHN0YXRlIGxvIGhpID1cbiAgICAgIGxldCBpbnQgPSBmdWxsX3JhbmdlX2ludDY0IHN0YXRlIGluXG4gICAgICBpZiBpbnQgPj0gbG8gJiYgaW50IDw9IGhpIHRoZW4gaW50IGVsc2UgaW5fcmFuZ2Ugc3RhdGUgbG8gaGlcbiAgICBpblxuICAgIGxldCBvcGVuIENhbWwuSW50NjQgaW5cbiAgICBmdW4gc3RhdGUgbG8gaGkgLT5cbiAgICAgIGlmIGxvID4gaGkgdGhlbiByYWlzZV9jcm9zc2VkX2JvdW5kcyBcImludDY0XCIgbG8gaGkgdG9fc3RyaW5nO1xuICAgICAgbGV0IGRpZmYgPSBzdWIgaGkgbG8gaW5cbiAgICAgIGlmIGRpZmYgPSBtYXhfaW50XG4gICAgICB0aGVuIGFkZCBsbyAobG9nYW5kIChmdWxsX3JhbmdlX2ludDY0IHN0YXRlKSBtYXhfaW50KVxuICAgICAgZWxzZSBpZiBkaWZmID49IDBMXG4gICAgICB0aGVuIGFkZCBsbyAoaW50NjQgc3RhdGUgKHN1Y2MgZGlmZikpXG4gICAgICBlbHNlIGluX3JhbmdlIHN0YXRlIGxvIGhpXG4gIDs7XG5cbiAgKCogUmV0dXJuIGEgdW5pZm9ybWx5IHJhbmRvbSBmbG9hdCBpbiBbMCwgMSkuICopXG4gIGxldCByZWMgcmF3ZmxvYXQgc3RhdGUgPVxuICAgIGxldCBvcGVuIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBpblxuICAgIGxldCBzY2FsZSA9IDB4MXAtMzAgaW5cbiAgICAoKiAyXi0zMCAqKVxuICAgIGxldCByMSA9IENhbWwuZmxvYXRfb2ZfaW50IChiaXRzIHN0YXRlKSBpblxuICAgIGxldCByMiA9IENhbWwuZmxvYXRfb2ZfaW50IChiaXRzIHN0YXRlKSBpblxuICAgIGxldCByZXN1bHQgPSAoKHIxICouIHNjYWxlKSArLiByMikgKi4gc2NhbGUgaW5cbiAgICAoKiBXaXRoIHZlcnkgc21hbGwgcHJvYmFiaWxpdHksIHJlc3VsdCBjYW4gcm91bmQgdXAgdG8gMS4wLCBzbyBpbiB0aGF0IGNhc2UsIHdlIGp1c3RcbiAgICAgICB0cnkgYWdhaW4uICopXG4gICAgaWYgcmVzdWx0IDwgMS4wIHRoZW4gcmVzdWx0IGVsc2UgcmF3ZmxvYXQgc3RhdGVcbiAgOztcblxuICBsZXQgZmxvYXQgc3RhdGUgaGkgPSByYXdmbG9hdCBzdGF0ZSAqLiBoaVxuXG4gIGxldCBmbG9hdF9yYW5nZSBzdGF0ZSBsbyBoaSA9XG4gICAgbGV0IG9wZW4gRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgaWYgbG8gPiBoaSB0aGVuIHJhaXNlX2Nyb3NzZWRfYm91bmRzIFwiZmxvYXRcIiBsbyBoaSBDYW1sLnN0cmluZ19vZl9mbG9hdDtcbiAgICBsbyArLiBmbG9hdCBzdGF0ZSAoaGkgLS4gbG8pXG4gIDs7XG5lbmRcblxubGV0IGRlZmF1bHQgPSBSYW5kb21fcmVwci5tYWtlX2RlZmF1bHQgU3RhdGUuZGVmYXVsdFxuXG5sZXQgYml0cyAoKSA9IFN0YXRlLmJpdHMgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KVxubGV0IGludCB4ID0gU3RhdGUuaW50IChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeFxubGV0IGludDMyIHggPSBTdGF0ZS5pbnQzMiAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHhcbmxldCBuYXRpdmVpbnQgeCA9IFN0YXRlLm5hdGl2ZWludCAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHhcbmxldCBpbnQ2NCB4ID0gU3RhdGUuaW50NjQgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4XG5sZXQgZmxvYXQgeCA9IFN0YXRlLmZsb2F0IChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeFxubGV0IGludF9pbmNsIHggeSA9IFN0YXRlLmludF9pbmNsIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeCB5XG5sZXQgaW50MzJfaW5jbCB4IHkgPSBTdGF0ZS5pbnQzMl9pbmNsIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdCkgeCB5XG5sZXQgbmF0aXZlaW50X2luY2wgeCB5ID0gU3RhdGUubmF0aXZlaW50X2luY2wgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4IHlcbmxldCBpbnQ2NF9pbmNsIHggeSA9IFN0YXRlLmludDY0X2luY2wgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSB4IHlcbmxldCBmbG9hdF9yYW5nZSB4IHkgPSBTdGF0ZS5mbG9hdF9yYW5nZSAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpIHggeVxubGV0IGJvb2wgKCkgPSBTdGF0ZS5ib29sIChSYW5kb21fcmVwci5nZXRfc3RhdGUgZGVmYXVsdClcbmxldCBjaGFyICgpID0gU3RhdGUuY2hhciAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpXG5sZXQgYXNjaWkgKCkgPSBTdGF0ZS5hc2NpaSAoUmFuZG9tX3JlcHIuZ2V0X3N0YXRlIGRlZmF1bHQpXG5sZXQgZnVsbF9pbml0IHNlZWQgPSBTdGF0ZS5mdWxsX2luaXQgKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSBzZWVkXG5sZXQgaW5pdCBzZWVkID0gZnVsbF9pbml0IFt8IHNlZWQgfF1cbmxldCBzZWxmX2luaXQgP2FsbG93X2luX3Rlc3RzICgpID0gZnVsbF9pbml0IChyYW5kb21fc2VlZCA/YWxsb3dfaW5fdGVzdHMgKCkpXG5sZXQgc2V0X3N0YXRlIHMgPSBTdGF0ZS5hc3NpZ24gKFJhbmRvbV9yZXByLmdldF9zdGF0ZSBkZWZhdWx0KSBzXG4iLCIoKiogQW4gaW50ZXJuYWwtb25seSBtb2R1bGUgZmFjdG9yZWQgb3V0IGR1ZSB0byBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBjb3JlX2FycmF5XG4gICAgYW5kIGNvcmVfbGlzdC4gIENvbnRhaW5zIGNvZGUgZm9yIHBlcm11dGluZyBhbiBhcnJheS4gKilcblxub3BlbiEgSW1wb3J0XG5pbmNsdWRlIEFycmF5MFxuXG5sZXQgcGVybXV0ZSA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSA/KHBvcyA9IDApID9sZW4gdCA9XG4gICgqIENvcGllZCBmcm9tIFtPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uMF0gdG8gYXZvaWQgYWxsb2NhdGluZyBhIHR1cGxlIHdoZW4gY29tcGlsaW5nXG4gICAgIHdpdGhvdXQgZmxhbWJkYS4gKilcbiAgbGV0IHRvdGFsX2xlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGxldCBsZW4gPVxuICAgIG1hdGNoIGxlbiB3aXRoXG4gICAgfCBTb21lIGwgLT4gbFxuICAgIHwgTm9uZSAtPiB0b3RhbF9sZW5ndGggLSBwb3NcbiAgaW5cbiAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbjAuY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGg7XG4gIGxldCBudW1fc3dhcHMgPSBsZW4gLSAxIGluXG4gIGZvciBpID0gbnVtX3N3YXBzIGRvd250byAxIGRvXG4gICAgbGV0IHRoaXNfaSA9IHBvcyArIGkgaW5cbiAgICAoKiBbcmFuZG9tX2ldIGlzIGRyYXduIGZyb20gW3Bvcyx0aGlzX2ldICopXG4gICAgbGV0IHJhbmRvbV9pID0gcG9zICsgUmFuZG9tLlN0YXRlLmludCByYW5kb21fc3RhdGUgKGkgKyAxKSBpblxuICAgIHN3YXAgdCB0aGlzX2kgcmFuZG9tX2lcbiAgZG9uZVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgY29uc3QgYyBfID0gY1xuXG5leHRlcm5hbCBpZ25vcmUgOiBfIC0+IHVuaXQgPSBcIiVpZ25vcmVcIlxuXG4oKiB0aGlzIGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyBbQ2FtbC5pZ25vcmVdICopXG5cbmxldCBub24gZiB4ID0gbm90IChmIHgpXG5cbmxldCBmb3JldmVyIGYgPVxuICBsZXQgcmVjIGZvcmV2ZXIgKCkgPVxuICAgIGYgKCk7XG4gICAgZm9yZXZlciAoKVxuICBpblxuICB0cnkgZm9yZXZlciAoKSB3aXRoXG4gIHwgZSAtPiBlXG47O1xuXG5leHRlcm5hbCBpZCA6ICdhIC0+ICdhID0gXCIlaWRlbnRpdHlcIlxuZXh0ZXJuYWwgKCB8PiApIDogJ2EgLT4gKCdhIC0+ICdiKSAtPiAnYiA9IFwiJXJldmFwcGx5XCJcblxuKCogVGhlIHR5cGljYWwgdXNlIGNhc2UgZm9yIHRoZXNlIGZ1bmN0aW9ucyBpcyB0byBwYXNzIGluIGZ1bmN0aW9uYWwgYXJndW1lbnRzIGFuZCBnZXRcbiAgIGZ1bmN0aW9ucyBhcyBhIHJlc3VsdC4gKilcbmxldCBjb21wb3NlIGYgZyB4ID0gZiAoZyB4KVxubGV0IGZsaXAgZiB4IHkgPSBmIHkgeFxubGV0IHJlYyBhcHBseV9uX3RpbWVzIH5uIGYgeCA9IGlmIG4gPD0gMCB0aGVuIHggZWxzZSBhcHBseV9uX3RpbWVzIH5uOihuIC0gMSkgZiAoZiB4KVxuIiwib3BlbiEgSW1wb3J0XG5cbnR5cGUgdCA9XG4gIHwgTGVzc1xuICB8IEVxdWFsXG4gIHwgR3JlYXRlclxuW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIGVudW1lcmF0ZSwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG5cbmxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgKGZ1biBoc3YgYXJnIC0+XG4gICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgIHwgTGVzcyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDBcbiAgICAgfCBFcXVhbCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDFcbiAgICAgfCBHcmVhdGVyIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMlxuICAgICAgICAgICAgICAgICAgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG47O1xuXG5sZXQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gIGxldCBmdW5jIGFyZyA9XG4gICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICBoYXNoX2ZvbGRfdCBoc3YgYXJnKVxuICBpblxuICBmdW4geCAtPiBmdW5jIHhcbjs7XG5cbmxldCBhbGwgPSAoWyBMZXNzOyBFcXVhbDsgR3JlYXRlciBdIDogdCBsaXN0KVxuXG5sZXQgdF9vZl9zZXhwID1cbiAgKGxldCBlcnJvcl9zb3VyY2VfXzAwNV8gPSBcIm9yZGVyaW5nLm1sLnRcIiBpblxuICAgZnVuY3Rpb25cbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImxlc3NcIiB8IFwiTGVzc1wiKSAtPiBMZXNzXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJlcXVhbFwiIHwgXCJFcXVhbFwiKSAtPiBFcXVhbFxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiZ3JlYXRlclwiIHwgXCJHcmVhdGVyXCIpIC0+IEdyZWF0ZXJcbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibGVzc1wiIHwgXCJMZXNzXCIpIDo6IF8pIGFzIHNleHBfXzAwNl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA2X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJlcXVhbFwiIHwgXCJFcXVhbFwiKSA6OiBfKSBhcyBzZXhwX18wMDZfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDVfIHNleHBfXzAwNl9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiZ3JlYXRlclwiIHwgXCJHcmVhdGVyXCIpIDo6IF8pIGFzIHNleHBfXzAwNl8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA2X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDRfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA1XyBzZXhwX18wMDRfXG4gICB8IHNleHBfXzAwNF8gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwNV8gc2V4cF9fMDA0X1xuICAgICAgICAgICAgICAgICAgIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG47O1xuXG5sZXQgc2V4cF9vZl90ID1cbiAgKGZ1bmN0aW9uXG4gICAgfCBMZXNzIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkxlc3NcIlxuICAgIHwgRXF1YWwgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiRXF1YWxcIlxuICAgIHwgR3JlYXRlciAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJHcmVhdGVyXCJcbiAgICAgICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnIHsgbmFtZSA9IFwiTGVzc1wiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiRXF1YWxcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIkdyZWF0ZXJcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxuW0BAQGVuZF1cblxubGV0IGVxdWFsIGEgYiA9IGNvbXBhcmUgYSBiID0gMFxuXG5tb2R1bGUgRXhwb3J0ID0gc3RydWN0XG4gIHR5cGUgX29yZGVyaW5nID0gdCA9XG4gICAgfCBMZXNzXG4gICAgfCBFcXVhbFxuICAgIHwgR3JlYXRlclxuZW5kXG5cbmxldCBvZl9pbnQgbiA9IGlmIG4gPCAwIHRoZW4gTGVzcyBlbHNlIGlmIG4gPSAwIHRoZW4gRXF1YWwgZWxzZSBHcmVhdGVyXG5cbmxldCB0b19pbnQgPSBmdW5jdGlvblxuICB8IExlc3MgLT4gLTFcbiAgfCBFcXVhbCAtPiAwXG4gIHwgR3JlYXRlciAtPiAxXG47O1xuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbm1vZHVsZSBFaXRoZXIgPSBFaXRoZXIwXG5cblxuaW5jbHVkZSBMaXN0MVxuXG4oKiBUaGlzIGl0c2VsZiBpbmNsdWRlcyBbTGlzdDBdLiAqKVxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSAnYSBsaXN0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9IGxpc3Rfb2Zfc2V4cFxuICBsZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID0gc2V4cF9vZl9saXN0XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBsaXN0X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgT3JfdW5lcXVhbF9sZW5ndGhzID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9XG4gICAgfCBPayBvZiAnYVxuICAgIHwgVW5lcXVhbF9sZW5ndGhzXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gIGxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPVxuICAgIGZ1biBfY21wX19hIGFfXzAwNl8gYl9fMDA3XyAtPlxuICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwNl8gYl9fMDA3X1xuICAgIHRoZW4gMFxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggYV9fMDA2XywgYl9fMDA3XyB3aXRoXG4gICAgICB8IE9rIF9hX18wMDhfLCBPayBfYl9fMDA5XyAtPiBfY21wX19hIF9hX18wMDhfIF9iX18wMDlfXG4gICAgICB8IE9rIF8sIF8gLT4gLTFcbiAgICAgIHwgXywgT2sgXyAtPiAxXG4gICAgICB8IFVuZXF1YWxfbGVuZ3RocywgVW5lcXVhbF9sZW5ndGhzIC0+IDApXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgZnVuICh0eXBlIGFfXzAxM18pIDogKChhX18wMTNfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gYV9fMDEzXyB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICBmdW4gX29mX2FfXzAxMF8gLT4gZnVuY3Rpb25cbiAgICAgIHwgT2sgYXJnMF9fMDExXyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDEyXyA9IF9vZl9hX18wMTBfIGFyZzBfXzAxMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiT2tcIjsgcmVzMF9fMDEyXyBdXG4gICAgICB8IFVuZXF1YWxfbGVuZ3RocyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJVbmVxdWFsX2xlbmd0aHNcIlxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxuaW5jbHVkZSBUXG5cbmxldCBpbnZhcmlhbnQgZiB0ID0gaXRlciB0IH5mXG5sZXQgb2ZfbGlzdCB0ID0gdFxuXG5sZXQgcmFuZ2UnIH5jb21wYXJlIH5zdHJpZGUgPyhzdGFydCA9IGBpbmNsdXNpdmUpID8oc3RvcCA9IGBleGNsdXNpdmUpIHN0YXJ0X2kgc3RvcF9pID1cbiAgbGV0IG5leHRfaSA9IHN0cmlkZSBzdGFydF9pIGluXG4gIGxldCBvcmRlciB4IHkgPSBPcmRlcmluZy5vZl9pbnQgKGNvbXBhcmUgeCB5KSBpblxuICBsZXQgcmFpc2Vfc3RyaWRlX2Nhbm5vdF9yZXR1cm5fc2FtZV92YWx1ZSAoKSA9XG4gICAgaW52YWxpZF9hcmcgXCJMaXN0LnJhbmdlJzogc3RyaWRlIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gdGhlIHNhbWUgdmFsdWVcIlxuICBpblxuICBsZXQgaW5pdGlhbF9zdHJpZGVfb3JkZXIgPVxuICAgIG1hdGNoIG9yZGVyIHN0YXJ0X2kgbmV4dF9pIHdpdGhcbiAgICB8IEVxdWFsIC0+IHJhaXNlX3N0cmlkZV9jYW5ub3RfcmV0dXJuX3NhbWVfdmFsdWUgKClcbiAgICB8IExlc3MgLT4gYExlc3NcbiAgICB8IEdyZWF0ZXIgLT4gYEdyZWF0ZXJcbiAgaW5cbiAgbGV0IHJlYyBsb29wIGkgYWNjdW0gPVxuICAgIGxldCBpX3RvX3N0b3Bfb3JkZXIgPSBvcmRlciBpIHN0b3BfaSBpblxuICAgIG1hdGNoIGlfdG9fc3RvcF9vcmRlciwgaW5pdGlhbF9zdHJpZGVfb3JkZXIgd2l0aFxuICAgIHwgTGVzcywgYExlc3MgfCBHcmVhdGVyLCBgR3JlYXRlciAtPlxuICAgICAgKCogaGF2ZW4ndCB5ZXQgcmVhY2hlZCBbc3RvcF9pXS4gQ29udGludWUuICopXG4gICAgICBsZXQgbmV4dF9pID0gc3RyaWRlIGkgaW5cbiAgICAgIChtYXRjaCBvcmRlciBpIG5leHRfaSwgaW5pdGlhbF9zdHJpZGVfb3JkZXIgd2l0aFxuICAgICAgIHwgRXF1YWwsIF8gLT4gcmFpc2Vfc3RyaWRlX2Nhbm5vdF9yZXR1cm5fc2FtZV92YWx1ZSAoKVxuICAgICAgIHwgTGVzcywgYEdyZWF0ZXIgfCBHcmVhdGVyLCBgTGVzcyAtPlxuICAgICAgICAgaW52YWxpZF9hcmcgXCJMaXN0LnJhbmdlJzogc3RyaWRlIGZ1bmN0aW9uIGNhbm5vdCBjaGFuZ2UgZGlyZWN0aW9uXCJcbiAgICAgICB8IExlc3MsIGBMZXNzIHwgR3JlYXRlciwgYEdyZWF0ZXIgLT4gbG9vcCBuZXh0X2kgKGkgOjogYWNjdW0pKVxuICAgIHwgTGVzcywgYEdyZWF0ZXIgfCBHcmVhdGVyLCBgTGVzcyAtPlxuICAgICAgKCogc3RlcHBlZCBwYXN0IFtzdG9wX2ldLiAgRmluaXNoZWQuICopXG4gICAgICBhY2N1bVxuICAgIHwgRXF1YWwsIF8gLT5cbiAgICAgICgqIHJlYWNoZWQgW3N0b3BfaV0uICBGaW5pc2hlZC4gKilcbiAgICAgIChtYXRjaCBzdG9wIHdpdGhcbiAgICAgICB8IGBpbmNsdXNpdmUgLT4gaSA6OiBhY2N1bVxuICAgICAgIHwgYGV4Y2x1c2l2ZSAtPiBhY2N1bSlcbiAgaW5cbiAgbGV0IHN0YXJ0X2kgPVxuICAgIG1hdGNoIHN0YXJ0IHdpdGhcbiAgICB8IGBpbmNsdXNpdmUgLT4gc3RhcnRfaVxuICAgIHwgYGV4Y2x1c2l2ZSAtPiBuZXh0X2lcbiAgaW5cbiAgcmV2IChsb29wIHN0YXJ0X2kgW10pXG47O1xuXG5sZXQgcmFuZ2UgPyhzdHJpZGUgPSAxKSA/KHN0YXJ0ID0gYGluY2x1c2l2ZSkgPyhzdG9wID0gYGV4Y2x1c2l2ZSkgc3RhcnRfaSBzdG9wX2kgPVxuICBpZiBzdHJpZGUgPSAwIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LnJhbmdlOiBzdHJpZGUgbXVzdCBiZSBub24temVyb1wiO1xuICByYW5nZScgfmNvbXBhcmUgfnN0cmlkZTooZnVuIHggLT4geCArIHN0cmlkZSkgfnN0YXJ0IH5zdG9wIHN0YXJ0X2kgc3RvcF9pXG47O1xuXG5sZXQgaGQgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCB4IDo6IF8gLT4gU29tZSB4XG47O1xuXG5sZXQgdGwgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCBfIDo6IHQnIC0+IFNvbWUgdCdcbjs7XG5cbmxldCBudGggdCBuID1cbiAgaWYgbiA8IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCByZWMgbnRoX2F1eCB0IG4gPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IFtdIC0+IE5vbmVcbiAgICAgIHwgYSA6OiB0IC0+IGlmIG4gPSAwIHRoZW4gU29tZSBhIGVsc2UgbnRoX2F1eCB0IChuIC0gMSlcbiAgICBpblxuICAgIG50aF9hdXggdCBuKVxuOztcblxubGV0IG50aF9leG4gdCBuID1cbiAgbWF0Y2ggbnRoIHQgbiB3aXRoXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZ2YgXCJMaXN0Lm50aF9leG4gJWQgY2FsbGVkIG9uIGxpc3Qgb2YgbGVuZ3RoICVkXCIgbiAobGVuZ3RoIHQpICgpXG4gIHwgU29tZSBhIC0+IGFcbjs7XG5cbmxldCB1bm9yZGVyZWRfYXBwZW5kIGwxIGwyID1cbiAgbWF0Y2ggbDEsIGwyIHdpdGhcbiAgfCBbXSwgbCB8IGwsIFtdIC0+IGxcbiAgfCBfIC0+IHJldl9hcHBlbmQgbDEgbDJcbjs7XG5cbm1vZHVsZSBDaGVja19sZW5ndGgyID0gc3RydWN0XG4gIHR5cGUgKCdhLCAnYikgdCA9XG4gICAgfCBTYW1lX2xlbmd0aCBvZiBpbnRcbiAgICB8IFVuZXF1YWxfbGVuZ3RocyBvZlxuICAgICAgICB7IHNoYXJlZF9sZW5ndGggOiBpbnRcbiAgICAgICAgOyB0YWlsX29mX2EgOiAnYSBsaXN0XG4gICAgICAgIDsgdGFpbF9vZl9iIDogJ2IgbGlzdFxuICAgICAgICB9XG5cbiAgKCogSW4gdGhlIFtVbmVxdWFsX2xlbmd0aHNdIGNhc2UsIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGFpbHMgd2lsbCBiZSBub24tZW1wdHkuICopXG4gIGxldCBvZl9saXN0cyBsMSBsMiA9XG4gICAgbGV0IHJlYyBsb29wIGEgYiBzaGFyZWRfbGVuZ3RoID1cbiAgICAgIG1hdGNoIGEsIGIgd2l0aFxuICAgICAgfCBbXSwgW10gLT4gU2FtZV9sZW5ndGggc2hhcmVkX2xlbmd0aFxuICAgICAgfCBfIDo6IGEsIF8gOjogYiAtPiBsb29wIGEgYiAoc2hhcmVkX2xlbmd0aCArIDEpXG4gICAgICB8IFtdLCBfIHwgXywgW10gLT4gVW5lcXVhbF9sZW5ndGhzIHsgc2hhcmVkX2xlbmd0aDsgdGFpbF9vZl9hID0gYTsgdGFpbF9vZl9iID0gYiB9XG4gICAgaW5cbiAgICBsb29wIGwxIGwyIDBcbiAgOztcbmVuZFxuXG5sZXQgY2hlY2tfbGVuZ3RoMl9leG4gbmFtZSBsMSBsMiA9XG4gIG1hdGNoIENoZWNrX2xlbmd0aDIub2ZfbGlzdHMgbDEgbDIgd2l0aFxuICB8IFNhbWVfbGVuZ3RoIF8gLT4gKClcbiAgfCBVbmVxdWFsX2xlbmd0aHMgeyBzaGFyZWRfbGVuZ3RoOyB0YWlsX29mX2E7IHRhaWxfb2ZfYiB9IC0+XG4gICAgaW52YWxpZF9hcmdmXG4gICAgICBcImxlbmd0aCBtaXNtYXRjaCBpbiAlczogJWQgPD4gJWRcIlxuICAgICAgbmFtZVxuICAgICAgKHNoYXJlZF9sZW5ndGggKyBsZW5ndGggdGFpbF9vZl9hKVxuICAgICAgKHNoYXJlZF9sZW5ndGggKyBsZW5ndGggdGFpbF9vZl9iKVxuICAgICAgKClcbjs7XG5cbmxldCBjaGVja19sZW5ndGgyIGwxIGwyIH5mID1cbiAgbWF0Y2ggQ2hlY2tfbGVuZ3RoMi5vZl9saXN0cyBsMSBsMiB3aXRoXG4gIHwgU2FtZV9sZW5ndGggXyAtPiBPcl91bmVxdWFsX2xlbmd0aHMuT2sgKGYgbDEgbDIpXG4gIHwgVW5lcXVhbF9sZW5ndGhzIF8gLT4gVW5lcXVhbF9sZW5ndGhzXG47O1xuXG5tb2R1bGUgQ2hlY2tfbGVuZ3RoMyA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IsICdjKSB0ID1cbiAgICB8IFNhbWVfbGVuZ3RoIG9mIGludFxuICAgIHwgVW5lcXVhbF9sZW5ndGhzIG9mXG4gICAgICAgIHsgc2hhcmVkX2xlbmd0aCA6IGludFxuICAgICAgICA7IHRhaWxfb2ZfYSA6ICdhIGxpc3RcbiAgICAgICAgOyB0YWlsX29mX2IgOiAnYiBsaXN0XG4gICAgICAgIDsgdGFpbF9vZl9jIDogJ2MgbGlzdFxuICAgICAgICB9XG5cbiAgKCogSW4gdGhlIFtVbmVxdWFsX2xlbmd0aHNdIGNhc2UsIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGFpbHMgd2lsbCBiZSBub24tZW1wdHkuICopXG4gIGxldCBvZl9saXN0cyBsMSBsMiBsMyA9XG4gICAgbGV0IHJlYyBsb29wIGEgYiBjIHNoYXJlZF9sZW5ndGggPVxuICAgICAgbWF0Y2ggYSwgYiwgYyB3aXRoXG4gICAgICB8IFtdLCBbXSwgW10gLT4gU2FtZV9sZW5ndGggc2hhcmVkX2xlbmd0aFxuICAgICAgfCBfIDo6IGEsIF8gOjogYiwgXyA6OiBjIC0+IGxvb3AgYSBiIGMgKHNoYXJlZF9sZW5ndGggKyAxKVxuICAgICAgfCBbXSwgXywgXyB8IF8sIFtdLCBfIHwgXywgXywgW10gLT5cbiAgICAgICAgVW5lcXVhbF9sZW5ndGhzIHsgc2hhcmVkX2xlbmd0aDsgdGFpbF9vZl9hID0gYTsgdGFpbF9vZl9iID0gYjsgdGFpbF9vZl9jID0gYyB9XG4gICAgaW5cbiAgICBsb29wIGwxIGwyIGwzIDBcbiAgOztcbmVuZFxuXG5sZXQgY2hlY2tfbGVuZ3RoM19leG4gbmFtZSBsMSBsMiBsMyA9XG4gIG1hdGNoIENoZWNrX2xlbmd0aDMub2ZfbGlzdHMgbDEgbDIgbDMgd2l0aFxuICB8IFNhbWVfbGVuZ3RoIF8gLT4gKClcbiAgfCBVbmVxdWFsX2xlbmd0aHMgeyBzaGFyZWRfbGVuZ3RoOyB0YWlsX29mX2E7IHRhaWxfb2ZfYjsgdGFpbF9vZl9jIH0gLT5cbiAgICBsZXQgbjEgPSBzaGFyZWRfbGVuZ3RoICsgbGVuZ3RoIHRhaWxfb2ZfYSBpblxuICAgIGxldCBuMiA9IHNoYXJlZF9sZW5ndGggKyBsZW5ndGggdGFpbF9vZl9iIGluXG4gICAgbGV0IG4zID0gc2hhcmVkX2xlbmd0aCArIGxlbmd0aCB0YWlsX29mX2MgaW5cbiAgICBpbnZhbGlkX2FyZ2YgXCJsZW5ndGggbWlzbWF0Y2ggaW4gJXM6ICVkIDw+ICVkIHx8ICVkIDw+ICVkXCIgbmFtZSBuMSBuMiBuMiBuMyAoKVxuOztcblxubGV0IGNoZWNrX2xlbmd0aDMgbDEgbDIgbDMgfmYgPVxuICBtYXRjaCBDaGVja19sZW5ndGgzLm9mX2xpc3RzIGwxIGwyIGwzIHdpdGhcbiAgfCBTYW1lX2xlbmd0aCBfIC0+IE9yX3VuZXF1YWxfbGVuZ3Rocy5PayAoZiBsMSBsMiBsMylcbiAgfCBVbmVxdWFsX2xlbmd0aHMgXyAtPiBVbmVxdWFsX2xlbmd0aHNcbjs7XG5cbmxldCBpdGVyMiBsMSBsMiB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KGl0ZXIyX29rIH5mKVxuXG5sZXQgaXRlcjJfZXhuIGwxIGwyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJpdGVyMl9leG5cIiBsMSBsMjtcbiAgaXRlcjJfb2sgbDEgbDIgfmZcbjs7XG5cbmxldCByZXZfbWFwMiBsMSBsMiB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KHJldl9tYXAyX29rIH5mKVxuXG5sZXQgcmV2X21hcDJfZXhuIGwxIGwyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJyZXZfbWFwMl9leG5cIiBsMSBsMjtcbiAgcmV2X21hcDJfb2sgbDEgbDIgfmZcbjs7XG5cbmxldCBmb2xkMiBsMSBsMiB+aW5pdCB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KGZvbGQyX29rIH5pbml0IH5mKVxuXG5sZXQgZm9sZDJfZXhuIGwxIGwyIH5pbml0IH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJmb2xkMl9leG5cIiBsMSBsMjtcbiAgZm9sZDJfb2sgbDEgbDIgfmluaXQgfmZcbjs7XG5cbmxldCBmb3JfYWxsMiBsMSBsMiB+ZiA9IGNoZWNrX2xlbmd0aDIgbDEgbDIgfmY6KGZvcl9hbGwyX29rIH5mKVxuXG5sZXQgZm9yX2FsbDJfZXhuIGwxIGwyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJmb3JfYWxsMl9leG5cIiBsMSBsMjtcbiAgZm9yX2FsbDJfb2sgbDEgbDIgfmZcbjs7XG5cbmxldCBleGlzdHMyIGwxIGwyIH5mID0gY2hlY2tfbGVuZ3RoMiBsMSBsMiB+ZjooZXhpc3RzMl9vayB+ZilcblxubGV0IGV4aXN0czJfZXhuIGwxIGwyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJleGlzdHMyX2V4blwiIGwxIGwyO1xuICBleGlzdHMyX29rIGwxIGwyIH5mXG47O1xuXG5sZXQgbWVtIHQgYSB+ZXF1YWwgPVxuICBsZXQgcmVjIGxvb3AgZXF1YWwgYSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBmYWxzZVxuICAgIHwgYiA6OiBicyAtPiBlcXVhbCBhIGIgfHwgbG9vcCBlcXVhbCBhIGJzXG4gIGluXG4gIGxvb3AgZXF1YWwgYSB0XG47O1xuXG4oKiBUaGlzIGlzIGEgY29weSBvZiB0aGUgY29kZSBmcm9tIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCB3aXRoIGFuIGV4dHJhIGV0YS1leHBhbnNpb24gdG9cbiAgIGF2b2lkIGNyZWF0aW5nIHBhcnRpYWwgY2xvc3VyZXMgKHNob3dlZCB1cCBmb3IgW2ZpbHRlcl0pIGluIHByb2ZpbGluZykuICopXG5sZXQgcmV2X2ZpbHRlciB0IH5mID1cbiAgbGV0IHJlYyBmaW5kIH5mIGFjY3UgPSBmdW5jdGlvblxuICAgIHwgW10gLT4gYWNjdVxuICAgIHwgeCA6OiBsIC0+IGlmIGYgeCB0aGVuIGZpbmQgfmYgKHggOjogYWNjdSkgbCBlbHNlIGZpbmQgfmYgYWNjdSBsXG4gIGluXG4gIGZpbmQgfmYgW10gdFxuOztcblxubGV0IGZpbHRlciB0IH5mID0gcmV2IChyZXZfZmlsdGVyIHQgfmYpXG5cbmxldCBmaW5kX21hcCB0IH5mID1cbiAgbGV0IHJlYyBsb29wID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IHggOjogbCAtPlxuICAgICAgKG1hdGNoIGYgeCB3aXRoXG4gICAgICAgfCBOb25lIC0+IGxvb3AgbFxuICAgICAgIHwgU29tZSBfIGFzIHIgLT4gcilcbiAgaW5cbiAgbG9vcCB0XG47O1xuXG5sZXQgZmluZF9tYXBfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiTGlzdC5maW5kX21hcF9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgZmluZF9tYXBfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmRfbWFwIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IFNvbWUgeCAtPiB4XG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9tYXBfZXhuXG47O1xuXG5sZXQgZmluZCB0IH5mID1cbiAgbGV0IHJlYyBsb29wID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IE5vbmVcbiAgICB8IHggOjogbCAtPiBpZiBmIHggdGhlbiBTb21lIHggZWxzZSBsb29wIGxcbiAgaW5cbiAgbG9vcCB0XG47O1xuXG5sZXQgZmluZF9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJMaXN0LmZpbmRfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IHJlYyBmaW5kX2V4biB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgeCA6OiB0IC0+IGlmIGYgeCB0aGVuIHggZWxzZSBmaW5kX2V4biB0IH5mXG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9leG5cbjs7XG5cbmxldCBmaW5kaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIGkgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiBOb25lXG4gICAgfCB4IDo6IGwgLT4gaWYgZiBpIHggdGhlbiBTb21lIChpLCB4KSBlbHNlIGxvb3AgKGkgKyAxKSBsXG4gIGluXG4gIGxvb3AgMCB0XG47O1xuXG5sZXQgZmluZGlfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiTGlzdC5maW5kaV9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgZmluZGlfZXhuIHQgfmYgPVxuICAgIG1hdGNoIGZpbmRpIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IFNvbWUgeCAtPiB4XG4gIGluXG4gIGZpbmRpX2V4blxuOztcblxubGV0IGZpbmRfbWFwaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIGkgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiBOb25lXG4gICAgfCB4IDo6IGwgLT5cbiAgICAgIChtYXRjaCBmIGkgeCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgcmVzdWx0IC0+IHJlc3VsdFxuICAgICAgIHwgTm9uZSAtPiBsb29wIChpICsgMSkgbClcbiAgaW5cbiAgbG9vcCAwIHRcbjs7XG5cbmxldCBmaW5kX21hcGlfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiTGlzdC5maW5kX21hcGlfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGZpbmRfbWFwaV9leG4gdCB+ZiA9XG4gICAgbWF0Y2ggZmluZF9tYXBpIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICB8IFNvbWUgeCAtPiB4XG4gIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9tYXBpX2V4blxuOztcblxubGV0IGZvcl9hbGxpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IHRydWVcbiAgICB8IGhkIDo6IHRsIC0+IGYgaSBoZCAmJiBsb29wIChpICsgMSkgdGxcbiAgaW5cbiAgbG9vcCAwIHRcbjs7XG5cbmxldCBleGlzdHNpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgaSB0ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IFtdIC0+IGZhbHNlXG4gICAgfCBoZCA6OiB0bCAtPiBmIGkgaGQgfHwgbG9vcCAoaSArIDEpIHRsXG4gIGluXG4gIGxvb3AgMCB0XG47O1xuXG4oKiogRm9yIHRoZSBjb250YWluZXIgaW50ZXJmYWNlLiAqKVxubGV0IGZvbGRfbGVmdCA9IGZvbGRcblxubGV0IHRvX2FycmF5ID0gQXJyYXkub2ZfbGlzdFxubGV0IHRvX2xpc3QgdCA9IHRcblxubGV0IG1heF9ub25fdGFpbGNhbGwgPVxuICBtYXRjaCBTeXMuYmFja2VuZF90eXBlIHdpdGhcbiAgfCBTeXMuTmF0aXZlIHwgU3lzLkJ5dGVjb2RlIC0+IDFfMDAwXG4gICgqIFdlIGRvbid0IGtub3cgdGhlIHNpemUgb2YgdGhlIHN0YWNrLCBiZXR0ZXIgYmUgc2FmZSBhbmQgYXNzdW1lIGl0J3Mgc21hbGwuIFRoaXNcbiAgICAgbnVtYmVyIHdhcyB0YWtlbiBmcm9tIG9jYW1sI3N0ZGxpYi9saXN0Lm1sIHdoaWNoIGlzIGFsc28gZXF1YWwgdG8gdGhlIGRlZmF1bHQgbGltaXRcbiAgICAgb2YgcmVjdXJzaXZlIGNhbGwgaW4gdGhlIGpzX29mX29jYW1sIGNvbXBpbGVyIGJlZm9yZSBzd2l0Y2hpbmcgdG8gdHJhbXBvbGluZS4gKilcbiAgfCBTeXMuT3RoZXIgXyAtPiA1MFxuOztcblxuKCoqIFRhaWwgcmVjdXJzaXZlIHZlcnNpb25zIG9mIHN0YW5kYXJkIFtMaXN0XSBtb2R1bGUgKilcblxubGV0IHRhaWxfYXBwZW5kIGwxIGwyID0gcmV2X2FwcGVuZCAocmV2IGwxKSBsMlxuXG4oKiBUaGVyZSBhcmUgYSBmZXcgb3B0aW1pemVkIGxpc3Qgb3BlcmF0aW9ucyBoZXJlLCBpbmNsdWRpbmcgYXBwZW5kIGFuZCBtYXAuICBUaGVyZSBhcmVcbiAgIGJhc2ljYWxseSB0d28gb3B0aW1pemF0aW9ucyBpbiBwbGF5OiBsb29wIHVucm9sbGluZywgYW5kIGR5bmFtaWMgc3dpdGNoaW5nIGJldHdlZW5cbiAgIHN0YWNrIGFuZCBoZWFwIGFsbG9jYXRpb24uXG5cbiAgIFRoZSBsb29wLXVucm9sbGluZyBpcyBzdHJhaWdodGZvcndhcmQsIHdlIGp1c3QgdW5yb2xsIDUgbGV2ZWxzIG9mIHRoZSBsb29wLiAgVGhpcyBtYWtlc1xuICAgZWFjaCBpdGVyYXRpb24gZmFzdGVyLCBhbmQgYWxzbyByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc3RhY2sgZnJhbWVzIGNvbnN1bWVkIHBlciBsaXN0XG4gICBlbGVtZW50LlxuXG4gICBUaGUgZHluYW1pYyBzd2l0Y2hpbmcgaXMgZG9uZSBieSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHN0YWNrIGZyYW1lcywgYW5kIHRoZW5cbiAgIHN3aXRjaGluZyB0byB0aGUgXCJzbG93XCIgaW1wbGVtZW50YXRpb24gd2hlbiB3ZSBleGNlZWQgYSBnaXZlbiBsaW1pdC4gIFRoaXMgbWVhbnMgdGhhdFxuICAgc2hvcnQgbGlzdHMgdXNlIHRoZSBmYXN0IHN0YWNrLWFsbG9jYXRpb24gbWV0aG9kLCBhbmQgbG9uZyBsaXN0cyB1c2UgYSBzbG93ZXIgb25lIHRoYXRcbiAgIGRvZXNuJ3QgcmVxdWlyZSBzdGFjayBzcGFjZS4gKilcbmxldCByZWMgY291bnRfYXBwZW5kIGwxIGwyIGNvdW50ID1cbiAgbWF0Y2ggbDIgd2l0aFxuICB8IFtdIC0+IGwxXG4gIHwgXyAtPlxuICAgIChtYXRjaCBsMSB3aXRoXG4gICAgIHwgW10gLT4gbDJcbiAgICAgfCBbIHgxIF0gLT4geDEgOjogbDJcbiAgICAgfCBbIHgxOyB4MiBdIC0+IHgxIDo6IHgyIDo6IGwyXG4gICAgIHwgWyB4MTsgeDI7IHgzIF0gLT4geDEgOjogeDIgOjogeDMgOjogbDJcbiAgICAgfCBbIHgxOyB4MjsgeDM7IHg0IF0gLT4geDEgOjogeDIgOjogeDMgOjogeDQgOjogbDJcbiAgICAgfCB4MSA6OiB4MiA6OiB4MyA6OiB4NCA6OiB4NSA6OiB0bCAtPlxuICAgICAgIHgxXG4gICAgICAgOjogeDJcbiAgICAgICA6OiB4M1xuICAgICAgIDo6IHg0XG4gICAgICAgOjogeDVcbiAgICAgICA6OlxuICAgICAgIChpZiBjb3VudCA+IG1heF9ub25fdGFpbGNhbGxcbiAgICAgICAgdGhlbiB0YWlsX2FwcGVuZCB0bCBsMlxuICAgICAgICBlbHNlIGNvdW50X2FwcGVuZCB0bCBsMiAoY291bnQgKyAxKSkpXG47O1xuXG5sZXQgYXBwZW5kIGwxIGwyID0gY291bnRfYXBwZW5kIGwxIGwyIDBcblxuKCogQW4gb3JkaW5hcnkgdGFpbCByZWN1cnNpdmUgbWFwIGJ1aWxkcyB1cCBhbiBpbnRlcm1lZGlhdGUgKHJldmVyc2VkKSByZXByZXNlbnRhdGlvbixcbiAgIHdpdGggb25lIGhlYXAgYWxsb2NhdGVkIG9iamVjdCBwZXIgZWxlbWVudC4gVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkIGNodW5rc1xuICAgOSBvYmplY3RzIGludG8gb25lIGhlYXAgYWxsb2NhdGVkIG9iamVjdCwgcmVkdWNpbmcgYWxsb2NhdGlvbiBhbmQgcGVyZm9ybWFuY2UgY29zdHNcbiAgIGFjY29yZGluZ2x5LiBOb3RlIHRoYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBsaXN0IGlzIGRvbmUgYnkgdGhlIHN0ZGxpYidzIG1hcFxuICAgZnVuY3Rpb24uICopXG5sZXQgdGFpbF9tYXAgeHMgfmYgPVxuICBsZXQgcmVjIHJpc2UgeXMgPSBmdW5jdGlvblxuICAgIHwgW10gLT4geXNcbiAgICB8ICh5MCwgeTEsIHkyLCB5MywgeTQsIHk1LCB5NiwgeTcsIHk4KSA6OiBicyAtPlxuICAgICAgcmlzZSAoeTAgOjogeTEgOjogeTIgOjogeTMgOjogeTQgOjogeTUgOjogeTYgOjogeTcgOjogeTggOjogeXMpIGJzXG4gIGluXG4gIGxldCByZWMgZGl2ZSBicyA9IGZ1bmN0aW9uXG4gICAgfCB4MCA6OiB4MSA6OiB4MiA6OiB4MyA6OiB4NCA6OiB4NSA6OiB4NiA6OiB4NyA6OiB4OCA6OiB4cyAtPlxuICAgICAgbGV0IHkwID0gZiB4MCBpblxuICAgICAgbGV0IHkxID0gZiB4MSBpblxuICAgICAgbGV0IHkyID0gZiB4MiBpblxuICAgICAgbGV0IHkzID0gZiB4MyBpblxuICAgICAgbGV0IHk0ID0gZiB4NCBpblxuICAgICAgbGV0IHk1ID0gZiB4NSBpblxuICAgICAgbGV0IHk2ID0gZiB4NiBpblxuICAgICAgbGV0IHk3ID0gZiB4NyBpblxuICAgICAgbGV0IHk4ID0gZiB4OCBpblxuICAgICAgZGl2ZSAoKHkwLCB5MSwgeTIsIHkzLCB5NCwgeTUsIHk2LCB5NywgeTgpIDo6IGJzKSB4c1xuICAgIHwgeHMgLT4gcmlzZSAobm9udGFpbF9tYXAgfmYgeHMpIGJzXG4gIGluXG4gIGRpdmUgW10geHNcbjs7XG5cbmxldCByZWMgY291bnRfbWFwIH5mIGwgY3RyID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gW11cbiAgfCBbIHgxIF0gLT5cbiAgICBsZXQgZjEgPSBmIHgxIGluXG4gICAgWyBmMSBdXG4gIHwgWyB4MTsgeDIgXSAtPlxuICAgIGxldCBmMSA9IGYgeDEgaW5cbiAgICBsZXQgZjIgPSBmIHgyIGluXG4gICAgWyBmMTsgZjIgXVxuICB8IFsgeDE7IHgyOyB4MyBdIC0+XG4gICAgbGV0IGYxID0gZiB4MSBpblxuICAgIGxldCBmMiA9IGYgeDIgaW5cbiAgICBsZXQgZjMgPSBmIHgzIGluXG4gICAgWyBmMTsgZjI7IGYzIF1cbiAgfCBbIHgxOyB4MjsgeDM7IHg0IF0gLT5cbiAgICBsZXQgZjEgPSBmIHgxIGluXG4gICAgbGV0IGYyID0gZiB4MiBpblxuICAgIGxldCBmMyA9IGYgeDMgaW5cbiAgICBsZXQgZjQgPSBmIHg0IGluXG4gICAgWyBmMTsgZjI7IGYzOyBmNCBdXG4gIHwgeDEgOjogeDIgOjogeDMgOjogeDQgOjogeDUgOjogdGwgLT5cbiAgICBsZXQgZjEgPSBmIHgxIGluXG4gICAgbGV0IGYyID0gZiB4MiBpblxuICAgIGxldCBmMyA9IGYgeDMgaW5cbiAgICBsZXQgZjQgPSBmIHg0IGluXG4gICAgbGV0IGY1ID0gZiB4NSBpblxuICAgIGYxXG4gICAgOjogZjJcbiAgICA6OiBmM1xuICAgIDo6IGY0XG4gICAgOjogZjVcbiAgICA6OiAoaWYgY3RyID4gbWF4X25vbl90YWlsY2FsbCB0aGVuIHRhaWxfbWFwIH5mIHRsIGVsc2UgY291bnRfbWFwIH5mIHRsIChjdHIgKyAxKSlcbjs7XG5cbmxldCBtYXAgbCB+ZiA9IGNvdW50X21hcCB+ZiBsIDBcblxubGV0IGZvbGRpbmdfbWFwIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbWFwIHQgfmY6KGZ1biB4IC0+XG4gICAgbGV0IG5ld19hY2MsIHkgPSBmICFhY2MgeCBpblxuICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgIHkpXG47O1xuXG5sZXQgZm9sZF9tYXAgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBsZXQgcmVzdWx0ID1cbiAgICBtYXAgdCB+ZjooZnVuIHggLT5cbiAgICAgIGxldCBuZXdfYWNjLCB5ID0gZiAhYWNjIHggaW5cbiAgICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgICAgeSlcbiAgaW5cbiAgIWFjYywgcmVzdWx0XG47O1xuXG5sZXQgKCA+PnwgKSBsIGYgPSBtYXAgbCB+ZlxubGV0IG1hcDJfb2sgbDEgbDIgfmYgPSByZXYgKHJldl9tYXAyX29rIGwxIGwyIH5mKVxubGV0IG1hcDIgbDEgbDIgfmYgPSBjaGVja19sZW5ndGgyIGwxIGwyIH5mOihtYXAyX29rIH5mKVxuXG5sZXQgbWFwMl9leG4gbDEgbDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIm1hcDJfZXhuXCIgbDEgbDI7XG4gIG1hcDJfb2sgbDEgbDIgfmZcbjs7XG5cbmxldCByZXZfbWFwM19vayBsMSBsMiBsMyB+ZiA9XG4gIGxldCByZWMgbG9vcCBsMSBsMiBsMyBhYyA9XG4gICAgbWF0Y2ggbDEsIGwyLCBsMyB3aXRoXG4gICAgfCBbXSwgW10sIFtdIC0+IGFjXG4gICAgfCB4MSA6OiBsMSwgeDIgOjogbDIsIHgzIDo6IGwzIC0+IGxvb3AgbDEgbDIgbDMgKGYgeDEgeDIgeDMgOjogYWMpXG4gICAgfCBfIC0+IGFzc2VydCBmYWxzZVxuICBpblxuICBsb29wIGwxIGwyIGwzIFtdXG47O1xuXG5sZXQgcmV2X21hcDMgbDEgbDIgbDMgfmYgPSBjaGVja19sZW5ndGgzIGwxIGwyIGwzIH5mOihyZXZfbWFwM19vayB+ZilcblxubGV0IHJldl9tYXAzX2V4biBsMSBsMiBsMyB+ZiA9XG4gIGNoZWNrX2xlbmd0aDNfZXhuIFwicmV2X21hcDNfZXhuXCIgbDEgbDIgbDM7XG4gIHJldl9tYXAzX29rIGwxIGwyIGwzIH5mXG47O1xuXG5sZXQgbWFwM19vayBsMSBsMiBsMyB+ZiA9IHJldiAocmV2X21hcDNfb2sgbDEgbDIgbDMgfmYpXG5sZXQgbWFwMyBsMSBsMiBsMyB+ZiA9IGNoZWNrX2xlbmd0aDMgbDEgbDIgbDMgfmY6KG1hcDNfb2sgfmYpXG5cbmxldCBtYXAzX2V4biBsMSBsMiBsMyB+ZiA9XG4gIGNoZWNrX2xlbmd0aDNfZXhuIFwibWFwM19leG5cIiBsMSBsMiBsMztcbiAgbWFwM19vayBsMSBsMiBsMyB+ZlxuOztcblxubGV0IHJlYyByZXZfbWFwX2FwcGVuZCBsMSBsMiB+ZiA9XG4gIG1hdGNoIGwxIHdpdGhcbiAgfCBbXSAtPiBsMlxuICB8IGggOjogdCAtPiByZXZfbWFwX2FwcGVuZCB+ZiB0IChmIGggOjogbDIpXG47O1xuXG5sZXQgdW56aXAgbGlzdCA9XG4gIGxldCByZWMgbG9vcCBsaXN0IGwxIGwyID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IGwxLCBsMlxuICAgIHwgKHgsIHkpIDo6IHRsIC0+IGxvb3AgdGwgKHggOjogbDEpICh5IDo6IGwyKVxuICBpblxuICBsb29wIChyZXYgbGlzdCkgW10gW11cbjs7XG5cbmxldCB1bnppcDMgbGlzdCA9XG4gIGxldCByZWMgbG9vcCBsaXN0IGwxIGwyIGwzID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IGwxLCBsMiwgbDNcbiAgICB8ICh4LCB5LCB6KSA6OiB0bCAtPiBsb29wIHRsICh4IDo6IGwxKSAoeSA6OiBsMikgKHogOjogbDMpXG4gIGluXG4gIGxvb3AgKHJldiBsaXN0KSBbXSBbXSBbXVxuOztcblxubGV0IHppcF9leG4gbDEgbDIgPVxuICB0cnkgbWFwMl9vayB+ZjooZnVuIGEgYiAtPiBhLCBiKSBsMSBsMiB3aXRoXG4gIHwgXyAtPiBpbnZhbGlkX2FyZ2YgXCJsZW5ndGggbWlzbWF0Y2ggaW4gemlwX2V4bjogJWQgPD4gJWRcIiAobGVuZ3RoIGwxKSAobGVuZ3RoIGwyKSAoKVxuOztcblxubGV0IHppcCBsMSBsMiA9IG1hcDIgfmY6KGZ1biBhIGIgLT4gYSwgYikgbDEgbDJcblxuKCoqIEFkZGl0aW9uYWwgbGlzdCBvcGVyYXRpb25zICopXG5cbmxldCByZXZfbWFwaSBsIH5mID1cbiAgbGV0IHJlYyBsb29wIGkgYWNjID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IGFjY1xuICAgIHwgaCA6OiB0IC0+IGxvb3AgKGkgKyAxKSAoZiBpIGggOjogYWNjKSB0XG4gIGluXG4gIGxvb3AgMCBbXSBsXG47O1xuXG5sZXQgbWFwaSBsIH5mID0gcmV2IChyZXZfbWFwaSBsIH5mKVxuXG5sZXQgZm9sZGluZ19tYXBpIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbWFwaSB0IH5mOihmdW4gaSB4IC0+XG4gICAgbGV0IG5ld19hY2MsIHkgPSBmIGkgIWFjYyB4IGluXG4gICAgYWNjIDo9IG5ld19hY2M7XG4gICAgeSlcbjs7XG5cbmxldCBmb2xkX21hcGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBsZXQgcmVzdWx0ID1cbiAgICBtYXBpIHQgfmY6KGZ1biBpIHggLT5cbiAgICAgIGxldCBuZXdfYWNjLCB5ID0gZiBpICFhY2MgeCBpblxuICAgICAgYWNjIDo9IG5ld19hY2M7XG4gICAgICB5KVxuICBpblxuICAhYWNjLCByZXN1bHRcbjs7XG5cbmxldCBpdGVyaSBsIH5mID1cbiAgaWdub3JlXG4gICAgKGZvbGQgbCB+aW5pdDowIH5mOihmdW4gaSB4IC0+XG4gICAgICAgZiBpIHg7XG4gICAgICAgaSArIDEpXG4gICAgIDogaW50KVxuOztcblxubGV0IGZvbGRpIHQgfmluaXQgfmYgPVxuICBzbmQgKGZvbGQgdCB+aW5pdDooMCwgaW5pdCkgfmY6KGZ1biAoaSwgYWNjKSB2IC0+IGkgKyAxLCBmIGkgYWNjIHYpKVxuOztcblxubGV0IGZpbHRlcmkgbCB+ZiA9XG4gIHJldiAoZm9sZGkgbCB+ZjooZnVuIHBvcyBhY2MgeCAtPiBpZiBmIHBvcyB4IHRoZW4geCA6OiBhY2MgZWxzZSBhY2MpIH5pbml0OltdKVxuOztcblxubGV0IHJlZHVjZSBsIH5mID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gTm9uZVxuICB8IGhkIDo6IHRsIC0+IFNvbWUgKGZvbGQgfmluaXQ6aGQgfmYgdGwpXG47O1xuXG5sZXQgcmVkdWNlX2V4biBsIH5mID1cbiAgbWF0Y2ggcmVkdWNlIGwgfmYgd2l0aFxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmcgXCJMaXN0LnJlZHVjZV9leG5cIlxuICB8IFNvbWUgdiAtPiB2XG47O1xuXG5sZXQgcmVkdWNlX2JhbGFuY2VkIGwgfmYgPVxuICAoKiBDYWxsIHRoZSBcInNpemVcIiBvZiBhIHZhbHVlIHRoZSBudW1iZXIgb2YgbGlzdCBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBjb21iaW5lZCBpbnRvXG4gICAgIGl0IHZpYSBjYWxscyB0byBbZl0uICBXZSBwcm9jZWVkIGJ5IHVzaW5nIFtmXSB0byBjb21iaW5lIGVsZW1lbnRzIGluIHRoZSBhY2N1bXVsYXRvclxuICAgICBvZiB0aGUgc2FtZSBzaXplIHVudGlsIHdlIGNhbid0IGNvbWJpbmUgYW55IG1vcmUsIHRoZW4gZ2V0dGluZyBhIG5ldyBlbGVtZW50IGZyb20gdGhlXG4gICAgIGlucHV0IGxpc3QgYW5kIHJlcGVhdGluZy5cblxuICAgICBXaXRoIHRoaXMgc3RyYXRlZ3ksIGluIHRoZSBhY2N1bXVsYXRvcjpcbiAgICAgLSB3ZSBvbmx5IGV2ZXIgaGF2ZSBlbGVtZW50cyBvZiBzaXplcyBhIHBvd2VyIG9mIHR3b1xuICAgICAtIHdlIG5ldmVyIGhhdmUgbW9yZSB0aGFuIG9uZSBlbGVtZW50IG9mIGVhY2ggc2l6ZVxuICAgICAtIHRoZSBzdW0gb2YgYWxsIHRoZSBlbGVtZW50IHNpemVzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29uc3VtZWRcblxuICAgICBUaGVzZSBjb25kaXRpb25zIGVuZm9yY2UgdGhhdCBsaXN0IG9mIGVsZW1lbnRzIG9mIGVhY2ggc2l6ZSBpcyBwcmVjaXNlbHkgdGhlIGJpbmFyeVxuICAgICBleHBhbnNpb24gb2YgdGhlIG51bWJlciBvZiBlbGVtZW50cyBjb25zdW1lZDogaWYgeW91J3ZlIGNvbnN1bWVkIDEzID0gMGIxMTAxXG4gICAgIGVsZW1lbnRzLCB5b3UgaGF2ZSBvbmUgZWxlbWVudCBvZiBzaXplIDgsIG9uZSBvZiBzaXplIDQsIGFuZCBvbmUgb2Ygc2l6ZSAxLiAgSGVuY2VcbiAgICAgd2hlbiBhIG5ldyBlbGVtZW50IGNvbWVzIGFsb25nLCB0aGUgbnVtYmVyIG9mIGNvbWJpbmluZ3MgeW91IG5lZWQgdG8gZG8gaXMgdGhlIG51bWJlclxuICAgICBvZiB0cmFpbGluZyAxcyBpbiB0aGUgYmluYXJ5IGV4cGFuc2lvbiBvZiBbbnVtXSwgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGhhdmVcbiAgICAgYWxyZWFkeSBnb25lIGludG8gdGhlIGFjY3VtdWxhdG9yLiAgVGhlIGFjY3VtdWxhdG9yIGlzIGluIGFzY2VuZGluZyBvcmRlciBvZiBzaXplLCBzb1xuICAgICB0aGUgbmV4dCBlbGVtZW50IHRvIGNvbWJpbmUgd2l0aCBpcyBhbHdheXMgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICopXG4gIGxldCByZWMgc3RlcF9hY2N1bSBudW0gYWNjIHggPVxuICAgIGlmIG51bSBsYW5kIDEgPSAwXG4gICAgdGhlbiB4IDo6IGFjY1xuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggYWNjIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAoKiBOZXcgZWxlbWVudHMgZnJvbSBsYXRlciBpbiB0aGUgaW5wdXQgbGlzdCBnbyBvbiB0aGUgZnJvbnQgb2YgdGhlIGFjY3VtdWxhdG9yLCBzb1xuICAgICAgICAgdGhlIGFjY3VtdWxhdG9yIGlzIGluIHJldmVyc2Ugb3JkZXIgd3J0IHRoZSBvcmlnaW5hbCBsaXN0IG9yZGVyLCBoZW5jZSBbZiB5IHhdXG4gICAgICAgICBpbnN0ZWFkIG9mIFtmIHggeV0uICopXG4gICAgICB8IHkgOjogeXMgLT4gc3RlcF9hY2N1bSAobnVtIGFzciAxKSB5cyAoZiB5IHgpKVxuICBpblxuICAoKiBFeHBlcmltZW50YWxseSwgaW5saW5pbmcgW2ZvbGRpXSBhbmQgdW5yb2xsaW5nIHRoaXMgbG9vcCBhIGZldyB0aW1lcyBjYW4gcmVkdWNlXG4gICAgIHJ1bnRpbWUgZG93biB0byBhIHRoaXJkIGFuZCBhbGxvY2F0aW9uIHRvIDEvMTZ0aCBvciBzbyBpbiB0aGUgbWljcm9iZW5jaG1hcmtzIGJlbG93LlxuICAgICBIb3dldmVyLCBpbiBtb3N0IHVzZSBjYXNlcyBbZl0gaXMgbGlrZWx5IHRvIGJlIGV4cGVuc2l2ZSAob3RoZXJ3aXNlIHdoeSBkbyB5b3UgY2FyZVxuICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcmVkdWN0aW9uPykgc28gdGhlIG92ZXJoZWFkIG9mIHRoaXMgZnVuY3Rpb24gaXRzZWxmIGRvZXNuJ3QgcmVhbGx5XG4gICAgIG1hdHRlci4gSWYgeW91IGNvbWUgdXAgd2l0aCBhIHVzZS1jYXNlIHdoZXJlIGl0IGRvZXMsIHRoZW4gdGhhdCdzIHNvbWV0aGluZyB5b3UgbWlnaHRcbiAgICAgd2FudCB0byB0cnk6IHNlZSBoZyBsb2cgLXByIDQ5ZWYwNjVmNDI5ZC4gKilcbiAgbWF0Y2ggZm9sZGkgbCB+aW5pdDpbXSB+ZjpzdGVwX2FjY3VtIHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiB4cyAtPiBTb21lIChmb2xkIHhzIH5pbml0OnggfmY6KGZ1biB4IHkgLT4gZiB5IHgpKVxuOztcblxubGV0IHJlZHVjZV9iYWxhbmNlZF9leG4gbCB+ZiA9XG4gIG1hdGNoIHJlZHVjZV9iYWxhbmNlZCBsIH5mIHdpdGhcbiAgfCBOb25lIC0+IGludmFsaWRfYXJnIFwiTGlzdC5yZWR1Y2VfYmFsYW5jZWRfZXhuXCJcbiAgfCBTb21lIHYgLT4gdlxuOztcblxubGV0IGdyb3VwaSBsIH5icmVhayA9XG4gIGxldCBncm91cHMgPVxuICAgIGZvbGRpIGwgfmluaXQ6W10gfmY6KGZ1biBpIGFjYyB4IC0+XG4gICAgICBtYXRjaCBhY2Mgd2l0aFxuICAgICAgfCBbXSAtPiBbIFsgeCBdIF1cbiAgICAgIHwgY3VycmVudF9ncm91cCA6OiB0bCAtPlxuICAgICAgICBpZiBicmVhayBpIChoZF9leG4gY3VycmVudF9ncm91cCkgeFxuICAgICAgICB0aGVuIFsgeCBdIDo6IGN1cnJlbnRfZ3JvdXAgOjogdGwgKCogc3RhcnQgbmV3IGdyb3VwICopXG4gICAgICAgIGVsc2UgKHggOjogY3VycmVudF9ncm91cCkgOjogdGwpXG4gICAgKCogZXh0ZW5kIGN1cnJlbnQgZ3JvdXAgKilcbiAgaW5cbiAgbWF0Y2ggZ3JvdXBzIHdpdGhcbiAgfCBbXSAtPiBbXVxuICB8IGwgLT4gcmV2X21hcCBsIH5mOnJldlxuOztcblxubGV0IGdyb3VwIGwgfmJyZWFrID0gZ3JvdXBpIGwgfmJyZWFrOihmdW4gXyB4IHkgLT4gYnJlYWsgeCB5KVxuXG5sZXQgc29ydF9hbmRfZ3JvdXAgbCB+Y29tcGFyZSA9XG4gIGwgfD4gc3RhYmxlX3NvcnQgfmNvbXBhcmUgfD4gZ3JvdXAgfmJyZWFrOihmdW4geCB5IC0+IGNvbXBhcmUgeCB5IDw+IDApXG47O1xuXG5sZXQgY29uY2F0X21hcCBsIH5mID1cbiAgbGV0IHJlYyBhdXggYWNjID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+IHJldiBhY2NcbiAgICB8IGhkIDo6IHRsIC0+IGF1eCAocmV2X2FwcGVuZCAoZiBoZCkgYWNjKSB0bFxuICBpblxuICBhdXggW10gbFxuOztcblxubGV0IGNvbmNhdF9tYXBpIGwgfmYgPVxuICBsZXQgcmVjIGF1eCBjb250IGFjYyA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiByZXYgYWNjXG4gICAgfCBoZCA6OiB0bCAtPiBhdXggKGNvbnQgKyAxKSAocmV2X2FwcGVuZCAoZiBjb250IGhkKSBhY2MpIHRsXG4gIGluXG4gIGF1eCAwIFtdIGxcbjs7XG5cbmxldCBtZXJnZSBsMSBsMiB+Y29tcGFyZSA9XG4gIGxldCByZWMgbG9vcCBhY2MgbDEgbDIgPVxuICAgIG1hdGNoIGwxLCBsMiB3aXRoXG4gICAgfCBbXSwgbDIgLT4gcmV2X2FwcGVuZCBhY2MgbDJcbiAgICB8IGwxLCBbXSAtPiByZXZfYXBwZW5kIGFjYyBsMVxuICAgIHwgaDEgOjogdDEsIGgyIDo6IHQyIC0+XG4gICAgICBpZiBjb21wYXJlIGgxIGgyIDw9IDAgdGhlbiBsb29wIChoMSA6OiBhY2MpIHQxIGwyIGVsc2UgbG9vcCAoaDIgOjogYWNjKSBsMSB0MlxuICBpblxuICBsb29wIFtdIGwxIGwyXG47O1xuXG5tb2R1bGUgQ2FydGVzaWFuX3Byb2R1Y3QgPSBzdHJ1Y3RcbiAgKCogV2UgYXJlIGV4cGxpY2l0IGFib3V0IHdoYXQgd2UgZXhwb3J0IGZyb20gZnVuY3RvcnMgc28gdGhhdCB3ZSBkb24ndCBhY2NpZGVudGFsbHlcbiAgICAgcmViaW5kIG1vcmUgZWZmaWNpZW50IGxpc3Qtc3BlY2lmaWMgZnVuY3Rpb25zLiAqKVxuXG4gIGxldCBiaW5kID0gY29uY2F0X21hcFxuICBsZXQgbWFwID0gbWFwXG4gIGxldCBtYXAyIGEgYiB+ZiA9IGNvbmNhdF9tYXAgYSB+ZjooZnVuIHggLT4gbWFwIGIgfmY6KGZ1biB5IC0+IGYgeCB5KSlcbiAgbGV0IHJldHVybiB4ID0gWyB4IF1cbiAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gIGxldCAoID4+PSApIHQgZiA9IGJpbmQgdCB+ZlxuXG4gIG9wZW4gc3RydWN0XG4gICAgbW9kdWxlIEFwcGxpY2F0aXZlID0gQXBwbGljYXRpdmUuTWFrZV91c2luZ19tYXAyIChzdHJ1Y3RcbiAgICAgICAgdHlwZSAnYSB0ID0gJ2EgbGlzdFxuXG4gICAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgICAgbGV0IG1hcCA9IGBDdXN0b20gbWFwXG4gICAgICAgIGxldCBtYXAyID0gbWFwMlxuICAgICAgZW5kKVxuXG4gICAgbW9kdWxlIE1vbmFkID0gTW9uYWQuTWFrZSAoc3RydWN0XG4gICAgICAgIHR5cGUgJ2EgdCA9ICdhIGxpc3RcblxuICAgICAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICAgICAgICBsZXQgYmluZCA9IGJpbmRcbiAgICAgIGVuZClcbiAgZW5kXG5cbiAgbGV0IGFsbCA9IE1vbmFkLmFsbFxuICBsZXQgYWxsX3VuaXQgPSBNb25hZC5hbGxfdW5pdFxuICBsZXQgaWdub3JlX20gPSBNb25hZC5pZ25vcmVfbVxuICBsZXQgam9pbiA9IE1vbmFkLmpvaW5cblxuICBtb2R1bGUgTW9uYWRfaW5maXggPSBzdHJ1Y3RcbiAgICBsZXQgKCA+PnwgKSA9ICggPj58IClcbiAgICBsZXQgKCA+Pj0gKSA9ICggPj49IClcbiAgZW5kXG5cbiAgbGV0IGFwcGx5ID0gQXBwbGljYXRpdmUuYXBwbHlcbiAgbGV0IGJvdGggPSBBcHBsaWNhdGl2ZS5ib3RoXG4gIGxldCBtYXAzID0gQXBwbGljYXRpdmUubWFwM1xuICBsZXQgKCA8Kj4gKSA9IEFwcGxpY2F0aXZlLiggPCo+IClcbiAgbGV0ICggKj4gKSA9IEFwcGxpY2F0aXZlLiggKj4gKVxuICBsZXQgKCA8KiApID0gQXBwbGljYXRpdmUuKCA8KiApXG5cbiAgbW9kdWxlIEFwcGxpY2F0aXZlX2luZml4ID0gc3RydWN0XG4gICAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gICAgbGV0ICggPCo+ICkgPSBBcHBsaWNhdGl2ZS4oIDwqPiApXG4gICAgbGV0ICggKj4gKSA9IEFwcGxpY2F0aXZlLiggKj4gKVxuICAgIGxldCAoIDwqICkgPSBBcHBsaWNhdGl2ZS4oIDwqIClcbiAgZW5kXG5cbiAgbW9kdWxlIExldF9zeW50YXggPSBzdHJ1Y3RcbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gICAgbGV0ICggPj58ICkgPSAoID4+fCApXG4gICAgbGV0ICggPj49ICkgPSAoID4+PSApXG5cbiAgICBtb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgICBsZXQgbWFwID0gbWFwXG4gICAgICBsZXQgYm90aCA9IGJvdGhcblxuICAgICAgbW9kdWxlIE9wZW5fb25fcmhzID0gc3RydWN0IGVuZFxuICAgIGVuZFxuICBlbmRcbmVuZFxuXG5pbmNsdWRlIChDYXJ0ZXNpYW5fcHJvZHVjdCA6IE1vbmFkLlMgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdClcblxuKCoqIHJldHVybnMgZmluYWwgZWxlbWVudCBvZiBsaXN0ICopXG5sZXQgcmVjIGxhc3RfZXhuIGxpc3QgPVxuICBtYXRjaCBsaXN0IHdpdGhcbiAgfCBbIHggXSAtPiB4XG4gIHwgXyA6OiB0bCAtPiBsYXN0X2V4biB0bFxuICB8IFtdIC0+IGludmFsaWRfYXJnIFwiTGlzdC5sYXN0XCJcbjs7XG5cbigqKiBvcHRpb25hbGx5IHJldHVybnMgZmluYWwgZWxlbWVudCBvZiBsaXN0ICopXG5sZXQgcmVjIGxhc3QgbGlzdCA9XG4gIG1hdGNoIGxpc3Qgd2l0aFxuICB8IFsgeCBdIC0+IFNvbWUgeFxuICB8IF8gOjogdGwgLT4gbGFzdCB0bFxuICB8IFtdIC0+IE5vbmVcbjs7XG5cbmxldCByZWMgaXNfcHJlZml4IGxpc3QgfnByZWZpeCB+ZXF1YWwgPVxuICBtYXRjaCBwcmVmaXggd2l0aFxuICB8IFtdIC0+IHRydWVcbiAgfCBoZCA6OiB0bCAtPlxuICAgIChtYXRjaCBsaXN0IHdpdGhcbiAgICAgfCBbXSAtPiBmYWxzZVxuICAgICB8IGhkJyA6OiB0bCcgLT4gZXF1YWwgaGQgaGQnICYmIGlzX3ByZWZpeCB0bCcgfnByZWZpeDp0bCB+ZXF1YWwpXG47O1xuXG5sZXQgZmluZF9jb25zZWN1dGl2ZV9kdXBsaWNhdGUgdCB+ZXF1YWwgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgYTEgOjogdCAtPlxuICAgIGxldCByZWMgbG9vcCBhMSB0ID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBbXSAtPiBOb25lXG4gICAgICB8IGEyIDo6IHQgLT4gaWYgZXF1YWwgYTEgYTIgdGhlbiBTb21lIChhMSwgYTIpIGVsc2UgbG9vcCBhMiB0XG4gICAgaW5cbiAgICBsb29wIGExIHRcbjs7XG5cbigqIHJldHVybnMgbGlzdCB3aXRob3V0IGFkamFjZW50IGR1cGxpY2F0ZXMgKilcbmxldCByZW1vdmVfY29uc2VjdXRpdmVfZHVwbGljYXRlcyA/KHdoaWNoX3RvX2tlZXAgPSBgTGFzdCkgbGlzdCB+ZXF1YWwgPVxuICBsZXQgcmVjIGxvb3AgdG9fa2VlcCBhY2N1bSA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiB0b19rZWVwIDo6IGFjY3VtXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgaWYgZXF1YWwgaGQgdG9fa2VlcFxuICAgICAgdGhlbiAoXG4gICAgICAgIGxldCB0b19rZWVwID1cbiAgICAgICAgICBtYXRjaCB3aGljaF90b19rZWVwIHdpdGhcbiAgICAgICAgICB8IGBGaXJzdCAtPiB0b19rZWVwXG4gICAgICAgICAgfCBgTGFzdCAtPiBoZFxuICAgICAgICBpblxuICAgICAgICBsb29wIHRvX2tlZXAgYWNjdW0gdGwpXG4gICAgICBlbHNlIGxvb3AgaGQgKHRvX2tlZXAgOjogYWNjdW0pIHRsXG4gIGluXG4gIG1hdGNoIGxpc3Qgd2l0aFxuICB8IFtdIC0+IFtdXG4gIHwgaGQgOjogdGwgLT4gcmV2IChsb29wIGhkIFtdIHRsKVxuOztcblxuKCoqIHJldHVybnMgc29ydGVkIHZlcnNpb24gb2YgbGlzdCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZCAqKVxubGV0IGRlZHVwX2FuZF9zb3J0IGxpc3QgfmNvbXBhcmUgPVxuICBtYXRjaCBsaXN0IHdpdGhcbiAgfCBbXSB8IFsgXyBdIC0+IGxpc3QgKCogcGVyZm9ybWFuY2UgaGFjayAqKVxuICB8IF8gLT5cbiAgICBsZXQgZXF1YWwgeCB4JyA9IGNvbXBhcmUgeCB4JyA9IDAgaW5cbiAgICBsZXQgc29ydGVkID0gc29ydCB+Y29tcGFyZSBsaXN0IGluXG4gICAgcmVtb3ZlX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZXMgfmVxdWFsIHNvcnRlZFxuOztcblxubGV0IGZpbmRfYV9kdXAgbCB+Y29tcGFyZSA9XG4gIGxldCBzb3J0ZWQgPSBzb3J0IGwgfmNvbXBhcmUgaW5cbiAgbGV0IHJlYyBsb29wIGwgPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gfCBbIF8gXSAtPiBOb25lXG4gICAgfCBoZDEgOjogKGhkMiA6OiBfIGFzIHRsKSAtPiBpZiBjb21wYXJlIGhkMSBoZDIgPSAwIHRoZW4gU29tZSBoZDEgZWxzZSBsb29wIHRsXG4gIGluXG4gIGxvb3Agc29ydGVkXG47O1xuXG5sZXQgY29udGFpbnNfZHVwIGxzdCB+Y29tcGFyZSA9XG4gIG1hdGNoIGZpbmRfYV9kdXAgbHN0IH5jb21wYXJlIHdpdGhcbiAgfCBTb21lIF8gLT4gdHJ1ZVxuICB8IE5vbmUgLT4gZmFsc2Vcbjs7XG5cbmxldCBmaW5kX2FsbF9kdXBzIGwgfmNvbXBhcmUgPVxuICAoKiBXZSBhZGQgdGhpcyByZXZlcnNhbCwgc28gd2UgY2FuIHNraXAgYSBbcmV2XSBhdCB0aGUgZW5kLiBXZSBjb3VsZCBza2lwXG4gICAgIFtyZXZdIGFueXdheSBzaW5jZSB3ZSBkb24gbm90IGdpdmUgYW55IG9yZGVyaW5nIGd1YXJhbnRlZXMsIGJ1dCBpdCBpc1xuICAgICBuaWNlIHRvIGdldCByZXN1bHRzIGluIG5hdHVyYWwgb3JkZXIuICopXG4gIGxldCBjb21wYXJlIGEgYiA9IC0xICogY29tcGFyZSBhIGIgaW5cbiAgbGV0IHNvcnRlZCA9IHNvcnQgfmNvbXBhcmUgbCBpblxuICAoKiBXYWxrIHRoZSBsaXN0IGFuZCByZWNvcmQgdGhlIGZpcnN0IG9mIGVhY2ggY29uc2VjdXRpdmUgcnVuIG9mIGlkZW50aWNhbCBlbGVtZW50cyAqKVxuICBsZXQgcmVjIGxvb3Agc29ydGVkIHByZXYgfmFscmVhZHlfcmVjb3JkZWQgYWNjID1cbiAgICBtYXRjaCBzb3J0ZWQgd2l0aFxuICAgIHwgW10gLT4gYWNjXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgaWYgY29tcGFyZSBwcmV2IGhkIDw+IDBcbiAgICAgIHRoZW4gbG9vcCB0bCBoZCB+YWxyZWFkeV9yZWNvcmRlZDpmYWxzZSBhY2NcbiAgICAgIGVsc2UgaWYgYWxyZWFkeV9yZWNvcmRlZFxuICAgICAgdGhlbiBsb29wIHRsIGhkIH5hbHJlYWR5X3JlY29yZGVkOnRydWUgYWNjXG4gICAgICBlbHNlIGxvb3AgdGwgaGQgfmFscmVhZHlfcmVjb3JkZWQ6dHJ1ZSAoaGQgOjogYWNjKVxuICBpblxuICBtYXRjaCBzb3J0ZWQgd2l0aFxuICB8IFtdIC0+IFtdXG4gIHwgaGQgOjogdGwgLT4gbG9vcCB0bCBoZCB+YWxyZWFkeV9yZWNvcmRlZDpmYWxzZSBbXVxuOztcblxubGV0IHJlYyBhbGxfZXF1YWxfdG8gdCB2IH5lcXVhbCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFtdIC0+IHRydWVcbiAgfCB4IDo6IHhzIC0+IGVxdWFsIHggdiAmJiBhbGxfZXF1YWxfdG8geHMgdiB+ZXF1YWxcbjs7XG5cbmxldCBhbGxfZXF1YWwgdCB+ZXF1YWwgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiBOb25lXG4gIHwgeCA6OiB4cyAtPiBpZiBhbGxfZXF1YWxfdG8geHMgeCB+ZXF1YWwgdGhlbiBTb21lIHggZWxzZSBOb25lXG47O1xuXG5sZXQgY291bnQgdCB+ZiA9IENvbnRhaW5lci5jb3VudCB+Zm9sZCB0IH5mXG5sZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG5sZXQgbWluX2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxubGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcblxubGV0IGNvdW50aSB0IH5mID1cbiAgZm9sZGkgdCB+aW5pdDowIH5mOihmdW4gaWR4IGNvdW50IGEgLT4gaWYgZiBpZHggYSB0aGVuIGNvdW50ICsgMSBlbHNlIGNvdW50KVxuOztcblxubGV0IGluaXQgbiB+ZiA9XG4gIGlmIG4gPCAwIHRoZW4gaW52YWxpZF9hcmdmIFwiTGlzdC5pbml0ICVkXCIgbiAoKTtcbiAgbGV0IHJlYyBsb29wIGkgYWNjdW0gPVxuICAgIGFzc2VydCAoaSA+PSAwKTtcbiAgICBpZiBpID0gMCB0aGVuIGFjY3VtIGVsc2UgbG9vcCAoaSAtIDEpIChmIChpIC0gMSkgOjogYWNjdW0pXG4gIGluXG4gIGxvb3AgbiBbXVxuOztcblxubGV0IHJldl9maWx0ZXJfbWFwIGwgfmYgPVxuICBsZXQgcmVjIGxvb3AgbCBhY2N1bSA9XG4gICAgbWF0Y2ggbCB3aXRoXG4gICAgfCBbXSAtPiBhY2N1bVxuICAgIHwgaGQgOjogdGwgLT5cbiAgICAgIChtYXRjaCBmIGhkIHdpdGhcbiAgICAgICB8IFNvbWUgeCAtPiBsb29wIHRsICh4IDo6IGFjY3VtKVxuICAgICAgIHwgTm9uZSAtPiBsb29wIHRsIGFjY3VtKVxuICBpblxuICBsb29wIGwgW11cbjs7XG5cbmxldCBmaWx0ZXJfbWFwIGwgfmYgPSByZXYgKHJldl9maWx0ZXJfbWFwIGwgfmYpXG5cbmxldCByZXZfZmlsdGVyX21hcGkgbCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpIGwgYWNjdW0gPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gLT4gYWNjdW1cbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAobWF0Y2ggZiBpIGhkIHdpdGhcbiAgICAgICB8IFNvbWUgeCAtPiBsb29wIChpICsgMSkgdGwgKHggOjogYWNjdW0pXG4gICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKSB0bCBhY2N1bSlcbiAgaW5cbiAgbG9vcCAwIGwgW11cbjs7XG5cbmxldCBmaWx0ZXJfbWFwaSBsIH5mID0gcmV2IChyZXZfZmlsdGVyX21hcGkgbCB+ZilcbmxldCBmaWx0ZXJfb3B0IGwgPSBmaWx0ZXJfbWFwIGwgfmY6Rm4uaWRcblxubGV0IHBhcnRpdGlvbjNfbWFwIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgdCBmc3Qgc25kIHRyZCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiByZXYgZnN0LCByZXYgc25kLCByZXYgdHJkXG4gICAgfCB4IDo6IHQgLT5cbiAgICAgIChtYXRjaCBmIHggd2l0aFxuICAgICAgIHwgYEZzdCB5IC0+IGxvb3AgdCAoeSA6OiBmc3QpIHNuZCB0cmRcbiAgICAgICB8IGBTbmQgeSAtPiBsb29wIHQgZnN0ICh5IDo6IHNuZCkgdHJkXG4gICAgICAgfCBgVHJkIHkgLT4gbG9vcCB0IGZzdCBzbmQgKHkgOjogdHJkKSlcbiAgaW5cbiAgbG9vcCB0IFtdIFtdIFtdXG47O1xuXG5sZXQgcGFydGl0aW9uX3RmIHQgfmYgPVxuICBsZXQgZiB4IDogXyBFaXRoZXIudCA9IGlmIGYgeCB0aGVuIEZpcnN0IHggZWxzZSBTZWNvbmQgeCBpblxuICBwYXJ0aXRpb25fbWFwIHQgfmZcbjs7XG5cbmxldCBwYXJ0aXRpb25fcmVzdWx0IHQgPSBwYXJ0aXRpb25fbWFwIHQgfmY6UmVzdWx0LnRvX2VpdGhlclxuXG5tb2R1bGUgQXNzb2MgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhICogJ2IpIGxpc3QgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgdF9vZl9zZXhwIDpcbiAgICAnYSAnYi5cbiAgICAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKVxuICAgIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gJ2IpXG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgLT4gKCdhLCAnYikgdFxuICAgID1cbiAgICBsZXQgZXJyb3Jfc291cmNlX18wMjJfID0gXCJsaXN0Lm1sLkFzc29jLnRcIiBpblxuICAgIGZ1biBfb2ZfYV9fMDE0XyBfb2ZfYl9fMDE1XyB4X18wMjNfIC0+XG4gICAgICBsaXN0X29mX3NleHBcbiAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgWyBhcmcwX18wMTdfOyBhcmcxX18wMThfIF0gLT5cbiAgICAgICAgICAgIGxldCByZXMwX18wMTlfID0gX29mX2FfXzAxNF8gYXJnMF9fMDE3X1xuICAgICAgICAgICAgYW5kIHJlczFfXzAyMF8gPSBfb2ZfYl9fMDE1XyBhcmcxX18wMThfIGluXG4gICAgICAgICAgICByZXMwX18wMTlfLCByZXMxX18wMjBfXG4gICAgICAgICAgfCBzZXhwX18wMjFfIC0+XG4gICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudHVwbGVfb2Zfc2l6ZV9uX2V4cGVjdGVkXG4gICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDIyX1xuICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgIHNleHBfXzAyMV8pXG4gICAgICAgIHhfXzAyM19cbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDpcbiAgICAnYSAnYi5cbiAgICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnYiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdhLCAnYikgdFxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgID1cbiAgICBmdW4gX29mX2FfXzAyNF8gX29mX2JfXzAyNV8geF9fMDMwXyAtPlxuICAgICAgc2V4cF9vZl9saXN0XG4gICAgICAgIChmdW4gKGFyZzBfXzAyNl8sIGFyZzFfXzAyN18pIC0+XG4gICAgICAgICAgIGxldCByZXMwX18wMjhfID0gX29mX2FfXzAyNF8gYXJnMF9fMDI2X1xuICAgICAgICAgICBhbmQgcmVzMV9fMDI5XyA9IF9vZl9iX18wMjVfIGFyZzFfXzAyN18gaW5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgcmVzMF9fMDI4XzsgcmVzMV9fMDI5XyBdKVxuICAgICAgICB4X18wMzBfXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6XG4gICAgICAgICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICdiIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gKCdhLCAnYikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgXydiX3NleHBfZ3JhbW1hciAtPlxuICAgICAgbGlzdF9zZXhwX2dyYW1tYXJcbiAgICAgICAgeyB1bnR5cGVkID1cbiAgICAgICAgICAgIExpc3QgKENvbnMgKF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZCwgQ29ucyAoXydiX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkpKVxuICAgICAgICB9XG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICBsZXQgcGFpcl9vZl9ncm91cCA9IGZ1bmN0aW9uXG4gICAgfCBbXSAtPiBhc3NlcnQgZmFsc2VcbiAgICB8IChrLCBfKSA6OiBfIGFzIGxpc3QgLT4gaywgbWFwIGxpc3QgfmY6c25kXG4gIDs7XG5cbiAgbGV0IGdyb3VwIGFsaXN0IH5lcXVhbCA9XG4gICAgZ3JvdXAgYWxpc3QgfmJyZWFrOihmdW4gKHgsIF8pICh5LCBfKSAtPiBub3QgKGVxdWFsIHggeSkpIHw+IG1hcCB+ZjpwYWlyX29mX2dyb3VwXG4gIDs7XG5cbiAgbGV0IHNvcnRfYW5kX2dyb3VwIGFsaXN0IH5jb21wYXJlID1cbiAgICBzb3J0X2FuZF9ncm91cCBhbGlzdCB+Y29tcGFyZTooZnVuICh4LCBfKSAoeSwgXykgLT4gY29tcGFyZSB4IHkpXG4gICAgfD4gbWFwIH5mOnBhaXJfb2ZfZ3JvdXBcbiAgOztcblxuICBsZXQgZmluZCB0IH5lcXVhbCBrZXkgPVxuICAgIG1hdGNoIGZpbmQgdCB+ZjooZnVuIChrZXknLCBfKSAtPiBlcXVhbCBrZXkga2V5Jykgd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIHggLT4gU29tZSAoc25kIHgpXG4gIDs7XG5cbiAgbGV0IGZpbmRfZXhuID1cbiAgICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJMaXN0LkFzc29jLmZpbmRfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgICBsZXQgZmluZF9leG4gdCB+ZXF1YWwga2V5ID1cbiAgICAgIG1hdGNoIGZpbmQgdCBrZXkgfmVxdWFsIHdpdGhcbiAgICAgIHwgTm9uZSAtPiByYWlzZSBub3RfZm91bmRcbiAgICAgIHwgU29tZSB2YWx1ZSAtPiB2YWx1ZVxuICAgIGluXG4gICAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICAgIGZpbmRfZXhuXG4gIDs7XG5cbiAgbGV0IG1lbSB0IH5lcXVhbCBrZXkgPVxuICAgIG1hdGNoIGZpbmQgdCB+ZXF1YWwga2V5IHdpdGhcbiAgICB8IE5vbmUgLT4gZmFsc2VcbiAgICB8IFNvbWUgXyAtPiB0cnVlXG4gIDs7XG5cbiAgbGV0IHJlbW92ZSB0IH5lcXVhbCBrZXkgPSBmaWx0ZXIgdCB+ZjooZnVuIChrZXknLCBfKSAtPiBub3QgKGVxdWFsIGtleSBrZXknKSlcblxuICBsZXQgYWRkIHQgfmVxdWFsIGtleSB2YWx1ZSA9XG4gICAgKCogdGhlIHJlbW92ZSBkb2Vzbid0IGNoYW5nZSB0aGUgbWFwIHNlbWFudGljcywgYnV0IGtlZXBzIHRoZSBsaXN0IHNtYWxsICopXG4gICAgKGtleSwgdmFsdWUpIDo6IHJlbW92ZSB0IH5lcXVhbCBrZXlcbiAgOztcblxuICBsZXQgaW52ZXJzZSB0ID0gbWFwIHQgfmY6KGZ1biAoeCwgeSkgLT4geSwgeClcbiAgbGV0IG1hcCB0IH5mID0gbWFwIHQgfmY6KGZ1biAoa2V5LCB2YWx1ZSkgLT4ga2V5LCBmIHZhbHVlKVxuZW5kXG5cbmxldCBzdWIgbCB+cG9zIH5sZW4gPVxuICAoKiBXZSB1c2UgW3BvcyA+IGxlbmd0aCBsIC0gbGVuXSByYXRoZXIgdGhhbiBbcG9zICsgbGVuID4gbGVuZ3RoIGxdIHRvIGF2b2lkIHRoZVxuICAgICBwb3NzaWJpbGl0eSBvZiBvdmVyZmxvdy4gKilcbiAgaWYgcG9zIDwgMCB8fCBsZW4gPCAwIHx8IHBvcyA+IGxlbmd0aCBsIC0gbGVuIHRoZW4gaW52YWxpZF9hcmcgXCJMaXN0LnN1YlwiO1xuICByZXZcbiAgICAoZm9sZGkgbCB+aW5pdDpbXSB+ZjooZnVuIGkgYWNjIGVsIC0+XG4gICAgICAgaWYgaSA+PSBwb3MgJiYgaSA8IHBvcyArIGxlbiB0aGVuIGVsIDo6IGFjYyBlbHNlIGFjYykpXG47O1xuXG5sZXQgc3BsaXRfbiB0X29yaWcgbiA9XG4gIGlmIG4gPD0gMFxuICB0aGVuIFtdLCB0X29yaWdcbiAgZWxzZSAoXG4gICAgbGV0IHJlYyBsb29wIG4gdCBhY2N1bSA9XG4gICAgICBpZiBuID0gMFxuICAgICAgdGhlbiByZXYgYWNjdW0sIHRcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBbXSAtPiB0X29yaWcsIFtdICgqIGluIHRoaXMgY2FzZSwgdF9vcmlnID0gcmV2IGFjY3VtICopXG4gICAgICAgIHwgaGQgOjogdGwgLT4gbG9vcCAobiAtIDEpIHRsIChoZCA6OiBhY2N1bSkpXG4gICAgaW5cbiAgICBsb29wIG4gdF9vcmlnIFtdKVxuOztcblxuKCogY29waWVkIGZyb20gW3NwbGl0X25dIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSB0dXBsZSAqKVxubGV0IHRha2UgdF9vcmlnIG4gPVxuICBpZiBuIDw9IDBcbiAgdGhlbiBbXVxuICBlbHNlIChcbiAgICBsZXQgcmVjIGxvb3AgbiB0IGFjY3VtID1cbiAgICAgIGlmIG4gPSAwXG4gICAgICB0aGVuIHJldiBhY2N1bVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IFtdIC0+IHRfb3JpZ1xuICAgICAgICB8IGhkIDo6IHRsIC0+IGxvb3AgKG4gLSAxKSB0bCAoaGQgOjogYWNjdW0pKVxuICAgIGluXG4gICAgbG9vcCBuIHRfb3JpZyBbXSlcbjs7XG5cbmxldCByZWMgZHJvcCB0IG4gPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBfIDo6IHRsIHdoZW4gbiA+IDAgLT4gZHJvcCB0bCAobiAtIDEpXG4gIHwgdCAtPiB0XG47O1xuXG5sZXQgY2h1bmtzX29mIGwgfmxlbmd0aCA9XG4gIGlmIGxlbmd0aCA8PSAwIHRoZW4gaW52YWxpZF9hcmdmIFwiTGlzdC5jaHVua3Nfb2Y6IEV4cGVjdGVkIGxlbmd0aCA+IDAsIGdvdCAlZFwiIGxlbmd0aCAoKTtcbiAgbGV0IHJlYyBhdXggb2ZfbGVuZ3RoIGFjYyBsID1cbiAgICBtYXRjaCBsIHdpdGhcbiAgICB8IFtdIC0+IHJldiBhY2NcbiAgICB8IF8gOjogXyAtPlxuICAgICAgbGV0IHN1Ymxpc3QsIGwgPSBzcGxpdF9uIGwgbGVuZ3RoIGluXG4gICAgICBhdXggb2ZfbGVuZ3RoIChzdWJsaXN0IDo6IGFjYykgbFxuICBpblxuICBhdXggbGVuZ3RoIFtdIGxcbjs7XG5cbmxldCBzcGxpdF93aGlsZSB4cyB+ZiA9XG4gIGxldCByZWMgbG9vcCBhY2MgPSBmdW5jdGlvblxuICAgIHwgaGQgOjogdGwgd2hlbiBmIGhkIC0+IGxvb3AgKGhkIDo6IGFjYykgdGxcbiAgICB8IHQgLT4gcmV2IGFjYywgdFxuICBpblxuICBsb29wIFtdIHhzXG47O1xuXG4oKiBjb3BpZWQgZnJvbSBbc3BsaXRfd2hpbGVdIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSB0dXBsZSAqKVxubGV0IHRha2Vfd2hpbGUgeHMgfmYgPVxuICBsZXQgcmVjIGxvb3AgYWNjID0gZnVuY3Rpb25cbiAgICB8IGhkIDo6IHRsIHdoZW4gZiBoZCAtPiBsb29wIChoZCA6OiBhY2MpIHRsXG4gICAgfCBfIC0+IHJldiBhY2NcbiAgaW5cbiAgbG9vcCBbXSB4c1xuOztcblxubGV0IHJlYyBkcm9wX3doaWxlIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBoZCA6OiB0bCB3aGVuIGYgaGQgLT4gZHJvcF93aGlsZSB0bCB+ZlxuICB8IHQgLT4gdFxuOztcblxubGV0IGRyb3BfbGFzdCB0ID1cbiAgbWF0Y2ggcmV2IHQgd2l0aFxuICB8IFtdIC0+IE5vbmVcbiAgfCBfIDo6IGxzdCAtPiBTb21lIChyZXYgbHN0KVxuOztcblxubGV0IGRyb3BfbGFzdF9leG4gdCA9XG4gIG1hdGNoIGRyb3BfbGFzdCB0IHdpdGhcbiAgfCBOb25lIC0+IGZhaWx3aXRoIFwiTGlzdC5kcm9wX2xhc3RfZXhuOiBlbXB0eSBsaXN0XCJcbiAgfCBTb21lIGxzdCAtPiBsc3Rcbjs7XG5cbmxldCBjYXJ0ZXNpYW5fcHJvZHVjdCBsaXN0MSBsaXN0MiA9XG4gIGlmIGlzX2VtcHR5IGxpc3QyXG4gIHRoZW4gW11cbiAgZWxzZSAoXG4gICAgbGV0IHJlYyBsb29wIGwxIGwyIGFjY3VtID1cbiAgICAgIG1hdGNoIGwxIHdpdGhcbiAgICAgIHwgW10gLT4gYWNjdW1cbiAgICAgIHwgaGQgOjogdGwgLT4gbG9vcCB0bCBsMiAocmV2X2FwcGVuZCAobWFwIH5mOihmdW4geCAtPiBoZCwgeCkgbDIpIGFjY3VtKVxuICAgIGluXG4gICAgcmV2IChsb29wIGxpc3QxIGxpc3QyIFtdKSlcbjs7XG5cbmxldCBjb25jYXQgbCA9IGZvbGRfcmlnaHQgbCB+aW5pdDpbXSB+ZjphcHBlbmRcbmxldCBjb25jYXRfbm9fb3JkZXIgbCA9IGZvbGQgbCB+aW5pdDpbXSB+ZjooZnVuIGFjYyBsIC0+IHJldl9hcHBlbmQgbCBhY2MpXG5sZXQgY29ucyB4IGwgPSB4IDo6IGxcblxubGV0IGlzX3NvcnRlZCBsIH5jb21wYXJlID1cbiAgbGV0IHJlYyBsb29wIGwgPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gfCBbIF8gXSAtPiB0cnVlXG4gICAgfCB4MSA6OiAoeDIgOjogXyBhcyByZXN0KSAtPiBjb21wYXJlIHgxIHgyIDw9IDAgJiYgbG9vcCByZXN0XG4gIGluXG4gIGxvb3AgbFxuOztcblxubGV0IGlzX3NvcnRlZF9zdHJpY3RseSBsIH5jb21wYXJlID1cbiAgbGV0IHJlYyBsb29wIGwgPVxuICAgIG1hdGNoIGwgd2l0aFxuICAgIHwgW10gfCBbIF8gXSAtPiB0cnVlXG4gICAgfCB4MSA6OiAoeDIgOjogXyBhcyByZXN0KSAtPiBjb21wYXJlIHgxIHgyIDwgMCAmJiBsb29wIHJlc3RcbiAgaW5cbiAgbG9vcCBsXG47O1xuXG5tb2R1bGUgSW5maXggPSBzdHJ1Y3RcbiAgbGV0ICggQCApID0gYXBwZW5kXG5lbmRcblxubGV0IHBlcm11dGUgPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgbGlzdCA9XG4gIG1hdGNoIGxpc3Qgd2l0aFxuICAoKiBzcGVjaWFsIGNhc2VzIHRvIHNwZWVkIHRoaW5ncyB1cCBpbiB0cml2aWFsIGNhc2VzICopXG4gIHwgW10gfCBbIF8gXSAtPiBsaXN0XG4gIHwgWyB4OyB5IF0gLT4gaWYgUmFuZG9tLlN0YXRlLmJvb2wgcmFuZG9tX3N0YXRlIHRoZW4gWyB5OyB4IF0gZWxzZSBsaXN0XG4gIHwgXyAtPlxuICAgIGxldCBhcnIgPSBBcnJheS5vZl9saXN0IGxpc3QgaW5cbiAgICBBcnJheV9wZXJtdXRlLnBlcm11dGUgYXJyIH5yYW5kb21fc3RhdGU7XG4gICAgQXJyYXkudG9fbGlzdCBhcnJcbjs7XG5cbmxldCByYW5kb21fZWxlbWVudF9leG4gPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgbGlzdCA9XG4gIGlmIGlzX2VtcHR5IGxpc3RcbiAgdGhlbiBmYWlsd2l0aCBcIkxpc3QucmFuZG9tX2VsZW1lbnRfZXhuOiBlbXB0eSBsaXN0XCJcbiAgZWxzZSBudGhfZXhuIGxpc3QgKFJhbmRvbS5TdGF0ZS5pbnQgcmFuZG9tX3N0YXRlIChsZW5ndGggbGlzdCkpXG47O1xuXG5sZXQgcmFuZG9tX2VsZW1lbnQgPyhyYW5kb21fc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgbGlzdCA9XG4gIHRyeSBTb21lIChyYW5kb21fZWxlbWVudF9leG4gfnJhbmRvbV9zdGF0ZSBsaXN0KSB3aXRoXG4gIHwgXyAtPiBOb25lXG47O1xuXG5sZXQgcmVjIGNvbXBhcmUgY21wIGEgYiA9XG4gIG1hdGNoIGEsIGIgd2l0aFxuICB8IFtdLCBbXSAtPiAwXG4gIHwgW10sIF8gLT4gLTFcbiAgfCBfLCBbXSAtPiAxXG4gIHwgeCA6OiB4cywgeSA6OiB5cyAtPlxuICAgIGxldCBuID0gY21wIHggeSBpblxuICAgIGlmIG4gPSAwIHRoZW4gY29tcGFyZSBjbXAgeHMgeXMgZWxzZSBuXG47O1xuXG5sZXQgaGFzaF9mb2xkX3QgPSBoYXNoX2ZvbGRfbGlzdFxuXG5sZXQgZXF1YWwgZXF1YWwgdDEgdDIgPVxuICBsZXQgcmVjIGxvb3AgfmVxdWFsIHQxIHQyID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgW10sIFtdIC0+IHRydWVcbiAgICB8IHgxIDo6IHQxLCB4MiA6OiB0MiAtPiBlcXVhbCB4MSB4MiAmJiBsb29wIH5lcXVhbCB0MSB0MlxuICAgIHwgXyAtPiBmYWxzZVxuICBpblxuICBsb29wIH5lcXVhbCB0MSB0MlxuOztcblxubGV0IHRyYW5zcG9zZSA9XG4gIGxldCByZWMgc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiB0IGNvbHVtbl9hY2MgdHJpbW1lZCBmb3VuZF9lbXB0eSA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBbXSAtPiBjb2x1bW5fYWNjLCB0cmltbWVkLCBmb3VuZF9lbXB0eVxuICAgIHwgW10gOjogdGwgLT4gc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiB0bCBjb2x1bW5fYWNjIHRyaW1tZWQgdHJ1ZVxuICAgIHwgKHggOjogeHMpIDo6IHRsIC0+XG4gICAgICBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHRsICh4IDo6IGNvbHVtbl9hY2MpICh4cyA6OiB0cmltbWVkKSBmb3VuZF9lbXB0eVxuICBpblxuICBsZXQgc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiByb3dzID0gc3BsaXRfb2ZmX2ZpcnN0X2NvbHVtbiByb3dzIFtdIFtdIGZhbHNlIGluXG4gIGxldCByZWMgbG9vcCByb3dzIGNvbHVtbnMgZG9fcmV2ID1cbiAgICBtYXRjaCBzcGxpdF9vZmZfZmlyc3RfY29sdW1uIHJvd3Mgd2l0aFxuICAgIHwgW10sIFtdLCBfIC0+IFNvbWUgKHJldiBjb2x1bW5zKVxuICAgIHwgY29sdW1uLCB0cmltbWVkX3Jvd3MsIGZvdW5kX2VtcHR5IC0+XG4gICAgICBpZiBmb3VuZF9lbXB0eVxuICAgICAgdGhlbiBOb25lXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGNvbHVtbiA9IGlmIGRvX3JldiB0aGVuIHJldiBjb2x1bW4gZWxzZSBjb2x1bW4gaW5cbiAgICAgICAgbG9vcCB0cmltbWVkX3Jvd3MgKGNvbHVtbiA6OiBjb2x1bW5zKSAobm90IGRvX3JldikpXG4gIGluXG4gIGZ1biB0IC0+IGxvb3AgdCBbXSB0cnVlXG47O1xuXG5leGNlcHRpb24gVHJhbnNwb3NlX2dvdF9saXN0c19vZl9kaWZmZXJlbnRfbGVuZ3RocyBvZiBpbnQgbGlzdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF1cblxubGV0ICgpID1cbiAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkXG4gICAgWyVleHRlbnNpb25fY29uc3RydWN0b3IgVHJhbnNwb3NlX2dvdF9saXN0c19vZl9kaWZmZXJlbnRfbGVuZ3Roc11cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgVHJhbnNwb3NlX2dvdF9saXN0c19vZl9kaWZmZXJlbnRfbGVuZ3RocyBhcmcwX18wMzFfIC0+XG4gICAgICAgIGxldCByZXMwX18wMzJfID0gc2V4cF9vZl9saXN0IHNleHBfb2ZfaW50IGFyZzBfXzAzMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJsaXN0Lm1sLlRyYW5zcG9zZV9nb3RfbGlzdHNfb2ZfZGlmZmVyZW50X2xlbmd0aHNcIlxuICAgICAgICAgIDsgcmVzMF9fMDMyX1xuICAgICAgICAgIF1cbiAgICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgdHJhbnNwb3NlX2V4biBsID1cbiAgbWF0Y2ggdHJhbnNwb3NlIGwgd2l0aFxuICB8IFNvbWUgbCAtPiBsXG4gIHwgTm9uZSAtPiByYWlzZSAoVHJhbnNwb3NlX2dvdF9saXN0c19vZl9kaWZmZXJlbnRfbGVuZ3RocyAobWFwIGwgfmY6bGVuZ3RoKSlcbjs7XG5cbmxldCBpbnRlcnNwZXJzZSB0IH5zZXAgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBbXSAtPiBbXVxuICB8IHggOjogeHMgLT4geCA6OiBmb2xkX3JpZ2h0IHhzIH5pbml0OltdIH5mOihmdW4geSBhY2MgLT4gc2VwIDo6IHkgOjogYWNjKVxuOztcblxubGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxubGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIHRcblxubGV0IGlzX3N1ZmZpeCBsaXN0IH5zdWZmaXggfmVxdWFsOmVxdWFsX2VsdCA9XG4gIGxldCBsaXN0X2xlbiA9IGxlbmd0aCBsaXN0IGluXG4gIGxldCBzdWZmaXhfbGVuID0gbGVuZ3RoIHN1ZmZpeCBpblxuICBsaXN0X2xlbiA+PSBzdWZmaXhfbGVuICYmIGVxdWFsIGVxdWFsX2VsdCAoZHJvcCBsaXN0IChsaXN0X2xlbiAtIHN1ZmZpeF9sZW4pKSBzdWZmaXhcbjs7XG4iLCIoKiBUaGlzIG1vZHVsZSBpcyB0cnlpbmcgdG8gbWluaW1pemUgZGVwZW5kZW5jaWVzIG9uIG1vZHVsZXMgaW4gQ29yZSwgc28gYXMgdG8gYWxsb3dcbiAgIFtJbmZvXSwgW0Vycm9yXSwgYW5kIFtPcl9lcnJvcl0gdG8gYmUgdXNlZCBpbiBhcyBtYW55IHBsYWNlcyBhcyBwb3NzaWJsZS4gUGxlYXNlIGF2b2lkXG4gICBhZGRpbmcgbmV3IGRlcGVuZGVuY2llcy4gKilcblxub3BlbiEgSW1wb3J0XG5pbmNsdWRlIEluZm9faW50ZlxubW9kdWxlIFN0cmluZyA9IFN0cmluZzBcblxubW9kdWxlIE1lc3NhZ2UgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB8IENvdWxkX25vdF9jb25zdHJ1Y3Qgb2YgU2V4cC50XG4gICAgfCBTdHJpbmcgb2Ygc3RyaW5nXG4gICAgfCBFeG4gb2YgZXhuXG4gICAgfCBTZXhwIG9mIFNleHAudFxuICAgIHwgVGFnX3NleHAgb2Ygc3RyaW5nICogU2V4cC50ICogU291cmNlX2NvZGVfcG9zaXRpb24wLnQgb3B0aW9uXG4gICAgfCBUYWdfdCBvZiBzdHJpbmcgKiB0XG4gICAgfCBUYWdfYXJnIG9mIHN0cmluZyAqIFNleHAudCAqIHRcbiAgICB8IE9mX2xpc3Qgb2YgaW50IG9wdGlvbiAqIHQgbGlzdFxuICAgIHwgV2l0aF9iYWNrdHJhY2Ugb2YgdCAqIHN0cmluZyAoKiBiYWNrdHJhY2UgKilcbiAgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgbGV0IHJlYyBzZXhwX29mX3QgPVxuICAgIChmdW5jdGlvblxuICAgICAgfCBDb3VsZF9ub3RfY29uc3RydWN0IGFyZzBfXzAwMV8gLT5cbiAgICAgICAgbGV0IHJlczBfXzAwMl8gPSBTZXhwLnNleHBfb2ZfdCBhcmcwX18wMDFfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkNvdWxkX25vdF9jb25zdHJ1Y3RcIjsgcmVzMF9fMDAyXyBdXG4gICAgICB8IFN0cmluZyBhcmcwX18wMDNfIC0+XG4gICAgICAgIGxldCByZXMwX18wMDRfID0gc2V4cF9vZl9zdHJpbmcgYXJnMF9fMDAzXyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJTdHJpbmdcIjsgcmVzMF9fMDA0XyBdXG4gICAgICB8IEV4biBhcmcwX18wMDVfIC0+XG4gICAgICAgIGxldCByZXMwX18wMDZfID0gc2V4cF9vZl9leG4gYXJnMF9fMDA1XyBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJFeG5cIjsgcmVzMF9fMDA2XyBdXG4gICAgICB8IFNleHAgYXJnMF9fMDA3XyAtPlxuICAgICAgICBsZXQgcmVzMF9fMDA4XyA9IFNleHAuc2V4cF9vZl90IGFyZzBfXzAwN18gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiU2V4cFwiOyByZXMwX18wMDhfIF1cbiAgICAgIHwgVGFnX3NleHAgKGFyZzBfXzAwOV8sIGFyZzFfXzAxMF8sIGFyZzJfXzAxMV8pIC0+XG4gICAgICAgIGxldCByZXMwX18wMTJfID0gc2V4cF9vZl9zdHJpbmcgYXJnMF9fMDA5X1xuICAgICAgICBhbmQgcmVzMV9fMDEzXyA9IFNleHAuc2V4cF9vZl90IGFyZzFfXzAxMF9cbiAgICAgICAgYW5kIHJlczJfXzAxNF8gPSBzZXhwX29mX29wdGlvbiBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90IGFyZzJfXzAxMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJUYWdfc2V4cFwiOyByZXMwX18wMTJfOyByZXMxX18wMTNfOyByZXMyX18wMTRfIF1cbiAgICAgIHwgVGFnX3QgKGFyZzBfXzAxNV8sIGFyZzFfXzAxNl8pIC0+XG4gICAgICAgIGxldCByZXMwX18wMTdfID0gc2V4cF9vZl9zdHJpbmcgYXJnMF9fMDE1X1xuICAgICAgICBhbmQgcmVzMV9fMDE4XyA9IHNleHBfb2ZfdCBhcmcxX18wMTZfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlRhZ190XCI7IHJlczBfXzAxN187IHJlczFfXzAxOF8gXVxuICAgICAgfCBUYWdfYXJnIChhcmcwX18wMTlfLCBhcmcxX18wMjBfLCBhcmcyX18wMjFfKSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDIyXyA9IHNleHBfb2Zfc3RyaW5nIGFyZzBfXzAxOV9cbiAgICAgICAgYW5kIHJlczFfXzAyM18gPSBTZXhwLnNleHBfb2ZfdCBhcmcxX18wMjBfXG4gICAgICAgIGFuZCByZXMyX18wMjRfID0gc2V4cF9vZl90IGFyZzJfXzAyMV8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJUYWdfYXJnXCI7IHJlczBfXzAyMl87IHJlczFfXzAyM187IHJlczJfXzAyNF8gXVxuICAgICAgfCBPZl9saXN0IChhcmcwX18wMjVfLCBhcmcxX18wMjZfKSAtPlxuICAgICAgICBsZXQgcmVzMF9fMDI3XyA9IHNleHBfb2Zfb3B0aW9uIHNleHBfb2ZfaW50IGFyZzBfXzAyNV9cbiAgICAgICAgYW5kIHJlczFfXzAyOF8gPSBzZXhwX29mX2xpc3Qgc2V4cF9vZl90IGFyZzFfXzAyNl8gaW5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiT2ZfbGlzdFwiOyByZXMwX18wMjdfOyByZXMxX18wMjhfIF1cbiAgICAgIHwgV2l0aF9iYWNrdHJhY2UgKGFyZzBfXzAyOV8sIGFyZzFfXzAzMF8pIC0+XG4gICAgICAgIGxldCByZXMwX18wMzFfID0gc2V4cF9vZl90IGFyZzBfXzAyOV9cbiAgICAgICAgYW5kIHJlczFfXzAzMl8gPSBzZXhwX29mX3N0cmluZyBhcmcxX18wMzBfIGluXG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIldpdGhfYmFja3RyYWNlXCI7IHJlczBfXzAzMV87IHJlczFfXzAzMl8gXVxuICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IHJlYyB0b19zdHJpbmdzX2h1bSB0IGFjID1cbiAgICAoKiBXZSB1c2UgW1NleHAudG9fc3RyaW5nX21hY2hdLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgd2UgYXJlIGltcGxlbWVudGluZ1xuICAgICAgIFt0b19zdHJpbmdzX2h1bV0sIGJlY2F1c2Ugd2Ugd2FudCB0aGUgaW5mbyB0byBmaXQgb24gYSBzaW5nbGUgbGluZSwgYW5kIG9uY2Ugd2UndmVcbiAgICAgICBoYWQgdG8gcmVzb3J0IHRvIHNleHBzLCB0aGUgbWVzc2FnZSBpcyBnb2luZyB0byBzdGFydCBub3QgbG9va2luZyBzbyBwcmV0dHlcbiAgICAgICBhbnl3YXkuICopXG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBDb3VsZF9ub3RfY29uc3RydWN0IHNleHAgLT5cbiAgICAgIFwiY291bGQgbm90IGNvbnN0cnVjdCBpbmZvOiBcIiA6OiBTZXhwLnRvX3N0cmluZ19tYWNoIHNleHAgOjogYWNcbiAgICB8IFN0cmluZyBzdHJpbmcgLT4gc3RyaW5nIDo6IGFjXG4gICAgfCBFeG4gZXhuIC0+IFNleHAudG9fc3RyaW5nX21hY2ggKEV4bi5zZXhwX29mX3QgZXhuKSA6OiBhY1xuICAgIHwgU2V4cCBzZXhwIC0+IFNleHAudG9fc3RyaW5nX21hY2ggc2V4cCA6OiBhY1xuICAgIHwgVGFnX3NleHAgKHRhZywgc2V4cCwgXykgLT4gdGFnIDo6IFwiOiBcIiA6OiBTZXhwLnRvX3N0cmluZ19tYWNoIHNleHAgOjogYWNcbiAgICB8IFRhZ190ICh0YWcsIHQpIC0+IHRhZyA6OiBcIjogXCIgOjogdG9fc3RyaW5nc19odW0gdCBhY1xuICAgIHwgVGFnX2FyZyAodGFnLCBzZXhwLCB0KSAtPlxuICAgICAgbGV0IGJvZHkgPSBTZXhwLnRvX3N0cmluZ19tYWNoIHNleHAgOjogXCI6IFwiIDo6IHRvX3N0cmluZ3NfaHVtIHQgYWMgaW5cbiAgICAgIGlmIFN0cmluZy5sZW5ndGggdGFnID0gMCB0aGVuIGJvZHkgZWxzZSB0YWcgOjogXCI6IFwiIDo6IGJvZHlcbiAgICB8IFdpdGhfYmFja3RyYWNlICh0LCBiYWNrdHJhY2UpIC0+XG4gICAgICB0b19zdHJpbmdzX2h1bSB0IChcIlxcbkJhY2t0cmFjZTpcXG5cIiA6OiBiYWNrdHJhY2UgOjogYWMpXG4gICAgfCBPZl9saXN0ICh0cnVuY19hZnRlciwgdHMpIC0+XG4gICAgICBsZXQgdHMgPVxuICAgICAgICBtYXRjaCB0cnVuY19hZnRlciB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiB0c1xuICAgICAgICB8IFNvbWUgbWF4IC0+XG4gICAgICAgICAgbGV0IG4gPSBMaXN0Lmxlbmd0aCB0cyBpblxuICAgICAgICAgIGlmIG4gPD0gbWF4XG4gICAgICAgICAgdGhlbiB0c1xuICAgICAgICAgIGVsc2UgTGlzdC50YWtlIHRzIG1heCBAIFsgU3RyaW5nIChQcmludGYuc3ByaW50ZiBcImFuZCAlZCBtb3JlIGluZm9cIiAobiAtIG1heCkpIF1cbiAgICAgIGluXG4gICAgICBMaXN0LmZvbGQgKExpc3QucmV2IHRzKSB+aW5pdDphYyB+ZjooZnVuIGFjIHQgLT5cbiAgICAgICAgdG9fc3RyaW5nc19odW0gdCAoaWYgTGlzdC5pc19lbXB0eSBhYyB0aGVuIGFjIGVsc2UgXCI7IFwiIDo6IGFjKSlcbiAgOztcblxuICBsZXQgdG9fc3RyaW5nX2h1bV9kZXByZWNhdGVkIHQgPSBTdHJpbmcuY29uY2F0ICh0b19zdHJpbmdzX2h1bSB0IFtdKVxuXG4gIGxldCByZWMgdG9fc2V4cHNfaHVtIHQgYWMgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgQ291bGRfbm90X2NvbnN0cnVjdCBfIGFzIHQgLT4gc2V4cF9vZl90IHQgOjogYWNcbiAgICB8IFN0cmluZyBzdHJpbmcgLT4gQXRvbSBzdHJpbmcgOjogYWNcbiAgICB8IEV4biBleG4gLT4gRXhuLnNleHBfb2ZfdCBleG4gOjogYWNcbiAgICB8IFNleHAgc2V4cCAtPiBzZXhwIDo6IGFjXG4gICAgfCBUYWdfc2V4cCAodGFnLCBzZXhwLCBoZXJlKSAtPlxuICAgICAgTGlzdFxuICAgICAgICAoQXRvbSB0YWdcbiAgICAgICAgIDo6IHNleHBcbiAgICAgICAgIDo6XG4gICAgICAgICAobWF0Y2ggaGVyZSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IFtdXG4gICAgICAgICAgfCBTb21lIGhlcmUgLT4gWyBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90IGhlcmUgXSkpXG4gICAgICA6OiBhY1xuICAgIHwgVGFnX3QgKHRhZywgdCkgLT4gTGlzdCAoQXRvbSB0YWcgOjogdG9fc2V4cHNfaHVtIHQgW10pIDo6IGFjXG4gICAgfCBUYWdfYXJnICh0YWcsIHNleHAsIHQpIC0+XG4gICAgICBsZXQgYm9keSA9IHNleHAgOjogdG9fc2V4cHNfaHVtIHQgW10gaW5cbiAgICAgIGlmIFN0cmluZy5sZW5ndGggdGFnID0gMCB0aGVuIExpc3QgYm9keSA6OiBhYyBlbHNlIExpc3QgKEF0b20gdGFnIDo6IGJvZHkpIDo6IGFjXG4gICAgfCBXaXRoX2JhY2t0cmFjZSAodCwgYmFja3RyYWNlKSAtPlxuICAgICAgU2V4cC5MaXN0IFsgdG9fc2V4cF9odW0gdDsgU2V4cC5BdG9tIGJhY2t0cmFjZSBdIDo6IGFjXG4gICAgfCBPZl9saXN0IChfLCB0cykgLT5cbiAgICAgIExpc3QuZm9sZCAoTGlzdC5yZXYgdHMpIH5pbml0OmFjIH5mOihmdW4gYWMgdCAtPiB0b19zZXhwc19odW0gdCBhYylcblxuICBhbmQgdG9fc2V4cF9odW0gdCA9XG4gICAgbWF0Y2ggdG9fc2V4cHNfaHVtIHQgW10gd2l0aFxuICAgIHwgWyBzZXhwIF0gLT4gc2V4cFxuICAgIHwgc2V4cHMgLT4gU2V4cC5MaXN0IHNleHBzXG4gIDs7XG5cbiAgKCogV2UgdXNlIFtwcm90ZWN0XSB0byBndWFyZCBhZ2FpbnN0IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHVzZXItc3VwcGxpZWQgZnVuY3Rpb25zLCBzb1xuICAgICB0aGF0IGZhaWx1cmUgdG8gcHJvZHVjZSBvbmUgcGFydCBvZiBhbiBpbmZvIGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgcGFydHMuICopXG4gIGxldCBwcm90ZWN0IGYgPVxuICAgIHRyeSBmICgpIHdpdGhcbiAgICB8IGV4biAtPiBDb3VsZF9ub3RfY29uc3RydWN0IChFeG4uc2V4cF9vZl90IGV4bilcbiAgOztcblxuICBsZXQgb2ZfaW5mbyBpbmZvID0gcHJvdGVjdCAoZnVuICgpIC0+IExhenkuZm9yY2UgaW5mbylcbiAgbGV0IHRvX2luZm8gdCA9IGxhenkgdFxuZW5kXG5cbm9wZW4gTWVzc2FnZVxuXG50eXBlIHQgPSBNZXNzYWdlLnQgTGF6eS50XG5cbmxldCBpbnZhcmlhbnQgXyA9ICgpXG5sZXQgdG9fbWVzc2FnZSA9IE1lc3NhZ2Uub2ZfaW5mb1xubGV0IG9mX21lc3NhZ2UgPSBNZXNzYWdlLnRvX2luZm9cblxuKCogSXQgaXMgT0sgdG8gdXNlIFtNZXNzYWdlLnRvX3NleHBfaHVtXSwgd2hpY2ggaXMgbm90IHN0YWJsZSwgYmVjYXVzZSBbdF9vZl9zZXhwXSBiZWxvd1xuICAgY2FuIGhhbmRsZSBhbnkgc2V4cC4gKilcbmxldCBzZXhwX29mX3QgdCA9IE1lc3NhZ2UudG9fc2V4cF9odW0gKHRvX21lc3NhZ2UgdClcbmxldCB0X29mX3NleHAgc2V4cCA9IGxhenkgKE1lc3NhZ2UuU2V4cCBzZXhwKVxubGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0geyB1bnR5cGVkID0gQW55IFwiSW5mby50XCIgfVxubGV0IGNvbXBhcmUgdDEgdDIgPSBTZXhwLmNvbXBhcmUgKHNleHBfb2ZfdCB0MSkgKHNleHBfb2ZfdCB0MilcbmxldCBlcXVhbCB0MSB0MiA9IFNleHAuZXF1YWwgKHNleHBfb2ZfdCB0MSkgKHNleHBfb2ZfdCB0MilcbmxldCBoYXNoX2ZvbGRfdCBzdGF0ZSB0ID0gU2V4cC5oYXNoX2ZvbGRfdCBzdGF0ZSAoc2V4cF9vZl90IHQpXG5sZXQgaGFzaCB0ID0gSGFzaC5ydW4gaGFzaF9mb2xkX3QgdFxuXG5sZXQgdG9fc3RyaW5nX2h1bSB0ID1cbiAgbWF0Y2ggdG9fbWVzc2FnZSB0IHdpdGhcbiAgfCBTdHJpbmcgcyAtPiBzXG4gIHwgbWVzc2FnZSAtPiBTZXhwLnRvX3N0cmluZ19odW0gKE1lc3NhZ2UudG9fc2V4cF9odW0gbWVzc2FnZSlcbjs7XG5cbmxldCB0b19zdHJpbmdfaHVtX2RlcHJlY2F0ZWQgdCA9IE1lc3NhZ2UudG9fc3RyaW5nX2h1bV9kZXByZWNhdGVkICh0b19tZXNzYWdlIHQpXG5sZXQgdG9fc3RyaW5nX21hY2ggdCA9IFNleHAudG9fc3RyaW5nX21hY2ggKHNleHBfb2ZfdCB0KVxubGV0IG9mX2xhenkgbCA9IGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBTdHJpbmcgKExhenkuZm9yY2UgbCkpKVxubGV0IG9mX2xhenlfc2V4cCBsID0gbGF6eSAocHJvdGVjdCAoZnVuICgpIC0+IFNleHAgKExhenkuZm9yY2UgbCkpKVxubGV0IG9mX2xhenlfdCBsYXp5X3QgPSBMYXp5LmpvaW4gbGF6eV90XG5sZXQgb2Zfc3RyaW5nIG1lc3NhZ2UgPSBMYXp5LmZyb21fdmFsIChTdHJpbmcgbWVzc2FnZSlcbmxldCBjcmVhdGVmIGZvcm1hdCA9IFByaW50Zi5rc3ByaW50ZiBvZl9zdHJpbmcgZm9ybWF0XG5sZXQgb2ZfdGh1bmsgZiA9IGxhenkgKHByb3RlY3QgKGZ1biAoKSAtPiBTdHJpbmcgKGYgKCkpKSlcblxubGV0IGNyZWF0ZSA/aGVyZSA/c3RyaWN0IHRhZyB4IHNleHBfb2ZfeCA9XG4gIG1hdGNoIHN0cmljdCB3aXRoXG4gIHwgTm9uZSAtPiBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gVGFnX3NleHAgKHRhZywgc2V4cF9vZl94IHgsIGhlcmUpKSlcbiAgfCBTb21lICgpIC0+IG9mX21lc3NhZ2UgKFRhZ19zZXhwICh0YWcsIHNleHBfb2ZfeCB4LCBoZXJlKSlcbjs7XG5cbmxldCBjcmVhdGVfcyBzZXhwID0gTGF6eS5mcm9tX3ZhbCAoU2V4cCBzZXhwKVxubGV0IHRhZyB0IH50YWcgPSBsYXp5IChUYWdfdCAodGFnLCB0b19tZXNzYWdlIHQpKVxuXG5sZXQgdGFnX3NfbGF6eSB0IH50YWcgPVxuICBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gVGFnX2FyZyAoXCJcIiwgTGF6eS5mb3JjZSB0YWcsIHRvX21lc3NhZ2UgdCkpKVxuOztcblxubGV0IHRhZ19zIHQgfnRhZyA9IHRhZ19zX2xhenkgdCB+dGFnOihMYXp5LmZyb21fdmFsIHRhZylcblxubGV0IHRhZ19hcmcgdCB0YWcgeCBzZXhwX29mX3ggPVxuICBsYXp5IChwcm90ZWN0IChmdW4gKCkgLT4gVGFnX2FyZyAodGFnLCBzZXhwX29mX3ggeCwgdG9fbWVzc2FnZSB0KSkpXG47O1xuXG5sZXQgb2ZfbGlzdCA/dHJ1bmNfYWZ0ZXIgdHMgPSBsYXp5IChPZl9saXN0ICh0cnVuY19hZnRlciwgTGlzdC5tYXAgdHMgfmY6dG9fbWVzc2FnZSkpXG5cbmV4Y2VwdGlvbiBFeG4gb2YgdFxuXG5sZXQgKCkgPVxuICAoKiBXZSBpbnN0YWxsIGEgY3VzdG9tIGV4bi1jb252ZXJ0ZXIgcmF0aGVyIHRoYW4gdXNlXG4gICAgIFtleGNlcHRpb24gRXhuIG9mIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdIC4uLiBbQEBAZW5kXV0gdG8gZWxpbWluYXRlIHRoZSBleHRyYVxuICAgICB3cmFwcGluZyBvZiBcIihFeG4gLi4uKVwiLiAqKVxuICBTZXhwbGliMC5TZXhwX2NvbnYuRXhuX2NvbnZlcnRlci5hZGQgWyVleHRlbnNpb25fY29uc3RydWN0b3IgRXhuXSAoZnVuY3Rpb25cbiAgICB8IEV4biB0IC0+IHNleHBfb2ZfdCB0XG4gICAgfCBfIC0+XG4gICAgICAoKiBSZWFjaGluZyB0aGlzIGJyYW5jaCBpbmRpY2F0ZXMgYSBidWcgaW4gc2V4cGxpYi4gKilcbiAgICAgIGFzc2VydCBmYWxzZSlcbjs7XG5cbmxldCB0b19leG4gdCA9XG4gIGlmIG5vdCAoTGF6eS5pc192YWwgdClcbiAgdGhlbiBFeG4gdFxuICBlbHNlIChcbiAgICBtYXRjaCBMYXp5LmZvcmNlIHQgd2l0aFxuICAgIHwgTWVzc2FnZS5FeG4gZXhuIC0+IGV4blxuICAgIHwgXyAtPiBFeG4gdClcbjs7XG5cbmxldCBvZl9leG4gP2JhY2t0cmFjZSBleG4gPVxuICBsZXQgYmFja3RyYWNlID1cbiAgICBtYXRjaCBiYWNrdHJhY2Ugd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIGBHZXQgLT4gU29tZSAoQ2FtbC5QcmludGV4Yy5nZXRfYmFja3RyYWNlICgpKVxuICAgIHwgU29tZSAoYFRoaXMgcykgLT4gU29tZSBzXG4gIGluXG4gIG1hdGNoIGV4biwgYmFja3RyYWNlIHdpdGhcbiAgfCBFeG4gdCwgTm9uZSAtPiB0XG4gIHwgRXhuIHQsIFNvbWUgYmFja3RyYWNlIC0+IGxhenkgKFdpdGhfYmFja3RyYWNlICh0b19tZXNzYWdlIHQsIGJhY2t0cmFjZSkpXG4gIHwgXywgTm9uZSAtPiBMYXp5LmZyb21fdmFsIChNZXNzYWdlLkV4biBleG4pXG4gIHwgXywgU29tZSBiYWNrdHJhY2UgLT4gbGF6eSAoV2l0aF9iYWNrdHJhY2UgKFNleHAgKEV4bi5zZXhwX29mX3QgZXhuKSwgYmFja3RyYWNlKSlcbjs7XG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXJfcHAgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW5mb1wiXG4gICAgbGV0IHBwIHBwZiB0ID0gQ2FtbC5Gb3JtYXQucHBfcHJpbnRfc3RyaW5nIHBwZiAodG9fc3RyaW5nX2h1bSB0KVxuICBlbmQpXG5cbm1vZHVsZSBJbnRlcm5hbF9yZXByID0gTWVzc2FnZVxuXG4iLCIoKiBUaGlzIG1vZHVsZSBpcyB0cnlpbmcgdG8gbWluaW1pemUgZGVwZW5kZW5jaWVzIG9uIG1vZHVsZXMgaW4gQ29yZSwgc28gYXMgdG8gYWxsb3dcbiAgIFtFcnJvcl0gYW5kIFtPcl9lcnJvcl0gdG8gYmUgdXNlZCBpbiB2YXJpb3VzIHBsYWNlcy4gIFBsZWFzZSBhdm9pZCBhZGRpbmcgbmV3XG4gICBkZXBlbmRlbmNpZXMuICopXG5cbm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJbmZvXG5cbmxldCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgPSB7IHVudHlwZWQgPSBBbnkgXCJFcnJvci50XCIgfVxubGV0IHJhaXNlIHQgPSByYWlzZSAodG9fZXhuIHQpXG5sZXQgcmFpc2VfcyBzZXhwID0gcmFpc2UgKGNyZWF0ZV9zIHNleHApXG5sZXQgdG9faW5mbyB0ID0gdFxubGV0IG9mX2luZm8gdCA9IHRcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3Rlcl9wcCAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5FcnJvclwiXG4gICAgbGV0IHBwID0gcHBcbiAgZW5kKVxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEludmFyaWFudF9pbnRmXG5cbmxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG5sZXQgaW52YXJpYW50IGhlcmUgdCBzZXhwX29mX3QgZiA6IHVuaXQgPVxuICB0cnkgZiAoKSB3aXRoXG4gIHwgZXhuIC0+XG4gICAgcmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJpbnZhcmlhbnQgZmFpbGVkXCJcbiAgICAgICAgIFsgXCJcIiwgU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdCBoZXJlXG4gICAgICAgICA7IFwiZXhuXCIsIHNleHBfb2ZfZXhuIGV4blxuICAgICAgICAgOyBcIlwiLCBzZXhwX29mX3QgdFxuICAgICAgICAgXSlcbjs7XG5cbmxldCBjaGVja19maWVsZCB0IGYgZmllbGQgPVxuICB0cnkgZiAoRmllbGQuZ2V0IGZpZWxkIHQpIHdpdGhcbiAgfCBleG4gLT5cbiAgICByYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcInByb2JsZW0gd2l0aCBmaWVsZFwiXG4gICAgICAgICBbIFwiZmllbGRcIiwgc2V4cF9vZl9zdHJpbmcgKEZpZWxkLm5hbWUgZmllbGQpOyBcImV4blwiLCBzZXhwX29mX2V4biBleG4gXSlcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuaW5jbHVkZSAoXG4gIFJlc3VsdCA6XG4gICAgbW9kdWxlIHR5cGUgb2Ygc3RydWN0XG4gICAgaW5jbHVkZSBSZXN1bHRcbiAgZW5kXG4gIHdpdGggbW9kdWxlIEVycm9yIDo9IFJlc3VsdC5FcnJvcilcblxudHlwZSAnYSB0ID0gKCdhLCBFcnJvci50KSBSZXN1bHQudFxuW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCBjb21wYXJlIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHQgLT4gJ2EgdCAtPiBpbnQgPVxuICBmdW4gX2NtcF9fYSBhX18wMDFfIGJfXzAwMl8gLT4gUmVzdWx0LmNvbXBhcmUgX2NtcF9fYSBFcnJvci5jb21wYXJlIGFfXzAwMV8gYl9fMDAyX1xuOztcblxubGV0IGVxdWFsIDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgLT4gYm9vbCA9XG4gIGZ1biBfY21wX19hIGFfXzAwN18gYl9fMDA4XyAtPiBSZXN1bHQuZXF1YWwgX2NtcF9fYSBFcnJvci5lcXVhbCBhX18wMDdfIGJfXzAwOF9cbjs7XG5cbmxldCBoYXNoX2ZvbGRfdCA6XG4gICdhLlxuICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+ICdhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gIC0+ICdhIHRcbiAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gID1cbiAgZnVuIF9oYXNoX2ZvbGRfYSBoc3YgYXJnIC0+IFJlc3VsdC5oYXNoX2ZvbGRfdCBfaGFzaF9mb2xkX2EgRXJyb3IuaGFzaF9mb2xkX3QgaHN2IGFyZ1xuOztcblxubGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9XG4gIGZ1biBfb2ZfYV9fMDEzXyB4X18wMTVfIC0+IFJlc3VsdC50X29mX3NleHAgX29mX2FfXzAxM18gRXJyb3IudF9vZl9zZXhwIHhfXzAxNV9cbjs7XG5cbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICBmdW4gX29mX2FfXzAxNl8geF9fMDE3XyAtPiBSZXN1bHQuc2V4cF9vZl90IF9vZl9hX18wMTZfIEVycm9yLnNleHBfb2ZfdCB4X18wMTdfXG47O1xuXG5sZXQgKHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBSZXN1bHQudF9zZXhwX2dyYW1tYXIgXydhX3NleHBfZ3JhbW1hciBFcnJvci50X3NleHBfZ3JhbW1hclxuOztcblxuW0BAQGVuZF1cblxubGV0IGludmFyaWFudCBpbnZhcmlhbnRfYSB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgT2sgYSAtPiBpbnZhcmlhbnRfYSBhXG4gIHwgRXJyb3IgZXJyb3IgLT4gRXJyb3IuaW52YXJpYW50IGVycm9yXG47O1xuXG5pbmNsdWRlIEFwcGxpY2F0aXZlLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG5cbiAgICBsZXQgYXBwbHkgZiB4ID1cbiAgICAgIFJlc3VsdC5jb21iaW5lIGYgeCB+b2s6KGZ1biBmIHggLT4gZiB4KSB+ZXJyOihmdW4gZTEgZTIgLT4gRXJyb3Iub2ZfbGlzdCBbIGUxOyBlMiBdKVxuICAgIDs7XG5cbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgZW5kKVxuXG5tb2R1bGUgTGV0X3N5bnRheCA9IHN0cnVjdFxuICBsZXQgcmV0dXJuID0gcmV0dXJuXG5cbiAgaW5jbHVkZSBNb25hZF9pbmZpeFxuXG4gIG1vZHVsZSBMZXRfc3ludGF4ID0gc3RydWN0XG4gICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgIGxldCBtYXAgPSBtYXBcbiAgICBsZXQgYmluZCA9IGJpbmRcbiAgICBsZXQgYm90aCA9IGJvdGhcblxuICAgICgqIGZyb20gQXBwbGljYXRpdmUuTWFrZSAqKVxuICAgIG1vZHVsZSBPcGVuX29uX3JocyA9IHN0cnVjdCBlbmRcbiAgZW5kXG5lbmRcblxubGV0IG9rID0gUmVzdWx0Lm9rXG5sZXQgaXNfb2sgPSBSZXN1bHQuaXNfb2tcbmxldCBpc19lcnJvciA9IFJlc3VsdC5pc19lcnJvclxuXG5sZXQgdHJ5X3dpdGggPyhiYWNrdHJhY2UgPSBmYWxzZSkgZiA9XG4gIHRyeSBPayAoZiAoKSkgd2l0aFxuICB8IGV4biAtPiBFcnJvciAoRXJyb3Iub2ZfZXhuIGV4biA/YmFja3RyYWNlOihpZiBiYWNrdHJhY2UgdGhlbiBTb21lIGBHZXQgZWxzZSBOb25lKSlcbjs7XG5cbmxldCB0cnlfd2l0aF9qb2luID9iYWNrdHJhY2UgZiA9IGpvaW4gKHRyeV93aXRoID9iYWNrdHJhY2UgZilcblxubGV0IG9rX2V4biA9IGZ1bmN0aW9uXG4gIHwgT2sgeCAtPiB4XG4gIHwgRXJyb3IgZXJyIC0+IEVycm9yLnJhaXNlIGVyclxuOztcblxubGV0IG9mX2V4biA/YmFja3RyYWNlIGV4biA9IEVycm9yIChFcnJvci5vZl9leG4gP2JhY2t0cmFjZSBleG4pXG5cbmxldCBvZl9leG5fcmVzdWx0ID9iYWNrdHJhY2UgPSBmdW5jdGlvblxuICB8IE9rIF8gYXMgeiAtPiB6XG4gIHwgRXJyb3IgZXhuIC0+IG9mX2V4biA/YmFja3RyYWNlIGV4blxuOztcblxubGV0IGVycm9yID9oZXJlID9zdHJpY3QgbWVzc2FnZSBhIHNleHBfb2ZfYSA9XG4gIEVycm9yIChFcnJvci5jcmVhdGUgP2hlcmUgP3N0cmljdCBtZXNzYWdlIGEgc2V4cF9vZl9hKVxuOztcblxubGV0IGVycm9yX3Mgc2V4cCA9IEVycm9yIChFcnJvci5jcmVhdGVfcyBzZXhwKVxubGV0IGVycm9yX3N0cmluZyBtZXNzYWdlID0gRXJyb3IgKEVycm9yLm9mX3N0cmluZyBtZXNzYWdlKVxubGV0IGVycm9yZiBmb3JtYXQgPSBQcmludGYua3NwcmludGYgZXJyb3Jfc3RyaW5nIGZvcm1hdFxubGV0IHRhZyB0IH50YWcgPSBSZXN1bHQubWFwX2Vycm9yIHQgfmY6KEVycm9yLnRhZyB+dGFnKVxubGV0IHRhZ19zIHQgfnRhZyA9IFJlc3VsdC5tYXBfZXJyb3IgdCB+ZjooRXJyb3IudGFnX3MgfnRhZylcbmxldCB0YWdfc19sYXp5IHQgfnRhZyA9IFJlc3VsdC5tYXBfZXJyb3IgdCB+ZjooRXJyb3IudGFnX3NfbGF6eSB+dGFnKVxuXG5sZXQgdGFnX2FyZyB0IG1lc3NhZ2UgYSBzZXhwX29mX2EgPVxuICBSZXN1bHQubWFwX2Vycm9yIHQgfmY6KGZ1biBlIC0+IEVycm9yLnRhZ19hcmcgZSBtZXNzYWdlIGEgc2V4cF9vZl9hKVxuOztcblxubGV0IHVuaW1wbGVtZW50ZWQgcyA9IGVycm9yIFwidW5pbXBsZW1lbnRlZFwiIHMgc2V4cF9vZl9zdHJpbmdcbmxldCBjb21iaW5lX2Vycm9ycyBsID0gUmVzdWx0Lm1hcF9lcnJvciAoUmVzdWx0LmNvbWJpbmVfZXJyb3JzIGwpIH5mOkVycm9yLm9mX2xpc3RcbmxldCBjb21iaW5lX2Vycm9yc191bml0IGwgPSBSZXN1bHQubWFwIChjb21iaW5lX2Vycm9ycyBsKSB+ZjooZnVuIChfIDogdW5pdCBsaXN0KSAtPiAoKSlcblxubGV0IGZpbHRlcl9va19hdF9sZWFzdF9vbmUgbCA9XG4gIGxldCBvaywgZXJycyA9IExpc3QucGFydGl0aW9uX21hcCBsIH5mOlJlc3VsdC50b19laXRoZXIgaW5cbiAgbWF0Y2ggb2sgd2l0aFxuICB8IFtdIC0+IEVycm9yIChFcnJvci5vZl9saXN0IGVycnMpXG4gIHwgXyAtPiBPayBva1xuOztcblxubGV0IGZpbmRfb2sgbCA9XG4gIG1hdGNoIExpc3QuZmluZF9tYXAgbCB+ZjpSZXN1bHQub2sgd2l0aFxuICB8IFNvbWUgeCAtPiBPayB4XG4gIHwgTm9uZSAtPlxuICAgIEVycm9yXG4gICAgICAoRXJyb3Iub2ZfbGlzdFxuICAgICAgICAgKExpc3QubWFwIGwgfmY6KGZ1bmN0aW9uXG4gICAgICAgICAgICB8IE9rIF8gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgICB8IEVycm9yIGVyciAtPiBlcnIpKSlcbjs7XG5cbmxldCBmaW5kX21hcF9vayBsIH5mID1cbiAgV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm4gKGZ1biB7IHJldHVybiB9IC0+XG4gICAgRXJyb3JcbiAgICAgIChFcnJvci5vZl9saXN0XG4gICAgICAgICAoTGlzdC5tYXAgbCB+ZjooZnVuIGVsdCAtPlxuICAgICAgICAgICAgbWF0Y2ggZiBlbHQgd2l0aFxuICAgICAgICAgICAgfCBPayBfIGFzIHggLT4gcmV0dXJuIHhcbiAgICAgICAgICAgIHwgRXJyb3IgZXJyIC0+IGVycikpKSlcbjs7XG5cbmxldCBtYXAgPSBSZXN1bHQubWFwXG5sZXQgaXRlciA9IFJlc3VsdC5pdGVyXG5sZXQgaXRlcl9lcnJvciA9IFJlc3VsdC5pdGVyX2Vycm9yXG4iLCIoKiBUaGlzIGlzIGJyb2tlbiBvZmYgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIFNpZ24gYW5kIENvbXBhcmFibGUuICopXG5cbm9wZW4hIEltcG9ydFxuXG50eXBlIHQgPVxuICB8IE5lZ1xuICB8IFplcm9cbiAgfCBQb3NcbltAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXIsIGNvbXBhcmUsIGhhc2gsIGVudW1lcmF0ZV1cblxubGV0IHRfb2Zfc2V4cCA9XG4gIChsZXQgZXJyb3Jfc291cmNlX18wMDNfID0gXCJzaWduMC5tbC50XCIgaW5cbiAgIGZ1bmN0aW9uXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJuZWdcIiB8IFwiTmVnXCIpIC0+IE5lZ1xuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiemVyb1wiIHwgXCJaZXJvXCIpIC0+IFplcm9cbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInBvc1wiIHwgXCJQb3NcIikgLT4gUG9zXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5lZ1wiIHwgXCJOZWdcIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwicG9zXCIgfCBcIlBvc1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDJfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDAyXyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgfCBzZXhwX18wMDJfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwMl9cbiAgICAgICAgICAgICAgICAgICA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuOztcblxubGV0IHNleHBfb2ZfdCA9XG4gIChmdW5jdGlvblxuICAgIHwgTmVnIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIk5lZ1wiXG4gICAgfCBaZXJvIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlplcm9cIlxuICAgIHwgUG9zIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlBvc1wiXG4gICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbjs7XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnIHsgbmFtZSA9IFwiTmVnXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJaZXJvXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJQb3NcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxubGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuXG5sZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gIChmdW4gaHN2IGFyZyAtPlxuICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICB8IE5lZyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDBcbiAgICAgfCBaZXJvIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMVxuICAgICB8IFBvcyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDJcbiAgICAgICAgICAgICAgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG47O1xuXG5sZXQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gIGxldCBmdW5jIGFyZyA9XG4gICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmdldF9oYXNoX3ZhbHVlXG4gICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICBoYXNoX2ZvbGRfdCBoc3YgYXJnKVxuICBpblxuICBmdW4geCAtPiBmdW5jIHhcbjs7XG5cbmxldCBhbGwgPSAoWyBOZWc7IFplcm87IFBvcyBdIDogdCBsaXN0KVxuXG5bQEBAZW5kXVxuXG5tb2R1bGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gIGxldCAoIDwgKSAoeCA6IHQpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogdCkgeSA9IFBvbHkuKCA8PSApIHggeVxuICBsZXQgKCA8PiApICh4IDogdCkgeSA9IFBvbHkuKCA8PiApIHggeVxuICBsZXQgKCA9ICkgKHggOiB0KSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogdCkgeSA9IFBvbHkuKCA+ICkgeCB5XG4gIGxldCAoID49ICkgKHggOiB0KSB5ID0gUG9seS4oID49ICkgeCB5XG4gIGxldCBhc2NlbmRpbmcgKHggOiB0KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogdCkgeSA9IFBvbHkuZGVzY2VuZGluZyB4IHlcbiAgbGV0IGNvbXBhcmUgKHggOiB0KSB5ID0gUG9seS5jb21wYXJlIHggeVxuICBsZXQgZXF1YWwgKHggOiB0KSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IHQpIHkgPSBpZiB4ID49IHkgdGhlbiB4IGVsc2UgeVxuICBsZXQgbWluICh4IDogdCkgeSA9IGlmIHggPD0geSB0aGVuIHggZWxzZSB5XG5lbmRcblxubGV0IG9mX3N0cmluZyBzID0gdF9vZl9zZXhwIChzZXhwX29mX3N0cmluZyBzKVxubGV0IHRvX3N0cmluZyB0ID0gc3RyaW5nX29mX3NleHAgKHNleHBfb2ZfdCB0KVxuXG5sZXQgdG9faW50ID0gZnVuY3Rpb25cbiAgfCBOZWcgLT4gLTFcbiAgfCBaZXJvIC0+IDBcbiAgfCBQb3MgLT4gMVxuOztcblxubGV0IF8gPSBoYXNoXG5cbigqIElnbm9yZSB0aGUgaGFzaCBmdW5jdGlvbiBwcm9kdWNlZCBieSBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaF0gKilcbmxldCBoYXNoID0gdG9faW50XG5sZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuU2lnblwiXG5sZXQgb2ZfaW50IG4gPSBpZiBuIDwgMCB0aGVuIE5lZyBlbHNlIGlmIG4gPSAwIHRoZW4gWmVybyBlbHNlIFBvc1xuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIENvbXBhcmFibGVfaW50ZlxuXG5tb2R1bGUgV2l0aF96ZXJvIChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIFtAQEBlbmRdXG5cbiAgICB2YWwgemVybyA6IHRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgb3BlbiBUXG5cbiAgbGV0IGlzX3Bvc2l0aXZlIHQgPSBjb21wYXJlIHQgemVybyA+IDBcbiAgbGV0IGlzX25vbl9uZWdhdGl2ZSB0ID0gY29tcGFyZSB0IHplcm8gPj0gMFxuICBsZXQgaXNfbmVnYXRpdmUgdCA9IGNvbXBhcmUgdCB6ZXJvIDwgMFxuICBsZXQgaXNfbm9uX3Bvc2l0aXZlIHQgPSBjb21wYXJlIHQgemVybyA8PSAwXG4gIGxldCBzaWduIHQgPSBTaWduMC5vZl9pbnQgKGNvbXBhcmUgdCB6ZXJvKVxuZW5kXG5cbm1vZHVsZSBQb2x5IChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpID1cbnN0cnVjdFxuICBtb2R1bGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gc3RydWN0XG4gICAgdHlwZSB0ID0gVC50IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgbGV0IHNleHBfb2ZfdCA9IChULnNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuXG4gICAgW0BAQGVuZF1cblxuICAgIGluY2x1ZGUgUG9seVxuICBlbmRcblxuICBpbmNsdWRlIFBvbHlcblxuICBsZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbiAgbGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxuICBsZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICAgIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuICA7O1xuXG4gIGxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4XG4gICAgdGhlblxuICAgICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICAgIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbiAgOztcblxuICBtb2R1bGUgQyA9IHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuICAgIGluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUpXG4gIGVuZFxuXG4gIGluY2x1ZGUgQ1xuZW5kXG5cbmxldCBndCBjbXAgYSBiID0gY21wIGEgYiA+IDBcbmxldCBsdCBjbXAgYSBiID0gY21wIGEgYiA8IDBcbmxldCBnZXEgY21wIGEgYiA9IGNtcCBhIGIgPj0gMFxubGV0IGxlcSBjbXAgYSBiID0gY21wIGEgYiA8PSAwXG5sZXQgZXF1YWwgY21wIGEgYiA9IGNtcCBhIGIgPSAwXG5sZXQgbm90X2VxdWFsIGNtcCBhIGIgPSBjbXAgYSBiIDw+IDBcbmxldCBtaW4gY21wIHQgdCcgPSBpZiBsZXEgY21wIHQgdCcgdGhlbiB0IGVsc2UgdCdcbmxldCBtYXggY21wIHQgdCcgPSBpZiBnZXEgY21wIHQgdCcgdGhlbiB0IGVsc2UgdCdcblxubW9kdWxlIEluZml4IChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIFtAQEBlbmRdXG4gIGVuZCkgOiBJbmZpeCB3aXRoIHR5cGUgdCA6PSBULnQgPSBzdHJ1Y3RcbiAgbGV0ICggPiApIGEgYiA9IGd0IFQuY29tcGFyZSBhIGJcbiAgbGV0ICggPCApIGEgYiA9IGx0IFQuY29tcGFyZSBhIGJcbiAgbGV0ICggPj0gKSBhIGIgPSBnZXEgVC5jb21wYXJlIGEgYlxuICBsZXQgKCA8PSApIGEgYiA9IGxlcSBULmNvbXBhcmUgYSBiXG4gIGxldCAoID0gKSBhIGIgPSBlcXVhbCBULmNvbXBhcmUgYSBiXG4gIGxldCAoIDw+ICkgYSBiID0gbm90X2VxdWFsIFQuY29tcGFyZSBhIGJcbmVuZFxuXG5tb2R1bGUgUG9seW1vcnBoaWNfY29tcGFyZSAoVCA6IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZV1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgICBbQEBAZW5kXVxuICBlbmQpIDogUG9seW1vcnBoaWNfY29tcGFyZSB3aXRoIHR5cGUgdCA6PSBULnQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBJbmZpeCAoVClcblxuICBsZXQgY29tcGFyZSA9IFQuY29tcGFyZVxuICBsZXQgZXF1YWwgPSAoID0gKVxuICBsZXQgbWluIHQgdCcgPSBtaW4gY29tcGFyZSB0IHQnXG4gIGxldCBtYXggdCB0JyA9IG1heCBjb21wYXJlIHQgdCdcbmVuZFxuXG5tb2R1bGUgTWFrZV91c2luZ19jb21wYXJhdG9yIChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgaW5jbHVkZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgOj0gdFxuICBlbmQpIDogUyB3aXRoIHR5cGUgdCA6PSBULnQgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gVC5jb21wYXJhdG9yX3dpdG5lc3MgPSBzdHJ1Y3RcbiAgbW9kdWxlIFQgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlXG4gIGVuZFxuXG4gIGluY2x1ZGUgVFxuICBtb2R1bGUgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlID0gUG9seW1vcnBoaWNfY29tcGFyZSAoVClcbiAgaW5jbHVkZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgYXNjZW5kaW5nID0gY29tcGFyZVxuICBsZXQgZGVzY2VuZGluZyB0IHQnID0gY29tcGFyZSB0JyB0XG4gIGxldCBiZXR3ZWVuIHQgfmxvdyB+aGlnaCA9IGxvdyA8PSB0ICYmIHQgPD0gaGlnaFxuICBsZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG4gIGxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICAgIGFzc2VydCAobWluIDw9IG1heCk7XG4gICAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG4gIDs7XG5cbiAgbGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgICBpZiBtaW4gPiBtYXhcbiAgICB0aGVuXG4gICAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG4gICAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuICA7O1xuZW5kXG5cbm1vZHVsZSBNYWtlIChUIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSA9XG4gIE1ha2VfdXNpbmdfY29tcGFyYXRvciAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG4gICAgaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG4gIGVuZClcblxubW9kdWxlIEluaGVyaXQgKEMgOiBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmVdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kKSAoVCA6IHNpZ1xuICAgICAgICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgICAgICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgICAgICAgW0BAQGVuZF1cblxuICAgICAgICAgIHZhbCBjb21wb25lbnQgOiB0IC0+IEMudFxuICAgICAgICBlbmQpID1cbiAgTWFrZSAoc3RydWN0XG4gICAgdHlwZSB0ID0gVC50IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgbGV0IHNleHBfb2ZfdCA9IChULnNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCBjb21wYXJlIHQgdCcgPSBDLmNvbXBhcmUgKFQuY29tcG9uZW50IHQpIChULmNvbXBvbmVudCB0JylcbiAgZW5kKVxuXG4oKiBjb21wYXJlIFt4XSBhbmQgW3ldIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGZ1bmN0aW9ucyBpbiB0aGUgbGlzdCBbY21wc10gKilcbmxldCBsZXhpY29ncmFwaGljIGNtcHMgeCB5ID1cbiAgbGV0IHJlYyBsb29wID0gZnVuY3Rpb25cbiAgICB8IGNtcCA6OiBjbXBzIC0+XG4gICAgICBsZXQgcmVzID0gY21wIHggeSBpblxuICAgICAgaWYgcmVzID0gMCB0aGVuIGxvb3AgY21wcyBlbHNlIHJlc1xuICAgIHwgW10gLT4gMFxuICBpblxuICBsb29wIGNtcHNcbjs7XG5cbmxldCBsaWZ0IGNtcCB+ZiB4IHkgPSBjbXAgKGYgeCkgKGYgeSlcbmxldCByZXZlcnNlIGNtcCB4IHkgPSBjbXAgeSB4XG4iLCJvcGVuISBJbXBvcnRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5IYXNoYWJsZS5LZXkgKilcbm1vZHVsZSB0eXBlIEtleSA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICBbQEBAZW5kXVxuXG4gICgqKiBWYWx1ZXMgcmV0dXJuZWQgYnkgW2hhc2hdIG11c3QgYmUgbm9uLW5lZ2F0aXZlLiAgQW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGluIHRoZVxuICAgICAgY2FzZSB0aGF0IFtoYXNoXSByZXR1cm5zIGEgbmVnYXRpdmUgdmFsdWUuICopXG4gIHZhbCBoYXNoIDogdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgSGFzaGFibGUgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID1cbiAgICB7IGhhc2ggOiAnYSAtPiBpbnRcbiAgICA7IGNvbXBhcmUgOiAnYSAtPiAnYSAtPiBpbnRcbiAgICA7IHNleHBfb2ZfdCA6ICdhIC0+IFNleHAudFxuICAgIH1cblxuICAoKiogVGhpcyBmdW5jdGlvbiBpcyBzb3VuZCBidXQgbm90IGNvbXBsZXRlLCBtZWFuaW5nIHRoYXQgaWYgaXQgcmV0dXJucyBbdHJ1ZV0gdGhlbiBpdCdzXG4gICAgICBzYWZlIHRvIHVzZSB0aGUgdHdvIGludGVyY2hhbmdlYWJseS4gIElmIGl0J3MgW2ZhbHNlXSwgeW91IGhhdmUgbm8gZ3VhcmFudGVlcy4gIEZvclxuICAgICAgZXhhbXBsZTpcblxuICAgICAge1tcbiAgICAgICAgPiB1dG9wXG4gICAgICAgIG9wZW4gQ29yZTs7XG4gICAgICAgIGxldCBlcXVhbCAoYSA6ICdhIEhhc2h0YmxfaW50Zi5IYXNoYWJsZS50KSBiID1cbiAgICAgICAgICBwaHlzX2VxdWFsIGEgYlxuICAgICAgICAgIHx8IChwaHlzX2VxdWFsIGEuaGFzaCBiLmhhc2hcbiAgICAgICAgICAgICAgJiYgcGh5c19lcXVhbCBhLmNvbXBhcmUgYi5jb21wYXJlXG4gICAgICAgICAgICAgICYmIHBoeXNfZXF1YWwgYS5zZXhwX29mX3QgYi5zZXhwX29mX3QpXG4gICAgICAgIDs7XG4gICAgICAgIGxldCBhID0gSGFzaHRibF9pbnRmLkhhc2hhYmxlLnsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90ID0gSW50LnNleHBfb2ZfdCB9OztcbiAgICAgICAgbGV0IGIgPSBIYXNodGJsX2ludGYuSGFzaGFibGUueyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgPSBJbnQuc2V4cF9vZl90IH07O1xuICAgICAgICBlcXVhbCBhIGI7OyAgKCogZmFsc2U/ISAqKVxuICAgICAgXX1cbiAgKilcbiAgbGV0IGVxdWFsIGEgYiA9XG4gICAgcGh5c19lcXVhbCBhIGJcbiAgICB8fCAocGh5c19lcXVhbCBhLmhhc2ggYi5oYXNoXG4gICAgICAgICYmIHBoeXNfZXF1YWwgYS5jb21wYXJlIGIuY29tcGFyZVxuICAgICAgICAmJiBwaHlzX2VxdWFsIGEuc2V4cF9vZl90IGIuc2V4cF9vZl90KVxuICA7O1xuXG4gIGxldCBoYXNoX3BhcmFtID0gQ2FtbC5IYXNodGJsLmhhc2hfcGFyYW1cbiAgbGV0IGhhc2ggPSBDYW1sLkhhc2h0YmwuaGFzaFxuICBsZXQgcG9seSA9IHsgaGFzaDsgY29tcGFyZSA9IFBvbHkuY29tcGFyZTsgc2V4cF9vZl90ID0gKGZ1biBfIC0+IFNleHAuQXRvbSBcIl9cIikgfVxuXG4gIGxldCBvZl9rZXkgKHR5cGUgYSkgKG1vZHVsZSBLZXkgOiBLZXkgd2l0aCB0eXBlIHQgPSBhKSA9XG4gICAgeyBoYXNoID0gS2V5Lmhhc2g7IGNvbXBhcmUgPSBLZXkuY29tcGFyZTsgc2V4cF9vZl90ID0gS2V5LnNleHBfb2ZfdCB9XG4gIDs7XG5cbiAgbGV0IHRvX2tleSAodHlwZSBhKSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9ID1cbiAgICAobW9kdWxlIHN0cnVjdFxuICAgICAgdHlwZSB0ID0gYVxuXG4gICAgICBsZXQgaGFzaCA9IGhhc2hcbiAgICAgIGxldCBjb21wYXJlID0gY29tcGFyZVxuICAgICAgbGV0IHNleHBfb2ZfdCA9IHNleHBfb2ZfdFxuICAgIGVuZCA6IEtleVxuICAgICAgd2l0aCB0eXBlIHQgPSBhKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgSGFzaGFibGVcblxubW9kdWxlIHR5cGUgSGFzaGFibGUgPSBzaWdcbiAgdHlwZSAnYSB0ID0gJ2EgSGFzaGFibGUudCA9XG4gICAgeyBoYXNoIDogJ2EgLT4gaW50XG4gICAgOyBjb21wYXJlIDogJ2EgLT4gJ2EgLT4gaW50XG4gICAgOyBzZXhwX29mX3QgOiAnYSAtPiBTZXhwLnRcbiAgICB9XG5cbiAgdmFsIGVxdWFsIDogJ2EgdCAtPiAnYSB0IC0+IGJvb2xcbiAgdmFsIHBvbHkgOiAnYSB0XG4gIHZhbCBvZl9rZXkgOiAobW9kdWxlIEtleSB3aXRoIHR5cGUgdCA9ICdhKSAtPiAnYSB0XG4gIHZhbCB0b19rZXkgOiAnYSB0IC0+IChtb2R1bGUgS2V5IHdpdGggdHlwZSB0ID0gJ2EpXG4gIHZhbCBoYXNoX3BhcmFtIDogaW50IC0+IGludCAtPiAnYSAtPiBpbnRcbiAgdmFsIGhhc2ggOiAnYSAtPiBpbnRcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIElkZW50aWZpYWJsZV9pbnRmXG5cbm1vZHVsZSBNYWtlIChUIDogQXJnKSA9IHN0cnVjdFxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBDb21wYXJhYmxlLk1ha2UgKFQpXG4gIGluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKFQpXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuZW5kXG5cbm1vZHVsZSBNYWtlX3VzaW5nX2NvbXBhcmF0b3IgKFQgOiBBcmdfd2l0aF9jb21wYXJhdG9yKSA9IHN0cnVjdFxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBDb21wYXJhYmxlLk1ha2VfdXNpbmdfY29tcGFyYXRvciAoVClcbiAgaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoVClcblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSB1bml0IFtAQGRlcml2aW5nX2lubGluZSBlbnVtZXJhdGUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgYWxsID0gKFsgKCkgXSA6IHQgbGlzdClcblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX3VuaXRcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX3VuaXQgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKHVuaXRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfdW5pdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSB1bml0X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGNvbXBhcmUgXyBfID0gMFxuXG4gIGxldCBvZl9zdHJpbmcgPSBmdW5jdGlvblxuICAgIHwgXCIoKVwiIC0+ICgpXG4gICAgfCBfIC0+IGZhaWx3aXRoIFwiQmFzZS5Vbml0Lm9mX3N0cmluZzogKCkgZXhwZWN0ZWRcIlxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgKCkgPSBcIigpXCJcbiAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLlVuaXRcIlxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBJZGVudGlmaWFibGUuTWFrZSAoVClcblxubGV0IGludmFyaWFudCAoKSA9ICgpXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbjBcblxubGV0IGdldF9wb3NfbGVuID9wb3MgP2xlbiAoKSB+dG90YWxfbGVuZ3RoID1cbiAgdHJ5IFJlc3VsdC5PayAoZ2V0X3Bvc19sZW5fZXhuICgpID9wb3MgP2xlbiB+dG90YWxfbGVuZ3RoKSB3aXRoXG4gIHwgSW52YWxpZF9hcmd1bWVudCBzIC0+IE9yX2Vycm9yLmVycm9yX3N0cmluZyBzXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cbigqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgYSBzZWFyY2ggZm9yIHRoZSBmaXJzdCAocmVzcC4gbGFzdCkgZWxlbWVudFxuICAgc2F0aXNmeWluZyBhIHByZWRpY2F0ZSwgYXNzdW1pbmcgdGhhdCB0aGUgcHJlZGljYXRlIGlzIGluY3JlYXNpbmcgb25cbiAgIHRoZSBjb250YWluZXIsIG1lYW5pbmcgdGhhdCwgaWYgdGhlIGNvbnRhaW5lciBpcyBbdTEuLi51bl0sIHRoZXJlIGV4aXN0cyBhXG4gICBrIHN1Y2ggdGhhdCBwKHUxKT0uLi4uPXAodWspID0gZmFsc2UgYW5kIHAodWsrMSk9Li4uLj1wKHVuKT0gdHJ1ZS5cbiAgIElmIHRoaXMgayA9IDEgKHJlc3AgbiksIGZpbmRfbGFzdF9ub3Rfc2F0aXNmeWluZyAocmVzcCBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcpXG4gICB3aWxsIHJldHVybiBOb25lLiAqKVxuXG5sZXQgcmVjIGxpbmVhcl9zZWFyY2hfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvIH5oaSB+cHJlZCA9XG4gIGlmIGxvID4gaGlcbiAgdGhlbiBOb25lXG4gIGVsc2UgaWYgcHJlZCAoZ2V0IHQgbG8pXG4gIHRoZW4gU29tZSBsb1xuICBlbHNlIGxpbmVhcl9zZWFyY2hfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvOihsbyArIDEpIH5oaSB+cHJlZFxuOztcblxuKCogVGFrZXMgYSBjb250YWluZXIgW3RdLCBhIHByZWRpY2F0ZSBbcHJlZF0gYW5kIHR3byBpbmRpY2VzIFtsbyA8IGhpXSwgc3VjaCB0aGF0XG4gICBbcHJlZF0gaXMgaW5jcmVhc2luZyBvbiBbdF0gYmV0d2VlbiBbbG9dIGFuZCBbaGldLlxuXG4gICByZXR1cm4gYSByYW5nZSAobG8sIGhpKSB3aGVyZTpcbiAgIC0gbG8gYW5kIGhpIGFyZSBjbG9zZSBlbm91Z2ggdG9nZXRoZXIgZm9yIGEgbGluZWFyIHNlYXJjaFxuICAgLSBJZiBbcHJlZF0gaXMgbm90IGNvbnN0YW50bHkgW2ZhbHNlXSBvbiBbdF0gYmV0d2VlbiBbbG9dIGFuZCBbaGldLCB0aGUgZmlyc3QgZWxlbWVudFxuICAgICBvbiB3aGljaCBbcHJlZF0gaXMgW3RydWVdIGlzIGJldHdlZW4gW2xvXSBhbmQgW2hpXS4gKilcbigqIEludmFyaWFudDogdGhlIGZpcnN0IGVsZW1lbnQgc2F0aXNmeWluZyBbcHJlZF0sIGlmIGl0IGV4aXN0cyBpcyBiZXR3ZWVuIFtsb10gYW5kIFtoaV0gKilcbmxldCByZWMgZmluZF9yYW5nZV9uZWFyX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbyB+aGkgfnByZWQgPVxuICAoKiBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IHRlcm1pbmF0ZSBpZiB0aGUgY29uc3RhbnQgKGN1cnJlbnRseSA4KSBpc1xuICAgICBzZXQgPD0gMSAqKVxuICBpZiBoaSAtIGxvIDw9IDhcbiAgdGhlbiBsbywgaGlcbiAgZWxzZSAoXG4gICAgbGV0IG1pZCA9IGxvICsgKChoaSAtIGxvKSAvIDIpIGluXG4gICAgaWYgcHJlZCAoZ2V0IHQgbWlkKVxuICAgICgqIElOVkFSSUFOVCBjaGVjazogaXQgbWVhbnMgdGhlIGZpcnN0IHNhdGlzZnlpbmcgZWxlbWVudCBpcyBiZXR3ZWVuIFtsb10gYW5kIFttaWRdICopXG4gICAgdGhlblxuICAgICAgZmluZF9yYW5nZV9uZWFyX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbyB+aGk6bWlkIH5wcmVkXG4gICAgICAoKiBJTlZBUklBTlQgY2hlY2s6IGl0IG1lYW5zIHRoZSBmaXJzdCBzYXRpc2Z5aW5nIGVsZW1lbnQsIGlmIGl0IGV4aXN0cyxcbiAgICAgICAgIGlzIGJldHdlZW4gW21pZCsxXSBhbmQgW2hpXSAqKVxuICAgIGVsc2UgZmluZF9yYW5nZV9uZWFyX2ZpcnN0X3NhdGlzZnlpbmcgdCB+Z2V0IH5sbzoobWlkICsgMSkgfmhpIH5wcmVkKVxuOztcblxubGV0IGZpbmRfZmlyc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQgPVxuICBsZXQgcG9zLCBsZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uZ2V0X3Bvc19sZW5fZXhuICgpID9wb3MgP2xlbiB+dG90YWxfbGVuZ3RoOihsZW5ndGggdClcbiAgaW5cbiAgbGV0IGxvID0gcG9zIGluXG4gIGxldCBoaSA9IHBvcyArIGxlbiAtIDEgaW5cbiAgbGV0IGxvLCBoaSA9IGZpbmRfcmFuZ2VfbmVhcl9maXJzdF9zYXRpc2Z5aW5nIHQgfmdldCB+bG8gfmhpIH5wcmVkIGluXG4gIGxpbmVhcl9zZWFyY2hfZmlyc3Rfc2F0aXNmeWluZyB0IH5nZXQgfmxvIH5oaSB+cHJlZFxuOztcblxuKCogVGFrZXMgYW4gYXJyYXkgd2l0aCBzaGFwZSBbdHJ1ZSwuLi50cnVlLGZhbHNlLC4uLmZhbHNlXSAoaS5lLiwgdGhlIF9yZXZlcnNlXyBvZiB3aGF0XG4gICBpcyBkZXNjcmliZWQgYWJvdmUpIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0cnVlIG9yIE5vbmUgaWYgdGhlcmUgYXJlIG5vXG4gICB0cnVlKilcbmxldCBmaW5kX2xhc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+cHJlZCB+Z2V0IH5sZW5ndGggPVxuICBsZXQgcG9zLCBsZW4gPVxuICAgIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uZ2V0X3Bvc19sZW5fZXhuICgpID9wb3MgP2xlbiB+dG90YWxfbGVuZ3RoOihsZW5ndGggdClcbiAgaW5cbiAgaWYgbGVuID0gMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgKCogVGhlIGxhc3Qgc2F0aXNmeWluZyBpcyB0aGUgb25lIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBub3Qgc2F0aXNmeWluZyAqKVxuICAgIG1hdGNoIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB+cG9zIH5sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KEZuLm5vbiBwcmVkKSB3aXRoXG4gICAgfCBOb25lIC0+IFNvbWUgKHBvcyArIGxlbiAtIDEpXG4gICAgKCogVGhpcyBtZWFucyB0aGF0IGFsbCBlbGVtZW50cyBzYXRpc2Z5IHByZWQuXG4gICAgICAgVGhlcmUgaXMgYXQgbGVhc3QgYW4gZWxlbWVudCBhcyAobGVuID4gMCkgKilcbiAgICB8IFNvbWUgaSB3aGVuIGkgPSBwb3MgLT4gTm9uZSAoKiBubyBlbGVtZW50IHNhdGlzZmllcyBwcmVkICopXG4gICAgfCBTb21lIGkgLT4gU29tZSAoaSAtIDEpKVxuOztcblxubGV0IGJpbmFyeV9zZWFyY2ggP3BvcyA/bGVuIHQgfmxlbmd0aCB+Z2V0IH5jb21wYXJlIGhvdyB2ID1cbiAgbWF0Y2ggaG93IHdpdGhcbiAgfCBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW4gLT5cbiAgICBmaW5kX2xhc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDwgMClcbiAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gLT5cbiAgICBmaW5kX2xhc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnByZWQ6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDw9IDApXG4gIHwgYEZpcnN0X2VxdWFsX3RvIC0+XG4gICAgKG1hdGNoXG4gICAgICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPj0gMClcbiAgICAgd2l0aFxuICAgICB8IFNvbWUgeCB3aGVuIGNvbXBhcmUgKGdldCB0IHgpIHYgPSAwIC0+IFNvbWUgeFxuICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgfCBgTGFzdF9lcXVhbF90byAtPlxuICAgIChtYXRjaFxuICAgICAgIGZpbmRfbGFzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPD0gMClcbiAgICAgd2l0aFxuICAgICB8IFNvbWUgeCB3aGVuIGNvbXBhcmUgKGdldCB0IHgpIHYgPSAwIC0+IFNvbWUgeFxuICAgICB8IE5vbmUgfCBTb21lIF8gLT4gTm9uZSlcbiAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvIC0+XG4gICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPj0gMClcbiAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuIC0+XG4gICAgZmluZF9maXJzdF9zYXRpc2Z5aW5nID9wb3MgP2xlbiB0IH5nZXQgfmxlbmd0aCB+cHJlZDooZnVuIHggLT4gY29tcGFyZSB4IHYgPiAwKVxuOztcblxubGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkID9wb3MgP2xlbiB0IH5sZW5ndGggfmdldCB+c2VnbWVudF9vZiBob3cgPVxuICBsZXQgaXNfbGVmdCB4ID1cbiAgICBtYXRjaCBzZWdtZW50X29mIHggd2l0aFxuICAgIHwgYExlZnQgLT4gdHJ1ZVxuICAgIHwgYFJpZ2h0IC0+IGZhbHNlXG4gIGluXG4gIGxldCBpc19yaWdodCB4ID0gbm90IChpc19sZWZ0IHgpIGluXG4gIG1hdGNoIGhvdyB3aXRoXG4gIHwgYExhc3Rfb25fbGVmdCAtPiBmaW5kX2xhc3Rfc2F0aXNmeWluZyA/cG9zID9sZW4gdCB+bGVuZ3RoIH5nZXQgfnByZWQ6aXNfbGVmdFxuICB8IGBGaXJzdF9vbl9yaWdodCAtPiBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgP3BvcyA/bGVuIHQgfmxlbmd0aCB+Z2V0IH5wcmVkOmlzX3JpZ2h0XG47O1xuIiwiKCoqIE1vZHVsZSB0eXBlcyBmb3IgYSBbYmluYXJ5X3NlYXJjaF0gZnVuY3Rpb24gZm9yIGEgc2VxdWVuY2UsIGFuZCBmdW5jdG9ycyBmb3IgYnVpbGRpbmdcbiAgICBbYmluYXJ5X3NlYXJjaF0gZnVuY3Rpb25zLiAqKVxuXG5vcGVuISBJbXBvcnRcblxuKCoqIEFuIFtJbmRleGFibGVdIHR5cGUgaXMgYSBmaW5pdGUgc2VxdWVuY2Ugb2YgZWxlbWVudHMgaW5kZXhlZCBieSBjb25zZWN1dGl2ZSBpbnRlZ2Vyc1xuICAgIFswXSAuLi4gW2xlbmd0aCB0IC0gMV0uICBbZ2V0XSBhbmQgW2xlbmd0aF0gbXVzdCBiZSBPKDEpIGZvciB0aGUgcmVzdWx0aW5nXG4gICAgW2JpbmFyeV9zZWFyY2hdIHRvIGJlIGxnKG4pLiAqKVxubW9kdWxlIHR5cGUgSW5kZXhhYmxlID0gc2lnXG4gIHR5cGUgZWx0XG4gIHR5cGUgdFxuXG4gIHZhbCBnZXQgOiB0IC0+IGludCAtPiBlbHRcbiAgdmFsIGxlbmd0aCA6IHQgLT4gaW50XG5lbmRcblxubW9kdWxlIHR5cGUgSW5kZXhhYmxlMSA9IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgZ2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2FcbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgV2hpY2hfdGFyZ2V0X2J5X2tleSA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIFsgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuICgqKiAgICAgICAge3YgfCA8IGVsdCBYIHwgICAgICAgICAgICAgICAgICAgICAgIHZ9ICopXG4gICAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gKCoqICAgICB7diB8ICAgICAgPD0gZWx0ICAgICAgIFggfCAgICAgICAgICAgdn0gKilcbiAgICB8IGBMYXN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8ICAgPSBlbHQgWCB8ICAgICAgICAgICB2fSAqKVxuICAgIHwgYEZpcnN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgWCA9IGVsdCAgIHwgICAgICAgICAgIHZ9ICopXG4gICAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvICgqKiB7diAgICAgICAgICAgfCBYICAgICAgID49IGVsdCAgICAgIHwgdn0gKilcbiAgICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gKCoqICAgIHt2ICAgICAgICAgICAgICAgICAgICAgICB8IFggPiBlbHQgfCB2fSAqKVxuICAgIF1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGVudW1lcmF0ZV1cblxuICBsZXQgYWxsID1cbiAgICAoWyBgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW5cbiAgICAgOyBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG9cbiAgICAgOyBgTGFzdF9lcXVhbF90b1xuICAgICA7IGBGaXJzdF9lcXVhbF90b1xuICAgICA7IGBGaXJzdF9ncmVhdGVyX3RoYW5fb3JfZXF1YWxfdG9cbiAgICAgOyBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuXG4gICAgIF1cbiAgICAgOiB0IGxpc3QpXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICBbIGBMYXN0X29uX2xlZnRcbiAgICB8IGBGaXJzdF9vbl9yaWdodFxuICAgIF1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGVudW1lcmF0ZV1cblxuICBsZXQgYWxsID0gKFsgYExhc3Rfb25fbGVmdDsgYEZpcnN0X29uX3JpZ2h0IF0gOiB0IGxpc3QpXG5cbiAgW0BAQGVuZF1cbmVuZFxuXG50eXBlICgndCwgJ2VsdCwgJ2tleSkgYmluYXJ5X3NlYXJjaCA9XG4gID9wb3M6aW50XG4gIC0+ID9sZW46aW50XG4gIC0+ICd0XG4gIC0+IGNvbXBhcmU6KCdlbHQgLT4gJ2tleSAtPiBpbnQpXG4gIC0+IFdoaWNoX3RhcmdldF9ieV9rZXkudFxuICAtPiAna2V5XG4gIC0+IGludCBvcHRpb25cblxudHlwZSAoJ3QsICdlbHQpIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkID1cbiAgP3BvczppbnRcbiAgLT4gP2xlbjppbnRcbiAgLT4gJ3RcbiAgLT4gc2VnbWVudF9vZjooJ2VsdCAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gIC0+IFdoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgLT4gaW50IG9wdGlvblxuXG5tb2R1bGUgdHlwZSBTID0gc2lnXG4gIHR5cGUgZWx0XG4gIHR5cGUgdFxuXG4gICgqKiBTZWUgW0JpbmFyeV9zZWFyY2guYmluYXJ5X3NlYXJjaF0gaW4gYmluYXJ5X3NlYXJjaC5tbCAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaCA6ICh0LCBlbHQsICdrZXkpIGJpbmFyeV9zZWFyY2hcblxuICAoKiogU2VlIFtCaW5hcnlfc2VhcmNoLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXSBpbiBiaW5hcnlfc2VhcmNoLm1sICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA6ICh0LCBlbHQpIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG5lbmRcblxubW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2ggOiAoJ2EgdCwgJ2EsICdrZXkpIGJpbmFyeV9zZWFyY2hcbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIDogKCdhIHQsICdhKSBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuZW5kXG5cbm1vZHVsZSB0eXBlIEJpbmFyeV9zZWFyY2hhYmxlID0gc2lnXG4gIG1vZHVsZSB0eXBlIFMgPSBTXG4gIG1vZHVsZSB0eXBlIFMxID0gUzFcbiAgbW9kdWxlIHR5cGUgSW5kZXhhYmxlID0gSW5kZXhhYmxlXG4gIG1vZHVsZSB0eXBlIEluZGV4YWJsZTEgPSBJbmRleGFibGUxXG5cbiAgbW9kdWxlIFdoaWNoX3RhcmdldF9ieV9rZXkgPSBXaGljaF90YXJnZXRfYnlfa2V5XG4gIG1vZHVsZSBXaGljaF90YXJnZXRfYnlfc2VnbWVudCA9IFdoaWNoX3RhcmdldF9ieV9zZWdtZW50XG5cbiAgdHlwZSBub25yZWMgKCd0LCAnZWx0LCAna2V5KSBiaW5hcnlfc2VhcmNoID0gKCd0LCAnZWx0LCAna2V5KSBiaW5hcnlfc2VhcmNoXG4gIHR5cGUgbm9ucmVjICgndCwgJ2VsdCkgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgPSAoJ3QsICdlbHQpIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG5cbiAgbW9kdWxlIE1ha2UgKFQgOiBJbmRleGFibGUpIDogUyB3aXRoIHR5cGUgdCA6PSBULnQgd2l0aCB0eXBlIGVsdCA6PSBULmVsdFxuICBtb2R1bGUgTWFrZTEgKFQgOiBJbmRleGFibGUxKSA6IFMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIFQudFxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQmluYXJ5X3NlYXJjaGFibGVfaW50ZlxuXG5tb2R1bGUgdHlwZSBBcmcgPSBzaWdcbiAgdHlwZSAnYSBlbHRcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGdldCA6ICdhIHQgLT4gaW50IC0+ICdhIGVsdFxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSBNYWtlX2dlbiAoVCA6IEFyZykgPSBzdHJ1Y3RcbiAgbGV0IGdldCA9IFQuZ2V0XG4gIGxldCBsZW5ndGggPSBULmxlbmd0aFxuXG4gIGxldCBiaW5hcnlfc2VhcmNoID9wb3MgP2xlbiB0IH5jb21wYXJlIGhvdyB2ID1cbiAgICBCaW5hcnlfc2VhcmNoLmJpbmFyeV9zZWFyY2ggP3BvcyA/bGVuIHQgfmdldCB+bGVuZ3RoIH5jb21wYXJlIGhvdyB2XG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkID9wb3MgP2xlbiB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgQmluYXJ5X3NlYXJjaC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCA/cG9zID9sZW4gdCB+Z2V0IH5sZW5ndGggfnNlZ21lbnRfb2YgaG93XG4gIDs7XG5lbmRcblxubW9kdWxlIE1ha2UgKFQgOiBJbmRleGFibGUpID0gTWFrZV9nZW4gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgdHlwZSAnYSBlbHQgPSBULmVsdFxuICAgIHR5cGUgJ2EgdCA9IFQudFxuICBlbmQpXG5cbm1vZHVsZSBNYWtlMSAoVCA6IEluZGV4YWJsZTEpID0gTWFrZV9nZW4gKHN0cnVjdFxuICAgIHR5cGUgJ2EgZWx0ID0gJ2FcbiAgICB0eXBlICdhIHQgPSAnYSBULnRcblxuICAgIGxldCBnZXQgPSBULmdldFxuICAgIGxldCBsZW5ndGggPSBULmxlbmd0aFxuICBlbmQpXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQmxpdF9pbnRmXG5cbm1vZHVsZSB0eXBlIFNlcXVlbmNlX2dlbiA9IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgbGVuZ3RoIDogXyB0IC0+IGludFxuZW5kXG5cbm1vZHVsZSBNYWtlX2dlblxuICAgIChTcmMgOiBTZXF1ZW5jZV9nZW4pIChEc3QgOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlIFNlcXVlbmNlX2dlblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGNyZWF0ZV9saWtlIDogbGVuOmludCAtPiAnYSBTcmMudCAtPiAnYSB0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHVuc2FmZV9ibGl0IDogKCdhIFNyYy50LCAnYSB0KSBibGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCkgPVxuc3RydWN0XG4gIGxldCB1bnNhZmVfYmxpdCA9IERzdC51bnNhZmVfYmxpdFxuXG4gIGxldCBibGl0IH5zcmMgfnNyY19wb3MgfmRzdCB+ZHN0X3BvcyB+bGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmNoZWNrX3Bvc19sZW5fZXhuXG4gICAgICB+cG9zOnNyY19wb3NcbiAgICAgIH5sZW5cbiAgICAgIH50b3RhbF9sZW5ndGg6KFNyYy5sZW5ndGggc3JjKTtcbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmNoZWNrX3Bvc19sZW5fZXhuXG4gICAgICB+cG9zOmRzdF9wb3NcbiAgICAgIH5sZW5cbiAgICAgIH50b3RhbF9sZW5ndGg6KERzdC5sZW5ndGggZHN0KTtcbiAgICBpZiBsZW4gPiAwIHRoZW4gdW5zYWZlX2JsaXQgfnNyYyB+c3JjX3BvcyB+ZHN0IH5kc3RfcG9zIH5sZW5cbiAgOztcblxuICBsZXQgYmxpdG9cbiAgICAgICAgfnNyY1xuICAgICAgICA/KHNyY19wb3MgPSAwKVxuICAgICAgICA/KHNyY19sZW4gPSBTcmMubGVuZ3RoIHNyYyAtIHNyY19wb3MpXG4gICAgICAgIH5kc3RcbiAgICAgICAgPyhkc3RfcG9zID0gMClcbiAgICAgICAgKClcbiAgICA9XG4gICAgYmxpdCB+c3JjIH5zcmNfcG9zIH5sZW46c3JjX2xlbiB+ZHN0IH5kc3RfcG9zXG4gIDs7XG5cbiAgKCogW3N1Yl0gYW5kIFtzdWJvXSBlbnN1cmUgdGhhdCBldmVyeSBwb3NpdGlvbiBvZiB0aGUgY3JlYXRlZCBzZXF1ZW5jZSBpcyBwb3B1bGF0ZWQgYnlcbiAgICAgYW4gZWxlbWVudCBvZiB0aGUgc291cmNlIGFycmF5LiAgVGh1cyBldmVyeSBlbGVtZW50IG9mIFtkc3RdIGJlbG93IGlzIHdlbGxcbiAgICAgZGVmaW5lZC4gKilcbiAgbGV0IHN1YiBzcmMgfnBvcyB+bGVuID1cbiAgICBPcmRlcmVkX2NvbGxlY3Rpb25fY29tbW9uLmNoZWNrX3Bvc19sZW5fZXhuIH5wb3MgfmxlbiB+dG90YWxfbGVuZ3RoOihTcmMubGVuZ3RoIHNyYyk7XG4gICAgbGV0IGRzdCA9IERzdC5jcmVhdGVfbGlrZSB+bGVuIHNyYyBpblxuICAgIGlmIGxlbiA+IDAgdGhlbiB1bnNhZmVfYmxpdCB+c3JjIH5zcmNfcG9zOnBvcyB+ZHN0IH5kc3RfcG9zOjAgfmxlbjtcbiAgICBkc3RcbiAgOztcblxuICBsZXQgc3VibyA/KHBvcyA9IDApID9sZW4gc3JjID1cbiAgICBzdWJcbiAgICAgIHNyY1xuICAgICAgfnBvc1xuICAgICAgfmxlbjpcbiAgICAgICAgKG1hdGNoIGxlbiB3aXRoXG4gICAgICAgICB8IFNvbWUgaSAtPiBpXG4gICAgICAgICB8IE5vbmUgLT4gU3JjLmxlbmd0aCBzcmMgLSBwb3MpXG4gIDs7XG5lbmRcblxubW9kdWxlIE1ha2UxIChTZXF1ZW5jZSA6IHNpZ1xuICAgIGluY2x1ZGUgU2VxdWVuY2VfZ2VuXG5cbiAgICB2YWwgY3JlYXRlX2xpa2UgOiBsZW46aW50IC0+ICdhIHQgLT4gJ2EgdFxuICAgIHZhbCB1bnNhZmVfYmxpdCA6ICgnYSB0LCAnYSB0KSBibGl0XG4gIGVuZCkgPVxuICBNYWtlX2dlbiAoU2VxdWVuY2UpIChTZXF1ZW5jZSlcblxubW9kdWxlIE1ha2UxX2dlbmVyaWMgKFNlcXVlbmNlIDogU2VxdWVuY2UxKSA9IE1ha2VfZ2VuIChTZXF1ZW5jZSkgKFNlcXVlbmNlKVxuXG5tb2R1bGUgTWFrZSAoU2VxdWVuY2UgOiBzaWdcbiAgICBpbmNsdWRlIFNlcXVlbmNlXG5cbiAgICB2YWwgY3JlYXRlIDogbGVuOmludCAtPiB0XG4gICAgdmFsIHVuc2FmZV9ibGl0IDogKHQsIHQpIGJsaXRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbW9kdWxlIFNlcXVlbmNlID0gc3RydWN0XG4gICAgdHlwZSAnYSB0ID0gU2VxdWVuY2UudFxuXG4gICAgb3BlbiBTZXF1ZW5jZVxuXG4gICAgbGV0IGNyZWF0ZV9saWtlIH5sZW4gXyA9IGNyZWF0ZSB+bGVuXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0XG4gIGVuZFxuXG4gIGluY2x1ZGUgTWFrZV9nZW4gKFNlcXVlbmNlKSAoU2VxdWVuY2UpXG5lbmRcblxubW9kdWxlIE1ha2VfZGlzdGluY3RcbiAgICAoU3JjIDogU2VxdWVuY2UpIChEc3QgOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgU2VxdWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGNyZWF0ZSA6IGxlbjppbnQgLT4gdFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsIHVuc2FmZV9ibGl0IDogKFNyYy50LCB0KSBibGl0XG4gICAgICAgICAgICAgICAgICAgICAgZW5kKSA9XG4gIE1ha2VfZ2VuXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gU3JjLnRcblxuICAgICAgb3BlbiBTcmNcblxuICAgICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBEc3QudFxuXG4gICAgICBvcGVuIERzdFxuXG4gICAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgICBsZXQgY3JlYXRlX2xpa2UgfmxlbiBfID0gY3JlYXRlIH5sZW5cbiAgICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0XG4gICAgZW5kKVxuXG5tb2R1bGUgTWFrZV90b19zdHJpbmcgKFQgOiBzaWdcbiAgICB0eXBlIHRcbiAgZW5kKVxuICAgIChUb19ieXRlcyA6IFNfZGlzdGluY3Qgd2l0aCB0eXBlIHNyYyA6PSBULnQgd2l0aCB0eXBlIGRzdCA6PSBieXRlcykgPVxuc3RydWN0XG4gIG9wZW4gVG9fYnl0ZXNcblxuICBsZXQgc3ViIHNyYyB+cG9zIH5sZW4gPVxuICAgIEJ5dGVzMC51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOihzdWIgc3JjIH5wb3MgfmxlbilcbiAgOztcblxuICBsZXQgc3VibyA/cG9zID9sZW4gc3JjID1cbiAgICBCeXRlczAudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTooc3VibyA/cG9zID9sZW4gc3JjKVxuICA7O1xuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxuaW5jbHVkZSAoXG5zdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2Egb3B0aW9uIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludCA9IGNvbXBhcmVfb3B0aW9uXG5cbiAgbGV0IGhhc2hfZm9sZF90IDpcbiAgICAnYS5cbiAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+ICdhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAtPiAnYSB0XG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgPVxuICAgIGhhc2hfZm9sZF9vcHRpb25cbiAgOztcblxuICBsZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID1cbiAgICBvcHRpb25fb2Zfc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIHNleHBfb2Zfb3B0aW9uXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBvcHRpb25fc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kIDpcbnNpZ1xuICB0eXBlICdhIHQgPSAnYSBvcHRpb24gW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgaW5jbHVkZSBQcHhfaGFzaF9saWIuSGFzaGFibGUuUzEgd2l0aCB0eXBlICdhIHQgOj0gJ2EgdFxuICBpbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcblxuICB2YWwgdF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cbmVuZClcblxudHlwZSAnYSB0ID0gJ2Egb3B0aW9uID1cbiAgfCBOb25lXG4gIHwgU29tZSBvZiAnYVxuXG5sZXQgaXNfbm9uZSA9IGZ1bmN0aW9uXG4gIHwgTm9uZSAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX3NvbWUgPSBmdW5jdGlvblxuICB8IFNvbWUgXyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IHZhbHVlX21hcCBvIH5kZWZhdWx0IH5mID1cbiAgbWF0Y2ggbyB3aXRoXG4gIHwgU29tZSB4IC0+IGYgeFxuICB8IE5vbmUgLT4gZGVmYXVsdFxuOztcblxubGV0IGl0ZXIgbyB+ZiA9XG4gIG1hdGNoIG8gd2l0aFxuICB8IE5vbmUgLT4gKClcbiAgfCBTb21lIGEgLT4gZiBhXG47O1xuXG5sZXQgaW52YXJpYW50IGYgdCA9IGl0ZXIgdCB+ZlxuXG5sZXQgY2FsbCB4IH5mID1cbiAgbWF0Y2ggZiB3aXRoXG4gIHwgTm9uZSAtPiAoKVxuICB8IFNvbWUgZiAtPiBmIHhcbjs7XG5cbmxldCB2YWx1ZSB0IH5kZWZhdWx0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBkZWZhdWx0XG4gIHwgU29tZSB4IC0+IHhcbjs7XG5cbmxldCB2YWx1ZV9leG4gP2hlcmUgP2Vycm9yID9tZXNzYWdlIHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBTb21lIHggLT4geFxuICB8IE5vbmUgLT5cbiAgICBsZXQgZXJyb3IgPVxuICAgICAgbWF0Y2ggaGVyZSwgZXJyb3IsIG1lc3NhZ2Ugd2l0aFxuICAgICAgfCBOb25lLCBOb25lLCBOb25lIC0+IEVycm9yLm9mX3N0cmluZyBcIk9wdGlvbi52YWx1ZV9leG4gTm9uZVwiXG4gICAgICB8IE5vbmUsIE5vbmUsIFNvbWUgbSAtPiBFcnJvci5vZl9zdHJpbmcgbVxuICAgICAgfCBOb25lLCBTb21lIGUsIE5vbmUgLT4gZVxuICAgICAgfCBOb25lLCBTb21lIGUsIFNvbWUgbSAtPiBFcnJvci50YWcgZSB+dGFnOm1cbiAgICAgIHwgU29tZSBwLCBOb25lLCBOb25lIC0+XG4gICAgICAgIEVycm9yLmNyZWF0ZSBcIk9wdGlvbi52YWx1ZV9leG5cIiBwIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMC5zZXhwX29mX3RcbiAgICAgIHwgU29tZSBwLCBOb25lLCBTb21lIG0gLT4gRXJyb3IuY3JlYXRlIG0gcCBTb3VyY2VfY29kZV9wb3NpdGlvbjAuc2V4cF9vZl90XG4gICAgICB8IFNvbWUgcCwgU29tZSBlLCBfIC0+XG4gICAgICAgIEVycm9yLmNyZWF0ZVxuICAgICAgICAgICh2YWx1ZSBtZXNzYWdlIH5kZWZhdWx0OlwiXCIpXG4gICAgICAgICAgKGUsIHApXG4gICAgICAgICAgKHNleHBfb2ZfcGFpciBFcnJvci5zZXhwX29mX3QgU291cmNlX2NvZGVfcG9zaXRpb24wLnNleHBfb2ZfdClcbiAgICBpblxuICAgIEVycm9yLnJhaXNlIGVycm9yXG47O1xuXG5sZXQgdmFsdWVfb3JfdGh1bmsgbyB+ZGVmYXVsdCA9XG4gIG1hdGNoIG8gd2l0aFxuICB8IFNvbWUgeCAtPiB4XG4gIHwgTm9uZSAtPiBkZWZhdWx0ICgpXG47O1xuXG5sZXQgdG9fYXJyYXkgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gW3x8XVxuICB8IFNvbWUgeCAtPiBbfCB4IHxdXG47O1xuXG5sZXQgdG9fbGlzdCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBbXVxuICB8IFNvbWUgeCAtPiBbIHggXVxuOztcblxubGV0IG1pbl9lbHQgdCB+Y29tcGFyZTpfID0gdFxubGV0IG1heF9lbHQgdCB+Y29tcGFyZTpfID0gdFxuXG5sZXQgc3VtICh0eXBlIGEpIChtb2R1bGUgTSA6IENvbnRhaW5lci5TdW1tYWJsZSB3aXRoIHR5cGUgdCA9IGEpIHQgfmYgPVxuICB2YWx1ZV9tYXAgdCB+ZGVmYXVsdDpNLnplcm8gfmZcbjs7XG5cbmxldCBmb3JfYWxsIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IHRydWVcbiAgfCBTb21lIHggLT4gZiB4XG47O1xuXG5sZXQgZXhpc3RzIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IGZhbHNlXG4gIHwgU29tZSB4IC0+IGYgeFxuOztcblxubGV0IG1lbSB0IGEgfmVxdWFsID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBmYWxzZVxuICB8IFNvbWUgYScgLT4gZXF1YWwgYSBhJ1xuOztcblxubGV0IGxlbmd0aCB0ID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiAwXG4gIHwgU29tZSBfIC0+IDFcbjs7XG5cbmxldCBpc19lbXB0eSA9IGlzX25vbmVcblxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IE5vbmUgLT4gaW5pdFxuICB8IFNvbWUgeCAtPiBmIGluaXQgeFxuOztcblxubGV0IGNvdW50IHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IDBcbiAgfCBTb21lIGEgLT4gaWYgZiBhIHRoZW4gMSBlbHNlIDBcbjs7XG5cbmxldCBmaW5kIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIHggLT4gaWYgZiB4IHRoZW4gdCBlbHNlIE5vbmVcbjs7XG5cbmxldCBmaW5kX21hcCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSBhIC0+IGYgYVxuOztcblxubGV0IGVxdWFsIGYgdCB0JyA9XG4gIG1hdGNoIHQsIHQnIHdpdGhcbiAgfCBOb25lLCBOb25lIC0+IHRydWVcbiAgfCBTb21lIHgsIFNvbWUgeCcgLT4gZiB4IHgnXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IHNvbWUgeCA9IFNvbWUgeFxuXG5sZXQgZmlyc3Rfc29tZSB4IHkgPVxuICBtYXRjaCB4IHdpdGhcbiAgfCBTb21lIF8gLT4geFxuICB8IE5vbmUgLT4geVxuOztcblxubGV0IHNvbWVfaWYgY29uZCB4ID0gaWYgY29uZCB0aGVuIFNvbWUgeCBlbHNlIE5vbmVcblxubGV0IG1lcmdlIGEgYiB+ZiA9XG4gIG1hdGNoIGEsIGIgd2l0aFxuICB8IE5vbmUsIHggfCB4LCBOb25lIC0+IHhcbiAgfCBTb21lIGEsIFNvbWUgYiAtPiBTb21lIChmIGEgYilcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFNvbWUgdiBhcyBvIHdoZW4gZiB2IC0+IG9cbiAgfCBfIC0+IE5vbmVcbjs7XG5cbmxldCB0cnlfd2l0aCBmID1cbiAgbWF0Y2ggZiAoKSB3aXRoXG4gIHwgeCAtPiBTb21lIHhcbiAgfCBleGNlcHRpb24gXyAtPiBOb25lXG47O1xuXG5sZXQgdHJ5X3dpdGhfam9pbiBmID1cbiAgbWF0Y2ggZiAoKSB3aXRoXG4gIHwgeCAtPiB4XG4gIHwgZXhjZXB0aW9uIF8gLT4gTm9uZVxuOztcblxubGV0IG1hcCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSBhIC0+IFNvbWUgKGYgYSlcbjs7XG5cbmxldCBhcHBseSBmIHggPVxuICBtYXRjaCBmIHdpdGhcbiAgfCBOb25lIC0+IE5vbmVcbiAgfCBTb21lIGYgLT4gbWFwIH5mIHhcbjs7XG5cbm1vZHVsZSBNb25hZF9hcmcgPSBzdHJ1Y3RcbiAgdHlwZSAnYSB0ID0gJ2Egb3B0aW9uXG5cbiAgbGV0IHJldHVybiB4ID0gU29tZSB4XG4gIGxldCBhcHBseSA9IGFwcGx5XG4gIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuXG4gIGxldCBiaW5kIG8gfmYgPVxuICAgIG1hdGNoIG8gd2l0aFxuICAgIHwgTm9uZSAtPiBOb25lXG4gICAgfCBTb21lIHggLT4gZiB4XG4gIDs7XG5lbmRcblxuaW5jbHVkZSBNb25hZC5NYWtlIChNb25hZF9hcmcpXG5pbmNsdWRlIEFwcGxpY2F0aXZlLk1ha2UgKE1vbmFkX2FyZylcblxubGV0IGZvbGRfcmVzdWx0IHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF9yZXN1bHQgfmZvbGQgfmluaXQgfmYgdFxubGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIHRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZVxuXG5tb2R1bGUgT2Zfc2V4cGFibGVcbiAgICAoU2V4cGFibGUgOiBTKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGUgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX3NleHBhYmxlIDogdCAtPiBTZXhwYWJsZS50XG4gICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX3NleHBhYmxlIDogU2V4cGFibGUudCAtPiB0XG4gICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTIHdpdGggdHlwZSB0IDo9IE0udCA9IHN0cnVjdFxuICBsZXQgdF9vZl9zZXhwIHNleHAgPVxuICAgIGxldCBzID0gU2V4cGFibGUudF9vZl9zZXhwIHNleHAgaW5cbiAgICB0cnkgTS5vZl9zZXhwYWJsZSBzIHdpdGhcbiAgICB8IGV4biAtPiBvZl9zZXhwX2Vycm9yX2V4biBleG4gc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgdCA9IFNleHBhYmxlLnNleHBfb2ZfdCAoTS50b19zZXhwYWJsZSB0KVxuZW5kXG5cbm1vZHVsZSBPZl9zZXhwYWJsZTFcbiAgICAoU2V4cGFibGUgOiBTMSkgKE0gOiBzaWdcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSAnYSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX3NleHBhYmxlIDogJ2EgdCAtPiAnYSBTZXhwYWJsZS50XG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCBvZl9zZXhwYWJsZSA6ICdhIFNleHBhYmxlLnQgLT4gJ2EgdFxuICAgICAgICAgICAgICAgICAgICAgZW5kKSA6IFMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIE0udCA9IHN0cnVjdFxuICBsZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwID1cbiAgICBsZXQgcyA9IFNleHBhYmxlLnRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cCBpblxuICAgIHRyeSBNLm9mX3NleHBhYmxlIHMgd2l0aFxuICAgIHwgZXhuIC0+IG9mX3NleHBfZXJyb3JfZXhuIGV4biBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9IFNleHBhYmxlLnNleHBfb2ZfdCBzZXhwX29mX2EgKE0udG9fc2V4cGFibGUgdClcbmVuZFxuXG5tb2R1bGUgT2Zfc2V4cGFibGUyXG4gICAgKFNleHBhYmxlIDogUzIpIChNIDogc2lnXG4gICAgICAgICAgICAgICAgICAgICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgICAgICAgICAgICAgICAgICAgIHZhbCB0b19zZXhwYWJsZSA6ICgnYSwgJ2IpIHQgLT4gKCdhLCAnYikgU2V4cGFibGUudFxuICAgICAgICAgICAgICAgICAgICAgICB2YWwgb2Zfc2V4cGFibGUgOiAoJ2EsICdiKSBTZXhwYWJsZS50IC0+ICgnYSwgJ2IpIHRcbiAgICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSBNLnQgPSBzdHJ1Y3RcbiAgbGV0IHRfb2Zfc2V4cCBhX29mX3NleHAgYl9vZl9zZXhwIHNleHAgPVxuICAgIGxldCBzID0gU2V4cGFibGUudF9vZl9zZXhwIGFfb2Zfc2V4cCBiX29mX3NleHAgc2V4cCBpblxuICAgIHRyeSBNLm9mX3NleHBhYmxlIHMgd2l0aFxuICAgIHwgZXhuIC0+IG9mX3NleHBfZXJyb3JfZXhuIGV4biBzZXhwXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2Egc2V4cF9vZl9iIHQgPVxuICAgIFNleHBhYmxlLnNleHBfb2ZfdCBzZXhwX29mX2Egc2V4cF9vZl9iIChNLnRvX3NleHBhYmxlIHQpXG4gIDs7XG5lbmRcblxubW9kdWxlIE9mX3NleHBhYmxlM1xuICAgIChTZXhwYWJsZSA6IFMzKSAoTSA6IHNpZ1xuICAgICAgICAgICAgICAgICAgICAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIHRvX3NleHBhYmxlIDogKCdhLCAnYiwgJ2MpIHQgLT4gKCdhLCAnYiwgJ2MpIFNleHBhYmxlLnRcbiAgICAgICAgICAgICAgICAgICAgICAgdmFsIG9mX3NleHBhYmxlIDogKCdhLCAnYiwgJ2MpIFNleHBhYmxlLnQgLT4gKCdhLCAnYiwgJ2MpIHRcbiAgICAgICAgICAgICAgICAgICAgIGVuZCkgOiBTMyB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIE0udCA9IHN0cnVjdFxuICBsZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBiX29mX3NleHAgY19vZl9zZXhwIHNleHAgPVxuICAgIGxldCBzID0gU2V4cGFibGUudF9vZl9zZXhwIGFfb2Zfc2V4cCBiX29mX3NleHAgY19vZl9zZXhwIHNleHAgaW5cbiAgICB0cnkgTS5vZl9zZXhwYWJsZSBzIHdpdGhcbiAgICB8IGV4biAtPiBvZl9zZXhwX2Vycm9yX2V4biBleG4gc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHNleHBfb2ZfYiBzZXhwX29mX2MgdCA9XG4gICAgU2V4cGFibGUuc2V4cF9vZl90IHNleHBfb2ZfYSBzZXhwX29mX2Igc2V4cF9vZl9jIChNLnRvX3NleHBhYmxlIHQpXG4gIDs7XG5lbmRcblxubW9kdWxlIE9mX3N0cmluZ2FibGUgKE0gOiBTdHJpbmdhYmxlLlMpIDogUyB3aXRoIHR5cGUgdCA6PSBNLnQgPSBzdHJ1Y3RcbiAgbGV0IHRfb2Zfc2V4cCBzZXhwID1cbiAgICBtYXRjaCBzZXhwIHdpdGhcbiAgICB8IFNleHAuQXRvbSBzIC0+XG4gICAgICAodHJ5IE0ub2Zfc3RyaW5nIHMgd2l0aFxuICAgICAgIHwgZXhuIC0+IG9mX3NleHBfZXJyb3JfZXhuIGV4biBzZXhwKVxuICAgIHwgU2V4cC5MaXN0IF8gLT5cbiAgICAgIG9mX3NleHBfZXJyb3JcbiAgICAgICAgXCJTZXhwYWJsZS5PZl9zdHJpbmdhYmxlLnRfb2Zfc2V4cCBleHBlY3RlZCBhbiBhdG9tLCBidXQgZ290IGEgbGlzdFwiXG4gICAgICAgIHNleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHQgPSBTZXhwLkF0b20gKE0udG9fc3RyaW5nIHQpXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBFaXRoZXJfaW50ZlxubW9kdWxlIExpc3QgPSBMaXN0MFxuaW5jbHVkZSBFaXRoZXIwXG5cbmxldCBzd2FwID0gZnVuY3Rpb25cbiAgfCBGaXJzdCB4IC0+IFNlY29uZCB4XG4gIHwgU2Vjb25kIHggLT4gRmlyc3QgeFxuOztcblxubGV0IGlzX2ZpcnN0ID0gZnVuY3Rpb25cbiAgfCBGaXJzdCBfIC0+IHRydWVcbiAgfCBTZWNvbmQgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX3NlY29uZCA9IGZ1bmN0aW9uXG4gIHwgRmlyc3QgXyAtPiBmYWxzZVxuICB8IFNlY29uZCBfIC0+IHRydWVcbjs7XG5cbmxldCB2YWx1ZSAoRmlyc3QgeCB8IFNlY29uZCB4KSA9IHhcblxubGV0IHZhbHVlX21hcCB0IH5maXJzdCB+c2Vjb25kID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRmlyc3QgeCAtPiBmaXJzdCB4XG4gIHwgU2Vjb25kIHggLT4gc2Vjb25kIHhcbjs7XG5cbmxldCBpdGVyID0gdmFsdWVfbWFwXG5cbmxldCBtYXAgdCB+Zmlyc3QgfnNlY29uZCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEZpcnN0IHggLT4gRmlyc3QgKGZpcnN0IHgpXG4gIHwgU2Vjb25kIHggLT4gU2Vjb25kIChzZWNvbmQgeClcbjs7XG5cbmxldCBmaXJzdCB4ID0gRmlyc3QgeFxubGV0IHNlY29uZCB4ID0gU2Vjb25kIHhcblxubGV0IGVxdWFsIGVxMSBlcTIgdDEgdDIgPVxuICBtYXRjaCB0MSwgdDIgd2l0aFxuICB8IEZpcnN0IHgsIEZpcnN0IHkgLT4gZXExIHggeVxuICB8IFNlY29uZCB4LCBTZWNvbmQgeSAtPiBlcTIgeCB5XG4gIHwgRmlyc3QgXywgU2Vjb25kIF8gfCBTZWNvbmQgXywgRmlyc3QgXyAtPiBmYWxzZVxuOztcblxubGV0IGludmFyaWFudCBmIHMgPSBmdW5jdGlvblxuICB8IEZpcnN0IHggLT4gZiB4XG4gIHwgU2Vjb25kIHkgLT4gcyB5XG47O1xuXG5tb2R1bGUgTWFrZV9mb2N1c2VkIChNIDogc2lnXG4gICAgdHlwZSAoKydhLCArJ2IpIHRcblxuICAgIHZhbCByZXR1cm4gOiAnYSAtPiAoJ2EsIF8pIHRcbiAgICB2YWwgb3RoZXIgOiAnYiAtPiAoXywgJ2IpIHRcbiAgICB2YWwgZWl0aGVyIDogKCdhLCAnYikgdCAtPiByZXR1cm46KCdhIC0+ICdjKSAtPiBvdGhlcjooJ2IgLT4gJ2MpIC0+ICdjXG5cbiAgICB2YWwgY29tYmluZVxuICAgICAgOiAgKCdhLCAnZCkgdFxuICAgICAgLT4gKCdiLCAnZCkgdFxuICAgICAgLT4gZjooJ2EgLT4gJ2IgLT4gJ2MpXG4gICAgICAtPiBvdGhlcjooJ2QgLT4gJ2QgLT4gJ2QpXG4gICAgICAtPiAoJ2MsICdkKSB0XG5cbiAgICB2YWwgYmluZCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2EgLT4gKCdjLCAnYikgdCkgLT4gKCdjLCAnYikgdFxuICBlbmQpID1cbnN0cnVjdFxuICBpbmNsdWRlIE1cbiAgb3BlbiBXaXRoX3JldHVyblxuXG4gIGxldCBtYXAgdCB+ZiA9IGJpbmQgdCB+ZjooZnVuIHggLT4gcmV0dXJuIChmIHgpKVxuXG4gIGluY2x1ZGUgTW9uYWQuTWFrZTIgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcblxuICAgICAgbGV0IHJldHVybiA9IHJldHVyblxuICAgICAgbGV0IGJpbmQgPSBiaW5kXG4gICAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICBlbmQpXG5cbiAgbW9kdWxlIEFwcCA9IEFwcGxpY2F0aXZlLk1ha2UyIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSB0XG5cbiAgICAgIGxldCByZXR1cm4gPSByZXR1cm5cbiAgICAgIGxldCBhcHBseSB0MSB0MiA9IGJpbmQgdDEgfmY6KGZ1biBmIC0+IGJpbmQgdDIgfmY6KGZ1biB4IC0+IHJldHVybiAoZiB4KSkpXG4gICAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICBlbmQpXG5cbiAgaW5jbHVkZSBBcHBcblxuICBsZXQgY29tYmluZV9hbGwgPVxuICAgIGxldCByZWMgb3RoZXJfbG9vcCBmIGFjYyA9IGZ1bmN0aW9uXG4gICAgICB8IFtdIC0+IG90aGVyIGFjY1xuICAgICAgfCB0IDo6IHRzIC0+XG4gICAgICAgIGVpdGhlclxuICAgICAgICAgIHRcbiAgICAgICAgICB+cmV0dXJuOihmdW4gXyAtPiBvdGhlcl9sb29wIGYgYWNjIHRzKVxuICAgICAgICAgIH5vdGhlcjooZnVuIG8gLT4gb3RoZXJfbG9vcCBmIChmIGFjYyBvKSB0cylcbiAgICBpblxuICAgIGxldCByZWMgcmV0dXJuX2xvb3AgZiBhY2MgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiByZXR1cm4gKExpc3QucmV2IGFjYylcbiAgICAgIHwgdCA6OiB0cyAtPlxuICAgICAgICBlaXRoZXJcbiAgICAgICAgICB0XG4gICAgICAgICAgfnJldHVybjooZnVuIHggLT4gcmV0dXJuX2xvb3AgZiAoeCA6OiBhY2MpIHRzKVxuICAgICAgICAgIH5vdGhlcjooZnVuIG8gLT4gb3RoZXJfbG9vcCBmIG8gdHMpXG4gICAgaW5cbiAgICBmdW4gdHMgfmYgLT4gcmV0dXJuX2xvb3AgZiBbXSB0c1xuICA7O1xuXG4gIGxldCBjb21iaW5lX2FsbF91bml0ID1cbiAgICBsZXQgcmVjIG90aGVyX2xvb3AgZiBhY2MgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBvdGhlciBhY2NcbiAgICAgIHwgdCA6OiB0cyAtPlxuICAgICAgICBlaXRoZXJcbiAgICAgICAgICB0XG4gICAgICAgICAgfnJldHVybjooZnVuICgpIC0+IG90aGVyX2xvb3AgZiBhY2MgdHMpXG4gICAgICAgICAgfm90aGVyOihmdW4gbyAtPiBvdGhlcl9sb29wIGYgKGYgYWNjIG8pIHRzKVxuICAgIGluXG4gICAgbGV0IHJlYyByZXR1cm5fbG9vcCBmID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gcmV0dXJuICgpXG4gICAgICB8IHQgOjogdHMgLT5cbiAgICAgICAgZWl0aGVyIHQgfnJldHVybjooZnVuICgpIC0+IHJldHVybl9sb29wIGYgdHMpIH5vdGhlcjooZnVuIG8gLT4gb3RoZXJfbG9vcCBmIG8gdHMpXG4gICAgaW5cbiAgICBmdW4gdHMgfmYgLT4gcmV0dXJuX2xvb3AgZiB0c1xuICA7O1xuXG4gIGxldCB0b19vcHRpb24gdCA9IGVpdGhlciB0IH5yZXR1cm46T3B0aW9uLnNvbWUgfm90aGVyOihmdW4gXyAtPiBOb25lKVxuICBsZXQgdmFsdWUgdCB+ZGVmYXVsdCA9IGVpdGhlciB0IH5yZXR1cm46Rm4uaWQgfm90aGVyOihmdW4gXyAtPiBkZWZhdWx0KVxuXG4gIGxldCB3aXRoX3JldHVybiBmID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHJldCAtPiBvdGhlciAoZiAoV2l0aF9yZXR1cm4ucHJlcGVuZCByZXQgfmY6cmV0dXJuKSkpXG4gIDs7XG5lbmRcblxubW9kdWxlIEZpcnN0ID0gTWFrZV9mb2N1c2VkIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdiKSB0ID0gKCdhLCAnYikgdFxuXG4gICAgbGV0IHJldHVybiA9IGZpcnN0XG4gICAgbGV0IG90aGVyID0gc2Vjb25kXG5cbiAgICBsZXQgZWl0aGVyIHQgfnJldHVybiB+b3RoZXIgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEZpcnN0IHggLT4gcmV0dXJuIHhcbiAgICAgIHwgU2Vjb25kIHkgLT4gb3RoZXIgeVxuICAgIDs7XG5cbiAgICBsZXQgY29tYmluZSB0MSB0MiB+ZiB+b3RoZXIgPVxuICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgIHwgRmlyc3QgeCwgRmlyc3QgeSAtPiBGaXJzdCAoZiB4IHkpXG4gICAgICB8IFNlY29uZCB4LCBTZWNvbmQgeSAtPiBTZWNvbmQgKG90aGVyIHggeSlcbiAgICAgIHwgU2Vjb25kIHgsIF8gfCBfLCBTZWNvbmQgeCAtPiBTZWNvbmQgeFxuICAgIDs7XG5cbiAgICBsZXQgYmluZCB0IH5mID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBGaXJzdCB4IC0+IGYgeFxuICAgICAgKCogUmV1c2UgdGhlIHZhbHVlIGluIG9yZGVyIHRvIGF2b2lkIGFsbG9jYXRpb24uICopXG4gICAgICB8IFNlY29uZCBfIGFzIHkgLT4geVxuICAgIDs7XG4gIGVuZClcblxubW9kdWxlIFNlY29uZCA9IE1ha2VfZm9jdXNlZCAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYiwgJ2EpIHRcblxuICAgIGxldCByZXR1cm4gPSBzZWNvbmRcbiAgICBsZXQgb3RoZXIgPSBmaXJzdFxuXG4gICAgbGV0IGVpdGhlciB0IH5yZXR1cm4gfm90aGVyID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBTZWNvbmQgeSAtPiByZXR1cm4geVxuICAgICAgfCBGaXJzdCB4IC0+IG90aGVyIHhcbiAgICA7O1xuXG4gICAgbGV0IGNvbWJpbmUgdDEgdDIgfmYgfm90aGVyID1cbiAgICAgIG1hdGNoIHQxLCB0MiB3aXRoXG4gICAgICB8IFNlY29uZCB4LCBTZWNvbmQgeSAtPiBTZWNvbmQgKGYgeCB5KVxuICAgICAgfCBGaXJzdCB4LCBGaXJzdCB5IC0+IEZpcnN0IChvdGhlciB4IHkpXG4gICAgICB8IEZpcnN0IHgsIF8gfCBfLCBGaXJzdCB4IC0+IEZpcnN0IHhcbiAgICA7O1xuXG4gICAgbGV0IGJpbmQgdCB+ZiA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgU2Vjb25kIHggLT4gZiB4XG4gICAgICAoKiBSZXVzZSB0aGUgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgYWxsb2NhdGlvbiwgbGlrZSBbRmlyc3QuYmluZF0gYWJvdmUuICopXG4gICAgICB8IEZpcnN0IF8gYXMgeSAtPiB5XG4gICAgOztcbiAgZW5kKVxuXG5tb2R1bGUgRXhwb3J0ID0gc3RydWN0XG4gIHR5cGUgKCdmLCAncykgX2VpdGhlciA9ICgnZiwgJ3MpIHQgPVxuICAgIHwgRmlyc3Qgb2YgJ2ZcbiAgICB8IFNlY29uZCBvZiAnc1xuZW5kXG4iLCJpbmNsdWRlIEluZGV4ZWRfY29udGFpbmVyX2ludGZcblxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cblxubGV0IGl0ZXJpIH5mb2xkIHQgfmYgPVxuICBpZ25vcmVcbiAgICAoZm9sZCB0IH5pbml0OjAgfmY6KGZ1biBpIHggLT5cbiAgICAgICBmIGkgeDtcbiAgICAgICBpICsgMSlcbiAgICAgOiBpbnQpXG47O1xuXG5sZXQgZm9sZGkgfmZvbGQgdCB+aW5pdCB+ZiA9XG4gIGxldCBpID0gcmVmIDAgaW5cbiAgZm9sZCB0IH5pbml0IH5mOihmdW4gYWNjIHYgLT5cbiAgICBsZXQgYWNjID0gZiAhaSBhY2MgdiBpblxuICAgIGkgOj0gIWkgKyAxO1xuICAgIGFjYylcbjs7XG5cbmxldCBjb3VudGkgfmZvbGRpIHQgfmYgPSBmb2xkaSB0IH5pbml0OjAgfmY6KGZ1biBpIG4gYSAtPiBpZiBmIGkgYSB0aGVuIG4gKyAxIGVsc2UgbilcblxubGV0IGV4aXN0c2kgfml0ZXJpIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyaSBjIH5mOihmdW4gaSB4IC0+IGlmIGYgaSB4IHRoZW4gci5yZXR1cm4gdHJ1ZSk7XG4gICAgZmFsc2UpXG47O1xuXG5sZXQgZm9yX2FsbGkgfml0ZXJpIGMgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyaSBjIH5mOihmdW4gaSB4IC0+IGlmIG5vdCAoZiBpIHgpIHRoZW4gci5yZXR1cm4gZmFsc2UpO1xuICAgIHRydWUpXG47O1xuXG5sZXQgZmluZF9tYXBpIH5pdGVyaSB0IH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlcmkgdCB+ZjooZnVuIGkgeCAtPlxuICAgICAgbWF0Y2ggZiBpIHggd2l0aFxuICAgICAgfCBOb25lIC0+ICgpXG4gICAgICB8IFNvbWUgXyBhcyByZXMgLT4gci5yZXR1cm4gcmVzKTtcbiAgICBOb25lKVxuOztcblxubGV0IGZpbmRpIH5pdGVyaSBjIH5mID1cbiAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgaXRlcmkgYyB+ZjooZnVuIGkgeCAtPiBpZiBmIGkgeCB0aGVuIHIucmV0dXJuIChTb21lIChpLCB4KSkpO1xuICAgIE5vbmUpXG47O1xuXG5tb2R1bGUgTWFrZV9nZW4gKFQgOiBzaWdcbiAgICBpbmNsdWRlIENvbnRhaW5lcl9pbnRmLk1ha2VfZ2VuX2FyZ1xuXG4gICAgdmFsIGl0ZXJpIDogWyBgRGVmaW5lX3VzaW5nX2ZvbGQgfCBgQ3VzdG9tIG9mICgnYSB0LCAnYSBlbHQpIGl0ZXJpIF1cbiAgICB2YWwgZm9sZGkgOiBbIGBEZWZpbmVfdXNpbmdfZm9sZCB8IGBDdXN0b20gb2YgKCdhIHQsICdhIGVsdCwgXykgZm9sZGkgXVxuICBlbmQpIDogR2VuZXJpYyB3aXRoIHR5cGUgJ2EgdCA6PSAnYSBULnQgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBULmVsdCA9IHN0cnVjdFxuICBpbmNsdWRlIENvbnRhaW5lci5NYWtlX2dlbiAoVClcblxuICBsZXQgaXRlcmkgPVxuICAgIG1hdGNoIFQuaXRlcmkgd2l0aFxuICAgIHwgYEN1c3RvbSBpdGVyaSAtPiBpdGVyaVxuICAgIHwgYERlZmluZV91c2luZ19mb2xkIC0+IGZ1biB0IH5mIC0+IGl0ZXJpIH5mb2xkIHQgfmZcbiAgOztcblxuICBsZXQgZm9sZGkgPVxuICAgIG1hdGNoIFQuZm9sZGkgd2l0aFxuICAgIHwgYEN1c3RvbSBmb2xkaSAtPiBmb2xkaVxuICAgIHwgYERlZmluZV91c2luZ19mb2xkIC0+IGZ1biB0IH5pbml0IH5mIC0+IGZvbGRpIH5mb2xkIHQgfmluaXQgfmZcbiAgOztcblxuICBsZXQgY291bnRpIHQgfmYgPSBjb3VudGkgfmZvbGRpIHQgfmZcbiAgbGV0IGV4aXN0c2kgdCB+ZiA9IGV4aXN0c2kgfml0ZXJpIHQgfmZcbiAgbGV0IGZvcl9hbGxpIHQgfmYgPSBmb3JfYWxsaSB+aXRlcmkgdCB+ZlxuICBsZXQgZmluZF9tYXBpIHQgfmYgPSBmaW5kX21hcGkgfml0ZXJpIHQgfmZcbiAgbGV0IGZpbmRpIHQgfmYgPSBmaW5kaSB+aXRlcmkgdCB+ZlxuZW5kXG5cbm1vZHVsZSBNYWtlIChUIDogTWFrZV9hcmcpID0gc3RydWN0XG4gIG1vZHVsZSBDID0gQ29udGFpbmVyLk1ha2UgKFQpXG5cbiAgKCogTm90IHBhcnQgb2YgW0NvbnRhaW5lci5HZW5lcmljXS4gKilcbiAgbGV0IG1lbSA9IEMubWVtXG5cbiAgaW5jbHVkZSBNYWtlX2dlbiAoc3RydWN0XG4gICAgICBpbmNsdWRlIFRcblxuICAgICAgdHlwZSAnYSB0ID0gJ2EgVC50XG4gICAgICB0eXBlICdhIGVsdCA9ICdhXG4gICAgZW5kKVxuZW5kXG5cbm1vZHVsZSBNYWtlMCAoVCA6IE1ha2UwX2FyZykgPSBzdHJ1Y3RcbiAgbW9kdWxlIEMgPSBDb250YWluZXIuTWFrZTAgKFQpXG5cbiAgKCogTm90IHBhcnQgb2YgW0NvbnRhaW5lci5HZW5lcmljXS4gKilcbiAgbGV0IG1lbSA9IEMubWVtXG5cbiAgaW5jbHVkZSBNYWtlX2dlbiAoc3RydWN0XG4gICAgICBpbmNsdWRlIFRcblxuICAgICAgdHlwZSAnYSB0ID0gVC50XG4gICAgICB0eXBlICdhIGVsdCA9IFQuRWx0LnRcbiAgICBlbmQpXG5lbmRcbiIsIm9wZW4hIEltcG9ydFxub3BlbiBDb250YWluZXJfaW50Zi5FeHBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxubW9kdWxlIExpc3QgPSBMaXN0MVxuXG5tb2R1bGUgU3RlcCA9IHN0cnVjdFxuICAoKiAnYSBpcyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSwgJ3MgaXMgdGhlIHN0YXRlIHRoYXQgd2lsbCBwcm9kdWNlIHRoZSByZW1haW5kZXIgb2ZcbiAgICAgdGhlIHNlcXVlbmNlICopXG4gIHR5cGUgKCdhLCAncykgdCA9XG4gICAgfCBEb25lXG4gICAgfCBTa2lwIG9mICdzXG4gICAgfCBZaWVsZCBvZiAnYSAqICdzXG4gIFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIGxldCBzZXhwX29mX3QgOlxuICAgICdhICdzLlxuICAgICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdzIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2EsICdzKSB0XG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgPVxuICAgIGZ1biAodHlwZSBhX18wMDlfIHNfXzAxMF8pXG4gICAgICAgIDogICgoYV9fMDA5XyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IChzX18wMTBfIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgICAgIC0+IChhX18wMDlfLCBzX18wMTBfKSB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICAgIGZ1biBfb2ZfYV9fMDAxXyBfb2Zfc19fMDAyXyAtPiBmdW5jdGlvblxuICAgICAgICB8IERvbmUgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiRG9uZVwiXG4gICAgICAgIHwgU2tpcCBhcmcwX18wMDNfIC0+XG4gICAgICAgICAgbGV0IHJlczBfXzAwNF8gPSBfb2Zfc19fMDAyXyBhcmcwX18wMDNfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiU2tpcFwiOyByZXMwX18wMDRfIF1cbiAgICAgICAgfCBZaWVsZCAoYXJnMF9fMDA1XywgYXJnMV9fMDA2XykgLT5cbiAgICAgICAgICBsZXQgcmVzMF9fMDA3XyA9IF9vZl9hX18wMDFfIGFyZzBfXzAwNV9cbiAgICAgICAgICBhbmQgcmVzMV9fMDA4XyA9IF9vZl9zX18wMDJfIGFyZzFfXzAwNl8gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJZaWVsZFwiOyByZXMwX18wMDdfOyByZXMxX18wMDhfIF1cbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbm9wZW4gU3RlcFxuXG4oKiAnYSBpcyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSwgJ3MgaXMgdGhlIHN0YXRlIHRoYXQgd2lsbCBwcm9kdWNlIHRoZSByZW1haW5kZXIgb2YgdGhlXG4gICBzZXF1ZW5jZSAqKVxudHlwZSArXyB0ID0gU2VxdWVuY2UgOiAncyAqICgncyAtPiAoJ2EsICdzKSBTdGVwLnQpIC0+ICdhIHRcbnR5cGUgJ2Egc2VxdWVuY2UgPSAnYSB0XG5cbm1vZHVsZSBFeHBlcnQgPSBzdHJ1Y3RcbiAgbGV0IG5leHRfc3RlcCAoU2VxdWVuY2UgKHMsIGYpKSA9XG4gICAgbWF0Y2ggZiBzIHdpdGhcbiAgICB8IERvbmUgLT4gRG9uZVxuICAgIHwgU2tpcCBzIC0+IFNraXAgKFNlcXVlbmNlIChzLCBmKSlcbiAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgU2VxdWVuY2UgKHMsIGYpKVxuICA7O1xuXG4gIGxldCBkZWxheWVkX2ZvbGRfc3RlcCBzIH5pbml0IH5mIH5maW5pc2ggPVxuICAgIGxldCByZWMgbG9vcCBzIG5leHQgZmluaXNoIGYgYWNjID1cbiAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICB8IERvbmUgLT4gZmluaXNoIGFjY1xuICAgICAgfCBTa2lwIHMgLT4gZiBhY2MgTm9uZSB+azoobG9vcCBzIG5leHQgZmluaXNoIGYpXG4gICAgICB8IFlpZWxkIChhLCBzKSAtPiBmIGFjYyAoU29tZSBhKSB+azoobG9vcCBzIG5leHQgZmluaXNoIGYpXG4gICAgaW5cbiAgICBtYXRjaCBzIHdpdGhcbiAgICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIHMgbmV4dCBmaW5pc2ggZiBpbml0XG4gIDs7XG5lbmRcblxubGV0IHVuZm9sZF9zdGVwIH5pbml0IH5mID0gU2VxdWVuY2UgKGluaXQsIGYpXG5cbmxldCB1bmZvbGQgfmluaXQgfmYgPVxuICB1bmZvbGRfc3RlcCB+aW5pdCB+ZjooZnVuIHMgLT5cbiAgICBtYXRjaCBmIHMgd2l0aFxuICAgIHwgTm9uZSAtPiBTdGVwLkRvbmVcbiAgICB8IFNvbWUgKGEsIHMpIC0+IFN0ZXAuWWllbGQgKGEsIHMpKVxuOztcblxubGV0IHVuZm9sZF93aXRoIHMgfmluaXQgfmYgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCAoaW5pdCwgcylcbiAgICAgICwgZnVuIChzZWVkLCBzKSAtPlxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChzZWVkLCBzKVxuICAgICAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgICAgIChtYXRjaCBmIHNlZWQgYSB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgICAgIHwgU2tpcCBzZWVkIC0+IFNraXAgKHNlZWQsIHMpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHNlZWQpIC0+IFlpZWxkIChhLCAoc2VlZCwgcykpKSApXG47O1xuXG5sZXQgdW5mb2xkX3dpdGhfYW5kX2ZpbmlzaCBzIH5pbml0IH5ydW5uaW5nX3N0ZXAgfmlubmVyX2ZpbmlzaGVkIH5maW5pc2hpbmdfc3RlcCA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIGBJbm5lcl9ydW5uaW5nIChpbml0LCBzKVxuICAgICAgLCBmdW4gc3RhdGUgLT5cbiAgICAgICAgbWF0Y2ggc3RhdGUgd2l0aFxuICAgICAgICB8IGBJbm5lcl9ydW5uaW5nIChzdGF0ZSwgaW5uZXJfc3RhdGUpIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQgaW5uZXJfc3RhdGUgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gU2tpcCAoYElubmVyX2ZpbmlzaGVkIChpbm5lcl9maW5pc2hlZCBzdGF0ZSkpXG4gICAgICAgICAgIHwgU2tpcCBpbm5lcl9zdGF0ZSAtPiBTa2lwIChgSW5uZXJfcnVubmluZyAoc3RhdGUsIGlubmVyX3N0YXRlKSlcbiAgICAgICAgICAgfCBZaWVsZCAoeCwgaW5uZXJfc3RhdGUpIC0+XG4gICAgICAgICAgICAgKG1hdGNoIHJ1bm5pbmdfc3RlcCBzdGF0ZSB4IHdpdGhcbiAgICAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgICAgfCBTa2lwIHN0YXRlIC0+IFNraXAgKGBJbm5lcl9ydW5uaW5nIChzdGF0ZSwgaW5uZXJfc3RhdGUpKVxuICAgICAgICAgICAgICB8IFlpZWxkICh5LCBzdGF0ZSkgLT4gWWllbGQgKHksIGBJbm5lcl9ydW5uaW5nIChzdGF0ZSwgaW5uZXJfc3RhdGUpKSkpXG4gICAgICAgIHwgYElubmVyX2ZpbmlzaGVkIHN0YXRlIC0+XG4gICAgICAgICAgKG1hdGNoIGZpbmlzaGluZ19zdGVwIHN0YXRlIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHN0YXRlIC0+IFNraXAgKGBJbm5lcl9maW5pc2hlZCBzdGF0ZSlcbiAgICAgICAgICAgfCBZaWVsZCAoeSwgc3RhdGUpIC0+IFlpZWxkICh5LCBgSW5uZXJfZmluaXNoZWQgc3RhdGUpKSApXG47O1xuXG5sZXQgb2ZfbGlzdCBsID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQ6bCB+ZjooZnVuY3Rpb25cbiAgICB8IFtdIC0+IERvbmVcbiAgICB8IHggOjogbCAtPiBZaWVsZCAoeCwgbCkpXG47O1xuXG5cbmxldCBmb2xkIHQgfmluaXQgfmYgPVxuICBsZXQgcmVjIGxvb3Agc2VlZCB2IG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICB8IERvbmUgLT4gdlxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyB2IG5leHQgZlxuICAgIHwgWWllbGQgKGEsIHMpIC0+IGxvb3AgcyAoZiB2IGEpIG5leHQgZlxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIGluaXQgbmV4dCBmXG47O1xuXG5sZXQgdG9fbGlzdF9yZXYgdCA9IGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIGwgeCAtPiB4IDo6IGwpXG5cblxubGV0IHRvX2xpc3QgKFNlcXVlbmNlIChzLCBuZXh0KSkgPVxuICBsZXQgc2FmZV90b19saXN0IHQgPSBMaXN0LnJldiAodG9fbGlzdF9yZXYgdCkgaW5cbiAgbGV0IHJlYyB0b19saXN0IHMgbmV4dCBpID1cbiAgICBpZiBpID0gMFxuICAgIHRoZW4gc2FmZV90b19saXN0IChTZXF1ZW5jZSAocywgbmV4dCkpXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgfCBEb25lIC0+IFtdXG4gICAgICB8IFNraXAgcyAtPiB0b19saXN0IHMgbmV4dCBpXG4gICAgICB8IFlpZWxkIChhLCBzKSAtPiBhIDo6IHRvX2xpc3QgcyBuZXh0IChpIC0gMSkpXG4gIGluXG4gIHRvX2xpc3QgcyBuZXh0IDUwMFxuOztcblxubGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9IHNleHBfb2ZfbGlzdCBzZXhwX29mX2EgKHRvX2xpc3QgdClcblxubGV0IHJhbmdlID8oc3RyaWRlID0gMSkgPyhzdGFydCA9IGBpbmNsdXNpdmUpID8oc3RvcCA9IGBleGNsdXNpdmUpIHN0YXJ0X3Ygc3RvcF92ID1cbiAgbGV0IHN0ZXAgPVxuICAgIG1hdGNoIHN0b3Agd2l0aFxuICAgIHwgYGluY2x1c2l2ZSB3aGVuIHN0cmlkZSA+PSAwIC0+XG4gICAgICBmdW4gaSAtPiBpZiBpID4gc3RvcF92IHRoZW4gRG9uZSBlbHNlIFlpZWxkIChpLCBpICsgc3RyaWRlKVxuICAgIHwgYGluY2x1c2l2ZSAtPiBmdW4gaSAtPiBpZiBpIDwgc3RvcF92IHRoZW4gRG9uZSBlbHNlIFlpZWxkIChpLCBpICsgc3RyaWRlKVxuICAgIHwgYGV4Y2x1c2l2ZSB3aGVuIHN0cmlkZSA+PSAwIC0+XG4gICAgICBmdW4gaSAtPiBpZiBpID49IHN0b3BfdiB0aGVuIERvbmUgZWxzZSBZaWVsZCAoaSwgaSArIHN0cmlkZSlcbiAgICB8IGBleGNsdXNpdmUgLT4gZnVuIGkgLT4gaWYgaSA8PSBzdG9wX3YgdGhlbiBEb25lIGVsc2UgWWllbGQgKGksIGkgKyBzdHJpZGUpXG4gIGluXG4gIGxldCBpbml0ID1cbiAgICBtYXRjaCBzdGFydCB3aXRoXG4gICAgfCBgaW5jbHVzaXZlIC0+IHN0YXJ0X3ZcbiAgICB8IGBleGNsdXNpdmUgLT4gc3RhcnRfdiArIHN0cmlkZVxuICBpblxuICB1bmZvbGRfc3RlcCB+aW5pdCB+ZjpzdGVwXG47O1xuXG5sZXQgb2ZfbGF6eSB0X2xhenkgPVxuICB1bmZvbGRfc3RlcCB+aW5pdDp0X2xhenkgfmY6KGZ1biB0X2xhenkgLT5cbiAgICBsZXQgKFNlcXVlbmNlIChzLCBuZXh0KSkgPSBMYXp5LmZvcmNlIHRfbGF6eSBpblxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IERvbmVcbiAgICB8IFNraXAgcyAtPlxuICAgICAgU2tpcFxuICAgICAgICAobGV0IHYgPSBTZXF1ZW5jZSAocywgbmV4dCkgaW5cbiAgICAgICAgIGxhenkgdilcbiAgICB8IFlpZWxkICh4LCBzKSAtPlxuICAgICAgWWllbGRcbiAgICAgICAgKCB4XG4gICAgICAgICwgbGV0IHYgPSBTZXF1ZW5jZSAocywgbmV4dCkgaW5cbiAgICAgICAgICBsYXp5IHYgKSlcbjs7XG5cbmxldCBtYXAgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIHNlZWRcbiAgICAgICwgZnVuIHNlZWQgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCBzXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChmIGEsIHMpIClcbjs7XG5cbmxldCBtYXBpIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCAoMCwgcylcbiAgICAgICwgZnVuIChpLCBzKSAtPlxuICAgICAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChpLCBzKVxuICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoZiBpIGEsIChpICsgMSwgcykpIClcbjs7XG5cbmxldCBmb2xkaW5nX21hcCB0IH5pbml0IH5mID1cbiAgdW5mb2xkX3dpdGggdCB+aW5pdCB+ZjooZnVuIGFjYyB4IC0+XG4gICAgbGV0IGFjYywgeCA9IGYgYWNjIHggaW5cbiAgICBZaWVsZCAoeCwgYWNjKSlcbjs7XG5cbmxldCBmb2xkaW5nX21hcGkgdCB+aW5pdCB+ZiA9XG4gIHVuZm9sZF93aXRoIHQgfmluaXQ6KDAsIGluaXQpIH5mOihmdW4gKGksIGFjYykgeCAtPlxuICAgIGxldCBhY2MsIHggPSBmIGkgYWNjIHggaW5cbiAgICBZaWVsZCAoeCwgKGkgKyAxLCBhY2MpKSlcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIHNlZWRcbiAgICAgICwgZnVuIHNlZWQgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCBzXG4gICAgICAgIHwgWWllbGQgKGEsIHMpIHdoZW4gZiBhIC0+IFlpZWxkIChhLCBzKVxuICAgICAgICB8IFlpZWxkIChfLCBzKSAtPiBTa2lwIHMgKVxuOztcblxubGV0IGZpbHRlcmkgdCB+ZiA9XG4gIG1hcCB+ZjpzbmQgKGZpbHRlciAobWFwaSB0IH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIChpLCBzKSAtPiBmIGkgcykpXG47O1xuXG5sZXQgbGVuZ3RoIHQgPVxuICBsZXQgcmVjIGxvb3AgaSBzIG5leHQgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IGlcbiAgICB8IFNraXAgcyAtPiBsb29wIGkgcyBuZXh0XG4gICAgfCBZaWVsZCAoXywgcykgLT4gbG9vcCAoaSArIDEpIHMgbmV4dFxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCAwIHNlZWQgbmV4dFxuOztcblxubGV0IHRvX2xpc3RfcmV2X3dpdGhfbGVuZ3RoIHQgPSBmb2xkIHQgfmluaXQ6KFtdLCAwKSB+ZjooZnVuIChsLCBpKSB4IC0+IHggOjogbCwgaSArIDEpXG5cbmxldCB0b19hcnJheSB0ID1cbiAgbGV0IGwsIGxlbiA9IHRvX2xpc3RfcmV2X3dpdGhfbGVuZ3RoIHQgaW5cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gW3x8XVxuICB8IHggOjogbCAtPlxuICAgIGxldCBhID0gQXJyYXkuY3JlYXRlIH5sZW4geCBpblxuICAgIGxldCByZWMgbG9vcCBpIGwgPVxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IFtdIC0+IGFzc2VydCAoaSA9IC0xKVxuICAgICAgfCB4IDo6IGwgLT5cbiAgICAgICAgYS4oaSkgPC0geDtcbiAgICAgICAgbG9vcCAoaSAtIDEpIGxcbiAgICBpblxuICAgIGxvb3AgKGxlbiAtIDIpIGw7XG4gICAgYVxuOztcblxubGV0IGZpbmQgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgWWllbGQgKGEsIF8pIHdoZW4gZiBhIC0+IFNvbWUgYVxuICAgIHwgWWllbGQgKF8sIHMpIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGZcbjs7XG5cbmxldCBmaW5kX21hcCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIChtYXRjaCBmIGEgd2l0aFxuICAgICAgIHwgTm9uZSAtPiBsb29wIHMgbmV4dCBmXG4gICAgICAgfCBzb21lX2IgLT4gc29tZV9iKVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGZcbjs7XG5cblxubGV0IGZpbmRfbWFwaSB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmIGkgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IE5vbmVcbiAgICB8IFlpZWxkIChhLCBzKSAtPlxuICAgICAgKG1hdGNoIGYgaSBhIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gbG9vcCBzIG5leHQgZiAoaSArIDEpXG4gICAgICAgfCBzb21lX2IgLT4gc29tZV9iKVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGYgaVxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZiAwXG47O1xuXG5sZXQgZm9yX2FsbCB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiB0cnVlXG4gICAgfCBZaWVsZCAoYSwgXykgd2hlbiBub3QgKGYgYSkgLT4gZmFsc2VcbiAgICB8IFlpZWxkIChfLCBzKSB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBmXG47O1xuXG5sZXQgZm9yX2FsbGkgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzIG5leHQgZiBpID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiB0cnVlXG4gICAgfCBZaWVsZCAoYSwgXykgd2hlbiBub3QgKGYgaSBhKSAtPiBmYWxzZVxuICAgIHwgWWllbGQgKF8sIHMpIC0+IGxvb3AgcyBuZXh0IGYgKGkgKyAxKVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGYgaVxuICBpblxuICBtYXRjaCB0IHdpdGhcbiAgfCBTZXF1ZW5jZSAoc2VlZCwgbmV4dCkgLT4gbG9vcCBzZWVkIG5leHQgZiAwXG47O1xuXG5sZXQgZXhpc3RzIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IGZhbHNlXG4gICAgfCBZaWVsZCAoYSwgXykgd2hlbiBmIGEgLT4gdHJ1ZVxuICAgIHwgWWllbGQgKF8sIHMpIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGZcbjs7XG5cbmxldCBleGlzdHNpIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgaSA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gZmFsc2VcbiAgICB8IFlpZWxkIChhLCBfKSB3aGVuIGYgaSBhIC0+IHRydWVcbiAgICB8IFlpZWxkIChfLCBzKSAtPiBsb29wIHMgbmV4dCBmIChpICsgMSlcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmIGlcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGYgMFxuOztcblxubGV0IGl0ZXIgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBzZWVkIG5leHQgZiA9XG4gICAgbWF0Y2ggbmV4dCBzZWVkIHdpdGhcbiAgICB8IERvbmUgLT4gKClcbiAgICB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBmXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIGYgYTtcbiAgICAgIGxvb3AgcyBuZXh0IGZcbiAgaW5cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+IGxvb3Agc2VlZCBuZXh0IGZcbjs7XG5cbmxldCBpc19lbXB0eSB0ID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gdHJ1ZVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0XG4gICAgfCBZaWVsZCBfIC0+IGZhbHNlXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dFxuOztcblxubGV0IG1lbSB0IGEgfmVxdWFsID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBhID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBmYWxzZVxuICAgIHwgWWllbGQgKGIsIF8pIHdoZW4gZXF1YWwgYSBiIC0+IHRydWVcbiAgICB8IFlpZWxkIChfLCBzKSB8IFNraXAgcyAtPiBsb29wIHMgbmV4dCBhXG4gIGluXG4gIG1hdGNoIHQgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPiBsb29wIHNlZWQgbmV4dCBhXG47O1xuXG5sZXQgZW1wdHkgPSBTZXF1ZW5jZSAoKCksIGZ1biAoKSAtPiBEb25lKVxuXG5sZXQgYmluZCB0IH5mID1cbiAgdW5mb2xkX3N0ZXBcbiAgICB+ZjooZnVuY3Rpb25cbiAgICAgIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpLCByZXN0IC0+XG4gICAgICAgIChtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgICAgICAgfCBEb25lIC0+XG4gICAgICAgICAgIChtYXRjaCByZXN0IHdpdGhcbiAgICAgICAgICAgIHwgU2VxdWVuY2UgKHNlZWQsIG5leHQpIC0+XG4gICAgICAgICAgICAgIChtYXRjaCBuZXh0IHNlZWQgd2l0aFxuICAgICAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGVtcHR5LCBTZXF1ZW5jZSAocywgbmV4dCkpXG4gICAgICAgICAgICAgICB8IFlpZWxkIChhLCBzKSAtPiBTa2lwIChmIGEsIFNlcXVlbmNlIChzLCBuZXh0KSkpKVxuICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoU2VxdWVuY2UgKHMsIG5leHQpLCByZXN0KVxuICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIChTZXF1ZW5jZSAocywgbmV4dCksIHJlc3QpKSkpXG4gICAgfmluaXQ6KGVtcHR5LCB0KVxuOztcblxubGV0IHJldHVybiB4ID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQ6KFNvbWUgeCkgfmY6KGZ1bmN0aW9uXG4gICAgfCBOb25lIC0+IERvbmVcbiAgICB8IFNvbWUgeCAtPiBZaWVsZCAoeCwgTm9uZSkpXG47O1xuXG5pbmNsdWRlIE1vbmFkLk1ha2UgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICBsZXQgbWFwID0gYEN1c3RvbSBtYXBcbiAgICBsZXQgYmluZCA9IGJpbmRcbiAgICBsZXQgcmV0dXJuID0gcmV0dXJuXG4gIGVuZClcblxubGV0IG50aCBzIG4gPVxuICBpZiBuIDwgMFxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IHJlYyBsb29wIGkgcyBuZXh0ID1cbiAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICB8IERvbmUgLT4gTm9uZVxuICAgICAgfCBTa2lwIHMgLT4gbG9vcCBpIHMgbmV4dFxuICAgICAgfCBZaWVsZCAoYSwgcykgLT4gaWYgcGh5c19lcXVhbCBpIDAgdGhlbiBTb21lIGEgZWxzZSBsb29wIChpIC0gMSkgcyBuZXh0XG4gICAgaW5cbiAgICBtYXRjaCBzIHdpdGhcbiAgICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIG4gcyBuZXh0KVxuOztcblxubGV0IG50aF9leG4gcyBuID1cbiAgaWYgbiA8IDBcbiAgdGhlbiBpbnZhbGlkX2FyZyBcIlNlcXVlbmNlLm50aFwiXG4gIGVsc2UgKFxuICAgIG1hdGNoIG50aCBzIG4gd2l0aFxuICAgIHwgTm9uZSAtPiBmYWlsd2l0aCBcIlNlcXVlbmNlLm50aFwiXG4gICAgfCBTb21lIHggLT4geClcbjs7XG5cbm1vZHVsZSBNZXJnZV93aXRoX2R1cGxpY2F0ZXNfZWxlbWVudCA9IHN0cnVjdFxuICB0eXBlICgnYSwgJ2IpIHQgPVxuICAgIHwgTGVmdCBvZiAnYVxuICAgIHwgUmlnaHQgb2YgJ2JcbiAgICB8IEJvdGggb2YgJ2EgKiAnYlxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlIDpcbiAgICAnYSAnYi4gKCdhIC0+ICdhIC0+IGludCkgLT4gKCdiIC0+ICdiIC0+IGludCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGludFxuICAgID1cbiAgICBmdW4gX2NtcF9fYSBfY21wX19iIGFfXzAxMV8gYl9fMDEyXyAtPlxuICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAxMV8gYl9fMDEyX1xuICAgIHRoZW4gMFxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggYV9fMDExXywgYl9fMDEyXyB3aXRoXG4gICAgICB8IExlZnQgX2FfXzAxM18sIExlZnQgX2JfXzAxNF8gLT4gX2NtcF9fYSBfYV9fMDEzXyBfYl9fMDE0X1xuICAgICAgfCBMZWZ0IF8sIF8gLT4gLTFcbiAgICAgIHwgXywgTGVmdCBfIC0+IDFcbiAgICAgIHwgUmlnaHQgX2FfXzAxNV8sIFJpZ2h0IF9iX18wMTZfIC0+IF9jbXBfX2IgX2FfXzAxNV8gX2JfXzAxNl9cbiAgICAgIHwgUmlnaHQgXywgXyAtPiAtMVxuICAgICAgfCBfLCBSaWdodCBfIC0+IDFcbiAgICAgIHwgQm90aCAoX2FfXzAxN18sIF9hX18wMTlfKSwgQm90aCAoX2JfXzAxOF8sIF9iX18wMjBfKSAtPlxuICAgICAgICAobWF0Y2ggX2NtcF9fYSBfYV9fMDE3XyBfYl9fMDE4XyB3aXRoXG4gICAgICAgICB8IDAgLT4gX2NtcF9fYiBfYV9fMDE5XyBfYl9fMDIwX1xuICAgICAgICAgfCBuIC0+IG4pKVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfdFxuICAgIDogdHlwZSBhIGIuXG4gICAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGEgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgICAgLT4gKFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBiIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgICAgLT4gKGEsIGIpIHRcbiAgICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgID1cbiAgICBmdW4gX2hhc2hfZm9sZF9hIF9oYXNoX2ZvbGRfYiBoc3YgYXJnIC0+XG4gICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICAgfCBMZWZ0IF9hMCAtPlxuICAgICAgICBsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwIGluXG4gICAgICAgIGxldCBoc3YgPSBoc3YgaW5cbiAgICAgICAgX2hhc2hfZm9sZF9hIGhzdiBfYTBcbiAgICAgIHwgUmlnaHQgX2EwIC0+XG4gICAgICAgIGxldCBoc3YgPSBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDEgaW5cbiAgICAgICAgbGV0IGhzdiA9IGhzdiBpblxuICAgICAgICBfaGFzaF9mb2xkX2IgaHN2IF9hMFxuICAgICAgfCBCb3RoIChfYTAsIF9hMSkgLT5cbiAgICAgICAgbGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMiBpblxuICAgICAgICBsZXQgaHN2ID1cbiAgICAgICAgICBsZXQgaHN2ID0gaHN2IGluXG4gICAgICAgICAgX2hhc2hfZm9sZF9hIGhzdiBfYTBcbiAgICAgICAgaW5cbiAgICAgICAgX2hhc2hfZm9sZF9iIGhzdiBfYTFcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwIDpcbiAgICAnYSAnYi5cbiAgICAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKVxuICAgIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gJ2IpXG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgLT4gKCdhLCAnYikgdFxuICAgID1cbiAgICBmdW4gKHR5cGUgYV9fMDQ0XyBiX18wNDVfKVxuICAgICAgICA6ICAoKFNleHBsaWIwLlNleHAudCAtPiBhX18wNDRfKSAtPiAoU2V4cGxpYjAuU2V4cC50IC0+IGJfXzA0NV8pXG4gICAgICAgICAgICAtPiBTZXhwbGliMC5TZXhwLnQgLT4gKGFfXzA0NF8sIGJfXzA0NV8pIHQpIC0+XG4gICAgICBsZXQgZXJyb3Jfc291cmNlX18wMjVfID0gXCJzZXF1ZW5jZS5tbC5NZXJnZV93aXRoX2R1cGxpY2F0ZXNfZWxlbWVudC50XCIgaW5cbiAgICAgIGZ1biBfb2ZfYV9fMDIxXyBfb2ZfYl9fMDIyXyAtPiBmdW5jdGlvblxuICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwibGVmdFwiIHwgXCJMZWZ0XCIpIGFzIF90YWdfXzAyOF8pIDo6IHNleHBfYXJnc19fMDI5XykgYXNcbiAgICAgICAgICBfc2V4cF9fMDI3XyAtPlxuICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzAyOV8gd2l0aFxuICAgICAgICAgICB8IFsgYXJnMF9fMDMwXyBdIC0+XG4gICAgICAgICAgICAgbGV0IHJlczBfXzAzMV8gPSBfb2ZfYV9fMDIxXyBhcmcwX18wMzBfIGluXG4gICAgICAgICAgICAgTGVmdCByZXMwX18wMzFfXG4gICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDI1X1xuICAgICAgICAgICAgICAgX3RhZ19fMDI4X1xuICAgICAgICAgICAgICAgX3NleHBfXzAyN18pXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tICgoXCJyaWdodFwiIHwgXCJSaWdodFwiKSBhcyBfdGFnX18wMzNfKSA6OiBzZXhwX2FyZ3NfXzAzNF8pIGFzXG4gICAgICAgICAgX3NleHBfXzAzMl8gLT5cbiAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMzRfIHdpdGhcbiAgICAgICAgICAgfCBbIGFyZzBfXzAzNV8gXSAtPlxuICAgICAgICAgICAgIGxldCByZXMwX18wMzZfID0gX29mX2JfXzAyMl8gYXJnMF9fMDM1XyBpblxuICAgICAgICAgICAgIFJpZ2h0IHJlczBfXzAzNl9cbiAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMjVfXG4gICAgICAgICAgICAgICBfdGFnX18wMzNfXG4gICAgICAgICAgICAgICBfc2V4cF9fMDMyXylcbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImJvdGhcIiB8IFwiQm90aFwiKSBhcyBfdGFnX18wMzhfKSA6OiBzZXhwX2FyZ3NfXzAzOV8pIGFzXG4gICAgICAgICAgX3NleHBfXzAzN18gLT5cbiAgICAgICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMzlfIHdpdGhcbiAgICAgICAgICAgfCBbIGFyZzBfXzA0MF87IGFyZzFfXzA0MV8gXSAtPlxuICAgICAgICAgICAgIGxldCByZXMwX18wNDJfID0gX29mX2FfXzAyMV8gYXJnMF9fMDQwX1xuICAgICAgICAgICAgIGFuZCByZXMxX18wNDNfID0gX29mX2JfXzAyMl8gYXJnMV9fMDQxXyBpblxuICAgICAgICAgICAgIEJvdGggKHJlczBfXzA0Ml8sIHJlczFfXzA0M18pXG4gICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDI1X1xuICAgICAgICAgICAgICAgX3RhZ19fMDM4X1xuICAgICAgICAgICAgICAgX3NleHBfXzAzN18pXG4gICAgICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImxlZnRcIiB8IFwiTGVmdFwiKSBhcyBzZXhwX18wMjZfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI2X1xuICAgICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJyaWdodFwiIHwgXCJSaWdodFwiKSBhcyBzZXhwX18wMjZfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfdGFrZXNfYXJncyBlcnJvcl9zb3VyY2VfXzAyNV8gc2V4cF9fMDI2X1xuICAgICAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJib3RoXCIgfCBcIkJvdGhcIikgYXMgc2V4cF9fMDI2XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNl9cbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAyNF8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNF9cbiAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDI0XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDI1XyBzZXhwX18wMjRfXG4gICAgICAgIHwgc2V4cF9fMDI0XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMjVfIHNleHBfXzAyNF9cbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDpcbiAgICAnYSAnYi5cbiAgICAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIC0+ICgnYiAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCdhLCAnYikgdFxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgID1cbiAgICBmdW4gKHR5cGUgYV9fMDU2XyBiX18wNTdfKVxuICAgICAgICA6ICAoKGFfXzA1Nl8gLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAoYl9fMDU3XyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAgICAgICAtPiAoYV9fMDU2XywgYl9fMDU3XykgdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gICAgICBmdW4gX29mX2FfXzA0Nl8gX29mX2JfXzA0N18gLT4gZnVuY3Rpb25cbiAgICAgICAgfCBMZWZ0IGFyZzBfXzA0OF8gLT5cbiAgICAgICAgICBsZXQgcmVzMF9fMDQ5XyA9IF9vZl9hX18wNDZfIGFyZzBfXzA0OF8gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJMZWZ0XCI7IHJlczBfXzA0OV8gXVxuICAgICAgICB8IFJpZ2h0IGFyZzBfXzA1MF8gLT5cbiAgICAgICAgICBsZXQgcmVzMF9fMDUxXyA9IF9vZl9iX18wNDdfIGFyZzBfXzA1MF8gaW5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJSaWdodFwiOyByZXMwX18wNTFfIF1cbiAgICAgICAgfCBCb3RoIChhcmcwX18wNTJfLCBhcmcxX18wNTNfKSAtPlxuICAgICAgICAgIGxldCByZXMwX18wNTRfID0gX29mX2FfXzA0Nl8gYXJnMF9fMDUyX1xuICAgICAgICAgIGFuZCByZXMxX18wNTVfID0gX29mX2JfXzA0N18gYXJnMV9fMDUzXyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkJvdGhcIjsgcmVzMF9fMDU0XzsgcmVzMV9fMDU1XyBdXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6XG4gICAgICAgICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICdiIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gKCdhLCAnYikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgXydiX3NleHBfZ3JhbW1hciAtPlxuICAgICAgeyB1bnR5cGVkID1cbiAgICAgICAgICBWYXJpYW50XG4gICAgICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICAgIFsgTm9fdGFnXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiTGVmdFwiXG4gICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydhX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJSaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgTGlzdF9jbGF1c2UgeyBhcmdzID0gQ29ucyAoXydiX3NleHBfZ3JhbW1hci51bnR5cGVkLCBFbXB0eSkgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lID0gXCJCb3RoXCJcbiAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB7IGFyZ3MgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIF8nYV9zZXhwX2dyYW1tYXIudW50eXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIENvbnMgKF8nYl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgfVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubGV0IG1lcmdlX3dpdGhfZHVwbGljYXRlcyAoU2VxdWVuY2UgKHMxLCBuZXh0MSkpIChTZXF1ZW5jZSAoczIsIG5leHQyKSkgfmNvbXBhcmUgPVxuICBsZXQgdW5zaGFkb3dlZF9jb21wYXJlID0gY29tcGFyZSBpblxuICBsZXQgb3BlbiBNZXJnZV93aXRoX2R1cGxpY2F0ZXNfZWxlbWVudCBpblxuICBsZXQgbmV4dCA9IGZ1bmN0aW9uXG4gICAgfCBTa2lwIHMxLCBzMiAtPiBTa2lwIChuZXh0MSBzMSwgczIpXG4gICAgfCBzMSwgU2tpcCBzMiAtPiBTa2lwIChzMSwgbmV4dDIgczIpXG4gICAgfCAoWWllbGQgKGEsIHMxJykgYXMgczEpLCAoWWllbGQgKGIsIHMyJykgYXMgczIpIC0+XG4gICAgICBsZXQgY29tcGFyaXNvbiA9IHVuc2hhZG93ZWRfY29tcGFyZSBhIGIgaW5cbiAgICAgIGlmIGNvbXBhcmlzb24gPCAwXG4gICAgICB0aGVuIFlpZWxkIChMZWZ0IGEsIChTa2lwIHMxJywgczIpKVxuICAgICAgZWxzZSBpZiBjb21wYXJpc29uID0gMFxuICAgICAgdGhlbiBZaWVsZCAoQm90aCAoYSwgYiksIChTa2lwIHMxJywgU2tpcCBzMicpKVxuICAgICAgZWxzZSBZaWVsZCAoUmlnaHQgYiwgKHMxLCBTa2lwIHMyJykpXG4gICAgfCBEb25lLCBEb25lIC0+IERvbmVcbiAgICB8IFlpZWxkIChhLCBzMSksIERvbmUgLT4gWWllbGQgKExlZnQgYSwgKFNraXAgczEsIERvbmUpKVxuICAgIHwgRG9uZSwgWWllbGQgKGIsIHMyKSAtPiBZaWVsZCAoUmlnaHQgYiwgKERvbmUsIFNraXAgczIpKVxuICBpblxuICBTZXF1ZW5jZSAoKFNraXAgczEsIFNraXAgczIpLCBuZXh0KVxuOztcblxubGV0IG1lcmdlX2RlZHVwZWRfYW5kX3NvcnRlZCBzMSBzMiB+Y29tcGFyZSA9XG4gIG1hcCAobWVyZ2Vfd2l0aF9kdXBsaWNhdGVzIHMxIHMyIH5jb21wYXJlKSB+ZjooZnVuY3Rpb25cbiAgICB8IExlZnQgeCB8IFJpZ2h0IHggfCBCb3RoICh4LCBfKSAtPiB4KVxuOztcblxubGV0IChtZXJnZSBbQGRlcHJlY2F0ZWRcbiAgICAgICBcIltzaW5jZSAyMDIxLTA3XSBGb3IgaWRlbnRpY2FsIGJlaGF2aW9yLCB1c2UgXFxcbiAgICAgICAgW1NlcXVlbmNlLm1lcmdlX2RlZHVwZWRfYW5kX3NvcnRlZF0sIGJ1dCBjb25zaWRlciB1c2luZyBcXFxuICAgICAgICBbU2VxdWVuY2UubWVyZ2Vfc29ydGVkXSBpbnN0ZWFkLlwiXSlcbiAgPVxuICBtZXJnZV9kZWR1cGVkX2FuZF9zb3J0ZWRcbjs7XG5cbmxldCBtZXJnZV9zb3J0ZWQgKFNlcXVlbmNlIChzMSwgbmV4dDEpKSAoU2VxdWVuY2UgKHMyLCBuZXh0MikpIH5jb21wYXJlID1cbiAgbGV0IG5leHQgPSBmdW5jdGlvblxuICAgIHwgU2tpcCBzMSwgczIgLT4gU2tpcCAobmV4dDEgczEsIHMyKVxuICAgIHwgczEsIFNraXAgczIgLT4gU2tpcCAoczEsIG5leHQyIHMyKVxuICAgIHwgKFlpZWxkIChhLCBzMScpIGFzIHMxKSwgKFlpZWxkIChiLCBzMicpIGFzIHMyKSAtPlxuICAgICAgbGV0IGNvbXBhcmlzb24gPSBjb21wYXJlIGEgYiBpblxuICAgICAgaWYgY29tcGFyaXNvbiA8PSAwIHRoZW4gWWllbGQgKGEsIChTa2lwIHMxJywgczIpKSBlbHNlIFlpZWxkIChiLCAoczEsIFNraXAgczInKSlcbiAgICB8IERvbmUsIERvbmUgLT4gRG9uZVxuICAgIHwgWWllbGQgKGEsIHMxKSwgRG9uZSAtPiBZaWVsZCAoYSwgKFNraXAgczEsIERvbmUpKVxuICAgIHwgRG9uZSwgWWllbGQgKGIsIHMyKSAtPiBZaWVsZCAoYiwgKERvbmUsIFNraXAgczIpKVxuICBpblxuICBTZXF1ZW5jZSAoKFNraXAgczEsIFNraXAgczIpLCBuZXh0KVxuOztcblxubGV0IGhkIHMgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0ID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHRcbiAgICB8IFlpZWxkIChhLCBfKSAtPiBTb21lIGFcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuZXh0XG47O1xuXG5sZXQgaGRfZXhuIHMgPVxuICBtYXRjaCBoZCBzIHdpdGhcbiAgfCBOb25lIC0+IGZhaWx3aXRoIFwiaGRfZXhuXCJcbiAgfCBTb21lIGEgLT4gYVxuOztcblxubGV0IHRsIHMgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0ID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzIG5leHRcbiAgICB8IFlpZWxkIChfLCBhKSAtPiBTb21lIGFcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgKG1hdGNoIGxvb3AgcyBuZXh0IHdpdGhcbiAgICAgfCBOb25lIC0+IE5vbmVcbiAgICAgfCBTb21lIHMgLT4gU29tZSAoU2VxdWVuY2UgKHMsIG5leHQpKSlcbjs7XG5cbmxldCB0bF9lYWdlcmx5X2V4biBzID1cbiAgbWF0Y2ggdGwgcyB3aXRoXG4gIHwgTm9uZSAtPiBmYWlsd2l0aCBcIlNlcXVlbmNlLnRsX2V4blwiXG4gIHwgU29tZSBzIC0+IHNcbjs7XG5cbmxldCBsaWZ0X2lkZW50aXR5IG5leHQgcyA9XG4gIG1hdGNoIG5leHQgcyB3aXRoXG4gIHwgRG9uZSAtPiBEb25lXG4gIHwgU2tpcCBzIC0+IFNraXAgKGBJZGVudGl0eSBzKVxuICB8IFlpZWxkIChhLCBzKSAtPiBZaWVsZCAoYSwgYElkZW50aXR5IHMpXG47O1xuXG5sZXQgbmV4dCBzID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0XG4gICAgfCBZaWVsZCAoYSwgcykgLT4gU29tZSAoYSwgU2VxdWVuY2UgKHMsIG5leHQpKVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG5leHRcbjs7XG5cbmxldCBmaWx0ZXJfb3B0IHMgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBzXG4gICAgICAsIGZ1biBzIC0+XG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgc1xuICAgICAgICB8IFlpZWxkIChOb25lLCBzKSAtPiBTa2lwIHNcbiAgICAgICAgfCBZaWVsZCAoU29tZSBhLCBzKSAtPiBZaWVsZCAoYSwgcykgKVxuOztcblxubGV0IGZpbHRlcl9tYXAgcyB+ZiA9IGZpbHRlcl9vcHQgKG1hcCBzIH5mKVxubGV0IGZpbHRlcl9tYXBpIHMgfmYgPSBmaWx0ZXJfbWFwIChtYXBpIHMgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gKGksIHMpIC0+IGYgaSBzKVxuXG5sZXQgc3BsaXRfbiBzIG4gPVxuICBsZXQgcmVjIGxvb3AgcyBpIGFjY3VtIG5leHQgPVxuICAgIGlmIGkgPD0gMFxuICAgIHRoZW4gTGlzdC5yZXYgYWNjdW0sIFNlcXVlbmNlIChzLCBuZXh0KVxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBMaXN0LnJldiBhY2N1bSwgZW1wdHlcbiAgICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBpIGFjY3VtIG5leHRcbiAgICAgIHwgWWllbGQgKGEsIHMpIC0+IGxvb3AgcyAoaSAtIDEpIChhIDo6IGFjY3VtKSBuZXh0KVxuICBpblxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT4gbG9vcCBzIG4gW10gbmV4dFxuOztcblxubGV0IGNodW5rc19leG4gdCBuID1cbiAgaWYgbiA8PSAwXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJTZXF1ZW5jZS5jaHVua3NfZXhuXCJcbiAgZWxzZVxuICAgIHVuZm9sZF9zdGVwIH5pbml0OnQgfmY6KGZ1biB0IC0+XG4gICAgICBtYXRjaCBzcGxpdF9uIHQgbiB3aXRoXG4gICAgICB8IFtdLCBfZW1wdHkgLT4gRG9uZVxuICAgICAgfCAoXyA6OiBfIGFzIHhzKSwgdCAtPiBZaWVsZCAoeHMsIHQpKVxuOztcblxubGV0IGZpbmRpIHMgfmYgPSBmaW5kIChtYXBpIHMgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gKGksIHMpIC0+IGYgaSBzKVxuXG5sZXQgZmluZF9leG4gcyB+ZiA9XG4gIG1hdGNoIGZpbmQgcyB+ZiB3aXRoXG4gIHwgTm9uZSAtPiBmYWlsd2l0aCBcIlNlcXVlbmNlLmZpbmRfZXhuXCJcbiAgfCBTb21lIHggLT4geFxuOztcblxubGV0IGFwcGVuZCBzMSBzMiA9XG4gIG1hdGNoIHMxLCBzMiB3aXRoXG4gIHwgU2VxdWVuY2UgKHMxLCBuZXh0MSksIFNlcXVlbmNlIChzMiwgbmV4dDIpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggYEZpcnN0X2xpc3QgczFcbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBgRmlyc3RfbGlzdCBzMSAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0MSBzMSB3aXRoXG4gICAgICAgICAgIHwgRG9uZSAtPiBTa2lwIChgU2Vjb25kX2xpc3QgczIpXG4gICAgICAgICAgIHwgU2tpcCBzMSAtPiBTa2lwIChgRmlyc3RfbGlzdCBzMSlcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgczEpIC0+IFlpZWxkIChhLCBgRmlyc3RfbGlzdCBzMSkpXG4gICAgICAgIHwgYFNlY29uZF9saXN0IHMyIC0+XG4gICAgICAgICAgKG1hdGNoIG5leHQyIHMyIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHMyIC0+IFNraXAgKGBTZWNvbmRfbGlzdCBzMilcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgczIpIC0+IFlpZWxkIChhLCBgU2Vjb25kX2xpc3QgczIpKSApXG47O1xuXG5sZXQgY29uY2F0X21hcCBzIH5mID0gYmluZCBzIH5mXG5sZXQgY29uY2F0IHMgPSBjb25jYXRfbWFwIHMgfmY6Rm4uaWRcbmxldCBjb25jYXRfbWFwaSBzIH5mID0gY29uY2F0X21hcCAobWFwaSBzIH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIChpLCBzKSAtPiBmIGkgcylcblxubGV0IHppcCAoU2VxdWVuY2UgKHMxLCBuZXh0MSkpIChTZXF1ZW5jZSAoczIsIG5leHQyKSkgPVxuICBsZXQgbmV4dCA9IGZ1bmN0aW9uXG4gICAgfCBZaWVsZCAoYSwgczEpLCBZaWVsZCAoYiwgczIpIC0+IFlpZWxkICgoYSwgYiksIChTa2lwIHMxLCBTa2lwIHMyKSlcbiAgICB8IERvbmUsIF8gfCBfLCBEb25lIC0+IERvbmVcbiAgICB8IFNraXAgczEsIHMyIC0+IFNraXAgKG5leHQxIHMxLCBzMilcbiAgICB8IHMxLCBTa2lwIHMyIC0+IFNraXAgKHMxLCBuZXh0MiBzMilcbiAgaW5cbiAgU2VxdWVuY2UgKChTa2lwIHMxLCBTa2lwIHMyKSwgbmV4dClcbjs7XG5cbmxldCB6aXBfZnVsbCAoU2VxdWVuY2UgKHMxLCBuZXh0MSkpIChTZXF1ZW5jZSAoczIsIG5leHQyKSkgPVxuICBsZXQgbmV4dCA9IGZ1bmN0aW9uXG4gICAgfCBZaWVsZCAoYSwgczEpLCBZaWVsZCAoYiwgczIpIC0+IFlpZWxkIChgQm90aCAoYSwgYiksIChTa2lwIHMxLCBTa2lwIHMyKSlcbiAgICB8IERvbmUsIERvbmUgLT4gRG9uZVxuICAgIHwgU2tpcCBzMSwgczIgLT4gU2tpcCAobmV4dDEgczEsIHMyKVxuICAgIHwgczEsIFNraXAgczIgLT4gU2tpcCAoczEsIG5leHQyIHMyKVxuICAgIHwgRG9uZSwgWWllbGQgKGIsIHMyKSAtPiBZaWVsZCAoYFJpZ2h0IGIsIChEb25lLCBuZXh0MiBzMikpXG4gICAgfCBZaWVsZCAoYSwgczEpLCBEb25lIC0+IFlpZWxkIChgTGVmdCBhLCAobmV4dDEgczEsIERvbmUpKVxuICBpblxuICBTZXF1ZW5jZSAoKFNraXAgczEsIFNraXAgczIpLCBuZXh0KVxuOztcblxubGV0IGJvdW5kZWRfbGVuZ3RoIChTZXF1ZW5jZSAoc2VlZCwgbmV4dCkpIH5hdF9tb3N0ID1cbiAgbGV0IHJlYyBsb29wIGkgc2VlZCBuZXh0ID1cbiAgICBpZiBpID4gYXRfbW9zdFxuICAgIHRoZW4gYEdyZWF0ZXJcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIG5leHQgc2VlZCB3aXRoXG4gICAgICB8IERvbmUgLT4gYElzIGlcbiAgICAgIHwgU2tpcCBzZWVkIC0+IGxvb3AgaSBzZWVkIG5leHRcbiAgICAgIHwgWWllbGQgKF8sIHNlZWQpIC0+IGxvb3AgKGkgKyAxKSBzZWVkIG5leHQpXG4gIGluXG4gIGxvb3AgMCBzZWVkIG5leHRcbjs7XG5cbmxldCBsZW5ndGhfaXNfYm91bmRlZF9ieSA/KG1pbiA9IC0xKSA/bWF4IHQgPVxuICBsZXQgbGVuZ3RoX2lzX2F0X2xlYXN0IChTZXF1ZW5jZSAocywgbmV4dCkpID1cbiAgICBsZXQgcmVjIGxvb3AgcyBhY2MgPVxuICAgICAgaWYgYWNjID49IG1pblxuICAgICAgdGhlbiB0cnVlXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IGZhbHNlXG4gICAgICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBhY2NcbiAgICAgICAgfCBZaWVsZCAoXywgcykgLT4gbG9vcCBzIChhY2MgKyAxKSlcbiAgICBpblxuICAgIGxvb3AgcyAwXG4gIGluXG4gIG1hdGNoIG1heCB3aXRoXG4gIHwgTm9uZSAtPiBsZW5ndGhfaXNfYXRfbGVhc3QgdFxuICB8IFNvbWUgbWF4IC0+XG4gICAgKG1hdGNoIGJvdW5kZWRfbGVuZ3RoIHQgfmF0X21vc3Q6bWF4IHdpdGhcbiAgICAgfCBgSXMgbGVuIHdoZW4gbGVuID49IG1pbiAtPiB0cnVlXG4gICAgIHwgXyAtPiBmYWxzZSlcbjs7XG5cbmxldCBpdGVyaSBzIH5mID0gaXRlciAobWFwaSBzIH5mOihmdW4gaSBzIC0+IGksIHMpKSB+ZjooZnVuIChpLCBzKSAtPiBmIGkgcylcblxubGV0IGZvbGRpIHMgfmluaXQgfmYgPVxuICBmb2xkIH5pbml0IChtYXBpIHMgfmY6KGZ1biBpIHMgLT4gaSwgcykpIH5mOihmdW4gYWNjIChpLCBzKSAtPiBmIGkgYWNjIHMpXG47O1xuXG5sZXQgcmVkdWNlIHMgfmYgPVxuICBtYXRjaCBuZXh0IHMgd2l0aFxuICB8IE5vbmUgLT4gTm9uZVxuICB8IFNvbWUgKGEsIHMpIC0+IFNvbWUgKGZvbGQgcyB+aW5pdDphIH5mKVxuOztcblxubGV0IHJlZHVjZV9leG4gcyB+ZiA9XG4gIG1hdGNoIHJlZHVjZSBzIH5mIHdpdGhcbiAgfCBOb25lIC0+IGZhaWx3aXRoIFwiU2VxdWVuY2UucmVkdWNlX2V4blwiXG4gIHwgU29tZSByZXMgLT4gcmVzXG47O1xuXG5sZXQgZ3JvdXAgKFNlcXVlbmNlIChzLCBuZXh0KSkgfmJyZWFrID1cbiAgdW5mb2xkX3N0ZXBcbiAgICB+aW5pdDooU29tZSAoW10sIHMpKVxuICAgIH5mOihmdW5jdGlvblxuICAgICAgfCBOb25lIC0+IERvbmVcbiAgICAgIHwgU29tZSAoYWNjLCBzKSAtPlxuICAgICAgICAobWF0Y2ggYWNjLCBuZXh0IHMgd2l0aFxuICAgICAgICAgfCBfLCBTa2lwIHMgLT4gU2tpcCAoU29tZSAoYWNjLCBzKSlcbiAgICAgICAgIHwgW10sIERvbmUgLT4gRG9uZVxuICAgICAgICAgfCBhY2MsIERvbmUgLT4gWWllbGQgKExpc3QucmV2IGFjYywgTm9uZSlcbiAgICAgICAgIHwgW10sIFlpZWxkIChjdXIsIHMpIC0+IFNraXAgKFNvbWUgKFsgY3VyIF0sIHMpKVxuICAgICAgICAgfCAocHJldiA6OiBfIGFzIGFjYyksIFlpZWxkIChjdXIsIHMpIC0+XG4gICAgICAgICAgIGlmIGJyZWFrIHByZXYgY3VyXG4gICAgICAgICAgIHRoZW4gWWllbGQgKExpc3QucmV2IGFjYywgU29tZSAoWyBjdXIgXSwgcykpXG4gICAgICAgICAgIGVsc2UgU2tpcCAoU29tZSAoY3VyIDo6IGFjYywgcykpKSlcbjs7XG5cbmxldCBmaW5kX2NvbnNlY3V0aXZlX2R1cGxpY2F0ZSAoU2VxdWVuY2UgKHMsIG5leHQpKSB+ZXF1YWwgPVxuICBsZXQgcmVjIGxvb3AgbGFzdF9lbHQgcyA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gTm9uZVxuICAgIHwgU2tpcCBzIC0+IGxvb3AgbGFzdF9lbHQgc1xuICAgIHwgWWllbGQgKGEsIHMpIC0+XG4gICAgICAobWF0Y2ggbGFzdF9lbHQgd2l0aFxuICAgICAgIHwgU29tZSBiIHdoZW4gZXF1YWwgYSBiIC0+IFNvbWUgKGIsIGEpXG4gICAgICAgfCBOb25lIHwgU29tZSBfIC0+IGxvb3AgKFNvbWUgYSkgcylcbiAgaW5cbiAgbG9vcCBOb25lIHNcbjs7XG5cbmxldCByZW1vdmVfY29uc2VjdXRpdmVfZHVwbGljYXRlcyBzIH5lcXVhbCA9XG4gIHVuZm9sZF93aXRoIHMgfmluaXQ6Tm9uZSB+ZjooZnVuIHByZXYgYSAtPlxuICAgIG1hdGNoIHByZXYgd2l0aFxuICAgIHwgU29tZSBiIHdoZW4gZXF1YWwgYSBiIC0+IFNraXAgKFNvbWUgYSlcbiAgICB8IE5vbmUgfCBTb21lIF8gLT4gWWllbGQgKGEsIFNvbWUgYSkpXG47O1xuXG5sZXQgY291bnQgcyB+ZiA9IGxlbmd0aCAoZmlsdGVyIHMgfmYpXG5sZXQgY291bnRpIHQgfmYgPSBsZW5ndGggKGZpbHRlcmkgdCB+ZilcbmxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcbmxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5sZXQgbWF4X2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1heF9lbHQgfmZvbGQgdCB+Y29tcGFyZVxuXG5sZXQgaW5pdCBuIH5mID1cbiAgdW5mb2xkX3N0ZXAgfmluaXQ6MCB+ZjooZnVuIGkgLT4gaWYgaSA+PSBuIHRoZW4gRG9uZSBlbHNlIFlpZWxkIChmIGksIGkgKyAxKSlcbjs7XG5cbmxldCBzdWIgcyB+cG9zIH5sZW4gPVxuICBpZiBwb3MgPCAwIHx8IGxlbiA8IDAgdGhlbiBmYWlsd2l0aCBcIlNlcXVlbmNlLnN1YlwiO1xuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCAoMCwgcylcbiAgICAgICwgZnVuIChpLCBzKSAtPlxuICAgICAgICBpZiBpIC0gcG9zID49IGxlblxuICAgICAgICB0aGVuIERvbmVcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGksIHMpXG4gICAgICAgICAgfCBZaWVsZCAoYSwgcykgd2hlbiBpID49IHBvcyAtPiBZaWVsZCAoYSwgKGkgKyAxLCBzKSlcbiAgICAgICAgICB8IFlpZWxkIChfLCBzKSAtPiBTa2lwIChpICsgMSwgcykpIClcbjs7XG5cbmxldCB0YWtlIHMgbGVuID1cbiAgaWYgbGVuIDwgMCB0aGVuIGZhaWx3aXRoIFwiU2VxdWVuY2UudGFrZVwiO1xuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCAoMCwgcylcbiAgICAgICwgZnVuIChpLCBzKSAtPlxuICAgICAgICBpZiBpID49IGxlblxuICAgICAgICB0aGVuIERvbmVcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKGksIHMpXG4gICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIChpICsgMSwgcykpKSApXG47O1xuXG5sZXQgZHJvcCBzIGxlbiA9XG4gIGlmIGxlbiA8IDAgdGhlbiBmYWlsd2l0aCBcIlNlcXVlbmNlLmRyb3BcIjtcbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggKDAsIHMpXG4gICAgICAsIGZ1biAoaSwgcykgLT5cbiAgICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoaSwgcylcbiAgICAgICAgfCBZaWVsZCAoYSwgcykgd2hlbiBpID49IGxlbiAtPiBZaWVsZCAoYSwgKGkgKyAxLCBzKSlcbiAgICAgICAgfCBZaWVsZCAoXywgcykgLT4gU2tpcCAoaSArIDEsIHMpIClcbjs7XG5cbmxldCB0YWtlX3doaWxlIHMgfmYgPVxuICBtYXRjaCBzIHdpdGhcbiAgfCBTZXF1ZW5jZSAocywgbmV4dCkgLT5cbiAgICBTZXF1ZW5jZVxuICAgICAgKCBzXG4gICAgICAsIGZ1biBzIC0+XG4gICAgICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgICAgIHwgRG9uZSAtPiBEb25lXG4gICAgICAgIHwgU2tpcCBzIC0+IFNraXAgc1xuICAgICAgICB8IFlpZWxkIChhLCBzKSB3aGVuIGYgYSAtPiBZaWVsZCAoYSwgcylcbiAgICAgICAgfCBZaWVsZCAoXywgXykgLT4gRG9uZSApXG47O1xuXG5sZXQgZHJvcF93aGlsZSBzIH5mID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggYERyb3BwaW5nIHNcbiAgICAgICwgZnVuY3Rpb25cbiAgICAgICAgfCBgRHJvcHBpbmcgcyAtPlxuICAgICAgICAgIChtYXRjaCBuZXh0IHMgd2l0aFxuICAgICAgICAgICB8IERvbmUgLT4gRG9uZVxuICAgICAgICAgICB8IFNraXAgcyAtPiBTa2lwIChgRHJvcHBpbmcgcylcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgcykgd2hlbiBmIGEgLT4gU2tpcCAoYERyb3BwaW5nIHMpXG4gICAgICAgICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCBgSWRlbnRpdHkgcykpXG4gICAgICAgIHwgYElkZW50aXR5IHMgLT4gbGlmdF9pZGVudGl0eSBuZXh0IHMgKVxuOztcblxubGV0IHNoaWZ0X3JpZ2h0IHMgeCA9XG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzZWVkLCBuZXh0KSAtPlxuICAgIFNlcXVlbmNlXG4gICAgICAoIGBDb25zaW5nIChzZWVkLCB4KVxuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IGBDb25zaW5nIChzZWVkLCB4KSAtPiBZaWVsZCAoeCwgYElkZW50aXR5IHNlZWQpXG4gICAgICAgIHwgYElkZW50aXR5IHMgLT4gbGlmdF9pZGVudGl0eSBuZXh0IHMgKVxuOztcblxubGV0IHNoaWZ0X3JpZ2h0X3dpdGhfbGlzdCBzIGwgPSBhcHBlbmQgKG9mX2xpc3QgbCkgc1xubGV0IHNoaWZ0X2xlZnQgPSBkcm9wXG5cbm1vZHVsZSBJbmZpeCA9IHN0cnVjdFxuICBsZXQgKCBAICkgPSBhcHBlbmRcbmVuZFxuXG5sZXQgaW50ZXJzcGVyc2UgcyB+c2VwID1cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+XG4gICAgU2VxdWVuY2VcbiAgICAgICggYEluaXQgc1xuICAgICAgLCBmdW5jdGlvblxuICAgICAgICB8IGBJbml0IHMgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoYEluaXQgcylcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKGEsIGBSdW5uaW5nIHMpKVxuICAgICAgICB8IGBSdW5uaW5nIHMgLT5cbiAgICAgICAgICAobWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgICAgICAgfCBEb25lIC0+IERvbmVcbiAgICAgICAgICAgfCBTa2lwIHMgLT4gU2tpcCAoYFJ1bm5pbmcgcylcbiAgICAgICAgICAgfCBZaWVsZCAoYSwgcykgLT4gWWllbGQgKHNlcCwgYFB1dHRpbmcgKGEsIHMpKSlcbiAgICAgICAgfCBgUHV0dGluZyAoYSwgcykgLT4gWWllbGQgKGEsIGBSdW5uaW5nIHMpIClcbjs7XG5cbmxldCByZXBlYXQgeCA9IHVuZm9sZF9zdGVwIH5pbml0OnggfmY6KGZ1biB4IC0+IFlpZWxkICh4LCB4KSlcblxubGV0IGN5Y2xlX2xpc3RfZXhuIHhzID1cbiAgaWYgTGlzdC5pc19lbXB0eSB4cyB0aGVuIGludmFsaWRfYXJnIFwiU2VxdWVuY2UuY3ljbGVfbGlzdF9leG5cIjtcbiAgbGV0IHMgPSBvZl9saXN0IHhzIGluXG4gIGNvbmNhdF9tYXAgfmY6KGZ1biAoKSAtPiBzKSAocmVwZWF0ICgpKVxuOztcblxubGV0IGNhcnRlc2lhbl9wcm9kdWN0IHNhIHNiID0gY29uY2F0X21hcCBzYSB+ZjooZnVuIGEgLT4gemlwIChyZXBlYXQgYSkgc2IpXG5sZXQgc2luZ2xldG9uIHggPSByZXR1cm4geFxuXG5sZXQgZGVsYXllZF9mb2xkIHMgfmluaXQgfmYgfmZpbmlzaCA9XG4gIEV4cGVydC5kZWxheWVkX2ZvbGRfc3RlcCBzIH5pbml0IH5maW5pc2ggfmY6KGZ1biBhY2Mgb3B0aW9uIH5rIC0+XG4gICAgbWF0Y2ggb3B0aW9uIHdpdGhcbiAgICB8IE5vbmUgLT4gayBhY2NcbiAgICB8IFNvbWUgYSAtPiBmIGFjYyBhIH5rKVxuOztcblxubGV0IGZvbGRfbSB+YmluZCB+cmV0dXJuIHQgfmluaXQgfmYgPVxuICBFeHBlcnQuZGVsYXllZF9mb2xkX3N0ZXBcbiAgICB0XG4gICAgfmluaXRcbiAgICB+ZjooZnVuIGFjYyBvcHRpb24gfmsgLT5cbiAgICAgIG1hdGNoIG9wdGlvbiB3aXRoXG4gICAgICB8IE5vbmUgLT4gYmluZCAocmV0dXJuIGFjYykgfmY6a1xuICAgICAgfCBTb21lIGEgLT4gYmluZCAoZiBhY2MgYSkgfmY6aylcbiAgICB+ZmluaXNoOnJldHVyblxuOztcblxubGV0IGl0ZXJfbSB+YmluZCB+cmV0dXJuIHQgfmYgPVxuICBFeHBlcnQuZGVsYXllZF9mb2xkX3N0ZXBcbiAgICB0XG4gICAgfmluaXQ6KClcbiAgICB+ZjooZnVuICgpIG9wdGlvbiB+ayAtPlxuICAgICAgbWF0Y2ggb3B0aW9uIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBiaW5kIChyZXR1cm4gKCkpIH5mOmtcbiAgICAgIHwgU29tZSBhIC0+IGJpbmQgKGYgYSkgfmY6aylcbiAgICB+ZmluaXNoOnJldHVyblxuOztcblxubGV0IGZvbGRfdW50aWwgcyB+aW5pdCB+ZiB+ZmluaXNoID1cbiAgbGV0IHJlYyBsb29wIHMgbmV4dCBmIGFjYyA9XG4gICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICB8IERvbmUgLT4gZmluaXNoIGFjY1xuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGYgYWNjXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIChtYXRjaCAoZiBhY2MgYSA6ICgnYSwgJ2IpIENvbnRpbnVlX29yX3N0b3AudCkgd2l0aFxuICAgICAgIHwgU3RvcCB4IC0+IHhcbiAgICAgICB8IENvbnRpbnVlIGFjYyAtPiBsb29wIHMgbmV4dCBmIGFjYylcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuZXh0IGYgaW5pdFxuOztcblxubGV0IGZvbGRfcmVzdWx0IHMgfmluaXQgfmYgPVxuICBsZXQgcmVjIGxvb3AgcyBuZXh0IGYgYWNjID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBSZXN1bHQucmV0dXJuIGFjY1xuICAgIHwgU2tpcCBzIC0+IGxvb3AgcyBuZXh0IGYgYWNjXG4gICAgfCBZaWVsZCAoYSwgcykgLT5cbiAgICAgIChtYXRjaCAoZiBhY2MgYSA6IChfLCBfKSBSZXN1bHQudCkgd2l0aFxuICAgICAgIHwgRXJyb3IgXyBhcyBlIC0+IGVcbiAgICAgICB8IE9rIGFjYyAtPiBsb29wIHMgbmV4dCBmIGFjYylcbiAgaW5cbiAgbWF0Y2ggcyB3aXRoXG4gIHwgU2VxdWVuY2UgKHMsIG5leHQpIC0+IGxvb3AgcyBuZXh0IGYgaW5pdFxuOztcblxubGV0IGZvcmNlX2VhZ2VybHkgdCA9IG9mX2xpc3QgKHRvX2xpc3QgdClcblxubGV0IG1lbW9pemUgKHR5cGUgYSkgKFNlcXVlbmNlIChzLCBuZXh0KSkgPVxuICBsZXQgbW9kdWxlIE0gPSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBUIG9mIChhLCB0KSBTdGVwLnQgTGF6eS50XG4gIGVuZFxuICBpblxuICBsZXQgcmVjIG1lbW9pemUgcyA9IE0uVCAobGF6eSAoZmluZF9zdGVwIHMpKVxuICBhbmQgZmluZF9zdGVwIHMgPVxuICAgIG1hdGNoIG5leHQgcyB3aXRoXG4gICAgfCBEb25lIC0+IERvbmVcbiAgICB8IFNraXAgcyAtPiBmaW5kX3N0ZXAgc1xuICAgIHwgWWllbGQgKGEsIHMpIC0+IFlpZWxkIChhLCBtZW1vaXplIHMpXG4gIGluXG4gIFNlcXVlbmNlIChtZW1vaXplIHMsIGZ1biAoTS5UIGwpIC0+IExhenkuZm9yY2UgbClcbjs7XG5cbmxldCBkcm9wX2VhZ2VybHkgcyBsZW4gPVxuICBsZXQgcmVjIGxvb3AgaSB+bGVuIHMgbmV4dCA9XG4gICAgaWYgaSA+PSBsZW5cbiAgICB0aGVuIFNlcXVlbmNlIChzLCBuZXh0KVxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggbmV4dCBzIHdpdGhcbiAgICAgIHwgRG9uZSAtPiBlbXB0eVxuICAgICAgfCBTa2lwIHMgLT4gbG9vcCBpIH5sZW4gcyBuZXh0XG4gICAgICB8IFlpZWxkIChfLCBzKSAtPiBsb29wIChpICsgMSkgfmxlbiBzIG5leHQpXG4gIGluXG4gIG1hdGNoIHMgd2l0aFxuICB8IFNlcXVlbmNlIChzLCBuZXh0KSAtPiBsb29wIDAgfmxlbiBzIG5leHRcbjs7XG5cbmxldCBkcm9wX3doaWxlX29wdGlvbiAoU2VxdWVuY2UgKHMsIG5leHQpKSB+ZiA9XG4gIGxldCByZWMgbG9vcCBzID1cbiAgICBtYXRjaCBuZXh0IHMgd2l0aFxuICAgIHwgRG9uZSAtPiBOb25lXG4gICAgfCBTa2lwIHMgLT4gbG9vcCBzXG4gICAgfCBZaWVsZCAoeCwgcykgLT4gaWYgZiB4IHRoZW4gbG9vcCBzIGVsc2UgU29tZSAoeCwgU2VxdWVuY2UgKHMsIG5leHQpKVxuICBpblxuICBsb29wIHNcbjs7XG5cbmxldCBjb21wYXJlIGNvbXBhcmVfYSB0MSB0MiA9XG4gIFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIGl0ZXIgKHppcF9mdWxsIHQxIHQyKSB+ZjooZnVuY3Rpb25cbiAgICAgIHwgYExlZnQgXyAtPiByLnJldHVybiAxXG4gICAgICB8IGBSaWdodCBfIC0+IHIucmV0dXJuICgtMSlcbiAgICAgIHwgYEJvdGggKHYxLCB2MikgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2EgdjEgdjIgaW5cbiAgICAgICAgaWYgYyA8PiAwIHRoZW4gci5yZXR1cm4gYyk7XG4gICAgMClcbjs7XG5cbmxldCBlcXVhbCBlcXVhbF9hIHQxIHQyID1cbiAgZm9yX2FsbCAoemlwX2Z1bGwgdDEgdDIpIH5mOihmdW5jdGlvblxuICAgIHwgYEJvdGggKGExLCBhMikgLT4gZXF1YWxfYSBhMSBhMlxuICAgIHwgYExlZnQgXyB8IGBSaWdodCBfIC0+IGZhbHNlKVxuOztcblxubGV0IHJvdW5kX3JvYmluIGxpc3QgPVxuICBsZXQgbmV4dCAodG9kb19zdGFjaywgZG9uZV9zdGFjaykgPVxuICAgIG1hdGNoIHRvZG9fc3RhY2sgd2l0aFxuICAgIHwgU2VxdWVuY2UgKHMsIGYpIDo6IHRvZG9fc3RhY2sgLT5cbiAgICAgIChtYXRjaCBmIHMgd2l0aFxuICAgICAgIHwgWWllbGQgKHgsIHMpIC0+IFlpZWxkICh4LCAodG9kb19zdGFjaywgU2VxdWVuY2UgKHMsIGYpIDo6IGRvbmVfc3RhY2spKVxuICAgICAgIHwgU2tpcCBzIC0+IFNraXAgKFNlcXVlbmNlIChzLCBmKSA6OiB0b2RvX3N0YWNrLCBkb25lX3N0YWNrKVxuICAgICAgIHwgRG9uZSAtPiBTa2lwICh0b2RvX3N0YWNrLCBkb25lX3N0YWNrKSlcbiAgICB8IFtdIC0+IGlmIExpc3QuaXNfZW1wdHkgZG9uZV9zdGFjayB0aGVuIERvbmUgZWxzZSBTa2lwIChMaXN0LnJldiBkb25lX3N0YWNrLCBbXSlcbiAgaW5cbiAgbGV0IHN0YXRlID0gbGlzdCwgW10gaW5cbiAgU2VxdWVuY2UgKHN0YXRlLCBuZXh0KVxuOztcblxubGV0IGludGVybGVhdmUgKFNlcXVlbmNlIChzMSwgZjEpKSA9XG4gIGxldCBuZXh0ICh0b2RvX3N0YWNrLCBkb25lX3N0YWNrLCBzMSkgPVxuICAgIG1hdGNoIHRvZG9fc3RhY2sgd2l0aFxuICAgIHwgU2VxdWVuY2UgKHMyLCBmMikgOjogdG9kb19zdGFjayAtPlxuICAgICAgKG1hdGNoIGYyIHMyIHdpdGhcbiAgICAgICB8IFlpZWxkICh4LCBzMikgLT4gWWllbGQgKHgsICh0b2RvX3N0YWNrLCBTZXF1ZW5jZSAoczIsIGYyKSA6OiBkb25lX3N0YWNrLCBzMSkpXG4gICAgICAgfCBTa2lwIHMyIC0+IFNraXAgKHRvZG9fc3RhY2ssIFNlcXVlbmNlIChzMiwgZjIpIDo6IGRvbmVfc3RhY2ssIHMxKVxuICAgICAgIHwgRG9uZSAtPiBTa2lwICh0b2RvX3N0YWNrLCBkb25lX3N0YWNrLCBzMSkpXG4gICAgfCBbXSAtPlxuICAgICAgKG1hdGNoIGYxIHMxLCBkb25lX3N0YWNrIHdpdGhcbiAgICAgICB8IFlpZWxkICh0LCBzMSksIF8gLT4gU2tpcCAoTGlzdC5yZXYgKHQgOjogZG9uZV9zdGFjayksIFtdLCBzMSlcbiAgICAgICB8IFNraXAgczEsIF8gLT4gU2tpcCAoTGlzdC5yZXYgZG9uZV9zdGFjaywgW10sIHMxKVxuICAgICAgIHwgRG9uZSwgXyA6OiBfIC0+IFNraXAgKExpc3QucmV2IGRvbmVfc3RhY2ssIFtdLCBzMSlcbiAgICAgICB8IERvbmUsIFtdIC0+IERvbmUpXG4gIGluXG4gIGxldCBzdGF0ZSA9IFtdLCBbXSwgczEgaW5cbiAgU2VxdWVuY2UgKHN0YXRlLCBuZXh0KVxuOztcblxubGV0IGludGVybGVhdmVkX2NhcnRlc2lhbl9wcm9kdWN0IHMxIHMyID1cbiAgbWFwIHMxIH5mOihmdW4geDEgLT4gbWFwIHMyIH5mOihmdW4geDIgLT4geDEsIHgyKSkgfD4gaW50ZXJsZWF2ZVxuOztcblxubGV0IG9mX3NlcSAoc2VxIDogXyBDYW1sLlNlcS50KSA9XG4gIHVuZm9sZF9zdGVwIH5pbml0OnNlcSB+ZjooZnVuIHNlcSAtPlxuICAgIG1hdGNoIHNlcSAoKSB3aXRoXG4gICAgfCBOaWwgLT4gRG9uZVxuICAgIHwgQ29ucyAoaGQsIHRsKSAtPiBZaWVsZCAoaGQsIHRsKSlcbjs7XG5cbmxldCB0b19zZXEgKFNlcXVlbmNlIChzdGF0ZSwgbmV4dCkpID1cbiAgbGV0IHJlYyBsb29wIHN0YXRlID1cbiAgICBtYXRjaCBuZXh0IHN0YXRlIHdpdGhcbiAgICB8IERvbmUgLT4gQ2FtbC5TZXEuTmlsXG4gICAgfCBTa2lwIHN0YXRlIC0+IGxvb3Agc3RhdGVcbiAgICB8IFlpZWxkIChoZCwgc3RhdGUpIC0+IENhbWwuU2VxLkNvbnMgKGhkLCBmdW4gKCkgLT4gbG9vcCBzdGF0ZSlcbiAgaW5cbiAgZnVuICgpIC0+IGxvb3Agc3RhdGVcbjs7XG5cbm1vZHVsZSBHZW5lcmF0b3IgPSBzdHJ1Y3RcbiAgdHlwZSAnZWx0IHN0ZXBzID0gV3JhcCBvZiAoJ2VsdCwgdW5pdCAtPiAnZWx0IHN0ZXBzKSBTdGVwLnRcblxuICBsZXQgdW53cmFwIChXcmFwIHN0ZXApID0gc3RlcFxuXG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgdHlwZSAoJ2EsICdlbHQpIHQgPSAoJ2EgLT4gJ2VsdCBzdGVwcykgLT4gJ2VsdCBzdGVwc1xuXG4gICAgbGV0IHJldHVybiB4IGsgPSBrIHhcblxuICAgIGxldCBiaW5kIG0gfmYgayA9XG4gICAgICBtIChmdW4gYSAtPlxuICAgICAgICBsZXQgbScgPSBmIGEgaW5cbiAgICAgICAgbScgaylcbiAgICA7O1xuXG4gICAgbGV0IG1hcCBtIH5mIGsgPSBtIChmdW4gYSAtPiBrIChmIGEpKVxuICAgIGxldCBtYXAgPSBgQ3VzdG9tIG1hcFxuICBlbmRcblxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBNb25hZC5NYWtlMiAoVClcblxuICBsZXQgeWllbGQgZSBrID0gV3JhcCAoWWllbGQgKGUsIGspKVxuICBsZXQgdG9fc3RlcHMgdCA9IHQgKGZ1biAoKSAtPiBXcmFwIERvbmUpXG5cbiAgbGV0IG9mX3NlcXVlbmNlIHNlcXVlbmNlID1cbiAgICBkZWxheWVkX2ZvbGRcbiAgICAgIHNlcXVlbmNlXG4gICAgICB+aW5pdDooKVxuICAgICAgfmY6KGZ1biAoKSB4IH5rIGYgLT4gV3JhcCAoWWllbGQgKHgsIGZ1biAoKSAtPiBrICgpIGYpKSlcbiAgICAgIH5maW5pc2g6cmV0dXJuXG4gIDs7XG5cbiAgbGV0IHJ1biB0ID1cbiAgICBsZXQgaW5pdCAoKSA9IHRvX3N0ZXBzIHQgaW5cbiAgICBsZXQgZiB0aHVuayA9IHVud3JhcCAodGh1bmsgKCkpIGluXG4gICAgdW5mb2xkX3N0ZXAgfmluaXQgfmZcbiAgOztcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIEFycmF5MFxuXG50eXBlICdhIHQgPSAnYSBhcnJheSBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID0gY29tcGFyZV9hcnJheVxubGV0IHRfb2Zfc2V4cCA6ICdhLiAoU2V4cGxpYjAuU2V4cC50IC0+ICdhKSAtPiBTZXhwbGliMC5TZXhwLnQgLT4gJ2EgdCA9IGFycmF5X29mX3NleHBcbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPSBzZXhwX29mX2FycmF5XG5cbmxldCAodF9zZXhwX2dyYW1tYXIgOiAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCAtPiAnYSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IGFycmF5X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG47O1xuXG5bQEBAZW5kXVxuXG4oKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgbmV3IGluLXBsYWNlLCBjb25zdGFudCBoZWFwIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHJlcGxhY2UgdGhlXG4gICBvbmUgdXNlZCBieSB0aGUgc3RhbmRhcmQgbGlicmFyaWVzLiAgSXRzIG9ubHkgcHVycG9zZSBpcyB0byBiZSBmYXN0ZXIgKGhvcGVmdWxseVxuICAgc3RyaWN0bHkgZmFzdGVyKSB0aGFuIHRoZSBiYXNlIHNvcnQgYW5kIHN0YWJsZV9zb3J0LlxuXG4gICBBdCBhIGhpZ2ggbGV2ZWwgdGhlIGFsZ29yaXRobSBpczpcbiAgIC0gcGljayB0d28gcGl2b3QgcG9pbnRzIGJ5OlxuICAgLSBwaWNrIDUgYXJiaXRyYXJ5IGVsZW1lbnRzIGZyb20gdGhlIGFycmF5XG4gICAtIHNvcnQgdGhlbSB3aXRoaW4gdGhlIGFycmF5XG4gICAtIHRha2UgdGhlIGVsZW1lbnRzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBtaWRkbGUgZWxlbWVudCBvZiB0aGUgc29ydCBhcyB0aGUgcGl2b3RzXG4gICAtIHNvcnQgdGhlIGFycmF5IHdpdGg6XG4gICAtIGFsbCBlbGVtZW50cyBsZXNzIHRoYW4gcGl2b3QxIHRvIHRoZSBsZWZ0IChyYW5nZSAxKVxuICAgLSBhbGwgZWxlbWVudHMgPj0gcGl2b3QxIGFuZCA8PSBwaXZvdDIgaW4gdGhlIG1pZGRsZSAocmFuZ2UgMilcbiAgIC0gYWxsIGVsZW1lbnRzID4gcGl2b3QyIHRvIHRoZSByaWdodCAocmFuZ2UgMylcbiAgIC0gaWYgcGl2b3QxIGFuZCBwaXZvdDIgYXJlIGVxdWFsLCB0aGVuIHRoZSBtaWRkbGUgcmFuZ2UgaXMgc29ydGVkLCBzbyBpZ25vcmUgaXRcbiAgIC0gcmVjdXJzZSBpbnRvIHJhbmdlIDEsIDIgKGlmIHBpdm90MSBhbmQgcGl2b3QyIGFyZSB1bmVxdWFsKSwgYW5kIDNcbiAgIC0gZHVyaW5nIHJlY3Vyc2lvbiB0aGVyZSBhcmUgdHdvIGluZmxlY3Rpb24gcG9pbnRzOlxuICAgLSBpZiB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCByYW5nZSBpcyBzbWFsbCwgdXNlIGluc2VydGlvbiBzb3J0IHRvIHNvcnQgaXRcbiAgIC0gaWYgdGhlIHN0YWNrIGRlcHRoIGlzIGxhcmdlLCBzb3J0IHRoZSByYW5nZSB3aXRoIGhlYXAtc29ydCB0byBhdm9pZCBuXjIgd29yc3QtY2FzZVxuICAgICBiZWhhdmlvclxuXG4gICBTZWUgdGhlIGZvbGxvd2luZyBmb3IgbW9yZSBpbmZvcm1hdGlvbjpcbiAgIC0gXCJEdWFsLVBpdm90IFF1aWNrc29ydFwiIGJ5IFZsYWRpbWlyIFlhcm9zbGF2c2tpeS5cbiAgICAgQXZhaWxhYmxlIGF0XG4gICAgIGh0dHA6Ly93d3cua3JpY2hlLmNvbS5hci9yb290L3Byb2dyYW1taW5nL3NwYWNlVGltZUNvbXBsZXhpdHkvRHVhbFBpdm90UXVpY2tzb3J0LnBkZlxuICAgLSBcIlF1aWNrc29ydCBpcyBPcHRpbWFsXCIgYnkgU2VkZ2V3aWNrIGFuZCBCZW50bGV5LlxuICAgICBTbGlkZXMgYXQgaHR0cDovL3d3dy5jcy5wcmluY2V0b24uZWR1L35ycy90YWxrcy9RdWlja3NvcnRJc09wdGltYWwucGRmXG4gICAtIGh0dHA6Ly93d3cuc29ydGluZy1hbGdvcml0aG1zLmNvbS9xdWljay1zb3J0LTMtd2F5ICopXG5cbm1vZHVsZSBTb3J0ID0gc3RydWN0XG4gICgqIEZvciB0aGUgc2FrZSBvZiBzcGVlZCB3ZSBjb3VsZCB1c2UgdW5zYWZlIGdldC9zZXQgdGhyb3VnaG91dCwgYnV0IHNwZWVkIHRlc3RzIGRvbid0XG4gICAgIHNob3cgYSBzaWduaWZpY2FudCBpbXByb3ZlbWVudC4gKilcbiAgbGV0IGdldCA9IGdldFxuICBsZXQgc2V0ID0gc2V0XG5cbiAgbGV0IHN3YXAgYXJyIGkgaiA9XG4gICAgbGV0IHRtcCA9IGdldCBhcnIgaSBpblxuICAgIHNldCBhcnIgaSAoZ2V0IGFyciBqKTtcbiAgICBzZXQgYXJyIGogdG1wXG4gIDs7XG5cbiAgbW9kdWxlIHR5cGUgU29ydCA9IHNpZ1xuICAgIHZhbCBzb3J0XG4gICAgICA6ICAnYSB0XG4gICAgICAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpXG4gICAgICAtPiBsZWZ0OmludCAoKiBsZWZ0bW9zdCBpbmRleCBvZiBzdWItYXJyYXkgdG8gc29ydCAqKVxuICAgICAgLT4gcmlnaHQ6aW50ICgqIHJpZ2h0bW9zdCBpbmRleCBvZiBzdWItYXJyYXkgdG8gc29ydCAqKVxuICAgICAgLT4gdW5pdFxuICBlbmRcblxuICAoKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0luc2VydGlvbl9zb3J0ICopXG4gIG1vZHVsZSBJbnNlcnRpb25fc29ydCA6IFNvcnQgPSBzdHJ1Y3RcbiAgICBsZXQgc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgICgqIGxvb3AgaW52YXJpYW50OlxuICAgICAgICAgW2Fycl0gaXMgc29ydGVkIGZyb20gW2xlZnRdIHRvIFtwb3MgLSAxXSwgaW5jbHVzaXZlICopXG4gICAgICBmb3IgcG9zID0gbGVmdCArIDEgdG8gcmlnaHQgZG9cbiAgICAgICAgKCogbG9vcCBpbnZhcmlhbnRzOlxuICAgICAgICAgICAxLiAgdGhlIHN1YmFycmF5IGFycltsZWZ0IC4uIGktMV0gaXMgc29ydGVkXG4gICAgICAgICAgIDIuICB0aGUgc3ViYXJyYXkgYXJyW2krMSAuLiBwb3NdIGlzIHNvcnRlZCBhbmQgY29udGFpbnMgb25seSBlbGVtZW50cyA+IHZcbiAgICAgICAgICAgMy4gIGFycltpXSBtYXkgYmUgdGhvdWdodCBvZiBhcyBjb250YWluaW5nIHZcblxuICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhbGxvY2F0ZSBhIGNsb3N1cmUsIGJ1dCBpcyBsZWZ0IGluIHRoZSBmb3JcbiAgICAgICAgICAgbG9vcCBmb3IgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBkb2N1bWVudGF0aW9uLiAqKVxuICAgICAgICBsZXQgcmVjIGxvb3AgYXJyIH5sZWZ0IH5jb21wYXJlIGkgdiA9XG4gICAgICAgICAgbGV0IGlfbmV4dCA9IGkgLSAxIGluXG4gICAgICAgICAgaWYgaV9uZXh0ID49IGxlZnQgJiYgY29tcGFyZSAoZ2V0IGFyciBpX25leHQpIHYgPiAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBzZXQgYXJyIGkgKGdldCBhcnIgaV9uZXh0KTtcbiAgICAgICAgICAgIGxvb3AgYXJyIH5sZWZ0IH5jb21wYXJlIGlfbmV4dCB2KVxuICAgICAgICAgIGVsc2UgaVxuICAgICAgICBpblxuICAgICAgICBsZXQgdiA9IGdldCBhcnIgcG9zIGluXG4gICAgICAgIGxldCBmaW5hbF9wb3MgPSBsb29wIGFyciB+bGVmdCB+Y29tcGFyZSBwb3MgdiBpblxuICAgICAgICBzZXQgYXJyIGZpbmFsX3BvcyB2XG4gICAgICBkb25lXG4gICAgOztcbiAgZW5kXG5cbiAgKCogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IZWFwc29ydCAqKVxuICBtb2R1bGUgSGVhcF9zb3J0IDogU29ydCA9IHN0cnVjdFxuICAgICgqIGxvb3AgaW52YXJpYW50OlxuICAgICAgIHJvb3QncyBjaGlsZHJlbiBhcmUgYm90aCBlaXRoZXIgcm9vdHMgb2YgbWF4LWhlYXBzIG9yID4gcmlnaHQgKilcbiAgICBsZXQgcmVjIGhlYXBpZnkgYXJyIH5jb21wYXJlIHJvb3QgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGxldCByZWxhdGl2ZV9yb290ID0gcm9vdCAtIGxlZnQgaW5cbiAgICAgIGxldCBsZWZ0X2NoaWxkID0gKDIgKiByZWxhdGl2ZV9yb290KSArIGxlZnQgKyAxIGluXG4gICAgICBsZXQgcmlnaHRfY2hpbGQgPSAoMiAqIHJlbGF0aXZlX3Jvb3QpICsgbGVmdCArIDIgaW5cbiAgICAgIGxldCBsYXJnZXN0ID1cbiAgICAgICAgaWYgbGVmdF9jaGlsZCA8PSByaWdodCAmJiBjb21wYXJlIChnZXQgYXJyIGxlZnRfY2hpbGQpIChnZXQgYXJyIHJvb3QpID4gMFxuICAgICAgICB0aGVuIGxlZnRfY2hpbGRcbiAgICAgICAgZWxzZSByb290XG4gICAgICBpblxuICAgICAgbGV0IGxhcmdlc3QgPVxuICAgICAgICBpZiByaWdodF9jaGlsZCA8PSByaWdodCAmJiBjb21wYXJlIChnZXQgYXJyIHJpZ2h0X2NoaWxkKSAoZ2V0IGFyciBsYXJnZXN0KSA+IDBcbiAgICAgICAgdGhlbiByaWdodF9jaGlsZFxuICAgICAgICBlbHNlIGxhcmdlc3RcbiAgICAgIGluXG4gICAgICBpZiBsYXJnZXN0IDw+IHJvb3RcbiAgICAgIHRoZW4gKFxuICAgICAgICBzd2FwIGFyciByb290IGxhcmdlc3Q7XG4gICAgICAgIGhlYXBpZnkgYXJyIH5jb21wYXJlIGxhcmdlc3QgfmxlZnQgfnJpZ2h0KVxuICAgIDs7XG5cbiAgICBsZXQgYnVpbGRfaGVhcCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgICgqIEVsZW1lbnRzIGluIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgYXJyYXkgYXJlIGFscmVhZHkgaGVhcHMgb2Ygc2l6ZSAxLiAgV2UgbW92ZVxuICAgICAgICAgdGhyb3VnaCB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgYXJyYXkgZnJvbSBiYWNrIHRvIGZyb250IGV4YW1pbmluZyB0aGUgZWxlbWVudCBhdFxuICAgICAgICAgaGFuZCwgYW5kIHRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZHJlbiwgZml4aW5nIHRoZSBoZWFwIHByb3BlcnR5IGFzIHdlIGdvLiAqKVxuICAgICAgZm9yIGkgPSAobGVmdCArIHJpZ2h0KSAvIDIgZG93bnRvIGxlZnQgZG9cbiAgICAgICAgaGVhcGlmeSBhcnIgfmNvbXBhcmUgaSB+bGVmdCB+cmlnaHRcbiAgICAgIGRvbmVcbiAgICA7O1xuXG4gICAgbGV0IHNvcnQgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICBidWlsZF9oZWFwIGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHQ7XG4gICAgICAoKiBsb29wIGludmFyaWFudHM6XG4gICAgICAgICAxLiAgdGhlIHN1YmFycmF5IGFycltsZWZ0IC4uLiBpXSBpcyBhIG1heC1oZWFwIEhcbiAgICAgICAgIDIuICB0aGUgc3ViYXJyYXkgYXJyW2krMSAuLi4gcmlnaHRdIGlzIHNvcnRlZCAoY2FsbCBpdCBTKVxuICAgICAgICAgMy4gIGV2ZXJ5IGVsZW1lbnQgb2YgSCBpcyBsZXNzIHRoYW4gZXZlcnkgZWxlbWVudCBvZiBTICopXG4gICAgICBmb3IgaSA9IHJpZ2h0IGRvd250byBsZWZ0ICsgMSBkb1xuICAgICAgICBzd2FwIGFyciBsZWZ0IGk7XG4gICAgICAgIGhlYXBpZnkgYXJyIH5jb21wYXJlIGxlZnQgfmxlZnQgfnJpZ2h0OihpIC0gMSlcbiAgICAgIGRvbmVcbiAgICA7O1xuICBlbmRcblxuICAoKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ludHJvc29ydCAqKVxuICBtb2R1bGUgSW50cm9fc29ydCA6IHNpZ1xuICAgIGluY2x1ZGUgU29ydFxuXG4gICAgdmFsIGZpdmVfZWxlbWVudF9zb3J0XG4gICAgICA6ICAnYSB0XG4gICAgICAtPiBjb21wYXJlOignYSAtPiAnYSAtPiBpbnQpXG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gaW50XG4gICAgICAtPiBpbnRcbiAgICAgIC0+IGludFxuICAgICAgLT4gdW5pdFxuICBlbmQgPSBzdHJ1Y3RcbiAgICBsZXQgZml2ZV9lbGVtZW50X3NvcnQgYXJyIH5jb21wYXJlIG0xIG0yIG0zIG00IG01ID1cbiAgICAgIGxldCBjb21wYXJlX2FuZF9zd2FwIGkgaiA9XG4gICAgICAgIGlmIGNvbXBhcmUgKGdldCBhcnIgaSkgKGdldCBhcnIgaikgPiAwIHRoZW4gc3dhcCBhcnIgaSBqXG4gICAgICBpblxuICAgICAgKCogT3B0aW1hbCA1LWVsZW1lbnQgc29ydGluZyBuZXR3b3JrOlxuXG4gICAgICAgICB7dlxuICAgICAgICAgICAgMS0tby0tLS0tby0tLS0tby0tLS0tLS0tLS0tLS0tMVxuICAgICAgICAgICAgICAgfCAgICAgfCAgICAgfFxuICAgICAgICAgICAgMi0tby0tLS0tfC0tby0tfC0tLS0tby0tby0tLS0tMlxuICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfCAgICAgfCAgfFxuICAgICAgICAgICAgMy0tLS0tLS0tby0tby0tfC0tby0tfC0tby0tLS0tM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfFxuICAgICAgICAgICAgNC0tLS0tby0tLS0tLS0tby0tby0tfC0tLS0tby0tNFxuICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgfFxuICAgICAgICAgICAgNS0tLS0tby0tLS0tLS0tLS0tLS0tby0tLS0tby0tNVxuICAgICAgICAgIHZ9ICopXG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0xIG0yO1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtNCBtNTtcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTEgbTM7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0yIG0zO1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMSBtNDtcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTMgbTQ7XG4gICAgICBjb21wYXJlX2FuZF9zd2FwIG0yIG01O1xuICAgICAgY29tcGFyZV9hbmRfc3dhcCBtMiBtMztcbiAgICAgIGNvbXBhcmVfYW5kX3N3YXAgbTQgbTVcbiAgICA7O1xuXG4gICAgKCogY2hvb3NlIHBpdm90cyBmb3IgdGhlIGFycmF5IGJ5IHNvcnRpbmcgNSBlbGVtZW50cyBhbmQgZXhhbWluaW5nIHRoZSBjZW50ZXIgdGhyZWVcbiAgICAgICBlbGVtZW50cy4gIFRoZSBnb2FsIGlzIHRvIGNob29zZSB0d28gcGl2b3RzIHRoYXQgd2lsbCBlaXRoZXI6XG4gICAgICAgLSBicmVhayB0aGUgcmFuZ2UgdXAgaW50byAzIGV2ZW4gcGFydGl0aW9uc1xuICAgICAgICAgb3JcbiAgICAgICAtIGVsaW1pbmF0ZSBhIGNvbW1vbmx5IGFwcGVhcmluZyBlbGVtZW50IGJ5IHNvcnRpbmcgaXQgaW50byB0aGUgY2VudGVyIHBhcnRpdGlvblxuICAgICAgICAgYnkgaXRzZWxmXG4gICAgICAgICBUbyB0aGlzIGVuZCB3ZSBsb29rIGF0IHRoZSBjZW50ZXIgMyBlbGVtZW50cyBvZiB0aGUgNSBhbmQgcmV0dXJuIHBhaXJzIG9mIGVxdWFsXG4gICAgICAgICBlbGVtZW50cyBvciB0aGUgd2lkZXN0IHJhbmdlICopXG4gICAgbGV0IGNob29zZV9waXZvdHMgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICBsZXQgc2l4dGggPSAocmlnaHQgLSBsZWZ0KSAvIDYgaW5cbiAgICAgIGxldCBtMSA9IGxlZnQgKyBzaXh0aCBpblxuICAgICAgbGV0IG0yID0gbTEgKyBzaXh0aCBpblxuICAgICAgbGV0IG0zID0gbTIgKyBzaXh0aCBpblxuICAgICAgbGV0IG00ID0gbTMgKyBzaXh0aCBpblxuICAgICAgbGV0IG01ID0gbTQgKyBzaXh0aCBpblxuICAgICAgZml2ZV9lbGVtZW50X3NvcnQgYXJyIH5jb21wYXJlIG0xIG0yIG0zIG00IG01O1xuICAgICAgbGV0IG0yX3ZhbCA9IGdldCBhcnIgbTIgaW5cbiAgICAgIGxldCBtM192YWwgPSBnZXQgYXJyIG0zIGluXG4gICAgICBsZXQgbTRfdmFsID0gZ2V0IGFyciBtNCBpblxuICAgICAgaWYgY29tcGFyZSBtMl92YWwgbTNfdmFsID0gMFxuICAgICAgdGhlbiBtMl92YWwsIG0zX3ZhbCwgdHJ1ZVxuICAgICAgZWxzZSBpZiBjb21wYXJlIG0zX3ZhbCBtNF92YWwgPSAwXG4gICAgICB0aGVuIG0zX3ZhbCwgbTRfdmFsLCB0cnVlXG4gICAgICBlbHNlIG0yX3ZhbCwgbTRfdmFsLCBmYWxzZVxuICAgIDs7XG5cbiAgICBsZXQgZHVhbF9waXZvdF9wYXJ0aXRpb24gYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCA9XG4gICAgICBsZXQgcGl2b3QxLCBwaXZvdDIsIHBpdm90c19lcXVhbCA9IGNob29zZV9waXZvdHMgYXJyIH5jb21wYXJlIH5sZWZ0IH5yaWdodCBpblxuICAgICAgKCogbG9vcCBpbnZhcmlhbnRzOlxuICAgICAgICAgMS4gIGxlZnQgPD0gbCA8IHIgPD0gcmlnaHRcbiAgICAgICAgIDIuICBsIDw9IHAgPD0gclxuICAgICAgICAgMy4gIGwgPD0geCA8IHAgICAgIGltcGxpZXMgYXJyW3hdID49IHBpdm90MVxuICAgICAgICAgYW5kIGFyclt4XSA8PSBwaXZvdDJcbiAgICAgICAgIDQuICBsZWZ0IDw9IHggPCBsICBpbXBsaWVzIGFyclt4XSA8IHBpdm90MVxuICAgICAgICAgNS4gIHIgPCB4IDw9IHJpZ2h0IGltcGxpZXMgYXJyW3hdID4gcGl2b3QyICopXG4gICAgICBsZXQgcmVjIGxvb3AgbCBwIHIgPVxuICAgICAgICBsZXQgcHYgPSBnZXQgYXJyIHAgaW5cbiAgICAgICAgaWYgY29tcGFyZSBwdiBwaXZvdDEgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIHN3YXAgYXJyIHAgbDtcbiAgICAgICAgICBjb250IChsICsgMSkgKHAgKyAxKSByKVxuICAgICAgICBlbHNlIGlmIGNvbXBhcmUgcHYgcGl2b3QyID4gMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICAoKiBsb29wIGludmFyaWFudHM6ICBzYW1lIGFzIHRob3NlIG9mIHRoZSBvdXRlciBsb29wICopXG4gICAgICAgICAgbGV0IHJlYyBzY2FuX2JhY2t3YXJkcyByID1cbiAgICAgICAgICAgIGlmIHIgPiBwICYmIGNvbXBhcmUgKGdldCBhcnIgcikgcGl2b3QyID4gMCB0aGVuIHNjYW5fYmFja3dhcmRzIChyIC0gMSkgZWxzZSByXG4gICAgICAgICAgaW5cbiAgICAgICAgICBsZXQgciA9IHNjYW5fYmFja3dhcmRzIHIgaW5cbiAgICAgICAgICBzd2FwIGFyciByIHA7XG4gICAgICAgICAgY29udCBsIHAgKHIgLSAxKSlcbiAgICAgICAgZWxzZSBjb250IGwgKHAgKyAxKSByXG4gICAgICBhbmQgY29udCBsIHAgciA9IGlmIHAgPiByIHRoZW4gbCwgciBlbHNlIGxvb3AgbCBwIHIgaW5cbiAgICAgIGxldCBsLCByID0gY29udCBsZWZ0IGxlZnQgcmlnaHQgaW5cbiAgICAgIGwsIHIsIHBpdm90c19lcXVhbFxuICAgIDs7XG5cbiAgICBsZXQgcmVjIGludHJvX3NvcnQgYXJyIH5tYXhfZGVwdGggfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGxldCBsZW4gPSByaWdodCAtIGxlZnQgKyAxIGluXG4gICAgICAoKiBUaGlzIHRha2VzIGNhcmUgb2Ygc29tZSBlZGdlIGNhc2VzLCBzdWNoIGFzIGxlZnQgPiByaWdodCBvciB2ZXJ5IHNob3J0IGFycmF5cyxcbiAgICAgICAgIHNpbmNlIEluc2VydGlvbl9zb3J0LnNvcnQgaGFuZGxlcyB0aGVzZSBjYXNlcyBwcm9wZXJseS4gIFRodXMgd2UgZG9uJ3QgbmVlZCB0b1xuICAgICAgICAgbWFrZSBzdXJlIHRoYXQgbGVmdCBhbmQgcmlnaHQgYXJlIHZhbGlkIGluIHJlY3Vyc2l2ZSBjYWxscy4gKilcbiAgICAgIGlmIGxlbiA8PSAzMlxuICAgICAgdGhlbiBJbnNlcnRpb25fc29ydC5zb3J0IGFyciB+Y29tcGFyZSB+bGVmdCB+cmlnaHRcbiAgICAgIGVsc2UgaWYgbWF4X2RlcHRoIDwgMFxuICAgICAgdGhlbiBIZWFwX3NvcnQuc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0XG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IG1heF9kZXB0aCA9IG1heF9kZXB0aCAtIDEgaW5cbiAgICAgICAgbGV0IGwsIHIsIG1pZGRsZV9zb3J0ZWQgPSBkdWFsX3Bpdm90X3BhcnRpdGlvbiBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0IGluXG4gICAgICAgIGludHJvX3NvcnQgYXJyIH5tYXhfZGVwdGggfmNvbXBhcmUgfmxlZnQgfnJpZ2h0OihsIC0gMSk7XG4gICAgICAgIGlmIG5vdCBtaWRkbGVfc29ydGVkIHRoZW4gaW50cm9fc29ydCBhcnIgfm1heF9kZXB0aCB+Y29tcGFyZSB+bGVmdDpsIH5yaWdodDpyO1xuICAgICAgICBpbnRyb19zb3J0IGFyciB+bWF4X2RlcHRoIH5jb21wYXJlIH5sZWZ0OihyICsgMSkgfnJpZ2h0KVxuICAgIDs7XG5cbiAgICBsZXQgc29ydCBhcnIgfmNvbXBhcmUgfmxlZnQgfnJpZ2h0ID1cbiAgICAgIGxldCBoZWFwX3NvcnRfc3dpdGNoX2RlcHRoID1cbiAgICAgICAgKCogV2UgYmFpbCBvdXQgdG8gaGVhcCBzb3J0IGF0IGEgcmVjdXJzaW9uIGRlcHRoIG9mIDMyLiBHTlUgaW50cm9zb3J0IHVzZXMgMmxnKG4pLlxuICAgICAgICAgICBUaGUgZXhwZWN0ZWQgcmVjdXJzaW9uIGRlcHRoIGZvciBwZXJmZWN0IDMtd2F5IHNwbGl0cyBpcyBsb2dfMyhuKS5cblxuICAgICAgICAgICBVc2luZyAzMiBtZWFucyBhIGJhbGFuY2VkIDMtd2F5IHNwbGl0IHdvdWxkIHdvcmsgdXAgdG8gM14zMiBlbGVtZW50cyAocm91Z2hseVxuICAgICAgICAgICAyXjUwIG9yIDEwXjE1KS4gR05VIHJlYWNoZXMgYSBkZXB0aCBvZiAzMiBhdCA2NTUzNiBlbGVtZW50cy5cblxuICAgICAgICAgICBGb3Igc21hbGwgYXJyYXlzLCB0aGlzIG1ha2VzIHVzIGxlc3MgbGlrZWx5IHRvIGJhaWwgb3V0IHRvIGhlYXAgc29ydCwgYnV0IHRoZVxuICAgICAgICAgICAzMipOIGNvc3QgYmVmb3JlIHdlIGRvIGlzIG5vdCB0aGF0IG11Y2guXG5cbiAgICAgICAgICAgRm9yIGxhcmdlIGFycmF5cywgdGhpcyBtZWFucyB3ZSBhcmUgbW9yZSBsaWtlbHkgdG8gYmFpbCBvdXQgdG8gaGVhcCBzb3J0IGF0XG4gICAgICAgICAgIHNvbWUgcG9pbnQgaWYgd2UgZ2V0IHNvbWUgYmFkIHNwbGl0cyBvciBpZiB0aGUgYXJyYXkgaXMgaHVnZS4gQnV0IHRoYXQncyBvbmx5IGFcbiAgICAgICAgICAgY29uc3RhbnQgZmFjdG9yIGNvc3QgaW4gdGhlIGZpbmFsIHN0YWdlcyBvZiByZWN1cnNpb24uXG5cbiAgICAgICAgICAgQWxsIGluIGFsbCwgdGhpcyBzZWVtcyB0byBiZSBhIHNtYWxsIHRyYWRlb2ZmIGFuZCBhdm9pZHMgcGF5aW5nIGEgY29zdCB0b1xuICAgICAgICAgICBjb21wdXRlIGEgbG9nYXJpdGhtIGF0IHRoZSBzdGFydC4gKilcbiAgICAgICAgMzJcbiAgICAgIGluXG4gICAgICBpbnRyb19zb3J0IGFyciB+bWF4X2RlcHRoOmhlYXBfc29ydF9zd2l0Y2hfZGVwdGggfmNvbXBhcmUgfmxlZnQgfnJpZ2h0XG4gICAgOztcbiAgZW5kXG5lbmRcblxubGV0IHNvcnQgP3BvcyA/bGVuIGFyciB+Y29tcGFyZSA9XG4gIGxldCBwb3MsIGxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5nZXRfcG9zX2xlbl9leG4gKCkgP3BvcyA/bGVuIH50b3RhbF9sZW5ndGg6KGxlbmd0aCBhcnIpXG4gIGluXG4gIFNvcnQuSW50cm9fc29ydC5zb3J0IGFyciB+Y29tcGFyZSB+bGVmdDpwb3MgfnJpZ2h0Oihwb3MgKyBsZW4gLSAxKVxuOztcblxubGV0IHRvX2FycmF5IHQgPSB0XG5sZXQgaXNfZW1wdHkgdCA9IGxlbmd0aCB0ID0gMFxuXG5sZXQgaXNfc29ydGVkIHQgfmNvbXBhcmUgPVxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIHRydWUgaW5cbiAgd2hpbGUgIWkgPiAwICYmICFyZXN1bHQgZG9cbiAgICBsZXQgZWx0X2kgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICBsZXQgZWx0X2lfbWludXNfMSA9IHVuc2FmZV9nZXQgdCAoIWkgLSAxKSBpblxuICAgIGlmIGNvbXBhcmUgZWx0X2lfbWludXNfMSBlbHRfaSA+IDAgdGhlbiByZXN1bHQgOj0gZmFsc2U7XG4gICAgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBpc19zb3J0ZWRfc3RyaWN0bHkgdCB+Y29tcGFyZSA9XG4gIGxldCBpID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgdHJ1ZSBpblxuICB3aGlsZSAhaSA+IDAgJiYgIXJlc3VsdCBkb1xuICAgIGxldCBlbHRfaSA9IHVuc2FmZV9nZXQgdCAhaSBpblxuICAgIGxldCBlbHRfaV9taW51c18xID0gdW5zYWZlX2dldCB0ICghaSAtIDEpIGluXG4gICAgaWYgY29tcGFyZSBlbHRfaV9taW51c18xIGVsdF9pID49IDAgdGhlbiByZXN1bHQgOj0gZmFsc2U7XG4gICAgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBtZXJnZSBhMSBhMiB+Y29tcGFyZSA9XG4gIGxldCBsMSA9IEFycmF5Lmxlbmd0aCBhMSBpblxuICBsZXQgbDIgPSBBcnJheS5sZW5ndGggYTIgaW5cbiAgaWYgbDEgPSAwXG4gIHRoZW4gY29weSBhMlxuICBlbHNlIGlmIGwyID0gMFxuICB0aGVuIGNvcHkgYTFcbiAgZWxzZSBpZiBjb21wYXJlICh1bnNhZmVfZ2V0IGEyIDApICh1bnNhZmVfZ2V0IGExIChsMSAtIDEpKSA+PSAwXG4gIHRoZW4gYXBwZW5kIGExIGEyXG4gIGVsc2UgaWYgY29tcGFyZSAodW5zYWZlX2dldCBhMSAwKSAodW5zYWZlX2dldCBhMiAobDIgLSAxKSkgPiAwXG4gIHRoZW4gYXBwZW5kIGEyIGExXG4gIGVsc2UgKFxuICAgIGxldCBsZW4gPSBsMSArIGwyIGluXG4gICAgbGV0IG1lcmdlZCA9IGNyZWF0ZSB+bGVuICh1bnNhZmVfZ2V0IGExIDApIGluXG4gICAgbGV0IGExX2luZGV4ID0gcmVmIDAgaW5cbiAgICBsZXQgYTJfaW5kZXggPSByZWYgMCBpblxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICBsZXQgdXNlX2ExID1cbiAgICAgICAgaWYgbDEgPSAhYTFfaW5kZXhcbiAgICAgICAgdGhlbiBmYWxzZVxuICAgICAgICBlbHNlIGlmIGwyID0gIWEyX2luZGV4XG4gICAgICAgIHRoZW4gdHJ1ZVxuICAgICAgICBlbHNlIGNvbXBhcmUgKHVuc2FmZV9nZXQgYTEgIWExX2luZGV4KSAodW5zYWZlX2dldCBhMiAhYTJfaW5kZXgpIDw9IDBcbiAgICAgIGluXG4gICAgICBpZiB1c2VfYTFcbiAgICAgIHRoZW4gKFxuICAgICAgICB1bnNhZmVfc2V0IG1lcmdlZCBpICh1bnNhZmVfZ2V0IGExICFhMV9pbmRleCk7XG4gICAgICAgIGExX2luZGV4IDo9ICFhMV9pbmRleCArIDEpXG4gICAgICBlbHNlIChcbiAgICAgICAgdW5zYWZlX3NldCBtZXJnZWQgaSAodW5zYWZlX2dldCBhMiAhYTJfaW5kZXgpO1xuICAgICAgICBhMl9pbmRleCA6PSAhYTJfaW5kZXggKyAxKVxuICAgIGRvbmU7XG4gICAgbWVyZ2VkKVxuOztcblxubGV0IGNvcHlfbWF0cml4ID0gbWFwIH5mOmNvcHlcblxubGV0IGZvbGRpbmdfbWFwIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbWFwIHQgfmY6KGZ1biB4IC0+XG4gICAgbGV0IG5ld19hY2MsIHkgPSBmICFhY2MgeCBpblxuICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgIHkpXG47O1xuXG5sZXQgZm9sZF9tYXAgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBsZXQgcmVzdWx0ID1cbiAgICBtYXAgdCB+ZjooZnVuIHggLT5cbiAgICAgIGxldCBuZXdfYWNjLCB5ID0gZiAhYWNjIHggaW5cbiAgICAgIGFjYyA6PSBuZXdfYWNjO1xuICAgICAgeSlcbiAgaW5cbiAgIWFjYywgcmVzdWx0XG47O1xuXG5sZXQgZm9sZF9yZXN1bHQgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3Jlc3VsdCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfdW50aWwgfmZvbGQgfmluaXQgfmYgdFxubGV0IGNvdW50IHQgfmYgPSBDb250YWluZXIuY291bnQgfmZvbGQgdCB+ZlxubGV0IHN1bSBtIHQgfmYgPSBDb250YWluZXIuc3VtIH5mb2xkIG0gdCB+ZlxubGV0IG1pbl9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5taW5fZWx0IH5mb2xkIHQgfmNvbXBhcmVcbmxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG5cbmxldCBmb2xkaSB0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICBhY2MgOj0gZiBpICFhY2MgKHVuc2FmZV9nZXQgdCBpKVxuICBkb25lO1xuICAhYWNjXG47O1xuXG5sZXQgZm9sZGluZ19tYXBpIHQgfmluaXQgfmYgPVxuICBsZXQgYWNjID0gcmVmIGluaXQgaW5cbiAgbWFwaSB0IH5mOihmdW4gaSB4IC0+XG4gICAgbGV0IG5ld19hY2MsIHkgPSBmIGkgIWFjYyB4IGluXG4gICAgYWNjIDo9IG5ld19hY2M7XG4gICAgeSlcbjs7XG5cbmxldCBmb2xkX21hcGkgdCB+aW5pdCB+ZiA9XG4gIGxldCBhY2MgPSByZWYgaW5pdCBpblxuICBsZXQgcmVzdWx0ID1cbiAgICBtYXBpIHQgfmY6KGZ1biBpIHggLT5cbiAgICAgIGxldCBuZXdfYWNjLCB5ID0gZiBpICFhY2MgeCBpblxuICAgICAgYWNjIDo9IG5ld19hY2M7XG4gICAgICB5KVxuICBpblxuICAhYWNjLCByZXN1bHRcbjs7XG5cbmxldCBjb3VudGkgdCB+ZiA9XG4gIGZvbGRpIHQgfmluaXQ6MCB+ZjooZnVuIGlkeCBjb3VudCBhIC0+IGlmIGYgaWR4IGEgdGhlbiBjb3VudCArIDEgZWxzZSBjb3VudClcbjs7XG5cbmxldCBjb25jYXRfbWFwIHQgfmYgPSBjb25jYXQgKHRvX2xpc3QgKG1hcCB+ZiB0KSlcbmxldCBjb25jYXRfbWFwaSB0IH5mID0gY29uY2F0ICh0b19saXN0IChtYXBpIH5mIHQpKVxuXG5sZXQgcmV2X2lucGxhY2UgdCA9XG4gIGxldCBpID0gcmVmIDAgaW5cbiAgbGV0IGogPSByZWYgKGxlbmd0aCB0IC0gMSkgaW5cbiAgd2hpbGUgIWkgPCAhaiBkb1xuICAgIHN3YXAgdCAhaSAhajtcbiAgICBpbmNyIGk7XG4gICAgZGVjciBqXG4gIGRvbmVcbjs7XG5cbmxldCByZXYgdCA9XG4gIGxldCB0ID0gY29weSB0IGluXG4gIHJldl9pbnBsYWNlIHQ7XG4gIHRcbjs7XG5cbmxldCBvZl9saXN0X3JldiBsID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gW3x8XVxuICB8IGEgOjogbCAtPlxuICAgIGxldCBsZW4gPSAxICsgTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCB0ID0gY3JlYXRlIH5sZW4gYSBpblxuICAgIGxldCByID0gcmVmIGwgaW5cbiAgICAoKiBXZSBzdGFydCBhdCBbbGVuIC0gMl0gYmVjYXVzZSB3ZSBhbHJlYWR5IHB1dCBbYV0gYXQgW3QuKGxlbiAtIDEpXS4gKilcbiAgICBmb3IgaSA9IGxlbiAtIDIgZG93bnRvIDAgZG9cbiAgICAgIG1hdGNoICFyIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IGEgOjogbCAtPlxuICAgICAgICB0LihpKSA8LSBhO1xuICAgICAgICByIDo9IGxcbiAgICBkb25lO1xuICAgIHRcbjs7XG5cbigqIFtvZl9saXN0X21hcF0gYW5kIFtvZl9saXN0X3Jldl9tYXBdIGFyZSBiYXNlZCBvbiBmdW5jdGlvbnMgZnJvbSB0aGUgT0NhbWxcbiAgIGRpc3RyaWJ1dGlvbi4gKilcblxubGV0IG9mX2xpc3RfbWFwIHhzIH5mID1cbiAgbWF0Y2ggeHMgd2l0aFxuICB8IFtdIC0+IFt8fF1cbiAgfCBoZCA6OiB0bCAtPlxuICAgIGxldCBhID0gY3JlYXRlIH5sZW46KDEgKyBMaXN0Lmxlbmd0aCB0bCkgKGYgaGQpIGluXG4gICAgbGV0IHJlYyBmaWxsIGkgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBhXG4gICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIHVuc2FmZV9zZXQgYSBpIChmIGhkKTtcbiAgICAgICAgZmlsbCAoaSArIDEpIHRsXG4gICAgaW5cbiAgICBmaWxsIDEgdGxcbjs7XG5cbmxldCBvZl9saXN0X21hcGkgeHMgfmYgPVxuICBtYXRjaCB4cyB3aXRoXG4gIHwgW10gLT4gW3x8XVxuICB8IGhkIDo6IHRsIC0+XG4gICAgbGV0IGEgPSBjcmVhdGUgfmxlbjooMSArIExpc3QubGVuZ3RoIHRsKSAoZiAwIGhkKSBpblxuICAgIGxldCByZWMgZmlsbCBhIGkgPSBmdW5jdGlvblxuICAgICAgfCBbXSAtPiBhXG4gICAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgIHVuc2FmZV9zZXQgYSBpIChmIGkgaGQpO1xuICAgICAgICBmaWxsIGEgKGkgKyAxKSB0bFxuICAgIGluXG4gICAgZmlsbCBhIDEgdGxcbjs7XG5cbmxldCBvZl9saXN0X3Jldl9tYXAgeHMgfmYgPVxuICBsZXQgdCA9IG9mX2xpc3RfbWFwIHhzIH5mIGluXG4gIHJldl9pbnBsYWNlIHQ7XG4gIHRcbjs7XG5cbmxldCBvZl9saXN0X3Jldl9tYXBpIHhzIH5mID1cbiAgbGV0IHQgPSBvZl9saXN0X21hcGkgeHMgfmYgaW5cbiAgcmV2X2lucGxhY2UgdDtcbiAgdFxuOztcblxubGV0IGZpbHRlcl9tYXBpIHQgfmYgPVxuICBsZXQgciA9IHJlZiBbfHxdIGluXG4gIGxldCBrID0gcmVmIDAgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIG1hdGNoIGYgaSAodW5zYWZlX2dldCB0IGkpIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYSAtPlxuICAgICAgaWYgIWsgPSAwIHRoZW4gciA6PSBjcmVhdGUgfmxlbjoobGVuZ3RoIHQpIGE7XG4gICAgICB1bnNhZmVfc2V0ICFyICFrIGE7XG4gICAgICBpbmNyIGtcbiAgZG9uZTtcbiAgaWYgIWsgPSBsZW5ndGggdCB0aGVuICFyIGVsc2UgaWYgIWsgPiAwIHRoZW4gc3ViIH5wb3M6MCB+bGVuOiFrICFyIGVsc2UgW3x8XVxuOztcblxubGV0IGZpbHRlcl9tYXAgdCB+ZiA9IGZpbHRlcl9tYXBpIHQgfmY6KGZ1biBfaSBhIC0+IGYgYSlcbmxldCBmaWx0ZXJfb3B0IHQgPSBmaWx0ZXJfbWFwIHQgfmY6Rm4uaWRcblxubGV0IHJhaXNlX2xlbmd0aF9taXNtYXRjaCBuYW1lIG4xIG4yID1cbiAgaW52YWxpZF9hcmdmIFwibGVuZ3RoIG1pc21hdGNoIGluICVzOiAlZCA8PiAlZFwiIG5hbWUgbjEgbjIgKClcbltAQGNvbGRdIFtAQGlubGluZSBuZXZlcl0gW0BAbG9jYWwgbmV2ZXJdIFtAQHNwZWNpYWxpc2UgbmV2ZXJdXG47O1xuXG5sZXQgY2hlY2tfbGVuZ3RoMl9leG4gbmFtZSB0MSB0MiA9XG4gIGxldCBuMSA9IGxlbmd0aCB0MSBpblxuICBsZXQgbjIgPSBsZW5ndGggdDIgaW5cbiAgaWYgbjEgPD4gbjIgdGhlbiByYWlzZV9sZW5ndGhfbWlzbWF0Y2ggbmFtZSBuMSBuMlxuOztcblxubGV0IGl0ZXIyX2V4biB0MSB0MiB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiQXJyYXkuaXRlcjJfZXhuXCIgdDEgdDI7XG4gIGl0ZXJpIHQxIH5mOihmdW4gaSB4MSAtPiBmIHgxICh1bnNhZmVfZ2V0IHQyIGkpKVxuOztcblxubGV0IG1hcDJfZXhuIHQxIHQyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJBcnJheS5tYXAyX2V4blwiIHQxIHQyO1xuICBpbml0IChsZW5ndGggdDEpIH5mOihmdW4gaSAtPiBmICh1bnNhZmVfZ2V0IHQxIGkpICh1bnNhZmVfZ2V0IHQyIGkpKVxuOztcblxubGV0IGZvbGQyX2V4biB0MSB0MiB+aW5pdCB+ZiA9XG4gIGNoZWNrX2xlbmd0aDJfZXhuIFwiQXJyYXkuZm9sZDJfZXhuXCIgdDEgdDI7XG4gIGZvbGRpIHQxIH5pbml0IH5mOihmdW4gaSBhYyB4IC0+IGYgYWMgeCAodW5zYWZlX2dldCB0MiBpKSlcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9IGZpbHRlcl9tYXAgdCB+ZjooZnVuIHggLT4gaWYgZiB4IHRoZW4gU29tZSB4IGVsc2UgTm9uZSlcbmxldCBmaWx0ZXJpIHQgfmYgPSBmaWx0ZXJfbWFwaSB0IH5mOihmdW4gaSB4IC0+IGlmIGYgaSB4IHRoZW4gU29tZSB4IGVsc2UgTm9uZSlcblxuXG5sZXQgZXhpc3RzIHQgfmYgPVxuICBsZXQgaSA9IHJlZiAobGVuZ3RoIHQgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIGZhbHNlIGluXG4gIHdoaWxlICFpID49IDAgJiYgbm90ICFyZXN1bHQgZG9cbiAgICBpZiBmICh1bnNhZmVfZ2V0IHQgIWkpIHRoZW4gcmVzdWx0IDo9IHRydWUgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGV4aXN0c2kgdCB+ZiA9XG4gIGxldCBpID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgZmFsc2UgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiBub3QgIXJlc3VsdCBkb1xuICAgIGlmIGYgIWkgKHVuc2FmZV9nZXQgdCAhaSkgdGhlbiByZXN1bHQgOj0gdHJ1ZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgbWVtIHQgYSB+ZXF1YWwgPSBleGlzdHMgdCB+ZjooZXF1YWwgYSlcblxubGV0IGZvcl9hbGwgdCB+ZiA9XG4gIGxldCBpID0gcmVmIChsZW5ndGggdCAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgdHJ1ZSBpblxuICB3aGlsZSAhaSA+PSAwICYmICFyZXN1bHQgZG9cbiAgICBpZiBub3QgKGYgKHVuc2FmZV9nZXQgdCAhaSkpIHRoZW4gcmVzdWx0IDo9IGZhbHNlIGVsc2UgZGVjciBpXG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbmxldCBmb3JfYWxsaSB0IH5mID1cbiAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGxldCBpID0gcmVmIChsZW5ndGggLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIHRydWUgaW5cbiAgd2hpbGUgIWkgPj0gMCAmJiAhcmVzdWx0IGRvXG4gICAgaWYgbm90IChmICFpICh1bnNhZmVfZ2V0IHQgIWkpKSB0aGVuIHJlc3VsdCA6PSBmYWxzZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgZXhpc3RzMl9leG4gdDEgdDIgfmYgPVxuICBjaGVja19sZW5ndGgyX2V4biBcIkFycmF5LmV4aXN0czJfZXhuXCIgdDEgdDI7XG4gIGxldCBpID0gcmVmIChsZW5ndGggdDEgLSAxKSBpblxuICBsZXQgcmVzdWx0ID0gcmVmIGZhbHNlIGluXG4gIHdoaWxlICFpID49IDAgJiYgbm90ICFyZXN1bHQgZG9cbiAgICBpZiBmICh1bnNhZmVfZ2V0IHQxICFpKSAodW5zYWZlX2dldCB0MiAhaSkgdGhlbiByZXN1bHQgOj0gdHJ1ZSBlbHNlIGRlY3IgaVxuICBkb25lO1xuICAhcmVzdWx0XG47O1xuXG5sZXQgZm9yX2FsbDJfZXhuIHQxIHQyIH5mID1cbiAgY2hlY2tfbGVuZ3RoMl9leG4gXCJBcnJheS5mb3JfYWxsMl9leG5cIiB0MSB0MjtcbiAgbGV0IGkgPSByZWYgKGxlbmd0aCB0MSAtIDEpIGluXG4gIGxldCByZXN1bHQgPSByZWYgdHJ1ZSBpblxuICB3aGlsZSAhaSA+PSAwICYmICFyZXN1bHQgZG9cbiAgICBpZiBub3QgKGYgKHVuc2FmZV9nZXQgdDEgIWkpICh1bnNhZmVfZ2V0IHQyICFpKSkgdGhlbiByZXN1bHQgOj0gZmFsc2UgZWxzZSBkZWNyIGlcbiAgZG9uZTtcbiAgIXJlc3VsdFxuOztcblxubGV0IGVxdWFsIGVxdWFsIHQxIHQyID0gbGVuZ3RoIHQxID0gbGVuZ3RoIHQyICYmIGZvcl9hbGwyX2V4biB0MSB0MiB+ZjplcXVhbFxuXG5cbmxldCBtYXBfaW5wbGFjZSB0IH5mID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgdCBpIChmICh1bnNhZmVfZ2V0IHQgaSkpXG4gIGRvbmVcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gZmluZGlfaW50ZXJuYWwgdCB+ZiB+aWZfZm91bmQgfmlmX25vdF9mb3VuZCA9XG4gIGxldCBsZW5ndGggPSBsZW5ndGggdCBpblxuICBpZiBsZW5ndGggPSAwXG4gIHRoZW4gaWZfbm90X2ZvdW5kICgpXG4gIGVsc2UgKFxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgZm91bmQgPSByZWYgZmFsc2UgaW5cbiAgICBsZXQgdmFsdWVfZm91bmQgPSByZWYgKHVuc2FmZV9nZXQgdCAwKSBpblxuICAgIHdoaWxlIChub3QgIWZvdW5kKSAmJiAhaSA8IGxlbmd0aCBkb1xuICAgICAgbGV0IHZhbHVlID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgICBpZiBmICFpIHZhbHVlXG4gICAgICB0aGVuIChcbiAgICAgICAgdmFsdWVfZm91bmQgOj0gdmFsdWU7XG4gICAgICAgIGZvdW5kIDo9IHRydWUpXG4gICAgICBlbHNlIGluY3IgaVxuICAgIGRvbmU7XG4gICAgaWYgIWZvdW5kIHRoZW4gaWZfZm91bmQgfmk6IWkgfnZhbHVlOiF2YWx1ZV9mb3VuZCBlbHNlIGlmX25vdF9mb3VuZCAoKSlcbjs7XG5cbmxldCBmaW5kaSB0IH5mID1cbiAgZmluZGlfaW50ZXJuYWxcbiAgICB0XG4gICAgfmZcbiAgICB+aWZfZm91bmQ6KGZ1biB+aSB+dmFsdWUgLT4gU29tZSAoaSwgdmFsdWUpKVxuICAgIH5pZl9ub3RfZm91bmQ6KGZ1biAoKSAtPiBOb25lKVxuOztcblxubGV0IGZpbmRpX2V4biB0IH5mID1cbiAgZmluZGlfaW50ZXJuYWxcbiAgICB0XG4gICAgfmZcbiAgICB+aWZfZm91bmQ6KGZ1biB+aSB+dmFsdWUgLT4gaSwgdmFsdWUpXG4gICAgfmlmX25vdF9mb3VuZDooZnVuICgpIC0+IHJhaXNlIChOb3RfZm91bmRfcyAoQXRvbSBcIkFycmF5LmZpbmRpX2V4bjogbm90IGZvdW5kXCIpKSlcbjs7XG5cbmxldCBmaW5kX2V4biB0IH5mID1cbiAgZmluZGlfaW50ZXJuYWxcbiAgICB0XG4gICAgfmY6KGZ1biBfaSB4IC0+IGYgeClcbiAgICB+aWZfZm91bmQ6KGZ1biB+aTpfIH52YWx1ZSAtPiB2YWx1ZSlcbiAgICB+aWZfbm90X2ZvdW5kOihmdW4gKCkgLT4gcmFpc2UgKE5vdF9mb3VuZF9zIChBdG9tIFwiQXJyYXkuZmluZF9leG46IG5vdCBmb3VuZFwiKSkpXG47O1xuXG5sZXQgZmluZCB0IH5mID0gT3B0aW9uLm1hcCAoZmluZGkgdCB+ZjooZnVuIF9pIHggLT4gZiB4KSkgfmY6KGZ1biAoX2ksIHgpIC0+IHgpXG5cbmxldCBmaW5kX21hcCB0IH5mID1cbiAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGlmIGxlbmd0aCA9IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgdmFsdWVfZm91bmQgPSByZWYgTm9uZSBpblxuICAgIHdoaWxlIE9wdGlvbi5pc19ub25lICF2YWx1ZV9mb3VuZCAmJiAhaSA8IGxlbmd0aCBkb1xuICAgICAgbGV0IHZhbHVlID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgICB2YWx1ZV9mb3VuZCA6PSBmIHZhbHVlO1xuICAgICAgaW5jciBpXG4gICAgZG9uZTtcbiAgICAhdmFsdWVfZm91bmQpXG47O1xuXG5sZXQgZmluZF9tYXBfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiQXJyYXkuZmluZF9tYXBfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGZpbmRfbWFwX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kX21hcCB0IH5mIHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2Ugbm90X2ZvdW5kXG4gICAgfCBTb21lIHggLT4geFxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGZpbmRfbWFwX2V4blxuOztcblxubGV0IGZpbmRfbWFwaSB0IH5mID1cbiAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGlmIGxlbmd0aCA9IDBcbiAgdGhlbiBOb25lXG4gIGVsc2UgKFxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBsZXQgdmFsdWVfZm91bmQgPSByZWYgTm9uZSBpblxuICAgIHdoaWxlIE9wdGlvbi5pc19ub25lICF2YWx1ZV9mb3VuZCAmJiAhaSA8IGxlbmd0aCBkb1xuICAgICAgbGV0IHZhbHVlID0gdW5zYWZlX2dldCB0ICFpIGluXG4gICAgICB2YWx1ZV9mb3VuZCA6PSBmICFpIHZhbHVlO1xuICAgICAgaW5jciBpXG4gICAgZG9uZTtcbiAgICAhdmFsdWVfZm91bmQpXG47O1xuXG5sZXQgZmluZF9tYXBpX2V4biA9XG4gIGxldCBub3RfZm91bmQgPSBOb3RfZm91bmRfcyAoQXRvbSBcIkFycmF5LmZpbmRfbWFwaV9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgZmluZF9tYXBpX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kX21hcGkgdCB+ZiB3aXRoXG4gICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgIHwgU29tZSB4IC0+IHhcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICBmaW5kX21hcGlfZXhuXG47O1xuXG5sZXQgZmluZF9jb25zZWN1dGl2ZV9kdXBsaWNhdGUgdCB+ZXF1YWwgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGlmIG4gPD0gMVxuICB0aGVuIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IHJlc3VsdCA9IHJlZiBOb25lIGluXG4gICAgbGV0IGkgPSByZWYgMSBpblxuICAgIGxldCBwcmV2ID0gcmVmICh1bnNhZmVfZ2V0IHQgMCkgaW5cbiAgICB3aGlsZSAhaSA8IG4gZG9cbiAgICAgIGxldCBjdXIgPSB1bnNhZmVfZ2V0IHQgIWkgaW5cbiAgICAgIGlmIGVxdWFsIGN1ciAhcHJldlxuICAgICAgdGhlbiAoXG4gICAgICAgIHJlc3VsdCA6PSBTb21lICghcHJldiwgY3VyKTtcbiAgICAgICAgaSA6PSBuKVxuICAgICAgZWxzZSAoXG4gICAgICAgIHByZXYgOj0gY3VyO1xuICAgICAgICBpbmNyIGkpXG4gICAgZG9uZTtcbiAgICAhcmVzdWx0KVxuOztcblxubGV0IHJlZHVjZSB0IH5mID1cbiAgaWYgbGVuZ3RoIHQgPSAwXG4gIHRoZW4gTm9uZVxuICBlbHNlIChcbiAgICBsZXQgciA9IHJlZiAodW5zYWZlX2dldCB0IDApIGluXG4gICAgZm9yIGkgPSAxIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgICAgciA6PSBmICFyICh1bnNhZmVfZ2V0IHQgaSlcbiAgICBkb25lO1xuICAgIFNvbWUgIXIpXG47O1xuXG5sZXQgcmVkdWNlX2V4biB0IH5mID1cbiAgbWF0Y2ggcmVkdWNlIHQgfmYgd2l0aFxuICB8IE5vbmUgLT4gaW52YWxpZF9hcmcgXCJBcnJheS5yZWR1Y2VfZXhuXCJcbiAgfCBTb21lIHYgLT4gdlxuOztcblxubGV0IHBlcm11dGUgPSBBcnJheV9wZXJtdXRlLnBlcm11dGVcblxubGV0IHJhbmRvbV9lbGVtZW50X2V4biA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSB0ID1cbiAgaWYgaXNfZW1wdHkgdFxuICB0aGVuIGZhaWx3aXRoIFwiQXJyYXkucmFuZG9tX2VsZW1lbnRfZXhuOiBlbXB0eSBhcnJheVwiXG4gIGVsc2UgdC4oUmFuZG9tLlN0YXRlLmludCByYW5kb21fc3RhdGUgKGxlbmd0aCB0KSlcbjs7XG5cbmxldCByYW5kb21fZWxlbWVudCA/KHJhbmRvbV9zdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSB0ID1cbiAgdHJ5IFNvbWUgKHJhbmRvbV9lbGVtZW50X2V4biB+cmFuZG9tX3N0YXRlIHQpIHdpdGhcbiAgfCBfIC0+IE5vbmVcbjs7XG5cbmxldCB6aXAgdDEgdDIgPVxuICBpZiBsZW5ndGggdDEgPD4gbGVuZ3RoIHQyIHRoZW4gTm9uZSBlbHNlIFNvbWUgKG1hcDJfZXhuIHQxIHQyIH5mOihmdW4geDEgeDIgLT4geDEsIHgyKSlcbjs7XG5cbmxldCB6aXBfZXhuIHQxIHQyID1cbiAgaWYgbGVuZ3RoIHQxIDw+IGxlbmd0aCB0MlxuICB0aGVuIGZhaWx3aXRoIFwiQXJyYXkuemlwX2V4blwiXG4gIGVsc2UgbWFwMl9leG4gdDEgdDIgfmY6KGZ1biB4MSB4MiAtPiB4MSwgeDIpXG47O1xuXG5sZXQgdW56aXAgdCA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiBbfHxdLCBbfHxdXG4gIGVsc2UgKFxuICAgIGxldCB4LCB5ID0gdC4oMCkgaW5cbiAgICBsZXQgcmVzMSA9IGNyZWF0ZSB+bGVuOm4geCBpblxuICAgIGxldCByZXMyID0gY3JlYXRlIH5sZW46biB5IGluXG4gICAgZm9yIGkgPSAxIHRvIG4gLSAxIGRvXG4gICAgICBsZXQgeCwgeSA9IHQuKGkpIGluXG4gICAgICByZXMxLihpKSA8LSB4O1xuICAgICAgcmVzMi4oaSkgPC0geVxuICAgIGRvbmU7XG4gICAgcmVzMSwgcmVzMilcbjs7XG5cbmxldCBzb3J0ZWRfY29weSB0IH5jb21wYXJlID1cbiAgbGV0IHQxID0gY29weSB0IGluXG4gIHNvcnQgdDEgfmNvbXBhcmU7XG4gIHQxXG47O1xuXG5sZXQgcGFydGl0aW9uaV90ZiB0IH5mID1cbiAgbGV0IGJvdGggPSBtYXBpIHQgfmY6KGZ1biBpIHggLT4gaWYgZiBpIHggdGhlbiBFaXRoZXIuRmlyc3QgeCBlbHNlIEVpdGhlci5TZWNvbmQgeCkgaW5cbiAgbGV0IHRydWVzID1cbiAgICBmaWx0ZXJfbWFwIGJvdGggfmY6KGZ1bmN0aW9uXG4gICAgICB8IEZpcnN0IHggLT4gU29tZSB4XG4gICAgICB8IFNlY29uZCBfIC0+IE5vbmUpXG4gIGluXG4gIGxldCBmYWxzZXMgPVxuICAgIGZpbHRlcl9tYXAgYm90aCB+ZjooZnVuY3Rpb25cbiAgICAgIHwgRmlyc3QgXyAtPiBOb25lXG4gICAgICB8IFNlY29uZCB4IC0+IFNvbWUgeClcbiAgaW5cbiAgdHJ1ZXMsIGZhbHNlc1xuOztcblxubGV0IHBhcnRpdGlvbl90ZiB0IH5mID0gcGFydGl0aW9uaV90ZiB0IH5mOihmdW4gX2kgeCAtPiBmIHgpXG5sZXQgbGFzdCB0ID0gdC4obGVuZ3RoIHQgLSAxKVxuXG4oKiBDb252ZXJ0IHRvIGEgc2VxdWVuY2UgYnV0IGRvZXMgbm90IGF0dGVtcHQgdG8gcHJvdGVjdCBhZ2FpbnN0IG1vZGlmaWNhdGlvblxuICAgaW4gdGhlIGFycmF5LiAqKVxubGV0IHRvX3NlcXVlbmNlX211dGFibGUgdCA9XG4gIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0OjAgfmY6KGZ1biBpIC0+XG4gICAgaWYgaSA+PSBsZW5ndGggdCB0aGVuIFNlcXVlbmNlLlN0ZXAuRG9uZSBlbHNlIFNlcXVlbmNlLlN0ZXAuWWllbGQgKHQuKGkpLCBpICsgMSkpXG47O1xuXG5sZXQgdG9fc2VxdWVuY2UgdCA9IHRvX3NlcXVlbmNlX211dGFibGUgKGNvcHkgdClcblxubGV0IGNhcnRlc2lhbl9wcm9kdWN0IHQxIHQyID1cbiAgaWYgaXNfZW1wdHkgdDEgfHwgaXNfZW1wdHkgdDJcbiAgdGhlbiBbfHxdXG4gIGVsc2UgKFxuICAgIGxldCBuMSA9IGxlbmd0aCB0MSBpblxuICAgIGxldCBuMiA9IGxlbmd0aCB0MiBpblxuICAgIGxldCB0ID0gY3JlYXRlIH5sZW46KG4xICogbjIpICh0MS4oMCksIHQyLigwKSkgaW5cbiAgICBsZXQgciA9IHJlZiAwIGluXG4gICAgZm9yIGkxID0gMCB0byBuMSAtIDEgZG9cbiAgICAgIGZvciBpMiA9IDAgdG8gbjIgLSAxIGRvXG4gICAgICAgIHQuKCFyKSA8LSB0MS4oaTEpLCB0Mi4oaTIpO1xuICAgICAgICBpbmNyIHJcbiAgICAgIGRvbmVcbiAgICBkb25lO1xuICAgIHQpXG47O1xuXG5sZXQgdHJhbnNwb3NlIHR0ID1cbiAgaWYgbGVuZ3RoIHR0ID0gMFxuICB0aGVuIFNvbWUgW3x8XVxuICBlbHNlIChcbiAgICBsZXQgd2lkdGggPSBsZW5ndGggdHQgaW5cbiAgICBsZXQgZGVwdGggPSBsZW5ndGggdHQuKDApIGluXG4gICAgaWYgZXhpc3RzIHR0IH5mOihmdW4gdCAtPiBsZW5ndGggdCA8PiBkZXB0aClcbiAgICB0aGVuIE5vbmVcbiAgICBlbHNlIFNvbWUgKGluaXQgZGVwdGggfmY6KGZ1biBkIC0+IGluaXQgd2lkdGggfmY6KGZ1biB3IC0+IHR0Lih3KS4oZCkpKSkpXG47O1xuXG5sZXQgdHJhbnNwb3NlX2V4biB0dCA9XG4gIG1hdGNoIHRyYW5zcG9zZSB0dCB3aXRoXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZyBcIkFycmF5LnRyYW5zcG9zZV9leG5cIlxuICB8IFNvbWUgdHQnIC0+IHR0J1xuOztcblxuaW5jbHVkZSBCaW5hcnlfc2VhcmNoYWJsZS5NYWtlMSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBnZXQgPSBnZXRcbiAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gIGVuZClcblxuaW5jbHVkZSBCbGl0Lk1ha2UxIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuXG4gICAgbGV0IGNyZWF0ZV9saWtlIH5sZW4gdCA9XG4gICAgICBpZiBsZW4gPSAwXG4gICAgICB0aGVuIFt8fF1cbiAgICAgIGVsc2UgKFxuICAgICAgICBhc3NlcnQgKGxlbmd0aCB0ID4gMCk7XG4gICAgICAgIGNyZWF0ZSB+bGVuIHQuKDApKVxuICAgIDs7XG5cbiAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdFxuICBlbmQpXG5cbmxldCBpbnZhcmlhbnQgaW52YXJpYW50X2EgdCA9IGl0ZXIgdCB+ZjppbnZhcmlhbnRfYVxuXG5tb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICBtb2R1bGUgU29ydCA9IFNvcnRcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgSW50ID0gSW50MFxubW9kdWxlIFN0cmluZyA9IFN0cmluZzBcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxuXG4oKiBXZSBtYWludGFpbiB0aGUgcHJvcGVydHkgdGhhdCBhbGwgdmFsdWVzIG9mIHR5cGUgW3RdIGRvIG5vdCBoYXZlIHRoZSB0YWdcbiAgIFtkb3VibGVfYXJyYXlfdGFnXS4gIFNvbWUgZnVuY3Rpb25zIGJlbG93IGFzc3VtZSB0aGlzIGluIG9yZGVyIHRvIGF2b2lkIHRlc3RpbmcgdGhlXG4gICB0YWcsIGFuZCB3aWxsIHNlZ2ZhdWx0IGlmIHRoaXMgcHJvcGVydHkgZG9lc24ndCBob2xkLiAqKVxudHlwZSB0ID0gQ2FtbC5PYmoudCBhcnJheVxuXG5sZXQgaW52YXJpYW50IHQgPSBhc3NlcnQgKENhbWwuT2JqLnRhZyAoQ2FtbC5PYmoucmVwciB0KSA8PiBDYW1sLk9iai5kb3VibGVfYXJyYXlfdGFnKVxubGV0IGxlbmd0aCA9IEFycmF5Lmxlbmd0aCAoKiB3b3VsZCBjaGVjayBmb3IgZmxvYXQgYXJyYXlzIGluIDMyIGJpdCwgYnV0IHdoYXRldmVyICopXG5cbmxldCBzZXhwX29mX3QgdCA9XG4gIFNleHAuQXRvbVxuICAgIChTdHJpbmcuY29uY2F0IH5zZXA6XCJcIiBbIFwiPE9ial9hcnJheS50IG9mIGxlbmd0aCBcIjsgSW50LnRvX3N0cmluZyAobGVuZ3RoIHQpOyBcIj5cIiBdKVxuOztcblxubGV0IHplcm9fb2JqID0gQ2FtbC5PYmoucmVwciAoMCA6IGludClcblxuKCogV2UgY2FsbCBbQXJyYXkuY3JlYXRlXSB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgYSBmbG9hdCBzbyB0aGF0IHRoZSBhcnJheSBkb2Vzbid0IGdldFxuICAgdGFnZ2VkIHdpdGggW0RvdWJsZV9hcnJheV90YWddLiAqKVxubGV0IGNyZWF0ZV96ZXJvIH5sZW4gPSBBcnJheS5jcmVhdGUgfmxlbiB6ZXJvX29ialxubGV0IGVtcHR5ID0gW3x8XVxuXG50eXBlIG5vdF9hX2Zsb2F0ID1cbiAgfCBOb3RfYV9mbG9hdF8wXG4gIHwgTm90X2FfZmxvYXRfMSBvZiBpbnRcblxubGV0IF9ub3RfYV9mbG9hdF8wID0gTm90X2FfZmxvYXRfMFxubGV0IF9ub3RfYV9mbG9hdF8xID0gTm90X2FfZmxvYXRfMSA0MlxuXG5sZXQgZ2V0IHQgaSA9XG4gICgqIE1ha2UgdGhlIGNvbXBpbGVyIGJlbGlldmUgW3RdIGlzIGFuIGFycmF5IG5vdCBjb250YWluaW5nIGZsb2F0cyBzbyBpdCBkb2VzIG5vdCBjaGVja1xuICAgICBpZiBbdF0gaXMgdGFnZ2VkIHdpdGggW0RvdWJsZV9hcnJheV90YWddLiAgSXQgaXMgTk9UIG9rIHRvIHVzZSBbaW50IGFycmF5XSBzaW5jZSAoaWZcbiAgICAgdGhpcyBmdW5jdGlvbiBpcyBpbmxpbmVkIGFuZCB0aGUgYXJyYXkgY29udGFpbnMgaW4taGVhcCBib3hlZCB2YWx1ZXMpIHdyb25nIHJlZ2lzdGVyXG4gICAgIHR5cGluZyBtYXkgcmVzdWx0LCBsZWFkaW5nIHRvIGEgZmFpbHVyZSB0byByZWdpc3RlciBuZWNlc3NhcnkgR0Mgcm9vdHMuICopXG4gIENhbWwuT2JqLnJlcHIgKChDYW1sLk9iai5tYWdpYyAodCA6IHQpIDogbm90X2FfZmxvYXQgYXJyYXkpLihpKSA6IG5vdF9hX2Zsb2F0KVxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSB1bnNhZmVfZ2V0IHQgaSA9XG4gICgqIE1ha2UgdGhlIGNvbXBpbGVyIGJlbGlldmUgW3RdIGlzIGFuIGFycmF5IG5vdCBjb250YWluaW5nIGZsb2F0cyBzbyBpdCBkb2VzIG5vdCBjaGVja1xuICAgICBpZiBbdF0gaXMgdGFnZ2VkIHdpdGggW0RvdWJsZV9hcnJheV90YWddLiAqKVxuICBDYW1sLk9iai5yZXByXG4gICAgKEFycmF5LnVuc2FmZV9nZXQgKENhbWwuT2JqLm1hZ2ljICh0IDogdCkgOiBub3RfYV9mbG9hdCBhcnJheSkgaSA6IG5vdF9hX2Zsb2F0KVxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9iaiA9XG4gICgqIFNhbWUgY29tbWVudCBhcyBbdW5zYWZlX2dldF0uIFN5cy5vcGFxdWVfaWRlbnRpdHkgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb21cbiAgICAgcG90ZW50aWFsbHkgd3JvbmdseSBndWVzc2luZyB0aGUgdHlwZSBvZiB0aGUgYXJyYXkgYmFzZWQgb24gdGhlIHR5cGUgb2YgZWxlbWVudCwgdGhhdFxuICAgICBpcyBwcmV2ZW50IHRoZSBpbXBsaWNhdGlvbjogKE9iai50YWcgb2JqID0gT2JqLmRvdWJsZV90YWcpID0+IChPYmoudGFnIHQgPVxuICAgICBPYmouZG91YmxlX2FycmF5X3RhZykgd2hpY2ggZmxhbWJkYSBoYXMgdHJpZWQgaW4gdGhlIHBhc3QgKGF0IGxlYXN0IHRoYXQncyBhc3N1bWluZ1xuICAgICB0aGUgY29tcGlsZXIgcmVzcGVjdHMgU3lzLm9wYXF1ZV9pZGVudGl0eSwgd2hpY2ggaXMgbm90IGFsd2F5cyB0aGUgY2FzZSkuICopXG4gIEFycmF5LnVuc2FmZV9zZXRcbiAgICAoQ2FtbC5PYmoubWFnaWMgKHQgOiB0KSA6IG5vdF9hX2Zsb2F0IGFycmF5KVxuICAgIGlcbiAgICAoQ2FtbC5PYmoub2JqIChTeXMub3BhcXVlX2lkZW50aXR5IG9iaikgOiBub3RfYV9mbG9hdClcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9iaiA9XG4gICgqIHNhbWUgYXMgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IGJ1dCBzYWZlICopXG4gIChDYW1sLk9iai5tYWdpYyAodCA6IHQpIDogbm90X2FfZmxvYXQgYXJyYXkpLihpKVxuICA8LSAoQ2FtbC5PYmoub2JqIChTeXMub3BhcXVlX2lkZW50aXR5IG9iaikgOiBub3RfYV9mbG9hdClcbjs7XG5cbmxldFtAaW5saW5lIGFsd2F5c10gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgaW50ID1cbiAgKCogVGhpcyBza2lwcyBbY2FtbF9tb2RpZnldLCB3aGljaCBpcyBPSyBpZiBib3RoIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGludGVnZXJzLiAqKVxuICBBcnJheS51bnNhZmVfc2V0IChDYW1sLk9iai5tYWdpYyAodCA6IHQpIDogaW50IGFycmF5KSBpIChTeXMub3BhcXVlX2lkZW50aXR5IGludClcbjs7XG5cbigqIEZvciBbc2V0XSBhbmQgW3Vuc2FmZV9zZXRdLCBpZiBhIHBvaW50ZXIgaXMgaW52b2x2ZWQsIHdlIGZpcnN0IGRvIGEgcGh5c2ljYWwtZXF1YWxpdHlcbiAgIHRlc3QgdG8gc2VlIGlmIHRoZSBwb2ludGVyIGlzIGNoYW5naW5nLiAgSWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoZSBbc2V0XSwgd2hpY2hcbiAgIHNhdmVzIGEgY2FsbCB0byBbY2FtbF9tb2RpZnldLiAgV2UgdGhpbmsgdGhpcyBwaHlzaWNhbC1lcXVhbGl0eSB0ZXN0IGlzIHdvcnRoIGl0XG4gICBiZWNhdXNlIGl0IGlzIHZlcnkgY2hlYXAgKGJvdGggdmFsdWVzIGFyZSBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIHRoZSBbaXNfaW50XSB0ZXN0KVxuICAgYW5kIGJlY2F1c2UgW2NhbWxfbW9kaWZ5XSBpcyBleHBlbnNpdmUuICopXG5cbmxldCBzZXQgdCBpIG9iaiA9XG4gICgqIFdlIHVzZSBbZ2V0XSBmaXJzdCBidXQgdGhlbiB3ZSB1c2UgW0FycmF5LnVuc2FmZV9zZXRdIHNpbmNlIHdlIGtub3cgdGhhdCBbaV0gaXNcbiAgICAgdmFsaWQuICopXG4gIGxldCBvbGRfb2JqID0gZ2V0IHQgaSBpblxuICBpZiBDYW1sLk9iai5pc19pbnQgb2xkX29iaiAmJiBDYW1sLk9iai5pc19pbnQgb2JqXG4gIHRoZW4gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgKENhbWwuT2JqLm9iaiBvYmogOiBpbnQpXG4gIGVsc2UgaWYgbm90IChwaHlzX2VxdWFsIG9sZF9vYmogb2JqKVxuICB0aGVuIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgb2JqXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIHVuc2FmZV9zZXQgdCBpIG9iaiA9XG4gIGxldCBvbGRfb2JqID0gdW5zYWZlX2dldCB0IGkgaW5cbiAgaWYgQ2FtbC5PYmouaXNfaW50IG9sZF9vYmogJiYgQ2FtbC5PYmouaXNfaW50IG9ialxuICB0aGVuIHVuc2FmZV9zZXRfaW50X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgdCBpIChDYW1sLk9iai5vYmogb2JqIDogaW50KVxuICBlbHNlIGlmIG5vdCAocGh5c19lcXVhbCBvbGRfb2JqIG9iailcbiAgdGhlbiB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9ialxuOztcblxubGV0W0BpbmxpbmUgYWx3YXlzXSB1bnNhZmVfc2V0X29taXRfcGh5c19lcXVhbF9jaGVjayB0IGkgb2JqID1cbiAgbGV0IG9sZF9vYmogPSB1bnNhZmVfZ2V0IHQgaSBpblxuICBpZiBDYW1sLk9iai5pc19pbnQgb2xkX29iaiAmJiBDYW1sLk9iai5pc19pbnQgb2JqXG4gIHRoZW4gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgKENhbWwuT2JqLm9iaiBvYmogOiBpbnQpXG4gIGVsc2UgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSBvYmpcbjs7XG5cbmxldCBzd2FwIHQgaSBqID1cbiAgbGV0IGEgPSBnZXQgdCBpIGluXG4gIGxldCBiID0gZ2V0IHQgaiBpblxuICB1bnNhZmVfc2V0IHQgaSBiO1xuICB1bnNhZmVfc2V0IHQgaiBhXG47O1xuXG5sZXQgY3JlYXRlIH5sZW4geCA9XG4gICgqIElmIHdlIGNhbiwgdXNlIFtBcnJheS5jcmVhdGVdIGRpcmVjdGx5LiAqKVxuICBpZiBDYW1sLk9iai50YWcgeCA8PiBDYW1sLk9iai5kb3VibGVfdGFnXG4gIHRoZW4gQXJyYXkuY3JlYXRlIH5sZW4geFxuICBlbHNlIChcbiAgICAoKiBPdGhlcndpc2UgdXNlIFtjcmVhdGVfemVyb10gYW5kIHNldCB0aGUgY29udGVudHMgKilcbiAgICBsZXQgdCA9IGNyZWF0ZV96ZXJvIH5sZW4gaW5cbiAgICBsZXQgeCA9IFN5cy5vcGFxdWVfaWRlbnRpdHkgeCBpblxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIHhcbiAgICBkb25lO1xuICAgIHQpXG47O1xuXG5sZXQgc2luZ2xldG9uIG9iaiA9IGNyZWF0ZSB+bGVuOjEgb2JqXG5cbigqIFByZS1jb25kaXRpb246IHQuKGkpIGlzIGFuIGludGVnZXIuICopXG5sZXQgdW5zYWZlX3NldF9hc3N1bWluZ19jdXJyZW50bHlfaW50IHQgaSBvYmogPVxuICBpZiBDYW1sLk9iai5pc19pbnQgb2JqXG4gIHRoZW4gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgKENhbWwuT2JqLm9iaiBvYmogOiBpbnQpXG4gIGVsc2VcbiAgICAoKiBbdC4oaSldIGlzIGFuIGludGVnZXIgYW5kIFtvYmpdIGlzIG5vdCwgc28gd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sgaWYgdGhleSBhcmVcbiAgICAgICBlcXVhbC4gKilcbiAgICB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIG9ialxuOztcblxubGV0IHVuc2FmZV9zZXRfaW50IHQgaSBpbnQgPVxuICBsZXQgb2xkX29iaiA9IHVuc2FmZV9nZXQgdCBpIGluXG4gIGlmIENhbWwuT2JqLmlzX2ludCBvbGRfb2JqXG4gIHRoZW4gdW5zYWZlX3NldF9pbnRfYXNzdW1pbmdfY3VycmVudGx5X2ludCB0IGkgaW50XG4gIGVsc2UgdW5zYWZlX3NldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSAoQ2FtbC5PYmoucmVwciBpbnQpXG47O1xuXG5sZXQgdW5zYWZlX2NsZWFyX2lmX3BvaW50ZXIgdCBpID1cbiAgbGV0IG9sZF9vYmogPSB1bnNhZmVfZ2V0IHQgaSBpblxuICBpZiBub3QgKENhbWwuT2JqLmlzX2ludCBvbGRfb2JqKSB0aGVuIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSB0IGkgKENhbWwuT2JqLnJlcHIgMClcbjs7XG5cbigqKiBbdW5zYWZlX2JsaXRdIGlzIGxpa2UgW0FycmF5LmJsaXRdLCBleGNlcHQgaXQgdXNlcyBvdXIgb3duIGZvci1sb29wIHRvIGF2b2lkXG4gICAgY2FtbF9tb2RpZnkgd2hlbiBwb3NzaWJsZS4gIEl0cyBwZXJmb3JtYW5jZSBpcyBzdGlsbCBub3QgY29tcGFyYWJsZSB0byBhIG1lbWNweS4gKilcbmxldCB1bnNhZmVfYmxpdCB+c3JjIH5zcmNfcG9zIH5kc3QgfmRzdF9wb3MgfmxlbiA9XG4gICgqIFdoZW4gW3BoeXNfZXF1YWwgc3JjIGRzdF0sIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBbZHN0X3BvcyA8IHNyY19wb3NdIGFuZCBoYXZlIHRoZVxuICAgICBmb3IgbG9vcCBnbyBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uIHNvIHRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIGRhdGEgdGhhdCB3ZSBzdGlsbCBuZWVkXG4gICAgIHRvIHJlYWQuICBXaGVuIFtub3QgKHBoeXNfZXF1YWwgc3JjIGRzdCldLCBkb2luZyB0aGlzIGlzIGhhcm1sZXNzLiAgRnJvbSBhXG4gICAgIG1lbW9yeS1wZXJmb3JtYW5jZSBwZXJzcGVjdGl2ZSwgaXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciBvbmUgbG9vcHMgdXAgb3IgZG93bi5cbiAgICAgQ29uc3RhbnQtc3RyaWRlIGFjY2VzcywgZm9yd2FyZCBvciBiYWNrd2FyZCwgc2hvdWxkIGJlIGluZGlzdGluZ3Vpc2hhYmxlIChhdCBsZWFzdCBvblxuICAgICBhbiBpbnRlbCBpNykuICBTbywgd2UgZG9uJ3QgZG8gYSBjaGVjayBmb3IgW3BoeXNfZXF1YWwgc3JjIGRzdF0gYW5kIGFsd2F5cyBsb29wIHVwIGluXG4gICAgIHRoYXQgY2FzZS4gKilcbiAgaWYgZHN0X3BvcyA8IHNyY19wb3NcbiAgdGhlblxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICB1bnNhZmVfc2V0IGRzdCAoZHN0X3BvcyArIGkpICh1bnNhZmVfZ2V0IHNyYyAoc3JjX3BvcyArIGkpKVxuICAgIGRvbmVcbiAgZWxzZVxuICAgIGZvciBpID0gbGVuIC0gMSBkb3dudG8gMCBkb1xuICAgICAgdW5zYWZlX3NldCBkc3QgKGRzdF9wb3MgKyBpKSAodW5zYWZlX2dldCBzcmMgKHNyY19wb3MgKyBpKSlcbiAgICBkb25lXG47O1xuXG5pbmNsdWRlIEJsaXQuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCBjcmVhdGUgPSBjcmVhdGVfemVyb1xuICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICBsZXQgdW5zYWZlX2JsaXQgPSB1bnNhZmVfYmxpdFxuICBlbmQpXG5cbmxldCBjb3B5IHNyYyA9XG4gIGxldCBkc3QgPSBjcmVhdGVfemVybyB+bGVuOihsZW5ndGggc3JjKSBpblxuICBibGl0byB+c3JjIH5kc3QgKCk7XG4gIGRzdFxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiBXQVJOSU5HOlxuICAgV2UgdXNlIG5vbi1tZW1vcnktc2FmZSB0aGluZ3MgdGhyb3VnaG91dCB0aGUgW1RydXN0ZWRdIG1vZHVsZS5cbiAgIE1vc3Qgb2YgaXQgaXMgb25seSBzYWZlIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHR5cGUgc2lnbmF0dXJlIChlLmcuIGV4cG9zaW5nXG4gICBbdmFsIGNvcHkgOiAnYSB0IC0+ICdiIHRdIHdvdWxkIGJlIGEgYmlnIG1pc3Rha2UpLiAqKVxubW9kdWxlIFRydXN0ZWQgOiBzaWdcbiAgdHlwZSAnYSB0XG5cbiAgdmFsIGVtcHR5IDogJ2EgdFxuICB2YWwgdW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIDogbGVuOmludCAtPiAnYSB0XG4gIHZhbCBjcmVhdGVfb2JqX2FycmF5IDogbGVuOmludCAtPiAnYSB0XG4gIHZhbCBjcmVhdGUgOiBsZW46aW50IC0+ICdhIC0+ICdhIHRcbiAgdmFsIHNpbmdsZXRvbiA6ICdhIC0+ICdhIHRcbiAgdmFsIGdldCA6ICdhIHQgLT4gaW50IC0+ICdhXG4gIHZhbCBzZXQgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCBzd2FwIDogXyB0IC0+IGludCAtPiBpbnQgLT4gdW5pdFxuICB2YWwgdW5zYWZlX2dldCA6ICdhIHQgLT4gaW50IC0+ICdhXG4gIHZhbCB1bnNhZmVfc2V0IDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgdW5zYWZlX3NldF9vbWl0X3BoeXNfZXF1YWxfY2hlY2sgOiAnYSB0IC0+IGludCAtPiAnYSAtPiB1bml0XG4gIHZhbCB1bnNhZmVfc2V0X2ludCA6ICdhIHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4gIHZhbCB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IDogJ2EgdCAtPiBpbnQgLT4gaW50IC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9zZXRfYXNzdW1pbmdfY3VycmVudGx5X2ludCA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHVuc2FmZV9zZXRfd2l0aF9jYW1sX21vZGlmeSA6ICdhIHQgLT4gaW50IC0+ICdhIC0+IHVuaXRcbiAgdmFsIHNldF93aXRoX2NhbWxfbW9kaWZ5IDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuICB2YWwgbGVuZ3RoIDogJ2EgdCAtPiBpbnRcbiAgdmFsIHVuc2FmZV9ibGl0IDogKCdhIHQsICdhIHQpIEJsaXQuYmxpdFxuICB2YWwgY29weSA6ICdhIHQgLT4gJ2EgdFxuICB2YWwgdW5zYWZlX2NsZWFyX2lmX3BvaW50ZXIgOiBfIHQgLT4gaW50IC0+IHVuaXRcbmVuZCA9IHN0cnVjdFxuICB0eXBlICdhIHQgPSBPYmpfYXJyYXkudFxuXG4gIGxldCBlbXB0eSA9IE9ial9hcnJheS5lbXB0eVxuICBsZXQgdW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIH5sZW4gPSBPYmpfYXJyYXkuY3JlYXRlX3plcm8gfmxlblxuICBsZXQgY3JlYXRlX29ial9hcnJheSB+bGVuID0gT2JqX2FycmF5LmNyZWF0ZV96ZXJvIH5sZW5cbiAgbGV0IGNyZWF0ZSB+bGVuIHggPSBPYmpfYXJyYXkuY3JlYXRlIH5sZW4gKENhbWwuT2JqLnJlcHIgeClcbiAgbGV0IHNpbmdsZXRvbiB4ID0gT2JqX2FycmF5LnNpbmdsZXRvbiAoQ2FtbC5PYmoucmVwciB4KVxuICBsZXQgc3dhcCB0IGkgaiA9IE9ial9hcnJheS5zd2FwIHQgaSBqXG4gIGxldCBnZXQgYXJyIGkgPSBDYW1sLk9iai5vYmogKE9ial9hcnJheS5nZXQgYXJyIGkpXG4gIGxldCBzZXQgYXJyIGkgeCA9IE9ial9hcnJheS5zZXQgYXJyIGkgKENhbWwuT2JqLnJlcHIgeClcbiAgbGV0IHVuc2FmZV9nZXQgYXJyIGkgPSBDYW1sLk9iai5vYmogKE9ial9hcnJheS51bnNhZmVfZ2V0IGFyciBpKVxuICBsZXQgdW5zYWZlX3NldCBhcnIgaSB4ID0gT2JqX2FycmF5LnVuc2FmZV9zZXQgYXJyIGkgKENhbWwuT2JqLnJlcHIgeClcbiAgbGV0IHVuc2FmZV9zZXRfaW50IGFyciBpIHggPSBPYmpfYXJyYXkudW5zYWZlX3NldF9pbnQgYXJyIGkgeFxuXG4gIGxldCB1bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IGFyciBpIHggPVxuICAgIE9ial9hcnJheS51bnNhZmVfc2V0X2ludF9hc3N1bWluZ19jdXJyZW50bHlfaW50IGFyciBpIHhcbiAgOztcblxuICBsZXQgdW5zYWZlX3NldF9hc3N1bWluZ19jdXJyZW50bHlfaW50IGFyciBpIHggPVxuICAgIE9ial9hcnJheS51bnNhZmVfc2V0X2Fzc3VtaW5nX2N1cnJlbnRseV9pbnQgYXJyIGkgKENhbWwuT2JqLnJlcHIgeClcbiAgOztcblxuICBsZXQgbGVuZ3RoID0gT2JqX2FycmF5Lmxlbmd0aFxuICBsZXQgdW5zYWZlX2JsaXQgPSBPYmpfYXJyYXkudW5zYWZlX2JsaXRcbiAgbGV0IGNvcHkgPSBPYmpfYXJyYXkuY29weVxuXG4gIGxldCB1bnNhZmVfc2V0X29taXRfcGh5c19lcXVhbF9jaGVjayB0IGkgeCA9XG4gICAgT2JqX2FycmF5LnVuc2FmZV9zZXRfb21pdF9waHlzX2VxdWFsX2NoZWNrIHQgaSAoQ2FtbC5PYmoucmVwciB4KVxuICA7O1xuXG4gIGxldCB1bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIHggPVxuICAgIE9ial9hcnJheS51bnNhZmVfc2V0X3dpdGhfY2FtbF9tb2RpZnkgdCBpIChDYW1sLk9iai5yZXByIHgpXG4gIDs7XG5cbiAgbGV0IHNldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSB4ID0gT2JqX2FycmF5LnNldF93aXRoX2NhbWxfbW9kaWZ5IHQgaSAoQ2FtbC5PYmoucmVwciB4KVxuICBsZXQgdW5zYWZlX2NsZWFyX2lmX3BvaW50ZXIgPSBPYmpfYXJyYXkudW5zYWZlX2NsZWFyX2lmX3BvaW50ZXJcbmVuZFxuXG5pbmNsdWRlIFRydXN0ZWRcblxubGV0IGludmFyaWFudCB0ID0gYXNzZXJ0IChDYW1sLk9iai50YWcgKENhbWwuT2JqLnJlcHIgdCkgPD4gQ2FtbC5PYmouZG91YmxlX2FycmF5X3RhZylcblxubGV0IGluaXQgbCB+ZiA9XG4gIGlmIGwgPCAwXG4gIHRoZW4gaW52YWxpZF9hcmcgXCJVbmlmb3JtX2FycmF5LmluaXRcIlxuICBlbHNlIChcbiAgICBsZXQgcmVzID0gdW5zYWZlX2NyZWF0ZV91bmluaXRpYWxpemVkIH5sZW46bCBpblxuICAgIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgICAgdW5zYWZlX3NldCByZXMgaSAoZiBpKVxuICAgIGRvbmU7XG4gICAgcmVzKVxuOztcblxubGV0IG9mX2FycmF5IGFyciA9IGluaXQgfmY6KEFycmF5LnVuc2FmZV9nZXQgYXJyKSAoQXJyYXkubGVuZ3RoIGFycilcbmxldCBtYXAgYSB+ZiA9IGluaXQgfmY6KGZ1biBpIC0+IGYgKHVuc2FmZV9nZXQgYSBpKSkgKGxlbmd0aCBhKVxubGV0IG1hcGkgYSB+ZiA9IGluaXQgfmY6KGZ1biBpIC0+IGYgaSAodW5zYWZlX2dldCBhIGkpKSAobGVuZ3RoIGEpXG5cbmxldCBpdGVyIGEgfmYgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIGEgLSAxIGRvXG4gICAgZiAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmVcbjs7XG5cbmxldCBpdGVyaSBhIH5mID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBhIC0gMSBkb1xuICAgIGYgaSAodW5zYWZlX2dldCBhIGkpXG4gIGRvbmVcbjs7XG5cbmxldCBmb2xkaSBhIH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGZvciBpID0gMCB0byBsZW5ndGggYSAtIDEgZG9cbiAgICBhY2MgOj0gZiBpICFhY2MgKHVuc2FmZV9nZXQgYSBpKVxuICBkb25lO1xuICAhYWNjXG47O1xuXG5sZXQgdG9fbGlzdCB0ID0gTGlzdC5pbml0IH5mOihnZXQgdCkgKGxlbmd0aCB0KVxuXG5sZXQgb2ZfbGlzdCBsID1cbiAgbGV0IGxlbiA9IExpc3QubGVuZ3RoIGwgaW5cbiAgbGV0IHJlcyA9IHVuc2FmZV9jcmVhdGVfdW5pbml0aWFsaXplZCB+bGVuIGluXG4gIExpc3QuaXRlcmkgbCB+ZjooZnVuIGkgeCAtPiBzZXQgcmVzIGkgeCk7XG4gIHJlc1xuOztcblxuKCogSXQgaXMgbm90IHNhZmUgZm9yIFt0b19hcnJheV0gdG8gYmUgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGJlY2F1c2Ugd2UgaGF2ZSBjb2RlIHRoYXRcbiAgIHJlbGllcyBvbiBbZmxvYXQgYXJyYXldcyBiZWluZyB1bmJveGVkLCBmb3IgZXhhbXBsZSBpbiBbYmluX3dyaXRlX2FycmF5XS4gKilcbmxldCB0b19hcnJheSB0ID0gQXJyYXkuaW5pdCAobGVuZ3RoIHQpIH5mOihmdW4gaSAtPiB1bnNhZmVfZ2V0IHQgaSlcblxubGV0IGV4aXN0cyB0IH5mID1cbiAgbGV0IHJlYyBsb29wIHQgfmYgaSA9XG4gICAgaWYgaSA8IDAgdGhlbiBmYWxzZSBlbHNlIGYgKHVuc2FmZV9nZXQgdCBpKSB8fCBsb29wIHQgfmYgKGkgLSAxKVxuICBpblxuICBsb29wIHQgfmYgKGxlbmd0aCB0IC0gMSlcbjs7XG5cbmxldCBmb3JfYWxsIHQgfmYgPVxuICBsZXQgcmVjIGxvb3AgdCB+ZiBpID0gaWYgaSA8IDAgdGhlbiB0cnVlIGVsc2UgZiAodW5zYWZlX2dldCB0IGkpICYmIGxvb3AgdCB+ZiAoaSAtIDEpIGluXG4gIGxvb3AgdCB+ZiAobGVuZ3RoIHQgLSAxKVxuOztcblxubGV0IG1hcDJfZXhuIHQxIHQyIH5mID1cbiAgbGV0IGxlbiA9IGxlbmd0aCB0MSBpblxuICBpZiBsZW5ndGggdDIgPD4gbGVuIHRoZW4gaW52YWxpZF9hcmcgXCJBcnJheS5tYXAyX2V4blwiO1xuICBpbml0IGxlbiB+ZjooZnVuIGkgLT4gZiAodW5zYWZlX2dldCB0MSBpKSAodW5zYWZlX2dldCB0MiBpKSlcbjs7XG5cbmxldCB0X3NleHBfZ3JhbW1hciAodHlwZSBlbHQpIChncmFtbWFyIDogZWx0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IGVsdCB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSAoQXJyYXkudF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbjs7XG5cbmluY2x1ZGVcbiAgU2V4cGFibGUuT2Zfc2V4cGFibGUxXG4gICAgKEFycmF5KVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICdhIHQgPSAnYSB0XG5cbiAgICAgIGxldCB0b19zZXhwYWJsZSA9IHRvX2FycmF5XG4gICAgICBsZXQgb2Zfc2V4cGFibGUgPSBvZl9hcnJheVxuICAgIGVuZClcblxuaW5jbHVkZSBCbGl0Lk1ha2UxIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuXG4gICAgbGV0IGNyZWF0ZV9saWtlIH5sZW4gdCA9XG4gICAgICBpZiBsZW4gPSAwXG4gICAgICB0aGVuIGVtcHR5XG4gICAgICBlbHNlIChcbiAgICAgICAgYXNzZXJ0IChsZW5ndGggdCA+IDApO1xuICAgICAgICBjcmVhdGUgfmxlbiAoZ2V0IHQgMCkpXG4gICAgOztcblxuICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0XG4gIGVuZClcblxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIGxldCByID0gcmVmIGluaXQgaW5cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIHIgOj0gZiAhciAodW5zYWZlX2dldCB0IGkpXG4gIGRvbmU7XG4gICFyXG47O1xuXG5sZXQgbWluX2VsdCB0IH5jb21wYXJlID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdCB+Y29tcGFyZVxubGV0IG1heF9lbHQgdCB+Y29tcGFyZSA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHQgfmNvbXBhcmVcblxuKCogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHB4X2NvbXBhcmUgW2NvbXBhcmVfYXJyYXldIGJ1dCB1c2VzIG91ciBbdW5zYWZlX2dldF0gYW5kIFtsZW5ndGhdLiAqKVxubGV0IGNvbXBhcmUgY29tcGFyZV9lbHQgYSBiID1cbiAgaWYgcGh5c19lcXVhbCBhIGJcbiAgdGhlbiAwXG4gIGVsc2UgKFxuICAgIGxldCBsZW5fYSA9IGxlbmd0aCBhIGluXG4gICAgbGV0IGxlbl9iID0gbGVuZ3RoIGIgaW5cbiAgICBsZXQgcmV0ID0gY29tcGFyZSBsZW5fYSBsZW5fYiBpblxuICAgIGlmIHJldCA8PiAwXG4gICAgdGhlbiByZXRcbiAgICBlbHNlIChcbiAgICAgIGxldCByZWMgbG9vcCBpID1cbiAgICAgICAgaWYgaSA9IGxlbl9hXG4gICAgICAgIHRoZW4gMFxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgbCA9IHVuc2FmZV9nZXQgYSBpXG4gICAgICAgICAgYW5kIHIgPSB1bnNhZmVfZ2V0IGIgaSBpblxuICAgICAgICAgIGxldCByZXMgPSBjb21wYXJlX2VsdCBsIHIgaW5cbiAgICAgICAgICBpZiByZXMgPD4gMCB0aGVuIHJlcyBlbHNlIGxvb3AgKGkgKyAxKSlcbiAgICAgIGluXG4gICAgICBsb29wIDApKVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGNlaWwgPSBDYW1sLmNlaWxcbmxldCBmbG9vciA9IENhbWwuZmxvb3JcbmxldCBtb2RfZmxvYXQgPSBDYW1sLm1vZF9mbG9hdFxubGV0IG1vZGYgPSBDYW1sLm1vZGZcbmxldCBmbG9hdF9vZl9zdHJpbmcgPSBDYW1sLmZsb2F0X29mX3N0cmluZ1xubGV0IG5hbiA9IENhbWwubmFuXG5sZXQgaW5maW5pdHkgPSBDYW1sLmluZmluaXR5XG5sZXQgbmVnX2luZmluaXR5ID0gQ2FtbC5uZWdfaW5maW5pdHlcbmxldCBtYXhfZmluaXRlX3ZhbHVlID0gQ2FtbC5tYXhfZmxvYXRcbmxldCBlcHNpbG9uX2Zsb2F0ID0gQ2FtbC5lcHNpbG9uX2Zsb2F0XG5sZXQgY2xhc3NpZnlfZmxvYXQgPSBDYW1sLmNsYXNzaWZ5X2Zsb2F0XG5sZXQgYWJzX2Zsb2F0ID0gQ2FtbC5hYnNfZmxvYXRcbmxldCBpc19pbnRlZ2VyID0gQ2FtbC5GbG9hdC5pc19pbnRlZ2VyXG5sZXQgKCAqKiApID0gQ2FtbC4oICoqIClcblxubGV0ICggJS4gKSBhIGIgPVxuICAoKiBSYWlzZSBpbiBjYXNlIG9mIGEgbmVnYXRpdmUgbW9kdWx1cywgYXMgZG9lcyBJbnQuKCAlICkuICopXG4gIGlmIGIgPCAwLlxuICB0aGVuIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCIlZiAlJSAlZiBpbiBmbG9hdDAubWw6IG1vZHVsdXMgc2hvdWxkIGJlIHBvc2l0aXZlXCIgYSBiICgpO1xuICBsZXQgbSA9IENhbWwubW9kX2Zsb2F0IGEgYiBpblxuICAoKiBQcm9kdWNlIGEgbm9uLW5lZ2F0aXZlIHJlc3VsdCBpbiBhbmFsb2d5IHdpdGggSW50LiggJSApLiAqKVxuICBpZiBtIDwgMC4gdGhlbiBtICsuIGIgZWxzZSBtXG47O1xuXG4oKiBUaGUgYml0cyBvZiBJTlJJQSdzIFtQZXJ2YXNpdmVzXSB0aGF0IHdlIGp1c3Qgd2FudCB0byBleHBvc2UgaW4gW0Zsb2F0XS4gTW9zdCBhcmVcbiAgIGFscmVhZHkgZGVwcmVjYXRlZCBpbiBbUGVydmFzaXZlc10sIGFuZCBldmVudHVhbGx5IGFsbCBvZiB0aGVtIHNob3VsZCBiZS4gKilcbmluY2x1ZGUgKFxuICBDYW1sIDpcbiAgc2lnXG4gICAgZXh0ZXJuYWwgZnJleHAgOiBmbG9hdCAtPiBmbG9hdCAqIGludCA9IFwiY2FtbF9mcmV4cF9mbG9hdFwiXG5cbiAgICBleHRlcm5hbCBsZGV4cFxuICAgICAgOiAgKGZsb2F0W0B1bmJveGVkXSlcbiAgICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICAgIC0+IChmbG9hdFtAdW5ib3hlZF0pXG4gICAgICA9IFwiY2FtbF9sZGV4cF9mbG9hdFwiIFwiY2FtbF9sZGV4cF9mbG9hdF91bmJveGVkXCJcbiAgICBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgbG9nMTAgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9sb2cxMF9mbG9hdFwiIFwibG9nMTBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgZXhwbTEgOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9leHBtMV9mbG9hdFwiIFwiY2FtbF9leHBtMVwiXG4gICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGxvZzFwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfbG9nMXBfZmxvYXRcIiBcImNhbWxfbG9nMXBcIlxuICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBjb3B5c2lnbiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2NvcHlzaWduX2Zsb2F0XCIgXCJjYW1sX2NvcHlzaWduXCJcbiAgICBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuXG4gICAgZXh0ZXJuYWwgY29zIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zX2Zsb2F0XCIgXCJjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIHNpbiA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3Npbl9mbG9hdFwiIFwic2luXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCB0YW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5fZmxvYXRcIiBcInRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgYWNvcyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2Fjb3NfZmxvYXRcIiBcImFjb3NcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIGFzaW4gOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF9hc2luX2Zsb2F0XCIgXCJhc2luXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBhdGFuIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfYXRhbl9mbG9hdFwiIFwiYXRhblwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBhdGFuMiA6IGZsb2F0IC0+IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2F0YW4yX2Zsb2F0XCIgXCJhdGFuMlwiXG4gICAgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cblxuICAgIGV4dGVybmFsIGh5cG90IDogZmxvYXQgLT4gZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfaHlwb3RfZmxvYXRcIiBcImNhbWxfaHlwb3RcIlxuICAgIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG5cbiAgICBleHRlcm5hbCBjb3NoIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfY29zaF9mbG9hdFwiIFwiY29zaFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgc2luaCA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX3NpbmhfZmxvYXRcIiBcInNpbmhcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIHRhbmggOiBmbG9hdCAtPiBmbG9hdCA9IFwiY2FtbF90YW5oX2Zsb2F0XCIgXCJ0YW5oXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgICBleHRlcm5hbCBzcXJ0IDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfc3FydF9mbG9hdFwiIFwic3FydFwiIFtAQHVuYm94ZWRdIFtAQG5vYWxsb2NdXG4gICAgZXh0ZXJuYWwgZXhwIDogZmxvYXQgLT4gZmxvYXQgPSBcImNhbWxfZXhwX2Zsb2F0XCIgXCJleHBcIiBbQEB1bmJveGVkXSBbQEBub2FsbG9jXVxuICAgIGV4dGVybmFsIGxvZyA6IGZsb2F0IC0+IGZsb2F0ID0gXCJjYW1sX2xvZ19mbG9hdFwiIFwibG9nXCIgW0BAdW5ib3hlZF0gW0BAbm9hbGxvY11cbiAgZW5kKVxuXG4oKiBXZSBuZWVkIHRoaXMgaW5kaXJlY3Rpb24gYmVjYXVzZSB0aGVzZSBhcmUgZXhwb3NlZCBhcyBcInZhbFwiIGluc3RlYWQgb2YgXCJleHRlcm5hbFwiICopXG5sZXQgZnJleHAgPSBmcmV4cFxubGV0IGxkZXhwID0gbGRleHBcbmxldCBpc19uYW4geCA9ICh4IDogZmxvYXQpIDw+IHhcblxuKCogQW4gb3JkZXItcHJlc2VydmluZyBiaWplY3Rpb24gYmV0d2VlbiBhbGwgZmxvYXRzIGV4Y2VwdCBmb3IgTmFOcywgYW5kIDk5Ljk1JSBvZlxuICAgaW50NjRzLlxuXG4gICBOb3RlIHdlIGRvbid0IGRpc3Rpbmd1aXNoIDAuIGFuZCAtMC4gYXMgc2VwYXJhdGUgdmFsdWVzIGhlcmUsIHRoZXkgYm90aCBtYXAgdG8gMEwsIHdoaWNoXG4gICBtYXBzIGJhY2sgdG8gMC5cblxuICAgVGhpcyBzaG91bGQgd29yayBib3RoIG9uIGxpdHRsZS1lbmRpYW4gYW5kIGhpZ2gtZW5kaWFuIENQVXMuICBXaWtpcGVkaWEgc2F5czogXCJvblxuICAgbW9kZXJuIHN0YW5kYXJkIGNvbXB1dGVycyAoaS5lLiwgaW1wbGVtZW50aW5nIElFRUUgNzU0KSwgb25lIG1heSBpbiBwcmFjdGljZSBzYWZlbHlcbiAgIGFzc3VtZSB0aGF0IHRoZSBlbmRpYW5uZXNzIGlzIHRoZSBzYW1lIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFzIGZvciBpbnRlZ2Vyc1wiXG4gICAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbmRpYW5uZXNzI0Zsb2F0aW5nLXBvaW50X2FuZF9lbmRpYW5uZXNzKS5cbiopXG5sZXQgdG9faW50NjRfcHJlc2VydmVfb3JkZXIgdCA9XG4gIGlmIGlzX25hbiB0XG4gIHRoZW4gTm9uZVxuICBlbHNlIGlmIHQgPSAwLlxuICB0aGVuICgqIGFsc28gaW5jbHVkZXMgLTAuICopXG4gICAgU29tZSAwTFxuICBlbHNlIGlmIHQgPiAwLlxuICB0aGVuIFNvbWUgKENhbWwuSW50NjQuYml0c19vZl9mbG9hdCB0KVxuICBlbHNlIFNvbWUgKENhbWwuSW50NjQubmVnIChDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgKC0udCkpKVxuOztcblxubGV0IHRvX2ludDY0X3ByZXNlcnZlX29yZGVyX2V4biB4ID0gT3B0aW9uLnZhbHVlX2V4biAodG9faW50NjRfcHJlc2VydmVfb3JkZXIgeClcblxubGV0IG9mX2ludDY0X3ByZXNlcnZlX29yZGVyIHggPVxuICBpZiBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIHggMExcbiAgdGhlbiBDYW1sLkludDY0LmZsb2F0X29mX2JpdHMgeFxuICBlbHNlIH4tLihDYW1sLkludDY0LmZsb2F0X29mX2JpdHMgKENhbWwuSW50NjQubmVnIHgpKVxuOztcblxubGV0IG9uZV91bHAgZGlyIHQgPVxuICBtYXRjaCB0b19pbnQ2NF9wcmVzZXJ2ZV9vcmRlciB0IHdpdGhcbiAgfCBOb25lIC0+IENhbWwubmFuXG4gIHwgU29tZSB4IC0+XG4gICAgb2ZfaW50NjRfcHJlc2VydmVfb3JkZXJcbiAgICAgIChDYW1sLkludDY0LmFkZFxuICAgICAgICAgeFxuICAgICAgICAgKG1hdGNoIGRpciB3aXRoXG4gICAgICAgICAgfCBgVXAgLT4gMUxcbiAgICAgICAgICB8IGBEb3duIC0+IC0xTCkpXG47O1xuXG4oKiBbdXBwZXJfYm91bmRfZm9yX2ludF0gYW5kIFtsb3dlcl9ib3VuZF9mb3JfaW50XSBhcmUgZm9yIGNhbGN1bGF0aW5nIHRoZSBtYXgvbWluIGZsb2F0XG4gICB0aGF0IGZpdHMgaW4gYSBnaXZlbi1zaXplIGludGVnZXIgd2hlbiByb3VuZGVkIHRvd2FyZHMgMCAodXNpbmcgW2ludF9vZl9mbG9hdF0pLlxuXG4gICBtYXhfaW50L21pbl9pbnQgZGVwZW5kIG9uIFtudW1fYml0c10sIGUuZy4gKy8tIDJeMzAsICsvLSAyXjYyIGlmIDMxLWJpdCwgNjMtYml0XG4gICAocmVzcGVjdGl2ZWx5KSB3aGlsZSBmbG9hdCBpcyBJRUVFIHN0YW5kYXJkIGZvciBkb3VibGUgKDUyIHNpZ25pZmljYW50IGJpdHMpLlxuXG4gICBJbiBhbGwgY2FzZXMsIHdlIHdhbnQgdG8gZ3VhcmFudGVlIHRoYXRcbiAgIFtsb3dlcl9ib3VuZF9mb3JfaW50IDw9IHggPD0gdXBwZXJfYm91bmRfZm9yX2ludF1cbiAgIGlmZiBbaW50X29mX2Zsb2F0IHhdIGZpdHMgaW4gYW4gaW50IHdpdGggW251bV9iaXRzXSBiaXRzLlxuXG4gICBbMiAqKiAobnVtX2JpdHMgLSAxKV0gaXMgdGhlIGZpcnN0IGZsb2F0IGdyZWF0ZXIgdGhhdCBtYXhfaW50LCB3ZSB1c2UgdGhlIHByZWNlZGluZ1xuICAgZmxvYXQgYXMgdXBwZXIgYm91bmQuXG5cbiAgIFstICgyICoqIChudW1fYml0cyAtIDEpKV0gaXMgZXF1YWwgdG8gbWluX2ludC5cbiAgIEZvciBsb3dlciBib3VuZCB3ZSBsb29rIGZvciB0aGUgc21hbGxlc3QgZmxvYXQgW2ZdIHNhdGlzZnlpbmcgW2YgPiBtaW5faW50IC0gMV0gc28gdGhhdFxuICAgW2ZdIHJvdW5kcyB0b3dhcmQgemVybyB0byBbbWluX2ludF1cblxuICAgU28gaW4gcGFydGljdWxhciB3ZSB3aWxsIGhhdmU6XG4gICBbbG93ZXJfYm91bmRfZm9yX2ludCB4IDw9IC0gKDIgKiogKDEteCkpXVxuICAgW3VwcGVyX2JvdW5kX2Zvcl9pbnQgeCAgPCAgICAyICoqICgxLXgpIF1cbiopXG5sZXQgdXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0cyA9XG4gIGxldCBleHAgPSBDYW1sLmZsb2F0X29mX2ludCAobnVtX2JpdHMgLSAxKSBpblxuICBvbmVfdWxwIGBEb3duICgyLiAqKiBleHApXG47O1xuXG5sZXQgaXNfeF9taW51c19vbmVfZXhhY3QgeCA9XG4gICgqIFt4ID0geCAtLiAxLl0gZG9lcyBub3Qgd29yayB3aXRoIHg4NyBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGJhY2tlbmQgKHdoaWNoIGlzIHVzZWRcbiAgICAgb24gMzItYml0IG9jYW1sKSBiZWNhdXNlIG9mIDgwLWJpdCByZWdpc3RlciBwcmVjaXNpb24gb2YgaW50ZXJtZWRpYXRlIGNvbXB1dGF0aW9ucy5cblxuICAgICBBbiBhbHRlcm5hdGl2ZSB3YXkgb2YgY29tcHV0aW5nIHRoaXM6IFt4IC0uIG9uZV91bHAgYERvd24geCA8PSAxLl0gaXMgYWxzbyBwcm9uZSB0b1xuICAgICB0aGUgc2FtZSBwcmVjaXNpb24gaXNzdWVzOiB5b3UgbmVlZCB0byBtYWtlIHN1cmUgW3hdIGlzIDY0LWJpdC5cbiAgKilcbiAgbGV0IG9wZW4gSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gIG5vdCAoQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0IHggPSBDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgKHggLS4gMS4pKVxuOztcblxubGV0IGxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHMgPVxuICBsZXQgZXhwID0gQ2FtbC5mbG9hdF9vZl9pbnQgKG51bV9iaXRzIC0gMSkgaW5cbiAgbGV0IG1pbl9pbnRfYXNfZmxvYXQgPSB+LS4oMi4gKiogZXhwKSBpblxuICBsZXQgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gIGlmIG51bV9iaXRzIC0gMSA8IDUzICgqIDUzID0gI2JpdHMgaW4gdGhlIGZsb2F0J3MgbWFudGlzc2Egd2l0aCBzaWduIGluY2x1ZGVkICopXG4gIHRoZW4gKFxuICAgICgqIFRoZSBzbWFsbGVzdCBmbG9hdCB0aGF0IHJvdW5kcyB0b3dhcmRzIHplcm8gdG8gW21pbl9pbnRdIGlzXG4gICAgICAgW21pbl9pbnQgLSAxICsgZXBzaWxvbl0gKilcbiAgICBhc3NlcnQgKGlzX3hfbWludXNfb25lX2V4YWN0IG1pbl9pbnRfYXNfZmxvYXQpO1xuICAgIG9uZV91bHAgYFVwIChtaW5faW50X2FzX2Zsb2F0IC0uIDEuKSlcbiAgZWxzZSAoXG4gICAgKCogW21pbl9pbnRfYXNfZmxvYXRdIGlzIGFscmVhZHkgdGhlIHNtYWxsZXN0IGZsb2F0IFtmXSBzYXRpc2Z5aW5nIFtmID4gbWluX2ludCAtIDFdLiAqKVxuICAgIGFzc2VydCAobm90IChpc194X21pbnVzX29uZV9leGFjdCBtaW5faW50X2FzX2Zsb2F0KSk7XG4gICAgbWluX2ludF9hc19mbG9hdClcbjs7XG5cbigqIEZsb2F0IGNsYW1waW5nIGlzIHN0cnVjdHVyZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdGhhbiBjbGFtcGluZyBmb3Igb3RoZXIgdHlwZXMsIHNvXG4gICB0aGF0IHdlIGdldCB0aGUgYmVoYXZpb3Igb2YgW2NsYW1wX3VuY2hlY2tlZCBuYW4gfm1pbiB+bWF4ID0gbmFuXSAoZm9yIGFueSBbbWluXSBhbmRcbiAgIFttYXhdKSBmb3IgZnJlZS5cbiopXG5sZXQgY2xhbXBfdW5jaGVja2VkICh0IDogZmxvYXQpIH5taW4gfm1heCA9XG4gIGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiBtYXggPCB0IHRoZW4gbWF4IGVsc2UgdFxuOztcblxubGV0IGJveCA9XG4gICgqIFByZXZlbnQgcG90ZW50aWFsIGNvbnN0YW50IGZvbGRpbmcgb2YgWysuIDAuXSBpbiB0aGUgbmVhciBvY2FtbG9wdCBmdXR1cmUuICopXG4gIGxldCB4ID0gU3lzMC5vcGFxdWVfaWRlbnRpdHkgMC4gaW5cbiAgZnVuIGYgLT4gZiArLiB4XG47O1xuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcbm1vZHVsZSBBcnJheSA9IEFycmF5MFxubW9kdWxlIFN0cmluZyA9IFN0cmluZzBcbmluY2x1ZGUgQ2hhcjBcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gY2hhciBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlID0gKGNvbXBhcmVfY2hhciA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9jaGFyXG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9jaGFyIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChjaGFyX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2NoYXIgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gY2hhcl9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCB0b19zdHJpbmcgdCA9IFN0cmluZy5tYWtlIDEgdFxuXG4gIGxldCBvZl9zdHJpbmcgcyA9XG4gICAgbWF0Y2ggU3RyaW5nLmxlbmd0aCBzIHdpdGhcbiAgICB8IDEgLT4gcy5bMF1cbiAgICB8IF8gLT4gZmFpbHdpdGhmIFwiQ2hhci5vZl9zdHJpbmc6ICVTXCIgcyAoKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgVFxuXG5pbmNsdWRlIElkZW50aWZpYWJsZS5NYWtlIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5DaGFyXCJcbiAgZW5kKVxuXG5sZXQgcHAgZm10IGMgPSBDYW1sLkZvcm1hdC5mcHJpbnRmIGZtdCBcIiVDXCIgY1xuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBDaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IGFsbCA9IEFycmF5LmluaXQgMjU2IH5mOnVuc2FmZV9vZl9pbnQgfD4gQXJyYXkudG9fbGlzdFxuXG5sZXQgaXNfbG93ZXJjYXNlID0gZnVuY3Rpb25cbiAgfCAnYScgLi4gJ3onIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfdXBwZXJjYXNlID0gZnVuY3Rpb25cbiAgfCAnQScgLi4gJ1onIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfcHJpbnQgPSBmdW5jdGlvblxuICB8ICcgJyAuLiAnficgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc193aGl0ZXNwYWNlID0gZnVuY3Rpb25cbiAgfCAnXFx0JyB8ICdcXG4nIHwgJ1xcMDExJyAoKiB2ZXJ0aWNhbCB0YWIgKikgfCAnXFwwMTInICgqIGZvcm0gZmVlZCAqKSB8ICdcXHInIHwgJyAnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgaXNfZGlnaXQgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19hbHBoYSA9IGZ1bmN0aW9uXG4gIHwgJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbigqIFdyaXRpbmcgdGhlc2Ugb3V0LCBpbnN0ZWFkIG9mIGNhbGxpbmcgW2lzX2FscGhhXSBhbmQgW2lzX2RpZ2l0XSwgcmVkdWNlc1xuICAgcnVudGltZSBieSBhcHByb3guIDMwJSAqKVxubGV0IGlzX2FscGhhbnVtID0gZnVuY3Rpb25cbiAgfCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICcwJyAuLiAnOScgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBnZXRfZGlnaXRfdW5zYWZlIHQgPSB0b19pbnQgdCAtIHRvX2ludCAnMCdcblxubGV0IGdldF9kaWdpdF9leG4gdCA9XG4gIGlmIGlzX2RpZ2l0IHRcbiAgdGhlbiBnZXRfZGlnaXRfdW5zYWZlIHRcbiAgZWxzZSBmYWlsd2l0aGYgXCJDaGFyLmdldF9kaWdpdF9leG4gJUM6IG5vdCBhIGRpZ2l0XCIgdCAoKVxuOztcblxubGV0IGdldF9kaWdpdCB0ID0gaWYgaXNfZGlnaXQgdCB0aGVuIFNvbWUgKGdldF9kaWdpdF91bnNhZmUgdCkgZWxzZSBOb25lXG5cbmxldCBpc19oZXhfZGlnaXQgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyAtPiB0cnVlXG4gIHwgXyAtPiBmYWxzZVxuOztcblxubGV0IGlzX2hleF9kaWdpdF9sb3dlciA9IGZ1bmN0aW9uXG4gIHwgJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgLT4gdHJ1ZVxuICB8IF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBpc19oZXhfZGlnaXRfdXBwZXIgPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgfCAnQScgLi4gJ0YnIC0+IHRydWVcbiAgfCBfIC0+IGZhbHNlXG47O1xuXG5sZXQgZ2V0X2hleF9kaWdpdF9leG4gPSBmdW5jdGlvblxuICB8ICcwJyAuLiAnOScgYXMgdCAtPiB0b19pbnQgdCAtIHRvX2ludCAnMCdcbiAgfCAnYScgLi4gJ2YnIGFzIHQgLT4gdG9faW50IHQgLSB0b19pbnQgJ2EnICsgMTBcbiAgfCAnQScgLi4gJ0YnIGFzIHQgLT4gdG9faW50IHQgLSB0b19pbnQgJ0EnICsgMTBcbiAgfCB0IC0+XG4gICAgRXJyb3IucmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJDaGFyLmdldF9oZXhfZGlnaXRfZXhuOiBub3QgYSBoZXhhZGVjaW1hbCBkaWdpdFwiXG4gICAgICAgICBbIFwiY2hhclwiLCBzZXhwX29mX3QgdCBdKVxuOztcblxubGV0IGdldF9oZXhfZGlnaXQgdCA9IGlmIGlzX2hleF9kaWdpdCB0IHRoZW4gU29tZSAoZ2V0X2hleF9kaWdpdF9leG4gdCkgZWxzZSBOb25lXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGxldCAoID49ICkgPSAoID49IClcbiAgbGV0ICggPD0gKSA9ICggPD0gKVxuICBsZXQgKCA9ICkgPSAoID0gKVxuICBsZXQgKCA+ICkgPSAoID4gKVxuICBsZXQgKCA8ICkgPSAoIDwgKVxuICBsZXQgKCA8PiApID0gKCA8PiApXG5lbmRcblxubW9kdWxlIENhc2VsZXNzID0gc3RydWN0XG4gIG1vZHVsZSBUID0gc3RydWN0XG4gICAgdHlwZSB0ID0gY2hhciBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gICAgbGV0IHRfb2Zfc2V4cCA9IChjaGFyX29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfY2hhciA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IGNoYXJfc2V4cF9ncmFtbWFyXG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IGNvbXBhcmUgYzEgYzIgPSBjb21wYXJlIChsb3dlcmNhc2UgYzEpIChsb3dlcmNhc2UgYzIpXG4gICAgbGV0IGhhc2hfZm9sZF90IHN0YXRlIHQgPSBoYXNoX2ZvbGRfY2hhciBzdGF0ZSAobG93ZXJjYXNlIHQpXG4gICAgbGV0IGhhc2ggdCA9IEhhc2gucnVuIGhhc2hfZm9sZF90IHRcbiAgZW5kXG5cbiAgaW5jbHVkZSBUXG4gIGluY2x1ZGUgQ29tcGFyYWJsZS5NYWtlIChUKVxuZW5kXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBDaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwibW9kdWxlIExpc3QgPSBMaXN0XG5cbm1vZHVsZSBFbnVtZXJhYmxlID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIFMgPSBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCBhbGwgOiB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzEgPSBzaWdcbiAgICB0eXBlICdhIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdhIHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMiA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2IgbGlzdCAtPiAoJ2EsICdiKSB0IGxpc3RcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgUzMgPSBzaWdcbiAgICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYiBsaXN0IC0+ICdjIGxpc3QgLT4gKCdhLCAnYiwgJ2MpIHQgbGlzdFxuICBlbmRcbmVuZFxuIiwib3BlbiEgSW1wb3J0MC5JbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5tb2R1bGUgQnl0ZXMgPSBCeXRlczBcbm1vZHVsZSBTdHJpbmcgPSBTdHJpbmcwXG5cbigqIENvbnN0cnVjdCBhIGJ5dGUgc3RyaW5nIG9mIGxlbmd0aCAyNTYsIG1hcHBpbmcgZXZlcnkgaW5wdXQgY2hhcmFjdGVyIGNvZGUgdG9cbiAgIGl0cyBjb3JyZXNwb25kaW5nIG91dHB1dCBjaGFyYWN0ZXIuXG5cbiAgIEJlbmNobWFya3MgaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGZhc3RlciB0aGFuIHRoZSBsYW1iZGEgKGluY2x1ZGluZyBjb3N0IG9mXG4gICB0aGlzIGZ1bmN0aW9uKSwgZXZlbiBpZiB0YXJnZXQvcmVwbGFjZW1lbnQgYXJlIGp1c3QgMiBjaGFyYWN0ZXJzIGVhY2guXG5cbiAgIFJldHVybiBOb25lIGlmIHRoZSB0cmFuc2xhdGlvbiBtYXAgaXMgZXF1aXZhbGVudCB0byBqdXN0IHRoZSBpZGVudGl0eS4gKilcbmxldCB0cl9jcmVhdGVfbWFwIH50YXJnZXQgfnJlcGxhY2VtZW50ID1cbiAgbGV0IHRyX21hcCA9IEJ5dGVzLmNyZWF0ZSAyNTYgaW5cbiAgZm9yIGkgPSAwIHRvIDI1NSBkb1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgdHJfbWFwIGkgKENoYXIub2ZfaW50X2V4biBpKVxuICBkb25lO1xuICBmb3IgaSA9IDAgdG8gbWluIChTdHJpbmcubGVuZ3RoIHRhcmdldCkgKFN0cmluZy5sZW5ndGggcmVwbGFjZW1lbnQpIC0gMSBkb1xuICAgIGxldCBpbmRleCA9IENoYXIudG9faW50IChTdHJpbmcudW5zYWZlX2dldCB0YXJnZXQgaSkgaW5cbiAgICBCeXRlcy51bnNhZmVfc2V0IHRyX21hcCBpbmRleCAoU3RyaW5nLnVuc2FmZV9nZXQgcmVwbGFjZW1lbnQgaSlcbiAgZG9uZTtcbiAgbGV0IGxhc3RfcmVwbGFjZW1lbnQgPSBTdHJpbmcudW5zYWZlX2dldCByZXBsYWNlbWVudCAoU3RyaW5nLmxlbmd0aCByZXBsYWNlbWVudCAtIDEpIGluXG4gIGZvclxuICAgIGkgPSBtaW4gKFN0cmluZy5sZW5ndGggdGFyZ2V0KSAoU3RyaW5nLmxlbmd0aCByZXBsYWNlbWVudCkgdG8gU3RyaW5nLmxlbmd0aCB0YXJnZXQgLSAxXG4gIGRvXG4gICAgbGV0IGluZGV4ID0gQ2hhci50b19pbnQgKFN0cmluZy51bnNhZmVfZ2V0IHRhcmdldCBpKSBpblxuICAgIEJ5dGVzLnVuc2FmZV9zZXQgdHJfbWFwIGluZGV4IGxhc3RfcmVwbGFjZW1lbnRcbiAgZG9uZTtcbiAgbGV0IHJlYyBoYXZlX2FueV9kaWZmZXJlbnQgdHJfbWFwIGkgPVxuICAgIGlmIGkgPSAyNTZcbiAgICB0aGVuIGZhbHNlXG4gICAgZWxzZSBpZiBDaGFyLiggPD4gKSAoQnl0ZXMwLnVuc2FmZV9nZXQgdHJfbWFwIGkpIChDaGFyLm9mX2ludF9leG4gaSlcbiAgICB0aGVuIHRydWVcbiAgICBlbHNlIGhhdmVfYW55X2RpZmZlcmVudCB0cl9tYXAgKGkgKyAxKVxuICBpblxuICAoKiBxdWljayBjaGVjayBvbiB0aGUgZmlyc3QgdGFyZ2V0IGNoYXJhY3RlciB3aGljaCB3aWxsIDk5JSBiZSB0cnVlICopXG4gIGxldCBmaXJzdF90YXJnZXQgPSB0YXJnZXQuWzBdIGluXG4gIGlmIENoYXIuKCA8PiApIChCeXRlczAudW5zYWZlX2dldCB0cl9tYXAgKENoYXIudG9faW50IGZpcnN0X3RhcmdldCkpIGZpcnN0X3RhcmdldFxuICB8fCBoYXZlX2FueV9kaWZmZXJlbnQgdHJfbWFwIDBcbiAgdGhlbiBTb21lIChCeXRlczAudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp0cl9tYXApXG4gIGVsc2UgTm9uZVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlICdhIHQgPSAnYVxuXG5sZXQgc3RhZ2UgPSBGbi5pZFxubGV0IHVuc3RhZ2UgPSBGbi5pZFxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcbmluY2x1ZGUgU3RyaW5nMFxubW9kdWxlIEJ5dGVzID0gQnl0ZXMwXG4oKiBUaGlzIGFsaWFzIGlzIG5lY2Vzc2FyeSBkZXNwaXRlIFtTdHJpbmcwXSBkZWZpbmluZyBbQnl0ZXMgPSBCeXRlczBdLCBpbiBvcmRlciB0b1xuICAgY29udmluY2Ugb2NhbWxkZXAgdGhhdCB0aGlzIGZpbGUgZG9lc24ndCBkZXBlbmQgb24gYnl0ZXMubWwuICopXG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcbmxldCBzdGFnZSA9IFN0YWdlZC5zdGFnZVxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBzdHJpbmcgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX3N0cmluZ1xuXG4gIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IGhhc2hfc3RyaW5nIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChzdHJpbmdfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2Zfc3RyaW5nIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAodF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IHN0cmluZ19zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cbiAgbGV0IGNvbXBhcmUgPSBjb21wYXJlXG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcblxudHlwZSBlbHQgPSBjaGFyXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5cbigqIFRoaXMgaXMgY29waWVkL2FkYXB0ZWQgZnJvbSAnYmxpdC5tbCcuXG4gICBbc3ViXSwgW3N1Ym9dIGNvdWxkIGJlIGltcGxlbWVudGVkIHVzaW5nIFtCbGl0Lk1ha2UoQnl0ZXMpXSBwbHVzIHVuc2FmZSBjYXN0cyB0by9mcm9tXG4gICBzdHJpbmcgYnV0IHdlcmUgaW5saW5lZCBoZXJlIHRvIGF2b2lkIHVzaW5nIFtCeXRlcy51bnNhZmVfb2Zfc3RyaW5nXSBhcyBtdWNoIGFzIHBvc3NpYmxlLlxuKilcbmxldCBzdWIgc3JjIH5wb3MgfmxlbiA9XG4gIGlmIHBvcyA9IDAgJiYgbGVuID0gU3RyaW5nLmxlbmd0aCBzcmNcbiAgdGhlbiBzcmNcbiAgZWxzZSAoXG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5jaGVja19wb3NfbGVuX2V4biB+cG9zIH5sZW4gfnRvdGFsX2xlbmd0aDoobGVuZ3RoIHNyYyk7XG4gICAgaWYgbGVuID0gMFxuICAgIHRoZW4gXCJcIlxuICAgIGVsc2UgKFxuICAgICAgbGV0IGRzdCA9IEJ5dGVzLmNyZWF0ZSBsZW4gaW5cbiAgICAgIEJ5dGVzLnVuc2FmZV9ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zOnBvcyB+ZHN0IH5kc3RfcG9zOjAgfmxlbjtcbiAgICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6ZHN0KSlcbjs7XG5cbmxldCBzdWJvID8ocG9zID0gMCkgP2xlbiBzcmMgPVxuICBzdWJcbiAgICBzcmNcbiAgICB+cG9zXG4gICAgfmxlbjpcbiAgICAgIChtYXRjaCBsZW4gd2l0aFxuICAgICAgIHwgU29tZSBpIC0+IGlcbiAgICAgICB8IE5vbmUgLT4gbGVuZ3RoIHNyYyAtIHBvcylcbjs7XG5cbmxldCByZWMgY29udGFpbnNfdW5zYWZlIHQgfnBvcyB+ZW5kXyBjaGFyID1cbiAgcG9zIDwgZW5kX1xuICAmJiAoQ2hhci5lcXVhbCAodW5zYWZlX2dldCB0IHBvcykgY2hhciB8fCBjb250YWluc191bnNhZmUgdCB+cG9zOihwb3MgKyAxKSB+ZW5kXyBjaGFyKVxuOztcblxubGV0IGNvbnRhaW5zID8ocG9zID0gMCkgP2xlbiB0IGNoYXIgPVxuICBsZXQgdG90YWxfbGVuZ3RoID0gU3RyaW5nLmxlbmd0aCB0IGluXG4gIGxldCBsZW4gPSBPcHRpb24udmFsdWUgbGVuIH5kZWZhdWx0Oih0b3RhbF9sZW5ndGggLSBwb3MpIGluXG4gIE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb24uY2hlY2tfcG9zX2xlbl9leG4gfnBvcyB+bGVuIH50b3RhbF9sZW5ndGg7XG4gIGNvbnRhaW5zX3Vuc2FmZSB0IH5wb3MgfmVuZF86KHBvcyArIGxlbikgY2hhclxuOztcblxubGV0IGlzX2VtcHR5IHQgPSBsZW5ndGggdCA9IDBcblxubGV0IHJlYyBpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCBzdHJpbmcgfnBvcyB+bGVuIH5ub3RfZm91bmQgY2hhciA9XG4gIGlmIHBvcyA+PSBsZW5cbiAgdGhlbiByYWlzZSBub3RfZm91bmRcbiAgZWxzZSBpZiBDaGFyLmVxdWFsICh1bnNhZmVfZ2V0IHN0cmluZyBwb3MpIGNoYXJcbiAgdGhlbiBwb3NcbiAgZWxzZSBpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCBzdHJpbmcgfnBvczoocG9zICsgMSkgfmxlbiB+bm90X2ZvdW5kIGNoYXJcbjs7XG5cbmxldCBpbmRleF9leG5faW50ZXJuYWwgdCB+bm90X2ZvdW5kIGNoYXIgPVxuICBpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCB0IH5wb3M6MCB+bGVuOihsZW5ndGggdCkgfm5vdF9mb3VuZCBjaGFyXG47O1xuXG5sZXQgaW5kZXhfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLmluZGV4X2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCBpbmRleF9leG4gdCBjaGFyID0gaW5kZXhfZXhuX2ludGVybmFsIHQgfm5vdF9mb3VuZCBjaGFyIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgaW5kZXhfZXhuXG47O1xuXG5sZXQgaW5kZXhfZnJvbV9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcuaW5kZXhfZnJvbV9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgaW5kZXhfZnJvbV9leG4gdCBwb3MgY2hhciA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gICAgaWYgcG9zIDwgMCB8fCBwb3MgPiBsZW5cbiAgICB0aGVuIGludmFsaWRfYXJnIFwiU3RyaW5nLmluZGV4X2Zyb21fZXhuXCJcbiAgICBlbHNlIGluZGV4X2Zyb21fZXhuX2ludGVybmFsIHQgfnBvcyB+bGVuIH5ub3RfZm91bmQgY2hhclxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGluZGV4X2Zyb21fZXhuXG47O1xuXG5sZXQgcmVjIHJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCBzdHJpbmcgfnBvcyB+bGVuIH5ub3RfZm91bmQgY2hhciA9XG4gIGlmIHBvcyA8IDBcbiAgdGhlbiByYWlzZSBub3RfZm91bmRcbiAgZWxzZSBpZiBDaGFyLmVxdWFsICh1bnNhZmVfZ2V0IHN0cmluZyBwb3MpIGNoYXJcbiAgdGhlbiBwb3NcbiAgZWxzZSByaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgc3RyaW5nIH5wb3M6KHBvcyAtIDEpIH5sZW4gfm5vdF9mb3VuZCBjaGFyXG47O1xuXG5sZXQgcmluZGV4X2V4bl9pbnRlcm5hbCB0IH5ub3RfZm91bmQgY2hhciA9XG4gIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICByaW5kZXhfZnJvbV9leG5faW50ZXJuYWwgdCB+cG9zOihsZW4gLSAxKSB+bGVuIH5ub3RfZm91bmQgY2hhclxuOztcblxubGV0IHJpbmRleF9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcucmluZGV4X2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCByaW5kZXhfZXhuIHQgY2hhciA9IHJpbmRleF9leG5faW50ZXJuYWwgdCB+bm90X2ZvdW5kIGNoYXIgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICByaW5kZXhfZXhuXG47O1xuXG5sZXQgcmluZGV4X2Zyb21fZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLnJpbmRleF9mcm9tX2V4bjogbm90IGZvdW5kXCIpIGluXG4gIGxldCByaW5kZXhfZnJvbV9leG4gdCBwb3MgY2hhciA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gICAgaWYgcG9zIDwgLTEgfHwgcG9zID49IGxlblxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJTdHJpbmcucmluZGV4X2Zyb21fZXhuXCJcbiAgICBlbHNlIHJpbmRleF9mcm9tX2V4bl9pbnRlcm5hbCB0IH5wb3MgfmxlbiB+bm90X2ZvdW5kIGNoYXJcbiAgaW5cbiAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICByaW5kZXhfZnJvbV9leG5cbjs7XG5cbmxldCBpbmRleCB0IGNoYXIgPVxuICB0cnkgU29tZSAoaW5kZXhfZXhuIHQgY2hhcikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5sZXQgcmluZGV4IHQgY2hhciA9XG4gIHRyeSBTb21lIChyaW5kZXhfZXhuIHQgY2hhcikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5sZXQgaW5kZXhfZnJvbSB0IHBvcyBjaGFyID1cbiAgdHJ5IFNvbWUgKGluZGV4X2Zyb21fZXhuIHQgcG9zIGNoYXIpIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubGV0IHJpbmRleF9mcm9tIHQgcG9zIGNoYXIgPVxuICB0cnkgU29tZSAocmluZGV4X2Zyb21fZXhuIHQgcG9zIGNoYXIpIHdpdGhcbiAgfCBOb3RfZm91bmRfcyBfIHwgQ2FtbC5Ob3RfZm91bmQgLT4gTm9uZVxuOztcblxubW9kdWxlIFNlYXJjaF9wYXR0ZXJuMCA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHsgcGF0dGVybiA6IHN0cmluZ1xuICAgIDsgY2FzZV9zZW5zaXRpdmUgOiBib29sXG4gICAgOyBrbXBfYXJyYXkgOiBpbnQgYXJyYXlcbiAgICB9XG5cbiAgbGV0IHNleHBfb2ZfdCB7IHBhdHRlcm47IGNhc2Vfc2Vuc2l0aXZlOyBrbXBfYXJyYXkgPSBfIH0gOiBTZXhwLnQgPVxuICAgIExpc3RcbiAgICAgIFsgTGlzdCBbIEF0b20gXCJwYXR0ZXJuXCI7IHNleHBfb2Zfc3RyaW5nIHBhdHRlcm4gXVxuICAgICAgOyBMaXN0IFsgQXRvbSBcImNhc2Vfc2Vuc2l0aXZlXCI7IHNleHBfb2ZfYm9vbCBjYXNlX3NlbnNpdGl2ZSBdXG4gICAgICBdXG4gIDs7XG5cbiAgbGV0IHBhdHRlcm4gdCA9IHQucGF0dGVyblxuICBsZXQgY2FzZV9zZW5zaXRpdmUgdCA9IHQuY2FzZV9zZW5zaXRpdmVcblxuICAoKiBGaW5kIG1heCBudW1iZXIgb2YgbWF0Y2hlZCBjaGFyYWN0ZXJzIGF0IFtuZXh0X3RleHRfY2hhcl0sIGdpdmVuIHRoZSBjdXJyZW50XG4gICAgIFttYXRjaGVkX2NoYXJzXS4gVHJ5IHRvIGV4dGVuZCB0aGUgY3VycmVudCBtYXRjaCwgaWYgY2hhcnMgZG9uJ3QgbWF0Y2gsIHRyeSB0byBtYXRjaFxuICAgICBmZXdlciBjaGFycy4gSWYgY2hhcnMgbWF0Y2ggdGhlbiBleHRlbmQgdGhlIG1hdGNoLiAqKVxuICBsZXQga21wX2ludGVybmFsX2xvb3Agfm1hdGNoZWRfY2hhcnMgfm5leHRfdGV4dF9jaGFyIH5wYXR0ZXJuIH5rbXBfYXJyYXkgfmNoYXJfZXF1YWwgPVxuICAgIGxldCBtYXRjaGVkX2NoYXJzID0gcmVmIG1hdGNoZWRfY2hhcnMgaW5cbiAgICB3aGlsZVxuICAgICAgIW1hdGNoZWRfY2hhcnMgPiAwXG4gICAgICAmJiBub3QgKGNoYXJfZXF1YWwgbmV4dF90ZXh0X2NoYXIgKHVuc2FmZV9nZXQgcGF0dGVybiAhbWF0Y2hlZF9jaGFycykpXG4gICAgZG9cbiAgICAgIG1hdGNoZWRfY2hhcnMgOj0gQXJyYXkudW5zYWZlX2dldCBrbXBfYXJyYXkgKCFtYXRjaGVkX2NoYXJzIC0gMSlcbiAgICBkb25lO1xuICAgIGlmIGNoYXJfZXF1YWwgbmV4dF90ZXh0X2NoYXIgKHVuc2FmZV9nZXQgcGF0dGVybiAhbWF0Y2hlZF9jaGFycylcbiAgICB0aGVuIG1hdGNoZWRfY2hhcnMgOj0gIW1hdGNoZWRfY2hhcnMgKyAxO1xuICAgICFtYXRjaGVkX2NoYXJzXG4gIDs7XG5cbiAgbGV0IGdldF9jaGFyX2VxdWFsIH5jYXNlX3NlbnNpdGl2ZSA9XG4gICAgbWF0Y2ggY2FzZV9zZW5zaXRpdmUgd2l0aFxuICAgIHwgdHJ1ZSAtPiBDaGFyLmVxdWFsXG4gICAgfCBmYWxzZSAtPiBDaGFyLkNhc2VsZXNzLmVxdWFsXG4gIDs7XG5cbiAgKCogQ2xhc3NpYyBLTVAgcHJlLXByb2Nlc3Npbmcgb2YgdGhlIHBhdHRlcm46IGJ1aWxkIHRoZSBpbnQgYXJyYXksIHdoaWNoLCBmb3IgZWFjaCBpLFxuICAgICBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IG5vbi10cml2aWFsIHByZWZpeCBvZiBzIHdoaWNoIGlzIGVxdWFsIHRvIGEgc3VmZml4XG4gICAgIGVuZGluZyBhdCBzLltpXSAqKVxuICBsZXQgY3JlYXRlIHBhdHRlcm4gfmNhc2Vfc2Vuc2l0aXZlID1cbiAgICBsZXQgbiA9IGxlbmd0aCBwYXR0ZXJuIGluXG4gICAgbGV0IGttcF9hcnJheSA9IEFycmF5LmNyZWF0ZSB+bGVuOm4gKC0xKSBpblxuICAgIGlmIG4gPiAwXG4gICAgdGhlbiAoXG4gICAgICBsZXQgY2hhcl9lcXVhbCA9IGdldF9jaGFyX2VxdWFsIH5jYXNlX3NlbnNpdGl2ZSBpblxuICAgICAgQXJyYXkudW5zYWZlX3NldCBrbXBfYXJyYXkgMCAwO1xuICAgICAgbGV0IG1hdGNoZWRfY2hhcnMgPSByZWYgMCBpblxuICAgICAgZm9yIGkgPSAxIHRvIG4gLSAxIGRvXG4gICAgICAgIG1hdGNoZWRfY2hhcnNcbiAgICAgICAgOj0ga21wX2ludGVybmFsX2xvb3BcbiAgICAgICAgICAgICB+bWF0Y2hlZF9jaGFyczohbWF0Y2hlZF9jaGFyc1xuICAgICAgICAgICAgIH5uZXh0X3RleHRfY2hhcjoodW5zYWZlX2dldCBwYXR0ZXJuIGkpXG4gICAgICAgICAgICAgfnBhdHRlcm5cbiAgICAgICAgICAgICB+a21wX2FycmF5XG4gICAgICAgICAgICAgfmNoYXJfZXF1YWw7XG4gICAgICAgIEFycmF5LnVuc2FmZV9zZXQga21wX2FycmF5IGkgIW1hdGNoZWRfY2hhcnNcbiAgICAgIGRvbmUpO1xuICAgIHsgcGF0dGVybjsgY2FzZV9zZW5zaXRpdmU7IGttcF9hcnJheSB9XG4gIDs7XG5cbiAgKCogQ2xhc3NpYyBLTVA6IHVzZSB0aGUgcHJlLXByb2Nlc3NlZCBwYXR0ZXJuIHRvIG9wdGltaXplIGxvb2stYmVoaW5kcyBvbiBub24tbWF0Y2hlcy5cbiAgICAgV2UgcmV0dXJuIGludCB0byBhdm9pZCBhbGxvY2F0aW9uIGluIFtpbmRleF9leG5dLiAtMSBtZWFucyBubyBtYXRjaC4gKilcbiAgbGV0IGluZGV4X2ludGVybmFsID8ocG9zID0gMCkgeyBwYXR0ZXJuOyBjYXNlX3NlbnNpdGl2ZTsga21wX2FycmF5IH0gfmluXzp0ZXh0ID1cbiAgICBpZiBwb3MgPCAwIHx8IHBvcyA+IGxlbmd0aCB0ZXh0IC0gbGVuZ3RoIHBhdHRlcm5cbiAgICB0aGVuIC0xXG4gICAgZWxzZSAoXG4gICAgICBsZXQgY2hhcl9lcXVhbCA9IGdldF9jaGFyX2VxdWFsIH5jYXNlX3NlbnNpdGl2ZSBpblxuICAgICAgbGV0IGogPSByZWYgcG9zIGluXG4gICAgICBsZXQgbWF0Y2hlZF9jaGFycyA9IHJlZiAwIGluXG4gICAgICBsZXQgayA9IGxlbmd0aCBwYXR0ZXJuIGluXG4gICAgICBsZXQgbiA9IGxlbmd0aCB0ZXh0IGluXG4gICAgICB3aGlsZSAhaiA8IG4gJiYgIW1hdGNoZWRfY2hhcnMgPCBrIGRvXG4gICAgICAgIGxldCBuZXh0X3RleHRfY2hhciA9IHVuc2FmZV9nZXQgdGV4dCAhaiBpblxuICAgICAgICBtYXRjaGVkX2NoYXJzXG4gICAgICAgIDo9IGttcF9pbnRlcm5hbF9sb29wXG4gICAgICAgICAgICAgfm1hdGNoZWRfY2hhcnM6IW1hdGNoZWRfY2hhcnNcbiAgICAgICAgICAgICB+bmV4dF90ZXh0X2NoYXJcbiAgICAgICAgICAgICB+cGF0dGVyblxuICAgICAgICAgICAgIH5rbXBfYXJyYXlcbiAgICAgICAgICAgICB+Y2hhcl9lcXVhbDtcbiAgICAgICAgaiA6PSAhaiArIDFcbiAgICAgIGRvbmU7XG4gICAgICBpZiAhbWF0Y2hlZF9jaGFycyA9IGsgdGhlbiAhaiAtIGsgZWxzZSAtMSlcbiAgOztcblxuICBsZXQgbWF0Y2hlcyB0IHN0ciA9IGluZGV4X2ludGVybmFsIHQgfmluXzpzdHIgPj0gMFxuXG4gIGxldCBpbmRleCA/cG9zIHQgfmluXyA9XG4gICAgbGV0IHAgPSBpbmRleF9pbnRlcm5hbCA/cG9zIHQgfmluXyBpblxuICAgIGlmIHAgPCAwIHRoZW4gTm9uZSBlbHNlIFNvbWUgcFxuICA7O1xuXG4gIGxldCBpbmRleF9leG4gP3BvcyB0IH5pbl8gPVxuICAgIGxldCBwID0gaW5kZXhfaW50ZXJuYWwgP3BvcyB0IH5pbl8gaW5cbiAgICBpZiBwID49IDBcbiAgICB0aGVuIHBcbiAgICBlbHNlXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2UgXCJTdWJzdHJpbmcgbm90IGZvdW5kXCIgWyBcInN1YnN0cmluZ1wiLCBzZXhwX29mX3N0cmluZyB0LnBhdHRlcm4gXSlcbiAgOztcblxuICBsZXQgaW5kZXhfYWxsIHsgcGF0dGVybjsgY2FzZV9zZW5zaXRpdmU7IGttcF9hcnJheSB9IH5tYXlfb3ZlcmxhcCB+aW5fOnRleHQgPVxuICAgIGlmIGxlbmd0aCBwYXR0ZXJuID0gMFxuICAgIHRoZW4gTGlzdC5pbml0ICgxICsgbGVuZ3RoIHRleHQpIH5mOkZuLmlkXG4gICAgZWxzZSAoXG4gICAgICBsZXQgY2hhcl9lcXVhbCA9IGdldF9jaGFyX2VxdWFsIH5jYXNlX3NlbnNpdGl2ZSBpblxuICAgICAgbGV0IG1hdGNoZWRfY2hhcnMgPSByZWYgMCBpblxuICAgICAgbGV0IGsgPSBsZW5ndGggcGF0dGVybiBpblxuICAgICAgbGV0IG4gPSBsZW5ndGggdGV4dCBpblxuICAgICAgbGV0IGZvdW5kID0gcmVmIFtdIGluXG4gICAgICBmb3IgaiA9IDAgdG8gbiBkb1xuICAgICAgICBpZiAhbWF0Y2hlZF9jaGFycyA9IGtcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgZm91bmQgOj0gKGogLSBrKSA6OiAhZm91bmQ7XG4gICAgICAgICAgKCogd2UganVzdCBmb3VuZCBhIG1hdGNoIGluIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gKilcbiAgICAgICAgICBtYXRjaCBtYXlfb3ZlcmxhcCB3aXRoXG4gICAgICAgICAgfCB0cnVlIC0+IG1hdGNoZWRfY2hhcnMgOj0gQXJyYXkudW5zYWZlX2dldCBrbXBfYXJyYXkgKGsgLSAxKVxuICAgICAgICAgIHwgZmFsc2UgLT4gbWF0Y2hlZF9jaGFycyA6PSAwKTtcbiAgICAgICAgaWYgaiA8IG5cbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IG5leHRfdGV4dF9jaGFyID0gdW5zYWZlX2dldCB0ZXh0IGogaW5cbiAgICAgICAgICBtYXRjaGVkX2NoYXJzXG4gICAgICAgICAgOj0ga21wX2ludGVybmFsX2xvb3BcbiAgICAgICAgICAgICAgIH5tYXRjaGVkX2NoYXJzOiFtYXRjaGVkX2NoYXJzXG4gICAgICAgICAgICAgICB+bmV4dF90ZXh0X2NoYXJcbiAgICAgICAgICAgICAgIH5wYXR0ZXJuXG4gICAgICAgICAgICAgICB+a21wX2FycmF5XG4gICAgICAgICAgICAgICB+Y2hhcl9lcXVhbClcbiAgICAgIGRvbmU7XG4gICAgICBMaXN0LnJldiAhZm91bmQpXG4gIDs7XG5cbiAgbGV0IHJlcGxhY2VfZmlyc3QgP3BvcyB0IH5pbl86cyB+d2l0aF8gPVxuICAgIG1hdGNoIGluZGV4ID9wb3MgdCB+aW5fOnMgd2l0aFxuICAgIHwgTm9uZSAtPiBzXG4gICAgfCBTb21lIGkgLT5cbiAgICAgIGxldCBsZW5fcyA9IGxlbmd0aCBzIGluXG4gICAgICBsZXQgbGVuX3QgPSBsZW5ndGggdC5wYXR0ZXJuIGluXG4gICAgICBsZXQgbGVuX3dpdGggPSBsZW5ndGggd2l0aF8gaW5cbiAgICAgIGxldCBkc3QgPSBCeXRlcy5jcmVhdGUgKGxlbl9zICsgbGVuX3dpdGggLSBsZW5fdCkgaW5cbiAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmM6cyB+c3JjX3BvczowIH5kc3QgfmRzdF9wb3M6MCB+bGVuOmk7XG4gICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjOndpdGhfIH5zcmNfcG9zOjAgfmRzdCB+ZHN0X3BvczppIH5sZW46bGVuX3dpdGg7XG4gICAgICBCeXRlcy5ibGl0X3N0cmluZ1xuICAgICAgICB+c3JjOnNcbiAgICAgICAgfnNyY19wb3M6KGkgKyBsZW5fdClcbiAgICAgICAgfmRzdFxuICAgICAgICB+ZHN0X3BvczooaSArIGxlbl93aXRoKVxuICAgICAgICB+bGVuOihsZW5fcyAtIGkgLSBsZW5fdCk7XG4gICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOmRzdFxuICA7O1xuXG5cbiAgbGV0IHJlcGxhY2VfYWxsIHQgfmluXzpzIH53aXRoXyA9XG4gICAgbGV0IG1hdGNoZXMgPSBpbmRleF9hbGwgdCB+bWF5X292ZXJsYXA6ZmFsc2UgfmluXzpzIGluXG4gICAgbWF0Y2ggbWF0Y2hlcyB3aXRoXG4gICAgfCBbXSAtPiBzXG4gICAgfCBfIDo6IF8gLT5cbiAgICAgIGxldCBsZW5fcyA9IGxlbmd0aCBzIGluXG4gICAgICBsZXQgbGVuX3QgPSBsZW5ndGggdC5wYXR0ZXJuIGluXG4gICAgICBsZXQgbGVuX3dpdGggPSBsZW5ndGggd2l0aF8gaW5cbiAgICAgIGxldCBudW1fbWF0Y2hlcyA9IExpc3QubGVuZ3RoIG1hdGNoZXMgaW5cbiAgICAgIGxldCBkc3QgPSBCeXRlcy5jcmVhdGUgKGxlbl9zICsgKChsZW5fd2l0aCAtIGxlbl90KSAqIG51bV9tYXRjaGVzKSkgaW5cbiAgICAgIGxldCBuZXh0X2RzdF9wb3MgPSByZWYgMCBpblxuICAgICAgbGV0IG5leHRfc3JjX3BvcyA9IHJlZiAwIGluXG4gICAgICBMaXN0Lml0ZXIgbWF0Y2hlcyB+ZjooZnVuIGkgLT5cbiAgICAgICAgbGV0IGxlbiA9IGkgLSAhbmV4dF9zcmNfcG9zIGluXG4gICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmM6cyB+c3JjX3BvczohbmV4dF9zcmNfcG9zIH5kc3QgfmRzdF9wb3M6IW5leHRfZHN0X3BvcyB+bGVuO1xuICAgICAgICBCeXRlcy5ibGl0X3N0cmluZ1xuICAgICAgICAgIH5zcmM6d2l0aF9cbiAgICAgICAgICB+c3JjX3BvczowXG4gICAgICAgICAgfmRzdFxuICAgICAgICAgIH5kc3RfcG9zOighbmV4dF9kc3RfcG9zICsgbGVuKVxuICAgICAgICAgIH5sZW46bGVuX3dpdGg7XG4gICAgICAgIG5leHRfZHN0X3BvcyA6PSAhbmV4dF9kc3RfcG9zICsgbGVuICsgbGVuX3dpdGg7XG4gICAgICAgIG5leHRfc3JjX3BvcyA6PSAhbmV4dF9zcmNfcG9zICsgbGVuICsgbGVuX3QpO1xuICAgICAgQnl0ZXMuYmxpdF9zdHJpbmdcbiAgICAgICAgfnNyYzpzXG4gICAgICAgIH5zcmNfcG9zOiFuZXh0X3NyY19wb3NcbiAgICAgICAgfmRzdFxuICAgICAgICB+ZHN0X3BvczohbmV4dF9kc3RfcG9zXG4gICAgICAgIH5sZW46KGxlbl9zIC0gIW5leHRfc3JjX3Bvcyk7XG4gICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOmRzdFxuICA7O1xuXG4gIGxldCBzcGxpdF9vbiB0IHMgPVxuICAgIGxldCBwYXR0ZXJuX2xlbiA9IFN0cmluZy5sZW5ndGggdC5wYXR0ZXJuIGluXG4gICAgbGV0IG1hdGNoZXMgPSBpbmRleF9hbGwgdCB+bWF5X292ZXJsYXA6ZmFsc2UgfmluXzpzIGluXG4gICAgTGlzdC5tYXAyX2V4blxuICAgICAgKC1wYXR0ZXJuX2xlbiA6OiBtYXRjaGVzKVxuICAgICAgKG1hdGNoZXMgQCBbIFN0cmluZy5sZW5ndGggcyBdKVxuICAgICAgfmY6KGZ1biBpIGogLT4gc3ViIHMgfnBvczooaSArIHBhdHRlcm5fbGVuKSB+bGVuOihqIC0gaSAtIHBhdHRlcm5fbGVuKSlcbiAgOztcblxuICBtb2R1bGUgUHJpdmF0ZSA9IHN0cnVjdFxuICAgIHR5cGUgcHVibGljID0gdFxuXG4gICAgdHlwZSBub25yZWMgdCA9IHQgPVxuICAgICAgeyBwYXR0ZXJuIDogc3RyaW5nXG4gICAgICA7IGNhc2Vfc2Vuc2l0aXZlIDogYm9vbFxuICAgICAgOyBrbXBfYXJyYXkgOiBpbnQgYXJyYXlcbiAgICAgIH1cbiAgICBbQEBkZXJpdmluZ19pbmxpbmUgZXF1YWwsIHNleHBfb2ZdXG5cbiAgICBsZXQgZXF1YWwgPVxuICAgICAgKGZ1biBhX18wMDJfIGJfXzAwM18gLT5cbiAgICAgICAgIGlmIFBweF9jb21wYXJlX2xpYi5waHlzX2VxdWFsIGFfXzAwMl8gYl9fMDAzX1xuICAgICAgICAgdGhlbiB0cnVlXG4gICAgICAgICBlbHNlXG4gICAgICAgICAgIFBweF9jb21wYXJlX2xpYi4oICYmIClcbiAgICAgICAgICAgICAoZXF1YWxfc3RyaW5nIGFfXzAwMl8ucGF0dGVybiBiX18wMDNfLnBhdHRlcm4pXG4gICAgICAgICAgICAgKFBweF9jb21wYXJlX2xpYi4oICYmIClcbiAgICAgICAgICAgICAgICAoZXF1YWxfYm9vbCBhX18wMDJfLmNhc2Vfc2Vuc2l0aXZlIGJfXzAwM18uY2FzZV9zZW5zaXRpdmUpXG4gICAgICAgICAgICAgICAgKGVxdWFsX2FycmF5IGVxdWFsX2ludCBhX18wMDJfLmttcF9hcnJheSBiX18wMDNfLmttcF9hcnJheSkpXG4gICAgICAgICAgIDogdCAtPiB0IC0+IGJvb2wpXG4gICAgOztcblxuICAgIGxldCBzZXhwX29mX3QgPVxuICAgICAgKGZ1biB7IHBhdHRlcm4gPSBwYXR0ZXJuX18wMDdfXG4gICAgICAgICAgIDsgY2FzZV9zZW5zaXRpdmUgPSBjYXNlX3NlbnNpdGl2ZV9fMDA5X1xuICAgICAgICAgICA7IGttcF9hcnJheSA9IGttcF9hcnJheV9fMDExX1xuICAgICAgICAgICB9IC0+XG4gICAgICAgIGxldCBibmRzX18wMDZfID0gW10gaW5cbiAgICAgICAgbGV0IGJuZHNfXzAwNl8gPVxuICAgICAgICAgIGxldCBhcmdfXzAxMl8gPSBzZXhwX29mX2FycmF5IHNleHBfb2ZfaW50IGttcF9hcnJheV9fMDExXyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcImttcF9hcnJheVwiOyBhcmdfXzAxMl8gXSA6OiBibmRzX18wMDZfXG4gICAgICAgIGluXG4gICAgICAgIGxldCBibmRzX18wMDZfID1cbiAgICAgICAgICBsZXQgYXJnX18wMTBfID0gc2V4cF9vZl9ib29sIGNhc2Vfc2Vuc2l0aXZlX18wMDlfIGluXG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiY2FzZV9zZW5zaXRpdmVcIjsgYXJnX18wMTBfIF1cbiAgICAgICAgICA6OiBibmRzX18wMDZfXG4gICAgICAgIGluXG4gICAgICAgIGxldCBibmRzX18wMDZfID1cbiAgICAgICAgICBsZXQgYXJnX18wMDhfID0gc2V4cF9vZl9zdHJpbmcgcGF0dGVybl9fMDA3XyBpblxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcInBhdHRlcm5cIjsgYXJnX18wMDhfIF0gOjogYm5kc19fMDA2X1xuICAgICAgICBpblxuICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgYm5kc19fMDA2X1xuICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHJlcHJlc2VudGF0aW9uID0gRm4uaWRcbiAgZW5kXG5lbmRcblxubW9kdWxlIFNlYXJjaF9wYXR0ZXJuX2hlbHBlciA9IHN0cnVjdFxuICBtb2R1bGUgU2VhcmNoX3BhdHRlcm4gPSBTZWFyY2hfcGF0dGVybjBcbmVuZFxuXG5vcGVuIFNlYXJjaF9wYXR0ZXJuX2hlbHBlclxuXG5sZXQgc3Vic3RyX2luZGV4X2dlbiB+Y2FzZV9zZW5zaXRpdmUgP3BvcyB0IH5wYXR0ZXJuID1cbiAgU2VhcmNoX3BhdHRlcm4uaW5kZXggP3BvcyAoU2VhcmNoX3BhdHRlcm4uY3JlYXRlIH5jYXNlX3NlbnNpdGl2ZSBwYXR0ZXJuKSB+aW5fOnRcbjs7XG5cbmxldCBzdWJzdHJfaW5kZXhfZXhuX2dlbiB+Y2FzZV9zZW5zaXRpdmUgP3BvcyB0IH5wYXR0ZXJuID1cbiAgU2VhcmNoX3BhdHRlcm4uaW5kZXhfZXhuID9wb3MgKFNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSB+Y2FzZV9zZW5zaXRpdmUgcGF0dGVybikgfmluXzp0XG47O1xuXG5sZXQgc3Vic3RyX2luZGV4X2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlIHQgfm1heV9vdmVybGFwIH5wYXR0ZXJuID1cbiAgU2VhcmNoX3BhdHRlcm4uaW5kZXhfYWxsXG4gICAgKFNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSB+Y2FzZV9zZW5zaXRpdmUgcGF0dGVybilcbiAgICB+bWF5X292ZXJsYXBcbiAgICB+aW5fOnRcbjs7XG5cbmxldCBzdWJzdHJfcmVwbGFjZV9maXJzdF9nZW4gfmNhc2Vfc2Vuc2l0aXZlID9wb3MgdCB+cGF0dGVybiA9XG4gIFNlYXJjaF9wYXR0ZXJuLnJlcGxhY2VfZmlyc3QgP3BvcyAoU2VhcmNoX3BhdHRlcm4uY3JlYXRlIH5jYXNlX3NlbnNpdGl2ZSBwYXR0ZXJuKSB+aW5fOnRcbjs7XG5cbmxldCBzdWJzdHJfcmVwbGFjZV9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZSB0IH5wYXR0ZXJuID1cbiAgU2VhcmNoX3BhdHRlcm4ucmVwbGFjZV9hbGwgKFNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSB+Y2FzZV9zZW5zaXRpdmUgcGF0dGVybikgfmluXzp0XG47O1xuXG5sZXQgaXNfc3Vic3RyaW5nX2dlbiB+Y2FzZV9zZW5zaXRpdmUgdCB+c3Vic3RyaW5nID1cbiAgT3B0aW9uLmlzX3NvbWUgKHN1YnN0cl9pbmRleF9nZW4gdCB+cGF0dGVybjpzdWJzdHJpbmcgfmNhc2Vfc2Vuc2l0aXZlKVxuOztcblxubGV0IHN1YnN0cl9pbmRleCA9IHN1YnN0cl9pbmRleF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcbmxldCBzdWJzdHJfaW5kZXhfZXhuID0gc3Vic3RyX2luZGV4X2V4bl9nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcbmxldCBzdWJzdHJfaW5kZXhfYWxsID0gc3Vic3RyX2luZGV4X2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcbmxldCBzdWJzdHJfcmVwbGFjZV9maXJzdCA9IHN1YnN0cl9yZXBsYWNlX2ZpcnN0X2dlbiB+Y2FzZV9zZW5zaXRpdmU6dHJ1ZVxubGV0IHN1YnN0cl9yZXBsYWNlX2FsbCA9IHN1YnN0cl9yZXBsYWNlX2FsbF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOnRydWVcbmxldCBpc19zdWJzdHJpbmcgPSBpc19zdWJzdHJpbmdfZ2VuIH5jYXNlX3NlbnNpdGl2ZTp0cnVlXG5cbmxldCBpc19zdWJzdHJpbmdfYXRfZ2VuID1cbiAgbGV0IHJlYyBsb29wIH5zdHIgfnN0cl9wb3MgfnN1YiB+c3ViX3BvcyB+c3ViX2xlbiB+Y2hhcl9lcXVhbCA9XG4gICAgaWYgc3ViX3BvcyA9IHN1Yl9sZW5cbiAgICB0aGVuIHRydWVcbiAgICBlbHNlIGlmIGNoYXJfZXF1YWwgKHVuc2FmZV9nZXQgc3RyIHN0cl9wb3MpICh1bnNhZmVfZ2V0IHN1YiBzdWJfcG9zKVxuICAgIHRoZW4gbG9vcCB+c3RyIH5zdHJfcG9zOihzdHJfcG9zICsgMSkgfnN1YiB+c3ViX3Bvczooc3ViX3BvcyArIDEpIH5zdWJfbGVuIH5jaGFyX2VxdWFsXG4gICAgZWxzZSBmYWxzZVxuICBpblxuICBmdW4gc3RyIH5wb3M6c3RyX3BvcyB+c3Vic3RyaW5nOnN1YiB+Y2hhcl9lcXVhbCAtPlxuICAgIGxldCBzdHJfbGVuID0gbGVuZ3RoIHN0ciBpblxuICAgIGxldCBzdWJfbGVuID0gbGVuZ3RoIHN1YiBpblxuICAgIGlmIHN0cl9wb3MgPCAwIHx8IHN0cl9wb3MgPiBzdHJfbGVuXG4gICAgdGhlblxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiU3RyaW5nLmlzX3N1YnN0cmluZ19hdDogaW52YWxpZCBpbmRleCAlZCBmb3Igc3RyaW5nIG9mIGxlbmd0aCAlZFwiXG4gICAgICAgIHN0cl9wb3NcbiAgICAgICAgc3RyX2xlblxuICAgICAgICAoKTtcbiAgICBzdHJfcG9zICsgc3ViX2xlbiA8PSBzdHJfbGVuXG4gICAgJiYgbG9vcCB+c3RyIH5zdHJfcG9zIH5zdWIgfnN1Yl9wb3M6MCB+c3ViX2xlbiB+Y2hhcl9lcXVhbFxuOztcblxubGV0IGlzX3N1ZmZpeF9nZW4gc3RyaW5nIH5zdWZmaXggfmNoYXJfZXF1YWwgPVxuICBsZXQgc3RyaW5nX2xlbiA9IGxlbmd0aCBzdHJpbmcgaW5cbiAgbGV0IHN1ZmZpeF9sZW4gPSBsZW5ndGggc3VmZml4IGluXG4gIHN0cmluZ19sZW4gPj0gc3VmZml4X2xlblxuICAmJiBpc19zdWJzdHJpbmdfYXRfZ2VuXG4gICAgICAgc3RyaW5nXG4gICAgICAgfnBvczooc3RyaW5nX2xlbiAtIHN1ZmZpeF9sZW4pXG4gICAgICAgfnN1YnN0cmluZzpzdWZmaXhcbiAgICAgICB+Y2hhcl9lcXVhbFxuOztcblxubGV0IGlzX3ByZWZpeF9nZW4gc3RyaW5nIH5wcmVmaXggfmNoYXJfZXF1YWwgPVxuICBsZXQgc3RyaW5nX2xlbiA9IGxlbmd0aCBzdHJpbmcgaW5cbiAgbGV0IHByZWZpeF9sZW4gPSBsZW5ndGggcHJlZml4IGluXG4gIHN0cmluZ19sZW4gPj0gcHJlZml4X2xlblxuICAmJiBpc19zdWJzdHJpbmdfYXRfZ2VuIHN0cmluZyB+cG9zOjAgfnN1YnN0cmluZzpwcmVmaXggfmNoYXJfZXF1YWxcbjs7XG5cbm1vZHVsZSBDYXNlbGVzcyA9IHN0cnVjdFxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IHN0cmluZyBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gICAgbGV0IHRfb2Zfc2V4cCA9IChzdHJpbmdfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICAgIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9zdHJpbmcgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBzdHJpbmdfc2V4cF9ncmFtbWFyXG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IGNoYXJfY29tcGFyZV9jYXNlbGVzcyBjMSBjMiA9IENoYXIuY29tcGFyZSAoQ2hhci5sb3dlcmNhc2UgYzEpIChDaGFyLmxvd2VyY2FzZSBjMilcblxuICAgIGxldCByZWMgY29tcGFyZV9sb29wIH5wb3MgfnN0cmluZzEgfmxlbjEgfnN0cmluZzIgfmxlbjIgPVxuICAgICAgaWYgcG9zID0gbGVuMVxuICAgICAgdGhlbiBpZiBwb3MgPSBsZW4yIHRoZW4gMCBlbHNlIC0xXG4gICAgICBlbHNlIGlmIHBvcyA9IGxlbjJcbiAgICAgIHRoZW4gMVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBjID0gY2hhcl9jb21wYXJlX2Nhc2VsZXNzICh1bnNhZmVfZ2V0IHN0cmluZzEgcG9zKSAodW5zYWZlX2dldCBzdHJpbmcyIHBvcykgaW5cbiAgICAgICAgbWF0Y2ggYyB3aXRoXG4gICAgICAgIHwgMCAtPiBjb21wYXJlX2xvb3AgfnBvczoocG9zICsgMSkgfnN0cmluZzEgfmxlbjEgfnN0cmluZzIgfmxlbjJcbiAgICAgICAgfCBfIC0+IGMpXG4gICAgOztcblxuICAgIGxldCBjb21wYXJlIHN0cmluZzEgc3RyaW5nMiA9XG4gICAgICBpZiBwaHlzX2VxdWFsIHN0cmluZzEgc3RyaW5nMlxuICAgICAgdGhlbiAwXG4gICAgICBlbHNlXG4gICAgICAgIGNvbXBhcmVfbG9vcFxuICAgICAgICAgIH5wb3M6MFxuICAgICAgICAgIH5zdHJpbmcxXG4gICAgICAgICAgfmxlbjE6KFN0cmluZy5sZW5ndGggc3RyaW5nMSlcbiAgICAgICAgICB+c3RyaW5nMlxuICAgICAgICAgIH5sZW4yOihTdHJpbmcubGVuZ3RoIHN0cmluZzIpXG4gICAgOztcblxuICAgIGxldCBoYXNoX2ZvbGRfdCBzdGF0ZSB0ID1cbiAgICAgIGxldCBsZW4gPSBsZW5ndGggdCBpblxuICAgICAgbGV0IHN0YXRlID0gcmVmIChoYXNoX2ZvbGRfaW50IHN0YXRlIGxlbikgaW5cbiAgICAgIGZvciBwb3MgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICAgICAgc3RhdGUgOj0gaGFzaF9mb2xkX2NoYXIgIXN0YXRlIChDaGFyLmxvd2VyY2FzZSAodW5zYWZlX2dldCB0IHBvcykpXG4gICAgICBkb25lO1xuICAgICAgIXN0YXRlXG4gICAgOztcblxuICAgIGxldCBoYXNoIHQgPSBIYXNoLnJ1biBoYXNoX2ZvbGRfdCB0XG4gICAgbGV0IGlzX3N1ZmZpeCBzIH5zdWZmaXggPSBpc19zdWZmaXhfZ2VuIHMgfnN1ZmZpeCB+Y2hhcl9lcXVhbDpDaGFyLkNhc2VsZXNzLmVxdWFsXG4gICAgbGV0IGlzX3ByZWZpeCBzIH5wcmVmaXggPSBpc19wcmVmaXhfZ2VuIHMgfnByZWZpeCB+Y2hhcl9lcXVhbDpDaGFyLkNhc2VsZXNzLmVxdWFsXG4gICAgbGV0IHN1YnN0cl9pbmRleCA9IHN1YnN0cl9pbmRleF9nZW4gfmNhc2Vfc2Vuc2l0aXZlOmZhbHNlXG4gICAgbGV0IHN1YnN0cl9pbmRleF9leG4gPSBzdWJzdHJfaW5kZXhfZXhuX2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgc3Vic3RyX2luZGV4X2FsbCA9IHN1YnN0cl9pbmRleF9hbGxfZ2VuIH5jYXNlX3NlbnNpdGl2ZTpmYWxzZVxuICAgIGxldCBzdWJzdHJfcmVwbGFjZV9maXJzdCA9IHN1YnN0cl9yZXBsYWNlX2ZpcnN0X2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgc3Vic3RyX3JlcGxhY2VfYWxsID0gc3Vic3RyX3JlcGxhY2VfYWxsX2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgaXNfc3Vic3RyaW5nID0gaXNfc3Vic3RyaW5nX2dlbiB+Y2FzZV9zZW5zaXRpdmU6ZmFsc2VcbiAgICBsZXQgaXNfc3Vic3RyaW5nX2F0ID0gaXNfc3Vic3RyaW5nX2F0X2dlbiB+Y2hhcl9lcXVhbDpDaGFyLkNhc2VsZXNzLmVxdWFsXG4gIGVuZFxuXG4gIGluY2x1ZGUgVFxuICBpbmNsdWRlIENvbXBhcmFibGUuTWFrZSAoVClcbmVuZFxuXG5sZXQgb2Zfc3RyaW5nID0gRm4uaWRcbmxldCB0b19zdHJpbmcgPSBGbi5pZFxuXG5sZXQgaW5pdCBuIH5mID1cbiAgaWYgbiA8IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJTdHJpbmcuaW5pdCAlZFwiIG4gKCk7XG4gIGxldCB0ID0gQnl0ZXMuY3JlYXRlIG4gaW5cbiAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgQnl0ZXMuc2V0IHQgaSAoZiBpKVxuICBkb25lO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnRcbjs7XG5cbmxldCB0b19saXN0IHMgPVxuICBsZXQgcmVjIGxvb3AgYWNjIGkgPSBpZiBpIDwgMCB0aGVuIGFjYyBlbHNlIGxvb3AgKHMuW2ldIDo6IGFjYykgKGkgLSAxKSBpblxuICBsb29wIFtdIChsZW5ndGggcyAtIDEpXG47O1xuXG5sZXQgdG9fbGlzdF9yZXYgcyA9XG4gIGxldCBsZW4gPSBsZW5ndGggcyBpblxuICBsZXQgcmVjIGxvb3AgYWNjIGkgPSBpZiBpID0gbGVuIHRoZW4gYWNjIGVsc2UgbG9vcCAocy5baV0gOjogYWNjKSAoaSArIDEpIGluXG4gIGxvb3AgW10gMFxuOztcblxubGV0IHJldiB0ID1cbiAgbGV0IGxlbiA9IGxlbmd0aCB0IGluXG4gIGxldCByZXMgPSBCeXRlcy5jcmVhdGUgbGVuIGluXG4gIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgdW5zYWZlX3NldCByZXMgaSAodW5zYWZlX2dldCB0IChsZW4gLSAxIC0gaSkpXG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6cmVzXG47O1xuXG4oKiogRWZmaWNpZW50IHN0cmluZyBzcGxpdHRpbmcgKilcblxubGV0IGxzcGxpdDJfZXhuID1cbiAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU3RyaW5nLmxzcGxpdDJfZXhuOiBub3QgZm91bmRcIikgaW5cbiAgbGV0IGxzcGxpdDJfZXhuIGxpbmUgfm9uOmRlbGltID1cbiAgICBsZXQgcG9zID0gaW5kZXhfZXhuX2ludGVybmFsIGxpbmUgfm5vdF9mb3VuZCBkZWxpbSBpblxuICAgIHN1YiBsaW5lIH5wb3M6MCB+bGVuOnBvcywgc3ViIGxpbmUgfnBvczoocG9zICsgMSkgfmxlbjoobGVuZ3RoIGxpbmUgLSBwb3MgLSAxKVxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIGxzcGxpdDJfZXhuXG47O1xuXG5sZXQgcnNwbGl0Ml9leG4gPVxuICBsZXQgbm90X2ZvdW5kID0gTm90X2ZvdW5kX3MgKEF0b20gXCJTdHJpbmcucnNwbGl0Ml9leG46IG5vdCBmb3VuZFwiKSBpblxuICBsZXQgcnNwbGl0Ml9leG4gbGluZSB+b246ZGVsaW0gPVxuICAgIGxldCBwb3MgPSByaW5kZXhfZXhuX2ludGVybmFsIGxpbmUgfm5vdF9mb3VuZCBkZWxpbSBpblxuICAgIHN1YiBsaW5lIH5wb3M6MCB+bGVuOnBvcywgc3ViIGxpbmUgfnBvczoocG9zICsgMSkgfmxlbjoobGVuZ3RoIGxpbmUgLSBwb3MgLSAxKVxuICBpblxuICAoKiBuYW1lZCB0byBwcmVzZXJ2ZSBzeW1ib2wgaW4gY29tcGlsZWQgYmluYXJ5ICopXG4gIHJzcGxpdDJfZXhuXG47O1xuXG5sZXQgbHNwbGl0MiBsaW5lIH5vbiA9XG4gIHRyeSBTb21lIChsc3BsaXQyX2V4biBsaW5lIH5vbikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5sZXQgcnNwbGl0MiBsaW5lIH5vbiA9XG4gIHRyeSBTb21lIChyc3BsaXQyX2V4biBsaW5lIH5vbikgd2l0aFxuICB8IE5vdF9mb3VuZF9zIF8gfCBDYW1sLk5vdF9mb3VuZCAtPiBOb25lXG47O1xuXG5sZXQgcmVjIGNoYXJfbGlzdF9tZW0gbCAoYyA6IGNoYXIpID1cbiAgbWF0Y2ggbCB3aXRoXG4gIHwgW10gLT4gZmFsc2VcbiAgfCBoZCA6OiB0bCAtPiBDaGFyLmVxdWFsIGhkIGMgfHwgY2hhcl9saXN0X21lbSB0bCBjXG47O1xuXG5sZXQgc3BsaXRfZ2VuIHN0ciB+b24gPVxuICBsZXQgaXNfZGVsaW0gPVxuICAgIG1hdGNoIG9uIHdpdGhcbiAgICB8IGBjaGFyIGMnIC0+IGZ1biBjIC0+IENoYXIuZXF1YWwgYyBjJ1xuICAgIHwgYGNoYXJfbGlzdCBsIC0+IGZ1biBjIC0+IGNoYXJfbGlzdF9tZW0gbCBjXG4gIGluXG4gIGxldCBsZW4gPSBsZW5ndGggc3RyIGluXG4gIGxldCByZWMgbG9vcCBhY2MgbGFzdF9wb3MgcG9zID1cbiAgICBpZiBwb3MgPSAtMVxuICAgIHRoZW4gc3ViIHN0ciB+cG9zOjAgfmxlbjpsYXN0X3BvcyA6OiBhY2NcbiAgICBlbHNlIGlmIGlzX2RlbGltIHN0ci5bcG9zXVxuICAgIHRoZW4gKFxuICAgICAgbGV0IHBvczEgPSBwb3MgKyAxIGluXG4gICAgICBsZXQgc3ViX3N0ciA9IHN1YiBzdHIgfnBvczpwb3MxIH5sZW46KGxhc3RfcG9zIC0gcG9zMSkgaW5cbiAgICAgIGxvb3AgKHN1Yl9zdHIgOjogYWNjKSBwb3MgKHBvcyAtIDEpKVxuICAgIGVsc2UgbG9vcCBhY2MgbGFzdF9wb3MgKHBvcyAtIDEpXG4gIGluXG4gIGxvb3AgW10gbGVuIChsZW4gLSAxKVxuOztcblxubGV0IHNwbGl0IHN0ciB+b24gPSBzcGxpdF9nZW4gc3RyIH5vbjooYGNoYXIgb24pXG5sZXQgc3BsaXRfb25fY2hhcnMgc3RyIH5vbjpjaGFycyA9IHNwbGl0X2dlbiBzdHIgfm9uOihgY2hhcl9saXN0IGNoYXJzKVxuXG5sZXQgc3BsaXRfbGluZXMgPVxuICBsZXQgYmFja191cF9hdF9uZXdsaW5lIH50IH5wb3MgfmVvbCA9XG4gICAgcG9zIDo9ICFwb3MgLSBpZiAhcG9zID4gMCAmJiBDaGFyLmVxdWFsIHQuWyFwb3MgLSAxXSAnXFxyJyB0aGVuIDIgZWxzZSAxO1xuICAgIGVvbCA6PSAhcG9zICsgMVxuICBpblxuICBmdW4gdCAtPlxuICAgIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgICBpZiBuID0gMFxuICAgIHRoZW4gW11cbiAgICBlbHNlIChcbiAgICAgICgqIEludmFyaWFudDogWy0xIDw9IHBvcyA8IGVvbF0uICopXG4gICAgICBsZXQgcG9zID0gcmVmIChuIC0gMSkgaW5cbiAgICAgIGxldCBlb2wgPSByZWYgbiBpblxuICAgICAgbGV0IGFjID0gcmVmIFtdIGluXG4gICAgICAoKiBXZSB0cmVhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgc3BlY2lhbGx5LCBiZWNhdXNlIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIGFcbiAgICAgICAgIG5ld2xpbmUsIHdlIGRvbid0IHdhbnQgYW4gZXh0cmEgZW1wdHkgc3RyaW5nIGF0IHRoZSBlbmQgb2YgdGhlIG91dHB1dC4gKilcbiAgICAgIGlmIENoYXIuZXF1YWwgdC5bIXBvc10gJ1xcbicgdGhlbiBiYWNrX3VwX2F0X25ld2xpbmUgfnQgfnBvcyB+ZW9sO1xuICAgICAgd2hpbGUgIXBvcyA+PSAwIGRvXG4gICAgICAgIGlmIENoYXIuKCA8PiApIHQuWyFwb3NdICdcXG4nXG4gICAgICAgIHRoZW4gZGVjciBwb3NcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgKCogQmVjYXVzZSBbcG9zIDwgZW9sXSwgd2Uga25vdyB0aGF0IFtzdGFydCA8PSBlb2xdLiAqKVxuICAgICAgICAgIGxldCBzdGFydCA9ICFwb3MgKyAxIGluXG4gICAgICAgICAgYWMgOj0gc3ViIHQgfnBvczpzdGFydCB+bGVuOighZW9sIC0gc3RhcnQpIDo6ICFhYztcbiAgICAgICAgICBiYWNrX3VwX2F0X25ld2xpbmUgfnQgfnBvcyB+ZW9sKVxuICAgICAgZG9uZTtcbiAgICAgIHN1YiB0IH5wb3M6MCB+bGVuOiFlb2wgOjogIWFjKVxuOztcblxubGV0IGlzX3N1ZmZpeCBzIH5zdWZmaXggPSBpc19zdWZmaXhfZ2VuIHMgfnN1ZmZpeCB+Y2hhcl9lcXVhbDpDaGFyLmVxdWFsXG5sZXQgaXNfcHJlZml4IHMgfnByZWZpeCA9IGlzX3ByZWZpeF9nZW4gcyB+cHJlZml4IH5jaGFyX2VxdWFsOkNoYXIuZXF1YWxcblxubGV0IGlzX3N1YnN0cmluZ19hdCBzIH5wb3MgfnN1YnN0cmluZyA9XG4gIGlzX3N1YnN0cmluZ19hdF9nZW4gcyB+cG9zIH5zdWJzdHJpbmcgfmNoYXJfZXF1YWw6Q2hhci5lcXVhbFxuOztcblxubGV0IHdyYXBfc3ViX24gdCBuIH5uYW1lIH5wb3MgfmxlbiB+b25fZXJyb3IgPVxuICBpZiBuIDwgMFxuICB0aGVuIGludmFsaWRfYXJnIChuYW1lIF4gXCIgZXhwZWN0aW5nIG5vbm5lZ2F0aXZlIGFyZ3VtZW50XCIpXG4gIGVsc2UgKFxuICAgIHRyeSBzdWIgdCB+cG9zIH5sZW4gd2l0aFxuICAgIHwgXyAtPiBvbl9lcnJvcilcbjs7XG5cbmxldCBkcm9wX3ByZWZpeCB0IG4gPVxuICB3cmFwX3N1Yl9uIH5uYW1lOlwiZHJvcF9wcmVmaXhcIiB0IG4gfnBvczpuIH5sZW46KGxlbmd0aCB0IC0gbikgfm9uX2Vycm9yOlwiXCJcbjs7XG5cbmxldCBkcm9wX3N1ZmZpeCB0IG4gPVxuICB3cmFwX3N1Yl9uIH5uYW1lOlwiZHJvcF9zdWZmaXhcIiB0IG4gfnBvczowIH5sZW46KGxlbmd0aCB0IC0gbikgfm9uX2Vycm9yOlwiXCJcbjs7XG5cbmxldCBwcmVmaXggdCBuID0gd3JhcF9zdWJfbiB+bmFtZTpcInByZWZpeFwiIHQgbiB+cG9zOjAgfmxlbjpuIH5vbl9lcnJvcjp0XG5sZXQgc3VmZml4IHQgbiA9IHdyYXBfc3ViX24gfm5hbWU6XCJzdWZmaXhcIiB0IG4gfnBvczoobGVuZ3RoIHQgLSBuKSB+bGVuOm4gfm9uX2Vycm9yOnRcblxubGV0IGxmaW5kaSA/KHBvcyA9IDApIHQgfmYgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGxldCByZWMgbG9vcCBpID0gaWYgaSA9IG4gdGhlbiBOb25lIGVsc2UgaWYgZiBpIHQuW2ldIHRoZW4gU29tZSBpIGVsc2UgbG9vcCAoaSArIDEpIGluXG4gIGxvb3AgcG9zXG47O1xuXG5sZXQgZmluZCB0IH5mID1cbiAgbWF0Y2ggbGZpbmRpIHQgfmY6KGZ1biBfIGMgLT4gZiBjKSB3aXRoXG4gIHwgTm9uZSAtPiBOb25lXG4gIHwgU29tZSBpIC0+IFNvbWUgdC5baV1cbjs7XG5cbmxldCBmaW5kX21hcCB0IH5mID1cbiAgbGV0IG4gPSBsZW5ndGggdCBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgaWYgaSA9IG5cbiAgICB0aGVuIE5vbmVcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGYgdC5baV0gd2l0aFxuICAgICAgfCBOb25lIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgfCBTb21lIF8gYXMgcmVzIC0+IHJlcylcbiAgaW5cbiAgbG9vcCAwXG47O1xuXG5sZXQgcmZpbmRpID9wb3MgdCB+ZiA9XG4gIGxldCByZWMgbG9vcCBpID0gaWYgaSA8IDAgdGhlbiBOb25lIGVsc2UgaWYgZiBpIHQuW2ldIHRoZW4gU29tZSBpIGVsc2UgbG9vcCAoaSAtIDEpIGluXG4gIGxldCBwb3MgPVxuICAgIG1hdGNoIHBvcyB3aXRoXG4gICAgfCBTb21lIHBvcyAtPiBwb3NcbiAgICB8IE5vbmUgLT4gbGVuZ3RoIHQgLSAxXG4gIGluXG4gIGxvb3AgcG9zXG47O1xuXG5sZXQgbGFzdF9ub25fZHJvcCB+ZHJvcCB0ID0gcmZpbmRpIHQgfmY6KGZ1biBfIGMgLT4gbm90IChkcm9wIGMpKVxuXG5sZXQgcnN0cmlwID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCA9XG4gIG1hdGNoIGxhc3Rfbm9uX2Ryb3AgdCB+ZHJvcCB3aXRoXG4gIHwgTm9uZSAtPiBcIlwiXG4gIHwgU29tZSBpIC0+IGlmIGkgPSBsZW5ndGggdCAtIDEgdGhlbiB0IGVsc2UgcHJlZml4IHQgKGkgKyAxKVxuOztcblxubGV0IGZpcnN0X25vbl9kcm9wIH5kcm9wIHQgPSBsZmluZGkgdCB+ZjooZnVuIF8gYyAtPiBub3QgKGRyb3AgYykpXG5cbmxldCBsc3RyaXAgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0ID1cbiAgbWF0Y2ggZmlyc3Rfbm9uX2Ryb3AgdCB+ZHJvcCB3aXRoXG4gIHwgTm9uZSAtPiBcIlwiXG4gIHwgU29tZSAwIC0+IHRcbiAgfCBTb21lIG4gLT4gZHJvcF9wcmVmaXggdCBuXG47O1xuXG4oKiBbc3RyaXAgdF0gY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgW2xzdHJpcCAocnN0cmlwIHQpXS4gIFRoZSBpbXBsZW1lbnRhdGlvblxuICAgYmVsb3cgc2F2ZXMgKGF0IGxlYXN0KSBhIGZhY3RvciBvZiB0d28gYWxsb2NhdGlvbiwgYnkgb25seSBhbGxvY2F0aW5nIHRoZVxuICAgZmluYWwgcmVzdWx0LiAgVGhpcyBhbHNvIHNhdmVzIHNvbWUgYW1vdW50IG9mIHRpbWUuICopXG5sZXQgc3RyaXAgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0ID1cbiAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gIGlmIGxlbmd0aCA9IDAgfHwgbm90IChkcm9wIHQuWzBdIHx8IGRyb3AgdC5bbGVuZ3RoIC0gMV0pXG4gIHRoZW4gdFxuICBlbHNlIChcbiAgICBtYXRjaCBmaXJzdF9ub25fZHJvcCB0IH5kcm9wIHdpdGhcbiAgICB8IE5vbmUgLT4gXCJcIlxuICAgIHwgU29tZSBmaXJzdCAtPlxuICAgICAgKG1hdGNoIGxhc3Rfbm9uX2Ryb3AgdCB+ZHJvcCB3aXRoXG4gICAgICAgfCBOb25lIC0+IGFzc2VydCBmYWxzZVxuICAgICAgIHwgU29tZSBsYXN0IC0+IHN1YiB0IH5wb3M6Zmlyc3QgfmxlbjoobGFzdCAtIGZpcnN0ICsgMSkpKVxuOztcblxubGV0IG1hcGkgdCB+ZiA9XG4gIGxldCBsID0gbGVuZ3RoIHQgaW5cbiAgbGV0IHQnID0gQnl0ZXMuY3JlYXRlIGwgaW5cbiAgZm9yIGkgPSAwIHRvIGwgLSAxIGRvXG4gICAgQnl0ZXMudW5zYWZlX3NldCB0JyBpIChmIGkgdC5baV0pXG4gIGRvbmU7XG4gIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6dCdcbjs7XG5cbigqIHJlcGVhdGVkIGNvZGUgdG8gYXZvaWQgcmVxdWlyaW5nIGFuIGV4dHJhIGFsbG9jYXRpb24gZm9yIGEgY2xvc3VyZSBvbiBlYWNoIGNhbGwuICopXG5sZXQgbWFwIHQgfmYgPVxuICBsZXQgbCA9IGxlbmd0aCB0IGluXG4gIGxldCB0JyA9IEJ5dGVzLmNyZWF0ZSBsIGluXG4gIGZvciBpID0gMCB0byBsIC0gMSBkb1xuICAgIEJ5dGVzLnVuc2FmZV9zZXQgdCcgaSAoZiB0LltpXSlcbiAgZG9uZTtcbiAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTp0J1xuOztcblxubGV0IHRvX2FycmF5IHMgPSBBcnJheS5pbml0IChsZW5ndGggcykgfmY6KGZ1biBpIC0+IHMuW2ldKVxuXG5sZXQgZXhpc3RzID1cbiAgbGV0IHJlYyBsb29wIHMgaSB+bGVuIH5mID0gaSA8IGxlbiAmJiAoZiBzLltpXSB8fCBsb29wIHMgKGkgKyAxKSB+bGVuIH5mKSBpblxuICBmdW4gcyB+ZiAtPiBsb29wIHMgMCB+bGVuOihsZW5ndGggcykgfmZcbjs7XG5cbmxldCBmb3JfYWxsID1cbiAgbGV0IHJlYyBsb29wIHMgaSB+bGVuIH5mID0gaSA9IGxlbiB8fCAoZiBzLltpXSAmJiBsb29wIHMgKGkgKyAxKSB+bGVuIH5mKSBpblxuICBmdW4gcyB+ZiAtPiBsb29wIHMgMCB+bGVuOihsZW5ndGggcykgfmZcbjs7XG5cbmxldCBmb2xkID1cbiAgbGV0IHJlYyBsb29wIHQgaSBhYyB+ZiB+bGVuID1cbiAgICBpZiBpID0gbGVuIHRoZW4gYWMgZWxzZSBsb29wIHQgKGkgKyAxKSAoZiBhYyB0LltpXSkgfmYgfmxlblxuICBpblxuICBmdW4gdCB+aW5pdCB+ZiAtPiBsb29wIHQgMCBpbml0IH5mIH5sZW46KGxlbmd0aCB0KVxuOztcblxubGV0IGZvbGRpID1cbiAgbGV0IHJlYyBsb29wIHQgaSBhYyB+ZiB+bGVuID1cbiAgICBpZiBpID0gbGVuIHRoZW4gYWMgZWxzZSBsb29wIHQgKGkgKyAxKSAoZiBpIGFjIHQuW2ldKSB+ZiB+bGVuXG4gIGluXG4gIGZ1biB0IH5pbml0IH5mIC0+IGxvb3AgdCAwIGluaXQgfmYgfmxlbjoobGVuZ3RoIHQpXG47O1xuXG5sZXQgaXRlcmkgdCB+ZiA9XG4gIGZvciBpID0gMCB0byBsZW5ndGggdCAtIDEgZG9cbiAgICBmIGkgKHVuc2FmZV9nZXQgdCBpKVxuICBkb25lXG47O1xuXG5sZXQgY291bnQgdCB+ZiA9IENvbnRhaW5lci5jb3VudCB+Zm9sZCB0IH5mXG5sZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG5sZXQgbWluX2VsdCB0ID0gQ29udGFpbmVyLm1pbl9lbHQgfmZvbGQgdFxubGV0IG1heF9lbHQgdCA9IENvbnRhaW5lci5tYXhfZWx0IH5mb2xkIHRcbmxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbmxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBDb250YWluZXIuZm9sZF91bnRpbCB+Zm9sZCB+aW5pdCB+ZiB0XG5sZXQgZmluZF9tYXBpIHQgfmYgPSBJbmRleGVkX2NvbnRhaW5lci5maW5kX21hcGkgfml0ZXJpIHQgfmZcbmxldCBmaW5kaSB0IH5mID0gSW5kZXhlZF9jb250YWluZXIuZmluZGkgfml0ZXJpIHQgfmZcbmxldCBjb3VudGkgdCB+ZiA9IEluZGV4ZWRfY29udGFpbmVyLmNvdW50aSB+Zm9sZGkgdCB+ZlxubGV0IGZvcl9hbGxpIHQgfmYgPSBJbmRleGVkX2NvbnRhaW5lci5mb3JfYWxsaSB+aXRlcmkgdCB+ZlxubGV0IGV4aXN0c2kgdCB+ZiA9IEluZGV4ZWRfY29udGFpbmVyLmV4aXN0c2kgfml0ZXJpIHQgfmZcblxubGV0IG1lbSA9XG4gIGxldCByZWMgbG9vcCB0IGMgfnBvczppIH5sZW4gPVxuICAgIGkgPCBsZW4gJiYgKENoYXIuZXF1YWwgYyAodW5zYWZlX2dldCB0IGkpIHx8IGxvb3AgdCBjIH5wb3M6KGkgKyAxKSB+bGVuKVxuICBpblxuICBmdW4gdCBjIC0+IGxvb3AgdCBjIH5wb3M6MCB+bGVuOihsZW5ndGggdClcbjs7XG5cbmxldCB0ciB+dGFyZ2V0IH5yZXBsYWNlbWVudCBzID1cbiAgaWYgQ2hhci5lcXVhbCB0YXJnZXQgcmVwbGFjZW1lbnRcbiAgdGhlbiBzXG4gIGVsc2UgaWYgbWVtIHMgdGFyZ2V0XG4gIHRoZW4gbWFwIHMgfmY6KGZ1biBjIC0+IGlmIENoYXIuZXF1YWwgYyB0YXJnZXQgdGhlbiByZXBsYWNlbWVudCBlbHNlIGMpXG4gIGVsc2Ugc1xuOztcblxubGV0IHRyX211bHRpIH50YXJnZXQgfnJlcGxhY2VtZW50ID1cbiAgaWYgaXNfZW1wdHkgdGFyZ2V0XG4gIHRoZW4gc3RhZ2UgRm4uaWRcbiAgZWxzZSBpZiBpc19lbXB0eSByZXBsYWNlbWVudFxuICB0aGVuIGludmFsaWRfYXJnIFwidHJfbXVsdGkgcmVwbGFjZW1lbnQgaXMgZW1wdHkgc3RyaW5nXCJcbiAgZWxzZSAoXG4gICAgbWF0Y2ggQnl0ZXNfdHIudHJfY3JlYXRlX21hcCB+dGFyZ2V0IH5yZXBsYWNlbWVudCB3aXRoXG4gICAgfCBOb25lIC0+IHN0YWdlIEZuLmlkXG4gICAgfCBTb21lIHRyX21hcCAtPlxuICAgICAgc3RhZ2UgKGZ1biBzIC0+XG4gICAgICAgIGlmIGV4aXN0cyBzIH5mOihmdW4gYyAtPiBDaGFyLiggPD4gKSBjICh1bnNhZmVfZ2V0IHRyX21hcCAoQ2hhci50b19pbnQgYykpKVxuICAgICAgICB0aGVuIG1hcCBzIH5mOihmdW4gYyAtPiB1bnNhZmVfZ2V0IHRyX21hcCAoQ2hhci50b19pbnQgYykpXG4gICAgICAgIGVsc2UgcykpXG47O1xuXG4oKiBmYXN0IHZlcnNpb24sIGlmIHdlIGV2ZXIgbmVlZCBpdDpcbiAgIHtbXG4gICAgIGxldCBjb25jYXRfYXJyYXkgfnNlcCBhciA9XG4gICAgICAgbGV0IGFyX2xlbiA9IEFycmF5Lmxlbmd0aCBhciBpblxuICAgICAgIGlmIGFyX2xlbiA9IDAgdGhlbiBcIlwiXG4gICAgICAgZWxzZVxuICAgICAgICAgbGV0IHNlcF9sZW4gPSBsZW5ndGggc2VwIGluXG4gICAgICAgICBsZXQgcmVzX2xlbl9yZWYgPSByZWYgKHNlcF9sZW4gKiAoYXJfbGVuIC0gMSkpIGluXG4gICAgICAgICBmb3IgaSA9IDAgdG8gYXJfbGVuIC0gMSBkb1xuICAgICAgICAgICByZXNfbGVuX3JlZiA6PSAhcmVzX2xlbl9yZWYgKyBsZW5ndGggYXIuKGkpXG4gICAgICAgICBkb25lO1xuICAgICAgICAgbGV0IHJlcyA9IGNyZWF0ZSAhcmVzX2xlbl9yZWYgaW5cbiAgICAgICAgIGxldCBzdHJfMCA9IGFyLigwKSBpblxuICAgICAgICAgbGV0IGxlbl8wID0gbGVuZ3RoIHN0cl8wIGluXG4gICAgICAgICBibGl0IH5zcmM6c3RyXzAgfnNyY19wb3M6MCB+ZHN0OnJlcyB+ZHN0X3BvczowIH5sZW46bGVuXzA7XG4gICAgICAgICBsZXQgcG9zX3JlZiA9IHJlZiBsZW5fMCBpblxuICAgICAgICAgZm9yIGkgPSAxIHRvIGFyX2xlbiAtIDEgZG9cbiAgICAgICAgICAgbGV0IHBvcyA9ICFwb3NfcmVmIGluXG4gICAgICAgICAgIGJsaXQgfnNyYzpzZXAgfnNyY19wb3M6MCB+ZHN0OnJlcyB+ZHN0X3Bvczpwb3MgfmxlbjpzZXBfbGVuO1xuICAgICAgICAgICBsZXQgbmV3X3BvcyA9IHBvcyArIHNlcF9sZW4gaW5cbiAgICAgICAgICAgbGV0IHN0cl9pID0gYXIuKGkpIGluXG4gICAgICAgICAgIGxldCBsZW5faSA9IGxlbmd0aCBzdHJfaSBpblxuICAgICAgICAgICBibGl0IH5zcmM6c3RyX2kgfnNyY19wb3M6MCB+ZHN0OnJlcyB+ZHN0X3BvczpuZXdfcG9zIH5sZW46bGVuX2k7XG4gICAgICAgICAgIHBvc19yZWYgOj0gbmV3X3BvcyArIGxlbl9pXG4gICAgICAgICBkb25lO1xuICAgICAgICAgcmVzXG4gICBdfSAqKVxuXG5sZXQgY29uY2F0X2FycmF5ID9zZXAgYXIgPSBjb25jYXQgP3NlcCAoQXJyYXkudG9fbGlzdCBhcilcbmxldCBjb25jYXRfbWFwID9zZXAgcyB+ZiA9IGNvbmNhdF9hcnJheSA/c2VwIChBcnJheS5tYXAgKHRvX2FycmF5IHMpIH5mKVxuXG4oKiBbZmlsdGVyIHQgZl0gaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGZvbGxvd2luZyBhbGdvcml0aG0uXG5cbiAgIExldCBbbiA9IGxlbmd0aCB0XS5cblxuICAgMS4gRmluZCB0aGUgbG93ZXN0IFtpXSBzdWNoIHRoYXQgW25vdCAoZiB0LltpXSldLlxuXG4gICAyLiBJZiB0aGVyZSBpcyBubyBzdWNoIFtpXSwgdGhlbiByZXR1cm4gW3RdLlxuXG4gICAzLiBJZiB0aGVyZSBpcyBzdWNoIGFuIFtpXSwgYWxsb2NhdGUgYSBzdHJpbmcsIFtvdXRdLCB0byBob2xkIHRoZSByZXN1bHQuICBbb3V0XSBoYXNcbiAgIGxlbmd0aCBbbiAtIDFdLCB3aGljaCBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBvdXRwdXQgc2l6ZSBnaXZlbiB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0XG4gICBvbmUgY2hhcmFjdGVyIG5vdCBzYXRpc2Z5aW5nIFtmXS5cblxuICAgNC4gQ29weSBjaGFyYWN0ZXJzIGF0IGluZGljZXMgMCAuLi4gW2kgLSAxXSBmcm9tIFt0XSB0byBbb3V0XS5cblxuICAgNS4gV2FsayB0aHJvdWdoIGNoYXJhY3RlcnMgYXQgaW5kaWNlcyBbaSsxXSAuLi4gW24tMV0gb2YgW3RdLCBjb3B5aW5nIHRob3NlIHRoYXRcbiAgIHNhdGlzZnkgW2ZdIGZyb20gW3RdIHRvIFtvdXRdLlxuXG4gICA2LiBJZiB3ZSBjb21wbGV0ZWx5IGZpbGxlZCBbb3V0XSwgdGhlbiByZXR1cm4gaXQuICBJZiBub3QsIHJldHVybiB0aGUgcHJlZml4IG9mIFtvdXRdXG4gICB0aGF0IHdlIGRpZCBmaWxsIGluLlxuXG4gICBUaGlzIGFsZ29yaXRobSBoYXMgdGhlIHByb3BlcnR5IHRoYXQgaXQgZG9lc24ndCBhbGxvY2F0ZSBhIG5ldyBzdHJpbmcgaWYgdGhlcmUnc1xuICAgbm90aGluZyB0byBmaWx0ZXIsIHdoaWNoIGlzIGEgY29tbW9uIGNhc2UuICopXG5sZXQgZmlsdGVyIHQgfmYgPVxuICBsZXQgbiA9IGxlbmd0aCB0IGluXG4gIGxldCBpID0gcmVmIDAgaW5cbiAgd2hpbGUgIWkgPCBuICYmIGYgdC5bIWldIGRvXG4gICAgaW5jciBpXG4gIGRvbmU7XG4gIGlmICFpID0gblxuICB0aGVuIHRcbiAgZWxzZSAoXG4gICAgbGV0IG91dCA9IEJ5dGVzLmNyZWF0ZSAobiAtIDEpIGluXG4gICAgQnl0ZXMuYmxpdF9zdHJpbmcgfnNyYzp0IH5zcmNfcG9zOjAgfmRzdDpvdXQgfmRzdF9wb3M6MCB+bGVuOiFpO1xuICAgIGxldCBvdXRfcG9zID0gcmVmICFpIGluXG4gICAgaW5jciBpO1xuICAgIHdoaWxlICFpIDwgbiBkb1xuICAgICAgbGV0IGMgPSB0LlshaV0gaW5cbiAgICAgIGlmIGYgY1xuICAgICAgdGhlbiAoXG4gICAgICAgIEJ5dGVzLnNldCBvdXQgIW91dF9wb3MgYztcbiAgICAgICAgaW5jciBvdXRfcG9zKTtcbiAgICAgIGluY3IgaVxuICAgIGRvbmU7XG4gICAgbGV0IG91dCA9IEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6b3V0IGluXG4gICAgaWYgIW91dF9wb3MgPSBuIC0gMSB0aGVuIG91dCBlbHNlIHN1YiBvdXQgfnBvczowIH5sZW46IW91dF9wb3MpXG47O1xuXG4oKiByZXBlYXRlZCBjb2RlIHRvIGF2b2lkIHJlcXVpcmluZyBhbiBleHRyYSBhbGxvY2F0aW9uIGZvciBhIGNsb3N1cmUgb24gZWFjaCBjYWxsLiAqKVxubGV0IGZpbHRlcmkgdCB+ZiA9XG4gIGxldCBuID0gbGVuZ3RoIHQgaW5cbiAgbGV0IGkgPSByZWYgMCBpblxuICB3aGlsZSAhaSA8IG4gJiYgZiAhaSB0LlshaV0gZG9cbiAgICBpbmNyIGlcbiAgZG9uZTtcbiAgaWYgIWkgPSBuXG4gIHRoZW4gdFxuICBlbHNlIChcbiAgICBsZXQgb3V0ID0gQnl0ZXMuY3JlYXRlIChuIC0gMSkgaW5cbiAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjOnQgfnNyY19wb3M6MCB+ZHN0Om91dCB+ZHN0X3BvczowIH5sZW46IWk7XG4gICAgbGV0IG91dF9wb3MgPSByZWYgIWkgaW5cbiAgICBpbmNyIGk7XG4gICAgd2hpbGUgIWkgPCBuIGRvXG4gICAgICBsZXQgYyA9IHQuWyFpXSBpblxuICAgICAgaWYgZiAhaSBjXG4gICAgICB0aGVuIChcbiAgICAgICAgQnl0ZXMuc2V0IG91dCAhb3V0X3BvcyBjO1xuICAgICAgICBpbmNyIG91dF9wb3MpO1xuICAgICAgaW5jciBpXG4gICAgZG9uZTtcbiAgICBsZXQgb3V0ID0gQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpvdXQgaW5cbiAgICBpZiAhb3V0X3BvcyA9IG4gLSAxIHRoZW4gb3V0IGVsc2Ugc3ViIG91dCB+cG9zOjAgfmxlbjohb3V0X3Bvcylcbjs7XG5cbmxldCBjaG9wX3ByZWZpeCBzIH5wcmVmaXggPVxuICBpZiBpc19wcmVmaXggcyB+cHJlZml4IHRoZW4gU29tZSAoZHJvcF9wcmVmaXggcyAobGVuZ3RoIHByZWZpeCkpIGVsc2UgTm9uZVxuOztcblxubGV0IGNob3BfcHJlZml4X2lmX2V4aXN0cyBzIH5wcmVmaXggPVxuICBpZiBpc19wcmVmaXggcyB+cHJlZml4IHRoZW4gZHJvcF9wcmVmaXggcyAobGVuZ3RoIHByZWZpeCkgZWxzZSBzXG47O1xuXG5sZXQgY2hvcF9wcmVmaXhfZXhuIHMgfnByZWZpeCA9XG4gIG1hdGNoIGNob3BfcHJlZml4IHMgfnByZWZpeCB3aXRoXG4gIHwgU29tZSBzdHIgLT4gc3RyXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZ2YgXCJTdHJpbmcuY2hvcF9wcmVmaXhfZXhuICVTICVTXCIgcyBwcmVmaXggKClcbjs7XG5cbmxldCBjaG9wX3N1ZmZpeCBzIH5zdWZmaXggPVxuICBpZiBpc19zdWZmaXggcyB+c3VmZml4IHRoZW4gU29tZSAoZHJvcF9zdWZmaXggcyAobGVuZ3RoIHN1ZmZpeCkpIGVsc2UgTm9uZVxuOztcblxubGV0IGNob3Bfc3VmZml4X2lmX2V4aXN0cyBzIH5zdWZmaXggPVxuICBpZiBpc19zdWZmaXggcyB+c3VmZml4IHRoZW4gZHJvcF9zdWZmaXggcyAobGVuZ3RoIHN1ZmZpeCkgZWxzZSBzXG47O1xuXG5sZXQgY2hvcF9zdWZmaXhfZXhuIHMgfnN1ZmZpeCA9XG4gIG1hdGNoIGNob3Bfc3VmZml4IHMgfnN1ZmZpeCB3aXRoXG4gIHwgU29tZSBzdHIgLT4gc3RyXG4gIHwgTm9uZSAtPiBpbnZhbGlkX2FyZ2YgXCJTdHJpbmcuY2hvcF9zdWZmaXhfZXhuICVTICVTXCIgcyBzdWZmaXggKClcbjs7XG5cbm1vZHVsZSBGb3JfY29tbW9uX3ByZWZpeF9hbmRfc3VmZml4ID0gc3RydWN0XG4gICgqIFdoZW4gdGFraW5nIGEgc3RyaW5nIHByZWZpeCBvciBzdWZmaXgsIHdlIGV4dHJhY3QgZnJvbSB0aGUgc2hvcnRlc3QgaW5wdXQgYXZhaWxhYmxlXG4gICAgIGluIGNhc2Ugd2UgY2FuIGp1c3QgcmV0dXJuIG9uZSBvZiBvdXIgaW5wdXRzIHdpdGhvdXQgYWxsb2NhdGluZyBhIG5ldyBzdHJpbmcuICopXG5cbiAgbGV0IHNob3J0ZXIgYSBiID0gaWYgbGVuZ3RoIGEgPD0gbGVuZ3RoIGIgdGhlbiBhIGVsc2UgYlxuXG4gIGxldCBzaG9ydGVzdCBsaXN0ID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IFwiXCJcbiAgICB8IGZpcnN0IDo6IHJlc3QgLT4gTGlzdC5mb2xkIHJlc3QgfmluaXQ6Zmlyc3QgfmY6c2hvcnRlclxuICA7O1xuXG4gICgqIE91ciBnZW5lcmljIGFjY2Vzc29ycyBmb3IgY29tbW9uIHByZWZpeC9zdWZmaXggYWJzdHJhY3Qgb3ZlciBbZ2V0X3Bvc10sIHdoaWNoIGlzXG4gICAgIGVpdGhlciBbcG9zX2Zyb21fbGVmdF0gb3IgW3Bvc19mcm9tX3JpZ2h0XS4gKilcblxuICBsZXQgcG9zX2Zyb21fbGVmdCAoXyA6IHQpIChpIDogaW50KSA9IGlcbiAgbGV0IHBvc19mcm9tX3JpZ2h0IHQgaSA9IGxlbmd0aCB0IC0gaSAtIDFcblxuICBsZXQgcmVjIGNvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcCBhIGIgfmdldF9wb3Mgfm1heF9sZW4gfmxlbl9zb19mYXIgPVxuICAgIGlmIGxlbl9zb19mYXIgPj0gbWF4X2xlblxuICAgIHRoZW4gbWF4X2xlblxuICAgIGVsc2UgaWYgQ2hhci5lcXVhbFxuICAgICAgICAgICAgICAodW5zYWZlX2dldCBhIChnZXRfcG9zIGEgbGVuX3NvX2ZhcikpXG4gICAgICAgICAgICAgICh1bnNhZmVfZ2V0IGIgKGdldF9wb3MgYiBsZW5fc29fZmFyKSlcbiAgICB0aGVuIGNvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcCBhIGIgfmdldF9wb3Mgfm1heF9sZW4gfmxlbl9zb19mYXI6KGxlbl9zb19mYXIgKyAxKVxuICAgIGVsc2UgbGVuX3NvX2ZhclxuICA7O1xuXG4gIGxldCBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoIGEgYiB+Z2V0X3BvcyA9XG4gICAgbGV0IG1heF9sZW4gPSBtaW4gKGxlbmd0aCBhKSAobGVuZ3RoIGIpIGluXG4gICAgY29tbW9uX2dlbmVyaWMyX2xlbmd0aF9sb29wIGEgYiB+Z2V0X3BvcyB+bWF4X2xlbiB+bGVuX3NvX2ZhcjowXG4gIDs7XG5cbiAgbGV0IHJlYyBjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcCBmaXJzdCBsaXN0IH5nZXRfcG9zIH5tYXhfbGVuID1cbiAgICBtYXRjaCBsaXN0IHdpdGhcbiAgICB8IFtdIC0+IG1heF9sZW5cbiAgICB8IHNlY29uZCA6OiByZXN0IC0+XG4gICAgICBsZXQgbWF4X2xlbiA9XG4gICAgICAgICgqIFdlIGNhbGwgW2NvbW1vbl9nZW5lcmljMl9sZW5ndGhfbG9vcF0gcmF0aGVyIHRoYW4gW2NvbW1vbl9nZW5lcmljMl9sZW5ndGhdIHNvXG4gICAgICAgICAgIHRoYXQgW21heF9sZW5dIGxpbWl0cyBvdXIgdHJhdmVyc2FsIG9mIFtmaXJzdF0gYW5kIFtzZWNvbmRdLiAqKVxuICAgICAgICBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoX2xvb3AgZmlyc3Qgc2Vjb25kIH5nZXRfcG9zIH5tYXhfbGVuIH5sZW5fc29fZmFyOjBcbiAgICAgIGluXG4gICAgICBjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcCBzZWNvbmQgcmVzdCB+Z2V0X3BvcyB+bWF4X2xlblxuICA7O1xuXG4gIGxldCBjb21tb25fZ2VuZXJpY19sZW5ndGggbGlzdCB+Z2V0X3BvcyA9XG4gICAgbWF0Y2ggbGlzdCB3aXRoXG4gICAgfCBbXSAtPiAwXG4gICAgfCBmaXJzdCA6OiByZXN0IC0+XG4gICAgICAoKiBQcmVjb21wdXRpbmcgW21heF9sZW5dIGJhc2VkIG9uIFtzaG9ydGVzdCBsaXN0XSBzYXZlcyB1cyB3b3JrIGluIGxvbmdlciBzdHJpbmdzLFxuICAgICAgICAgYXQgdGhlIGNvc3Qgb2YgYW4gZXh0cmEgcGFzcyBvdmVyIHRoZSBzcGluZSBvZiBbbGlzdF0uXG5cbiAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UncmUgbG9va2luZyBmb3IgdGhlIGxvbmdlc3QgcHJlZml4IG9mIHRoZSBzdHJpbmdzOlxuXG4gICAgICAgICB7dlxuICAgICAgICAgICAgbGV0IGxvbmdfYSA9IExpc3QuaW5pdCAxMDAwIH5mOihGbi5jb25zdCAnYScpXG4gICAgICAgICAgICBbIGxvbmdfYTsgbG9uZ19hOyAnYWEnIF1cbiAgICAgICAgIHZ9XG5cbiAgICAgICAgIHRoZSBhcHByb2FjaCBiZWxvdyB3aWxsIGp1c3QgY2hlY2sgdGhlIGZpcnN0IHR3byBjaGFyYWN0ZXJzIG9mIGFsbCB0aGUgc3RyaW5ncy5cbiAgICAgICopXG4gICAgICBsZXQgbWF4X2xlbiA9IGxlbmd0aCAoc2hvcnRlc3QgbGlzdCkgaW5cbiAgICAgIGNvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wIGZpcnN0IHJlc3QgfmdldF9wb3Mgfm1heF9sZW5cbiAgOztcblxuICAoKiBPdXIgZ2VuZXJpYyBhY2Nlc3NvcnMgdGhhdCBwcm9kdWNlIGEgc3RyaW5nIGFic3RyYWN0IG92ZXIgW3Rha2VdLCB3aGljaCBpcyBlaXRoZXJcbiAgICAgW3ByZWZpeF0gb3IgW3N1ZmZpeF0uICopXG5cbiAgbGV0IGNvbW1vbl9nZW5lcmljMiBhIGIgfmdldF9wb3MgfnRha2UgPVxuICAgIGxldCBsZW4gPSBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoIGEgYiB+Z2V0X3BvcyBpblxuICAgICgqIFVzZSB0aGUgc2hvcnRlciBvZiB0aGUgdHdvIHN0cmluZ3MsIHNvIHRoYXQgaWYgdGhlIHNob3J0ZXIgb25lIGlzIHRoZSBzaGFyZWRcbiAgICAgICBwcmVmaXgsIFt0YWtlXSB3b24ndCBhbGxvY2F0ZSBhbm90aGVyIHN0cmluZy4gKilcbiAgICB0YWtlIChzaG9ydGVyIGEgYikgbGVuXG4gIDs7XG5cbiAgbGV0IGNvbW1vbl9nZW5lcmljIGxpc3QgfmdldF9wb3MgfnRha2UgPVxuICAgIG1hdGNoIGxpc3Qgd2l0aFxuICAgIHwgW10gLT4gXCJcIlxuICAgIHwgZmlyc3QgOjogcmVzdCAtPlxuICAgICAgKCogQXMgd2l0aCBbY29tbW9uX2dlbmVyaWNfbGVuZ3RoXSwgd2UgYmFzZSBbbWF4X2xlbl0gb24gW3Nob3J0ZXN0IGxpc3RdLiBXZSBhbHNvXG4gICAgICAgICB1c2UgdGhpcyByZXN1bHQgZm9yIFt0YWtlXSwgYmVsb3csIHRvIHBvdGVudGlhbGx5IGF2b2lkIGFsbG9jYXRpbmcgYSBzdHJpbmcuICopXG4gICAgICBsZXQgcyA9IHNob3J0ZXN0IGxpc3QgaW5cbiAgICAgIGxldCBtYXhfbGVuID0gbGVuZ3RoIHMgaW5cbiAgICAgIGlmIG1heF9sZW4gPSAwXG4gICAgICB0aGVuIFwiXCJcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgbGVuID1cbiAgICAgICAgICAoKiBXZSBjYWxsIGRpcmVjdGx5IGludG8gW2NvbW1vbl9nZW5lcmljX2xlbmd0aF9sb29wXSByYXRoZXIgdGhhblxuICAgICAgICAgICAgIFtjb21tb25fZ2VuZXJpY19sZW5ndGhdIHRvIGF2b2lkIHJlY29tcHV0aW5nIFtzaG9ydGVzdCBsaXN0XS4gKilcbiAgICAgICAgICBjb21tb25fZ2VuZXJpY19sZW5ndGhfbG9vcCBmaXJzdCByZXN0IH5nZXRfcG9zIH5tYXhfbGVuXG4gICAgICAgIGluXG4gICAgICAgIHRha2UgcyBsZW4pXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBzdHJ1Y3RcbiAgb3BlbiBGb3JfY29tbW9uX3ByZWZpeF9hbmRfc3VmZml4XG5cbiAgbGV0IGNvbW1vbl9wcmVmaXggbGlzdCA9IGNvbW1vbl9nZW5lcmljIGxpc3QgfnRha2U6cHJlZml4IH5nZXRfcG9zOnBvc19mcm9tX2xlZnRcbiAgbGV0IGNvbW1vbl9zdWZmaXggbGlzdCA9IGNvbW1vbl9nZW5lcmljIGxpc3QgfnRha2U6c3VmZml4IH5nZXRfcG9zOnBvc19mcm9tX3JpZ2h0XG4gIGxldCBjb21tb25fcHJlZml4MiBhIGIgPSBjb21tb25fZ2VuZXJpYzIgYSBiIH50YWtlOnByZWZpeCB+Z2V0X3Bvczpwb3NfZnJvbV9sZWZ0XG4gIGxldCBjb21tb25fc3VmZml4MiBhIGIgPSBjb21tb25fZ2VuZXJpYzIgYSBiIH50YWtlOnN1ZmZpeCB+Z2V0X3Bvczpwb3NfZnJvbV9yaWdodFxuICBsZXQgY29tbW9uX3ByZWZpeF9sZW5ndGggbGlzdCA9IGNvbW1vbl9nZW5lcmljX2xlbmd0aCBsaXN0IH5nZXRfcG9zOnBvc19mcm9tX2xlZnRcbiAgbGV0IGNvbW1vbl9zdWZmaXhfbGVuZ3RoIGxpc3QgPSBjb21tb25fZ2VuZXJpY19sZW5ndGggbGlzdCB+Z2V0X3Bvczpwb3NfZnJvbV9yaWdodFxuICBsZXQgY29tbW9uX3ByZWZpeDJfbGVuZ3RoIGEgYiA9IGNvbW1vbl9nZW5lcmljMl9sZW5ndGggYSBiIH5nZXRfcG9zOnBvc19mcm9tX2xlZnRcbiAgbGV0IGNvbW1vbl9zdWZmaXgyX2xlbmd0aCBhIGIgPSBjb21tb25fZ2VuZXJpYzJfbGVuZ3RoIGEgYiB+Z2V0X3Bvczpwb3NfZnJvbV9yaWdodFxuZW5kXG5cbigqIFRoZXJlIHVzZWQgdG8gYmUgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gdGhhdCB3YXMgZmFzdGVyIGZvciB2ZXJ5IHNob3J0IHN0cmluZ3NcbiAgIChwZWFraW5nIGF0IDQwJSBmYXN0ZXIgZm9yIDQtNiBjaGFyIGxvbmcgc3RyaW5ncykuXG4gICBUaGlzIG5ldyBmdW5jdGlvbiBpcyBhcm91bmQgMjAlIGZhc3RlciB0aGFuIHRoZSBkZWZhdWx0IGhhc2ggZnVuY3Rpb24sIGJ1dCBzbG93ZXJcbiAgIHRoYW4gdGhlIHByZXZpb3VzIGN1c3RvbSBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwgdGhlIG5ldyBPQ2FtbCBmdW5jdGlvbiBpcyB3ZWxsXG4gICBiZWhhdmVkLCBhbmQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsZXNzIGxpa2VseSB0byBkaXZlcmdlIGZyb20gdGhlIGRlZmF1bHQgT0NhbWxcbiAgIGltcGxlbWVudGF0aW9uIGRvZXMsIHdoaWNoIGlzIGEgZGVzaXJhYmxlIHByb3BlcnR5LiAoVGhlIG9ubHkgd2F5IHRvIGF2b2lkIHRoZVxuICAgZGl2ZXJnZW5jZSBpcyB0byBleHBvc2UgdGhlIG1hY3JvIHJlZGVmaW5lZCBpbiBoYXNoX3N0dWJzLmMgaW4gdGhlIGhhc2guaCBoZWFkZXIgb2ZcbiAgIHRoZSBPQ2FtbCBjb21waWxlci4pICopXG5tb2R1bGUgSGFzaCA9IHN0cnVjdFxuICBleHRlcm5hbCBoYXNoIDogc3RyaW5nIC0+IGludCA9IFwiQmFzZV9oYXNoX3N0cmluZ1wiIFtAQG5vYWxsb2NdXG5lbmRcblxuKCogW2luY2x1ZGUgSGFzaF0gdG8gbWFrZSB0aGUgW2V4dGVybmFsXSB2ZXJzaW9uIG92ZXJyaWRlIHRoZSBbaGFzaF0gZnJvbVxuICAgW0hhc2hhYmxlLk1ha2VfYmluYWJsZV0sIHNvIHRoYXQgd2UgZ2V0IGEgbGl0dGxlIGJpdCBvZiBhIHNwZWVkdXAgYnkgZXhwb3NpbmcgaXQgYXNcbiAgIGV4dGVybmFsIGluIHRoZSBtbGkuICopXG5sZXQgXyA9IGhhc2hcblxuaW5jbHVkZSBIYXNoXG5cbigqIGZvciBpbnRlcmFjdGl2ZSB0b3AtbGV2ZWxzIC0tIG1vZHVsZXMgZGVyaXZpbmcgZnJvbSBTdHJpbmcgc2hvdWxkIGhhdmUgU3RyaW5nJ3MgcHJldHR5XG4gICBwcmludGVyLiAqKVxubGV0IHBwIHBwZiBzdHJpbmcgPSBDYW1sLkZvcm1hdC5mcHJpbnRmIHBwZiBcIiVTXCIgc3RyaW5nXG5sZXQgb2ZfY2hhciBjID0gbWFrZSAxIGNcblxubGV0IG9mX2NoYXJfbGlzdCBsID1cbiAgbGV0IHQgPSBCeXRlcy5jcmVhdGUgKExpc3QubGVuZ3RoIGwpIGluXG4gIExpc3QuaXRlcmkgbCB+ZjooZnVuIGkgYyAtPiBCeXRlcy5zZXQgdCBpIGMpO1xuICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOnRcbjs7XG5cbm1vZHVsZSBFc2NhcGluZyA9IHN0cnVjdFxuICAoKiBJZiB0aGlzIGlzIGNoYW5nZWQsIG1ha2Ugc3VyZSB0byB1cGRhdGUgW2VzY2FwZV0sIHdoaWNoIGF0dGVtcHRzIHRvIGVuc3VyZSBhbGwgdGhlXG4gICAgIGludmFyaWFudHMgY2hlY2tlZCBoZXJlLiAgKilcbiAgbGV0IGJ1aWxkX2FuZF92YWxpZGF0ZV9lc2NhcGV3b3J0aHlfbWFwIGVzY2FwZXdvcnRoeV9tYXAgZXNjYXBlX2NoYXIgZnVuYyA9XG4gICAgbGV0IGVzY2FwZXdvcnRoeV9tYXAgPVxuICAgICAgaWYgTGlzdC5Bc3NvYy5tZW0gZXNjYXBld29ydGh5X21hcCB+ZXF1YWw6Q2hhci5lcXVhbCBlc2NhcGVfY2hhclxuICAgICAgdGhlbiBlc2NhcGV3b3J0aHlfbWFwXG4gICAgICBlbHNlIChlc2NhcGVfY2hhciwgZXNjYXBlX2NoYXIpIDo6IGVzY2FwZXdvcnRoeV9tYXBcbiAgICBpblxuICAgIGxldCBhcnIgPSBBcnJheS5jcmVhdGUgfmxlbjoyNTYgKC0xKSBpblxuICAgIGxldCB2YWxzID0gQXJyYXkuY3JlYXRlIH5sZW46MjU2IGZhbHNlIGluXG4gICAgbGV0IHJlYyBsb29wID0gZnVuY3Rpb25cbiAgICAgIHwgW10gLT4gT2sgYXJyXG4gICAgICB8IChjX2Zyb20sIGNfdG8pIDo6IGwgLT5cbiAgICAgICAgbGV0IGssIHYgPVxuICAgICAgICAgIG1hdGNoIGZ1bmMgd2l0aFxuICAgICAgICAgIHwgYEVzY2FwZSAtPiBDaGFyLnRvX2ludCBjX2Zyb20sIGNfdG9cbiAgICAgICAgICB8IGBVbmVzY2FwZSAtPiBDaGFyLnRvX2ludCBjX3RvLCBjX2Zyb21cbiAgICAgICAgaW5cbiAgICAgICAgaWYgYXJyLihrKSA8PiAtMSB8fCB2YWxzLihDaGFyLnRvX2ludCB2KVxuICAgICAgICB0aGVuXG4gICAgICAgICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICAgICAgXCJlc2NhcGV3b3J0aHlfbWFwIG5vdCBvbmUtdG8tb25lXCJcbiAgICAgICAgICAgICAgIFsgXCJjX2Zyb21cIiwgc2V4cF9vZl9jaGFyIGNfZnJvbVxuICAgICAgICAgICAgICAgOyBcImNfdG9cIiwgc2V4cF9vZl9jaGFyIGNfdG9cbiAgICAgICAgICAgICAgIDsgKCBcImVzY2FwZXdvcnRoeV9tYXBcIlxuICAgICAgICAgICAgICAgICAsIHNleHBfb2ZfbGlzdCAoc2V4cF9vZl9wYWlyIHNleHBfb2ZfY2hhciBzZXhwX29mX2NoYXIpIGVzY2FwZXdvcnRoeV9tYXBcbiAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgXSlcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgYXJyLihrKSA8LSBDaGFyLnRvX2ludCB2O1xuICAgICAgICAgIHZhbHMuKENoYXIudG9faW50IHYpIDwtIHRydWU7XG4gICAgICAgICAgbG9vcCBsKVxuICAgIGluXG4gICAgbG9vcCBlc2NhcGV3b3J0aHlfbWFwXG4gIDs7XG5cbiAgbGV0IGVzY2FwZV9nZW4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyID1cbiAgICBtYXRjaCBidWlsZF9hbmRfdmFsaWRhdGVfZXNjYXBld29ydGh5X21hcCBlc2NhcGV3b3J0aHlfbWFwIGVzY2FwZV9jaGFyIGBFc2NhcGUgd2l0aFxuICAgIHwgRXJyb3IgXyBhcyB4IC0+IHhcbiAgICB8IE9rIGVzY2FwZXdvcnRoeSAtPlxuICAgICAgT2tcbiAgICAgICAgKGZ1biBzcmMgLT5cbiAgICAgICAgICAgKCogY2FsY3VsYXRlIGEgbGlzdCBvZiAoaW5kZXggb2YgY2hhciB0byBlc2NhcGUgKiBlc2NhcGVkIGNoYXIpIGZpcnN0LCB0aGUgb3JkZXJcbiAgICAgICAgICAgICAgaXMgZnJvbSB0YWlsIHRvIGhlYWQgKilcbiAgICAgICAgICAgbGV0IHRvX2VzY2FwZV9sZW4gPSByZWYgMCBpblxuICAgICAgICAgICBsZXQgdG9fZXNjYXBlID1cbiAgICAgICAgICAgICBmb2xkaSBzcmMgfmluaXQ6W10gfmY6KGZ1biBpIGFjYyBjIC0+XG4gICAgICAgICAgICAgICBtYXRjaCBlc2NhcGV3b3J0aHkuKENoYXIudG9faW50IGMpIHdpdGhcbiAgICAgICAgICAgICAgIHwgLTEgLT4gYWNjXG4gICAgICAgICAgICAgICB8IG4gLT5cbiAgICAgICAgICAgICAgICAgKCogKGluZGV4IG9mIGNoYXIgdG8gZXNjYXBlICogZXNjYXBlZCBjaGFyKSAqKVxuICAgICAgICAgICAgICAgICBpbmNyIHRvX2VzY2FwZV9sZW47XG4gICAgICAgICAgICAgICAgIChpLCBDaGFyLnVuc2FmZV9vZl9pbnQgbikgOjogYWNjKVxuICAgICAgICAgICBpblxuICAgICAgICAgICBtYXRjaCB0b19lc2NhcGUgd2l0aFxuICAgICAgICAgICB8IFtdIC0+IHNyY1xuICAgICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgICAoKiBbdG9fZXNjYXBlXSBkaXZpZGUgW3NyY10gdG8gW0xpc3QubGVuZ3RoIHRvX2VzY2FwZSArIDFdIHBpZWNlcyBzZXBhcmF0ZWQgYnlcbiAgICAgICAgICAgICAgICB0aGUgY2hhcnMgdG8gZXNjYXBlLlxuXG4gICAgICAgICAgICAgICAgTGV0cyB0YWtlXG4gICAgICAgICAgICAgICAge1tcbiAgICAgICAgICAgICAgICAgIGVzY2FwZV9nZW5fZXhuXG4gICAgICAgICAgICAgICAgICAgIH5lc2NhcGV3b3J0aHlfbWFwOlsoJ2EnLCAnQScpOyAoJ2InLCAnQicpOyAoJ2MnLCAnQycpXVxuICAgICAgICAgICAgICAgICAgICB+ZXNjYXBlX2NoYXI6J18nXG4gICAgICAgICAgICAgICAgXX1cbiAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSwgYW5kIGFzc3VtZSB0aGUgc3RyaW5nIHRvIGVzY2FwZSBpc1xuXG4gICAgICAgICAgICAgICAgXCIwMDBhMTExYjIyMmMzMzNcIlxuXG4gICAgICAgICAgICAgICAgdGhlbiBbdG9fZXNjYXBlXSBpcyBbKDExLCAnQycpOyAoNywgJ0InKTsgKDMsICdBJyldLlxuXG4gICAgICAgICAgICAgICAgVGhlbiB3ZSBjcmVhdGUgYSBbZHN0XSBvZiBsZW5ndGggW2xlbmd0aCBzcmMgKyAzXSB0byBzdG9yZSB0aGVcbiAgICAgICAgICAgICAgICByZXN1bHQsIGNvcHkgcGllY2UgXCIzMzNcIiB0byBbZHN0XSBkaXJlY3RseSwgdGhlbiBjb3B5ICdfJyBhbmQgJ0MnIHRvIFtkc3RdO1xuICAgICAgICAgICAgICAgIHRoZW4gbW92ZSBvbiB0byBuZXh0OyBhZnRlciAzIGl0ZXJhdGlvbnMsIGNvcHkgcGllY2UgXCIwMDBcIiBhbmQgd2UgYXJlIGRvbmUuXG5cbiAgICAgICAgICAgICAgICBGaW5hbGx5IHRoZSByZXN1bHQgd2lsbCBiZVxuXG4gICAgICAgICAgICAgICAgXCIwMDBfQTExMV9CMjIyX0MzMzNcIiAqKVxuICAgICAgICAgICAgIGxldCBzcmNfbGVuID0gbGVuZ3RoIHNyYyBpblxuICAgICAgICAgICAgIGxldCBkc3RfbGVuID0gc3JjX2xlbiArICF0b19lc2NhcGVfbGVuIGluXG4gICAgICAgICAgICAgbGV0IGRzdCA9IEJ5dGVzLmNyZWF0ZSBkc3RfbGVuIGluXG4gICAgICAgICAgICAgbGV0IHJlYyBsb29wIGxhc3RfaWR4IGxhc3RfZHN0X3BvcyA9IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICAgICAgICgqIGNvcHkgXCIwMDBcIiBhdCBsYXN0ICopXG4gICAgICAgICAgICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3M6MCB+ZHN0IH5kc3RfcG9zOjAgfmxlbjpsYXN0X2lkeFxuICAgICAgICAgICAgICAgfCAoaWR4LCBlc2NhcGVkX2NoYXIpIDo6IHRvX2VzY2FwZSAtPlxuICAgICAgICAgICAgICAgICAoKltpZHhdID0gdGhlIGNoYXIgdG8gZXNjYXBlKilcbiAgICAgICAgICAgICAgICAgKCogdGFrZSBmaXJzdCBpdGVyYXRpb24gZm9yIGV4YW1wbGUgKilcbiAgICAgICAgICAgICAgICAgKCogY2FsY3VsYXRlIGxlbmd0aCBvZiBcIjMzM1wiLCBtaW51cyAxIGJlY2F1c2Ugd2UgZG9uJ3QgY29weSAnYycgKilcbiAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IGxhc3RfaWR4IC0gaWR4IC0gMSBpblxuICAgICAgICAgICAgICAgICAoKiBzZXQgdGhlIGRzdF9wb3MgdG8gY29weSB0byAqKVxuICAgICAgICAgICAgICAgICBsZXQgZHN0X3BvcyA9IGxhc3RfZHN0X3BvcyAtIGxlbiBpblxuICAgICAgICAgICAgICAgICAoKiBjb3B5IFwiMzMzXCIsIHNldCBbc3JjX3Bvc10gdG8gW2lkeCArIDFdIHRvIHNraXAgJ2MnICopXG4gICAgICAgICAgICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3M6KGlkeCArIDEpIH5kc3QgfmRzdF9wb3MgfmxlbjtcbiAgICAgICAgICAgICAgICAgKCogYmFja29mZiBbZHN0X3Bvc10gYnkgMiB0byBjb3B5ICdfJyBhbmQgJ0MnICopXG4gICAgICAgICAgICAgICAgIGxldCBkc3RfcG9zID0gZHN0X3BvcyAtIDIgaW5cbiAgICAgICAgICAgICAgICAgQnl0ZXMuc2V0IGRzdCBkc3RfcG9zIGVzY2FwZV9jaGFyO1xuICAgICAgICAgICAgICAgICBCeXRlcy5zZXQgZHN0IChkc3RfcG9zICsgMSkgZXNjYXBlZF9jaGFyO1xuICAgICAgICAgICAgICAgICBsb29wIGlkeCBkc3RfcG9zIHRvX2VzY2FwZVxuICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgKCogc2V0IFtsYXN0X2RzdF9wb3NdIGFuZCBbbGFzdF9pZHhdIHRvIGxlbmd0aCBvZiBbZHN0XSBhbmQgW3NyY10gZmlyc3QgKilcbiAgICAgICAgICAgICBsb29wIHNyY19sZW4gZHN0X2xlbiB0b19lc2NhcGU7XG4gICAgICAgICAgICAgQnl0ZXMudW5zYWZlX3RvX3N0cmluZyB+bm9fbXV0YXRpb25fd2hpbGVfc3RyaW5nX3JlYWNoYWJsZTpkc3QpXG4gIDs7XG5cbiAgbGV0IGVzY2FwZV9nZW5fZXhuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhciA9XG4gICAgT3JfZXJyb3Iub2tfZXhuIChlc2NhcGVfZ2VuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhcikgfD4gc3RhZ2VcbiAgOztcblxuICBsZXQgZXNjYXBlIH5lc2NhcGV3b3J0aHkgfmVzY2FwZV9jaGFyID1cbiAgICAoKiBGb3IgW2VzY2FwZV9nZW5fZXhuXSwgd2UgZG9uJ3Qga25vdyBob3cgdG8gZml4IGludmFsaWQgZXNjYXBld29ydGh5X21hcCBzbyB3ZSBoYXZlXG4gICAgICAgdG8gcmFpc2UgZXhjZXB0aW9uOyBidXQgaW4gdGhpcyBjYXNlLCB3ZSBrbm93IGhvdyB0byBmaXggZHVwbGljYXRlZCBlbGVtZW50cyBpblxuICAgICAgIGVzY2FwZXdvcnRoeSBsaXN0LCBzbyB3ZSBqdXN0IGZpeCBpdCBpbnN0ZWFkIG9mIHJhaXNpbmcgZXhjZXB0aW9uIHRvIG1ha2UgdGhpc1xuICAgICAgIGZ1bmN0aW9uIGVhc2llciB0byB1c2UuICAqKVxuICAgIGxldCBlc2NhcGV3b3J0aHlfbWFwID1cbiAgICAgIGVzY2FwZXdvcnRoeVxuICAgICAgfD4gTGlzdC5kZWR1cF9hbmRfc29ydCB+Y29tcGFyZTpDaGFyLmNvbXBhcmVcbiAgICAgIHw+IExpc3QubWFwIH5mOihmdW4gYyAtPiBjLCBjKVxuICAgIGluXG4gICAgZXNjYXBlX2dlbl9leG4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyXG4gIDs7XG5cbiAgKCogSW4gYW4gZXNjYXBlZCBzdHJpbmcsIGFueSBjaGFyIGlzIGVpdGhlciBgRXNjYXBpbmcsIGBFc2NhcGVkIG9yIGBMaXRlcmFsLiBGb3JcbiAgICAgZXhhbXBsZSwgdGhlIGVzY2FwZSBzdGF0dXNlcyBvZiBjaGFycyBpbiBzdHJpbmcgXCJhX2FfX1wiIHdpdGggZXNjYXBlX2NoYXIgPSAnXycgYXJlXG5cbiAgICAgYSA6IGBMaXRlcmFsXG4gICAgIF8gOiBgRXNjYXBpbmdcbiAgICAgYSA6IGBFc2NhcGVkXG4gICAgIF8gOiBgRXNjYXBpbmdcbiAgICAgXyA6IGBFc2NhcGVkXG5cbiAgICAgW3VwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgaSBwcmV2aW91c19zdGF0dXNdIGdldHMgZXNjYXBlIHN0YXR1cyBvZlxuICAgICBzdHIuW2ldIGJhc2luZyBvbiBlc2NhcGUgc3RhdHVzIG9mIHN0ci5baSAtIDFdICopXG4gIGxldCB1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIGkgPSBmdW5jdGlvblxuICAgIHwgYEVzY2FwaW5nIC0+IGBFc2NhcGVkXG4gICAgfCBgTGl0ZXJhbCB8IGBFc2NhcGVkIC0+XG4gICAgICBpZiBDaGFyLmVxdWFsIHN0ci5baV0gZXNjYXBlX2NoYXIgdGhlbiBgRXNjYXBpbmcgZWxzZSBgTGl0ZXJhbFxuICA7O1xuXG4gIGxldCB1bmVzY2FwZV9nZW4gfmVzY2FwZXdvcnRoeV9tYXAgfmVzY2FwZV9jaGFyID1cbiAgICBtYXRjaCBidWlsZF9hbmRfdmFsaWRhdGVfZXNjYXBld29ydGh5X21hcCBlc2NhcGV3b3J0aHlfbWFwIGVzY2FwZV9jaGFyIGBVbmVzY2FwZSB3aXRoXG4gICAgfCBFcnJvciBfIGFzIHggLT4geFxuICAgIHwgT2sgZXNjYXBld29ydGh5IC0+XG4gICAgICBPa1xuICAgICAgICAoZnVuIHNyYyAtPlxuICAgICAgICAgICAoKiBDb250aW51ZSB0aGUgZXhhbXBsZSBpbiBbZXNjYXBlX2dlbl9leG5dLCBub3cgd2UgdW5lc2NhcGVcblxuICAgICAgICAgICAgICBcIjAwMF9BMTExX0IyMjJfQzMzM1wiXG5cbiAgICAgICAgICAgICAgYmFjayB0b1xuXG4gICAgICAgICAgICAgIFwiMDAwYTExMWIyMjJjMzMzXCJcblxuICAgICAgICAgICAgICBUaGVuIFt0b191bmVzY2FwZV0gaXMgWzE0OyA5OyA0XSwgd2hpY2ggaXMgaW5kZXhlcyBvZiAnXydzLlxuXG4gICAgICAgICAgICAgIFRoZW4gd2UgY3JlYXRlIGEgc3RyaW5nIFtkc3RdIHRvIHN0b3JlIHRoZSByZXN1bHQsIGNvcHkgXCIzMzNcIiB0byBpdCwgdGhlbiBjb3B5XG4gICAgICAgICAgICAgICdjJywgdGhlbiBtb3ZlIG9uIHRvIG5leHQgaXRlcmF0aW9uLiBBZnRlciAzIGl0ZXJhdGlvbnMgY29weSBcIjAwMFwiIGFuZCB3ZSBhcmVcbiAgICAgICAgICAgICAgZG9uZS4gICopXG4gICAgICAgICAgICgqIGluZGV4ZXMgb2YgZXNjYXBlIGNoYXJzICopXG4gICAgICAgICAgIGxldCB0b191bmVzY2FwZSA9XG4gICAgICAgICAgICAgbGV0IHJlYyBsb29wIGkgc3RhdHVzIGFjYyA9XG4gICAgICAgICAgICAgICBpZiBpID49IGxlbmd0aCBzcmNcbiAgICAgICAgICAgICAgIHRoZW4gYWNjXG4gICAgICAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IHVwZGF0ZV9lc2NhcGVfc3RhdHVzIHNyYyB+ZXNjYXBlX2NoYXIgaSBzdGF0dXMgaW5cbiAgICAgICAgICAgICAgICAgbG9vcFxuICAgICAgICAgICAgICAgICAgIChpICsgMSlcbiAgICAgICAgICAgICAgICAgICBzdGF0dXNcbiAgICAgICAgICAgICAgICAgICAobWF0Y2ggc3RhdHVzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgfCBgRXNjYXBpbmcgLT4gaSA6OiBhY2NcbiAgICAgICAgICAgICAgICAgICAgfCBgRXNjYXBlZCB8IGBMaXRlcmFsIC0+IGFjYykpXG4gICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICBsb29wIDAgYExpdGVyYWwgW11cbiAgICAgICAgICAgaW5cbiAgICAgICAgICAgbWF0Y2ggdG9fdW5lc2NhcGUgd2l0aFxuICAgICAgICAgICB8IFtdIC0+IHNyY1xuICAgICAgICAgICB8IGlkeCA6OiB0b191bmVzY2FwZScgLT5cbiAgICAgICAgICAgICBsZXQgZHN0ID0gQnl0ZXMuY3JlYXRlIChsZW5ndGggc3JjIC0gTGlzdC5sZW5ndGggdG9fdW5lc2NhcGUpIGluXG4gICAgICAgICAgICAgbGV0IHJlYyBsb29wIGxhc3RfaWR4IGxhc3RfZHN0X3BvcyA9IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICAgICAgICgqIGNvcHkgXCIwMDBcIiBhdCBsYXN0ICopXG4gICAgICAgICAgICAgICAgIEJ5dGVzLmJsaXRfc3RyaW5nIH5zcmMgfnNyY19wb3M6MCB+ZHN0IH5kc3RfcG9zOjAgfmxlbjpsYXN0X2lkeFxuICAgICAgICAgICAgICAgfCBpZHggOjogdG9fdW5lc2NhcGUgLT5cbiAgICAgICAgICAgICAgICAgKCogW2lkeF0gPSBpbmRleCBvZiBlc2NhcGluZyBjaGFyICopXG4gICAgICAgICAgICAgICAgICgqIHRha2UgMXN0IGl0ZXJhdGlvbiBhcyBleGFtcGxlLCBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBcIjMzM1wiLCBtaW51cyAyIHRvXG4gICAgICAgICAgICAgICAgICAgIHNraXAgJ19DJyAqKVxuICAgICAgICAgICAgICAgICBsZXQgbGVuID0gbGFzdF9pZHggLSBpZHggLSAyIGluXG4gICAgICAgICAgICAgICAgICgqIHBvaW50IFtkc3RfcG9zXSB0byB0aGUgcG9zaXRpb24gdG8gY29weSBcIjMzM1wiIHRvICopXG4gICAgICAgICAgICAgICAgIGxldCBkc3RfcG9zID0gbGFzdF9kc3RfcG9zIC0gbGVuIGluXG4gICAgICAgICAgICAgICAgICgqIGNvcHkgXCIzMzNcIiAqKVxuICAgICAgICAgICAgICAgICBCeXRlcy5ibGl0X3N0cmluZyB+c3JjIH5zcmNfcG9zOihpZHggKyAyKSB+ZHN0IH5kc3RfcG9zIH5sZW47XG4gICAgICAgICAgICAgICAgICgqIGJhY2tvZmYgW2RzdF9wb3NdIGJ5IDEgdG8gY29weSAnYycgKilcbiAgICAgICAgICAgICAgICAgbGV0IGRzdF9wb3MgPSBkc3RfcG9zIC0gMSBpblxuICAgICAgICAgICAgICAgICBCeXRlcy5zZXRcbiAgICAgICAgICAgICAgICAgICBkc3RcbiAgICAgICAgICAgICAgICAgICBkc3RfcG9zXG4gICAgICAgICAgICAgICAgICAgKG1hdGNoIGVzY2FwZXdvcnRoeS4oQ2hhci50b19pbnQgc3JjLltpZHggKyAxXSkgd2l0aFxuICAgICAgICAgICAgICAgICAgICB8IC0xIC0+IHNyYy5baWR4ICsgMV1cbiAgICAgICAgICAgICAgICAgICAgfCBuIC0+IENoYXIudW5zYWZlX29mX2ludCBuKTtcbiAgICAgICAgICAgICAgICAgKCogdXBkYXRlIFtsYXN0X2RzdF9wb3NdIGFuZCBbbGFzdF9pZHhdICopXG4gICAgICAgICAgICAgICAgIGxvb3AgaWR4IGRzdF9wb3MgdG9fdW5lc2NhcGVcbiAgICAgICAgICAgICBpblxuICAgICAgICAgICAgIGlmIGlkeCA8IGxlbmd0aCBzcmMgLSAxXG4gICAgICAgICAgICAgdGhlblxuICAgICAgICAgICAgICAgKCogc2V0IFtsYXN0X2RzdF9wb3NdIGFuZCBbbGFzdF9pZHhdIHRvIGxlbmd0aCBvZiBbZHN0XSBhbmQgW3NyY10gKilcbiAgICAgICAgICAgICAgIGxvb3AgKGxlbmd0aCBzcmMpIChCeXRlcy5sZW5ndGggZHN0KSB0b191bmVzY2FwZVxuICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICgqIGZvciBlc2NhcGVkIHN0cmluZyBlbmRpbmcgd2l0aCBhbiBlc2NhcGluZyBjaGFyIGxpa2UgXCIwMDBfXCIsIGp1c3QgaWdub3JlXG4gICAgICAgICAgICAgICAgICB0aGUgbGFzdCBlc2NhcGluZyBjaGFyICopXG4gICAgICAgICAgICAgICBsb29wIChsZW5ndGggc3JjIC0gMSkgKEJ5dGVzLmxlbmd0aCBkc3QpIHRvX3VuZXNjYXBlJztcbiAgICAgICAgICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOmRzdClcbiAgOztcblxuICBsZXQgdW5lc2NhcGVfZ2VuX2V4biB+ZXNjYXBld29ydGh5X21hcCB+ZXNjYXBlX2NoYXIgPVxuICAgIE9yX2Vycm9yLm9rX2V4biAodW5lc2NhcGVfZ2VuIH5lc2NhcGV3b3J0aHlfbWFwIH5lc2NhcGVfY2hhcikgfD4gc3RhZ2VcbiAgOztcblxuICBsZXQgdW5lc2NhcGUgfmVzY2FwZV9jaGFyID0gdW5lc2NhcGVfZ2VuX2V4biB+ZXNjYXBld29ydGh5X21hcDpbXSB+ZXNjYXBlX2NoYXJcblxuICBsZXQgcHJlY2VkaW5nX2VzY2FwZV9jaGFycyBzdHIgfmVzY2FwZV9jaGFyIHBvcyA9XG4gICAgbGV0IHJlYyBsb29wIHAgY250ID1cbiAgICAgIGlmIHAgPCAwIHx8IENoYXIuKCA8PiApIHN0ci5bcF0gZXNjYXBlX2NoYXIgdGhlbiBjbnQgZWxzZSBsb29wIChwIC0gMSkgKGNudCArIDEpXG4gICAgaW5cbiAgICBsb29wIChwb3MgLSAxKSAwXG4gIDs7XG5cbiAgKCogSW4gYW4gZXNjYXBlZCBzdHJpbmcsIGFueSBjaGFyIGlzIGVpdGhlciBgRXNjYXBpbmcsIGBFc2NhcGVkIG9yIGBMaXRlcmFsLiBGb3JcbiAgICAgZXhhbXBsZSwgdGhlIGVzY2FwZSBzdGF0dXNlcyBvZiBjaGFycyBpbiBzdHJpbmcgXCJhX2FfX1wiIHdpdGggZXNjYXBlX2NoYXIgPSAnXycgYXJlXG5cbiAgICAgYSA6IGBMaXRlcmFsXG4gICAgIF8gOiBgRXNjYXBpbmdcbiAgICAgYSA6IGBFc2NhcGVkXG4gICAgIF8gOiBgRXNjYXBpbmdcbiAgICAgXyA6IGBFc2NhcGVkXG5cbiAgICAgW3VwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgaSBwcmV2aW91c19zdGF0dXNdIGdldHMgZXNjYXBlIHN0YXR1cyBvZlxuICAgICBzdHIuW2ldIGJhc2luZyBvbiBlc2NhcGUgc3RhdHVzIG9mIHN0ci5baSAtIDFdICopXG4gIGxldCB1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIGkgPSBmdW5jdGlvblxuICAgIHwgYEVzY2FwaW5nIC0+IGBFc2NhcGVkXG4gICAgfCBgTGl0ZXJhbCB8IGBFc2NhcGVkIC0+XG4gICAgICBpZiBDaGFyLmVxdWFsIHN0ci5baV0gZXNjYXBlX2NoYXIgdGhlbiBgRXNjYXBpbmcgZWxzZSBgTGl0ZXJhbFxuICA7O1xuXG4gIGxldCBlc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zID1cbiAgICBsZXQgb2RkID0gcHJlY2VkaW5nX2VzY2FwZV9jaGFycyBzdHIgfmVzY2FwZV9jaGFyIHBvcyBtb2QgMiA9IDEgaW5cbiAgICBtYXRjaCBvZGQsIENoYXIuZXF1YWwgc3RyLltwb3NdIGVzY2FwZV9jaGFyIHdpdGhcbiAgICB8IHRydWUsICh0cnVlIHwgZmFsc2UpIC0+IGBFc2NhcGVkXG4gICAgfCBmYWxzZSwgdHJ1ZSAtPiBgRXNjYXBpbmdcbiAgICB8IGZhbHNlLCBmYWxzZSAtPiBgTGl0ZXJhbFxuICA7O1xuXG4gIGxldCBjaGVja19ib3VuZCBzdHIgcG9zIGZ1bmN0aW9uX25hbWUgPVxuICAgIGlmIHBvcyA+PSBsZW5ndGggc3RyIHx8IHBvcyA8IDAgdGhlbiBpbnZhbGlkX2FyZ2YgXCIlczogb3V0IG9mIGJvdW5kc1wiIGZ1bmN0aW9uX25hbWUgKClcbiAgOztcblxuICBsZXQgaXNfY2hhcl9lc2NhcGluZyBzdHIgfmVzY2FwZV9jaGFyIHBvcyA9XG4gICAgY2hlY2tfYm91bmQgc3RyIHBvcyBcImlzX2NoYXJfZXNjYXBpbmdcIjtcbiAgICBtYXRjaCBlc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIHdpdGhcbiAgICB8IGBFc2NhcGluZyAtPiB0cnVlXG4gICAgfCBgRXNjYXBlZCB8IGBMaXRlcmFsIC0+IGZhbHNlXG4gIDs7XG5cbiAgbGV0IGlzX2NoYXJfZXNjYXBlZCBzdHIgfmVzY2FwZV9jaGFyIHBvcyA9XG4gICAgY2hlY2tfYm91bmQgc3RyIHBvcyBcImlzX2NoYXJfZXNjYXBlZFwiO1xuICAgIG1hdGNoIGVzY2FwZV9zdGF0dXMgc3RyIH5lc2NhcGVfY2hhciBwb3Mgd2l0aFxuICAgIHwgYEVzY2FwZWQgLT4gdHJ1ZVxuICAgIHwgYEVzY2FwaW5nIHwgYExpdGVyYWwgLT4gZmFsc2VcbiAgOztcblxuICBsZXQgaXNfY2hhcl9saXRlcmFsIHN0ciB+ZXNjYXBlX2NoYXIgcG9zID1cbiAgICBjaGVja19ib3VuZCBzdHIgcG9zIFwiaXNfY2hhcl9saXRlcmFsXCI7XG4gICAgbWF0Y2ggZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIHBvcyB3aXRoXG4gICAgfCBgTGl0ZXJhbCAtPiB0cnVlXG4gICAgfCBgRXNjYXBlZCB8IGBFc2NhcGluZyAtPiBmYWxzZVxuICA7O1xuXG4gIGxldCBpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgPVxuICAgIGNoZWNrX2JvdW5kIHN0ciBwb3MgXCJpbmRleF9mcm9tXCI7XG4gICAgbGV0IHJlYyBsb29wIGkgc3RhdHVzID1cbiAgICAgIGlmIGkgPj0gcG9zXG4gICAgICAmJiAobWF0Y2ggc3RhdHVzIHdpdGhcbiAgICAgICAgICB8IGBMaXRlcmFsIC0+IHRydWVcbiAgICAgICAgICB8IGBFc2NhcGVkIHwgYEVzY2FwaW5nIC0+IGZhbHNlKVxuICAgICAgJiYgQ2hhci5lcXVhbCBzdHIuW2ldIGNoYXJcbiAgICAgIHRoZW4gU29tZSBpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGkgPSBpICsgMSBpblxuICAgICAgICBpZiBpID49IGxlbmd0aCBzdHJcbiAgICAgICAgdGhlbiBOb25lXG4gICAgICAgIGVsc2UgbG9vcCBpICh1cGRhdGVfZXNjYXBlX3N0YXR1cyBzdHIgfmVzY2FwZV9jaGFyIGkgc3RhdHVzKSlcbiAgICBpblxuICAgIGxvb3AgcG9zIChlc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zKVxuICA7O1xuXG4gIGxldCBpbmRleF9mcm9tX2V4biBzdHIgfmVzY2FwZV9jaGFyIHBvcyBjaGFyID1cbiAgICBtYXRjaCBpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiaW5kZXhfZnJvbV9leG46IG5vdCBmb3VuZFwiXG4gICAgICAgICAgIFsgXCJzdHJcIiwgc2V4cF9vZl90IHN0clxuICAgICAgICAgICA7IFwiZXNjYXBlX2NoYXJcIiwgc2V4cF9vZl9jaGFyIGVzY2FwZV9jaGFyXG4gICAgICAgICAgIDsgXCJwb3NcIiwgc2V4cF9vZl9pbnQgcG9zXG4gICAgICAgICAgIDsgXCJjaGFyXCIsIHNleHBfb2ZfY2hhciBjaGFyXG4gICAgICAgICAgIF0pXG4gICAgfCBTb21lIHBvcyAtPiBwb3NcbiAgOztcblxuICBsZXQgaW5kZXggc3RyIH5lc2NhcGVfY2hhciBjaGFyID0gaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIDAgY2hhclxuICBsZXQgaW5kZXhfZXhuIHN0ciB+ZXNjYXBlX2NoYXIgY2hhciA9IGluZGV4X2Zyb21fZXhuIHN0ciB+ZXNjYXBlX2NoYXIgMCBjaGFyXG5cbiAgbGV0IHJpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgPVxuICAgIGNoZWNrX2JvdW5kIHN0ciBwb3MgXCJyaW5kZXhfZnJvbVwiO1xuICAgICgqIGlmIHRoZSB0YXJnZXQgY2hhciBpcyB0aGUgc2FtZSBhcyBbZXNjYXBlX2NoYXJdLCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgd2hpY2hcbiAgICAgICBlc2NhcGVfY2hhciBpcyBsaXRlcmFsLCBzbyBqdXN0IHJldHVybiBOb25lICopXG4gICAgaWYgQ2hhci5lcXVhbCBjaGFyIGVzY2FwZV9jaGFyXG4gICAgdGhlbiBOb25lXG4gICAgZWxzZSAoXG4gICAgICBsZXQgcmVjIGxvb3AgcG9zID1cbiAgICAgICAgaWYgcG9zIDwgMFxuICAgICAgICB0aGVuIE5vbmVcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IGVzY2FwZV9jaGFycyA9IHByZWNlZGluZ19lc2NhcGVfY2hhcnMgc3RyIH5lc2NhcGVfY2hhciBwb3MgaW5cbiAgICAgICAgICBpZiBlc2NhcGVfY2hhcnMgbW9kIDIgPSAwICYmIENoYXIuZXF1YWwgc3RyLltwb3NdIGNoYXJcbiAgICAgICAgICB0aGVuIFNvbWUgcG9zXG4gICAgICAgICAgZWxzZSBsb29wIChwb3MgLSBlc2NhcGVfY2hhcnMgLSAxKSlcbiAgICAgIGluXG4gICAgICBsb29wIHBvcylcbiAgOztcblxuICBsZXQgcmluZGV4X2Zyb21fZXhuIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgPVxuICAgIG1hdGNoIHJpbmRleF9mcm9tIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIGNoYXIgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwicmluZGV4X2Zyb21fZXhuOiBub3QgZm91bmRcIlxuICAgICAgICAgICBbIFwic3RyXCIsIHNleHBfb2ZfdCBzdHJcbiAgICAgICAgICAgOyBcImVzY2FwZV9jaGFyXCIsIHNleHBfb2ZfY2hhciBlc2NhcGVfY2hhclxuICAgICAgICAgICA7IFwicG9zXCIsIHNleHBfb2ZfaW50IHBvc1xuICAgICAgICAgICA7IFwiY2hhclwiLCBzZXhwX29mX2NoYXIgY2hhclxuICAgICAgICAgICBdKVxuICAgIHwgU29tZSBwb3MgLT4gcG9zXG4gIDs7XG5cbiAgbGV0IHJpbmRleCBzdHIgfmVzY2FwZV9jaGFyIGNoYXIgPVxuICAgIGlmIGlzX2VtcHR5IHN0ciB0aGVuIE5vbmUgZWxzZSByaW5kZXhfZnJvbSBzdHIgfmVzY2FwZV9jaGFyIChsZW5ndGggc3RyIC0gMSkgY2hhclxuICA7O1xuXG4gIGxldCByaW5kZXhfZXhuIHN0ciB+ZXNjYXBlX2NoYXIgY2hhciA9XG4gICAgcmluZGV4X2Zyb21fZXhuIHN0ciB+ZXNjYXBlX2NoYXIgKGxlbmd0aCBzdHIgLSAxKSBjaGFyXG4gIDs7XG5cbiAgKCogW3NwbGl0X2dlbiBzdHIgfmVzY2FwZV9jaGFyIH5vbl0gd29ya3Mgc2ltaWxhcmx5IHRvIFtTdHJpbmcuc3BsaXRfZ2VuXSwgd2l0aCBhblxuICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50OiBvbmx5IHNwbGl0IG9uIGxpdGVyYWwgY2hhcnMsIG5vdCBlc2NhcGluZyBvciBlc2NhcGVkICopXG4gIGxldCBzcGxpdF9nZW4gc3RyIH5lc2NhcGVfY2hhciB+b24gPVxuICAgIGxldCBpc19kZWxpbSA9XG4gICAgICBtYXRjaCBvbiB3aXRoXG4gICAgICB8IGBjaGFyIGMnIC0+IGZ1biBjIC0+IENoYXIuZXF1YWwgYyBjJ1xuICAgICAgfCBgY2hhcl9saXN0IGwgLT4gZnVuIGMgLT4gY2hhcl9saXN0X21lbSBsIGNcbiAgICBpblxuICAgIGxldCBsZW4gPSBsZW5ndGggc3RyIGluXG4gICAgbGV0IHJlYyBsb29wIGFjYyBzdGF0dXMgbGFzdF9wb3MgcG9zID1cbiAgICAgIGlmIHBvcyA9IGxlblxuICAgICAgdGhlbiBMaXN0LnJldiAoc3ViIHN0ciB+cG9zOmxhc3RfcG9zIH5sZW46KGxlbiAtIGxhc3RfcG9zKSA6OiBhY2MpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHN0YXR1cyA9IHVwZGF0ZV9lc2NhcGVfc3RhdHVzIHN0ciB+ZXNjYXBlX2NoYXIgcG9zIHN0YXR1cyBpblxuICAgICAgICBpZiAobWF0Y2ggc3RhdHVzIHdpdGhcbiAgICAgICAgICB8IGBMaXRlcmFsIC0+IHRydWVcbiAgICAgICAgICB8IGBFc2NhcGVkIHwgYEVzY2FwaW5nIC0+IGZhbHNlKVxuICAgICAgICAmJiBpc19kZWxpbSBzdHIuW3Bvc11cbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IHN1Yl9zdHIgPSBzdWIgc3RyIH5wb3M6bGFzdF9wb3MgfmxlbjoocG9zIC0gbGFzdF9wb3MpIGluXG4gICAgICAgICAgbG9vcCAoc3ViX3N0ciA6OiBhY2MpIHN0YXR1cyAocG9zICsgMSkgKHBvcyArIDEpKVxuICAgICAgICBlbHNlIGxvb3AgYWNjIHN0YXR1cyBsYXN0X3BvcyAocG9zICsgMSkpXG4gICAgaW5cbiAgICBsb29wIFtdIGBMaXRlcmFsIDAgMFxuICA7O1xuXG4gIGxldCBzcGxpdCBzdHIgfm9uID0gc3BsaXRfZ2VuIHN0ciB+b246KGBjaGFyIG9uKVxuICBsZXQgc3BsaXRfb25fY2hhcnMgc3RyIH5vbjpjaGFycyA9IHNwbGl0X2dlbiBzdHIgfm9uOihgY2hhcl9saXN0IGNoYXJzKVxuXG4gIGxldCBzcGxpdF9hdCBzdHIgcG9zID1cbiAgICBzdWIgc3RyIH5wb3M6MCB+bGVuOnBvcywgc3ViIHN0ciB+cG9zOihwb3MgKyAxKSB+bGVuOihsZW5ndGggc3RyIC0gcG9zIC0gMSlcbiAgOztcblxuICBsZXQgbHNwbGl0MiBzdHIgfm9uIH5lc2NhcGVfY2hhciA9XG4gICAgT3B0aW9uLm1hcCAoaW5kZXggc3RyIH5lc2NhcGVfY2hhciBvbikgfmY6KGZ1biB4IC0+IHNwbGl0X2F0IHN0ciB4KVxuICA7O1xuXG4gIGxldCByc3BsaXQyIHN0ciB+b24gfmVzY2FwZV9jaGFyID1cbiAgICBPcHRpb24ubWFwIChyaW5kZXggc3RyIH5lc2NhcGVfY2hhciBvbikgfmY6KGZ1biB4IC0+IHNwbGl0X2F0IHN0ciB4KVxuICA7O1xuXG4gIGxldCBsc3BsaXQyX2V4biBzdHIgfm9uIH5lc2NhcGVfY2hhciA9IHNwbGl0X2F0IHN0ciAoaW5kZXhfZXhuIHN0ciB+ZXNjYXBlX2NoYXIgb24pXG4gIGxldCByc3BsaXQyX2V4biBzdHIgfm9uIH5lc2NhcGVfY2hhciA9IHNwbGl0X2F0IHN0ciAocmluZGV4X2V4biBzdHIgfmVzY2FwZV9jaGFyIG9uKVxuXG4gICgqIFtsYXN0X25vbl9kcm9wX2xpdGVyYWxdIGFuZCBbZmlyc3Rfbm9uX2Ryb3BfbGl0ZXJhbF0gYXJlIGVpdGhlciBib3RoIFtOb25lXSBvciBib3RoXG4gICAgIFtTb21lXS4gSWYgW1NvbWVdLCB0aGVuIHRoZSBmb3JtZXIgaXMgPj0gdGhlIGxhdHRlci4gKilcbiAgbGV0IGxhc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB+ZHJvcCB+ZXNjYXBlX2NoYXIgdCA9XG4gICAgcmZpbmRpIHQgfmY6KGZ1biBpIGMgLT5cbiAgICAgIChub3QgKGRyb3AgYykpXG4gICAgICB8fCBpc19jaGFyX2VzY2FwaW5nIHQgfmVzY2FwZV9jaGFyIGlcbiAgICAgIHx8IGlzX2NoYXJfZXNjYXBlZCB0IH5lc2NhcGVfY2hhciBpKVxuICA7O1xuXG4gIGxldCBmaXJzdF9ub25fZHJvcF9saXRlcmFsIH5kcm9wIH5lc2NhcGVfY2hhciB0ID1cbiAgICBsZmluZGkgdCB+ZjooZnVuIGkgYyAtPlxuICAgICAgKG5vdCAoZHJvcCBjKSlcbiAgICAgIHx8IGlzX2NoYXJfZXNjYXBpbmcgdCB+ZXNjYXBlX2NoYXIgaVxuICAgICAgfHwgaXNfY2hhcl9lc2NhcGVkIHQgfmVzY2FwZV9jaGFyIGkpXG4gIDs7XG5cbiAgbGV0IHJzdHJpcF9saXRlcmFsID8oZHJvcCA9IENoYXIuaXNfd2hpdGVzcGFjZSkgdCB+ZXNjYXBlX2NoYXIgPVxuICAgIG1hdGNoIGxhc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB0IH5kcm9wIH5lc2NhcGVfY2hhciB3aXRoXG4gICAgfCBOb25lIC0+IFwiXCJcbiAgICB8IFNvbWUgaSAtPiBpZiBpID0gbGVuZ3RoIHQgLSAxIHRoZW4gdCBlbHNlIHByZWZpeCB0IChpICsgMSlcbiAgOztcblxuICBsZXQgbHN0cmlwX2xpdGVyYWwgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0IH5lc2NhcGVfY2hhciA9XG4gICAgbWF0Y2ggZmlyc3Rfbm9uX2Ryb3BfbGl0ZXJhbCB0IH5kcm9wIH5lc2NhcGVfY2hhciB3aXRoXG4gICAgfCBOb25lIC0+IFwiXCJcbiAgICB8IFNvbWUgMCAtPiB0XG4gICAgfCBTb21lIG4gLT4gZHJvcF9wcmVmaXggdCBuXG4gIDs7XG5cbiAgKCogW3N0cmlwIHRdIGNvdWxkIGJlIGltcGxlbWVudGVkIGFzIFtsc3RyaXAgKHJzdHJpcCB0KV0uICBUaGUgaW1wbGVtZW50YXRpb25cbiAgICAgYmVsb3cgc2F2ZXMgKGF0IGxlYXN0KSBhIGZhY3RvciBvZiB0d28gYWxsb2NhdGlvbiwgYnkgb25seSBhbGxvY2F0aW5nIHRoZVxuICAgICBmaW5hbCByZXN1bHQuICBUaGlzIGFsc28gc2F2ZXMgc29tZSBhbW91bnQgb2YgdGltZS4gKilcbiAgbGV0IHN0cmlwX2xpdGVyYWwgPyhkcm9wID0gQ2hhci5pc193aGl0ZXNwYWNlKSB0IH5lc2NhcGVfY2hhciA9XG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aCB0IGluXG4gICAgKCogcGVyZm9ybWFuY2UgaGFjazogYXZvaWQgY29weWluZyBbdF0gaW4gY29tbW9uIGNhc2VzICopXG4gICAgaWYgbGVuZ3RoID0gMCB8fCBub3QgKGRyb3AgdC5bMF0gfHwgZHJvcCB0LltsZW5ndGggLSAxXSlcbiAgICB0aGVuIHRcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGZpcnN0X25vbl9kcm9wX2xpdGVyYWwgdCB+ZHJvcCB+ZXNjYXBlX2NoYXIgd2l0aFxuICAgICAgfCBOb25lIC0+IFwiXCJcbiAgICAgIHwgU29tZSBmaXJzdCAtPlxuICAgICAgICAobWF0Y2ggbGFzdF9ub25fZHJvcF9saXRlcmFsIHQgfmRyb3AgfmVzY2FwZV9jaGFyIHdpdGhcbiAgICAgICAgIHwgTm9uZSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgIHwgU29tZSBsYXN0IC0+IHN1YiB0IH5wb3M6Zmlyc3QgfmxlbjoobGFzdCAtIGZpcnN0ICsgMSkpKVxuICA7O1xuZW5kXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIFN0cmluZ19yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxuKCogT3ZlcnJpZGUgW1NlYXJjaF9wYXR0ZXJuXSB3aXRoIGRlZmF1bHQgY2FzZS1zZW5zaXRpdml0eSBhcmd1bWVudCBhdCB0aGUgZW5kIG9mIHRoZVxuICAgZmlsZSwgc28gdGhhdCBjYWxsIHNpdGVzIGFib3ZlIGFyZSBmb3JjZWQgdG8gc3VwcGx5IGNhc2Utc2Vuc2l0aXZpdHkgZXhwbGljaXRseS4gKilcbm1vZHVsZSBTZWFyY2hfcGF0dGVybiA9IHN0cnVjdFxuICBpbmNsdWRlIFNlYXJjaF9wYXR0ZXJuMFxuXG4gIGxldCBjcmVhdGUgPyhjYXNlX3NlbnNpdGl2ZSA9IHRydWUpIHBhdHRlcm4gPSBjcmVhdGUgcGF0dGVybiB+Y2FzZV9zZW5zaXRpdmVcbmVuZFxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgU3RyaW5nX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgQXJyYXkgPSBBcnJheTBcblxubGV0IHN0YWdlID0gU3RhZ2VkLnN0YWdlXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGJ5dGVzIFtAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChieXRlc19vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9ieXRlcyA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBieXRlc19zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGluY2x1ZGUgQnl0ZXMwXG5cbiAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkJ5dGVzXCJcbiAgbGV0IHBwIGZtdCB0ID0gQ2FtbC5Gb3JtYXQuZnByaW50ZiBmbXQgXCIlU1wiICh0b19zdHJpbmcgdClcbmVuZFxuXG5pbmNsdWRlIFRcblxubW9kdWxlIFRvX2J5dGVzID0gQmxpdC5NYWtlIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCBjcmVhdGUgfmxlbiA9IGNyZWF0ZSBsZW5cbiAgZW5kKVxuXG5pbmNsdWRlIFRvX2J5dGVzXG5pbmNsdWRlIENvbXBhcmF0b3IuTWFrZSAoVClcbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXJfcHAgKFQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIEJ5dGVzX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxubW9kdWxlIFRvX3N0cmluZyA9IEJsaXQuTWFrZV90b19zdHJpbmcgKFQpIChUb19ieXRlcylcblxubW9kdWxlIEZyb21fc3RyaW5nID1cbiAgQmxpdC5NYWtlX2Rpc3RpbmN0XG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSB0ID0gc3RyaW5nXG5cbiAgICAgIGxldCBsZW5ndGggPSBTdHJpbmcubGVuZ3RoXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGxldCBjcmVhdGUgfmxlbiA9IGNyZWF0ZSBsZW5cbiAgICAgIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgICAgIGxldCB1bnNhZmVfYmxpdCA9IHVuc2FmZV9ibGl0X3N0cmluZ1xuICAgIGVuZClcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcblxubGV0IGluaXQgbiB+ZiA9XG4gIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8ICkgbiAwXG4gIHRoZW4gUHJpbnRmLmludmFsaWRfYXJnZiBcIkJ5dGVzLmluaXQgJWRcIiBuICgpO1xuICBsZXQgdCA9IGNyZWF0ZSBuIGluXG4gIGZvciBpID0gMCB0byBuIC0gMSBkb1xuICAgIHVuc2FmZV9zZXQgdCBpIChmIGkpXG4gIGRvbmU7XG4gIHRcbjs7XG5cbmxldCBvZl9jaGFyX2xpc3QgbCA9XG4gIGxldCB0ID0gY3JlYXRlIChMaXN0Lmxlbmd0aCBsKSBpblxuICBMaXN0Lml0ZXJpIGwgfmY6KGZ1biBpIGMgLT4gc2V0IHQgaSBjKTtcbiAgdFxuOztcblxubGV0IHRvX2xpc3QgdCA9XG4gIGxldCByZWMgbG9vcCB0IGkgYWNjID1cbiAgICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIGkgMFxuICAgIHRoZW4gYWNjXG4gICAgZWxzZSBsb29wIHQgKGkgLSAxKSAodW5zYWZlX2dldCB0IGkgOjogYWNjKVxuICBpblxuICBsb29wIHQgKGxlbmd0aCB0IC0gMSkgW11cbjs7XG5cbmxldCB0b19hcnJheSB0ID0gQXJyYXkuaW5pdCAobGVuZ3RoIHQpIH5mOihmdW4gaSAtPiB1bnNhZmVfZ2V0IHQgaSlcbmxldCBtYXAgdCB+ZiA9IG1hcCB0IH5mXG5sZXQgbWFwaSB0IH5mID0gbWFwaSB0IH5mXG5cbmxldCBmb2xkID1cbiAgbGV0IHJlYyBsb29wIHQgfmYgfmxlbiB+cG9zIGFjYyA9XG4gICAgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5lcXVhbCBwb3MgbGVuXG4gICAgdGhlbiBhY2NcbiAgICBlbHNlIGxvb3AgdCB+ZiB+bGVuIH5wb3M6KHBvcyArIDEpIChmIGFjYyAodW5zYWZlX2dldCB0IHBvcykpXG4gIGluXG4gIGZ1biB0IH5pbml0IH5mIC0+IGxvb3AgdCB+ZiB+bGVuOihsZW5ndGggdCkgfnBvczowIGluaXRcbjs7XG5cbmxldCBmb2xkaSA9XG4gIGxldCByZWMgbG9vcCB0IH5mIH5sZW4gfnBvcyBhY2MgPVxuICAgIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuZXF1YWwgcG9zIGxlblxuICAgIHRoZW4gYWNjXG4gICAgZWxzZSBsb29wIHQgfmYgfmxlbiB+cG9zOihwb3MgKyAxKSAoZiBwb3MgYWNjICh1bnNhZmVfZ2V0IHQgcG9zKSlcbiAgaW5cbiAgZnVuIHQgfmluaXQgfmYgLT4gbG9vcCB0IH5mIH5sZW46KGxlbmd0aCB0KSB+cG9zOjAgaW5pdFxuOztcblxubGV0IHRyIH50YXJnZXQgfnJlcGxhY2VtZW50IHMgPVxuICBmb3IgaSA9IDAgdG8gbGVuZ3RoIHMgLSAxIGRvXG4gICAgaWYgQ2hhci5lcXVhbCAodW5zYWZlX2dldCBzIGkpIHRhcmdldCB0aGVuIHVuc2FmZV9zZXQgcyBpIHJlcGxhY2VtZW50XG4gIGRvbmVcbjs7XG5cbmxldCB0cl9tdWx0aSB+dGFyZ2V0IH5yZXBsYWNlbWVudCA9XG4gIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA9ICkgKFN0cmluZy5sZW5ndGggdGFyZ2V0KSAwXG4gIHRoZW4gc3RhZ2UgaWdub3JlXG4gIGVsc2UgaWYgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID0gKSAoU3RyaW5nLmxlbmd0aCByZXBsYWNlbWVudCkgMFxuICB0aGVuIGludmFsaWRfYXJnIFwidHJfbXVsdGk6IHJlcGxhY2VtZW50IGlzIHRoZSBlbXB0eSBzdHJpbmdcIlxuICBlbHNlIChcbiAgICBtYXRjaCBCeXRlc190ci50cl9jcmVhdGVfbWFwIH50YXJnZXQgfnJlcGxhY2VtZW50IHdpdGhcbiAgICB8IE5vbmUgLT4gc3RhZ2UgaWdub3JlXG4gICAgfCBTb21lIHRyX21hcCAtPlxuICAgICAgc3RhZ2UgKGZ1biBzIC0+XG4gICAgICAgIGZvciBpID0gMCB0byBsZW5ndGggcyAtIDEgZG9cbiAgICAgICAgICB1bnNhZmVfc2V0IHMgaSAoU3RyaW5nLnVuc2FmZV9nZXQgdHJfbWFwIChDaGFyLnRvX2ludCAodW5zYWZlX2dldCBzIGkpKSlcbiAgICAgICAgZG9uZSkpXG47O1xuXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5sZXQgY29udGFpbnMgP3BvcyA/bGVuIHQgY2hhciA9XG4gIGxldCBwb3MsIGxlbiA9XG4gICAgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbi5nZXRfcG9zX2xlbl9leG4gKCkgP3BvcyA/bGVuIH50b3RhbF9sZW5ndGg6KGxlbmd0aCB0KVxuICBpblxuICBsZXQgbGFzdCA9IHBvcyArIGxlbiBpblxuICBsZXQgcmVjIGxvb3AgaSA9XG4gICAgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDwgKSBpIGxhc3RcbiAgICAmJiAoQ2hhci5lcXVhbCAoZ2V0IHQgaSkgY2hhciB8fCBsb29wIChpICsgMSkpXG4gIGluXG4gIGxvb3AgcG9zXG47O1xuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgQnl0ZXNfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCIjIDEgXCJzcmMvaGV4X2xleGVyLm1sbFwiXG4gXG50eXBlIHJlc3VsdCA9XG58IE5lZyBvZiBzdHJpbmdcbnwgUG9zIG9mIHN0cmluZ1xuXG4jIDggXCJzcmMvaGV4X2xleGVyLm1sXCJcbmxldCBfX29jYW1sX2xleF90YWJsZXMgPSB7XG4gIExleGluZy5sZXhfYmFzZSA9XG4gICBcIlxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDFcXDAwMFxcMDAxXFwwMDBcXDAwMlxcMDAwXFwwMjdcXDAwMFxcMDgyXFwwMDBcXDEwNVxcMDAwXFxcbiAgICBcIjtcbiAgTGV4aW5nLmxleF9iYWNrdHJrID1cbiAgIFwiXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwMFxcMDAwXFwyNTVcXDI1NVxcMDAxXFwwMDBcXFxuICAgIFwiO1xuICBMZXhpbmcubGV4X2RlZmF1bHQgPVxuICAgXCJcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXCI7XG4gIExleGluZy5sZXhfdHJhbnMgPVxuICAgXCJcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDJcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMVxcMDAwXFwwMDNcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDA2XFwwMDBcXDAwNFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFxcbiAgICBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwNlxcMDAwXFwwMDRcXDAwMFxcMDA1XFwwMDBcXDAwMFxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDA3XFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDdcXDAwMFxcMDAwXFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcXG4gICAgXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXFxuICAgIFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFwwMDBcXDAwMFxcMDAwXFxcbiAgICBcXDAwMFxcMDAwXFwwMDBcXDAwMFwiO1xuICBMZXhpbmcubGV4X2NoZWNrID1cbiAgIFwiXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDAwXFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwwMDBcXDAwMFxcMDAyXFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXFxuICAgIFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcXG4gICAgXFwwMDRcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDAwMVxcMDAwXFwwMDNcXDAwMFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDVcXDAwMFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcXG4gICAgXFwwMDVcXDAwMFxcMDA1XFwwMDBcXDI1NVxcMjU1XFwwMDRcXDAwMFxcMDA0XFwwMDBcXDAwNFxcMDAwXFwwMDRcXDAwMFxcMDA0XFwwMDBcXFxuICAgIFxcMDA0XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwwMDFcXDAwMFxcMDAzXFwwMDBcXDAwNVxcMDAwXFwyNTVcXDI1NVxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDVcXDAwMFxcMDA1XFwwMDBcXFxuICAgIFxcMDA1XFwwMDBcXDAwNVxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFxcbiAgICBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXFxuICAgIFxcMDA2XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMDA2XFwwMDBcXDAwNlxcMDAwXFwwMDZcXDAwMFxcMDA2XFwwMDBcXDAwNlxcMDAwXFxcbiAgICBcXDAwNlxcMDAwXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMDA3XFwwMDBcXDI1NVxcMjU1XFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFwwMDdcXDAwMFxcMDA3XFwwMDBcXDAwN1xcMDAwXFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXFxuICAgIFxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFxcbiAgICBcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcMjU1XFwyNTVcXDI1NVxcXG4gICAgXFwyNTVcXDI1NVxcMjU1XFwyNTVcIjtcbiAgTGV4aW5nLmxleF9iYXNlX2NvZGUgPVxuICAgXCJcIjtcbiAgTGV4aW5nLmxleF9iYWNrdHJrX2NvZGUgPVxuICAgXCJcIjtcbiAgTGV4aW5nLmxleF9kZWZhdWx0X2NvZGUgPVxuICAgXCJcIjtcbiAgTGV4aW5nLmxleF90cmFuc19jb2RlID1cbiAgIFwiXCI7XG4gIExleGluZy5sZXhfY2hlY2tfY29kZSA9XG4gICBcIlwiO1xuICBMZXhpbmcubGV4X2NvZGUgPVxuICAgXCJcIjtcbn1cblxubGV0IHJlYyBwYXJzZV9oZXggbGV4YnVmID1cbiAgIF9fb2NhbWxfbGV4X3BhcnNlX2hleF9yZWMgbGV4YnVmIDBcbmFuZCBfX29jYW1sX2xleF9wYXJzZV9oZXhfcmVjIGxleGJ1ZiBfX29jYW1sX2xleF9zdGF0ZSA9XG4gIG1hdGNoIExleGluZy5lbmdpbmUgX19vY2FtbF9sZXhfdGFibGVzIF9fb2NhbWxfbGV4X3N0YXRlIGxleGJ1ZiB3aXRoXG4gICAgICB8IDAgLT5cbmxldFxuIyA4IFwic3JjL2hleF9sZXhlci5tbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVxuIyAxMzUgXCJzcmMvaGV4X2xleGVyLm1sXCJcbj0gTGV4aW5nLnN1Yl9sZXhlbWUgbGV4YnVmIChsZXhidWYuTGV4aW5nLmxleF9zdGFydF9wb3MgKyAzKSBsZXhidWYuTGV4aW5nLmxleF9jdXJyX3BvcyBpblxuIyAxNCBcInNyYy9oZXhfbGV4ZXIubWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCBOZWcgYm9keSApXG4jIDEzOSBcInNyYy9oZXhfbGV4ZXIubWxcIlxuXG4gIHwgMSAtPlxubGV0XG4jIDggXCJzcmMvaGV4X2xleGVyLm1sbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5XG4jIDE0NSBcInNyYy9oZXhfbGV4ZXIubWxcIlxuPSBMZXhpbmcuc3ViX2xleGVtZSBsZXhidWYgKGxleGJ1Zi5MZXhpbmcubGV4X3N0YXJ0X3BvcyArIDIpIGxleGJ1Zi5MZXhpbmcubGV4X2N1cnJfcG9zIGluXG4jIDE1IFwic3JjL2hleF9sZXhlci5tbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoIFBvcyBib2R5IClcbiMgMTQ5IFwic3JjL2hleF9sZXhlci5tbFwiXG5cbiAgfCBfX29jYW1sX2xleF9zdGF0ZSAtPiBsZXhidWYuTGV4aW5nLnJlZmlsbF9idWZmIGxleGJ1ZjtcbiAgICAgIF9fb2NhbWxfbGV4X3BhcnNlX2hleF9yZWMgbGV4YnVmIF9fb2NhbWxfbGV4X3N0YXRlXG5cbjs7XG5cbiIsIm9wZW4hIEltcG9ydFxubW9kdWxlIEludCA9IEludDBcbm1vZHVsZSBTeXMgPSBTeXMwXG5cbmxldCBjb252ZXJ0X2ZhaWx1cmUgeCBhIGIgdG9fc3RyaW5nID1cbiAgUHJpbnRmLmZhaWx3aXRoZlxuICAgIFwiY29udmVyc2lvbiBmcm9tICVzIHRvICVzIGZhaWxlZDogJXMgaXMgb3V0IG9mIHJhbmdlXCJcbiAgICBhXG4gICAgYlxuICAgICh0b19zdHJpbmcgeClcbiAgICAoKVxuW0BAY29sZF0gW0BAaW5saW5lIG5ldmVyXSBbQEBsb2NhbCBuZXZlcl0gW0BAc3BlY2lhbGlzZSBuZXZlcl1cbjs7XG5cbmxldCBudW1fYml0c19pbnQgPSBTeXMuaW50X3NpemVfaW5fYml0c1xubGV0IG51bV9iaXRzX2ludDMyID0gMzJcbmxldCBudW1fYml0c19pbnQ2NCA9IDY0XG5sZXQgbnVtX2JpdHNfbmF0aXZlaW50ID0gV29yZF9zaXplLm51bV9iaXRzIFdvcmRfc2l6ZS53b3JkX3NpemVcbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50ID0gNjMgfHwgbnVtX2JpdHNfaW50ID0gMzEgfHwgbnVtX2JpdHNfaW50ID0gMzIpXG5sZXQgbWluX2ludDMyID0gQ2FtbC5JbnQzMi5taW5faW50XG5sZXQgbWF4X2ludDMyID0gQ2FtbC5JbnQzMi5tYXhfaW50XG5sZXQgbWluX2ludDY0ID0gQ2FtbC5JbnQ2NC5taW5faW50XG5sZXQgbWF4X2ludDY0ID0gQ2FtbC5JbnQ2NC5tYXhfaW50XG5sZXQgbWluX25hdGl2ZWludCA9IENhbWwuTmF0aXZlaW50Lm1pbl9pbnRcbmxldCBtYXhfbmF0aXZlaW50ID0gQ2FtbC5OYXRpdmVpbnQubWF4X2ludFxubGV0IGludF90b19zdHJpbmcgPSBDYW1sLnN0cmluZ19vZl9pbnRcbmxldCBpbnQzMl90b19zdHJpbmcgPSBDYW1sLkludDMyLnRvX3N0cmluZ1xubGV0IGludDY0X3RvX3N0cmluZyA9IENhbWwuSW50NjQudG9fc3RyaW5nXG5sZXQgbmF0aXZlaW50X3RvX3N0cmluZyA9IENhbWwuTmF0aXZlaW50LnRvX3N0cmluZ1xuXG4oKiBpbnQgPC0+IGludDMyICopXG5cbmxldCBpbnRfdG9faW50MzJfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnRcIiBcImludDMyXCIgaW50X3RvX3N0cmluZ1xubGV0IGludDMyX3RvX2ludF9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludDMyXCIgXCJpbnRcIiBpbnQzMl90b19zdHJpbmdcbmxldCBpbnQzMl90b19pbnRfdHJ1bmMgPSBDYW1sLkludDMyLnRvX2ludFxubGV0IGludF90b19pbnQzMl90cnVuYyA9IENhbWwuSW50MzIub2ZfaW50XG5cbmxldCBpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiA9XG4gIGlmIG51bV9iaXRzX2ludCA8PSBudW1fYml0c19pbnQzMlxuICB0aGVuIGZ1biBfIC0+IHRydWVcbiAgZWxzZSAoXG4gICAgbGV0IG1pbiA9IGludDMyX3RvX2ludF90cnVuYyBtaW5faW50MzIgaW5cbiAgICBsZXQgbWF4ID0gaW50MzJfdG9faW50X3RydW5jIG1heF9pbnQzMiBpblxuICAgIGZ1biB4IC0+IGNvbXBhcmVfaW50IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQgeCBtYXggPD0gMClcbjs7XG5cbmxldCBpbnQzMl9pc19yZXByZXNlbnRhYmxlX2FzX2ludCA9XG4gIGlmIG51bV9iaXRzX2ludDMyIDw9IG51bV9iaXRzX2ludFxuICB0aGVuIGZ1biBfIC0+IHRydWVcbiAgZWxzZSAoXG4gICAgbGV0IG1pbiA9IGludF90b19pbnQzMl90cnVuYyBJbnQubWluX3ZhbHVlIGluXG4gICAgbGV0IG1heCA9IGludF90b19pbnQzMl90cnVuYyBJbnQubWF4X3ZhbHVlIGluXG4gICAgZnVuIHggLT4gY29tcGFyZV9pbnQzMiBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50MzIgeCBtYXggPD0gMClcbjs7XG5cbmxldCBpbnRfdG9faW50MzIgeCA9XG4gIGlmIGludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHggdGhlbiBTb21lIChpbnRfdG9faW50MzJfdHJ1bmMgeCkgZWxzZSBOb25lXG47O1xuXG5sZXQgaW50MzJfdG9faW50IHggPVxuICBpZiBpbnQzMl9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4IHRoZW4gU29tZSAoaW50MzJfdG9faW50X3RydW5jIHgpIGVsc2UgTm9uZVxuOztcblxubGV0IGludF90b19pbnQzMl9leG4geCA9XG4gIGlmIGludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyIHggdGhlbiBpbnRfdG9faW50MzJfdHJ1bmMgeCBlbHNlIGludF90b19pbnQzMl9mYWlsdXJlIHhcbjs7XG5cbmxldCBpbnQzMl90b19pbnRfZXhuIHggPVxuICBpZiBpbnQzMl9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4IHRoZW4gaW50MzJfdG9faW50X3RydW5jIHggZWxzZSBpbnQzMl90b19pbnRfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQgPC0+IGludDY0ICopXG5cbmxldCBpbnQ2NF90b19pbnRfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnQ2NFwiIFwiaW50XCIgaW50NjRfdG9fc3RyaW5nXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludCA8IG51bV9iaXRzX2ludDY0KVxubGV0IGludF90b19pbnQ2NCA9IENhbWwuSW50NjQub2ZfaW50XG5sZXQgaW50NjRfdG9faW50X3RydW5jID0gQ2FtbC5JbnQ2NC50b19pbnRcblxubGV0IGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50ID1cbiAgbGV0IG1pbiA9IGludF90b19pbnQ2NCBJbnQubWluX3ZhbHVlIGluXG4gIGxldCBtYXggPSBpbnRfdG9faW50NjQgSW50Lm1heF92YWx1ZSBpblxuICBmdW4geCAtPiBjb21wYXJlX2ludDY0IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQ2NCB4IG1heCA8PSAwXG47O1xuXG5sZXQgaW50NjRfdG9faW50IHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4IHRoZW4gU29tZSAoaW50NjRfdG9faW50X3RydW5jIHgpIGVsc2UgTm9uZVxuOztcblxubGV0IGludDY0X3RvX2ludF9leG4geCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHggdGhlbiBpbnQ2NF90b19pbnRfdHJ1bmMgeCBlbHNlIGludDY0X3RvX2ludF9mYWlsdXJlIHhcbjs7XG5cbigqIGludCA8LT4gbmF0aXZlaW50ICopXG5cbmxldCBuYXRpdmVpbnRfdG9faW50X2ZhaWx1cmUgeCA9IGNvbnZlcnRfZmFpbHVyZSB4IFwibmF0aXZlaW50XCIgXCJpbnRcIiBuYXRpdmVpbnRfdG9fc3RyaW5nXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludCA8PSBudW1fYml0c19uYXRpdmVpbnQpXG5sZXQgaW50X3RvX25hdGl2ZWludCA9IENhbWwuTmF0aXZlaW50Lm9mX2ludFxubGV0IG5hdGl2ZWludF90b19pbnRfdHJ1bmMgPSBDYW1sLk5hdGl2ZWludC50b19pbnRcblxubGV0IG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCA9XG4gIGlmIG51bV9iaXRzX25hdGl2ZWludCA8PSBudW1fYml0c19pbnRcbiAgdGhlbiBmdW4gXyAtPiB0cnVlXG4gIGVsc2UgKFxuICAgIGxldCBtaW4gPSBpbnRfdG9fbmF0aXZlaW50IEludC5taW5fdmFsdWUgaW5cbiAgICBsZXQgbWF4ID0gaW50X3RvX25hdGl2ZWludCBJbnQubWF4X3ZhbHVlIGluXG4gICAgZnVuIHggLT4gY29tcGFyZV9uYXRpdmVpbnQgbWluIHggPD0gMCAmJiBjb21wYXJlX25hdGl2ZWludCB4IG1heCA8PSAwKVxuOztcblxubGV0IG5hdGl2ZWludF90b19pbnQgeCA9XG4gIGlmIG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludCB4IHRoZW4gU29tZSAobmF0aXZlaW50X3RvX2ludF90cnVuYyB4KSBlbHNlIE5vbmVcbjs7XG5cbmxldCBuYXRpdmVpbnRfdG9faW50X2V4biB4ID1cbiAgaWYgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50IHhcbiAgdGhlbiBuYXRpdmVpbnRfdG9faW50X3RydW5jIHhcbiAgZWxzZSBuYXRpdmVpbnRfdG9faW50X2ZhaWx1cmUgeFxuOztcblxuKCogaW50MzIgPC0+IGludDY0ICopXG5cbmxldCBpbnQ2NF90b19pbnQzMl9mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludDY0XCIgXCJpbnQzMlwiIGludDY0X3RvX3N0cmluZ1xubGV0ICgpID0gYXNzZXJ0IChudW1fYml0c19pbnQzMiA8IG51bV9iaXRzX2ludDY0KVxubGV0IGludDMyX3RvX2ludDY0ID0gQ2FtbC5JbnQ2NC5vZl9pbnQzMlxubGV0IGludDY0X3RvX2ludDMyX3RydW5jID0gQ2FtbC5JbnQ2NC50b19pbnQzMlxuXG5sZXQgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiA9XG4gIGxldCBtaW4gPSBpbnQzMl90b19pbnQ2NCBtaW5faW50MzIgaW5cbiAgbGV0IG1heCA9IGludDMyX3RvX2ludDY0IG1heF9pbnQzMiBpblxuICBmdW4geCAtPiBjb21wYXJlX2ludDY0IG1pbiB4IDw9IDAgJiYgY29tcGFyZV9pbnQ2NCB4IG1heCA8PSAwXG47O1xuXG5sZXQgaW50NjRfdG9faW50MzIgeCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeCB0aGVuIFNvbWUgKGludDY0X3RvX2ludDMyX3RydW5jIHgpIGVsc2UgTm9uZVxuOztcblxubGV0IGludDY0X3RvX2ludDMyX2V4biB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4XG4gIHRoZW4gaW50NjRfdG9faW50MzJfdHJ1bmMgeFxuICBlbHNlIGludDY0X3RvX2ludDMyX2ZhaWx1cmUgeFxuOztcblxuKCogaW50MzIgPC0+IG5hdGl2ZWludCAqKVxuXG5sZXQgbmF0aXZlaW50X3RvX2ludDMyX2ZhaWx1cmUgeCA9XG4gIGNvbnZlcnRfZmFpbHVyZSB4IFwibmF0aXZlaW50XCIgXCJpbnQzMlwiIG5hdGl2ZWludF90b19zdHJpbmdcbjs7XG5cbmxldCAoKSA9IGFzc2VydCAobnVtX2JpdHNfaW50MzIgPD0gbnVtX2JpdHNfbmF0aXZlaW50KVxubGV0IGludDMyX3RvX25hdGl2ZWludCA9IENhbWwuTmF0aXZlaW50Lm9mX2ludDMyXG5sZXQgbmF0aXZlaW50X3RvX2ludDMyX3RydW5jID0gQ2FtbC5OYXRpdmVpbnQudG9faW50MzJcblxubGV0IG5hdGl2ZWludF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDMyID1cbiAgaWYgbnVtX2JpdHNfbmF0aXZlaW50IDw9IG51bV9iaXRzX2ludDMyXG4gIHRoZW4gZnVuIF8gLT4gdHJ1ZVxuICBlbHNlIChcbiAgICBsZXQgbWluID0gaW50MzJfdG9fbmF0aXZlaW50IG1pbl9pbnQzMiBpblxuICAgIGxldCBtYXggPSBpbnQzMl90b19uYXRpdmVpbnQgbWF4X2ludDMyIGluXG4gICAgZnVuIHggLT4gY29tcGFyZV9uYXRpdmVpbnQgbWluIHggPD0gMCAmJiBjb21wYXJlX25hdGl2ZWludCB4IG1heCA8PSAwKVxuOztcblxubGV0IG5hdGl2ZWludF90b19pbnQzMiB4ID1cbiAgaWYgbmF0aXZlaW50X2lzX3JlcHJlc2VudGFibGVfYXNfaW50MzIgeFxuICB0aGVuIFNvbWUgKG5hdGl2ZWludF90b19pbnQzMl90cnVuYyB4KVxuICBlbHNlIE5vbmVcbjs7XG5cbmxldCBuYXRpdmVpbnRfdG9faW50MzJfZXhuIHggPVxuICBpZiBuYXRpdmVpbnRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQzMiB4XG4gIHRoZW4gbmF0aXZlaW50X3RvX2ludDMyX3RydW5jIHhcbiAgZWxzZSBuYXRpdmVpbnRfdG9faW50MzJfZmFpbHVyZSB4XG47O1xuXG4oKiBpbnQ2NCA8LT4gbmF0aXZlaW50ICopXG5cbmxldCBpbnQ2NF90b19uYXRpdmVpbnRfZmFpbHVyZSB4ID0gY29udmVydF9mYWlsdXJlIHggXCJpbnQ2NFwiIFwibmF0aXZlaW50XCIgaW50NjRfdG9fc3RyaW5nXG5sZXQgKCkgPSBhc3NlcnQgKG51bV9iaXRzX2ludDY0ID49IG51bV9iaXRzX25hdGl2ZWludClcbmxldCBpbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmMgPSBDYW1sLkludDY0LnRvX25hdGl2ZWludFxubGV0IG5hdGl2ZWludF90b19pbnQ2NCA9IENhbWwuSW50NjQub2ZfbmF0aXZlaW50XG5cbmxldCBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX25hdGl2ZWludCA9XG4gIGlmIG51bV9iaXRzX2ludDY0IDw9IG51bV9iaXRzX25hdGl2ZWludFxuICB0aGVuIGZ1biBfIC0+IHRydWVcbiAgZWxzZSAoXG4gICAgbGV0IG1pbiA9IG5hdGl2ZWludF90b19pbnQ2NCBtaW5fbmF0aXZlaW50IGluXG4gICAgbGV0IG1heCA9IG5hdGl2ZWludF90b19pbnQ2NCBtYXhfbmF0aXZlaW50IGluXG4gICAgZnVuIHggLT4gY29tcGFyZV9pbnQ2NCBtaW4geCA8PSAwICYmIGNvbXBhcmVfaW50NjQgeCBtYXggPD0gMClcbjs7XG5cbmxldCBpbnQ2NF90b19uYXRpdmVpbnQgeCA9XG4gIGlmIGludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfbmF0aXZlaW50IHhcbiAgdGhlbiBTb21lIChpbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmMgeClcbiAgZWxzZSBOb25lXG47O1xuXG5sZXQgaW50NjRfdG9fbmF0aXZlaW50X2V4biB4ID1cbiAgaWYgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19uYXRpdmVpbnQgeFxuICB0aGVuIGludDY0X3RvX25hdGl2ZWludF90cnVuYyB4XG4gIGVsc2UgaW50NjRfdG9fbmF0aXZlaW50X2ZhaWx1cmUgeFxuOztcblxuKCogaW50NjQgPC0+IGludDYzICopXG5cbmxldCBpbnQ2NF90b19pbnQ2M19mYWlsdXJlIHggPSBjb252ZXJ0X2ZhaWx1cmUgeCBcImludDY0XCIgXCJpbnQ2M1wiIGludDY0X3RvX3N0cmluZ1xuXG5sZXQgaW50NjRfaXNfcmVwcmVzZW50YWJsZV9hc19pbnQ2MyA9XG4gIGxldCBtaW4gPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IG1pbl9pbnQ2NCAxIGluXG4gIGxldCBtYXggPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IG1heF9pbnQ2NCAxIGluXG4gIGZ1biB4IC0+IGNvbXBhcmVfaW50NjQgbWluIHggPD0gMCAmJiBjb21wYXJlX2ludDY0IHggbWF4IDw9IDBcbjs7XG5cbmxldCBpbnQ2NF9maXRfb25faW50NjNfZXhuIHggPVxuICBpZiBpbnQ2NF9pc19yZXByZXNlbnRhYmxlX2FzX2ludDYzIHggdGhlbiAoKSBlbHNlIGludDY0X3RvX2ludDYzX2ZhaWx1cmUgeFxuOztcblxuKCogc3RyaW5nIGNvbnZlcnNpb25zICopXG5cbmxldCBpbnNlcnRfZGVsaW1pdGVyX2V2ZXJ5IGlucHV0IH5kZWxpbWl0ZXIgfmNoYXJzX3Blcl9kZWxpbWl0ZXIgPVxuICBsZXQgaW5wdXRfbGVuZ3RoID0gU3RyaW5nLmxlbmd0aCBpbnB1dCBpblxuICBpZiBpbnB1dF9sZW5ndGggPD0gY2hhcnNfcGVyX2RlbGltaXRlclxuICB0aGVuIGlucHV0XG4gIGVsc2UgKFxuICAgIGxldCBoYXNfc2lnbiA9XG4gICAgICBtYXRjaCBpbnB1dC5bMF0gd2l0aFxuICAgICAgfCAnKycgfCAnLScgLT4gdHJ1ZVxuICAgICAgfCBfIC0+IGZhbHNlXG4gICAgaW5cbiAgICBsZXQgbnVtX2RpZ2l0cyA9IGlmIGhhc19zaWduIHRoZW4gaW5wdXRfbGVuZ3RoIC0gMSBlbHNlIGlucHV0X2xlbmd0aCBpblxuICAgIGxldCBudW1fZGVsaW1pdGVycyA9IChudW1fZGlnaXRzIC0gMSkgLyBjaGFyc19wZXJfZGVsaW1pdGVyIGluXG4gICAgbGV0IG91dHB1dF9sZW5ndGggPSBpbnB1dF9sZW5ndGggKyBudW1fZGVsaW1pdGVycyBpblxuICAgIGxldCBvdXRwdXQgPSBCeXRlcy5jcmVhdGUgb3V0cHV0X2xlbmd0aCBpblxuICAgIGxldCBpbnB1dF9wb3MgPSByZWYgKGlucHV0X2xlbmd0aCAtIDEpIGluXG4gICAgbGV0IG91dHB1dF9wb3MgPSByZWYgKG91dHB1dF9sZW5ndGggLSAxKSBpblxuICAgIGxldCBudW1fY2hhcnNfdW50aWxfZGVsaW1pdGVyID0gcmVmIGNoYXJzX3Blcl9kZWxpbWl0ZXIgaW5cbiAgICBsZXQgZmlyc3RfZGlnaXRfcG9zID0gaWYgaGFzX3NpZ24gdGhlbiAxIGVsc2UgMCBpblxuICAgIHdoaWxlICFpbnB1dF9wb3MgPj0gZmlyc3RfZGlnaXRfcG9zIGRvXG4gICAgICBpZiAhbnVtX2NoYXJzX3VudGlsX2RlbGltaXRlciA9IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBCeXRlcy5zZXQgb3V0cHV0ICFvdXRwdXRfcG9zIGRlbGltaXRlcjtcbiAgICAgICAgZGVjciBvdXRwdXRfcG9zO1xuICAgICAgICBudW1fY2hhcnNfdW50aWxfZGVsaW1pdGVyIDo9IGNoYXJzX3Blcl9kZWxpbWl0ZXIpO1xuICAgICAgQnl0ZXMuc2V0IG91dHB1dCAhb3V0cHV0X3BvcyBpbnB1dC5bIWlucHV0X3Bvc107XG4gICAgICBkZWNyIGlucHV0X3BvcztcbiAgICAgIGRlY3Igb3V0cHV0X3BvcztcbiAgICAgIGRlY3IgbnVtX2NoYXJzX3VudGlsX2RlbGltaXRlclxuICAgIGRvbmU7XG4gICAgaWYgaGFzX3NpZ24gdGhlbiBCeXRlcy5zZXQgb3V0cHV0IDAgaW5wdXQuWzBdO1xuICAgIEJ5dGVzLnVuc2FmZV90b19zdHJpbmcgfm5vX211dGF0aW9uX3doaWxlX3N0cmluZ19yZWFjaGFibGU6b3V0cHV0KVxuOztcblxubGV0IGluc2VydF9kZWxpbWl0ZXIgaW5wdXQgfmRlbGltaXRlciA9XG4gIGluc2VydF9kZWxpbWl0ZXJfZXZlcnkgaW5wdXQgfmRlbGltaXRlciB+Y2hhcnNfcGVyX2RlbGltaXRlcjozXG47O1xuXG5sZXQgaW5zZXJ0X3VuZGVyc2NvcmVzIGlucHV0ID0gaW5zZXJ0X2RlbGltaXRlciBpbnB1dCB+ZGVsaW1pdGVyOidfJ1xubGV0IHNleHBfb2ZfaW50X3N0eWxlID0gU2V4cC5vZl9pbnRfc3R5bGVcblxubW9kdWxlIE1ha2UgKEkgOiBzaWdcbiAgICB0eXBlIHRcblxuICAgIHZhbCB0b19zdHJpbmcgOiB0IC0+IHN0cmluZ1xuICBlbmQpID1cbnN0cnVjdFxuICBvcGVuIElcblxuICBsZXQgY2hhcnNfcGVyX2RlbGltaXRlciA9IDNcblxuICBsZXQgdG9fc3RyaW5nX2h1bSA/KGRlbGltaXRlciA9ICdfJykgdCA9XG4gICAgaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSAodG9fc3RyaW5nIHQpIH5kZWxpbWl0ZXIgfmNoYXJzX3Blcl9kZWxpbWl0ZXJcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IHQgPVxuICAgIGxldCBzID0gdG9fc3RyaW5nIHQgaW5cbiAgICBTZXhwLkF0b21cbiAgICAgIChtYXRjaCAhc2V4cF9vZl9pbnRfc3R5bGUgd2l0aFxuICAgICAgIHwgYFVuZGVyc2NvcmVzIC0+IGluc2VydF9kZWxpbWl0ZXJfZXZlcnkgcyB+Y2hhcnNfcGVyX2RlbGltaXRlciB+ZGVsaW1pdGVyOidfJ1xuICAgICAgIHwgYE5vX3VuZGVyc2NvcmVzIC0+IHMpXG4gIDs7XG5lbmRcblxubW9kdWxlIE1ha2VfaGV4IChJIDogc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcbiAgICBpbmNsdWRlIFBweF9oYXNoX2xpYi5IYXNoYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIFtAQEBlbmRdXG5cbiAgICB2YWwgdG9fc3RyaW5nIDogdCAtPiBzdHJpbmdcbiAgICB2YWwgb2Zfc3RyaW5nIDogc3RyaW5nIC0+IHRcbiAgICB2YWwgemVybyA6IHRcbiAgICB2YWwgKCA8ICkgOiB0IC0+IHQgLT4gYm9vbFxuICAgIHZhbCBuZWcgOiB0IC0+IHRcbiAgICB2YWwgbW9kdWxlX25hbWUgOiBzdHJpbmdcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbW9kdWxlIFRfaGV4ID0gc3RydWN0XG4gICAgdHlwZSB0ID0gSS50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoSS5jb21wYXJlIDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIEkuaGFzaF9mb2xkX3RcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gSS5oYXNoIGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgW0BAQGVuZF1cblxuICAgIGxldCBjaGFyc19wZXJfZGVsaW1pdGVyID0gNFxuXG4gICAgbGV0IHRvX3N0cmluZycgP2RlbGltaXRlciB0ID1cbiAgICAgIGxldCBtYWtlX3N1ZmZpeCA9XG4gICAgICAgIG1hdGNoIGRlbGltaXRlciB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBJLnRvX3N0cmluZ1xuICAgICAgICB8IFNvbWUgZGVsaW1pdGVyIC0+XG4gICAgICAgICAgZnVuIHQgLT4gaW5zZXJ0X2RlbGltaXRlcl9ldmVyeSAoSS50b19zdHJpbmcgdCkgfmRlbGltaXRlciB+Y2hhcnNfcGVyX2RlbGltaXRlclxuICAgICAgaW5cbiAgICAgIGlmIEkuKCA8ICkgdCBJLnplcm8gdGhlbiBcIi0weFwiIF4gbWFrZV9zdWZmaXggKEkubmVnIHQpIGVsc2UgXCIweFwiIF4gbWFrZV9zdWZmaXggdFxuICAgIDs7XG5cbiAgICBsZXQgdG9fc3RyaW5nIHQgPSB0b19zdHJpbmcnIHQgP2RlbGltaXRlcjpOb25lXG4gICAgbGV0IHRvX3N0cmluZ19odW0gPyhkZWxpbWl0ZXIgPSAnXycpIHQgPSB0b19zdHJpbmcnIHQgfmRlbGltaXRlclxuXG4gICAgbGV0IGludmFsaWQgc3RyID1cbiAgICAgIFByaW50Zi5mYWlsd2l0aGYgXCIlcy5vZl9zdHJpbmc6IGludmFsaWQgaW5wdXQgJVNcIiBJLm1vZHVsZV9uYW1lIHN0ciAoKVxuICAgIDs7XG5cbiAgICBsZXQgb2Zfc3RyaW5nX3dpdGhfZGVsaW1pdGVyIHN0ciA9XG4gICAgICBJLm9mX3N0cmluZyAoU3RyaW5nLmZpbHRlciBzdHIgfmY6KGZ1biBjIC0+IENoYXIuKCA8PiApIGMgJ18nKSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX3N0cmluZyBzdHIgPVxuICAgICAgbGV0IG1vZHVsZSBMID0gSGV4X2xleGVyIGluXG4gICAgICBsZXQgbGV4ID0gQ2FtbC5MZXhpbmcuZnJvbV9zdHJpbmcgc3RyIGluXG4gICAgICBsZXQgcmVzdWx0ID0gT3B0aW9uLnRyeV93aXRoIChmdW4gKCkgLT4gTC5wYXJzZV9oZXggbGV4KSBpblxuICAgICAgaWYgbGV4LmxleF9jdXJyX3BvcyA9IGxleC5sZXhfYnVmZmVyX2xlblxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIHJlc3VsdCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBpbnZhbGlkIHN0clxuICAgICAgICB8IFNvbWUgKE5lZyBib2R5KSAtPiBJLm5lZyAob2Zfc3RyaW5nX3dpdGhfZGVsaW1pdGVyIGJvZHkpXG4gICAgICAgIHwgU29tZSAoUG9zIGJvZHkpIC0+IG9mX3N0cmluZ193aXRoX2RlbGltaXRlciBib2R5KVxuICAgICAgZWxzZSBpbnZhbGlkIHN0clxuICAgIDs7XG5cbiAgICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgICAgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLmNvZXJjZSBTdHJpbmcudF9zZXhwX2dyYW1tYXJcbiAgICA7O1xuICBlbmRcblxuICBtb2R1bGUgSGV4ID0gc3RydWN0XG4gICAgaW5jbHVkZSBUX2hleFxuICAgIGluY2x1ZGUgU2V4cGFibGUuT2Zfc3RyaW5nYWJsZSAoVF9oZXgpXG4gIGVuZFxuZW5kXG4iLCIoKiBUaGlzIGZpbGUgd2FzIGF1dG9nZW5lcmF0ZWQgYnkgLi4vZ2VuZXJhdGUvZ2VuZXJhdGVfcG93X292ZXJmbG93X2JvdW5kcy5leGUgKilcblxub3BlbiEgSW1wb3J0XG5cbm1vZHVsZSBBcnJheSA9IEFycmF5MFxuXG4oKiBXZSBoYXZlIHRvIHVzZSBJbnQ2NC50b19pbnRfZXhuIGluc3RlYWQgb2YgaW50IGNvbnN0YW50cyB0byBtYWtlXG4gICBzdXJlIHRoYXQgZmlsZSBjYW4gYmUgcHJlcHJvY2Vzc2VkIG9uIDMyLWJpdCBtYWNoaW5lcy4gKilcblxubGV0IG92ZXJmbG93X2JvdW5kX21heF9pbnQzMl92YWx1ZSA6IGludDMyID1cbiAgMjE0NzQ4MzY0N2xcblxubGV0IGludDMyX3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcyA6IGludDMyIGFycmF5ID1cbiAgW3wgMjE0NzQ4MzY0N2xcbiAgOyAgMjE0NzQ4MzY0N2xcbiAgOyAgNDYzNDBsXG4gIDsgIDEyOTBsXG4gIDsgIDIxNWxcbiAgOyAgNzNsXG4gIDsgIDM1bFxuICA7ICAyMWxcbiAgOyAgMTRsXG4gIDsgIDEwbFxuICA7ICA4bFxuICA7ICA3bFxuICA7ICA1bFxuICA7ICA1bFxuICA7ICA0bFxuICA7ICA0bFxuICA7ICAzbFxuICA7ICAzbFxuICA7ICAzbFxuICA7ICAzbFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAybFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICA7ICAxbFxuICB8XVxuXG5sZXQgb3ZlcmZsb3dfYm91bmRfbWF4X2ludF92YWx1ZSA6IGludCA9XG4gICgtMSkgbHNyIDFcblxubGV0IGludF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMgOiBpbnQgYXJyYXkgPVxuICBtYXRjaCBJbnRfY29udmVyc2lvbnMubnVtX2JpdHNfaW50IHdpdGhcbiAgfCAzMiAtPiBBcnJheS5tYXAgaW50MzJfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIH5mOkNhbWwuSW50MzIudG9faW50XG4gIHwgNjMgLT5cbiAgICBbfCBDYW1sLkludDY0LnRvX2ludCA0NjExNjg2MDE4NDI3Mzg3OTAzTFxuICAgIDsgIENhbWwuSW50NjQudG9faW50IDQ2MTE2ODYwMTg0MjczODc5MDNMXG4gICAgOyAgQ2FtbC5JbnQ2NC50b19pbnQgMjE0NzQ4MzY0N0xcbiAgICA7ICAxNjY0NTEwXG4gICAgOyAgNDYzNDBcbiAgICA7ICA1NDA0XG4gICAgOyAgMTI5MFxuICAgIDsgIDQ2M1xuICAgIDsgIDIxNVxuICAgIDsgIDExOFxuICAgIDsgIDczXG4gICAgOyAgNDlcbiAgICA7ICAzNVxuICAgIDsgIDI3XG4gICAgOyAgMjFcbiAgICA7ICAxN1xuICAgIDsgIDE0XG4gICAgOyAgMTJcbiAgICA7ICAxMFxuICAgIDsgIDlcbiAgICA7ICA4XG4gICAgOyAgN1xuICAgIDsgIDdcbiAgICA7ICA2XG4gICAgOyAgNVxuICAgIDsgIDVcbiAgICA7ICA1XG4gICAgOyAgNFxuICAgIDsgIDRcbiAgICA7ICA0XG4gICAgOyAgNFxuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIHxdXG4gIHwgMzEgLT5cbiAgICBbfCAxMDczNzQxODIzXG4gICAgOyAgMTA3Mzc0MTgyM1xuICAgIDsgIDMyNzY3XG4gICAgOyAgMTAyM1xuICAgIDsgIDE4MVxuICAgIDsgIDYzXG4gICAgOyAgMzFcbiAgICA7ICAxOVxuICAgIDsgIDEzXG4gICAgOyAgMTBcbiAgICA7ICA3XG4gICAgOyAgNlxuICAgIDsgIDVcbiAgICA7ICA0XG4gICAgOyAgNFxuICAgIDsgIDNcbiAgICA7ICAzXG4gICAgOyAgM1xuICAgIDsgIDNcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDJcbiAgICA7ICAyXG4gICAgOyAgMlxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICA7ICAxXG4gICAgOyAgMVxuICAgIDsgIDFcbiAgICB8XVxuICB8IF8gLT4gYXNzZXJ0IGZhbHNlXG5cbmxldCBvdmVyZmxvd19ib3VuZF9tYXhfaW50NjNfb25faW50NjRfdmFsdWUgOiBpbnQ2NCA9XG4gIDQ2MTE2ODYwMTg0MjczODc5MDNMXG5cbmxldCBpbnQ2M19vbl9pbnQ2NF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMgOiBpbnQ2NCBhcnJheSA9XG4gIFt8IDQ2MTE2ODYwMTg0MjczODc5MDNMXG4gIDsgIDQ2MTE2ODYwMTg0MjczODc5MDNMXG4gIDsgIDIxNDc0ODM2NDdMXG4gIDsgIDE2NjQ1MTBMXG4gIDsgIDQ2MzQwTFxuICA7ICA1NDA0TFxuICA7ICAxMjkwTFxuICA7ICA0NjNMXG4gIDsgIDIxNUxcbiAgOyAgMTE4TFxuICA7ICA3M0xcbiAgOyAgNDlMXG4gIDsgIDM1TFxuICA7ICAyN0xcbiAgOyAgMjFMXG4gIDsgIDE3TFxuICA7ICAxNExcbiAgOyAgMTJMXG4gIDsgIDEwTFxuICA7ICA5TFxuICA7ICA4TFxuICA7ICA3TFxuICA7ICA3TFxuICA7ICA2TFxuICA7ICA1TFxuICA7ICA1TFxuICA7ICA1TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICA0TFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAzTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAyTFxuICA7ICAxTFxuICA7ICAxTFxuICB8XVxuXG5sZXQgb3ZlcmZsb3dfYm91bmRfbWF4X2ludDY0X3ZhbHVlIDogaW50NjQgPVxuICA5MjIzMzcyMDM2ODU0Nzc1ODA3TFxuXG5sZXQgaW50NjRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzIDogaW50NjQgYXJyYXkgPVxuICBbfCA5MjIzMzcyMDM2ODU0Nzc1ODA3TFxuICA7ICA5MjIzMzcyMDM2ODU0Nzc1ODA3TFxuICA7ICAzMDM3MDAwNDk5TFxuICA7ICAyMDk3MTUxTFxuICA7ICA1NTEwOExcbiAgOyAgNjIwOExcbiAgOyAgMTQ0OExcbiAgOyAgNTExTFxuICA7ICAyMzRMXG4gIDsgIDEyN0xcbiAgOyAgNzhMXG4gIDsgIDUyTFxuICA7ICAzOExcbiAgOyAgMjhMXG4gIDsgIDIyTFxuICA7ICAxOExcbiAgOyAgMTVMXG4gIDsgIDEzTFxuICA7ICAxMUxcbiAgOyAgOUxcbiAgOyAgOExcbiAgOyAgN0xcbiAgOyAgN0xcbiAgOyAgNkxcbiAgOyAgNkxcbiAgOyAgNUxcbiAgOyAgNUxcbiAgOyAgNUxcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgNExcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgM0xcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMkxcbiAgOyAgMUxcbiAgfF1cblxubGV0IGludDY0X25lZ2F0aXZlX292ZXJmbG93X2JvdW5kcyA6IGludDY0IGFycmF5ID1cbiAgW3wgLTkyMjMzNzIwMzY4NTQ3NzU4MDdMXG4gIDsgIC05MjIzMzcyMDM2ODU0Nzc1ODA3TFxuICA7ICAtMzAzNzAwMDQ5OUxcbiAgOyAgLTIwOTcxNTFMXG4gIDsgIC01NTEwOExcbiAgOyAgLTYyMDhMXG4gIDsgIC0xNDQ4TFxuICA7ICAtNTExTFxuICA7ICAtMjM0TFxuICA7ICAtMTI3TFxuICA7ICAtNzhMXG4gIDsgIC01MkxcbiAgOyAgLTM4TFxuICA7ICAtMjhMXG4gIDsgIC0yMkxcbiAgOyAgLTE4TFxuICA7ICAtMTVMXG4gIDsgIC0xM0xcbiAgOyAgLTExTFxuICA7ICAtOUxcbiAgOyAgLThMXG4gIDsgIC03TFxuICA7ICAtN0xcbiAgOyAgLTZMXG4gIDsgIC02TFxuICA7ICAtNUxcbiAgOyAgLTVMXG4gIDsgIC01TFxuICA7ICAtNExcbiAgOyAgLTRMXG4gIDsgIC00TFxuICA7ICAtNExcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtM0xcbiAgOyAgLTNMXG4gIDsgIC0zTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0yTFxuICA7ICAtMkxcbiAgOyAgLTJMXG4gIDsgIC0xTFxuICB8XVxuIiwib3BlbiEgSW1wb3J0XG5cbmxldCBpbnZhbGlkX2FyZ2YgPSBQcmludGYuaW52YWxpZF9hcmdmXG5sZXQgbmVnYXRpdmVfZXhwb25lbnQgKCkgPSBQcmludGYuaW52YWxpZF9hcmdmIFwiZXhwb25lbnQgY2FuIG5vdCBiZSBuZWdhdGl2ZVwiICgpXG5sZXQgb3ZlcmZsb3cgKCkgPSBQcmludGYuaW52YWxpZF9hcmdmIFwiaW50ZWdlciBvdmVyZmxvdyBpbiBwb3dcIiAoKVxuXG4oKiBUbyBpbXBsZW1lbnQgW2ludDY0X3Bvd10sIHdlIHVzZSBDIGNvZGUgcmF0aGVyIHRoYW4gT0NhbWwgdG8gZWxpbWluYXRlIGFsbG9jYXRpb24uICopXG5leHRlcm5hbCBpbnRfbWF0aF9pbnRfcG93IDogaW50IC0+IGludCAtPiBpbnQgPSBcIkJhc2VfaW50X21hdGhfaW50X3Bvd19zdHViXCIgW0BAbm9hbGxvY11cbmV4dGVybmFsIGludF9tYXRoX2ludDY0X3BvdyA6IGludDY0IC0+IGludDY0IC0+IGludDY0ID0gXCJCYXNlX2ludF9tYXRoX2ludDY0X3Bvd19zdHViXCJcblxubGV0IGludF9wb3cgYmFzZSBleHBvbmVudCA9XG4gIGlmIGV4cG9uZW50IDwgMCB0aGVuIG5lZ2F0aXZlX2V4cG9uZW50ICgpO1xuICBpZiBhYnMgYmFzZSA+IDFcbiAgJiYgKGV4cG9uZW50ID4gNjNcbiAgICAgIHx8IGFicyBiYXNlID4gUG93X292ZXJmbG93X2JvdW5kcy5pbnRfcG9zaXRpdmVfb3ZlcmZsb3dfYm91bmRzLihleHBvbmVudCkpXG4gIHRoZW4gb3ZlcmZsb3cgKCk7XG4gIGludF9tYXRoX2ludF9wb3cgYmFzZSBleHBvbmVudFxuOztcblxubW9kdWxlIEludDY0X3dpdGhfY29tcGFyaXNvbnMgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBDYW1sLkludDY0XG5cbiAgZXh0ZXJuYWwgKCA8ICkgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBib29sID0gXCIlbGVzc3RoYW5cIlxuICBleHRlcm5hbCAoID4gKSA6IGludDY0IC0+IGludDY0IC0+IGJvb2wgPSBcIiVncmVhdGVydGhhblwiXG4gIGV4dGVybmFsICggPj0gKSA6IGludDY0IC0+IGludDY0IC0+IGJvb2wgPSBcIiVncmVhdGVyZXF1YWxcIlxuZW5kXG5cbigqIHdlIGRvbid0IGRvIFthYnNdIGluIGludDY0IGNhc2UgdG8gYXZvaWQgYWxsb2NhdGlvbiAqKVxubGV0IGludDY0X3BvdyBiYXNlIGV4cG9uZW50ID1cbiAgbGV0IG9wZW4gSW50NjRfd2l0aF9jb21wYXJpc29ucyBpblxuICBpZiBleHBvbmVudCA8IDBMIHRoZW4gbmVnYXRpdmVfZXhwb25lbnQgKCk7XG4gIGlmIChiYXNlID4gMUwgfHwgYmFzZSA8IC0xTClcbiAgJiYgKGV4cG9uZW50ID4gNjNMXG4gICAgICB8fCAoYmFzZSA+PSAwTFxuICAgICAgICAgICYmIGJhc2UgPiBQb3dfb3ZlcmZsb3dfYm91bmRzLmludDY0X3Bvc2l0aXZlX292ZXJmbG93X2JvdW5kcy4odG9faW50IGV4cG9uZW50KVxuICAgICAgICAgKVxuICAgICAgfHwgKGJhc2UgPCAwTFxuICAgICAgICAgICYmIGJhc2UgPCBQb3dfb3ZlcmZsb3dfYm91bmRzLmludDY0X25lZ2F0aXZlX292ZXJmbG93X2JvdW5kcy4odG9faW50IGV4cG9uZW50KVxuICAgICAgICAgKSlcbiAgdGhlbiBvdmVyZmxvdyAoKTtcbiAgaW50X21hdGhfaW50NjRfcG93IGJhc2UgZXhwb25lbnRcbjs7XG5cbmxldCBpbnQ2M19wb3dfb25faW50NjQgYmFzZSBleHBvbmVudCA9XG4gIGxldCBvcGVuIEludDY0X3dpdGhfY29tcGFyaXNvbnMgaW5cbiAgaWYgZXhwb25lbnQgPCAwTCB0aGVuIG5lZ2F0aXZlX2V4cG9uZW50ICgpO1xuICBpZiBhYnMgYmFzZSA+IDFMXG4gICYmIChleHBvbmVudCA+IDYzTFxuICAgICAgfHwgYWJzIGJhc2VcbiAgICAgICAgID4gUG93X292ZXJmbG93X2JvdW5kcy5pbnQ2M19vbl9pbnQ2NF9wb3NpdGl2ZV9vdmVyZmxvd19ib3VuZHMuKHRvX2ludCBleHBvbmVudClcbiAgICAgKVxuICB0aGVuIG92ZXJmbG93ICgpO1xuICBpbnRfbWF0aF9pbnQ2NF9wb3cgYmFzZSBleHBvbmVudFxuOztcblxubW9kdWxlIHR5cGUgTWFrZV9hcmcgPSBzaWdcbiAgdHlwZSB0XG5cbiAgaW5jbHVkZSBGbG9hdGFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG4gIGluY2x1ZGUgU3RyaW5nYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICB2YWwgKCArICkgOiB0IC0+IHQgLT4gdFxuICB2YWwgKCAtICkgOiB0IC0+IHQgLT4gdFxuICB2YWwgKCAqICkgOiB0IC0+IHQgLT4gdFxuICB2YWwgKCAvICkgOiB0IC0+IHQgLT4gdFxuICB2YWwgKCB+LSApIDogdCAtPiB0XG5cbiAgaW5jbHVkZSBDb21wYXJpc29ucy5JbmZpeCB3aXRoIHR5cGUgdCA6PSB0XG5cbiAgdmFsIGFicyA6IHQgLT4gdFxuICB2YWwgbmVnIDogdCAtPiB0XG4gIHZhbCB6ZXJvIDogdFxuICB2YWwgb2ZfaW50X2V4biA6IGludCAtPiB0XG4gIHZhbCByZW0gOiB0IC0+IHQgLT4gdFxuZW5kXG5cbm1vZHVsZSBNYWtlIChYIDogTWFrZV9hcmcpID0gc3RydWN0XG4gIG9wZW4gWFxuXG4gIGxldCAoICUgKSB4IHkgPVxuICAgIGlmIHkgPD0gemVyb1xuICAgIHRoZW5cbiAgICAgIGludmFsaWRfYXJnZlxuICAgICAgICBcIiVzICUlICVzIGluIGNvcmVfaW50Lm1sOiBtb2R1bHVzIHNob3VsZCBiZSBwb3NpdGl2ZVwiXG4gICAgICAgICh0b19zdHJpbmcgeClcbiAgICAgICAgKHRvX3N0cmluZyB5KVxuICAgICAgICAoKTtcbiAgICBsZXQgcnZhbCA9IFgucmVtIHggeSBpblxuICAgIGlmIHJ2YWwgPCB6ZXJvIHRoZW4gcnZhbCArIHkgZWxzZSBydmFsXG4gIDs7XG5cbiAgbGV0IG9uZSA9IG9mX2ludF9leG4gMVxuXG4gIGxldCAoIC8lICkgeCB5ID1cbiAgICBpZiB5IDw9IHplcm9cbiAgICB0aGVuXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCIlcyAvJSUgJXMgaW4gY29yZV9pbnQubWw6IGRpdmlzb3Igc2hvdWxkIGJlIHBvc2l0aXZlXCJcbiAgICAgICAgKHRvX3N0cmluZyB4KVxuICAgICAgICAodG9fc3RyaW5nIHkpXG4gICAgICAgICgpO1xuICAgIGlmIHggPCB6ZXJvIHRoZW4gKCh4ICsgb25lKSAvIHkpIC0gb25lIGVsc2UgeCAvIHlcbiAgOztcblxuICAoKiogZmxvYXQgZGl2aXNpb24gb2YgaW50ZWdlcnMgKilcbiAgbGV0ICggLy8gKSB4IHkgPSB0b19mbG9hdCB4IC8uIHRvX2Zsb2F0IHlcblxuICBsZXQgcm91bmRfZG93biBpIH50b19tdWx0aXBsZV9vZjptb2R1bHVzID0gaSAtIChpICUgbW9kdWx1cylcblxuICBsZXQgcm91bmRfdXAgaSB+dG9fbXVsdGlwbGVfb2Y6bW9kdWx1cyA9XG4gICAgbGV0IHJlbWFpbmRlciA9IGkgJSBtb2R1bHVzIGluXG4gICAgaWYgcmVtYWluZGVyID0gemVybyB0aGVuIGkgZWxzZSBpICsgbW9kdWx1cyAtIHJlbWFpbmRlclxuICA7O1xuXG4gIGxldCByb3VuZF90b3dhcmRzX3plcm8gaSB+dG9fbXVsdGlwbGVfb2YgPVxuICAgIGlmIGkgPSB6ZXJvXG4gICAgdGhlbiB6ZXJvXG4gICAgZWxzZSBpZiBpID4gemVyb1xuICAgIHRoZW4gcm91bmRfZG93biBpIH50b19tdWx0aXBsZV9vZlxuICAgIGVsc2Ugcm91bmRfdXAgaSB+dG9fbXVsdGlwbGVfb2ZcbiAgOztcblxuICBsZXQgcm91bmRfbmVhcmVzdCBpIH50b19tdWx0aXBsZV9vZjptb2R1bHVzID1cbiAgICBsZXQgcmVtYWluZGVyID0gaSAlIG1vZHVsdXMgaW5cbiAgICBsZXQgbW9kdWx1c19taW51c19yZW1haW5kZXIgPSBtb2R1bHVzIC0gcmVtYWluZGVyIGluXG4gICAgaWYgbW9kdWx1c19taW51c19yZW1haW5kZXIgPD0gcmVtYWluZGVyXG4gICAgdGhlbiBpICsgbW9kdWx1c19taW51c19yZW1haW5kZXJcbiAgICBlbHNlIGkgLSByZW1haW5kZXJcbiAgOztcblxuICBsZXQgcm91bmQgPyhkaXIgPSBgTmVhcmVzdCkgaSB+dG9fbXVsdGlwbGVfb2YgPVxuICAgIG1hdGNoIGRpciB3aXRoXG4gICAgfCBgTmVhcmVzdCAtPiByb3VuZF9uZWFyZXN0IGkgfnRvX211bHRpcGxlX29mXG4gICAgfCBgRG93biAtPiByb3VuZF9kb3duIGkgfnRvX211bHRpcGxlX29mXG4gICAgfCBgVXAgLT4gcm91bmRfdXAgaSB+dG9fbXVsdGlwbGVfb2ZcbiAgICB8IGBaZXJvIC0+IHJvdW5kX3Rvd2FyZHNfemVybyBpIH50b19tdWx0aXBsZV9vZlxuICA7O1xuZW5kXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGxldCBpbnRfcG93ID0gaW50X3Bvd1xuICBsZXQgaW50NjRfcG93ID0gaW50NjRfcG93XG4gIGxldCBpbnQ2M19wb3dfb25faW50NjQgPSBpbnQ2M19wb3dfb25faW50NjRcblxuICBtb2R1bGUgUG93X292ZXJmbG93X2JvdW5kcyA9IFBvd19vdmVyZmxvd19ib3VuZHNcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbigqIEMgc3R1YiBmb3IgaW50IHBvcGNvdW50IHRvIHVzZSB0aGUgUE9QQ05UIGluc3RydWN0aW9uIHdoZXJlIHBvc3NpYmxlICopXG5leHRlcm5hbCBpbnRfcG9wY291bnQgOiBpbnQgLT4gaW50ID0gXCJCYXNlX2ludF9tYXRoX2ludF9wb3Bjb3VudFwiIFtAQG5vYWxsb2NdXG5cbigqIFRvIG1haW50YWluIGphdmFzY3JpcHQgY29tcGF0aWJpbGl0eSBhbmQgZW5hYmxlIHVuYm94aW5nLCB3ZSBpbXBsZW1lbnQgcG9wY291bnQgaW5cbiAgIE9DYW1sIHJhdGhlciB0aGFuIHVzZSBDIHN0dWJzLiBJbXBsZW1lbnRhdGlvbiBhZGFwdGVkIGZyb206XG4gICBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYW1taW5nX3dlaWdodCNFZmZpY2llbnRfaW1wbGVtZW50YXRpb24gKilcbmxldCBpbnQ2NF9wb3Bjb3VudCA9XG4gIGxldCBvcGVuIENhbWwuSW50NjQgaW5cbiAgbGV0ICggKyApID0gYWRkIGluXG4gIGxldCAoIC0gKSA9IHN1YiBpblxuICBsZXQgKCAqICkgPSBtdWwgaW5cbiAgbGV0ICggbHNyICkgPSBzaGlmdF9yaWdodF9sb2dpY2FsIGluXG4gIGxldCAoIGxhbmQgKSA9IGxvZ2FuZCBpblxuICBsZXQgbTEgPSAweDU1NTU1NTU1NTU1NTU1NTVMIGluXG4gICgqIDBiMDEwMTAxMDEuLi4gKilcbiAgbGV0IG0yID0gMHgzMzMzMzMzMzMzMzMzMzMzTCBpblxuICAoKiAwYjAwMTEwMDExLi4uICopXG4gIGxldCBtNCA9IDB4MGYwZjBmMGYwZjBmMGYwZkwgaW5cbiAgKCogMGIwMDAwMTExMS4uLiAqKVxuICBsZXQgaDAxID0gMHgwMTAxMDEwMTAxMDEwMTAxTCBpblxuICAoKiAxIGJpdCBzZXQgcGVyIGJ5dGUgKilcbiAgZnVuIFtAaW5saW5lXSB4IC0+XG4gICAgKCogZ2F0aGVyIHRoZSBiaXQgY291bnQgZm9yIGV2ZXJ5IHBhaXIgb2YgYml0cyAqKVxuICAgIGxldCB4ID0geCAtICgoeCBsc3IgMSkgbGFuZCBtMSkgaW5cbiAgICAoKiBnYXRoZXIgdGhlIGJpdCBjb3VudCBmb3IgZXZlcnkgNCBiaXRzICopXG4gICAgbGV0IHggPSAoeCBsYW5kIG0yKSArICgoeCBsc3IgMikgbGFuZCBtMikgaW5cbiAgICAoKiBnYXRoZXIgdGhlIGJpdCBjb3VudCBmb3IgZXZlcnkgYnl0ZSAqKVxuICAgIGxldCB4ID0gKHggKyAoeCBsc3IgNCkpIGxhbmQgbTQgaW5cbiAgICAoKiBzdW0gdGhlIGJpdCBjb3VudHMgaW4gdGhlIHRvcCBieXRlIGFuZCBzaGlmdCBpdCBkb3duICopXG4gICAgdG9faW50ICgoeCAqIGgwMSkgbHNyIDU2KVxuOztcblxubGV0IGludDMyX3BvcGNvdW50ID1cbiAgKCogT24gNjQtYml0IHN5c3RlbXMsIHRoaXMgaXMgZmFzdGVyIHRoYW4gaW1wbGVtZW50aW5nIHVzaW5nIFtpbnQzMl0gYXJpdGhtZXRpYy4gKilcbiAgbGV0IG1hc2sgPSAweGZmZmZfZmZmZkwgaW5cbiAgZnVuIFtAaW5saW5lXSB4IC0+IGludDY0X3BvcGNvdW50IChDYW1sLkludDY0LmxvZ2FuZCAoQ2FtbC5JbnQ2NC5vZl9pbnQzMiB4KSBtYXNrKVxuOztcblxubGV0IG5hdGl2ZWludF9wb3Bjb3VudCA9XG4gIG1hdGNoIENhbWwuTmF0aXZlaW50LnNpemUgd2l0aFxuICB8IDMyIC0+IGZ1biBbQGlubGluZV0geCAtPiBpbnQzMl9wb3Bjb3VudCAoQ2FtbC5OYXRpdmVpbnQudG9faW50MzIgeClcbiAgfCA2NCAtPiBmdW4gW0BpbmxpbmVdIHggLT4gaW50NjRfcG9wY291bnQgKENhbWwuSW50NjQub2ZfbmF0aXZlaW50IHgpXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2Vcbjs7XG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgU2lnbjBcbmluY2x1ZGUgSWRlbnRpZmlhYmxlLk1ha2UgKFNpZ24wKVxuXG4oKiBPcGVuIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9ucyBzb1xuICAgdGhleSBkbyBub3Qgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zXG4gICBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubGV0IHRvX2Zsb2F0ID0gZnVuY3Rpb25cbiAgfCBOZWcgLT4gLTEuXG4gIHwgWmVybyAtPiAwLlxuICB8IFBvcyAtPiAxLlxuOztcblxubGV0IGZsaXAgPSBmdW5jdGlvblxuICB8IE5lZyAtPiBQb3NcbiAgfCBaZXJvIC0+IFplcm9cbiAgfCBQb3MgLT4gTmVnXG47O1xuXG5sZXQgKCAqICkgdCB0JyA9IG9mX2ludCAodG9faW50IHQgKiB0b19pbnQgdCcpXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGF0IHRoZSBlbmQsIGFmdGVyIGFueVxuICAgZnVuY3RvciBhcHBsaWNhdGlvbnMgdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc29cbiAgIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnkgdGhpc1xuICAgbW9kdWxlLiAqKVxuaW5jbHVkZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxuaW5jbHVkZSBJbnRfaW50ZlxuaW5jbHVkZSBJbnQwXG5cbm1vZHVsZSBUID0gc3RydWN0XG4gIHR5cGUgdCA9IGludCBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfaW50XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9pbnQgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGludF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9pbnQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gaW50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBsZXQgY29tcGFyZSB4IHkgPSBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmNvbXBhcmUgeCB5XG5cbiAgbGV0IG9mX3N0cmluZyBzID1cbiAgICB0cnkgb2Zfc3RyaW5nIHMgd2l0aFxuICAgIHwgXyAtPiBQcmludGYuZmFpbHdpdGhmIFwiSW50Lm9mX3N0cmluZzogJVNcIiBzICgpXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuZW5kXG5cbmxldCBudW1fYml0cyA9IEludF9jb252ZXJzaW9ucy5udW1fYml0c19pbnRcbmxldCBmbG9hdF9sb3dlcl9ib3VuZCA9IEZsb2F0MC5sb3dlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgZmxvYXRfdXBwZXJfYm91bmQgPSBGbG9hdDAudXBwZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IHRvX2Zsb2F0ID0gQ2FtbC5mbG9hdF9vZl9pbnRcbmxldCBvZl9mbG9hdF91bmNoZWNrZWQgPSBDYW1sLmludF9vZl9mbG9hdFxuXG5sZXQgb2ZfZmxvYXQgZiA9XG4gIGlmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgZiBmbG9hdF9sb3dlcl9ib3VuZFxuICAmJiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIGYgZmxvYXRfdXBwZXJfYm91bmRcbiAgdGhlbiBDYW1sLmludF9vZl9mbG9hdCBmXG4gIGVsc2VcbiAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICBcIkludC5vZl9mbG9hdDogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IGYpXG4gICAgICAoKVxuOztcblxubGV0IHplcm8gPSAwXG5sZXQgb25lID0gMVxubGV0IG1pbnVzX29uZSA9IC0xXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxubW9kdWxlIENvbnYgPSBJbnRfY29udmVyc2lvbnNcbmluY2x1ZGUgQ29udi5NYWtlIChUKVxuXG5pbmNsdWRlIENvbnYuTWFrZV9oZXggKHN0cnVjdFxuICAgIG9wZW4gSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gICAgdHlwZSB0ID0gaW50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9pbnQgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgaGFzaF9mb2xkX2ludFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBoYXNoX2ludCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgICBsZXQgbmVnID0gKCB+LSApXG4gICAgbGV0ICggPCApID0gKCA8IClcbiAgICBsZXQgdG9fc3RyaW5nIGkgPSBQcmludGYuc3ByaW50ZiBcIiV4XCIgaVxuICAgIGxldCBvZl9zdHJpbmcgcyA9IENhbWwuU2NhbmYuc3NjYW5mIHMgXCIleFwiIEZuLmlkXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludC5IZXhcIlxuICBlbmQpXG5cbmluY2x1ZGUgUHJldHR5X3ByaW50ZXIuUmVnaXN0ZXIgKHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICBsZXQgdG9fc3RyaW5nID0gdG9fc3RyaW5nXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludFwiXG4gIGVuZClcblxuKCogT3BlbiByZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgYWZ0ZXIgaW5jbHVkaW5nIGZ1bmN0b3IgaW5zdGFudGlhdGlvbnMgc29cbiAgIHRoZXkgZG8gbm90IHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9uc1xuICAgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxuZXh0ZXJuYWwgdG9faW50MzJfdHJ1bmMgOiB0IC0+IGludDMyID0gXCIlaW50MzJfb2ZfaW50XCJcbmV4dGVybmFsIG9mX2ludDMyX3RydW5jIDogaW50MzIgLT4gdCA9IFwiJWludDMyX3RvX2ludFwiXG5leHRlcm5hbCBvZl9pbnQ2NF90cnVuYyA6IGludDY0IC0+IHQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgb2ZfbmF0aXZlaW50X3RydW5jIDogbmF0aXZlaW50IC0+IHQgPSBcIiVuYXRpdmVpbnRfdG9faW50XCJcblxubGV0IHByZWQgaSA9IGkgLSAxXG5sZXQgc3VjYyBpID0gaSArIDFcbmxldCB0b19pbnQgaSA9IGlcbmxldCB0b19pbnRfZXhuID0gdG9faW50XG5sZXQgb2ZfaW50IGkgPSBpXG5sZXQgb2ZfaW50X2V4biA9IG9mX2ludFxubGV0IG1heF92YWx1ZSA9IENhbWwubWF4X2ludFxubGV0IG1pbl92YWx1ZSA9IENhbWwubWluX2ludFxubGV0IG1heF92YWx1ZV8zMF9iaXRzID0gMHgzRkZGX0ZGRkZcbmxldCBvZl9pbnQzMiA9IENvbnYuaW50MzJfdG9faW50XG5sZXQgb2ZfaW50MzJfZXhuID0gQ29udi5pbnQzMl90b19pbnRfZXhuXG5sZXQgdG9faW50MzIgPSBDb252LmludF90b19pbnQzMlxubGV0IHRvX2ludDMyX2V4biA9IENvbnYuaW50X3RvX2ludDMyX2V4blxubGV0IG9mX2ludDY0ID0gQ29udi5pbnQ2NF90b19pbnRcbmxldCBvZl9pbnQ2NF9leG4gPSBDb252LmludDY0X3RvX2ludF9leG5cbmxldCB0b19pbnQ2NCA9IENvbnYuaW50X3RvX2ludDY0XG5sZXQgb2ZfbmF0aXZlaW50ID0gQ29udi5uYXRpdmVpbnRfdG9faW50XG5sZXQgb2ZfbmF0aXZlaW50X2V4biA9IENvbnYubmF0aXZlaW50X3RvX2ludF9leG5cbmxldCB0b19uYXRpdmVpbnQgPSBDb252LmludF90b19uYXRpdmVpbnRcbmxldCB0b19uYXRpdmVpbnRfZXhuID0gdG9fbmF0aXZlaW50XG5sZXQgYWJzIHggPSBhYnMgeFxuXG4oKiBub3RlIHRoYXQgcmVtIGlzIG5vdCBzYW1lIGFzICUgKilcbmxldCByZW0gYSBiID0gYSBtb2QgYlxubGV0IGluY3IgPSBDYW1sLmluY3JcbmxldCBkZWNyID0gQ2FtbC5kZWNyXG5sZXQgc2hpZnRfcmlnaHQgYSBiID0gYSBhc3IgYlxubGV0IHNoaWZ0X3JpZ2h0X2xvZ2ljYWwgYSBiID0gYSBsc3IgYlxubGV0IHNoaWZ0X2xlZnQgYSBiID0gYSBsc2wgYlxubGV0IGJpdF9ub3QgYSA9IGxub3QgYVxubGV0IGJpdF9vciBhIGIgPSBhIGxvciBiXG5sZXQgYml0X2FuZCBhIGIgPSBhIGxhbmQgYlxubGV0IGJpdF94b3IgYSBiID0gYSBseG9yIGJcbmxldCBwb3cgPSBJbnRfbWF0aC5Qcml2YXRlLmludF9wb3dcbmxldCAoICoqICkgYiBlID0gcG93IGIgZVxuXG5tb2R1bGUgUG93MiA9IHN0cnVjdFxuICBvcGVuISBJbXBvcnRcblxuICBsZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuICBsZXQgbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpID1cbiAgICBQcmludGYuaW52YWxpZF9hcmdmIFwiYXJndW1lbnQgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZVwiICgpXG4gIDs7XG5cblxuICAoKiogXCJjZWlsaW5nIHBvd2VyIG9mIDJcIiAtIExlYXN0IHBvd2VyIG9mIDIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBjZWlsX3BvdzIgeCA9XG4gICAgaWYgeCA8PSAwIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0geCAtIDEgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgICgqIFRoZSBuZXh0IGxpbmUgaXMgc3VwZXJmbHVvdXMgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdFxuICAgICAgIGFueXdheSB0aGFuIHRvIGJyYW5jaCAqKVxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIHggKyAxXG4gIDs7XG5cbiAgKCoqIFwiZmxvb3IgcG93ZXIgb2YgMlwiIC0gTGFyZ2VzdCBwb3dlciBvZiAyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgZmxvb3JfcG93MiB4ID1cbiAgICBpZiB4IDw9IDAgdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMSkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAyKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDQpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgOCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxNikgaW5cbiAgICAoKiBUaGUgbmV4dCBsaW5lIGlzIHN1cGVyZmx1b3VzIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLCBidXQgaXQncyBmYXN0ZXIgdG8gZG8gaXRcbiAgICAgICBhbnl3YXkgdGhhbiB0byBicmFuY2ggKilcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAzMikgaW5cbiAgICB4IC0gKHggbHNyIDEpXG4gIDs7XG5cbiAgbGV0IGlzX3BvdzIgeCA9XG4gICAgaWYgeCA8PSAwIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIHggbGFuZCAoeCAtIDEpID0gMFxuICA7O1xuXG4gICgqIEMgc3R1YnMgZm9yIGludCBjbHogYW5kIGN0eiB0byB1c2UgdGhlIENMWi9CU1IvQ1RaL0JTRiBpbnN0cnVjdGlvbiB3aGVyZSBwb3NzaWJsZSAqKVxuICBleHRlcm5hbCBjbHpcbiAgICA6ICAoKiBOb3RlIHRoYXQgd2UgcGFzcyB0aGUgdGFnZ2VkIGludCBoZXJlLiBTZWUgaW50X21hdGhfc3R1YnMuYyBmb3IgZGV0YWlscyBvbiB3aHlcbiAgICAgICAgICB0aGlzIGlzIGNvcnJlY3QuICopXG4gICAgaW50XG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX2ludF9jbHpcIiBcIkJhc2VfaW50X21hdGhfaW50X2Nsel91bnRhZ2dlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY3R6XG4gICAgOiAgKGludFtAdW50YWdnZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnRfY3R6XCIgXCJCYXNlX2ludF9tYXRoX2ludF9jdHpfdW50YWdnZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGZsb29yX2xvZzIgaSA9XG4gICAgaWYgaSA8PSAwXG4gICAgdGhlbiByYWlzZV9zIChTZXhwLm1lc3NhZ2UgXCJbSW50LmZsb29yX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludCBpIF0pO1xuICAgIG51bV9iaXRzIC0gMSAtIGNseiBpXG4gIDs7XG5cbiAgbGV0IGNlaWxfbG9nMiBpID1cbiAgICBpZiBpIDw9IDBcbiAgICB0aGVuIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltJbnQuY2VpbF9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl9pbnQgaSBdKTtcbiAgICBpZiBpID0gMSB0aGVuIDAgZWxzZSBudW1fYml0cyAtIGNseiAoaSAtIDEpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBQb3cyXG5cbmxldCBzaWduID0gU2lnbi5vZl9pbnRcbmxldCBwb3Bjb3VudCA9IFBvcGNvdW50LmludF9wb3Bjb3VudFxuXG5tb2R1bGUgUHJlX08gPSBzdHJ1Y3RcbiAgZXh0ZXJuYWwgKCArICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFkZGludFwiXG4gIGV4dGVybmFsICggLSApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVzdWJpbnRcIlxuICBleHRlcm5hbCAoICogKSA6IGludCAtPiBpbnQgLT4gaW50ID0gXCIlbXVsaW50XCJcbiAgZXh0ZXJuYWwgKCAvICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWRpdmludFwiXG4gIGV4dGVybmFsICggfi0gKSA6IGludCAtPiBpbnQgPSBcIiVuZWdpbnRcIlxuXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgYWJzID0gYWJzXG5cbiAgZXh0ZXJuYWwgbmVnIDogdCAtPiB0ID0gXCIlbmVnaW50XCJcblxuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludF9leG4gPSBvZl9pbnRfZXhuXG5lbmRcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmVfT1xuXG4gIG1vZHVsZSBGID0gSW50X21hdGguTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBpbmNsdWRlIFByZV9PXG5cbiAgICAgIGxldCByZW0gPSByZW1cbiAgICAgIGxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG4gICAgICBsZXQgb2ZfZmxvYXQgPSBvZl9mbG9hdFxuICAgICAgbGV0IG9mX3N0cmluZyA9IFQub2Zfc3RyaW5nXG4gICAgICBsZXQgdG9fc3RyaW5nID0gVC50b19zdHJpbmdcbiAgICBlbmQpXG5cbiAgaW5jbHVkZSBGXG5cbiAgZXh0ZXJuYWwgYnN3YXAxNiA6IGludCAtPiBpbnQgPSBcIiVic3dhcDE2XCJcblxuICAoKiBUaGVzZSBpbmxpbmVkIHZlcnNpb25zIG9mICglKSwgKC8lKSwgYW5kICgvLykgcGVyZm9ybSBiZXR0ZXIgdGhhbiB0aGVpciBmdW5jdG9yaXplZFxuICAgICBjb3VudGVycGFydHMgaW4gW0ZdIChzZWUgYmVuY2htYXJrcyBiZWxvdykuXG5cbiAgICAgVGhlIHJlYXNvbiB0aGVzZSBmdW5jdGlvbnMgYXJlIGlubGluZWQgaW4gW0ludF0gYnV0IG5vdCBpbiBhbnkgb2YgdGhlIG90aGVyIGludGVnZXJcbiAgICAgbW9kdWxlcyBpcyB0aGF0IHRoZXkgZXhpc3RlZCBpbiBbSW50XSBhbmQgW0ludF0gYWxvbmUgcHJpb3IgdG8gdGhlIGludHJvZHVjdGlvbiBvZlxuICAgICB0aGUgW0ludF9tYXRoLk1ha2VdIGZ1bmN0b3IsIGFuZCB3ZSBkaWRuJ3Qgd2FudCB0byBkZWdyYWRlIHRoZWlyIHBlcmZvcm1hbmNlLlxuXG4gICAgIFdlIHdvbid0IHByZS1lbXB0aXZlbHkgZG8gdGhlIHNhbWUgZm9yIG5ldyBmdW5jdGlvbnMsIHVubGVzcyBzb21lb25lIGNhcmVzLCBvbiBhIGNhc2VcbiAgICAgYnkgY2FzZSBmYXNoaW9uLiAgKilcblxuICBsZXQgKCAlICkgeCB5ID1cbiAgICBpZiB5IDw9IHplcm9cbiAgICB0aGVuXG4gICAgICBQcmludGYuaW52YWxpZF9hcmdmXG4gICAgICAgIFwiJXMgJSUgJXMgaW4gY29yZV9pbnQubWw6IG1vZHVsdXMgc2hvdWxkIGJlIHBvc2l0aXZlXCJcbiAgICAgICAgKHRvX3N0cmluZyB4KVxuICAgICAgICAodG9fc3RyaW5nIHkpXG4gICAgICAgICgpO1xuICAgIGxldCBydmFsID0gcmVtIHggeSBpblxuICAgIGlmIHJ2YWwgPCB6ZXJvIHRoZW4gcnZhbCArIHkgZWxzZSBydmFsXG4gIDs7XG5cbiAgbGV0ICggLyUgKSB4IHkgPVxuICAgIGlmIHkgPD0gemVyb1xuICAgIHRoZW5cbiAgICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCIlcyAvJSUgJXMgaW4gY29yZV9pbnQubWw6IGRpdmlzb3Igc2hvdWxkIGJlIHBvc2l0aXZlXCJcbiAgICAgICAgKHRvX3N0cmluZyB4KVxuICAgICAgICAodG9fc3RyaW5nIHkpXG4gICAgICAgICgpO1xuICAgIGlmIHggPCB6ZXJvIHRoZW4gKCh4ICsgb25lKSAvIHkpIC0gb25lIGVsc2UgeCAvIHlcbiAgOztcblxuICBsZXQgKCAvLyApIHggeSA9IHRvX2Zsb2F0IHggLy4gdG9fZmxvYXQgeVxuXG4gIGV4dGVybmFsICggbGFuZCApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVhbmRpbnRcIlxuICBleHRlcm5hbCAoIGxvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiVvcmludFwiXG4gIGV4dGVybmFsICggbHhvciApIDogaW50IC0+IGludCAtPiBpbnQgPSBcIiV4b3JpbnRcIlxuXG4gIGxldCBsbm90ID0gbG5vdFxuXG4gIGV4dGVybmFsICggbHNsICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzbGludFwiXG4gIGV4dGVybmFsICggbHNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWxzcmludFwiXG4gIGV4dGVybmFsICggYXNyICkgOiBpbnQgLT4gaW50IC0+IGludCA9IFwiJWFzcmludFwiXG5lbmRcblxuaW5jbHVkZSBPXG5cbigqIFtJbnRdIGFuZCBbSW50Lk9dIGFncmVlIHZhbHVlLXdpc2UgKilcblxubW9kdWxlIFByaXZhdGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIE9fRiA9IE8uRlxuZW5kXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlciBpbmNsdWRpbmcgZnVuY3RvclxuICAgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnNcbiAgIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgZmFpbHdpdGhmID0gUHJpbnRmLmZhaWx3aXRoZlxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICBpbmNsdWRlIFVjaGFyMFxuXG4gIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5VY2hhclwiXG4gIGxldCBoYXNoX2ZvbGRfdCBzdGF0ZSB0ID0gSGFzaC5mb2xkX2ludCBzdGF0ZSAodG9faW50IHQpXG4gIGxldCBoYXNoIHQgPSBIYXNoLnJ1biBoYXNoX2ZvbGRfdCB0XG4gIGxldCB0b19zdHJpbmcgdCA9IFByaW50Zi5zcHJpbnRmIFwiVSslMDRYXCIgKHRvX2ludCB0KVxuXG4gICgqIERvIG5vdCBhY3R1YWxseSBleHBvcnQgdGhpcy4gU2VlIGRpc2N1c3Npb24gaW4gdGhlIC5tbGkgKilcblxuICBsZXQgc2V4cF9vZl90IHQgPSBTZXhwLkF0b20gKHRvX3N0cmluZyB0KVxuXG4gIGxldCB0X29mX3NleHAgc2V4cCA9XG4gICAgbWF0Y2ggc2V4cCB3aXRoXG4gICAgfCBTZXhwLkxpc3QgXyAtPiBvZl9zZXhwX2Vycm9yIFwiVWNoYXIudF9vZl9zZXhwOiBhdG9tIG5lZWRlZFwiIHNleHBcbiAgICB8IFNleHAuQXRvbSBzIC0+XG4gICAgICAodHJ5IENhbWwuU2NhbmYuc3NjYW5mIHMgXCJVKyVYXCIgKGZ1biBpIC0+IFVjaGFyMC5vZl9pbnQgaSkgd2l0aFxuICAgICAgIHwgXyAtPiBvZl9zZXhwX2Vycm9yIFwiVWNoYXIudF9vZl9zZXhwOiBhdG9tIG9mIHRoZSBmb3JtIFUrWFhYWCBuZWVkZWRcIiBzZXhwKVxuICA7O1xuXG4gIGxldCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgPVxuICAgIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgU3RyaW5nLnRfc2V4cF9ncmFtbWFyXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBUXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChUKVxuaW5jbHVkZSBDb21wYXJhYmxlLk1ha2UgKFQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4hIFVjaGFyX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IGludF9pc19zY2FsYXIgPSBpc192YWxpZFxuXG5sZXQgc3VjY19leG4gYyA9XG4gIHRyeSBVY2hhcjAuc3VjYyBjIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IG1zZyAtPiBmYWlsd2l0aGYgXCJVY2hhci5zdWNjX2V4bjogJXNcIiBtc2cgKClcbjs7XG5cbmxldCBzdWNjIGMgPVxuICB0cnkgU29tZSAoVWNoYXIwLnN1Y2MgYykgd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgXyAtPiBOb25lXG47O1xuXG5sZXQgcHJlZF9leG4gYyA9XG4gIHRyeSBVY2hhcjAucHJlZCBjIHdpdGhcbiAgfCBJbnZhbGlkX2FyZ3VtZW50IG1zZyAtPiBmYWlsd2l0aGYgXCJVY2hhci5wcmVkX2V4bjogJXNcIiBtc2cgKClcbjs7XG5cbmxldCBwcmVkIGMgPVxuICB0cnkgU29tZSAoVWNoYXIwLnByZWQgYykgd2l0aFxuICB8IEludmFsaWRfYXJndW1lbnQgXyAtPiBOb25lXG47O1xuXG5sZXQgb2Zfc2NhbGFyIGkgPSBpZiBpbnRfaXNfc2NhbGFyIGkgdGhlbiBTb21lICh1bnNhZmVfb2ZfaW50IGkpIGVsc2UgTm9uZVxuXG5sZXQgb2Zfc2NhbGFyX2V4biBpID1cbiAgaWYgaW50X2lzX3NjYWxhciBpXG4gIHRoZW4gdW5zYWZlX29mX2ludCBpXG4gIGVsc2UgZmFpbHdpdGhmIFwiVWNoYXIub2ZfaW50X2V4biBnb3QgYSBpbnZhbGlkIFVuaWNvZGUgc2NhbGFyIHZhbHVlOiAlMDRYXCIgaSAoKVxuOztcblxubGV0IHRvX3NjYWxhciB0ID0gVWNoYXIwLnRvX2ludCB0XG5sZXQgdG9fY2hhciBjID0gaWYgaXNfY2hhciBjIHRoZW4gU29tZSAodW5zYWZlX3RvX2NoYXIgYykgZWxzZSBOb25lXG5cbmxldCB0b19jaGFyX2V4biBjID1cbiAgaWYgaXNfY2hhciBjXG4gIHRoZW4gdW5zYWZlX3RvX2NoYXIgY1xuICBlbHNlIGZhaWx3aXRoZiBcIlVjaGFyLnRvX2NoYXJfZXhuIGdvdCBhIG5vbiBsYXRpbi0xIGNoYXJhY3RlcjogVSslMDRYXCIgKHRvX2ludCBjKSAoKVxuOztcblxubGV0IHV0ZjhfYnl0ZV9sZW5ndGggdWNoYXIgPVxuICBsZXQgY29kZXBvaW50ID0gdG9fc2NhbGFyIHVjaGFyIGluXG4gIGlmIEludC4oIDwgKSBjb2RlcG9pbnQgMHg4MFxuICB0aGVuIDFcbiAgZWxzZSBpZiBJbnQuKCA8ICkgY29kZXBvaW50IDB4ODAwXG4gIHRoZW4gMlxuICBlbHNlIGlmIEludC4oIDwgKSBjb2RlcG9pbnQgMHgxMDAwMFxuICB0aGVuIDNcbiAgZWxzZSA0XG47O1xuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgVWNoYXJfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcblxudHlwZSAoJ2EsICdiKSB0ID0gVCA6ICgnYSwgJ2EpIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbmxldCBzZXhwX29mX3QgOlxuICAnYSAnYi5cbiAgKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdiIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKCdhLCAnYikgdCAtPiBTZXhwbGliMC5TZXhwLnRcbiAgPVxuICBmdW4gKHR5cGUgYV9fMDAzXyBiX18wMDRfKVxuICAgICAgOiAgKChhX18wMDNfIC0+IFNleHBsaWIwLlNleHAudCkgLT4gKGJfXzAwNF8gLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAgIC0+IChhX18wMDNfLCBiX18wMDRfKSB0IC0+IFNleHBsaWIwLlNleHAudCkgLT5cbiAgICBmdW4gX29mX2FfXzAwMV8gX29mX2JfXzAwMl8gVCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJUXCJcbjs7XG5cbltAQEBlbmRdXG5cbnR5cGUgKCdhLCAnYikgZXF1YWwgPSAoJ2EsICdiKSB0XG5cbmxldCByZWZsID0gVFxubGV0IHN5bSAodHlwZSBhIGIpIChUIDogKGEsIGIpIHQpIDogKGIsIGEpIHQgPSBUXG5sZXQgdHJhbnMgKHR5cGUgYSBiIGMpIChUIDogKGEsIGIpIHQpIChUIDogKGIsIGMpIHQpIDogKGEsIGMpIHQgPSBUXG5sZXQgY29udiAodHlwZSBhIGIpIChUIDogKGEsIGIpIHQpIChhIDogYSkgOiBiID0gYVxuXG5tb2R1bGUgTGlmdCAoWCA6IHNpZ1xuICAgIHR5cGUgJ2EgdFxuICBlbmQpID1cbnN0cnVjdFxuICBsZXQgbGlmdCAodHlwZSBhIGIpIChUIDogKGEsIGIpIHQpIDogKGEgWC50LCBiIFgudCkgdCA9IFRcbmVuZFxuXG5tb2R1bGUgTGlmdDIgKFggOiBzaWdcbiAgICB0eXBlICgnYTEsICdhMikgdFxuICBlbmQpID1cbnN0cnVjdFxuICBsZXQgbGlmdCAodHlwZSBhMSBiMSBhMiBiMikgKFQgOiAoYTEsIGIxKSB0KSAoVCA6IChhMiwgYjIpIHQpXG4gICAgOiAoKGExLCBhMikgWC50LCAoYjEsIGIyKSBYLnQpIHRcbiAgICA9XG4gICAgVFxuICA7O1xuZW5kXG5cbm1vZHVsZSBMaWZ0MyAoWCA6IHNpZ1xuICAgIHR5cGUgKCdhMSwgJ2EyLCAnYTMpIHRcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgbGV0IGxpZnQgKHR5cGUgYTEgYjEgYTIgYjIgYTMgYjMpIChUIDogKGExLCBiMSkgdCkgKFQgOiAoYTIsIGIyKSB0KSAoVCA6IChhMywgYjMpIHQpXG4gICAgOiAoKGExLCBhMiwgYTMpIFgudCwgKGIxLCBiMiwgYjMpIFgudCkgdFxuICAgID1cbiAgICBUXG4gIDs7XG5lbmRcblxubGV0IGRldHVwbGUyICh0eXBlIGExIGEyIGIxIGIyKSAoVCA6IChhMSAqIGEyLCBiMSAqIGIyKSB0KSA6IChhMSwgYjEpIHQgKiAoYTIsIGIyKSB0ID1cbiAgVCwgVFxuOztcblxubGV0IHR1cGxlMiAodHlwZSBhMSBhMiBiMSBiMikgKFQgOiAoYTEsIGIxKSB0KSAoVCA6IChhMiwgYjIpIHQpIDogKGExICogYTIsIGIxICogYjIpIHQgPSBUXG5cbm1vZHVsZSB0eXBlIEluamVjdGl2ZSA9IHNpZ1xuICB0eXBlICdhIHRcblxuICB2YWwgc3RyaXAgOiAoJ2EgdCwgJ2IgdCkgZXF1YWwgLT4gKCdhLCAnYikgZXF1YWxcbmVuZFxuXG5tb2R1bGUgdHlwZSBJbmplY3RpdmUyID0gc2lnXG4gIHR5cGUgKCdhMSwgJ2EyKSB0XG5cbiAgdmFsIHN0cmlwIDogKCgnYTEsICdhMikgdCwgKCdiMSwgJ2IyKSB0KSBlcXVhbCAtPiAoJ2ExLCAnYjEpIGVxdWFsICogKCdhMiwgJ2IyKSBlcXVhbFxuZW5kXG5cbm1vZHVsZSBDb21wb3NpdGlvbl9wcmVzZXJ2ZXNfaW5qZWN0aXZpdHkgKE0xIDogSW5qZWN0aXZlKSAoTTIgOiBJbmplY3RpdmUpID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIE0xLnQgTTIudFxuXG4gIGxldCBzdHJpcCBlID0gTTEuc3RyaXAgKE0yLnN0cmlwIGUpXG5lbmRcblxubW9kdWxlIElkID0gc3RydWN0XG4gIG1vZHVsZSBVaWQgPSBJbnRcblxuICBtb2R1bGUgV2l0bmVzcyA9IHN0cnVjdFxuICAgIG1vZHVsZSBLZXkgPSBzdHJ1Y3RcbiAgICAgIHR5cGUgXyB0ID0gLi5cbiAgICAgIHR5cGUgdHlwZV93aXRuZXNzX2ludCA9IFsgYHR5cGVfd2l0bmVzcyBvZiBpbnQgXSBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgICAgbGV0IHNleHBfb2ZfdHlwZV93aXRuZXNzX2ludCA9XG4gICAgICAgIChmdW4gKGB0eXBlX3dpdG5lc3Mgdl9fMDA1XykgLT5cbiAgICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwidHlwZV93aXRuZXNzXCI7IHNleHBfb2ZfaW50IHZfXzAwNV8gXVxuICAgICAgICAgICA6IHR5cGVfd2l0bmVzc19pbnQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgOztcblxuICAgICAgW0BAQGVuZF1cblxuICAgICAgbGV0IHNleHBfb2ZfdCBfc2V4cF9vZl9hIHQgPVxuICAgICAgICBgdHlwZV93aXRuZXNzXG4gICAgICAgICAgKENhbWwuT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5pZCAoQ2FtbC5PYmouRXh0ZW5zaW9uX2NvbnN0cnVjdG9yLm9mX3ZhbCB0KSlcbiAgICAgICAgfD4gc2V4cF9vZl90eXBlX3dpdG5lc3NfaW50XG4gICAgICA7O1xuICAgIGVuZFxuXG4gICAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgICAgdHlwZSB0XG4gICAgICB0eXBlIF8gS2V5LnQgKz0gS2V5IDogdCBLZXkudFxuICAgIGVuZFxuXG4gICAgdHlwZSAnYSB0ID0gKG1vZHVsZSBTIHdpdGggdHlwZSB0ID0gJ2EpXG5cbiAgICBsZXQgc2V4cF9vZl90ICh0eXBlIGEpIHNleHBfb2ZfYSAobW9kdWxlIE0gOiBTIHdpdGggdHlwZSB0ID0gYSkgPVxuICAgICAgTS5LZXkgfD4gS2V5LnNleHBfb2ZfdCBzZXhwX29mX2FcbiAgICA7O1xuXG4gICAgbGV0IGNyZWF0ZSAodHlwZSB0KSAoKSA9XG4gICAgICBsZXQgbW9kdWxlIE0gPSBzdHJ1Y3RcbiAgICAgICAgdHlwZSBub25yZWMgdCA9IHRcbiAgICAgICAgdHlwZSBfIEtleS50ICs9IEtleSA6IHQgS2V5LnRcbiAgICAgIGVuZFxuICAgICAgaW5cbiAgICAgIChtb2R1bGUgTSA6IFMgd2l0aCB0eXBlIHQgPSB0KVxuICAgIDs7XG5cbiAgICBsZXQgdWlkICh0eXBlIGEpIChtb2R1bGUgTSA6IFMgd2l0aCB0eXBlIHQgPSBhKSA9XG4gICAgICBDYW1sLk9iai5FeHRlbnNpb25fY29uc3RydWN0b3IuaWQgKENhbWwuT2JqLkV4dGVuc2lvbl9jb25zdHJ1Y3Rvci5vZl92YWwgTS5LZXkpXG4gICAgOztcblxuICAgICgqIFdlIHdhbnQgYSBjb25zdGFudCBhbGxvY2F0ZWQgb25jZSB0aGF0IFtzYW1lXSBjYW4gcmV0dXJuIHdoZW5ldmVyIGl0IGdldHMgdGhlIHNhbWVcbiAgICAgICB3aXRuZXNzZXMuICBJZiB3ZSB3cml0ZSB0aGUgY29uc3RhbnQgaW5zaWRlIHRoZSBib2R5IG9mIFtzYW1lXSwgdGhlIG5hdGl2ZS1jb2RlXG4gICAgICAgY29tcGlsZXIgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgYW5kIGxpZnQgaXQgb3V0LiAgQnV0IGZvciBjbGFyaXR5IGFuZCByb2J1c3RuZXNzLFxuICAgICAgIHdlIGRvIGl0IG91cnNlbHZlcy4gKilcbiAgICBsZXQgc29tZV90ID0gU29tZSBUXG5cbiAgICBsZXQgc2FtZSAodHlwZSBhIGIpIChhIDogYSB0KSAoYiA6IGIgdCkgOiAoYSwgYikgZXF1YWwgb3B0aW9uID1cbiAgICAgIGxldCBtb2R1bGUgQSA9ICh2YWwgYSA6IFMgd2l0aCB0eXBlIHQgPSBhKSBpblxuICAgICAgbGV0IG1vZHVsZSBCID0gKHZhbCBiIDogUyB3aXRoIHR5cGUgdCA9IGIpIGluXG4gICAgICBtYXRjaCBBLktleSB3aXRoXG4gICAgICB8IEIuS2V5IC0+IHNvbWVfdFxuICAgICAgfCBfIC0+IE5vbmVcbiAgICA7O1xuICBlbmRcblxuXG4gIHR5cGUgJ2EgdCA9XG4gICAgeyB3aXRuZXNzIDogJ2EgV2l0bmVzcy50XG4gICAgOyBuYW1lIDogc3RyaW5nXG4gICAgOyB0b19zZXhwIDogJ2EgLT4gU2V4cC50XG4gICAgfVxuXG4gIGxldCBzZXhwX29mX3QgXyB7IHdpdG5lc3M7IG5hbWU7IHRvX3NleHAgfSA6IFNleHAudCA9XG4gICAgaWYgYW1fdGVzdGluZ1xuICAgIHRoZW4gQXRvbSBuYW1lXG4gICAgZWxzZVxuICAgICAgTGlzdFxuICAgICAgICBbIExpc3QgWyBBdG9tIFwibmFtZVwiOyBBdG9tIG5hbWUgXVxuICAgICAgICA7IExpc3QgWyBBdG9tIFwid2l0bmVzc1wiOyB3aXRuZXNzIHw+IFdpdG5lc3Muc2V4cF9vZl90IHRvX3NleHAgXVxuICAgICAgICBdXG4gIDs7XG5cbiAgbGV0IHRvX3NleHAgdCA9IHQudG9fc2V4cFxuICBsZXQgbmFtZSB0ID0gdC5uYW1lXG4gIGxldCBjcmVhdGUgfm5hbWUgdG9fc2V4cCA9IHsgd2l0bmVzcyA9IFdpdG5lc3MuY3JlYXRlICgpOyBuYW1lOyB0b19zZXhwIH1cbiAgbGV0IHVpZCB0ID0gV2l0bmVzcy51aWQgdC53aXRuZXNzXG4gIGxldCBoYXNoIHQgPSB1aWQgdFxuICBsZXQgaGFzaF9mb2xkX3QgcyB0ID0gaGFzaF9mb2xkX2ludCBzICh1aWQgdClcbiAgbGV0IHNhbWVfd2l0bmVzcyB0MSB0MiA9IFdpdG5lc3Muc2FtZSB0MS53aXRuZXNzIHQyLndpdG5lc3NcbiAgbGV0IHNhbWUgdDEgdDIgPSBPcHRpb24uaXNfc29tZSAoc2FtZV93aXRuZXNzIHQxIHQyKVxuXG4gIGxldCBzYW1lX3dpdG5lc3NfZXhuIHQxIHQyID1cbiAgICBtYXRjaCBzYW1lX3dpdG5lc3MgdDEgdDIgd2l0aFxuICAgIHwgU29tZSB3IC0+IHdcbiAgICB8IE5vbmUgLT5cbiAgICAgIEVycm9yLnJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIlR5cGVfZXF1YWwuSWQuc2FtZV93aXRuZXNzX2V4biBnb3QgZGlmZmVyZW50IGlkc1wiXG4gICAgICAgICAgIFsgKCBcIlwiXG4gICAgICAgICAgICAgLCBzZXhwX29mX3BhaXIgKHNleHBfb2ZfdCBzZXhwX29mX29wYXF1ZSkgKHNleHBfb2ZfdCBzZXhwX29mX29wYXF1ZSkgKHQxLCB0MilcbiAgICAgICAgICAgICApXG4gICAgICAgICAgIF0pXG4gIDs7XG5lbmRcbiIsIm9wZW4hIEltcG9ydFxuXG4oKiogWydhIENoZWFwX29wdGlvbi50XSBpcyBsaWtlIFsnYSBvcHRpb25dLCBidXQgaXQgZG9lc24ndCBib3ggW3NvbWUgX10gdmFsdWVzLlxuXG4gICAgVGhlcmUgYXJlIHNldmVyYWwgdGhpbmdzIHRoYXQgYXJlIHVuc2FmZSBhYm91dCBpdDpcblxuICAgIC0gW2Zsb2F0IHQgYXJyYXldIChvciBhbnkgYXJyYXktYmFja2VkIGNvbnRhaW5lcikgaXMgbm90IG1lbW9yeS1zYWZlXG4gICAgICBiZWNhdXNlIGZsb2F0IGFycmF5IG9wdGltaXphdGlvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB1bmJveGVkIG9wdGlvblxuICAgICAgb3B0aW1pemF0aW9uLiBZb3UgaGF2ZSB0byB1c2UgW1VuaWZvcm1fYXJyYXkudF0gaW5zdGVhZCBvZiBbYXJyYXldLlxuXG4gICAgLSBOZXN0ZWQgb3B0aW9ucyAoWydhIHQgdF0pIGRvbid0IHdvcmsuIFRoZXkgYXJlIGJlbGlldmVkIHRvIGJlXG4gICAgICBtZW1vcnktc2FmZSwgYnV0IG5vdCBwYXJhbWV0cmljLlxuXG4gICAgLSBBIHJlY29yZCB3aXRoIFtmbG9hdCB0XXMgaW4gaXQgc2hvdWxkIGJlIHNhZmUsIGJ1dCBpdCdzIG9ubHkgW3RdIGJlaW5nXG4gICAgICBhYnN0cmFjdCB0aGF0IGdpdmVzIHlvdSBzYWZldHkuIElmIHRoZSBjb21waWxlciB3YXMgc21hcnQgZW5vdWdoIHRvIHBlZWtcbiAgICAgIHRocm91Z2ggdGhlIG1vZHVsZSBzaWduYXR1cmUgdGhlbiBpdCBjb3VsZCBkZWNpZGUgdG8gY29uc3RydWN0IGEgZmxvYXRcbiAgICAgIGFycmF5IGluc3RlYWQuICopXG5tb2R1bGUgQ2hlYXBfb3B0aW9uID0gc3RydWN0XG4gICgqIFRoaXMgaXMgdGFrZW4gZnJvbSBjb3JlLiBSYXRoZXIgdGhhbiBleHBvc2UgaXQgaW4gdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYmFzZSwganVzdFxuICAgICBrZWVwIGEgY29weSBhcm91bmQgaGVyZS4gKilcbiAgbGV0IHBoeXNfc2FtZSAodHlwZSBhIGIpIChhIDogYSkgKGIgOiBiKSA9IHBoeXNfZXF1YWwgYSAoQ2FtbC5PYmoubWFnaWMgYiA6IGEpXG5cbiAgbW9kdWxlIFQwIDogc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgbm9uZSA6IF8gdFxuICAgIHZhbCBzb21lIDogJ2EgLT4gJ2EgdFxuICAgIHZhbCBpc19ub25lIDogXyB0IC0+IGJvb2xcbiAgICB2YWwgaXNfc29tZSA6IF8gdCAtPiBib29sXG4gICAgdmFsIHZhbHVlX2V4biA6ICdhIHQgLT4gJ2FcbiAgICB2YWwgdmFsdWVfdW5zYWZlIDogJ2EgdCAtPiAnYVxuICAgIHZhbCBpdGVyX3NvbWUgOiAnYSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgZW5kID0gc3RydWN0XG4gICAgdHlwZSArJ2EgdFxuXG4gICAgKCogQmVpbmcgYSBwb2ludGVyLCBubyBvbmUgb3V0c2lkZSB0aGlzIG1vZHVsZSBjYW4gY29uc3RydWN0IGEgdmFsdWUgdGhhdCBpc1xuICAgICAgIFtwaHlzX3NhbWVdIGFzIHRoaXMgb25lLlxuXG4gICAgICAgSXQgd291bGQgYmUgc2ltcGxlciB0byB1c2UgdGhpcyB2YWx1ZSBhcyBbbm9uZV0sIGJ1dCB3ZSB1c2UgYW4gaW1tZWRpYXRlIGluc3RlYWRcbiAgICAgICBiZWNhdXNlIGl0IGxldHMgdXMgYXZvaWQgY2FtbF9tb2RpZnkgd2hlbiBzZXR0aW5nIHRvIFtub25lXSwgbWFraW5nIGNlcnRhaW5cbiAgICAgICBiZW5jaG1hcmtzIHNpZ25pZmljYW50bHkgZmFzdGVyIChlLmcuIC4uL2JlbmNoL2FycmF5X3F1ZXVlLmV4ZSkuXG5cbiAgICAgICB0aGlzIGNvZGUgaXMgZHVwbGljYXRlZCBpbiBNb3B0aW9uLCBhbmQgaWYgd2UgZmluZCB5ZXQgYW5vdGhlciBwbGFjZSB3aGVyZSB3ZSB3YW50XG4gICAgICAgaXQgd2Ugc2hvdWxkIHJlY29uc2lkZXIgbWFraW5nIGl0IHNoYXJlZC4gKilcbiAgICBsZXQgbm9uZV9zdWJzdGl0dXRlIDogXyB0ID0gQ2FtbC5PYmoub2JqIChDYW1sLk9iai5uZXdfYmxvY2sgQ2FtbC5PYmouYWJzdHJhY3RfdGFnIDEpXG5cbiAgICBsZXQgbm9uZSA6IF8gdCA9XG4gICAgICAoKiBUaGUgbnVtYmVyIHdhcyBwcm9kdWNlZCBieVxuICAgICAgICAgWzwgL2Rldi91cmFuZG9tIHRyIC1jIC1kICcxMjM0NTY3ODkwYWJjZGVmJyB8IGhlYWQgLWMgMTZdLlxuXG4gICAgICAgICBUaGUgaWRlYSBpcyB0aGF0IGEgcmFuZG9tIG51bWJlciB3aWxsIGhhdmUgbG93ZXIgcHJvYmFiaWxpdHkgdG8gY29sbGlkZSB3aXRoXG4gICAgICAgICBhbnl0aGluZyB0aGFuIGFueSBudW1iZXIgd2UgY2FuIGNob29zZSBvdXJzZWx2ZXMuXG5cbiAgICAgICAgIFdlIGFyZSB1c2luZyBhIHBvbHltb3JwaGljIHZhcmlhbnQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IGJlY2F1c2UgdGhlcmVcbiAgICAgICAgIGlzIGEgY29tcGlsZXIgYnVnIHdoZXJlIGl0IHdyb25nbHkgYXNzdW1lcyB0aGF0IHRoZSByZXN1bHQgb2YgW2lmIF8gdGhlbiBjIGVsc2VcbiAgICAgICAgIHldIGlzIG5vdCBhIHBvaW50ZXIgaWYgW2NdIGlzIGFuIGludGVnZXIgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgVGhpcyBpcyBiZWluZ1xuICAgICAgICAgZml4ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvNTU1LiAgVGhlIFwibWVtb3J5IGNvcnJ1cHRpb25cIiB0ZXN0XG4gICAgICAgICBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIGlzc3VlLiAgKilcbiAgICAgIENhbWwuT2JqLm1hZ2ljIGB4NmU4ZWUzNDc4ZTFkNzQ0OVxuICAgIDs7XG5cbiAgICBsZXQgaXNfbm9uZSB4ID0gcGh5c19lcXVhbCB4IG5vbmVcbiAgICBsZXQgaXNfc29tZSB4ID0gbm90IChwaHlzX2VxdWFsIHggbm9uZSlcblxuICAgIGxldCBzb21lICh0eXBlIGEpICh4IDogYSkgOiBhIHQgPVxuICAgICAgaWYgcGh5c19zYW1lIHggbm9uZSB0aGVuIG5vbmVfc3Vic3RpdHV0ZSBlbHNlIENhbWwuT2JqLm1hZ2ljIHhcbiAgICA7O1xuXG4gICAgbGV0IHZhbHVlX3Vuc2FmZSAodHlwZSBhKSAoeCA6IGEgdCkgOiBhID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgeCBub25lX3N1YnN0aXR1dGUgdGhlbiBDYW1sLk9iai5tYWdpYyBub25lIGVsc2UgQ2FtbC5PYmoubWFnaWMgeFxuICAgIDs7XG5cbiAgICBsZXQgdmFsdWVfZXhuIHggPVxuICAgICAgaWYgaXNfc29tZSB4XG4gICAgICB0aGVuIHZhbHVlX3Vuc2FmZSB4XG4gICAgICBlbHNlIGZhaWx3aXRoIFwiT3B0aW9uX2FycmF5LmdldF9zb21lX2V4bjogdGhlIGVsZW1lbnQgaXMgW05vbmVdXCJcbiAgICA7O1xuXG4gICAgbGV0IGl0ZXJfc29tZSB0IH5mID0gaWYgaXNfc29tZSB0IHRoZW4gZiAodmFsdWVfdW5zYWZlIHQpXG4gIGVuZFxuXG4gIG1vZHVsZSBUMSA9IHN0cnVjdFxuICAgIGluY2x1ZGUgVDBcblxuICAgIGxldCBvZl9vcHRpb24gPSBmdW5jdGlvblxuICAgICAgfCBOb25lIC0+IG5vbmVcbiAgICAgIHwgU29tZSB4IC0+IHNvbWUgeFxuICAgIDs7XG5cbiAgICBsZXRbQGlubGluZV0gdG9fb3B0aW9uIHggPSBpZiBpc19zb21lIHggdGhlbiBTb21lICh2YWx1ZV91bnNhZmUgeCkgZWxzZSBOb25lXG4gICAgbGV0IHRvX3NleHBhYmxlID0gdG9fb3B0aW9uXG4gICAgbGV0IG9mX3NleHBhYmxlID0gb2Zfb3B0aW9uXG5cbiAgICBsZXQgdF9zZXhwX2dyYW1tYXIgKHR5cGUgYSkgKGdyYW1tYXIgOiBhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgICAgOiBhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgICAgID1cbiAgICAgIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKE9wdGlvbi50X3NleHBfZ3JhbW1hciBncmFtbWFyKVxuICAgIDs7XG4gIGVuZFxuXG4gIGluY2x1ZGUgVDFcbiAgaW5jbHVkZSBTZXhwYWJsZS5PZl9zZXhwYWJsZTEgKE9wdGlvbikgKFQxKVxuZW5kXG5cbnR5cGUgJ2EgdCA9ICdhIENoZWFwX29wdGlvbi50IFVuaWZvcm1fYXJyYXkudCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG5sZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID1cbiAgZnVuIF9vZl9hX18wMDFfIHhfXzAwM18gLT5cbiAgVW5pZm9ybV9hcnJheS50X29mX3NleHAgKENoZWFwX29wdGlvbi50X29mX3NleHAgX29mX2FfXzAwMV8pIHhfXzAwM19cbjs7XG5cbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICBmdW4gX29mX2FfXzAwNF8geF9fMDA1XyAtPlxuICBVbmlmb3JtX2FycmF5LnNleHBfb2ZfdCAoQ2hlYXBfb3B0aW9uLnNleHBfb2ZfdCBfb2ZfYV9fMDA0XykgeF9fMDA1X1xuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT5cbiAgVW5pZm9ybV9hcnJheS50X3NleHBfZ3JhbW1hciAoQ2hlYXBfb3B0aW9uLnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXIpXG47O1xuXG5bQEBAZW5kXVxuXG5sZXQgZW1wdHkgPSBVbmlmb3JtX2FycmF5LmVtcHR5XG5sZXQgY3JlYXRlIH5sZW4gPSBVbmlmb3JtX2FycmF5LmNyZWF0ZSB+bGVuIENoZWFwX29wdGlvbi5ub25lXG5sZXQgaW5pdCBuIH5mID0gVW5pZm9ybV9hcnJheS5pbml0IG4gfmY6KGZ1biBpIC0+IENoZWFwX29wdGlvbi5vZl9vcHRpb24gKGYgaSkpXG5sZXQgaW5pdF9zb21lIG4gfmYgPSBVbmlmb3JtX2FycmF5LmluaXQgbiB+ZjooZnVuIGkgLT4gQ2hlYXBfb3B0aW9uLnNvbWUgKGYgaSkpXG5sZXQgbGVuZ3RoID0gVW5pZm9ybV9hcnJheS5sZW5ndGhcbmxldFtAaW5saW5lXSBnZXQgdCBpID0gQ2hlYXBfb3B0aW9uLnRvX29wdGlvbiAoVW5pZm9ybV9hcnJheS5nZXQgdCBpKVxubGV0IGdldF9zb21lX2V4biB0IGkgPSBDaGVhcF9vcHRpb24udmFsdWVfZXhuIChVbmlmb3JtX2FycmF5LmdldCB0IGkpXG5sZXQgaXNfbm9uZSB0IGkgPSBDaGVhcF9vcHRpb24uaXNfbm9uZSAoVW5pZm9ybV9hcnJheS5nZXQgdCBpKVxubGV0IGlzX3NvbWUgdCBpID0gQ2hlYXBfb3B0aW9uLmlzX3NvbWUgKFVuaWZvcm1fYXJyYXkuZ2V0IHQgaSlcbmxldCBzZXQgdCBpIHggPSBVbmlmb3JtX2FycmF5LnNldCB0IGkgKENoZWFwX29wdGlvbi5vZl9vcHRpb24geClcbmxldCBzZXRfc29tZSB0IGkgeCA9IFVuaWZvcm1fYXJyYXkuc2V0IHQgaSAoQ2hlYXBfb3B0aW9uLnNvbWUgeClcbmxldCBzZXRfbm9uZSB0IGkgPSBVbmlmb3JtX2FycmF5LnNldCB0IGkgQ2hlYXBfb3B0aW9uLm5vbmVcbmxldCBzd2FwIHQgaSBqID0gVW5pZm9ybV9hcnJheS5zd2FwIHQgaSBqXG5sZXQgdW5zYWZlX2dldCB0IGkgPSBDaGVhcF9vcHRpb24udG9fb3B0aW9uIChVbmlmb3JtX2FycmF5LnVuc2FmZV9nZXQgdCBpKVxubGV0IHVuc2FmZV9nZXRfc29tZV9leG4gdCBpID0gQ2hlYXBfb3B0aW9uLnZhbHVlX2V4biAoVW5pZm9ybV9hcnJheS51bnNhZmVfZ2V0IHQgaSlcblxubGV0IHVuc2FmZV9nZXRfc29tZV9hc3N1bWluZ19zb21lIHQgaSA9XG4gIENoZWFwX29wdGlvbi52YWx1ZV91bnNhZmUgKFVuaWZvcm1fYXJyYXkudW5zYWZlX2dldCB0IGkpXG47O1xuXG5sZXQgdW5zYWZlX2lzX3NvbWUgdCBpID0gQ2hlYXBfb3B0aW9uLmlzX3NvbWUgKFVuaWZvcm1fYXJyYXkudW5zYWZlX2dldCB0IGkpXG5sZXQgdW5zYWZlX3NldCB0IGkgeCA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX3NldCB0IGkgKENoZWFwX29wdGlvbi5vZl9vcHRpb24geClcbmxldCB1bnNhZmVfc2V0X3NvbWUgdCBpIHggPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9zZXQgdCBpIChDaGVhcF9vcHRpb24uc29tZSB4KVxubGV0IHVuc2FmZV9zZXRfbm9uZSB0IGkgPSBVbmlmb3JtX2FycmF5LnVuc2FmZV9zZXQgdCBpIENoZWFwX29wdGlvbi5ub25lXG5cbmxldCBjbGVhciB0ID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCB0IC0gMSBkb1xuICAgIHVuc2FmZV9zZXRfbm9uZSB0IGlcbiAgZG9uZVxuOztcblxubGV0IGl0ZXJpIGlucHV0IH5mID1cbiAgZm9yIGkgPSAwIHRvIGxlbmd0aCBpbnB1dCAtIDEgZG9cbiAgICBmIGkgKHVuc2FmZV9nZXQgaW5wdXQgaSlcbiAgZG9uZVxuOztcblxubGV0IGl0ZXIgaW5wdXQgfmYgPSBpdGVyaSBpbnB1dCB+ZjooZnVuIChfIDogaW50KSB4IC0+IGYgeClcblxubGV0IGZvbGRpIGlucHV0IH5pbml0IH5mID1cbiAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gIGl0ZXJpIGlucHV0IH5mOihmdW4gaSBlbGVtIC0+IGFjYyA6PSBmIGkgIWFjYyBlbGVtKTtcbiAgIWFjY1xuOztcblxubGV0IGZvbGQgaW5wdXQgfmluaXQgfmYgPSBmb2xkaSBpbnB1dCB+aW5pdCB+ZjooZnVuIChfIDogaW50KSBhY2MgeCAtPiBmIGFjYyB4KVxuXG5pbmNsdWRlIEluZGV4ZWRfY29udGFpbmVyLk1ha2VfZ2VuIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuICAgIHR5cGUgJ2EgZWx0ID0gJ2Egb3B0aW9uXG5cbiAgICBsZXQgZm9sZCA9IGZvbGRcbiAgICBsZXQgZm9sZGkgPSBgQ3VzdG9tIGZvbGRpXG4gICAgbGV0IGl0ZXIgPSBgQ3VzdG9tIGl0ZXJcbiAgICBsZXQgaXRlcmkgPSBgQ3VzdG9tIGl0ZXJpXG4gICAgbGV0IGxlbmd0aCA9IGBDdXN0b20gbGVuZ3RoXG4gIGVuZClcblxubGV0IG1hcGkgaW5wdXQgfmYgPVxuICBsZXQgb3V0cHV0ID0gY3JlYXRlIH5sZW46KGxlbmd0aCBpbnB1dCkgaW5cbiAgaXRlcmkgaW5wdXQgfmY6KGZ1biBpIGVsZW0gLT4gdW5zYWZlX3NldCBvdXRwdXQgaSAoZiBpIGVsZW0pKTtcbiAgb3V0cHV0XG47O1xuXG5sZXQgbWFwIGlucHV0IH5mID0gbWFwaSBpbnB1dCB+ZjooZnVuIChfIDogaW50KSBlbGVtIC0+IGYgZWxlbSlcblxubGV0IG1hcF9zb21lIGlucHV0IH5mID1cbiAgbGV0IGxlbiA9IGxlbmd0aCBpbnB1dCBpblxuICBsZXQgb3V0cHV0ID0gY3JlYXRlIH5sZW4gaW5cbiAgbGV0ICgpID1cbiAgICBmb3IgaSA9IDAgdG8gbGVuIC0gMSBkb1xuICAgICAgbGV0IG9wdCA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX2dldCBpbnB1dCBpIGluXG4gICAgICBDaGVhcF9vcHRpb24uaXRlcl9zb21lIG9wdCB+ZjooZnVuIHggLT4gdW5zYWZlX3NldF9zb21lIG91dHB1dCBpIChmIHgpKVxuICAgIGRvbmVcbiAgaW5cbiAgb3V0cHV0XG47O1xuXG5sZXQgb2ZfYXJyYXkgYXJyYXkgPSBpbml0IChBcnJheS5sZW5ndGggYXJyYXkpIH5mOihmdW4gaSAtPiBBcnJheS51bnNhZmVfZ2V0IGFycmF5IGkpXG5cbmxldCBvZl9hcnJheV9zb21lIGFycmF5ID1cbiAgaW5pdF9zb21lIChBcnJheS5sZW5ndGggYXJyYXkpIH5mOihmdW4gaSAtPiBBcnJheS51bnNhZmVfZ2V0IGFycmF5IGkpXG47O1xuXG5sZXQgdG9fYXJyYXkgdCA9IEFycmF5LmluaXQgKGxlbmd0aCB0KSB+ZjooZnVuIGkgLT4gdW5zYWZlX2dldCB0IGkpXG5cbmluY2x1ZGUgQmxpdC5NYWtlMV9nZW5lcmljIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGxlbmd0aCA9IGxlbmd0aFxuICAgIGxldCBjcmVhdGVfbGlrZSB+bGVuIF8gPSBjcmVhdGUgfmxlblxuICAgIGxldCB1bnNhZmVfYmxpdCA9IFVuaWZvcm1fYXJyYXkudW5zYWZlX2JsaXRcbiAgZW5kKVxuXG5sZXQgY29weSA9IFVuaWZvcm1fYXJyYXkuY29weVxuXG5tb2R1bGUgRm9yX3Rlc3RpbmcgPSBzdHJ1Y3RcbiAgbW9kdWxlIFVuc2FmZV9jaGVhcF9vcHRpb24gPSBDaGVhcF9vcHRpb25cbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5pbmNsdWRlIFN0YWNrX2ludGZcblxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbigqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc2ltaWxhciB0byBbRGVxdWVdIGluIHRoYXQgaXQgdXNlcyBhbiBhcnJheSBvZiBbJ2FdIGFuZFxuICAgYSBtdXRhYmxlIFtpbnRdIHRvIGluZGljYXRlIHdoYXQgaW4gdGhlIGFycmF5IGlzIHVzZWQuICBXZSBjaG9vc2UgdG8gaW1wbGVtZW50IFtTdGFja11cbiAgIGRpcmVjdGx5IHJhdGhlciB0aGFuIG9uIHRvcCBvZiBbRGVxdWVdIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiAgRS5nLiBhIHNpbXBsZVxuICAgbWljcm9iZW5jaG1hcmsgc2hvd3MgdGhhdCBwdXNoL3BvcCBpcyBhYm91dCAyMCUgZmFzdGVyLiAqKVxudHlwZSAnYSB0ID1cbiAgeyBtdXRhYmxlIGxlbmd0aCA6IGludFxuICA7IG11dGFibGUgZWx0cyA6ICdhIE9wdGlvbl9hcnJheS50XG4gIH1cbltAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG5sZXQgc2V4cF9vZl90IDogJ2EuICgnYSAtPiBTZXhwbGliMC5TZXhwLnQpIC0+ICdhIHQgLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgZnVuIF9vZl9hX18wMDFfIHsgbGVuZ3RoID0gbGVuZ3RoX18wMDNfOyBlbHRzID0gZWx0c19fMDA1XyB9IC0+XG4gIGxldCBibmRzX18wMDJfID0gW10gaW5cbiAgbGV0IGJuZHNfXzAwMl8gPVxuICAgIGxldCBhcmdfXzAwNl8gPSBPcHRpb25fYXJyYXkuc2V4cF9vZl90IF9vZl9hX18wMDFfIGVsdHNfXzAwNV8gaW5cbiAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJlbHRzXCI7IGFyZ19fMDA2XyBdIDo6IGJuZHNfXzAwMl9cbiAgaW5cbiAgbGV0IGJuZHNfXzAwMl8gPVxuICAgIGxldCBhcmdfXzAwNF8gPSBzZXhwX29mX2ludCBsZW5ndGhfXzAwM18gaW5cbiAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJsZW5ndGhcIjsgYXJnX18wMDRfIF0gOjogYm5kc19fMDAyX1xuICBpblxuICBTZXhwbGliMC5TZXhwLkxpc3QgYm5kc19fMDAyX1xuOztcblxuW0BAQGVuZF1cblxubGV0IHNleHBfb2ZfdF9pbnRlcm5hbCA9IHNleHBfb2ZfdFxubGV0IHNleHBfb2ZfdCA9IGBSZWJvdW5kX2xhdGVyXG5sZXQgXyA9IHNleHBfb2ZfdFxubGV0IGNhcGFjaXR5IHQgPSBPcHRpb25fYXJyYXkubGVuZ3RoIHQuZWx0c1xuXG5sZXQgaW52YXJpYW50IGludmFyaWFudF9hICh7IGxlbmd0aDsgZWx0cyB9IGFzIHQpIDogdW5pdCA9XG4gIHRyeVxuICAgIGFzc2VydCAoMCA8PSBsZW5ndGggJiYgbGVuZ3RoIDw9IE9wdGlvbl9hcnJheS5sZW5ndGggZWx0cyk7XG4gICAgZm9yIGkgPSAwIHRvIGxlbmd0aCAtIDEgZG9cbiAgICAgIGludmFyaWFudF9hIChPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIGVsdHMgaSlcbiAgICBkb25lO1xuICAgICgqIFdlIG1haW50YWluIHRoZSBpbnZhcmlhbnQgdGhhdCB1bnVzZWQgZWxlbWVudHMgYXJlIHVuc2V0IHRvIGF2b2lkIGEgc3BhY2VcbiAgICAgICBsZWFrLiAqKVxuICAgIGZvciBpID0gbGVuZ3RoIHRvIE9wdGlvbl9hcnJheS5sZW5ndGggZWx0cyAtIDEgZG9cbiAgICAgIGFzc2VydCAobm90IChPcHRpb25fYXJyYXkuaXNfc29tZSBlbHRzIGkpKVxuICAgIGRvbmVcbiAgd2l0aFxuICB8IGV4biAtPlxuICAgIHJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiU3RhY2suaW52YXJpYW50IGZhaWxlZFwiXG4gICAgICAgICBbIFwiZXhuXCIsIGV4biB8PiBFeG4uc2V4cF9vZl90OyBcInN0YWNrXCIsIHQgfD4gc2V4cF9vZl90X2ludGVybmFsIHNleHBfb2Zfb3BhcXVlIF0pXG47O1xuXG5sZXQgY3JlYXRlICh0eXBlIGEpICgpIDogYSB0ID0geyBsZW5ndGggPSAwOyBlbHRzID0gT3B0aW9uX2FycmF5LmVtcHR5IH1cbmxldCBsZW5ndGggdCA9IHQubGVuZ3RoXG5sZXQgaXNfZW1wdHkgdCA9IGxlbmd0aCB0ID0gMFxuXG4oKiBUaGUgb3JkZXIgaW4gd2hpY2ggZWxlbWVudHMgYXJlIHZpc2l0ZWQgaGFzIGJlZW4gY2hvc2VuIHNvIGFzIHRvIGJlIGJhY2t3YXJkc1xuICAgY29tcGF0aWJsZSB3aXRoIFtDYW1sLlN0YWNrXSAqKVxubGV0IGZvbGQgdCB+aW5pdCB+ZiA9XG4gIGxldCByID0gcmVmIGluaXQgaW5cbiAgZm9yIGkgPSB0Lmxlbmd0aCAtIDEgZG93bnRvIDAgZG9cbiAgICByIDo9IGYgIXIgKE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gdC5lbHRzIGkpXG4gIGRvbmU7XG4gICFyXG47O1xuXG5sZXQgaXRlciB0IH5mID1cbiAgZm9yIGkgPSB0Lmxlbmd0aCAtIDEgZG93bnRvIDAgZG9cbiAgICBmIChPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIHQuZWx0cyBpKVxuICBkb25lXG47O1xuXG5tb2R1bGUgQyA9IENvbnRhaW5lci5NYWtlIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyAnYSB0ID0gJ2EgdFxuXG4gICAgbGV0IGZvbGQgPSBmb2xkXG4gICAgbGV0IGl0ZXIgPSBgQ3VzdG9tIGl0ZXJcbiAgICBsZXQgbGVuZ3RoID0gYEN1c3RvbSBsZW5ndGhcbiAgZW5kKVxuXG5sZXQgbWVtID0gQy5tZW1cbmxldCBleGlzdHMgPSBDLmV4aXN0c1xubGV0IGZvcl9hbGwgPSBDLmZvcl9hbGxcbmxldCBjb3VudCA9IEMuY291bnRcbmxldCBzdW0gPSBDLnN1bVxubGV0IGZpbmQgPSBDLmZpbmRcbmxldCBmaW5kX21hcCA9IEMuZmluZF9tYXBcbmxldCB0b19saXN0ID0gQy50b19saXN0XG5sZXQgdG9fYXJyYXkgPSBDLnRvX2FycmF5XG5sZXQgbWluX2VsdCA9IEMubWluX2VsdFxubGV0IG1heF9lbHQgPSBDLm1heF9lbHRcbmxldCBmb2xkX3Jlc3VsdCA9IEMuZm9sZF9yZXN1bHRcbmxldCBmb2xkX3VudGlsID0gQy5mb2xkX3VudGlsXG5cbmxldCBvZl9saXN0ICh0eXBlIGEpIChsIDogYSBsaXN0KSA9XG4gIGlmIExpc3QuaXNfZW1wdHkgbFxuICB0aGVuIGNyZWF0ZSAoKVxuICBlbHNlIChcbiAgICBsZXQgbGVuZ3RoID0gTGlzdC5sZW5ndGggbCBpblxuICAgIGxldCBlbHRzID0gT3B0aW9uX2FycmF5LmNyZWF0ZSB+bGVuOigyICogbGVuZ3RoKSBpblxuICAgIGxldCByID0gcmVmIGwgaW5cbiAgICBmb3IgaSA9IGxlbmd0aCAtIDEgZG93bnRvIDAgZG9cbiAgICAgIG1hdGNoICFyIHdpdGhcbiAgICAgIHwgW10gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IGEgOjogbCAtPlxuICAgICAgICBPcHRpb25fYXJyYXkuc2V0X3NvbWUgZWx0cyBpIGE7XG4gICAgICAgIHIgOj0gbFxuICAgIGRvbmU7XG4gICAgeyBsZW5ndGg7IGVsdHMgfSlcbjs7XG5cbmxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPSBMaXN0LnNleHBfb2ZfdCBzZXhwX29mX2EgKHRvX2xpc3QgdClcbmxldCB0X29mX3NleHAgYV9vZl9zZXhwIHNleHAgPSBvZl9saXN0IChMaXN0LnRfb2Zfc2V4cCBhX29mX3NleHAgc2V4cClcblxubGV0IHRfc2V4cF9ncmFtbWFyICh0eXBlIGEpIChncmFtbWFyIDogYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiBhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChMaXN0LnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG47O1xuXG5sZXQgcmVzaXplIHQgc2l6ZSA9XG4gIGxldCBhcnIgPSBPcHRpb25fYXJyYXkuY3JlYXRlIH5sZW46c2l6ZSBpblxuICBPcHRpb25fYXJyYXkuYmxpdCB+c3JjOnQuZWx0cyB+ZHN0OmFyciB+c3JjX3BvczowIH5kc3RfcG9zOjAgfmxlbjp0Lmxlbmd0aDtcbiAgdC5lbHRzIDwtIGFyclxuOztcblxubGV0IHNldF9jYXBhY2l0eSB0IG5ld19jYXBhY2l0eSA9XG4gIGxldCBuZXdfY2FwYWNpdHkgPSBtYXggbmV3X2NhcGFjaXR5IChsZW5ndGggdCkgaW5cbiAgaWYgbmV3X2NhcGFjaXR5IDw+IGNhcGFjaXR5IHQgdGhlbiByZXNpemUgdCBuZXdfY2FwYWNpdHlcbjs7XG5cbmxldCBwdXNoIHQgYSA9XG4gIGlmIHQubGVuZ3RoID0gT3B0aW9uX2FycmF5Lmxlbmd0aCB0LmVsdHMgdGhlbiByZXNpemUgdCAoMiAqICh0Lmxlbmd0aCArIDEpKTtcbiAgT3B0aW9uX2FycmF5LnNldF9zb21lIHQuZWx0cyB0Lmxlbmd0aCBhO1xuICB0Lmxlbmd0aCA8LSB0Lmxlbmd0aCArIDFcbjs7XG5cbmxldCBwb3Bfbm9uZW1wdHkgdCA9XG4gIGxldCBpID0gdC5sZW5ndGggLSAxIGluXG4gIGxldCByZXN1bHQgPSBPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIHQuZWx0cyBpIGluXG4gIE9wdGlvbl9hcnJheS5zZXRfbm9uZSB0LmVsdHMgaTtcbiAgdC5sZW5ndGggPC0gaTtcbiAgcmVzdWx0XG47O1xuXG5sZXQgcG9wX2Vycm9yID0gRXJyb3Iub2Zfc3RyaW5nIFwiU3RhY2sucG9wIG9mIGVtcHR5IHN0YWNrXCJcbmxldCBwb3AgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAocG9wX25vbmVtcHR5IHQpXG5sZXQgcG9wX2V4biB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIEVycm9yLnJhaXNlIHBvcF9lcnJvciBlbHNlIHBvcF9ub25lbXB0eSB0XG5sZXQgdG9wX25vbmVtcHR5IHQgPSBPcHRpb25fYXJyYXkuZ2V0X3NvbWVfZXhuIHQuZWx0cyAodC5sZW5ndGggLSAxKVxubGV0IHRvcF9lcnJvciA9IEVycm9yLm9mX3N0cmluZyBcIlN0YWNrLnRvcCBvZiBlbXB0eSBzdGFja1wiXG5sZXQgdG9wIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKHRvcF9ub25lbXB0eSB0KVxubGV0IHRvcF9leG4gdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBFcnJvci5yYWlzZSB0b3BfZXJyb3IgZWxzZSB0b3Bfbm9uZW1wdHkgdFxubGV0IGNvcHkgeyBsZW5ndGg7IGVsdHMgfSA9IHsgbGVuZ3RoOyBlbHRzID0gT3B0aW9uX2FycmF5LmNvcHkgZWx0cyB9XG5cbmxldCBjbGVhciB0ID1cbiAgaWYgdC5sZW5ndGggPiAwXG4gIHRoZW4gKFxuICAgIGZvciBpID0gMCB0byB0Lmxlbmd0aCAtIDEgZG9cbiAgICAgIE9wdGlvbl9hcnJheS5zZXRfbm9uZSB0LmVsdHMgaVxuICAgIGRvbmU7XG4gICAgdC5sZW5ndGggPC0gMClcbjs7XG5cbmxldCB1bnRpbF9lbXB0eSB0IGYgPVxuICBsZXQgcmVjIGxvb3AgKCkgPVxuICAgIGlmIHQubGVuZ3RoID4gMFxuICAgIHRoZW4gKFxuICAgICAgZiAocG9wX25vbmVtcHR5IHQpO1xuICAgICAgbG9vcCAoKSlcbiAgaW5cbiAgbG9vcCAoKVxuOztcblxubGV0IHNpbmdsZXRvbiB4ID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgcHVzaCB0IHg7XG4gIHRcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxuKCogVGhpcyBpcyBsaWZ0ZWQgb3V0IG9mIFtNXSBiZWNhdXNlIFtTb3VyY2VfY29kZV9wb3NpdGlvbjBdIGV4cG9ydHMgW1N0cmluZzBdXG4gICBhcyBbU3RyaW5nXSwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IGEgaGFzaCBmdW5jdGlvbi4gKilcbmxldCBoYXNoX292ZXJyaWRlIHsgQ2FtbC5MZXhpbmcucG9zX2ZuYW1lOyBwb3NfbG51bTsgcG9zX2JvbDsgcG9zX2NudW0gfSA9XG4gIFN0cmluZy5oYXNoIHBvc19mbmFtZVxuICBseG9yIEludC5oYXNoIHBvc19sbnVtXG4gIGx4b3IgSW50Lmhhc2ggcG9zX2JvbFxuICBseG9yIEludC5oYXNoIHBvc19jbnVtXG47O1xuXG5tb2R1bGUgTSA9IHN0cnVjdFxuICBpbmNsdWRlIFNvdXJjZV9jb2RlX3Bvc2l0aW9uMFxuXG4gIGxldCBoYXNoID0gaGFzaF9vdmVycmlkZVxuZW5kXG5cbmluY2x1ZGUgTVxuaW5jbHVkZSBDb21wYXJhYmxlLk1ha2VfdXNpbmdfY29tcGFyYXRvciAoTSlcblxubGV0IG9mX3BvcyAocG9zX2ZuYW1lLCBwb3NfbG51bSwgcG9zX2NudW0sIF8pID1cbiAgeyBwb3NfZm5hbWU7IHBvc19sbnVtOyBwb3NfY251bTsgcG9zX2JvbCA9IDAgfVxuOztcbiIsIm9wZW4hIEltcG9ydFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgTmVnXG4gICAgfCBaZXJvXG4gICAgfCBQb3NcbiAgICB8IE5hblxuICBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cCwgc2V4cF9ncmFtbWFyLCBjb21wYXJlLCBoYXNoLCBlbnVtZXJhdGVdXG5cbiAgbGV0IHRfb2Zfc2V4cCA9XG4gICAgKGxldCBlcnJvcl9zb3VyY2VfXzAwM18gPSBcInNpZ25fb3JfbmFuLm1sLlQudFwiIGluXG4gICAgIGZ1bmN0aW9uXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5lZ1wiIHwgXCJOZWdcIikgLT4gTmVnXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSAtPiBaZXJvXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInBvc1wiIHwgXCJQb3NcIikgLT4gUG9zXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5hblwiIHwgXCJOYW5cIikgLT4gTmFuXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibmVnXCIgfCBcIk5lZ1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSA6OiBfKSBhcyBzZXhwX18wMDRfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDA0X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInBvc1wiIHwgXCJQb3NcIikgOjogXykgYXMgc2V4cF9fMDA0XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDNfIHNleHBfXzAwNF9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJuYW5cIiB8IFwiTmFuXCIpIDo6IF8pIGFzIHNleHBfXzAwNF8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDRfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDJfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5lc3RlZF9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzAwMl8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwM18gc2V4cF9fMDAyX1xuICAgICB8IHNleHBfXzAwMl8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudW5leHBlY3RlZF9zdGFnIGVycm9yX3NvdXJjZV9fMDAzXyBzZXhwX18wMDJfXG4gICAgICAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgOztcblxuICBsZXQgc2V4cF9vZl90ID1cbiAgICAoZnVuY3Rpb25cbiAgICAgIHwgTmVnIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIk5lZ1wiXG4gICAgICB8IFplcm8gLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiWmVyb1wiXG4gICAgICB8IFBvcyAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJQb3NcIlxuICAgICAgfCBOYW4gLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTmFuXCJcbiAgICAgICAgICAgICAgIDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICB7IHVudHlwZWQgPVxuICAgICAgICBWYXJpYW50XG4gICAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICAgIDsgY2xhdXNlcyA9XG4gICAgICAgICAgICAgIFsgTm9fdGFnIHsgbmFtZSA9IFwiTmVnXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlplcm9cIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiUG9zXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIk5hblwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICB9XG4gIDs7XG5cbiAgbGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAoZnVuIGhzdiBhcmcgLT5cbiAgICAgICBtYXRjaCBhcmcgd2l0aFxuICAgICAgIHwgTmVnIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5mb2xkX2ludCBoc3YgMFxuICAgICAgIHwgWmVybyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDFcbiAgICAgICB8IFBvcyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDJcbiAgICAgICB8IE5hbiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guZm9sZF9pbnQgaHN2IDNcbiAgICAgICAgICAgICAgICA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgOztcblxuICBsZXQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgYXJnID1cbiAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5nZXRfaGFzaF92YWx1ZVxuICAgICAgICAobGV0IGhzdiA9IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5jcmVhdGUgKCkgaW5cbiAgICAgICAgIGhhc2hfZm9sZF90IGhzdiBhcmcpXG4gICAgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgYWxsID0gKFsgTmVnOyBaZXJvOyBQb3M7IE5hbiBdIDogdCBsaXN0KVxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IG9mX3N0cmluZyBzID0gdF9vZl9zZXhwIChzZXhwX29mX3N0cmluZyBzKVxuICBsZXQgdG9fc3RyaW5nIHQgPSBzdHJpbmdfb2Zfc2V4cCAoc2V4cF9vZl90IHQpXG4gIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5TaWduX29yX25hblwiXG5lbmRcblxubW9kdWxlIFJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSA9IHN0cnVjdFxuICBsZXQgKCA8ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPCApIHggeVxuICBsZXQgKCA8PSApICh4IDogVC50KSB5ID0gUG9seS4oIDw9ICkgeCB5XG4gIGxldCAoIDw+ICkgKHggOiBULnQpIHkgPSBQb2x5LiggPD4gKSB4IHlcbiAgbGV0ICggPSApICh4IDogVC50KSB5ID0gUG9seS4oID0gKSB4IHlcbiAgbGV0ICggPiApICh4IDogVC50KSB5ID0gUG9seS4oID4gKSB4IHlcbiAgbGV0ICggPj0gKSAoeCA6IFQudCkgeSA9IFBvbHkuKCA+PSApIHggeVxuICBsZXQgYXNjZW5kaW5nICh4IDogVC50KSB5ID0gUG9seS5hc2NlbmRpbmcgeCB5XG4gIGxldCBkZXNjZW5kaW5nICh4IDogVC50KSB5ID0gUG9seS5kZXNjZW5kaW5nIHggeVxuICBsZXQgY29tcGFyZSAoeCA6IFQudCkgeSA9IFBvbHkuY29tcGFyZSB4IHlcbiAgbGV0IGVxdWFsICh4IDogVC50KSB5ID0gUG9seS5lcXVhbCB4IHlcbiAgbGV0IG1heCAoeCA6IFQudCkgeSA9IGlmIHggPj0geSB0aGVuIHggZWxzZSB5XG4gIGxldCBtaW4gKHggOiBULnQpIHkgPSBpZiB4IDw9IHkgdGhlbiB4IGVsc2UgeVxuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBJZGVudGlmaWFibGUuTWFrZSAoVClcblxuKCogT3BlbiBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbnMgc28gdGhleSBkbyBub3RcbiAgIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXMgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvblxuICAgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgbW9kdWxlLiAqKVxub3BlbiEgUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBvZl9zaWduID0gZnVuY3Rpb25cbiAgfCBTaWduLk5lZyAtPiBOZWdcbiAgfCBTaWduLlplcm8gLT4gWmVyb1xuICB8IFNpZ24uUG9zIC0+IFBvc1xuOztcblxubGV0IHRvX3NpZ25fZXhuID0gZnVuY3Rpb25cbiAgfCBOZWcgLT4gU2lnbi5OZWdcbiAgfCBaZXJvIC0+IFNpZ24uWmVyb1xuICB8IFBvcyAtPiBTaWduLlBvc1xuICB8IE5hbiAtPiBpbnZhbGlkX2FyZyBcIkJhc2UuU2lnbl9vcl9uYW4udG9fc2lnbl9leG46IE5hblwiXG47O1xuXG5sZXQgb2ZfaW50IG4gPSBvZl9zaWduIChTaWduLm9mX2ludCBuKVxubGV0IHRvX2ludF9leG4gdCA9IFNpZ24udG9faW50ICh0b19zaWduX2V4biB0KVxuXG5sZXQgZmxpcCA9IGZ1bmN0aW9uXG4gIHwgTmVnIC0+IFBvc1xuICB8IFplcm8gLT4gWmVyb1xuICB8IFBvcyAtPiBOZWdcbiAgfCBOYW4gLT4gTmFuXG47O1xuXG5sZXQgKCAqICkgdCB0JyA9XG4gIG1hdGNoIHQsIHQnIHdpdGhcbiAgfCBOYW4sIF8gfCBfLCBOYW4gLT4gTmFuXG4gIHwgXyAtPiBvZl9zaWduIChTaWduLiggKiApICh0b19zaWduX2V4biB0KSAodG9fc2lnbl9leG4gdCcpKVxuOztcblxuKCogSW5jbHVkZSBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlciBhbnkgZnVuY3RvciBhcHBsaWNhdGlvbnMgdGhhdFxuICAgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxuXG50eXBlICdhIHQgPVxuICB8IEluY2wgb2YgJ2FcbiAgfCBFeGNsIG9mICdhXG4gIHwgVW5ib3VuZGVkXG5bQEBkZXJpdmluZ19pbmxpbmUgZW51bWVyYXRlLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbmxldCBhbGwgOiAnYS4gJ2EgbGlzdCAtPiAnYSB0IGxpc3QgPVxuICBmdW4gX2FsbF9vZl9hIC0+XG4gIFBweF9lbnVtZXJhdGVfbGliLkxpc3QuYXBwZW5kXG4gICAgKGxldCByZWMgbWFwIGwgYWNjID1cbiAgICAgICBtYXRjaCBsIHdpdGhcbiAgICAgICB8IFtdIC0+IFBweF9lbnVtZXJhdGVfbGliLkxpc3QucmV2IGFjY1xuICAgICAgIHwgZW51bWVyYXRlX18wMDFfIDo6IGwgLT4gbWFwIGwgKEluY2wgZW51bWVyYXRlX18wMDFfIDo6IGFjYylcbiAgICAgaW5cbiAgICAgbWFwIF9hbGxfb2ZfYSBbXSlcbiAgICAoUHB4X2VudW1lcmF0ZV9saWIuTGlzdC5hcHBlbmRcbiAgICAgICAobGV0IHJlYyBtYXAgbCBhY2MgPVxuICAgICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICAgIHwgW10gLT4gUHB4X2VudW1lcmF0ZV9saWIuTGlzdC5yZXYgYWNjXG4gICAgICAgICAgfCBlbnVtZXJhdGVfXzAwMl8gOjogbCAtPiBtYXAgbCAoRXhjbCBlbnVtZXJhdGVfXzAwMl8gOjogYWNjKVxuICAgICAgICBpblxuICAgICAgICBtYXAgX2FsbF9vZl9hIFtdKVxuICAgICAgIFsgVW5ib3VuZGVkIF0pXG47O1xuXG5sZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID1cbiAgZnVuICh0eXBlIGFfXzAxOF8pIDogKChTZXhwbGliMC5TZXhwLnQgLT4gYV9fMDE4XykgLT4gU2V4cGxpYjAuU2V4cC50IC0+IGFfXzAxOF8gdCkgLT5cbiAgbGV0IGVycm9yX3NvdXJjZV9fMDA2XyA9IFwibWF5YmVfYm91bmQubWwudFwiIGluXG4gIGZ1biBfb2ZfYV9fMDAzXyAtPiBmdW5jdGlvblxuICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgIChTZXhwbGliMC5TZXhwLkF0b20gKChcImluY2xcIiB8IFwiSW5jbFwiKSBhcyBfdGFnX18wMDlfKSA6OiBzZXhwX2FyZ3NfXzAxMF8pIGFzXG4gICAgICBfc2V4cF9fMDA4XyAtPlxuICAgICAgKG1hdGNoIHNleHBfYXJnc19fMDEwXyB3aXRoXG4gICAgICAgfCBbIGFyZzBfXzAxMV8gXSAtPlxuICAgICAgICAgbGV0IHJlczBfXzAxMl8gPSBfb2ZfYV9fMDAzXyBhcmcwX18wMTFfIGluXG4gICAgICAgICBJbmNsIHJlczBfXzAxMl9cbiAgICAgICB8IF8gLT5cbiAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgZXJyb3Jfc291cmNlX18wMDZfXG4gICAgICAgICAgIF90YWdfXzAwOV9cbiAgICAgICAgICAgX3NleHBfXzAwOF8pXG4gICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoKFwiZXhjbFwiIHwgXCJFeGNsXCIpIGFzIF90YWdfXzAxNF8pIDo6IHNleHBfYXJnc19fMDE1XykgYXNcbiAgICAgIF9zZXhwX18wMTNfIC0+XG4gICAgICAobWF0Y2ggc2V4cF9hcmdzX18wMTVfIHdpdGhcbiAgICAgICB8IFsgYXJnMF9fMDE2XyBdIC0+XG4gICAgICAgICBsZXQgcmVzMF9fMDE3XyA9IF9vZl9hX18wMDNfIGFyZzBfXzAxNl8gaW5cbiAgICAgICAgIEV4Y2wgcmVzMF9fMDE3X1xuICAgICAgIHwgXyAtPlxuICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfaW5jb3JyZWN0X25fYXJnc1xuICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzAwNl9cbiAgICAgICAgICAgX3RhZ19fMDE0X1xuICAgICAgICAgICBfc2V4cF9fMDEzXylcbiAgICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJ1bmJvdW5kZWRcIiB8IFwiVW5ib3VuZGVkXCIpIC0+IFVuYm91bmRlZFxuICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImluY2xcIiB8IFwiSW5jbFwiKSBhcyBzZXhwX18wMDdfIC0+XG4gICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiZXhjbFwiIHwgXCJFeGNsXCIpIGFzIHNleHBfXzAwN18gLT5cbiAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInVuYm91bmRlZFwiIHwgXCJVbmJvdW5kZWRcIikgOjogXykgYXNcbiAgICAgIHNleHBfXzAwN18gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMDVfIC0+XG4gICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbiAgICB8IFNleHBsaWIwLlNleHAuTGlzdCBbXSBhcyBzZXhwX18wMDVfIC0+XG4gICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuICAgIHwgc2V4cF9fMDA1XyAtPlxuICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnVuZXhwZWN0ZWRfc3RhZyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA1X1xuOztcblxubGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gIGZ1biAodHlwZSBhX18wMjRfKSA6ICgoYV9fMDI0XyAtPiBTZXhwbGliMC5TZXhwLnQpIC0+IGFfXzAyNF8gdCAtPiBTZXhwbGliMC5TZXhwLnQpIC0+XG4gIGZ1biBfb2ZfYV9fMDE5XyAtPiBmdW5jdGlvblxuICAgIHwgSW5jbCBhcmcwX18wMjBfIC0+XG4gICAgICBsZXQgcmVzMF9fMDIxXyA9IF9vZl9hX18wMTlfIGFyZzBfXzAyMF8gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIkluY2xcIjsgcmVzMF9fMDIxXyBdXG4gICAgfCBFeGNsIGFyZzBfXzAyMl8gLT5cbiAgICAgIGxldCByZXMwX18wMjNfID0gX29mX2FfXzAxOV8gYXJnMF9fMDIyXyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiRXhjbFwiOyByZXMwX18wMjNfIF1cbiAgICB8IFVuYm91bmRlZCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJVbmJvdW5kZWRcIlxuOztcblxubGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT5cbiAgeyB1bnR5cGVkID1cbiAgICAgIFZhcmlhbnRcbiAgICAgICAgeyBjYXNlX3NlbnNpdGl2aXR5ID0gQ2FzZV9zZW5zaXRpdmVfZXhjZXB0X2ZpcnN0X2NoYXJhY3RlclxuICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgWyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkluY2xcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOyBOb190YWdcbiAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkV4Y2xcIlxuICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZSB7IGFyZ3MgPSBDb25zIChfJ2Ffc2V4cF9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJVbmJvdW5kZWRcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH1cbiAgfVxuOztcblxuW0BAQGVuZF1cblxudHlwZSBpbnRlcnZhbF9jb21wYXJpc29uID1cbiAgfCBCZWxvd19sb3dlcl9ib3VuZFxuICB8IEluX3JhbmdlXG4gIHwgQWJvdmVfdXBwZXJfYm91bmRcbltAQGRlcml2aW5nX2lubGluZSBzZXhwLCBzZXhwX2dyYW1tYXIsIGNvbXBhcmUsIGhhc2hdXG5cbmxldCBpbnRlcnZhbF9jb21wYXJpc29uX29mX3NleHAgPVxuICAobGV0IGVycm9yX3NvdXJjZV9fMDI3XyA9IFwibWF5YmVfYm91bmQubWwuaW50ZXJ2YWxfY29tcGFyaXNvblwiIGluXG4gICBmdW5jdGlvblxuICAgfCBTZXhwbGliMC5TZXhwLkF0b20gKFwiYmVsb3dfbG93ZXJfYm91bmRcIiB8IFwiQmVsb3dfbG93ZXJfYm91bmRcIikgLT4gQmVsb3dfbG93ZXJfYm91bmRcbiAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImluX3JhbmdlXCIgfCBcIkluX3JhbmdlXCIpIC0+IEluX3JhbmdlXG4gICB8IFNleHBsaWIwLlNleHAuQXRvbSAoXCJhYm92ZV91cHBlcl9ib3VuZFwiIHwgXCJBYm92ZV91cHBlcl9ib3VuZFwiKSAtPiBBYm92ZV91cHBlcl9ib3VuZFxuICAgfCBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAoU2V4cGxpYjAuU2V4cC5BdG9tIChcImJlbG93X2xvd2VyX2JvdW5kXCIgfCBcIkJlbG93X2xvd2VyX2JvdW5kXCIpIDo6IF8pIGFzIHNleHBfXzAyOF9cbiAgICAgLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI4X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJpbl9yYW5nZVwiIHwgXCJJbl9yYW5nZVwiKSA6OiBfKSBhcyBzZXhwX18wMjhfXG4gICAgIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyOF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0XG4gICAgICAgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJhYm92ZV91cHBlcl9ib3VuZFwiIHwgXCJBYm92ZV91cHBlcl9ib3VuZFwiKSA6OiBfKSBhcyBzZXhwX18wMjhfXG4gICAgIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyOF9cbiAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkxpc3QgXyA6OiBfKSBhcyBzZXhwX18wMjZfIC0+XG4gICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5uZXN0ZWRfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI2X1xuICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDI2XyAtPlxuICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuZW1wdHlfbGlzdF9pbnZhbGlkX3N1bSBlcnJvcl9zb3VyY2VfXzAyN18gc2V4cF9fMDI2X1xuICAgfCBzZXhwX18wMjZfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMjdfIHNleHBfXzAyNl9cbiAgICAgICAgICAgICAgICAgICA6IFNleHBsaWIwLlNleHAudCAtPiBpbnRlcnZhbF9jb21wYXJpc29uKVxuOztcblxubGV0IHNleHBfb2ZfaW50ZXJ2YWxfY29tcGFyaXNvbiA9XG4gIChmdW5jdGlvblxuICAgIHwgQmVsb3dfbG93ZXJfYm91bmQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiQmVsb3dfbG93ZXJfYm91bmRcIlxuICAgIHwgSW5fcmFuZ2UgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiSW5fcmFuZ2VcIlxuICAgIHwgQWJvdmVfdXBwZXJfYm91bmQgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiQWJvdmVfdXBwZXJfYm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnRlcnZhbF9jb21wYXJpc29uIC0+IFNleHBsaWIwLlNleHAudClcbjs7XG5cbmxldCAoaW50ZXJ2YWxfY29tcGFyaXNvbl9zZXhwX2dyYW1tYXIgOiBpbnRlcnZhbF9jb21wYXJpc29uIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9XG4gIHsgdW50eXBlZCA9XG4gICAgICBWYXJpYW50XG4gICAgICAgIHsgY2FzZV9zZW5zaXRpdml0eSA9IENhc2Vfc2Vuc2l0aXZlX2V4Y2VwdF9maXJzdF9jaGFyYWN0ZXJcbiAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgIFsgTm9fdGFnIHsgbmFtZSA9IFwiQmVsb3dfbG93ZXJfYm91bmRcIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIkluX3JhbmdlXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJBYm92ZV91cHBlcl9ib3VuZFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuICB9XG47O1xuXG5sZXQgY29tcGFyZV9pbnRlcnZhbF9jb21wYXJpc29uID1cbiAgKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlXG4gICA6IGludGVydmFsX2NvbXBhcmlzb24gLT4gaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBpbnQpXG47O1xuXG5sZXQgKGhhc2hfZm9sZF9pbnRlcnZhbF9jb21wYXJpc29uIDpcbiAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gID1cbiAgKGZ1biBoc3YgYXJnIC0+XG4gICAgIG1hdGNoIGFyZyB3aXRoXG4gICAgIHwgQmVsb3dfbG93ZXJfYm91bmQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAwXG4gICAgIHwgSW5fcmFuZ2UgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAxXG4gICAgIHwgQWJvdmVfdXBwZXJfYm91bmQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmZvbGRfaW50IGhzdiAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gaW50ZXJ2YWxfY29tcGFyaXNvbiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG47O1xuXG5sZXQgKGhhc2hfaW50ZXJ2YWxfY29tcGFyaXNvbiA6IGludGVydmFsX2NvbXBhcmlzb24gLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgbGV0IGZ1bmMgYXJnID1cbiAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guZ2V0X2hhc2hfdmFsdWVcbiAgICAgIChsZXQgaHN2ID0gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmNyZWF0ZSAoKSBpblxuICAgICAgIGhhc2hfZm9sZF9pbnRlcnZhbF9jb21wYXJpc29uIGhzdiBhcmcpXG4gIGluXG4gIGZ1biB4IC0+IGZ1bmMgeFxuOztcblxuW0BAQGVuZF1cblxubGV0IG1hcCB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgSW5jbCBpbmNsIC0+IEluY2wgKGYgaW5jbClcbiAgfCBFeGNsIGV4Y2wgLT4gRXhjbCAoZiBleGNsKVxuICB8IFVuYm91bmRlZCAtPiBVbmJvdW5kZWRcbjs7XG5cbmxldCBpc19sb3dlcl9ib3VuZCB0IH5vZl86YSB+Y29tcGFyZSA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEluY2wgaW5jbCAtPiBjb21wYXJlIGluY2wgYSA8PSAwXG4gIHwgRXhjbCBleGNsIC0+IGNvbXBhcmUgZXhjbCBhIDwgMFxuICB8IFVuYm91bmRlZCAtPiB0cnVlXG47O1xuXG5sZXQgaXNfdXBwZXJfYm91bmQgdCB+b2ZfOmEgfmNvbXBhcmUgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBJbmNsIGluY2wgLT4gY29tcGFyZSBhIGluY2wgPD0gMFxuICB8IEV4Y2wgZXhjbCAtPiBjb21wYXJlIGEgZXhjbCA8IDBcbiAgfCBVbmJvdW5kZWQgLT4gdHJ1ZVxuOztcblxubGV0IGJvdW5kc19jcm9zc2VkIH5sb3dlciB+dXBwZXIgfmNvbXBhcmUgPVxuICBtYXRjaCBsb3dlciB3aXRoXG4gIHwgVW5ib3VuZGVkIC0+IGZhbHNlXG4gIHwgSW5jbCBsb3dlciB8IEV4Y2wgbG93ZXIgLT5cbiAgICAobWF0Y2ggdXBwZXIgd2l0aFxuICAgICB8IFVuYm91bmRlZCAtPiBmYWxzZVxuICAgICB8IEluY2wgdXBwZXIgfCBFeGNsIHVwcGVyIC0+IGNvbXBhcmUgbG93ZXIgdXBwZXIgPiAwKVxuOztcblxubGV0IGNoZWNrX2ludGVydmFsX2V4biB+bG93ZXIgfnVwcGVyIH5jb21wYXJlID1cbiAgaWYgYm91bmRzX2Nyb3NzZWQgfmxvd2VyIH51cHBlciB+Y29tcGFyZVxuICB0aGVuIGZhaWx3aXRoIFwiTWF5YmVfYm91bmQuY29tcGFyZV90b19pbnRlcnZhbF9leG46IGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIlxuOztcblxubGV0IGNvbXBhcmVfdG9faW50ZXJ2YWxfZXhuIH5sb3dlciB+dXBwZXIgYSB+Y29tcGFyZSA9XG4gIGNoZWNrX2ludGVydmFsX2V4biB+bG93ZXIgfnVwcGVyIH5jb21wYXJlO1xuICBpZiBub3QgKGlzX2xvd2VyX2JvdW5kIGxvd2VyIH5vZl86YSB+Y29tcGFyZSlcbiAgdGhlbiBCZWxvd19sb3dlcl9ib3VuZFxuICBlbHNlIGlmIG5vdCAoaXNfdXBwZXJfYm91bmQgdXBwZXIgfm9mXzphIH5jb21wYXJlKVxuICB0aGVuIEFib3ZlX3VwcGVyX2JvdW5kXG4gIGVsc2UgSW5fcmFuZ2Vcbjs7XG5cbmxldCBpbnRlcnZhbF9jb250YWluc19leG4gfmxvd2VyIH51cHBlciBhIH5jb21wYXJlID1cbiAgbWF0Y2ggY29tcGFyZV90b19pbnRlcnZhbF9leG4gfmxvd2VyIH51cHBlciBhIH5jb21wYXJlIHdpdGhcbiAgfCBJbl9yYW5nZSAtPiB0cnVlXG4gIHwgQmVsb3dfbG93ZXJfYm91bmQgfCBBYm92ZV91cHBlcl9ib3VuZCAtPiBmYWxzZVxuOztcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgVFxuXG5tb2R1bGUgT3JfZHVwbGljYXRlID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9XG4gICAgWyBgT2sgb2YgJ2FcbiAgICB8IGBEdXBsaWNhdGVcbiAgICBdXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID1cbiAgICBmdW4gX2NtcF9fYSBhX18wMDFfIGJfXzAwMl8gLT5cbiAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wMDFfIGJfXzAwMl9cbiAgICB0aGVuIDBcbiAgICBlbHNlIChcbiAgICAgIG1hdGNoIGFfXzAwMV8sIGJfXzAwMl8gd2l0aFxuICAgICAgfCBgT2sgX2xlZnRfXzAwM18sIGBPayBfcmlnaHRfXzAwNF8gLT4gX2NtcF9fYSBfbGVmdF9fMDAzXyBfcmlnaHRfXzAwNF9cbiAgICAgIHwgYER1cGxpY2F0ZSwgYER1cGxpY2F0ZSAtPiAwXG4gICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgeCB5KVxuICA7O1xuXG4gIGxldCBlcXVhbCA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGJvb2wgPVxuICAgIGZ1biBfY21wX19hIGFfXzAwNV8gYl9fMDA2XyAtPlxuICAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDA1XyBiX18wMDZfXG4gICAgICB0aGVuIHRydWVcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBhX18wMDVfLCBiX18wMDZfIHdpdGhcbiAgICAgICAgfCBgT2sgX2xlZnRfXzAwN18sIGBPayBfcmlnaHRfXzAwOF8gLT4gX2NtcF9fYSBfbGVmdF9fMDA3XyBfcmlnaHRfXzAwOF9cbiAgICAgICAgfCBgRHVwbGljYXRlLCBgRHVwbGljYXRlIC0+IHRydWVcbiAgICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19lcXVhbCB4IHkpXG4gIDs7XG5cbiAgbGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgZnVuIF9vZl9hX18wMDlfIC0+IGZ1bmN0aW9uXG4gICAgICB8IGBPayB2X18wMTBfIC0+IFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIk9rXCI7IF9vZl9hX18wMDlfIHZfXzAxMF8gXVxuICAgICAgfCBgRHVwbGljYXRlIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkR1cGxpY2F0ZVwiXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgV2l0aG91dF9jb21wYXJhdG9yID0gc3RydWN0XG4gIHR5cGUgKCdrZXksICdjbXAsICd6KSB0ID0gJ3pcbmVuZFxuXG5tb2R1bGUgV2l0aF9jb21wYXJhdG9yID0gc3RydWN0XG4gIHR5cGUgKCdrZXksICdjbXAsICd6KSB0ID0gY29tcGFyYXRvcjooJ2tleSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICd6XG5lbmRcblxubW9kdWxlIFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlID0gc3RydWN0XG4gIHR5cGUgKCdrZXksICdjbXAsICd6KSB0ID0gKCdrZXksICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ3pcbmVuZFxuXG5tb2R1bGUgU3ltbWV0cmljX2RpZmZfZWxlbWVudCA9IHN0cnVjdFxuICB0eXBlICgnaywgJ3YpIHQgPSAnayAqIFsgYExlZnQgb2YgJ3YgfCBgUmlnaHQgb2YgJ3YgfCBgVW5lcXVhbCBvZiAndiAqICd2IF1cbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgOlxuICAgICdrICd2LiAoJ2sgLT4gJ2sgLT4gaW50KSAtPiAoJ3YgLT4gJ3YgLT4gaW50KSAtPiAoJ2ssICd2KSB0IC0+ICgnaywgJ3YpIHQgLT4gaW50XG4gICAgPVxuICAgIGZ1biBfY21wX19rIF9jbXBfX3YgYV9fMDExXyBiX18wMTJfIC0+XG4gICAgbGV0IHRfXzAxM18sIHRfXzAxNF8gPSBhX18wMTFfIGluXG4gICAgbGV0IHRfXzAxNV8sIHRfXzAxNl8gPSBiX18wMTJfIGluXG4gICAgbWF0Y2ggX2NtcF9fayB0X18wMTNfIHRfXzAxNV8gd2l0aFxuICAgIHwgMCAtPlxuICAgICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgdF9fMDE0XyB0X18wMTZfXG4gICAgICB0aGVuIDBcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCB0X18wMTRfLCB0X18wMTZfIHdpdGhcbiAgICAgICAgfCBgTGVmdCBfbGVmdF9fMDE3XywgYExlZnQgX3JpZ2h0X18wMThfIC0+IF9jbXBfX3YgX2xlZnRfXzAxN18gX3JpZ2h0X18wMThfXG4gICAgICAgIHwgYFJpZ2h0IF9sZWZ0X18wMTlfLCBgUmlnaHQgX3JpZ2h0X18wMjBfIC0+IF9jbXBfX3YgX2xlZnRfXzAxOV8gX3JpZ2h0X18wMjBfXG4gICAgICAgIHwgYFVuZXF1YWwgX2xlZnRfXzAyMV8sIGBVbmVxdWFsIF9yaWdodF9fMDIyXyAtPlxuICAgICAgICAgIGxldCB0X18wMjNfLCB0X18wMjRfID0gX2xlZnRfXzAyMV8gaW5cbiAgICAgICAgICBsZXQgdF9fMDI1XywgdF9fMDI2XyA9IF9yaWdodF9fMDIyXyBpblxuICAgICAgICAgIChtYXRjaCBfY21wX192IHRfXzAyM18gdF9fMDI1XyB3aXRoXG4gICAgICAgICAgIHwgMCAtPiBfY21wX192IHRfXzAyNF8gdF9fMDI2X1xuICAgICAgICAgICB8IG4gLT4gbilcbiAgICAgICAgfCB4LCB5IC0+IFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19jb21wYXJlIHggeSlcbiAgICB8IG4gLT4gblxuICA7O1xuXG4gIGxldCBlcXVhbCA6XG4gICAgJ2sgJ3YuXG4gICAgKCdrIC0+ICdrIC0+IGJvb2wpIC0+ICgndiAtPiAndiAtPiBib29sKSAtPiAoJ2ssICd2KSB0IC0+ICgnaywgJ3YpIHQgLT4gYm9vbFxuICAgID1cbiAgICBmdW4gX2NtcF9fayBfY21wX192IGFfXzAyN18gYl9fMDI4XyAtPlxuICAgICAgbGV0IHRfXzAyOV8sIHRfXzAzMF8gPSBhX18wMjdfIGluXG4gICAgICBsZXQgdF9fMDMxXywgdF9fMDMyXyA9IGJfXzAyOF8gaW5cbiAgICAgIFBweF9jb21wYXJlX2xpYi4oICYmIClcbiAgICAgICAgKF9jbXBfX2sgdF9fMDI5XyB0X18wMzFfKVxuICAgICAgICAoaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgdF9fMDMwXyB0X18wMzJfXG4gICAgICAgICB0aGVuIHRydWVcbiAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICBtYXRjaCB0X18wMzBfLCB0X18wMzJfIHdpdGhcbiAgICAgICAgICAgfCBgTGVmdCBfbGVmdF9fMDMzXywgYExlZnQgX3JpZ2h0X18wMzRfIC0+IF9jbXBfX3YgX2xlZnRfXzAzM18gX3JpZ2h0X18wMzRfXG4gICAgICAgICAgIHwgYFJpZ2h0IF9sZWZ0X18wMzVfLCBgUmlnaHQgX3JpZ2h0X18wMzZfIC0+IF9jbXBfX3YgX2xlZnRfXzAzNV8gX3JpZ2h0X18wMzZfXG4gICAgICAgICAgIHwgYFVuZXF1YWwgX2xlZnRfXzAzN18sIGBVbmVxdWFsIF9yaWdodF9fMDM4XyAtPlxuICAgICAgICAgICAgIGxldCB0X18wMzlfLCB0X18wNDBfID0gX2xlZnRfXzAzN18gaW5cbiAgICAgICAgICAgICBsZXQgdF9fMDQxXywgdF9fMDQyXyA9IF9yaWdodF9fMDM4XyBpblxuICAgICAgICAgICAgIFBweF9jb21wYXJlX2xpYi4oICYmICkgKF9jbXBfX3YgdF9fMDM5XyB0X18wNDFfKSAoX2NtcF9fdiB0X18wNDBfIHRfXzA0Ml8pXG4gICAgICAgICAgIHwgeCwgeSAtPiBQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfZXF1YWwgeCB5KSlcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwIDpcbiAgICAnayAndi5cbiAgICAoU2V4cGxpYjAuU2V4cC50IC0+ICdrKVxuICAgIC0+IChTZXhwbGliMC5TZXhwLnQgLT4gJ3YpXG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgLT4gKCdrLCAndikgdFxuICAgID1cbiAgICBsZXQgZXJyb3Jfc291cmNlX18wNTdfID0gXCJtYXBfaW50Zi5tbC5TeW1tZXRyaWNfZGlmZl9lbGVtZW50LnRcIiBpblxuICAgIGZ1biBfb2Zfa19fMDQzXyBfb2Zfdl9fMDQ0XyAtPiBmdW5jdGlvblxuICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgWyBhcmcwX18wNjdfOyBhcmcxX18wNjhfIF0gLT5cbiAgICAgICAgbGV0IHJlczBfXzA2OV8gPSBfb2Zfa19fMDQzXyBhcmcwX18wNjdfXG4gICAgICAgIGFuZCByZXMxX18wNzBfID1cbiAgICAgICAgICBsZXQgc2V4cF9fMDY2XyA9IGFyZzFfXzA2OF8gaW5cbiAgICAgICAgICB0cnlcbiAgICAgICAgICAgIG1hdGNoIHNleHBfXzA2Nl8gd2l0aFxuICAgICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkF0b20gYXRvbV9fMDQ3XyBhcyBfc2V4cF9fMDQ5XyAtPlxuICAgICAgICAgICAgICAobWF0Y2ggYXRvbV9fMDQ3XyB3aXRoXG4gICAgICAgICAgICAgICB8IFwiTGVmdFwiIC0+XG4gICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX3Rha2VzX2FyZ3MgZXJyb3Jfc291cmNlX18wNTdfIF9zZXhwX18wNDlfXG4gICAgICAgICAgICAgICB8IFwiUmlnaHRcIiAtPlxuICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDU3XyBfc2V4cF9fMDQ5X1xuICAgICAgICAgICAgICAgfCBcIlVuZXF1YWxcIiAtPlxuICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ190YWtlc19hcmdzIGVycm9yX3NvdXJjZV9fMDU3XyBfc2V4cF9fMDQ5X1xuICAgICAgICAgICAgICAgfCBfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5ub192YXJpYW50X21hdGNoICgpKVxuICAgICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSBhdG9tX18wNDdfIDo6IHNleHBfYXJnc19fMDUwXykgYXNcbiAgICAgICAgICAgICAgX3NleHBfXzA0OV8gLT5cbiAgICAgICAgICAgICAgKG1hdGNoIGF0b21fXzA0N18gd2l0aFxuICAgICAgICAgICAgICAgfCBcIkxlZnRcIiBhcyBfdGFnX18wNjNfIC0+XG4gICAgICAgICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzA1MF8gd2l0aFxuICAgICAgICAgICAgICAgICAgfCBbIGFyZzBfXzA2NF8gXSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzMF9fMDY1XyA9IF9vZl92X18wNDRfIGFyZzBfXzA2NF8gaW5cbiAgICAgICAgICAgICAgICAgICAgYExlZnQgcmVzMF9fMDY1X1xuICAgICAgICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICAgICAgICBfdGFnX18wNjNfXG4gICAgICAgICAgICAgICAgICAgICAgX3NleHBfXzA0OV8pXG4gICAgICAgICAgICAgICB8IFwiUmlnaHRcIiBhcyBfdGFnX18wNjBfIC0+XG4gICAgICAgICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzA1MF8gd2l0aFxuICAgICAgICAgICAgICAgICAgfCBbIGFyZzBfXzA2MV8gXSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzMF9fMDYyXyA9IF9vZl92X18wNDRfIGFyZzBfXzA2MV8gaW5cbiAgICAgICAgICAgICAgICAgICAgYFJpZ2h0IHJlczBfXzA2Ml9cbiAgICAgICAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IucHRhZ19pbmNvcnJlY3Rfbl9hcmdzXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgICAgICAgICAgX3RhZ19fMDYwX1xuICAgICAgICAgICAgICAgICAgICAgIF9zZXhwX18wNDlfKVxuICAgICAgICAgICAgICAgfCBcIlVuZXF1YWxcIiBhcyBfdGFnX18wNTFfIC0+XG4gICAgICAgICAgICAgICAgIChtYXRjaCBzZXhwX2FyZ3NfXzA1MF8gd2l0aFxuICAgICAgICAgICAgICAgICAgfCBbIGFyZzBfXzA1OF8gXSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzMF9fMDU5XyA9XG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggYXJnMF9fMDU4XyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgWyBhcmcwX18wNTJfOyBhcmcxX18wNTNfIF0gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXMwX18wNTRfID0gX29mX3ZfXzA0NF8gYXJnMF9fMDUyX1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHJlczFfXzA1NV8gPSBfb2Zfdl9fMDQ0XyBhcmcxX18wNTNfIGluXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMwX18wNTRfLCByZXMxX18wNTVfXG4gICAgICAgICAgICAgICAgICAgICAgfCBzZXhwX18wNTZfIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IudHVwbGVfb2Zfc2l6ZV9uX2V4cGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNleHBfXzA1Nl9cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgYFVuZXF1YWwgcmVzMF9fMDU5X1xuICAgICAgICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5wdGFnX2luY29ycmVjdF9uX2FyZ3NcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9zb3VyY2VfXzA1N19cbiAgICAgICAgICAgICAgICAgICAgICBfdGFnX18wNTFfXG4gICAgICAgICAgICAgICAgICAgICAgX3NleHBfXzA0OV8pXG4gICAgICAgICAgICAgICB8IF8gLT4gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5vX3ZhcmlhbnRfbWF0Y2ggKCkpXG4gICAgICAgICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5MaXN0IF8gOjogXykgYXMgc2V4cF9fMDQ4XyAtPlxuICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9wb2x5X3ZhclxuICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgIHNleHBfXzA0OF9cbiAgICAgICAgICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IFtdIGFzIHNleHBfXzA0OF8gLT5cbiAgICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X2xpc3RfaW52YWxpZF9wb2x5X3ZhclxuICAgICAgICAgICAgICAgIGVycm9yX3NvdXJjZV9fMDU3X1xuICAgICAgICAgICAgICAgIHNleHBfXzA0OF9cbiAgICAgICAgICB3aXRoXG4gICAgICAgICAgfCBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IuTm9fdmFyaWFudF9tYXRjaCAtPlxuICAgICAgICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLm5vX21hdGNoaW5nX3ZhcmlhbnRfZm91bmRcbiAgICAgICAgICAgICAgZXJyb3Jfc291cmNlX18wNTdfXG4gICAgICAgICAgICAgIHNleHBfXzA2Nl9cbiAgICAgICAgaW5cbiAgICAgICAgcmVzMF9fMDY5XywgcmVzMV9fMDcwX1xuICAgICAgfCBzZXhwX18wNzFfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci50dXBsZV9vZl9zaXplX25fZXhwZWN0ZWQgZXJyb3Jfc291cmNlX18wNTdfIDIgc2V4cF9fMDcxX1xuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgOlxuICAgICdrICd2LlxuICAgICgnayAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgLT4gKCd2IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgLT4gU2V4cGxpYjAuU2V4cC50XG4gICAgPVxuICAgIGZ1biBfb2Zfa19fMDcyXyBfb2Zfdl9fMDczXyAoYXJnMF9fMDgxXywgYXJnMV9fMDgyXykgLT5cbiAgICAgIGxldCByZXMwX18wODNfID0gX29mX2tfXzA3Ml8gYXJnMF9fMDgxX1xuICAgICAgYW5kIHJlczFfXzA4NF8gPVxuICAgICAgICBtYXRjaCBhcmcxX18wODJfIHdpdGhcbiAgICAgICAgfCBgTGVmdCB2X18wNzRfIC0+XG4gICAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiTGVmdFwiOyBfb2Zfdl9fMDczXyB2X18wNzRfIF1cbiAgICAgICAgfCBgUmlnaHQgdl9fMDc1XyAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIlJpZ2h0XCI7IF9vZl92X18wNzNfIHZfXzA3NV8gXVxuICAgICAgICB8IGBVbmVxdWFsIHZfXzA3Nl8gLT5cbiAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3RcbiAgICAgICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiVW5lcXVhbFwiXG4gICAgICAgICAgICA7IChsZXQgYXJnMF9fMDc3XywgYXJnMV9fMDc4XyA9IHZfXzA3Nl8gaW5cbiAgICAgICAgICAgICAgIGxldCByZXMwX18wNzlfID0gX29mX3ZfXzA3M18gYXJnMF9fMDc3X1xuICAgICAgICAgICAgICAgYW5kIHJlczFfXzA4MF8gPSBfb2Zfdl9fMDczXyBhcmcxX18wNzhfIGluXG4gICAgICAgICAgICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyByZXMwX18wNzlfOyByZXMxX18wODBfIF0pXG4gICAgICAgICAgICBdXG4gICAgICBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgcmVzMF9fMDgzXzsgcmVzMV9fMDg0XyBdXG4gIDs7XG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6XG4gICAgICAgICAnayBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgIC0+ICd2IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAgLT4gKCdrLCAndikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICA9XG4gICAgZnVuIF8na19zZXhwX2dyYW1tYXIgXyd2X3NleHBfZ3JhbW1hciAtPlxuICAgICAgeyB1bnR5cGVkID1cbiAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAoQ29uc1xuICAgICAgICAgICAgICAgKCBfJ2tfc2V4cF9ncmFtbWFyLnVudHlwZWRcbiAgICAgICAgICAgICAgICwgQ29uc1xuICAgICAgICAgICAgICAgICAgICggVmFyaWFudFxuICAgICAgICAgICAgICAgICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICA7IGNsYXVzZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBOb190YWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWUgPSBcIkxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXJncyA9IENvbnMgKF8ndl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiUmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgY2xhdXNlX2tpbmQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0X2NsYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYXJncyA9IENvbnMgKF8ndl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICA7IE5vX3RhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZSA9IFwiVW5lcXVhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBjbGF1c2Vfa2luZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RfY2xhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhcmdzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggTGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ29uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIF8ndl9zZXhwX2dyYW1tYXIudW50eXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIENvbnMgKF8ndl9zZXhwX2dyYW1tYXIudW50eXBlZCwgRW1wdHkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBFbXB0eSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICwgRW1wdHkgKSApKVxuICAgICAgfVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIE1lcmdlX2VsZW1lbnQgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2xlZnQsICdyaWdodCkgdCA9XG4gICAgWyBgTGVmdCBvZiAnbGVmdFxuICAgIHwgYFJpZ2h0IG9mICdyaWdodFxuICAgIHwgYEJvdGggb2YgJ2xlZnQgKiAncmlnaHRcbiAgICBdXG4gIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA6XG4gICAgJ2xlZnQgJ3JpZ2h0LlxuICAgICgnbGVmdCAtPiAnbGVmdCAtPiBpbnQpXG4gICAgLT4gKCdyaWdodCAtPiAncmlnaHQgLT4gaW50KVxuICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAtPiBpbnRcbiAgICA9XG4gICAgZnVuIF9jbXBfX2xlZnQgX2NtcF9fcmlnaHQgYV9fMDg1XyBiX18wODZfIC0+XG4gICAgaWYgUHB4X2NvbXBhcmVfbGliLnBoeXNfZXF1YWwgYV9fMDg1XyBiX18wODZfXG4gICAgdGhlbiAwXG4gICAgZWxzZSAoXG4gICAgICBtYXRjaCBhX18wODVfLCBiX18wODZfIHdpdGhcbiAgICAgIHwgYExlZnQgX2xlZnRfXzA4N18sIGBMZWZ0IF9yaWdodF9fMDg4XyAtPiBfY21wX19sZWZ0IF9sZWZ0X18wODdfIF9yaWdodF9fMDg4X1xuICAgICAgfCBgUmlnaHQgX2xlZnRfXzA4OV8sIGBSaWdodCBfcmlnaHRfXzA5MF8gLT4gX2NtcF9fcmlnaHQgX2xlZnRfXzA4OV8gX3JpZ2h0X18wOTBfXG4gICAgICB8IGBCb3RoIF9sZWZ0X18wOTFfLCBgQm90aCBfcmlnaHRfXzA5Ml8gLT5cbiAgICAgICAgbGV0IHRfXzA5M18sIHRfXzA5NF8gPSBfbGVmdF9fMDkxXyBpblxuICAgICAgICBsZXQgdF9fMDk1XywgdF9fMDk2XyA9IF9yaWdodF9fMDkyXyBpblxuICAgICAgICAobWF0Y2ggX2NtcF9fbGVmdCB0X18wOTNfIHRfXzA5NV8gd2l0aFxuICAgICAgICAgfCAwIC0+IF9jbXBfX3JpZ2h0IHRfXzA5NF8gdF9fMDk2X1xuICAgICAgICAgfCBuIC0+IG4pXG4gICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgeCB5KVxuICA7O1xuXG4gIGxldCBlcXVhbCA6XG4gICAgJ2xlZnQgJ3JpZ2h0LlxuICAgICgnbGVmdCAtPiAnbGVmdCAtPiBib29sKVxuICAgIC0+ICgncmlnaHQgLT4gJ3JpZ2h0IC0+IGJvb2wpXG4gICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgIC0+IGJvb2xcbiAgICA9XG4gICAgZnVuIF9jbXBfX2xlZnQgX2NtcF9fcmlnaHQgYV9fMDk3XyBiX18wOThfIC0+XG4gICAgICBpZiBQcHhfY29tcGFyZV9saWIucGh5c19lcXVhbCBhX18wOTdfIGJfXzA5OF9cbiAgICAgIHRoZW4gdHJ1ZVxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIGFfXzA5N18sIGJfXzA5OF8gd2l0aFxuICAgICAgICB8IGBMZWZ0IF9sZWZ0X18wOTlfLCBgTGVmdCBfcmlnaHRfXzEwMF8gLT4gX2NtcF9fbGVmdCBfbGVmdF9fMDk5XyBfcmlnaHRfXzEwMF9cbiAgICAgICAgfCBgUmlnaHQgX2xlZnRfXzEwMV8sIGBSaWdodCBfcmlnaHRfXzEwMl8gLT4gX2NtcF9fcmlnaHQgX2xlZnRfXzEwMV8gX3JpZ2h0X18xMDJfXG4gICAgICAgIHwgYEJvdGggX2xlZnRfXzEwM18sIGBCb3RoIF9yaWdodF9fMTA0XyAtPlxuICAgICAgICAgIGxldCB0X18xMDVfLCB0X18xMDZfID0gX2xlZnRfXzEwM18gaW5cbiAgICAgICAgICBsZXQgdF9fMTA3XywgdF9fMTA4XyA9IF9yaWdodF9fMTA0XyBpblxuICAgICAgICAgIFBweF9jb21wYXJlX2xpYi4oICYmICkgKF9jbXBfX2xlZnQgdF9fMTA1XyB0X18xMDdfKSAoX2NtcF9fcmlnaHQgdF9fMTA2XyB0X18xMDhfKVxuICAgICAgICB8IHgsIHkgLT4gUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2VxdWFsIHggeSlcbiAgOztcblxuICBsZXQgc2V4cF9vZl90IDpcbiAgICAnbGVmdCAncmlnaHQuXG4gICAgKCdsZWZ0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ3JpZ2h0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgIC0+IFNleHBsaWIwLlNleHAudFxuICAgID1cbiAgICBmdW4gX29mX2xlZnRfXzEwOV8gX29mX3JpZ2h0X18xMTBfIC0+IGZ1bmN0aW9uXG4gICAgICB8IGBMZWZ0IHZfXzExMV8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiTGVmdFwiOyBfb2ZfbGVmdF9fMTA5XyB2X18xMTFfIF1cbiAgICAgIHwgYFJpZ2h0IHZfXzExMl8gLT5cbiAgICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiUmlnaHRcIjsgX29mX3JpZ2h0X18xMTBfIHZfXzExMl8gXVxuICAgICAgfCBgQm90aCB2X18xMTNfIC0+XG4gICAgICAgIFNleHBsaWIwLlNleHAuTGlzdFxuICAgICAgICAgIFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiQm90aFwiXG4gICAgICAgICAgOyAobGV0IGFyZzBfXzExNF8sIGFyZzFfXzExNV8gPSB2X18xMTNfIGluXG4gICAgICAgICAgICAgbGV0IHJlczBfXzExNl8gPSBfb2ZfbGVmdF9fMTA5XyBhcmcwX18xMTRfXG4gICAgICAgICAgICAgYW5kIHJlczFfXzExN18gPSBfb2ZfcmlnaHRfXzExMF8gYXJnMV9fMTE1XyBpblxuICAgICAgICAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIHJlczBfXzExNl87IHJlczFfXzExN18gXSlcbiAgICAgICAgICBdXG4gIDs7XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG4oKiogQGNhbm9uaWNhbCBCYXNlLk1hcC5Db250aW51ZV9vcl9zdG9wICopXG5tb2R1bGUgQ29udGludWVfb3Jfc3RvcCA9IHN0cnVjdFxuICB0eXBlIHQgPVxuICAgIHwgQ29udGludWVcbiAgICB8IFN0b3BcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVudW1lcmF0ZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgbGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuICBsZXQgYWxsID0gKFsgQ29udGludWU7IFN0b3AgXSA6IHQgbGlzdClcbiAgbGV0IGVxdWFsID0gKFBweF9jb21wYXJlX2xpYi5wb2x5bW9ycGhpY19lcXVhbCA6IHQgLT4gdCAtPiBib29sKVxuXG4gIGxldCBzZXhwX29mX3QgPVxuICAgIChmdW5jdGlvblxuICAgICAgfCBDb250aW51ZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJDb250aW51ZVwiXG4gICAgICB8IFN0b3AgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiU3RvcFwiXG4gICAgICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kXG5cbigqKiBAY2Fub25pY2FsIEJhc2UuTWFwLkZpbmlzaGVkX29yX3VuZmluaXNoZWQgKilcbm1vZHVsZSBGaW5pc2hlZF9vcl91bmZpbmlzaGVkID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBGaW5pc2hlZFxuICAgIHwgVW5maW5pc2hlZFxuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZW51bWVyYXRlLCBlcXVhbCwgc2V4cF9vZl1cblxuICBsZXQgY29tcGFyZSA9IChQcHhfY29tcGFyZV9saWIucG9seW1vcnBoaWNfY29tcGFyZSA6IHQgLT4gdCAtPiBpbnQpXG4gIGxldCBhbGwgPSAoWyBGaW5pc2hlZDsgVW5maW5pc2hlZCBdIDogdCBsaXN0KVxuICBsZXQgZXF1YWwgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2VxdWFsIDogdCAtPiB0IC0+IGJvb2wpXG5cbiAgbGV0IHNleHBfb2ZfdCA9XG4gICAgKGZ1bmN0aW9uXG4gICAgICB8IEZpbmlzaGVkIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIkZpbmlzaGVkXCJcbiAgICAgIHwgVW5maW5pc2hlZCAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJVbmZpbmlzaGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICA7O1xuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzX2dlbmVyaWMgPSBzaWdcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdHJlZVxuICB0eXBlICdhIGtleVxuICB0eXBlICdjbXAgY21wXG4gIHR5cGUgKCdhLCAnY21wLCAneikgb3B0aW9uc1xuXG4gIHZhbCBpbnZhcmlhbnRzIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+IGJvb2wpIG9wdGlvbnNcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogKF8sIF8sIF8pIHQgLT4gaW50XG5cbiAgdmFsIGFkZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZHVwbGljYXRlLnQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGFkZF9leG5cbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBzZXRcbiAgICA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBhZGRfbXVsdGlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4ga2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcmVtb3ZlX211bHRpXG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGZpbmRfbXVsdGkgOiAoJ2ssICdjbXAsICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiAnayBrZXkgLT4gJ3YgbGlzdCkgb3B0aW9uc1xuXG4gIHZhbCBjaGFuZ2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIGtleSAtPiBmOigndiBvcHRpb24gLT4gJ3Ygb3B0aW9uKSAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCB1cGRhdGVcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIGtleSAtPiBmOigndiBvcHRpb24gLT4gJ3YpIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZpbmQgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gJ2sga2V5IC0+ICd2IG9wdGlvbikgb3B0aW9uc1xuICB2YWwgZmluZF9leG4gOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gJ2sga2V5IC0+ICd2KSBvcHRpb25zXG4gIHZhbCByZW1vdmUgOiAoJ2ssICdjbXAsICgnaywgJ3YsICdjbXApIHQgLT4gJ2sga2V5IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG1lbSA6ICgnaywgJ2NtcCwgKCdrLCBfLCAnY21wKSB0IC0+ICdrIGtleSAtPiBib29sKSBvcHRpb25zXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2ssIF8sIF8pIHQgLT4gZjooJ2sga2V5IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgKCdrLCAndiwgXykgdFxuICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBDb250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gRmluaXNoZWRfb3JfdW5maW5pc2hlZC50XG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHRcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6KCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gdW5pdClcbiAgICAgIC0+IHVuaXQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG1hcCA6ICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KCd2MSAtPiAndjIpIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gIHZhbCBtYXBpIDogKCdrLCAndjEsICdjbXApIHQgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2MSAtPiAndjIpIC0+ICgnaywgJ3YyLCAnY21wKSB0XG4gIHZhbCBmb2xkIDogKCdrLCAndiwgXykgdCAtPiBpbml0OidhIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAnYSAtPiAnYSkgLT4gJ2FcblxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdhIC0+ICgnYSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2EgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdrLCAndiwgXykgdCAtPiBpbml0OidhIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAnYSAtPiAnYSkgLT4gJ2FcblxuICB2YWwgZm9sZDJcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAgIC0+IGluaXQ6J2FcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTooJ3YxLCAndjIpIE1lcmdlX2VsZW1lbnQudCAtPiAnYSAtPiAnYSlcbiAgICAgIC0+ICdhIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXJfa2V5c1xuICAgIDogKCdrLCAnY21wLCAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KCdrIGtleSAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGZpbHRlciA6ICgnaywgJ2NtcCwgKCdrLCAndiwgJ2NtcCkgdCAtPiBmOigndiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIGZpbHRlcmlcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXJfbWFwXG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KCd2MSAtPiAndjIgb3B0aW9uKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBmaWx0ZXJfbWFwaVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondjEgLT4gJ3YyIG9wdGlvbikgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAgIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBwYXJ0aXRpb25fbWFwaVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YxLCAnY21wKSB0XG4gICAgICAtPiBmOihrZXk6J2sga2V5IC0+IGRhdGE6J3YxIC0+ICgndjIsICd2MykgRWl0aGVyLnQpXG4gICAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdCAqICgnaywgJ3YzLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBwYXJ0aXRpb25fbWFwXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndjEsICdjbXApIHRcbiAgICAgIC0+IGY6KCd2MSAtPiAoJ3YyLCAndjMpIEVpdGhlci50KVxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHQgKiAoJ2ssICd2MywgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBib29sKVxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGNvbWJpbmVfZXJyb3JzXG4gICAgOiAoJ2ssICdjbXAsICgnaywgJ3YgT3JfZXJyb3IudCwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICB2YWwgY29tcGFyZV9kaXJlY3RcbiAgICA6ICgnaywgJ2NtcCwgKCd2IC0+ICd2IC0+IGludCkgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IC0+IGludCkgb3B0aW9uc1xuXG4gIHZhbCBlcXVhbFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgndiAtPiAndiAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0IC0+ICgnaywgJ3YsICdjbXApIHQgLT4gYm9vbCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwga2V5cyA6ICgnaywgXywgXykgdCAtPiAnayBrZXkgbGlzdFxuICB2YWwgZGF0YSA6IChfLCAndiwgXykgdCAtPiAndiBsaXN0XG5cbiAgdmFsIHRvX2FsaXN0XG4gICAgOiAgP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ICgnaywgJ3YsIF8pIHRcbiAgICAtPiAoJ2sga2V5ICogJ3YpIGxpc3RcblxuICB2YWwgbWVyZ2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAgIC0+IGY6KGtleTonayBrZXkgLT4gKCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gJ3YzIG9wdGlvbilcbiAgICAgIC0+ICgnaywgJ3YzLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBtZXJnZV9za2V3ZWRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBjb21iaW5lOihrZXk6J2sga2V5IC0+ICd2IC0+ICd2IC0+ICd2KVxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBkYXRhX2VxdWFsOigndiAtPiAndiAtPiBib29sKVxuICAgICAgLT4gKCdrIGtleSwgJ3YpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gZGF0YV9lcXVhbDooJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAgIC0+IGluaXQ6J2FcbiAgICAgIC0+IGY6KCdhIC0+ICgnayBrZXksICd2KSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2EpXG4gICAgICAtPiAnYSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbWluX2VsdCA6ICgnaywgJ3YsIF8pIHQgLT4gKCdrIGtleSAqICd2KSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdrLCAndiwgXykgdCAtPiAnayBrZXkgKiAndlxuICB2YWwgbWF4X2VsdCA6ICgnaywgJ3YsIF8pIHQgLT4gKCdrIGtleSAqICd2KSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdrLCAndiwgXykgdCAtPiAnayBrZXkgKiAndlxuICB2YWwgZm9yX2FsbCA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KCd2IC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBib29sKSAtPiBpbnRcblxuICB2YWwgc3BsaXRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiAnayBrZXlcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2sga2V5ICogJ3YpIG9wdGlvbiAqICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGFwcGVuZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsIGxvd2VyX3BhcnQ6KCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gdXBwZXJfcGFydDooJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXSApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBsb3dlcl9ib3VuZDonayBrZXkgTWF5YmVfYm91bmQudFxuICAgICAgLT4gdXBwZXJfYm91bmQ6J2sga2V5IE1heWJlX2JvdW5kLnRcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gbWluOidrIGtleVxuICAgICAgLT4gbWF4OidrIGtleVxuICAgICAgLT4gaW5pdDonYVxuICAgICAgLT4gZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+ICdhIC0+ICdhKVxuICAgICAgLT4gJ2EgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIHJhbmdlX3RvX2FsaXN0XG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdrLCAndiwgJ2NtcCkgdCAtPiBtaW46J2sga2V5IC0+IG1heDonayBrZXkgLT4gKCdrIGtleSAqICd2KSBsaXN0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAgIC0+ICdrIGtleVxuICAgICAgLT4gKCdrIGtleSAqICd2KSBvcHRpb24gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG50aCA6ICgnaywgJ3YsICdjbXApIHQgLT4gaW50IC0+ICgnayBrZXkgKiAndikgb3B0aW9uXG4gIHZhbCBudGhfZXhuIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBpbnQgLT4gJ2sga2V5ICogJ3ZcbiAgdmFsIHJhbmsgOiAoJ2ssICdjbXAsICgnaywgXywgJ2NtcCkgdCAtPiAnayBrZXkgLT4gaW50IG9wdGlvbikgb3B0aW9uc1xuICB2YWwgdG9fdHJlZSA6ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrIGtleSwgJ3YsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzonayBrZXlcbiAgICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86J2sga2V5XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAtPiBjb21wYXJlOihrZXk6J2sga2V5IC0+IGRhdGE6J3YgLT4gJ2tleSAtPiBpbnQpXG4gICAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAgIC0+ICdrZXlcbiAgICAgIC0+ICgnayBrZXkgKiAndikgb3B0aW9uIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IHNlZ21lbnRfb2Y6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgICAtPiAoJ2sga2V5ICogJ3YpIG9wdGlvbiApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnaywgJ3YsICdjbXApIHRcbiAgICAgIC0+IGNvbXBhcmU6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiAnYm91bmQgLT4gaW50KVxuICAgICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAgIC0+IHVwcGVyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczEgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2EgdHJlZVxuICB0eXBlIGtleVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBpbnZhcmlhbnRzIDogXyB0IC0+IGJvb2xcbiAgdmFsIGlzX2VtcHR5IDogXyB0IC0+IGJvb2xcbiAgdmFsIGxlbmd0aCA6IF8gdCAtPiBpbnRcbiAgdmFsIGFkZCA6ICdhIHQgLT4ga2V5OmtleSAtPiBkYXRhOidhIC0+ICdhIHQgT3JfZHVwbGljYXRlLnRcbiAgdmFsIGFkZF9leG4gOiAnYSB0IC0+IGtleTprZXkgLT4gZGF0YTonYSAtPiAnYSB0XG4gIHZhbCBzZXQgOiAnYSB0IC0+IGtleTprZXkgLT4gZGF0YTonYSAtPiAnYSB0XG4gIHZhbCBhZGRfbXVsdGkgOiAnYSBsaXN0IHQgLT4ga2V5OmtleSAtPiBkYXRhOidhIC0+ICdhIGxpc3QgdFxuICB2YWwgcmVtb3ZlX211bHRpIDogJ2EgbGlzdCB0IC0+IGtleSAtPiAnYSBsaXN0IHRcbiAgdmFsIGZpbmRfbXVsdGkgOiAnYSBsaXN0IHQgLT4ga2V5IC0+ICdhIGxpc3RcbiAgdmFsIGNoYW5nZSA6ICdhIHQgLT4ga2V5IC0+IGY6KCdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIC0+ICdhIHRcbiAgdmFsIHVwZGF0ZSA6ICdhIHQgLT4ga2V5IC0+IGY6KCdhIG9wdGlvbiAtPiAnYSkgLT4gJ2EgdFxuICB2YWwgZmluZCA6ICdhIHQgLT4ga2V5IC0+ICdhIG9wdGlvblxuICB2YWwgZmluZF9leG4gOiAnYSB0IC0+IGtleSAtPiAnYVxuICB2YWwgcmVtb3ZlIDogJ2EgdCAtPiBrZXkgLT4gJ2EgdFxuICB2YWwgbWVtIDogXyB0IC0+IGtleSAtPiBib29sXG4gIHZhbCBpdGVyX2tleXMgOiBfIHQgLT4gZjooa2V5IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAnYSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBpdGVyaV91bnRpbFxuICAgIDogICdhIHRcbiAgICAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gIHZhbCBpdGVyMiA6ICdhIHQgLT4gJ2IgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6KCdhLCAnYikgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIG1hcCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICdiIHRcbiAgdmFsIG1hcGkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYikgLT4gJ2IgdFxuICB2YWwgZm9sZCA6ICdhIHQgLT4gaW5pdDonYiAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAnYSB0XG4gICAgLT4gaW5pdDonYWNjXG4gICAgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdhY2MgLT4gKCdhY2MsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdhY2MgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogJ2EgdCAtPiBpbml0OidiIC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgZm9sZDJcbiAgICA6ICAnYSB0XG4gICAgLT4gJ2IgdFxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOihrZXk6a2V5IC0+IGRhdGE6KCdhLCAnYikgTWVyZ2VfZWxlbWVudC50IC0+ICdjIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIGZpbHRlcl9rZXlzIDogJ2EgdCAtPiBmOihrZXkgLT4gYm9vbCkgLT4gJ2EgdFxuICB2YWwgZmlsdGVyIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSB0XG4gIHZhbCBmaWx0ZXJpIDogJ2EgdCAtPiBmOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gYm9vbCkgLT4gJ2EgdFxuICB2YWwgZmlsdGVyX21hcCA6ICdhIHQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAnYiB0XG4gIHZhbCBmaWx0ZXJfbWFwaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdiIG9wdGlvbikgLT4gJ2IgdFxuICB2YWwgcGFydGl0aW9uX21hcGkgOiAnYSB0IC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAoJ2IsICdjKSBFaXRoZXIudCkgLT4gJ2IgdCAqICdjIHRcbiAgdmFsIHBhcnRpdGlvbl9tYXAgOiAnYSB0IC0+IGY6KCdhIC0+ICgnYiwgJ2MpIEVpdGhlci50KSAtPiAnYiB0ICogJ2MgdFxuICB2YWwgcGFydGl0aW9uaV90ZiA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IGJvb2wpIC0+ICdhIHQgKiAnYSB0XG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAnYSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIHQgKiAnYSB0XG4gIHZhbCBjb21iaW5lX2Vycm9ycyA6ICdhIE9yX2Vycm9yLnQgdCAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGludFxuICB2YWwgZXF1YWwgOiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiAnYSB0IC0+IGJvb2xcbiAgdmFsIGtleXMgOiBfIHQgLT4ga2V5IGxpc3RcbiAgdmFsIGRhdGEgOiAnYSB0IC0+ICdhIGxpc3RcbiAgdmFsIHRvX2FsaXN0IDogP2tleV9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXSAtPiAnYSB0IC0+IChrZXkgKiAnYSkgbGlzdFxuICB2YWwgbWVyZ2UgOiAnYSB0IC0+ICdiIHQgLT4gZjooa2V5OmtleSAtPiAoJ2EsICdiKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2Mgb3B0aW9uKSAtPiAnYyB0XG4gIHZhbCBtZXJnZV9za2V3ZWQgOiAndiB0IC0+ICd2IHQgLT4gY29tYmluZTooa2V5OmtleSAtPiAndiAtPiAndiAtPiAndikgLT4gJ3YgdFxuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogICdhIHRcbiAgICAtPiAnYSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2EgLT4gJ2EgLT4gYm9vbClcbiAgICAtPiAoa2V5LCAnYSkgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogICdhIHRcbiAgICAtPiAnYSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2EgLT4gJ2EgLT4gYm9vbClcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gKGtleSwgJ2EpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBtaW5fZWx0IDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAnYSB0IC0+IGtleSAqICdhXG4gIHZhbCBtYXhfZWx0IDogJ2EgdCAtPiAoa2V5ICogJ2EpIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAnYSB0IC0+IGtleSAqICdhXG4gIHZhbCBmb3JfYWxsIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICdhIHQgLT4gZjooa2V5OmtleSAtPiBkYXRhOidhIC0+IGJvb2wpIC0+IGludFxuICB2YWwgc3BsaXQgOiAnYSB0IC0+IGtleSAtPiAnYSB0ICogKGtleSAqICdhKSBvcHRpb24gKiAnYSB0XG5cbiAgdmFsIGFwcGVuZFxuICAgIDogIGxvd2VyX3BhcnQ6J2EgdFxuICAgIC0+IHVwcGVyX3BhcnQ6J2EgdFxuICAgIC0+IFsgYE9rIG9mICdhIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdXG5cbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAgJ2EgdFxuICAgIC0+IGxvd2VyX2JvdW5kOmtleSBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6a2V5IE1heWJlX2JvdW5kLnRcbiAgICAtPiAnYSB0XG5cbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAgJ2EgdFxuICAgIC0+IG1pbjprZXlcbiAgICAtPiBtYXg6a2V5XG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KGtleTprZXkgLT4gZGF0YTonYSAtPiAnYiAtPiAnYilcbiAgICAtPiAnYlxuXG4gIHZhbCByYW5nZV90b19hbGlzdCA6ICdhIHQgLT4gbWluOmtleSAtPiBtYXg6a2V5IC0+IChrZXkgKiAnYSkgbGlzdFxuXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogICdhIHRcbiAgICAtPiBbIGBHcmVhdGVyX29yX2VxdWFsX3RvIHwgYEdyZWF0ZXJfdGhhbiB8IGBMZXNzX29yX2VxdWFsX3RvIHwgYExlc3NfdGhhbiBdXG4gICAgLT4ga2V5XG4gICAgLT4gKGtleSAqICdhKSBvcHRpb25cblxuICB2YWwgbnRoIDogJ2EgdCAtPiBpbnQgLT4gKGtleSAqICdhKSBvcHRpb25cbiAgdmFsIG50aF9leG4gOiAnYSB0IC0+IGludCAtPiBrZXkgKiAnYVxuICB2YWwgcmFuayA6IF8gdCAtPiBrZXkgLT4gaW50IG9wdGlvblxuICB2YWwgdG9fdHJlZSA6ICdhIHQgLT4gJ2EgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzprZXlcbiAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOmtleVxuICAgIC0+ICdhIHRcbiAgICAtPiAoa2V5ICogJ2EpIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICdhIHRcbiAgICAtPiBjb21wYXJlOihrZXk6a2V5IC0+IGRhdGE6J2EgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+IChrZXkgKiAnYSkgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgJ2EgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGtleTprZXkgLT4gZGF0YTonYSAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+IChrZXkgKiAnYSkgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc3VicmFuZ2VcbiAgICA6ICAnYSB0XG4gICAgLT4gY29tcGFyZTooa2V5OmtleSAtPiBkYXRhOidhIC0+ICdib3VuZCAtPiBpbnQpXG4gICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+ICdhIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMyID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICgnYSwgJ2IpIHRyZWVcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgaW52YXJpYW50cyA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogKF8sIF8pIHQgLT4gaW50XG4gIHZhbCBhZGQgOiAoJ2EsICdiKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IpIHQgT3JfZHVwbGljYXRlLnRcbiAgdmFsIGFkZF9leG4gOiAoJ2EsICdiKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIHNldCA6ICgnYSwgJ2IpIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYikgdFxuICB2YWwgYWRkX211bHRpIDogKCdhLCAnYiBsaXN0KSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IgbGlzdCkgdFxuICB2YWwgcmVtb3ZlX211bHRpIDogKCdhLCAnYiBsaXN0KSB0IC0+ICdhIC0+ICgnYSwgJ2IgbGlzdCkgdFxuICB2YWwgZmluZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCkgdCAtPiAnYSAtPiAnYiBsaXN0XG4gIHZhbCBjaGFuZ2UgOiAoJ2EsICdiKSB0IC0+ICdhIC0+IGY6KCdiIG9wdGlvbiAtPiAnYiBvcHRpb24pIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIHVwZGF0ZSA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gZjooJ2Igb3B0aW9uIC0+ICdiKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaW5kIDogKCdhLCAnYikgdCAtPiAnYSAtPiAnYiBvcHRpb25cbiAgdmFsIGZpbmRfZXhuIDogKCdhLCAnYikgdCAtPiAnYSAtPiAnYlxuICB2YWwgcmVtb3ZlIDogKCdhLCAnYikgdCAtPiAnYSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBtZW0gOiAoJ2EsICdiKSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGl0ZXJfa2V5cyA6ICgnYSwgXykgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICB2YWwgaXRlcjJcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gKCdhLCAnYykgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAnYykgLT4gKCdhLCAnYykgdFxuICB2YWwgbWFwaSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MpIC0+ICgnYSwgJ2MpIHRcbiAgdmFsIGZvbGQgOiAoJ2EsICdiKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2ssICd2KSB0XG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICgnYSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2EgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCAnYikgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkMlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EsICdjKSB0XG4gICAgLT4gaW5pdDonZFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCAtPiAnZClcbiAgICAtPiAnZFxuXG4gIHZhbCBmaWx0ZXJfa2V5cyA6ICgnYSwgJ2IpIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnYikgdFxuICB2YWwgZmlsdGVyIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaWx0ZXJpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiAnYyBvcHRpb24pIC0+ICgnYSwgJ2MpIHRcbiAgdmFsIGZpbHRlcl9tYXBpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAnYyBvcHRpb24pIC0+ICgnYSwgJ2MpIHRcblxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYykgdCAqICgnYSwgJ2QpIHRcblxuICB2YWwgcGFydGl0aW9uX21hcCA6ICgnYSwgJ2IpIHQgLT4gZjooJ2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpIC0+ICgnYSwgJ2MpIHQgKiAoJ2EsICdkKSB0XG5cbiAgdmFsIHBhcnRpdGlvbmlfdGZcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiKSB0ICogKCdhLCAnYikgdFxuXG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHQgKiAoJ2EsICdiKSB0XG4gIHZhbCBjb21iaW5lX2Vycm9ycyA6ICgnYSwgJ2IgT3JfZXJyb3IudCkgdCAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdiIC0+ICdiIC0+IGludCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGludFxuICB2YWwgZXF1YWwgOiAoJ2IgLT4gJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGJvb2xcbiAgdmFsIGtleXMgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgZGF0YSA6IChfLCAnYikgdCAtPiAnYiBsaXN0XG4gIHZhbCB0b19hbGlzdCA6ID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF0gLT4gKCdhLCAnYikgdCAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBtZXJnZVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EsICdjKSB0XG4gICAgLT4gZjooa2V5OidhIC0+ICgnYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCBvcHRpb24pXG4gICAgLT4gKCdhLCAnZCkgdFxuXG4gIHZhbCBtZXJnZV9za2V3ZWRcbiAgICA6ICAoJ2ssICd2KSB0XG4gICAgLT4gKCdrLCAndikgdFxuICAgIC0+IGNvbWJpbmU6KGtleTonayAtPiAndiAtPiAndiAtPiAndilcbiAgICAtPiAoJ2ssICd2KSB0XG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5cbiAgdmFsIGZvbGRfc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gKCdhLCAnYikgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBtaW5fZWx0IDogKCdhLCAnYikgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgJ2IpIHQgLT4gJ2EgKiAnYlxuICB2YWwgbWF4X2VsdCA6ICgnYSwgJ2IpIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsICdiKSB0IC0+ICdhICogJ2JcbiAgdmFsIGZvcl9hbGwgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0cyA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBzcGxpdCA6ICgnYSwgJ2IpIHQgLT4gJ2EgLT4gKCdhLCAnYikgdCAqICgnYSAqICdiKSBvcHRpb24gKiAoJ2EsICdiKSB0XG5cbiAgdmFsIGFwcGVuZFxuICAgIDogIGxvd2VyX3BhcnQ6KCdhLCAnYikgdFxuICAgIC0+IHVwcGVyX3BhcnQ6KCdhLCAnYikgdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyBdXG5cbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGxvd2VyX2JvdW5kOidhIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYSBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdhLCAnYikgdFxuXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiBtaW46J2FcbiAgICAtPiBtYXg6J2FcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgcmFuZ2VfdG9fYWxpc3QgOiAoJ2EsICdiKSB0IC0+IG1pbjonYSAtPiBtYXg6J2EgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgIC0+ICdhXG4gICAgLT4gKCdhICogJ2IpIG9wdGlvblxuXG4gIHZhbCBudGggOiAoJ2EsICdiKSB0IC0+IGludCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBudGhfZXhuIDogKCdhLCAnYikgdCAtPiBpbnQgLT4gJ2EgKiAnYlxuICB2YWwgcmFuayA6ICgnYSwgXykgdCAtPiAnYSAtPiBpbnQgb3B0aW9uXG4gIHZhbCB0b190cmVlIDogKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmdfa2V5IHwgYERlY3JlYXNpbmdfa2V5IF1cbiAgICAtPiA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2tleXNfbGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2IpIHRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgKCdrLCAndikgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAoJ2sgKiAndikgb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgKCdrLCAndikgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGtleTonayAtPiBkYXRhOid2IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAgKCdrLCAndikgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdib3VuZCAtPiBpbnQpXG4gICAgLT4gbG93ZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYm91bmQgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMzID0gc2lnXG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdFxuICB0eXBlICgnYSwgJ2IsICdjbXApIHRyZWVcblxuICB2YWwgaW52YXJpYW50cyA6IChfLCBfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIGlzX2VtcHR5IDogKF8sIF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgbGVuZ3RoIDogKF8sIF8sIF8pIHQgLT4gaW50XG4gIHZhbCBhZGQgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZHVwbGljYXRlLnRcbiAgdmFsIGFkZF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIHNldCA6ICgnYSwgJ2IsICdjbXApIHQgLT4ga2V5OidhIC0+IGRhdGE6J2IgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgYWRkX211bHRpIDogKCdhLCAnYiBsaXN0LCAnY21wKSB0IC0+IGtleTonYSAtPiBkYXRhOidiIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuICB2YWwgcmVtb3ZlX211bHRpIDogKCdhLCAnYiBsaXN0LCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuICB2YWwgZmluZF9tdWx0aSA6ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdCAtPiAnYSAtPiAnYiBsaXN0XG4gIHZhbCBjaGFuZ2UgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+IGY6KCdiIG9wdGlvbiAtPiAnYiBvcHRpb24pIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgdmFsIHVwZGF0ZSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gZjooJ2Igb3B0aW9uIC0+ICdiKSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBmaW5kIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiAnYiBvcHRpb25cbiAgdmFsIGZpbmRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiAnYlxuICB2YWwgcmVtb3ZlIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBtZW0gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGl0ZXJfa2V5cyA6ICgnYSwgXywgJ2NtcCkgdCAtPiBmOignYSAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0XG5cbiAgdmFsIGl0ZXJpX3VudGlsXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IENvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLnRcblxuICB2YWwgaXRlcjJcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgbWFwIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiAnYykgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICB2YWwgbWFwaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MpIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgdmFsIGZvbGQgOiAoJ2EsICdiLCBfKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICgnYSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2EgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCAnYiwgXykgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkMlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gaW5pdDonZFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCAtPiAnZClcbiAgICAtPiAnZFxuXG4gIHZhbCBmaWx0ZXJfa2V5cyA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICB2YWwgZmlsdGVyIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiBib29sKSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBmaWx0ZXJpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiAoJ2EsICdiLCAnY21wKSB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiAnYyBvcHRpb24pIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgZmlsdGVyX21hcGlcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2Mgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gKCdjLCAnZCkgRWl0aGVyLnQpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdCAqICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX21hcFxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0ICogKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCAqICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCAqICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgY29tYmluZV9lcnJvcnMgOiAoJ2EsICdiIE9yX2Vycm9yLnQsICdjbXApIHQgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYiAtPiAnYiAtPiBpbnQpIC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogKCdiIC0+ICdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBrZXlzIDogKCdhLCBfLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIGRhdGEgOiAoXywgJ2IsIF8pIHQgLT4gJ2IgbGlzdFxuXG4gIHZhbCB0b19hbGlzdFxuICAgIDogID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiAoJ2EsICdiLCBfKSB0XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcblxuICB2YWwgbWVyZ2VcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiAoJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2Qgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2QsICdjbXApIHRcblxuICB2YWwgbWVyZ2Vfc2tld2VkXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21iaW5lOihrZXk6J2sgLT4gJ3YgLT4gJ3YgLT4gJ3YpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgU2VxdWVuY2UudFxuXG4gIHZhbCBmb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgOiAgKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBkYXRhX2VxdWFsOignYiAtPiAnYiAtPiBib29sKVxuICAgIC0+IGluaXQ6J2NcbiAgICAtPiBmOignYyAtPiAoJ2EsICdiKSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50LnQgLT4gJ2MpXG4gICAgLT4gJ2NcblxuICB2YWwgbWluX2VsdCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhICogJ2JcbiAgdmFsIG1heF9lbHQgOiAoJ2EsICdiLCAnY21wKSB0IC0+ICgnYSAqICdiKSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAqICdiXG4gIHZhbCBmb3JfYWxsIDogKF8sICdiLCBfKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdhLCAnYiwgXykgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoXywgJ2IsIF8pIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzaSA6ICgnYSwgJ2IsIF8pIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgY291bnQgOiAoXywgJ2IsIF8pIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAoJ2EsICdiLCBfKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGludFxuXG4gIHZhbCBzcGxpdFxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAna1xuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2sgKiAndikgb3B0aW9uICogKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBhcHBlbmRcbiAgICA6ICBsb3dlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAtPiB1cHBlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXVxuXG4gIHZhbCBzdWJyYW5nZVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBsb3dlcl9ib3VuZDonayBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2sgTWF5YmVfYm91bmQudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICB2YWwgZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICA6ICAoJ2EsICdiLCBfKSB0XG4gICAgLT4gbWluOidhXG4gICAgLT4gbWF4OidhXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIHJhbmdlX3RvX2FsaXN0IDogKCdhLCAnYiwgXykgdCAtPiBtaW46J2EgLT4gbWF4OidhIC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIGNsb3Nlc3Rfa2V5XG4gICAgOiAgKCdhLCAnYiwgXykgdFxuICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAtPiAnYVxuICAgIC0+ICgnYSAqICdiKSBvcHRpb25cblxuICB2YWwgbnRoIDogKCdhLCAnYiwgXykgdCAtPiBpbnQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbnRoX2V4biA6ICgnYSwgJ2IsIF8pIHQgLT4gaW50IC0+ICdhICogJ2JcbiAgdmFsIHJhbmsgOiAoJ2EsIF8sIF8pIHQgLT4gJ2EgLT4gaW50IG9wdGlvblxuICB2YWwgdG9fdHJlZSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhLCAnYiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdiLCBfKSB0XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBzZWdtZW50X29mOihrZXk6J2sgLT4gZGF0YTondiAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYm91bmQgLT4gaW50KVxuICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IgPSBzaWdcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnYiwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBpbnZhcmlhbnRzIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdiLCAnY21wKSB0IC0+IGJvb2xcbiAgdmFsIGlzX2VtcHR5IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBsZW5ndGggOiAoJ2EsICdiLCAnY21wKSB0IC0+IGludFxuXG4gIHZhbCBhZGRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGtleTonYVxuICAgIC0+IGRhdGE6J2JcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2R1cGxpY2F0ZS50XG5cbiAgdmFsIGFkZF9leG5cbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGtleTonYVxuICAgIC0+IGRhdGE6J2JcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIHNldFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4ga2V5OidhXG4gICAgLT4gZGF0YTonYlxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgYWRkX211bHRpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuICAgIC0+IGtleTonYVxuICAgIC0+IGRhdGE6J2JcbiAgICAtPiAoJ2EsICdiIGxpc3QsICdjbXApIHRcblxuICB2YWwgcmVtb3ZlX211bHRpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgdmFsIGZpbmRfbXVsdGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiAnYiBsaXN0XG5cbiAgdmFsIGNoYW5nZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gJ2FcbiAgICAtPiBmOignYiBvcHRpb24gLT4gJ2Igb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgdXBkYXRlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+IGY6KCdiIG9wdGlvbiAtPiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIGZpbmQgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gJ2Igb3B0aW9uXG4gIHZhbCBmaW5kX2V4biA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiAnYlxuXG4gIHZhbCByZW1vdmVcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBtZW0gOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgaXRlcl9rZXlzIDogKCdhLCBfLCAnY21wKSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ2IsICdjbXApIHQgLT4gZjooJ2IgLT4gdW5pdCkgLT4gdW5pdFxuICB2YWwgaXRlcmkgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXRcblxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gIHZhbCBpdGVyMlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOignYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgbWFwIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiAnYykgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICB2YWwgbWFwaSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MpIC0+ICgnYSwgJ2MsICdjbXApIHRcbiAgdmFsIGZvbGQgOiAoJ2EsICdiLCBfKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gJ2MgLT4gJ2MpIC0+ICdjXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gaW5pdDonYVxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+ICdhIC0+ICgnYSwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2EgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCAnYiwgXykgdCAtPiBpbml0OidjIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBmb2xkMlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuICAgIC0+IGluaXQ6J2RcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTooJ2IsICdjKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2QgLT4gJ2QpXG4gICAgLT4gJ2RcblxuICB2YWwgZmlsdGVyX2tleXNcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdhIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KCdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICB2YWwgZmlsdGVyX21hcFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gJ2Mgb3B0aW9uKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICB2YWwgZmlsdGVyX21hcGlcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIG9wdGlvbilcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl9tYXBpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0ICogKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25fbWFwXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOignYiAtPiAoJ2MsICdkKSBFaXRoZXIudClcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0ICogKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgKiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIHBhcnRpdGlvbl90ZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gZjooJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0ICogKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBjb21iaW5lX2Vycm9yc1xuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiIE9yX2Vycm9yLnQsICdjbXApIHRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgY29tcGFyZV9kaXJlY3RcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdiIC0+ICdiIC0+IGludClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGludFxuXG4gIHZhbCBlcXVhbFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2IgLT4gJ2IgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGJvb2xcblxuICB2YWwga2V5cyA6ICgnYSwgXywgXykgdCAtPiAnYSBsaXN0XG4gIHZhbCBkYXRhIDogKF8sICdiLCBfKSB0IC0+ICdiIGxpc3RcblxuICB2YWwgdG9fYWxpc3RcbiAgICA6ICA/a2V5X29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gKCdhLCAnYiwgXykgdFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG5cbiAgdmFsIG1lcmdlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidhIC0+ICgnYiwgJ2MpIE1lcmdlX2VsZW1lbnQudCAtPiAnZCBvcHRpb24pXG4gICAgLT4gKCdhLCAnZCwgJ2NtcCkgdFxuXG4gIHZhbCBtZXJnZV9za2V3ZWRcbiAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21iaW5lOihrZXk6J2sgLT4gJ3YgLT4gJ3YgLT4gJ3YpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnYikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCdiIC0+ICdiIC0+IGJvb2wpXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICgnYSwgJ2IpIFN5bW1ldHJpY19kaWZmX2VsZW1lbnQudCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBtaW5fZWx0IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgJ2IsICdjbXApIHQgLT4gJ2EgKiAnYlxuICB2YWwgbWF4X2VsdCA6ICgnYSwgJ2IsICdjbXApIHQgLT4gKCdhICogJ2IpIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsICdiLCAnY21wKSB0IC0+ICdhICogJ2JcbiAgdmFsIGZvcl9hbGwgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOihrZXk6J2EgLT4gZGF0YTonYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHMgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGV4aXN0c2kgOiAoJ2EsICdiLCAnY21wKSB0IC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGNvdW50IDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBmOignYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50aSA6ICgnYSwgJ2IsICdjbXApIHQgLT4gZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gaW50XG5cbiAgdmFsIHNwbGl0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiAnYVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgKiAoJ2EgKiAnYikgb3B0aW9uICogKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBhcHBlbmRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gbG93ZXJfcGFydDooJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gdXBwZXJfcGFydDooJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzIF1cblxuICB2YWwgc3VicmFuZ2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuICAgIC0+IGxvd2VyX2JvdW5kOidhIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonYSBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmb2xkX3JhbmdlX2luY2x1c2l2ZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gbWluOidhXG4gICAgLT4gbWF4OidhXG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KGtleTonYSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIHJhbmdlX3RvX2FsaXN0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbiAgICAtPiBtaW46J2FcbiAgICAtPiBtYXg6J2FcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuXG4gIHZhbCBjbG9zZXN0X2tleVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgIC0+ICdhXG4gICAgLT4gKCdhICogJ2IpIG9wdGlvblxuXG4gIHZhbCBudGggOiAoJ2EsICdiLCAnY21wKSB0IC0+IGludCAtPiAoJ2EgKiAnYikgb3B0aW9uXG4gIHZhbCBudGhfZXhuIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiBpbnQgLT4gJ2EgKiAnYlxuICB2YWwgcmFuayA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdCAtPiAnYSAtPiBpbnQgb3B0aW9uXG4gIHZhbCB0b190cmVlIDogKCdhLCAnYiwgJ2NtcCkgdCAtPiAoJ2EsICdiLCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ID9vcmRlcjpbIGBJbmNyZWFzaW5nX2tleSB8IGBEZWNyZWFzaW5nX2tleSBdXG4gICAgLT4gP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcblxuICB2YWwgYmluYXJ5X3NlYXJjaFxuICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGtleTonayAtPiBkYXRhOid2IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfc2VnbWVudC50XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3N1YnJhbmdlXG4gICAgOiAgY29tcGFyYXRvcjooJ2ssICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYm91bmQgLT4gaW50KVxuICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5lbmRcblxuKCoqIENvbnNpc3RlbmN5IGNoZWNrcyAoc2FtZSBhcyBpbiBbQ29udGFpbmVyXSkuICopXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKFQgOiBUMylcbiAgICAoVHJlZSA6IFQzKVxuICAgIChLZXkgOiBUMSlcbiAgICAoQ21wIDogVDEpXG4gICAgKE9wdGlvbnMgOiBUMylcbiAgICAoXyA6IEFjY2Vzc29yc19nZW5lcmljXG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgT3B0aW9ucy50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgVC50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgVHJlZS50XG4gICAgIHdpdGggdHlwZSAnYSBrZXkgOj0gJ2EgS2V5LnRcbiAgICAgd2l0aCB0eXBlICdjbXAgY21wIDo9ICdjbXAgQ21wLnQpID1cbnN0cnVjdCBlbmRcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczEgKE0gOiBBY2Nlc3NvcnMxKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAnYiBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICdiIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmtleVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMiAoTSA6IEFjY2Vzc29yczIpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMzIChNIDogQWNjZXNzb3JzMykgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IgKE0gOiBBY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvcikgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYiwgJ2MpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoV2l0aF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gc2lnXG4gIHR5cGUgKCdrLCAndiwgJ2NtcCkgdFxuICB0eXBlICgnaywgJ3YsICdjbXApIHRyZWVcbiAgdHlwZSAnayBrZXlcbiAgdHlwZSAoJ2EsICdjbXAsICd6KSBvcHRpb25zXG4gIHR5cGUgJ2NtcCBjbXBcblxuICB2YWwgZW1wdHkgOiAoJ2ssICdjbXAsICgnaywgXywgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgc2luZ2xldG9uIDogKCdrLCAnY21wLCAnayBrZXkgLT4gJ3YgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBtYXBfa2V5c1xuICAgIDogKCAnazJcbiAgICAgICwgJ2NtcDJcbiAgICAgICwgKCdrMSwgJ3YsICdjbXAxKSB0XG4gICAgICAtPiBmOignazEga2V5IC0+ICdrMiBrZXkpXG4gICAgICAtPiBbIGBPayBvZiAoJ2syLCAndiwgJ2NtcDIpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnazIga2V5IF0gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG1hcF9rZXlzX2V4blxuICAgIDogKCAnazJcbiAgICAgICwgJ2NtcDJcbiAgICAgICwgKCdrMSwgJ3YsICdjbXAxKSB0IC0+IGY6KCdrMSBrZXkgLT4gJ2syIGtleSkgLT4gKCdrMiwgJ3YsICdjbXAyKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBhcnJheSAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZFxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGFycmF5IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICgnaywgJ2NtcCwgbGVuOmludCAtPiBmOihpbnQgLT4gJ2sga2V5ICogJ3YpIC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2sga2V5ICogJ3YpIGxpc3QgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrIGtleSBdIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvclxuICAgIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGxpc3QgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X2V4biA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBsaXN0IC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG9mX2FsaXN0X211bHRpIDogKCdrLCAnY21wLCAoJ2sga2V5ICogJ3YpIGxpc3QgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X2ZvbGRcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2sga2V5ICogJ3YxKSBsaXN0IC0+IGluaXQ6J3YyIC0+IGY6KCd2MiAtPiAndjEgLT4gJ3YyKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfcmVkdWNlXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgbGlzdCAtPiBmOigndiAtPiAndiAtPiAndikgLT4gKCdrLCAndiwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiAoJ2ssICd2LCAnY21wKSB0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrIGtleSBdXG4gICAgICApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2Vfb3JfZXJyb3JcbiAgICA6ICgnaywgJ2NtcCwgKCdrIGtleSAqICd2KSBTZXF1ZW5jZS50IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudCkgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZV9leG4gOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiAoJ2ssICd2LCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX3NlcXVlbmNlX211bHRpXG4gICAgOiAoJ2ssICdjbXAsICgnayBrZXkgKiAndikgU2VxdWVuY2UudCAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2Zfc2VxdWVuY2VfZm9sZFxuICAgIDogKCAna1xuICAgICAgLCAnY21wXG4gICAgICAsICgnayBrZXkgKiAndjEpIFNlcXVlbmNlLnRcbiAgICAgIC0+IGluaXQ6J3YyXG4gICAgICAtPiBmOigndjIgLT4gJ3YxIC0+ICd2MilcbiAgICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9zZXF1ZW5jZV9yZWR1Y2VcbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2sga2V5ICogJ3YpIFNlcXVlbmNlLnQgLT4gZjooJ3YgLT4gJ3YgLT4gJ3YpIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX2l0ZXJpXG4gICAgOiAoICdrXG4gICAgICAsICdjbXBcbiAgICAgICwgaXRlcmk6KGY6KGtleTonayBrZXkgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0KVxuICAgICAgLT4gWyBgT2sgb2YgKCdrLCAndiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrIGtleSBdIClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBvZl9pdGVyaV9leG5cbiAgICA6ICggJ2tcbiAgICAgICwgJ2NtcFxuICAgICAgLCBpdGVyaTooZjooa2V5OidrIGtleSAtPiBkYXRhOid2IC0+IHVuaXQpIC0+IHVuaXQpIC0+ICgnaywgJ3YsICdjbXApIHQgKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIG9mX3RyZWUgOiAoJ2ssICdjbXAsICgnayBrZXksICd2LCAnY21wKSB0cmVlIC0+ICgnaywgJ3YsICdjbXApIHQpIG9wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczEgPSBzaWdcbiAgdHlwZSAnYSB0XG4gIHR5cGUgJ2EgdHJlZVxuICB0eXBlIGtleVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBlbXB0eSA6IF8gdFxuICB2YWwgc2luZ2xldG9uIDoga2V5IC0+ICdhIC0+ICdhIHRcbiAgdmFsIG1hcF9rZXlzIDogJ3YgdCAtPiBmOihrZXkgLT4ga2V5KSAtPiBbIGBPayBvZiAndiB0IHwgYER1cGxpY2F0ZV9rZXkgb2Yga2V5IF1cbiAgdmFsIG1hcF9rZXlzX2V4biA6ICd2IHQgLT4gZjooa2V5IC0+IGtleSkgLT4gJ3YgdFxuICB2YWwgb2ZfYWxpc3QgOiAoa2V5ICogJ2EpIGxpc3QgLT4gWyBgT2sgb2YgJ2EgdCB8IGBEdXBsaWNhdGVfa2V5IG9mIGtleSBdXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvciA6IChrZXkgKiAnYSkgbGlzdCAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX2FsaXN0X2V4biA6IChrZXkgKiAnYSkgbGlzdCAtPiAnYSB0XG4gIHZhbCBvZl9hbGlzdF9tdWx0aSA6IChrZXkgKiAnYSkgbGlzdCAtPiAnYSBsaXN0IHRcbiAgdmFsIG9mX2FsaXN0X2ZvbGQgOiAoa2V5ICogJ2EpIGxpc3QgLT4gaW5pdDonYiAtPiBmOignYiAtPiAnYSAtPiAnYikgLT4gJ2IgdFxuICB2YWwgb2ZfYWxpc3RfcmVkdWNlIDogKGtleSAqICdhKSBsaXN0IC0+IGY6KCdhIC0+ICdhIC0+ICdhKSAtPiAnYSB0XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXkgOiAoa2V5ICogJ2EpIGFycmF5IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6IChrZXkgKiAnYSkgYXJyYXkgLT4gJ2EgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgOiBsZW46aW50IC0+IGY6KGludCAtPiBrZXkgKiAnYSkgLT4gJ2EgdFxuICB2YWwgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiAnYSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NlcXVlbmNlIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+IFsgYE9rIG9mICdhIHQgfCBgRHVwbGljYXRlX2tleSBvZiBrZXkgXVxuICB2YWwgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gJ2EgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zZXF1ZW5jZV9leG4gOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gJ2EgdFxuICB2YWwgb2Zfc2VxdWVuY2VfbXVsdGkgOiAoa2V5ICogJ2EpIFNlcXVlbmNlLnQgLT4gJ2EgbGlzdCB0XG4gIHZhbCBvZl9zZXF1ZW5jZV9mb2xkIDogKGtleSAqICdhKSBTZXF1ZW5jZS50IC0+IGluaXQ6J2IgLT4gZjooJ2IgLT4gJ2EgLT4gJ2IpIC0+ICdiIHRcbiAgdmFsIG9mX3NlcXVlbmNlX3JlZHVjZSA6IChrZXkgKiAnYSkgU2VxdWVuY2UudCAtPiBmOignYSAtPiAnYSAtPiAnYSkgLT4gJ2EgdFxuXG4gIHZhbCBvZl9pdGVyaVxuICAgIDogIGl0ZXJpOihmOihrZXk6a2V5IC0+IGRhdGE6J3YgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiBbIGBPayBvZiAndiB0IHwgYER1cGxpY2F0ZV9rZXkgb2Yga2V5IF1cblxuICB2YWwgb2ZfaXRlcmlfZXhuIDogaXRlcmk6KGY6KGtleTprZXkgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0KSAtPiAndiB0XG4gIHZhbCBvZl90cmVlIDogJ2EgdHJlZSAtPiAnYSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMyID0gc2lnXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICgnYSwgJ2IpIHRyZWVcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgZW1wdHkgOiAoXywgXykgdFxuICB2YWwgc2luZ2xldG9uIDogJ2EgLT4gJ2IgLT4gKCdhLCAnYikgdFxuXG4gIHZhbCBtYXBfa2V5c1xuICAgIDogICgnazEsICd2KSB0XG4gICAgLT4gZjooJ2sxIC0+ICdrMilcbiAgICAtPiBbIGBPayBvZiAoJ2syLCAndikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrMiBdXG5cbiAgdmFsIG1hcF9rZXlzX2V4biA6ICgnazEsICd2KSB0IC0+IGY6KCdrMSAtPiAnazIpIC0+ICgnazIsICd2KSB0XG4gIHZhbCBvZl9hbGlzdCA6ICgnYSAqICdiKSBsaXN0IC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvciA6ICgnYSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuICB2YWwgb2ZfYWxpc3RfZXhuIDogKCdhICogJ2IpIGxpc3QgLT4gKCdhLCAnYikgdFxuICB2YWwgb2ZfYWxpc3RfbXVsdGkgOiAoJ2EgKiAnYikgbGlzdCAtPiAoJ2EsICdiIGxpc3QpIHRcbiAgdmFsIG9mX2FsaXN0X2ZvbGQgOiAoJ2EgKiAnYikgbGlzdCAtPiBpbml0OidjIC0+IGY6KCdjIC0+ICdiIC0+ICdjKSAtPiAoJ2EsICdjKSB0XG4gIHZhbCBvZl9hbGlzdF9yZWR1Y2UgOiAoJ2EgKiAnYikgbGlzdCAtPiBmOignYiAtPiAnYiAtPiAnYikgLT4gKCdhLCAnYikgdFxuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogKCdhICogJ2IpIGFycmF5IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6ICgnYSAqICdiKSBhcnJheSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCA6IGxlbjppbnQgLT4gZjooaW50IC0+ICdhICogJ2IpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfc2VxdWVuY2UgOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiAoJ2EsICdiKSB0IE9yX2Vycm9yLnRcbiAgdmFsIG9mX3NlcXVlbmNlIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cbiAgdmFsIG9mX3NlcXVlbmNlX29yX2Vycm9yIDogKCdhICogJ2IpIFNlcXVlbmNlLnQgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zZXF1ZW5jZV9leG4gOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl9zZXF1ZW5jZV9tdWx0aSA6ICgnYSAqICdiKSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2IgbGlzdCkgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9mb2xkXG4gICAgOiAgKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpXG4gICAgLT4gKCdhLCAnYykgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9yZWR1Y2UgOiAoJ2EgKiAnYikgU2VxdWVuY2UudCAtPiBmOignYiAtPiAnYiAtPiAnYikgLT4gKCdhLCAnYikgdFxuXG4gIHZhbCBvZl9pdGVyaVxuICAgIDogIGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgdmFsIG9mX2l0ZXJpX2V4biA6IGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBvZl90cmVlIDogKCdhLCAnYikgdHJlZSAtPiAoJ2EsICdiKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICB0eXBlICgnYSwgJ2IsICdjbXApIHRcbiAgdHlwZSAoJ2EsICdiLCAnY21wKSB0cmVlXG5cbiAgdmFsIGVtcHR5IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsIF8sICdjbXApIHRcbiAgdmFsIHNpbmdsZXRvbiA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgLT4gJ2IgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gIHZhbCBtYXBfa2V5c1xuICAgIDogIGNvbXBhcmF0b3I6KCdrMiwgJ2NtcDIpIENvbXBhcmF0b3IudFxuICAgIC0+ICgnazEsICd2LCAnY21wMSkgdFxuICAgIC0+IGY6KCdrMSAtPiAnazIpXG4gICAgLT4gWyBgT2sgb2YgKCdrMiwgJ3YsICdjbXAyKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2syIF1cblxuICB2YWwgbWFwX2tleXNfZXhuXG4gICAgOiAgY29tcGFyYXRvcjooJ2syLCAnY21wMikgQ29tcGFyYXRvci50XG4gICAgLT4gKCdrMSwgJ3YsICdjbXAxKSB0XG4gICAgLT4gZjooJ2sxIC0+ICdrMilcbiAgICAtPiAoJ2syLCAndiwgJ2NtcDIpIHRcblxuICB2YWwgb2ZfYWxpc3RcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvclxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9hbGlzdF9leG5cbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX2FsaXN0X211bHRpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgdmFsIG9mX2FsaXN0X2ZvbGRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBvZl9hbGlzdF9yZWR1Y2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBmOignYiAtPiAnYiAtPiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX3NvcnRlZF9hcnJheVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgYXJyYXlcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgYXJyYXlcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiBmOihpbnQgLT4gJ2EgKiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfc2VxdWVuY2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2Zfc2VxdWVuY2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9vcl9lcnJvclxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9leG5cbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlX211bHRpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgdmFsIG9mX3NlcXVlbmNlX2ZvbGRcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gIHZhbCBvZl9zZXF1ZW5jZV9yZWR1Y2VcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhICogJ2IpIFNlcXVlbmNlLnRcbiAgICAtPiBmOignYiAtPiAnYiAtPiAnYilcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX2l0ZXJpXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+IGl0ZXJpOihmOihrZXk6J2EgLT4gZGF0YTonYiAtPiB1bml0KSAtPiB1bml0KVxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IsICdjbXApIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgdmFsIG9mX2l0ZXJpX2V4blxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgdmFsIG9mX3RyZWVcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdHJlZVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcbmVuZFxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnNcbiAgICAoVCA6IFQzKVxuICAgIChUcmVlIDogVDMpXG4gICAgKEtleSA6IFQxKVxuICAgIChDbXAgOiBUMSlcbiAgICAoT3B0aW9ucyA6IFQzKVxuICAgIChfIDogQ3JlYXRvcnNfZ2VuZXJpY1xuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIG9wdGlvbnMgOj0gKCdhLCAnYiwgJ2MpIE9wdGlvbnMudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIFQudFxuICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIFRyZWUudFxuICAgICB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIEtleS50XG4gICAgIHdpdGggdHlwZSAnYSBjbXAgOj0gJ2EgQ21wLnQpID1cbnN0cnVjdCBlbmRcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMSAoTSA6IENyZWF0b3JzMSkgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAnYiBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICdiIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmtleVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMyIChNIDogQ3JlYXRvcnMyKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiLCAnYykgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IsICdjKSB0ID0gKCdhLCAnYikgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczNfd2l0aF9jb21wYXJhdG9yIChNIDogQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvcikgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHQgPSAoJ2EsICdiLCAnYykgTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChXaXRoX2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnNfZ2VuZXJpYyA9IHNpZ1xuICBpbmNsdWRlIENyZWF0b3JzX2dlbmVyaWNcblxuICBpbmNsdWRlXG4gICAgQWNjZXNzb3JzX2dlbmVyaWNcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHQgOj0gKCdhLCAnYiwgJ2MpIHRcbiAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIHRyZWVcbiAgICB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIGtleVxuICAgIHdpdGggdHlwZSAnYSBjbXAgOj0gJ2EgY21wXG4gICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBvcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczEgPSBzaWdcbiAgaW5jbHVkZSBDcmVhdG9yczFcblxuICBpbmNsdWRlXG4gICAgQWNjZXNzb3JzMVxuICAgIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgICB3aXRoIHR5cGUgJ2EgdHJlZSA6PSAnYSB0cmVlXG4gICAgd2l0aCB0eXBlIGtleSA6PSBrZXlcbiAgICB3aXRoIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzIDo9IGNvbXBhcmF0b3Jfd2l0bmVzc1xuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyID0gc2lnXG4gIGluY2x1ZGUgQ3JlYXRvcnMyXG5cbiAgaW5jbHVkZVxuICAgIEFjY2Vzc29yczJcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgdHJlZVxuICAgIHdpdGggdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgOj0gY29tcGFyYXRvcl93aXRuZXNzXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yID0gc2lnXG4gIGluY2x1ZGUgQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvclxuXG4gIGluY2x1ZGVcbiAgICBBY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvclxuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgdFxuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdHJlZSA6PSAoJ2EsICdiLCAnYykgdHJlZVxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfcG9seSA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyXG5cbm1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IsICdjKSB0XG5cbiAgbW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICAgIFtAQEBlbmRdXG5cbiAgICBpbmNsdWRlIENvbXBhcmF0b3IuUyB3aXRoIHR5cGUgdCA6PSB0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBDb21wYXJlX20gPSBzaWcgZW5kXG4gIG1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG4gIG1vZHVsZSB0eXBlIEhhc2hfZm9sZF9tID0gSGFzaGVyLlNcblxuICB2YWwgc2V4cF9vZl9tX190XG4gICAgOiAgKG1vZHVsZSBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAoJ3YgLT4gU2V4cC50KVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBTZXhwLnRcblxuICB2YWwgbV9fdF9vZl9zZXhwXG4gICAgOiAgKG1vZHVsZSBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSAnayBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSAnY21wKVxuICAgIC0+IChTZXhwLnQgLT4gJ3YpXG4gICAgLT4gU2V4cC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIHZhbCBtX190X3NleHBfZ3JhbW1hclxuICAgIDogIChtb2R1bGUgTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAndiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICB2YWwgY29tcGFyZV9tX190XG4gICAgOiAgKG1vZHVsZSBDb21wYXJlX20pXG4gICAgLT4gKCd2IC0+ICd2IC0+IGludClcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGludFxuXG4gIHZhbCBlcXVhbF9tX190XG4gICAgOiAgKG1vZHVsZSBFcXVhbF9tKVxuICAgIC0+ICgndiAtPiAndiAtPiBib29sKVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gYm9vbFxuXG4gIHZhbCBoYXNoX2ZvbGRfbV9fdFxuICAgIDogIChtb2R1bGUgSGFzaF9mb2xkX20gd2l0aCB0eXBlIHQgPSAnaylcbiAgICAtPiAoSGFzaC5zdGF0ZSAtPiAndiAtPiBIYXNoLnN0YXRlKVxuICAgIC0+IEhhc2guc3RhdGVcbiAgICAtPiAoJ2ssICd2LCBfKSB0XG4gICAgLT4gSGFzaC5zdGF0ZVxuZW5kXG5cbm1vZHVsZSB0eXBlIE1hcCA9IHNpZ1xuICAoKiogW01hcF0gaXMgYSBmdW5jdGlvbmFsIGRhdGEgc3RydWN0dXJlIChiYWxhbmNlZCBiaW5hcnkgdHJlZSkgaW1wbGVtZW50aW5nIGZpbml0ZSBtYXBzXG4gICAgICBvdmVyIGEgdG90YWxseS1vcmRlcmVkIGRvbWFpbiwgY2FsbGVkIGEgXCJrZXlcIi4gKilcblxuICB0eXBlICgna2V5LCArJ3ZhbHVlLCAnY21wKSB0XG5cbiAgbW9kdWxlIE9yX2R1cGxpY2F0ZSA9IE9yX2R1cGxpY2F0ZVxuICBtb2R1bGUgQ29udGludWVfb3Jfc3RvcCA9IENvbnRpbnVlX29yX3N0b3BcblxuICBtb2R1bGUgRmluaXNoZWRfb3JfdW5maW5pc2hlZCA6IHNpZ1xuICAgIHR5cGUgdCA9IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudCA9XG4gICAgICB8IEZpbmlzaGVkXG4gICAgICB8IFVuZmluaXNoZWRcbiAgICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZW51bWVyYXRlLCBlcXVhbCwgc2V4cF9vZl1cblxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUyB3aXRoIHR5cGUgdCA6PSB0XG4gICAgaW5jbHVkZSBQcHhfZW51bWVyYXRlX2xpYi5FbnVtZXJhYmxlLlMgd2l0aCB0eXBlIHQgOj0gdFxuICAgIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkVxdWFsLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgKCoqIE1hcHMgW0NvbnRpbnVlXSB0byBbRmluaXNoZWRdIGFuZCBbU3RvcF0gdG8gW1VuZmluaXNoZWRdLiAqKVxuICAgIHZhbCBvZl9jb250aW51ZV9vcl9zdG9wIDogQ29udGludWVfb3Jfc3RvcC50IC0+IHRcblxuICAgICgqKiBNYXBzIFtGaW5pc2hlZF0gdG8gW0NvbnRpbnVlXSBhbmQgW1VuZmluaXNoZWRdIHRvIFtTdG9wXS4gKilcbiAgICB2YWwgdG9fY29udGludWVfb3Jfc3RvcCA6IHQgLT4gQ29udGludWVfb3Jfc3RvcC50XG4gIGVuZFxuXG4gIG1vZHVsZSBNZXJnZV9lbGVtZW50IDogc2lnXG4gICAgdHlwZSAoJ2xlZnQsICdyaWdodCkgdCA9XG4gICAgICBbIGBMZWZ0IG9mICdsZWZ0XG4gICAgICB8IGBSaWdodCBvZiAncmlnaHRcbiAgICAgIHwgYEJvdGggb2YgJ2xlZnQgKiAncmlnaHRcbiAgICAgIF1cbiAgICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHBfb2ZdXG5cbiAgICB2YWwgY29tcGFyZVxuICAgICAgOiAgKCdsZWZ0IC0+ICdsZWZ0IC0+IGludClcbiAgICAgIC0+ICgncmlnaHQgLT4gJ3JpZ2h0IC0+IGludClcbiAgICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gaW50XG5cbiAgICB2YWwgZXF1YWxcbiAgICAgIDogICgnbGVmdCAtPiAnbGVmdCAtPiBib29sKVxuICAgICAgLT4gKCdyaWdodCAtPiAncmlnaHQgLT4gYm9vbClcbiAgICAgIC0+ICgnbGVmdCwgJ3JpZ2h0KSB0XG4gICAgICAtPiAoJ2xlZnQsICdyaWdodCkgdFxuICAgICAgLT4gYm9vbFxuXG4gICAgdmFsIHNleHBfb2ZfdFxuICAgICAgOiAgKCdsZWZ0IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgIC0+ICgncmlnaHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgIHZhbCBsZWZ0IDogKCdsZWZ0LCBfKSB0IC0+ICdsZWZ0IG9wdGlvblxuICAgIHZhbCByaWdodCA6IChfLCAncmlnaHQpIHQgLT4gJ3JpZ2h0IG9wdGlvblxuICAgIHZhbCBsZWZ0X3ZhbHVlIDogKCdsZWZ0LCBfKSB0IC0+IGRlZmF1bHQ6J2xlZnQgLT4gJ2xlZnRcbiAgICB2YWwgcmlnaHRfdmFsdWUgOiAoXywgJ3JpZ2h0KSB0IC0+IGRlZmF1bHQ6J3JpZ2h0IC0+ICdyaWdodFxuXG4gICAgdmFsIHZhbHVlc1xuICAgICAgOiAgKCdsZWZ0LCAncmlnaHQpIHRcbiAgICAgIC0+IGxlZnRfZGVmYXVsdDonbGVmdFxuICAgICAgLT4gcmlnaHRfZGVmYXVsdDoncmlnaHRcbiAgICAgIC0+ICdsZWZ0ICogJ3JpZ2h0XG4gIGVuZFxuXG4gIHR5cGUgKCdrLCAnY21wKSBjb21wYXJhdG9yID0gKCdrLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gIFtAQGRlcHJlY2F0ZWQgXCJbc2luY2UgMjAyMS0xMl0gdXNlIFtDb21wYXJhdG9yLk1vZHVsZS50XSBpbnN0ZWFkXCJdXG5cbiAgKCoqIFRlc3QgaWYgdGhlIGludmFyaWFudHMgb2YgdGhlIGludGVybmFsIEFWTCBzZWFyY2ggdHJlZSBob2xkLiAqKVxuICB2YWwgaW52YXJpYW50cyA6IChfLCBfLCBfKSB0IC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBhIGZpcnN0LWNsYXNzIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIG90aGVyIG1hcC9zZXQvZXRjLlxuICAgICAgd2l0aCB0aGUgc2FtZSBub3Rpb24gb2YgY29tcGFyaXNvbi4gKilcbiAgdmFsIGNvbXBhcmF0b3JfcyA6ICgnYSwgXywgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcblxuICB2YWwgY29tcGFyYXRvciA6ICgnYSwgXywgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IudFxuXG4gICgqKiBUaGUgZW1wdHkgbWFwLiAqKVxuICB2YWwgZW1wdHkgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBBIG1hcCB3aXRoIG9uZSAoa2V5LCBkYXRhKSBwYWlyLiAqKVxuICB2YWwgc2luZ2xldG9uIDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIC0+ICdiIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIGxpc3Qgd2l0aCB1bmlxdWUga2V5cy4gKilcbiAgdmFsIG9mX2FsaXN0XG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiLCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2EgXVxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gbGlzdCB3aXRoIHVuaXF1ZSBrZXlzLCByZXR1cm5pbmcgYW4gZXJyb3IgaWZcbiAgICAgIGR1cGxpY2F0ZSBbJ2FdIGtleXMgYXJlIGZvdW5kLiAqKVxuICB2YWwgb2ZfYWxpc3Rfb3JfZXJyb3JcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gbGlzdCB3aXRoIHVuaXF1ZSBrZXlzLCByYWlzaW5nIGFuIGV4Y2VwdGlvbiBpZlxuICAgICAgZHVwbGljYXRlIFsnYV0ga2V5cyBhcmUgZm91bmQuICopXG4gIHZhbCBvZl9hbGlzdF9leG4gOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gKCdhICogJ2IpIGxpc3QgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gbGlzdCB3aXRoIHBvc3NpYmx5IHJlcGVhdGVkIGtleXMuIFRoZSB2YWx1ZXMgaW5cbiAgICAgIHRoZSBtYXAgZm9yIGEgZ2l2ZW4ga2V5IGFwcGVhciBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGRpZCBpbiB0aGUgYXNzb2NpYXRpb25cbiAgICAgIGxpc3QuICopXG4gIHZhbCBvZl9hbGlzdF9tdWx0aVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiBsaXN0LCAnY21wKSB0XG5cbiAgKCoqIENvbWJpbmVzIGFuIGFzc29jaWF0aW9uIGxpc3QgaW50byBhIG1hcCwgZm9sZGluZyB0b2dldGhlciBib3VuZCB2YWx1ZXMgd2l0aCBjb21tb25cbiAgICAgIGtleXMuIFRoZSBhY2N1bXVsYXRvciBpcyBwZXIta2V5LlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7W1xuICAgICAgICAjIGxldCBtYXAgPSBTdHJpbmcuTWFwLm9mX2FsaXN0X2ZvbGRcbiAgICAgICAgICAgICAgICAgICAgICBbIFwiYVwiLCAxOyBcImFcIiwgMTA7IFwiYlwiLCAyOyBcImJcIiwgMjA7IFwiYlwiLCAyMDAgXVxuICAgICAgICAgICAgICAgICAgICAgIH5pbml0OkludC5TZXQuZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgICB+ZjpTZXQuYWRkXG4gICAgICAgICAgaW5cbiAgICAgICAgICBwcmludF9zIFslc2V4cCAobWFwIDogSW50LlNldC50IFN0cmluZy5NYXAudCldOztcbiAgICAgICAgKChhICgxIDEwKSkgKGIgKDIgMjAgMjAwKSkpXG4gICAgICAgIC0gOiB1bml0ID0gKClcbiAgICAgIF19XG4gICopXG4gIHZhbCBvZl9hbGlzdF9mb2xkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBpbml0OidjXG4gICAgLT4gZjooJ2MgLT4gJ2IgLT4gJ2MpXG4gICAgLT4gKCdhLCAnYywgJ2NtcCkgdFxuXG4gICgqKiBDb21iaW5lcyBhbiBhc3NvY2lhdGlvbiBsaXN0IGludG8gYSBtYXAsIHJlZHVjaW5nIHRvZ2V0aGVyIGJvdW5kIHZhbHVlcyB3aXRoIGNvbW1vblxuICAgICAga2V5cy4gKilcbiAgdmFsIG9mX2FsaXN0X3JlZHVjZVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBbb2ZfaXRlcmkgfml0ZXJpXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0XSwgZXhjZXB0IHRoYXQgaW5zdGVhZCBvZiB0YWtpbmcgYSBjb25jcmV0ZVxuICAgICAgZGF0YSBzdHJ1Y3R1cmUsIGl0IHRha2VzIGFuIGl0ZXJhdGlvbiBmdW5jdGlvbi4gIEZvciBpbnN0YW5jZSwgdG8gY29udmVydCBhIHN0cmluZyB0YWJsZVxuICAgICAgaW50byBhIG1hcDogW29mX2l0ZXJpIChtb2R1bGUgU3RyaW5nKSB+ZjooSGFzaHRibC5pdGVyaSB0YWJsZSldLiAgSXQgaXMgZmFzdGVyIHRoYW5cbiAgICAgIGFkZGluZyB0aGUgZWxlbWVudHMgb25lIGJ5IG9uZS4gKilcbiAgdmFsIG9mX2l0ZXJpXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gaXRlcmk6KGY6KGtleTonYSAtPiBkYXRhOidiIC0+IHVuaXQpIC0+IHVuaXQpXG4gICAgLT4gWyBgT2sgb2YgKCdhLCAnYiwgJ2NtcCkgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdhIF1cblxuICAoKiogTGlrZSBbb2ZfaXRlcmldIGV4Y2VwdCB0aGF0IGl0IHJhaXNlcyBhbiBleGNlcHRpb24gaWYgZHVwbGljYXRlIFsnYV0ga2V5cyBhcmUgZm91bmQuICopXG4gIHZhbCBvZl9pdGVyaV9leG5cbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiBpdGVyaTooZjooa2V5OidhIC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdClcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhIHNvcnRlZCBhcnJheSBvZiBrZXktZGF0YSBwYWlycy4gVGhlIGlucHV0IGFycmF5IG11c3QgYmUgc29ydGVkXG4gICAgICAoZWl0aGVyIGluIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyKSwgYXMgZ2l2ZW4gYnkgdGhlIHJlbGV2YW50IGNvbXBhcmF0b3IsIGFuZFxuICAgICAgbXVzdCBub3QgY29udGFpbiBkdXBsaWNhdGUga2V5cy4gSWYgZWl0aGVyIG9mIHRoZXNlIGNvbmRpdGlvbnMgZG9lcyBub3QgaG9sZCxcbiAgICAgIGFuIGVycm9yIGlzIHJldHVybmVkLiAgKilcbiAgdmFsIG9mX3NvcnRlZF9hcnJheVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBhcnJheVxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBMaWtlIFtvZl9zb3J0ZWRfYXJyYXldIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSBtYXAgd2l0aCBicm9rZW4gaW52YXJpYW50cyB3aGVuIGFuXG4gICAgICBbRXJyb3JdIHdvdWxkIGhhdmUgYmVlbiByZXR1cm5lZC4gKilcbiAgdmFsIG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgYXJyYXlcbiAgICAtPiAoJ2EsICdiLCAnY21wKSB0XG5cbiAgKCoqIFtvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCBjIH5sZW4gfmZdIGJlaGF2ZXMgbGlrZSBbb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBjXG4gICAgICAoQXJyYXkuaW5pdCBsZW4gfmYpXSwgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGEgZGVjcmVhc2luZyBvcmRlciBpcyBub3RcbiAgICAgIHN1cHBvcnRlZC4gIFRoZSBhZHZhbnRhZ2UgaXMgbm90IHJlcXVpcmluZyB5b3UgdG8gYWxsb2NhdGUgYW4gaW50ZXJtZWRpYXRlIGFycmF5LiAgW2ZdXG4gICAgICB3aWxsIGJlIGNhbGxlZCB3aXRoIDAsIDEsIC4uLiBbbGVuIC0gMV0sIGluIG9yZGVyLiAqKVxuICB2YWwgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWRcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gZjooaW50IC0+ICdhICogJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBbb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBjIHNlcV0gYmVoYXZlcyBsaWtlIFtvZl9zb3J0ZWRfYXJyYXkgYyAoU2VxdWVuY2UudG9fYXJyYXlcbiAgICAgIHNlcSldLCBidXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBhcnJheS5cblxuICAgICAgVGhlIHNlcXVlbmNlIHdpbGwgYmUgZm9sZGVkIG92ZXIgb25jZSwgYW5kIHRoZSBhZGRpdGlvbmFsIHRpbWUgY29tcGxleGl0eSBpcyB7ZSBPKG4pfS5cbiAgKilcbiAgdmFsIG9mX2luY3JlYXNpbmdfc2VxdWVuY2VcbiAgICA6ICAoJ2ssICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2sgKiAndikgU2VxdWVuY2UudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gc2VxdWVuY2Ugd2l0aCB1bmlxdWUga2V5cy5cblxuICAgICAgW29mX3NlcXVlbmNlIGMgc2VxXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0IGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKV0gYnV0XG4gICAgICBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuXG5cbiAgICAgIElmIHlvdXIgc2VxdWVuY2UgaXMgaW5jcmVhc2luZywgdXNlIFtvZl9pbmNyZWFzaW5nX3NlcXVlbmNlXS5cbiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlXG4gICAgOiAgKCdrLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gKCdrICogJ3YpIFNlcXVlbmNlLnRcbiAgICAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYER1cGxpY2F0ZV9rZXkgb2YgJ2sgXVxuXG4gICgqKiBDcmVhdGVzIGEgbWFwIGZyb20gYW4gYXNzb2NpYXRpb24gc2VxdWVuY2Ugd2l0aCB1bmlxdWUga2V5cywgcmV0dXJuaW5nIGFuIGVycm9yIGlmXG4gICAgICBkdXBsaWNhdGUgWydhXSBrZXlzIGFyZSBmb3VuZC5cblxuICAgICAgW29mX3NlcXVlbmNlX29yX2Vycm9yIGMgc2VxXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0X29yX2Vycm9yIGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKV1cbiAgICAgIGJ1dCBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuXG4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZV9vcl9lcnJvclxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIENyZWF0ZXMgYSBtYXAgZnJvbSBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSB3aXRoIHVuaXF1ZSBrZXlzLCByYWlzaW5nIGFuIGV4Y2VwdGlvbiBpZlxuICAgICAgZHVwbGljYXRlIFsnYV0ga2V5cyBhcmUgZm91bmQuXG5cbiAgICAgIFtvZl9zZXF1ZW5jZV9leG4gYyBzZXFdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3RfZXhuIGMgKFNlcXVlbmNlLnRvX2xpc3Qgc2VxKV0gYnV0XG4gICAgICBkb2VzIG5vdCBhbGxvY2F0ZSB0aGUgaW50ZXJtZWRpYXRlIGxpc3QuXG4gICopXG4gIHZhbCBvZl9zZXF1ZW5jZV9leG5cbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IsICdjbXApIHRcblxuICAoKiogQ3JlYXRlcyBhIG1hcCBmcm9tIGFuIGFzc29jaWF0aW9uIHNlcXVlbmNlIHdpdGggcG9zc2libHkgcmVwZWF0ZWQga2V5cy4gVGhlIHZhbHVlcyBpblxuICAgICAgdGhlIG1hcCBmb3IgYSBnaXZlbiBrZXkgYXBwZWFyIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgZGlkIGluIHRoZSBhc3NvY2lhdGlvblxuICAgICAgbGlzdC5cblxuICAgICAgW29mX3NlcXVlbmNlX211bHRpIGMgc2VxXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0X2V4biBjIChTZXF1ZW5jZS50b19saXN0IHNlcSldIGJ1dFxuICAgICAgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LlxuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2VfbXVsdGlcbiAgICA6ICAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EgKiAnYikgU2VxdWVuY2UudFxuICAgIC0+ICgnYSwgJ2IgbGlzdCwgJ2NtcCkgdFxuXG4gICgqKiBDb21iaW5lcyBhbiBhc3NvY2lhdGlvbiBzZXF1ZW5jZSBpbnRvIGEgbWFwLCBmb2xkaW5nIHRvZ2V0aGVyIGJvdW5kIHZhbHVlcyB3aXRoIGNvbW1vblxuICAgICAga2V5cy5cblxuICAgICAgW29mX3NlcXVlbmNlX2ZvbGQgYyBzZXEgfmluaXQgfmZdIGJlaGF2ZXMgbGlrZSBbb2ZfYWxpc3RfZm9sZCBjIChTZXF1ZW5jZS50b19saXN0IHNlcSkgfmluaXQgfmZdXG4gICAgICBidXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LlxuICAqKVxuICB2YWwgb2Zfc2VxdWVuY2VfZm9sZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gaW5pdDonY1xuICAgIC0+IGY6KCdjIC0+ICdiIC0+ICdjKVxuICAgIC0+ICgnYSwgJ2MsICdjbXApIHRcblxuICAoKiogQ29tYmluZXMgYW4gYXNzb2NpYXRpb24gc2VxdWVuY2UgaW50byBhIG1hcCwgcmVkdWNpbmcgdG9nZXRoZXIgYm91bmQgdmFsdWVzIHdpdGggY29tbW9uXG4gICAgICBrZXlzLlxuXG4gICAgICBbb2Zfc2VxdWVuY2VfcmVkdWNlIGMgc2VxIH5mXSBiZWhhdmVzIGxpa2UgW29mX2FsaXN0X3JlZHVjZSBjIChTZXF1ZW5jZS50b19saXN0IHNlcSkgfmZdXG4gICAgICBidXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIGludGVybWVkaWF0ZSBsaXN0LiAgKilcbiAgdmFsIG9mX3NlcXVlbmNlX3JlZHVjZVxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnYSAqICdiKSBTZXF1ZW5jZS50XG4gICAgLT4gZjooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgLT4gKCdhLCAnYiwgJ2NtcCkgdFxuXG4gICgqKiBUZXN0cyB3aGV0aGVyIGEgbWFwIGlzIGVtcHR5LiAqKVxuICB2YWwgaXNfZW1wdHkgOiAoXywgXywgXykgdCAtPiBib29sXG5cbiAgKCoqIFtsZW5ndGggbWFwXSByZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gW21hcF0uICBPKDEpLCBidXQgW1RyZWUubGVuZ3RoXSBpc1xuICAgICAgTyhuKS4gKilcbiAgdmFsIGxlbmd0aCA6IChfLCBfLCBfKSB0IC0+IGludFxuXG4gICgqKiBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGJpbmRpbmc7IGlmIHRoZSBrZXkgd2FzIGFscmVhZHkgYm91bmQsIGl0c1xuICAgICAgcHJldmlvdXMgYmluZGluZyBkaXNhcHBlYXJzLiAqKVxuICB2YWwgc2V0IDogKCdrLCAndiwgJ2NtcCkgdCAtPiBrZXk6J2sgLT4gZGF0YTondiAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFthZGQgdCB+a2V5IH5kYXRhXSBhZGRzIGEgbmV3IGVudHJ5IHRvIFt0XSBtYXBwaW5nIFtrZXldIHRvIFtkYXRhXSBhbmQgcmV0dXJucyBbYE9rXVxuICAgICAgd2l0aCB0aGUgbmV3IG1hcCwgb3IgaWYgW2tleV0gaXMgYWxyZWFkeSBwcmVzZW50IGluIFt0XSwgcmV0dXJucyBbYER1cGxpY2F0ZV0uICopXG4gIHZhbCBhZGQgOiAoJ2ssICd2LCAnY21wKSB0IC0+IGtleTonayAtPiBkYXRhOid2IC0+ICgnaywgJ3YsICdjbXApIHQgT3JfZHVwbGljYXRlLnRcblxuICB2YWwgYWRkX2V4biA6ICgnaywgJ3YsICdjbXApIHQgLT4ga2V5OidrIC0+IGRhdGE6J3YgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBJZiBba2V5XSBpcyBub3QgcHJlc2VudCB0aGVuIGFkZCBhIHNpbmdsZXRvbiBsaXN0LCBvdGhlcndpc2UsIGNvbnMgZGF0YSBvbnRvIHRoZVxuICAgICAgaGVhZCBvZiB0aGUgZXhpc3RpbmcgbGlzdC4gKilcbiAgdmFsIGFkZF9tdWx0aSA6ICgnaywgJ3YgbGlzdCwgJ2NtcCkgdCAtPiBrZXk6J2sgLT4gZGF0YTondiAtPiAoJ2ssICd2IGxpc3QsICdjbXApIHRcblxuICAoKiogSWYgdGhlIGtleSBpcyBwcmVzZW50LCB0aGVuIHJlbW92ZSBpdHMgaGVhZCBlbGVtZW50OyBpZiB0aGUgcmVzdWx0IGlzIGVtcHR5LCByZW1vdmVcbiAgICAgIHRoZSBrZXkuICopXG4gIHZhbCByZW1vdmVfbXVsdGkgOiAoJ2ssICd2IGxpc3QsICdjbXApIHQgLT4gJ2sgLT4gKCdrLCAndiBsaXN0LCAnY21wKSB0XG5cbiAgKCoqIFJldHVybnMgdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBnaXZlbiBrZXksIG9yIHRoZSBlbXB0eSBsaXN0IGlmIHRoZXJlIGlzIG5vbmUuICopXG4gIHZhbCBmaW5kX211bHRpIDogKCdrLCAndiBsaXN0LCAnY21wKSB0IC0+ICdrIC0+ICd2IGxpc3RcblxuICAoKiogW2NoYW5nZSB0IGtleSB+Zl0gcmV0dXJucyBhIG5ldyBtYXAgW21dIHRoYXQgaXMgdGhlIHNhbWUgYXMgW3RdIG9uIGFsbCBrZXlzIGV4Y2VwdFxuICAgICAgZm9yIFtrZXldLCBhbmQgd2hvc2UgdmFsdWUgZm9yIFtrZXldIGlzIGRlZmluZWQgYnkgW2ZdLCBpLmUuLCBbZmluZCBtIGtleSA9IGYgKGZpbmRcbiAgICAgIHQga2V5KV0uICopXG4gIHZhbCBjaGFuZ2UgOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+IGY6KCd2IG9wdGlvbiAtPiAndiBvcHRpb24pIC0+ICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogW3VwZGF0ZSB0IGtleSB+Zl0gaXMgW2NoYW5nZSB0IGtleSB+ZjooZnVuIG8gLT4gU29tZSAoZiBvKSldLiAqKVxuICB2YWwgdXBkYXRlIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiBmOigndiBvcHRpb24gLT4gJ3YpIC0+ICgnaywgJ3YsICdjbXApIHRcblxuXG4gICgqKiBSZXR1cm5zIFtTb21lIHZhbHVlXSBib3VuZCB0byB0aGUgZ2l2ZW4ga2V5LCBvciBbTm9uZV0gaWYgbm9uZSBleGlzdHMuICopXG4gIHZhbCBmaW5kIDogKCdrLCAndiwgJ2NtcCkgdCAtPiAnayAtPiAndiBvcHRpb25cblxuICAoKiogUmV0dXJucyB0aGUgdmFsdWUgYm91bmQgdG8gdGhlIGdpdmVuIGtleSwgcmFpc2luZyBbQ2FtbC5Ob3RfZm91bmRdIG9yIFtOb3RfZm91bmRfc11cbiAgICAgIGlmIG5vbmUgZXhpc3RzLiAqKVxuICB2YWwgZmluZF9leG4gOiAoJ2ssICd2LCAnY21wKSB0IC0+ICdrIC0+ICd2XG5cbiAgKCoqIFJldHVybnMgYSBuZXcgbWFwIHdpdGggYW55IGJpbmRpbmcgZm9yIHRoZSBrZXkgaW4gcXVlc3Rpb24gcmVtb3ZlZC4gKilcbiAgdmFsIHJlbW92ZSA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbbWVtIG1hcCBrZXldIHRlc3RzIHdoZXRoZXIgW21hcF0gY29udGFpbnMgYSBiaW5kaW5nIGZvciBba2V5XS4gKilcbiAgdmFsIG1lbSA6ICgnaywgXywgJ2NtcCkgdCAtPiAnayAtPiBib29sXG5cbiAgdmFsIGl0ZXJfa2V5cyA6ICgnaywgXywgXykgdCAtPiBmOignayAtPiB1bml0KSAtPiB1bml0XG4gIHZhbCBpdGVyIDogKF8sICd2LCBfKSB0IC0+IGY6KCd2IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXJpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiB1bml0KSAtPiB1bml0XG5cbiAgKCoqIEl0ZXJhdGVzIHVudGlsIHRoZSBmaXJzdCB0aW1lIFtmXSByZXR1cm5zIFtTdG9wXS4gSWYgW2ZdIHJldHVybnMgW1N0b3BdLCB0aGUgZmluYWxcbiAgICAgIHJlc3VsdCBpcyBbVW5maW5pc2hlZF0uIE90aGVyd2lzZSwgdGhlIGZpbmFsIHJlc3VsdCBpcyBbRmluaXNoZWRdLiAqKVxuICB2YWwgaXRlcmlfdW50aWxcbiAgICA6ICAoJ2ssICd2LCBfKSB0XG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IEZpbmlzaGVkX29yX3VuZmluaXNoZWQudFxuXG4gICgqKiBJdGVyYXRlcyB0d28gbWFwcyBzaWRlIGJ5IHNpZGUuIFRoZSBjb21wbGV4aXR5IG9mIHRoaXMgZnVuY3Rpb24gaXMgTyhNICsgTikuICBJZiB0d29cbiAgICAgIGlucHV0cyBhcmUgW1soMCwgYSk7ICgxLCBhKV1dIGFuZCBbWygxLCBiKTsgKDIsIGIpXV0sIFtmXSB3aWxsIGJlIGNhbGxlZCB3aXRoIFtbKDAsXG4gICAgICBgTGVmdCBhKTsgKDEsIGBCb3RoIChhLCBiKSk7ICgyLCBgUmlnaHQgYildXS4gKilcbiAgdmFsIGl0ZXIyXG4gICAgOiAgKCdrLCAndjEsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOigndjEsICd2MikgTWVyZ2VfZWxlbWVudC50IC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gICgqKiBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGJvdW5kIHZhbHVlcyByZXBsYWNlZCBieSBbZl0gYXBwbGllZCB0byB0aGUgYm91bmQgdmFsdWVzLiopXG4gIHZhbCBtYXAgOiAoJ2ssICd2MSwgJ2NtcCkgdCAtPiBmOigndjEgLT4gJ3YyKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuXG4gICgqKiBMaWtlIFttYXBdLCBidXQgdGhlIHBhc3NlZCBmdW5jdGlvbiB0YWtlcyBib3RoIFtrZXldIGFuZCBbZGF0YV0gYXMgYXJndW1lbnRzLiAqKVxuICB2YWwgbWFwaSA6ICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2MSAtPiAndjIpIC0+ICgnaywgJ3YyLCAnY21wKSB0XG5cbiAgKCoqIENvbnZlcnQgbWFwIHdpdGgga2V5cyBvZiB0eXBlIFsnazJdIHRvIGEgbWFwIHdpdGgga2V5cyBvZiB0eXBlIFsnazJdIHVzaW5nIFtmXS4gKilcbiAgdmFsIG1hcF9rZXlzXG4gICAgOiAgKCdrMiwgJ2NtcDIpIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2sxLCAndiwgJ2NtcDEpIHRcbiAgICAtPiBmOignazEgLT4gJ2syKVxuICAgIC0+IFsgYE9rIG9mICgnazIsICd2LCAnY21wMikgdCB8IGBEdXBsaWNhdGVfa2V5IG9mICdrMiBdXG5cbiAgKCoqIExpa2UgW21hcF9rZXlzXSwgYnV0IHJhaXNlcyBvbiBkdXBsaWNhdGUga2V5LiAqKVxuICB2YWwgbWFwX2tleXNfZXhuXG4gICAgOiAgKCdrMiwgJ2NtcDIpIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2sxLCAndiwgJ2NtcDEpIHRcbiAgICAtPiBmOignazEgLT4gJ2syKVxuICAgIC0+ICgnazIsICd2LCAnY21wMikgdFxuXG4gICgqKiBGb2xkcyBvdmVyIGtleXMgYW5kIGRhdGEgaW4gdGhlIG1hcCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIFtrZXldLiAqKVxuICB2YWwgZm9sZCA6ICgnaywgJ3YsIF8pIHQgLT4gaW5pdDonYSAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAnYSkgLT4gJ2FcblxuICAoKiogRm9sZHMgb3ZlciBrZXlzIGFuZCBkYXRhIGluIHRoZSBtYXAgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBba2V5XSwgdW50aWwgdGhlIGZpcnN0XG4gICAgICB0aW1lIHRoYXQgW2ZdIHJldHVybnMgW1N0b3AgX10uIElmIFtmXSByZXR1cm5zIFtTdG9wIGZpbmFsXSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zXG4gICAgICBpbW1lZGlhdGVseSB3aXRoIHRoZSB2YWx1ZSBbZmluYWxdLiBJZiBbZl0gbmV2ZXIgcmV0dXJucyBbU3RvcCBfXSwgYW5kIHRoZSBmaW5hbFxuICAgICAgY2FsbCB0byBbZl0gcmV0dXJucyBbQ29udGludWUgbGFzdF0sIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBbZmluaXNoIGxhc3RdLiAqKVxuICB2YWwgZm9sZF91bnRpbFxuICAgIDogICgnaywgJ3YsIF8pIHRcbiAgICAtPiBpbml0OidhY2NcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYWNjIC0+ICgnYWNjLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICAoKiogRm9sZHMgb3ZlciBrZXlzIGFuZCBkYXRhIGluIHRoZSBtYXAgaW4gZGVjcmVhc2luZyBvcmRlciBvZiBba2V5XS4gKilcbiAgdmFsIGZvbGRfcmlnaHQgOiAoJ2ssICd2LCBfKSB0IC0+IGluaXQ6J2EgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gJ2EgLT4gJ2EpIC0+ICdhXG5cbiAgKCoqIEZvbGRzIG92ZXIgdHdvIG1hcHMgc2lkZSBieSBzaWRlLCBsaWtlIFtpdGVyMl0uICopXG4gIHZhbCBmb2xkMlxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6KCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gJ2EgLT4gJ2EpXG4gICAgLT4gJ2FcblxuICAoKiogW2ZpbHRlcl0sIFtmaWx0ZXJpXSwgW2ZpbHRlcl9rZXlzXSwgW2ZpbHRlcl9tYXBdLCBhbmQgW2ZpbHRlcl9tYXBpXSBydW4gaW4gTyhuICogbGdcbiAgICAgIG4pIHRpbWU7IHRoZXkgc2ltcGx5IGFjY3VtdWxhdGUgZWFjaCBrZXkgJiBkYXRhIHBhaXIgcmV0YWluZWQgYnkgW2ZdIGludG8gYSBuZXcgbWFwXG4gICAgICB1c2luZyBbYWRkXS4gKilcbiAgdmFsIGZpbHRlcl9rZXlzIDogKCdrLCAndiwgJ2NtcCkgdCAtPiBmOignayAtPiBib29sKSAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgdmFsIGZpbHRlciA6ICgnaywgJ3YsICdjbXApIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICB2YWwgZmlsdGVyaSA6ICgnaywgJ3YsICdjbXApIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBSZXR1cm5zIGEgbmV3IG1hcCB3aXRoIGJvdW5kIHZhbHVlcyBmaWx0ZXJlZCBieSBbZl0gYXBwbGllZCB0byB0aGUgYm91bmQgdmFsdWVzLiAqKVxuICB2YWwgZmlsdGVyX21hcCA6ICgnaywgJ3YxLCAnY21wKSB0IC0+IGY6KCd2MSAtPiAndjIgb3B0aW9uKSAtPiAoJ2ssICd2MiwgJ2NtcCkgdFxuXG4gICgqKiBMaWtlIFtmaWx0ZXJfbWFwXSwgYnV0IHRoZSBwYXNzZWQgZnVuY3Rpb24gdGFrZXMgYm90aCBba2V5XSBhbmQgW2RhdGFdIGFzXG4gICAgICBhcmd1bWVudHMuICopXG4gIHZhbCBmaWx0ZXJfbWFwaVxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YxIC0+ICd2MiBvcHRpb24pXG4gICAgLT4gKCdrLCAndjIsICdjbXApIHRcblxuICAoKiogW3BhcnRpdGlvbl9tYXBpIHQgfmZdIHJldHVybnMgdHdvIG5ldyBbdF1zLCB3aXRoIGVhY2gga2V5IGluIFt0XSBhcHBlYXJpbmcgaW5cbiAgICAgIGV4YWN0bHkgb25lIG9mIHRoZSByZXN1bHRpbmcgbWFwcyBkZXBlbmRpbmcgb24gaXRzIG1hcHBpbmcgaW4gW2ZdLiAqKVxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+IGY6KGtleTonayAtPiBkYXRhOid2MSAtPiAoJ3YyLCAndjMpIEVpdGhlci50KVxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0ICogKCdrLCAndjMsICdjbXApIHRcblxuICAoKiogW3BhcnRpdGlvbl9tYXAgdCB+ZiA9IHBhcnRpdGlvbl9tYXBpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKV0gKilcbiAgdmFsIHBhcnRpdGlvbl9tYXBcbiAgICA6ICAoJ2ssICd2MSwgJ2NtcCkgdFxuICAgIC0+IGY6KCd2MSAtPiAoJ3YyLCAndjMpIEVpdGhlci50KVxuICAgIC0+ICgnaywgJ3YyLCAnY21wKSB0ICogKCdrLCAndjMsICdjbXApIHRcblxuICAoKipcbiAgICAge1tcbiAgICAgICBwYXJ0aXRpb25pX3RmIHQgfmZcbiAgICAgICA9XG4gICAgICAgcGFydGl0aW9uX21hcGkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICAgICAgIGlmIGYgfmtleSB+ZGF0YVxuICAgICAgICAgdGhlbiBGaXJzdCBkYXRhXG4gICAgICAgICBlbHNlIFNlY29uZCBkYXRhKVxuICAgICBdfSAqKVxuICB2YWwgcGFydGl0aW9uaV90ZlxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBib29sKVxuICAgIC0+ICgnaywgJ3YsICdjbXApIHQgKiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFtwYXJ0aXRpb25fdGYgdCB+ZiA9IHBhcnRpdGlvbmlfdGYgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXSAqKVxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGY6KCd2IC0+IGJvb2wpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnaywgJ3YsICdjbXApIHRcblxuICAoKiogUHJvZHVjZXMgW09rXSBvZiBhIG1hcCBpbmNsdWRpbmcgYWxsIGtleXMgaWYgYWxsIGRhdGEgaXMgW09rXSwgb3IgYW4gW0Vycm9yXVxuICAgICAgaW5jbHVkaW5nIGFsbCBlcnJvcnMgb3RoZXJ3aXNlLiAqKVxuICB2YWwgY29tYmluZV9lcnJvcnMgOiAoJ2ssICd2IE9yX2Vycm9yLnQsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCBPcl9lcnJvci50XG5cbiAgKCoqIFJldHVybnMgYSB0b3RhbCBvcmRlcmluZyBiZXR3ZWVuIG1hcHMuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHRvdGFsIG9yZGVyaW5nIHVzZWRcbiAgICAgIHRvIGNvbXBhcmUgZGF0YSBhc3NvY2lhdGVkIHdpdGggZXF1YWwga2V5cyBpbiB0aGUgdHdvIG1hcHMuICopXG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgndiAtPiAndiAtPiBpbnQpIC0+ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiBpbnRcblxuICAoKiogSGFzaCBmdW5jdGlvbjogYSBidWlsZGluZyBibG9jayB0byB1c2Ugd2hlbiBoYXNoaW5nIGRhdGEgc3RydWN0dXJlcyBjb250YWluaW5nIG1hcHMgaW5cbiAgICAgIHRoZW0uIFtoYXNoX2ZvbGRfZGlyZWN0IGhhc2hfZm9sZF9rZXldIGlzIGNvbXBhdGlibGUgd2l0aCBbY29tcGFyZV9kaXJlY3RdIGlmZlxuICAgICAgW2hhc2hfZm9sZF9rZXldIGlzIGNvbXBhdGlibGUgd2l0aCBbKGNvbXBhcmF0b3IgbSkuY29tcGFyZV0gb2YgdGhlIG1hcCBbbV0gYmVpbmdcbiAgICAgIGhhc2hlZC4gKilcbiAgdmFsIGhhc2hfZm9sZF9kaXJlY3QgOiAnayBIYXNoLmZvbGRlciAtPiAndiBIYXNoLmZvbGRlciAtPiAoJ2ssICd2LCAnY21wKSB0IEhhc2guZm9sZGVyXG5cbiAgKCoqIFtlcXVhbCBjbXAgbTEgbTJdIHRlc3RzIHdoZXRoZXIgdGhlIG1hcHMgW20xXSBhbmQgW20yXSBhcmUgZXF1YWwsIHRoYXQgaXMsIGNvbnRhaW5cbiAgICAgIHRoZSBzYW1lIGtleXMgYW5kIGFzc29jaWF0ZSBlYWNoIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgW2NtcF0gaXMgdGhlIGVxdWFsaXR5XG4gICAgICBwcmVkaWNhdGUgdXNlZCB0byBjb21wYXJlIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXlzLiAqKVxuICB2YWwgZXF1YWwgOiAoJ3YgLT4gJ3YgLT4gYm9vbCkgLT4gKCdrLCAndiwgJ2NtcCkgdCAtPiAoJ2ssICd2LCAnY21wKSB0IC0+IGJvb2xcblxuICAoKiogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGtleXMgaW4gdGhlIGdpdmVuIG1hcC4gKilcbiAgdmFsIGtleXMgOiAoJ2ssIF8sIF8pIHQgLT4gJ2sgbGlzdFxuXG4gICgqKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZGF0YSBpbiB0aGUgZ2l2ZW4gbWFwLiAqKVxuICB2YWwgZGF0YSA6IChfLCAndiwgXykgdCAtPiAndiBsaXN0XG5cbiAgKCoqIENyZWF0ZXMgYW4gYXNzb2NpYXRpb24gbGlzdCBmcm9tIHRoZSBnaXZlbiBtYXAuICopXG4gIHZhbCB0b19hbGlzdFxuICAgIDogID9rZXlfb3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF0gKCoqIGRlZmF1bHQgaXMgW2BJbmNyZWFzaW5nXSAqKVxuICAgIC0+ICgnaywgJ3YsIF8pIHRcbiAgICAtPiAoJ2sgKiAndikgbGlzdFxuXG4gICgqKiB7MiBBZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24gbWFwc30gKilcblxuICAoKiogTWVyZ2VzIHR3byBtYXBzLiBUaGUgcnVudGltZSBpcyBPKGxlbmd0aCh0MSkgKyBsZW5ndGgodDIpKS4gWW91IHNob3VsZG4ndCB1c2UgdGhpc1xuICAgICAgZnVuY3Rpb24gdG8gbWVyZ2UgYSBsaXN0IG9mIG1hcHM7IGNvbnNpZGVyIHVzaW5nIFttZXJnZV9za2V3ZWRdIGluc3RlYWQuICopXG4gIHZhbCBtZXJnZVxuICAgIDogICgnaywgJ3YxLCAnY21wKSB0XG4gICAgLT4gKCdrLCAndjIsICdjbXApIHRcbiAgICAtPiBmOihrZXk6J2sgLT4gKCd2MSwgJ3YyKSBNZXJnZV9lbGVtZW50LnQgLT4gJ3YzIG9wdGlvbilcbiAgICAtPiAoJ2ssICd2MywgJ2NtcCkgdFxuXG4gICgqKiBBIHNwZWNpYWwgY2FzZSBvZiBbbWVyZ2VdLCBbbWVyZ2Vfc2tld2VkIHQxIHQyXSBpcyBhIG1hcCBjb250YWluaW5nIGFsbCB0aGVcbiAgICAgIGJpbmRpbmdzIG9mIFt0MV0gYW5kIFt0Ml0uIEJpbmRpbmdzIHRoYXQgYXBwZWFyIGluIGJvdGggW3QxXSBhbmQgW3QyXSBhcmVcbiAgICAgIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgdmFsdWUgdXNpbmcgdGhlIFtjb21iaW5lXSBmdW5jdGlvbi4gSW4gYSBjYWxsXG4gICAgICBbY29tYmluZSB+a2V5IHYxIHYyXSwgdGhlIHZhbHVlIFt2MV0gY29tZXMgZnJvbSBbdDFdIGFuZCBbdjJdIGZyb20gW3QyXS5cblxuICAgICAgVGhlIHJ1bnRpbWUgb2YgW21lcmdlX3NrZXdlZF0gaXMgW08obWluKGwxLCBsMikgKiBsb2cobWF4KGwxLCBsMikpKV0sIHdoZXJlIFtsMV0gaXNcbiAgICAgIHRoZSBsZW5ndGggb2YgW3QxXSBhbmQgW2wyXSB0aGUgbGVuZ3RoIG9mIFt0Ml0uIFRoaXMgaXMgbGlrZWx5IHRvIGJlIGZhc3RlciB0aGFuXG4gICAgICBbbWVyZ2VdIHdoZW4gb25lIG9mIHRoZSBtYXBzIGlzIGEgbG90IHNtYWxsZXIsIG9yIHdoZW4geW91IG1lcmdlIGEgbGlzdCBvZiBtYXBzLiAqKVxuICB2YWwgbWVyZ2Vfc2tld2VkXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21iaW5lOihrZXk6J2sgLT4gJ3YgLT4gJ3YgLT4gJ3YpXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIG1vZHVsZSBTeW1tZXRyaWNfZGlmZl9lbGVtZW50IDogc2lnXG4gICAgdHlwZSAoJ2ssICd2KSB0ID0gJ2sgKiBbIGBMZWZ0IG9mICd2IHwgYFJpZ2h0IG9mICd2IHwgYFVuZXF1YWwgb2YgJ3YgKiAndiBdXG4gICAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5Db21wYXJhYmxlLlMyIHdpdGggdHlwZSAoJ2ssICd2KSB0IDo9ICgnaywgJ3YpIHRcbiAgICBpbmNsdWRlIFBweF9jb21wYXJlX2xpYi5FcXVhbC5TMiB3aXRoIHR5cGUgKCdrLCAndikgdCA6PSAoJ2ssICd2KSB0XG4gICAgaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZS5TMiB3aXRoIHR5cGUgKCdrLCAndikgdCA6PSAoJ2ssICd2KSB0XG5cbiAgICB2YWwgdF9zZXhwX2dyYW1tYXJcbiAgICAgIDogICdrIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgICAtPiAndiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgICAgLT4gKCdrLCAndikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gICAgW0BAQGVuZF1cbiAgZW5kXG5cbiAgKCoqIFtzeW1tZXRyaWNfZGlmZiB0MSB0MiB+ZGF0YV9lcXVhbF0gcmV0dXJucyBhIGxpc3Qgb2YgY2hhbmdlcyBiZXR3ZWVuIFt0MV0gYW5kIFt0Ml0uXG4gICAgICBJdCBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQgaW4gdGhlIGNhc2Ugd2hlcmUgW3QxXSBhbmQgW3QyXSBzaGFyZSBhIGxhcmdlIGFtb3VudFxuICAgICAgb2Ygc3RydWN0dXJlLiBUaGUga2V5cyBpbiB0aGUgb3V0cHV0IHNlcXVlbmNlIHdpbGwgYmUgaW4gc29ydGVkIG9yZGVyLlxuXG4gICAgICBJdCBpcyBhc3N1bWVkIHRoYXQgW2RhdGFfZXF1YWxdIGlzIGF0IGxlYXN0IGFzIGVxdWF0aW5nIGFzIHBoeXNpY2FsIGVxdWFsaXR5OiB0aGF0XG4gICAgICBbcGh5c19lcXVhbCB4IHldIGltcGxpZXMgW2RhdGFfZXF1YWwgeCB5XS4gT3RoZXJ3aXNlLCBbc3ltbWV0cmljX2RpZmZdIG1heSBiZWhhdmUgaW5cbiAgICAgIHVuZXhwZWN0ZWQgd2F5cy4gRm9yIGV4YW1wbGUsIHdpdGggW35kYXRhX2VxdWFsOihmdW4gXyBfIC0+IGZhbHNlKV0gaXQgaXMgTk9UXG4gICAgICBuZWNlc3NhcmlseSB0aGUgY2FzZSB0aGUgcmVzdWx0aW5nIGNoYW5nZSBzZXF1ZW5jZSB3aWxsIGNvbnRhaW4gYW4gZWxlbWVudFxuICAgICAgWyhrLCBgVW5lcXVhbCBfKV0gZm9yIGV2ZXJ5IGtleSBba10gc2hhcmVkIGJ5IGJvdGggbWFwcy5cblxuICAgICAgV2FybmluZzogRmxvYXQgZXF1YWxpdHkgdmlvbGF0ZXMgdGhpcyBwcm9wZXJ0eSEgW3BoeXNfZXF1YWwgRmxvYXQubmFuIEZsb2F0Lm5hbl0gaXNcbiAgICAgIHRydWUsIGJ1dCBbRmxvYXQuKD0pIEZsb2F0Lm5hbiBGbG9hdC5uYW5dIGlzIGZhbHNlLiAqKVxuICB2YWwgc3ltbWV0cmljX2RpZmZcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGRhdGFfZXF1YWw6KCd2IC0+ICd2IC0+IGJvb2wpXG4gICAgLT4gKCdrLCAndikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICAoKiogW2ZvbGRfc3ltbWV0cmljX2RpZmYgdDEgdDIgfmRhdGFfZXF1YWxdIGZvbGRzIGFjcm9zcyBhbiBpbXBsaWNpdCBzZXF1ZW5jZSBvZiBjaGFuZ2VzXG4gICAgICBiZXR3ZWVuIFt0MV0gYW5kIFt0Ml0sIGluIHNvcnRlZCBvcmRlciBieSBrZXlzLiBFcXVpdmFsZW50IHRvXG4gICAgICBbU2VxdWVuY2UuZm9sZCAoc3ltbWV0cmljX2RpZmYgdDEgdDIgfmRhdGFfZXF1YWwpXSwgYW5kIG1vcmUgZWZmaWNpZW50LiAqKVxuICB2YWwgZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gZGF0YV9lcXVhbDooJ3YgLT4gJ3YgLT4gYm9vbClcbiAgICAtPiBpbml0OidhXG4gICAgLT4gZjooJ2EgLT4gKCdrLCAndikgU3ltbWV0cmljX2RpZmZfZWxlbWVudC50IC0+ICdhKVxuICAgIC0+ICdhXG5cbiAgKCoqIFttaW5fZWx0IG1hcF0gcmV0dXJucyBbU29tZSAoa2V5LCBkYXRhKV0gcGFpciBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaW5pbXVtIGtleSBpblxuICAgICAgW21hcF0sIG9yIFtOb25lXSBpZiBlbXB0eS4gKilcbiAgdmFsIG1pbl9lbHQgOiAoJ2ssICd2LCBfKSB0IC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2ssICd2LCBfKSB0IC0+ICdrICogJ3ZcblxuICAoKiogW21heF9lbHQgbWFwXSByZXR1cm5zIFtTb21lIChrZXksIGRhdGEpXSBwYWlyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1heGltdW0ga2V5IGluXG4gICAgICBbbWFwXSwgb3IgW05vbmVdIGlmIFttYXBdIGlzIGVtcHR5LiAqKVxuICB2YWwgbWF4X2VsdCA6ICgnaywgJ3YsIF8pIHQgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gIHZhbCBtYXhfZWx0X2V4biA6ICgnaywgJ3YsIF8pIHQgLT4gJ2sgKiAndlxuXG4gICgqKiBUaGVzZSBmdW5jdGlvbnMgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgc2ltaWxhciBmdW5jdGlvbnMgaW4gW0xpc3RdLiAqKVxuXG4gIHZhbCBmb3JfYWxsIDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBmb3JfYWxsaSA6ICgnaywgJ3YsIF8pIHQgLT4gZjooa2V5OidrIC0+IGRhdGE6J3YgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKCdrLCAndiwgXykgdCAtPiBmOigndiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBleGlzdHNpIDogKCdrLCAndiwgXykgdCAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudCA6ICgnaywgJ3YsIF8pIHQgLT4gZjooJ3YgLT4gYm9vbCkgLT4gaW50XG4gIHZhbCBjb3VudGkgOiAoJ2ssICd2LCBfKSB0IC0+IGY6KGtleTonayAtPiBkYXRhOid2IC0+IGJvb2wpIC0+IGludFxuXG5cbiAgKCoqIFtzcGxpdCB0IGtleV0gcmV0dXJucyBhIG1hcCBvZiBrZXlzIHN0cmljdGx5IGxlc3MgdGhhbiBba2V5XSwgdGhlIG1hcHBpbmcgb2YgW2tleV0gaWZcbiAgICAgIGFueSwgYW5kIGEgbWFwIG9mIGtleXMgc3RyaWN0bHkgZ3JlYXRlciB0aGFuIFtrZXldLlxuXG4gICAgICBSdW50aW1lIGlzIE8obSArIGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgbWFwIGFuZCBtIGlzIHRoZSBzaXplIG9mXG4gICAgICB0aGUgc21hbGxlciBvZiB0aGUgdHdvIG91dHB1dCBtYXBzLiAgVGhlIE8obSkgdGVybSBpcyBkdWUgdG8gdGhlIG5lZWQgdG8gY2FsY3VsYXRlXG4gICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgbWFwcy4gKilcbiAgdmFsIHNwbGl0XG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICdrXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdCAqICgnayAqICd2KSBvcHRpb24gKiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFthcHBlbmQgfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnRdIHJldHVybnMgW2BPayBtYXBdIHdoZXJlIFttYXBdIGNvbnRhaW5zIGFsbCB0aGVcbiAgICAgIFsoa2V5LCB2YWx1ZSldIHBhaXJzIGZyb20gdGhlIHR3byBpbnB1dCBtYXBzIGlmIGFsbCB0aGUga2V5cyBmcm9tIFtsb3dlcl9wYXJ0XSBhcmVcbiAgICAgIGxlc3MgdGhhbiBhbGwgdGhlIGtleXMgZnJvbSBbdXBwZXJfcGFydF0uICBPdGhlcndpc2UgaXQgcmV0dXJuc1xuICAgICAgW2BPdmVybGFwcGluZ19rZXlfcmFuZ2VzXS5cblxuICAgICAgUnVudGltZSBpcyBPKGxvZyBuKSB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXIgaW5wdXQgbWFwLiAgVGhpcyBjYW4gYmVcbiAgICAgIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gW01hcC5tZXJnZV0gb3IgcmVwZWF0ZWQgW01hcC5hZGRdLlxuXG4gICAgICB7W1xuICAgICAgICBhc3NlcnQgKG1hdGNoIE1hcC5hcHBlbmQgfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnQgd2l0aFxuICAgICAgICAgIHwgYE9rIHdob2xlX21hcCAtPlxuICAgICAgICAgICAgTWFwLnRvX2FsaXN0IHdob2xlX21hcFxuICAgICAgICAgICAgPSBMaXN0LmFwcGVuZCAodG9fYWxpc3QgbG93ZXJfcGFydCkgKHRvX2FsaXN0IHVwcGVyX3BhcnQpXG4gICAgICAgICAgfCBgT3ZlcmxhcHBpbmdfa2V5X3JhbmdlcyAtPiB0cnVlKTtcbiAgICAgIF19ICopXG4gIHZhbCBhcHBlbmRcbiAgICA6ICBsb3dlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAtPiB1cHBlcl9wYXJ0OignaywgJ3YsICdjbXApIHRcbiAgICAtPiBbIGBPayBvZiAoJ2ssICd2LCAnY21wKSB0IHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgXVxuXG4gICgqKiBbc3VicmFuZ2UgdCB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kXSByZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBlbnRyaWVzIGZyb21cbiAgICAgIFt0XSB3aG9zZSBrZXlzIGxpZSBpbnNpZGUgdGhlIGludGVydmFsIGluZGljYXRlZCBieSBbfmxvd2VyX2JvdW5kXSBhbmRcbiAgICAgIFt+dXBwZXJfYm91bmRdLiAgSWYgdGhpcyBpbnRlcnZhbCBpcyBlbXB0eSwgYW4gZW1wdHkgbWFwIGlzIHJldHVybmVkLlxuXG4gICAgICBSdW50aW1lIGlzIE8obSArIGxvZyBuKSwgd2hlcmUgbiBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgbWFwIGFuZCBtIGlzIHRoZSBzaXplIG9mXG4gICAgICB0aGUgb3V0cHV0IG1hcC4gIFRoZSBPKG0pIHRlcm0gaXMgZHVlIHRvIHRoZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgb3V0cHV0IG1hcC4gKilcbiAgdmFsIHN1YnJhbmdlXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGxvd2VyX2JvdW5kOidrIE1heWJlX2JvdW5kLnRcbiAgICAtPiB1cHBlcl9ib3VuZDonayBNYXliZV9ib3VuZC50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBbZm9sZF9yYW5nZV9pbmNsdXNpdmUgdCB+bWluIH5tYXggfmluaXQgfmZdIGZvbGRzIFtmXSAod2l0aCBpbml0aWFsIHZhbHVlIFt+aW5pdF0pXG4gICAgICBvdmVyIGFsbCBrZXlzIChhbmQgdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMpIHRoYXQgYXJlIGluIHRoZSByYW5nZSBbW21pbiwgbWF4XV1cbiAgICAgIChpbmNsdXNpdmUpLiAgKilcbiAgdmFsIGZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IG1pbjona1xuICAgIC0+IG1heDona1xuICAgIC0+IGluaXQ6J2FcbiAgICAtPiBmOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYSAtPiAnYSlcbiAgICAtPiAnYVxuXG4gICgqKiBbcmFuZ2VfdG9fYWxpc3QgdCB+bWluIH5tYXhdIHJldHVybnMgYW4gYXNzb2NpYXRpdmUgbGlzdCBvZiB0aGUgZWxlbWVudHMgd2hvc2Uga2V5c1xuICAgICAgbGllIGluIFtbbWluLCBtYXhdXSAoaW5jbHVzaXZlKSwgd2l0aCB0aGUgc21hbGxlc3Qga2V5IGJlaW5nIGF0IHRoZSBoZWFkIG9mIHRoZVxuICAgICAgbGlzdC4gKilcbiAgdmFsIHJhbmdlX3RvX2FsaXN0IDogKCdrLCAndiwgJ2NtcCkgdCAtPiBtaW46J2sgLT4gbWF4OidrIC0+ICgnayAqICd2KSBsaXN0XG5cbiAgKCoqIFtjbG9zZXN0X2tleSB0IGRpciBrXSByZXR1cm5zIHRoZSBbKGtleSwgdmFsdWUpXSBwYWlyIGluIFt0XSB3aXRoIFtrZXldIGNsb3Nlc3QgdG9cbiAgICAgIFtrXSB0aGF0IHNhdGlzZmllcyB0aGUgZ2l2ZW4gaW5lcXVhbGl0eSBib3VuZC5cblxuICAgICAgRm9yIGV4YW1wbGUsIFtjbG9zZXN0X2tleSB0IGBMZXNzX3RoYW4ga10gd291bGQgYmUgdGhlIHBhaXIgd2l0aCB0aGUgY2xvc2VzdCBrZXkgdG9cbiAgICAgIFtrXSB3aGVyZSBba2V5IDwga10uXG5cbiAgICAgIFt0b19zZXF1ZW5jZV0gY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdHMgYXMgW2Nsb3Nlc3Rfa2V5XS4gIEl0IGlzIGxlc3NcbiAgICAgIGVmZmljaWVudCBmb3IgaW5kaXZpZHVhbCBsb29rdXBzIGJ1dCBtb3JlIGVmZmljaWVudCBmb3IgZmluZGluZyBtYW55IGVsZW1lbnRzIHN0YXJ0aW5nXG4gICAgICBhdCBzb21lIHZhbHVlLiAqKVxuICB2YWwgY2xvc2VzdF9rZXlcbiAgICA6ICAoJ2ssICd2LCAnY21wKSB0XG4gICAgLT4gWyBgR3JlYXRlcl9vcl9lcXVhbF90byB8IGBHcmVhdGVyX3RoYW4gfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gXVxuICAgIC0+ICdrXG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gICgqKiBbbnRoIHQgbl0gZmluZHMgdGhlIChrZXksIHZhbHVlKSBwYWlyIG9mIHJhbmsgbiAoaS5lLiwgc3VjaCB0aGF0IHRoZXJlIGFyZSBleGFjdGx5IG5cbiAgICAgIGtleXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSBmb3VuZCBrZXkpLCBpZiBvbmUgZXhpc3RzLiAgTyhsb2cobGVuZ3RoIHQpICsgbikgdGltZS4gKilcbiAgdmFsIG50aCA6ICgnaywgJ3YsIF8pIHQgLT4gaW50IC0+ICgnayAqICd2KSBvcHRpb25cblxuICB2YWwgbnRoX2V4biA6ICgnaywgJ3YsIF8pIHQgLT4gaW50IC0+ICdrICogJ3ZcblxuICAoKiogW3JhbmsgdCBrXSBJZiBba10gaXMgaW4gW3RdLCByZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBzdHJpY3RseSBsZXNzIHRoYW4gW2tdIGluXG4gICAgICBbdF0sIGFuZCBbTm9uZV0gb3RoZXJ3aXNlLiAqKVxuICB2YWwgcmFuayA6ICgnaywgJ3YsICdjbXApIHQgLT4gJ2sgLT4gaW50IG9wdGlvblxuXG5cblxuICAoKiogW3RvX3NlcXVlbmNlID9vcmRlciA/a2V5c19ncmVhdGVyX29yX2VxdWFsX3RvID9rZXlzX2xlc3Nfb3JfZXF1YWxfdG8gdF1cbiAgICAgIGdpdmVzIGEgc2VxdWVuY2Ugb2Yga2V5LXZhbHVlIHBhaXJzIGJldHdlZW4gW2tleXNfbGVzc19vcl9lcXVhbF90b10gYW5kXG4gICAgICBba2V5c19ncmVhdGVyX29yX2VxdWFsX3RvXSBpbmNsdXNpdmUsIHByZXNlbnRlZCBpbiBbb3JkZXJdLiAgSWZcbiAgICAgIFtrZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gPiBrZXlzX2xlc3Nfb3JfZXF1YWxfdG9dLCB0aGUgc2VxdWVuY2UgaXNcbiAgICAgIGVtcHR5LlxuXG4gICAgICBXaGVuIG5laXRoZXIgW2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90b10gbm9yIFtrZXlzX2xlc3Nfb3JfZXF1YWxfdG9dIGFyZVxuICAgICAgcHJvdmlkZWQsIHRoZSBjb3N0IGlzIE8obG9nIG4pIHVwIGZyb250IGFuZCBhbW9ydGl6ZWQgTygxKSB0byBwcm9kdWNlXG4gICAgICBlYWNoIGVsZW1lbnQuIElmIGVpdGhlciBpcyBwcm92aWRlZCAoYW5kIGlzIHVzZWQgYnkgdGhlIG9yZGVyIHBhcmFtZXRlclxuICAgICAgcHJvdmlkZWQpLCB0aGVuIHRoZSB0aGUgY29zdCBpcyBPKG4pIHVwIGZyb250LCBhbmQgYW1vcnRpemVkIE8oMSkgdG9cbiAgICAgIHByb2R1Y2UgZWFjaCBlbGVtZW50LiAqKVxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZ19rZXkgKCoqIGRlZmF1bHQgKikgfCBgRGVjcmVhc2luZ19rZXkgXVxuICAgIC0+ID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG86J2tcbiAgICAtPiA/a2V5c19sZXNzX29yX2VxdWFsX3RvOidrXG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+ICgnayAqICd2KSBTZXF1ZW5jZS50XG5cbiAgKCoqIFtiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgd2hpY2ggZWx0XSByZXR1cm5zIHRoZSBbKGtleSwgdmFsdWUpXSBwYWlyIGluIFt0XVxuICAgICAgc3BlY2lmaWVkIGJ5IFtjb21wYXJlXSBhbmQgW3doaWNoXSwgaWYgb25lIGV4aXN0cy5cblxuICAgICAgW3RdIG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIFtjb21wYXJlXSwgd2hlcmUgW2NvbXBhcmVdIGFuZFxuICAgICAgW2VsdF0gZGl2aWRlIFt0XSBpbnRvIHRocmVlIChwb3NzaWJseSBlbXB0eSkgc2VnbWVudHM6XG5cbiAgICAgIHt2XG4gICAgICAgIHwgIDwgZWx0ICB8ICA9IGVsdCAgfCAgPiBlbHQgIHxcbiAgICAgIHZ9XG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoXSByZXR1cm5zIGFuIGVsZW1lbnQgb24gdGhlIGJvdW5kYXJ5IG9mIHNlZ21lbnRzIGFzIHNwZWNpZmllZCBieVxuICAgICAgW3doaWNoXS4gIFNlZSB0aGUgZGlhZ3JhbSBiZWxvdyBuZXh0IHRvIHRoZSBbd2hpY2hdIHZhcmlhbnRzLlxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF0gZG9lcyBub3QgY2hlY2sgdGhhdCBbY29tcGFyZV0gb3JkZXJzIFt0XSwgYW5kIGJlaGF2aW9yIGlzXG4gICAgICB1bnNwZWNpZmllZCBpZiBbY29tcGFyZV0gZG9lc24ndCBvcmRlciBbdF0uICBCZWhhdmlvciBpcyBhbHNvIHVuc3BlY2lmaWVkIGlmXG4gICAgICBbY29tcGFyZV0gbXV0YXRlcyBbdF0uICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IGNvbXBhcmU6KGtleTonayAtPiBkYXRhOid2IC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IFsgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuICgqKiAgICAgICAge3YgfCA8IGVsdCBYIHwgICAgICAgICAgICAgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG8gKCoqICAgICB7diB8ICAgICAgPD0gZWx0ICAgICAgIFggfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBMYXN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8ICAgPSBlbHQgWCB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYEZpcnN0X2VxdWFsX3RvICgqKiAgICAgICAgICAgICAgICAge3YgICAgICAgICAgIHwgWCA9IGVsdCAgIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvICgqKiB7diAgICAgICAgICAgfCBYICAgICAgID49IGVsdCAgICAgIHwgdn0gKilcbiAgICAgICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gKCoqICAgIHt2ICAgICAgICAgICAgICAgICAgICAgICB8IFggPiBlbHQgfCB2fSAqKVxuICAgICAgIF1cbiAgICAtPiAna2V5XG4gICAgLT4gKCdrICogJ3YpIG9wdGlvblxuXG4gICgqKiBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiB3aGljaF0gdGFrZXMgYSBbc2VnbWVudF9vZl0gZnVuY3Rpb24gdGhhdFxuICAgICAgZGl2aWRlcyBbdF0gaW50byB0d28gKHBvc3NpYmx5IGVtcHR5KSBzZWdtZW50czpcblxuICAgICAge3ZcbiAgICAgICAgfCBzZWdtZW50X29mIGVsdCA9IGBMZWZ0IHwgc2VnbWVudF9vZiBlbHQgPSBgUmlnaHQgfFxuICAgICAgdn1cblxuICAgICAgW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkXSByZXR1cm5zIHRoZSBbKGtleSwgdmFsdWUpXSBwYWlyIG9uIHRoZSBib3VuZGFyeSBvZiB0aGVcbiAgICAgIHNlZ21lbnRzIGFzIHNwZWNpZmllZCBieSBbd2hpY2hdOiBbYExhc3Rfb25fbGVmdF0geWllbGRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlXG4gICAgICBsZWZ0IHNlZ21lbnQsIHdoaWxlIFtgRmlyc3Rfb25fcmlnaHRdIHlpZWxkcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcmlnaHQgc2VnbWVudC5cbiAgICAgIEl0IHJldHVybnMgW05vbmVdIGlmIHRoZSBzZWdtZW50IGlzIGVtcHR5LlxuXG4gICAgICBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRdIGRvZXMgbm90IGNoZWNrIHRoYXQgW3NlZ21lbnRfb2ZdIHNlZ21lbnRzIFt0XSBhcyBpbiB0aGVcbiAgICAgIGRpYWdyYW0sIGFuZCBiZWhhdmlvciBpcyB1bnNwZWNpZmllZCBpZiBbc2VnbWVudF9vZl0gZG9lc24ndCBzZWdtZW50IFt0XS4gIEJlaGF2aW9yXG4gICAgICBpcyBhbHNvIHVuc3BlY2lmaWVkIGlmIFtzZWdtZW50X29mXSBtdXRhdGVzIFt0XS4gKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgKCdrLCAndiwgJ2NtcCkgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KGtleTonayAtPiBkYXRhOid2IC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBbIGBMYXN0X29uX2xlZnQgfCBgRmlyc3Rfb25fcmlnaHQgXVxuICAgIC0+ICgnayAqICd2KSBvcHRpb25cblxuICAoKiogW2JpbmFyeV9zZWFyY2hfc3VicmFuZ2VdIHRha2VzIGEgW2NvbXBhcmVdIGZ1bmN0aW9uIHRoYXQgZGl2aWRlcyBbdF0gaW50byB0aHJlZVxuICAgICAgKHBvc3NpYmx5IGVtcHR5KSBzZWdtZW50cyB3aXRoIHJlc3BlY3QgdG8gW2xvd2VyX2JvdW5kXSBhbmQgW3VwcGVyX2JvdW5kXTpcblxuICAgICAge3ZcbiAgICAgICAgfCBCZWxvd19sb3dlcl9ib3VuZCB8IEluX3JhbmdlIHwgQWJvdmVfdXBwZXJfYm91bmQgfFxuICAgICAgdn1cblxuICAgICAgYW5kIHJldHVybnMgYSBtYXAgb2YgdGhlIFtJbl9yYW5nZV0gc2VnbWVudC5cblxuICAgICAgUnVudGltZSBpcyBPKGxvZyBtICsgbikgd2hlcmUgW21dIGlzIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IG1hcCBhbmQgW25dIGlzIHRoZVxuICAgICAgbGVuZ3RoIG9mIHRoZSBvdXRwdXQuIFRoZSBsaW5lYXIgdGVybSBpbiBbbl0gaXMgdG8gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQuXG5cbiAgICAgIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiBbY29tcGFyZV0gZG9lcyBub3Qgc2VnbWVudCBbdF0gYXMgc2hvd24gYWJvdmUsIG9yIGlmXG4gICAgICBbY29tcGFyZV0gbXV0YXRlcyBpdHMgaW5wdXRzLiAqKVxuICB2YWwgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZVxuICAgIDogICgnaywgJ3YsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOihrZXk6J2sgLT4gZGF0YTondiAtPiAnYm91bmQgLT4gaW50KVxuICAgIC0+IGxvd2VyX2JvdW5kOidib3VuZCBNYXliZV9ib3VuZC50XG4gICAgLT4gdXBwZXJfYm91bmQ6J2JvdW5kIE1heWJlX2JvdW5kLnRcbiAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgKCoqIFtNXSBpcyBtZWFudCB0byBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggT0NhbWwgYXBwbGljYXRpdmUgZnVuY3RvciB0eXBlczpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfdG9faW50X21hcCA9IGludCBNYXAuTShTdHJpbmcpLnRcbiAgICAgIF19XG5cbiAgICAgIHdoaWNoIHN0YW5kcyBmb3I6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3RvX2ludF9tYXAgPSAoU3RyaW5nLnQsIGludCwgU3RyaW5nLmNvbXBhcmF0b3Jfd2l0bmVzcykgTWFwLnRcbiAgICAgIF19XG5cbiAgICAgIFRoZSBwb2ludCBpcyB0aGF0IFtpbnQgTWFwLk0oU3RyaW5nKS50XSBzdXBwb3J0cyBkZXJpdmluZywgd2hlcmVhcyB0aGUgc2Vjb25kIHN5bnRheFxuICAgICAgZG9lc24ndCAoYmVjYXVzZSB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzLCBzYXksIFtTdHJpbmcuc2V4cF9vZl9jb21wYXJhdG9yX3dpdG5lc3NdXG4gICAgICAtLSBpbnN0ZWFkIHlvdSB3b3VsZCB3YW50IHRvIHBhc3MgdGhlIGNvbXBhcmF0b3IgZGlyZWN0bHkpLlxuXG4gICAgICBJbiBhZGRpdGlvbiwgd2hlbiB1c2luZyBbQEBkZXJpdmluZ10sIHRoZSByZXF1aXJlbWVudHMgb24gdGhlIGtleSBtb2R1bGUgYXJlIG9ubHlcbiAgICAgIHRob3NlIG5lZWRlZCB0byBzYXRpc2Z5IHdoYXQgeW91IGFyZSB0cnlpbmcgdG8gZGVyaXZlIG9uIHRoZSBtYXAgaXRzZWxmLiBTYXkgeW91XG4gICAgICB3cml0ZTpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSB0ID0gaW50IE1hcC5NKFgpLnQgW0BAZGVyaXZpbmcgaGFzaF1cbiAgICAgIF19XG5cbiAgICAgIHRoZW4gdGhpcyB3aWxsIGJlIHdlbGwgdHlwZWQgZXhhY3RseSBpZiBbWF0gY29udGFpbnMgYXQgbGVhc3Q6XG4gICAgICAtIGEgdHlwZSBbdF0gd2l0aCBubyBwYXJhbWV0ZXJzXG4gICAgICAtIGEgY29tcGFyYXRvciB3aXRuZXNzXG4gICAgICAtIGEgW2hhc2hfZm9sZF90XSBmdW5jdGlvbiB3aXRoIHRoZSByaWdodCB0eXBlICopXG4gIG1vZHVsZSBNIChLIDogc2lnXG4gICAgICB0eXBlIHRcbiAgICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG4gICAgZW5kKSA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjICd2IHQgPSAoSy50LCAndiwgSy5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgZW5kXG5cbiAgaW5jbHVkZSBGb3JfZGVyaXZpbmcgd2l0aCB0eXBlICgna2V5LCAndmFsdWUsICdjbXApIHQgOj0gKCdrZXksICd2YWx1ZSwgJ2NtcCkgdFxuXG4gICgqKiBbVXNpbmdfY29tcGFyYXRvcl0gaXMgYSBzaW1pbGFyIGludGVyZmFjZSBhcyB0aGUgdG9wbGV2ZWwgb2YgW01hcF0sIGV4Y2VwdCB0aGVcbiAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgW35jb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XSwgd2hlcmVhcyB0aGUgZnVuY3Rpb25zIGF0IHRoZVxuICAgICAgdG9wbGV2ZWwgb2YgW01hcF0gdGFrZSBhIFsoJ2ssICdjbXApIGNvbXBhcmF0b3JdLiAqKVxuICBtb2R1bGUgVXNpbmdfY29tcGFyYXRvciA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjICgnaywgKyd2LCAnY21wKSB0ID0gKCdrLCAndiwgJ2NtcCkgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9vZl1cblxuICAgIHZhbCBzZXhwX29mX3RcbiAgICAgIDogICgnayAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ3YgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdjbXAgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgdmFsIHRfb2Zfc2V4cF9kaXJlY3RcbiAgICAgIDogIGNvbXBhcmF0b3I6KCdrLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgIC0+IChTZXhwLnQgLT4gJ2spXG4gICAgICAtPiAoU2V4cC50IC0+ICd2KVxuICAgICAgLT4gU2V4cC50XG4gICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgICBtb2R1bGUgVHJlZSA6IHNpZ1xuICAgICAgdHlwZSAoKydrLCArJ3YsICdjbXApIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICAgIHZhbCBzZXhwX29mX3RcbiAgICAgICAgOiAgKCdrIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgLT4gKCd2IC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgLT4gKCdjbXAgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG4gICAgICAgIC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgICBbQEBAZW5kXVxuXG4gICAgICB2YWwgdF9vZl9zZXhwX2RpcmVjdFxuICAgICAgICA6ICBjb21wYXJhdG9yOignaywgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAgIC0+IChTZXhwLnQgLT4gJ2spXG4gICAgICAgIC0+IChTZXhwLnQgLT4gJ3YpXG4gICAgICAgIC0+IFNleHAudFxuICAgICAgICAtPiAoJ2ssICd2LCAnY21wKSB0XG5cbiAgICAgIGluY2x1ZGVcbiAgICAgICAgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yXG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgdCA6PSAoJ2EsICdiLCAnYykgdFxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIHRcblxuICAgICAgdmFsIGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gOiAoXywgXywgXykgdFxuXG4gICAgICAoKiogW0J1aWxkX2luY3JlYXNpbmddIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIG1hcCBpbmNyZW1lbnRhbGx5IGZyb20gYVxuICAgICAgICAgIHNlcXVlbmNlIHRoYXQgaXMga25vd24gdG8gYmUgaW5jcmVhc2luZy5cblxuICAgICAgICAgIFRoZSB0b3RhbCB0aW1lIGNvbXBsZXhpdHkgb2YgY29uc3RydWN0aW5nIGEgbWFwIHRoaXMgd2F5IGlzIE8obiksIHdoaWNoIGlzIG1vcmVcbiAgICAgICAgICBlZmZpY2llbnQgdGhhbiB1c2luZyBbTWFwLmFkZF0gYnkgYSBsb2dhcml0aG1pYyBmYWN0b3IuXG5cbiAgICAgICAgICBUaGlzIGludGVyZmFjZSBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIGR1YWwgb2YgW3RvX3NlcXVlbmNlXSwgYnV0IHdlIGRvbid0IGhhdmVcbiAgICAgICAgICBhbiBlcXVhbGx5IG5lYXQgaWRpb20gZm9yIHRoZSBkdWFscyBvZiBzZXF1ZW5jZXMgKFtvZl9zZXF1ZW5jZV0gaXMgbXVjaCBsZXNzXG4gICAgICAgICAgZ2VuZXJhbCBiZWNhdXNlIGl0IGRvZXMgbm90IGFsbG93IHRoZSBzZXF1ZW5jZSB0byBiZSBwcm9kdWNlZCBhc3luY2hyb25vdXNseSkuICopXG4gICAgICBtb2R1bGUgQnVpbGRfaW5jcmVhc2luZyA6IHNpZ1xuICAgICAgICB0eXBlICgnYSwgJ2IsICdjKSB0cmVlIDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgICAgIHR5cGUgKCdrLCAndiwgJ3cpIHRcblxuICAgICAgICB2YWwgZW1wdHkgOiAoJ2ssICd2LCAndykgdFxuXG4gICAgICAgICgqKiBUaW1lIGNvbXBsZXhpdHkgb2YgW2FkZF9leG5dIGlzIGFtb3J0aXplZCBjb25zdGFudC10aW1lIChpZiBbdF0gaXMgdXNlZFxuICAgICAgICAgICAgbGluZWFybHkpLCB3aXRoIGEgd29yc3QtY2FzZSBPKGxvZyhuKSkgdGltZS4gKilcbiAgICAgICAgdmFsIGFkZF9leG5cbiAgICAgICAgICA6ICAoJ2ssICd2LCAndykgdFxuICAgICAgICAgIC0+IGNvbXBhcmF0b3I6KCdrLCAndykgQ29tcGFyYXRvci50XG4gICAgICAgICAgLT4ga2V5OidrXG4gICAgICAgICAgLT4gZGF0YTondlxuICAgICAgICAgIC0+ICgnaywgJ3YsICd3KSB0XG5cbiAgICAgICAgKCoqIFRpbWUgY29tcGxleGl0eSBpcyBPKGxvZyhuKSkuICopXG4gICAgICAgIHZhbCB0b190cmVlIDogKCdrLCAndiwgJ3cpIHQgLT4gKCdrLCAndiwgJ3cpIHRyZWVcbiAgICAgIGVuZFxuICAgIGVuZFxuXG4gICAgaW5jbHVkZVxuICAgICAgQWNjZXNzb3JzM1xuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIFRyZWUudFxuXG4gICAgaW5jbHVkZVxuICAgICAgQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvclxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSB0IDo9ICgnYSwgJ2IsICdjKSB0XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MpIHRyZWUgOj0gKCdhLCAnYiwgJ2MpIFRyZWUudFxuXG4gICAgdmFsIGNvbXBhcmF0b3IgOiAoJ2EsIF8sICdjbXApIHQgLT4gKCdhLCAnY21wKSBDb21wYXJhdG9yLnRcblxuICAgIHZhbCBoYXNoX2ZvbGRfZGlyZWN0XG4gICAgICA6ICAnayBIYXNoLmZvbGRlclxuICAgICAgLT4gJ3YgSGFzaC5mb2xkZXJcbiAgICAgIC0+ICgnaywgJ3YsICdjbXApIHQgSGFzaC5mb2xkZXJcblxuICAgICgqKiBUbyBnZXQgYXJvdW5kIHRoZSB2YWx1ZSByZXN0cmljdGlvbiwgYXBwbHkgdGhlIGZ1bmN0b3IgYW5kIGluY2x1ZGUgaXQuIFlvdVxuICAgICAgICBjYW4gc2VlIGFuIGV4YW1wbGUgb2YgdGhpcyBpbiB0aGUgW1BvbHldIHN1Ym1vZHVsZSBiZWxvdy4gKilcbiAgICBtb2R1bGUgRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoSyA6IENvbXBhcmF0b3IuUzEpIDogc2lnXG4gICAgICB2YWwgZW1wdHkgOiAoJ2EgSy50LCAndiwgSy5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbiAgICBlbmRcbiAgZW5kXG5cbiAgKCoqIEEgcG9seW1vcnBoaWMgTWFwLiAqKVxuICBtb2R1bGUgUG9seSA6XG4gICAgU19wb2x5XG4gICAgd2l0aCB0eXBlICgna2V5LCArJ3ZhbHVlKSB0ID0gKCdrZXksICd2YWx1ZSwgQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICAgICBhbmQgdHlwZSAoJ2tleSwgKyd2YWx1ZSkgdHJlZSA9XG4gICAgICAgICAgICgna2V5LCAndmFsdWUsIENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3MpIFVzaW5nX2NvbXBhcmF0b3IuVHJlZS50XG4gICAgIGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9IENvbXBhcmF0b3IuUG9seS5jb21wYXJhdG9yX3dpdG5lc3NcblxuICAoKiogQ3JlYXRlIGEgbWFwIGZyb20gYSB0cmVlIHVzaW5nIHRoZSBnaXZlbiBjb21wYXJhdG9yLiAqKVxuICB2YWwgb2ZfdHJlZVxuICAgIDogICgnaywgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+ICgnaywgJ3YsICdjbXApIFVzaW5nX2NvbXBhcmF0b3IuVHJlZS50XG4gICAgLT4gKCdrLCAndiwgJ2NtcCkgdFxuXG4gICgqKiBFeHRyYWN0IGEgdHJlZSBmcm9tIGEgbWFwLiAqKVxuICB2YWwgdG9fdHJlZSA6ICgnaywgJ3YsICdjbXApIHQgLT4gKCdrLCAndiwgJ2NtcCkgVXNpbmdfY29tcGFyYXRvci5UcmVlLnRcblxuXG4gICgqKiB7MiBNb2R1bGVzIGFuZCBtb2R1bGUgdHlwZXMgZm9yIGV4dGVuZGluZyBbTWFwXX1cblxuICAgICAgRm9yIHVzZSBpbiBleHRlbnNpb25zIG9mIEJhc2UsIGxpa2UgW0NvcmVdLiAqKVxuXG4gIG1vZHVsZSBXaXRoX2NvbXBhcmF0b3IgPSBXaXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlID0gV2l0aF9maXJzdF9jbGFzc19tb2R1bGVcbiAgbW9kdWxlIFdpdGhvdXRfY29tcGFyYXRvciA9IFdpdGhvdXRfY29tcGFyYXRvclxuXG4gIG1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IEZvcl9kZXJpdmluZ1xuICBtb2R1bGUgdHlwZSBTX3BvbHkgPSBTX3BvbHlcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMSA9IEFjY2Vzc29yczFcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMiA9IEFjY2Vzc29yczJcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzMyA9IEFjY2Vzc29yczNcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3IgPSBBY2Nlc3NvcnMzX3dpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgdHlwZSBBY2Nlc3NvcnNfZ2VuZXJpYyA9IEFjY2Vzc29yc19nZW5lcmljXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMSA9IENyZWF0b3JzMVxuICBtb2R1bGUgdHlwZSBDcmVhdG9yczIgPSBDcmVhdG9yczJcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMzX3dpdGhfY29tcGFyYXRvciA9IENyZWF0b3JzM193aXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczEgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMVxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMiA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyXG5cbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczNfd2l0aF9jb21wYXJhdG9yID1cbiAgICBDcmVhdG9yc19hbmRfYWNjZXNzb3JzM193aXRoX2NvbXBhcmF0b3JcblxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzX2dlbmVyaWMgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzX2dlbmVyaWNcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IENyZWF0b3JzX2dlbmVyaWNcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5vcGVuISBUXG5cbm1vZHVsZSB0eXBlIEVsdF9wbGFpbiA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIHNleHBfb2ZdXG5cbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSBXaXRob3V0X2NvbXBhcmF0b3IgPSBNYXBfaW50Zi5XaXRob3V0X2NvbXBhcmF0b3Jcbm1vZHVsZSBXaXRoX2NvbXBhcmF0b3IgPSBNYXBfaW50Zi5XaXRoX2NvbXBhcmF0b3Jcbm1vZHVsZSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZSA9IE1hcF9pbnRmLldpdGhfZmlyc3RfY2xhc3NfbW9kdWxlXG5tb2R1bGUgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudCA9IFNlcXVlbmNlLk1lcmdlX3dpdGhfZHVwbGljYXRlc19lbGVtZW50XG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yc19nZW5lcmljID0gc2lnXG4gIGluY2x1ZGUgQ29udGFpbmVyLkdlbmVyaWNfcGhhbnRvbVxuXG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG5cbiAgKCoqIFRoZSBbb3B0aW9uc10gdHlwZSBpcyB1c2VkIHRvIG1ha2UgW0FjY2Vzc29yc19nZW5lcmljXSBmbGV4aWJsZSBhcyB0byB3aGV0aGVyIGFcbiAgICAgIGNvbXBhcmF0b3IgaXMgcmVxdWlyZWQgdG8gYmUgcGFzc2VkIHRvIGNlcnRhaW4gZnVuY3Rpb25zLiAqKVxuICB0eXBlICgnYSwgJ2NtcCwgJ3opIG9wdGlvbnNcblxuICB0eXBlICdjbXAgY21wXG5cbiAgdmFsIGludmFyaWFudHMgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiBib29sKSBvcHRpb25zXG5cbiAgKCoqIG92ZXJyaWRlIFtDb250YWluZXJdJ3MgW21lbV0gKilcbiAgdmFsIG1lbSA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICdhIGVsdCAtPiBib29sKSBvcHRpb25zXG5cbiAgdmFsIGFkZCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICdhIGVsdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHJlbW92ZSA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICdhIGVsdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIHVuaW9uIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgaW50ZXIgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCBkaWZmIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBzeW1tZXRyaWNfZGlmZlxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhIGVsdCwgJ2EgZWx0KSBFaXRoZXIudCBTZXF1ZW5jZS50IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBpbnQpIG9wdGlvbnNcbiAgdmFsIGVxdWFsIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2wpIG9wdGlvbnNcbiAgdmFsIGlzX3N1YnNldCA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSB0IC0+IG9mXzooJ2EsICdjbXApIHQgLT4gYm9vbCkgb3B0aW9uc1xuICB2YWwgYXJlX2Rpc2pvaW50IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2wpIG9wdGlvbnNcblxuICB0eXBlICgnYSwgJ2NtcCkgbmFtZWRcblxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB2YWwgaXNfc3Vic2V0XG4gICAgICA6ICgnYSwgJ2NtcCwgKCdhLCAnY21wKSBuYW1lZCAtPiBvZl86KCdhLCAnY21wKSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnQpIG9wdGlvbnNcblxuICAgIHZhbCBlcXVhbFxuICAgICAgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgbmFtZWQgLT4gKCdhLCAnY21wKSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnQpIG9wdGlvbnNcbiAgZW5kXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidiXG4gICAgLT4gZjooJ2IgLT4gJ2EgZWx0IC0+ICgnYiwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2IgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCBfKSB0IC0+IGluaXQ6J2IgLT4gZjooJ2EgZWx0IC0+ICdiIC0+ICdiKSAtPiAnYlxuXG4gIHZhbCBpdGVyMlxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gKCdhLCAnY21wKSB0XG4gICAgICAtPiBmOihbIGBMZWZ0IG9mICdhIGVsdCB8IGBSaWdodCBvZiAnYSBlbHQgfCBgQm90aCBvZiAnYSBlbHQgKiAnYSBlbHQgXSAtPiB1bml0KVxuICAgICAgLT4gdW5pdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyIDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuXG4gIHZhbCBwYXJ0aXRpb25fdGZcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCAoJ2EsICdjbXApIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCAqICgnYSwgJ2NtcCkgdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZWxlbWVudHMgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IGxpc3RcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0IG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0XG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhIGVsdFxuICB2YWwgY2hvb3NlIDogKCdhLCBfKSB0IC0+ICdhIGVsdCBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiAoJ2EsIF8pIHQgLT4gJ2EgZWx0XG5cbiAgdmFsIHNwbGl0XG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0IC0+ICdhIGVsdCAtPiAoJ2EsICdjbXApIHQgKiAnYSBlbHQgb3B0aW9uICogKCdhLCAnY21wKSB0IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBncm91cF9ieVxuICAgIDogKCAnYVxuICAgICAgLCAnY21wXG4gICAgICAsICgnYSwgJ2NtcCkgdCAtPiBlcXVpdjooJ2EgZWx0IC0+ICdhIGVsdCAtPiBib29sKSAtPiAoJ2EsICdjbXApIHQgbGlzdCApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgZmluZF9leG4gOiAoJ2EsIF8pIHQgLT4gZjooJ2EgZWx0IC0+IGJvb2wpIC0+ICdhIGVsdFxuICB2YWwgbnRoIDogKCdhLCBfKSB0IC0+IGludCAtPiAnYSBlbHQgb3B0aW9uXG4gIHZhbCByZW1vdmVfaW5kZXggOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCAtPiBpbnQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCB0b190cmVlIDogKCdhLCAnY21wKSB0IC0+ICgnYSBlbHQsICdjbXApIHRyZWVcblxuICB2YWwgdG9fc2VxdWVuY2VcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhIGVsdFxuICAgICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2EgZWx0XG4gICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgIC0+ICdhIGVsdCBTZXF1ZW5jZS50IClcbiAgICAgICAgb3B0aW9uc1xuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0XG4gICAgICAtPiBjb21wYXJlOignYSBlbHQgLT4gJ2tleSAtPiBpbnQpXG4gICAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAgIC0+ICdrZXlcbiAgICAgIC0+ICdhIGVsdCBvcHRpb24gKVxuICAgICAgICBvcHRpb25zXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAoICdhXG4gICAgICAsICdjbXBcbiAgICAgICwgKCdhLCAnY21wKSB0XG4gICAgICAtPiBzZWdtZW50X29mOignYSBlbHQgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgICAgLT4gJ2EgZWx0IG9wdGlvbiApXG4gICAgICAgIG9wdGlvbnNcblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICggJ2FcbiAgICAgICwgJ2NtcFxuICAgICAgLCA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhIGVsdFxuICAgICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2EgZWx0XG4gICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgLT4gKCdhIGVsdCwgJ2EgZWx0KSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudCApXG4gICAgICAgIG9wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMwID0gc2lnXG4gIGluY2x1ZGUgQ29udGFpbmVyLlMwXG5cbiAgdHlwZSB0cmVlXG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGludmFyaWFudHMgOiB0IC0+IGJvb2xcbiAgdmFsIG1lbSA6IHQgLT4gZWx0IC0+IGJvb2xcbiAgdmFsIGFkZCA6IHQgLT4gZWx0IC0+IHRcbiAgdmFsIHJlbW92ZSA6IHQgLT4gZWx0IC0+IHRcbiAgdmFsIHVuaW9uIDogdCAtPiB0IC0+IHRcbiAgdmFsIGludGVyIDogdCAtPiB0IC0+IHRcbiAgdmFsIGRpZmYgOiB0IC0+IHQgLT4gdFxuICB2YWwgc3ltbWV0cmljX2RpZmYgOiB0IC0+IHQgLT4gKGVsdCwgZWx0KSBFaXRoZXIudCBTZXF1ZW5jZS50XG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6IHQgLT4gdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogdCAtPiB0IC0+IGJvb2xcbiAgdmFsIGlzX3N1YnNldCA6IHQgLT4gb2ZfOnQgLT4gYm9vbFxuICB2YWwgYXJlX2Rpc2pvaW50IDogdCAtPiB0IC0+IGJvb2xcblxuICB0eXBlIG5hbWVkXG5cbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdmFsIGlzX3N1YnNldCA6IG5hbWVkIC0+IG9mXzpuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgICB2YWwgZXF1YWwgOiBuYW1lZCAtPiBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgZW5kXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICB0XG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+IGVsdCAtPiAoJ2IsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdiIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6IHQgLT4gaW5pdDonYiAtPiBmOihlbHQgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgdFxuICAgIC0+IHRcbiAgICAtPiBmOihbIGBMZWZ0IG9mIGVsdCB8IGBSaWdodCBvZiBlbHQgfCBgQm90aCBvZiBlbHQgKiBlbHQgXSAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gdFxuICB2YWwgcGFydGl0aW9uX3RmIDogdCAtPiBmOihlbHQgLT4gYm9vbCkgLT4gdCAqIHRcbiAgdmFsIGVsZW1lbnRzIDogdCAtPiBlbHQgbGlzdFxuICB2YWwgbWluX2VsdCA6IHQgLT4gZWx0IG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiB0IC0+IGVsdFxuICB2YWwgbWF4X2VsdCA6IHQgLT4gZWx0IG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiB0IC0+IGVsdFxuICB2YWwgY2hvb3NlIDogdCAtPiBlbHQgb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogdCAtPiBlbHRcbiAgdmFsIHNwbGl0IDogdCAtPiBlbHQgLT4gdCAqIGVsdCBvcHRpb24gKiB0XG4gIHZhbCBncm91cF9ieSA6IHQgLT4gZXF1aXY6KGVsdCAtPiBlbHQgLT4gYm9vbCkgLT4gdCBsaXN0XG4gIHZhbCBmaW5kX2V4biA6IHQgLT4gZjooZWx0IC0+IGJvb2wpIC0+IGVsdFxuICB2YWwgbnRoIDogdCAtPiBpbnQgLT4gZWx0IG9wdGlvblxuICB2YWwgcmVtb3ZlX2luZGV4IDogdCAtPiBpbnQgLT4gdFxuICB2YWwgdG9fdHJlZSA6IHQgLT4gdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOmVsdFxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOmVsdFxuICAgIC0+IHRcbiAgICAtPiBlbHQgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgdFxuICAgIC0+IGNvbXBhcmU6KGVsdCAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gZWx0IG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogIHRcbiAgICAtPiBzZWdtZW50X29mOihlbHQgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiBlbHQgb3B0aW9uXG5cbiAgdmFsIG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86ZWx0XG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86ZWx0XG4gICAgLT4gdFxuICAgIC0+IHRcbiAgICAtPiAoZWx0LCBlbHQpIE1lcmdlX3RvX3NlcXVlbmNlX2VsZW1lbnQudCBTZXF1ZW5jZS50XG5lbmRcblxubW9kdWxlIHR5cGUgQWNjZXNzb3JzMSA9IHNpZ1xuICBpbmNsdWRlIENvbnRhaW5lci5TMVxuXG4gIHR5cGUgJ2EgdHJlZVxuICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIHZhbCBpbnZhcmlhbnRzIDogXyB0IC0+IGJvb2xcbiAgdmFsIG1lbSA6ICdhIHQgLT4gJ2EgLT4gYm9vbFxuICB2YWwgYWRkIDogJ2EgdCAtPiAnYSAtPiAnYSB0XG4gIHZhbCByZW1vdmUgOiAnYSB0IC0+ICdhIC0+ICdhIHRcbiAgdmFsIHVuaW9uIDogJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbiAgdmFsIGludGVyIDogJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbiAgdmFsIGRpZmYgOiAnYSB0IC0+ICdhIHQgLT4gJ2EgdFxuICB2YWwgc3ltbWV0cmljX2RpZmYgOiAnYSB0IC0+ICdhIHQgLT4gKCdhLCAnYSkgRWl0aGVyLnQgU2VxdWVuY2UudFxuICB2YWwgY29tcGFyZV9kaXJlY3QgOiAnYSB0IC0+ICdhIHQgLT4gaW50XG4gIHZhbCBlcXVhbCA6ICdhIHQgLT4gJ2EgdCAtPiBib29sXG4gIHZhbCBpc19zdWJzZXQgOiAnYSB0IC0+IG9mXzonYSB0IC0+IGJvb2xcbiAgdmFsIGFyZV9kaXNqb2ludCA6ICdhIHQgLT4gJ2EgdCAtPiBib29sXG5cbiAgdHlwZSAnYSBuYW1lZFxuXG4gIG1vZHVsZSBOYW1lZCA6IHNpZ1xuICAgIHZhbCBpc19zdWJzZXQgOiAnYSBuYW1lZCAtPiBvZl86J2EgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gICAgdmFsIGVxdWFsIDogJ2EgbmFtZWQgLT4gJ2EgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gIGVuZFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgJ2EgdFxuICAgIC0+IGluaXQ6J2JcbiAgICAtPiBmOignYiAtPiAnYSAtPiAoJ2IsICdmaW5hbCkgQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AudClcbiAgICAtPiBmaW5pc2g6KCdiIC0+ICdmaW5hbClcbiAgICAtPiAnZmluYWxcblxuICB2YWwgZm9sZF9yaWdodCA6ICdhIHQgLT4gaW5pdDonYiAtPiBmOignYSAtPiAnYiAtPiAnYikgLT4gJ2JcblxuICB2YWwgaXRlcjJcbiAgICA6ICAnYSB0XG4gICAgLT4gJ2EgdFxuICAgIC0+IGY6KFsgYExlZnQgb2YgJ2EgfCBgUmlnaHQgb2YgJ2EgfCBgQm90aCBvZiAnYSAqICdhIF0gLT4gdW5pdClcbiAgICAtPiB1bml0XG5cbiAgdmFsIGZpbHRlciA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2EgdFxuICB2YWwgcGFydGl0aW9uX3RmIDogJ2EgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYSB0ICogJ2EgdFxuICB2YWwgZWxlbWVudHMgOiAnYSB0IC0+ICdhIGxpc3RcbiAgdmFsIG1pbl9lbHQgOiAnYSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWluX2VsdF9leG4gOiAnYSB0IC0+ICdhXG4gIHZhbCBtYXhfZWx0IDogJ2EgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogJ2EgdCAtPiAnYVxuICB2YWwgY2hvb3NlIDogJ2EgdCAtPiAnYSBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiAnYSB0IC0+ICdhXG4gIHZhbCBzcGxpdCA6ICdhIHQgLT4gJ2EgLT4gJ2EgdCAqICdhIG9wdGlvbiAqICdhIHRcbiAgdmFsIGdyb3VwX2J5IDogJ2EgdCAtPiBlcXVpdjooJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgdCBsaXN0XG4gIHZhbCBmaW5kX2V4biA6ICdhIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gJ2FcbiAgdmFsIG50aCA6ICdhIHQgLT4gaW50IC0+ICdhIG9wdGlvblxuICB2YWwgcmVtb3ZlX2luZGV4IDogJ2EgdCAtPiBpbnQgLT4gJ2EgdFxuICB2YWwgdG9fdHJlZSA6ICdhIHQgLT4gJ2EgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAnYSB0XG4gICAgLT4gJ2EgU2VxdWVuY2UudFxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoXG4gICAgOiAgJ2EgdFxuICAgIC0+IGNvbXBhcmU6KCdhIC0+ICdrZXkgLT4gaW50KVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9rZXkudFxuICAgIC0+ICdrZXlcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWRcbiAgICA6ICAnYSB0XG4gICAgLT4gc2VnbWVudF9vZjooJ2EgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gJ2EgdFxuICAgIC0+ICdhIHRcbiAgICAtPiAoJ2EsICdhKSBNZXJnZV90b19zZXF1ZW5jZV9lbGVtZW50LnQgU2VxdWVuY2UudFxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29yczIgPSBzaWdcbiAgaW5jbHVkZSBDb250YWluZXIuUzFfcGhhbnRvbV9pbnZhcmlhbnRcblxuICB0eXBlICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCBpbnZhcmlhbnRzIDogKF8sIF8pIHQgLT4gYm9vbFxuICB2YWwgbWVtIDogKCdhLCBfKSB0IC0+ICdhIC0+IGJvb2xcbiAgdmFsIGFkZCA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHJlbW92ZSA6ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHVuaW9uIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIGludGVyIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIGRpZmYgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgc3ltbWV0cmljX2RpZmYgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2EpIEVpdGhlci50IFNlcXVlbmNlLnRcbiAgdmFsIGNvbXBhcmVfZGlyZWN0IDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBpbnRcbiAgdmFsIGVxdWFsIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBpc19zdWJzZXQgOiAoJ2EsICdjbXApIHQgLT4gb2ZfOignYSwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBhcmVfZGlzam9pbnQgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcblxuICB0eXBlICgnYSwgJ2NtcCkgbmFtZWRcblxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB2YWwgaXNfc3Vic2V0IDogKCdhLCAnY21wKSBuYW1lZCAtPiBvZl86KCdhLCAnY21wKSBuYW1lZCAtPiB1bml0IE9yX2Vycm9yLnRcbiAgICB2YWwgZXF1YWwgOiAoJ2EsICdjbXApIG5hbWVkIC0+ICgnYSwgJ2NtcCkgbmFtZWQgLT4gdW5pdCBPcl9lcnJvci50XG4gIGVuZFxuXG4gIHZhbCBmb2xkX3VudGlsXG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYlxuICAgIC0+IGY6KCdiIC0+ICdhIC0+ICgnYiwgJ2ZpbmFsKSBDb250YWluZXIuQ29udGludWVfb3Jfc3RvcC50KVxuICAgIC0+IGZpbmlzaDooJ2IgLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCBfKSB0IC0+IGluaXQ6J2IgLT4gZjooJ2EgLT4gJ2IgLT4gJ2IpIC0+ICdiXG5cbiAgdmFsIGl0ZXIyXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZjooWyBgTGVmdCBvZiAnYSB8IGBSaWdodCBvZiAnYSB8IGBCb3RoIG9mICdhICogJ2EgXSAtPiB1bml0KVxuICAgIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyIDogKCdhLCAnY21wKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgcGFydGl0aW9uX3RmIDogKCdhLCAnY21wKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCAqICgnYSwgJ2NtcCkgdFxuICB2YWwgZWxlbWVudHMgOiAoJ2EsIF8pIHQgLT4gJ2EgbGlzdFxuICB2YWwgbWluX2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1pbl9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG4gIHZhbCBtYXhfZWx0IDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuICB2YWwgbWF4X2VsdF9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcbiAgdmFsIGNob29zZSA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIGNob29zZV9leG4gOiAoJ2EsIF8pIHQgLT4gJ2FcbiAgdmFsIHNwbGl0IDogKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdCAqICdhIG9wdGlvbiAqICgnYSwgJ2NtcCkgdFxuICB2YWwgZ3JvdXBfYnkgOiAoJ2EsICdjbXApIHQgLT4gZXF1aXY6KCdhIC0+ICdhIC0+IGJvb2wpIC0+ICgnYSwgJ2NtcCkgdCBsaXN0XG4gIHZhbCBmaW5kX2V4biA6ICgnYSwgXykgdCAtPiBmOignYSAtPiBib29sKSAtPiAnYVxuICB2YWwgbnRoIDogKCdhLCBfKSB0IC0+IGludCAtPiAnYSBvcHRpb25cbiAgdmFsIHJlbW92ZV9pbmRleCA6ICgnYSwgJ2NtcCkgdCAtPiBpbnQgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCB0b190cmVlIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdHJlZVxuXG4gIHZhbCB0b19zZXF1ZW5jZVxuICAgIDogID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAnYSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOignYSAtPiAna2V5IC0+IGludClcbiAgICAtPiBCaW5hcnlfc2VhcmNoYWJsZS5XaGljaF90YXJnZXRfYnlfa2V5LnRcbiAgICAtPiAna2V5XG4gICAgLT4gJ2Egb3B0aW9uXG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkXG4gICAgOiAgKCdhLCAnY21wKSB0XG4gICAgLT4gc2VnbWVudF9vZjooJ2EgLT4gWyBgTGVmdCB8IGBSaWdodCBdKVxuICAgIC0+IEJpbmFyeV9zZWFyY2hhYmxlLldoaWNoX3RhcmdldF9ieV9zZWdtZW50LnRcbiAgICAtPiAnYSBvcHRpb25cblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYSkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBBY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICBpbmNsdWRlIENvbnRhaW5lci5TMV9waGFudG9tX2ludmFyaWFudFxuXG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIGludmFyaWFudHMgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCAtPiBib29sXG4gIHZhbCBtZW0gOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiBib29sXG4gIHZhbCBhZGQgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICgnYSwgJ2NtcCkgdCAtPiAnYSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHJlbW92ZSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gKCdhLCAnY21wKSB0IC0+ICdhIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCB1bmlvblxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgaW50ZXJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIGRpZmZcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIHN5bW1ldHJpY19kaWZmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICgnYSwgJ2EpIEVpdGhlci50IFNlcXVlbmNlLnRcblxuICB2YWwgY29tcGFyZV9kaXJlY3RcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gaW50XG5cbiAgdmFsIGVxdWFsIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IGJvb2xcblxuICB2YWwgaXNfc3Vic2V0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IG9mXzooJ2EsICdjbXApIHRcbiAgICAtPiBib29sXG5cbiAgdmFsIGFyZV9kaXNqb2ludFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBib29sXG5cbiAgdHlwZSAoJ2EsICdjbXApIG5hbWVkXG5cbiAgbW9kdWxlIE5hbWVkIDogc2lnXG4gICAgdmFsIGlzX3N1YnNldFxuICAgICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgLT4gKCdhLCAnY21wKSBuYW1lZFxuICAgICAgLT4gb2ZfOignYSwgJ2NtcCkgbmFtZWRcbiAgICAgIC0+IHVuaXQgT3JfZXJyb3IudFxuXG4gICAgdmFsIGVxdWFsXG4gICAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgICAtPiAoJ2EsICdjbXApIG5hbWVkXG4gICAgICAtPiAoJ2EsICdjbXApIG5hbWVkXG4gICAgICAtPiB1bml0IE9yX2Vycm9yLnRcbiAgZW5kXG5cbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG4gIHZhbCBmb2xkX3JpZ2h0IDogKCdhLCBfKSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhIC0+ICdhY2N1bSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gIHZhbCBpdGVyMlxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBmOihbIGBMZWZ0IG9mICdhIHwgYFJpZ2h0IG9mICdhIHwgYEJvdGggb2YgJ2EgKiAnYSBdIC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gIHZhbCBmaWx0ZXJcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gZjooJ2EgLT4gYm9vbClcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgcGFydGl0aW9uX3RmXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGY6KCdhIC0+IGJvb2wpXG4gICAgLT4gKCdhLCAnY21wKSB0ICogKCdhLCAnY21wKSB0XG5cbiAgdmFsIGVsZW1lbnRzIDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG4gIHZhbCBjaG9vc2UgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG5cbiAgdmFsIHNwbGl0XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICdhXG4gICAgLT4gKCdhLCAnY21wKSB0ICogJ2Egb3B0aW9uICogKCdhLCAnY21wKSB0XG5cbiAgdmFsIGdyb3VwX2J5XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+IGVxdWl2OignYSAtPiAnYSAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2NtcCkgdCBsaXN0XG5cbiAgdmFsIGZpbmRfZXhuIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhXG4gIHZhbCBudGggOiAoJ2EsIF8pIHQgLT4gaW50IC0+ICdhIG9wdGlvblxuXG4gIHZhbCByZW1vdmVfaW5kZXhcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gaW50XG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgdmFsIHRvX3RyZWUgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ID9vcmRlcjpbIGBJbmNyZWFzaW5nIHwgYERlY3JlYXNpbmcgXVxuICAgIC0+ID9ncmVhdGVyX29yX2VxdWFsX3RvOidhXG4gICAgLT4gP2xlc3Nfb3JfZXF1YWxfdG86J2FcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiAnYSBTZXF1ZW5jZS50XG5cbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gY29tcGFyZTooJ2EgLT4gJ2tleSAtPiBpbnQpXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X2tleS50XG4gICAgLT4gJ2tleVxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBzZWdtZW50X29mOignYSAtPiBbIGBMZWZ0IHwgYFJpZ2h0IF0pXG4gICAgLT4gQmluYXJ5X3NlYXJjaGFibGUuV2hpY2hfdGFyZ2V0X2J5X3NlZ21lbnQudFxuICAgIC0+ICdhIG9wdGlvblxuXG4gIHZhbCBtZXJnZV90b19zZXF1ZW5jZVxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiA/b3JkZXI6WyBgSW5jcmVhc2luZyB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYSkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnRcbmVuZFxuXG4oKiogQ29uc2lzdGVuY3kgY2hlY2tzIChzYW1lIGFzIGluIFtDb250YWluZXJdKS4gKilcbm1vZHVsZSBDaGVja19hY2Nlc3NvcnNcbiAgICAoVCA6IFQyKVxuICAgIChUcmVlIDogVDIpXG4gICAgKEVsdCA6IFQxKVxuICAgIChOYW1lZCA6IFQyKVxuICAgIChDbXAgOiBUMSlcbiAgICAoT3B0aW9ucyA6IFQzKVxuICAgIChfIDogQWNjZXNzb3JzX2dlbmVyaWNcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBPcHRpb25zLnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgVC50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIFRyZWUudFxuICAgICB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIEVsdC50XG4gICAgIHdpdGggdHlwZSAnY21wIGNtcCA6PSAnY21wIENtcC50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiKSBuYW1lZCA6PSAoJ2EsICdiKSBOYW1lZC50KSA9XG5zdHJ1Y3QgZW5kXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMwIChNIDogQWNjZXNzb3JzMCkgPVxuICBDaGVja19hY2Nlc3NvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uZWx0XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9IE0ubmFtZWRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2FjY2Vzc29yczEgKE0gOiBBY2Nlc3NvcnMxKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICdhIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAnYSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gJ2EgTS5uYW1lZFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfYWNjZXNzb3JzMiAoTSA6IEFjY2Vzc29yczIpID1cbiAgQ2hlY2tfYWNjZXNzb3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLm5hbWVkXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG4gICAgZW5kKVxuICAgIChXaXRob3V0X2NvbXBhcmF0b3IpXG4gICAgKE0pXG5cbm1vZHVsZSBDaGVja19hY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvciAoTSA6IEFjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yKSA9XG4gIENoZWNrX2FjY2Vzc29yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAoJ2EsICdiKSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS5uYW1lZFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoV2l0aF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19nZW5lcmljID0gc2lnXG4gIHR5cGUgKCdhLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnY21wKSBzZXRcbiAgdHlwZSAoJ2EsICdjbXApIHRyZWVcbiAgdHlwZSAnYSBlbHRcbiAgdHlwZSAoJ2EsICdjbXAsICd6KSBvcHRpb25zXG4gIHR5cGUgJ2NtcCBjbXBcblxuICB2YWwgZW1wdHkgOiAoJ2EsICdjbXAsICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgc2luZ2xldG9uIDogKCdhLCAnY21wLCAnYSBlbHQgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG4gIHZhbCB1bmlvbl9saXN0IDogKCdhLCAnY21wLCAoJ2EsICdjbXApIHQgbGlzdCAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG9mX2xpc3QgOiAoJ2EsICdjbXAsICdhIGVsdCBsaXN0IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgb2Zfc2VxdWVuY2UgOiAoJ2EsICdjbXAsICdhIGVsdCBTZXF1ZW5jZS50IC0+ICgnYSwgJ2NtcCkgdCkgb3B0aW9uc1xuICB2YWwgb2ZfYXJyYXkgOiAoJ2EsICdjbXAsICdhIGVsdCBhcnJheSAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6ICgnYSwgJ2NtcCwgJ2EgZWx0IGFycmF5IC0+ICgnYSwgJ2NtcCkgdCBPcl9lcnJvci50KSBvcHRpb25zXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogKCdhLCAnY21wLCAnYSBlbHQgYXJyYXkgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkXG4gICAgOiAoJ2EsICdjbXAsIGxlbjppbnQgLT4gZjooaW50IC0+ICdhIGVsdCkgLT4gKCdhLCAnY21wKSB0KSBvcHRpb25zXG5cbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogKCdhLCBfLCAnYSBlbHQgbGlzdCAtPiAnYSBlbHQgbGlzdCkgb3B0aW9uc1xuXG4gICgqKiBUaGUgdHlwZXMgb2YgW21hcF0gYW5kIFtmaWx0ZXJfbWFwXSBhcmUgc3VidGxlLiAgVGhlIGlucHV0IHNldCwgWygnYSwgXykgc2V0XSxcbiAgICAgIHJlZmxlY3RzIHRoZSBmYWN0IHRoYXQgdGhlc2UgZnVuY3Rpb25zIHRha2UgYSBzZXQgb2YgKmFueSogdHlwZSwgd2l0aCBhbnlcbiAgICAgIGNvbXBhcmF0b3IsIHdoaWxlIHRoZSBvdXRwdXQgc2V0LCBbKCdiLCAnY21wKSB0XSwgcmVmbGVjdHMgdGhhdCB0aGUgb3V0cHV0IHNldCBoYXNcbiAgICAgIHRoZSBwYXJ0aWN1bGFyIFsnY21wXSBvZiB0aGUgY3JlYXRpb24gZnVuY3Rpb24uICBUaGUgY29tcGFyYXRvciBjYW4gY29tZSBpbiBvbmUgb2ZcbiAgICAgIHRocmVlIHdheXMsIGRlcGVuZGluZyBvbiB3aGljaCBzZXQgbW9kdWxlIGlzIHVzZWRcblxuICAgICAgLSBbU2V0Lm1hcF0gLS0gY29tcGFyYXRvciBjb21lcyBhcyBhbiBhcmd1bWVudFxuICAgICAgLSBbU2V0LlBvbHkubWFwXSAtLSBjb21wYXJhdG9yIGlzIHBvbHltb3JwaGljIGNvbXBhcmlzb25cbiAgICAgIC0gW0Zvby5TZXQubWFwXSAtLSBjb21wYXJhdG9yIGlzIFtGb28uY29tcGFyYXRvcl0gKilcbiAgdmFsIG1hcCA6ICgnYiwgJ2NtcCwgKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2IgZWx0KSAtPiAoJ2IsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgZmlsdGVyX21hcFxuICAgIDogKCdiLCAnY21wLCAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYiBlbHQgb3B0aW9uKSAtPiAoJ2IsICdjbXApIHQpIG9wdGlvbnNcblxuICB2YWwgb2ZfdHJlZSA6ICgnYSwgJ2NtcCwgKCdhIGVsdCwgJ2NtcCkgdHJlZSAtPiAoJ2EsICdjbXApIHQpIG9wdGlvbnNcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yczAgPSBzaWdcbiAgdHlwZSAoJ2EsICdjbXApIHNldFxuICB0eXBlIHRcbiAgdHlwZSB0cmVlXG4gIHR5cGUgZWx0XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG5cbiAgdmFsIGVtcHR5IDogdFxuICB2YWwgc2luZ2xldG9uIDogZWx0IC0+IHRcbiAgdmFsIHVuaW9uX2xpc3QgOiB0IGxpc3QgLT4gdFxuICB2YWwgb2ZfbGlzdCA6IGVsdCBsaXN0IC0+IHRcbiAgdmFsIG9mX3NlcXVlbmNlIDogZWx0IFNlcXVlbmNlLnQgLT4gdFxuICB2YWwgb2ZfYXJyYXkgOiBlbHQgYXJyYXkgLT4gdFxuICB2YWwgb2Zfc29ydGVkX2FycmF5IDogZWx0IGFycmF5IC0+IHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6IGVsdCBhcnJheSAtPiB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCA6IGxlbjppbnQgLT4gZjooaW50IC0+IGVsdCkgLT4gdFxuICB2YWwgc3RhYmxlX2RlZHVwX2xpc3QgOiBlbHQgbGlzdCAtPiBlbHQgbGlzdFxuICB2YWwgbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gZWx0KSAtPiB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gZWx0IG9wdGlvbikgLT4gdFxuICB2YWwgb2ZfdHJlZSA6IHRyZWUgLT4gdFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMSA9IHNpZ1xuICB0eXBlICgnYSwgJ2NtcCkgc2V0XG4gIHR5cGUgJ2EgdFxuICB0eXBlICdhIHRyZWVcbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcblxuICB2YWwgZW1wdHkgOiAnYSB0XG4gIHZhbCBzaW5nbGV0b24gOiAnYSAtPiAnYSB0XG4gIHZhbCB1bmlvbl9saXN0IDogJ2EgdCBsaXN0IC0+ICdhIHRcbiAgdmFsIG9mX2xpc3QgOiAnYSBsaXN0IC0+ICdhIHRcbiAgdmFsIG9mX3NlcXVlbmNlIDogJ2EgU2VxdWVuY2UudCAtPiAnYSB0XG4gIHZhbCBvZl9hcnJheSA6ICdhIGFycmF5IC0+ICdhIHRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6ICdhIGFycmF5IC0+ICdhIHQgT3JfZXJyb3IudFxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCA6ICdhIGFycmF5IC0+ICdhIHRcbiAgdmFsIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIDogbGVuOmludCAtPiBmOihpbnQgLT4gJ2EpIC0+ICdhIHRcbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogJ2EgbGlzdCAtPiAnYSBsaXN0XG4gIHZhbCBtYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYikgLT4gJ2IgdFxuICB2YWwgZmlsdGVyX21hcCA6ICgnYSwgXykgc2V0IC0+IGY6KCdhIC0+ICdiIG9wdGlvbikgLT4gJ2IgdFxuICB2YWwgb2ZfdHJlZSA6ICdhIHRyZWUgLT4gJ2EgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzMiA9IHNpZ1xuICB0eXBlICgnYSwgJ2NtcCkgc2V0XG4gIHR5cGUgKCdhLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIGVtcHR5IDogKCdhLCAnY21wKSB0XG4gIHZhbCBzaW5nbGV0b24gOiAnYSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHVuaW9uX2xpc3QgOiAoJ2EsICdjbXApIHQgbGlzdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2xpc3QgOiAnYSBsaXN0IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2Zfc2VxdWVuY2UgOiAnYSBTZXF1ZW5jZS50IC0+ICgnYSwgJ2NtcCkgdFxuICB2YWwgb2ZfYXJyYXkgOiAnYSBhcnJheSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX3NvcnRlZF9hcnJheSA6ICdhIGFycmF5IC0+ICgnYSwgJ2NtcCkgdCBPcl9lcnJvci50XG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIDogJ2EgYXJyYXkgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCA6IGxlbjppbnQgLT4gZjooaW50IC0+ICdhKSAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHN0YWJsZV9kZWR1cF9saXN0IDogJ2EgbGlzdCAtPiAnYSBsaXN0XG4gIHZhbCBtYXAgOiAoJ2EsIF8pIHNldCAtPiBmOignYSAtPiAnYikgLT4gKCdiLCAnY21wKSB0XG4gIHZhbCBmaWx0ZXJfbWFwIDogKCdhLCBfKSBzZXQgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKSAtPiAoJ2IsICdjbXApIHRcbiAgdmFsIG9mX3RyZWUgOiAoJ2EsICdjbXApIHRyZWUgLT4gKCdhLCAnY21wKSB0XG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICB0eXBlICgnYSwgJ2NtcCkgc2V0XG4gIHR5cGUgKCdhLCAnY21wKSB0XG4gIHR5cGUgKCdhLCAnY21wKSB0cmVlXG5cbiAgdmFsIGVtcHR5IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIHNpbmdsZXRvbiA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCB1bmlvbl9saXN0IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHQgbGlzdCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2xpc3QgOiBjb21wYXJhdG9yOignYSwgJ2NtcCkgQ29tcGFyYXRvci50IC0+ICdhIGxpc3QgLT4gKCdhLCAnY21wKSB0XG4gIHZhbCBvZl9zZXF1ZW5jZSA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgU2VxdWVuY2UudCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2FycmF5IDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAnYSBhcnJheSAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5XG4gICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICdhIGFycmF5XG4gICAgLT4gKCdhLCAnY21wKSB0IE9yX2Vycm9yLnRcblxuICB2YWwgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAnYSBhcnJheVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiBsZW46aW50XG4gICAgLT4gZjooaW50IC0+ICdhKVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuXG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6IGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnQgLT4gJ2EgbGlzdCAtPiAnYSBsaXN0XG5cbiAgdmFsIG1hcFxuICAgIDogIGNvbXBhcmF0b3I6KCdiLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAtPiAoJ2EsIF8pIHNldFxuICAgIC0+IGY6KCdhIC0+ICdiKVxuICAgIC0+ICgnYiwgJ2NtcCkgdFxuXG4gIHZhbCBmaWx0ZXJfbWFwXG4gICAgOiAgY29tcGFyYXRvcjooJ2IsICdjbXApIENvbXBhcmF0b3IudFxuICAgIC0+ICgnYSwgXykgc2V0XG4gICAgLT4gZjooJ2EgLT4gJ2Igb3B0aW9uKVxuICAgIC0+ICgnYiwgJ2NtcCkgdFxuXG4gIHZhbCBvZl90cmVlIDogY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudCAtPiAoJ2EsICdjbXApIHRyZWUgLT4gKCdhLCAnY21wKSB0XG5lbmRcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzXG4gICAgKFQgOiBUMilcbiAgICAoVHJlZSA6IFQyKVxuICAgIChFbHQgOiBUMSlcbiAgICAoQ21wIDogVDEpXG4gICAgKE9wdGlvbnMgOiBUMylcbiAgICAoXyA6IENyZWF0b3JzX2dlbmVyaWNcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBvcHRpb25zIDo9ICgnYSwgJ2IsICdjKSBPcHRpb25zLnRcbiAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgVC50XG4gICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIFRyZWUudFxuICAgICB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIEVsdC50XG4gICAgIHdpdGggdHlwZSAnY21wIGNtcCA6PSAnY21wIENtcC50KSA9XG5zdHJ1Y3QgZW5kXG5cbm1vZHVsZSBDaGVja19jcmVhdG9yczAgKE0gOiBDcmVhdG9yczApID1cbiAgQ2hlY2tfY3JlYXRvcnNcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSBNLnRcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gTS50cmVlXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9IE0uZWx0XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2NtcCB0ID0gTS5jb21wYXJhdG9yX3dpdG5lc3NcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMSAoTSA6IENyZWF0b3JzMSkgPVxuICBDaGVja19jcmVhdG9yc1xuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICdhIE0udFxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICgnYSwgJ2IpIHQgPSAnYSBNLnRyZWVcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnYSB0ID0gJ2FcbiAgICBlbmQpXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAnY21wIHQgPSBNLmNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZClcbiAgICAoV2l0aG91dF9jb21wYXJhdG9yKVxuICAgIChNKVxuXG5tb2R1bGUgQ2hlY2tfY3JlYXRvcnMyIChNIDogQ3JlYXRvcnMyKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdjbXAgdCA9ICdjbXBcbiAgICBlbmQpXG4gICAgKFdpdGhvdXRfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIENoZWNrX2NyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3IgKE0gOiBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yKSA9XG4gIENoZWNrX2NyZWF0b3JzXG4gICAgKHN0cnVjdFxuICAgICAgdHlwZSAoJ2EsICdiKSB0ID0gKCdhLCAnYikgTS50XG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIE0udHJlZVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuICAgIGVuZClcbiAgICAoc3RydWN0XG4gICAgICB0eXBlICdjbXAgdCA9ICdjbXBcbiAgICBlbmQpXG4gICAgKFdpdGhfY29tcGFyYXRvcilcbiAgICAoTSlcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yc19nZW5lcmljID0gc2lnXG4gIGluY2x1ZGUgQWNjZXNzb3JzX2dlbmVyaWNcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnNfZ2VuZXJpY1xuICAgIHdpdGggdHlwZSAoJ2EsICdiLCAnYykgb3B0aW9ucyA6PSAoJ2EsICdiLCAnYykgb3B0aW9uc1xuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdHJlZSA6PSAoJ2EsICdiKSB0cmVlXG4gICAgd2l0aCB0eXBlICdhIGVsdCA6PSAnYSBlbHRcbiAgICB3aXRoIHR5cGUgJ2NtcCBjbXAgOj0gJ2NtcCBjbXBcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMCA9IHNpZ1xuICBpbmNsdWRlIEFjY2Vzc29yczBcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnMwXG4gICAgd2l0aCB0eXBlIHQgOj0gdFxuICAgIHdpdGggdHlwZSB0cmVlIDo9IHRyZWVcbiAgICB3aXRoIHR5cGUgZWx0IDo9IGVsdFxuICAgIHdpdGggdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgOj0gY29tcGFyYXRvcl93aXRuZXNzXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczEgPSBzaWdcbiAgaW5jbHVkZSBBY2Nlc3NvcnMxXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzMVxuICAgIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgICB3aXRoIHR5cGUgJ2EgdHJlZSA6PSAnYSB0cmVlXG4gICAgd2l0aCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA6PSBjb21wYXJhdG9yX3dpdG5lc3NcbmVuZFxuXG5tb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMiA9IHNpZ1xuICBpbmNsdWRlIEFjY2Vzc29yczJcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgdHJlZVxuZW5kXG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvciA9IHNpZ1xuICBpbmNsdWRlIEFjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yXG5cbiAgaW5jbHVkZVxuICAgIENyZWF0b3JzMl93aXRoX2NvbXBhcmF0b3JcbiAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgdHJlZVxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfcG9seSA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxXG5cbm1vZHVsZSB0eXBlIEZvcl9kZXJpdmluZyA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcblxuICBtb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90IDogdCAtPiBTZXhwbGliMC5TZXhwLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIE1fb2Zfc2V4cCA9IHNpZ1xuICAgIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICAgIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gICAgW0BAQGVuZF1cblxuICAgIGluY2x1ZGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0IDo9IHRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICAgIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIENvbXBhcmVfbSA9IHNpZyBlbmRcbiAgbW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcbiAgbW9kdWxlIHR5cGUgSGFzaF9mb2xkX20gPSBIYXNoZXIuU1xuXG4gIHZhbCBzZXhwX29mX21fX3QgOiAobW9kdWxlIFNleHBfb2ZfbSB3aXRoIHR5cGUgdCA9ICdlbHQpIC0+ICgnZWx0LCAnY21wKSB0IC0+IFNleHAudFxuXG4gIHZhbCBtX190X29mX3NleHBcbiAgICA6ICAobW9kdWxlIE1fb2Zfc2V4cCB3aXRoIHR5cGUgdCA9ICdlbHQgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gJ2NtcClcbiAgICAtPiBTZXhwLnRcbiAgICAtPiAoJ2VsdCwgJ2NtcCkgdFxuXG4gIHZhbCBtX190X3NleHBfZ3JhbW1hclxuICAgIDogIChtb2R1bGUgTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSAnZWx0KVxuICAgIC0+ICgnZWx0LCAnY21wKSB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgdmFsIGNvbXBhcmVfbV9fdCA6IChtb2R1bGUgQ29tcGFyZV9tKSAtPiAoJ2VsdCwgJ2NtcCkgdCAtPiAoJ2VsdCwgJ2NtcCkgdCAtPiBpbnRcbiAgdmFsIGVxdWFsX21fX3QgOiAobW9kdWxlIEVxdWFsX20pIC0+ICgnZWx0LCAnY21wKSB0IC0+ICgnZWx0LCAnY21wKSB0IC0+IGJvb2xcblxuICB2YWwgaGFzaF9mb2xkX21fX3RcbiAgICA6ICAobW9kdWxlIEhhc2hfZm9sZF9tIHdpdGggdHlwZSB0ID0gJ2VsdClcbiAgICAtPiBIYXNoLnN0YXRlXG4gICAgLT4gKCdlbHQsIF8pIHRcbiAgICAtPiBIYXNoLnN0YXRlXG5cbiAgdmFsIGhhc2hfbV9fdCA6IChtb2R1bGUgSGFzaF9mb2xkX20gd2l0aCB0eXBlIHQgPSAnZWx0KSAtPiAoJ2VsdCwgXykgdCAtPiBpbnRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTZXQgPSBzaWdcbiAgKCoqIFNldHMgYmFzZWQgb24geyFDb21wYXJhdG9yLlN9LlxuXG4gICAgICBDcmVhdG9ycyByZXF1aXJlIGEgY29tcGFyYXRvciBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4sIHdoZXJlYXMgYWNjZXNzb3JzIHVzZSB0aGVcbiAgICAgIGNvbXBhcmF0b3IgcHJvdmlkZWQgYnkgdGhlIGlucHV0IHNldC4gKilcblxuICAoKiogVGhlIHR5cGUgb2YgYSBzZXQuICBUaGUgZmlyc3QgdHlwZSBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCwgYW5kXG4gICAgICB0aGUgc2Vjb25kIGlkZW50aWZpZXMgdGhlIGNvbXBhcmF0b3IsIHdoaWNoIGRldGVybWluZXMgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gdGhhdFxuICAgICAgaXMgdXNlZCBmb3Igb3JkZXJpbmcgZWxlbWVudHMgaW4gdGhpcyBzZXQuICBNYW55IG9wZXJhdGlvbnMgKGUuZy4sIHshdW5pb259KSxcbiAgICAgIHJlcXVpcmUgdGhhdCB0aGV5IGJlIHBhc3NlZCBzZXRzIHdpdGggdGhlIHNhbWUgZWxlbWVudCB0eXBlIGFuZCB0aGUgc2FtZSBjb21wYXJhdG9yXG4gICAgICB0eXBlLiAqKVxuICB0eXBlICgnZWx0LCAnY21wKSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlXVxuXG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkNvbXBhcmFibGUuUzIgd2l0aCB0eXBlICgnZWx0LCAnY21wKSB0IDo9ICgnZWx0LCAnY21wKSB0XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlICgnaywgJ2NtcCkgY29tcGFyYXRvciA9ICgnaywgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICBbQEBkZXByZWNhdGVkIFwiW3NpbmNlIDIwMjEtMTJdIHVzZSBbQ29tcGFyYXRvci5Nb2R1bGUudF0gaW5zdGVhZFwiXVxuXG4gICgqKiBUZXN0cyBpbnRlcm5hbCBpbnZhcmlhbnRzIG9mIHRoZSBzZXQgZGF0YSBzdHJ1Y3R1cmUuICBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4gKilcbiAgdmFsIGludmFyaWFudHMgOiAoXywgXykgdCAtPiBib29sXG5cbiAgKCoqIFJldHVybnMgYSBmaXJzdC1jbGFzcyBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCBvdGhlciBtYXAvc2V0L2V0Y1xuICAgICAgd2l0aCB0aGUgc2FtZSBub3Rpb24gb2YgY29tcGFyaXNvbi4gKilcbiAgdmFsIGNvbXBhcmF0b3JfcyA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcblxuICB2YWwgY29tcGFyYXRvciA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIENvbXBhcmF0b3IudFxuXG4gICgqKiBDcmVhdGVzIGFuIGVtcHR5IHNldCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29tcGFyYXRvci4gKilcbiAgdmFsIGVtcHR5IDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBDcmVhdGVzIGEgc2V0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb21wYXJhdG9yIHRoYXQgY29udGFpbnMgb25seSB0aGUgcHJvdmlkZWRcbiAgICAgIGVsZW1lbnQuICopXG4gIHZhbCBzaW5nbGV0b24gOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFJldHVybnMgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBzZXQuIFtPKDEpXS4gKilcbiAgdmFsIGxlbmd0aCA6IChfLCBfKSB0IC0+IGludFxuXG4gICgqKiBbaXNfZW1wdHkgdF0gaXMgW3RydWVdIGlmZiBbdF0gaXMgZW1wdHkuICBbTygxKV0uICopXG4gIHZhbCBpc19lbXB0eSA6IChfLCBfKSB0IC0+IGJvb2xcblxuICAoKiogW21lbSB0IGFdIHJldHVybnMgW3RydWVdIGlmZiBbYV0gaXMgaW4gW3RdLiAgW08obG9nIG4pXS4gKilcbiAgdmFsIG1lbSA6ICgnYSwgXykgdCAtPiAnYSAtPiBib29sXG5cbiAgKCoqIFthZGQgdCBhXSByZXR1cm5zIGEgbmV3IHNldCB3aXRoIFthXSBhZGRlZCB0byBbdF0sIG9yIHJldHVybnMgW3RdIGlmIFttZW0gdCBhXS5cbiAgICAgIFtPKGxvZyBuKV0uICopXG4gIHZhbCBhZGQgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtyZW1vdmUgdCBhXSByZXR1cm5zIGEgbmV3IHNldCB3aXRoIFthXSByZW1vdmVkIGZyb20gW3RdIGlmIFttZW0gdCBhXSwgb3IgcmV0dXJucyBbdF1cbiAgICAgIG90aGVyd2lzZS4gIFtPKGxvZyBuKV0uICopXG4gIHZhbCByZW1vdmUgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFt1bmlvbiB0MSB0Ml0gcmV0dXJucyB0aGUgdW5pb24gb2YgdGhlIHR3byBzZXRzLiAgW08obGVuZ3RoIHQxICsgbGVuZ3RoIHQyKV0uICopXG4gIHZhbCB1bmlvbiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFt1bmlvbiBjIGxpc3RdIHJldHVybnMgdGhlIHVuaW9uIG9mIGFsbCB0aGUgc2V0cyBpbiBbbGlzdF0uICBUaGVcbiAgICAgIFtjb21wYXJhdG9yXSBhcmd1bWVudCBpcyByZXF1aXJlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgW2xpc3RdIGlzIGVtcHR5LlxuICAgICAgW08obWF4KExpc3QubGVuZ3RoIGxpc3QsIG4gbG9nIG4pKV0sIHdoZXJlIFtuXSBpcyB0aGUgc3VtIG9mIHNpemVzIG9mIHRoZSBpbnB1dCBzZXRzLiAqKVxuICB2YWwgdW5pb25fbGlzdCA6ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAoJ2EsICdjbXApIHQgbGlzdCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW2ludGVyIHQxIHQyXSBjb21wdXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHNldHMgW3QxXSBhbmQgW3QyXS4gIFtPKGxlbmd0aCB0MSArXG4gICAgICBsZW5ndGggdDIpXS4gKilcbiAgdmFsIGludGVyIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW2RpZmYgdDEgdDJdIGNvbXB1dGVzIHRoZSBzZXQgZGlmZmVyZW5jZSBbdDEgLSB0Ml0sIGkuZS4sIHRoZSBzZXQgY29udGFpbmluZyBhbGxcbiAgICAgIGVsZW1lbnRzIGluIFt0MV0gdGhhdCBhcmUgbm90IGluIFt0Ml0uICBbTyhsZW5ndGggdDEgKyBsZW5ndGggdDIpXS4gKilcbiAgdmFsIGRpZmYgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbc3ltbWV0cmljX2RpZmYgdDEgdDJdIHJldHVybnMgYSBzZXF1ZW5jZSBvZiBjaGFuZ2VzIGJldHdlZW4gW3QxXSBhbmQgW3QyXS4gSXQgaXNcbiAgICAgIGludGVuZGVkIHRvIGJlIGVmZmljaWVudCBpbiB0aGUgY2FzZSB3aGVyZSBbdDFdIGFuZCBbdDJdIHNoYXJlIGEgbGFyZ2UgYW1vdW50IG9mXG4gICAgICBzdHJ1Y3R1cmUuICopXG4gIHZhbCBzeW1tZXRyaWNfZGlmZiA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnYSkgRWl0aGVyLnQgU2VxdWVuY2UudFxuXG4gICgqKiBbY29tcGFyZV9kaXJlY3QgdDEgdDJdIGNvbXBhcmVzIHRoZSBzZXRzIFt0MV0gYW5kIFt0Ml0uICBJdCByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgYXMgW2NvbXBhcmVdLCBidXQgdW5saWtlIGNvbXBhcmUsIGRvZXNuJ3QgcmVxdWlyZSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIGluIGZvciB0aGVcbiAgICAgIHR5cGUgcGFyYW1ldGVycyBvZiB0aGUgc2V0LiAgW08obGVuZ3RoIHQxICsgbGVuZ3RoIHQyKV0uICopXG4gIHZhbCBjb21wYXJlX2RpcmVjdCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gaW50XG5cbiAgKCoqIEhhc2ggZnVuY3Rpb246IGEgYnVpbGRpbmcgYmxvY2sgdG8gdXNlIHdoZW4gaGFzaGluZyBkYXRhIHN0cnVjdHVyZXMgY29udGFpbmluZyBzZXRzIGluXG4gICAgICB0aGVtLiBbaGFzaF9mb2xkX2RpcmVjdCBoYXNoX2ZvbGRfa2V5XSBpcyBjb21wYXRpYmxlIHdpdGggW2NvbXBhcmVfZGlyZWN0XSBpZmZcbiAgICAgIFtoYXNoX2ZvbGRfa2V5XSBpcyBjb21wYXRpYmxlIHdpdGggWyhjb21wYXJhdG9yIHMpLmNvbXBhcmVdIG9mIHRoZSBzZXQgW3NdIGJlaW5nXG4gICAgICBoYXNoZWQuICopXG4gIHZhbCBoYXNoX2ZvbGRfZGlyZWN0IDogJ2EgSGFzaC5mb2xkZXIgLT4gKCdhLCAnY21wKSB0IEhhc2guZm9sZGVyXG5cbiAgKCoqIFtlcXVhbCB0MSB0Ml0gcmV0dXJucyBbdHJ1ZV0gaWZmIHRoZSB0d28gc2V0cyBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzLiAgW08obGVuZ3RoIHQxICtcbiAgICAgIGxlbmd0aCB0MildICopXG4gIHZhbCBlcXVhbCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuXG4gICgqKiBbZXhpc3RzIHQgfmZdIHJldHVybnMgW3RydWVdIGlmZiB0aGVyZSBleGlzdHMgYW4gW2FdIGluIFt0XSBmb3Igd2hpY2ggW2YgYV0uICBbTyhuKV0sXG4gICAgICBidXQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGZpbmRzIGFuIFthXSBmb3Igd2hpY2ggW2YgYV0uICopXG4gIHZhbCBleGlzdHMgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBbZm9yX2FsbCB0IH5mXSByZXR1cm5zIFt0cnVlXSBpZmYgZm9yIGFsbCBbYV0gaW4gW3RdLCBbZiBhXS4gIFtPKG4pXSwgYnV0IHJldHVybnMgYXNcbiAgICAgIHNvb24gYXMgaXQgZmluZHMgYW4gW2FdIGZvciB3aGljaCBbbm90IChmIGEpXS4gKilcbiAgdmFsIGZvcl9hbGwgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gYm9vbFxuXG4gICgqKiBbY291bnQgdF0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIFt0XSBmb3Igd2hpY2ggW2ZdIHJldHVybnMgW3RydWVdLlxuICAgICAgW08obildLiAqKVxuICB2YWwgY291bnQgOiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gaW50XG5cbiAgKCoqIFtzdW0gdF0gcmV0dXJucyB0aGUgc3VtIG9mIFtmIHRdIGZvciBlYWNoIFt0XSBpbiB0aGUgc2V0LlxuICAgICAgW08obildLiAqKVxuICB2YWwgc3VtXG4gICAgOiAgKG1vZHVsZSBDb250YWluZXIuU3VtbWFibGUgd2l0aCB0eXBlIHQgPSAnc3VtKVxuICAgIC0+ICgnYSwgXykgdFxuICAgIC0+IGY6KCdhIC0+ICdzdW0pXG4gICAgLT4gJ3N1bVxuXG4gICgqKiBbZmluZCB0IGZdIHJldHVybnMgYW4gZWxlbWVudCBvZiBbdF0gZm9yIHdoaWNoIFtmXSByZXR1cm5zIHRydWUsIHdpdGggbm8gZ3VhcmFudGVlIGFzXG4gICAgICB0byB3aGljaCBlbGVtZW50IGlzIHJldHVybmVkLiAgW08obildLCBidXQgcmV0dXJucyBhcyBzb29uIGFzIGEgc3VpdGFibGUgZWxlbWVudCBpc1xuICAgICAgZm91bmQuICopXG4gIHZhbCBmaW5kIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhIG9wdGlvblxuXG4gICgqKiBbZmluZF9tYXAgdCBmXSByZXR1cm5zIFtiXSBmb3Igc29tZSBbYV0gaW4gW3RdIGZvciB3aGljaCBbZiBhID0gU29tZSBiXS4gIElmIG5vIHN1Y2hcbiAgICAgIFthXSBleGlzdHMsIHRoZW4gW2ZpbmRdIHJldHVybnMgW05vbmVdLiAgW08obildLCBidXQgcmV0dXJucyBhcyBzb29uIGFzIGEgc3VpdGFibGVcbiAgICAgIGVsZW1lbnQgaXMgZm91bmQuICopXG4gIHZhbCBmaW5kX21hcCA6ICgnYSwgXykgdCAtPiBmOignYSAtPiAnYiBvcHRpb24pIC0+ICdiIG9wdGlvblxuXG4gICgqKiBMaWtlIFtmaW5kXSwgYnV0IHRocm93cyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4gKilcbiAgdmFsIGZpbmRfZXhuIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IGJvb2wpIC0+ICdhXG5cbiAgKCoqIFtudGggdCBpXSByZXR1cm5zIHRoZSBbaV10aCBzbWFsbGVzdCBlbGVtZW50IG9mIFt0XSwgaW4gW08obG9nIG4pXSB0aW1lLiAgVGhlXG4gICAgICBzbWFsbGVzdCBlbGVtZW50IGhhcyBbaSA9IDBdLiAgUmV0dXJucyBbTm9uZV0gaWYgW2kgPCAwXSBvciBbaSA+PSBsZW5ndGggdF0uICopXG4gIHZhbCBudGggOiAoJ2EsIF8pIHQgLT4gaW50IC0+ICdhIG9wdGlvblxuXG4gICgqKiBbcmVtb3ZlX2luZGV4IHQgaV0gcmV0dXJucyBhIHZlcnNpb24gb2YgW3RdIHdpdGggdGhlIFtpXXRoIHNtYWxsZXN0IGVsZW1lbnQgcmVtb3ZlZCxcbiAgICAgIGluIFtPKGxvZyBuKV0gdGltZS4gIFRoZSBzbWFsbGVzdCBlbGVtZW50IGhhcyBbaSA9IDBdLiAgUmV0dXJucyBbdF0gaWYgW2kgPCAwXSBvclxuICAgICAgW2kgPj0gbGVuZ3RoIHRdLiAqKVxuICB2YWwgcmVtb3ZlX2luZGV4IDogKCdhLCAnY21wKSB0IC0+IGludCAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW2lzX3N1YnNldCB0MSB+b2ZfOnQyXSByZXR1cm5zIHRydWUgaWZmIFt0MV0gaXMgYSBzdWJzZXQgb2YgW3QyXS4gKilcbiAgdmFsIGlzX3N1YnNldCA6ICgnYSwgJ2NtcCkgdCAtPiBvZl86KCdhLCAnY21wKSB0IC0+IGJvb2xcblxuICAoKiogW2FyZV9kaXNqb2ludCB0MSB0Ml0gcmV0dXJucyBbdHJ1ZV0gaWZmIFtpc19lbXB0eSAoaW50ZXIgdDEgdDIpXSwgYnV0IGlzIG1vcmVcbiAgICAgIGVmZmljaWVudC4gKilcbiAgdmFsIGFyZV9kaXNqb2ludCA6ICgnYSwgJ2NtcCkgdCAtPiAoJ2EsICdjbXApIHQgLT4gYm9vbFxuXG4gICgqKiBbTmFtZWRdIGFsbG93cyB0aGUgdmFsaWRhdGlvbiBvZiBzdWJzZXQgYW5kIGVxdWFsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBzZXRzLiAgQVxuICAgICAgW05hbWVkLnRdIGlzIGEgcmVjb3JkIG9mIGEgc2V0IGFuZCBhIG5hbWUsIHdoZXJlIHRoZSBuYW1lIGlzIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMsXG4gICAgICBhbmQgW05hbWVkLmlzX3N1YnNldF0gYW5kIFtOYW1lZC5lcXVhbF0gdmFsaWRhdGUgc3Vic2V0IGFuZCBlcXVhbGl0eSByZWxhdGlvbnNoaXBzXG4gICAgICByZXNwZWN0aXZlbHkuXG5cbiAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGZvciwgZS5nLixcbiAgICAgIHtbXG4gICAgICAgIE5hbWVkLmlzX3N1YnNldCB7IHNldCA9IHNldDE7IG5hbWUgPSBcInNldDFcIiB9IH5vZl86e3NldCA9IHNldDI7IG5hbWUgPSBcInNldDJcIiB9XG4gICAgICBdfVxuXG4gICAgICBsb29rcyBsaWtlXG4gICAgICB7dlxuICAgICAgICAoXCJzZXQxIGlzIG5vdCBhIHN1YnNldCBvZiBzZXQyXCIgKGludmFsaWRfZWxlbWVudHMgKC4uLmVsZW1lbnRzIG9mIHNldDEgLSBzZXQyLi4uKSkpXG4gICAgIHZ9XG5cbiAgICAgIHNvIFtuYW1lXSBzaG91bGQgYmUgYSBub3VuIHBocmFzZSB0aGF0IGRvZXNuJ3Qgc291bmQgYXdrd2FyZCBpbiB0aGUgYWJvdmUgZXJyb3JcbiAgICAgIG1lc3NhZ2UuICBFdmVuIHRob3VnaCBpdCBhZGRzIHZlcmJvc2l0eSwgY2hvb3NpbmcgW25hbWVdcyB0aGF0IHN0YXJ0IHdpdGggdGhlIHBocmFzZVxuICAgICAgXCJ0aGUgc2V0IG9mXCIgb2Z0ZW4gbWFrZXMgdGhlIGVycm9yIG1lc3NhZ2Ugc291bmQgbW9yZSBuYXR1cmFsLlxuICAqKVxuICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyAoJ2EsICdjbXApIHQgPVxuICAgICAgeyBzZXQgOiAoJ2EsICdjbXApIHRcbiAgICAgIDsgbmFtZSA6IHN0cmluZ1xuICAgICAgfVxuXG4gICAgKCoqIFtpc19zdWJzZXQgdDEgfm9mXzp0Ml0gcmV0dXJucyBbT2sgKCldIGlmIFt0MV0gaXMgYSBzdWJzZXQgb2YgW3QyXSBhbmQgYVxuICAgICAgICBodW1hbi1yZWFkYWJsZSBlcnJvciBvdGhlcndpc2UuICAqKVxuICAgIHZhbCBpc19zdWJzZXQgOiAoJ2EsICdjbXApIHQgLT4gb2ZfOignYSwgJ2NtcCkgdCAtPiB1bml0IE9yX2Vycm9yLnRcblxuICAgICgqKiBbZXF1YWwgdDEgdDJdIHJldHVybnMgW09rICgpXSBpZiBbdDFdIGlzIGVxdWFsIHRvIFt0Ml0gYW5kIGEgaHVtYW4tcmVhZGFibGVcbiAgICAgICAgZXJyb3Igb3RoZXJ3aXNlLiAgKilcbiAgICB2YWwgZXF1YWwgOiAoJ2EsICdjbXApIHQgLT4gKCdhLCAnY21wKSB0IC0+IHVuaXQgT3JfZXJyb3IudFxuICBlbmRcblxuICAoKiogVGhlIGxpc3Qgb3IgYXJyYXkgZ2l2ZW4gdG8gW29mX2xpc3RdIGFuZCBbb2ZfYXJyYXldIG5lZWQgbm90IGJlIHNvcnRlZC4gKilcbiAgdmFsIG9mX2xpc3QgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgbGlzdCAtPiAoJ2EsICdjbXApIHRcblxuICB2YWwgb2Zfc2VxdWVuY2UgOiAoJ2EsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnQgLT4gJ2EgU2VxdWVuY2UudCAtPiAoJ2EsICdjbXApIHRcbiAgdmFsIG9mX2FycmF5IDogKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50IC0+ICdhIGFycmF5IC0+ICgnYSwgJ2NtcCkgdFxuXG4gICgqKiBbdG9fbGlzdF0gYW5kIFt0b19hcnJheV0gcHJvZHVjZSBzZXF1ZW5jZXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlXG4gICAgICBjb21wYXJhdG9yLiAqKVxuICB2YWwgdG9fbGlzdCA6ICgnYSwgXykgdCAtPiAnYSBsaXN0XG5cbiAgdmFsIHRvX2FycmF5IDogKCdhLCBfKSB0IC0+ICdhIGFycmF5XG5cbiAgKCoqIENyZWF0ZSBzZXQgZnJvbSBzb3J0ZWQgYXJyYXkuICBUaGUgaW5wdXQgbXVzdCBiZSBzb3J0ZWQgKGVpdGhlciBpbiBhc2NlbmRpbmcgb3JcbiAgICAgIGRlc2NlbmRpbmcgb3JkZXIgYXMgZ2l2ZW4gYnkgdGhlIGNvbXBhcmF0b3IpIGFuZCBjb250YWluIG5vIGR1cGxpY2F0ZXMsIG90aGVyd2lzZSB0aGVcbiAgICAgIHJlc3VsdCBpcyBhbiBlcnJvci4gIFRoZSBjb21wbGV4aXR5IG9mIHRoaXMgZnVuY3Rpb24gaXMgW08obildLiAqKVxuICB2YWwgb2Zfc29ydGVkX2FycmF5XG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gJ2EgYXJyYXlcbiAgICAtPiAoJ2EsICdjbXApIHQgT3JfZXJyb3IudFxuXG4gICgqKiBTaW1pbGFyIHRvIFtvZl9zb3J0ZWRfYXJyYXldLCBidXQgd2l0aG91dCBjaGVja2luZyB0aGUgaW5wdXQgYXJyYXkuICopXG4gIHZhbCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkXG4gICAgOiAgKCdhLCAnY21wKSBDb21wYXJhdG9yLk1vZHVsZS50XG4gICAgLT4gJ2EgYXJyYXlcbiAgICAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW29mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIGMgfmxlbiB+Zl0gYmVoYXZlcyBsaWtlIFtvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGNcbiAgICAgIChBcnJheS5pbml0IGxlbiB+ZildLCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYSBkZWNyZWFzaW5nIG9yZGVyIGlzIG5vdFxuICAgICAgc3VwcG9ydGVkLiAgVGhlIGFkdmFudGFnZSBpcyBub3QgcmVxdWlyaW5nIHlvdSB0byBhbGxvY2F0ZSBhbiBpbnRlcm1lZGlhdGUgYXJyYXkuICBbZl1cbiAgICAgIHdpbGwgYmUgY2FsbGVkIHdpdGggMCwgMSwgLi4uIFtsZW4gLSAxXSwgaW4gb3JkZXIuICopXG4gIHZhbCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZFxuICAgIDogICgnYSwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudFxuICAgIC0+IGxlbjppbnRcbiAgICAtPiBmOihpbnQgLT4gJ2EpXG4gICAgLT4gKCdhLCAnY21wKSB0XG5cbiAgKCoqIFtzdGFibGVfZGVkdXBfbGlzdF0gaXMgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgW0xpc3RdIG1vZHVsZSBiZWNhdXNlIHRoZVxuICAgICAgaW1wbGVtZW50YXRpb24gcmVsaWVzIGNydWNpYWxseSBvbiBzZXRzLCBhbmQgYmVjYXVzZSBkb2luZyBzbyBhbGxvd3Mgb25lIHRvIGF2b2lkIHVzZXNcbiAgICAgIG9mIHBvbHltb3JwaGljIGNvbXBhcmlzb24gYnkgaW5zdGFudGlhdGluZyB0aGUgZnVuY3RvciBhdCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgb2YgW0NvbXBhcmF0b3JdIGFuZCB1c2luZyB0aGUgcmVzdWx0aW5nIFtzdGFibGVfZGVkdXBfbGlzdF0uICopXG4gIHZhbCBzdGFibGVfZGVkdXBfbGlzdCA6ICgnYSwgXykgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAnYSBsaXN0IC0+ICdhIGxpc3RcblxuICAoKiogW21hcCBjIHQgfmZdIHJldHVybnMgYSBuZXcgc2V0IGNyZWF0ZWQgYnkgYXBwbHlpbmcgW2ZdIHRvIGV2ZXJ5IGVsZW1lbnQgaW5cbiAgICAgIFt0XS4gIFRoZSByZXR1cm5lZCBzZXQgaXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFtjb21wYXJhdG9yXS4gIFtPKG4gbG9nIG4pXS4gKilcbiAgdmFsIG1hcCA6ICgnYiwgJ2NtcCkgQ29tcGFyYXRvci5Nb2R1bGUudCAtPiAoJ2EsIF8pIHQgLT4gZjooJ2EgLT4gJ2IpIC0+ICgnYiwgJ2NtcCkgdFxuXG4gICgqKiBMaWtlIHshbWFwfSwgZXhjZXB0IGVsZW1lbnRzIGZvciB3aGljaCBbZl0gcmV0dXJucyBbTm9uZV0gd2lsbCBiZSBkcm9wcGVkLiAgKilcbiAgdmFsIGZpbHRlcl9tYXBcbiAgICA6ICAoJ2IsICdjbXApIENvbXBhcmF0b3IuTW9kdWxlLnRcbiAgICAtPiAoJ2EsIF8pIHRcbiAgICAtPiBmOignYSAtPiAnYiBvcHRpb24pXG4gICAgLT4gKCdiLCAnY21wKSB0XG5cbiAgKCoqIFtmaWx0ZXIgdCB+Zl0gcmV0dXJucyB0aGUgc3Vic2V0IG9mIFt0XSBmb3Igd2hpY2ggW2ZdIGV2YWx1YXRlcyB0byB0cnVlLiAgW08obiBsb2dcbiAgICAgIG4pXS4gKilcbiAgdmFsIGZpbHRlciA6ICgnYSwgJ2NtcCkgdCAtPiBmOignYSAtPiBib29sKSAtPiAoJ2EsICdjbXApIHRcblxuICAoKiogW2ZvbGQgdCB+aW5pdCB+Zl0gZm9sZHMgb3ZlciB0aGUgZWxlbWVudHMgb2YgdGhlIHNldCBmcm9tIHNtYWxsZXN0IHRvIGxhcmdlc3QuICopXG4gIHZhbCBmb2xkIDogKCdhLCBfKSB0IC0+IGluaXQ6J2FjY3VtIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAnYWNjdW0pIC0+ICdhY2N1bVxuXG4gICgqKiBbZm9sZF9yZXN1bHQgfmluaXQgfmZdIGZvbGRzIG92ZXIgdGhlIGVsZW1lbnRzIG9mIHRoZSBzZXQgZnJvbSBzbWFsbGVzdCB0b1xuICAgICAgbGFyZ2VzdCwgc2hvcnQgY2lyY3VpdGluZyB0aGUgZm9sZCBpZiBbZiBhY2N1bSB4XSBpcyBhbiBbRXJyb3IgX10gKilcbiAgdmFsIGZvbGRfcmVzdWx0XG4gICAgOiAgKCdhLCBfKSB0XG4gICAgLT4gaW5pdDonYWNjdW1cbiAgICAtPiBmOignYWNjdW0gLT4gJ2EgLT4gKCdhY2N1bSwgJ2UpIFJlc3VsdC50KVxuICAgIC0+ICgnYWNjdW0sICdlKSBSZXN1bHQudFxuXG4gICgqKiBbZm9sZF91bnRpbCB0IH5pbml0IH5mXSBpcyBhIHNob3J0LWNpcmN1aXRpbmcgdmVyc2lvbiBvZiBbZm9sZF0uIElmIFtmXVxuICAgICAgcmV0dXJucyBbU3RvcCBfXSB0aGUgY29tcHV0YXRpb24gY2Vhc2VzIGFuZCByZXN1bHRzIGluIHRoYXQgdmFsdWUuIElmIFtmXSByZXR1cm5zXG4gICAgICBbQ29udGludWUgX10sIHRoZSBmb2xkIHdpbGwgcHJvY2VlZC4gKilcbiAgdmFsIGZvbGRfdW50aWxcbiAgICA6ICAoJ2EsIF8pIHRcbiAgICAtPiBpbml0OidhY2N1bVxuICAgIC0+IGY6KCdhY2N1bSAtPiAnYSAtPiAoJ2FjY3VtLCAnZmluYWwpIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQpXG4gICAgLT4gZmluaXNoOignYWNjdW0gLT4gJ2ZpbmFsKVxuICAgIC0+ICdmaW5hbFxuXG5cbiAgKCoqIExpa2UgeyFmb2xkfSwgZXhjZXB0IHRoYXQgaXQgZ29lcyBmcm9tIHRoZSBsYXJnZXN0IHRvIHRoZSBzbWFsbGVzdCBlbGVtZW50LiAqKVxuICB2YWwgZm9sZF9yaWdodCA6ICgnYSwgXykgdCAtPiBpbml0OidhY2N1bSAtPiBmOignYSAtPiAnYWNjdW0gLT4gJ2FjY3VtKSAtPiAnYWNjdW1cblxuICAoKiogW2l0ZXIgdCB+Zl0gY2FsbHMgW2ZdIG9uIGV2ZXJ5IGVsZW1lbnQgb2YgW3RdLCBnb2luZyBpbiBvcmRlciBmcm9tIHRoZSBzbWFsbGVzdCB0b1xuICAgICAgbGFyZ2VzdC4gICopXG4gIHZhbCBpdGVyIDogKCdhLCBfKSB0IC0+IGY6KCdhIC0+IHVuaXQpIC0+IHVuaXRcblxuICAoKiogSXRlcmF0ZSB0d28gc2V0cyBzaWRlIGJ5IHNpZGUuICBDb21wbGV4aXR5IGlzIFtPKG0rbildIHdoZXJlIFttXSBhbmQgW25dIGFyZSB0aGUgc2l6ZXNcbiAgICAgIG9mIHRoZSB0d28gaW5wdXQgc2V0cy4gIEFzIGFuIGV4YW1wbGUsIHdpdGggdGhlIGlucHV0cyBbMDsgMV0gYW5kIFsxOyAyXSwgW2ZdIHdpbGwgYmVcbiAgICAgIGNhbGxlZCB3aXRoIFtgTGVmdCAwXTsgW2BCb3RoICgxLCAxKV07IGFuZCBbYFJpZ2h0IDJdLiAqKVxuICB2YWwgaXRlcjJcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAtPiBmOihbIGBMZWZ0IG9mICdhIHwgYFJpZ2h0IG9mICdhIHwgYEJvdGggb2YgJ2EgKiAnYSBdIC0+IHVuaXQpXG4gICAgLT4gdW5pdFxuXG4gICgqKiBpZiBbYSwgYiA9IHBhcnRpdGlvbl90ZiBzZXQgfmZdIHRoZW4gW2FdIGlzIHRoZSBlbGVtZW50cyBvbiB3aGljaCBbZl0gcHJvZHVjZWQgW3RydWVdLFxuICAgICAgYW5kIFtiXSBpcyB0aGUgZWxlbWVudHMgb24gd2hpY2ggW2ZdIHByb2R1Y2VzIFtmYWxzZV0uICopXG4gIHZhbCBwYXJ0aXRpb25fdGYgOiAoJ2EsICdjbXApIHQgLT4gZjooJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0ICogKCdhLCAnY21wKSB0XG5cbiAgKCoqIFNhbWUgYXMgeyF0b19saXN0fS4gKilcbiAgdmFsIGVsZW1lbnRzIDogKCdhLCBfKSB0IC0+ICdhIGxpc3RcblxuICAoKiogUmV0dXJucyB0aGUgc21hbGxlc3QgZWxlbWVudCBvZiB0aGUgc2V0LiAgW08obG9nIG4pXS4gKilcbiAgdmFsIG1pbl9lbHQgOiAoJ2EsIF8pIHQgLT4gJ2Egb3B0aW9uXG5cbiAgKCoqIExpa2UgeyFtaW5fZWx0fSwgYnV0IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBnaXZlbiBhbiBlbXB0eSBzZXQuICopXG4gIHZhbCBtaW5fZWx0X2V4biA6ICgnYSwgXykgdCAtPiAnYVxuXG4gICgqKiBSZXR1cm5zIHRoZSBsYXJnZXN0IGVsZW1lbnQgb2YgdGhlIHNldC4gIFtPKGxvZyBuKV0uICAqKVxuICB2YWwgbWF4X2VsdCA6ICgnYSwgXykgdCAtPiAnYSBvcHRpb25cblxuICAoKiogTGlrZSB7IW1heF9lbHR9LCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIGFuIGVtcHR5IHNldC4gKilcbiAgdmFsIG1heF9lbHRfZXhuIDogKCdhLCBfKSB0IC0+ICdhXG5cbiAgKCoqIHJldHVybnMgYW4gYXJiaXRyYXJ5IGVsZW1lbnQsIG9yIFtOb25lXSBpZiB0aGUgc2V0IGlzIGVtcHR5LiAqKVxuICB2YWwgY2hvb3NlIDogKCdhLCBfKSB0IC0+ICdhIG9wdGlvblxuXG4gICgqKiBMaWtlIHshY2hvb3NlfSwgYnV0IHRocm93cyBhbiBleGNlcHRpb24gb24gYW4gZW1wdHkgc2V0LiAqKVxuICB2YWwgY2hvb3NlX2V4biA6ICgnYSwgXykgdCAtPiAnYVxuXG4gICgqKiBbc3BsaXQgdCB4XSBwcm9kdWNlcyBhIHRyaXBsZSBbKHQxLCBtYXliZV94LCB0MildIHdoZXJlIFt0MV0gaXMgdGhlIHNldCBvZiBlbGVtZW50c1xuICAgICAgc3RyaWN0bHkgbGVzcyB0aGFuIFt4XSwgW21heWJlX3hdIGlzIHRoZSBtZW1iZXIgKGlmIGFueSkgb2YgW3RdIHdoaWNoIGNvbXBhcmVzIGVxdWFsXG4gICAgICB0byBbeF0sIGFuZCBbdDJdIGlzIHRoZSBzZXQgb2YgZWxlbWVudHMgc3RyaWN0bHkgbGFyZ2VyIHRoYW4gW3hdLiAqKVxuICB2YWwgc3BsaXQgOiAoJ2EsICdjbXApIHQgLT4gJ2EgLT4gKCdhLCAnY21wKSB0ICogJ2Egb3B0aW9uICogKCdhLCAnY21wKSB0XG5cbiAgKCoqIGlmIFtlcXVpdl0gaXMgYW4gZXF1aXZhbGVuY2UgcHJlZGljYXRlLCB0aGVuIFtncm91cF9ieSBzZXQgfmVxdWl2XSBwcm9kdWNlcyBhIGxpc3RcbiAgICAgIG9mIGVxdWl2YWxlbmNlIGNsYXNzZXMgKGkuZS4sIGEgc2V0LXRoZW9yZXRpYyBxdW90aWVudCkuICBFLmcuLFxuXG4gICAgICB7W1xuICAgICAgICBsZXQgY2hhcnMgPSBTZXQub2ZfbGlzdCBbJ0EnOyAnYSc7ICdiJzsgJ2MnXSBpblxuICAgICAgICBsZXQgZXF1aXYgYyBjJyA9IENoYXIuZXF1YWwgKENoYXIudXBwZXJjYXNlIGMpIChDaGFyLnVwcGVyY2FzZSBjJykgaW5cbiAgICAgICAgZ3JvdXBfYnkgY2hhcnMgfmVxdWl2XG4gICAgICBdfVxuXG4gICAgICBwcm9kdWNlczpcblxuICAgICAge1tcbiAgICAgICAgW1NldC5vZl9saXN0IFsnQSc7J2EnXTsgU2V0LnNpbmdsZXRvbiAnYic7IFNldC5zaW5nbGV0b24gJ2MnXVxuICAgICAgXX1cblxuICAgICAgW2dyb3VwX2J5XSBydW5zIGluIE8obl4yKSB0aW1lLCBzbyBpZiB5b3UgaGF2ZSBhIGNvbXBhcmlzb24gZnVuY3Rpb24sIGl0J3MgdXN1YWxseVxuICAgICAgbXVjaCBmYXN0ZXIgdG8gdXNlIFtTZXQub2ZfbGlzdF0uICopXG4gIHZhbCBncm91cF9ieSA6ICgnYSwgJ2NtcCkgdCAtPiBlcXVpdjooJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gKCdhLCAnY21wKSB0IGxpc3RcblxuICAoKiogW3RvX3NlcXVlbmNlIHRdIGNvbnZlcnRzIHRoZSBzZXQgW3RdIHRvIGEgc2VxdWVuY2Ugb2YgdGhlIGVsZW1lbnRzIGJldHdlZW5cbiAgICAgIFtncmVhdGVyX29yX2VxdWFsX3RvXSBhbmQgW2xlc3Nfb3JfZXF1YWxfdG9dIGluY2x1c2l2ZSBpbiB0aGUgb3JkZXIgaW5kaWNhdGVkIGJ5XG4gICAgICBbb3JkZXJdLiAgSWYgW2dyZWF0ZXJfb3JfZXF1YWxfdG8gPiBsZXNzX29yX2VxdWFsX3RvXSB0aGUgc2VxdWVuY2UgaXMgZW1wdHkuICBDb3N0IGlzXG4gICAgICBPKGxvZyBuKSB1cCBmcm9udCBhbmQgYW1vcnRpemVkIE8oMSkgZm9yIGVhY2ggZWxlbWVudCBwcm9kdWNlZC4gKilcbiAgdmFsIHRvX3NlcXVlbmNlXG4gICAgOiAgP29yZGVyOlsgYEluY3JlYXNpbmcgKCoqIGRlZmF1bHQgKikgfCBgRGVjcmVhc2luZyBdXG4gICAgLT4gP2dyZWF0ZXJfb3JfZXF1YWxfdG86J2FcbiAgICAtPiA/bGVzc19vcl9lcXVhbF90bzonYVxuICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgIC0+ICdhIFNlcXVlbmNlLnRcblxuICAoKiogW2JpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSB3aGljaCBlbHRdIHJldHVybnMgdGhlIGVsZW1lbnQgaW4gW3RdIHNwZWNpZmllZCBieVxuICAgICAgW2NvbXBhcmVdIGFuZCBbd2hpY2hdLCBpZiBvbmUgZXhpc3RzLlxuXG4gICAgICBbdF0gbXVzdCBiZSBzb3J0ZWQgaW4gaW5jcmVhc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gW2NvbXBhcmVdLCB3aGVyZSBbY29tcGFyZV0gYW5kXG4gICAgICBbZWx0XSBkaXZpZGUgW3RdIGludG8gdGhyZWUgKHBvc3NpYmx5IGVtcHR5KSBzZWdtZW50czpcblxuICAgICAge3ZcbiAgICAgICAgfCAgPCBlbHQgIHwgID0gZWx0ICB8ICA+IGVsdCAgfFxuICAgICAgdn1cblxuICAgICAgW2JpbmFyeV9zZWFyY2hdIHJldHVybnMgYW4gZWxlbWVudCBvbiB0aGUgYm91bmRhcnkgb2Ygc2VnbWVudHMgYXMgc3BlY2lmaWVkIGJ5XG4gICAgICBbd2hpY2hdLiAgU2VlIHRoZSBkaWFncmFtIGJlbG93IG5leHQgdG8gdGhlIFt3aGljaF0gdmFyaWFudHMuXG5cbiAgICAgIFtiaW5hcnlfc2VhcmNoXSBkb2VzIG5vdCBjaGVjayB0aGF0IFtjb21wYXJlXSBvcmRlcnMgW3RdLCBhbmQgYmVoYXZpb3IgaXNcbiAgICAgIHVuc3BlY2lmaWVkIGlmIFtjb21wYXJlXSBkb2Vzbid0IG9yZGVyIFt0XS4gIEJlaGF2aW9yIGlzIGFsc28gdW5zcGVjaWZpZWQgaWZcbiAgICAgIFtjb21wYXJlXSBtdXRhdGVzIFt0XS4gKilcbiAgdmFsIGJpbmFyeV9zZWFyY2hcbiAgICA6ICAoJ2EsICdjbXApIHRcbiAgICAtPiBjb21wYXJlOignYSAtPiAna2V5IC0+IGludClcbiAgICAtPiBbIGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAoKiogICAgICAgIHt2IHwgPCBlbHQgWCB8ICAgICAgICAgICAgICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvICgqKiAgICAge3YgfCAgICAgIDw9IGVsdCAgICAgICBYIHwgICAgICAgICAgIHZ9ICopXG4gICAgICAgfCBgTGFzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgICB7diAgICAgICAgICAgfCAgID0gZWx0IFggfCAgICAgICAgICAgdn0gKilcbiAgICAgICB8IGBGaXJzdF9lcXVhbF90byAoKiogICAgICAgICAgICAgICAgIHt2ICAgICAgICAgICB8IFggPSBlbHQgICB8ICAgICAgICAgICB2fSAqKVxuICAgICAgIHwgYEZpcnN0X2dyZWF0ZXJfdGhhbl9vcl9lcXVhbF90byAoKioge3YgICAgICAgICAgIHwgWCAgICAgICA+PSBlbHQgICAgICB8IHZ9ICopXG4gICAgICAgfCBgRmlyc3Rfc3RyaWN0bHlfZ3JlYXRlcl90aGFuICgqKiAgICB7diAgICAgICAgICAgICAgICAgICAgICAgfCBYID4gZWx0IHwgdn0gKilcbiAgICAgICBdXG4gICAgLT4gJ2tleVxuICAgIC0+ICdhIG9wdGlvblxuXG4gICgqKiBbYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdCB+c2VnbWVudF9vZiB3aGljaF0gdGFrZXMgYSBbc2VnbWVudF9vZl0gZnVuY3Rpb24gdGhhdFxuICAgICAgZGl2aWRlcyBbdF0gaW50byB0d28gKHBvc3NpYmx5IGVtcHR5KSBzZWdtZW50czpcblxuICAgICAge3ZcbiAgICAgICAgfCBzZWdtZW50X29mIGVsdCA9IGBMZWZ0IHwgc2VnbWVudF9vZiBlbHQgPSBgUmlnaHQgfFxuICAgICAgdn1cblxuICAgICAgW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkXSByZXR1cm5zIHRoZSBlbGVtZW50IG9uIHRoZSBib3VuZGFyeSBvZiB0aGUgc2VnbWVudHMgYXNcbiAgICAgIHNwZWNpZmllZCBieSBbd2hpY2hdOiBbYExhc3Rfb25fbGVmdF0geWllbGRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxlZnQgc2VnbWVudCxcbiAgICAgIHdoaWxlIFtgRmlyc3Rfb25fcmlnaHRdIHlpZWxkcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcmlnaHQgc2VnbWVudC4gIEl0IHJldHVybnNcbiAgICAgIFtOb25lXSBpZiB0aGUgc2VnbWVudCBpcyBlbXB0eS5cblxuICAgICAgW2JpbmFyeV9zZWFyY2hfc2VnbWVudGVkXSBkb2VzIG5vdCBjaGVjayB0aGF0IFtzZWdtZW50X29mXSBzZWdtZW50cyBbdF0gYXMgaW4gdGhlXG4gICAgICBkaWFncmFtLCBhbmQgYmVoYXZpb3IgaXMgdW5zcGVjaWZpZWQgaWYgW3NlZ21lbnRfb2ZdIGRvZXNuJ3Qgc2VnbWVudCBbdF0uICBCZWhhdmlvclxuICAgICAgaXMgYWxzbyB1bnNwZWNpZmllZCBpZiBbc2VnbWVudF9vZl0gbXV0YXRlcyBbdF0uICopXG4gIHZhbCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZFxuICAgIDogICgnYSwgJ2NtcCkgdFxuICAgIC0+IHNlZ21lbnRfb2Y6KCdhIC0+IFsgYExlZnQgfCBgUmlnaHQgXSlcbiAgICAtPiBbIGBMYXN0X29uX2xlZnQgfCBgRmlyc3Rfb25fcmlnaHQgXVxuICAgIC0+ICdhIG9wdGlvblxuXG4gICgqKiBQcm9kdWNlcyB0aGUgZWxlbWVudHMgb2YgdGhlIHR3byBzZXRzIGJldHdlZW4gW2dyZWF0ZXJfb3JfZXF1YWxfdG9dIGFuZFxuICAgICAgW2xlc3Nfb3JfZXF1YWxfdG9dIGluIFtvcmRlcl0sIG5vdGluZyB3aGV0aGVyIGVhY2ggZWxlbWVudCBhcHBlYXJzIGluIHRoZSBsZWZ0IHNldCxcbiAgICAgIHRoZSByaWdodCBzZXQsIG9yIGJvdGguICBJbiB0aGUgYm90aCBjYXNlLCBib3RoIGVsZW1lbnRzIGFyZSByZXR1cm5lZCwgaW4gY2FzZSB0aGVcbiAgICAgIGNhbGxlciBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlbGVtZW50cyB0aGF0IGFyZSBlcXVhbCB0byB0aGUgc2V0cycgY29tcGFyYXRvci4gIFJ1bnNcbiAgICAgIGluIE8obGVuZ3RoIHQgKyBsZW5ndGggdCcpLiAqKVxuICBtb2R1bGUgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudCA6IHNpZ1xuICAgIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIFNlcXVlbmNlLk1lcmdlX3dpdGhfZHVwbGljYXRlc19lbGVtZW50LnQgPVxuICAgICAgfCBMZWZ0IG9mICdhXG4gICAgICB8IFJpZ2h0IG9mICdiXG4gICAgICB8IEJvdGggb2YgJ2EgKiAnYlxuICAgIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZS5TMiB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICB2YWwgbWVyZ2VfdG9fc2VxdWVuY2VcbiAgICA6ICA/b3JkZXI6WyBgSW5jcmVhc2luZyAoKiogZGVmYXVsdCAqKSB8IGBEZWNyZWFzaW5nIF1cbiAgICAtPiA/Z3JlYXRlcl9vcl9lcXVhbF90bzonYVxuICAgIC0+ID9sZXNzX29yX2VxdWFsX3RvOidhXG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnY21wKSB0XG4gICAgLT4gKCdhLCAnYSkgTWVyZ2VfdG9fc2VxdWVuY2VfZWxlbWVudC50IFNlcXVlbmNlLnRcblxuICAoKiogW01dIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBPQ2FtbCBhcHBsaWNhdGl2ZSBmdW5jdG9yIHR5cGVzOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ19zZXQgPSBTZXQuTShTdHJpbmcpLnRcbiAgICAgIF19XG5cbiAgICAgIHdoaWNoIHN0YW5kcyBmb3I6XG5cbiAgICAgIHtbXG4gICAgICAgIHR5cGUgc3RyaW5nX3NldCA9IChTdHJpbmcudCwgU3RyaW5nLmNvbXBhcmF0b3Jfd2l0bmVzcykgU2V0LnRcbiAgICAgIF19XG5cbiAgICAgIFRoZSBwb2ludCBpcyB0aGF0IFtTZXQuTShTdHJpbmcpLnRdIHN1cHBvcnRzIGRlcml2aW5nLCB3aGVyZWFzIHRoZSBzZWNvbmQgc3ludGF4XG4gICAgICBkb2Vzbid0IChiZWNhdXNlIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMsIHNheSwgU3RyaW5nLnNleHBfb2ZfY29tcGFyYXRvcl93aXRuZXNzLFxuICAgICAgaW5zdGVhZCB5b3Ugd291bGQgd2FudCB0byBwYXNzIHRoZSBjb21wYXJhdG9yIGRpcmVjdGx5KS4gKilcbiAgbW9kdWxlIE0gKEVsdCA6IHNpZ1xuICAgICAgdHlwZSB0XG4gICAgICB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzc1xuICAgIGVuZCkgOiBzaWdcbiAgICB0eXBlIG5vbnJlYyB0ID0gKEVsdC50LCBFbHQuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gIGVuZFxuXG4gIGluY2x1ZGUgRm9yX2Rlcml2aW5nIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICAoKiogQSBwb2x5bW9ycGhpYyBTZXQuICopXG4gIG1vZHVsZSBQb2x5IDogU19wb2x5IHdpdGggdHlwZSAnZWx0IHQgPSAoJ2VsdCwgQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuXG4gICgqKiBVc2luZyBjb21wYXJhdG9yIGlzIGEgc2ltaWxhciBpbnRlcmZhY2UgYXMgdGhlIHRvcGxldmVsIG9mIFtTZXRdLCBleGNlcHQgdGhlIGZ1bmN0aW9uc1xuICAgICAgdGFrZSBhIFt+Y29tcGFyYXRvcjooJ2VsdCwgJ2NtcCkgQ29tcGFyYXRvci50XSB3aGVyZSB0aGUgZnVuY3Rpb25zIGF0IHRoZSB0b3BsZXZlbCBvZlxuICAgICAgW1NldF0gdGFrZXMgYSBbKCdlbHQsICdjbXApIGNvbXBhcmF0b3JdLiAqKVxuICBtb2R1bGUgVXNpbmdfY29tcGFyYXRvciA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjICgnZWx0LCAnY21wKSB0ID0gKCdlbHQsICdjbXApIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICB2YWwgc2V4cF9vZl90XG4gICAgICA6ICAoJ2VsdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2NtcCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgICAtPiAoJ2VsdCwgJ2NtcCkgdFxuICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgdmFsIHRfb2Zfc2V4cF9kaXJlY3RcbiAgICAgIDogIGNvbXBhcmF0b3I6KCdlbHQsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgLT4gKFNleHAudCAtPiAnZWx0KVxuICAgICAgLT4gU2V4cC50XG4gICAgICAtPiAoJ2VsdCwgJ2NtcCkgdFxuXG4gICAgbW9kdWxlIFRyZWUgOiBzaWdcbiAgICAgICgqKiBBIFtUcmVlLnRdIGNvbnRhaW5zIGp1c3QgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBhIHNldCBpcyBiYXNlZCBvbiwgd2l0aG91dFxuICAgICAgICAgIGluY2x1ZGluZyB0aGUgY29tcGFyYXRvci4gIEFjY29yZGluZ2x5LCBhbnkgb3BlcmF0aW9uIG9uIGEgW1RyZWUudF0gbXVzdCBhbHNvIHRha2VcbiAgICAgICAgICBhcyBhbiBhcmd1bWVudCB0aGUgY29ycmVzcG9uZGluZyBjb21wYXJhdG9yLiAqKVxuICAgICAgdHlwZSAoJ2EsICdjbXApIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgICAgIHZhbCBzZXhwX29mX3RcbiAgICAgICAgOiAgKCdhIC0+IFNleHBsaWIwLlNleHAudClcbiAgICAgICAgLT4gKCdjbXAgLT4gU2V4cGxpYjAuU2V4cC50KVxuICAgICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgICAgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICAgIFtAQEBlbmRdXG5cbiAgICAgIHZhbCB0X29mX3NleHBfZGlyZWN0XG4gICAgICAgIDogIGNvbXBhcmF0b3I6KCdlbHQsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgICAtPiAoU2V4cC50IC0+ICdlbHQpXG4gICAgICAgIC0+IFNleHAudFxuICAgICAgICAtPiAoJ2VsdCwgJ2NtcCkgdFxuXG4gICAgICBtb2R1bGUgTmFtZWQgOiBzaWdcbiAgICAgICAgdHlwZSBub25yZWMgKCdhLCAnY21wKSB0ID1cbiAgICAgICAgICB7IHRyZWUgOiAoJ2EsICdjbXApIHRcbiAgICAgICAgICA7IG5hbWUgOiBzdHJpbmdcbiAgICAgICAgICB9XG5cbiAgICAgICAgdmFsIGlzX3N1YnNldFxuICAgICAgICAgIDogIGNvbXBhcmF0b3I6KCdhLCAnY21wKSBDb21wYXJhdG9yLnRcbiAgICAgICAgICAtPiAoJ2EsICdjbXApIHRcbiAgICAgICAgICAtPiBvZl86KCdhLCAnY21wKSB0XG4gICAgICAgICAgLT4gdW5pdCBPcl9lcnJvci50XG5cbiAgICAgICAgdmFsIGVxdWFsXG4gICAgICAgICAgOiAgY29tcGFyYXRvcjooJ2EsICdjbXApIENvbXBhcmF0b3IudFxuICAgICAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgICAgIC0+ICgnYSwgJ2NtcCkgdFxuICAgICAgICAgIC0+IHVuaXQgT3JfZXJyb3IudFxuICAgICAgZW5kXG5cbiAgICAgIGluY2x1ZGVcbiAgICAgICAgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yXG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSBzZXQgOj0gKCdhLCAnYikgdFxuICAgICAgICB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG4gICAgICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0cmVlIDo9ICgnYSwgJ2IpIHRcbiAgICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIG5hbWVkIDo9ICgnYSwgJ2IpIE5hbWVkLnRcbiAgICAgICAgd2l0aCBtb2R1bGUgTmFtZWQgOj0gTmFtZWRcblxuICAgICAgdmFsIGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gOiAoXywgXykgdFxuICAgIGVuZFxuXG4gICAgaW5jbHVkZVxuICAgICAgQWNjZXNzb3JzMlxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgVHJlZS50XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgbmFtZWQgOj0gKCdhLCAnYikgTmFtZWQudFxuXG4gICAgaW5jbHVkZVxuICAgICAgQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvclxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHRyZWUgOj0gKCdhLCAnYikgVHJlZS50XG4gICAgICB3aXRoIHR5cGUgKCdhLCAnYikgc2V0IDo9ICgnYSwgJ2IpIHRcblxuICAgIHZhbCBjb21wYXJhdG9yIDogKCdhLCAnY21wKSB0IC0+ICgnYSwgJ2NtcCkgQ29tcGFyYXRvci50XG4gICAgdmFsIGhhc2hfZm9sZF9kaXJlY3QgOiAnZWx0IEhhc2guZm9sZGVyIC0+ICgnZWx0LCAnY21wKSB0IEhhc2guZm9sZGVyXG5cbiAgICBtb2R1bGUgRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoRWx0IDogQ29tcGFyYXRvci5TMSkgOiBzaWdcbiAgICAgIHZhbCBlbXB0eSA6ICgnYSBFbHQudCwgRWx0LmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICAgIGVuZFxuICBlbmRcblxuICAoKiogezIgTW9kdWxlcyBhbmQgbW9kdWxlIHR5cGVzIGZvciBleHRlbmRpbmcgW1NldF19XG5cbiAgICAgIEZvciB1c2UgaW4gZXh0ZW5zaW9ucyBvZiBCYXNlLCBsaWtlIFtDb3JlXS4gKilcblxuICBtb2R1bGUgV2l0aF9jb21wYXJhdG9yID0gV2l0aF9jb21wYXJhdG9yXG4gIG1vZHVsZSBXaXRoX2ZpcnN0X2NsYXNzX21vZHVsZSA9IFdpdGhfZmlyc3RfY2xhc3NfbW9kdWxlXG4gIG1vZHVsZSBXaXRob3V0X2NvbXBhcmF0b3IgPSBXaXRob3V0X2NvbXBhcmF0b3JcblxuICBtb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBGb3JfZGVyaXZpbmdcbiAgbW9kdWxlIHR5cGUgU19wb2x5ID0gU19wb2x5XG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczAgPSBBY2Nlc3NvcnMwXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczEgPSBBY2Nlc3NvcnMxXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczIgPSBBY2Nlc3NvcnMyXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yID0gQWNjZXNzb3JzMl93aXRoX2NvbXBhcmF0b3JcbiAgbW9kdWxlIHR5cGUgQWNjZXNzb3JzX2dlbmVyaWMgPSBBY2Nlc3NvcnNfZ2VuZXJpY1xuICBtb2R1bGUgdHlwZSBDcmVhdG9yczAgPSBDcmVhdG9yczBcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnMxID0gQ3JlYXRvcnMxXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzMiA9IENyZWF0b3JzMlxuICBtb2R1bGUgdHlwZSBDcmVhdG9yczJfd2l0aF9jb21wYXJhdG9yID0gQ3JlYXRvcnMyX3dpdGhfY29tcGFyYXRvclxuICBtb2R1bGUgdHlwZSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMCA9IENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMwXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMxID0gQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczFcbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczIgPSBDcmVhdG9yc19hbmRfYWNjZXNzb3JzMlxuXG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2FuZF9hY2Nlc3NvcnMyX3dpdGhfY29tcGFyYXRvciA9XG4gICAgQ3JlYXRvcnNfYW5kX2FjY2Vzc29yczJfd2l0aF9jb21wYXJhdG9yXG5cbiAgbW9kdWxlIHR5cGUgQ3JlYXRvcnNfZ2VuZXJpYyA9IENyZWF0b3JzX2dlbmVyaWNcbiAgbW9kdWxlIHR5cGUgRWx0X3BsYWluID0gRWx0X3BsYWluXG5lbmRcbiIsIigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0aXZlIENhbWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgKilcbigqICBlbiBBdXRvbWF0aXF1ZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgICAgKilcbigqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgbGljZW5zZS4gU2VlIC4uL1RISVJELVBBUlRZLnR4dCAgKilcbigqICBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKilcbigqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKilcblxuKCogU2V0cyBvdmVyIG9yZGVyZWQgdHlwZXMgKilcblxub3BlbiEgSW1wb3J0XG5pbmNsdWRlIFNldF9pbnRmXG5cbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5cblxubW9kdWxlIFRyZWUwID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9XG4gICAgfCBFbXB0eVxuICAgICgqIChMZWFmIHgpIGlzIHRoZSBzYW1lIGFzIChOb2RlIChFbXB0eSwgeCwgRW1wdHksIDEsIDEpKSBidXQgdXNlcyBsZXNzIHNwYWNlLiAqKVxuICAgIHwgTGVhZiBvZiAnYVxuICAgICgqIGZpcnN0IGludCBpcyBoZWlnaHQsIHNlY29uZCBpcyBzdWItdHJlZSBzaXplICopXG4gICAgfCBOb2RlIG9mICdhIHQgKiAnYSAqICdhIHQgKiBpbnQgKiBpbnRcblxuICB0eXBlICdhIHRyZWUgPSAnYSB0XG5cbiAgKCogU2V0cyBhcmUgcmVwcmVzZW50ZWQgYnkgYmFsYW5jZWQgYmluYXJ5IHRyZWVzICh0aGUgaGVpZ2h0cyBvZiB0aGUgY2hpbGRyZW4gZGlmZmVyIGJ5XG4gICAgIGF0IG1vc3QgMi4gKilcbiAgbGV0IGhlaWdodCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAwXG4gICAgfCBMZWFmIF8gLT4gMVxuICAgIHwgTm9kZSAoXywgXywgXywgaCwgXykgLT4gaFxuICA7O1xuXG4gIGxldCBsZW5ndGggPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gMFxuICAgIHwgTGVhZiBfIC0+IDFcbiAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIHMpIC0+IHNcbiAgOztcblxuICBsZXQgaW52YXJpYW50cyA9XG4gICAgbGV0IGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfZWx0IHYgPVxuICAgICAgKG1hdGNoIGxvd2VyIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgIHwgU29tZSBsb3dlciAtPiBjb21wYXJlX2VsdCBsb3dlciB2IDwgMClcbiAgICAgICYmXG4gICAgICBtYXRjaCB1cHBlciB3aXRoXG4gICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgfCBTb21lIHVwcGVyIC0+IGNvbXBhcmVfZWx0IHYgdXBwZXIgPCAwXG4gICAgaW5cbiAgICBsZXQgcmVjIGxvb3AgbG93ZXIgdXBwZXIgY29tcGFyZV9lbHQgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBMZWFmIHYgLT4gaW5fcmFuZ2UgbG93ZXIgdXBwZXIgY29tcGFyZV9lbHQgdlxuICAgICAgfCBOb2RlIChsLCB2LCByLCBoLCBuKSAtPlxuICAgICAgICBsZXQgaGwgPSBoZWlnaHQgbFxuICAgICAgICBhbmQgaHIgPSBoZWlnaHQgciBpblxuICAgICAgICBhYnMgKGhsIC0gaHIpIDw9IDJcbiAgICAgICAgJiYgaCA9IG1heCBobCBociArIDFcbiAgICAgICAgJiYgbiA9IGxlbmd0aCBsICsgbGVuZ3RoIHIgKyAxXG4gICAgICAgICYmIGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfZWx0IHZcbiAgICAgICAgJiYgbG9vcCBsb3dlciAoU29tZSB2KSBjb21wYXJlX2VsdCBsXG4gICAgICAgICYmIGxvb3AgKFNvbWUgdikgdXBwZXIgY29tcGFyZV9lbHQgclxuICAgIGluXG4gICAgZnVuIHQgfmNvbXBhcmVfZWx0IC0+IGxvb3AgTm9uZSBOb25lIGNvbXBhcmVfZWx0IHRcbiAgOztcblxuICBsZXQgaXNfZW1wdHkgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gdHJ1ZVxuICAgIHwgTGVhZiBfIHwgTm9kZSBfIC0+IGZhbHNlXG4gIDs7XG5cbiAgKCogQ3JlYXRlcyBhIG5ldyBub2RlIHdpdGggbGVmdCBzb24gbCwgdmFsdWUgdiBhbmQgcmlnaHQgc29uIHIuXG4gICAgIFdlIG11c3QgaGF2ZSBhbGwgZWxlbWVudHMgb2YgbCA8IHYgPCBhbGwgZWxlbWVudHMgb2Ygci5cbiAgICAgbCBhbmQgciBtdXN0IGJlIGJhbGFuY2VkIGFuZCB8IGhlaWdodCBsIC0gaGVpZ2h0IHIgfCA8PSAyLlxuICAgICBJbmxpbmUgZXhwYW5zaW9uIG9mIGhlaWdodCBmb3IgYmV0dGVyIHNwZWVkLiAqKVxuXG4gIGxldCBjcmVhdGUgbCB2IHIgPVxuICAgIGxldCBobCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgfCBOb2RlIChfLCBfLCBfLCBoLCBfKSAtPiBoXG4gICAgaW5cbiAgICBsZXQgaHIgPVxuICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICB8IEVtcHR5IC0+IDBcbiAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgIHwgTm9kZSAoXywgXywgXywgaCwgXykgLT4gaFxuICAgIGluXG4gICAgbGV0IGggPSBpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSBpblxuICAgIGlmIGggPSAxXG4gICAgdGhlbiBMZWFmIHZcbiAgICBlbHNlIChcbiAgICAgIGxldCBzbCA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IDBcbiAgICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIHMpIC0+IHNcbiAgICAgIGluXG4gICAgICBsZXQgc3IgPVxuICAgICAgICBtYXRjaCByIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgICAgfCBOb2RlIChfLCBfLCBfLCBfLCBzKSAtPiBzXG4gICAgICBpblxuICAgICAgTm9kZSAobCwgdiwgciwgaCwgc2wgKyBzciArIDEpKVxuICA7O1xuXG4gICgqIFdlIG11c3QgY2FsbCBbZl0gd2l0aCBpbmNyZWFzaW5nIGluZGV4ZXMsIGJlY2F1c2UgdGhlIGJpbl9wcm90IHJlYWRlciBpblxuICAgICBDb3JlLlNldCBuZWVkcyBpdC4gKilcbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgPVxuICAgIGxldCByZWMgbG9vcCBuIH5mIGkgPVxuICAgICAgbWF0Y2ggbiB3aXRoXG4gICAgICB8IDAgLT4gRW1wdHlcbiAgICAgIHwgMSAtPlxuICAgICAgICBsZXQgayA9IGYgaSBpblxuICAgICAgICBMZWFmIGtcbiAgICAgIHwgMiAtPlxuICAgICAgICBsZXQga2wgPSBmIGkgaW5cbiAgICAgICAgbGV0IGsgPSBmIChpICsgMSkgaW5cbiAgICAgICAgY3JlYXRlIChMZWFmIGtsKSBrIEVtcHR5XG4gICAgICB8IDMgLT5cbiAgICAgICAgbGV0IGtsID0gZiBpIGluXG4gICAgICAgIGxldCBrID0gZiAoaSArIDEpIGluXG4gICAgICAgIGxldCBrciA9IGYgKGkgKyAyKSBpblxuICAgICAgICBjcmVhdGUgKExlYWYga2wpIGsgKExlYWYga3IpXG4gICAgICB8IG4gLT5cbiAgICAgICAgbGV0IGxlZnRfbGVuZ3RoID0gbiBsc3IgMSBpblxuICAgICAgICBsZXQgcmlnaHRfbGVuZ3RoID0gbiAtIGxlZnRfbGVuZ3RoIC0gMSBpblxuICAgICAgICBsZXQgbGVmdCA9IGxvb3AgbGVmdF9sZW5ndGggfmYgaSBpblxuICAgICAgICBsZXQgayA9IGYgKGkgKyBsZWZ0X2xlbmd0aCkgaW5cbiAgICAgICAgbGV0IHJpZ2h0ID0gbG9vcCByaWdodF9sZW5ndGggfmYgKGkgKyBsZWZ0X2xlbmd0aCArIDEpIGluXG4gICAgICAgIGNyZWF0ZSBsZWZ0IGsgcmlnaHRcbiAgICBpblxuICAgIGxvb3AgbGVuIH5mIDBcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCBhcnJheV9sZW5ndGggPSBBcnJheS5sZW5ndGggYXJyYXkgaW5cbiAgICBsZXQgbmV4dCA9XG4gICAgICAoKiBXZSBkb24ndCBjaGVjayBpZiB0aGUgYXJyYXkgaXMgc29ydGVkIG9yIGtleXMgYXJlIGR1cGxpY2F0ZWQsIGJlY2F1c2UgdGhhdFxuICAgICAgICAgY2hlY2tpbmcgaXMgc2xvd2VyIHRoYW4gdGhlIHdob2xlIFtvZl9zb3J0ZWRfYXJyYXldIGZ1bmN0aW9uICopXG4gICAgICBpZiBhcnJheV9sZW5ndGggPCAyIHx8IGNvbXBhcmVfZWx0IGFycmF5LigwKSBhcnJheS4oMSkgPCAwXG4gICAgICB0aGVuIGZ1biBpIC0+IGFycmF5LihpKVxuICAgICAgZWxzZSBmdW4gaSAtPiBhcnJheS4oYXJyYXlfbGVuZ3RoIC0gMSAtIGkpXG4gICAgaW5cbiAgICBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+bGVuOmFycmF5X2xlbmd0aCB+ZjpuZXh0XG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSBhcnJheSB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIGFycmF5IHdpdGhcbiAgICB8IFt8fF0gfCBbfCBfIHxdIC0+IFJlc3VsdC5PayAob2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9lbHQpXG4gICAgfCBfIC0+XG4gICAgICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICAgICAgbGV0IGluY3JlYXNpbmcgPVxuICAgICAgICAgIG1hdGNoIGNvbXBhcmVfZWx0IGFycmF5LigwKSBhcnJheS4oMSkgd2l0aFxuICAgICAgICAgIHwgMCAtPiByLnJldHVybiAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBkdXBsaWNhdGVkIGVsZW1lbnRzXCIpXG4gICAgICAgICAgfCBpIC0+IGkgPCAwXG4gICAgICAgIGluXG4gICAgICAgIGZvciBpID0gMSB0byBBcnJheS5sZW5ndGggYXJyYXkgLSAyIGRvXG4gICAgICAgICAgbWF0Y2ggY29tcGFyZV9lbHQgYXJyYXkuKGkpIGFycmF5LihpICsgMSkgd2l0aFxuICAgICAgICAgIHwgMCAtPiByLnJldHVybiAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBkdXBsaWNhdGVkIGVsZW1lbnRzXCIpXG4gICAgICAgICAgfCBpIC0+XG4gICAgICAgICAgICBpZiBQb2x5LiggPD4gKSAoaSA8IDApIGluY3JlYXNpbmdcbiAgICAgICAgICAgIHRoZW5cbiAgICAgICAgICAgICAgci5yZXR1cm5cbiAgICAgICAgICAgICAgICAoT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwib2Zfc29ydGVkX2FycmF5OiBlbGVtZW50cyBhcmUgbm90IG9yZGVyZWRcIilcbiAgICAgICAgZG9uZTtcbiAgICAgICAgUmVzdWx0Lk9rIChvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2VsdCkpXG4gIDs7XG5cbiAgKCogU2FtZSBhcyBjcmVhdGUsIGJ1dCBwZXJmb3JtcyBvbmUgc3RlcCBvZiByZWJhbGFuY2luZyBpZiBuZWNlc3NhcnkuXG4gICAgIEFzc3VtZXMgbCBhbmQgciBiYWxhbmNlZCBhbmQgfCBoZWlnaHQgbCAtIGhlaWdodCByIHwgPD0gMy5cbiAgICAgSW5saW5lIGV4cGFuc2lvbiBvZiBjcmVhdGUgZm9yIGJldHRlciBzcGVlZCBpbiB0aGUgbW9zdCBmcmVxdWVudCBjYXNlXG4gICAgIHdoZXJlIG5vIHJlYmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqKVxuXG4gIGxldCBiYWwgbCB2IHIgPVxuICAgIGxldCBobCA9XG4gICAgICBtYXRjaCBsIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gMFxuICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgfCBOb2RlIChfLCBfLCBfLCBoLCBfKSAtPiBoXG4gICAgaW5cbiAgICBsZXQgaHIgPVxuICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICB8IEVtcHR5IC0+IDBcbiAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgIHwgTm9kZSAoXywgXywgXywgaCwgXykgLT4gaFxuICAgIGluXG4gICAgaWYgaGwgPiBociArIDJcbiAgICB0aGVuIChcbiAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZSAoKiBiZWNhdXNlIGgobCk+aChyKSsyIGFuZCBoKGxlYWYpPTEgKilcbiAgICAgIHwgTm9kZSAobGwsIGx2LCBsciwgXywgXykgLT5cbiAgICAgICAgaWYgaGVpZ2h0IGxsID49IGhlaWdodCBsclxuICAgICAgICB0aGVuIGNyZWF0ZSBsbCBsdiAoY3JlYXRlIGxyIHYgcilcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggbHIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgICAgfCBMZWFmIGxydiAtPlxuICAgICAgICAgICAgYXNzZXJ0IChpc19lbXB0eSBsbCk7XG4gICAgICAgICAgICBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBFbXB0eSkgbHJ2IChjcmVhdGUgRW1wdHkgdiByKVxuICAgICAgICAgIHwgTm9kZSAobHJsLCBscnYsIGxyciwgXywgXykgLT4gY3JlYXRlIChjcmVhdGUgbGwgbHYgbHJsKSBscnYgKGNyZWF0ZSBscnIgdiByKSkpXG4gICAgZWxzZSBpZiBociA+IGhsICsgMlxuICAgIHRoZW4gKFxuICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGFzc2VydCBmYWxzZVxuICAgICAgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlICgqIGJlY2F1c2UgaChyKT5oKGwpKzIgYW5kIGgobGVhZik9MSAqKVxuICAgICAgfCBOb2RlIChybCwgcnYsIHJyLCBfLCBfKSAtPlxuICAgICAgICBpZiBoZWlnaHQgcnIgPj0gaGVpZ2h0IHJsXG4gICAgICAgIHRoZW4gY3JlYXRlIChjcmVhdGUgbCB2IHJsKSBydiByclxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBtYXRjaCBybCB3aXRoXG4gICAgICAgICAgfCBFbXB0eSAtPiBhc3NlcnQgZmFsc2VcbiAgICAgICAgICB8IExlYWYgcmx2IC0+XG4gICAgICAgICAgICBhc3NlcnQgKGlzX2VtcHR5IHJyKTtcbiAgICAgICAgICAgIGNyZWF0ZSAoY3JlYXRlIGwgdiBFbXB0eSkgcmx2IChjcmVhdGUgRW1wdHkgcnYgcnIpXG4gICAgICAgICAgfCBOb2RlIChybGwsIHJsdiwgcmxyLCBfLCBfKSAtPiBjcmVhdGUgKGNyZWF0ZSBsIHYgcmxsKSBybHYgKGNyZWF0ZSBybHIgcnYgcnIpKSlcbiAgICBlbHNlIChcbiAgICAgIGxldCBoID0gaWYgaGwgPj0gaHIgdGhlbiBobCArIDEgZWxzZSBociArIDEgaW5cbiAgICAgIGxldCBzbCA9XG4gICAgICAgIG1hdGNoIGwgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IDBcbiAgICAgICAgfCBMZWFmIF8gLT4gMVxuICAgICAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIHMpIC0+IHNcbiAgICAgIGluXG4gICAgICBsZXQgc3IgPVxuICAgICAgICBtYXRjaCByIHdpdGhcbiAgICAgICAgfCBFbXB0eSAtPiAwXG4gICAgICAgIHwgTGVhZiBfIC0+IDFcbiAgICAgICAgfCBOb2RlIChfLCBfLCBfLCBfLCBzKSAtPiBzXG4gICAgICBpblxuICAgICAgaWYgaCA9IDEgdGhlbiBMZWFmIHYgZWxzZSBOb2RlIChsLCB2LCByLCBoLCBzbCArIHNyICsgMSkpXG4gIDs7XG5cbiAgKCogSW5zZXJ0aW9uIG9mIG9uZSBlbGVtZW50ICopXG5cbiAgZXhjZXB0aW9uIFNhbWVcblxuICBsZXQgYWRkIHQgeCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgYXV4ID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gTGVhZiB4XG4gICAgICB8IExlYWYgdiAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIHJhaXNlIFNhbWVcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIGNyZWF0ZSAoTGVhZiB4KSB2IEVtcHR5XG4gICAgICAgIGVsc2UgY3JlYXRlIEVtcHR5IHYgKExlYWYgeClcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDAgdGhlbiByYWlzZSBTYW1lIGVsc2UgaWYgYyA8IDAgdGhlbiBiYWwgKGF1eCBsKSB2IHIgZWxzZSBiYWwgbCB2IChhdXggcilcbiAgICBpblxuICAgIHRyeSBhdXggdCB3aXRoXG4gICAgfCBTYW1lIC0+IHRcbiAgOztcblxuICAoKiBTYW1lIGFzIGNyZWF0ZSBhbmQgYmFsLCBidXQgbm8gYXNzdW1wdGlvbnMgYXJlIG1hZGUgb24gdGhlIHJlbGF0aXZlIGhlaWdodHMgb2YgbCBhbmRcbiAgICAgci4gKilcbiAgbGV0IHJlYyBqb2luIGwgdiByIH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggbCwgciB3aXRoXG4gICAgfCBFbXB0eSwgXyAtPiBhZGQgciB2IH5jb21wYXJlX2VsdFxuICAgIHwgXywgRW1wdHkgLT4gYWRkIGwgdiB+Y29tcGFyZV9lbHRcbiAgICB8IExlYWYgbHYsIF8gLT4gYWRkIChhZGQgciB2IH5jb21wYXJlX2VsdCkgbHYgfmNvbXBhcmVfZWx0XG4gICAgfCBfLCBMZWFmIHJ2IC0+IGFkZCAoYWRkIGwgdiB+Y29tcGFyZV9lbHQpIHJ2IH5jb21wYXJlX2VsdFxuICAgIHwgTm9kZSAobGwsIGx2LCBsciwgbGgsIF8pLCBOb2RlIChybCwgcnYsIHJyLCByaCwgXykgLT5cbiAgICAgIGlmIGxoID4gcmggKyAyXG4gICAgICB0aGVuIGJhbCBsbCBsdiAoam9pbiBsciB2IHIgfmNvbXBhcmVfZWx0KVxuICAgICAgZWxzZSBpZiByaCA+IGxoICsgMlxuICAgICAgdGhlbiBiYWwgKGpvaW4gbCB2IHJsIH5jb21wYXJlX2VsdCkgcnYgcnJcbiAgICAgIGVsc2UgY3JlYXRlIGwgdiByXG4gIDs7XG5cbiAgKCogU21hbGxlc3QgYW5kIGdyZWF0ZXN0IGVsZW1lbnQgb2YgYSBzZXQgKilcbiAgbGV0IHJlYyBtaW5fZWx0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiB8IE5vZGUgKEVtcHR5LCB2LCBfLCBfLCBfKSAtPiBTb21lIHZcbiAgICB8IE5vZGUgKGwsIF8sIF8sIF8sIF8pIC0+IG1pbl9lbHQgbFxuICA7O1xuXG4gIGV4Y2VwdGlvbiBTZXRfbWluX2VsdF9leG5fb2ZfZW1wdHlfc2V0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG4gIGxldCAoKSA9XG4gICAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkXG4gICAgICBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTZXRfbWluX2VsdF9leG5fb2ZfZW1wdHlfc2V0XVxuICAgICAgKGZ1bmN0aW9uXG4gICAgICAgIHwgU2V0X21pbl9lbHRfZXhuX29mX2VtcHR5X3NldCAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuQXRvbSBcInNldC5tbC5UcmVlMC5TZXRfbWluX2VsdF9leG5fb2ZfZW1wdHlfc2V0XCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGV4Y2VwdGlvbiBTZXRfbWF4X2VsdF9leG5fb2ZfZW1wdHlfc2V0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG4gIGxldCAoKSA9XG4gICAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkXG4gICAgICBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBTZXRfbWF4X2VsdF9leG5fb2ZfZW1wdHlfc2V0XVxuICAgICAgKGZ1bmN0aW9uXG4gICAgICAgIHwgU2V0X21heF9lbHRfZXhuX29mX2VtcHR5X3NldCAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuQXRvbSBcInNldC5tbC5UcmVlMC5TZXRfbWF4X2VsdF9leG5fb2ZfZW1wdHlfc2V0XCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGxldCBtaW5fZWx0X2V4biB0ID1cbiAgICBtYXRjaCBtaW5fZWx0IHQgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBTZXRfbWluX2VsdF9leG5fb2ZfZW1wdHlfc2V0XG4gICAgfCBTb21lIHYgLT4gdlxuICA7O1xuXG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaCA9XG4gICAgbGV0IHJlYyBmb2xkX3VudGlsX2hlbHBlciB+ZiB0IGFjYyA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gQ29udGFpbmVyLkNvbnRpbnVlX29yX3N0b3AuQ29udGludWUgYWNjXG4gICAgICB8IExlYWYgdmFsdWUgLT4gZiBhY2MgdmFsdWVcbiAgICAgIHwgTm9kZSAobGVmdCwgdmFsdWUsIHJpZ2h0LCBfLCBfKSAtPlxuICAgICAgICAobWF0Y2ggZm9sZF91bnRpbF9oZWxwZXIgfmYgbGVmdCBhY2Mgd2l0aFxuICAgICAgICAgfCBTdG9wIF9hIGFzIHggLT4geFxuICAgICAgICAgfCBDb250aW51ZSBhY2MgLT5cbiAgICAgICAgICAgKG1hdGNoIGYgYWNjIHZhbHVlIHdpdGhcbiAgICAgICAgICAgIHwgU3RvcCBfYSBhcyB4IC0+IHhcbiAgICAgICAgICAgIHwgQ29udGludWUgYSAtPiBmb2xkX3VudGlsX2hlbHBlciB+ZiByaWdodCBhKSlcbiAgICBpblxuICAgIG1hdGNoIGZvbGRfdW50aWxfaGVscGVyIH5mIHQgaW5pdCB3aXRoXG4gICAgfCBDb250aW51ZSB4IC0+IGZpbmlzaCB4XG4gICAgfCBTdG9wIHggLT4geFxuICA7O1xuXG4gIGxldCByZWMgbWF4X2VsdCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgfCBOb2RlIChfLCB2LCBFbXB0eSwgXywgXykgLT4gU29tZSB2XG4gICAgfCBOb2RlIChfLCBfLCByLCBfLCBfKSAtPiBtYXhfZWx0IHJcbiAgOztcblxuICBsZXQgbWF4X2VsdF9leG4gdCA9XG4gICAgbWF0Y2ggbWF4X2VsdCB0IHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2UgU2V0X21heF9lbHRfZXhuX29mX2VtcHR5X3NldFxuICAgIHwgU29tZSB2IC0+IHZcbiAgOztcblxuICAoKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgb2YgdGhlIGdpdmVuIHNldCAqKVxuXG4gIGxldCByZWMgcmVtb3ZlX21pbl9lbHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJTZXQucmVtb3ZlX21pbl9lbHRcIlxuICAgIHwgTGVhZiBfIC0+IEVtcHR5XG4gICAgfCBOb2RlIChFbXB0eSwgXywgciwgXywgXykgLT4gclxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gYmFsIChyZW1vdmVfbWluX2VsdCBsKSB2IHJcbiAgOztcblxuICAoKiBNZXJnZSB0d28gdHJlZXMgbCBhbmQgciBpbnRvIG9uZS4gIEFsbCBlbGVtZW50cyBvZiBsIG11c3QgcHJlY2VkZSB0aGUgZWxlbWVudHMgb2Ygci5cbiAgICAgQXNzdW1lIHwgaGVpZ2h0IGwgLSBoZWlnaHQgciB8IDw9IDIuICopXG4gIGxldCBtZXJnZSB0MSB0MiA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IEVtcHR5LCB0IC0+IHRcbiAgICB8IHQsIEVtcHR5IC0+IHRcbiAgICB8IF8sIF8gLT4gYmFsIHQxIChtaW5fZWx0X2V4biB0MikgKHJlbW92ZV9taW5fZWx0IHQyKVxuICA7O1xuXG4gICgqIE1lcmdlIHR3byB0cmVlcyBsIGFuZCByIGludG8gb25lLiAgQWxsIGVsZW1lbnRzIG9mIGwgbXVzdCBwcmVjZWRlIHRoZSBlbGVtZW50cyBvZiByLlxuICAgICBObyBhc3N1bXB0aW9uIG9uIHRoZSBoZWlnaHRzIG9mIGwgYW5kIHIuICopXG4gIGxldCBjb25jYXQgdDEgdDIgfmNvbXBhcmVfZWx0ID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgRW1wdHksIHQgfCB0LCBFbXB0eSAtPiB0XG4gICAgfCBfLCBfIC0+IGpvaW4gdDEgKG1pbl9lbHRfZXhuIHQyKSAocmVtb3ZlX21pbl9lbHQgdDIpIH5jb21wYXJlX2VsdFxuICA7O1xuXG4gIGxldCBzcGxpdCB0IHggfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIHNwbGl0IHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IEVtcHR5LCBOb25lLCBFbXB0eVxuICAgICAgfCBMZWFmIHYgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiBFbXB0eSwgU29tZSB2LCBFbXB0eVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gRW1wdHksIE5vbmUsIExlYWYgdlxuICAgICAgICBlbHNlIExlYWYgdiwgTm9uZSwgRW1wdHlcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2VsdCB4IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiBsLCBTb21lIHYsIHJcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbGwsIG1heWJlX2VsdCwgcmwgPSBzcGxpdCBsIGluXG4gICAgICAgICAgbGwsIG1heWJlX2VsdCwgam9pbiBybCB2IHIgfmNvbXBhcmVfZWx0KVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgbHIsIG1heWJlX2VsdCwgcnIgPSBzcGxpdCByIGluXG4gICAgICAgICAgam9pbiBsIHYgbHIgfmNvbXBhcmVfZWx0LCBtYXliZV9lbHQsIHJyKVxuICAgIGluXG4gICAgc3BsaXQgdFxuICA7O1xuXG4gICgqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXQgb3BlcmF0aW9ucyAqKVxuXG4gIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgbGV0IHJlYyBtZW0gdCB4IH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBmYWxzZVxuICAgIHwgTGVhZiB2IC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgYyA9IDBcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgYyA9IDAgfHwgbWVtIChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKSB4IH5jb21wYXJlX2VsdFxuICA7O1xuXG4gIGxldCBzaW5nbGV0b24geCA9IExlYWYgeFxuXG4gIGxldCByZW1vdmUgdCB4IH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBhdXggdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gcmFpc2UgU2FtZVxuICAgICAgfCBMZWFmIHYgLT4gaWYgY29tcGFyZV9lbHQgeCB2ID0gMCB0aGVuIEVtcHR5IGVsc2UgcmFpc2UgU2FtZVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHggdiBpblxuICAgICAgICBpZiBjID0gMCB0aGVuIG1lcmdlIGwgciBlbHNlIGlmIGMgPCAwIHRoZW4gYmFsIChhdXggbCkgdiByIGVsc2UgYmFsIGwgdiAoYXV4IHIpXG4gICAgaW5cbiAgICB0cnkgYXV4IHQgd2l0aFxuICAgIHwgU2FtZSAtPiB0XG4gIDs7XG5cbiAgbGV0IHJlbW92ZV9pbmRleCB0IGkgfmNvbXBhcmVfZWx0Ol8gPVxuICAgIGxldCByZWMgYXV4IHQgaSA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gcmFpc2UgU2FtZVxuICAgICAgfCBMZWFmIF8gLT4gaWYgaSA9IDAgdGhlbiBFbXB0eSBlbHNlIHJhaXNlIFNhbWVcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgbGV0IGxfc2l6ZSA9IGxlbmd0aCBsIGluXG4gICAgICAgIGxldCBjID0gUG9seS5jb21wYXJlIGkgbF9zaXplIGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gbWVyZ2UgbCByXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiBiYWwgKGF1eCBsIGkpIHYgclxuICAgICAgICBlbHNlIGJhbCBsIHYgKGF1eCByIChpIC0gbF9zaXplIC0gMSkpXG4gICAgaW5cbiAgICB0cnkgYXV4IHQgaSB3aXRoXG4gICAgfCBTYW1lIC0+IHRcbiAgOztcblxuICBsZXQgdW5pb24gczEgczIgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIHVuaW9uIHMxIHMyID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgczEgczJcbiAgICAgIHRoZW4gczFcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBzMSwgczIgd2l0aFxuICAgICAgICB8IEVtcHR5LCB0IHwgdCwgRW1wdHkgLT4gdFxuICAgICAgICB8IExlYWYgdjEsIF8gLT4gdW5pb24gKE5vZGUgKEVtcHR5LCB2MSwgRW1wdHksIDEsIDEpKSBzMlxuICAgICAgICB8IF8sIExlYWYgdjIgLT4gdW5pb24gczEgKE5vZGUgKEVtcHR5LCB2MiwgRW1wdHksIDEsIDEpKVxuICAgICAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIGgxLCBfKSwgTm9kZSAobDIsIHYyLCByMiwgaDIsIF8pIC0+XG4gICAgICAgICAgaWYgaDEgPj0gaDJcbiAgICAgICAgICB0aGVuXG4gICAgICAgICAgICBpZiBoMiA9IDFcbiAgICAgICAgICAgIHRoZW4gYWRkIHMxIHYyIH5jb21wYXJlX2VsdFxuICAgICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICAgIGxldCBsMiwgXywgcjIgPSBzcGxpdCBzMiB2MSB+Y29tcGFyZV9lbHQgaW5cbiAgICAgICAgICAgICAgam9pbiAodW5pb24gbDEgbDIpIHYxICh1bmlvbiByMSByMikgfmNvbXBhcmVfZWx0KVxuICAgICAgICAgIGVsc2UgaWYgaDEgPSAxXG4gICAgICAgICAgdGhlbiBhZGQgczIgdjEgfmNvbXBhcmVfZWx0XG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgbDEsIF8sIHIxID0gc3BsaXQgczEgdjIgfmNvbXBhcmVfZWx0IGluXG4gICAgICAgICAgICBqb2luICh1bmlvbiBsMSBsMikgdjIgKHVuaW9uIHIxIHIyKSB+Y29tcGFyZV9lbHQpKVxuICAgIGluXG4gICAgdW5pb24gczEgczJcbiAgOztcblxuICBsZXQgdW5pb25fbGlzdCB+Y29tcGFyYXRvciB+dG9fdHJlZSB4cyA9XG4gICAgbGV0IGNvbXBhcmVfZWx0ID0gY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgaW5cbiAgICBMaXN0LmZvbGQgeHMgfmluaXQ6ZW1wdHkgfmY6KGZ1biBhYyB4IC0+IHVuaW9uIGFjICh0b190cmVlIHgpIH5jb21wYXJlX2VsdClcbiAgOztcblxuICBsZXQgaW50ZXIgczEgczIgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGludGVyIHMxIHMyID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgczEgczJcbiAgICAgIHRoZW4gczFcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBzMSwgczIgd2l0aFxuICAgICAgICB8IEVtcHR5LCBfIHwgXywgRW1wdHkgLT4gRW1wdHlcbiAgICAgICAgfCAoTGVhZiBlbHQgYXMgc2luZ2xldG9uKSwgb3RoZXJfc2V0IHwgb3RoZXJfc2V0LCAoTGVhZiBlbHQgYXMgc2luZ2xldG9uKSAtPlxuICAgICAgICAgIGlmIG1lbSBvdGhlcl9zZXQgZWx0IH5jb21wYXJlX2VsdCB0aGVuIHNpbmdsZXRvbiBlbHNlIEVtcHR5XG4gICAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwgXywgXyksIHQyIC0+XG4gICAgICAgICAgKG1hdGNoIHNwbGl0IHQyIHYxIH5jb21wYXJlX2VsdCB3aXRoXG4gICAgICAgICAgIHwgbDIsIE5vbmUsIHIyIC0+IGNvbmNhdCAoaW50ZXIgbDEgbDIpIChpbnRlciByMSByMikgfmNvbXBhcmVfZWx0XG4gICAgICAgICAgIHwgbDIsIFNvbWUgdjEsIHIyIC0+IGpvaW4gKGludGVyIGwxIGwyKSB2MSAoaW50ZXIgcjEgcjIpIH5jb21wYXJlX2VsdCkpXG4gICAgaW5cbiAgICBpbnRlciBzMSBzMlxuICA7O1xuXG4gIGxldCBkaWZmIHMxIHMyIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBkaWZmIHMxIHMyID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgczEgczJcbiAgICAgIHRoZW4gRW1wdHlcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBzMSwgczIgd2l0aFxuICAgICAgICB8IEVtcHR5LCBfIC0+IEVtcHR5XG4gICAgICAgIHwgdDEsIEVtcHR5IC0+IHQxXG4gICAgICAgIHwgTGVhZiB2MSwgdDIgLT4gZGlmZiAoTm9kZSAoRW1wdHksIHYxLCBFbXB0eSwgMSwgMSkpIHQyXG4gICAgICAgIHwgTm9kZSAobDEsIHYxLCByMSwgXywgXyksIHQyIC0+XG4gICAgICAgICAgKG1hdGNoIHNwbGl0IHQyIHYxIH5jb21wYXJlX2VsdCB3aXRoXG4gICAgICAgICAgIHwgbDIsIE5vbmUsIHIyIC0+IGpvaW4gKGRpZmYgbDEgbDIpIHYxIChkaWZmIHIxIHIyKSB+Y29tcGFyZV9lbHRcbiAgICAgICAgICAgfCBsMiwgU29tZSBfLCByMiAtPiBjb25jYXQgKGRpZmYgbDEgbDIpIChkaWZmIHIxIHIyKSB+Y29tcGFyZV9lbHQpKVxuICAgIGluXG4gICAgZGlmZiBzMSBzMlxuICA7O1xuXG4gIG1vZHVsZSBFbnVtID0gc3RydWN0XG4gICAgdHlwZSBpbmNyZWFzaW5nXG4gICAgdHlwZSBkZWNyZWFzaW5nXG5cbiAgICB0eXBlICgnYSwgJ2RpcmVjdGlvbikgdCA9XG4gICAgICB8IEVuZFxuICAgICAgfCBNb3JlIG9mICdhICogJ2EgdHJlZSAqICgnYSwgJ2RpcmVjdGlvbikgdFxuXG4gICAgbGV0IHJlYyBjb25zIHMgKGUgOiAoXywgaW5jcmVhc2luZykgdCkgOiAoXywgaW5jcmVhc2luZykgdCA9XG4gICAgICBtYXRjaCBzIHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgfCBMZWFmIHYgLT4gTW9yZSAodiwgRW1wdHksIGUpXG4gICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGNvbnMgbCAoTW9yZSAodiwgciwgZSkpXG4gICAgOztcblxuICAgIGxldCByZWMgY29uc19yaWdodCBzIChlIDogKF8sIGRlY3JlYXNpbmcpIHQpIDogKF8sIGRlY3JlYXNpbmcpIHQgPVxuICAgICAgbWF0Y2ggcyB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGVcbiAgICAgIHwgTGVhZiB2IC0+IE1vcmUgKHYsIEVtcHR5LCBlKVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBjb25zX3JpZ2h0IHIgKE1vcmUgKHYsIGwsIGUpKVxuICAgIDs7XG5cbiAgICBsZXQgb2Zfc2V0IHMgOiAoXywgaW5jcmVhc2luZykgdCA9IGNvbnMgcyBFbmRcbiAgICBsZXQgb2Zfc2V0X3JpZ2h0IHMgOiAoXywgZGVjcmVhc2luZykgdCA9IGNvbnNfcmlnaHQgcyBFbmRcblxuICAgIGxldCBzdGFydGluZ19hdF9pbmNyZWFzaW5nIHQga2V5IGNvbXBhcmUgOiAoXywgaW5jcmVhc2luZykgdCA9XG4gICAgICBsZXQgcmVjIGxvb3AgdCBlID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgRW1wdHkgLT4gZVxuICAgICAgICB8IExlYWYgdiAtPiBsb29wIChOb2RlIChFbXB0eSwgdiwgRW1wdHksIDEsIDEpKSBlXG4gICAgICAgIHwgTm9kZSAoXywgdiwgciwgXywgXykgd2hlbiBjb21wYXJlIHYga2V5IDwgMCAtPiBsb29wIHIgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGxvb3AgbCAoTW9yZSAodiwgciwgZSkpXG4gICAgICBpblxuICAgICAgbG9vcCB0IEVuZFxuICAgIDs7XG5cbiAgICBsZXQgc3RhcnRpbmdfYXRfZGVjcmVhc2luZyB0IGtleSBjb21wYXJlIDogKF8sIGRlY3JlYXNpbmcpIHQgPVxuICAgICAgbGV0IHJlYyBsb29wIHQgZSA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGVcbiAgICAgICAgfCBMZWFmIHYgLT4gbG9vcCAoTm9kZSAoRW1wdHksIHYsIEVtcHR5LCAxLCAxKSkgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIF8sIF8sIF8pIHdoZW4gY29tcGFyZSB2IGtleSA+IDAgLT4gbG9vcCBsIGVcbiAgICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPiBsb29wIHIgKE1vcmUgKHYsIGwsIGUpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdCBFbmRcbiAgICA7O1xuXG4gICAgbGV0IGNvbXBhcmUgY29tcGFyZV9lbHQgZTEgZTIgPVxuICAgICAgbGV0IHJlYyBsb29wIGUxIGUyID1cbiAgICAgICAgbWF0Y2ggZTEsIGUyIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiAwXG4gICAgICAgIHwgRW5kLCBfIC0+IC0xXG4gICAgICAgIHwgXywgRW5kIC0+IDFcbiAgICAgICAgfCBNb3JlICh2MSwgcjEsIGUxKSwgTW9yZSAodjIsIHIyLCBlMikgLT5cbiAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfZWx0IHYxIHYyIGluXG4gICAgICAgICAgaWYgYyA8PiAwXG4gICAgICAgICAgdGhlbiBjXG4gICAgICAgICAgZWxzZSBpZiBwaHlzX2VxdWFsIHIxIHIyXG4gICAgICAgICAgdGhlbiBsb29wIGUxIGUyXG4gICAgICAgICAgZWxzZSBsb29wIChjb25zIHIxIGUxKSAoY29ucyByMiBlMilcbiAgICAgIGluXG4gICAgICBsb29wIGUxIGUyXG4gICAgOztcblxuICAgIGxldCByZWMgaXRlciB+ZiA9IGZ1bmN0aW9uXG4gICAgICB8IEVuZCAtPiAoKVxuICAgICAgfCBNb3JlIChhLCB0cmVlLCBlbnVtKSAtPlxuICAgICAgICBmIGE7XG4gICAgICAgIGl0ZXIgKGNvbnMgdHJlZSBlbnVtKSB+ZlxuICAgIDs7XG5cbiAgICBsZXQgaXRlcjIgY29tcGFyZV9lbHQgdDEgdDIgfmYgPVxuICAgICAgbGV0IHJlYyBsb29wIHQxIHQyID1cbiAgICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiAoKVxuICAgICAgICB8IEVuZCwgXyAtPiBpdGVyIHQyIH5mOihmdW4gYSAtPiBmIChgUmlnaHQgYSkpXG4gICAgICAgIHwgXywgRW5kIC0+IGl0ZXIgdDEgfmY6KGZ1biBhIC0+IGYgKGBMZWZ0IGEpKVxuICAgICAgICB8IE1vcmUgKGExLCB0cmVlMSwgZW51bTEpLCBNb3JlIChhMiwgdHJlZTIsIGVudW0yKSAtPlxuICAgICAgICAgIGxldCBjb21wYXJlX3Jlc3VsdCA9IGNvbXBhcmVfZWx0IGExIGEyIGluXG4gICAgICAgICAgaWYgY29tcGFyZV9yZXN1bHQgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBmIChgQm90aCAoYTEsIGEyKSk7XG4gICAgICAgICAgICBsb29wIChjb25zIHRyZWUxIGVudW0xKSAoY29ucyB0cmVlMiBlbnVtMikpXG4gICAgICAgICAgZWxzZSBpZiBjb21wYXJlX3Jlc3VsdCA8IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGYgKGBMZWZ0IGExKTtcbiAgICAgICAgICAgIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIHQyKVxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgZiAoYFJpZ2h0IGEyKTtcbiAgICAgICAgICAgIGxvb3AgdDEgKGNvbnMgdHJlZTIgZW51bTIpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdDEgdDJcbiAgICA7O1xuXG4gICAgbGV0IHN5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2VsdCA9XG4gICAgICBsZXQgc3RlcCBzdGF0ZSA6ICgoXywgXykgRWl0aGVyLnQsIF8pIFNlcXVlbmNlLlN0ZXAudCA9XG4gICAgICAgIG1hdGNoIHN0YXRlIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiBEb25lXG4gICAgICAgIHwgRW5kLCBNb3JlIChlbHQsIHRyZWUsIGVudW0pIC0+IFlpZWxkIChTZWNvbmQgZWx0LCAoRW5kLCBjb25zIHRyZWUgZW51bSkpXG4gICAgICAgIHwgTW9yZSAoZWx0LCB0cmVlLCBlbnVtKSwgRW5kIC0+IFlpZWxkIChGaXJzdCBlbHQsIChjb25zIHRyZWUgZW51bSwgRW5kKSlcbiAgICAgICAgfCAoTW9yZSAoYTEsIHRyZWUxLCBlbnVtMSkgYXMgbGVmdCksIChNb3JlIChhMiwgdHJlZTIsIGVudW0yKSBhcyByaWdodCkgLT5cbiAgICAgICAgICBsZXQgY29tcGFyZV9yZXN1bHQgPSBjb21wYXJlX2VsdCBhMSBhMiBpblxuICAgICAgICAgIGlmIGNvbXBhcmVfcmVzdWx0ID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IG5leHRfc3RhdGUgPVxuICAgICAgICAgICAgICBpZiBwaHlzX2VxdWFsIHRyZWUxIHRyZWUyXG4gICAgICAgICAgICAgIHRoZW4gZW51bTEsIGVudW0yXG4gICAgICAgICAgICAgIGVsc2UgY29ucyB0cmVlMSBlbnVtMSwgY29ucyB0cmVlMiBlbnVtMlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIFNraXAgbmV4dF9zdGF0ZSlcbiAgICAgICAgICBlbHNlIGlmIGNvbXBhcmVfcmVzdWx0IDwgMFxuICAgICAgICAgIHRoZW4gWWllbGQgKEZpcnN0IGExLCAoY29ucyB0cmVlMSBlbnVtMSwgcmlnaHQpKVxuICAgICAgICAgIGVsc2UgWWllbGQgKFNlY29uZCBhMiwgKGxlZnQsIGNvbnMgdHJlZTIgZW51bTIpKVxuICAgICAgaW5cbiAgICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0OihvZl9zZXQgdDEsIG9mX3NldCB0MikgfmY6c3RlcFxuICAgIDs7XG4gIGVuZFxuXG4gIGxldCB0b19zZXF1ZW5jZV9pbmNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fZWx0IHQgPVxuICAgIGxldCBuZXh0IGVudW0gPVxuICAgICAgbWF0Y2ggZW51bSB3aXRoXG4gICAgICB8IEVudW0uRW5kIC0+IFNlcXVlbmNlLlN0ZXAuRG9uZVxuICAgICAgfCBFbnVtLk1vcmUgKGssIHQsIGUpIC0+IFNlcXVlbmNlLlN0ZXAuWWllbGQgKGssIEVudW0uY29ucyB0IGUpXG4gICAgaW5cbiAgICBsZXQgaW5pdCA9XG4gICAgICBtYXRjaCBmcm9tX2VsdCB3aXRoXG4gICAgICB8IE5vbmUgLT4gRW51bS5vZl9zZXQgdFxuICAgICAgfCBTb21lIGtleSAtPiBFbnVtLnN0YXJ0aW5nX2F0X2luY3JlYXNpbmcgdCBrZXkgY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIFNlcXVlbmNlLnVuZm9sZF9zdGVwIH5pbml0IH5mOm5leHRcbiAgOztcblxuICBsZXQgdG9fc2VxdWVuY2VfZGVjcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2VsdCB0ID1cbiAgICBsZXQgbmV4dCBlbnVtID1cbiAgICAgIG1hdGNoIGVudW0gd2l0aFxuICAgICAgfCBFbnVtLkVuZCAtPiBTZXF1ZW5jZS5TdGVwLkRvbmVcbiAgICAgIHwgRW51bS5Nb3JlIChrLCB0LCBlKSAtPiBTZXF1ZW5jZS5TdGVwLllpZWxkIChrLCBFbnVtLmNvbnNfcmlnaHQgdCBlKVxuICAgIGluXG4gICAgbGV0IGluaXQgPVxuICAgICAgbWF0Y2ggZnJvbV9lbHQgd2l0aFxuICAgICAgfCBOb25lIC0+IEVudW0ub2Zfc2V0X3JpZ2h0IHRcbiAgICAgIHwgU29tZSBrZXkgLT4gRW51bS5zdGFydGluZ19hdF9kZWNyZWFzaW5nIHQga2V5IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdCB+ZjpuZXh0XG4gIDs7XG5cbiAgbGV0IHRvX3NlcXVlbmNlXG4gICAgICAgIGNvbXBhcmF0b3JcbiAgICAgICAgPyhvcmRlciA9IGBJbmNyZWFzaW5nKVxuICAgICAgICA/Z3JlYXRlcl9vcl9lcXVhbF90b1xuICAgICAgICA/bGVzc19vcl9lcXVhbF90b1xuICAgICAgICB0XG4gICAgPVxuICAgIGxldCBpbmNsdXNpdmVfYm91bmQgc2lkZSB0IGJvdW5kID1cbiAgICAgIGxldCBjb21wYXJlX2VsdCA9IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIGluXG4gICAgICBsZXQgbCwgbWF5YmUsIHIgPSBzcGxpdCB0IGJvdW5kIH5jb21wYXJlX2VsdCBpblxuICAgICAgbGV0IHQgPSBzaWRlIChsLCByKSBpblxuICAgICAgbWF0Y2ggbWF5YmUgd2l0aFxuICAgICAgfCBOb25lIC0+IHRcbiAgICAgIHwgU29tZSBlbHQgLT4gYWRkIHQgZWx0IH5jb21wYXJlX2VsdFxuICAgIGluXG4gICAgbWF0Y2ggb3JkZXIgd2l0aFxuICAgIHwgYEluY3JlYXNpbmcgLT5cbiAgICAgIGxldCB0ID0gT3B0aW9uLmZvbGQgbGVzc19vcl9lcXVhbF90byB+aW5pdDp0IH5mOihpbmNsdXNpdmVfYm91bmQgZnN0KSBpblxuICAgICAgdG9fc2VxdWVuY2VfaW5jcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2VsdDpncmVhdGVyX29yX2VxdWFsX3RvIHRcbiAgICB8IGBEZWNyZWFzaW5nIC0+XG4gICAgICBsZXQgdCA9IE9wdGlvbi5mb2xkIGdyZWF0ZXJfb3JfZXF1YWxfdG8gfmluaXQ6dCB+ZjooaW5jbHVzaXZlX2JvdW5kIHNuZCkgaW5cbiAgICAgIHRvX3NlcXVlbmNlX2RlY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9lbHQ6bGVzc19vcl9lcXVhbF90byB0XG4gIDs7XG5cblxuICBsZXQgcmVjIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBpZiBmIHYgdGhlbiBTb21lIHYgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgaWYgZiB2XG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggZmluZF9maXJzdF9zYXRpc2Z5aW5nIGwgfmYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gU29tZSB2XG4gICAgICAgIHwgU29tZSBfIGFzIHggLT4geClcbiAgICAgIGVsc2UgZmluZF9maXJzdF9zYXRpc2Z5aW5nIHIgfmZcbiAgOztcblxuICBsZXQgcmVjIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IGlmIGYgdiB0aGVuIFNvbWUgdiBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICBpZiBmIHZcbiAgICAgIHRoZW4gKFxuICAgICAgICBtYXRjaCBmaW5kX2xhc3Rfc2F0aXNmeWluZyByIH5mIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IFNvbWUgdlxuICAgICAgICB8IFNvbWUgXyBhcyB4IC0+IHgpXG4gICAgICBlbHNlIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIGwgfmZcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2ID1cbiAgICBtYXRjaCBob3cgd2l0aFxuICAgIHwgYExhc3Rfc3RyaWN0bHlfbGVzc190aGFuIC0+IGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDwgMClcbiAgICB8IGBMYXN0X2xlc3NfdGhhbl9vcl9lcXVhbF90byAtPiBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA8PSAwKVxuICAgIHwgYEZpcnN0X2VxdWFsX3RvIC0+XG4gICAgICAobWF0Y2ggZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2ID49IDApIHdpdGhcbiAgICAgICB8IFNvbWUgeCBhcyBlbHQgd2hlbiBjb21wYXJlIHggdiA9IDAgLT4gZWx0XG4gICAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gICAgfCBgTGFzdF9lcXVhbF90byAtPlxuICAgICAgKG1hdGNoIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB4IC0+IGNvbXBhcmUgeCB2IDw9IDApIHdpdGhcbiAgICAgICB8IFNvbWUgeCBhcyBlbHQgd2hlbiBjb21wYXJlIHggdiA9IDAgLT4gZWx0XG4gICAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gICAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvIC0+XG4gICAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIHggLT4gY29tcGFyZSB4IHYgPj0gMClcbiAgICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gLT5cbiAgICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4geCAtPiBjb21wYXJlIHggdiA+IDApXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBsZXQgaXNfbGVmdCB4ID1cbiAgICAgIG1hdGNoIHNlZ21lbnRfb2YgeCB3aXRoXG4gICAgICB8IGBMZWZ0IC0+IHRydWVcbiAgICAgIHwgYFJpZ2h0IC0+IGZhbHNlXG4gICAgaW5cbiAgICBsZXQgaXNfcmlnaHQgeCA9IG5vdCAoaXNfbGVmdCB4KSBpblxuICAgIG1hdGNoIGhvdyB3aXRoXG4gICAgfCBgTGFzdF9vbl9sZWZ0IC0+IGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6aXNfbGVmdFxuICAgIHwgYEZpcnN0X29uX3JpZ2h0IC0+IGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOmlzX3JpZ2h0XG4gIDs7XG5cbiAgbGV0IG1lcmdlX3RvX3NlcXVlbmNlXG4gICAgICAgIGNvbXBhcmF0b3JcbiAgICAgICAgPyhvcmRlciA9IGBJbmNyZWFzaW5nKVxuICAgICAgICA/Z3JlYXRlcl9vcl9lcXVhbF90b1xuICAgICAgICA/bGVzc19vcl9lcXVhbF90b1xuICAgICAgICB0XG4gICAgICAgIHQnXG4gICAgPVxuICAgIFNlcXVlbmNlLm1lcmdlX3dpdGhfZHVwbGljYXRlc1xuICAgICAgKHRvX3NlcXVlbmNlIGNvbXBhcmF0b3Igfm9yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQpXG4gICAgICAodG9fc2VxdWVuY2UgY29tcGFyYXRvciB+b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCcpXG4gICAgICB+Y29tcGFyZTpcbiAgICAgICAgKG1hdGNoIG9yZGVyIHdpdGhcbiAgICAgICAgIHwgYEluY3JlYXNpbmcgLT4gY29tcGFyYXRvci5jb21wYXJlXG4gICAgICAgICB8IGBEZWNyZWFzaW5nIC0+IEZuLmZsaXAgY29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBjb21wYXJlIGNvbXBhcmVfZWx0IHMxIHMyID1cbiAgICBFbnVtLmNvbXBhcmUgY29tcGFyZV9lbHQgKEVudW0ub2Zfc2V0IHMxKSAoRW51bS5vZl9zZXQgczIpXG4gIDs7XG5cbiAgbGV0IGl0ZXIyIHMxIHMyIH5jb21wYXJlX2VsdCA9IEVudW0uaXRlcjIgY29tcGFyZV9lbHQgKEVudW0ub2Zfc2V0IHMxKSAoRW51bS5vZl9zZXQgczIpXG4gIGxldCBlcXVhbCBzMSBzMiB+Y29tcGFyZV9lbHQgPSBjb21wYXJlIGNvbXBhcmVfZWx0IHMxIHMyID0gMFxuXG4gIGxldCBpc19zdWJzZXQgczEgfm9mXzpzMiB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgaXNfc3Vic2V0IHMxIH5vZl86czIgPVxuICAgICAgbWF0Y2ggczEsIHMyIHdpdGhcbiAgICAgIHwgRW1wdHksIF8gLT4gdHJ1ZVxuICAgICAgfCBfLCBFbXB0eSAtPiBmYWxzZVxuICAgICAgfCBMZWFmIHYxLCB0MiAtPiBtZW0gdDIgdjEgfmNvbXBhcmVfZWx0XG4gICAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIF8sIF8pLCBMZWFmIHYyIC0+XG4gICAgICAgIChtYXRjaCBsMSwgcjEgd2l0aFxuICAgICAgICAgfCBFbXB0eSwgRW1wdHkgLT5cbiAgICAgICAgICAgKCogVGhpcyBjYXNlIHNob3VsZG4ndCBvY2N1ciBpbiBwcmFjdGljZSBiZWNhdXNlIHdlIHNob3VsZCBoYXZlIGNvbnN0cnVjdGVkXG4gICAgICAgICAgICAgIGEgTGVhZiByYXRoZXIgdGhhbiBhIE5vZGUgd2l0aCB0d28gRW1wdHkgc3VidHJlZXMgKilcbiAgICAgICAgICAgY29tcGFyZV9lbHQgdjEgdjIgPSAwXG4gICAgICAgICB8IF8sIF8gLT4gZmFsc2UpXG4gICAgICB8IE5vZGUgKGwxLCB2MSwgcjEsIF8sIF8pLCAoTm9kZSAobDIsIHYyLCByMiwgXywgXykgYXMgdDIpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9lbHQgdjEgdjIgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlblxuICAgICAgICAgIHBoeXNfZXF1YWwgczEgczIgfHwgKGlzX3N1YnNldCBsMSB+b2ZfOmwyICYmIGlzX3N1YnNldCByMSB+b2ZfOnIyKVxuICAgICAgICAgICgqIE5vdGUgdGhhdCBoZWlnaHQgYW5kIHNpemUgZG9uJ3QgbWF0dGVyIGhlcmUuICopXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiBpc19zdWJzZXQgKE5vZGUgKGwxLCB2MSwgRW1wdHksIDAsIDApKSB+b2ZfOmwyICYmIGlzX3N1YnNldCByMSB+b2ZfOnQyXG4gICAgICAgIGVsc2UgaXNfc3Vic2V0IChOb2RlIChFbXB0eSwgdjEsIHIxLCAwLCAwKSkgfm9mXzpyMiAmJiBpc19zdWJzZXQgbDEgfm9mXzp0MlxuICAgIGluXG4gICAgaXNfc3Vic2V0IHMxIH5vZl86czJcbiAgOztcblxuICBsZXQgcmVjIGFyZV9kaXNqb2ludCBzMSBzMiB+Y29tcGFyZV9lbHQgPVxuICAgIG1hdGNoIHMxLCBzMiB3aXRoXG4gICAgfCBFbXB0eSwgXyB8IF8sIEVtcHR5IC0+IHRydWVcbiAgICB8IExlYWYgZWx0LCBvdGhlcl9zZXQgfCBvdGhlcl9zZXQsIExlYWYgZWx0IC0+IG5vdCAobWVtIG90aGVyX3NldCBlbHQgfmNvbXBhcmVfZWx0KVxuICAgIHwgTm9kZSAobDEsIHYxLCByMSwgXywgXyksIHQyIC0+XG4gICAgICBpZiBwaHlzX2VxdWFsIHMxIHMyXG4gICAgICB0aGVuIGZhbHNlXG4gICAgICBlbHNlIChcbiAgICAgICAgbWF0Y2ggc3BsaXQgdDIgdjEgfmNvbXBhcmVfZWx0IHdpdGhcbiAgICAgICAgfCBsMiwgTm9uZSwgcjIgLT5cbiAgICAgICAgICBhcmVfZGlzam9pbnQgbDEgbDIgfmNvbXBhcmVfZWx0ICYmIGFyZV9kaXNqb2ludCByMSByMiB+Y29tcGFyZV9lbHRcbiAgICAgICAgfCBfLCBTb21lIF8sIF8gLT4gZmFsc2UpXG4gIDs7XG5cbiAgbGV0IGl0ZXIgdCB+ZiA9XG4gICAgbGV0IHJlYyBpdGVyID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgIHwgTGVhZiB2IC0+IGYgdlxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBpdGVyIGw7XG4gICAgICAgIGYgdjtcbiAgICAgICAgaXRlciByXG4gICAgaW5cbiAgICBpdGVyIHRcbiAgOztcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgPSBFbnVtLnN5bW1ldHJpY19kaWZmXG5cbiAgbGV0IHJlYyBmb2xkIHMgfmluaXQ6YWNjdSB+ZiA9XG4gICAgbWF0Y2ggcyB3aXRoXG4gICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgfCBMZWFmIHYgLT4gZiBhY2N1IHZcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGZvbGQgfmYgciB+aW5pdDooZiAoZm9sZCB+ZiBsIH5pbml0OmFjY3UpIHYpXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF90X2lnbm9yaW5nX3N0cnVjdHVyZSBoYXNoX2ZvbGRfZWxlbSBzdGF0ZSB0ID1cbiAgICBmb2xkIHQgfmluaXQ6KGhhc2hfZm9sZF9pbnQgc3RhdGUgKGxlbmd0aCB0KSkgfmY6aGFzaF9mb2xkX2VsZW1cbiAgOztcblxuICBsZXQgY291bnQgdCB+ZiA9IENvbnRhaW5lci5jb3VudCB+Zm9sZCB0IH5mXG4gIGxldCBzdW0gbSB0IH5mID0gQ29udGFpbmVyLnN1bSB+Zm9sZCBtIHQgfmZcblxuICBsZXQgcmVjIGZvbGRfcmlnaHQgcyB+aW5pdDphY2N1IH5mID1cbiAgICBtYXRjaCBzIHdpdGhcbiAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICB8IExlYWYgdiAtPiBmIHYgYWNjdVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gZm9sZF9yaWdodCB+ZiBsIH5pbml0OihmIHYgKGZvbGRfcmlnaHQgfmYgciB+aW5pdDphY2N1KSlcbiAgOztcblxuICBsZXQgcmVjIGZvcl9hbGwgdCB+ZjpwID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IHRydWVcbiAgICB8IExlYWYgdiAtPiBwIHZcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IHAgdiAmJiBmb3JfYWxsIH5mOnAgbCAmJiBmb3JfYWxsIH5mOnAgclxuICA7O1xuXG4gIGxldCByZWMgZXhpc3RzIHQgfmY6cCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBmYWxzZVxuICAgIHwgTGVhZiB2IC0+IHAgdlxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT4gcCB2IHx8IGV4aXN0cyB+ZjpwIGwgfHwgZXhpc3RzIH5mOnAgclxuICA7O1xuXG4gIGxldCBmaWx0ZXIgcyB+ZjpwIH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBmaWx0IGFjY3UgPSBmdW5jdGlvblxuICAgICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgICB8IExlYWYgdiAtPiBpZiBwIHYgdGhlbiBhZGQgYWNjdSB2IH5jb21wYXJlX2VsdCBlbHNlIGFjY3VcbiAgICAgIHwgTm9kZSAobCwgdiwgciwgXywgXykgLT5cbiAgICAgICAgZmlsdCAoZmlsdCAoaWYgcCB2IHRoZW4gYWRkIGFjY3UgdiB+Y29tcGFyZV9lbHQgZWxzZSBhY2N1KSBsKSByXG4gICAgaW5cbiAgICBmaWx0IEVtcHR5IHNcbiAgOztcblxuICBsZXQgZmlsdGVyX21hcCBzIH5mOnAgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGZpbHQgYWNjdSA9IGZ1bmN0aW9uXG4gICAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICAgIHwgTGVhZiB2IC0+XG4gICAgICAgIChtYXRjaCBwIHYgd2l0aFxuICAgICAgICAgfCBOb25lIC0+IGFjY3VcbiAgICAgICAgIHwgU29tZSB2IC0+IGFkZCBhY2N1IHYgfmNvbXBhcmVfZWx0KVxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBmaWx0XG4gICAgICAgICAgKGZpbHRcbiAgICAgICAgICAgICAobWF0Y2ggcCB2IHdpdGhcbiAgICAgICAgICAgICAgfCBOb25lIC0+IGFjY3VcbiAgICAgICAgICAgICAgfCBTb21lIHYgLT4gYWRkIGFjY3UgdiB+Y29tcGFyZV9lbHQpXG4gICAgICAgICAgICAgbClcbiAgICAgICAgICByXG4gICAgaW5cbiAgICBmaWx0IEVtcHR5IHNcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX3RmIHMgfmY6cCB+Y29tcGFyZV9lbHQgPVxuICAgIGxldCByZWMgcGFydCAoKHQsIGYpIGFzIGFjY3UpID0gZnVuY3Rpb25cbiAgICAgIHwgRW1wdHkgLT4gYWNjdVxuICAgICAgfCBMZWFmIHYgLT4gaWYgcCB2IHRoZW4gYWRkIHQgdiB+Y29tcGFyZV9lbHQsIGYgZWxzZSB0LCBhZGQgZiB2IH5jb21wYXJlX2VsdFxuICAgICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgICBwYXJ0IChwYXJ0IChpZiBwIHYgdGhlbiBhZGQgdCB2IH5jb21wYXJlX2VsdCwgZiBlbHNlIHQsIGFkZCBmIHYgfmNvbXBhcmVfZWx0KSBsKSByXG4gICAgaW5cbiAgICBwYXJ0IChFbXB0eSwgRW1wdHkpIHNcbiAgOztcblxuICBsZXQgcmVjIGVsZW1lbnRzX2F1eCBhY2N1ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICB8IExlYWYgdiAtPiB2IDo6IGFjY3VcbiAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+IGVsZW1lbnRzX2F1eCAodiA6OiBlbGVtZW50c19hdXggYWNjdSByKSBsXG4gIDs7XG5cbiAgbGV0IGVsZW1lbnRzIHMgPSBlbGVtZW50c19hdXggW10gc1xuXG4gIGxldCBjaG9vc2UgdCA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gU29tZSB2XG4gICAgfCBOb2RlIChfLCB2LCBfLCBfLCBfKSAtPiBTb21lIHZcbiAgOztcblxuICBsZXQgY2hvb3NlX2V4biA9XG4gICAgbGV0IG5vdF9mb3VuZCA9IE5vdF9mb3VuZF9zIChBdG9tIFwiU2V0LmNob29zZV9leG46IGVtcHR5IHNldFwiKSBpblxuICAgIGxldCBjaG9vc2VfZXhuIHQgPVxuICAgICAgbWF0Y2ggY2hvb3NlIHQgd2l0aFxuICAgICAgfCBOb25lIC0+IHJhaXNlIG5vdF9mb3VuZFxuICAgICAgfCBTb21lIHYgLT4gdlxuICAgIGluXG4gICAgKCogbmFtZWQgdG8gcHJlc2VydmUgc3ltYm9sIGluIGNvbXBpbGVkIGJpbmFyeSAqKVxuICAgIGNob29zZV9leG5cbiAgOztcblxuICBsZXQgb2ZfbGlzdCBsc3QgfmNvbXBhcmVfZWx0ID1cbiAgICBMaXN0LmZvbGQgbHN0IH5pbml0OmVtcHR5IH5mOihmdW4gdCB4IC0+IGFkZCB0IHggfmNvbXBhcmVfZWx0KVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZSBzZXF1ZW5jZSB+Y29tcGFyZV9lbHQgPVxuICAgIFNlcXVlbmNlLmZvbGQgc2VxdWVuY2UgfmluaXQ6ZW1wdHkgfmY6KGZ1biB0IHggLT4gYWRkIHQgeCB+Y29tcGFyZV9lbHQpXG4gIDs7XG5cbiAgbGV0IHRvX2xpc3QgcyA9IGVsZW1lbnRzIHNcblxuICBsZXQgb2ZfYXJyYXkgYSB+Y29tcGFyZV9lbHQgPVxuICAgIEFycmF5LmZvbGQgYSB+aW5pdDplbXB0eSB+ZjooZnVuIHQgeCAtPiBhZGQgdCB4IH5jb21wYXJlX2VsdClcbiAgOztcblxuICAoKiBmYXN0ZXIgYnV0IGVxdWl2YWxlbnQgdG8gW0FycmF5Lm9mX2xpc3QgKHRvX2xpc3QgdCldICopXG4gIGxldCB0b19hcnJheSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBbfHxdXG4gICAgfCBMZWFmIHYgLT4gW3wgdiB8XVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgcykgLT5cbiAgICAgIGxldCByZXMgPSBBcnJheS5jcmVhdGUgfmxlbjpzIHYgaW5cbiAgICAgIGxldCBwb3NfcmVmID0gcmVmIDAgaW5cbiAgICAgIGxldCByZWMgbG9vcCA9IGZ1bmN0aW9uXG4gICAgICAgICgqIEludmFyaWFudDogb24gZW50cnkgYW5kIG9uIGV4aXQgdG8gW2xvb3BdLCAhcG9zX3JlZiBpcyB0aGUgbmV4dFxuICAgICAgICAgICBhdmFpbGFibGUgY2VsbCBpbiB0aGUgYXJyYXkuICopXG4gICAgICAgIHwgRW1wdHkgLT4gKClcbiAgICAgICAgfCBMZWFmIHYgLT5cbiAgICAgICAgICByZXMuKCFwb3NfcmVmKSA8LSB2O1xuICAgICAgICAgIGluY3IgcG9zX3JlZlxuICAgICAgICB8IE5vZGUgKGwsIHYsIHIsIF8sIF8pIC0+XG4gICAgICAgICAgbG9vcCBsO1xuICAgICAgICAgIHJlcy4oIXBvc19yZWYpIDwtIHY7XG4gICAgICAgICAgaW5jciBwb3NfcmVmO1xuICAgICAgICAgIGxvb3AgclxuICAgICAgaW5cbiAgICAgIGxvb3AgbDtcbiAgICAgICgqIHJlcy4oIXBvc19yZWYpIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgKGJ5IEFycmF5LmNyZWF0ZSB+bGVuOmFib3ZlKS4gKilcbiAgICAgIGluY3IgcG9zX3JlZjtcbiAgICAgIGxvb3AgcjtcbiAgICAgIHJlc1xuICA7O1xuXG4gIGxldCBtYXAgdCB+ZiB+Y29tcGFyZV9lbHQgPSBmb2xkIHQgfmluaXQ6ZW1wdHkgfmY6KGZ1biB0IHggLT4gYWRkIHQgKGYgeCkgfmNvbXBhcmVfZWx0KVxuXG4gIGxldCBncm91cF9ieSBzZXQgfmVxdWl2IH5jb21wYXJlX2VsdCA9XG4gICAgbGV0IHJlYyBsb29wIHNldCBlcXVpdl9jbGFzc2VzID1cbiAgICAgIGlmIGlzX2VtcHR5IHNldFxuICAgICAgdGhlbiBlcXVpdl9jbGFzc2VzXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHggPSBjaG9vc2VfZXhuIHNldCBpblxuICAgICAgICBsZXQgZXF1aXZfeCwgbm90X2VxdWl2X3ggPVxuICAgICAgICAgIHBhcnRpdGlvbl90ZiBzZXQgfmY6KGZ1biBlbHQgLT4gcGh5c19lcXVhbCB4IGVsdCB8fCBlcXVpdiB4IGVsdCkgfmNvbXBhcmVfZWx0XG4gICAgICAgIGluXG4gICAgICAgIGxvb3Agbm90X2VxdWl2X3ggKGVxdWl2X3ggOjogZXF1aXZfY2xhc3NlcykpXG4gICAgaW5cbiAgICBsb29wIHNldCBbXVxuICA7O1xuXG4gIGxldCByZWMgZmluZCB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgdiAtPiBpZiBmIHYgdGhlbiBTb21lIHYgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgaWYgZiB2XG4gICAgICB0aGVuIFNvbWUgdlxuICAgICAgZWxzZSAoXG4gICAgICAgIG1hdGNoIGZpbmQgbCB+ZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiBmaW5kIHIgfmZcbiAgICAgICAgfCBTb21lIF8gYXMgciAtPiByKVxuICA7O1xuXG4gIGxldCByZWMgZmluZF9tYXAgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIHYgLT4gZiB2XG4gICAgfCBOb2RlIChsLCB2LCByLCBfLCBfKSAtPlxuICAgICAgKG1hdGNoIGYgdiB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgciAtPiByXG4gICAgICAgfCBOb25lIC0+XG4gICAgICAgICAobWF0Y2ggZmluZF9tYXAgbCB+ZiB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGZpbmRfbWFwIHIgfmZcbiAgICAgICAgICB8IFNvbWUgXyBhcyByIC0+IHIpKVxuICA7O1xuXG4gIGxldCBmaW5kX2V4biB0IH5mID1cbiAgICBtYXRjaCBmaW5kIHQgfmYgd2l0aFxuICAgIHwgTm9uZSAtPiBmYWlsd2l0aCBcIlNldC5maW5kX2V4biBmYWlsZWQgdG8gZmluZCBhIG1hdGNoaW5nIGVsZW1lbnRcIlxuICAgIHwgU29tZSBlIC0+IGVcbiAgOztcblxuICBsZXQgcmVjIG50aCB0IGkgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gTm9uZVxuICAgIHwgTGVhZiB2IC0+IGlmIGkgPSAwIHRoZW4gU29tZSB2IGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgdiwgciwgXywgcykgLT5cbiAgICAgIGlmIGkgPj0gc1xuICAgICAgdGhlbiBOb25lXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGxfc2l6ZSA9IGxlbmd0aCBsIGluXG4gICAgICAgIGxldCBjID0gUG9seS5jb21wYXJlIGkgbF9zaXplIGluXG4gICAgICAgIGlmIGMgPCAwIHRoZW4gbnRoIGwgaSBlbHNlIGlmIGMgPSAwIHRoZW4gU29tZSB2IGVsc2UgbnRoIHIgKGkgLSBsX3NpemUgLSAxKSlcbiAgOztcblxuICBsZXQgc3RhYmxlX2RlZHVwX2xpc3QgeHMgfmNvbXBhcmVfZWx0ID1cbiAgICBsZXQgcmVjIGxvb3AgeHMgbGVmdG92ZXJzIGFscmVhZHlfc2VlbiA9XG4gICAgICBtYXRjaCB4cyB3aXRoXG4gICAgICB8IFtdIC0+IExpc3QucmV2IGxlZnRvdmVyc1xuICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBpZiBtZW0gYWxyZWFkeV9zZWVuIGhkIH5jb21wYXJlX2VsdFxuICAgICAgICB0aGVuIGxvb3AgdGwgbGVmdG92ZXJzIGFscmVhZHlfc2VlblxuICAgICAgICBlbHNlIGxvb3AgdGwgKGhkIDo6IGxlZnRvdmVycykgKGFkZCBhbHJlYWR5X3NlZW4gaGQgfmNvbXBhcmVfZWx0KVxuICAgIGluXG4gICAgbG9vcCB4cyBbXSBlbXB0eVxuICA7O1xuXG4gIGxldCB0X29mX3NleHBfZGlyZWN0IGFfb2Zfc2V4cCBzZXhwIH5jb21wYXJlX2VsdCA9XG4gICAgbWF0Y2ggc2V4cCB3aXRoXG4gICAgfCBTZXhwLkxpc3QgbHN0IC0+XG4gICAgICBsZXQgZWx0X2xzdCA9IExpc3QubWFwIGxzdCB+ZjphX29mX3NleHAgaW5cbiAgICAgIGxldCBzZXQgPSBvZl9saXN0IGVsdF9sc3QgfmNvbXBhcmVfZWx0IGluXG4gICAgICBpZiBsZW5ndGggc2V0ID0gTGlzdC5sZW5ndGggbHN0XG4gICAgICB0aGVuIHNldFxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBzZXQgPSByZWYgZW1wdHkgaW5cbiAgICAgICAgTGlzdC5pdGVyMl9leG4gbHN0IGVsdF9sc3QgfmY6KGZ1biBlbF9zZXhwIGVsIC0+XG4gICAgICAgICAgaWYgbWVtICFzZXQgZWwgfmNvbXBhcmVfZWx0XG4gICAgICAgICAgdGhlbiBvZl9zZXhwX2Vycm9yIFwiU2V0LnRfb2Zfc2V4cDogZHVwbGljYXRlIGVsZW1lbnQgaW4gc2V0XCIgZWxfc2V4cFxuICAgICAgICAgIGVsc2Ugc2V0IDo9IGFkZCAhc2V0IGVsIH5jb21wYXJlX2VsdCk7XG4gICAgICAgIGFzc2VydCBmYWxzZSlcbiAgICB8IHNleHAgLT4gb2Zfc2V4cF9lcnJvciBcIlNldC50X29mX3NleHA6IGxpc3QgbmVlZGVkXCIgc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPVxuICAgIFNleHAuTGlzdCAoZm9sZF9yaWdodCB0IH5pbml0OltdIH5mOihmdW4gZWwgYWNjIC0+IHNleHBfb2ZfYSBlbCA6OiBhY2MpKVxuICA7O1xuXG4gIG1vZHVsZSBOYW1lZCA9IHN0cnVjdFxuICAgIHR5cGUgbm9ucmVjICgnYSwgJ2NtcCkgdCA9XG4gICAgICB7IHRyZWUgOiAnYSB0XG4gICAgICA7IG5hbWUgOiBzdHJpbmdcbiAgICAgIH1cblxuICAgIGxldCBpc19zdWJzZXQgKHN1YnNldCA6IF8gdCkgfm9mXzooc3VwZXJzZXQgOiBfIHQpIH5zZXhwX29mX2VsdCB+Y29tcGFyZV9lbHQgPVxuICAgICAgbGV0IGludmFsaWRfZWxlbWVudHMgPSBkaWZmIHN1YnNldC50cmVlIHN1cGVyc2V0LnRyZWUgfmNvbXBhcmVfZWx0IGluXG4gICAgICBpZiBpc19lbXB0eSBpbnZhbGlkX2VsZW1lbnRzXG4gICAgICB0aGVuIE9rICgpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IGludmFsaWRfZWxlbWVudHNfc2V4cCA9IHNleHBfb2ZfdCBzZXhwX29mX2VsdCBpbnZhbGlkX2VsZW1lbnRzIGluXG4gICAgICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgICAgKHN1YnNldC5uYW1lIF4gXCIgaXMgbm90IGEgc3Vic2V0IG9mIFwiIF4gc3VwZXJzZXQubmFtZSlcbiAgICAgICAgICAgICBbIFwiaW52YWxpZF9lbGVtZW50c1wiLCBpbnZhbGlkX2VsZW1lbnRzX3NleHAgXSkpXG4gICAgOztcblxuICAgIGxldCBlcXVhbCBzMSBzMiB+c2V4cF9vZl9lbHQgfmNvbXBhcmVfZWx0ID1cbiAgICAgIE9yX2Vycm9yLmNvbWJpbmVfZXJyb3JzX3VuaXRcbiAgICAgICAgWyBpc19zdWJzZXQgczEgfm9mXzpzMiB+c2V4cF9vZl9lbHQgfmNvbXBhcmVfZWx0XG4gICAgICAgIDsgaXNfc3Vic2V0IHMyIH5vZl86czEgfnNleHBfb2ZfZWx0IH5jb21wYXJlX2VsdFxuICAgICAgICBdXG4gICAgOztcbiAgZW5kXG5lbmRcblxudHlwZSAoJ2EsICdjb21wYXJhdG9yKSB0ID1cbiAgeyAoKiBbY29tcGFyYXRvcl0gaXMgdGhlIGZpcnN0IGZpZWxkIHNvIHRoYXQgcG9seW1vcnBoaWMgZXF1YWxpdHkgZmFpbHMgb24gYSBtYXAgZHVlXG4gICAgICAgdG8gdGhlIGZ1bmN0aW9uYWwgdmFsdWUgaW4gdGhlIGNvbXBhcmF0b3IuXG4gICAgICAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgYWZmZWN0IHBvbHltb3JwaGljIFtjb21wYXJlXTogdGhhdCBzdGlsbCBwcm9kdWNlc1xuICAgICAgIG5vbnNlbnNlLiAqKVxuICAgIGNvbXBhcmF0b3IgOiAoJ2EsICdjb21wYXJhdG9yKSBDb21wYXJhdG9yLnRcbiAgOyB0cmVlIDogJ2EgVHJlZTAudFxuICB9XG5cbnR5cGUgKCdhLCAnY29tcGFyYXRvcikgdHJlZSA9ICdhIFRyZWUwLnRcblxubGV0IGxpa2UgeyB0cmVlID0gXzsgY29tcGFyYXRvciB9IHRyZWUgPSB7IHRyZWU7IGNvbXBhcmF0b3IgfVxubGV0IGNvbXBhcmVfZWx0IHQgPSB0LmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG5cbm1vZHVsZSBBY2Nlc3NvcnMgPSBzdHJ1Y3RcbiAgbGV0IGNvbXBhcmF0b3IgdCA9IHQuY29tcGFyYXRvclxuICBsZXQgaW52YXJpYW50cyB0ID0gVHJlZTAuaW52YXJpYW50cyB0LnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KVxuICBsZXQgbGVuZ3RoIHQgPSBUcmVlMC5sZW5ndGggdC50cmVlXG4gIGxldCBpc19lbXB0eSB0ID0gVHJlZTAuaXNfZW1wdHkgdC50cmVlXG4gIGxldCBlbGVtZW50cyB0ID0gVHJlZTAuZWxlbWVudHMgdC50cmVlXG4gIGxldCBtaW5fZWx0IHQgPSBUcmVlMC5taW5fZWx0IHQudHJlZVxuICBsZXQgbWluX2VsdF9leG4gdCA9IFRyZWUwLm1pbl9lbHRfZXhuIHQudHJlZVxuICBsZXQgbWF4X2VsdCB0ID0gVHJlZTAubWF4X2VsdCB0LnRyZWVcbiAgbGV0IG1heF9lbHRfZXhuIHQgPSBUcmVlMC5tYXhfZWx0X2V4biB0LnRyZWVcbiAgbGV0IGNob29zZSB0ID0gVHJlZTAuY2hvb3NlIHQudHJlZVxuICBsZXQgY2hvb3NlX2V4biB0ID0gVHJlZTAuY2hvb3NlX2V4biB0LnRyZWVcbiAgbGV0IHRvX2xpc3QgdCA9IFRyZWUwLnRvX2xpc3QgdC50cmVlXG4gIGxldCB0b19hcnJheSB0ID0gVHJlZTAudG9fYXJyYXkgdC50cmVlXG4gIGxldCBmb2xkIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkIHQudHJlZSB+aW5pdCB+ZlxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF91bnRpbCB0LnRyZWUgfmluaXQgfmZcbiAgbGV0IGZvbGRfcmlnaHQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfcmlnaHQgdC50cmVlIH5pbml0IH5mXG4gIGxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbiAgbGV0IGl0ZXIgdCB+ZiA9IFRyZWUwLml0ZXIgdC50cmVlIH5mXG4gIGxldCBpdGVyMiBhIGIgfmYgPSBUcmVlMC5pdGVyMiBhLnRyZWUgYi50cmVlIH5mIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgYSlcbiAgbGV0IGV4aXN0cyB0IH5mID0gVHJlZTAuZXhpc3RzIHQudHJlZSB+ZlxuICBsZXQgZm9yX2FsbCB0IH5mID0gVHJlZTAuZm9yX2FsbCB0LnRyZWUgfmZcbiAgbGV0IGNvdW50IHQgfmYgPSBUcmVlMC5jb3VudCB0LnRyZWUgfmZcbiAgbGV0IHN1bSBtIHQgfmYgPSBUcmVlMC5zdW0gbSB0LnRyZWUgfmZcbiAgbGV0IGZpbmQgdCB+ZiA9IFRyZWUwLmZpbmQgdC50cmVlIH5mXG4gIGxldCBmaW5kX2V4biB0IH5mID0gVHJlZTAuZmluZF9leG4gdC50cmVlIH5mXG4gIGxldCBmaW5kX21hcCB0IH5mID0gVHJlZTAuZmluZF9tYXAgdC50cmVlIH5mXG4gIGxldCBtZW0gdCBhID0gVHJlZTAubWVtIHQudHJlZSBhIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdClcbiAgbGV0IGZpbHRlciB0IH5mID0gbGlrZSB0IChUcmVlMC5maWx0ZXIgdC50cmVlIH5mIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkpXG4gIGxldCBhZGQgdCBhID0gbGlrZSB0IChUcmVlMC5hZGQgdC50cmVlIGEgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSlcbiAgbGV0IHJlbW92ZSB0IGEgPSBsaWtlIHQgKFRyZWUwLnJlbW92ZSB0LnRyZWUgYSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQpKVxuICBsZXQgdW5pb24gdDEgdDIgPSBsaWtlIHQxIChUcmVlMC51bmlvbiB0MS50cmVlIHQyLnRyZWUgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0MSkpXG4gIGxldCBpbnRlciB0MSB0MiA9IGxpa2UgdDEgKFRyZWUwLmludGVyIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKSlcbiAgbGV0IGRpZmYgdDEgdDIgPSBsaWtlIHQxIChUcmVlMC5kaWZmIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKSlcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgdDEgdDIgPVxuICAgIFRyZWUwLnN5bW1ldHJpY19kaWZmIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9lbHQ6KGNvbXBhcmVfZWx0IHQxKVxuICA7O1xuXG4gIGxldCBjb21wYXJlX2RpcmVjdCB0MSB0MiA9IFRyZWUwLmNvbXBhcmUgKGNvbXBhcmVfZWx0IHQxKSB0MS50cmVlIHQyLnRyZWVcbiAgbGV0IGVxdWFsIHQxIHQyID0gVHJlZTAuZXF1YWwgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpXG4gIGxldCBpc19zdWJzZXQgdCB+b2ZfID0gVHJlZTAuaXNfc3Vic2V0IHQudHJlZSB+b2ZfOm9mXy50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdClcblxuICBsZXQgYXJlX2Rpc2pvaW50IHQxIHQyID1cbiAgICBUcmVlMC5hcmVfZGlzam9pbnQgdDEudHJlZSB0Mi50cmVlIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdDEpXG4gIDs7XG5cbiAgbW9kdWxlIE5hbWVkID0gc3RydWN0XG4gICAgdHlwZSBub25yZWMgKCdhLCAnY21wKSB0ID1cbiAgICAgIHsgc2V0IDogKCdhLCAnY21wKSB0XG4gICAgICA7IG5hbWUgOiBzdHJpbmdcbiAgICAgIH1cblxuICAgIGxldCB0b19uYW1lZF90cmVlIHsgc2V0OyBuYW1lIH0gPSB7IFRyZWUwLk5hbWVkLnRyZWUgPSBzZXQudHJlZTsgbmFtZSB9XG5cbiAgICBsZXQgaXNfc3Vic2V0IChzdWJzZXQgOiAoXywgXykgdCkgfm9mXzooc3VwZXJzZXQgOiAoXywgXykgdCkgPVxuICAgICAgVHJlZTAuTmFtZWQuaXNfc3Vic2V0XG4gICAgICAgICh0b19uYW1lZF90cmVlIHN1YnNldClcbiAgICAgICAgfm9mXzoodG9fbmFtZWRfdHJlZSBzdXBlcnNldClcbiAgICAgICAgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCBzdWJzZXQuc2V0KVxuICAgICAgICB+c2V4cF9vZl9lbHQ6c3Vic2V0LnNldC5jb21wYXJhdG9yLnNleHBfb2ZfdFxuICAgIDs7XG5cbiAgICBsZXQgZXF1YWwgdDEgdDIgPVxuICAgICAgT3JfZXJyb3IuY29tYmluZV9lcnJvcnNfdW5pdCBbIGlzX3N1YnNldCB0MSB+b2ZfOnQyOyBpc19zdWJzZXQgdDIgfm9mXzp0MSBdXG4gICAgOztcbiAgZW5kXG5cbiAgbGV0IHBhcnRpdGlvbl90ZiB0IH5mID1cbiAgICBsZXQgdHJlZV90LCB0cmVlX2YgPSBUcmVlMC5wYXJ0aXRpb25fdGYgdC50cmVlIH5mIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkgaW5cbiAgICBsaWtlIHQgdHJlZV90LCBsaWtlIHQgdHJlZV9mXG4gIDs7XG5cbiAgbGV0IHNwbGl0IHQgYSA9XG4gICAgbGV0IHRyZWUxLCBiLCB0cmVlMiA9IFRyZWUwLnNwbGl0IHQudHJlZSBhIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkgaW5cbiAgICBsaWtlIHQgdHJlZTEsIGIsIGxpa2UgdCB0cmVlMlxuICA7O1xuXG4gIGxldCBncm91cF9ieSB0IH5lcXVpdiA9XG4gICAgTGlzdC5tYXAgKFRyZWUwLmdyb3VwX2J5IHQudHJlZSB+ZXF1aXYgfmNvbXBhcmVfZWx0Oihjb21wYXJlX2VsdCB0KSkgfmY6KGxpa2UgdClcbiAgOztcblxuICBsZXQgbnRoIHQgaSA9IFRyZWUwLm50aCB0LnRyZWUgaVxuICBsZXQgcmVtb3ZlX2luZGV4IHQgaSA9IGxpa2UgdCAoVHJlZTAucmVtb3ZlX2luZGV4IHQudHJlZSBpIH5jb21wYXJlX2VsdDooY29tcGFyZV9lbHQgdCkpXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIF8gdCA9IFRyZWUwLnNleHBfb2ZfdCBzZXhwX29mX2EgdC50cmVlXG5cbiAgbGV0IHRvX3NlcXVlbmNlID9vcmRlciA/Z3JlYXRlcl9vcl9lcXVhbF90byA/bGVzc19vcl9lcXVhbF90byB0ID1cbiAgICBUcmVlMC50b19zZXF1ZW5jZSB0LmNvbXBhcmF0b3IgP29yZGVyID9ncmVhdGVyX29yX2VxdWFsX3RvID9sZXNzX29yX2VxdWFsX3RvIHQudHJlZVxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIHQgfmNvbXBhcmUgaG93IHYgPSBUcmVlMC5iaW5hcnlfc2VhcmNoIHQudHJlZSB+Y29tcGFyZSBob3cgdlxuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvdyA9XG4gICAgVHJlZTAuYmluYXJ5X3NlYXJjaF9zZWdtZW50ZWQgdC50cmVlIH5zZWdtZW50X29mIGhvd1xuICA7O1xuXG4gIGxldCBtZXJnZV90b19zZXF1ZW5jZSA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCB0JyA9XG4gICAgVHJlZTAubWVyZ2VfdG9fc2VxdWVuY2VcbiAgICAgIHQuY29tcGFyYXRvclxuICAgICAgP29yZGVyXG4gICAgICA/Z3JlYXRlcl9vcl9lcXVhbF90b1xuICAgICAgP2xlc3Nfb3JfZXF1YWxfdG9cbiAgICAgIHQudHJlZVxuICAgICAgdCcudHJlZVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfZGlyZWN0IGhhc2hfZm9sZF9rZXkgc3RhdGUgdCA9XG4gICAgVHJlZTAuaGFzaF9mb2xkX3RfaWdub3Jpbmdfc3RydWN0dXJlIGhhc2hfZm9sZF9rZXkgc3RhdGUgdC50cmVlXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBBY2Nlc3NvcnNcblxubGV0IGNvbXBhcmUgXyBfIHQxIHQyID0gY29tcGFyZV9kaXJlY3QgdDEgdDJcblxubW9kdWxlIFRyZWUgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2EsICdjb21wYXJhdG9yKSB0ID0gKCdhLCAnY29tcGFyYXRvcikgdHJlZVxuXG4gIGxldCBjZSBjb21wYXJhdG9yID0gY29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcblxuICBsZXQgdF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvciBhX29mX3NleHAgc2V4cCA9XG4gICAgVHJlZTAudF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpIGFfb2Zfc2V4cCBzZXhwXG4gIDs7XG5cbiAgbGV0IGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gPSBUcmVlMC5lbXB0eVxuICBsZXQgZW1wdHkgfmNvbXBhcmF0b3I6XyA9IGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb25cbiAgbGV0IHNpbmdsZXRvbiB+Y29tcGFyYXRvcjpfIGUgPSBUcmVlMC5zaW5nbGV0b24gZVxuICBsZXQgbGVuZ3RoIHQgPSBUcmVlMC5sZW5ndGggdFxuICBsZXQgaW52YXJpYW50cyB+Y29tcGFyYXRvciB0ID0gVHJlZTAuaW52YXJpYW50cyB0IH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGlzX2VtcHR5IHQgPSBUcmVlMC5pc19lbXB0eSB0XG4gIGxldCBlbGVtZW50cyB0ID0gVHJlZTAuZWxlbWVudHMgdFxuICBsZXQgbWluX2VsdCB0ID0gVHJlZTAubWluX2VsdCB0XG4gIGxldCBtaW5fZWx0X2V4biB0ID0gVHJlZTAubWluX2VsdF9leG4gdFxuICBsZXQgbWF4X2VsdCB0ID0gVHJlZTAubWF4X2VsdCB0XG4gIGxldCBtYXhfZWx0X2V4biB0ID0gVHJlZTAubWF4X2VsdF9leG4gdFxuICBsZXQgY2hvb3NlIHQgPSBUcmVlMC5jaG9vc2UgdFxuICBsZXQgY2hvb3NlX2V4biB0ID0gVHJlZTAuY2hvb3NlX2V4biB0XG4gIGxldCB0b19saXN0IHQgPSBUcmVlMC50b19saXN0IHRcbiAgbGV0IHRvX2FycmF5IHQgPSBUcmVlMC50b19hcnJheSB0XG4gIGxldCBpdGVyIHQgfmYgPSBUcmVlMC5pdGVyIHQgfmZcbiAgbGV0IGV4aXN0cyB0IH5mID0gVHJlZTAuZXhpc3RzIHQgfmZcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IFRyZWUwLmZvcl9hbGwgdCB+ZlxuICBsZXQgY291bnQgdCB+ZiA9IFRyZWUwLmNvdW50IHQgfmZcbiAgbGV0IHN1bSBtIHQgfmYgPSBUcmVlMC5zdW0gbSB0IH5mXG4gIGxldCBmaW5kIHQgfmYgPSBUcmVlMC5maW5kIHQgfmZcbiAgbGV0IGZpbmRfZXhuIHQgfmYgPSBUcmVlMC5maW5kX2V4biB0IH5mXG4gIGxldCBmaW5kX21hcCB0IH5mID0gVHJlZTAuZmluZF9tYXAgdCB+ZlxuICBsZXQgZm9sZCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZCB0IH5pbml0IH5mXG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3VudGlsIHQgfmluaXQgfmZcbiAgbGV0IGZvbGRfcmlnaHQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfcmlnaHQgdCB+aW5pdCB+ZlxuICBsZXQgbWFwIH5jb21wYXJhdG9yIHQgfmYgPSBUcmVlMC5tYXAgdCB+ZiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBmaWx0ZXIgfmNvbXBhcmF0b3IgdCB+ZiA9IFRyZWUwLmZpbHRlciB0IH5mIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGZpbHRlcl9tYXAgfmNvbXBhcmF0b3IgdCB+ZiA9IFRyZWUwLmZpbHRlcl9tYXAgdCB+ZiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBwYXJ0aXRpb25fdGYgfmNvbXBhcmF0b3IgdCB+ZiA9IFRyZWUwLnBhcnRpdGlvbl90ZiB0IH5mIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGl0ZXIyIH5jb21wYXJhdG9yIGEgYiB+ZiA9IFRyZWUwLml0ZXIyIGEgYiB+ZiB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBtZW0gfmNvbXBhcmF0b3IgdCBhID0gVHJlZTAubWVtIHQgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBhZGQgfmNvbXBhcmF0b3IgdCBhID0gVHJlZTAuYWRkIHQgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCByZW1vdmUgfmNvbXBhcmF0b3IgdCBhID0gVHJlZTAucmVtb3ZlIHQgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCB1bmlvbiB+Y29tcGFyYXRvciB0MSB0MiA9IFRyZWUwLnVuaW9uIHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGludGVyIH5jb21wYXJhdG9yIHQxIHQyID0gVHJlZTAuaW50ZXIgdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgZGlmZiB+Y29tcGFyYXRvciB0MSB0MiA9IFRyZWUwLmRpZmYgdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuXG4gIGxldCBzeW1tZXRyaWNfZGlmZiB+Y29tcGFyYXRvciB0MSB0MiA9XG4gICAgVHJlZTAuc3ltbWV0cmljX2RpZmYgdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBjb21wYXJlX2RpcmVjdCB+Y29tcGFyYXRvciB0MSB0MiA9IFRyZWUwLmNvbXBhcmUgKGNlIGNvbXBhcmF0b3IpIHQxIHQyXG4gIGxldCBlcXVhbCB+Y29tcGFyYXRvciB0MSB0MiA9IFRyZWUwLmVxdWFsIHQxIHQyIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IGlzX3N1YnNldCB+Y29tcGFyYXRvciB0IH5vZl8gPSBUcmVlMC5pc19zdWJzZXQgdCB+b2ZfIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcblxuICBsZXQgYXJlX2Rpc2pvaW50IH5jb21wYXJhdG9yIHQxIHQyID1cbiAgICBUcmVlMC5hcmVfZGlzam9pbnQgdDEgdDIgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBvZl9saXN0IH5jb21wYXJhdG9yIGwgPSBUcmVlMC5vZl9saXN0IGwgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgb2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3IgcyA9IFRyZWUwLm9mX3NlcXVlbmNlIHMgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgb2ZfYXJyYXkgfmNvbXBhcmF0b3IgYSA9IFRyZWUwLm9mX2FycmF5IGEgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGEgPVxuICAgIFRyZWUwLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yOl8gfmxlbiB+ZiA9XG4gICAgVHJlZTAub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZlxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYSA9IFRyZWUwLm9mX3NvcnRlZF9hcnJheSBhIH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHVuaW9uX2xpc3QgfmNvbXBhcmF0b3IgbCA9IFRyZWUwLnVuaW9uX2xpc3QgbCB+dG9fdHJlZTpGbi5pZCB+Y29tcGFyYXRvclxuXG4gIGxldCBzdGFibGVfZGVkdXBfbGlzdCB+Y29tcGFyYXRvciB4cyA9XG4gICAgVHJlZTAuc3RhYmxlX2RlZHVwX2xpc3QgeHMgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBncm91cF9ieSB+Y29tcGFyYXRvciB0IH5lcXVpdiA9IFRyZWUwLmdyb3VwX2J5IHQgfmVxdWl2IH5jb21wYXJlX2VsdDooY2UgY29tcGFyYXRvcilcbiAgbGV0IHNwbGl0IH5jb21wYXJhdG9yIHQgYSA9IFRyZWUwLnNwbGl0IHQgYSB+Y29tcGFyZV9lbHQ6KGNlIGNvbXBhcmF0b3IpXG4gIGxldCBudGggdCBpID0gVHJlZTAubnRoIHQgaVxuICBsZXQgcmVtb3ZlX2luZGV4IH5jb21wYXJhdG9yIHQgaSA9IFRyZWUwLnJlbW92ZV9pbmRleCB0IGkgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfYSBfIHQgPSBUcmVlMC5zZXhwX29mX3Qgc2V4cF9vZl9hIHRcbiAgbGV0IHRvX3RyZWUgdCA9IHRcbiAgbGV0IG9mX3RyZWUgfmNvbXBhcmF0b3I6XyB0ID0gdFxuXG4gIGxldCB0b19zZXF1ZW5jZSB+Y29tcGFyYXRvciA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCA9XG4gICAgVHJlZTAudG9fc2VxdWVuY2UgY29tcGFyYXRvciA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdFxuICA7O1xuXG4gIGxldCBiaW5hcnlfc2VhcmNoIH5jb21wYXJhdG9yOl8gdCB+Y29tcGFyZSBob3cgdiA9IFRyZWUwLmJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdlxuXG4gIGxldCBiaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB+Y29tcGFyYXRvcjpfIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBUcmVlMC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0IH5zZWdtZW50X29mIGhvd1xuICA7O1xuXG4gIGxldCBtZXJnZV90b19zZXF1ZW5jZSB+Y29tcGFyYXRvciA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCB0JyA9XG4gICAgVHJlZTAubWVyZ2VfdG9fc2VxdWVuY2UgY29tcGFyYXRvciA/b3JkZXIgP2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2xlc3Nfb3JfZXF1YWxfdG8gdCB0J1xuICA7O1xuXG4gIGxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcblxuICBtb2R1bGUgTmFtZWQgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIFRyZWUwLk5hbWVkXG5cbiAgICBsZXQgaXNfc3Vic2V0IH5jb21wYXJhdG9yIHQxIH5vZl86dDIgPVxuICAgICAgVHJlZTAuTmFtZWQuaXNfc3Vic2V0XG4gICAgICAgIHQxXG4gICAgICAgIH5vZl86dDJcbiAgICAgICAgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICAgICAgICB+c2V4cF9vZl9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLnNleHBfb2ZfdFxuICAgIDs7XG5cbiAgICBsZXQgZXF1YWwgfmNvbXBhcmF0b3IgdDEgdDIgPVxuICAgICAgVHJlZTAuTmFtZWQuZXF1YWxcbiAgICAgICAgdDFcbiAgICAgICAgdDJcbiAgICAgICAgfmNvbXBhcmVfZWx0OihjZSBjb21wYXJhdG9yKVxuICAgICAgICB+c2V4cF9vZl9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLnNleHBfb2ZfdFxuICAgIDs7XG4gIGVuZFxuZW5kXG5cbm1vZHVsZSBVc2luZ19jb21wYXJhdG9yID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICgnZWx0LCAnY21wKSB0ID0gKCdlbHQsICdjbXApIHRcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCB0b190cmVlIHQgPSB0LnRyZWVcbiAgbGV0IG9mX3RyZWUgfmNvbXBhcmF0b3IgdHJlZSA9IHsgY29tcGFyYXRvcjsgdHJlZSB9XG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3IgYV9vZl9zZXhwIHNleHAgPVxuICAgIG9mX3RyZWVcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAudF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5jb21wYXJlIGFfb2Zfc2V4cCBzZXhwKVxuICA7O1xuXG4gIGxldCBlbXB0eSB+Y29tcGFyYXRvciA9IHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLmVtcHR5IH1cblxuICBtb2R1bGUgRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoRWx0IDogQ29tcGFyYXRvci5TMSkgPSBzdHJ1Y3RcbiAgICBsZXQgZW1wdHkgPSB7IGNvbXBhcmF0b3IgPSBFbHQuY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLmVtcHR5IH1cbiAgZW5kXG5cbiAgbGV0IHNpbmdsZXRvbiB+Y29tcGFyYXRvciBlID0geyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAuc2luZ2xldG9uIGUgfVxuXG4gIGxldCB1bmlvbl9saXN0IH5jb21wYXJhdG9yIGwgPVxuICAgIG9mX3RyZWUgfmNvbXBhcmF0b3IgKFRyZWUwLnVuaW9uX2xpc3QgfmNvbXBhcmF0b3IgfnRvX3RyZWUgbClcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgbGV0IHRyZWUgPVxuICAgICAgVHJlZTAub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIHsgY29tcGFyYXRvcjsgdHJlZSB9XG4gIDs7XG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yIH5sZW4gfmYgPVxuICAgIG9mX3RyZWUgfmNvbXBhcmF0b3IgKFRyZWUwLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYpXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSB+Y29tcGFyYXRvciBhcnJheSA9XG4gICAgT3JfZXJyb3IuTW9uYWRfaW5maXguKFxuICAgICAgVHJlZTAub2Zfc29ydGVkX2FycmF5IGFycmF5IH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgPj58IGZ1biB0cmVlIC0+IHsgY29tcGFyYXRvcjsgdHJlZSB9KVxuICA7O1xuXG4gIGxldCBvZl9saXN0IH5jb21wYXJhdG9yIGwgPVxuICAgIHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLm9mX2xpc3QgbCB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBzID1cbiAgICB7IGNvbXBhcmF0b3I7IHRyZWUgPSBUcmVlMC5vZl9zZXF1ZW5jZSBzIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB9XG4gIDs7XG5cbiAgbGV0IG9mX2FycmF5IH5jb21wYXJhdG9yIGEgPVxuICAgIHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLm9mX2FycmF5IGEgfmNvbXBhcmVfZWx0OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIH1cbiAgOztcblxuICBsZXQgc3RhYmxlX2RlZHVwX2xpc3QgfmNvbXBhcmF0b3IgeHMgPVxuICAgIFRyZWUwLnN0YWJsZV9kZWR1cF9saXN0IHhzIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBtYXAgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgeyBjb21wYXJhdG9yOyB0cmVlID0gVHJlZTAubWFwIHQudHJlZSB+ZiB+Y29tcGFyZV9lbHQ6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIHsgY29tcGFyYXRvclxuICAgIDsgdHJlZSA9IFRyZWUwLmZpbHRlcl9tYXAgdC50cmVlIH5mIH5jb21wYXJlX2VsdDpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIH1cbiAgOztcblxuICBtb2R1bGUgVHJlZSA9IFRyZWVcbmVuZFxuXG50eXBlICgnZWx0LCAnY21wKSBjb21wYXJhdG9yID1cbiAgKG1vZHVsZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgPSAnZWx0IGFuZCB0eXBlIGNvbXBhcmF0b3Jfd2l0bmVzcyA9ICdjbXApXG5cbmxldCBjb21wYXJhdG9yX3MgKHR5cGUgayBjbXApIHQgOiAoaywgY21wKSBjb21wYXJhdG9yID1cbiAgKG1vZHVsZSBzdHJ1Y3RcbiAgICB0eXBlIHQgPSBrXG4gICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBjbXBcblxuICAgIGxldCBjb21wYXJhdG9yID0gdC5jb21wYXJhdG9yXG4gIGVuZClcbjs7XG5cbmxldCB0b19jb21wYXJhdG9yICh0eXBlIGVsdCBjbXApICgobW9kdWxlIE0pIDogKGVsdCwgY21wKSBjb21wYXJhdG9yKSA9IE0uY29tcGFyYXRvclxubGV0IGVtcHR5IG0gPSBVc2luZ19jb21wYXJhdG9yLmVtcHR5IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pXG5sZXQgc2luZ2xldG9uIG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iuc2luZ2xldG9uIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCB1bmlvbl9saXN0IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3IudW5pb25fbGlzdCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5cbmxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIG0gYSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG47O1xuXG5sZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgbSB+bGVuIH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSB+bGVuIH5mXG47O1xuXG5sZXQgb2Zfc29ydGVkX2FycmF5IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9saXN0IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfbGlzdCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2Zfc2VxdWVuY2UgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2ZfYXJyYXkgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hcnJheSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5cbmxldCBzdGFibGVfZGVkdXBfbGlzdCBtIGEgPVxuICBVc2luZ19jb21wYXJhdG9yLnN0YWJsZV9kZWR1cF9saXN0IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbjs7XG5cbmxldCBtYXAgbSBhIH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXAgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYSB+ZlxubGV0IGZpbHRlcl9tYXAgbSBhIH5mID0gVXNpbmdfY29tcGFyYXRvci5maWx0ZXJfbWFwIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGEgfmZcblxubW9kdWxlIE0gKEVsdCA6IHNpZ1xuICAgIHR5cGUgdFxuICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzXG4gIGVuZCkgPVxuc3RydWN0XG4gIHR5cGUgbm9ucmVjIHQgPSAoRWx0LnQsIEVsdC5jb21wYXJhdG9yX3dpdG5lc3MpIHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBTZXhwX29mX20gPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgTV9vZl9zZXhwID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgb2Zfc2V4cF1cblxuICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICBbQEBAZW5kXVxuXG4gIGluY2x1ZGUgQ29tcGFyYXRvci5TIHdpdGggdHlwZSB0IDo9IHRcbmVuZFxuXG5tb2R1bGUgdHlwZSBNX3NleHBfZ3JhbW1hciA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICB2YWwgdF9zZXhwX2dyYW1tYXIgOiB0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBDb21wYXJlX20gPSBzaWcgZW5kXG5tb2R1bGUgdHlwZSBFcXVhbF9tID0gc2lnIGVuZFxubW9kdWxlIHR5cGUgSGFzaF9mb2xkX20gPSBIYXNoZXIuU1xuXG5sZXQgc2V4cF9vZl9tX190ICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSBlbHQpIHQgPVxuICBzZXhwX29mX3QgRWx0LnNleHBfb2ZfdCAoZnVuIF8gLT4gU2V4cC5BdG9tIFwiX1wiKSB0XG47O1xuXG5sZXQgbV9fdF9vZl9zZXhwXG4gICAgICAodHlwZSBlbHQgY21wKVxuICAgICAgKG1vZHVsZSBFbHQgOiBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSBlbHQgYW5kIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gY21wKVxuICAgICAgc2V4cFxuICA9XG4gIFVzaW5nX2NvbXBhcmF0b3IudF9vZl9zZXhwX2RpcmVjdCB+Y29tcGFyYXRvcjpFbHQuY29tcGFyYXRvciBFbHQudF9vZl9zZXhwIHNleHBcbjs7XG5cbmxldCBtX190X3NleHBfZ3JhbW1hciAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogTV9zZXhwX2dyYW1tYXIgd2l0aCB0eXBlIHQgPSBlbHQpXG4gIDogKGVsdCwgXykgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKGxpc3Rfc2V4cF9ncmFtbWFyIEVsdC50X3NleHBfZ3JhbW1hcilcbjs7XG5cbmxldCBjb21wYXJlX21fX3QgKG1vZHVsZSBfIDogQ29tcGFyZV9tKSB0MSB0MiA9IGNvbXBhcmVfZGlyZWN0IHQxIHQyXG5sZXQgZXF1YWxfbV9fdCAobW9kdWxlIF8gOiBFcXVhbF9tKSB0MSB0MiA9IGVxdWFsIHQxIHQyXG5cbmxldCBoYXNoX2ZvbGRfbV9fdCAodHlwZSBlbHQpIChtb2R1bGUgRWx0IDogSGFzaF9mb2xkX20gd2l0aCB0eXBlIHQgPSBlbHQpIHN0YXRlID1cbiAgaGFzaF9mb2xkX2RpcmVjdCBFbHQuaGFzaF9mb2xkX3Qgc3RhdGVcbjs7XG5cbmxldCBoYXNoX21fX3QgZm9sZGVyIHQgPVxuICBsZXQgc3RhdGUgPSBoYXNoX2ZvbGRfbV9fdCBmb2xkZXIgKEhhc2guY3JlYXRlICgpKSB0IGluXG4gIEhhc2guZ2V0X2hhc2hfdmFsdWUgc3RhdGVcbjs7XG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzc1xuICB0eXBlIG5vbnJlYyAoJ2VsdCwgJ2NtcCkgc2V0ID0gKCdlbHQsIGNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuICB0eXBlIG5vbnJlYyAnZWx0IHQgPSAoJ2VsdCwgY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gIHR5cGUgbm9ucmVjICdlbHQgdHJlZSA9ICgnZWx0LCBjb21wYXJhdG9yX3dpdG5lc3MpIHRyZWVcbiAgdHlwZSBub25yZWMgJ2VsdCBuYW1lZCA9ICgnZWx0LCBjb21wYXJhdG9yX3dpdG5lc3MpIE5hbWVkLnRcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCBjb21wYXJhdG9yID0gQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3JcblxuICBpbmNsdWRlIFVzaW5nX2NvbXBhcmF0b3IuRW1wdHlfd2l0aG91dF92YWx1ZV9yZXN0cmljdGlvbiAoQ29tcGFyYXRvci5Qb2x5KVxuXG4gIGxldCBzaW5nbGV0b24gYSA9IFVzaW5nX2NvbXBhcmF0b3Iuc2luZ2xldG9uIH5jb21wYXJhdG9yIGFcbiAgbGV0IHVuaW9uX2xpc3QgYSA9IFVzaW5nX2NvbXBhcmF0b3IudW5pb25fbGlzdCB+Y29tcGFyYXRvciBhXG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYSA9XG4gICAgVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGFcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiA9XG4gICAgVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCB+Y29tcGFyYXRvciB+bGVuIH5mXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYVxuICBsZXQgb2ZfbGlzdCBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9saXN0IH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX3NlcXVlbmNlIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FycmF5IGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FycmF5IH5jb21wYXJhdG9yIGFcbiAgbGV0IHN0YWJsZV9kZWR1cF9saXN0IGEgPSBVc2luZ19jb21wYXJhdG9yLnN0YWJsZV9kZWR1cF9saXN0IH5jb21wYXJhdG9yIGFcbiAgbGV0IG1hcCBhIH5mID0gVXNpbmdfY29tcGFyYXRvci5tYXAgfmNvbXBhcmF0b3IgYSB+ZlxuICBsZXQgZmlsdGVyX21hcCBhIH5mID0gVXNpbmdfY29tcGFyYXRvci5maWx0ZXJfbWFwIH5jb21wYXJhdG9yIGEgfmZcbiAgbGV0IG9mX3RyZWUgdHJlZSA9IHsgY29tcGFyYXRvcjsgdHJlZSB9XG4gIGxldCB0b190cmVlIHQgPSB0LnRyZWVcbmVuZFxuIiwib3BlbiEgSW1wb3J0XG5cbmluY2x1ZGUgKFxuc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIHJlZiBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSB0IC0+ICdhIHQgLT4gaW50ID0gY29tcGFyZV9yZWZcbiAgbGV0IGVxdWFsIDogJ2EuICgnYSAtPiAnYSAtPiBib29sKSAtPiAnYSB0IC0+ICdhIHQgLT4gYm9vbCA9IGVxdWFsX3JlZlxuICBsZXQgdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSB0ID0gcmVmX29mX3NleHBcbiAgbGV0IHNleHBfb2ZfdCA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSB0IC0+IFNleHBsaWIwLlNleHAudCA9IHNleHBfb2ZfcmVmXG5cbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiByZWZfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuZW5kIDpcbnNpZ1xuICB0eXBlICdhIHQgPSAnYSByZWYgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG4gIGluY2x1ZGUgUHB4X2NvbXBhcmVfbGliLkVxdWFsLlMxIHdpdGggdHlwZSAnYSB0IDo9ICdhIHRcbiAgaW5jbHVkZSBTZXhwbGliMC5TZXhwYWJsZS5TMSB3aXRoIHR5cGUgJ2EgdCA6PSAnYSB0XG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyIDogJ2EgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQgLT4gJ2EgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5lbmQpXG5cbigqIEluIHRoZSBkZWZpbml0aW9uIG9mIFt0XSwgd2UgZG8gbm90IGhhdmUgW1tAQGRlcml2aW5nIGNvbXBhcmUsIHNleHBdXSBiZWNhdXNlXG4gICBpbiBnZW5lcmFsLCBzeW50YXggZXh0ZW5zaW9ucyB0ZW5kIHRvIHVzZSB0aGUgaW1wbGVtZW50YXRpb24gd2hlbiBhdmFpbGFibGUgcmF0aGVyIHRoYW5cbiAgIHVzaW5nIHRoZSBhbGlhcy4gIEhlcmUgdGhhdCB3b3VsZCBsZWFkIHRvIHVzZSB0aGUgcmVjb3JkIHJlcHJlc2VudGF0aW9uIFsgeyBtdXRhYmxlXG4gICBjb250ZW50cyA6ICdhIH0gXSB3aGljaCB3b3VsZCByZXN1bHQgaW4gZGlmZmVyZW50IChhbmQgdW53YW50ZWQpIGJlaGF2aW9yLiAgKilcbnR5cGUgJ2EgdCA9ICdhIHJlZiA9IHsgbXV0YWJsZSBjb250ZW50cyA6ICdhIH1cblxuZXh0ZXJuYWwgY3JlYXRlIDogJ2EgLT4gJ2EgdCA9IFwiJW1ha2VtdXRhYmxlXCJcbmV4dGVybmFsICggISApIDogJ2EgdCAtPiAnYSA9IFwiJWZpZWxkMFwiXG5leHRlcm5hbCAoIDo9ICkgOiAnYSB0IC0+ICdhIC0+IHVuaXQgPSBcIiVzZXRmaWVsZDBcIlxuXG5sZXQgc3dhcCB0MSB0MiA9XG4gIGxldCB0bXAgPSAhdDEgaW5cbiAgdDEgOj0gIXQyO1xuICB0MiA6PSB0bXBcbjs7XG5cbmxldCByZXBsYWNlIHQgZiA9IHQgOj0gZiAhdFxuXG5sZXQgc2V0X3RlbXBvcmFyaWx5IHQgYSB+ZiA9XG4gIGxldCByZXN0b3JlX3RvID0gIXQgaW5cbiAgdCA6PSBhO1xuICBFeG4ucHJvdGVjdCB+ZiB+ZmluYWxseTooZnVuICgpIC0+IHQgOj0gcmVzdG9yZV90bylcbjs7XG5cbm1vZHVsZSBBbmRfdmFsdWUgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gVCA6ICdhIHJlZiAqICdhIC0+IHQgW0BAZGVyaXZpbmcgc2V4cF9vZl1cblxuICBsZXQgc2V0IChUIChyLCBhKSkgPSByIDo9IGFcbiAgbGV0IHNldHMgdHMgPSBMaXN0Lml0ZXIgdHMgfmY6c2V0XG4gIGxldCBzbmFwc2hvdCAoVCAociwgXykpID0gVCAociwgIXIpXG4gIGxldCBzbmFwc2hvdHMgdHMgPSBMaXN0Lm1hcCB0cyB+ZjpzbmFwc2hvdFxuZW5kXG5cbmxldCBzZXRzX3RlbXBvcmFyaWx5IGFuZF92YWx1ZXMgfmYgPVxuICBsZXQgcmVzdG9yZV90byA9IEFuZF92YWx1ZS5zbmFwc2hvdHMgYW5kX3ZhbHVlcyBpblxuICBBbmRfdmFsdWUuc2V0cyBhbmRfdmFsdWVzO1xuICBFeG4ucHJvdGVjdCB+ZiB+ZmluYWxseTooZnVuICgpIC0+IEFuZF92YWx1ZS5zZXRzIHJlc3RvcmVfdG8pXG47O1xuIiwib3BlbiEgSW1wb3J0XG5cblxuKCogW3RdIHN0b3JlcyB0aGUgW3QubGVuZ3RoXSBxdWV1ZSBlbGVtZW50cyBhdCBjb25zZWN1dGl2ZSBpbmNyZWFzaW5nIGluZGljZXMgb2YgW3QuZWx0c10sXG4gICBtb2QgdGhlIGNhcGFjaXR5IG9mIFt0XSwgd2hpY2ggaXMgW09wdGlvbl9hcnJheS5sZW5ndGggdC5lbHRzXS4gIFRoZSBjYXBhY2l0eSBpc1xuICAgcmVxdWlyZWQgdG8gYmUgYSBwb3dlciBvZiB0d28gKHVzZXItcmVxdWVzdGVkIGNhcGFjaXRpZXMgYXJlIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3RcbiAgIHBvd2VyKSwgc28gdGhhdCBtb2QgY2FuIHF1aWNrbHkgYmUgY29tcHV0ZWQgdXNpbmcgW2xhbmQgdC5tYXNrXSwgd2hlcmUgW3QubWFzayA9XG4gICBjYXBhY2l0eSB0IC0gMV0uICBTbywgcXVldWUgZWxlbWVudCBbaV0gaXMgYXQgW3QuZWx0cy4oICh0LmZyb250ICsgaSkgbGFuZCB0Lm1hc2sgKV0uXG5cbiAgIFtudW1fbXV0YXRpb25zXSBpcyB1c2VkIHRvIGRldGVjdCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4gKilcbnR5cGUgJ2EgdCA9XG4gIHsgbXV0YWJsZSBudW1fbXV0YXRpb25zIDogaW50XG4gIDsgbXV0YWJsZSBmcm9udCA6IGludFxuICA7IG11dGFibGUgbWFzayA6IGludFxuICA7IG11dGFibGUgbGVuZ3RoIDogaW50XG4gIDsgbXV0YWJsZSBlbHRzIDogJ2EgT3B0aW9uX2FycmF5LnRcbiAgfVxuW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbmxldCBzZXhwX29mX3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICBmdW4gX29mX2FfXzAwMV9cbiAgICB7IG51bV9tdXRhdGlvbnMgPSBudW1fbXV0YXRpb25zX18wMDNfXG4gICAgOyBmcm9udCA9IGZyb250X18wMDVfXG4gICAgOyBtYXNrID0gbWFza19fMDA3X1xuICAgIDsgbGVuZ3RoID0gbGVuZ3RoX18wMDlfXG4gICAgOyBlbHRzID0gZWx0c19fMDExX1xuICAgIH0gLT5cbiAgICBsZXQgYm5kc19fMDAyXyA9IFtdIGluXG4gICAgbGV0IGJuZHNfXzAwMl8gPVxuICAgICAgbGV0IGFyZ19fMDEyXyA9IE9wdGlvbl9hcnJheS5zZXhwX29mX3QgX29mX2FfXzAwMV8gZWx0c19fMDExXyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwiZWx0c1wiOyBhcmdfXzAxMl8gXSA6OiBibmRzX18wMDJfXG4gICAgaW5cbiAgICBsZXQgYm5kc19fMDAyXyA9XG4gICAgICBsZXQgYXJnX18wMTBfID0gc2V4cF9vZl9pbnQgbGVuZ3RoX18wMDlfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJsZW5ndGhcIjsgYXJnX18wMTBfIF0gOjogYm5kc19fMDAyX1xuICAgIGluXG4gICAgbGV0IGJuZHNfXzAwMl8gPVxuICAgICAgbGV0IGFyZ19fMDA4XyA9IHNleHBfb2ZfaW50IG1hc2tfXzAwN18gaW5cbiAgICAgIFNleHBsaWIwLlNleHAuTGlzdCBbIFNleHBsaWIwLlNleHAuQXRvbSBcIm1hc2tcIjsgYXJnX18wMDhfIF0gOjogYm5kc19fMDAyX1xuICAgIGluXG4gICAgbGV0IGJuZHNfXzAwMl8gPVxuICAgICAgbGV0IGFyZ19fMDA2XyA9IHNleHBfb2ZfaW50IGZyb250X18wMDVfIGluXG4gICAgICBTZXhwbGliMC5TZXhwLkxpc3QgWyBTZXhwbGliMC5TZXhwLkF0b20gXCJmcm9udFwiOyBhcmdfXzAwNl8gXSA6OiBibmRzX18wMDJfXG4gICAgaW5cbiAgICBsZXQgYm5kc19fMDAyXyA9XG4gICAgICBsZXQgYXJnX18wMDRfID0gc2V4cF9vZl9pbnQgbnVtX211dGF0aW9uc19fMDAzXyBpblxuICAgICAgU2V4cGxpYjAuU2V4cC5MaXN0IFsgU2V4cGxpYjAuU2V4cC5BdG9tIFwibnVtX211dGF0aW9uc1wiOyBhcmdfXzAwNF8gXSA6OiBibmRzX18wMDJfXG4gICAgaW5cbiAgICBTZXhwbGliMC5TZXhwLkxpc3QgYm5kc19fMDAyX1xuOztcblxuW0BAQGVuZF1cblxubW9kdWxlIHR5cGUgUyA9IFF1ZXVlX2ludGYuU1xuXG5sZXQgaW5jX251bV9tdXRhdGlvbnMgdCA9IHQubnVtX211dGF0aW9ucyA8LSB0Lm51bV9tdXRhdGlvbnMgKyAxXG5sZXQgY2FwYWNpdHkgdCA9IHQubWFzayArIDFcbmxldCBlbHRzX2luZGV4IHQgaSA9ICh0LmZyb250ICsgaSkgbGFuZCB0Lm1hc2tcbmxldCB1bnNhZmVfZ2V0IHQgaSA9IE9wdGlvbl9hcnJheS51bnNhZmVfZ2V0X3NvbWVfZXhuIHQuZWx0cyAoZWx0c19pbmRleCB0IGkpXG5sZXQgdW5zYWZlX2lzX3NldCB0IGkgPSBPcHRpb25fYXJyYXkudW5zYWZlX2lzX3NvbWUgdC5lbHRzIChlbHRzX2luZGV4IHQgaSlcbmxldCB1bnNhZmVfc2V0IHQgaSBhID0gT3B0aW9uX2FycmF5LnVuc2FmZV9zZXRfc29tZSB0LmVsdHMgKGVsdHNfaW5kZXggdCBpKSBhXG5sZXQgdW5zYWZlX3Vuc2V0IHQgaSA9IE9wdGlvbl9hcnJheS51bnNhZmVfc2V0X25vbmUgdC5lbHRzIChlbHRzX2luZGV4IHQgaSlcblxubGV0IGNoZWNrX2luZGV4X2V4biB0IGkgPVxuICBpZiBpIDwgMCB8fCBpID49IHQubGVuZ3RoXG4gIHRoZW5cbiAgICBFcnJvci5yYWlzZV9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcIlF1ZXVlIGluZGV4IG91dCBvZiBib3VuZHNcIlxuICAgICAgICAgWyBcImluZGV4XCIsIGkgfD4gSW50LnNleHBfb2ZfdDsgXCJsZW5ndGhcIiwgdC5sZW5ndGggfD4gSW50LnNleHBfb2ZfdCBdKVxuOztcblxubGV0IGdldCB0IGkgPVxuICBjaGVja19pbmRleF9leG4gdCBpO1xuICB1bnNhZmVfZ2V0IHQgaVxuOztcblxubGV0IHNldCB0IGkgYSA9XG4gIGNoZWNrX2luZGV4X2V4biB0IGk7XG4gIGluY19udW1fbXV0YXRpb25zIHQ7XG4gIHVuc2FmZV9zZXQgdCBpIGFcbjs7XG5cbmxldCBpc19lbXB0eSB0ID0gdC5sZW5ndGggPSAwXG5sZXQgbGVuZ3RoIHsgbGVuZ3RoOyBfIH0gPSBsZW5ndGhcblxubGV0IGVuc3VyZV9ub19tdXRhdGlvbiB0IG51bV9tdXRhdGlvbnMgPVxuICBpZiB0Lm51bV9tdXRhdGlvbnMgPD4gbnVtX211dGF0aW9uc1xuICB0aGVuXG4gICAgRXJyb3IucmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJtdXRhdGlvbiBvZiBxdWV1ZSBkdXJpbmcgaXRlcmF0aW9uXCJcbiAgICAgICAgIFsgXCJcIiwgdCB8PiBzZXhwX29mX3QgKGZ1biBfIC0+IFNleHAuQXRvbSBcIl9cIikgXSlcbjs7XG5cbmxldCBjb21wYXJlID1cbiAgbGV0IHJlYyB1bnNhZmVfY29tcGFyZV9mcm9tIGNvbXBhcmVfZWx0IHBvcyB+dDEgfnQyIH5sZW4xIH5sZW4yIH5tdXQxIH5tdXQyID1cbiAgICBtYXRjaCBwb3MgPSBsZW4xLCBwb3MgPSBsZW4yIHdpdGhcbiAgICB8IHRydWUsIHRydWUgLT4gMFxuICAgIHwgdHJ1ZSwgZmFsc2UgLT4gLTFcbiAgICB8IGZhbHNlLCB0cnVlIC0+IDFcbiAgICB8IGZhbHNlLCBmYWxzZSAtPlxuICAgICAgbGV0IHggPSBjb21wYXJlX2VsdCAodW5zYWZlX2dldCB0MSBwb3MpICh1bnNhZmVfZ2V0IHQyIHBvcykgaW5cbiAgICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0MSBtdXQxO1xuICAgICAgZW5zdXJlX25vX211dGF0aW9uIHQyIG11dDI7XG4gICAgICAobWF0Y2ggeCB3aXRoXG4gICAgICAgfCAwIC0+IHVuc2FmZV9jb21wYXJlX2Zyb20gY29tcGFyZV9lbHQgKHBvcyArIDEpIH50MSB+dDIgfmxlbjEgfmxlbjIgfm11dDEgfm11dDJcbiAgICAgICB8IG4gLT4gbilcbiAgaW5cbiAgZnVuIGNvbXBhcmVfZWx0IHQxIHQyIC0+XG4gICAgaWYgcGh5c19lcXVhbCB0MSB0MlxuICAgIHRoZW4gMFxuICAgIGVsc2VcbiAgICAgIHVuc2FmZV9jb21wYXJlX2Zyb21cbiAgICAgICAgY29tcGFyZV9lbHRcbiAgICAgICAgMFxuICAgICAgICB+dDFcbiAgICAgICAgfnQyXG4gICAgICAgIH5sZW4xOnQxLmxlbmd0aFxuICAgICAgICB+bGVuMjp0Mi5sZW5ndGhcbiAgICAgICAgfm11dDE6dDEubnVtX211dGF0aW9uc1xuICAgICAgICB+bXV0Mjp0Mi5udW1fbXV0YXRpb25zXG47O1xuXG5sZXQgZXF1YWwgPVxuICBsZXQgcmVjIHVuc2FmZV9lcXVhbF9mcm9tIGVxdWFsX2VsdCBwb3MgfnQxIH50MiB+bXV0MSB+bXV0MiB+bGVuID1cbiAgICBwb3MgPSBsZW5cbiAgICB8fFxuICAgIGxldCBiID0gZXF1YWxfZWx0ICh1bnNhZmVfZ2V0IHQxIHBvcykgKHVuc2FmZV9nZXQgdDIgcG9zKSBpblxuICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0MSBtdXQxO1xuICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0MiBtdXQyO1xuICAgIGIgJiYgdW5zYWZlX2VxdWFsX2Zyb20gZXF1YWxfZWx0IChwb3MgKyAxKSB+dDEgfnQyIH5tdXQxIH5tdXQyIH5sZW5cbiAgaW5cbiAgZnVuIGVxdWFsX2VsdCB0MSB0MiAtPlxuICAgIHBoeXNfZXF1YWwgdDEgdDJcbiAgICB8fFxuICAgIGxldCBsZW4xID0gdDEubGVuZ3RoIGluXG4gICAgbGV0IGxlbjIgPSB0Mi5sZW5ndGggaW5cbiAgICBsZW4xID0gbGVuMlxuICAgICYmIHVuc2FmZV9lcXVhbF9mcm9tXG4gICAgICAgICBlcXVhbF9lbHRcbiAgICAgICAgIDBcbiAgICAgICAgIH50MVxuICAgICAgICAgfnQyXG4gICAgICAgICB+bGVuOmxlbjFcbiAgICAgICAgIH5tdXQxOnQxLm51bV9tdXRhdGlvbnNcbiAgICAgICAgIH5tdXQyOnQyLm51bV9tdXRhdGlvbnNcbjs7XG5cbmxldCBpbnZhcmlhbnQgaW52YXJpYW50X2EgdCA9XG4gIGxldCB7IG51bV9tdXRhdGlvbnM7IG1hc2sgPSBfOyBlbHRzOyBmcm9udDsgbGVuZ3RoIH0gPSB0IGluXG4gIGFzc2VydCAoZnJvbnQgPj0gMCk7XG4gIGFzc2VydCAoZnJvbnQgPCBjYXBhY2l0eSB0KTtcbiAgbGV0IGNhcGFjaXR5ID0gY2FwYWNpdHkgdCBpblxuICBhc3NlcnQgKGNhcGFjaXR5ID0gT3B0aW9uX2FycmF5Lmxlbmd0aCBlbHRzKTtcbiAgYXNzZXJ0IChjYXBhY2l0eSA+PSAxKTtcbiAgYXNzZXJ0IChJbnQuaXNfcG93MiBjYXBhY2l0eSk7XG4gIGFzc2VydCAobGVuZ3RoID49IDApO1xuICBhc3NlcnQgKGxlbmd0aCA8PSBjYXBhY2l0eSk7XG4gIGZvciBpID0gMCB0byBjYXBhY2l0eSAtIDEgZG9cbiAgICBpZiBpIDwgdC5sZW5ndGhcbiAgICB0aGVuIChcbiAgICAgIGludmFyaWFudF9hICh1bnNhZmVfZ2V0IHQgaSk7XG4gICAgICBlbnN1cmVfbm9fbXV0YXRpb24gdCBudW1fbXV0YXRpb25zKVxuICAgIGVsc2UgYXNzZXJ0IChub3QgKHVuc2FmZV9pc19zZXQgdCBpKSlcbiAgZG9uZVxuOztcblxubGV0IGNyZWF0ZSAodHlwZSBhKSA/Y2FwYWNpdHkgKCkgOiBhIHQgPVxuICBsZXQgY2FwYWNpdHkgPVxuICAgIG1hdGNoIGNhcGFjaXR5IHdpdGhcbiAgICB8IE5vbmUgLT4gMVxuICAgIHwgU29tZSBjYXBhY2l0eSAtPlxuICAgICAgaWYgY2FwYWNpdHkgPCAwXG4gICAgICB0aGVuXG4gICAgICAgIEVycm9yLnJhaXNlX3NcbiAgICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgICAgXCJjYW5ub3QgaGF2ZSBxdWV1ZSB3aXRoIG5lZ2F0aXZlIGNhcGFjaXR5XCJcbiAgICAgICAgICAgICBbIFwiY2FwYWNpdHlcIiwgY2FwYWNpdHkgfD4gSW50LnNleHBfb2ZfdCBdKVxuICAgICAgZWxzZSBpZiBjYXBhY2l0eSA9IDBcbiAgICAgIHRoZW4gMVxuICAgICAgZWxzZSBJbnQuY2VpbF9wb3cyIGNhcGFjaXR5XG4gIGluXG4gIHsgbnVtX211dGF0aW9ucyA9IDBcbiAgOyBmcm9udCA9IDBcbiAgOyBtYXNrID0gY2FwYWNpdHkgLSAxXG4gIDsgbGVuZ3RoID0gMFxuICA7IGVsdHMgPSBPcHRpb25fYXJyYXkuY3JlYXRlIH5sZW46Y2FwYWNpdHlcbiAgfVxuOztcblxubGV0IGJsaXRfdG9fYXJyYXkgfnNyYyBkc3QgPVxuICBhc3NlcnQgKHNyYy5sZW5ndGggPD0gT3B0aW9uX2FycmF5Lmxlbmd0aCBkc3QpO1xuICBsZXQgZnJvbnRfbGVuID0gSW50Lm1pbiBzcmMubGVuZ3RoIChjYXBhY2l0eSBzcmMgLSBzcmMuZnJvbnQpIGluXG4gIGxldCByZXN0X2xlbiA9IHNyYy5sZW5ndGggLSBmcm9udF9sZW4gaW5cbiAgT3B0aW9uX2FycmF5LmJsaXQgfmxlbjpmcm9udF9sZW4gfnNyYzpzcmMuZWx0cyB+c3JjX3BvczpzcmMuZnJvbnQgfmRzdCB+ZHN0X3BvczowO1xuICBPcHRpb25fYXJyYXkuYmxpdCB+bGVuOnJlc3RfbGVuIH5zcmM6c3JjLmVsdHMgfnNyY19wb3M6MCB+ZHN0IH5kc3RfcG9zOmZyb250X2xlblxuOztcblxubGV0IHNldF9jYXBhY2l0eSB0IGRlc2lyZWRfY2FwYWNpdHkgPVxuICAoKiBXZSBhbGxvdyBhcmd1bWVudHMgbGVzcyB0aGFuIDEgdG8gW3NldF9jYXBhY2l0eV0sIGJ1dCB0cmFuc2xhdGUgdGhlbSB0byAxIHRvIHNpbXBsaWZ5XG4gICAgIHRoZSBjb2RlIHRoYXQgcmVsaWVzIG9uIHRoZSBhcnJheSBsZW5ndGggYmVpbmcgYSBwb3dlciBvZiAyLiAqKVxuICBpbmNfbnVtX211dGF0aW9ucyB0O1xuICBsZXQgbmV3X2NhcGFjaXR5ID0gSW50LmNlaWxfcG93MiAobWF4IDEgKG1heCBkZXNpcmVkX2NhcGFjaXR5IHQubGVuZ3RoKSkgaW5cbiAgaWYgbmV3X2NhcGFjaXR5IDw+IGNhcGFjaXR5IHRcbiAgdGhlbiAoXG4gICAgbGV0IGRzdCA9IE9wdGlvbl9hcnJheS5jcmVhdGUgfmxlbjpuZXdfY2FwYWNpdHkgaW5cbiAgICBibGl0X3RvX2FycmF5IH5zcmM6dCBkc3Q7XG4gICAgdC5mcm9udCA8LSAwO1xuICAgIHQubWFzayA8LSBuZXdfY2FwYWNpdHkgLSAxO1xuICAgIHQuZWx0cyA8LSBkc3QpXG47O1xuXG5sZXQgZW5xdWV1ZSB0IGEgPVxuICBpbmNfbnVtX211dGF0aW9ucyB0O1xuICBpZiB0Lmxlbmd0aCA9IGNhcGFjaXR5IHQgdGhlbiBzZXRfY2FwYWNpdHkgdCAoMiAqIHQubGVuZ3RoKTtcbiAgdW5zYWZlX3NldCB0IHQubGVuZ3RoIGE7XG4gIHQubGVuZ3RoIDwtIHQubGVuZ3RoICsgMVxuOztcblxubGV0IGRlcXVldWVfbm9uZW1wdHkgdCA9XG4gIGluY19udW1fbXV0YXRpb25zIHQ7XG4gIGxldCBlbHRzID0gdC5lbHRzIGluXG4gIGxldCBmcm9udCA9IHQuZnJvbnQgaW5cbiAgbGV0IHJlcyA9IE9wdGlvbl9hcnJheS5nZXRfc29tZV9leG4gZWx0cyBmcm9udCBpblxuICBPcHRpb25fYXJyYXkuc2V0X25vbmUgZWx0cyBmcm9udDtcbiAgdC5mcm9udCA8LSBlbHRzX2luZGV4IHQgMTtcbiAgdC5sZW5ndGggPC0gdC5sZW5ndGggLSAxO1xuICByZXNcbjs7XG5cbmxldCBkZXF1ZXVlX2V4biB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIHJhaXNlIENhbWwuUXVldWUuRW1wdHkgZWxzZSBkZXF1ZXVlX25vbmVtcHR5IHRcbmxldCBkZXF1ZXVlIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGRlcXVldWVfbm9uZW1wdHkgdClcbmxldCBmcm9udF9ub25lbXB0eSB0ID0gT3B0aW9uX2FycmF5LnVuc2FmZV9nZXRfc29tZV9leG4gdC5lbHRzIHQuZnJvbnRcbmxldCBsYXN0X25vbmVtcHR5IHQgPSB1bnNhZmVfZ2V0IHQgKHQubGVuZ3RoIC0gMSlcbmxldCBwZWVrIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKGZyb250X25vbmVtcHR5IHQpXG5sZXQgcGVla19leG4gdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiByYWlzZSBDYW1sLlF1ZXVlLkVtcHR5IGVsc2UgZnJvbnRfbm9uZW1wdHkgdFxubGV0IGxhc3QgdCA9IGlmIGlzX2VtcHR5IHQgdGhlbiBOb25lIGVsc2UgU29tZSAobGFzdF9ub25lbXB0eSB0KVxubGV0IGxhc3RfZXhuIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gcmFpc2UgQ2FtbC5RdWV1ZS5FbXB0eSBlbHNlIGxhc3Rfbm9uZW1wdHkgdFxuXG5sZXQgY2xlYXIgdCA9XG4gIGluY19udW1fbXV0YXRpb25zIHQ7XG4gIGlmIHQubGVuZ3RoID4gMFxuICB0aGVuIChcbiAgICBmb3IgaSA9IDAgdG8gdC5sZW5ndGggLSAxIGRvXG4gICAgICB1bnNhZmVfdW5zZXQgdCBpXG4gICAgZG9uZTtcbiAgICB0Lmxlbmd0aCA8LSAwO1xuICAgIHQuZnJvbnQgPC0gMClcbjs7XG5cbmxldCBibGl0X3RyYW5zZmVyIH5zcmMgfmRzdCA/bGVuICgpID1cbiAgaW5jX251bV9tdXRhdGlvbnMgc3JjO1xuICBpbmNfbnVtX211dGF0aW9ucyBkc3Q7XG4gIGxldCBsZW4gPVxuICAgIG1hdGNoIGxlbiB3aXRoXG4gICAgfCBOb25lIC0+IHNyYy5sZW5ndGhcbiAgICB8IFNvbWUgbGVuIC0+XG4gICAgICBpZiBsZW4gPCAwXG4gICAgICB0aGVuXG4gICAgICAgIEVycm9yLnJhaXNlX3NcbiAgICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgICAgXCJRdWV1ZS5ibGl0X3RyYW5zZmVyOiBuZWdhdGl2ZSBsZW5ndGhcIlxuICAgICAgICAgICAgIFsgXCJsZW5ndGhcIiwgbGVuIHw+IEludC5zZXhwX29mX3QgXSk7XG4gICAgICBtaW4gbGVuIHNyYy5sZW5ndGhcbiAgaW5cbiAgaWYgbGVuID4gMFxuICB0aGVuIChcbiAgICBzZXRfY2FwYWNpdHkgZHN0IChtYXggKGNhcGFjaXR5IGRzdCkgKGRzdC5sZW5ndGggKyBsZW4pKTtcbiAgICBsZXQgZHN0X3N0YXJ0ID0gZHN0LmZyb250ICsgZHN0Lmxlbmd0aCBpblxuICAgIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgICAoKiBUaGlzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gc2ltcGx5IFtlbnF1ZXVlIGRzdCAoZGVxdWV1ZV9ub25lbXB0eSBzcmMpXSAqKVxuICAgICAgbGV0IHNyY19pID0gKHNyYy5mcm9udCArIGkpIGxhbmQgc3JjLm1hc2sgaW5cbiAgICAgIGxldCBkc3RfaSA9IChkc3Rfc3RhcnQgKyBpKSBsYW5kIGRzdC5tYXNrIGluXG4gICAgICBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9zb21lXG4gICAgICAgIGRzdC5lbHRzXG4gICAgICAgIGRzdF9pXG4gICAgICAgIChPcHRpb25fYXJyYXkudW5zYWZlX2dldF9zb21lX2V4biBzcmMuZWx0cyBzcmNfaSk7XG4gICAgICBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9ub25lIHNyYy5lbHRzIHNyY19pXG4gICAgZG9uZTtcbiAgICBkc3QubGVuZ3RoIDwtIGRzdC5sZW5ndGggKyBsZW47XG4gICAgc3JjLmZyb250IDwtIChzcmMuZnJvbnQgKyBsZW4pIGxhbmQgc3JjLm1hc2s7XG4gICAgc3JjLmxlbmd0aCA8LSBzcmMubGVuZ3RoIC0gbGVuKVxuOztcblxubGV0IGVucXVldWVfYWxsIHQgbCA9XG4gICgqIFRyYXZlcnNpbmcgdGhlIGxpc3QgdXAgZnJvbnQgdG8gY29tcHV0ZSBpdHMgbGVuZ3RoIGlzIHByb2JhYmx5IChidXQgbm90IGRlZmluaXRlbHkpXG4gICAgIGJldHRlciB0aGFuIGRvdWJsaW5nIHRoZSB1bmRlcmx5aW5nIGFycmF5IHNpemUgc2V2ZXJhbCB0aW1lcyBmb3IgbGFyZ2UgcXVldWVzLiAqKVxuICBzZXRfY2FwYWNpdHkgdCAoSW50Lm1heCAoY2FwYWNpdHkgdCkgKHQubGVuZ3RoICsgTGlzdC5sZW5ndGggbCkpO1xuICBMaXN0Lml0ZXIgbCB+ZjooZnVuIHggLT4gZW5xdWV1ZSB0IHgpXG47O1xuXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgaWYgdC5sZW5ndGggPSAwXG4gIHRoZW4gaW5pdFxuICBlbHNlIChcbiAgICBsZXQgbnVtX211dGF0aW9ucyA9IHQubnVtX211dGF0aW9ucyBpblxuICAgIGxldCByID0gcmVmIGluaXQgaW5cbiAgICBmb3IgaSA9IDAgdG8gdC5sZW5ndGggLSAxIGRvXG4gICAgICByIDo9IGYgIXIgKHVuc2FmZV9nZXQgdCBpKTtcbiAgICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0IG51bV9tdXRhdGlvbnNcbiAgICBkb25lO1xuICAgICFyKVxuOztcblxubGV0IGZvbGRpIHQgfmluaXQgfmYgPVxuICBsZXQgaSA9IHJlZiAwIGluXG4gIGZvbGQgdCB+aW5pdCB+ZjooZnVuIGFjYyBhIC0+XG4gICAgbGV0IGFjYyA9IGYgIWkgYWNjIGEgaW5cbiAgICBpIDo9ICFpICsgMTtcbiAgICBhY2MpXG47O1xuXG5cbigqIFtpdGVyXSBpcyBpbXBsZW1lbnRlZCBkaXJlY3RseSBiZWNhdXNlIGltcGxlbWVudGluZyBpdCBpbiB0ZXJtcyBvZiBbZm9sZF0gaXNcbiAgIHNsb3dlci4gKilcbmxldCBpdGVyIHQgfmYgPVxuICBsZXQgbnVtX211dGF0aW9ucyA9IHQubnVtX211dGF0aW9ucyBpblxuICBmb3IgaSA9IDAgdG8gdC5sZW5ndGggLSAxIGRvXG4gICAgZiAodW5zYWZlX2dldCB0IGkpO1xuICAgIGVuc3VyZV9ub19tdXRhdGlvbiB0IG51bV9tdXRhdGlvbnNcbiAgZG9uZVxuOztcblxubGV0IGl0ZXJpIHQgfmYgPVxuICBsZXQgbnVtX211dGF0aW9ucyA9IHQubnVtX211dGF0aW9ucyBpblxuICBmb3IgaSA9IDAgdG8gdC5sZW5ndGggLSAxIGRvXG4gICAgZiBpICh1bnNhZmVfZ2V0IHQgaSk7XG4gICAgZW5zdXJlX25vX211dGF0aW9uIHQgbnVtX211dGF0aW9uc1xuICBkb25lXG47O1xuXG5sZXQgdG9fbGlzdCB0ID1cbiAgbGV0IHJlc3VsdCA9IHJlZiBbXSBpblxuICBmb3IgaSA9IHQubGVuZ3RoIC0gMSBkb3dudG8gMCBkb1xuICAgIHJlc3VsdCA6PSB1bnNhZmVfZ2V0IHQgaSA6OiAhcmVzdWx0XG4gIGRvbmU7XG4gICFyZXN1bHRcbjs7XG5cbm1vZHVsZSBDID0gSW5kZXhlZF9jb250YWluZXIuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBmb2xkID0gZm9sZFxuICAgIGxldCBpdGVyID0gYEN1c3RvbSBpdGVyXG4gICAgbGV0IGxlbmd0aCA9IGBDdXN0b20gbGVuZ3RoXG4gICAgbGV0IGZvbGRpID0gYEN1c3RvbSBmb2xkaVxuICAgIGxldCBpdGVyaSA9IGBDdXN0b20gaXRlcmlcbiAgZW5kKVxuXG5sZXQgY291bnQgPSBDLmNvdW50XG5sZXQgZXhpc3RzID0gQy5leGlzdHNcbmxldCBmaW5kID0gQy5maW5kXG5sZXQgZmluZF9tYXAgPSBDLmZpbmRfbWFwXG5sZXQgZm9sZF9yZXN1bHQgPSBDLmZvbGRfcmVzdWx0XG5sZXQgZm9sZF91bnRpbCA9IEMuZm9sZF91bnRpbFxubGV0IGZvcl9hbGwgPSBDLmZvcl9hbGxcbmxldCBtYXhfZWx0ID0gQy5tYXhfZWx0XG5sZXQgbWVtID0gQy5tZW1cbmxldCBtaW5fZWx0ID0gQy5taW5fZWx0XG5sZXQgc3VtID0gQy5zdW1cbmxldCBjb3VudGkgPSBDLmNvdW50aVxubGV0IGV4aXN0c2kgPSBDLmV4aXN0c2lcbmxldCBmaW5kX21hcGkgPSBDLmZpbmRfbWFwaVxubGV0IGZpbmRpID0gQy5maW5kaVxubGV0IGZvcl9hbGxpID0gQy5mb3JfYWxsaVxuXG5cbigqIEZvciBbY29uY2F0X21hcF0sIFtmaWx0ZXJfbWFwXSwgYW5kIFtmaWx0ZXJdLCB3ZSBkb24ndCBjcmVhdGUgW3RfcmVzdWx0XSB3aXRoIFt0XSdzXG4gICBjYXBhY2l0eSBiZWNhdXNlIHdlIGhhdmUgbm8gaWRlYSBob3cgbWFueSBlbGVtZW50cyBbdF9yZXN1bHRdIHdpbGwgdWx0aW1hdGVseSBob2xkLiAqKVxubGV0IGNvbmNhdF9tYXAgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+IExpc3QuaXRlciAoZiBhKSB+ZjooZnVuIGIgLT4gZW5xdWV1ZSB0X3Jlc3VsdCBiKSk7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgY29uY2F0X21hcGkgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyaSB0IH5mOihmdW4gaSBhIC0+IExpc3QuaXRlciAoZiBpIGEpIH5mOihmdW4gYiAtPiBlbnF1ZXVlIHRfcmVzdWx0IGIpKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBmaWx0ZXJfbWFwIHQgfmYgPVxuICBsZXQgdF9yZXN1bHQgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPlxuICAgIG1hdGNoIGYgYSB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIGIgLT4gZW5xdWV1ZSB0X3Jlc3VsdCBiKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBmaWx0ZXJfbWFwaSB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT5cbiAgICBtYXRjaCBmIGkgYSB3aXRoXG4gICAgfCBOb25lIC0+ICgpXG4gICAgfCBTb21lIGIgLT4gZW5xdWV1ZSB0X3Jlc3VsdCBiKTtcbiAgdF9yZXN1bHRcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9XG4gIGxldCB0X3Jlc3VsdCA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+IGlmIGYgYSB0aGVuIGVucXVldWUgdF9yZXN1bHQgYSk7XG4gIHRfcmVzdWx0XG47O1xuXG5sZXQgZmlsdGVyaSB0IH5mID1cbiAgbGV0IHRfcmVzdWx0ID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT4gaWYgZiBpIGEgdGhlbiBlbnF1ZXVlIHRfcmVzdWx0IGEpO1xuICB0X3Jlc3VsdFxuOztcblxubGV0IGZpbHRlcl9pbnBsYWNlIHQgfmYgPVxuICBsZXQgdDIgPSBmaWx0ZXIgdCB+ZiBpblxuICBjbGVhciB0O1xuICBibGl0X3RyYW5zZmVyIH5zcmM6dDIgfmRzdDp0ICgpXG47O1xuXG5sZXQgZmlsdGVyaV9pbnBsYWNlIHQgfmYgPVxuICBsZXQgdDIgPSBmaWx0ZXJpIHQgfmYgaW5cbiAgY2xlYXIgdDtcbiAgYmxpdF90cmFuc2ZlciB+c3JjOnQyIH5kc3Q6dCAoKVxuOztcblxubGV0IGNvcHkgc3JjID1cbiAgbGV0IGRzdCA9IGNyZWF0ZSB+Y2FwYWNpdHk6c3JjLmxlbmd0aCAoKSBpblxuICBibGl0X3RvX2FycmF5IH5zcmMgZHN0LmVsdHM7XG4gIGRzdC5sZW5ndGggPC0gc3JjLmxlbmd0aDtcbiAgZHN0XG47O1xuXG5sZXQgb2ZfbGlzdCBsID1cbiAgKCogVHJhdmVyc2luZyB0aGUgbGlzdCB1cCBmcm9udCB0byBjb21wdXRlIGl0cyBsZW5ndGggaXMgcHJvYmFibHkgKGJ1dCBub3QgZGVmaW5pdGVseSlcbiAgICAgYmV0dGVyIHRoYW4gZG91YmxpbmcgdGhlIHVuZGVybHlpbmcgYXJyYXkgc2l6ZSBzZXZlcmFsIHRpbWVzIGZvciBsYXJnZSBxdWV1ZXMuICopXG4gIGxldCB0ID0gY3JlYXRlIH5jYXBhY2l0eTooTGlzdC5sZW5ndGggbCkgKCkgaW5cbiAgTGlzdC5pdGVyIGwgfmY6KGZ1biB4IC0+IGVucXVldWUgdCB4KTtcbiAgdFxuOztcblxuKCogVGhlIHF1ZXVlIFt0XSByZXR1cm5lZCBieSBbY3JlYXRlXSB3aWxsIGhhdmUgW3QubGVuZ3RoID0gMF0sIFt0LmZyb250ID0gMF0sIGFuZFxuICAgW2NhcGFjaXR5IHQgPSBJbnQuY2VpbF9wb3cyIGxlbl0uICBTbywgd2Ugb25seSBoYXZlIHRvIHNldCBbdC5sZW5ndGhdIHRvIFtsZW5dIGFmdGVyXG4gICB0aGUgYmxpdCB0byBtYWludGFpbiBhbGwgdGhlIGludmFyaWFudHM6IFt0Lmxlbmd0aF0gaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50c1xuICAgaW4gdGhlIHF1ZXVlLCBbdC5mcm9udF0gaXMgdGhlIGFycmF5IGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBxdWV1ZSwgYW5kXG4gICBbY2FwYWNpdHkgdCA9IE9wdGlvbl9hcnJheS5sZW5ndGggdC5lbHRzXS4gKilcbmxldCBpbml0IGxlbiB+ZiA9XG4gIGlmIGxlbiA8IDBcbiAgdGhlblxuICAgIEVycm9yLnJhaXNlX3NcbiAgICAgIChTZXhwLm1lc3NhZ2UgXCJRdWV1ZS5pbml0OiBuZWdhdGl2ZSBsZW5ndGhcIiBbIFwibGVuZ3RoXCIsIGxlbiB8PiBJbnQuc2V4cF9vZl90IF0pO1xuICBsZXQgdCA9IGNyZWF0ZSB+Y2FwYWNpdHk6bGVuICgpIGluXG4gIGFzc2VydCAoT3B0aW9uX2FycmF5Lmxlbmd0aCB0LmVsdHMgPj0gbGVuKTtcbiAgZm9yIGkgPSAwIHRvIGxlbiAtIDEgZG9cbiAgICBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9zb21lIHQuZWx0cyBpIChmIGkpXG4gIGRvbmU7XG4gIHQubGVuZ3RoIDwtIGxlbjtcbiAgdFxuOztcblxubGV0IG9mX2FycmF5IGEgPSBpbml0IChBcnJheS5sZW5ndGggYSkgfmY6KEFycmF5LnVuc2FmZV9nZXQgYSlcbmxldCB0b19hcnJheSB0ID0gQXJyYXkuaW5pdCB0Lmxlbmd0aCB+ZjooZnVuIGkgLT4gdW5zYWZlX2dldCB0IGkpXG5cbmxldCBtYXAgdGEgfmYgPVxuICBsZXQgbnVtX211dGF0aW9ucyA9IHRhLm51bV9tdXRhdGlvbnMgaW5cbiAgbGV0IHRiID0gY3JlYXRlIH5jYXBhY2l0eTp0YS5sZW5ndGggKCkgaW5cbiAgdGIubGVuZ3RoIDwtIHRhLmxlbmd0aDtcbiAgZm9yIGkgPSAwIHRvIHRhLmxlbmd0aCAtIDEgZG9cbiAgICBsZXQgYiA9IGYgKHVuc2FmZV9nZXQgdGEgaSkgaW5cbiAgICBlbnN1cmVfbm9fbXV0YXRpb24gdGEgbnVtX211dGF0aW9ucztcbiAgICBPcHRpb25fYXJyYXkudW5zYWZlX3NldF9zb21lIHRiLmVsdHMgaSBiXG4gIGRvbmU7XG4gIHRiXG47O1xuXG5sZXQgbWFwaSB0IH5mID1cbiAgbGV0IGkgPSByZWYgMCBpblxuICBtYXAgdCB+ZjooZnVuIGEgLT5cbiAgICBsZXQgcmVzdWx0ID0gZiAhaSBhIGluXG4gICAgaSA6PSAhaSArIDE7XG4gICAgcmVzdWx0KVxuOztcblxubGV0IHNpbmdsZXRvbiB4ID1cbiAgbGV0IHQgPSBjcmVhdGUgKCkgaW5cbiAgZW5xdWV1ZSB0IHg7XG4gIHRcbjs7XG5cbmxldCBzZXhwX29mX3Qgc2V4cF9vZl9hIHQgPSB0b19saXN0IHQgfD4gTGlzdC5zZXhwX29mX3Qgc2V4cF9vZl9hXG5sZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwID0gTGlzdC50X29mX3NleHAgYV9vZl9zZXhwIHNleHAgfD4gb2ZfbGlzdFxuXG5sZXQgdF9zZXhwX2dyYW1tYXIgKHR5cGUgYSkgKGdyYW1tYXIgOiBhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICA6IGEgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICA9XG4gIFNleHBsaWIwLlNleHBfZ3JhbW1hci5jb2VyY2UgKExpc3QudF9zZXhwX2dyYW1tYXIgZ3JhbW1hcilcbjs7XG4iLCJvcGVuISBJbXBvcnRcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gfFxuXG4gIGxldCB1bnJlYWNoYWJsZV9jb2RlID0gZnVuY3Rpb25cbiAgICB8IChfIDogdCkgLT4gLlxuICA7O1xuXG4gIGxldCBhbGwgPSBbXVxuICBsZXQgaGFzaF9mb2xkX3QgXyB0ID0gdW5yZWFjaGFibGVfY29kZSB0XG4gIGxldCBoYXNoID0gdW5yZWFjaGFibGVfY29kZVxuICBsZXQgY29tcGFyZSBhIF8gPSB1bnJlYWNoYWJsZV9jb2RlIGFcbiAgbGV0IHNleHBfb2ZfdCA9IHVucmVhY2hhYmxlX2NvZGVcbiAgbGV0IHRfb2Zfc2V4cCBzZXhwID0gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLmVtcHR5X3R5cGUgXCJCYXNlLk5vdGhpbmcudFwiIHNleHBcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0geyB1bnR5cGVkID0gVW5pb24gW10gfVxuICBsZXQgdG9fc3RyaW5nID0gdW5yZWFjaGFibGVfY29kZVxuICBsZXQgb2Zfc3RyaW5nIChfIDogc3RyaW5nKSA9IGZhaWx3aXRoIFwiQmFzZS5Ob3RoaW5nLm9mX3N0cmluZzogbm90IHN1cHBvcnRlZFwiXG5lbmRcblxuaW5jbHVkZSBUXG5cbmluY2x1ZGUgSWRlbnRpZmlhYmxlLk1ha2UgKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLk5vdGhpbmdcIlxuICBlbmQpXG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIENhbWwuTmF0aXZlaW50XG5pbmNsdWRlIE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gbmF0aXZlaW50IFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIGhhc2hfZm9sZF9uYXRpdmVpbnRcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX25hdGl2ZWludCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAobmF0aXZlaW50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdClcbiAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX25hdGl2ZWludCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBuYXRpdmVpbnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBjb21wYXJlID0gTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5jb21wYXJlXG4gIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgbGV0IG9mX3N0cmluZyA9IG9mX3N0cmluZ1xuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxubW9kdWxlIENvbnYgPSBJbnRfY29udmVyc2lvbnNcbmluY2x1ZGUgQ29udi5NYWtlIChUKVxuXG5pbmNsdWRlIENvbnYuTWFrZV9oZXggKHN0cnVjdFxuICAgIG9wZW4gTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gICAgdHlwZSB0ID0gbmF0aXZlaW50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9uYXRpdmVpbnQgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgaGFzaF9mb2xkX25hdGl2ZWludFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBoYXNoX25hdGl2ZWludCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgICBsZXQgbmVnID0gbmVnXG4gICAgbGV0ICggPCApID0gKCA8IClcbiAgICBsZXQgdG9fc3RyaW5nIGkgPSBQcmludGYuc3ByaW50ZiBcIiVueFwiIGlcbiAgICBsZXQgb2Zfc3RyaW5nIHMgPSBDYW1sLlNjYW5mLnNzY2FuZiBzIFwiJW54XCIgRm4uaWRcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuTmF0aXZlaW50LkhleFwiXG4gIGVuZClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuTmF0aXZlaW50XCJcbiAgZW5kKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgbnVtX2JpdHMgPSBXb3JkX3NpemUubnVtX2JpdHMgV29yZF9zaXplLndvcmRfc2l6ZVxubGV0IGZsb2F0X2xvd2VyX2JvdW5kID0gRmxvYXQwLmxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF91cHBlcl9ib3VuZCA9IEZsb2F0MC51cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgc2hpZnRfcmlnaHRfbG9naWNhbCA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmxldCBzaGlmdF9yaWdodCA9IHNoaWZ0X3JpZ2h0XG5sZXQgc2hpZnRfbGVmdCA9IHNoaWZ0X2xlZnRcbmxldCBiaXRfbm90ID0gbG9nbm90XG5sZXQgYml0X3hvciA9IGxvZ3hvclxubGV0IGJpdF9vciA9IGxvZ29yXG5sZXQgYml0X2FuZCA9IGxvZ2FuZFxubGV0IG1pbl92YWx1ZSA9IG1pbl9pbnRcbmxldCBtYXhfdmFsdWUgPSBtYXhfaW50XG5sZXQgYWJzID0gYWJzXG5sZXQgcHJlZCA9IHByZWRcbmxldCBzdWNjID0gc3VjY1xubGV0IHJlbSA9IHJlbVxubGV0IG5lZyA9IG5lZ1xubGV0IG1pbnVzX29uZSA9IG1pbnVzX29uZVxubGV0IG9uZSA9IG9uZVxubGV0IHplcm8gPSB6ZXJvXG5sZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxubGV0IG9mX2Zsb2F0X3VuY2hlY2tlZCA9IG9mX2Zsb2F0XG5cbmxldCBvZl9mbG9hdCBmID1cbiAgaWYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSBmIGZsb2F0X2xvd2VyX2JvdW5kXG4gICYmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oIDw9ICkgZiBmbG9hdF91cHBlcl9ib3VuZFxuICB0aGVuIG9mX2Zsb2F0IGZcbiAgZWxzZVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgIFwiTmF0aXZlaW50Lm9mX2Zsb2F0OiBhcmd1bWVudCAoJWYpIGlzIG91dCBvZiByYW5nZSBvciBOYU5cIlxuICAgICAgKEZsb2F0MC5ib3ggZilcbiAgICAgICgpXG47O1xuXG5tb2R1bGUgUG93MiA9IHN0cnVjdFxuICBvcGVuISBJbXBvcnRcbiAgb3BlbiBOYXRpdmVpbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbiAgbGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbiAgbGV0IG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKSA9XG4gICAgUHJpbnRmLmludmFsaWRfYXJnZiBcImFyZ3VtZW50IG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmVcIiAoKVxuICA7O1xuXG4gIGxldCAoIGxvciApID0gQ2FtbC5OYXRpdmVpbnQubG9nb3JcbiAgbGV0ICggbHNyICkgPSBDYW1sLk5hdGl2ZWludC5zaGlmdF9yaWdodF9sb2dpY2FsXG4gIGxldCAoIGxhbmQgKSA9IENhbWwuTmF0aXZlaW50LmxvZ2FuZFxuXG4gICgqKiBcImNlaWxpbmcgcG93ZXIgb2YgMlwiIC0gTGVhc3QgcG93ZXIgb2YgMiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGNlaWxfcG93MiAoeCA6IG5hdGl2ZWludCkgPVxuICAgIGlmIHggPD0gMG4gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSBDYW1sLk5hdGl2ZWludC5wcmVkIHggaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgICgqIFRoZSBuZXh0IGxpbmUgaXMgc3VwZXJmbHVvdXMgb24gMzItYml0IGFyY2hpdGVjdHVyZXMsIGJ1dCBpdCdzIGZhc3RlciB0byBkbyBpdFxuICAgICAgIGFueXdheSB0aGFuIHRvIGJyYW5jaCAqKVxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIENhbWwuTmF0aXZlaW50LnN1Y2MgeFxuICA7O1xuXG4gICgqKiBcImZsb29yIHBvd2VyIG9mIDJcIiAtIExhcmdlc3QgcG93ZXIgb2YgMiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8geC4gKilcbiAgbGV0IGZsb29yX3BvdzIgeCA9XG4gICAgaWYgeCA8PSAwbiB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDMyKSBpblxuICAgIENhbWwuTmF0aXZlaW50LnN1YiB4ICh4IGxzciAxKVxuICA7O1xuXG4gIGxldCBpc19wb3cyIHggPVxuICAgIGlmIHggPD0gMG4gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgeCBsYW5kIENhbWwuTmF0aXZlaW50LnByZWQgeCA9IDBuXG4gIDs7XG5cbiAgKCogQyBzdHVicyBmb3IgbmF0aXZlaW50IGNseiBhbmQgY3R6IHRvIHVzZSB0aGUgQ0xaL0JTUi9DVFovQlNGIGluc3RydWN0aW9uIHdoZXJlIHBvc3NpYmxlICopXG4gIGV4dGVybmFsIGNselxuICAgIDogIChuYXRpdmVpbnRbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9uYXRpdmVpbnRfY2x6XCIgXCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jbHpfdW5ib3hlZFwiXG4gIFtAQG5vYWxsb2NdXG5cbiAgZXh0ZXJuYWwgY3R6XG4gICAgOiAgKG5hdGl2ZWludFtAdW5ib3hlZF0pXG4gICAgLT4gKGludFtAdW50YWdnZWRdKVxuICAgID0gXCJCYXNlX2ludF9tYXRoX25hdGl2ZWludF9jdHpcIiBcIkJhc2VfaW50X21hdGhfbmF0aXZlaW50X2N0el91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBmbG9vcl9sb2cyIGkgPVxuICAgIGlmIFBvbHkuKCA8PSApIGkgQ2FtbC5OYXRpdmVpbnQuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIltOYXRpdmVpbnQuZmxvb3JfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIlxuICAgICAgICAgICBbIFwiXCIsIHNleHBfb2ZfbmF0aXZlaW50IGkgXSk7XG4gICAgbnVtX2JpdHMgLSAxIC0gY2x6IGlcbiAgOztcblxuICAoKiogSGFja2VyJ3MgRGVsaWdodCBTZWNvbmQgRWRpdGlvbiBwMTA2ICopXG4gIGxldCBjZWlsX2xvZzIgaSA9XG4gICAgaWYgUG9seS4oIDw9ICkgaSBDYW1sLk5hdGl2ZWludC56ZXJvXG4gICAgdGhlblxuICAgICAgcmFpc2Vfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiW05hdGl2ZWludC5jZWlsX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCJcbiAgICAgICAgICAgWyBcIlwiLCBzZXhwX29mX25hdGl2ZWludCBpIF0pO1xuICAgIGlmIENhbWwuTmF0aXZlaW50LmVxdWFsIGkgQ2FtbC5OYXRpdmVpbnQub25lXG4gICAgdGhlbiAwXG4gICAgZWxzZSBudW1fYml0cyAtIGNseiAoQ2FtbC5OYXRpdmVpbnQucHJlZCBpKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgUG93MlxuXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5sZXQgKCAvICkgPSBkaXZcbmxldCAoICogKSA9IG11bFxubGV0ICggLSApID0gc3ViXG5sZXQgKCArICkgPSBhZGRcbmxldCAoIH4tICkgPSBuZWdcbmxldCBpbmNyIHIgPSByIDo9ICFyICsgb25lXG5sZXQgZGVjciByID0gciA6PSAhciAtIG9uZVxubGV0IG9mX25hdGl2ZWludCB0ID0gdFxubGV0IG9mX25hdGl2ZWludF9leG4gPSBvZl9uYXRpdmVpbnRcbmxldCB0b19uYXRpdmVpbnQgdCA9IHRcbmxldCB0b19uYXRpdmVpbnRfZXhuID0gdG9fbmF0aXZlaW50XG5sZXQgcG9wY291bnQgPSBQb3Bjb3VudC5uYXRpdmVpbnRfcG9wY291bnRcbmxldCBvZl9pbnQgPSBDb252LmludF90b19uYXRpdmVpbnRcbmxldCBvZl9pbnRfZXhuID0gb2ZfaW50XG5sZXQgdG9faW50ID0gQ29udi5uYXRpdmVpbnRfdG9faW50XG5sZXQgdG9faW50X2V4biA9IENvbnYubmF0aXZlaW50X3RvX2ludF9leG5cbmxldCB0b19pbnRfdHJ1bmMgPSBDb252Lm5hdGl2ZWludF90b19pbnRfdHJ1bmNcbmxldCBvZl9pbnQzMiA9IENvbnYuaW50MzJfdG9fbmF0aXZlaW50XG5sZXQgb2ZfaW50MzJfZXhuID0gb2ZfaW50MzJcbmxldCB0b19pbnQzMiA9IENvbnYubmF0aXZlaW50X3RvX2ludDMyXG5sZXQgdG9faW50MzJfZXhuID0gQ29udi5uYXRpdmVpbnRfdG9faW50MzJfZXhuXG5sZXQgdG9faW50MzJfdHJ1bmMgPSBDb252Lm5hdGl2ZWludF90b19pbnQzMl90cnVuY1xubGV0IG9mX2ludDY0ID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRcbmxldCBvZl9pbnQ2NF9leG4gPSBDb252LmludDY0X3RvX25hdGl2ZWludF9leG5cbmxldCBvZl9pbnQ2NF90cnVuYyA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50X3RydW5jXG5sZXQgdG9faW50NjQgPSBDb252Lm5hdGl2ZWludF90b19pbnQ2NFxubGV0IHBvdyBiIGUgPSBvZl9pbnRfZXhuIChJbnRfbWF0aC5Qcml2YXRlLmludF9wb3cgKHRvX2ludF9leG4gYikgKHRvX2ludF9leG4gZSkpXG5sZXQgKCAqKiApIGIgZSA9IHBvdyBiIGVcblxubW9kdWxlIFByZV9PID0gc3RydWN0XG4gIGxldCAoICsgKSA9ICggKyApXG4gIGxldCAoIC0gKSA9ICggLSApXG4gIGxldCAoICogKSA9ICggKiApXG4gIGxldCAoIC8gKSA9ICggLyApXG4gIGxldCAoIH4tICkgPSAoIH4tIClcbiAgbGV0ICggKiogKSA9ICggKiogKVxuXG4gIGluY2x1ZGUgKE5hdGl2ZWludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgOiBDb21wYXJpc29ucy5JbmZpeCB3aXRoIHR5cGUgdCA6PSB0KVxuXG4gIGxldCBhYnMgPSBhYnNcbiAgbGV0IG5lZyA9IG5lZ1xuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludF9leG4gPSBvZl9pbnRfZXhuXG5lbmRcblxubW9kdWxlIE8gPSBzdHJ1Y3RcbiAgaW5jbHVkZSBQcmVfT1xuXG4gIGluY2x1ZGUgSW50X21hdGguTWFrZSAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBpbmNsdWRlIFByZV9PXG5cbiAgICAgIGxldCByZW0gPSByZW1cbiAgICAgIGxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG4gICAgICBsZXQgb2ZfZmxvYXQgPSBvZl9mbG9hdFxuICAgICAgbGV0IG9mX3N0cmluZyA9IFQub2Zfc3RyaW5nXG4gICAgICBsZXQgdG9fc3RyaW5nID0gVC50b19zdHJpbmdcbiAgICBlbmQpXG5cbiAgbGV0ICggbGFuZCApID0gYml0X2FuZFxuICBsZXQgKCBsb3IgKSA9IGJpdF9vclxuICBsZXQgKCBseG9yICkgPSBiaXRfeG9yXG4gIGxldCBsbm90ID0gYml0X25vdFxuICBsZXQgKCBsc2wgKSA9IHNoaWZ0X2xlZnRcbiAgbGV0ICggYXNyICkgPSBzaGlmdF9yaWdodFxuICBsZXQgKCBsc3IgKSA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmVuZFxuXG5pbmNsdWRlIE9cblxuKCogW05hdGl2ZWludF0gYW5kIFtOYXRpdmVpbnQuT10gYWdyZWUgdmFsdWUtd2lzZSAqKVxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgTmF0aXZlaW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5leHRlcm5hbCBic3dhcCA6IHQgLT4gdCA9IFwiJWJzd2FwX25hdGl2ZVwiXG4iLCIoKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZSBDYW1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgIFhhdmllciBMZXJveSwgcHJvamV0IENyaXN0YWwsIElOUklBIFJvY3F1ZW5jb3VydCAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgQ29weXJpZ2h0IDE5OTYgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCAgICopXG4oKiAgZW4gQXV0b21hdGlxdWUuICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkICAgICopXG4oKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UuIFNlZSAuLi9USElSRC1QQVJUWS50eHQgICopXG4oKiAgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbm9wZW4hIEltcG9ydFxubW9kdWxlIExpc3QgPSBMaXN0MFxuaW5jbHVkZSBNYXBfaW50ZlxuXG5tb2R1bGUgRmluaXNoZWRfb3JfdW5maW5pc2hlZCA9IHN0cnVjdFxuICBpbmNsdWRlIE1hcF9pbnRmLkZpbmlzaGVkX29yX3VuZmluaXNoZWRcblxuICAoKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB0ZXN0ZWQgaW4gW3Rlc3RfbWFwLm1sXSB0byBtYWtlIHN1cmUgb3VyIHVzZSBvZlxuICAgICBbQ2FtbC5PYmoubWFnaWNdIGlzIGNvcnJlY3QgYW5kIHNhZmUuICopXG4gIGxldCBvZl9jb250aW51ZV9vcl9zdG9wIDogQ29udGludWVfb3Jfc3RvcC50IC0+IHQgPSBDYW1sLk9iai5tYWdpY1xuICBsZXQgdG9fY29udGludWVfb3Jfc3RvcCA6IHQgLT4gQ29udGludWVfb3Jfc3RvcC50ID0gQ2FtbC5PYmoubWFnaWNcbmVuZFxuXG5tb2R1bGUgTWVyZ2VfZWxlbWVudCA9IHN0cnVjdFxuICBpbmNsdWRlIE1hcF9pbnRmLk1lcmdlX2VsZW1lbnRcblxuICBsZXQgbGVmdCA9IGZ1bmN0aW9uXG4gICAgfCBgUmlnaHQgXyAtPiBOb25lXG4gICAgfCBgTGVmdCBsZWZ0IHwgYEJvdGggKGxlZnQsIF8pIC0+IFNvbWUgbGVmdFxuICA7O1xuXG4gIGxldCByaWdodCA9IGZ1bmN0aW9uXG4gICAgfCBgTGVmdCBfIC0+IE5vbmVcbiAgICB8IGBSaWdodCByaWdodCB8IGBCb3RoIChfLCByaWdodCkgLT4gU29tZSByaWdodFxuICA7O1xuXG4gIGxldCBsZWZ0X3ZhbHVlIHQgfmRlZmF1bHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgYFJpZ2h0IF8gLT4gZGVmYXVsdFxuICAgIHwgYExlZnQgbGVmdCB8IGBCb3RoIChsZWZ0LCBfKSAtPiBsZWZ0XG4gIDs7XG5cbiAgbGV0IHJpZ2h0X3ZhbHVlIHQgfmRlZmF1bHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgYExlZnQgXyAtPiBkZWZhdWx0XG4gICAgfCBgUmlnaHQgcmlnaHQgfCBgQm90aCAoXywgcmlnaHQpIC0+IHJpZ2h0XG4gIDs7XG5cbiAgbGV0IHZhbHVlcyB0IH5sZWZ0X2RlZmF1bHQgfnJpZ2h0X2RlZmF1bHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgYExlZnQgbGVmdCAtPiBsZWZ0LCByaWdodF9kZWZhdWx0XG4gICAgfCBgUmlnaHQgcmlnaHQgLT4gbGVmdF9kZWZhdWx0LCByaWdodFxuICAgIHwgYEJvdGggKGxlZnQsIHJpZ2h0KSAtPiBsZWZ0LCByaWdodFxuICA7O1xuZW5kXG5cbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5cbmV4Y2VwdGlvbiBEdXBsaWNhdGUgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBdXG5cbmxldCAoKSA9XG4gIFNleHBsaWIwLlNleHBfY29udi5FeG5fY29udmVydGVyLmFkZCBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBEdXBsaWNhdGVdIChmdW5jdGlvblxuICAgIHwgRHVwbGljYXRlIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIm1hcC5tbC5EdXBsaWNhdGVcIlxuICAgIHwgXyAtPiBhc3NlcnQgZmFsc2UpXG47O1xuXG5bQEBAZW5kXVxuXG5tb2R1bGUgVHJlZTAgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2ssICd2KSB0ID1cbiAgICB8IEVtcHR5XG4gICAgfCBMZWFmIG9mICdrICogJ3ZcbiAgICB8IE5vZGUgb2YgKCdrLCAndikgdCAqICdrICogJ3YgKiAoJ2ssICd2KSB0ICogaW50XG5cbiAgdHlwZSAoJ2ssICd2KSB0cmVlID0gKCdrLCAndikgdFxuXG4gIGxldCBoZWlnaHQgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgLT4gMFxuICAgIHwgTGVhZiBfIC0+IDFcbiAgICB8IE5vZGUgKF8sIF8sIF8sIF8sIGgpIC0+IGhcbiAgOztcblxuICBsZXQgaW52YXJpYW50cyA9XG4gICAgbGV0IGluX3JhbmdlIGxvd2VyIHVwcGVyIGNvbXBhcmVfa2V5IGsgPVxuICAgICAgKG1hdGNoIGxvd2VyIHdpdGhcbiAgICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgIHwgU29tZSBsb3dlciAtPiBjb21wYXJlX2tleSBsb3dlciBrIDwgMClcbiAgICAgICYmXG4gICAgICBtYXRjaCB1cHBlciB3aXRoXG4gICAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgICAgfCBTb21lIHVwcGVyIC0+IGNvbXBhcmVfa2V5IGsgdXBwZXIgPCAwXG4gICAgaW5cbiAgICBsZXQgcmVjIGxvb3AgbG93ZXIgdXBwZXIgY29tcGFyZV9rZXkgdCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gdHJ1ZVxuICAgICAgfCBMZWFmIChrLCBfKSAtPiBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2tleSBrXG4gICAgICB8IE5vZGUgKGwsIGssIF8sIHIsIGgpIC0+XG4gICAgICAgIGxldCBobCA9IGhlaWdodCBsXG4gICAgICAgIGFuZCBociA9IGhlaWdodCByIGluXG4gICAgICAgIGFicyAoaGwgLSBocikgPD0gMlxuICAgICAgICAmJiBoID0gbWF4IGhsIGhyICsgMVxuICAgICAgICAmJiBpbl9yYW5nZSBsb3dlciB1cHBlciBjb21wYXJlX2tleSBrXG4gICAgICAgICYmIGxvb3AgbG93ZXIgKFNvbWUgaykgY29tcGFyZV9rZXkgbFxuICAgICAgICAmJiBsb29wIChTb21lIGspIHVwcGVyIGNvbXBhcmVfa2V5IHJcbiAgICBpblxuICAgIGZ1biB0IH5jb21wYXJlX2tleSAtPiBsb29wIE5vbmUgTm9uZSBjb21wYXJlX2tleSB0XG4gIDs7XG5cbiAgKCogcHJlY29uZGl0aW9uOiB8aGVpZ2h0KGwpIC0gaGVpZ2h0KHIpfCA8PSAyICopXG4gIGxldCBjcmVhdGUgbCB4IGQgciA9XG4gICAgbGV0IGhsID0gaGVpZ2h0IGxcbiAgICBhbmQgaHIgPSBoZWlnaHQgciBpblxuICAgIGlmIGhsID0gMCAmJiBociA9IDBcbiAgICB0aGVuIExlYWYgKHgsIGQpXG4gICAgZWxzZSBOb2RlIChsLCB4LCBkLCByLCBpZiBobCA+PSBociB0aGVuIGhsICsgMSBlbHNlIGhyICsgMSlcbiAgOztcblxuICBsZXQgc2luZ2xldG9uIGtleSBkYXRhID0gTGVhZiAoa2V5LCBkYXRhKVxuXG4gICgqIFdlIG11c3QgY2FsbCBbZl0gd2l0aCBpbmNyZWFzaW5nIGluZGV4ZXMsIGJlY2F1c2UgdGhlIGJpbl9wcm90IHJlYWRlciBpblxuICAgICBDb3JlLk1hcCBuZWVkcyBpdC4gKilcbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgPVxuICAgIGxldCByZWMgbG9vcCBuIH5mIGkgOiAoXywgXykgdCA9XG4gICAgICBtYXRjaCBuIHdpdGhcbiAgICAgIHwgMCAtPiBFbXB0eVxuICAgICAgfCAxIC0+XG4gICAgICAgIGxldCBrLCB2ID0gZiBpIGluXG4gICAgICAgIExlYWYgKGssIHYpXG4gICAgICB8IDIgLT5cbiAgICAgICAgbGV0IGtsLCB2bCA9IGYgaSBpblxuICAgICAgICBsZXQgaywgdiA9IGYgKGkgKyAxKSBpblxuICAgICAgICBOb2RlIChMZWFmIChrbCwgdmwpLCBrLCB2LCBFbXB0eSwgMilcbiAgICAgIHwgMyAtPlxuICAgICAgICBsZXQga2wsIHZsID0gZiBpIGluXG4gICAgICAgIGxldCBrLCB2ID0gZiAoaSArIDEpIGluXG4gICAgICAgIGxldCBrciwgdnIgPSBmIChpICsgMikgaW5cbiAgICAgICAgTm9kZSAoTGVhZiAoa2wsIHZsKSwgaywgdiwgTGVhZiAoa3IsIHZyKSwgMilcbiAgICAgIHwgbiAtPlxuICAgICAgICBsZXQgbGVmdF9sZW5ndGggPSBuIGxzciAxIGluXG4gICAgICAgIGxldCByaWdodF9sZW5ndGggPSBuIC0gbGVmdF9sZW5ndGggLSAxIGluXG4gICAgICAgIGxldCBsZWZ0ID0gbG9vcCBsZWZ0X2xlbmd0aCB+ZiBpIGluXG4gICAgICAgIGxldCBrLCB2ID0gZiAoaSArIGxlZnRfbGVuZ3RoKSBpblxuICAgICAgICBsZXQgcmlnaHQgPSBsb29wIHJpZ2h0X2xlbmd0aCB+ZiAoaSArIGxlZnRfbGVuZ3RoICsgMSkgaW5cbiAgICAgICAgY3JlYXRlIGxlZnQgayB2IHJpZ2h0XG4gICAgaW5cbiAgICBsb29wIGxlbiB+ZiAwXG4gIDs7XG5cbiAgbGV0IG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgYXJyYXlfbGVuZ3RoID0gQXJyYXkubGVuZ3RoIGFycmF5IGluXG4gICAgbGV0IG5leHQgPVxuICAgICAgaWYgYXJyYXlfbGVuZ3RoIDwgMlxuICAgICAgICAgfHxcbiAgICAgICAgIGxldCBrMCwgXyA9IGFycmF5LigwKSBpblxuICAgICAgICAgbGV0IGsxLCBfID0gYXJyYXkuKDEpIGluXG4gICAgICAgICBjb21wYXJlX2tleSBrMCBrMSA8IDBcbiAgICAgIHRoZW4gZnVuIGkgLT4gYXJyYXkuKGkpXG4gICAgICBlbHNlIGZ1biBpIC0+IGFycmF5LihhcnJheV9sZW5ndGggLSAxIC0gaSlcbiAgICBpblxuICAgIG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW46YXJyYXlfbGVuZ3RoIH5mOm5leHQsIGFycmF5X2xlbmd0aFxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgYXJyYXkgfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCBhcnJheSB3aXRoXG4gICAgfCBbfHxdIHwgW3wgXyB8XSAtPiBSZXN1bHQuT2sgKG9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfa2V5KVxuICAgIHwgXyAtPlxuICAgICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICAgIGxldCBpbmNyZWFzaW5nID1cbiAgICAgICAgICBtYXRjaCBjb21wYXJlX2tleSAoZnN0IGFycmF5LigwKSkgKGZzdCBhcnJheS4oMSkpIHdpdGhcbiAgICAgICAgICB8IDAgLT4gci5yZXR1cm4gKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZHVwbGljYXRlZCBlbGVtZW50c1wiKVxuICAgICAgICAgIHwgaSAtPiBpIDwgMFxuICAgICAgICBpblxuICAgICAgICBmb3IgaSA9IDEgdG8gQXJyYXkubGVuZ3RoIGFycmF5IC0gMiBkb1xuICAgICAgICAgIG1hdGNoIGNvbXBhcmVfa2V5IChmc3QgYXJyYXkuKGkpKSAoZnN0IGFycmF5LihpICsgMSkpIHdpdGhcbiAgICAgICAgICB8IDAgLT4gci5yZXR1cm4gKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZHVwbGljYXRlZCBlbGVtZW50c1wiKVxuICAgICAgICAgIHwgaSAtPlxuICAgICAgICAgICAgaWYgUG9seS4oIDw+ICkgKGkgPCAwKSBpbmNyZWFzaW5nXG4gICAgICAgICAgICB0aGVuXG4gICAgICAgICAgICAgIHIucmV0dXJuXG4gICAgICAgICAgICAgICAgKE9yX2Vycm9yLmVycm9yX3N0cmluZyBcIm9mX3NvcnRlZF9hcnJheTogZWxlbWVudHMgYXJlIG5vdCBvcmRlcmVkXCIpXG4gICAgICAgIGRvbmU7XG4gICAgICAgIFJlc3VsdC5PayAob2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhcnJheSB+Y29tcGFyZV9rZXkpKVxuICA7O1xuXG4gICgqIHByZWNvbmRpdGlvbjogfGhlaWdodChsKSAtIGhlaWdodChyKXwgPD0gMyAqKVxuICBsZXQgYmFsIGwgeCBkIHIgPVxuICAgIGxldCBobCA9IGhlaWdodCBsIGluXG4gICAgbGV0IGhyID0gaGVpZ2h0IHIgaW5cbiAgICBpZiBobCA+IGhyICsgMlxuICAgIHRoZW4gKFxuICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2UgKCogaGVpZ2h0KExlYWYpID0gMSAmJiAxIGlzIG5vdCBsYXJnZXIgdGhhbiBociArIDIgKilcbiAgICAgIHwgTm9kZSAobGwsIGx2LCBsZCwgbHIsIF8pIC0+XG4gICAgICAgIGlmIGhlaWdodCBsbCA+PSBoZWlnaHQgbHJcbiAgICAgICAgdGhlbiBjcmVhdGUgbGwgbHYgbGQgKGNyZWF0ZSBsciB4IGQgcilcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggbHIgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgICB8IExlYWYgKGxydiwgbHJkKSAtPiBjcmVhdGUgKGNyZWF0ZSBsbCBsdiBsZCBFbXB0eSkgbHJ2IGxyZCAoY3JlYXRlIEVtcHR5IHggZCByKVxuICAgICAgICAgIHwgTm9kZSAobHJsLCBscnYsIGxyZCwgbHJyLCBfKSAtPlxuICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbGwgbHYgbGQgbHJsKSBscnYgbHJkIChjcmVhdGUgbHJyIHggZCByKSkpXG4gICAgZWxzZSBpZiBociA+IGhsICsgMlxuICAgIHRoZW4gKFxuICAgICAgbWF0Y2ggciB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGludmFsaWRfYXJnIFwiTWFwLmJhbFwiXG4gICAgICB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2UgKCogaGVpZ2h0KExlYWYpID0gMSAmJiAxIGlzIG5vdCBsYXJnZXIgdGhhbiBobCArIDIgKilcbiAgICAgIHwgTm9kZSAocmwsIHJ2LCByZCwgcnIsIF8pIC0+XG4gICAgICAgIGlmIGhlaWdodCByciA+PSBoZWlnaHQgcmxcbiAgICAgICAgdGhlbiBjcmVhdGUgKGNyZWF0ZSBsIHggZCBybCkgcnYgcmQgcnJcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbWF0Y2ggcmwgd2l0aFxuICAgICAgICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAuYmFsXCJcbiAgICAgICAgICB8IExlYWYgKHJsdiwgcmxkKSAtPiBjcmVhdGUgKGNyZWF0ZSBsIHggZCBFbXB0eSkgcmx2IHJsZCAoY3JlYXRlIEVtcHR5IHJ2IHJkIHJyKVxuICAgICAgICAgIHwgTm9kZSAocmxsLCBybHYsIHJsZCwgcmxyLCBfKSAtPlxuICAgICAgICAgICAgY3JlYXRlIChjcmVhdGUgbCB4IGQgcmxsKSBybHYgcmxkIChjcmVhdGUgcmxyIHJ2IHJkIHJyKSkpXG4gICAgZWxzZSBjcmVhdGUgbCB4IGQgclxuICA7O1xuXG4gIGxldCBlbXB0eSA9IEVtcHR5XG5cbiAgbGV0IGlzX2VtcHR5ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IHRydWVcbiAgICB8IF8gLT4gZmFsc2VcbiAgOztcblxuICBsZXQgcmFpc2Vfa2V5X2FscmVhZHlfcHJlc2VudCB+a2V5IH5zZXhwX29mX2tleSA9XG4gICAgRXJyb3IucmFpc2Vfc1xuICAgICAgKFNleHAubWVzc2FnZSBcIltNYXAuYWRkX2V4bl0gZ290IGtleSBhbHJlYWR5IHByZXNlbnRcIiBbIFwia2V5XCIsIGtleSB8PiBzZXhwX29mX2tleSBdKVxuICA7O1xuXG4gIG1vZHVsZSBBZGRfb3Jfc2V0ID0gc3RydWN0XG4gICAgdHlwZSB0ID1cbiAgICAgIHwgQWRkX2V4bl9pbnRlcm5hbFxuICAgICAgfCBBZGRfZXhuXG4gICAgICB8IFNldFxuICBlbmRcblxuXG4gIGxldCByZWMgZmluZF9hbmRfYWRkX29yX3NldFxuICAgICAgICAgICAgdFxuICAgICAgICAgICAgfmxlbmd0aFxuICAgICAgICAgICAgfmtleTp4XG4gICAgICAgICAgICB+ZGF0YVxuICAgICAgICAgICAgfmNvbXBhcmVfa2V5XG4gICAgICAgICAgICB+c2V4cF9vZl9rZXlcbiAgICAgICAgICAgIH4oYWRkX29yX3NldCA6IEFkZF9vcl9zZXQudClcbiAgICA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBMZWFmICh4LCBkYXRhKSwgbGVuZ3RoICsgMVxuICAgIHwgTGVhZiAodiwgZCkgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgeCB2IGluXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGFkZF9vcl9zZXQgd2l0aFxuICAgICAgICB8IEFkZF9leG5faW50ZXJuYWwgLT4gRXhuLnJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIER1cGxpY2F0ZVxuICAgICAgICB8IEFkZF9leG4gLT4gcmFpc2Vfa2V5X2FscmVhZHlfcHJlc2VudCB+a2V5OnggfnNleHBfb2Zfa2V5XG4gICAgICAgIHwgU2V0IC0+IExlYWYgKHgsIGRhdGEpLCBsZW5ndGgpXG4gICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICB0aGVuIE5vZGUgKExlYWYgKHgsIGRhdGEpLCB2LCBkLCBFbXB0eSwgMiksIGxlbmd0aCArIDFcbiAgICAgIGVsc2UgTm9kZSAoRW1wdHksIHYsIGQsIExlYWYgKHgsIGRhdGEpLCAyKSwgbGVuZ3RoICsgMVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgaCkgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgeCB2IGluXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGFkZF9vcl9zZXQgd2l0aFxuICAgICAgICB8IEFkZF9leG5faW50ZXJuYWwgLT4gRXhuLnJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIER1cGxpY2F0ZVxuICAgICAgICB8IEFkZF9leG4gLT4gcmFpc2Vfa2V5X2FscmVhZHlfcHJlc2VudCB+a2V5OnggfnNleHBfb2Zfa2V5XG4gICAgICAgIHwgU2V0IC0+IE5vZGUgKGwsIHgsIGRhdGEsIHIsIGgpLCBsZW5ndGgpXG4gICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICB0aGVuIChcbiAgICAgICAgbGV0IGwsIGxlbmd0aCA9XG4gICAgICAgICAgZmluZF9hbmRfYWRkX29yX3NldCB+bGVuZ3RoIH5rZXk6eCB+ZGF0YSBsIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgfmFkZF9vcl9zZXRcbiAgICAgICAgaW5cbiAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgciwgbGVuZ3RoID1cbiAgICAgICAgICBmaW5kX2FuZF9hZGRfb3Jfc2V0IH5sZW5ndGggfmtleTp4IH5kYXRhIHIgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSB+YWRkX29yX3NldFxuICAgICAgICBpblxuICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICA7O1xuXG4gIGxldCBhZGRfZXhuIHQgfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXkgPVxuICAgIGZpbmRfYW5kX2FkZF9vcl9zZXQgdCB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSB+YWRkX29yX3NldDpBZGRfZXhuXG4gIDs7XG5cbiAgbGV0IGFkZF9leG5faW50ZXJuYWwgdCB+bGVuZ3RoIH5rZXkgfmRhdGEgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSA9XG4gICAgZmluZF9hbmRfYWRkX29yX3NldFxuICAgICAgdFxuICAgICAgfmxlbmd0aFxuICAgICAgfmtleVxuICAgICAgfmRhdGFcbiAgICAgIH5jb21wYXJlX2tleVxuICAgICAgfnNleHBfb2Zfa2V5XG4gICAgICB+YWRkX29yX3NldDpBZGRfZXhuX2ludGVybmFsXG4gIDs7XG5cbiAgbGV0IHNldCB0IH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgPVxuICAgIGZpbmRfYW5kX2FkZF9vcl9zZXRcbiAgICAgIHRcbiAgICAgIH5sZW5ndGhcbiAgICAgIH5rZXlcbiAgICAgIH5kYXRhXG4gICAgICB+Y29tcGFyZV9rZXlcbiAgICAgIH5zZXhwX29mX2tleTooZnVuIF8gLT4gTGlzdCBbXSlcbiAgICAgIH5hZGRfb3Jfc2V0OlNldFxuICA7O1xuXG4gIGxldCBzZXQnIHQga2V5IGRhdGEgfmNvbXBhcmVfa2V5ID0gZnN0IChzZXQgdCB+bGVuZ3RoOjAgfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkpXG5cbiAgbW9kdWxlIEJ1aWxkX2luY3JlYXNpbmcgPSBzdHJ1Y3RcbiAgICBtb2R1bGUgRnJhZ21lbnQgPSBzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjICgnaywgJ3YpIHQgPVxuICAgICAgICB7IGxlZnRfc3VidHJlZSA6ICgnaywgJ3YpIHRcbiAgICAgICAgOyBrZXkgOiAna1xuICAgICAgICA7IGRhdGEgOiAndlxuICAgICAgICB9XG5cbiAgICAgIGxldCBzaW5nbGV0b25fdG9fdHJlZV9leG4gPSBmdW5jdGlvblxuICAgICAgICB8IHsgbGVmdF9zdWJ0cmVlID0gRW1wdHk7IGtleTsgZGF0YSB9IC0+IHNpbmdsZXRvbiBrZXkgZGF0YVxuICAgICAgICB8IF8gLT4gZmFpbHdpdGggXCJNYXAuc2luZ2xldG9uX3RvX3RyZWVfZXhuOiBub3QgYSBzaW5nbGV0b25cIlxuICAgICAgOztcblxuICAgICAgbGV0IHNpbmdsZXRvbiB+a2V5IH5kYXRhID0geyBsZWZ0X3N1YnRyZWUgPSBFbXB0eTsga2V5OyBkYXRhIH1cblxuICAgICAgKCogcHJlY29uZGl0aW9uOiB8aGVpZ2h0KGwubGVmdF9zdWJ0cmVlKSAtIGhlaWdodChyKXwgPD0gMixcbiAgICAgICAgIG1heF9rZXkobCkgPCBtaW5fa2V5KHIpXG4gICAgICAqKVxuICAgICAgbGV0IGNvbGxhcHNlIGwgciA9IGNyZWF0ZSBsLmxlZnRfc3VidHJlZSBsLmtleSBsLmRhdGEgclxuXG4gICAgICAoKiBwcmVjb25kaXRpb246IHxoZWlnaHQobC5sZWZ0X3N1YnRyZWUpIC0gaGVpZ2h0KHIubGVmdF9zdWJ0cmVlKXwgPD0gMixcbiAgICAgICAgIG1heF9rZXkobCkgPCBtaW5fa2V5KHIpXG4gICAgICAqKVxuICAgICAgbGV0IGpvaW4gbCByID0geyByIHdpdGggbGVmdF9zdWJ0cmVlID0gY29sbGFwc2UgbCByLmxlZnRfc3VidHJlZSB9XG4gICAgICBsZXQgbWF4X2tleSB0ID0gdC5rZXlcbiAgICBlbmRcblxuICAgICgqKiBCdWlsZCB0cmVlcyBmcm9tIHNpbmdsZXRvbnMgaW4gYSBiYWxhbmNlZCB3YXkgYnkgdXNpbmcgc2tldyBiaW5hcnkgZW5jb2RpbmcuXG4gICAgICAgIEVhY2ggbGV2ZWwgY29udGFpbnMgdHJlZXMgb2YgdGhlIHNhbWUgaGVpZ2h0LCBjb25zZWN1dGl2ZSBsZXZlbHMgaGF2ZSBjb25zZWN1dGl2ZVxuICAgICAgICBoZWlnaHRzLiBUaGVyZSBhcmUgbm8gZ2Fwcy4gVGhlIGZpcnN0IGxldmVsIGFyZSBzaW5nbGUga2V5cy5cbiAgICAqKVxuICAgIHR5cGUgKCdrLCAndikgdCA9XG4gICAgICB8IFplcm8gb2YgdW5pdFxuICAgICAgKCogW3VuaXRdIHRvIG1ha2UgcGF0dGVybiBtYXRjaGluZyBmYXN0ZXIgKilcbiAgICAgIHwgT25lIG9mICgnaywgJ3YpIHQgKiAoJ2ssICd2KSBGcmFnbWVudC50XG4gICAgICB8IFR3byBvZiAoJ2ssICd2KSB0ICogKCdrLCAndikgRnJhZ21lbnQudCAqICgnaywgJ3YpIEZyYWdtZW50LnRcblxuICAgIGxldCBlbXB0eSA9IFplcm8gKClcblxuICAgIGxldCBhZGRfdW5jaGVja2VkID1cbiAgICAgIGxldCByZWMgZ28gdCB4ID1cbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgWmVybyAoKSAtPiBPbmUgKHQsIHgpXG4gICAgICAgIHwgT25lICh0LCB5KSAtPiBUd28gKHQsIHksIHgpXG4gICAgICAgIHwgVHdvICh0LCB6LCB5KSAtPiBPbmUgKGdvIHQgKEZyYWdtZW50LmpvaW4geiB5KSwgeClcbiAgICAgIGluXG4gICAgICBmdW4gdCB+a2V5IH5kYXRhIC0+IGdvIHQgKEZyYWdtZW50LnNpbmdsZXRvbiB+a2V5IH5kYXRhKVxuICAgIDs7XG5cbiAgICBsZXQgdG9fdHJlZV91bmNoZWNrZWQgPVxuICAgICAgbGV0IHJlYyBnbyB0IHIgPVxuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBaZXJvICgpIC0+IHJcbiAgICAgICAgfCBPbmUgKHQsIGwpIC0+IGdvIHQgKEZyYWdtZW50LmNvbGxhcHNlIGwgcilcbiAgICAgICAgfCBUd28gKHQsIGxsLCBsKSAtPiBnbyB0IChGcmFnbWVudC5jb2xsYXBzZSAoRnJhZ21lbnQuam9pbiBsbCBsKSByKVxuICAgICAgaW5cbiAgICAgIGZ1bmN0aW9uXG4gICAgICB8IFplcm8gKCkgLT4gRW1wdHlcbiAgICAgIHwgT25lICh0LCByKSAtPiBnbyB0IChGcmFnbWVudC5zaW5nbGV0b25fdG9fdHJlZV9leG4gcilcbiAgICAgIHwgVHdvICh0LCBsLCByKSAtPiBnbyAoT25lICh0LCBsKSkgKEZyYWdtZW50LnNpbmdsZXRvbl90b190cmVlX2V4biByKVxuICAgIDs7XG5cbiAgICBsZXQgbWF4X2tleSA9IGZ1bmN0aW9uXG4gICAgICB8IFplcm8gKCkgLT4gTm9uZVxuICAgICAgfCBPbmUgKF8sIHIpIHwgVHdvIChfLCBfLCByKSAtPiBTb21lIChGcmFnbWVudC5tYXhfa2V5IHIpXG4gICAgOztcbiAgZW5kXG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfc2VxdWVuY2Ugc2VxIH5jb21wYXJlX2tleSA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biB7IHJldHVybiB9IC0+XG4gICAgICBsZXQgYnVpbGRlciwgbGVuZ3RoID1cbiAgICAgICAgU2VxdWVuY2UuZm9sZFxuICAgICAgICAgIHNlcVxuICAgICAgICAgIH5pbml0OihCdWlsZF9pbmNyZWFzaW5nLmVtcHR5LCAwKVxuICAgICAgICAgIH5mOihmdW4gKGJ1aWxkZXIsIGxlbmd0aCkgKGtleSwgZGF0YSkgLT5cbiAgICAgICAgICAgIG1hdGNoIEJ1aWxkX2luY3JlYXNpbmcubWF4X2tleSBidWlsZGVyIHdpdGhcbiAgICAgICAgICAgIHwgU29tZSBwcmV2X2tleSB3aGVuIGNvbXBhcmVfa2V5IHByZXZfa2V5IGtleSA+PSAwIC0+XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIChPcl9lcnJvci5lcnJvcl9zdHJpbmcgXCJvZl9pbmNyZWFzaW5nX3NlcXVlbmNlOiBub24taW5jcmVhc2luZyBrZXlcIilcbiAgICAgICAgICAgIHwgXyAtPiBCdWlsZF9pbmNyZWFzaW5nLmFkZF91bmNoZWNrZWQgYnVpbGRlciB+a2V5IH5kYXRhLCBsZW5ndGggKyAxKVxuICAgICAgaW5cbiAgICAgIE9rIChCdWlsZF9pbmNyZWFzaW5nLnRvX3RyZWVfdW5jaGVja2VkIGJ1aWxkZXIsIGxlbmd0aCkpXG4gIDs7XG5cbiAgKCogTGlrZSBbYmFsXSBidXQgYWxsb3dzIGFueSBkaWZmZXJlbmNlIGluIGhlaWdodCBiZXR3ZWVuIFtsXSBhbmQgW3JdLlxuXG4gICAgIE8ofGhlaWdodCBsIC0gaGVpZ2h0IHJ8KSAqKVxuICBsZXQgcmVjIGpvaW4gbCBrIGQgciB+Y29tcGFyZV9rZXkgPVxuICAgIG1hdGNoIGwsIHIgd2l0aFxuICAgIHwgRW1wdHksIF8gLT4gc2V0JyByIGsgZCB+Y29tcGFyZV9rZXlcbiAgICB8IF8sIEVtcHR5IC0+IHNldCcgbCBrIGQgfmNvbXBhcmVfa2V5XG4gICAgfCBMZWFmIChsaywgbGQpLCBfIC0+IHNldCcgKHNldCcgciBrIGQgfmNvbXBhcmVfa2V5KSBsayBsZCB+Y29tcGFyZV9rZXlcbiAgICB8IF8sIExlYWYgKHJrLCByZCkgLT4gc2V0JyAoc2V0JyBsIGsgZCB+Y29tcGFyZV9rZXkpIHJrIHJkIH5jb21wYXJlX2tleVxuICAgIHwgTm9kZSAobGwsIGxrLCBsZCwgbHIsIGxoKSwgTm9kZSAocmwsIHJrLCByZCwgcnIsIHJoKSAtPlxuICAgICAgKCogW2JhbF0gcmVxdWlyZXMgaGVpZ2h0IGRpZmZlcmVuY2UgPD0gMy4gKilcbiAgICAgIGlmIGxoID4gcmggKyAzXG4gICAgICAoKiBbaGVpZ2h0IGxyID49IGhlaWdodCByXSxcbiAgICAgICAgIHRoZXJlZm9yZSBbaGVpZ2h0IChqb2luIGxyIGsgZCByIC4uLildIGlzIFtoZWlnaHQgcmwgKyAxXSBvciBbaGVpZ2h0IHJsXVxuICAgICAgICAgdGhlcmVmb3JlIHRoZSBoZWlnaHQgZGlmZmVyZW5jZSB3aXRoIFtsbF0gd2lsbCBiZSA8PSAzICopXG4gICAgICB0aGVuIGJhbCBsbCBsayBsZCAoam9pbiBsciBrIGQgciB+Y29tcGFyZV9rZXkpXG4gICAgICBlbHNlIGlmIHJoID4gbGggKyAzXG4gICAgICB0aGVuIGJhbCAoam9pbiBsIGsgZCBybCB+Y29tcGFyZV9rZXkpIHJrIHJkIHJyXG4gICAgICBlbHNlIGJhbCBsIGsgZCByXG4gIDs7XG5cbiAgbGV0IHJlYyBzcGxpdCB0IHggfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IEVtcHR5LCBOb25lLCBFbXB0eVxuICAgIHwgTGVhZiAoaywgZCkgLT5cbiAgICAgIGxldCBjbXAgPSBjb21wYXJlX2tleSB4IGsgaW5cbiAgICAgIGlmIGNtcCA9IDBcbiAgICAgIHRoZW4gRW1wdHksIFNvbWUgKGssIGQpLCBFbXB0eVxuICAgICAgZWxzZSBpZiBjbXAgPCAwXG4gICAgICB0aGVuIEVtcHR5LCBOb25lLCB0XG4gICAgICBlbHNlIHQsIE5vbmUsIEVtcHR5XG4gICAgfCBOb2RlIChsLCBrLCBkLCByLCBfKSAtPlxuICAgICAgbGV0IGNtcCA9IGNvbXBhcmVfa2V5IHggayBpblxuICAgICAgaWYgY21wID0gMFxuICAgICAgdGhlbiBsLCBTb21lIChrLCBkKSwgclxuICAgICAgZWxzZSBpZiBjbXAgPCAwXG4gICAgICB0aGVuIChcbiAgICAgICAgbGV0IGxsLCBtYXliZSwgbHIgPSBzcGxpdCBsIHggfmNvbXBhcmVfa2V5IGluXG4gICAgICAgIGxsLCBtYXliZSwgam9pbiBsciBrIGQgciB+Y29tcGFyZV9rZXkpXG4gICAgICBlbHNlIChcbiAgICAgICAgbGV0IHJsLCBtYXliZSwgcnIgPSBzcGxpdCByIHggfmNvbXBhcmVfa2V5IGluXG4gICAgICAgIGpvaW4gbCBrIGQgcmwgfmNvbXBhcmVfa2V5LCBtYXliZSwgcnIpXG4gIDs7XG5cbiAgbGV0IHNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSB0IH5pbnRvIHggfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgbGVmdCwgYm91bmRhcnlfb3B0LCByaWdodCA9IHNwbGl0IHQgeCB+Y29tcGFyZV9rZXkgaW5cbiAgICBtYXRjaCBib3VuZGFyeV9vcHQgd2l0aFxuICAgIHwgTm9uZSAtPiBsZWZ0LCByaWdodFxuICAgIHwgU29tZSAoa2V5LCBkYXRhKSAtPlxuICAgICAgbGV0IGluc2VydF9pbnRvIHRyZWUgPSBmc3QgKHNldCB0cmVlIH5rZXkgfmRhdGEgfmxlbmd0aDowIH5jb21wYXJlX2tleSkgaW5cbiAgICAgIChtYXRjaCBpbnRvIHdpdGhcbiAgICAgICB8IGBMZWZ0IC0+IGluc2VydF9pbnRvIGxlZnQsIHJpZ2h0XG4gICAgICAgfCBgUmlnaHQgLT4gbGVmdCwgaW5zZXJ0X2ludG8gcmlnaHQpXG4gIDs7XG5cbiAgbGV0IHNwbGl0X3JhbmdlXG4gICAgICAgIHRcbiAgICAgICAgfihsb3dlcl9ib3VuZCA6ICdhIE1heWJlX2JvdW5kLnQpXG4gICAgICAgIH4odXBwZXJfYm91bmQgOiAnYSBNYXliZV9ib3VuZC50KVxuICAgICAgICB+Y29tcGFyZV9rZXlcbiAgICA9XG4gICAgaWYgTWF5YmVfYm91bmQuYm91bmRzX2Nyb3NzZWRcbiAgICAgICAgIH5jb21wYXJlOmNvbXBhcmVfa2V5XG4gICAgICAgICB+bG93ZXI6bG93ZXJfYm91bmRcbiAgICAgICAgIH51cHBlcjp1cHBlcl9ib3VuZFxuICAgIHRoZW4gZW1wdHksIGVtcHR5LCBlbXB0eVxuICAgIGVsc2UgKFxuICAgICAgbGV0IGxlZnQsIG1pZF9hbmRfcmlnaHQgPVxuICAgICAgICBtYXRjaCBsb3dlcl9ib3VuZCB3aXRoXG4gICAgICAgIHwgVW5ib3VuZGVkIC0+IGVtcHR5LCB0XG4gICAgICAgIHwgSW5jbCBsYiAtPiBzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkgfmludG86YFJpZ2h0IHQgbGIgfmNvbXBhcmVfa2V5XG4gICAgICAgIHwgRXhjbCBsYiAtPiBzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkgfmludG86YExlZnQgdCBsYiB+Y29tcGFyZV9rZXlcbiAgICAgIGluXG4gICAgICBsZXQgbWlkLCByaWdodCA9XG4gICAgICAgIG1hdGNoIHVwcGVyX2JvdW5kIHdpdGhcbiAgICAgICAgfCBVbmJvdW5kZWQgLT4gbWlkX2FuZF9yaWdodCwgZW1wdHlcbiAgICAgICAgfCBJbmNsIGxiIC0+IHNwbGl0X2FuZF9yZWluc2VydF9ib3VuZGFyeSB+aW50bzpgTGVmdCBtaWRfYW5kX3JpZ2h0IGxiIH5jb21wYXJlX2tleVxuICAgICAgICB8IEV4Y2wgbGIgLT5cbiAgICAgICAgICBzcGxpdF9hbmRfcmVpbnNlcnRfYm91bmRhcnkgfmludG86YFJpZ2h0IG1pZF9hbmRfcmlnaHQgbGIgfmNvbXBhcmVfa2V5XG4gICAgICBpblxuICAgICAgbGVmdCwgbWlkLCByaWdodClcbiAgOztcblxuICBsZXQgcmVjIGZpbmQgdCB4IH5jb21wYXJlX2tleSA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmICh2LCBkKSAtPiBpZiBjb21wYXJlX2tleSB4IHYgPSAwIHRoZW4gU29tZSBkIGVsc2UgTm9uZVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgeCB2IGluXG4gICAgICBpZiBjID0gMCB0aGVuIFNvbWUgZCBlbHNlIGZpbmQgKGlmIGMgPCAwIHRoZW4gbCBlbHNlIHIpIHggfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbGV0IGFkZF9tdWx0aSB0IH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBkYXRhID0gZGF0YSA6OiBPcHRpb24udmFsdWUgKGZpbmQgdCBrZXkgfmNvbXBhcmVfa2V5KSB+ZGVmYXVsdDpbXSBpblxuICAgIHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgdCB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBsZXQgZmluZF9tdWx0aSB0IHggfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCBmaW5kIHQgeCB+Y29tcGFyZV9rZXkgd2l0aFxuICAgIHwgTm9uZSAtPiBbXVxuICAgIHwgU29tZSBsIC0+IGxcbiAgOztcblxuICBsZXQgZmluZF9leG4gPVxuICAgIGxldCBpZl9ub3RfZm91bmQga2V5IH5zZXhwX29mX2tleSA9XG4gICAgICByYWlzZSAoTm90X2ZvdW5kX3MgKExpc3QgWyBBdG9tIFwiTWFwLmZpbmRfZXhuOiBub3QgZm91bmRcIjsgc2V4cF9vZl9rZXkga2V5IF0pKVxuICAgIGluXG4gICAgbGV0IHJlYyBmaW5kX2V4biB0IHggfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gaWZfbm90X2ZvdW5kIHggfnNleHBfb2Zfa2V5XG4gICAgICB8IExlYWYgKHYsIGQpIC0+IGlmIGNvbXBhcmVfa2V5IHggdiA9IDAgdGhlbiBkIGVsc2UgaWZfbm90X2ZvdW5kIHggfnNleHBfb2Zfa2V5XG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwIHRoZW4gZCBlbHNlIGZpbmRfZXhuIChpZiBjIDwgMCB0aGVuIGwgZWxzZSByKSB4IH5jb21wYXJlX2tleSB+c2V4cF9vZl9rZXlcbiAgICBpblxuICAgICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgICBmaW5kX2V4blxuICA7O1xuXG4gIGxldCBtZW0gdCB4IH5jb21wYXJlX2tleSA9IE9wdGlvbi5pc19zb21lIChmaW5kIHQgeCB+Y29tcGFyZV9rZXkpXG5cbiAgbGV0IHJlYyBtaW5fZWx0ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGssIGQpIC0+IFNvbWUgKGssIGQpXG4gICAgfCBOb2RlIChFbXB0eSwgaywgZCwgXywgXykgLT4gU29tZSAoaywgZClcbiAgICB8IE5vZGUgKGwsIF8sIF8sIF8sIF8pIC0+IG1pbl9lbHQgbFxuICA7O1xuXG4gIGV4Y2VwdGlvbiBNYXBfbWluX2VsdF9leG5fb2ZfZW1wdHlfbWFwIFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG4gIGxldCAoKSA9XG4gICAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkXG4gICAgICBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBNYXBfbWluX2VsdF9leG5fb2ZfZW1wdHlfbWFwXVxuICAgICAgKGZ1bmN0aW9uXG4gICAgICAgIHwgTWFwX21pbl9lbHRfZXhuX29mX2VtcHR5X21hcCAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuQXRvbSBcIm1hcC5tbC5UcmVlMC5NYXBfbWluX2VsdF9leG5fb2ZfZW1wdHlfbWFwXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGV4Y2VwdGlvbiBNYXBfbWF4X2VsdF9leG5fb2ZfZW1wdHlfbWFwIFtAQGRlcml2aW5nX2lubGluZSBzZXhwXVxuXG4gIGxldCAoKSA9XG4gICAgU2V4cGxpYjAuU2V4cF9jb252LkV4bl9jb252ZXJ0ZXIuYWRkXG4gICAgICBbJWV4dGVuc2lvbl9jb25zdHJ1Y3RvciBNYXBfbWF4X2VsdF9leG5fb2ZfZW1wdHlfbWFwXVxuICAgICAgKGZ1bmN0aW9uXG4gICAgICAgIHwgTWFwX21heF9lbHRfZXhuX29mX2VtcHR5X21hcCAtPlxuICAgICAgICAgIFNleHBsaWIwLlNleHAuQXRvbSBcIm1hcC5tbC5UcmVlMC5NYXBfbWF4X2VsdF9leG5fb2ZfZW1wdHlfbWFwXCJcbiAgICAgICAgfCBfIC0+IGFzc2VydCBmYWxzZSlcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGxldCBtaW5fZWx0X2V4biB0ID1cbiAgICBtYXRjaCBtaW5fZWx0IHQgd2l0aFxuICAgIHwgTm9uZSAtPiByYWlzZSBNYXBfbWluX2VsdF9leG5fb2ZfZW1wdHlfbWFwXG4gICAgfCBTb21lIHYgLT4gdlxuICA7O1xuXG4gIGxldCByZWMgbWF4X2VsdCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrLCBkKSAtPiBTb21lIChrLCBkKVxuICAgIHwgTm9kZSAoXywgaywgZCwgRW1wdHksIF8pIC0+IFNvbWUgKGssIGQpXG4gICAgfCBOb2RlIChfLCBfLCBfLCByLCBfKSAtPiBtYXhfZWx0IHJcbiAgOztcblxuICBsZXQgbWF4X2VsdF9leG4gdCA9XG4gICAgbWF0Y2ggbWF4X2VsdCB0IHdpdGhcbiAgICB8IE5vbmUgLT4gcmFpc2UgTWFwX21heF9lbHRfZXhuX29mX2VtcHR5X21hcFxuICAgIHwgU29tZSB2IC0+IHZcbiAgOztcblxuICBsZXQgcmVjIHJlbW92ZV9taW5fZWx0IHQgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gaW52YWxpZF9hcmcgXCJNYXAucmVtb3ZlX21pbl9lbHRcIlxuICAgIHwgTGVhZiBfIC0+IEVtcHR5XG4gICAgfCBOb2RlIChFbXB0eSwgXywgXywgciwgXykgLT4gclxuICAgIHwgTm9kZSAobCwgeCwgZCwgciwgXykgLT4gYmFsIChyZW1vdmVfbWluX2VsdCBsKSB4IGQgclxuICA7O1xuXG4gIGxldCBhcHBlbmQgfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnQgfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCBtYXhfZWx0IGxvd2VyX3BhcnQsIG1pbl9lbHQgdXBwZXJfcGFydCB3aXRoXG4gICAgfCBOb25lLCBfIC0+IGBPayB1cHBlcl9wYXJ0XG4gICAgfCBfLCBOb25lIC0+IGBPayBsb3dlcl9wYXJ0XG4gICAgfCBTb21lIChtYXhfbG93ZXIsIF8pLCBTb21lIChtaW5fdXBwZXIsIHYpIHdoZW4gY29tcGFyZV9rZXkgbWF4X2xvd2VyIG1pbl91cHBlciA8IDAgLT5cbiAgICAgIGxldCB1cHBlcl9wYXJ0X3dpdGhvdXRfbWluID0gcmVtb3ZlX21pbl9lbHQgdXBwZXJfcGFydCBpblxuICAgICAgYE9rIChqb2luIH5jb21wYXJlX2tleSBsb3dlcl9wYXJ0IG1pbl91cHBlciB2IHVwcGVyX3BhcnRfd2l0aG91dF9taW4pXG4gICAgfCBfIC0+IGBPdmVybGFwcGluZ19rZXlfcmFuZ2VzXG4gIDs7XG5cbiAgbGV0IGZvbGRfcmFuZ2VfaW5jbHVzaXZlID1cbiAgICAoKiBUaGlzIGFzc3VtZXMgdGhhdCBtaW4gPD0gbWF4LCB3aGljaCBpcyBjaGVja2VkIGJ5IHRoZSBvdXRlciBmdW5jdGlvbi4gKilcbiAgICBsZXQgcmVjIGdvIHQgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gaW5pdFxuICAgICAgfCBMZWFmIChrLCBkKSAtPlxuICAgICAgICBpZiBjb21wYXJlX2tleSBrIG1pbiA8IDAgfHwgY29tcGFyZV9rZXkgayBtYXggPiAwXG4gICAgICAgIHRoZW4gKCogayA8IG1pbiB8fCBrID4gbWF4ICopXG4gICAgICAgICAgaW5pdFxuICAgICAgICBlbHNlIGYgfmtleTprIH5kYXRhOmQgaW5pdFxuICAgICAgfCBOb2RlIChsLCBrLCBkLCByLCBfKSAtPlxuICAgICAgICBsZXQgY19taW4gPSBjb21wYXJlX2tleSBrIG1pbiBpblxuICAgICAgICBpZiBjX21pbiA8IDBcbiAgICAgICAgdGhlblxuICAgICAgICAgICgqIGlmIGsgPCBtaW4sIHRoZW4gdGhpcyBub2RlIGFuZCBpdHMgbGVmdCBicmFuY2ggYXJlIG91dHNpZGUgb3VyIHJhbmdlICopXG4gICAgICAgICAgZ28gciB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5XG4gICAgICAgIGVsc2UgaWYgY19taW4gPSAwXG4gICAgICAgIHRoZW5cbiAgICAgICAgICAoKiBpZiBrID0gbWluLCB0aGVuIHRoaXMgbm9kZSdzIGxlZnQgYnJhbmNoIGlzIG91dHNpZGUgb3VyIHJhbmdlICopXG4gICAgICAgICAgZ28gciB+bWluIH5tYXggfmluaXQ6KGYgfmtleTprIH5kYXRhOmQgaW5pdCkgfmYgfmNvbXBhcmVfa2V5XG4gICAgICAgIGVsc2UgKFxuICAgICAgICAgICgqIGsgPiBtaW4gKilcbiAgICAgICAgICBsZXQgeiA9IGdvIGwgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleSBpblxuICAgICAgICAgIGxldCBjX21heCA9IGNvbXBhcmVfa2V5IGsgbWF4IGluXG4gICAgICAgICAgKCogaWYgayA+IG1heCwgd2UncmUgZG9uZSAqKVxuICAgICAgICAgIGlmIGNfbWF4ID4gMFxuICAgICAgICAgIHRoZW4gelxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IHogPSBmIH5rZXk6ayB+ZGF0YTpkIHogaW5cbiAgICAgICAgICAgICgqIGlmIGsgPSBtYXgsIHRoZW4gd2UgZm9sZCBpbiB0aGlzIG9uZSBsYXN0IHZhbHVlIGFuZCB3ZSdyZSBkb25lICopXG4gICAgICAgICAgICBpZiBjX21heCA9IDAgdGhlbiB6IGVsc2UgZ28gciB+bWluIH5tYXggfmluaXQ6eiB+ZiB+Y29tcGFyZV9rZXkpKVxuICAgIGluXG4gICAgZnVuIHQgfm1pbiB+bWF4IH5pbml0IH5mIH5jb21wYXJlX2tleSAtPlxuICAgICAgaWYgY29tcGFyZV9rZXkgbWluIG1heCA8PSAwIHRoZW4gZ28gdCB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5IGVsc2UgaW5pdFxuICA7O1xuXG4gIGxldCByYW5nZV90b19hbGlzdCB0IH5taW4gfm1heCB+Y29tcGFyZV9rZXkgPVxuICAgIExpc3QucmV2XG4gICAgICAoZm9sZF9yYW5nZV9pbmNsdXNpdmVcbiAgICAgICAgIHRcbiAgICAgICAgIH5taW5cbiAgICAgICAgIH5tYXhcbiAgICAgICAgIH5pbml0OltdXG4gICAgICAgICB+ZjooZnVuIH5rZXkgfmRhdGEgbCAtPiAoa2V5LCBkYXRhKSA6OiBsKVxuICAgICAgICAgfmNvbXBhcmVfa2V5KVxuICA7O1xuXG4gIGxldCBjb25jYXRfdW5jaGVja2VkIHQxIHQyID1cbiAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgIHwgRW1wdHksIHQgLT4gdFxuICAgIHwgdCwgRW1wdHkgLT4gdFxuICAgIHwgXywgXyAtPlxuICAgICAgbGV0IHgsIGQgPSBtaW5fZWx0X2V4biB0MiBpblxuICAgICAgYmFsIHQxIHggZCAocmVtb3ZlX21pbl9lbHQgdDIpXG4gIDs7XG5cbiAgZXhjZXB0aW9uIFJlbW92ZV9ub19vcFxuXG4gIGxldCByZW1vdmUgdCB4IH5sZW5ndGggfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgcmVjIHJlbW92ZV9sb29wIHQgeCB+bGVuZ3RoIH5jb21wYXJlX2tleSA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gRXhuLnJhaXNlX3dpdGhvdXRfYmFja3RyYWNlIFJlbW92ZV9ub19vcFxuICAgICAgfCBMZWFmICh2LCBfKSAtPlxuICAgICAgICBpZiBjb21wYXJlX2tleSB4IHYgPSAwXG4gICAgICAgIHRoZW4gRW1wdHksIGxlbmd0aCAtIDFcbiAgICAgICAgZWxzZSBFeG4ucmFpc2Vfd2l0aG91dF9iYWNrdHJhY2UgUmVtb3ZlX25vX29wXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgeCB2IGluXG4gICAgICAgIGlmIGMgPSAwXG4gICAgICAgIHRoZW4gY29uY2F0X3VuY2hlY2tlZCBsIHIsIGxlbmd0aCAtIDFcbiAgICAgICAgZWxzZSBpZiBjIDwgMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgbCwgbGVuZ3RoID0gcmVtb3ZlX2xvb3AgbCB4IH5sZW5ndGggfmNvbXBhcmVfa2V5IGluXG4gICAgICAgICAgYmFsIGwgdiBkIHIsIGxlbmd0aClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgbGV0IHIsIGxlbmd0aCA9IHJlbW92ZV9sb29wIHIgeCB+bGVuZ3RoIH5jb21wYXJlX2tleSBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgaW5cbiAgICB0cnkgcmVtb3ZlX2xvb3AgdCB4IH5sZW5ndGggfmNvbXBhcmVfa2V5IHdpdGhcbiAgICB8IFJlbW92ZV9ub19vcCAtPiB0LCBsZW5ndGhcbiAgOztcblxuICAoKiBVc2UgZXhjZXB0aW9uIHRvIGF2b2lkIHRyZWUtcmVidWlsZCBpbiBuby1vcCBjYXNlICopXG4gIGV4Y2VwdGlvbiBDaGFuZ2Vfbm9fb3BcblxuICBsZXQgY2hhbmdlIHQga2V5IH5mIH5sZW5ndGggfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgcmVjIGNoYW5nZV9jb3JlIHQga2V5IGYgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+XG4gICAgICAgIChtYXRjaCBmIE5vbmUgd2l0aFxuICAgICAgICAgfCBOb25lIC0+IHJhaXNlIENoYW5nZV9ub19vcCAoKiBlcXVpdmFsZW50IHRvIHJldHVybmluZzogRW1wdHkgKilcbiAgICAgICAgIHwgU29tZSBkYXRhIC0+IExlYWYgKGtleSwgZGF0YSksIGxlbmd0aCArIDEpXG4gICAgICB8IExlYWYgKHYsIGQpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkga2V5IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbWF0Y2ggZiAoU29tZSBkKSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IEVtcHR5LCBsZW5ndGggLSAxXG4gICAgICAgICAgfCBTb21lIGQnIC0+IExlYWYgKHYsIGQnKSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsLCBsZW5ndGggPSBjaGFuZ2VfY29yZSBFbXB0eSBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCBFbXB0eSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgciwgbGVuZ3RoID0gY2hhbmdlX2NvcmUgRW1wdHkga2V5IGYgaW5cbiAgICAgICAgICBiYWwgRW1wdHkgdiBkIHIsIGxlbmd0aClcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgaCkgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrZXkgdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBtYXRjaCBmIChTb21lIGQpIHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gY29uY2F0X3VuY2hlY2tlZCBsIHIsIGxlbmd0aCAtIDFcbiAgICAgICAgICB8IFNvbWUgZGF0YSAtPiBOb2RlIChsLCBrZXksIGRhdGEsIHIsIGgpLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGwsIGxlbmd0aCA9IGNoYW5nZV9jb3JlIGwga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgciwgbGVuZ3RoID0gY2hhbmdlX2NvcmUgciBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgaW5cbiAgICB0cnkgY2hhbmdlX2NvcmUgdCBrZXkgZiB3aXRoXG4gICAgfCBDaGFuZ2Vfbm9fb3AgLT4gdCwgbGVuZ3RoXG4gIDs7XG5cbiAgbGV0IHVwZGF0ZSB0IGtleSB+ZiB+bGVuZ3RoIH5jb21wYXJlX2tleSA9XG4gICAgbGV0IHJlYyB1cGRhdGVfY29yZSB0IGtleSBmID1cbiAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgfCBFbXB0eSAtPlxuICAgICAgICBsZXQgZGF0YSA9IGYgTm9uZSBpblxuICAgICAgICBMZWFmIChrZXksIGRhdGEpLCBsZW5ndGggKyAxXG4gICAgICB8IExlYWYgKHYsIGQpIC0+XG4gICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkga2V5IHYgaW5cbiAgICAgICAgaWYgYyA9IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGQnID0gZiAoU29tZSBkKSBpblxuICAgICAgICAgIExlYWYgKHYsIGQnKSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICAgIHRoZW4gKFxuICAgICAgICAgIGxldCBsLCBsZW5ndGggPSB1cGRhdGVfY29yZSBFbXB0eSBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCBFbXB0eSwgbGVuZ3RoKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgciwgbGVuZ3RoID0gdXBkYXRlX2NvcmUgRW1wdHkga2V5IGYgaW5cbiAgICAgICAgICBiYWwgRW1wdHkgdiBkIHIsIGxlbmd0aClcbiAgICAgIHwgTm9kZSAobCwgdiwgZCwgciwgaCkgLT5cbiAgICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrZXkgdiBpblxuICAgICAgICBpZiBjID0gMFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICBsZXQgZGF0YSA9IGYgKFNvbWUgZCkgaW5cbiAgICAgICAgICBOb2RlIChsLCBrZXksIGRhdGEsIHIsIGgpLCBsZW5ndGgpXG4gICAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IGwsIGxlbmd0aCA9IHVwZGF0ZV9jb3JlIGwga2V5IGYgaW5cbiAgICAgICAgICBiYWwgbCB2IGQgciwgbGVuZ3RoKVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICBsZXQgciwgbGVuZ3RoID0gdXBkYXRlX2NvcmUgciBrZXkgZiBpblxuICAgICAgICAgIGJhbCBsIHYgZCByLCBsZW5ndGgpXG4gICAgaW5cbiAgICB1cGRhdGVfY29yZSB0IGtleSBmXG4gIDs7XG5cbiAgbGV0IHJlbW92ZV9tdWx0aSB0IGtleSB+bGVuZ3RoIH5jb21wYXJlX2tleSA9XG4gICAgY2hhbmdlIHQga2V5IH5sZW5ndGggfmNvbXBhcmVfa2V5IH5mOihmdW5jdGlvblxuICAgICAgfCBOb25lIHwgU29tZSAoW10gfCBbIF8gXSkgLT4gTm9uZVxuICAgICAgfCBTb21lIChfIDo6IChfIDo6IF8gYXMgbm9uX2VtcHR5X3RhaWwpKSAtPiBTb21lIG5vbl9lbXB0eV90YWlsKVxuICA7O1xuXG4gIGxldCByZWMgaXRlcl9rZXlzIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gKClcbiAgICB8IExlYWYgKHYsIF8pIC0+IGYgdlxuICAgIHwgTm9kZSAobCwgdiwgXywgciwgXykgLT5cbiAgICAgIGl0ZXJfa2V5cyB+ZiBsO1xuICAgICAgZiB2O1xuICAgICAgaXRlcl9rZXlzIH5mIHJcbiAgOztcblxuICBsZXQgcmVjIGl0ZXIgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgTGVhZiAoXywgZCkgLT4gZiBkXG4gICAgfCBOb2RlIChsLCBfLCBkLCByLCBfKSAtPlxuICAgICAgaXRlciB+ZiBsO1xuICAgICAgZiBkO1xuICAgICAgaXRlciB+ZiByXG4gIDs7XG5cbiAgbGV0IHJlYyBpdGVyaSB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBMZWFmICh2LCBkKSAtPiBmIH5rZXk6diB+ZGF0YTpkXG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgaXRlcmkgfmYgbDtcbiAgICAgIGYgfmtleTp2IH5kYXRhOmQ7XG4gICAgICBpdGVyaSB+ZiByXG4gIDs7XG5cbiAgbGV0IGl0ZXJpX3VudGlsID1cbiAgICBsZXQgcmVjIGl0ZXJpX3VudGlsX2xvb3AgdCB+ZiA6IENvbnRpbnVlX29yX3N0b3AudCA9XG4gICAgICBtYXRjaCB0IHdpdGhcbiAgICAgIHwgRW1wdHkgLT4gQ29udGludWVcbiAgICAgIHwgTGVhZiAodiwgZCkgLT4gZiB+a2V5OnYgfmRhdGE6ZFxuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgICAobWF0Y2ggaXRlcmlfdW50aWxfbG9vcCB+ZiBsIHdpdGhcbiAgICAgICAgIHwgU3RvcCAtPiBTdG9wXG4gICAgICAgICB8IENvbnRpbnVlIC0+XG4gICAgICAgICAgIChtYXRjaCBmIH5rZXk6diB+ZGF0YTpkIHdpdGhcbiAgICAgICAgICAgIHwgU3RvcCAtPiBTdG9wXG4gICAgICAgICAgICB8IENvbnRpbnVlIC0+IGl0ZXJpX3VudGlsX2xvb3AgfmYgcikpXG4gICAgaW5cbiAgICBmdW4gdCB+ZiAtPiBGaW5pc2hlZF9vcl91bmZpbmlzaGVkLm9mX2NvbnRpbnVlX29yX3N0b3AgKGl0ZXJpX3VudGlsX2xvb3AgdCB+ZilcbiAgOztcblxuICBsZXQgcmVjIG1hcCB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IEVtcHR5XG4gICAgfCBMZWFmICh2LCBkKSAtPiBMZWFmICh2LCBmIGQpXG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBoKSAtPlxuICAgICAgbGV0IGwnID0gbWFwIH5mIGwgaW5cbiAgICAgIGxldCBkJyA9IGYgZCBpblxuICAgICAgbGV0IHInID0gbWFwIH5mIHIgaW5cbiAgICAgIE5vZGUgKGwnLCB2LCBkJywgcicsIGgpXG4gIDs7XG5cbiAgbGV0IHJlYyBtYXBpIHQgfmYgPVxuICAgIG1hdGNoIHQgd2l0aFxuICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICB8IExlYWYgKHYsIGQpIC0+IExlYWYgKHYsIGYgfmtleTp2IH5kYXRhOmQpXG4gICAgfCBOb2RlIChsLCB2LCBkLCByLCBoKSAtPlxuICAgICAgbGV0IGwnID0gbWFwaSB+ZiBsIGluXG4gICAgICBsZXQgZCcgPSBmIH5rZXk6diB+ZGF0YTpkIGluXG4gICAgICBsZXQgcicgPSBtYXBpIH5mIHIgaW5cbiAgICAgIE5vZGUgKGwnLCB2LCBkJywgcicsIGgpXG4gIDs7XG5cbiAgbGV0IHJlYyBmb2xkIHQgfmluaXQ6YWNjdSB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBhY2N1XG4gICAgfCBMZWFmICh2LCBkKSAtPiBmIH5rZXk6diB+ZGF0YTpkIGFjY3VcbiAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+IGZvbGQgfmYgciB+aW5pdDooZiB+a2V5OnYgfmRhdGE6ZCAoZm9sZCB+ZiBsIH5pbml0OmFjY3UpKVxuICA7O1xuXG4gIGxldCBmb2xkX3VudGlsIHQgfmluaXQgfmYgfmZpbmlzaCA9XG4gICAgbGV0IHJlYyBmb2xkX3VudGlsX2xvb3AgdCB+YWNjIH5mIDogKF8sIF8pIENvbnRhaW5lci5Db250aW51ZV9vcl9zdG9wLnQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IENvbnRpbnVlIGFjY1xuICAgICAgfCBMZWFmICh2LCBkKSAtPiBmIH5rZXk6diB+ZGF0YTpkIGFjY1xuICAgICAgfCBOb2RlIChsLCB2LCBkLCByLCBfKSAtPlxuICAgICAgICAobWF0Y2ggZm9sZF91bnRpbF9sb29wIGwgfmFjYyB+ZiB3aXRoXG4gICAgICAgICB8IFN0b3AgZmluYWwgLT4gU3RvcCBmaW5hbFxuICAgICAgICAgfCBDb250aW51ZSBhY2MgLT5cbiAgICAgICAgICAgKG1hdGNoIGYgfmtleTp2IH5kYXRhOmQgYWNjIHdpdGhcbiAgICAgICAgICAgIHwgU3RvcCBmaW5hbCAtPiBTdG9wIGZpbmFsXG4gICAgICAgICAgICB8IENvbnRpbnVlIGFjYyAtPiBmb2xkX3VudGlsX2xvb3AgciB+YWNjIH5mKSlcbiAgICBpblxuICAgIG1hdGNoIGZvbGRfdW50aWxfbG9vcCB0IH5hY2M6aW5pdCB+ZiB3aXRoXG4gICAgfCBDb250aW51ZSBhY2MgLT4gZmluaXNoIGFjY1xuICAgIHwgU3RvcCBzdG9wIC0+IHN0b3BcbiAgOztcblxuICBsZXQgcmVjIGZvbGRfcmlnaHQgdCB+aW5pdDphY2N1IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IGFjY3VcbiAgICB8IExlYWYgKHYsIGQpIC0+IGYgfmtleTp2IH5kYXRhOmQgYWNjdVxuICAgIHwgTm9kZSAobCwgdiwgZCwgciwgXykgLT5cbiAgICAgIGZvbGRfcmlnaHQgfmYgbCB+aW5pdDooZiB+a2V5OnYgfmRhdGE6ZCAoZm9sZF9yaWdodCB+ZiByIH5pbml0OmFjY3UpKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfa2V5cyB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZCB+aW5pdDooRW1wdHksIDApIHQgfmY6KGZ1biB+a2V5IH5kYXRhIChhY2N1LCBsZW5ndGgpIC0+XG4gICAgICBpZiBmIGtleSB0aGVuIHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgYWNjdSB+Y29tcGFyZV9rZXkgZWxzZSBhY2N1LCBsZW5ndGgpXG4gIDs7XG5cblxuICBsZXQgZmlsdGVyIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBmb2xkIH5pbml0OihFbXB0eSwgMCkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgKGFjY3UsIGxlbmd0aCkgLT5cbiAgICAgIGlmIGYgZGF0YSB0aGVuIHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgYWNjdSB+Y29tcGFyZV9rZXkgZWxzZSBhY2N1LCBsZW5ndGgpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcmkgdCB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGZvbGQgfmluaXQ6KEVtcHR5LCAwKSB0IH5mOihmdW4gfmtleSB+ZGF0YSAoYWNjdSwgbGVuZ3RoKSAtPlxuICAgICAgaWYgZiB+a2V5IH5kYXRhIHRoZW4gc2V0IH5sZW5ndGggfmtleSB+ZGF0YSBhY2N1IH5jb21wYXJlX2tleSBlbHNlIGFjY3UsIGxlbmd0aClcbiAgOztcblxuICBsZXQgZmlsdGVyX21hcCB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZCB+aW5pdDooRW1wdHksIDApIHQgfmY6KGZ1biB+a2V5IH5kYXRhIChhY2N1LCBsZW5ndGgpIC0+XG4gICAgICBtYXRjaCBmIGRhdGEgd2l0aFxuICAgICAgfCBOb25lIC0+IGFjY3UsIGxlbmd0aFxuICAgICAgfCBTb21lIGIgLT4gc2V0IH5sZW5ndGggfmtleSB+ZGF0YTpiIGFjY3UgfmNvbXBhcmVfa2V5KVxuICA7O1xuXG4gIGxldCBmaWx0ZXJfbWFwaSB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZCB+aW5pdDooRW1wdHksIDApIHQgfmY6KGZ1biB+a2V5IH5kYXRhIChhY2N1LCBsZW5ndGgpIC0+XG4gICAgICBtYXRjaCBmIH5rZXkgfmRhdGEgd2l0aFxuICAgICAgfCBOb25lIC0+IGFjY3UsIGxlbmd0aFxuICAgICAgfCBTb21lIGIgLT4gc2V0IH5sZW5ndGggfmtleSB+ZGF0YTpiIGFjY3UgfmNvbXBhcmVfa2V5KVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fbWFwaSB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgZm9sZFxuICAgICAgdFxuICAgICAgfmluaXQ6KChFbXB0eSwgMCksIChFbXB0eSwgMCkpXG4gICAgICB+ZjooZnVuIH5rZXkgfmRhdGEgKHBhaXIxLCBwYWlyMikgLT5cbiAgICAgICAgbWF0Y2ggKGYgfmtleSB+ZGF0YSA6IF8gRWl0aGVyLnQpIHdpdGhcbiAgICAgICAgfCBGaXJzdCB4IC0+XG4gICAgICAgICAgbGV0IHQsIGxlbmd0aCA9IHBhaXIxIGluXG4gICAgICAgICAgc2V0IHQgfmtleSB+ZGF0YTp4IH5jb21wYXJlX2tleSB+bGVuZ3RoLCBwYWlyMlxuICAgICAgICB8IFNlY29uZCB5IC0+XG4gICAgICAgICAgbGV0IHQsIGxlbmd0aCA9IHBhaXIyIGluXG4gICAgICAgICAgcGFpcjEsIHNldCB0IH5rZXkgfmRhdGE6eSB+Y29tcGFyZV9rZXkgfmxlbmd0aClcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX21hcCB0IH5mIH5jb21wYXJlX2tleSA9XG4gICAgcGFydGl0aW9uX21hcGkgdCB+Y29tcGFyZV9rZXkgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25pX3RmIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBwYXJ0aXRpb25fbWFwaSB0IH5jb21wYXJlX2tleSB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICAgIGlmIGYgfmtleSB+ZGF0YSB0aGVuIEZpcnN0IGRhdGEgZWxzZSBTZWNvbmQgZGF0YSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX3RmIHQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBwYXJ0aXRpb25fbWFwaSB0IH5jb21wYXJlX2tleSB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPlxuICAgICAgaWYgZiBkYXRhIHRoZW4gRmlyc3QgZGF0YSBlbHNlIFNlY29uZCBkYXRhKVxuICA7O1xuXG4gIG1vZHVsZSBFbnVtID0gc3RydWN0XG4gICAgdHlwZSBpbmNyZWFzaW5nXG4gICAgdHlwZSBkZWNyZWFzaW5nXG5cbiAgICB0eXBlICgnaywgJ3YsICdkaXJlY3Rpb24pIHQgPVxuICAgICAgfCBFbmRcbiAgICAgIHwgTW9yZSBvZiAnayAqICd2ICogKCdrLCAndikgdHJlZSAqICgnaywgJ3YsICdkaXJlY3Rpb24pIHRcblxuICAgIGxldCByZWMgY29ucyB0IChlIDogKF8sIF8sIGluY3JlYXNpbmcpIHQpIDogKF8sIF8sIGluY3JlYXNpbmcpIHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGVcbiAgICAgIHwgTGVhZiAodiwgZCkgLT4gTW9yZSAodiwgZCwgRW1wdHksIGUpXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+IGNvbnMgbCAoTW9yZSAodiwgZCwgciwgZSkpXG4gICAgOztcblxuICAgIGxldCByZWMgY29uc19yaWdodCB0IChlIDogKF8sIF8sIGRlY3JlYXNpbmcpIHQpIDogKF8sIF8sIGRlY3JlYXNpbmcpIHQgPVxuICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICB8IEVtcHR5IC0+IGVcbiAgICAgIHwgTGVhZiAodiwgZCkgLT4gTW9yZSAodiwgZCwgRW1wdHksIGUpXG4gICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+IGNvbnNfcmlnaHQgciAoTW9yZSAodiwgZCwgbCwgZSkpXG4gICAgOztcblxuICAgIGxldCBvZl90cmVlIHRyZWUgOiAoXywgXywgaW5jcmVhc2luZykgdCA9IGNvbnMgdHJlZSBFbmRcbiAgICBsZXQgb2ZfdHJlZV9yaWdodCB0cmVlIDogKF8sIF8sIGRlY3JlYXNpbmcpIHQgPSBjb25zX3JpZ2h0IHRyZWUgRW5kXG5cbiAgICBsZXQgc3RhcnRpbmdfYXRfaW5jcmVhc2luZyB0IGtleSBjb21wYXJlIDogKF8sIF8sIGluY3JlYXNpbmcpIHQgPVxuICAgICAgbGV0IHJlYyBsb29wIHQgZSA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGVcbiAgICAgICAgfCBMZWFmICh2LCBkKSAtPiBsb29wIChOb2RlIChFbXB0eSwgdiwgZCwgRW1wdHksIDEpKSBlXG4gICAgICAgIHwgTm9kZSAoXywgdiwgXywgciwgXykgd2hlbiBjb21wYXJlIHYga2V5IDwgMCAtPiBsb29wIHIgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+IGxvb3AgbCAoTW9yZSAodiwgZCwgciwgZSkpXG4gICAgICBpblxuICAgICAgbG9vcCB0IEVuZFxuICAgIDs7XG5cbiAgICBsZXQgc3RhcnRpbmdfYXRfZGVjcmVhc2luZyB0IGtleSBjb21wYXJlIDogKF8sIF8sIGRlY3JlYXNpbmcpIHQgPVxuICAgICAgbGV0IHJlYyBsb29wIHQgZSA9XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IGVcbiAgICAgICAgfCBMZWFmICh2LCBkKSAtPiBsb29wIChOb2RlIChFbXB0eSwgdiwgZCwgRW1wdHksIDEpKSBlXG4gICAgICAgIHwgTm9kZSAobCwgdiwgXywgXywgXykgd2hlbiBjb21wYXJlIHYga2V5ID4gMCAtPiBsb29wIGwgZVxuICAgICAgICB8IE5vZGUgKGwsIHYsIGQsIHIsIF8pIC0+IGxvb3AgciAoTW9yZSAodiwgZCwgbCwgZSkpXG4gICAgICBpblxuICAgICAgbG9vcCB0IEVuZFxuICAgIDs7XG5cbiAgICBsZXQgY29tcGFyZSBjb21wYXJlX2tleSBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgICAgbGV0IHJlYyBsb29wIHQxIHQyID1cbiAgICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiAwXG4gICAgICAgIHwgRW5kLCBfIC0+IC0xXG4gICAgICAgIHwgXywgRW5kIC0+IDFcbiAgICAgICAgfCBNb3JlICh2MSwgZDEsIHIxLCBlMSksIE1vcmUgKHYyLCBkMiwgcjIsIGUyKSAtPlxuICAgICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgdjEgdjIgaW5cbiAgICAgICAgICBpZiBjIDw+IDBcbiAgICAgICAgICB0aGVuIGNcbiAgICAgICAgICBlbHNlIChcbiAgICAgICAgICAgIGxldCBjID0gY29tcGFyZV9kYXRhIGQxIGQyIGluXG4gICAgICAgICAgICBpZiBjIDw+IDBcbiAgICAgICAgICAgIHRoZW4gY1xuICAgICAgICAgICAgZWxzZSBpZiBwaHlzX2VxdWFsIHIxIHIyXG4gICAgICAgICAgICB0aGVuIGxvb3AgZTEgZTJcbiAgICAgICAgICAgIGVsc2UgbG9vcCAoY29ucyByMSBlMSkgKGNvbnMgcjIgZTIpKVxuICAgICAgaW5cbiAgICAgIGxvb3AgdDEgdDJcbiAgICA7O1xuXG4gICAgbGV0IGVxdWFsIGNvbXBhcmVfa2V5IGRhdGFfZXF1YWwgdDEgdDIgPVxuICAgICAgbGV0IHJlYyBsb29wIHQxIHQyID1cbiAgICAgICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiB0cnVlXG4gICAgICAgIHwgRW5kLCBfIHwgXywgRW5kIC0+IGZhbHNlXG4gICAgICAgIHwgTW9yZSAodjEsIGQxLCByMSwgZTEpLCBNb3JlICh2MiwgZDIsIHIyLCBlMikgLT5cbiAgICAgICAgICBjb21wYXJlX2tleSB2MSB2MiA9IDBcbiAgICAgICAgICAmJiBkYXRhX2VxdWFsIGQxIGQyXG4gICAgICAgICAgJiYgaWYgcGh5c19lcXVhbCByMSByMiB0aGVuIGxvb3AgZTEgZTIgZWxzZSBsb29wIChjb25zIHIxIGUxKSAoY29ucyByMiBlMilcbiAgICAgIGluXG4gICAgICBsb29wIHQxIHQyXG4gICAgOztcblxuICAgIGxldCByZWMgZm9sZCB+aW5pdCB+ZiA9IGZ1bmN0aW9uXG4gICAgICB8IEVuZCAtPiBpbml0XG4gICAgICB8IE1vcmUgKGtleSwgZGF0YSwgdHJlZSwgZW51bSkgLT5cbiAgICAgICAgbGV0IG5leHQgPSBmIH5rZXkgfmRhdGEgaW5pdCBpblxuICAgICAgICBmb2xkIChjb25zIHRyZWUgZW51bSkgfmluaXQ6bmV4dCB+ZlxuICAgIDs7XG5cbiAgICBsZXQgZm9sZDIgY29tcGFyZV9rZXkgdDEgdDIgfmluaXQgfmYgPVxuICAgICAgbGV0IHJlYyBsb29wIHQxIHQyIGN1cnIgPVxuICAgICAgICBtYXRjaCB0MSwgdDIgd2l0aFxuICAgICAgICB8IEVuZCwgRW5kIC0+IGN1cnJcbiAgICAgICAgfCBFbmQsIF8gLT5cbiAgICAgICAgICBmb2xkIHQyIH5pbml0OmN1cnIgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBmIH5rZXkgfmRhdGE6KGBSaWdodCBkYXRhKSBhY2MpXG4gICAgICAgIHwgXywgRW5kIC0+XG4gICAgICAgICAgZm9sZCB0MSB+aW5pdDpjdXJyIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gZiB+a2V5IH5kYXRhOihgTGVmdCBkYXRhKSBhY2MpXG4gICAgICAgIHwgTW9yZSAoazEsIHYxLCB0cmVlMSwgZW51bTEpLCBNb3JlIChrMiwgdjIsIHRyZWUyLCBlbnVtMikgLT5cbiAgICAgICAgICBsZXQgY29tcGFyZV9yZXN1bHQgPSBjb21wYXJlX2tleSBrMSBrMiBpblxuICAgICAgICAgIGlmIGNvbXBhcmVfcmVzdWx0ID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IG5leHQgPSBmIH5rZXk6azEgfmRhdGE6KGBCb3RoICh2MSwgdjIpKSBjdXJyIGluXG4gICAgICAgICAgICBsb29wIChjb25zIHRyZWUxIGVudW0xKSAoY29ucyB0cmVlMiBlbnVtMikgbmV4dClcbiAgICAgICAgICBlbHNlIGlmIGNvbXBhcmVfcmVzdWx0IDwgMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgbGV0IG5leHQgPSBmIH5rZXk6azEgfmRhdGE6KGBMZWZ0IHYxKSBjdXJyIGluXG4gICAgICAgICAgICBsb29wIChjb25zIHRyZWUxIGVudW0xKSB0MiBuZXh0KVxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgbGV0IG5leHQgPSBmIH5rZXk6azIgfmRhdGE6KGBSaWdodCB2MikgY3VyciBpblxuICAgICAgICAgICAgbG9vcCB0MSAoY29ucyB0cmVlMiBlbnVtMikgbmV4dClcbiAgICAgIGluXG4gICAgICBsb29wIHQxIHQyIGluaXRcbiAgICA7O1xuXG4gICAgbGV0IHN5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2tleSB+ZGF0YV9lcXVhbCA9XG4gICAgICBsZXQgc3RlcCBzdGF0ZSA9XG4gICAgICAgIG1hdGNoIHN0YXRlIHdpdGhcbiAgICAgICAgfCBFbmQsIEVuZCAtPiBTZXF1ZW5jZS5TdGVwLkRvbmVcbiAgICAgICAgfCBFbmQsIE1vcmUgKGtleSwgZGF0YSwgdHJlZSwgZW51bSkgLT5cbiAgICAgICAgICBTZXF1ZW5jZS5TdGVwLllpZWxkICgoa2V5LCBgUmlnaHQgZGF0YSksIChFbmQsIGNvbnMgdHJlZSBlbnVtKSlcbiAgICAgICAgfCBNb3JlIChrZXksIGRhdGEsIHRyZWUsIGVudW0pLCBFbmQgLT5cbiAgICAgICAgICBTZXF1ZW5jZS5TdGVwLllpZWxkICgoa2V5LCBgTGVmdCBkYXRhKSwgKGNvbnMgdHJlZSBlbnVtLCBFbmQpKVxuICAgICAgICB8IChNb3JlIChrMSwgdjEsIHRyZWUxLCBlbnVtMSkgYXMgbGVmdCksIChNb3JlIChrMiwgdjIsIHRyZWUyLCBlbnVtMikgYXMgcmlnaHQpIC0+XG4gICAgICAgICAgbGV0IGNvbXBhcmVfcmVzdWx0ID0gY29tcGFyZV9rZXkgazEgazIgaW5cbiAgICAgICAgICBpZiBjb21wYXJlX3Jlc3VsdCA9IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBuZXh0X3N0YXRlID1cbiAgICAgICAgICAgICAgaWYgcGh5c19lcXVhbCB0cmVlMSB0cmVlMlxuICAgICAgICAgICAgICB0aGVuIGVudW0xLCBlbnVtMlxuICAgICAgICAgICAgICBlbHNlIGNvbnMgdHJlZTEgZW51bTEsIGNvbnMgdHJlZTIgZW51bTJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBpZiBkYXRhX2VxdWFsIHYxIHYyXG4gICAgICAgICAgICB0aGVuIFNlcXVlbmNlLlN0ZXAuU2tpcCBuZXh0X3N0YXRlXG4gICAgICAgICAgICBlbHNlIFNlcXVlbmNlLlN0ZXAuWWllbGQgKChrMSwgYFVuZXF1YWwgKHYxLCB2MikpLCBuZXh0X3N0YXRlKSlcbiAgICAgICAgICBlbHNlIGlmIGNvbXBhcmVfcmVzdWx0IDwgMFxuICAgICAgICAgIHRoZW4gU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGsxLCBgTGVmdCB2MSksIChjb25zIHRyZWUxIGVudW0xLCByaWdodCkpXG4gICAgICAgICAgZWxzZSBTZXF1ZW5jZS5TdGVwLllpZWxkICgoazIsIGBSaWdodCB2MiksIChsZWZ0LCBjb25zIHRyZWUyIGVudW0yKSlcbiAgICAgIGluXG4gICAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdDoob2ZfdHJlZSB0MSwgb2ZfdHJlZSB0MikgfmY6c3RlcFxuICAgIDs7XG5cbiAgICBsZXQgZm9sZF9zeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9rZXkgfmRhdGFfZXF1YWwgfmluaXQgfmYgPVxuICAgICAgbGV0IGFkZCBhY2MgayB2ID0gZiBhY2MgKGssIGBSaWdodCB2KSBpblxuICAgICAgbGV0IHJlbW92ZSBhY2MgayB2ID0gZiBhY2MgKGssIGBMZWZ0IHYpIGluXG4gICAgICBsZXQgcmVjIGxvb3AgbGVmdCByaWdodCBhY2MgPVxuICAgICAgICBtYXRjaCBsZWZ0LCByaWdodCB3aXRoXG4gICAgICAgIHwgRW5kLCBlbnVtIC0+IGZvbGQgZW51bSB+aW5pdDphY2MgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBhZGQgYWNjIGtleSBkYXRhKVxuICAgICAgICB8IGVudW0sIEVuZCAtPiBmb2xkIGVudW0gfmluaXQ6YWNjIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gcmVtb3ZlIGFjYyBrZXkgZGF0YSlcbiAgICAgICAgfCAoTW9yZSAoazEsIHYxLCB0cmVlMSwgZW51bTEpIGFzIGxlZnQpLCAoTW9yZSAoazIsIHYyLCB0cmVlMiwgZW51bTIpIGFzIHJpZ2h0KSAtPlxuICAgICAgICAgIGxldCBjb21wYXJlX3Jlc3VsdCA9IGNvbXBhcmVfa2V5IGsxIGsyIGluXG4gICAgICAgICAgaWYgY29tcGFyZV9yZXN1bHQgPSAwXG4gICAgICAgICAgdGhlbiAoXG4gICAgICAgICAgICBsZXQgYWNjID0gaWYgZGF0YV9lcXVhbCB2MSB2MiB0aGVuIGFjYyBlbHNlIGYgYWNjIChrMSwgYFVuZXF1YWwgKHYxLCB2MikpIGluXG4gICAgICAgICAgICBpZiBwaHlzX2VxdWFsIHRyZWUxIHRyZWUyXG4gICAgICAgICAgICB0aGVuIGxvb3AgZW51bTEgZW51bTIgYWNjXG4gICAgICAgICAgICBlbHNlIGxvb3AgKGNvbnMgdHJlZTEgZW51bTEpIChjb25zIHRyZWUyIGVudW0yKSBhY2MpXG4gICAgICAgICAgZWxzZSBpZiBjb21wYXJlX3Jlc3VsdCA8IDBcbiAgICAgICAgICB0aGVuIChcbiAgICAgICAgICAgIGxldCBhY2MgPSByZW1vdmUgYWNjIGsxIHYxIGluXG4gICAgICAgICAgICBsb29wIChjb25zIHRyZWUxIGVudW0xKSByaWdodCBhY2MpXG4gICAgICAgICAgZWxzZSAoXG4gICAgICAgICAgICBsZXQgYWNjID0gYWRkIGFjYyBrMiB2MiBpblxuICAgICAgICAgICAgbG9vcCBsZWZ0IChjb25zIHRyZWUyIGVudW0yKSBhY2MpXG4gICAgICBpblxuICAgICAgbG9vcCAob2ZfdHJlZSB0MSkgKG9mX3RyZWUgdDIpIGluaXRcbiAgICA7O1xuICBlbmRcblxuICBsZXQgdG9fc2VxdWVuY2VfaW5jcmVhc2luZyBjb21wYXJhdG9yIH5mcm9tX2tleSB0ID1cbiAgICBsZXQgbmV4dCBlbnVtID1cbiAgICAgIG1hdGNoIGVudW0gd2l0aFxuICAgICAgfCBFbnVtLkVuZCAtPiBTZXF1ZW5jZS5TdGVwLkRvbmVcbiAgICAgIHwgRW51bS5Nb3JlIChrLCB2LCB0LCBlKSAtPiBTZXF1ZW5jZS5TdGVwLllpZWxkICgoaywgdiksIEVudW0uY29ucyB0IGUpXG4gICAgaW5cbiAgICBsZXQgaW5pdCA9XG4gICAgICBtYXRjaCBmcm9tX2tleSB3aXRoXG4gICAgICB8IE5vbmUgLT4gRW51bS5vZl90cmVlIHRcbiAgICAgIHwgU29tZSBrZXkgLT4gRW51bS5zdGFydGluZ19hdF9pbmNyZWFzaW5nIHQga2V5IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBTZXF1ZW5jZS51bmZvbGRfc3RlcCB+aW5pdCB+ZjpuZXh0XG4gIDs7XG5cbiAgbGV0IHRvX3NlcXVlbmNlX2RlY3JlYXNpbmcgY29tcGFyYXRvciB+ZnJvbV9rZXkgdCA9XG4gICAgbGV0IG5leHQgZW51bSA9XG4gICAgICBtYXRjaCBlbnVtIHdpdGhcbiAgICAgIHwgRW51bS5FbmQgLT4gU2VxdWVuY2UuU3RlcC5Eb25lXG4gICAgICB8IEVudW0uTW9yZSAoaywgdiwgdCwgZSkgLT4gU2VxdWVuY2UuU3RlcC5ZaWVsZCAoKGssIHYpLCBFbnVtLmNvbnNfcmlnaHQgdCBlKVxuICAgIGluXG4gICAgbGV0IGluaXQgPVxuICAgICAgbWF0Y2ggZnJvbV9rZXkgd2l0aFxuICAgICAgfCBOb25lIC0+IEVudW0ub2ZfdHJlZV9yaWdodCB0XG4gICAgICB8IFNvbWUga2V5IC0+IEVudW0uc3RhcnRpbmdfYXRfZGVjcmVhc2luZyB0IGtleSBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgU2VxdWVuY2UudW5mb2xkX3N0ZXAgfmluaXQgfmY6bmV4dFxuICA7O1xuXG4gIGxldCB0b19zZXF1ZW5jZVxuICAgICAgICBjb21wYXJhdG9yXG4gICAgICAgID8ob3JkZXIgPSBgSW5jcmVhc2luZ19rZXkpXG4gICAgICAgID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG9cbiAgICAgICAgP2tleXNfbGVzc19vcl9lcXVhbF90b1xuICAgICAgICB0XG4gICAgPVxuICAgIGxldCBpbmNsdXNpdmVfYm91bmQgc2lkZSB0IGJvdW5kID1cbiAgICAgIGxldCBjb21wYXJlX2tleSA9IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIGluXG4gICAgICBsZXQgbCwgbWF5YmUsIHIgPSBzcGxpdCB0IGJvdW5kIH5jb21wYXJlX2tleSBpblxuICAgICAgbGV0IHQgPSBzaWRlIChsLCByKSBpblxuICAgICAgbWF0Y2ggbWF5YmUgd2l0aFxuICAgICAgfCBOb25lIC0+IHRcbiAgICAgIHwgU29tZSAoa2V5LCBkYXRhKSAtPiBzZXQnIHQga2V5IGRhdGEgfmNvbXBhcmVfa2V5XG4gICAgaW5cbiAgICBtYXRjaCBvcmRlciB3aXRoXG4gICAgfCBgSW5jcmVhc2luZ19rZXkgLT5cbiAgICAgIGxldCB0ID0gT3B0aW9uLmZvbGQga2V5c19sZXNzX29yX2VxdWFsX3RvIH5pbml0OnQgfmY6KGluY2x1c2l2ZV9ib3VuZCBmc3QpIGluXG4gICAgICB0b19zZXF1ZW5jZV9pbmNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fa2V5OmtleXNfZ3JlYXRlcl9vcl9lcXVhbF90byB0XG4gICAgfCBgRGVjcmVhc2luZ19rZXkgLT5cbiAgICAgIGxldCB0ID0gT3B0aW9uLmZvbGQga2V5c19ncmVhdGVyX29yX2VxdWFsX3RvIH5pbml0OnQgfmY6KGluY2x1c2l2ZV9ib3VuZCBzbmQpIGluXG4gICAgICB0b19zZXF1ZW5jZV9kZWNyZWFzaW5nIGNvbXBhcmF0b3IgfmZyb21fa2V5OmtleXNfbGVzc19vcl9lcXVhbF90byB0XG4gIDs7XG5cbiAgbGV0IGNvbXBhcmUgY29tcGFyZV9rZXkgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICBFbnVtLmNvbXBhcmUgY29tcGFyZV9rZXkgY29tcGFyZV9kYXRhIChFbnVtLm9mX3RyZWUgdDEpIChFbnVtLm9mX3RyZWUgdDIpXG4gIDs7XG5cbiAgbGV0IGVxdWFsIGNvbXBhcmVfa2V5IGNvbXBhcmVfZGF0YSB0MSB0MiA9XG4gICAgRW51bS5lcXVhbCBjb21wYXJlX2tleSBjb21wYXJlX2RhdGEgKEVudW0ub2ZfdHJlZSB0MSkgKEVudW0ub2ZfdHJlZSB0MilcbiAgOztcblxuICBsZXQgaXRlcjIgdDEgdDIgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBFbnVtLmZvbGQyXG4gICAgICBjb21wYXJlX2tleVxuICAgICAgKEVudW0ub2ZfdHJlZSB0MSlcbiAgICAgIChFbnVtLm9mX3RyZWUgdDIpXG4gICAgICB+aW5pdDooKVxuICAgICAgfmY6KGZ1biB+a2V5IH5kYXRhICgpIC0+IGYgfmtleSB+ZGF0YSlcbiAgOztcblxuICBsZXQgZm9sZDIgdDEgdDIgfmluaXQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICBFbnVtLmZvbGQyIGNvbXBhcmVfa2V5IChFbnVtLm9mX3RyZWUgdDEpIChFbnVtLm9mX3RyZWUgdDIpIH5mIH5pbml0XG4gIDs7XG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmID0gRW51bS5zeW1tZXRyaWNfZGlmZlxuXG4gIGxldCBmb2xkX3N5bW1ldHJpY19kaWZmIHQxIHQyIH5jb21wYXJlX2tleSB+ZGF0YV9lcXVhbCB+aW5pdCB+ZiA9XG4gICAgKCogW0VudW0uZm9sZF9kaWZmc10gaXMgYSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBpcyBjb25zaWRlcmFibHlcbiAgICAgICBzbG93ZXIsIGFzIHdlIGhhdmUgdG8gYWxsb2NhdGUgcXVpdGUgYSBsb3Qgb2Ygc3RhdGUgdG8gdHJhY2sgZW51bWVyYXRpb24gb2YgYSB0cmVlLlxuICAgICAgIEF2b2lkIGlmIHdlIGNhbi5cbiAgICAqKVxuICAgIGxldCBzbG93IHggeSB+aW5pdCA9IEVudW0uZm9sZF9zeW1tZXRyaWNfZGlmZiB4IHkgfmNvbXBhcmVfa2V5IH5kYXRhX2VxdWFsIH5mIH5pbml0IGluXG4gICAgbGV0IGFkZCBhY2MgayB2ID0gZiBhY2MgKGssIGBSaWdodCB2KSBpblxuICAgIGxldCByZW1vdmUgYWNjIGsgdiA9IGYgYWNjIChrLCBgTGVmdCB2KSBpblxuICAgIGxldCBkZWx0YSBhY2MgayB2IHYnID0gaWYgZGF0YV9lcXVhbCB2IHYnIHRoZW4gYWNjIGVsc2UgZiBhY2MgKGssIGBVbmVxdWFsICh2LCB2JykpIGluXG4gICAgKCogSWYgdHdvIHRyZWVzIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIGF0IHRoZSByb290IChhbmQgdGhlIHNhbWUga2V5LCBpZiB0aGV5J3JlXG4gICAgICAgW05vZGVdcykgd2UgY2FuIHRyaXZpYWxseSBkaWZmIGVhY2ggc3VicGFydCBpbiBvYnZpb3VzIHdheXMuICopXG4gICAgbGV0IHJlYyBsb29wIHQgdCcgYWNjID1cbiAgICAgIGlmIHBoeXNfZXF1YWwgdCB0J1xuICAgICAgdGhlbiBhY2NcbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCB0LCB0JyB3aXRoXG4gICAgICAgIHwgRW1wdHksIG5ld192YWxzIC0+XG4gICAgICAgICAgZm9sZCBuZXdfdmFscyB+aW5pdDphY2MgfmY6KGZ1biB+a2V5IH5kYXRhIGFjYyAtPiBhZGQgYWNjIGtleSBkYXRhKVxuICAgICAgICB8IG9sZF92YWxzLCBFbXB0eSAtPlxuICAgICAgICAgIGZvbGQgb2xkX3ZhbHMgfmluaXQ6YWNjIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gcmVtb3ZlIGFjYyBrZXkgZGF0YSlcbiAgICAgICAgfCBMZWFmIChrLCB2KSwgTGVhZiAoaycsIHYnKSAtPlxuICAgICAgICAgIChtYXRjaCBjb21wYXJlX2tleSBrIGsnIHdpdGhcbiAgICAgICAgICAgfCB4IHdoZW4geCA9IDAgLT4gZGVsdGEgYWNjIGsgdiB2J1xuICAgICAgICAgICB8IHggd2hlbiB4IDwgMCAtPlxuICAgICAgICAgICAgIGxldCBhY2MgPSByZW1vdmUgYWNjIGsgdiBpblxuICAgICAgICAgICAgIGFkZCBhY2MgaycgdidcbiAgICAgICAgICAgfCBfICgqIHdoZW4geCA+IDAgKikgLT5cbiAgICAgICAgICAgICBsZXQgYWNjID0gYWRkIGFjYyBrJyB2JyBpblxuICAgICAgICAgICAgIHJlbW92ZSBhY2MgayB2KVxuICAgICAgICB8IE5vZGUgKGwsIGssIHYsIHIsIF8pLCBOb2RlIChsJywgaycsIHYnLCByJywgXykgd2hlbiBjb21wYXJlX2tleSBrIGsnID0gMCAtPlxuICAgICAgICAgIGxldCBhY2MgPSBsb29wIGwgbCcgYWNjIGluXG4gICAgICAgICAgbGV0IGFjYyA9IGRlbHRhIGFjYyBrIHYgdicgaW5cbiAgICAgICAgICBsb29wIHIgcicgYWNjXG4gICAgICAgICgqIE91ciByb290cyBhcmVuJ3QgdGhlIHNhbWUga2V5LiBGYWxsYmFjayB0byB0aGUgc2xvdyBtb2RlLiBUcmVlcyB3aXRoIHNtYWxsXG4gICAgICAgICAgIGRpZmZzIHdpbGwgb25seSBkbyB0aGlzIG9uIHZlcnkgc21hbGwgcGFydHMgb2YgdGhlIHRyZWUgKGhvcGVmdWxseSAtIGlmIHRoZVxuICAgICAgICAgICBvdmVyYWxsIHJvb3QgaXMgcmViYWxhbmNlZCwgd2UnbGwgZWF0IHRoZSB3aG9sZSBjb3N0LCB1bmZvcnR1bmF0ZWx5LikgKilcbiAgICAgICAgfCBOb2RlIF8sIE5vZGUgXyB8IE5vZGUgXywgTGVhZiBfIHwgTGVhZiBfLCBOb2RlIF8gLT4gc2xvdyB0IHQnIH5pbml0OmFjYylcbiAgICBpblxuICAgIGxvb3AgdDEgdDIgaW5pdFxuICA7O1xuXG4gIGxldCByZWMgbGVuZ3RoID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+IDBcbiAgICB8IExlYWYgXyAtPiAxXG4gICAgfCBOb2RlIChsLCBfLCBfLCByLCBfKSAtPiBsZW5ndGggbCArIGxlbmd0aCByICsgMVxuICA7O1xuXG4gIGxldCBoYXNoX2ZvbGRfdF9pZ25vcmluZ19zdHJ1Y3R1cmUgaGFzaF9mb2xkX2tleSBoYXNoX2ZvbGRfZGF0YSBzdGF0ZSB0ID1cbiAgICBmb2xkXG4gICAgICB0XG4gICAgICB+aW5pdDooaGFzaF9mb2xkX2ludCBzdGF0ZSAobGVuZ3RoIHQpKVxuICAgICAgfmY6KGZ1biB+a2V5IH5kYXRhIHN0YXRlIC0+IGhhc2hfZm9sZF9kYXRhIChoYXNoX2ZvbGRfa2V5IHN0YXRlIGtleSkgZGF0YSlcbiAgOztcblxuICBsZXQga2V5cyB0ID0gZm9sZF9yaWdodCB+ZjooZnVuIH5rZXkgfmRhdGE6XyBsaXN0IC0+IGtleSA6OiBsaXN0KSB0IH5pbml0OltdXG4gIGxldCBkYXRhIHQgPSBmb2xkX3JpZ2h0IH5mOihmdW4gfmtleTpfIH5kYXRhIGxpc3QgLT4gZGF0YSA6OiBsaXN0KSB0IH5pbml0OltdXG5cbiAgbW9kdWxlIHR5cGUgRm9sZGFibGUgPSBzaWdcbiAgICB2YWwgbmFtZSA6IHN0cmluZ1xuXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgZm9sZCA6ICdhIHQgLT4gaW5pdDonYiAtPiBmOignYiAtPiAnYSAtPiAnYikgLT4gJ2JcbiAgZW5kXG5cbiAgbW9kdWxlIE9mX2ZvbGRhYmxlIChNIDogRm9sZGFibGUpID0gc3RydWN0XG4gICAgbGV0IG9mX2ZvbGRhYmxlX2ZvbGQgZm9sZGFibGUgfmluaXQgfmYgfmNvbXBhcmVfa2V5ID1cbiAgICAgIE0uZm9sZCBmb2xkYWJsZSB+aW5pdDooZW1wdHksIDApIH5mOihmdW4gKGFjY3VtLCBsZW5ndGgpIChrZXksIGRhdGEpIC0+XG4gICAgICAgIGxldCBwcmV2X2RhdGEgPVxuICAgICAgICAgIG1hdGNoIGZpbmQgYWNjdW0ga2V5IH5jb21wYXJlX2tleSB3aXRoXG4gICAgICAgICAgfCBOb25lIC0+IGluaXRcbiAgICAgICAgICB8IFNvbWUgcHJldiAtPiBwcmV2XG4gICAgICAgIGluXG4gICAgICAgIGxldCBkYXRhID0gZiBwcmV2X2RhdGEgZGF0YSBpblxuICAgICAgICBzZXQgYWNjdW0gfmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleSlcbiAgICA7O1xuXG4gICAgbGV0IG9mX2ZvbGRhYmxlX3JlZHVjZSBmb2xkYWJsZSB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgICAgTS5mb2xkIGZvbGRhYmxlIH5pbml0OihlbXB0eSwgMCkgfmY6KGZ1biAoYWNjdW0sIGxlbmd0aCkgKGtleSwgZGF0YSkgLT5cbiAgICAgICAgbGV0IG5ld19kYXRhID1cbiAgICAgICAgICBtYXRjaCBmaW5kIGFjY3VtIGtleSB+Y29tcGFyZV9rZXkgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiBkYXRhXG4gICAgICAgICAgfCBTb21lIHByZXYgLT4gZiBwcmV2IGRhdGFcbiAgICAgICAgaW5cbiAgICAgICAgc2V0IGFjY3VtIH5sZW5ndGggfmtleSB+ZGF0YTpuZXdfZGF0YSB+Y29tcGFyZV9rZXkpXG4gICAgOztcblxuICAgIGxldCBvZl9mb2xkYWJsZSBmb2xkYWJsZSB+Y29tcGFyZV9rZXkgPVxuICAgICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICAgIGxldCBtYXAgPVxuICAgICAgICAgIE0uZm9sZCBmb2xkYWJsZSB+aW5pdDooZW1wdHksIDApIH5mOihmdW4gKHQsIGxlbmd0aCkgKGtleSwgZGF0YSkgLT5cbiAgICAgICAgICAgIGxldCAoKF8sIGxlbmd0aCcpIGFzIGFjYykgPSBzZXQgfmxlbmd0aCB+a2V5IH5kYXRhIHQgfmNvbXBhcmVfa2V5IGluXG4gICAgICAgICAgICBpZiBsZW5ndGggPSBsZW5ndGgnIHRoZW4gci5yZXR1cm4gKGBEdXBsaWNhdGVfa2V5IGtleSkgZWxzZSBhY2MpXG4gICAgICAgIGluXG4gICAgICAgIGBPayBtYXApXG4gICAgOztcblxuICAgIGxldCBvZl9mb2xkYWJsZV9vcl9lcnJvciBmb2xkYWJsZSB+Y29tcGFyYXRvciA9XG4gICAgICBtYXRjaCBvZl9mb2xkYWJsZSBmb2xkYWJsZSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgICAgfCBgT2sgeCAtPiBSZXN1bHQuT2sgeFxuICAgICAgfCBgRHVwbGljYXRlX2tleSBrZXkgLT5cbiAgICAgICAgT3JfZXJyb3IuZXJyb3JcbiAgICAgICAgICAoXCJNYXAub2ZfXCIgXiBNLm5hbWUgXiBcIl9vcl9lcnJvcjogZHVwbGljYXRlIGtleVwiKVxuICAgICAgICAgIGtleVxuICAgICAgICAgIGNvbXBhcmF0b3Iuc2V4cF9vZl90XG4gICAgOztcblxuICAgIGxldCBvZl9mb2xkYWJsZV9leG4gZm9sZGFibGUgfmNvbXBhcmF0b3IgPVxuICAgICAgbWF0Y2ggb2ZfZm9sZGFibGUgZm9sZGFibGUgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICAgIHwgYE9rIHggLT4geFxuICAgICAgfCBgRHVwbGljYXRlX2tleSBrZXkgLT5cbiAgICAgICAgRXJyb3IuY3JlYXRlIChcIk1hcC5vZl9cIiBeIE0ubmFtZSBeIFwiX2V4bjogZHVwbGljYXRlIGtleVwiKSBrZXkgY29tcGFyYXRvci5zZXhwX29mX3RcbiAgICAgICAgfD4gRXJyb3IucmFpc2VcbiAgICA7O1xuICBlbmRcblxuICBtb2R1bGUgT2ZfYWxpc3QgPSBPZl9mb2xkYWJsZSAoc3RydWN0XG4gICAgICBsZXQgbmFtZSA9IFwiYWxpc3RcIlxuXG4gICAgICB0eXBlICdhIHQgPSAnYSBsaXN0XG5cbiAgICAgIGxldCBmb2xkID0gTGlzdC5mb2xkXG4gICAgZW5kKVxuXG4gIGxldCBvZl9hbGlzdF9mb2xkID0gT2ZfYWxpc3Qub2ZfZm9sZGFibGVfZm9sZFxuICBsZXQgb2ZfYWxpc3RfcmVkdWNlID0gT2ZfYWxpc3Qub2ZfZm9sZGFibGVfcmVkdWNlXG4gIGxldCBvZl9hbGlzdCA9IE9mX2FsaXN0Lm9mX2ZvbGRhYmxlXG4gIGxldCBvZl9hbGlzdF9vcl9lcnJvciA9IE9mX2FsaXN0Lm9mX2ZvbGRhYmxlX29yX2Vycm9yXG4gIGxldCBvZl9hbGlzdF9leG4gPSBPZl9hbGlzdC5vZl9mb2xkYWJsZV9leG5cblxuICAoKiBSZXZlcnNlIHRoZSBpbnB1dCwgdGhlbiBmb2xkIGZyb20gbGVmdCB0byByaWdodC4gVGhlIHJlc3VsdGluZyBtYXAgdXNlcyB0aGUgZmlyc3RcbiAgICAgaW5zdGFuY2Ugb2YgZWFjaCBrZXkgZnJvbSB0aGUgaW5wdXQgbGlzdC4gVGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGluIGVhY2hcbiAgICAgb3V0cHV0IGxpc3QgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIGlucHV0IGxpc3QuICopXG4gIGxldCBvZl9mb2xkYWJsZV9tdWx0aSBmb2xkYWJsZSB+Zm9sZCB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBhbGlzdCA9IGZvbGQgZm9sZGFibGUgfmluaXQ6W10gfmY6KGZ1biBsIHggLT4geCA6OiBsKSBpblxuICAgIG9mX2FsaXN0X2ZvbGQgYWxpc3QgfmluaXQ6W10gfmY6KGZ1biBsIHggLT4geCA6OiBsKSB+Y29tcGFyZV9rZXlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfbXVsdGkgYWxpc3QgfmNvbXBhcmVfa2V5ID1cbiAgICBvZl9mb2xkYWJsZV9tdWx0aSBhbGlzdCB+Zm9sZDpMaXN0LmZvbGQgfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbW9kdWxlIE9mX3NlcXVlbmNlID0gT2ZfZm9sZGFibGUgKHN0cnVjdFxuICAgICAgbGV0IG5hbWUgPSBcInNlcXVlbmNlXCJcblxuICAgICAgdHlwZSAnYSB0ID0gJ2EgU2VxdWVuY2UudFxuXG4gICAgICBsZXQgZm9sZCA9IFNlcXVlbmNlLmZvbGRcbiAgICBlbmQpXG5cbiAgbGV0IG9mX3NlcXVlbmNlX2ZvbGQgPSBPZl9zZXF1ZW5jZS5vZl9mb2xkYWJsZV9mb2xkXG4gIGxldCBvZl9zZXF1ZW5jZV9yZWR1Y2UgPSBPZl9zZXF1ZW5jZS5vZl9mb2xkYWJsZV9yZWR1Y2VcbiAgbGV0IG9mX3NlcXVlbmNlID0gT2Zfc2VxdWVuY2Uub2ZfZm9sZGFibGVcbiAgbGV0IG9mX3NlcXVlbmNlX29yX2Vycm9yID0gT2Zfc2VxdWVuY2Uub2ZfZm9sZGFibGVfb3JfZXJyb3JcbiAgbGV0IG9mX3NlcXVlbmNlX2V4biA9IE9mX3NlcXVlbmNlLm9mX2ZvbGRhYmxlX2V4blxuXG4gIGxldCBvZl9zZXF1ZW5jZV9tdWx0aSBzZXF1ZW5jZSB+Y29tcGFyZV9rZXkgPVxuICAgIG9mX2ZvbGRhYmxlX211bHRpIHNlcXVlbmNlIH5mb2xkOlNlcXVlbmNlLmZvbGQgfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbGV0IGZvcl9hbGwgdCB+ZiA9XG4gICAgd2l0aF9yZXR1cm4gKGZ1biByIC0+XG4gICAgICBpdGVyIHQgfmY6KGZ1biBkYXRhIC0+IGlmIG5vdCAoZiBkYXRhKSB0aGVuIHIucmV0dXJuIGZhbHNlKTtcbiAgICAgIHRydWUpXG4gIDs7XG5cbiAgbGV0IGZvcl9hbGxpIHQgfmYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gaWYgbm90IChmIH5rZXkgfmRhdGEpIHRoZW4gci5yZXR1cm4gZmFsc2UpO1xuICAgICAgdHJ1ZSlcbiAgOztcblxuICBsZXQgZXhpc3RzIHQgfmYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgaXRlciB0IH5mOihmdW4gZGF0YSAtPiBpZiBmIGRhdGEgdGhlbiByLnJldHVybiB0cnVlKTtcbiAgICAgIGZhbHNlKVxuICA7O1xuXG4gIGxldCBleGlzdHNpIHQgfmYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gci5yZXR1cm4gdHJ1ZSk7XG4gICAgICBmYWxzZSlcbiAgOztcblxuICBsZXQgY291bnQgdCB+ZiA9XG4gICAgZm9sZCB0IH5pbml0OjAgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgYWNjIC0+IGlmIGYgZGF0YSB0aGVuIGFjYyArIDEgZWxzZSBhY2MpXG4gIDs7XG5cbiAgbGV0IGNvdW50aSB0IH5mID1cbiAgICBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIH5rZXkgfmRhdGEgYWNjIC0+IGlmIGYgfmtleSB+ZGF0YSB0aGVuIGFjYyArIDEgZWxzZSBhY2MpXG4gIDs7XG5cbiAgbGV0IHRvX2FsaXN0ID8oa2V5X29yZGVyID0gYEluY3JlYXNpbmcpIHQgPVxuICAgIG1hdGNoIGtleV9vcmRlciB3aXRoXG4gICAgfCBgSW5jcmVhc2luZyAtPiBmb2xkX3JpZ2h0IHQgfmluaXQ6W10gfmY6KGZ1biB+a2V5IH5kYXRhIHggLT4gKGtleSwgZGF0YSkgOjogeClcbiAgICB8IGBEZWNyZWFzaW5nIC0+IGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIH5rZXkgfmRhdGEgeCAtPiAoa2V5LCBkYXRhKSA6OiB4KVxuICA7O1xuXG4gIGxldCBtZXJnZSB0MSB0MiB+ZiB+Y29tcGFyZV9rZXkgPVxuICAgIGxldCBlbHRzID0gVW5pZm9ybV9hcnJheS51bnNhZmVfY3JlYXRlX3VuaW5pdGlhbGl6ZWQgfmxlbjoobGVuZ3RoIHQxICsgbGVuZ3RoIHQyKSBpblxuICAgIGxldCBpID0gcmVmIDAgaW5cbiAgICBpdGVyMiB0MSB0MiB+Y29tcGFyZV9rZXkgfmY6KGZ1biB+a2V5IH5kYXRhOnZhbHVlcyAtPlxuICAgICAgbWF0Y2ggZiB+a2V5IHZhbHVlcyB3aXRoXG4gICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgVW5pZm9ybV9hcnJheS5zZXQgZWx0cyAhaSAoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGluY3IgaVxuICAgICAgfCBOb25lIC0+ICgpKTtcbiAgICBsZXQgbGVuID0gIWkgaW5cbiAgICBsZXQgZ2V0IGkgPSBVbmlmb3JtX2FycmF5LmdldCBlbHRzIGkgaW5cbiAgICBsZXQgdHJlZSA9IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmY6Z2V0IGluXG4gICAgdHJlZSwgbGVuXG4gIDs7XG5cbiAgbGV0IG1lcmdlX3NrZXdlZCA9XG4gICAgbGV0IG1lcmdlX2xhcmdlX2ZpcnN0IGxlbmd0aF9sYXJnZSB0X2xhcmdlIHRfc21hbGwgfmNhbGwgfmNvbWJpbmUgfmNvbXBhcmVfa2V5ID1cbiAgICAgIGZvbGQgdF9zbWFsbCB+aW5pdDoodF9sYXJnZSwgbGVuZ3RoX2xhcmdlKSB+ZjooZnVuIH5rZXkgfmRhdGE6ZGF0YScgKHQsIGxlbmd0aCkgLT5cbiAgICAgICAgdXBkYXRlIHQga2V5IH5sZW5ndGggfmNvbXBhcmVfa2V5IH5mOihmdW5jdGlvblxuICAgICAgICAgIHwgTm9uZSAtPiBkYXRhJ1xuICAgICAgICAgIHwgU29tZSBkYXRhIC0+IGNhbGwgY29tYmluZSB+a2V5IGRhdGEgZGF0YScpKVxuICAgIGluXG4gICAgbGV0IGNhbGwgZiB+a2V5IHggeSA9IGYgfmtleSB4IHkgaW5cbiAgICBsZXQgc3dhcCBmIH5rZXkgeCB5ID0gZiB+a2V5IHkgeCBpblxuICAgIGZ1biB0MSB0MiB+bGVuZ3RoMSB+bGVuZ3RoMiB+Y29tYmluZSB+Y29tcGFyZV9rZXkgLT5cbiAgICAgIGlmIGxlbmd0aDIgPD0gbGVuZ3RoMVxuICAgICAgdGhlbiBtZXJnZV9sYXJnZV9maXJzdCBsZW5ndGgxIHQxIHQyIH5jYWxsIH5jb21iaW5lIH5jb21wYXJlX2tleVxuICAgICAgZWxzZSBtZXJnZV9sYXJnZV9maXJzdCBsZW5ndGgyIHQyIHQxIH5jYWxsOnN3YXAgfmNvbWJpbmUgfmNvbXBhcmVfa2V5XG4gIDs7XG5cbiAgbW9kdWxlIENsb3Nlc3Rfa2V5X2ltcGwgPSBzdHJ1Y3RcbiAgICAoKiBbbWFya2VyXSBhbmQgW3JlcGFja2FnZV0gYWxsb3cgdXMgdG8gY3JlYXRlIFwibG9naWNhbFwiIG9wdGlvbnMgd2l0aG91dCBhY3R1YWxseVxuICAgICAgIGFsbG9jYXRpbmcgYW55IG9wdGlvbnMuIFBhc3NpbmcgW0ZvdW5kIGtleSB2YWx1ZV0gdG8gYSBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvXG4gICAgICAgcGFzc2luZyBbU29tZSAoa2V5LCB2YWx1ZSldOyBwYXNzaW5nIFtNaXNzaW5nICgpICgpXSBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmdcbiAgICAgICBbTm9uZV0uICopXG4gICAgdHlwZSAoJ2ssICd2LCAna19vcHQsICd2X29wdCkgbWFya2VyID1cbiAgICAgIHwgTWlzc2luZyA6ICgnaywgJ3YsIHVuaXQsIHVuaXQpIG1hcmtlclxuICAgICAgfCBGb3VuZCA6ICgnaywgJ3YsICdrLCAndikgbWFya2VyXG5cbiAgICBsZXQgcmVwYWNrYWdlXG4gICAgICAgICAgKHR5cGUgayB2IGtfb3B0IHZfb3B0KVxuICAgICAgICAgIChtYXJrZXIgOiAoaywgdiwga19vcHQsIHZfb3B0KSBtYXJrZXIpXG4gICAgICAgICAgKGsgOiBrX29wdClcbiAgICAgICAgICAodiA6IHZfb3B0KVxuICAgICAgOiAoayAqIHYpIG9wdGlvblxuICAgICAgPVxuICAgICAgbWF0Y2ggbWFya2VyIHdpdGhcbiAgICAgIHwgTWlzc2luZyAtPiBOb25lXG4gICAgICB8IEZvdW5kIC0+IFNvbWUgKGssIHYpXG4gICAgOztcblxuICAgICgqIFRoZSB0eXBlIHNpZ25hdHVyZSBpcyBleHBsaWNpdCBoZXJlIHRvIGFsbG93IHBvbHltb3JwaGljIHJlY3Vyc2lvbi4gKilcbiAgICBsZXQgcmVjIGxvb3AgOlxuICAgICAgJ2sgJ3YgJ2tfb3B0ICd2X29wdC5cbiAgICAgICgnaywgJ3YpIHRyZWVcbiAgICAgIC0+IFsgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIHwgYExlc3Nfb3JfZXF1YWxfdG8gfCBgTGVzc190aGFuIF1cbiAgICAgIC0+ICdrXG4gICAgICAtPiBjb21wYXJlX2tleTooJ2sgLT4gJ2sgLT4gaW50KVxuICAgICAgLT4gKCdrLCAndiwgJ2tfb3B0LCAndl9vcHQpIG1hcmtlclxuICAgICAgLT4gJ2tfb3B0XG4gICAgICAtPiAndl9vcHRcbiAgICAgIC0+ICgnayAqICd2KSBvcHRpb25cbiAgICAgID1cbiAgICAgIGZ1biB0IGRpciBrIH5jb21wYXJlX2tleSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlIC0+XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IEVtcHR5IC0+IHJlcGFja2FnZSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlXG4gICAgICAgIHwgTGVhZiAoaycsIHYnKSAtPlxuICAgICAgICAgIGxldCBjID0gY29tcGFyZV9rZXkgaycgayBpblxuICAgICAgICAgIGlmIG1hdGNoIGRpciB3aXRoXG4gICAgICAgICAgICB8IGBHcmVhdGVyX29yX2VxdWFsX3RvIC0+IGMgPj0gMFxuICAgICAgICAgICAgfCBgR3JlYXRlcl90aGFuIC0+IGMgPiAwXG4gICAgICAgICAgICB8IGBMZXNzX29yX2VxdWFsX3RvIC0+IGMgPD0gMFxuICAgICAgICAgICAgfCBgTGVzc190aGFuIC0+IGMgPCAwXG4gICAgICAgICAgdGhlbiBTb21lIChrJywgdicpXG4gICAgICAgICAgZWxzZSByZXBhY2thZ2UgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZVxuICAgICAgICB8IE5vZGUgKGwsIGsnLCB2JywgciwgXykgLT5cbiAgICAgICAgICBsZXQgYyA9IGNvbXBhcmVfa2V5IGsnIGsgaW5cbiAgICAgICAgICBpZiBjID0gMFxuICAgICAgICAgIHRoZW4gKFxuICAgICAgICAgICAgKCogVGhpcyBpcyBhIGJhc2UgY2FzZSAobm8gcmVjdXJzaXZlIGNhbGwpLiAqKVxuICAgICAgICAgICAgbWF0Y2ggZGlyIHdpdGhcbiAgICAgICAgICAgIHwgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgTGVzc19vcl9lcXVhbF90byAtPiBTb21lIChrJywgdicpXG4gICAgICAgICAgICB8IGBHcmVhdGVyX3RoYW4gLT5cbiAgICAgICAgICAgICAgaWYgaXNfZW1wdHkgciB0aGVuIHJlcGFja2FnZSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlIGVsc2UgbWluX2VsdCByXG4gICAgICAgICAgICB8IGBMZXNzX3RoYW4gLT5cbiAgICAgICAgICAgICAgaWYgaXNfZW1wdHkgbCB0aGVuIHJlcGFja2FnZSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlIGVsc2UgbWF4X2VsdCBsKVxuICAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICAgKCogV2UgYXJlIGd1YXJhbnRlZWQgaGVyZSB0aGF0IGsnIDw+IGsuICopXG4gICAgICAgICAgICAoKiBUaGlzIGlzIHRoZSBvbmx5IHJlY3Vyc2l2ZSBjYXNlLiAqKVxuICAgICAgICAgICAgbWF0Y2ggZGlyIHdpdGhcbiAgICAgICAgICAgIHwgYEdyZWF0ZXJfb3JfZXF1YWxfdG8gfCBgR3JlYXRlcl90aGFuIC0+XG4gICAgICAgICAgICAgIGlmIGMgPiAwXG4gICAgICAgICAgICAgIHRoZW4gbG9vcCBsIGRpciBrIH5jb21wYXJlX2tleSBGb3VuZCBrJyB2J1xuICAgICAgICAgICAgICBlbHNlIGxvb3AgciBkaXIgayB+Y29tcGFyZV9rZXkgZm91bmRfbWFya2VyIGZvdW5kX2tleSBmb3VuZF92YWx1ZVxuICAgICAgICAgICAgfCBgTGVzc19vcl9lcXVhbF90byB8IGBMZXNzX3RoYW4gLT5cbiAgICAgICAgICAgICAgaWYgYyA8IDBcbiAgICAgICAgICAgICAgdGhlbiBsb29wIHIgZGlyIGsgfmNvbXBhcmVfa2V5IEZvdW5kIGsnIHYnXG4gICAgICAgICAgICAgIGVsc2UgbG9vcCBsIGRpciBrIH5jb21wYXJlX2tleSBmb3VuZF9tYXJrZXIgZm91bmRfa2V5IGZvdW5kX3ZhbHVlKVxuICAgIDs7XG5cbiAgICBsZXQgY2xvc2VzdF9rZXkgdCBkaXIgayB+Y29tcGFyZV9rZXkgPSBsb29wIHQgZGlyIGsgfmNvbXBhcmVfa2V5IE1pc3NpbmcgKCkgKClcbiAgZW5kXG5cbiAgbGV0IGNsb3Nlc3Rfa2V5ID0gQ2xvc2VzdF9rZXlfaW1wbC5jbG9zZXN0X2tleVxuXG4gIGxldCByZWMgcmFuayB0IGsgfmNvbXBhcmVfa2V5ID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGsnLCBfKSAtPiBpZiBjb21wYXJlX2tleSBrJyBrID0gMCB0aGVuIFNvbWUgMCBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIGsnLCBfLCByLCBfKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlX2tleSBrJyBrIGluXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiBTb21lIChsZW5ndGggbClcbiAgICAgIGVsc2UgaWYgYyA+IDBcbiAgICAgIHRoZW4gcmFuayBsIGsgfmNvbXBhcmVfa2V5XG4gICAgICBlbHNlIE9wdGlvbi5tYXAgKHJhbmsgciBrIH5jb21wYXJlX2tleSkgfmY6KGZ1biByYW5rIC0+IHJhbmsgKyAxICsgbGVuZ3RoIGwpXG4gIDs7XG5cbiAgKCogdGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCB1c2luZyBbU2VxdWVuY2VdIGludGVyZmFjZSBidXQgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvblxuICAgICBhbGxvY2F0ZXMgb25seSAyIHdvcmRzIGFuZCBkb2Vzbid0IHJlcXVpcmUgd3JpdGUtYmFycmllciAqKVxuICBsZXQgcmVjIG50aCcgbnVtX3RvX3NlYXJjaCA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrLCB2KSAtPlxuICAgICAgaWYgIW51bV90b19zZWFyY2ggPSAwXG4gICAgICB0aGVuIFNvbWUgKGssIHYpXG4gICAgICBlbHNlIChcbiAgICAgICAgZGVjciBudW1fdG9fc2VhcmNoO1xuICAgICAgICBOb25lKVxuICAgIHwgTm9kZSAobCwgaywgdiwgciwgXykgLT5cbiAgICAgIChtYXRjaCBudGgnIG51bV90b19zZWFyY2ggbCB3aXRoXG4gICAgICAgfCBTb21lIF8gYXMgc29tZSAtPiBzb21lXG4gICAgICAgfCBOb25lIC0+XG4gICAgICAgICBpZiAhbnVtX3RvX3NlYXJjaCA9IDBcbiAgICAgICAgIHRoZW4gU29tZSAoaywgdilcbiAgICAgICAgIGVsc2UgKFxuICAgICAgICAgICBkZWNyIG51bV90b19zZWFyY2g7XG4gICAgICAgICAgIG50aCcgbnVtX3RvX3NlYXJjaCByKSlcbiAgOztcblxuICBsZXQgbnRoIHQgbiA9IG50aCcgKHJlZiBuKSB0XG5cblxuICBsZXQgcmVjIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mID1cbiAgICBtYXRjaCB0IHdpdGhcbiAgICB8IEVtcHR5IC0+IE5vbmVcbiAgICB8IExlYWYgKGssIHYpIC0+IGlmIGYgfmtleTprIH5kYXRhOnYgdGhlbiBTb21lIChrLCB2KSBlbHNlIE5vbmVcbiAgICB8IE5vZGUgKGwsIGssIHYsIHIsIF8pIC0+XG4gICAgICBpZiBmIH5rZXk6ayB+ZGF0YTp2XG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggZmluZF9maXJzdF9zYXRpc2Z5aW5nIGwgfmYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gU29tZSAoaywgdilcbiAgICAgICAgfCBTb21lIF8gYXMgeCAtPiB4KVxuICAgICAgZWxzZSBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgciB+ZlxuICA7O1xuXG4gIGxldCByZWMgZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPiBOb25lXG4gICAgfCBMZWFmIChrLCB2KSAtPiBpZiBmIH5rZXk6ayB+ZGF0YTp2IHRoZW4gU29tZSAoaywgdikgZWxzZSBOb25lXG4gICAgfCBOb2RlIChsLCBrLCB2LCByLCBfKSAtPlxuICAgICAgaWYgZiB+a2V5OmsgfmRhdGE6dlxuICAgICAgdGhlbiAoXG4gICAgICAgIG1hdGNoIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHIgfmYgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gU29tZSAoaywgdilcbiAgICAgICAgfCBTb21lIF8gYXMgeCAtPiB4KVxuICAgICAgZWxzZSBmaW5kX2xhc3Rfc2F0aXNmeWluZyBsIH5mXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdiA9XG4gICAgbWF0Y2ggaG93IHdpdGhcbiAgICB8IGBMYXN0X3N0cmljdGx5X2xlc3NfdGhhbiAtPlxuICAgICAgZmluZF9sYXN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPCAwKVxuICAgIHwgYExhc3RfbGVzc190aGFuX29yX2VxdWFsX3RvIC0+XG4gICAgICBmaW5kX2xhc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA8PSAwKVxuICAgIHwgYEZpcnN0X2VxdWFsX3RvIC0+XG4gICAgICAobWF0Y2ggZmluZF9maXJzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2ID49IDApIHdpdGhcbiAgICAgICB8IFNvbWUgKGtleSwgZGF0YSkgYXMgcGFpciB3aGVuIGNvbXBhcmUgfmtleSB+ZGF0YSB2ID0gMCAtPiBwYWlyXG4gICAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gICAgfCBgTGFzdF9lcXVhbF90byAtPlxuICAgICAgKG1hdGNoIGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+IGNvbXBhcmUgfmtleSB+ZGF0YSB2IDw9IDApIHdpdGhcbiAgICAgICB8IFNvbWUgKGtleSwgZGF0YSkgYXMgcGFpciB3aGVuIGNvbXBhcmUgfmtleSB+ZGF0YSB2ID0gMCAtPiBwYWlyXG4gICAgICAgfCBOb25lIHwgU29tZSBfIC0+IE5vbmUpXG4gICAgfCBgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvIC0+XG4gICAgICBmaW5kX2ZpcnN0X3NhdGlzZnlpbmcgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gY29tcGFyZSB+a2V5IH5kYXRhIHYgPj0gMClcbiAgICB8IGBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW4gLT5cbiAgICAgIGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBjb21wYXJlIH5rZXkgfmRhdGEgdiA+IDApXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBsZXQgaXNfbGVmdCB+a2V5IH5kYXRhID1cbiAgICAgIG1hdGNoIHNlZ21lbnRfb2YgfmtleSB+ZGF0YSB3aXRoXG4gICAgICB8IGBMZWZ0IC0+IHRydWVcbiAgICAgIHwgYFJpZ2h0IC0+IGZhbHNlXG4gICAgaW5cbiAgICBsZXQgaXNfcmlnaHQgfmtleSB+ZGF0YSA9IG5vdCAoaXNfbGVmdCB+a2V5IH5kYXRhKSBpblxuICAgIG1hdGNoIGhvdyB3aXRoXG4gICAgfCBgTGFzdF9vbl9sZWZ0IC0+IGZpbmRfbGFzdF9zYXRpc2Z5aW5nIHQgfmY6aXNfbGVmdFxuICAgIHwgYEZpcnN0X29uX3JpZ2h0IC0+IGZpbmRfZmlyc3Rfc2F0aXNmeWluZyB0IH5mOmlzX3JpZ2h0XG4gIDs7XG5cbiAgKCogW2JpbmFyeV9zZWFyY2hfb25lX3NpZGVkX2JvdW5kXSBmaW5kcyB0aGUga2V5IGluIFt0XSB3aGljaCBzYXRpc2ZpZXMgW21heWJlX2JvdW5kXVxuICAgICBhbmQgdGhlIHJlbGV2YW50IG9uZSBvZiBbaWZfZXhjbHVzaXZlXSBvciBbaWZfaW5jbHVzaXZlXSwgYXMganVkZ2VkIGJ5IFtjb21wYXJlXS4gKilcbiAgbGV0IGJpbmFyeV9zZWFyY2hfb25lX3NpZGVkX2JvdW5kIHQgbWF5YmVfYm91bmQgfmNvbXBhcmUgfmlmX2V4Y2x1c2l2ZSB+aWZfaW5jbHVzaXZlID1cbiAgICBsZXQgZmluZF9ib3VuZCB0IGhvdyBib3VuZCB+Y29tcGFyZSA6IF8gTWF5YmVfYm91bmQudCBvcHRpb24gPVxuICAgICAgbWF0Y2ggYmluYXJ5X3NlYXJjaCB0IGhvdyBib3VuZCB+Y29tcGFyZSB3aXRoXG4gICAgICB8IFNvbWUgKGJvdW5kLCBfKSAtPiBTb21lIChJbmNsIGJvdW5kKVxuICAgICAgfCBOb25lIC0+IE5vbmVcbiAgICBpblxuICAgIG1hdGNoIChtYXliZV9ib3VuZCA6IF8gTWF5YmVfYm91bmQudCkgd2l0aFxuICAgIHwgRXhjbCBib3VuZCAtPiBmaW5kX2JvdW5kIHQgaWZfZXhjbHVzaXZlIGJvdW5kIH5jb21wYXJlXG4gICAgfCBJbmNsIGJvdW5kIC0+IGZpbmRfYm91bmQgdCBpZl9pbmNsdXNpdmUgYm91bmQgfmNvbXBhcmVcbiAgICB8IFVuYm91bmRlZCAtPiBTb21lIFVuYm91bmRlZFxuICA7O1xuXG4gICgqIFtiaW5hcnlfc2VhcmNoX3R3b19zaWRlZF9ib3VuZHNdIGZpbmRzIHRoZSAobm90IG5lY2Vzc2FyaWx5IGRpc3RpbmN0KSBrZXlzIGluIFt0XVxuICAgICB3aGljaCBtb3N0IGNsb3NlbHkgYXBwcm9hY2ggKGJ1dCBkbyBub3QgY3Jvc3MpIFtsb3dlcl9ib3VuZF0gYW5kIFt1cHBlcl9ib3VuZF0sIGFzXG4gICAgIGp1ZGdlZCBieSBbY29tcGFyZV0uIEl0IHJldHVybnMgW05vbmVdIGlmIG5vIGtleXMgaW4gW3RdIGFyZSB3aXRoaW4gdGhhdCByYW5nZS4gKilcbiAgbGV0IGJpbmFyeV9zZWFyY2hfdHdvX3NpZGVkX2JvdW5kcyB0IH5jb21wYXJlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgPVxuICAgIGxldCBmaW5kX2xvd2VyX2JvdW5kIHQgbWF5YmVfYm91bmQgfmNvbXBhcmUgPVxuICAgICAgYmluYXJ5X3NlYXJjaF9vbmVfc2lkZWRfYm91bmRcbiAgICAgICAgdFxuICAgICAgICBtYXliZV9ib3VuZFxuICAgICAgICB+Y29tcGFyZVxuICAgICAgICB+aWZfZXhjbHVzaXZlOmBGaXJzdF9zdHJpY3RseV9ncmVhdGVyX3RoYW5cbiAgICAgICAgfmlmX2luY2x1c2l2ZTpgRmlyc3RfZ3JlYXRlcl90aGFuX29yX2VxdWFsX3RvXG4gICAgaW5cbiAgICBsZXQgZmluZF91cHBlcl9ib3VuZCB0IG1heWJlX2JvdW5kIH5jb21wYXJlID1cbiAgICAgIGJpbmFyeV9zZWFyY2hfb25lX3NpZGVkX2JvdW5kXG4gICAgICAgIHRcbiAgICAgICAgbWF5YmVfYm91bmRcbiAgICAgICAgfmNvbXBhcmVcbiAgICAgICAgfmlmX2V4Y2x1c2l2ZTpgTGFzdF9zdHJpY3RseV9sZXNzX3RoYW5cbiAgICAgICAgfmlmX2luY2x1c2l2ZTpgTGFzdF9sZXNzX3RoYW5fb3JfZXF1YWxfdG9cbiAgICBpblxuICAgIG1hdGNoIGZpbmRfbG93ZXJfYm91bmQgdCBsb3dlcl9ib3VuZCB+Y29tcGFyZSB3aXRoXG4gICAgfCBOb25lIC0+IE5vbmVcbiAgICB8IFNvbWUgbG93ZXJfYm91bmQgLT5cbiAgICAgIChtYXRjaCBmaW5kX3VwcGVyX2JvdW5kIHQgdXBwZXJfYm91bmQgfmNvbXBhcmUgd2l0aFxuICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICAgfCBTb21lIHVwcGVyX2JvdW5kIC0+IFNvbWUgKGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCkpXG4gIDs7XG5cbiAgdHlwZSAoJ2ssICd2KSBhY2MgPVxuICAgIHsgbXV0YWJsZSBiYWRfa2V5IDogJ2sgb3B0aW9uXG4gICAgOyBtdXRhYmxlIG1hcF9sZW5ndGggOiAoJ2ssICd2KSB0ICogaW50XG4gICAgfVxuXG4gIGxldCBvZl9pdGVyaSB+aXRlcmkgfmNvbXBhcmVfa2V5ID1cbiAgICBsZXQgYWNjID0geyBiYWRfa2V5ID0gTm9uZTsgbWFwX2xlbmd0aCA9IGVtcHR5LCAwIH0gaW5cbiAgICBpdGVyaSB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICAgIGxldCBtYXAsIGxlbmd0aCA9IGFjYy5tYXBfbGVuZ3RoIGluXG4gICAgICBsZXQgKChfLCBsZW5ndGgnKSBhcyBwYWlyKSA9IHNldCB+bGVuZ3RoIH5rZXkgfmRhdGEgbWFwIH5jb21wYXJlX2tleSBpblxuICAgICAgaWYgbGVuZ3RoID0gbGVuZ3RoJyAmJiBPcHRpb24uaXNfbm9uZSBhY2MuYmFkX2tleVxuICAgICAgdGhlbiBhY2MuYmFkX2tleSA8LSBTb21lIGtleVxuICAgICAgZWxzZSBhY2MubWFwX2xlbmd0aCA8LSBwYWlyKTtcbiAgICBtYXRjaCBhY2MuYmFkX2tleSB3aXRoXG4gICAgfCBOb25lIC0+IGBPayBhY2MubWFwX2xlbmd0aFxuICAgIHwgU29tZSBrZXkgLT4gYER1cGxpY2F0ZV9rZXkga2V5XG4gIDs7XG5cbiAgbGV0IG9mX2l0ZXJpX2V4biB+aXRlcmkgfihjb21wYXJhdG9yIDogXyBDb21wYXJhdG9yLnQpID1cbiAgICBtYXRjaCBvZl9pdGVyaSB+aXRlcmkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuY29tcGFyZSB3aXRoXG4gICAgfCBgT2sgdiAtPiB2XG4gICAgfCBgRHVwbGljYXRlX2tleSBrZXkgLT5cbiAgICAgIEVycm9yLmNyZWF0ZSBcIk1hcC5vZl9pdGVyaV9leG46IGR1cGxpY2F0ZSBrZXlcIiBrZXkgY29tcGFyYXRvci5zZXhwX29mX3RcbiAgICAgIHw+IEVycm9yLnJhaXNlXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3Qga2V5X29mX3NleHAgdmFsdWVfb2Zfc2V4cCBzZXhwIH4oY29tcGFyYXRvciA6IF8gQ29tcGFyYXRvci50KSA9XG4gICAgbGV0IGFsaXN0ID0gbGlzdF9vZl9zZXhwIChwYWlyX29mX3NleHAga2V5X29mX3NleHAgdmFsdWVfb2Zfc2V4cCkgc2V4cCBpblxuICAgIGxldCBjb21wYXJlX2tleSA9IGNvbXBhcmF0b3IuY29tcGFyZSBpblxuICAgIG1hdGNoIG9mX2FsaXN0IGFsaXN0IH5jb21wYXJlX2tleSB3aXRoXG4gICAgfCBgT2sgdiAtPiB2XG4gICAgfCBgRHVwbGljYXRlX2tleSBrIC0+XG4gICAgICAoKiBmaW5kIHRoZSBzZXhwIG9mIGEgZHVwbGljYXRlIGtleSwgc28gdGhlIGVycm9yIGlzIG5hcnJvd2VkIHRvIGEga2V5IGFuZCBub3RcbiAgICAgICAgIHRoZSB3aG9sZSBtYXAgKilcbiAgICAgIGxldCBhbGlzdF9zZXhwcyA9IGxpc3Rfb2Zfc2V4cCAocGFpcl9vZl9zZXhwIEZuLmlkIEZuLmlkKSBzZXhwIGluXG4gICAgICBsZXQgZm91bmRfZmlyc3RfayA9IHJlZiBmYWxzZSBpblxuICAgICAgTGlzdC5pdGVyMl9vayBhbGlzdCBhbGlzdF9zZXhwcyB+ZjooZnVuIChrMiwgXykgKGsyX3NleHAsIF8pIC0+XG4gICAgICAgIGlmIGNvbXBhcmVfa2V5IGsgazIgPSAwXG4gICAgICAgIHRoZW5cbiAgICAgICAgICBpZiAhZm91bmRfZmlyc3Rfa1xuICAgICAgICAgIHRoZW4gb2Zfc2V4cF9lcnJvciBcIk1hcC50X29mX3NleHBfZGlyZWN0OiBkdXBsaWNhdGUga2V5XCIgazJfc2V4cFxuICAgICAgICAgIGVsc2UgZm91bmRfZmlyc3RfayA6PSB0cnVlKTtcbiAgICAgIGFzc2VydCBmYWxzZVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9rZXkgc2V4cF9vZl92YWx1ZSB0ID1cbiAgICBsZXQgZiB+a2V5IH5kYXRhIGFjYyA9IFNleHAuTGlzdCBbIHNleHBfb2Zfa2V5IGtleTsgc2V4cF9vZl92YWx1ZSBkYXRhIF0gOjogYWNjIGluXG4gICAgU2V4cC5MaXN0IChmb2xkX3JpZ2h0IH5mIHQgfmluaXQ6W10pXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmVfZXJyb3JzIHQgfmNvbXBhcmVfa2V5IH5zZXhwX29mX2tleSA9XG4gICAgbGV0IG9rcywgKGVycm9yX3RyZWUsIF8pID0gcGFydGl0aW9uX21hcCB0IH5jb21wYXJlX2tleSB+ZjpSZXN1bHQudG9fZWl0aGVyIGluXG4gICAgaWYgaXNfZW1wdHkgZXJyb3JfdHJlZVxuICAgIHRoZW4gT2sgb2tzXG4gICAgZWxzZSBPcl9lcnJvci5lcnJvcl9zIChzZXhwX29mX3Qgc2V4cF9vZl9rZXkgRXJyb3Iuc2V4cF9vZl90IGVycm9yX3RyZWUpXG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzXG4gICAgICAgIHQxXG4gICAgICAgIH5mXG4gICAgICAgIH5jb21wYXJhdG9yOih7IGNvbXBhcmUgPSBjb21wYXJlX2tleTsgc2V4cF9vZl90ID0gc2V4cF9vZl9rZXkgfSA6IF8gQ29tcGFyYXRvci50KVxuICAgID1cbiAgICB3aXRoX3JldHVybiAoZnVuIHsgcmV0dXJuIH0gLT5cbiAgICAgIGBPa1xuICAgICAgICAoZm9sZCB0MSB+aW5pdDooZW1wdHksIDApIH5mOihmdW4gfmtleSB+ZGF0YSAodDIsIGxlbmd0aCkgLT5cbiAgICAgICAgICAgbGV0IGtleSA9IGYga2V5IGluXG4gICAgICAgICAgIHRyeSBhZGRfZXhuX2ludGVybmFsIHQyIH5sZW5ndGggfmtleSB+ZGF0YSB+Y29tcGFyZV9rZXkgfnNleHBfb2Zfa2V5IHdpdGhcbiAgICAgICAgICAgfCBEdXBsaWNhdGUgLT4gcmV0dXJuIChgRHVwbGljYXRlX2tleSBrZXkpKSkpXG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzX2V4biB0IH5mIH5jb21wYXJhdG9yID1cbiAgICBtYXRjaCBtYXBfa2V5cyB0IH5mIH5jb21wYXJhdG9yIHdpdGhcbiAgICB8IGBPayByZXN1bHQgLT4gcmVzdWx0XG4gICAgfCBgRHVwbGljYXRlX2tleSBrZXkgLT5cbiAgICAgIGxldCBzZXhwX29mX2tleSA9IGNvbXBhcmF0b3IuQ29tcGFyYXRvci5zZXhwX29mX3QgaW5cbiAgICAgIEVycm9yLnJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZSBcIk1hcC5tYXBfa2V5c19leG46IGR1cGxpY2F0ZSBrZXlcIiBbIFwia2V5XCIsIGtleSB8PiBzZXhwX29mX2tleSBdKVxuICA7O1xuZW5kXG5cbnR5cGUgKCdrLCAndiwgJ2NvbXBhcmF0b3IpIHQgPVxuICB7ICgqIFtjb21wYXJhdG9yXSBpcyB0aGUgZmlyc3QgZmllbGQgc28gdGhhdCBwb2x5bW9ycGhpYyBlcXVhbGl0eSBmYWlscyBvbiBhIG1hcCBkdWVcbiAgICAgICB0byB0aGUgZnVuY3Rpb25hbCB2YWx1ZSBpbiB0aGUgY29tcGFyYXRvci5cbiAgICAgICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgcG9seW1vcnBoaWMgW2NvbXBhcmVdOiB0aGF0IHN0aWxsIHByb2R1Y2VzXG4gICAgICAgbm9uc2Vuc2UuICopXG4gICAgY29tcGFyYXRvciA6ICgnaywgJ2NvbXBhcmF0b3IpIENvbXBhcmF0b3IudFxuICA7IHRyZWUgOiAoJ2ssICd2KSBUcmVlMC50XG4gIDsgbGVuZ3RoIDogaW50XG4gIH1cblxudHlwZSAoJ2ssICd2LCAnY29tcGFyYXRvcikgdHJlZSA9ICgnaywgJ3YpIFRyZWUwLnRcblxubGV0IGNvbXBhcmVfa2V5IHQgPSB0LmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG5cblxubGV0IGxpa2UgeyB0cmVlID0gXzsgbGVuZ3RoID0gXzsgY29tcGFyYXRvciB9ICh0cmVlLCBsZW5ndGgpID1cbiAgeyB0cmVlOyBsZW5ndGg7IGNvbXBhcmF0b3IgfVxuOztcblxubGV0IGxpa2UyIHggKHksIHopID0gbGlrZSB4IHksIGxpa2UgeCB6XG5cbmxldCBsaWtlX21heWJlX25vX29wICh7IHRyZWUgPSBvbGRfdHJlZTsgbGVuZ3RoID0gXzsgY29tcGFyYXRvciB9IGFzIG9sZF90KSAodHJlZSwgbGVuZ3RoKVxuICA9XG4gIGlmIHBoeXNfZXF1YWwgb2xkX3RyZWUgdHJlZSB0aGVuIG9sZF90IGVsc2UgeyB0cmVlOyBsZW5ndGg7IGNvbXBhcmF0b3IgfVxuOztcblxubGV0IHdpdGhfc2FtZV9sZW5ndGggeyB0cmVlID0gXzsgY29tcGFyYXRvcjsgbGVuZ3RoIH0gdHJlZSA9IHsgdHJlZTsgY29tcGFyYXRvcjsgbGVuZ3RoIH1cbmxldCBvZl90cmVlIH5jb21wYXJhdG9yIHRyZWUgPSB7IHRyZWU7IGNvbXBhcmF0b3I7IGxlbmd0aCA9IFRyZWUwLmxlbmd0aCB0cmVlIH1cblxuKCogRXhwb3NpbmcgdGhpcyBmdW5jdGlvbiB3b3VsZCBtYWtlIGl0IHZlcnkgZWFzeSBmb3IgdGhlIGludmFyaWFudHNcbiAgIG9mIHRoaXMgbW9kdWxlIHRvIGJlIGJyb2tlbi4gKilcbmxldCBvZl90cmVlX3Vuc2FmZSB+Y29tcGFyYXRvciB+bGVuZ3RoIHRyZWUgPSB7IHRyZWU7IGNvbXBhcmF0b3I7IGxlbmd0aCB9XG5cbm1vZHVsZSBBY2Nlc3NvcnMgPSBzdHJ1Y3RcbiAgbGV0IGNvbXBhcmF0b3IgdCA9IHQuY29tcGFyYXRvclxuICBsZXQgdG9fdHJlZSB0ID0gdC50cmVlXG5cbiAgbGV0IGludmFyaWFudHMgdCA9XG4gICAgVHJlZTAuaW52YXJpYW50cyB0LnRyZWUgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSAmJiBUcmVlMC5sZW5ndGggdC50cmVlID0gdC5sZW5ndGhcbiAgOztcblxuICBsZXQgaXNfZW1wdHkgdCA9IFRyZWUwLmlzX2VtcHR5IHQudHJlZVxuICBsZXQgbGVuZ3RoIHQgPSB0Lmxlbmd0aFxuXG4gIGxldCBzZXQgdCB+a2V5IH5kYXRhID1cbiAgICBsaWtlIHQgKFRyZWUwLnNldCB0LnRyZWUgfmxlbmd0aDp0Lmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IGFkZF9leG4gdCB+a2V5IH5kYXRhID1cbiAgICBsaWtlXG4gICAgICB0XG4gICAgICAoVHJlZTAuYWRkX2V4blxuICAgICAgICAgdC50cmVlXG4gICAgICAgICB+bGVuZ3RoOnQubGVuZ3RoXG4gICAgICAgICB+a2V5XG4gICAgICAgICB+ZGF0YVxuICAgICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICAgICAgICAgfnNleHBfb2Zfa2V5OnQuY29tcGFyYXRvci5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGFkZF9leG5faW50ZXJuYWwgdCB+a2V5IH5kYXRhID1cbiAgICBsaWtlXG4gICAgICB0XG4gICAgICAoVHJlZTAuYWRkX2V4bl9pbnRlcm5hbFxuICAgICAgICAgdC50cmVlXG4gICAgICAgICB+bGVuZ3RoOnQubGVuZ3RoXG4gICAgICAgICB+a2V5XG4gICAgICAgICB+ZGF0YVxuICAgICAgICAgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICAgICAgICAgfnNleHBfb2Zfa2V5OnQuY29tcGFyYXRvci5zZXhwX29mX3QpXG4gIDs7XG5cbiAgbGV0IGFkZCB0IH5rZXkgfmRhdGEgPVxuICAgIG1hdGNoIGFkZF9leG5faW50ZXJuYWwgdCB+a2V5IH5kYXRhIHdpdGhcbiAgICB8IHJlc3VsdCAtPiBgT2sgcmVzdWx0XG4gICAgfCBleGNlcHRpb24gRHVwbGljYXRlIC0+IGBEdXBsaWNhdGVcbiAgOztcblxuICBsZXQgYWRkX211bHRpIHQgfmtleSB+ZGF0YSA9XG4gICAgbGlrZVxuICAgICAgdFxuICAgICAgKFRyZWUwLmFkZF9tdWx0aSB0LnRyZWUgfmxlbmd0aDp0Lmxlbmd0aCB+a2V5IH5kYXRhIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IHJlbW92ZV9tdWx0aSB0IGtleSA9XG4gICAgbGlrZSB0IChUcmVlMC5yZW1vdmVfbXVsdGkgdC50cmVlIH5sZW5ndGg6dC5sZW5ndGgga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IGZpbmRfbXVsdGkgdCBrZXkgPSBUcmVlMC5maW5kX211bHRpIHQudHJlZSBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuXG4gIGxldCBjaGFuZ2UgdCBrZXkgfmYgPVxuICAgIGxpa2UgdCAoVHJlZTAuY2hhbmdlIHQudHJlZSBrZXkgfmYgfmxlbmd0aDp0Lmxlbmd0aCB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCB1cGRhdGUgdCBrZXkgfmYgPVxuICAgIGxpa2UgdCAoVHJlZTAudXBkYXRlIHQudHJlZSBrZXkgfmYgfmxlbmd0aDp0Lmxlbmd0aCB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBmaW5kX2V4biB0IGtleSA9XG4gICAgVHJlZTAuZmluZF9leG5cbiAgICAgIHQudHJlZVxuICAgICAga2V5XG4gICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gICAgICB+c2V4cF9vZl9rZXk6dC5jb21wYXJhdG9yLnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCBmaW5kIHQga2V5ID0gVHJlZTAuZmluZCB0LnRyZWUga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcblxuICBsZXQgcmVtb3ZlIHQga2V5ID1cbiAgICBsaWtlX21heWJlX25vX29wXG4gICAgICB0XG4gICAgICAoVHJlZTAucmVtb3ZlIHQudHJlZSBrZXkgfmxlbmd0aDp0Lmxlbmd0aCB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBtZW0gdCBrZXkgPSBUcmVlMC5tZW0gdC50cmVlIGtleSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gIGxldCBpdGVyX2tleXMgdCB+ZiA9IFRyZWUwLml0ZXJfa2V5cyB0LnRyZWUgfmZcbiAgbGV0IGl0ZXIgdCB+ZiA9IFRyZWUwLml0ZXIgdC50cmVlIH5mXG4gIGxldCBpdGVyaSB0IH5mID0gVHJlZTAuaXRlcmkgdC50cmVlIH5mXG4gIGxldCBpdGVyaV91bnRpbCB0IH5mID0gVHJlZTAuaXRlcmlfdW50aWwgdC50cmVlIH5mXG4gIGxldCBpdGVyMiB0MSB0MiB+ZiA9IFRyZWUwLml0ZXIyIHQxLnRyZWUgdDIudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKVxuICBsZXQgbWFwIHQgfmYgPSB3aXRoX3NhbWVfbGVuZ3RoIHQgKFRyZWUwLm1hcCB0LnRyZWUgfmYpXG4gIGxldCBtYXBpIHQgfmYgPSB3aXRoX3NhbWVfbGVuZ3RoIHQgKFRyZWUwLm1hcGkgdC50cmVlIH5mKVxuICBsZXQgZm9sZCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZCB0LnRyZWUgfmYgfmluaXRcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGRfdW50aWwgdC50cmVlIH5mIH5pbml0XG4gIGxldCBmb2xkX3JpZ2h0IHQgfmluaXQgfmYgPSBUcmVlMC5mb2xkX3JpZ2h0IHQudHJlZSB+ZiB+aW5pdFxuXG4gIGxldCBmb2xkMiB0MSB0MiB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZDIgdDEudHJlZSB0Mi50cmVlIH5pbml0IH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9rZXlzIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlcl9rZXlzIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICBsZXQgZmlsdGVyIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlciB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgbGV0IGZpbHRlcmkgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyaSB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgbGV0IGZpbHRlcl9tYXAgdCB+ZiA9IGxpa2UgdCAoVHJlZTAuZmlsdGVyX21hcCB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgbGV0IGZpbHRlcl9tYXBpIHQgfmYgPSBsaWtlIHQgKFRyZWUwLmZpbHRlcl9tYXBpIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuXG4gIGxldCBwYXJ0aXRpb25fbWFwaSB0IH5mID1cbiAgICBsaWtlMiB0IChUcmVlMC5wYXJ0aXRpb25fbWFwaSB0LnRyZWUgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KSlcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX21hcCB0IH5mID1cbiAgICBsaWtlMiB0IChUcmVlMC5wYXJ0aXRpb25fbWFwIHQudHJlZSB+ZiB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpKVxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25pX3RmIHQgfmYgPVxuICAgIGxpa2UyIHQgKFRyZWUwLnBhcnRpdGlvbmlfdGYgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl90ZiB0IH5mID1cbiAgICBsaWtlMiB0IChUcmVlMC5wYXJ0aXRpb25fdGYgdC50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdCkpXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmVfZXJyb3JzIHQgPVxuICAgIE9yX2Vycm9yLm1hcFxuICAgICAgfmY6KGxpa2UgdClcbiAgICAgIChUcmVlMC5jb21iaW5lX2Vycm9yc1xuICAgICAgICAgdC50cmVlXG4gICAgICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gICAgICAgICB+c2V4cF9vZl9rZXk6dC5jb21wYXJhdG9yLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgY29tcGFyZV9kaXJlY3QgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICBUcmVlMC5jb21wYXJlIChjb21wYXJlX2tleSB0MSkgY29tcGFyZV9kYXRhIHQxLnRyZWUgdDIudHJlZVxuICA7O1xuXG4gIGxldCBlcXVhbCBjb21wYXJlX2RhdGEgdDEgdDIgPSBUcmVlMC5lcXVhbCAoY29tcGFyZV9rZXkgdDEpIGNvbXBhcmVfZGF0YSB0MS50cmVlIHQyLnRyZWVcbiAgbGV0IGtleXMgdCA9IFRyZWUwLmtleXMgdC50cmVlXG4gIGxldCBkYXRhIHQgPSBUcmVlMC5kYXRhIHQudHJlZVxuICBsZXQgdG9fYWxpc3QgP2tleV9vcmRlciB0ID0gVHJlZTAudG9fYWxpc3QgP2tleV9vcmRlciB0LnRyZWVcblxuICBsZXQgc3ltbWV0cmljX2RpZmYgdDEgdDIgfmRhdGFfZXF1YWwgPVxuICAgIFRyZWUwLnN5bW1ldHJpY19kaWZmIHQxLnRyZWUgdDIudHJlZSB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKSB+ZGF0YV9lcXVhbFxuICA7O1xuXG4gIGxldCBmb2xkX3N5bW1ldHJpY19kaWZmIHQxIHQyIH5kYXRhX2VxdWFsIH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkX3N5bW1ldHJpY19kaWZmXG4gICAgICB0MS50cmVlXG4gICAgICB0Mi50cmVlXG4gICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQxKVxuICAgICAgfmRhdGFfZXF1YWxcbiAgICAgIH5pbml0XG4gICAgICB+ZlxuICA7O1xuXG4gIGxldCBtZXJnZSB0MSB0MiB+ZiA9XG4gICAgbGlrZSB0MSAoVHJlZTAubWVyZ2UgdDEudHJlZSB0Mi50cmVlIH5mIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpKVxuICA7O1xuXG4gIGxldCBtZXJnZV9za2V3ZWQgdDEgdDIgfmNvbWJpbmUgPVxuICAgICgqIFRoaXMgaXMgb25seSBhIG5vLW9wIGluIHRoZSBjYXNlIHdoZXJlIGF0IGxlYXN0IG9uZSBvZiB0aGUgbWFwcyBpcyBlbXB0eS4gKilcbiAgICBsaWtlX21heWJlX25vX29wXG4gICAgICAoaWYgdDIubGVuZ3RoIDw9IHQxLmxlbmd0aCB0aGVuIHQxIGVsc2UgdDIpXG4gICAgICAoVHJlZTAubWVyZ2Vfc2tld2VkXG4gICAgICAgICB0MS50cmVlXG4gICAgICAgICB0Mi50cmVlXG4gICAgICAgICB+bGVuZ3RoMTp0MS5sZW5ndGhcbiAgICAgICAgIH5sZW5ndGgyOnQyLmxlbmd0aFxuICAgICAgICAgfmNvbWJpbmVcbiAgICAgICAgIH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdDEpKVxuICA7O1xuXG4gIGxldCBtaW5fZWx0IHQgPSBUcmVlMC5taW5fZWx0IHQudHJlZVxuICBsZXQgbWluX2VsdF9leG4gdCA9IFRyZWUwLm1pbl9lbHRfZXhuIHQudHJlZVxuICBsZXQgbWF4X2VsdCB0ID0gVHJlZTAubWF4X2VsdCB0LnRyZWVcbiAgbGV0IG1heF9lbHRfZXhuIHQgPSBUcmVlMC5tYXhfZWx0X2V4biB0LnRyZWVcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IFRyZWUwLmZvcl9hbGwgdC50cmVlIH5mXG4gIGxldCBmb3JfYWxsaSB0IH5mID0gVHJlZTAuZm9yX2FsbGkgdC50cmVlIH5mXG4gIGxldCBleGlzdHMgdCB+ZiA9IFRyZWUwLmV4aXN0cyB0LnRyZWUgfmZcbiAgbGV0IGV4aXN0c2kgdCB+ZiA9IFRyZWUwLmV4aXN0c2kgdC50cmVlIH5mXG4gIGxldCBjb3VudCB0IH5mID0gVHJlZTAuY291bnQgdC50cmVlIH5mXG4gIGxldCBjb3VudGkgdCB+ZiA9IFRyZWUwLmNvdW50aSB0LnRyZWUgfmZcblxuICBsZXQgc3BsaXQgdCBrID1cbiAgICBsZXQgbCwgbWF5YmUsIHIgPSBUcmVlMC5zcGxpdCB0LnRyZWUgayB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpIGluXG4gICAgbGV0IGNvbXBhcmF0b3IgPSBjb21wYXJhdG9yIHQgaW5cbiAgICAoKiBUcnkgdG8gdHJhdmVyc2UgdGhlIGxlYXN0IGFtb3VudCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aCxcbiAgICAgICB1c2luZyBoZWlnaHQgYXMgYSBoZXVyaXN0aWMuICopXG4gICAgbGV0IGJvdGhfbGVuID0gaWYgT3B0aW9uLmlzX3NvbWUgbWF5YmUgdGhlbiB0Lmxlbmd0aCAtIDEgZWxzZSB0Lmxlbmd0aCBpblxuICAgIGlmIFRyZWUwLmhlaWdodCBsIDwgVHJlZTAuaGVpZ2h0IHJcbiAgICB0aGVuIChcbiAgICAgIGxldCBsID0gb2ZfdHJlZSBsIH5jb21wYXJhdG9yIGluXG4gICAgICBsLCBtYXliZSwgb2ZfdHJlZV91bnNhZmUgciB+Y29tcGFyYXRvciB+bGVuZ3RoOihib3RoX2xlbiAtIGxlbmd0aCBsKSlcbiAgICBlbHNlIChcbiAgICAgIGxldCByID0gb2ZfdHJlZSByIH5jb21wYXJhdG9yIGluXG4gICAgICBvZl90cmVlX3Vuc2FmZSBsIH5jb21wYXJhdG9yIH5sZW5ndGg6KGJvdGhfbGVuIC0gbGVuZ3RoIHIpLCBtYXliZSwgcilcbiAgOztcblxuICBsZXQgc3VicmFuZ2UgdCB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kID1cbiAgICBsZXQgbGVmdCwgbWlkLCByaWdodCA9XG4gICAgICBUcmVlMC5zcGxpdF9yYW5nZSB0LnRyZWUgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gICAgaW5cbiAgICAoKiBUcnkgdG8gdHJhdmVyc2UgdGhlIGxlYXN0IGFtb3VudCBwb3NzaWJsZSB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aCxcbiAgICAgICB1c2luZyBoZWlnaHQgYXMgYSBoZXVyaXN0aWMuICopXG4gICAgbGV0IG91dGVyX2pvaW5lZF9oZWlnaHQgPVxuICAgICAgbGV0IGhfbCA9IFRyZWUwLmhlaWdodCBsZWZ0XG4gICAgICBhbmQgaF9yID0gVHJlZTAuaGVpZ2h0IHJpZ2h0IGluXG4gICAgICBpZiBoX2wgPSBoX3IgdGhlbiBoX2wgKyAxIGVsc2UgbWF4IGhfbCBoX3JcbiAgICBpblxuICAgIGlmIG91dGVyX2pvaW5lZF9oZWlnaHQgPCBUcmVlMC5oZWlnaHQgbWlkXG4gICAgdGhlbiAoXG4gICAgICBsZXQgbWlkX2xlbmd0aCA9IHQubGVuZ3RoIC0gKFRyZWUwLmxlbmd0aCBsZWZ0ICsgVHJlZTAubGVuZ3RoIHJpZ2h0KSBpblxuICAgICAgb2ZfdHJlZV91bnNhZmUgbWlkIH5jb21wYXJhdG9yOihjb21wYXJhdG9yIHQpIH5sZW5ndGg6bWlkX2xlbmd0aClcbiAgICBlbHNlIG9mX3RyZWUgbWlkIH5jb21wYXJhdG9yOihjb21wYXJhdG9yIHQpXG4gIDs7XG5cbiAgbGV0IGFwcGVuZCB+bG93ZXJfcGFydCB+dXBwZXJfcGFydCA9XG4gICAgbWF0Y2hcbiAgICAgIFRyZWUwLmFwcGVuZFxuICAgICAgICB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IGxvd2VyX3BhcnQpXG4gICAgICAgIH5sb3dlcl9wYXJ0Omxvd2VyX3BhcnQudHJlZVxuICAgICAgICB+dXBwZXJfcGFydDp1cHBlcl9wYXJ0LnRyZWVcbiAgICB3aXRoXG4gICAgfCBgT2sgdHJlZSAtPlxuICAgICAgYE9rXG4gICAgICAgIChvZl90cmVlX3Vuc2FmZVxuICAgICAgICAgICB0cmVlXG4gICAgICAgICAgIH5jb21wYXJhdG9yOihjb21wYXJhdG9yIGxvd2VyX3BhcnQpXG4gICAgICAgICAgIH5sZW5ndGg6KGxvd2VyX3BhcnQubGVuZ3RoICsgdXBwZXJfcGFydC5sZW5ndGgpKVxuICAgIHwgYE92ZXJsYXBwaW5nX2tleV9yYW5nZXMgLT4gYE92ZXJsYXBwaW5nX2tleV9yYW5nZXNcbiAgOztcblxuICBsZXQgZm9sZF9yYW5nZV9pbmNsdXNpdmUgdCB+bWluIH5tYXggfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGRfcmFuZ2VfaW5jbHVzaXZlIHQudHJlZSB+bWluIH5tYXggfmluaXQgfmYgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICA7O1xuXG4gIGxldCByYW5nZV90b19hbGlzdCB0IH5taW4gfm1heCA9XG4gICAgVHJlZTAucmFuZ2VfdG9fYWxpc3QgdC50cmVlIH5taW4gfm1heCB+Y29tcGFyZV9rZXk6KGNvbXBhcmVfa2V5IHQpXG4gIDs7XG5cbiAgbGV0IGNsb3Nlc3Rfa2V5IHQgZGlyIGtleSA9XG4gICAgVHJlZTAuY2xvc2VzdF9rZXkgdC50cmVlIGRpciBrZXkgfmNvbXBhcmVfa2V5Oihjb21wYXJlX2tleSB0KVxuICA7O1xuXG4gIGxldCBudGggdCBuID0gVHJlZTAubnRoIHQudHJlZSBuXG4gIGxldCBudGhfZXhuIHQgbiA9IE9wdGlvbi52YWx1ZV9leG4gKG50aCB0IG4pXG4gIGxldCByYW5rIHQga2V5ID0gVHJlZTAucmFuayB0LnRyZWUga2V5IH5jb21wYXJlX2tleTooY29tcGFyZV9rZXkgdClcbiAgbGV0IHNleHBfb2ZfdCBzZXhwX29mX2sgc2V4cF9vZl92IF8gdCA9IFRyZWUwLnNleHBfb2ZfdCBzZXhwX29mX2sgc2V4cF9vZl92IHQudHJlZVxuXG4gIGxldCB0b19zZXF1ZW5jZSA/b3JkZXIgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90byA/a2V5c19sZXNzX29yX2VxdWFsX3RvIHQgPVxuICAgIFRyZWUwLnRvX3NlcXVlbmNlXG4gICAgICB0LmNvbXBhcmF0b3JcbiAgICAgID9vcmRlclxuICAgICAgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90b1xuICAgICAgP2tleXNfbGVzc19vcl9lcXVhbF90b1xuICAgICAgdC50cmVlXG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggdCB+Y29tcGFyZSBob3cgdiA9IFRyZWUwLmJpbmFyeV9zZWFyY2ggdC50cmVlIH5jb21wYXJlIGhvdyB2XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93ID1cbiAgICBUcmVlMC5iaW5hcnlfc2VhcmNoX3NlZ21lbnRlZCB0LnRyZWUgfnNlZ21lbnRfb2YgaG93XG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9kaXJlY3QgaGFzaF9mb2xkX2tleSBoYXNoX2ZvbGRfZGF0YSBzdGF0ZSB0ID1cbiAgICBUcmVlMC5oYXNoX2ZvbGRfdF9pZ25vcmluZ19zdHJ1Y3R1cmUgaGFzaF9mb2xkX2tleSBoYXNoX2ZvbGRfZGF0YSBzdGF0ZSB0LnRyZWVcbiAgOztcblxuICBsZXQgYmluYXJ5X3NlYXJjaF9zdWJyYW5nZSB0IH5jb21wYXJlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmQgPVxuICAgIG1hdGNoXG4gICAgICBUcmVlMC5iaW5hcnlfc2VhcmNoX3R3b19zaWRlZF9ib3VuZHMgdC50cmVlIH5jb21wYXJlIH5sb3dlcl9ib3VuZCB+dXBwZXJfYm91bmRcbiAgICB3aXRoXG4gICAgfCBTb21lIChsb3dlcl9ib3VuZCwgdXBwZXJfYm91bmQpIC0+IHN1YnJhbmdlIHQgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZFxuICAgIHwgTm9uZSAtPiBsaWtlX21heWJlX25vX29wIHQgKEVtcHR5LCAwKVxuICA7O1xuZW5kXG5cbigqIFswXSBpcyB1c2VkIGFzIHRoZSBbbGVuZ3RoXSBhcmd1bWVudCBldmVyeXdoZXJlIGluIHRoaXMgbW9kdWxlLCBzaW5jZSB0cmVlcyBkbyBub3RcbiAgIGhhdmUgdGhlaXIgbGVuZ3RocyBzdG9yZWQgYXQgdGhlIHJvb3QsIHVubGlrZSBtYXBzLiBUaGUgdmFsdWVzIGFyZSBkaXNjYXJkZWQgYWx3YXlzLiAqKVxubW9kdWxlIFRyZWUgPSBzdHJ1Y3RcbiAgdHlwZSAoJ2ssICd2LCAnY29tcGFyYXRvcikgdCA9ICgnaywgJ3YsICdjb21wYXJhdG9yKSB0cmVlXG5cbiAgbGV0IGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gPSBUcmVlMC5lbXB0eVxuICBsZXQgZW1wdHkgfmNvbXBhcmF0b3I6XyA9IGVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb25cbiAgbGV0IG9mX3RyZWUgfmNvbXBhcmF0b3I6XyB0cmVlID0gdHJlZVxuICBsZXQgc2luZ2xldG9uIH5jb21wYXJhdG9yOl8gayB2ID0gVHJlZTAuc2luZ2xldG9uIGsgdlxuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBmc3QgKFRyZWUwLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgYXJyYXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgfmNvbXBhcmF0b3IgYXJyYXkgPVxuICAgIFRyZWUwLm9mX3NvcnRlZF9hcnJheSBhcnJheSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICB8PiBPcl9lcnJvci5tYXAgfmY6ZnN0XG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0IH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBtYXRjaCBUcmVlMC5vZl9hbGlzdCBhbGlzdCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyBkIC0+IGRcbiAgICB8IGBPayAodHJlZSwgX3NpemUpIC0+IGBPayB0cmVlXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X29yX2Vycm9yIH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBUcmVlMC5vZl9hbGlzdF9vcl9lcnJvciBhbGlzdCB+Y29tcGFyYXRvciB8PiBPcl9lcnJvci5tYXAgfmY6ZnN0XG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X2V4biB+Y29tcGFyYXRvciBhbGlzdCA9IGZzdCAoVHJlZTAub2ZfYWxpc3RfZXhuIGFsaXN0IH5jb21wYXJhdG9yKVxuXG4gIGxldCBvZl9hbGlzdF9tdWx0aSB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgZnN0IChUcmVlMC5vZl9hbGlzdF9tdWx0aSBhbGlzdCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X2ZvbGQgfmNvbXBhcmF0b3IgYWxpc3QgfmluaXQgfmYgPVxuICAgIGZzdCAoVHJlZTAub2ZfYWxpc3RfZm9sZCBhbGlzdCB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X3JlZHVjZSB+Y29tcGFyYXRvciBhbGlzdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5vZl9hbGlzdF9yZWR1Y2UgYWxpc3QgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9pdGVyaSB+Y29tcGFyYXRvciB+aXRlcmkgPVxuICAgIG1hdGNoIFRyZWUwLm9mX2l0ZXJpIH5pdGVyaSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYE9rICh0cmVlLCBfc2l6ZSkgLT4gYE9rIHRyZWVcbiAgICB8IGBEdXBsaWNhdGVfa2V5IF8gYXMgZCAtPiBkXG4gIDs7XG5cbiAgbGV0IG9mX2l0ZXJpX2V4biB+Y29tcGFyYXRvciB+aXRlcmkgPSBmc3QgKFRyZWUwLm9mX2l0ZXJpX2V4biB+aXRlcmkgfmNvbXBhcmF0b3IpXG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5jb21wYXJhdG9yOl9yZXF1aXJlZF9ieV9pbnRmIH5sZW4gfmYgPVxuICAgIFRyZWUwLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmZcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIE9yX2Vycm9yLm1hcFxuICAgICAgfmY6ZnN0XG4gICAgICAoVHJlZTAub2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9zZXF1ZW5jZSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIG1hdGNoIFRyZWUwLm9mX3NlcXVlbmNlIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyBkIC0+IGRcbiAgICB8IGBPayAodHJlZSwgX3NpemUpIC0+IGBPayB0cmVlXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX29yX2Vycm9yIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgVHJlZTAub2Zfc2VxdWVuY2Vfb3JfZXJyb3Igc2VxIH5jb21wYXJhdG9yIHw+IE9yX2Vycm9yLm1hcCB+Zjpmc3RcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfZXhuIH5jb21wYXJhdG9yIHNlcSA9IGZzdCAoVHJlZTAub2Zfc2VxdWVuY2VfZXhuIHNlcSB+Y29tcGFyYXRvcilcblxuICBsZXQgb2Zfc2VxdWVuY2VfbXVsdGkgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBmc3QgKFRyZWUwLm9mX3NlcXVlbmNlX211bHRpIHNlcSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX2ZvbGQgfmNvbXBhcmF0b3Igc2VxIH5pbml0IH5mID1cbiAgICBmc3QgKFRyZWUwLm9mX3NlcXVlbmNlX2ZvbGQgc2VxIH5pbml0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfcmVkdWNlIH5jb21wYXJhdG9yIHNlcSB+ZiA9XG4gICAgZnN0IChUcmVlMC5vZl9zZXF1ZW5jZV9yZWR1Y2Ugc2VxIH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgdG9fdHJlZSB0ID0gdFxuXG4gIGxldCBpbnZhcmlhbnRzIH5jb21wYXJhdG9yIHQgPVxuICAgIFRyZWUwLmludmFyaWFudHMgdCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgaXNfZW1wdHkgdCA9IFRyZWUwLmlzX2VtcHR5IHRcbiAgbGV0IGxlbmd0aCB0ID0gVHJlZTAubGVuZ3RoIHRcblxuICBsZXQgc2V0IH5jb21wYXJhdG9yIHQgfmtleSB+ZGF0YSA9XG4gICAgZnN0IChUcmVlMC5zZXQgdCB+a2V5IH5kYXRhIH5sZW5ndGg6MCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGFkZF9leG4gfmNvbXBhcmF0b3IgdCB+a2V5IH5kYXRhID1cbiAgICBmc3RcbiAgICAgIChUcmVlMC5hZGRfZXhuXG4gICAgICAgICB0XG4gICAgICAgICB+a2V5XG4gICAgICAgICB+ZGF0YVxuICAgICAgICAgfmxlbmd0aDowXG4gICAgICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICAgICAgIH5zZXhwX29mX2tleTpjb21wYXJhdG9yLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgYWRkIH5jb21wYXJhdG9yIHQgfmtleSB+ZGF0YSA9XG4gICAgdHJ5IGBPayAoYWRkX2V4biB0IH5jb21wYXJhdG9yIH5rZXkgfmRhdGEpIHdpdGhcbiAgICB8IF8gLT4gYER1cGxpY2F0ZVxuICA7O1xuXG4gIGxldCBhZGRfbXVsdGkgfmNvbXBhcmF0b3IgdCB+a2V5IH5kYXRhID1cbiAgICBUcmVlMC5hZGRfbXVsdGkgdCB+a2V5IH5kYXRhIH5sZW5ndGg6MCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICB8PiBmc3RcbiAgOztcblxuICBsZXQgcmVtb3ZlX211bHRpIH5jb21wYXJhdG9yIHQga2V5ID1cbiAgICBUcmVlMC5yZW1vdmVfbXVsdGkgdCBrZXkgfmxlbmd0aDowIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB8PiBmc3RcbiAgOztcblxuICBsZXQgZmluZF9tdWx0aSB+Y29tcGFyYXRvciB0IGtleSA9XG4gICAgVHJlZTAuZmluZF9tdWx0aSB0IGtleSB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgY2hhbmdlIH5jb21wYXJhdG9yIHQga2V5IH5mID1cbiAgICBmc3QgKFRyZWUwLmNoYW5nZSB0IGtleSB+ZiB+bGVuZ3RoOjAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCB1cGRhdGUgfmNvbXBhcmF0b3IgdCBrZXkgfmYgPVxuICAgIGNoYW5nZSB+Y29tcGFyYXRvciB0IGtleSB+ZjooZnVuIGRhdGEgLT4gU29tZSAoZiBkYXRhKSlcbiAgOztcblxuICBsZXQgZmluZF9leG4gfmNvbXBhcmF0b3IgdCBrZXkgPVxuICAgIFRyZWUwLmZpbmRfZXhuXG4gICAgICB0XG4gICAgICBrZXlcbiAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgICAgfnNleHBfb2Zfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5zZXhwX29mX3RcbiAgOztcblxuICBsZXQgZmluZCB+Y29tcGFyYXRvciB0IGtleSA9IFRyZWUwLmZpbmQgdCBrZXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG5cbiAgbGV0IHJlbW92ZSB+Y29tcGFyYXRvciB0IGtleSA9XG4gICAgZnN0IChUcmVlMC5yZW1vdmUgdCBrZXkgfmxlbmd0aDowIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgbWVtIH5jb21wYXJhdG9yIHQga2V5ID0gVHJlZTAubWVtIHQga2V5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICBsZXQgaXRlcl9rZXlzIHQgfmYgPSBUcmVlMC5pdGVyX2tleXMgdCB+ZlxuICBsZXQgaXRlciB0IH5mID0gVHJlZTAuaXRlciB0IH5mXG4gIGxldCBpdGVyaSB0IH5mID0gVHJlZTAuaXRlcmkgdCB+ZlxuICBsZXQgaXRlcmlfdW50aWwgdCB+ZiA9IFRyZWUwLml0ZXJpX3VudGlsIHQgfmZcblxuICBsZXQgaXRlcjIgfmNvbXBhcmF0b3IgdDEgdDIgfmYgPVxuICAgIFRyZWUwLml0ZXIyIHQxIHQyIH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBtYXAgdCB+ZiA9IFRyZWUwLm1hcCB0IH5mXG4gIGxldCBtYXBpIHQgfmYgPSBUcmVlMC5tYXBpIHQgfmZcbiAgbGV0IGZvbGQgdCB+aW5pdCB+ZiA9IFRyZWUwLmZvbGQgdCB+ZiB+aW5pdFxuICBsZXQgZm9sZF91bnRpbCB0IH5pbml0IH5mIH5maW5pc2ggPSBUcmVlMC5mb2xkX3VudGlsIHQgfmYgfmluaXQgfmZpbmlzaFxuICBsZXQgZm9sZF9yaWdodCB0IH5pbml0IH5mID0gVHJlZTAuZm9sZF9yaWdodCB0IH5mIH5pbml0XG5cbiAgbGV0IGZvbGQyIH5jb21wYXJhdG9yIHQxIHQyIH5pbml0IH5mID1cbiAgICBUcmVlMC5mb2xkMiB0MSB0MiB+aW5pdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgOztcblxuICBsZXQgZmlsdGVyX2tleXMgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgZnN0IChUcmVlMC5maWx0ZXJfa2V5cyB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgZmlsdGVyIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGZzdCAoVHJlZTAuZmlsdGVyIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBmaWx0ZXJpIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGZzdCAoVHJlZTAuZmlsdGVyaSB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgZmlsdGVyX21hcCB+Y29tcGFyYXRvciB0IH5mID1cbiAgICBmc3QgKFRyZWUwLmZpbHRlcl9tYXAgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9tYXBpIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGZzdCAoVHJlZTAuZmlsdGVyX21hcGkgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbl9tYXBpIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGxldCAoYSwgXyksIChiLCBfKSA9XG4gICAgICBUcmVlMC5wYXJ0aXRpb25fbWFwaSB0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICAgIGluXG4gICAgYSwgYlxuICA7O1xuXG4gIGxldCBwYXJ0aXRpb25fbWFwIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGxldCAoYSwgXyksIChiLCBfKSA9XG4gICAgICBUcmVlMC5wYXJ0aXRpb25fbWFwIHQgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICBhLCBiXG4gIDs7XG5cbiAgbGV0IHBhcnRpdGlvbmlfdGYgfmNvbXBhcmF0b3IgdCB+ZiA9XG4gICAgbGV0IChhLCBfKSwgKGIsIF8pID1cbiAgICAgIFRyZWUwLnBhcnRpdGlvbmlfdGYgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIGEsIGJcbiAgOztcblxuICBsZXQgcGFydGl0aW9uX3RmIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIGxldCAoYSwgXyksIChiLCBfKSA9XG4gICAgICBUcmVlMC5wYXJ0aXRpb25fdGYgdCB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICBpblxuICAgIGEsIGJcbiAgOztcblxuICBsZXQgY29tYmluZV9lcnJvcnMgfmNvbXBhcmF0b3IgdCA9XG4gICAgT3JfZXJyb3IubWFwXG4gICAgICB+Zjpmc3RcbiAgICAgIChUcmVlMC5jb21iaW5lX2Vycm9yc1xuICAgICAgICAgdFxuICAgICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgICAgICB+c2V4cF9vZl9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLnNleHBfb2ZfdClcbiAgOztcblxuICBsZXQgY29tcGFyZV9kaXJlY3QgfmNvbXBhcmF0b3IgY29tcGFyZV9kYXRhIHQxIHQyID1cbiAgICBUcmVlMC5jb21wYXJlIGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIGNvbXBhcmVfZGF0YSB0MSB0MlxuICA7O1xuXG4gIGxldCBlcXVhbCB+Y29tcGFyYXRvciBjb21wYXJlX2RhdGEgdDEgdDIgPVxuICAgIFRyZWUwLmVxdWFsIGNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIGNvbXBhcmVfZGF0YSB0MSB0MlxuICA7O1xuXG4gIGxldCBrZXlzIHQgPSBUcmVlMC5rZXlzIHRcbiAgbGV0IGRhdGEgdCA9IFRyZWUwLmRhdGEgdFxuICBsZXQgdG9fYWxpc3QgP2tleV9vcmRlciB0ID0gVHJlZTAudG9fYWxpc3QgP2tleV9vcmRlciB0XG5cbiAgbGV0IHN5bW1ldHJpY19kaWZmIH5jb21wYXJhdG9yIHQxIHQyIH5kYXRhX2VxdWFsID1cbiAgICBUcmVlMC5zeW1tZXRyaWNfZGlmZiB0MSB0MiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgfmRhdGFfZXF1YWxcbiAgOztcblxuICBsZXQgZm9sZF9zeW1tZXRyaWNfZGlmZiB+Y29tcGFyYXRvciB0MSB0MiB+ZGF0YV9lcXVhbCB+aW5pdCB+ZiA9XG4gICAgVHJlZTAuZm9sZF9zeW1tZXRyaWNfZGlmZlxuICAgICAgdDFcbiAgICAgIHQyXG4gICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcbiAgICAgIH5kYXRhX2VxdWFsXG4gICAgICB+aW5pdFxuICAgICAgfmZcbiAgOztcblxuICBsZXQgbWVyZ2UgfmNvbXBhcmF0b3IgdDEgdDIgfmYgPVxuICAgIGZzdCAoVHJlZTAubWVyZ2UgdDEgdDIgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBtZXJnZV9za2V3ZWQgfmNvbXBhcmF0b3IgdDEgdDIgfmNvbWJpbmUgPVxuICAgICgqIExlbmd0aCBjb21wdXRhdGlvbiBtYWtlcyB0aGlzIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gW21lcmdlX3NrZXdlZF0gb24gYSBtYXBcbiAgICAgICB3aXRoIGEgW2xlbmd0aF0gZmllbGQsIGJ1dCBkb2VzIHByZXNlcnZlIGFtb3VudCBvZiBhbGxvY2F0aW9uLiAqKVxuICAgIGZzdFxuICAgICAgKFRyZWUwLm1lcmdlX3NrZXdlZFxuICAgICAgICAgdDFcbiAgICAgICAgIHQyXG4gICAgICAgICB+bGVuZ3RoMToobGVuZ3RoIHQxKVxuICAgICAgICAgfmxlbmd0aDI6KGxlbmd0aCB0MilcbiAgICAgICAgIH5jb21iaW5lXG4gICAgICAgICB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IG1pbl9lbHQgdCA9IFRyZWUwLm1pbl9lbHQgdFxuICBsZXQgbWluX2VsdF9leG4gdCA9IFRyZWUwLm1pbl9lbHRfZXhuIHRcbiAgbGV0IG1heF9lbHQgdCA9IFRyZWUwLm1heF9lbHQgdFxuICBsZXQgbWF4X2VsdF9leG4gdCA9IFRyZWUwLm1heF9lbHRfZXhuIHRcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IFRyZWUwLmZvcl9hbGwgdCB+ZlxuICBsZXQgZm9yX2FsbGkgdCB+ZiA9IFRyZWUwLmZvcl9hbGxpIHQgfmZcbiAgbGV0IGV4aXN0cyB0IH5mID0gVHJlZTAuZXhpc3RzIHQgfmZcbiAgbGV0IGV4aXN0c2kgdCB+ZiA9IFRyZWUwLmV4aXN0c2kgdCB+ZlxuICBsZXQgY291bnQgdCB+ZiA9IFRyZWUwLmNvdW50IHQgfmZcbiAgbGV0IGNvdW50aSB0IH5mID0gVHJlZTAuY291bnRpIHQgfmZcbiAgbGV0IHNwbGl0IH5jb21wYXJhdG9yIHQgayA9IFRyZWUwLnNwbGl0IHQgayB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmVcblxuICBsZXQgYXBwZW5kIH5jb21wYXJhdG9yIH5sb3dlcl9wYXJ0IH51cHBlcl9wYXJ0ID1cbiAgICBUcmVlMC5hcHBlbmQgfmxvd2VyX3BhcnQgfnVwcGVyX3BhcnQgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IHN1YnJhbmdlIH5jb21wYXJhdG9yIHQgfmxvd2VyX2JvdW5kIH51cHBlcl9ib3VuZCA9XG4gICAgbGV0IF8sIHJldCwgXyA9XG4gICAgICBUcmVlMC5zcGxpdF9yYW5nZVxuICAgICAgICB0XG4gICAgICAgIH5sb3dlcl9ib3VuZFxuICAgICAgICB+dXBwZXJfYm91bmRcbiAgICAgICAgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gICAgaW5cbiAgICByZXRcbiAgOztcblxuICBsZXQgZm9sZF9yYW5nZV9pbmNsdXNpdmUgfmNvbXBhcmF0b3IgdCB+bWluIH5tYXggfmluaXQgfmYgPVxuICAgIFRyZWUwLmZvbGRfcmFuZ2VfaW5jbHVzaXZlXG4gICAgICB0XG4gICAgICB+bWluXG4gICAgICB+bWF4XG4gICAgICB+aW5pdFxuICAgICAgfmZcbiAgICAgIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCByYW5nZV90b19hbGlzdCB+Y29tcGFyYXRvciB0IH5taW4gfm1heCA9XG4gICAgVHJlZTAucmFuZ2VfdG9fYWxpc3QgdCB+bWluIH5tYXggfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIDs7XG5cbiAgbGV0IGNsb3Nlc3Rfa2V5IH5jb21wYXJhdG9yIHQgZGlyIGtleSA9XG4gICAgVHJlZTAuY2xvc2VzdF9rZXkgdCBkaXIga2V5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZVxuICA7O1xuXG4gIGxldCBudGggdCBuID0gVHJlZTAubnRoIHQgblxuICBsZXQgbnRoX2V4biB0IG4gPSBPcHRpb24udmFsdWVfZXhuIChudGggdCBuKVxuICBsZXQgcmFuayB+Y29tcGFyYXRvciB0IGtleSA9IFRyZWUwLnJhbmsgdCBrZXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlXG4gIGxldCBzZXhwX29mX3Qgc2V4cF9vZl9rIHNleHBfb2ZfdiBfIHQgPSBUcmVlMC5zZXhwX29mX3Qgc2V4cF9vZl9rIHNleHBfb2ZfdiB0XG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3Iga19vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwID1cbiAgICBmc3QgKFRyZWUwLnRfb2Zfc2V4cF9kaXJlY3Qga19vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwIH5jb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCB0b19zZXF1ZW5jZSB+Y29tcGFyYXRvciA/b3JkZXIgP2tleXNfZ3JlYXRlcl9vcl9lcXVhbF90byA/a2V5c19sZXNzX29yX2VxdWFsX3RvIHQgPVxuICAgIFRyZWUwLnRvX3NlcXVlbmNlIGNvbXBhcmF0b3IgP29yZGVyID9rZXlzX2dyZWF0ZXJfb3JfZXF1YWxfdG8gP2tleXNfbGVzc19vcl9lcXVhbF90byB0XG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2ggfmNvbXBhcmF0b3I6XyB0IH5jb21wYXJlIGhvdyB2ID0gVHJlZTAuYmluYXJ5X3NlYXJjaCB0IH5jb21wYXJlIGhvdyB2XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIH5jb21wYXJhdG9yOl8gdCB+c2VnbWVudF9vZiBob3cgPVxuICAgIFRyZWUwLmJpbmFyeV9zZWFyY2hfc2VnbWVudGVkIHQgfnNlZ21lbnRfb2YgaG93XG4gIDs7XG5cbiAgbGV0IGJpbmFyeV9zZWFyY2hfc3VicmFuZ2UgfmNvbXBhcmF0b3IgdCB+Y29tcGFyZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kID1cbiAgICBtYXRjaCBUcmVlMC5iaW5hcnlfc2VhcmNoX3R3b19zaWRlZF9ib3VuZHMgdCB+Y29tcGFyZSB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kIHdpdGhcbiAgICB8IFNvbWUgKGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCkgLT4gc3VicmFuZ2UgfmNvbXBhcmF0b3IgdCB+bG93ZXJfYm91bmQgfnVwcGVyX2JvdW5kXG4gICAgfCBOb25lIC0+IEVtcHR5XG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIG1hdGNoIFRyZWUwLm1hcF9rZXlzIH5jb21wYXJhdG9yIHQgfmYgd2l0aFxuICAgIHwgYE9rICh0LCBfKSAtPiBgT2sgdFxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyBkdXAgLT4gZHVwXG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzX2V4biB+Y29tcGFyYXRvciB0IH5mID0gZnN0IChUcmVlMC5tYXBfa2V5c19leG4gfmNvbXBhcmF0b3IgdCB+ZilcblxuICBtb2R1bGUgQnVpbGRfaW5jcmVhc2luZyA9IHN0cnVjdFxuICAgIHR5cGUgKCdrLCAndiwgJ3cpIHQgPSAoJ2ssICd2KSBUcmVlMC5CdWlsZF9pbmNyZWFzaW5nLnRcblxuICAgIGxldCBlbXB0eSA9IFRyZWUwLkJ1aWxkX2luY3JlYXNpbmcuZW1wdHlcblxuICAgIGxldCBhZGRfZXhuIHQgfmNvbXBhcmF0b3IgfmtleSB+ZGF0YSA9XG4gICAgICBtYXRjaCBUcmVlMC5CdWlsZF9pbmNyZWFzaW5nLm1heF9rZXkgdCB3aXRoXG4gICAgICB8IFNvbWUgcHJldl9rZXkgd2hlbiBjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSBwcmV2X2tleSBrZXkgPj0gMCAtPlxuICAgICAgICBFcnJvci5yYWlzZV9zIChTZXhwLkF0b20gXCJNYXAuQnVpbGRfaW5jcmVhc2luZy5hZGQ6IG5vbi1pbmNyZWFzaW5nIGtleVwiKVxuICAgICAgfCBfIC0+IFRyZWUwLkJ1aWxkX2luY3JlYXNpbmcuYWRkX3VuY2hlY2tlZCB0IH5rZXkgfmRhdGFcbiAgICA7O1xuXG4gICAgbGV0IHRvX3RyZWUgdCA9IFRyZWUwLkJ1aWxkX2luY3JlYXNpbmcudG9fdHJlZV91bmNoZWNrZWQgdFxuICBlbmRcbmVuZFxuXG5tb2R1bGUgVXNpbmdfY29tcGFyYXRvciA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyAoJ2ssICd2LCAnY21wKSB0ID0gKCdrLCAndiwgJ2NtcCkgdFxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IGVtcHR5IH5jb21wYXJhdG9yID0geyB0cmVlID0gVHJlZTAuZW1wdHk7IGNvbXBhcmF0b3I7IGxlbmd0aCA9IDAgfVxuICBsZXQgc2luZ2xldG9uIH5jb21wYXJhdG9yIGsgdiA9IHsgY29tcGFyYXRvcjsgdHJlZSA9IFRyZWUwLnNpbmdsZXRvbiBrIHY7IGxlbmd0aCA9IDEgfVxuICBsZXQgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKHRyZWUsIGxlbmd0aCkgPSB7IGNvbXBhcmF0b3I7IHRyZWU7IGxlbmd0aCB9XG4gIGxldCBvZl90cmVlIH5jb21wYXJhdG9yIHRyZWUgPSBvZl90cmVlMCB+Y29tcGFyYXRvciAodHJlZSwgVHJlZTAubGVuZ3RoIHRyZWUpXG4gIGxldCB0b190cmVlID0gdG9fdHJlZVxuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIGFycmF5IH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGFycmF5ID1cbiAgICBPcl9lcnJvci5tYXBcbiAgICAgIChUcmVlMC5vZl9zb3J0ZWRfYXJyYXkgYXJyYXkgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICAgICAgfmY6KGZ1biB0cmVlIC0+IG9mX3RyZWUwIH5jb21wYXJhdG9yIHRyZWUpXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0IH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBtYXRjaCBUcmVlMC5vZl9hbGlzdCBhbGlzdCB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUgd2l0aFxuICAgIHwgYE9rICh0cmVlLCBsZW5ndGgpIC0+IGBPayB7IGNvbXBhcmF0b3I7IHRyZWU7IGxlbmd0aCB9XG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIHogLT4gelxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9vcl9lcnJvciB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgUmVzdWx0Lm1hcCAoVHJlZTAub2ZfYWxpc3Rfb3JfZXJyb3IgYWxpc3QgfmNvbXBhcmF0b3IpIH5mOihmdW4gdHJlZSAtPlxuICAgICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgdHJlZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfZXhuIH5jb21wYXJhdG9yIGFsaXN0ID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAub2ZfYWxpc3RfZXhuIGFsaXN0IH5jb21wYXJhdG9yKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9tdWx0aSB+Y29tcGFyYXRvciBhbGlzdCA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2ZfYWxpc3RfbXVsdGkgYWxpc3QgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9mb2xkIH5jb21wYXJhdG9yIGFsaXN0IH5pbml0IH5mID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9hbGlzdF9mb2xkIGFsaXN0IH5pbml0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2ZfYWxpc3RfcmVkdWNlIH5jb21wYXJhdG9yIGFsaXN0IH5mID1cbiAgICBvZl90cmVlMFxuICAgICAgfmNvbXBhcmF0b3JcbiAgICAgIChUcmVlMC5vZl9hbGlzdF9yZWR1Y2UgYWxpc3QgfmYgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlKVxuICA7O1xuXG4gIGxldCBvZl9pdGVyaSB+Y29tcGFyYXRvciB+aXRlcmkgPVxuICAgIG1hdGNoIFRyZWUwLm9mX2l0ZXJpIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSB+aXRlcmkgd2l0aFxuICAgIHwgYE9rIHRyZWVfbGVuZ3RoIC0+IGBPayAob2ZfdHJlZTAgfmNvbXBhcmF0b3IgdHJlZV9sZW5ndGgpXG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIHogLT4gelxuICA7O1xuXG4gIGxldCBvZl9pdGVyaV9leG4gfmNvbXBhcmF0b3Igfml0ZXJpID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAub2ZfaXRlcmlfZXhuIH5jb21wYXJhdG9yIH5pdGVyaSlcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmNvbXBhcmF0b3IgfmxlbiB+ZiA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYsIGxlbilcbiAgOztcblxuICBsZXQgb2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSB+Y29tcGFyYXRvciBzZXEgPVxuICAgIE9yX2Vycm9yLm1hcFxuICAgICAgfmY6KG9mX3RyZWUwIH5jb21wYXJhdG9yKVxuICAgICAgKFRyZWUwLm9mX2luY3JlYXNpbmdfc2VxdWVuY2Ugc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBtYXRjaCBUcmVlMC5vZl9zZXF1ZW5jZSBzZXEgfmNvbXBhcmVfa2V5OmNvbXBhcmF0b3IuQ29tcGFyYXRvci5jb21wYXJlIHdpdGhcbiAgICB8IGBPayAodHJlZSwgbGVuZ3RoKSAtPiBgT2sgeyBjb21wYXJhdG9yOyB0cmVlOyBsZW5ndGggfVxuICAgIHwgYER1cGxpY2F0ZV9rZXkgXyBhcyB6IC0+IHpcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgfmNvbXBhcmF0b3Igc2VxID1cbiAgICBSZXN1bHQubWFwIChUcmVlMC5vZl9zZXF1ZW5jZV9vcl9lcnJvciBzZXEgfmNvbXBhcmF0b3IpIH5mOihmdW4gdHJlZSAtPlxuICAgICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgdHJlZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfZXhuIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgb2ZfdHJlZTAgfmNvbXBhcmF0b3IgKFRyZWUwLm9mX3NlcXVlbmNlX2V4biBzZXEgfmNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX211bHRpIH5jb21wYXJhdG9yIHNlcSA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2Zfc2VxdWVuY2VfbXVsdGkgc2VxIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfZm9sZCB+Y29tcGFyYXRvciBzZXEgfmluaXQgfmYgPVxuICAgIG9mX3RyZWUwXG4gICAgICB+Y29tcGFyYXRvclxuICAgICAgKFRyZWUwLm9mX3NlcXVlbmNlX2ZvbGQgc2VxIH5pbml0IH5mIH5jb21wYXJlX2tleTpjb21wYXJhdG9yLkNvbXBhcmF0b3IuY29tcGFyZSlcbiAgOztcblxuICBsZXQgb2Zfc2VxdWVuY2VfcmVkdWNlIH5jb21wYXJhdG9yIHNlcSB+ZiA9XG4gICAgb2ZfdHJlZTBcbiAgICAgIH5jb21wYXJhdG9yXG4gICAgICAoVHJlZTAub2Zfc2VxdWVuY2VfcmVkdWNlIHNlcSB+ZiB+Y29tcGFyZV9rZXk6Y29tcGFyYXRvci5Db21wYXJhdG9yLmNvbXBhcmUpXG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3Iga19vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwID1cbiAgICBvZl90cmVlMCB+Y29tcGFyYXRvciAoVHJlZTAudF9vZl9zZXhwX2RpcmVjdCBrX29mX3NleHAgdl9vZl9zZXhwIHNleHAgfmNvbXBhcmF0b3IpXG4gIDs7XG5cbiAgbGV0IG1hcF9rZXlzIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIG1hdGNoIFRyZWUwLm1hcF9rZXlzIHQudHJlZSB+ZiB+Y29tcGFyYXRvciB3aXRoXG4gICAgfCBgT2sgcGFpciAtPiBgT2sgKG9mX3RyZWUwIH5jb21wYXJhdG9yIHBhaXIpXG4gICAgfCBgRHVwbGljYXRlX2tleSBfIGFzIGR1cCAtPiBkdXBcbiAgOztcblxuICBsZXQgbWFwX2tleXNfZXhuIH5jb21wYXJhdG9yIHQgfmYgPVxuICAgIG9mX3RyZWUwIH5jb21wYXJhdG9yIChUcmVlMC5tYXBfa2V5c19leG4gdC50cmVlIH5mIH5jb21wYXJhdG9yKVxuICA7O1xuXG4gIG1vZHVsZSBFbXB0eV93aXRob3V0X3ZhbHVlX3Jlc3RyaWN0aW9uIChLIDogQ29tcGFyYXRvci5TMSkgPSBzdHJ1Y3RcbiAgICBsZXQgZW1wdHkgPSB7IHRyZWUgPSBUcmVlMC5lbXB0eTsgY29tcGFyYXRvciA9IEsuY29tcGFyYXRvcjsgbGVuZ3RoID0gMCB9XG4gIGVuZFxuXG4gIG1vZHVsZSBUcmVlID0gVHJlZVxuZW5kXG5cbmluY2x1ZGUgQWNjZXNzb3JzXG5cbnR5cGUgKCdrLCAnY21wKSBjb21wYXJhdG9yID1cbiAgKG1vZHVsZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgPSAnayBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSAnY21wKVxuXG5sZXQgY29tcGFyYXRvcl9zICh0eXBlIGsgY21wKSB0IDogKGssIGNtcCkgY29tcGFyYXRvciA9XG4gIChtb2R1bGUgc3RydWN0XG4gICAgdHlwZSB0ID0ga1xuICAgIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gY21wXG5cbiAgICBsZXQgY29tcGFyYXRvciA9IHQuY29tcGFyYXRvclxuICBlbmQpXG47O1xuXG5sZXQgdG9fY29tcGFyYXRvciAodHlwZSBrIGNtcCkgKChtb2R1bGUgTSkgOiAoaywgY21wKSBjb21wYXJhdG9yKSA9IE0uY29tcGFyYXRvclxuXG5sZXQgb2ZfdHJlZSAodHlwZSBrIGNtcCkgKChtb2R1bGUgTSkgOiAoaywgY21wKSBjb21wYXJhdG9yKSB0cmVlID1cbiAgb2ZfdHJlZSB+Y29tcGFyYXRvcjpNLmNvbXBhcmF0b3IgdHJlZVxuOztcblxubGV0IGVtcHR5IG0gPSBVc2luZ19jb21wYXJhdG9yLmVtcHR5IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pXG5sZXQgc2luZ2xldG9uIG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iuc2luZ2xldG9uIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9hbGlzdCBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcblxubGV0IG9mX2FsaXN0X29yX2Vycm9yIG0gYSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3Rfb3JfZXJyb3IgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgYVxuOztcblxubGV0IG9mX2FsaXN0X2V4biBtIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X2V4biB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5sZXQgb2ZfYWxpc3RfbXVsdGkgbSBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9tdWx0aSB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG5cbmxldCBvZl9hbGlzdF9mb2xkIG0gYSB+aW5pdCB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfZm9sZCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhIH5pbml0IH5mXG47O1xuXG5sZXQgb2ZfYWxpc3RfcmVkdWNlIG0gYSB+ZiA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfcmVkdWNlIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGEgfmZcbjs7XG5cbmxldCBvZl9zb3J0ZWRfYXJyYXlfdW5jaGVja2VkIG0gYSA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBhXG47O1xuXG5sZXQgb2Zfc29ydGVkX2FycmF5IG0gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIGFcbmxldCBvZl9pdGVyaSBtIH5pdGVyaSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfaXRlcmkgfml0ZXJpIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pXG5cbmxldCBvZl9pdGVyaV9leG4gbSB+aXRlcmkgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2l0ZXJpX2V4biB+aXRlcmkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSlcbjs7XG5cbmxldCBvZl9pbmNyZWFzaW5nX2l0ZXJhdG9yX3VuY2hlY2tlZCBtIH5sZW4gfmYgPVxuICBVc2luZ19jb21wYXJhdG9yLm9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSlcbjs7XG5cbmxldCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIG0gc2VxID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9pbmNyZWFzaW5nX3NlcXVlbmNlIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHNlcVxuOztcblxubGV0IG9mX3NlcXVlbmNlIG0gcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2UgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgc1xuXG5sZXQgb2Zfc2VxdWVuY2Vfb3JfZXJyb3IgbSBzID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9vcl9lcnJvciB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSBzXG47O1xuXG5sZXQgb2Zfc2VxdWVuY2VfZXhuIG0gcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfZXhuIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHNcblxubGV0IG9mX3NlcXVlbmNlX211bHRpIG0gcyA9XG4gIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfbXVsdGkgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgc1xuOztcblxubGV0IG9mX3NlcXVlbmNlX2ZvbGQgbSBzIH5pbml0IH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9mb2xkIH5jb21wYXJhdG9yOih0b19jb21wYXJhdG9yIG0pIHMgfmluaXQgfmZcbjs7XG5cbmxldCBvZl9zZXF1ZW5jZV9yZWR1Y2UgbSBzIH5mID1cbiAgVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9yZWR1Y2UgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgcyB+ZlxuOztcblxubGV0IG1hcF9rZXlzIG0gdCB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwX2tleXMgfmNvbXBhcmF0b3I6KHRvX2NvbXBhcmF0b3IgbSkgdCB+ZlxubGV0IG1hcF9rZXlzX2V4biBtIHQgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcF9rZXlzX2V4biB+Y29tcGFyYXRvcjoodG9fY29tcGFyYXRvciBtKSB0IH5mXG5cbm1vZHVsZSBNIChLIDogc2lnXG4gICAgdHlwZSB0XG4gICAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3NcbiAgZW5kKSA9XG5zdHJ1Y3RcbiAgdHlwZSBub25yZWMgJ3YgdCA9IChLLnQsICd2LCBLLmNvbXBhcmF0b3Jfd2l0bmVzcykgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gIFtAQEBlbmRdXG5cbiAgaW5jbHVkZSBDb21wYXJhdG9yLlMgd2l0aCB0eXBlIHQgOj0gdFxuZW5kXG5cbm1vZHVsZSB0eXBlIE1fc2V4cF9ncmFtbWFyID0gc2lnXG4gIHR5cGUgdCBbQEBkZXJpdmluZ19pbmxpbmUgc2V4cF9ncmFtbWFyXVxuXG4gIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICBbQEBAZW5kXVxuZW5kXG5cbm1vZHVsZSB0eXBlIENvbXBhcmVfbSA9IHNpZyBlbmRcbm1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG5tb2R1bGUgdHlwZSBIYXNoX2ZvbGRfbSA9IEhhc2hlci5TXG5cbmxldCBzZXhwX29mX21fX3QgKHR5cGUgaykgKG1vZHVsZSBLIDogU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gaykgc2V4cF9vZl92IHQgPVxuICBzZXhwX29mX3QgSy5zZXhwX29mX3Qgc2V4cF9vZl92IChmdW4gXyAtPiBTZXhwLkF0b20gXCJfXCIpIHRcbjs7XG5cbmxldCBtX190X29mX3NleHBcbiAgICAgICh0eXBlIGsgY21wKVxuICAgICAgKG1vZHVsZSBLIDogTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gayBhbmQgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBjbXApXG4gICAgICB2X29mX3NleHBcbiAgICAgIHNleHBcbiAgPVxuICBVc2luZ19jb21wYXJhdG9yLnRfb2Zfc2V4cF9kaXJlY3QgfmNvbXBhcmF0b3I6Sy5jb21wYXJhdG9yIEsudF9vZl9zZXhwIHZfb2Zfc2V4cCBzZXhwXG47O1xuXG5sZXQgbV9fdF9zZXhwX2dyYW1tYXJcbiAgICAgICh0eXBlIGspXG4gICAgICAobW9kdWxlIEsgOiBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9IGspXG4gICAgICAodl9ncmFtbWFyIDogXyBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiBfIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gID1cbiAgeyB1bnR5cGVkID1cbiAgICAgIExpc3RcbiAgICAgICAgKE1hbnkgKExpc3QgKENvbnMgKEsudF9zZXhwX2dyYW1tYXIudW50eXBlZCwgQ29ucyAodl9ncmFtbWFyLnVudHlwZWQsIEVtcHR5KSkpKSlcbiAgfVxuOztcblxubGV0IGNvbXBhcmVfbV9fdCAobW9kdWxlIF8gOiBDb21wYXJlX20pIGNvbXBhcmVfdiB0MSB0MiA9IGNvbXBhcmVfZGlyZWN0IGNvbXBhcmVfdiB0MSB0MlxubGV0IGVxdWFsX21fX3QgKG1vZHVsZSBfIDogRXF1YWxfbSkgZXF1YWxfdiB0MSB0MiA9IGVxdWFsIGVxdWFsX3YgdDEgdDJcblxubGV0IGhhc2hfZm9sZF9tX190ICh0eXBlIGspIChtb2R1bGUgSyA6IEhhc2hfZm9sZF9tIHdpdGggdHlwZSB0ID0gaykgaGFzaF9mb2xkX3Ygc3RhdGUgPVxuICBoYXNoX2ZvbGRfZGlyZWN0IEsuaGFzaF9mb2xkX3QgaGFzaF9mb2xkX3Ygc3RhdGVcbjs7XG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICgnaywgJ3YpIHQgPSAoJ2ssICd2LCBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvcl93aXRuZXNzKSB0XG4gIHR5cGUgbm9ucmVjICgnaywgJ3YpIHRyZWUgPSAoJ2ssICd2KSBUcmVlMC50XG4gIHR5cGUgY29tcGFyYXRvcl93aXRuZXNzID0gQ29tcGFyYXRvci5Qb2x5LmNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IGNvbXBhcmF0b3IgPSBDb21wYXJhdG9yLlBvbHkuY29tcGFyYXRvclxuICBsZXQgb2ZfdHJlZSB0cmVlID0geyB0cmVlOyBjb21wYXJhdG9yOyBsZW5ndGggPSBUcmVlMC5sZW5ndGggdHJlZSB9XG5cbiAgaW5jbHVkZSBVc2luZ19jb21wYXJhdG9yLkVtcHR5X3dpdGhvdXRfdmFsdWVfcmVzdHJpY3Rpb24gKENvbXBhcmF0b3IuUG9seSlcblxuICBsZXQgc2luZ2xldG9uIGEgPSBVc2luZ19jb21wYXJhdG9yLnNpbmdsZXRvbiB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hbGlzdCBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdCB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hbGlzdF9vcl9lcnJvciBhID0gVXNpbmdfY29tcGFyYXRvci5vZl9hbGlzdF9vcl9lcnJvciB+Y29tcGFyYXRvciBhXG4gIGxldCBvZl9hbGlzdF9leG4gYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfZXhuIH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FsaXN0X211bHRpIGEgPSBVc2luZ19jb21wYXJhdG9yLm9mX2FsaXN0X211bHRpIH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2FsaXN0X2ZvbGQgYSB+aW5pdCB+ZiA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfZm9sZCB+Y29tcGFyYXRvciBhIH5pbml0IH5mXG4gIGxldCBvZl9hbGlzdF9yZWR1Y2UgYSB+ZiA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfYWxpc3RfcmVkdWNlIH5jb21wYXJhdG9yIGEgfmZcblxuICBsZXQgb2Zfc29ydGVkX2FycmF5X3VuY2hlY2tlZCBhID1cbiAgICBVc2luZ19jb21wYXJhdG9yLm9mX3NvcnRlZF9hcnJheV91bmNoZWNrZWQgfmNvbXBhcmF0b3IgYVxuICA7O1xuXG4gIGxldCBvZl9zb3J0ZWRfYXJyYXkgYSA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc29ydGVkX2FycmF5IH5jb21wYXJhdG9yIGFcbiAgbGV0IG9mX2l0ZXJpIH5pdGVyaSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfaXRlcmkgfml0ZXJpIH5jb21wYXJhdG9yXG4gIGxldCBvZl9pdGVyaV9leG4gfml0ZXJpID0gVXNpbmdfY29tcGFyYXRvci5vZl9pdGVyaV9leG4gfml0ZXJpIH5jb21wYXJhdG9yXG5cbiAgbGV0IG9mX2luY3JlYXNpbmdfaXRlcmF0b3JfdW5jaGVja2VkIH5sZW4gfmYgPVxuICAgIFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19pdGVyYXRvcl91bmNoZWNrZWQgfmxlbiB+ZiB+Y29tcGFyYXRvclxuICA7O1xuXG4gIGxldCBvZl9pbmNyZWFzaW5nX3NlcXVlbmNlIHNlcSA9IFVzaW5nX2NvbXBhcmF0b3Iub2ZfaW5jcmVhc2luZ19zZXF1ZW5jZSB+Y29tcGFyYXRvciBzZXFcbiAgbGV0IG9mX3NlcXVlbmNlIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlIH5jb21wYXJhdG9yIHNcbiAgbGV0IG9mX3NlcXVlbmNlX29yX2Vycm9yIHMgPSBVc2luZ19jb21wYXJhdG9yLm9mX3NlcXVlbmNlX29yX2Vycm9yIH5jb21wYXJhdG9yIHNcbiAgbGV0IG9mX3NlcXVlbmNlX2V4biBzID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9leG4gfmNvbXBhcmF0b3Igc1xuICBsZXQgb2Zfc2VxdWVuY2VfbXVsdGkgcyA9IFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfbXVsdGkgfmNvbXBhcmF0b3Igc1xuXG4gIGxldCBvZl9zZXF1ZW5jZV9mb2xkIHMgfmluaXQgfmYgPVxuICAgIFVzaW5nX2NvbXBhcmF0b3Iub2Zfc2VxdWVuY2VfZm9sZCB+Y29tcGFyYXRvciBzIH5pbml0IH5mXG4gIDs7XG5cbiAgbGV0IG9mX3NlcXVlbmNlX3JlZHVjZSBzIH5mID0gVXNpbmdfY29tcGFyYXRvci5vZl9zZXF1ZW5jZV9yZWR1Y2UgfmNvbXBhcmF0b3IgcyB+ZlxuICBsZXQgbWFwX2tleXMgdCB+ZiA9IFVzaW5nX2NvbXBhcmF0b3IubWFwX2tleXMgfmNvbXBhcmF0b3IgdCB+ZlxuICBsZXQgbWFwX2tleXNfZXhuIHQgfmYgPSBVc2luZ19jb21wYXJhdG9yLm1hcF9rZXlzX2V4biB+Y29tcGFyYXRvciB0IH5mXG5lbmRcbiIsIm9wZW4hIEltcG9ydDBcblxudHlwZSAnYSB0ID0gJ2EgQ2FtbC5RdWV1ZS50XG5cbmxldCBjcmVhdGUgPSBDYW1sLlF1ZXVlLmNyZWF0ZVxubGV0IGNsZWFyID0gQ2FtbC5RdWV1ZS5jbGVhclxubGV0IGNvcHkgPSBDYW1sLlF1ZXVlLmNvcHlcbmxldCBpc19lbXB0eSA9IENhbWwuUXVldWUuaXNfZW1wdHlcbmxldCBsZW5ndGggPSBDYW1sLlF1ZXVlLmxlbmd0aFxubGV0IHBlZWsgPSBDYW1sLlF1ZXVlLnBlZWtcbmxldCBwb3AgPSBDYW1sLlF1ZXVlLnBvcFxubGV0IHB1c2ggPSBDYW1sLlF1ZXVlLnB1c2hcbmxldCB0cmFuc2ZlciA9IENhbWwuUXVldWUudHJhbnNmZXJcbmxldCBpdGVyIHQgfmYgPSBDYW1sLlF1ZXVlLml0ZXIgZiB0XG5sZXQgZm9sZCB0IH5pbml0IH5mID0gQ2FtbC5RdWV1ZS5mb2xkIGYgaW5pdCB0XG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgTGlua2VkX3F1ZXVlMFxuXG5sZXQgZW5xdWV1ZSB0IHggPSBMaW5rZWRfcXVldWUwLnB1c2ggeCB0XG5sZXQgZGVxdWV1ZSB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChMaW5rZWRfcXVldWUwLnBvcCB0KVxubGV0IGRlcXVldWVfZXhuID0gTGlua2VkX3F1ZXVlMC5wb3BcbmxldCBwZWVrIHQgPSBpZiBpc19lbXB0eSB0IHRoZW4gTm9uZSBlbHNlIFNvbWUgKExpbmtlZF9xdWV1ZTAucGVlayB0KVxubGV0IHBlZWtfZXhuID0gTGlua2VkX3F1ZXVlMC5wZWVrXG5cbm1vZHVsZSBDID0gSW5kZXhlZF9jb250YWluZXIuTWFrZSAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgJ2EgdCA9ICdhIHRcblxuICAgIGxldCBmb2xkID0gZm9sZFxuICAgIGxldCBpdGVyID0gYEN1c3RvbSBpdGVyXG4gICAgbGV0IGxlbmd0aCA9IGBDdXN0b20gbGVuZ3RoXG4gICAgbGV0IGZvbGRpID0gYERlZmluZV91c2luZ19mb2xkXG4gICAgbGV0IGl0ZXJpID0gYERlZmluZV91c2luZ19mb2xkXG4gIGVuZClcblxubGV0IGNvdW50ID0gQy5jb3VudFxubGV0IGV4aXN0cyA9IEMuZXhpc3RzXG5sZXQgZmluZCA9IEMuZmluZFxubGV0IGZpbmRfbWFwID0gQy5maW5kX21hcFxubGV0IGZvbGRfcmVzdWx0ID0gQy5mb2xkX3Jlc3VsdFxubGV0IGZvbGRfdW50aWwgPSBDLmZvbGRfdW50aWxcbmxldCBmb3JfYWxsID0gQy5mb3JfYWxsXG5sZXQgbWF4X2VsdCA9IEMubWF4X2VsdFxubGV0IG1lbSA9IEMubWVtXG5sZXQgbWluX2VsdCA9IEMubWluX2VsdFxubGV0IHN1bSA9IEMuc3VtXG5sZXQgdG9fbGlzdCA9IEMudG9fbGlzdFxubGV0IGNvdW50aSA9IEMuY291bnRpXG5sZXQgZXhpc3RzaSA9IEMuZXhpc3RzaVxubGV0IGZpbmRfbWFwaSA9IEMuZmluZF9tYXBpXG5sZXQgZmluZGkgPSBDLmZpbmRpXG5sZXQgZm9sZGkgPSBDLmZvbGRpXG5sZXQgZm9yX2FsbGkgPSBDLmZvcl9hbGxpXG5sZXQgaXRlcmkgPSBDLml0ZXJpXG5sZXQgdHJhbnNmZXIgfnNyYyB+ZHN0ID0gTGlua2VkX3F1ZXVlMC50cmFuc2ZlciBzcmMgZHN0XG5cbmxldCBjb25jYXRfbWFwIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT4gTGlzdC5pdGVyIChmIGEpIH5mOihmdW4gYiAtPiBlbnF1ZXVlIHJlcyBiKSk7XG4gIHJlc1xuOztcblxubGV0IGNvbmNhdF9tYXBpIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biBpIGEgLT4gTGlzdC5pdGVyIChmIGkgYSkgfmY6KGZ1biBiIC0+IGVucXVldWUgcmVzIGIpKTtcbiAgcmVzXG47O1xuXG5sZXQgZmlsdGVyX21hcCB0IH5mID1cbiAgbGV0IHJlcyA9IGNyZWF0ZSAoKSBpblxuICBpdGVyIHQgfmY6KGZ1biBhIC0+XG4gICAgbWF0Y2ggZiBhIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYiAtPiBlbnF1ZXVlIHJlcyBiKTtcbiAgcmVzXG47O1xuXG5sZXQgZmlsdGVyX21hcGkgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPlxuICAgIG1hdGNoIGYgaSBhIHdpdGhcbiAgICB8IE5vbmUgLT4gKClcbiAgICB8IFNvbWUgYiAtPiBlbnF1ZXVlIHJlcyBiKTtcbiAgcmVzXG47O1xuXG5sZXQgZmlsdGVyIHQgfmYgPVxuICBsZXQgcmVzID0gY3JlYXRlICgpIGluXG4gIGl0ZXIgdCB+ZjooZnVuIGEgLT4gaWYgZiBhIHRoZW4gZW5xdWV1ZSByZXMgYSk7XG4gIHJlc1xuOztcblxubGV0IGZpbHRlcmkgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPiBpZiBmIGkgYSB0aGVuIGVucXVldWUgcmVzIGEpO1xuICByZXNcbjs7XG5cbmxldCBtYXAgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlciB0IH5mOihmdW4gYSAtPiBlbnF1ZXVlIHJlcyAoZiBhKSk7XG4gIHJlc1xuOztcblxubGV0IG1hcGkgdCB+ZiA9XG4gIGxldCByZXMgPSBjcmVhdGUgKCkgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIGkgYSAtPiBlbnF1ZXVlIHJlcyAoZiBpIGEpKTtcbiAgcmVzXG47O1xuXG5sZXQgZmlsdGVyX2lucGxhY2UgcSB+ZiA9XG4gIGxldCBxJyA9IGZpbHRlciBxIH5mIGluXG4gIGNsZWFyIHE7XG4gIHRyYW5zZmVyIH5zcmM6cScgfmRzdDpxXG47O1xuXG5sZXQgZmlsdGVyaV9pbnBsYWNlIHEgfmYgPVxuICBsZXQgcScgPSBmaWx0ZXJpIHEgfmYgaW5cbiAgY2xlYXIgcTtcbiAgdHJhbnNmZXIgfnNyYzpxJyB+ZHN0OnFcbjs7XG5cbmxldCBlbnF1ZXVlX2FsbCB0IGxpc3QgPSBMaXN0Lml0ZXIgbGlzdCB+ZjooZnVuIHggLT4gZW5xdWV1ZSB0IHgpXG5cbmxldCBvZl9saXN0IGxpc3QgPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBMaXN0Lml0ZXIgbGlzdCB+ZjooZnVuIHggLT4gZW5xdWV1ZSB0IHgpO1xuICB0XG47O1xuXG5sZXQgb2ZfYXJyYXkgYXJyYXkgPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBBcnJheS5pdGVyIGFycmF5IH5mOihmdW4geCAtPiBlbnF1ZXVlIHQgeCk7XG4gIHRcbjs7XG5cbmxldCBpbml0IGxlbiB+ZiA9XG4gIGxldCB0ID0gY3JlYXRlICgpIGluXG4gIGZvciBpID0gMCB0byBsZW4gLSAxIGRvXG4gICAgZW5xdWV1ZSB0IChmIGkpXG4gIGRvbmU7XG4gIHRcbjs7XG5cbmxldCB0b19hcnJheSB0ID1cbiAgbWF0Y2ggbGVuZ3RoIHQgd2l0aFxuICB8IDAgLT4gW3x8XVxuICB8IGxlbiAtPlxuICAgIGxldCBhcnIgPSBBcnJheS5jcmVhdGUgfmxlbiAocGVla19leG4gdCkgaW5cbiAgICBsZXQgaSA9IHJlZiAwIGluXG4gICAgaXRlciB0IH5mOihmdW4gdiAtPlxuICAgICAgYXJyLighaSkgPC0gdjtcbiAgICAgIGluY3IgaSk7XG4gICAgYXJyXG47O1xuXG5sZXQgdF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwID0gb2ZfbGlzdCAobGlzdF9vZl9zZXhwIGFfb2Zfc2V4cCBzZXhwKVxubGV0IHNleHBfb2ZfdCBzZXhwX29mX2EgdCA9IHNleHBfb2ZfbGlzdCBzZXhwX29mX2EgKHRvX2xpc3QgdClcblxubGV0IHRfc2V4cF9ncmFtbWFyICh0eXBlIGEpIChncmFtbWFyIDogYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgOiBhIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChMaXN0LnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG47O1xuXG5sZXQgc2luZ2xldG9uIGEgPVxuICBsZXQgdCA9IGNyZWF0ZSAoKSBpblxuICBlbnF1ZXVlIHQgYTtcbiAgdFxuOztcbiIsIm9wZW4hIEltcG9ydFxub3BlbiEgQ2FtbC5JbnQ2NFxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnQ2NCBbQEBkZXJpdmluZ19pbmxpbmUgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICBoYXNoX2ZvbGRfaW50NjRcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2ludDY0IGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHRfb2Zfc2V4cCA9IChpbnQ2NF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoc2V4cF9vZl9pbnQ2NCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBpbnQ2NF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIGxldCBoYXNoYWJsZSA6IHQgSGFzaGFibGUudCA9IHsgaGFzaDsgY29tcGFyZTsgc2V4cF9vZl90IH1cblxuICBsZXQgY29tcGFyZSA9IEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5jb21wYXJlXG4gIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgbGV0IG9mX3N0cmluZyA9IG9mX3N0cmluZ1xuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbmxldCBudW1fYml0cyA9IDY0XG5sZXQgZmxvYXRfbG93ZXJfYm91bmQgPSBGbG9hdDAubG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X3VwcGVyX2JvdW5kID0gRmxvYXQwLnVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF9vZl9iaXRzID0gZmxvYXRfb2ZfYml0c1xubGV0IGJpdHNfb2ZfZmxvYXQgPSBiaXRzX29mX2Zsb2F0XG5sZXQgc2hpZnRfcmlnaHRfbG9naWNhbCA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmxldCBzaGlmdF9yaWdodCA9IHNoaWZ0X3JpZ2h0XG5sZXQgc2hpZnRfbGVmdCA9IHNoaWZ0X2xlZnRcbmxldCBiaXRfbm90ID0gbG9nbm90XG5sZXQgYml0X3hvciA9IGxvZ3hvclxubGV0IGJpdF9vciA9IGxvZ29yXG5sZXQgYml0X2FuZCA9IGxvZ2FuZFxubGV0IG1pbl92YWx1ZSA9IG1pbl9pbnRcbmxldCBtYXhfdmFsdWUgPSBtYXhfaW50XG5sZXQgYWJzID0gYWJzXG5sZXQgcHJlZCA9IHByZWRcbmxldCBzdWNjID0gc3VjY1xubGV0IHBvdyA9IEludF9tYXRoLlByaXZhdGUuaW50NjRfcG93XG5sZXQgcmVtID0gcmVtXG5sZXQgbmVnID0gbmVnXG5sZXQgbWludXNfb25lID0gbWludXNfb25lXG5sZXQgb25lID0gb25lXG5sZXQgemVybyA9IHplcm9cbmxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG5sZXQgb2ZfZmxvYXRfdW5jaGVja2VkID0gQ2FtbC5JbnQ2NC5vZl9mbG9hdFxuXG5sZXQgb2ZfZmxvYXQgZiA9XG4gIGlmIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID49ICkgZiBmbG9hdF9sb3dlcl9ib3VuZFxuICAmJiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIGYgZmxvYXRfdXBwZXJfYm91bmRcbiAgdGhlbiBDYW1sLkludDY0Lm9mX2Zsb2F0IGZcbiAgZWxzZVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgIFwiSW50NjQub2ZfZmxvYXQ6IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCBmKVxuICAgICAgKClcbjs7XG5cbmxldCAoICoqICkgYiBlID0gcG93IGIgZVxuXG5leHRlcm5hbCBic3dhcDY0IDogdCAtPiB0ID0gXCIlYnN3YXBfaW50NjRcIlxuXG5sZXRbQGlubGluZSBhbHdheXNdIGJzd2FwMTYgeCA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCAoYnN3YXA2NCB4KSA0OFxuXG5sZXRbQGlubGluZSBhbHdheXNdIGJzd2FwMzIgeCA9XG4gICgqIFRoaXMgaXMgc3RyaWN0bHkgYmV0dGVyIHRoYW4gY29lcmNpbmcgdG8gYW4gaW50MzIgdG8gcGVyZm9ybSBieXRlc3dhcC4gQ29lcmNpbmdcbiAgICAgZnJvbSBhbiBpbnQzMiB3aWxsIGFkZCB1bm5lY2Vzc2FyeSBzaGlmdCBvcGVyYXRpb25zIHRvIHNpZ24gZXh0ZW5kIHRoZSBudW1iZXJcbiAgICAgYXBwcm9wcmlhdGVseS5cbiAgKilcbiAgQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodF9sb2dpY2FsIChic3dhcDY0IHgpIDMyXG47O1xuXG5sZXRbQGlubGluZSBhbHdheXNdIGJzd2FwNDggeCA9IENhbWwuSW50NjQuc2hpZnRfcmlnaHRfbG9naWNhbCAoYnN3YXA2NCB4KSAxNlxuXG5pbmNsdWRlIENvbXBhcmFibGUuV2l0aF96ZXJvIChzdHJ1Y3RcbiAgICBpbmNsdWRlIFRcblxuICAgIGxldCB6ZXJvID0gemVyb1xuICBlbmQpXG5cbigqIE9wZW4gcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGFmdGVyIGluY2x1ZGluZyBmdW5jdG9yIGluc3RhbnRpYXRpb25zIHNvIHRoZXkgZG8gbm90XG4gICBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb25cbiAgIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIG1vZHVsZS4gKilcbm9wZW4gSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG5cbmxldCBpbnZhcmlhbnQgKF8gOiB0KSA9ICgpXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5sZXQgaW5jciByID0gciA6PSBhZGQgIXIgb25lXG5sZXQgZGVjciByID0gciA6PSBzdWIgIXIgb25lXG5cbmV4dGVybmFsIG9mX2ludDY0IDogdCAtPiB0ID0gXCIlaWRlbnRpdHlcIlxuXG5sZXQgb2ZfaW50NjRfZXhuID0gb2ZfaW50NjRcbmxldCB0b19pbnQ2NCB0ID0gdFxubGV0IHBvcGNvdW50ID0gUG9wY291bnQuaW50NjRfcG9wY291bnRcblxubW9kdWxlIENvbnYgPSBJbnRfY29udmVyc2lvbnNcblxuZXh0ZXJuYWwgdG9faW50X3RydW5jIDogdCAtPiBpbnQgPSBcIiVpbnQ2NF90b19pbnRcIlxuZXh0ZXJuYWwgdG9faW50MzJfdHJ1bmMgOiBpbnQ2NCAtPiBpbnQzMiA9IFwiJWludDY0X3RvX2ludDMyXCJcbmV4dGVybmFsIHRvX25hdGl2ZWludF90cnVuYyA6IGludDY0IC0+IG5hdGl2ZWludCA9IFwiJWludDY0X3RvX25hdGl2ZWludFwiXG5leHRlcm5hbCBvZl9pbnQgOiBpbnQgLT4gaW50NjQgPSBcIiVpbnQ2NF9vZl9pbnRcIlxuZXh0ZXJuYWwgb2ZfaW50MzIgOiBpbnQzMiAtPiBpbnQ2NCA9IFwiJWludDY0X29mX2ludDMyXCJcblxubGV0IG9mX2ludF9leG4gPSBvZl9pbnRcbmxldCB0b19pbnQgPSBDb252LmludDY0X3RvX2ludFxubGV0IHRvX2ludF9leG4gPSBDb252LmludDY0X3RvX2ludF9leG5cbmxldCBvZl9pbnQzMl9leG4gPSBvZl9pbnQzMlxubGV0IHRvX2ludDMyID0gQ29udi5pbnQ2NF90b19pbnQzMlxubGV0IHRvX2ludDMyX2V4biA9IENvbnYuaW50NjRfdG9faW50MzJfZXhuXG5sZXQgb2ZfbmF0aXZlaW50ID0gQ29udi5uYXRpdmVpbnRfdG9faW50NjRcbmxldCBvZl9uYXRpdmVpbnRfZXhuID0gb2ZfbmF0aXZlaW50XG5sZXQgdG9fbmF0aXZlaW50ID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRcbmxldCB0b19uYXRpdmVpbnRfZXhuID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRfZXhuXG5cbm1vZHVsZSBQb3cyID0gc3RydWN0XG4gIG9wZW4hIEltcG9ydFxuICBvcGVuIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCByYWlzZV9zID0gRXJyb3IucmFpc2Vfc1xuXG4gIGxldCBub25fcG9zaXRpdmVfYXJndW1lbnQgKCkgPVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2YgXCJhcmd1bWVudCBtdXN0IGJlIHN0cmljdGx5IHBvc2l0aXZlXCIgKClcbiAgOztcblxuICBsZXQgKCBsb3IgKSA9IENhbWwuSW50NjQubG9nb3JcbiAgbGV0ICggbHNyICkgPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbiAgbGV0ICggbGFuZCApID0gQ2FtbC5JbnQ2NC5sb2dhbmRcblxuICAoKiogXCJjZWlsaW5nIHBvd2VyIG9mIDJcIiAtIExlYXN0IHBvd2VyIG9mIDIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBjZWlsX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDY0Lnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgbGV0IHggPSBDYW1sLkludDY0LnByZWQgeCBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgQ2FtbC5JbnQ2NC5zdWNjIHhcbiAgOztcblxuICAoKiogXCJmbG9vciBwb3dlciBvZiAyXCIgLSBMYXJnZXN0IHBvd2VyIG9mIDIgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHguICopXG4gIGxldCBmbG9vcl9wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQ2NC56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDEpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMikgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA0KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDgpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMTYpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgMzIpIGluXG4gICAgQ2FtbC5JbnQ2NC5zdWIgeCAoeCBsc3IgMSlcbiAgOztcblxuICBsZXQgaXNfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50NjQuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICB4IGxhbmQgQ2FtbC5JbnQ2NC5wcmVkIHggPSBDYW1sLkludDY0Lnplcm9cbiAgOztcblxuICAoKiBDIHN0dWJzIGZvciBpbnQgY2x6IGFuZCBjdHogdG8gdXNlIHRoZSBDTFovQlNSL0NUWi9CU0YgaW5zdHJ1Y3Rpb24gd2hlcmUgcG9zc2libGUgKilcbiAgZXh0ZXJuYWwgY2x6XG4gICAgOiAgKGludDY0W0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50NjRfY2x6XCIgXCJCYXNlX2ludF9tYXRoX2ludDY0X2Nsel91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBjdHpcbiAgICA6ICAoaW50NjRbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnQ2NF9jdHpcIiBcIkJhc2VfaW50X21hdGhfaW50NjRfY3R6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGZsb29yX2xvZzIgaSA9XG4gICAgaWYgaSA8PSBDYW1sLkludDY0Lnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2UgXCJbSW50NjQuZmxvb3JfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50NjQgaSBdKTtcbiAgICBudW1fYml0cyAtIDEgLSBjbHogaVxuICA7O1xuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGNlaWxfbG9nMiBpID1cbiAgICBpZiBQb2x5LiggPD0gKSBpIENhbWwuSW50NjQuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltJbnQ2NC5jZWlsX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludDY0IGkgXSk7XG4gICAgaWYgQ2FtbC5JbnQ2NC5lcXVhbCBpIENhbWwuSW50NjQub25lIHRoZW4gMCBlbHNlIG51bV9iaXRzIC0gY2x6IChDYW1sLkludDY0LnByZWQgaSlcbiAgOztcbmVuZFxuXG5pbmNsdWRlIFBvdzJcbmluY2x1ZGUgQ29udi5NYWtlIChUKVxuXG5pbmNsdWRlIENvbnYuTWFrZV9oZXggKHN0cnVjdFxuICAgIHR5cGUgdCA9IGludDY0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoXVxuXG4gICAgbGV0IGNvbXBhcmUgPSAoY29tcGFyZV9pbnQ2NCA6IHQgLT4gdCAtPiBpbnQpXG5cbiAgICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgICBoYXNoX2ZvbGRfaW50NjRcblxuICAgIGFuZCAoaGFzaCA6IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICAgIGxldCBmdW5jID0gaGFzaF9pbnQ2NCBpblxuICAgICAgZnVuIHggLT4gZnVuYyB4XG4gICAgOztcblxuICAgIFtAQEBlbmRdXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgICBsZXQgbmVnID0gbmVnXG4gICAgbGV0ICggPCApID0gKCA8IClcbiAgICBsZXQgdG9fc3RyaW5nIGkgPSBQcmludGYuc3ByaW50ZiBcIiVMeFwiIGlcbiAgICBsZXQgb2Zfc3RyaW5nIHMgPSBDYW1sLlNjYW5mLnNzY2FuZiBzIFwiJUx4XCIgRm4uaWRcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50NjQuSGV4XCJcbiAgZW5kKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5JbnQ2NFwiXG4gIGVuZClcblxubW9kdWxlIFByZV9PID0gc3RydWN0XG4gIGV4dGVybmFsICggKyApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9hZGRcIlxuICBleHRlcm5hbCAoIC0gKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfc3ViXCJcbiAgZXh0ZXJuYWwgKCAqICkgOiB0IC0+IHQgLT4gdCA9IFwiJWludDY0X211bFwiXG4gIGV4dGVybmFsICggLyApIDogdCAtPiB0IC0+IHQgPSBcIiVpbnQ2NF9kaXZcIlxuICBleHRlcm5hbCAoIH4tICkgOiB0IC0+IHQgPSBcIiVpbnQ2NF9uZWdcIlxuXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gIGxldCBhYnMgPSBhYnNcblxuICBleHRlcm5hbCBuZWcgOiB0IC0+IHQgPSBcIiVpbnQ2NF9uZWdcIlxuXG4gIGxldCB6ZXJvID0gemVyb1xuICBsZXQgb2ZfaW50X2V4biA9IG9mX2ludF9leG5cbmVuZFxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBpbmNsdWRlIFByZV9PXG5cbiAgaW5jbHVkZSBJbnRfbWF0aC5NYWtlIChzdHJ1Y3RcbiAgICAgIHR5cGUgbm9ucmVjIHQgPSB0XG5cbiAgICAgIGluY2x1ZGUgUHJlX09cblxuICAgICAgbGV0IHJlbSA9IHJlbVxuICAgICAgbGV0IHRvX2Zsb2F0ID0gdG9fZmxvYXRcbiAgICAgIGxldCBvZl9mbG9hdCA9IG9mX2Zsb2F0XG4gICAgICBsZXQgb2Zfc3RyaW5nID0gVC5vZl9zdHJpbmdcbiAgICAgIGxldCB0b19zdHJpbmcgPSBULnRvX3N0cmluZ1xuICAgIGVuZClcblxuICBleHRlcm5hbCAoIGxhbmQgKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfYW5kXCJcbiAgZXh0ZXJuYWwgKCBsb3IgKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfb3JcIlxuICBleHRlcm5hbCAoIGx4b3IgKSA6IHQgLT4gdCAtPiB0ID0gXCIlaW50NjRfeG9yXCJcblxuICBsZXQgbG5vdCA9IGJpdF9ub3RcblxuICBleHRlcm5hbCAoIGxzbCApIDogdCAtPiBpbnQgLT4gdCA9IFwiJWludDY0X2xzbFwiXG4gIGV4dGVybmFsICggYXNyICkgOiB0IC0+IGludCAtPiB0ID0gXCIlaW50NjRfYXNyXCJcbiAgZXh0ZXJuYWwgKCBsc3IgKSA6IHQgLT4gaW50IC0+IHQgPSBcIiVpbnQ2NF9sc3JcIlxuZW5kXG5cbmluY2x1ZGUgT1xuXG4oKiBbSW50NjRdIGFuZCBbSW50NjQuT10gYWdyZWUgdmFsdWUtd2lzZSAqKVxuXG4oKiBJbmNsdWRlIHR5cGUtc3BlY2lmaWMgW1JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZV0gYXQgdGhlIGVuZCwgYWZ0ZXJcbiAgIGluY2x1ZGluZyBmdW5jdG9yIGFwcGxpY2F0aW9uIHRoYXQgY291bGQgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpc1xuICAgaGVyZSBzbyB0aGF0IGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGJ5XG4gICB0aGlzIG1vZHVsZS4gKilcbmluY2x1ZGUgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCIoKiBBIDYzYml0IGludGVnZXIgaXMgYSA2NGJpdCBpbnRlZ2VyIHdpdGggaXRzIGJpdHMgc2hpZnRlZCB0byB0aGUgbGVmdFxuICAgYW5kIGl0cyBsb3dlc3QgYml0IHNldCB0byAwLlxuICAgVGhpcyBpcyB0aGUgc2FtZSBraW5kIG9mIGVuY29kaW5nIGFzIE9DYW1sIGludCBvbiA2NGJpdCBhcmNoaXRlY3R1cmUuXG4gICBUaGUgb25seSBkaWZmZXJlbmNlIGJlaW5nIHRoZSBsb3dlc3QgYml0IChpbW1lZGlhdGUgYml0KSBzZXQgdG8gMS4gKilcblxub3BlbiEgSW1wb3J0XG5pbmNsdWRlIEludDY0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5cbm1vZHVsZSBUMCA9IHN0cnVjdFxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIHR5cGUgdCA9IGludDY0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2ludDY0IDogdCAtPiB0IC0+IGludClcblxuICAgIGxldCAoaGFzaF9mb2xkX3QgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpID1cbiAgICAgIGhhc2hfZm9sZF9pbnQ2NFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBoYXNoX2ludDY0IGluXG4gICAgICBmdW4geCAtPiBmdW5jIHhcbiAgICA7O1xuXG4gICAgbGV0IHRfb2Zfc2V4cCA9IChpbnQ2NF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gICAgbGV0IHNleHBfb2ZfdCA9IChzZXhwX29mX2ludDY0IDogdCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gICAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gaW50NjRfc2V4cF9ncmFtbWFyXG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuICBlbmRcblxuICBpbmNsdWRlIFRcbiAgaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5lbmRcblxubW9kdWxlIENvbnYgPSBJbnRfY29udmVyc2lvbnNcblxubW9kdWxlIFcgOiBzaWdcblxuICBpbmNsdWRlIG1vZHVsZSB0eXBlIG9mIHN0cnVjdFxuICAgIGluY2x1ZGUgVDBcbiAgZW5kXG5cbiAgdHlwZSB0ID0gaW50NjRcblxuICB2YWwgd3JhcF9leG4gOiBDYW1sLkludDY0LnQgLT4gdFxuICB2YWwgd3JhcF9tb2R1bG8gOiBDYW1sLkludDY0LnQgLT4gdFxuICB2YWwgdW53cmFwIDogdCAtPiBDYW1sLkludDY0LnRcblxuICAoKiogUmV0dXJucyBhIG5vbi1uZWdhdGl2ZSBpbnQ2NCB0aGF0IGlzIGVxdWFsIHRvIHRoZSBpbnB1dCBpbnQ2MyBtb2R1bG8gMl42My4gKilcbiAgdmFsIHVud3JhcF91bnNpZ25lZCA6IHQgLT4gQ2FtbC5JbnQ2NC50XG5cbiAgdmFsIGludmFyaWFudCA6IHQgLT4gdW5pdFxuICB2YWwgYWRkIDogdCAtPiB0IC0+IHRcbiAgdmFsIHN1YiA6IHQgLT4gdCAtPiB0XG4gIHZhbCBuZWcgOiB0IC0+IHRcbiAgdmFsIGFicyA6IHQgLT4gdFxuICB2YWwgc3VjYyA6IHQgLT4gdFxuICB2YWwgcHJlZCA6IHQgLT4gdFxuICB2YWwgbXVsIDogdCAtPiB0IC0+IHRcbiAgdmFsIHBvdyA6IHQgLT4gdCAtPiB0XG4gIHZhbCBkaXYgOiB0IC0+IHQgLT4gdFxuICB2YWwgcmVtIDogdCAtPiB0IC0+IHRcbiAgdmFsIHBvcGNvdW50IDogdCAtPiBpbnRcbiAgdmFsIGJpdF9ub3QgOiB0IC0+IHRcbiAgdmFsIGJpdF94b3IgOiB0IC0+IHQgLT4gdFxuICB2YWwgYml0X29yIDogdCAtPiB0IC0+IHRcbiAgdmFsIGJpdF9hbmQgOiB0IC0+IHQgLT4gdFxuICB2YWwgc2hpZnRfbGVmdCA6IHQgLT4gaW50IC0+IHRcbiAgdmFsIHNoaWZ0X3JpZ2h0IDogdCAtPiBpbnQgLT4gdFxuICB2YWwgc2hpZnRfcmlnaHRfbG9naWNhbCA6IHQgLT4gaW50IC0+IHRcbiAgdmFsIG1pbl92YWx1ZSA6IHRcbiAgdmFsIG1heF92YWx1ZSA6IHRcbiAgdmFsIHRvX2ludDY0IDogdCAtPiBDYW1sLkludDY0LnRcbiAgdmFsIG9mX2ludDY0IDogQ2FtbC5JbnQ2NC50IC0+IHQgb3B0aW9uXG4gIHZhbCBvZl9pbnQ2NF9leG4gOiBDYW1sLkludDY0LnQgLT4gdFxuICB2YWwgb2ZfaW50NjRfdHJ1bmMgOiBDYW1sLkludDY0LnQgLT4gdFxuICB2YWwgY29tcGFyZSA6IHQgLT4gdCAtPiBpbnRcbiAgdmFsIGNlaWxfcG93MiA6IHQgLT4gdFxuICB2YWwgZmxvb3JfcG93MiA6IHQgLT4gdFxuICB2YWwgY2VpbF9sb2cyIDogdCAtPiBpbnRcbiAgdmFsIGZsb29yX2xvZzIgOiB0IC0+IGludFxuICB2YWwgaXNfcG93MiA6IHQgLT4gYm9vbFxuICB2YWwgY2x6IDogdCAtPiBpbnRcbiAgdmFsIGN0eiA6IHQgLT4gaW50XG5lbmQgPSBzdHJ1Y3RcbiAgaW5jbHVkZSBUMFxuXG4gIHR5cGUgdCA9IGludDY0XG5cbiAgbGV0IHdyYXBfZXhuIHggPVxuICAgICgqIFJhaXNlcyBpZiB0aGUgaW50NjQgdmFsdWUgZG9lcyBub3QgZml0IG9uIGludDYzLiAqKVxuICAgIENvbnYuaW50NjRfZml0X29uX2ludDYzX2V4biB4O1xuICAgIENhbWwuSW50NjQubXVsIHggMkxcbiAgOztcblxuICBsZXQgd3JhcCB4ID1cbiAgICBpZiBDb252LmludDY0X2lzX3JlcHJlc2VudGFibGVfYXNfaW50NjMgeCB0aGVuIFNvbWUgKENhbWwuSW50NjQubXVsIHggMkwpIGVsc2UgTm9uZVxuICA7O1xuXG4gIGxldCB3cmFwX21vZHVsbyB4ID0gQ2FtbC5JbnQ2NC5tdWwgeCAyTFxuICBsZXQgdW53cmFwIHggPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IHggMVxuICBsZXQgdW53cmFwX3Vuc2lnbmVkIHggPSBDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCAxXG5cbiAgKCogVGhpcyBkb2VzIG5vdCB1c2Ugd3JhcCBvciB1bndyYXAgdG8gYXZvaWQgZ2VuZXJhdGluZyBleGNlcHRpb25zIGluIHRoZSBjYXNlIG9mXG4gICAgIG92ZXJmbG93cy4gVGhpcyBpcyB0byBwcmVzZXJ2ZSB0aGUgc2VtYW50aWNzIG9mIGludCB0eXBlIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmUuICopXG4gIGxldCBmMiBmIGEgYiA9XG4gICAgQ2FtbC5JbnQ2NC5tdWwgKGYgKENhbWwuSW50NjQuc2hpZnRfcmlnaHQgYSAxKSAoQ2FtbC5JbnQ2NC5zaGlmdF9yaWdodCBiIDEpKSAyTFxuICA7O1xuXG4gIGxldCBtYXNrID0gMHhmZmZmX2ZmZmZfZmZmZl9mZmZlTFxuICBsZXQgbSB4ID0gQ2FtbC5JbnQ2NC5sb2dhbmQgeCBtYXNrXG4gIGxldCBpbnZhcmlhbnQgdCA9IGFzc2VydCAobSB0ID0gdClcbiAgbGV0IGFkZCB4IHkgPSBDYW1sLkludDY0LmFkZCB4IHlcbiAgbGV0IHN1YiB4IHkgPSBDYW1sLkludDY0LnN1YiB4IHlcbiAgbGV0IG5lZyB4ID0gQ2FtbC5JbnQ2NC5uZWcgeFxuICBsZXQgYWJzIHggPSBDYW1sLkludDY0LmFicyB4XG4gIGxldCBvbmUgPSB3cmFwX2V4biAxTFxuICBsZXQgc3VjYyBhID0gYWRkIGEgb25lXG4gIGxldCBwcmVkIGEgPSBzdWIgYSBvbmVcbiAgbGV0IG1pbl92YWx1ZSA9IG0gQ2FtbC5JbnQ2NC5taW5faW50XG4gIGxldCBtYXhfdmFsdWUgPSBtIENhbWwuSW50NjQubWF4X2ludFxuICBsZXQgYml0X25vdCB4ID0gbSAoQ2FtbC5JbnQ2NC5sb2dub3QgeClcbiAgbGV0IGJpdF9hbmQgPSBDYW1sLkludDY0LmxvZ2FuZFxuICBsZXQgYml0X3hvciA9IENhbWwuSW50NjQubG9neG9yXG4gIGxldCBiaXRfb3IgPSBDYW1sLkludDY0LmxvZ29yXG4gIGxldCBzaGlmdF9sZWZ0IHggaSA9IENhbWwuSW50NjQuc2hpZnRfbGVmdCB4IGlcbiAgbGV0IHNoaWZ0X3JpZ2h0IHggaSA9IG0gKENhbWwuSW50NjQuc2hpZnRfcmlnaHQgeCBpKVxuICBsZXQgc2hpZnRfcmlnaHRfbG9naWNhbCB4IGkgPSBtIChDYW1sLkludDY0LnNoaWZ0X3JpZ2h0X2xvZ2ljYWwgeCBpKVxuICBsZXQgcG93ID0gZjIgSW50X21hdGguUHJpdmF0ZS5pbnQ2M19wb3dfb25faW50NjRcbiAgbGV0IG11bCBhIGIgPSBDYW1sLkludDY0Lm11bCBhIChDYW1sLkludDY0LnNoaWZ0X3JpZ2h0IGIgMSlcbiAgbGV0IGRpdiBhIGIgPSB3cmFwX21vZHVsbyAoQ2FtbC5JbnQ2NC5kaXYgYSBiKVxuICBsZXQgcmVtIGEgYiA9IENhbWwuSW50NjQucmVtIGEgYlxuICBsZXQgcG9wY291bnQgeCA9IFBvcGNvdW50LmludDY0X3BvcGNvdW50IHhcbiAgbGV0IHRvX2ludDY0IHQgPSB1bndyYXAgdFxuICBsZXQgb2ZfaW50NjQgdCA9IHdyYXAgdFxuICBsZXQgb2ZfaW50NjRfZXhuIHQgPSB3cmFwX2V4biB0XG4gIGxldCBvZl9pbnQ2NF90cnVuYyB0ID0gd3JhcF9tb2R1bG8gdFxuICBsZXQgdF9vZl9zZXhwIHggPSB3cmFwX2V4biAoaW50NjRfb2Zfc2V4cCB4KVxuICBsZXQgc2V4cF9vZl90IHggPSBzZXhwX29mX2ludDY0ICh1bndyYXAgeClcbiAgbGV0IGNvbXBhcmUgKHggOiB0KSB5ID0gY29tcGFyZSB4IHlcbiAgbGV0IGlzX3BvdzIgeCA9IEludDY0LmlzX3BvdzIgKHVud3JhcCB4KVxuXG4gIGxldCBjbHogeCA9XG4gICAgKCogV2UgcnVuIEludDY0LmNseiBkaXJlY3RseSBvbiB0aGUgd3JhcHBlZCBpbnQ2MyB2YWx1ZS4gVGhpcyBpcyBjb3JyZWN0IGJlY2F1c2UgdGhlXG4gICAgICAgYml0cyBvZiB0aGUgaW50NjNfZW11bCBhcmUgbGVmdC1hbGlnbmVkIGluIHRoZSBJbnQ2NC4gKilcbiAgICBJbnQ2NC5jbHogeFxuICA7O1xuXG4gIGxldCBjdHogeCA9IEludDY0LmN0eiAodW53cmFwIHgpXG4gIGxldCBmbG9vcl9wb3cyIHggPSBJbnQ2NC5mbG9vcl9wb3cyICh1bndyYXAgeCkgfD4gd3JhcF9leG5cbiAgbGV0IGNlaWxfcG93MiB4ID0gSW50NjQuZmxvb3JfcG93MiAodW53cmFwIHgpIHw+IHdyYXBfZXhuXG4gIGxldCBmbG9vcl9sb2cyIHggPSBJbnQ2NC5mbG9vcl9sb2cyICh1bndyYXAgeClcbiAgbGV0IGNlaWxfbG9nMiB4ID0gSW50NjQuY2VpbF9sb2cyICh1bndyYXAgeClcbmVuZFxuXG5vcGVuIFdcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gVy50IFtAQGRlcml2aW5nX2lubGluZSBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIFcuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBXLmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKFcudF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHQpXG4gIGxldCBzZXhwX29mX3QgPSAoVy5zZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gVy50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSBjb21wYXJhdG9yX3dpdG5lc3MgPSBXLmNvbXBhcmF0b3Jfd2l0bmVzc1xuXG4gIGxldCBjb21wYXJhdG9yID0gVy5jb21wYXJhdG9yXG4gIGxldCBjb21wYXJlID0gVy5jb21wYXJlXG4gIGxldCBpbnZhcmlhbnQgPSBXLmludmFyaWFudFxuXG4gICgqIFdlIGRvbid0IGV4cGVjdCBbaGFzaF0gdG8gZm9sbG93IHRoZSBiZWhhdmlvciBvZiBpbnQgaW4gNjRiaXQgYXJjaGl0ZWN0dXJlICopXG4gIGxldCBfID0gaGFzaFxuICBsZXQgaGFzaCAoeCA6IHQpID0gQ2FtbC5IYXNodGJsLmhhc2ggeFxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBpbnZhbGlkX3N0ciB4ID0gUHJpbnRmLmZhaWx3aXRoZiBcIkludDYzLm9mX3N0cmluZzogaW52YWxpZCBpbnB1dCAlU1wiIHggKClcblxuICAoKlxuICAgICBcInNpZ25cIiByZWZlcnMgdG8gd2hldGhlciB0aGUgbnVtYmVyIHN0YXJ0cyB3aXRoIGEgJy0nXG4gICAgIFwic2lnbmVkbmVzcyA9IGZhbHNlXCIgbWVhbnMgdGhlIHJlc3Qgb2YgdGhlIG51bWJlciBpcyBwYXJzZWQgYXMgdW5zaWduZWQgYW5kIHRoZW4gY2FzdFxuICAgICB0byBzaWduZWQgd2l0aCB3cmFwLWFyb3VuZCBtb2R1bG8gMl5pXG4gICAgIFwic2lnbmVkbmVzcyA9IHRydWVcIiBtZWFucyBubyBzdWNoIGNyYXppbmVzcyBoYXBwZW5zXG5cbiAgICAgVGhlIHRlcm1pbm9sb2d5IGFuZCB0aGUgbG9naWMgaXMgZHVlIHRvIHRoZSBjb2RlIGluIGJ5dGVydW4vaW50cy5jIGluIG9jYW1sIDQuMDNcbiAgICAgKFtwYXJzZV9zaWduX2FuZF9iYXNlXSBmdW5jdGlvbikuXG5cbiAgICAgU2lnbmVkbmVzcyBlcXVhbHMgdHJ1ZSBmb3IgcGxhaW4gZGVjaW1hbCBudW1iZXIgKGUuZy4gMTIzNSwgLTY3ODkpXG5cbiAgICAgU2lnbmVkbmVzcyBlcXVhbHMgZmFsc2UgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcbiAgICAgLSBbMHhmZmZmXSwgWy0weGZmZmZdIChoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbilcbiAgICAgLSBbMGIwMTAxXSwgWy0wYjAxMDFdIChiaW5hcnkgcmVwcmVzZW50YXRpb24pXG4gICAgIC0gWzBvMTIzN10sIFstMG8xMjM3XSAob2N0YWwgcmVwcmVzZW50YXRpb24pXG4gICAgIC0gWzB1OTgxMl0sIFstMHU5ODEyXSAodW5zaWduZWQgZGVjaW1hbCByZXByZXNlbnRhdGlvbiAtIGF2YWlsYWJsZSBmcm9tIE9DYW1sIDQuMDMpICopXG4gIGxldCBzaWduX2FuZF9zaWduZWRuZXNzIHggPVxuICAgIGxldCBsZW4gPSBTdHJpbmcubGVuZ3RoIHggaW5cbiAgICBsZXQgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgbGV0IHBvcywgc2lnbiA9XG4gICAgICBpZiAwIDwgbGVuXG4gICAgICB0aGVuIChcbiAgICAgICAgbWF0Y2ggeC5bMF0gd2l0aFxuICAgICAgICB8ICctJyAtPiAxLCBgTmVnXG4gICAgICAgIHwgJysnIC0+IDEsIGBQb3NcbiAgICAgICAgfCBfIC0+IDAsIGBQb3MpXG4gICAgICBlbHNlIDAsIGBQb3NcbiAgICBpblxuICAgIGlmIHBvcyArIDIgPCBsZW5cbiAgICB0aGVuIChcbiAgICAgIGxldCBjMSA9IHguW3Bvc10gaW5cbiAgICAgIGxldCBjMiA9IHguW3BvcyArIDFdIGluXG4gICAgICBtYXRjaCBjMSwgYzIgd2l0aFxuICAgICAgfCAnMCcsICcwJyAuLiAnOScgLT4gc2lnbiwgdHJ1ZVxuICAgICAgfCAnMCcsIF8gLT4gc2lnbiwgZmFsc2VcbiAgICAgIHwgXyAtPiBzaWduLCB0cnVlKVxuICAgIGVsc2Ugc2lnbiwgdHJ1ZVxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgeCA9IENhbWwuSW50NjQudG9fc3RyaW5nICh1bndyYXAgeClcblxuICBsZXQgb2Zfc3RyaW5nIHN0ciA9XG4gICAgdHJ5XG4gICAgICBsZXQgc2lnbiwgc2lnbmVkbmVzcyA9IHNpZ25fYW5kX3NpZ25lZG5lc3Mgc3RyIGluXG4gICAgICBpZiBzaWduZWRuZXNzXG4gICAgICB0aGVuIG9mX2ludDY0X2V4biAoQ2FtbC5JbnQ2NC5vZl9zdHJpbmcgc3RyKVxuICAgICAgZWxzZSAoXG4gICAgICAgIGxldCBwb3Nfc3RyID1cbiAgICAgICAgICBtYXRjaCBzaWduIHdpdGhcbiAgICAgICAgICB8IGBOZWcgLT4gU3RyaW5nLnN1YiBzdHIgfnBvczoxIH5sZW46KFN0cmluZy5sZW5ndGggc3RyIC0gMSlcbiAgICAgICAgICB8IGBQb3MgLT4gc3RyXG4gICAgICAgIGluXG4gICAgICAgIGxldCBpbnQ2NCA9IENhbWwuSW50NjQub2Zfc3RyaW5nIHBvc19zdHIgaW5cbiAgICAgICAgKCogdW5zaWduZWQgNjMtYml0IGludCBtdXN0IHBhcnNlIGFzIGEgcG9zaXRpdmUgc2lnbmVkIDY0LWJpdCBpbnQgKilcbiAgICAgICAgaWYgSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIGludDY0IDBMIHRoZW4gaW52YWxpZF9zdHIgc3RyO1xuICAgICAgICBsZXQgaW50NjMgPSB3cmFwX21vZHVsbyBpbnQ2NCBpblxuICAgICAgICBtYXRjaCBzaWduIHdpdGhcbiAgICAgICAgfCBgTmVnIC0+IG5lZyBpbnQ2M1xuICAgICAgICB8IGBQb3MgLT4gaW50NjMpXG4gICAgd2l0aFxuICAgIHwgXyAtPiBpbnZhbGlkX3N0ciBzdHJcbiAgOztcblxuICBsZXQgYnN3YXAxNiB0ID0gd3JhcF9tb2R1bG8gKEludDY0LmJzd2FwMTYgKHVud3JhcCB0KSlcbiAgbGV0IGJzd2FwMzIgdCA9IHdyYXBfbW9kdWxvIChJbnQ2NC5ic3dhcDMyICh1bndyYXAgdCkpXG4gIGxldCBic3dhcDQ4IHQgPSB3cmFwX21vZHVsbyAoSW50NjQuYnN3YXA0OCAodW53cmFwIHQpKVxuZW5kXG5cbmluY2x1ZGUgVFxuXG5sZXQgbnVtX2JpdHMgPSA2M1xubGV0IGZsb2F0X2xvd2VyX2JvdW5kID0gRmxvYXQwLmxvd2VyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF91cHBlcl9ib3VuZCA9IEZsb2F0MC51cHBlcl9ib3VuZF9mb3JfaW50IG51bV9iaXRzXG5sZXQgc2hpZnRfcmlnaHRfbG9naWNhbCA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmxldCBzaGlmdF9yaWdodCA9IHNoaWZ0X3JpZ2h0XG5sZXQgc2hpZnRfbGVmdCA9IHNoaWZ0X2xlZnRcbmxldCBiaXRfbm90ID0gYml0X25vdFxubGV0IGJpdF94b3IgPSBiaXRfeG9yXG5sZXQgYml0X29yID0gYml0X29yXG5sZXQgYml0X2FuZCA9IGJpdF9hbmRcbmxldCBwb3Bjb3VudCA9IHBvcGNvdW50XG5sZXQgYWJzID0gYWJzXG5sZXQgcHJlZCA9IHByZWRcbmxldCBzdWNjID0gc3VjY1xubGV0IHBvdyA9IHBvd1xubGV0IHJlbSA9IHJlbVxubGV0IG5lZyA9IG5lZ1xubGV0IG1heF92YWx1ZSA9IG1heF92YWx1ZVxubGV0IG1pbl92YWx1ZSA9IG1pbl92YWx1ZVxubGV0IG1pbnVzX29uZSA9IHdyYXBfZXhuIENhbWwuSW50NjQubWludXNfb25lXG5sZXQgb25lID0gd3JhcF9leG4gQ2FtbC5JbnQ2NC5vbmVcbmxldCB6ZXJvID0gd3JhcF9leG4gQ2FtbC5JbnQ2NC56ZXJvXG5sZXQgaXNfcG93MiA9IGlzX3BvdzJcbmxldCBmbG9vcl9wb3cyID0gZmxvb3JfcG93MlxubGV0IGNlaWxfcG93MiA9IGNlaWxfcG93MlxubGV0IGZsb29yX2xvZzIgPSBmbG9vcl9sb2cyXG5sZXQgY2VpbF9sb2cyID0gY2VpbF9sb2cyXG5sZXQgY2x6ID0gY2x6XG5sZXQgY3R6ID0gY3R6XG5sZXQgdG9fZmxvYXQgeCA9IENhbWwuSW50NjQudG9fZmxvYXQgKHVud3JhcCB4KVxubGV0IG9mX2Zsb2F0X3VuY2hlY2tlZCB4ID0gd3JhcF9tb2R1bG8gKENhbWwuSW50NjQub2ZfZmxvYXQgeClcblxubGV0IG9mX2Zsb2F0IHQgPVxuICBsZXQgb3BlbiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgaWYgdCA+PSBmbG9hdF9sb3dlcl9ib3VuZCAmJiB0IDw9IGZsb2F0X3VwcGVyX2JvdW5kXG4gIHRoZW4gd3JhcF9tb2R1bG8gKENhbWwuSW50NjQub2ZfZmxvYXQgdClcbiAgZWxzZVxuICAgIFByaW50Zi5pbnZhbGlkX2FyZ2ZcbiAgICAgIFwiSW50NjMub2ZfZmxvYXQ6IGFyZ3VtZW50ICglZikgaXMgb3V0IG9mIHJhbmdlIG9yIE5hTlwiXG4gICAgICAoRmxvYXQwLmJveCB0KVxuICAgICAgKClcbjs7XG5cbmxldCBvZl9pbnQ2NCA9IG9mX2ludDY0XG5sZXQgb2ZfaW50NjRfZXhuID0gb2ZfaW50NjRfZXhuXG5sZXQgb2ZfaW50NjRfdHJ1bmMgPSBvZl9pbnQ2NF90cnVuY1xubGV0IHRvX2ludDY0ID0gdG9faW50NjRcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG5sZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbmxldCBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXggPSBpZiB0IDwgbWluIHRoZW4gbWluIGVsc2UgaWYgdCA8PSBtYXggdGhlbiB0IGVsc2UgbWF4XG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICBjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXhcbjs7XG5cbmxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gIGlmIG1pbiA+IG1heFxuICB0aGVuXG4gICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgXCJjbGFtcCByZXF1aXJlcyBbbWluIDw9IG1heF1cIlxuICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICBlbHNlIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG47O1xuXG5sZXQgKCAvICkgPSBkaXZcbmxldCAoICogKSA9IG11bFxubGV0ICggLSApID0gc3ViXG5sZXQgKCArICkgPSBhZGRcbmxldCAoIH4tICkgPSBuZWdcbmxldCAoICoqICkgYiBlID0gcG93IGIgZVxubGV0IGluY3IgciA9IHIgOj0gIXIgKyBvbmVcbmxldCBkZWNyIHIgPSByIDo9ICFyIC0gb25lXG5cbigqIFdlIGNhbiByZXVzZSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20vdG8gaW50NjQgaGVyZS4gKilcbmxldCBvZl9pbnQgeCA9IHdyYXBfZXhuIChDb252LmludF90b19pbnQ2NCB4KVxubGV0IG9mX2ludF9leG4geCA9IG9mX2ludCB4XG5sZXQgdG9faW50IHggPSBDb252LmludDY0X3RvX2ludCAodW53cmFwIHgpXG5sZXQgdG9faW50X2V4biB4ID0gQ29udi5pbnQ2NF90b19pbnRfZXhuICh1bndyYXAgeClcbmxldCB0b19pbnRfdHJ1bmMgeCA9IENvbnYuaW50NjRfdG9faW50X3RydW5jICh1bndyYXAgeClcbmxldCBvZl9pbnQzMiB4ID0gd3JhcF9leG4gKENvbnYuaW50MzJfdG9faW50NjQgeClcbmxldCBvZl9pbnQzMl9leG4geCA9IG9mX2ludDMyIHhcbmxldCB0b19pbnQzMiB4ID0gQ29udi5pbnQ2NF90b19pbnQzMiAodW53cmFwIHgpXG5sZXQgdG9faW50MzJfZXhuIHggPSBDb252LmludDY0X3RvX2ludDMyX2V4biAodW53cmFwIHgpXG5sZXQgdG9faW50MzJfdHJ1bmMgeCA9IENvbnYuaW50NjRfdG9faW50MzJfdHJ1bmMgKHVud3JhcCB4KVxubGV0IG9mX25hdGl2ZWludCB4ID0gb2ZfaW50NjQgKENvbnYubmF0aXZlaW50X3RvX2ludDY0IHgpXG5sZXQgb2ZfbmF0aXZlaW50X2V4biB4ID0gd3JhcF9leG4gKENvbnYubmF0aXZlaW50X3RvX2ludDY0IHgpXG5sZXQgb2ZfbmF0aXZlaW50X3RydW5jIHggPSBvZl9pbnQ2NF90cnVuYyAoQ29udi5uYXRpdmVpbnRfdG9faW50NjQgeClcbmxldCB0b19uYXRpdmVpbnQgeCA9IENvbnYuaW50NjRfdG9fbmF0aXZlaW50ICh1bndyYXAgeClcbmxldCB0b19uYXRpdmVpbnRfZXhuIHggPSBDb252LmludDY0X3RvX25hdGl2ZWludF9leG4gKHVud3JhcCB4KVxubGV0IHRvX25hdGl2ZWludF90cnVuYyB4ID0gQ29udi5pbnQ2NF90b19uYXRpdmVpbnRfdHJ1bmMgKHVud3JhcCB4KVxuXG5pbmNsdWRlIENvbnYuTWFrZSAoVClcblxuaW5jbHVkZSBDb252Lk1ha2VfaGV4IChzdHJ1Y3RcbiAgICB0eXBlIHQgPSBULnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGhhc2hdXG5cbiAgICBsZXQgY29tcGFyZSA9IChULmNvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgVC5oYXNoX2ZvbGRfdFxuXG4gICAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgICAgbGV0IGZ1bmMgPSBULmhhc2ggaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gICAgbGV0IG5lZyA9ICggfi0gKVxuICAgIGxldCAoIDwgKSA9ICggPCApXG5cbiAgICBsZXQgdG9fc3RyaW5nIGkgPVxuICAgICAgKCogdGhlIHVzZSBvZiBbdW53cmFwX3Vuc2lnbmVkXSBoZXJlIGlzIGltcG9ydGFudCBmb3IgdGhlIGNhc2Ugb2YgW21pbl92YWx1ZV0gKilcbiAgICAgIFByaW50Zi5zcHJpbnRmIFwiJUx4XCIgKHVud3JhcF91bnNpZ25lZCBpKVxuICAgIDs7XG5cbiAgICBsZXQgb2Zfc3RyaW5nIHMgPSBvZl9zdHJpbmcgKFwiMHhcIiBeIHMpXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDYzLkhleFwiXG4gIGVuZClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgeCA9IHRvX3N0cmluZyB4XG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDYzXCJcbiAgZW5kKVxuXG5tb2R1bGUgUHJlX08gPSBzdHJ1Y3RcbiAgbGV0ICggKyApID0gKCArIClcbiAgbGV0ICggLSApID0gKCAtIClcbiAgbGV0ICggKiApID0gKCAqIClcbiAgbGV0ICggLyApID0gKCAvIClcbiAgbGV0ICggfi0gKSA9ICggfi0gKVxuICBsZXQgKCAqKiApID0gKCAqKiApXG5cbiAgaW5jbHVkZSAoSW50NjRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIDogQ29tcGFyaXNvbnMuSW5maXggd2l0aCB0eXBlIHQgOj0gdClcblxuICBsZXQgYWJzID0gYWJzXG4gIGxldCBuZWcgPSBuZWdcbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnRfZXhuID0gb2ZfaW50X2V4blxuZW5kXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGluY2x1ZGUgUHJlX09cblxuICBpbmNsdWRlIEludF9tYXRoLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgaW5jbHVkZSBQcmVfT1xuXG4gICAgICBsZXQgcmVtID0gcmVtXG4gICAgICBsZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxuICAgICAgbGV0IG9mX2Zsb2F0ID0gb2ZfZmxvYXRcbiAgICAgIGxldCBvZl9zdHJpbmcgPSBULm9mX3N0cmluZ1xuICAgICAgbGV0IHRvX3N0cmluZyA9IFQudG9fc3RyaW5nXG4gICAgZW5kKVxuXG4gIGxldCAoIGxhbmQgKSA9IGJpdF9hbmRcbiAgbGV0ICggbG9yICkgPSBiaXRfb3JcbiAgbGV0ICggbHhvciApID0gYml0X3hvclxuICBsZXQgbG5vdCA9IGJpdF9ub3RcbiAgbGV0ICggbHNsICkgPSBzaGlmdF9sZWZ0XG4gIGxldCAoIGFzciApID0gc2hpZnRfcmlnaHRcbiAgbGV0ICggbHNyICkgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5lbmRcblxuaW5jbHVkZSBPXG5cbigqIFtJbnQ2M10gYW5kIFtJbnQ2My5PXSBhZ3JlZSB2YWx1ZS13aXNlICopXG5cbm1vZHVsZSBSZXByID0gc3RydWN0XG4gIHR5cGUgZW11bGF0ZWQgPSB0XG5cbiAgdHlwZSAoJ3VuZGVybHlpbmdfdHlwZSwgJ2ludGVybWVkaWF0ZV90eXBlKSB0ID1cbiAgICB8IEludCA6IChpbnQsIGludCkgdFxuICAgIHwgSW50NjQgOiAoaW50NjQsIGVtdWxhdGVkKSB0XG5lbmRcblxubGV0IHJlcHIgPSBSZXByLkludDY0XG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBJbnQ2NF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcbiIsIm9wZW4hIEltcG9ydFxuXG5sZXQgaW52YWxpZF9hcmdmID0gUHJpbnRmLmludmFsaWRfYXJnZlxuXG5tb2R1bGUgVCA9IHN0cnVjdFxuICB0eXBlIHQgPSBib29sIFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlbnVtZXJhdGUsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZSA9IChjb21wYXJlX2Jvb2wgOiB0IC0+IHQgLT4gaW50KVxuICBsZXQgYWxsID0gKFsgZmFsc2U7IHRydWUgXSA6IHQgbGlzdClcblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2Jvb2xcblxuICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgbGV0IGZ1bmMgPSBoYXNoX2Jvb2wgaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwID0gKGJvb2xfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfYm9vbCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBib29sX3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgbGV0IGhhc2hhYmxlIDogdCBIYXNoYWJsZS50ID0geyBoYXNoOyBjb21wYXJlOyBzZXhwX29mX3QgfVxuXG4gIGxldCBvZl9zdHJpbmcgPSBmdW5jdGlvblxuICAgIHwgXCJ0cnVlXCIgLT4gdHJ1ZVxuICAgIHwgXCJmYWxzZVwiIC0+IGZhbHNlXG4gICAgfCBzIC0+IGludmFsaWRfYXJnZiBcIkJvb2wub2Zfc3RyaW5nOiBleHBlY3RlZCB0cnVlIG9yIGZhbHNlIGJ1dCBnb3QgJXNcIiBzICgpXG4gIDs7XG5cbiAgbGV0IHRvX3N0cmluZyA9IENhbWwuc3RyaW5nX29mX2Jvb2xcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG5pbmNsdWRlIFByZXR0eV9wcmludGVyLlJlZ2lzdGVyIChzdHJ1Y3RcbiAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgbGV0IHRvX3N0cmluZyA9IHRvX3N0cmluZ1xuICAgIGxldCBtb2R1bGVfbmFtZSA9IFwiQmFzZS5Cb29sXCJcbiAgZW5kKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuISBCb29sX3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5sZXQgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4ID0gaWYgdCA8IG1pbiB0aGVuIG1pbiBlbHNlIGlmIHQgPD0gbWF4IHRoZW4gdCBlbHNlIG1heFxuXG5sZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgYXNzZXJ0IChtaW4gPD0gbWF4KTtcbiAgY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4XG47O1xuXG5sZXQgY2xhbXAgdCB+bWluIH5tYXggPVxuICBpZiBtaW4gPiBtYXhcbiAgdGhlblxuICAgIE9yX2Vycm9yLmVycm9yX3NcbiAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgIFsgXCJtaW5cIiwgVC5zZXhwX29mX3QgbWluOyBcIm1heFwiLCBULnNleHBfb2ZfdCBtYXggXSlcbiAgZWxzZSBPayAoY2xhbXBfdW5jaGVja2VkIHQgfm1pbiB+bWF4KVxuOztcblxubGV0IHRvX2ludCB4ID0gYm9vbF90b19pbnQgeFxuXG5tb2R1bGUgTm9uX3Nob3J0X2NpcmN1aXRpbmcgPSBzdHJ1Y3RcbiAgKCogV2UgZG9uJ3QgZXhwb3NlIHRoaXMsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgdGhlIGludmFyaWFudCBtZW50aW9uZWQgYmVsb3cgb2ZcbiAgICAgKHRvX2ludCB0cnVlID0gMSkgYW5kICh0b19pbnQgZmFsc2UgPSAwKS4gKilcbiAgbGV0IHVuc2FmZV9vZl9pbnQgKHggOiBpbnQpIDogYm9vbCA9IENhbWwuT2JqLm1hZ2ljIHhcbiAgbGV0ICggfHwgKSBhIGIgPSB1bnNhZmVfb2ZfaW50ICh0b19pbnQgYSBsb3IgdG9faW50IGIpXG4gIGxldCAoICYmICkgYSBiID0gdW5zYWZlX29mX2ludCAodG9faW50IGEgbGFuZCB0b19pbnQgYilcbmVuZFxuXG4oKiBXZSBkbyB0aGlzIGFzIGEgZGlyZWN0IGFzc2VydCBvbiB0aGUgdGhlb3J5IHRoYXQgaXQncyBhIGNoZWFwIHRoaW5nIHRvIHRlc3QgYW5kIGFcbiAgIHJlYWxseSBjb3JlIGludmFyaWFudCB0aGF0IHdlIG5ldmVyIGV4cGVjdCB0byBicmVhaywgYW5kIHdlIHNob3VsZCBiZSBoYXBweSBmb3IgYVxuICAgcHJvZ3JhbSB0byBmYWlsIGltbWVkaWF0ZWx5IGlmIHRoaXMgaXMgdmlvbGF0ZWQuICopXG5sZXQgKCkgPSBhc3NlcnQgKFBvbHkuKCA9ICkgKHRvX2ludCB0cnVlKSAxICYmIFBvbHkuKCA9ICkgKHRvX2ludCBmYWxzZSkgMClcblxuKCogSW5jbHVkZSB0eXBlLXNwZWNpZmljIFtSZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVdIGF0IHRoZSBlbmQsIGFmdGVyXG4gICBpbmNsdWRpbmcgZnVuY3RvciBhcHBsaWNhdGlvbiB0aGF0IGNvdWxkIHNoYWRvdyBpdHMgZGVmaW5pdGlvbnMuIFRoaXMgaXNcbiAgIGhlcmUgc28gdGhhdCBlZmZpY2llbnQgdmVyc2lvbnMgb2YgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieVxuICAgdGhpcyBtb2R1bGUuICopXG5pbmNsdWRlIEJvb2xfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIENhbWwuSW50MzJcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gaW50MzIgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2ludDMyXG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9pbnQzMiBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoaW50MzJfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfaW50MzIgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gaW50MzJfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBjb21wYXJlICh4IDogdCkgeSA9IGNvbXBhcmUgeCB5XG4gIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgbGV0IG9mX3N0cmluZyA9IG9mX3N0cmluZ1xuZW5kXG5cbmluY2x1ZGUgVFxuaW5jbHVkZSBDb21wYXJhdG9yLk1ha2UgKFQpXG5cbmxldCBudW1fYml0cyA9IDMyXG5sZXQgZmxvYXRfbG93ZXJfYm91bmQgPSBGbG9hdDAubG93ZXJfYm91bmRfZm9yX2ludCBudW1fYml0c1xubGV0IGZsb2F0X3VwcGVyX2JvdW5kID0gRmxvYXQwLnVwcGVyX2JvdW5kX2Zvcl9pbnQgbnVtX2JpdHNcbmxldCBmbG9hdF9vZl9iaXRzID0gZmxvYXRfb2ZfYml0c1xubGV0IGJpdHNfb2ZfZmxvYXQgPSBiaXRzX29mX2Zsb2F0XG5sZXQgc2hpZnRfcmlnaHRfbG9naWNhbCA9IHNoaWZ0X3JpZ2h0X2xvZ2ljYWxcbmxldCBzaGlmdF9yaWdodCA9IHNoaWZ0X3JpZ2h0XG5sZXQgc2hpZnRfbGVmdCA9IHNoaWZ0X2xlZnRcbmxldCBiaXRfbm90ID0gbG9nbm90XG5sZXQgYml0X3hvciA9IGxvZ3hvclxubGV0IGJpdF9vciA9IGxvZ29yXG5sZXQgYml0X2FuZCA9IGxvZ2FuZFxubGV0IG1pbl92YWx1ZSA9IG1pbl9pbnRcbmxldCBtYXhfdmFsdWUgPSBtYXhfaW50XG5sZXQgYWJzID0gYWJzXG5sZXQgcHJlZCA9IHByZWRcbmxldCBzdWNjID0gc3VjY1xubGV0IHJlbSA9IHJlbVxubGV0IG5lZyA9IG5lZ1xubGV0IG1pbnVzX29uZSA9IG1pbnVzX29uZVxubGV0IG9uZSA9IG9uZVxubGV0IHplcm8gPSB6ZXJvXG5sZXQgY29tcGFyZSA9IGNvbXBhcmVcbmxldCB0b19mbG9hdCA9IHRvX2Zsb2F0XG5sZXQgb2ZfZmxvYXRfdW5jaGVja2VkID0gb2ZfZmxvYXRcblxubGV0IG9mX2Zsb2F0IGYgPVxuICBpZiBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA+PSApIGYgZmxvYXRfbG93ZXJfYm91bmRcbiAgJiYgRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPD0gKSBmIGZsb2F0X3VwcGVyX2JvdW5kXG4gIHRoZW4gb2ZfZmxvYXQgZlxuICBlbHNlXG4gICAgUHJpbnRmLmludmFsaWRfYXJnZlxuICAgICAgXCJJbnQzMi5vZl9mbG9hdDogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IGYpXG4gICAgICAoKVxuOztcblxuaW5jbHVkZSBDb21wYXJhYmxlLldpdGhfemVybyAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgemVybyA9IHplcm9cbiAgZW5kKVxuXG5tb2R1bGUgSW5maXhfY29tcGFyZSA9IHN0cnVjdFxuICBvcGVuIFBvbHlcblxuICBsZXQgKCA+PSApICh4IDogdCkgeSA9IHggPj0geVxuICBsZXQgKCA8PSApICh4IDogdCkgeSA9IHggPD0geVxuICBsZXQgKCA9ICkgKHggOiB0KSB5ID0geCA9IHlcbiAgbGV0ICggPiApICh4IDogdCkgeSA9IHggPiB5XG4gIGxldCAoIDwgKSAoeCA6IHQpIHkgPSB4IDwgeVxuICBsZXQgKCA8PiApICh4IDogdCkgeSA9IHggPD4geVxuZW5kXG5cbm1vZHVsZSBDb21wYXJlID0gc3RydWN0XG4gIGluY2x1ZGUgSW5maXhfY29tcGFyZVxuXG4gIGxldCBjb21wYXJlID0gY29tcGFyZVxuICBsZXQgYXNjZW5kaW5nID0gY29tcGFyZVxuICBsZXQgZGVzY2VuZGluZyB4IHkgPSBjb21wYXJlIHkgeFxuICBsZXQgbWluICh4IDogdCkgeSA9IGlmIHggPCB5IHRoZW4geCBlbHNlIHlcbiAgbGV0IG1heCAoeCA6IHQpIHkgPSBpZiB4ID4geSB0aGVuIHggZWxzZSB5XG4gIGxldCBlcXVhbCAoeCA6IHQpIHkgPSB4ID0geVxuICBsZXQgYmV0d2VlbiB0IH5sb3cgfmhpZ2ggPSBsb3cgPD0gdCAmJiB0IDw9IGhpZ2hcbiAgbGV0IGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heCA9IGlmIHQgPCBtaW4gdGhlbiBtaW4gZWxzZSBpZiB0IDw9IG1heCB0aGVuIHQgZWxzZSBtYXhcblxuICBsZXQgY2xhbXBfZXhuIHQgfm1pbiB+bWF4ID1cbiAgICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICAgIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuICA7O1xuXG4gIGxldCBjbGFtcCB0IH5taW4gfm1heCA9XG4gICAgaWYgbWluID4gbWF4XG4gICAgdGhlblxuICAgICAgT3JfZXJyb3IuZXJyb3Jfc1xuICAgICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICAgIFwiY2xhbXAgcmVxdWlyZXMgW21pbiA8PSBtYXhdXCJcbiAgICAgICAgICAgWyBcIm1pblwiLCBULnNleHBfb2ZfdCBtaW47IFwibWF4XCIsIFQuc2V4cF9vZl90IG1heCBdKVxuICAgIGVsc2UgT2sgKGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heClcbiAgOztcbmVuZFxuXG5pbmNsdWRlIENvbXBhcmVcblxubGV0IGludmFyaWFudCAoXyA6IHQpID0gKClcbmxldCAoIC8gKSA9IGRpdlxubGV0ICggKiApID0gbXVsXG5sZXQgKCAtICkgPSBzdWJcbmxldCAoICsgKSA9IGFkZFxubGV0ICggfi0gKSA9IG5lZ1xubGV0IGluY3IgciA9IHIgOj0gIXIgKyBvbmVcbmxldCBkZWNyIHIgPSByIDo9ICFyIC0gb25lXG5sZXQgb2ZfaW50MzIgdCA9IHRcbmxldCBvZl9pbnQzMl9leG4gPSBvZl9pbnQzMlxubGV0IHRvX2ludDMyIHQgPSB0XG5sZXQgdG9faW50MzJfZXhuID0gdG9faW50MzJcbmxldCBwb3Bjb3VudCA9IFBvcGNvdW50LmludDMyX3BvcGNvdW50XG5cbm1vZHVsZSBDb252ID0gSW50X2NvbnZlcnNpb25zXG5cbmxldCBvZl9pbnQgPSBDb252LmludF90b19pbnQzMlxubGV0IG9mX2ludF9leG4gPSBDb252LmludF90b19pbnQzMl9leG5cbmxldCBvZl9pbnRfdHJ1bmMgPSBDb252LmludF90b19pbnQzMl90cnVuY1xubGV0IHRvX2ludCA9IENvbnYuaW50MzJfdG9faW50XG5sZXQgdG9faW50X2V4biA9IENvbnYuaW50MzJfdG9faW50X2V4blxubGV0IHRvX2ludF90cnVuYyA9IENvbnYuaW50MzJfdG9faW50X3RydW5jXG5sZXQgb2ZfaW50NjQgPSBDb252LmludDY0X3RvX2ludDMyXG5sZXQgb2ZfaW50NjRfZXhuID0gQ29udi5pbnQ2NF90b19pbnQzMl9leG5cbmxldCBvZl9pbnQ2NF90cnVuYyA9IENvbnYuaW50NjRfdG9faW50MzJfdHJ1bmNcbmxldCB0b19pbnQ2NCA9IENvbnYuaW50MzJfdG9faW50NjRcbmxldCBvZl9uYXRpdmVpbnQgPSBDb252Lm5hdGl2ZWludF90b19pbnQzMlxubGV0IG9mX25hdGl2ZWludF9leG4gPSBDb252Lm5hdGl2ZWludF90b19pbnQzMl9leG5cbmxldCBvZl9uYXRpdmVpbnRfdHJ1bmMgPSBDb252Lm5hdGl2ZWludF90b19pbnQzMl90cnVuY1xubGV0IHRvX25hdGl2ZWludCA9IENvbnYuaW50MzJfdG9fbmF0aXZlaW50XG5sZXQgdG9fbmF0aXZlaW50X2V4biA9IHRvX25hdGl2ZWludFxubGV0IHBvdyBiIGUgPSBvZl9pbnRfZXhuIChJbnRfbWF0aC5Qcml2YXRlLmludF9wb3cgKHRvX2ludF9leG4gYikgKHRvX2ludF9leG4gZSkpXG5sZXQgKCAqKiApIGIgZSA9IHBvdyBiIGVcblxuZXh0ZXJuYWwgYnN3YXAzMiA6IHQgLT4gdCA9IFwiJWJzd2FwX2ludDMyXCJcblxubGV0IGJzd2FwMTYgeCA9IENhbWwuSW50MzIuc2hpZnRfcmlnaHRfbG9naWNhbCAoYnN3YXAzMiB4KSAxNlxuXG5tb2R1bGUgUG93MiA9IHN0cnVjdFxuICBvcGVuISBJbXBvcnRcbiAgb3BlbiBJbnQzMl9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuICBsZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxuICBsZXQgbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpID1cbiAgICBQcmludGYuaW52YWxpZF9hcmdmIFwiYXJndW1lbnQgbXVzdCBiZSBzdHJpY3RseSBwb3NpdGl2ZVwiICgpXG4gIDs7XG5cbiAgbGV0ICggbG9yICkgPSBDYW1sLkludDMyLmxvZ29yXG4gIGxldCAoIGxzciApID0gQ2FtbC5JbnQzMi5zaGlmdF9yaWdodF9sb2dpY2FsXG4gIGxldCAoIGxhbmQgKSA9IENhbWwuSW50MzIubG9nYW5kXG5cbiAgKCoqIFwiY2VpbGluZyBwb3dlciBvZiAyXCIgLSBMZWFzdCBwb3dlciBvZiAyIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgY2VpbF9wb3cyIHggPVxuICAgIGlmIHggPD0gQ2FtbC5JbnQzMi56ZXJvIHRoZW4gbm9uX3Bvc2l0aXZlX2FyZ3VtZW50ICgpO1xuICAgIGxldCB4ID0gQ2FtbC5JbnQzMi5wcmVkIHggaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgIENhbWwuSW50MzIuc3VjYyB4XG4gIDs7XG5cbiAgKCoqIFwiZmxvb3IgcG93ZXIgb2YgMlwiIC0gTGFyZ2VzdCBwb3dlciBvZiAyIGxlc3MgdGhhbiBvciBlcXVhbCB0byB4LiAqKVxuICBsZXQgZmxvb3JfcG93MiB4ID1cbiAgICBpZiB4IDw9IENhbWwuSW50MzIuemVybyB0aGVuIG5vbl9wb3NpdGl2ZV9hcmd1bWVudCAoKTtcbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciAxKSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDIpIGluXG4gICAgbGV0IHggPSB4IGxvciAoeCBsc3IgNCkgaW5cbiAgICBsZXQgeCA9IHggbG9yICh4IGxzciA4KSBpblxuICAgIGxldCB4ID0geCBsb3IgKHggbHNyIDE2KSBpblxuICAgIENhbWwuSW50MzIuc3ViIHggKHggbHNyIDEpXG4gIDs7XG5cbiAgbGV0IGlzX3BvdzIgeCA9XG4gICAgaWYgeCA8PSBDYW1sLkludDMyLnplcm8gdGhlbiBub25fcG9zaXRpdmVfYXJndW1lbnQgKCk7XG4gICAgeCBsYW5kIENhbWwuSW50MzIucHJlZCB4ID0gQ2FtbC5JbnQzMi56ZXJvXG4gIDs7XG5cbiAgKCogQyBzdHVicyBmb3IgaW50MzIgY2x6IGFuZCBjdHogdG8gdXNlIHRoZSBDTFovQlNSL0NUWi9CU0YgaW5zdHJ1Y3Rpb24gd2hlcmUgcG9zc2libGUgKilcbiAgZXh0ZXJuYWwgY2x6XG4gICAgOiAgKGludDMyW0B1bmJveGVkXSlcbiAgICAtPiAoaW50W0B1bnRhZ2dlZF0pXG4gICAgPSBcIkJhc2VfaW50X21hdGhfaW50MzJfY2x6XCIgXCJCYXNlX2ludF9tYXRoX2ludDMyX2Nsel91bmJveGVkXCJcbiAgW0BAbm9hbGxvY11cblxuICBleHRlcm5hbCBjdHpcbiAgICA6ICAoaW50MzJbQHVuYm94ZWRdKVxuICAgIC0+IChpbnRbQHVudGFnZ2VkXSlcbiAgICA9IFwiQmFzZV9pbnRfbWF0aF9pbnQzMl9jdHpcIiBcIkJhc2VfaW50X21hdGhfaW50MzJfY3R6X3VuYm94ZWRcIlxuICBbQEBub2FsbG9jXVxuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGZsb29yX2xvZzIgaSA9XG4gICAgaWYgaSA8PSBDYW1sLkludDMyLnplcm9cbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2UgXCJbSW50MzIuZmxvb3JfbG9nMl0gZ290IGludmFsaWQgaW5wdXRcIiBbIFwiXCIsIHNleHBfb2ZfaW50MzIgaSBdKTtcbiAgICBudW1fYml0cyAtIDEgLSBjbHogaVxuICA7O1xuXG4gICgqKiBIYWNrZXIncyBEZWxpZ2h0IFNlY29uZCBFZGl0aW9uIHAxMDYgKilcbiAgbGV0IGNlaWxfbG9nMiBpID1cbiAgICBpZiBpIDw9IENhbWwuSW50MzIuemVyb1xuICAgIHRoZW5cbiAgICAgIHJhaXNlX3MgKFNleHAubWVzc2FnZSBcIltJbnQzMi5jZWlsX2xvZzJdIGdvdCBpbnZhbGlkIGlucHV0XCIgWyBcIlwiLCBzZXhwX29mX2ludDMyIGkgXSk7XG4gICAgKCogVGhlIFtpID0gMV0gY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2UgY2x6KDApIGlzIHVuZGVmaW5lZCAqKVxuICAgIGlmIENhbWwuSW50MzIuZXF1YWwgaSBDYW1sLkludDMyLm9uZSB0aGVuIDAgZWxzZSBudW1fYml0cyAtIGNseiAoQ2FtbC5JbnQzMi5wcmVkIGkpXG4gIDs7XG5lbmRcblxuaW5jbHVkZSBQb3cyXG5pbmNsdWRlIENvbnYuTWFrZSAoVClcblxuaW5jbHVkZSBDb252Lk1ha2VfaGV4IChzdHJ1Y3RcbiAgICB0eXBlIHQgPSBpbnQzMiBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgaGFzaF1cblxuICAgIGxldCBjb21wYXJlID0gKGNvbXBhcmVfaW50MzIgOiB0IC0+IHQgLT4gaW50KVxuXG4gICAgbGV0IChoYXNoX2ZvbGRfdCA6IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgICAgaGFzaF9mb2xkX2ludDMyXG5cbiAgICBhbmQgKGhhc2ggOiB0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5oYXNoX3ZhbHVlKSA9XG4gICAgICBsZXQgZnVuYyA9IGhhc2hfaW50MzIgaW5cbiAgICAgIGZ1biB4IC0+IGZ1bmMgeFxuICAgIDs7XG5cbiAgICBbQEBAZW5kXVxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gICAgbGV0IG5lZyA9ICggfi0gKVxuICAgIGxldCAoIDwgKSA9ICggPCApXG4gICAgbGV0IHRvX3N0cmluZyBpID0gUHJpbnRmLnNwcmludGYgXCIlbHhcIiBpXG4gICAgbGV0IG9mX3N0cmluZyBzID0gQ2FtbC5TY2FuZi5zc2NhbmYgcyBcIiVseFwiIEZuLmlkXG4gICAgbGV0IG1vZHVsZV9uYW1lID0gXCJCYXNlLkludDMyLkhleFwiXG4gIGVuZClcblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuSW50MzJcIlxuICBlbmQpXG5cbm1vZHVsZSBQcmVfTyA9IHN0cnVjdFxuICBsZXQgKCArICkgPSAoICsgKVxuICBsZXQgKCAtICkgPSAoIC0gKVxuICBsZXQgKCAqICkgPSAoICogKVxuICBsZXQgKCAvICkgPSAoIC8gKVxuICBsZXQgKCB+LSApID0gKCB+LSApXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIChDb21wYXJlIDogQ29tcGFyaXNvbnMuSW5maXggd2l0aCB0eXBlIHQgOj0gdClcblxuICBsZXQgYWJzID0gYWJzXG4gIGxldCBuZWcgPSBuZWdcbiAgbGV0IHplcm8gPSB6ZXJvXG4gIGxldCBvZl9pbnRfZXhuID0gb2ZfaW50X2V4blxuZW5kXG5cbm1vZHVsZSBPID0gc3RydWN0XG4gIGluY2x1ZGUgUHJlX09cblxuICBpbmNsdWRlIEludF9tYXRoLk1ha2UgKHN0cnVjdFxuICAgICAgdHlwZSBub25yZWMgdCA9IHRcblxuICAgICAgaW5jbHVkZSBQcmVfT1xuXG4gICAgICBsZXQgcmVtID0gcmVtXG4gICAgICBsZXQgdG9fZmxvYXQgPSB0b19mbG9hdFxuICAgICAgbGV0IG9mX2Zsb2F0ID0gb2ZfZmxvYXRcbiAgICAgIGxldCBvZl9zdHJpbmcgPSBULm9mX3N0cmluZ1xuICAgICAgbGV0IHRvX3N0cmluZyA9IFQudG9fc3RyaW5nXG4gICAgZW5kKVxuXG4gIGxldCAoIGxhbmQgKSA9IGJpdF9hbmRcbiAgbGV0ICggbG9yICkgPSBiaXRfb3JcbiAgbGV0ICggbHhvciApID0gYml0X3hvclxuICBsZXQgbG5vdCA9IGJpdF9ub3RcbiAgbGV0ICggbHNsICkgPSBzaGlmdF9sZWZ0XG4gIGxldCAoIGFzciApID0gc2hpZnRfcmlnaHRcbiAgbGV0ICggbHNyICkgPSBzaGlmdF9yaWdodF9sb2dpY2FsXG5lbmRcblxuaW5jbHVkZSBPXG5cbigqIFtJbnQzMl0gYW5kIFtJbnQzMi5PXSBhZ3JlZSB2YWx1ZS13aXNlICopXG4iLCJvcGVuISBJbXBvcnRcblxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbm1vZHVsZSBSZXByID0gSW50NjNfZW11bC5SZXByXG5cbigqIEluIGEgd29ybGQgd2hlcmUgdGhlIGNvbXBpbGVyIHdvdWxkIHVuZGVyc3RhbmQgW0BAaW1tZWRpYXRlNjRdIGF0dHJpYnV0ZXMgb24gdHlwZVxuICAgZGVjbGFyYXRpb25zLCB0aGlzIG1vZHVsZSBpcyBob3cgb25lIHdvdWxkIHByb2R1Y2UgYSBbdHlwZSB0XSB3aXRoIHRoaXMgYXR0cmlidXRlLiAqKVxubW9kdWxlIEltbWVkaWF0ZTY0IDogc2lnXG4gIG1vZHVsZSB0eXBlIE5vbl9pbW1lZGlhdGUgPSBzaWdcbiAgICB0eXBlIHRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgSW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0IFtAQGltbWVkaWF0ZV1cbiAgZW5kXG5cbiAgbW9kdWxlIE1ha2UgKEltbWVkaWF0ZSA6IEltbWVkaWF0ZSkgKE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlKSA6IHNpZ1xuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGU2NF1cblxuICAgIHR5cGUgJ2EgcmVwciA9XG4gICAgICB8IEltbWVkaWF0ZSA6IEltbWVkaWF0ZS50IHJlcHJcbiAgICAgIHwgTm9uX2ltbWVkaWF0ZSA6IE5vbl9pbW1lZGlhdGUudCByZXByXG5cbiAgICB2YWwgcmVwciA6IHQgcmVwclxuICBlbmRcbmVuZCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBOb25faW1tZWRpYXRlID0gc2lnXG4gICAgdHlwZSB0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIEltbWVkaWF0ZSA9IHNpZ1xuICAgIHR5cGUgdCBbQEBpbW1lZGlhdGVdXG4gIGVuZFxuXG4gIG1vZHVsZSBNYWtlIChJbW1lZGlhdGUgOiBJbW1lZGlhdGUpIChOb25faW1tZWRpYXRlIDogTm9uX2ltbWVkaWF0ZSkgPSBzdHJ1Y3RcbiAgICB0eXBlIHQgW0BAaW1tZWRpYXRlNjRdXG5cbiAgICB0eXBlICdhIHJlcHIgPVxuICAgICAgfCBJbW1lZGlhdGUgOiBJbW1lZGlhdGUudCByZXByXG4gICAgICB8IE5vbl9pbW1lZGlhdGUgOiBOb25faW1tZWRpYXRlLnQgcmVwclxuXG4gICAgbGV0IHJlcHIgPVxuICAgICAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gICAgICB8IFc2NCAtPiAoQ2FtbC5PYmoubWFnaWMgSW1tZWRpYXRlIDogdCByZXByKVxuICAgICAgfCBXMzIgLT4gKENhbWwuT2JqLm1hZ2ljIE5vbl9pbW1lZGlhdGUgOiB0IHJlcHIpXG4gICAgOztcbiAgZW5kXG5lbmRcblxuaW5jbHVkZSBJbW1lZGlhdGU2NC5NYWtlIChJbnQpIChJbnQ2M19lbXVsKVxuXG5tb2R1bGUgQmFja2VuZCA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0XG5cbiAgICBpbmNsdWRlIEludF9pbnRmLlMgd2l0aCB0eXBlIHQgOj0gdFxuXG4gICAgdmFsIG9mX2ludCA6IGludCAtPiB0XG4gICAgdmFsIHRvX2ludCA6IHQgLT4gaW50IG9wdGlvblxuICAgIHZhbCB0b19pbnRfdHJ1bmMgOiB0IC0+IGludFxuICAgIHZhbCBvZl9pbnQzMiA6IGludDMyIC0+IHRcbiAgICB2YWwgdG9faW50MzIgOiB0IC0+IEludDMyLnQgb3B0aW9uXG4gICAgdmFsIHRvX2ludDMyX3RydW5jIDogdCAtPiBJbnQzMi50XG4gICAgdmFsIG9mX2ludDY0IDogSW50NjQudCAtPiB0IG9wdGlvblxuICAgIHZhbCBvZl9pbnQ2NF90cnVuYyA6IEludDY0LnQgLT4gdFxuICAgIHZhbCBvZl9uYXRpdmVpbnQgOiBuYXRpdmVpbnQgLT4gdCBvcHRpb25cbiAgICB2YWwgdG9fbmF0aXZlaW50IDogdCAtPiBuYXRpdmVpbnQgb3B0aW9uXG4gICAgdmFsIG9mX25hdGl2ZWludF90cnVuYyA6IG5hdGl2ZWludCAtPiB0XG4gICAgdmFsIHRvX25hdGl2ZWludF90cnVuYyA6IHQgLT4gbmF0aXZlaW50XG4gICAgdmFsIG9mX2Zsb2F0X3VuY2hlY2tlZCA6IGZsb2F0IC0+IHRcbiAgICB2YWwgcmVwciA6ICh0LCB0KSBJbnQ2M19lbXVsLlJlcHIudFxuICAgIHZhbCBic3dhcDE2IDogdCAtPiB0XG4gICAgdmFsIGJzd2FwMzIgOiB0IC0+IHRcbiAgICB2YWwgYnN3YXA0OCA6IHQgLT4gdFxuICBlbmRcbiAgd2l0aCB0eXBlIHQgOj0gdFxuXG4gIG1vZHVsZSBOYXRpdmUgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIEludFxuXG4gICAgbGV0IHRvX2ludCB4ID0gU29tZSB4XG4gICAgbGV0IHRvX2ludF90cnVuYyB4ID0geFxuXG4gICAgKCogW29mX2ludDMyX2V4bl0gaXMgYSBzYWZlIG9wZXJhdGlvbiBvbiBwbGF0Zm9ybXMgd2l0aCA2NC1iaXQgd29yZCBzaXplcy4gKilcbiAgICBsZXQgb2ZfaW50MzIgPSBvZl9pbnQzMl9leG5cbiAgICBsZXQgdG9fbmF0aXZlaW50X3RydW5jIHggPSB0b19uYXRpdmVpbnQgeFxuICAgIGxldCB0b19uYXRpdmVpbnQgeCA9IFNvbWUgKHRvX25hdGl2ZWludCB4KVxuICAgIGxldCByZXByID0gSW50NjNfZW11bC5SZXByLkludFxuICAgIGxldCBic3dhcDMyIHQgPSBJbnQ2NC50b19pbnRfdHJ1bmMgKEludDY0LmJzd2FwMzIgKEludDY0Lm9mX2ludCB0KSlcbiAgICBsZXQgYnN3YXA0OCB0ID0gSW50NjQudG9faW50X3RydW5jIChJbnQ2NC5ic3dhcDQ4IChJbnQ2NC5vZl9pbnQgdCkpXG4gIGVuZFxuXG4gIGxldCBpbXBsIDogKG1vZHVsZSBTKSA9XG4gICAgbWF0Y2ggcmVwciB3aXRoXG4gICAgfCBJbW1lZGlhdGUgLT4gKG1vZHVsZSBOYXRpdmUgOiBTKVxuICAgIHwgTm9uX2ltbWVkaWF0ZSAtPiAobW9kdWxlIEludDYzX2VtdWwgOiBTKVxuICA7O1xuZW5kXG5cbmluY2x1ZGUgKHZhbCBCYWNrZW5kLmltcGwgOiBCYWNrZW5kLlMpXG5cbm1vZHVsZSBPdmVyZmxvd19leG4gPSBzdHJ1Y3RcbiAgbGV0ICggKyApIHQgdSA9XG4gICAgbGV0IHN1bSA9IHQgKyB1IGluXG4gICAgaWYgYml0X29yIChiaXRfeG9yIHQgdSkgKGJpdF94b3IgdCAoYml0X25vdCBzdW0pKSA8IHplcm9cbiAgICB0aGVuIHN1bVxuICAgIGVsc2VcbiAgICAgIHJhaXNlX3NcbiAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICBcIiggKyApIG92ZXJmbG93XCJcbiAgICAgICAgICAgWyBcInRcIiwgc2V4cF9vZl90IHQ7IFwidVwiLCBzZXhwX29mX3QgdTsgXCJzdW1cIiwgc2V4cF9vZl90IHN1bSBdKVxuICA7O1xuXG4gIGxldCAoIC0gKSB0IHUgPVxuICAgIGxldCBkaWZmID0gdCAtIHUgaW5cbiAgICBsZXQgcG9zX2RpZmYgPSB0ID4gdSBpblxuICAgIGlmIHQgPD4gdSAmJiBCb29sLiggPD4gKSBwb3NfZGlmZiAoaXNfcG9zaXRpdmUgZGlmZilcbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCIoIC0gKSBvdmVyZmxvd1wiXG4gICAgICAgICAgIFsgXCJ0XCIsIHNleHBfb2ZfdCB0OyBcInVcIiwgc2V4cF9vZl90IHU7IFwiZGlmZlwiLCBzZXhwX29mX3QgZGlmZiBdKVxuICAgIGVsc2UgZGlmZlxuICA7O1xuXG4gIGxldCBuZWdhdGl2ZV9vbmUgPSBvZl9pbnQgKC0xKVxuICBsZXQgZGl2X3dvdWxkX292ZXJmbG93IHQgdSA9IHQgPSBtaW5fdmFsdWUgJiYgdSA9IG5lZ2F0aXZlX29uZVxuXG4gIGxldCAoICogKSB0IHUgPVxuICAgIGxldCBwcm9kdWN0ID0gdCAqIHUgaW5cbiAgICBpZiB1IDw+IHplcm8gJiYgKGRpdl93b3VsZF9vdmVyZmxvdyBwcm9kdWN0IHUgfHwgcHJvZHVjdCAvIHUgPD4gdClcbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCIoICogKSBvdmVyZmxvd1wiXG4gICAgICAgICAgIFsgXCJ0XCIsIHNleHBfb2ZfdCB0OyBcInVcIiwgc2V4cF9vZl90IHU7IFwicHJvZHVjdFwiLCBzZXhwX29mX3QgcHJvZHVjdCBdKVxuICAgIGVsc2UgcHJvZHVjdFxuICA7O1xuXG4gIGxldCAoIC8gKSB0IHUgPVxuICAgIGlmIGRpdl93b3VsZF9vdmVyZmxvdyB0IHVcbiAgICB0aGVuXG4gICAgICByYWlzZV9zXG4gICAgICAgIChTZXhwLm1lc3NhZ2VcbiAgICAgICAgICAgXCIoIC8gKSBvdmVyZmxvd1wiXG4gICAgICAgICAgIFsgXCJ0XCIsIHNleHBfb2ZfdCB0OyBcInVcIiwgc2V4cF9vZl90IHU7IFwicHJvZHVjdFwiLCBzZXhwX29mX3QgKHQgLyB1KSBdKVxuICAgIGVsc2UgdCAvIHVcbiAgOztcblxuICBsZXQgYWJzIHQgPSBpZiB0ID0gbWluX3ZhbHVlIHRoZW4gZmFpbHdpdGggXCJhYnMgb3ZlcmZsb3dcIiBlbHNlIGFicyB0XG4gIGxldCBuZWcgdCA9IGlmIHQgPSBtaW5fdmFsdWUgdGhlbiBmYWlsd2l0aCBcIm5lZyBvdmVyZmxvd1wiIGVsc2UgbmVnIHRcbmVuZFxuXG5sZXQgKCkgPSBhc3NlcnQgKEludC4oID0gKSBudW1fYml0cyA2MylcblxubGV0IHJhbmRvbV9vZl9pbnQgPyhzdGF0ZSA9IFJhbmRvbS5TdGF0ZS5kZWZhdWx0KSBib3VuZCA9XG4gIG9mX2ludCAoUmFuZG9tLlN0YXRlLmludCBzdGF0ZSAodG9faW50X2V4biBib3VuZCkpXG47O1xuXG5sZXQgcmFuZG9tX29mX2ludDY0ID8oc3RhdGUgPSBSYW5kb20uU3RhdGUuZGVmYXVsdCkgYm91bmQgPVxuICBvZl9pbnQ2NF9leG4gKFJhbmRvbS5TdGF0ZS5pbnQ2NCBzdGF0ZSAodG9faW50NjQgYm91bmQpKVxuOztcblxubGV0IHJhbmRvbSA9XG4gIG1hdGNoIFdvcmRfc2l6ZS53b3JkX3NpemUgd2l0aFxuICB8IFc2NCAtPiByYW5kb21fb2ZfaW50XG4gIHwgVzMyIC0+IHJhbmRvbV9vZl9pbnQ2NFxuOztcblxubGV0IHJhbmRvbV9pbmNsX29mX2ludCA/KHN0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGxvIGhpID1cbiAgb2ZfaW50IChSYW5kb20uU3RhdGUuaW50X2luY2wgc3RhdGUgKHRvX2ludF9leG4gbG8pICh0b19pbnRfZXhuIGhpKSlcbjs7XG5cbmxldCByYW5kb21faW5jbF9vZl9pbnQ2NCA/KHN0YXRlID0gUmFuZG9tLlN0YXRlLmRlZmF1bHQpIGxvIGhpID1cbiAgb2ZfaW50NjRfZXhuIChSYW5kb20uU3RhdGUuaW50NjRfaW5jbCBzdGF0ZSAodG9faW50NjQgbG8pICh0b19pbnQ2NCBoaSkpXG47O1xuXG5sZXQgcmFuZG9tX2luY2wgPVxuICBtYXRjaCBXb3JkX3NpemUud29yZF9zaXplIHdpdGhcbiAgfCBXNjQgLT4gcmFuZG9tX2luY2xfb2ZfaW50XG4gIHwgVzMyIC0+IHJhbmRvbV9pbmNsX29mX2ludDY0XG47O1xuXG5sZXQgZmxvb3JfbG9nMiB0ID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IHQgfD4gdG9faW50X2V4biB8PiBJbnQuZmxvb3JfbG9nMlxuICB8IFczMiAtPlxuICAgIGlmIHQgPD0gemVyb1xuICAgIHRoZW4gcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0ludC5mbG9vcl9sb2cyXSBnb3QgaW52YWxpZCBpbnB1dFwiIFsgXCJcIiwgc2V4cF9vZl90IHQgXSk7XG4gICAgbGV0IGZsb29yX2xvZzIgPSByZWYgKEludC4oIC0gKSBudW1fYml0cyAyKSBpblxuICAgIHdoaWxlIGVxdWFsIHplcm8gKGJpdF9hbmQgdCAoc2hpZnRfbGVmdCBvbmUgIWZsb29yX2xvZzIpKSBkb1xuICAgICAgZmxvb3JfbG9nMiA6PSBJbnQuKCAtICkgIWZsb29yX2xvZzIgMVxuICAgIGRvbmU7XG4gICAgIWZsb29yX2xvZzJcbjs7XG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIG1vZHVsZSBSZXByID0gUmVwclxuXG4gIGxldCByZXByID0gcmVwclxuXG4gIG1vZHVsZSBFbXVsID0gSW50NjNfZW11bFxuZW5kXG4iLCJvcGVuISBJbXBvcnRcblxuKCoqIEBjYW5vbmljYWwgQmFzZS5IYXNodGJsLktleSAqKVxubW9kdWxlIEtleSA9IHN0cnVjdFxuICBtb2R1bGUgdHlwZSBTID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBzZXhwX29mXVxuXG4gICAgaW5jbHVkZSBQcHhfY29tcGFyZV9saWIuQ29tcGFyYWJsZS5TIHdpdGggdHlwZSB0IDo9IHRcblxuICAgIHZhbCBzZXhwX29mX3QgOiB0IC0+IFNleHBsaWIwLlNleHAudFxuXG4gICAgW0BAQGVuZF1cblxuICAgICgqKiBUd28gW3RdcyB0aGF0IFtjb21wYXJlXSBlcXVhbCBtdXN0IGhhdmUgZXF1YWwgaGFzaGVzIGZvciB0aGUgaGFzaHRhYmxlXG4gICAgICAgIHRvIGJlaGF2ZSBwcm9wZXJseS4gKilcbiAgICB2YWwgaGFzaCA6IHQgLT4gaW50XG4gIGVuZFxuXG4gIHR5cGUgJ2EgdCA9IChtb2R1bGUgUyB3aXRoIHR5cGUgdCA9ICdhKVxuZW5kXG5cbigqKiBAY2Fub25pY2FsIEJhc2UuSGFzaHRibC5NZXJnZV9pbnRvX2FjdGlvbiAqKVxubW9kdWxlIE1lcmdlX2ludG9fYWN0aW9uID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9XG4gICAgfCBSZW1vdmVcbiAgICB8IFNldF90byBvZiAnYVxuZW5kXG5cbm1vZHVsZSB0eXBlIEFjY2Vzc29ycyA9IHNpZ1xuICAoKiogezIgQWNjZXNzb3JzfSAqKVxuXG4gIHR5cGUgKCdhLCAnYikgdFxuICB0eXBlICdhIGtleVxuXG4gIHZhbCBzZXhwX29mX2tleSA6ICgnYSwgXykgdCAtPiAnYSBrZXkgLT4gU2V4cC50XG4gIHZhbCBjbGVhciA6IChfLCBfKSB0IC0+IHVuaXRcbiAgdmFsIGNvcHkgOiAoJ2EsICdiKSB0IC0+ICgnYSwgJ2IpIHRcblxuICAoKiogQXR0ZW1wdGluZyB0byBtb2RpZnkgKFtzZXRdLCBbcmVtb3ZlXSwgZXRjLikgdGhlIGhhc2h0YWJsZSBkdXJpbmcgaXRlcmF0aW9uIChbZm9sZF0sXG4gICAgICBbaXRlcl0sIFtpdGVyX2tleXNdLCBbaXRlcmldKSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4gKilcbiAgdmFsIGZvbGQgOiAoJ2EsICdiKSB0IC0+IGluaXQ6J2MgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdjIC0+ICdjKSAtPiAnY1xuXG4gIHZhbCBpdGVyX2tleXMgOiAoJ2EsIF8pIHQgLT4gZjooJ2Ega2V5IC0+IHVuaXQpIC0+IHVuaXRcbiAgdmFsIGl0ZXIgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gdW5pdCkgLT4gdW5pdFxuXG4gICgqKiBJdGVyYXRlcyBvdmVyIGJvdGgga2V5cyBhbmQgdmFsdWVzLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgbGV0IGggPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCA0KTsgKDUsIDYpXSBpblxuICAgICAgSGFzaHRibC5pdGVyaSBoIH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgICAgICBwcmludF9lbmRsaW5lIChQcmludGYuc3ByaW50ZiBcIiVkLSVkXCIga2V5IGRhdGEpKTs7XG4gICAgICAxLTRcbiAgICAgIDUtNlxuICAgICAgLSA6IHVuaXQgPSAoKVxuICAgICAgdn0gKilcbiAgdmFsIGl0ZXJpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gdW5pdCkgLT4gdW5pdFxuXG4gIHZhbCBleGlzdHNpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZXhpc3RzIDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGJvb2xcbiAgdmFsIGZvcl9hbGxpIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gYm9vbFxuICB2YWwgZm9yX2FsbCA6IChfLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiBib29sXG4gIHZhbCBjb3VudGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKSAtPiBpbnRcbiAgdmFsIGNvdW50IDogKF8sICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+IGludFxuICB2YWwgbGVuZ3RoIDogKF8sIF8pIHQgLT4gaW50XG4gIHZhbCBpc19lbXB0eSA6IChfLCBfKSB0IC0+IGJvb2xcbiAgdmFsIG1lbSA6ICgnYSwgXykgdCAtPiAnYSBrZXkgLT4gYm9vbFxuICB2YWwgcmVtb3ZlIDogKCdhLCBfKSB0IC0+ICdhIGtleSAtPiB1bml0XG4gIHZhbCBjaG9vc2UgOiAoJ2EsICdiKSB0IC0+ICgnYSBrZXkgKiAnYikgb3B0aW9uXG4gIHZhbCBjaG9vc2VfZXhuIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgKiAnYlxuXG4gICgqKiBTZXRzIHRoZSBnaXZlbiBba2V5XSB0byBbZGF0YV0uICopXG4gIHZhbCBzZXQgOiAoJ2EsICdiKSB0IC0+IGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiB1bml0XG5cbiAgKCoqIFthZGRdIGFuZCBbYWRkX2V4bl0gbGVhdmUgdGhlIHRhYmxlIHVuY2hhbmdlZCBpZiB0aGUga2V5IHdhcyBhbHJlYWR5IHByZXNlbnQuICopXG4gIHZhbCBhZGQgOiAoJ2EsICdiKSB0IC0+IGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBbIGBPayB8IGBEdXBsaWNhdGUgXVxuXG4gIHZhbCBhZGRfZXhuIDogKCdhLCAnYikgdCAtPiBrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gdW5pdFxuXG4gICgqKiBbY2hhbmdlIHQga2V5IH5mXSBjaGFuZ2VzIFt0XSdzIHZhbHVlIGZvciBba2V5XSB0byBiZSBbZiAoZmluZCB0IGtleSldLiAqKVxuICB2YWwgY2hhbmdlIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gZjooJ2Igb3B0aW9uIC0+ICdiIG9wdGlvbikgLT4gdW5pdFxuXG4gICgqKiBbdXBkYXRlIHQga2V5IH5mXSBpcyBbY2hhbmdlIHQga2V5IH5mOihmdW4gbyAtPiBTb21lIChmIG8pKV0uICopXG4gIHZhbCB1cGRhdGUgOiAoJ2EsICdiKSB0IC0+ICdhIGtleSAtPiBmOignYiBvcHRpb24gLT4gJ2IpIC0+IHVuaXRcblxuICAoKiogW3VwZGF0ZV9hbmRfcmV0dXJuIHQga2V5IH5mXSBpcyBbdXBkYXRlXSwgYnV0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBbZiBvXS4gKilcbiAgdmFsIHVwZGF0ZV9hbmRfcmV0dXJuIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gZjooJ2Igb3B0aW9uIC0+ICdiKSAtPiAnYlxuXG4gICgqKiBbbWFwIHQgZl0gcmV0dXJucyBhIG5ldyB0YWJsZSB3aXRoIHZhbHVlcyByZXBsYWNlZCBieSB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIFtmXVxuICAgICAgdG8gdGhlIGN1cnJlbnQgdmFsdWVzLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgbGV0IGggPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCA0KTsgKDUsIDYpXSBpblxuICAgICAgbGV0IGgnID0gSGFzaHRibC5tYXAgaCB+ZjooZnVuIHggLT4geCAqIDIpIGluXG4gICAgICBIYXNodGJsLnRvX2FsaXN0IGgnOztcbiAgICAgIC0gOiAoaW50ICogaW50KSBsaXN0ID0gWyg1LCAxMik7ICgxLCA4KV1cbiAgICAgIHZ9ICopXG4gIHZhbCBtYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICdjKSAtPiAoJ2EsICdjKSB0XG5cbiAgKCoqIExpa2UgW21hcF0sIGJ1dCB0aGUgZnVuY3Rpb24gW2ZdIHRha2VzIGJvdGgga2V5IGFuZCBkYXRhIGFzIGFyZ3VtZW50cy4gKilcbiAgdmFsIG1hcGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYykgLT4gKCdhLCAnYykgdFxuXG4gICgqKiBSZXR1cm5zIGEgbmV3IHRhYmxlIGJ5IGZpbHRlcmluZyB0aGUgZ2l2ZW4gdGFibGUncyB2YWx1ZXMgYnkgW2ZdOiB0aGUga2V5cyBmb3Igd2hpY2hcbiAgICAgIFtmXSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHZhbHVlIHJldHVybnMgW1NvbWVdIGFyZSBrZXB0LCBhbmQgdGhvc2UgZm9yIHdoaWNoIGl0XG4gICAgICByZXR1cm5zIFtOb25lXSBhcmUgZGlzY2FyZGVkLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgbGV0IGggPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCA0KTsgKDUsIDYpXSBpblxuICAgICAgSGFzaHRibC5maWx0ZXJfbWFwIGggfmY6KGZ1biB4IC0+IGlmIHggPiA1IHRoZW4gU29tZSB4IGVsc2UgTm9uZSlcbiAgICAgIHw+IEhhc2h0YmwudG9fYWxpc3Q7O1xuICAgICAgLSA6IChpbnQgKiBpbnQpIGxpc3QgPSBbKDUsIDYpXVxuICAgICAgdn0gKilcbiAgdmFsIGZpbHRlcl9tYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICdjIG9wdGlvbikgLT4gKCdhLCAnYykgdFxuXG4gICgqKiBMaWtlIFtmaWx0ZXJfbWFwXSwgYnV0IHRoZSBmdW5jdGlvbiBbZl0gdGFrZXMgYm90aCBrZXkgYW5kIGRhdGEgYXMgYXJndW1lbnRzLiAqKVxuICB2YWwgZmlsdGVyX21hcGkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnYyBvcHRpb24pIC0+ICgnYSwgJ2MpIHRcblxuICB2YWwgZmlsdGVyX2tleXMgOiAoJ2EsICdiKSB0IC0+IGY6KCdhIGtleSAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG4gIHZhbCBmaWx0ZXIgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+IGJvb2wpIC0+ICgnYSwgJ2IpIHRcbiAgdmFsIGZpbHRlcmkgOiAoJ2EsICdiKSB0IC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0XG5cbiAgKCoqIFJldHVybnMgbmV3IHRhYmxlcyB3aXRoIGJvdW5kIHZhbHVlcyBwYXJ0aXRpb25lZCBieSBbZl0gYXBwbGllZCB0byB0aGUgYm91bmRcbiAgICAgIHZhbHVlcy4gKilcbiAgdmFsIHBhcnRpdGlvbl9tYXAgOiAoJ2EsICdiKSB0IC0+IGY6KCdiIC0+ICgnYywgJ2QpIEVpdGhlci50KSAtPiAoJ2EsICdjKSB0ICogKCdhLCAnZCkgdFxuXG4gICgqKiBMaWtlIFtwYXJ0aXRpb25fbWFwXSwgYnV0IHRoZSBmdW5jdGlvbiBbZl0gdGFrZXMgYm90aCBrZXkgYW5kIGRhdGEgYXMgYXJndW1lbnRzLiAqKVxuICB2YWwgcGFydGl0aW9uX21hcGlcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICgnYywgJ2QpIEVpdGhlci50KVxuICAgIC0+ICgnYSwgJ2MpIHQgKiAoJ2EsICdkKSB0XG5cbiAgKCoqIFJldHVybnMgYSBwYWlyIG9mIHRhYmxlcyBbKHQxLCB0MildLCB3aGVyZSBbdDFdIGNvbnRhaW5zIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlXG4gICAgICBpbml0aWFsIHRhYmxlIHdoaWNoIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBbZl0sIGFuZCBbdDJdIGNvbnRhaW5zIHRoZSByZXN0LiAqKVxuICB2YWwgcGFydGl0aW9uX3RmIDogKCdhLCAnYikgdCAtPiBmOignYiAtPiBib29sKSAtPiAoJ2EsICdiKSB0ICogKCdhLCAnYikgdFxuXG4gICgqKiBMaWtlIFtwYXJ0aXRpb25fdGZdLCBidXQgdGhlIGZ1bmN0aW9uIFtmXSB0YWtlcyBib3RoIGtleSBhbmQgZGF0YSBhcyBhcmd1bWVudHMuICopXG4gIHZhbCBwYXJ0aXRpb25pX3RmXG4gICAgOiAgKCdhLCAnYikgdFxuICAgIC0+IGY6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiBib29sKVxuICAgIC0+ICgnYSwgJ2IpIHQgKiAoJ2EsICdiKSB0XG5cbiAgKCoqIFtmaW5kX29yX2FkZCB0IGsgfmRlZmF1bHRdIHJldHVybnMgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGtleSBba10gaWYgaXQgaXMgaW4gdGhlXG4gICAgICB0YWJsZSBbdF0sIGFuZCBvdGhlcndpc2UgYXNzaWducyBba10gdGhlIHZhbHVlIHJldHVybmVkIGJ5IFtkZWZhdWx0ICgpXS4gKilcbiAgdmFsIGZpbmRfb3JfYWRkIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gZGVmYXVsdDoodW5pdCAtPiAnYikgLT4gJ2JcblxuICAoKiogTGlrZSBbZmluZF9vcl9hZGRdIGJ1dCBbZGVmYXVsdF0gdGFrZXMgdGhlIGtleSBhcyBhbiBhcmd1bWVudC4gKilcbiAgdmFsIGZpbmRpX29yX2FkZCA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+IGRlZmF1bHQ6KCdhIGtleSAtPiAnYikgLT4gJ2JcblxuICAoKiogW2ZpbmQgdCBrXSByZXR1cm5zIFtTb21lXSAodGhlIGN1cnJlbnQgYmluZGluZykgb2YgW2tdIGluIFt0XSwgb3IgW05vbmVdIGlmIG5vIHN1Y2hcbiAgICAgIGJpbmRpbmcgZXhpc3RzLiAqKVxuICB2YWwgZmluZCA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+ICdiIG9wdGlvblxuXG4gICgqKiBbZmluZF9leG4gdCBrXSByZXR1cm5zIHRoZSBjdXJyZW50IGJpbmRpbmcgb2YgW2tdIGluIFt0XSwgb3IgcmFpc2VzIFtDYW1sLk5vdF9mb3VuZF1cbiAgICAgIG9yIFtOb3RfZm91bmRfc10gaWYgbm8gc3VjaCBiaW5kaW5nIGV4aXN0cy4gKilcbiAgdmFsIGZpbmRfZXhuIDogKCdhLCAnYikgdCAtPiAnYSBrZXkgLT4gJ2JcblxuICAoKiogW2ZpbmRfYW5kX2NhbGwgdCBrIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXVxuXG4gICAgICBpcyBlcXVpdmFsZW50IHRvOlxuXG4gICAgICBbbWF0Y2ggZmluZCB0IGsgd2l0aCBTb21lIHYgLT4gaWZfZm91bmQgdiB8IE5vbmUgLT4gaWZfbm90X2ZvdW5kIGtdXG5cbiAgICAgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgYWxsb2NhdGUgdGhlIG9wdGlvbi4gKilcbiAgdmFsIGZpbmRfYW5kX2NhbGxcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gaWZfZm91bmQ6KCdiIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgKCoqIEp1c3QgbGlrZSBbZmluZF9hbmRfY2FsbF0sIGJ1dCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCB3aGljaCBpcyBwYXNzZWQgdG8gW2lmX2ZvdW5kXVxuICAgICAgYW5kIFtpZl9ub3RfZm91bmRdLCBzbyB0aGF0IHRoZSBjbGllbnQgY29kZSBjYW4gYXZvaWQgYWxsb2NhdGluZyBjbG9zdXJlcyBvciB1c2luZ1xuICAgICAgcmVmcyB0byBwYXNzIHRoaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgaW4gY29kZVxuICAgICAgd2hpY2ggdHJpZXMgdG8gbWluaW1pemUgaGVhcCBhbGxvY2F0aW9uLiAqKVxuICB2YWwgZmluZF9hbmRfY2FsbDFcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gYTonZFxuICAgIC0+IGlmX2ZvdW5kOignYiAtPiAnZCAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnZCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBmaW5kX2FuZF9jYWxsMlxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBhOidkXG4gICAgLT4gYjonZVxuICAgIC0+IGlmX2ZvdW5kOignYiAtPiAnZCAtPiAnZSAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnZCAtPiAnZSAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBmaW5kaV9hbmRfY2FsbFxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBpZl9mb3VuZDooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgdmFsIGZpbmRpX2FuZF9jYWxsMVxuICAgIDogICgnYSwgJ2IpIHRcbiAgICAtPiAnYSBrZXlcbiAgICAtPiBhOidkXG4gICAgLT4gaWZfZm91bmQ6KGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiAnZCAtPiAnYylcbiAgICAtPiBpZl9ub3RfZm91bmQ6KCdhIGtleSAtPiAnZCAtPiAnYylcbiAgICAtPiAnY1xuXG4gIHZhbCBmaW5kaV9hbmRfY2FsbDJcbiAgICA6ICAoJ2EsICdiKSB0XG4gICAgLT4gJ2Ega2V5XG4gICAgLT4gYTonZFxuICAgIC0+IGI6J2VcbiAgICAtPiBpZl9mb3VuZDooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdkIC0+ICdlIC0+ICdjKVxuICAgIC0+IGlmX25vdF9mb3VuZDooJ2Ega2V5IC0+ICdkIC0+ICdlIC0+ICdjKVxuICAgIC0+ICdjXG5cbiAgKCoqIFtmaW5kX2FuZF9yZW1vdmUgdCBrXSByZXR1cm5zIFNvbWUgKHRoZSBjdXJyZW50IGJpbmRpbmcpIG9mIGsgaW4gdCBhbmQgcmVtb3ZlcyBpdCxcbiAgICAgIG9yIE5vbmUgaXMgbm8gc3VjaCBiaW5kaW5nIGV4aXN0cy4gKilcbiAgdmFsIGZpbmRfYW5kX3JlbW92ZSA6ICgnYSwgJ2IpIHQgLT4gJ2Ega2V5IC0+ICdiIG9wdGlvblxuXG4gICgqKiBNZXJnZXMgdHdvIGhhc2h0YWJsZXMuXG5cbiAgICAgIFRoZSByZXN1bHQgb2YgW21lcmdlIGYgaDEgaDJdIGhhcyBhcyBrZXlzIHRoZSBzZXQgb2YgYWxsIFtrXSBpbiB0aGUgdW5pb24gb2YgdGhlXG4gICAgICBzZXRzIG9mIGtleXMgb2YgW2gxXSBhbmQgW2gyXSBmb3Igd2hpY2ggW2QoayldIGlzIG5vdCBOb25lLCB3aGVyZTpcblxuICAgICAgZChrKSA9XG4gICAgICAtIFtmIH5rZXk6ayAoYExlZnQgZDEpXVxuICAgICAgICBpZiBba10gaW4gW2gxXSBtYXBzIHRvIGQxLCBhbmQgW2gyXSBkb2VzIG5vdCBoYXZlIGRhdGEgZm9yIFtrXTtcblxuICAgICAgLSBbZiB+a2V5OmsgKGBSaWdodCBkMildXG4gICAgICAgIGlmIFtrXSBpbiBbaDJdIG1hcHMgdG8gZDIsIGFuZCBbaDFdIGRvZXMgbm90IGhhdmUgZGF0YSBmb3IgW2tdO1xuXG4gICAgICAtIFtmIH5rZXk6ayAoYEJvdGggKGQxLCBkMikpXVxuICAgICAgICBvdGhlcndpc2UsIHdoZXJlIFtrXSBpbiBbaDFdIG1hcHMgdG8gW2QxXSBhbmQgW2tdIGluIFtoMl0gbWFwcyB0byBbZDJdLlxuXG4gICAgICBFYWNoIGtleSBba10gaXMgbWFwcGVkIHRvIGEgc2luZ2xlIHBpZWNlIG9mIGRhdGEgW3hdLCB3aGVyZSBbZChrKSA9IFNvbWUgeF0uXG5cbiAgICAgIEV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaDEgPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCA1KTsgKDIsIDMyMzIpXSBpblxuICAgICAgbGV0IGgyID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgMyldIGluXG4gICAgICBIYXNodGJsLm1lcmdlIGgxIGgyIH5mOihmdW4gfmtleTpfIC0+IGZ1bmN0aW9uXG4gICAgICAgIHwgYExlZnQgeCAtPiBTb21lIChgTGVmdCB4KVxuICAgICAgICB8IGBSaWdodCB4IC0+IFNvbWUgKGBSaWdodCB4KVxuICAgICAgICB8IGBCb3RoICh4LCB5KSAtPiBpZiB4PXkgdGhlbiBOb25lIGVsc2UgU29tZSAoYEJvdGggKHgseSkpXG4gICAgICApIHw+IEhhc2h0YmwudG9fYWxpc3Q7O1xuICAgICAgLSA6IChpbnQgKiBbPiBgQm90aCBvZiBpbnQgKiBpbnQgfCBgTGVmdCBvZiBpbnQgfCBgUmlnaHQgb2YgaW50IF0pIGxpc3QgPVxuICAgICAgWygyLCBgTGVmdCAzMjMyKTsgKDEsIGBCb3RoICg1LCAzKSldXG4gICAgICB2fSAqKVxuICB2YWwgbWVyZ2VcbiAgICA6ICAoJ2ssICdhKSB0XG4gICAgLT4gKCdrLCAnYikgdFxuICAgIC0+IGY6KGtleTonayBrZXkgLT4gWyBgTGVmdCBvZiAnYSB8IGBSaWdodCBvZiAnYiB8IGBCb3RoIG9mICdhICogJ2IgXSAtPiAnYyBvcHRpb24pXG4gICAgLT4gKCdrLCAnYykgdFxuXG5cbiAgKCoqIEV2ZXJ5IFtrZXldIGluIFtzcmNdIHdpbGwgYmUgcmVtb3ZlZCBvciBzZXQgaW4gW2RzdF0gYWNjb3JkaW5nIHRvIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgIG9mIFtmXS4gKilcbiAgdmFsIG1lcmdlX2ludG9cbiAgICA6ICBzcmM6KCdrLCAnYSkgdFxuICAgIC0+IGRzdDooJ2ssICdiKSB0XG4gICAgLT4gZjooa2V5OidrIGtleSAtPiAnYSAtPiAnYiBvcHRpb24gLT4gJ2IgTWVyZ2VfaW50b19hY3Rpb24udClcbiAgICAtPiB1bml0XG5cbiAgKCoqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGtleXMgZm9yIGdpdmVuIGhhc2h0YWJsZS4gKilcbiAgdmFsIGtleXMgOiAoJ2EsIF8pIHQgLT4gJ2Ega2V5IGxpc3RcblxuICAoKiogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgZGF0YSBmb3IgZ2l2ZW4gaGFzaHRhYmxlLiAqKVxuICB2YWwgZGF0YSA6IChfLCAnYikgdCAtPiAnYiBsaXN0XG5cbiAgKCoqIFtmaWx0ZXJfaW5wbGFjZSB0IH5mXSByZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSBbdF0gdGhhdCBkb24ndCBzYXRpc2Z5IFtmXS4gKilcbiAgdmFsIGZpbHRlcl9rZXlzX2lucGxhY2UgOiAoJ2EsIF8pIHQgLT4gZjooJ2Ega2V5IC0+IGJvb2wpIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyX2lucGxhY2UgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gYm9vbCkgLT4gdW5pdFxuICB2YWwgZmlsdGVyaV9pbnBsYWNlIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gYm9vbCkgLT4gdW5pdFxuXG4gICgqKiBbbWFwX2lucGxhY2UgdCB+Zl0gYXBwbGllcyBbZl0gdG8gYWxsIGVsZW1lbnRzIGluIFt0XSwgdHJhbnNmb3JtaW5nIHRoZW0gaW5cbiAgICAgIHBsYWNlLiAqKVxuICB2YWwgbWFwX2lucGxhY2UgOiAoXywgJ2IpIHQgLT4gZjooJ2IgLT4gJ2IpIC0+IHVuaXRcblxuICB2YWwgbWFwaV9pbnBsYWNlIDogKCdhLCAnYikgdCAtPiBmOihrZXk6J2Ega2V5IC0+IGRhdGE6J2IgLT4gJ2IpIC0+IHVuaXRcblxuICAoKiogW2ZpbHRlcl9tYXBfaW5wbGFjZV0gY29tYmluZXMgdGhlIGVmZmVjdHMgb2YgW21hcF9pbnBsYWNlXSBhbmQgW2ZpbHRlcl9pbnBsYWNlXS4gKilcbiAgdmFsIGZpbHRlcl9tYXBfaW5wbGFjZSA6IChfLCAnYikgdCAtPiBmOignYiAtPiAnYiBvcHRpb24pIC0+IHVuaXRcblxuICB2YWwgZmlsdGVyX21hcGlfaW5wbGFjZSA6ICgnYSwgJ2IpIHQgLT4gZjooa2V5OidhIGtleSAtPiBkYXRhOidiIC0+ICdiIG9wdGlvbikgLT4gdW5pdFxuXG4gICgqKiBbZXF1YWwgZiB0MSB0Ml0gYW5kIFtzaW1pbGFyIGYgdDEgdDJdIGJvdGggcmV0dXJuIHRydWUgaWZmIFt0MV0gYW5kIFt0Ml0gaGF2ZSB0aGVcbiAgICAgIHNhbWUga2V5cyBhbmQgZm9yIGFsbCBrZXlzIFtrXSwgW2YgKGZpbmRfZXhuIHQxIGspIChmaW5kX2V4biB0MiBrKV0uICBbZXF1YWxdIGFuZFxuICAgICAgW3NpbWlsYXJdIG9ubHkgZGlmZmVyIGluIHRoZWlyIHR5cGVzLiAqKVxuICB2YWwgZXF1YWwgOiAoJ2IgLT4gJ2IgLT4gYm9vbCkgLT4gKCdhLCAnYikgdCAtPiAoJ2EsICdiKSB0IC0+IGJvb2xcblxuICB2YWwgc2ltaWxhciA6ICgnYjEgLT4gJ2IyIC0+IGJvb2wpIC0+ICgnYSwgJ2IxKSB0IC0+ICgnYSwgJ2IyKSB0IC0+IGJvb2xcblxuICAoKiogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgKGtleSwgZGF0YSkgcGFpcnMgZm9yIGdpdmVuIGhhc2h0YWJsZS4gKilcbiAgdmFsIHRvX2FsaXN0IDogKCdhLCAnYikgdCAtPiAoJ2Ega2V5ICogJ2IpIGxpc3RcblxuXG4gICgqKiBbcmVtb3ZlX2lmX3plcm9dJ3MgZGVmYXVsdCBpcyBbZmFsc2VdLiAqKVxuICB2YWwgaW5jciA6ID9ieTppbnQgLT4gP3JlbW92ZV9pZl96ZXJvOmJvb2wgLT4gKCdhLCBpbnQpIHQgLT4gJ2Ega2V5IC0+IHVuaXRcblxuICB2YWwgZGVjciA6ID9ieTppbnQgLT4gP3JlbW92ZV9pZl96ZXJvOmJvb2wgLT4gKCdhLCBpbnQpIHQgLT4gJ2Ega2V5IC0+IHVuaXRcbmVuZFxuXG5tb2R1bGUgdHlwZSBNdWx0aSA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRcbiAgdHlwZSAnYSBrZXlcblxuICAoKiogW2FkZF9tdWx0aSB0IH5rZXkgfmRhdGFdIGlmIFtrZXldIGlzIHByZXNlbnQgaW4gdGhlIHRhYmxlIHRoZW4gY29uc1xuICAgICAgW2RhdGFdIG9uIHRoZSBsaXN0LCBvdGhlcndpc2UgYWRkIFtrZXldIHdpdGggYSBzaW5nbGUgZWxlbWVudCBsaXN0LiAqKVxuICB2YWwgYWRkX211bHRpIDogKCdhLCAnYiBsaXN0KSB0IC0+IGtleTonYSBrZXkgLT4gZGF0YTonYiAtPiB1bml0XG5cbiAgKCoqIFtyZW1vdmVfbXVsdGkgdCBrZXldIHVwZGF0ZXMgdGhlIHRhYmxlLCByZW1vdmluZyB0aGUgaGVhZCBvZiB0aGUgbGlzdCBib3VuZCB0b1xuICAgICAgW2tleV0uIElmIHRoZSBsaXN0IGhhcyBvbmx5IG9uZSBlbGVtZW50IChvciBpcyBlbXB0eSkgdGhlbiB0aGUgYmluZGluZyBpc1xuICAgICAgcmVtb3ZlZC4gKilcbiAgdmFsIHJlbW92ZV9tdWx0aSA6ICgnYSwgXyBsaXN0KSB0IC0+ICdhIGtleSAtPiB1bml0XG5cbiAgKCoqIFtmaW5kX211bHRpIHQga2V5XSByZXR1cm5zIHRoZSBlbXB0eSBsaXN0IGlmIFtrZXldIGlzIG5vdCBwcmVzZW50IGluIHRoZSB0YWJsZSxcbiAgICAgIHJldHVybnMgW3RdJ3MgdmFsdWVzIGZvciBba2V5XSBvdGhlcndpc2UuICopXG4gIHZhbCBmaW5kX211bHRpIDogKCdhLCAnYiBsaXN0KSB0IC0+ICdhIGtleSAtPiAnYiBsaXN0XG5lbmRcblxudHlwZSAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9ucyA9XG4gID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gIC0+ICdrZXkgS2V5LnRcbiAgLT4gJ3pcblxudHlwZSAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZSA9XG4gID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gIC0+ICd6XG5cbm1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG4gIHR5cGUgJ2Ega2V5XG4gIHR5cGUgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgY3JlYXRlIDogKCdhIGtleSwgJ2IsIHVuaXQgLT4gKCdhLCAnYikgdCkgY3JlYXRlX29wdGlvbnNcblxuXG4gIHZhbCBvZl9hbGlzdFxuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ2JcbiAgICAgICwgKCdhIGtleSAqICdiKSBsaXN0IC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBrZXkgXSApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwc1xuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ2JcbiAgICAgICwgKCdhIGtleSAqICdiKSBsaXN0IC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2Ega2V5IGxpc3QgXSApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5cbiAgdmFsIG9mX2FsaXN0X29yX2Vycm9yXG4gICAgOiAoJ2Ega2V5LCAnYiwgKCdhIGtleSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IpIHQgT3JfZXJyb3IudCkgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgb2ZfYWxpc3RfZXhuIDogKCdhIGtleSwgJ2IsICgnYSBrZXkgKiAnYikgbGlzdCAtPiAoJ2EsICdiKSB0KSBjcmVhdGVfb3B0aW9uc1xuXG4gIHZhbCBvZl9hbGlzdF9tdWx0aVxuICAgIDogKCdhIGtleSwgJ2IgbGlzdCwgKCdhIGtleSAqICdiKSBsaXN0IC0+ICgnYSwgJ2IgbGlzdCkgdCkgY3JlYXRlX29wdGlvbnNcblxuXG4gICgqKiB7WyBjcmVhdGVfbWFwcGVkIGdldF9rZXkgZ2V0X2RhdGEgW3gxLC4uLix4bl1cbiAgICAgICAgID0gb2ZfYWxpc3QgW2dldF9rZXkgeDEsIGdldF9kYXRhIHgxOyAuLi47IGdldF9rZXkgeG4sIGdldF9kYXRhIHhuXSBdfSAqKVxuICB2YWwgY3JlYXRlX21hcHBlZFxuICAgIDogKCAnYSBrZXlcbiAgICAgICwgJ2JcbiAgICAgICwgZ2V0X2tleTooJ3IgLT4gJ2Ega2V5KVxuICAgICAgICAtPiBnZXRfZGF0YTooJ3IgLT4gJ2IpXG4gICAgICAgIC0+ICdyIGxpc3RcbiAgICAgICAgLT4gWyBgT2sgb2YgKCdhLCAnYikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBrZXkgbGlzdCBdIClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcblxuXG4gICgqKiB7WyBjcmVhdGVfd2l0aF9rZXkgfmdldF9rZXkgW3gxLC4uLix4bl1cbiAgICAgICAgID0gb2ZfYWxpc3QgW2dldF9rZXkgeDEsIHgxOyAuLi47IGdldF9rZXkgeG4sIHhuXSBdfSAqKVxuICB2YWwgY3JlYXRlX3dpdGhfa2V5XG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnclxuICAgICAgLCBnZXRfa2V5OignciAtPiAnYSBrZXkpXG4gICAgICAgIC0+ICdyIGxpc3RcbiAgICAgICAgLT4gWyBgT2sgb2YgKCdhLCAncikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBrZXkgbGlzdCBdIClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yXG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnclxuICAgICAgLCBnZXRfa2V5OignciAtPiAnYSBrZXkpIC0+ICdyIGxpc3QgLT4gKCdhLCAncikgdCBPcl9lcnJvci50IClcbiAgICAgICAgY3JlYXRlX29wdGlvbnNcblxuICB2YWwgY3JlYXRlX3dpdGhfa2V5X2V4blxuICAgIDogKCdhIGtleSwgJ3IsIGdldF9rZXk6KCdyIC0+ICdhIGtleSkgLT4gJ3IgbGlzdCAtPiAoJ2EsICdyKSB0KSBjcmVhdGVfb3B0aW9uc1xuXG5cbiAgdmFsIGdyb3VwXG4gICAgOiAoICdhIGtleVxuICAgICAgLCAnYlxuICAgICAgLCBnZXRfa2V5OignciAtPiAnYSBrZXkpXG4gICAgICAgIC0+IGdldF9kYXRhOignciAtPiAnYilcbiAgICAgICAgLT4gY29tYmluZTooJ2IgLT4gJ2IgLT4gJ2IpXG4gICAgICAgIC0+ICdyIGxpc3RcbiAgICAgICAgLT4gKCdhLCAnYikgdCApXG4gICAgICAgIGNyZWF0ZV9vcHRpb25zXG5lbmRcblxubW9kdWxlIHR5cGUgQ3JlYXRvcnMgPSBzaWdcbiAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgKCoqIHsyIENyZWF0b3JzfSAqKVxuXG4gICgqKiBUaGUgbW9kdWxlIHlvdSBwYXNzIHRvIFtjcmVhdGVdIG11c3QgaGF2ZSBhIHR5cGUgdGhhdCBpcyBoYXNoYWJsZSwgc2V4cGFibGUsIGFuZFxuICAgICAgY29tcGFyYWJsZS5cblxuICAgICAgRXhhbXBsZTpcblxuICAgICAge3ZcbiAgICAgICAgSGFzaHRibC5jcmVhdGUgKG1vZHVsZSBJbnQpOztcbiAgICAgICAgLSA6IChpbnQsICdfYSkgSGFzaHRibC50ID0gPGFic3RyPjs7XG4gICAgICB2fSAqKVxuICB2YWwgY3JlYXRlXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhLCAnYikgdFxuXG4gICgqKiBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgICAgSGFzaHRibC5vZl9hbGlzdCAobW9kdWxlIEludCkgWygzLCBcInNvbWV0aGluZ1wiKTsgKDIsIFwid2hhdGV2ZXJcIildXG4gICAgICAgICAtIDogWyBgRHVwbGljYXRlX2tleSBvZiBpbnQgfCBgT2sgb2YgKGludCwgc3RyaW5nKSBIYXNodGJsLnQgXSA9IGBPayA8YWJzdHI+XG4gICAgICB2fSAqKVxuICB2YWwgb2ZfYWxpc3RcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiAoJ2EgKiAnYikgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleSBvZiAnYSBdXG5cbiAgKCoqIFdoZXJlYXMgW29mX2FsaXN0XSB3aWxsIHJlcG9ydCBbRHVwbGljYXRlX2tleV0gbm8gbWF0dGVyIGhvdyBtYW55IGR1cHMgdGhlcmUgYXJlIGluXG4gICAgICB5b3VyIGxpc3QsIFtvZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHNdIHdpbGwgcmVwb3J0IGVhY2ggYW5kIGV2ZXJ5IGR1cGxpY2F0ZSBlbnRyeS5cblxuICAgICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgIHt2XG4gICAgICAgIEhhc2h0Ymwub2ZfYWxpc3QgKG1vZHVsZSBJbnQpIFsoMSwgXCJmb29cIik7ICgxLCBcImJhclwiKTsgKDIsIFwiZm9vXCIpOyAoMiwgXCJiYXJcIildOztcbiAgICAgICAgLSA6IFsgYER1cGxpY2F0ZV9rZXkgb2YgaW50IHwgYE9rIG9mIChpbnQsIHN0cmluZykgSGFzaHRibC50IF0gPSBgRHVwbGljYXRlX2tleSAxXG5cbiAgICAgICAgSGFzaHRibC5vZl9hbGlzdF9yZXBvcnRfYWxsX2R1cHMgKG1vZHVsZSBJbnQpIFsoMSwgXCJmb29cIik7ICgxLCBcImJhclwiKTsgKDIsIFwiZm9vXCIpOyAoMiwgXCJiYXJcIildOztcbiAgICAgICAgLSA6IFsgYER1cGxpY2F0ZV9rZXlzIG9mIGludCBsaXN0IHwgYE9rIG9mIChpbnQsIHN0cmluZykgSGFzaHRibC50IF0gPSBgRHVwbGljYXRlX2tleXMgWzE7IDJdXG4gICAgICB2fSAqKVxuICB2YWwgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gKCdhICogJ2IpIGxpc3RcbiAgICAtPiBbIGBPayBvZiAoJ2EsICdiKSB0IHwgYER1cGxpY2F0ZV9rZXlzIG9mICdhIGxpc3QgXVxuXG4gIHZhbCBvZl9hbGlzdF9vcl9lcnJvclxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYikgdCBPcl9lcnJvci50XG5cbiAgdmFsIG9mX2FsaXN0X2V4blxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYikgdFxuXG4gICgqKiBDcmVhdGVzIGEge3shTXVsdGl9IFwibXVsdGlcIn0gaGFzaHRhYmxlLCBpLmUuLCBhIGhhc2h0YWJsZSB3aGVyZSBlYWNoIGtleSBwb2ludHMgdG8gYVxuICAgICAgbGlzdCBwb3RlbnRpYWxseSBjb250YWluaW5nIG11bHRpcGxlIHZhbHVlcy4gU28gaW5zdGVhZCBvZiBzaG9ydC1jaXJjdWl0aW5nIHdpdGggYVxuICAgICAgW2BEdXBsaWNhdGVfa2V5XSB2YXJpYW50IG9uIGR1cGxpY2F0ZXMsIGFzIGluIFtvZl9hbGlzdF0sIFtvZl9hbGlzdF9tdWx0aV0gZm9sZHNcbiAgICAgIHRob3NlIHZhbHVlcyBpbnRvIGEgbGlzdCBmb3IgdGhlIGdpdmVuIGtleTpcblxuICAgICAge3ZcbiAgICAgIGxldCBoID0gSGFzaHRibC5vZl9hbGlzdF9tdWx0aSAobW9kdWxlIEludCkgWygxLCBcImFcIik7ICgxLCBcImJcIik7ICgyLCBcImNcIik7ICgyLCBcImRcIildOztcbiAgICAgIHZhbCBoIDogKGludCwgc3RyaW5nIGxpc3QpIEhhc2h0YmwudCA9IDxhYnN0cj5cblxuICAgICAgSGFzaHRibC5maW5kX2V4biBoIDE7O1xuICAgICAgLSA6IHN0cmluZyBsaXN0ID0gW1wiYlwiOyBcImFcIl1cbiAgICAgIHZ9ICopXG4gIHZhbCBvZl9hbGlzdF9tdWx0aVxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+ICgnYSAqICdiKSBsaXN0XG4gICAgLT4gKCdhLCAnYiBsaXN0KSB0XG5cbiAgKCoqIEFwcGxpZXMgdGhlIFtnZXRfa2V5XSBhbmQgW2dldF9kYXRhXSBmdW5jdGlvbnMgdG8gdGhlIFsnciBsaXN0XSB0byBjcmVhdGUgdGhlXG4gICAgICBpbml0aWFsIGtleXMgYW5kIHZhbHVlcywgcmVzcGVjdGl2ZWx5LCBmb3IgdGhlIG5ldyBoYXNodGFibGUuXG5cbiAgICAgIHtbIGNyZWF0ZV9tYXBwZWQgZ2V0X2tleSBnZXRfZGF0YSBbeDE7Li4uO3huXVxuICAgICAgICAgPSBvZl9hbGlzdCBbZ2V0X2tleSB4MSwgZ2V0X2RhdGEgeDE7IC4uLjsgZ2V0X2tleSB4biwgZ2V0X2RhdGEgeG5dXG4gICAgICBdfVxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgICBsZXQgaCA9XG4gICAgICAgICAgSGFzaHRibC5jcmVhdGVfbWFwcGVkIChtb2R1bGUgSW50KVxuICAgICAgICAgICAgfmdldF9rZXk6KGZ1biB4IC0+IHgpXG4gICAgICAgICAgICB+Z2V0X2RhdGE6KGZ1biB4IC0+IHggKyAxKVxuICAgICAgICAgICBbMTsgMjsgM107O1xuICAgICAgICB2YWwgaCA6IFsgYER1cGxpY2F0ZV9rZXlzIG9mIGludCBsaXN0IHwgYE9rIG9mIChpbnQsIGludCkgSGFzaHRibC50IF0gPSBgT2sgPGFic3RyPlxuXG4gICAgICAgIGxldCBoID1cbiAgICAgICAgICBtYXRjaCBoIHdpdGhcbiAgICAgICAgICB8IGBPayB4IC0+IHhcbiAgICAgICAgICB8IGBEdXBsaWNhdGVfa2V5cyBfIC0+IGZhaWx3aXRoIFwiXCJcbiAgICAgICAgaW5cbiAgICAgICAgSGFzaHRibC5maW5kX2V4biBoIDE7O1xuICAgICAgICAtIDogaW50ID0gMlxuICAgICAgdn0gKilcbiAgdmFsIGNyZWF0ZV9tYXBwZWRcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiBnZXRfa2V5OignciAtPiAnYSlcbiAgICAtPiBnZXRfZGF0YTooJ3IgLT4gJ2IpXG4gICAgLT4gJ3IgbGlzdFxuICAgIC0+IFsgYE9rIG9mICgnYSwgJ2IpIHQgfCBgRHVwbGljYXRlX2tleXMgb2YgJ2EgbGlzdCBdXG5cbiAgKCoqIHtbIGNyZWF0ZV93aXRoX2tleSB+Z2V0X2tleSBbeDE7Li4uO3huXVxuICAgICAgICAgPSBvZl9hbGlzdCBbZ2V0X2tleSB4MSwgeDE7IC4uLjsgZ2V0X2tleSB4biwgeG5dIF19ICopXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlcbiAgICA6ICA/Z3Jvd3RoX2FsbG93ZWQ6Ym9vbCAoKiogZGVmYXVsdHMgdG8gW3RydWVdICopXG4gICAgLT4gP3NpemU6aW50ICgqKiBpbml0aWFsIHNpemUgLS0gZGVmYXVsdCAwICopXG4gICAgLT4gJ2EgS2V5LnRcbiAgICAtPiBnZXRfa2V5OignciAtPiAnYSlcbiAgICAtPiAnciBsaXN0XG4gICAgLT4gWyBgT2sgb2YgKCdhLCAncikgdCB8IGBEdXBsaWNhdGVfa2V5cyBvZiAnYSBsaXN0IF1cblxuICB2YWwgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gZ2V0X2tleTooJ3IgLT4gJ2EpXG4gICAgLT4gJ3IgbGlzdFxuICAgIC0+ICgnYSwgJ3IpIHQgT3JfZXJyb3IudFxuXG4gIHZhbCBjcmVhdGVfd2l0aF9rZXlfZXhuXG4gICAgOiAgP2dyb3d0aF9hbGxvd2VkOmJvb2wgKCoqIGRlZmF1bHRzIHRvIFt0cnVlXSAqKVxuICAgIC0+ID9zaXplOmludCAoKiogaW5pdGlhbCBzaXplIC0tIGRlZmF1bHQgMCAqKVxuICAgIC0+ICdhIEtleS50XG4gICAgLT4gZ2V0X2tleTooJ3IgLT4gJ2EpXG4gICAgLT4gJ3IgbGlzdFxuICAgIC0+ICgnYSwgJ3IpIHRcblxuICAoKiogTGlrZSBbY3JlYXRlX21hcHBlZF0sIGFwcGxpZXMgdGhlIFtnZXRfa2V5XSBhbmQgW2dldF9kYXRhXSBmdW5jdGlvbnMgdG8gdGhlIFsnclxuICAgICAgbGlzdF0gdG8gY3JlYXRlIHRoZSBpbml0aWFsIGtleXMgYW5kIHZhbHVlcywgcmVzcGVjdGl2ZWx5LCBmb3IgdGhlIG5ldyBoYXNodGFibGUgLS1cbiAgICAgIGFuZCB0aGVuLCBsaWtlIFthZGRfbXVsdGldLCBmb2xkcyB0b2dldGhlciB2YWx1ZXMgYmVsb25naW5nIHRvIHRoZSBzYW1lIGtleXMuIEhlcmUsXG4gICAgICB0aG91Z2gsIHRoZSBmdW5jdGlvbiB1c2VkIGZvciB0aGUgZm9sZGluZyBpcyBnaXZlbiBieSBbY29tYmluZV0gKGluc3RlYWQgb2YganVzdFxuICAgICAgYmVpbmcgYSBbY29uc10pLlxuXG4gICAgICBFeGFtcGxlOlxuXG4gICAgICB7dlxuICAgICAgICAgSGFzaHRibC5ncm91cCAobW9kdWxlIEludClcbiAgICAgICAgICAgfmdldF9rZXk6KGZ1biB4IC0+IHggLyAyKVxuICAgICAgICAgICB+Z2V0X2RhdGE6KGZ1biB4IC0+IHgpXG4gICAgICAgICAgIH5jb21iaW5lOihmdW4geCB5IC0+IHggKiB5KVxuICAgICAgICAgICAgWyAxOyAyOyAzOyA0XVxuICAgICAgICAgfD4gSGFzaHRibC50b19hbGlzdDs7XG4gICAgICAgICAtIDogKGludCAqIGludCkgbGlzdCA9IFsoMiwgNCk7ICgxLCA2KTsgKDAsIDEpXVxuICAgICAgIHZ9ICopXG4gIHZhbCBncm91cFxuICAgIDogID9ncm93dGhfYWxsb3dlZDpib29sICgqKiBkZWZhdWx0cyB0byBbdHJ1ZV0gKilcbiAgICAtPiA/c2l6ZTppbnQgKCoqIGluaXRpYWwgc2l6ZSAtLSBkZWZhdWx0IDAgKilcbiAgICAtPiAnYSBLZXkudFxuICAgIC0+IGdldF9rZXk6KCdyIC0+ICdhKVxuICAgIC0+IGdldF9kYXRhOignciAtPiAnYilcbiAgICAtPiBjb21iaW5lOignYiAtPiAnYiAtPiAnYilcbiAgICAtPiAnciBsaXN0XG4gICAgLT4gKCdhLCAnYikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfd2l0aG91dF9zdWJtb2R1bGVzID0gc2lnXG4gIHZhbCBoYXNoIDogJ2EgLT4gaW50XG4gIHZhbCBoYXNoX3BhcmFtIDogaW50IC0+IGludCAtPiAnYSAtPiBpbnRcblxuICB0eXBlICgnYSwgJ2IpIHRcblxuICAoKiogV2UgcHJvdmlkZSBhIFtzZXhwX29mX3RdIGJ1dCBub3QgYSBbdF9vZl9zZXhwXSBmb3IgdGhpcyB0eXBlIGJlY2F1c2Ugb25lIG5lZWRzIHRvIGJlXG4gICAgICBleHBsaWNpdCBhYm91dCB0aGUgaGFzaCBhbmQgY29tcGFyaXNvbiBmdW5jdGlvbnMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgaGFzaHRhYmxlLlxuICAgICAgTm90ZSB0aGF0IFtIYXNodGJsLlBvbHkudF0gZG9lcyBoYXZlIFtbQEBkZXJpdmluZyBzZXhwXV0sIGFuZCB1c2VzIE9DYW1sJ3MgYnVpbHQtaW5cbiAgICAgIHBvbHltb3JwaGljIGNvbXBhcmlzb24gYW5kIGFuZCBwb2x5bW9ycGhpYyBoYXNoaW5nLiAqKVxuICB2YWwgc2V4cF9vZl90IDogKCdhIC0+IFNleHAudCkgLT4gKCdiIC0+IFNleHAudCkgLT4gKCdhLCAnYikgdCAtPiBTZXhwLnRcblxuICBpbmNsdWRlIENyZWF0b3JzIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgKCoqIEBpbmxpbmUgKilcblxuICBpbmNsdWRlIEFjY2Vzc29ycyB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0IHdpdGggdHlwZSAnYSBrZXkgPSAnYVxuICAoKiogQGlubGluZSAqKVxuXG5cbiAgaW5jbHVkZSBNdWx0aSB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0IHdpdGggdHlwZSAnYSBrZXkgOj0gJ2Ega2V5XG4gICgqKiBAaW5saW5lICopXG5cbiAgdmFsIGhhc2hhYmxlX3MgOiAoJ2tleSwgXykgdCAtPiAna2V5IEtleS50XG5cbiAgaW5jbHVkZSBJbnZhcmlhbnQuUzIgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNfcG9seSA9IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBpbmNsdWRlIFNleHBsaWIwLlNleHBhYmxlLlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICB2YWwgdF9zZXhwX2dyYW1tYXJcbiAgICA6ICAnYSBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuICAgIC0+ICdiIFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgLT4gKCdhLCAnYikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5cbiAgdmFsIGhhc2hhYmxlIDogJ2EgSGFzaGFibGUudFxuXG4gIGluY2x1ZGUgSW52YXJpYW50LlMyIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnNfZ2VuZXJpY1xuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRcbiAgICB3aXRoIHR5cGUgJ2Ega2V5ID0gJ2FcbiAgICB3aXRoIHR5cGUgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnMgOj1cbiAgICAgICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zX3dpdGhvdXRfZmlyc3RfY2xhc3NfbW9kdWxlXG5cbiAgaW5jbHVkZSBBY2Nlc3NvcnMgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdCB3aXRoIHR5cGUgJ2Ega2V5IDo9ICdhIGtleVxuICBpbmNsdWRlIE11bHRpIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHQgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBrZXlcbmVuZFxuXG5tb2R1bGUgdHlwZSBGb3JfZGVyaXZpbmcgPSBzaWdcbiAgdHlwZSAoJ2ssICd2KSB0XG5cbiAgbW9kdWxlIHR5cGUgU2V4cF9vZl9tID0gc2lnXG4gICAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gICAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgICBbQEBAZW5kXVxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIG9mX3NleHBdXG5cbiAgICB2YWwgdF9vZl9zZXhwIDogU2V4cGxpYjAuU2V4cC50IC0+IHRcblxuICAgIFtAQEBlbmRdXG5cbiAgICBpbmNsdWRlIEtleS5TIHdpdGggdHlwZSB0IDo9IHRcbiAgZW5kXG5cbiAgbW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfZ3JhbW1hcl1cblxuICAgIHZhbCB0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcblxuICAgIFtAQEBlbmRdXG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIEVxdWFsX20gPSBzaWcgZW5kXG5cbiAgdmFsIHNleHBfb2ZfbV9fdFxuICAgIDogIChtb2R1bGUgU2V4cF9vZl9tIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gKCd2IC0+IFNleHAudClcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgLT4gU2V4cC50XG5cbiAgdmFsIG1fX3Rfb2Zfc2V4cFxuICAgIDogIChtb2R1bGUgTV9vZl9zZXhwIHdpdGggdHlwZSB0ID0gJ2spXG4gICAgLT4gKFNleHAudCAtPiAndilcbiAgICAtPiBTZXhwLnRcbiAgICAtPiAoJ2ssICd2KSB0XG5cbiAgdmFsIG1fX3Rfc2V4cF9ncmFtbWFyXG4gICAgOiAgKG1vZHVsZSBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9ICdrKVxuICAgIC0+ICd2IFNleHBsaWIwLlNleHBfZ3JhbW1hci50XG4gICAgLT4gKCdrLCAndikgdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIHZhbCBlcXVhbF9tX190XG4gICAgOiAgKG1vZHVsZSBFcXVhbF9tKVxuICAgIC0+ICgndiAtPiAndiAtPiBib29sKVxuICAgIC0+ICgnaywgJ3YpIHRcbiAgICAtPiAoJ2ssICd2KSB0XG4gICAgLT4gYm9vbFxuZW5kXG5cbm1vZHVsZSB0eXBlIEhhc2h0YmwgPSBzaWdcbiAgKCoqIEEgaGFzaCB0YWJsZSBpcyBhIG11dGFibGUgZGF0YSBzdHJ1Y3R1cmUgaW1wbGVtZW50aW5nIGEgbWFwIGJldHdlZW4ga2V5cyBhbmQgdmFsdWVzLlxuICAgICAgSXQgc3VwcG9ydHMgY29uc3RhbnQtdGltZSBsb29rdXAgYW5kIGluLXBsYWNlIG1vZGlmaWNhdGlvbi5cblxuICAgICAgezEgVXNhZ2V9XG5cbiAgICAgIEFzIGEgc2ltcGxlIGV4YW1wbGUsIHdlJ2xsIGNyZWF0ZSBhIGhhc2ggdGFibGUgd2l0aCBzdHJpbmcga2V5cyB1c2luZyB0aGVcbiAgICAgIHt7IWNyZWF0ZX1bY3JlYXRlXX0gY29uc3RydWN0b3IsIHdoaWNoIGV4cGVjdHMgYSBtb2R1bGUgZGVmaW5pbmcgdGhlIGtleSdzIHR5cGU6XG5cbiAgICAgIHtbXG4gICAgICAgIGxldCBoID0gSGFzaHRibC5jcmVhdGUgKG1vZHVsZSBTdHJpbmcpOztcbiAgICAgICAgdmFsIGggOiAoc3RyaW5nLCAnX2EpIEhhc2h0YmwudCA9IDxhYnN0cj5cbiAgICAgIF19XG5cbiAgICAgIFdlIGNhbiBzZXQgdGhlIHZhbHVlcyBvZiBpbmRpdmlkdWFsIGtleXMgd2l0aCB7eyFzZXR9W3NldF19LiBJZiB0aGUga2V5IGFscmVhZHkgaGFzXG4gICAgICBhIHZhbHVlLCBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuLlxuXG4gICAgICB7dlxuICAgICAgSGFzaHRibC5zZXQgaCB+a2V5OlwiZm9vXCIgfmRhdGE6NTs7XG4gICAgICAtIDogdW5pdCA9ICgpXG5cbiAgICAgIEhhc2h0Ymwuc2V0IGggfmtleTpcImZvb1wiIH5kYXRhOjY7O1xuICAgICAgLSA6IHVuaXQgPSAoKVxuXG4gICAgICBIYXNodGJsLnNldCBoIH5rZXk6XCJiYXJcIiB+ZGF0YTo2OztcbiAgICAgIC0gOiB1bml0ID0gKClcbiAgICAgIHZ9XG5cbiAgICAgIFdlIGNhbiBhY2Nlc3MgdmFsdWVzIGJ5IGtleSwgb3IgZHVtcCBhbGwgb2YgdGhlIGhhc2ggdGFibGUncyBkYXRhOlxuXG4gICAgICB7dlxuICAgICAgSGFzaHRibC5maW5kIGggXCJmb29cIjs7XG4gICAgICAtIDogaW50IG9wdGlvbiA9IFNvbWUgNlxuXG4gICAgICBIYXNodGJsLmZpbmRfZXhuIGggXCJmb29cIjs7XG4gICAgICAtIDogaW50ID0gNlxuXG4gICAgICBIYXNodGJsLnRvX2FsaXN0IGg7O1xuICAgICAgLSA6IChzdHJpbmcgKiBpbnQpIGxpc3QgPSBbKFwiZm9vXCIsIDYpOyAoXCJiYXJcIiwgNildXG4gICAgICB2fVxuXG4gICAgICB7eyFjaGFuZ2V9W2NoYW5nZV19IGxldHMgdXMgY2hhbmdlIGEga2V5J3MgdmFsdWUgYnkgYXBwbHlpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uOlxuXG4gICAgICB7dlxuICAgICAgSGFzaHRibC5jaGFuZ2UgaCBcImZvb1wiIChmdW4geCAtPlxuICAgICAgIG1hdGNoIHggd2l0aFxuICAgICAgIHwgU29tZSB4IC0+IFNvbWUgKHggKiAyKVxuICAgICAgIHwgTm9uZSAtPiBOb25lXG4gICAgICApOztcbiAgICAgIC0gOiB1bml0ID0gKClcblxuICAgICAgSGFzaHRibC50b19hbGlzdCBoOztcbiAgICAgIC0gOiAoc3RyaW5nICogaW50KSBsaXN0ID0gWyhcImZvb1wiLCAxMik7IChcImJhclwiLCA2KV1cbiAgICAgIHZ9XG5cblxuICAgICAgV2UgY2FuIHVzZSB7eyFtZXJnZX1bbWVyZ2VdfSB0byBtZXJnZSB0d28gaGFzaHRhYmxlcyB3aXRoIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXJcbiAgICAgIGhvdyB3ZSBjaG9vc2UgdmFsdWVzIHdoZW4gYSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgZmlyc3QgKFwibGVmdFwiKSBoYXNodGFibGUsIHRoZVxuICAgICAgc2Vjb25kIChcInJpZ2h0XCIpLCBvciBib3RoLiBIZXJlLCB3ZSdsbCBjb25zIHRoZSB2YWx1ZXMgd2hlbiBib3RoIGhhc2h0YWJsZXMgaGF2ZSBhXG4gICAgICBrZXk6XG5cbiAgICAgIHt2XG4gICAgICBsZXQgaDEgPSBIYXNodGJsLm9mX2FsaXN0X2V4biAobW9kdWxlIEludCkgWygxLCA1KTsgKDIsIDMyMzIpXSBpblxuICAgICAgbGV0IGgyID0gSGFzaHRibC5vZl9hbGlzdF9leG4gKG1vZHVsZSBJbnQpIFsoMSwgMyldIGluXG4gICAgICBIYXNodGJsLm1lcmdlIGgxIGgyIH5mOihmdW4gfmtleTpfIC0+IGZ1bmN0aW9uXG4gICAgICAgIHwgYExlZnQgeCAtPiBTb21lIChgTGVmdCB4KVxuICAgICAgICB8IGBSaWdodCB4IC0+IFNvbWUgKGBSaWdodCB4KVxuICAgICAgICB8IGBCb3RoICh4LCB5KSAtPiBpZiB4PXkgdGhlbiBOb25lIGVsc2UgU29tZSAoYEJvdGggKHgseSkpXG4gICAgICApIHw+IEhhc2h0YmwudG9fYWxpc3Q7O1xuICAgICAgLSA6IChpbnQgKiBbPiBgQm90aCBvZiBpbnQgKiBpbnQgfCBgTGVmdCBvZiBpbnQgfCBgUmlnaHQgb2YgaW50IF0pIGxpc3QgPVxuICAgICAgWygyLCBgTGVmdCAzMjMyKTsgKDEsIGBCb3RoICg1LCAzKSldXG4gICAgICB2fVxuXG4gICAgICB7MSBJbnRlcmZhY2V9ICopXG5cbiAgaW5jbHVkZSBTX3dpdGhvdXRfc3VibW9kdWxlcyAoKiogQGlubGluZSAqKVxuXG4gIG1vZHVsZSB0eXBlIEFjY2Vzc29ycyA9IEFjY2Vzc29yc1xuICBtb2R1bGUgdHlwZSBDcmVhdG9ycyA9IENyZWF0b3JzXG4gIG1vZHVsZSB0eXBlIE11bHRpID0gTXVsdGlcbiAgbW9kdWxlIHR5cGUgU19wb2x5ID0gU19wb2x5XG4gIG1vZHVsZSB0eXBlIFNfd2l0aG91dF9zdWJtb2R1bGVzID0gU193aXRob3V0X3N1Ym1vZHVsZXNcbiAgbW9kdWxlIHR5cGUgRm9yX2Rlcml2aW5nID0gRm9yX2Rlcml2aW5nXG5cbiAgbW9kdWxlIEtleSA9IEtleVxuICBtb2R1bGUgTWVyZ2VfaW50b19hY3Rpb24gPSBNZXJnZV9pbnRvX2FjdGlvblxuXG4gIHR5cGUgbm9ucmVjICgna2V5LCAnZGF0YSwgJ3opIGNyZWF0ZV9vcHRpb25zID0gKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNcblxuICBtb2R1bGUgQ3JlYXRvcnMgKEtleSA6IHNpZ1xuICAgICAgdHlwZSAnYSB0XG5cbiAgICAgIHZhbCBoYXNoYWJsZSA6ICdhIHQgSGFzaGFibGUudFxuICAgIGVuZCkgOiBzaWdcbiAgICB0eXBlICgnYSwgJ2IpIHRfID0gKCdhIEtleS50LCAnYikgdFxuXG4gICAgdmFsIHRfb2Zfc2V4cCA6IChTZXhwLnQgLT4gJ2EgS2V5LnQpIC0+IChTZXhwLnQgLT4gJ2IpIC0+IFNleHAudCAtPiAoJ2EsICdiKSB0X1xuXG4gICAgaW5jbHVkZVxuICAgICAgQ3JlYXRvcnNfZ2VuZXJpY1xuICAgICAgd2l0aCB0eXBlICgnYSwgJ2IpIHQgOj0gKCdhLCAnYikgdF9cbiAgICAgIHdpdGggdHlwZSAnYSBrZXkgOj0gJ2EgS2V5LnRcbiAgICAgIHdpdGggdHlwZSAoJ2tleSwgJ2RhdGEsICdhKSBjcmVhdGVfb3B0aW9ucyA6PVxuICAgICAgICAoJ2tleSwgJ2RhdGEsICdhKSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuICBlbmRcblxuICBtb2R1bGUgUG9seSA6IFNfcG9seSB3aXRoIHR5cGUgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcblxuICAoKiogW01dIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBPQ2FtbCBhcHBsaWNhdGl2ZSBmdW5jdG9yIHR5cGVzOlxuXG4gICAgICB7W1xuICAgICAgICB0eXBlIHN0cmluZ190b19pbnRfdGFibGUgPSBpbnQgSGFzaHRibC5NKFN0cmluZykudFxuICAgICAgXX1cblxuICAgICAgd2hpY2ggc3RhbmRzIGZvcjpcblxuICAgICAge1tcbiAgICAgICAgdHlwZSBzdHJpbmdfdG9faW50X3RhYmxlID0gKFN0cmluZy50LCBpbnQpIEhhc2h0YmwudFxuICAgICAgXX1cblxuICAgICAgVGhlIHBvaW50IGlzIHRoYXQgW2ludCBIYXNodGJsLk0oU3RyaW5nKS50XSBzdXBwb3J0cyBkZXJpdmluZywgd2hlcmVhcyB0aGUgc2Vjb25kXG4gICAgICBzeW50YXggZG9lc24ndCAoYmVjYXVzZSBbdF9vZl9zZXhwXSBkb2Vzbid0IGtub3cgd2hhdCBjb21wYXJpc29uL2hhc2ggZnVuY3Rpb24gdG9cbiAgICAgIHVzZSkuICopXG4gIG1vZHVsZSBNIChLIDogVC5UKSA6IHNpZ1xuICAgIHR5cGUgbm9ucmVjICd2IHQgPSAoSy50LCAndikgdFxuICBlbmRcblxuICBpbmNsdWRlIEZvcl9kZXJpdmluZyB3aXRoIHR5cGUgKCdhLCAnYikgdCA6PSAoJ2EsICdiKSB0XG5cbiAgKCoqLyoqKVxuXG4gICgqXyBTZWUgdGhlIEphbmUgU3RyZWV0IFN0eWxlIEd1aWRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBbUHJpdmF0ZV0gc3VibW9kdWxlczpcblxuICAgIGh0dHBzOi8vb3BlbnNvdXJjZS5qYW5lc3RyZWV0LmNvbS9zdGFuZGFyZHMvI3ByaXZhdGUtc3VibW9kdWxlcyAqKVxuICBtb2R1bGUgUHJpdmF0ZSA6IHNpZ1xuICAgIG1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBDcmVhdG9yc19nZW5lcmljXG5cbiAgICB0eXBlIG5vbnJlYyAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZSA9XG4gICAgICAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZVxuXG4gICAgdmFsIGhhc2hhYmxlIDogKCdrZXksIF8pIHQgLT4gJ2tleSBIYXNoYWJsZS50XG4gIGVuZFxuZW5kXG4iLCIoKiBBIGZldyBzbWFsbCB0aGluZ3MgY29waWVkIGZyb20gb3RoZXIgcGFydHMgb2YgQmFzZSBiZWNhdXNlIHRoZXkgZGVwZW5kIG9uIHVzLCBzbyB3ZVxuICAgY2FuJ3QgdXNlIHRoZW0uICopXG5cbm9wZW4hIEltcG9ydFxuXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxubW9kdWxlIEludCA9IHN0cnVjdFxuICB0eXBlIHQgPSBpbnRcblxuICBsZXQgbWF4ICh4IDogdCkgeSA9IGlmIHggPiB5IHRoZW4geCBlbHNlIHlcbmVuZFxuXG4oKiBJdHMgaW1wb3J0YW50IHRoYXQgRW1wdHkgaGF2ZSBubyBhcmdzLiBJdCdzIHRlbXB0aW5nIHRvIG1ha2UgdGhpcyB0eXBlIGEgcmVjb3JkXG4gICAoZS5nLiB0byBob2xkIHRoZSBjb21wYXJlIGZ1bmN0aW9uKSwgYnV0IGEgbG90IG9mIG1lbW9yeSBpcyBzYXZlZCBieSBFbXB0eSBiZWluZyBhblxuICAgaW1tZWRpYXRlLCBzaW5jZSBhbGwgdW51c2VkIGJ1Y2tldHMgaW4gdGhlIGhhc2h0YmwgZG9uJ3QgdXNlIGFueSBtZW1vcnkgKGJlc2lkZXMgdGhlXG4gICBhcnJheSBjZWxsKSAqKVxudHlwZSAoJ2ssICd2KSB0ID1cbiAgfCBFbXB0eVxuICB8IE5vZGUgb2ZcbiAgICAgIHsgbXV0YWJsZSBsZWZ0IDogKCdrLCAndikgdFxuICAgICAgOyBrZXkgOiAna1xuICAgICAgOyBtdXRhYmxlIHZhbHVlIDogJ3ZcbiAgICAgIDsgbXV0YWJsZSBoZWlnaHQgOiBpbnRcbiAgICAgIDsgbXV0YWJsZSByaWdodCA6ICgnaywgJ3YpIHRcbiAgICAgIH1cbiAgfCBMZWFmIG9mXG4gICAgICB7IGtleSA6ICdrXG4gICAgICA7IG11dGFibGUgdmFsdWUgOiAndlxuICAgICAgfVxuXG5sZXQgZW1wdHkgPSBFbXB0eVxuXG5sZXQgaXNfZW1wdHkgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IHRydWVcbiAgfCBMZWFmIF8gfCBOb2RlIF8gLT4gZmFsc2Vcbjs7XG5cbmxldCBoZWlnaHQgPSBmdW5jdGlvblxuICB8IEVtcHR5IC0+IDBcbiAgfCBMZWFmIF8gLT4gMVxuICB8IE5vZGUgeyBsZWZ0ID0gXzsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQ7IHJpZ2h0ID0gXyB9IC0+IGhlaWdodFxuOztcblxubGV0IGludmFyaWFudCBjb21wYXJlID1cbiAgbGV0IGxlZ2FsX2xlZnRfa2V5IGtleSA9IGZ1bmN0aW9uXG4gICAgfCBFbXB0eSAtPiAoKVxuICAgIHwgTGVhZiB7IGtleSA9IGxlZnRfa2V5OyB2YWx1ZSA9IF8gfVxuICAgIHwgTm9kZSB7IGxlZnQgPSBfOyBrZXkgPSBsZWZ0X2tleTsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPlxuICAgICAgYXNzZXJ0IChjb21wYXJlIGxlZnRfa2V5IGtleSA8IDApXG4gIGluXG4gIGxldCBsZWdhbF9yaWdodF9rZXkga2V5ID0gZnVuY3Rpb25cbiAgICB8IEVtcHR5IC0+ICgpXG4gICAgfCBMZWFmIHsga2V5ID0gcmlnaHRfa2V5OyB2YWx1ZSA9IF8gfVxuICAgIHwgTm9kZSB7IGxlZnQgPSBfOyBrZXkgPSByaWdodF9rZXk7IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gLT5cbiAgICAgIGFzc2VydCAoY29tcGFyZSByaWdodF9rZXkga2V5ID4gMClcbiAgaW5cbiAgbGV0IHJlYyBpbnYgPSBmdW5jdGlvblxuICAgIHwgRW1wdHkgfCBMZWFmIF8gLT4gKClcbiAgICB8IE5vZGUgeyBsZWZ0OyBrZXkgPSBrOyB2YWx1ZSA9IF87IGhlaWdodCA9IGg7IHJpZ2h0IH0gLT5cbiAgICAgIGxldCBobCwgaHIgPSBoZWlnaHQgbGVmdCwgaGVpZ2h0IHJpZ2h0IGluXG4gICAgICBpbnYgbGVmdDtcbiAgICAgIGludiByaWdodDtcbiAgICAgIGxlZ2FsX2xlZnRfa2V5IGsgbGVmdDtcbiAgICAgIGxlZ2FsX3JpZ2h0X2tleSBrIHJpZ2h0O1xuICAgICAgYXNzZXJ0IChoID0gSW50Lm1heCBobCBociArIDEpO1xuICAgICAgYXNzZXJ0IChhYnMgKGhsIC0gaHIpIDw9IDIpXG4gIGluXG4gIGludlxuOztcblxubGV0IGludmFyaWFudCB0IH5jb21wYXJlID0gaW52YXJpYW50IGNvbXBhcmUgdFxuXG4oKiBJbiB0aGUgZm9sbG93aW5nIGNvbW1lbnRzLFxuICAgJ3QgaXMgYmFsYW5jZWQnIG1lYW5zIHRoYXQgJ2ludmFyaWFudCB0JyBkb2VzIG5vdFxuICAgcmFpc2UgYW4gZXhjZXB0aW9uLiAgVGhpcyBpbXBsaWVzIG9mIGNvdXJzZSB0aGF0IGVhY2ggbm9kZSdzIGhlaWdodCBmaWVsZCBpc1xuICAgY29ycmVjdC5cbiAgICd0IGlzIGJhbGFuY2VhYmxlJyBtZWFucyB0aGF0IGhlaWdodCBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZXMgb2YgdFxuICAgZGlmZmVyIGJ5IGF0IG1vc3QgMy4gKilcblxuKCogQHByZTogbGVmdCBhbmQgcmlnaHQgc3VidHJlZXMgaGF2ZSBjb3JyZWN0IGhlaWdodHNcbiAgIEBwb3N0OiBvdXRwdXQgaGFzIHRoZSBjb3JyZWN0IGhlaWdodCAqKVxubGV0IHVwZGF0ZV9oZWlnaHQgPSBmdW5jdGlvblxuICB8IE5vZGUgKHsgbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBvbGRfaGVpZ2h0OyByaWdodCB9IGFzIHgpIC0+XG4gICAgbGV0IG5ld19oZWlnaHQgPSBJbnQubWF4IChoZWlnaHQgbGVmdCkgKGhlaWdodCByaWdodCkgKyAxIGluXG4gICAgaWYgbmV3X2hlaWdodCA8PiBvbGRfaGVpZ2h0IHRoZW4geC5oZWlnaHQgPC0gbmV3X2hlaWdodFxuICB8IEVtcHR5IHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZVxuOztcblxuKCogQHByZTogbGVmdCBhbmQgcmlnaHQgc3VidHJlZXMgYXJlIGJhbGFuY2VkXG4gICBAcHJlOiB0cmVlIGlzIGJhbGFuY2VhYmxlXG4gICBAcG9zdDogb3V0cHV0IGlzIGJhbGFuY2VkIChpbiBwYXJ0aWN1bGFyLCBoZWlnaHQgaXMgY29ycmVjdCkgKilcbmxldCBiYWxhbmNlIHRyZWUgPVxuICBtYXRjaCB0cmVlIHdpdGhcbiAgfCBFbXB0eSB8IExlYWYgXyAtPiB0cmVlXG4gIHwgTm9kZSAoeyBsZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0IH0gYXMgcm9vdF9ub2RlKSAtPlxuICAgIGxldCBobCA9IGhlaWdodCBsZWZ0XG4gICAgYW5kIGhyID0gaGVpZ2h0IHJpZ2h0IGluXG4gICAgKCogKyAyIGlzIGNyaXRpY2FsbHkgaW1wb3J0YW50LCBsb3dlcmluZyBpdCB0byAxIHdpbGwgYnJlYWsgdGhlIExlYWZcbiAgICAgICBhc3N1bXB0aW9ucyBpbiB0aGUgY29kZSBiZWxvdywgYW5kIHdpbGwgZm9yY2UgdXMgdG8gcHJvbW90ZSBsZWFmIG5vZGVzIGluXG4gICAgICAgdGhlIGJhbGFuY2Ugcm91dGluZS4gSXQncyBhbHNvIGZhc3Rlciwgc2luY2UgaXQgd2lsbCBiYWxhbmNlIGxlc3Mgb2Z0ZW4uXG4gICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSBpcyBkZWxpY2F0ZS4gIFRoZSB1cGRhdGVfaGVpZ2h0IGNhbGxzIG11c3RcbiAgICAgICBvY2N1ciBpbiB0aGUgY29ycmVjdCBvcmRlciwgc2luY2UgdXBkYXRlX2hlaWdodCBhc3N1bWVzIGl0cyBjaGlsZHJlbiBoYXZlXG4gICAgICAgdGhlIGNvcnJlY3QgaGVpZ2h0cy4gICopXG4gICAgaWYgaGwgPiBociArIDJcbiAgICB0aGVuIChcbiAgICAgIG1hdGNoIGxlZnQgd2l0aFxuICAgICAgKCogSXQgY2Fubm90IGJlIGEgbGVhZiwgYmVjYXVzZSBldmVuIGlmIHJpZ2h0IGlzIGVtcHR5LCBhIGxlYWZcbiAgICAgICAgIGlzIG9ubHkgaGVpZ2h0IDEgKilcbiAgICAgIHwgRW1wdHkgfCBMZWFmIF8gLT4gYXNzZXJ0IGZhbHNlXG4gICAgICB8IE5vZGVcbiAgICAgICAgICAoeyBsZWZ0ID0gbGVmdF9ub2RlX2xlZnRcbiAgICAgICAgICAgOyBrZXkgPSBfXG4gICAgICAgICAgIDsgdmFsdWUgPSBfXG4gICAgICAgICAgIDsgaGVpZ2h0ID0gX1xuICAgICAgICAgICA7IHJpZ2h0ID0gbGVmdF9ub2RlX3JpZ2h0XG4gICAgICAgICAgIH0gYXMgbGVmdF9ub2RlKSAtPlxuICAgICAgICBpZiBoZWlnaHQgbGVmdF9ub2RlX2xlZnQgPj0gaGVpZ2h0IGxlZnRfbm9kZV9yaWdodFxuICAgICAgICB0aGVuIChcbiAgICAgICAgICByb290X25vZGUubGVmdCA8LSBsZWZ0X25vZGVfcmlnaHQ7XG4gICAgICAgICAgbGVmdF9ub2RlLnJpZ2h0IDwtIHRyZWU7XG4gICAgICAgICAgdXBkYXRlX2hlaWdodCB0cmVlO1xuICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgbGVmdDtcbiAgICAgICAgICBsZWZ0KVxuICAgICAgICBlbHNlIChcbiAgICAgICAgICAoKiBpZiByaWdodCBpcyBhIGxlYWYsIHRoZW4gbGVmdCBtdXN0IGJlIGVtcHR5LiBUaGF0IG1lYW5zXG4gICAgICAgICAgICAgaGVpZ2h0IGlzIDIuIEV2ZW4gaWYgaHIgaXMgZW1wdHkgd2Ugc3RpbGwgY2FuJ3QgZ2V0IGhlcmUuICopXG4gICAgICAgICAgbWF0Y2ggbGVmdF9ub2RlX3JpZ2h0IHdpdGhcbiAgICAgICAgICB8IEVtcHR5IHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgTm9kZVxuICAgICAgICAgICAgICAoeyBsZWZ0ID0gbHJfbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IGxyX3JpZ2h0IH0gYXNcbiAgICAgICAgICAgICAgIGxyX25vZGUpIC0+XG4gICAgICAgICAgICBsZWZ0X25vZGUucmlnaHQgPC0gbHJfbGVmdDtcbiAgICAgICAgICAgIHJvb3Rfbm9kZS5sZWZ0IDwtIGxyX3JpZ2h0O1xuICAgICAgICAgICAgbHJfbm9kZS5yaWdodCA8LSB0cmVlO1xuICAgICAgICAgICAgbHJfbm9kZS5sZWZ0IDwtIGxlZnQ7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IGxlZnQ7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHRyZWU7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IGxlZnRfbm9kZV9yaWdodDtcbiAgICAgICAgICAgIGxlZnRfbm9kZV9yaWdodCkpXG4gICAgZWxzZSBpZiBociA+IGhsICsgMlxuICAgIHRoZW4gKFxuICAgICAgKCogc2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB3aHkgcmlnaHQgY2Fubm90IGJlIGEgbGVhZiAqKVxuICAgICAgbWF0Y2ggcmlnaHQgd2l0aFxuICAgICAgfCBFbXB0eSB8IExlYWYgXyAtPiBhc3NlcnQgZmFsc2VcbiAgICAgIHwgTm9kZVxuICAgICAgICAgICh7IGxlZnQgPSByaWdodF9ub2RlX2xlZnRcbiAgICAgICAgICAgOyBrZXkgPSBfXG4gICAgICAgICAgIDsgdmFsdWUgPSBfXG4gICAgICAgICAgIDsgaGVpZ2h0ID0gX1xuICAgICAgICAgICA7IHJpZ2h0ID0gcmlnaHRfbm9kZV9yaWdodFxuICAgICAgICAgICB9IGFzIHJpZ2h0X25vZGUpIC0+XG4gICAgICAgIGlmIGhlaWdodCByaWdodF9ub2RlX3JpZ2h0ID49IGhlaWdodCByaWdodF9ub2RlX2xlZnRcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgcm9vdF9ub2RlLnJpZ2h0IDwtIHJpZ2h0X25vZGVfbGVmdDtcbiAgICAgICAgICByaWdodF9ub2RlLmxlZnQgPC0gdHJlZTtcbiAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHRyZWU7XG4gICAgICAgICAgdXBkYXRlX2hlaWdodCByaWdodDtcbiAgICAgICAgICByaWdodClcbiAgICAgICAgZWxzZSAoXG4gICAgICAgICAgKCogc2VlIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBjYW5ub3QgYmUgYSBsZWFmICopXG4gICAgICAgICAgbWF0Y2ggcmlnaHRfbm9kZV9sZWZ0IHdpdGhcbiAgICAgICAgICB8IEVtcHR5IHwgTGVhZiBfIC0+IGFzc2VydCBmYWxzZVxuICAgICAgICAgIHwgTm9kZVxuICAgICAgICAgICAgICAoeyBsZWZ0ID0gcmxfbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IHJsX3JpZ2h0IH0gYXNcbiAgICAgICAgICAgICAgIHJsX25vZGUpIC0+XG4gICAgICAgICAgICByaWdodF9ub2RlLmxlZnQgPC0gcmxfcmlnaHQ7XG4gICAgICAgICAgICByb290X25vZGUucmlnaHQgPC0gcmxfbGVmdDtcbiAgICAgICAgICAgIHJsX25vZGUubGVmdCA8LSB0cmVlO1xuICAgICAgICAgICAgcmxfbm9kZS5yaWdodCA8LSByaWdodDtcbiAgICAgICAgICAgIHVwZGF0ZV9oZWlnaHQgcmlnaHQ7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHRyZWU7XG4gICAgICAgICAgICB1cGRhdGVfaGVpZ2h0IHJpZ2h0X25vZGVfbGVmdDtcbiAgICAgICAgICAgIHJpZ2h0X25vZGVfbGVmdCkpXG4gICAgZWxzZSAoXG4gICAgICB1cGRhdGVfaGVpZ2h0IHRyZWU7XG4gICAgICB0cmVlKVxuOztcblxuKCogQHByZTogdHJlZSBpcyBiYWxhbmNlYWJsZVxuICAgQHByZTogYWJzIChoZWlnaHQgKHJpZ2h0IG5vZGUpIC0gaGVpZ2h0IChiYWxhbmNlIHRyZWUpKSA8PSAzXG4gICBAcG9zdDogcmVzdWx0IGlzIGJhbGFuY2VhYmxlICopXG5cbigqIEBwcmU6IHRyZWUgaXMgYmFsYW5jZWFibGVcbiAgIEBwcmU6IGFicyAoaGVpZ2h0IChyaWdodCBub2RlKSAtIGhlaWdodCAoYmFsYW5jZSB0cmVlKSkgPD0gM1xuICAgQHBvc3Q6IHJlc3VsdCBpcyBiYWxhbmNlYWJsZSAqKVxubGV0IHNldF9sZWZ0IG5vZGUgdHJlZSA9XG4gIGxldCB0cmVlID0gYmFsYW5jZSB0cmVlIGluXG4gIG1hdGNoIG5vZGUgd2l0aFxuICB8IE5vZGUgKHsgbGVmdDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSBhcyByKSAtPlxuICAgIGlmIHBoeXNfZXF1YWwgbGVmdCB0cmVlIHRoZW4gKCkgZWxzZSByLmxlZnQgPC0gdHJlZTtcbiAgICB1cGRhdGVfaGVpZ2h0IG5vZGVcbiAgfCBfIC0+IGFzc2VydCBmYWxzZVxuOztcblxuKCogQHByZTogdHJlZSBpcyBiYWxhbmNlYWJsZVxuICAgQHByZTogYWJzIChoZWlnaHQgKGxlZnQgbm9kZSkgLSBoZWlnaHQgKGJhbGFuY2UgdHJlZSkpIDw9IDNcbiAgIEBwb3N0OiByZXN1bHQgaXMgYmFsYW5jZWFibGUgKilcbmxldCBzZXRfcmlnaHQgbm9kZSB0cmVlID1cbiAgbGV0IHRyZWUgPSBiYWxhbmNlIHRyZWUgaW5cbiAgbWF0Y2ggbm9kZSB3aXRoXG4gIHwgTm9kZSAoeyBsZWZ0ID0gXzsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCB9IGFzIHIpIC0+XG4gICAgaWYgcGh5c19lcXVhbCByaWdodCB0cmVlIHRoZW4gKCkgZWxzZSByLnJpZ2h0IDwtIHRyZWU7XG4gICAgdXBkYXRlX2hlaWdodCBub2RlXG4gIHwgXyAtPiBhc3NlcnQgZmFsc2Vcbjs7XG5cbigqIEBwcmU6IHQgaXMgYmFsYW5jZWQuXG4gICBAcG9zdDogcmVzdWx0IGlzIGJhbGFuY2VkLCB3aXRoIG5ldyBub2RlIGluc2VydGVkXG4gICBAcG9zdDogIWFkZGVkID0gdHJ1ZSBpZmYgdGhlIHNoYXBlIG9mIHRoZSBpbnB1dCB0cmVlIGNoYW5nZWQuICAqKVxubGV0IGFkZCA9XG4gIGxldCByZWMgYWRkIHQgcmVwbGFjZSBhZGRlZCBjb21wYXJlIGsgdiA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgYWRkZWQgOj0gdHJ1ZTtcbiAgICAgIExlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfVxuICAgIHwgTGVhZiAoeyBrZXkgPSBrJzsgdmFsdWUgPSBfIH0gYXMgcikgLT5cbiAgICAgIGxldCBjID0gY29tcGFyZSBrJyBrIGluXG4gICAgICAoKiBUaGlzIGNvbXBhcmUgaXMgcmV2ZXJzZWQgb24gcHVycG9zZSwgd2UgYXJlIHByZXRlbmRpbmdcbiAgICAgICAgIHRoYXQgdGhlIGxlYWYgd2FzIGp1c3QgaW5zZXJ0ZWQgaW5zdGVhZCBvZiB0aGUgb3RoZXIgd2F5XG4gICAgICAgICByb3VuZCwgdGhhdCB3YXkgd2Ugb25seSBhbGxvY2F0ZSBvbmUgbm9kZS4gKilcbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgYWRkZWQgOj0gZmFsc2U7XG4gICAgICAgIGlmIHJlcGxhY2UgdGhlbiByLnZhbHVlIDwtIHY7XG4gICAgICAgIHQpXG4gICAgICBlbHNlIChcbiAgICAgICAgYWRkZWQgOj0gdHJ1ZTtcbiAgICAgICAgaWYgYyA8IDBcbiAgICAgICAgdGhlbiBOb2RlIHsgbGVmdCA9IHQ7IGtleSA9IGs7IHZhbHVlID0gdjsgaGVpZ2h0ID0gMjsgcmlnaHQgPSBFbXB0eSB9XG4gICAgICAgIGVsc2UgTm9kZSB7IGxlZnQgPSBFbXB0eTsga2V5ID0gazsgdmFsdWUgPSB2OyBoZWlnaHQgPSAyOyByaWdodCA9IHQgfSlcbiAgICB8IE5vZGUgKHsgbGVmdDsga2V5ID0gayc7IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgfSBhcyByKSAtPlxuICAgICAgbGV0IGMgPSBjb21wYXJlIGsgaycgaW5cbiAgICAgIGlmIGMgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgYWRkZWQgOj0gZmFsc2U7XG4gICAgICAgIGlmIHJlcGxhY2UgdGhlbiByLnZhbHVlIDwtIHYpXG4gICAgICBlbHNlIGlmIGMgPCAwXG4gICAgICB0aGVuIHNldF9sZWZ0IHQgKGFkZCBsZWZ0IHJlcGxhY2UgYWRkZWQgY29tcGFyZSBrIHYpXG4gICAgICBlbHNlIHNldF9yaWdodCB0IChhZGQgcmlnaHQgcmVwbGFjZSBhZGRlZCBjb21wYXJlIGsgdik7XG4gICAgICB0XG4gIGluXG4gIGZ1biB0IH5yZXBsYWNlIH5jb21wYXJlIH5hZGRlZCB+a2V5IH5kYXRhIC0+XG4gICAgbGV0IHQgPSBhZGQgdCByZXBsYWNlIGFkZGVkIGNvbXBhcmUga2V5IGRhdGEgaW5cbiAgICBpZiAhYWRkZWQgdGhlbiBiYWxhbmNlIHQgZWxzZSB0XG47O1xuXG5sZXQgcmVjIGZpcnN0IHQgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiBOb25lXG4gIHwgTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9XG4gIHwgTm9kZSB7IGxlZnQgPSBFbXB0eTsga2V5ID0gazsgdmFsdWUgPSB2OyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPiBTb21lIChrLCB2KVxuICB8IE5vZGUgeyBsZWZ0ID0gbDsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSAtPiBmaXJzdCBsXG47O1xuXG5sZXQgcmVjIGxhc3QgdCA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+IE5vbmVcbiAgfCBMZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH1cbiAgfCBOb2RlIHsgbGVmdCA9IF87IGtleSA9IGs7IHZhbHVlID0gdjsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBFbXB0eSB9IC0+IFNvbWUgKGssIHYpXG4gIHwgTm9kZSB7IGxlZnQgPSBfOyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gciB9IC0+IGxhc3QgclxuOztcblxuXG5sZXRbQGlubGluZSBhbHdheXNdIHJlYyBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfmNvbXBhcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAga1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH5pZl9mb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICB+aWZfbm90X2ZvdW5kXG4gID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrIGFyZzEgYXJnMlxuICB8IExlYWYgeyBrZXkgPSBrJzsgdmFsdWUgPSB2IH0gLT5cbiAgICBpZiBjb21wYXJlIGsgaycgPSAwXG4gICAgdGhlbiBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5OmsnIH5kYXRhOnYgYXJnMSBhcmcyXG4gICAgZWxzZSBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGsgYXJnMSBhcmcyXG4gIHwgTm9kZSB7IGxlZnQ7IGtleSA9IGsnOyB2YWx1ZSA9IHY7IGhlaWdodCA9IF87IHJpZ2h0IH0gLT5cbiAgICBsZXQgYyA9IGNvbXBhcmUgayBrJyBpblxuICAgIGlmIGMgPSAwXG4gICAgdGhlbiBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5OmsnIH5kYXRhOnYgYXJnMSBhcmcyXG4gICAgZWxzZVxuICAgICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgICAoaWYgYyA8IDAgdGhlbiBsZWZ0IGVsc2UgcmlnaHQpXG4gICAgICAgIH5jb21wYXJlXG4gICAgICAgIGtcbiAgICAgICAgYXJnMVxuICAgICAgICBhcmcyXG4gICAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgICB+aWZfZm91bmRcbiAgICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwgPVxuICBsZXQgY2FsbF9pZl9mb3VuZCB+aWZfZm91bmQgfmtleTpfIH5kYXRhICgpICgpID0gaWZfZm91bmQgZGF0YSBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgKCkgKCkgPSBpZl9ub3RfZm91bmQga2V5IGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgKClcbiAgICAgICgpXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbCA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5IH5kYXRhICgpICgpID0gaWZfZm91bmQgfmtleSB+ZGF0YSBpblxuICBsZXQgY2FsbF9pZl9ub3RfZm91bmQgfmlmX25vdF9mb3VuZCBrZXkgKCkgKCkgPSBpZl9ub3RfZm91bmQga2V5IGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgKClcbiAgICAgICgpXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsMSA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5Ol8gfmRhdGEgYXJnICgpID0gaWZfZm91bmQgZGF0YSBhcmcgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5IGFyZyAoKSA9IGlmX25vdF9mb3VuZCBrZXkgYXJnIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgYVxuICAgICAgKClcbiAgICAgIH5jYWxsX2lmX2ZvdW5kXG4gICAgICB+Y2FsbF9pZl9ub3RfZm91bmRcbiAgICAgIH5pZl9mb3VuZFxuICAgICAgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IGZpbmRpX2FuZF9jYWxsMSA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5IH5kYXRhIGFyZyAoKSA9IGlmX2ZvdW5kIH5rZXkgfmRhdGEgYXJnIGluXG4gIGxldCBjYWxsX2lmX25vdF9mb3VuZCB+aWZfbm90X2ZvdW5kIGtleSBhcmcgKCkgPSBpZl9ub3RfZm91bmQga2V5IGFyZyBpblxuICBmdW4gdCB+Y29tcGFyZSBrIH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIC0+XG4gICAgZmluZGlfYW5kX2NhbGxfaW1wbFxuICAgICAgdFxuICAgICAgfmNvbXBhcmVcbiAgICAgIGtcbiAgICAgIGFcbiAgICAgICgpXG4gICAgICB+Y2FsbF9pZl9mb3VuZFxuICAgICAgfmNhbGxfaWZfbm90X2ZvdW5kXG4gICAgICB+aWZfZm91bmRcbiAgICAgIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kX2FuZF9jYWxsMiA9XG4gIGxldCBjYWxsX2lmX2ZvdW5kIH5pZl9mb3VuZCB+a2V5Ol8gfmRhdGEgYXJnMSBhcmcyID0gaWZfZm91bmQgZGF0YSBhcmcxIGFyZzIgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5IGFyZzEgYXJnMiA9IGlmX25vdF9mb3VuZCBrZXkgYXJnMSBhcmcyIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmEgfmIgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgYVxuICAgICAgYlxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwyID1cbiAgbGV0IGNhbGxfaWZfZm91bmQgfmlmX2ZvdW5kIH5rZXkgfmRhdGEgYXJnMSBhcmcyID0gaWZfZm91bmQgfmtleSB+ZGF0YSBhcmcxIGFyZzIgaW5cbiAgbGV0IGNhbGxfaWZfbm90X2ZvdW5kIH5pZl9ub3RfZm91bmQga2V5IGFyZzEgYXJnMiA9IGlmX25vdF9mb3VuZCBrZXkgYXJnMSBhcmcyIGluXG4gIGZ1biB0IH5jb21wYXJlIGsgfmEgfmIgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgLT5cbiAgICBmaW5kaV9hbmRfY2FsbF9pbXBsXG4gICAgICB0XG4gICAgICB+Y29tcGFyZVxuICAgICAga1xuICAgICAgYVxuICAgICAgYlxuICAgICAgfmNhbGxfaWZfZm91bmRcbiAgICAgIH5jYWxsX2lmX25vdF9mb3VuZFxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZCA9XG4gIGxldCBpZl9mb3VuZCB2ID0gU29tZSB2IGluXG4gIGxldCBpZl9ub3RfZm91bmQgXyA9IE5vbmUgaW5cbiAgZnVuIHQgfmNvbXBhcmUgayAtPiBmaW5kX2FuZF9jYWxsIHQgfmNvbXBhcmUgayB+aWZfZm91bmQgfmlmX25vdF9mb3VuZFxuOztcblxubGV0IG1lbSA9XG4gIGxldCBpZl9mb3VuZCBfID0gdHJ1ZSBpblxuICBsZXQgaWZfbm90X2ZvdW5kIF8gPSBmYWxzZSBpblxuICBmdW4gdCB+Y29tcGFyZSBrIC0+IGZpbmRfYW5kX2NhbGwgdCB+Y29tcGFyZSBrIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgcmVtb3ZlID1cbiAgbGV0IHJlYyBtaW5fZWx0IHRyZWUgPVxuICAgIG1hdGNoIHRyZWUgd2l0aFxuICAgIHwgRW1wdHkgLT4gRW1wdHlcbiAgICB8IExlYWYgXyAtPiB0cmVlXG4gICAgfCBOb2RlIHsgbGVmdCA9IEVtcHR5OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+IHRyZWVcbiAgICB8IE5vZGUgeyBsZWZ0OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0ID0gXyB9IC0+IG1pbl9lbHQgbGVmdFxuICBpblxuICBsZXQgcmVjIHJlbW92ZV9taW5fZWx0IHRyZWUgPVxuICAgIG1hdGNoIHRyZWUgd2l0aFxuICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgfCBMZWFmIF8gLT4gRW1wdHkgKCogVGhpcyBtdXN0IGJlIHRoZSByb290ICopXG4gICAgfCBOb2RlIHsgbGVmdCA9IEVtcHR5OyBrZXkgPSBfOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0IH0gLT4gcmlnaHRcbiAgICB8IE5vZGUgeyBsZWZ0ID0gTGVhZiBfOyBrZXkgPSBrOyB2YWx1ZSA9IHY7IGhlaWdodCA9IF87IHJpZ2h0ID0gRW1wdHkgfSAtPlxuICAgICAgTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9XG4gICAgfCBOb2RlIHsgbGVmdCA9IExlYWYgXzsga2V5ID0gXzsgdmFsdWUgPSBfOyBoZWlnaHQgPSBfOyByaWdodCA9IF8gfSBhcyBub2RlIC0+XG4gICAgICBzZXRfbGVmdCBub2RlIEVtcHR5O1xuICAgICAgdHJlZVxuICAgIHwgTm9kZSB7IGxlZnQ7IGtleSA9IF87IHZhbHVlID0gXzsgaGVpZ2h0ID0gXzsgcmlnaHQgPSBfIH0gYXMgbm9kZSAtPlxuICAgICAgc2V0X2xlZnQgbm9kZSAocmVtb3ZlX21pbl9lbHQgbGVmdCk7XG4gICAgICB0cmVlXG4gIGluXG4gIGxldCBtZXJnZSB0MSB0MiA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IEVtcHR5LCB0IC0+IHRcbiAgICB8IHQsIEVtcHR5IC0+IHRcbiAgICB8IF8sIF8gLT5cbiAgICAgIGxldCB0cmVlID0gbWluX2VsdCB0MiBpblxuICAgICAgKG1hdGNoIHRyZWUgd2l0aFxuICAgICAgIHwgRW1wdHkgLT4gYXNzZXJ0IGZhbHNlXG4gICAgICAgfCBMZWFmIHsga2V5ID0gazsgdmFsdWUgPSB2IH0gLT5cbiAgICAgICAgIGxldCB0MiA9IGJhbGFuY2UgKHJlbW92ZV9taW5fZWx0IHQyKSBpblxuICAgICAgICAgTm9kZVxuICAgICAgICAgICB7IGxlZnQgPSB0MVxuICAgICAgICAgICA7IGtleSA9IGtcbiAgICAgICAgICAgOyB2YWx1ZSA9IHZcbiAgICAgICAgICAgOyBoZWlnaHQgPSBJbnQubWF4IChoZWlnaHQgdDEpIChoZWlnaHQgdDIpICsgMVxuICAgICAgICAgICA7IHJpZ2h0ID0gdDJcbiAgICAgICAgICAgfVxuICAgICAgIHwgTm9kZSBfIGFzIG5vZGUgLT5cbiAgICAgICAgIHNldF9yaWdodCBub2RlIChyZW1vdmVfbWluX2VsdCB0Mik7XG4gICAgICAgICBzZXRfbGVmdCBub2RlIHQxO1xuICAgICAgICAgbm9kZSlcbiAgaW5cbiAgbGV0IHJlYyByZW1vdmUgdCByZW1vdmVkIGNvbXBhcmUgayA9XG4gICAgbWF0Y2ggdCB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgcmVtb3ZlZCA6PSBmYWxzZTtcbiAgICAgIEVtcHR5XG4gICAgfCBMZWFmIHsga2V5ID0gayc7IHZhbHVlID0gXyB9IC0+XG4gICAgICBpZiBjb21wYXJlIGsgaycgPSAwXG4gICAgICB0aGVuIChcbiAgICAgICAgcmVtb3ZlZCA6PSB0cnVlO1xuICAgICAgICBFbXB0eSlcbiAgICAgIGVsc2UgKFxuICAgICAgICByZW1vdmVkIDo9IGZhbHNlO1xuICAgICAgICB0KVxuICAgIHwgTm9kZSB7IGxlZnQ7IGtleSA9IGsnOyB2YWx1ZSA9IF87IGhlaWdodCA9IF87IHJpZ2h0IH0gLT5cbiAgICAgIGxldCBjID0gY29tcGFyZSBrIGsnIGluXG4gICAgICBpZiBjID0gMFxuICAgICAgdGhlbiAoXG4gICAgICAgIHJlbW92ZWQgOj0gdHJ1ZTtcbiAgICAgICAgbWVyZ2UgbGVmdCByaWdodClcbiAgICAgIGVsc2UgaWYgYyA8IDBcbiAgICAgIHRoZW4gKFxuICAgICAgICBzZXRfbGVmdCB0IChyZW1vdmUgbGVmdCByZW1vdmVkIGNvbXBhcmUgayk7XG4gICAgICAgIHQpXG4gICAgICBlbHNlIChcbiAgICAgICAgc2V0X3JpZ2h0IHQgKHJlbW92ZSByaWdodCByZW1vdmVkIGNvbXBhcmUgayk7XG4gICAgICAgIHQpXG4gIGluXG4gIGZ1biB0IH5yZW1vdmVkIH5jb21wYXJlIGsgLT4gYmFsYW5jZSAocmVtb3ZlIHQgcmVtb3ZlZCBjb21wYXJlIGspXG47O1xuXG5sZXQgcmVjIGZvbGQgdCB+aW5pdCB+ZiA9XG4gIG1hdGNoIHQgd2l0aFxuICB8IEVtcHR5IC0+IGluaXRcbiAgfCBMZWFmIHsga2V5OyB2YWx1ZSA9IGRhdGEgfSAtPiBmIH5rZXkgfmRhdGEgaW5pdFxuICB8IE5vZGVcbiAgICAgIHsgbGVmdCA9IExlYWYgeyBrZXkgPSBsa2V5OyB2YWx1ZSA9IGxkYXRhIH1cbiAgICAgIDsga2V5XG4gICAgICA7IHZhbHVlID0gZGF0YVxuICAgICAgOyBoZWlnaHQgPSBfXG4gICAgICA7IHJpZ2h0ID0gTGVhZiB7IGtleSA9IHJrZXk7IHZhbHVlID0gcmRhdGEgfVxuICAgICAgfSAtPiBmIH5rZXk6cmtleSB+ZGF0YTpyZGF0YSAoZiB+a2V5IH5kYXRhIChmIH5rZXk6bGtleSB+ZGF0YTpsZGF0YSBpbml0KSlcbiAgfCBOb2RlXG4gICAgICB7IGxlZnQgPSBMZWFmIHsga2V5ID0gbGtleTsgdmFsdWUgPSBsZGF0YSB9XG4gICAgICA7IGtleVxuICAgICAgOyB2YWx1ZSA9IGRhdGFcbiAgICAgIDsgaGVpZ2h0ID0gX1xuICAgICAgOyByaWdodCA9IEVtcHR5XG4gICAgICB9IC0+IGYgfmtleSB+ZGF0YSAoZiB+a2V5OmxrZXkgfmRhdGE6bGRhdGEgaW5pdClcbiAgfCBOb2RlXG4gICAgICB7IGxlZnQgPSBFbXB0eVxuICAgICAgOyBrZXlcbiAgICAgIDsgdmFsdWUgPSBkYXRhXG4gICAgICA7IGhlaWdodCA9IF9cbiAgICAgIDsgcmlnaHQgPSBMZWFmIHsga2V5ID0gcmtleTsgdmFsdWUgPSByZGF0YSB9XG4gICAgICB9IC0+IGYgfmtleTpya2V5IH5kYXRhOnJkYXRhIChmIH5rZXkgfmRhdGEgaW5pdClcbiAgfCBOb2RlXG4gICAgICB7IGxlZnQ7IGtleTsgdmFsdWUgPSBkYXRhOyBoZWlnaHQgPSBfOyByaWdodCA9IExlYWYgeyBrZXkgPSBya2V5OyB2YWx1ZSA9IHJkYXRhIH0gfVxuICAgIC0+IGYgfmtleTpya2V5IH5kYXRhOnJkYXRhIChmIH5rZXkgfmRhdGEgKGZvbGQgbGVmdCB+aW5pdCB+ZikpXG4gIHwgTm9kZVxuICAgICAgeyBsZWZ0ID0gTGVhZiB7IGtleSA9IGxrZXk7IHZhbHVlID0gbGRhdGEgfTsga2V5OyB2YWx1ZSA9IGRhdGE7IGhlaWdodCA9IF87IHJpZ2h0IH1cbiAgICAtPiBmb2xkIHJpZ2h0IH5pbml0OihmIH5rZXkgfmRhdGEgKGYgfmtleTpsa2V5IH5kYXRhOmxkYXRhIGluaXQpKSB+ZlxuICB8IE5vZGUgeyBsZWZ0OyBrZXk7IHZhbHVlID0gZGF0YTsgaGVpZ2h0ID0gXzsgcmlnaHQgfSAtPlxuICAgIGZvbGQgcmlnaHQgfmluaXQ6KGYgfmtleSB+ZGF0YSAoZm9sZCBsZWZ0IH5pbml0IH5mKSkgfmZcbjs7XG5cbmxldCByZWMgaXRlciB0IH5mID1cbiAgbWF0Y2ggdCB3aXRoXG4gIHwgRW1wdHkgLT4gKClcbiAgfCBMZWFmIHsga2V5OyB2YWx1ZSA9IGRhdGEgfSAtPiBmIH5rZXkgfmRhdGFcbiAgfCBOb2RlIHsgbGVmdDsga2V5OyB2YWx1ZSA9IGRhdGE7IGhlaWdodCA9IF87IHJpZ2h0IH0gLT5cbiAgICBpdGVyIGxlZnQgfmY7XG4gICAgZiB+a2V5IH5kYXRhO1xuICAgIGl0ZXIgcmlnaHQgfmZcbjs7XG5cbmxldCByZWMgbWFwaV9pbnBsYWNlIHQgfmYgPVxuICBtYXRjaCB0IHdpdGhcbiAgfCBFbXB0eSAtPiAoKVxuICB8IExlYWYgKHsga2V5OyB2YWx1ZSB9IGFzIHQpIC0+IHQudmFsdWUgPC0gZiB+a2V5IH5kYXRhOnZhbHVlXG4gIHwgTm9kZSAoeyBsZWZ0OyBrZXk7IHZhbHVlOyBoZWlnaHQgPSBfOyByaWdodCB9IGFzIHQpIC0+XG4gICAgbWFwaV9pbnBsYWNlIH5mIGxlZnQ7XG4gICAgdC52YWx1ZSA8LSBmIH5rZXkgfmRhdGE6dmFsdWU7XG4gICAgbWFwaV9pbnBsYWNlIH5mIHJpZ2h0XG47O1xuXG5sZXQgY2hvb3NlX2V4biA9IGZ1bmN0aW9uXG4gIHwgRW1wdHkgLT4gcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0F2bHRyZWUuY2hvb3NlX2V4bl0gb2YgZW1wdHkgaGFzaHRibFwiIFtdKVxuICB8IExlYWYgeyBrZXk7IHZhbHVlOyBfIH0gfCBOb2RlIHsga2V5OyB2YWx1ZTsgXyB9IC0+IGtleSwgdmFsdWVcbjs7XG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgSGFzaHRibF9pbnRmXG5cbm1vZHVsZSB0eXBlIEtleSA9IEtleS5TXG5cbmxldCB3aXRoX3JldHVybiA9IFdpdGhfcmV0dXJuLndpdGhfcmV0dXJuXG5sZXQgaGFzaF9wYXJhbSA9IEhhc2hhYmxlLmhhc2hfcGFyYW1cbmxldCBoYXNoID0gSGFzaGFibGUuaGFzaFxubGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbnR5cGUgKCdrLCAndikgdCA9XG4gIHsgbXV0YWJsZSB0YWJsZSA6ICgnaywgJ3YpIEF2bHRyZWUudCBhcnJheVxuICA7IG11dGFibGUgbGVuZ3RoIDogaW50XG4gICgqIFtyZWNlbnRseV9hZGRlZF0gaXMgdGhlIHJlZmVyZW5jZSBwYXNzZWQgdG8gW0F2bHRyZWUuYWRkXS4gV2UgcHV0IGl0IGluIHRoZSBoYXNoXG4gICAgIHRhYmxlIHRvIGF2b2lkIGFsbG9jYXRpbmcgaXQgYXQgZXZlcnkgW3NldF0uICopXG4gIDsgcmVjZW50bHlfYWRkZWQgOiBib29sIHJlZlxuICA7IGdyb3d0aF9hbGxvd2VkIDogYm9vbFxuICA7IGhhc2hhYmxlIDogJ2sgSGFzaGFibGUudFxuICA7IG11dGFibGUgbXV0YXRpb25fYWxsb3dlZCA6IGJvb2wgKCogU2V0IGR1cmluZyBhbGwgaXRlcmF0aW9uIG9wZXJhdGlvbnMgKilcbiAgfVxuXG50eXBlICdhIGtleSA9ICdhXG5cbmxldCBzZXhwX29mX2tleSB0ID0gdC5oYXNoYWJsZS5IYXNoYWJsZS5zZXhwX29mX3RcbmxldCBjb21wYXJlX2tleSB0ID0gdC5oYXNoYWJsZS5IYXNoYWJsZS5jb21wYXJlXG5cbmxldCBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0ID1cbiAgaWYgbm90IHQubXV0YXRpb25fYWxsb3dlZCB0aGVuIGZhaWx3aXRoIFwiSGFzaHRibDogbXV0YXRpb24gbm90IGFsbG93ZWQgZHVyaW5nIGl0ZXJhdGlvblwiXG47O1xuXG5sZXQgd2l0aG91dF9tdXRhdGluZyB0IGYgPVxuICBpZiB0Lm11dGF0aW9uX2FsbG93ZWRcbiAgdGhlbiAoXG4gICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIGZhbHNlO1xuICAgIG1hdGNoIGYgKCkgd2l0aFxuICAgIHwgeCAtPlxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIHRydWU7XG4gICAgICB4XG4gICAgfCBleGNlcHRpb24gZXhuIC0+XG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gdHJ1ZTtcbiAgICAgIHJhaXNlIGV4bilcbiAgZWxzZSBmICgpXG47O1xuXG4oKiogSW50ZXJuYWxseSB1c2UgYSBtYXhpbXVtIHNpemUgdGhhdCBpcyBhIHBvd2VyIG9mIDIuIFJldmVyc2VzIHRoZSBhYm92ZSB0byBmaW5kIHRoZVxuICAgIGZsb29yIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHN5c3RlbSBtYXggYXJyYXkgbGVuZ3RoICopXG5sZXQgbWF4X3RhYmxlX2xlbmd0aCA9IEludC5mbG9vcl9wb3cyIEFycmF5Lm1heF9sZW5ndGhcblxuKCogVGhlIGRlZmF1bHQgc2l6ZSBpcyBjaG9zZW4gdG8gYmUgMCAoYXMgb3Bwb3NlZCB0byAxMjggYXMgaXQgd2FzIGJlZm9yZSkgYmVjYXVzZTpcbiAgIC0gMTI4IGNhbiBjcmVhdGUgc3Vic3RhbnRpYWwgbWVtb3J5IG92ZXJoZWFkICh4MTApIHdoZW4gY3JlYXRpbmcgbWFueSB0YWJsZXMsIG1vc3RcbiAgICAgb2Ygd2hpY2ggYXJlIG5vdCBiaWcgKHNheSwgaWYgeW91IGhhdmUgYSBoYXNodGJsIG9mIGhhc2h0YmwpLiBBbmQgbWVtb3J5IG92ZXJoZWFkIGlzXG4gICAgIG5vdCB0aGF0IGVhc3kgdG8gcHJvZmlsZS5cbiAgIC0gaWYgYSBoYXNodGJsIGlzIGdvaW5nIHRvIGdyb3csIGl0J3Mgbm90IGNsZWFyIHdoeSAxMjggaXMgbWFya2VkbHkgYmV0dGVyIHRoYW4gb3RoZXJcbiAgICAgc2l6ZXMgKGlmIHlvdSBnb2luZyB0byBzdGljayAxMDAwIGVsZW1lbnRzLCB5b3UncmUgZ29pbmcgdG8gZ3JvdyB0aGUgaGFzaHRhYmxlIG9uY2VcbiAgICAgb3IgdHdpY2UgYW55d2F5KVxuICAgLSBpbiBvdGhlciBsYW5ndWFnZXMgKGxpa2UgcnVzdCwgcHl0aG9uLCBhbmQgYXBwYXJlbnRseSBnbyksIHRoZSBkZWZhdWx0IGlzIGFsc28gYVxuICAgICBzbWFsbCBzaXplLiAqKVxubGV0IGNyZWF0ZSA/KGdyb3d0aF9hbGxvd2VkID0gdHJ1ZSkgPyhzaXplID0gMCkgfmhhc2hhYmxlICgpID1cbiAgbGV0IHNpemUgPSBJbnQubWluIChJbnQubWF4IDEgc2l6ZSkgbWF4X3RhYmxlX2xlbmd0aCBpblxuICBsZXQgc2l6ZSA9IEludC5jZWlsX3BvdzIgc2l6ZSBpblxuICB7IHRhYmxlID0gQXJyYXkuY3JlYXRlIH5sZW46c2l6ZSBBdmx0cmVlLmVtcHR5XG4gIDsgbGVuZ3RoID0gMFxuICA7IGdyb3d0aF9hbGxvd2VkXG4gIDsgcmVjZW50bHlfYWRkZWQgPSByZWYgZmFsc2VcbiAgOyBoYXNoYWJsZVxuICA7IG11dGF0aW9uX2FsbG93ZWQgPSB0cnVlXG4gIH1cbjs7XG5cbigqKiBTdXBwbGVtZW50YWwgaGFzaC4gVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeSwgaXQgaXMgaW50ZW5kZWQgYXMgYSBkZWZlbnNlIGFnYWluc3QgcG9vclxuICAgIGhhc2ggZnVuY3Rpb25zLCBmb3Igd2hpY2ggdGhlIHBvd2VyIG9mIDIgc2l6ZWQgdGFibGUgd2lsbCBiZSBlc3BlY2lhbGx5IHNlbnNpdGl2ZS5cbiAgICBXaXRoIHNvbWUgdGVzdGluZyB3ZSBtYXkgY2hvb3NlIHRvIGFkZCBpdCwgYnV0IHRoaXMgdGFibGUgaXMgZGVzaWduZWQgdG8gYmUgcm9idXN0IHRvXG4gICAgY29sbGlzaW9ucywgYW5kIGluIG1vc3Qgb2YgbXkgdGVzdGluZyB0aGlzIGRlZ3JhZGVzIHBlcmZvcm1hbmNlLiAqKVxubGV0IF9zdXBwbGVtZW50YWxfaGFzaCBoID1cbiAgbGV0IGggPSBoIGx4b3IgKChoIGxzciAyMCkgbHhvciAoaCBsc3IgMTIpKSBpblxuICBoIGx4b3IgKGggbHNyIDcpIGx4b3IgKGggbHNyIDQpXG47O1xuXG5sZXQgc2xvdCB0IGtleSA9XG4gIGxldCBoYXNoID0gdC5oYXNoYWJsZS5IYXNoYWJsZS5oYXNoIGtleSBpblxuICAoKiB0aGlzIGlzIGFsd2F5cyBub24tbmVnYXRpdmUgYmVjYXVzZSB3ZSBkbyBbbGFuZF0gd2l0aCBub24tbmVnYXRpdmUgbnVtYmVyICopXG4gIGhhc2ggbGFuZCAoQXJyYXkubGVuZ3RoIHQudGFibGUgLSAxKVxuOztcblxubGV0IGFkZF93b3JrZXIgdCB+cmVwbGFjZSB+a2V5IH5kYXRhID1cbiAgbGV0IGkgPSBzbG90IHQga2V5IGluXG4gIGxldCByb290ID0gdC50YWJsZS4oaSkgaW5cbiAgbGV0IGFkZGVkID0gdC5yZWNlbnRseV9hZGRlZCBpblxuICBhZGRlZCA6PSBmYWxzZTtcbiAgbGV0IG5ld19yb290ID1cbiAgICAoKiBUaGUgYXZsIHRyZWUgbWlnaHQgcmVwbGFjZSB0aGUgdmFsdWUgW3JlcGxhY2U9dHJ1ZV0gb3IgZG8gbm90aGluZyBbcmVwbGFjZT1mYWxzZV1cbiAgICAgICB0byB0aGUgZW50cnksIGluIHRoYXQgY2FzZSB0aGUgdGFibGUgZGlkIG5vdCBnZXQgYmlnZ2VyLCBzbyB3ZSBzaG91bGQgbm90XG4gICAgICAgaW5jcmVtZW50IGxlbmd0aCwgd2UgcGFzcyBpbiB0aGUgYm9vbCByZWYgdC5hZGRlZCBzbyB0aGF0IGl0IGNhbiB0ZWxsIHVzIHdoZXRoZXJcbiAgICAgICBpdCBhZGRlZCBvciByZXBsYWNlZC4gV2UgZG8gaXQgdGhpcyB3YXkgdG8gYXZvaWQgZXh0cmEgYWxsb2NhdGlvbi4gU2luY2UgdGhlIGJvb2xcbiAgICAgICBpcyBhbiBpbW1lZGlhdGUgaXQgZG9lcyBub3QgZ28gdGhyb3VnaCB0aGUgd3JpdGUgYmFycmllci4gKilcbiAgICBBdmx0cmVlLmFkZCB+cmVwbGFjZSByb290IH5jb21wYXJlOihjb21wYXJlX2tleSB0KSB+YWRkZWQgfmtleSB+ZGF0YVxuICBpblxuICBpZiAhYWRkZWQgdGhlbiB0Lmxlbmd0aCA8LSB0Lmxlbmd0aCArIDE7XG4gICgqIFRoaXMgbGl0dGxlIG9wdGltaXphdGlvbiBzYXZlcyBhIGNhbWxfbW9kaWZ5IHdoZW4gdGhlIHRyZWVcbiAgICAgaGFzbid0IGJlZW4gcmViYWxhbmNlZC4gKilcbiAgaWYgbm90IChwaHlzX2VxdWFsIG5ld19yb290IHJvb3QpIHRoZW4gdC50YWJsZS4oaSkgPC0gbmV3X3Jvb3Rcbjs7XG5cbmxldCBtYXliZV9yZXNpemVfdGFibGUgdCA9XG4gIGxldCBsZW4gPSBBcnJheS5sZW5ndGggdC50YWJsZSBpblxuICBsZXQgc2hvdWxkX2dyb3cgPSB0Lmxlbmd0aCA+IGxlbiBpblxuICBpZiBzaG91bGRfZ3JvdyAmJiB0Lmdyb3d0aF9hbGxvd2VkXG4gIHRoZW4gKFxuICAgIGxldCBuZXdfYXJyYXlfbGVuZ3RoID0gSW50Lm1pbiAobGVuICogMikgbWF4X3RhYmxlX2xlbmd0aCBpblxuICAgIGlmIG5ld19hcnJheV9sZW5ndGggPiBsZW5cbiAgICB0aGVuIChcbiAgICAgIGxldCBuZXdfdGFibGUgPSBBcnJheS5jcmVhdGUgfmxlbjpuZXdfYXJyYXlfbGVuZ3RoIEF2bHRyZWUuZW1wdHkgaW5cbiAgICAgIGxldCBvbGRfdGFibGUgPSB0LnRhYmxlIGluXG4gICAgICB0LnRhYmxlIDwtIG5ld190YWJsZTtcbiAgICAgIHQubGVuZ3RoIDwtIDA7XG4gICAgICBsZXQgZiB+a2V5IH5kYXRhID0gYWRkX3dvcmtlciB+cmVwbGFjZTp0cnVlIHQgfmtleSB+ZGF0YSBpblxuICAgICAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCBvbGRfdGFibGUgLSAxIGRvXG4gICAgICAgIEF2bHRyZWUuaXRlciBvbGRfdGFibGUuKGkpIH5mXG4gICAgICBkb25lKSlcbjs7XG5cbmxldCBzZXQgdCB+a2V5IH5kYXRhID1cbiAgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdDtcbiAgYWRkX3dvcmtlciB+cmVwbGFjZTp0cnVlIHQgfmtleSB+ZGF0YTtcbiAgbWF5YmVfcmVzaXplX3RhYmxlIHRcbjs7XG5cbmxldCBhZGQgdCB+a2V5IH5kYXRhID1cbiAgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdDtcbiAgYWRkX3dvcmtlciB+cmVwbGFjZTpmYWxzZSB0IH5rZXkgfmRhdGE7XG4gIGlmICEodC5yZWNlbnRseV9hZGRlZClcbiAgdGhlbiAoXG4gICAgbWF5YmVfcmVzaXplX3RhYmxlIHQ7XG4gICAgYE9rKVxuICBlbHNlIGBEdXBsaWNhdGVcbjs7XG5cbmxldCBhZGRfZXhuIHQgfmtleSB+ZGF0YSA9XG4gIG1hdGNoIGFkZCB0IH5rZXkgfmRhdGEgd2l0aFxuICB8IGBPayAtPiAoKVxuICB8IGBEdXBsaWNhdGUgLT5cbiAgICBsZXQgc2V4cF9vZl9rZXkgPSBzZXhwX29mX2tleSB0IGluXG4gICAgbGV0IGVycm9yID0gRXJyb3IuY3JlYXRlIFwiSGFzaHRibC5hZGRfZXhuIGdvdCBrZXkgYWxyZWFkeSBwcmVzZW50XCIga2V5IHNleHBfb2Zfa2V5IGluXG4gICAgRXJyb3IucmFpc2UgZXJyb3Jcbjs7XG5cbmxldCBjbGVhciB0ID1cbiAgZW5zdXJlX211dGF0aW9uX2FsbG93ZWQgdDtcbiAgZm9yIGkgPSAwIHRvIEFycmF5Lmxlbmd0aCB0LnRhYmxlIC0gMSBkb1xuICAgIHQudGFibGUuKGkpIDwtIEF2bHRyZWUuZW1wdHlcbiAgZG9uZTtcbiAgdC5sZW5ndGggPC0gMFxuOztcblxubGV0IGZpbmRfYW5kX2NhbGwgdCBrZXkgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICAoKiB3aXRoIGEgZ29vZCBoYXNoIGZ1bmN0aW9uIHRoZXNlIGZpcnN0IHR3byBjYXNlcyB3aWxsIGJlIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHksXG4gICAgIGFuZCBBdmx0cmVlLmZpbmQgaXMgcmVjdXJzaXZlLCBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkLCBzbyBkb2luZyB0aGlzIGF2b2lkcyBhXG4gICAgIGZ1bmN0aW9uIGNhbGwgaW4gbW9zdCBjYXNlcy4gKilcbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleVxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB2IGVsc2UgaWZfbm90X2ZvdW5kIGtleVxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRfYW5kX2NhbGwgdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbDEgdCBrZXkgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5IGFcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgdiBhIGVsc2UgaWZfbm90X2ZvdW5kIGtleSBhXG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZF9hbmRfY2FsbDEgdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5IH5hIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZF9hbmRfY2FsbDIgdCBrZXkgfmEgfmIgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5IGEgYlxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB2IGEgYiBlbHNlIGlmX25vdF9mb3VuZCBrZXkgYSBiXG4gIHwgdHJlZSAtPlxuICAgIEF2bHRyZWUuZmluZF9hbmRfY2FsbDIgdHJlZSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdCkga2V5IH5hIH5iIH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZGlfYW5kX2NhbGwgdCBrZXkgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICAoKiB3aXRoIGEgZ29vZCBoYXNoIGZ1bmN0aW9uIHRoZXNlIGZpcnN0IHR3byBjYXNlcyB3aWxsIGJlIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHksXG4gICAgIGFuZCBBdmx0cmVlLmZpbmQgaXMgcmVjdXJzaXZlLCBzbyBpdCBjYW4ndCBiZSBpbmxpbmVkLCBzbyBkb2luZyB0aGlzIGF2b2lkcyBhXG4gICAgIGZ1bmN0aW9uIGNhbGwgaW4gbW9zdCBjYXNlcy4gKilcbiAgbWF0Y2ggdC50YWJsZS4oc2xvdCB0IGtleSkgd2l0aFxuICB8IEF2bHRyZWUuRW1wdHkgLT4gaWZfbm90X2ZvdW5kIGtleVxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB+a2V5OmsgfmRhdGE6diBlbHNlIGlmX25vdF9mb3VuZCBrZXlcbiAgfCB0cmVlIC0+XG4gICAgQXZsdHJlZS5maW5kaV9hbmRfY2FsbCB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXkgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbDEgdCBrZXkgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5IGFcbiAgfCBBdmx0cmVlLkxlYWYgeyBrZXkgPSBrOyB2YWx1ZSA9IHYgfSAtPlxuICAgIGlmIGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwIHRoZW4gaWZfZm91bmQgfmtleTprIH5kYXRhOnYgYSBlbHNlIGlmX25vdF9mb3VuZCBrZXkgYVxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRpX2FuZF9jYWxsMSB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXkgfmEgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBmaW5kaV9hbmRfY2FsbDIgdCBrZXkgfmEgfmIgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmQgPVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBpZl9ub3RfZm91bmQga2V5IGEgYlxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gdiB9IC0+XG4gICAgaWYgY29tcGFyZV9rZXkgdCBrIGtleSA9IDAgdGhlbiBpZl9mb3VuZCB+a2V5OmsgfmRhdGE6diBhIGIgZWxzZSBpZl9ub3RfZm91bmQga2V5IGEgYlxuICB8IHRyZWUgLT5cbiAgICBBdmx0cmVlLmZpbmRpX2FuZF9jYWxsMlxuICAgICAgdHJlZVxuICAgICAgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpXG4gICAgICBrZXlcbiAgICAgIH5hXG4gICAgICB+YlxuICAgICAgfmlmX2ZvdW5kXG4gICAgICB+aWZfbm90X2ZvdW5kXG47O1xuXG5sZXQgZmluZCA9XG4gIGxldCBpZl9mb3VuZCB2ID0gU29tZSB2IGluXG4gIGxldCBpZl9ub3RfZm91bmQgXyA9IE5vbmUgaW5cbiAgZnVuIHQga2V5IC0+IGZpbmRfYW5kX2NhbGwgdCBrZXkgfmlmX2ZvdW5kIH5pZl9ub3RfZm91bmRcbjs7XG5cbmxldCBtZW0gdCBrZXkgPVxuICBtYXRjaCB0LnRhYmxlLihzbG90IHQga2V5KSB3aXRoXG4gIHwgQXZsdHJlZS5FbXB0eSAtPiBmYWxzZVxuICB8IEF2bHRyZWUuTGVhZiB7IGtleSA9IGs7IHZhbHVlID0gXyB9IC0+IGNvbXBhcmVfa2V5IHQgayBrZXkgPSAwXG4gIHwgdHJlZSAtPiBBdmx0cmVlLm1lbSB0cmVlIH5jb21wYXJlOihjb21wYXJlX2tleSB0KSBrZXlcbjs7XG5cbmxldCByZW1vdmUgdCBrZXkgPVxuICBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0O1xuICBsZXQgaSA9IHNsb3QgdCBrZXkgaW5cbiAgbGV0IHJvb3QgPSB0LnRhYmxlLihpKSBpblxuICBsZXQgYWRkZWRfb3JfcmVtb3ZlZCA9IHQucmVjZW50bHlfYWRkZWQgaW5cbiAgYWRkZWRfb3JfcmVtb3ZlZCA6PSBmYWxzZTtcbiAgbGV0IG5ld19yb290ID1cbiAgICBBdmx0cmVlLnJlbW92ZSByb290IH5yZW1vdmVkOmFkZGVkX29yX3JlbW92ZWQgfmNvbXBhcmU6KGNvbXBhcmVfa2V5IHQpIGtleVxuICBpblxuICBpZiBub3QgKHBoeXNfZXF1YWwgcm9vdCBuZXdfcm9vdCkgdGhlbiB0LnRhYmxlLihpKSA8LSBuZXdfcm9vdDtcbiAgaWYgIWFkZGVkX29yX3JlbW92ZWQgdGhlbiB0Lmxlbmd0aCA8LSB0Lmxlbmd0aCAtIDFcbjs7XG5cbmxldCBsZW5ndGggdCA9IHQubGVuZ3RoXG5sZXQgaXNfZW1wdHkgdCA9IGxlbmd0aCB0ID0gMFxuXG5sZXQgZm9sZCB0IH5pbml0IH5mID1cbiAgaWYgbGVuZ3RoIHQgPSAwXG4gIHRoZW4gaW5pdFxuICBlbHNlIChcbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IGFjYyA9IHJlZiBpbml0IGluXG4gICAgbGV0IG0gPSB0Lm11dGF0aW9uX2FsbG93ZWQgaW5cbiAgICBtYXRjaFxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIGZhbHNlO1xuICAgICAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgICAgIG1hdGNoIEFycmF5LnVuc2FmZV9nZXQgdC50YWJsZSBpIHdpdGhcbiAgICAgICAgfCBBdmx0cmVlLkVtcHR5IC0+ICgpXG4gICAgICAgIHwgQXZsdHJlZS5MZWFmIHsga2V5OyB2YWx1ZSA9IGRhdGEgfSAtPiBhY2MgOj0gZiB+a2V5IH5kYXRhICFhY2NcbiAgICAgICAgfCBidWNrZXQgLT4gYWNjIDo9IEF2bHRyZWUuZm9sZCBidWNrZXQgfmluaXQ6IWFjYyB+ZlxuICAgICAgZG9uZVxuICAgIHdpdGhcbiAgICB8ICgpIC0+XG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gbTtcbiAgICAgICFhY2NcbiAgICB8IGV4Y2VwdGlvbiBleG4gLT5cbiAgICAgIHQubXV0YXRpb25fYWxsb3dlZCA8LSBtO1xuICAgICAgcmFpc2UgZXhuKVxuOztcblxubGV0IGl0ZXJpIHQgfmYgPVxuICBpZiB0Lmxlbmd0aCA9IDBcbiAgdGhlbiAoKVxuICBlbHNlIChcbiAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCB0LnRhYmxlIGluXG4gICAgbGV0IG0gPSB0Lm11dGF0aW9uX2FsbG93ZWQgaW5cbiAgICBtYXRjaFxuICAgICAgdC5tdXRhdGlvbl9hbGxvd2VkIDwtIGZhbHNlO1xuICAgICAgZm9yIGkgPSAwIHRvIG4gLSAxIGRvXG4gICAgICAgIG1hdGNoIEFycmF5LnVuc2FmZV9nZXQgdC50YWJsZSBpIHdpdGhcbiAgICAgICAgfCBBdmx0cmVlLkVtcHR5IC0+ICgpXG4gICAgICAgIHwgQXZsdHJlZS5MZWFmIHsga2V5OyB2YWx1ZSA9IGRhdGEgfSAtPiBmIH5rZXkgfmRhdGFcbiAgICAgICAgfCBidWNrZXQgLT4gQXZsdHJlZS5pdGVyIGJ1Y2tldCB+ZlxuICAgICAgZG9uZVxuICAgIHdpdGhcbiAgICB8ICgpIC0+IHQubXV0YXRpb25fYWxsb3dlZCA8LSBtXG4gICAgfCBleGNlcHRpb24gZXhuIC0+XG4gICAgICB0Lm11dGF0aW9uX2FsbG93ZWQgPC0gbTtcbiAgICAgIHJhaXNlIGV4bilcbjs7XG5cbmxldCBpdGVyIHQgfmYgPSBpdGVyaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbmxldCBpdGVyX2tleXMgdCB+ZiA9IGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOl8gLT4gZiBrZXkpXG5cbmxldCByZWMgY2hvb3NlX25vbmVtcHR5IHRhYmxlIGkgPVxuICBsZXQgYXZsdHJlZSA9IHRhYmxlLihpKSBpblxuICBpZiBBdmx0cmVlLmlzX2VtcHR5IGF2bHRyZWVcbiAgdGhlbiBjaG9vc2Vfbm9uZW1wdHkgdGFibGUgKGkgKyAxKVxuICBlbHNlIEF2bHRyZWUuY2hvb3NlX2V4biBhdmx0cmVlXG47O1xuXG5sZXQgY2hvb3NlX2V4biB0ID1cbiAgaWYgdC5sZW5ndGggPSAwIHRoZW4gcmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiW0hhc2h0YmwuY2hvb3NlX2V4bl0gb2YgZW1wdHkgaGFzaHRibFwiIFtdKTtcbiAgY2hvb3NlX25vbmVtcHR5IHQudGFibGUgMFxuOztcblxubGV0IGNob29zZSB0ID0gaWYgaXNfZW1wdHkgdCB0aGVuIE5vbmUgZWxzZSBTb21lIChjaG9vc2Vfbm9uZW1wdHkgdC50YWJsZSAwKVxuXG5sZXQgaW52YXJpYW50IGludmFyaWFudF9rZXkgaW52YXJpYW50X2RhdGEgdCA9XG4gIGZvciBpID0gMCB0byBBcnJheS5sZW5ndGggdC50YWJsZSAtIDEgZG9cbiAgICBBdmx0cmVlLmludmFyaWFudCB0LnRhYmxlLihpKSB+Y29tcGFyZTooY29tcGFyZV9rZXkgdClcbiAgZG9uZTtcbiAgbGV0IHJlYWxfbGVuID1cbiAgICBmb2xkIHQgfmluaXQ6MCB+ZjooZnVuIH5rZXkgfmRhdGEgaSAtPlxuICAgICAgaW52YXJpYW50X2tleSBrZXk7XG4gICAgICBpbnZhcmlhbnRfZGF0YSBkYXRhO1xuICAgICAgaSArIDEpXG4gIGluXG4gIGFzc2VydCAocmVhbF9sZW4gPSB0Lmxlbmd0aClcbjs7XG5cbmxldCBmaW5kX2V4biA9XG4gIGxldCBpZl9mb3VuZCB2IF8gPSB2IGluXG4gIGxldCBpZl9ub3RfZm91bmQgayB0ID1cbiAgICByYWlzZVxuICAgICAgKE5vdF9mb3VuZF9zIChMaXN0IFsgQXRvbSBcIkhhc2h0YmwuZmluZF9leG46IG5vdCBmb3VuZFwiOyB0Lmhhc2hhYmxlLnNleHBfb2ZfdCBrIF0pKVxuICBpblxuICBsZXQgZmluZF9leG4gdCBrZXkgPSBmaW5kX2FuZF9jYWxsMSB0IGtleSB+YTp0IH5pZl9mb3VuZCB+aWZfbm90X2ZvdW5kIGluXG4gICgqIG5hbWVkIHRvIHByZXNlcnZlIHN5bWJvbCBpbiBjb21waWxlZCBiaW5hcnkgKilcbiAgZmluZF9leG5cbjs7XG5cbmxldCBleGlzdHNpIHQgfmYgPVxuICB3aXRoX3JldHVybiAoZnVuIHIgLT5cbiAgICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiByLnJldHVybiB0cnVlKTtcbiAgICBmYWxzZSlcbjs7XG5cbmxldCBleGlzdHMgdCB+ZiA9IGV4aXN0c2kgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5sZXQgZm9yX2FsbGkgdCB+ZiA9IG5vdCAoZXhpc3RzaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBub3QgKGYgfmtleSB+ZGF0YSkpKVxubGV0IGZvcl9hbGwgdCB+ZiA9IG5vdCAoZXhpc3RzaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IG5vdCAoZiBkYXRhKSkpXG5cbmxldCBjb3VudGkgdCB+ZiA9XG4gIGZvbGQgdCB+aW5pdDowIH5mOihmdW4gfmtleSB+ZGF0YSBhY2MgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gYWNjICsgMSBlbHNlIGFjYylcbjs7XG5cbmxldCBjb3VudCB0IH5mID1cbiAgZm9sZCB0IH5pbml0OjAgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgYWNjIC0+IGlmIGYgZGF0YSB0aGVuIGFjYyArIDEgZWxzZSBhY2MpXG47O1xuXG5sZXQgbWFwaSB0IH5mID1cbiAgbGV0IG5ld190ID1cbiAgICBjcmVhdGUgfmdyb3d0aF9hbGxvd2VkOnQuZ3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlOnQuaGFzaGFibGUgfnNpemU6dC5sZW5ndGggKClcbiAgaW5cbiAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gc2V0IG5ld190IH5rZXkgfmRhdGE6KGYgfmtleSB+ZGF0YSkpO1xuICBuZXdfdFxuOztcblxubGV0IG1hcCB0IH5mID0gbWFwaSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbmxldCBjb3B5IHQgPSBtYXAgdCB+ZjpGbi5pZFxuXG5sZXQgZmlsdGVyX21hcGkgdCB+ZiA9XG4gIGxldCBuZXdfdCA9XG4gICAgY3JlYXRlIH5ncm93dGhfYWxsb3dlZDp0Lmdyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZTp0Lmhhc2hhYmxlIH5zaXplOnQubGVuZ3RoICgpXG4gIGluXG4gIGl0ZXJpIHQgfmY6KGZ1biB+a2V5IH5kYXRhIC0+XG4gICAgbWF0Y2ggZiB+a2V5IH5kYXRhIHdpdGhcbiAgICB8IFNvbWUgbmV3X2RhdGEgLT4gc2V0IG5ld190IH5rZXkgfmRhdGE6bmV3X2RhdGFcbiAgICB8IE5vbmUgLT4gKCkpO1xuICBuZXdfdFxuOztcblxubGV0IGZpbHRlcl9tYXAgdCB+ZiA9IGZpbHRlcl9tYXBpIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuXG5sZXQgZmlsdGVyaSB0IH5mID1cbiAgZmlsdGVyX21hcGkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT4gaWYgZiB+a2V5IH5kYXRhIHRoZW4gU29tZSBkYXRhIGVsc2UgTm9uZSlcbjs7XG5cbmxldCBmaWx0ZXIgdCB+ZiA9IGZpbHRlcmkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5sZXQgZmlsdGVyX2tleXMgdCB+ZiA9IGZpbHRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGE6XyAtPiBmIGtleSlcblxubGV0IHBhcnRpdGlvbl9tYXBpIHQgfmYgPVxuICBsZXQgdDAgPVxuICAgIGNyZWF0ZSB+Z3Jvd3RoX2FsbG93ZWQ6dC5ncm93dGhfYWxsb3dlZCB+aGFzaGFibGU6dC5oYXNoYWJsZSB+c2l6ZTp0Lmxlbmd0aCAoKVxuICBpblxuICBsZXQgdDEgPVxuICAgIGNyZWF0ZSB+Z3Jvd3RoX2FsbG93ZWQ6dC5ncm93dGhfYWxsb3dlZCB+aGFzaGFibGU6dC5oYXNoYWJsZSB+c2l6ZTp0Lmxlbmd0aCAoKVxuICBpblxuICBpdGVyaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgIG1hdGNoIChmIH5rZXkgfmRhdGEgOiBfIEVpdGhlci50KSB3aXRoXG4gICAgfCBGaXJzdCBuZXdfZGF0YSAtPiBzZXQgdDAgfmtleSB+ZGF0YTpuZXdfZGF0YVxuICAgIHwgU2Vjb25kIG5ld19kYXRhIC0+IHNldCB0MSB+a2V5IH5kYXRhOm5ld19kYXRhKTtcbiAgdDAsIHQxXG47O1xuXG5sZXQgcGFydGl0aW9uX21hcCB0IH5mID0gcGFydGl0aW9uX21hcGkgdCB+ZjooZnVuIH5rZXk6XyB+ZGF0YSAtPiBmIGRhdGEpXG5cbmxldCBwYXJ0aXRpb25pX3RmIHQgfmYgPVxuICBwYXJ0aXRpb25fbWFwaSB0IH5mOihmdW4gfmtleSB+ZGF0YSAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiBGaXJzdCBkYXRhIGVsc2UgU2Vjb25kIGRhdGEpXG47O1xuXG5sZXQgcGFydGl0aW9uX3RmIHQgfmYgPSBwYXJ0aXRpb25pX3RmIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuXG5sZXQgZmluZF9vcl9hZGQgdCBpZCB+ZGVmYXVsdCA9XG4gIGZpbmRfYW5kX2NhbGwyXG4gICAgdFxuICAgIGlkXG4gICAgfmE6dFxuICAgIH5iOmRlZmF1bHRcbiAgICB+aWZfZm91bmQ6KGZ1biBkYXRhIF8gXyAtPiBkYXRhKVxuICAgIH5pZl9ub3RfZm91bmQ6KGZ1biBrZXkgdCBkZWZhdWx0IC0+XG4gICAgICBsZXQgZGVmYXVsdCA9IGRlZmF1bHQgKCkgaW5cbiAgICAgIHNldCB0IH5rZXkgfmRhdGE6ZGVmYXVsdDtcbiAgICAgIGRlZmF1bHQpXG47O1xuXG5sZXQgZmluZGlfb3JfYWRkIHQgaWQgfmRlZmF1bHQgPVxuICBmaW5kX2FuZF9jYWxsMlxuICAgIHRcbiAgICBpZFxuICAgIH5hOnRcbiAgICB+YjpkZWZhdWx0XG4gICAgfmlmX2ZvdW5kOihmdW4gZGF0YSBfIF8gLT4gZGF0YSlcbiAgICB+aWZfbm90X2ZvdW5kOihmdW4ga2V5IHQgZGVmYXVsdCAtPlxuICAgICAgbGV0IGRlZmF1bHQgPSBkZWZhdWx0IGtleSBpblxuICAgICAgc2V0IHQgfmtleSB+ZGF0YTpkZWZhdWx0O1xuICAgICAgZGVmYXVsdClcbjs7XG5cbigqIFNvbWUgaGFzaHRibCBpbXBsZW1lbnRhdGlvbnMgbWF5IGJlIGFibGUgdG8gcGVyZm9ybSB0aGlzIG1vcmUgZWZmaWNpZW50bHkgdGhhbiB0d29cbiAgIHNlcGFyYXRlIGxvb2t1cHMgKilcbmxldCBmaW5kX2FuZF9yZW1vdmUgdCBpZCA9XG4gIGxldCByZXN1bHQgPSBmaW5kIHQgaWQgaW5cbiAgaWYgT3B0aW9uLmlzX3NvbWUgcmVzdWx0IHRoZW4gcmVtb3ZlIHQgaWQ7XG4gIHJlc3VsdFxuOztcblxuXG5sZXQgY2hhbmdlIHQgaWQgfmYgPVxuICBtYXRjaCBmIChmaW5kIHQgaWQpIHdpdGhcbiAgfCBOb25lIC0+IHJlbW92ZSB0IGlkXG4gIHwgU29tZSBkYXRhIC0+IHNldCB0IH5rZXk6aWQgfmRhdGFcbjs7XG5cbmxldCB1cGRhdGVfYW5kX3JldHVybiB0IGlkIH5mID1cbiAgbGV0IGRhdGEgPSBmIChmaW5kIHQgaWQpIGluXG4gIHNldCB0IH5rZXk6aWQgfmRhdGE7XG4gIGRhdGFcbjs7XG5cbmxldCB1cGRhdGUgdCBpZCB+ZiA9IGlnbm9yZSAodXBkYXRlX2FuZF9yZXR1cm4gdCBpZCB+ZiA6IF8pXG5cbmxldCBpbmNyX2J5IH5yZW1vdmVfaWZfemVybyB0IGtleSBieSA9XG4gIGlmIHJlbW92ZV9pZl96ZXJvXG4gIHRoZW5cbiAgICBjaGFuZ2UgdCBrZXkgfmY6KGZ1biBvcHQgLT5cbiAgICAgIG1hdGNoIGJ5ICsgT3B0aW9uLnZhbHVlIG9wdCB+ZGVmYXVsdDowIHdpdGhcbiAgICAgIHwgMCAtPiBOb25lXG4gICAgICB8IG4gLT4gU29tZSBuKVxuICBlbHNlXG4gICAgdXBkYXRlIHQga2V5IH5mOihmdW5jdGlvblxuICAgICAgfCBOb25lIC0+IGJ5XG4gICAgICB8IFNvbWUgaSAtPiBieSArIGkpXG47O1xuXG5sZXQgaW5jciA/KGJ5ID0gMSkgPyhyZW1vdmVfaWZfemVybyA9IGZhbHNlKSB0IGtleSA9IGluY3JfYnkgfnJlbW92ZV9pZl96ZXJvIHQga2V5IGJ5XG5sZXQgZGVjciA/KGJ5ID0gMSkgPyhyZW1vdmVfaWZfemVybyA9IGZhbHNlKSB0IGtleSA9IGluY3JfYnkgfnJlbW92ZV9pZl96ZXJvIHQga2V5ICgtYnkpXG5cbmxldCBhZGRfbXVsdGkgdCB+a2V5IH5kYXRhID1cbiAgdXBkYXRlIHQga2V5IH5mOihmdW5jdGlvblxuICAgIHwgTm9uZSAtPiBbIGRhdGEgXVxuICAgIHwgU29tZSBsIC0+IGRhdGEgOjogbClcbjs7XG5cbmxldCByZW1vdmVfbXVsdGkgdCBrZXkgPVxuICBtYXRjaCBmaW5kIHQga2V5IHdpdGhcbiAgfCBOb25lIC0+ICgpXG4gIHwgU29tZSBbXSB8IFNvbWUgWyBfIF0gLT4gcmVtb3ZlIHQga2V5XG4gIHwgU29tZSAoXyA6OiB0bCkgLT4gc2V0IHQgfmtleSB+ZGF0YTp0bFxuOztcblxubGV0IGZpbmRfbXVsdGkgdCBrZXkgPVxuICBtYXRjaCBmaW5kIHQga2V5IHdpdGhcbiAgfCBOb25lIC0+IFtdXG4gIHwgU29tZSBsIC0+IGxcbjs7XG5cbmxldCBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgfmdldF9kYXRhIHJvd3MgPVxuICBsZXQgc2l6ZSA9XG4gICAgbWF0Y2ggc2l6ZSB3aXRoXG4gICAgfCBTb21lIHMgLT4gc1xuICAgIHwgTm9uZSAtPiBMaXN0Lmxlbmd0aCByb3dzXG4gIGluXG4gIGxldCByZXMgPSBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSB+c2l6ZSAoKSBpblxuICBsZXQgZHVwZXMgPSByZWYgW10gaW5cbiAgTGlzdC5pdGVyIHJvd3MgfmY6KGZ1biByIC0+XG4gICAgbGV0IGtleSA9IGdldF9rZXkgciBpblxuICAgIGxldCBkYXRhID0gZ2V0X2RhdGEgciBpblxuICAgIGlmIG1lbSByZXMga2V5IHRoZW4gZHVwZXMgOj0ga2V5IDo6ICFkdXBlcyBlbHNlIHNldCByZXMgfmtleSB+ZGF0YSk7XG4gIG1hdGNoICFkdXBlcyB3aXRoXG4gIHwgW10gLT4gYE9rIHJlc1xuICB8IGtleXMgLT4gYER1cGxpY2F0ZV9rZXlzIChMaXN0LmRlZHVwX2FuZF9zb3J0IH5jb21wYXJlOmhhc2hhYmxlLkhhc2hhYmxlLmNvbXBhcmUga2V5cylcbjs7XG5cbmxldCBjcmVhdGVfbWFwcGVkX211bHRpID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgfmdldF9kYXRhIHJvd3MgPVxuICBsZXQgc2l6ZSA9XG4gICAgbWF0Y2ggc2l6ZSB3aXRoXG4gICAgfCBTb21lIHMgLT4gc1xuICAgIHwgTm9uZSAtPiBMaXN0Lmxlbmd0aCByb3dzXG4gIGluXG4gIGxldCByZXMgPSBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkIH5zaXplIH5oYXNoYWJsZSAoKSBpblxuICBMaXN0Lml0ZXIgcm93cyB+ZjooZnVuIHIgLT5cbiAgICBsZXQga2V5ID0gZ2V0X2tleSByIGluXG4gICAgbGV0IGRhdGEgPSBnZXRfZGF0YSByIGluXG4gICAgYWRkX211bHRpIHJlcyB+a2V5IH5kYXRhKTtcbiAgcmVzXG47O1xuXG5sZXQgb2ZfYWxpc3QgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3QgPVxuICBtYXRjaCBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXk6ZnN0IH5nZXRfZGF0YTpzbmQgbHN0IHdpdGhcbiAgfCBgT2sgdCAtPiBgT2sgdFxuICB8IGBEdXBsaWNhdGVfa2V5cyBrIC0+IGBEdXBsaWNhdGVfa2V5IChMaXN0LmhkX2V4biBrKVxuOztcblxubGV0IG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCA9XG4gIGNyZWF0ZV9tYXBwZWQgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleTpmc3QgfmdldF9kYXRhOnNuZCBsc3Rcbjs7XG5cbmxldCBvZl9hbGlzdF9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCA9XG4gIG1hdGNoIG9mX2FsaXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgbHN0IHdpdGhcbiAgfCBgT2sgdiAtPiBSZXN1bHQuT2sgdlxuICB8IGBEdXBsaWNhdGVfa2V5IGtleSAtPlxuICAgIGxldCBzZXhwX29mX2tleSA9IGhhc2hhYmxlLkhhc2hhYmxlLnNleHBfb2ZfdCBpblxuICAgIE9yX2Vycm9yLmVycm9yIFwiSGFzaHRibC5vZl9hbGlzdF9leG46IGR1cGxpY2F0ZSBrZXlcIiBrZXkgc2V4cF9vZl9rZXlcbjs7XG5cbmxldCBvZl9hbGlzdF9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSBsc3QgPVxuICBtYXRjaCBvZl9hbGlzdF9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCB3aXRoXG4gIHwgUmVzdWx0Lk9rIHYgLT4gdlxuICB8IFJlc3VsdC5FcnJvciBlIC0+IEVycm9yLnJhaXNlIGVcbjs7XG5cbmxldCBvZl9hbGlzdF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIGxzdCA9XG4gIGNyZWF0ZV9tYXBwZWRfbXVsdGkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleTpmc3QgfmdldF9kYXRhOnNuZCBsc3Rcbjs7XG5cbmxldCB0b19hbGlzdCB0ID0gZm9sZCB+ZjooZnVuIH5rZXkgfmRhdGEgbGlzdCAtPiAoa2V5LCBkYXRhKSA6OiBsaXN0KSB+aW5pdDpbXSB0XG5cbmxldCBzZXhwX29mX3Qgc2V4cF9vZl9rZXkgc2V4cF9vZl9kYXRhIHQgPVxuICB0XG4gIHw+IHRvX2FsaXN0XG4gIHw+IExpc3Quc29ydCB+Y29tcGFyZTooZnVuIChrMSwgXykgKGsyLCBfKSAtPiB0Lmhhc2hhYmxlLmNvbXBhcmUgazEgazIpXG4gIHw+IHNleHBfb2ZfbGlzdCAoc2V4cF9vZl9wYWlyIHNleHBfb2Zfa2V5IHNleHBfb2ZfZGF0YSlcbjs7XG5cbmxldCB0X29mX3NleHAgfmhhc2hhYmxlIGtfb2Zfc2V4cCBkX29mX3NleHAgc2V4cCA9XG4gIGxldCBhbGlzdCA9IGxpc3Rfb2Zfc2V4cCAocGFpcl9vZl9zZXhwIGtfb2Zfc2V4cCBkX29mX3NleHApIHNleHAgaW5cbiAgbWF0Y2ggb2ZfYWxpc3Qgfmhhc2hhYmxlIGFsaXN0IH5zaXplOihMaXN0Lmxlbmd0aCBhbGlzdCkgd2l0aFxuICB8IGBPayB2IC0+IHZcbiAgfCBgRHVwbGljYXRlX2tleSBrIC0+XG4gICAgKCogZmluZCB0aGUgc2V4cCBvZiBhIGR1cGxpY2F0ZSBrZXksIHNvIHRoZSBlcnJvciBpcyBuYXJyb3dlZCB0byBhIGtleSBhbmQgbm90XG4gICAgICAgdGhlIHdob2xlIG1hcCAqKVxuICAgIGxldCBhbGlzdF9zZXhwcyA9IGxpc3Rfb2Zfc2V4cCAocGFpcl9vZl9zZXhwIEZuLmlkIEZuLmlkKSBzZXhwIGluXG4gICAgbGV0IGZvdW5kX2ZpcnN0X2sgPSByZWYgZmFsc2UgaW5cbiAgICBMaXN0Lml0ZXIyX2V4biBhbGlzdCBhbGlzdF9zZXhwcyB+ZjooZnVuIChrMiwgXykgKGsyX3NleHAsIF8pIC0+XG4gICAgICBpZiBoYXNoYWJsZS5jb21wYXJlIGsgazIgPSAwXG4gICAgICB0aGVuXG4gICAgICAgIGlmICFmb3VuZF9maXJzdF9rXG4gICAgICAgIHRoZW4gb2Zfc2V4cF9lcnJvciBcIkhhc2h0YmwudF9vZl9zZXhwOiBkdXBsaWNhdGUga2V5XCIgazJfc2V4cFxuICAgICAgICBlbHNlIGZvdW5kX2ZpcnN0X2sgOj0gdHJ1ZSk7XG4gICAgYXNzZXJ0IGZhbHNlXG47O1xuXG5sZXQgdF9zZXhwX2dyYW1tYXJcbiAgICAgICh0eXBlIGsgdilcbiAgICAgIChrX2dyYW1tYXIgOiBrIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgICAgKHZfZ3JhbW1hciA6IHYgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpXG4gIDogKGssIHYpIHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnRcbiAgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChMaXN0LkFzc29jLnRfc2V4cF9ncmFtbWFyIGtfZ3JhbW1hciB2X2dyYW1tYXIpXG47O1xuXG5sZXQga2V5cyB0ID0gZm9sZCB0IH5pbml0OltdIH5mOihmdW4gfmtleSB+ZGF0YTpfIGFjYyAtPiBrZXkgOjogYWNjKVxubGV0IGRhdGEgdCA9IGZvbGQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgbGlzdCAtPiBkYXRhIDo6IGxpc3QpIH5pbml0OltdIHRcblxubGV0IGFkZF90b19ncm91cHMgZ3JvdXBzIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSB+cm93cyA9XG4gIExpc3QuaXRlciByb3dzIH5mOihmdW4gcm93IC0+XG4gICAgbGV0IGtleSA9IGdldF9rZXkgcm93IGluXG4gICAgbGV0IGRhdGEgPSBnZXRfZGF0YSByb3cgaW5cbiAgICBsZXQgZGF0YSA9XG4gICAgICBtYXRjaCBmaW5kIGdyb3VwcyBrZXkgd2l0aFxuICAgICAgfCBOb25lIC0+IGRhdGFcbiAgICAgIHwgU29tZSBvbGQgLT4gY29tYmluZSBvbGQgZGF0YVxuICAgIGluXG4gICAgc2V0IGdyb3VwcyB+a2V5IH5kYXRhKVxuOztcblxubGV0IGdyb3VwID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIHJvd3MgPVxuICBsZXQgcmVzID0gY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgKCkgaW5cbiAgYWRkX3RvX2dyb3VwcyByZXMgfmdldF9rZXkgfmdldF9kYXRhIH5jb21iaW5lIH5yb3dzO1xuICByZXNcbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSByb3dzID1cbiAgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IH5nZXRfZGF0YTpGbi5pZCByb3dzXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgfmdldF9rZXkgcm93cyA9XG4gIG1hdGNoIGNyZWF0ZV93aXRoX2tleSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmhhc2hhYmxlIH5nZXRfa2V5IHJvd3Mgd2l0aFxuICB8IGBPayB0IC0+IFJlc3VsdC5PayB0XG4gIHwgYER1cGxpY2F0ZV9rZXlzIGtleXMgLT5cbiAgICBsZXQgc2V4cF9vZl9rZXkgPSBoYXNoYWJsZS5IYXNoYWJsZS5zZXhwX29mX3QgaW5cbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcIkhhc2h0YmwuY3JlYXRlX3dpdGhfa2V5OiBkdXBsaWNhdGUga2V5c1wiXG4gICAgICAgICBbIFwia2V5c1wiLCBzZXhwX29mX2xpc3Qgc2V4cF9vZl9rZXkga2V5cyBdKVxuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleV9leG4gP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSByb3dzID1cbiAgT3JfZXJyb3Iub2tfZXhuIChjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5oYXNoYWJsZSB+Z2V0X2tleSByb3dzKVxuOztcblxubGV0IG1lcmdlID1cbiAgbGV0IG1heWJlX3NldCB0IH5rZXkgfmYgZCA9XG4gICAgbWF0Y2ggZiB+a2V5IGQgd2l0aFxuICAgIHwgTm9uZSAtPiAoKVxuICAgIHwgU29tZSB2IC0+IHNldCB0IH5rZXkgfmRhdGE6dlxuICBpblxuICBmdW4gdF9sZWZ0IHRfcmlnaHQgfmYgLT5cbiAgICBpZiBub3QgKEhhc2hhYmxlLmVxdWFsIHRfbGVmdC5oYXNoYWJsZSB0X3JpZ2h0Lmhhc2hhYmxlKVxuICAgIHRoZW4gaW52YWxpZF9hcmcgXCJIYXNodGJsLm1lcmdlOiBkaWZmZXJlbnQgJ2hhc2hhYmxlJyB2YWx1ZXNcIjtcbiAgICBsZXQgbmV3X3QgPVxuICAgICAgY3JlYXRlXG4gICAgICAgIH5ncm93dGhfYWxsb3dlZDp0X2xlZnQuZ3Jvd3RoX2FsbG93ZWRcbiAgICAgICAgfmhhc2hhYmxlOnRfbGVmdC5oYXNoYWJsZVxuICAgICAgICB+c2l6ZTp0X2xlZnQubGVuZ3RoXG4gICAgICAgICgpXG4gICAgaW5cbiAgICB3aXRob3V0X211dGF0aW5nIHRfbGVmdCAoZnVuICgpIC0+XG4gICAgICB3aXRob3V0X211dGF0aW5nIHRfcmlnaHQgKGZ1biAoKSAtPlxuICAgICAgICBpdGVyaSB0X2xlZnQgfmY6KGZ1biB+a2V5IH5kYXRhOmxlZnQgLT5cbiAgICAgICAgICBtYXRjaCBmaW5kIHRfcmlnaHQga2V5IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gbWF5YmVfc2V0IG5ld190IH5rZXkgfmYgKGBMZWZ0IGxlZnQpXG4gICAgICAgICAgfCBTb21lIHJpZ2h0IC0+IG1heWJlX3NldCBuZXdfdCB+a2V5IH5mIChgQm90aCAobGVmdCwgcmlnaHQpKSk7XG4gICAgICAgIGl0ZXJpIHRfcmlnaHQgfmY6KGZ1biB+a2V5IH5kYXRhOnJpZ2h0IC0+XG4gICAgICAgICAgbWF0Y2ggZmluZCB0X2xlZnQga2V5IHdpdGhcbiAgICAgICAgICB8IE5vbmUgLT4gbWF5YmVfc2V0IG5ld190IH5rZXkgfmYgKGBSaWdodCByaWdodClcbiAgICAgICAgICB8IFNvbWUgXyAtPiAoKVxuICAgICAgICAgICgqIGFscmVhZHkgZG9uZSBhYm92ZSAqKSkpKTtcbiAgICBuZXdfdFxuOztcblxubGV0IG1lcmdlX2ludG8gfnNyYyB+ZHN0IH5mID1cbiAgaXRlcmkgc3JjIH5mOihmdW4gfmtleSB+ZGF0YSAtPlxuICAgIGxldCBkc3RfZGF0YSA9IGZpbmQgZHN0IGtleSBpblxuICAgIGxldCBhY3Rpb24gPSB3aXRob3V0X211dGF0aW5nIGRzdCAoZnVuICgpIC0+IGYgfmtleSBkYXRhIGRzdF9kYXRhKSBpblxuICAgIG1hdGNoIChhY3Rpb24gOiBfIE1lcmdlX2ludG9fYWN0aW9uLnQpIHdpdGhcbiAgICB8IFJlbW92ZSAtPiByZW1vdmUgZHN0IGtleVxuICAgIHwgU2V0X3RvIGRhdGEgLT5cbiAgICAgIChtYXRjaCBkc3RfZGF0YSB3aXRoXG4gICAgICAgfCBOb25lIC0+IHNldCBkc3QgfmtleSB+ZGF0YVxuICAgICAgIHwgU29tZSBkc3RfZGF0YSAtPiBpZiBub3QgKHBoeXNfZXF1YWwgZHN0X2RhdGEgZGF0YSkgdGhlbiBzZXQgZHN0IH5rZXkgfmRhdGEpKVxuOztcblxubGV0IGZpbHRlcmlfaW5wbGFjZSB0IH5mID1cbiAgbGV0IHRvX3JlbW92ZSA9XG4gICAgZm9sZCB0IH5pbml0OltdIH5mOihmdW4gfmtleSB+ZGF0YSBhYyAtPiBpZiBmIH5rZXkgfmRhdGEgdGhlbiBhYyBlbHNlIGtleSA6OiBhYylcbiAgaW5cbiAgTGlzdC5pdGVyIHRvX3JlbW92ZSB+ZjooZnVuIGtleSAtPiByZW1vdmUgdCBrZXkpXG47O1xuXG5sZXQgZmlsdGVyX2lucGxhY2UgdCB+ZiA9IGZpbHRlcmlfaW5wbGFjZSB0IH5mOihmdW4gfmtleTpfIH5kYXRhIC0+IGYgZGF0YSlcbmxldCBmaWx0ZXJfa2V5c19pbnBsYWNlIHQgfmYgPSBmaWx0ZXJpX2lucGxhY2UgdCB+ZjooZnVuIH5rZXkgfmRhdGE6XyAtPiBmIGtleSlcblxubGV0IGZpbHRlcl9tYXBpX2lucGxhY2UgdCB+ZiA9XG4gIGxldCBtYXBfcmVzdWx0cyA9IGZvbGQgdCB+aW5pdDpbXSB+ZjooZnVuIH5rZXkgfmRhdGEgYWMgLT4gKGtleSwgZiB+a2V5IH5kYXRhKSA6OiBhYykgaW5cbiAgTGlzdC5pdGVyIG1hcF9yZXN1bHRzIH5mOihmdW4gKGtleSwgcmVzdWx0KSAtPlxuICAgIG1hdGNoIHJlc3VsdCB3aXRoXG4gICAgfCBOb25lIC0+IHJlbW92ZSB0IGtleVxuICAgIHwgU29tZSBkYXRhIC0+IHNldCB0IH5rZXkgfmRhdGEpXG47O1xuXG5sZXQgZmlsdGVyX21hcF9pbnBsYWNlIHQgfmYgPSBmaWx0ZXJfbWFwaV9pbnBsYWNlIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuXG5sZXQgbWFwaV9pbnBsYWNlIHQgfmYgPVxuICBlbnN1cmVfbXV0YXRpb25fYWxsb3dlZCB0O1xuICB3aXRob3V0X211dGF0aW5nIHQgKGZ1biAoKSAtPiBBcnJheS5pdGVyIHQudGFibGUgfmY6KEF2bHRyZWUubWFwaV9pbnBsYWNlIH5mKSlcbjs7XG5cbmxldCBtYXBfaW5wbGFjZSB0IH5mID0gbWFwaV9pbnBsYWNlIHQgfmY6KGZ1biB+a2V5Ol8gfmRhdGEgLT4gZiBkYXRhKVxuXG5sZXQgZXF1YWwgZXF1YWwgdCB0JyA9XG4gIGxlbmd0aCB0ID0gbGVuZ3RoIHQnXG4gICYmIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgIHdpdGhvdXRfbXV0YXRpbmcgdCcgKGZ1biAoKSAtPlxuICAgICAgaXRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGEgLT5cbiAgICAgICAgbWF0Y2ggZmluZCB0JyBrZXkgd2l0aFxuICAgICAgICB8IE5vbmUgLT4gci5yZXR1cm4gZmFsc2VcbiAgICAgICAgfCBTb21lIGRhdGEnIC0+IGlmIG5vdCAoZXF1YWwgZGF0YSBkYXRhJykgdGhlbiByLnJldHVybiBmYWxzZSkpO1xuICAgIHRydWUpXG47O1xuXG5sZXQgc2ltaWxhciA9IGVxdWFsXG5cbm1vZHVsZSBBY2Nlc3NvcnMgPSBzdHJ1Y3RcbiAgbGV0IGludmFyaWFudCA9IGludmFyaWFudFxuICBsZXQgY2hvb3NlID0gY2hvb3NlXG4gIGxldCBjaG9vc2VfZXhuID0gY2hvb3NlX2V4blxuICBsZXQgY2xlYXIgPSBjbGVhclxuICBsZXQgY29weSA9IGNvcHlcbiAgbGV0IHJlbW92ZSA9IHJlbW92ZVxuICBsZXQgc2V0ID0gc2V0XG4gIGxldCBhZGQgPSBhZGRcbiAgbGV0IGFkZF9leG4gPSBhZGRfZXhuXG4gIGxldCBjaGFuZ2UgPSBjaGFuZ2VcbiAgbGV0IHVwZGF0ZSA9IHVwZGF0ZVxuICBsZXQgdXBkYXRlX2FuZF9yZXR1cm4gPSB1cGRhdGVfYW5kX3JldHVyblxuICBsZXQgYWRkX211bHRpID0gYWRkX211bHRpXG4gIGxldCByZW1vdmVfbXVsdGkgPSByZW1vdmVfbXVsdGlcbiAgbGV0IGZpbmRfbXVsdGkgPSBmaW5kX211bHRpXG4gIGxldCBtZW0gPSBtZW1cbiAgbGV0IGl0ZXJfa2V5cyA9IGl0ZXJfa2V5c1xuICBsZXQgaXRlciA9IGl0ZXJcbiAgbGV0IGl0ZXJpID0gaXRlcmlcbiAgbGV0IGV4aXN0cyA9IGV4aXN0c1xuICBsZXQgZXhpc3RzaSA9IGV4aXN0c2lcbiAgbGV0IGZvcl9hbGwgPSBmb3JfYWxsXG4gIGxldCBmb3JfYWxsaSA9IGZvcl9hbGxpXG4gIGxldCBjb3VudCA9IGNvdW50XG4gIGxldCBjb3VudGkgPSBjb3VudGlcbiAgbGV0IGZvbGQgPSBmb2xkXG4gIGxldCBsZW5ndGggPSBsZW5ndGhcbiAgbGV0IGlzX2VtcHR5ID0gaXNfZW1wdHlcbiAgbGV0IG1hcCA9IG1hcFxuICBsZXQgbWFwaSA9IG1hcGlcbiAgbGV0IGZpbHRlcl9tYXAgPSBmaWx0ZXJfbWFwXG4gIGxldCBmaWx0ZXJfbWFwaSA9IGZpbHRlcl9tYXBpXG4gIGxldCBmaWx0ZXJfa2V5cyA9IGZpbHRlcl9rZXlzXG4gIGxldCBmaWx0ZXIgPSBmaWx0ZXJcbiAgbGV0IGZpbHRlcmkgPSBmaWx0ZXJpXG4gIGxldCBwYXJ0aXRpb25fbWFwID0gcGFydGl0aW9uX21hcFxuICBsZXQgcGFydGl0aW9uX21hcGkgPSBwYXJ0aXRpb25fbWFwaVxuICBsZXQgcGFydGl0aW9uX3RmID0gcGFydGl0aW9uX3RmXG4gIGxldCBwYXJ0aXRpb25pX3RmID0gcGFydGl0aW9uaV90ZlxuICBsZXQgZmluZF9vcl9hZGQgPSBmaW5kX29yX2FkZFxuICBsZXQgZmluZGlfb3JfYWRkID0gZmluZGlfb3JfYWRkXG4gIGxldCBmaW5kID0gZmluZFxuICBsZXQgZmluZF9leG4gPSBmaW5kX2V4blxuICBsZXQgZmluZF9hbmRfY2FsbCA9IGZpbmRfYW5kX2NhbGxcbiAgbGV0IGZpbmRfYW5kX2NhbGwxID0gZmluZF9hbmRfY2FsbDFcbiAgbGV0IGZpbmRfYW5kX2NhbGwyID0gZmluZF9hbmRfY2FsbDJcbiAgbGV0IGZpbmRpX2FuZF9jYWxsID0gZmluZGlfYW5kX2NhbGxcbiAgbGV0IGZpbmRpX2FuZF9jYWxsMSA9IGZpbmRpX2FuZF9jYWxsMVxuICBsZXQgZmluZGlfYW5kX2NhbGwyID0gZmluZGlfYW5kX2NhbGwyXG4gIGxldCBmaW5kX2FuZF9yZW1vdmUgPSBmaW5kX2FuZF9yZW1vdmVcbiAgbGV0IHRvX2FsaXN0ID0gdG9fYWxpc3RcbiAgbGV0IG1lcmdlID0gbWVyZ2VcbiAgbGV0IG1lcmdlX2ludG8gPSBtZXJnZV9pbnRvXG4gIGxldCBrZXlzID0ga2V5c1xuICBsZXQgZGF0YSA9IGRhdGFcbiAgbGV0IGZpbHRlcl9rZXlzX2lucGxhY2UgPSBmaWx0ZXJfa2V5c19pbnBsYWNlXG4gIGxldCBmaWx0ZXJfaW5wbGFjZSA9IGZpbHRlcl9pbnBsYWNlXG4gIGxldCBmaWx0ZXJpX2lucGxhY2UgPSBmaWx0ZXJpX2lucGxhY2VcbiAgbGV0IG1hcF9pbnBsYWNlID0gbWFwX2lucGxhY2VcbiAgbGV0IG1hcGlfaW5wbGFjZSA9IG1hcGlfaW5wbGFjZVxuICBsZXQgZmlsdGVyX21hcF9pbnBsYWNlID0gZmlsdGVyX21hcF9pbnBsYWNlXG4gIGxldCBmaWx0ZXJfbWFwaV9pbnBsYWNlID0gZmlsdGVyX21hcGlfaW5wbGFjZVxuICBsZXQgZXF1YWwgPSBlcXVhbFxuICBsZXQgc2ltaWxhciA9IHNpbWlsYXJcbiAgbGV0IGluY3IgPSBpbmNyXG4gIGxldCBkZWNyID0gZGVjclxuICBsZXQgc2V4cF9vZl9rZXkgPSBzZXhwX29mX2tleVxuZW5kXG5cbm1vZHVsZSBDcmVhdG9ycyAoS2V5IDogc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgaGFzaGFibGUgOiAnYSB0IEhhc2hhYmxlLnRcbiAgZW5kKSA6IHNpZ1xuICB0eXBlICgnYSwgJ2IpIHRfID0gKCdhIEtleS50LCAnYikgdFxuXG4gIHZhbCB0X29mX3NleHAgOiAoU2V4cC50IC0+ICdhIEtleS50KSAtPiAoU2V4cC50IC0+ICdiKSAtPiBTZXhwLnQgLT4gKCdhLCAnYikgdF9cblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnNfZ2VuZXJpY1xuICAgIHdpdGggdHlwZSAoJ2EsICdiKSB0IDo9ICgnYSwgJ2IpIHRfXG4gICAgd2l0aCB0eXBlICdhIGtleSA6PSAnYSBLZXkudFxuICAgIHdpdGggdHlwZSAoJ2tleSwgJ2RhdGEsICdhKSBjcmVhdGVfb3B0aW9ucyA6PVxuICAgICAgKCdrZXksICdkYXRhLCAnYSkgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcbmVuZCA9IHN0cnVjdFxuICBsZXQgaGFzaGFibGUgPSBLZXkuaGFzaGFibGVcblxuICB0eXBlICgnYSwgJ2IpIHRfID0gKCdhIEtleS50LCAnYikgdFxuXG4gIGxldCBjcmVhdGUgP2dyb3d0aF9hbGxvd2VkID9zaXplICgpID0gY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+aGFzaGFibGUgKClcbiAgbGV0IG9mX2FsaXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsID0gb2ZfYWxpc3QgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSBsXG5cbiAgbGV0IG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9XG4gICAgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgbFxuICA7O1xuXG4gIGxldCBvZl9hbGlzdF9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9XG4gICAgb2ZfYWxpc3Rfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkIH5oYXNoYWJsZSA/c2l6ZSBsXG4gIDs7XG5cbiAgbGV0IG9mX2FsaXN0X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9XG4gICAgb2ZfYWxpc3RfZXhuID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgbFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAga19vZl9zZXhwIGRfb2Zfc2V4cCBzZXhwID0gdF9vZl9zZXhwIH5oYXNoYWJsZSBrX29mX3NleHAgZF9vZl9zZXhwIHNleHBcblxuICBsZXQgb2ZfYWxpc3RfbXVsdGkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGwgPVxuICAgIG9mX2FsaXN0X211bHRpID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgbFxuICA7O1xuXG4gIGxldCBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSB+Z2V0X2RhdGEgbCA9XG4gICAgY3JlYXRlX21hcHBlZCA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSBsXG4gIDs7XG5cbiAgbGV0IGNyZWF0ZV93aXRoX2tleSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbCA9XG4gICAgY3JlYXRlX3dpdGhfa2V5ID9ncm93dGhfYWxsb3dlZCB+aGFzaGFibGUgP3NpemUgfmdldF9rZXkgbFxuICA7O1xuXG4gIGxldCBjcmVhdGVfd2l0aF9rZXlfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IGwgPVxuICAgIGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIH5nZXRfa2V5IGxcbiAgOztcblxuICBsZXQgY3JlYXRlX3dpdGhfa2V5X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbCA9XG4gICAgY3JlYXRlX3dpdGhfa2V5X2V4biA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIH5nZXRfa2V5IGxcbiAgOztcblxuICBsZXQgZ3JvdXAgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSBsID1cbiAgICBncm91cCA/Z3Jvd3RoX2FsbG93ZWQgfmhhc2hhYmxlID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSBsXG4gIDs7XG5lbmRcblxubW9kdWxlIFBvbHkgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgKCdhLCAnYikgdCA9ICgnYSwgJ2IpIHRcbiAgdHlwZSAnYSBrZXkgPSAnYVxuXG4gIGxldCBoYXNoYWJsZSA9IEhhc2hhYmxlLnBvbHlcblxuICBpbmNsdWRlIENyZWF0b3JzIChzdHJ1Y3RcbiAgICAgIHR5cGUgJ2EgdCA9ICdhXG5cbiAgICAgIGxldCBoYXNoYWJsZSA9IGhhc2hhYmxlXG4gICAgZW5kKVxuXG4gIGluY2x1ZGUgQWNjZXNzb3JzXG5cbiAgbGV0IHNleHBfb2ZfdCA9IHNleHBfb2ZfdFxuICBsZXQgdF9zZXhwX2dyYW1tYXIgPSB0X3NleHBfZ3JhbW1hclxuZW5kXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIG1vZHVsZSB0eXBlIENyZWF0b3JzX2dlbmVyaWMgPSBDcmVhdG9yc19nZW5lcmljXG4gIG1vZHVsZSB0eXBlIEhhc2hhYmxlID0gSGFzaGFibGUuSGFzaGFibGVcblxuICB0eXBlIG5vbnJlYyAoJ2tleSwgJ2RhdGEsICd6KSBjcmVhdGVfb3B0aW9uc193aXRob3V0X2ZpcnN0X2NsYXNzX21vZHVsZSA9XG4gICAgKCdrZXksICdkYXRhLCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcblxuICBsZXQgaGFzaGFibGUgdCA9IHQuaGFzaGFibGVcbmVuZFxuXG5sZXQgY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtID1cbiAgY3JlYXRlIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSAoKVxuOztcblxubGV0IG9mX2FsaXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBvZl9hbGlzdCB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbFxuOztcblxubGV0IG9mX2FsaXN0X3JlcG9ydF9hbGxfZHVwcyA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgb2ZfYWxpc3RfcmVwb3J0X2FsbF9kdXBzIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsXG47O1xuXG5sZXQgb2ZfYWxpc3Rfb3JfZXJyb3IgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gbCA9XG4gIG9mX2FsaXN0X29yX2Vycm9yIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBsXG47O1xuXG5sZXQgb2ZfYWxpc3RfZXhuID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBvZl9hbGlzdF9leG4gfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGxcbjs7XG5cbmxldCBvZl9hbGlzdF9tdWx0aSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSBsID1cbiAgb2ZfYWxpc3RfbXVsdGkgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIGxcbjs7XG5cbmxldCBjcmVhdGVfbWFwcGVkID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIH5nZXRfa2V5IH5nZXRfZGF0YSBsID1cbiAgY3JlYXRlX21hcHBlZCB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgfmdldF9kYXRhIGxcbjs7XG5cbmxldCBjcmVhdGVfd2l0aF9rZXkgP2dyb3d0aF9hbGxvd2VkID9zaXplIG0gfmdldF9rZXkgbCA9XG4gIGNyZWF0ZV93aXRoX2tleSB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbFxuOztcblxubGV0IGNyZWF0ZV93aXRoX2tleV9vcl9lcnJvciA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSB+Z2V0X2tleSBsID1cbiAgY3JlYXRlX3dpdGhfa2V5X29yX2Vycm9yIH5oYXNoYWJsZTooSGFzaGFibGUub2Zfa2V5IG0pID9ncm93dGhfYWxsb3dlZCA/c2l6ZSB+Z2V0X2tleSBsXG47O1xuXG5sZXQgY3JlYXRlX3dpdGhfa2V5X2V4biA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSB+Z2V0X2tleSBsID1cbiAgY3JlYXRlX3dpdGhfa2V5X2V4biB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSBtKSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgfmdldF9rZXkgbFxuOztcblxubGV0IGdyb3VwID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSBsID1cbiAgZ3JvdXAgfmhhc2hhYmxlOihIYXNoYWJsZS5vZl9rZXkgbSkgP2dyb3d0aF9hbGxvd2VkID9zaXplIH5nZXRfa2V5IH5nZXRfZGF0YSB+Y29tYmluZSBsXG47O1xuXG5sZXQgaGFzaGFibGVfcyB0ID0gSGFzaGFibGUudG9fa2V5IHQuaGFzaGFibGVcblxubW9kdWxlIE0gKEsgOiBULlQpID0gc3RydWN0XG4gIHR5cGUgbm9ucmVjICd2IHQgPSAoSy50LCAndikgdFxuZW5kXG5cbm1vZHVsZSB0eXBlIFNleHBfb2ZfbSA9IHNpZ1xuICB0eXBlIHQgW0BAZGVyaXZpbmdfaW5saW5lIHNleHBfb2ZdXG5cbiAgdmFsIHNleHBfb2ZfdCA6IHQgLT4gU2V4cGxpYjAuU2V4cC50XG5cbiAgW0BAQGVuZF1cbmVuZFxuXG5tb2R1bGUgdHlwZSBNX29mX3NleHAgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBvZl9zZXhwXVxuXG4gIHZhbCB0X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdFxuXG4gIFtAQEBlbmRdXG5cbiAgaW5jbHVkZSBLZXkuUyB3aXRoIHR5cGUgdCA6PSB0XG5lbmRcblxubW9kdWxlIHR5cGUgTV9zZXhwX2dyYW1tYXIgPSBzaWdcbiAgdHlwZSB0IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX2dyYW1tYXJdXG5cbiAgdmFsIHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudFxuXG4gIFtAQEBlbmRdXG5lbmRcblxubW9kdWxlIHR5cGUgRXF1YWxfbSA9IHNpZyBlbmRcblxubGV0IHNleHBfb2ZfbV9fdCAodHlwZSBrKSAobW9kdWxlIEsgOiBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSBrKSBzZXhwX29mX3YgdCA9XG4gIHNleHBfb2ZfdCBLLnNleHBfb2ZfdCBzZXhwX29mX3YgdFxuOztcblxubGV0IG1fX3Rfb2Zfc2V4cCAodHlwZSBrKSAobW9kdWxlIEsgOiBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSBrKSB2X29mX3NleHAgc2V4cCA9XG4gIHRfb2Zfc2V4cCB+aGFzaGFibGU6KEhhc2hhYmxlLm9mX2tleSAobW9kdWxlIEspKSBLLnRfb2Zfc2V4cCB2X29mX3NleHAgc2V4cFxuOztcblxubGV0IG1fX3Rfc2V4cF9ncmFtbWFyICh0eXBlIGspIChtb2R1bGUgSyA6IE1fc2V4cF9ncmFtbWFyIHdpdGggdHlwZSB0ID0gaykgdl9ncmFtbWFyID1cbiAgdF9zZXhwX2dyYW1tYXIgSy50X3NleHBfZ3JhbW1hciB2X2dyYW1tYXJcbjs7XG5cbmxldCBlcXVhbF9tX190IChtb2R1bGUgXyA6IEVxdWFsX20pIGVxdWFsX3YgdDEgdDIgPSBlcXVhbCBlcXVhbF92IHQxIHQyXG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgSGFzaF9zZXRfaW50ZlxuXG5sZXQgaGFzaGFibGVfcyA9IEhhc2h0YmwuaGFzaGFibGVfc1xubGV0IGhhc2hhYmxlID0gSGFzaHRibC5Qcml2YXRlLmhhc2hhYmxlXG5sZXQgcG9seV9oYXNoYWJsZSA9IEhhc2h0YmwuUG9seS5oYXNoYWJsZVxubGV0IHdpdGhfcmV0dXJuID0gV2l0aF9yZXR1cm4ud2l0aF9yZXR1cm5cblxudHlwZSAnYSB0ID0gKCdhLCB1bml0KSBIYXNodGJsLnRcbnR5cGUgJ2EgaGFzaF9zZXQgPSAnYSB0XG50eXBlICdhIGVsdCA9ICdhXG5cbm1vZHVsZSBBY2Nlc3NvcnMgPSBzdHJ1Y3RcbiAgbGV0IGhhc2hhYmxlID0gaGFzaGFibGVcbiAgbGV0IGNsZWFyID0gSGFzaHRibC5jbGVhclxuICBsZXQgbGVuZ3RoID0gSGFzaHRibC5sZW5ndGhcbiAgbGV0IG1lbSA9IEhhc2h0YmwubWVtXG4gIGxldCBpc19lbXB0eSB0ID0gSGFzaHRibC5pc19lbXB0eSB0XG5cbiAgbGV0IGZpbmRfbWFwIHQgfmYgPVxuICAgIHdpdGhfcmV0dXJuIChmdW4gciAtPlxuICAgICAgSGFzaHRibC5pdGVyX2tleXMgdCB+ZjooZnVuIGVsdCAtPlxuICAgICAgICBtYXRjaCBmIGVsdCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICB8IFNvbWUgXyBhcyBvIC0+IHIucmV0dXJuIG8pO1xuICAgICAgTm9uZSlcbiAgOztcblxuICBsZXQgZmluZCB0IH5mID0gZmluZF9tYXAgdCB+ZjooZnVuIGEgLT4gaWYgZiBhIHRoZW4gU29tZSBhIGVsc2UgTm9uZSlcbiAgbGV0IGFkZCB0IGsgPSBIYXNodGJsLnNldCB0IH5rZXk6ayB+ZGF0YTooKVxuXG4gIGxldCBzdHJpY3RfYWRkIHQgayA9XG4gICAgaWYgbWVtIHQga1xuICAgIHRoZW4gT3JfZXJyb3IuZXJyb3Jfc3RyaW5nIFwiZWxlbWVudCBhbHJlYWR5IGV4aXN0c1wiXG4gICAgZWxzZSAoXG4gICAgICBIYXNodGJsLnNldCB0IH5rZXk6ayB+ZGF0YTooKTtcbiAgICAgIFJlc3VsdC5PayAoKSlcbiAgOztcblxuICBsZXQgc3RyaWN0X2FkZF9leG4gdCBrID0gT3JfZXJyb3Iub2tfZXhuIChzdHJpY3RfYWRkIHQgaylcbiAgbGV0IHJlbW92ZSA9IEhhc2h0YmwucmVtb3ZlXG5cbiAgbGV0IHN0cmljdF9yZW1vdmUgdCBrID1cbiAgICBpZiBtZW0gdCBrXG4gICAgdGhlbiAoXG4gICAgICByZW1vdmUgdCBrO1xuICAgICAgUmVzdWx0Lk9rICgpKVxuICAgIGVsc2UgT3JfZXJyb3IuZXJyb3IgXCJlbGVtZW50IG5vdCBpbiBzZXRcIiBrIChIYXNodGJsLnNleHBfb2Zfa2V5IHQpXG4gIDs7XG5cbiAgbGV0IHN0cmljdF9yZW1vdmVfZXhuIHQgayA9IE9yX2Vycm9yLm9rX2V4biAoc3RyaWN0X3JlbW92ZSB0IGspXG4gIGxldCBmb2xkIHQgfmluaXQgfmYgPSBIYXNodGJsLmZvbGQgdCB+aW5pdCB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgYWNjIC0+IGYgYWNjIGtleSlcbiAgbGV0IGl0ZXIgdCB+ZiA9IEhhc2h0YmwuaXRlcl9rZXlzIHQgfmZcbiAgbGV0IGNvdW50IHQgfmYgPSBDb250YWluZXIuY291bnQgfmZvbGQgdCB+ZlxuICBsZXQgc3VtIG0gdCB+ZiA9IENvbnRhaW5lci5zdW0gfmZvbGQgbSB0IH5mXG4gIGxldCBtaW5fZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWluX2VsdCB+Zm9sZCB0IH5jb21wYXJlXG4gIGxldCBtYXhfZWx0IHQgfmNvbXBhcmUgPSBDb250YWluZXIubWF4X2VsdCB+Zm9sZCB0IH5jb21wYXJlXG4gIGxldCBmb2xkX3Jlc3VsdCB0IH5pbml0IH5mID0gQ29udGFpbmVyLmZvbGRfcmVzdWx0IH5mb2xkIH5pbml0IH5mIHRcbiAgbGV0IGZvbGRfdW50aWwgdCB+aW5pdCB+ZiA9IENvbnRhaW5lci5mb2xkX3VudGlsIH5mb2xkIH5pbml0IH5mIHRcbiAgbGV0IHRvX2xpc3QgPSBIYXNodGJsLmtleXNcblxuICBsZXQgc2V4cF9vZl90IHNleHBfb2ZfZSB0ID1cbiAgICBzZXhwX29mX2xpc3Qgc2V4cF9vZl9lICh0b19saXN0IHQgfD4gTGlzdC5zb3J0IH5jb21wYXJlOihoYXNoYWJsZSB0KS5jb21wYXJlKVxuICA7O1xuXG4gIGxldCB0b19hcnJheSB0ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHQgaW5cbiAgICBsZXQgaW5kZXggPSByZWYgKGxlbiAtIDEpIGluXG4gICAgZm9sZCB0IH5pbml0Olt8fF0gfmY6KGZ1biBhY2Mga2V5IC0+XG4gICAgICBpZiBBcnJheS5sZW5ndGggYWNjID0gMFxuICAgICAgdGhlbiBBcnJheS5jcmVhdGUgfmxlbiBrZXlcbiAgICAgIGVsc2UgKFxuICAgICAgICBpbmRleCA6PSAhaW5kZXggLSAxO1xuICAgICAgICBhY2MuKCFpbmRleCkgPC0ga2V5O1xuICAgICAgICBhY2MpKVxuICA7O1xuXG4gIGxldCBleGlzdHMgdCB+ZiA9IEhhc2h0YmwuZXhpc3RzaSB0IH5mOihmdW4gfmtleSB+ZGF0YTooKSAtPiBmIGtleSlcbiAgbGV0IGZvcl9hbGwgdCB+ZiA9IG5vdCAoSGFzaHRibC5leGlzdHNpIHQgfmY6KGZ1biB+a2V5IH5kYXRhOigpIC0+IG5vdCAoZiBrZXkpKSlcbiAgbGV0IGVxdWFsIHQxIHQyID0gSGFzaHRibC5lcXVhbCAoZnVuICgpICgpIC0+IHRydWUpIHQxIHQyXG4gIGxldCBjb3B5IHQgPSBIYXNodGJsLmNvcHkgdFxuICBsZXQgZmlsdGVyIHQgfmYgPSBIYXNodGJsLmZpbHRlcmkgdCB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgLT4gZiBrZXkpXG4gIGxldCB1bmlvbiB0MSB0MiA9IEhhc2h0YmwubWVyZ2UgdDEgdDIgfmY6KGZ1biB+a2V5Ol8gXyAtPiBTb21lICgpKVxuICBsZXQgZGlmZiB0MSB0MiA9IGZpbHRlciB0MSB+ZjooZnVuIGtleSAtPiBub3QgKEhhc2h0YmwubWVtIHQyIGtleSkpXG5cbiAgbGV0IGludGVyIHQxIHQyID1cbiAgICBsZXQgc21hbGxlciwgbGFyZ2VyID0gaWYgbGVuZ3RoIHQxID4gbGVuZ3RoIHQyIHRoZW4gdDIsIHQxIGVsc2UgdDEsIHQyIGluXG4gICAgSGFzaHRibC5maWx0ZXJpIHNtYWxsZXIgfmY6KGZ1biB+a2V5IH5kYXRhOigpIC0+IEhhc2h0YmwubWVtIGxhcmdlciBrZXkpXG4gIDs7XG5cbiAgbGV0IGZpbHRlcl9pbnBsYWNlIHQgfmYgPVxuICAgIGxldCB0b19yZW1vdmUgPSBmb2xkIHQgfmluaXQ6W10gfmY6KGZ1biBhYyB4IC0+IGlmIGYgeCB0aGVuIGFjIGVsc2UgeCA6OiBhYykgaW5cbiAgICBMaXN0Lml0ZXIgdG9fcmVtb3ZlIH5mOihmdW4geCAtPiByZW1vdmUgdCB4KVxuICA7O1xuXG4gIGxldCBvZl9oYXNodGJsX2tleXMgaGFzaHRibCA9IEhhc2h0YmwubWFwIGhhc2h0YmwgfmY6aWdub3JlXG4gIGxldCB0b19oYXNodGJsIHQgfmYgPSBIYXNodGJsLm1hcGkgdCB+ZjooZnVuIH5rZXkgfmRhdGE6KCkgLT4gZiBrZXkpXG5lbmRcblxuaW5jbHVkZSBBY2Nlc3NvcnNcblxubGV0IGNyZWF0ZSA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbSA9IEhhc2h0YmwuY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtXG5cbmxldCBvZl9saXN0ID9ncm93dGhfYWxsb3dlZCA/c2l6ZSBtIGwgPVxuICBsZXQgc2l6ZSA9XG4gICAgbWF0Y2ggc2l6ZSB3aXRoXG4gICAgfCBTb21lIHggLT4geFxuICAgIHwgTm9uZSAtPiBMaXN0Lmxlbmd0aCBsXG4gIGluXG4gIGxldCB0ID0gSGFzaHRibC5jcmVhdGUgP2dyb3d0aF9hbGxvd2VkIH5zaXplIG0gaW5cbiAgTGlzdC5pdGVyIGwgfmY6KGZ1biBrIC0+IGFkZCB0IGspO1xuICB0XG47O1xuXG5sZXQgdF9vZl9zZXhwIG0gZV9vZl9zZXhwIHNleHAgPVxuICBtYXRjaCBzZXhwIHdpdGhcbiAgfCBTZXhwLkF0b20gXyAtPiBvZl9zZXhwX2Vycm9yIFwiSGFzaF9zZXQudF9vZl9zZXhwIHJlcXVpcmVzIGEgbGlzdFwiIHNleHBcbiAgfCBTZXhwLkxpc3QgbGlzdCAtPlxuICAgIGxldCB0ID0gY3JlYXRlIG0gfnNpemU6KExpc3QubGVuZ3RoIGxpc3QpIGluXG4gICAgTGlzdC5pdGVyIGxpc3QgfmY6KGZ1biBzZXhwIC0+XG4gICAgICBsZXQgZSA9IGVfb2Zfc2V4cCBzZXhwIGluXG4gICAgICBtYXRjaCBzdHJpY3RfYWRkIHQgZSB3aXRoXG4gICAgICB8IE9rICgpIC0+ICgpXG4gICAgICB8IEVycm9yIF8gLT4gb2Zfc2V4cF9lcnJvciBcIkhhc2hfc2V0LnRfb2Zfc2V4cCBnb3QgYSBkdXBsaWNhdGUgZWxlbWVudFwiIHNleHApO1xuICAgIHRcbjs7XG5cbm1vZHVsZSBDcmVhdG9ycyAoRWx0IDogc2lnXG4gICAgdHlwZSAnYSB0XG5cbiAgICB2YWwgaGFzaGFibGUgOiAnYSB0IEhhc2hhYmxlLnRcbiAgZW5kKSA6IHNpZ1xuICB2YWwgdF9vZl9zZXhwIDogKFNleHAudCAtPiAnYSBFbHQudCkgLT4gU2V4cC50IC0+ICdhIEVsdC50IHRcblxuICBpbmNsdWRlXG4gICAgQ3JlYXRvcnNfZ2VuZXJpY1xuICAgIHdpdGggdHlwZSAnYSB0IDo9ICdhIEVsdC50IHRcbiAgICB3aXRoIHR5cGUgJ2EgZWx0IDo9ICdhIEVsdC50XG4gICAgd2l0aCB0eXBlICgnZWx0LCAneikgY3JlYXRlX29wdGlvbnMgOj1cbiAgICAgICgnZWx0LCAneikgY3JlYXRlX29wdGlvbnNfd2l0aG91dF9maXJzdF9jbGFzc19tb2R1bGVcbmVuZCA9IHN0cnVjdFxuICBsZXQgY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSAoKSA9XG4gICAgY3JlYXRlID9ncm93dGhfYWxsb3dlZCA/c2l6ZSAoSGFzaGFibGUudG9fa2V5IEVsdC5oYXNoYWJsZSlcbiAgOztcblxuICBsZXQgb2ZfbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgbCA9XG4gICAgb2ZfbGlzdCA/Z3Jvd3RoX2FsbG93ZWQgP3NpemUgKEhhc2hhYmxlLnRvX2tleSBFbHQuaGFzaGFibGUpIGxcbiAgOztcblxuICBsZXQgdF9vZl9zZXhwIGVfb2Zfc2V4cCBzZXhwID0gdF9vZl9zZXhwIChIYXNoYWJsZS50b19rZXkgRWx0Lmhhc2hhYmxlKSBlX29mX3NleHAgc2V4cFxuZW5kXG5cbm1vZHVsZSBQb2x5ID0gc3RydWN0XG4gIHR5cGUgJ2EgdCA9ICdhIGhhc2hfc2V0XG4gIHR5cGUgJ2EgZWx0ID0gJ2FcblxuICBsZXQgaGFzaGFibGUgPSBwb2x5X2hhc2hhYmxlXG5cbiAgaW5jbHVkZSBDcmVhdG9ycyAoc3RydWN0XG4gICAgICB0eXBlICdhIHQgPSAnYVxuXG4gICAgICBsZXQgaGFzaGFibGUgPSBoYXNoYWJsZVxuICAgIGVuZClcblxuICBpbmNsdWRlIEFjY2Vzc29yc1xuXG4gIGxldCBzZXhwX29mX3QgPSBzZXhwX29mX3RcbiAgbGV0IHRfc2V4cF9ncmFtbWFyIGdyYW1tYXIgPSBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChMaXN0LnRfc2V4cF9ncmFtbWFyIGdyYW1tYXIpXG5lbmRcblxubW9kdWxlIE0gKEVsdCA6IFQuVCkgPSBzdHJ1Y3RcbiAgdHlwZSBub25yZWMgdCA9IEVsdC50IHRcbmVuZFxuXG5sZXQgc2V4cF9vZl9tX190ICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBTZXhwX29mX20gd2l0aCB0eXBlIHQgPSBlbHQpIHQgPVxuICBzZXhwX29mX3QgRWx0LnNleHBfb2ZfdCB0XG47O1xuXG5sZXQgbV9fdF9vZl9zZXhwICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBNX29mX3NleHAgd2l0aCB0eXBlIHQgPSBlbHQpIHNleHAgPVxuICB0X29mX3NleHAgKG1vZHVsZSBFbHQpIEVsdC50X29mX3NleHAgc2V4cFxuOztcblxubGV0IG1fX3Rfc2V4cF9ncmFtbWFyICh0eXBlIGVsdCkgKG1vZHVsZSBFbHQgOiBNX3NleHBfZ3JhbW1hciB3aXRoIHR5cGUgdCA9IGVsdCkgPVxuICBTZXhwbGliMC5TZXhwX2dyYW1tYXIuY29lcmNlIChsaXN0X3NleHBfZ3JhbW1hciBFbHQudF9zZXhwX2dyYW1tYXIpXG47O1xuXG5sZXQgZXF1YWxfbV9fdCAobW9kdWxlIF8gOiBFcXVhbF9tKSB0MSB0MiA9IGVxdWFsIHQxIHQyXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGxldCBoYXNoYWJsZSA9IEhhc2h0YmwuUHJpdmF0ZS5oYXNoYWJsZVxuZW5kXG4iLCJvcGVuISBJbXBvcnRcbm9wZW4hIFByaW50ZlxubW9kdWxlIEJ5dGVzID0gQnl0ZXMwXG5pbmNsdWRlIEZsb2F0MFxuXG5sZXQgcmFpc2VfcyA9IEVycm9yLnJhaXNlX3NcblxubW9kdWxlIFQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gZmxvYXQgW0BAZGVyaXZpbmdfaW5saW5lIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgKGhhc2hfZm9sZF90IDogUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKSA9XG4gICAgaGFzaF9mb2xkX2Zsb2F0XG5cbiAgYW5kIChoYXNoIDogdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gaGFzaF9mbG9hdCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB0X29mX3NleHAgPSAoZmxvYXRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICBsZXQgc2V4cF9vZl90ID0gKHNleHBfb2ZfZmxvYXQgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0ICh0X3NleHBfZ3JhbW1hciA6IHQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID0gZmxvYXRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICBsZXQgaGFzaGFibGUgOiB0IEhhc2hhYmxlLnQgPSB7IGhhc2g7IGNvbXBhcmU7IHNleHBfb2ZfdCB9XG4gIGxldCBjb21wYXJlID0gRmxvYXRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLmNvbXBhcmVcbmVuZFxuXG5pbmNsdWRlIFRcbmluY2x1ZGUgQ29tcGFyYXRvci5NYWtlIChUKVxuXG4oKiBPcGVuIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZSBhZnRlciBpbmNsdWRpbmcgZnVuY3RvciBpbnN0YW50aWF0aW9ucyBzbyB0aGV5IGRvIG5vdFxuICAgc2hhZG93IGl0cyBkZWZpbml0aW9ucy4gVGhpcyBpcyBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uXG4gICBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBtb2R1bGUuICopXG5vcGVuIEZsb2F0X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG5sZXQgaW52YXJpYW50IChfIDogdCkgPSAoKVxubGV0IHRvX2Zsb2F0IHggPSB4XG5sZXQgb2ZfZmxvYXQgeCA9IHhcblxubGV0IG9mX3N0cmluZyBzID1cbiAgdHJ5IGZsb2F0X29mX3N0cmluZyBzIHdpdGhcbiAgfCBfIC0+IGludmFsaWRfYXJnZiBcIkZsb2F0Lm9mX3N0cmluZyAlc1wiIHMgKClcbjs7XG5cbmV4dGVybmFsIGZvcm1hdF9mbG9hdCA6IHN0cmluZyAtPiBmbG9hdCAtPiBzdHJpbmcgPSBcImNhbWxfZm9ybWF0X2Zsb2F0XCJcblxuKCogU3RvbGVuIGZyb20gW3BlcnZhc2l2ZXMubWxdLiAgQWRkcyBhIFwiLlwiIGF0IHRoZSBlbmQgaWYgbmVlZGVkLiAgSXQgaXMgaW5cbiAgIFtwZXJ2YXNpdmVzLm1saV0sIGJ1dCBpdCBhbHNvIHNheXMgbm90IHRvIHVzZSBpdCBkaXJlY3RseSwgc28gd2UgY29weSBhbmQgcGFzdGUgdGhlXG4gICBjb2RlLiBJdCBtYWtlcyB0aGUgYXNzdW1wdGlvbiBvbiB0aGUgc3RyaW5nIHBhc3NlZCBpbiBhcmd1bWVudCB0aGF0IGl0IHdhcyByZXR1cm5lZCBieVxuICAgW2Zvcm1hdF9mbG9hdF0uICopXG5sZXQgdmFsaWRfZmxvYXRfbGV4ZW0gcyA9XG4gIGxldCBsID0gU3RyaW5nLmxlbmd0aCBzIGluXG4gIGxldCByZWMgbG9vcCBpID1cbiAgICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPj0gKSBpIGxcbiAgICB0aGVuIHMgXiBcIi5cIlxuICAgIGVsc2UgKFxuICAgICAgbWF0Y2ggcy5baV0gd2l0aFxuICAgICAgfCAnMCcgLi4gJzknIHwgJy0nIC0+IGxvb3AgKGkgKyAxKVxuICAgICAgfCBfIC0+IHMpXG4gIGluXG4gIGxvb3AgMFxuOztcblxuKCogTGV0IFt5XSBiZSBhIHBvd2VyIG9mIDIuICBUaGVuIHRoZSBuZXh0IHJlcHJlc2VudGFibGUgZmxvYXQgaXM6XG4gICBbeiA9IHkgKiAoMSArIDIgKiogLTUyKV1cbiAgIGFuZCB0aGUgcHJldmlvdXMgb25lIGlzXG4gICBbeCA9IHkgKiAoMSAtIDIgKiogLTUzKV1cblxuICAgSW4gZ2VuZXJhbCwgZXZlcnkgdHdvIGFkamFjZW50IGZsb2F0cyBhcmUgd2l0aGluIGEgZmFjdG9yIG9mIGJldHdlZW4gWzEgKyAyKiotNTNdXG4gICBhbmQgWzEgKyAyKiotNTJdIGZyb20gZWFjaCBvdGhlciwgdGhhdCBpcyB3aXRoaW4gWzEgKyAxLjFlLTE2XSBhbmQgWzEgKyAyLjNlLTE2XS5cblxuICAgU28gaWYgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSBmbG9hdCBzdGFydHMgd2l0aCBcIjFcIiwgdGhlbiBpdHMgYWRqYWNlbnQgZmxvYXRzXG4gICB3aWxsIHVzdWFsbHkgZGlmZmVyIGZyb20gaXQgYnkgMSwgYW5kIHNvbWV0aW1lcyBieSAyLCBhdCB0aGUgMTd0aCBzaWduaWZpY2FudCBkaWdpdFxuICAgKGNvdW50aW5nIGZyb20gMSkuXG5cbiAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBzdGFydHMgd2l0aCBcIjlcIiwgdGhlbiB0aGUgYWRqYWNlbnRcbiAgIGZsb2F0cyB3aWxsIGJlIG9mZiBieSBubyBtb3JlIHRoYW4gMjMgYXQgdGhlIDE2dGggYW5kIDE3dGggc2lnbmlmaWNhbnQgZGlnaXRzLlxuXG4gICBFLmcuOlxuXG4gICB7dlxuICAgICAjIHNwcmludGYgXCIlLjE3Z1wiICgxMDI0LiAqLiAoMS4gLS4gMi4qKiAoLTUzLikpKTs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTExMTExXG4gICAgICAgICAgICAgICAgICAgMTIzNCA1Njc4OTAxMjM0NTY3XG4gICAgIC0gOiBzdHJpbmcgPSBcIjEwMjMuOTk5OTk5OTk5OTk5OVwiXG4gICB2fVxuICAgUHJpbnRpbmcgYSBjb3VwbGUgb2YgZXh0cmEgZGlnaXRzIHJldmVhbHMgdGhhdCB0aGUgZGlmZmVyZW5jZSBpbmRlZWQgaXMgcm91Z2hseSAxMSBhdFxuICAgZGlnaXRzIDE3dGggYW5kIDE4dGggKHRoYXQgaXMsIDEzdGggYW5kIDE0dGggYWZ0ZXIgXCIuXCIpOlxuXG4gICB7dlxuICAgICAjIHNwcmludGYgXCIlLjE5Z1wiICgxMDI0LiAqLiAoMS4gLS4gMi4qKiAoLTUzLikpKTs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTExMTExMTFcbiAgICAgICAgICAgICAgICAgICAxMjM0IDU2Nzg5MDEyMzQ1Njc4OVxuICAgICAtIDogc3RyaW5nID0gXCIxMDIzLjk5OTk5OTk5OTk5OTg4NlwiXG4gICB2fVxuXG4gICBUaGUgdWxwICh0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFkamFjZW50IGZsb2F0cykgaXMgdHdpY2UgYXMgYmlnIG9uIHRoZSBvdGhlciBzaWRlIG9mXG4gICAxMDI0LjpcblxuICAge3ZcbiAgICAgIyBzcHJpbnRmIFwiJS4xOWdcIiAoMTAyNC4gKi4gKDEuICsuIDIuKiogKC01Mi4pKSk7O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTExMTExMTExXG4gICAgICAgICAgICAgICAgICAgMTIzNCA1Njc4OTAxMjM0NTY3ODlcbiAgICAgLSA6IHN0cmluZyA9IFwiMTAyNC4wMDAwMDAwMDAwMDAyMjdcIlxuICAgdn1cblxuICAgTm93IHRha2UgYSBwb3dlciBvZiAyIHdoaWNoIHN0YXJ0cyB3aXRoIDk5OlxuXG4gICB7dlxuICAgICAjIDIuKio5My4gOztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgMTExMTExMTExMVxuICAgICAgICAgICAgICAgICAxIDIzNDU2Nzg5MDEyMzQ1Njc4XG4gICAgIC0gOiBmbG9hdCA9IDkuOTAzNTIwMzE0MjgzMDQyMmUrMjdcblxuICAgICAjIDIuKio5My4gKi4gKDEuICsuIDIuKiogKC01Mi4pKTs7XG4gICAgIC0gOiBmbG9hdCA9IDkuOTAzNTIwMzE0MjgzMDQ0NGUrMjdcblxuICAgICAjIDIuKio5My4gKi4gKDEuIC0uIDIuKiogKC01My4pKTs7XG4gICAgIC0gOiBmbG9hdCA9IDkuOTAzNTIwMzE0MjgzMDQxMWUrMjdcbiAgIHZ9XG5cbiAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMioqOTMgYW5kIGl0cyB0d28gbmVpZ2hib3JzIGlzIHNsaWdodGx5IG1vcmUgdGhhbiwgcmVzcGVjdGl2ZWx5LFxuICAgMSBhbmQgMiBhdCBzaWduaWZpY2FudCBkaWdpdCAxNi5cblxuICAgVGhvc2UgZXhhbXBsZXMgc2hvdyB0aGF0OlxuICAgLSAxNyBzaWduaWZpY2FudCBkaWdpdHMgaXMgYWx3YXlzIHN1ZmZpY2llbnQgdG8gcmVwcmVzZW50IGEgZmxvYXQgd2l0aG91dCBhbWJpZ3VpdHlcbiAgIC0gMTV0aCBzaWduaWZpY2FudCBkaWdpdCBjYW4gYWx3YXlzIGJlIHJlcHJlc2VudGVkIGFjY3VyYXRlbHlcbiAgIC0gY29udmVydGluZyBhIGRlY2ltYWwgbnVtYmVyIHdpdGggMTYgc2lnbmlmaWNhbnQgZGlnaXRzIHRvIGl0cyBuZWFyZXN0IGZsb2F0IGFuZCBiYWNrXG4gICAgIGNhbiBjaGFuZ2UgdGhlIGxhc3QgZGVjaW1hbCBkaWdpdCBieSBubyBtb3JlIHRoYW4gMVxuXG4gICBUbyBtYWtlIHN1cmUgdGhhdCBmbG9hdHMgb2J0YWluZWQgYnkgY29udmVyc2lvbiBmcm9tIGRlY2ltYWwgZnJhY3Rpb25zIChlLmcuIFwiMy4xNFwiKVxuICAgYXJlIHByaW50ZWQgd2l0aG91dCB0cmFpbGluZyBub24temVybyBkaWdpdHMsIG9uZSBzaG91bGQgY2hvb3NlIHRoZSBmaXJzdCBhbW9uZyB0aGVcbiAgICclLjE1ZycsICclLjE2ZycsIGFuZCAnJS4xN2cnIHJlcHJlc2VudGF0aW9ucyB3aGljaCBkb2VzIHJvdW5kLXRyaXA6XG5cbiAgIHt2XG4gICAgICMgc3ByaW50ZiBcIiUuMTVnXCIgMy4xNDs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjMuMTRcIiAgICAgICAgICAgICAgICAgICAgICgqIHBpY2sgdGhpcyBvbmUgKilcbiAgICAgIyBzcHJpbnRmIFwiJS4xNmdcIiAzLjE0OztcbiAgICAgLSA6IHN0cmluZyA9IFwiMy4xNFwiXG4gICAgICMgc3ByaW50ZiBcIiUuMTdnXCIgMy4xNDs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjMuMTQwMDAwMDAwMDAwMDAwMVwiICAgICAgICgqIGRvIG5vdCBwaWNrIHRoaXMgb25lICopXG5cbiAgICAgIyBzcHJpbnRmIFwiJS4xNWdcIiA4LjAwMDAwMDAwMDAwMDAwMjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjhcIiAgICAgICAgICAgICAgICAgICAgICAgICgqIGRvIG5vdCBwaWNrIHRoaXMgb25lLS1kb2VzIG5vdCByb3VuZC10cmlwICopXG4gICAgICMgc3ByaW50ZiBcIiUuMTZnXCIgOC4wMDAwMDAwMDAwMDAwMDI7O1xuICAgICAtIDogc3RyaW5nID0gXCI4LjAwMDAwMDAwMDAwMDAwMlwiICAgICAgICAoKiBwcmVmZXIgdGhpcyBvbmUgKilcbiAgICAgIyBzcHJpbnRmIFwiJS4xN2dcIiA4LjAwMDAwMDAwMDAwMDAwMjs7XG4gICAgIC0gOiBzdHJpbmcgPSBcIjguMDAwMDAwMDAwMDAwMDAxOFwiICAgICAgICgqIHRoaXMgb25lIGhhcyBvbmUgZGlnaXQgb2YganVuayBhdCB0aGUgZW5kICopXG4gICB2fVxuXG4gICBTa2lwcGluZyB0aGUgJyUuMTZnJyBpbiB0aGUgYWJvdmUgcHJvY2VkdXJlIHNhdmVzIHVzIHNvbWUgdGltZSwgYnV0IGl0IG1lYW5zIHRoYXQsIGFzXG4gICBzZWVuIGluIHRoZSBzZWNvbmQgZXhhbXBsZSBhYm92ZSwgb2NjYXNpb25hbGx5IG51bWJlcnMgd2l0aCBleGFjdGx5IDE2IHNpZ25pZmljYW50XG4gICBkaWdpdHMgd2lsbCBoYXZlIGFuIGVycm9yIGludHJvZHVjZWQgYXQgdGhlIDE3dGggZGlnaXQuICBUaGF0IGlzIHByb2JhYmx5IE9LIGZvclxuICAgdHlwaWNhbCB1c2UsIGJlY2F1c2UgYSBudW1iZXIgd2l0aCAxNiBzaWduaWZpY2FudCBkaWdpdHMgaXMgXCJ1Z2x5XCIgYWxyZWFkeS4gIEFkZGluZyBvbmVcbiAgIG1vcmUgZG9lc24ndCBtYWtlIGl0IG11Y2ggd29yc2UgZm9yIGEgaHVtYW4gcmVhZGVyLlxuXG4gICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgY2Fubm90IHNraXAgJyUuMTVnJyBhbmQgb25seSBsb29rIGF0ICclLjE2ZycgYW5kICclLjE3ZycsIHNpbmNlXG4gICB0aGUgaW5hY2N1cmFjeSBhdCB0aGUgMTZ0aCBkaWdpdCBtaWdodCBpbnRyb2R1Y2UgdGhlIG5vaXNlIHdlIHdhbnQgdG8gYXZvaWQ6XG5cbiAgIHt2XG4gICAgICMgc3ByaW50ZiBcIiUuMTVnXCIgOS45OTI7O1xuICAgICAtIDogc3RyaW5nID0gXCI5Ljk5MlwiICAgICAgICAgICAgICAgICAgICAoKiBwaWNrIHRoaXMgb25lICopXG4gICAgICMgc3ByaW50ZiBcIiUuMTZnXCIgOS45OTI7O1xuICAgICAtIDogc3RyaW5nID0gXCI5Ljk5MjAwMDAwMDAwMDAwMVwiICAgICAgICAoKiBkbyBub3QgcGljayB0aGlzIG9uZS0tanVuayBhdCB0aGUgZW5kICopXG4gICAgICMgc3ByaW50ZiBcIiUuMTdnXCIgOS45OTI7O1xuICAgICAtIDogc3RyaW5nID0gXCI5Ljk5MjAwMDAwMDAwMDAwMDlcIlxuICAgdn1cbiopXG5sZXQgdG9fc3RyaW5nIHggPVxuICB2YWxpZF9mbG9hdF9sZXhlbVxuICAgIChsZXQgeSA9IGZvcm1hdF9mbG9hdCBcIiUuMTVnXCIgeCBpblxuICAgICBpZiBmbG9hdF9vZl9zdHJpbmcgeSA9IHggdGhlbiB5IGVsc2UgZm9ybWF0X2Zsb2F0IFwiJS4xN2dcIiB4KVxuOztcblxubGV0IG1heF92YWx1ZSA9IGluZmluaXR5XG5sZXQgbWluX3ZhbHVlID0gbmVnX2luZmluaXR5XG5sZXQgbWluX3Bvc2l0aXZlX3N1Ym5vcm1hbF92YWx1ZSA9IDIuICoqIC0xMDc0LlxubGV0IG1pbl9wb3NpdGl2ZV9ub3JtYWxfdmFsdWUgPSAyLiAqKiAtMTAyMi5cbmxldCB6ZXJvID0gMC5cbmxldCBvbmUgPSAxLlxubGV0IG1pbnVzX29uZSA9IC0xLlxubGV0IHBpID0gMHgzLjI0M0Y2QTg4ODVBMzA4RDMxMzE5OEEyRTAzNzA3M1xubGV0IHNxcnRfcGkgPSAweDEuQzVCRjg5MUI0RUY2QUE3OUMzQjA1MjBENURCOTM4XG5sZXQgc3FydF8ycGkgPSAweDIuODFCMjYzRkVDNEUwQjJDQUY5NDgzRjVDRTQ1OURDXG5sZXQgZXVsZXIgPSAweDAuOTNDNDY3RTM3REIwQzdBNEQxQkUzRjgxMDE1MkNCXG5sZXQgb2ZfaW50ID0gSW50LnRvX2Zsb2F0XG5sZXQgdG9faW50ID0gSW50Lm9mX2Zsb2F0XG5sZXQgb2ZfaW50NjMgaSA9IEludDYzLnRvX2Zsb2F0IGlcbmxldCBvZl9pbnQ2NCBpID0gQ2FtbC5JbnQ2NC50b19mbG9hdCBpXG5sZXQgdG9faW50NjQgPSBDYW1sLkludDY0Lm9mX2Zsb2F0XG5sZXQgaXJvdW5kX2xib3VuZCA9IGxvd2VyX2JvdW5kX2Zvcl9pbnQgSW50Lm51bV9iaXRzXG5sZXQgaXJvdW5kX3Vib3VuZCA9IHVwcGVyX2JvdW5kX2Zvcl9pbnQgSW50Lm51bV9iaXRzXG5cbigqIFRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgXCJleG5cIiByb3VuZGluZyBmdW5jdGlvbnMgaXMgaW1wb3J0YW50LCBzbyB0aGV5IGFyZSB3cml0dGVuXG4gICBvdXQgc2VwYXJhdGVseSwgYW5kIHR1bmVkIGluZGl2aWR1YWxseS4gIChXZSBjb3VsZCBoYXZlIHRoZSBvcHRpb24gdmVyc2lvbnMgY2FsbFxuICAgdGhlIFwiZXhuXCIgdmVyc2lvbnMsIGJ1dCB0aGF0IGltcG9zZXMgYXJndWFibHkgZ3JhdHVpdG91cyBvdmVyaGVhZC0tLWVzcGVjaWFsbHlcbiAgIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlIG9mIGJhY2t0cmFjZXMgaXMgZW5hYmxlZCB1cG9uIFwid2l0aFwiLS0tYW5kIHRoYXQgc2VlbXNcbiAgIG5vdCB3b3J0aCBpdCB3aGVuIGNvbXBhcmVkIHRvIHRoZSByZWxhdGl2ZWx5IHNtYWxsIGFtb3VudCBvZiBjb2RlIGR1cGxpY2F0aW9uLikgKilcblxuKCogRXJyb3IgcmVwb3J0aW5nIGJlbG93IGlzIHZlcnkgY2FyZWZ1bGx5IGFycmFuZ2VkIHNvIHRoYXQsIGUuZy4sIFtpcm91bmRfbmVhcmVzdF9leG5dXG4gICBpdHNlbGYgY2FuIGJlIGlubGluZWQgaW50byBjYWxsZXJzIHN1Y2ggdGhhdCB0aGV5IGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgYSBib3ggZm9yIHRoZVxuICAgW2Zsb2F0XSBhcmd1bWVudC4gIFRoaXMgaXMgZG9uZSB3aXRoIGEgYm94IFtib3hdIGZ1bmN0aW9uIGNhcmVmdWxseSBjaG9zZW4gdG8gYWxsb3cgdGhlXG4gICBjb21waWxlciB0byBjcmVhdGUgYSBzZXBhcmF0ZSBib3ggZm9yIHRoZSBmbG9hdCBvbmx5IGluIGVycm9yIGNhc2VzLiAgU2VlLCBlLmcuLFxuICAgWy4uLy4uL3plcm8vdGVzdC9wcmljZV90ZXN0Lm1sXSBmb3IgYSBtZWNoYW5pY2FsIHRlc3Qgb2YgdGhpcyBwcm9wZXJ0eSB3aGVuIGJ1aWxkaW5nXG4gICB3aXRoIFtYX0xJQlJBUllfSU5MSU5JTkc9dHJ1ZV0uICopXG5cbmxldCBpcm91bmRfdXAgdCA9XG4gIGlmIHQgPiAwLjBcbiAgdGhlbiAoXG4gICAgbGV0IHQnID0gY2VpbCB0IGluXG4gICAgaWYgdCcgPD0gaXJvdW5kX3Vib3VuZCB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCcpIGVsc2UgTm9uZSlcbiAgZWxzZSBpZiB0ID49IGlyb3VuZF9sYm91bmRcbiAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQpXG4gIGVsc2UgTm9uZVxuOztcblxubGV0W0BvY2FtbC5pbmxpbmUgYWx3YXlzXSBpcm91bmRfdXBfZXhuIHQgPVxuICBpZiB0ID4gMC4wXG4gIHRoZW4gKFxuICAgIGxldCB0JyA9IGNlaWwgdCBpblxuICAgIGlmIHQnIDw9IGlyb3VuZF91Ym91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF91cF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCIgKGJveCB0KSAoKSlcbiAgZWxzZSBpZiB0ID49IGlyb3VuZF9sYm91bmRcbiAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfdXBfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIiAoYm94IHQpICgpXG47O1xuXG5sZXQgaXJvdW5kX2Rvd24gdCA9XG4gIGlmIHQgPj0gMC4wXG4gIHRoZW4gaWYgdCA8PSBpcm91bmRfdWJvdW5kIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0KSBlbHNlIE5vbmVcbiAgZWxzZSAoXG4gICAgbGV0IHQnID0gZmxvb3IgdCBpblxuICAgIGlmIHQnID49IGlyb3VuZF9sYm91bmQgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnKSBlbHNlIE5vbmUpXG47O1xuXG5sZXRbQG9jYW1sLmlubGluZSBhbHdheXNdIGlyb3VuZF9kb3duX2V4biB0ID1cbiAgaWYgdCA+PSAwLjBcbiAgdGhlblxuICAgIGlmIHQgPD0gaXJvdW5kX3Vib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gICAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfZG93bl9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCIgKGJveCB0KSAoKVxuICBlbHNlIChcbiAgICBsZXQgdCcgPSBmbG9vciB0IGluXG4gICAgaWYgdCcgPj0gaXJvdW5kX2xib3VuZFxuICAgIHRoZW4gSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0J1xuICAgIGVsc2VcbiAgICAgIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9kb3duX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCIgKGJveCB0KSAoKSlcbjs7XG5cbmxldCBpcm91bmRfdG93YXJkc196ZXJvIHQgPVxuICBpZiB0ID49IGlyb3VuZF9sYm91bmQgJiYgdCA8PSBpcm91bmRfdWJvdW5kXG4gIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0KVxuICBlbHNlIE5vbmVcbjs7XG5cbmxldFtAb2NhbWwuaW5saW5lIGFsd2F5c10gaXJvdW5kX3Rvd2FyZHNfemVyb19leG4gdCA9XG4gIGlmIHQgPj0gaXJvdW5kX2xib3VuZCAmJiB0IDw9IGlyb3VuZF91Ym91bmRcbiAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgZWxzZVxuICAgIGludmFsaWRfYXJnZlxuICAgICAgXCJGbG9hdC5pcm91bmRfdG93YXJkc196ZXJvX2V4bjogYXJndW1lbnQgKCVmKSBpcyBvdXQgb2YgcmFuZ2Ugb3IgTmFOXCJcbiAgICAgIChib3ggdClcbiAgICAgICgpXG47O1xuXG4oKiBPdXRzaWRlIG9mIHRoZSByYW5nZSAocm91bmRfbmVhcmVzdF9sYi4ucm91bmRfbmVhcmVzdF91YiksIGFsbCByZXByZXNlbnRhYmxlIGRvdWJsZXNcbiAgIGFyZSBpbnRlZ2VycyBpbiB0aGUgbWF0aGVtYXRpY2FsIHNlbnNlLCBhbmQgW3JvdW5kX25lYXJlc3RdIHNob3VsZCBiZSBpZGVudGl0eS5cblxuICAgSG93ZXZlciwgZm9yIG9kZCBudW1iZXJzIHdpdGggdGhlIGFic29sdXRlIHZhbHVlIGJldHdlZW4gMioqNTIgYW5kIDIqKjUzLCB0aGUgZm9ybXVsYVxuICAgW3JvdW5kX25lYXJlc3QgeCA9IGZsb29yICh4ICsgMC41KV0gZG9lcyBub3QgaG9sZDpcblxuICAge3ZcbiAgICAgIyBsZXQgbmFpdmVfcm91bmRfbmVhcmVzdCB4ID0gZmxvb3IgKHggKy4gMC41KTs7XG4gICAgICMgbGV0IHggPSAyLiAqKiA1Mi4gKy4gMS47O1xuICAgICB2YWwgeCA6IGZsb2F0ID0gNDUwMzU5OTYyNzM3MDQ5Ny5cbiAgICAgIyBuYWl2ZV9yb3VuZF9uZWFyZXN0IHg7O1xuICAgICAtIDogICAgIGZsb2F0ID0gNDUwMzU5OTYyNzM3MDQ5OC5cbiAgIHZ9XG4qKVxuXG5sZXQgcm91bmRfbmVhcmVzdF9sYiA9IC0uKDIuICoqIDUyLilcbmxldCByb3VuZF9uZWFyZXN0X3ViID0gMi4gKiogNTIuXG5cbigqIEZvciBbeCA9IG9uZV91bHAgYERvd24gMC41XSwgdGhlIGZvcm11bGEgW2Zsb29yICh4ICsuIDAuNSldIGZvciByb3VuZGluZyB0byBuZWFyZXN0XG4gICBkb2VzIG5vdCB3b3JrLCBiZWNhdXNlIHRoZSBleGFjdCByZXN1bHQgaXMgaGFsZndheSBiZXR3ZWVuIFtvbmVfdWxwIGBEb3duIDEuXSBhbmQgWzEuXSxcbiAgIGFuZCBpdCBnZXRzIHJvdW5kZWQgdXAgdG8gWzEuXSBkdWUgdG8gdGhlIHJvdW5kLXRpZXMtdG8tZXZlbiBydWxlLiAqKVxubGV0IG9uZV91bHBfbGVzc190aGFuX2hhbGYgPSBvbmVfdWxwIGBEb3duIDAuNVxuXG5sZXRbQG9jYW1sLmlubGluZSBhbHdheXNdIGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQgPVxuICB0XG4gICsuXG4gIGlmIHQgPSBvbmVfdWxwX2xlc3NfdGhhbl9oYWxmXG4gIHRoZW4gb25lX3VscF9sZXNzX3RoYW5faGFsZiAoKiBzaW5jZSB0IDwgMC41LCBtYWtlIHN1cmUgdGhlIHJlc3VsdCBpcyA8IDEuMCAqKVxuICBlbHNlIDAuNVxuOztcblxubGV0IGlyb3VuZF9uZWFyZXN0XzMyIHQgPVxuICBpZiB0ID49IDAuXG4gIHRoZW4gKFxuICAgIGxldCB0JyA9IGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQgaW5cbiAgICBpZiB0JyA8PSBpcm91bmRfdWJvdW5kIHRoZW4gU29tZSAoSW50Lm9mX2Zsb2F0X3VuY2hlY2tlZCB0JykgZWxzZSBOb25lKVxuICBlbHNlIChcbiAgICBsZXQgdCcgPSBmbG9vciAodCArLiAwLjUpIGluXG4gICAgaWYgdCcgPj0gaXJvdW5kX2xib3VuZCB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCcpIGVsc2UgTm9uZSlcbjs7XG5cbmxldCBpcm91bmRfbmVhcmVzdF82NCB0ID1cbiAgaWYgdCA+PSAwLlxuICB0aGVuXG4gICAgaWYgdCA8IHJvdW5kX25lYXJlc3RfdWJcbiAgICB0aGVuIFNvbWUgKEludC5vZl9mbG9hdF91bmNoZWNrZWQgKGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQpKVxuICAgIGVsc2UgaWYgdCA8PSBpcm91bmRfdWJvdW5kXG4gICAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQpXG4gICAgZWxzZSBOb25lXG4gIGVsc2UgaWYgdCA+IHJvdW5kX25lYXJlc3RfbGJcbiAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIChmbG9vciAodCArLiAwLjUpKSlcbiAgZWxzZSBpZiB0ID49IGlyb3VuZF9sYm91bmRcbiAgdGhlbiBTb21lIChJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQpXG4gIGVsc2UgTm9uZVxuOztcblxubGV0IGlyb3VuZF9uZWFyZXN0ID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IGlyb3VuZF9uZWFyZXN0XzY0XG4gIHwgVzMyIC0+IGlyb3VuZF9uZWFyZXN0XzMyXG47O1xuXG5sZXQgaXJvdW5kX25lYXJlc3RfZXhuXzMyIHQgPVxuICBpZiB0ID49IDAuXG4gIHRoZW4gKFxuICAgIGxldCB0JyA9IGFkZF9oYWxmX2Zvcl9yb3VuZF9uZWFyZXN0IHQgaW5cbiAgICBpZiB0JyA8PSBpcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZSBpbnZhbGlkX2FyZ2YgXCJGbG9hdC5pcm91bmRfbmVhcmVzdF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCIgKGJveCB0KSAoKSlcbiAgZWxzZSAoXG4gICAgbGV0IHQnID0gZmxvb3IgKHQgKy4gMC41KSBpblxuICAgIGlmIHQnID49IGlyb3VuZF9sYm91bmRcbiAgICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9uZWFyZXN0X2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGxcIiAoYm94IHQpICgpKVxuOztcblxubGV0W0BvY2FtbC5pbmxpbmUgYWx3YXlzXSBpcm91bmRfbmVhcmVzdF9leG5fNjQgdCA9XG4gIGlmIHQgPj0gMC5cbiAgdGhlblxuICAgIGlmIHQgPCByb3VuZF9uZWFyZXN0X3ViXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIChhZGRfaGFsZl9mb3Jfcm91bmRfbmVhcmVzdCB0KVxuICAgIGVsc2UgaWYgdCA8PSBpcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIHRcbiAgICBlbHNlIGludmFsaWRfYXJnZiBcIkZsb2F0Lmlyb3VuZF9uZWFyZXN0X2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gbGFyZ2VcIiAoYm94IHQpICgpXG4gIGVsc2UgaWYgdCA+IHJvdW5kX25lYXJlc3RfbGJcbiAgdGhlbiBJbnQub2ZfZmxvYXRfdW5jaGVja2VkIChmbG9vciAodCArLiAwLjUpKVxuICBlbHNlIGlmIHQgPj0gaXJvdW5kX2xib3VuZFxuICB0aGVuIEludC5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICBlbHNlXG4gICAgaW52YWxpZF9hcmdmIFwiRmxvYXQuaXJvdW5kX25lYXJlc3RfZXhuOiBhcmd1bWVudCAoJWYpIGlzIHRvbyBzbWFsbCBvciBOYU5cIiAoYm94IHQpICgpXG47O1xuXG5sZXQgaXJvdW5kX25lYXJlc3RfZXhuID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IGlyb3VuZF9uZWFyZXN0X2V4bl82NFxuICB8IFczMiAtPiBpcm91bmRfbmVhcmVzdF9leG5fMzJcbjs7XG5cbigqIFRoZSBmb2xsb3dpbmcgW2lyb3VuZF9leG5dIGFuZCBbaXJvdW5kXSBmdW5jdGlvbnMgYXJlIHNsb3dlciB0aGFuIHRoZSBvbmVzIGFib3ZlLlxuICAgVGhlaXIgZXF1aXZhbGVuY2UgdG8gdGhvc2UgZnVuY3Rpb25zIGlzIHRlc3RlZCBpbiB0aGUgdW5pdCB0ZXN0cyBiZWxvdy4gKilcblxubGV0W0BpbmxpbmVdIGlyb3VuZF9leG4gPyhkaXIgPSBgTmVhcmVzdCkgdCA9XG4gIG1hdGNoIGRpciB3aXRoXG4gIHwgYFplcm8gLT4gaXJvdW5kX3Rvd2FyZHNfemVyb19leG4gdFxuICB8IGBOZWFyZXN0IC0+IGlyb3VuZF9uZWFyZXN0X2V4biB0XG4gIHwgYFVwIC0+IGlyb3VuZF91cF9leG4gdFxuICB8IGBEb3duIC0+IGlyb3VuZF9kb3duX2V4biB0XG47O1xuXG5sZXQgaXJvdW5kID8oZGlyID0gYE5lYXJlc3QpIHQgPVxuICB0cnkgU29tZSAoaXJvdW5kX2V4biB+ZGlyIHQpIHdpdGhcbiAgfCBfIC0+IE5vbmVcbjs7XG5cbmxldCBpc19pbmYgdCA9IDEuIC8uIHQgPSAwLlxubGV0IGlzX2Zpbml0ZSB0ID0gdCAtLiB0ID0gMC5cblxubGV0IG1pbl9pbmFuICh4IDogdCkgeSA9XG4gIGlmIGlzX25hbiB5IHRoZW4geCBlbHNlIGlmIGlzX25hbiB4IHRoZW4geSBlbHNlIGlmIHggPCB5IHRoZW4geCBlbHNlIHlcbjs7XG5cbmxldCBtYXhfaW5hbiAoeCA6IHQpIHkgPVxuICBpZiBpc19uYW4geSB0aGVuIHggZWxzZSBpZiBpc19uYW4geCB0aGVuIHkgZWxzZSBpZiB4ID4geSB0aGVuIHggZWxzZSB5XG47O1xuXG5sZXQgYWRkID0gKCArLiApXG5sZXQgc3ViID0gKCAtLiApXG5sZXQgbmVnID0gKCB+LS4gKVxubGV0IGFicyA9IGFic19mbG9hdFxubGV0IHNjYWxlID0gKCAqLiApXG5sZXQgc3F1YXJlIHggPSB4ICouIHhcblxubW9kdWxlIFBhcnRzIDogc2lnXG4gIHR5cGUgdFxuXG4gIHZhbCBmcmFjdGlvbmFsIDogdCAtPiBmbG9hdFxuICB2YWwgaW50ZWdyYWwgOiB0IC0+IGZsb2F0XG4gIHZhbCBtb2RmIDogZmxvYXQgLT4gdFxuZW5kID0gc3RydWN0XG4gIHR5cGUgdCA9IGZsb2F0ICogZmxvYXRcblxuICBsZXQgZnJhY3Rpb25hbCB0ID0gZnN0IHRcbiAgbGV0IGludGVncmFsIHQgPSBzbmQgdFxuICBsZXQgbW9kZiA9IG1vZGZcbmVuZFxuXG5sZXQgbW9kZiA9IFBhcnRzLm1vZGZcbmxldCByb3VuZF9kb3duID0gZmxvb3JcbmxldCByb3VuZF91cCA9IGNlaWxcbmxldCByb3VuZF90b3dhcmRzX3plcm8gdCA9IGlmIHQgPj0gMC4gdGhlbiByb3VuZF9kb3duIHQgZWxzZSByb3VuZF91cCB0XG5cbigqIHNlZSB0aGUgY29tbWVudCBhYm92ZSBbcm91bmRfbmVhcmVzdF9sYl0gYW5kIFtyb3VuZF9uZWFyZXN0X3ViXSBmb3IgYW4gZXhwbGFuYXRpb24gKilcbmxldFtAb2NhbWwuaW5saW5lXSByb3VuZF9uZWFyZXN0X2lubGluZSB0ID1cbiAgaWYgdCA+IHJvdW5kX25lYXJlc3RfbGIgJiYgdCA8IHJvdW5kX25lYXJlc3RfdWJcbiAgdGhlbiBmbG9vciAoYWRkX2hhbGZfZm9yX3JvdW5kX25lYXJlc3QgdClcbiAgZWxzZSB0ICsuIDAuXG47O1xuXG5sZXQgcm91bmRfbmVhcmVzdCB0ID0gKHJvdW5kX25lYXJlc3RfaW5saW5lIFtAb2NhbWwuaW5saW5lZCBhbHdheXNdKSB0XG5cbmxldCByb3VuZF9uZWFyZXN0X2hhbGZfdG9fZXZlbiB0ID1cbiAgaWYgdCA8PSByb3VuZF9uZWFyZXN0X2xiIHx8IHQgPj0gcm91bmRfbmVhcmVzdF91YlxuICB0aGVuIHQgKy4gMC5cbiAgZWxzZSAoXG4gICAgbGV0IGZsb29yID0gZmxvb3IgdCBpblxuICAgICgqIFtjZWlsX29yX3N1Y2MgPSBpZiB0IGlzIGFuIGludGVnZXIgdGhlbiB0ICsuIDEuIGVsc2UgY2VpbCB0XS4gIEZhc3RlciB0aGFuIFtjZWlsXS4gKilcbiAgICBsZXQgY2VpbF9vcl9zdWNjID0gZmxvb3IgKy4gMS4gaW5cbiAgICBsZXQgZGlmZl9mbG9vciA9IHQgLS4gZmxvb3IgaW5cbiAgICBsZXQgZGlmZl9jZWlsID0gY2VpbF9vcl9zdWNjIC0uIHQgaW5cbiAgICBpZiBkaWZmX2Zsb29yIDwgZGlmZl9jZWlsXG4gICAgdGhlbiBmbG9vclxuICAgIGVsc2UgaWYgZGlmZl9mbG9vciA+IGRpZmZfY2VpbFxuICAgIHRoZW4gY2VpbF9vcl9zdWNjXG4gICAgZWxzZSBpZiAoKiBleGFjdCB0aWUsIHBpY2sgdGhlIGV2ZW4gKilcbiAgICAgIG1vZF9mbG9hdCBmbG9vciAyLiA9IDAuXG4gICAgdGhlbiBmbG9vclxuICAgIGVsc2UgY2VpbF9vcl9zdWNjKVxuOztcblxubGV0IGludDYzX3JvdW5kX2xib3VuZCA9IGxvd2VyX2JvdW5kX2Zvcl9pbnQgSW50NjMubnVtX2JpdHNcbmxldCBpbnQ2M19yb3VuZF91Ym91bmQgPSB1cHBlcl9ib3VuZF9mb3JfaW50IEludDYzLm51bV9iaXRzXG5cbmxldCBpbnQ2M19yb3VuZF91cF9leG4gdCA9XG4gIGlmIHQgPiAwLjBcbiAgdGhlbiAoXG4gICAgbGV0IHQnID0gY2VpbCB0IGluXG4gICAgaWYgdCcgPD0gaW50NjNfcm91bmRfdWJvdW5kXG4gICAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdCdcbiAgICBlbHNlXG4gICAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgICAgXCJGbG9hdC5pbnQ2M19yb3VuZF91cF9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCJcbiAgICAgICAgKEZsb2F0MC5ib3ggdClcbiAgICAgICAgKCkpXG4gIGVsc2UgaWYgdCA+PSBpbnQ2M19yb3VuZF9sYm91bmRcbiAgdGhlbiBJbnQ2My5vZl9mbG9hdF91bmNoZWNrZWQgdFxuICBlbHNlXG4gICAgaW52YWxpZF9hcmdmXG4gICAgICBcIkZsb2F0LmludDYzX3JvdW5kX3VwX2V4bjogYXJndW1lbnQgKCVmKSBpcyB0b28gc21hbGwgb3IgTmFOXCJcbiAgICAgIChGbG9hdDAuYm94IHQpXG4gICAgICAoKVxuOztcblxubGV0IGludDYzX3JvdW5kX2Rvd25fZXhuIHQgPVxuICBpZiB0ID49IDAuMFxuICB0aGVuXG4gICAgaWYgdCA8PSBpbnQ2M19yb3VuZF91Ym91bmRcbiAgICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gICAgZWxzZVxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfZG93bl9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCJcbiAgICAgICAgKEZsb2F0MC5ib3ggdClcbiAgICAgICAgKClcbiAgZWxzZSAoXG4gICAgbGV0IHQnID0gZmxvb3IgdCBpblxuICAgIGlmIHQnID49IGludDYzX3JvdW5kX2xib3VuZFxuICAgIHRoZW4gSW50NjMub2ZfZmxvYXRfdW5jaGVja2VkIHQnXG4gICAgZWxzZVxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfZG93bl9leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiXG4gICAgICAgIChGbG9hdDAuYm94IHQpXG4gICAgICAgICgpKVxuOztcblxubGV0IGludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuIHQwID1cbiAgbGV0IHQgPSAocm91bmRfbmVhcmVzdF9pbmxpbmUgW0BvY2FtbC5pbmxpbmVkIGFsd2F5c10pIHQwIGluXG4gIGlmIHQgPiAwLlxuICB0aGVuXG4gICAgaWYgdCA8PSBpbnQ2M19yb3VuZF91Ym91bmRcbiAgICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gICAgZWxzZVxuICAgICAgaW52YWxpZF9hcmdmXG4gICAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIGxhcmdlXCJcbiAgICAgICAgKGJveCB0MClcbiAgICAgICAgKClcbiAgZWxzZSBpZiB0ID49IGludDYzX3JvdW5kX2xib3VuZFxuICB0aGVuIEludDYzLm9mX2Zsb2F0X3VuY2hlY2tlZCB0XG4gIGVsc2VcbiAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgIFwiRmxvYXQuaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG46IGFyZ3VtZW50ICglZikgaXMgdG9vIHNtYWxsIG9yIE5hTlwiXG4gICAgICAoYm94IHQwKVxuICAgICAgKClcbjs7XG5cbmxldCBpbnQ2M19yb3VuZF9uZWFyZXN0X2FyY2g2NF9ub2FsbG9jX2V4biBmID0gSW50NjMub2ZfaW50IChpcm91bmRfbmVhcmVzdF9leG4gZilcblxubGV0IGludDYzX3JvdW5kX25lYXJlc3RfZXhuID1cbiAgbWF0Y2ggV29yZF9zaXplLndvcmRfc2l6ZSB3aXRoXG4gIHwgVzY0IC0+IGludDYzX3JvdW5kX25lYXJlc3RfYXJjaDY0X25vYWxsb2NfZXhuXG4gIHwgVzMyIC0+IGludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuXG47O1xuXG5sZXQgcm91bmQgPyhkaXIgPSBgTmVhcmVzdCkgdCA9XG4gIG1hdGNoIGRpciB3aXRoXG4gIHwgYE5lYXJlc3QgLT4gcm91bmRfbmVhcmVzdCB0XG4gIHwgYERvd24gLT4gcm91bmRfZG93biB0XG4gIHwgYFVwIC0+IHJvdW5kX3VwIHRcbiAgfCBgWmVybyAtPiByb3VuZF90b3dhcmRzX3plcm8gdFxuOztcblxubW9kdWxlIENsYXNzID0gc3RydWN0XG4gIHR5cGUgdCA9XG4gICAgfCBJbmZpbml0ZVxuICAgIHwgTmFuXG4gICAgfCBOb3JtYWxcbiAgICB8IFN1Ym5vcm1hbFxuICAgIHwgWmVyb1xuICBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZW51bWVyYXRlLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmUgPSAoUHB4X2NvbXBhcmVfbGliLnBvbHltb3JwaGljX2NvbXBhcmUgOiB0IC0+IHQgLT4gaW50KVxuICBsZXQgYWxsID0gKFsgSW5maW5pdGU7IE5hbjsgTm9ybWFsOyBTdWJub3JtYWw7IFplcm8gXSA6IHQgbGlzdClcblxuICBsZXQgdF9vZl9zZXhwID1cbiAgICAobGV0IGVycm9yX3NvdXJjZV9fMDA2XyA9IFwiZmxvYXQubWwuQ2xhc3MudFwiIGluXG4gICAgIGZ1bmN0aW9uXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcImluZmluaXRlXCIgfCBcIkluZmluaXRlXCIpIC0+IEluZmluaXRlXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5hblwiIHwgXCJOYW5cIikgLT4gTmFuXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcIm5vcm1hbFwiIHwgXCJOb3JtYWxcIikgLT4gTm9ybWFsXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInN1Ym5vcm1hbFwiIHwgXCJTdWJub3JtYWxcIikgLT4gU3Vibm9ybWFsXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5BdG9tIChcInplcm9cIiB8IFwiWmVyb1wiKSAtPiBaZXJvXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwiaW5maW5pdGVcIiB8IFwiSW5maW5pdGVcIikgOjogXykgYXNcbiAgICAgICBzZXhwX18wMDdfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJuYW5cIiB8IFwiTmFuXCIpIDo6IF8pIGFzIHNleHBfXzAwN18gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3Iuc3RhZ19ub19hcmdzIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDdfXG4gICAgIHwgU2V4cGxpYjAuU2V4cC5MaXN0IChTZXhwbGliMC5TZXhwLkF0b20gKFwibm9ybWFsXCIgfCBcIk5vcm1hbFwiKSA6OiBfKSBhcyBzZXhwX18wMDdfIC0+XG4gICAgICAgU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yLnN0YWdfbm9fYXJncyBlcnJvcl9zb3VyY2VfXzAwNl8gc2V4cF9fMDA3X1xuICAgICB8IFNleHBsaWIwLlNleHAuTGlzdCAoU2V4cGxpYjAuU2V4cC5BdG9tIChcInN1Ym5vcm1hbFwiIHwgXCJTdWJub3JtYWxcIikgOjogXykgYXNcbiAgICAgICBzZXhwX18wMDdfIC0+IFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuQXRvbSAoXCJ6ZXJvXCIgfCBcIlplcm9cIikgOjogXykgYXMgc2V4cF9fMDA3XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5zdGFnX25vX2FyZ3MgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwN19cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgKFNleHBsaWIwLlNleHAuTGlzdCBfIDo6IF8pIGFzIHNleHBfXzAwNV8gLT5cbiAgICAgICBTZXhwbGliMC5TZXhwX2NvbnZfZXJyb3IubmVzdGVkX2xpc3RfaW52YWxpZF9zdW0gZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbiAgICAgfCBTZXhwbGliMC5TZXhwLkxpc3QgW10gYXMgc2V4cF9fMDA1XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci5lbXB0eV9saXN0X2ludmFsaWRfc3VtIGVycm9yX3NvdXJjZV9fMDA2XyBzZXhwX18wMDVfXG4gICAgIHwgc2V4cF9fMDA1XyAtPlxuICAgICAgIFNleHBsaWIwLlNleHBfY29udl9lcnJvci51bmV4cGVjdGVkX3N0YWcgZXJyb3Jfc291cmNlX18wMDZfIHNleHBfXzAwNV9cbiAgICAgICA6IFNleHBsaWIwLlNleHAudCAtPiB0KVxuICA7O1xuXG4gIGxldCBzZXhwX29mX3QgPVxuICAgIChmdW5jdGlvblxuICAgICAgfCBJbmZpbml0ZSAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJJbmZpbml0ZVwiXG4gICAgICB8IE5hbiAtPiBTZXhwbGliMC5TZXhwLkF0b20gXCJOYW5cIlxuICAgICAgfCBOb3JtYWwgLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiTm9ybWFsXCJcbiAgICAgIHwgU3Vibm9ybWFsIC0+IFNleHBsaWIwLlNleHAuQXRvbSBcIlN1Ym5vcm1hbFwiXG4gICAgICB8IFplcm8gLT4gU2V4cGxpYjAuU2V4cC5BdG9tIFwiWmVyb1wiXG4gICAgICAgICAgICAgICAgOiB0IC0+IFNleHBsaWIwLlNleHAudClcbiAgOztcblxuICBsZXQgKHRfc2V4cF9ncmFtbWFyIDogdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIHsgdW50eXBlZCA9XG4gICAgICAgIFZhcmlhbnRcbiAgICAgICAgICB7IGNhc2Vfc2Vuc2l0aXZpdHkgPSBDYXNlX3NlbnNpdGl2ZV9leGNlcHRfZmlyc3RfY2hhcmFjdGVyXG4gICAgICAgICAgOyBjbGF1c2VzID1cbiAgICAgICAgICAgICAgWyBOb190YWcgeyBuYW1lID0gXCJJbmZpbml0ZVwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJOYW5cIjsgY2xhdXNlX2tpbmQgPSBBdG9tX2NsYXVzZSB9XG4gICAgICAgICAgICAgIDsgTm9fdGFnIHsgbmFtZSA9IFwiTm9ybWFsXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICA7IE5vX3RhZyB7IG5hbWUgPSBcIlN1Ym5vcm1hbFwiOyBjbGF1c2Vfa2luZCA9IEF0b21fY2xhdXNlIH1cbiAgICAgICAgICAgICAgOyBOb190YWcgeyBuYW1lID0gXCJaZXJvXCI7IGNsYXVzZV9raW5kID0gQXRvbV9jbGF1c2UgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgIH1cbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIGxldCB0b19zdHJpbmcgdCA9IHN0cmluZ19vZl9zZXhwIChzZXhwX29mX3QgdClcbiAgbGV0IG9mX3N0cmluZyBzID0gdF9vZl9zZXhwIChzZXhwX29mX3N0cmluZyBzKVxuZW5kXG5cbmxldCBjbGFzc2lmeSB0ID1cbiAgbGV0IG1vZHVsZSBDID0gQ2xhc3MgaW5cbiAgbWF0Y2ggY2xhc3NpZnlfZmxvYXQgdCB3aXRoXG4gIHwgRlBfbm9ybWFsIC0+IEMuTm9ybWFsXG4gIHwgRlBfc3Vibm9ybWFsIC0+IEMuU3Vibm9ybWFsXG4gIHwgRlBfemVybyAtPiBDLlplcm9cbiAgfCBGUF9pbmZpbml0ZSAtPiBDLkluZmluaXRlXG4gIHwgRlBfbmFuIC0+IEMuTmFuXG47O1xuXG5sZXQgaW5zZXJ0X3VuZGVyc2NvcmVzID8oZGVsaW1pdGVyID0gJ18nKSA/KHN0cmlwX3plcm8gPSBmYWxzZSkgc3RyaW5nID1cbiAgbWF0Y2ggU3RyaW5nLmxzcGxpdDIgc3RyaW5nIH5vbjonLicgd2l0aFxuICB8IE5vbmUgLT4gSW50X2NvbnZlcnNpb25zLmluc2VydF9kZWxpbWl0ZXIgc3RyaW5nIH5kZWxpbWl0ZXJcbiAgfCBTb21lIChsZWZ0LCByaWdodCkgLT5cbiAgICBsZXQgbGVmdCA9IEludF9jb252ZXJzaW9ucy5pbnNlcnRfZGVsaW1pdGVyIGxlZnQgfmRlbGltaXRlciBpblxuICAgIGxldCByaWdodCA9XG4gICAgICBpZiBzdHJpcF96ZXJvIHRoZW4gU3RyaW5nLnJzdHJpcCByaWdodCB+ZHJvcDooZnVuIGMgLT4gQ2hhci4oID0gKSBjICcwJykgZWxzZSByaWdodFxuICAgIGluXG4gICAgKG1hdGNoIHJpZ2h0IHdpdGhcbiAgICAgfCBcIlwiIC0+IGxlZnRcbiAgICAgfCBfIC0+IGxlZnQgXiBcIi5cIiBeIHJpZ2h0KVxuOztcblxubGV0IHRvX3N0cmluZ19odW0gP2RlbGltaXRlciA/KGRlY2ltYWxzID0gMykgP3N0cmlwX3plcm8gPyhleHBsaWNpdF9wbHVzID0gZmFsc2UpIGYgPVxuICBpZiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlLiggPCApIGRlY2ltYWxzIDBcbiAgdGhlbiBpbnZhbGlkX2FyZ2YgXCJ0b19zdHJpbmdfaHVtOiBpbnZhbGlkIGFyZ3VtZW50IH5kZWNpbWFscz0lZFwiIGRlY2ltYWxzICgpO1xuICBtYXRjaCBjbGFzc2lmeSBmIHdpdGhcbiAgfCBDbGFzcy5JbmZpbml0ZSAtPiBpZiBmID4gMC4gdGhlbiBcImluZlwiIGVsc2UgXCItaW5mXCJcbiAgfCBDbGFzcy5OYW4gLT4gXCJuYW5cIlxuICB8IENsYXNzLk5vcm1hbCB8IENsYXNzLlN1Ym5vcm1hbCB8IENsYXNzLlplcm8gLT5cbiAgICBsZXQgcyA9XG4gICAgICBpZiBleHBsaWNpdF9wbHVzIHRoZW4gc3ByaW50ZiBcIiUrLipmXCIgZGVjaW1hbHMgZiBlbHNlIHNwcmludGYgXCIlLipmXCIgZGVjaW1hbHMgZlxuICAgIGluXG4gICAgaW5zZXJ0X3VuZGVyc2NvcmVzIHMgP2RlbGltaXRlciA/c3RyaXBfemVyb1xuOztcblxubGV0IHNleHBfb2ZfdCB0ID1cbiAgbGV0IHNleHAgPSBzZXhwX29mX3QgdCBpblxuICBtYXRjaCAhU2V4cC5vZl9mbG9hdF9zdHlsZSB3aXRoXG4gIHwgYE5vX3VuZGVyc2NvcmVzIC0+IHNleHBcbiAgfCBgVW5kZXJzY29yZXMgLT5cbiAgICAobWF0Y2ggc2V4cCB3aXRoXG4gICAgIHwgTGlzdCBfIC0+XG4gICAgICAgcmFpc2Vfc1xuICAgICAgICAgKFNleHAubWVzc2FnZVxuICAgICAgICAgICAgXCJbc2V4cF9vZl9mbG9hdF0gcHJvZHVjZWQgc3RyYW5nZSBzZXhwXCJcbiAgICAgICAgICAgIFsgXCJzZXhwXCIsIFNleHAuc2V4cF9vZl90IHNleHAgXSlcbiAgICAgfCBBdG9tIHN0cmluZyAtPlxuICAgICAgIGlmIFN0cmluZy5jb250YWlucyBzdHJpbmcgJ0UnIHRoZW4gc2V4cCBlbHNlIEF0b20gKGluc2VydF91bmRlcnNjb3JlcyBzdHJpbmcpKVxuOztcblxubGV0IHRvX3BhZGRlZF9jb21wYWN0X3N0cmluZ19jdXN0b20gdCA/KHByZWZpeCA9IFwiXCIpIH5raWxvIH5tZWdhIH5naWdhIH50ZXJhID9wZXRhICgpID1cbiAgKCogUm91bmQgYSByYXRpbyB0b3dhcmQgdGhlIG5lYXJlc3QgaW50ZWdlciwgcmVzb2x2aW5nIHRpZXMgdG93YXJkIHRoZSBuZWFyZXN0IGV2ZW5cbiAgICAgbnVtYmVyLiAgRm9yIHNhbmUgaW5wdXRzIChpbiBwYXJ0aWN1bGFyLCB3aGVuIFtkZW5vbWluYXRvcl0gaXMgYW4gaW50ZWdlciBhbmRcbiAgICAgW2FicyBudW1lcmF0b3IgPCAyZTUyXSkgdGhpcyBzaG91bGQgYmUgYWNjdXJhdGUuICBPdGhlcndpc2UsIHRoZSByZXN1bHQgbWlnaHQgYmUgYVxuICAgICBsaXR0bGUgYml0IG9mZiwgYnV0IHdlIGRvbid0IHJlYWxseSB1c2UgdGhhdCBjYXNlLiAqKVxuICBsZXQgaXJvdW5kX3JhdGlvX2V4biB+bnVtZXJhdG9yIH5kZW5vbWluYXRvciA9XG4gICAgbGV0IGsgPSBmbG9vciAobnVtZXJhdG9yIC8uIGRlbm9taW5hdG9yKSBpblxuICAgICgqIGlmIFthYnMgayA8IDJlNTNdLCB0aGVuIGJvdGggW2tdIGFuZCBbayArLiAxLl0gYXJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQsIGFuZCBpblxuICAgICAgIHBhcnRpY3VsYXIgW2sgKy4gMS4gPiBrXS4gIElmIFtkZW5vbWluYXRvcl0gaXMgYWxzbyBhbiBpbnRlZ2VyLCBhbmRcbiAgICAgICBbYWJzIChkZW5vbWluYXRvciAqLiAoayArLiAxKSkgPCAyZTUzXSAoYW5kIGluIHNvbWUgb3RoZXIgY2FzZXMsIHRvbyksIHRoZW4gW2xvd2VyXVxuICAgICAgIGFuZCBbaGlnaGVyXSBhcmUgYWN0dWFsbHkgYm90aCBhY2N1cmF0ZS4gIFNpbmNlIChyb3VnaGx5KVxuICAgICAgIFtudW1lcmF0b3IgPSBkZW5vbWluYXRvciAqLiBrXSB0aGVuIGZvciBbYWJzIG51bWVyYXRvciA8IDJlNTJdIHdlIHNob3VsZCBiZVxuICAgICAgIGZpbmUuICopXG4gICAgbGV0IGxvd2VyID0gZGVub21pbmF0b3IgKi4gayBpblxuICAgIGxldCBoaWdoZXIgPSBkZW5vbWluYXRvciAqLiAoayArLiAxLikgaW5cbiAgICAoKiBTdWJ0cmFjdGluZyBudW1iZXJzIHdpdGhpbiBhIGZhY3RvciBvZiB0d28gZnJvbSBlYWNoIG90aGVyIGlzIGFjY3VyYXRlLlxuICAgICAgIFNvIGVpdGhlciB0aGUgdHdvIHN1YnRyYWN0aW9ucyBiZWxvdyBhcmUgYWNjdXJhdGUsIG9yIGsgPSAwLCBvciBrID0gLTEuXG4gICAgICAgSW4gY2FzZSBvZiBhIHRpZSwgcm91bmQgdG8gZXZlbi4gKilcbiAgICBsZXQgZGlmZl9yaWdodCA9IGhpZ2hlciAtLiBudW1lcmF0b3IgaW5cbiAgICBsZXQgZGlmZl9sZWZ0ID0gbnVtZXJhdG9yIC0uIGxvd2VyIGluXG4gICAgbGV0IGsgPSBpcm91bmRfbmVhcmVzdF9leG4gayBpblxuICAgIGlmIGRpZmZfcmlnaHQgPCBkaWZmX2xlZnRcbiAgICB0aGVuIGsgKyAxXG4gICAgZWxzZSBpZiBkaWZmX3JpZ2h0ID4gZGlmZl9sZWZ0XG4gICAgdGhlbiBrXG4gICAgZWxzZSBpZiAoKiBhIHRpZSAqKVxuICAgICAgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS4oID0gKSAoayBtb2QgMikgMFxuICAgIHRoZW4ga1xuICAgIGVsc2UgayArIDFcbiAgaW5cbiAgbWF0Y2ggY2xhc3NpZnkgdCB3aXRoXG4gIHwgQ2xhc3MuSW5maW5pdGUgLT4gaWYgdCA8IDAuMCB0aGVuIFwiLWluZiAgXCIgZWxzZSBcImluZiAgXCJcbiAgfCBDbGFzcy5OYW4gLT4gXCJuYW4gIFwiXG4gIHwgQ2xhc3MuU3Vibm9ybWFsIHwgQ2xhc3MuTm9ybWFsIHwgQ2xhc3MuWmVybyAtPlxuICAgIGxldCBnbyB0ID1cbiAgICAgIGxldCBjb252X29uZSB0ID1cbiAgICAgICAgYXNzZXJ0ICgwLiA8PSB0ICYmIHQgPCA5OTkuOTUpO1xuICAgICAgICBsZXQgeCA9IHByZWZpeCBeIGZvcm1hdF9mbG9hdCBcIiUuMWZcIiB0IGluXG4gICAgICAgICgqIEZpeCB0aGUgXCIuMFwiIHN1ZmZpeCAqKVxuICAgICAgICBpZiBTdHJpbmcuaXNfc3VmZml4IHggfnN1ZmZpeDpcIi4wXCJcbiAgICAgICAgdGhlbiAoXG4gICAgICAgICAgbGV0IHggPSBCeXRlcy5vZl9zdHJpbmcgeCBpblxuICAgICAgICAgIGxldCBuID0gQnl0ZXMubGVuZ3RoIHggaW5cbiAgICAgICAgICBCeXRlcy5zZXQgeCAobiAtIDEpICcgJztcbiAgICAgICAgICBCeXRlcy5zZXQgeCAobiAtIDIpICcgJztcbiAgICAgICAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIH5ub19tdXRhdGlvbl93aGlsZV9zdHJpbmdfcmVhY2hhYmxlOngpXG4gICAgICAgIGVsc2UgeFxuICAgICAgaW5cbiAgICAgIGxldCBjb252IG1hZyB0IGRlbm9taW5hdG9yID1cbiAgICAgICAgYXNzZXJ0IChcbiAgICAgICAgICAoZGVub21pbmF0b3IgPSAxMDAuICYmIHQgPj0gOTk5Ljk1KVxuICAgICAgICAgIHx8IChkZW5vbWluYXRvciA+PSAxMDBfMDAwLiAmJiB0ID49IHJvdW5kX25lYXJlc3QgKGRlbm9taW5hdG9yICouIDkuOTk5XzUpKSk7XG4gICAgICAgIGFzc2VydCAodCA8IHJvdW5kX25lYXJlc3QgKGRlbm9taW5hdG9yICouIDlfOTk5LjUpKTtcbiAgICAgICAgbGV0IGksIGQgPVxuICAgICAgICAgIGxldCBrID0gaXJvdW5kX3JhdGlvX2V4biB+bnVtZXJhdG9yOnQgfmRlbm9taW5hdG9yIGluXG4gICAgICAgICAgKCogW21vZF0gaXMgb2theSBoZXJlIGJlY2F1c2Ugd2Uga25vdyBpID49IDAuICopXG4gICAgICAgICAgayAvIDEwLCBrIG1vZCAxMFxuICAgICAgICBpblxuICAgICAgICBsZXQgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgICAgIGFzc2VydCAoMCA8PSBpICYmIGkgPCAxMDAwKTtcbiAgICAgICAgYXNzZXJ0ICgwIDw9IGQgJiYgZCA8IDEwKTtcbiAgICAgICAgaWYgZCA9IDBcbiAgICAgICAgdGhlbiBzcHJpbnRmIFwiJXMlZCVzIFwiIHByZWZpeCBpIG1hZ1xuICAgICAgICBlbHNlIHNwcmludGYgXCIlcyVkJXMlZFwiIHByZWZpeCBpIG1hZyBkXG4gICAgICBpblxuICAgICAgKCogV2hpbGUgdGhlIHN0YW5kYXJkIG1ldHJpYyBwcmVmaXhlcyAoZS5nLiBjYXBpdGFsIFwiTVwiIHJhdGhlciB0aGFuIFwibVwiLCBbMV0pIGFyZVxuICAgICAgICAgbm9taW5hbGx5IG1vcmUgY29ycmVjdCwgdGhpcyBoaW5kZXJzIHJlYWRhYmlsaXR5IGluIG91ciBjYXNlLiAgRS5nLiwgMTBHNiBhbmRcbiAgICAgICAgIDEwNjYgbG9vayB0b28gc2ltaWxhci4gIFRoYXQncyBhbiBleHRyZW1lIGV4YW1wbGUsIGJ1dCBpbiBnZW5lcmFsIGssbSxnLHQscFxuICAgICAgICAgcHJvYmFibHkgc3RhbmQgb3V0IGJldHRlciB0aGFuIEssTSxHLFQsUCB3aGVuIGludGVyc3BlcnNlZCB3aXRoIGRpZ2l0cy5cblxuICAgICAgICAgWzFdIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWV0cmljX3ByZWZpeCAqKVxuICAgICAgKCogVGhlIHRyaWNrIGhlcmUgaXMgdGhhdDpcbiAgICAgICAgIC0gdGhlIGZpcnN0IGJvdW5kYXJ5ICg5OTkuOTUpIGFzIGEgZmxvYXQgaXMgc2xpZ2h0bHkgb3Zlci1yZXByZXNlbnRlZCAoc28gaXQgaXNcbiAgICAgICAgICAgYmV0dGVyIGFwcHJveGltYXRlZCBhcyBcIjFrXCIgdGhhbiBhcyBcIjk5OS45XCIpLFxuICAgICAgICAgLSB0aGUgb3RoZXIgYm91bmRhcmllcyBhcmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCwgYmVjYXVzZSB0aGV5IGFyZSBpbnRlZ2Vycy5cbiAgICAgICAgICAgVGhhdCdzIHdoeSB0aGUgc3RyaWN0IGVxdWFsaXRpZXMgYmVsb3cgZG8gZXhhY3RseSB3aGF0IHdlIHdhbnQuICopXG4gICAgICBpZiB0IDwgOTk5Ljk1RTBcbiAgICAgIHRoZW4gY29udl9vbmUgdFxuICAgICAgZWxzZSBpZiB0IDwgOTk5Ljk1RTNcbiAgICAgIHRoZW4gY29udiBraWxvIHQgMTAwLlxuICAgICAgZWxzZSBpZiB0IDwgOTk5Ljk1RTZcbiAgICAgIHRoZW4gY29udiBtZWdhIHQgMTAwXzAwMC5cbiAgICAgIGVsc2UgaWYgdCA8IDk5OS45NUU5XG4gICAgICB0aGVuIGNvbnYgZ2lnYSB0IDEwMF8wMDBfMDAwLlxuICAgICAgZWxzZSBpZiB0IDwgOTk5Ljk1RTEyXG4gICAgICB0aGVuIGNvbnYgdGVyYSB0IDEwMF8wMDBfMDAwXzAwMC5cbiAgICAgIGVsc2UgKFxuICAgICAgICBtYXRjaCBwZXRhIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IHNwcmludGYgXCIlcyUuMWVcIiBwcmVmaXggdFxuICAgICAgICB8IFNvbWUgcGV0YSAtPlxuICAgICAgICAgIGlmIHQgPCA5OTkuOTVFMTVcbiAgICAgICAgICB0aGVuIGNvbnYgcGV0YSB0IDEwMF8wMDBfMDAwXzAwMF8wMDAuXG4gICAgICAgICAgZWxzZSBzcHJpbnRmIFwiJXMlLjFlXCIgcHJlZml4IHQpXG4gICAgaW5cbiAgICBpZiB0ID49IDAuIHRoZW4gZ28gdCBlbHNlIFwiLVwiIF4gZ28gfi0udFxuOztcblxubGV0IHRvX3BhZGRlZF9jb21wYWN0X3N0cmluZyB0ID1cbiAgdG9fcGFkZGVkX2NvbXBhY3Rfc3RyaW5nX2N1c3RvbSB0IH5raWxvOlwia1wiIH5tZWdhOlwibVwiIH5naWdhOlwiZ1wiIH50ZXJhOlwidFwiIH5wZXRhOlwicFwiICgpXG47O1xuXG4oKiBQZXJmb3JtYW5jZSBub3RlOiBJbml0aWFsaXppbmcgdGhlIGFjY3VtdWxhdG9yIHRvIDEgcmVzdWx0cyBpbiBvbmUgZXh0cmFcbiAgIG11bHRpcGx5OyBlLmcuLCB0byBjb21wdXRlIHggKiogNCwgd2UgaW4gcHJpbmNpcGxlIG9ubHkgbmVlZCAyIG11bHRpcGxpZXMsXG4gICBidXQgdGhpcyBmdW5jdGlvbiB3aWxsIGhhdmUgMyBtdWx0aXBsaWVzLiAgSG93ZXZlciwgYXR0ZW1wdHMgdG8gYXZvaWQgdGhpc1xuICAgKGxpa2UgZGVjcmVtZW50aW5nIG4gYW5kIGluaXRpYWxpemluZyBhY2N1bSB0byBiZSB4LCBvciBoYW5kbGluZyBzbWFsbFxuICAgZXhwb25lbnRzIGFzIGEgc3BlY2lhbCBjYXNlKSBoYXZlIG5vdCB5aWVsZGVkIGFueXRoaW5nIHRoYXQgaXMgYSBuZXRcbiAgIGltcHJvdmVtZW50LlxuKilcbmxldCBpbnRfcG93IHggbiA9XG4gIGxldCBvcGVuIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgaW5cbiAgaWYgbiA9IDBcbiAgdGhlbiAxLlxuICBlbHNlIChcbiAgICAoKiBVc2luZyBbeCArLiAoLTAuKV0gb24gdGhlIGZvbGxvd2luZyBsaW5lIGNvbnZpbmNlcyB0aGUgY29tcGlsZXIgdG8gYXZvaWQgYSBjZXJ0YWluXG4gICAgICAgYm94aW5nICh0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbGxvY2F0aW9uIGluIGVhY2ggaXRlcmF0aW9uKS4gIFNvb24sIHRoZSBjb21waWxlclxuICAgICAgIHNob3VsZG4ndCBuZWVkIHRoaXMgXCJoaW50XCIgdG8gYXZvaWQgdGhlIGJveGluZy4gIFRoZSByZWFzb24gd2UgYWRkIC0wIHJhdGhlciB0aGFuIDBcbiAgICAgICBpcyB0aGF0IFt4ICsuICgtMC4pXSBpcyBhcHBhcmVudGx5IGFsd2F5cyB0aGUgc2FtZSBhcyBbeF0sIHdoZXJlYXMgW3ggKy4gMC5dIGlzXG4gICAgICAgbm90LCBpbiB0aGF0IGl0IHNlbmRzIFstMC5dIHRvIFswLl0uICBUaGlzIG1ha2VzIGEgZGlmZmVyZW5jZSBiZWNhdXNlIHdlIHdhbnRcbiAgICAgICBbaW50X3BvdyAoLTAuKSAoLTEpXSB0byByZXR1cm4gbmVnX2luZmluaXR5IGp1c3QgbGlrZSBbLTAuICoqIC0xLl0gd291bGQuICAqKVxuICAgIGxldCB4ID0gcmVmICh4ICsuIC0wLikgaW5cbiAgICBsZXQgbiA9IHJlZiBuIGluXG4gICAgbGV0IGFjY3VtID0gcmVmIDEuIGluXG4gICAgaWYgIW4gPCAwXG4gICAgdGhlbiAoXG4gICAgICAoKiB4ICoqIG4gPSAoMS94KSAqKiAtbiAqKVxuICAgICAgeCA6PSAxLiAvLiAheDtcbiAgICAgIG4gOj0gfi0gKCFuKTtcbiAgICAgIGlmICFuIDwgMFxuICAgICAgdGhlbiAoXG4gICAgICAgICgqIG4gbXVzdCBoYXZlIGJlZW4gbWluX2ludCwgc28gaXQgaXMgbm93IHNvIGJpZyB0aGF0IGl0IGhhcyB3cmFwcGVkIGFyb3VuZC5cbiAgICAgICAgICAgV2UgZGVjcmVtZW50IGl0IHNvIHRoYXQgaXQgbG9va3MgcG9zaXRpdmUgYWdhaW4sIGJ1dCBhY2NvcmRpbmdseSBoYXZlXG4gICAgICAgICAgIHRvIHB1dCBhbiBleHRyYSBmYWN0b3Igb2YgeCBpbiB0aGUgYWNjdW11bGF0b3IuXG4gICAgICAgICopXG4gICAgICAgIGFjY3VtIDo9ICF4O1xuICAgICAgICBkZWNyIG4pKTtcbiAgICAoKiBMZXR0aW5nIFthXSBkZW5vdGUgKHRoZSBvcmlnaW5hbCB2YWx1ZSBvZikgW3ggKiogbl0sIHdlIG1haW50YWluXG4gICAgICAgdGhlIGludmFyaWFudCB0aGF0IFsoeCAqKiBuKSAqLiBhY2N1bSA9IGFdLiAqKVxuICAgIHdoaWxlICFuID4gMSBkb1xuICAgICAgaWYgIW4gbGFuZCAxIDw+IDAgdGhlbiBhY2N1bSA6PSAheCAqLiAhYWNjdW07XG4gICAgICB4IDo9ICF4ICouICF4O1xuICAgICAgbiA6PSAhbiBsc3IgMVxuICAgIGRvbmU7XG4gICAgKCogbiBpcyBuZWNlc3NhcmlseSAxIGF0IHRoaXMgcG9pbnQsIHNvIHRoZXJlIGlzIG9uZSBhZGRpdGlvbmFsXG4gICAgICAgbXVsdGlwbGljYXRpb24gYnkgeC4gKilcbiAgICAheCAqLiAhYWNjdW0pXG47O1xuXG5sZXQgcm91bmRfZ2VuIHggfmhvdyA9XG4gIGlmIHggPSAwLlxuICB0aGVuIDAuXG4gIGVsc2UgaWYgbm90IChpc19maW5pdGUgeClcbiAgdGhlbiB4XG4gIGVsc2UgKFxuICAgICgqIFNpZ25pZmljYW50IGRpZ2l0cyBhbmQgZGVjaW1hbCBkaWdpdHMuICopXG4gICAgbGV0IHNkLCBkZCA9XG4gICAgICBtYXRjaCBob3cgd2l0aFxuICAgICAgfCBgc2lnbmlmaWNhbnRfZGlnaXRzIHNkIC0+XG4gICAgICAgIGxldCBkZCA9IHNkIC0gdG9faW50IChyb3VuZF91cCAobG9nMTAgKGFicyB4KSkpIGluXG4gICAgICAgIHNkLCBkZFxuICAgICAgfCBgZGVjaW1hbF9kaWdpdHMgZGQgLT5cbiAgICAgICAgbGV0IHNkID0gZGQgKyB0b19pbnQgKHJvdW5kX3VwIChsb2cxMCAoYWJzIHgpKSkgaW5cbiAgICAgICAgc2QsIGRkXG4gICAgaW5cbiAgICBsZXQgb3BlbiBJbnRfcmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlIGluXG4gICAgaWYgc2QgPCAwXG4gICAgdGhlbiAwLlxuICAgIGVsc2UgaWYgc2QgPj0gMTdcbiAgICB0aGVuIHhcbiAgICBlbHNlIChcbiAgICAgICgqIENob29zZSB0aGUgb3JkZXIgdGhhdCBpcyBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBmbG9hdC4gU21hbGwgcG9zaXRpdmVcbiAgICAgICAgIGludGVnZXJzIGFyZSwgYnV0IHRoZWlyIGludmVyc2VzIGluIG1vc3QgY2FzZXMgYXJlIG5vdC4gKilcbiAgICAgIGxldCBhYnNfZGQgPSBJbnQuYWJzIGRkIGluXG4gICAgICBpZiBhYnNfZGQgPiAyMiB8fCBzZCA+PSAxNlxuICAgICAgKCogMTAqKjIyIGlzIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIGZsb2F0LCBidXQgMTAqKjIzIGlzIG5vdCwgc28gdXNlIHRoZSBzbG93XG4gICAgICAgICBwYXRoLiAgU2ltaWxhcmx5LCBpZiB3ZSBuZWVkIDE2IHNpZ25pZmljYW50IGRpZ2l0cyBpbiB0aGUgcmVzdWx0LCB0aGVuIHRoZSBpbnRlZ2VyXG4gICAgICAgICBbcm91bmRfbmVhcmVzdCAoeCA8b3A+IG9yZGVyKV0gbWlnaHQgbm90IGJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIGZsb2F0LCBzaW5jZVxuICAgICAgICAgZm9yIHNvbWUgcmFuZ2VzIHdlIG9ubHkgaGF2ZSAxNSBkaWdpdHMgb2YgcHJlY2lzaW9uIGd1YXJhbnRlZWQuXG5cbiAgICAgICAgIFRoYXQgc2FpZCwgd2UgYXJlIHN0aWxsIHJvdW5kaW5nIHR3aWNlIGhlcmU6XG5cbiAgICAgICAgIDEpIGZpcnN0IHRpbWUgd2hlbiByb3VuZGluZyBbeCAqLiBvcmRlcl0gb3IgW3ggLy4gb3JkZXJdIHRvIHRoZSBuZWFyZXN0IGZsb2F0XG4gICAgICAgICAoanVzdCB0aGUgbm9ybWFsIHdheSBmbG9hdGluZy1wb2ludCBtdWx0aXBsaWNhdGlvbiBvciBkaXZpc2lvbiB3b3JrcyksXG5cbiAgICAgICAgIDIpIHNlY29uZCB0aW1lIHdoZW4gYXBwbHlpbmcgW3JvdW5kX25lYXJlc3RfaGFsZl90b19ldmVuXSB0byB0aGUgcmVzdWx0IG9mIHRoZVxuICAgICAgICAgYWJvdmUgb3BlcmF0aW9uXG5cbiAgICAgICAgIFNvIGZvciBhcmd1bWVudHMgd2l0aGluIGFuIHVscCBmcm9tIGEgdGllIHdlIG1pZ2h0IHN0aWxsIHByb2R1Y2UgYW4gb2ZmLWJ5LW9uZVxuICAgICAgICAgcmVzdWx0LiAqKVxuICAgICAgdGhlbiBvZl9zdHJpbmcgKHNwcmludGYgXCIlLipnXCIgc2QgeClcbiAgICAgIGVsc2UgKFxuICAgICAgICBsZXQgb3JkZXIgPSBpbnRfcG93IDEwLiBhYnNfZGQgaW5cbiAgICAgICAgaWYgZGQgPj0gMFxuICAgICAgICB0aGVuIHJvdW5kX25lYXJlc3RfaGFsZl90b19ldmVuICh4ICouIG9yZGVyKSAvLiBvcmRlclxuICAgICAgICBlbHNlIHJvdW5kX25lYXJlc3RfaGFsZl90b19ldmVuICh4IC8uIG9yZGVyKSAqLiBvcmRlcikpKVxuOztcblxubGV0IHJvdW5kX3NpZ25pZmljYW50IHggfnNpZ25pZmljYW50X2RpZ2l0cyA9XG4gIGlmIEludF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUuKCA8PSApIHNpZ25pZmljYW50X2RpZ2l0cyAwXG4gIHRoZW5cbiAgICBpbnZhbGlkX2FyZ2ZcbiAgICAgIFwiRmxvYXQucm91bmRfc2lnbmlmaWNhbnQ6IGludmFsaWQgYXJndW1lbnQgc2lnbmlmaWNhbnRfZGlnaXRzOiVkXCJcbiAgICAgIHNpZ25pZmljYW50X2RpZ2l0c1xuICAgICAgKClcbiAgZWxzZSByb3VuZF9nZW4geCB+aG93Oihgc2lnbmlmaWNhbnRfZGlnaXRzIHNpZ25pZmljYW50X2RpZ2l0cylcbjs7XG5cbmxldCByb3VuZF9kZWNpbWFsIHggfmRlY2ltYWxfZGlnaXRzID0gcm91bmRfZ2VuIHggfmhvdzooYGRlY2ltYWxfZGlnaXRzIGRlY2ltYWxfZGlnaXRzKVxubGV0IGJldHdlZW4gdCB+bG93IH5oaWdoID0gbG93IDw9IHQgJiYgdCA8PSBoaWdoXG5cbmxldCBjbGFtcF9leG4gdCB+bWluIH5tYXggPVxuICAoKiBBbHNvIGZhaWxzIGlmIFttaW5dIG9yIFttYXhdIGlzIG5hbiAqKVxuICBhc3NlcnQgKG1pbiA8PSBtYXgpO1xuICAoKiBjbGFtcF91bmNoZWNrZWQgaXMgaW4gZmxvYXQwLm1sICopXG4gIGNsYW1wX3VuY2hlY2tlZCB0IH5taW4gfm1heFxuOztcblxubGV0IGNsYW1wIHQgfm1pbiB+bWF4ID1cbiAgKCogQWxzbyBmYWlscyBpZiBbbWluXSBvciBbbWF4XSBpcyBuYW4gKilcbiAgaWYgbWluIDw9IG1heFxuICB0aGVuIE9rIChjbGFtcF91bmNoZWNrZWQgdCB+bWluIH5tYXgpXG4gIGVsc2VcbiAgICBPcl9lcnJvci5lcnJvcl9zXG4gICAgICAoU2V4cC5tZXNzYWdlXG4gICAgICAgICBcImNsYW1wIHJlcXVpcmVzIFttaW4gPD0gbWF4XVwiXG4gICAgICAgICBbIFwibWluXCIsIFQuc2V4cF9vZl90IG1pbjsgXCJtYXhcIiwgVC5zZXhwX29mX3QgbWF4IF0pXG47O1xuXG5sZXQgKCArICkgPSAoICsuIClcbmxldCAoIC0gKSA9ICggLS4gKVxubGV0ICggKiApID0gKCAqLiApXG5sZXQgKCAqKiApID0gKCAqKiApXG5sZXQgKCAvICkgPSAoIC8uIClcbmxldCAoICUgKSA9ICggJS4gKVxubGV0ICggfi0gKSA9ICggfi0uIClcblxubGV0IHNpZ25fZXhuIHQgOiBTaWduLnQgPVxuICBpZiB0ID4gMC5cbiAgdGhlbiBQb3NcbiAgZWxzZSBpZiB0IDwgMC5cbiAgdGhlbiBOZWdcbiAgZWxzZSBpZiB0ID0gMC5cbiAgdGhlbiBaZXJvXG4gIGVsc2UgRXJyb3IucmFpc2VfcyAoU2V4cC5tZXNzYWdlIFwiRmxvYXQuc2lnbl9leG4gb2YgTkFOXCIgWyBcIlwiLCBzZXhwX29mX3QgdCBdKVxuOztcblxubGV0IHNpZ25fb3JfbmFuIHQgOiBTaWduX29yX25hbi50ID1cbiAgaWYgdCA+IDAuIHRoZW4gUG9zIGVsc2UgaWYgdCA8IDAuIHRoZW4gTmVnIGVsc2UgaWYgdCA9IDAuIHRoZW4gWmVybyBlbHNlIE5hblxuOztcblxubGV0IGllZWVfbmVnYXRpdmUgdCA9XG4gIGxldCBiaXRzID0gQ2FtbC5JbnQ2NC5iaXRzX29mX2Zsb2F0IHQgaW5cbiAgUG9seS4oYml0cyA8IENhbWwuSW50NjQuemVybylcbjs7XG5cbmxldCBleHBvbmVudF9iaXRzID0gMTFcbmxldCBtYW50aXNzYV9iaXRzID0gNTJcbmxldCBleHBvbmVudF9tYXNrNjQgPSBJbnQ2NC4oc2hpZnRfbGVmdCBvbmUgZXhwb25lbnRfYml0cyAtIG9uZSlcbmxldCBleHBvbmVudF9tYXNrID0gSW50NjQudG9faW50X2V4biBleHBvbmVudF9tYXNrNjRcbmxldCBtYW50aXNzYV9tYXNrID0gSW50NjMuKHNoaWZ0X2xlZnQgb25lIG1hbnRpc3NhX2JpdHMgLSBvbmUpXG5sZXQgbWFudGlzc2FfbWFzazY0ID0gSW50NjMudG9faW50NjQgbWFudGlzc2FfbWFza1xuXG5sZXQgaWVlZV9leHBvbmVudCB0ID1cbiAgbGV0IGJpdHMgPSBDYW1sLkludDY0LmJpdHNfb2ZfZmxvYXQgdCBpblxuICBJbnQ2NC4oYml0X2FuZCAoc2hpZnRfcmlnaHRfbG9naWNhbCBiaXRzIG1hbnRpc3NhX2JpdHMpIGV4cG9uZW50X21hc2s2NClcbiAgfD4gQ2FtbC5JbnQ2NC50b19pbnRcbjs7XG5cbmxldCBpZWVlX21hbnRpc3NhIHQgPVxuICBsZXQgYml0cyA9IENhbWwuSW50NjQuYml0c19vZl9mbG9hdCB0IGluXG4gIEludDYzLm9mX2ludDY0X2V4biBDYW1sLkludDY0Lihsb2dhbmQgYml0cyBtYW50aXNzYV9tYXNrNjQpXG47O1xuXG5sZXQgY3JlYXRlX2llZWVfZXhuIH5uZWdhdGl2ZSB+ZXhwb25lbnQgfm1hbnRpc3NhID1cbiAgaWYgSW50LihiaXRfYW5kIGV4cG9uZW50IGV4cG9uZW50X21hc2sgPD4gZXhwb25lbnQpXG4gIHRoZW4gZmFpbHdpdGhmIFwiZXhwb25lbnQgJWQgb3V0IG9mIHJhbmdlIFswLCAlZF1cIiBleHBvbmVudCBleHBvbmVudF9tYXNrICgpXG4gIGVsc2UgaWYgSW50NjMuKGJpdF9hbmQgbWFudGlzc2EgbWFudGlzc2FfbWFzayA8PiBtYW50aXNzYSlcbiAgdGhlblxuICAgIGZhaWx3aXRoZlxuICAgICAgXCJtYW50aXNzYSAlcyBvdXQgb2YgcmFuZ2UgWzAsICVzXVwiXG4gICAgICAoSW50NjMudG9fc3RyaW5nIG1hbnRpc3NhKVxuICAgICAgKEludDYzLnRvX3N0cmluZyBtYW50aXNzYV9tYXNrKVxuICAgICAgKClcbiAgZWxzZSAoXG4gICAgbGV0IHNpZ25fYml0cyA9IGlmIG5lZ2F0aXZlIHRoZW4gQ2FtbC5JbnQ2NC5taW5faW50IGVsc2UgQ2FtbC5JbnQ2NC56ZXJvIGluXG4gICAgbGV0IGV4cHRfYml0cyA9IENhbWwuSW50NjQuc2hpZnRfbGVmdCAoQ2FtbC5JbnQ2NC5vZl9pbnQgZXhwb25lbnQpIG1hbnRpc3NhX2JpdHMgaW5cbiAgICBsZXQgbWFudF9iaXRzID0gSW50NjMudG9faW50NjQgbWFudGlzc2EgaW5cbiAgICBsZXQgYml0cyA9IENhbWwuSW50NjQuKGxvZ29yIHNpZ25fYml0cyAobG9nb3IgZXhwdF9iaXRzIG1hbnRfYml0cykpIGluXG4gICAgQ2FtbC5JbnQ2NC5mbG9hdF9vZl9iaXRzIGJpdHMpXG47O1xuXG5sZXQgY3JlYXRlX2llZWUgfm5lZ2F0aXZlIH5leHBvbmVudCB+bWFudGlzc2EgPVxuICBPcl9lcnJvci50cnlfd2l0aCAoZnVuICgpIC0+IGNyZWF0ZV9pZWVlX2V4biB+bmVnYXRpdmUgfmV4cG9uZW50IH5tYW50aXNzYSlcbjs7XG5cbm1vZHVsZSBUZXJzZSA9IHN0cnVjdFxuICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gIGxldCB0X29mX3NleHAgPSB0X29mX3NleHBcbiAgbGV0IHRvX3N0cmluZyB4ID0gUHJpbnRmLnNwcmludGYgXCIlLjhHXCIgeFxuICBsZXQgc2V4cF9vZl90IHggPSBTZXhwLkF0b20gKHRvX3N0cmluZyB4KVxuICBsZXQgb2Zfc3RyaW5nIHggPSBvZl9zdHJpbmcgeFxuICBsZXQgdF9zZXhwX2dyYW1tYXIgPSB0X3NleHBfZ3JhbW1hclxuZW5kXG5cbmluY2x1ZGUgQ29tcGFyYWJsZS5XaXRoX3plcm8gKHN0cnVjdFxuICAgIGluY2x1ZGUgVFxuXG4gICAgbGV0IHplcm8gPSB6ZXJvXG4gIGVuZClcblxuKCogVGhlc2UgYXJlIHBhcnRseSBoZXJlIGFzIGEgcGVyZm9ybWFuY2UgaGFjayB0byBhdm9pZCBzb21lIGJveGluZyB3ZSdyZSBnZXR0aW5nIHdpdGhcbiAgIHRoZSB2ZXJzaW9ucyB3ZSBnZXQgZnJvbSBbV2l0aF96ZXJvXS4gIFRoZXkgYWxzbyBtYWtlIFtGbG9hdC5pc19uZWdhdGl2ZSBuYW5dIGFuZFxuICAgW0Zsb2F0LmlzX25vbl9wb3NpdGl2ZSBuYW5dIHJldHVybiBbZmFsc2VdOyB0aGUgdmVyc2lvbnMgd2UgZ2V0IGZyb20gW1dpdGhfemVyb10gcmV0dXJuXG4gICBbdHJ1ZV0uICopXG5sZXQgaXNfcG9zaXRpdmUgdCA9IHQgPiAwLlxubGV0IGlzX25vbl9uZWdhdGl2ZSB0ID0gdCA+PSAwLlxubGV0IGlzX25lZ2F0aXZlIHQgPSB0IDwgMC5cbmxldCBpc19ub25fcG9zaXRpdmUgdCA9IHQgPD0gMC5cblxuaW5jbHVkZSBQcmV0dHlfcHJpbnRlci5SZWdpc3RlciAoc3RydWN0XG4gICAgaW5jbHVkZSBUXG5cbiAgICBsZXQgbW9kdWxlX25hbWUgPSBcIkJhc2UuRmxvYXRcIlxuICAgIGxldCB0b19zdHJpbmcgPSB0b19zdHJpbmdcbiAgZW5kKVxuXG5tb2R1bGUgTyA9IHN0cnVjdFxuICBsZXQgKCArICkgPSAoICsgKVxuICBsZXQgKCAtICkgPSAoIC0gKVxuICBsZXQgKCAqICkgPSAoICogKVxuICBsZXQgKCAvICkgPSAoIC8gKVxuICBsZXQgKCAlICkgPSAoICUgKVxuICBsZXQgKCB+LSApID0gKCB+LSApXG4gIGxldCAoICoqICkgPSAoICoqIClcblxuICBpbmNsdWRlIChGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmUgOiBDb21wYXJpc29ucy5JbmZpeCB3aXRoIHR5cGUgdCA6PSB0KVxuXG4gIGxldCBhYnMgPSBhYnNcbiAgbGV0IG5lZyA9IG5lZ1xuICBsZXQgemVybyA9IHplcm9cbiAgbGV0IG9mX2ludCA9IG9mX2ludFxuICBsZXQgb2ZfZmxvYXQgeCA9IHhcbmVuZFxuXG5tb2R1bGUgT19kb3QgPSBzdHJ1Y3RcbiAgbGV0ICggKi4gKSA9ICggKiApXG4gIGxldCAoICsuICkgPSAoICsgKVxuICBsZXQgKCAtLiApID0gKCAtIClcbiAgbGV0ICggLy4gKSA9ICggLyApXG4gIGxldCAoICUuICkgPSAoICUgKVxuICBsZXQgKCB+LS4gKSA9ICggfi0gKVxuICBsZXQgKCAqKi4gKSA9ICggKiogKVxuZW5kXG5cbm1vZHVsZSBQcml2YXRlID0gc3RydWN0XG4gIGxldCBib3ggPSBib3hcbiAgbGV0IGNsYW1wX3VuY2hlY2tlZCA9IGNsYW1wX3VuY2hlY2tlZFxuICBsZXQgbG93ZXJfYm91bmRfZm9yX2ludCA9IGxvd2VyX2JvdW5kX2Zvcl9pbnRcbiAgbGV0IHVwcGVyX2JvdW5kX2Zvcl9pbnQgPSB1cHBlcl9ib3VuZF9mb3JfaW50XG4gIGxldCBzcGVjaWFsaXplZF9oYXNoID0gaGFzaF9mbG9hdFxuICBsZXQgb25lX3VscF9sZXNzX3RoYW5faGFsZiA9IG9uZV91bHBfbGVzc190aGFuX2hhbGZcbiAgbGV0IGludDYzX3JvdW5kX25lYXJlc3RfcG9ydGFibGVfYWxsb2NfZXhuID0gaW50NjNfcm91bmRfbmVhcmVzdF9wb3J0YWJsZV9hbGxvY19leG5cbiAgbGV0IGludDYzX3JvdW5kX25lYXJlc3RfYXJjaDY0X25vYWxsb2NfZXhuID0gaW50NjNfcm91bmRfbmVhcmVzdF9hcmNoNjRfbm9hbGxvY19leG5cbiAgbGV0IGlyb3VuZF9uZWFyZXN0X2V4bl82NCA9IGlyb3VuZF9uZWFyZXN0X2V4bl82NFxuZW5kXG5cbigqIEluY2x1ZGUgdHlwZS1zcGVjaWZpYyBbUmVwbGFjZV9wb2x5bW9ycGhpY19jb21wYXJlXSBhdCB0aGUgZW5kLCBhZnRlclxuICAgaW5jbHVkaW5nIGZ1bmN0b3IgYXBwbGljYXRpb24gdGhhdCBjb3VsZCBzaGFkb3cgaXRzIGRlZmluaXRpb25zLiBUaGlzIGlzXG4gICBoZXJlIHNvIHRoYXQgZWZmaWNpZW50IHZlcnNpb25zIG9mIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYnlcbiAgIHRoaXMgbW9kdWxlLiAqKVxuaW5jbHVkZSBGbG9hdF9yZXBsYWNlX3BvbHltb3JwaGljX2NvbXBhcmVcblxuKCogVGhlc2UgZnVuY3Rpb25zIHNwZWNpZmljYWxseSByZXBsYWNlIGRlZmF1bHRzIGluIHJlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZS5cblxuICAgVGhlIGRlc2lyZWQgYmVoYXZpb3IgaGVyZSBpcyB0byBwcm9wYWdhdGUgYSBuYW4gaWYgZWl0aGVyIGFyZ3VtZW50IGlzIG5hbi4gQmVjYXVzZSB0aGVcbiAgIGZpcnN0IGNvbXBhcmlzb24gd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIGlmIGVpdGhlciBhcmd1bWVudCBpcyBuYW4sIGl0IHN1ZmZpY2VzIHRvXG4gICBjaGVjayBpZiB4IGlzIG5hbi4gVGhlbiwgd2hlbiB4IGlzIG5hbiBvciBib3RoIHggYW5kIHkgYXJlIG5hbiwgd2UgcmV0dXJuIHggPSBuYW47IGFuZFxuICAgd2hlbiB5IGlzIG5hbiBidXQgbm90IHgsIHdlIHJldHVybiB5ID0gbmFuLlxuXG4gICBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIHRvIGltcGxlbWVudCB0aGVzZSBmdW5jdGlvbnMuICBUaGUgYmVuY2htYXJrIGJlbG93IHNob3dzIGEgZmV3XG4gICBkaWZmZXJlbnQgdmVyc2lvbnMuICBUaGlzIGJlbmNobWFyayB3YXMgcnVuIG92ZXIgYW4gYXJyYXkgb2YgcmFuZG9tIGZsb2F0cyAobm9uZSBvZlxuICAgd2hpY2ggYXJlIG5hbikuXG5cbiAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAg4pSCIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4pSCIFRpbWUvUnVuIOKUglxuICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICDilIIgaWYgaXNfbmFuIHggdGhlbiB4IGVsc2UgaWYgeCA8IHkgdGhlbiB4IGVsc2UgeSDilIIgICAyLjQydXMg4pSCXG4gICDilIIgaWYgaXNfbmFuIHggfHwgeCA8IHkgdGhlbiB4IGVsc2UgeSAgICAgICAgICAgICDilIIgICAyLjAydXMg4pSCXG4gICDilIIgaWYgeCA8IHkgfHwgaXNfbmFuIHggdGhlbiB4IGVsc2UgeSAgICAgICAgICAgICDilIIgICAxLjg4dXMg4pSCXG4gICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuICAgVGhlIGJlbmNobWFyayBiZWxvdyB3YXMgcnVuIHdoZW4geCA+IHkgaXMgYWx3YXlzIHRydWUgKGFnYWluLCBubyBuYW4gdmFsdWVzKS5cblxuICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICDilIIgTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilIIgVGltZS9SdW4g4pSCXG4gICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgIOKUgiBpZiBpc19uYW4geCB0aGVuIHggZWxzZSBpZiB4IDwgeSB0aGVuIHggZWxzZSB5IOKUgiAgIDIuODN1cyDilIJcbiAgIOKUgiBpZiBpc19uYW4geCB8fCB4IDwgeSB0aGVuIHggZWxzZSB5ICAgICAgICAgICAgIOKUgiAgIDEuOTd1cyDilIJcbiAgIOKUgiBpZiB4IDwgeSB8fCBpc19uYW4geCB0aGVuIHggZWxzZSB5ICAgICAgICAgICAgIOKUgiAgIDEuNTZ1cyDilIJcbiAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuKilcbmxldCBtaW4gKHggOiB0KSB5ID0gaWYgeCA8IHkgfHwgaXNfbmFuIHggdGhlbiB4IGVsc2UgeVxubGV0IG1heCAoeCA6IHQpIHkgPSBpZiB4ID4geSB8fCBpc19uYW4geCB0aGVuIHggZWxzZSB5XG4iLCJvcGVuISBJbXBvcnRcbmluY2x1ZGUgQnVmZmVyX2ludGZcbmluY2x1ZGUgQ2FtbC5CdWZmZXJcblxubGV0IGNvbnRlbnRzX2J5dGVzID0gdG9fYnl0ZXNcbmxldCBhZGRfc3Vic3RyaW5nIHQgcyB+cG9zIH5sZW4gPSBhZGRfc3Vic3RyaW5nIHQgcyBwb3MgbGVuXG5sZXQgYWRkX3N1YmJ5dGVzIHQgcyB+cG9zIH5sZW4gPSBhZGRfc3ViYnl0ZXMgdCBzIHBvcyBsZW5cbmxldCBzZXhwX29mX3QgdCA9IHNleHBfb2Zfc3RyaW5nIChjb250ZW50cyB0KVxuXG5tb2R1bGUgVG9fYnl0ZXMgPVxuICBCbGl0Lk1ha2VfZGlzdGluY3RcbiAgICAoc3RydWN0XG4gICAgICB0eXBlIG5vbnJlYyB0ID0gdFxuXG4gICAgICBsZXQgbGVuZ3RoID0gbGVuZ3RoXG4gICAgZW5kKVxuICAgIChzdHJ1Y3RcbiAgICAgIHR5cGUgdCA9IEJ5dGVzLnRcblxuICAgICAgbGV0IGNyZWF0ZSB+bGVuID0gQnl0ZXMuY3JlYXRlIGxlblxuICAgICAgbGV0IGxlbmd0aCA9IEJ5dGVzLmxlbmd0aFxuXG4gICAgICBsZXQgdW5zYWZlX2JsaXQgfnNyYyB+c3JjX3BvcyB+ZHN0IH5kc3RfcG9zIH5sZW4gPVxuICAgICAgICBDYW1sLkJ1ZmZlci5ibGl0IHNyYyBzcmNfcG9zIGRzdCBkc3RfcG9zIGxlblxuICAgICAgOztcbiAgICBlbmQpXG5cbmluY2x1ZGUgVG9fYnl0ZXNcbm1vZHVsZSBUb19zdHJpbmcgPSBCbGl0Lk1ha2VfdG9fc3RyaW5nIChDYW1sLkJ1ZmZlcikgKFRvX2J5dGVzKVxuIiwib3BlbiEgSW1wb3J0XG5tb2R1bGUgU3lzID0gU3lzMFxuXG50eXBlIHQgPSBDYW1sLlByaW50ZXhjLnJhd19iYWNrdHJhY2VcblxubGV0IGVsaWRlID0gcmVmIGZhbHNlXG5sZXQgZWxpZGVkX21lc3NhZ2UgPSBcIjxiYWNrdHJhY2UgZWxpZGVkIGluIHRlc3Q+XCJcblxubGV0IGdldCA/KGF0X21vc3RfbnVtX2ZyYW1lcyA9IEludC5tYXhfdmFsdWUpICgpID1cbiAgQ2FtbC5QcmludGV4Yy5nZXRfY2FsbHN0YWNrIGF0X21vc3RfbnVtX2ZyYW1lc1xuOztcblxubGV0IHRvX3N0cmluZyB0ID1cbiAgaWYgIWVsaWRlIHRoZW4gZWxpZGVkX21lc3NhZ2UgZWxzZSBDYW1sLlByaW50ZXhjLnJhd19iYWNrdHJhY2VfdG9fc3RyaW5nIHRcbjs7XG5cbmxldCB0b19zdHJpbmdfbGlzdCB0ID0gU3RyaW5nLnNwbGl0X2xpbmVzICh0b19zdHJpbmcgdClcbmxldCBzZXhwX29mX3QgdCA9IFNleHAuTGlzdCAoTGlzdC5tYXAgKHRvX3N0cmluZ19saXN0IHQpIH5mOihmdW4geCAtPiBTZXhwLkF0b20geCkpXG5cbm1vZHVsZSBFeG4gPSBzdHJ1Y3RcbiAgbGV0IHNldF9yZWNvcmRpbmcgPSBDYW1sLlByaW50ZXhjLnJlY29yZF9iYWNrdHJhY2VcbiAgbGV0IGFtX3JlY29yZGluZyA9IENhbWwuUHJpbnRleGMuYmFja3RyYWNlX3N0YXR1c1xuICBsZXQgbW9zdF9yZWNlbnQgKCkgPSBDYW1sLlByaW50ZXhjLmdldF9yYXdfYmFja3RyYWNlICgpXG5cbiAgbGV0IG1vc3RfcmVjZW50X2Zvcl9leG4gZXhuID1cbiAgICBpZiBFeG4uaXNfcGh5c19lcXVhbF9tb3N0X3JlY2VudCBleG4gdGhlbiBTb21lIChtb3N0X3JlY2VudCAoKSkgZWxzZSBOb25lXG4gIDs7XG5cbiAgKCogV2UgdHVybiBvbiBiYWNrdHJhY2VzIGJ5IGRlZmF1bHQgaWYgT0NBTUxSVU5QQVJBTSBkb2Vzbid0IGV4cGxpY2l0bHkgbWVudGlvbiB0aGVtLiAqKVxuICBsZXQgbWF5YmVfc2V0X3JlY29yZGluZyAoKSA9XG4gICAgbGV0IG9jYW1scnVucGFyYW1fbWVudGlvbnNfYmFja3RyYWNlcyA9XG4gICAgICBtYXRjaCBTeXMuZ2V0ZW52IFwiT0NBTUxSVU5QQVJBTVwiIHdpdGhcbiAgICAgIHwgTm9uZSAtPiBmYWxzZVxuICAgICAgfCBTb21lIHggLT4gTGlzdC5leGlzdHMgKFN0cmluZy5zcGxpdCB4IH5vbjonLCcpIH5mOihTdHJpbmcuaXNfcHJlZml4IH5wcmVmaXg6XCJiXCIpXG4gICAgaW5cbiAgICBpZiBub3Qgb2NhbWxydW5wYXJhbV9tZW50aW9uc19iYWNrdHJhY2VzIHRoZW4gc2V0X3JlY29yZGluZyB0cnVlXG4gIDs7XG5cbiAgKCogdGhlIGNhbGxlciBzZXQgc29tZXRoaW5nLCB0aGV5IGFyZSByZXNwb25zaWJsZSAqKVxuXG4gIGxldCB3aXRoX3JlY29yZGluZyBiIH5mID1cbiAgICBsZXQgc2F2ZWQgPSBhbV9yZWNvcmRpbmcgKCkgaW5cbiAgICBzZXRfcmVjb3JkaW5nIGI7XG4gICAgRXhuLnByb3RlY3QgfmYgfmZpbmFsbHk6KGZ1biAoKSAtPiBzZXRfcmVjb3JkaW5nIHNhdmVkKVxuICA7O1xuZW5kXG5cbmxldCBpbml0aWFsaXplX21vZHVsZSAoKSA9IEV4bi5tYXliZV9zZXRfcmVjb3JkaW5nICgpXG4iLCIoKiogVGhpcyBtb2R1bGUgaXMgdGhlIHRvcGxldmVsIG9mIHRoZSBCYXNlIGxpYnJhcnk7IGl0J3Mgd2hhdCB5b3UgZ2V0IHdoZW4geW91IHdyaXRlXG4gICAgW29wZW4gQmFzZV0uXG5cbiAgICBUaGUgZ29hbCBvZiBCYXNlIGlzIGJvdGggdG8gYmUgYSBtb3JlIGNvbXBsZXRlIHN0YW5kYXJkIGxpYnJhcnksIHdpdGggcmljaGVyIEFQSXMsXG4gICAgYW5kIHRvIGJlIG1vcmUgY29uc2lzdGVudCBpbiBpdHMgZGVzaWduLiBGb3IgaW5zdGFuY2UsIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5XG4gICAgc29tZSB0aGluZ3MgaGF2ZSBtb2R1bGVzIGFuZCBvdGhlcnMgZG9uJ3Q7IGluIEJhc2UsIGV2ZXJ5dGhpbmcgaXMgYSBtb2R1bGUuXG5cbiAgICBCYXNlIGV4dGVuZHMgc29tZSBtb2R1bGVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSwgbGlrZSBbQXJyYXldLFxuICAgIFtCdWZmZXJdLCBbQnl0ZXNdLCBbQ2hhcl0sIFtIYXNodGJsXSwgW0ludDMyXSwgW0ludDY0XSwgW0xhenldLCBbTGlzdF0sIFtNYXBdLFxuICAgIFtOYXRpdmVpbnRdLCBbUHJpbnRmXSwgW1JhbmRvbV0sIFtTZXRdLCBbU3RyaW5nXSwgW1N5c10sIGFuZCBbVWNoYXJdLiBPbmUga2V5XG4gICAgZGlmZmVyZW5jZSBpcyB0aGF0IEJhc2UgZG9lc24ndCB1c2UgZXhjZXB0aW9ucyBhcyBtdWNoIGFzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGFuZFxuICAgIGluc3RlYWQgbWFrZXMgaGVhdnkgdXNlIG9mIHRoZSBbUmVzdWx0XSB0eXBlLCBhcyBpbjpcblxuICAgIHtbIHR5cGUgKCdhLCdiKSByZXN1bHQgPSBPayBvZiAnYSB8IEVycm9yIG9mICdiIF19XG5cbiAgICBCYXNlIGFsc28gYWRkcyBlbnRpcmVseSBuZXcgbW9kdWxlcywgbW9zdCBub3RhYmx5OlxuXG4gICAgLSBbQ29tcGFyYWJsZV0sIFtDb21wYXJhdG9yXSwgYW5kIFtDb21wYXJpc29uc10gaW4gbGlldSBvZiBwb2x5bW9ycGhpYyBjb21wYXJlLlxuICAgIC0gW0NvbnRhaW5lcl0sIHdoaWNoIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgYWNyb3NzIGNvbnRhaW5lci1saWtlIGRhdGFcbiAgICAgIHN0cnVjdHVyZXMgKGFycmF5cywgbGlzdHMsIHN0cmluZ3MpLlxuICAgIC0gW1Jlc3VsdF0sIFtFcnJvcl0sIGFuZCBbT3JfZXJyb3JdLCBzdXBwb3J0aW5nIHRoZSBvci1lcnJvciBwYXR0ZXJuLlxuKilcblxuKCpfIFdlIGhpZGUgdGhpcyBmcm9tIHRoZSB3ZWIgZG9jcyBiZWNhdXNlIHRoZSBsaW5lIHdyYXBwaW5nIGlzIGJhZCwgbWFraW5nIGl0XG4gIHByZXR0eSBtdWNoIGluc2NydXRhYmxlLiAqKVxuKCoqLyoqKVxuXG4oKiBUaGUgaW50ZW50IGlzIHRvIHNoYWRvdyBhbGwgb2YgSU5SSUEncyBzdGFuZGFyZCBsaWJyYXJ5LiAgTW9kdWxlcyBiZWxvdyB3b3VsZCBjYXVzZVxuICAgY29tcGlsYXRpb24gZXJyb3JzIHdpdGhvdXQgYmVpbmcgcmVtb3ZlZCBmcm9tIFtTaGFkb3dfc3RkbGliXSBiZWZvcmUgaW5jbHVzaW9uLiAqKVxuXG5pbmNsdWRlIChcbiAgU2hhZG93X3N0ZGxpYiA6XG4gICAgbW9kdWxlIHR5cGUgb2Ygc3RydWN0XG4gICAgaW5jbHVkZSBTaGFkb3dfc3RkbGliXG4gIGVuZFxuICAoKiBNb2R1bGVzIGRlZmluZWQgaW4gQmFzZSAqKVxuICB3aXRoIG1vZHVsZSBBcnJheSA6PSBTaGFkb3dfc3RkbGliLkFycmF5XG4gIHdpdGggbW9kdWxlIEF0b21pYyA6PSBTaGFkb3dfc3RkbGliLkF0b21pY1xuICB3aXRoIG1vZHVsZSBCb29sIDo9IFNoYWRvd19zdGRsaWIuQm9vbFxuICB3aXRoIG1vZHVsZSBCdWZmZXIgOj0gU2hhZG93X3N0ZGxpYi5CdWZmZXJcbiAgd2l0aCBtb2R1bGUgQnl0ZXMgOj0gU2hhZG93X3N0ZGxpYi5CeXRlc1xuICB3aXRoIG1vZHVsZSBDaGFyIDo9IFNoYWRvd19zdGRsaWIuQ2hhclxuICB3aXRoIG1vZHVsZSBFaXRoZXIgOj0gU2hhZG93X3N0ZGxpYi5FaXRoZXJcbiAgd2l0aCBtb2R1bGUgRmxvYXQgOj0gU2hhZG93X3N0ZGxpYi5GbG9hdFxuICB3aXRoIG1vZHVsZSBIYXNodGJsIDo9IFNoYWRvd19zdGRsaWIuSGFzaHRibFxuICB3aXRoIG1vZHVsZSBJbl9jaGFubmVsIDo9IFNoYWRvd19zdGRsaWIuSW5fY2hhbm5lbFxuICB3aXRoIG1vZHVsZSBJbnQgOj0gU2hhZG93X3N0ZGxpYi5JbnRcbiAgd2l0aCBtb2R1bGUgSW50MzIgOj0gU2hhZG93X3N0ZGxpYi5JbnQzMlxuICB3aXRoIG1vZHVsZSBJbnQ2NCA6PSBTaGFkb3dfc3RkbGliLkludDY0XG4gIHdpdGggbW9kdWxlIExhenkgOj0gU2hhZG93X3N0ZGxpYi5MYXp5XG4gIHdpdGggbW9kdWxlIExpc3QgOj0gU2hhZG93X3N0ZGxpYi5MaXN0XG4gIHdpdGggbW9kdWxlIE1hcCA6PSBTaGFkb3dfc3RkbGliLk1hcFxuICB3aXRoIG1vZHVsZSBOYXRpdmVpbnQgOj0gU2hhZG93X3N0ZGxpYi5OYXRpdmVpbnRcbiAgd2l0aCBtb2R1bGUgT3B0aW9uIDo9IFNoYWRvd19zdGRsaWIuT3B0aW9uXG4gIHdpdGggbW9kdWxlIE91dF9jaGFubmVsIDo9IFNoYWRvd19zdGRsaWIuT3V0X2NoYW5uZWxcbiAgd2l0aCBtb2R1bGUgUHJpbnRmIDo9IFNoYWRvd19zdGRsaWIuUHJpbnRmXG4gIHdpdGggbW9kdWxlIFF1ZXVlIDo9IFNoYWRvd19zdGRsaWIuUXVldWVcbiAgd2l0aCBtb2R1bGUgUmFuZG9tIDo9IFNoYWRvd19zdGRsaWIuUmFuZG9tXG4gIHdpdGggbW9kdWxlIFJlc3VsdCA6PSBTaGFkb3dfc3RkbGliLlJlc3VsdFxuICB3aXRoIG1vZHVsZSBTZXQgOj0gU2hhZG93X3N0ZGxpYi5TZXRcbiAgd2l0aCBtb2R1bGUgU3RhY2sgOj0gU2hhZG93X3N0ZGxpYi5TdGFja1xuICB3aXRoIG1vZHVsZSBTdHJpbmcgOj0gU2hhZG93X3N0ZGxpYi5TdHJpbmdcbiAgd2l0aCBtb2R1bGUgU3lzIDo9IFNoYWRvd19zdGRsaWIuU3lzXG4gIHdpdGggbW9kdWxlIFVjaGFyIDo9IFNoYWRvd19zdGRsaWIuVWNoYXJcbiAgd2l0aCBtb2R1bGUgVW5pdCA6PSBTaGFkb3dfc3RkbGliLlVuaXRcbiAgKCogU3VwcG9ydCBmb3IgZ2VuZXJhdGVkIGxleGVycyAqKVxuICB3aXRoIG1vZHVsZSBMZXhpbmcgOj0gU2hhZG93X3N0ZGxpYi5MZXhpbmdcbiAgd2l0aCB0eXBlICgnYSwgJ2IsICdjKSBmb3JtYXQgOj0gKCdhLCAnYiwgJ2MpIGZvcm1hdFxuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0IDo9ICgnYSwgJ2IsICdjLCAnZCkgZm9ybWF0NFxuICB3aXRoIHR5cGUgKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDYgOj0gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDZcbiAgd2l0aCB0eXBlICdhIHJlZiA6PSAnYSByZWYpIFtAb2NhbWwud2FybmluZyBcIi0zXCJdXG5cbigqKi8qKilcblxub3BlbiEgSW1wb3J0XG5tb2R1bGUgQXBwbGljYXRpdmUgPSBBcHBsaWNhdGl2ZVxubW9kdWxlIEFycmF5ID0gQXJyYXlcbm1vZHVsZSBBdmx0cmVlID0gQXZsdHJlZVxubW9kdWxlIEJhY2t0cmFjZSA9IEJhY2t0cmFjZVxubW9kdWxlIEJpbmFyeV9zZWFyY2ggPSBCaW5hcnlfc2VhcmNoXG5tb2R1bGUgQmluYXJ5X3NlYXJjaGFibGUgPSBCaW5hcnlfc2VhcmNoYWJsZVxubW9kdWxlIEJsaXQgPSBCbGl0XG5tb2R1bGUgQm9vbCA9IEJvb2xcbm1vZHVsZSBCdWZmZXIgPSBCdWZmZXJcbm1vZHVsZSBCeXRlcyA9IEJ5dGVzXG5tb2R1bGUgQ2hhciA9IENoYXJcbm1vZHVsZSBDb21wYXJhYmxlID0gQ29tcGFyYWJsZVxubW9kdWxlIENvbXBhcmF0b3IgPSBDb21wYXJhdG9yXG5tb2R1bGUgQ29tcGFyaXNvbnMgPSBDb21wYXJpc29uc1xubW9kdWxlIENvbnRhaW5lciA9IENvbnRhaW5lclxubW9kdWxlIEVpdGhlciA9IEVpdGhlclxubW9kdWxlIEVxdWFsID0gRXF1YWxcbm1vZHVsZSBFcnJvciA9IEVycm9yXG5tb2R1bGUgRXhuID0gRXhuXG5tb2R1bGUgRmllbGQgPSBGaWVsZFxubW9kdWxlIEZsb2F0ID0gRmxvYXRcbm1vZHVsZSBGbG9hdGFibGUgPSBGbG9hdGFibGVcbm1vZHVsZSBGbiA9IEZuXG5tb2R1bGUgRm9ybWF0dGVyID0gRm9ybWF0dGVyXG5tb2R1bGUgSGFzaCA9IEhhc2hcbm1vZHVsZSBIYXNoX3NldCA9IEhhc2hfc2V0XG5tb2R1bGUgSGFzaGFibGUgPSBIYXNoYWJsZVxubW9kdWxlIEhhc2hlciA9IEhhc2hlclxubW9kdWxlIEhhc2h0YmwgPSBIYXNodGJsXG5tb2R1bGUgSWRlbnRpZmlhYmxlID0gSWRlbnRpZmlhYmxlXG5tb2R1bGUgSW5kZXhlZF9jb250YWluZXIgPSBJbmRleGVkX2NvbnRhaW5lclxubW9kdWxlIEluZm8gPSBJbmZvXG5tb2R1bGUgSW50ID0gSW50XG5tb2R1bGUgSW50X2NvbnZlcnNpb25zID0gSW50X2NvbnZlcnNpb25zXG5tb2R1bGUgSW50MzIgPSBJbnQzMlxubW9kdWxlIEludDYzID0gSW50NjNcbm1vZHVsZSBJbnQ2NCA9IEludDY0XG5tb2R1bGUgSW50YWJsZSA9IEludGFibGVcbm1vZHVsZSBJbnRfbWF0aCA9IEludF9tYXRoXG5tb2R1bGUgSW52YXJpYW50ID0gSW52YXJpYW50XG5tb2R1bGUgTGF6eSA9IExhenlcbm1vZHVsZSBMaXN0ID0gTGlzdFxubW9kdWxlIE1hcCA9IE1hcFxubW9kdWxlIE1heWJlX2JvdW5kID0gTWF5YmVfYm91bmRcbm1vZHVsZSBNb25hZCA9IE1vbmFkXG5tb2R1bGUgTmF0aXZlaW50ID0gTmF0aXZlaW50XG5tb2R1bGUgTm90aGluZyA9IE5vdGhpbmdcbm1vZHVsZSBPcHRpb24gPSBPcHRpb25cbm1vZHVsZSBPcHRpb25fYXJyYXkgPSBPcHRpb25fYXJyYXlcbm1vZHVsZSBPcl9lcnJvciA9IE9yX2Vycm9yXG5tb2R1bGUgT3JkZXJlZF9jb2xsZWN0aW9uX2NvbW1vbiA9IE9yZGVyZWRfY29sbGVjdGlvbl9jb21tb25cbm1vZHVsZSBPcmRlcmluZyA9IE9yZGVyaW5nXG5tb2R1bGUgUG9seSA9IFBvbHlcbm1vZHVsZSBQb2x5bW9ycGhpY19jb21wYXJlID0gUG9seSBbQEBkZXByZWNhdGVkIFwiW3NpbmNlIDIwMTgtMTFdIHVzZSBbUG9seV0gaW5zdGVhZFwiXVxuXG5tb2R1bGUgUG9wY291bnQgPSBQb3Bjb3VudFxuW0BAZGVwcmVjYXRlZCBcIltzaW5jZSAyMDE4LTEwXSB1c2UgW3BvcGNvdW50XSBmdW5jdGlvbnMgaW4gdGhlIGluZGl2aWR1YWwgaW50IG1vZHVsZXNcIl1cblxubW9kdWxlIFByZXR0eV9wcmludGVyID0gUHJldHR5X3ByaW50ZXJcbm1vZHVsZSBQcmludGYgPSBQcmludGZcbm1vZHVsZSBMaW5rZWRfcXVldWUgPSBMaW5rZWRfcXVldWVcbm1vZHVsZSBRdWV1ZSA9IFF1ZXVlXG5tb2R1bGUgUmFuZG9tID0gUmFuZG9tXG5tb2R1bGUgUmVmID0gUmVmXG5tb2R1bGUgUmVzdWx0ID0gUmVzdWx0XG5tb2R1bGUgU2VxdWVuY2UgPSBTZXF1ZW5jZVxubW9kdWxlIFNldCA9IFNldFxubW9kdWxlIFNleHBhYmxlID0gU2V4cGFibGVcbm1vZHVsZSBTaWduID0gU2lnblxubW9kdWxlIFNpZ25fb3JfbmFuID0gU2lnbl9vcl9uYW5cbm1vZHVsZSBTb3VyY2VfY29kZV9wb3NpdGlvbiA9IFNvdXJjZV9jb2RlX3Bvc2l0aW9uXG5tb2R1bGUgU3RhY2sgPSBTdGFja1xubW9kdWxlIFN0YWdlZCA9IFN0YWdlZFxubW9kdWxlIFN0cmluZyA9IFN0cmluZ1xubW9kdWxlIFN0cmluZ2FibGUgPSBTdHJpbmdhYmxlXG5tb2R1bGUgU3lzID0gU3lzXG5tb2R1bGUgVCA9IFRcbm1vZHVsZSBUeXBlX2VxdWFsID0gVHlwZV9lcXVhbFxubW9kdWxlIFVuaWZvcm1fYXJyYXkgPSBVbmlmb3JtX2FycmF5XG5tb2R1bGUgVW5pdCA9IFVuaXRcbm1vZHVsZSBVY2hhciA9IFVjaGFyXG5tb2R1bGUgVmFyaWFudCA9IFZhcmlhbnRcbm1vZHVsZSBXaXRoX3JldHVybiA9IFdpdGhfcmV0dXJuXG5tb2R1bGUgV29yZF9zaXplID0gV29yZF9zaXplXG5cbigqIEF2b2lkIGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gZm9yIHVzZXMgb2YgdGhlIHNpZ25hdHVyZXMgZGVmaW5lZCBpbiBbVF0uICopXG5pbmNsdWRlIFRcblxuKCogVGhpcyBpcyBhIGhhY2sgc28gdGhhdCBvZG9jIGNyZWF0ZXMgYmV0dGVyIGRvY3VtZW50YXRpb24uICopXG5tb2R1bGUgU2V4cCA9IHN0cnVjdFxuICBpbmNsdWRlIFNleHBfd2l0aF9jb21wYXJhYmxlICgqKiBAaW5saW5lICopXG5lbmRcblxuKCoqLyoqKVxuXG5tb2R1bGUgRXhwb3J0ZWRfZm9yX3NwZWNpZmljX3VzZXMgPSBzdHJ1Y3RcbiAgbW9kdWxlIEZpZWxkc2xpYiA9IEZpZWxkc2xpYlxuICBtb2R1bGUgUHB4X2hhc2hfbGliID0gUHB4X2hhc2hfbGliXG4gIG1vZHVsZSBWYXJpYW50c2xpYiA9IFZhcmlhbnRzbGliXG4gIG1vZHVsZSBQcHhfY29tcGFyZV9saWIgPSBQcHhfY29tcGFyZV9saWJcbiAgbW9kdWxlIFBweF9lbnVtZXJhdGVfbGliID0gUHB4X2VudW1lcmF0ZV9saWJcblxuICBsZXQgYW1fdGVzdGluZyA9IGFtX3Rlc3RpbmdcbmVuZFxuXG4oKiovKiopXG5cbm1vZHVsZSBFeHBvcnQgPSBzdHJ1Y3RcbiAgKCogW2Rlcml2aW5nIGhhc2hdIGlzIG1pc3NpbmcgZm9yIFthcnJheV0gYW5kIFtyZWZdIHNpbmNlIHRoZXNlIHR5cGVzIGFyZSBtdXRhYmxlLiAqKVxuICB0eXBlICdhIGFycmF5ID0gJ2EgQXJyYXkudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9hcnJheSA6ICdhLiAoJ2EgLT4gJ2EgLT4gaW50KSAtPiAnYSBhcnJheSAtPiAnYSBhcnJheSAtPiBpbnQgPSBBcnJheS5jb21wYXJlXG4gIGxldCBlcXVhbF9hcnJheSA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgYXJyYXkgLT4gJ2EgYXJyYXkgLT4gYm9vbCA9IEFycmF5LmVxdWFsXG5cbiAgbGV0IGFycmF5X29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIGFycmF5ID1cbiAgICBBcnJheS50X29mX3NleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl9hcnJheSA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSBhcnJheSAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIEFycmF5LnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCAoYXJyYXlfc2V4cF9ncmFtbWFyIDpcbiAgICAgICAgICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIGFycmF5IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KVxuICAgID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBBcnJheS50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGJvb2wgPSBCb29sLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfYm9vbCA9IChCb29sLmNvbXBhcmUgOiBib29sIC0+IGJvb2wgLT4gaW50KVxuICBsZXQgZXF1YWxfYm9vbCA9IChCb29sLmVxdWFsIDogYm9vbCAtPiBib29sIC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfYm9vbCA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gYm9vbCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIEJvb2wuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfYm9vbCA6IGJvb2wgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IEJvb2wuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBib29sX29mX3NleHAgPSAoQm9vbC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gYm9vbClcbiAgbGV0IHNleHBfb2ZfYm9vbCA9IChCb29sLnNleHBfb2ZfdCA6IGJvb2wgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGJvb2xfc2V4cF9ncmFtbWFyIDogYm9vbCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBCb29sLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGNoYXIgPSBDaGFyLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfY2hhciA9IChDaGFyLmNvbXBhcmUgOiBjaGFyIC0+IGNoYXIgLT4gaW50KVxuICBsZXQgZXF1YWxfY2hhciA9IChDaGFyLmVxdWFsIDogY2hhciAtPiBjaGFyIC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfY2hhciA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gY2hhciAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIENoYXIuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfY2hhciA6IGNoYXIgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IENoYXIuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBjaGFyX29mX3NleHAgPSAoQ2hhci50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gY2hhcilcbiAgbGV0IHNleHBfb2ZfY2hhciA9IChDaGFyLnNleHBfb2ZfdCA6IGNoYXIgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGNoYXJfc2V4cF9ncmFtbWFyIDogY2hhciBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBDaGFyLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGV4biA9IEV4bi50IFtAQGRlcml2aW5nX2lubGluZSBzZXhwX29mXVxuXG4gIGxldCBzZXhwX29mX2V4biA9IChFeG4uc2V4cF9vZl90IDogZXhuIC0+IFNleHBsaWIwLlNleHAudClcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgZmxvYXQgPSBGbG9hdC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2Zsb2F0ID0gKEZsb2F0LmNvbXBhcmUgOiBmbG9hdCAtPiBmbG9hdCAtPiBpbnQpXG4gIGxldCBlcXVhbF9mbG9hdCA9IChGbG9hdC5lcXVhbCA6IGZsb2F0IC0+IGZsb2F0IC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfZmxvYXQgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGZsb2F0IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgRmxvYXQuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfZmxvYXQgOiBmbG9hdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gRmxvYXQuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBmbG9hdF9vZl9zZXhwID0gKEZsb2F0LnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBmbG9hdClcbiAgbGV0IHNleHBfb2ZfZmxvYXQgPSAoRmxvYXQuc2V4cF9vZl90IDogZmxvYXQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGZsb2F0X3NleHBfZ3JhbW1hciA6IGZsb2F0IFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEZsb2F0LnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGludCA9IEludC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2ludCA9IChJbnQuY29tcGFyZSA6IGludCAtPiBpbnQgLT4gaW50KVxuICBsZXQgZXF1YWxfaW50ID0gKEludC5lcXVhbCA6IGludCAtPiBpbnQgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9pbnQgOiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gaW50IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSkgPVxuICAgIEludC5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9pbnQgOiBpbnQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IEludC5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IGludF9vZl9zZXhwID0gKEludC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gaW50KVxuICBsZXQgc2V4cF9vZl9pbnQgPSAoSW50LnNleHBfb2ZfdCA6IGludCAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoaW50X3NleHBfZ3JhbW1hciA6IGludCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBJbnQudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgaW50MzIgPSBJbnQzMi50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2ludDMyID0gKEludDMyLmNvbXBhcmUgOiBpbnQzMiAtPiBpbnQzMiAtPiBpbnQpXG4gIGxldCBlcXVhbF9pbnQzMiA9IChJbnQzMi5lcXVhbCA6IGludDMyIC0+IGludDMyIC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfaW50MzIgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IGludDMyIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgSW50MzIuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfaW50MzIgOiBpbnQzMiAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gSW50MzIuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCBpbnQzMl9vZl9zZXhwID0gKEludDMyLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBpbnQzMilcbiAgbGV0IHNleHBfb2ZfaW50MzIgPSAoSW50MzIuc2V4cF9vZl90IDogaW50MzIgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGludDMyX3NleHBfZ3JhbW1hciA6IGludDMyIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEludDMyLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIGludDY0ID0gSW50NjQudCBbQEBkZXJpdmluZ19pbmxpbmUgY29tcGFyZSwgZXF1YWwsIGhhc2gsIHNleHAsIHNleHBfZ3JhbW1hcl1cblxuICBsZXQgY29tcGFyZV9pbnQ2NCA9IChJbnQ2NC5jb21wYXJlIDogaW50NjQgLT4gaW50NjQgLT4gaW50KVxuICBsZXQgZXF1YWxfaW50NjQgPSAoSW50NjQuZXF1YWwgOiBpbnQ2NCAtPiBpbnQ2NCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX2ludDY0IDpcbiAgICAgICAgIFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSAtPiBpbnQ2NCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIEludDY0Lmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX2ludDY0IDogaW50NjQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IEludDY0Lmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgaW50NjRfb2Zfc2V4cCA9IChJbnQ2NC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gaW50NjQpXG4gIGxldCBzZXhwX29mX2ludDY0ID0gKEludDY0LnNleHBfb2ZfdCA6IGludDY0IC0+IFNleHBsaWIwLlNleHAudClcbiAgbGV0IChpbnQ2NF9zZXhwX2dyYW1tYXIgOiBpbnQ2NCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBJbnQ2NC50X3NleHBfZ3JhbW1hclxuXG4gIFtAQEBlbmRdXG5cbiAgdHlwZSAnYSBsaXN0ID0gJ2EgTGlzdC50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2xpc3QgOiAnYS4gKCdhIC0+ICdhIC0+IGludCkgLT4gJ2EgbGlzdCAtPiAnYSBsaXN0IC0+IGludCA9IExpc3QuY29tcGFyZVxuICBsZXQgZXF1YWxfbGlzdCA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgbGlzdCAtPiAnYSBsaXN0IC0+IGJvb2wgPSBMaXN0LmVxdWFsXG5cbiAgbGV0IGhhc2hfZm9sZF9saXN0IDpcbiAgICAnYS5cbiAgICAoUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+ICdhIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGVcbiAgICAtPiAnYSBsaXN0XG4gICAgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlXG4gICAgPVxuICAgIExpc3QuaGFzaF9mb2xkX3RcbiAgOztcblxuICBsZXQgbGlzdF9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSBsaXN0ID1cbiAgICBMaXN0LnRfb2Zfc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX2xpc3QgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgbGlzdCAtPiBTZXhwbGliMC5TZXhwLnQgPVxuICAgIExpc3Quc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IChsaXN0X3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIGxpc3QgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBmdW4gXydhX3NleHBfZ3JhbW1hciAtPiBMaXN0LnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgbmF0aXZlaW50ID0gTmF0aXZlaW50LnRcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfbmF0aXZlaW50ID0gKE5hdGl2ZWludC5jb21wYXJlIDogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBpbnQpXG4gIGxldCBlcXVhbF9uYXRpdmVpbnQgPSAoTmF0aXZlaW50LmVxdWFsIDogbmF0aXZlaW50IC0+IG5hdGl2ZWludCAtPiBib29sKVxuXG4gIGxldCAoaGFzaF9mb2xkX25hdGl2ZWludCA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gbmF0aXZlaW50IC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZSlcbiAgICA9XG4gICAgTmF0aXZlaW50Lmhhc2hfZm9sZF90XG5cbiAgYW5kIChoYXNoX25hdGl2ZWludCA6IG5hdGl2ZWludCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guaGFzaF92YWx1ZSkgPVxuICAgIGxldCBmdW5jID0gTmF0aXZlaW50Lmhhc2ggaW5cbiAgICBmdW4geCAtPiBmdW5jIHhcbiAgOztcblxuICBsZXQgbmF0aXZlaW50X29mX3NleHAgPSAoTmF0aXZlaW50LnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBuYXRpdmVpbnQpXG4gIGxldCBzZXhwX29mX25hdGl2ZWludCA9IChOYXRpdmVpbnQuc2V4cF9vZl90IDogbmF0aXZlaW50IC0+IFNleHBsaWIwLlNleHAudClcblxuICBsZXQgKG5hdGl2ZWludF9zZXhwX2dyYW1tYXIgOiBuYXRpdmVpbnQgU2V4cGxpYjAuU2V4cF9ncmFtbWFyLnQpID1cbiAgICBOYXRpdmVpbnQudF9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgJ2Egb3B0aW9uID0gJ2EgT3B0aW9uLnRcbiAgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfb3B0aW9uIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24gLT4gaW50ID1cbiAgICBPcHRpb24uY29tcGFyZVxuICA7O1xuXG4gIGxldCBlcXVhbF9vcHRpb24gOiAnYS4gKCdhIC0+ICdhIC0+IGJvb2wpIC0+ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24gLT4gYm9vbCA9XG4gICAgT3B0aW9uLmVxdWFsXG4gIDs7XG5cbiAgbGV0IGhhc2hfZm9sZF9vcHRpb24gOlxuICAgICdhLlxuICAgIChQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gJ2EgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlKVxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgIC0+ICdhIG9wdGlvblxuICAgIC0+IFBweF9oYXNoX2xpYi5TdGQuSGFzaC5zdGF0ZVxuICAgID1cbiAgICBPcHRpb24uaGFzaF9mb2xkX3RcbiAgOztcblxuICBsZXQgb3B0aW9uX29mX3NleHAgOiAnYS4gKFNleHBsaWIwLlNleHAudCAtPiAnYSkgLT4gU2V4cGxpYjAuU2V4cC50IC0+ICdhIG9wdGlvbiA9XG4gICAgT3B0aW9uLnRfb2Zfc2V4cFxuICA7O1xuXG4gIGxldCBzZXhwX29mX29wdGlvbiA6ICdhLiAoJ2EgLT4gU2V4cGxpYjAuU2V4cC50KSAtPiAnYSBvcHRpb24gLT4gU2V4cGxpYjAuU2V4cC50ID1cbiAgICBPcHRpb24uc2V4cF9vZl90XG4gIDs7XG5cbiAgbGV0IChvcHRpb25fc2V4cF9ncmFtbWFyIDpcbiAgICAgICAgICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIG9wdGlvbiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudClcbiAgICA9XG4gICAgZnVuIF8nYV9zZXhwX2dyYW1tYXIgLT4gT3B0aW9uLnRfc2V4cF9ncmFtbWFyIF8nYV9zZXhwX2dyYW1tYXJcbiAgOztcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgJ2EgcmVmID0gJ2EgUmVmLnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfcmVmIDogJ2EuICgnYSAtPiAnYSAtPiBpbnQpIC0+ICdhIHJlZiAtPiAnYSByZWYgLT4gaW50ID0gUmVmLmNvbXBhcmVcbiAgbGV0IGVxdWFsX3JlZiA6ICdhLiAoJ2EgLT4gJ2EgLT4gYm9vbCkgLT4gJ2EgcmVmIC0+ICdhIHJlZiAtPiBib29sID0gUmVmLmVxdWFsXG5cbiAgbGV0IHJlZl9vZl9zZXhwIDogJ2EuIChTZXhwbGliMC5TZXhwLnQgLT4gJ2EpIC0+IFNleHBsaWIwLlNleHAudCAtPiAnYSByZWYgPVxuICAgIFJlZi50X29mX3NleHBcbiAgOztcblxuICBsZXQgc2V4cF9vZl9yZWYgOiAnYS4gKCdhIC0+IFNleHBsaWIwLlNleHAudCkgLT4gJ2EgcmVmIC0+IFNleHBsaWIwLlNleHAudCA9XG4gICAgUmVmLnNleHBfb2ZfdFxuICA7O1xuXG4gIGxldCAocmVmX3NleHBfZ3JhbW1hciA6ICdhIFNleHBsaWIwLlNleHBfZ3JhbW1hci50IC0+ICdhIHJlZiBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPVxuICAgIGZ1biBfJ2Ffc2V4cF9ncmFtbWFyIC0+IFJlZi50X3NleHBfZ3JhbW1hciBfJ2Ffc2V4cF9ncmFtbWFyXG4gIDs7XG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIHN0cmluZyA9IFN0cmluZy50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgaGFzaCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX3N0cmluZyA9IChTdHJpbmcuY29tcGFyZSA6IHN0cmluZyAtPiBzdHJpbmcgLT4gaW50KVxuICBsZXQgZXF1YWxfc3RyaW5nID0gKFN0cmluZy5lcXVhbCA6IHN0cmluZyAtPiBzdHJpbmcgLT4gYm9vbClcblxuICBsZXQgKGhhc2hfZm9sZF9zdHJpbmcgOlxuICAgICAgICAgUHB4X2hhc2hfbGliLlN0ZC5IYXNoLnN0YXRlIC0+IHN0cmluZyAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIFN0cmluZy5oYXNoX2ZvbGRfdFxuXG4gIGFuZCAoaGFzaF9zdHJpbmcgOiBzdHJpbmcgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IFN0cmluZy5oYXNoIGluXG4gICAgZnVuIHggLT4gZnVuYyB4XG4gIDs7XG5cbiAgbGV0IHN0cmluZ19vZl9zZXhwID0gKFN0cmluZy50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gc3RyaW5nKVxuICBsZXQgc2V4cF9vZl9zdHJpbmcgPSAoU3RyaW5nLnNleHBfb2ZfdCA6IHN0cmluZyAtPiBTZXhwbGliMC5TZXhwLnQpXG4gIGxldCAoc3RyaW5nX3NleHBfZ3JhbW1hciA6IHN0cmluZyBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBTdHJpbmcudF9zZXhwX2dyYW1tYXJcblxuICBbQEBAZW5kXVxuXG4gIHR5cGUgYnl0ZXMgPSBCeXRlcy50IFtAQGRlcml2aW5nX2lubGluZSBjb21wYXJlLCBlcXVhbCwgc2V4cCwgc2V4cF9ncmFtbWFyXVxuXG4gIGxldCBjb21wYXJlX2J5dGVzID0gKEJ5dGVzLmNvbXBhcmUgOiBieXRlcyAtPiBieXRlcyAtPiBpbnQpXG4gIGxldCBlcXVhbF9ieXRlcyA9IChCeXRlcy5lcXVhbCA6IGJ5dGVzIC0+IGJ5dGVzIC0+IGJvb2wpXG4gIGxldCBieXRlc19vZl9zZXhwID0gKEJ5dGVzLnRfb2Zfc2V4cCA6IFNleHBsaWIwLlNleHAudCAtPiBieXRlcylcbiAgbGV0IHNleHBfb2ZfYnl0ZXMgPSAoQnl0ZXMuc2V4cF9vZl90IDogYnl0ZXMgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKGJ5dGVzX3NleHBfZ3JhbW1hciA6IGJ5dGVzIFNleHBsaWIwLlNleHBfZ3JhbW1hci50KSA9IEJ5dGVzLnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICB0eXBlIHVuaXQgPSBVbml0LnQgW0BAZGVyaXZpbmdfaW5saW5lIGNvbXBhcmUsIGVxdWFsLCBoYXNoLCBzZXhwLCBzZXhwX2dyYW1tYXJdXG5cbiAgbGV0IGNvbXBhcmVfdW5pdCA9IChVbml0LmNvbXBhcmUgOiB1bml0IC0+IHVuaXQgLT4gaW50KVxuICBsZXQgZXF1YWxfdW5pdCA9IChVbml0LmVxdWFsIDogdW5pdCAtPiB1bml0IC0+IGJvb2wpXG5cbiAgbGV0IChoYXNoX2ZvbGRfdW5pdCA6XG4gICAgICAgICBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUgLT4gdW5pdCAtPiBQcHhfaGFzaF9saWIuU3RkLkhhc2guc3RhdGUpXG4gICAgPVxuICAgIFVuaXQuaGFzaF9mb2xkX3RcblxuICBhbmQgKGhhc2hfdW5pdCA6IHVuaXQgLT4gUHB4X2hhc2hfbGliLlN0ZC5IYXNoLmhhc2hfdmFsdWUpID1cbiAgICBsZXQgZnVuYyA9IFVuaXQuaGFzaCBpblxuICAgIGZ1biB4IC0+IGZ1bmMgeFxuICA7O1xuXG4gIGxldCB1bml0X29mX3NleHAgPSAoVW5pdC50X29mX3NleHAgOiBTZXhwbGliMC5TZXhwLnQgLT4gdW5pdClcbiAgbGV0IHNleHBfb2ZfdW5pdCA9IChVbml0LnNleHBfb2ZfdCA6IHVuaXQgLT4gU2V4cGxpYjAuU2V4cC50KVxuICBsZXQgKHVuaXRfc2V4cF9ncmFtbWFyIDogdW5pdCBTZXhwbGliMC5TZXhwX2dyYW1tYXIudCkgPSBVbml0LnRfc2V4cF9ncmFtbWFyXG5cbiAgW0BAQGVuZF1cblxuICAoKiogRm9ybWF0IHN0dWZmICopXG5cbiAgdHlwZSBub25yZWMgKCdhLCAnYiwgJ2MpIGZvcm1hdCA9ICgnYSwgJ2IsICdjKSBmb3JtYXRcbiAgdHlwZSBub25yZWMgKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0ID0gKCdhLCAnYiwgJ2MsICdkKSBmb3JtYXQ0XG4gIHR5cGUgbm9ucmVjICgnYSwgJ2IsICdjLCAnZCwgJ2UsICdmKSBmb3JtYXQ2ID0gKCdhLCAnYiwgJ2MsICdkLCAnZSwgJ2YpIGZvcm1hdDZcblxuICAoKiogTGlzdCBvcGVyYXRvcnMgKilcblxuICBpbmNsdWRlIExpc3QuSW5maXhcblxuICAoKiogSW50IG9wZXJhdG9ycyBhbmQgY29tcGFyaXNvbnMgKilcblxuICBpbmNsdWRlIEludC5PXG4gIGluY2x1ZGUgSW50X3JlcGxhY2VfcG9seW1vcnBoaWNfY29tcGFyZVxuXG4gICgqKiBGbG9hdCBvcGVyYXRvcnMgKilcblxuICBpbmNsdWRlIEZsb2F0Lk9fZG90XG5cbiAgKCogVGhpcyBpcyBkZWNsYXJlZCBhcyBhbiBleHRlcm5hbCB0byBiZSBvcHRpbWl6ZWQgYXdheSBpbiBtb3JlIGNvbnRleHRzLiAqKVxuXG4gICgqKiBSZXZlcnNlIGFwcGxpY2F0aW9uIG9wZXJhdG9yLiBbeCB8PiBnIHw+IGZdIGlzIGVxdWl2YWxlbnQgdG8gW2YgKGcgKHgpKV0uICopXG4gIGV4dGVybmFsICggfD4gKSA6ICdhIC0+ICgnYSAtPiAnYikgLT4gJ2IgPSBcIiVyZXZhcHBseVwiXG5cbiAgKCoqIEFwcGxpY2F0aW9uIG9wZXJhdG9yLiBbZyBAQCBmIEBAIHhdIGlzIGVxdWl2YWxlbnQgdG8gW2cgKGYgKHgpKV0uICopXG4gIGV4dGVybmFsICggQEAgKSA6ICgnYSAtPiAnYikgLT4gJ2EgLT4gJ2IgPSBcIiVhcHBseVwiXG5cbiAgKCoqIEJvb2xlYW4gb3BlcmF0aW9ucyAqKVxuXG4gICgqIFRoZXNlIG5lZWQgdG8gYmUgZGVjbGFyZWQgYXMgYW4gZXh0ZXJuYWwgdG8gZ2V0IHRoZSBsYXp5IGJlaGF2aW9yICopXG4gIGV4dGVybmFsICggJiYgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdWFuZFwiXG4gIGV4dGVybmFsICggfHwgKSA6IGJvb2wgLT4gYm9vbCAtPiBib29sID0gXCIlc2VxdW9yXCJcbiAgZXh0ZXJuYWwgbm90IDogYm9vbCAtPiBib29sID0gXCIlYm9vbG5vdFwiXG5cbiAgKCogVGhpcyBtdXN0IGJlIGRlY2xhcmVkIGFzIGFuIGV4dGVybmFsIGZvciB0aGUgd2FybmluZ3MgdG8gd29yayBwcm9wZXJseS4gKilcbiAgZXh0ZXJuYWwgaWdub3JlIDogXyAtPiB1bml0ID0gXCIlaWdub3JlXCJcblxuICAoKiogQ29tbW9uIHN0cmluZyBvcGVyYXRpb25zICopXG4gIGxldCAoIF4gKSA9IFN0cmluZy4oIF4gKVxuXG4gICgqKiBSZWZlcmVuY2Ugb3BlcmF0aW9ucyAqKVxuXG4gICgqIERlY2xhcmVkIGFzIGFuIGV4dGVybmFscyBzbyB0aGF0IHRoZSBjb21waWxlciBza2lwcyB0aGUgY2FtbF9tb2RpZnkgd2hlbiBwb3NzaWJsZSBhbmRcbiAgICAgdG8ga2VlcCByZWZlcmVuY2UgdW5ib3hpbmcgd29ya2luZyAqKVxuICBleHRlcm5hbCAoICEgKSA6ICdhIHJlZiAtPiAnYSA9IFwiJWZpZWxkMFwiXG4gIGV4dGVybmFsIHJlZiA6ICdhIC0+ICdhIHJlZiA9IFwiJW1ha2VtdXRhYmxlXCJcbiAgZXh0ZXJuYWwgKCA6PSApIDogJ2EgcmVmIC0+ICdhIC0+IHVuaXQgPSBcIiVzZXRmaWVsZDBcIlxuXG4gICgqKiBQYWlyIG9wZXJhdGlvbnMgKilcblxuICBsZXQgZnN0ID0gZnN0XG4gIGxldCBzbmQgPSBzbmRcblxuICAoKiogRXhjZXB0aW9ucyBzdHVmZiAqKVxuXG4gICgqIERlY2xhcmVkIGFzIGFuIGV4dGVybmFsIHNvIHRoYXQgdGhlIGNvbXBpbGVyIG1heSByZXdyaXRlICclcmFpc2UnIGFzICclcmVyYWlzZScuICopXG4gIGV4dGVybmFsIHJhaXNlIDogZXhuIC0+IF8gPSBcIiVyYWlzZVwiXG5cbiAgbGV0IGZhaWx3aXRoID0gZmFpbHdpdGhcbiAgbGV0IGludmFsaWRfYXJnID0gaW52YWxpZF9hcmdcbiAgbGV0IHJhaXNlX3MgPSBFcnJvci5yYWlzZV9zXG5cbiAgKCoqIE1pc2MgKilcblxuICBsZXQgcGh5c19lcXVhbCA9IHBoeXNfZXF1YWxcblxuICBleHRlcm5hbCBmb3JjZSA6ICdhIExhenkudCAtPiAnYSA9IFwiJWxhenlfZm9yY2VcIlxuZW5kXG5cbmluY2x1ZGUgRXhwb3J0XG5cbmluY2x1ZGUgQ29udGFpbmVyX2ludGYuRXhwb3J0ICgqKiBAaW5saW5lICopXG5cbmV4Y2VwdGlvbiBOb3RfZm91bmRfcyA9IE5vdF9mb3VuZF9zXG5cbigqIFdlIHBlcmZvcm0gdGhlc2Ugc2lkZSBlZmZlY3RzIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRoZW0gdG8gcnVuIGZvciBhbnkgY29kZSB0aGF0IHVzZXNcbiAgIFtCYXNlXS4gIElmIHRoaXMgd2VyZSBpbiBhbm90aGVyIG1vZHVsZSBpbiBbQmFzZV0gdGhhdCB3YXMgbm90IHVzZWQgaW4gc29tZSBwcm9ncmFtLFxuICAgdGhlbiB0aGUgc2lkZSBlZmZlY3RzIG1pZ2h0IG5vdCBiZSBydW4gaW4gdGhhdCBwcm9ncmFtLiAgVGhpcyB3aWxsIHJ1biBhcyBsb25nIGFzIHRoZVxuICAgcHJvZ3JhbSByZWZlcnMgdG8gYXQgbGVhc3Qgb25lIHZhbHVlIGRpcmVjdGx5IGluIFtCYXNlXTsgcmVmZXJyaW5nIHRvIHZhbHVlcyBpblxuICAgW0Jhc2UuQm9vbF0sIGZvciBleGFtcGxlLCBpcyBub3Qgc3VmZmljaWVudC4gKilcbmxldCAoKSA9IEJhY2t0cmFjZS5pbml0aWFsaXplX21vZHVsZSAoKVxuIiwibW9kdWxlIENvbnYgPSBTZXhwbGliMC5TZXhwX2NvbnZcbm1vZHVsZSBDb252X2Vycm9yID0gU2V4cGxpYjAuU2V4cF9jb252X2Vycm9yXG5tb2R1bGUgU2V4cF9ncmFtbWFyID0gU2V4cGxpYjAuU2V4cF9ncmFtbWFyXG5cbm1vZHVsZSBTZXhwID0gc3RydWN0XG4gIGluY2x1ZGUgU2V4cGxpYjAuU2V4cFxuXG4gIGxldCB0X3NleHBfZ3JhbW1hciA9IENvbnYuc2V4cF90X3NleHBfZ3JhbW1hclxuZW5kXG5cbm1vZHVsZSBTZXhwYWJsZSA9IFNleHBsaWIwLlNleHBhYmxlXG4iLCJtb2R1bGUgTGlzdCA9IExpc3RcblxubW9kdWxlIEVudW1lcmFibGUgPSBzdHJ1Y3RcbiAgbW9kdWxlIHR5cGUgUyA9IHNpZ1xuICAgIHR5cGUgdFxuXG4gICAgdmFsIGFsbCA6IHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMSA9IHNpZ1xuICAgIHR5cGUgJ2EgdFxuXG4gICAgdmFsIGFsbCA6ICdhIGxpc3QgLT4gJ2EgdCBsaXN0XG4gIGVuZFxuXG4gIG1vZHVsZSB0eXBlIFMyID0gc2lnXG4gICAgdHlwZSAoJ2EsICdiKSB0XG5cbiAgICB2YWwgYWxsIDogJ2EgbGlzdCAtPiAnYiBsaXN0IC0+ICgnYSwgJ2IpIHQgbGlzdFxuICBlbmRcblxuICBtb2R1bGUgdHlwZSBTMyA9IHNpZ1xuICAgIHR5cGUgKCdhLCAnYiwgJ2MpIHRcblxuICAgIHZhbCBhbGwgOiAnYSBsaXN0IC0+ICdiIGxpc3QgLT4gJ2MgbGlzdCAtPiAoJ2EsICdiLCAnYykgdCBsaXN0XG4gIGVuZFxuZW5kXG4iLCJbJSVpbXBvcnQgXCJjb25maWcuaFwiXVxuXG5vcGVuISBCYXNlXG5cblslJWlmZGVmIEpTQ19BUkNIX1NJWFRZRk9VUl1cblxuZXh0ZXJuYWwgbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvXG4gIDogIHVuaXRcbiAgLT4gSW50NjMudFxuICA9IFwidGltZV9ub3dfbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvXCJcbltAQG5vYWxsb2NdXG5cblslJWVsc2VdXG5cbmV4dGVybmFsIG5hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVyb1xuICA6ICB1bml0XG4gIC0+IEludDYzLnRcbiAgPSBcInRpbWVfbm93X25hbm9zZWNvbmRzX3NpbmNlX3VuaXhfZXBvY2hfb3JfemVyb1wiXG5cblslJWVuZGlmXVxuWyUlaWZkZWYgSlNDX1BPU0lYX1RJTUVSU11cblxubGV0W0Bjb2xkXSBnZXR0aW1lX2ZhaWxlZCAoKSA9IGZhaWx3aXRoIFwiY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSkgZmFpbGVkXCJcblxuWyUlZWxzZV1cblxubGV0W0Bjb2xkXSBnZXR0aW1lX2ZhaWxlZCAoKSA9IGZhaWx3aXRoIFwiZ2V0dGltZW9mZGF5IGZhaWxlZFwiXG5cblslJWVuZGlmXVxuXG5sZXQgbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaCAoKSA9XG4gIGxldCB0ID0gbmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaF9vcl96ZXJvICgpIGluXG4gIGlmIEludDYzLiggPD4gKSB0IEludDYzLnplcm8gdGhlbiB0IGVsc2UgZ2V0dGltZV9mYWlsZWQgKClcbjs7XG4iLCJtb2R1bGUgVGVzdF9yZXN1bHQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gU3VjY2VzcyB8IEZhaWx1cmUgfCBFcnJvclxuXG4gIGxldCB0b19leGl0X2NvZGUgPSBmdW5jdGlvblxuICAgIHwgU3VjY2VzcyAtPiAwXG4gICAgfCBGYWlsdXJlIC0+IDJcbiAgICB8IEVycm9yICAgLT4gMVxuICA7O1xuXG4gIGxldCB0b19zdHJpbmcgPSBmdW5jdGlvblxuICAgIHwgU3VjY2VzcyAtPiBcInN1Y2Nlc3NcIlxuICAgIHwgRmFpbHVyZSAtPiBcImZhaWx1cmVcIlxuICAgIHwgRXJyb3IgICAtPiBcImVycm9yXCJcbiAgOztcblxuICBsZXQgY29tYmluZSB0MSB0MiA9XG4gICAgbWF0Y2ggdDEsIHQyIHdpdGhcbiAgICB8IFN1Y2Nlc3MsIFN1Y2Nlc3MgICAgICAgIC0+IFN1Y2Nlc3NcbiAgICB8IEVycm9yICAsIF8gfCBfLCBFcnJvciAgIC0+IEVycm9yXG4gICAgfCBGYWlsdXJlLCBfIHwgXywgRmFpbHVyZSAtPiBGYWlsdXJlXG4gIDs7XG5cbiAgbGV0IGNvbWJpbmVfYWxsIHRzID0gTGlzdC5mb2xkX2xlZnQgY29tYmluZSBTdWNjZXNzIHRzXG5lbmRcblxubGV0IHBhcnNlX2FyZ3YgYXJndiBsIGYgbXNnID1cbiAgdHJ5XG4gICAgQXJnLnBhcnNlX2FyZ3YgYXJndiBsIGYgbXNnXG4gIHdpdGhcbiAgfCBBcmcuQmFkIG1zZyAtPiBQcmludGYuZXByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDFcbiAgfCBBcmcuSGVscCBtc2cgLT4gUHJpbnRmLnByaW50ZiBcIiVzXCIgbXNnOyBleGl0IDBcbjs7XG5cbnR5cGUgZGVzY3IgPSBzdHJpbmdcbmxldCB0ZXN0X21vZHVsZXNfcmFuID0gcmVmIDBcbmxldCB0ZXN0X21vZHVsZXNfZmFpbGVkID0gcmVmIDBcbmxldCB0ZXN0c19yYW4gPSByZWYgMFxubGV0IHRlc3RzX2ZhaWxlZCA9IHJlZiAwXG5sZXQgZHluYW1pY19saWIgOiBzdHJpbmcgb3B0aW9uIHJlZiA9IHJlZiBOb25lXG50eXBlIGZpbGVuYW1lID0gc3RyaW5nXG50eXBlIGxpbmVfbnVtYmVyID0gaW50XG50eXBlIHN0YXJ0X3BvcyA9IGludFxudHlwZSBlbmRfcG9zID0gaW50XG50eXBlIGNvbmZpZyA9IChtb2R1bGUgSW5saW5lX3Rlc3RfY29uZmlnLlMpXG50eXBlICdhIHRlc3RfZnVuY3Rpb25fYXJnc1xuICA9IGNvbmZpZzpjb25maWdcbiAgLT4gZGVzY3I6ZGVzY3IgTGF6eS50XG4gIC0+IHRhZ3M6c3RyaW5nIGxpc3RcbiAgLT4gZmlsZW5hbWU6ZmlsZW5hbWVcbiAgLT4gbGluZV9udW1iZXI6bGluZV9udW1iZXJcbiAgLT4gc3RhcnRfcG9zOnN0YXJ0X3Bvc1xuICAtPiBlbmRfcG9zOmVuZF9wb3NcbiAgLT4gJ2FcblxubW9kdWxlIFRhZ19wcmVkaWNhdGUgPSBzdHJ1Y3RcbiAgdHlwZSB0ID1cbiAgICB7IHJlcXVpcmVkX3RhZ3MgIDogc3RyaW5nIGxpc3RcbiAgICA7IGRyb3BwZWRfdGFncyA6IHN0cmluZyBsaXN0XG4gICAgfVxuXG4gIGxldCBlbmFibGVfZXZlcnl0aGluZyA9IHsgcmVxdWlyZWRfdGFncyA9IFtdOyBkcm9wcGVkX3RhZ3MgPSBbXSB9XG5cbiAgbGV0IGRyb3AgdCB0YWcgPVxuICAgIHsgZHJvcHBlZF90YWdzID0gdGFnIDo6IHQuZHJvcHBlZF90YWdzXG4gICAgOyByZXF1aXJlZF90YWdzID0gTGlzdC5maWx0ZXIgKCg8PikgdGFnKSB0LnJlcXVpcmVkX3RhZ3NcbiAgICB9XG5cbiAgbGV0IHJlcXVpcmUgdCB0YWcgPVxuICAgIHsgZHJvcHBlZF90YWdzID0gTGlzdC5maWx0ZXIgKCg8PikgdGFnKSB0LmRyb3BwZWRfdGFnc1xuICAgIDsgcmVxdWlyZWRfdGFncyA9IHRhZyA6OiB0LnJlcXVpcmVkX3RhZ3NcbiAgICB9XG5cbiAgbGV0IGVudGlyZV9tb2R1bGVfZGlzYWJsZWQgdCB+cGFydGlhbF90YWdzOnRhZ3MgPVxuICAgIExpc3QuZXhpc3RzIChmdW4gZHJvcHBlZCAtPiBMaXN0Lm1lbSBkcm9wcGVkIHRhZ3MpIHQuZHJvcHBlZF90YWdzXG5cbiAgbGV0IGRpc2FibGVkIHQgfmNvbXBsZXRlX3RhZ3M6dGFncyA9XG4gICAgTGlzdC5leGlzdHMgKGZ1biByZXEgLT4gbm90IChMaXN0Lm1lbSByZXEgdGFncykpIHQucmVxdWlyZWRfdGFnc1xuICAgIHx8IExpc3QuZXhpc3RzIChmdW4gZHJvcHBlZCAtPiBMaXN0Lm1lbSBkcm9wcGVkIHRhZ3MpIHQuZHJvcHBlZF90YWdzXG5lbmRcblxuXG50eXBlIHdoaWNoX3Rlc3RzID1cbiAgeyBsaWJuYW1lIDogc3RyaW5nXG4gIDsgb25seV90ZXN0X2xvY2F0aW9uIDogKGZpbGVuYW1lICogbGluZV9udW1iZXIgb3B0aW9uICogYm9vbCByZWYpIGxpc3RcbiAgOyBuYW1lX2ZpbHRlciA6IHN0cmluZyBsaXN0XG4gIDsgd2hpY2hfdGFncyA6IFRhZ19wcmVkaWNhdGUudFxuICB9XG50eXBlIHRlc3RfbW9kZSA9XG4gIHsgd2hpY2hfdGVzdHMgOiB3aGljaF90ZXN0c1xuICA7IHdoYXRfdG9fZG8gOlxuICAgICAgWyBgUnVuX3BhcnRpdGlvbiBvZiBzdHJpbmcgb3B0aW9uXG4gICAgICB8IGBMaXN0X3BhcnRpdGlvbnNcbiAgICAgIF1cbiAgfVxuXG5tb2R1bGUgQWN0aW9uIDogc2lnXG4gIHR5cGUgdCA9IFtcbiAgICB8IGBJZ25vcmVcbiAgICB8IGBUZXN0X21vZGUgb2YgdGVzdF9tb2RlXG4gIF1cbiAgdmFsIGdldCA6IHVuaXQgLT4gdFxuICB2YWwgc2V0IDogdCAtPiB1bml0XG5lbmQgPSBzdHJ1Y3RcbiAgdHlwZSB0ID0gW1xuICAgIHwgYElnbm9yZVxuICAgIHwgYFRlc3RfbW9kZSBvZiB0ZXN0X21vZGVcbiAgXVxuICBsZXQgYWN0aW9uIDogdCByZWYgPSByZWYgYElnbm9yZVxuICBsZXQgZm9yY2VfZHJvcCA9XG4gICAgdHJ5IGlnbm9yZSAoU3lzLmdldGVudiBcIkZPUkNFX0RST1BfSU5MSU5FX1RFU1RcIiA6IHN0cmluZyk7IHRydWVcbiAgICB3aXRoIE5vdF9mb3VuZCAtPiBmYWxzZVxuICBsZXQgZ2V0ICgpID1cbiAgICAoKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGNvbXBpbGluZyB0byBqYXZhc2NyaXB0LlxuICAgICAgIEpzX29mX29jYW1sIGNhbiBzdGF0aWNhbGx5IGV2YWx1YXRlIFtTeXMuZ2V0ZW52IFwiRk9SQ0VfRFJPUF9JTkxJTkVfVEVTVFwiXVxuICAgICAgIGFuZCBpbmxpbmUgdGhlIHJlc3VsdCAoW2BJZ25vcmVdKSB3aGVuZXZlciBbZ2V0ICgpXSBpcyBjYWxsZWQuXG4gICAgICAgVW5pdCB0ZXN0cyBjYW4gdGhlbiBiZSB0cmVhdGVkIGFzIGRlYWRjb2RlIHNpbmNlIHRoZSBhcmd1bWVudCBbZl0gb2YgdGhlIFt0ZXN0XVxuICAgICAgIGZ1bmN0aW9uIGJlbG93IGlzIG5ldmVyIHVzZWQuICopXG4gICAgaWYgZm9yY2VfZHJvcFxuICAgIHRoZW4gYElnbm9yZVxuICAgIGVsc2UgIWFjdGlvblxuXG4gIGxldCBzZXQgdiA9IGFjdGlvbiA6PSB2XG5lbmRcblxubW9kdWxlIFBhcnRpdGlvbiA6IHNpZ1xuICB2YWwgZm91bmRfdGVzdCA6IHVuaXQgLT4gdW5pdFxuICB2YWwgc2V0X2N1cnJlbnQgOiBzdHJpbmcgLT4gdW5pdFxuICB2YWwgaXNfY3VycmVudCA6IHN0cmluZyBvcHRpb24gLT4gYm9vbFxuICB2YWwgYWxsIDogdW5pdCAtPiBzdHJpbmcgbGlzdFxuZW5kID0gc3RydWN0XG4gIGxldCBhbGwgPSBIYXNodGJsLmNyZWF0ZSAyM1xuICBsZXQgY3VycmVudCA9IHJlZiBcIlwiICBsZXQgc2V0X2N1cnJlbnQgeCA9IGN1cnJlbnQgOj0geFxuICBsZXQgZm91bmRfdGVzdCAoKSA9XG4gICAgaWYgIWN1cnJlbnQgPD4gXCJcIiAmJiBub3QgKEhhc2h0YmwubWVtIGFsbCAhY3VycmVudCkgdGhlblxuICAgICAgSGFzaHRibC5hZGQgYWxsICFjdXJyZW50ICgpXG4gIDs7XG4gIGxldCBpc19jdXJyZW50ID0gZnVuY3Rpb25cbiAgICB8IE5vbmUgLT4gdHJ1ZVxuICAgIHwgU29tZSBwIC0+IHAgPSAhY3VycmVudFxuICA7O1xuICBsZXQgYWxsICgpID1cbiAgICBMaXN0LnNvcnQgU3RyaW5nLmNvbXBhcmVcbiAgICAgIChIYXNodGJsLmZvbGQgKGZ1biBrICgpIGFjYyAtPiBrIDo6IGFjYykgYWxsIFtdKVxuICA7O1xuZW5kXG5cbm1vZHVsZSBNb2R1bGVfY29udGV4dCA9IHN0cnVjdFxuICBtb2R1bGUgVCA9IHN0cnVjdFxuICAgIHR5cGUgb25lX21vZHVsZSA9XG4gICAgICB7IGRlc2NyIDogc3RyaW5nXG4gICAgICA7IHRhZ3MgOiBzdHJpbmcgbGlzdFxuICAgICAgfVxuXG4gICAgdHlwZSB0ID0gb25lX21vZHVsZSBsaXN0XG5cbiAgICBsZXQgZGVzY3IgdCA9IExpc3QubWFwIChmdW4gbSAtPiBtLmRlc2NyKSB0XG4gICAgbGV0IHRhZ3MgdCA9IExpc3QuY29uY2F0IChMaXN0Lm1hcCAoZnVuIG0gLT4gbS50YWdzKSB0KVxuICBlbmRcblxuICBsZXQgY3VycmVudCA6IFQudCByZWYgPSByZWYgW11cblxuICBsZXQgd2l0aF8gfmRlc2NyIH50YWdzIGYgPVxuICAgIGxldCBwcmV2ID0gIWN1cnJlbnQgaW5cbiAgICBjdXJyZW50IDo9IHsgVC4gZGVzY3I7IHRhZ3MgfSA6OiBwcmV2O1xuICAgIHRyeVxuICAgICAgbGV0IHggPSBmICgpIGluXG4gICAgICBjdXJyZW50IDo9IHByZXY7XG4gICAgICB4XG4gICAgd2l0aCBlIC0+XG4gICAgICBjdXJyZW50IDo9IHByZXY7XG4gICAgICByYWlzZSBlXG5cbiAgbGV0IGN1cnJlbnRfZGVzY3IgKCkgPSBULmRlc2NyICFjdXJyZW50XG4gIGxldCBjdXJyZW50X3RhZ3MgICgpID0gVC50YWdzICAhY3VycmVudFxuZW5kXG5cbmxldCB2ZXJib3NlID0gcmVmIGZhbHNlXG5sZXQgc3RyaWN0ID0gcmVmIGZhbHNlXG5sZXQgc2hvd19jb3VudHMgPSByZWYgZmFsc2VcbmxldCBsaXN0X3Rlc3RfbmFtZXMgPSByZWYgZmFsc2VcbmxldCBkZWxheWVkX2Vycm9ycyA9IHJlZiBbXVxubGV0IHN0b3Bfb25fZXJyb3IgPSByZWYgZmFsc2VcblxubGV0IGxvZyA9IHJlZiBOb25lXG5cbmxldCB0aW1lX3NlYyA9IHJlZiAwLlxuXG5sZXQgdXNlX2NvbG9yID0gcmVmIHRydWVcbmxldCBpbl9wbGFjZSAgPSByZWYgZmFsc2VcbmxldCBkaWZmX2NvbW1hbmQgPSByZWYgTm9uZVxubGV0IHNvdXJjZV90cmVlX3Jvb3QgPSByZWYgTm9uZVxubGV0IGFsbG93X291dHB1dF9wYXR0ZXJucyA9IHJlZiBmYWxzZVxuXG5sZXQgZGlzcGxheWVkX2Rlc2NyIChsYXp5IGRlc2NyKSBmaWxlbmFtZSBsaW5lIHN0YXJ0X3BvcyBlbmRfcG9zID1cbiAgUHJpbnRmLnNwcmludGYgXCJGaWxlICVTLCBsaW5lICVkLCBjaGFyYWN0ZXJzICVkLSVkJXNcIlxuICAgIGZpbGVuYW1lIGxpbmUgc3RhcnRfcG9zIGVuZF9wb3NcbiAgICAoaWYgZGVzY3IgPSBcIlwiIHRoZW4gXCJcIiBlbHNlIFwiOiBcIiBeIGRlc2NyKVxubGV0IHBhcnNlX2Rlc2NyIHN0ciA9XG4gIHRyeSBTb21lIChTY2FuZi5zc2NhbmYgc3RyIFwiIEZpbGUgJVMgLCBsaW5lICVkICwgY2hhcmFjdGVycyAlZCAtICVkICUhXCJcbiAgICAgICAgICAgICAgKGZ1biBmaWxlIGxpbmUgX3N0YXJ0X3BvcyBfZW5kX3BvcyAtPiBmaWxlLCBTb21lIGxpbmUpKVxuICB3aXRoIF8gLT5cbiAgdHJ5IFNvbWUgKFNjYW5mLnNzY2FuZiBzdHIgXCIgRmlsZSAlUyAsIGxpbmUgJWQgJSFcIiAoZnVuIGZpbGUgbGluZSAtPiBmaWxlLCBTb21lIGxpbmUpKVxuICB3aXRoIF8gLT5cbiAgdHJ5IFNvbWUgKFNjYW5mLnNzY2FuZiBzdHIgXCIgRmlsZSAlUyAlIVwiIChmdW4gZmlsZSAtPiBmaWxlLCBOb25lKSlcbiAgd2l0aCBfIC0+IE5vbmVcblxubGV0ICgpID1cbiAgbWF0Y2ggQXJyYXkudG9fbGlzdCBTeXMuYXJndiB3aXRoXG4gIHwgbmFtZSA6OiBcImlubGluZS10ZXN0LXJ1bm5lclwiIDo6IGxpYiA6OiByZXN0XG4gICAgd2hlbiBCYXNlLkV4cG9ydGVkX2Zvcl9zcGVjaWZpY191c2VzLmFtX3Rlc3RpbmcgLT4gYmVnaW5cbiAgICAgICgqIHdoZW4gd2Ugc2VlIHRoaXMgYXJndW1lbnQsIHdlIHN3aXRjaCB0byB0ZXN0IG1vZGUgKilcbiAgICAgIGxldCB0ZXN0cyA9IHJlZiBbXSBpblxuICAgICAgbGV0IGxpc3RfcGFydGl0aW9ucyA9IHJlZiBmYWxzZSBpblxuICAgICAgbGV0IHBhcnRpdGlvbiA9IHJlZiBOb25lIGluXG4gICAgICBsZXQgdGFnX3ByZWRpY2F0ZSA9IHJlZiBUYWdfcHJlZGljYXRlLmVuYWJsZV9ldmVyeXRoaW5nIGluXG4gICAgICBsZXQgbmFtZV9maWx0ZXIgPSByZWYgW10gaW5cbiAgICAgIHBhcnNlX2FyZ3YgKEFycmF5Lm9mX2xpc3QgKG5hbWUgOjogcmVzdCkpIChBcmcuYWxpZ24gW1xuICAgICAgICBcIi1saXN0LXRlc3QtbmFtZXNcIiwgQXJnLlVuaXQgKGZ1biAoKSAtPiBsaXN0X3Rlc3RfbmFtZXMgOj0gdHJ1ZTsgdmVyYm9zZSA6PSB0cnVlKSxcbiAgICAgICAgXCIgRG8gbm90IHJ1biB0ZXN0cyBidXQgc2hvdyB3aGF0IHdvdWxkIGhhdmUgYmVlbiBydW5cIjtcbiAgICAgICAgXCItbGlzdC1wYXJ0aXRpb25zXCIsIEFyZy5Vbml0IChmdW4gKCkgLT4gbGlzdF9wYXJ0aXRpb25zIDo9IHRydWUpLFxuICAgICAgICBcIiBMaXN0cyBhbGwgdGhlIHBhcnRpdGlvbnMgdGhhdCBjb250YWluIGF0IGxlYXN0IG9uZSB0ZXN0IG9yIHRlc3RfbW9kdWxlXCI7XG4gICAgICAgIFwiLXBhcnRpdGlvblwiLCBBcmcuU3RyaW5nIChmdW4gaSAtPiBwYXJ0aXRpb24gOj0gU29tZSBpKSxcbiAgICAgICAgXCIgT25seSBydW4gdGhlIHRlc3RzIGluIHRoZSBnaXZlbiBwYXJ0aXRpb25cIjtcbiAgICAgICAgXCItdmVyYm9zZVwiLCBBcmcuU2V0IHZlcmJvc2UsIFwiIFNob3cgdGhlIHRlc3RzIGFzIHRoZXkgcnVuXCI7XG4gICAgICAgIFwiLXN0b3Atb24tZXJyb3JcIiwgQXJnLlNldCBzdG9wX29uX2Vycm9yLCBcIiBSdW4gdGVzdHMgb25seSB1cCB0byB0aGUgZmlyc3QgZXJyb3IgXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvZXNuJ3Qgd29yayBmb3IgZXhwZWN0IHRlc3RzKVwiO1xuICAgICAgICBcIi1zdHJpY3RcIiwgQXJnLlNldCBzdHJpY3QsIFwiIEVuZCB3aXRoIGFuIGVycm9yIGlmIG5vIHRlc3RzIHdlcmUgcnVuXCI7XG4gICAgICAgIFwiLXNob3ctY291bnRzXCIsIEFyZy5TZXQgc2hvd19jb3VudHMsIFwiIFNob3cgdGhlIG51bWJlciBvZiB0ZXN0cyByYW5cIjtcbiAgICAgICAgXCItbG9nXCIsIEFyZy5Vbml0IChmdW4gKCkgLT5cbiAgICAgICAgICAodHJ5IFN5cy5yZW1vdmUgXCJpbmxpbmVfdGVzdHMubG9nXCIgd2l0aCBfIC0+ICgpKTtcbiAgICAgICAgICBsb2cgOj0gU29tZSAob3Blbl9vdXQgXCJpbmxpbmVfdGVzdHMubG9nXCIpXG4gICAgICAgICksIFwiIExvZyB0aGUgdGVzdHMgcnVuIGluIGlubGluZV90ZXN0cy5sb2dcIjtcbiAgICAgICAgXCItZHJvcC10YWdcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT5cbiAgICAgICAgICB0YWdfcHJlZGljYXRlIDo9IFRhZ19wcmVkaWNhdGUuZHJvcCAhdGFnX3ByZWRpY2F0ZSBzXG4gICAgICAgICksIFwidGFnIE9ubHkgcnVuIHRlc3RzIG5vdCB0YWdnZWQgd2l0aCBbdGFnXSAob3ZlcnJpZGVzIHByZXZpb3VzIC1yZXF1aXJlLXRhZylcIjtcbiAgICAgICAgXCItcmVxdWlyZS10YWdcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT5cbiAgICAgICAgICB0YWdfcHJlZGljYXRlIDo9IFRhZ19wcmVkaWNhdGUucmVxdWlyZSAhdGFnX3ByZWRpY2F0ZSBzXG4gICAgICAgICksIFwidGFnIE9ubHkgcnVuIHRlc3RzIHRhZ2dlZCB3aXRoIFt0YWddIChvdmVycmlkZXMgcHJldmlvdXMgLWRyb3AtdGFnKVwiO1xuICAgICAgICBcIi1tYXRjaGluZ1wiLCBBcmcuU3RyaW5nIChmdW4gcyAtPiBuYW1lX2ZpbHRlciA6PSBzIDo6ICFuYW1lX2ZpbHRlciksXG4gICAgICAgIFwic3Vic3RyaW5nIE9ubHkgcnVuIHRlc3RzIHdob3NlIG5hbWVzIGNvbnRhaW4gdGhlIGdpdmVuIHN1YnN0cmluZ1wiO1xuICAgICAgICBcIi1vbmx5LXRlc3RcIiwgQXJnLlN0cmluZyAoZnVuIHMgLT5cbiAgICAgICAgICBsZXQgZmlsZW5hbWUsIGluZGV4ID1cbiAgICAgICAgICAgIG1hdGNoIHBhcnNlX2Rlc2NyIHMgd2l0aFxuICAgICAgICAgICAgfCBTb21lIChmaWxlLCBpbmRleCkgLT4gZmlsZSwgaW5kZXhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICBpZiBTdHJpbmcuY29udGFpbnMgcyAnOicgdGhlblxuICAgICAgICAgICAgICAgIGxldCBpID0gU3RyaW5nLmluZGV4IHMgJzonIGluXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gU3RyaW5nLnN1YiBzIDAgaSBpblxuICAgICAgICAgICAgICAgIGxldCBpbmRleF9zdHJpbmcgPSBTdHJpbmcuc3ViIHMgKGkgKyAxKSAoU3RyaW5nLmxlbmd0aCBzIC0gaSAtIDEpIGluXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID1cbiAgICAgICAgICAgICAgICAgIHRyeSBpbnRfb2Zfc3RyaW5nIGluZGV4X3N0cmluZ1xuICAgICAgICAgICAgICAgICAgd2l0aCBGYWlsdXJlIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgUHJpbnRmLmVwcmludGZcbiAgICAgICAgICAgICAgICAgICAgICBcIkFyZ3VtZW50ICVzIGRvZXNuJ3QgZml0IHRoZSBmb3JtYXQgZmlsZW5hbWVbOmxpbmVfbnVtYmVyXVxcbiUhXCIgcztcbiAgICAgICAgICAgICAgICAgICAgZXhpdCAxXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBmaWxlbmFtZSwgU29tZSBpbmRleFxuICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcywgTm9uZVxuICAgICAgICAgIGluXG4gICAgICAgICAgdGVzdHMgOj0gKGZpbGVuYW1lLCBpbmRleCwgcmVmIGZhbHNlKSA6OiAhdGVzdHNcbiAgICAgICAgKSwgXCJsb2NhdGlvbiBSdW4gb25seSB0aGUgdGVzdHMgc3BlY2lmaWVkIGJ5IGFsbCB0aGUgLW9ubHktdGVzdCBvcHRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9ucyBjYW4gYmUgb25lIG9mIHRoZXNlIGZvcm1zOlxuICAgICAgICAgICAgICAgICAgICAgIC0gZmlsZS5tbFxuICAgICAgICAgICAgICAgICAgICAgIC0gZmlsZS5tbDpsaW5lX251bWJlclxuICAgICAgICAgICAgICAgICAgICAgIC0gRmlsZSBcXFwiZmlsZS5tbFxcXCJcbiAgICAgICAgICAgICAgICAgICAgICAtIEZpbGUgXFxcImZpbGUubWxcXFwiLCBsaW5lIDIzXG4gICAgICAgICAgICAgICAgICAgICAgLSBGaWxlIFxcXCJmaWxlLm1sXFxcIiwgbGluZSAyMywgY2hhcmFjdGVycyAyLTNcIjtcbiAgICAgICAgXCItbm8tY29sb3JcIiwgQXJnLkNsZWFyIHVzZV9jb2xvciwgXCIgU3VtbWFyaXplIHRlc3RzIHdpdGhvdXQgdXNpbmcgY29sb3JcIjtcbiAgICAgICAgXCItaW4tcGxhY2VcIiwgQXJnLlNldCBpbl9wbGFjZSwgXCIgVXBkYXRlIGV4cGVjdCB0ZXN0cyBpbiBwbGFjZVwiO1xuICAgICAgICBcIi1kaWZmLWNtZFwiLCBBcmcuU3RyaW5nIChmdW4gcyAtPiBkaWZmX2NvbW1hbmQgOj0gU29tZSBzKSxcbiAgICAgICAgXCIgRGlmZiBjb21tYW5kIGZvciB0ZXN0cyB0aGF0IHJlcXVpcmUgZGlmZmluZyAodXNlIC0gdG8gZGlzYWJsZSBkaWZmaW5nKVwiO1xuICAgICAgICBcIi1hbGxvdy1vdXRwdXQtcGF0dGVybnNcIiwgQXJnLlNldCBhbGxvd19vdXRwdXRfcGF0dGVybnMsXG4gICAgICAgIFwiIEFsbG93IG91dHB1dCBwYXR0ZXJucyBpbiB0ZXN0cyBleHBlY3RhdGlvbnNcIjtcbiAgICAgICAgXCItc291cmNlLXRyZWUtcm9vdFwiLCBBcmcuU3RyaW5nIChmdW4gcyAtPiBzb3VyY2VfdHJlZV9yb290IDo9IFNvbWUgcyksXG4gICAgICAgIFwiIFBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlXCJcbiAgICAgIF0pIChmdW4gYW5vbiAtPlxuICAgICAgICBQcmludGYuZXByaW50ZiBcIiVzOiB1bmV4cGVjdGVkIGFub255bW91cyBhcmd1bWVudCAlc1xcbiUhXCIgbmFtZSBhbm9uO1xuICAgICAgICBleGl0IDFcbiAgICAgICkgKFByaW50Zi5zcHJpbnRmIFwiJXMgJXMgJXMgW2FyZ3NdXCIgbmFtZSBcImlubGluZS10ZXN0LXJ1bm5lclwiIGxpYik7XG4gICAgICBBY3Rpb24uc2V0IChcbiAgICAgICAgYFRlc3RfbW9kZVxuICAgICAgICAgIHsgd2hpY2hfdGVzdHMgPVxuICAgICAgICAgICAgICB7IGxpYm5hbWUgPSBsaWJcbiAgICAgICAgICAgICAgOyBvbmx5X3Rlc3RfbG9jYXRpb24gPSAhdGVzdHM7XG4gICAgICAgICAgICAgICAgd2hpY2hfdGFncyA9ICF0YWdfcHJlZGljYXRlO1xuICAgICAgICAgICAgICAgIG5hbWVfZmlsdGVyID0gIW5hbWVfZmlsdGVyXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICA7IHdoYXRfdG9fZG8gPVxuICAgICAgICAgICAgICBpZiAhbGlzdF9wYXJ0aXRpb25zXG4gICAgICAgICAgICAgIHRoZW4gYExpc3RfcGFydGl0aW9uc1xuICAgICAgICAgICAgICBlbHNlIGBSdW5fcGFydGl0aW9uICFwYXJ0aXRpb25cbiAgICAgICAgICB9KVxuICAgIGVuZFxuICB8IF8gLT5cbiAgICAoKVxuXG5sZXQgYW1fdGVzdF9ydW5uZXIgPVxuICBtYXRjaCBBY3Rpb24uZ2V0ICgpIHdpdGhcbiAgfCBgVGVzdF9tb2RlIF8gLT4gdHJ1ZVxuICB8IGBJZ25vcmUgLT4gZmFsc2VcblxubGV0IGFtX3J1bm5pbmdfaW5saW5lX3Rlc3RfZW52X3ZhciA9XG4gICgqIGZvciBhcHByb3hpbWF0ZSBjb21wYXRpYmlsaXR5LCBnaXZlbiB0aGF0IHRoZSB2YXJpYWJsZSBpcyBub3QgZXhhY3RseSBlcXVpdmFsZW50XG4gICAgIHRvIHdoYXQgUFBYX0lOTElORV9URVNUX0xJQl9BTV9SVU5OSU5HX0lOTElORV9URVNUIHVzZWQgdG8gYmUgKilcbiAgXCJURVNUSU5HX0ZSQU1FV09SS1wiXG5cbigqIFRoaXMgdmFsdWUgaXMgZGVwcmVjYXRlZCBpbiBwcmluY2lwbGUsIGluIGZhdm9yIG9mIENvcmUuYW1fcnVubmluZ190ZXN0LCBzb1xuICAgd2UncmUgZ29pbmcgdG8gbGl2ZSB3aXRoIHRoZSB1Z2x5IHBhdHRlcm4gbWF0Y2guICopXG5sZXQgYW1fcnVubmluZ19pbmxpbmVfdGVzdCA9XG4gIG1hdGNoIFN5cy5nZXRlbnYgXCJQUFhfSU5MSU5FX1RFU1RfTElCX0FNX1JVTk5JTkdfSU5MSU5FX1RFU1RcIiB3aXRoXG4gIHwgKF8gOiBzdHJpbmcpIC0+IHRydWUgKCogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwZW9wbGUgc2V0dGluZyB0aGlzIHZhcmlhYmxlIGRpcmVjdGx5ICopXG4gIHwgZXhjZXB0aW9uIE5vdF9mb3VuZCAtPlxuICAgIG1hdGNoIFN5cy5nZXRlbnYgYW1fcnVubmluZ19pbmxpbmVfdGVzdF9lbnZfdmFyIHdpdGhcbiAgICB8IFwiaW5saW5lLXRlc3RcIiAtPiB0cnVlXG4gICAgfCBleGNlcHRpb24gTm90X2ZvdW5kIC0+IGZhbHNlXG4gICAgfCBfIC0+IGZhbHNlXG5cbmxldCB0ZXN0aW5nID1cbiAgaWYgYW1fdGVzdF9ydW5uZXJcbiAgdGhlbiBgVGVzdGluZyBgQW1fdGVzdF9ydW5uZXJcbiAgZWxzZVxuICAgIChpZiBhbV9ydW5uaW5nX2lubGluZV90ZXN0XG4gICAgIHRoZW4gYFRlc3RpbmcgYEFtX2NoaWxkX29mX3Rlc3RfcnVubmVyXG4gICAgIGVsc2UgYE5vdF90ZXN0aW5nKVxuXG5sZXQgd2FsbF90aW1lX2Nsb2NrX25zICgpID1cbiAgVGltZV9ub3cubmFub3NlY29uZHNfc2luY2VfdW5peF9lcG9jaCAoKVxuXG5cbmxldCB3aGVyZV90b19jdXRfYmFja3RyYWNlID0gbGF6eSAoXG4gIEJhc2UuU3RyaW5nLlNlYXJjaF9wYXR0ZXJuLmNyZWF0ZSAoX19NT0RVTEVfXyBeIFwiLlwiIF4gXCJ0aW1lX3dpdGhvdXRfcmVzZXR0aW5nX3JhbmRvbV9zZWVkc1wiKSlcblxubGV0IHRpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tX3NlZWRzIGYgPVxuICBsZXQgYmVmb3JlX25zID0gd2FsbF90aW1lX2Nsb2NrX25zICgpIGluXG4gIGxldCByZXMgPVxuICAgICgqIFRvIGF2b2lkIG5vaXNlIGluIGJhY2t0cmFjZXMsIHdlIGRvIHR3byB0aGluZ3MuXG5cbiAgICAgICBXZSB1c2UgW3doZXJlX3RvX2N1dF9iYWNrdHJhY2VdIGFib3ZlIHRvIHJlbW92ZSB0aGUgc3RhY2sgZnJhbWVzIGZvciB0aGUgY3VycmVudFxuICAgICAgIGZ1bmN0aW9uIGFuZCBhbnkgZnVuY3Rpb24gaXQgZ2V0cyBpbmxpbmVkIGludG8sIGFzIGl0J3Mgbm90IG9mIGFueSBpbnRlcmVzdCB0byB0aGVcbiAgICAgICB1c2VyLCBzaW5jZSBpdCdzIG5vdCB0YWxraW5nIGFib3V0IHRoZWlyIHRlc3QgYnV0IGluc3RlYWQgdGFsa2luZyBhYm91dCB0aGVcbiAgICAgICBwcHhfaW5saW5lX3Rlc3QgbWFjaGluZXJ5LlxuXG4gICAgICAgV2UgYWxzbyBhdm9pZCBpbnNlcnRpbmcgYW55IGNvZGUgYmV0d2VlbiB0aGUgW2ZdIHRoYXQgY29tZXMgZnJvbSB0aGUgdXNlcidzIGZpbGVcbiAgICAgICBhbmQgZ3JhYmJpbmcgdGhlIGJhY2t0cmFjZSBmcm9tIGl0cyBleGNlcHRpb25zIChubyB3cmFwcGluZyBvZiBbZl0gd2l0aCBoaWdoIG9yZGVyXG4gICAgICAgZnVuY3Rpb25zIGxpa2UgRXhuLnByb3RlY3QsIG9yIChmdW4gKCkgLT4gZiAoKTsgdHJ1ZSkpLiAqKVxuICAgIHRyeSBPayAoZiAoKSlcbiAgICB3aXRoIGV4biAtPiBFcnJvciAoZXhuLCBQcmludGV4Yy5nZXRfYmFja3RyYWNlICgpKVxuICBpblxuICB0aW1lX3NlYyA6PSBCYXNlLkludDYzLih3YWxsX3RpbWVfY2xvY2tfbnMgKCkgLSBiZWZvcmVfbnMgfD4gdG9fZmxvYXQpICAvLiAxZTk7XG4gIHJlc1xuXG5cbmxldCBzYXZlZF9jYW1sX3JhbmRvbV9zdGF0ZSA9IGxhenkgKFN0ZGxpYi5SYW5kb20uU3RhdGUubWFrZSBbfCAxMDA7IDIwMDsgMzAwIHxdKVxubGV0IHNhdmVkX2Jhc2VfcmFuZG9tX3N0YXRlID0gbGF6eSAoQmFzZS5SYW5kb20uU3RhdGUubWFrZSBbfCAxMTE7IDIyMjsgMzMzIHxdKVxuXG5sZXQgdGltZV9hbmRfcmVzZXRfcmFuZG9tX3NlZWRzIGYgPVxuICBsZXQgY2FtbF9yYW5kb21fc3RhdGUgPSBTdGRsaWIuUmFuZG9tLmdldF9zdGF0ZSAoKSBpblxuICBsZXQgYmFzZV9yYW5kb21fc3RhdGUgPSBCYXNlLlJhbmRvbS5TdGF0ZS5jb3B5IEJhc2UuUmFuZG9tLlN0YXRlLmRlZmF1bHQgaW5cbiAgU3RkbGliLlJhbmRvbS5zZXRfc3RhdGUgKExhenkuZm9yY2Ugc2F2ZWRfY2FtbF9yYW5kb21fc3RhdGUpO1xuICBCYXNlLlJhbmRvbS5zZXRfc3RhdGUgKExhenkuZm9yY2Ugc2F2ZWRfYmFzZV9yYW5kb21fc3RhdGUpO1xuICBsZXQgcmVzdWx0ID0gdGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fc2VlZHMgZiBpblxuICBTdGRsaWIuUmFuZG9tLnNldF9zdGF0ZSBjYW1sX3JhbmRvbV9zdGF0ZTtcbiAgQmFzZS5SYW5kb20uc2V0X3N0YXRlIGJhc2VfcmFuZG9tX3N0YXRlO1xuICByZXN1bHRcblxubGV0IHN0cmluZ19vZl9tb2R1bGVfZGVzY3IgKCkgPVxuICBTdHJpbmcuY29uY2F0IFwiXCIgKFxuICAgIExpc3QubWFwIChmdW4gcyAtPiBcIiAgaW4gVEVTXCIgXiBcIlRfTU9EVUxFIGF0IFwiIF4gU3RyaW5nLnVuY2FwaXRhbGl6ZV9hc2NpaSBzIF4gXCJcXG5cIilcbiAgICAgIChNb2R1bGVfY29udGV4dC5jdXJyZW50X2Rlc2NyICgpKVxuICApXG5cbmxldCBwb3NpdGlvbl9tYXRjaCBkZWZfZmlsZW5hbWUgZGVmX2xpbmVfbnVtYmVyIGwgPVxuICBMaXN0LmV4aXN0cyAoZnVuIChmaWxlbmFtZSwgbGluZV9udW1iZXJfb3B0LCB1c2VkKSAtPlxuICAgIGxldCBwb3NpdGlvbl9zdGFydCA9XG4gICAgICBTdHJpbmcubGVuZ3RoIGRlZl9maWxlbmFtZSAtIFN0cmluZy5sZW5ndGggZmlsZW5hbWUgaW5cbiAgICBsZXQgZm91bmQgPVxuICAgICAgcG9zaXRpb25fc3RhcnQgPj0gMCAmJlxuICAgICAgbGV0IGVuZF9vZl9kZWZfZmlsZW5hbWUgPVxuICAgICAgICBTdHJpbmcuc3ViIGRlZl9maWxlbmFtZVxuICAgICAgICAgIHBvc2l0aW9uX3N0YXJ0XG4gICAgICAgICAgKFN0cmluZy5sZW5ndGggZmlsZW5hbWUpIGluXG4gICAgICBlbmRfb2ZfZGVmX2ZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgICYmIChwb3NpdGlvbl9zdGFydCA9IDAgfHwgZGVmX2ZpbGVuYW1lLltwb3NpdGlvbl9zdGFydCAtIDFdID0gJy8nKVxuICAgICAgJiYgKG1hdGNoIGxpbmVfbnVtYmVyX29wdCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPiB0cnVlXG4gICAgICAgIHwgU29tZSBsaW5lX251bWJlciAtPiBkZWZfbGluZV9udW1iZXIgPSBsaW5lX251bWJlcilcbiAgICBpblxuICAgIGlmIGZvdW5kIHRoZW4gdXNlZCA6PSB0cnVlO1xuICAgIGZvdW5kXG4gICkgbFxuXG5sZXQgbmFtZV9maWx0ZXJfbWF0Y2ggfm5hbWVfZmlsdGVyIGRlc2NyID1cbiAgbWF0Y2ggbmFtZV9maWx0ZXIgd2l0aFxuICB8IFtdIC0+IHRydWVcbiAgfCBfIDo6IF8gLT5cbiAgICBMaXN0LmV4aXN0cyAoZnVuIHN1YnN0cmluZyAtPiBCYXNlLlN0cmluZy5pc19zdWJzdHJpbmcgfnN1YnN0cmluZyBkZXNjcikgbmFtZV9maWx0ZXJcblxubGV0IHByaW50X2RlbGF5ZWRfZXJyb3JzICgpID1cbiAgbWF0Y2ggTGlzdC5yZXYgIWRlbGF5ZWRfZXJyb3JzIHdpdGhcbiAgfCBbXSAtPiAoKVxuICB8IF8gOjogXyBhcyBkZWxheWVkX2Vycm9ycyAtPlxuICAgIFByaW50Zi5lcHJpbnRmIFwiXFxuJXNcXG4lIVwiIChTdHJpbmcubWFrZSA3MCAnPScpO1xuICAgIExpc3QuaXRlciAoZnVuIG1lc3NhZ2UgLT5cbiAgICAgIFByaW50Zi5lcHJpbnRmIFwiJXMlIVwiIG1lc3NhZ2VcbiAgICApIGRlbGF5ZWRfZXJyb3JzXG5cbmxldCBlcHJpbnRmX29yX2RlbGF5IGZtdCA9XG4gIFByaW50Zi5rc3ByaW50ZiAoZnVuIHMgLT5cbiAgICBpZiAhdmVyYm9zZSB0aGVuIGRlbGF5ZWRfZXJyb3JzIDo9IHMgOjogIWRlbGF5ZWRfZXJyb3JzXG4gICAgZWxzZSBQcmludGYuZXByaW50ZiBcIiVzJSFcIiBzO1xuICAgIGlmICFzdG9wX29uX2Vycm9yIHRoZW4gYmVnaW5cbiAgICAgIHByaW50X2RlbGF5ZWRfZXJyb3JzICgpO1xuICAgICAgZXhpdCAyXG4gICAgZW5kXG4gICkgZm10XG5cbmxldCBhZGRfaG9va3MgKChtb2R1bGUgQykgOiBjb25maWcpIGYgPVxuICBmdW4gKCkgLT4gQy5wcmVfdGVzdF9ob29rICgpOyBmICgpXG5cbmxldCBodW1fYmFja3RyYWNlIGJhY2t0cmFjZSA9XG4gIGxldCBvcGVuIEJhc2UgaW5cbiAgYmFja3RyYWNlXG4gIHw+IFN0cmluZy5zcGxpdF9saW5lc1xuICB8PiBMaXN0LnRha2Vfd2hpbGUgfmY6KGZ1biBzdHIgLT5cbiAgICBub3QgKFN0cmluZy5TZWFyY2hfcGF0dGVybi5tYXRjaGVzIChmb3JjZSB3aGVyZV90b19jdXRfYmFja3RyYWNlKSBzdHIpKVxuICB8PiBMaXN0Lm1hcCB+ZjooZnVuIHN0ciAtPiBcIiAgXCIgXiBzdHIgXiBcIlxcblwiKVxuICB8PiBTdHJpbmcuY29uY2F0XG5cbmxldFtAaW5saW5lIG5ldmVyXSB0ZXN0X2lubmVyIH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZTpkZWZfZmlsZW5hbWUgfmxpbmVfbnVtYmVyOmRlZl9saW5lX251bWJlclxuICAgICAgICAgICAgICAgICAgICAgfnN0YXJ0X3BvcyB+ZW5kX3BvcyBmIGJvb2xfb2ZfZiA9XG4gIG1hdGNoIEFjdGlvbi5nZXQgKCkgd2l0aFxuICB8IGBJZ25vcmUgLT4gKClcbiAgfCBgVGVzdF9tb2RlIHsgd2hpY2hfdGVzdHMgPSB7IGxpYm5hbWU7IG9ubHlfdGVzdF9sb2NhdGlvbjsgd2hpY2hfdGFnczsgbmFtZV9maWx0ZXIgfTsgd2hhdF90b19kbyB9IC0+XG4gICAgbGV0IGYgPSBhZGRfaG9va3MgY29uZmlnIGYgaW5cbiAgICBsZXQgZGVzY3IgPSBsYXp5IChkaXNwbGF5ZWRfZGVzY3IgZGVzY3IgZGVmX2ZpbGVuYW1lIGRlZl9saW5lX251bWJlciBzdGFydF9wb3MgZW5kX3BvcykgaW5cbiAgICBsZXQgY29tcGxldGVfdGFncyA9IHRhZ3MgQCBNb2R1bGVfY29udGV4dC5jdXJyZW50X3RhZ3MgKCkgaW5cbiAgICBsZXQgc2hvdWxkX3J1biA9XG4gICAgICBTb21lIGxpYm5hbWUgPSAhZHluYW1pY19saWJcbiAgICAgICYmIGJlZ2luIG1hdGNoIG9ubHlfdGVzdF9sb2NhdGlvbiB3aXRoXG4gICAgICAgIHwgW10gLT4gdHJ1ZVxuICAgICAgICB8IF8gOjogXyAtPiBwb3NpdGlvbl9tYXRjaCBkZWZfZmlsZW5hbWUgZGVmX2xpbmVfbnVtYmVyIG9ubHlfdGVzdF9sb2NhdGlvblxuICAgICAgZW5kXG4gICAgICAmJiBub3QgKFRhZ19wcmVkaWNhdGUuZGlzYWJsZWQgd2hpY2hfdGFncyB+Y29tcGxldGVfdGFncylcbiAgICAgICYmIG5hbWVfZmlsdGVyX21hdGNoIH5uYW1lX2ZpbHRlciAoTGF6eS5mb3JjZSBkZXNjcilcbiAgICBpblxuICAgIGlmIHNob3VsZF9ydW4gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggd2hhdF90b19kbyB3aXRoXG4gICAgICB8IGBMaXN0X3BhcnRpdGlvbnMgLT4gUGFydGl0aW9uLmZvdW5kX3Rlc3QgKClcbiAgICAgIHwgYFJ1bl9wYXJ0aXRpb24gcGFydGl0aW9uIC0+XG4gICAgICAgIGlmIFBhcnRpdGlvbi5pc19jdXJyZW50IHBhcnRpdGlvbiB0aGVuIGJlZ2luXG4gICAgICAgICAgbGV0IGRlc2NyID0gTGF6eS5mb3JjZSBkZXNjciBpblxuICAgICAgICAgIGluY3IgdGVzdHNfcmFuO1xuICAgICAgICAgIGJlZ2luIG1hdGNoICFsb2cgd2l0aFxuICAgICAgICAgIHwgTm9uZSAtPiAoKVxuICAgICAgICAgIHwgU29tZSBjaCAtPiBQcmludGYuZnByaW50ZiBjaCBcIiVzXFxuJXNcIiBkZXNjciAoc3RyaW5nX29mX21vZHVsZV9kZXNjciAoKSlcbiAgICAgICAgICBlbmQ7XG4gICAgICAgICAgaWYgIXZlcmJvc2UgdGhlbiBiZWdpblxuICAgICAgICAgICAgUHJpbnRmLnByaW50ZiBcIiVzJSFcIiBkZXNjclxuICAgICAgICAgIGVuZDtcbiAgICAgICAgICBsZXQgcmVzdWx0ID1cbiAgICAgICAgICAgIGlmICFsaXN0X3Rlc3RfbmFtZXNcbiAgICAgICAgICAgIHRoZW4gT2sgdHJ1ZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAoKiBTZWUgW3RpbWVfd2l0aG91dF9yZXNldHRpbmdfcmFuZG9tX3NlZWRzXSBmb3Igd2h5IHdlIHVzZSBbYm9vbF9vZl9mXVxuICAgICAgICAgICAgICAgICByYXRoZXIgaGF2ZSB0aGUgY2FsbGVyIHdyYXAgW2ZdIHRvIGFkanVzdCBpdHMgcmV0dXJuIHZhbHVlLiAqKVxuICAgICAgICAgICAgICBSZXN1bHQubWFwIGJvb2xfb2ZfZiAodGltZV9hbmRfcmVzZXRfcmFuZG9tX3NlZWRzIGYpXG4gICAgICAgICAgaW5cbiAgICAgICAgICAoKiBJZiAhbGlzdF90ZXN0X25hbWVzLCB0aGlzIGlzIGlzIGEgaGFybWxlc3MgemVyby4gKilcbiAgICAgICAgICBpZiAhdmVyYm9zZSB0aGVuIFByaW50Zi5wcmludGYgXCIgKCUuM2Ygc2VjKVxcbiUhXCIgIXRpbWVfc2VjO1xuICAgICAgICAgIG1hdGNoIHJlc3VsdCB3aXRoXG4gICAgICAgICAgfCBPayB0cnVlIC0+ICgpXG4gICAgICAgICAgfCBPayBmYWxzZSAtPlxuICAgICAgICAgICAgaW5jciB0ZXN0c19mYWlsZWQ7XG4gICAgICAgICAgICBlcHJpbnRmX29yX2RlbGF5IFwiJXMgaXMgZmFsc2UuXFxuJXNcXG4lIVwiIGRlc2NyXG4gICAgICAgICAgICAgIChzdHJpbmdfb2ZfbW9kdWxlX2Rlc2NyICgpKVxuICAgICAgICAgIHwgRXJyb3IgKGV4biwgYmFja3RyYWNlKSAtPlxuICAgICAgICAgICAgaW5jciB0ZXN0c19mYWlsZWQ7XG4gICAgICAgICAgICBsZXQgYmFja3RyYWNlID0gaHVtX2JhY2t0cmFjZSBiYWNrdHJhY2UgaW5cbiAgICAgICAgICAgIGxldCBleG5fc3RyID0gU2V4cGxpYjAuU2V4cF9jb252LnByaW50ZXhjX3ByZWZlcl9zZXhwIGV4biBpblxuICAgICAgICAgICAgbGV0IHNlcCA9IGlmIFN0cmluZy5jb250YWlucyBleG5fc3RyICdcXG4nIHRoZW4gXCJcXG5cIiBlbHNlIFwiIFwiIGluXG4gICAgICAgICAgICBlcHJpbnRmX29yX2RlbGF5IFwiJXMgdGhyZXclcyVzLlxcbiVzJXNcXG4lIVwiIGRlc2NyIHNlcCBleG5fc3RyXG4gICAgICAgICAgICAgIGJhY2t0cmFjZSAoc3RyaW5nX29mX21vZHVsZV9kZXNjciAoKSlcbiAgICAgICAgZW5kXG4gICAgZW5kXG5cbmxldCBzZXRfbGliX2FuZF9wYXJ0aXRpb24gc3RhdGljX2xpYiBwYXJ0aXRpb24gPVxuICBtYXRjaCAhZHluYW1pY19saWIgd2l0aFxuICB8IFNvbWUgXyAtPlxuICAgICgqIHBvc3NpYmxlIGlmIHRoZSBpbnRlcmZhY2UgaXMgdXNlZCBleHBsaWNpdGx5IG9yIGlmIHdlIGhhcHBlbiB0byBkeW5saW5rIHNvbWV0aGluZ1xuICAgICAgIHRoYXQgY29udGFpbiB0ZXN0cyAqKVxuICAgICgpXG4gIHwgTm9uZSAtPlxuICAgIGR5bmFtaWNfbGliIDo9IFNvbWUgc3RhdGljX2xpYjtcbiAgICBtYXRjaCBBY3Rpb24uZ2V0ICgpIHdpdGhcbiAgICB8IGBJZ25vcmUgLT4gKClcbiAgICB8IGBUZXN0X21vZGUgeyB3aGljaF90ZXN0czsgd2hhdF90b19kbyB9IC0+XG4gICAgICBpZiB3aGljaF90ZXN0cy5saWJuYW1lID0gc3RhdGljX2xpYiB0aGVuIGJlZ2luXG4gICAgICAgIGxldCByZXF1aXJlc19wYXJ0aXRpb24gPVxuICAgICAgICAgIG1hdGNoIHdoYXRfdG9fZG8gd2l0aFxuICAgICAgICAgIHwgYExpc3RfcGFydGl0aW9ucyB8IGBSdW5fcGFydGl0aW9uIChTb21lIF8pIC0+IHRydWVcbiAgICAgICAgICB8IGBSdW5fcGFydGl0aW9uIE5vbmUgLT4gZmFsc2VcbiAgICAgICAgaW5cbiAgICAgICAgaWYgcGFydGl0aW9uID0gXCJcIiAmJiByZXF1aXJlc19wYXJ0aXRpb25cbiAgICAgICAgdGhlbiBmYWlsd2l0aCBcInBweF9pbmxpbmVfdGVzdDogY2Fubm90IHVzZSAtbGlzdC1wYXJ0aXRpb24gb3IgLXBhcnRpdGlvbiBcXFxuICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHNwZWNpZnlpbmcgYSBwYXJ0aXRpb24gYXQgcHJlcHJvY2Vzc2luZyB0aW1lXCJcbiAgICAgICAgZWxzZSBQYXJ0aXRpb24uc2V0X2N1cnJlbnQgcGFydGl0aW9uXG4gICAgICBlbmRcblxubGV0IHVuc2V0X2xpYiBzdGF0aWNfbGliID1cbiAgbWF0Y2ggIWR5bmFtaWNfbGliIHdpdGhcbiAgfCBOb25lIC0+XG4gICAgKCogbm90IGdpdmluZyBhbiBlcnJvciwgYmVjYXVzZSB3aGVuIHNvbWUgYW5ub3lpbmcgcGVvcGxlIHB1dCBwYV9vdW5pdCBpbiB0aGVpciBsaXN0XG4gICAgICAgb2YgcHJlcHJvY2Vzc29ycywgcGFfb3VuaXQgaXMgc2V0IHVwIHR3aWNlIGFuZCB3ZSBoYXZlIHR3byBjYWxscyB0byB1bnNldF9saWIgYXRcbiAgICAgICB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgdGhlIHNlY29uZCBvbmUgY29tZXMgaW4gdGhpcyBicmFuY2ggKilcbiAgICAoKVxuICB8IFNvbWUgbGliIC0+XG4gICAgaWYgbGliID0gc3RhdGljX2xpYiB0aGVuIGR5bmFtaWNfbGliIDo9IE5vbmVcblxubGV0IHRlc3QgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lIH5saW5lX251bWJlciB+c3RhcnRfcG9zIH5lbmRfcG9zIGYgPVxuICB0ZXN0X2lubmVyIH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZSB+bGluZV9udW1iZXIgfnN0YXJ0X3BvcyB+ZW5kX3Bvc1xuICAgIGYgKGZ1biBiIC0+IGIpXG5cbmxldCB0ZXN0X3VuaXQgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lIH5saW5lX251bWJlciB+c3RhcnRfcG9zIH5lbmRfcG9zIGYgPVxuICB0ZXN0X2lubmVyIH5jb25maWcgfmRlc2NyIH50YWdzIH5maWxlbmFtZSB+bGluZV9udW1iZXIgfnN0YXJ0X3BvcyB+ZW5kX3Bvc1xuICAgIGYgKGZ1biAoKSAtPiB0cnVlKVxuXG5sZXRbQGlubGluZSBuZXZlcl0gdGVzdF9tb2R1bGUgfmNvbmZpZyB+ZGVzY3IgfnRhZ3MgfmZpbGVuYW1lOmRlZl9maWxlbmFtZSB+bGluZV9udW1iZXI6ZGVmX2xpbmVfbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICB+c3RhcnRfcG9zIH5lbmRfcG9zIGYgPVxuICBtYXRjaCBBY3Rpb24uZ2V0ICgpIHdpdGhcbiAgfCBgSWdub3JlIC0+ICgpXG4gIHwgYFRlc3RfbW9kZSB7IHdoaWNoX3Rlc3RzID0geyBsaWJuYW1lOyBvbmx5X3Rlc3RfbG9jYXRpb24gPSBfOyBuYW1lX2ZpbHRlciA9IF87IHdoaWNoX3RhZ3MgfTsgd2hhdF90b19kbyB9IC0+XG4gICAgbGV0IGYgPSBhZGRfaG9va3MgY29uZmlnIGYgaW5cbiAgICBsZXQgZGVzY3IgKCkgPSBkaXNwbGF5ZWRfZGVzY3IgZGVzY3IgZGVmX2ZpbGVuYW1lIGRlZl9saW5lX251bWJlciBzdGFydF9wb3MgZW5kX3BvcyBpblxuICAgIGxldCBwYXJ0aWFsX3RhZ3MgPSB0YWdzIEAgTW9kdWxlX2NvbnRleHQuY3VycmVudF90YWdzICgpIGluXG4gICAgbGV0IHNob3VsZF9ydW4gPVxuICAgICAgU29tZSBsaWJuYW1lID0gIWR5bmFtaWNfbGliXG4gICAgICAoKiBJZiwgbm8gbWF0dGVyIHdoYXQgdGFncyBhIHRlc3QgZGVmaW5lcywgd2UgY2VydGFpbmx5IHdpbGwgZHJvcCBhbGwgdGVzdHMgd2l0aGluXG4gICAgICAgICB0aGlzIG1vZHVsZSwgdGhlbiBkb24ndCBydW4gdGhlIG1vZHVsZSBhdCBhbGwuIFRoaXMgbWVhbnMgcGVvcGxlIGNhbiB3cml0ZVxuICAgICAgICAgdGhpbmdzIGxpa2UgdGhlIGZvbGxvd2luZyB3aXRob3V0IGJyZWFraW5nIHRoZSAzMi1iaXQgYnVpbGQ6XG4gICAgICAgICBsZXQldGVzdF9tb2R1bGUgW0B0YWdzIFwiNjQtYml0cy1vbmx5XCJdID0gKG1vZHVsZSBzdHJ1Y3RcbiAgICAgICAgIGxldCBpID0gSW50NjQudG9faW50X2V4biAuLi4uXG4gICAgICAgICBlbmQpXG4gICAgICAgICBXZSBkb24ndCBzaG9ydGN1dCBiYXNlZCBvbiBwb3NpdGlvbiwgYXMgd2UgY2FuJ3QgdGVsbCB3aGF0IHBvc2l0aW9ucyB0aGVcbiAgICAgICAgIGlubmVyIHRlc3RzIHdpbGwgaGF2ZS4gKilcbiAgICAgICYmIG5vdCAoVGFnX3ByZWRpY2F0ZS5lbnRpcmVfbW9kdWxlX2Rpc2FibGVkIHdoaWNoX3RhZ3MgfnBhcnRpYWxfdGFncylcbiAgICBpblxuICAgIGlmIHNob3VsZF9ydW4gdGhlbiBiZWdpblxuICAgICAgbWF0Y2ggd2hhdF90b19kbyB3aXRoXG4gICAgICB8IGBMaXN0X3BhcnRpdGlvbnMgLT4gUGFydGl0aW9uLmZvdW5kX3Rlc3QgKClcbiAgICAgIHwgYFJ1bl9wYXJ0aXRpb24gcGFydGl0aW9uIC0+XG4gICAgICAgIGlmIFBhcnRpdGlvbi5pc19jdXJyZW50IHBhcnRpdGlvbiB0aGVuIGJlZ2luXG4gICAgICAgICAgaW5jciB0ZXN0X21vZHVsZXNfcmFuO1xuICAgICAgICAgIGxldCBkZXNjciA9IGRlc2NyICgpIGluXG4gICAgICAgICAgbWF0Y2hcbiAgICAgICAgICAgIE1vZHVsZV9jb250ZXh0LndpdGhfIH5kZXNjciB+dGFncyAoZnVuICgpIC0+XG4gICAgICAgICAgICAgICgqIFdlIGRvIG5vdCByZXNldCByYW5kb20gc3RhdGVzIHVwb24gZW50ZXJpbmcgW2xldCV0ZXN0X21vZHVsZV0uXG5cbiAgICAgICAgICAgICAgICAgQ29uOiBDb2RlIGluIHRlc3QgbW9kdWxlcyBjYW4gYWNjaWRlbnRhbGx5IGRlcGVuZCBvbiB0b3AtbGV2ZWwgcmFuZG9tXG4gICAgICAgICAgICAgICAgIHN0YXRlIGVmZmVjdHMuXG5cbiAgICAgICAgICAgICAgICAgUHJvczogKDEpIFdlIGRvbid0IHJlc2V0IHRvIHRoZSBzYW1lIHNlZWQgb24gZW50ZXJpbmcgYSBbbGV0JXRlc3RfbW9kdWxlXVxuICAgICAgICAgICAgICAgICBhbmQgdGhlbiBhIFtsZXQldGVzdF0gaW5zaWRlIHRoYXQgbW9kdWxlLCB3aGljaCBjb3VsZCBsZWFkIHRvXG4gICAgICAgICAgICAgICAgIGFjY2lkZW50YWxseSByYW5kb21seSBnZW5lcmF0aW5nIHRoZSBzYW1lIHZhbHVlcyBpbiBzb21lIHRlc3QuICgyKSBNb3ZpbmdcbiAgICAgICAgICAgICAgICAgY29kZSBpbnRvIGFuZCBvdXQgb2YgW2xldCV0ZXN0X21vZHVsZV0gZG9lcyBub3QgY2hhbmdlIGl0cyByYW5kb20gc2VlZC5cbiAgICAgICAgICAgICAgKilcbiAgICAgICAgICAgICAgdGltZV93aXRob3V0X3Jlc2V0dGluZ19yYW5kb21fc2VlZHMgZilcbiAgICAgICAgICB3aXRoXG4gICAgICAgICAgfCBPayAoKSAtPiAoKVxuICAgICAgICAgIHwgRXJyb3IgKGV4biwgYmFja3RyYWNlKSAtPlxuICAgICAgICAgICAgaW5jciB0ZXN0X21vZHVsZXNfZmFpbGVkO1xuICAgICAgICAgICAgbGV0IGJhY2t0cmFjZSA9IGh1bV9iYWNrdHJhY2UgYmFja3RyYWNlIGluXG4gICAgICAgICAgICBsZXQgZXhuX3N0ciA9IFNleHBsaWIwLlNleHBfY29udi5wcmludGV4Y19wcmVmZXJfc2V4cCBleG4gaW5cbiAgICAgICAgICAgIGxldCBzZXAgPSBpZiBTdHJpbmcuY29udGFpbnMgZXhuX3N0ciAnXFxuJyB0aGVuIFwiXFxuXCIgZWxzZSBcIiBcIiBpblxuICAgICAgICAgICAgZXByaW50Zl9vcl9kZWxheSAoXCJURVNcIiBeXiBcIlRfTU9EVUxFIGF0ICVzIHRocmV3JXMlcy5cXG4lcyVzXFxuJSFcIilcbiAgICAgICAgICAgICAgKFN0cmluZy51bmNhcGl0YWxpemVfYXNjaWkgZGVzY3IpIHNlcCBleG5fc3RyIGJhY2t0cmFjZSAoc3RyaW5nX29mX21vZHVsZV9kZXNjciAoKSlcbiAgICAgICAgZW5kXG4gICAgZW5kXG5cbmxldCBzdW1tYXJpemUgKCkgPVxuICBtYXRjaCBBY3Rpb24uZ2V0ICgpIHdpdGhcbiAgfCBgSWdub3JlIC0+XG4gICAgaWYgU3lzLmFyZ3YgPD4gW3x8XSAmJiBGaWxlbmFtZS5iYXNlbmFtZSBTeXMuYXJndi4oMCkgPSBcImlubGluZV90ZXN0c19ydW5uZXIuZXhlXCIgdGhlblxuICAgICAgUHJpbnRmLmVwcmludGYgXCJpbmxpbmVfdGVzdHNfcnVubmVyLmV4ZSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcnVuIGJ5IGhhbmQsIHlvdSBcXG5cXFxuICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBydW4gdGhlIGlubGluZV90ZXN0c19ydW5uZXIgc2NyaXB0IGluc3RlYWQuXFxuJSFcIlxuICAgIGVsc2VcbiAgICAgIFByaW50Zi5lcHJpbnRmIFwiWW91IGFyZSBkb2luZyBzb21ldGhpbmcgdW5leHBlY3RlZCB3aXRoIHRoZSB0ZXN0cy4gTm8gdGVzdHMgaGF2ZSBcXG5cXFxuICAgICAgICAgICAgICAgICAgICAgIGJlZW4gcnVuLiBZb3Ugc2hvdWxkIHVzZSB0aGUgaW5saW5lX3Rlc3RzX3J1bm5lciBzY3JpcHQgdG8gcnVuIFxcblxcXG4gICAgICAgICAgICAgICAgICAgICAgdGVzdHMuXFxuJSFcIjtcbiAgICBUZXN0X3Jlc3VsdC5FcnJvclxuICB8IGBUZXN0X21vZGUgeyB3aGljaF90ZXN0cyA9IF87IHdoYXRfdG9fZG8gPSBgTGlzdF9wYXJ0aXRpb25zIH0gLT5cbiAgICBMaXN0Lml0ZXIgKFByaW50Zi5wcmludGYgXCIlc1xcblwiKSAoUGFydGl0aW9uLmFsbCAoKSk7XG4gICAgVGVzdF9yZXN1bHQuU3VjY2Vzc1xuICB8IGBUZXN0X21vZGUgeyB3aGF0X3RvX2RvID0gYFJ1bl9wYXJ0aXRpb24gXzsgd2hpY2hfdGVzdHMgfSAtPiBiZWdpblxuICAgICAgYmVnaW4gbWF0Y2ggIWxvZyB3aXRoXG4gICAgICB8IE5vbmUgLT4gKClcbiAgICAgIHwgU29tZSBjaCAtPiBjbG9zZV9vdXQgY2hcbiAgICAgIGVuZDtcbiAgICAgIHByaW50X2RlbGF5ZWRfZXJyb3JzICgpO1xuICAgICAgbWF0Y2ggIXRlc3RzX2ZhaWxlZCwgIXRlc3RfbW9kdWxlc19mYWlsZWQgd2l0aFxuICAgICAgfCAwLCAwIC0+IGJlZ2luXG4gICAgICAgICAgaWYgIXNob3dfY291bnRzIHRoZW4gYmVnaW5cbiAgICAgICAgICAgIFByaW50Zi5lcHJpbnRmIFwiJWQgdGVzdHMgcmFuLCAlZCB0ZXN0X21vZHVsZXMgcmFuXFxuJSFcIiAhdGVzdHNfcmFuICF0ZXN0X21vZHVsZXNfcmFuXG4gICAgICAgICAgZW5kO1xuICAgICAgICAgIGxldCBlcnJvcnMgPVxuICAgICAgICAgICAgbGV0IHVudXNlZF90ZXN0cyA9XG4gICAgICAgICAgICAgIExpc3QuZmlsdGVyIChmdW4gKF8sIF8sIHVzZWQpIC0+IG5vdCAhdXNlZCkgd2hpY2hfdGVzdHMub25seV90ZXN0X2xvY2F0aW9uXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbWF0Y2ggdW51c2VkX3Rlc3RzIHdpdGhcbiAgICAgICAgICAgIHwgW10gLT4gTm9uZVxuICAgICAgICAgICAgfCBfIDo6IF8gLT4gU29tZSB1bnVzZWRfdGVzdHNcbiAgICAgICAgICBpblxuICAgICAgICAgIG1hdGNoIGVycm9ycyB3aXRoXG4gICAgICAgICAgfCBTb21lIHRlc3RzIC0+XG4gICAgICAgICAgICBQcmludGYuZXByaW50ZiBcInBweF9pbmxpbmVfdGVzdCBlcnJvcjogdGhlIGZvbGxvd2luZyAtb25seS10ZXN0IGZsYWdzIG1hdGNoZWQgbm90aGluZzpcIjtcbiAgICAgICAgICAgIExpc3QuaXRlciAoZnVuIChmaWxlbmFtZSwgbGluZV9udW1iZXJfb3B0LCBfKSAtPlxuICAgICAgICAgICAgICBtYXRjaCBsaW5lX251bWJlcl9vcHQgd2l0aFxuICAgICAgICAgICAgICB8IE5vbmUgLT4gUHJpbnRmLmVwcmludGYgXCIgJXNcIiBmaWxlbmFtZVxuICAgICAgICAgICAgICB8IFNvbWUgbGluZV9udW1iZXIgLT4gUHJpbnRmLmVwcmludGYgXCIgJXM6JWRcIiBmaWxlbmFtZSBsaW5lX251bWJlclxuICAgICAgICAgICAgKSB0ZXN0cztcbiAgICAgICAgICAgIFByaW50Zi5lcHJpbnRmIFwiLlxcbiUhXCI7XG4gICAgICAgICAgICBUZXN0X3Jlc3VsdC5FcnJvclxuICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgaWYgIXRlc3RzX3JhbiA9IDAgJiYgIXN0cmljdCB0aGVuIGJlZ2luXG4gICAgICAgICAgICAgIFByaW50Zi5lcHJpbnRmIFwicHB4X2lubGluZV90ZXN0IGVycm9yOiBubyB0ZXN0cyBoYXZlIGJlZW4gcnVuLlxcbiUhXCI7XG4gICAgICAgICAgICAgIFRlc3RfcmVzdWx0LkVycm9yXG4gICAgICAgICAgICBlbmQgZWxzZSBiZWdpblxuICAgICAgICAgICAgICBUZXN0X3Jlc3VsdC5TdWNjZXNzXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgZW5kXG4gICAgICB8IGNvdW50LCBjb3VudF90ZXN0X21vZHVsZXMgLT5cbiAgICAgICAgUHJpbnRmLmVwcmludGYgXCJGQUlMRUQgJWQgLyAlZCB0ZXN0cyVzXFxuJSFcIiBjb3VudCAhdGVzdHNfcmFuXG4gICAgICAgICAgKGlmIGNvdW50X3Rlc3RfbW9kdWxlcyA9IDAgdGhlbiBcIlwiIGVsc2UgUHJpbnRmLnNwcmludGYgKFwiLCAlZCBURVNcIiBeXiBcIlRfTU9EVUxFU1wiKSBjb3VudF90ZXN0X21vZHVsZXMpO1xuICAgICAgICBUZXN0X3Jlc3VsdC5GYWlsdXJlXG4gICAgZW5kXG5cbmxldCB1c2VfY29sb3IgPSAhdXNlX2NvbG9yXG5sZXQgaW5fcGxhY2UgID0gIWluX3BsYWNlXG5sZXQgZGlmZl9jb21tYW5kID0gIWRpZmZfY29tbWFuZFxubGV0IHNvdXJjZV90cmVlX3Jvb3QgPSAhc291cmNlX3RyZWVfcm9vdFxubGV0IGFsbG93X291dHB1dF9wYXR0ZXJucyA9ICFhbGxvd19vdXRwdXRfcGF0dGVybnNcblxubGV0IGV2YWx1YXRvcnMgPSByZWYgW3N1bW1hcml6ZV1cbmxldCBhZGRfZXZhbHVhdG9yIH5mID0gZXZhbHVhdG9ycyA6PSBmIDo6ICFldmFsdWF0b3JzXG5sZXQgZXhpdCAoKSA9XG4gIExpc3QubWFwIChmdW4gZiAtPiBmICgpKSAoTGlzdC5yZXYgIWV2YWx1YXRvcnMpXG4gIHw+IFRlc3RfcmVzdWx0LmNvbWJpbmVfYWxsXG4gIHw+IFRlc3RfcmVzdWx0LnRvX2V4aXRfY29kZVxuICB8PiBleGl0XG4iLCJ0eXBlIHRcblxubGV0IGFic3VyZCAoXzogdCk6ICdhID1cbiAgICBhc3NlcnQgZmFsc2VcbiIsImluY2x1ZGUgU3RkbGliLlN0cmluZ1xuXG5sZXQgb25lIChjOmNoYXIpOiBzdHJpbmcgPVxuICAgIG1ha2UgMSBjXG5cblxuXG5cbmxldCBpc19wcmVmaXggKGE6IHN0cmluZykgKGI6c3RyaW5nKTogYm9vbCA9XG4gICAgbGV0IGxlbl9hID0gbGVuZ3RoIGEgaW5cbiAgICBsZW5fYSA8PSBsZW5ndGggYiAmJiBhID0gc3ViIGIgMCBsZW5fYVxuXG5cblxubGV0IGlzX3N1ZmZpeCAoYTogc3RyaW5nKSAoYjpzdHJpbmcpOiBib29sID1cbiAgICBsZXQgbGVuX2EgPSBsZW5ndGggYVxuICAgIGFuZCBsZW5fYiA9IGxlbmd0aCBiXG4gICAgaW5cbiAgICBsZW5fYSA8PSBsZW5fYlxuICAgICYmIGEgPSBzdWIgYiAgKGxlbl9iIC0gbGVuX2EpIGxlbl9hXG5cblxuXG5cblxubGV0IGZpbmQgKGY6Y2hhciAtPiBib29sKSAoc3RhcnQ6aW50KSAoczpzdHJpbmcpOiBpbnQgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggcyBpblxuICAgIGxldCByZWMgZmluZCBpID1cbiAgICAgICAgaWYgaSA9IGxlbiB8fCBmIChnZXQgcyBpKSB0aGVuXG4gICAgICAgICAgICBpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmQgKGkrMSlcbiAgICBpblxuICAgIGZpbmQgc3RhcnRcblxuXG5sZXQgaGFzIChmOiBjaGFyIC0+IGJvb2wpIChzdGFydDogaW50KSAoczogc3RyaW5nKTogYm9vbCA9XG4gICAgZmluZCBmIHN0YXJ0IHNcbiAgICA8XG4gICAgbGVuZ3RoIHNcblxuXG5sZXQgZmluZF9id2QgKGY6IGNoYXIgLT4gYm9vbCkgKGJleW9uZDogaW50KSAoczogc3RyaW5nKTogaW50ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHNcbiAgICBpblxuICAgIGxldCBiZXlvbmQgPVxuICAgICAgICBpZiBiZXlvbmQgPCAwIHx8IGxlbiA8IGJleW9uZCB0aGVuXG4gICAgICAgICAgICBsZW5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYmV5b25kXG4gICAgaW5cbiAgICBsZXQgcmVjIGZpbmQgaSA9XG4gICAgICAgIGlmIGkgPSAwIHx8IGYgKGdldCBzIChpIC0gMSkpIHRoZW5cbiAgICAgICAgICAgIGkgLSAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZpbmQgKGkgLSAxKVxuICAgIGluXG4gICAgZmluZCBiZXlvbmRcblxuXG5cbmxldCBsaXN0IChzOnN0cmluZyk6IGNoYXIgbGlzdCA9XG4gICAgbGV0IHJlYyBsaXN0IGNzIGkgPVxuICAgICAgICBpZiBpID0gMCB0aGVuXG4gICAgICAgICAgICBjc1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBsZXQgaiA9IGkgLSAxIGluXG4gICAgICAgICAgICBsaXN0IChnZXQgcyBqIDo6IGNzKSBqXG4gICAgaW5cbiAgICBsaXN0IFtdIChsZW5ndGggcylcblxuXG5sZXQgb2ZfbGlzdCAoY3M6Y2hhciBsaXN0KTogc3RyaW5nID1cbiAgICBsZXQgcmVjIHN0ciBjcyBpID1cbiAgICAgICAgbWF0Y2ggY3Mgd2l0aFxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICBCeXRlcy5jcmVhdGUgaVxuICAgICAgICB8IGM6OmNzIC0+XG4gICAgICAgICAgICBsZXQgYnMgPSBzdHIgY3MgKGkrMSkgaW5cbiAgICAgICAgICAgIEJ5dGVzLnNldCBicyBpIGM7XG4gICAgICAgICAgICBic1xuICAgIGluXG4gICAgbGV0IGJzID0gc3RyIGNzIDAgaW5cbiAgICBCeXRlcy51bnNhZmVfdG9fc3RyaW5nIGJzXG5cblxuXG5sZXQgcmV2ZXJzZSAoczogc3RyaW5nKTogc3RyaW5nID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHMgaW5cbiAgICBpbml0IGxlbiAoZnVuIGkgLT4gZ2V0IHMgKGxlbiAtIDEgLSBpKSlcblxuXG5tb2R1bGUgVG9fc291cmNlID1cbnN0cnVjdFxuICAgIHR5cGUgaXRlbSA9IGNoYXJcblxuICAgIHR5cGUgdCA9IGludCAqIHN0cmluZ1xuXG4gICAgbGV0IGhhc19tb3JlICgoaSxzKTogdCk6IGJvb2wgPVxuICAgICAgICBpIDwgbGVuZ3RoIHNcblxuICAgIGxldCBwZWVrICgoaSxzKTogdCk6IGNoYXIgPVxuICAgICAgICBhc3NlcnQgKGhhc19tb3JlIChpLHMpKTtcbiAgICAgICAgZ2V0IHMgaVxuXG4gICAgbGV0IGFkdmFuY2UgKChpLHMpKTogdCA9XG4gICAgICAgIGFzc2VydCAoaGFzX21vcmUgKGksIHMpKTtcbiAgICAgICAgKGkgKyAxLCBzKVxuXG4gICAgbGV0IG1ha2UgKHM6IHN0cmluZyk6IHQgPVxuICAgICAgICAoMCwgcylcbmVuZFxuXG5cblxubW9kdWxlIEZyb21fc291cmNlIChSOiBJbnRlcmZhY2VzLlNPVVJDRSB3aXRoIHR5cGUgaXRlbSA9IGNoYXIpID1cbnN0cnVjdFxuICAgIGxldCBtYWtlX3dpdGhfc2l6ZSAoZXN0aW1hdGU6IGludCkgKHI6IFIudCk6IHQgPVxuICAgICAgICBsZXQgZXN0aW1hdGUgPVxuICAgICAgICAgICAgaWYgZXN0aW1hdGUgPD0gMCB0aGVuXG4gICAgICAgICAgICAgICAgODBcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBlc3RpbWF0ZVxuICAgICAgICBpblxuICAgICAgICBsZXQgYnVmZmVyICAgPSByZWYgKEJ5dGVzLmNyZWF0ZSBlc3RpbWF0ZSlcbiAgICAgICAgYW5kIGxlbiAgICAgID0gcmVmIDBcbiAgICAgICAgYW5kIGNhcGFjaXR5ID0gcmVmIGVzdGltYXRlXG4gICAgICAgIGluXG4gICAgICAgIGxldCBtYWtlX3Jvb20gKCkgPVxuICAgICAgICAgICAgaWYgIWxlbiA9ICFjYXBhY2l0eSB0aGVuXG4gICAgICAgICAgICAgICAgbGV0IGJuZXcgPSBCeXRlcy5jcmVhdGUgKDIgKiAhY2FwYWNpdHkpIGluXG4gICAgICAgICAgICAgICAgYmVnaW5cbiAgICAgICAgICAgICAgICAgICAgQnl0ZXMuYmxpdCAhYnVmZmVyIDAgYm5ldyAwICFsZW47XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA6PSBibmV3O1xuICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSA6PSAyICogIWNhcGFjaXR5XG4gICAgICAgICAgICAgICAgZW5kXG4gICAgICAgIGluXG4gICAgICAgIGxldCBwdXNoIGMgPVxuICAgICAgICAgICAgbWFrZV9yb29tICgpO1xuICAgICAgICAgICAgQnl0ZXMuc2V0ICFidWZmZXIgIWxlbiBjO1xuICAgICAgICAgICAgbGVuIDo9ICFsZW4gKyAxO1xuICAgICAgICBpblxuICAgICAgICBsZXQgcmVjIHJlY3Vyc2UgciA9XG4gICAgICAgICAgICBpZiBSLmhhc19tb3JlIHIgdGhlblxuICAgICAgICAgICAgICAgIGJlZ2luXG4gICAgICAgICAgICAgICAgICAgIHB1c2ggKFIucGVlayByKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSAoUi5hZHZhbmNlIHIpXG4gICAgICAgICAgICAgICAgZW5kXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQnl0ZXMuc3ViX3N0cmluZyAhYnVmZmVyIDAgIWxlblxuICAgICAgICBpblxuICAgICAgICByZWN1cnNlIHJcblxuICAgIGxldCBtYWtlIChyOiBSLnQpOiB0ID1cbiAgICAgICAgbWFrZV93aXRoX3NpemUgMTAwIHJcbmVuZFxuXG5cblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzdHIgPSBcIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyXCIgaW5cbiAgICBsZXQgbW9kdWxlIEZyb20gPSBGcm9tX3NvdXJjZSAoVG9fc291cmNlKSBpblxuICAgIHN0ciA9IEZyb20ubWFrZV93aXRoX3NpemUgMiAoVG9fc291cmNlLm1ha2Ugc3RyKVxuIiwiKCoqIEEgc21hbGwgd3JhcHBlciBhcm91bmQgW1N0ZGxpYi5TdHJpbmddIHdpdGggc29tZSBleHRyYSBmdW5jdGlvbnMuXG5cbiAgICBVc2UgW1N0ZGxpYi5TdHJpbmddIGlmIHlvdSBuZWVkIGZ1bmN0aW9ucyBmcm9tIHRoZSBvY2FtbCBzdGFuZGFyZCBsaWJyYXJ5XG4gICAgd2hpY2ggYXJlIG5vdCBpbiB0aGlzIG1vZHVsZS5cbiopXG5cblxuXG5cbnR5cGUgdCA9IHN0cmluZ1xuKCoqIEEgc3RhbmRhcmQgb2NhbWwgc3RyaW5nLiAqKVxuXG5cbnZhbCBpc19wcmVmaXg6IHQgLT4gdCAtPiBib29sXG4oKiogW2lzX3ByZWZpeCBhIGJdIElzIFthXSBhIHByZWZpeCBvZiBbYl0/ICopXG5cbnZhbCBpc19zdWZmaXg6IHQgLT4gdCAtPiBib29sXG4oKiogW2lzX3N1ZmZpeCBhIGJdIElzIFthXSBhIHN1ZmZpeCBvZiBbYl0/ICopXG5cblxudmFsIHJldmVyc2U6IHQgLT4gdFxuKCoqIFtyZXZlcnNlIHNdIHJldmVyc2VzIHRoZSBzdHJpbmcgW3NdLiAqKVxuXG5cbnZhbCBjb21wYXJlOiB0IC0+IHQgLT4gaW50XG4oKiogW2NvbXBhcmUgczEgczJdIENvbXBhcmUgdGhlIHN0cmluZ3MgW3MxXSBhbmQgW3MyXS5cblxuICAgIFJldHVybiBbLTFdLCBpZiBbczFdIGlzIGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXIgdGhhbiBbczJdXG4gICAgUmV0dXJuIFswXSwgIGlmIGJvdGggc3RyaW5nIGFyZSBlcXVhbFxuICAgIFJldHVybiBbKzFdLCBpZiBbczFdIGlzIGxleGljb2dyYXBoaWNhbGx5IGdyZWF0ZXIgdGhhbiBbczJdXG4qKVxuXG5cbnZhbCBvbmU6IGNoYXIgLT4gdFxuKCoqIFtvbmUgY10gQSBzdHJpbmcgd2l0aCB0aGUgY2hhcmFjdGVyIFtjXSBhcyB0aGUgb25seSBjaGFyYWN0ZXIuICopXG5cblxuXG52YWwgZmluZDogKGNoYXIgLT4gYm9vbCkgLT4gaW50IC0+IHQgLT4gaW50XG4oKiogW2ZpbmQgcCBzdGFydCBzdHJdIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgc3RhcnRpbmcgZnJvbVxuICAgIFtzdGFydF0gaW4gdGhlIHN0cmluZyBbc3RyXSB3aGljaCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSBbcF0uIElmIG5vXG4gICAgY2hhcmFjdGVyIGNhbiBiZSBmb3VuZCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLlxuKilcblxuXG52YWwgaGFzOiAgKGNoYXIgLT4gYm9vbCkgLT4gaW50IC0+IHQgLT4gYm9vbFxuKCoqIFtoYXMgcCBzdGFydCBzdHJdIERvZXMgdGhlIHN0cmluZyBbc3RyXSBzdGFydGluZyBmcm9tIHBvc2l0aW9uIFtzdGFydF0gaGF2ZVxuICAgIGEgY2hhcmFjdGVyIHNhdGlzZnlpbmcgdGhlIHByZWRpY2F0ZSBbcF0/ICopXG5cblxudmFsIGZpbmRfYndkOiAoY2hhciAtPiBib29sKSAtPiBpbnQgLT4gdCAtPiBpbnRcbigqKiBbZmluZF9id2QgcCBiZXlvbmQgc3RyXSBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlZm9yZVxuICAgIFtiZXlvbmRdIGluIHRoZSBzdHJpbmcgW3N0cl0gd2hpY2ggc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUgW3BdLiBSZXR1cm4gWy0xXSxcbiAgICBpZiBubyBjaGFyYWN0ZXIgY2FuIGJlIGZvdW5kLiAqKVxuXG5cbnZhbCBsaXN0OiB0IC0+IGNoYXIgbGlzdFxuKCoqIFtsaXN0IHN0cl0gQ29udmVydCB0aGUgc3RyaW5nIFtzdHJdIHRvIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLiAqKVxuXG52YWwgb2ZfbGlzdDogY2hhciBsaXN0IC0+IHRcbigqKiBbb2ZfbGlzdCBsXSBDb252ZXJ0IHRoZSBsaXN0IFtsXSBvZiBjaGFyYWN0ZXJzIHRvIGEgc3RyaW5nLiAqKVxuXG5cbnZhbCBsZW5ndGg6IHQgLT4gaW50XG4oKiogW2xlbmd0aCBzdHJdIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBbc3RyXS4gKilcblxuXG52YWwgZ2V0OiB0IC0+IGludCAtPiBjaGFyXG4oKiogW2dldCBzdHIgaV0gVGhlIFtpXXRoIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIFtzdHJdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPCBsZW5ndGggc3RyXVxuKilcblxuXG52YWwgc3ViOiB0IC0+IGludCAtPiBpbnQgLT4gdFxuKCoqIFtzdWIgc3RyIHN0YXJ0IGxlbl0gVGhlIHN1YnN0cmluZyBvZiBbc3RyXSBzdGFydGluZyBhdCBbc3RhcnRdIHdpdGggbGVuZ3RoXG4gICAgW2xlbl0uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IHN0YXJ0IDw9IHN0YXJ0ICsgbGVuIDw9IGxlbmd0aCBzdHJdXG4qKVxuXG5cbnZhbCBjb25jYXQ6IHN0cmluZyAtPiBzdHJpbmcgbGlzdCAtPiBzdHJpbmdcbigqKiBbY29uY2F0IHNlcCBzdHJfbGlzdF0gQ29uY2F0ZW5hdGUgdGhlIHN0cmluZ3MgaW4gdGhlIHN0cmluZyBsaXN0IFtzdHJfbGlzdF1cbiAgICBhbmQgcHV0IHRoZSBzZXBhcmF0b3IgW3NlcF0gYmV0d2VlbiB0aGVtLlxuKilcblxuXG52YWwgc3BsaXRfb25fY2hhcjogY2hhciAtPiBzdHJpbmcgLT4gc3RyaW5nIGxpc3RcbigqKiBbc3BsaXRfb25fY2hhciBjIHN0cl0gU3BsaXQgdGhlIHN0cmluZyBbc3RyXSBvbiBlYWNoIG9jY3VycmVuY2Ugb2YgdGhlXG4gICAgY2hhcmFjdGVyIFtjXSBpbnRvIGEgbGlzdCBvZiBzdHJpbmdzLlxuKilcblxuXG52YWwgbWFrZTogaW50IC0+IGNoYXIgLT4gdFxuKCoqIFttYWtlIG4gY10gTWFrZSBhIHN0cmluZyB3aXRoIFtuXSBjb3BpZXMgb2YgdGhlIGNoYXJhY3RlciBbY10uICopXG5cblxudmFsIGluaXQ6IGludCAtPiAoaW50IC0+IGNoYXIpIC0+IHRcbigqKiBbaW5pdCBuIGZdIE1ha2UgYSBzdHJpbmcgb2YgbGVuZ3RoIFtuXSB3aGVyZSB0aGUgW2lddGggY2hhcmFjdGVyIGlzIFtmIGldLlxuKilcblxuXG5cblxuXG4oKiogQ29udmVyc2lvbiBvZiBhIHN0cmluZyB0byBhIHNvdXJjZSBvZiBjaGFyYWN0ZXJzLiAqKVxubW9kdWxlIFRvX3NvdXJjZTpcbnNpZ1xuICAgIGluY2x1ZGUgSW50ZXJmYWNlcy5TT1VSQ0Ugd2l0aCB0eXBlIGl0ZW0gPSBjaGFyXG5cbiAgICB2YWwgbWFrZTogc3RyaW5nIC0+IHRcbiAgICAoKiogW21ha2Ugc3RyXSBBIGNoYXJhY3RlciBzdHJlYW0gZ2VuZXJhdGVkIGZyb20gdGhlIHN0cmluZyBbc3RyXS4gKilcbmVuZFxuXG5cblxuKCoqIENvbnZlcnNpb24gb2YgYSBzb3VyY2Ugb2YgY2hhcmFjdGVycyB0byBhIHN0cmluZy4gKilcbm1vZHVsZSBGcm9tX3NvdXJjZSAoUzogSW50ZXJmYWNlcy5TT1VSQ0Ugd2l0aCB0eXBlIGl0ZW0gPSBjaGFyKTpcbnNpZ1xuICAgIHZhbCBtYWtlOiBTLnQgLT4gdFxuICAgICgqKiBbbWFrZSBzXSBDb252ZXJ0IHRoZSBzdHJlYW0gW3NdIG9mIGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcuICopXG5cblxuICAgIHZhbCBtYWtlX3dpdGhfc2l6ZTogaW50IC0+IFMudCAtPiB0XG4gICAgKCoqIFttYWtlX3dpdGhfc2l6ZSBuIHNdIENvbnZlcnQgdGhlIHN0cmVhbSBbc10gb2YgY2hhcmFjdGVycyB0byBhIHN0cmluZ1xuICAgICAgICB3aGVyZSBbbl0gaXMgYW4gZXN0aW1hdGUgb2YgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLlxuXG4gICAgICAgIFRoZSBmdW5jdGlvbiB3b3JrcyBpbnRlcm5hbGx5IHdpdGggYSBidWZmZXIuIFtuXSBpcyB1c2VkIHRvIGd1aWRlIHRoZVxuICAgICAgICBidWZmZXIgYWxsb2NhdGlvbiBhbmQgdGhlIHJlc2l6aW5nIG9mIHRoZSBidWZmZXIuIFRoZSBiZXR0ZXIgdGhlXG4gICAgICAgIGVzdGltYXRlLCB0aGUgZmV3ZXIgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCByZXNpemVzIGFyZSBuZWNlc3NhcnkuXG4gICAgKilcbmVuZFxuIiwidHlwZSAoJ2EsICdlKSB0ID0gKCdhLCAnZSkgcmVzdWx0XG5cblxubGV0IHJldHVybiAoYTogJ2EpOiAoJ2EsICdlKSB0ID1cbiAgICBPayBhXG5cblxubGV0IGZhaWwgKGU6ICdlKTogKCdhLCAnZSkgdCA9XG4gICAgRXJyb3IgZVxuXG5cblxubGV0IHRvX29wdGlvbiAocjogKCdhLCBfKSB0KTogJ2Egb3B0aW9uID1cbiAgICBtYXRjaCByIHdpdGhcbiAgICB8IE9rIGEgLT5cbiAgICAgICAgU29tZSBhXG4gICAgfCBFcnJvciBfIC0+XG4gICAgICAgIE5vbmVcblxuXG5sZXQgKD4+PSkgKG06ICgnYSwgJ2UpIHQpIChmOiAnYSAtPiAoJ2IsICdlKSB0KTogKCdiLCAnZSkgdCA9XG4gICAgbWF0Y2ggbSB3aXRoXG4gICAgfCBPayBhIC0+XG4gICAgICAgIGYgYVxuICAgIHwgRXJyb3IgZSAtPlxuICAgICAgICBFcnJvciBlXG5cbmxldCAoIGxldCogKSA9ICg+Pj0pXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpOiAoJ2EsICdlKSB0IC0+ICgnYiwgJ2UpIHQgPSBmdW5jdGlvblxuICAgIHwgT2sgYSAtPlxuICAgICAgICBPayAoZiBhKVxuXG4gICAgfCBFcnJvciBlIC0+XG4gICAgICAgIEVycm9yIGVcblxuXG5cbmxldCBtYXBfZXJyb3IgKGY6ICdlIC0+ICdmKTogKCdhLCAnZSkgdCAtPiAoJ2EsICdmKSB0ID0gZnVuY3Rpb25cbiAgICB8IE9rIGEgLT5cbiAgICAgICAgT2sgYVxuXG4gICAgfCBFcnJvciBlIC0+XG4gICAgICAgIEVycm9yIChmIGUpXG5cblxubGV0IGdldDogKCdhLCBWb2lkLnQpIHQgLT4gJ2EgPSBmdW5jdGlvblxuICAgIHwgT2sgYSAtPlxuICAgICAgICBhXG5cbiAgICB8IEVycm9yIGUgLT5cbiAgICAgICAgVm9pZC5hYnN1cmQgZVxuXG5cblxuXG5cbm1vZHVsZSBNb25hZCAoRTogSW50ZXJmYWNlcy5BTlkpID1cbnN0cnVjdFxuICAgIHR5cGUgJ2EgdCA9ICgnYSwgRS50KSByZXN1bHRcblxuICAgIGxldCByZXR1cm4gPSByZXR1cm5cblxuICAgIGxldCBmYWlsID0gZmFpbFxuXG4gICAgbGV0IHRvX29wdGlvbiA9IHRvX29wdGlvblxuXG4gICAgbGV0ICg+Pj0pICA9ICg+Pj0pXG5cbiAgICBsZXQgKCBsZXQqICkgPSAoPj49KVxuZW5kXG5cblxuXG4oKiBVbml0IHRlc3RzICopXG4oKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiopXG5cbnR5cGUgJ2EgciA9ICgnYSwgc3RyaW5nKSByZXN1bHRcblxubGV0IGFkZCAoYTogaW50IHIpIChiOiBpbnQgcik6IGludCByID1cbiAgICBsZXQqIHggPSBhIGluXG4gICAgbGV0KiB5ID0gYiBpblxuICAgIE9rICh4ICsgeSlcblxubGV0IGRpdmlkZSAoYTogaW50IHIpIChiOiBpbnQgcik6IGludCByID1cbiAgICBsZXQqIHggPSBhIGluXG4gICAgbGV0KiB5ID0gYiBpblxuICAgIGlmIHkgPSAwIHRoZW5cbiAgICAgICAgRXJyb3IgXCJEaXZpc2lvbiBieSBaZXJvXCJcbiAgICBlbHNlXG4gICAgICAgIE9rICh4IC8geSlcblxubGV0JXRlc3QgXyA9XG4gICAgYWRkIChPayAxKSAoZGl2aWRlIChPayAyKSAoT2sgMCkpXG4gICAgPVxuICAgIEVycm9yIFwiRGl2aXNpb24gYnkgWmVyb1wiXG5cbmxldCV0ZXN0IF8gPVxuICAgIGFkZCAoT2sgMSkgKGRpdmlkZSAoT2sgMTApIChPayAyKSlcbiAgICA9XG4gICAgT2sgNlxuIiwiaW5jbHVkZSBTdGRsaWIuSW50XG5cblxubGV0IGl0ZXJhdGUgKG46IHQpIChmOiAnYSAtPiAnYSkgKHN0YXJ0OiAnYSk6ICdhID1cbiAgICBsZXQgcmVjIGl0ZXIgbiB2ID1cbiAgICAgICAgaWYgbiA9IDAgdGhlblxuICAgICAgICAgICAgdlxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpdGVyIChuIC0gMSkgKGYgdilcbiAgICBpblxuICAgIGl0ZXIgbiBzdGFydFxuIiwidHlwZSAnYSB0ID0gJ2Egb3B0aW9uXG5cbmxldCByZXR1cm4gKGE6ICdhKTogJ2EgdCA9XG4gICAgU29tZSBhXG5cbmxldCBmYWlsOiAnYSB0ID1cbiAgICBOb25lXG5cblxubGV0IChsZXQqICkgKG06ICdhIHQpIChmOiAnYSAtPiAnYiB0KTogJ2IgdCA9XG4gICAgbWF0Y2ggbSB3aXRoXG4gICAgfCBTb21lIGEgLT5cbiAgICAgICAgZiBhXG4gICAgfCBOb25lIC0+XG4gICAgICAgIE5vbmVcblxuXG5sZXQgKD4+PSkgPSAobGV0KiApXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChtOiAnYSB0KTogJ2IgdCA9XG4gICAgbGV0KiBhID0gbSBpblxuICAgIHJldHVybiAoZiBhKVxuXG5cblxubGV0IHRvX2xpc3QgKG06ICdhIHQpOiAnYSBsaXN0ID1cbiAgICBtYXRjaCBtIHdpdGhcbiAgICB8IFNvbWUgYSAtPlxuICAgICAgICBbYV1cbiAgICB8IE5vbmUgLT5cbiAgICAgICAgW11cbiIsIigqKiBBIHRoaW4gd3JhcHBlciBhcm91bmQgW1N0ZGxpYi5BcnJheV0gd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBhbmQgc2V0cyBhbmRcbiAgICBtYXBzIGJhc2VkIG9uIGFycmF5c1xuXG4gICAgVXNlIFtTdGRsaWIuQXJyYXldIGluIGNhc2UgeW91IG5lZWQgZnVuY3Rpb25zIHdoaWNoIGFyZSBub3QgY29udGFpbmVkIGluXG4gICAgdGhpcyBtb2R1bGUuIFRoZXJlIGFyZSBubyBwcm9ibGVtcyB1c2luZyBbRm1saWJfc3RkLkFycmF5XSBhbmRcbiAgICBbU3RkbGliLkFycmF5XSwgYmVjYXVzZSBib3RoIGRhdGF0eXBlcyBhcmUgaWRlbnRpY2FsLlxuXG4gICAgRnV0aGVybW9yZSB0aGVyZSBhcmUgdGhlIG1vZHVsZXMgW1NldF0gYW5kIFtNYXBdIHdoaWNoIGltcGxlbWVudCBmaW5pdGUgc2V0c1xuICAgIGFuZCBmaW5pdGUgbWFwcyBiYXNlZCBvbiBzb3J0ZWQgYXJyYXlzLiBGb3Igc21hbGwgc2V0cyBhbmQgbWFwcywgdGhlIGFycmF5XG4gICAgYmFzZWQgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBlcmlvciB0byB0cmVlIGJhc2VkIGltcGxlbWVudGF0aW9ucyBsaWtlIGF2bFxuICAgIHRyZWVzIG9yIHJlZCBibGFjayB0cmVlcywgYmVjYXVzZSB0aGV5IGhhdmUgYSBiZXR0ZXIgY2FjaGUgYmVoYXZpb3VyLlxuKilcblxuXG5cbigqKiB7MSBCYXNpYyBBcnJheSBGdW5jdGlvbnN9ICopXG5cbnR5cGUgJ2EgdCA9ICdhIGFycmF5XG5cbnZhbCBsZW5ndGg6ICdhIHQgLT4gaW50XG4oKiogW2xlbmd0aCBhcnJdIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IFthcnJdLiAqKVxuXG5cbnZhbCB2YWxpZF9pbmRleDogaW50IC0+ICdhIHQgLT4gYm9vbFxuKCoqIFt2YWxpZF9pbmRleCBpIGFycl0gSXMgW2ldIGEgdmFsaWQgaW5kZXggaW50byB0aGUgYXJyYXkgW2Fycl0/ICopXG5cblxudmFsIGlzX2VtcHR5OiAnYSB0IC0+IGJvb2xcbigqKiBJcyB0aGUgYXJyYXkgZW1wdHk/ICopXG5cblxudmFsIGhhc19zb21lOiAnYSB0IC0+IGJvb2xcbigqKiBEb2VzIHRoZSBhcnJheSBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50PyAqKVxuXG5cbnZhbCBnZXQ6ICdhIHQgLT4gaW50IC0+ICdhXG4oKiogW2dldCBhcnIgaV0gVGhlIFtpXXRoIGVsZW1lbnQgb2YgdGhlIGFycmF5IFthcnJdLlxuXG4gICAgUHJlY29uZGl0aW9uOiBbMCA8PSBpICYmIGkgPCBsZW5ndGggW2Fycl1dXG4qKVxuXG5cbnZhbCBmaXJzdDogJ2EgdCAtPiAnYVxuKCoqIFtmaXJzdCB4c10gVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGFycmF5IFt4c10uXG5cbiAgICBQcmVjb25kaXRpb246IFtoYXNfc29tZSB4c11cbiopXG5cblxudmFsIGxhc3Q6ICdhIHQgLT4gJ2FcbigqKiBbbGFzdCB4c10gVGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgW3hzXS5cblxuICAgIFByZWNvbmRpdGlvbjogW2hhc19zb21lIHhzXVxuKilcblxuXG5cblxudmFsIHNldDogJ2EgdCAtPiBpbnQgLT4gJ2EgLT4gdW5pdFxuKCoqIFtzZXQgYXJyIGkgdmFsdWVdIFNldCB0aGUgW2lddGggZWxlbWVudCBvZiB0aGUgYXJyYXkgW2Fycl0gdG8gW3ZhbHVlXS5cblxuICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDwgbGVuZ3RoIFthcnJdXVxuKilcblxuXG52YWwgbWFrZTogaW50IC0+ICdhIC0+ICdhIHRcbigqKiBTYW1lIGFzIFN0ZGxpYi5BcnJheS5tYWtlICopXG5cblxudmFsIGluaXQ6IGludCAtPiAoaW50IC0+ICdhKSAtPiAnYSB0XG4oKiogU2FtZSBhcyBTdGRsaWIuQXJyYXkuaW5pdCAqKVxuXG5cblxudmFsIGFwcGVuZDogJ2EgdCAtPiAnYSB0IC0+ICdhIHRcbigqKiBbYXBwZW5kIHhzIHlzXSBDb25jYXRlbmF0ZSB0aGUgdHdvIGFycmF5cyBbeHNdIGFuZCBbeXNdLiAqKVxuXG5cblxudmFsIGluc2VydDogaW50IC0+ICdhIC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFtpbnNlcnQgaSB4IHhzXSBJbnNlcnQgdGhlIGVsZW1lbnQgW3hdIGF0IHBvc2l0aW9uIFtpXSBpbnRvIHRoZSBhcnJheSBbeHNdLlxuXG4gICAgTWFrZSBwbGFjZSBieSBwdXNoaW5nIHVwIHRoZSBlbGVtZW50cyBbaV0sIFtpICsgMV0sIC4uLiBvbmUgcG9zaXRpb24uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8PSBsZW5ndGggeHNdLlxuKilcblxuXG5cbnZhbCByZXBsYWNlOiBpbnQgLT4gJ2EgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW3JlcGxhY2UgaSB4IHhzXSBSZXBsYWNlIHRoZSBbaV10aCBlbGVtZW50IG9mIFt4c10gYnkgW3hdLlxuXG4gICAgUHJlY29uZGl0aW9uLiBbMCA8PSBpICYmIGkgPCBsZW5ndGggeHNdXG4qKVxuXG5cblxudmFsIHJlbW92ZTogaW50IC0+ICdhIHQgLT4gJ2EgdFxuKCoqIFtyZW1vdmUgaSB4c10gUmVtb3ZlIHRoZSBbaV10aCBlbGVtZW50IGZyb20gdGhlIGFycmF5IFt4c10uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IGkgJiYgaSA8IGxlbmd0aCB4c10uXG4qKVxuXG5cblxudmFsIHJlbW92ZV9maXJzdDogJ2EgdCAtPiAnYSB0XG4oKiogW3JlbW92ZV9maXJzdCB4c10gUmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGFycmF5IFt4c10uXG5cbiAgICBQcmVjb25kaXRpb246IFtoYXNfc29tZSB4c11cbiopXG5cblxuXG52YWwgcmVtb3ZlX2xhc3Q6ICdhIHQgLT4gJ2EgdFxuKCoqIFtyZW1vdmVfbGFzdCB4c10gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXkgW3hzXS5cblxuICAgIFByZWNvbmRpdGlvbjogW2hhc19zb21lIHhzXVxuKilcblxuXG5cbnZhbCBtYXA6ICgnYSAtPiAnYikgLT4gJ2EgdCAtPiAnYiB0XG4oKiogW21hcCBmIGFycl0gQ3JlYXRlIGEgbmV3IGFycmF5IGJ5IG1hcHBpbmcgYWxsIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBhcnJheVxuICAgIGJ5IHRoZSBmdW5jdGlvbiBbZl0uXG4qKVxuXG5cblxudmFsIGZvbGRfbGVmdDogKCdhIC0+ICdiIC0+ICdhKSAtPiAnYSAtPiAnYiB0IC0+ICdhXG4oKiogW2ZvbGRfbGVmdCBmIHN0YXJ0IGFycl1cblxuICAgIEZvbGQgdGhlIGZvbGRpbmcgZnVuY3Rpb24gW2ZdIHdpdGggc3RhcnQgdmFsdWUgW3N0YXJ0XSBvdmVyIHRoZSBhcnJheSBbYXJyXS5cblxuICAgIENvbXB1dGVcbiAgICB7W1xuICAgICAgICAoZiAoLi4uIChmIChmIHN0YXJ0IGFyci4oMCkpIGFyci4oMSkpIC4uLikgYXJyLihuIC0gMSlcbiAgICBdfVxuXG4gICAgd2hlcmUgW24gPSBsZW5ndGggYXJyXS5cbiopXG5cblxudmFsIGZvbGRpX2xlZnQ6ICgnYSAtPiBpbnQgLT4gJ2IgLT4gJ2EpIC0+ICdhIC0+ICdiIHQgLT4gJ2FcbigqKiBbZm9sZGlfbGVmdCBmIHN0YXJ0IGFycl1cblxuICAgIExpa2UgW2ZvbGRfbGVmdF0gd2l0aCB0aGUgY3VycmVudCBpbmRleCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHRoZVxuICAgIGZvbGRpbmcgZnVuY3Rpb24uXG4qKVxuXG5cbnZhbCBmb2xkX3JpZ2h0OiAoJ2IgLT4gJ2EgLT4gJ2EpIC0+ICdiIGFycmF5IC0+ICdhIC0+ICdhXG4oKiogW2ZvbGRfcmlnaHQgZiBhcnIgc3RhcnRdXG5cbiAgICBDb21wdXRlXG4gICAge1tcbiAgICAgICAgZiBhcnIuKDApIChmIGFyci4oMSkgKCAuLi4gKGYgYXJyLihuIC0gMSkgc3RhcnQpIC4uLiApKVxuICAgIF19XG4gICAgd2hlcmUgW24gPSBsZW5ndGggYXJyXVxuKilcblxuXG52YWwgY29weTogJ2EgdCAtPiAnYSB0XG4oKiogTWFrZSBhIGNvcHkgb2YgdGhlIGFycmF5LiAqKVxuXG5cblxudmFsIHN1YjogJ2EgdCAtPiBpbnQgLT4gaW50IC0+ICdhIHRcbigqKiBbc3ViIGFyciBzdGFydCBsZW5dIFRoZSBzdWJhcnJheSBvZiBbYXJyXSBzdGFydGluZyBhdCBbc3RhcnRdIHdpdGggbGVuZ2h0XG4gICAgW2xlbl0uXG5cbiAgICBQcmVjb25kaXRpb246IFswIDw9IHN0YXJ0ICYmIHN0YXJ0ICsgbGVuIDw9IGxlbmd0aCBhcnJdXG4qKVxuXG5cblxudmFsIGJsaXQ6ICdhIHQgLT4gaW50IC0+ICdhIHQgLT4gaW50IC0+IGludCAtPiB1bml0XG4oKiogW2JsaXQgc3JjIHNyY19wb3MgZHN0IGRzdF9wb3MgbGVuXVxuXG4gICAgQ29weSBbbGVuXSB2YWx1ZXMgZnJvbSBhcnJheSBbc3JjXSBzdGFydGluZyBhdCBbc3JjX3Bvc10gdG8gYXJyYXkgW2RzdF1cbiAgICBzdGFydGluZyBhdCBbZHN0X3Bvc10uXG4qKVxuXG5cbnZhbCBmaW5kOiAoJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiBpbnQgb3B0aW9uXG4oKiogW2ZpbmQgcCBhcnJdXG5cbiAgICBGaW5kIHRoZSBlbGVtZW50IHNhdGlzZnlpbmcgdGhlIHByZWRpY2F0ZSBbcF0gaW4gdGhlIGFycmF5IFthcnJdLiBSZXR1cm5cbiAgICBbTm9uZV0gaWYgbm8gc3VjaCBlbGVtZW50IGV4aXN0cy5cbiopXG5cblxudmFsIGZvcl9hbGw6ICgnYSAtPiBib29sKSAtPiAnYSB0IC0+IGJvb2xcbigqKiBbZm9yX2FsbCBwIGFycl1cblxuICAgIERvIGFsbCBlbGVtZW50cyBvZiB0aGUgYXJyYXkgW2Fycl0gc2F0aXNmeSB0aGUgcHJlZGljYXRlIFtwXT9cbiopXG5cblxuXG52YWwgZXhpc3RzOiAoJ2EgLT4gYm9vbCkgLT4gJ2EgdCAtPiBib29sXG4oKiogW2V4aXN0cyBwIGFycl1cblxuICAgIEV4aXN0cyBhbiBlbGVtZW50IG9mIHRoZSBhcnJheSBbYXJyXSB3aGljaCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZSBbcF0/XG4qKVxuXG5cblxuXG52YWwgcHVzaDogJ2EgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW3B1c2ggYSBhcnJdIFB1c2ggZWxlbWVudCBbYV0gdG8gdGhlIHJlYXIgZW5kIG9mIHRoZSBhcnJheSBbYXJyXS4gKilcblxuXG52YWwgcHVzaF9mcm9udDogJ2EgLT4gJ2EgdCAtPiAnYSB0XG4oKiogW3B1c2hfZnJvbnQgYSBhcnJdIFB1c2ggZWxlbWVudCBbYV0gdG8gdGhlIGZyb250IGVuZCBvZiB0aGUgYXJyYXkgW2Fycl0uICopXG5cblxudmFsIHRvX2xpc3Q6ICdhIHQgLT4gJ2EgbGlzdFxuKCoqIFt0b19saXN0IGFycl0gQ29udmVydCB0aGUgYXJyYXkgW2Fycl0gdG8gYSBsaXN0IHdpdGggdGhlIHNhbWUgY29udGVudC4gKilcblxuXG52YWwgb2ZfbGlzdDogJ2EgbGlzdCAtPiAnYSBhcnJheVxuKCoqIFtvZl9saXN0IGxzdF0gQ29udmVydCB0aGUgbGlzdCBbbHN0XSB0byBhbiBhcnJheSB3aXRoIHRoZSBzYW1lIGNvbnRlbnQuICopXG5cblxuXG5cblxuKCoqIHsxIEJpbmFyeSBTZWFyY2h9ICopXG5cblxudmFsIGJpbnNlYXJjaDogKCdrZXkgLT4gJ2tleSAtPiBpbnQpIC0+ICgnYSAtPiAna2V5KSAtPiAna2V5IC0+ICdhIHQgLT4gaW50ICogYm9vbFxuKCoqIFtiaW5zZWFyY2ggY29tcGFyZSBrZXlfb2Yga2V5IGFycl1cblxuICAgIFNlYXJjaCB0aGUgcG9zaXRpb24gb2YgW2tleV0gaW4gW2Fycl0uIEFzc3VtZSB0aGF0IHRoZSBhcnJheSBbYXJyXSBpcyBzb3J0ZWRcbiAgICB3aXRob3V0IGR1cGxpY2F0ZXMuIEl0IHJldHVybnMgdGhlIHBhaXIgW3Bvc2l0aW9uLCBleGFjdF9mbGFnXSB3aXRoIHRoZSBtZWFuaW5nXG5cbiAgICB7W1xuICAgICAgICBleGFjdF9mbGFnICAgICAgICAgID0+ICAgICAga2V5ID0ga2V5X29mIGFyci4ocG9zaXRpb24pXG5cbiAgICAgICAgbm90IGV4YWN0X2ZsYWcgICAgICA9PiAgICAgIGtleSA8IGtleV9vZiBhcnIuKHBvc2l0aW9uKVxuICAgIF19XG5cbiAgICBDb3JuZXIgY2FzZTogW3Bvc2l0aW9uID0gbGVuZ3RoIGFyciwgZXhhY3RfZmxnID0gZmFsc2VdLiBUaGlzIGNvcnJlc3BvbmRzIHRvXG4gICAgYSBmaWN0aXRpb3VzIGtleSBvZiBbK2luZmluaXR5XSBhdCB0aGUgaWxsZWdhbCBwb3NpdGlvbiBbbGVuZ3RoIGFycl0uXG5cbiAgICBUaGUgYXJyYXkgW2Fycl0gY29uc2lzdHMgb2YgZWxlbWVudHMgb2YgdHlwZSBbJ2FdLiBUaGUgZnVuY3Rpb24gW2tleV9vZl1cbiAgICBleHRyYWN0cyBhIGtleSBmcm9tIGFuIGVsZW1lbnQgb2YgdGhlIGFycmF5LiBUaGUga2V5cyBhcmUgY29tcGFyZWQgdXNpbmcgdGhlXG4gICAgY29tcGFyaXNvbiBmdW5jdGlvbiBbY29tcGFyZV0gd2l0aCB0aGUgdXN1YWwgbWVhbmluZzpcblxuICAgIFtjb21wYXJlIGEgYiA8IDBdICAgICAgICAgICAgICAgaWYgYW5kIG9ubHkgaWYgW2EgPCBiXVxuXG4gICAgW2NvbXBhcmUgYSBiID0gMF0gICAgICAgICAgICAgICBpZiBhbmQgb25seSBpZiBbYSA9IGJdXG5cbiAgICBbY29tcGFyZSBhIGIgPiAwXSAgICAgICAgICAgICAgIGlmIGFuZCBvbmx5IGlmIFthID4gYl1cbiopXG5cblxuXG5cblxuXG5cbigqKiB7MSBTZXRzIGFuZCBNYXBzIGJhc2VkIG9uIGFycmF5c30gKilcblxuXG5cbigqKiBBIHNldCBiYXNlZCBvbiBhcnJheXMgKilcbm1vZHVsZSBTZXQgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSk6XG5zaWdcbiAgICBpbmNsdWRlIEludGVyZmFjZXMuU0VUIHdpdGggdHlwZSBpdGVtID0gS2V5LnRcblxuICAgIHZhbCBlbGVtZW50OiBpbnQgLT4gdCAtPiBLZXkudFxuICAgICgqKiBbZWxlbWVudCBpIHNldF0gVGhlIFtpXXRoIGVsZW1lbnQgb2YgdGhlIHNldC4gKilcblxuXG4gICAgdmFsIGluZGV4X29mOiBLZXkudCAtPiB0IC0+IGludCBvcHRpb25cbiAgICAoKiogW2luZGV4X29mIGUgc2V0XSBDb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBbZV0gd2l0aGluIHRoZSBzZXRcbiAgICAgICAgW3NldF0sIGlmIFtlXSBpcyBpbiB0aGUgc2V0LiAqKVxuXG5cbiAgICB2YWwgc2luZ2xldG9uOiBLZXkudCAtPiB0XG4gICAgKCoqIFtzaW5nbGV0b24gZV0gVGhlIHNpbmdsZXRvbiBzZXQgd2l0aCB0aGUgb25seSBlbGVtZW50IFtlXS4gKilcbmVuZFxuXG5cblxuXG5cblxuKCoqIEEgbWFwIGJhc2VkIG9uIGFycmF5cyAqKVxubW9kdWxlIE1hcCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKTpcbnNpZ1xuICAgIGluY2x1ZGUgSW50ZXJmYWNlcy5NQVAgd2l0aCB0eXBlIGtleSA9IEtleS50XG5cblxuICAgICgqKiBbcGFpciBpIG1hcF0gVGhlIFtpXXRoIGtleSB2YWx1ZSBwYWlyIG9mIFttYXBdLlxuXG4gICAgICAgIFByZWNvbmRpdGlvbjogWzAgPD0gaSAmJiBpIDwgY2FyZGluYWwgbWFwXVxuICAgICopXG4gICAgdmFsIHBhaXI6IGludCAtPiAnYSB0IC0+IEtleS50ICogJ2FcblxuXG4gICAgKCoqIFtzaW5nbGV0b24ga2V5IHZhbHVlXSBUaGUgbWFwIHdpdGggdGhlIG9ubHkga2V5IHZhbHVlIHBhaXJcbiAgICAgICAgWyhrZXksdmFsdWUpXS4gKilcbiAgICB2YWwgc2luZ2xldG9uOiBLZXkudCAtPiAnYSAtPiAnYSB0XG5lbmRcbiIsImluY2x1ZGUgU3RkbGliLkFycmF5XG5cblxudHlwZSAnYSB0ID0gJ2EgYXJyYXlcblxubGV0IGlzX2VtcHR5ICh4czogJ2EgdCk6IGJvb2wgPVxuICAgIGxlbmd0aCB4cyA9IDBcblxuXG5sZXQgdmFsaWRfaW5kZXggKGk6IGludCkgKHhzOiAnYSB0KTogYm9vbCA9XG4gICAgMCA8PSBpICYmIGkgPCBsZW5ndGggeHNcblxuXG5sZXQgaGFzX3NvbWUgKHhzOiAnYSB0KTogYm9vbCA9XG4gICAgMCA8IGxlbmd0aCB4c1xuXG5cbmxldCBmaXJzdCAoeHM6ICdhIHQpOiAnYSA9XG4gICAgYXNzZXJ0IChoYXNfc29tZSB4cyk7XG4gICAgZ2V0IHhzIDBcblxuXG5sZXQgbGFzdCAoeHM6ICdhIHQpOiAndCA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGFzc2VydCAoMCA8IGxlbik7XG4gICAgZ2V0IHhzIChsZW4gLSAxKVxuXG5cblxubGV0IGZvbGRpX2xlZnQgKGY6ICdhIC0+IGludCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKHhzOiAnYiB0KTogJ2EgPVxuICAgIGZvbGRfbGVmdFxuICAgICAgICAoZnVuIChzdGFydCwgaWR4KSBlIC0+IGYgc3RhcnQgaWR4IGUsIGlkeCArIDEpXG4gICAgICAgIChzdGFydCwgMClcbiAgICAgICAgeHNcbiAgICB8PlxuICAgIGZzdFxuXG5cbmxldCBwdXNoICh4OiAnYSkgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgbGV0IHhzX25ldyA9IG1ha2UgKGxlbiArIDEpIHggaW5cbiAgICBibGl0IHhzIDAgeHNfbmV3IDAgbGVuO1xuICAgIHhzX25ld1xuXG5cbmxldCBwdXNoX2Zyb250ICh4OiAnYSkgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgbGV0IHhzX25ldyA9IG1ha2UgKGxlbiArIDEpIHggaW5cbiAgICBibGl0IHhzIDAgeHNfbmV3IDEgbGVuO1xuICAgIHhzX25ld1xuXG5cbmxldCBpbnNlcnQgKGk6IGludCkgKHg6ICdhKSAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICBhc3NlcnQgKGkgPD0gbGVuZ3RoIHhzKTtcbiAgICAoKiAwIDEgLi4uIChpLTEpICAgaSAuLi4gKGxlbi0xKVxuICAgICAgICAgICAgICAgICAgICAgXiBpbnNlcnQgaGVyZVxuICAgICopXG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGxldCBhcnIgPSBtYWtlIChsZW4gKyAxKSB4IGluXG4gICAgYmxpdCB4cyAwIGFyciAwIGk7XG4gICAgYmxpdCB4cyBpIGFyciAoaSArIDEpIChsZW4gLSBpKTtcbiAgICBhcnJcblxuXG5sZXQgcmVwbGFjZSAoaTogaW50KSAoeDogJ2EpICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgIGFzc2VydCAoaSA8IGxlbmd0aCB4cyk7XG4gICAgKCogMCAxIC4uLiBpIC4uLiAobGVuLTEpXG4gICAgICAgICAgICAgICBeIHJlcGxhY2VcbiAgICAqKVxuICAgIGxldCBhcnIgPSBjb3B5IHhzIGluXG4gICAgc2V0IGFyciBpIHg7XG4gICAgYXJyXG5cblxuXG5sZXQgcmVtb3ZlIChpOiBpbnQpICh4czogJ2EgYXJyYXkpOiAnYSBhcnJheSA9XG4gICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgIGFzc2VydCAoaSA8IGxlbmd0aCB4cyk7XG4gICAgKCogMCAxIC4uLiBpICAoaSArIDEpIC4uLiAobGVuLTEpXG4gICAgICAgICAgICAgICBeIHJlbW92ZVxuICAgICopXG4gICAgbGV0IGxlbiA9IGxlbmd0aCB4cyBpblxuICAgIGFzc2VydCAoMCA8IGxlbik7XG4gICAgbGV0IGFyciA9IG1ha2UgKGxlbiAtIDEpIChnZXQgeHMgMCkgaW5cbiAgICBibGl0IHhzIDAgYXJyIDAgaTtcbiAgICBibGl0IHhzIChpICsgMSkgYXJyIGkgKGxlbiAtIChpICsgMSkpO1xuICAgIGFyclxuXG5cbmxldCByZW1vdmVfZmlyc3QgKHhzOiAnYSBhcnJheSk6ICdhIGFycmF5ID1cbiAgICBsZXQgbGVuID0gbGVuZ3RoIHhzIGluXG4gICAgYXNzZXJ0ICgwIDwgbGVuKTtcbiAgICBzdWIgeHMgMSAobGVuIC0gMSlcblxuXG5cbmxldCByZW1vdmVfbGFzdCAoeHM6ICdhIGFycmF5KTogJ2EgYXJyYXkgPVxuICAgIGxldCBsZW4gPSBsZW5ndGggeHMgaW5cbiAgICBhc3NlcnQgKDAgPCBsZW4pO1xuICAgIHN1YiB4cyAwIChsZW4gLSAxKVxuXG5cblxubGV0IGZpbmQgKHA6ICdhIC0+IGJvb2wpIChhcnI6ICdhIGFycmF5KTogaW50IG9wdGlvbiA9XG4gICAgbGV0IGxlbiA9IGxlbmd0aCBhcnJcbiAgICBpblxuICAgIGxldCByZWMgZmluZF9mcm9tIGkgPVxuICAgICAgICBpZiBpID0gbGVuIHRoZW5cbiAgICAgICAgICAgIE5vbmVcbiAgICAgICAgZWxzZSBpZiBwIChnZXQgYXJyIGkpIHRoZW5cbiAgICAgICAgICAgIFNvbWUgaVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBmaW5kX2Zyb20gKGkgKyAxKVxuICAgIGluXG4gICAgZmluZF9mcm9tIDBcblxuXG5sZXQgYmluc2VhcmNoXG4gICAgICAgIChjb21wYXJlOiAna2V5IC0+ICdrZXkgLT4gaW50KVxuICAgICAgICAoa2V5X29mOiAnYSAtPiAna2V5KVxuICAgICAgICAoa2V5OiAna2V5KVxuICAgICAgICAoYXJyOiAnYSBhcnJheSlcbiAgICA6IGludCAqIGJvb2wgPVxuICAgICgqIFNlYXJjaCB0aGUgcG9zaXRpb24gb2YgW2tleV0gaW4gW2Fycl0gd2hpY2ggaXMgc29ydGVkIHdpdGhvdXRcbiAgICAgICBkdXBsaWNhdGVzLlxuXG4gICAgICAgIFJlc3VsdDogaSwgZXhhY3RfZmxhZyB3aXRoIFtrZXkgPD0gcHJvamVjdCBhcnIuKGkpXVxuXG4gICAgICAgIElmIFtleGFjdF9mbGFnXSBpcyBzZXQsIHRoZSBrZXkgaW4gcG9zaXRpb24gW2ldIGlzIGV4YWN0bHkgW2tleV0sXG4gICAgICAgIG90aGVyd2lzZSB0aGUga2V5IGluIHBvc2l0aW9uIFtpXSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gW2tleV0uXG5cbiAgICAgICAgQ29ybmVyIGNhc2U6IFtpID0gbGVuZ3RoIGFyciwgZXhhY3RfZmxhZyA9IGZhbHNlXS4gVGhpcyBjb3JyZXNwb25kcyB0byBhXG4gICAgICAgIGZpY3RpdGlvdXMga2V5IG9mIFsrIGluZmluaXR5XSBhdCBwb3NpdGlvbiBbbGVuZ3RoIGFycl0uXG5cbiAgICAgICAgUHJlY29uZGl0aW9uOlxuICAgICAgICAgICAgVGhlIGFycmF5IG11c3QgYmUgc29ydGVkIGFuZCBkb2VzIG5vdCBjb250YWluIGR1cGxpY2F0ZXMuXG4gICAgKilcbiAgICBsZXQgbGVuID0gbGVuZ3RoIGFyclxuICAgIGluXG4gICAgaWYgbGVuID0gMCB0aGVuXG4gICAgICAgIGxlbiwgZmFsc2VcbiAgICBlbHNlIGlmIGxlbiA9IDEgdGhlblxuICAgICAgICBsZXQgY21wID0gY29tcGFyZSBrZXkgKGdldCBhcnIgMCB8PiBrZXlfb2YpIGluXG4gICAgICAgIGlmIGNtcCA8PSAwIHRoZW5cbiAgICAgICAgICAgIDAsIGNtcCA9IDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGVuLCBmYWxzZVxuICAgIGVsc2VcbiAgICAgICAgbGV0IHJlYyBzZWFyY2ggbG93ZXIgdXBwZXIgPVxuICAgICAgICAgICAgKCogSW52YXJpYW50OlxuXG4gICAgICAgICAgICAgICAgMCA8PSBsb3dlciA8IHVwcGVyIDwgbGVuXG4gICAgICAgICAgICAgICAgYXJyLihsb3dlcikgPCBrZXkgPCBhcnIuKHVwcGVyKVxuICAgICAgICAgICAgKilcbiAgICAgICAgICAgIGlmIGxvd2VyICsgMSA9IHVwcGVyIHRoZW5cbiAgICAgICAgICAgICAgICB1cHBlciwgZmFsc2VcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsZXQgbWlkID0gbG93ZXIgKyAodXBwZXIgLSBsb3dlcikgLyAyIGluXG4gICAgICAgICAgICAgICAgYXNzZXJ0IChsb3dlciA8IG1pZCk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0IChtaWQgPCB1cHBlcik7XG4gICAgICAgICAgICAgICAgbGV0IGNtcCA9IGNvbXBhcmUga2V5IChnZXQgYXJyIG1pZCB8PiBrZXlfb2YpIGluXG4gICAgICAgICAgICAgICAgaWYgY21wID0gMCB0aGVuXG4gICAgICAgICAgICAgICAgICAgIG1pZCwgdHJ1ZVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgY21wIDwgMCB0aGVuXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaCBsb3dlciBtaWRcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaCBtaWQgdXBwZXJcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IGxvd2VyLCB1cHBlciA9IDAsIGxlbiAtIDEgaW5cbiAgICAgICAgbGV0IGNtcCA9IGNvbXBhcmUga2V5IChnZXQgYXJyIGxvd2VyIHw+IGtleV9vZikgaW5cbiAgICAgICAgaWYgY21wIDw9IDAgdGhlblxuICAgICAgICAgICAgKCoga2V5IGlzIGxlc3Mgb3IgZXF1YWwgdGhlIGZpcnN0IGVsZW1lbnQgKilcbiAgICAgICAgICAgIGxvd2VyLCBjbXAgPSAwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgICgqIGtleSBpcyBncmVhdGVyIHRoYW4gdGhlIGZpcnN0IGVsZW1lbnQgKilcbiAgICAgICAgICAgIGxldCBjbXAgPSBjb21wYXJlIGtleSAoZ2V0IGFyciB1cHBlciB8PiBrZXlfb2YpIGluXG4gICAgICAgICAgICBpZiBjbXAgPCAwIHRoZW5cbiAgICAgICAgICAgICAgICAoKiBpbnZhcmlhbnQgZm9yIFtzZWFyY2hdIHNhdGlzZmllZC4gKilcbiAgICAgICAgICAgICAgICBzZWFyY2ggbG93ZXIgdXBwZXJcbiAgICAgICAgICAgIGVsc2UgaWYgY21wID0gMCB0aGVuXG4gICAgICAgICAgICAgICAgKCogZXhhY3QgbWF0Y2ggd2l0aCB0aGUgbGFzdCBlbGVtZW50ICopXG4gICAgICAgICAgICAgICAgdXBwZXIsIHRydWVcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAoKiBrZXkgaXMgZ3JlYXRlciB0aGFuIGFsbCBlbGVtZW50cyAqKVxuICAgICAgICAgICAgICAgIGxlbiwgZmFsc2VcblxuXG5cblxuXG5cbm1vZHVsZSBNYXAgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgdHlwZSBrZXkgPSBLZXkudFxuXG4gICAgdHlwZSAnYSB0ID0gKEtleS50ICogJ2EpIGFycmF5XG5cblxuICAgIGxldCBjYXJkaW5hbCAobWFwOiAnYSB0KTogaW50ID1cbiAgICAgICAgbGVuZ3RoIG1hcFxuXG5cbiAgICBsZXQgaXNfZW1wdHkgKG1hcDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICBjYXJkaW5hbCBtYXAgPSAwXG5cblxuICAgIGxldCBiaW5kaW5ncyAobWFwOiAnYSB0KTogKEtleS50ICogJ2EpIGxpc3QgPVxuICAgICAgICB0b19saXN0IG1hcFxuXG5cbiAgICBsZXQgZm9sZF9sZWZ0IChmOiAnYSAtPiBLZXkudCAtPiAnYiAtPiAnYSkgKHN0YXJ0OiAnYSkgKG1hcDogJ2IgdCk6ICdhID1cbiAgICAgICAgU3RkbGliLkFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biBhIChrZXksIHZhbHVlKSAtPiBmIGEga2V5IHZhbHVlKVxuICAgICAgICAgICAgc3RhcnRcbiAgICAgICAgICAgIG1hcFxuXG4gICAgbGV0IGZvbGRfcmlnaHQgKGY6ICdhIC0+IEtleS50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAobWFwOiAnYiB0KSA9XG4gICAgICAgIFN0ZGxpYi5BcnJheS5mb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIChrZXksIHZhbHVlKSByZXN1bHQgLT4gZiByZXN1bHQga2V5IHZhbHVlKVxuICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICBzdGFydFxuXG5cbiAgICBsZXQgaW5kZXhfb2YgKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiBpbnQgb3B0aW9uID1cbiAgICAgICAgbGV0IGxlbiA9IGxlbmd0aCBtYXAgaW5cbiAgICAgICAgbGV0IGksIGV4YWN0ID0gYmluc2VhcmNoIEtleS5jb21wYXJlIGZzdCBrZXkgbWFwIGluXG4gICAgICAgIGlmIGkgPSBsZW4gfHwgbm90IGV4YWN0IHRoZW5cbiAgICAgICAgICAgIE5vbmVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgU29tZSBpXG5cbiAgICBsZXQgcGFpciAoaTogaW50KSAobWFwOiAnYSB0KTogS2V5LnQgKiAnYSA9XG4gICAgICAgIGFzc2VydCAoaSA8IGNhcmRpbmFsIG1hcCk7XG4gICAgICAgIGdldCBtYXAgaVxuXG5cbiAgICBsZXQgZmluZF9vcHQgKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiAnYSBvcHRpb24gPVxuICAgICAgICBPcHRpb24ubWFwXG4gICAgICAgICAgICAoZnVuIGkgLT4gc25kIChnZXQgbWFwIGkpKVxuICAgICAgICAgICAgKGluZGV4X29mIGtleSBtYXApXG5cblxuICAgIGxldCBtZW0gKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiBib29sID1cbiAgICAgICAgaW5kZXhfb2Yga2V5IG1hcCA8PiBOb25lXG5cblxuICAgIGxldCBlbXB0eTogJ2EgdCA9XG4gICAgICAgIFt8fF1cblxuXG4gICAgbGV0IHNpbmdsZXRvbiAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSk6ICdhIHQgPVxuICAgICAgICBbfCBrZXksIHZhbHVlIHxdXG5cblxuXG4gICAgbGV0IGFkZCAoa2V5OiBLZXkudCkgKHZhbHVlOiAnYSkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBsZXQgaSxleGFjdCA9IGJpbnNlYXJjaCBLZXkuY29tcGFyZSBmc3Qga2V5IG1hcCBpblxuICAgICAgICBpZiBleGFjdCB0aGVuXG4gICAgICAgICAgICByZXBsYWNlIGkgKGtleSwgdmFsdWUpIG1hcFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBpbnNlcnQgaSAoa2V5LCB2YWx1ZSkgbWFwXG5cblxuXG4gICAgbGV0IHVwZGF0ZSAoa2V5OiBLZXkudCkgKGY6ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbGV0IGksIGV4YWN0ID0gYmluc2VhcmNoIEtleS5jb21wYXJlIGZzdCBrZXkgbWFwIGluXG4gICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgIG1hdGNoIGYgKFNvbWUgKGdldCBtYXAgaSB8PiBzbmQpKSB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICByZW1vdmUgaSBtYXBcbiAgICAgICAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgIHJlcGxhY2UgaSAoa2V5LCB2YWx1ZSkgbWFwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hdGNoIGYgTm9uZSB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBtYXBcbiAgICAgICAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgIGluc2VydCBpIChrZXksIHZhbHVlKSBtYXBcblxuXG4gICAgbGV0IHJlbW92ZSAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBsZXQgaSwgZXhhY3QgPSBiaW5zZWFyY2ggS2V5LmNvbXBhcmUgZnN0IGtleSBtYXAgaW5cbiAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgcmVtb3ZlIGkgbWFwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIG1hcFxuZW5kXG5cblxuXG5cblxubW9kdWxlIFNldCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICBtb2R1bGUgTSA9ICBNYXAgKEtleSlcblxuICAgIHR5cGUgaXRlbSA9IEtleS50XG5cbiAgICB0eXBlIHQgPSB1bml0IE0udFxuXG4gICAgbGV0IGNhcmRpbmFsIChzZXQ6IHQpOiBpbnQgPVxuICAgICAgICBNLmNhcmRpbmFsIHNldFxuXG5cbiAgICBsZXQgaXNfZW1wdHkgPSBNLmlzX2VtcHR5XG5cblxuICAgIGxldCBmb2xkX2xlZnQgKGY6ICdhIC0+IEtleS50IC0+ICdhKSAoc3RhcnQ6ICdhKSAoc2V0OiB0KTogJ2EgPVxuICAgICAgICBNLmZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biByZXMga2V5IF8gLT4gZiByZXMga2V5KVxuICAgICAgICAgICAgc3RhcnRcbiAgICAgICAgICAgIHNldFxuXG5cbiAgICBsZXQgZm9sZF9yaWdodCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2EpIChzdGFydDogJ2EpIChzZXQ6IHQpOiAnYSA9XG4gICAgICAgIE0uZm9sZF9yaWdodFxuICAgICAgICAgICAgKGZ1biByZXMga2V5IF8gLT4gZiByZXMga2V5KVxuICAgICAgICAgICAgc3RhcnRcbiAgICAgICAgICAgIHNldFxuXG5cbiAgICBsZXQgZWxlbWVudHMgKHNldDogdCk6IEtleS50IGxpc3QgPVxuICAgICAgICBmb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIGxzdCBrZXkgLT4ga2V5IDo6IGxzdClcbiAgICAgICAgICAgIFtdXG4gICAgICAgICAgICBzZXRcblxuXG4gICAgbGV0IGVsZW1lbnQgKGk6IGludCkgKHNldDogdCk6IEtleS50ID1cbiAgICAgICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgICAgICBhc3NlcnQgKGkgPCBjYXJkaW5hbCBzZXQpO1xuICAgICAgICBNLnBhaXIgaSBzZXQgfD4gZnN0XG5cblxuICAgIGxldCBpbmRleF9vZiA9IE0uaW5kZXhfb2ZcblxuXG4gICAgbGV0IGVtcHR5ID0gTS5lbXB0eVxuXG5cbiAgICBsZXQgc2luZ2xldG9uIChlOiBLZXkudCk6IHQgPVxuICAgICAgICBNLnNpbmdsZXRvbiBlICgpXG5cblxuICAgIGxldCBtZW0gPSBNLm1lbVxuXG5cbiAgICBsZXQgYWRkIChlOiBLZXkudCkgKHNldDogdCk6IHQgPVxuICAgICAgICBNLmFkZCBlICgpIHNldFxuXG5cbiAgICBsZXQgcmVtb3ZlID0gTS5yZW1vdmVcbmVuZFxuXG5cblxuXG5cblxuXG5cblxuXG4oKiBVbml0IFRlc3RzXG4gKiA9PT09PT09PT09XG4gKilcblxuXG4oKiBCaW5hcnkgc2VhcmNoICopXG5sZXQldGVzdCBfID1cbiAgICBiaW5zZWFyY2ggSW50LmNvbXBhcmUgRnVuLmlkIDEwMCBbfHxdID0gKDAsIGZhbHNlKVxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgYmluc2VhcmNoIEludC5jb21wYXJlIEZ1bi5pZCA5OSBbfDEwMHxdID0gKDAsIGZhbHNlKVxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgYmluc2VhcmNoIEludC5jb21wYXJlIEZ1bi5pZCAxMDAgW3wxMDB8XSA9ICgwLCB0cnVlKVxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgYmluc2VhcmNoIEludC5jb21wYXJlIEZ1bi5pZCAxMDEgW3wxMDB8XSA9ICgxLCBmYWxzZSlcblxuXG5cblxuXG4oKiBTZXQgKilcbm1vZHVsZSBTZXRJbnQgPSBTZXQgKEludClcblxubGV0IGluc2VydF9kb3dud2FyZCAobG93ZXI6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiBTZXRJbnQudCk6IFNldEludC50ID1cbiAgICBsZXQgcmVjIGluc2VydCBpIHNldCA9XG4gICAgICAgIGlmIGkgPSBsb3dlciB0aGVuXG4gICAgICAgICAgICBzZXRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbGV0IGkgPSBpIC0gMSBpblxuICAgICAgICAgICAgaW5zZXJ0IGkgKFNldEludC5hZGQgaSBzZXQpXG4gICAgaW5cbiAgICBpbnNlcnQgYmV5b25kIHNldFxuXG5sZXQgaW5zZXJ0X3Vwd2FyZCAobG93ZXI6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiBTZXRJbnQudCk6IFNldEludC50ID1cbiAgICBsZXQgcmVjIGluc2VydCBpIHNldCA9XG4gICAgICAgIGlmIGkgPSBiZXlvbmQgdGhlblxuICAgICAgICAgICAgc2V0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGluc2VydCAoaSArIDEpIChTZXRJbnQuYWRkIGkgc2V0KVxuICAgIGluXG4gICAgaW5zZXJ0IGxvd2VyIHNldFxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgaW5zZXJ0X3Vwd2FyZCAwIDMgU2V0SW50LmVtcHR5ID0gW3wwLCgpOyAxLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICBpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSA9IFt8MCwoKTsgMSwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgaW5zZXJ0X2Rvd253YXJkIDAgMyBTZXRJbnQuZW1wdHkgfD4gU2V0SW50LnJlbW92ZSAxID0gW3wwLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICBpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSAgfD4gU2V0SW50LnJlbW92ZSA0ID0gW3wwLCgpOyAxLCgpOyAyLCgpfF1cblxuXG5sZXQldGVzdCBfID1cbiAgICAoaW5zZXJ0X3Vwd2FyZCAwIDMgU2V0SW50LmVtcHR5IHw+IGluc2VydF9kb3dud2FyZCAwIDMpXG4gICAgPVxuICAgIFt8MCwoKTsgMSwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgKGluc2VydF91cHdhcmQgMCAzIFNldEludC5lbXB0eSB8PiBpbnNlcnRfZG93bndhcmQgMyA2KVxuICAgID1cbiAgICBbfDAsKCk7IDEsKCk7IDIsKCk7IDMsKCk7IDQsKCk7IDUsKCl8XVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIChpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSB8PiBTZXRJbnQucmVtb3ZlIDApXG4gICAgPVxuICAgIFt8MSwoKTsgMiwoKXxdXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IGluc2VydF9kb3dud2FyZCAwIDMgU2V0SW50LmVtcHR5IGluXG4gICAgU2V0SW50LmluZGV4X29mIDMgc2V0ID0gTm9uZVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBpbnNlcnRfZG93bndhcmQgMCAzIFNldEludC5lbXB0eSBpblxuICAgIFNldEludC5pbmRleF9vZiAwIHNldCA9IFNvbWUgMFxuIiwibW9kdWxlIHR5cGUgQklUU0laRSA9XG5zaWdcbiAgICB2YWwgYml0c2l6ZTogaW50XG5lbmRcblxuXG5cblxubW9kdWxlIE1ha2UgKEJpdHNpemU6IEJJVFNJWkUpID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgQml0c2l6ZVxuXG4gICAgbGV0IGJyYW5jaGluZzogaW50ID1cbiAgICAgICAgYXNzZXJ0ICgwIDwgYml0c2l6ZSk7XG4gICAgICAgIDEgbHNsIGJpdHNpemVcblxuXG4gICAgbGV0IHNsb3QgKGk6IGludCkgKGw6IGludCk6IGludCA9XG4gICAgICAgICgqIFRoZSBzbG90IG9mIGluZGV4IFtpXSBhdCBsZXZlbCBbbF0uXG5cbiAgICAgICAgICAgIGkvIDJeKGwgKiBiaXRzaXplKVxuICAgICAgICAgKilcbiAgICAgICAgaSBsc3IgKGwgKiBiaXRzaXplKVxuXG5cbiAgICBsZXQgb2Zmc2V0IChpOiBpbnQpIChzOiBpbnQpIChsOiBpbnQpOiBpbnQgPVxuICAgICAgICAoKiBUaGUgb2Zmc2V0IG9mIGluZGV4IFtpXSBpbiBzbG90IFtzXSBpbiBhIHRyZWUgYXQgbGV2ZWwgW2xdLlxuXG4gICAgICAgICAgICBpLSBzICogMl4obCAqIGJpdHNpemUpXG4gICAgICAgICAqKVxuICAgICAgICBpIC0gcyBsc2wgKGwgKiBiaXRzaXplKVxuXG5cbiAgICBsZXQgZnVsbF9zaXplIChsOiBpbnQpOiBpbnQgPVxuICAgICAgICAoKiBUaGUgc2l6ZSBvZiBhIGZ1bGwgcmFkaXggYmFsYW5jZWQgYXJyYXkgYXQgbGV2ZWwgW2xdLiAqKVxuICAgICAgICBhc3NlcnQgKDAgPD0gbCk7XG4gICAgICAgIDEgbHNsICgobCArIDEpICogYml0c2l6ZSlcblxuXG4gICAgdHlwZSAnYSB0ID1cbiAgICAgICAgfCBMZWFmIG9mXG4gICAgICAgICAgICAnYSBhcnJheVxuICAgICAgICB8IE5vZGUgb2Yge1xuICAgICAgICAgICAgc2l6ZTogIGludDtcbiAgICAgICAgICAgIGxldmVsOiBpbnQ7XG4gICAgICAgICAgICBub2RlczogJ2EgdCBhcnJheX1cblxuXG4gICAgbGV0IGxldmVsOiAnYSB0IC0+IGludCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgTGVhZiBfIC0+XG4gICAgICAgICAgICAwXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBub2RlLmxldmVsXG5cblxuICAgIGxldCBpc19mdWxsOiAnYSB0IC0+IGJvb2wgPSBmdW5jdGlvblxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBBcnJheS5sZW5ndGggYXJyID0gZnVsbF9zaXplIDBcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIG5vZGUuc2l6ZSA9IGZ1bGxfc2l6ZSBub2RlLmxldmVsXG5cblxuICAgIGxldCBsZW5ndGg6ICdhIHQgLT4gaW50ID1cbiAgICAgICAgKCogVGhlIGxlbmd0aCBvZiB0aGUgcmFkaXggYmFsYW5jZWQgYXJyYXkuICopXG4gICAgICAgIGZ1bmN0aW9uXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIEFycmF5Lmxlbmd0aCBhcnJcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIG5vZGUuc2l6ZVxuXG5cbiAgICBsZXQgaGFzX3NvbWUgKHQ6ICdhIHQpOiBib29sID1cbiAgICAgICAgMCA8IGxlbmd0aCB0XG5cblxuICAgIGxldCBpc19lbXB0eSAodDogJ2EgdCk6IGJvb2wgPVxuICAgICAgICAwID0gbGVuZ3RoIHRcblxuXG5cbiAgICBsZXQgY2hlY2tfaW52YXJpYW50ICh0OiAnYSB0KTogIGJvb2wgPVxuICAgICAgICBsZXQgcmVjIGNoZWNrIGlzX3Jvb3QgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggYXJyIGluXG4gICAgICAgICAgICAgICAgbGVuIDw9IGJyYW5jaGluZ1xuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgKGlzX3Jvb3QgfHwgMCA8IGxlbilcbiAgICAgICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICAgICAgbGV0IG5jaGlsZHJlbiA9IEFycmF5Lmxlbmd0aCBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBBcnJheS5mb3JfYWxsIChjaGVjayBmYWxzZSkgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuZm9yX2FsbFxuICAgICAgICAgICAgICAgICAgICAoZnVuIGNoaWxkIC0+IGxldmVsIGNoaWxkICsgMSA9IG5vZGUubGV2ZWwpXG4gICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIG5jaGlsZHJlbiA8PSBicmFuY2hpbmdcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIDEgPD0gbmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICAobm90IGlzX3Jvb3QgfHwgMiA8PSBuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgJiZcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2l6ZVxuICAgICAgICAgICAgICAgICAgICA9XG4gICAgICAgICAgICAgICAgICAgIEFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgKGZ1biBzaXplIGNoaWxkIC0+IHNpemUgKyBsZW5ndGggY2hpbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICBpblxuICAgICAgICBjaGVjayB0cnVlIHRcblxuXG4gICAgbGV0IGVtcHR5OiAnYSB0ID1cbiAgICAgICAgTGVhZiBbfCB8XVxuXG5cblxuICAgICgqIEZvbGRpbmdcbiAgICAgKilcblxuICAgIGxldCBmb2xkX2xlZnQgKGY6ICdhIC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAodDogJ2IgdCk6ICdhID1cbiAgICAgICAgbGV0IHJlYyBmb2xkIHN0YXJ0ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5mb2xkX2xlZnQgZiBzdGFydCBhcnJcbiAgICAgICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICAgICAgQXJyYXkuZm9sZF9sZWZ0IGZvbGQgc3RhcnQgbm9kZS5ub2Rlc1xuICAgICAgICBpblxuICAgICAgICBmb2xkIHN0YXJ0IHRcblxuXG5cbiAgICBsZXQgZm9sZGlfbGVmdCAoZjogJ2EgLT4gaW50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAodDogJ2IgdCk6ICdhID1cbiAgICAgICAgZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIChzdGFydCxpZHgpIGUgLT4gZiBzdGFydCBpZHggZSwgKGlkeCArIDEpKVxuICAgICAgICAgICAgKHN0YXJ0LCAwKVxuICAgICAgICAgICAgdFxuICAgICAgICB8PlxuICAgICAgICBmc3RcblxuXG5cbiAgICAoKiBFbGVtZW50IFJldHJpZXZhbFxuICAgICAqKVxuXG4gICAgbGV0IHJlYyBlbGVtZW50IChpOiBpbnQpICh0OiAnYSB0KTogJ2EgPVxuICAgICAgICAoKiBUaGUgZWxlbWVudCBhdCBpbmRleCBbaV0gaW4gdGhlIHJhZGl4IGJhbGFuY2VkIGFycmF5IFt0XS4gKilcbiAgICAgICAgYXNzZXJ0ICgwIDw9IGkpO1xuICAgICAgICBhc3NlcnQgKGkgPCBsZW5ndGggdCk7XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBhcnIuKGkpXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBsZXQgcyA9IHNsb3QgaSBub2RlLmxldmVsIGluXG4gICAgICAgICAgICBsZXQgbyA9IG9mZnNldCBpIHMgbm9kZS5sZXZlbCBpblxuICAgICAgICAgICAgZWxlbWVudCBvIG5vZGUubm9kZXMuKHMpXG5cblxuICAgIGxldCBmaXJzdCAodDogJ2EgdCk6ICdhID1cbiAgICAgICAgKCogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIG5vbiBlbXB0eSByYWRpeCBiYWxhbmNlZCBhcnJheSBbdF0uICopXG4gICAgICAgIGFzc2VydCAoaGFzX3NvbWUgdCk7XG4gICAgICAgIGxldCByZWMgZnN0ID0gZnVuY3Rpb25cbiAgICAgICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgICAgICBBcnJheS5maXJzdCBhcnJcbiAgICAgICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICAgICAgZnN0IChBcnJheS5maXJzdCBub2RlLm5vZGVzKVxuICAgICAgICBpblxuICAgICAgICBmc3QgdFxuXG5cbiAgICBsZXQgbGFzdCAodDogJ2EgdCk6ICdhID1cbiAgICAgICAgKCogVGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgbm9uIGVtcHR5IHJhZGl4IGJhbGFuY2VkIGFycmF5IFt0XS4gKilcbiAgICAgICAgYXNzZXJ0IChoYXNfc29tZSB0KTtcbiAgICAgICAgbGV0IHJlYyBmc3QgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgICAgIEFycmF5Lmxhc3QgYXJyXG4gICAgICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgICAgIGZzdCAoQXJyYXkubGFzdCBub2RlLm5vZGVzKVxuICAgICAgICBpblxuICAgICAgICBmc3QgdFxuXG5cblxuICAgICgqIEVsZW1lbnQgUmVwbGFjZW1lbnRcbiAgICAgKilcblxuXG4gICAgbGV0IHJlYyByZXBsYWNlIChpOiBpbnQpIChlOiAnYSkgKHQ6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgKCogUmVwbGFjZSB0aGUgZWxlbWVudCBhdCBpbmRleCBbaV0gYnkgdGhlIGVsZW1lbnQgW2VdIHdpdGhpbiB0aGUgcmFkaXhcbiAgICAgICAgICAgYmFsYW5jZWQgYXJyYXkgW3RdLiAqKVxuICAgICAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgICAgIGFzc2VydCAoaSA8IGxlbmd0aCB0KTtcbiAgICAgICAgbWF0Y2ggdCB3aXRoXG4gICAgICAgIHwgTGVhZiBhcnIgLT5cbiAgICAgICAgICAgIExlYWYgKEFycmF5LnJlcGxhY2UgaSBlIGFycilcbiAgICAgICAgfCBOb2RlIG5vZGUgLT5cbiAgICAgICAgICAgIGxldCBzID0gc2xvdCBpIG5vZGUubGV2ZWwgaW5cbiAgICAgICAgICAgIGxldCBvID0gb2Zmc2V0IGkgcyBub2RlLmxldmVsIGluXG4gICAgICAgICAgICBOb2RlXG4gICAgICAgICAgICAgICAge25vZGUgd2l0aFxuICAgICAgICAgICAgICAgICAgICBub2RlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5yZXBsYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBsYWNlIG8gZSBub2RlLm5vZGVzLihzKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVzXG4gICAgICAgICAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICgqIEVsZW1lbnQgSW5zZXJ0aW9uIGF0IHRoZSBSZWFyIEVuZFxuICAgICAqKVxuXG4gICAgbGV0IHJlYyBzaW5nbGV0b25fdHJlZSAobGV2OiBpbnQpIChlOiAnYSk6ICdhIHQgPVxuICAgICAgICAoKiBDb25zdHJ1Y3QgdHJlZSBhdCBsZXZlbCBbbGV2XSB3aXRoIHRoZSBlbGVtZW50IFtlXS4gKilcbiAgICAgICAgaWYgbGV2ID0gMCB0aGVuXG4gICAgICAgICAgICBMZWFmIFt8IGUgfF1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9kZSB7XG4gICAgICAgICAgICAgICAgc2l6ZSA9IDE7XG4gICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXY7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbfCBzaW5nbGV0b25fdHJlZSAobGV2IC0gMSkgZSB8XVxuICAgICAgICAgICAgfVxuXG5cbiAgICBsZXQgcmVjIHB1c2hfbm90X2Z1bGwgKGU6ICdhKSAodDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICAoKiBBcHBlbmQgdGhlIGVsZW1lbnQgW2VdIGF0IHRoZSByZWFyIGVuZCBvZiB0aGUgcmFkaXggYmFsYW5jZWQgYXJyYXlcbiAgICAgICAgICAgW3RdIHdoaWNoIGlzIG5vdCBmdWxsLiAqKVxuICAgICAgICBhc3NlcnQgKG5vdCAoaXNfZnVsbCB0KSk7XG4gICAgICAgIG1hdGNoIHQgd2l0aFxuICAgICAgICB8IExlYWYgYXJyIC0+XG4gICAgICAgICAgICBMZWFmIChBcnJheS5wdXNoIGUgYXJyKVxuXG4gICAgICAgIHwgTm9kZSBub2RlIC0+XG4gICAgICAgICAgICBsZXQgc2xvdCA9IEFycmF5Lmxlbmd0aCBub2RlLm5vZGVzIC0gMSBpblxuICAgICAgICAgICAgYXNzZXJ0ICgwIDw9IHNsb3QpO1xuICAgICAgICAgICAgbGV0IG5vZGVzID1cbiAgICAgICAgICAgICAgICBpZiBpc19mdWxsIG5vZGUubm9kZXMuKHNsb3QpIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgQXJyYXkucHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZXRvbl90cmVlIChub2RlLmxldmVsIC0gMSkgZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZXNcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIEFycmF5LnJlcGxhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RcbiAgICAgICAgICAgICAgICAgICAgICAgIChwdXNoX25vdF9mdWxsIGUgbm9kZS5ub2Rlcy4oc2xvdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVzXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgTm9kZVxuICAgICAgICAgICAgICAgIHtub2RlIHdpdGggbm9kZXM7IHNpemUgPSBub2RlLnNpemUgKyAxfVxuXG5cbiAgICBsZXQgcHVzaCAoZTogJ2EpICh0OiAnYSB0KTogJ2EgdCA9XG4gICAgICAgICgqIEFwcGVuZCB0aGUgZWxlbWVudCBbZV0gYXQgdGhlIHJlYXIgZW5kIG9mIHRoZSByYWRpeCBiYWxhbmNlZCBhcnJheVxuICAgICAgICAgICBbdF0uICopXG4gICAgICAgIGxldCBsZXYgPSBsZXZlbCB0XG4gICAgICAgIGFuZCBsZW4gPSBsZW5ndGggdFxuICAgICAgICBpblxuICAgICAgICBpZiBsZW4gPSBmdWxsX3NpemUgbGV2IHRoZW5cbiAgICAgICAgICAgIE5vZGUge1xuICAgICAgICAgICAgICAgIHNpemUgID0gbGVuICsgMTtcbiAgICAgICAgICAgICAgICBsZXZlbCA9IGxldiArIDE7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbfCB0OyBzaW5nbGV0b25fdHJlZSBsZXYgZXxdXG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHB1c2hfbm90X2Z1bGwgZSB0XG5cblxuXG5cblxuXG5cbiAgICAoKiBFbGVtZW50IFJlbW92YWwgZnJvbSB0aGUgUmVhciBFbmRcbiAgICAgKilcblxuXG4gICAgbGV0IHJlYyBwb3BfYXV4IChpc19yb290OiBib29sKSAodDogJ2EgdCk6ICdhICogJ2EgdCA9XG4gICAgICAgICgqIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gYSBub25lbXB0eSB0cmVlLiAqKVxuICAgICAgICBhc3NlcnQgKGhhc19zb21lIHQpO1xuICAgICAgICBtYXRjaCB0IHdpdGhcbiAgICAgICAgfCBMZWFmIGFyciAtPlxuICAgICAgICAgICAgQXJyYXkuKGxhc3QgYXJyLCBMZWFmIChyZW1vdmVfbGFzdCBhcnIpKVxuICAgICAgICB8IE5vZGUgbm9kZSAtPlxuICAgICAgICAgICAgbGV0IGogPSBBcnJheS5sZW5ndGggbm9kZS5ub2RlcyAtIDEgaW5cbiAgICAgICAgICAgIGFzc2VydCAoMCA8PSBqKTtcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IG5vZGUubm9kZXMuKGopIGluXG4gICAgICAgICAgICBsZXQgbGVuICAgPSBsZW5ndGggY2hpbGQgaW5cbiAgICAgICAgICAgIGlmIGlzX3Jvb3QgJiYgaiA9IDEgJiYgbGVuID0gMSB0aGVuXG4gICAgICAgICAgICAgICAgKCogTGFzdCBjaGlsZCBvZiB0aGUgcm9vdCBub2RlIGhhcyBvbmx5IG9uZSBlbGVtZW50LiAqKVxuICAgICAgICAgICAgICAgIGxhc3QgY2hpbGQsXG4gICAgICAgICAgICAgICAgbm9kZS5ub2Rlcy4oMClcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsZXQgZSwgbm9kZXMgPVxuICAgICAgICAgICAgICAgICAgICBpZiBsZW4gPSAxIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICgqIExhc3QgY2hpbGQgaGFzIG9ubHkgb25lIGVsZW1lbnQuICopXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0IGNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucmVtb3ZlX2xhc3Qgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAoKiBOb3JtYWwgY2FzZS4gKilcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlLCBjaGlsZCA9IHBvcF9hdXggZmFsc2UgY2hpbGQgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5yZXBsYWNlIGogY2hpbGQgbm9kZS5ub2Rlc1xuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICAgICBOb2RlIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZSB3aXRoXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBub2RlLnNpemUgLSAxO1xuICAgICAgICAgICAgICAgICAgICBub2Rlc1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgbGV0IHBvcCAodDogJ2EgdCk6ICdhICogJ2EgdCA9XG4gICAgICAgIGFzc2VydCAoaGFzX3NvbWUgdCk7XG4gICAgICAgIHBvcF9hdXggdHJ1ZSB0XG5cblxuICAgIGxldCBwb3Bfb3B0ICh0OiAnYSB0KTogKCdhICogJ2EgdCkgb3B0aW9uID1cbiAgICAgICAgaWYgaXNfZW1wdHkgdCB0aGVuXG4gICAgICAgICAgICBOb25lXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIFNvbWUgKHBvcF9hdXggdHJ1ZSB0KVxuZW5kXG5cblxuXG5cbm1vZHVsZSBCcmFuY2hpbmcyOiBCSVRTSVpFID1cbnN0cnVjdFxuICAgIGxldCBiaXRzaXplOiBpbnQgPSAxXG5lbmRcblxuXG5tb2R1bGUgQnJhbmNoaW5nMzI6IEJJVFNJWkUgPVxuc3RydWN0XG4gICAgbGV0IGJpdHNpemU6IGludCA9IDVcbmVuZFxuXG5cblxuaW5jbHVkZSBNYWtlIChCcmFuY2hpbmczMilcblxuXG5cblxuXG5cblxuKCogVW5pdCBUZXN0c1xuICogKioqKioqKioqKlxuICopXG5tb2R1bGUgUmIgPSBNYWtlIChCcmFuY2hpbmcyKVxuXG5cbmxldCBmaWxsIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpOiBpbnQgUmIudCA9XG4gICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgIGxldCByZWMgZmwgc3RhcnQgdCA9XG4gICAgICAgIGlmIHN0YXJ0ID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgIHRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZmwgKHN0YXJ0ICsgMSkgKFJiLnB1c2ggc3RhcnQgdClcbiAgICBpblxuICAgIGZsIHN0YXJ0IFJiLmVtcHR5XG5cblxubGV0IGNoZWNrX2ZpbGwgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCk6IGJvb2wgPVxuICAgIGxldCByZWMgY2hlY2sgc3RhcnQgdCA9XG4gICAgICAgIGlmIHN0YXJ0ID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgIFJiLmNoZWNrX2ludmFyaWFudCB0XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIFJiLmNoZWNrX2ludmFyaWFudCB0XG4gICAgICAgICAgICAmJlxuICAgICAgICAgICAgY2hlY2sgKHN0YXJ0ICsgMSkgKFJiLnB1c2ggc3RhcnQgdClcbiAgICBpblxuICAgIGNoZWNrIHN0YXJ0IFJiLmVtcHR5XG5cblxubGV0IGNoZWNrX2ZvbGQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHQ6IGludCBSYi50KTogYm9vbCA9XG4gICAgc3RhcnQgKyBSYi5sZW5ndGggdCA9IGJleW9uZFxuICAgICYmXG4gICAgUmIuZm9sZGlfbGVmdFxuICAgICAgICAoZnVuIG9rIGlkeCBlIC0+XG4gICAgICAgICAgICAgb2sgJiYgZSA9IHN0YXJ0ICsgaWR4KVxuICAgICAgICB0cnVlXG4gICAgICAgIHRcblxuXG5sZXQgY2hlY2tfZWxlbWVudCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAodDogaW50IFJiLnQpOiBib29sID1cbiAgICBsZXQgcmVjIGNoZWNrX2Zyb20gaSBzdGFydCA9XG4gICAgICAgIGlmIHN0YXJ0ID0gYmV5b25kIHRoZW5cbiAgICAgICAgICAgIHRydWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3RhcnQgPSBSYi5lbGVtZW50IGkgdFxuICAgICAgICAgICAgJiZcbiAgICAgICAgICAgIGNoZWNrX2Zyb20gKGkgKyAxKSAoc3RhcnQgKyAxKVxuICAgIGluXG4gICAgY2hlY2tfZnJvbSAwIHN0YXJ0XG5cblxuXG5sZXQgY2hlY2tfcG9wIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpICh0OiBpbnQgUmIudCk6IGJvb2wgPVxuICAgIGxldCByZWMgY2hlY2sgYmV5b25kIHQgPVxuICAgICAgICBSYi5jaGVja19pbnZhcmlhbnQgdFxuICAgICAgICAmJlxuICAgICAgICAoXG4gICAgICAgICAgICBpZiBiZXlvbmQgPSBzdGFydCB0aGVuXG4gICAgICAgICAgICAgICAgUmIuaXNfZW1wdHkgdFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIFJiLmhhc19zb21lIHRcbiAgICAgICAgICAgICAgICAmJlxuICAgICAgICAgICAgICAgIGxldCBlLCB0ID0gUmIucG9wIHQgaW5cbiAgICAgICAgICAgICAgICBlICsgMSA9IGJleW9uZFxuICAgICAgICAgICAgICAgICYmXG4gICAgICAgICAgICAgICAgY2hlY2sgKGJleW9uZCAtIDEpIHRcbiAgICAgICAgKVxuICAgIGluXG4gICAgY2hlY2sgYmV5b25kIHRcblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzdGFydCA9IDEwXG4gICAgYW5kIGJleW9uZCA9IDEwMFxuICAgIGluXG4gICAgY2hlY2tfZmlsbCBzdGFydCBiZXlvbmRcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc3RhcnQgPSAxMFxuICAgIGFuZCBiZXlvbmQgPSAxMDBcbiAgICBpblxuICAgIGNoZWNrX2ZvbGQgc3RhcnQgYmV5b25kIChmaWxsIHN0YXJ0IGJleW9uZClcblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgc3RhcnQgPSAxMFxuICAgIGFuZCBiZXlvbmQgPSAxMDBcbiAgICBpblxuICAgIGNoZWNrX3BvcCBzdGFydCBiZXlvbmQgKGZpbGwgc3RhcnQgYmV5b25kKVxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHN0YXJ0ID0gMTBcbiAgICBhbmQgYmV5b25kID0gMTAwXG4gICAgaW5cbiAgICBjaGVja19lbGVtZW50IHN0YXJ0IGJleW9uZCAoZmlsbCBzdGFydCBiZXlvbmQpXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBSYi4oY2hlY2tfaW52YXJpYW50IGVtcHR5KVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIFJiLmNoZWNrX2ludmFyaWFudCAoZmlsbCAwIDI1KVxuIiwiaW5jbHVkZSBTdGRsaWIuTGlzdFxuaW5jbHVkZSBJbnRlcmZhY2VzXG5cbnR5cGUgJ2EgdCA9ICdhIGxpc3RcblxubGV0IHJldHVybiAoYTonYSk6ICdhIHQgPSBbYV1cblxubGV0IHJlYyAoPj49KSAobDonYSB0KSAoZjonYSAtPiAnYiB0KTogJ2IgdCA9XG4gIG1hdGNoIGwgd2l0aFxuICB8IFtdIC0+XG4gICAgIFtdXG4gIHwgaGQgOjogdGwgLT5cbiAgICAgZiBoZCBAICh0bCA+Pj0gZilcblxubGV0ICggbGV0KiApID0gKD4+PSlcblxuXG5sZXQgKD49PikgKGY6J2EgLT4gJ2IgdCkgKGc6J2IgLT4gJ2MgdCkgKGE6J2EpOiAnYyB0ID1cbiAgZiBhID4+PSBnXG5cblxubGV0ICg8Kj4pIChmbHN0OiAoJ2EgLT4gJ2IpIHQpIChsc3Q6J2EgdCk6ICdiIHQgPVxuICBmbHN0ID4+PSBmdW4gZiAtPiBtYXAgZiBsc3RcblxubGV0IGpvaW4gPSBjb25jYXRcblxubGV0IGZpbmQgKHA6J2EgLT4gYm9vbCkgKGw6J2EgdCk6ICdhIG9wdGlvbiA9XG4gIHRyeVxuICAgIFNvbWUgKGZpbmQgcCBsKVxuICB3aXRoIE5vdF9mb3VuZCAtPlxuICAgIE5vbmVcblxuXG5cblxubGV0IHNwbGl0X2hlYWRfdGFpbCAobHN0OiAnYSB0KTogJ2EgKiAnYSB0ID1cbiAgICBhc3NlcnQgKGxzdCA8PiBbXSk7XG4gICAgbWF0Y2ggbHN0IHdpdGhcbiAgICB8IFtdIC0+XG4gICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwhICopXG4gICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICBoZCwgdGxcblxuXG5cblxuXG5sZXQgbWFwX2FuZF9maWx0ZXIgKGY6J2EgLT4gJ2Igb3B0aW9uKSAobDonYSBsaXN0KTogJ2IgbGlzdCA9XG4gIGxldCByZWMgbWFwID0gZnVuY3Rpb25cbiAgICB8IFtdIC0+XG4gICAgICAgW11cbiAgICB8IGhkIDo6IHRsIC0+XG4gICAgICAgbWF0Y2ggZiBoZCB3aXRoXG4gICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgbWFwIHRsXG4gICAgICAgfCBTb21lIGIgLT5cbiAgICAgICAgICBiIDo6IG1hcCB0bFxuICBpblxuICBtYXAgbFxuXG5cblxubGV0IHNwbGl0X2F0IChwOidhIC0+IGJvb2wpIChsOiAnYSB0KTogJ2EgdCAqICdhIHQgPVxuICBsZXQgcmVjIHNwbGl0IHByZWZpeCByZXN0ID1cbiAgICBtYXRjaCByZXN0IHdpdGhcbiAgICB8IFtdIC0+XG4gICAgICAgcmV2IHByZWZpeCwgcmVzdFxuICAgIHwgaGQgOjogdGwgIC0+XG4gICAgICAgaWYgcCBoZCB0aGVuXG4gICAgICAgICByZXYgcHJlZml4LCByZXN0XG4gICAgICAgZWxzZVxuICAgICAgICAgc3BsaXQgKGhkIDo6IHByZWZpeCkgdGxcbiAgaW5cbiAgc3BsaXQgW10gbFxuXG5cblxubGV0IHRyYW5zcG9zZSAocm93X2xpc3Q6ICdhIGxpc3QgbGlzdCk6ICdhIGxpc3QgbGlzdCA9XG4gICAgYXNzZXJ0IChyb3dfbGlzdCA8PiBbXSk7XG4gICAgbGV0IGZpcnN0X2NvbHVtbiByb3dfbGlzdCA9XG4gICAgICAgICgqIEV4dHJhY3QgdGhlIGZpcnN0IGNvbHVtbiBvZiBbcm93X2xpc3RdLiAqKVxuICAgICAgICBmb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIHJvdyAoY29sdW1uLCByb3dfbGlzdCktPlxuICAgICAgICAgICAgICAgIG1hdGNoIHJvdyB3aXRoXG4gICAgICAgICAgICAgICAgfCBbXSAtPlxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgICAgICB8IGVsIDo6IHJlc3Rfcm93IC0+XG4gICAgICAgICAgICAgICAgICAgIGVsIDo6IGNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgcmVzdF9yb3cgOjogcm93X2xpc3RcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJvd19saXN0XG4gICAgICAgICAgICAoW10sIFtdKVxuICAgIGluXG4gICAgbGV0IHJlYyBnZXRfY29sdW1ucyBjb2x1bW5zIHJvd19saXN0ID1cbiAgICAgICAgbWF0Y2ggcm93X2xpc3Qgd2l0aFxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogTm8gcm93cyBpcyBub3QgYWxsb3dlZC4gKilcblxuICAgICAgICB8IFtdIDo6IF8gLT5cbiAgICAgICAgICAgIGNvbHVtbnNcblxuICAgICAgICB8IChfIDo6IF8pIDo6IF8gLT5cbiAgICAgICAgICAgIGxldCBjb2x1bW4sIHJvd19saXN0ID0gZmlyc3RfY29sdW1uIHJvd19saXN0IGluXG4gICAgICAgICAgICBnZXRfY29sdW1ucyAoY29sdW1uIDo6IGNvbHVtbnMpIHJvd19saXN0XG4gICAgaW5cbiAgICByZXYgKGdldF9jb2x1bW5zIFtdIHJvd19saXN0KVxuXG5cblxuXG5cbm1vZHVsZSBNb25hZGljIChNOiBNT05BRCkgPVxuICBzdHJ1Y3RcbiAgICBsZXQgZm9sZGlfbGVmdCAoZjppbnQgLT4gJ2EgLT4gJ2IgLT4gJ2IgTS50KSAobDonYSB0KSAoc3RhcnQ6J2IpXG4gICAgICAgIDogJ2IgTS50ID1cbiAgICAgIGxldCByZWMgZm9sZGkgaSBsIHN0YXJ0ID1cbiAgICAgICAgbWF0Y2ggbCB3aXRoXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgTS5yZXR1cm4gc3RhcnRcbiAgICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAgICBNLihmIGkgaGQgc3RhcnQgPj49IGZvbGRpIChpKzEpIHRsKVxuICAgICAgaW5cbiAgICAgIGZvbGRpIDAgbCBzdGFydFxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjonYSAtPiAnYiAtPiAnYiBNLnQpIChsOidhIHQpIChzdGFydDonYik6ICdiIE0udCA9XG4gICAgICBmb2xkaV9sZWZ0IChmdW4gXyAtPiBmKSBsIHN0YXJ0XG5cbiAgICBsZXQgZm9sZF9yaWdodCAoZjonYSAtPiAnYiAtPiAnYiBNLnQpIChsOidhIHQpIChzdGFydDonYik6ICdiIE0udCA9XG4gICAgICBmb2xkX2xlZnQgZiAocmV2IGwpIHN0YXJ0XG4gIGVuZFxuXG5cblxuXG4oKiBVbml0IFRlc3RzICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIHRyYW5zcG9zZSBbIFsxXSBdID0gWyBbMV0gXVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIHRyYW5zcG9zZVxuICAgICAgICBbIFsxOzI7M10gXSA9IFsgWzFdOyBbMl07IFszXSBdXG5cbmxldCV0ZXN0IF8gPVxuICAgIHRyYW5zcG9zZVxuICAgICAgICBbIFsxOzI7M107IFs0OzU7Nl0gXSA9IFsgWzE7NF07IFsyOzVdOyBbMzs2XSBdXG4iLCJtb2R1bGUgQmFzaWMgPVxuc3RydWN0XG4gICAgdHlwZSAnYSB0ID0ge1xuICAgICAgICBmcm9udDogJ2EgbGlzdDtcbiAgICAgICAgcmVhcjogICdhIGxpc3Q7XG4gICAgfVxuXG5cbiAgICBsZXQgZW1wdHk6ICdhIHQgPVxuICAgICAgICB7ZnJvbnQgPSBbXTsgcmVhciA9IFtdO31cblxuXG4gICAgbGV0IHB1c2hfZnJvbnQgKGU6ICdhKSAoZmlmbzogJ2EgdCk6ICdhIHQgPVxuICAgICAgICB7ZmlmbyB3aXRoIGZyb250ID0gZSA6OiBmaWZvLmZyb250fVxuXG5cbiAgICBsZXQgcHVzaF9yZWFyIChlOiAnYSkgKGZpZm86ICdhIHQpOiAnYSB0ID1cbiAgICAgICAge2ZpZm8gd2l0aCByZWFyID0gZSA6OiBmaWZvLnJlYXJ9XG5cblxuICAgIGxldCBwb3BfZnJvbnQgKGZpZm86ICdhIHQpOiAoJ2EgKiAnYSB0KSBvcHRpb24gPVxuICAgICAgICBtYXRjaCBmaWZvLmZyb250IHdpdGhcbiAgICAgICAgfCBoZCA6OiBmcm9udCAtPlxuICAgICAgICAgICAgU29tZSAoaGQsIHtmaWZvIHdpdGggZnJvbnR9KVxuXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgIG1hdGNoIExpc3QucmV2IGZpZm8ucmVhciB3aXRoXG4gICAgICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICAgICAgTm9uZVxuXG4gICAgICAgICAgICB8IGhkIDo6IGZyb250IC0+XG4gICAgICAgICAgICAgICAgU29tZSAoaGQsIHtmcm9udDsgcmVhciA9IFtdfSlcblxuICAgIGxldCBwcmVwZW5kIChmaWZvOiAnYSB0KSAobHN0OiAnYSBsaXN0KTogJ2EgbGlzdCA9XG4gICAgICAgIGZpZm8uZnJvbnQgQCBMaXN0LnJldl9hcHBlbmQgZmlmby5yZWFyIGxzdFxuZW5kXG5cblxuXG5cbnR5cGUgJ2EgdCA9XG4gICAgfCBFbXB0eVxuICAgIHwgTm9uZW1wdHkgb2YgJ2EgQmFzaWMudCAqICdhXG5cblxubGV0IGlzX2VtcHR5IChmOiAnYSB0KTogYm9vbCA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICB0cnVlXG4gICAgfCBfIC0+XG4gICAgICAgIGZhbHNlXG5cblxubGV0IGhhc19zb21lIChmOiAnYSB0KTogYm9vbCA9XG4gICAgbm90IChpc19lbXB0eSBmKVxuXG5cbmxldCBlbXB0eTogJ2EgdCA9XG4gICAgRW1wdHlcblxuXG5sZXQgcHVzaF9mcm9udCAoZTogJ2EpIChmOiAnYSB0KTogJ2EgdCA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBOb25lbXB0eSAoQmFzaWMuZW1wdHksIGUpXG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIE5vbmVtcHR5IChCYXNpYy5wdXNoX2Zyb250IGUgbGYsIGxhc3QpXG5cblxubGV0IHB1c2hfcmVhciAoZTogJ2EpIChmOiAnYSB0KTogJ2EgdCA9XG4gICAgbWF0Y2ggZiB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBOb25lbXB0eSAoQmFzaWMuZW1wdHksIGUpXG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIE5vbmVtcHR5IChCYXNpYy5wdXNoX3JlYXIgbGFzdCBsZiwgZSlcblxuXG5sZXQgcG9wX2Zyb250IChmOiAnYSB0KTogKCdhICogJ2EgdCkgb3B0aW9uID1cbiAgICBtYXRjaCBmIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIE5vbmVcbiAgICB8IE5vbmVtcHR5IChsZiwgbGFzdCkgLT5cbiAgICAgICAgbWF0Y2ggQmFzaWMucG9wX2Zyb250IGxmIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBTb21lIChsYXN0LCBlbXB0eSlcbiAgICAgICAgfCBTb21lIChmaXJzdCwgbGYpIC0+XG4gICAgICAgICAgICBTb21lIChmaXJzdCwgTm9uZW1wdHkgKGxmLCBsYXN0KSlcblxuXG5sZXQgdXBkYXRlX2ZpcnN0IChmOiAnYSAtPiAnYSkgKGZpZm86ICdhIHQpOiAnYSB0ID1cbiAgICBtYXRjaCBmaWZvIHdpdGhcbiAgICB8IEVtcHR5IC0+XG4gICAgICAgIEVtcHR5XG4gICAgfCBOb25lbXB0eSAobGYsIGxhc3QpIC0+XG4gICAgICAgIG1hdGNoIEJhc2ljLnBvcF9mcm9udCBsZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgTm9uZW1wdHkgKGxmLCBmIGxhc3QpXG4gICAgICAgIHwgU29tZSAoZmlyc3QsIGxmKSAtPlxuICAgICAgICAgICAgTm9uZW1wdHkgKEJhc2ljLnB1c2hfZnJvbnQgKGYgZmlyc3QpIGxmLCBsYXN0KVxuXG5cbmxldCB1cGRhdGVfbGFzdCAoZjogJ2EgLT4gJ2EpIChmaWZvOiAnYSB0KTogJ2EgdCA9XG4gICAgbWF0Y2ggZmlmbyB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBFbXB0eVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBOb25lbXB0eSAobGYsIGYgbGFzdClcblxuXG5cbmxldCB0b19saXN0IChmaWZvOiAnYSB0KTogJ2EgbGlzdCA9XG4gICAgbWF0Y2ggZmlmbyB3aXRoXG4gICAgfCBFbXB0eSAtPlxuICAgICAgICBbXVxuICAgIHwgTm9uZW1wdHkgKGxmLCBsYXN0KSAtPlxuICAgICAgICBCYXNpYy5wcmVwZW5kIGxmIFtsYXN0XVxuXG5cblxuXG5cblxuXG5cblxuXG4oKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICopXG4oKiBVbml0IFRlc3RzICopXG4oKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIHRvX2xpc3RcbiAgICAgICAgKGVtcHR5IHw+IHB1c2hfcmVhciAwIHw+IHB1c2hfcmVhciAxIHw+IHB1c2hfcmVhciAyKVxuICAgID1cbiAgICBbMDsgMTsgMl1cblxuXG5sZXQldGVzdCBfID1cbiAgICBlbXB0eSB8PiBwdXNoX3JlYXIgMCB8PiBwb3BfZnJvbnRcbiAgICA9XG4gICAgU29tZSAoMCwgZW1wdHkpXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbWF0Y2hcbiAgICAgICAgZW1wdHlcbiAgICAgICAgfD4gcHVzaF9yZWFyIDAgfD4gcHVzaF9yZWFyIDFcbiAgICAgICAgfD4gdXBkYXRlX2ZpcnN0IChmdW4gXyAtPiAxMCkgfD4gcG9wX2Zyb250XG4gICAgd2l0aFxuICAgIHwgU29tZSAoMTAsIGZpZm8gKSAtPlxuICAgICAgICBwb3BfZnJvbnQgZmlmbyA9IFNvbWUgKDEsIGVtcHR5KVxuICAgIHwgXyAtPlxuICAgICAgICBmYWxzZVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIG1hdGNoXG4gICAgICAgIGVtcHR5XG4gICAgICAgIHw+IHB1c2hfcmVhciAwIHw+IHB1c2hfcmVhciAxXG4gICAgICAgIHw+IHVwZGF0ZV9sYXN0IChmdW4gXyAtPiAxMCkgfD4gcG9wX2Zyb250XG4gICAgd2l0aFxuICAgIHwgU29tZSAoMCwgZmlmbyApIC0+XG4gICAgICAgIHBvcF9mcm9udCBmaWZvID0gU29tZSAoMTAsIGVtcHR5KVxuICAgIHwgXyAtPlxuICAgICAgICBmYWxzZVxuIiwibW9kdWxlIHR5cGUgT1JERVIgPVxuc2lnXG4gICAgdmFsIG9yZGVyOiBpbnRcbmVuZFxuXG5cbm1vZHVsZSBPMzI6IE9SREVSID1cbnN0cnVjdFxuICAgIGxldCBvcmRlciA9IDMyXG5lbmRcblxuXG5cblxubW9kdWxlIE1hcDAgKE9yZGVyOiBPUkRFUikgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgT3JkZXJcblxuICAgIGxldCBvZGRfb3JkZXI6IGJvb2wgPVxuICAgICAgICBhc3NlcnQgKDMgPD0gb3JkZXIpO1xuICAgICAgICBvcmRlciAvIDIgKiAyIDwgb3JkZXJcblxuICAgIGxldCBtYXhfa2V5czogaW50ID0gb3JkZXIgLSAxXG5cbiAgICBsZXQgbWluX2tleXM6IGludCA9XG4gICAgICAgIGlmIG9kZF9vcmRlciB0aGVuXG4gICAgICAgICAgICAob3JkZXIgLSAxKSAvIDJcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgb3JkZXIgLyAyIC0gMVxuXG5cbiAgICB0eXBlIGtleSA9IEtleS50XG5cbiAgICB0eXBlICdhIHBhaXJzID0gKEtleS50ICogJ2EpIGFycmF5XG5cbiAgICB0eXBlICdhIHQgPVxuICAgICAgICB8IExlYWYgb2YgJ2EgcGFpcnNcbiAgICAgICAgfCBOb2RlIG9mICdhIHBhaXJzICogJ2EgdCBhcnJheVxuXG5cblxuXG5cbiAgICAoKiBHZW5lcmFsIGZ1bmN0aW9ucy4gKilcblxuXG4gICAgbGV0IGlzX2VtcHR5IChtYXA6ICdhIHQpOiBib29sID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIGtleXMgLT5cbiAgICAgICAgICAgIEFycmF5Lmxlbmd0aCBrZXlzID0gMFxuICAgICAgICB8IE5vZGUgXyAtPlxuICAgICAgICAgICAgZmFsc2VcblxuXG4gICAgbGV0IHJlYyBjYXJkaW5hbCAobWFwOiAnYSB0KTogaW50ID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIGtleXMgLT5cbiAgICAgICAgICAgIEFycmF5Lmxlbmd0aCBrZXlzXG4gICAgICAgIHwgTm9kZSAoa2V5cywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBBcnJheS5mb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAoZnVuIG4gY2hpbGQgLT4gbiArIGNhcmRpbmFsIGNoaWxkKVxuICAgICAgICAgICAgICAgIChBcnJheS5sZW5ndGgga2V5cylcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxuXG4gICAgbGV0IGVtcHR5OiAnYSB0ID1cbiAgICAgICAgTGVhZiBbfHxdXG5cblxuICAgIGxldCBmb2xkX2xlZnQgKGY6ICdhIC0+IEtleS50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAobWFwOiAnYiB0KTogJ2EgPVxuICAgICAgICBsZXQgcmVjIGZvbGQgYWNjdSBtYXAgPVxuICAgICAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgICAgIEFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgICAgICAgICAgICAoZnVuIGEgKGtleSx2YWx1ZSkgLT4gZiBhIGtleSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgYWNjdVxuICAgICAgICAgICAgICAgICAgICBwYWlyc1xuICAgICAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICAgICAgbGV0IG4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgICAgICBhc3NlcnQgKG4gKyAxID0gQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVjIGZvbGRfaW50ZXJpb3IgYWNjdSBpID1cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChpIDwgQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgaSA9IG4gdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZCBhY2N1IGNoaWxkcmVuLihpKVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2xkX2ludGVyaW9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xkIGFjY3UgY2hpbGRyZW4uKGkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZzdCBwYWlycy4oaSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc25kIHBhaXJzLihpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyAxKVxuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgZm9sZF9pbnRlcmlvciBhY2N1IDBcbiAgICAgICAgaW5cbiAgICAgICAgZm9sZCBzdGFydCBtYXBcblxuXG4gICAgbGV0IGZvbGRfcmlnaHQgKGY6ICdhIC0+IEtleS50IC0+ICdiIC0+ICdhKSAoc3RhcnQ6ICdhKSAobWFwOiAnYiB0KTogJ2EgPVxuICAgICAgICBsZXQgcmVjIGZvbGQgYWNjdSBtYXAgPVxuICAgICAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgICAgIEFycmF5LmZvbGRfcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgKGZ1biAoa2V5LHZhbHVlKSBhIC0+IGYgYSBrZXkgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIHBhaXJzXG4gICAgICAgICAgICAgICAgICAgIGFjY3VcbiAgICAgICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgICAgIGxldCBuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgYXNzZXJ0IChuICsgMSA9IEFycmF5Lmxlbmd0aCBjaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgbGV0IHJlYyBmb2xkX2ludGVyaW9yIGFjY3UgaSA9XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoMCA8PSBpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgaSA9IDAgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IGkgLSAxIGluXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKDAgPD0gaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKGkgPCBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9sZF9pbnRlcmlvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZiBhY2N1IChmc3QgcGFpcnMuKGkpKSAoc25kIHBhaXJzLihpKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi4oaSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVxuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgZm9sZF9pbnRlcmlvciAoZm9sZCBhY2N1IGNoaWxkcmVuLihuKSkgblxuICAgICAgICBpblxuICAgICAgICBmb2xkIHN0YXJ0IG1hcFxuXG5cblxuICAgIGxldCBiaW5kaW5ncyAobWFwOiAnYSB0KTogKEtleS50ICogJ2EpIGxpc3QgPVxuICAgICAgICBmb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIGxzdCBrZXkgdmFsdWUgLT4gKGtleSx2YWx1ZSkgOjogbHN0KVxuICAgICAgICAgICAgW11cbiAgICAgICAgICAgIG1hcFxuXG5cbiAgICBsZXQga2V5cyAobWFwOiAnYSB0KTogS2V5LnQgbGlzdCA9XG4gICAgICAgIGZvbGRfcmlnaHRcbiAgICAgICAgICAgIChmdW4gbHN0IGtleSBfIC0+IGtleSA6OiBsc3QpXG4gICAgICAgICAgICBbXVxuICAgICAgICAgICAgbWFwXG5cblxuXG5cblxuXG5cblxuICAgICgqIFNlYXJjaGluZyAqKVxuXG5cbiAgICBsZXQgYnNlYXJjaCAoa2V5OiBLZXkudCkgKGFycjogJ2EgcGFpcnMpOiBpbnQgKiBib29sID1cbiAgICAgICAgQXJyYXkuYmluc2VhcmNoIEtleS5jb21wYXJlIGZzdCBrZXkgYXJyXG5cblxuXG4gICAgbGV0IHJlYyBmaW5kX29wdCAoa2V5OiBLZXkudCkgKG1hcDogJ2EgdCk6ICdhIG9wdGlvbiA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBTb21lIChzbmQgcGFpcnMuKGkpKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIE5vbmVcbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIFNvbWUgKHNuZCBwYWlycy4oaSkpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZmluZF9vcHQga2V5IGNoaWxkcmVuLihpKVxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICgqIEluc2VydGlvblxuICAgICAqID09PT09PT09PVxuICAgICAqKVxuXG4gICAgdHlwZSAnYSBpbnNlcnQgPVxuICAgICAgICB8IE5vcm1hbF9pbnNlcnQgb2YgJ2EgdFxuICAgICAgICB8IFNwbGl0X2luc2VydCBvZiAnYSB0ICogKEtleS50ICogJ2EpICogJ2EgdFxuXG5cbiAgICBsZXQgc3ViYXJyYXkgKGFycjogJ2EgYXJyYXkpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpOiAnYSBhcnJheSA9XG4gICAgICAgICgqIFRoZSBzdWJhcnJheSBvZiBbYXJyXSBzdGFydGluZyBhdCBbc3RhcnRdIGFuZCBlbmRpbmcgb25lIGJlZm9yZSBbYmV5b25kXS4gKilcbiAgICAgICAgYXNzZXJ0ICgwIDw9IHN0YXJ0KTtcbiAgICAgICAgYXNzZXJ0IChzdGFydCA8PSBiZXlvbmQpO1xuICAgICAgICBhc3NlcnQgKGJleW9uZCA8PSBBcnJheS5sZW5ndGggYXJyKTtcbiAgICAgICAgQXJyYXkuc3ViIGFyciBzdGFydCAoYmV5b25kIC0gc3RhcnQpXG5cblxuICAgIGxldCBpbnNlcnRfc3ViYXJyYXlcbiAgICAgICAgICAgIChhcnI6ICdhIGFycmF5KSAoaTogaW50KSAoeDogJ2EpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpXG4gICAgICAgIDogJ2EgYXJyYXlcbiAgICAgICAgPVxuICAgICAgICAoKiBUaGUgc3ViYXJyYXkgb2YgW2Fycl0gc3RhcnRpbmcgYXQgW3N0YXJ0XSBhbmQgZW5kaW5nIG9uZSBiZWZvcmUgW2JleW9uZF1cbiAgICAgICAgICAgd2l0aCBbeF0gaW5zZXJ0ZWQgYXQgcG9zaXRpb24gW2ldLiAqKVxuICAgICAgICBhc3NlcnQgKDAgPD0gc3RhcnQpO1xuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGkpO1xuICAgICAgICBhc3NlcnQgKGkgPD0gYmV5b25kKTtcbiAgICAgICAgYXNzZXJ0IChiZXlvbmQgPD0gQXJyYXkubGVuZ3RoIGFycik7XG4gICAgICAgIGxldCBhcnIyID0gQXJyYXkubWFrZSAoYmV5b25kIC0gc3RhcnQgKyAxKSB4IGluXG4gICAgICAgIEFycmF5LmJsaXQgYXJyIHN0YXJ0IGFycjIgMCAoaSAtIHN0YXJ0KTtcbiAgICAgICAgQXJyYXkuYmxpdCBhcnIgaSBhcnIyIChpIC0gc3RhcnQgKyAxKSAoYmV5b25kIC0gaSk7XG4gICAgICAgIGFycjJcblxuXG5cbiAgICBsZXQgc3BsaXRfc3ViYXJyYXlcbiAgICAgICAgICAgIChhcnI6ICdhIGFycmF5KSAoaTogaW50KSAoeDogJ2EpICh5OiAnYSkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludClcbiAgICAgICAgOiAnYSBhcnJheVxuICAgICAgICA9XG4gICAgICAgICgqIFRoZSBzdWJhcnJheSBvZiBbYXJyXSBzdGFydGluZyBhdCBbc3RhcnRdIGFuZCBlbmRpbmcgb25lIGJlZm9yZSBbYmV5b25kXVxuICAgICAgICAgICB3aXRoIFt4XSBpbnNlcnRlZCBhdCBwb3NpdGlvbiBbaV0gYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBhdCBwb3NpdGlvblxuICAgICAgICAgICBbaV0gcmVwbGFjZWQgYnkgW3ldLiAqKVxuICAgICAgICBhc3NlcnQgKGkgPCBiZXlvbmQpO1xuICAgICAgICBsZXQgYXJyID0gaW5zZXJ0X3N1YmFycmF5IGFyciBpIHggc3RhcnQgYmV5b25kIGluXG4gICAgICAgIGFyci4oaSAtIHN0YXJ0ICsgMSkgPC0geTtcbiAgICAgICAgYXJyXG5cblxuXG5cbiAgICBsZXQgYWRkX2luX2xlYWYgKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpIChwYWlyczogJ2EgcGFpcnMpOiAnYSBpbnNlcnQgPVxuICAgICAgICBsZXQgbGVuID0gQXJyYXkubGVuZ3RoIHBhaXJzIGluXG4gICAgICAgIGxldCBpLCBleGFjdCA9IGJzZWFyY2gga2V5IHBhaXJzIGluXG4gICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgIE5vcm1hbF9pbnNlcnQgKExlYWYgKEFycmF5LnJlcGxhY2UgaSAoa2V5LCB2YWx1ZSkgcGFpcnMpKVxuXG4gICAgICAgIGVsc2UgaWYgbGVuIDwgbWF4X2tleXMgdGhlblxuICAgICAgICAgICAgKCogTGVhZiBpcyBub3QgZnVsbC4gKilcbiAgICAgICAgICAgIE5vcm1hbF9pbnNlcnQgKExlYWYgKEFycmF5Lmluc2VydCBpIChrZXksIHZhbHVlKSBwYWlycykpXG5cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgKCogTGVhZiBpcyBmdWxsICopXG4gICAgICAgICAgICBsZXQgaW5zZXJ0X3N1YmFycmF5ID0gaW5zZXJ0X3N1YmFycmF5IHBhaXJzIGkgKGtleSwgdmFsdWUpXG4gICAgICAgICAgICBhbmQgayA9IG9yZGVyIC8gMlxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGlmIG9kZF9vcmRlciB0aGVuXG4gICAgICAgICAgICAgICAgaWYgaSA9IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCAgPSBzdWJhcnJheSBwYWlycyAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0ID0gc3ViYXJyYXkgcGFpcnMgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChMZWFmIGxlZnQsIChrZXksIHZhbHVlKSwgTGVhZiByaWdodClcbiAgICAgICAgICAgICAgICBlbHNlIGlmIGkgPCBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgID0gaW5zZXJ0X3N1YmFycmF5IDAgKGsgLSAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHQgPSBzdWJhcnJheSBwYWlycyBrIGxlblxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKExlYWYgbGVmdCwgcGFpcnMuKGsgLSAxKSwgTGVhZiByaWdodClcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGxldCBsZWZ0ICA9IHN1YmFycmF5IHBhaXJzIDAga1xuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHQgPSBpbnNlcnRfc3ViYXJyYXkgKGsgKyAxKSBsZW5cbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChMZWFmIGxlZnQsIHBhaXJzLihrKSwgTGVhZiByaWdodClcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgICAoKiBldmVuIG9yZGVyICopXG4gICAgICAgICAgICAgICAgaWYgaSA8IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCAgPSBpbnNlcnRfc3ViYXJyYXkgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodCA9IHN1YmFycmF5IHBhaXJzIGsgbGVuXG4gICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoTGVhZiBsZWZ0LCBwYWlycy4oayAtIDEpLCBMZWFmIHJpZ2h0KVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnQgID0gc3ViYXJyYXkgcGFpcnMgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodCA9IGluc2VydF9zdWJhcnJheSBrIGxlblxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBTcGxpdF9pbnNlcnQgKExlYWYgbGVmdCwgcGFpcnMuKGsgLSAxKSwgTGVhZiByaWdodClcbiAgICAgICAgICAgIGVuZFxuXG5cblxuXG4gICAgbGV0IGFkZF9pbl9ub2RlXG4gICAgICAgICAgICAoaTogaW50KVxuICAgICAgICAgICAgKGxlZnQ6ICdhIHQpXG4gICAgICAgICAgICAocGFpcjogS2V5LnQgKiAnYSlcbiAgICAgICAgICAgIChyaWdodDogJ2EgdClcbiAgICAgICAgICAgIChwYWlyczogJ2EgcGFpcnMpXG4gICAgICAgICAgICAoY2hpbGRyZW46ICdhIHQgYXJyYXkpXG4gICAgICAgIDogJ2EgaW5zZXJ0XG4gICAgICAgID1cbiAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICBpZiBsZW4gPCBtYXhfa2V5cyB0aGVuXG4gICAgICAgICAgICBsZXQgcGFpcnMgPSBBcnJheS5pbnNlcnQgaSBwYWlyIHBhaXJzXG4gICAgICAgICAgICBhbmQgY2hpbGRyZW4gPSBBcnJheS5pbnNlcnQgaSBsZWZ0IGNoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAoaSArIDEpIGNoaWxkcmVuKTtcbiAgICAgICAgICAgIGNoaWxkcmVuLihpICsgMSkgPC0gcmlnaHQ7XG4gICAgICAgICAgICBOb3JtYWxfaW5zZXJ0IChOb2RlIChwYWlycywgY2hpbGRyZW4pKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICAoKiBOb2RlIGlzIGZ1bGwuICopXG4gICAgICAgICAgICBsZXQgayA9IG9yZGVyIC8gMlxuICAgICAgICAgICAgYW5kIGluc2VydF9zdWJhcnJheSA9IGluc2VydF9zdWJhcnJheSBwYWlycyBpIHBhaXJcbiAgICAgICAgICAgIGFuZCBzcGxpdF9zdWJhcnJheSBzdGFydCBiZXlvbmQgPVxuICAgICAgICAgICAgICAgIHNwbGl0X3N1YmFycmF5IGNoaWxkcmVuIGkgbGVmdCByaWdodCBzdGFydCBiZXlvbmRcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBpZiBvZGRfb3JkZXIgdGhlblxuICAgICAgICAgICAgICAgIGlmIGkgPSBrIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxlZnRfcGFpcnMgICAgID0gc3ViYXJyYXkgcGFpcnMgICAgMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCBsZWZ0X2NoaWxkcmVuICA9IHN1YmFycmF5IGNoaWxkcmVuIDAgKGsgKyAxKVxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfcGFpcnMgICAgPSBzdWJhcnJheSBwYWlycyAgICBrIGxlblxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfY2hpbGRyZW4gPSBzdWJhcnJheSBjaGlsZHJlbiBrIChsZW4gKyAxKVxuICAgICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IGsgbGVmdF9jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggMCByaWdodF9jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgICAgIGxlZnRfY2hpbGRyZW4uKGspICA8LSBsZWZ0O1xuICAgICAgICAgICAgICAgICAgICByaWdodF9jaGlsZHJlbi4oMCkgPC0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIFNwbGl0X2luc2VydCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChsZWZ0X3BhaXJzLCBsZWZ0X2NoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhaXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBOb2RlIChyaWdodF9wYWlycywgcmlnaHRfY2hpbGRyZW4pKVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgaSA8IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdF9wYWlycyAgICAgPSBpbnNlcnRfc3ViYXJyYXkgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCBsZWZ0X2NoaWxkcmVuICA9IHNwbGl0X3N1YmFycmF5ICAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X3BhaXJzICAgID0gc3ViYXJyYXkgcGFpcnMgICAgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X2NoaWxkcmVuID0gc3ViYXJyYXkgY2hpbGRyZW4gayAobGVuICsgMSlcbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAoayAtIDEpIHBhaXJzKTtcbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKGxlZnRfcGFpcnMsIGxlZnRfY2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMuKGsgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKHJpZ2h0X3BhaXJzLCByaWdodF9jaGlsZHJlbikpXG4gICAgICAgICAgICAgICAgZWxzZSBiZWdpblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdF9wYWlycyAgICAgPSBzdWJhcnJheSBwYWlycyAgICAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIGxlZnRfY2hpbGRyZW4gID0gc3ViYXJyYXkgY2hpbGRyZW4gMCAoayArIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9wYWlycyAgICA9IGluc2VydF9zdWJhcnJheSAoayArIDEpIGxlblxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfY2hpbGRyZW4gPSBzcGxpdF9zdWJhcnJheSAgKGsgKyAxKSAobGVuICsgMSkgaW5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCBrIHBhaXJzKTtcbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKGxlZnRfcGFpcnMsIGxlZnRfY2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMuKGspLFxuICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAocmlnaHRfcGFpcnMsIHJpZ2h0X2NoaWxkcmVuKSlcbiAgICAgICAgICAgICAgICBlbmRcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgICAoKiBldmVuIG9yZGVyICopXG4gICAgICAgICAgICAgICAgaWYgaSA8IGsgdGhlblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdF9wYWlycyAgICAgPSBpbnNlcnRfc3ViYXJyYXkgMCAoayAtIDEpXG4gICAgICAgICAgICAgICAgICAgIGFuZCBsZWZ0X2NoaWxkcmVuICA9IHNwbGl0X3N1YmFycmF5ICAwIGtcbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X3BhaXJzICAgID0gc3ViYXJyYXkgcGFpcnMgICAgayBsZW5cbiAgICAgICAgICAgICAgICAgICAgYW5kIHJpZ2h0X2NoaWxkcmVuID0gc3ViYXJyYXkgY2hpbGRyZW4gayAobGVuICsgMSlcbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAoayAtIDEpIHBhaXJzKTtcbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKGxlZnRfcGFpcnMsIGxlZnRfY2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMuKGsgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKHJpZ2h0X3BhaXJzLCByaWdodF9jaGlsZHJlbikpXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdF9wYWlycyAgICAgPSBzdWJhcnJheSBwYWlycyAgICAwIChrIC0gMSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIGxlZnRfY2hpbGRyZW4gID0gc3ViYXJyYXkgY2hpbGRyZW4gMCBrXG4gICAgICAgICAgICAgICAgICAgIGFuZCByaWdodF9wYWlycyAgICA9IGluc2VydF9zdWJhcnJheSBrIGxlblxuICAgICAgICAgICAgICAgICAgICBhbmQgcmlnaHRfY2hpbGRyZW4gPSBzcGxpdF9zdWJhcnJheSAgayAobGVuICsgMSlcbiAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChBcnJheS52YWxpZF9pbmRleCAoayAtIDEpIHBhaXJzKTtcbiAgICAgICAgICAgICAgICAgICAgU3BsaXRfaW5zZXJ0IChcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKGxlZnRfcGFpcnMsIGxlZnRfY2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMuKGsgLSAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKHJpZ2h0X3BhaXJzLCByaWdodF9jaGlsZHJlbikpXG4gICAgICAgICAgICBlbmRcblxuXG5cbiAgICBsZXQgcmVjIGFkZF9hdXggKGtleTogS2V5LnQpICh2YWx1ZTogJ2EpIChtYXA6ICdhIHQpOiAnYSBpbnNlcnQgPVxuICAgICAgICBtYXRjaCBtYXAgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMgLT5cbiAgICAgICAgICAgIGFkZF9pbl9sZWFmIGtleSB2YWx1ZSBwYWlyc1xuXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICAoKiBBbiBleGFjdCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4gVGhlcmVmb3JlIHVwZGF0ZSB0aGUgdmFsdWUuICopXG4gICAgICAgICAgICAgICAgbGV0IHBhaXJzID0gQXJyYXkucmVwbGFjZSBpIChrZXksdmFsdWUpIHBhaXJzIGluXG4gICAgICAgICAgICAgICAgTm9ybWFsX2luc2VydCAoTm9kZSAocGFpcnMsIGNoaWxkcmVuKSlcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgICAoKiogQWRkIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHRoZSBbaV10aCBjaGlsZC4gKilcbiAgICAgICAgICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IGkgY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIG1hdGNoIGFkZF9hdXgga2V5IHZhbHVlIGNoaWxkcmVuLihpKSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb3JtYWxfaW5zZXJ0IGNoaWxkIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IEFycmF5LnJlcGxhY2UgaSBjaGlsZCBjaGlsZHJlbiBpblxuICAgICAgICAgICAgICAgICAgICBOb3JtYWxfaW5zZXJ0IChOb2RlIChwYWlycywgY2hpbGRyZW4pKVxuICAgICAgICAgICAgICAgIHwgU3BsaXRfaW5zZXJ0ICh1LCB5LCB2KSAtPlxuICAgICAgICAgICAgICAgICAgICBhZGRfaW5fbm9kZSBpIHUgeSB2IHBhaXJzIGNoaWxkcmVuXG4gICAgICAgICAgICBlbmRcblxuXG5cbiAgICBsZXQgYWRkIChrZXk6IEtleS50KSAodmFsdWU6ICdhKSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIG1hdGNoIGFkZF9hdXgga2V5IHZhbHVlIG1hcCB3aXRoXG4gICAgICAgIHwgTm9ybWFsX2luc2VydCBtYXAgLT5cbiAgICAgICAgICAgIG1hcFxuICAgICAgICB8IFNwbGl0X2luc2VydCAobGVmdCwgcGFpciwgcmlnaHQpIC0+XG4gICAgICAgICAgICAoKiB0cmVlIGdyb3dzIGF0IHRoZSByb290ICopXG4gICAgICAgICAgICBOb2RlIChbfHBhaXJ8XSwgW3xsZWZ0OyByaWdodHxdKVxuXG5cblxuXG4gICAgKCogRGVsZXRpb25cbiAgICAgKiA9PT09PT09PVxuICAgICAqKVxuXG4gICAgdHlwZSAnYSBkZWxldGUgPSB7XG4gICAgICAgIHRyZWU6ICAnYSB0OyAgICAgICAgKCogVGhlIHRyZWUgd2l0aCB0aGUgZGVsZXRlZCBrZXkgdmFsdWUgcGFpci4gKilcbiAgICAgICAgcGFpcjogICBLZXkudCAqICdhOyAoKiBUaGUgZGVsZXRlZCBrZXkgdmFsdWUgcGFpci4gKilcbiAgICAgICAgdW5kZXJmbG93OiBib29sOyAgICAoKiBvbmUga2V5IGxlc3MgdGhhbiB0aGUgbWluaW1hbCBudW1iZXIgKilcbiAgICB9XG5cblxuICAgIGxldCBub3RfbWluaW1hbCAocGFpcnM6ICdhIHBhaXJzKTogYm9vbCA9XG4gICAgICAgIG1pbl9rZXlzIDwgQXJyYXkubGVuZ3RoIHBhaXJzXG5cblxuICAgIGxldCByZXBsYWNlMlxuICAgICAgICAgICAgKGk6IGludCkgKGxlZnQ6ICdhIHQpIChyaWdodDogJ2EgdCkgKGNoaWxkcmVuOiAnYSB0IGFycmF5KVxuICAgICAgICA6ICdhIHQgYXJyYXlcbiAgICAgICAgPVxuICAgICAgICBsZXQgY2hpbGRyZW4gPSBBcnJheS5jb3B5IGNoaWxkcmVuIGluXG4gICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggaSBjaGlsZHJlbik7XG4gICAgICAgIGFzc2VydCAoQXJyYXkudmFsaWRfaW5kZXggKGkgKyAxKSBjaGlsZHJlbik7XG4gICAgICAgIGNoaWxkcmVuLihpKSAgICAgPC0gbGVmdDtcbiAgICAgICAgY2hpbGRyZW4uKGkgKyAxKSA8LSByaWdodDtcbiAgICAgICAgY2hpbGRyZW5cblxuXG4gICAgbGV0IHJvdGF0ZV9rZXlzXG4gICAgICAgICAgICAodG9fbGVmdDogYm9vbClcbiAgICAgICAgICAgIChpOiBpbnQpIChsZWZ0OiAnYSBwYWlycykgKHBhcmVudDogJ2EgcGFpcnMpIChyaWdodDogJ2EgcGFpcnMpXG4gICAgICAgIDogJ2EgcGFpcnMgKiAnYSBwYWlycyAqICdhIHBhaXJzXG4gICAgICAgID1cbiAgICAgICAgbGV0IG9wZW4gQXJyYXkgaW5cbiAgICAgICAgYXNzZXJ0ICh2YWxpZF9pbmRleCBpIHBhcmVudCk7XG4gICAgICAgIGlmIHRvX2xlZnQgdGhlblxuICAgICAgICAgICAgcHVzaCBwYXJlbnQuKGkpIGxlZnQsXG4gICAgICAgICAgICByZXBsYWNlIGkgKGZpcnN0IHJpZ2h0KSBwYXJlbnQsXG4gICAgICAgICAgICByZW1vdmVfZmlyc3QgcmlnaHRcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVtb3ZlX2xhc3QgbGVmdCxcbiAgICAgICAgICAgIHJlcGxhY2UgaSAobGFzdCBsZWZ0KSBwYXJlbnQsXG4gICAgICAgICAgICBwdXNoX2Zyb250IHBhcmVudC4oaSkgcmlnaHRcblxuXG4gICAgbGV0IHJvdGF0ZV9jaGlsZHJlblxuICAgICAgICAgICAgKHRvX2xlZnQ6IGJvb2wpXG4gICAgICAgICAgICAobGVmdDogJ2EgdCBhcnJheSkgKHJpZ2h0OiAnYSB0IGFycmF5KVxuICAgICAgICA6ICdhIHQgYXJyYXkgKiAnYSB0IGFycmF5XG4gICAgICAgID1cbiAgICAgICAgbGV0IG9wZW4gQXJyYXkgaW5cbiAgICAgICAgaWYgdG9fbGVmdCB0aGVuXG4gICAgICAgICAgICBwdXNoIChmaXJzdCByaWdodCkgbGVmdCxcbiAgICAgICAgICAgIHJlbW92ZV9maXJzdCByaWdodFxuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZW1vdmVfbGFzdCBsZWZ0LFxuICAgICAgICAgICAgcHVzaF9mcm9udCAobGFzdCBsZWZ0KSByaWdodFxuXG5cblxuICAgIGxldCBtZXJnZV9rZXlzXG4gICAgICAgICAgICAoaTogaW50KSAobGVmdDogJ2EgcGFpcnMpIChwYXJlbnQ6ICdhIHBhaXJzKSAocmlnaHQ6ICdhIHBhaXJzKVxuICAgICAgICA6ICdhIHBhaXJzICogJ2EgcGFpcnNcbiAgICAgICAgPVxuICAgICAgICBhc3NlcnQgKEFycmF5LnZhbGlkX2luZGV4IGkgcGFyZW50KTtcbiAgICAgICAgbGV0IGxlbl9sZWZ0ICA9IEFycmF5Lmxlbmd0aCBsZWZ0XG4gICAgICAgIGFuZCBsZW5fcmlnaHQgPSBBcnJheS5sZW5ndGggcmlnaHRcbiAgICAgICAgaW5cbiAgICAgICAgbGV0IG1lcmdlZCA9IEFycmF5Lm1ha2UgKGxlbl9sZWZ0ICsgMSArIGxlbl9yaWdodCkgcGFyZW50LihpKVxuICAgICAgICBhbmQgcGFyZW50ID0gQXJyYXkucmVtb3ZlIGkgcGFyZW50XG4gICAgICAgIGluXG4gICAgICAgIEFycmF5LmJsaXQgbGVmdCAgMCBtZXJnZWQgMCBsZW5fbGVmdDtcbiAgICAgICAgQXJyYXkuYmxpdCByaWdodCAwIG1lcmdlZCAobGVuX2xlZnQgKyAxKSBsZW5fcmlnaHQ7XG4gICAgICAgIG1lcmdlZCwgcGFyZW50XG5cblxuICAgIGxldCBtZXJnZV9sZWF2ZXNcbiAgICAgICAgICAgIChpOiBpbnQpXG4gICAgICAgICAgICAocGFpcjogS2V5LnQgKiAnYSlcbiAgICAgICAgICAgIChwYWlyczE6ICdhIHBhaXJzKSAocGFpcnMyOiAnYSBwYWlycylcbiAgICAgICAgICAgIChwYWlyczogJ2EgcGFpcnMpIChjaGlsZHJlbjogJ2EgdCBhcnJheSlcbiAgICAgICAgOiAnYSBkZWxldGVcbiAgICAgICAgPVxuICAgICAgICBhc3NlcnQgKGkgKyAxIDwgQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgbGV0IG1lcmdlZCwgcGFpcnMgPSBtZXJnZV9rZXlzIGkgcGFpcnMxIHBhaXJzIHBhaXJzMlxuICAgICAgICBhbmQgY2hpbGRyZW4gICAgICA9IEFycmF5LnJlbW92ZSBpIGNoaWxkcmVuXG4gICAgICAgIGFuZCB1bmRlcmZsb3cgICAgID0gQXJyYXkubGVuZ3RoIHBhaXJzIDw9IG1pbl9rZXlzXG4gICAgICAgIGluXG4gICAgICAgIGNoaWxkcmVuLihpKSA8LSBMZWFmIG1lcmdlZDtcbiAgICAgICAge3RyZWUgPSBOb2RlIChwYWlycywgY2hpbGRyZW4pOyBwYWlyOyB1bmRlcmZsb3d9XG5cblxuXG4gICAgbGV0IG1lcmdlX25vZGVzXG4gICAgICAgICAgICAoaTogaW50KVxuICAgICAgICAgICAgKHBhaXI6IEtleS50ICogJ2EpXG4gICAgICAgICAgICAocGFpcnMxOiAnYSBwYWlycykgKGNoaWxkcmVuMTogJ2EgdCBhcnJheSlcbiAgICAgICAgICAgIChwYWlyczI6ICdhIHBhaXJzKSAoY2hpbGRyZW4yOiAnYSB0IGFycmF5KVxuICAgICAgICAgICAgKHBhaXJzOiAnYSBwYWlycykgKGNoaWxkcmVuOiAnYSB0IGFycmF5KVxuICAgICAgICA6ICdhIGRlbGV0ZVxuICAgICAgICA9XG4gICAgICAgIGFzc2VydCAoaSArIDEgPCBBcnJheS5sZW5ndGggY2hpbGRyZW4pO1xuICAgICAgICBsZXQgcGFpcnNfbmV3LCBwYWlycyA9IG1lcmdlX2tleXMgaSBwYWlyczEgcGFpcnMgcGFpcnMyXG4gICAgICAgIGFuZCBjaGlsZHJlbiAgICAgID0gQXJyYXkucmVtb3ZlIGkgY2hpbGRyZW5cbiAgICAgICAgYW5kIHVuZGVyZmxvdyAgICAgPSBBcnJheS5sZW5ndGggcGFpcnMgPD0gbWluX2tleXNcbiAgICAgICAgYW5kIGNoaWxkcmVuX25ldyAgPSBBcnJheS5hcHBlbmQgY2hpbGRyZW4xIGNoaWxkcmVuMlxuICAgICAgICBpblxuICAgICAgICBjaGlsZHJlbi4oaSkgPC0gTm9kZSAocGFpcnNfbmV3LCBjaGlsZHJlbl9uZXcpO1xuICAgICAgICB7dHJlZSA9IE5vZGUgKHBhaXJzLCBjaGlsZHJlbik7IHBhaXI7IHVuZGVyZmxvd31cblxuXG5cbiAgICBsZXQgaGFuZGxlX3VuZGVyZmxvd1xuICAgICAgICAgICAgKGk6IGludCkgICAgICAgICAgICAgICAgKCogSW5kZXggb2YgdGhlIGNoaWxkIHdoZXJlIHRoZSBkZWxldGlvbiBvY2N1cnJlZC4gKilcbiAgICAgICAgICAgICh1bmRlcmZsb3dfbGVmdDogYm9vbCkgICgqIFVuZGVyZmxvdyBoYXBwZW5kIGluIHRoZSBsZWZ0IGNoaWxkPyAqKVxuICAgICAgICAgICAgKGxlZnRfY2hpbGQ6ICdhIHQpXG4gICAgICAgICAgICAocmlnaHRfY2hpbGQ6ICdhIHQpXG4gICAgICAgICAgICAocGFpcjogS2V5LnQgKiAnYSkgICAgICAoKiBUaGUgZGVsZXRlZCBrZXkgdmFsdWUgcGFpci4gKilcbiAgICAgICAgICAgIChwYWlyczogJ2EgcGFpcnMpICAgICAgICgqIFRoZSBrZXkgdmFsdWUgcGFpcnMgb2YgdGhlIHBhcmVudC4gKilcbiAgICAgICAgICAgIChjaGlsZHJlbjogJ2EgdCBhcnJheSkgICgqIFRoZSBjaGlsZHJlbiBvZiB0aGUgcGFyZW50LiAqKVxuICAgICAgICA6ICdhIGRlbGV0ZVxuICAgICAgICA9XG4gICAgICAgIGxldCBub3RfbWluaW1hbCBwYWlyczEgcGFpcnMyID1cbiAgICAgICAgICAgIGlmIHVuZGVyZmxvd19sZWZ0IHRoZW5cbiAgICAgICAgICAgICAgICBub3RfbWluaW1hbCBwYWlyczJcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBub3RfbWluaW1hbCBwYWlyczFcbiAgICAgICAgaW5cbiAgICAgICAgbWF0Y2ggbGVmdF9jaGlsZCwgcmlnaHRfY2hpbGQgd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMxLCBMZWFmIHBhaXJzMiB3aGVuIG5vdF9taW5pbWFsIHBhaXJzMSBwYWlyczIgLT5cbiAgICAgICAgICAgICgqIFJpZ2h0IHNpYmxpbmcgaXMgbm90IG1pbmltYWwsIHJvdGF0ZSAqKVxuICAgICAgICAgICAgbGV0IHBhaXJzMSwgcGFpcnMsIHBhaXJzMiA9XG4gICAgICAgICAgICAgICAgcm90YXRlX2tleXMgdW5kZXJmbG93X2xlZnQgaSBwYWlyczEgcGFpcnMgcGFpcnMyXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuID1cbiAgICAgICAgICAgICAgICByZXBsYWNlMiBpIChMZWFmIHBhaXJzMSkgKExlYWYgcGFpcnMyKSBjaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIHt0cmVlID0gTm9kZSAocGFpcnMsIGNoaWxkcmVuKTsgcGFpcjsgdW5kZXJmbG93ID0gZmFsc2V9XG5cbiAgICAgICAgfCBMZWFmIHBhaXJzMSwgTGVhZiBwYWlyczIgLT5cbiAgICAgICAgICAgICgqIFNpYmxpbmcgaXMgbWluaW1hbCwgbWVyZ2UgKilcbiAgICAgICAgICAgIG1lcmdlX2xlYXZlcyBpIHBhaXIgcGFpcnMxIHBhaXJzMiBwYWlycyBjaGlsZHJlblxuXG4gICAgICAgIHwgTm9kZSAocGFpcnMxLCBjaGlsZHJlbjEpLCBOb2RlIChwYWlyczIsIGNoaWxkcmVuMilcbiAgICAgICAgICAgIHdoZW4gbm90X21pbmltYWwgcGFpcnMxIHBhaXJzMlxuICAgICAgICAgICAgLT5cbiAgICAgICAgICAgICgqIFNpYmxpbmcgaXMgbm90IG1pbmltYWwsIHJvdGF0ZSAqKVxuICAgICAgICAgICAgbGV0IHBhaXJzMSwgcGFpcnMsIHBhaXJzMiA9XG4gICAgICAgICAgICAgICAgcm90YXRlX2tleXMgdW5kZXJmbG93X2xlZnQgaSBwYWlyczEgcGFpcnMgcGFpcnMyXG4gICAgICAgICAgICBhbmQgY2hpbGRyZW4xLCBjaGlsZHJlbjIgPVxuICAgICAgICAgICAgICAgIHJvdGF0ZV9jaGlsZHJlbiB1bmRlcmZsb3dfbGVmdCBjaGlsZHJlbjEgY2hpbGRyZW4yXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuID1cbiAgICAgICAgICAgICAgICByZXBsYWNlMlxuICAgICAgICAgICAgICAgICAgICBpXG4gICAgICAgICAgICAgICAgICAgIChOb2RlIChwYWlyczEsIGNoaWxkcmVuMSkpXG4gICAgICAgICAgICAgICAgICAgIChOb2RlIChwYWlyczIsIGNoaWxkcmVuMikpXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAge3RyZWUgPSBOb2RlIChwYWlycywgY2hpbGRyZW4pOyBwYWlyOyB1bmRlcmZsb3cgPSBmYWxzZX1cblxuICAgICAgICB8IE5vZGUgKHBhaXJzMSwgY2hpbGRyZW4xKSwgTm9kZSAocGFpcnMyLCBjaGlsZHJlbjIpIC0+XG4gICAgICAgICAgICAoKiBTaWJsaW5nIGlzIG1pbmltYWwsIG1lcmdlICopXG4gICAgICAgICAgICBtZXJnZV9ub2Rlc1xuICAgICAgICAgICAgICAgIGkgcGFpclxuICAgICAgICAgICAgICAgIHBhaXJzMSBjaGlsZHJlbjFcbiAgICAgICAgICAgICAgICBwYWlyczIgY2hpbGRyZW4yXG4gICAgICAgICAgICAgICAgcGFpcnMgY2hpbGRyZW5cblxuICAgICAgICB8IF8sIF8gLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBDYW5ub3QgaGFwcGVuLCB0cmVlIGlzIGJhbGFuY2VkLiAqKVxuXG5cblxuICAgIGxldCBoYW5kbGVfZGVsZXRlXG4gICAgICAgICAgICAoaTogaW50KSAgICAgICAgICAgICAgICAoKiBJbmRleCBvZiB0aGUgY2hpbGQgd2hlcmUgdGhlIGRlbGV0aW9uIG9jY3VycmVkLiAqKVxuICAgICAgICAgICAgKHBhaXI6IEtleS50ICogJ2EpICAgICAgKCogVGhlIGRlbGV0ZWQga2V5IHZhbHVlIHBhaXIuICopXG4gICAgICAgICAgICAoZDogJ2EgZGVsZXRlKSAgICAgICAgICAoKiBUaGUgbmV3IHRyZWUgd2l0aCB0aGUga2V5IHZhbHVlIHBhaXIgZGVsZXRlZC4gKilcbiAgICAgICAgICAgIChwYWlyczogJ2EgcGFpcnMpICAgICAgICgqIFRoZSBrZXkgdmFsdWUgcGFpcnMgb2YgdGhlIHBhcmVudC4gKilcbiAgICAgICAgICAgIChjaGlsZHJlbjogJ2EgdCBhcnJheSkgICgqIFRoZSBjaGlsZHJlbiBvZiB0aGUgcGFyZW50LiAqKVxuICAgICAgICA6ICdhIGRlbGV0ZVxuICAgICAgICA9XG4gICAgICAgIGlmIG5vdCBkLnVuZGVyZmxvdyB0aGVuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHJlZSA9IE5vZGUgKHBhaXJzLCBBcnJheS5yZXBsYWNlIGkgZC50cmVlIGNoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICBwYWlyO1xuICAgICAgICAgICAgICAgIHVuZGVyZmxvdyA9IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGkgPCBsZW4gdGhlblxuICAgICAgICAgICAgICAgIGhhbmRsZV91bmRlcmZsb3cgaSB0cnVlIGQudHJlZSBjaGlsZHJlbi4oaSArIDEpIHBhaXIgcGFpcnMgY2hpbGRyZW5cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGkgLSAxIGluXG4gICAgICAgICAgICAgICAgaGFuZGxlX3VuZGVyZmxvdyBpIGZhbHNlIGNoaWxkcmVuLihpKSBkLnRyZWUgcGFpciBwYWlycyBjaGlsZHJlblxuXG5cblxuICAgIGxldCByZWMgcmVtb3ZlX2xhc3QgKG1hcDogJ2EgdCk6ICdhIGRlbGV0ZSA9XG4gICAgICAgIG1hdGNoIG1hcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycyAtPlxuICAgICAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgYXNzZXJ0ICgwIDwgbGVuKTtcbiAgICAgICAgICAgIGxldCBwYWlyICA9IEFycmF5Lmxhc3QgcGFpcnNcbiAgICAgICAgICAgIGFuZCBwYWlycyA9IEFycmF5LnJlbW92ZV9sYXN0IHBhaXJzXG4gICAgICAgICAgICBhbmQgdW5kZXJmbG93ID0gQXJyYXkubGVuZ3RoIHBhaXJzIDw9IG1pbl9rZXlzXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRyZWUgPSBMZWFmIHBhaXJzO1xuICAgICAgICAgICAgICAgIHBhaXI7XG4gICAgICAgICAgICAgICAgdW5kZXJmbG93XG4gICAgICAgICAgICB9XG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgbGV0IGxlbiA9IEFycmF5Lmxlbmd0aCBwYWlycyBpblxuICAgICAgICAgICAgYXNzZXJ0IChsZW4gKyAxID0gQXJyYXkubGVuZ3RoIGNoaWxkcmVuKTtcbiAgICAgICAgICAgIGxldCBkID0gcmVtb3ZlX2xhc3QgY2hpbGRyZW4uKGxlbikgaW5cbiAgICAgICAgICAgIGhhbmRsZV9kZWxldGUgbGVuIGQucGFpciBkIHBhaXJzIGNoaWxkcmVuXG5cblxuXG5cbiAgICBsZXQgcmVjIHJlbW92ZV9hdXggKGtleTogS2V5LnQpIChtYXA6ICdhIHQpOiAnYSBkZWxldGUgb3B0aW9uID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gIHBhaXJzLihpKVxuICAgICAgICAgICAgICAgIGFuZCBwYWlycyA9IEFycmF5LnJlbW92ZSBpIHBhaXJzXG4gICAgICAgICAgICAgICAgYW5kIHVuZGVyZmxvdyA9IEFycmF5Lmxlbmd0aCBwYWlycyA8PSBtaW5fa2V5c1xuICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgU29tZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyZWUgPSBMZWFmIHBhaXJzO1xuICAgICAgICAgICAgICAgICAgICBwYWlyO1xuICAgICAgICAgICAgICAgICAgICB1bmRlcmZsb3dcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgTm9uZVxuXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBsZXQgZCA9IHJlbW92ZV9sYXN0IGNoaWxkcmVuLihpKSBpblxuICAgICAgICAgICAgICAgIGxldCBwYWlyICA9IHBhaXJzLihpKVxuICAgICAgICAgICAgICAgIGFuZCBwYWlycyA9IEFycmF5LnJlcGxhY2UgaSBkLnBhaXIgcGFpcnMgaW5cbiAgICAgICAgICAgICAgICBTb21lIChoYW5kbGVfZGVsZXRlIGkgcGFpciBkIHBhaXJzIGNoaWxkcmVuKVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIE9wdGlvbi5tYXBcbiAgICAgICAgICAgICAgICAgICAgKGZ1biBkIC0+IGhhbmRsZV9kZWxldGUgaSBkLnBhaXIgZCBwYWlycyBjaGlsZHJlbilcbiAgICAgICAgICAgICAgICAgICAgKHJlbW92ZV9hdXgga2V5IGNoaWxkcmVuLihpKSlcblxuXG5cbiAgICBsZXQgcmVtb3ZlIChrZXk6IEtleS50KSAobWFwOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIG1hdGNoIHJlbW92ZV9hdXgga2V5IG1hcCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgbWFwXG4gICAgICAgIHwgU29tZSBkIC0+XG4gICAgICAgICAgICBtYXRjaCBkLnRyZWUgd2l0aFxuICAgICAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIHdoZW4gQXJyYXkuaXNfZW1wdHkgcGFpcnMgLT5cbiAgICAgICAgICAgICAgICAoKiB0cmVlIHNocmlua3MgYXQgdGhlIHJvb3QgKilcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi4oMClcbiAgICAgICAgICAgIHwgXyAtPlxuICAgICAgICAgICAgICAgIGQudHJlZVxuXG5cblxuXG4gICAgKCogVXBkYXRlXG4gICAgICogPT09PT09XG4gICAgICopXG5cbiAgICB0eXBlICdhIHVwZGF0ZSA9XG4gICAgICAgIHwgSW5zZXJ0IG9mICdhIGluc2VydFxuICAgICAgICB8IERlbGV0ZSBvZiAnYSBkZWxldGVcblxuXG4gICAgbGV0IHJlYyB1cGRhdGVfYXV4XG4gICAgICAgICAgICAoa2V5OiBLZXkudCkgKGY6ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIChtYXA6ICdhIHQpXG4gICAgICAgIDogJ2EgdXBkYXRlXG4gICAgICAgID1cbiAgICAgICAgbWF0Y2ggbWFwIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICBsZXQgaSwgZXhhY3QgPSBic2VhcmNoIGtleSBwYWlycyBpblxuICAgICAgICAgICAgaWYgZXhhY3QgdGhlblxuICAgICAgICAgICAgICAgIG1hdGNoIGYgKFNvbWUgKHNuZCBwYWlycy4oaSkpKSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWlycyA9IEFycmF5LnJlbW92ZSBpIHBhaXJzXG4gICAgICAgICAgICAgICAgICAgIGFuZCBwYWlyICA9IHBhaXJzLihpKVxuICAgICAgICAgICAgICAgICAgICBhbmQgdW5kZXJmbG93ID0gbWluX2tleXMgPSBBcnJheS5sZW5ndGggcGFpcnMgaW5cbiAgICAgICAgICAgICAgICAgICAgRGVsZXRlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyZWUgPSBMZWFmIHBhaXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvd31cbiAgICAgICAgICAgICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IChMZWFmIChBcnJheS5yZXBsYWNlIGkgKGtleSx2YWx1ZSkgcGFpcnMpKSlcbiAgICAgICAgICAgIGVsc2UgYmVnaW5cbiAgICAgICAgICAgICAgICBtYXRjaCBmIE5vbmUgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgbWFwKVxuICAgICAgICAgICAgICAgIHwgU29tZSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKGFkZF9pbl9sZWFmIGtleSB2YWx1ZSBwYWlycylcbiAgICAgICAgICAgIGVuZFxuXG4gICAgICAgIHwgTm9kZSAocGFpcnMsIGNoaWxkcmVuKSAtPlxuICAgICAgICAgICAgbGV0IGksIGV4YWN0ID0gYnNlYXJjaCBrZXkgcGFpcnMgaW5cbiAgICAgICAgICAgIGlmIGV4YWN0IHRoZW5cbiAgICAgICAgICAgICAgICBtYXRjaCBmIChTb21lIChzbmQgcGFpcnMuKGkpKSkgd2l0aFxuICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlbW92ZV9sYXN0IGNoaWxkcmVuLihpKSBpblxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFpciAgPSBwYWlycy4oaSlcbiAgICAgICAgICAgICAgICAgICAgYW5kIHBhaXJzID0gQXJyYXkucmVwbGFjZSBpIGQucGFpciBwYWlycyBpblxuICAgICAgICAgICAgICAgICAgICBEZWxldGUgKGhhbmRsZV9kZWxldGUgaSBwYWlyIGQgcGFpcnMgY2hpbGRyZW4pXG5cbiAgICAgICAgICAgICAgICB8IFNvbWUgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICAgICAgSW5zZXJ0IChOb3JtYWxfaW5zZXJ0IChOb2RlIChcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnJlcGxhY2UgaSAoa2V5LCB2YWx1ZSkgcGFpcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICApKSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBtYXRjaCB1cGRhdGVfYXV4IGtleSBmIGNoaWxkcmVuLihpKSB3aXRoXG4gICAgICAgICAgICAgICAgfCBJbnNlcnQgKE5vcm1hbF9pbnNlcnQgY2hpbGQpIC0+XG4gICAgICAgICAgICAgICAgICAgIEluc2VydCAoTm9ybWFsX2luc2VydCAoTm9kZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWlycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LnJlcGxhY2UgaSBjaGlsZCBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICApKSlcblxuICAgICAgICAgICAgICAgIHwgSW5zZXJ0IChTcGxpdF9pbnNlcnQgKHUsIHksIHYpKSAtPlxuICAgICAgICAgICAgICAgICAgICBJbnNlcnQgKGFkZF9pbl9ub2RlIGkgdSB5IHYgcGFpcnMgY2hpbGRyZW4pXG5cbiAgICAgICAgICAgICAgICB8IERlbGV0ZSBkIC0+XG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZSAoaGFuZGxlX2RlbGV0ZSBpIGQucGFpciBkIHBhaXJzIGNoaWxkcmVuKVxuXG5cblxuXG4gICAgbGV0IHVwZGF0ZSAoa2V5OiBLZXkudCkgKGY6ICdhIG9wdGlvbiAtPiAnYSBvcHRpb24pIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbWF0Y2ggdXBkYXRlX2F1eCBrZXkgZiBtYXAgd2l0aFxuICAgICAgICB8IEluc2VydCAoTm9ybWFsX2luc2VydCBtYXApIC0+XG4gICAgICAgICAgICBtYXBcblxuICAgICAgICB8IEluc2VydCAoU3BsaXRfaW5zZXJ0ICh1LCB5LCB2KSkgLT5cbiAgICAgICAgICAgIE5vZGUgKCBbfCB5IHxdLCBbfCB1OyB2IHxdIClcblxuICAgICAgICB8IERlbGV0ZSBkIC0+XG4gICAgICAgICAgICBtYXRjaCBkLnRyZWUgd2l0aFxuICAgICAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pIHdoZW4gQXJyYXkubGVuZ3RoIHBhaXJzID0gMCAtPlxuICAgICAgICAgICAgICAgICgqIHRyZWUgc2hyaW5rcyBhdCB0aGUgcm9vdCAqKVxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLigwKVxuICAgICAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICAgICAgZC50cmVlXG5cblxuXG5cblxuXG5cblxuICAgICgqIFN0cmVhbSBvZiBrZXkgdmFsdWUgcGFpcnNcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICopXG5cbiAgICB0eXBlICdhIGVudHJ5XG4gICAgICAgID1cbiAgICAgICAgJ2EgcGFpcnNcbiAgICAgICAgKiAnYSB0IGFycmF5XG4gICAgICAgICogaW50XG5cbiAgICB0eXBlICdhIHNvdXJjZSA9IHtcbiAgICAgICAgdG9wOlxuICAgICAgICAgICAgJ2EgdCAqIGludDsgICAgICAgICAoKiBub2RlL2xlYWYgYW5kIHBvc2l0aW9uIHdpdGhpbiB0aGUgbm9kZS9sZWFmICopXG5cbiAgICAgICAgc3RhY2s6ICdhIGVudHJ5IGxpc3Q7XG4gICAgfVxuXG5cbiAgICBsZXQgaGFzX21vcmUgKHNvdXJjZTogJ2Egc291cmNlKTogYm9vbCA9XG4gICAgICAgIG1hdGNoIHNvdXJjZS50b3Agd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMsIGkgLT5cbiAgICAgICAgICAgIGkgPCBBcnJheS5sZW5ndGggcGFpcnNcbiAgICAgICAgfCBOb2RlIChwYWlycywgXyApLCBpIC0+XG4gICAgICAgICAgICBpIDwgQXJyYXkubGVuZ3RoIHBhaXJzXG5cblxuICAgIGxldCBwZWVrIChzb3VyY2U6ICdhIHNvdXJjZSk6IEtleS50ICogJ2EgPVxuICAgICAgICBhc3NlcnQgKGhhc19tb3JlIHNvdXJjZSk7XG4gICAgICAgIG1hdGNoIHNvdXJjZS50b3Agd2l0aFxuICAgICAgICB8IExlYWYgcGFpcnMsIGkgLT5cbiAgICAgICAgICAgIHBhaXJzLihpKVxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBfICksIGkgLT5cbiAgICAgICAgICAgIHBhaXJzLihpKVxuXG5cblxuICAgIGxldCByZWMgZG93biAodHJlZTogJ2EgdCkgKHN0YWNrOiAnYSBlbnRyeSBsaXN0KTogJ2Egc291cmNlID1cbiAgICAgICAgKCogU2VhcmNoIGZvciB0aGUgZmlyc3Qga2V5IHZhbHVlIHBhaXIgb2YgW3RyZWVdLiAqKVxuICAgICAgICBtYXRjaCB0cmVlIHdpdGhcbiAgICAgICAgfCBMZWFmIHBhaXJzIC0+XG4gICAgICAgICAgICAoKiBXZSBhcmUgYWxyZWFkeSBvbiBhIGxlYWYuIFRoZSBuZXh0IGl0ZW0gaXMgdGhlIGZpcnN0IGtleSB2YWx1ZVxuICAgICAgICAgICAgICogcGFpci4gKilcbiAgICAgICAgICAgIHt0b3AgPSBMZWFmIHBhaXJzLCAwOyBzdGFja31cblxuICAgICAgICB8IE5vZGUgKHBhaXJzLCBjaGlsZHJlbikgLT5cbiAgICAgICAgICAgICgqIFNlYXJjaCB0aGUgZmlyc3Qga2V5IHZhbHVlIHBhaXIgaW4gdGhlIGZpcnN0IGNoaWxkLiBQdXNoIHRoZVxuICAgICAgICAgICAgICogZmlyc3Qga2V5IHZhbHVlIHBhaXIgb2YgdGhlIG5vZGUgb250byB0aGUgc3RhY2suICopXG4gICAgICAgICAgICBkb3duIGNoaWxkcmVuLigwKSAoKHBhaXJzLCBjaGlsZHJlbiwgMCkgOjogc3RhY2spXG5cblxuXG4gICAgbGV0IHJlYyB1cCAoc3RhY2s6ICdhIGVudHJ5IGxpc3QpOiAnYSBzb3VyY2UgPVxuICAgICAgICAoKiBTZWFyY2ggdGhlIHN0YWNrIGZvciBhIG5vZGUgd2hpY2ggaXMgcG9zaXRpb25lZCBvbiBhIGtleSB2YWx1ZSBwYWlyLlxuICAgICAgICAgKiAqKVxuICAgICAgICBtYXRjaCBzdGFjayB3aXRoXG4gICAgICAgIHwgW10gLT5cbiAgICAgICAgICAgIHt0b3AgPSBlbXB0eSwgMDsgc3RhY2sgPSBbXX1cbiAgICAgICAgfCAocGFpcnMsIGNoaWxkcmVuLCBpKSA6OiBzdGFjayAtPlxuICAgICAgICAgICAgaWYgaSA8IEFycmF5Lmxlbmd0aCBwYWlycyB0aGVuXG4gICAgICAgICAgICAgICAge3RvcCA9IE5vZGUgKHBhaXJzLCBjaGlsZHJlbiksIGk7IHN0YWNrfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHVwIHN0YWNrXG5cblxuICAgIGxldCBhZHZhbmNlIChzb3VyY2U6ICdhIHNvdXJjZSk6ICdhIHNvdXJjZSA9XG4gICAgICAgIGFzc2VydCAoaGFzX21vcmUgc291cmNlKTtcbiAgICAgICAgbWF0Y2ggc291cmNlLnRvcCB3aXRoXG4gICAgICAgIHwgTGVhZiBwYWlycywgaSAtPlxuICAgICAgICAgICAgaWYgaSArIDEgPCBBcnJheS5sZW5ndGggcGFpcnMgdGhlblxuICAgICAgICAgICAgICAgIHtzb3VyY2Ugd2l0aCB0b3AgPSBMZWFmIHBhaXJzLCBpICsgMX1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB1cCBzb3VyY2Uuc3RhY2tcbiAgICAgICAgfCBOb2RlIChwYWlycywgY2hpbGRyZW4pLCBpIC0+XG4gICAgICAgICAgICBhc3NlcnQgKGkgPCBBcnJheS5sZW5ndGggcGFpcnMpO1xuICAgICAgICAgICAgZG93blxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLihpICsgMSlcbiAgICAgICAgICAgICAgICAoKHBhaXJzLCBjaGlsZHJlbiwgaSArIDEpIDo6IHNvdXJjZS5zdGFjaylcblxuXG4gICAgbGV0IG1ha2Vfc291cmNlICh0cmVlOiAgJ2EgdCk6ICdhIHNvdXJjZSA9XG4gICAgICAgIGRvd24gdHJlZSBbXVxuXG5cblxuXG5cblxuICAgIG1vZHVsZSBTb3VyY2UgKFZhbHVlOiBJbnRlcmZhY2VzLkFOWSkgPSBzdHJ1Y3RcbiAgICAgICAgdHlwZSAnYSBtYXAgPSAnYSB0XG4gICAgICAgIHR5cGUgaXRlbSAgID0gS2V5LnQgKiBWYWx1ZS50XG5cbiAgICAgICAgdHlwZSB0ID0gVmFsdWUudCBzb3VyY2VcblxuICAgICAgICBsZXQgaGFzX21vcmUgPSBoYXNfbW9yZVxuICAgICAgICBsZXQgcGVlayAgICAgPSBwZWVrXG4gICAgICAgIGxldCBhZHZhbmNlICA9IGFkdmFuY2VcbiAgICAgICAgbGV0IG1ha2UgICAgID0gbWFrZV9zb3VyY2VcbiAgICBlbmRcbmVuZFxuXG5cblxuXG5cblxuXG5cbm1vZHVsZSBTZXQwIChPcmRlcjogT1JERVIpIChLZXk6IEludGVyZmFjZXMuU09SVEFCTEUpID0gc3RydWN0XG4gICAgbW9kdWxlIE1hcCA9IE1hcDAgKE9yZGVyKSAoS2V5KVxuXG4gICAgdHlwZSBpdGVtID0gS2V5LnRcblxuICAgIHR5cGUgdCA9IHVuaXQgTWFwLnRcblxuXG4gICAgbGV0IGlzX2VtcHR5ID0gTWFwLmlzX2VtcHR5XG5cblxuICAgIGxldCBjYXJkaW5hbCA9IE1hcC5jYXJkaW5hbFxuXG5cbiAgICBsZXQgZW1wdHkgPSBNYXAuZW1wdHlcblxuXG4gICAgbGV0IGZvbGRfbGVmdCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2EpIChzdGFydDogJ2EpIChzZXQ6IHQpOiAnYSA9XG4gICAgICAgIE1hcC5mb2xkX2xlZnRcbiAgICAgICAgICAgIChmdW4gYSBrZXkgXyAtPiBmIGEga2V5KVxuICAgICAgICAgICAgc3RhcnRcbiAgICAgICAgICAgIHNldFxuXG5cbiAgICBsZXQgZm9sZF9yaWdodCAoZjogJ2EgLT4gS2V5LnQgLT4gJ2EpIChzdGFydDogJ2EpIChzZXQ6IHQpOiAnYSA9XG4gICAgICAgIE1hcC5mb2xkX3JpZ2h0XG4gICAgICAgICAgICAoZnVuIGEga2V5IF8gLT4gZiBhIGtleSlcbiAgICAgICAgICAgIHN0YXJ0XG4gICAgICAgICAgICBzZXRcblxuXG4gICAgbGV0IG1lbSAoa2V5OiBLZXkudCkgKHNldDogdCk6IGJvb2wgPVxuICAgICAgICBtYXRjaCBNYXAuZmluZF9vcHQga2V5IHNldCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgIHRydWVcblxuXG4gICAgbGV0IGFkZCAoa2V5OiBLZXkudCkgKHNldDogdCk6IHQgPVxuICAgICAgICBNYXAuYWRkIGtleSAoKSBzZXRcblxuXG4gICAgbGV0IHJlbW92ZSAoa2V5OiBLZXkudCkgKHNldDogdCk6IHQgPVxuICAgICAgICBNYXAucmVtb3ZlIGtleSBzZXRcblxuXG4gICAgbGV0IGVsZW1lbnRzIChzZXQ6IHQpOiBLZXkudCBsaXN0ID1cbiAgICAgICAgTWFwLmtleXMgc2V0XG5cblxuXG4gICAgbW9kdWxlIFNvdXJjZSA9IHN0cnVjdFxuICAgICAgICB0eXBlIHNldCA9IHRcblxuICAgICAgICBtb2R1bGUgTSA9ICBNYXAuU291cmNlIChVbml0KVxuXG4gICAgICAgIHR5cGUgaXRlbSA9IEtleS50XG4gICAgICAgIHR5cGUgdCA9IE0udFxuXG4gICAgICAgIGxldCBoYXNfbW9yZSA9IE0uaGFzX21vcmVcblxuICAgICAgICBsZXQgcGVlayAoc291cmNlOiB0KTogS2V5LnQgPSBNLnBlZWsgc291cmNlIHw+IGZzdFxuXG4gICAgICAgIGxldCBhZHZhbmNlID0gTS5hZHZhbmNlXG5cbiAgICAgICAgbGV0IG1ha2UgPSBNLm1ha2VcbiAgICBlbmRcbmVuZFxuXG5cblxuXG5cblxuXG5cblxubW9kdWxlIE1hcCAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIE1hcDAgKE8zMikgKEtleSlcbmVuZFxuXG5cblxuXG5cblxuXG5cbm1vZHVsZSBTZXQgKEtleTogSW50ZXJmYWNlcy5TT1JUQUJMRSkgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBTZXQwIChPMzIpIChLZXkpXG5lbmRcblxuXG5cblxuXG5cblxuXG4oKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBVbml0IFRlc3RzXG4gKlxuICogd2l0aCBzZXRzXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubW9kdWxlIFNldF9vcmRlciAoT3JkZXI6IE9SREVSKSA9IHN0cnVjdFxuICAgIGluY2x1ZGUgU2V0MCAoT3JkZXIpIChJbnQpXG5cbiAgICBsZXQgZG9fdXB3YXJkIChmOiBpbnQgLT4gdCAtPiB0KSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICAgICAgbGV0IHJlYyBhY3Rpb24gaSBzZXQgPVxuICAgICAgICAgICAgaWYgaSA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICAgICAgc2V0XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWN0aW9uIChpICsgMSkgKGYgaSBzZXQpXG4gICAgICAgIGluXG4gICAgICAgIGFjdGlvbiBzdGFydCBzZXRcblxuICAgIGxldCBkb19kb3dud2FyZCAoZjogaW50IC0+IHQgLT4gdCkgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKHNldDogdCk6IHQgPVxuICAgICAgICBhc3NlcnQgKHN0YXJ0IDw9IGJleW9uZCk7XG4gICAgICAgIGxldCByZWMgYWN0aW9uIGkgc2V0ID1cbiAgICAgICAgICAgIGlmIGkgPSBzdGFydCB0aGVuXG4gICAgICAgICAgICAgICAgc2V0XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbGV0IGkgPSBpIC0gMSBpblxuICAgICAgICAgICAgICAgIGFjdGlvbiBpIChmIGkgc2V0KVxuICAgICAgICBpblxuICAgICAgICBhY3Rpb24gYmV5b25kIHNldFxuXG5cbiAgICBsZXQgYWRkX3Vwd2FyZCAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogdCA9XG4gICAgICAgIGRvX3Vwd2FyZCBhZGQgc3RhcnQgYmV5b25kIHNldFxuXG5cbiAgICBsZXQgYWRkX2Rvd253YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgZG9fZG93bndhcmQgYWRkIHN0YXJ0IGJleW9uZCBzZXRcblxuICAgIGxldCByZW1vdmVfdXB3YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgZG9fdXB3YXJkIHJlbW92ZSBzdGFydCBiZXlvbmQgc2V0XG5cbiAgICBsZXQgcmVtb3ZlX2Rvd253YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChzZXQ6IHQpOiB0ID1cbiAgICAgICAgZG9fZG93bndhcmQgcmVtb3ZlIHN0YXJ0IGJleW9uZCBzZXRcblxuICAgIGxldCBjaGVja19yYW5nZSAoc3RhcnQ6IGludCkgKGJleW9uZDogaW50KSAoc2V0OiB0KTogYm9vbCA9XG4gICAgICAgIGxldCBuLCBvayA9XG4gICAgICAgICAgICBmb2xkX2xlZnRcbiAgICAgICAgICAgICAgICAoZnVuIChpLCBvaykga2V5IC0+IGkgKyAxLCBvayAmJiBrZXkgPSBpKVxuICAgICAgICAgICAgICAgIChzdGFydCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICBzZXRcbiAgICAgICAgaW5cbiAgICAgICAgbiA9IGJleW9uZCAmJiBva1xuXG4gICAgbW9kdWxlIFNvdXJjZSA9IHN0cnVjdFxuICAgICAgICBpbmNsdWRlIFNvdXJjZVxuXG4gICAgICAgIGxldCB0b19saXN0IChzb3VyY2U6IHQpOiBpbnQgbGlzdCA9XG4gICAgICAgICAgICBsZXQgcmVjIHRvX2xpc3Qgc291cmNlIGFjY3UgPVxuICAgICAgICAgICAgICAgIGlmIGhhc19tb3JlIHNvdXJjZSB0aGVuXG4gICAgICAgICAgICAgICAgICAgIHRvX2xpc3QgKGFkdmFuY2Ugc291cmNlKSAocGVlayBzb3VyY2UgOjogYWNjdSlcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIExpc3QucmV2IGFjY3VcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICB0b19saXN0IHNvdXJjZSBbXVxuICAgIGVuZFxuZW5kXG5cblxubW9kdWxlIFNldDMgPSBTZXRfb3JkZXIgKHN0cnVjdCBsZXQgb3JkZXIgPSAzIGVuZClcbm1vZHVsZSBTZXQ0ID0gU2V0X29yZGVyIChzdHJ1Y3QgbGV0IG9yZGVyID0gNCBlbmQpXG5cbmxldCBzdHJpbmdfb2YgKGxzdDogaW50IGxpc3QpOiBzdHJpbmcgPVxuICAgIFwiW1wiXG4gICAgXlxuICAgIFN0cmluZy5jb25jYXRcbiAgICAgICAgXCIsIFwiXG4gICAgICAgIChMaXN0Lm1hcCBzdHJpbmdfb2ZfaW50IGxzdClcbiAgICBeXG4gICAgXCJdXCJcbmxldCBfID0gc3RyaW5nX29mXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG1vZHVsZSBNYXAgPSBNYXAgKEludCkgaW5cbiAgICBNYXAuKGNhcmRpbmFsIGVtcHR5KSA9IDBcblxuXG4oKiBJbnNlcnRpb24gKilcblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDQuKGFkZF91cHdhcmQgMTAwIDIwMCBlbXB0eSkgaW5cbiAgICBTZXQ0LmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQ0LihhZGRfZG93bndhcmQgMCAxMDAgZW1wdHkpIGluXG4gICAgU2V0NC5jaGVja19yYW5nZSAwIDEwMCBzZXRcblxuXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDMuKGFkZF91cHdhcmQgMTAwIDIwMCBlbXB0eSkgaW5cbiAgICBTZXQzLmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQzLihhZGRfZG93bndhcmQgMCAxMDAgZW1wdHkpIGluXG4gICAgU2V0My5jaGVja19yYW5nZSAwIDEwMCBzZXRcblxuXG5cblxuXG4oKiBEZWxldGlvbiAqKVxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQzLihhZGRfdXB3YXJkIDAgMjAwIGVtcHR5IHw+IHJlbW92ZV91cHdhcmQgMCAxMDApIGluXG4gICAgU2V0My5jaGVja19yYW5nZSAxMDAgMjAwIHNldFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBzZXQgPSBTZXQzLihhZGRfdXB3YXJkIDAgMjAwIGVtcHR5IHw+IHJlbW92ZV9kb3dud2FyZCAwIDEwMCkgaW5cbiAgICBTZXQzLmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDQuKGFkZF91cHdhcmQgMCAyMDAgZW1wdHkgfD4gcmVtb3ZlX3Vwd2FyZCAwIDEwMCkgaW5cbiAgICBTZXQ0LmNoZWNrX3JhbmdlIDEwMCAyMDAgc2V0XG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IHNldCA9IFNldDQuKGFkZF91cHdhcmQgMCAyMDAgZW1wdHkgfD4gcmVtb3ZlX2Rvd253YXJkIDAgMTAwKSBpblxuICAgIFNldDQuY2hlY2tfcmFuZ2UgMTAwIDIwMCBzZXRcblxuXG5cblxuXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVW5pdCBUZXN0c1xuICpcbiAqIHdpdGggbWFwc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbm1vZHVsZSBNYXBfb3JkZXIgKE9yZGVyOiBPUkRFUikgPSBzdHJ1Y3RcbiAgICBpbmNsdWRlIE1hcDAgKE9yZGVyKSAoSW50KVxuXG4gICAgbGV0IGRvX3Vwd2FyZFxuICAgICAgICAgICAgKGY6IGludCAtPiAnYSB0IC0+ICdhIHQpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChtYXA6ICdhIHQpXG4gICAgICAgIDogJ2EgdFxuICAgICAgICA9XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICAgICAgbGV0IHJlYyBhY3Rpb24gaSBtYXAgPVxuICAgICAgICAgICAgaWYgaSA9IGJleW9uZCB0aGVuXG4gICAgICAgICAgICAgICAgbWFwXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgYWN0aW9uIChpICsgMSkgKGYgaSBtYXApXG4gICAgICAgIGluXG4gICAgICAgIGFjdGlvbiBzdGFydCBtYXBcblxuICAgIGxldCBkb19kb3dud2FyZFxuICAgICAgICAgICAgKGY6IGludCAtPiAnYSB0IC0+ICdhIHQpIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChtYXA6ICdhIHQpXG4gICAgICAgIDogJ2EgdFxuICAgICAgICA9XG4gICAgICAgIGFzc2VydCAoc3RhcnQgPD0gYmV5b25kKTtcbiAgICAgICAgbGV0IHJlYyBhY3Rpb24gaSBtYXAgPVxuICAgICAgICAgICAgaWYgaSA9IHN0YXJ0IHRoZW5cbiAgICAgICAgICAgICAgICBtYXBcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsZXQgaSA9IGkgLSAxIGluXG4gICAgICAgICAgICAgICAgYWN0aW9uIGkgKGYgaSBtYXApXG4gICAgICAgIGluXG4gICAgICAgIGFjdGlvbiBiZXlvbmQgbWFwXG5cblxuICAgIGxldCBhZGRfdXB3YXJkIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChmOiBpbnQgLT4gJ2EpIChtYXA6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgZG9fdXB3YXJkIChmdW4gaSBtYXAgLT4gYWRkIGkgKGYgaSkgbWFwKSBzdGFydCBiZXlvbmQgbWFwXG5cblxuICAgIGxldCBhZGRfZG93bndhcmQgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKGY6IGludCAtPiAnYSkgKG1hcDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBkb19kb3dud2FyZCAoZnVuIGkgbWFwIC0+IGFkZCBpIChmIGkpIG1hcCkgc3RhcnQgYmV5b25kIG1hcFxuXG5cbiAgICBsZXQgdXBkYXRlX3Vwd2FyZFxuICAgICAgICAgICAgKHN0YXJ0OiBpbnQpIChiZXlvbmQ6IGludCkgKGY6IGludCAtPiAnYSBvcHRpb24gLT4gJ2Egb3B0aW9uKSAobWFwOiAnYSB0KVxuICAgICAgICA6ICdhIHRcbiAgICAgICAgPVxuICAgICAgICBkb191cHdhcmQgKGZ1biBpIG1hcCAtPiB1cGRhdGUgaSAoZiBpKSBtYXApIHN0YXJ0IGJleW9uZCBtYXBcblxuXG4gICAgbGV0IGNoZWNrX3JhbmdlIChzdGFydDogaW50KSAoYmV5b25kOiBpbnQpIChmOiBpbnQgLT4gJ2EpIChtYXA6ICdhIHQpOiBib29sID1cbiAgICAgICAgbGV0IG4sIG9rID1cbiAgICAgICAgICAgIGZvbGRfbGVmdFxuICAgICAgICAgICAgICAgIChmdW4gKGksIG9rKSBrZXkgdmFsdWUgLT4gaSArIDEsIG9rICYmIGYga2V5ID0gdmFsdWUpXG4gICAgICAgICAgICAgICAgKHN0YXJ0LCB0cnVlKVxuICAgICAgICAgICAgICAgIG1hcFxuICAgICAgICBpblxuICAgICAgICBuID0gYmV5b25kICYmIG9rXG5lbmRcblxuXG5tb2R1bGUgTWFwMyA9IE1hcF9vcmRlciAoc3RydWN0IGxldCBvcmRlciA9IDMgZW5kKVxuXG5cbigqIEluc2VydGlvbiAqKVxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IG1hcCA9IGFkZF91cHdhcmQgMCAxMDAgRnVuLmlkIGVtcHR5IGluXG4gICAgY2hlY2tfcmFuZ2UgMCAxMDAgRnVuLmlkIG1hcFxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IG1hcCA9IGFkZF9kb3dud2FyZCAwIDEwMCBGdW4uaWQgZW1wdHkgaW5cbiAgICBjaGVja19yYW5nZSAwIDEwMCBGdW4uaWQgbWFwXG5cblxuXG4oKiBVcGRhdGUgKilcblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBtYXAgPSB1cGRhdGVfdXB3YXJkIDAgMTAwIChmdW4gaSBfIC0+IFNvbWUgaSkgZW1wdHkgaW5cbiAgICBjaGVja19yYW5nZSAwIDEwMCBGdW4uaWQgbWFwXG5cblxubGV0JXRlc3QgXyA9XG4gICAgbGV0IG9wZW4gTWFwMyBpblxuICAgIGxldCBtYXAgPVxuICAgICAgICBhZGRfdXB3YXJkIDAgMTAwIEZ1bi5pZCBlbXB0eVxuICAgICAgICB8PlxuICAgICAgICB1cGRhdGVfdXB3YXJkIDAgMTAwIChmdW4gXyAtPiBPcHRpb24ubWFwIChmdW4gaSAtPiAyICogaSkpXG4gICAgaW5cbiAgICBjaGVja19yYW5nZSAwIDEwMCAoZnVuIGkgLT4gMiAqIGkpIG1hcFxuXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIE1hcDMgaW5cbiAgICBsZXQgbWFwID1cbiAgICAgICAgYWRkX3Vwd2FyZCAwIDEwMCBGdW4uaWQgZW1wdHlcbiAgICAgICAgfD5cbiAgICAgICAgdXBkYXRlX3Vwd2FyZCAwIDEwMCAoZnVuIF8gXyAtPiBOb25lKVxuICAgIGluXG4gICAgaXNfZW1wdHkgbWFwXG5cblxuXG5sZXQldGVzdCBfID1cbiAgICBsZXQgb3BlbiBNYXAzIGluXG4gICAgbGV0IGYgaSA9IGlmIGkgLyAyICogMiA9IGkgdGhlbiBpIGVsc2UgMiAqIGlcbiAgICBpblxuICAgIGxldCBtYXAgPVxuICAgICAgICBhZGRfdXB3YXJkIDAgMTAwIEZ1bi5pZCBlbXB0eVxuICAgICAgICB8PlxuICAgICAgICBhZGRfdXB3YXJkIDIwMCAzMDAgRnVuLmlkXG4gICAgICAgIHw+XG4gICAgICAgIHVwZGF0ZV91cHdhcmQgMCAxMDAgKGZ1biBfIC0+IE9wdGlvbi5tYXAgZilcbiAgICAgICAgfD5cbiAgICAgICAgdXBkYXRlX3Vwd2FyZCAxMDAgMjAwIChmdW4gaSBfIC0+IFNvbWUgKGYgaSkpXG4gICAgICAgIHw+XG4gICAgICAgIHVwZGF0ZV91cHdhcmQgMCAzMDBcbiAgICAgICAgICAgIChmdW4gaSAtPlxuICAgICAgICAgICAgICAgICBpZiBpIDwgMjAwIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgIE9wdGlvbi5tYXAgRnVuLmlkXG4gICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgIGZ1biBfIC0+IE5vbmUpXG4gICAgaW5cbiAgICBjaGVja19yYW5nZSAwIDIwMCBmIG1hcFxuXG5cblxuXG5cblxuKCogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogVW5pdCBUZXN0c1xuICpcbiAqIHdpdGggc3RyZWFtc1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbmxldCV0ZXN0IF8gPVxuICAgIGxldCBvcGVuIFNldDMgaW5cbiAgICBsZXQgbW9kdWxlIFNvdXJjZSA9IFNldDMuU291cmNlIGluXG4gICAgbGV0IHNldCA9IGFkZF91cHdhcmQgMCAyMCBlbXB0eSBpblxuICAgIFNvdXJjZS4obWFrZSBzZXQgfD4gdG9fbGlzdCkgPSBbMDsgMTsgMjsgMzsgNDsgNTsgNjsgNzsgODsgOTsgMTA7IDExOyAxMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOyAxNDsgMTU7IDE2OyAxNzsgMTg7IDE5XVxuIiwib3BlbiBKc19vZl9vY2FtbFxub3BlbiBGbWxpYl9zdGRcblxuXG5tb2R1bGUgVmFsdWUgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gSnMuVW5zYWZlLmFueVxuXG4gICAgbGV0IG51bGw6IHQgPVxuICAgICAgICBKcy4oVW5zYWZlLmluamVjdCBudWxsKVxuXG4gICAgbGV0IHVuZGVmaW5lZDogdCA9XG4gICAgICAgIEpzLihVbnNhZmUuaW5qZWN0IHVuZGVmaW5lZClcblxuICAgIGxldCBpbnQgKGk6IGludCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuaW5qZWN0IGlcblxuICAgIGxldCBmbG9hdCAodjogZmxvYXQpOiB0ID1cbiAgICAgICAgSnMuVW5zYWZlLmluamVjdCB2XG5cbiAgICBsZXQgYm9vbCAoYjogYm9vbCk6IHQgPVxuICAgICAgICBKcy4oVW5zYWZlLmNvZXJjZSAoYm9vbCBiKSlcblxuICAgIGxldCBzdHJpbmcgKHM6IHN0cmluZyk6IHQgPVxuICAgICAgICBKcy4oVW5zYWZlLmNvZXJjZSAoc3RyaW5nIHMpKVxuXG4gICAgbGV0IF9vYmplY3QgKGFycjogKHN0cmluZyAqIHQpIGFycmF5KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5vYmogYXJyXG5cbiAgICBsZXQgYXJyYXkgKGFycjogdCBhcnJheSk6IHQgPVxuICAgICAgICBKcy4oVW5zYWZlLmNvZXJjZSAoYXJyYXkgYXJyKSlcblxuICAgIGxldCBmdW5jdGlvbjEgKGY6IHQgLT4gdCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuaW5qZWN0IGZcblxuICAgIGxldCBmdW5jdGlvbjIgKGY6IHQgLT4gdCAtPiB0KTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5pbmplY3QgZlxuXG4gICAgbGV0IGZ1bmN0aW9uMyAoZjogdCAtPiB0IC0+IHQgLT4gdCk6IHQgPVxuICAgICAgICBKcy5VbnNhZmUuaW5qZWN0IGZcblxuXG4gICAgbGV0IHN0cmluZ2lmeSAodjogdCk6IHQgb3B0aW9uID1cbiAgICAgICAgdHJ5XG4gICAgICAgICAgICBTb21lIEpzLihVbnNhZmUuY29lcmNlIChfSlNPTiMjc3RyaW5naWZ5IHYpKVxuICAgICAgICB3aXRoIF8gLT5cbiAgICAgICAgICAgIE5vbmVcblxuICAgIGxldCBwYXJzZSAodjogdCk6IHQgb3B0aW9uID1cbiAgICAgICAgdHJ5XG4gICAgICAgICAgICBTb21lIEpzLihfSlNPTiMjcGFyc2UgKFVuc2FmZS5jb2VyY2UgdikpXG4gICAgICAgIHdpdGggXyAtPlxuICAgICAgICAgICAgTm9uZVxuZW5kXG5cblxuXG5cbm1vZHVsZSBEZWNvZGUgPVxuc3RydWN0XG4gICAgbGV0IHN0cl9ib29sZWFuOiBKcy5qc19zdHJpbmcgSnMudCA9XG4gICAgICAgIEpzLnN0cmluZyBcImJvb2xlYW5cIlxuXG4gICAgbGV0IHN0cl9mdW5jdGlvbjogSnMuanNfc3RyaW5nIEpzLnQgPVxuICAgICAgICBKcy5zdHJpbmcgXCJmdW5jdGlvblwiXG5cbiAgICBsZXQgc3RyX3N0cmluZzogSnMuanNfc3RyaW5nIEpzLnQgPVxuICAgICAgICBKcy5zdHJpbmcgXCJzdHJpbmdcIlxuXG4gICAgbGV0IHN0cl9udW1iZXI6IEpzLmpzX3N0cmluZyBKcy50ID1cbiAgICAgICAgSnMuc3RyaW5nIFwibnVtYmVyXCJcblxuICAgIGxldCBpc19mdW5jdGlvbiAodjogVmFsdWUudCk6IGJvb2wgPVxuICAgICAgICBKcy4odHlwZW9mIHYgPT0gc3RyX2Z1bmN0aW9uKVxuXG4gICAgbGV0IGlzX2Jvb2xlYW4gKHY6IFZhbHVlLnQpOiBib29sID1cbiAgICAgICAgSnMuKHR5cGVvZiB2ID09IHN0cl9ib29sZWFuKVxuXG4gICAgbGV0IGlzX3N0cmluZyAodjogVmFsdWUudCk6IGJvb2wgPVxuICAgICAgICBKcy4odHlwZW9mIHYgPT0gc3RyX3N0cmluZylcblxuICAgIGxldCBpc19udW1iZXIgKHY6IFZhbHVlLnQpOiBib29sID1cbiAgICAgICAgSnMuKHR5cGVvZiB2ID09IHN0cl9udW1iZXIpXG5cblxuICAgIHR5cGUgJ2EgdCA9IFZhbHVlLnQgLT4gJ2Egb3B0aW9uXG5cblxuICAgIGxldCByZXR1cm4gKGE6ICdhKTogJ2EgdCA9XG4gICAgICAgIGZ1biBfIC0+IFNvbWUgYVxuXG5cbiAgICBsZXQgZmFpbDogJ2EgdCA9XG4gICAgICAgIGZ1biBfIC0+IE5vbmVcblxuXG4gICAgbGV0IHZhbHVlOiBWYWx1ZS50IHQgPVxuICAgICAgICBmdW4gdiAtPiBTb21lIHZcblxuXG4gICAgbGV0IChsZXQqICkgKG06ICdhIHQpIChmOiAnYSAtPiAnYiB0KTogJ2IgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIE9wdGlvbi4oXG4gICAgICAgICAgICBsZXQqIGEgPSBtIHYgaW5cbiAgICAgICAgICAgIGYgYSB2XG4gICAgICAgIClcblxuXG4gICAgbGV0ICg+Pj0pID0gKGxldCogKVxuXG5cbiAgICBsZXQgKDwvPikgKHA6ICdhIHQpIChxOiAnYSB0KTogJ2EgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIG1hdGNoIHAgdiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgcSB2XG4gICAgICAgIHwgU29tZSBfIGFzIHIgLT5cbiAgICAgICAgICAgIHJcblxuXG4gICAgbGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChtOiAnYSB0KTogJ2IgdCA9XG4gICAgICAgIGxldCogYSA9IG0gaW5cbiAgICAgICAgcmV0dXJuIChmIGEpXG5cbiAgICBsZXQgbnVsbCAoYTogJ2EpOiAnYSB0ID1cbiAgICAgICAgZnVuIG9iaiAtPlxuICAgICAgICBpZiBvYmogPT0gVmFsdWUubnVsbCB0aGVuXG4gICAgICAgICAgICBTb21lIGFcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgdW5kZWZpbmVkIChhOiAnYSk6ICdhIHQgPVxuICAgICAgICBmdW4gb2JqIC0+XG4gICAgICAgIGlmIG9iaiA9PSBWYWx1ZS51bmRlZmluZWQgdGhlblxuICAgICAgICAgICAgU29tZSBhXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IGZsb2F0OiBmbG9hdCB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgaWYgaXNfbnVtYmVyIHYgdGhlblxuICAgICAgICAgICAgU29tZSAoSnMuKFVuc2FmZS5jb2VyY2UgdikjI3ZhbHVlT2YgKCkpXG4gICAgICAgICAgICAoKiBbdmFsdWVPZl0gcmV0dXJucyBhIHByaW1pdGl2ZSB2YWx1ZS4gKilcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgaW50OiBpbnQgdCA9XG4gICAgICAgIGxldCogdiA9IGZsb2F0IGluXG4gICAgICAgIGxldCBvcGVuIEZsb2F0IGluXG4gICAgICAgIGxldCBpID0gdG9faW50IHYgaW5cbiAgICAgICAgaWYgZXF1YWwgdiAob2ZfaW50IGkpIHRoZW5cbiAgICAgICAgICAgIHJldHVybiBpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZhaWxcblxuXG4gICAgbGV0IGJvb2w6IGJvb2wgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIGlmIGlzX2Jvb2xlYW4gdiB0aGVuXG4gICAgICAgICAgICBTb21lIEpzLihVbnNhZmUuY29lcmNlIHYgfD4gdG9fYm9vbClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgc3RyaW5nOiBzdHJpbmcgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIGlmIGlzX3N0cmluZyB2IHRoZW5cbiAgICAgICAgICAgIFNvbWUgSnMuKFVuc2FmZS5jb2VyY2UgdiB8PiB0b19zdHJpbmcpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IF9mdW5jdGlvbjogKFZhbHVlLnQgYXJyYXkgLT4gVmFsdWUudCkgdCA9XG4gICAgICAgIGZ1biB2IC0+XG4gICAgICAgIGlmIGlzX2Z1bmN0aW9uIHYgdGhlblxuICAgICAgICAgICAgU29tZSAoZnVuIGFyZ3MgLT4gSnMuVW5zYWZlLmZ1bl9jYWxsIHYgYXJncylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgX21ldGhvZDogKFZhbHVlLnQgLT4gVmFsdWUudCBhcnJheSAtPiBWYWx1ZS50KSB0ID1cbiAgICAgICAgZnVuIHYgLT5cbiAgICAgICAgaWYgaXNfZnVuY3Rpb24gdiB0aGVuXG4gICAgICAgICAgICBTb21lIChmdW4gb2JqIGFyZ3MgLT4gSnMuVW5zYWZlLmNhbGwgdiBvYmogYXJncylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgTm9uZVxuXG5cbiAgICBsZXQgZmllbGQgKG5hbWU6IHN0cmluZykgKGRlY29kZTogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBmdW4gb2JqIC0+XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIE9wdGlvbi4oXG4gICAgICAgICAgICBsZXQqIHYgPSBPcHRkZWYudG9fb3B0aW9uIChVbnNhZmUuZ2V0IG9iaiAoc3RyaW5nIG5hbWUpKSBpblxuICAgICAgICAgICAgZGVjb2RlIHZcbiAgICAgICAgKVxuXG5cbiAgICBsZXQgYXJyYXkgKGRlY29kZTogJ2EgdCk6ICdhIGFycmF5IHQgPVxuICAgICAgICBmdW4gb2JqIC0+XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIGlmIFVuc2FmZS5nbG9iYWwjIy5fQXJyYXkjI2lzQXJyYXkgb2JqIHRoZW5cbiAgICAgICAgICAgIGxldCBqc19hcnIgPSAoVW5zYWZlLmNvZXJjZSBvYmopIGluXG4gICAgICAgICAgICBsZXQgbGVuID0ganNfYXJyIyMubGVuZ3RoIGluXG4gICAgICAgICAgICBsZXQgcmVjIGV4dHJhY3QgaSBsc3QgPVxuICAgICAgICAgICAgICAgIGlmIGkgPSBsZW4gdGhlblxuICAgICAgICAgICAgICAgICAgICBTb21lIChBcnJheS5vZl9saXN0IChMaXN0LnJldiBsc3QpKVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW4gT3B0aW9uIGluXG4gICAgICAgICAgICAgICAgICAgIGxldCogZSA9IGFycmF5X2dldCBqc19hcnIgaSB8PiBPcHRkZWYudG9fb3B0aW9uIGluXG4gICAgICAgICAgICAgICAgICAgIGxldCogYSA9IGRlY29kZSBlIGluXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgKGkgKyAxKSAoYSA6OiBsc3QpXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgZXh0cmFjdCAwIFtdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIE5vbmVcblxuXG4gICAgbGV0IG9wdGlvbiAoZGVjb2RlOiAnYSB0KTogJ2Egb3B0aW9uIHQgPVxuICAgICAgICBtYXAgT3B0aW9uLnJldHVybiBkZWNvZGVcbiAgICAgICAgPC8+XG4gICAgICAgIG51bGwgTm9uZVxuXG5lbmRcblxuXG5cbm1vZHVsZSBNYWluID1cbnN0cnVjdFxuXG4gICAgKCogR2VuZXJhbCBmdW5jdGlvbnNcbiAgICAgKiA9PT09PT09PT09PT09PT09PVxuICAgICAqKVxuXG4gICAgdHlwZSBqc19lcnJvciA9IEpzLkpzX2Vycm9yLnRcblxuXG4gICAgbGV0IG9mX2V4Y2VwdGlvbiAoZXhuOiBleG4pOiBqc19lcnJvciBvcHRpb24gPVxuICAgICAgICBKcy5Kc19lcnJvci5vZl9leG4gZXhuXG5cblxuICAgIGxldCByYWlzZV9qc19lcnJvciAoanNfZXJyb3I6IGpzX2Vycm9yKTogJ2EgPVxuICAgICAgICBKcy5Kc19lcnJvci5yYWlzZV8ganNfZXJyb3JcblxuXG4gICAgbGV0IHJhaXNlX2pzIChtZXNzYWdlOiBzdHJpbmcpOiAnYSA9XG4gICAgICAgIGxldCBqc19tc2cgPSBKcy5zdHJpbmcgbWVzc2FnZSBpblxuICAgICAgICBKcy4oXG4gICAgICAgICAgICBuZXclanNcbiAgICAgICAgICAgICAgICBlcnJvcl9jb25zdHJcbiAgICAgICAgICAgICAgICBqc19tc2dcbiAgICAgICAgICAgIHw+IEpzX2Vycm9yLm9mX2Vycm9yXG4gICAgICAgICAgICB8PiBKc19lcnJvci5yYWlzZV9cbiAgICAgICAgKVxuXG5cblxuICAgIGxldCBsb2dfc3RyaW5nIChzdHI6IHN0cmluZyk6IHVuaXQgPVxuICAgICAgICBKcy4oVW5zYWZlLmdsb2JhbCMjLmNvbnNvbGUjI2xvZyAoc3RyaW5nIHN0cikpXG5cblxuICAgIGxldCBsb2dfdmFsdWUgKHZhbHVlOiBWYWx1ZS50KTogdW5pdCA9XG4gICAgICAgIEpzLihVbnNhZmUuZ2xvYmFsIyMuY29uc29sZSMjbG9nIHZhbHVlKVxuXG5cbiAgICBsZXQgZXhwb3J0IChvYmo6IChzdHJpbmcgKiBWYWx1ZS50KSBhcnJheSk6IHVuaXQgPVxuICAgICAgICBKcy5leHBvcnRfYWxsIChWYWx1ZS5fb2JqZWN0IG9iailcblxuXG4gICAgbGV0IG1ha2VfZ2xvYmFsIChuYW1lOiBzdHJpbmcpICh2OiBWYWx1ZS50KTogdW5pdCA9XG4gICAgICAgIEpzLihVbnNhZmUuKHNldCBnbG9iYWwgKEpzLnN0cmluZyBuYW1lKSB2KSlcblxuICAgIGxldCBnZXRfZ2xvYmFsIChuYW1lOiBzdHJpbmcpOiBWYWx1ZS50IG9wdGlvbiA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIFVuc2FmZS4oZ2V0IGdsb2JhbCAoSnMuc3RyaW5nIG5hbWUpKSB8PiBPcHQudG9fb3B0aW9uXG5cblxuICAgIGxldCBuZXdfZ2xvYmFsIChjbmFtZTogc3RyaW5nKSAoYXJnczogVmFsdWUudCBhcnJheSk6IFZhbHVlLnQgPVxuICAgICAgICBtYXRjaCBnZXRfZ2xvYmFsIGNuYW1lIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2VcbiAgICAgICAgfCBTb21lIGNvbnN0ciAtPlxuICAgICAgICAgICAgSnMuVW5zYWZlLm5ld19vYmogY29uc3RyIGFyZ3NcblxuXG5cbiAgICAoKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBOb2RlIG1vZHVsZSBhbmQgYnJvd3NlciBhcHBsaWNhdGlvblxuICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICopXG5cblxuICAgIGxldCBkZWNvZGVfY2FsbGJhY2sgKGNiOiBWYWx1ZS50KSAoZXJyOiBzdHJpbmcpOiBWYWx1ZS50IC0+IHVuaXQgPVxuICAgICAgICBtYXRjaCBEZWNvZGUuX2Z1bmN0aW9uIGNiIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICByYWlzZV9qcyBlcnJcbiAgICAgICAgfCBTb21lIGNiIC0+XG4gICAgICAgICAgICBmdW4gdiAtPiBjYiBbfHZ8XSB8PiBpZ25vcmVcblxuXG4gICAgbGV0IGRlY29kZV9kYXRhXG4gICAgICAgICAgICAoZGVjOiAnYSBEZWNvZGUudCkgKGRhdGE6IFZhbHVlLnQpIChlcnI6IHN0cmluZylcbiAgICAgICAgOiAnYVxuICAgICAgICA9XG4gICAgICAgIG1hdGNoIGRlYyBkYXRhIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICByYWlzZV9qcyBlcnJcbiAgICAgICAgfCBTb21lIHN0YXRlIC0+XG4gICAgICAgICAgICBzdGF0ZVxuXG5cblxuXG4gICAgKCogTm9kZSBtb2R1bGVcbiAgICAgKiA9PT09PT09PT09PVxuICAgICAqKVxuXG5cbiAgICB0eXBlICgnc3RhdGUsJ21zZykgbm9kZV9mdW5jdGlvbiA9XG4gICAgICAgICdzdGF0ZSAtPiAoVmFsdWUudCAtPiB1bml0KSAtPiAnbXNnIC0+IHVuaXRcblxuXG4gICAgbGV0IG5vZGVfbW9kdWxlXG4gICAgICAgICAgICAoZGVjb2RlOiAnc3RhdGUgRGVjb2RlLnQpXG4gICAgICAgICAgICAobXNnX2RlY29kZTogJ21zZyBEZWNvZGUudClcbiAgICAgICAgICAgIChub2RlX2Z1bmN0aW9uOiAoJ3N0YXRlLCAnbXNnKSBub2RlX2Z1bmN0aW9uKVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBsZXQganNfZnVuY3Rpb24gZGF0YSBjYWxsYmFjayA9XG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPVxuICAgICAgICAgICAgICAgIGRlY29kZV9jYWxsYmFjayBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBcInByb3ZpZGVkIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCJcbiAgICAgICAgICAgIGFuZCBkYXRhID1cbiAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YSBkZWNvZGUgZGF0YVxuICAgICAgICAgICAgICAgICAgICBcImNhbm5vdCBkZWNvZGUgaW5wdXQgZGF0YVwiXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IGYgPVxuICAgICAgICAgICAgICAgIG5vZGVfZnVuY3Rpb24gZGF0YSBjYWxsYmFja1xuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIFZhbHVlLmZ1bmN0aW9uMVxuICAgICAgICAgICAgICAgIChmdW4gbXNnIC0+XG4gICAgICAgICAgICAgICAgICAgICBtYXRjaCBtc2dfZGVjb2RlIG1zZyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfc3RyaW5nIFwiY2Fubm90IGRlY29kZSBtZXNzYWdlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgbG9nX3ZhbHVlIG1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBtc2cgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBmIG1zZztcbiAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWQpXG4gICAgICAgIGluXG4gICAgICAgIGV4cG9ydCBbfCBcImluaXRcIiwgVmFsdWUuZnVuY3Rpb24yIGpzX2Z1bmN0aW9uIHxdXG5cblxuXG5cblxuXG5cbiAgICAoKiBCcm93c2VyIEFwcGxpY2F0aW9uXG4gICAgICogPT09PT09PT09PT09PT09PT09PVxuICAgICAqKVxuXG5cbiAgICB0eXBlICgnc3RhdGUsICdtc2cpIGJyb3dzZXJfZnVuY3Rpb24gPVxuICAgICAgICAnc3RhdGUgLT4gc3RyaW5nIG9wdGlvbiAtPiAoVmFsdWUudCAtPiB1bml0KSAtPiAnbXNnIC0+IHVuaXRcblxuXG4gICAgbGV0IGJyb3dzZXJfYXBwbGljYXRpb25cbiAgICAgICAgICAgIChhcHBfbmFtZTogc3RyaW5nKVxuICAgICAgICAgICAgKHN0YXRlX2RlY29kZTogJ3N0YXRlIERlY29kZS50KVxuICAgICAgICAgICAgKG1zZ19kZWNvZGU6ICdtc2cgRGVjb2RlLnQpXG4gICAgICAgICAgICAoYnJvd3Nlcl9mdW5jdGlvbjogKCdzdGF0ZSwgJ21zZykgYnJvd3Nlcl9mdW5jdGlvbilcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgbGV0IGpzX2Z1bmN0aW9uIHN0YXRlIGVsZW1lbnQgY2FsbGJhY2sgPVxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID1cbiAgICAgICAgICAgICAgICBkZWNvZGVfY2FsbGJhY2sgY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgXCJwcm92aWRlZCBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiXG4gICAgICAgICAgICBhbmQgc3RhdGUgPVxuICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhIHN0YXRlX2RlY29kZSBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICBcImNhbm5vdCBkZWNvZGUgc3RhdGVcIlxuICAgICAgICAgICAgYW5kIGVsZW1lbnQgPVxuICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhIERlY29kZS4ob3B0aW9uIHN0cmluZykgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBcImNhbm5vdCBkZWNvZGUgYSBudWxsYWJsZSBlbGVtZW50IGlkXCJcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgZiA9XG4gICAgICAgICAgICAgICAgYnJvd3Nlcl9mdW5jdGlvbiBzdGF0ZSBlbGVtZW50IGNhbGxiYWNrXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgVmFsdWUuZnVuY3Rpb24xXG4gICAgICAgICAgICAgICAgKGZ1biBtc2cgLT5cbiAgICAgICAgICAgICAgICAgICAgIG1hdGNoIG1zZ19kZWNvZGUgbXNnIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19zdHJpbmcgXCJjYW5ub3QgZGVjb2RlIG1lc3NhZ2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfdmFsdWUgbXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgfCBTb21lIG1zZyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIGYgbXNnO1xuICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZClcbiAgICAgICAgaW5cbiAgICAgICAgbWFrZV9nbG9iYWxcbiAgICAgICAgICAgIGFwcF9uYW1lXG4gICAgICAgICAgICAoVmFsdWUuZnVuY3Rpb24zIGpzX2Z1bmN0aW9uKVxuZW5kXG4iLCJvcGVuIEpzX29mX29jYW1sXG5cblxuY2xhc3MgdHlwZSBldmVudCA9XG5vYmplY3RcbiAgICBtZXRob2Qgc3RvcFByb3BhZ2F0aW9uOiB1bml0IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCBwcmV2ZW50RGVmYXVsdDogIHVuaXQgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxudHlwZSB0ID0gZXZlbnQgSnMudFxuXG5sZXQgdmFsdWUgKGU6IHQpOiBCYXNlLlZhbHVlLnQgPVxuICAgIE9iai5tYWdpYyBlXG5cbmxldCBzdG9wX3Byb3BhZ2F0aW9uIChlOiB0KTogdW5pdCA9XG4gICAgZSMjc3RvcFByb3BhZ2F0aW9uICgpXG5cbmxldCBwcmV2ZW50X2RlZmF1bHQgKGU6IHQpOiB1bml0ID1cbiAgICBlIyNwcmV2ZW50RGVmYXVsdCAoKVxuIiwib3BlbiBKc19vZl9vY2FtbFxuXG50eXBlIGpzX3N0cmluZyA9IEpzLmpzX3N0cmluZyBKcy50XG5cbmNsYXNzIHR5cGUgZXZlbnRfdGFyZ2V0ID1cbm9iamVjdFxuICAgIG1ldGhvZCBhZGRFdmVudExpc3RlbmVyOiAgICBqc19zdHJpbmcgLT4gKCdhIC0+IHVuaXQpIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZW1vdmVFdmVudExpc3RlbmVyOiBqc19zdHJpbmcgLT4gKCdhIC0+IHVuaXQpIC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxudHlwZSB0ID0gZXZlbnRfdGFyZ2V0IEpzLnRcblxubGV0IGFkZCAobmFtZTogc3RyaW5nKSAoaGFuZGxlcjogRXZlbnQudCAtPiB1bml0KSAodGd0OiB0KTogdW5pdCA9XG4gICAgdGd0IyNhZGRFdmVudExpc3RlbmVyIChKcy5zdHJpbmcgbmFtZSkgaGFuZGxlclxuXG5sZXQgcmVtb3ZlIChuYW1lOiBzdHJpbmcpIChoYW5kbGVyOiBFdmVudC50IC0+IHVuaXQpICh0Z3Q6IHQpOiB1bml0ID1cbiAgICB0Z3QjI3JlbW92ZUV2ZW50TGlzdGVuZXIgKEpzLnN0cmluZyBuYW1lKSBoYW5kbGVyXG4iLCJvcGVuIEpzX29mX29jYW1sXG5cbnR5cGUgdGltZXJcbnR5cGUgaW50ZXJ2YWxcblxubGV0IHNldCAoZjogdW5pdCAtPiB1bml0KSAobXM6IGludCk6IHRpbWVyID1cbiAgICBKcy5VbnNhZmUuZ2xvYmFsIyNzZXRUaW1lb3V0IGYgbXNcblxubGV0IGNsZWFyICh0OiB0aW1lcik6IHVuaXQgPVxuICAgIEpzLlVuc2FmZS5nbG9iYWwjI2NsZWFyVGltZW91dCB0XG5cblxubGV0IHNldF9pbnRlcnZhbCAoZjogdW5pdCAtPiB1bml0KSAobXM6IGludCk6IGludGVydmFsID1cbiAgICBKcy5VbnNhZmUuZ2xvYmFsIyNzZXRJbnRlcnZhbCBmIG1zXG5cblxubGV0IGNsZWFyX2ludGVydmFsICh0OiBpbnRlcnZhbCk6IHVuaXQgPVxuICAgIEpzLlVuc2FmZS5nbG9iYWwjI2NsZWFySW50ZXJ2YWwgdFxuIiwib3BlbiBKc19vZl9vY2FtbFxub3BlbiBCYXNlXG5cblxuKCogSGVscGVyIGZ1bmN0aW9uc1xuICogPT09PT09PT09PT09PT09PVxuICopXG5cblxubGV0IGRlY29kZV9jYWxsYmFjayAoZXJyOiB1bml0IC0+IHN0cmluZykgKGNiOiBWYWx1ZS50KTogVmFsdWUudCAtPiB1bml0ID1cbiAgICBtYXRjaCBEZWNvZGUuX2Z1bmN0aW9uIGNiIHdpdGhcbiAgICB8IE5vbmUgLT5cbiAgICAgICAgTWFpbi5yYWlzZV9qcyAoZXJyICgpKVxuICAgIHwgU29tZSBjYiAtPlxuICAgICAgICBmdW4gdiAtPiBjYiBbfHZ8XSB8PiBpZ25vcmVcblxuXG5sZXQgc2VuZF9tZXNzYWdlXG4gICAgICAgIChlcnI6IHVuaXQgLT4gc3RyaW5nKVxuICAgICAgICAobXNnOiBWYWx1ZS50KSAoZGVjOiAnbXNnIERlY29kZS50KVxuICAgICAgICAoY2I6ICdtc2cgLT4gdW5pdClcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbWF0Y2ggZGVjIG1zZyB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICAgIGxldCBvcGVuIE1haW4gaW5cbiAgICAgICAgbG9nX3N0cmluZyAoZXJyICgpKTtcbiAgICAgICAgbG9nX3ZhbHVlIG1zZ1xuICAgIHwgU29tZSBtc2cgLT5cbiAgICAgICAgY2IgbXNnXG5cblxubGV0IGRvX2FzeW5jIChmOiB1bml0IC0+IHVuaXQpOiB1bml0ID1cbiAgICBUaW1lci5zZXQgZiAwIHw+IGlnbm9yZVxuXG5cblxuKCogQ3JlYXRvciBDb2RlXG4gICA9PT09PT09PT09PT1cbiopXG5cblxuXG5jbGFzcyB0eXBlIHdvcmtlciA9XG5vYmplY3RcbiAgICBtZXRob2QgcG9zdE1lc3NhZ2U6ICdtc2cgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHRlcm1pbmF0ZTogdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cbnR5cGUgdCA9IHdvcmtlciBKcy50XG5cblxubGV0IHN0YXJ0ICh1cmw6IHN0cmluZykgKGRlYzogJ21zZyBEZWNvZGUudCkgKGNiOiAnbXNnIC0+IHVuaXQpOiB0ID1cbiAgICBsZXQgb3BlbiBNYWluIGluXG4gICAgbGV0IHcgPVxuICAgICAgICBuZXdfZ2xvYmFsIFwiV29ya2VyXCIgW3xWYWx1ZS5zdHJpbmcgdXJsfF1cbiAgICBhbmQgY2IgZXZlbnQgPVxuICAgICAgICBzZW5kX21lc3NhZ2VcbiAgICAgICAgICAgIChmdW4gXyAtPiBcImNhbm5vdCBkZWNvZGUgbWVzc2FnZSBmcm9tIFwiIF4gdXJsIF4gXCJcXFwiXCIpXG4gICAgICAgICAgICAoRXZlbnQudmFsdWUgZXZlbnQpXG4gICAgICAgICAgICBkZWNcbiAgICAgICAgICAgIGNiXG4gICAgaW5cbiAgICBFdmVudF90YXJnZXQuYWRkIFwibWVzc2FnZVwiIGNiIChPYmoubWFnaWMgdyk7ICgqIFt3XSBpcyBhbiBldmVudCB0YXJnZXQuICopXG4gICAgT2JqLm1hZ2ljIHcgKCogW3ddIGlzIGEgd29ya2VyLCBiZWNhdXNlIGl0IGhhcyBiZWVuIGNvbnN0cnVjZWRcbiAgICAgICAgICAgICAgICAgICBieSBbV29ya2VyXS4gKilcblxuXG5cblxubGV0IHBvc3RfbWVzc2FnZSAobXNnOiBWYWx1ZS50KSAodzogdCk6IHVuaXQgPVxuICAgIHcjI3Bvc3RNZXNzYWdlIG1zZ1xuXG5cblxubGV0IHRlcm1pbmF0ZSAodzogdCk6IHVuaXQgPVxuICAgIHcjI3Rlcm1pbmF0ZVxuXG5cblxuXG4oKiBJbXBsZW1lbnRhdGlvbiBDb2RlXG4gICA9PT09PT09PT09PT09PT09PT09XG4qKVxuXG5cbnR5cGUgJ21zZyB3b3JrZXJfZnVuY3Rpb24gPSAoVmFsdWUudCAtPiB1bml0KSAtPiAnbXNnIC0+IHVuaXRcblxubGV0IG1ha2UgKGRlY29kZTogJ21zZyBEZWNvZGUudCkgKGY6ICdtc2cgd29ya2VyX2Z1bmN0aW9uKTogdW5pdCA9XG4gICAgbGV0IG9wZW4gTWFpbiBpblxuICAgIGxldCBwb3N0ID1cbiAgICAgICAgbWF0Y2ggZ2V0X2dsb2JhbCBcInBvc3RNZXNzYWdlXCIgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIHJhaXNlX2pzIFwid2Vid29ya2VyOiA8cG9zdE1lc3NhZ2U+IGZ1bmN0aW9uIG5vdCBhdmFpbGFibGVcIlxuICAgICAgICB8IFNvbWUgcG9zdCAtPlxuICAgICAgICAgICAgcG9zdFxuICAgIGluXG4gICAgbGV0IHBvc3QgPVxuICAgICAgICBkZWNvZGVfY2FsbGJhY2tcbiAgICAgICAgICAgIChmdW4gXyAtPiBcIndlYndvcmtlcjogPHBvc3RNZXNzYWdlPiBpcyBub3QgYSBmdW5jdGlvblwiKVxuICAgICAgICAgICAgcG9zdFxuICAgIGluXG4gICAgbGV0IGYgPSBmIHBvc3RcbiAgICBpblxuICAgIG1ha2VfZ2xvYmFsXG4gICAgICAgIFwib25tZXNzYWdlXCJcbiAgICAgICAgKFZhbHVlLmZ1bmN0aW9uMVxuICAgICAgICAgICAgIChmdW4gbXNnIC0+XG4gICAgICAgICAgICAgICAgICBzZW5kX21lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAoZnVuIF8gLT4gXCJ3ZWJ3b3JrZXI6IGNhbm5vdCBkZWNvZGUgbWVzc2FnZVwiKVxuICAgICAgICAgICAgICAgICAgICAgIG1zZ1xuICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVxuICAgICAgICAgICAgICAgICAgICAgIGY7XG4gICAgICAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWQpKVxuXG5cblxuXG5cblxuKCogU2ltdWxhdGlvblxuICogPT09PT09PT09PVxuICopXG5cblxubW9kdWxlIFNpbXVsYXRlID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IChWYWx1ZS50IC0+IHVuaXQpIG9wdGlvbiByZWZcblxuXG4gICAgbGV0IHN0YXJ0XG4gICAgICAgICAgICAoZGVjOiAncmN2IERlY29kZS50KSAoY2I6ICdyY3YgLT4gdW5pdClcbiAgICAgICAgICAgICh3b3JrZXJfZGVjb2RlOiAnbXNnIERlY29kZS50KSAod29ya2VyOiAnbXNnIHdvcmtlcl9mdW5jdGlvbilcbiAgICAgICAgOiB0XG4gICAgICAgID1cbiAgICAgICAgbGV0IHBvc3RfdG9fY3JlYXRvciB2ID1cbiAgICAgICAgICAgIHNlbmRfbWVzc2FnZVxuICAgICAgICAgICAgICAgIChmdW4gXyAtPiBcIm1haW46IGNhbm5vdCBkZWNvZGUgbWVzc2FnZSBmcm9tIHdvcmtlclwiKVxuICAgICAgICAgICAgICAgIHYgZGVjIGNiXG4gICAgICAgIGluXG4gICAgICAgIGxldCBwb3N0X3RvX2NyZWF0b3IgdiA9XG4gICAgICAgICAgICBkb19hc3luYyAoZnVuIF8gLT4gcG9zdF90b19jcmVhdG9yIHYpXG4gICAgICAgIGluXG4gICAgICAgIGxldCBmID0gd29ya2VyIHBvc3RfdG9fY3JlYXRvclxuICAgICAgICBpblxuICAgICAgICBsZXQgcG9zdF90b193b3JrZXIgdiA9XG4gICAgICAgICAgICBkb19hc3luY1xuICAgICAgICAgICAgICAgIChmdW4gXyAtPlxuICAgICAgICAgICAgICAgICAgICAgc2VuZF9tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZ1biBfIC0+IFwid2Vid29ya2VyOiBjYW5ub3QgZGVjb2RlIG1lc3NhZ2VcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICB2IHdvcmtlcl9kZWNvZGUgZilcbiAgICAgICAgaW5cbiAgICAgICAgcmVmIChTb21lIHBvc3RfdG9fd29ya2VyKVxuXG5cbiAgICBsZXQgcG9zdF9tZXNzYWdlIChtc2c6IFZhbHVlLnQpICh3OiB0KTogdW5pdCA9XG4gICAgICAgIG1hdGNoICF3IHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJ3b3JrZXIgaGFzIGFscmVhZHkgYmVlbiB0ZXJtaW5hdGVkXCJcbiAgICAgICAgfCBTb21lIHBvc3QgLT5cbiAgICAgICAgICAgIHBvc3QgbXNnXG5cblxuICAgIGxldCB0ZXJtaW5hdGUgKHc6IHQpOiB1bml0ID1cbiAgICAgICAgdyA6PSBOb25lXG5lbmRcblxuXG5cblxuXG5sZXQgc2ltdWxhdGVfanNcbiAgICAgICAgKG5hbWU6IHN0cmluZylcbiAgICAgICAgKGRlY29kZTogJ21zZyBEZWNvZGUudClcbiAgICAgICAgKHdmdW46ICdtc2cgd29ya2VyX2Z1bmN0aW9uKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBsZXQgb3BlbiBNYWluIGluXG4gICAgKGZ1biBwb3N0IC0+XG4gICAgICAgICBsZXQgcG9zdF90b19jcmVhdG9yID1cbiAgICAgICAgICAgICBkZWNvZGVfY2FsbGJhY2tcbiAgICAgICAgICAgICAgICAgKGZ1biBfIC0+IFwid2Vid29ya2VyOiA8cG9zdE1lc3NhZ2U+IGlzIG5vdCBhIGZ1bnRpb25cIilcbiAgICAgICAgICAgICAgICAgcG9zdFxuICAgICAgICAgaW5cbiAgICAgICAgIGxldCB3ID1cbiAgICAgICAgICAgICBTaW11bGF0ZS5zdGFydFxuICAgICAgICAgICAgICAgICAoZnVuIHYgLT4gRGVjb2RlLnJldHVybiB2IHYpXG4gICAgICAgICAgICAgICAgIHBvc3RfdG9fY3JlYXRvclxuICAgICAgICAgICAgICAgICBkZWNvZGVcbiAgICAgICAgICAgICAgICAgd2Z1blxuICAgICAgICAgaW5cbiAgICAgICAgIGxldCBwb3N0X3RvX3dvcmtlciBtc2cgPVxuICAgICAgICAgICAgICBTaW11bGF0ZS5wb3N0X21lc3NhZ2UgbXNnIHc7XG4gICAgICAgICAgICAgIFZhbHVlLnVuZGVmaW5lZFxuICAgICAgICAgYW5kIHRlcm1pbmF0ZSBfID1cbiAgICAgICAgICAgICBTaW11bGF0ZS50ZXJtaW5hdGUgdztcbiAgICAgICAgICAgICBWYWx1ZS51bmRlZmluZWRcbiAgICAgICAgIGluXG4gICAgICAgICBWYWx1ZS5fb2JqZWN0IFt8XG4gICAgICAgICAgICAgXCJwb3N0TWVzc2FnZVwiLCBWYWx1ZS5mdW5jdGlvbjEgcG9zdF90b193b3JrZXI7XG4gICAgICAgICAgICAgXCJ0ZXJtaW5hdGVcIiwgICBWYWx1ZS5mdW5jdGlvbjEgdGVybWluYXRlXG4gICAgICAgICB8XVxuICAgIClcbiAgICB8PiBWYWx1ZS5mdW5jdGlvbjFcbiAgICB8PiBtYWtlX2dsb2JhbCBuYW1lXG4iLCJvcGVuIEpzX29mX29jYW1sXG5cbnR5cGUganNfc3RyaW5nID0gSnMuanNfc3RyaW5nIEpzLnRcblxuY2xhc3MgdHlwZSB4bWxIdHRwUmVxdWVzdCA9XG5vYmplY3RcbiAgICBtZXRob2Qgb3Blbl86IGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5cbiAgICBtZXRob2Qgc2V0UmVxdWVzdEhlYWRlcjoganNfc3RyaW5nIC0+IGpzX3N0cmluZyAtPiB1bml0IEpzLm1ldGhcblxuICAgIG1ldGhvZCBzZW5kX3N0cmluZzoganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIHJlYWR5U3RhdGU6IGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgKCpcbiAgICAgICAgMDogcmVxdWVzdCBub3QgaW5pdGlhbGl6ZWRcbiAgICAgICAgMTogb3BlbiBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgMjogc2VuZCBoYXMgYmVlbiBjYWxsZWRcbiAgICAgICAgMzogbG9hZGluZ1xuICAgICAgICA0OiBjb21wbGV0ZVxuICAgICopXG5cbiAgICBtZXRob2Qgc3RhdHVzOiBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgICgqIDIwMDogT2ssIDQwMzogZm9yYmlkZGVuLCA0MDQ6IG5vdCBmb3VuZC4gKilcblxuICAgIG1ldGhvZCBzdGF0dXNUZXh0OiBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuXG4gICAgbWV0aG9kIHJlc3BvbnNlVGV4dDoganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbmVuZFxuXG5cbnR5cGUgdCA9IHhtbEh0dHBSZXF1ZXN0IEpzLnRcblxuXG5sZXQgZXZlbnRfdGFyZ2V0IChyZXE6IHQpOiBFdmVudF90YXJnZXQudCA9XG4gICAgT2JqLm1hZ2ljIHJlcVxuXG5cbmxldCBtYWtlXG4gICAgICAgIChfbWV0aG9kOiBzdHJpbmcpXG4gICAgICAgICh1cmw6IHN0cmluZylcbiAgICAgICAgKGhlYWRlcnM6IChzdHJpbmcgKiBzdHJpbmcpIGxpc3QpXG4gICAgICAgIChib2R5OiBzdHJpbmcpXG4gICAgOiB0XG4gICAgPVxuICAgIGxldCByZXE6IHhtbEh0dHBSZXF1ZXN0IEpzLnQgPVxuICAgICAgICBsZXQgcmVxdWVzdCA9IEpzLlVuc2FmZS5nbG9iYWwjIy5fWE1MSHR0cFJlcXVlc3RcbiAgICAgICAgaW5cbiAgICAgICAgbmV3JWpzIHJlcXVlc3RcbiAgICBpblxuICAgIHJlcSMjb3Blbl8gKEpzLnN0cmluZyBfbWV0aG9kKSAoSnMuc3RyaW5nIHVybCk7XG4gICAgTGlzdC5pdGVyXG4gICAgICAgIChmdW4gKG5hbWUsIHZhbHVlKSAtPlxuICAgICAgICAgICAgIHJlcSMjc2V0UmVxdWVzdEhlYWRlciAoSnMuc3RyaW5nIG5hbWUpIChKcy5zdHJpbmcgdmFsdWUpXG4gICAgICAgIClcbiAgICAgICAgaGVhZGVycztcbiAgICByZXEjI3NlbmRfc3RyaW5nIChKcy5zdHJpbmcgYm9keSk7XG4gICAgcmVxXG5cblxubGV0IHJlYWR5X3N0YXRlIChyZXE6IHQpOiBpbnQgPVxuICAgIHJlcSMjLnJlYWR5U3RhdGVcblxuXG5sZXQgc3RhdHVzIChyZXE6IHQpOiBpbnQgPVxuICAgIHJlcSMjLnN0YXR1c1xuXG5cbmxldCByZXNwb25zZV90ZXh0X3ZhbHVlIChyZXE6IHQpOiBCYXNlLlZhbHVlLnQgPVxuICAgIE9iai5tYWdpYyByZXEjIy5yZXNwb25zZVRleHRcblxuXG5sZXQgcmVzcG9uc2VfdGV4dF9zdHJpbmcgKHJlcTogdCk6IHN0cmluZyA9XG4gICAgSnMudG9fc3RyaW5nIHJlcSMjLnJlc3BvbnNlVGV4dFxuIiwib3BlbiBKc19vZl9vY2FtbFxub3BlbiBCYXNlXG5cbnR5cGUganNfc3RyaW5nID0gSnMuanNfc3RyaW5nIEpzLnRcblxuXG5cbmNsYXNzIHR5cGUgc3R5bGUgPVxub2JqZWN0XG4gICAgbWV0aG9kIHNldFByb3BlcnR5OiAgICBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCByZW1vdmVQcm9wZXJ0eToganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cbmNsYXNzIHR5cGUgbm9kZSA9XG5vYmplY3RcbiAgICBtZXRob2QgcGFyZW50Tm9kZTogIG5vZGUgSnMudCBKcy5PcHQudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGZpcnN0Q2hpbGQ6ICBub2RlIEpzLnQgSnMuT3B0LnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBuZXh0U2libGluZzogbm9kZSBKcy50IEpzLk9wdC50IEpzLnJlYWRvbmx5X3Byb3BcblxuICAgIG1ldGhvZCBhcHBlbmRDaGlsZDogIG5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2QgcmVtb3ZlQ2hpbGQ6ICBub2RlIEpzLnQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlcGxhY2VDaGlsZDogbm9kZSBKcy50IC0+IG5vZGUgSnMudCAtPiB1bml0IEpzLm1ldGhcbiAgICBtZXRob2Qgbm9kZVZhbHVlOiAgICBqc19zdHJpbmcgSnMucHJvcFxuZW5kXG5cblxuXG5cblxuXG5cbmNsYXNzIHR5cGUgZWxlbWVudCA9XG5vYmplY3RcbiAgICBtZXRob2Qgc2Nyb2xsV2lkdGg6ICAgICBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBzY3JvbGxIZWlnaHQ6ICAgIGludCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIGNsaWVudFdpZHRoOiAgICAgaW50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgY2xpZW50SGVpZ2h0OiAgICBpbnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBzY3JvbGxMZWZ0OiAgICAgIGludCBKcy5wcm9wXG4gICAgbWV0aG9kIHNjcm9sbFRvcDogICAgICAgaW50IEpzLnByb3BcblxuICAgIG1ldGhvZCBzdHlsZTogICAgICAgICAgIHN0eWxlIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBzZXRBdHRyaWJ1dGU6ICAgIGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlbW92ZUF0dHJpYnV0ZToganNfc3RyaW5nIC0+IHVuaXQgSnMubWV0aFxuXG4gICAgbWV0aG9kIGZvY3VzOiB1bml0IC0+IHVuaXQgSnMubWV0aFxuICAgIG1ldGhvZCBibHVyOiAgdW5pdCAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5cblxuY2xhc3MgdHlwZSBkb2N1bWVudCA9XG5vYmplY3RcbiAgICBtZXRob2QgdGl0bGU6ICAgICAgICAgIGpzX3N0cmluZyBKcy5wcm9wXG4gICAgbWV0aG9kIGJvZHk6ICAgICAgICAgICBlbGVtZW50IEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBnZXRFbGVtZW50QnlJZDoganNfc3RyaW5nIC0+IGVsZW1lbnQgSnMudCBKcy5PcHQudCBKcy5tZXRoXG4gICAgbWV0aG9kIGNyZWF0ZVRleHROb2RlOiBqc19zdHJpbmcgLT4gbm9kZSBKcy50IEpzLm1ldGhcbiAgICBtZXRob2QgY3JlYXRlRWxlbWVudDogIGpzX3N0cmluZyAtPiBlbGVtZW50IEpzLnQgSnMubWV0aFxuICAgIG1ldGhvZCBjcmVhdGVFbGVtZW50TlM6ICBqc19zdHJpbmcgLT4ganNfc3RyaW5nIC0+IGVsZW1lbnQgSnMudCBKcy5tZXRoXG4gICAgbWV0aG9kIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQ6ICB1bml0IC0+IG5vZGUgSnMudCBKcy5tZXRoXG5lbmRcblxuXG5cblxuXG5jbGFzcyB0eXBlIGhpc3RvcnkgPVxub2JqZWN0XG4gICAgbWV0aG9kIGdvOiBpbnQgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHB1c2hTdGF0ZTogICAgQmFzZS5WYWx1ZS50IC0+IGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlcGxhY2VTdGF0ZTogQmFzZS5WYWx1ZS50IC0+IGpzX3N0cmluZyAtPiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG5lbmRcblxuXG5cblxuY2xhc3MgdHlwZSBsb2NhdGlvbiA9XG5vYmplY3RcbiAgICBtZXRob2QgaHJlZjogICAgICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHByb3RvY29sOiAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBob3N0OiAgICAgICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgcG9ydDogICAgICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHBhdGhuYW1lOiAgICBqc19zdHJpbmcgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBzZWFyY2g6ICAgICAganNfc3RyaW5nIEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgaGFzaDogICAgICAgIGpzX3N0cmluZyBKcy5yZWFkb25seV9wcm9wXG5cbiAgICBtZXRob2QgYXNzaWduOiBqc19zdHJpbmcgLT4gdW5pdCBKcy5tZXRoXG4gICAgbWV0aG9kIHJlbG9hZDogdW5pdCAtPiB1bml0IEpzLm1ldGhcbmVuZFxuXG5cblxuXG5cbmNsYXNzIHR5cGUgd2luZG93ID1cbm9iamVjdFxuICAgIG1ldGhvZCBoaXN0b3J5OiAgaGlzdG9yeSBKcy50IEpzLnJlYWRvbmx5X3Byb3BcbiAgICBtZXRob2QgbG9jYXRpb246IGxvY2F0aW9uIEpzLnQgSnMucmVhZG9ubHlfcHJvcFxuICAgIG1ldGhvZCBkb2N1bWVudDogZG9jdW1lbnQgSnMudCBKcy5yZWFkb25seV9wcm9wXG4gICAgbWV0aG9kIHJlcXVlc3RBbmltYXRpb25GcmFtZTogKGZsb2F0IC0+IHVuaXQpIC0+IHVuaXQgSnMubWV0aFxuZW5kXG5cblxuXG5cblxuXG5tb2R1bGUgU3R5bGUgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gc3R5bGUgSnMudFxuXG4gICAgbGV0IHNldCAobmFtZTogc3RyaW5nKSAodmFsdWU6IHN0cmluZykgKHM6IHQpOiB1bml0ID1cbiAgICAgICAgcyMjc2V0UHJvcGVydHkgKEpzLnN0cmluZyBuYW1lKSAoSnMuc3RyaW5nIHZhbHVlKVxuXG4gICAgbGV0IHJlbW92ZSAobmFtZTogc3RyaW5nKSAoczogdCk6IHVuaXQgPVxuICAgICAgICBzIyNyZW1vdmVQcm9wZXJ0eSAoSnMuc3RyaW5nIG5hbWUpXG5lbmRcblxuXG5cblxubW9kdWxlIE5vZGUgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gbm9kZSBKcy50XG5cbiAgICBsZXQgZXZlbnRfdGFyZ2V0IChub2RlOiB0KTogRXZlbnRfdGFyZ2V0LnQgPVxuICAgICAgICBPYmoubWFnaWMgbm9kZVxuXG4gICAgbGV0IHBhcmVudCAobm9kZTogdCk6IHQgb3B0aW9uID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgT3B0LnRvX29wdGlvbiBub2RlIyMucGFyZW50Tm9kZVxuXG4gICAgbGV0IGZpcnN0IChub2RlOiB0KTogdCBvcHRpb24gPVxuICAgICAgICBsZXQgb3BlbiBKcyBpblxuICAgICAgICBPcHQudG9fb3B0aW9uIG5vZGUjIy5maXJzdENoaWxkXG5cbiAgICBsZXQgbmV4dCAobm9kZTogdCk6IHQgb3B0aW9uID1cbiAgICAgICAgbGV0IG9wZW4gSnMgaW5cbiAgICAgICAgT3B0LnRvX29wdGlvbiBub2RlIyMubmV4dFNpYmxpbmdcblxuICAgIGxldCBhcHBlbmQgKGNoaWxkOiB0KSAobm9kZTogdCk6IHVuaXQgPVxuICAgICAgICBhc3NlcnQgKG5vdCAobm9kZSA9PSBPYmoubWFnaWMgVmFsdWUubnVsbCkpO1xuICAgICAgICBub2RlIyNhcHBlbmRDaGlsZCBjaGlsZFxuXG4gICAgbGV0IHJlbW92ZSAoY2hpbGQ6IHQpIChub2RlOiB0KTogdW5pdCA9XG4gICAgICAgIG5vZGUjI3JlbW92ZUNoaWxkIGNoaWxkXG5cbiAgICBsZXQgcmVwbGFjZSAobmV3X2NoaWxkOiB0KSAob2xkX2NoaWxkOiB0KSAobm9kZTogdCk6IHVuaXQgPVxuICAgICAgICBub2RlIyNyZXBsYWNlQ2hpbGQgbmV3X2NoaWxkIG9sZF9jaGlsZFxuXG4gICAgbGV0IHJlYyByZW1vdmVfY2hpbGRyZW4gKHBhcmVudDogdCk6IHVuaXQgPVxuICAgICAgICBtYXRjaCBmaXJzdCBwYXJlbnQgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICgpXG4gICAgICAgIHwgU29tZSBjaGlsZCAtPlxuICAgICAgICAgICAgcmVtb3ZlIGNoaWxkIHBhcmVudDtcbiAgICAgICAgICAgIHJlbW92ZV9jaGlsZHJlbiBwYXJlbnQgKCogdGFpbCByZWN1cnNpb24sIGNvbXBpbGVkIHRvIGphdmFzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcC4gKilcblxuICAgIGxldCBub2RlX3ZhbHVlIChub2RlOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIG5vZGUjIy5ub2RlVmFsdWVcblxuICAgIGxldCBzZXRfbm9kZV92YWx1ZSAodmFsdWU6IHN0cmluZykgKG5vZGU6IHQpOiB1bml0ID1cbiAgICAgICAgbm9kZSMjLm5vZGVWYWx1ZSA6PSAoSnMuc3RyaW5nIHZhbHVlKVxuZW5kXG5cblxuXG5cblxuXG5cbm1vZHVsZSBFbGVtZW50ID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IGVsZW1lbnQgSnMudFxuXG4gICAgbGV0IG5vZGUgKGVsZW1lbnQ6IHQpOiBOb2RlLnQgPVxuICAgICAgICBKcy5VbnNhZmUuY29lcmNlIGVsZW1lbnRcblxuICAgIGxldCBzY3JvbGxfd2lkdGggKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsV2lkdGhcblxuICAgIGxldCBzY3JvbGxfaGVpZ2h0IChlbGVtZW50OiB0KTogaW50ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbEhlaWdodFxuXG4gICAgbGV0IGNsaWVudF93aWR0aCAoZWxlbWVudDogdCk6IGludCA9XG4gICAgICAgIGVsZW1lbnQjIy5jbGllbnRXaWR0aFxuXG4gICAgbGV0IGNsaWVudF9oZWlnaHQgKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuY2xpZW50SGVpZ2h0XG5cbiAgICBsZXQgc2Nyb2xsX2xlZnQgKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsTGVmdFxuXG4gICAgbGV0IHNjcm9sbF90b3AgKGVsZW1lbnQ6IHQpOiBpbnQgPVxuICAgICAgICBlbGVtZW50IyMuc2Nyb2xsVG9wXG5cblxuICAgIGxldCBzZXRfc2Nyb2xsX2xlZnQgKHY6IGludCkgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgZWxlbWVudCMjLnNjcm9sbExlZnQgOj0gdlxuXG4gICAgbGV0IHNldF9zY3JvbGxfdG9wICh2OiBpbnQpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjIy5zY3JvbGxUb3AgOj0gdlxuXG5cblxuXG4gICAgbGV0IHN0eWxlIChlbGVtZW50OiB0KTogU3R5bGUudCA9XG4gICAgICAgIGVsZW1lbnQjIy5zdHlsZVxuXG4gICAgbGV0IHNldF9hdHRyaWJ1dGUgKG5hbWU6IHN0cmluZykgKHZhbHVlOiBzdHJpbmcpIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjI3NldEF0dHJpYnV0ZSAoSnMuc3RyaW5nIG5hbWUpIChKcy5zdHJpbmcgdmFsdWUpXG5cbiAgICBsZXQgcmVtb3ZlX2F0dHJpYnV0ZSAobmFtZTogc3RyaW5nKSAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyNyZW1vdmVBdHRyaWJ1dGUgKEpzLnN0cmluZyBuYW1lKVxuXG5cbiAgICBsZXQgc2V0X3Byb3BlcnR5IChuYW1lOiBzdHJpbmcpICh2YWx1ZTogVmFsdWUudCkgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgSnMuVW5zYWZlLnNldCBlbGVtZW50IChKcy5zdHJpbmcgbmFtZSkgdmFsdWVcblxuICAgIGxldCBkZWxldGVfcHJvcGVydHkgKG5hbWU6IHN0cmluZykgKGVsZW1lbnQ6IHQpOiB1bml0ID1cbiAgICAgICAgSnMuVW5zYWZlLmRlbGV0ZSBlbGVtZW50IChKcy5zdHJpbmcgbmFtZSlcblxuXG4gICAgbGV0IGZvY3VzIChlbGVtZW50OiB0KTogdW5pdCA9XG4gICAgICAgIGVsZW1lbnQjI2ZvY3VzICgpXG5cbiAgICBsZXQgYmx1ciAoZWxlbWVudDogdCk6IHVuaXQgPVxuICAgICAgICBlbGVtZW50IyNibHVyICgpXG5lbmRcblxuXG5cblxuXG5cblxubW9kdWxlIERvY3VtZW50ID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IGRvY3VtZW50IEpzLnRcblxuXG4gICAgbGV0IHRpdGxlIChkb2M6IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgZG9jIyMudGl0bGVcblxuXG4gICAgbGV0IHNldF90aXRsZSAodGl0bGU6IHN0cmluZykgKGRvYzogdCk6IHVuaXQgPVxuICAgICAgICBkb2MjIy50aXRsZSA6PSBKcy5zdHJpbmcgdGl0bGVcblxuXG4gICAgbGV0IGJvZHkgKGRvYzogdCk6IEVsZW1lbnQudCA9XG4gICAgICAgIGFzc2VydCAoZG9jIyMuYm9keSAhPSBKcy5VbnNhZmUuanNfZXhwciBcIm51bGxcIik7XG4gICAgICAgIGRvYyMjLmJvZHlcblxuICAgIGxldCBmaW5kIChuYW1lOiBzdHJpbmcpIChkb2M6IHQpOiBFbGVtZW50LnQgb3B0aW9uID1cbiAgICAgICAgSnMuT3B0LnRvX29wdGlvbiAoZG9jIyNnZXRFbGVtZW50QnlJZCAoSnMuc3RyaW5nIG5hbWUpKVxuXG4gICAgbGV0IGNyZWF0ZV9lbGVtZW50ICh0YWc6IHN0cmluZykgKGRvYzogdCk6IEVsZW1lbnQudCA9XG4gICAgICAgIGRvYyMjY3JlYXRlRWxlbWVudCAoSnMuc3RyaW5nIHRhZylcblxuICAgIGxldCBjcmVhdGVfdGV4dF9ub2RlICh0ZXh0OiBzdHJpbmcpIChkb2M6IHQpOiBOb2RlLnQgPVxuICAgICAgICBkb2MjI2NyZWF0ZVRleHROb2RlIChKcy5zdHJpbmcgdGV4dClcblxuICAgIGxldCBjcmVhdGVfZWxlbWVudF9ucyAobmFtZXNwYWNlOiBzdHJpbmcpICh0YWc6IHN0cmluZykgKGRvYzogdCk6IEVsZW1lbnQudCA9XG4gICAgICAgIGRvYyMjY3JlYXRlRWxlbWVudE5TIChKcy5zdHJpbmcgbmFtZXNwYWNlKSAoSnMuc3RyaW5nIHRhZylcblxuICAgIGxldCBjcmVhdGVfZG9jdW1lbnRfZnJhZ21lbnQgKGRvYzogdCk6IE5vZGUudCA9XG4gICAgICAgIGRvYyMjY3JlYXRlRG9jdW1lbnRGcmFnbWVudCAoKVxuZW5kXG5cblxuXG5tb2R1bGUgSGlzdG9yeSA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBoaXN0b3J5IEpzLnRcblxuXG4gICAgbGV0IGdvIChpOiBpbnQpIChoaXN0b3J5OiB0KTogdW5pdCA9XG4gICAgICAgIGhpc3RvcnkjI2dvIGlcblxuXG4gICAgbGV0IHB1c2hfc3RhdGVcbiAgICAgICAgICAgIChzdGF0ZTogVmFsdWUudClcbiAgICAgICAgICAgICh0aXRsZTogc3RyaW5nKVxuICAgICAgICAgICAgKHVybDogc3RyaW5nKVxuICAgICAgICAgICAgKGhpc3Rvcnk6IHQpXG4gICAgICAgIDogdW5pdCA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIGhpc3RvcnkjI3B1c2hTdGF0ZSBzdGF0ZSAoc3RyaW5nIHRpdGxlKSAoc3RyaW5nIHVybClcblxuXG4gICAgbGV0IHJlcGxhY2Vfc3RhdGVcbiAgICAgICAgICAgIChzdGF0ZTogVmFsdWUudClcbiAgICAgICAgICAgICh0aXRsZTogc3RyaW5nKVxuICAgICAgICAgICAgKHVybDogc3RyaW5nKVxuICAgICAgICAgICAgKGhpc3Rvcnk6IHQpXG4gICAgICAgIDogdW5pdCA9XG4gICAgICAgIGxldCBvcGVuIEpzIGluXG4gICAgICAgIGhpc3RvcnkjI3JlcGxhY2VTdGF0ZSBzdGF0ZSAoc3RyaW5nIHRpdGxlKSAoc3RyaW5nIHVybClcbmVuZFxuXG5cblxuXG5cbm1vZHVsZSBMb2NhdGlvbiA9XG5zdHJ1Y3RcbiAgICB0eXBlIHQgPSBsb2NhdGlvbiBKcy50XG5cbiAgICBsZXQgaHJlZiAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5ocmVmXG5cbiAgICBsZXQgcHJvdG9jb2wgKGxvY2F0aW9uOiB0KTogc3RyaW5nID1cbiAgICAgICAgSnMudG9fc3RyaW5nIGxvY2F0aW9uIyMucHJvdG9jb2xcblxuICAgIGxldCBob3N0IChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLmhvc3RcblxuICAgIGxldCBwb3J0IChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLnBvcnRcblxuICAgIGxldCBwYXRobmFtZSAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5wYXRobmFtZVxuXG4gICAgbGV0IHNlYXJjaCAobG9jYXRpb246IHQpOiBzdHJpbmcgPVxuICAgICAgICBKcy50b19zdHJpbmcgbG9jYXRpb24jIy5zZWFyY2hcblxuICAgIGxldCBoYXNoIChsb2NhdGlvbjogdCk6IHN0cmluZyA9XG4gICAgICAgIEpzLnRvX3N0cmluZyBsb2NhdGlvbiMjLmhhc2hcblxuICAgIGxldCBhc3NpZ24gKHVybDogc3RyaW5nKSAobG9jYXRpb246IHQpOiB1bml0ID1cbiAgICAgICAgbG9jYXRpb24jI2Fzc2lnbiAoSnMuc3RyaW5nIHVybClcblxuXG4gICAgbGV0IHJlbG9hZCAobG9jYXRpb246IHQpOiB1bml0ID1cbiAgICAgICAgbG9jYXRpb24jI3JlbG9hZCAoKVxuZW5kXG5cblxuXG5cbm1vZHVsZSBXaW5kb3cgPVxuc3RydWN0XG4gICAgdHlwZSB0ID0gd2luZG93IEpzLnRcblxuXG4gICAgbGV0IGdldCAoKTogdCA9XG4gICAgICAgIEpzLlVuc2FmZS5nbG9iYWxcblxuICAgIGxldCBldmVudF90YXJnZXQgKHc6IHQpOiBFdmVudF90YXJnZXQudCA9XG4gICAgICAgIE9iai5tYWdpYyB3XG5cblxuICAgIGxldCBkb2N1bWVudCAodzogdCk6IERvY3VtZW50LnQgPVxuICAgICAgICB3IyMuZG9jdW1lbnRcblxuXG4gICAgbGV0IGhpc3RvcnkgKHc6IHQpOiBIaXN0b3J5LnQgPVxuICAgICAgICB3IyMuaGlzdG9yeVxuXG5cbiAgICBsZXQgbG9jYXRpb24gKHc6IHQpOiBMb2NhdGlvbi50ID1cbiAgICAgICAgdyMjLmxvY2F0aW9uXG5cblxuICAgIGxldCBvbl9uZXh0X2FuaW1hdGlvbiAoY2FsbGJhY2s6IGZsb2F0IC0+IHVuaXQpICh3OiB0KTogdW5pdCA9XG4gICAgICAgIHcjI3JlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFja1xuZW5kXG4iLCJvcGVuIEpzX29mX29jYW1sXG5cbnR5cGUgdCA9IEpzLmRhdGUgSnMudFxuXG5cbmxldCBub3cgKCk6IHQgPVxuICAgIG5ldyVqcyBKcy5kYXRlX25vd1xuXG5cbmxldCBtYWtlXG4gICAgICAgICh5ZWFyOiBpbnQpXG4gICAgICAgIChtb250aDogaW50KVxuICAgICAgICAoZGF5OiBpbnQpXG4gICAgICAgIChob3VyOiBpbnQpXG4gICAgICAgIChtaW51dGU6IGludClcbiAgICAgICAgKHNlY29uZDogaW50KVxuICAgICAgICAobWlsbGk6IGludClcbiAgICA6IHRcbiAgICA9XG4gICAgbmV3JWpzIEpzLmRhdGVfbXMgeWVhciBtb250aCBkYXkgaG91ciBtaW51dGUgc2Vjb25kIG1pbGxpXG5cblxubGV0IG9mX3ZhbHVlICh2OiBmbG9hdCk6IHQgPVxuICAgIG5ldyVqcyBKcy5kYXRlX2Zyb21UaW1lVmFsdWUgdlxuXG5cbmxldCB2YWx1ZSAoZDogdCk6IGZsb2F0ID1cbiAgICBkIyN2YWx1ZU9mXG5cblxubGV0IHpvbmVfb2Zmc2V0IChkOiB0KTogaW50ID1cbiAgICBkIyNnZXRUaW1lem9uZU9mZnNldFxuXG5cbmxldCBhZGQgKG1zOiBmbG9hdCkgKGQ6IHQpOiB0ID1cbiAgICBvZl92YWx1ZSAodmFsdWUgZCArLiBtcylcblxuXG5sZXQgZGF5IChkOiB0KTogaW50ID1cbiAgICBkIyNnZXREYXlcblxuXG5sZXQgZGF0ZSAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0RGF0ZVxuXG5cbmxldCBtb250aCAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0TW9udGhcblxuXG5sZXQgeWVhciAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0RnVsbFllYXJcblxuXG5sZXQgaG91cnMgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldEhvdXJzXG5cblxubGV0IG1pbnV0ZXMgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldE1pbnV0ZXNcblxuXG5sZXQgc2Vjb25kcyAoZDogdCk6IGludCA9XG4gICAgZCMjZ2V0U2Vjb25kc1xuXG5cbmxldCBtaWxsaXNlY29uZHMgKGQ6IHQpOiBpbnQgPVxuICAgIGQjI2dldE1pbGxpc2Vjb25kc1xuIiwib3BlbiBGbWxpYl9zdGRcblxubW9kdWxlIHR5cGUgRElDVCA9XG5zaWdcbiAgICB0eXBlIGtleVxuXG4gICAgdHlwZSBfIHRcblxuICAgIHZhbCBlbXB0eTogJ2EgdFxuXG4gICAgdmFsIGZpbmRfb3B0OiBrZXkgLT4gJ2EgdCAtPiAnYSBvcHRpb25cblxuICAgIHZhbCBhZGQ6IGtleSAtPiAnYSAtPiAnYSB0IC0+ICdhIHRcblxuICAgIHZhbCBzZXQ6IGtleSAtPiAoJ2Egb3B0aW9uIC0+ICdhKSAtPiAnYSB0IC0+ICdhIHRcblxuICAgIHZhbCBvZl9saXN0OiAoa2V5ICogJ2EpIGxpc3QgLT4gJ2EgdFxuXG4gICAgdmFsIGZvbGQ6ICgnYWNjdSAtPiBrZXkgLT4gJ2EgLT4gJ2FjY3UpIC0+ICdhY2N1IC0+ICdhIHQgLT4gJ2FjY3VcblxuICAgIHZhbCBpdGVyOiAoa2V5IC0+ICdhIC0+IHVuaXQpIC0+ICdhIHQgLT4gdW5pdFxuXG4gICAgdmFsIGRpZmY6XG4gICAgICAgIChrZXkgLT4gJ2EgLT4gdW5pdClcbiAgICAgICAgLT4gKGtleSAtPiAnYSAtPiB1bml0KVxuICAgICAgICAtPiAoa2V5IC0+IHVuaXQpXG4gICAgICAgIC0+ICdhIHRcbiAgICAgICAgLT4gJ2EgdFxuICAgICAgICAtPiB1bml0XG5lbmRcblxuXG5tb2R1bGUgTWFrZSAoS2V5OiBJbnRlcmZhY2VzLlNPUlRBQkxFKSA9XG5zdHJ1Y3RcbiAgICBtb2R1bGUgTWFwICAgPSBGbWxpYl9zdGQuQnRyZWUuTWFwIChLZXkpXG5cbiAgICB0eXBlICdhIHQgPSB7XG4gICAgICAgIGFycjogKEtleS50ICogJ2EgKSBBcnJheS50O1xuICAgICAgICBtYXA6IGludCBNYXAudDtcbiAgICB9XG5cbiAgICBsZXQgZW1wdHk6ICdhIHQgPSB7XG4gICAgICAgIGFyciA9IFt8fF07XG4gICAgICAgIG1hcCA9IE1hcC5lbXB0eTtcbiAgICB9XG5cblxuICAgIGxldCBmaW5kX29wdCAoa2V5OiBLZXkudCkgKGQ6ICdhIHQpOiAnYSBvcHRpb24gPVxuICAgICAgICBPcHRpb24ubWFwXG4gICAgICAgICAgICAoZnVuIGkgLT5cbiAgICAgICAgICAgICAgICAgYXNzZXJ0IChpIDwgQXJyYXkubGVuZ3RoIGQuYXJyKTtcbiAgICAgICAgICAgICAgICAgbGV0IGssIHYgPSBkLmFyci4oaSkgaW5cbiAgICAgICAgICAgICAgICAgYXNzZXJ0IChrID0ga2V5KTtcbiAgICAgICAgICAgICAgICAgdilcbiAgICAgICAgICAgIChNYXAuZmluZF9vcHQga2V5IGQubWFwKVxuXG5cbiAgICBsZXQgYWRkIChrZXk6IEtleS50KSAodmFsdWU6ICdhKSAoZDogJ2EgdCk6ICdhIHQgPVxuICAgICAgICBtYXRjaCBNYXAuZmluZF9vcHQga2V5IGQubWFwIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBsZXQgbiA9IEFycmF5Lmxlbmd0aCBkLmFyciBpblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcCA9IE1hcC5hZGQga2V5IG4gZC5tYXA7XG4gICAgICAgICAgICAgICAgYXJyID0gQXJyYXkucHVzaCAoa2V5LCB2YWx1ZSkgZC5hcnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIHwgU29tZSBfIC0+XG4gICAgICAgICAgICBkXG5cblxuXG4gICAgbGV0IHNldCAoa2V5OiBLZXkudCkgKGY6ICdhIG9wdGlvbiAtPiAnYSkgKGQ6ICdhIHQpOiAnYSB0ID1cbiAgICAgICAgbWF0Y2ggTWFwLmZpbmRfb3B0IGtleSBkLm1hcCB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgYWRkIGtleSAoZiBOb25lKSBkXG4gICAgICAgIHwgU29tZSBpZHggLT5cbiAgICAgICAgICAgIGxldCAoaywgdikgPSBkLmFyci4oaWR4KSBpblxuICAgICAgICAgICAgYXNzZXJ0IChrID0ga2V5KTtcbiAgICAgICAgICAgIHtkIHdpdGhcbiAgICAgICAgICAgICBhcnIgPSBBcnJheS5yZXBsYWNlIGlkeCAoa2V5LCBmIChTb21lIHYpKSBkLmFycn1cblxuXG5cbiAgICBsZXQgb2ZfbGlzdCAobHN0OiAoS2V5LnQgKiAnYSkgbGlzdCk6ICdhIHQgPVxuICAgICAgICBsZXQgcmVjIG9mX2xpc3QgZCA9IGZ1bmN0aW9uXG4gICAgICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICAgICAgZFxuICAgICAgICAgICAgfCAoa2V5LCB2YWx1ZSkgOjogdGwgLT5cbiAgICAgICAgICAgICAgICBvZl9saXN0IChhZGQga2V5IHZhbHVlIGQpIHRsXG4gICAgICAgIGluXG4gICAgICAgIG9mX2xpc3QgZW1wdHkgbHN0XG5cblxuXG5cbiAgICBsZXQgZm9sZCAoZjogJ2FjY3UgLT4gS2V5LnQgLT4gJ2EgLT4gJ2FjY3UpIChhY2N1OiAnYWNjdSkgKGQ6ICdhIHQpOiAnYWNjdSA9XG4gICAgICAgIEFycmF5LmZvbGRfbGVmdFxuICAgICAgICAgICAgKGZ1biBhY2N1IChrZXksIHZhbHVlKSAtPiBmIGFjY3Uga2V5IHZhbHVlKVxuICAgICAgICAgICAgYWNjdVxuICAgICAgICAgICAgZC5hcnJcblxuXG4gICAgbGV0IGl0ZXIgKGY6IEtleS50IC0+ICdhIC0+IHVuaXQpIChkaWN0OiAnYSB0KTogdW5pdCA9XG4gICAgICAgIFN0ZGxpYi5BcnJheS5pdGVyXG4gICAgICAgICAgICAoZnVuIChrZXksIHZhbHVlKSAtPiBmIGtleSB2YWx1ZSlcbiAgICAgICAgICAgIGRpY3QuYXJyXG5cblxuICAgIGxldCBkaWZmXG4gICAgICAgICAgICAoYWRkOiBLZXkudCAtPiAnYSAtPiB1bml0KVxuICAgICAgICAgICAgKHNldDogS2V5LnQgLT4gJ2EgLT4gdW5pdClcbiAgICAgICAgICAgIChyZW1vdmU6IEtleS50IC0+IHVuaXQpXG4gICAgICAgICAgICAoZDE6ICdhIHQpXG4gICAgICAgICAgICAoZDI6ICdhIHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIGl0ZXJcbiAgICAgICAgICAgIChmdW4ga2V5IF8gLT5cbiAgICAgICAgICAgICAgICAgbWF0Y2ggZmluZF9vcHQga2V5IGQxIHdpdGhcbiAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICgpXG4gICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlIGtleSlcbiAgICAgICAgICAgIGQyO1xuICAgICAgICBpdGVyXG4gICAgICAgICAgICAoZnVuIGtleSB2YWx1ZSAtPlxuICAgICAgICAgICAgICAgICBtYXRjaCBmaW5kX29wdCBrZXkgZDIgd2l0aFxuICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgIGFkZCBrZXkgdmFsdWVcblxuICAgICAgICAgICAgICAgICB8IFNvbWUgdmFsdWUyIC0+XG4gICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSB2YWx1ZTIgdGhlblxuICAgICAgICAgICAgICAgICAgICAgICAgICgpXG4gICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGtleSB2YWx1ZSlcbiAgICAgICAgICAgIGQxXG5lbmRcblxuXG5cbmluY2x1ZGUgTWFrZSAoU3RyaW5nKVxuIiwib3BlbiBGbWxpYl9qc1xuXG5cbm1vZHVsZSBab25lID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IGludCAoKiBvZmZzZXQgaW4gbWludXRlcyBmcm9tIHV0Yywgd2VzdHdhcmQgcG9zaXRpdmUsIGVhc3R3YXJkXG4gICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlICopXG5cbiAgICBsZXQgdXRjOiB0ID0gMFxuXG4gICAgbGV0IG1ha2UgKG1pbnV0ZXM6IGludCk6IHQgPVxuICAgICAgICBtaW51dGVzXG5cbiAgICBsZXQgb2Zmc2V0ICh6b25lOiB0KTogaW50ID1cbiAgICAgICAgem9uZVxuZW5kXG5cblxudHlwZSB0ID0gRGF0ZS50XG5cbmxldCB6ZXJvOiB0ID1cbiAgICBEYXRlLm9mX3ZhbHVlICgwLjApXG5cbmxldCBhZGFwdCAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IHQgPVxuICAgIERhdGUuKGFkZCAoNjAwMDAuICouIGZsb2F0X29mX2ludCAoem9uZV9vZmZzZXQgdGltZSAtIHpvbmUpKSB0aW1lKVxuICAgICAgICAoKiBtb3JlIHdlc3R3YXJkIGlzIG5vdCB5ZXQgdGhhdCBsYXRlICopXG5cblxubGV0IHllYXIgKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUueWVhciAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBtb250aCAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5tb250aCAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBkYXlfb2ZfbW9udGggKHRpbWU6IHQpICh6b25lOiBab25lLnQpOiBpbnQgPVxuICAgIERhdGUuZGF0ZSAoYWRhcHQgdGltZSB6b25lKVxuXG5cbmxldCBob3VyICh0aW1lOiB0KSAoem9uZTogWm9uZS50KTogaW50ID1cbiAgICBEYXRlLmhvdXJzIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IG1pbnV0ZSAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5taW51dGVzIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IHNlY29uZCAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5zZWNvbmRzIChhZGFwdCB0aW1lIHpvbmUpXG5cblxubGV0IG1pbGxpX3NlY29uZCAodGltZTogdCkgKHpvbmU6IFpvbmUudCk6IGludCA9XG4gICAgRGF0ZS5taWxsaXNlY29uZHMgKGFkYXB0IHRpbWUgem9uZSlcbiIsIm1vZHVsZSBMb2NhbCA9XG5zdHJ1Y3RcbiAgICB0eXBlIHRcblxuICAgIGxldCBzdHJpbmcgKF86IHQpOiBzdHJpbmcgPVxuICAgICAgICBhc3NlcnQgZmFsc2UgKCogbnlpICopXG5lbmRcblxuXG50eXBlIHQgPVxuICAgIHwgUmF3IG9mIHN0cmluZ1xuICAgIHwgTG9jYWwgb2YgTG9jYWwudFxuXG5cbmxldCBwYXJzZSAoc3RyOiBzdHJpbmcpOiB0IG9wdGlvbiA9XG4gICAgU29tZSAoUmF3IHN0cilcblxuXG5sZXQgc3RyaW5nOiB0IC0+IHN0cmluZyA9XG4gICAgZnVuY3Rpb25cbiAgICB8IFJhdyBzdHIgLT5cbiAgICAgICAgc3RyXG4gICAgfCBMb2NhbCBsb2MgLT5cbiAgICAgICAgTG9jYWwuc3RyaW5nIGxvY1xuXG5sZXQgaXNfcGFnZTogdCAtPiBib29sID0gZnVuY3Rpb25cbiAgICB8IFJhdyBfIC0+XG4gICAgICAgIHRydWUgKCogTUlTU0lORyEhISBhc3NlcnQgZmFsc2UgKilcbiAgICB8IExvY2FsIF8gLT5cbiAgICAgICAgdHJ1ZVxuIiwib3BlbiBGbWxpYl9qc1xuXG5cblxubW9kdWxlIEFjdHVhbCA9XG5zdHJ1Y3RcbiAgICAoKiBTZWUgTm90ZSBbRnVuY3Rpb25zIHdpdGggcmVmZXJlbmNlc10gKilcbiAgICB0eXBlICdlIHQgPSB7XG4gICAgICAgIHJlZjogKCdlIC0+IHVuaXQpIHJlZjtcbiAgICAgICAgcmVhbDogJ2UgLT4gdW5pdDtcbiAgICB9XG5cbiAgICBsZXQgbWFrZSAoaGFuZGxlcjogJ2UgLT4gdW5pdCk6ICdlIHQgPVxuICAgICAgICBsZXQgcmVmID0gcmVmIGhhbmRsZXIgaW5cbiAgICAgICAgbGV0IGYgcmVmID1cbiAgICAgICAgICAgIGZ1biBlIC0+ICghIHJlZikgZVxuICAgICAgICBpblxuICAgICAgICB7IHJlZjsgcmVhbCA9IGYgcmVmIH1cblxuXG4gICAgbGV0IHVwZGF0ZSAoaGFuZGxlcjogJ2UgLT4gdW5pdCkgKGFjdHVhbDogJ2UgdCk6IHVuaXQgPVxuICAgICAgICBhY3R1YWwucmVmIDo9IGhhbmRsZXJcblxuICAgIGxldCBmaXJlIChhY3R1YWw6ICdlIHQpOiAnZSAtPiB1bml0ID1cbiAgICAgICAgYWN0dWFsLnJlYWxcbmVuZFxuXG5cblxubW9kdWxlIEFjdHVhbHMgKEtleTogRm1saWJfc3RkLkludGVyZmFjZXMuU09SVEFCTEUpID1cbnN0cnVjdFxuICAgIG1vZHVsZSBNYXAgID0gRm1saWJfc3RkLkJ0cmVlLk1hcCAoS2V5KVxuICAgIG1vZHVsZSBEaWN0ID0gRGljdGlvbmFyeS5NYWtlIChLZXkpXG5cbiAgICB0eXBlICgnZSwgJ2EpIHQgPSAoJ2UgQWN0dWFsLnQgKiAnYSkgTWFwLnQgcmVmXG5cbiAgICBsZXQgZW1wdHkgKCk6ICgnZSwgJ2EpIHQgPSByZWYgTWFwLmVtcHR5XG5cbiAgICBsZXQgc2V0XG4gICAgICAgICAgICAobWFrZTogJ3YgLT4gJ2UgLT4gdW5pdClcbiAgICAgICAgICAgIChhZGQ6ICBLZXkudCAtPiAoJ2UgLT4gdW5pdCkgLT4gJ2EpXG4gICAgICAgICAgICAoZGljdDogJ3YgRGljdC50KVxuICAgICAgICAgICAgKG1hcDogKCdlLCAnYSkgdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgRGljdC5pdGVyXG4gICAgICAgICAgICAoZnVuIGtleSB2IC0+XG4gICAgICAgICAgICAgICAgIGFzc2VydCAoTWFwLmZpbmRfb3B0IGtleSAhbWFwID0gTm9uZSk7XG4gICAgICAgICAgICAgICAgIGxldCBhY3R1YWwgPSBBY3R1YWwubWFrZSAobWFrZSB2KVxuICAgICAgICAgICAgICAgICBpblxuICAgICAgICAgICAgICAgICBsZXQgYSA9IGFkZCBrZXkgKEFjdHVhbC5maXJlIGFjdHVhbCkgaW5cbiAgICAgICAgICAgICAgICAgbWFwIDo9IE1hcC5hZGQga2V5IChhY3R1YWwsIGEpICFtYXBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGRpY3RcblxuICAgIGxldCB1cGRhdGVcbiAgICAgICAgICAgIChtYWtlOiAndiAtPiAnZSAtPiB1bml0KVxuICAgICAgICAgICAgKGFkZDogIEtleS50IC0+ICgnZSAtPiB1bml0KSAtPiAnYSlcbiAgICAgICAgICAgIChyZW1vdmU6IEtleS50IC0+ICgnZSAtPiB1bml0KSAtPiAnYSAtPiB1bml0KVxuICAgICAgICAgICAgKGQxOiAndiBEaWN0LnQpXG4gICAgICAgICAgICAoZDI6ICd2IERpY3QudClcbiAgICAgICAgICAgIChtYXA6ICgnZSwgJ2EpIHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIERpY3QuZGlmZlxuICAgICAgICAgICAgKGZ1biBrZXkgdiAtPlxuICAgICAgICAgICAgICAgICAoKiBIYW5kbGVyIGZvciBba2V5XcKgbmV3IGluIFtkMV0uICopXG4gICAgICAgICAgICAgICAgIG1hcCA6PVxuICAgICAgICAgICAgICAgICAgICAgTWFwLnVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhY3R1YWwgPSBBY3R1YWwubWFrZSAobWFrZSB2KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhID0gYWRkIGtleSAoQWN0dWFsLmZpcmUgYWN0dWFsKSBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZSAoYWN0dWFsLCBhKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbCwgaGFuZGxlciBpcyBuZXcgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZDFdLiAqKVxuICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAhbWFwXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAoZnVuIGtleSB2IC0+XG4gICAgICAgICAgICAgICAgICgqIEhhbmRsZXIgZm9yIFtrZXldIG5lZWRzIHVwZGF0ZS4gSXQgaXMgcHJlc2VudCBpbiBbZDFdIGFuZFxuICAgICAgICAgICAgICAgICAgICBbZDJdICopXG4gICAgICAgICAgICAgICAgIG1hdGNoIE1hcC5maW5kX29wdCBrZXkgIW1hcCB3aXRoXG4gICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbC4gSGFuZGxlciBpcyBwcmVzZW50IGluIFtkMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgW2QyXS4gKilcbiAgICAgICAgICAgICAgICAgfCBTb21lIChhY3R1YWwsIF8pIC0+XG4gICAgICAgICAgICAgICAgICAgICBBY3R1YWwudXBkYXRlIChtYWtlIHYpIGFjdHVhbFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgKGZ1biBrZXkgLT5cbiAgICAgICAgICAgICAgICAgKCogSGFuZGxlciBmb3IgW2tleV0gaXMgbm90IGluIFtkMV0gYnV0IGluIFtkMl0uIEl0IGhhcyB0byBiZVxuICAgICAgICAgICAgICAgICAgICByZW1vdmVkLiAqKVxuICAgICAgICAgICAgICAgICBtYXAgOj1cbiAgICAgICAgICAgICAgICAgICAgIE1hcC51cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsLiBJdCBpcyBpbiBbZDJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlZm9yZSBpdCBoYXMgdG8gYmUgaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWFwXS4gKilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTb21lIChhY3R1YWwsIGEpIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUga2V5IChBY3R1YWwuZmlyZSBhY3R1YWwpIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGQxXG4gICAgICAgICAgICBkMlxuZW5kXG5cblxuXG5cblxuXG4oKiBBIHZpcnR1YWwgaGFuZGxlciBpcyBhIGRlY29kZXIgd2l0aCBmbGFncyB0byBzdG9wIHByb3BhZ2F0aW9uIGFuZCBwcmV2ZW50XG4gICBkZWZhdWx0IGhhbmRsaW5nLlxuKilcbm1vZHVsZSBWaXJ0dWFsID1cbnN0cnVjdFxuICAgIHR5cGUgJ20gdCA9IEV2ZW50X2ZsYWcuc3RvcCAqIEV2ZW50X2ZsYWcucHJldmVudCAqICdtIEJhc2UuRGVjb2RlLnRcblxuICAgIGxldCBtYWtlX29uZVxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKChFdmVudF9mbGFnLlN0b3Agc3RvcCwgRXZlbnRfZmxhZy5QcmV2ZW50IHByZXZlbnQsIGRlY29kZSk6ICdtIHQpXG4gICAgICAgIDogRXZlbnQudCAtPiB1bml0XG4gICAgICAgID1cbiAgICAgICAgZnVuIGV2ZW50IC0+XG5cbiAgICAgICAgaWYgc3RvcCB0aGVuXG4gICAgICAgICAgICBFdmVudC5zdG9wX3Byb3BhZ2F0aW9uIGV2ZW50O1xuXG4gICAgICAgIGlmIHByZXZlbnQgdGhlblxuICAgICAgICAgICAgRXZlbnQucHJldmVudF9kZWZhdWx0IGV2ZW50O1xuXG4gICAgICAgIG1hdGNoIGRlY29kZSBFdmVudC4odmFsdWUgZXZlbnQpIHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICBsZXQgb3BlbiBCYXNlLk1haW4gaW5cbiAgICAgICAgICAgIGxvZ19zdHJpbmcgXCJDYW5ub3QgZGVjb2RlIGV2ZW50XCI7XG4gICAgICAgICAgICBsb2dfdmFsdWUgKEV2ZW50LnZhbHVlIGV2ZW50KVxuICAgICAgICB8IFNvbWUgbSAtPlxuICAgICAgICAgICAgZGlzcGF0Y2ggbVxuXG4gICAgbGV0IG1ha2VfbGlzdCAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpIChsc3Q6ICdtIHQgbGlzdCk6IEV2ZW50LnQgLT4gdW5pdCA9XG4gICAgICAgIGZ1biBldmVudCAtPlxuICAgICAgICBMaXN0LihpdGVyXG4gICAgICAgICAgICAgICAgICAoZnVuIHYgLT4gbWFrZV9vbmUgZGlzcGF0Y2ggdiBldmVudClcbiAgICAgICAgICAgICAgICAgIChyZXYgbHN0KSlcblxuICAgIGxldCBtYXAgKGY6ICdhIC0+ICdiKSAoKHN0b3AsIHByZXZlbnQsIGRlY29kZSk6ICdhIHQpOiAnYiB0ID1cbiAgICAgICAgc3RvcCxcbiAgICAgICAgcHJldmVudCxcbiAgICAgICAgQmFzZS5EZWNvZGUubWFwIGYgZGVjb2RlXG5lbmRcblxuXG5cblxuXG5cblxuKCogU2V0IG9mIHJlYWwgaGFuZGxlcnMgaGFuZGxpbmcgamF2YXNjcmlwdCBldmVudHMgZmlyZWQgb24gZXZlbnQgdGFyZ2V0cy4gKilcbm1vZHVsZSBFdmVudEhzID1cbnN0cnVjdFxuICAgIG1vZHVsZSBBY3R1YWxzID0gQWN0dWFscyAoU3RyaW5nKVxuICAgIG1vZHVsZSBEaWN0ICAgID0gRGljdGlvbmFyeS5NYWtlIChTdHJpbmcpXG5cbiAgICB0eXBlIHQgPSAoRXZlbnQudCwgdW5pdCkgQWN0dWFscy50XG5cbiAgICBsZXQgZW1wdHkgPSBBY3R1YWxzLmVtcHR5XG5cbiAgICBsZXQgYWRkIHRhcmdldCBldmVudF90eXBlIGhhbmRsZXIgPVxuICAgICAgICBFdmVudF90YXJnZXQuYWRkIGV2ZW50X3R5cGUgaGFuZGxlciB0YXJnZXRcblxuICAgIGxldCBzZXRcbiAgICAgICAgICAgICh0YXJnZXQ6ICAgRXZlbnRfdGFyZ2V0LnQpXG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAoZGljdDogICAgICdtIFZpcnR1YWwudCBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChtYXA6ICAgICAgdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgQWN0dWFscy5zZXRcbiAgICAgICAgICAgIChWaXJ0dWFsLm1ha2VfbGlzdCBkaXNwYXRjaClcbiAgICAgICAgICAgIChhZGQgdGFyZ2V0KVxuICAgICAgICAgICAgZGljdFxuICAgICAgICAgICAgbWFwXG5cbiAgICBsZXQgdXBkYXRlXG4gICAgICAgICAgICAodGFyZ2V0OiAgIEV2ZW50X3RhcmdldC50KVxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKGQxOiAgICAgICAnbSBWaXJ0dWFsLnQgbGlzdCBEaWN0LnQpXG4gICAgICAgICAgICAoZDI6ICAgICAgICdtIFZpcnR1YWwudCBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChtYXA6ICAgICAgdClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgQWN0dWFscy51cGRhdGVcbiAgICAgICAgICAgIChWaXJ0dWFsLm1ha2VfbGlzdCBkaXNwYXRjaClcbiAgICAgICAgICAgIChhZGQgdGFyZ2V0KVxuICAgICAgICAgICAgKGZ1biBldmVudF90eXBlIGhhbmRsZXIgXyAtPlxuICAgICAgICAgICAgICAgIEV2ZW50X3RhcmdldC5yZW1vdmUgZXZlbnRfdHlwZSBoYW5kbGVyIHRhcmdldClcbiAgICAgICAgICAgIGQxXG4gICAgICAgICAgICBkMlxuICAgICAgICAgICAgbWFwXG5lbmRcblxuXG5cblxuXG5cblxubW9kdWxlIFRpbWVycyA9XG5zdHJ1Y3RcbiAgICBtb2R1bGUgQWN0dWFscyA9IEFjdHVhbHMgKEludClcbiAgICBtb2R1bGUgRGljdCAgICA9IERpY3Rpb25hcnkuTWFrZSAoSW50KVxuXG4gICAgdHlwZSB0ID0gKFRpbWUudCwgVGltZXIuaW50ZXJ2YWwpIEFjdHVhbHMudFxuXG4gICAgbGV0IGVtcHR5ID0gQWN0dWFscy5lbXB0eVxuXG4gICAgbGV0IG9mX2xpc3RcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgIChsc3Q6IChUaW1lLnQgLT4gJ20pIGxpc3QpXG4gICAgICAgIDogVGltZS50IC0+IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBmdW4gdGltZSAtPlxuICAgICAgICBMaXN0LihpdGVyIChmdW4gZiAtPiBkaXNwYXRjaCAoZiB0aW1lKSkgKHJldiBsc3QpKVxuXG4gICAgbGV0IG1ha2VfdGltZXIgKG1pbGxpczogaW50KSAoaDogVGltZS50IC0+IHVuaXQpOiBUaW1lci5pbnRlcnZhbCA9XG4gICAgICAgIFRpbWVyLnNldF9pbnRlcnZhbFxuICAgICAgICAgICAgKGZ1biAoKSAtPiBoIChEYXRlLm5vdyAoKSkpXG4gICAgICAgICAgICBtaWxsaXNcblxuICAgIGxldCByZW1vdmVfdGltZXJcbiAgICAgICAgICAgIChfOiBpbnQpIChfOiBUaW1lLnQgLT4gdW5pdCkgKHRpbWVyOiBUaW1lci5pbnRlcnZhbClcbiAgICAgICAgOiB1bml0XG4gICAgICAgID1cbiAgICAgICAgVGltZXIuY2xlYXJfaW50ZXJ2YWwgdGltZXJcblxuICAgIGxldCBzZXRcbiAgICAgICAgICAgIChkaXNwYXRjaDogJ20gLT4gdW5pdClcbiAgICAgICAgICAgIChkaWN0OiAoVGltZS50IC0+ICdtKSBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChtYXA6IHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIEFjdHVhbHMuc2V0XG4gICAgICAgICAgICAob2ZfbGlzdCBkaXNwYXRjaClcbiAgICAgICAgICAgIG1ha2VfdGltZXJcbiAgICAgICAgICAgIGRpY3RcbiAgICAgICAgICAgIG1hcFxuXG5cbiAgICBsZXQgdXBkYXRlXG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAoZDE6IChUaW1lLnQgLT4gJ20pIGxpc3QgRGljdC50KVxuICAgICAgICAgICAgKGQyOiAoVGltZS50IC0+ICdtKSBsaXN0IERpY3QudClcbiAgICAgICAgICAgIChtYXA6IHQpXG4gICAgICAgIDogdW5pdFxuICAgICAgICA9XG4gICAgICAgIEFjdHVhbHMudXBkYXRlXG4gICAgICAgICAgICAob2ZfbGlzdCBkaXNwYXRjaClcbiAgICAgICAgICAgIG1ha2VfdGltZXJcbiAgICAgICAgICAgIHJlbW92ZV90aW1lclxuICAgICAgICAgICAgZDFcbiAgICAgICAgICAgIGQyXG4gICAgICAgICAgICBtYXBcbmVuZFxuXG5cblxubW9kdWxlIFVybF9yZXF1ZXN0ID1cbnN0cnVjdFxuICAgIHR5cGUgdCA9IEV2ZW50LnQgQWN0dWFsLnQgb3B0aW9uIHJlZlxuXG4gICAgbGV0IGVtcHR5ICgpOiB0ID1cbiAgICAgICAgcmVmIE5vbmVcblxuXG4gICAgbGV0IHRhcmdldCAoKTogRXZlbnRfdGFyZ2V0LnQgPVxuICAgICAgICBEb20uV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpXG5cbiAgICBsZXQgYWRkIChoOiBFdmVudC50IC0+IHVuaXQpOiB1bml0ID1cbiAgICAgICAgRXZlbnRfdGFyZ2V0LmFkZCBcImNsaWNrXCIgaCAodGFyZ2V0ICgpKVxuXG4gICAgbGV0IHJlbW92ZSAoaDogRXZlbnQudCAtPiB1bml0KTogdW5pdCA9XG4gICAgICAgIEV2ZW50X3RhcmdldC5yZW1vdmUgXCJjbGlja1wiIGggKHRhcmdldCAoKSlcblxuXG4gICAgbGV0IGRlY29kZTogVXJsLnQgQmFzZS5EZWNvZGUudCA9XG4gICAgICAgIGxldCBvcGVuIEJhc2UuRGVjb2RlIGluXG4gICAgICAgIGxldCogdGFnICA9IGZpZWxkIFwidGFyZ2V0XCIgKGZpZWxkIFwidGFnTmFtZVwiIHN0cmluZykgaW5cbiAgICAgICAgbGV0KiBocmVmID0gZmllbGQgXCJ0YXJnZXRcIiAoZmllbGQgXCJocmVmXCIgICAgc3RyaW5nKSBpblxuICAgICAgICBtYXRjaCBVcmwucGFyc2UgaHJlZiB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgZmFpbFxuICAgICAgICB8IFNvbWUgdXJsIC0+XG4gICAgICAgICAgICBpZiB0YWcgPD4gXCJBXCIgfHwgdGFnIDw+IFwiYVwiIHx8IG5vdCAoVXJsLmlzX3BhZ2UgdXJsKSB0aGVuXG4gICAgICAgICAgICAgICAgZmFpbFxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB1cmxcblxuXG4gICAgbGV0IG1ha2UgKGRpc3BhdGNoOiAnbSAtPiB1bml0KSAoZjogVXJsLnQgLT4gJ20pIChldmVudDogRXZlbnQudCk6IHVuaXQgPVxuICAgICAgICBtYXRjaCBkZWNvZGUgKEV2ZW50LnZhbHVlIGV2ZW50KSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgKClcbiAgICAgICAgfCBTb21lIHVybCAtPlxuICAgICAgICAgICAgRXZlbnQucHJldmVudF9kZWZhdWx0IGV2ZW50O1xuICAgICAgICAgICAgZGlzcGF0Y2ggKGYgdXJsKVxuXG5cbiAgICBsZXQgc2V0XG4gICAgICAgICAgICAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpXG4gICAgICAgICAgICAodmlydDogKFVybC50IC0+ICdtKSBvcHRpb24pXG4gICAgICAgICAgICAocmVxOiB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBtYXRjaCB2aXJ0IHdpdGhcbiAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICByZXEgOj0gTm9uZVxuICAgICAgICB8IFNvbWUgZiAtPlxuICAgICAgICAgICAgbGV0IGFjdHVhbCA9IEFjdHVhbC5tYWtlIChtYWtlIGRpc3BhdGNoIGYpIGluXG4gICAgICAgICAgICBhZGQgKEFjdHVhbC5maXJlIGFjdHVhbCk7XG4gICAgICAgICAgICByZXEgOj0gU29tZSBhY3R1YWxcblxuXG4gICAgbGV0IHVwZGF0ZVxuICAgICAgICAgICAgKGRpc3BhdGNoOiAnbSAtPiB1bml0KVxuICAgICAgICAgICAgKHZpcnQxOiAoVXJsLnQgLT4gJ20pIG9wdGlvbilcbiAgICAgICAgICAgICh2aXJ0MjogKFVybC50IC0+ICdtKSBvcHRpb24pXG4gICAgICAgICAgICAocmVxOiB0KVxuICAgICAgICA6IHVuaXRcbiAgICAgICAgPVxuICAgICAgICBtYXRjaCB2aXJ0MSwgdmlydDIsICFyZXEgd2l0aFxuICAgICAgICB8IE5vbmUsIE5vbmUsIE5vbmUgLT5cbiAgICAgICAgICAgICgpXG5cbiAgICAgICAgfCBTb21lIGYxLCBOb25lLCBOb25lIC0+XG4gICAgICAgICAgICAoKiBbZjFdIGlzIG5ldyBoYW5kbGVyLCBub3QgeWV0IGEgY3VycmVudCBoYW5kbGVyICopXG4gICAgICAgICAgICBsZXQgYWN0dWFsID0gQWN0dWFsLm1ha2UgKG1ha2UgZGlzcGF0Y2ggZjEpIGluXG4gICAgICAgICAgICBhZGQgKEFjdHVhbC5maXJlIGFjdHVhbCk7XG4gICAgICAgICAgICByZXEgOj0gU29tZSBhY3R1YWxcblxuICAgICAgICB8IFNvbWUgZjEsIFNvbWUgXywgU29tZSBhY3R1YWwgLT5cbiAgICAgICAgICAgICgqIFtmMV0gaXMgaGFuZGxlciB3aGljaCBoYXMgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGhhbmRsZXIuICopXG4gICAgICAgICAgICBsZXQgaGFuZGxlciA9IG1ha2UgZGlzcGF0Y2ggZjEgaW5cbiAgICAgICAgICAgIEFjdHVhbC51cGRhdGUgaGFuZGxlciBhY3R1YWxcblxuICAgICAgICB8IE5vbmUsIFNvbWUgXywgU29tZSBhY3R1YWwgLT5cbiAgICAgICAgICAgICgqIE5vIG5ldyBoYW5kbGVyLCBjdXJyZW50IGhhbmRsZXIgaGFzIHRvIGJlIHJlbW92ZWQuICopXG4gICAgICAgICAgICByZW1vdmUgKEFjdHVhbC5maXJlIGFjdHVhbClcblxuICAgICAgICB8IF8sIE5vbmUsIFNvbWUgXyB8IF8sIFNvbWUgXywgTm9uZSAtPlxuICAgICAgICAgICAgYXNzZXJ0IGZhbHNlICgqIElsbGVnYWwgY2FsbCwgW3ZpcnQyXSBhbmQgWyFyZXFdIGFyZSBlaXRoZXIgYm90aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IG9yIGJvdGggcHJlc2VudC4gKilcbmVuZFxuXG5cblxuXG5cblxuXG4oKlxuICAgIE5vdGUgW0Z1bmN0aW9ucyB3aXRoIHJlZmVyZW5jZXNdXG4gICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5cblxuICAgIFRoZSBjb2RlIGhhcyBiZWVuIHVuaXQgdGVzdGVkIHdpdGggdGhlIGZvbGxvd2luZyB0ZXN0IGNhc2UuXG5cbiAgICB0eXBlIHQgPSB7XG4gICAgICAgIHJlZjogKHVuaXQgLT4gaW50KSByZWY7XG4gICAgICAgIGJhc2U6IHVuaXQgLT4gaW50O1xuICAgIH1cblxuICAgIGxldCBmMSAoKTogaW50ID0gMVxuICAgIGxldCBmMiAoKTogaW50ID0gMlxuXG4gICAgbGV0IG1ha2UgKGY6IHVuaXQgLT4gaW50KTogdCA9XG4gICAgICAgIGxldCByZWYgPSByZWYgZiBpblxuICAgICAgICBsZXQgZyByZWYgPVxuICAgICAgICAgICAgZnVuICgpIC0+ICghIHJlZikgKClcbiAgICAgICAgaW5cbiAgICAgICAge1xuICAgICAgICAgICAgcmVmO1xuICAgICAgICAgICAgYmFzZSA9IGcgcmVmO1xuICAgICAgICB9XG5cbiAgICBsZXQgdXBkYXRlIChmOiB1bml0IC0+IGludCkgKGg6IHQpOiB1bml0ID1cbiAgICAgICAgaC5yZWYgOj0gZlxuXG4gICAgbGV0JXRlc3QgXyA9XG4gICAgICAgIGxldCBoID0gbWFrZSBmMSBpblxuICAgICAgICBoLmJhc2UgKCkgPSAxXG5cblxuICAgIGxldCV0ZXN0IF8gPVxuICAgICAgICBsZXQgaCA9IG1ha2UgZjEgaW5cbiAgICAgICAgdXBkYXRlIGYyIGg7XG4gICAgICAgIFByaW50Zi5wcmludGYgXCJoLmJhc2UgKCkgPSAlZFxcblwiIChoLmJhc2UgKCkpO1xuICAgICAgICBoLmJhc2UgKCkgPSAyXG4gICAgKilcbiIsIm9wZW4gRm1saWJfanMuQmFzZVxuXG50eXBlICdtc2cgaGFuZGxlciA9ICdtc2cgSGFuZGxlci5WaXJ0dWFsLnRcblxudHlwZSAnbXNnIHQgPVxuICAgIHwgU3R5bGUgb2Ygc3RyaW5nICogc3RyaW5nXG4gICAgfCBQcm9wZXJ0eSBvZiBzdHJpbmcgKiBWYWx1ZS50XG4gICAgfCBBdHRyaWJ1dGUgb2Ygc3RyaW5nICogc3RyaW5nXG4gICAgfCBIYW5kbGVyIG9mIHN0cmluZyAqICdtc2cgaGFuZGxlclxuXG5cbmxldCBzdHlsZSAoa2V5OiBzdHJpbmcpICh2YWx1ZTogc3RyaW5nKTogJ2EgdCA9XG4gICAgU3R5bGUgKGtleSwgdmFsdWUpXG5cbmxldCBwcm9wZXJ0eSAoa2V5OiBzdHJpbmcpICh2YWx1ZTogVmFsdWUudCk6ICdhIHQgPVxuICAgIFByb3BlcnR5IChrZXksIHZhbHVlKVxuXG5sZXQgYXR0cmlidXRlIChrZXk6IHN0cmluZykgKHZhbHVlOiBzdHJpbmcpOiAnYSB0ID1cbiAgICBBdHRyaWJ1dGUgKGtleSwgdmFsdWUpXG5cbmxldCBoYW5kbGVyXG4gICAgICAgIChrZXk6IHN0cmluZylcbiAgICAgICAgKHN0b3A6IEV2ZW50X2ZsYWcuc3RvcClcbiAgICAgICAgKHByZXZlbnQ6IEV2ZW50X2ZsYWcucHJldmVudClcbiAgICAgICAgKGRlY29kZTogJ21zZyBEZWNvZGUudClcbiAgICA6ICdhIHRcbiAgICA9XG4gICAgSGFuZGxlciAoa2V5LCAoc3RvcCwgcHJldmVudCwgZGVjb2RlKSlcbiIsIm9wZW4gRm1saWJfanMuQmFzZVxuXG5tb2R1bGUgRGljdGlvbmFyeSA9IERpY3Rpb25hcnkuTWFrZSAoU3RyaW5nKVxuXG50eXBlICdtc2cgaGFuZGxlcnMgPSAnbXNnIEhhbmRsZXIuVmlydHVhbC50IGxpc3QgRGljdGlvbmFyeS50XG5cbm1vZHVsZSBBdHRyaWJ1dGVzID1cbnN0cnVjdFxuICAgIHR5cGUgJ21zZyB0ID0ge1xuICAgICAgICBzdHlsZXM6ICAgc3RyaW5nIERpY3Rpb25hcnkudDtcbiAgICAgICAgcHJvcHM6ICAgIFZhbHVlLnQgRGljdGlvbmFyeS50O1xuICAgICAgICBhdHRyczogICAgc3RyaW5nICBEaWN0aW9uYXJ5LnQ7XG4gICAgICAgIGhhbmRsZXJzOiAnbXNnIGhhbmRsZXJzXG4gICAgfVxuXG4gICAgbGV0IG9mX2xpc3QgKGxzdDogJ21zZyBBdHRyaWJ1dGUudCBsaXN0KTogJ21zZyB0ID1cbiAgICAgICAgbGV0IG9wZW4gQXR0cmlidXRlIGluXG4gICAgICAgIExpc3QuZm9sZF9sZWZ0XG4gICAgICAgICAgICAoZnVuIGF0dHJzIC0+IGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgIHwgU3R5bGUgKG5hbWUsIHZhbHVlKSAtPlxuICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMgPSBEaWN0aW9uYXJ5LmFkZCBuYW1lIHZhbHVlIGF0dHJzLnN0eWxlc1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB8IFByb3BlcnR5IChuYW1lLCB2YWx1ZSkgLT5cbiAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMgPSBEaWN0aW9uYXJ5LmFkZCBuYW1lIHZhbHVlIGF0dHJzLnByb3BzXG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHwgQXR0cmlidXRlIChuYW1lLCB2YWx1ZSkgLT5cbiAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgPSBEaWN0aW9uYXJ5LmFkZCBuYW1lIHZhbHVlIGF0dHJzLmF0dHJzXG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIHwgSGFuZGxlciAobmFtZSwgaGFuZGxlcikgLT5cbiAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5LnNldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+IFtoYW5kbGVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSBsc3QgLT4gaGFuZGxlciA6OiBsc3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5oYW5kbGVyc1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHN0eWxlcyAgID0gRGljdGlvbmFyeS5lbXB0eTtcbiAgICAgICAgICAgICAgICBwcm9wcyAgICA9IERpY3Rpb25hcnkuZW1wdHk7XG4gICAgICAgICAgICAgICAgYXR0cnMgICAgPSBEaWN0aW9uYXJ5LmVtcHR5O1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gRGljdGlvbmFyeS5lbXB0eTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxzdFxuZW5kXG5cblxuXG5cblxuXG5cblxuXG5cbnR5cGUgKCdtc2csICdlbCkgdDAgPVxuICAgICgqIFB1cmUgdmlydHVhbCBkb20gZWxlbWVudCB3aGVyZSBhbGwgY2hpbGRyZW4gY29uc2lzdCBvZiBwYWlycyBvZiBhIHZpcnR1YWxcbiAgICAgICBkb20gYW5kIHJlYWwgZG9tIG5vZGUuXG4gICAgICopXG4gICAgfCBUZXh0IG9mIHN0cmluZ1xuICAgIHwgTm9kZSBvZiBzdHJpbmcgICogJ21zZyBBdHRyaWJ1dGVzLnQgKiAoJ21zZywgJ2VsKSB0MSBsaXN0XG4gICAgfCBOb2RlX25zIG9mIHN0cmluZyAgKiBzdHJpbmcgKiAnbXNnIEF0dHJpYnV0ZXMudCAqICgnbXNnLCAnZWwpIHQxIGxpc3RcbiAgICB8IEtleWVkIG9mIHN0cmluZyAqICdtc2cgQXR0cmlidXRlcy50ICogKCdtc2csICdlbCkgdDEgRGljdGlvbmFyeS50XG5cblxuYW5kICgnbXNnLCAnZWwpIHQxID1cbiAgICAoKiBQYWlyIG9mIGEgdmlydHVhbCBkb20gYW5kIGEgY29ycmVzcG9uZGluZyByZWFsIGRvbSAqKVxuICAgICgnbXNnLCAnZWwpIHQwICogJ2VsXG5cblxuXG50eXBlICdtc2cgdCA9XG4gICAgKCogUHVyZSB2aXJ0dWFsIGRvbSB3aXRob3V0IGFueSByZWFsIGRvbSBhdHRhY2hlZCB0byBpdC4gKilcbiAgICAoJ21zZywgdW5pdCkgdDFcblxuXG5cblxuKCogQ3JlYXRlIHB1cmUgdmlydHVhbCBkb20gZWxlbWVudHMgKilcblxubGV0IHRleHQgKHM6IHN0cmluZyk6ICdtc2cgdCA9XG4gICAgVGV4dCBzLCAoKVxuXG5cbmxldCBub2RlXG4gICAgICAgICh0YWc6IHN0cmluZylcbiAgICAgICAgKGF0dHJzOiAnbXNnIEF0dHJpYnV0ZS50IGxpc3QpXG4gICAgICAgIChsc3Q6ICdtc2cgdCBsaXN0KVxuICAgIDogJ21zZyB0XG4gICAgPVxuICAgIE5vZGUgKHRhZywgQXR0cmlidXRlcy5vZl9saXN0IGF0dHJzLCBsc3QpLCAoKVxuXG5cbmxldCBub2RlX25zXG4gICAgICAgIChuYW1lc3BhY2U6IHN0cmluZylcbiAgICAgICAgKHRhZzogc3RyaW5nKVxuICAgICAgICAoYXR0cnM6ICdtc2cgQXR0cmlidXRlLnQgbGlzdClcbiAgICAgICAgKGxzdDogJ21zZyB0IGxpc3QpXG4gICAgOiAnbXNnIHRcbiAgICA9XG4gICAgTm9kZV9ucyAobmFtZXNwYWNlLCB0YWcsIEF0dHJpYnV0ZXMub2ZfbGlzdCBhdHRycywgbHN0KSwgKClcblxuXG5cbmxldCBrZXllZFxuICAgICAgICAodGFnOiBzdHJpbmcpXG4gICAgICAgIChhdHRyczogJ21zZyBBdHRyaWJ1dGUudCBsaXN0KVxuICAgICAgICAobHN0OiAoc3RyaW5nICogJ21zZyB0KSBsaXN0KVxuICAgIDogJ21zZyB0XG4gICAgPVxuICAgIEtleWVkICh0YWcsIEF0dHJpYnV0ZXMub2ZfbGlzdCBhdHRycywgRGljdGlvbmFyeS5vZl9saXN0IGxzdCksICgpXG5cblxuXG5cbigqXG4gICAgTWFrZSBhbmQgdXBkYXRlIHJlYWwgZG9tIGZyb20gYSB2aXJ0dWFsIGRvbVxuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiopXG5cblxubGV0IGVsZW1lbnQ6ICgnbXNnLCAnZWwpIHQxIC0+ICdlbCA9XG4gICAgc25kXG5cblxudHlwZSAoJ21zZywgJ2VsKSBvcGVyYXRpb25zID0ge1xuICAgIG1ha2VfdGV4dDogICAgIHN0cmluZyAtPiAnZWw7XG4gICAgbWFrZV9lbGVtZW50OiAgc3RyaW5nIC0+ICdlbCBsaXN0IC0+ICdlbDtcbiAgICBtYWtlX2VsZW1lbnRfbnM6ICBzdHJpbmcgLT4gc3RyaW5nIC0+ICdlbCBsaXN0IC0+ICdlbDtcblxuICAgIGFkZF9jaGlsZDogICAgICdlbCAtPiAnZWwgLT4gdW5pdDtcbiAgICByZW1vdmVfY2hpbGQ6ICAnZWwgLT4gJ2VsIC0+IHVuaXQ7XG4gICAgcmVwbGFjZV9jaGlsZDogJ2VsIC0+ICdlbCAtPiAnZWwgLT4gdW5pdDtcbiAgICByZW1vdmVfY2hpbGRyZW46ICdlbCAtPiB1bml0O1xuXG4gICAgc2V0X3RleHQ6ICdlbCAtPiBzdHJpbmcgLT4gdW5pdDtcblxuICAgIHNldF9zdHlsZTogICAgICdlbCAtPiBzdHJpbmcgLT4gc3RyaW5nIC0+IHVuaXQ7XG4gICAgc2V0X2F0dHJpYnV0ZTogJ2VsIC0+IHN0cmluZyAtPiBzdHJpbmcgLT4gdW5pdDtcbiAgICBzZXRfcHJvcGVydHk6ICAnZWwgLT4gc3RyaW5nIC0+IFZhbHVlLnQgLT4gdW5pdDtcblxuICAgIHJlbW92ZV9zdHlsZTogICAgICdlbCAtPiBzdHJpbmcgLT4gdW5pdDtcbiAgICByZW1vdmVfYXR0cmlidXRlOiAnZWwgLT4gc3RyaW5nIC0+IHVuaXQ7XG4gICAgcmVtb3ZlX3Byb3BlcnR5OiAgJ2VsIC0+IHN0cmluZyAtPiB1bml0O1xuXG4gICAgc2V0X2hhbmRsZXJzOiAgJ2VsIC0+ICdtc2cgaGFuZGxlcnMgLT4gdW5pdDtcbiAgICB1cGRhdGVfaGFuZGxlcnM6ICAnZWwgLT4gJ21zZyBoYW5kbGVycyAtPiAnbXNnIGhhbmRsZXJzIC0+IHVuaXQ7XG59XG5cblxubGV0IGFkZF9hdHRyaWJ1dGVzXG4gICAgICAgIChvcHM6ICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgIChhdHRyczogJ21zZyBBdHRyaWJ1dGVzLnQpXG4gICAgICAgIChlbDogJ2VsKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBEaWN0aW9uYXJ5LihcbiAgICAgICAgaXRlciAob3BzLnNldF9zdHlsZSBlbCkgICAgIGF0dHJzLnN0eWxlcztcbiAgICAgICAgaXRlciAob3BzLnNldF9hdHRyaWJ1dGUgZWwpIGF0dHJzLmF0dHJzO1xuICAgICAgICBpdGVyIChvcHMuc2V0X3Byb3BlcnR5IGVsKSAgYXR0cnMucHJvcHMpO1xuICAgIG9wcy5zZXRfaGFuZGxlcnMgZWwgYXR0cnMuaGFuZGxlcnNcblxuXG5cblxubGV0IG1ha2VcbiAgICAgICAgKG9wczogKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKHZkb206ICdtc2cgdClcbiAgICA6ICgnbXNnLCAnZWwpIHQxXG4gICAgPVxuICAgIGxldCByZWMgbWFrZSB2ZG9tID1cbiAgICAgICAgbWF0Y2ggdmRvbSB3aXRoXG4gICAgICAgIHwgVGV4dCBzLCAoKSAtPlxuICAgICAgICAgICAgVGV4dCBzLCBvcHMubWFrZV90ZXh0IHNcblxuICAgICAgICB8IE5vZGUgKHRhZywgYXR0cnMsIGxzdCksICgpIC0+XG4gICAgICAgICAgICBsZXQgY29tYmluZWRfY2hpbGRyZW4sIHJlYWxfY2hpbGRyZW4gPVxuICAgICAgICAgICAgICAgIG1ha2VfY2hpbGRyZW4gbHN0XG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IG9wcy5tYWtlX2VsZW1lbnQgdGFnIHJlYWxfY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBhZGRfYXR0cmlidXRlcyBvcHMgYXR0cnMgcGFyZW50O1xuICAgICAgICAgICAgTm9kZSAodGFnLCBhdHRycywgY29tYmluZWRfY2hpbGRyZW4pLCBwYXJlbnRcblxuICAgICAgICB8IE5vZGVfbnMgKG5hbWVzcGFjZSwgdGFnLCBhdHRycywgbHN0KSwgKCkgLT5cbiAgICAgICAgICAgIGxldCBjb21iaW5lZF9jaGlsZHJlbiwgcmVhbF9jaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgbWFrZV9jaGlsZHJlbiBsc3RcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gb3BzLm1ha2VfZWxlbWVudF9ucyBuYW1lc3BhY2UgdGFnIHJlYWxfY2hpbGRyZW5cbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBhZGRfYXR0cmlidXRlcyBvcHMgYXR0cnMgcGFyZW50O1xuICAgICAgICAgICAgTm9kZV9ucyAobmFtZXNwYWNlLCB0YWcsIGF0dHJzLCBjb21iaW5lZF9jaGlsZHJlbiksIHBhcmVudFxuXG4gICAgICAgIHwgS2V5ZWQgKHRhZywgYXR0cnMsIF8pLCAoKSAtPlxuICAgICAgICAgICAgbGV0IGNvbWJpbmVkX2NoaWxkcmVuLCByZWFsX2NoaWxkcmVuID1cbiAgICAgICAgICAgICAgICBhc3NlcnQgZmFsc2VcbiAgICAgICAgICAgIGluXG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gb3BzLm1ha2VfZWxlbWVudCB0YWcgcmVhbF9jaGlsZHJlblxuICAgICAgICAgICAgaW5cbiAgICAgICAgICAgIGFkZF9hdHRyaWJ1dGVzIG9wcyBhdHRycyBwYXJlbnQ7XG4gICAgICAgICAgICBLZXllZCAodGFnLCBhdHRycywgY29tYmluZWRfY2hpbGRyZW4pLCBwYXJlbnRcblxuXG4gICAgYW5kIG1ha2VfY2hpbGRyZW4gKGxzdDogJ21zZyB0IGxpc3QpOiAoJ21zZywgJ2VsKSB0MSBsaXN0ICogJ2VsIGxpc3QgPVxuICAgICAgICBtYXRjaCBsc3Qgd2l0aFxuICAgICAgICB8IFtdIC0+XG4gICAgICAgICAgICBbXSwgW11cbiAgICAgICAgfCBoZCA6OiB0bCAtPlxuICAgICAgICAgICAgbGV0IF8sIGhkMiBhcyBoZCA9IG1ha2UgaGRcbiAgICAgICAgICAgIGFuZCB0bDEsIHRsMiA9IG1ha2VfY2hpbGRyZW4gdGwgaW5cbiAgICAgICAgICAgIGhkIDo6IHRsMSwgaGQyIDo6IHRsMlxuICAgIGluXG4gICAgbWFrZSB2ZG9tXG5cblxuXG5cbmxldCB1cGRhdGVfYXR0cmlidXRlc1xuICAgICAgICAob3BzOiAgICAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAocGFyOiAgICAnZWwpXG4gICAgICAgIChhdHRyczE6ICdtc2cgQXR0cmlidXRlcy50KVxuICAgICAgICAoYXR0cnMyOiAnbXNnIEF0dHJpYnV0ZXMudClcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgbGV0IG9wZW4gRGljdGlvbmFyeSBpblxuICAgIGxldCBzZXQgPSBvcHMuc2V0X3N0eWxlIHBhciBpblxuICAgIGRpZmZcbiAgICAgICAgc2V0IHNldCAob3BzLnJlbW92ZV9zdHlsZSBwYXIpXG4gICAgICAgIGF0dHJzMS5zdHlsZXMgYXR0cnMyLnN0eWxlcztcblxuICAgIGxldCBzZXQgPSBvcHMuc2V0X2F0dHJpYnV0ZSBwYXIgaW5cbiAgICBkaWZmXG4gICAgICAgIHNldCBzZXQgKG9wcy5yZW1vdmVfYXR0cmlidXRlIHBhcilcbiAgICAgICAgYXR0cnMxLmF0dHJzIGF0dHJzMi5hdHRycztcblxuICAgIGxldCBzZXQgPSBvcHMuc2V0X3Byb3BlcnR5IHBhciBpblxuICAgIGRpZmZcbiAgICAgICAgc2V0IHNldCAob3BzLnJlbW92ZV9wcm9wZXJ0eSBwYXIpXG4gICAgICAgIGF0dHJzMS5wcm9wcyBhdHRyczIucHJvcHM7XG5cbiAgICBvcHMudXBkYXRlX2hhbmRsZXJzIHBhciBhdHRyczEuaGFuZGxlcnMgYXR0cnMyLmhhbmRsZXJzXG5cblxuXG5sZXQgcmVjIHVwZGF0ZVxuICAgICAgICAob3BzOiAoJ21zZywgJ2VsKSBvcGVyYXRpb25zKVxuICAgICAgICAodmRvbTogJ21zZyB0KVxuICAgICAgICAoZG9tOiAoJ21zZywgJ2VsKSB0MSlcbiAgICA6ICgnbXNnLCAnZWwpIHQxICogYm9vbFxuICAgID1cbiAgICBtYXRjaCB2ZG9tLCBkb20gd2l0aFxuICAgIHwgKFRleHQgczEsICgpKSwgKFRleHQgczIsIGVsKSAtPlxuXG4gICAgICAgIGlmIHMxID0gczIgdGhlblxuICAgICAgICAgICAgZG9tLCBmYWxzZVxuICAgICAgICBlbHNlIGJlZ2luXG4gICAgICAgICAgICBvcHMuc2V0X3RleHQgZWwgczE7XG4gICAgICAgICAgICAoVGV4dCBzMSwgZWwpLCBmYWxzZVxuICAgICAgICBlbmRcblxuICAgIHwgKE5vZGUgKHRhZzEsIGF0dHJzMSwgbHN0MSksICgpKSxcbiAgICAgIChOb2RlICh0YWcyLCBhdHRyczIsIGxzdDIpLCBwYXIpIHdoZW4gdGFnMSA9IHRhZzIgLT5cblxuICAgICAgICB1cGRhdGVfYXR0cmlidXRlcyBvcHMgcGFyIGF0dHJzMSBhdHRyczI7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IExpc3QucmV2ICh1cGRhdGVfY2hpbGRyZW4gb3BzIHBhciBsc3QxIGxzdDIgW10pXG4gICAgICAgIGluXG4gICAgICAgIChOb2RlICh0YWcyLCBhdHRyczEsIGNoaWxkcmVuKSwgcGFyKSwgZmFsc2VcblxuICAgIHwgKE5vZGVfbnMgKG5zMSwgdGFnMSwgYXR0cnMxLCBsc3QxKSwgKCkpLFxuICAgICAgKE5vZGVfbnMgKG5zMiwgdGFnMiwgYXR0cnMyLCBsc3QyKSwgcGFyKSB3aGVuIHRhZzEgPSB0YWcyICYmIG5zMSA9IG5zMiAtPlxuXG4gICAgICAgIHVwZGF0ZV9hdHRyaWJ1dGVzIG9wcyBwYXIgYXR0cnMxIGF0dHJzMjtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gTGlzdC5yZXYgKHVwZGF0ZV9jaGlsZHJlbiBvcHMgcGFyIGxzdDEgbHN0MiBbXSlcbiAgICAgICAgaW5cbiAgICAgICAgKE5vZGVfbnMgKG5zMiwgdGFnMiwgYXR0cnMxLCBjaGlsZHJlbiksIHBhciksIGZhbHNlXG5cbiAgICB8IChLZXllZCAodGFnMSwgYXR0cnMxLCBkMSksICgpKSxcbiAgICAgIChLZXllZCAodGFnMiwgYXR0cnMyLCBkMiksIHBhcikgd2hlbiB0YWcxID0gdGFnMiAtPlxuXG4gICAgICAgIHVwZGF0ZV9hdHRyaWJ1dGVzIG9wcyBwYXIgYXR0cnMxIGF0dHJzMjtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gdXBkYXRlX2tleWVkIG9wcyBwYXIgZDEgZDJcbiAgICAgICAgaW5cbiAgICAgICAgKEtleWVkICh0YWcyLCBhdHRyczEsIGNoaWxkcmVuKSwgcGFyKSwgZmFsc2VcblxuICAgIHwgXywgXyAtPlxuXG4gICAgICAgIG1ha2Ugb3BzIHZkb20sIHRydWVcblxuXG5hbmQgdXBkYXRlX2tleWVkXG4gICAgICAgIChvcHM6ICgnbXNnLCAnZWwpIG9wZXJhdGlvbnMpXG4gICAgICAgIChwYXI6ICdlbClcbiAgICAgICAgKGQxOiAnbXNnIHQgRGljdGlvbmFyeS50KVxuICAgICAgICAoZDI6ICgnbXNnLCAnZWwpIHQxIERpY3Rpb25hcnkudClcbiAgICA6ICgnbXNnLCAnZWwpIHQxIERpY3Rpb25hcnkudFxuICAgID1cbiAgICBvcHMucmVtb3ZlX2NoaWxkcmVuIHBhcjtcbiAgICBsZXQgZCA9IHJlZiBEaWN0aW9uYXJ5LmVtcHR5XG4gICAgaW5cbiAgICBEaWN0aW9uYXJ5Lml0ZXJcbiAgICAgICAgKGZ1biBrZXkgdmRvbSAtPlxuICAgICAgICAgICAgIG1hdGNoIERpY3Rpb25hcnkuZmluZF9vcHQga2V5IGQyIHdpdGhcbiAgICAgICAgICAgICB8IE5vbmUgLT5cblxuICAgICAgICAgICAgICAgICBsZXQgKF8sIGVsKSBhcyBkb20gPSBtYWtlIG9wcyB2ZG9tIGluXG4gICAgICAgICAgICAgICAgIG9wcy5hZGRfY2hpbGQgZWwgcGFyO1xuICAgICAgICAgICAgICAgICBkIDo9IERpY3Rpb25hcnkuYWRkIGtleSBkb20gIWQ7XG5cbiAgICAgICAgICAgICB8IFNvbWUgZG9tIC0+XG5cbiAgICAgICAgICAgICAgICAgbGV0ICgoXywgZWwpIGFzIGRvbSksIF8gPSB1cGRhdGUgb3BzIHZkb20gZG9tIGluXG4gICAgICAgICAgICAgICAgIG9wcy5hZGRfY2hpbGQgZWwgcGFyO1xuICAgICAgICAgICAgICAgICBkIDo9IERpY3Rpb25hcnkuYWRkIGtleSBkb20gIWQ7XG4gICAgICAgIClcbiAgICAgICAgZDE7XG4gICAgIWRcblxuXG5cbmFuZCB1cGRhdGVfY2hpbGRyZW5cbiAgICAgICAgKG9wczogKCdtc2csICdlbCkgb3BlcmF0aW9ucylcbiAgICAgICAgKHBhcjogJ2VsKVxuICAgICAgICAobHN0MTogJ21zZyB0IGxpc3QpXG4gICAgICAgIChsc3QyOiAoJ21zZywgJ2VsKSB0MSBsaXN0KVxuICAgICAgICAobmxzdDI6ICgnbXNnLCAnZWwpIHQxIGxpc3QpXG4gICAgOiAoJ21zZywgJ2VsKSB0MSBsaXN0XG4gICAgPVxuICAgIG1hdGNoIGxzdDEsIGxzdDIgd2l0aFxuICAgIHwgW10sIFtdIC0+XG4gICAgICAgIG5sc3QyXG5cbiAgICB8IFtdLCAoXywgaGQpIDo6IHRsIC0+XG4gICAgICAgICgqIE9sZCBkb20gaGFzIHRvbyBtYW55IGNoaWxkcmVuICopXG4gICAgICAgIG9wcy5yZW1vdmVfY2hpbGQgaGQgcGFyO1xuICAgICAgICB1cGRhdGVfY2hpbGRyZW4gb3BzIHBhciBbXSB0bCBubHN0MlxuXG4gICAgfCBoZDEgOjogdGwxLCBbXSAtPlxuICAgICAgICAoKiBOZXcgdmRvbSBoYXMgbW9yZSBjaGlsZHJlbiB0aGFuIHRoZSBvbGQgZG9tICopXG4gICAgICAgIGxldCAoXywgaGQxMSkgYXMgaGQxID0gbWFrZSBvcHMgaGQxIGluXG4gICAgICAgIG9wcy5hZGRfY2hpbGQgaGQxMSBwYXI7XG4gICAgICAgIHVwZGF0ZV9jaGlsZHJlbiBvcHMgcGFyIHRsMSBbXSAoaGQxIDo6IG5sc3QyKVxuXG4gICAgfCBoZDEgOjogdGwxLCAgICgoXywgb2xkX2VsKSBhcyBoZDIpIDo6IHRsMiAtPlxuICAgICAgICBsZXQgKF8sIG5ld19lbCkgYXMgaGQyICwgY3JlYXRlZCA9IHVwZGF0ZSBvcHMgaGQxIGhkMiBpblxuICAgICAgICBpZiBjcmVhdGVkIHRoZW5cbiAgICAgICAgICAgIG9wcy5yZXBsYWNlX2NoaWxkIG9sZF9lbCBuZXdfZWwgcGFyO1xuICAgICAgICB1cGRhdGVfY2hpbGRyZW4gb3BzIHBhciB0bDEgdGwyIChoZDIgOjogbmxzdDIpXG4iLCJvcGVuIEZtbGliX2pzLkJhc2UuTWFpblxuXG5sZXQgYXR0ZW1wdCAoc3RyOiBzdHJpbmcpIChmOiB1bml0IC0+ICdhKSAoY2xlYW51cDogdW5pdCAtPiB1bml0KTogJ2EgPVxuICAgIHRyeVxuICAgICAgICBmICgpXG4gICAgd2l0aFxuICAgIHwgQXNzZXJ0X2ZhaWx1cmUgKGZpbGUsIGxpbmUsIGNvbCkgLT5cbiAgICAgICAgbGV0IG1zZyA9XG4gICAgICAgICAgICBTdHJpbmcuY29uY2F0XG4gICAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgICAgIFtcImFzc2VydGlvbiBmYWlsZWQgZmlsZTogXCJcbiAgICAgICAgICAgICAgICA7IGZpbGVcbiAgICAgICAgICAgICAgICA7IFwiIGxpbmU6IFwiOyBzdHJpbmdfb2ZfaW50IGxpbmVcbiAgICAgICAgICAgICAgICA7IFwiIGNvbDogXCI7ICAgc3RyaW5nX29mX2ludCBjb2xcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgIGluXG4gICAgICAgIGNsZWFudXAgKCk7XG4gICAgICAgIGxvZ19zdHJpbmcgc3RyO1xuICAgICAgICBsb2dfc3RyaW5nIG1zZztcbiAgICAgICAgcmFpc2VfanMgc3RyXG5cbiAgICB8IGV4biAtPlxuICAgICAgICBjbGVhbnVwICgpO1xuICAgICAgICBsb2dfc3RyaW5nIHN0cjtcbiAgICAgICAgbWF0Y2ggb2ZfZXhjZXB0aW9uIGV4biB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgbG9nX3N0cmluZyBcIlVuY2F1Z2h0IG9jYW1sIGV4Y2VwdGlvblwiO1xuICAgICAgICAgICAgcmFpc2UgZXhuXG4gICAgICAgIHwgU29tZSBqc19lcnJvciAtPlxuICAgICAgICAgICAgbG9nX3N0cmluZyBcIlVuY2F1Z2h0IGphdmFzY3JpcHQgZXhjZXB0aW9uXCI7XG4gICAgICAgICAgICByYWlzZV9qc19lcnJvciBqc19lcnJvclxuIiwibW9kdWxlIFIgPSBTdGRsaWIuUmFuZG9tXG5cbnR5cGUgJ2EgdCA9IFIuU3RhdGUudCAtPiAnYVxuXG5cbmxldCBydW4gKHJhbmRvbTogJ2EgdCk6ICdhID1cbiAgICByYW5kb20gKFIuU3RhdGUubWFrZV9zZWxmX2luaXQgKCkpXG5cblxubGV0IGNvbnN0YW50IChhOiAnYSk6ICdhIHQgPVxuICAgIGZ1biBfIC0+IGFcblxubGV0ICg+Pj0pIChtOiAnYSB0KSAoZjogJ2EgLT4gJ2IgdCk6ICdiIHQgPVxuICAgIGZ1biBzdGF0ZSAtPiBmIChtIHN0YXRlKSBzdGF0ZSAoKiBzdGF0ZSBpcyBtdXRhYmxlLiAqKVxuXG5sZXQgKCBsZXQqICkgPSAoPj49KVxuXG5cbmxldCBtYXAgKGY6ICdhIC0+ICdiKSAobTogJ2EgdCk6ICdiIHQgPVxuICAgIGxldCogYSA9IG0gaW5cbiAgICBjb25zdGFudCAoZiBhKVxuXG5cbmxldCBpbnQgKGJvdW5kOiBpbnQpOiBpbnQgdCA9XG4gICAgZnVuIHN0YXRlIC0+XG4gICAgYXNzZXJ0ICgwIDwgYm91bmQpO1xuICAgIFIuU3RhdGUuaW50IHN0YXRlIGJvdW5kXG5cblxubGV0IGZsb2F0IChib3VuZDogZmxvYXQpOiBmbG9hdCB0ID1cbiAgICBmdW4gc3RhdGUgLT5cbiAgICBhc3NlcnQgKDAuMCA8PSBib3VuZCk7XG4gICAgUi5TdGF0ZS5mbG9hdCBzdGF0ZSBib3VuZFxuXG5cbmxldCBib29sOiBib29sIHQgPVxuICAgIFIuU3RhdGUuYm9vbFxuXG5cbmxldCBjaG9vc2UgKGxzdDogJ2EgbGlzdCk6ICdhIHQgPVxuICAgIGxldCBhcnIgPSBBcnJheS5vZl9saXN0IGxzdCBpblxuICAgIGxldCBsZW4gPSBBcnJheS5sZW5ndGggYXJyIGluXG4gICAgbGV0KiBpID0gaW50IGxlbiBpblxuICAgIGFzc2VydCAoaSA8IGxlbik7XG4gICAgY29uc3RhbnQgYXJyLihpKVxuIiwib3BlbiBGbWxpYl9qc1xuXG5cbnR5cGUgZW1wdHkgPSBbXVxuXG50eXBlIGh0dHBfZXJyb3IgPSBbYEh0dHBfc3RhdHVzIG9mIGludCB8IGBIdHRwX25vX2pzb24gfCBgSHR0cF9kZWNvZGVdXG5cbnR5cGUgbm90X2ZvdW5kICA9IFtgTm90X2ZvdW5kXVxuXG5sZXQgYWJzdXJkIChfOiBlbXB0eSk6ICdhID1cbiAgICBhc3NlcnQgZmFsc2UgKCogT2shIFdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBiZWNhdXNlIGFuIG9iamVjdCBvZiB0eXBlIFtlbXB0eV1cbiAgICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIGNvbnN0cnVjdGVkLiAqKVxuXG5cblxuXG5cbnR5cGUgKCdhLCArJ2UpIHQgPVxuICAgIChCYXNlLlZhbHVlLnQgLT4gdW5pdCkgLT4gKCgnYSwgJ2UpIHJlc3VsdCAtPiB1bml0KSAtPiB1bml0XG5cblxuXG5sZXQgY29udGludWUgKGs6ICdhIC0+IHVuaXQpIChhOiAnYSk6IHVuaXQgPVxuICAgIEFzc2VydF9mYWlsdXJlLmF0dGVtcHRcbiAgICAgICAgXCJFeGNlcHRpb24gaW4gdGFzayBleGVjdXRpb25cIlxuICAgICAgICAoZnVuICgpIC0+IGsgYSlcbiAgICAgICAgKGZ1biAoKSAtPiAoKSlcblxuXG5sZXQgcnVuICh0YXNrOiAoJ2EsIGVtcHR5KSB0KSAocG9zdDogQmFzZS5WYWx1ZS50IC0+IHVuaXQpIChrOiAnYSAtPiB1bml0KTogdW5pdCA9XG4gICAgdGFza1xuICAgICAgICBwb3N0XG4gICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgfCBPayBhIC0+IGNvbnRpbnVlIGsgYVxuICAgICAgICAgICAgfCBFcnJvciBlIC0+XG4gICAgICAgICAgICAgICAgYWJzdXJkIGVcbiAgICAgICAgKVxuXG5cbmxldCBzdWNjZWVkIChhOiAnYSk6ICgnYSwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIChPayBhKVxuXG5cbmxldCByZXR1cm46ICdhIC0+ICgnYSwgJ2UpIHQgPVxuICAgIHN1Y2NlZWRcblxuXG5sZXQgZmFpbCAoZTogJ2UpOiAoJ2EsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayAoRXJyb3IgZSlcblxuXG5cbmxldCByZXN1bHQgKHI6ICgnYSwgJ2UpIHJlc3VsdCk6ICgnYSwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIHJcblxuXG5cbmxldCAoPj49KSAobTogKCdhLCAnZSkgdCkgKGY6ICdhIC0+ICgnYiwgJ2UpIHQpOiAoJ2IsICdlKSB0ID1cbiAgICBmdW4gcG9zdCBrIC0+XG4gICAgbVxuICAgICAgICBwb3N0XG4gICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgfCBPayBhIC0+XG4gICAgICAgICAgICAgICAgZiBhIHBvc3Qga1xuICAgICAgICAgICAgfCBFcnJvciBlIC0+XG4gICAgICAgICAgICAgICAgY29udGludWUgayAoRXJyb3IgZSkpXG5cbmxldCAoIGxldCogKSA9ICg+Pj0pXG5cblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYikgKG06ICgnYSwgJ2UpIHQpOiAoJ2IsICdlKSB0ID1cbiAgICBsZXQqIGEgPSBtIGluXG4gICAgcmV0dXJuIChmIGEpXG5cblxubGV0IG1ha2Vfc3VjY2VlZCAoZjogKCdhLCAnZSkgcmVzdWx0IC0+ICdiKSAobTogKCdhLCAnZSkgdCk6ICgnYiwgZW1wdHkpIHQgPVxuICAgIGZ1biBwb3N0IGsgLT5cbiAgICBtIHBvc3QgKGZ1biByZXMgLT4gY29udGludWUgayAoT2sgKGYgcmVzKSkpXG5cblxuXG5sZXQgbG9nX3N0cmluZyAoczogc3RyaW5nKTogKHVuaXQsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgQmFzZS5NYWluLmxvZ19zdHJpbmcgcztcbiAgICBjb250aW51ZSBrIChPayAoKSlcblxuXG5cbmxldCBsb2dfdmFsdWUgKHY6IEJhc2UuVmFsdWUudCk6ICh1bml0LCAnZSkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIEJhc2UuTWFpbi5sb2dfdmFsdWUgdjtcbiAgICBjb250aW51ZSBrIChPayAoKSlcblxuXG5cbmxldCBzbGVlcCAobXM6IGludCkgKGE6ICdhKSA6ICgnYSwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBpZ25vcmUgKFxuICAgICAgICBUaW1lci5zZXRcbiAgICAgICAgICAgIChmdW4gKCkgLT4gY29udGludWUgayAoT2sgYSkpXG4gICAgICAgICAgICBtc1xuICAgIClcblxuXG5sZXQgbmV4dF90aWNrIChhOiAnYSk6ICgnYSwgJ2UpIHQgPVxuICAgIHNsZWVwIDAgYVxuXG5cblxubGV0IHNlbmRfdG9famF2YXNjcmlwdCAodjogQmFzZS5WYWx1ZS50KTogKHVuaXQsICdlKSB0ID1cbiAgICBmdW4gcG9zdCBrIC0+XG4gICAgcG9zdCB2O1xuICAgIGNvbnRpbnVlIGsgKE9rICgpKVxuXG5cblxubGV0IGZvY3VzIChpZDogc3RyaW5nKTogKHVuaXQsIG5vdF9mb3VuZCkgdCA9XG4gICAgZnVuIF8gayAtPlxuICAgIG1hdGNoIERvbS4oRG9jdW1lbnQuZmluZCBpZCBXaW5kb3cuKGRvY3VtZW50IChnZXQgKCkpKSkgd2l0aFxuICAgIHwgTm9uZSAtPlxuICAgICAgICBrIChFcnJvciBgTm90X2ZvdW5kKVxuICAgIHwgU29tZSBlbCAtPlxuICAgICAgICBEb20uRWxlbWVudC5mb2N1cyBlbDtcbiAgICAgICAgY29udGludWUgayAoT2sgKCkpXG5cblxubGV0IGJsdXIgKGlkOiBzdHJpbmcpOiAodW5pdCwgbm90X2ZvdW5kKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgbWF0Y2ggRG9tLihEb2N1bWVudC5maW5kIGlkIFdpbmRvdy4oZG9jdW1lbnQgKGdldCAoKSkpKSB3aXRoXG4gICAgfCBOb25lIC0+XG4gICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIGBOb3RfZm91bmQpXG4gICAgfCBTb21lIGVsIC0+XG4gICAgICAgIERvbS5FbGVtZW50LmJsdXIgZWw7XG4gICAgICAgIGNvbnRpbnVlIGsgKE9rICgpKVxuXG5cblxuXG5sZXQgcmFuZG9tIChyYW5kOiAnYSBSYW5kb20udCk6ICgnYSwgJ2UpIHQgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBjb250aW51ZSBrIChPayAoUmFuZG9tLnJ1biByYW5kKSlcblxuXG5cbmxldCBodHRwX3RleHRcbiAgICAgICAgKG1ldGg6IHN0cmluZylcbiAgICAgICAgKHVybDogc3RyaW5nKVxuICAgICAgICAoaGVhZGVyczogKHN0cmluZyAqIHN0cmluZykgbGlzdClcbiAgICAgICAgKGJvZHk6IHN0cmluZylcbiAgICA6IChzdHJpbmcsIGh0dHBfZXJyb3IpIHRcbiAgICA9XG4gICAgZnVuIF8gayAtPlxuICAgIGxldCByZXEgPSBIdHRwX3JlcXVlc3QubWFrZSBtZXRoIHVybCBoZWFkZXJzIGJvZHkgaW5cbiAgICBsZXQgaGFuZGxlciBfID1cbiAgICAgICAgYXNzZXJ0IChIdHRwX3JlcXVlc3QucmVhZHlfc3RhdGUgcmVxID0gNCk7XG4gICAgICAgIGxldCBzdGF0dXMgPSBIdHRwX3JlcXVlc3Quc3RhdHVzIHJlcSBpblxuICAgICAgICBpZiBzdGF0dXMgPD4gMjAwIHRoZW4gKCogbm90IG9rICopXG4gICAgICAgICAgICBjb250aW51ZSBrIChFcnJvciAoYEh0dHBfc3RhdHVzIHN0YXR1cykpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGNvbnRpbnVlIGsgKE9rIChIdHRwX3JlcXVlc3QucmVzcG9uc2VfdGV4dF9zdHJpbmcgcmVxKSlcbiAgICBpblxuICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgXCJsb2FkZW5kXCJcbiAgICAgICAgaGFuZGxlclxuICAgICAgICAoSHR0cF9yZXF1ZXN0LmV2ZW50X3RhcmdldCByZXEpXG5cblxubGV0IGh0dHBfanNvblxuICAgICAgICAobWV0aDogc3RyaW5nKVxuICAgICAgICAodXJsOiBzdHJpbmcpXG4gICAgICAgIChoZWFkZXJzOiAoc3RyaW5nICogc3RyaW5nKSBsaXN0KVxuICAgICAgICAoYm9keTogc3RyaW5nKVxuICAgICAgICAoZGVjb2RlOiAnYSBCYXNlLkRlY29kZS50KVxuICAgIDogKCdhLCBodHRwX2Vycm9yKSB0XG4gICAgPVxuICAgIGZ1biBfIGsgLT5cbiAgICBsZXQgcmVxID0gSHR0cF9yZXF1ZXN0Lm1ha2UgbWV0aCB1cmwgaGVhZGVycyBib2R5IGluXG4gICAgbGV0IGhhbmRsZXIgXyA9XG4gICAgICAgIGFzc2VydCAoSHR0cF9yZXF1ZXN0LnJlYWR5X3N0YXRlIHJlcSA9IDQpO1xuICAgICAgICBsZXQgc3RhdHVzID0gSHR0cF9yZXF1ZXN0LnN0YXR1cyByZXEgaW5cbiAgICAgICAgaWYgc3RhdHVzIDw+IDIwMCB0aGVuICgqIG5vdCBvayAqKVxuICAgICAgICAgICAgY29udGludWUgayAoRXJyb3IgKGBIdHRwX3N0YXR1cyBzdGF0dXMpKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBtYXRjaFxuICAgICAgICAgICAgICAgIEJhc2UuVmFsdWUucGFyc2UgKEh0dHBfcmVxdWVzdC5yZXNwb25zZV90ZXh0X3ZhbHVlIHJlcSlcbiAgICAgICAgICAgIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlIGsgKEVycm9yIGBIdHRwX25vX2pzb24pXG4gICAgICAgICAgICB8IFNvbWUgdiAtPlxuICAgICAgICAgICAgICAgIG1hdGNoIGRlY29kZSB2IHdpdGhcbiAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWUgayAoRXJyb3IgYEh0dHBfZGVjb2RlKVxuICAgICAgICAgICAgICAgIHwgU29tZSBhIC0+XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGsgKE9rIGEpXG4gICAgaW5cbiAgICBFdmVudF90YXJnZXQuYWRkXG4gICAgICAgIFwibG9hZGVuZFwiXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICAgKEh0dHBfcmVxdWVzdC5ldmVudF90YXJnZXQgcmVxKVxuXG5cbmxldCBub3c6IChUaW1lLnQsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayAoT2sgKERhdGUubm93ICgpKSlcblxuXG5sZXQgdGltZV96b25lOiAoVGltZS5ab25lLnQsICdlKSB0ID1cbiAgICBmdW4gXyBrIC0+XG4gICAgY29udGludWUgayAoT2sgKERhdGUuKHpvbmVfb2Zmc2V0IChub3cgKCkpKSkpXG4iLCJvcGVuIEZtbGliX2pzXG5cbnR5cGUgJ20gdCA9XG4gICAgfCBOb25lXG4gICAgfCBXaW5kb3cgb2Ygc3RyaW5nICogJ20gSGFuZGxlci5WaXJ0dWFsLnRcbiAgICB8IEludGVydmFsX3RpbWVyICBvZiBpbnQgKiAoVGltZS50IC0+ICdtKVxuICAgIHwgTWVzc2FnZSBvZiAnbSBCYXNlLkRlY29kZS50XG4gICAgfCBVcmxfcmVxdWVzdCBvZiAoVXJsLnQgLT4gJ20pXG4gICAgfCBCYXRjaCAgb2YgJ20gdCBsaXN0XG5cblxubGV0IG5vbmU6ICdtIHQgPVxuICAgIE5vbmVcblxuXG5sZXQgYmF0Y2ggKGxzdDogJ20gdCBsaXN0KTogJ20gdCA9XG4gICAgQmF0Y2ggbHN0XG5cblxuXG5sZXQgb25fd2luZG93IChldmVudF90eXBlOiBzdHJpbmcpIChkZWNvZGU6ICdtIEJhc2UuRGVjb2RlLnQpXG4gICAgOiAnbSB0XG4gICAgPVxuICAgIFdpbmRvdyAoZXZlbnRfdHlwZSwgRXZlbnRfZmxhZy4obm9fc3RvcCwgbm9fcHJldmVudCwgZGVjb2RlKSlcblxuXG5cbmxldCBldmVyeSAobXM6IGludCkgKGNhbGxiYWNrOiBUaW1lLnQgLT4gJ20pOiAnbSB0ID1cbiAgICBJbnRlcnZhbF90aW1lciAobXMsIGNhbGxiYWNrKVxuXG5cbmxldCBvbl9tZXNzYWdlIChkZWNvZGU6ICdtIEJhc2UuRGVjb2RlLnQpOiAnbSB0ID1cbiAgICBNZXNzYWdlIGRlY29kZVxuXG5cbmxldCBvbl91cmxfcmVxdWVzdCAoZjogVXJsLnQgLT4gJ20pOiAnbSB0ID1cbiAgICBVcmxfcmVxdWVzdCBmXG5cblxuXG5sZXQgbWFwIChmOiAnYSAtPiAnYikgKHN1YjonYSB0KTogJ2IgdCA9XG4gICAgbGV0IHJlYyBtYXAgPVxuICAgICAgICBmdW5jdGlvblxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIE5vbmVcblxuICAgICAgICB8IEJhdGNoIGxzdCAtPlxuICAgICAgICAgICAgQmF0Y2ggKExpc3QubWFwIG1hcCBsc3QpXG5cbiAgICAgICAgfCBXaW5kb3cgKGV2ZW50X3R5cGUsIGRlY29kZSkgLT5cbiAgICAgICAgICAgIFdpbmRvdyAoZXZlbnRfdHlwZSwgSGFuZGxlci5WaXJ0dWFsLm1hcCBmIGRlY29kZSlcblxuICAgICAgICB8IEludGVydmFsX3RpbWVyIChtaWxsaXMsIGcpIC0+XG4gICAgICAgICAgICBJbnRlcnZhbF90aW1lciAobWlsbGlzLCBmdW4gdGltZSAtPiBmIChnIHRpbWUpKVxuXG4gICAgICAgIHwgTWVzc2FnZSBkZWNvZGUgLT5cbiAgICAgICAgICAgIE1lc3NhZ2UgQmFzZS5EZWNvZGUuKG1hcCBmIGRlY29kZSlcblxuICAgICAgICB8IFVybF9yZXF1ZXN0IGcgLT5cbiAgICAgICAgICAgIFVybF9yZXF1ZXN0IChmdW4gdXJsIC0+IGYgKGcgdXJsKSlcbiAgICBpblxuICAgIG1hcCBzdWJcblxuXG5cbmxldCBkZWNvZGVfa2V5X2V2ZW50IChmOiBzdHJpbmcgLT4gJ20pOiAnbSBCYXNlLkRlY29kZS50ID1cbiAgICBCYXNlLkRlY29kZS4obWFwIGYgKGZpZWxkIFwia2V5XCIgc3RyaW5nKSlcblxubGV0IGRlY29kZV9tb3VzZV9ldmVudCAoZjogaW50IC0+IGludCAtPiAnbSk6ICdtIEJhc2UuRGVjb2RlLnQgPVxuICAgIEJhc2UuRGVjb2RlLihcbiAgICAgICAgbGV0KiB4ID0gZmllbGQgXCJjbGllbnRYXCIgaW50IGluXG4gICAgICAgIGxldCogeSA9IGZpZWxkIFwiY2xpZW50WVwiIGludCBpblxuICAgICAgICByZXR1cm4gKGYgeCB5KVxuICAgIClcblxuXG5sZXQgb25fa2V5ZG93biAoZjogc3RyaW5nIC0+ICdtKTogJ20gdCA9XG4gICAgb25fd2luZG93IFwia2V5ZG93blwiIChkZWNvZGVfa2V5X2V2ZW50IGYpXG5cbmxldCBvbl9rZXl1cCAoZjogc3RyaW5nIC0+ICdtKTogJ20gdCA9XG4gICAgb25fd2luZG93IFwia2V5dXBcIiAoZGVjb2RlX2tleV9ldmVudCBmKVxuXG5sZXQgb25fbW91c2VfZG93biAoZjogaW50IC0+IGludCAtPiAnbSk6ICdtIHQgPVxuICAgIG9uX3dpbmRvdyBcIm1vdXNlZG93blwiIChkZWNvZGVfbW91c2VfZXZlbnQgZilcblxubGV0IG9uX21vdXNlX21vdmUgKGY6IGludCAtPiBpbnQgLT4gJ20pOiAnbSB0ID1cbiAgICBvbl93aW5kb3cgXCJtb3VzZW1vdmVcIiAoZGVjb2RlX21vdXNlX2V2ZW50IGYpXG5cbmxldCBvbl9tb3VzZV91cCAoZjogaW50IC0+IGludCAtPiAnbSk6ICdtIHQgPVxuICAgIG9uX3dpbmRvdyBcIm1vdXNldXBcIiAoZGVjb2RlX21vdXNlX2V2ZW50IGYpXG5cblxuXG5sZXQgb25fcmVzaXplIChmOiBpbnQgLT4gaW50IC0+ICdtKTogJ20gdCA9XG4gICAgbGV0IGRlY29kZSA9IEJhc2UuRGVjb2RlLihcbiAgICAgICAgbGV0KiBfID0gcmV0dXJuICgpIGluXG4gICAgICAgIGZpZWxkIFwiY3VycmVudFRhcmdldFwiIChcbiAgICAgICAgICAgIGxldCogd2lkdGggID0gZmllbGQgXCJpbm5lcldpZHRoXCIgaW50IGluXG4gICAgICAgICAgICBsZXQqIGhlaWdodCA9IGZpZWxkIFwiaW5uZXJIZWlnaHRcIiBpbnQgaW5cbiAgICAgICAgICAgIHJldHVybiAoZiB3aWR0aCBoZWlnaHQpXG4gICAgICAgIClcbiAgICApXG4gICAgaW5cbiAgICBvbl93aW5kb3cgXCJyZXNpemVcIiBkZWNvZGVcblxuXG5sZXQgb25fdmlzaWJpbGl0eV9jaGFuZ2UgKGY6IHN0cmluZyAtPiAnbSk6ICdtIHQgPVxuICAgIGxldCBkZWNvZGUgPSBCYXNlLkRlY29kZS4oXG4gICAgICAgIGZpZWxkIFwidGFyZ2V0XCIgKFxuICAgICAgICAgICAgKCogVGhlIHRhcmdldCBvZiB0aGUgdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnQgaXMgXCJkb2N1bWVudFwiIGFuZFxuICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiIGhhcyB0aGUgXCJ2aXNpYmlsaXR5U3RhdGVcIiBwcm9wZXJ0eS4gKilcbiAgICAgICAgICAgIGxldCogc3RhdGUgPSBmaWVsZCBcInZpc2liaWxpdHlTdGF0ZVwiIHN0cmluZyBpblxuICAgICAgICAgICAgcmV0dXJuIChmIHN0YXRlKVxuICAgICAgICApXG4gICAgKVxuICAgIGluXG4gICAgb25fd2luZG93IFwidmlzaWJpbGl0eWNoYW5nZVwiIGRlY29kZVxuIiwib3BlbiBGbWxpYl9qc1xuXG5tb2R1bGUgU3RyaW5nX21hcCA9IEZtbGliX3N0ZC5CdHJlZS5NYXAgKFN0cmluZylcbm1vZHVsZSBJbnRfbWFwICA9IEZtbGliX3N0ZC5CdHJlZS5NYXAgKEludClcblxubW9kdWxlIEludGlvbmFyeSAgPSBEaWN0aW9uYXJ5Lk1ha2UgKEludClcbm1vZHVsZSBEaWN0aW9uYXJ5ID0gRGljdGlvbmFyeS5NYWtlIChTdHJpbmcpXG5cbm1vZHVsZSBTdWJzID1cbnN0cnVjdFxuICAgIHR5cGUgJ20gaGFuZGxlciA9ICdtIEhhbmRsZXIuVmlydHVhbC50XG5cbiAgICB0eXBlICdtIHQgPSB7XG5cbiAgICAgICAgd2luZG93OiAnbSBoYW5kbGVyIGxpc3QgRGljdGlvbmFyeS50O1xuXG4gICAgICAgIHRpbWVyczogKFRpbWUudCAtPiAnbSkgbGlzdCBJbnRpb25hcnkudDtcblxuICAgICAgICBtZXNzYWdlOiAnbSBCYXNlLkRlY29kZS50IG9wdGlvbjtcblxuICAgICAgICB1cmxfcmVxdWVzdDogKFVybC50IC0+ICdtKSBvcHRpb25cbiAgICB9XG5cblxuICAgIGxldCBlbXB0eTogJ20gdCA9IHtcbiAgICAgICAgd2luZG93ICAgICAgPSBEaWN0aW9uYXJ5LmVtcHR5O1xuICAgICAgICB0aW1lcnMgICAgICA9IEludGlvbmFyeS5lbXB0eTtcbiAgICAgICAgbWVzc2FnZSAgICAgPSBOb25lO1xuICAgICAgICB1cmxfcmVxdWVzdCA9IE5vbmU7XG4gICAgfVxuXG5cbiAgICBsZXQgbWFrZSAoc3ViOiAnbSBTdWJzY3JpcHRpb24udCk6ICdtIHQgPVxuICAgICAgICBsZXQgb3BlbiBTdWJzY3JpcHRpb24gaW5cbiAgICAgICAgbGV0IHJlYyBtYWtlIHN1YnMgPSBmdW5jdGlvblxuICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgc3Vic1xuXG4gICAgICAgICAgICB8IEJhdGNoIGxzdCAtPlxuICAgICAgICAgICAgICAgIExpc3QuZm9sZF9sZWZ0XG4gICAgICAgICAgICAgICAgICAgIG1ha2VcbiAgICAgICAgICAgICAgICAgICAgc3Vic1xuICAgICAgICAgICAgICAgICAgICBsc3RcbiAgICAgICAgICAgIHwgV2luZG93IChldmVudF90eXBlLCBoYW5kbGVyKSAtPlxuICAgICAgICAgICAgICAgIHtzdWJzIHdpdGhcbiAgICAgICAgICAgICAgICAgd2luZG93ID1cbiAgICAgICAgICAgICAgICAgICAgIERpY3Rpb25hcnkuc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoYW5kbGVyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbHN0IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyIDo6IGxzdFxuICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzLndpbmRvd31cblxuICAgICAgICAgICAgfCBJbnRlcnZhbF90aW1lciAobWlsbGlzLCBjYWxsYmFjaykgLT5cbiAgICAgICAgICAgICAgICB7c3VicyB3aXRoXG4gICAgICAgICAgICAgICAgIHRpbWVycyA9XG4gICAgICAgICAgICAgICAgICAgICBJbnRpb25hcnkuc2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGxiYWNrXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvbWUgbHN0IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA6OiBsc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgc3Vicy50aW1lcnN9XG5cbiAgICAgICAgICAgIHwgTWVzc2FnZSBkZWNvZGUgLT5cbiAgICAgICAgICAgICAgICB7c3VicyB3aXRoXG4gICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggc3Vicy5tZXNzYWdlIHdpdGhcbiAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgZGVjb2RlXG4gICAgICAgICAgICAgICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMubWVzc2FnZX1cblxuICAgICAgICAgICAgfCBVcmxfcmVxdWVzdCBmIC0+XG4gICAgICAgICAgICAgICAge3N1YnMgd2l0aFxuICAgICAgICAgICAgICAgICB1cmxfcmVxdWVzdCA9XG4gICAgICAgICAgICAgICAgICAgICBtYXRjaCBzdWJzLnVybF9yZXF1ZXN0IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgZlxuICAgICAgICAgICAgICAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzLnVybF9yZXF1ZXN0fVxuICAgICAgICBpblxuICAgICAgICBtYWtlIGVtcHR5IHN1YlxuZW5kXG5cblxuXG5cblxuXG5cblxudHlwZSAnbSB0ID0ge1xuICAgIHN1YnM6ICAgJ20gU3Vicy50O1xuICAgIHdpbmRvdzogSGFuZGxlci5FdmVudEhzLnQ7XG4gICAgdGltZXJzOiBIYW5kbGVyLlRpbWVycy50O1xuICAgIHVybF9yZXF1ZXN0OiBIYW5kbGVyLlVybF9yZXF1ZXN0LnRcbn1cblxuXG5cblxubGV0IG1ha2UgKGRpc3BhdGNoOiAnbSAtPiB1bml0KSAoc3ViOiAnbSBTdWJzY3JpcHRpb24udCk6ICdtIHQgPVxuICAgIGxldCBzdWJzICAgPSBTdWJzLm1ha2Ugc3ViIGluXG4gICAgbGV0IG9wZW4gSGFuZGxlciBpblxuXG4gICAgbGV0IHdpbmRvdyA9IEV2ZW50SHMuZW1wdHkgKCkgaW5cbiAgICBFdmVudEhzLnNldFxuICAgICAgICBGbWxpYl9qcy5Eb20uV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpXG4gICAgICAgIGRpc3BhdGNoXG4gICAgICAgIHN1YnMud2luZG93XG4gICAgICAgIHdpbmRvdztcblxuICAgIGxldCB0aW1lcnMgPSBUaW1lcnMuZW1wdHkgKCkgaW5cbiAgICBUaW1lcnMuc2V0IGRpc3BhdGNoIHN1YnMudGltZXJzIHRpbWVycztcblxuICAgIGxldCB1cmxfcmVxdWVzdCA9IFVybF9yZXF1ZXN0LmVtcHR5ICgpIGluXG4gICAgVXJsX3JlcXVlc3Quc2V0IGRpc3BhdGNoIHN1YnMudXJsX3JlcXVlc3QgdXJsX3JlcXVlc3Q7XG4gICAgeyBzdWJzOyB3aW5kb3c7IHRpbWVyczsgdXJsX3JlcXVlc3QgfVxuXG5cblxubGV0IHVwZGF0ZSAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpIChzdWI6ICdtIFN1YnNjcmlwdGlvbi50KSAoczogJ20gdCk6ICdtIHQgPVxuICAgIGxldCBzdWJzICAgPSBTdWJzLm1ha2Ugc3ViIGluXG4gICAgbGV0IG9wZW4gSGFuZGxlciBpblxuICAgIEV2ZW50SHMudXBkYXRlXG4gICAgICAgIEZtbGliX2pzLkRvbS5XaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSlcbiAgICAgICAgZGlzcGF0Y2hcbiAgICAgICAgc3Vicy53aW5kb3dcbiAgICAgICAgcy5zdWJzLndpbmRvd1xuICAgICAgICBzLndpbmRvdztcbiAgICBUaW1lcnMudXBkYXRlIGRpc3BhdGNoIHN1YnMudGltZXJzIHMuc3Vicy50aW1lcnMgcy50aW1lcnM7XG4gICAgVXJsX3JlcXVlc3QudXBkYXRlXG4gICAgICAgIGRpc3BhdGNoXG4gICAgICAgIHN1YnMudXJsX3JlcXVlc3RcbiAgICAgICAgcy5zdWJzLnVybF9yZXF1ZXN0XG4gICAgICAgIHMudXJsX3JlcXVlc3Q7XG4gICAgeyBzIHdpdGggc3VicyB9XG4iLCJvcGVuIEZtbGliX2pzXG5cbnR5cGUgJ20gdCA9XG4gICAgfCBOb25lXG4gICAgfCBUYXNrIG9mICgnbSwgVGFzay5lbXB0eSkgVGFzay50XG4gICAgfCBUYXNrX3dvX21lc3NhZ2Ugb2YgKHVuaXQsIFRhc2suZW1wdHkpIFRhc2sudFxuICAgIHwgQmF0Y2ggb2YgJ20gdCBsaXN0XG5cblxubGV0IG5vbmU6ICdtIHQgPVxuICAgIE5vbmVcblxuXG5cbmxldCBiYXRjaCAobHN0OiAnbSB0IGxpc3QpOiAnbSB0ID1cbiAgICBCYXRjaCBsc3RcblxuXG5cbmxldCBwZXJmb3JtICh0YXNrOiAoJ2EsIFRhc2suZW1wdHkpIFRhc2sudCk6ICdtIHQgPVxuICAgIFRhc2sgdGFza1xuXG5cbmxldCBqdXN0X2RvICh0YXNrOiAodW5pdCwgVGFzay5lbXB0eSkgVGFzay50KTogJ20gdCA9XG4gICAgVGFza193b19tZXNzYWdlIHRhc2tcblxuXG5cbmxldCBhdHRlbXB0IChmOiAoJ2EsICdlKSByZXN1bHQgLT4gJ20pICh0YXNrOiAoJ2EsICdlKSBUYXNrLnQpOiAnbSB0ID1cbiAgICBUYXNrIChUYXNrLm1ha2Vfc3VjY2VlZCBmIHRhc2spXG5cblxubGV0IG1hcCAoZjogJ2EgLT4gJ2IpIChjbWQ6ICdhIHQpOiAnYiB0ID1cbiAgICBsZXQgcmVjIG1hcCA9IGZ1bmN0aW9uXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgTm9uZVxuICAgICAgICB8IFRhc2sgdGFzayAtPlxuICAgICAgICAgICAgVGFzayAoVGFzay5tYXAgZiB0YXNrKVxuICAgICAgICB8IFRhc2tfd29fbWVzc2FnZSBfIGFzIGNtZCAtPlxuICAgICAgICAgICAgY21kXG4gICAgICAgIHwgQmF0Y2ggbHN0IC0+XG4gICAgICAgICAgICBCYXRjaCAoTGlzdC5tYXAgbWFwIGxzdClcbiAgICBpblxuICAgIG1hcCBjbWRcblxuXG5cblxubGV0IGV4ZWN1dGUgKHBvc3Q6IEJhc2UuVmFsdWUudCAtPiB1bml0KSAoZGlzcGF0Y2g6ICdtIC0+IHVuaXQpIChjbWQ6ICdtIHQpOiB1bml0ID1cbiAgICBsZXQgcmVjIGV4ZSA9IGZ1bmN0aW9uXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgKClcblxuICAgICAgICB8IFRhc2sgdGFzayAtPlxuICAgICAgICAgICAgVGFzay5ydW4gdGFzayBwb3N0IGRpc3BhdGNoXG5cbiAgICAgICAgfCBUYXNrX3dvX21lc3NhZ2UgdGFzayAtPlxuICAgICAgICAgICAgVGFzay5ydW4gdGFzayBwb3N0IChmdW4gXyAtPiAoKSlcblxuICAgICAgICB8IEJhdGNoIGxzdCAtPlxuICAgICAgICAgICAgTGlzdC5pdGVyIGV4ZSBsc3RcbiAgICBpblxuICAgIGV4ZSBjbWRcbiIsIigqIFRoaXMgbW9kdWxlIGhhbmRsZXMgYWxsIGNhbGxzIHRvIGphdmFzY3JpcHRcblxuKilcblxub3BlbiBGbWxpYl9qc1xub3BlbiBGbWxpYl9qcy5Eb21cblxuXG5cblxuKCogQmFzaWMgZGVmaW5pdGlvbnNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuKilcblxuXG5cbnR5cGUgZWxlbWVudCAgICAgICAgICAgICA9IEVsZW1lbnQudCAqIEhhbmRsZXIuRXZlbnRIcy50XG5cbnR5cGUgbm9kZSAgICAgICAgICAgICAgICA9IE5vZGUudCAqIGVsZW1lbnQgb3B0aW9uXG5cbnR5cGUgJ21zZyBkb20gICAgICAgICAgICA9ICgnbXNnLCBub2RlKSBWZG9tLnQxXG5cbnR5cGUgJ21zZyBkb21fb3BlcmF0aW9ucyA9ICgnbXNnLCBub2RlKSBWZG9tLm9wZXJhdGlvbnNcblxuXG5sZXQgZG9jdW1lbnQgKCk6IERvY3VtZW50LnQgPSBXaW5kb3cuKGdldCAoKSB8PiBkb2N1bWVudClcblxudHlwZSAoJ3N0YXRlLCAnbXNnKSB2aWV3MSA9ICdzdGF0ZSAtPiAnbXNnIFZkb20udFxudHlwZSAoJ3N0YXRlLCAnbXNnKSB2aWV3MiA9ICdzdGF0ZSAtPiAnbXNnIFZkb20udCAqIHN0cmluZ1xuXG50eXBlICgnc3RhdGUsICdtc2cpIHVwZGF0ZTEgPSAnc3RhdGUgLT4gJ21zZyAtPiAnc3RhdGVcbnR5cGUgKCdzdGF0ZSwgJ21zZykgdXBkYXRlMiA9ICdzdGF0ZSAtPiAnbXNnIC0+ICdzdGF0ZSAqICdtc2cgQ29tbWFuZC50XG5cblxuXG50eXBlICgncywgJ20pIG9wZXJhdGlvbnMgPVxuICAgIHwgU2FuZGJveCBvZlxuICAgICAgICAgICgncywgJ20pIHZpZXcxXG4gICAgICAgICAgKiAoJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICAgKiAoJ3MsICdtKSB1cGRhdGUxXG4gICAgfCBFbGVtZW50IG9mXG4gICAgICAgICAgKCdzLCAnbSkgdmlldzFcbiAgICAgICAgICAqICgncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgICAqICgncywgJ20pIHVwZGF0ZTJcbiAgICAgICAgICAqIChCYXNlLlZhbHVlLnQgLT4gdW5pdClcbiAgICB8IEFwcCAgICAgb2ZcbiAgICAgICAgICAoJ3MsICdtKSB2aWV3MlxuICAgICAgICAgICogKCdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAgICogKCdzLCAnbSkgdXBkYXRlMlxuICAgICAgICAgICogKEJhc2UuVmFsdWUudCAtPiB1bml0KVxuXG5cblxudHlwZSAoJ3N0YXRlLCAnbXNnKSBkYXRhID1cbiAgICB7XG4gICAgICAgIG11dGFibGUgc3RhdGU6ICdzdGF0ZTtcbiAgICAgICAgbXV0YWJsZSBkaXJ0eTogYm9vbDtcbiAgICAgICAgbXV0YWJsZSBkb206ICAgJ21zZyBkb20gb3B0aW9uO1xuICAgICAgICBtdXRhYmxlIHN1YnM6ICAnbXNnIFN1YnNjcmlwdGlvbnMudCBvcHRpb247XG4gICAgICAgIHJvb3Q6ICAgICAgICAgIEVsZW1lbnQudDtcbiAgICAgICAgb3BlcmF0aW9uczogICAgKCdzdGF0ZSwgJ21zZykgb3BlcmF0aW9ucztcbiAgICB9XG5cblxuXG5cblxuKCogRG9tIG9wZXJhdGlvbnNcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICBBY2Nlc3NpbmcgdGhlIHJlYWwgZG9tLlxuXG4gICBPcGVyYXRpb25zIGFyZSBuZWVkZWQgZm9yIHRoZSBtb2R1bGUgW1Zkb21dLlxuKilcblxuXG5sZXQgZG9tX29wZXJhdGlvbnMgKGRpc3BhdGNoOiAnbXNnIC0+IHVuaXQpOiAnbXNnIGRvbV9vcGVyYXRpb25zID1cbiAgICBsZXQgZ2V0X2JvdGg6XG4gICAgICAgIG5vZGUgLT4gZWxlbWVudFxuICAgICAgICA9XG4gICAgICAgIGZ1bmN0aW9uXG4gICAgICAgIHwgKF8sIFNvbWUgZWwpIC0+XG4gICAgICAgICAgZWxcbiAgICAgICAgfCBfIC0+XG4gICAgICAgICAgICBhc3NlcnQgZmFsc2UgKCogSWxsZWdhbCBjYWxsICopXG4gICAgaW5cbiAgICBsZXQgZ2V0X2VsZW1lbnQ6XG4gICAgICAgIE5vZGUudCAqIGVsZW1lbnQgb3B0aW9uIC0+IEVsZW1lbnQudFxuICAgICAgICA9XG4gICAgICAgIGZ1bmN0aW9uXG4gICAgICAgIHwgKF8sIFNvbWUgKGVsLCBfKSkgLT5cbiAgICAgICAgICBlbFxuICAgICAgICB8IF8gLT5cbiAgICAgICAgICAgIGFzc2VydCBmYWxzZSAoKiBJbGxlZ2FsIGNhbGwgKilcbiAgICBpblxuICAgIHtcbiAgICAgICAgbWFrZV90ZXh0ID1cbiAgICAgICAgICAgIChmdW4gcyAtPiBEb2N1bWVudC5jcmVhdGVfdGV4dF9ub2RlIHMgKGRvY3VtZW50ICgpKSwgTm9uZSk7XG5cbiAgICAgICAgbWFrZV9lbGVtZW50ID1cbiAgICAgICAgICAgIChmdW4gdGFnIChsc3Q6IG5vZGUgbGlzdCkgLT5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gRG9jdW1lbnQgaW5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gRWxlbWVudCBpblxuICAgICAgICAgICAgICAgICBsZXQgb3BlbiBOb2RlIGluXG4gICAgICAgICAgICAgICAgIGxldCBkb2MgPSBkb2N1bWVudCAoKSBpblxuICAgICAgICAgICAgICAgICBsZXQgZWwgID0gY3JlYXRlX2VsZW1lbnQgdGFnIGRvYyBpblxuICAgICAgICAgICAgICAgICBMaXN0Lml0ZXJcbiAgICAgICAgICAgICAgICAgICAgIChmdW4gKGNoaWxkLCBfKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQgY2hpbGQgKG5vZGUgZWwpKVxuICAgICAgICAgICAgICAgICAgICAgbHN0O1xuICAgICAgICAgICAgICAgICBub2RlIGVsLCBTb21lIChlbCwgSGFuZGxlci5FdmVudEhzLmVtcHR5ICgpKSk7XG5cbiAgICAgICAgbWFrZV9lbGVtZW50X25zID1cbiAgICAgICAgICAgIChmdW4gbmFtZXNwYWNlIHRhZyAobHN0OiBub2RlIGxpc3QpIC0+XG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIERvY3VtZW50IGluXG4gICAgICAgICAgICAgICAgIGxldCBvcGVuIEVsZW1lbnQgaW5cbiAgICAgICAgICAgICAgICAgbGV0IG9wZW4gTm9kZSBpblxuICAgICAgICAgICAgICAgICBsZXQgZG9jID0gZG9jdW1lbnQgKCkgaW5cbiAgICAgICAgICAgICAgICAgbGV0IGVsICA9IGNyZWF0ZV9lbGVtZW50X25zIG5hbWVzcGFjZSB0YWcgZG9jIGluXG4gICAgICAgICAgICAgICAgIExpc3QuaXRlclxuICAgICAgICAgICAgICAgICAgICAgKGZ1biAoY2hpbGQsIF8pIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCBjaGlsZCAobm9kZSBlbCkpXG4gICAgICAgICAgICAgICAgICAgICBsc3Q7XG4gICAgICAgICAgICAgICAgIG5vZGUgZWwsIFNvbWUgKGVsLCBIYW5kbGVyLkV2ZW50SHMuZW1wdHkgKCkpKTtcblxuICAgICAgICBhZGRfY2hpbGQgPVxuICAgICAgICAgICAgKGZ1biAoY2hpbGQsIF8pIChwYXIsIF8pIC0+XG4gICAgICAgICAgICAgICAgIE5vZGUuYXBwZW5kIGNoaWxkIHBhcik7XG5cbiAgICAgICAgcmVtb3ZlX2NoaWxkID1cbiAgICAgICAgICAgIChmdW4gKGNoaWxkLCBfKSAocGFyLCBfKSAtPlxuICAgICAgICAgICAgICAgICBOb2RlLnJlbW92ZSBjaGlsZCBwYXIpO1xuXG4gICAgICAgIHJlbW92ZV9jaGlsZHJlbiA9XG4gICAgICAgICAgICAoZnVuIChwYXIsIF8pIC0+XG4gICAgICAgICAgICAgICAgIE5vZGUucmVtb3ZlX2NoaWxkcmVuIHBhcik7XG5cbiAgICAgICAgcmVwbGFjZV9jaGlsZCA9XG4gICAgICAgICAgICAoZnVuIChvbGRfY2hpbGQsIF8pIChuZXdfY2hpbGQsIF8pIChwYXIsIF8pIC0+XG4gICAgICAgICAgICAgICAgIE5vZGUucmVwbGFjZSBuZXdfY2hpbGQgb2xkX2NoaWxkIHBhcik7XG5cbiAgICAgICAgc2V0X3RleHQgPVxuICAgICAgICAgICAgKGZ1biAobm9kZSwgXykgdGV4dCAtPiBOb2RlLnNldF9ub2RlX3ZhbHVlIHRleHQgbm9kZSk7XG5cblxuICAgICAgICBzZXRfc3R5bGUgPVxuICAgICAgICAgICAgKGZ1biBlbCBrZXkgdmFsdWUgLT5cbiAgICAgICAgICAgICAgICBTdHlsZS5zZXQga2V5IHZhbHVlIChFbGVtZW50LnN0eWxlIChnZXRfZWxlbWVudCBlbCkpKTtcblxuICAgICAgICBzZXRfYXR0cmlidXRlID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgIEVsZW1lbnQuc2V0X2F0dHJpYnV0ZSBrZXkgdmFsdWUgKGdldF9lbGVtZW50IGVsKSk7XG5cbiAgICAgICAgc2V0X3Byb3BlcnR5ID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IHZhbHVlIC0+XG4gICAgICAgICAgICAgICAgIEVsZW1lbnQuc2V0X3Byb3BlcnR5IGtleSB2YWx1ZSAoZ2V0X2VsZW1lbnQgZWwpKTtcblxuXG4gICAgICAgIHJlbW92ZV9zdHlsZSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSAtPlxuICAgICAgICAgICAgICAgICBTdHlsZS5yZW1vdmVcbiAgICAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgICAgICAgKEVsZW1lbnQuc3R5bGUgKGdldF9lbGVtZW50IGVsKSkpO1xuXG5cbiAgICAgICAgcmVtb3ZlX2F0dHJpYnV0ZSA9XG4gICAgICAgICAgICAoZnVuIGVsIGtleSAtPlxuICAgICAgICAgICAgICAgICBFbGVtZW50LnJlbW92ZV9hdHRyaWJ1dGUga2V5IChnZXRfZWxlbWVudCBlbCkpO1xuXG5cbiAgICAgICAgcmVtb3ZlX3Byb3BlcnR5ID1cbiAgICAgICAgICAgIChmdW4gZWwga2V5IC0+XG4gICAgICAgICAgICAgICAgIEVsZW1lbnQuZGVsZXRlX3Byb3BlcnR5IGtleSAoZ2V0X2VsZW1lbnQgZWwpKTtcblxuXG4gICAgICAgIHNldF9oYW5kbGVycyA9XG4gICAgICAgICAgICAoZnVuIGVsIGRpY3QgLT5cbiAgICAgICAgICAgICAgICAgbGV0IGVsLCByZWFscyA9IGdldF9ib3RoIGVsIGluXG4gICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBOb2RlLmV2ZW50X3RhcmdldCAoRWxlbWVudC5ub2RlIGVsKSBpblxuICAgICAgICAgICAgICAgICBIYW5kbGVyLkV2ZW50SHMuc2V0IHRhcmdldCBkaXNwYXRjaCBkaWN0IHJlYWxzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHVwZGF0ZV9oYW5kbGVycyA9XG4gICAgICAgICAgICAoZnVuIGVsIGRpY3QxIGRpY3QyIC0+XG4gICAgICAgICAgICAgICAgIGxldCBlbCwgcmVhbHMgPSBnZXRfYm90aCBlbCBpblxuICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gTm9kZS5ldmVudF90YXJnZXQgKEVsZW1lbnQubm9kZSBlbCkgaW5cbiAgICAgICAgICAgICAgICAgSGFuZGxlci5FdmVudEhzLnVwZGF0ZSB0YXJnZXQgZGlzcGF0Y2ggZGljdDEgZGljdDIgcmVhbHMpO1xuICAgIH1cblxuXG5cblxuXG4oKiBEaXNwYXRjaGluZyBtZXNzYWdlcyB0byB0aGUgYXBwbGljYXRpb25cbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAtIGNhbGwgdGhlIHVwZGF0ZSBmdW5jdGlvblxuXG4gICAgICAgIHN0YXRlIC0+IG1zZyAtPiBzdGF0ZSAqIGNtZFxuXG4gICAtIHVwZGF0ZSB0aGUgc3Vic2NyaXB0aW9uc1xuXG4gICAgICAgIHN0YXRlIG1pZ2h0IGhhdmUgY2hhbmdlZCwgdGhlcmVmb3JlIHN1YnNjcmlwdGlvbnMgbWlnaHQgaGF2ZSBjaGFuZ2VkLlxuXG4gICAtIGV4ZWN1dGUgY29tbWFuZHNcblxuKilcblxubGV0IHJlYyBkaXNwYXRjaCAoZGF0YTogKCdzdGF0ZSwgJ21zZykgZGF0YSkgKG1zZzogJ21zZyk6IHVuaXQgPVxuICAgIGxldCB1cGRhdGVfZGF0YSBzdGF0ZSA9XG4gICAgICAgIGxldCBzdGF0ZV9kaWZmZXJlbnQgPSBub3QgKHN0YXRlID09IGRhdGEuc3RhdGUpXG4gICAgICAgIGluXG4gICAgICAgIGRhdGEuZGlydHkgPC0gZGF0YS5kaXJ0eSB8fCBzdGF0ZV9kaWZmZXJlbnQ7XG4gICAgICAgIGlmIHN0YXRlX2RpZmZlcmVudCB0aGVuIGJlZ2luXG4gICAgICAgICAgICBkYXRhLnN0YXRlIDwtIHN0YXRlO1xuICAgICAgICAgICAgdXBkYXRlX3N1YnNjcmlwdGlvbnMgZGF0YVxuICAgICAgICBlbmRcbiAgICBpblxuICAgIG1hdGNoIGRhdGEub3BlcmF0aW9ucyB3aXRoXG4gICAgfCBTYW5kYm94IChfLCBfLCB1cGRhdGUpIC0+XG4gICAgICAgIHVwZGF0ZV9kYXRhICh1cGRhdGUgZGF0YS5zdGF0ZSBtc2cpO1xuXG4gICAgfCBFbGVtZW50IChfLCBfLCB1cGRhdGUsIHBvc3QpIC0+XG4gICAgICAgIGxldCBzdGF0ZSwgY21kID0gdXBkYXRlIGRhdGEuc3RhdGUgbXNnIGluXG4gICAgICAgIHVwZGF0ZV9kYXRhIHN0YXRlO1xuICAgICAgICBDb21tYW5kLmV4ZWN1dGUgcG9zdCAoZGlzcGF0Y2hfbmV4dCBkYXRhKSBjbWRcblxuICAgIHwgQXBwIChfLCBfLCB1cGRhdGUsIHBvc3QpIC0+XG4gICAgICAgIGxldCBzdGF0ZSwgY21kID0gdXBkYXRlIGRhdGEuc3RhdGUgbXNnIGluXG4gICAgICAgIHVwZGF0ZV9kYXRhIHN0YXRlO1xuICAgICAgICBDb21tYW5kLmV4ZWN1dGUgcG9zdCAoZGlzcGF0Y2hfbmV4dCBkYXRhKSBjbWRcblxuXG5hbmQgZGlzcGF0Y2hfbmV4dCAoZGF0YTogKCdzdGF0ZSwgJ21zZykgZGF0YSkgKG1zZzogJ21zZyk6IHVuaXQgPVxuICAgIGlnbm9yZSAoIFRpbWVyLnNldCAoZnVuICgpIC0+IGRpc3BhdGNoIGRhdGEgbXNnKSAwIClcblxuXG5hbmQgdXBkYXRlX3N1YnNjcmlwdGlvbnMgKGRhdGE6ICgncywgJ20pIGRhdGEpOiB1bml0ID1cbiAgICAoKiBjcmVhdGUgb3IgdXBkYXRlIHRoZSBzdWJzY3JpcHRpb25zLCBpLmUuIGluc3RhbGwgYWxsIG5lY2Vzc2FyeSBoYW5kbGVycy4gKilcbiAgICBsZXQgdXBkYXRlICgpID1cbiAgICAgICAgbWF0Y2ggZGF0YS5vcGVyYXRpb25zLCBkYXRhLnN1YnMgd2l0aFxuICAgICAgICB8IFNhbmRib3ggKF8sIHN1YiwgXyksICAgIE5vbmVcbiAgICAgICAgfCBBcHAgKF8sIHN1YiwgXywgXyksICAgICBOb25lXG4gICAgICAgIHwgRWxlbWVudCAoXywgc3ViLCBfLCBfKSwgTm9uZSAtPlxuICAgICAgICAgICAgZGF0YS5zdWJzIDwtXG4gICAgICAgICAgICAgICAgU29tZSAoU3Vic2NyaXB0aW9ucy5tYWtlIChkaXNwYXRjaCBkYXRhKSAoc3ViIGRhdGEuc3RhdGUpKVxuXG4gICAgICAgIHwgU2FuZGJveCAoXywgc3ViLCBfKSwgICAgU29tZSBzdWJzXG4gICAgICAgIHwgQXBwIChfLCBzdWIsIF8sIF8pLCAgICAgU29tZSBzdWJzXG4gICAgICAgIHwgRWxlbWVudCAoXywgc3ViLCBfLCBfKSwgU29tZSBzdWJzXG4gICAgICAgICAgICB3aGVuIGRhdGEuZGlydHkgLT5cbiAgICAgICAgICAgIGRhdGEuc3VicyA8LVxuICAgICAgICAgICAgICAgIFNvbWUgKFN1YnNjcmlwdGlvbnMudXBkYXRlIChkaXNwYXRjaCBkYXRhKSAoc3ViIGRhdGEuc3RhdGUpIHN1YnMpXG5cbiAgICAgICAgfCBfLCBfIC0+XG4gICAgICAgICAgICAoKVxuICAgIGluXG4gICAgQXNzZXJ0X2ZhaWx1cmUuYXR0ZW1wdFxuICAgICAgICBcIkV4Y2VwdGlvbiBpbiAndXBkYXRlX3N1YnNjcmlwdGlvbnMnIG9mIEZtbGliX2Jyb3dzZXJcIlxuICAgICAgICB1cGRhdGVcbiAgICAgICAgKGZ1biAoKSAtPiAoKSlcblxuXG5cblxuXG5cblxuXG5cblxuKCogUHJvZHVjZSB0aGUgcmVhbCBkb20gaS5lLiByZW5kZXIgdGhlIGRvbVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgIFRoaXMgaXMgdGhlcmUgdGhlIGFjY2VzcyB0byB0aGUgcmVhbCBkb20gb2YgdGhlIGJyb3dzZXIgaGFwcGVucy5cbiopXG5cblxubGV0IHB1dF9iZWxvd19yb290IChkYXRhOiAoJ3N0YXRlLCAnbXNnKSBkYXRhKSAoZG9tOiAnbXNnIGRvbSk6IHVuaXQgPVxuICAgIGxldCByb290X25vZGUgPSBFbGVtZW50Lm5vZGUgZGF0YS5yb290IGluXG4gICAgTm9kZS5yZW1vdmVfY2hpbGRyZW4gcm9vdF9ub2RlO1xuICAgIE5vZGUuYXBwZW5kIChWZG9tLmVsZW1lbnQgZG9tIHw+IGZzdCkgcm9vdF9ub2RlXG5cblxuXG5cblxubGV0IHZkb20gKGRhdGE6ICgncywgJ20pIGRhdGEpOiAnbSBWZG9tLnQgKiAodW5pdCAtPiB1bml0KSA9XG4gICAgKCogR2V0IHRoZSB2aXJ0dWFsIGRvbSBmcm9tIHRoZSBzdGF0ZSBhbmQgdGhlIHRpdGxlIHVwZGF0ZSBmdW5jdGlvbi4gKilcbiAgICBtYXRjaCBkYXRhLm9wZXJhdGlvbnMgd2l0aFxuICAgIHwgU2FuZGJveCAodmlldywgXywgXykgLT5cbiAgICAgICAgdmlldyBkYXRhLnN0YXRlLCAoZnVuICgpIC0+ICgpKVxuICAgIHwgRWxlbWVudCAodmlldywgXywgXywgXykgLT5cbiAgICAgICAgdmlldyBkYXRhLnN0YXRlLCAoZnVuICgpIC0+ICgpKVxuICAgIHwgQXBwICh2aWV3LCBfLCBfLCBfKSAtPlxuICAgICAgICBsZXQgdmRvbSwgdGl0bGUgPSB2aWV3IGRhdGEuc3RhdGUgaW5cbiAgICAgICAgdmRvbSwgKGZ1biAoKSAtPiBEb2N1bWVudC5zZXRfdGl0bGUgdGl0bGUgKGRvY3VtZW50ICgpKSlcblxuXG5cblxubGV0IHVwZGF0ZV9kb20gKGRhdGE6ICgnc3RhdGUsICdtc2cpIGRhdGEpOiB1bml0ID1cbiAgICAoKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSByZWFsIGRvbSBiYXNlZCBvbiB0aGUgc3RhdGUuIEZpcnN0IGNyZWF0ZSBhIHZpcnR1YWxcbiAgICAgICBkb20gZnJvbSB0aGUgc3RhdGUgYW5kIHRoZW4gY3JlYXRlIG9yIHVwZGF0ZSB0aGUgcmVhbCBkb20uICopXG4gICAgbGV0IHVwZGF0ZSAoKSA9XG4gICAgICAgIGxldCB2ZG9tIGRhdGEgPVxuICAgICAgICAgICAgbGV0IHZkb20sIHNldF90aXRsZSA9IHZkb20gZGF0YSBpblxuICAgICAgICAgICAgc2V0X3RpdGxlICgpO1xuICAgICAgICAgICAgdmRvbVxuICAgICAgICBpblxuICAgICAgICBtYXRjaCBkYXRhLmRvbSB3aXRoXG4gICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgbGV0IGRvbSA9XG4gICAgICAgICAgICAgICAgVmRvbS5tYWtlXG4gICAgICAgICAgICAgICAgICAgIChkb21fb3BlcmF0aW9ucyAoZGlzcGF0Y2ggZGF0YSkpXG4gICAgICAgICAgICAgICAgICAgICh2ZG9tIGRhdGEpXG4gICAgICAgICAgICBpblxuICAgICAgICAgICAgZGF0YS5kb20gPC0gU29tZSBkb207XG4gICAgICAgICAgICBwdXRfYmVsb3dfcm9vdCBkYXRhIGRvbTtcblxuICAgICAgICB8IFNvbWUgZG9tIC0+XG4gICAgICAgICAgICBpZiBkYXRhLmRpcnR5IHRoZW4gYmVnaW5cbiAgICAgICAgICAgICAgICBsZXQgZG9tLCBjcmVhdGVkID1cbiAgICAgICAgICAgICAgICAgICAgVmRvbS51cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIChkb21fb3BlcmF0aW9ucyAoZGlzcGF0Y2ggZGF0YSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAodmRvbSBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tXG4gICAgICAgICAgICAgICAgaW5cbiAgICAgICAgICAgICAgICBpZiBjcmVhdGVkIHRoZW5cbiAgICAgICAgICAgICAgICAgICAgcHV0X2JlbG93X3Jvb3QgZGF0YSBkb207XG4gICAgICAgICAgICAgICAgZGF0YS5kb20gPC0gU29tZSBkb207XG4gICAgICAgICAgICBlbmRcbiAgICBhbmQgY2xlYW51cCAoKSA9XG4gICAgICAgIGRhdGEuZGlydHkgPC0gZmFsc2VcbiAgICBpblxuICAgIEFzc2VydF9mYWlsdXJlLmF0dGVtcHRcbiAgICAgICAgXCJFeGNlcHRpb24gaW4gJ3VwZGF0ZV9kb20nIG9mIEZtbGliX2Jyb3dzZXJcIlxuICAgICAgICB1cGRhdGVcbiAgICAgICAgY2xlYW51cDtcbiAgICBjbGVhbnVwICgpO1xuICAgIGFzc2VydCAobm90IGRhdGEuZGlydHkpXG5cblxubGV0IG9uX25leHRfYW5pbWF0aW9uIChmOiBmbG9hdCAtPiB1bml0KTogdW5pdCA9XG4gICAgKCogQ2FsbCAnZicgb24gbmV4dCBhbmltYXRpb24gZnJhbWUuICopXG4gICAgV2luZG93Lihvbl9uZXh0X2FuaW1hdGlvbiBmIChnZXQgKCkpKVxuXG5cblxubGV0IHJlYyBhbmltYXRlIChkYXRhOiAoJ3N0YXRlLCAnbXNnKSBkYXRhKTogZmxvYXQgLT4gdW5pdCA9XG4gICAgZnVuIF8gLT5cbiAgICB1cGRhdGVfZG9tIGRhdGE7XG4gICAgYXNzZXJ0IChub3QgZGF0YS5kaXJ0eSk7XG4gICAgb25fbmV4dF9hbmltYXRpb24gKGFuaW1hdGUgZGF0YSlcblxuXG5cblxuXG4oKiBIZWxwZXIgZnVuY3Rpb24gdG8gd3JhcCB1c2VyIHN1cHBsaWVkIGZ1bmN0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubGV0IHdyYXBfc3RhdGVfZnVuIChzdHI6IHN0cmluZykgKGY6ICdzIC0+ICdhKSAoc3RhdGU6ICdzKTogJ2EgPVxuICAgIEFzc2VydF9mYWlsdXJlLmF0dGVtcHRcbiAgICAgICAgKFwiRXhjZXB0aW9uIGluICdcIiBeIHN0ciBeIFwiJ1wiKVxuICAgICAgICAoZnVuICgpIC0+IGYgc3RhdGUpXG4gICAgICAgIChmdW4gKCkgLT4gKCkpXG5cblxubGV0IHdyYXBfdmlldyAodmlldzogJ3MgLT4gJ2EpIChzdGF0ZTogJ3MpOiAnYSA9XG4gICAgd3JhcF9zdGF0ZV9mdW4gXCJ2aWV3XCIgdmlldyBzdGF0ZVxuXG5cbmxldCB3cmFwX3N1YnNjcmlwdGlvbiAodmlldzogJ3MgLT4gJ2EpIChzdGF0ZTogJ3MpOiAnYSA9XG4gICAgd3JhcF9zdGF0ZV9mdW4gXCJzdWJzY3JpcHRpb2luXCIgdmlldyBzdGF0ZVxuXG5cbmxldCB3cmFwX3VwZGF0ZSAodXBkYXRlOiAncyAtPiAnbSAtPiAnYSkgKHN0YXRlOiAncykgKG1lc3NhZ2U6ICdtKTogJ2EgPVxuICAgIEFzc2VydF9mYWlsdXJlLmF0dGVtcHRcbiAgICAgICAgXCJFeGNlcHRpb24gaW4gJ3VwZGF0ZSdcIlxuICAgICAgICAoZnVuICgpIC0+IHVwZGF0ZSBzdGF0ZSBtZXNzYWdlKVxuICAgICAgICAoZnVuICgpIC0+ICgpKVxuXG5cblxuXG5cblxuXG4oKiBIZWxwZXIgZnVuY3Rpb24gdG8gcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIGphdmFzY3JpcHRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cbmxldCByZWNlaXZlX21lc3NhZ2VcbiAgICAgICAgKGRhdGE6ICgncywgJ20pIGRhdGEgb3B0aW9uIHJlZilcbiAgICA6IEJhc2UuVmFsdWUudFxuICAgID1cbiAgICAoKiBIYW5kbGVyIGZvciBpbmNvbWluZyBtZXNzYWdlcyBmcm9tIGphdmFzY3JpcHQuICopXG4gICAgbGV0IG9wZW4gQmFzZVxuICAgIGluXG4gICAgbGV0IHBvc3QgKHY6IFZhbHVlLnQpOiBWYWx1ZS50ID1cbiAgICAgICAgbWF0Y2ggIWRhdGEgd2l0aFxuICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcInJlY2VpdmVfbWVzc2FnZTogYXBwbGljYXRpb24gbm90IHlldCBpbml0aWFsaXplZFwiO1xuICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICB8IFNvbWUgZGF0YSAtPlxuICAgICAgICAgICAgbWF0Y2ggZGF0YS5zdWJzIHdpdGhcbiAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICBcInJlY2VpdmVfbWVzc2FnZTogc3Vic2NyaXB0aW9ucyBub3QgeWV0IGluaXRpYWxpemVkXCI7XG4gICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICAgICAgfCBTb21lIHN1YnMgLT5cbiAgICAgICAgICAgICAgICBtYXRjaCBzdWJzLnN1YnMubWVzc2FnZSB3aXRoXG4gICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWNlaXZlX21lc3NhZ2U6IGV2ZW50IG5vdCBzdWJzY3JpYmVkXCI7XG4gICAgICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgICAgICAgICB8IFNvbWUgZGVjb2RlIC0+XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoIGRlY29kZSB2IHdpdGhcbiAgICAgICAgICAgICAgICAgICAgfCBOb25lIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlY2VpdmVfbWVzc2FnZTogY2Fubm90IGRlY29kZSBtZXNzYWdlIGZyb20gXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgTWFpbi5sb2dfdmFsdWUgdjtcbiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgICAgICAgICAgICAgfCBTb21lIG0gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoIGRhdGEgbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICBpblxuICAgIFZhbHVlLmZ1bmN0aW9uMSBwb3N0XG5cblxuXG5cblxuXG4oKiBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgYW4gYXBwbGljYXRpb24gKGVsZW1lbnQgb3Igc2luZ2xlIHBhZ2UgYXBwKVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqKVxuXG5cblxubGV0IHN0YXJ0X2FwcGxpY2F0aW9uXG4gICAgICAgIChkYXRhOiAoJ3MsICdtKSBkYXRhKVxuICAgICAgICAoY29tbWFuZDogJ20gQ29tbWFuZC50KVxuICAgICAgICAocG9zdDogQmFzZS5WYWx1ZS50IC0+IHVuaXQpOiB1bml0ID1cbiAgICB1cGRhdGVfc3Vic2NyaXB0aW9ucyBkYXRhO1xuICAgIHVwZGF0ZV9kb20gZGF0YTtcbiAgICBDb21tYW5kLmV4ZWN1dGUgcG9zdCAoZGlzcGF0Y2hfbmV4dCBkYXRhKSBjb21tYW5kO1xuICAgIG9uX25leHRfYW5pbWF0aW9uIChhbmltYXRlIGRhdGEpXG5cblxuXG5cblxuXG5cblxuKCogU2FuZGJveCBhcHBsaWNhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxubGV0IG1ha2Vfc2FuZGJveFxuICAgICAgICAoc3RhdGU6ICdzKVxuICAgICAgICAodmlldzogICAoJ3MsICdtKSB2aWV3MSlcbiAgICAgICAgKHN1YjogICAgJ3N0YXRlIC0+ICdtc2cgU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICgncywgJ20pIHVwZGF0ZTEpXG4gICAgICAgIChfOiAnYSlcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgKCogVGhpcyBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgd2l0aGluIHRoZSBvbmxvYWQgZXZlbnQgb2YgdGhlIGJyb3dzZXJcbiAgICAgICB3aW5kb3cuXG4gICAgICopXG5cbiAgICAoKiBNYWtlIHRoZSBkYXRhIGZvciB0aGUgYXBwbGljYXRpb24uICopXG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHN0YXRlO1xuICAgICAgICBkaXJ0eSAgICAgID0gZmFsc2U7XG4gICAgICAgIHJvb3QgICAgICAgPSBEb2N1bWVudC5ib2R5IChkb2N1bWVudCAoKSk7XG4gICAgICAgIGRvbSAgICAgICAgPSBOb25lO1xuICAgICAgICBzdWJzICAgICAgID0gTm9uZTtcbiAgICAgICAgb3BlcmF0aW9ucyA9XG4gICAgICAgICAgICBTYW5kYm94ICh3cmFwX3ZpZXcgdmlldywgd3JhcF9zdWJzY3JpcHRpb24gc3ViLCB3cmFwX3VwZGF0ZSB1cGRhdGUpXG4gICAgfVxuICAgIGluXG4gICAgdXBkYXRlX3N1YnNjcmlwdGlvbnMgZGF0YTsgKCogSW5pdGlhbCBzdWJzY3JpcHRpb25zICopXG4gICAgdXBkYXRlX2RvbSBkYXRhOyAgICAgICAgICAgKCogSW5pdGlhbCBkb20uICopXG5cbiAgICAoKiBQcm9jZXNzaW5nIGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKilcbiAgICBvbl9uZXh0X2FuaW1hdGlvbiAoYW5pbWF0ZSBkYXRhKVxuXG5cblxubGV0IHNhbmRib3hcbiAgICAgICAgKHN0YXRlOiAnc3RhdGUpXG4gICAgICAgICh2aWV3OiAoJ3N0YXRlLCAnbXNnKSB2aWV3MSlcbiAgICAgICAgKHVwZGF0ZTogKCdzdGF0ZSwgJ21zZykgdXBkYXRlMSlcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICBcImxvYWRcIlxuICAgICAgICAobWFrZV9zYW5kYm94IHN0YXRlIHZpZXcgKGZ1biBfIC0+IFN1YnNjcmlwdGlvbi5ub25lKSB1cGRhdGUpXG4gICAgICAgIFdpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKVxuXG5cblxubGV0IHNhbmRib3hfcGx1c1xuICAgICAgICAoc3RhdGU6ICAnc3RhdGUpXG4gICAgICAgICh2aWV3OiAgICgnc3RhdGUsICdtc2cpIHZpZXcxKVxuICAgICAgICAoc3ViOiAgICAnc3RhdGUgLT4gJ21zZyBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogKCdzdGF0ZSwgJ21zZykgdXBkYXRlMSlcbiAgICA6IHVuaXRcbiAgICA9XG4gICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICBcImxvYWRcIlxuICAgICAgICAobWFrZV9zYW5kYm94IHN0YXRlIHZpZXcgc3ViIHVwZGF0ZSlcbiAgICAgICAgV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpXG5cblxuXG5cblxuXG5cblxuXG5cbigqIEVsZW1lbnQgYXBwbGljYXRpb25cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICopXG5cblxuXG5sZXQgaW5pdF9lbGVtZW50XG4gICAgICAgIChkYXRhcmVmOiAoJ3MsICdtKSBkYXRhIG9wdGlvbiByZWYpXG4gICAgICAgIChkZWNvZGU6ICAoJ3MgKiAnbSBDb21tYW5kLnQpIEJhc2UuRGVjb2RlLnQpXG4gICAgICAgICh2aWV3OiAgICAoJ3MsICdtKSB2aWV3MSlcbiAgICAgICAgKHN1YjogICAgICdzIC0+ICdtIFN1YnNjcmlwdGlvbi50KVxuICAgICAgICAodXBkYXRlOiAgKCdzLCAnbSkgdXBkYXRlMilcbiAgICA6IEJhc2UuVmFsdWUudFxuICAgID1cbiAgICBsZXQgb3BlbiBCYXNlIGluXG4gICAgbGV0IGRlY29kZSA9XG4gICAgICAgIGxldCBvcGVuIERlY29kZSBpblxuICAgICAgICBsZXQqIHBvc3QgICAgICAgPSBmaWVsZCBcIm9uTWVzc2FnZVwiIF9mdW5jdGlvbiBpblxuICAgICAgICBsZXQqIHN0YXRlLCBjbWQgPSBmaWVsZCBcImRhdGFcIiBkZWNvZGUgaW5cbiAgICAgICAgbGV0KiBlbGVtZW50X2lkID0gZmllbGQgXCJlbGVtZW50X2lkXCIgc3RyaW5nIGluXG4gICAgICAgIHJldHVybiAoZWxlbWVudF9pZCwgc3RhdGUsIGNtZCwgZnVuIHYgLT4gaWdub3JlIChwb3N0IFt8dnxdKSlcbiAgICBpblxuICAgIGxldCBpbml0ICh2OiBWYWx1ZS50KTogVmFsdWUudCA9XG4gICAgICAgIG1hdGNoICFkYXRhcmVmIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGJlZ2luXG4gICAgICAgICAgICBtYXRjaCBkZWNvZGUgdiB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJjYW5ub3QgZGVjb2RlIGluaXRpYWxpc2F0aW9uIGRhdGFcIjtcbiAgICAgICAgICAgICAgICBNYWluLmxvZ192YWx1ZSB2O1xuICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgICAgIHwgU29tZSAoZWxlbWVudF9pZCwgc3RhdGUsIGNvbW1hbmQsIHBvc3QpIC0+XG4gICAgICAgICAgICAgICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICAgICAgICAgICAgICBcImxvYWRcIlxuICAgICAgICAgICAgICAgICAgICAoZnVuIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBEb20uRG9jdW1lbnQuZmluZCBlbGVtZW50X2lkIChkb2N1bWVudCAoKSkgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm9uZSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcIkNhbm5vdCBmaW5kIGVsZW1lbnQgXCIgXiBlbGVtZW50X2lkKVxuICAgICAgICAgICAgICAgICAgICAgICAgIHwgU29tZSByb290IC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbSAgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnQgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3ZpZXcgdmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9zdWJzY3JpcHRpb24gc3ViLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3VwZGF0ZSB1cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFyZWYgOj0gU29tZSBkYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hcHBsaWNhdGlvbiBkYXRhIGNvbW1hbmQgcG9zdFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIFdpbmRvdy4oZXZlbnRfdGFyZ2V0IChnZXQgKCkpKTtcbiAgICAgICAgICAgICAgICBWYWx1ZS5udWxsXG4gICAgICAgIGVuZFxuICAgICAgICB8IFNvbWUgXyAtPlxuICAgICAgICAgICAgTWFpbi5sb2dfc3RyaW5nIFwiYXBwbGljYXRpb24gYWxyZWFkeSBpbml0aWFsaXplZFwiO1xuICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgIGluXG4gICAgVmFsdWUuZnVuY3Rpb24xIGluaXRcblxuXG5cblxubGV0IGVsZW1lbnRcbiAgICAgICAgKG5hbWU6IHN0cmluZylcbiAgICAgICAgKGRlY29kZTogKCdzICogJ20gQ29tbWFuZC50KSBCYXNlLkRlY29kZS50KVxuICAgICAgICAodmlldzogICAoJ3MsICdtKSB2aWV3MSlcbiAgICAgICAgKHN1YnM6ICAgJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICgncywgJ20pIHVwZGF0ZTIpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIGxldCBfID0gZGVjb2RlLCB2aWV3LCBzdWJzLCB1cGRhdGUgaW5cbiAgICBsZXQgYXBwID0gcmVmIE5vbmUgaW5cbiAgICBCYXNlLk1haW4ubWFrZV9nbG9iYWxcbiAgICAgICAgbmFtZVxuICAgICAgICBCYXNlLlZhbHVlLihcbiAgICAgICAgICAgIF9vYmplY3RcbiAgICAgICAgICAgICAgICBbfCBcImluaXRcIiwgaW5pdF9lbGVtZW50IGFwcCBkZWNvZGUgdmlldyBzdWJzIHVwZGF0ZVxuICAgICAgICAgICAgICAgICA7IFwicG9zdFwiLCByZWNlaXZlX21lc3NhZ2UgYXBwXG4gICAgICAgICAgICAgICAgfF1cbiAgICAgICAgKVxuXG5cblxuXG5cblxuXG4oKiBTaW5nbGUgUGFnZSBBcHBsaWNhdGlvblxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKilcblxuXG5cblxuXG5sZXQgaW5pdF9hcHBsaWNhdGlvblxuICAgICAgICAoZGF0YXJlZjogKCdzLCAnbSkgZGF0YSBvcHRpb24gcmVmKVxuICAgICAgICAoZGVjb2RlOiAgKCdzICogJ20gQ29tbWFuZC50KSBCYXNlLkRlY29kZS50KVxuICAgICAgICAodmlldzogICAgKCdzLCAnbSkgdmlldzIpXG4gICAgICAgIChzdWI6ICAgICAncyAtPiAnbSBTdWJzY3JpcHRpb24udClcbiAgICAgICAgKHVwZGF0ZTogICgncywgJ20pIHVwZGF0ZTIpXG4gICAgOiBCYXNlLlZhbHVlLnRcbiAgICA9XG4gICAgbGV0IG9wZW4gQmFzZSBpblxuICAgIGxldCBkZWNvZGUgPVxuICAgICAgICBsZXQgb3BlbiBEZWNvZGUgaW5cbiAgICAgICAgbGV0KiBwb3N0ICAgICAgID0gZmllbGQgXCJvbk1lc3NhZ2VcIiBfZnVuY3Rpb24gaW5cbiAgICAgICAgbGV0KiBzdGF0ZSwgY21kID0gZmllbGQgXCJkYXRhXCIgZGVjb2RlIGluXG4gICAgICAgIHJldHVybiAoc3RhdGUsIGNtZCwgZnVuIHYgLT4gaWdub3JlIChwb3N0IFt8dnxdKSlcbiAgICBpblxuICAgIGxldCBpbml0ICh2OiBWYWx1ZS50KTogVmFsdWUudCA9XG4gICAgICAgIG1hdGNoICFkYXRhcmVmIHdpdGhcbiAgICAgICAgfCBOb25lIC0+IGJlZ2luXG4gICAgICAgICAgICBtYXRjaCBkZWNvZGUgdiB3aXRoXG4gICAgICAgICAgICB8IE5vbmUgLT5cbiAgICAgICAgICAgICAgICBNYWluLmxvZ19zdHJpbmcgXCJjYW5ub3QgZGVjb2RlIGluaXRpYWxpc2F0aW9uIGRhdGFcIjtcbiAgICAgICAgICAgICAgICBNYWluLmxvZ192YWx1ZSB2O1xuICAgICAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICAgICAgICAgIHwgU29tZSAoc3RhdGUsIGNvbW1hbmQsIHBvc3QpIC0+XG4gICAgICAgICAgICAgICAgRXZlbnRfdGFyZ2V0LmFkZFxuICAgICAgICAgICAgICAgICAgICBcImxvYWRcIlxuICAgICAgICAgICAgICAgICAgICAoZnVuIF8gLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgID0gRG9jdW1lbnQuYm9keSAoZG9jdW1lbnQgKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb20gICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnMgID0gTm9uZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfdmlldyB2aWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfc3Vic2NyaXB0aW9uIHN1YixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3VwZGF0ZSB1cGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgIGluXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXJlZiA6PSBTb21lIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfYXBwbGljYXRpb24gZGF0YSBjb21tYW5kIHBvc3RcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBXaW5kb3cuKGV2ZW50X3RhcmdldCAoZ2V0ICgpKSk7XG4gICAgICAgICAgICAgICAgVmFsdWUubnVsbFxuICAgICAgICBlbmRcbiAgICAgICAgfCBTb21lIF8gLT5cbiAgICAgICAgICAgIE1haW4ubG9nX3N0cmluZyBcImFwcGxpY2F0aW9uIGFscmVhZHkgaW5pdGlhbGl6ZWRcIjtcbiAgICAgICAgICAgIFZhbHVlLm51bGxcbiAgICBpblxuICAgIFZhbHVlLmZ1bmN0aW9uMSBpbml0XG5cblxuXG5cblxuXG5sZXQgYXBwbGljYXRpb25cbiAgICAgICAgKG5hbWU6IHN0cmluZylcbiAgICAgICAgKGRlY29kZTogKCdzICogJ20gQ29tbWFuZC50KSBCYXNlLkRlY29kZS50KVxuICAgICAgICAodmlldzogICAoJ3MsICdtKSB2aWV3MilcbiAgICAgICAgKHN1YnM6ICAgJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICgncywgJ20pIHVwZGF0ZTIpXG4gICAgOiB1bml0XG4gICAgPVxuICAgIGxldCBhcHAgPSByZWYgTm9uZSBpblxuICAgIEJhc2UuTWFpbi5tYWtlX2dsb2JhbFxuICAgICAgICBuYW1lXG4gICAgICAgIEJhc2UuVmFsdWUuKFxuICAgICAgICAgICAgX29iamVjdFxuICAgICAgICAgICAgICAgIFt8IFwiaW5pdFwiLCBpbml0X2FwcGxpY2F0aW9uIGFwcCBkZWNvZGUgdmlldyBzdWJzIHVwZGF0ZVxuICAgICAgICAgICAgICAgICA7IFwicG9zdFwiLCByZWNlaXZlX21lc3NhZ2UgYXBwXG4gICAgICAgICAgICAgICAgfF1cbiAgICAgICAgKVxuXG5cblxuXG5cblxubGV0IGJhc2ljX2FwcGxpY2F0aW9uXG4gICAgICAgIChzdGF0ZTogICAncylcbiAgICAgICAgKGNvbW1hbmQ6ICdtIENvbW1hbmQudClcbiAgICAgICAgKHZpZXc6ICAgICgncywgJ20pIHZpZXcyKVxuICAgICAgICAoc3ViOiAgICAgJ3MgLT4gJ20gU3Vic2NyaXB0aW9uLnQpXG4gICAgICAgICh1cGRhdGU6ICAoJ3MsICdtKSB1cGRhdGUyKVxuICAgIDogdW5pdFxuICAgID1cbiAgICBsZXQgcG9zdCBfID0gKClcbiAgICBpblxuICAgIEV2ZW50X3RhcmdldC5hZGRcbiAgICAgICAgXCJsb2FkXCJcbiAgICAgICAgKGZ1biBfIC0+XG4gICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgIHN0YXRlO1xuICAgICAgICAgICAgICAgICBkaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICByb290ICA9IERvY3VtZW50LmJvZHkgKGRvY3VtZW50ICgpKTtcbiAgICAgICAgICAgICAgICAgZG9tICAgPSBOb25lO1xuICAgICAgICAgICAgICAgICBzdWJzICA9IE5vbmU7XG4gICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgQXBwIChcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3ZpZXcgdmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX3N1YnNjcmlwdGlvbiBzdWIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF91cGRhdGUgdXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QpO1xuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICBpblxuICAgICAgICAgICAgIHN0YXJ0X2FwcGxpY2F0aW9uIGRhdGEgY29tbWFuZCBwb3N0XG4gICAgICAgIClcbiAgICAgICAgV2luZG93LihldmVudF90YXJnZXQgKGdldCAoKSkpO1xuIiwibW9kdWxlIFJhbmRvbSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFJhbmRvbVxuZW5kXG5cblxuXG5cblxuXG5tb2R1bGUgVGltZSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFRpbWVcbmVuZFxuXG5cblxuXG5cblxuXG5tb2R1bGUgVGFzayA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIFRhc2tcbmVuZFxuXG5cblxuXG5cbm1vZHVsZSBWYWx1ZSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIEZtbGliX2pzLkJhc2UuVmFsdWVcblxuICAgIGxldCByZWNvcmQgPSBfb2JqZWN0XG5lbmRcblxuXG5cblxubW9kdWxlIEV2ZW50X2ZsYWcgPVxuc3RydWN0XG4gICAgaW5jbHVkZSBFdmVudF9mbGFnXG5lbmRcblxuXG5cblxuXG5cbm1vZHVsZSBEZWNvZGVyID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgRm1saWJfanMuQmFzZS5EZWNvZGVcblxuXG4gICAgbGV0IHJ1biAoZGVjb2RlOiAnYSB0KSAodjogVmFsdWUudCk6ICdhIG9wdGlvbiA9XG4gICAgICAgIGRlY29kZSB2XG5lbmRcblxuXG5cblxuXG5cbm1vZHVsZSBDb21tYW5kID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgQ29tbWFuZFxuZW5kXG5cblxuXG5cblxuXG5tb2R1bGUgU3Vic2NyaXB0aW9uID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgU3Vic2NyaXB0aW9uXG5lbmRcblxuXG5cbmxldCBkZWJ1ZyAoc3RyOiBzdHJpbmcpOiB1bml0ID1cbiAgICBsZXQgb3BlbiBGbWxpYl9qcy5CYXNlLk1haW4gaW5cbiAgICBsb2dfc3RyaW5nIHN0clxuXG5cblxubGV0IGRlYnVnX3ZhbHVlICh2OiBWYWx1ZS50KTogdW5pdCA9XG4gICAgbGV0IG9wZW4gRm1saWJfanMuQmFzZS5NYWluIGluXG4gICAgbG9nX3ZhbHVlIHZcblxuXG5cblxubW9kdWxlIEF0dHJpYnV0ZSA9XG5zdHJ1Y3RcbiAgICBpbmNsdWRlIEF0dHJpYnV0ZVxuXG4gICAgbGV0IG9uIChrZXk6IHN0cmluZykgKGRlY29kZTogJ21zZyBEZWNvZGVyLnQpOiAnbXNnIHQgPVxuICAgICAgICBoYW5kbGVyXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICAgIEV2ZW50X2ZsYWcubm9fc3RvcFxuICAgICAgICAgICAgRXZlbnRfZmxhZy5ub19wcmV2ZW50XG4gICAgICAgICAgICBkZWNvZGVcblxuICAgIGxldCBvbl9jbGljayAobXNnOiAnbXNnKTogJ21zZyB0ID1cbiAgICAgICAgb24gXCJjbGlja1wiIChEZWNvZGVyLnJldHVybiBtc2cpXG5cblxuICAgICgqIFN0eWxlcyAqKVxuXG4gICAgbGV0IGZvbnRfc2l6ZSAoc2l6ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiZm9udC1zaXplXCIgc2l6ZVxuXG4gICAgbGV0IGNvbG9yIChjb2xvcjogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiY29sb3JcIiBjb2xvclxuXG4gICAgbGV0IGJhY2tncm91bmRfY29sb3IgKGNvbG9yOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJiYWNrZ3JvdW5kLWNvbG9yXCIgY29sb3JcblxuICAgIGxldCBoZWlnaHQgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJoZWlnaHRcIiB2YWx1ZVxuXG4gICAgbGV0IHdpZHRoICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwid2lkdGhcIiB2YWx1ZVxuXG4gICAgbGV0IG1hcmdpbiAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcIm1hcmdpblwiIHZhbHVlXG5cbiAgICBsZXQgcGFkZGluZyAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcInBhZGRpbmdcIiB2YWx1ZVxuXG4gICAgbGV0IGJvcmRlcl9zdHlsZSAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBzdHlsZSBcImJvcmRlci1zdHlsZVwiIHZhbHVlXG5cbiAgICBsZXQgYm9yZGVyX3dpZHRoICh2YWx1ZTogc3RyaW5nKTogJ20gdCA9XG4gICAgICAgIHN0eWxlIFwiYm9yZGVyLXdpZHRoXCIgdmFsdWVcblxuICAgIGxldCBib3JkZXJfY29sb3IgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgc3R5bGUgXCJib3JkZXItY29sb3JcIiB2YWx1ZVxuXG5cbiAgICAoKiBBdHRyaWJ1dGVzICopXG5cbiAgICBsZXQgaWQgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwiaWRcIiB2YWx1ZVxuXG4gICAgbGV0IGNsYXNzXyAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJjbGFzc1wiIHZhbHVlXG5cbiAgICBsZXQgaHJlZiAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJocmVmXCIgdmFsdWVcblxuICAgIGxldCBzcmMgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwic3JjXCIgdmFsdWVcblxuICAgIGxldCB0aXRsZSAodmFsdWU6IHN0cmluZyk6ICdtIHQgPVxuICAgICAgICBhdHRyaWJ1dGUgXCJ0aXRsZVwiIHZhbHVlXG5cbiAgICBsZXQgdmFsdWUgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgcHJvcGVydHkgXCJ2YWx1ZVwiIFZhbHVlLihzdHJpbmcgdmFsdWUpXG5cbiAgICBsZXQgcGxhY2Vob2xkZXIgKHZhbHVlOiBzdHJpbmcpOiAnbSB0ID1cbiAgICAgICAgYXR0cmlidXRlIFwicGxhY2Vob2xkZXJcIiB2YWx1ZVxuXG5cbiAgICBsZXQgb25faW5wdXQgKGY6IHN0cmluZyAtPiAnbXNnKTogJ21zZyB0ID1cbiAgICAgICAgbGV0IGRlY29kZSA9XG4gICAgICAgICAgICBsZXQgb3BlbiBEZWNvZGVyIGluXG4gICAgICAgICAgICBmaWVsZCBcInRhcmdldFwiIChmaWVsZCBcInZhbHVlXCIgKG1hcCBmIHN0cmluZykpXG4gICAgICAgIGluXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICAgICAgIFwiaW5wdXRcIlxuICAgICAgICAgICAgRXZlbnRfZmxhZy5zdG9wXG4gICAgICAgICAgICBFdmVudF9mbGFnLm5vX3ByZXZlbnRcbiAgICAgICAgICAgIGRlY29kZVxuZW5kXG5cblxuXG5cblxuXG5cbm1vZHVsZSBIdG1sID1cbnN0cnVjdFxuICAgIGluY2x1ZGUgVmRvbVxuXG5cbiAgICBsZXQgaDEgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDFcIiBhdHRycyBub2Rlc1xuICAgIGxldCBoMiBhdHRycyBub2RlcyA9IG5vZGUgXCJoMlwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGgzIGF0dHJzIG5vZGVzID0gbm9kZSBcImgzXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgaDQgYXR0cnMgbm9kZXMgPSBub2RlIFwiaDRcIiBhdHRycyBub2Rlc1xuICAgIGxldCBoNSBhdHRycyBub2RlcyA9IG5vZGUgXCJoNVwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGg2IGF0dHJzIG5vZGVzID0gbm9kZSBcImg2XCIgYXR0cnMgbm9kZXNcblxuICAgIGxldCBkaXYgYXR0cnMgbm9kZXMgID0gbm9kZSBcImRpdlwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHNwYW4gYXR0cnMgbm9kZXMgPSBub2RlIFwic3BhblwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHByZSBhdHRycyBub2RlcyAgPSBub2RlIFwicHJlXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgcCBhdHRycyBub2RlcyAgICA9IG5vZGUgXCJwXCIgYXR0cnMgbm9kZXNcblxuICAgIGxldCBidXR0b24gYXR0cnMgbm9kZXMgICA9IG5vZGUgXCJidXR0b25cIiBhdHRycyBub2Rlc1xuICAgIGxldCBpbnB1dCBhdHRycyBub2RlcyAgICA9IG5vZGUgXCJpbnB1dFwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGxhYmVsIGF0dHJzIG5vZGVzICAgID0gbm9kZSBcImxhYmVsXCIgYXR0cnMgbm9kZXNcbiAgICBsZXQgdGV4dGFyZWEgYXR0cnMgbm9kZXMgPSBub2RlIFwidGV4dGFyZWFcIiBhdHRycyBub2Rlc1xuICAgIGxldCBzZWxlY3QgYXR0cnMgbm9kZXMgICA9IG5vZGUgXCJzZWxlY3RcIiBhdHRycyBub2Rlc1xuXG4gICAgbGV0IG9sIGF0dHJzIG5vZGVzICA9IG5vZGUgXCJvbFwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IHVsIGF0dHJzIG5vZGVzICA9IG5vZGUgXCJ1bFwiIGF0dHJzIG5vZGVzXG4gICAgbGV0IGxpIGF0dHJzIG5vZGVzICA9IG5vZGUgXCJsaVwiIGF0dHJzIG5vZGVzXG5cbiAgICBsZXQgc3ZnX25vZGUgdGFnIGF0dHJzIG5vZGVzID1cbiAgICAgICAgbm9kZV9ucyBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdGFnIGF0dHJzIG5vZGVzXG5lbmRcblxuXG5pbmNsdWRlIEJyb3dzZXJcbiIsIm9wZW4gRm1saWJfYnJvd3NlclxuXG50eXBlIHN0YXRlID0ge1xuICAgIG9rOiBib29sO1xuICAgIGNlbGNpdXM6IHN0cmluZztcbiAgICBmYWhyZW5oZWl0OiBzdHJpbmc7XG59XG5cbnR5cGUgbXNnID1cbiAgICB8IENlbGNpdXMgb2Ygc3RyaW5nXG4gICAgfCBGYWhyZW5oZWl0IG9mIHN0cmluZ1xuXG5cblxubGV0IHByaW50X2Zsb2F0ICh2OiBmbG9hdCk6IHN0cmluZyA9XG4gICAgUHJpbnRmLnNwcmludGYgXCIlLjFmXCIgdlxuXG5cbmxldCBmYWhyZW5oZWl0X3RvX2NlbGNpdXMgKGZhaHJlbmhlaXQ6IGZsb2F0KTogc3RyaW5nID1cbiAgICAoZmFocmVuaGVpdCAtLiAzMi4wKSAqLiAoNS4wIC8uIDkuMCkgfD4gcHJpbnRfZmxvYXRcblxuXG5sZXQgY2VsY2l1c190b19mYWhyZW5oZWl0IChjZWxjaXVzOiBmbG9hdCk6IHN0cmluZyA9XG4gICAgMzIuMCArLiBjZWxjaXVzICouICg5LjAgLy4gNS4wKSB8PiBwcmludF9mbG9hdFxuXG5cbmxldCBzZXRfdGVtcGVyYXR1cmUgKHN0YXRlOiBzdGF0ZSkgKGlzX2NlbGNpdXM6IGJvb2wpICh2YWx1ZTogc3RyaW5nKTogc3RhdGUgPVxuICAgIHRyeVxuICAgICAgICBsZXQgdiA9IGZsb2F0X29mX3N0cmluZyB2YWx1ZSBpblxuICAgICAgICBpZiBpc19jZWxjaXVzIHRoZW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2VsY2l1cyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGZhaHJlbmhlaXQgPSBjZWxjaXVzX3RvX2ZhaHJlbmhlaXQgdjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjZWxjaXVzID0gZmFocmVuaGVpdF90b19jZWxjaXVzIHY7XG4gICAgICAgICAgICAgICAgZmFocmVuaGVpdCA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgIHdpdGggXyAtPlxuICAgICAgICBpZiBpc19jZWxjaXVzIHRoZW5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSB3aXRoXG4gICAgICAgICAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjZWxjaXVzID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSB3aXRoXG4gICAgICAgICAgICAgICAgb2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmYWhyZW5oZWl0ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG5cblxubGV0IGluaXQ6IHN0YXRlID1cbiAgICB7XG4gICAgICAgIG9rID0gdHJ1ZTtcbiAgICAgICAgY2VsY2l1cyA9IFwiMjBcIjtcbiAgICAgICAgZmFocmVuaGVpdCA9IGNlbGNpdXNfdG9fZmFocmVuaGVpdCAyMC4wO1xuICAgIH1cblxuXG5cbmxldCB1cGRhdGUgKHN0YXRlOiBzdGF0ZSk6IG1zZyAtPiBzdGF0ZSA9XG4gICAgZnVuY3Rpb25cbiAgICB8IENlbGNpdXMgY2VsY2l1cyAtPlxuICAgICAgICBzZXRfdGVtcGVyYXR1cmUgc3RhdGUgdHJ1ZSBjZWxjaXVzXG4gICAgfCBGYWhyZW5oZWl0IGZhaHJlbmhlaXQgLT5cbiAgICAgICAgc2V0X3RlbXBlcmF0dXJlIHN0YXRlIGZhbHNlIGZhaHJlbmhlaXRcblxuXG5cbmxldCB2aWV3IChzdGF0ZTogc3RhdGUpOiAnbXNnIEh0bWwudCA9XG4gICAgbGV0IG9wZW4gSHRtbCBpblxuICAgIGxldCBvcGVuIEF0dHJpYnV0ZSBpblxuICAgIGxldCBtZXNzYWdlIGlzX2NlbGNpdXMgdiA9XG4gICAgICAgIGlmIGlzX2NlbGNpdXMgdGhlblxuICAgICAgICAgICAgQ2VsY2l1cyB2XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIEZhaHJlbmhlaXQgdlxuICAgIGFuZCB0ZW1wZXJhdHVyZV9maWVsZCB0eHQgdiBmID1cbiAgICAgICAgZGl2IFtdIFtcbiAgICAgICAgICAgIGxhYmVsIFtdIFtcbiAgICAgICAgICAgICAgICBpbnB1dCBbIGF0dHJpYnV0ZSBcInR5cGVcIiBcInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIDsgdmFsdWUgdlxuICAgICAgICAgICAgICAgICAgICAgIDsgb25faW5wdXQgZl1cbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgICAgICAgOyB0ZXh0IFwiIFwiXG4gICAgICAgICAgICAgIDsgdGV4dCB0eHRcbiAgICAgICAgICAgIF1cbiAgICAgICAgXVxuICAgIGFuZCBlcnJvciA9XG4gICAgICAgIGlmIHN0YXRlLm9rIHRoZW5cbiAgICAgICAgICAgIFtdXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIFtkaXYgW2NvbG9yIFwicmVkXCJdIFt0ZXh0IFwidmFsdWUgbXVzdCBiZSBhIG51bWJlclwiXV1cbiAgICBpblxuICAgIGRpdiBbXSAoXG4gICAgICAgIGgxIFtdIFt0ZXh0IFwiVGVtcGVyYXR1cmUgQ29udmVydGVyXCJdXG4gICAgICAgIDo6XG4gICAgICAgIHRlbXBlcmF0dXJlX2ZpZWxkIFwiQ2VsY2l1c1wiIHN0YXRlLmNlbGNpdXMgKG1lc3NhZ2UgdHJ1ZSlcbiAgICAgICAgOjpcbiAgICAgICAgdGVtcGVyYXR1cmVfZmllbGQgXCJGYWhyZW5oZWl0XCIgc3RhdGUuZmFocmVuaGVpdCAobWVzc2FnZSBmYWxzZSlcbiAgICAgICAgOjpcbiAgICAgICAgZXJyb3JcbiAgICAgIClcblxuXG5sZXQgXyA9IHNhbmRib3ggaW5pdCB2aWV3IHVwZGF0ZVxuIiwiKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgWGF2aWVyIExlcm95LCBwcm9qZXQgQ3Jpc3RhbCwgSU5SSUEgUm9jcXVlbmNvdXJ0ICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBDb3B5cmlnaHQgMTk5NiBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0ICAgICAqKVxuKCogICAgIGVuIEF1dG9tYXRpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCogICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiAgICAqKVxuKCogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xLCB3aXRoIHRoZSAgICAgICAgICAqKVxuKCogICBzcGVjaWFsIGV4Y2VwdGlvbiBvbiBsaW5raW5nIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBMSUNFTlNFLiAgICAgICAgICAqKVxuKCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKVxuKCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKVxuXG4oKiBFbnN1cmUgdGhhdCBbYXRfZXhpdF0gZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBwcm9ncmFtICopXG5cbmxldCBfID0gZG9fYXRfZXhpdCgpXG4iXX0= diff --git a/webapp/timer.html b/webapp/timer.html new file mode 100644 index 00000000..777a3da0 --- /dev/null +++ b/webapp/timer.html @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/webapp/timer.js b/webapp/timer.js new file mode 100644 index 00000000..4aca4dd0 --- /dev/null +++ b/webapp/timer.js @@ -0,0 +1,2417 @@ +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=exe, use-js-string=true, version=5.1.1 +(function(a){typeof +globalThis!=="object"&&(this?b():(a.defineProperty(a.prototype,"_T_",{configurable:true,get:b}),_T_));function +b(){var +b=this||self;b.globalThis=b;delete +a.prototype._T_}}(Object));(function(f){"use strict";var +eT="%.1f",e6="ENOTEMPTY",eg="Sys_blocked_io",bd="int_of_string",bz="src/browser/browser.ml",cD="click",cH="rmdir",bg=1000,eB=": closedir failed",eH=1026,aa=0x80,eS=12520,ct=" : flags Open_rdonly and Open_wronly are not compatible",e="",aZ="+",eN=0xdc00,cO="ENOENT",an=" ",bB=": No such file or directory",bC="_bigarr02",fb="src/js/dom.ml",eA="Pervasives.do_at_exit",et="%li",e5=65536,B=248,$=0x8000,eG=", ",aY=0x3f,aK="-",cG=": Not a directory",e4=1027,es="/static/",fa="closedir",cs="Fatal error: exception ",af="/",bD='"',e3="0.5",c="camlinternalFormat.ml",cy="mkdir",be=128,cM="index out of bounds",er="%ni",ez="Invalid_argument",eF=0xe0,ag=0xffffff,eq=0xf0,eM="Match_failure",e$="%i",ey="p",eR=255,ep="@[",cB="Failure",e2="_",cr=" : flags Open_text and Open_binary are not compatible",eo="([^/]+)",en=0xdfff,eE=256,ew="Division_by_zero",ex="fd ",cF="ENOTDIR",cL=101,em="^",ev=": file descriptor already closed",eQ="max",ab=0xffff,el=205,e1=", characters ",e0=" : is a directory",ej="%Li",ek="Not_found",eL=120,aB=254,cq="%d",cw="EBADF",cA=0xf,e_="EEXIST",cK=127,eZ=114,bE=252,ao=0xff,O="0",cx=" : file already exists",eP=0x7ff0,cv=1255,cC="compare: functional value",cE="e",cJ="value",cp=100,eD=-97,a="src/std/btree.ml",bf=1024,eu="Sys_error",eO=-48,co="target",ef=0x800,cz="src/browser/dictionary.ml",aJ=".",eY="Printexc.handle_uncaught_exception",eK="@{",e9=103,ee=250,bh="src/browser/handler.ml",ed="input",ei="Out_of_memory",eC=512,eX="End_of_file",eJ="s",T="src/std/array.ml",cI="nan",e8="%u",eh="infinity",eW="Stack_overflow",cu="fs",cN="jsError",eV="0x",e7="Assert_failure",eI="Undefined_recursive_module",bA="Unix.Unix_error",eU="Fatal error: exception %s\n";function +kR(a,b){var +g=a.length,h=b.length,f=g+h-1,d=new +Array(f);d[0]=0;var +c=1,e=1;for(;c=1;f--)c[d+f]=a[b+f];return 0}function +cP(a,b,c){var +d=new +Array(c+1);d[0]=0;for(var +e=1,f=b+1;e<=c;e++,f++)d[e]=a[f];return d}function +fd(a,b,c){if(a[1]===b){a[1]=c;return 1}return 0}function +kT(a,b){var +c=a[1];a[1]+=b;return c}function +bF(a){return a[1]}function +lI(a){var +b=f.process;if(b&&b.env&&b.env[a]!=undefined)return b.env[a];if(f.jsoo_static_env&&f.jsoo_static_env[a])return f.jsoo_static_env[a]}var +c8=0;(function(){var +c=lI("OCAMLRUNPARAM");if(c!==undefined){var +b=c.split(",");for(var +a=0;aa.hi)return 1;if(this.hia.mi)return 1;if(this.mia.lo)return 1;if(this.loc)return 1;if(ba.mi)return 1;if(this.mia.lo)return 1;if(this.lo>24),c=-this.hi+(b>>24);return new +d(a,b,c)};d.prototype.add=function(a){var +b=this.lo+a.lo,c=this.mi+a.mi+(b>>24),e=this.hi+a.hi+(c>>24);return new +d(b,c,e)};d.prototype.sub=function(a){var +b=this.lo-a.lo,c=this.mi-a.mi+(b>>24),e=this.hi-a.hi+(c>>24);return new +d(b,c,e)};d.prototype.mul=function(a){var +b=this.lo*a.lo,c=(b*fA|0)+this.mi*a.lo+this.lo*a.mi,e=(c*fA|0)+this.hi*a.lo+this.mi*a.mi+this.lo*a.hi;return new +d(b,c,e)};d.prototype.isZero=function(){return(this.lo|this.mi|this.hi)==0};d.prototype.isNeg=function(){return this.hi<<16<0};d.prototype.and=function(a){return new +d(this.lo&a.lo,this.mi&a.mi,this.hi&a.hi)};d.prototype.or=function(a){return new +d(this.lo|a.lo,this.mi|a.mi,this.hi|a.hi)};d.prototype.xor=function(a){return new +d(this.lo^a.lo,this.mi^a.mi,this.hi^a.hi)};d.prototype.shift_left=function(a){a=a&63;if(a==0)return this;if(a<24)return new +d(this.lo<>24-a,this.hi<>24-a);if(a<48)return new +d(0,this.lo<>48-a);return new +d(0,0,this.lo<>a|this.mi<<24-a,this.mi>>a|this.hi<<24-a,this.hi>>a);if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi>>a-24,0);return new +d(this.hi>>a-48,0,0)};d.prototype.shift_right=function(a){a=a&63;if(a==0)return this;var +c=this.hi<<16>>16;if(a<24)return new +d(this.lo>>a|this.mi<<24-a,this.mi>>a|c<<24-a,this.hi<<16>>a>>>16);var +b=this.hi<<16>>31;if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi<<16>>a-24>>16,b&ab);return new +d(this.hi<<16>>a-32,b,b)};d.prototype.lsl1=function(){this.hi=this.hi<<1|this.mi>>23;this.mi=(this.mi<<1|this.lo>>23)&ag;this.lo=this.lo<<1&ag};d.prototype.lsr1=function(){this.lo=(this.lo>>>1|this.mi<<23)&ag;this.mi=(this.mi>>>1|this.hi<<23)&ag;this.hi=this.hi>>>1};d.prototype.udivmod=function(a){var +e=0,c=this.copy(),b=a.copy(),f=new +d(0,0,0);while(c.ucompare(b)>0){e++;b.lsl1()}while(e>=0){e--;f.lsl1();if(c.ucompare(b)>=0){f.lo++;c=c.sub(b)}b.lsr1()}return{quotient:f,modulus:c}};d.prototype.div=function(a){var +b=this;if(a.isZero())fL();var +d=b.hi^a.hi;if(b.hi&$)b=b.neg();if(a.hi&$)a=a.neg();var +c=b.udivmod(a).quotient;if(d&$)c=c.neg();return c};d.prototype.mod=function(a){var +b=this;if(a.isZero())fL();var +d=b.hi;if(b.hi&$)b=b.neg();if(a.hi&$)a=a.neg();var +c=b.udivmod(a).modulus;if(d&$)c=c.neg();return c};d.prototype.toInt=function(){return this.lo|this.mi<<24};d.prototype.toFloat=function(){return(this.hi<<16)*Math.pow(2,32)+this.mi*Math.pow(2,24)+this.lo};d.prototype.toArray=function(){return[this.hi>>8,this.hi&ao,this.mi>>16,this.mi>>8&ao,this.mi&ao,this.lo>>16,this.lo>>8&ao,this.lo&ao]};d.prototype.lo32=function(){return this.lo|(this.mi&ao)<<24};d.prototype.hi32=function(){return this.mi>>>8&ab|this.hi<<16};function +lb(a,b){return new +d(a&ag,a>>>24&ao|(b&ab)<<8,b>>>16&ab)}function +c1(a){return a.hi32()}function +c2(a){return a.lo32()}function +bj(){w(cM)}var +kV=bC;function +aC(a,b,c,d){this.kind=a;this.layout=b;this.dims=c;this.data=d}aC.prototype.caml_custom=kV;aC.prototype.offset=function(a){var +c=0;if(typeof +a==="number")a=[a];if(!(a +instanceof +Array))w("bigarray.js: invalid offset");if(this.dims.length!=a.length)w("Bigarray.get/set: bad number of dimensions");if(this.layout==0)for(var +b=0;b=this.dims[b])bj();c=c*this.dims[b]+a[b]}else +for(var +b=this.dims.length-1;b>=0;b--){if(a[b]<1||a[b]>this.dims[b])bj();c=c*this.dims[b]+(a[b]-1)}return c};aC.prototype.get=function(a){switch(this.kind){case +7:var +d=this.data[a*2+0],b=this.data[a*2+1];return lb(d,b);case +10:case +11:var +e=this.data[a*2+0],c=this.data[a*2+1];return[aB,e,c];default:return this.data[a]}};aC.prototype.set=function(a,b){switch(this.kind){case +7:this.data[a*2+0]=c2(b);this.data[a*2+1]=c1(b);break;case +10:case +11:this.data[a*2+0]=b[1];this.data[a*2+1]=b[2];break;default:this.data[a]=b;break}return 0};aC.prototype.fill=function(a){switch(this.kind){case +7:var +c=c2(a),e=c1(a);if(c==e)this.data.fill(c);else +for(var +b=0;be)return 1;if(d!=e){if(!b)return NaN;if(d==d)return 1;if(e==e)return-1}}break;case +7:for(var +c=0;ca.data[c+1])return 1;if(this.data[c]>>>0>>0)return-1;if(this.data[c]>>>0>a.data[c]>>>0)return 1}break;case +2:case +3:case +4:case +5:case +6:case +8:case +9:case +12:for(var +c=0;ca.data[c])return 1}break}return 0};function +a0(a,b,c,d){this.kind=a;this.layout=b;this.dims=c;this.data=d}a0.prototype=new +aC();a0.prototype.offset=function(a){if(typeof +a!=="number")if(a +instanceof +Array&&a.length==1)a=a[0];else +w("Ml_Bigarray_c_1_1.offset");if(a<0||a>=this.dims[0])bj();return a};a0.prototype.get=function(a){return this.data[a]};a0.prototype.set=function(a,b){this.data[a]=b;return 0};a0.prototype.fill=function(a){this.data.fill(a);return 0};function +cQ(a,b,c,d){var +e=fh(a);if(bG(c)*e!=d.length)w("length doesn't match dims");if(b==0&&c.length==1&&e==1)return new +a0(a,b,c,d);return new +aC(a,b,c,d)}function +lp(a){return a.slice(1)}function +kU(a,b,c){var +d=lp(c),e=ff(a,bG(d));return cQ(a,b,d,e)}function +bk(a,b,c){a.set(a.offset(b),c);return 0}function +bP(a,b,c){var +d=String.fromCharCode;if(b==0&&c<=4096&&c==a.length)return d.apply(null,a);var +f=e;for(;0=c.l||c.t==2&&e>=c.c.length)){c.c=a.t==4?bP(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else if(c.t==2&&d==c.c.length){c.c+=a.t==4?bP(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else{if(c.t!=4)bH(c);var +g=a.c,h=c.c;if(a.t==4)if(d<=b)for(var +f=0;f=0;f--)h[d+f]=g[b+f];else{var +i=Math.min(e,g.length-b);for(var +f=0;f>=1;if(a==0)return d;b+=b;c++;if(c==9)b.slice(0,1)}}function +bI(a){if(a.t==2)a.c+=a1(a.l-a.c.length,"\0");else +a.c=bP(a.c,0,a.c.length);a.t=0}function +c$(a){if(a.length<24){for(var +b=0;bcK)return false;return true}else +return!/[^\x00-\x7f]/.test(a)}function +fP(a){for(var +k=e,d=e,h,g,i,b,c=0,j=a.length;ceC){d.substr(0,1);k+=d;d=e;k+=a.slice(c,f)}else +d+=a.slice(c,f);if(f==j)break;c=f}b=1;if(++c=0xd7ff&&b<0xe000)b=2}else{b=3;if(++c0x10ffff)b=3}}}}}if(b<4){c-=b;d+="\ufffd"}else if(b>ab)d+=String.fromCharCode(0xd7c0+(b>>10),eN+(b&0x3FF));else +d+=String.fromCharCode(b);if(d.length>bf){d.substr(0,1);k+=d;d=e}}return k+d}function +ap(a,b,c){this.t=a;this.c=b;this.l=c}ap.prototype.toString=function(){switch(this.t){case +9:return this.c;default:bI(this);case +0:if(c$(this.c)){this.t=9;return this.c}this.t=8;case +8:return this.c}};ap.prototype.toUtf16=function(){var +a=this.toString();if(this.t==9)return a;return fP(a)};ap.prototype.slice=function(){var +a=this.t==4?this.c.slice():this.c;return new +ap(this.t,a,this.l)};function +fk(a){return new +ap(0,a,a.length)}function +as(a){return a}function +aM(a){return fk(as(a))}function +aq(a,b,c,d,e){aD(aM(a),b,c,d,e);return 0}function +kY(){w(cM)}function +t(a,b,c){c&=ao;if(a.t!=4){if(b==a.c.length){a.c+=String.fromCharCode(c);if(b+1==a.l)a.t=0;return 0}bH(a)}a.c[b]=c;return 0}function +aN(a,b,c){if(b>>>0>=a.l)kY();return t(a,b,c)}function +cS(a,b){switch(a.t&6){default:if(b>=a.c.length)return 0;case +0:return a.c.charCodeAt(b);case +4:return a.c[b]}}function +ah(d,c){var +f=d.l>=0?d.l:d.l=d.length,e=c.length,b=f-e;if(b==0)return d.apply(null,c);else if(b<0){var +a=d.apply(null,c.slice(0,f));if(typeof +a!=="function")return a;return ah(a,c.slice(f))}else{switch(b){case +1:{var +a=function(a){var +f=new +Array(e+1);for(var +b=0;b>>0>=a.length-1)bj();return a}function +k0(a){if(isFinite(a)){if(Math.abs(a)>=2.2250738585072014e-308)return 0;if(a!=0)return 1;return 2}return isNaN(a)?4:3}function +k1(){return[0]}function +y(a){if(a<0)w("Bytes.create");return new +ap(a?2:9,e,a)}var +fo=[0];function +k3(a){return fo}function +fp(a){fo=a}function +lm(a){return a==245?1:0}var +lJ=Math.log2&&Math.log2(1.1235582092889474E+307)==1020;function +lH(a){if(lJ)return Math.floor(Math.log2(a));var +b=0;if(a==0)return-Infinity;if(a>=1)while(a>=2){a/=2;b++}else +while(a<1){a*=2;b--}return b}function +cY(a){var +b=new +Float32Array(1);b[0]=a;var +c=new +Int32Array(b.buffer);return c[0]|0}function +U(a,b,c){return new +d(a,b,c)}function +bK(a){if(!isFinite(a)){if(isNaN(a))return U(1,0,eP);return a>0?U(0,0,eP):U(0,0,0xfff0)}var +f=a==0&&1/a==-Infinity?$:a>=0?0:$;if(f)a=-a;var +b=lH(a)+1023;if(b<=0){b=0;a/=Math.pow(2,-eH)}else{a/=Math.pow(2,b-e4);if(a<16){a*=2;b-=1}if(b==0)a/=2}var +d=Math.pow(2,24),c=a|0;a=(a-c)*d;var +e=a|0;a=(a-e)*d;var +g=a|0;c=c&cA|f|b<<4;return U(g,e,c)}function +bn(a){return a.toArray()}function +fj(a,b,c){a.write(32,b.dims.length);a.write(32,b.kind|b.layout<<8);if(b.caml_custom==bC)for(var +d=0;d>4;if(d==2047)return(f|g|c&cA)==0?c&$?-Infinity:Infinity:NaN;var +e=Math.pow(2,-24),b=(f*e+g)*e+(c&cA);if(d>0){b+=16;b*=Math.pow(2,d-e4)}else +b*=Math.pow(2,-eH);if(c&$)b=-b;return b}function +Q(a){if(!I.Failure)I.Failure=[B,V(cB),-3];c7(I.Failure,a)}function +fg(a,b,c){var +k=a.read32s();if(k<0||k>16)Q("input_value: wrong number of bigarray dimensions");var +r=a.read32s(),l=r&ao,q=r>>8&1,j=[];if(c==bC)for(var +d=0;d>>32-15;b=fG(b,0x1b873593);a^=b;a=a<<13|a>>>32-13;return(a+(a<<2)|0)+(0xe6546b64|0)|0}function +k9(a,b){a=ar(a,c2(b));a=ar(a,c1(b));return a}function +fv(a,b){return k9(a,bK(b))}function +fi(a){var +c=bG(a.dims),d=0;switch(a.kind){case +2:case +3:case +12:if(c>eE)c=eE;var +e=0,b=0;for(b=0;b+4<=a.data.length;b+=4){e=a.data[b+0]|a.data[b+1]<<8|a.data[b+2]<<16|a.data[b+3]<<24;d=ar(d,e)}e=0;switch(c&3){case +3:e=a.data[b+2]<<16;case +2:e|=a.data[b+1]<<8;case +1:e|=a.data[b+0];d=ar(d,e)}break;case +4:case +5:if(c>be)c=be;var +e=0,b=0;for(b=0;b+2<=a.data.length;b+=2){e=a.data[b+0]|a.data[b+1]<<16;d=ar(d,e)}if((c&1)!=0)d=ar(d,a.data[b]);break;case +6:if(c>64)c=64;for(var +b=0;b64)c=64;for(var +b=0;b32)c=32;c*=2;for(var +b=0;b64)c=64;for(var +b=0;b32)c=32;for(var +b=0;b0?f(b,a,d):f(a,b,d);if(d&&e!=e)return c;if(+e!=+e)return+e;if((e|0)!=0)return e|0}return c}function +c5(a){return typeof +a==="string"&&!/[^\x00-\xff]/.test(a)}function +c4(a){return a +instanceof +ap}function +fm(a){if(typeof +a==="number")return bg;else if(c4(a))return bE;else if(c5(a))return 1252;else if(a +instanceof +Array&&a[0]===a[0]>>>0&&a[0]<=eR){var +b=a[0]|0;return b==aB?0:b}else if(a +instanceof +String)return eS;else if(typeof +a=="string")return eS;else if(a +instanceof +Number)return bg;else if(a&&a.caml_custom)return cv;else if(a&&a.compare)return 1256;else if(typeof +a=="function")return 1247;else if(typeof +a=="symbol")return 1251;return 1001}function +fC(a,b){if(ab?1:0}function +kZ(a,b){a.t&6&&bI(a);b.t&6&&bI(b);return a.cb.c?1:0}function +cU(a,b,c){var +f=[];for(;;){if(!(c&&a===b)){var +e=fm(a);if(e==ee){a=a[1];continue}var +g=fm(b);if(g==ee){b=b[1];continue}if(e!==g){if(e==bg){if(g==cv)return fl(a,b,-1,c);return-1}if(g==bg){if(e==cv)return fl(b,a,1,c);return 1}return eb)return 1;if(a!=b){if(!c)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1001:if(ab)return 1;if(a!=b){if(!c)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1251:if(a!==b){if(!c)return NaN;return 1}break;case +1252:var +a=as(a),b=as(b);if(a!==b){if(ab)return 1}break;case +12520:var +a=a.toString(),b=b.toString();if(a!==b){if(ab)return 1}break;case +246:case +254:default:if(lm(e)){w("compare: continuation value");break}if(a.length!=b.length)return a.length1)f.push(a,b,1);break}}if(f.length==0)return 0;var +h=f.pop();b=f.pop();a=f.pop();if(h+10)if(b==0&&(c>=a.l||a.t==2&&c>=a.c.length))if(d==0){a.c=e;a.t=2}else{a.c=a1(c,String.fromCharCode(d));a.t=c==a.l?0:2}else{if(a.t!=4)bH(a);for(c+=b;b0&&b===b)return b;a=a.replace(/_/g,e);b=+a;if(a.length>0&&b===b||/^[+-]?nan$/i.test(a))return b;var +c=/^ *([+-]?)0x([0-9a-f]+)\.?([0-9a-f]*)(p([+-]?[0-9]+))?/i.exec(a);if(c){var +d=c[3].replace(/0+$/,e),g=parseInt(c[1]+c[2]+d,16),f=(c[5]|0)-4*d.length;b=g*Math.pow(2,f);return b}if(/^\+?inf(inity)?$/i.test(a))return Infinity;if(/^-inf(inity)?$/i.test(a))return-Infinity;Q("float_of_string")}function +c6(a){a=as(a);var +e=a.length;if(e>31)w("format_int: format too long");var +b={justify:aZ,signstyle:aK,filler:an,alternate:false,base:0,signedconv:false,width:0,uppercase:false,sign:1,prec:-1,conv:"f"};for(var +d=0;d=0&&c<=9){b.width=b.width*10+c;d++}d--;break;case".":b.prec=0;d++;while(c=a.charCodeAt(d)-48,c>=0&&c<=9){b.prec=b.prec*10+c;d++}d--;case"d":case"i":b.signedconv=true;case"u":b.base=10;break;case"x":b.base=16;break;case"X":b.base=16;b.uppercase=true;break;case"o":b.base=8;break;case"e":case"f":case"g":b.signedconv=true;b.conv=c;break;case"E":case"F":case"G":b.signedconv=true;b.uppercase=true;b.conv=c.toLowerCase();break}}return b}function +cW(a,b){if(a.uppercase)b=b.toUpperCase();var +f=b.length;if(a.signedconv&&(a.sign<0||a.signstyle!=aK))f++;if(a.alternate){if(a.base==8)f+=1;if(a.base==16)f+=2}var +c=e;if(a.justify==aZ&&a.filler==an)for(var +d=f;d20){c-=20;a/=Math.pow(10,c);a+=new +Array(c+1).join(O);if(b>0)a=a+aJ+new +Array(b+1).join(O);return a}else +return a.toFixed(b)}}var +c,f=c6(a),e=f.prec<0?6:f.prec;if(b<0||b==0&&1/b==-Infinity){f.sign=-1;b=-b}if(isNaN(b)){c=cI;f.filler=an}else if(!isFinite(b)){c="inf";f.filler=an}else +switch(f.conv){case"e":var +c=b.toExponential(e),d=c.length;if(c.charAt(d-3)==cE)c=c.slice(0,d-1)+O+c.slice(d-1);break;case"f":c=j(b,e);break;case"g":e=e?e:1;c=b.toExponential(e-1);var +i=c.indexOf(cE),h=+c.slice(i+1);if(h<-4||b>=1e21||b.toFixed(0).length>e){var +d=i-1;while(c.charAt(d)==O)d--;if(c.charAt(d)==aJ)d--;c=c.slice(0,d+1)+c.slice(i);d=c.length;if(c.charAt(d-3)==cE)c=c.slice(0,d-1)+O+c.slice(d-1);break}else{var +g=e;if(h<0){g-=h+1;c=b.toFixed(g)}else +while(c=b.toFixed(g),c.length>e+1)g--;if(g){var +d=c.length-1;while(c.charAt(d)==O)d--;if(c.charAt(d)==aJ)d--;c=c.slice(0,d+1)}}break}return cW(f,c)}function +bJ(a,b){if(as(a)==cq)return V(e+b);var +c=c6(a);if(b<0)if(c.signedconv){c.sign=-1;b=-b}else +b>>>=0;var +d=b.toString(c.base);if(c.prec>=0){c.filler=an;var +f=c.prec-d.length;if(f>0)d=a1(f,O)+d}return cW(c,d)}var +lx=0;function +fs(){return lx++}function +u(a){if(c$(a))return a;return fP(a)}function +bp(){return typeof +f.process!=="undefined"&&typeof +f.process.versions!=="undefined"&&typeof +f.process.versions.node!=="undefined"}function +lK(){function +a(a){if(a.charAt(0)===af)return[e,a.substring(1)];return}function +b(a){var +h=/^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/,b=h.exec(a),c=b[1]||e,f=Boolean(c&&c.charAt(1)!==":");if(Boolean(b[2]||f)){var +d=b[1]||e,g=b[2]||e;return[d,a.substring(d.length+g.length)]}return}return bp()&&f.process&&f.process.platform?f.process.platform==="win32"?b:a:a}var +da=lK();function +fN(a){return a.slice(-1)!==af?a+af:a}if(bp()&&f.process&&f.process.cwd)var +bl=f.process.cwd().replace(/\\/g,af);else +var +bl="/static";bl=fN(bl);function +lr(a){a=u(a);if(!da(a))a=bl+a;var +e=da(a),d=e[1].split(af),b=[];for(var +c=0;c1)b.pop();break;case".":break;case"":break;default:b.push(d[c]);break}b.unshift(e[0]);b.orig=a;return b}function +lG(a){for(var +g=e,c=g,b,i,d=0,h=a.length;deC){c.substr(0,1);g+=c;c=e;g+=a.slice(d,f)}else +c+=a.slice(d,f);if(f==h)break;d=f}if(b>6);c+=String.fromCharCode(aa|b&aY)}else if(b<0xd800||b>=en)c+=String.fromCharCode(eF|b>>12,aa|b>>6&aY,aa|b&aY);else if(b>=0xdbff||d+1==h||(i=a.charCodeAt(d+1))en)c+="\xef\xbf\xbd";else{d++;b=(b<<10)+i-0x35fdc00;c+=String.fromCharCode(eq|b>>18,aa|b>>12&aY,aa|b>>6&aY,aa|b&aY)}if(c.length>bf){c.substr(0,1);g+=c;c=e}}return g+c}function +ad(a){return c$(a)?V(a):V(lG(a))}var +lL=["E2BIG","EACCES","EAGAIN",cw,"EBUSY","ECHILD","EDEADLK","EDOM",e_,"EFAULT","EFBIG","EINTR","EINVAL","EIO","EISDIR","EMFILE","EMLINK","ENAMETOOLONG","ENFILE","ENODEV",cO,"ENOEXEC","ENOLCK","ENOMEM","ENOSPC","ENOSYS",cF,e6,"ENOTTY","ENXIO","EPERM","EPIPE","ERANGE","EROFS","ESPIPE","ESRCH","EXDEV","EWOULDBLOCK","EINPROGRESS","EALREADY","ENOTSOCK","EDESTADDRREQ","EMSGSIZE","EPROTOTYPE","ENOPROTOOPT","EPROTONOSUPPORT","ESOCKTNOSUPPORT","EOPNOTSUPP","EPFNOSUPPORT","EAFNOSUPPORT","EADDRINUSE","EADDRNOTAVAIL","ENETDOWN","ENETUNREACH","ENETRESET","ECONNABORTED","ECONNRESET","ENOBUFS","EISCONN","ENOTCONN","ESHUTDOWN","ETOOMANYREFS","ETIMEDOUT","ECONNREFUSED","EHOSTDOWN","EHOSTUNREACH","ELOOP","EOVERFLOW"];function +ax(a,b,c,d){var +f=lL.indexOf(a);if(f<0){if(d==null)d=-9999;f=[0,d]}var +g=[f,ad(b||e),ad(c||e)];return g}var +fH={};function +aF(a){return fH[a]}function +av(a,b){throw i([0,a].concat(b))}function +cR(a){if(!(a +instanceof +Uint8Array))a=new +Uint8Array(a);return new +ap(4,a,a.length)}function +l(a){c7(I.Sys_error,a)}function +fK(a){l(a+bB)}function +fO(a){if(a.t!=4)bH(a);return a.c}function +ai(a){return a.l}function +fc(){}function +H(a){this.data=a}H.prototype=new +fc();H.prototype.constructor=H;H.prototype.truncate=function(a){var +b=this.data;this.data=y(a|0);aD(b,0,this.data,0,a)};H.prototype.length=function(){return ai(this.data)};H.prototype.write=function(a,b,c,d){var +e=this.length();if(a+d>=e){var +f=y(a+d),g=this.data;this.data=f;aD(g,0,this.data,0,e)}aD(cR(b),c,this.data,a,d);return 0};H.prototype.read=function(a,b,c,d){var +e=this.length();if(a+d>=e)d=e-a;if(d){var +f=y(d|0);aD(this.data,a,f,0,d);b.set(fO(f),c)}return d};function +aL(a,b,c){this.file=b;this.name=a;this.flags=c}aL.prototype.err_closed=function(){l(this.name+ev)};aL.prototype.length=function(){if(this.file)return this.file.length();this.err_closed()};aL.prototype.write=function(a,b,c,d){if(this.file)return this.file.write(a,b,c,d);this.err_closed()};aL.prototype.read=function(a,b,c,d){if(this.file)return this.file.read(a,b,c,d);this.err_closed()};aL.prototype.close=function(){this.file=undefined};function +C(a,b){this.content={};this.root=a;this.lookupFun=b}C.prototype.nm=function(a){return this.root+a};C.prototype.create_dir_if_needed=function(a){var +d=a.split(af),c=e;for(var +b=0;b0?eh:"-infinity")}var +k=a==0&&1/a==-Infinity?1:a>=0?0:1;if(k)a=-a;var +f=0;if(a==0);else if(a<1)while(a<1&&f>-1022){a*=2;f--}else +while(a>=2){a/=2;f++}var +l=f<0?e:aZ,g=e;if(k)g=aK;else +switch(c){case +43:g=aZ;break;case +32:g=an;break;default:break}if(b>=0&&b<13){var +i=Math.pow(2,b*4);a=Math.round(a*i)/i}var +d=a.toString(16);if(b>=0){var +j=d.indexOf(aJ);if(j<0)d+=aJ+a1(b,O);else{var +h=j+1+b;if(d.length>24&ag,a>>31&ab)}function +lj(a){return a.toInt()}function +le(a){return+a.isNeg()}function +fy(a){return a.neg()}function +lc(a,b){var +c=c6(a);if(c.signedconv&&le(b)){c.sign=-1;b=fy(b)}var +d=e,i=bL(c.base),h="0123456789abcdef";do{var +g=b.udivmod(i);b=g.quotient;d=h.charAt(lj(g.modulus))+d}while(!lf(b));if(c.prec>=0){c.filler=an;var +f=c.prec-d.length;if(f>0)d=a1(f,O)+d}return cW(c,d)}function +fB(a,b){return a.or(b)}function +lo(a){if(a.js_error)return[0,a.js_error];return 0}function +lq(a,b){return+(cU(a,b,false)<=0)}function +fI(a){return V(a)}function +fw(a,b){return a.add(b)}function +fx(a,b){return a.mul(b)}function +c3(a,b){return a.ucompare(b)<0}function +ly(a){var +b=0,e=q(a),c=10,d=1;if(e>0)switch(aw(a,b)){case +45:b++;d=-1;break;case +43:b++;d=1;break}if(b+1=48&&a<=57)return a-48;if(a>=65&&a<=90)return a-55;if(a>=97&&a<=122)return a-87;return-1}function +fz(a){var +h=ly(a),g=h[0],j=h[1],e=h[2],i=bL(e),k=new +d(ag,0xfffffff,ab).udivmod(i).quotient,f=aw(a,g),b=fJ(f);if(b<0||b>=e)Q(bd);var +c=bL(b);for(;;){g++;f=aw(a,g);if(f==95)continue;b=fJ(f);if(b<0||b>=e)break;if(c3(k,c))Q(bd);b=bL(b);c=fw(fx(i,c),b);if(c3(c,b))Q(bd)}if(g!=q(a))Q(bd);if(e==10&&c3(new +d(0,0,$),c))Q(bd);if(j<0)c=fy(c);return c}function +kW(a,b){return a.get(a.offset(b))}function +ll(a,b){return a.xor(b)}function +li(a,b){return a.shift_right_unsigned(b)}function +lh(a,b){return a.shift_left(b)}function +bM(a){function +o(a,b){return lh(a,b)}function +h(a,b){return li(a,b)}function +s(a,b){return fB(a,b)}function +f(a,b){return ll(a,b)}function +k(a,b){return fw(a,b)}function +i(a,b){return fx(a,b)}function +m(a,b){return s(o(a,b),h(a,64-b))}function +g(a,b){return kW(a,b)}function +j(a,b,c){return bk(a,b,c)}var +q=fz(fI("0xd1342543de82ef95")),l=fz(fI("0xdaba0b6eb09322e3")),b,d,c,e=a,r=g(e,0),n=g(e,1),p=g(e,2),t=g(e,3);b=k(n,p);b=i(f(b,h(b,32)),l);b=i(f(b,h(b,32)),l);b=f(b,h(b,32));j(e,1,k(i(n,q),r));var +d=p,c=t;c=f(c,d);d=m(d,24);d=f(f(d,c),o(c,16));c=m(c,37);j(e,2,d);j(e,3,c);return b}function +aE(a,b){if(a<0)bj();var +a=a+1|0,c=new +Array(a);c[0]=0;for(var +d=1;d0&&c>=0&&c+d<=b.length&&b[c+d-1]==10)d--;var +e=y(d);aD(cR(b),c,e,0,d);this.log(e.toUtf16());return 0}l(this.fd+ev)};bi.prototype.read=function(a,b,c,d){l(this.fd+": file descriptor is write only")};bi.prototype.close=function(){this.log=undefined};function +bR(a,b){if(b==undefined)b=bQ.length;bQ[b]=a;return b|0}function +lM(a,b,c){var +d={};while(b){switch(b[1]){case +0:d.rdonly=1;break;case +1:d.wronly=1;break;case +2:d.append=1;break;case +3:d.create=1;break;case +4:d.truncate=1;break;case +5:d.excl=1;break;case +6:d.binary=1;break;case +7:d.text=1;break;case +8:d.nonblock=1;break}b=b[2]}if(d.rdonly&&d.wronly)l(as(a)+ct);if(d.text&&d.binary)l(as(a)+cr);var +e=fR(a),f=e.device.open(e.rest,d);return bR(f,undefined)}(function(){function +a(a,b){return bp()?lF(a,b):new +bi(a,b)}bR(a(0,{rdonly:1,altname:"/dev/stdin",isCharacterDevice:true}),0);bR(a(1,{buffered:2,wronly:1,isCharacterDevice:true}),1);bR(a(2,{buffered:2,wronly:1,isCharacterDevice:true}),2)}());function +lt(a){var +b=bQ[a];if(b.flags.wronly)l(ex+a+" is writeonly");var +d=null,c={file:b,offset:b.flags.append?b.length():0,fd:a,opened:true,out:false,buffer_curr:0,buffer_max:0,buffer:new +Uint8Array(e5),refill:d};at[c.fd]=c;return c.fd}function +fD(a){var +b=bQ[a];if(b.flags.rdonly)l(ex+a+" is readonly");var +d=b.flags.buffered!==undefined?b.flags.buffered:1,c={file:b,offset:b.flags.append?b.length():0,fd:a,opened:true,out:true,buffer_curr:0,buffer:new +Uint8Array(e5),buffered:d};at[c.fd]=c;return c.fd}function +lu(){var +b=0;for(var +a=0;ae.buffer.length){var +g=new +Uint8Array(e.buffer_curr+b.length);g.set(e.buffer);e.buffer=g}switch(e.buffered){case +0:e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;au(a);break;case +1:e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;if(e.buffer_curr>=e.buffer.length)au(a);break;case +2:var +f=b.lastIndexOf(10);if(f<0){e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;if(e.buffer_curr>=e.buffer.length)au(a)}else{e.buffer.set(b.subarray(0,f+1),e.buffer_curr);e.buffer_curr+=f+1;au(a);e.buffer.set(b.subarray(f+1),e.buffer_curr);e.buffer_curr+=b.length-f-1}break}return 0}function +fE(a,b,c,d){return lv(a,aM(b),c,d)}function +fF(a,b){var +c=V(String.fromCharCode(b));fE(a,c,0,1);return 0}function +aO(a,b){return+(cU(a,b,false)!=0)}function +bN(a){if(a +instanceof +Array&&a[0]==a[0]>>>0)return a[0];else if(c4(a))return bE;else if(c5(a))return bE;else if(a +instanceof +Function||typeof +a=="function")return 247;else if(a&&a.caml_custom)return eR;else +return bg}var +cT=ah;function +kX(a){var +b;while(a)if(u(a[1][1])=="SYJS"){b=a[1][2];break}else +a=a[2];var +d={};if(b)for(var +c=1;c=0)a=e;else +Q("caml_register_global: cannot locate "+d)}}I[a+1]=b;if(c)I[c]=b}function +c9(a,b){fH[as(a)]=b;return 0}function +a2(a,b){if(a===b)return 1;return 0}function +lC(){w(cM)}function +R(a,b){if(b>>>0>=q(a))lC();return aw(a,b)}function +fM(a,b){return 1-a2(a,b)}function +lE(){return 0x7FFFFFFF/4|0}function +c_(a){var +b=1;while(a&&a.joo_tramp){a=a.joo_tramp.apply(null,a.joo_args);b++}return a}function +D(a,b){return{joo_tramp:a,joo_args:b}}function +bo(a){{if(a +instanceof +Array)return a;var +b;if(f.RangeError&&a +instanceof +f.RangeError&&a.message&&a.message.match(/maximum call stack/i))b=I.Stack_overflow;else if(f.InternalError&&a +instanceof +f.InternalError&&a.message&&a.message.match(/too much recursion/i))b=I.Stack_overflow;else if(a +instanceof +f.Error&&aF(cN))b=[0,aF(cN),a];else +b=[0,I.Failure,ad(String(a))];if(a +instanceof +f.Error)b.js_error=a;return b}}function +ln(a){switch(a[2]){case-8:case-11:case-12:return 1;default:return 0}}function +k7(a){var +b=e;if(a[0]==0){b+=a[1][1];if(a.length==3&&a[2][0]==0&&ln(a[1]))var +f=a[2],g=1;else +var +g=2,f=a;b+="(";for(var +d=g;dg)b+=eG;var +c=f[d];if(typeof +c=="number")b+=c.toString();else if(c +instanceof +ap)b+=bD+c.toString()+bD;else if(typeof +c=="string")b+=bD+c.toString()+bD;else +b+=e2}b+=")"}else if(a[0]==B)b+=a[1];return b}function +fr(a){if(a +instanceof +Array&&(a[0]==0||a[0]==B)){var +c=aF(eY);if(c)cT(c,[a,false]);else{var +d=k7(a),b=aF(eA);if(b)cT(b,[0]);console.error(cs+d+"\n");if(a.js_error)throw a.js_error}}else +throw a}function +lB(){var +c=f.process;if(c&&c.on)c.on("uncaughtException",function(a,b){fr(a);c.exit(2)});else if(f.addEventListener)f.addEventListener("error",function(a){if(a.error)fr(a.error)})}lB();function +g(a,b){return(a.l>=0?a.l:a.l=a.length)==1?a(b):ah(a,[b])}function +k(a,b,c){return(a.l>=0?a.l:a.l=a.length)==2?a(b,c):ah(a,[b,c])}function +s(a,b,c,d){return(a.l>=0?a.l:a.l=a.length)==3?a(b,c,d):ah(a,[b,c,d])}function +eb(a,b,c,d,e){return(a.l>=0?a.l:a.l=a.length)==4?a(b,c,d,e):ah(a,[b,c,d,e])}function +aI(a,b,c,d,e,f){return(a.l>=0?a.l:a.l=a.length)==5?a(b,c,d,e,f):ah(a,[b,c,d,e,f])}function +ec(a,b,c,d,e,f,g){return(a.l>=0?a.l:a.l=a.length)==6?a(b,c,d,e,f,g):ah(a,[b,c,d,e,f,g])}function +kQ(a,b,c,d,e,f,g,h){return(a.l>=0?a.l:a.l=a.length)==7?a(b,c,d,e,f,g,h):ah(a,[b,c,d,e,f,g,h])}k8();var +bT=[B,ei,-1],de=[B,eu,-2],bS=[B,cB,-3],db=[B,ez,-4],dc=[B,eM,-8],dd=[B,eW,-9],j=[B,e7,-11],df=[B,eI,-12],kP=[4,0,0,0,[12,45,[4,0,0,0,0]]],b4=[0,[11,'File "',[2,0,[11,'", line ',[4,0,0,0,[11,e1,[4,0,0,0,[12,45,[4,0,0,0,[11,": ",[2,0,0]]]]]]]]]],'File "%s", line %d, characters %d-%d: %s'],dL=[0,0];Z(11,df,eI);Z(10,j,e7);Z(9,[B,eg,-10],eg);Z(8,dd,eW);Z(7,dc,eM);Z(6,[B,ek,-7],ek);Z(5,[B,ew,-6],ew);Z(4,[B,eX,-5],eX);Z(3,db,ez);Z(2,bS,cB);Z(1,de,eu);Z(0,bT,ei);var +fV=aJ,fT="true",fU="false",fY="\\\\",fZ="\\'",f0="\\b",f1="\\t",f2="\\n",f3="\\r",f6="String.blit / Bytes.blit_string",f5="Bytes.blit",f4="String.sub / Bytes.sub",f7="String.concat",f9="Array.blit",f8="Array.sub",f_="Buffer.add: cannot grow buffer",gi="%c",gj="%s",gk=e$,gl=et,gm=er,gn=ej,go="%f",gp="%B",gq="%{",gr="%}",gs="%(",gt="%)",gu="%a",gv="%t",gw="%?",gx="%r",gy="%_r",gz=[0,c,850,23],gK=[0,c,814,21],gC=[0,c,815,21],gL=[0,c,818,21],gD=[0,c,819,21],gM=[0,c,822,19],gE=[0,c,823,19],gN=[0,c,826,22],gF=[0,c,827,22],gO=[0,c,831,30],gG=[0,c,832,30],gI=[0,c,836,26],gA=[0,c,837,26],gJ=[0,c,846,28],gB=[0,c,847,28],gH=[0,c,851,23],hP=[0,c,1558,4],hQ="Printf: bad conversion %[",hR=[0,c,1626,39],hS=[0,c,1649,31],hT=[0,c,1650,31],hU="Printf: bad conversion %_",hV=eK,hW=ep,hX=eK,hY=ep,hN=cI,hL="neg_infinity",hM=eh,hK=aJ,hF=[0,e9],ht="%+nd",hu="% nd",hw="%+ni",hx="% ni",hy="%nx",hz="%#nx",hA="%nX",hB="%#nX",hC="%no",hD="%#no",hs="%nd",hv=er,hE="%nu",hg="%+ld",hh="% ld",hj="%+li",hk="% li",hl="%lx",hm="%#lx",hn="%lX",ho="%#lX",hp="%lo",hq="%#lo",hf="%ld",hi=et,hr="%lu",g5="%+Ld",g6="% Ld",g8="%+Li",g9="% Li",g_="%Lx",g$="%#Lx",ha="%LX",hb="%#LX",hc="%Lo",hd="%#Lo",g4="%Ld",g7=ej,he="%Lu",gS="%+d",gT="% d",gV="%+i",gW="% i",gX="%x",gY="%#x",gZ="%X",g0="%#X",g1="%o",g2="%#o",gR=cq,gU=e$,g3=e8,ga="@]",gb="@}",gc="@?",gd="@\n",ge="@.",gf="@@",gg="@%",gh="@",gP="CamlinternalFormat.Type_mismatch",h2=e,h3=[0,[11,eG,[2,0,[2,0,0]]],", %s%s"],ir=[0,[11,cs,[2,0,[12,10,0]]],eU],is=[0,[11,"Fatal error in uncaught exception handler: exception ",[2,0,[12,10,0]]],"Fatal error in uncaught exception handler: exception %s\n"],iq="Fatal error: out of memory in uncaught exception handler",io=[0,[11,cs,[2,0,[12,10,0]]],eU],ik=[0,[2,0,[12,10,0]],"%s\n"],ib="Raised at",ic="Re-raised at",id="Raised by primitive operation at",ie="Called from",ig=" (inlined)",ii=e,ih=[0,[2,0,[12,32,[2,0,[11,' in file "',[2,0,[12,34,[2,0,[11,", line ",[4,0,0,0,[11,e1,kP]]]]]]]]]],'%s %s in file "%s"%s, line %d, characters %d-%d'],ij=[0,[2,0,[11," unknown location",0]],"%s unknown location"],h8="Out of memory",h9="Stack overflow",h_="Pattern matching failed",h$="Assertion failed",ia="Undefined recursive module",h4=[0,[12,40,[2,0,[2,0,[12,41,0]]]],"(%s%s)"],h5=e,h6=e,h7=[0,[12,40,[2,0,[12,41,0]]],"(%s)"],h1=[0,[4,0,0,0,0],cq],hZ=[0,[3,0,0],"%S"],h0=e2,il=[0,e,"(Cannot print locations:\n bytecode executable program file not found)","(Cannot print locations:\n bytecode executable program file appears to be corrupt)","(Cannot print locations:\n bytecode executable program file has wrong magic number)","(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"],iz=U(14371852,15349651,22696),iA=U(12230193,11438743,35013),iB=U(1424933,15549263,2083),iC=U(9492471,4696708,43520),it=U(1,0,0),iu=U(0,0,0),ix=U(1,0,0),iv=U(0,0,0),iw=U(2,0,0),iE="Jsoo_runtime.Error.Exn",iU=[0,T,161,16],iT=[0,T,162,16],iS=[0,T,cL,4],iR=[0,T,94,4],iQ=[0,T,79,4],iP=[0,T,80,4],iO=[0,T,85,4],iN=[0,T,67,4],iM=[0,T,68,4],iL=[0,T,54,4],iK=[0,T,55,4],iJ=[0,T,25,4],iI=[0,T,19,4],ju=[0,a,990,8],jt=[0,a,980,8],jf=[0,a,381,16],jn=[0,a,604,12],jo=[0,a,616,12],jr=[0,a,825,8],jq=[0,a,833,12],jp=[0,a,787,8],jm=[0,a,572,12],jl=[0,a,503,8],jk=[0,a,485,8],jj=[0,a,466,8],ji=[0,a,436,8],jh=[0,a,423,8],jg=[0,a,424,8],i_=[0,a,293,12],ja=[0,a,310,20],i$=[0,a,311,20],jb=[0,a,324,20],jc=[0,a,334,20],jd=[0,a,348,20],je=[0,a,359,20],i9=[0,a,223,8],i8=[0,a,el,8],i7=[0,a,206,8],i6=[0,a,207,8],i5=[0,a,208,8],i4=[0,a,193,8],i3=[0,a,194,8],i2=[0,a,195,8],i0=[0,a,109,20],iZ=[0,a,eZ,24],iY=[0,a,115,24],i1=[0,a,107,16],iW=[0,a,81,20],iX=[0,a,79,16],js=[0,a,20,8],jx=[0,fb,257,8],jw=[0,fb,147,8],jA=[0,cz,77,12],jz=[0,cz,51,17],jy=[0,cz,53,17],jB=[0,1],jC=[0,0],jT=[0,bh,356,12],jN="href",jO=co,jL=cD,jK=cD,jH="Cannot decode event",jG=[0,bh,78,33],jF=[0,bh,88,21],jE=[0,bh,cL,33],jD=[0,bh,48,17],jP="tagName",jR=co,jU=[0,"src/browser/vdom.ml",el,16],jV=[0,0,0],jW=" col: ",jX=" line: ",jY="assertion failed file: ",jZ="Uncaught javascript exception",j0="Uncaught ocaml exception",j2="Exception in task execution",j1=[0,"src/browser/task.ml",11,4],j7="Exception in 'update_subscriptions' of Fmlib_browser",j_=[0,bz,353,4],kf="load",kd="Exception in 'update'",kc="subscriptioin",kb="view",j$="'",ka="Exception in '",j8="Exception in 'update_dom' of Fmlib_browser",j9=[0,bz,341,4],j6=[0,bz,94,12],j5=[0,bz,85,12],kp="label",ko=ed,kn="button",km=ey,kl="div",kk="h2",kh=cJ,ki=co,kj=ed,kg=cD,kt=[0,[8,[0,0,0],0,[0,1],0],eT],ku=[0,[8,[0,0,0],0,[0,1],0],eT],kv=eJ,kw=eQ,kx=cJ,ky="progress",kz="Elapsed time: ",kA=eJ,kB=cJ,kC=e3,kD="step",kE="30",kF=eQ,kG=e3,kH="min",kI="range",kJ="type",kK="Duration: ",kL="Reset",kM="A timer runs for a duration. A click on the reset button\n restarts the timer. A change of the duration has an\n immediate effect.\n ",kN="Timer",kq=[0,"src/examples/browser/timer.ml",22,8],kr=[aB,0.,5.];function +r(a){if(typeof +a==="number")return 0;switch(a[0]){case +0:return[0,r(a[1])];case +1:return[1,r(a[1])];case +2:return[2,r(a[1])];case +3:return[3,r(a[1])];case +4:return[4,r(a[1])];case +5:return[5,r(a[1])];case +6:return[6,r(a[1])];case +7:return[7,r(a[1])];case +8:var +c=a[1];return[8,c,r(a[2])];case +9:var +b=a[1];return[9,b,b,r(a[3])];case +10:return[10,r(a[1])];case +11:return[11,r(a[1])];case +12:return[12,r(a[1])];case +13:return[13,r(a[1])];default:return[14,r(a[1])]}}function +G(a,b){if(typeof +a==="number")return b;switch(a[0]){case +0:return[0,G(a[1],b)];case +1:return[1,G(a[1],b)];case +2:return[2,G(a[1],b)];case +3:return[3,G(a[1],b)];case +4:return[4,G(a[1],b)];case +5:return[5,G(a[1],b)];case +6:return[6,G(a[1],b)];case +7:return[7,G(a[1],b)];case +8:var +c=a[1];return[8,c,G(a[2],b)];case +9:var +d=a[2],e=a[1];return[9,e,d,G(a[3],b)];case +10:return[10,G(a[1],b)];case +11:return[11,G(a[1],b)];case +12:return[12,G(a[1],b)];case +13:return[13,G(a[1],b)];default:return[14,G(a[1],b)]}}function +p(a,b){if(typeof +a==="number")return b;switch(a[0]){case +0:return[0,p(a[1],b)];case +1:return[1,p(a[1],b)];case +2:var +c=a[1];return[2,c,p(a[2],b)];case +3:var +d=a[1];return[3,d,p(a[2],b)];case +4:var +e=a[3],f=a[2],g=a[1];return[4,g,f,e,p(a[4],b)];case +5:var +h=a[3],i=a[2],j=a[1];return[5,j,i,h,p(a[4],b)];case +6:var +k=a[3],l=a[2],m=a[1];return[6,m,l,k,p(a[4],b)];case +7:var +n=a[3],o=a[2],q=a[1];return[7,q,o,n,p(a[4],b)];case +8:var +r=a[3],s=a[2],t=a[1];return[8,t,s,r,p(a[4],b)];case +9:var +u=a[1];return[9,u,p(a[2],b)];case +10:return[10,p(a[1],b)];case +11:var +v=a[1];return[11,v,p(a[2],b)];case +12:var +w=a[1];return[12,w,p(a[2],b)];case +13:var +x=a[2],y=a[1];return[13,y,x,p(a[3],b)];case +14:var +z=a[2],A=a[1];return[14,A,z,p(a[3],b)];case +15:return[15,p(a[1],b)];case +16:return[16,p(a[1],b)];case +17:var +B=a[1];return[17,B,p(a[2],b)];case +18:var +C=a[1];return[18,C,p(a[2],b)];case +19:return[19,p(a[1],b)];case +20:var +D=a[2],E=a[1];return[20,E,D,p(a[3],b)];case +21:var +F=a[1];return[21,F,p(a[2],b)];case +22:return[22,p(a[1],b)];case +23:var +G=a[1];return[23,G,p(a[2],b)];default:var +H=a[2],I=a[1];return[24,I,H,p(a[3],b)]}}function +ay(a){throw i([0,db,a],1)}function +bq(a){return 0<=a?a:-a|0}function +aP(a,b){var +c=q(a),e=q(b),d=y(c+e|0);aq(a,0,d,0,c);aq(b,0,d,c,e);return K(d)}function +fS(a){return a?fT:fU}lt(0);fD(1);var +aj=fD(2);function +fW(a){var +b=lu(0);for(;;){if(!b)return 0;var +d=b[2],e=b[1];try{au(e)}catch(f){var +c=bo(f);if(c[1]!==de)throw i(c,0)}var +b=d}}function +a4(a,b){return fE(a,b,0,q(b))}function +dg(a){a4(aj,a);fF(aj,10);return au(aj)}var +fX=[0,fW],dh=[0,function(a){return 0}];function +bU(a){g(dh[1],0);return g(bF(fX),0)}c9(eA,bU);var +a5=(4*lE(0)|0)-1|0;function +a6(a){var +b=a,c=0;for(;;){if(!b)return c;var +d=[0,b[1],c],b=b[2],c=d}}function +a7(a,b){var +c=b;for(;;){if(!c)return 0;var +d=c[2];g(a,c[1]);var +c=d}}function +di(a,b,c){var +e=b,d=c;for(;;){if(!d)return e;var +f=d[2],e=k(a,e,d[1]),d=f}}var +aQ=fC;function +aG(a,b){var +c=y(a);k5(c,0,a,b);return c}function +dj(a,b,c){var +f=0;if(0<=b&&0<=c&&(ai(a)-c|0)>=b){var +d=y(c);aD(a,b,d,0,c);var +e=d;f=1}if(!f)var +e=ay(f4);return K(e)}function +dk(a,b,c,d,e){if(0<=e&&0<=b&&(ai(a)-e|0)>=b&&0<=d&&(ai(c)-e|0)>=d)return aD(a,b,c,d,e);return ay(f5)}function +ae(a,b,c,d,e){if(0<=e&&0<=b&&(q(a)-e|0)>=b&&0<=d&&(ai(c)-e|0)>=d)return aq(a,b,c,d,e);return ay(f6)}var +aR=lD;function +bV(a){var +b=a.length-1;return 0===b?[0]:cP(a,0,b)}function +bW(a,b,c){if(0<=b&&0<=c&&(a.length-1-c|0)>=b)return cP(a,b,c);return ay(f8)}function +_(a,b,c,d,e){if(0<=e&&0<=b&&(a.length-1-e|0)>=b&&0<=d&&(c.length-1-e|0)>=d)return kS(a,b,c,d,e);return ay(f9)}function +bX(a,b,c){var +e=[0,b],f=c.length-1-1|0,g=0;if(f>=0){var +d=g;for(;;){e[1]=k(a,e[1],c[1+d]);var +h=d+1|0;if(f!==d){var +d=h;continue}break}}return e[1]}function +dl(a,b){var +d=a[2],c=[0,a[1][2]];for(;;){if(c[1]<(d+b|0)){c[1]=2*c[1]|0;continue}if(a5a5)throw i([0,bS,f_],1);c[1]=a5}var +e=y(c[1]);dk(a[1][1],0,e,0,a[2]);a[1]=[0,e,c[1]];return 0}}function +a8(a,b){var +c=q(b),d=a[1],e=a[2]+c|0,f=a[2],g=d[1];if(d[2]=c){var +c=2*c|0;continue}var +f=aE(c,bY);_(d,0,f,0,e);fp(f);var +h=f;break}}var +i=P(h,b)[1+b];if(i===bY){var +j=g(l,0);P(h,b)[1+b]=j;var +k=j}else +var +k=i;return g(k,0)};function +bZ(a){return 5===a[2]?12:-6}function +dq(a){return[0,0,y(a)]}function +dr(a,b){var +c=ai(a[2]),d=a[1]+b|0,e=c=e+eD>>>0)f=1}else if(65<=e)f=1}else{var +i=0;if(32===e)i=1;else if(43<=e)switch(e-43|0){case +5:if(c<(d+2|0)&&1=0){var +j=v;for(;;){var +g=cS(f,j),h=0;if(32<=g){var +k=g-34|0,m=0;if(58>>0){if(93>k)m=1}else if(56>>0)h=1;else +m=1;if(m){var +l=1;h=2}}else +if(11<=g){if(13===g)h=1}else if(8<=g)h=1;switch(h){case +0:var +l=4;break;case +1:var +l=2;break}b[1]=b[1]+l|0;var +z=j+1|0;if(n!==j){var +j=z;continue}break}}if(b[1]===ai(f))var +p=f;else{var +c=y(b[1]);b[1]=0;var +o=ai(f)-1|0,w=0;if(o>=0){var +i=w;for(;;){var +d=cS(f,i),e=0;if(35<=d)if(92===d)e=2;else if(cK<=d)e=1;else +e=3;else if(32<=d)if(34<=d)e=2;else +e=3;else if(14<=d)e=1;else +switch(d){case +8:t(c,b[1],92);b[1]++;t(c,b[1],98);break;case +9:t(c,b[1],92);b[1]++;t(c,b[1],116);break;case +10:t(c,b[1],92);b[1]++;t(c,b[1],110);break;case +13:t(c,b[1],92);b[1]++;t(c,b[1],eZ);break;default:e=1}switch(e){case +1:t(c,b[1],92);b[1]++;t(c,b[1],48+(d/cp|0)|0);b[1]++;t(c,b[1],48+((d/10|0)%10|0)|0);b[1]++;t(c,b[1],48+(d%10|0)|0);break;case +2:t(c,b[1],92);b[1]++;t(c,b[1],d);break;case +3:t(c,b[1],d);break}b[1]++;var +x=i+1|0;if(o!==i){var +i=x;continue}break}}var +p=c}var +r=K(p),s=q(r),u=aG(s+2|0,34);aq(r,0,u,1,s);return K(u)}function +du(a,b){var +g=bq(b),f=hF[1];switch(a[2]){case +0:var +c=102;break;case +1:var +c=cL;break;case +2:var +c=69;break;case +3:var +c=e9;break;case +4:var +c=71;break;case +5:var +c=f;break;case +6:var +c=104;break;case +7:var +c=72;break;default:var +c=70}var +d=dq(16);aS(d,37);switch(a[1]){case +0:break;case +1:aS(d,43);break;default:aS(d,32)}if(8<=a[2])aS(d,35);aS(d,46);E(d,e+g);aS(d,c);return ds(d)}function +bs(a,b){if(13>a)return b;var +h=[0,0],i=q(b)-1|0,n=0;if(i>=0){var +d=n;for(;;){if(9>=aw(b,d)+eO>>>0)h[1]++;var +r=d+1|0;if(i!==d){var +d=r;continue}break}}var +j=h[1],k=y(q(b)+((j-1|0)/3|0)|0),l=[0,0];function +e(a){aN(k,l[1],a);l[1]++;return 0}var +f=[0,((j-1|0)%3|0)+1|0],m=q(b)-1|0,o=0;if(m>=0){var +c=o;for(;;){var +g=aw(b,c);if(9>>0)e(g);else{if(0===f[1]){e(95);f[1]=3}f[1]+=-1;e(g)}var +p=c+1|0;if(m!==c){var +c=p;continue}break}}return K(k)}function +hG(a,b){switch(a){case +1:var +c=gS;break;case +2:var +c=gT;break;case +4:var +c=gV;break;case +5:var +c=gW;break;case +6:var +c=gX;break;case +7:var +c=gY;break;case +8:var +c=gZ;break;case +9:var +c=g0;break;case +10:var +c=g1;break;case +11:var +c=g2;break;case +0:case +13:var +c=gR;break;case +3:case +14:var +c=gU;break;default:var +c=g3}return bs(a,bJ(c,b))}function +hH(a,b){switch(a){case +1:var +c=hg;break;case +2:var +c=hh;break;case +4:var +c=hj;break;case +5:var +c=hk;break;case +6:var +c=hl;break;case +7:var +c=hm;break;case +8:var +c=hn;break;case +9:var +c=ho;break;case +10:var +c=hp;break;case +11:var +c=hq;break;case +0:case +13:var +c=hf;break;case +3:case +14:var +c=hi;break;default:var +c=hr}return bs(a,bJ(c,b))}function +hI(a,b){switch(a){case +1:var +c=ht;break;case +2:var +c=hu;break;case +4:var +c=hw;break;case +5:var +c=hx;break;case +6:var +c=hy;break;case +7:var +c=hz;break;case +8:var +c=hA;break;case +9:var +c=hB;break;case +10:var +c=hC;break;case +11:var +c=hD;break;case +0:case +13:var +c=hs;break;case +3:case +14:var +c=hv;break;default:var +c=hE}return bs(a,bJ(c,b))}function +hJ(a,b){switch(a){case +1:var +c=g5;break;case +2:var +c=g6;break;case +4:var +c=g8;break;case +5:var +c=g9;break;case +6:var +c=g_;break;case +7:var +c=g$;break;case +8:var +c=ha;break;case +9:var +c=hb;break;case +10:var +c=hc;break;case +11:var +c=hd;break;case +0:case +13:var +c=g4;break;case +3:case +14:var +c=g7;break;default:var +c=he}return bs(a,lc(c,b))}function +ak(d,b,c){function +j(a){switch(d[1]){case +0:var +e=45;break;case +1:var +e=43;break;default:var +e=32}return k_(c,b,e)}function +r(a){var +b=k0(c);return 3===b?c<0.?hL:hM:4<=b?hN:a}switch(d[2]){case +5:var +f=cX(du(d,b),c),e=0,w=q(f);for(;;){if(e===w)var +p=0;else{var +k=R(f,e)-46|0,l=0;if(23>>0){if(55===k)l=1}else if(21>>0)l=1;if(!l){var +e=e+1|0;continue}var +p=1}var +x=p?f:aP(f,hK);return r(x)}case +6:return j(0);case +7:var +i=aM(j(0)),g=ai(i);if(0===g)var +o=i;else{var +m=y(g),n=g-1|0,s=0;if(n>=0){var +a=s;for(;;){var +h=cS(i,a),u=25>>0?h:h-32|0;t(m,a,u);var +v=a+1|0;if(n!==a){var +a=v;continue}break}}var +o=m}return K(o);case +8:return r(j(0));default:return cX(du(d,b),c)}}function +bt(j,i,h,d,e,f,g){if(typeof +d==="number"){if(typeof +e==="number")return e?function(a,b){return m(j,[4,i,aT(a,k(f,g,b))],h)}:function(a){return m(j,[4,i,k(f,g,a)],h)};var +b=e[1];return function(a){return m(j,[4,i,aT(b,k(f,g,a))],h)}}if(0===d[0]){var +c=d[2],l=d[1];if(typeof +e==="number")return e?function(a,b){return m(j,[4,i,M(l,c,aT(a,k(f,g,b)))],h)}:function(a){return m(j,[4,i,M(l,c,k(f,g,a))],h)};var +o=e[1];return function(a){return m(j,[4,i,M(l,c,aT(o,k(f,g,a)))],h)}}var +n=d[1];if(typeof +e==="number")return e?function(a,b,c){return m(j,[4,i,M(n,a,aT(b,k(f,g,c)))],h)}:function(a,b){return m(j,[4,i,M(n,a,k(f,g,b))],h)};var +p=e[1];return function(a,b){return m(j,[4,i,M(n,a,aT(p,k(f,g,b)))],h)}}function +b1(h,f,c,d,e){if(typeof +d==="number")return function(a){return m(h,[4,f,g(e,a)],c)};if(0===d[0]){var +b=d[2],i=d[1];return function(a){return m(h,[4,f,M(i,b,g(e,a))],c)}}var +j=d[1];return function(a,b){return m(h,[4,f,M(j,a,g(e,b))],c)}}function +bc(a,b,c,d){var +f=b,e=c,h=d;for(;;){if(typeof +h==="number")return g(f,e);switch(h[0]){case +0:var +O=h[1];return function(a){return m(f,[5,e,a],O)};case +1:var +P=h[1];return function(a){var +c=0;if(40<=a)if(92===a)var +b=fY;else if(cK<=a)c=1;else +c=2;else if(32<=a)if(39<=a)var +b=fZ;else +c=2;else if(14<=a)c=1;else +switch(a){case +8:var +b=f0;break;case +9:var +b=f1;break;case +10:var +b=f2;break;case +13:var +b=f3;break;default:c=1}switch(c){case +1:var +d=y(4);t(d,0,92);t(d,1,48+(a/cp|0)|0);t(d,2,48+((a/10|0)%10|0)|0);t(d,3,48+(a%10|0)|0);var +b=K(d);break;case +2:var +g=y(1);t(g,0,a);var +b=K(g);break}var +h=q(b),i=aG(h+2|0,39);aq(b,0,i,1,h);return m(f,[4,e,K(i)],P)};case +2:var +Q=h[2],R=h[1];return b1(f,e,Q,R,function(a){return a});case +3:return b1(f,e,h[2],h[1],gQ);case +4:return bt(f,e,h[4],h[2],h[3],hG,h[1]);case +5:return bt(f,e,h[4],h[2],h[3],hH,h[1]);case +6:return bt(f,e,h[4],h[2],h[3],hI,h[1]);case +7:return bt(f,e,h[4],h[2],h[3],hJ,h[1]);case +8:var +u=h[4],w=h[3],x=h[2],s=h[1];if(typeof +x==="number"){if(typeof +w==="number")return w?function(a,b){return m(f,[4,e,ak(s,a,b)],u)}:function(a){return m(f,[4,e,ak(s,bZ(s),a)],u)};var +ag=w[1];return function(a){return m(f,[4,e,ak(s,ag,a)],u)}}if(0===x[0]){var +C=x[2],E=x[1];if(typeof +w==="number")return w?function(a,b){return m(f,[4,e,M(E,C,ak(s,a,b))],u)}:function(a){return m(f,[4,e,M(E,C,ak(s,bZ(s),a))],u)};var +ah=w[1];return function(a){return m(f,[4,e,M(E,C,ak(s,ah,a))],u)}}var +F=x[1];if(typeof +w==="number")return w?function(a,b,c){return m(f,[4,e,M(F,a,ak(s,b,c))],u)}:function(a,b){return m(f,[4,e,M(F,a,ak(s,bZ(s),b))],u)};var +ai=w[1];return function(a,b){return m(f,[4,e,M(F,a,ak(s,ai,b))],u)};case +9:return b1(f,e,h[2],h[1],fS);case +10:var +e=[7,e],h=h[1];continue;case +11:var +e=[2,e,h[1]],h=h[2];continue;case +12:var +e=[3,e,h[1]],h=h[2];continue;case +13:var +S=h[3],T=h[2],G=dq(16);b0(G,T);var +N=ds(G);return function(a){return m(f,[4,e,N],S)};case +14:var +U=h[3],V=h[2];return function(a){var +c=a[1],b=o(c,r(v(V)));if(typeof +b[2]==="number")return m(f,e,p(b[1],U));throw i(z,1)};case +15:var +W=h[1];return function(c,b){return m(f,[6,e,function(a){return k(c,a,b)}],W)};case +16:var +X=h[1];return function(a){return m(f,[6,e,a],X)};case +17:var +e=[0,e,h[1]],h=h[2];continue;case +18:var +B=h[1];if(0===B[0]){var +Y=h[2],Z=B[1][1],_=0,f=function(d,b,c){return function(a){return m(b,[1,d,[0,a]],c)}}(e,f,Y),e=_,h=Z;continue}var +$=h[2],aa=B[1][1],ab=0,f=function(d,b,c){return function(a){return m(b,[1,d,[1,a]],c)}}(e,f,$),e=ab,h=aa;continue;case +19:throw i([0,j,hP],1);case +20:var +ac=h[3],ad=[8,e,hQ];return function(a){return m(f,ad,ac)};case +21:var +ae=h[2];return function(a){return m(f,[4,e,bJ(e8,a)],ae)};case +22:var +af=h[1];return function(a){return m(f,[5,e,a],af)};case +23:var +l=h[2],A=h[1];if(typeof +A==="number")switch(A){case +0:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +1:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +2:throw i([0,j,hR],1);default:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l])}switch(A[0]){case +0:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +1:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +2:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +3:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +4:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +5:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +6:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +7:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +8:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);case +9:var +L=A[2];return a<50?cn(a+1|0,f,e,L,l):D(cn,[0,f,e,L,l]);case +10:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l]);default:return a<50?n(a+1|0,f,e,l):D(n,[0,f,e,l])}default:var +H=h[3],I=h[1],J=g(h[2],0);return a<50?cm(a+1|0,f,e,H,I,J):D(cm,[0,f,e,H,I,J])}}}function +cn(a,f,c,d,e){if(typeof +d==="number")return a<50?n(a+1|0,f,c,e):D(n,[0,f,c,e]);switch(d[0]){case +0:var +b=d[1];return function(a){return S(f,c,b,e)};case +1:var +g=d[1];return function(a){return S(f,c,g,e)};case +2:var +h=d[1];return function(a){return S(f,c,h,e)};case +3:var +k=d[1];return function(a){return S(f,c,k,e)};case +4:var +l=d[1];return function(a){return S(f,c,l,e)};case +5:var +m=d[1];return function(a){return S(f,c,m,e)};case +6:var +o=d[1];return function(a){return S(f,c,o,e)};case +7:var +p=d[1];return function(a){return S(f,c,p,e)};case +8:var +q=d[2];return function(a){return S(f,c,q,e)};case +9:var +r=d[3],s=d[2],t=x(v(d[1]),s);return function(a){return S(f,c,G(t,r),e)};case +10:var +u=d[1];return function(a,b){return S(f,c,u,e)};case +11:var +w=d[1];return function(a){return S(f,c,w,e)};case +12:var +y=d[1];return function(a){return S(f,c,y,e)};case +13:throw i([0,j,hS],1);default:throw i([0,j,hT],1)}}function +n(a,b,c,d){var +e=[8,c,hU];return a<50?bc(a+1|0,b,e,d):D(bc,[0,b,e,d])}function +cm(a,b,c,d,e,f){if(e){var +i=e[1];return function(a){return hO(b,c,d,i,g(f,a))}}var +h=[4,c,f];return a<50?bc(a+1|0,b,h,d):D(bc,[0,b,h,d])}function +m(a,b,c){return c_(bc(0,a,b,c))}function +S(a,b,c,d){return c_(cn(0,a,b,c,d))}function +hO(a,b,c,d,e){return c_(cm(0,a,b,c,d,e))}function +al(a,b){var +c=b;for(;;){if(typeof +c==="number")return 0;switch(c[0]){case +0:var +f=c[1],h=dt(c[2]);al(a,f);return a4(a,h);case +1:var +d=c[2],e=c[1];if(0===d[0]){var +i=d[1];al(a,e);a4(a,hV);var +c=i;continue}var +j=d[1];al(a,e);a4(a,hW);var +c=j;continue;case +6:var +m=c[2];al(a,c[1]);return g(m,a);case +7:al(a,c[1]);return au(a);case +8:var +n=c[2];al(a,c[1]);return ay(n);case +2:case +4:var +k=c[2];al(a,c[1]);return a4(a,k);default:var +l=c[2];al(a,c[1]);return fF(a,l)}}}function +az(a,b){var +c=b;for(;;){if(typeof +c==="number")return 0;switch(c[0]){case +0:var +k=c[1],l=dt(c[2]);az(a,k);return a8(a,l);case +1:var +e=c[2],h=c[1];if(0===e[0]){var +m=e[1];az(a,h);a8(a,hX);var +c=m;continue}var +n=e[1];az(a,h);a8(a,hY);var +c=n;continue;case +6:var +p=c[2];az(a,c[1]);return a8(a,g(p,0));case +7:var +c=c[1];continue;case +8:var +q=c[2];az(a,c[1]);return ay(q);case +2:case +4:var +o=c[2];az(a,c[1]);return a8(a,o);default:var +i=c[2];az(a,c[1]);var +d=a[2],f=a[1],j=f[1];if(f[2]<=d){dl(a,1);aN(a[1][1],a[2],i)}else +t(j,d,i);a[2]=d+1|0;return 0}}}function +dv(d,b){var +a=b[1],c=0;return m(function(a){al(d,a);return 0},c,a)}function +b2(a){return dv(aj,a)}function +W(a){var +b=a[1];return m(function(a){var +e=64,c=a5<64?a5:e,d=y(c),b=[0,[0,d,c],0,d];az(b,a);return dj(b[1][1],0,b[2])},0,b)}var +b3=[0,0];function +b5(a,b){var +c=a[1+b];if(!(1-(typeof +c==="number"?1:0)))return g(W(h1),c);if(bN(c)===bE)return g(W(hZ),c);if(bN(c)!==253)return h0;var +e=cX("%.12g",c),d=0,i=q(e);for(;;){if(i<=d)return aP(e,fV);var +f=R(e,d),h=0;if(48<=f){if(58>f)h=1}else if(45===f)h=1;if(!h)return e;var +d=d+1|0}}function +dw(a,b){if(a.length-1<=b)return h2;var +c=dw(a,b+1|0),d=b5(a,b);return k(W(h3),d,c)}function +b6(a){var +b=bF(b3);for(;;){if(b){var +s=0,x=b[2],y=b[1];try{var +m=g(y,a)}catch(f){s=1}var +t=0;if(s||!m)t=1;else +var +i=[0,m[1]];if(t){var +b=x;continue}}else +var +i=0;if(i)return i[1];if(a===bT)return h8;if(a===dd)return h9;if(a[1]===dc){var +e=a[2],p=e[3],A=e[2],B=e[1];return aI(W(b4),B,A,p,p+5|0,h_)}if(a[1]===j){var +f=a[2],q=f[3],C=f[2],D=f[1];return aI(W(b4),D,C,q,q+6|0,h$)}if(a[1]===df){var +h=a[2],r=h[3],E=h[2],F=h[1];return aI(W(b4),F,E,r,r+6|0,ia)}if(0===bN(a)){var +l=a.length-1,z=a[1][1];if(2>>0)var +u=dw(a,2),v=b5(a,1),c=k(W(h4),v,u);else +switch(l){case +0:var +c=h5;break;case +1:var +c=h6;break;default:var +w=b5(a,1),c=g(W(h7),w)}var +d=[0,z,[0,c]]}else +var +d=[0,a[1],0];var +n=d[2],o=d[1];return n?aP(o,n[1]):o}}function +b7(a,b){var +f=k1(b),i=f.length-1-1|0,r=0;if(i>=0){var +d=r;for(;;){var +c=P(f,d)[1+d],h=function(b){return function(a){return a?0===b?ib:ic:0===b?id:ie}}(d);if(0===c[0])var +j=c[5],k=c[4],l=c[3],m=c[6]?ig:ii,n=c[2],o=c[7],p=h(c[1]),e=[0,kQ(W(ih),p,o,n,m,l,k,j)];else if(c[1])var +e=0;else +var +q=h(0),e=[0,g(W(ij),q)];if(e){var +s=e[1];g(dv(a,ik),s)}var +t=d+1|0;if(i!==d){var +d=t;continue}break}}return 0}function +dx(a){for(;;){var +b=bF(b3),c=1-fd(b3,b,[0,a,b]);if(c)continue;return c}}var +im=il.slice(),ip=[0];c9(eY,function(a,b){try{try{var +h=b?ip:ft(0);try{bU(0)}catch(f){}try{var +f=b6(a);g(b2(io),f);b7(aj,h);var +c=ls(0);if(c<0){var +d=bq(c);dg(P(im,d)[1+d])}var +l=au(aj),j=l}catch(f){var +m=bo(f),n=b6(a);g(b2(ir),n);b7(aj,h);var +o=b6(m);g(b2(is),o);b7(aj,ft(0));var +j=au(aj)}var +k=j}catch(f){var +e=bo(f);if(e!==bT)throw i(e,0);var +k=dg(iq)}return k}catch(f){return 0}});function +dy(a,b,c,d){var +e=kU(7,0,[0,4]);bk(e,0,fB(a,it));bk(e,1,b);var +f=aO(c,iu)?c:ix;bk(e,2,f);var +g=aO(d,iv)?d:iw;bk(e,3,g);return e}function +iy(a){var +b=bM(a),c=bM(a),d=bM(a);return dy(b,c,d,bM(a))}dn([0,iy],function(a){return dy(iC,iB,iA,iz)});var +dz=[B,iE,fs(0)],b8=[0,dz,[0]],iD=bN(b8)===B?b8:b8[1];c9(cN,iD);function +dA(a){throw a}var +N=f,dB=null;N.String;N.RegExp;N.Object;var +dC=N.Date;N.Math;N.JSON;var +iF=undefined,iG=N.Array,iH=N.Error;dx(function(a){return a[1]===dz?[0,ad(a[2].toString())]:0});dx(function(a){return a +instanceof +iG?0:[0,ad(a.toString())]});function +b9(a,b){return a?g(b,a[1]):0}function +dD(c,b){return b9(b,function(a){return[0,g(c,a)]})}function +X(a,b){var +c=0<=a?1:0,d=c?a=b)throw i([0,j,iJ],1);var +c=b-1|0;return P(a,c)[1+c]}function +b$(a,b){var +c=b.length-1,d=aE(c+1|0,a);_(b,0,d,0,c);return d}function +dF(a,b){var +c=b.length-1,d=aE(c+1|0,a);_(b,0,d,1,c);return d}function +ca(a,b,c){if(0>a)throw i([0,j,iL],1);if(a>c.length-1)throw i([0,j,iK],1);var +e=c.length-1,d=aE(e+1|0,b);_(c,0,d,0,a);_(c,a,d,a+1|0,e-a|0);return d}function +Y(a,b,c){if(0>a)throw i([0,j,iN],1);if(a>=c.length-1)throw i([0,j,iM],1);var +d=bV(c);P(d,a)[1+a]=b;return d}function +a_(a,b){if(0>a)throw i([0,j,iQ],1);if(a>=b.length-1)throw i([0,j,iP],1);var +c=b.length-1;if(0>=c)throw i([0,j,iO],1);var +d=aE(c-1|0,P(b,0)[1]);_(b,0,d,0,a);_(b,a+1|0,d,a,c-(a+1|0)|0);return d}function +dG(a){var +b=a.length-1;if(0m)throw i([0,j,js],1);var +p=((m/2|0)*2|0)=e.length-1)throw i([0,j,iW],1);if(c===n){var +f=k,d=h(e,c);continue a}var +p=h(g,c)[2],q=h(g,c)[1],k=s(l,m(k,h(e,c)),q,p),c=c+1|0}}}return m(b,c)}function +c(q,b,c){function +k(a,b){if(0!==b[0]){var +e=b[2],l=b[1],m=l.length-1;if((m+1|0)!==e.length-1)throw i([0,j,i1],1);var +n=k(a,h(e,m)),f=m;for(;;){if(0>f)throw i([0,j,i0],1);if(0===f)return n;var +c=f-1|0;if(0>c)throw i([0,j,iZ],1);if(c>=e.length-1)throw i([0,j,iY],1);var +u=h(e,c),v=h(l,c)[2],n=k(s(q,n,h(l,c)[1],v),u),f=c}}var +r=b[1],g=[0,a],o=r.length-1-1|0;if(o>=0){var +d=o;for(;;){var +p=r[1+d];g[1]=s(q,g[1],p[1],p[2]);var +t=d-1|0;if(0!==d){var +d=t;continue}break}}return g[1]}return k(b,c)}function +R(a){var +b=0;return c(function(a,b,c){return[0,[0,b,c],a]},b,a)}function +S(a){var +b=0;return c(function(a,b,c){return[0,b,a]},b,a)}function +e(a,b){var +h=N[1],d=b.length-1;if(0===d)return[0,d,0];if(1===d){var +l=k(h,a,P(b,0)[1][1]);return 0=o)return[0,n,0===o?1:0];var +p=k(h,a,P(b,g)[1+g][1]);if(0<=p)return 0===p?[0,g,1]:[0,d,0];var +f=n,e=g;for(;;){if((f+1|0)===e)return[0,e,0];var +c=f+((e-f|0)/2|0)|0;if(f>=c)throw i([0,j,iU],1);if(c>=e)throw i([0,j,iT],1);var +m=k(h,a,P(b,c)[1+c][1]);if(0===m)return[0,c,1];if(0<=m){var +f=c;continue}var +e=c}}function +T(a,b){var +c=b;for(;;){if(0===c[0]){var +d=c[1],f=e(a,d),k=f[1];return f[2]?[0,h(d,k)[2]]:0}var +g=c[1],l=c[2],i=e(a,g),j=i[1];if(i[2])return[0,h(g,j)[2]];var +c=h(l,j)}}function +l(a,b,c){if(0>b)throw i([0,j,i4],1);if(b>c)throw i([0,j,i3],1);if(c<=a.length-1)return bW(a,b,c-b|0);throw i([0,j,i2],1)}function +q(a,b,c,d,e){if(0>d)throw i([0,j,i8],1);if(d>b)throw i([0,j,i7],1);if(b>e)throw i([0,j,i6],1);if(e>a.length-1)throw i([0,j,i5],1);var +f=aE((e-d|0)+1|0,c);_(a,d,f,0,b-d|0);_(a,b,f,(b-d|0)+1|0,e-b|0);return f}function +F(a,b,c,d,e,f){if(b>=f)throw i([0,j,i9],1);var +g=q(a,b,c,e,f);aA(g,(b-e|0)+1|0,d);return g}function +u(a,b,c){var +f=c.length-1,j=e(a,c),g=j[1];if(j[2])return[0,[0,Y(g,[0,a,b],c)]];if(f=f.length-1)throw i([0,j,jk],1);var +g=A(a,c,e,d),k=g[2],l=g[1],h=a_(a,f);aA(h,a,[0,l]);return[0,[1,k,h],b,e.length-1<=n?1:0]}function +I(a,b,c,d,e,f,g,h){if((a+1|0)>=h.length-1)throw i([0,j,jl],1);var +l=A(a,c,g,e),o=l[2],p=l[1],m=a_(a,h),k=d.length-1,q=g.length-1<=n?1:0,r=0===k?bV(f):0===f.length-1?cP(d,0,k):kR(d,f);aA(m,a,[1,p,r]);return[0,[1,o,m],b,q]}function +f(a,h,c,d,e,f,g){function +p(a,b){return h?x(b):x(a)}if(0===c[0]){var +b=c[1];if(0===d[0]){var +k=d[1];if(!p(b,k))return H(a,e,b,k,f,g);var +l=z(h,a,b,f,k),s=l[2];return[0,[1,s,y(a,[0,l[1]],[0,l[3]],g)],e,0]}}else{var +q=c[2],m=c[1];if(0!==d[0]){var +n=d[1],t=d[2];if(!p(m,n))return I(a,e,m,q,n,d[2],f,g);var +o=z(h,a,m,f,n),u=o[3],v=o[2],w=o[1],r=G(h,q,t);return[0,[1,v,y(a,[1,w,r[1]],[1,u,r[2]],g)],e,0]}}throw i([0,j,jm],1)}function +o(a,b,c,d,e){if(!c[3])return[0,[1,d,Y(a,c[1],e)],b,0];if(a=b.length-1)throw i([0,j,jn],1);var +g=b_(b);return[0,[0,cb(b)],g,b.length-1<=n?1:0]}var +c=a[2],e=a[1],d=e.length-1;if((d+1|0)!==c.length-1)throw i([0,j,jo],1);var +f=r(h(c,d));return o(d,f[2],f,e,c)}function +B(a,b){if(0===b[0]){var +d=b[1],i=e(a,d),j=i[1];if(!i[2])return 0;var +m=h(d,j);return[0,[0,[0,a_(j,d)],m,d.length-1<=n?1:0]]}var +f=b[2],g=b[1],k=e(a,g),c=k[1];if(k[2]){var +l=r(h(f,c)),p=h(g,c);return[0,o(c,p,l,Y(c,l[2],g),f)]}var +q=B(a,h(f,c));return dD(function(a){return o(c,a[2],a,g,f)},q)}function +V(a,b){var +d=B(a,b);if(!d)return b;var +e=d[1],c=e[1];if(1===c[0]){var +f=c[2];if(0===c[1].length-1)return h(f,0)}return e[1]}function +C(a,b,c){if(0===c[0]){var +i=c[1],p=e(a,i),l=p[1];if(!p[2]){var +s=g(b,0);return s?[0,u(a,s[1],i)]:[0,[0,c]]}var +q=g(b,[0,h(i,l)[2]]);if(q)return[0,[0,[0,Y(l,[0,a,q[1]],i)]]];var +z=a_(l,i);return[1,[0,[0,z],h(i,l),n===i.length-1?1:0]]}var +j=c[2],f=c[1],t=e(a,f),d=t[1];if(t[2]){var +w=g(b,[0,h(f,d)[2]]);if(w)return[0,[0,[1,Y(d,[0,a,w[1]],f),j]]];var +x=r(h(j,d)),A=h(f,d);return[1,o(d,A,x,Y(d,x[2],f),j)]}var +m=C(a,b,h(j,d));if(0===m[0]){var +k=m[1];return 0===k[0]?[0,[0,[1,f,Y(d,k[1],j)]]]:[0,v(d,k[1],k[2],k[3],f,j)]}var +y=m[1];return[1,o(d,y[2],y,f,j)]}function +W(a,b,c){var +e=C(a,b,c);if(0===e[0]){var +d=e[1];return 0===d[0]?d[1]:[1,[0,d[2]],[0,d[1],d[3]]]}var +g=e[1],f=g[1];if(1===f[0]){var +i=f[2];if(0===f[1].length-1)return h(i,0)}return g[1]}function +b(a){var +b=a[1],c=b[1];return 0===c[0]?b[2]=m.length-1)throw i([0,j,jq],1);var +n=[0,[0,m,l,f+1|0],a[2]];return d(h(l,f+1|0),n)}function +M(a){return d(a,0)}return[0,m,p,t,n,O,D,E,Q,c,R,S,e,T,l,q,F,u,v,w,U,x,y,z,G,A,H,I,f,o,r,B,V,C,W,b,J,d,K,L,M,function(a){return[0,b,J,L,M]}]}function +dH(a){var +d=cc(a,[0,aQ]),c=d[5],q=d[6],r=d[7];function +m(e,b,c){function +a(a,b,c){return k(e,a,b)}return s(d[8],a,b,c)}function +t(e,b,c){function +a(a,b,c){return k(e,a,b)}return s(d[9],a,b,c)}function +u(a,b){return k(d[13],a,b)?1:0}function +e(a,b){return s(d[20],a,0,b)}function +f(a,b){return k(d[32],a,b)}function +v(a){return g(d[11],a)}var +b=g(d[41],[0]),n=b[1];function +o(a){return g(b[2],a)[1]}var +p=b[3],w=b[4];function +h(a,b,c,d){if(b>c)throw i([0,j,jt],1);var +e=b,f=d;for(;;){if(e===c)return f;var +g=k(a,e,f),e=e+1|0,f=g}}function +l(a,b,c,d){if(b>c)throw i([0,j,ju],1);var +f=c,e=d;for(;;){if(f===b)return e;var +g=f-1|0,f=g,e=k(a,g,e)}}function +x(a,b,c){return h(e,a,b,c)}function +y(a,b,c){return l(e,a,b,c)}function +z(a,b,c){return h(f,a,b,c)}function +A(a,b,c){return l(f,a,b,c)}function +B(a,b,c){var +f=[0,a,1],d=m(function(a,b){var +c=a[2],d=a[1],e=c?b===d?1:0:c;return[0,d+1|0,e]},f,c),e=d[1]===b?1:0,g=d[2],h=e?g:e;return h}return[0,d,c,q,r,m,t,u,e,f,v,h,l,x,y,z,A,B,[0,b,n,o,p,w,function(a){var +b=a,c=0;for(;;){if(!g(n,b))return a6(c);var +d=[0,o(b),c],b=g(p,b),c=d}}]]}dH([0,3]);dH([0,4]);cc([0,3],[0,aQ]);function +bu(a){var +b=cc(iV,a);return[0,b[5],b[6],b[8],b[9],b[10],b[13],b[7],b[20],b[32],b[34],b[40],b[35],b[36],b[39],b[41]]}function +jv(a){return 0}function +cd(a,b,c){function +d(a){return k(b,a,c)}return b9(g(a,c),d)}function +ce(a){return typeof +a==="string"?[0,ad(a)]:0}function +aU(a,b,c){function +e(a){return g(b,a)}var +d=c[u(a)],f=d===iF?0:[0,d];return b9(f,e)}function +aV(a){return N.console.log(u(a))}function +cf(a,b,c){return c.addEventListener(u(a),b)}function +dI(a,b,c){return c.removeEventListener(u(a),b)}function +bv(a,b){if(b===dB)throw i([0,j,jw],1);return b.appendChild(a)}function +dJ(a){for(;;){var +b=a.firstChild,c=b==dB?0:[0,b];if(!c)return 0;a.removeChild(c[1])}}function +aW(a){return N}function +dK(a){var +d=bu(a),l=[0,[0],d[7]];function +f(c,b){var +a=k(d[6],c,b[2]);return dD(function(a){if(a>=b[1].length-1)throw i([0,j,jz],1);var +d=h(b[1],a),e=d[2];if(fq(d[1],c))return e;throw i([0,j,jy],1)},a)}function +e(a,b,c){if(k(d[6],a,c[2]))return c;var +e=s(d[8],a,c[1].length-1,c[2]);return[0,b$([0,a,b],c[1]),e]}function +c(a,b,c){var +f=k(d[6],a,c[2]);if(!f)return e(a,g(b,0),c);var +l=f[1],m=h(c[1],l),n=m[2];if(!fq(m[1],a))throw i([0,j,jA],1);var +o=c[2],p=c[1];return[0,Y(l,[0,a,g(b,[0,n])],p),o]}function +m(a){var +c=l,b=a;for(;;){if(!b)return c;var +d=b[1],f=b[2],c=e(d[1],d[2],c),b=f}}function +n(d,b,c){var +a=c[1];return bX(function(a,b){return s(d,a,b[1],b[2])},b,a)}function +b(a,b){var +f=b[1],d=f.length-1-1|0,g=0;if(d>=0){var +c=g;for(;;){var +e=f[1+c];k(a,e[1],e[2]);var +h=c+1|0;if(d!==c){var +c=h;continue}break}}return 0}return[0,d,l,f,e,c,m,n,b,function(i,h,c,d,e){b(function(a,b){return f(a,d)?0:g(c,a)},e);return b(function(a,b){var +c=f(a,e);return c?b===c[1]?0:k(h,a,b):k(i,a,b)},d)}]}dK([0,aR]);function +aX(a){var +b=dK(a);return[0,b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9]]}new +dC(0.);function +bw(a){var +b=[0,a];return[0,b,function(a){return g(b[1],a)}]}function +dM(a,b){b[1][1]=a;return 0}function +dN(a){var +h=bu(a),b=aX(a);function +c(a){return[0,h[7]]}function +d(f,e,c,d){function +a(a,b){if(0!==k(h[6],a,d[1]))throw i([0,j,jD],1);var +c=bw(g(f,b)),l=k(e,a,c[2]);d[1]=s(h[8],a,[0,c,l],d[1]);return 0}return k(b[7],a,c)}return[0,h,b,c,d,function(l,m,c,d,e,f){function +a(b){var +a=f[1];function +d(a){if(!a)throw i([0,j,jE],1);var +d=a[1];s(c,b,d[1][2],d[2]);return 0}f[1]=s(h[10],b,d,a);return 0}function +n(a,b){var +c=k(h[6],a,f[1]);if(!c)throw i([0,j,jF],1);var +d=c[1][1];return dM(g(l,b),d)}function +o(c,b){var +a=f[1];function +d(a){if(a)throw i([0,j,jG],1);var +d=bw(g(l,b));return[0,[0,d,k(m,c,d[2])]]}f[1]=s(h[10],c,d,a);return 0}return aI(b[8],o,n,a,d,e)}]}function +dO(f,b,c){var +a=a6(b);return a7(function(a){var +d=a[3],e=a[2][1];if(a[1][1])c.stopPropagation(0);if(e)c.preventDefault(0);var +b=g(d,c);return b?g(f,b[1]):(aV(jH),N.console.log(c))},a)}var +cg=dN([0,aR]);aX([0,aR]);var +ch=cg[3];function +dP(a,b,c){return cf(b,c,a)}function +dQ(f,e,c,d){function +a(a,b){return dP(f,a,b)}function +b(a,b){return dO(e,a,b)}return eb(cg[4],b,a,c,d)}function +dR(f,g,c,d,e){function +a(a,b,c){return dI(a,b,f)}function +b(a,b){return dP(f,a,b)}function +h(a,b){return dO(g,a,b)}return ec(cg[5],h,b,a,c,d,e)}var +ci=dN([0,aQ]);aX([0,aQ]);var +jI=ci[3];function +dS(d,b,c){var +a=a6(b);return a7(function(a){return g(d,g(a,c))},a)}function +dT(a,b){return N.setInterval(function(a){return g(b,new +dC())},a)}function +jJ(a,b,c){return N.clearInterval(c)}function +dU(a){return aW(0)}function +dV(a){return cf(jK,a,dU(0))}function +jM(c){function +b(a){var +b=[0,a];if(!fM(c,"A")&&!fM(c,"a")){0===b[0];return function(a){return[0,b]}}return jv}function +d(a){return aU(jN,ce,a)}function +e(a){return aU(jO,d,a)}return function(a){return cd(e,b,a)}}function +jQ(a){return aU(jP,ce,a)}function +jS(a){return aU(jR,jQ,a)}function +cj(a,b,c){var +d=cd(jS,jM,c);if(!d)return 0;var +e=d[1];c.preventDefault(0);return g(a,g(b,e))}function +dW(a,b,c,d){return[3,a,[0,b,c,d]]}var +A=aX([0,aR]);function +am(a){return[0,[0,a],0]}function +aH(a,b,c){var +e=0,d=[0,A[1],A[1],A[1],A[1]];return[0,[1,a,di(function(a,b){switch(b[0]){case +0:var +d=a[4],e=a[3],f=a[2];return[0,s(A[3],b[1],b[2],a[1]),f,e,d];case +1:var +g=a[4],h=a[3],i=s(A[3],b[1],b[2],a[2]);return[0,a[1],i,h,g];case +2:var +j=a[4],k=s(A[3],b[1],b[2],a[3]);return[0,a[1],a[2],k,j];default:var +c=b[2],l=b[1],m=a[4],n=function(a){return a?[0,c,a[1]]:[0,c,0]},o=s(A[4],l,n,m);return[0,a[1],a[2],a[3],o]}},d,b),c],e]}function +dX(a,b,c){var +d=b[1],e=g(a[9],c);k(A[7],e,d);var +f=b[3],h=g(a[10],c);k(A[7],h,f);var +i=b[2],j=g(a[11],c);k(A[7],j,i);return k(a[15],c,b[4])}function +bx(c,b){function +e(a){var +b=a[1];switch(b[0]){case +0:var +e=b[1];return[0,[0,e],g(c[1],e)];case +1:var +f=b[2],h=b[1],l=d(b[3]),t=l[1],m=k(c[2],h,l[2]);dX(c,f,m);return[0,[1,h,f,t],m];case +2:var +n=b[3],o=b[2],p=b[1],q=d(b[4]),u=q[1],r=s(c[3],p,o,q[2]);dX(c,n,r);return[0,[2,p,o,n,u],r];default:throw i([0,j,jU],1)}}function +d(a){if(!a)return jV;var +f=a[2],b=e(a[1]),g=b[2],c=d(f);return[0,[0,b,c[1]],[0,g,c[2]]]}return e(b)}function +ck(a,b,c,d){var +e=g(a[9],b),i=d[1],j=c[1],k=g(a[12],b);aI(A[8],e,e,k,j,i);var +f=g(a[10],b),l=d[3],m=c[3],n=g(a[13],b);aI(A[8],f,f,n,m,l);var +h=g(a[11],b),o=d[2],p=c[2],q=g(a[14],b);aI(A[8],h,h,q,p,o);return s(a[16],b,c[4],d[4])}function +cl(d,b,c){var +a=b[1];switch(a[0]){case +0:var +o=c[1];if(0===o[0]){var +p=c[2],l=a[1];return a2(l,o[1])?[0,c,0]:(k(d[8],p,l),[0,[0,[0,l],p],0])}break;case +1:var +i=c[1];if(1===i[0]){var +m=c[2],q=i[1],r=a[2],y=i[3],z=i[2],B=a[3];if(a2(a[1],q)){ck(d,m,r,z);return[0,[0,[1,q,r,a6(dY(d,m,B,y,0))],m],0]}}break;case +2:var +e=c[1];if(2===e[0]){var +n=c[2],t=e[2],u=e[1],v=a[3],C=e[4],D=e[3],E=a[4],F=a[1];if(a2(a[2],t)&&a2(F,u)){ck(d,n,v,D);return[0,[0,[2,u,t,v,a6(dY(d,n,E,C,0))],n],0]}}break;default:var +j=c[1];if(3===j[0]){var +f=c[2],w=j[1],x=a[2],G=j[3],H=j[2],I=a[3];if(a2(a[1],w)){ck(d,f,x,H);g(d[7],f);var +h=[0,A[1]],J=function(a,b){var +c=k(A[2],a,G);if(c){var +e=cl(d,b,c[1])[1];k(d[4],e[2],f);h[1]=s(A[3],a,e,h[1]);return 0}var +g=bx(d,b);k(d[4],g[2],f);h[1]=s(A[3],a,g,h[1]);return 0};k(A[7],J,I);return[0,[0,[3,w,x,h[1]],f],0]}}}return[0,bx(d,b),1]}function +dY(a,b,c,d,e){var +g=c,f=d,h=e;for(;;){if(!g){if(!f)return h;var +t=f[2];k(a[5],f[1][2],b);var +g=0,f=t;continue}var +i=g[2],j=g[1];if(!f){var +o=bx(a,j);k(a[4],o[2],b);var +g=i,f=0,h=[0,o,h];continue}var +l=f[1],p=f[2],q=l[2],m=cl(a,j,l),n=m[1],r=n[2];if(m[2])s(a[6],q,r,b);var +g=i,f=p,h=[0,n,h]}}function +a$(a,b,c){try{var +f=g(b,0);return f}catch(f){var +o=bo(f);if(o[1]!==j){g(c,0);aV(a);var +w=lo(o);if(w){var +D=w[1];aV(jZ);return g(dA,D)}aV(j0);throw i(o,0)}var +p=o[2],v=[0,jY,[0,p[1],[0,jX,[0,e+p[2],[0,jW,[0,e+p[3],0]]]]]],k=0,h=v,B=0;for(;;){if(h){var +r=h[1];if(h[2]){var +s=(q(r)|0)+k|0,x=h[2],z=k<=s?s:ay(f7),k=z,h=x;continue}var +t=q(r)+k|0}else +var +t=k;var +n=y(t),m=B,l=v;for(;;){if(l){var +d=l[1];if(l[2]){var +A=l[2];aq(d,0,n,m,q(d));aq(e,0,n,m+q(d)|0,0);var +m=m+q(d)|0|0,l=A;continue}aq(d,0,n,m,q(d))}var +C=K(n);g(c,0);aV(a);aV(C);return g(dA,new +iH(u(a)))}}}}function +dZ(a,b,c){return k(a,b,function(a){if(0!==a[0])throw i([0,j,j1],1);var +d=a[1];function +b(a){return 0}return a$(j2,function(a){return g(c,d)},b)})}bu([0,aR]);bu([0,aQ]);var +d0=aX([0,aQ]),d1=aX([0,aR]),j3=0,j4=[0,d1[1],d0[1],0,0];function +d2(a){function +c(a,b){if(typeof +b==="number")return a;switch(b[0]){case +0:var +d=b[2],f=b[1],g=a[4],h=a[3],i=a[2],j=a[1],k=function(a){return a?[0,d,a[1]]:[0,d,0]};return[0,s(d1[4],f,k,j),i,h,g];case +1:var +e=b[2],l=b[1],m=a[4],n=a[3],o=a[2],p=function(a){return a?[0,e,a[1]]:[0,e,0]},q=s(d0[4],l,p,o);return[0,a[1],q,n,m];case +2:var +r=b[1],t=a[4],u=a[3]||[0,r];return[0,a[1],a[2],u,t];case +3:var +v=b[1],w=a[4]||[0,v];return[0,a[1],a[2],a[3],w];default:return di(c,a,b[1])}}return c(j4,a)}function +d3(d,b,c){function +e(a){if(typeof +a==="number")return 0;switch(a[0]){case +0:return dZ(a[1],d,b);case +1:var +c=a[1];return dZ(c,d,function(a){return 0});default:return a7(e,a[1])}}return e(c)}function +ba(a){return aW(0).document}function +d4(e){function +f(a){var +b=a[2];if(b)return b[1];throw i([0,j,j5],1)}function +d(a){var +b=a[2];if(b)return b[1][1];throw i([0,j,j6],1)}function +a(a,b,c){var +d=f(a);return dR(d[1],e,b,c,d[2])}function +b(a,b){var +c=f(a);return dQ(c[1],e,b,c[2])}function +c(a,b){return delete +d(a)[u(b)]}function +h(a,b){return d(a).removeAttribute(u(b))}function +k(a,b){return d(a).style.removeProperty(u(b))}function +l(a,b,c){return d(a)[u(b)]=c}function +m(a,b,c){return d(a).setAttribute(u(b),u(c))}function +n(a,b,c){return d(a).style.setProperty(u(b),u(c))}function +o(a,b){return a[1].nodeValue=u(b)}function +p(a){return dJ(a[1])}function +q(a,b,c){return c[1].replaceChild(b[1],a[1])}function +r(a,b){return b[1].removeChild(a[1])}function +s(a,b){return bv(a[1],b[1])}function +t(a,b,c){var +d=ba(0).createElementNS(u(a),u(b));a7(function(a){return bv(a[1],d)},c);return[0,d,[0,[0,d,g(ch,0)]]]}function +v(a,b){var +c=ba(0).createElement(u(a));a7(function(a){return bv(a[1],c)},b);return[0,c,[0,[0,c,g(ch,0)]]]}return[0,function(a){return[0,ba(0).createTextNode(u(a)),0]},v,t,s,r,q,p,o,n,m,l,k,h,c,b,a]}function +bb(c,b){function +d(a){var +b=1-(a===c[1]?1:0),d=c[2],e=d||b;c[2]=e;return b?(c[1]=a,d6(c)):b}var +a=c[6];switch(a[0]){case +0:return d(k(a[3],c[1],b));case +1:var +g=a[4],e=k(a[3],c[1],b),h=e[2];d(e[1]);return d3(g,function(a){return d5(c,a)},h);default:var +i=a[4],f=k(a[3],c[1],b),j=f[2];d(f[1]);return d3(i,function(a){return d5(c,a)},j)}}function +d5(c,b){N.setTimeout(function(a){return bb(c,b)},0);return 0}function +d6(b){function +a(a){var +w=b[4],x=b[6][2];if(!w){var +M=g(x,b[1]),m=function(a){return bb(b,a)},f=d2(M),q=g(ch,0),D=f[1];dQ(aW(0),m,D,q);var +r=g(jI,0),E=f[2],y=function(a,b){return dS(m,a,b)};eb(ci[4],y,dT,E,r);var +l=[0,0],s=f[4];if(s){var +A=s[1],n=bw(function(a){return cj(m,A,a)});dV(n[2]);l[1]=[0,n]}else +l[1]=0;b[4]=[0,[0,f,q,r,l]];return 0}var +c=w[1];if(!b[2])return 0;var +L=g(x,b[1]);function +k(a){return bb(b,a)}var +h=d2(L),F=c[2],G=c[1][1],H=h[1];dR(aW(0),k,H,G,F);var +I=c[3],J=c[1][2],K=h[2];function +z(a,b){return dS(k,a,b)}ec(ci[5],z,dT,jJ,K,J,I);var +t=c[4],u=c[1][4],v=h[4],d=t[1],e=0;if(v){var +o=v[1];if(u){if(d){var +B=d[1];dM(function(a){return cj(k,o,a)},B);e=1}}else if(!d){var +p=bw(function(a){return cj(k,o,a)});dV(p[2]);t[1]=[0,p];e=1}}else +if(u){if(d){var +C=d[1][2];dI(jL,C,dU(0));e=1}}else if(!d)e=1;if(!e)throw i([0,j,jT],1);b[4]=[0,[0,h,c[2],c[3],c[4]]];return 0}return a$(j7,a,function(a){return 0})}function +d7(a,b){var +c=a[5];dJ(c);return bv(b[2][1],c)}function +d8(b){function +c(a){function +c(a){var +b=a[6];switch(b[0]){case +0:var +e=b[1],f=function(a){return 0},c=[0,g(e,a[1]),f];break;case +1:var +h=b[1],i=function(a){return 0},c=[0,g(h,a[1]),i];break;default:var +d=g(b[1],a[1]),j=d[2],k=d[1],c=[0,k,function(a){return ba(0).title=u(j)}]}var +l=c[1];c[2](0);return l}var +d=b[3];if(!d){var +m=c(b),j=bx(d4(function(a){return bb(b,a)}),m);b[3]=[0,j];return d7(b,j)}var +e=b[2],k=d[1];if(e){var +l=c(b),f=cl(d4(function(a){return bb(b,a)}),l,k),h=f[1];if(f[2])d7(b,h);b[3]=[0,h];var +i=0}else +var +i=e;return i}function +a(a){b[2]=0;return 0}a$(j8,c,a);a(0);if(b[2])throw i([0,j,j9],1);return 0}function +d9(a){return aW(0).requestAnimationFrame(a)}function +d_(c,b){d8(c);if(c[2])throw i([0,j,j_],1);return d9(function(a){return d_(c,a)})}function +d$(a,b,c){function +d(a){return 0}function +e(a){return g(b,c)}return a$(aP(ka,aP(a,j$)),e,d)}function +by(a,b){return aH(km,a,b)}function +ea(a,b){return aH(kp,a,b)}function +ks(a){var +h=a[1],c=g(W(kt),h),k=a[2],b=g(W(ku),k),l=[0,am(kv),0],m=[0,am(c),l],n=[0,aH(ky,[0,[2,kx,c],[0,[2,kw,b],0]],0),m],o=ea(0,[0,am(kz),n]),p=[0,am(kA),0],q=[0,am(b),p],r=0,s=0;function +d(a){try{var +c=[0,k6(a)]}catch(f){var +b=bo(f);if(b[1]===bS)throw i([0,j,kq],1);throw i(b,0)}return function(a){return[0,c]}}function +e(a){return cd(ce,d,a)}function +f(a){return aU(kh,e,a)}var +t=[0,aH(ko,[0,[2,kJ,kI],[0,[2,kH,kG],[0,[2,kF,kE],[0,[2,kD,kC],[0,[2,kB,b],[0,dW(kj,jB,dL,function(a){return aU(ki,f,a)}),s]]]]]],r),q],u=ea(0,[0,am(kK),t]),v=0,w=0,x=[0,am(kL),0],y=0,z=1,A=[0,by(0,[0,aH(kn,[0,dW(kg,jC,dL,function(a){return[0,z]}),y],x),w]),v],B=[0,by(0,[0,u,0]),A],C=[0,by(0,[0,o,0]),B],D=[0,by(0,[0,am(kM),0]),C];return aH(kl,0,[0,aH(kk,0,[0,am(kN),0]),D])}function +kO(a){return a[2]<=a[1]?j3:[1,cp,function(a){return 0}]}var +ke=aW(0);cf(kf,function(a){function +d(c,b){function +a(a){return 0}return a$(kd,function(a){if(typeof +b!=="number")return[aB,c[1],b[1]];if(b)return[aB,0.,c[2]];var +d=c[1]+0.1,e=c[2],f=c[2],g=lq(e,d)?e:d;return[aB,g,f]},a)}function +e(a){return d$(kc,kO,a)}var +f=[0,function(a){return d$(kb,ks,a)},e,d],c=ba(0);if(c.body===null)throw i([0,j,jx],1);var +b=[0,kr,0,0,0,c.body,f];d6(b);d8(b);return d9(function(a){return d_(b,a)})},ke);bU(0);return}(globalThis)); diff --git a/webapp/webapp.js b/webapp/webapp.js new file mode 100644 index 00000000..25f245d4 --- /dev/null +++ b/webapp/webapp.js @@ -0,0 +1,2675 @@ +// Generated by js_of_ocaml +//# buildInfo:effects=false, kind=exe, use-js-string=true, version=5.1.1 +(function(a){typeof +globalThis!=="object"&&(this?b():(a.defineProperty(a.prototype,"_T_",{configurable:true,get:b}),_T_));function +b(){var +b=this||self;b.globalThis=b;delete +a.prototype._T_}}(Object));(function(n){"use strict";var +c$="age",fK="first_name",b2="src/browser/browser.ml",dl="rmdir",az=1000,fI="?",fJ=1026,ae=0x80,fH="Input",fV=12520,e="",dt="ENOENT",ad=" ",b5=": No such file or directory",b6="_bigarr02",gj="src/js/dom.ml",fr="%li",fG=", ",dk=": Not a directory",fq="/static/",gh="src/browser/random.ml",gi="closedir",ak="/",B="camlinternalFormat.ml",fp="%ni",b1="font-size",fF=0xe0,ar=0xffffff,c_=1073741823,fo=0xf0,fE="John",ds="20px",gg="%i",fU=255,fn="@[",de="Failure",fl="Counter",fm="([^/]+)",fk=0xdfff,fD=256,dj="ENOTDIR",c9="^",fj=205,fh="%Li",fi="Not_found",b4=254,c8="EBADF",dd=0xf,gf="EEXIST",b7=252,aA=0xff,fT=0x7ff0,c7=1255,di="e",fC=-97,fg="GET",fS=-48,dc="src/browser/dictionary.ml",aZ=".",fR=-819565531,ge=103,gd="loadend",c6="password",ff="Out_of_memory",fB=512,_="src/std/array.ml",gc="%u",fe="infinity",c5="fs",dr="jsError",gb="Assert_failure",b3="Unix.Unix_error",ga="div",f$="ENOTEMPTY",fd="Sys_blocked_io",by="int_of_string",dh="click",fA=": closedir failed",bx="type",c4=" : flags Open_rdonly and Open_wronly are not compatible",be="+",f_="resize",fQ=0xdc00,fz="Pervasives.do_at_exit",f9=65536,E=248,fc=": ",aj=0x8000,aQ=0x3f,a1="-",f8=1027,c3="Fatal error: exception ",a0='"',db="mkdir",bz=128,dq="index out of bounds",fy="Invalid_argument",fP="Match_failure",fx="p",f6="Doe",f7="_",c2=" : flags Open_text and Open_binary are not compatible",fv="Division_by_zero",fw="fd ",dp=101,fu=": file descriptor already closed",al=0xffff,f5=", characters ",f4=" : is a directory",fO=120,c1="%d",dn=127,f3=114,ft="solid",fN=-264964567,P="0",da=" : file already exists",dg="compare: functional value",f2="value",fb=100,a="src/std/btree.ml",bA=1024,f1="text",fs="Sys_error",b0="target",fa=0x800,f0="Printexc.handle_uncaught_exception",fM="@{",e$=250,bB="src/browser/handler.ml",e_="input",fZ="End_of_file",dm="nan",fY="Stack_overflow",df="src/browser/task.ml",fX="0x",e9=200,fL="Undefined_recursive_module",fW="Fatal error: exception %s\n";function +pr(a,b){var +g=a.length,h=b.length,f=g+h-1,d=new +Array(f);d[0]=0;var +c=1,e=1;for(;c=1;f--)c[d+f]=a[b+f];return 0}function +du(a,b,c){var +d=new +Array(c+1);d[0]=0;for(var +e=1,f=b+1;e<=c;e++,f++)d[e]=a[f];return d}function +gl(a,b,c){if(a[1]===b){a[1]=c;return 1}return 0}function +pt(a,b){var +c=a[1];a[1]+=b;return c}function +b9(a){return a[1]}function +qm(a){var +b=n.process;if(b&&b.env&&b.env[a]!=undefined)return b.env[a];if(n.jsoo_static_env&&n.jsoo_static_env[a])return n.jsoo_static_env[a]}var +dN=0;(function(){var +c=qm("OCAMLRUNPARAM");if(c!==undefined){var +b=c.split(",");for(var +a=0;aa.hi)return 1;if(this.hia.mi)return 1;if(this.mia.lo)return 1;if(this.loc)return 1;if(ba.mi)return 1;if(this.mia.lo)return 1;if(this.lo>24),c=-this.hi+(b>>24);return new +d(a,b,c)};d.prototype.add=function(a){var +b=this.lo+a.lo,c=this.mi+a.mi+(b>>24),e=this.hi+a.hi+(c>>24);return new +d(b,c,e)};d.prototype.sub=function(a){var +b=this.lo-a.lo,c=this.mi-a.mi+(b>>24),e=this.hi-a.hi+(c>>24);return new +d(b,c,e)};d.prototype.mul=function(a){var +b=this.lo*a.lo,c=(b*gJ|0)+this.mi*a.lo+this.lo*a.mi,e=(c*gJ|0)+this.hi*a.lo+this.mi*a.mi+this.lo*a.hi;return new +d(b,c,e)};d.prototype.isZero=function(){return(this.lo|this.mi|this.hi)==0};d.prototype.isNeg=function(){return this.hi<<16<0};d.prototype.and=function(a){return new +d(this.lo&a.lo,this.mi&a.mi,this.hi&a.hi)};d.prototype.or=function(a){return new +d(this.lo|a.lo,this.mi|a.mi,this.hi|a.hi)};d.prototype.xor=function(a){return new +d(this.lo^a.lo,this.mi^a.mi,this.hi^a.hi)};d.prototype.shift_left=function(a){a=a&63;if(a==0)return this;if(a<24)return new +d(this.lo<>24-a,this.hi<>24-a);if(a<48)return new +d(0,this.lo<>48-a);return new +d(0,0,this.lo<>a|this.mi<<24-a,this.mi>>a|this.hi<<24-a,this.hi>>a);if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi>>a-24,0);return new +d(this.hi>>a-48,0,0)};d.prototype.shift_right=function(a){a=a&63;if(a==0)return this;var +c=this.hi<<16>>16;if(a<24)return new +d(this.lo>>a|this.mi<<24-a,this.mi>>a|c<<24-a,this.hi<<16>>a>>>16);var +b=this.hi<<16>>31;if(a<48)return new +d(this.mi>>a-24|this.hi<<48-a,this.hi<<16>>a-24>>16,b&al);return new +d(this.hi<<16>>a-32,b,b)};d.prototype.lsl1=function(){this.hi=this.hi<<1|this.mi>>23;this.mi=(this.mi<<1|this.lo>>23)&ar;this.lo=this.lo<<1&ar};d.prototype.lsr1=function(){this.lo=(this.lo>>>1|this.mi<<23)&ar;this.mi=(this.mi>>>1|this.hi<<23)&ar;this.hi=this.hi>>>1};d.prototype.udivmod=function(a){var +e=0,c=this.copy(),b=a.copy(),f=new +d(0,0,0);while(c.ucompare(b)>0){e++;b.lsl1()}while(e>=0){e--;f.lsl1();if(c.ucompare(b)>=0){f.lo++;c=c.sub(b)}b.lsr1()}return{quotient:f,modulus:c}};d.prototype.div=function(a){var +b=this;if(a.isZero())dM();var +d=b.hi^a.hi;if(b.hi&aj)b=b.neg();if(a.hi&aj)a=a.neg();var +c=b.udivmod(a).quotient;if(d&aj)c=c.neg();return c};d.prototype.mod=function(a){var +b=this;if(a.isZero())dM();var +d=b.hi;if(b.hi&aj)b=b.neg();if(a.hi&aj)a=a.neg();var +c=b.udivmod(a).modulus;if(d&aj)c=c.neg();return c};d.prototype.toInt=function(){return this.lo|this.mi<<24};d.prototype.toFloat=function(){return(this.hi<<16)*Math.pow(2,32)+this.mi*Math.pow(2,24)+this.lo};d.prototype.toArray=function(){return[this.hi>>8,this.hi&aA,this.mi>>16,this.mi>>8&aA,this.mi&aA,this.lo>>16,this.lo>>8&aA,this.lo&aA]};d.prototype.lo32=function(){return this.lo|(this.mi&aA)<<24};d.prototype.hi32=function(){return this.mi>>>8&al|this.hi<<16};function +pO(a,b){return new +d(a&ar,a>>>24&aA|(b&al)<<8,b>>>16&al)}function +dF(a){return a.hi32()}function +dG(a){return a.lo32()}function +bD(){z(dq)}var +pv=b6;function +aR(a,b,c,d){this.kind=a;this.layout=b;this.dims=c;this.data=d}aR.prototype.caml_custom=pv;aR.prototype.offset=function(a){var +c=0;if(typeof +a==="number")a=[a];if(!(a +instanceof +Array))z("bigarray.js: invalid offset");if(this.dims.length!=a.length)z("Bigarray.get/set: bad number of dimensions");if(this.layout==0)for(var +b=0;b=this.dims[b])bD();c=c*this.dims[b]+a[b]}else +for(var +b=this.dims.length-1;b>=0;b--){if(a[b]<1||a[b]>this.dims[b])bD();c=c*this.dims[b]+(a[b]-1)}return c};aR.prototype.get=function(a){switch(this.kind){case +7:var +d=this.data[a*2+0],b=this.data[a*2+1];return pO(d,b);case +10:case +11:var +e=this.data[a*2+0],c=this.data[a*2+1];return[b4,e,c];default:return this.data[a]}};aR.prototype.set=function(a,b){switch(this.kind){case +7:this.data[a*2+0]=dG(b);this.data[a*2+1]=dF(b);break;case +10:case +11:this.data[a*2+0]=b[1];this.data[a*2+1]=b[2];break;default:this.data[a]=b;break}return 0};aR.prototype.fill=function(a){switch(this.kind){case +7:var +c=dG(a),e=dF(a);if(c==e)this.data.fill(c);else +for(var +b=0;be)return 1;if(d!=e){if(!b)return NaN;if(d==d)return 1;if(e==e)return-1}}break;case +7:for(var +c=0;ca.data[c+1])return 1;if(this.data[c]>>>0>>0)return-1;if(this.data[c]>>>0>a.data[c]>>>0)return 1}break;case +2:case +3:case +4:case +5:case +6:case +8:case +9:case +12:for(var +c=0;ca.data[c])return 1}break}return 0};function +bf(a,b,c,d){this.kind=a;this.layout=b;this.dims=c;this.data=d}bf.prototype=new +aR();bf.prototype.offset=function(a){if(typeof +a!=="number")if(a +instanceof +Array&&a.length==1)a=a[0];else +z("Ml_Bigarray_c_1_1.offset");if(a<0||a>=this.dims[0])bD();return a};bf.prototype.get=function(a){return this.data[a]};bf.prototype.set=function(a,b){this.data[a]=b;return 0};bf.prototype.fill=function(a){this.data.fill(a);return 0};function +dv(a,b,c,d){var +e=gp(a);if(b_(c)*e!=d.length)z("length doesn't match dims");if(b==0&&c.length==1&&e==1)return new +bf(a,b,c,d);return new +aR(a,b,c,d)}function +gN(a){return a.slice(1)}function +pu(a,b,c){var +d=gN(c),e=gn(a,b_(d));return dv(a,b,d,e)}function +bE(a,b,c){a.set(a.offset(b),c);return 0}function +bI(a,b,c){var +d=String.fromCharCode;if(b==0&&c<=4096&&c==a.length)return d.apply(null,a);var +f=e;for(;0=c.l||c.t==2&&e>=c.c.length)){c.c=a.t==4?bI(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else if(c.t==2&&d==c.c.length){c.c+=a.t==4?bI(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else{if(c.t!=4)ca(c);var +g=a.c,h=c.c;if(a.t==4)if(d<=b)for(var +f=0;f=0;f--)h[d+f]=g[b+f];else{var +i=Math.min(e,g.length-b);for(var +f=0;f>=1;if(a==0)return d;b+=b;c++;if(c==9)b.slice(0,1)}}function +cb(a){if(a.t==2)a.c+=bi(a.l-a.c.length,"\0");else +a.c=bI(a.c,0,a.c.length);a.t=0}function +dR(a){if(a.length<24){for(var +b=0;bdn)return false;return true}else +return!/[^\x00-\x7f]/.test(a)}function +gY(a){for(var +k=e,d=e,h,g,i,b,c=0,j=a.length;cfB){d.substr(0,1);k+=d;d=e;k+=a.slice(c,f)}else +d+=a.slice(c,f);if(f==j)break;c=f}b=1;if(++c=0xd7ff&&b<0xe000)b=2}else{b=3;if(++c0x10ffff)b=3}}}}}if(b<4){c-=b;d+="\ufffd"}else if(b>al)d+=String.fromCharCode(0xd7c0+(b>>10),fQ+(b&0x3FF));else +d+=String.fromCharCode(b);if(d.length>bA){d.substr(0,1);k+=d;d=e}}return k+d}function +aB(a,b,c){this.t=a;this.c=b;this.l=c}aB.prototype.toString=function(){switch(this.t){case +9:return this.c;default:cb(this);case +0:if(dR(this.c)){this.t=9;return this.c}this.t=8;case +8:return this.c}};aB.prototype.toUtf16=function(){var +a=this.toString();if(this.t==9)return a;return gY(a)};aB.prototype.slice=function(){var +a=this.t==4?this.c.slice():this.c;return new +aB(this.t,a,this.l)};function +gs(a){return new +aB(0,a,a.length)}function +aT(a){return a}function +aD(a){return gs(aT(a))}function +aC(a,b,c,d,e){aS(aD(a),b,c,d,e);return 0}function +bg(a){return new +d(a[7]<<0|a[6]<<8|a[5]<<16,a[4]<<0|a[3]<<8|a[2]<<16,a[1]<<0|a[0]<<8)}function +b$(a,b){switch(a.t&6){default:if(b>=a.c.length)return 0;case +0:return a.c.charCodeAt(b);case +4:return a.c[b]}}function +dw(){z(dq)}function +pz(a,b){if(b>>>0>=a.l-7)dw();var +d=new +Array(8);for(var +c=0;c<8;c++)d[7-c]=b$(a,b+c);return bg(d)}function +u(a,b,c){c&=aA;if(a.t!=4){if(b==a.c.length){a.c+=String.fromCharCode(c);if(b+1==a.l)a.t=0;return 0}ca(a)}a.c[b]=c;return 0}function +aE(a,b,c){if(b>>>0>=a.l)dw();return u(a,b,c)}function +bh(a){return a.toArray()}function +pA(a,b,c){if(b>>>0>=a.l-7)dw();var +e=bh(c);for(var +d=0;d<8;d++)u(a,b+7-d,e[d]);return 0}function +as(d,c){var +f=d.l>=0?d.l:d.l=d.length,e=c.length,b=f-e;if(b==0)return d.apply(null,c);else if(b<0){var +a=d.apply(null,c.slice(0,f));if(typeof +a!=="function")return a;return as(a,c.slice(f))}else{switch(b){case +1:{var +a=function(a){var +f=new +Array(e+1);for(var +b=0;b>>0>=a.length-1)bD();return a}function +pB(a){if(isFinite(a)){if(Math.abs(a)>=2.2250738585072014e-308)return 0;if(a!=0)return 1;return 2}return isNaN(a)?4:3}function +pC(){return[0]}function +w(a){if(a<0)z("Bytes.create");return new +aB(a?2:9,e,a)}var +gx=[0];function +pE(a){return gx}function +gy(a){gx=a}function +pY(a){return a==245?1:0}var +qn=Math.log2&&Math.log2(1.1235582092889474E+307)==1020;function +ql(a){if(qn)return Math.floor(Math.log2(a));var +b=0;if(a==0)return-Infinity;if(a>=1)while(a>=2){a/=2;b++}else +while(a<1){a*=2;b--}return b}function +dC(a){var +b=new +Float32Array(1);b[0]=a;var +c=new +Int32Array(b.buffer);return c[0]|0}function +aa(a,b,c){return new +d(a,b,c)}function +cd(a){if(!isFinite(a)){if(isNaN(a))return aa(1,0,fT);return a>0?aa(0,0,fT):aa(0,0,0xfff0)}var +f=a==0&&1/a==-Infinity?aj:a>=0?0:aj;if(f)a=-a;var +b=ql(a)+1023;if(b<=0){b=0;a/=Math.pow(2,-fJ)}else{a/=Math.pow(2,b-f8);if(a<16){a*=2;b-=1}if(b==0)a/=2}var +d=Math.pow(2,24),c=a|0;a=(a-c)*d;var +e=a|0;a=(a-e)*d;var +g=a|0;c=c&dd|f|b<<4;return aa(g,e,c)}function +gr(a,b,c){a.write(32,b.dims.length);a.write(32,b.kind|b.layout<<8);if(b.caml_custom==b6)for(var +d=0;d>4;if(d==2047)return(f|g|c&dd)==0?c&aj?-Infinity:Infinity:NaN;var +e=Math.pow(2,-24),b=(f*e+g)*e+(c&dd);if(d>0){b+=16;b*=Math.pow(2,d-f8)}else +b*=Math.pow(2,-fJ);if(c&aj)b=-b;return b}function +$(a){if(!S.Failure)S.Failure=[E,X(de),-3];dL(S.Failure,a)}function +go(a,b,c){var +k=a.read32s();if(k<0||k>16)$("input_value: wrong number of bigarray dimensions");var +r=a.read32s(),l=r&aA,q=r>>8&1,j=[];if(c==b6)for(var +d=0;d>>32-15;b=gR(b,0x1b873593);a^=b;a=a<<13|a>>>32-13;return(a+(a<<2)|0)+(0xe6546b64|0)|0}function +pK(a,b){a=aF(a,dG(b));a=aF(a,dF(b));return a}function +gE(a,b){return pK(a,cd(b))}function +gq(a){var +c=b_(a.dims),d=0;switch(a.kind){case +2:case +3:case +12:if(c>fD)c=fD;var +e=0,b=0;for(b=0;b+4<=a.data.length;b+=4){e=a.data[b+0]|a.data[b+1]<<8|a.data[b+2]<<16|a.data[b+3]<<24;d=aF(d,e)}e=0;switch(c&3){case +3:e=a.data[b+2]<<16;case +2:e|=a.data[b+1]<<8;case +1:e|=a.data[b+0];d=aF(d,e)}break;case +4:case +5:if(c>bz)c=bz;var +e=0,b=0;for(b=0;b+2<=a.data.length;b+=2){e=a.data[b+0]|a.data[b+1]<<16;d=aF(d,e)}if((c&1)!=0)d=aF(d,a.data[b]);break;case +6:if(c>64)c=64;for(var +b=0;b64)c=64;for(var +b=0;b32)c=32;c*=2;for(var +b=0;b64)c=64;for(var +b=0;b32)c=32;for(var +b=0;b0?f(b,a,d):f(a,b,d);if(d&&e!=e)return c;if(+e!=+e)return+e;if((e|0)!=0)return e|0}return c}function +dJ(a){return typeof +a==="string"&&!/[^\x00-\xff]/.test(a)}function +dI(a){return a +instanceof +aB}function +gv(a){if(typeof +a==="number")return az;else if(dI(a))return b7;else if(dJ(a))return 1252;else if(a +instanceof +Array&&a[0]===a[0]>>>0&&a[0]<=fU){var +b=a[0]|0;return b==b4?0:b}else if(a +instanceof +String)return fV;else if(typeof +a=="string")return fV;else if(a +instanceof +Number)return az;else if(a&&a.caml_custom)return c7;else if(a&&a.compare)return 1256;else if(typeof +a=="function")return 1247;else if(typeof +a=="symbol")return 1251;return 1001}function +gM(a,b){if(ab?1:0}function +py(a,b){a.t&6&&cb(a);b.t&6&&cb(b);return a.cb.c?1:0}function +gt(a,b,c){var +f=[];for(;;){if(!(c&&a===b)){var +e=gv(a);if(e==e$){a=a[1];continue}var +g=gv(b);if(g==e$){b=b[1];continue}if(e!==g){if(e==az){if(g==c7)return gu(a,b,-1,c);return-1}if(g==az){if(e==c7)return gu(b,a,1,c);return 1}return eb)return 1;if(a!=b){if(!c)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1001:if(ab)return 1;if(a!=b){if(!c)return NaN;if(a==a)return 1;if(b==b)return-1}break;case +1251:if(a!==b){if(!c)return NaN;return 1}break;case +1252:var +a=aT(a),b=aT(b);if(a!==b){if(ab)return 1}break;case +12520:var +a=a.toString(),b=b.toString();if(a!==b){if(ab)return 1}break;case +246:case +254:default:if(pY(e)){z("compare: continuation value");break}if(a.length!=b.length)return a.length1)f.push(a,b,1);break}}if(f.length==0)return 0;var +h=f.pop();b=f.pop();a=f.pop();if(h+10)if(b==0&&(c>=a.l||a.t==2&&c>=a.c.length))if(d==0){a.c=e;a.t=2}else{a.c=bi(c,String.fromCharCode(d));a.t=c==a.l?0:2}else{if(a.t!=4)ca(a);for(c+=b;bb)return 1;if(a===a)return 1;if(b===b)return-1;return 0}function +dK(a){a=aT(a);var +e=a.length;if(e>31)z("format_int: format too long");var +b={justify:be,signstyle:a1,filler:ad,alternate:false,base:0,signedconv:false,width:0,uppercase:false,sign:1,prec:-1,conv:"f"};for(var +d=0;d=0&&c<=9){b.width=b.width*10+c;d++}d--;break;case".":b.prec=0;d++;while(c=a.charCodeAt(d)-48,c>=0&&c<=9){b.prec=b.prec*10+c;d++}d--;case"d":case"i":b.signedconv=true;case"u":b.base=10;break;case"x":b.base=16;break;case"X":b.base=16;b.uppercase=true;break;case"o":b.base=8;break;case"e":case"f":case"g":b.signedconv=true;b.conv=c;break;case"E":case"F":case"G":b.signedconv=true;b.uppercase=true;b.conv=c.toLowerCase();break}}return b}function +dA(a,b){if(a.uppercase)b=b.toUpperCase();var +f=b.length;if(a.signedconv&&(a.sign<0||a.signstyle!=a1))f++;if(a.alternate){if(a.base==8)f+=1;if(a.base==16)f+=2}var +c=e;if(a.justify==be&&a.filler==ad)for(var +d=f;d20){c-=20;a/=Math.pow(10,c);a+=new +Array(c+1).join(P);if(b>0)a=a+aZ+new +Array(b+1).join(P);return a}else +return a.toFixed(b)}}var +c,f=dK(a),e=f.prec<0?6:f.prec;if(b<0||b==0&&1/b==-Infinity){f.sign=-1;b=-b}if(isNaN(b)){c=dm;f.filler=ad}else if(!isFinite(b)){c="inf";f.filler=ad}else +switch(f.conv){case"e":var +c=b.toExponential(e),d=c.length;if(c.charAt(d-3)==di)c=c.slice(0,d-1)+P+c.slice(d-1);break;case"f":c=j(b,e);break;case"g":e=e?e:1;c=b.toExponential(e-1);var +i=c.indexOf(di),h=+c.slice(i+1);if(h<-4||b>=1e21||b.toFixed(0).length>e){var +d=i-1;while(c.charAt(d)==P)d--;if(c.charAt(d)==aZ)d--;c=c.slice(0,d+1)+c.slice(i);d=c.length;if(c.charAt(d-3)==di)c=c.slice(0,d-1)+P+c.slice(d-1);break}else{var +g=e;if(h<0){g-=h+1;c=b.toFixed(g)}else +while(c=b.toFixed(g),c.length>e+1)g--;if(g){var +d=c.length-1;while(c.charAt(d)==P)d--;if(c.charAt(d)==aZ)d--;c=c.slice(0,d+1)}}break}return dA(f,c)}function +cc(a,b){if(aT(a)==c1)return X(e+b);var +c=dK(a);if(b<0)if(c.signedconv){c.sign=-1;b=-b}else +b>>>=0;var +d=b.toString(c.base);if(c.prec>=0){c.filler=ad;var +f=c.prec-d.length;if(f>0)d=bi(f,P)+d}return dA(c,d)}var +p$=0;function +gB(){return p$++}function +q(a){if(dR(a))return a;return gY(a)}function +bJ(){return typeof +n.process!=="undefined"&&typeof +n.process.versions!=="undefined"&&typeof +n.process.versions.node!=="undefined"}function +qo(){function +a(a){if(a.charAt(0)===ak)return[e,a.substring(1)];return}function +b(a){var +h=/^([a-zA-Z]:|[\\/]{2}[^\\/]+[\\/]+[^\\/]+)?([\\/])?([\s\S]*?)$/,b=h.exec(a),c=b[1]||e,f=Boolean(c&&c.charAt(1)!==":");if(Boolean(b[2]||f)){var +d=b[1]||e,g=b[2]||e;return[d,a.substring(d.length+g.length)]}return}return bJ()&&n.process&&n.process.platform?n.process.platform==="win32"?b:a:a}var +dS=qo();function +gX(a){return a.slice(-1)!==ak?a+ak:a}if(bJ()&&n.process&&n.process.cwd)var +bF=n.process.cwd().replace(/\\/g,ak);else +var +bF="/static";bF=gX(bF);function +p2(a){a=q(a);if(!dS(a))a=bF+a;var +e=dS(a),d=e[1].split(ak),b=[];for(var +c=0;c1)b.pop();break;case".":break;case"":break;default:b.push(d[c]);break}b.unshift(e[0]);b.orig=a;return b}function +qk(a){for(var +g=e,c=g,b,i,d=0,h=a.length;dfB){c.substr(0,1);g+=c;c=e;g+=a.slice(d,f)}else +c+=a.slice(d,f);if(f==h)break;d=f}if(b>6);c+=String.fromCharCode(ae|b&aQ)}else if(b<0xd800||b>=fk)c+=String.fromCharCode(fF|b>>12,ae|b>>6&aQ,ae|b&aQ);else if(b>=0xdbff||d+1==h||(i=a.charCodeAt(d+1))fk)c+="\xef\xbf\xbd";else{d++;b=(b<<10)+i-0x35fdc00;c+=String.fromCharCode(fo|b>>18,ae|b>>12&aQ,ae|b>>6&aQ,ae|b&aQ)}if(c.length>bA){c.substr(0,1);g+=c;c=e}}return g+c}function +ag(a){return dR(a)?X(a):X(qk(a))}var +qp=["E2BIG","EACCES","EAGAIN",c8,"EBUSY","ECHILD","EDEADLK","EDOM",gf,"EFAULT","EFBIG","EINTR","EINVAL","EIO","EISDIR","EMFILE","EMLINK","ENAMETOOLONG","ENFILE","ENODEV",dt,"ENOEXEC","ENOLCK","ENOMEM","ENOSPC","ENOSYS",dj,f$,"ENOTTY","ENXIO","EPERM","EPIPE","ERANGE","EROFS","ESPIPE","ESRCH","EXDEV","EWOULDBLOCK","EINPROGRESS","EALREADY","ENOTSOCK","EDESTADDRREQ","EMSGSIZE","EPROTOTYPE","ENOPROTOOPT","EPROTONOSUPPORT","ESOCKTNOSUPPORT","EOPNOTSUPP","EPFNOSUPPORT","EAFNOSUPPORT","EADDRINUSE","EADDRNOTAVAIL","ENETDOWN","ENETUNREACH","ENETRESET","ECONNABORTED","ECONNRESET","ENOBUFS","EISCONN","ENOTCONN","ESHUTDOWN","ETOOMANYREFS","ETIMEDOUT","ECONNREFUSED","EHOSTDOWN","EHOSTUNREACH","ELOOP","EOVERFLOW"];function +aM(a,b,c,d){var +f=qp.indexOf(a);if(f<0){if(d==null)d=-9999;f=[0,d]}var +g=[f,ag(b||e),ag(c||e)];return g}var +gS={};function +aU(a){return gS[a]}function +aJ(a,b){throw i([0,a].concat(b))}function +dx(a){if(!(a +instanceof +Uint8Array))a=new +Uint8Array(a);return new +aB(4,a,a.length)}function +l(a){dL(S.Sys_error,a)}function +gV(a){l(a+b5)}function +dQ(a){if(a.t!=4)ca(a);return a.c}function +at(a){return a.l}function +gk(){}function +Q(a){this.data=a}Q.prototype=new +gk();Q.prototype.constructor=Q;Q.prototype.truncate=function(a){var +b=this.data;this.data=w(a|0);aS(b,0,this.data,0,a)};Q.prototype.length=function(){return at(this.data)};Q.prototype.write=function(a,b,c,d){var +e=this.length();if(a+d>=e){var +f=w(a+d),g=this.data;this.data=f;aS(g,0,this.data,0,e)}aS(dx(b),c,this.data,a,d);return 0};Q.prototype.read=function(a,b,c,d){var +e=this.length();if(a+d>=e)d=e-a;if(d){var +f=w(d|0);aS(this.data,a,f,0,d);b.set(dQ(f),c)}return d};function +a2(a,b,c){this.file=b;this.name=a;this.flags=c}a2.prototype.err_closed=function(){l(this.name+fu)};a2.prototype.length=function(){if(this.file)return this.file.length();this.err_closed()};a2.prototype.write=function(a,b,c,d){if(this.file)return this.file.write(a,b,c,d);this.err_closed()};a2.prototype.read=function(a,b,c,d){if(this.file)return this.file.read(a,b,c,d);this.err_closed()};a2.prototype.close=function(){this.file=undefined};function +F(a,b){this.content={};this.root=a;this.lookupFun=b}F.prototype.nm=function(a){return this.root+a};F.prototype.create_dir_if_needed=function(a){var +d=a.split(ak),c=e;for(var +b=0;b0?fe:"-infinity")}var +k=a==0&&1/a==-Infinity?1:a>=0?0:1;if(k)a=-a;var +f=0;if(a==0);else if(a<1)while(a<1&&f>-1022){a*=2;f--}else +while(a>=2){a/=2;f++}var +l=f<0?e:be,g=e;if(k)g=a1;else +switch(c){case +43:g=be;break;case +32:g=ad;break;default:break}if(b>=0&&b<13){var +i=Math.pow(2,b*4);a=Math.round(a*i)/i}var +d=a.toString(16);if(b>=0){var +j=d.indexOf(aZ);if(j<0)d+=aZ+bi(b,P);else{var +h=j+1+b;if(d.length>24&ar,a>>31&al)}function +gL(a){return a.toInt()}function +pR(a){return+a.isNeg()}function +gH(a){return a.neg()}function +pP(a,b){var +c=dK(a);if(c.signedconv&&pR(b)){c.sign=-1;b=gH(b)}var +d=e,i=bG(c.base),h="0123456789abcdef";do{var +g=b.udivmod(i);b=g.quotient;d=h.charAt(gL(g.modulus))+d}while(!pS(b));if(c.prec>=0){c.filler=ad;var +f=c.prec-d.length;if(f>0)d=bi(f,P)+d}return dA(c,d)}function +gK(a,b){return a.or(b)}function +p0(a){if(a.js_error)return[0,a.js_error];return 0}function +p1(a,b){switch(b.length){case +1:return a();case +2:return a(b[1]);case +3:return a(b[1],b[2]);case +4:return a(b[1],b[2],b[3]);case +5:return a(b[1],b[2],b[3],b[4]);case +6:return a(b[1],b[2],b[3],b[4],b[5]);case +7:return a(b[1],b[2],b[3],b[4],b[5],b[6]);case +8:return a(b[1],b[2],b[3],b[4],b[5],b[6],b[7])}return a.apply(null,gN(b))}function +gT(a){return X(a)}function +gF(a,b){return a.add(b)}function +gG(a,b){return a.mul(b)}function +dH(a,b){return a.ucompare(b)<0}function +qa(a){var +b=0,e=r(a),c=10,d=1;if(e>0)switch(aL(a,b)){case +45:b++;d=-1;break;case +43:b++;d=1;break}if(b+1=48&&a<=57)return a-48;if(a>=65&&a<=90)return a-55;if(a>=97&&a<=122)return a-87;return-1}function +gI(a){var +h=qa(a),g=h[0],j=h[1],e=h[2],i=bG(e),k=new +d(ar,0xfffffff,al).udivmod(i).quotient,f=aL(a,g),b=gU(f);if(b<0||b>=e)$(by);var +c=bG(b);for(;;){g++;f=aL(a,g);if(f==95)continue;b=gU(f);if(b<0||b>=e)break;if(dH(k,c))$(by);b=bG(b);c=gF(gG(i,c),b);if(dH(c,b))$(by)}if(g!=r(a))$(by);if(e==10&&dH(new +d(0,0,aj),c))$(by);if(j<0)c=gH(c);return c}function +pw(a,b){return a.get(a.offset(b))}function +pX(a,b){return a.xor(b)}function +pV(a,b){return a.shift_right_unsigned(b)}function +pU(a,b){return a.shift_left(b)}function +bH(a){function +o(a,b){return pU(a,b)}function +h(a,b){return pV(a,b)}function +s(a,b){return gK(a,b)}function +f(a,b){return pX(a,b)}function +k(a,b){return gF(a,b)}function +i(a,b){return gG(a,b)}function +m(a,b){return s(o(a,b),h(a,64-b))}function +g(a,b){return pw(a,b)}function +j(a,b,c){return bE(a,b,c)}var +q=gI(gT("0xd1342543de82ef95")),l=gI(gT("0xdaba0b6eb09322e3")),b,d,c,e=a,r=g(e,0),n=g(e,1),p=g(e,2),t=g(e,3);b=k(n,p);b=i(f(b,h(b,32)),l);b=i(f(b,h(b,32)),l);b=f(b,h(b,32));j(e,1,k(i(n,q),r));var +d=p,c=t;c=f(c,d);d=m(d,24);d=f(f(d,c),o(c,16));c=m(c,37);j(e,2,d);j(e,3,c);return b}function +aG(a,b){if(a<0)bD();var +a=a+1|0,c=new +Array(a);c[0]=0;for(var +d=1;d>>32-e,c)}function +g(a,b,c,d,e,f,g){return l(b&c|~b&d,a,b,e,f,g)}function +h(a,b,c,d,e,f,g){return l(b&d|c&~d,a,b,e,f,g)}function +i(a,b,c,d,e,f,g){return l(b^c^d,a,b,e,f,g)}function +j(a,b,c,d,e,f,g){return l(c^(b|~d),a,b,e,f,g)}return function(a,b){var +c=a[0],d=a[1],e=a[2],f=a[3];c=g(c,d,e,f,b[0],7,0xD76AA478);f=g(f,c,d,e,b[1],12,0xE8C7B756);e=g(e,f,c,d,b[2],17,0x242070DB);d=g(d,e,f,c,b[3],22,0xC1BDCEEE);c=g(c,d,e,f,b[4],7,0xF57C0FAF);f=g(f,c,d,e,b[5],12,0x4787C62A);e=g(e,f,c,d,b[6],17,0xA8304613);d=g(d,e,f,c,b[7],22,0xFD469501);c=g(c,d,e,f,b[8],7,0x698098D8);f=g(f,c,d,e,b[9],12,0x8B44F7AF);e=g(e,f,c,d,b[10],17,0xFFFF5BB1);d=g(d,e,f,c,b[11],22,0x895CD7BE);c=g(c,d,e,f,b[12],7,0x6B901122);f=g(f,c,d,e,b[13],12,0xFD987193);e=g(e,f,c,d,b[14],17,0xA679438E);d=g(d,e,f,c,b[15],22,0x49B40821);c=h(c,d,e,f,b[1],5,0xF61E2562);f=h(f,c,d,e,b[6],9,0xC040B340);e=h(e,f,c,d,b[11],14,0x265E5A51);d=h(d,e,f,c,b[0],20,0xE9B6C7AA);c=h(c,d,e,f,b[5],5,0xD62F105D);f=h(f,c,d,e,b[10],9,0x02441453);e=h(e,f,c,d,b[15],14,0xD8A1E681);d=h(d,e,f,c,b[4],20,0xE7D3FBC8);c=h(c,d,e,f,b[9],5,0x21E1CDE6);f=h(f,c,d,e,b[14],9,0xC33707D6);e=h(e,f,c,d,b[3],14,0xF4D50D87);d=h(d,e,f,c,b[8],20,0x455A14ED);c=h(c,d,e,f,b[13],5,0xA9E3E905);f=h(f,c,d,e,b[2],9,0xFCEFA3F8);e=h(e,f,c,d,b[7],14,0x676F02D9);d=h(d,e,f,c,b[12],20,0x8D2A4C8A);c=i(c,d,e,f,b[5],4,0xFFFA3942);f=i(f,c,d,e,b[8],11,0x8771F681);e=i(e,f,c,d,b[11],16,0x6D9D6122);d=i(d,e,f,c,b[14],23,0xFDE5380C);c=i(c,d,e,f,b[1],4,0xA4BEEA44);f=i(f,c,d,e,b[4],11,0x4BDECFA9);e=i(e,f,c,d,b[7],16,0xF6BB4B60);d=i(d,e,f,c,b[10],23,0xBEBFBC70);c=i(c,d,e,f,b[13],4,0x289B7EC6);f=i(f,c,d,e,b[0],11,0xEAA127FA);e=i(e,f,c,d,b[3],16,0xD4EF3085);d=i(d,e,f,c,b[6],23,0x04881D05);c=i(c,d,e,f,b[9],4,0xD9D4D039);f=i(f,c,d,e,b[12],11,0xE6DB99E5);e=i(e,f,c,d,b[15],16,0x1FA27CF8);d=i(d,e,f,c,b[2],23,0xC4AC5665);c=j(c,d,e,f,b[0],6,0xF4292244);f=j(f,c,d,e,b[7],10,0x432AFF97);e=j(e,f,c,d,b[14],15,0xAB9423A7);d=j(d,e,f,c,b[5],21,0xFC93A039);c=j(c,d,e,f,b[12],6,0x655B59C3);f=j(f,c,d,e,b[3],10,0x8F0CCC92);e=j(e,f,c,d,b[10],15,0xFFEFF47D);d=j(d,e,f,c,b[1],21,0x85845DD1);c=j(c,d,e,f,b[8],6,0x6FA87E4F);f=j(f,c,d,e,b[15],10,0xFE2CE6E0);e=j(e,f,c,d,b[6],15,0xA3014314);d=j(d,e,f,c,b[13],21,0x4E0811A1);c=j(c,d,e,f,b[4],6,0xF7537E82);f=j(f,c,d,e,b[11],10,0xBD3AF235);e=j(e,f,c,d,b[2],15,0x2AD7D2BB);d=j(d,e,f,c,b[9],21,0xEB86D391);a[0]=k(c,a[0]);a[1]=k(d,a[1]);a[2]=k(e,a[2]);a[3]=k(f,a[3])}}();function +pq(a,b,c){var +e=a.len&aQ,d=0;a.len+=c;if(e){var +f=64-e;if(c=64){a.b8.set(b.subarray(d,d+64),0);b8(a.w,a.b32);c-=64;d+=64}if(c)a.b8.set(b.subarray(d,d+c),0)}function +po(a){var +c=a.len&aQ;a.b8[c]=ae;c++;if(c>56){for(var +b=c;b<64;b++)a.b8[b]=0;b8(a.w,a.b32);for(var +b=0;b<56;b++)a.b8[b]=0}else +for(var +b=c;b<56;b++)a.b8[b]=0;a.b32[14]=a.len<<3;a.b32[15]=a.len>>29&0x1FFFFFFF;b8(a.w,a.b32);var +e=new +Uint8Array(16);for(var +d=0;d<4;d++)for(var +b=0;b<4;b++)e[d*4+b]=a.w[d]>>8*b&0xFF;return e}function +qg(a){return X(bI(a,0,a.length))}function +p3(a,b,c){var +d=pp(),e=dQ(a);pq(d,e.subarray(b,b+c),c);return qg(po(d))}function +p4(a,b,c){return p3(aD(a),b,c)}function +p5(){return 0}var +aH=new +Array();function +aI(a){var +b=aH[a];if(!b.opened)l("Cannot flush a closed channel");if(!b.buffer||b.buffer_curr==0)return 0;if(b.output)b.output(bI(b.buffer,0,b.buffer_curr));else +b.file.write(b.offset,b.buffer,0,b.buffer_curr);b.offset+=b.buffer_curr;b.buffer_curr=0;return 0}function +qi(a,b){if(b.name)try{var +d=require(c5),c=d.openSync(b.name,"rs");return new +am(c,b)}catch(f){}return new +am(a,b)}var +cg=new +Array(3);function +bC(a,b){Q.call(this,w(0));this.log=function(a){return 0};if(a==1&&typeof +console.log=="function")this.log=console.log;else if(a==2&&typeof +console.error=="function")this.log=console.error;else if(typeof +console.log=="function")this.log=console.log;this.flags=b}bC.prototype.length=function(){return 0};bC.prototype.write=function(a,b,c,d){if(this.log){if(d>0&&c>=0&&c+d<=b.length&&b[c+d-1]==10)d--;var +e=w(d);aS(dx(b),c,e,0,d);this.log(e.toUtf16());return 0}l(this.fd+fu)};bC.prototype.read=function(a,b,c,d){l(this.fd+": file descriptor is write only")};bC.prototype.close=function(){this.log=undefined};function +ch(a,b){if(b==undefined)b=cg.length;cg[b]=a;return b|0}function +qq(a,b,c){var +d={};while(b){switch(b[1]){case +0:d.rdonly=1;break;case +1:d.wronly=1;break;case +2:d.append=1;break;case +3:d.create=1;break;case +4:d.truncate=1;break;case +5:d.excl=1;break;case +6:d.binary=1;break;case +7:d.text=1;break;case +8:d.nonblock=1;break}b=b[2]}if(d.rdonly&&d.wronly)l(aT(a)+c4);if(d.text&&d.binary)l(aT(a)+c2);var +e=g0(a),f=e.device.open(e.rest,d);return ch(f,undefined)}(function(){function +a(a,b){return bJ()?qi(a,b):new +bC(a,b)}ch(a(0,{rdonly:1,altname:"/dev/stdin",isCharacterDevice:true}),0);ch(a(1,{buffered:2,wronly:1,isCharacterDevice:true}),1);ch(a(2,{buffered:2,wronly:1,isCharacterDevice:true}),2)}());function +p6(a){var +b=cg[a];if(b.flags.wronly)l(fw+a+" is writeonly");var +d=null,c={file:b,offset:b.flags.append?b.length():0,fd:a,opened:true,out:false,buffer_curr:0,buffer_max:0,buffer:new +Uint8Array(f9),refill:d};aH[c.fd]=c;return c.fd}function +gO(a){var +b=cg[a];if(b.flags.rdonly)l(fw+a+" is readonly");var +d=b.flags.buffered!==undefined?b.flags.buffered:1,c={file:b,offset:b.flags.append?b.length():0,fd:a,opened:true,out:true,buffer_curr:0,buffer:new +Uint8Array(f9),buffered:d};aH[c.fd]=c;return c.fd}function +p7(){var +b=0;for(var +a=0;ae.buffer.length){var +g=new +Uint8Array(e.buffer_curr+b.length);g.set(e.buffer);e.buffer=g}switch(e.buffered){case +0:e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;aI(a);break;case +1:e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;if(e.buffer_curr>=e.buffer.length)aI(a);break;case +2:var +f=b.lastIndexOf(10);if(f<0){e.buffer.set(b,e.buffer_curr);e.buffer_curr+=b.length;if(e.buffer_curr>=e.buffer.length)aI(a)}else{e.buffer.set(b.subarray(0,f+1),e.buffer_curr);e.buffer_curr+=f+1;aI(a);e.buffer.set(b.subarray(f+1),e.buffer_curr);e.buffer_curr+=b.length-f-1}break}return 0}function +gP(a,b,c,d){return p8(a,aD(b),c,d)}function +gQ(a,b){var +c=X(String.fromCharCode(b));gP(a,c,0,1);return 0}function +p9(a,b){if(b==0)dM();return a%b}function +a3(a,b){return+(gt(a,b,false)!=0)}function +ce(a){if(a +instanceof +Array&&a[0]==a[0]>>>0)return a[0];else if(dI(a))return b7;else if(dJ(a))return b7;else if(a +instanceof +Function||typeof +a=="function")return 247;else if(a&&a.caml_custom)return fU;else +return az}var +dy=as;function +px(a){var +b;while(a)if(q(a[1][1])=="SYJS"){b=a[1][2];break}else +a=a[2];var +d={};if(b)for(var +c=1;c=0)a=e;else +$("caml_register_global: cannot locate "+d)}}S[a+1]=b;if(c)S[c]=b}function +dO(a,b){gS[aT(a)]=b;return 0}function +aK(a,b){if(a===b)return 1;return 0}function +qe(){z(dq)}function +U(a,b){if(b>>>0>=r(a))qe();return aL(a,b)}function +gW(a,b){return 1-aK(a,b)}function +qh(){return 0x7FFFFFFF/4|0}function +qj(){if(n.crypto)if(typeof +n.crypto.getRandomValues==="function"){var +a=new +Uint32Array(1);n.crypto.getRandomValues(a);return[0,a[0]]}else if(n.crypto.randomBytes==="function"){var +b=n.crypto.randomBytes(4),a=new +Uint32Array(b);return[0,a[0]]}var +c=new +Date().getTime(),d=c^0xffffffff*Math.random();return[0,d]}function +dP(a){var +b=1;while(a&&a.joo_tramp){a=a.joo_tramp.apply(null,a.joo_args);b++}return a}function +G(a,b){return{joo_tramp:a,joo_args:b}}function +ci(a){{if(a +instanceof +Array)return a;var +b;if(n.RangeError&&a +instanceof +n.RangeError&&a.message&&a.message.match(/maximum call stack/i))b=S.Stack_overflow;else if(n.InternalError&&a +instanceof +n.InternalError&&a.message&&a.message.match(/too much recursion/i))b=S.Stack_overflow;else if(a +instanceof +n.Error&&aU(dr))b=[0,aU(dr),a];else +b=[0,S.Failure,ag(String(a))];if(a +instanceof +n.Error)b.js_error=a;return b}}function +pZ(a){switch(a[2]){case-8:case-11:case-12:return 1;default:return 0}}function +pI(a){var +b=e;if(a[0]==0){b+=a[1][1];if(a.length==3&&a[2][0]==0&&pZ(a[1]))var +f=a[2],g=1;else +var +g=2,f=a;b+="(";for(var +d=g;dg)b+=fG;var +c=f[d];if(typeof +c=="number")b+=c.toString();else if(c +instanceof +aB)b+=a0+c.toString()+a0;else if(typeof +c=="string")b+=a0+c.toString()+a0;else +b+=f7}b+=")"}else if(a[0]==E)b+=a[1];return b}function +gA(a){if(a +instanceof +Array&&(a[0]==0||a[0]==E)){var +c=aU(f0);if(c)dy(c,[a,false]);else{var +d=pI(a),b=aU(fz);if(b)dy(b,[0]);console.error(c3+d+"\n");if(a.js_error)throw a.js_error}}else +throw a}function +qd(){var +c=n.process;if(c&&c.on)c.on("uncaughtException",function(a,b){gA(a);c.exit(2)});else if(n.addEventListener)n.addEventListener("error",function(a){if(a.error)gA(a.error)})}qd();function +g(a,b){return(a.l>=0?a.l:a.l=a.length)==1?a(b):as(a,[b])}function +k(a,b,c){return(a.l>=0?a.l:a.l=a.length)==2?a(b,c):as(a,[b,c])}function +t(a,b,c,d){return(a.l>=0?a.l:a.l=a.length)==3?a(b,c,d):as(a,[b,c,d])}function +e7(a,b,c,d,e){return(a.l>=0?a.l:a.l=a.length)==4?a(b,c,d,e):as(a,[b,c,d,e])}function +aY(a,b,c,d,e,f){return(a.l>=0?a.l:a.l=a.length)==5?a(b,c,d,e,f):as(a,[b,c,d,e,f])}function +e8(a,b,c,d,e,f,g){return(a.l>=0?a.l:a.l=a.length)==6?a(b,c,d,e,f,g):as(a,[b,c,d,e,f,g])}function +pn(a,b,c,d,e,f,g,h){return(a.l>=0?a.l:a.l=a.length)==7?a(b,c,d,e,f,g,h):as(a,[b,c,d,e,f,g,h])}pJ();var +cj=[E,ff,-1],dX=[E,fs,-2],dU=[E,de,-3],dT=[E,fy,-4],dV=[E,fP,-8],dW=[E,fY,-9],j=[E,gb,-11],dY=[E,fL,-12],pm=[4,0,0,0,[12,45,[4,0,0,0,0]]],cy=[0,[11,'File "',[2,0,[11,'", line ',[4,0,0,0,[11,f5,[4,0,0,0,[12,45,[4,0,0,0,[11,fc,[2,0,0]]]]]]]]]],'File "%s", line %d, characters %d-%d: %s'],cK=[0,0],ez=[0,0],cY=[0,"\xe2\x9a\x80",[0,"\xe2\x9a\x81",[0,"\xe2\x9a\x82",[0,"\xe2\x9a\x83",[0,"\xe2\x9a\x84",[0,"\xe2\x9a\x85",0]]]]]],e6="https://hbr.github.io/fmlib/webapp/data.json";af(11,dY,fL);af(10,j,gb);af(9,[E,fd,-10],fd);af(8,dW,fY);af(7,dV,fP);af(6,[E,fi,-7],fi);af(5,[E,fv,-6],fv);af(4,[E,fZ,-5],fZ);af(3,dT,fy);af(2,dU,de);af(1,dX,fs);af(0,cj,ff);var +g4=aZ,g2="true",g3="false",g7="\\\\",g8="\\'",g9="\\b",g_="\\t",g$="\\n",ha="\\r",hd="String.blit / Bytes.blit_string",hc="Bytes.blit",hb="String.sub / Bytes.sub",hf=e,he="String.concat",hh="Array.blit",hg="Array.sub",hl="Buffer.add: cannot grow buffer",hv="%c",hw="%s",hx=gg,hy=fr,hz=fp,hA=fh,hB="%f",hC="%B",hD="%{",hE="%}",hF="%(",hG="%)",hH="%a",hI="%t",hJ="%?",hK="%r",hL="%_r",hM=[0,B,850,23],hX=[0,B,814,21],hP=[0,B,815,21],hY=[0,B,818,21],hQ=[0,B,819,21],hZ=[0,B,822,19],hR=[0,B,823,19],h0=[0,B,826,22],hS=[0,B,827,22],h1=[0,B,831,30],hT=[0,B,832,30],hV=[0,B,836,26],hN=[0,B,837,26],hW=[0,B,846,28],hO=[0,B,847,28],hU=[0,B,851,23],i4=[0,B,1558,4],i5="Printf: bad conversion %[",i6=[0,B,1626,39],i7=[0,B,1649,31],i8=[0,B,1650,31],i9="Printf: bad conversion %_",i_=fM,i$=fn,ja=fM,jb=fn,i2=dm,i0="neg_infinity",i1=fe,iZ=aZ,iU=[0,ge],iI="%+nd",iJ="% nd",iL="%+ni",iM="% ni",iN="%nx",iO="%#nx",iP="%nX",iQ="%#nX",iR="%no",iS="%#no",iH="%nd",iK=fp,iT="%nu",iv="%+ld",iw="% ld",iy="%+li",iz="% li",iA="%lx",iB="%#lx",iC="%lX",iD="%#lX",iE="%lo",iF="%#lo",iu="%ld",ix=fr,iG="%lu",ih="%+Ld",ii="% Ld",ik="%+Li",il="% Li",im="%Lx",io="%#Lx",ip="%LX",iq="%#LX",ir="%Lo",is="%#Lo",ig="%Ld",ij=fh,it="%Lu",h5="%+d",h6="% d",h8="%+i",h9="% i",h_="%x",h$="%#x",ia="%X",ib="%#X",ic="%o",id="%#o",h4=c1,h7=gg,ie=gc,hn="@]",ho="@}",hp="@?",hq="@\n",hr="@.",hs="@@",ht="@%",hu="@",h2="CamlinternalFormat.Type_mismatch",jf=e,jg=[0,[11,fG,[2,0,[2,0,0]]],", %s%s"],jE=[0,[11,c3,[2,0,[12,10,0]]],fW],jF=[0,[11,"Fatal error in uncaught exception handler: exception ",[2,0,[12,10,0]]],"Fatal error in uncaught exception handler: exception %s\n"],jD="Fatal error: out of memory in uncaught exception handler",jB=[0,[11,c3,[2,0,[12,10,0]]],fW],jy=[0,[2,0,[12,10,0]],"%s\n"],jq="Raised at",jr="Re-raised at",js="Raised by primitive operation at",jt="Called from",ju=" (inlined)",jw=e,jv=[0,[2,0,[12,32,[2,0,[11,' in file "',[2,0,[12,34,[2,0,[11,", line ",[4,0,0,0,[11,f5,pm]]]]]]]]]],'%s %s in file "%s"%s, line %d, characters %d-%d'],jx=[0,[2,0,[11," unknown location",0]],"%s unknown location"],jl="Out of memory",jm="Stack overflow",jn="Pattern matching failed",jo="Assertion failed",jp="Undefined recursive module",jh=[0,[12,40,[2,0,[2,0,[12,41,0]]]],"(%s%s)"],ji=e,jj=e,jk=[0,[12,40,[2,0,[12,41,0]]],"(%s)"],je=[0,[4,0,0,0,0],c1],jc=[0,[3,0,0],"%S"],jd=f7,jz=[0,e,"(Cannot print locations:\n bytecode executable program file not found)","(Cannot print locations:\n bytecode executable program file appears to be corrupt)","(Cannot print locations:\n bytecode executable program file has wrong magic number)","(Cannot print locations:\n bytecode executable program file cannot be opened;\n -- too many open files. Try running with OCAMLRUNPARAM=b=2)"],jN=aa(14371852,15349651,22696),jO=aa(12230193,11438743,35013),jP=aa(1424933,15549263,2083),jQ=aa(9492471,4696708,43520),jL="Random.int",jG=aa(1,0,0),jH=aa(0,0,0),jK=aa(1,0,0),jI=aa(0,0,0),jJ=aa(2,0,0),jS="Jsoo_runtime.Error.Exn",j9=[0,_,161,16],j8=[0,_,162,16],j7=[0,_,dp,4],j6=[0,_,94,4],j5=[0,_,79,4],j4=[0,_,80,4],j3=[0,_,85,4],j2=[0,_,67,4],j1=[0,_,68,4],j0=[0,_,54,4],jZ=[0,_,55,4],jY=[0,_,25,4],jX=[0,_,19,4],kJ=[0,a,990,8],kI=[0,a,980,8],ku=[0,a,381,16],kC=[0,a,604,12],kD=[0,a,616,12],kG=[0,a,825,8],kF=[0,a,833,12],kE=[0,a,787,8],kB=[0,a,572,12],kA=[0,a,503,8],kz=[0,a,485,8],ky=[0,a,466,8],kx=[0,a,436,8],kw=[0,a,423,8],kv=[0,a,424,8],kn=[0,a,293,12],kp=[0,a,310,20],ko=[0,a,311,20],kq=[0,a,324,20],kr=[0,a,334,20],ks=[0,a,348,20],kt=[0,a,359,20],km=[0,a,223,8],kl=[0,a,fj,8],kk=[0,a,206,8],kj=[0,a,207,8],ki=[0,a,208,8],kh=[0,a,193,8],kg=[0,a,194,8],kf=[0,a,195,8],kd=[0,a,109,20],kc=[0,a,f3,24],kb=[0,a,115,24],ke=[0,a,107,16],j$=[0,a,81,20],ka=[0,a,79,16],kH=[0,a,20,8],kO=[0,gj,257,8],kN=[0,gj,147,8],kR=[0,dc,77,12],kQ=[0,dc,51,17],kP=[0,dc,53,17],kS=[0,1],k_=[0,bB,356,12],k4="href",k5=b0,k2=dh,k1=dh,kY="Cannot decode event",kX=[0,bB,78,33],kW=[0,bB,88,21],kV=[0,bB,dp,33],kU=[0,bB,48,17],k6="tagName",k8=b0,k$=[0,"src/browser/vdom.ml",fj,16],la=[0,0,0],lb=" col: ",lc=" line: ",ld="assertion failed file: ",le=e,lf="Uncaught javascript exception",lg="Uncaught ocaml exception",li=[0,gh,44,4],lh=[0,gh,26,4],ls=[0,df,183,8],lq=[1,fR],lr=[1,-1056736433],lt=gd,lo=[0,df,159,8],lp=gd,ln=[0,0],lm=[0,0],ll=[0,0],lk="Exception in task execution",lj=[0,df,11,4],lL="visibilityState",lO=b0,lP="visibilitychange",lE="innerHeight",lF="innerWidth",lG="currentTarget",lJ=f_,lC="mouseup",lB="mousemove",lA="mousedown",lz="keydown",lx="clientY",ly="clientX",lw="key",lT="Exception in 'update_subscriptions' of Fmlib_browser",lW=[0,b2,353,4],l$="application already initialized",ma="load",mb="cannot decode initialisation data",l8="data",l9="onMessage",l3="receive_message: cannot decode message from javascript",l4="receive_message: event not subscribed",l5="receive_message: subscriptions not yet initialized",l6="receive_message: application not yet initialized",l1="Exception in 'update'",l0="subscriptioin",lZ="view",lX="'",lY="Exception in '",lU="Exception in 'update_dom' of Fmlib_browser",lV=[0,b2,341,4],lS=[0,b2,94,12],lR=[0,b2,85,12],mw="li",mv="ul",mu=e_,mt="button",ms=fx,mr="pre",mq=ga,mp="h3",mo="h2",ml=f2,mm=b0,mn=e_,mk="placeholder",mj=f2,mi="title",mh="border-style",mg="padding",mf="margin",me="color",md=b1,mc=dh,pi="sending to javascript ... ",pj="sending",o7="Show page",o9="Show menu",o8="Webapp",o3="0px 20px 20px 20px",o4=ft,o5=ds,o2=ds,oU=e,oV=fg,oN=c$,oO=ad,oP=c$,oQ="last_name",oG=e,oH=fg,oy="error: cannot decode javascript object",oz="error: invalid json",oA="error: http status = ",oE="sending text request",oD="sending json request",oB="Json request decoded",oC="Text request",n3="Ok",ot="passwords don't match",n4="green",os="red",n5="re enter password",n6=c6,n7=bx,n8=c6,n9=c6,n_=bx,n$="user name",oa=f1,ob=bx,oc="Password check",od="slider value: ",oe="0.5",of="step",og="10",oh="max",oi=P,oj="min",ok="range",ol=bx,om="Slider",on="reversed text: ",oo="Text to reverse",op=f1,oq=bx,or="Text input",nI="mouse ",nG=ak,nH=fc,nJ=a0,nK=a0,nL="key down: ",nN="down",nO="move",nP="up",nQ=f_,nR=a0,nS='visibility change to "',nT="no event yet occurred",nM="keyboard, mouse move/up/down, resize, visiblity change",nB="send",nu="received correctly",nv="fail",nw=c$,nx="second_name",m9="\xf0\x9f\x8e\xb2",m_="infinite",m$="animation-iteration-count",na="0.1s",nb="animation-duration",nc="rolling",nd="animation-name",ne="relative",nf="position",ng="2.5em",nj="3em",nk=b1,nh="Roll",ni="roll the die",mT=[0,[4,0,[0,2,2],0,[12,58,[4,0,[0,2,2],0,[12,58,[4,0,[0,2,2],0,0]]]]],"%02d:%02d:%02d"],mU="5px",mV=ft,mW="10px",mX="utc",mY="your zone",mZ="row",m0="flex-direction",m1="flex",m2="display",m3=ds,m4=b1,mJ="v",mK=ad,mL=ad,mM="2em",mN=b1,mO=c9,mP=ga,mQ=fl,mR=fl,m5="DClock",m6="Digital clock",np="Die",nq="Rolling die",ny=fK,nC="Send",nD="Send message to javascript",n0="Events",n1="Global events",ou=fH,ov=fH,oR=fK,oZ="Http",o0="Http request",o_=P,o$=e,pa=e,pb=e,pc=e,pd=fI,pe=fI;function +v(a){if(typeof +a==="number")return 0;switch(a[0]){case +0:return[0,v(a[1])];case +1:return[1,v(a[1])];case +2:return[2,v(a[1])];case +3:return[3,v(a[1])];case +4:return[4,v(a[1])];case +5:return[5,v(a[1])];case +6:return[6,v(a[1])];case +7:return[7,v(a[1])];case +8:var +c=a[1];return[8,c,v(a[2])];case +9:var +b=a[1];return[9,b,b,v(a[3])];case +10:return[10,v(a[1])];case +11:return[11,v(a[1])];case +12:return[12,v(a[1])];case +13:return[13,v(a[1])];default:return[14,v(a[1])]}}function +N(a,b){if(typeof +a==="number")return b;switch(a[0]){case +0:return[0,N(a[1],b)];case +1:return[1,N(a[1],b)];case +2:return[2,N(a[1],b)];case +3:return[3,N(a[1],b)];case +4:return[4,N(a[1],b)];case +5:return[5,N(a[1],b)];case +6:return[6,N(a[1],b)];case +7:return[7,N(a[1],b)];case +8:var +c=a[1];return[8,c,N(a[2],b)];case +9:var +d=a[2],e=a[1];return[9,e,d,N(a[3],b)];case +10:return[10,N(a[1],b)];case +11:return[11,N(a[1],b)];case +12:return[12,N(a[1],b)];case +13:return[13,N(a[1],b)];default:return[14,N(a[1],b)]}}function +s(a,b){if(typeof +a==="number")return b;switch(a[0]){case +0:return[0,s(a[1],b)];case +1:return[1,s(a[1],b)];case +2:var +c=a[1];return[2,c,s(a[2],b)];case +3:var +d=a[1];return[3,d,s(a[2],b)];case +4:var +e=a[3],f=a[2],g=a[1];return[4,g,f,e,s(a[4],b)];case +5:var +h=a[3],i=a[2],j=a[1];return[5,j,i,h,s(a[4],b)];case +6:var +k=a[3],l=a[2],m=a[1];return[6,m,l,k,s(a[4],b)];case +7:var +n=a[3],o=a[2],p=a[1];return[7,p,o,n,s(a[4],b)];case +8:var +q=a[3],r=a[2],t=a[1];return[8,t,r,q,s(a[4],b)];case +9:var +u=a[1];return[9,u,s(a[2],b)];case +10:return[10,s(a[1],b)];case +11:var +v=a[1];return[11,v,s(a[2],b)];case +12:var +w=a[1];return[12,w,s(a[2],b)];case +13:var +x=a[2],y=a[1];return[13,y,x,s(a[3],b)];case +14:var +z=a[2],A=a[1];return[14,A,z,s(a[3],b)];case +15:return[15,s(a[1],b)];case +16:return[16,s(a[1],b)];case +17:var +B=a[1];return[17,B,s(a[2],b)];case +18:var +C=a[1];return[18,C,s(a[2],b)];case +19:return[19,s(a[1],b)];case +20:var +D=a[2],E=a[1];return[20,E,D,s(a[3],b)];case +21:var +F=a[1];return[21,F,s(a[2],b)];case +22:return[22,s(a[1],b)];case +23:var +G=a[1];return[23,G,s(a[2],b)];default:var +H=a[2],I=a[1];return[24,I,H,s(a[3],b)]}}function +au(a){throw i([0,dT,a],1)}function +bK(a){return 0<=a?a:-a|0}function +an(a,b){var +c=r(a),e=r(b),d=w(c+e|0);aC(a,0,d,0,c);aC(b,0,d,c,e);return M(d)}function +g1(a){return a?g2:g3}p6(0);gO(1);var +av=gO(2);function +g5(a){var +b=p7(0);for(;;){if(!b)return 0;var +d=b[2],e=b[1];try{aI(e)}catch(f){var +c=ci(f);if(c[1]!==dX)throw i(c,0)}var +b=d}}function +bk(a,b){return gP(a,b,0,r(b))}function +dZ(a){bk(av,a);gQ(av,10);return aI(av)}var +g6=[0,g5],d0=[0,function(a){return 0}];function +ck(a){g(d0[1],0);return g(b9(g6),0)}dO(fz,ck);var +bl=(4*qh(0)|0)-1|0;function +bm(a){var +b=a,c=0;for(;;){if(!b)return c;var +d=[0,b[1],c],b=b[2],c=d}}function +bL(a,b){if(!b)return 0;var +c=b[2],d=g(a,b[1]);return[0,d,bL(a,c)]}function +a4(a,b){var +c=b;for(;;){if(!c)return 0;var +d=c[2];g(a,c[1]);var +c=d}}function +d1(a,b,c){var +e=b,d=c;for(;;){if(!d)return e;var +f=d[2],e=k(a,e,d[1]),d=f}}var +a5=gM;function +aV(a,b){var +c=w(a);pG(c,0,a,b);return c}function +d2(a,b,c){var +f=0;if(0<=b&&0<=c&&(at(a)-c|0)>=b){var +d=w(c);aS(a,b,d,0,c);var +e=d;f=1}if(!f)var +e=au(hb);return M(e)}function +d3(a,b,c,d,e){if(0<=e&&0<=b&&(at(a)-e|0)>=b&&0<=d&&(at(c)-e|0)>=d)return aS(a,b,c,d,e);return au(hc)}function +ao(a,b,c,d,e){if(0<=e&&0<=b&&(r(a)-e|0)>=b&&0<=d&&(at(c)-e|0)>=d)return aC(a,b,c,d,e);return au(hd)}function +d4(a,b){if(!b)return hf;var +i=r(a),e=0,d=b,p=0;for(;;){if(d){var +j=d[1];if(d[2]){var +k=(r(j)+i|0)+e|0,m=d[2],n=e<=k?k:au(he),e=n,d=m;continue}var +l=r(j)+e|0}else +var +l=e;var +h=w(l),g=p,f=b;for(;;){if(f){var +c=f[1];if(f[2]){var +o=f[2];aC(c,0,h,g,r(c));aC(a,0,h,g+r(c)|0,i);var +g=(g+r(c)|0)+i|0,f=o;continue}aC(c,0,h,g,r(c))}return M(h)}}}var +a6=qf;function +bM(a,b){return pz(aD(a),b)}function +cl(a){var +b=a.length-1;return 0===b?[0]:du(a,0,b)}function +cm(a,b,c){if(0<=b&&0<=c&&(a.length-1-c|0)>=b)return du(a,b,c);return au(hg)}function +ah(a,b,c,d,e){if(0<=e&&0<=b&&(a.length-1-e|0)>=b&&0<=d&&(c.length-1-e|0)>=d)return ps(a,b,c,d,e);return au(hh)}function +cr(a,b,c){var +e=[0,b],f=c.length-1-1|0,g=0;if(f>=0){var +d=g;for(;;){e[1]=k(a,e[1],c[1+d]);var +h=d+1|0;if(f!==d){var +d=h;continue}break}}return e[1]}function +d5(a,b){var +d=a[2],c=[0,a[1][2]];for(;;){if(c[1]<(d+b|0)){c[1]=2*c[1]|0;continue}if(blbl)throw i([0,dU,hl],1);c[1]=bl}var +e=w(c[1]);d3(a[1][1],0,e,0,a[2]);a[1]=[0,e,c[1]];return 0}}function +bn(a,b){var +c=r(b),d=a[1],e=a[2]+c|0,f=a[2],g=d[1];if(d[2]=c){var +c=2*c|0;continue}var +f=aG(c,cs);ah(d,0,f,0,e);gy(f);var +h=f;break}}var +i=R(h,b)[1+b];if(i===cs){var +j=g(l,0);R(h,b)[1+b]=j;var +k=j}else +var +k=i;return g(k,0)};function +ct(a){return 5===a[2]?12:-6}function +d9(a){return[0,0,w(a)]}function +d_(a,b){var +c=at(a[2]),d=a[1]+b|0,e=c=e+fC>>>0)f=1}else if(65<=e)f=1}else{var +i=0;if(32===e)i=1;else if(43<=e)switch(e-43|0){case +5:if(c<(d+2|0)&&1=0){var +j=v;for(;;){var +g=b$(f,j),h=0;if(32<=g){var +k=g-34|0,m=0;if(58>>0){if(93>k)m=1}else if(56>>0)h=1;else +m=1;if(m){var +l=1;h=2}}else +if(11<=g){if(13===g)h=1}else if(8<=g)h=1;switch(h){case +0:var +l=4;break;case +1:var +l=2;break}b[1]=b[1]+l|0;var +z=j+1|0;if(n!==j){var +j=z;continue}break}}if(b[1]===at(f))var +p=f;else{var +c=w(b[1]);b[1]=0;var +o=at(f)-1|0,x=0;if(o>=0){var +i=x;for(;;){var +d=b$(f,i),e=0;if(35<=d)if(92===d)e=2;else if(dn<=d)e=1;else +e=3;else if(32<=d)if(34<=d)e=2;else +e=3;else if(14<=d)e=1;else +switch(d){case +8:u(c,b[1],92);b[1]++;u(c,b[1],98);break;case +9:u(c,b[1],92);b[1]++;u(c,b[1],116);break;case +10:u(c,b[1],92);b[1]++;u(c,b[1],110);break;case +13:u(c,b[1],92);b[1]++;u(c,b[1],f3);break;default:e=1}switch(e){case +1:u(c,b[1],92);b[1]++;u(c,b[1],48+(d/fb|0)|0);b[1]++;u(c,b[1],48+((d/10|0)%10|0)|0);b[1]++;u(c,b[1],48+(d%10|0)|0);break;case +2:u(c,b[1],92);b[1]++;u(c,b[1],d);break;case +3:u(c,b[1],d);break}b[1]++;var +y=i+1|0;if(o!==i){var +i=y;continue}break}}var +p=c}var +q=M(p),s=r(q),t=aV(s+2|0,34);aC(q,0,t,1,s);return M(t)}function +eb(a,b){var +g=bK(b),f=iU[1];switch(a[2]){case +0:var +c=102;break;case +1:var +c=dp;break;case +2:var +c=69;break;case +3:var +c=ge;break;case +4:var +c=71;break;case +5:var +c=f;break;case +6:var +c=104;break;case +7:var +c=72;break;default:var +c=70}var +d=d9(16);a7(d,37);switch(a[1]){case +0:break;case +1:a7(d,43);break;default:a7(d,32)}if(8<=a[2])a7(d,35);a7(d,46);H(d,e+g);a7(d,c);return d$(d)}function +bP(a,b){if(13>a)return b;var +h=[0,0],i=r(b)-1|0,n=0;if(i>=0){var +d=n;for(;;){if(9>=aL(b,d)+fS>>>0)h[1]++;var +q=d+1|0;if(i!==d){var +d=q;continue}break}}var +j=h[1],k=w(r(b)+((j-1|0)/3|0)|0),l=[0,0];function +e(a){aE(k,l[1],a);l[1]++;return 0}var +f=[0,((j-1|0)%3|0)+1|0],m=r(b)-1|0,o=0;if(m>=0){var +c=o;for(;;){var +g=aL(b,c);if(9>>0)e(g);else{if(0===f[1]){e(95);f[1]=3}f[1]+=-1;e(g)}var +p=c+1|0;if(m!==c){var +c=p;continue}break}}return M(k)}function +iV(a,b){switch(a){case +1:var +c=h5;break;case +2:var +c=h6;break;case +4:var +c=h8;break;case +5:var +c=h9;break;case +6:var +c=h_;break;case +7:var +c=h$;break;case +8:var +c=ia;break;case +9:var +c=ib;break;case +10:var +c=ic;break;case +11:var +c=id;break;case +0:case +13:var +c=h4;break;case +3:case +14:var +c=h7;break;default:var +c=ie}return bP(a,cc(c,b))}function +iW(a,b){switch(a){case +1:var +c=iv;break;case +2:var +c=iw;break;case +4:var +c=iy;break;case +5:var +c=iz;break;case +6:var +c=iA;break;case +7:var +c=iB;break;case +8:var +c=iC;break;case +9:var +c=iD;break;case +10:var +c=iE;break;case +11:var +c=iF;break;case +0:case +13:var +c=iu;break;case +3:case +14:var +c=ix;break;default:var +c=iG}return bP(a,cc(c,b))}function +iX(a,b){switch(a){case +1:var +c=iI;break;case +2:var +c=iJ;break;case +4:var +c=iL;break;case +5:var +c=iM;break;case +6:var +c=iN;break;case +7:var +c=iO;break;case +8:var +c=iP;break;case +9:var +c=iQ;break;case +10:var +c=iR;break;case +11:var +c=iS;break;case +0:case +13:var +c=iH;break;case +3:case +14:var +c=iK;break;default:var +c=iT}return bP(a,cc(c,b))}function +iY(a,b){switch(a){case +1:var +c=ih;break;case +2:var +c=ii;break;case +4:var +c=ik;break;case +5:var +c=il;break;case +6:var +c=im;break;case +7:var +c=io;break;case +8:var +c=ip;break;case +9:var +c=iq;break;case +10:var +c=ir;break;case +11:var +c=is;break;case +0:case +13:var +c=ig;break;case +3:case +14:var +c=ij;break;default:var +c=it}return bP(a,pP(c,b))}function +aw(d,b,c){function +j(a){switch(d[1]){case +0:var +e=45;break;case +1:var +e=43;break;default:var +e=32}return pL(c,b,e)}function +q(a){var +b=pB(c);return 3===b?c<0.?i0:i1:4<=b?i2:a}switch(d[2]){case +5:var +f=dB(eb(d,b),c),e=0,x=r(f);for(;;){if(e===x)var +p=0;else{var +k=U(f,e)-46|0,l=0;if(23>>0){if(55===k)l=1}else if(21>>0)l=1;if(!l){var +e=e+1|0;continue}var +p=1}var +y=p?f:an(f,iZ);return q(y)}case +6:return j(0);case +7:var +i=aD(j(0)),g=at(i);if(0===g)var +o=i;else{var +m=w(g),n=g-1|0,s=0;if(n>=0){var +a=s;for(;;){var +h=b$(i,a),t=25>>0?h:h-32|0;u(m,a,t);var +v=a+1|0;if(n!==a){var +a=v;continue}break}}var +o=m}return M(o);case +8:return q(j(0));default:return dB(eb(d,b),c)}}function +bQ(j,i,h,d,e,f,g){if(typeof +d==="number"){if(typeof +e==="number")return e?function(a,b){return m(j,[4,i,a8(a,k(f,g,b))],h)}:function(a){return m(j,[4,i,k(f,g,a)],h)};var +b=e[1];return function(a){return m(j,[4,i,a8(b,k(f,g,a))],h)}}if(0===d[0]){var +c=d[2],l=d[1];if(typeof +e==="number")return e?function(a,b){return m(j,[4,i,W(l,c,a8(a,k(f,g,b)))],h)}:function(a){return m(j,[4,i,W(l,c,k(f,g,a))],h)};var +o=e[1];return function(a){return m(j,[4,i,W(l,c,a8(o,k(f,g,a)))],h)}}var +n=d[1];if(typeof +e==="number")return e?function(a,b,c){return m(j,[4,i,W(n,a,a8(b,k(f,g,c)))],h)}:function(a,b){return m(j,[4,i,W(n,a,k(f,g,b))],h)};var +p=e[1];return function(a,b){return m(j,[4,i,W(n,a,a8(p,k(f,g,b)))],h)}}function +cv(h,f,c,d,e){if(typeof +d==="number")return function(a){return m(h,[4,f,g(e,a)],c)};if(0===d[0]){var +b=d[2],i=d[1];return function(a){return m(h,[4,f,W(i,b,g(e,a))],c)}}var +j=d[1];return function(a,b){return m(h,[4,f,W(j,a,g(e,b))],c)}}function +bw(a,b,c,d){var +f=b,e=c,h=d;for(;;){if(typeof +h==="number")return g(f,e);switch(h[0]){case +0:var +N=h[1];return function(a){return m(f,[5,e,a],N)};case +1:var +O=h[1];return function(a){var +c=0;if(40<=a)if(92===a)var +b=g7;else if(dn<=a)c=1;else +c=2;else if(32<=a)if(39<=a)var +b=g8;else +c=2;else if(14<=a)c=1;else +switch(a){case +8:var +b=g9;break;case +9:var +b=g_;break;case +10:var +b=g$;break;case +13:var +b=ha;break;default:c=1}switch(c){case +1:var +d=w(4);u(d,0,92);u(d,1,48+(a/fb|0)|0);u(d,2,48+((a/10|0)%10|0)|0);u(d,3,48+(a%10|0)|0);var +b=M(d);break;case +2:var +g=w(1);u(g,0,a);var +b=M(g);break}var +h=r(b),i=aV(h+2|0,39);aC(b,0,i,1,h);return m(f,[4,e,M(i)],O)};case +2:var +P=h[2],Q=h[1];return cv(f,e,P,Q,function(a){return a});case +3:return cv(f,e,h[2],h[1],h3);case +4:return bQ(f,e,h[4],h[2],h[3],iV,h[1]);case +5:return bQ(f,e,h[4],h[2],h[3],iW,h[1]);case +6:return bQ(f,e,h[4],h[2],h[3],iX,h[1]);case +7:return bQ(f,e,h[4],h[2],h[3],iY,h[1]);case +8:var +q=h[4],t=h[3],y=h[2],n=h[1];if(typeof +y==="number"){if(typeof +t==="number")return t?function(a,b){return m(f,[4,e,aw(n,a,b)],q)}:function(a){return m(f,[4,e,aw(n,ct(n),a)],q)};var +ag=t[1];return function(a){return m(f,[4,e,aw(n,ag,a)],q)}}if(0===y[0]){var +B=y[2],D=y[1];if(typeof +t==="number")return t?function(a,b){return m(f,[4,e,W(D,B,aw(n,a,b))],q)}:function(a){return m(f,[4,e,W(D,B,aw(n,ct(n),a))],q)};var +ah=t[1];return function(a){return m(f,[4,e,W(D,B,aw(n,ah,a))],q)}}var +E=y[1];if(typeof +t==="number")return t?function(a,b,c){return m(f,[4,e,W(E,a,aw(n,b,c))],q)}:function(a,b){return m(f,[4,e,W(E,a,aw(n,ct(n),b))],q)};var +ai=t[1];return function(a,b){return m(f,[4,e,W(E,a,aw(n,ai,b))],q)};case +9:return cv(f,e,h[2],h[1],g1);case +10:var +e=[7,e],h=h[1];continue;case +11:var +e=[2,e,h[1]],h=h[2];continue;case +12:var +e=[3,e,h[1]],h=h[2];continue;case +13:var +R=h[3],S=h[2],F=d9(16);cu(F,S);var +L=d$(F);return function(a){return m(f,[4,e,L],R)};case +14:var +T=h[3],U=h[2];return function(a){var +c=a[1],b=p(c,v(x(U)));if(typeof +b[2]==="number")return m(f,e,s(b[1],T));throw i(C,1)};case +15:var +V=h[1];return function(c,b){return m(f,[6,e,function(a){return k(c,a,b)}],V)};case +16:var +X=h[1];return function(a){return m(f,[6,e,a],X)};case +17:var +e=[0,e,h[1]],h=h[2];continue;case +18:var +A=h[1];if(0===A[0]){var +Y=h[2],Z=A[1][1],_=0,f=function(d,b,c){return function(a){return m(b,[1,d,[0,a]],c)}}(e,f,Y),e=_,h=Z;continue}var +$=h[2],aa=A[1][1],ab=0,f=function(d,b,c){return function(a){return m(b,[1,d,[1,a]],c)}}(e,f,$),e=ab,h=aa;continue;case +19:throw i([0,j,i4],1);case +20:var +ac=h[3],ad=[8,e,i5];return function(a){return m(f,ad,ac)};case +21:var +ae=h[2];return function(a){return m(f,[4,e,cc(gc,a)],ae)};case +22:var +af=h[1];return function(a){return m(f,[5,e,a],af)};case +23:var +l=h[2],z=h[1];if(typeof +z==="number")switch(z){case +0:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +1:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +2:throw i([0,j,i6],1);default:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l])}switch(z[0]){case +0:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +1:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +2:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +3:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +4:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +5:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +6:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +7:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +8:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);case +9:var +K=z[2];return a<50?c0(a+1|0,f,e,K,l):G(c0,[0,f,e,K,l]);case +10:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l]);default:return a<50?o(a+1|0,f,e,l):G(o,[0,f,e,l])}default:var +H=h[3],I=h[1],J=g(h[2],0);return a<50?cZ(a+1|0,f,e,H,I,J):G(cZ,[0,f,e,H,I,J])}}}function +c0(a,f,c,d,e){if(typeof +d==="number")return a<50?o(a+1|0,f,c,e):G(o,[0,f,c,e]);switch(d[0]){case +0:var +b=d[1];return function(a){return Y(f,c,b,e)};case +1:var +g=d[1];return function(a){return Y(f,c,g,e)};case +2:var +h=d[1];return function(a){return Y(f,c,h,e)};case +3:var +k=d[1];return function(a){return Y(f,c,k,e)};case +4:var +l=d[1];return function(a){return Y(f,c,l,e)};case +5:var +m=d[1];return function(a){return Y(f,c,m,e)};case +6:var +n=d[1];return function(a){return Y(f,c,n,e)};case +7:var +p=d[1];return function(a){return Y(f,c,p,e)};case +8:var +q=d[2];return function(a){return Y(f,c,q,e)};case +9:var +r=d[3],s=d[2],t=A(x(d[1]),s);return function(a){return Y(f,c,N(t,r),e)};case +10:var +u=d[1];return function(a,b){return Y(f,c,u,e)};case +11:var +v=d[1];return function(a){return Y(f,c,v,e)};case +12:var +w=d[1];return function(a){return Y(f,c,w,e)};case +13:throw i([0,j,i7],1);default:throw i([0,j,i8],1)}}function +o(a,b,c,d){var +e=[8,c,i9];return a<50?bw(a+1|0,b,e,d):G(bw,[0,b,e,d])}function +cZ(a,b,c,d,e,f){if(e){var +i=e[1];return function(a){return i3(b,c,d,i,g(f,a))}}var +h=[4,c,f];return a<50?bw(a+1|0,b,h,d):G(bw,[0,b,h,d])}function +m(a,b,c){return dP(bw(0,a,b,c))}function +Y(a,b,c,d){return dP(c0(0,a,b,c,d))}function +i3(a,b,c,d,e){return dP(cZ(0,a,b,c,d,e))}function +ax(a,b){var +c=b;for(;;){if(typeof +c==="number")return 0;switch(c[0]){case +0:var +f=c[1],h=ea(c[2]);ax(a,f);return bk(a,h);case +1:var +d=c[2],e=c[1];if(0===d[0]){var +i=d[1];ax(a,e);bk(a,i_);var +c=i;continue}var +j=d[1];ax(a,e);bk(a,i$);var +c=j;continue;case +6:var +m=c[2];ax(a,c[1]);return g(m,a);case +7:ax(a,c[1]);return aI(a);case +8:var +n=c[2];ax(a,c[1]);return au(n);case +2:case +4:var +k=c[2];ax(a,c[1]);return bk(a,k);default:var +l=c[2];ax(a,c[1]);return gQ(a,l)}}}function +aN(a,b){var +c=b;for(;;){if(typeof +c==="number")return 0;switch(c[0]){case +0:var +k=c[1],l=ea(c[2]);aN(a,k);return bn(a,l);case +1:var +e=c[2],h=c[1];if(0===e[0]){var +m=e[1];aN(a,h);bn(a,ja);var +c=m;continue}var +n=e[1];aN(a,h);bn(a,jb);var +c=n;continue;case +6:var +p=c[2];aN(a,c[1]);return bn(a,g(p,0));case +7:var +c=c[1];continue;case +8:var +q=c[2];aN(a,c[1]);return au(q);case +2:case +4:var +o=c[2];aN(a,c[1]);return bn(a,o);default:var +i=c[2];aN(a,c[1]);var +d=a[2],f=a[1],j=f[1];if(f[2]<=d){d5(a,1);aE(a[1][1],a[2],i)}else +u(j,d,i);a[2]=d+1|0;return 0}}}function +ec(d,b){var +a=b[1],c=0;return m(function(a){ax(d,a);return 0},c,a)}function +cw(a){return ec(av,a)}function +ai(a){var +b=a[1];return m(function(a){var +e=64,c=bl<64?bl:e,d=w(c),b=[0,[0,d,c],0,d];aN(b,a);return d2(b[1][1],0,b[2])},0,b)}var +cx=[0,0];function +cz(a,b){var +c=a[1+b];if(!(1-(typeof +c==="number"?1:0)))return g(ai(je),c);if(ce(c)===b7)return g(ai(jc),c);if(ce(c)!==253)return jd;var +e=dB("%.12g",c),d=0,i=r(e);for(;;){if(i<=d)return an(e,g4);var +f=U(e,d),h=0;if(48<=f){if(58>f)h=1}else if(45===f)h=1;if(!h)return e;var +d=d+1|0}}function +ed(a,b){if(a.length-1<=b)return jf;var +c=ed(a,b+1|0),d=cz(a,b);return k(ai(jg),d,c)}function +cA(a){var +b=b9(cx);for(;;){if(b){var +s=0,x=b[2],y=b[1];try{var +m=g(y,a)}catch(f){s=1}var +t=0;if(s||!m)t=1;else +var +i=[0,m[1]];if(t){var +b=x;continue}}else +var +i=0;if(i)return i[1];if(a===cj)return jl;if(a===dW)return jm;if(a[1]===dV){var +e=a[2],p=e[3],A=e[2],B=e[1];return aY(ai(cy),B,A,p,p+5|0,jn)}if(a[1]===j){var +f=a[2],q=f[3],C=f[2],D=f[1];return aY(ai(cy),D,C,q,q+6|0,jo)}if(a[1]===dY){var +h=a[2],r=h[3],E=h[2],F=h[1];return aY(ai(cy),F,E,r,r+6|0,jp)}if(0===ce(a)){var +l=a.length-1,z=a[1][1];if(2>>0)var +u=ed(a,2),v=cz(a,1),c=k(ai(jh),v,u);else +switch(l){case +0:var +c=ji;break;case +1:var +c=jj;break;default:var +w=cz(a,1),c=g(ai(jk),w)}var +d=[0,z,[0,c]]}else +var +d=[0,a[1],0];var +n=d[2],o=d[1];return n?an(o,n[1]):o}}function +cB(a,b){var +f=pC(b),i=f.length-1-1|0,r=0;if(i>=0){var +d=r;for(;;){var +c=R(f,d)[1+d],h=function(b){return function(a){return a?0===b?jq:jr:0===b?js:jt}}(d);if(0===c[0])var +j=c[5],k=c[4],l=c[3],m=c[6]?ju:jw,n=c[2],o=c[7],p=h(c[1]),e=[0,pn(ai(jv),p,o,n,m,l,k,j)];else if(c[1])var +e=0;else +var +q=h(0),e=[0,g(ai(jx),q)];if(e){var +s=e[1];g(ec(a,jy),s)}var +t=d+1|0;if(i!==d){var +d=t;continue}break}}return 0}function +ee(a){for(;;){var +b=b9(cx),c=1-gl(cx,b,[0,a,b]);if(c)continue;return c}}var +jA=jz.slice(),jC=[0];dO(f0,function(a,b){try{try{var +h=b?jC:gC(0);try{ck(0)}catch(f){}try{var +f=cA(a);g(cw(jB),f);cB(av,h);var +c=p5(0);if(c<0){var +d=bK(c);dZ(R(jA,d)[1+d])}var +l=aI(av),j=l}catch(f){var +m=ci(f),n=cA(a);g(cw(jE),n);cB(av,h);var +o=cA(m);g(cw(jF),o);cB(av,gC(0));var +j=aI(av)}var +k=j}catch(f){var +e=ci(f);if(e!==cj)throw i(e,0);var +k=dZ(jD)}return k}catch(f){return 0}});function +ef(a){var +b=M(a);return p4(b,0,r(b))}function +eg(a){return pu(7,0,[0,4])}function +eh(a,b,c,d,e){bE(a,0,gK(b,jG));bE(a,1,c);var +f=a3(d,jH)?d:jK;bE(a,2,f);var +g=a3(e,jI)?e:jJ;return bE(a,3,g)}function +ei(a,b,c,d){var +e=eg(0);eh(e,a,b,c,d);return e}function +jM(a){var +b=bH(a),c=bH(a),d=bH(a);return ei(b,c,d,bH(a))}d7([0,jM],function(a){return ei(jQ,jP,jO,jN)});var +ej=[E,jS,gB(0)],cC=[0,ej,[0]],jR=ce(cC)===E?cC:cC[1];dO(dr,jR);function +ek(a){throw a}var +O=n,ap=null;O.String;O.RegExp;O.Object;var +el=O.Date;O.Math;var +jT=undefined,jU=O.Array,jV=O.Error,jW=O.JSON;ee(function(a){return a[1]===ej?[0,ag(a[2].toString())]:0});ee(function(a){return a +instanceof +jU?0:[0,ag(a.toString())]});function +cD(a,b){return a?g(b,a[1]):0}function +em(c,b){return cD(b,function(a){return[0,g(c,a)]})}function +ab(a,b){var +c=0<=a?1:0,d=c?a=b)throw i([0,j,jY],1);var +c=b-1|0;return R(a,c)[1+c]}function +cF(a,b){var +c=b.length-1,d=aG(c+1|0,a);ah(b,0,d,0,c);return d}function +eo(a,b){var +c=b.length-1,d=aG(c+1|0,a);ah(b,0,d,1,c);return d}function +cG(a,b,c){if(0>a)throw i([0,j,j0],1);if(a>c.length-1)throw i([0,j,jZ],1);var +e=c.length-1,d=aG(e+1|0,b);ah(c,0,d,0,a);ah(c,a,d,a+1|0,e-a|0);return d}function +ac(a,b,c){if(0>a)throw i([0,j,j2],1);if(a>=c.length-1)throw i([0,j,j1],1);var +d=cl(c);R(d,a)[1+a]=b;return d}function +bp(a,b){if(0>a)throw i([0,j,j5],1);if(a>=b.length-1)throw i([0,j,j4],1);var +c=b.length-1;if(0>=c)throw i([0,j,j3],1);var +d=aG(c-1|0,R(b,0)[1]);ah(b,0,d,0,a);ah(b,a+1|0,d,a,c-(a+1|0)|0);return d}function +ep(a){var +b=a.length-1;if(0m)throw i([0,j,kH],1);var +p=((m/2|0)*2|0)=e.length-1)throw i([0,j,j$],1);if(c===n){var +f=k,d=h(e,c);continue a}var +p=h(g,c)[2],q=h(g,c)[1],k=t(l,m(k,h(e,c)),q,p),c=c+1|0}}}return m(b,c)}function +c(q,b,c){function +k(a,b){if(0!==b[0]){var +e=b[2],l=b[1],m=l.length-1;if((m+1|0)!==e.length-1)throw i([0,j,ke],1);var +n=k(a,h(e,m)),f=m;for(;;){if(0>f)throw i([0,j,kd],1);if(0===f)return n;var +c=f-1|0;if(0>c)throw i([0,j,kc],1);if(c>=e.length-1)throw i([0,j,kb],1);var +u=h(e,c),v=h(l,c)[2],n=k(t(q,n,h(l,c)[1],v),u),f=c}}var +r=b[1],g=[0,a],o=r.length-1-1|0;if(o>=0){var +d=o;for(;;){var +p=r[1+d];g[1]=t(q,g[1],p[1],p[2]);var +s=d-1|0;if(0!==d){var +d=s;continue}break}}return g[1]}return k(b,c)}function +Q(a){var +b=0;return c(function(a,b,c){return[0,[0,b,c],a]},b,a)}function +S(a){var +b=0;return c(function(a,b,c){return[0,b,a]},b,a)}function +e(a,b){var +h=N[1],d=b.length-1;if(0===d)return[0,d,0];if(1===d){var +l=k(h,a,R(b,0)[1][1]);return 0=o)return[0,n,0===o?1:0];var +p=k(h,a,R(b,g)[1+g][1]);if(0<=p)return 0===p?[0,g,1]:[0,d,0];var +f=n,e=g;for(;;){if((f+1|0)===e)return[0,e,0];var +c=f+((e-f|0)/2|0)|0;if(f>=c)throw i([0,j,j9],1);if(c>=e)throw i([0,j,j8],1);var +m=k(h,a,R(b,c)[1+c][1]);if(0===m)return[0,c,1];if(0<=m){var +f=c;continue}var +e=c}}function +T(a,b){var +c=b;for(;;){if(0===c[0]){var +d=c[1],f=e(a,d),k=f[1];return f[2]?[0,h(d,k)[2]]:0}var +g=c[1],l=c[2],i=e(a,g),j=i[1];if(i[2])return[0,h(g,j)[2]];var +c=h(l,j)}}function +l(a,b,c){if(0>b)throw i([0,j,kh],1);if(b>c)throw i([0,j,kg],1);if(c<=a.length-1)return cm(a,b,c-b|0);throw i([0,j,kf],1)}function +q(a,b,c,d,e){if(0>d)throw i([0,j,kl],1);if(d>b)throw i([0,j,kk],1);if(b>e)throw i([0,j,kj],1);if(e>a.length-1)throw i([0,j,ki],1);var +f=aG((e-d|0)+1|0,c);ah(a,d,f,0,b-d|0);ah(a,b,f,(b-d|0)+1|0,e-b|0);return f}function +F(a,b,c,d,e,f){if(b>=f)throw i([0,j,km],1);var +g=q(a,b,c,e,f);aO(g,(b-e|0)+1|0,d);return g}function +u(a,b,c){var +f=c.length-1,j=e(a,c),g=j[1];if(j[2])return[0,[0,ac(g,[0,a,b],c)]];if(f=f.length-1)throw i([0,j,kz],1);var +g=A(a,c,e,d),k=g[2],l=g[1],h=bp(a,f);aO(h,a,[0,l]);return[0,[1,k,h],b,e.length-1<=n?1:0]}function +I(a,b,c,d,e,f,g,h){if((a+1|0)>=h.length-1)throw i([0,j,kA],1);var +l=A(a,c,g,e),o=l[2],p=l[1],m=bp(a,h),k=d.length-1,q=g.length-1<=n?1:0,r=0===k?cl(f):0===f.length-1?du(d,0,k):pr(d,f);aO(m,a,[1,p,r]);return[0,[1,o,m],b,q]}function +f(a,h,c,d,e,f,g){function +p(a,b){return h?x(b):x(a)}if(0===c[0]){var +b=c[1];if(0===d[0]){var +k=d[1];if(!p(b,k))return H(a,e,b,k,f,g);var +l=z(h,a,b,f,k),s=l[2];return[0,[1,s,y(a,[0,l[1]],[0,l[3]],g)],e,0]}}else{var +q=c[2],m=c[1];if(0!==d[0]){var +n=d[1],t=d[2];if(!p(m,n))return I(a,e,m,q,n,d[2],f,g);var +o=z(h,a,m,f,n),u=o[3],v=o[2],w=o[1],r=G(h,q,t);return[0,[1,v,y(a,[1,w,r[1]],[1,u,r[2]],g)],e,0]}}throw i([0,j,kB],1)}function +o(a,b,c,d,e){if(!c[3])return[0,[1,d,ac(a,c[1],e)],b,0];if(a=b.length-1)throw i([0,j,kC],1);var +g=cE(b);return[0,[0,cH(b)],g,b.length-1<=n?1:0]}var +c=a[2],e=a[1],d=e.length-1;if((d+1|0)!==c.length-1)throw i([0,j,kD],1);var +f=r(h(c,d));return o(d,f[2],f,e,c)}function +B(a,b){if(0===b[0]){var +d=b[1],i=e(a,d),j=i[1];if(!i[2])return 0;var +m=h(d,j);return[0,[0,[0,bp(j,d)],m,d.length-1<=n?1:0]]}var +f=b[2],g=b[1],k=e(a,g),c=k[1];if(k[2]){var +l=r(h(f,c)),p=h(g,c);return[0,o(c,p,l,ac(c,l[2],g),f)]}var +q=B(a,h(f,c));return em(function(a){return o(c,a[2],a,g,f)},q)}function +V(a,b){var +d=B(a,b);if(!d)return b;var +e=d[1],c=e[1];if(1===c[0]){var +f=c[2];if(0===c[1].length-1)return h(f,0)}return e[1]}function +C(a,b,c){if(0===c[0]){var +i=c[1],p=e(a,i),l=p[1];if(!p[2]){var +s=g(b,0);return s?[0,u(a,s[1],i)]:[0,[0,c]]}var +q=g(b,[0,h(i,l)[2]]);if(q)return[0,[0,[0,ac(l,[0,a,q[1]],i)]]];var +z=bp(l,i);return[1,[0,[0,z],h(i,l),n===i.length-1?1:0]]}var +j=c[2],f=c[1],t=e(a,f),d=t[1];if(t[2]){var +w=g(b,[0,h(f,d)[2]]);if(w)return[0,[0,[1,ac(d,[0,a,w[1]],f),j]]];var +x=r(h(j,d)),A=h(f,d);return[1,o(d,A,x,ac(d,x[2],f),j)]}var +m=C(a,b,h(j,d));if(0===m[0]){var +k=m[1];return 0===k[0]?[0,[0,[1,f,ac(d,k[1],j)]]]:[0,v(d,k[1],k[2],k[3],f,j)]}var +y=m[1];return[1,o(d,y[2],y,f,j)]}function +W(a,b,c){var +e=C(a,b,c);if(0===e[0]){var +d=e[1];return 0===d[0]?d[1]:[1,[0,d[2]],[0,d[1],d[3]]]}var +g=e[1],f=g[1];if(1===f[0]){var +i=f[2];if(0===f[1].length-1)return h(i,0)}return g[1]}function +b(a){var +b=a[1],c=b[1];return 0===c[0]?b[2]=m.length-1)throw i([0,j,kF],1);var +n=[0,[0,m,l,f+1|0],a[2]];return d(h(l,f+1|0),n)}function +M(a){return d(a,0)}return[0,m,p,s,n,O,D,E,P,c,Q,S,e,T,l,q,F,u,v,w,U,x,y,z,G,A,H,I,f,o,r,B,V,C,W,b,J,d,K,L,M,function(a){return[0,b,J,L,M]}]}function +eq(a){var +d=cI(a,[0,a5]),c=d[5],q=d[6],r=d[7];function +m(e,b,c){function +a(a,b,c){return k(e,a,b)}return t(d[8],a,b,c)}function +s(e,b,c){function +a(a,b,c){return k(e,a,b)}return t(d[9],a,b,c)}function +u(a,b){return k(d[13],a,b)?1:0}function +e(a,b){return t(d[20],a,0,b)}function +f(a,b){return k(d[32],a,b)}function +v(a){return g(d[11],a)}var +b=g(d[41],[0]),n=b[1];function +o(a){return g(b[2],a)[1]}var +p=b[3],w=b[4];function +h(a,b,c,d){if(b>c)throw i([0,j,kI],1);var +e=b,f=d;for(;;){if(e===c)return f;var +g=k(a,e,f),e=e+1|0,f=g}}function +l(a,b,c,d){if(b>c)throw i([0,j,kJ],1);var +f=c,e=d;for(;;){if(f===b)return e;var +g=f-1|0,f=g,e=k(a,g,e)}}function +x(a,b,c){return h(e,a,b,c)}function +y(a,b,c){return l(e,a,b,c)}function +z(a,b,c){return h(f,a,b,c)}function +A(a,b,c){return l(f,a,b,c)}function +B(a,b,c){var +f=[0,a,1],d=m(function(a,b){var +c=a[2],d=a[1],e=c?b===d?1:0:c;return[0,d+1|0,e]},f,c),e=d[1]===b?1:0,g=d[2],h=e?g:e;return h}return[0,d,c,q,r,m,s,u,e,f,v,h,l,x,y,z,A,B,[0,b,n,o,p,w,function(a){var +b=a,c=0;for(;;){if(!g(n,b))return bm(c);var +d=[0,o(b),c],b=g(p,b),c=d}}]]}eq([0,3]);eq([0,4]);cI([0,3],[0,a5]);function +bR(a){var +b=cI(j_,a);return[0,b[5],b[6],b[8],b[9],b[10],b[13],b[7],b[20],b[32],b[34],b[40],b[35],b[36],b[39],b[41]]}function +er(a){return 0}function +J(a,b,c){function +d(a){return k(b,a,c)}return cD(g(a,c),d)}function +es(c,b){function +d(a){var +b=g(c,a);return function(a){return[0,b]}}return function(a){return J(b,d,a)}}function +kK(a){return typeof +a==="number"?[0,a.valueOf(0)]:0}function +kL(a){var +b=a|0;return 0===pH(a,b)?function(a){return[0,b]}:er}function +a9(a){return J(kK,kL,a)}function +ay(a){return typeof +a==="string"?[0,ag(a)]:0}function +kM(b){return typeof +b==="function"?[0,function(a){return p1(b,a)}]:0}function +b(a,b,c){function +e(a){return g(b,a)}var +d=c[q(a)],f=d===jT?0:[0,d];return cD(f,e)}function +Z(a){return O.console.log(q(a))}function +bS(a){return O.console.log(a)}function +bq(a,b,c){return c.addEventListener(q(a),b)}function +et(a,b,c){return c.removeEventListener(q(a),b)}function +eu(a,b){return O.setTimeout(a,b)}function +ev(a,b,c,d){var +e=new +O.XMLHttpRequest();e.open(q(a),q(b));a4(function(a){return e.setRequestHeader(q(a[1]),q(a[2]))},c);e.send(q(d));return e}function +bT(a,b){if(b===ap)throw i([0,j,kN],1);return b.appendChild(a)}function +ew(a){for(;;){var +b=a.firstChild,c=b==ap?0:[0,b];if(!c)return 0;a.removeChild(c[1])}}function +a_(a){return O}function +cJ(a){return new +el()}function +ex(a){return new +el(a)}function +ey(a){var +d=bR(a),l=[0,[0],d[7]];function +f(c,b){var +a=k(d[6],c,b[2]);return em(function(a){if(a>=b[1].length-1)throw i([0,j,kQ],1);var +d=h(b[1],a),e=d[2];if(gz(d[1],c))return e;throw i([0,j,kP],1)},a)}function +e(a,b,c){if(k(d[6],a,c[2]))return c;var +e=t(d[8],a,c[1].length-1,c[2]);return[0,cF([0,a,b],c[1]),e]}function +c(a,b,c){var +f=k(d[6],a,c[2]);if(!f)return e(a,g(b,0),c);var +l=f[1],m=h(c[1],l),n=m[2];if(!gz(m[1],a))throw i([0,j,kR],1);var +o=c[2],p=c[1];return[0,ac(l,[0,a,g(b,[0,n])],p),o]}function +m(a){var +c=l,b=a;for(;;){if(!b)return c;var +d=b[1],f=b[2],c=e(d[1],d[2],c),b=f}}function +n(d,b,c){var +a=c[1];return cr(function(a,b){return t(d,a,b[1],b[2])},b,a)}function +b(a,b){var +f=b[1],d=f.length-1-1|0,g=0;if(d>=0){var +c=g;for(;;){var +e=f[1+c];k(a,e[1],e[2]);var +h=c+1|0;if(d!==c){var +c=h;continue}break}}return 0}return[0,d,l,f,e,c,m,n,b,function(i,h,c,d,e){b(function(a,b){return f(a,d)?0:g(c,a)},e);return b(function(a,b){var +c=f(a,e);return c?b===c[1]?0:k(h,a,b):k(i,a,b)},d)}]}ey([0,a6]);function +a$(a){var +b=ey(a);return[0,b[2],b[3],b[4],b[5],b[6],b[7],b[8],b[9]]}var +eA=0,kT=ex(0.);function +cL(a,b){var +c=60000.*(a.getTimezoneOffset()-b|0);return ex(a.valueOf()+c)}function +bU(a){var +b=[0,a];return[0,b,function(a){return g(b[1],a)}]}function +eB(a,b){b[1][1]=a;return 0}function +eC(a){var +h=bR(a),b=a$(a);function +c(a){return[0,h[7]]}function +d(f,e,c,d){function +a(a,b){if(0!==k(h[6],a,d[1]))throw i([0,j,kU],1);var +c=bU(g(f,b)),l=k(e,a,c[2]);d[1]=t(h[8],a,[0,c,l],d[1]);return 0}return k(b[7],a,c)}return[0,h,b,c,d,function(l,m,c,d,e,f){function +a(b){var +a=f[1];function +d(a){if(!a)throw i([0,j,kV],1);var +d=a[1];t(c,b,d[1][2],d[2]);return 0}f[1]=t(h[10],b,d,a);return 0}function +n(a,b){var +c=k(h[6],a,f[1]);if(!c)throw i([0,j,kW],1);var +d=c[1][1];return eB(g(l,b),d)}function +o(c,b){var +a=f[1];function +d(a){if(a)throw i([0,j,kX],1);var +d=bU(g(l,b));return[0,[0,d,k(m,c,d[2])]]}f[1]=t(h[10],c,d,a);return 0}return aY(b[8],o,n,a,d,e)}]}function +eD(f,b,c){var +a=bm(b);return a4(function(a){var +d=a[3],e=a[2][1];if(a[1][1])c.stopPropagation(0);if(e)c.preventDefault(0);var +b=g(d,c);return b?g(f,b[1]):(Z(kY),bS(c))},a)}var +cM=eC([0,a6]);a$([0,a6]);var +cN=cM[3];function +eE(a,b,c){return bq(b,c,a)}function +eF(f,e,c,d){function +a(a,b){return eE(f,a,b)}function +b(a,b){return eD(e,a,b)}return e7(cM[4],b,a,c,d)}function +eG(f,g,c,d,e){function +a(a,b,c){return et(a,b,f)}function +b(a,b){return eE(f,a,b)}function +h(a,b){return eD(g,a,b)}return e8(cM[5],h,b,a,c,d,e)}var +cO=eC([0,a5]);a$([0,a5]);var +kZ=cO[3];function +eH(d,b,c){var +a=bm(b);return a4(function(a){return g(d,g(a,c))},a)}function +eI(a,b){return O.setInterval(function(a){return g(b,cJ(0))},a)}function +k0(a,b,c){return O.clearInterval(c)}function +eJ(a){return a_(0)}function +eK(a){return bq(k1,a,eJ(0))}function +k3(c){function +d(a){var +b=[0,a];if(!gW(c,"A")&&!gW(c,"a")){0===b[0];return function(a){return[0,b]}}return er}function +e(a){return b(k4,ay,a)}function +f(a){return b(k5,e,a)}return function(a){return J(f,d,a)}}function +k7(a){return b(k6,ay,a)}function +k9(a){return b(k8,k7,a)}function +cP(a,b,c){var +d=J(k9,k3,c);if(!d)return 0;var +e=d[1];c.preventDefault(0);return g(a,g(b,e))}function +eL(a,b,c,d){return[3,a,[0,b,c,d]]}var +D=a$([0,a6]);function +f(a){return[0,[0,a],0]}function +aq(a,b,c){var +e=0,d=[0,D[1],D[1],D[1],D[1]];return[0,[1,a,d1(function(a,b){switch(b[0]){case +0:var +d=a[4],e=a[3],f=a[2];return[0,t(D[3],b[1],b[2],a[1]),f,e,d];case +1:var +g=a[4],h=a[3],i=t(D[3],b[1],b[2],a[2]);return[0,a[1],i,h,g];case +2:var +j=a[4],k=t(D[3],b[1],b[2],a[3]);return[0,a[1],a[2],k,j];default:var +c=b[2],l=b[1],m=a[4],n=function(a){return a?[0,c,a[1]]:[0,c,0]},o=t(D[4],l,n,m);return[0,a[1],a[2],a[3],o]}},d,b),c],e]}function +eM(a,b,c){var +d=b[1],e=g(a[9],c);k(D[7],e,d);var +f=b[3],h=g(a[10],c);k(D[7],h,f);var +i=b[2],j=g(a[11],c);k(D[7],j,i);return k(a[15],c,b[4])}function +bV(c,b){function +e(a){var +b=a[1];switch(b[0]){case +0:var +e=b[1];return[0,[0,e],g(c[1],e)];case +1:var +f=b[2],h=b[1],l=d(b[3]),s=l[1],m=k(c[2],h,l[2]);eM(c,f,m);return[0,[1,h,f,s],m];case +2:var +n=b[3],o=b[2],p=b[1],q=d(b[4]),u=q[1],r=t(c[3],p,o,q[2]);eM(c,n,r);return[0,[2,p,o,n,u],r];default:throw i([0,j,k$],1)}}function +d(a){if(!a)return la;var +f=a[2],b=e(a[1]),g=b[2],c=d(f);return[0,[0,b,c[1]],[0,g,c[2]]]}return e(b)}function +cQ(a,b,c,d){var +e=g(a[9],b),i=d[1],j=c[1],k=g(a[12],b);aY(D[8],e,e,k,j,i);var +f=g(a[10],b),l=d[3],m=c[3],n=g(a[13],b);aY(D[8],f,f,n,m,l);var +h=g(a[11],b),o=d[2],p=c[2],q=g(a[14],b);aY(D[8],h,h,q,p,o);return t(a[16],b,c[4],d[4])}function +cR(d,b,c){var +a=b[1];switch(a[0]){case +0:var +o=c[1];if(0===o[0]){var +p=c[2],l=a[1];return aK(l,o[1])?[0,c,0]:(k(d[8],p,l),[0,[0,[0,l],p],0])}break;case +1:var +i=c[1];if(1===i[0]){var +m=c[2],q=i[1],r=a[2],y=i[3],z=i[2],A=a[3];if(aK(a[1],q)){cQ(d,m,r,z);return[0,[0,[1,q,r,bm(eN(d,m,A,y,0))],m],0]}}break;case +2:var +e=c[1];if(2===e[0]){var +n=c[2],s=e[2],u=e[1],v=a[3],B=e[4],C=e[3],E=a[4],F=a[1];if(aK(a[2],s)&&aK(F,u)){cQ(d,n,v,C);return[0,[0,[2,u,s,v,bm(eN(d,n,E,B,0))],n],0]}}break;default:var +j=c[1];if(3===j[0]){var +f=c[2],w=j[1],x=a[2],G=j[3],H=j[2],I=a[3];if(aK(a[1],w)){cQ(d,f,x,H);g(d[7],f);var +h=[0,D[1]],J=function(a,b){var +c=k(D[2],a,G);if(c){var +e=cR(d,b,c[1])[1];k(d[4],e[2],f);h[1]=t(D[3],a,e,h[1]);return 0}var +g=bV(d,b);k(d[4],g[2],f);h[1]=t(D[3],a,g,h[1]);return 0};k(D[7],J,I);return[0,[0,[3,w,x,h[1]],f],0]}}}return[0,bV(d,b),1]}function +eN(a,b,c,d,e){var +g=c,f=d,h=e;for(;;){if(!g){if(!f)return h;var +s=f[2];k(a[5],f[1][2],b);var +g=0,f=s;continue}var +i=g[2],j=g[1];if(!f){var +o=bV(a,j);k(a[4],o[2],b);var +g=i,f=0,h=[0,o,h];continue}var +l=f[1],p=f[2],q=l[2],m=cR(a,j,l),n=m[1],r=n[2];if(m[2])t(a[6],q,r,b);var +g=i,f=p,h=[0,n,h]}}function +br(a,b,c){try{var +f=g(b,0);return f}catch(f){var +d=ci(f);if(d[1]===j){var +h=d[2],l=d4(le,[0,ld,[0,h[1],[0,lc,[0,e+h[2],[0,lb,[0,e+h[3],0]]]]]]);g(c,0);Z(a);Z(l);return g(ek,new +jV(q(a)))}g(c,0);Z(a);var +k=p0(d);if(k){var +m=k[1];Z(lf);return g(ek,m)}Z(lg);throw i(d,0)}}function +L(c,b){function +a(a){return 0}return br(lk,function(a){return g(c,b)},a)}function +eO(a,b,c){return k(a,b,function(a){if(0===a[0])return L(c,a[1]);throw i([0,j,lj],1)})}function +eP(a,b,c){return L(c,[0,a])}function +aP(a,b,c,d){return k(a,c,function(a){return 0===a[0]?t(b,a[1],c,d):L(d,[1,a[1]])})}function +bW(a,b,c,d){eu(function(a){return L(d,[0,b])},a);return 0}function +lu(a,b){return L(b,[0,cJ(0)])}function +lv(a,b){return L(b,[0,cJ(0).getTimezoneOffset()])}var +bX=0;function +bb(a,b){return[0,a,[0,ez,cK,b]]}function +cS(c){function +d(d){function +e(a){var +b=k(c,d,a);return function(a){return[0,b]}}function +f(a){return b(lx,a9,a)}return function(a){return J(f,e,a)}}function +e(a){return b(ly,a9,a)}return function(a){return J(e,d,a)}}bR([0,a6]);bR([0,a5]);var +eQ=a$([0,a5]),eR=a$([0,a6]),lQ=[0,eR[1],eQ[1],0,0];function +eS(a){function +c(a,b){if(typeof +b==="number")return a;switch(b[0]){case +0:var +d=b[2],f=b[1],g=a[4],h=a[3],i=a[2],j=a[1],k=function(a){return a?[0,d,a[1]]:[0,d,0]};return[0,t(eR[4],f,k,j),i,h,g];case +1:var +e=b[2],l=b[1],m=a[4],n=a[3],o=a[2],p=function(a){return a?[0,e,a[1]]:[0,e,0]},q=t(eQ[4],l,p,o);return[0,a[1],q,n,m];case +2:var +r=b[1],s=a[4],u=a[3]||[0,r];return[0,a[1],a[2],u,s];case +3:var +v=b[1],w=a[4]||[0,v];return[0,a[1],a[2],a[3],w];default:return d1(c,a,b[1])}}return c(lQ,a)}var +c=0;function +eT(d,c){return[0,function(a,b){return k(c,a,function(a){return L(b,[0,g(d,a)])})}]}function +eU(e,b){function +c(a){if(typeof +a==="number")return 0;switch(a[0]){case +0:var +f=a[1],d=function(a){var +c=g(e,a);return function(a,b){return eP(c,a,b)}};return[0,function(a,b){return aP(f,d,a,b)}];case +1:return a;default:return[2,bL(c,a[1])]}}return c(b)}function +cT(d,b,c){function +e(a){if(typeof +a==="number")return 0;switch(a[0]){case +0:return eO(a[1],d,b);case +1:var +c=a[1];return eO(c,d,function(a){return 0});default:return a4(e,a[1])}}return e(c)}function +bs(a){return a_(0).document}function +eV(e){function +f(a){var +b=a[2];if(b)return b[1];throw i([0,j,lR],1)}function +d(a){var +b=a[2];if(b)return b[1][1];throw i([0,j,lS],1)}function +a(a,b,c){var +d=f(a);return eG(d[1],e,b,c,d[2])}function +b(a,b){var +c=f(a);return eF(c[1],e,b,c[2])}function +c(a,b){return delete +d(a)[q(b)]}function +h(a,b){return d(a).removeAttribute(q(b))}function +k(a,b){return d(a).style.removeProperty(q(b))}function +l(a,b,c){return d(a)[q(b)]=c}function +m(a,b,c){return d(a).setAttribute(q(b),q(c))}function +n(a,b,c){return d(a).style.setProperty(q(b),q(c))}function +o(a,b){return a[1].nodeValue=q(b)}function +p(a){return ew(a[1])}function +r(a,b,c){return c[1].replaceChild(b[1],a[1])}function +s(a,b){return b[1].removeChild(a[1])}function +t(a,b){return bT(a[1],b[1])}function +u(a,b,c){var +d=bs(0).createElementNS(q(a),q(b));a4(function(a){return bT(a[1],d)},c);return[0,d,[0,[0,d,g(cN,0)]]]}function +v(a,b){var +c=bs(0).createElement(q(a));a4(function(a){return bT(a[1],c)},b);return[0,c,[0,[0,c,g(cN,0)]]]}return[0,function(a){return[0,bs(0).createTextNode(q(a)),0]},v,u,t,s,r,p,o,n,m,l,k,h,c,b,a]}function +bc(c,b){function +d(a){var +b=1-(a===c[1]?1:0),d=c[2],e=d||b;c[2]=e;return b?(c[1]=a,eW(c)):b}var +a=c[6];switch(a[0]){case +0:return d(k(a[3],c[1],b));case +1:var +g=a[4],e=k(a[3],c[1],b),h=e[2];d(e[1]);return cT(g,function(a){return cU(c,a)},h);default:var +i=a[4],f=k(a[3],c[1],b),j=f[2];d(f[1]);return cT(i,function(a){return cU(c,a)},j)}}function +cU(c,b){var +a=0;eu(function(a){return bc(c,b)},a);return 0}function +eW(b){function +a(a){var +w=b[4],x=b[6][2];if(!w){var +M=g(x,b[1]),m=function(a){return bc(b,a)},f=eS(M),q=g(cN,0),D=f[1];eF(a_(0),m,D,q);var +r=g(kZ,0),E=f[2],y=function(a,b){return eH(m,a,b)};e7(cO[4],y,eI,E,r);var +l=[0,0],s=f[4];if(s){var +A=s[1],n=bU(function(a){return cP(m,A,a)});eK(n[2]);l[1]=[0,n]}else +l[1]=0;b[4]=[0,[0,f,q,r,l]];return 0}var +c=w[1];if(!b[2])return 0;var +L=g(x,b[1]);function +k(a){return bc(b,a)}var +h=eS(L),F=c[2],G=c[1][1],H=h[1];eG(a_(0),k,H,G,F);var +I=c[3],J=c[1][2],K=h[2];function +z(a,b){return eH(k,a,b)}e8(cO[5],z,eI,k0,K,J,I);var +t=c[4],u=c[1][4],v=h[4],d=t[1],e=0;if(v){var +o=v[1];if(u){if(d){var +B=d[1];eB(function(a){return cP(k,o,a)},B);e=1}}else if(!d){var +p=bU(function(a){return cP(k,o,a)});eK(p[2]);t[1]=[0,p];e=1}}else +if(u){if(d){var +C=d[1][2];et(k2,C,eJ(0));e=1}}else if(!d)e=1;if(!e)throw i([0,j,k_],1);b[4]=[0,[0,h,c[2],c[3],c[4]]];return 0}return br(lT,a,function(a){return 0})}function +eX(a,b){var +c=a[5];ew(c);return bT(b[2][1],c)}function +eY(b){function +c(a){function +c(a){var +b=a[6];switch(b[0]){case +0:var +e=b[1],f=function(a){return 0},c=[0,g(e,a[1]),f];break;case +1:var +h=b[1],i=function(a){return 0},c=[0,g(h,a[1]),i];break;default:var +d=g(b[1],a[1]),j=d[2],k=d[1],c=[0,k,function(a){return bs(0).title=q(j)}]}var +l=c[1];c[2](0);return l}var +d=b[3];if(!d){var +m=c(b),j=bV(eV(function(a){return bc(b,a)}),m);b[3]=[0,j];return eX(b,j)}var +e=b[2],k=d[1];if(e){var +l=c(b),f=cR(eV(function(a){return bc(b,a)}),l,k),h=f[1];if(f[2])eX(b,h);b[3]=[0,h];var +i=0}else +var +i=e;return i}function +a(a){b[2]=0;return 0}br(lU,c,a);a(0);if(b[2])throw i([0,j,lV],1);return 0}function +eZ(a){return a_(0).requestAnimationFrame(a)}function +e0(c,b){eY(c);if(c[2])throw i([0,j,lW],1);return eZ(function(a){return e0(c,a)})}function +e1(a,b,c){function +d(a){return 0}function +e(a){return g(b,c)}return br(an(lY,an(a,lX)),e,d)}function +aW(b){return eL(mc,ez,cK,function(a){return[0,b]})}function +e2(a){return[0,me,a]}function +cW(a){return[0,mf,a]}function +e3(a){return[0,mg,a]}function +e4(a){return[0,mh,a]}function +bt(a){return[1,mj,q(a)]}function +bY(a){return[2,mk,a]}function +bu(a){var +c=es(a,ay);function +d(a){return b(ml,c,a)}return eL(mn,kS,cK,function(a){return b(mm,d,a)})}function +bd(a,b){return aq(mp,a,b)}function +K(a,b){return aq(mq,a,b)}function +bZ(a,b){return aq(ms,a,b)}function +aX(a,b){return aq(mt,a,b)}function +bv(a,b){return aq(mu,a,b)}function +e5(a){return[1,a]}function +mx(a){return[2,a]}function +my(a){return[6,a]}function +mz(a,b){return[7,a,b]}function +mA(a,b){return[9,a,b]}function +mB(a,b){return[8,a,b]}function +mC(a){return[12,a]}function +mD(a){return[13,a]}function +mE(a){return[14,a]}function +mF(a){return[15,a]}function +mG(a){return[16,a]}function +mH(a){return[17,a]}function +mI(a){return[18,a]}var +cX=[0,mR,mQ,function(a){var +b=[0,f(mJ),0],c=[0,aX([0,aW(2),0],b),0],d=[0,K([0,[0,mN,mM],0],[0,f(an(mL,an(e+a[3],mK))),0]),c],g=[0,f(mO),0];return aq(mP,0,[0,aX([0,aW(3),0],g),d])},bX,c];function +mS(a){function +b(a,b,c){var +g=cL(b,c).getSeconds(),e=cL(b,c).getMinutes(),d=cL(b,c).getHours(),h=[0,K(0,[0,f(t(ai(mT),d,e,g)),0]),0],i=[0,K(0,[0,f(a),0]),h],j=[0,e3(mU),0],k=[0,e4(mV),j];return K([0,cW(mW),k],i)}var +c=[0,b(mX,a[4],eA),0];return K([0,[0,m4,m3],[0,[0,m2,m1],[0,[0,m0,mZ],0]]],[0,b(mY,a[4],a[5]),c])}var +pl=eU(e5,[0,lu]),m7=[0,m6,m5,mS,[1,az,e5],[2,[0,pl,[0,eU(mx,[0,lv]),0]]]];function +m8(a){var +b=a[7]?m9:a[6],c=a[7]?[0,[0,md,ng],[0,[0,nf,ne],[0,[0,nd,nc],[0,[0,nb,na],[0,[0,m$,m_],0]]]]]:[0,[0,nk,nj],0],d=[0,f(nh),0],e=[0,aX([0,[2,mi,ni],[0,aW(4),0]],d),0];return K(0,[0,K(c,[0,f(b),0]),e])}var +co=0,cn=cY,hi=cY[2],hj=cY[1];for(;;){if(cn){var +co=co+1|0,cn=cn[2];continue}var +cp=aG(co,hj),cq=1,bN=hi;for(;;){if(bN){var +hk=bN[2];cp[1+cq]=bN[1];var +cq=cq+1|0,bN=hk;continue}var +ba=cp.length-1,nl=function(a){function +c(a){var +c=[3,a];return function(a,b){return eP(c,a,b)}}function +d(a,b){var +m=qj(0),l=eg(0),e=m.length-1,d=w((e*8|0)+1|0),g=e-1|0,q=0;if(g>=0){var +c=q;for(;;){pA(d,c*8|0,bG(R(m,c)[1+c]));var +u=c+1|0;if(g!==c){var +c=u;continue}break}}aE(d,e*8|0,1);var +h=ef(d);aE(d,e*8|0,2);var +k=ef(d),r=bM(k,8),s=bM(k,0),t=bM(h,8);eh(l,bM(h,0),t,s,r);if(0>=ba)throw i([0,j,lh],1);var +p=0;if(c_>=ba&&0=0){var +b=i;for(;;){u(d,b,U(h,(c-1|0)-b|0));var +j=b+1|0;if(e!==b){var +b=j;continue}break}}var +H=[0,f(M(d)),G],I=[0,bZ(0,[0,f(on),H]),F],J=[0,bu(mC),0],L=[0,bt(a[10]),J],N=[0,bv([0,[2,oq,op],[0,bY(oo),L]],0),I];return K(0,[0,bd(0,[0,f(or),0]),N])},bX,c],ox=function(a){function +d(a){return typeof +a==="number"?fR<=a?f(oy):f(oz):f(an(oA,e+a[2]))}var +g=a[15];if(g)var +b=g[1],k=0===b[0]?aq(mr,0,[0,f(b[1]),0]):d(b[1]),h=k;else +var +h=f(oE);var +i=a[16];if(i)var +c=i[1],l=0===c[0]?f(c[1]):d(c[1]),j=l;else +var +j=f(oD);var +m=[0,h,[0,bd(0,[0,f(oB),0]),[0,j,0]]];return K(0,[0,bd(0,[0,f(oC),0]),m])},oF=function(a){var +d=0;return function(a,b){var +c=ev(oH,e6,d,oG);return bq(lp,function(a){if(4!==c.readyState)throw i([0,j,lo],1);var +d=c.status;return e9===d?L(b,[0,ag(c.responseText)]):L(b,[1,[0,fN,d]])},c)}},oI=0,oJ=az,oK=function(a,b){return bW(oJ,oI,a,b)},oL=eT(mH,function(a,b){return aP(oK,oF,a,b)}),oM=function(c){function +d(d){function +f(a){var +b=d4(oO,[0,c,[0,d,[0,oN,[0,e+a,0]]]]);return function(a){return[0,b]}}function +g(a){return b(oP,a9,a)}return function(a){return J(g,f,a)}}function +f(a){return b(oQ,ay,a)}return function(a){return J(f,d,a)}},oS=function(a){return b(oR,ay,a)},oT=function(a){var +d=0;return function(a,b){var +c=ev(oV,e6,d,oU);return bq(lt,function(a){if(4!==c.readyState)throw i([0,j,ls],1);var +e=c.status;if(e9!==e)return L(b,[1,[0,fN,e]]);var +h=c.responseText;try{var +g=[0,jW.parse(h)],d=g}catch(f){var +d=0}if(!d)return L(b,lr);var +f=J(oS,oM,d[1]);return f?L(b,[0,f[1]]):L(b,lq)},c)}},oW=0,oX=2000,oY=function(a,b){return bW(oX,oW,a,b)},o1=[0,o0,oZ,ox,bX,[2,[0,oL,[0,eT(mI,function(a,b){return aP(oY,oT,a,b)}),0]]]],o6=function(a){if(a[1])var +l=[0,f(o7),0],b=aX([0,aW(1),0],l);else +var +q=[0,f(o9),0],b=aX([0,aW(0),0],q);var +m=0,n=0;if(a[1])var +d=[0,cX,[0,m7,[0,nr,[0,nE,[0,n2,[0,ow,[0,o1,0]]]]]]],e=bL(function(a){var +b=[0,aX(0,[0,f(a[1]),0]),0];return aq(mw,[0,aW([0,a]),0],b)},d),c=aq(mv,[0,cW(o2),0],e);else +var +h=[0,g(a[2][3],a),0],i=[0,aq(mo,0,[0,f(a[2][1]),0]),h],j=[0,e3(o3),0],k=[0,e4(o4),j],c=K([0,cW(o5),k],i);var +o=K(0,[0,b,[0,K(0,[0,c,n]),m]]),p=a[1]?o8:a[2][2];return[0,o,p]},pf=[0,[0,1,cX,0,kT,eA,pe,1,pd,0,pc,pb,pa,o$,o_,0,0],cX[5]],pg=function(a){return[0,pf]},ph=function(a,b){if(typeof +b==="number")switch(b){case +0:return[0,[0,1,a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +1:return[0,[0,0,a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +2:return[0,[0,a[1],a[2],a[3]-1|0,a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +3:return[0,[0,a[1],a[2],a[3]+1|0,a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];default:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],1,a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],a[2][5]]}switch(b[0]){case +0:var +d=b[1];return[0,[0,0,d,a[3],a[4],a[5],a[6],1,a[8],0,a[10],a[11],a[12],a[13],a[14],0,0],d[5]];case +1:return[0,[0,a[1],a[2],a[3],b[1],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +2:return[0,[0,a[1],a[2],a[3],a[4],b[1],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +3:return[0,[0,a[1],a[2],a[3],a[4],a[5],b[1],0,a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +4:var +e=b[1],f=function(a){function +c(a){return function(a,b){g(a,e);return L(b,ln)}}var +d=az;function +f(a,b,c){return bW(d,a,b,c)}function +h(a,b){bS(e);return L(b,lm)}function +i(a,b){return aP(h,f,a,b)}return function(a,b){return aP(i,c,a,b)}},h=function(a,b){Z(pi);return L(b,ll)},i=[1,function(a,b){return aP(h,f,a,b)}];return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],pj,a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],i];case +5:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],b[1],a[9],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +6:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[0,b[1]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +7:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[1,b[1],b[2]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +8:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[2,b[1],b[2]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +9:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[3,b[1],b[2]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +10:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[4,b[1],b[2]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +11:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],[0,[5,b[1]]],a[10],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +12:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],b[1],a[11],a[12],a[13],a[14],a[15],a[16]],c];case +13:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],b[1],a[12],a[13],a[14],a[15],a[16]],c];case +14:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],b[1],a[13],a[14],a[15],a[16]],c];case +15:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],b[1],a[14],a[15],a[16]],c];case +16:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],b[1],a[15],a[16]],c];case +17:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],[0,b[1]],a[16]],c];default:return[0,[0,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15],[0,b[1]]],c]}},cV=[0,0],pk=function(a){return a[2][4]},l2=function(a){var +b=cV[1];if(!b){Z(l6);return ap}var +c=b[1],d=c[4];if(!d){Z(l5);return ap}var +e=d[1][1][3];if(e){var +f=g(e[1],a);return f?(bc(c,f[1]),ap):(Z(l3),bS(a),ap)}Z(l4);return ap},l7=function(c){function +d(a){var +b=a[2],d=a[1],e=[0,d,b,function(a){g(c,[0,a]);return 0}];return function(a){return[0,e]}}function +e(a){return b(l8,pg,a)}return function(a){return J(e,d,a)}},l_=function(a){return b(l9,kM,a)};O.webapp={init:function(a){if(cV[1]){Z(l$);return ap}var +d=J(l_,l7,a);if(d){var +b=d[1],c=b[3],e=b[2],f=b[1],g=a_(0);bq(ma,function(a){function +g(c,b){function +a(a){return 0}return br(l1,function(a){return ph(c,b)},a)}function +h(a){return e1(l0,pk,a)}var +k=[2,function(a){return e1(lZ,o6,a)},h,g,c],d=bs(0);if(d.body===null)throw i([0,j,kO],1);var +b=[0,f,0,0,0,d.body,k];cV[1]=[0,b];eW(b);eY(b);cT(c,function(a){return cU(b,a)},e);return eZ(function(a){return e0(b,a)})},g);return ap}Z(mb);bS(a);return ap},post:l2};ck(0);return}}}(globalThis));